mondrian-3.11.0.1-R/000077500000000000000000000000001261646570300137535ustar00rootroot00000000000000mondrian-3.11.0.1-R/.gitignore000066400000000000000000000027361261646570300157530ustar00rootroot00000000000000testclasses testlib build dev-lib dist doc/api *.jar *.log *.log.* VERSION.txt classes/ demo/FoodMartCreateData.sql demo/access/MondrianFoodMart.mdb demo/derby/foodmart/ doc/properties.html lib/aggregates.dtd lib/datasourcesconfig.dtd lib/jpivot.war lib/mondrian.dtd mondrian.properties.template functions.html src/main/mondrian/gui/MondrianGuiDef.java src/main/mondrian/gui/mondrian_SW.dtd src/main/mondrian/olap/MondrianDef.java src/main/mondrian/olap/MondrianProperties.java src/main/mondrian/olap/Parser.java src/main/mondrian/olap/ParserSym.java src/main/mondrian/olap/mondrian.dtd src/main/mondrian/olap4j/MondrianOlap4jDriverVersion.java src/main/mondrian/parser/MdxParserImpl.java src/main/mondrian/parser/MdxParserImplConstants.java src/main/mondrian/parser/MdxParserImplTokenManager.java src/main/mondrian/parser/ParseException.java src/main/mondrian/parser/SimpleCharStream.java src/main/mondrian/parser/Token.java src/main/mondrian/parser/TokenMgrError.java src/main/mondrian/resource/MondrianResource.java src/main/mondrian/resource/MondrianResource_de.java src/main/mondrian/resource/MondrianResource_de_DE.java src/main/mondrian/resource/MondrianResource_en_US.java src/main/mondrian/resource/MondrianResource_es_ES.java src/main/mondrian/rolap/aggmatcher/DefaultDef.java src/main/mondrian/rolap/aggmatcher/aggregates.dtd src/main/mondrian/server/MondrianServerVersion.java src/main/mondrian/xmla/DataSourcesConfig.java src/main/mondrian/xmla/datasourcesconfig.dtd /mondrian.properties mondrian-3.11.0.1-R/LICENSE.html000066400000000000000000000303121261646570300157220ustar00rootroot00000000000000 Eclipse Public License - Version 1.0

Eclipse Public License - v 1.0

THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT.

1. DEFINITIONS

"Contribution" means:

a) in the case of the initial Contributor, the initial code and documentation distributed under this Agreement, and

b) in the case of each subsequent Contributor:

i) changes to the Program, and

ii) additions to the Program;

where such changes and/or additions to the Program originate from and are distributed by that particular Contributor. A Contribution 'originates' from a Contributor if it was added to the Program by such Contributor itself or anyone acting on such Contributor's behalf. Contributions do not include additions to the Program which: (i) are separate modules of software distributed in conjunction with the Program under their own license agreement, and (ii) are not derivative works of the Program.

"Contributor" means any person or entity that distributes the Program.

"Licensed Patents" mean patent claims licensable by a Contributor which are necessarily infringed by the use or sale of its Contribution alone or when combined with the Program.

"Program" means the Contributions distributed in accordance with this Agreement.

"Recipient" means anyone who receives the Program under this Agreement, including all Contributors.

2. GRANT OF RIGHTS

a) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free copyright license to reproduce, prepare derivative works of, publicly display, publicly perform, distribute and sublicense the Contribution of such Contributor, if any, and such derivative works, in source code and object code form.

b) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free patent license under Licensed Patents to make, use, sell, offer to sell, import and otherwise transfer the Contribution of such Contributor, if any, in source code and object code form. This patent license shall apply to the combination of the Contribution and the Program if, at the time the Contribution is added by the Contributor, such addition of the Contribution causes such combination to be covered by the Licensed Patents. The patent license shall not apply to any other combinations which include the Contribution. No hardware per se is licensed hereunder.

c) Recipient understands that although each Contributor grants the licenses to its Contributions set forth herein, no assurances are provided by any Contributor that the Program does not infringe the patent or other intellectual property rights of any other entity. Each Contributor disclaims any liability to Recipient for claims brought by any other entity based on infringement of intellectual property rights or otherwise. As a condition to exercising the rights and licenses granted hereunder, each Recipient hereby assumes sole responsibility to secure any other intellectual property rights needed, if any. For example, if a third party patent license is required to allow Recipient to distribute the Program, it is Recipient's responsibility to acquire that license before distributing the Program.

d) Each Contributor represents that to its knowledge it has sufficient copyright rights in its Contribution, if any, to grant the copyright license set forth in this Agreement.

3. REQUIREMENTS

A Contributor may choose to distribute the Program in object code form under its own license agreement, provided that:

a) it complies with the terms and conditions of this Agreement; and

b) its license agreement:

i) effectively disclaims on behalf of all Contributors all warranties and conditions, express and implied, including warranties or conditions of title and non-infringement, and implied warranties or conditions of merchantability and fitness for a particular purpose;

ii) effectively excludes on behalf of all Contributors all liability for damages, including direct, indirect, special, incidental and consequential damages, such as lost profits;

iii) states that any provisions which differ from this Agreement are offered by that Contributor alone and not by any other party; and

iv) states that source code for the Program is available from such Contributor, and informs licensees how to obtain it in a reasonable manner on or through a medium customarily used for software exchange.

When the Program is made available in source code form:

a) it must be made available under this Agreement; and

b) a copy of this Agreement must be included with each copy of the Program.

Contributors may not remove or alter any copyright notices contained within the Program.

Each Contributor must identify itself as the originator of its Contribution, if any, in a manner that reasonably allows subsequent Recipients to identify the originator of the Contribution.

4. COMMERCIAL DISTRIBUTION

Commercial distributors of software may accept certain responsibilities with respect to end users, business partners and the like. While this license is intended to facilitate the commercial use of the Program, the Contributor who includes the Program in a commercial product offering should do so in a manner which does not create potential liability for other Contributors. Therefore, if a Contributor includes the Program in a commercial product offering, such Contributor ("Commercial Contributor") hereby agrees to defend and indemnify every other Contributor ("Indemnified Contributor") against any losses, damages and costs (collectively "Losses") arising from claims, lawsuits and other legal actions brought by a third party against the Indemnified Contributor to the extent caused by the acts or omissions of such Commercial Contributor in connection with its distribution of the Program in a commercial product offering. The obligations in this section do not apply to any claims or Losses relating to any actual or alleged intellectual property infringement. In order to qualify, an Indemnified Contributor must: a) promptly notify the Commercial Contributor in writing of such claim, and b) allow the Commercial Contributor to control, and cooperate with the Commercial Contributor in, the defense and any related settlement negotiations. The Indemnified Contributor may participate in any such claim at its own expense.

For example, a Contributor might include the Program in a commercial product offering, Product X. That Contributor is then a Commercial Contributor. If that Commercial Contributor then makes performance claims, or offers warranties related to Product X, those performance claims and warranties are such Commercial Contributor's responsibility alone. Under this section, the Commercial Contributor would have to defend claims against the other Contributors related to those performance claims and warranties, and if a court requires any other Contributor to pay any damages as a result, the Commercial Contributor must pay those damages.

5. NO WARRANTY

EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely responsible for determining the appropriateness of using and distributing the Program and assumes all risks associated with its exercise of rights under this Agreement , including but not limited to the risks and costs of program errors, compliance with applicable laws, damage to or loss of data, programs or equipment, and unavailability or interruption of operations.

6. DISCLAIMER OF LIABILITY

EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.

7. GENERAL

If any provision of this Agreement is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this Agreement, and without further action by the parties hereto, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable.

If Recipient institutes patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Program itself (excluding combinations of the Program with other software or hardware) infringes such Recipient's patent(s), then such Recipient's rights granted under Section 2(b) shall terminate as of the date such litigation is filed.

All Recipient's rights under this Agreement shall terminate if it fails to comply with any of the material terms or conditions of this Agreement and does not cure such failure in a reasonable period of time after becoming aware of such noncompliance. If all Recipient's rights under this Agreement terminate, Recipient agrees to cease use and distribution of the Program as soon as reasonably practicable. However, Recipient's obligations under this Agreement and any licenses granted by Recipient relating to the Program shall continue and survive.

Everyone is permitted to copy and distribute copies of this Agreement, but in order to avoid inconsistency the Agreement is copyrighted and may only be modified in the following manner. The Agreement Steward reserves the right to publish new versions (including revisions) of this Agreement from time to time. No one other than the Agreement Steward has the right to modify this Agreement. The Eclipse Foundation is the initial Agreement Steward. The Eclipse Foundation may assign the responsibility to serve as the Agreement Steward to a suitable separate entity. Each new version of the Agreement will be given a distinguishing version number. The Program (including Contributions) may always be distributed subject to the version of the Agreement under which it was received. In addition, after a new version of the Agreement is published, Contributor may elect to distribute the Program (including its Contributions) under the new version. Except as expressly stated in Sections 2(a) and 2(b) above, Recipient receives no rights or licenses to the intellectual property of any Contributor under this Agreement, whether expressly, by implication, estoppel or otherwise. All rights in the Program not expressly granted under this Agreement are reserved.

This Agreement is governed by the laws of the State of New York and the intellectual property laws of the United States of America. No party to this Agreement will bring a legal action under this Agreement more than one year after the cause of action arose. Each party waives its rights to a jury trial in any resulting litigation.

mondrian-3.11.0.1-R/LicenseInfo.txt000066400000000000000000000004661261646570300167200ustar00rootroot00000000000000// This software is subject to the terms of the Eclipse Public License v1.0 // Agreement, available at the following URL: // http://www.eclipse.org/legal/epl-v10.html. // You must accept the terms of that agreement to use this software. // // Copyright (C) 2006-2012 Pentaho and others // All Rights Reserved. mondrian-3.11.0.1-R/README.txt000066400000000000000000000007271261646570300154570ustar00rootroot00000000000000This is a source, binary or data distribution of Mondrian, an OLAP Engine written in Java. This code is released under the terms of the Eclipse Public License v1.0 (EPL); see LICENSE.html. For installation instructions, see doc/install.html (http://mondrian.pentaho.com/documentation/installation.php). The version is described in VERSION.txt. Home page: http://mondrian.pentaho.com Project home: http://sourceforge.net/projects/mondrian/ Email: mondrian@pentaho.org mondrian-3.11.0.1-R/RELEASE.txt000066400000000000000000000477171261646570300156140ustar00rootroot00000000000000 Mondrian 3.7.0 production release notes ============================================= This release is a maintenance release. It contains all of the fixes from our prior service packs of the 3.6.X code line. It also addresses a lot of issues around compound slicers as well as in-memory rollup optimizations. We have also introduced a few select new features that the team would like to test in the community in the hope of growing them organically. To find out more about Mondrian, go to http://mondrian.pentaho.com. For further installation instructions, see http://mondrian.pentaho.com/documentation/installation.php or the included file doc/installation.html. New features in this release ---------------------------------- - Beta support for JMX monitoring. - Support for olap4j 1.2.0. - Support for NuoDB API changes from 3.6.X to 3.7.X ---------------------------------- - None. Notable bug fixes ---------------------------------- - Fixes issues around in-memory rollups. - Fixes issues with Impala and Hive dialects. - Fixes issues where using roles would prevent all of the members from being cached and retrieved correctly. - Fixes arithmetic errors when compound slicers are used. - Fixes concurrency issues with the segment indexes and external caches. See CHANGES.txt for a list of all source code changes since the previous release. Mondrian 3.6.0 production release notes ============================================= Introduction ------------ Mondrian 3.6.0 is a feature feature release based off the previous 3.4.9 version. It contains all of the previous bug fixes, plus added support for native resolution of named sets containing compound expressions. We have also included some performance enhancements in the core code. To find out more about Mondrian, go to http://mondrian.pentaho.com. Contents -------- As usual, there are two distributions for this release: * mondrian-.zip contains the FoodMart dataset in SQL and Access format * mondrian--derby.zip contains the FoodMart dataset as an Apache Derby database Each distribution contains the full mondrian source code, as mondrian--src.zip, documentation including generated API documentation, and a web archive mondrian.war. This web archive contains all classes and libraries (jars) necessary to run mondrian. For further installation instructions, see http://mondrian.pentaho.com/documentation/installation.php or the included file doc/installation.html. Main functionality in this release ---------------------------------- - Support for native named sets which use the '+' operator. - Faster implementation of olap4j's Member.getParent and some other method calls by using the Locus API. - Various bug fixes form the previous 3.4.X re-releases. API changes from 3.5.9 to 3.6.0 --------------------------- - None. See CHANGES.txt for a list of all source code changes since the previous release. Mondrian 3.5.0-GA production release notes ============================================= Introduction ------------ Mondrian 3.5.0 is a bugfix release based off the previous 3.4.1 version. It includes many enhancements and performance fixes as well as better native support for native resolution of tuples when access controls are added. We have also significantly improved the performance when dealing with levels of high cardinality as well as enabled Mondrian to run into a real-time mode where nothing gets cached and the data it returns is always the latest from the source. To find out more about Mondrian, go to http://mondrian.pentaho.com. Contents -------- As usual, there are two distributions for this release: * mondrian-.zip contains the FoodMart dataset in SQL and Access format * mondrian--derby.zip contains the FoodMart dataset as an Apache Derby database Each distribution contains the full mondrian source code, as mondrian--src.zip, documentation including generated API documentation, and a web archive mondrian.war. This web archive contains all classes and libraries (jars) necessary to run mondrian. For further installation instructions, see http://mondrian.pentaho.com/documentation/installation.php or the included file doc/installation.html. Main functionality in this release ---------------------------------- - Tuples evaluation now push down natively the constraints imposed by roles. - Fixes some issues in the way Mondrian was splitting segments across multiple sub-segments. - Resolving tuples only joins to the fact table if absolutely necessary. - Improved processing of large volumes of data when a member grant is used with a partial rollup policy. - Enables a mode in which nothing gets cached and the data returned is always the latest available from the database. - Allows more than one measure to be included in the RETURN clause of a DRILLTHROUGH statement. - Added support for native evaluation of regular expressions with Netezza. - Upgraded Apache Xerces. API changes from 3.4.1 to 3.5.0 --------------------------- - Changes to the effects of the property 'mondrian.rolap.DisableCache' - Introduces a new property to disable the default in-memory cache for segments. - Added a new method to specify the roles for a connection to allow the presence of commas in role names. - Allows to specify a minimum TTL value for schemas in the pool through connection properties. - Allows to specify a unique connection UUID to force the usage of a specific schema in the pool through connection properties. See CHANGES.txt for a list of all source code changes since the previous release. Mondrian 3.4.0-GA production release notes ============================================= Introduction ------------ Mondrian 3.4.0-GA is a major refactoring of Mondrian's internals and the way it handles & stores the cell data. This release makes Mondrian much more scalable and much more effective in the way it uses the system threads. This release also introduces a new algorithm to load, share and rollup the data cells, or segments. Mondrian will rollup and union the segment data from low levels, in memory, to answer queries related to higher levels. This provides a huge improvement in performance on systems with high user interactivity. It is also worth noting that the Mondrian project now hosts its source code on github. The official source code can now be found at: github.com/pentaho/mondrian To find out more about Mondrian, go to http://mondrian.pentaho.com. Contents -------- As usual, there are two distributions for this release: * mondrian-.zip contains the FoodMart dataset in SQL and Access format * mondrian--derby.zip contains the FoodMart dataset as an Apache Derby database Each distribution contains the full mondrian source code, as mondrian--src.zip, documentation including generated API documentation, and a web archive mondrian.war. This web archive contains all classes and libraries (jars) necessary to run mondrian. This release runs on Java version 1.5 and higher. For backwards compatibility on Java 1.4, substitute mondrian-jdk14.jar for mondrian.jar, and add retroweaver-rt-1.2.4.jar to your classpath. For further installation instructions, see http://mondrian.pentaho.com/documentation/installation.php or the included file doc/installation.html. Main functionality in this release ---------------------------------- - Support for olap4j 1.0.1 and JDBC 4.1. - Simplified and improved the SegmentCache SPI. - Introduces the Mondrian Monitor API. - Refactored some key parts of the engine into an implementation of the Actor design pattern, providing more effective resource sharing and the elimination of many synchronization blocks. - SQL queries for cell data is now fetched by a multi-threaded executor and the tasks are shared among the query threads. - More than one SegmentCache implementations can now be used at a time. - Ability to combine the data of multiple segments for a single query. - Ability to combine data of an existing segment with data form SQL. - Support for the DRILLTHROUGH RETURN clause. - Ability to define non-measure calculated members in a cube under a specific parent. - Allow aggregate tables to join to middle levels of snowflake dimension. - As usual, many other bug fixes and performance tweaks. API changes from 3.3.to 3.4 --------------------------- - Substantial changes to SegmentCache - Upgraded to olap4j-1.0.1.500 See CHANGES.txt for a list of all source code changes since the previous release. Mondrian 3.3.0.14703 production release notes ============================================= Introduction ------------ Mondrian 3.3.0.14703 introduces many new features, optimizations and bug fixes to the previous release. There are a few potentially disruptive changes introduced in this release. We strongly recommend reading these release notes carefully. To find out more about mondrian, go to http://mondrian.pentaho.com. Contents -------- As usual, there are two distributions for this release: * mondrian-.zip contains the FoodMart dataset in SQL and Access format * mondrian--derby.zip contains the FoodMart dataset as an Apache Derby database Each distribution contains the full mondrian source code, as mondrian--src.zip, documentation including generated API documentation, and a web archive mondrian.war. This web archive contains all classes and libraries (jars) necessary to run mondrian. This release runs on Java version 1.5 and higher. For backwards compatibility on Java 1.4, substitute mondrian-jdk14.jar for mondrian.jar, and add retroweaver-rt-1.2.4.jar to your classpath. For further installation instructions, see http://mondrian.pentaho.com/documentation/installation.php or the included file doc/installation.html. Main functionality in this release ---------------------------------- - Improved native performance. - Support for olap4j 1.0. - XMLA now supports roles and access controls, as well as a major refactoring to allow the XMLA servlet to run on top of any olap4j compliant driver. - Improved Greenplum support. - Improved member cache control. - Introduces the Hive dialect. - Introduces scripted user defined functions and formatters. - Introduces the SegmentCache SPI. - Introduces the EXPLAIN PLAN query. API changes from 3.2.to 3.3 --------------------------- - Added OlapElement.isVisible(). - Dialect now includes: o allowsJoinOn() o allowsRegularExpressionInWhereClause() o generateRegularExpression() o requiresHavingAlias() o generateCountExpression() - Dialect removes: o getNullCollation() - Upgraded to olap4j-1.0.0.445 - Introduction of: o SegmentCache o PropertyFormatter o MemberFormatter o CellFormatter See CHANGES.txt for a list of all source code changes since the previous release. Bugs and feature requests fixed for 3.3.0.14703 ---------------------------------------------------------- A complete list of the changes included in this release is available at the following URL. http://jira.pentaho.com/secure/IssueNavigator.jspa?requestId=11075 Bugs and feature requests fixed for 3.2.1.13885 ---------------------------------------------------------- MONDRIAN-821 - Adds a unique ID property to the Schema API. This id is expected to be different across different Mondrian instances. It allows clients to refresh their schema caches when that ID changes. This usually happened when a dynamic schema processor is used and the schema changes when a user login changes. MONDRIAN-695 - NonEmpty, Crossjoin and multiple dimensions in a slicer all together were returning wrong results with native sets. PPP-2542 - Changing dir to the current dir for win7 issue, BISERVER-4632, added check to see if the jre folder provided exists Bugs and feature requests fixed for 3.2.1.13841 ---------------------------------------------------------- MONDRIAN-799 - Currency format string shows a junk character for the currency symbol MONDRIAN-779 - Include/exclude filter not working MONDRIAN-777 - The identical view acting as a relation for a dimension table and fact table is determined not equal, causing issues with degenerate dimensions in views MONDRIAN-776 - mondrian.xsd updated to new specifications MONDRIAN-769 - row counts coming back as zero MONDRIAN-766 - Bug in escaping strings containing backslash for MySQL MONDRIAN-761 - mondrian.olap.fun.VisualTotalsFunDef$VisualTotalMember cannot be cast to mondrian.rolap.RolapCubeMember MONDRIAN-756 - Error in RolapResult.replaceNonAllMembers leads to NPE MONDRIAN-755 - Getting drillthrough count results in exception MONDRIAN-735 - Indian format strings MONDRIAN-724 - Cannot reference Member that has the same name as the Level. MONDRIAN-711 - Wrong behaviour with approxRowCount attribute added in a Level element MONDRIAN-568 - If two cubes have dimension with same name, mondrian treats grant to one as grant to other MONDRIAN-463 - New error messages if hierarchy has no levels; if hierarchy has BISERVER-4618 - PSW Duplicate catalog entry in datasources.xml PSW-87 - As a BI Pracitioner, I would like Schema Workbench to use the same connection creation dialog as the rest of the Pentaho products PSW-84 - Column in schema workbench wont allow as measure if data type in RDBMS is BIGINT Bugs and feature requests fixed for 3.2.0.13661 ---------------------------------------------------------- MONDRIAN-751 - Drill SQL does not include slicer members in WHERE clause Bugs and feature requests fixed for 3.2.0.13658 ---------------------------------------------------------- MONDRIAN-745 - NullPointerException when passing in null param value MONDRIAN-746 - Level of calculated member is different when hierarchy is access-controlled MONDRIAN-750 - View model with Analyzer where model contains multiple hierarchies beneath a single dimension throws exception Bugs and feature requests fixed for 3.2.0.13643 ---------------------------------------------------------- MONDRIAN-560 - StrToMember function doesn't use IgnoreInvalidMembers option MONDRIAN-737 - Sybase SQL Dialect is not correctly applied for Sybase Adaptive Server Enterprise 15.5 MONDRIAN-722 - If ignoreInvalidMembers=true, should ignore grants with invalid members MONDRIAN-734 - Exception thrown when creating a 'New Analysis View' with JPivot MONDRIAN-728 - Rolap Connection Locale is handled incorrectly in LocalizingDynamicSchemaProcessor.java MONDRIAN-738 - Statements not being closed MONDRIAN-708 - After change 13351 all Excel pivots fail to update. CellInfo element in XMLA response is wrong MONDRIAN-742 - Role security not applied correctly for the 'Top Level' restriction MONDRIAN-727 - [Fact count] measure added in change 13506 shouldn't be returned in XMLA rowset, not visible measures shouldn't be returned either Bugs and feature requests fixed for 3.2.0.13583 ---------------------------------------------------------- MONDRIAN-686 - Regression: JPivot output invalid - New Variance Percent column MONDRIAN-691 - RolapSchemaReader is not enforcing access control on two APIs MONDRIAN-694 - Incorrect handling of child/parent relationship with hierarchy grants MONDRIAN-726 - Change 13509 is not Excel 2007 compatible MONDRIAN-725 - setParameter function should be able to accept Java string for set value MONDRIAN-652 - Add support for generic annotations to Mondrian schema MONDRIAN-718 - Direct References to Members on a Dimension that has calculated members defined will not be found MONDRIAN-710 - Count with ExcludeEmpty throws an exception when the cube does not have a factCountMeasure MONDRIAN-715 - Constrained Measures can generate incorrect results when evaluated natively MONDRIAN-706 - SQL using hierarchy attribute 'Column Name' instead of 'Column' in the filter MONDRIAN-705 - Aggregate with grouping sets turned on causes exception MONDRIAN-704 - MDSCHEMA_PROPERTIES should not return internal properties MONDRIAN-681 - Add serializable to PropertyList class for caching MONDRIAN-678 - VisualTotals gives UnsupportedOperationException calling getOrdinal MONDRIAN-679 - VisualTotals gives ClassCastException when called via XMLA Mondrian Previous Releases - Tags and Checksums =============================================== Below is the list of Mondrian tags and checksums in Git. They represent the previous releases of Mondrian and can all be found directly from: https://github.com/pentaho/mondrian/tags Version Tag Git Hash ------- --------- ---------------------------------------- 3.6.7 3.6.7-R 6c8436dac24b08c32a84234ded106cd8a6b74f88 3.6.6 3.6.6-R a1486a6a56e7ee0055c91d7bd44bd5091ce84092 3.6.5 3.6.5-R 56609c22ea7e2edc46c67bc83d2f245e52bd732e 3.6.4 3.6.4-R e9b291fb5ae82862e37037befcd2d3504592f209 3.6.3 3.6.3-R 8e4009ff39cb9e5e60a67d3f1a674f4a01b6e45e 3.6.2 3.6.2-R 19ed7f14a3aada13dc15adb4109f1b3b415d7a55 3.6.1 3.6.1-R ae6d1a41a351e5dc43f627ae6bba98de99487207 3.6.0.1 3.6.0.1-R 9dc5a6a639b3f47b1c2addb90d159c008a61e8b0 3.6.0 3.6.0-R 7fb96718a2ca652b864c7a22ffbd2023172f4445 3.5.14 3.5.14-R 7734f8fb5312abe9a086e9c4bbd9bea1dedf7ac9 3.5.13 3.5.13-R b831b0ed8e63e2108b952aed12eb74b70ff2cd9c 3.5.12 3.5.12-R cf469ac137ad48ca4fc48272590f8e720ae392e7 3.5.11 3.5.11-R 2fc917a5640cc35ca68670b86505fd7748553af7 3.5.10 3.5.10-R 097264aa7e11d89881c2c9a8d54961b122620788 3.5.9 3.5.9-R 187129ca52cb8037b27e9063a3f9d2a66230c67d 3.5.8 3.5.8-R 643db12c8a8044934fcf9c0bc202be1556c4c254 3.5.7 3.5.7-R c15578eaf0ecb3fe10b2848431a508aed1e47e3e 3.5.6 3.5.6-R 263f9f0b9ecdcbd7dc49460717fa16f193ba89d4 3.5.5 3.5.5-R 1a6f422f88a285d560dc3d4f903fba756643a080 3.5.4 3.5.4-R 3c76d436b1324be35c922a2c5fd0495bdd36ebe6 3.5.3 3.5.3-R 8d01ab45bfd641bc2c489ea3f46a5ba563d557a7 3.5.2 3.5.2-R 3dfeb82c0ae2e1f96fe82c2fc3e4bc95959fe8a4 3.5.1 3.5.1-R dcef59a1c32eab95662b9950b9b875e88511af29 3.5.0 3.5.0-R b7033fea78744a3a9702efed767498e14593951e 3.4.17 3.4.17-R 10abbaf0bde215e8c6cf31b2708a045ef128cf8c 3.4.16 3.4.16-R 3be0d9220620268245880b03dacd9b33c6a4bf61 3.4.15 3.4.15-R 3d0333fcd1bec7ee5ae0660ca6ad2f1f8c3c21f1 3.4.14 3.4.14-R 7a0613f7ac1610a4a260814fe7f20a683345a4e1 3.4.13 3.4.13-R 762d7bfc1074802a0bd2ca554bfb799f9dffdd09 3.4.12 3.4.12-R 59c3ddacdefa6c0174d9777176f366d7feb1daf0 3.4.11 3.4.11-R ef3a173941b7f355a5e3c28d4ff3d204c299ec18 3.4.10 3.4.10-R d5eb9b1534ee2a1325b9c0418ec919c5e6cda67e 3.4.9 3.4.9-R bfc255caaccca484f4cbdfc99d0a3bf3244b8867 3.4.8 3.4.8-R 50470c77d4872509821a78d1835b566cd3ffffea 3.4.7 3.4.7-R 46a5b225264ec731433c6fde64335578fbabf9e3 3.4.6 3.4.6-R 9636faddab631b3dc504677d1a442d380fc32ed9 3.4.5 3.4.5-R 0e4efa3e8273bd27b01e3b4871629c773edaa8f1 3.4.4 3.4.4-R 0d86fc57b743fcad6ba618d18ac5e80b3344447a 3.4.3 3.4.3-R e526272ceed4c888d6162e33e5260487fe4d4261 3.4.2 3.4.2-R afdf8826a7bc40633cdb363df71abdfef791ed9f 3.4.1 3.4.1-R 4639f47ce665e94d99f99d89a0a2c8e399d9d358 3.3.2 3.3.2-R 9518450f359a099368c3391262953a0c9cb72792 3.3.1 3.3.1-R 34460aca8fdef617bef640fa9331bfacc04f9324 3.3.0 3.3.0-R d14cac7b8c95d2e70ab87121d0098aa854c805d4 3.2.5 3.2.5-R 17e3c699655494fc383b5365eec5b428da66435b 3.2.4 3.2.4-R 8bc44978106a2e3c5817286a0717903281695b19 3.2.3 3.2.3-R 0436dec34369fbf0a1fdda47ac0e44831ee81747 3.2.2 3.2.2-R 88c3b7e8fdecc91001391ff4998758b14dc173da 3.2.1 3.2.1-R 984fce88f5f55aa4e051e2e0377b4b84a8865960 mondrian-3.11.0.1-R/bin/000077500000000000000000000000001261646570300145235ustar00rootroot00000000000000mondrian-3.11.0.1-R/bin/checkFile.awk000066400000000000000000000704731261646570300171170ustar00rootroot00000000000000#!/bin/gawk # Checks that a file is valid. function error(fname, linum, msg) { printf "%s:%d: %s\n", fname, linum, msg; if (0) print; # for debug } function _matchFile(fname) { return fname ~ "/mondrian/" \ || fname ~ "/org/olap4j/" \ || fname ~ "/aspen/" \ || fname ~ "/farrago/" \ || fname ~ "/fennel/" \ || fname ~ "/extensions/" \ || fname ~ "/com/sqlstream/" \ || fname ~ "/linq4j/" \ || fname ~ "/lambda/" \ || fname ~ "/optiq/" \ || strict > 0; } function _isCpp(fname) { return fname ~ /\.(cpp|h)$/; } function _isJava(fname) { return fname ~ /\.(java|jj)$/; } function _isMondrian(fname) { return fname ~ /mondrian/; } function _isOlap4j(fname) { return fname ~ "/org/olap4j/"; } function push(val) { switchStack[switchStackLen++] = val; } function pop() { --switchStackLen val = switchStack[switchStackLen]; delete switchStack[switchStackLen]; return val; } function afterFile() { # Compute basename. If fname="/foo/bar/baz.txt" then basename="baz.txt". basename = fname; gsub(".*/", "", basename); gsub(lf, "", lastNonEmptyLine); terminator = "// End " basename; if (matchFile && (lastNonEmptyLine != terminator)) { error(fname, FNR, sprintf("Last line should be %c%s%c", 39, terminator, 39)); } } # Returns whether there are unmatched open parentheses. # unmatchedOpenParens("if ()") returns false. # unmatchedOpenParens("if (") returns true. # unmatchedOpenParens("if (foo) bar(") returns false function unmatchedOpenParens(s) { i = index(s, "("); if (i == 0) { return 0; } openCount = 1; while (++i <= length(s)) { c = substr(s, i, 1); if (c == "(") { ++openCount; } if (c == ")") { if (--openCount == 0) { return 0; } } } return 1; } function countLeadingSpaces(str) { i = 0; while (i < length(str) && substr(str, i + 1, 1) == " ") { ++i; } return i; } function checkIndent(str) { return str % indent == 0; } function startsWith(s, p) { return length(s) > length(p) \ && substr(s, 1, length(p)) == p; } BEGIN { # pre-compute regexp for quotes, linefeed apos = sprintf("%c", 39); quot = sprintf("%c", 34); lf = sprintf("%c", 13); pattern = apos "(\\" apos "|[^" apos "])" apos; if (0) printf "maxLineLength=%s strict=%s\n", maxLineLength, strict; } FNR == 1 { if (fname) { afterFile(); } fname = FILENAME; matchFile = _matchFile(fname); isCpp = _isCpp(fname); isJava = _isJava(fname); mondrian = _isMondrian(fname); prevImport = ""; prevImportGroup = ""; indent = (fname ~ /lambda/ || fname ~ /linq4j/) ? 2 : 4; cindent = 4; delete headers; headerCount = 0; if ($0 ~ /Generated By:JavaCC/ \ || $0 ~ /This class is generated/) { # generated; skip whole file nextfile } else if (fname ~ /XmlaOlap4jDriverVersion.java/ \ || fname ~ /package-info.java/ \ || fname ~ /MondrianOlap4jDriverVersion.java/ \ || fname ~ /MondrianTestRunner.java/ \ || fname ~ /MondrianResultPrinter.java/) { # generated; does not contain standard header } else if (mondrian) { headers[headerCount++] = "/\\*$"; headers[headerCount++] = "// This software is subject to the terms of the Eclipse Public License v1.0$"; headers[headerCount++] = "// Agreement, available at the following URL:$"; headers[headerCount++] = "// http://www.eclipse.org/legal/epl-v10.html.$"; headers[headerCount++] = "// You must accept the terms of that agreement to use this software.$"; headers[headerCount++] = "//$"; headers[headerCount++] = "// Copyright (C) [0-9]*-[0-9]* Pentaho$"; } else if (1) { headers[headerCount++] = "/\\*$"; if (_isOlap4j(fname)) { headers[headerCount++] = /^\/\/ \$Id: /; headers[headerCount++] = "//"; } headers[headerCount++] = "// Licensed to Julian Hyde under one or more contributor license$"; headers[headerCount++] = "// agreements. See the NOTICE file distributed with this work for$"; headers[headerCount++] = "// additional information regarding copyright ownership.$"; headers[headerCount++] = "//$"; headers[headerCount++] = "// Julian Hyde licenses this file to you under the Apache License,$"; headers[headerCount++] = "// Version 2.0 \\(the \"License\"\\); you may not use this file except in$"; headers[headerCount++] = "// compliance with the License. You may obtain a copy of the License at:$"; headers[headerCount++] = "//$"; headers[headerCount++] = "// http://www.apache.org/licenses/LICENSE-2.0$"; headers[headerCount++] = "//$"; headers[headerCount++] = "// Unless required by applicable law or agreed to in writing, software$"; headers[headerCount++] = "// distributed under the License is distributed on an \"AS IS\" BASIS,$"; headers[headerCount++] = "// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.$"; headers[headerCount++] = "// See the License for the specific language governing permissions and$"; headers[headerCount++] = "// limitations under the License.$"; headers[headerCount++] = "*/$"; } } FNR < headerCount { if ($0 !~ headers[FNR - 1]) { error(fname, FNR, "Does not match expected header line: " headers[FNR - 1] "\n"); headerCount = 0; # prevent further errors from this file } } { if (previousLineEndedInCloseBrace > 0) { --previousLineEndedInCloseBrace; } if (previousLineEndedInOpenBrace > 0) { --previousLineEndedInOpenBrace; } if (previousLineWasEmpty > 0) { --previousLineWasEmpty; } s = $0; # remove DOS linefeeds gsub(lf, "", s); # replace strings gsub(/"(\\"|[^"\\]|\\[^"])*"/, "string", s); # replace single-quoted strings gsub(pattern, "string", s); # replace {: and :} in .cup files if (fname ~ /\.cup$/) { gsub(/{:/, "{", s); gsub(/:}/, "}", s); gsub(/:/, " : ", s); } if (inComment && s ~ /\*\//) { # end of multiline comment "*/" inComment = 0; gsub(/^.*\*\//, "/* comment */", s); } else if (inComment) { s = "/* comment */"; } else if (s ~ /\/\*/ && s !~ /\/\*.*\*\//) { # beginning of multiline comment "/*" inComment = 1; if (strict > 1 && FNR > 1 && s !~ /\/\*\*/ && s !~ /^\/\*/) { error(fname, FNR, "Multi-line c-style comment not allowed" s); } gsub(/\/\*.*$/, "/* comment */", s); } else { # mask out /* */ comments gsub(/\/\*.*\*\//, "/* comment */", s); } if (mondrian && s ~ /\/\/\$NON-NLS/) { error(fname, FNR, "NON-NLS not allowed"); } if (s ~ /\/\/[A-Za-z]/ && strict > 1) { if (s ~ /noinspection/) {} # e.g. '//noinspection unchecked' else if (s ~ /;$/) {} # e.g. '//int dummy = 0;' else if (s ~ /:\/\//) {} # e.g. '// http://' else error(fname, FNR, "Need space after //"); } # mask out // comments gsub(/\/\/.*$/, "// comment", s); # line starts with string or plus? if (s ~ /^ *string/ \ && s !~ /)/) { stringCol = index(s, "string"); } else if (s ~ /^ *[+] string/) { if (stringCol != 0 && index(s, "+") != stringCol) { error(fname, FNR, "String '+' must be aligned with string on line above"); } } else if (s ~ /comment/) { # in comment; string target carries forward } else { stringCol = 0; } # Is the line indented as expected? if (nextIndent > 0) { x = countLeadingSpaces(s); if (x != nextIndent) { error(fname, FNR, "Incorrect indent for first line of arg list"); } } nextIndent = -1; } / $/ { error(fname, FNR, "Line ends in space"); } /[\t]/ { if (matchFile) { error(fname, FNR, "Tab character"); } } /[\r]/ { if (matchFile) { error(fname, FNR, "Carriage return character (file is in DOS format?)"); } } /./ { lastNonEmptyLine = $0; } { # Rules beyond this point only apply to Java and C++. if (!isCpp && !isJava) { next; } } /^package / { thisPackage = $2; } /^package / && previousLineWasEmpty { error(fname, FNR, "'package' declaration must not occur after empty line"); } /^import / { if (previousLineWasEmpty) { prevImport = ""; } else { if (!prevImport) { error(fname, FNR, "Expected blank line before first import"); } } thisImport = $2; gsub(/;/, "", thisImport); gsub(/\*/, "", thisImport); if (thisPackage ~ /^mondrian.*/ && thisImport ~ /^mondrian.*/) { importGroup = "a:mondrian"; } else if (thisPackage ~ /^net.hydromatic.*/ && thisImport ~ /^net.hydromatic.*/) { importGroup = "a:net.hydromatic"; } else if (thisPackage ~ /^org.olap4j.*/ && thisImport ~ /^org.olap4j.*/) { importGroup = "a:org.olap4j"; } else if (thisImport ~ /^static/) { importGroup = "z:static"; } else if (thisImport ~ /^java.*/) { if (thisPackage ~ /^org.eigenbase.*/) { importGroup = "aa:java"; } else { importGroup = "y:java"; } } else if (thisImport ~ /^junit.*/) { importGroup = "b:junit"; } else if (thisImport ~ /^mondrian.*/) { importGroup = "bb:mondrian"; } else if (thisImport ~ /^org.olap4j.xmla.server.*/) { importGroup = "bc:org.olap4j.xmla.server"; } else if (thisImport ~ /^openjava.*/) { importGroup = "cc:openjava"; } else if (thisImport ~ /^org.apache.*/) { importGroup = "c:org.apache"; } else if (thisImport ~ /^org.eigenbase.*/) { importGroup = "d:org.eigenbase"; } else if (thisImport ~ /^org.olap4j.*/) { importGroup = "e:org.olap4j"; } else { importGroup = "f:other"; } if (importGroup != prevImportGroup \ && prevImportGroup) { if (!previousLineWasEmpty) { error(fname, FNR, "Expected blank line between import groups"); } else if (prevImportGroup > importGroup) { error(fname, FNR, "Import group out of sequence (should precede " \ substr(prevImportGroup, index(prevImportGroup, ":") + 1) ")"); } } else if (prevImport \ && prevImport > thisImport \ && !startsWith(prevImport, thisImport) \ && !startsWith(thisImport, prevImport)) { error(fname, FNR, "Import out of sorted order"); } prevImport = thisImport; prevImportGroup = importGroup; } /^\/\/ Copyright .* Pentaho/ && strict > 1 { # We assume that '--strict' is only invoked on files currently being # edited. Therefore we would expect the copyright to be current. if ($0 !~ /-2015/) { error(fname, FNR, "copyright is not current"); } } /(static|public|private|protected|final|abstract)/ && !/import/ && strict > 1 { # Order of qualifiers: "public/private/protected static final abstract class ..." s2 = s; gsub(/\(.*$/, "", s2); if (s2 ~ /abstract .*final /) { error(fname, FNR, "'final' must come before 'abstract'"); } if (s2 ~ /final .*static /) { error(fname, FNR, "'static' must come before 'final'"); } if (s2 ~ /abstract .*static /) { error(fname, FNR, "'static' must come before 'abstract'"); } if (s2 ~ /static .*(public|protected|private) /) { error(fname, FNR, "'public/private/protected' must come before 'static'"); } if (s2 ~ /final .*(public|protected|private) /) { error(fname, FNR, "'public/private/protected' must come before 'final'"); } if (s2 ~ /abstract .*(public|protected|private) /) { error(fname, FNR, "'public/private/protected' must come before 'abstract'"); } } /^$/ { if (matchFile && previousLineEndedInOpenBrace) { error(fname, FNR, "Empty line following open brace"); } } /^ +}( catch| finally| while|[;,)])/ || /^ +}$/ { if (matchFile && previousLineWasEmpty) { error(fname, FNR - 1, "Empty line before close brace"); } } s ~ /\.*;$/ { if (!matchFile) {} else { error(fname, FNR, "if followed by statement on same line"); } } s ~ /\<(if) *\(/ { if (!matchFile) { } else if (s !~ /\<(if) /) { error(fname, FNR, "if must be followed by space"); } else if (s ~ / else if /) { } else if (s ~ /^#if /) { } else if (!checkIndent(s)) { error(fname, FNR, "if must be correctly indented"); } } s ~ /\<(while) *\(/ { if (!matchFile) { } else if (s !~ /\<(while) /) { error(fname, FNR, "while must be followed by space"); } else if (s ~ /} while /) { } else if (!checkIndent(s)) { error(fname, FNR, "while must be correctly indented"); } } s ~ /\<(for|switch|synchronized|} catch) *\(/ { if (!matchFile) {} else if (!checkIndent(s)) { error(fname, FNR, "for/switch/synchronized/catch must be correctly indented"); } else if (s !~ /\<(for|switch|synchronized|} catch) /) { error(fname, FNR, "for/switch/synchronized/catch must be followed by space"); } } s ~ /\<(if|while|for|switch|catch)\>/ { # Check single-line if statements, such as # if (condition) return; # We recognize such statements because there are equal numbers of open and # close parentheses. opens = s; gsub(/[^(]/, "", opens); closes = s; gsub(/[^)]/, "", closes); if (!matchFile) { } else if (s ~ /{( *\/\/ comment)?$/) { # lines which end with { and optional comment are ok } else if (s ~ /{.*\\$/ && isCpp) { # lines which end with backslash are ok in c++ macros } else if (s ~ /} while/) { # lines like "} while (foo);" are ok } else if (s ~ /^#/) { # lines like "#if 0" are ok } else if (s ~ /if \(true|false\)/) { # allow "if (true)" and "if (false)" because they are # used for commenting } else if (!unmatchedOpenParens(s) \ && length($0) != 79 \ && length($0) != 80) { error(fname, FNR, "single-line if/while/for/switch/catch must end in {"); } } s ~ /[[:alnum:]]\(/ && s !~ /\<(if|while|for|switch|assert)\>/ { ss = s; while (match(ss, /[[:alnum:]]\(/)) { ss = substr(ss, RSTART + RLENGTH - 1); parens = ss; gsub(/[^()]/, "", parens); while (substr(parens, 1, 2) == "()") { parens = substr(parens, 3); } opens = parens; gsub(/[^(]/, "", opens); closes = parens; gsub(/[^)]/, "", closes); if (length(opens) > length(closes)) { if (ss ~ /,$/) { bras = ss; gsub(/[^<]/, "", bras); kets = ss; gsub(/->/, "", kets); gsub(/[^>]/, "", kets); if (length(bras) > length(kets)) { # Ignore case like 'for (Map.Entry entry : ...' } else if (s ~ / for /) { # Ignore case like 'for (int i = 1,{nl} j = 2; i < j; ...' } else if (indent == cindent) { error( \ fname, FNR, \ "multi-line parameter list should start with newline"); break; } } else if (s ~ /[;(]( *\\)?$/) { # If open paren is at end of line (with optional backslash # for macros), we're fine. } else if (s ~ /@.*\({/) { # Ignore Java annotations. } else if (indent == cindent) { error( \ fname, FNR, \ "Open parenthesis should be at end of line (function call spans several lines)"); break; } } ss = substr(ss, 2); # remove initial "(" } } s ~ /\/ { push(switchCol); switchCol = index($0, "switch"); } s ~ /{/ { braceCol = index($0, "{"); if (braceCol == switchCol) { push(switchCol); } } s ~ /}/ { braceCol = index($0, "}"); if (braceCol == switchCol) { switchCol = pop(); } } s ~ /\<(case|default)\>/ { caseDefaultCol = match($0, /case|default/); if (!matchFile) {} else if (caseDefaultCol != switchCol) { error(fname, FNR, "case/default must be aligned with switch"); } } s ~ /\/ { if (!matchFile) {} else if (isCpp) {} # rule only applies to java else if (!checkIndent(s)) { error(fname, FNR, "assert must be correctly indented"); } else if (s !~ /\/ { if (!matchFile) {} else if (isCpp && s ~ /^#/) { # ignore macros } else if (!checkIndent(s)) { error(fname, FNR, "return must be correctly indented"); } else if (s !~ /\/ { if (!matchFile) {} else if (isCpp) { # cannot yet handle C++ cases like 'void foo() throw(int)' } else if (!checkIndent(s)) { error(fname, FNR, "throw must be correctly indented"); } else if (s !~ /\/ { if (!matchFile) {} else if (isCpp && s ~ /^# *else$/) {} # ignore "#else" else if (!checkIndent(s)) { error(fname, FNR, "else must be correctly indented"); } else if (s !~ /^ +} else (if |{$|{ *\/\/|{ *\/\*)/) { error(fname, FNR, "else must be preceded by } and followed by { or if"); } } s ~ /\/ { if (!matchFile) {} else if (!checkIndent(s)) { error(fname, FNR, "do must be correctly indented"); } else if (s !~ /^ *do {/) { error(fname, FNR, "do must be followed by space {"); } } s ~ /\/ { if (!matchFile) {} else if (!checkIndent(s)) { error(fname, FNR, "try must be correctly indented"); } else if (s !~ /^ +try {/) { error(fname, FNR, "try must be followed by space {"); } } s ~ /\/ { if (!matchFile) {} else if (!checkIndent(s)) { error(fname, FNR, "catch must be correctly indented"); } else if (s !~ /^ +} catch /) { error(fname, FNR, "catch must be preceded by } and followed by space"); } } s ~ /\/ { if (!matchFile) {} else if (!checkIndent(s)) { error(fname, FNR, "finally must be correctly indented"); } else if (s !~ /^ +} finally {/) { error(fname, FNR, "finally must be preceded by } and followed by space {"); } } s ~ /\($/ { nextIndent = countLeadingSpaces(s) + cindent; if (s ~ / (if|while) .*\(.*\(/ && indent == cindent) { nextIndent += indent; } } match(s, /([]A-Za-z0-9()])(+|-|\*|\^|\/|%|=|==|+=|-=|\*=|\/=|>=|<=|!=|&|&&|\||\|\||^|\?|:) *[A-Za-z0-9(]/, a) { # < and > are not handled here - they have special treatment below if (!matchFile) {} # else if (s ~ /<.*>/) {} # ignore templates else if (a[2] == "-" && s ~ /\(-/) {} # ignore case "foo(-1)" else if (a[2] == "-" && s ~ /[eE][+-][0-9]/) {} # ignore e.g. 1e-5 else if (a[2] == "+" && s ~ /[eE][+-][0-9]/) {} # ignore e.g. 1e+5 else if (a[2] == ":" && s ~ /(case.*|default):$/) {} # ignore e.g. "case 5:" else if (isCpp && s ~ /[^ ][*&]/) {} # ignore e.g. "Foo* p;" in c++ - debatable else if (isCpp && s ~ /\" in c++ else { error(fname, FNR, "operator '" a[2] "' must be preceded by space"); } } match(s, /([]A-Za-z0-9() ] *)(+|-|\*|\^|\/|%|=|==|+=|-=|\*=|\/=|>=|<=|!=|&|&&|\||\|\||^|\?|:|,)[A-Za-z0-9(]/, a) { if (!matchFile) {} # else if (s ~ /<.*>/) {} # ignore templates else if (a[2] == "-" && s ~ /(\(|return |case |= )-/) {} # ignore prefix - else if (a[2] == ":" && s ~ /(case.*|default):$/) {} # ignore e.g. "case 5:" else if (s ~ /, *-/) {} # ignore case "foo(x, -1)" else if (s ~ /-[^ ]/ && s ~ /[^A-Za-z0-9] -/) {} # ignore case "x + -1" but not "x -1" or "3 -1" else if (a[2] == "-" && s ~ /[eE][+-][0-9]/) {} # ignore e.g. 1e-5 else if (a[2] == "+" && s ~ /[eE][+-][0-9]/) {} # ignore e.g. 1e+5 else if (a[2] == "*" && isCpp && s ~ /\*[^ ]/) {} # ignore e.g. "Foo *p;" in c++ else if (a[2] == "&" && isCpp && s ~ /&[^ ]/) {} # ignore case "foo(&x)" in c++ else if (isCpp && s ~ /\" in c++ else if (strict < 2 && fname ~ /(fennel)/ && a[1] = ",") {} # not enabled yet else { error(fname, FNR, "operator '" a[2] "' must be followed by space"); } } match(s, /( )(,)/, a) { # (, < and > are not handled here - they have special treatment below if (!matchFile) {} else { error(fname, FNR, "operator '" a[2] "' must not be preceded by space"); } } match(s, / (+|-|\*|\/|==|>=|<=|!=|<<|<<<|>>|&|&&|\|\||\?|:)$/, a) || \ match(s, /(\.|->)$/, a) { if (strict < 2 && fname ~ /(aspen)/ && a[1] != ":") {} # not enabled yet else if (strict < 2 && fname ~ /(fennel|farrago|aspen)/ && a[1] = "+") {} # not enabled yet else if (a[1] == ":" && s ~ /(case.*|default):$/) { # ignore e.g. "case 5:" } else if ((a[1] == "*" || a[1] == "&") && isCpp && s ~ /^[[:alnum:]:_ ]* [*&]$/) { # ignore e.g. "const int *\nClass::Subclass2::method(int x)" } else { error(fname, FNR, "operator '" a[1] "' must not be at end of line"); } } match(s, /^ *(=) /, a) { error(fname, FNR, "operator '" a[1] "' must not be at start of line"); } match(s, /([[:alnum:]~]+)( )([(])/, a) { # (, < and > are not handled here - they have special treatment below if (!matchFile) {} else if (isJava && a[1] ~ /\<(if|while|for|catch|switch|case|return|throw|synchronized|assert)\>/) {} else if (isCpp && a[1] ~ /\<(if|while|for|catch|switch|case|return|throw|operator|void|PBuffer)\>/) {} else if (isCpp && s ~ /^#define /) {} else { error(fname, FNR, "there must be no space before '" a[3] "' in fun call or fun decl"); } } s ~ /\<[[:digit:][:lower:]][[:alnum:]_]*' could be a template else { error(fname, FNR, "operator '<' must be preceded by space"); } } s ~ /\<[[:digit:][:lower:]][[:alnum:]_]*>/ { # E.g. "g>" but not "String>" as in "List" if (!matchFile) {} else if (isCpp) {} # in C++ 'xyz' could be a template else { error(fname, FNR, "operator '>' must be preceded by space"); } } match(s, /<([[:digit:][:lower:]][[:alnum:].]*)\>/, a) { if (!matchFile) {} else if (isCpp) { # in C++, template and include generate too many false positives } else if (isJava && a[1] ~ /(int|char|long|boolean|byte|double|float)/) { # Allow e.g. 'List' } else if (isJava && a[1] ~ /^[[:lower:]]+\./) { # Allow e.g. 'List' } else { error(fname, FNR, "operator '<' must be followed by space"); } } match(s, /^(.*[^-])>([[:digit:][:lower:]][[:alnum:]]*)\>/, a) { if (!matchFile) {} else if (isJava && a[1] ~ /.*\.<.*/) { # Ignore 'Collections.member' } else { error(fname, FNR, "operator '>' must be followed by space"); } } s ~ /[[(] / { if (!matchFile) {} else if (s ~ /[[(] +\\$/) {} # ignore '#define foo( \' else { error(fname, FNR, "( or [ must not be followed by space"); } } s ~ / [])]/ { if (!matchFile) {} else if (s ~ /^ *\)/ && previousLineEndedInCloseBrace) {} # ignore "bar(new Foo() { } );" else { error(fname, FNR, ") or ] must not be followed by space"); } } s ~ /}/ { if (!matchFile) {} else if (s !~ /}( |;|,|$|\)|\.)/) { error(fname, FNR, "} must be followed by space"); } else if (s !~ /^ *}/) { # not at start of line - ignore } else if (!checkIndent(s)) { error(fname, FNR, "} must be correctly indented"); } } $0 ~ /\* @param [A-Za-z0-9_]+$/ && strict > 1 { error(fname, FNR, "Empty javadoc param"); } $0 ~ /\* @return *$/ && strict > 1 { error(fname, FNR, "Empty javadoc return"); } s ~ /{/ { if (!matchFile) {} else if (s ~ /(\]\)?|=) *{/) {} # ignore e.g. "(int[]) {1, 2}" or "int[] x = {1, 2}" else if (s ~ /\({/) {} # ignore e.g. @SuppressWarnings({"unchecked"}) else if (s ~ /{ *(\/\/|\/\*)/) {} # ignore e.g. "do { // a comment" else if (s ~ / \{\}$/) {} # ignore e.g. "Constructor() {}" else if (s ~ / },$/) {} # ignore e.g. "{ yada }," else if (s ~ / };$/) {} # ignore e.g. "{ yada };" else if (s ~ / \{\};$/) {} # ignore e.g. "template <> class Foo {};" else if (s ~ / },? *\/\/.*$/) {} # ignore e.g. "{ yada }, // comment" else if (s ~ /\\$/) {} # ignore multiline macros else if (s ~ /{}/) { # e.g. "Constructor(){}" error(fname, FNR, "{} must be preceded by space and at end of line"); } else if (isCpp && s ~ /{ *\\$/) { # ignore - "{" can be followed by "\" in c macro } else if (s !~ /{$/) { error(fname, FNR, "{ must be at end of line"); } else if (s !~ /(^| ){/) { error(fname, FNR, "{ must be preceded by space or at start of line"); } else { opens = s; gsub(/[^(]/, "", opens); closes = s; gsub(/[^)]/, "", closes); if (0 && strict < 2 && fname ~ /aspen/) {} # not enabled else if (length(closes) > length(opens) && indent == cindent) { error(fname, FNR, "Open brace should be on new line (function call/decl spans several lines)"); } } } s ~ /(^| )(class|interface|enum) / || s ~ /(^| )namespace / && isCpp { if (isCpp && s ~ /;$/) {} # ignore type declaration else { classDeclStartLine = FNR; t = s; gsub(/.*(class|interface|enum|namespace) /, "", t); gsub(/ .*$/, "", t); if (s ~ /template/) { # ignore case "template static void foo()" classDeclStartLine = 0; } else if (t ~ /[[:upper:]][[:upper:]][[:upper:]][[:upper:]]/ \ && t !~ /LRU/ \ && t !~ /WAL/ \ && t !~ /classUUID/ \ && t !~ /classSQLException/ \ && t !~ /BBRC/ \ && t !~ /_/ \ && t !~ /EncodedSqlInterval/) { error(fname, FNR, "Class name " t " has consecutive uppercase letters"); } } } s ~ / throws\>/ { if (s ~ /\(/) { funDeclStartLine = FNR; } else { funDeclStartLine = FNR - 1; } } length($0) > maxLineLength \ && $0 !~ /@(throws|see|link)/ \ && $0 !~ /\$Id: / \ && $0 !~ /^import / \ && $0 !~ /http:/ \ && $0 !~ /https:/ \ && $0 !~ /\/\/ Expect "/ \ && s !~ /^ *(\+ |<< |: |\?)?string\)*[;,]?$/ { error( \ fname, \ FNR, \ "Line length (" length($0) ") exceeds " maxLineLength " chars"); } /}$/ { previousLineEndedInCloseBrace = 2; } /;$/ { funDeclStartLine = 0; } /{$/ { # Ignore open brace if it is part of class or interface declaration. if (classDeclStartLine) { if (classDeclStartLine < FNR \ && $0 !~ /^ *{$/ \ && indent == cindent) { error(fname, FNR, "Open brace should be on new line (class decl spans several lines)"); } classDeclStartLine = 0; } else { previousLineEndedInOpenBrace = 2; } if (funDeclStartLine) { if (funDeclStartLine < FNR \ && $0 !~ /^ *{$/) { if (strict < 2 && fname ~ /aspen/) {} # not enabled else if (cindent != indent) {} else error(fname, FNR, "Open brace should be on new line (function decl spans several lines)"); } funDeclStartLine = 0; } } /^$/ { previousLineWasEmpty = 2; } { next; } END { afterFile(); } # End checkFile.awk mondrian-3.11.0.1-R/bin/checkFile.sh000077500000000000000000000205351261646570300167440ustar00rootroot00000000000000#!/bin/bash # # Checks that a file is valid. # Used by perforce submit trigger, via runTrigger. # The file is deemed to be valid if this command produces no output. # # Usage: # checkFile [ --depotPath ] # # runTrigger uses first form, with a temporary file, e.g. # checkFile --depotPath //depot/src/foo/Bar.java /tmp/foo.txt # # The second form is useful for checking files in the client before you # try to submit them: # checkFile src/foo/Bar.java # usage() { echo "checkFile [ ] --depotPath " echo " Checks a temporary file. depotPath is the full path of" echo " the file stored in perforce, for error reporting; file" echo " holds the actual file contents." echo "checkFile [ ] ..." echo " Checks a list of files." echo "checkFile [ ] --opened" echo " Checks all files that are opened in git. Implies --strict." echo "checkFile [ ] --under " echo " Recursively checks all files under a given directory." echo "checkFile --help" echo " Prints this help." echo echo "Options:" echo "--lenient" echo " Does not apply rules to components which are not known to" echo " be in compliance. The perforce trigger uses this option." echo "--strict" echo " Stricter than usual; the opposite of lenient." } doCheck() { filePath="$1" file="$2" maxLineLength="$3" # CHECKFILE_IGNORE is an environment variable that contains a callback # to decide whether to check this file. The command or function should # succeed (that is, return 0) if checkFile is to ignore the file, fail # (that is, return 1 or other non-zero value) otherwise. if [ "$CHECKFILE_IGNORE" ]; then if eval $CHECKFILE_IGNORE "$filePath"; then return fi fi # Exceptions for mondrian case "$filePath" in */mondrian/util/Base64.java| \ */mondrian/olap/MondrianDef.java| \ */mondrian/gui/MondrianGuiDef.java| \ */mondrian/xmla/DataSourcesConfig.java| \ */mondrian/rolap/aggmatcher/DefaultDef.java| \ */mondrian/resource/MondrianResource*.java| \ */mondrian/olap/MondrianProperties.java| \ */mondrian/olap/Parser.java| \ */mondrian/olap/ParserSym.java| \ */mondrian/parser/ParseException.java| \ */mondrian/parser/Token.java| \ */mondrian/parser/TokenMgrError.java| \ */mondrian/parser/SimpleCharStream.java| \ */mondrian/parser/MdxParserImplConstants.java| \ */mondrian/parser/MdxParserImplTokenManager.java| \ */mondrian/parser/MdxParserImpl.java) # mondrian.util.Base64 is checked in as is, so don't check it # Other files above are generated. return ;; # Exceptions for olap4j */org/olap4j/mdx/parser/impl/*.java| \ */org/olap4j/impl/Base64.java) return ;; # Exceptions for farrago */farrago/classes/* | \ */farrago/catalog/* | \ */farrago/examples/rng/src/net/sf/farrago/rng/parserimpl/*.java | \ */farrago/examples/rng/src/net/sf/farrago/rng/resource/FarragoRngResource*.java | \ */farrago/examples/rng/catalog/net/sf/farrago/rng/rngmodel/* | \ */farrago/examples/rng/catalog/java/* | \ */farrago/jdbc4/*.java | \ */farrago/src/net/sf/farrago/FarragoMetadataFactoryImpl.java | \ */farrago/src/net/sf/farrago/FarragoMetadataFactory.java | \ */farrago/src/net/sf/farrago/parser/impl/*.java | \ */farrago/src/net/sf/farrago/resource/FarragoResource*.java | \ */farrago/src/net/sf/farrago/resource/FarragoInternalQuery*.java | \ */farrago/src/net/sf/farrago/test/FarragoSqlTestWrapper.java | \ */farrago/src/org/eigenbase/jdbc4/*.java | \ */farrago/src/org/eigenbase/lurql/parser/*.java | \ */farrago/src/com/lucidera/lurql/parser/*.java | \ */farrago/src/org/eigenbase/resource/EigenbaseResource*.java | \ */farrago/src/org/eigenbase/sql/parser/impl/*.java) return ;; # Exceptions for fennel */fennel/CMakeFiles/CompilerIdCXX/CMakeCXXCompilerId.cpp | \ */fennel/disruptivetech/calc/CalcGrammar.tab.cpp | \ */fennel/disruptivetech/calc/CalcGrammar.cpp | \ */fennel/disruptivetech/calc/CalcGrammar.h | \ */fennel/disruptivetech/calc/CalcLexer.cpp | \ */fennel/disruptivetech/calc/CalcLexer.h | \ */fennel/calculator/CalcGrammar.tab.cpp | \ */fennel/calculator/CalcGrammar.cpp | \ */fennel/calculator/CalcGrammar.h | \ */fennel/calculator/CalcLexer.cpp | \ */fennel/calculator/CalcLexer.h | \ */fennel/common/FemGeneratedEnums.h | \ */fennel/common/FennelResource.cpp | \ */fennel/common/FennelResource.h | \ */fennel/config.h | \ */fennel/farrago/FemGeneratedClasses.h | \ */fennel/farrago/FemGeneratedMethods.h | \ */fennel/farrago/NativeMethods.h) return ;; # Skip our own test files, unless we are testing. */util/test/CheckFile1.*) if [ ! "$test" ]; then return fi ;; # Only validate .java and parser files at present. *.java|*.cup|*.h|*.cpp) ;; *) return ;; esac # Set maxLineLength if it is not already set. ('checkFile --opened' # sets it to the strictest value, 80). if [ ! "$maxLineLength" ]; then maxLineLength=80 fi # Check whether there are tabs, or lines end with spaces # todo: check for ' ;' # todo: check that every file has copyright/license header # todo: check that every class has javadoc # todo: check that every top-level class has @author and @version # todo: check c++ files if test "$deferred" ; then echo "$file" >> "${deferred_file}" else gawk -f "$CHECKFILE_AWK" \ -v fname="$filePath" \ -v strict="$strict" \ -v maxLineLength="$maxLineLength" \ "$file" fi } doCheckDeferred() { if [ -s "${deferred_file}" ]; then maxLineLength=80 cat "${deferred_file}" | xargs -P $(expr ${CORE_COUNT} \* 2) -n 100 gawk -f "$CHECKFILE_AWK" \ -v strict="$strict" \ -v maxLineLength="$maxLineLength" fi rm -f "${deferred_file}" } function guessCoreCount() { if [ -f /proc/cpuinfo ]; then cat /proc/cpuinfo | awk '$1 == "processor"' | wc -l else # File doe not exist on Darwin or cygwin echo 2 fi } export CORE_COUNT=$(guessCoreCount) export deferred=true # 'test' is an undocumented flag, overriding the default behavior which is # to ignore our own test files test= if [ "$1" == --test ]; then test=true shift fi strict=1 if [ "$1" == --lenient ]; then strict=0 shift fi if [ "$1" == --help ]; then usage exit 0 fi if [ "$1" == --strict ]; then strict=2 shift fi depotPath= if [ "$1" == --depotPath ]; then depotPath="$2" deferred= shift 2 fi opened= if [ "$1" == --opened ]; then opened=true deferred= strict=2 shift fi under= if [ "$1" == --under ]; then if [ "$opened" ]; then echo "Cannot specify both --under and --opened" exit 1 fi if [ ! -d "$2" ]; then echo "--under requires a directory; '$2' not found" exit 1 fi under="$2" shift 2 fi if [ "$1" == --opened ]; then echo "Cannot specify both --under and --opened" exit 1 fi if [ ! -f "$CHECKFILE_AWK" ] then case $(uname) in (Darwin) export CHECKFILE_AWK="$(cd $(dirname $0); pwd -P)/checkFile.awk";; (*) export CHECKFILE_AWK="$(dirname $(readlink -f $0))/checkFile.awk";; esac fi export deferred_file=/tmp/checkFile_deferred_$$.txt rm -f "${deferred_file}" ( if [ "$under" ]; then find "$under" -type f | while read file; do filePath="$file" if [ "$depotPath" ]; then filePath="$depotPath" fi doCheck "$filePath" "$file" "" done elif [ "$opened" ]; then git checkout | gawk '$1 != "D" {print $2}' | while read file; do doCheck "$file" "$file" "80" done else for file in "$@"; do filePath="$file" if [ "$depotPath" ]; then filePath="$depotPath" fi doCheck "$filePath" "$file" "" done fi if test "$deferred"; then doCheckDeferred fi ) | tee /tmp/checkFile_output_$$.txt status=0 if [ -s /tmp/checkFile_output_$$.txt ]; then status=1 fi rm -f /tmp/checkFile_output_$$.txt exit $status # End checkFile mondrian-3.11.0.1-R/bin/cmdrunner.cmd000066400000000000000000000003371261646570300172100ustar00rootroot00000000000000@echo off rem rem rem cmdrunner.cmd rem rem Must set location of the cmdrunner.jar rem rem $Id: $ rem set JAVA_COMMAND=%JAVA_HOME%\bin\java set CMD_RUNNER_JAR=..\lib\cmdrunner.jar %JAVA_COMMAND% -jar %CMD_RUNNER_JAR% %* mondrian-3.11.0.1-R/bin/cmdrunner.sh000077500000000000000000000012171261646570300170600ustar00rootroot00000000000000#!/bin/bash # do not use ksh, use bash ##################################################################### # # cmdrunner.sh # # Must set location of the cmdrunner.jar # # $Id$ ##################################################################### declare -r DIR=$(dirname $0) # # attempt to find jar # if [[ -e "$DIR"/../lib/cmdrunner.jar ]] ; then CMD_RUNNER_JAR="$DIR"/../lib/cmdrunner.jar elif [[ -e "$DIR"/lib/cmdrunner.jar ]] ; then CMD_RUNNER_JAR="$DIR"/lib/cmdrunner.jar elif [[ -e ./cmdrunner.jar ]] ; then CMD_RUNNER_JAR=./cmdrunner.jar else echo "Can not locate cmdrunner.jar" exit 1 fi java -jar "$CMD_RUNNER_JAR" "$@" mondrian-3.11.0.1-R/bin/loadFoodMart.sh000077500000000000000000000226611261646570300174440ustar00rootroot00000000000000#!/bin/bash # # This software is subject to the terms of the Eclipse Public License v1.0 # Agreement, available at the following URL: # http://www.eclipse.org/legal/epl-v10.html. # You must accept the terms of that agreement to use this software. # # Copyright (C) 2008-2012 Pentaho and others # All Rights Reserved. # # Sample scripts to load Mondrian's database for various databases. case $(uname) in Linux|Darwin) PS=: ;; *) PS=\; ;; esac outputQuoted=true export CP="lib/mondrian.jar" export CP="${CP}${PS}lib/olap4j.jar" export CP="${CP}${PS}lib/log4j.jar" export CP="${CP}${PS}lib/commons-logging.jar" export CP="${CP}${PS}lib/eigenbase-properties.jar" export CP="${CP}${PS}lib/eigenbase-xom.jar" export CP="${CP}${PS}lib/eigenbase-resgen.jar" usage() { echo "Usage: loadFoodMart.sh [ --help | --db ]" echo echo "Populate FoodMart database, calling the MondrianFoodMartLoader" echo "program with a typical set of arguments. This script does not aim to" echo "be 100% customizable from the command line; you will almost certainly" echo "have to edit it with the URL and options of your database. But for" echo "each database engine, the command given here will be reasonably" echo "close to what you need." echo echo "Options:" echo " --help Prints this help" echo " --db Loads into target database, where is" echo " one of: ${dbs}" } error() { echo "Error: $1" echo usage } oracle() { # Assume ORACLE_HOME is set, e.g.: # export ORACLE_HOME=G:/oracle/product/10.1.0/Db_1 # For JDBC driver, try 'ojdbc6.jar' on JDK1.6; # try 'ojdbc5.jar' on JDK1.5; # try 'ojdbc14.jar' on JDK1.4 or Oracle 10 and earlier. java -cp "${CP}${PS}${ORACLE_HOME}/jdbc/lib/ojdbc6.jar" \ mondrian.test.loader.MondrianFoodMartLoader \ -verbose -aggregates -tables -data -indexes \ -jdbcDrivers=oracle.jdbc.OracleDriver \ -inputFile=demo/FoodMartCreateData.sql \ -outputJdbcURL="jdbc:oracle:thin:foodmart/foodmart@//localhost:1521/XE" } # Load into Oracle, creating dimension tables first, then trickling data into # fact tables. oracleTrickle() { java -cp "${CP}${PS}${ORACLE_HOME}/jdbc/lib/ojdbc6.jar" \ mondrian.test.loader.MondrianFoodMartLoader \ -verbose -tables -indexes -data -exclude=sales_fact_1997 \ -jdbcDrivers=oracle.jdbc.OracleDriver \ -inputJdbcURL="jdbc:oracle:thin:foodmart/foodmart@//localhost:1521/XE" \ -outputJdbcURL="jdbc:oracle:thin:slurpmart/slurpmart@//localhost:1521/XE" # Write 10 rows each second into the sales fact table. java -cp "${CP}${PS}${ORACLE_HOME}/jdbc/lib/ojdbc6.jar" \ mondrian.test.loader.MondrianFoodMartLoader \ -verbose -tables -indexes -data -pauseMillis=100 -include=sales_fact_1997 \ -jdbcDrivers=oracle.jdbc.OracleDriver \ -inputJdbcURL="jdbc:oracle:thin:foodmart/foodmart@//localhost:1521/XE" \ -outputJdbcBatchSize=100 \ -outputJdbcURL="jdbc:oracle:thin:slurpmart/slurpmart@//localhost:1521/XE" } mysql() { java -cp "${CP}${PS}/usr/local/mysql-connector-java-3.1.12/mysql-connector-java-3.1.12-bin.jar" \ mondrian.test.loader.MondrianFoodMartLoader \ -verbose -aggregates -tables -data -indexes \ -jdbcDrivers=com.mysql.jdbc.Driver \ -inputFile=demo/FoodMartCreateData.sql \ -outputJdbcURL="jdbc:mysql://localhost/foodmart?user=foodmart&password=foodmart" } nuodb() { java -cp "${CP}${PS}/opt/nuodb/jar/nuodbjdbc.jar" \ mondrian.test.loader.MondrianFoodMartLoader \ -verbose -aggregates -tables -data -indexes \ -jdbcDrivers=com.nuodb.jdbc.Driver \ -inputFile=demo/FoodMartCreateData.sql \ -outputJdbcURL="jdbc:com.nuodb://localhost/foodmart?schema=mondrian" \ -outputJdbcUser=foodmart \ -outputJdbcPassword=foodmart } infobright() { # As mysql, but '-indexes' option removed because infobright doesn't support them. java -cp "${CP}${PS}/usr/local/mysql-connector-java-3.1.12/mysql-connector-java-3.1.12-bin.jar" \ mondrian.test.loader.MondrianFoodMartLoader \ -verbose -aggregates -tables -data \ -jdbcDrivers=com.mysql.jdbc.Driver \ -inputFile=demo/FoodMartCreateData.sql \ -outputJdbcURL="jdbc:mysql://localhost/foodmart?user=foodmart&password=foodmart&characterEncoding=UTF-8" } # Load PostgreSQL. # # To install postgres and its JDBC driver on ubuntu: # $ sudo apt-get install postgresql libpg-java # Then change postgres password, create a user and database: # $ sudo -u postgres psql postgres # # ALTER USER postgres WITH ENCRYPTED PASSWORD ''; # # \q # $ sudo -u postgres createuser -D -A -P foodmart # $ sudo -u postgres createdb -O foodmart foodmart postgresql() { java -verbose -cp "${CP}${PS}/usr/share/java/postgresql.jar" \ mondrian.test.loader.MondrianFoodMartLoader \ -verbose -tables -data -indexes \ -jdbcDrivers="org.postgresql.Driver" \ -inputFile=demo/FoodMartCreateData.sql \ -outputJdbcURL="jdbc:postgresql://localhost/foodmart" \ -outputJdbcUser=foodmart \ -outputJdbcPassword=foodmart } # Load farrago (a LucidDB variant) farrago() { java -cp "${CP}${PS}../farrago/classes" \ mondrian.test.loader.MondrianFoodMartLoader \ -verbose -aggregates -tables -data -indexes \ -jdbcDrivers=net.sf.farrago.client.FarragoVjdbcClientDriver \ -inputFile=demo/FoodMartCreateData.sql \ -outputJdbcURL="jdbc:farrago:rmi://localhost" } # Load LucidDB # # Install LucidDB per instructions at # http://pub.eigenbase.org/wiki/LucidDbGettingStarted, start sqlline, then run # the following: # # jdbc:luciddb:http://localhost> create schema foodmart; # jdbc:luciddb:http://localhost> create user "foodmart" identified by 'foodmart'; # jdbc:luciddb:http://localhost> grant execute on specific procedure # > applib.estimate_statistics_for_schema_no_samplingrate # > to "foodmart"; luciddb() { export LUCIDDB_HOME=/usr/local/luciddb java -cp "${CP}${PS}${LUCIDDB_HOME}/plugin/LucidDbClient.jar" \ mondrian.test.loader.MondrianFoodMartLoader \ -verbose -aggregates -tables -data -indexes -analyze \ -jdbcDrivers=org.luciddb.jdbc.LucidDbClientDriver \ -inputFile=demo/FoodMartCreateData.sql \ -outputJdbcURL="jdbc:luciddb:http://localhost;schema=FOODMART" \ -outputJdbcUser="foodmart" \ -outputJdbcPassword="foodmart" } # Load monetdb # # 1. Build from source (because required patches are not in a release # yet). # # sudo apt-get install libssl-dev pkg-config libpcre* libxml2-dev # curl -O http://monetdb.cwi.nl/testweb/web/45868:949c8b8db28d/MonetDB-11.13.4.tar.bz2 # tar xvfj MonetDB-11.13.4.tar.bz2 # cd MonetDB-11.13.4 # ./configure # make # sudo make install # # 2. Create and start database. # # sudo mkdir /var/local/monetdb # sudo chown ${USER} /var/local/monetdb # monetdbd create /var/local/monetdb # monetdbd start /var/local/monetdb # monetdb create foodmart # monetdb start foodmart # monetdb release foodmart monetdb() { java -ea -esa -cp "${CP}${PS}lib/monetdb-jdbc.jar" \ mondrian.test.loader.MondrianFoodMartLoader \ -verbose -tables -data -indexes \ -dataset=${dataset} \ -jdbcDrivers=nl.cwi.monetdb.jdbc.MonetDriver \ -inputFile="$inputFile" \ -afterFile="$afterFile" \ -outputQuoted=${outputQuoted} \ -outputJdbcBatchSize=1000 \ -outputJdbcURL="jdbc:monetdb://localhost/${dataset}" \ -outputJdbcUser="monetdb" \ -outputJdbcPassword="monetdb" } # Load Teradata. # You'll have to download drivers and put them into the drivers folder. # Note that we do not use '-aggregates'; we plan to use aggregate # join indexes instead of explicit aggregate tables. teradata() { java -cp "${CP}${PS}drivers/terajdbc4.jar${PS}drivers/tdgssjava.jar${PS}drivers/tdgssconfig.jar" \ mondrian.test.loader.MondrianFoodMartLoader \ -verbose -tables -data -indexes \ -jdbcDrivers=com.ncr.teradata.TeraDriver \ -inputFile=demo/FoodMartCreateData.sql \ -outputJdbcURL="jdbc:teradata://localhost/foodmart" \ -outputJdbcUser="tduser" \ -outputJdbcPassword="tduser" } # Load Hsqldb. hsqldb() { rm -rf demo/hsqldb/foodmart.* java -Xmx512M -ea -esa -cp "${CP}${PS}lib/hsqldb.jar" \ mondrian.test.loader.MondrianFoodMartLoader \ -verbose -tables -data -indexes \ -jdbcDrivers=org.hsqldb.jdbcDriver \ -inputFile=demo/FoodMartCreateData.sql \ -outputJdbcBatchSize=1 \ -outputJdbcURL="jdbc:hsqldb:file:demo/hsqldb/foodmart" \ -outputJdbcUser="sa" \ -outputJdbcPassword="" } dbs="\ farrago \ hsqldb \ infobright \ luciddb \ monetdb \ mysql \ nuodb \ oracle \ oracleTrickle \ postgresql \ teradata \ " db= while [ $# -gt 0 ]; do case "$1" in (--help) usage; exit 0;; (--db) shift; db="$1"; shift;; (*) error "Unknown argument '$1'"; exit 1;; esac done cd $(dirname $0)/.. case "$db" in ('') error "You must specify a database."; exit 1;; (farrago) farrago;; (hsqldb) hsqldb;; (infobright) infobright;; (luciddb) luciddb;; (monetdb) monetdb;; (mysql) mysql;; (nuodb) nuodb;; (oracle) oracle;; (oracleTrickle) oracleTrickle;; (postgresql) postgresql;; (teradata) teradata;; (*) error "Unknown database '$db'."; exit 1;; esac # End loadFoodMart.sh mondrian-3.11.0.1-R/bin/megatest000077500000000000000000000753341261646570300162760ustar00rootroot00000000000000#!/bin/bash # # This software is subject to the terms of the Eclipse Public License v1.0 # Agreement, available at the following URL: # http://www.eclipse.org/legal/epl-v10.html. # You must accept the terms of that agreement to use this software. # # Copyright (C) 2006-2012 Pentaho # All Rights Reserved. # # Script to run the Mondrian test suite under various JDKs, with parameter # settings, against various RDBMSes. Customize it with your environment - # whatever JDKs, DBMSes and drivers you have. The script makes lots of # assumptions about your environment, but you can figure these out by reading # the code. # # This is for mondrian developers & QA. It is not intended to run in a # release environment. #ANT_FLAGS=-Dskip.download=true ANT_FLAGS= CLEAN=clean #CLEAN= # The script's path is $OPEN_DIR/mondrian/bin/megatest; deduce OPEN_DIR. OPEN_DIR=$(cd $(dirname $0)/../..; pwd) MONDRIAN_DIR=$(cd $(dirname $0)/..; pwd) hostname=$(uname -n | cut -d . -f 1) cygwin= case $(uname) in CYGWIN*) OPEN_DIR=$(cygpath -m $OPEN_DIR) MONDRIAN_DIR=$(cygpath -m $MONDRIAN_DIR) cygwin=true if [ ${hostname} = mackerel-winxp \ -a "$OPEN_DIR" = "e:/open" ]; then OPEN_DIR=/open MONDRIAN_DIR=/open/mondrian echo $OPEN_DIR fi ;; esac # Special cases. case ${hostname} in mackerel) if [ ! "$cygwin" ]; then hostname=mackerel-linux; fi ;; esac case ${hostname} in branston) databaseList="access derby hsqldb mysql oracle" jdkList="jdk1.5 jdk1.6" ;; mackerel) databaseList="access derby hsqldb" jdkList="jdk1.4 jdk1.5 jdk1.6" ;; mackerel-linux) databaseList="derby hsqldb" jdkList="jdk1.4 jdk1.5 jdk1.6" ;; mackerel-winxp) databaseList="access derby hsqldb teradata" jdkList="jdk1.4 jdk1.5 jdk1.6" ;; marmalade) databaseList="derby hsqldb mysql oracle luciddb postgresql" jdkList="jdk1.4 jdk1.5 jdk1.6 openjdk1.6" ;; marmite) databaseList="derby hsqldb monetdb mysql oracle" jdkList="jdk1.4 jdk1.5 jdk1.6 jdk1.7 openjdk1.6 openjdk1.7 ibmjdk1.6" ;; ATRHisv1) databaseList="hsqldb neoview" jdkList="jdk1.6" ;; plank) databaseList="derby mysql hsqldb" jdkList="jdk1.4 jdk1.5 jdk1.6 openjdk1.6" ;; *) databaseList="derby hsqldb mysql oracle" jdkList="jdk1.4 jdk1.5 jdk1.6" ;; esac case $(uname) in CYGWIN*) export PS=';' ;; *) export PS=':' ;; esac # Macros to allow groups of properties to be set at once. export ENABLE_NATIVE="\ mondrian.native.crossjoin.enable=true \ mondrian.native.topcount.enable=true \ mondrian.native.filter.enable=true \ mondrian.native.nonempty.enable=true" export DISABLE_NATIVE="\ mondrian.native.crossjoin.enable=false \ mondrian.native.topcount.enable=false \ mondrian.native.filter.enable=false \ mondrian.native.nonempty.enable=false" export ENABLE_AGGS="\ mondrian.rolap.aggregates.Use=true \ mondrian.rolap.aggregates.Read=true" export DISABLE_AGGS="\ mondrian.rolap.aggregates.Use=false \ mondrian.rolap.aggregates.Read=false" export ENABLE_GSETS="\ mondrian.rolap.groupingsets.enable=true" export ENABLE_CMCACHE="\ mondrian.rolap.EnableRolapCubeMemberCache=true" export ENABLE_SSAS="\ mondrian.olap.SsasCompatibleNaming=true" export DISBLE_SSAS="\ mondrian.olap.SsasCompatibleNaming=false" doTest() { if [ -f test.properties ]; then mv test.properties test.properties.bak fi if [ -f mondrian.properties ]; then mv mondrian.properties mondrian.properties.bak fi doTest2 "$@" mv test.properties.bak test.properties mv mondrian.properties.bak mondrian.properties } doTest2() { olap4j= mondrian=true if [ "$1" = --mondrian ]; then mondrian=true shift fi if [ "$1" = --nomondrian ]; then mondrian= shift fi if [ "$1" = --olap4j ]; then olap4j=true shift fi if [ "$1" = --noolap4j ]; then olap4j= shift fi retroweave= if [ "$1" = --retroweave ]; then retroweave=true shift fi jdk=$1 database=$2 # If the database does not exist, silently skip this test. database=$2 if echo "$databaseList" | grep -s "$database"; then echo "database $database ok" else echo "database $database not ok" return fi JAVA_HOME=$(chooseJavaHome $jdk) # Use a version of ant (and in particular junit) compatible with the JDK. # Some versions of ant don't work on JDK1.4. export ANT_HOME=$(chooseAntHome $jdk) rm -f megatest.properties case $database in access) ( jdbcURL=jdbc:odbc:MondrianFoodMart jdbcDrivers=sun.jdbc.odbc.JdbcOdbcDriver echo mondrian.foodmart.jdbcURL=${jdbcURL} echo mondrian.jdbcDrivers=${jdbcDrivers} echo "mondrian.test.connectString=Provider=mondrian;Jdbc=${jdbcURL};JdbcUser=foodmart;JdbcPassword=foodmart;Catalog=${MONDRIAN_DIR}/demo/FoodMart.xml;JdbcDrivers=${jdbcDrivers};RoleXX='California manager';" ) >> megatest.properties ;; hsqldb) ( jdbcURL=jdbc:hsqldb:file:demo/hsqldb/foodmart jdbcDrivers=org.hsqldb.jdbcDriver echo driver.classpath=lib/hsqldb.jar echo mondrian.foodmart.jdbcURL=${jdbcURL} echo mondrian.jdbcDrivers=${jdbcDrivers} echo "mondrian.test.connectString=Provider=mondrian;Jdbc=${jdbcURL};JdbcUser=sa;JdbcPassword=;Catalog=${MONDRIAN_DIR}/demo/FoodMart.xml;JdbcDrivers=${jdbcDrivers};RoleXX='California manager';" ) >> megatest.properties ;; luciddb) ( export LUCIDDB_HOME=/usr/local/luciddb-0.9.2 jdbcURL="jdbc:luciddb:http://localhost;schema=FOODMART" jdbcDrivers=org.luciddb.jdbc.LucidDbClientDriver echo driver.classpath=${LUCIDDB_HOME}/plugin/LucidDbClient.jar echo mondrian.foodmart.jdbcURL=${jdbcURL} echo mondrian.jdbcDrivers=${jdbcDrivers} echo "mondrian.test.connectString=Provider=mondrian;Jdbc='${jdbcURL}';JdbcUser=foodmart;JdbcPassword=foodmart;Catalog=${MONDRIAN_DIR}/demo/FoodMart.xml;JdbcDrivers=${jdbcDrivers};RoleXX='California manager';" ) >> megatest.properties ;; monetdb) ( jdbcURL="jdbc:monetdb://localhost/FOODMART" jdbcDrivers=nl.cwi.monetdb.jdbc.MonetDriver echo driver.classpath=lib/monetdb-jdbc.jar echo mondrian.foodmart.jdbcURL=${jdbcURL} echo mondrian.jdbcDrivers=${jdbcDrivers} echo "mondrian.test.connectString=Provider=mondrian;Jdbc='${jdbcURL}';JdbcUser=monetdb;JdbcPassword=monetdb;Catalog=${MONDRIAN_DIR}/demo/FoodMart.xml;JdbcDrivers=${jdbcDrivers};RoleXX='California manager';" ) >> megatest.properties ;; neoview) ( jdbcURL='jdbc:hpt4jdbc://${NEOVIEW_HOST_PORT}/:schema=PENTAHO;serverDataSource=PENTAHO_DataSource' jdbcUser=${NEOVIEW_USER} jdbcPassword=${NEOVIEW_PASSWORD} jdbcDrivers=com.hp.t4jdbc.HPT4Driver echo driver.classpath=${HOME}/dl/hpt4jdbc.jar echo mondrian.foodmart.jdbcURL=${jdbcURL} echo mondrian.jdbcDrivers=${jdbcDrivers} echo "mondrian.test.connectString=Provider=mondrian;Jdbc=${jdbcURL};JdbcUser=${NEOVIEW_USER};JdbcPassword=${NEOVIEW_PASSWORD};Catalog=${MONDRIAN_DIR}/demo/FoodMart.xml;JdbcDrivers=${jdbcDrivers};RoleXX='California manager';" ) >> megatest.properties ;; oracle) ( #export ORACLE_HOME=G:/oracle/product/10.1.0/Db_1 driver="$(chooseOracleDriver $jdk)" if [ ! -f "$driver" ]; then echo "Oracle JDBC driver not found" exit 1 fi jdbcURL=jdbc:oracle:thin:foodmart/foodmart@//$(uname -n):1521/XE jdbcDrivers=oracle.jdbc.OracleDriver echo driver.classpath=${driver} echo mondrian.foodmart.jdbcURL=${jdbcURL} echo mondrian.jdbcDrivers=${jdbcDrivers} echo mondrian.foodmart.jdbcUser=foodmart echo mondrian.foodmart.jdbcPassword=foodmart echo "mondrian.test.connectString=Provider=mondrian;Jdbc=${jdbcURL};JdbcUser=foodmart;JdbcPassword=foodmart;Catalog=${MONDRIAN_DIR}/demo/FoodMart.xml;JdbcDrivers=${jdbcDrivers};RoleXX='California manager';" ) >> megatest.properties ;; derby) ( jdbcDrivers=org.apache.derby.jdbc.EmbeddedDriver jdbcURL=jdbc:derby:${MONDRIAN_DIR}/demo/derby/foodmart # jdbcURL=jdbc:derby:jar:\(demo/derby/derby-foodmart.zip\)/foodmart echo mondrian.foodmart.jdbcURL=${jdbcURL} echo mondrian.jdbcDrivers=${jdbcDrivers} echo driver.classpath=${MONDRIAN_DIR}/testlib/derby.jar echo "mondrian.test.connectString=Provider=mondrian;Jdbc=${jdbcURL};JdbcUser=sa;JdbcPassword=sa;PoolNeeded=false;Catalog=${MONDRIAN_DIR}/demo/FoodMart.xml;JdbcDrivers=${jdbcDrivers};RoleXX='California manager';" ) >> megatest.properties ;; mysql) ( jdbcDrivers=com.mysql.jdbc.Driver export jdbcURL='jdbc:mysql://localhost/foodmart?user=foodmart&password=foodmart&characterEncoding=latin1' echo mondrian.foodmart.jdbcURL=${jdbcURL} echo mondrian.jdbcDrivers=${jdbcDrivers} echo driver.classpath=/usr/local/mysql-connector-java-3.1.12/mysql-connector-java-3.1.12-bin.jar echo "mondrian.test.connectString=Provider=mondrian;Jdbc=${jdbcURL};JdbcUser=foodmart;JdbcPassword=foodmart;Catalog=${MONDRIAN_DIR}/demo/FoodMart.xml;JdbcDrivers=${jdbcDrivers};RoleXX='California manager';" ) >> megatest.properties ;; postgresql) ( jdbcDrivers=org.postgresql.Driver export jdbcURL='jdbc:postgresql://localhost/foodmart?user=foodmart&password=foodmart' echo mondrian.foodmart.jdbcURL=${jdbcURL} echo mondrian.jdbcDrivers=${jdbcDrivers} echo driver.classpath=/usr/share/java/postgresql.jar echo "mondrian.test.connectString=Provider=mondrian;Jdbc=${jdbcURL};JdbcUser=foodmart;JdbcPassword=foodmart;Catalog=${OPEN_DIR}/mondrian/demo/FoodMart.xml;JdbcDrivers=${jdbcDrivers};RoleXX='California manager';" ) >> megatest.properties ;; teradata) ( jdbcDrivers=com.ncr.teradata.TeraDriver export jdbcURL='jdbc:teradata://localhost/foodmart' echo mondrian.foodmart.jdbcURL=${jdbcURL} echo mondrian.jdbcDrivers=${jdbcDrivers} echo "driver.classpath=${MONDRIAN_DIR}/drivers/terajdbc4.jar${PS}${MONDRIAN_DIR}/drivers/tdgssjava.jar${PS}${MONDRIAN_DIR}/drivers/tdgssconfig.jar" echo "mondrian.test.connectString=Provider=mondrian;Jdbc=${jdbcURL};JdbcUser=tduser;JdbcPassword=tduser;Catalog=${MONDRIAN_DIR}/demo/FoodMart.xml;JdbcDrivers=${jdbcDrivers};RoleXX='California manager';" ) >> megatest.properties ;; *) echo "Unknown database $database"; exit 1 ;; esac shift shift if [ "$1" = -server ]; then shift fi props= for i in $*; do echo "$i" >> megatest.properties props="$props $i" case "$i" in mondrian.test.ExpDependencies=*) # Expression dependencies requires greater eval depth than the default 3. echo "mondrian.rolap.evaluate.MaxEvalDepth=6" >> megatest.properties props="$props mondrian.rolap.evaluate.MaxEvalDepth=6" ;; esac done cat megatest.properties >> test.properties cat megatest.properties >> mondrian.properties case $jdk in (jdk1.4) retroweave=true ;; esac echo echo "========================================" date echo "Running test with JDK=$jdk retroweave=$retroweave database=$database props={$props}" if [ "$build" ]; then echo build=${build} if [ "$retroweave" ]; then case $jdk in jdk1.4) # Cannot build or retroweave under 1.4, so switch JDK briefly ( export JAVA_HOME=$(chooseJavaHome jdk1.5) export PATH="$JAVA_HOME/bin:$PATH" export ANT_HOME=$(chooseAntHome jdk1.5) $ANT_HOME/bin/ant $ANT_FLAGS ${CLEAN} all retroweave ) export JAVA_HOME=$(chooseJavaHome jdk1.4) export PATH=$JAVA_HOME/bin:$PATH ;; *) $ANT_HOME/bin/ant $ANT_FLAGS ${CLEAN} all retroweave ;; esac if [ "$mondrian" ]; then $ANT_HOME/bin/ant $ANT_FLAGS -Dmondrian.retroweave=true test-nobuild fi else export ANT_HOME=$(chooseAntHome $jdk) if [ "$mondrian" ]; then TEST_TARGET=test-nobuild else TEST_TARGET= fi case $database in (derby|access) $ANT_HOME/bin/ant $ANT_FLAGS ${CLEAN} compile compile.tests unzip-databases ${TEST_TARGET} ;; (*) $ANT_HOME/bin/ant $ANT_FLAGS ${CLEAN} compile compile.tests ${TEST_TARGET} ;; esac fi fi if [ "$olap4j" ]; then (olap4j $jdk mondrian NONE) (olap4j $jdk xmla NONE) (olap4j $jdk mondrian DBCP) (olap4j $jdk xmla DBCP) fi } # Echoes a value for ANT_HOME consistent with the JDK. # JDK 1.4 can't run modern versions of ant (because junit requires annotations) # but retroweaver cannot run on old versions of ant. chooseAntHome() { jdk=$1 case $jdk in jdk1.4) case $(uname -o) in Cygwin) echo $(cd ${OPEN_DIR}/thirdparty/ant; pwd) ;; *) echo $(cd /usr/local/apache-ant-1.6.0; pwd) esac ;; jdk1.5|jdk1.6|jdk1.7|openjdk1.6|openjdk1.7|ibmjdk1.6) case $(uname -n) in (plank.disruptivetech.com) echo /home/jhyde/open/thirdparty/ant;; *) echo $(cd ${OPEN_DIR}/thirdparty/ant; pwd);; esac ;; esac } # Returns the path of a JAVA_HOME for a given JDK version. chooseJavaHome() { jdk=$1 case ${hostname} in (mackerel) case $jdk in (jdk1.4) echo /c/j2sdk1.4.2_16 ;; (jdk1.5) echo /c/jdk1.5.0_14 ;; (jdk1.6) echo /c/jdk1.6.0_11 ;; (*) echo "Unknown java version $jdk"; exit 1 ;; esac;; (branston) case $jdk in (jdk1.5) echo /e/jdk1.5.0_08 ;; (jdk1.6) echo /c/jdk1.6.0_01 ;; (*) echo "Unknown java version $jdk"; exit 1 ;; esac;; (mackerel-winxp) case $jdk in (jdk1.4) echo /e/j2sdk1.4.2_16 ;; (jdk1.5) echo /e/jdk1.5.0_14 ;; (jdk1.6) echo /e/jdk1.6.0_06 ;; (*) echo "Unknown java version $jdk"; exit 1 ;; esac;; (*) if [ -d /usr/lib/jvm/$jdk ]; then echo /usr/lib/jvm/$jdk elif [ -d /usr/local/$jdk ]; then echo /usr/local/$jdk else echo "Unknown java version $jdk" exit 1 fi esac } # Returns a path of an Oracle JDBC driver for a given JDK. # E.g. "/u01/app/oracle/product/11.2.0/jdbc/lib/ojdbc6.jar" chooseOracleDriver() { for b in "$ORACLE_HOME/jdbc/lib" testlib; do case "$jdk" in (jdk1.6|openjdk1.6|ibmjdk1.6) files="ojdbc6.jar ojdbc5.jar ojdbc14.jar";; (jdk1.5) files="ojdbc5.jar ojdbc14.jar";; (jdk1.4|*) files="ojdbc14.jar";; esac for f in $files; do if [ -f "$b/$f" ]; then echo "$b/$f" return fi done done } olap4j() { jdk=$1 driver=$2 wrapper=$3 echo echo "========================================" date echo "Running olap4j test with JDK=$jdk driver=$driver wrapper=$wrapper" CONNECT_STRING=$( awk ' /^mondrian.test.connectString=/ { print substr($0, length("mondrian.test.connectString=Provider=mondrian;") + 1) } ' megatest.properties) DRIVER_CLASSPATH=$( awk ' /^driver.classpath=/ { print substr($0, length("driver.classpath=") + 1) } ' megatest.properties) cd ../olap4j case $(uname) in (Cygwin*) FILE_PREFIX=file:/ ;; (*) FILE_PREFIX=file: ;; esac export ANT_HOME=$(chooseAntHome $jdk) $ANT_HOME/bin/ant clean case $driver in (mondrian) echo "org.olap4j.test.connectUrl=jdbc:mondrian:${CONNECT_STRING}" echo 'org.olap4j.test.helperClassName=org.olap4j.MondrianTester' echo "org.olap4j.test.driverClasspath=${DRIVER_CLASSPATH}" echo "org.olap4j.test.wrapper=${wrapper}" ;; (xmla) echo "org.olap4j.test.connectUrl=jdbc:mondrian:${CONNECT_STRING}" echo 'org.olap4j.test.helperClassName=org.olap4j.XmlaTester' echo "org.olap4j.XmlaTester.CatalogUrl=${FILE_PREFIX}${MONDRIAN_DIR}/demo/FoodMart.xml" echo "org.olap4j.test.driverClasspath=${DRIVER_CLASSPATH}" echo "org.olap4j.test.wrapper=${wrapper}" ;; esac > test.properties case $jdk in (jdk1.4) # Cannot build or retroweave under 1.4, so switch JDK briefly ( export JAVA_HOME=$(chooseJavaHome jdk1.5) export PATH="$JAVA_HOME/bin:$PATH" export ANT_HOME=$(chooseAntHome jdk1.5) $ANT_HOME/bin/ant $ANT_FLAGS all retroweave ) export JAVA_HOME=$(chooseJavaHome jdk1.4) export PATH=$JAVA_HOME/bin:$PATH $ANT_HOME/bin/ant test-nobuild ;; (*) $ANT_HOME/bin/ant $ANT_FLAGS test ;; esac # Javadoc only runs clean under jdk16 or jdk17, because it depends # on JDBC 4.0 or later. case "$jdk" in (jdk1.6|openjdk1.6|jdk1.7|openjdk1.7|ibmjdk1.6) ant javadoc ;; esac } doLotsOfTests() { for agg in true false; do for vusers in 1 5; do for jdk in $jdkList; do for database in $databaseList; do for groupingSets in true false; do if [ "$nightly" -a $vusers -gt 1 ]; then continue fi # It's a waste of effort to run with grouping sets both true and # false if db does not support it. if [ "$groupingSets" = false ] ; then case "$database" in (access|mysql|derby) continue;; esac fi doTest $jdk $database \ mondrian.test.VUsers=$vusers \ mondrian.rolap.groupingsets.enable=$agg \ mondrian.rolap.aggregates.Use=$agg \ mondrian.rolap.aggregates.Read=$agg done done done done done } doExoticTests() { # Test exp dependencies doTest jdk1.5 oracle \ mondrian.test.ExpDependencies=10 \ mondrian.test.random.seed=-1 \ mondrian.expCache.enable=false rand=$(echo x|awk '{print int(rand() * 65536)}') doTest jdk1.5 oracle \ mondrian.test.ExpDependencies=100 \ mondrian.test.random.seed=${rand} \ mondrian.expCache.enable=false # Test with exp cache disabled doTest jdk1.5 oracle mondrian.expCache.enable=false # Test with aggs enabled doTest jdk1.5 oracle \ mondrian.rolap.aggregates.Use=true \ mondrian.rolap.aggregates.Read=true # Test with aggregate cache disabled doTest jdk1.6 oracle mondrian.rolap.star.disableCaching=true # Test case-insensitive doTest jdk1.6 oracle mondrian.olap.case.sensitive=false # Test with cache of RolapCubeMembers disabled. doTest jdk1.6 oracle mondrian.rolap.EnableRolapCubeMemberCache=false # Retroweave against jdk1.5 and jdk1.6 doTest --retroweave jdk1.5 oracle doTest --retroweave jdk1.6 oracle # Configurations which have surfaced bugs echo "This test caused a bug" doTest jdk1.6 mysql \ mondrian.native.crossjoin.enable=false \ mondrian.native.topcount.enable=false \ mondrian.xmla.drillthroughTotalCount.enable=false \ mondrian.rolap.LargeDimensionThreshold=1 echo "This test caused a bug with testDescendantsXxx" doTest jdk1.6 oracle \ mondrian.rolap.aggregates.Use=true \ mondrian.rolap.aggregates.Read=true \ mondrian.rolap.aggregates.ChooseByVolume=true \ mondrian.rolap.star.disableCaching=true \ mondrian.native.filter.enable=false \ mondrian.native.nonempty.enable=false \ mondrian.xmla.drillthroughTotalCount.enable=false \ mondrian.olap.fun.crossjoin.optimizer.size=0 \ mondrian.rolap.groupingsets.enable=true echo "This test caused a bug in testNativeSetCaching" doTest jdk1.6 oracle \ mondrian.test.ExpDependencies=10 \ mondrian.native.crossjoin.enable=false echo "This test caused a bug" doTest jdk1.6 oracle \ mondrian.rolap.aggregates.Use=true \ mondrian.rolap.aggregates.Read=true \ mondrian.olap.case.sensitive=false \ mondrian.test.ExpDependencies=10 \ mondrian.xmla.drillthroughTotalCount.enable=false \ mondrian.expCache.enable=false \ mondrian.rolap.SparseSegmentValueThreshold=25000 # Caused bug in testFlush echo "This test caused a bug in testFlush" doTest jdk1.4 mysql \ mondrian.test.ExpDependencies=10 \ mondrian.native.crossjoin.enable=false \ mondrian.xmla.drillthroughTotalCount.enable=false \ mondrian.rolap.LargeDimensionThreshold=1000 \ mondrian.rolap.SparseSegmentValueThreshold=10 echo "This test took more than 3 cycles to load aggs in FunctionTest.testComplexOrExpr" doTest jdk1.5 oracle \ mondrian.rolap.aggregates.Use=true \ mondrian.rolap.aggregates.Read=true \ mondrian.rolap.aggregates.ChooseByVolume=true \ mondrian.rolap.star.disableCaching=true \ mondrian.olap.case.sensitive=false \ mondrian.test.ExpDependencies=10 \ mondrian.rolap.SparseSegmentValueThreshold=25000 # Caused bug in testFlush echo "This test caused a bug in testFlush" doTest jdk1.6 derby \ mondrian.native.crossjoin.enable=false \ mondrian.native.topcount.enable=false \ mondrian.native.nonempty.enable=false \ mondrian.xmla.drillthroughTotalCount.enable=false # Caused lots of out of memory errors towards the end of the test echo "This caused out of memory errors" doTest --retroweave jdk1.5 oracle \ mondrian.rolap.aggregates.Use=true \ mondrian.rolap.aggregates.Read=true \ mondrian.olap.case.sensitive=false \ mondrian.test.ExpDependencies=10 \ mondrian.rolap.evaluate.MaxEvalDepth=6 \ mondrian.rolap.star.disableCaching=true \ mondrian.native.topcount.enable=false \ mondrian.native.filter.enable=false \ mondrian.native.nonempty.enable=false \ mondrian.xmla.drillthroughTotalCount.enable=false \ mondrian.rolap.LargeDimensionThreshold=25000 echo "Test support for high-cardinality dimensions" doTest jdk1.6 oracle \ mondrian.result.limit=100000 \ mondrian.result.highCardChunkSize=30 } # Returns one of its arguments with equal probability chooseOne() { echo "$@" | awk ' { srand(); r = int(rand() * NF) + 1; print $r; }' sleep 1s } # Prints "true" with a given probability, else "". # For example, "maybe 0.2" prints "true" 20% of the time. maybe() { echo | awk '{srand(); r = rand(); if (0) print "r=" r ", p=" p; if (r < p) print "true"; else print "";}' p=$1 sleep 1s } doRandom() { args= jdk="$(chooseOne jdk1.4 jdk1.5 jdk1.6)" args="$args $jdk" # 20% of the time, run jdk1.5 and jdk1.6 against retrowoven code. jdk1.4 # is always retrowoven. case $jdk in (jdk1.5|jdk1.6) if [ "$(maybe 0.8 --retroweave)" ]; then args="--retroweave $args" fi ;; esac args="$args $(chooseOne ${databaseList})" # Run JVM in server mode if [ "$(maybe 0.3)" ]; then args="$args -server" fi # Test with aggs enabled, and further, choose agg tables by their number of data volume. if [ "$(maybe 0.5)" ]; then args="$args mondrian.rolap.aggregates.Use=true mondrian.rolap.aggregates.Read=true" if [ "$(maybe 0.5)" ]; then args="$args mondrian.rolap.aggregates.ChooseByVolume=true" fi fi # Disable aggregate cache (not with derby - too slow) if [ $database != derby -a \ "$(maybe 0.5)" ]; then args="$args mondrian.rolap.star.disableCaching=true" fi # Test case-insensitive if [ "$(maybe 0.3)" ]; then args="$args mondrian.olap.case.sensitive=false" fi # Test expression dependencies. if [ "$(maybe 0.5)" ]; then args="$args mondrian.test.ExpDependencies=10" fi # Test with aggregate cache disabled if [ "$(maybe 0.5)" ]; then args="$args mondrian.rolap.star.disableCaching=true" fi # Test with RolapCubeMember cache disabled if [ "$(maybe 0.3)" ]; then args="$args mondrian.rolap.EnableRolapCubeMemberCache=false" fi if [ $(maybe 0.5) ]; then # Test with pushdown of NON-EMPTY to SQL disabled if [ "$(maybe 0.7)" ]; then args="$args mondrian.native.crossjoin.enable=false" fi # Test with pushdown of TOPCOUNT to SQL disabled if [ "$(maybe 0.7)" ]; then args="$args mondrian.native.topcount.enable=false" fi # Test with pushdown of FILTER to SQL disabled if [ "$(maybe 0.7)" ]; then args="$args mondrian.native.filter.enable=false" fi # Test with pushdown of Member.Children etc. to SQL disabled if [ "$(maybe 0.7)" ]; then args="$args mondrian.native.nonempty.enable=false" fi fi if [ "$(maybe 0.4)" ]; then args="$args mondrian.xmla.drillthroughTotalCount.enable=false" fi # Test with expression result cache disabled if [ "$(maybe 0.5)" ]; then args="$args mondrian.expCache.enable=false" fi # Change the threshold for large dimensions from its default value 100. if [ "$(maybe 0.4)" ]; then args="$args mondrian.rolap.LargeDimensionThreshold=$(chooseOne 1 777 25000)" fi # Change the threshold for large dimensions from its default value 1000. if [ "$(maybe 0.5)" ]; then args="$args mondrian.rolap.SparseSegmentValueThreshold=$(chooseOne 10 25000)" fi # Change the size at which crossjoins are optimized. if [ "$(maybe 0.5)" ]; then args="$args mondrian.olap.fun.crossjoin.optimizer.size=$(chooseOne 0 10 10000)" fi # Enable GROUPING SETS clause. if [ "$(maybe 0.5)" ]; then args="$args mondrian.rolap.groupingsets.enable=true" fi # Different representation of null. if [ "$(maybe 0.2)" ]; then args="$args mondrian.olap.NullMemberRepresentation=TheNullMember" fi # Test support for high-cardinality dimensions. if [ "$(maybe 0.3)" ]; then args="$args mondrian.result.highCardChunkSize=30" fi doTest $args } doQuick() { doTest jdk1.7 mysql } # Runs the tests that are believed to be working. doWorking() { doTest jdk1.6 oracle ${ENABLE_NATIVE} ${DISABLE_AGGS} ${DISABLE_SSAS} doTest jdk1.6 oracle ${ENABLE_NATIVE} ${DISABLE_AGGS} ${ENABLE_SSAS} doTest jdk1.6 oracle ${ENABLE_NATIVE} ${ENABLE_AGGS} ${ENABLE_SSAS} doTest jdk1.6 mysql ${ENABLE_NATIVE} ${ENABLE_AGGS} ${DISABLE_SSAS} doTest jdk1.6 mysql ${ENABLE_NATIVE} ${DISABLE_AGGS} ${DISABLE_SSAS} doTest jdk1.6 mysql ${ENABLE_NATIVE} ${DISABLE_AGGS} ${DISABLE_SSAS} ${ENABLE_CMCACHE} doTest jdk1.6 mysql ${ENABLE_NATIVE} ${DISABLE_AGGS} ${ENABLE_SSAS} doTest jdk1.6 derby ${ENABLE_NATIVE} ${ENABLE_AGGS} ${DISABLE_SSAS} doTest jdk1.6 derby ${ENABLE_NATIVE} ${DISABLE_AGGS} ${DISABLE_SSAS} doTest jdk1.5 oracle ${ENABLE_NATIVE} ${DISABLE_AGGS} ${DISABLE_SSAS} doTest jdk1.4 oracle ${ENABLE_NATIVE} ${DISABLE_AGGS} ${DISABLE_SSAS} # not necessarily working doTest jdk1.6 oracle ${ENABLE_NATIVE} ${ENABLE_AGGS} doTest jdk1.6 oracle ${ENABLE_NATIVE} ${ENABLE_AGGS} ${ENABLE_GSETS} } doAllTests() { # With olap4j doTest --olap4j jdk1.6 oracle doTest --olap4j jdk1.5 oracle doTest --olap4j jdk1.5 access doTest jdk1.6 teradata mondrian.test.VUsers=1 doTest jdk1.5 teradata mondrian.test.VUsers=1 mondrian.rolap.groupingsets.enable=true doTest jdk1.4 teradata mondrian.test.VUsers=1 doTest --olap4j jdk1.6 postgresql # Basic doTest jdk1.5 derby mondrian.test.VUsers=1 doTest jdk1.4 mysql mondrian.test.VUsers=1 mondrian.rolap.aggregates.Use=true mondrian.rolap.aggregates.Read=true doTest jdk1.5 mysql mondrian.test.VUsers=1 mondrian.rolap.aggregates.Use=true mondrian.rolap.aggregates.Read=true doTest jdk1.4 oracle mondrian.test.VUsers=1 doTest jdk1.5 oracle mondrian.test.VUsers=1 doTest jdk1.6 oracle mondrian.test.VUsers=1 doTest jdk1.5 oracle mondrian.test.ExpDependencies=10 mondrian.test.random.seed=-1 mondrian.expCache.enable=false #mondrian.test.Name=mondrian.test.ParentChildHierarchyTest doTest jdk1.5 access mondrian.olap.NullMemberRepresentation= mondrian.test.Class=mondrian.olap.NullMemberRepresentationTest doTest jdk1.5 access mondrian.olap.NullMemberRepresentation=\(null\) mondrian.test.Class=mondrian.olap.NullMemberRepresentationTest doTest jdk1.5 access mondrian.olap.NullMemberRepresentation=~Missing mondrian.test.Class=mondrian.olap.NullMemberRepresentationTest doTest jdk1.5 access mondrian.test.Class=mondrian.rolap.FastBatchingCellReaderTest doTest jdk1.5 derby mondrian.test.Class=mondrian.rolap.FastBatchingCellReaderTest doTest jdk1.5 mysql mondrian.test.Class=mondrian.rolap.FastBatchingCellReaderTest # mondrian.test.Class=mondrian.test.BasicQueryTest # mondrian.test.Name=testQueryTimeout # Same again, with aggs doTest jdk1.5 oracle mondrian.rolap.aggregates.Use=true mondrian.rolap.aggregates.Read=true # Same again, non case-sensititive doTest jdk1.5 oracle mondrian.olap.case.sensitive=false # Do some tests with random configurations echo ::: do 3 random tests ::: for ((k=0; k < 3; k++)) do doRandom done doExoticTests # On a Wednesday, do exhaustive tests. if [ $(date +%w) = 3 ]; then doLotsOfTests fi } doTests() { if [ "$quick" ]; then doQuick elif [ "$working" ]; then doWorking elif [ "$random" ]; then doRandom else doAllTests fi } checkJavadoc() { export JAVA_HOME=$(chooseJavaHome jdk1.6) export ANT_HOME=$(chooseAntHome jdk1.6) $ANT_HOME/bin/ant -emacs javadoc-strict 2>&1 > ant-javadoc.log cat ant-javadoc.log | grep -e ':[0-9]*: warning' - | grep -v -F -f ant-javadoc-expected.log - } usage() { echo "megatest [--help] [--nightly] [--nobuild] [--quick | --working | --random]" echo "Options:" echo " --help Print this help" echo " --nightly Run as a nightly batch job, with an error summary" echo " --nobuild Do not compile code before running the test" echo " --quick Only run one test" echo " --working Run the set of tests known to be working 100%" echo " --random Run a test with a random set of parameters" } nightly= quick= working= random= build=true while [ $# -gt 0 ]; do case "$1" in (--help) usage exit 0 ;; (--nightly) nightly=true shift ;; (--quick) quick=true shift ;; (--working) working=true shift ;; (--random) random=true shift ;; (--nobuild) build= shift ;; (*) break ;; esac done if [ "$nightly" ]; then # We're probably called from a cron job. Set up environment. cd ${OPEN_DIR} . ./env cd mondrian # Sync latest. p4 get ... p4 resolve -am # Check formatting if [ -d ../util ]; then p4 get ../util/... find . -type f ! -name \*.cup | xargs ../util/bin/checkFile fi # If olap4j exists, sync it if [ -d ../olap4j ]; then ( cd ../olap4j svn up ) fi fi main() { cd "${MONDRIAN_DIR}" if [ "$nightly" ]; then # If a cron job, run the whole suite before emitting any output. buildId="$(uname -n)-$(date +%Y%m%d)-change$(p4 counter change)" doTests >megatest.log 2>&1 echo echo "Build $buildId" echo http://www.hydromatic.net/buildlogs/mondrian-${buildId}.log.bz2 echo echo ::: Summary ::::::::::::::::::::::::::::::::::::: echo Tests completed at $(date). egrep 'Running test|OK|Tests run| [0-9]*\) ' ./megatest.log if egrep 'FAILURE|BUILD FAILED|Failures: [^0]|Errors: [^0]' megatest.log; then echo There were failures. else echo Test succeeded. fi echo echo ::: check javadoc ::::::::::::::::::::::::::::::: checkJavadoc echo echo ::: megatest.log ::::::::::::::::::::::::::::::::: # Limit to 1MB what we show in email. 10MB is gmail's limit. head --bytes=1000000 megatest.log cp megatest.log /home/jhyde/web/buildlogs/mondrian-${buildId}.log bzip2 --best /home/jhyde/web/buildlogs/mondrian-${buildId}.log else doTests 2>&1 | tee megatest.log fi } case $(uname) in CYGWIN*) main | dos2unix ;; *) main ;; esac # End megatest mondrian-3.11.0.1-R/bin/run.sh000077500000000000000000000025701261646570300156720ustar00rootroot00000000000000#!/bin/bash # do not use ksh, use bash ##################################################################### # # runcmd.sh # # Must set location of the cmdrunner.jar # # $Id$ ##################################################################### declare -r DIR=$(dirname $0) LOCATION="$PWD/$DIR" MONDRIAN_HOME="$LOCATION/.." MONDRIAN_LIB="$MONDRIAN_HOME/lib" MONDRIAN_TEST_LIB="$MONDRIAN_HOME/testlib" CLASSPATH="$MONDRIAN_LIB/mondrian.jar" CLASSPATH="$CLASSPATH:$MONDRIAN_LIB/commons-dbcp.jar" CLASSPATH="$CLASSPATH:$MONDRIAN_LIB/commons-collections.jar" CLASSPATH="$CLASSPATH:$MONDRIAN_LIB/commons-pool.jar" CLASSPATH="$CLASSPATH:$MONDRIAN_LIB/eigenbase-resgen.jar" CLASSPATH="$CLASSPATH:$MONDRIAN_LIB/eigenbase-xom.jar" CLASSPATH="$CLASSPATH:$MONDRIAN_LIB/javacup.jar" CLASSPATH="$CLASSPATH:$MONDRIAN_LIB/log4j.jar" CLASSPATH="$CLASSPATH:$MONDRIAN_LIB/servlet-api.jar" CLASSPATH="$CLASSPATH:$MONDRIAN_LIB/eigenbase-properties.jar" CLASSPATH="$CLASSPATH:$MONDRIAN_LIB/commons-math.jar" CLASSPATH="$CLASSPATH:$MONDRIAN_LIB/commons-vfs.jar" CLASSPATH="$CLASSPATH:$MONDRIAN_LIB/commons-logging.jar" CLASSPATH="$CLASSPATH:$MONDRIAN_LIB/derby.jar" # now pick up jdbc jars for j in $MONDRIAN_TEST_LIB/*.jar do CLASSPATH="$CLASSPATH:$j" done export CLASSPATH MAIN=mondrian.tui.CmdRunner java \ -Dlog4j.configuration=file://$MONDRIAN_HOME/log4j.properties \ -cp $CLASSPATH $MAIN "$@" mondrian-3.11.0.1-R/bin/runtest.sh000077500000000000000000000041551261646570300165730ustar00rootroot00000000000000#!/bin/bash declare -r DIR=$(dirname $0) LOCATION="$PWD/$DIR" MONDRIAN_HOME="$LOCATION/.." MONDRIAN_LIB="$MONDRIAN_HOME/lib" MONDRIAN_TEST_LIB="$MONDRIAN_HOME/testlib" CLASSPATH=$MONDRIAN_LIB/mondrian.jar CLASSPATH=$CLASSPATH:$MONDRIAN_LIB/log4j-1.2.9.jar CLASSPATH=$CLASSPATH:$MONDRIAN_LIB/eigenbase-xom.jar CLASSPATH=$CLASSPATH:$MONDRIAN_LIB/eigenbase-resgen.jar CLASSPATH=$CLASSPATH:$MONDRIAN_LIB/eigenbase-properties.jar CLASSPATH=$CLASSPATH:$MONDRIAN_LIB/javacup.jar CLASSPATH=$CLASSPATH:$MONDRIAN_LIB/commons-dbcp.jar CLASSPATH=$CLASSPATH:$MONDRIAN_LIB/commons-collections.jar CLASSPATH=$CLASSPATH:$MONDRIAN_LIB/commons-pool.jar CLASSPATH=$CLASSPATH:$MONDRIAN_LIB/commons-math-1.0.jar CLASSPATH=$CLASSPATH:$MONDRIAN_LIB/commons-vfs.jar CLASSPATH="$CLASSPATH:$MONDRIAN_LIB/commons-logging.jar" CLASSPATH=$CLASSPATH:$MONDRIAN_TEST_LIB/mysql-connector-java-3.1.7-bin.jar CLASSPATH=$CLASSPATH:$MONDRIAN_TEST_LIB/ojdbc14.jar CLASSPATH=$CLASSPATH:$MONDRIAN_TEST_LIB/junit.jar CLASSPATH=$CLASSPATH:$MONDRIAN_TEST_LIB/derby.jar CLASSPATH="$CLASSPATH:$MONDRIAN_HOME/testclasses" export CLASSPATH CATALOG_URL="file://localhost${MONDRIAN_HOME}/demo/FoodMart.xml" # oracle #JDBC_DRIVER=oracle.jdbc.OracleDriver #JDBC_URL=jdbc:oracle:thin:foodmart/foodmart@EDGEPSW01:1521:pstest # mysql JDBC_DRIVER=com.mysql.jdbc.Driver JDBC_URL="jdbc:mysql://localhost/foodmart?user=foodmart&password=foodmart" # Derby #JDBC_DRIVER=org.apache.derby.jdbc.EmbeddedDriver #JDBC_URL="jdbc:derby:demo/derby/foodmart;JdbcUser=sa;JdbcPassword=sa" P="-Dmondrian.jdbcDrivers=$JDBC_DRIVER" P="$P -Dmondrian.foodmart.jdbcURL=$JDBC_URL" # P="$P -Dmondrian.test.foodmart.catalogURL=$CATALOG_URL" P="$P -Dmondrian.foodmart.catalogURL=$CATALOG_URL" P="$P -Dmondrian.test.connectString=Provider=mondrian;Jdbc='$JDBC_URL';Catalog='$CATALOG_URL'" P="$P -Dlog4j.configuration=file://localhost${MONDRIAN_HOME}/log4j.properties" JAVA=$( which java ) if [[ -n "$JAVA_HOME" ]]; then JAVA="$JAVA_HOME"/bin/java fi if [[ ! -e $JAVA ]]; then echo "java executable $JAVA not found" exit 1 fi MAIN_CLASS=mondrian.test.SimpleTestRunner $JAVA -cp $CLASSPATH $P $MAIN_CLASS $@ mondrian-3.11.0.1-R/build.properties000066400000000000000000000027241261646570300171750ustar00rootroot00000000000000# This software is subject to the terms of the Eclipse Public License v1.0 # Agreement, available at the following URL: # http://www.eclipse.org/legal/epl-v10.html. # You must accept the terms of that agreement to use this software. # # Copyright (C) 2002-2005 Julian Hyde # Copyright (C) 2005-2012 Pentaho and others # All Rights Reserved. # # Modify this file to override build settings. It is read by ant's build.xml. Name=Mondrian name=mondrian vendor=Pentaho project.revision=3.11.0.1-356 project.revision.major=3 project.revision.minor=1101356 ivy.artifact.id=mondrian ivy.artifact.group=pentaho impl.title=mondrian driver.name=Mondrian olap4j driver driver.version=3.11.0.1-356 driver.version.major=3 driver.version.minor=1101356 #dependency for olap4j dependency.olap4j-core.revision=1.2.0 dependency.olap4j-xmla.revision=1.2.0 dependency.olap4j-tck.revision=1.0.1.539 #dependency properties: used during resolve step of workbench build dependency.kettle.revision=6.0.0.1-356 dependency.guava.revision=17.0 dependency.pentaho-xul.revision=6.0.0.1-356 dependency.schemaworkbench-plugins.revision=3.11.0.1-356 dependency.pdi-dataservice-client-plugin.revision=6.0.0.1-356 dependency.pentaho-launcher.revision=6.0.0.1-356 dependency.oss-licenses.revision=6.0.0.1-356 # Uncomment to use yDoc doclet for enhanced javadoc (requires commercial # license). #ydoc.home=/usr/local/ydoc-3.0-jdk1.5 # Uncomment to skip the test suite run. # mondrian.tests.skip=true publish.generatePom=true mondrian-3.11.0.1-R/build.xml000066400000000000000000001406521261646570300156040ustar00rootroot00000000000000 You must specify a specific project target when using the ANT build. Targets are one of the following: - help This is the help. - info Shows configuration info. - binzip Compiles Mondrian and wraps everything in a neat little package, including documentation. - workbench-dist Compiles PSW and wraps everything in a neat little package. - jar Creates a Mondrian jar. - workbench Creates Mondrian and workbench jars. - clean Deletes build output. - clean-deep Clean build output and generated sources. - javadoc Create the API documentation. - test Runs the tests. Requires FoodMart to be installed. (see below) - jacoco Runs the tests with jacoco to measure coverage. Requires FoodMart to be installed. (see below) -load-foodmart Will load the test DB FoodMart using the JDBC parameters specified. (see below) To run the tests, you must have FoodMart available in a database. You can pass the DB configuration through the command line arguments, like so: ant -Dmondrian.foodmart.jdbcURL="jdbc:mysql://localhost/foodmart" \ -Dmondrian.foodmart.jdbcUser=foodmart \ -Dmondrian.foodmart.jdbcPassword=foodmart \ -Dmondrian.jdbcDrivers=com.mysql.jdbc.Driver \ -Ddriver.classpath="/opt/mysql-connector-java-5.1.25-bin.jar" test Alternatively, these can be written to a file at the root of the project. Create a file 'mondrian.properties' containing this: mondrian.foodmart.jdbcURL=jdbc:mysql://localhost/foodmart mondrian.foodmart.jdbcUser=foodmart mondrian.foodmart.jdbcPassword=foodmart mondrian.jdbcDrivers=com.mysql.jdbc.Driver driver.classpath=/opt/mysql-connector-java-5.1.25-bin.jar To load foodmart into your DB, you can call the 'load-foodmart' target before 'test'. The parameters can be adjusted to point to a different DB than MySQL. ============================================================== | Mondrian configuration info | ============================================================== project.location = ${project.location} jdk.home = ${env.JAVA_HOME} log4j.configuration = ${log4j.configuration} mondrian.foodmart.catalogURL = ${mondrian.foodmart.catalogURL} mondrian.foodmart.jdbcURL = ${mondrian.foodmart.jdbcURL} mondrian.jdbcDrivers = ${mondrian.jdbcDrivers} driver.classpath (additions) = ${driver.classpath} ============================================================== Compiling on JVM Version: ${java.runtime.version} include.gui=${include.gui} The target 'junit-main' was replaced by 'test'. Please call this one instead. Title: ${name} Version: ${project.revision} VersionMajor: ${project.revision.major} VersionMinor: ${project.revision.minor} Vendor: ${vendor} /* * Project version information. Generated - do not modify. */ package mondrian.olap4j; /** * Version information for the Mondrian olap4j driver. (Generated.) */ class MondrianOlap4jDriverVersion { static final String NAME = "${driver.name}"; static final String VERSION = "${driver.version}"; static final int MAJOR_VERSION = ${driver.version.major}; static final int MINOR_VERSION = ${driver.version.minor}; } // End MondrianOlap4jDriverVersion.java /* * Project version information. Generated - do not modify. */ package mondrian.server; /** * Version information for Mondrian. (Generated by build) */ class MondrianServerVersion { static final String VENDOR = "${vendor}"; static final String NAME = "${name}"; static final String VERSION = "${project.revision}"; static final int MAJOR_VERSION = ${project.revision.major}; static final int MINOR_VERSION = ${project.revision.minor}; static final String COPYRIGHT_YEAR = "${copyright.year}"; } // End MondrianServerVersion.java
pentaho-eula-assembly-pom.version not set, assuming default of ${pentaho-eula-assembly-pom.version} artifactName not set, assuming default of ${artifactName} mvn -f dist/pentaho-eula-assembly-pom-${pentaho-eula-assembly-pom.version}-pom.xml -DartifactName=${artifactName} -Ddist.dir= package
mondrian-3.11.0.1-R/demo/000077500000000000000000000000001261646570300146775ustar00rootroot00000000000000mondrian-3.11.0.1-R/demo/CmdRunner.cmdr000066400000000000000000000020121261646570300174360ustar00rootroot00000000000000echo ---------------------------------------------------- echo Cube list echo ---------------------------------------------------- cube echo ---------------------------------------------------- echo Log level of mondrian.rolap.RolapUtil echo ---------------------------------------------------- log mondrian.rolap.RolapUtil echo ---------------------------------------------------- echo Run a query echo ---------------------------------------------------- with member [Measures].[Store Profit] as '[Measures].[Store Sales] - [Measures].[Store Cost]' select { [Time].[1997].children } on columns, hierarchize( intersect( crossjoin({ [Measures].members, [Measures].[Store Profit] }, [Store].members), generate([Store].members, { ([Measures].[Store Profit], [Store].currentmember) } ) ) ) on rows from [Sales] where ( [Product].[Food] ); echo ---------------------------------------------------- echo Log level of mondrian.rolap.RolapUtil echo ---------------------------------------------------- log mondrian.rolap.RolapUtil mondrian-3.11.0.1-R/demo/CmdRunner.properties000066400000000000000000000017721261646570300207210ustar00rootroot00000000000000# Environment mondrian.catalogURL=file:///C:/Documents and Settings/swood/My Documents/perforce/open/mondrian/demo/FoodMart.xml # mysql #mondrian.test.jdbcURL=jdbc:mysql://localhost/foodmart?user=root&password=myroot #mondrian.jdbcDrivers=com.mysql.jdbc.Driver # Postgres mondrian.test.jdbcURL=jdbc:postgresql://localhost/FM3 mondrian.test.jdbcUser=postgres mondrian.test.jdbcPassword=pgAdmin mondrian.jdbcDrivers=org.postgresql.Driver # Use MD5 based caching for the RolapSchema instance mondrian.catalog.content.cache.enabled=true # both read and use aggregate tables mondrian.rolap.aggregates.Use=true mondrian.rolap.aggregates.Read=true # generate aggregate sql (for every mdx query) mondrian.rolap.aggregates.generateSql=true # pretty print sql (if log level for mondrian.rolap.RolapUtil is DEBUG) mondrian.rolap.generate.formatted.sql=true # by default the aggregate table with the smallest number of rows # (rather than rows times size of each row) is used #mondrian.rolap.aggregates.ChooseByVolume=true mondrian-3.11.0.1-R/demo/FoodMart.xml000066400000000000000000001037301261646570300171400ustar00rootroot00000000000000
Verkaufen Ventes Cube des ventes Cube Verkaufen Cube den Verkaufen
"fname" || ' ' || "lname" `customer`.`fullname` "fname" || ' ' || "lname" fname + ' ' + lname "fname" || ' ' || "lname" CONCAT(`customer`.`fname`, ' ', `customer`.`lname`) fname + ' ' + lname "customer"."fullname" CONCAT(CONCAT("customer"."fname", ' '), "customer"."lname") "fname" || ' ' || "lname" "customer"."fullname" "fname" || ' ' || "lname" fullname "fname" || ' ' || "lname" "fname" || ' ' || "lname" fname + ' ' + lname "fname" || ' ' || "lname" CONCAT(`customer`.`fname`, ' ', `customer`.`lname`) fname + ' ' + lname "customer"."fullname" "customer"."fullname" CONCAT(CONCAT("customer"."fname", ' '), "customer"."lname") "fname" || ' ' || "lname" fullname
Iif("sales_fact_1997"."promotion_id" = 0, 0, "sales_fact_1997"."store_sales") (case when "sales_fact_1997"."promotion_id" = 0 then 0 else "sales_fact_1997"."store_sales" end) (case when "sales_fact_1997"."promotion_id" = 0 then 0 else "sales_fact_1997"."store_sales" end) (case when "sales_fact_1997"."promotion_id" = 0 then 0 else "sales_fact_1997"."store_sales" end) (case when `sales_fact_1997`.`promotion_id` = 0 then 0 else `sales_fact_1997`.`store_sales` end) (case when "sales_fact_1997"."promotion_id" = 0 then 0 else "sales_fact_1997"."store_sales" end) `sales_fact_1997`.`store_sales` (case when "sales_fact_1997"."promotion_id" = 0 then 0 else "sales_fact_1997"."store_sales" end) (case when "sales_fact_1997"."promotion_id" = 0 then 0 else "sales_fact_1997"."store_sales" end) (case when "sales_fact_1997"."promotion_id" = 0 then 0 else "sales_fact_1997"."store_sales" end) (case when "sales_fact_1997"."promotion_id" = 0 then 0 else "sales_fact_1997"."store_sales" end) (case when sales_fact_1997.promotion_id = 0 then 0 else sales_fact_1997.store_sales end) [Measures].[Store Sales] - [Measures].[Store Cost]
`warehouse_sales` - `inventory_fact_1997`.`warehouse_cost` `warehouse_sales` - `inventory_fact_1997`.`warehouse_cost` "warehouse_sales" - "inventory_fact_1997"."warehouse_cost" [Measures].[Warehouse Sales] / [Measures].[Warehouse Cost] TopCount([Warehouse].[Warehouse Name].MEMBERS, 5, [Measures].[Warehouse Sales])
"fname" || ' ' || "lname" "fname" || ' ' || "lname" fname + ' ' + lname "fname" || ' ' || "lname" CONCAT(`customer`.`fname`, ' ', `customer`.`lname`) fname + ' ' + lname "customer"."fullname" CONCAT(CONCAT("customer"."fname", ' '), "customer"."lname") "fname" || ' ' || "lname" "customer"."fullname" fullname
[Measures].[Store Sales] - [Measures].[Store Cost] [Measures].[Profit] / [Measures].[Units Shipped] mondrian-3.11.0.1-R/demo/FoodMartCreateData.zip000066400000000000000000224440431261646570300210710ustar00rootroot00000000000000PKL2edGJ1FoodMartCreateData.sql]]sV}_JՔf0Q;qxMO\HHĚ"T Eۧ/H)fz+1$"e7?~_f,77_ӯgM'{¼wɧwr,vY]Y~Tw_v-=nnW=Ӎ^<_/ku'ۇ/7m~,-—t}^^|yhpktsYӃ#EAڮmn7f{kU7)TE(u,.7z[W)+c!U _LѵP}_mnw]J:+XBpS%wԥ)te|]p; lQ{%& GYHI6n2`B",ca#ټ]VW3F*i7z~?j`n,y@_F/<5u?@uRFi˪RF֕ΑcpvghuJX|u/m&TU 8rLfҖY$!qdfl ث1ނ)8 pR22Y)a,"Sh2BV+e^<,zQ't}iXR6ck05[1] J "L^,߯Fo8_r PZ4bX$TX.a |@u?݉VjLK_Ri?77u:|7j :@$K7ıp0D;(E\֐1n3;%E0] Zgd0O } YLlS~^UG6H@jX2^TK][ `ȤW{ :} 3UlYir `ٯ\*b;W]={W]EG7fͦ^^5uh})Ya0X>%%ƍ*2׿/r30U!P 1$Kx=4gr6\yOLlQq"yD3侥8 eo5``^5f6owDt*CD̖`IJ@'oɑ{ΉAHN+d.1KFnˊE%TސC_z8FK8)dJGw[2(cmKHw`K,{ȆDI,W4;l$Ww@!/PYa}vy0`ZHqӞ%Cf1k ~ow몛}qR!+&Kh`HxaM^x_a햳ĒZŠ%[Xr, #"Xj–.Ξ/HOkx.2:g#A(!+T#`(w z̀^*ESr V|H󥃰5.qY}+"s!*)%5y\_hv-ԹjUwɄ?6լ>W}]QKfi$:wĖ%LeL1/Ⱥ#iq+ 9dcO18fAib'[c6'ΣnCm5w3?q .8ZJN?da~A߽6=nh ҩP*uBZ.c~ 䁐al^tTkNYM&Krt1ctXp Wf3Gja*vcDZS mh(L55Y2=PH+́@0ϫnl1,@B x sCލ5ݴa(`1gI_P{SMKOlGp8;T"蓧^̹ $~jh{7o]SSEP' 0ųՀ `&UXIh-Qf&eاȞО C_*}}lns7ˠ: WTOգ37d! 5(CvdW5c:/a5A?'adڑX>7 \EM8{_A`rtFs(H_(-{\5! zJ_f"b ByUۚXXRڈuh OiIw $_R%ե.*5"`X IƝAS`ǀJZ"j91%s,X'[eF8; ç?(i#m$P9.#y8cDzUMY5Ef|jxSw>ABlgUk8N= <+^rqإOi-f&)83F4RSdySz( Pj׀kݷoU7Ok hPEe$ZLI{+b*+U#Pjy@TdХ P @Єl~OjI}" -}"[nxOilT 鑴. PRXm1j?R{BӜ?Hf쑬z߬πՒ7JjUz߃+<&+eV \RJ -1 <f3QD6l' $`_Ѷh1jd5ܧ@l0%Xt=HaOoBZŨv2YU X@~7cDUhU_T{ad.BR125$r%NzSou yCѝςɹtG] HXE3L;\~InPHLu==P~ o '] M2HSc 'dv;N(԰4p\IW}D}$mϾko1{4\\ԩ5ҭ2y9o+!a7};{V726-%'CcR弶sΫvn*ch <[] j,[ 8r r%֝v>:DB80K,baSCo`s3z#kľaJjw% p[xW+ujsi(+Ml ~&}ٸt(v+\/Y ^CI[H6;"}n:$T,5{) *4 Sy&-DsV8,zg^m^c[m{L$fXR )fD,&m\봡v6ĺ^a ]tꃜM%ZՅ\.!{V͂n$Xbeh=6'&wy;Pj}&k=+xߢ)N[IME&qmfE<;R2Y+j8V 5ܰ")LW0W`%uA1(S6{fQ}eU^h53$'Bq84$wety7}%? F+nqm 6cѼ3nn[6a3V)soOak:vV]}j9e]0'ǐ'>N[xtm-Xid8Q͈!38g9Oj&] !13֚,'ECmROYɕ=-7'فX>IapA 83u<` 4$re@:}ۮKBt\izDLәΔH^,]\x-ЛhGX:cJ?0ψ䄊a"s"hk{N膠TT҂($Ԇ41XK@ª78K<:>:L[XoHfFe[˒6 {B5#hw*mbPi!j]?*1u؞fZZ;!M4yArnwO!I1VmZPaG4V2 Q,6&"'f_E4W\6!|NGsqe&QU2[ZJ#6;)O :kF6H$ȔB+(.^փþ\ٗn"9>lެ>wmۯfo#Y6}Ӧ#W\Scwz c~)udHħN Ur>5*:;ɠ,IȕR+If%6M.Dɋi]cR#7ʱаη KW˖#XLjfSRk Ygnc`~I*S=@@>Dxo[ft8$8<,b3w}l]W?NŅ=LEo2G#XL_}LuZ&.vnBPtHD$ $uQ11]5b V"]h'vFyeLcH$*K&8kdEu heWo}5dc$Qb%بcH!|2c}QC'e90`H^!&W!yQ6a &V(7b8~Y~Sf'R~U+uQ+H4 $qF&챢 ]"[+V|j]HHAItX["W˂ٮ*zc_w5 w5MdKhFK ̴1]aWc #KMɓyKRDƘt7O~cq:BѕjOa_rLYS@eٸ=Kq5†>W־cSxFxgI;n"&ȝzWm{_a:'Zl-Q9%*eۊ:cSxaI`ln\f\ E7PۅJ?o[ "~aHLZ=\%0a,Q^)afϱD~}N81("VZң2^Asd`{-ŜLS bZ񚖱+Z1~ڮA({X'+XOU>x wܭ.nؓBv&TӍRqcbe*~9D'n mKɳVnV}GݷoNBׄENtR!9ֺM ͓lE=JL щ. +x<7*թ˸;pzp&K~l6mۇk:V~;lak&50;lH=kRb<:@bk^b`'#T8EU7ela>{}2(=9N*&Ja`8te}fa0 Pf+8avԑ}/SJRqwOFeP,c:08|wT l7!aR~~XÇ5m\" DW5ߌ2u_<_q9Z<,\~LqaFIQt*պ!T|ݷ[x}YZSMCebS\iE*e`'3A; %Ynf5:e_/JQ'(+͈<`=lDFt¸@OFۈes&z-*So~B>Cî?#+4a+Lb>xk/}pWܹ|jXN'JNoL"Z9*"?|uShMz鱌Ȭh-9V)NM۾,~oZŃUP=a-ri&-J۸gQN1WZu9b_OL:{c[P$~BJ.#W\TU,r?9 ҋ Uf1 n= rfnD0)bk%ZHfiBvu+Z0~i# VD-?]b1xm8z nKp  N t׮x[ɵ*'Jo;.'aNlTjmiV"\wg>×r+zfF6cefWvF;ngBmF m^ g6̇:6hŚ6 tYNj%O6_'nܼ"[|k"c4n|JsZAY2ފ H`㷇}7@8k *&)+E)mҭ#W Z>]|f6I8R9S dÂ⌼qf-޹ @!C|WK3ZDuTh^vr&'mQL<ՇHFzVH?9};<=Q@L3 qrj>atet!?W;:œpB/)yMK]{ݷ/ͮvx5مM'dQߌz!C=Vl1hLZb"^DWZc>W3J|Ycdedk;E#q }^Xtc!*µvp Yl.9*Nި~?TV8atAAk)ɶfMj*x\,u1Yo[պ0б_p:6G [<_]" r}/\3SH3<f}haGHqAa{Q!b2 ķ|U;>Sp̸JI'@Ja5\` n%ˣ~Y9!bǀAAY.IH:0X#^v$`}N]<1e]^Or-kn6rKFquH4  JWv5c;þtOfM!' FfurQd}wð0A%SQuQ?^b(D'V.ʀ5:CnBo,.XS6RAe1 FlrvK(LJ8SM'7{U;1Zqk^!1wlxSRŭ;k3*XdQ3ve]0CnBJC8[l\k23o7rD9q^_}⵼ e Cq q69Sʜ;iOfgƆpŦǑ"QD)[ZD3C^቗ 렠 A:.ÿ+I8Sf '+Zcn9;1zR\S9Vk˰pOms V+GI6{^nluJ sYyţfͮ6k2Zej,~a<K  ^*ܪu7ſZuT|dUPTdGk,b|sZ{3fv{y+tg0ܼr :ٙvfz1&eH]!F/1%p+n5CdMrRgĕ)^OD!ruBQJ ݷJY =Q[DByRY[12j۶py`w5 7ȷh9݊s c P2R8V-/^s+{6bul.e}dq(^̮KIU$ZpЯcr)`F Z+k^f\gJ<m}UD[3<#\x`0pGgfاf- z52`g^La(,P͗s| [&{a%".WKxlIFCj U"P2/zwO_{)c$J 3q&R!l-yI"[7~[a3 뾳TeEC+{m.^<\l.MPﲤ ceCc(?eNWlT&YfSGN5Ü`Ů澘%n Q V:8,=Y[DZ[mzI5"KȐ)w^Aٝr:,&ʉ.Z LF}2UK cs5S;9uDZʆׂ,qBJ=K;٧` MZBg2deNWA+El/>L{b~Xߍ:m@,GWHI;֊75g{A-h8eB *Z* /؂~Rּ _%}=>6A:=*BMc *EvZ*8~io]Jߓ"?t.߫T} 9W;$bE}_G8٫<yޮRQQDWQI cĐpR9ҼRI+DKwS_ǃ2ꉬEa_eyáņ*rJYCEx/ٲjXj8TWz^e2F gBcWI3j^Ela^v2Xo(S%-( lYLvr_{(*ϷBZj5/K((v:Z>!Y ϥ6q- (Ub'2EnL:(^p: 9S: f *ch)sټYM1' vV&ec; U|w͏n::L!顓e)inQ6E^*ܼ_9<ԦblR "'em^ 5_~@q P''C@A\R,<!{o!SdO\Oe,h<ն=K}h6k!?%|:ŬDHYPlԺTsf _C#WDk `_4X+]32wͷǖqMF]"8o%*ZR*/Y/>s :$Sn+YOv1~&rY>l^@fa1[l(}p g3br0^,]F~XsiكͩHi@'뭂J-ѓ|0keZ8Wm!euH.xjeeVG%{9;4c{sf[}Eߜ{+Wa:c`د\ mEBEv> mW$@j mt}^hPa孂~T KN%sLWjؒhslĪOと#*݀Yoݔh^h1G[u `Ykj_R UQy8SӉ['{v䃅Q&Y)J ʖo> \|:<ޮSz@Ekbq[씴lǥk+F֟#+@MgkTL;Ҳ$.sT?1Mfe"ኬʻ\ OhK * E]RlM?y׶ֱd/hWOO s#Q'iPTVUojߨFZ8Z(UתZ?T}\}zKt{uONdZ7^l˕^gd%ƐPby5ohE;@o")g8LBxN?Nk.">j<^ܮj6+Y7vvaTSZm?"4Gsw.,\`c#ЬzK%?RxKPUdKR@ocg&U7/Ս<amqpu Xu MS3@rBz{5W Gld"]u' uaPq` w.V .>fMuXHU84UHUXzV0 }mZp-zE,\[ 4UTDj3\\U@/-")ˡ{DplY5rխ#I WVХ_LqU-StvgX}q>BV F.抈U!󖣖epUJƶ^2eTf׮U"bk9E+XoͦOc9#llSErÖPV> g@o Tj qVk`Tf< J7 v\* ft?n'݋z 9L>y/~V9tn dZZT.\,U&|F^[OVRPڕǥ̨7Ic IM5GCᕤ*rTE\BʨKC; Du5F3Q|p ?:-׭P6}YWUi5^!B5vUofjNLeEm23Vq5뻫89g,Y+9Tj23ZQZ}kM0Dy>g ¾!og$*%?uO4d( Z*#2\(M ز23NU:l9q M_Gn6 Fe23:5l3OEF-I:>QegԈwƦi6Fs2Gs=sDjI:@JU5TtX%L->{F׏[:޺F՚\6WwF~񽰀a%b$NUF2!\8lkYlg$KQ{ˮKX>*5KBnW~oժVٕ(.Ԥ10u, |ǿnkWNxδ8L pY90%'xj5b#W`/?,2_H[(BcLȶ] gXF T h|a a1 N܌"`+pl9l]ǥXq1)^fqL#jv(0!\‡i-Kݜ*D\qnbuF8+M۰vEl =1F)ܳ]̶.S9(O+aoFbga P/7@lHb 1+M_c15pō2WQ`&j\~ÊO.MSu̥]י潀^r+(.c2|-uxzHg /uy[\ 8tee.J|u"y#HETmtMSAeΥFqxI3ZmK c8e1]KKj%*gW5s- q vVL'()Ḛ-8®:6;i ?[(=ۄc_fLF. 7(3}"SV\K d:Y4 J?7'Xz+ q!>Vv3FV$@ bޜzBK,)G¶*IʣEn'ws5 e!o}`~usxAR QLM]"`*U6a^wOV*HŁK!oӤUsv́}ӐM̪bpTCN= hi$jUVb_Y=Bϗˉ ƗȺu!m$T\SY4v9!&2QlcU%Xϥh++7ri0]sʅ4BP!xCj ./7ZbvɁE^/EaP֖łz5Jq.XؘCұJpQ sw|؜_K1p]K]FW805`=C-s&CD)B6FIG<;~6z'07lZ) PlHua^Bz6BdCa8'&ȢZyXK/~6;mCk@:Udv=Aa Q|]hbW)ZzA MePyKEՓ]؟W\k2o|ub0x\ҝV+]] 2}Dy7:~42:수+Z/һ;\}9<_ݼ(H6R#4;[ӁyZ$fnY`+Տ7'%Aka›`@#WcњEPޞ>uxJ[xJj1 4گLj5#&JBČs{>ߝ:K]N$qyVlv B^0qF#%9fO[s v%S}js"*#]:ctEz(oY%& ْIخIdr㣴q%\B3B(#Lr,@R5/e֑bk#1LZUeI35ö,`-)qHv3ڎe6 l 5KFH<$veamww3oҀv- #W@Nְ ing(&3ɹ5mFq3RW&U^A % =fi6]Ru%ZM"WS%'-!X)ƂccZy*No$24lXf//ܨ Mbz@YXHl \e֫ɫ0ƪ6Q9~}<OY.kB$%b.06;P\G㒋-KUGa^g ;3r}:`N~9/:G9%kBTu-1GG>\jԠ<`

kNSYuVb[NʫW8)af䫓p ]ٕm{^K=pU+Zqoש:4}dCvҰgfP4FU+UMGS=w}.S춷rU(xHMdqWrtbiaF؊pZ/?C!(WDB)^NFSOPˤUK=gӦ |8-n͖Ij95ĺAi:Fi1FoS΄ oLO|;;UCI>QQ%On dYi!`c.RVFETSܘ3ΕL+C?3TƊQKːpUHm6hzmMg4ԢP=$-cꦘ2ߞO p]U ɱ?Ve"e]lKk}幭kwcL6x#nmmb_²Z_2VV-l(@M6vtXR!yp<ٟj/Z69Zt9e 0~̠*Zbҗ&ğmFxC% Jb zF|fȿpO]6\u$­U]uF )Pv-޹ft/1r`g깝x 8CIlXk(.k 銳4j~ȚX`^D븠kaNȦ1Mϱxg-6qCӄCyεkPc1>n6"k]yF&qrkbkF K7S93{ή?cdM~H%R]Gl.M.wNLUlfW8M,Оk6%mVw$L" C|mo=$ĮUaNWkG2Jg\:}_iJgͫ< l+Sz׍0zD[W[%:UȒʭU.7(j3^J *W[iPG)Pz6 D?qj9l6귗KJ8NFmK3hr?-%֡լ@>}!81ØİS2i񂎚C*!I ܲ"XNkdSaR}N*zZl5M/d}H a­_G ^mgXW7}|w qERW+VꅕG l#l/=,"3asGtH7t*٬0Fe/p 2!\H̊鶙 Z6u]D4#85v1'E٤m5bBK0b@{26fO~0Ufwq -̰sZ.$ Uk^ϔQw{gqA7K.дGOa%[&b%h'R~yi3ڂ(ozJ$brYLILjzfӅKdm9 U$bvA*H^|SC˻g\&k7Mw]f?c=r۞iIa5AS3Q b-zKbծZS@펧N=W \ 8 ע[RE2ifI34B)Q^sUU&{&Ed)>Z}`ZA`9l*qjodȻ6d+iC#$%Ss`KӜU@w8 1]SYLAcX9jlRpIK9߶2ZC,'JA5z|ɐ痾oPF/Êm>i,d;j`ڐV_m~۞v.e-t̷i|)\#G2̬MTY}*H~ e\$t0ñ&K oFFX_sܗmw)BN)O/ STDF+Ky}֏v~} r|U\_u<]+Lʮ f{hE I tKŖZYt{vϋyӏ *M֠f$`L מjYzn1i /1q;1bt,;{ok}Ix \APcRl-hË 5c{uOo 7[bjvSKfal` ]/g([^쭶v__ߟ_(9@1q{[ipƣ& %Ua S |TN&|HG߼4%c'<ΰ.qڗfyܾs sQyR,zjlaRcRO!Q" 2ղaawdu` bT dAectY؁b4pc3=2d,<0,@G@=A ?7ݟ<{J[<_}A5JIf(UW~Ʀ xߏwm7 x?ix -Δ$;E^4SvjuNȡziLfVfa>o2gQl!Ge!?q^@y5ӑw,Uj/YEIK{~j _FW/KZ;B$$cR Qа3L6+Š﬐| mg[m#_~ɸe)`,h=_c]ouȝ3![l$#;5ovHxuDԮJ-"ɨF}EuGr033~:;"Iʆ ZBPrcο3͜_ԣC8$͸uHGlyN"̵oJb$~VIC}!Uח@!ˎ nX/VepXnjW 8?ޤֿktƘ=jBsrraY9.՛ 0oώisl1Ic] Le/jgwݯ u{,k D8Ľ^%I\CTexg[a K^Yr& ! qWw q0(h7mByu%Np kbu3!18Mg6("{6W ! gڜۖK.sDs1U1giEHg3v.e{sʔwOX@ CdI"m({MG>uN*jqdI`m _u^>WvӶ?駓3퐴INi[๣ELL0 v߭nS19sUpdRARzʡ.д$h?) S5;pۧ~nȹPMf"^z|ٟ8Y>Lkm7hEOL_wa\]j +{nENZkQ,:P[>W.yY?}:DM|)K/;"Йz5Ic|ۼ>ufDݒjXbk5F%pzYC~L|fRުC<$ű (tcf|H^Pdԓ >q u& eAy 6?1T M8Śi̓#6KjK 憷#yV!mrf:KޅrmQE]d`poh7k|(ZC>+ƕ`hx nWӳxP, gt ֋ܩg(֨4mK}\7*UͥeU5[gy`9|ةQ0[݊>5;rZUv6vkVs~޶GbF{[/NV"Fl ΚճUScˢ y)R:Zfm #5gy}iw8)CPŹ4F]ugk8dhg گ[3' 'n< Y6u2U ,A{m65rϖD&$& X;KNA9N!X͙.\:KΎ,S}W>B$=11!Trva ahg* ZD(*R%pxo ,C?BJ.ieB#tNڀc0/5:̆mX*+e&GϪp^ls]/wxt{`p,< hΛJj4epg٧mG0|}Nx*,=-. 3UyƫYfƧ)xn7mw9;56PY+[ŵ1ij 0̄iQsY'V}~TRFx}׏f]~zਊ—[c>'{ U%ש 2\b,ac\3@wVCr}\qjfރASl/GxpFG'Y]u}mu]!='JEvaS^ㆣXVȂYvvW~a$tE9`rC%eL2Xq\\u*%hwc5n?Z:QnPd)!"ȿx];Km<*r.ʾ>A^2*0kڿm6')2Lq|G |RWRo 0uGXJ&x,1s⎟5Ey:(b%\',bY|^>ЫI7"МR-Ml˫ _5`|X;g;6,{nzeMKςo_aO<{|8LW<:אTkkmrNxU)$N$[N#?R`=s\5#:aUqϛ|Io>cZZPEwTKVx'tO8G%jD) 3ޯbUk)qyU~_o7N7M{yr8HhAQVI)HtTulU"5gf &!TxKbV,z~fdU0T)'ͅѪ,^C{V\r*0鼪}Ѣ'›#1_35£'T(S]U JˁKԚ(ؚ޻^A(My 92xjy1edŮbE^w+u©N}[ޯxlLj͉ҨB ԰b=tpF5kFv«wnGdʦ:.WNU2ѶPw2pߛחspF7ʫP_h::|[&ϰ^id|:R/K{"tX Ln %'b FpoK\[*hQ=Vk!˘5MkǪ6d}HKs R3RVfsUaBbVl.h((>@Xar喡Z ˠKm깋e6f"`[e;8 Ol%-ܿB%CŧlIgweöp" .,K0ٺ3/_,~|_! [lSbt0֌?G ۅ *S+K2,\Z۶ڮ6.+s»n]cRM(IJ}QdˍXdW1EB3^,oh7­ {Ybpsu҅gDfJSzdo_9rSIh(̙]H"/Lm[~z|`@rq/ΧxǤm3ͶZ"x~?Vovd#^.5uoN7ڕ-L)WL)7{P 6\ .mY lY O{c"\WXD WɼXhX{ ~*9 ܲ +c":X\P Nw BTH?KrtSPoem M3\ -]+.u^o_?Whg;oJgc$:% ;>mnp̾߯[\& YZ2#pR=IK%6]M ֘J%`ldQi, vt#GT8.AH(ƒ}Ö-|{.bVwwzT&+) ˠ9!`Y<\`[NHWfGt+$j.ֻ/;daNރn1莘2?(=`P,Cb1iY+(~N1}:LtF/68| IE9RZ@t{X2b"X [xjLrˮ( [*֐լk ;$KhAbR;FqJ+wb|0~s_7[i0rY 'vi^hdms^=v_Vg xQL>+$$ykt˃'1n:\3g`A0AĨBR\Y&-$Jw02bXLL. N""ݭإ-/p"COq$U m*cqx7+G`U.m{QLMkh+9XN 82*j4>٦3XP;V72 g~_VTK*}0_W;5U<7;[aBM1EaTk^3aWv03go#llMޛyTI<+-È=ӔJ=b'\Rnn<)TRD(V/,K hCSt ,eG,ڵh)y%azQA_53L+7P8ͮdpr_'z#)Ⱥ.I;K&1<C'q=(5HˡLgfϭ`b&4bjlu˼r6}}.r0nf@KX\ YVk5#Y[p[̉,sQ=}ȊlqIN+`UF\.6xƇ Qpc\kV1jG\R9?(Ͳ4ix:AN(:TK1T՝5KQ7 wۍ{'_uhO(i/wSgakaYWl P٭tM%JJ L슗cr=%UlxVXs ژ-a^HĎ:ۦt XduT:TGWyRZ`IF1zS]J1J H),{(LHoN]qL-M Rn?+.ڨVzs&V_ @c+ |4T>LU.4z{v*תRׅuL*++q`׶+*Kg"_#$<**+::]F1@uǘib8؂̪$[G-2 c%?z ꒱&*I׍UŠ m%l8Fv֐m(u*`3i5SqZV4c:2/ax yB.4u"?5lӹJ`R16k!+XE| h**WllS/sp#X(D'3́:RRG[ b{W!%[C$+YVJPZZ@]ΑO],,'֜T糢zJ Eu sc[ "NY5} ʛV6.d|\kq 9a׭6]]qeFNN_:~JxOkĜ"En TE_yUMav{/~=G$jZZ5rłGH{o8kXH|s#)sVIiP0VΦW/I\(rfFJA*9q\y=xYŖ+pf_4:)G.p oKձq6Uuvϖ B6nv$PRF&:5}u4m Rp2sdfĕgfQx/."70çC~?~6/؈q)&!+"o5B \R x2y@6QTP<68]u3j: Q.ӗ\^fgAgawZITdEp~ WހiZ /|8W] OᾮDWmݍ{.aMWr1Wvd+ a}AUؤ.4 *Ӳȴ~`lT_^:09l%!pCu<q_{U\\/8*12b{]QߦLS",%hPQütq4Z%hoZw OD"CyV3 7A_aU!ƼxJ %,{I1hE1I4e ُ`s\,䘇o (ձkL`hYL8K&(Bu:\x郹 o>csS _1]R^MoY2´ݟeθ CH*uZ,mfk@]w#F΄bܸRuxƠ-zjlu d I}zXXTpK|=/tЄKȬCv]?t'{{۽V %QqšJ)/\Uz &}˰H>n'3u(tEK\ rt&-P2BZeu~ߞ>;L]2199OJ|a0sǴH_]5/Dn=5T]ARNu=&u@ߣI6pMV=VN˅)Ve]r5/ҳqY ./뱃9JMk׾\]$hvHD6:4Lu "2ôWc =p%l[%e")ߎjJ 2$T g.)#k4.ܿ15 ;( k]ymENjc>`K@ctYZC(VްV#slWw}{Qouw3p(%bO BkAF7L,HyV;0Ƿay\^/}w嘣,J7;G+ NͽFl6|~:/6$m4?u.Dbb4M0k(ͮ:JV.o\^rݘeΑb ;XlCnMJa/K5>s2JQCۿаwB2*j>W޸vAٞ3>du y9*qUAv0)KǛ0rI_~CUP?ww[uZR$Z`nv>l〸QlLXz|꟞77n lKml}kM46VC2q oԱ{~a %R_\ELRM6c@S龈#?}Rتn^'DؖYwP 7a<BD:r!8'[u3`wf]GpF49ʛo[y#vs'S[\l]FjJj;/3rzrίHpXiHp~`Rm^l6zYnn5?HcЂIPDܬ&~I8[uo`@erF~F i` 2_g5Y9Rfo7nE6VrV\7$T(oVaq 8!X![G"o<aE x50IJO!` D :$(|3eo~C6Hzl$ɂJƫRxH䥪59Gש=>ca*ްW;jhJ%멵YhYtaמv.kgpg Tny5VÔ|su/?7};Fsi'h}!V粳fmu0oūÏqìIX%]k8ф լNAU5]|\j?X)e3çp.E 7O03v%"iz%C?-%jXWCl ڬ- 9 k'AHJ[tx* ޠ7~GJ[|m;nuI2I2c,cS_^7x]0;;[r8c*hK6)^]|T-yqpG~Oa{{Ql_9or6zLY?M4 ,f/nÞ7cr_\t U㘈x&=}jG/>g|?lr)K_DIæg'_@A~z]ůÂF+~4?w0%֚'%SZΪ^qMr4TZ>.ԺƷ/^fVU)CE<O{bTk 4niB79~Qnd?T[K+jsx$28e# {\:@jI(;|vfvc Q 1uP)M |ߙds2#EG!ʭF ]:ׇGY < 0V6?Cnawki89pdas缘 E9(V9a}Wݯz6eKjF`ZT0 dj+"NAetaGքpµˀ䓼~8pdW^cg9G'xbp-/ݰ%ƖQeo\Zg)agI9ZgizrMzK%Wa,F(Ժr~ysep. nY_wmA^G7-UMMfJ' upen_*2H/m/t(G3W7Qf[I_pgmRUVŜxA2?ؙmMX1VeO(RVݶ{x>5$/lA%E0BAq HTpԚ,f튪n;mrTcG҉:䈗* ~kDžbqxmnrvo]6iG),9n_rnO9>:DXQK* 2/4~EL^aKC$)ߖOT?Bx0&groFe:<옄A/|6OV\{ql*^t+r4[K 9X#ݼ+]twZ4?XFdE=aߏ*ɩF*jƩnV s_`f(uk}w~Kf,T/UY{=<rr8(R͉x2Q 4A29YSo0V9h9߷%EYkXq (CtND}(S ӄ}&'2XӮaL<]@|#)X_CLь Y҆@C3,sa֝KTc߷=1'ŷV_qK⺏z7Xck~Мu216C6KIb:D!Bk^觛_H96$C!BwTX%V)=|>2/F㒖uɐsH(Hh403V+o8c)J\hs4ZJ)n6<*֬G6Έh kz^_?3`]5q6Yw`#&3bl{S.ék.ˬ像.* ԃU16R>Eb.\=_\d09]<U=U2J+|1eb )O\$6@ZDFt¥~۴|lv/1i/W\:VWԧ bԄK}ϬAfU/O] RŅR.h4Zʦ*Ϡd`{q&%I-#pV;e8'<ȡFEŹMˉhAƲeƒ?\PU5)G .mqAЗ׌L}$J)Rz !4tjSN0QrxTؼ#k޼`d'l, #ޠ؀QAB@iDUךr&<'$ ^OSkUU<0 ™X(%h}# R&ʩ1zʣ:ҦHSdF.T ,?֊(>uywu Gub3B_th}žnzKQ3 ,SgJ#.ĞZ&vB>vvxnVt;J5+~Q2}pgCe2L`3U_ ]aPHbbǹSzP1`t'uʛdρ9JmLՇfz^|X R I4錞"~̄V46>iN' =K>**(t7js¥^ިhe6|Q+ЌQF+6(55*uVnr&R13b%.}a43/ZsxN :n]~|-s0*^+ڇKg8u5Vuχ++nj} sV`M)fiShj[V,'5̈́Vroc ҚB| =[ Uj'TunGh9mkeҒwsix78լɈNݶ+/MV`!U|^'f^^Ftʟ>|%RFo|Y/u#NAl}2J['H4E+D8cqj_J SAn%//6JU?N xR~@eTVA=`}B|L>POԗf.r.`R?.eiv`B]vŧoLg42MqՙyIՀyÇ xޮgvq9TknGqE4/eR*aUfW SN= {_ ۺ?7o!,]$)M6R:5ʪ/9m ,YeGMx  Z|Wku9 `  \Q@Nl%*[fbּ}&)jYbtVr39o?)h,.,ȟ  9^ eMyk afnxsV{M@gjZn֯~ToÐs@8luϔ'BĜK/ o.2(,/!kemx۫]kk"5.9xXvpbۑ{*-<Т RV0 ? ?̐UMUNASr4 E>Cʌ%' $;b|g9]s<,wB8礍A!6[}&:(?Yw}߶Ob}R6ĢWC_}a^̛x-,:SqE 24LN8xl'G5wٟuh] !sCYYW{!+Ά$'2YobY\} "YwQ>5w6,Xp%i,/Rqq+2˿Us !x㰟e`^,^mmDt_[X}ٵ1Ref]u#,^NZ9vg[)8t}*Ћ9*&]e6qҶb!j[}ܱs63 cDbCbaݬNm!lK9ê^<n+8\m,L9!& q_,[ 6n/jPsa۱~^WE5˖hfN&b$WR9f$/1X9d)D-]wlFRxэ D={OJ^Y#GQ3q#!W|W ߮9|E~ND1I3]YxnJ[fZ.,5af} 8{KW䎍q hJW(M1%m]{=8t*auafF:HH%KKWm0e*-q xk7(eόզBڳǐZ~8cxc6ҡ͔t>Yɟ#\-qɋHV&T\^et_Ӛe3^G(`Q1zgU; _U)ރ/FLh)$^4 DwUw9X`{EP('mh7ܱcI+YzY*b0Eɻ6W_Թ_CYc+ۚ\( п>3g.J`Q=3n1kVAjJ% NjO0uuy=DlYޠ0փJ ^6R&e0&Nۆ}K"8@,zC.k6v'Ҹ:⯭:cx4orq75TCd.Vu"*&a:N??!lrʖDEAfh5}YݽqFf g1\iMpREMTpkVϿnLumh2X0Cȷtn6iL{Z(j],\)zO |D<ȿWT_BzivwO7ꃿX/K7TBv8<]H~ rB5wLLaQkHؤԳaS޾4O-QYV; VpGpT늑1~xjvͦy+RBTS2 őu\XԻf`W|bP1qQNPMk<ݭ]J)ztLɰhڙaz41:dT|%ҫĢ6Ey jG0h25OQ96j%h=!:8dXlC3ʫ: ɂ@,2:WbrA2Ƣ4yb}qsx.vms>y/:Ef `A eUA6s K(K.o&Y%8)s~y끍Q' 2 B4Z.>ZyaJitُG*lׇ&zTA+#oôP^4dyM~]r/CM*g-߶yj/Z+Fbnjm0qlZ9Е *Ù|2l7ea~zE?5)Z6u"T,ц.*+#\,C{\.N7L%=" S%YUmqk R2hac ':d+ŔLwhJc7x PP/pِ&S=ng4P뒉>eMqa=)lE@^C*%]km>6a=10w j L?6R6[$RBBiEֶ5Mp$ϴgK ϲCW>{J^ѽe)V7UK/6M޺A$uX? ]])"3 [\lPE`cSj1)g2 $,!c:V.WXTdVP;dCNN+q"ZȌ cSu)d[UC*hs7E*.KY08;VyVzO}/ ~/oވڥ;jL ]F?yEV,Ժd||1a+ϘI1S9P'+u#+u]}8`vO#q :º8+ .&Yv+π1v{x(VD29\E5/Ս-Լ N? 4اh]YN-fYN"GJ$MP^{|z5}5)ȢCjVlC[4Pꐢ]:RB r0$Gks zm}{s*yC7Ƕ=V/0RweMDɺ|j1FyԺA0j6wo=mZ~M&&_HJw@|ꅙxaӷ7&K6Ձ`F`If'W p7F(Jo VMAZ: 9a=z5:2.UkL7ݯ6&Dj52SRfAڐdK5Ώ}dMP/lqG84$8,XD\qa8~"z_;|&ze4gpbE>҉6&LMmŔ3uu1qUJJ9Rwmq{UҢyqdwK-5yM]vjn{Wև~ߠ~jzD0_5V|GOs2lvŢW;&d9 M ZK ٞyiT2г [k؝企P!\>aG&Nx?j |}h7M 'qc#ihEu<YBHꠢ1dChX8BZ,>x8o ÙɄ++Ü,Jn! S99{ۯiY Ѵ'fƶ_u^gAnctCV8\ԎRFgSFVp/?nyl)?B4El։&#|}jv/ 2],d-H]>XT نztFBZ6 ^ _ȹji݈aH{v.awn:RE}|w]~š~dHN?7CPNޱݾn\v=S/ {}g8uH^gp9phQDŽw7 1gރq>FI< }1Ѩumt &83w&w"e,V jt϶z=m]z%-(R1o0~L{gۼ2ݞ]9}> X4C2bPzZAf=)٘p{Ng,%;&X[+WzJQvk6ǯ=~4烲TIh6^#w`$S)™6߬~m(~"mHFo;#; \; ._5]m t.277MpD9u^YMuv#YŨ11P8v.:Z3^? o|<^u:Y^ؖ1FHZxovqqv.d5H9*xf%Ԙ83SׇDk. A0Dq@U~3 EPjL}v68g)c}aOE0 JKnW*OCeۼqI#%eJk  2ư'E 6C\T)PM,ڸQaA;RWhgGQ?'>$j0BUe㎍-'=RY ?)c׭Q9bxC`y3nϾ~Lv76k,>g3;!z/ˡnDoLVbBp`){er! O5_\W ˹v_m,>>Y4>0Ԕ4}ɦf *W r~//$?S2^։׬@"XMwm2ZMTYYiDV+2p2#jlӹ-y!EMA2=(`D*уzK1A6O#K.nWU"A1l"r, ϑ[//fL<`uV,w%l૾[M }R*7( 㦀6J.`g(nl#nR5F% w#=4Ry#;ӆ:|T{^#d:, fLk/scUV!I9lsTZ¡Lo3NtܧDPH* n#'Ȯ&cTA~mvk2^dZF 82i{Zu`1|K6ggfiZ8S8c| j1-.KMM2+a!ތn͟?ۇWO60YgH# V KhЙ ey +hX5<R`]%],G 鶴EN܄p[o@dtK`ow6#θNϠ yra19q ;Elcz#82YFxF+- Rr>]BmuAKxq 5lKٓ{D*͖sO%pI~xDR$Yer;rg! 0%{M>}s%JMќ#`%PI.,!}TR~tOH=SD3`cĤ`q済c߮(@LKҞT}PjOgԾ0bZo7w}}.۾݂Yclfx8U+lccUHcno&  ̓E*}oRr.@Gc11jsF(çw/C|nvCm eG2y ފkj("pT?AేhTQW|I*eʭ)e>?_5*7QQK(8/*%"%rx[{7ͮ )[@yhpwBA?tCzZ3TI\l Y߱4:joR,ƠbiϰN|A:-~{fBJ 'ќ-Tb3aHn;Jo* =,Y_ $?z`->eDQoo.kkhec ԳGF +vڑP9IU?kջ T᎑Yq,1`E3{bfk0>vkDؘmIo1K1*>uh).=*1pm`V9ѡ7 &pZ]0ǶPV,:-|nꪆkL7NZDܕE.=PQ6gH+ﵒ(zGIgY*%Hr)!\J鞛 h!5p 2mZhDnZK3gHm}W}l&JNz+^G:u>8denJZ1gh‰Ko\p*&lAC?qnȠZ"kP`;x[l(a Q(D<24F:rCd8:gUj}JFbCiGk_!Hȯ ߾&]lt0mp ( jhq'QzuV]sO:F6O & NҺNJ4*R1C mnvUR{Qm}e\Y%/ǒWzFMKwRI{G MR{Z Hz\R"+Cfa ͅe~H[ζ\iV/ayFu^9!Fu#׎MK1f ߫[:G- nhhFj.oRmzSaGJDdG+nz.rcA.%RW_￷-hGic}XawnvD~8)EGɗ.v!' -.;Qe.I9]EvZ,l ܟC-oN(]$iAC&$պ:HˈzIXy&6D|v<: Oy9SAy v\_w}8nq0QQ ta*J1WlTjM#p }+gKqy &wE [j]~2HWAؠd8lHq.μ^m5.2}JQ+DT)p'9˸ZP؅|>j(FxL}FĨ:j:"?y y" ^$jQR 68Q`4edogʔwcԋ Xiq=4,4VUh X@ٻH=u0 pw#[IOA_.HKg a|tJ>F n-FwqVo(dnuMᾺ||.BJI>InLmC"I:XM x6wͶzlmv ;Bi @_uOcjQ4ҋ 0K LWO,㟘=sZ-0ȋԍAJY"d0RN/fy7]m{9>1C؊I*nrB/hl [F5m M,9Gh(#TuVFc7mxv,MgU(RU^JYPHcF>ǔ]JB%kiU߭ݦή6!oB峬 lo1QHnv[;}T%D',hvi1F 7E ]$l7ߩb^DDB'j.= T,CiS'-BvKCzK( aLW!zj#tI:ބWr]l :8s9d$?]4|N,W"OKk6cag`QL! ,ʔed`9 ByuS3a J#nY=ҙDTKDMu:o溔fuհ+ nc Ar/ Y:A miiO<"l,5ZHPv}k7w)Vw?wC/e|~czLR>pE1P9|aNk+h#T$8?\DJ-^?/ d`7Haߣd:/d[_le`ky5+o /LhdF)}xuLZk9Xg&wА]-Z'f}6 K{8 ]JqPG59UųikpǮ-b9ݏlt!:l*JP Z20j۫{޲ +y 7d0qjȒU@Fv]szi-&}ʴ)k1:8q@q~u$qkfK.s^1;rXa(rԺ)YO5 q aB tKŦ.y @)a]7S3FB:zA>æI:ctl^{rI֣,Wpqgucd*r^m$IuY]Qo4% OY!Yg &o7Wl&az&"PmrYzk1L%tCQyq9*\?{ײƕd m؈~,GeB+HE;zve$O[ź{wny̛d]^;ۜ}mB4!l#4LH1dsri٫vnTiLڲk[Ͽ-dXV8qq~wZ/?^١&SQI4!C&62d]:Sx7 lq lTH!:;.tg,v5 *6#Jћ5 .|"پkg`͈Rξ>cJݶmUm6Ȕtv|D",_aNRL:j[s߿V(T)LK>F/ѢչMxM^YE^8Ym'ͅX;#_ es'|ygIA?qii'5/  bbI.SI&7v }u~YCDBHƌ ZFUUBD(Djۆu_+B1hlt!L7 )T:(yY0 5k}ɻ_^]2kNDEY*rlQȓnq TiPZN̥p8 Y-XM[4LecXX|^{]|`XV26= ZC2LZo1$㫭*zen^a-nYukgЕ-zd-]$OrN]xauDkDu]7EfXFhʲXcbšbK OS?oe `A$nxKe&f6K?}^߾r_J;h\qzŜ v&i`;u IyK=ȉS9/L[jD*qκHW5¼bwB!o,{2f }k p%?,8ZlzAaHU0i`φwK͂zmְLT Ev>X B-ߤ2z؛q:!{I[tfvgt#ɭjK=2~֋5LaSrF*/?Q ?W^VK֞IjuyJ}$TbKwjvQԂ}/Ozz?Pqf7YtAl+ ,JuáonQ<__RjH:,ʨE(0+^˱})2Ġ5 o8cmkFS׷ kTL;dfZ-.n/C'"K0F]x>mGq:jY"k^ |[{F'ŭvhod gٻa1X08|=/qmma ;_ ʤ{W>Ug:c|uenU%sVi\QrB5jϛ2ٳ+v?"Ny׶&}y~\ov|v}~aaK!1ҩt,_O"bZFvddG<2+J^FV*Ei\UCNykmA`\NJ8Š= *O`e@.e{3elPCqGgҸKnAmb{I?stCz(R1òN";mv9))1SuPMg-\ɲ]L17`@pbYUlo]jw^.QgW'9 SVSuq8U#Y2TMF͕Z+JQB6gbz ‚\TmvSYc}mhōL`E}]~Ea2_Ӄ(+$~g9EZlR1EL8f{Qb@.EfEZq/=ً,Nؘ&jAxƝ˲"> =YD8QUJ8_낓:kJ2pV  N@52zְZ1,2 XVfT)z׽~\@@.k652sp%Sx?nלlȁ>˔]-PL[iCaM^v`upY? D9B9c땨j-кf7\ShzXH17q* N9Ih _bZl1VMYh0Q %ÉFBtx&taib'M^:w<.-%Au~KtX{VU`9T}W@՛3a VJ2|Gr͖|-;D~dvNRҪb2ӊExr9>CAsp{/C_hQAN XALWI5ڀcK]ZIJ,ٶsC!2r Vvy}[=? r i Ҩ@K SήFk~T*8j~N'0ٮN-h2oĔߕK$jT9&b):NhS:3E:<^:m29oUDtWWTrv, ŸcQ4W%V& N97\xMR~{qhaq` [ j\UT3EwC(R&dl(v~r&;mz|L}sRڅb)d-lŕtUZ൭LM@Uضbk9._Z-^%|'}/g:preyT3+Wa>gߒl1B2XyH0(]Z/V90~iY.j'W).D K')vXX>-bXoZ|R/m+G՗qesh>-I,h>~zJO=%2IB۾idj1j}}E ;R\Áʌo{ r89rYU0B.E_`rYQ&&\%|s>~ j(1WYY5H kZ~x^ۗ`oE_mrOJleWozxp]`mtO<1F x[Op=O[8ɪY¡ߍݛ\[p0C=`b#JI C5`2uGhnm73R&#_&p ݋nz9nCsi5pvN}Voeh}wO딯~~`6'V(Uߡg?-i q3 _^4cָtndrc__\~`&|1Y]j r΀;iN\acHY]\ʧgAzl/4.mOT7Nд%0 a+M% &˵(:|Ty>JҴrţ짰~aAeöcK1Vd+̌-L\O:2`ثjQtb12,X q&A2-W V ǬiSpBMb5Ϊ䭷9*4j3.* c~Ʋl)u?=j=j HV2!]&@Ju {{ʨ_0Әg) xËqS\ͳxe2LuFdjVe٠˪?໻nT)8uq ,֘ƚh{EW,@-MSw'Zo&jt<!D'_z‰jC4ee~Mf ibo΢8 ys5 bvH*`CP( Q59 ,#w5L&2O ,Qglٱ-kr\$ qlU\gzE֡h" HqKQi["pi"/v|@1PBp iA:ӑC~xKoPhxn'6LzIkp0]L@F'ctD _BjZl{tZ=6aD.R4P"n܂ݐPA*k;,>pht E\+c G,Jdn63iecnr)i,5Y;fGndZB1ힴ Ɣ/z>6-U!pf[#'BxڴL}i?`*$1"(em?j YUja-}oi5ig=}81-2UI4"*Ϊ؅yӸϻ_wۇP"t+91"qBJ64{Jͦ lH_e;S\YXZ}|Rc!J/?\(֣XaBdJ*)`!1AYBz׽p/"+xP~!>Üe0uѧ/Rb E1 EI=1i[jȴ:bDOO!Q`|٬ԈJ0oz+jgApUp/w\ͥQY16RA&[y[m2'շݡؔb]1@O b%OX@U+`7Zq((Dä-W+=. TV9EC_r^<sqk{`MRt#yC.;aZYouK4q$˿.\DIɔ6V1`1fwClՕY9*ufB/~T c5hV{a1a2'fEX)4 SE2Vj>Vk>V `"9 x?4褓VtOyiF\Oڗl׬1-Չ[:yY˷M UjȻ#wID#<ʳB!<9K7kٸ! x0<" HA+9' Mɛk񦫫YF~tH_$O`KT9~jNZR)d5#x톳 -NV2vv~"˟T:zаޓ$Obx4z}bpt_UuW(ϟD^Ӎ#mx!/A͆GU:ӷJt bj[oeІ'@؋ GxPdg\&T 39P(A~&F2 M TgD ^c"L vB!#jG^J`.wE+{O5o<&LI ccVi(~}z+ bO07ǮڍCtX5[QȰ!i} 68p }KF9+'z,ch2[oZdqo5O0Ah$k, 0a4R(x.op}^0VE`Uq< uȦ:[Mzp%>7CL$/}KemC RUD7`>jQ`b!T}UL CPE(A27]^Y&^z.FM1sh{]^cWvK[vx{dSݑ[aA0pk/AVpXB[$o "bDAal2݉gyrj .k LC1y}9*g DicD983O|'_* 1 r~IiJ"6{ṷ^4*Īc <Ս,3تKTz1xs}j6C{X5?_=<.>UMڊCshZqV1*j#yiwB"JrboF;=ת;Tk7}[+lmfe K]Ʋa6S0{l6W\…jɓQ+dOOU!NѵF?Nu8MSM !YdT_tuS~ۇS2܈:1k=|~ bCeX=VO%oP->wC+Β3/0ojq6ñ0kR8zӰ,4@wUW-P@E;]JLG qfRH%V\Ro7:^Lu{^2@AXNr@!.JEx9YCWoI$/ߑ ([tlB% $9~^w>J`\o>`d`0t/RWpf`\*cYixbk\w@UbjY" .V pb:=6xirYʬwTa8H lQ(KRzqvz8]gNXO%ʉfO=sy`Wݒd8Q7# ?5Ab$F)85kErlbH_xN2\n/eSJCǪY/n*5>aN#P- =kҖ:#6ES(yw3wYc~1d$+K%R o>+vtj9[54=U,Zc aVF>d_TԂ«N,Hk$X68UZ5igK7kdӦVYjAz%^[#pI`~;xțx EC'׶I},oWwBK' ixc|F z=n 'p%#c7 Z+zwIGN0R_U.xRq5'`ƞ.3N,AgV*;Ae!j;ʀsUGxh{|vI 6KP,Y6P;74^*Nh- i֘7'  / /eqq}7d>(-41 U3d=KS٠HR{]vGnAlΣwGA[6nSy #;AVz~!U--q∠i0$G3-&[svT|LMB[Q}APh^^wb6ZSA(Œpb[ۮN/btZc<vrsZ^I*1/^ڢ*t})8=Xâ e`y8S$jhYUe~8Spz \즮oߋKUFmӸs|9k-{Qbf(`tzC!W.$)X8b>xOQE #Dǔ,3۸xesRum^'^QP)g=|ٿ=Z`1[Ssvt–r_grI8bl U eڵ5Zaި"_?Q9|`'YW?/>t_4I:lP 3#f46@P?:q(Ǻk7p;}w?61tF2Ʀ멄1pڄ __Wr#)Wuo~Cp_Xgq;GyD>mlӷq^ܵe;~T?m ]j|&!9%mb1pL9v&מS3J ]K ۧWp׃%ΘH}IœbQZP&AA+>-#x‹N#eX ` ķiCGbNY/cY1vڶ@bu|zJub#)MȮ&UCa)0.yN'6qp`3&Y@_e_5~WuՏ[ Jaa%kDJmY=SkQB',u,Zyd+5^?c[ZBZ)gz6#d &[(sҋĎL)]jvԌ6%TmuvCKWR[?,VզzxN\y"ۘtMOmC[Nk#BT2ZZYd, Ӱ~>ݕ8 ( JJU<Ѝ3McsK:hj/e bS:^,sү3=>ׇqxo^GwKK[;|y&tcԌz°6nӬ! )Ayd Κٚ\3wSŵpWy<, 5`/,vΫTR&hEḱ~끸:%5LPW:fLHXF7J<…܃dKR ܹ KD"j}1eWd`Vp6 #>2Z##9Е]Ö4 N`Xgؠuutb8RpG _¾Qd#F#ń*Ȭ>?Ѕyf\ 5(w` M/`!)x) iRK mzPoM{@H[qfr5<6q!h/^C,O |I3egW ]P4ty0!./eXgxm],lh9-TB+gvpCՊ>vePNJ 3BmA[`Qe_jo1e ,nVDCU) :@l𲛮][l(-b%%Jt` ӎ'az.3.}UUlN_j 8qYaLMqf F,ɝ!hwߩ5+vy}WSY2#*e{;vljKJ%&j{;LnV&6B]g;X|z}-d7=/ĥÏDv{@{7й.0tt!]*d Y! }TJ_6D@,:am`gc&W;10|C -2sT8mSBcҕ=F)@u3T[wS'? TaO5Xpґu3doimt/E8#v|U\/c.5qac_k <%Ba)WDr2nąbK`}K N`5J.vr0,X#줠UZ>-A%*vhۿqgo,@7;K+G!LRUjq/n+XݵISp:D}RS!I8S#3]FN肦(jbFsZuy6[6aaآ4Xk<MK. ,?+:冟2W8c위i~Hd qjq7_ݳ3;U*ȫ㏪{BhR%mL).e+g+cnwHGԗD0xdK5j5G;aPXWy ogj#1K6<#gt}#yuJfzAG\Yd0/]x;t֛tw5m[Kp  ޥ-I<ωf eP3}E{fG))ұu>ͶY(r^xlR_밿ȯ;Pm bd*^MI6!%sfZ ~E\tx uЫG,CEhALOC3a>qdq2^ŦpXʓ5!9v؂.1o” 'C;lCzSx|z9T\Ʈ#̜?Mq%'?*m $mU h8@+؏fǓ1]8$E@ ${Uw7zlEՓРdTG'73:q,{~m02^m5݀B:xԜ=ĽVJxyp $X'I/]h\jh0Ad V>ρ/iN >%|dS#eXzCFgJYƐ>d+G-=}="̀` mH)2Vp2tTM%9F['#@Jid(v/H=Γ ){Et)(' @]gE;}Dj5TaX"p{+=t!3iZ\:@ X&OqMrRDsTC6i226;:iP@n#I qņgvҢ0=I/]6e$RgQ'ɨ>Qe),k+bߨ #Jp,VMiΟmS) 8 #'#8,IĦ)Ј)sty  |*7eQݶ/i`()6hr:Lcgem鈆'C&*R!3U]IN*^3I 5?*=U>K&Đ051mQ7Oybn(AZ0%,Ȼ>% ^uY?m OyrSwa(_dP8T0yҶ͎ =vM|2k,v1)$.'om¦`:-,3k\'^0<ŽE8n380_+i|f|i^&;,3A9c6a<Lݯ#9sa^^02y9@;xWp{ eBp:ڿ% 4WNEo!IMW)̋RdKca&]]}`E5?Pdľ'kGZjmb#iF#-Ǫr꘡5m`t_o$\ԌNXR}һiQ0K)Z:"/>Uް2ڲ3L8bE^N>Xb 0gV'ڷ\kbn`=֌pվPOUdQ.q#e[^/kTŽԫ/31jF =ѯj,L~|C%Σ%+ )#rf lFWI3D,9~uҰ"LP۽pXI9?jfs 5!snqkǤ+bȖ8ǟzY& Y _FM.H^0ZIfoڂ"5y~T. ̫72;.2Fk#K#Y,iV%MQq;;J3:;M$ce57i\󦱓X9hTM;Yr9Ҝe'X lASEjVoWu?Uc:8g'uNxǨv:7a=fwdFƫ^u=~ 2h5W1W?yt"-][2zvu%3bd)#~"w1{|(TrwC.B$OAm85$Ϳ{ࢦ0~]fSax=WCP]J],^!q W+0J.xm 7 ;J7pg\-G!&{]J ،lW0)х3~gHa7c.W@VU $H),tfk(|ů;\B *и<&j{$ҲY,!%abjHPK{`!@^:Q7 V.es@0ǺߪN0B6AgStxF_hWמv}*zɩO>xf3RrT G.e!K@(IlLeȈ4tY.37~]Wg`jj7 ͊ G#]SJ*ܨ \(* d.S?O% [#'A-&'$U_ `-cM%fuxڌ9RjT[>K#/2-dooT\U_?4Z8+';_rOڟqg{ԗj|ι95N_bb31ѫ_ ㏮z;LkrEFg? O %* 'f|w B(MMQ~SVit4iW+Hl>1~mlnu_id%yI^OqQ%2$fj ufg{TcDlD-%Rs:12hȫ@S3RRA##{@76$]鏷YHi/|g"( Vmxi xq2}UKNeijQR )qm<6!Ҵev %lOcm~7$\aU{l8GyBkً=xgnn)p'YQ'$G³EKu Ϛ4i1(x7x9pbg{ '8qhk73N6͔%ZXQJ%ޞh6, e#2$߭r%*H3Hu~n/"[륳WCҟp!`]^9?xΒd.M!{/:D9_ԗMnJ~uQ yK N)5;G`;Dȕ]pއ[u‚Mݒ=F\d|Kr7 #dQ5|?Sj)z[=3Ry}_sV07 ]CUypvK6>/*:5/> )vDE|q&hcsj2wrKy(GgӼ1'pO#5{C- 7DlI?[GaH~|΅o0j7qa@vq9؇QqA^y7(:?;GW\w3kV9,aP Є"䷗U'킕s1Hx[mEOG/H_Rbbww@9>Z!_xcpЫwyEə;sk<\8G]}gX S <;.Ġwi00Yg}k>{'e tJQi`RwvqYC1~aj,EczWzp߹/ԇ>[-[us[7%!RDY8 -wՎIt'O(.^|{8*>_BdNڜ}Ϋiҵu9D1.G+H~vHwGM;Qv%;ãw]U>g7UZ'!\H dmKXsA7i=dџ?BYwb[uy1D#sbImě{v[V8| q[^<<V.^a:*6̸^`4 aWr[V2wsO깪.HŻ-/^m]ιd( $G~SSGD]s/{Xh p+{e4&!gfr7w W#!3w1djxu]Xg`w'"i@Q\5niHYgaYղzZ#yF:iC;Y/rZ|_h.Wݪݫg|zETi@C2_u=L|lH9g|~n$Ht{SkX[+Ytq[;ʽ}Ne6r1UFfSr3/KE1ZgOƘuC]Cc``tn&{{?ߒUSv*.͢AN@zޑz|m%2V"M)zޔ^{Ҭ\D'_AG{0 rUOP X\(UP3=Eonr:qy@a~^yѡܐZ3 j ̸cRݞh^O]6sج,*=ãVXGWE X7sYS^9-so.g.l,Ö135L{/ZP'7ra,|cf6&6Μ$QOlf@B$r-p biK.ъi'a3 ]gpƤԘRF#WZe 4dt ^L3%[]8܀ xr\3.xd2ؓR"Z5)is b;m4h4MRMV}2Cp4^'T6S9]/-\L6h53T{jxԚS\(ETD>AޒdX(cãV;YlYr(:e,yB5o@ >ry.gYvfAE_o/(uts=ilN4^cᩕpYc"HjTt[==D2[6"w-gA=t%xYOF*yr.xϯwYZLY3 zH* 8'_ErLExj,fG}9 gȗ3<MQ/gΓr9P2\rYP[e%?HRhGfe.j#(w!PJL@ DR (Dq/>=.Ӛ󤤒F8]D1uѸmJ˶ctEd-lJA>v v>J(E[VH;|Es$q9=l峕se"aHEk{Nhklk4!Rc`yW$Ym(:5ŷτ>E&PoQ&dy:oTci 1 7TD(8C-zCQ~іF|mʤ3pjy14KݸuU^|`L:4ߍvOTv:-դ@zE392֗RD Z 7anO% 7'>b,t%XV"kr%RgNO4o:dmAJ9qW0nf-47xN{hG aeVq!o,,_Um5#6~pc_F׃=au,ȑb ]R={9}ٶ`ysW{MkF;yO~cFbEhE0OR llPɱ8"m$7ʤj}j7-dmfպB0 #Ivxq7bpSzk6p(*|9ĂcIƱ;tl+\34rMF~%=^][H $E..l€aeQZh8R)Gܡ4 w}#yZ@Nlk-pnSh)aEq|b } C&dCƩT,Nh,c0k)?6R(@=jX*ؖÒ3HJ[@E5XvX\%/\hGKBG'7mn@x~"(qyl 3ԉ3I]Ӻr`P[*[C95pWoxjc>r*PĖדڡTviL,E%qze,.(XSت`FDA뽢)c9 GʎaU ZZȐ Ff'L%A n-}nmJ+ձ$N(WD ɛ{€/鰰h JZ_o@hVDf5zA$* o9AF[%hIOw8Kލ\䮥c%U)k E"Iw(|J Ddho" 2LˀYZ |X#F&Iϰݢc> 5FKje4-F?Ʃy$)E!C`Ij(~s';1"m;uq((섈 DZQH Qo 9w^ IBi[E<ħ!7GAa[(@BxZ(-zrT+]tѢvdr ^{h2RjBXK"-*„T(@wJ~YZK5R(I [t!Ԅ~ PNN8=/ꙗ$LJ(klA0ђ䷢ڦo}|̑g"C3[T>]ʥå1<~ЯW(h-+8 ᖂ?I"gg')yOF mr*Մ99XndW䒒J P3K&Ўp (vVpP{jdR, %xhgR{ܸ|qHɒ˵'^;,.)`,SSeo-=2j_q A:)R'$O"ApsґWh%ECr z֖ ϙ+٥'CI7^gbF;Q1PCxpaƁ@s&,-kk[zJpMD"Cd-`4VKO &F"?S N2zi7"VR WEϓRSO)^C/|p%r{K;<) 7T>}b(XoR^G%5rXJ[l|/+6>yJ62P h4c@ӡs3.!] h$dPW9CĪ N`Yd`-?'PQBh_ b<ӻYB}C LNr0e{{mL b4+I(Zt}y MN EwI̢jP ^Ǖ #ؕ7sɬ"Ԣm[|FN?Ph2rRlF>=Pqz A)ULvW{\ȑAڟ1 0_:u~R}2DƢ̡|X賬y..dQx)}(h!gU|­vry2Xx}Uz8)V^ ig>ΤZJmXP5?<5. ̨!?"ctO~QkP)n%i6n >WC 1v0ʊoR\Z#ڀ&sjA;$OsW:1&"rAϖu& p (IFS:j\TJ+my9uliDjFp ,z# hj҂$g'\.J"+$b&Э-4_0ǴHk$-f[>hͶl%}2p>>Ntdıi ͝Bj@vY-%ҸC(#-F[zpkpuH$J _zzh&gXL7;Q`( ŀVP`XIeYXY qTK+Ô BYw,(%wcZ'{,n+<#+<1;g eUS]j,,/Poc+yA"˾n!qF0sՀ Q''\|¢іjC^ҦZk}6r>? ħ_א׏`OJs9vm~kCpfI9 Dw#COP_i'lrGa.zKJ^k&EQ"wm%jDMn1\Pz"+{wi)yLl@Y:!%a޵D( jd 5}<9{7)v֪bM0m!aqO,:mh!qu8>+:&7(Q{JQⲤ": *NNE-2~)g*B-O  '^[PSY܃5 z)V)Q٬SgqBYy.ѢD{X샕 $J$TR 4~ѦT0R @ )O7V5 ō^rQiePPo%x^M}R[8r( 9%P]̿`KR֤fr\-h19zb-Gqzuq- !m`"|"+ rU$EXXҨ8Q.ID^< iK7 aT#,7B_/+GLdK#La7=ʾ?|L۝ L !K[l_Fx< ;+KHnqT5nU;(MRSc-%m.8'r)7Iuxp}GqgRѦLA;х9/oXy6PCiȓBYAl #S!\tOAуB}6ܵh@y[;𻕯(UO7\|7^U2'ɧGv>-誁P0Pt)ƍ]rrp8gx-zB5F|)7$CB5,25nDIE$Vv ;3]%{@L92($S+rG =Y\Q;,riɚk&+RY6! }a$>eQ D.2~g)h\E@7F- dE i;}X~r ⭁'_- FN`_ywr,ؙMm@mcP*͑'[E.j% rᦦ;@ctj' "^u喾`t(vE 0b@x4y!$OEZ &ٔGxO<j` r`{۵|!UѢue\xy^`O(p kE{AR$c[គ/rG05]QnQITO$MFt3[pcl-ʝ72꩎AfEu|լC ہ䫅&_UA[v;IFY-A|vUÑHoR {?樓Jw N`ڬX[{d5|QEh B^lm+%7l (1RZvWO9Z8.S` y@j2SE:B1,izᱍ#x2 po\gp"ӽC]@5{5Y#" *b෕NK`2'IoLnUb!3w<EV6RG\YR Xcot\E, y);)J~c Щes ,>fnxuRC&5DNڡ?z6s߀9@[K#FZ^NkwoٵY m Hԧ1Ngm5~z0"Zk%G"V7bN,k I "jX@(ԭtX9`ǜ m%6;ʪoդp,C{{t9ⅩvQз*EM-D[V&ga4F/54^&ms`:RorF y?.jٔa]nf=*n;O`DctZ٢tzAVIɹ-볪4&ƶb+nlu&R]MƘF+}byA5xBM)RCR<( *?!nzCa8mU7 {I5(' fO-4isW0b l+kDݟ ›~1Hu;;$٭8M64u=- R~l.h>ԑB'-`kr_\NVIP7ZsU4Hu˱~peRd>.-hFl(-*r|~·zfL,GW"MYhhf&m.A][L>W Wj>K{$BG48E&kQ/J"4$-f̟t|->8:ZcFW hͬn]%$ܱ֫gqKbxKQh):d47{% !Y؂Rh2eY;kaEz%(˽%-)Y[1FI/&m#u\x)3Ćw{вH_Jb!^:\t٥{ROmfVB1,e9"?-Dv }qQ u)mEx[\* MKZQ qh'^`VA:~绶_,䢕>i>!E,%Q&m.C҃2\zvr|[wcj_zRi4~M}ӏAvhQBfM-{x,dv3dI|;my"[s}og#?C!IYͰqM[|^j/EWmB WDH'q'$M>PF~SN P^ĉ ﭱJm+jcg H@Js72o.,Ulbv-)!֡| |D @[+2*4hV % ".;>uE[vmkkY ܠa$B%A=ZL/simI*][}DxD.|gĉ<1bɖn^;纺Wi'-Y>D jf@4NhK+*3qoJa(rzõ@AoȀ0fv8=imJ3GAȫͼnːr*bǽ":dT ,sG|e_lZl=] K@سc%e>(= 2o+ ّ0ÓaNG~ \V.|ڇqr̂@ݢD% h p󳺥a 2 {0h&0rZ9&Ͻl8IgՕ{pT2\̞Oڂ㷡[]Ϗe#V#/%Nfj.wu9UrպluݜF[Ȧ! x !hߣ[.@U/r~{Ge3]ȝ:ǩPZzx:C_賛aB*AЊK/jߥ ӈ^ Blnul⢚ٔK 9#ɚfµjer .=  %&XC"D'EJ}u~ myOɋiȭ*Pnjh5.*x{B$ <@Lz[lfcoLzg%QjE]ԢO?DpM`=t 5B=lD &cKR@ kmI1 78#C8Cq(nekϘ6sDM_xȘQwOQp*AP/qniK*A-"7I^n2p<i F;+vY `:?{jD`%s7V.27Ja`8JglNo3(`S.S}%(;䞅KknNzvzjuU]* J3%PER>Oy5S1vuL=xaQ}Tf P9H3vpu~>a4R'l%]ZzPm6[L $m8|.oĊ@U, O̩jyYa d 劜^ڊ-+-H'̮;?&N@e~q7Cɟխ +k-C=o OxAD/%q1n1M Xog2\B{t+ňRNtTD{Cwq5?֥^pSK&ˋFz OPv͑D#̉6h;sSCO;gi s -8>94G_e2 :ldϵ\~Z=`)e@[\˜V0rPrr9jQ覰>I5 D<_l鰴`ACž7q/6HoU|,n Y$HI(ՍTFJ5z g#e=Gn%4],cNKBس@n.!^_\..Ϩe߼C+_5?:TjQ =H  @"&Ž=:>J옯A=¥CVb>@3JiT $04DEĩ50f^w}of w"8T~QPhTiba#V> 1+Yj gm/mhEY?ט/ޤmY:An.ZizdGLԇwkԩŭlx cNkk 0J(@A^ #K{3 sQBo7d}6S\WU?{-~@yf'"O"z6vD͜SW%&eKHgJѷ`ałkH蹖y 䭺VW~Z|OιBS.–&]ŠD7I !SU:]Z1ؼxz+ޣ~sdAKP4]Szs oΪn5J@d贮xsbQxz`JUCtȓds \:GcKGYw~mT*G~^E,g`"<7WZcМk{{ : <;]؂X^3yr0ԡ;[6`ltte22Yd52E#ru~_ZVީ1 mOU xt8ٙ=(nM cV\g)2vcàW6ϩazOL8_'e1ryZE}Fij-."QeYZ xShffރ_ߛ X~!e; H~cJ`JԺeUҡ@pUHյBX?yn8m 1zxw^Hnl[v*(_LzCSŠnWfoL՜aZlf{ ֘11,Ayf ^#g+ᦢTނ{AP]$6G.=qzQ'ܒ8=;--K 1TD-]" g%U-]mA>hʐ-} >wM?ٍyN k+eQ*tDo0JsgGJX9PL,=~D]6 ]k@-{1>@g5hSkyI&|.t'+bkM8rT~-bY'7\/!jgp[S:?[9~ħr!nTl--^'>>x%1`ͩcq#?!O~ɊWiLj!'+ekk,i o'<46]HKV!S'u{Z!K&7\3YVpP0Ef{AO's sApìP]Сj|㡯 {q4..$Ջ$ RnqCA=kK#?IJ!|dʬaL+Mp_յ UAɨ1Ԗ[4-X-X62^n‰%ZȄ-hQ`V!:PO~ѰN\p{pV{!a+j kK=(AnaoJ^7y23yiR!@OKL"^ pW<6TW\q}nc746(Xx[BSKQʮ(`'m*ӢUR*>+)[{fP$11w~\Eh,7ǩ':@ޢd_(z yqS 7`V𮡍pZZcZ@zΫYǥoЙ-Ӻs,thCE Ϙ'.b3+!lDPLB"U[?&55LRN:ܮH1Z.Z%)UUªAF/CzY8QDY1Sd[A\rȣ"UO)S8᪘ x3C;sV˾^!IV׶T.V)Π͖p+M^6vVU#wN.p3Ϫggl"ϊ&3;,Z0KjiݠAq$c:Z5M_)\i 6| eC#=\h`E Kw齔#K^"D`1iZus-k\wYǭl>zu{tjQ{foࠂ0? MnNđce!>; btnܮ(> ,Un,ojQʃD[fZ4+̵ȣC}d./>tҥ *բߟC[tS@B*DpP}v}FYib*úOq+ @:&rŬtm Q Ew̼NUjFYDo-ݢf۞IgD,&7C;+&h σ1j`Q ,6ɚ^maM-L3F:]U*nQ;;iĞ.^'t!f9I7}0 (J#~p+o (=}e-=$-.e%N Goqrge+;`*IB sn=I@*7S:2ߝ\5W,wTEGmy-= mq%C6~gsm"S-I<25_l\&ş2hR(tvm o_'&en*M+ͼ@ĔlE!XlDy mD(pA*ӰB@vCx5=PF)FE~{Y{Q65WP6ffKNTx:Z:V^.'v” ,'菕zb,b%teUmaCNoo4лAv@ædnW6O&Q+ 0&oWy\ȔB `UCu7t%Cf䴮>pKA0ҧs4P 0_+'qϵqo5mǚ;X(%Y[w#ѹ,Wn[D9WC[F?i~Nn'p0 TN7\ ,[)t`,C)tYUV˻AqT#C)-3[˘`k23)G1_c/dSi2G'}O&y2뻶(kXdȧ;y"ZLhKp^NhpTBtE[.&u'ê:!S[@X[99Ӣ([6jZp, KV6ͩS%5 v1[p:KNF Bΐ!@$ d.4\[shibe]@ L^Q+]\I~"Y#xO'gr  S>˞w([$VxOzE YtHZ\˴>C= n;Bx*Bj :{9,{5@kҟ.27ڍPO3=*\`!C --n(Z8]g:ttIa#mtvNOSbmMg(ޥvP[/6LJZJt~ԇ}̺ϽO 96E#WGHy61d{z 'jz `QAm"HSQn!oa3Ә{pP9>l~šչqESI-'`V DʤyK1d zޢhU&&Cp4 U0/W.xvWa$yhX|8qEc8-2Wgѭb βP>Z营xƞ 0%5dsіԑ9<4)t&}bL"Zda .*)ʁ'Pn:Ro'K +'r<1{7,{th2>Eg&"& xr^SNS/0'^( :*~V֒ D >OnjZE>@hEoaEw;2ֲm Tc{*&C%T]l|Y'xHb"n([:]k1ђͨk^O\cPMLna.;KiscUE9愀wT>8Pf0>-D.`D[iZʞ`c%Tvapa10wF]G-/@ӈ_Îr^.mǣ[KAYD!IF J M)6&e2+3$Q8CEu-n #j7Mae@xٴ0 yaN['=QP víoI4Ą[@{-(9㉺#PՕ 6.)ЈNmho{ک.NihȲ8`)* Szv m4[^v6̩amVE{p& Tp)?W17\Zȟ- X5P4Ĝ\hqy2t/0h;Jj*\)ҙ͚ՂM Vm d~O@H>jneXQ:TkJAs `O{n ":}zңKetH!>(Zcޥ-{zh >i !pHz`|(,q0Q dWoH] B"jFܢJiSK8 qEwE'A]!Kșu=P-nΊ@!4h귰84ӡ 4Mr'Vs|xV9a&-ă#-H0$'xH>BmgQr倮dND9f ' :ŅzE3z@AEz.{[8SKyE %EV!Ӓx$7mdŜv o9 yrFN8(c]bEUyw[ 5dKmY>i ȶڰA`N-9pobI}׬$p9 7ܒLFcuh"[߱ͷvgWJ)p$D u8stQD^)pAX f<Ά`$Ml|szq)=wJF^Q5?0@7. 怖gvj9fY< u.H$CNjMHR C6`5hk=*n'",}hJ!EK%/eI'e.6 3JЀCⴘu( A.6~H;)=t9ͅ'3x:hHqAK*Up%|NmO=^W轇A@O1!R>4 TGrIZR`cg66&eSԾ_/E#7DvMo1&`_JqpdfF;MOF6 '"xdIep\z48s z0gy_SA`,Mq*=R!]r"nOOdȴһYd+C󠸪 %?=Vp/7)t}A]=YڄF'z'A^!~8hYŕP쑦U6(cG-գ䃱,T2"t8A8] iO.{]LcJZlI˶o.{4,K _c/~'b$ tb-# މ)#uDҦ,Rբg9Lרn[NeL4Ud\s:T@糲{%$ ;MZ~,6鄘JCߥsܬYZ6=zzՍ2wO&*U)c>@w.~[P:fq{8ܢS9DŽiYSsuʨI٘YWlh>7<%@ Dr 9z oMo\"@Z6|Rg`%Ex@]=Oي7 Ii;3sePCU p&_[N*Ukf7ZkW&O. >sʚh++\Re-sC|"j+$uͮ9`ȫN왖ƣÉY S}U9CE?zf% a[8<遊!HpP~6[4ByF~a7];P`d-!Igd# e]6UM81@ףoa=3ts8+$5]L'?̈́o=T$T&D= V[9T`c_cԿ9ֱ-- MkrTN)(V+F9&i] W'ڲ?=VuhF-yZ V(l~k$d.cB/'!Oiiȕ<"{찲K+*%qc>DR?>F{>SȦ]uT&r <&D)%<*bvA|=nd6eC!S[R8A\X8ďOSat%a:htwyR.("#zcil윥OnkyNuT(~D8۩OptM=')4tw/mYLgP\<p/yOEc+Ʌt a)3rŃ+:?sptJ&=)m6oEA%;M&"K޳Awrf$Ȗ ۛCG(kyN(ٺ^/ "#P fPZVj>w*^НnfJ%( AEWjقCp>WreQ[N|~0Ѐ#sьF 1R 0@~Z-Ɉ6V4@O'ըԄt^t7A .֓-[6]7D+ONJp;c_>O{A, ;+RŒ&Ru$AMwIEqZmA{8h9Z4/d pdՕ\T}U-p 6C"XWz2dOڃ+j]$ȳEPz; (z@˳|-bǣGb­AؾRrH%wYpі"4#[EO@z%nD 69Hڐl-/R; Z[S?yFSfA{-jl"oq$Lֹ%Q춰.&+hD X9'Z(kpLۆydKcE7nϽ\LT4XI L6Ei`{±^ήX[1ք,@ yݭ=E;?;)H2-+'L(;i{C-hګg/ [.y53, %>"+䮟hyT =۠bN J/l$#Q*0*'M ߂;ڬQߚjl1-=94AA˧Ǡg߂ζES^%nmfN8Q f@׵h@Dr0e\ c S6 5ߙս*FĎ9Wڍ6$mm $N4/Uz jjd [yK&V; 1 |o&9!NK{P4{d8V?x&5qL NJ|<V95Дm }jwNX#l|,@Vzڑ(%PP 1p7ܲw" x~>9ZdI>5:ԶSs =8.bQB wezܷ@k }-ȉ*ZJ兏doċkFQaIM{bӃ+"PAլl֡E-G1Z_ 4 3>::&/^dp,5CHSD 9FE{P, jV~:Ʉ~ClN,АB[5Gn&DQ 7aiX 597mQܻO~M}w0`i#śK cyrj]{̘+{7͕]5zXYRvzPsojG&-f˹+X 5cS عzDD[8מ[ɨpLnRlELN*s`uFPpRO ]a"i-Nwk MAòђu_^emCZع Gw;k1]->rCZ.:|.) ^GVPL *tX"7--%:1R+*gHA[{؆G&ּK/;i4\\o:Rq~hE8L5BU~WZt`sbHM?:P4L!QEm"oB0@g$jWh#*xw,T[n\ڶY٢ jh\F]8 W71'I H'*N01vN9E$M݀OFY;Ɇ2X|! ?&OOK|R aĺ;DW;\4 o zy?L6qw-maM'IUl\һ Lб/b :s .CCap?&{PËzZ?9uXJ.xk3 h+{R6!@@fIOLԂhiiMLns,Ę:dRNz$<0f-ݢ(zb@^?wZ P=V',Q A.#J1Q@]̭au+.(DjBT22iAA/Jq.6g|ЍkY]@9>+Z[Jkh(?;JGZy>x.[-݌̺tͼjٿ@_-U˱zN# :LCuB,qLM];@:Y "nK7\R r“ dPj ^˷:pHsO4lO"\UQ[g:roW@K~.e&T –B,EY0Bi%#-Vx/ᖞ!e2z ?F_<ӨR'wJrhֵ'r>|LCzT̖h  " x {kE&VbT@;],`8M%r-kLt.ނ)y=#] =2 f-vk=͑[͂2/OKAI$Kxn=AsUkX"*ZݢεoT΍]p4?KU|-x}bz` +736*[5ӳП]pw2ש!: ʨH 6ut >1[(+OIfQPU4\N#ݱݬpqRmI3cP s>f_gPĨ ^ ?.^ɮ Kk"4txp݂&,z{Q.J1:}tpW}/+Ck`(ѻXl`@E&/ ާE!7š_Zpe0?]Jny\O7edB-FBdgmoVS[j^J='2J"0A!> ;$r/; @G%[1Ci5;)6:N(Cr q[ϡ |P5,-H~Fv@'H[T~1NMY pK@Eܜ%}x&rhxR(Z'D H~71{P6#zHJXǷ& K{4||uV=*PTp!h*ḆtC^iL^R;B]H[@a#~u'Ўpk?L[Ը]B/ 2 cch/Nܓb` j6r1(3Fr[?)#,D 貍xýup Zr {[\SY}ַhraVFM+dY%Py/hݴ, rb_[ #q[O6h#`  ]2OܟWN@wاB yQrikV}r[XKhG?z[;5ɽE <]} [xCD'ݣ9 ,km@E{V-^Y M65;{t y<%Nu8{r{piL@g5z4hwQş `D 9>)-}F [@[ž[y;@կ8~]ě&w$С;Ene˜L5F [Y\~+ 3҂3`;ֲ{ըi)dIVz37lxjB\:,Fr|_t|ss]s0;g/ܟ-;9M|Ʀ^JY.6LЁ:^:A@zt@?i\k ,EE}[əW;B>Nz _A>@%Ia0D'\Nû{2 t.;l)rC) /_SwEOƥEZ%E{֗*"|P_:y]-վE,,z ןtA+b`5K"a @֔pol[sp at=5s_ [|sd0a#O[hsmF>{VӵCw*׀LwfJDA<8pwjX H*@:pCoP~[6PA<'<8z ,7 sKW t )wS_BA#1tVv/g+Og s`~^<|nf.fv|-;PHtuLЀ uf18n:>“+t?˄9 y"LbtJeH!avg.*==d፬1$ =xFukŗtmV`ehw30p\Oqף*?wv>= dN';^:A= 5^m"Ag7|Ksi =>Be4b@=F!xѬ JPPD$ &Za+M1wD=ZHۧ/pL}:T?kOd9CɧABgmn^ף<.EȐ HMf'H-..|,/Co'Vg2F+ŋk+iC6Hݢ 7XV^.JQ*: Nc<$O}LgpQe" (0f Z726izg]lhBB[1-}D$x7gM?FQi)&ϔd('oD探Ձ,B}Yg7aԀp#Pbk1 ۼ4SO=:]rW]"Z ~ֻIԁBV<x!*@>YXPjA?0{wKwv[shưYFߵ͋*(܋ AhZ֖³ 2pF d^XVϟ=Rmb,բ<-.FF?]wJ d2E[><.4,ȳX갗9h$uǐI7 Y \ p }ז i.(ite_%i аuX+E IʖP^CgMp 9 qYِԼ>rJ*@ @#u6^&<ZH_}-w1<FZɸ-oH ِ۫r eV5wnny%ȏcd[]nz9yb[mz]̛GpRpQ'  !VEе- HmVէIs+`YK .Whˬ rV! ŌWj N`o!9=$$ʢ&`Y1Ahѫ\ǓNh28%k`Maѱ. a-۾΂/5'P] h 1fհ!Zx((&@d4[@ТxB-̘o , ;ˁ9Zt{hk{n<º 53ZPem[ !t>a7;B}4nR\ŚB|w F $3qnHlzHQmGau~-iE®գsV]CKuS/A:taC>؁ƛ=c/c.PqrAiҠAsO}gO0.$Cz(i\`Lu"G 0N(?啙Uϝ.y&SXЏL[XR:AMPUvG)-㨵<6!׵)"Mbf4&˽Y_n!yY$=d@^KJrﭱ^*5)M0ѥرhj%dNwٴȥ&+;Z*-#+TW/46*[@QoeP/ 3)܍K+r>*Sxy%5'n^ Tr> wɛya7ӂ gN}{zht ڡf'>S4hh uv [|VT+NPTk[Ȁx!=~7uި|Z<YF2vyWh@6}-@?sdK)p fv޵zϏ5֢x-˂R szPave+? СbI'd Y mpk<L2m]z8/'A܃tq-n' jIX X )vY9o% ~'sb40'lA` YS.}4S",=@b G `3(L7q̧pugY>RQb-oE!pE%Y8pV|ne6j \OLz u >:gxl/kcܥZnݹ'TjGdZw55xfn|bv |t){f@$pc|n(瘹!ȿ᪾T}y,_Yd[HϹ-Ҍm2SZ|vў~n ,F`K~ILFμ wP m( `y#hor~GRh\GwKxl؂ae*O[ ؞ERg#lLd-bNdMs)~:<^9H! rVr_&Fՙ]O4=åՄ SO|6e=82PWټfʞ[ h)Q,.ڢE#bo5r~2=mo+ƆE@Rv^jޅt@֯xV:mJ: $!Y Ʃ!Dd+!T?*ٍBBb|j<Rz-:>Cm?WqHma0'Z˃?Dkz,ZvxigVO:1< C[>Zs[9/qXFRZiY~PB-SsڢBkx`)t1%86cҊ:? 3ZS+kd,*=YTGFhdug >kkvY |gN]\ mwb\bRcա•m;pn9E|.-`􎶌RIpxH.⳸g#+ImHF5s= gV>΁|PWidbD- d>[v_s:ԫFZExƁW-W>5&/.O妸nLn%`XQ*_V뀙$CF[AZ<^Z4=;;RolN8>pkH}C&uYe- TPzb-unKaCP-Xy4sK *?7d/׸ RPk50l\n Eֻ;&!KZpҸ>j;ڍ[WIyw20OU:~ZA籅LJ6jdtX=NLˉԂ(X'fo1삸2 2R Yc|-#┚-кppw2JL=4ZdŘ.dxΑW!XD0(`sZ Āý5 N<%F-踴Gc Y_piI@pdr*8t=ļP!R7g FxPki lóʾBАԐK!١Q{CǗm/U[h@Y: SUOt+[l1}2[٢ÑY 8I g2="M?c^t&FKhB9xKvWg/mUu,QoXݟ;DSQwȢ^݁(:ȦS Lm,s;֢bnŜ⛣q{cwGOo~4z!N-q>*}"}^1eIbn^+lh:hk I%1E?-ձa"(g2O{ k@I m xΖT [nL%ƂWPz2 VPlG!M^B)r+_8IJ<WJ&y f)^_LǃF#ROW{q}2ma5ڮ)6J=V>0&pކ\xb½'"v v>ltJQKN7L)ט8[0K=b o!Ӣ& ;\;Ė]eɷZ;(J]z~ǮX-"h2εdLdJ?Ol6뎶0Nlږ,f K'`o@( +*@- -_dɳ`ܢƍn|J"d3F\\ 6"! Dcu;oc "r'54qaOą >G KADdiqnECC}nXr )\gw2Oȟ$~uIխX+ȑh!L rR _s (v{? ?ķ:Ģ B#zX¨ @aPs,4/ϑ-#yOd$wXϙ-k,}dKPG.u`eʻ)R#k!3f]}g;&{ =oC G:v 9߀o(%@ H \m-=z*} .A,-$`|[ڜ)ctiBwU;܂ؘd08QE.Qg=WIVho8IT܀Hﱥ%R^aheڭ6zOP--c,MXHc.7\|TPU@s:ϡeEp<,7r߸~QH뽣| akPٝcm,H,YxL!Aң,;<79dHz"iQoa`dUGxYӇFX a¬y>AL'gcٵ& .蚯}M~ny=ev!Q+fUEg{-8{n3gQfx@.y72ȃ.^T{/$зǥlK3'Ҋ̠:pC[%%noP{'hy5o3o-o^u77&PZ=(D[T%>7wtl_1:FOB A PwCT\ n7 vZ-׶}\=ʱRR?J`o[H7ѻs_!ۙK`@yU~/咼^'wKzeLzK ݠC`SuFn'ܒ ￑U7V YwͿR6?tz\JQ":C b-f#dj["V^gy*Rkq#ˠi}Gl. :- EED1.V{yn#xDOÕl%pK9;+T[, mk>;Nk.BiKZ㳶Eg.B/j󳸷i^^ZVk-sɈn%I5a#[YUceHQ !0h]q)./h*NN D+ho @V=Q,+TG+{3I=O9uZ67-ⵃFܭHOɺ/ FpmvS xݹ@ Ě+h`,(_u-K?鰴Y3m8~+ ١䫎n5/ 6vsVaT΂.zIzy(ڮƔd!\c~2*%lv_<(|#lE=Z"FԸQrtU`&y; f<LYmߟy5*( ~Lf3z?|2?LyVPhїo's'Hw N7ھl/(@v0X9_xx)hPxݢ7u ՌBpNeZIEd G_c[-Nx<L| _\.MѰT tGKu SRWV{Ő ;>qU0ǰ@/_\\"8cX#-ExCPy3Z66sa{lw1ev!B;zRpYPst߇c-8*,M)hnA~}b-W6hIDʏ밶(~0c3^kxmX[QymMoQWV a$'#PR=6V_EcYtY <vn uK LȖؽEϱDUD5=A;t@pr*sT7s%WA %D$JQje F[Ơ A/z_P?fƉxC-# ڍ8p|㷍)NnyBc~mɐF%0x%yk7jG WE$CWIYH<\y5ck- &`A#/+ɹIZ}ɴ+p$6GҘrdphGm`XW:E Z$'l!ww>+ aM橔ͼVԁ/ڒ˄d0uDkYy Rwq<[$i{ә ơ=]zeY{2g&LpH`o }@irpu}Nnf 0k Sͭzbw Vh3)O!`م4!/jK텼b{h@mH@A: bf楃6(p_U {:. Y3WϹ >v1x- iY)d^{h9ܖUi>@ڣaos &Dꪎ[1Ev|28#ge/,h}yWT,BG5)`@mj->֧X80, ?EY-z *%89-ZFWlw{y;k ͆>/|puAXȃ<[nm3F.y( sD&o6:kd:چ 0o}DN'Ϯ@r6T-k3/58PPgq`>~*įe,j yB@|NR*t(]û^^ p݂[ wmFw #a#r^~Ÿd-dPS l=KŦeUB;zSoԩ |Y5P@b'~/sA5c\qz1 BKp(\Cxm9G(B]VR镯إuj "zcK6 `FBНʂ'`r_/V +Y\ރ|]ȳ7K8sr%Lˑ{5Z4grZ/%h=Nr˥E<_..f JWTqjSAE;.0ݏS3t, Zbp#<ԼƉ//׼2h-()ǩh_ 0D^Tkn( H`m)5{eU2PUHQ(@q:R"ʔuўP+d=/3[dT"8a X)s K*P,'`~q?:.YG *E-1XW:{գ'M˻ bP{! X4p˕pLP#ѡ Z9t,L~-tPe2<nZeY"D%m\΅M<6q˒@v,P(3L-;fD;Y=kBeBupքhsĥe{z~~] TDl/F " /(S٘=Ad7/# ]wMuȤ e:1",|٢1K=Q6EDLtUbsp̲{'fȘ}-ux5sw27%8\mY\iξ(բL4v&dp aFio ;B`ѡ7` wEZ-eUNK'C5'BR%Nmi_fM??^-ۅxmOF/MMj#dl'a;α~]g16_%q5 C㑂 Z+uhb;%ަ,4ʠY]u(Մ-le95}|Řhܭt6O5f;N.-cJ-)(60˷WZHl..1ʷ?!IF WN," t򴀹fx)4-SPZyp3h0?tX)$A`3PŷBEY 83ɂC3]x{Fk+lxN 6O oJ@vH#71FwBPاqqǚG~Yݟ+1vm!Q N~p1^"(,4 7e pGcg+,Hm(탳H@PkQjɄ|O%辊j,[P9F1Ț!6N*gyyAkp<$0t]Wg翀q?n}8l-p w.CgRk{) J}J2[ w! ag+>|TZ-u=wf7+ˠs qC1|-i<3 r}["|7*8mhsZ4;@s)%yz(lTUs{P9߁Uj`p>A=6iL|h a7SpmE tQ-Tg}s5EC3.-/m~¥)Pr )I3@s1$8.+]ؖBCTP9tKHo*P=e'\bP2뻶-L] #=\ĿnWL)dlXvX\QE?nuJ0!40] =r*o^,qhKK rcNmxmKcˡG哯n\ ly ܜJpt/NýH5e}f 8p X^kg3c)-Znf̛yC7|f$(swxTV"S j ekU5d~Щ7X )yiNi$+Ύ?hD`(?2 򴸃e@ ˸9wD+{~ ?<5pjֿЀ@ c 08Dw&z|%-FעPXP|0 GK=>3>vP.*L;\G?.WϭzX >Mm`^h m PyWQ\j-2N~"s3̀Pi"FEu@٩j3d`vՌu2\lKvX:x). @0LfxK]nY, R9E\Z*P-guIWf4Eir+sKMȳ ؐO exi ^`pkw\$g,kǙ|ryk2'RMGMTAZܢ,bhK=\]#ƻmAAם\` `k{{.g^Z o`6P~w3""sC,[2ng>^y䞛;H6ך|,:;UwpD 'gng&H|_\Nf*YAMȈ!ܒy&} QSgpS `E;rhRm\SMXi--*?@Ղg(pv'Xho>XBz-WT> aQq&^":TY>4W- -xE1f`绸-&|~'*hbcZoPpE{JpQiGD[P/ J^d5J? 53̕l/?g v G:Tg_E4 !?Vlv'2 `o/άiB"`~d #g$3e0GqNZG%D:b n軲#m #m]h ׭ɚ9鰑-6yf6 f<N--,4-1e8홳IvAC& Y3Bϡ-5DYy-VxwQݶ!2^Vy#ϲ*ʣk_!UH*84w[ dJqÞ(lΙ'sʣD:)*>g@˟poT\y\'F}=^n* t%wHUT|OD"*yyDQ~K0IBɧǤL ^RD<''yE2=QMvX\3Gv,-ԦuhMe:qx *,Cg;9,.[| B@ [|VmԐ2f" i~_710`biКu9)#a7njP(h+$#JZ-hKCjhÂ:iԗ9iM' DwXZHnkmawX8LpauXA;Y|(d@_ċ9XAA˕@rYnqtSrbd9.ɥCs`HlP4C B-صel@'$&dz[ĪH'Z³ 8bEZE(J!KV˫ch Y uvƿ[0Tly 5D+cmyp(@ǩ vy}j Cl:q8uOLy w (=聭# XK+*PnA !nI cr=`Z;.kG9˾zJ 鉶]\1/ƕ/e,ff1d8hq9)'0L0ڠ }JYk^_QB2K<m@'S,bP^o'mdpHݯP(%qu4,15ز}'2<|69(H]4A5)ZkzOw ƁP@i`vXF{{HBE"uM=ؿ`o̠N@ajsBa/\J,ޙ8 9xeF}h`'H;ynK>KOeT])am}ܒ};_6Ok)lYr MG.cma@\BH42.R>Bc!{];&K=8ӃjA\ M` ے>'Nta[>1ޔVRCg-Z597Z:~[`Jy7sM!@5qk'w -1)0b nQĻPW"=O3Xs.Yü;RsnW%rkBtzؠ|p 0V>2h@ ]e:urkh9.m3UQXpK(515FBF tX ~B Ey5A9Ҽs+whB- Ď#*?[2;1Q@a 7xT@ޡF[ B^SR y3UK =;< 2o#Hs[LF(;@*&ukp)cMew9!ϱe;BjܐTdfY‡^PEҝ #7n^ۂQe4Ե7mf.Zz@jda_d'7@Ԓ0k!hn9PV `QfSD"xSZlA?[99*86`DC_:;E:8밮+e-trɸsY6ճKq>Q2 3LsY7ueߣq ^.=B1Q|۳d샩.Y1JJB .+9O9zC$7\ނPTSѣCV+ )'I#/nsEOq2.ylK Nq,xjơޔ :xrP W؉OP h[Dt_e6Zolt"8kO;ܺQבPI~ZX~q!tŬ1K3ZfλY6?s6K6hiuZ@S7kGJC;sOs0F8z(Rn}rH -%CMHe{ /l* (DC{Xj(ΞזjϏa)˂~+иԑ]*5$$5Z^{3šlI@̴ac`-F`n[NT/تȢ#|LPܵI'oEu2|;V;EEfM6NZԩ!oPr0dA-+F~C}mݔ 4(=-|Cp6ЇBb75S GB G -pK|6lw(mme6\ STE=/ZH{%@oBTD=^[[ 24[[lODK T՗VivV ϱy`a6"Q ̡K =J vp} 4u{,-`ҏ,0#ANAxfP\ j<͋ O1ż%B1'@ 30Ҋ +\*;|q1+a+zvr7r$ˌb!ox z _zG{*aE΂FB.ӿK;*zn€?ϝ\:q q/KvnH "iQ|$e-nX獬B 6,z`.qf Vqpb~̓FSk6B&4Q#3:lmцy vˆHt3O7vƅ9}fvf-F1ZU62 '[1)[61KmjĻKĝbLJ9Ġ"g kGe:6^U=qtw5iXf%=̎;o$z0[ڔXׇ" (\vpy <P3.9HA2%Pq] UՖ[Ƣl"pf!Z'^*w:ȂVV / T\L=P@p( 7b'YӰh2o,so0FD`# C!)!m/p {t||R%~d!Z-Z,7މO\Gʐ:h&=`aKK`/J;7\–@HxPHXFz:D?i@5u֡&`^-jAK脜ꆄWBdsi~JT>B_c:9(\hOc/sX]C[W+0* U=e0:/d pϹBS9:dXbg}-A @h v o?k>$\˨1,mx{P6$] Ms",>Nrvc圏ю&>зj ar>J=_fW` RM俐e?p=D1qM1Op}!}q1CfT\-D3\[zQy88 mui֢ ^Z`A>-˵EZ 0ճ^P!{;mGC& \:Dʓ,EQ.CžW-.hA "ml^3 9Vo%IxfZ1GhF ͗}ˆ~‹ϯЕ{V̜D6]+4z*Tm?$u` u$<6hW͐/$gۢQ ownÄ!{ʦv72#'$Gt"k~zh~"`fzU״a|@MDD%K2sRP P$I$vp3O<cJ<;ZO鶥|.mK} !#=4j7h LF=0%Cm8_f,*"nwUȯ0*fF$.H`o(y>aE^w@m\V^!d98wx*$~.%X] գ?oY[_PtDvXS(R*Gǝ³,c޻Y,+Ew/R2LޕW(}: "T(s/yDv;^)n8F]%Mm10Aau f n-Y>x'Ti7ܑ:xBk– /Q+gNQ At`U&U3Twcc((;*t5BW]+yWh $!$7  -~*9)Aw2J|L~kKYŌ0㎦S$EtpEEcCڄ I!(7S|W(b82E0^3Khz!:1XM}H5 #R}TQ Rc\08?Uۻ  ʄC1rl`UI6p(6)ttVdN"i;懀,Y!7;쨃Dsh Sw+|z!J@F*)!g-"౬ `,x)Auphdpd AطV(?p]W }-L=ƟT>J]a\gC <`7 N!XG\f8qQ kusOH F GXL.R.y}~ qYboљtڼ!%UPś$!U? ¨j;ڔ,vzZ}fu")d΍ |t&ul.&ڐvz^W 5&TTPt~/gl|CMe"ӈgYHԂ> upB居YrWꜭHI )hd%~Yo/ĀSe%* A}{7BkY4iU!iWYϾöRa6Zpd4bgx1PM[*xF#8xD^ss^7#Z$RvvOojoN q؄' v gYn,q@8C{}_^8D:{␏"½,`H/Ɓ0t;<{lkLQ>WGю泫U\$>O D](!]f>7ޛ!i+{ B +u~)$ε %?o76 ,n0!{j}biQ֧o 2{J 4q+G4ƶC 9Sl`Dw|1p8^^:TɬC Ʈ@{G' g} :G5tֽ bk`Yac%lQ\^m}e/0`#j0ҏWEI>Bu{NU"6T" :˅c䐡d#/ܩѻȭPV~!lFﮝU~@l#E|$5i/17x *_;s@OY-ve;JL|kC',|T>\#`zTWE}S Ww6 v4M9k4〼3ny.Vxuc2Itl ݻSv MadNN%rfXT `YB S_!&&&-G 7~@ȳ~o呝"[Im:rF WQM"QnHV .x1Aq%k⿣rNzvTs%x=ݻ9Qi;}Vڷ)(n_&O`}}2ً1]͸fFUP؇DF5ONPf/ѲuOx“z%. nfv/6-UHƽjՁF>{5v_UnY>AQF|5㼮H貞(!J%RɌMhVSSAbdžlH Hy5iDbI bאW?̇wU+a'?@s7\XC0U*(v6YgBL bؽp3/zRx4 $}0#QQA+ޏ0VfDbeZ^';S=*lfpӎ:_3}*C8D|_ЊRݓ 0ミ5o) D_j0_r x 4F EW Jv8F.>+Ԅ~v~H: LI  INxș %fdYW+'N•Ep ~NmchVuE" rja4oP񺤓 m aMʙ KٕFx|DpG4 ZBnoL;tXcBA%4FgaW훨vL՝^/0;U "q1/Н%ѦDY-D F}Qup_$8 B 9b)@od`?g bun~A$ 1]j`7ศ1,VT5ZGV(IeنW-XP +kvuX2^$RFWKYfo}.``2ֻYy ߚKBr豚YF4T&~zO"#f X_1='˺:  W&F-kqEfDY40,0:9c$JsCjQ!S;{U%;󳗁r1Z`Oe Pe8Z%9#iY$v@ƭ,j~}긢1k=E!X "~p" =ּdnV/zΜ wK :8_BU-ж:FQ5@( VE /&3SCNR5xS@ }nĀٍ*B!ldZCZ:qqFڥ;6EW3 Ka$s[V~Dj{UCzk@3te!R{ړsJHZg<ڄG&'5 Qb,>x `ckȚ v -eTҢ7@bG}͏] {Y; ԁtW8 wxL8&Χ K{ /X*F#D hf{ё/)Q*Fp§DMyx / c0qI?O I#|<ڐDbyإr00NDi,H4K^&,'`Űf 2NLbW^Qb4&F7RiE;X?y#g ǛD>+&J uXvO vRѯ]T˒D/e`t覲ټK#ݢ%4 EE/Lf8De= Yl5owxج_:C2F,Q/N~k h$tS9wc' My[AZv4';z )0WFhy Yp׍w0tj?K v“XYOS/! vض㳍X)ax65J?@Q9x8o01_тH_+K"W}TMg@K/o>J}.i5^oCJԟE"JP.$nhǻ9^%:X}7䷠KN}?5@Y FKM!x5;x4'HJ Q3/N7l*᠚m=-h1C{?­5)3 8zI[Y/RJ5%BX[atSS$$1RS(  +5ni%b~pfRQ^`گ;+& Hك4@ĝ%-ػx笀vv)3+ϟ(!6J m T3Fw-^rpo@Jы(ƛLVCWHQkskp d@Q+K !*},җ`.Ѿ[ewa >- v#:V2ˮy]ϝ$ѐL 14: ; saӐ~t%ߋ8t ;<r;JP6xh.:/J'ώ؎b^ gQop@N<.9zlV$ahߐaM8ýq}9h]DEy;59۪6|`vv䇊s5x¿%cQ,aR9%1|b,hNlkPu 4DeV_%' Lr@h{'A4=ҸqwD=Vru.R f:Rt jqg0 LoR~]5kSN~*d;9^糤d+`T{TWF룴Wtɺ@F7`;Hh i4(WNea%:Jx!.Z3S Τ1"+>_ٸڟ2ߖR6IdԔ]ðrpB,t"> OI/a)Shұ* F {v[s,. A D<%ΙDgNm,ho鄻.wFN%\MLK"𜸸Kpߩ%'%S1{L9ƥ=/pdU8ec2V$!%vF 8oiqzRgOk 5*Z"1F u7Օv[I?%iޛ/..BRExhCΛK@biiZ\`jD}GBeT OY+˛wH\- 8g(JC@kyh#z61*Tv-1| h}/RY-9,\A8" tID2ݏ+C M@85hrZ%=XH:.C Yp&xc{ (M>XV8YZNu]jt$[G2.@:F (DvZf ,T-y9 WP*XQby^ w緣`PU%85Ѿx !=v) jQ]9!Ga@3س<%†LSWW%N:]u =4^x~6N fBZ}]|'.c9Ybc Nxz/1ο/ U ܔNS;˟!`Ļe}ۨp׽io?f<>JaNïcD.pʱPcQ}E)T 5DK Q0յTưfGLJW^z؛rm^ ۸Ia-wyBnńȆH̃NH8k$_[mD 8m54lE3V:n80{ٟN@S :3SxZpGsT"|G: Y$ h]$͇]C.vp?Oo4{$%tShѭBJ-ϖ 5T8qO6.%tac-79ZE{TtxtgEUC^NF\T2 62$U SI'uZ"ν2I,|ӛm[Y$Y>aU7J;΄ȱJ26r|%((cۻfƁoi2e ;gEeḧ́KK$#*"Dj.:RpÁPݲq7c9T 1^˛ьv\as vE4]#@nu c&ouf*ZUo҄"FԞMqo՜\d 4QyR׿S^Ћ^J~~*1%~|)?;cWXxGdcs,Wg-fI[N ǜw^zz#9Cw3:%އd;rW\584rj otfΆUTj9K0-a·}"olCNj%X=4ӑ^Pw gZ_yj;8̬meHa#+{yUFgN4aȼْ Ygc'+zXܣȬdWq7 fBٲ~~G?(  ;jj,D ˀv 7XrHۈ`m os2Kx;N H6g(^]p%2{ׇeo ߛCSGwy𦿢5Fpv6F U G]Qh%W.=底8i5jN8_Fwc,$Il9n ?.M!7h/1] 6KvH)0 %rI(~;'΍194Рȶ.& 7}Vs.Pn/4Vf!ӫq\(#]ȓ9H8fGKMV9R`Bx]/QqǛݺAi CAT?;zw`زڢ! t*dWv4>9>e N%l_s(Q #>V&~:HF?>~=HٝFh[| ҉j躠) @21xS!^AxL`{%JdW3`t,z=#${o[Kh 8+*Y:–@M \#uք4M/G=X?וng?v@FZ@GV]¿)m$kx pQE8C9%5CLl&q;m 'H޳5]g~SEY 5pӁa:̢_7V/~x(|JUflpMr@ܱrjSJT$R ^@BqAk]$˖lSt'ii hWR1J'v9[Ԡ ]υ'Ƞ&=]!므e[fׯACT(VP Cѿqw oqC7%Coxi=:`ӥpًjPl˪D _vyT"m^$L]֗:`A"(Յ5g^4DjB麩R d,$tD3Z"i ="9,SR@OzN,U7Q먡.2+` qDQ )_ sǢ+n(JSc ]pl10Vp's/,VCTYh#-_A/揮MۚJ_[7E dd*sFxAA 漩.E}wȗV}nC(UDCd*~2a7< ͌zV`b~\f LVV'9s);Չjh$% #Nuz%cP$DVBV%֏vS@78'֖γxv"W%#W1r:l[D*UC uBAK;o-]c/^k#aUMƲUaue&Ij^п5HN0(! _Q;HC`TZ,:_^wOhEdNGx"z"NE4b8 #W'!*<ny@4"wlY"_sE@ p4FN!;۠6O7.{ m1.Yd;rM*D4+6PljG-NlI}$fCaou /o$>}=1suX` Mk2tI꽝w.8nbGB^u|d@je"nN͊X_hĬ۹YEo p1&W `A8ڻ YAҫڍ|RŠEaV!=M;mx"5P0W[ wd= oqbBc̿ זv`b H$yΘ,IUVC`C{{<)³KؓMNpg3_B0B;=YB_<, 3XV1.4 ^g)7MwbD{wlيmDtt]G]#D?sZUR2Nv 6wy7k&+Bj5Ɩ>QʿuUHAz S xS<H$#n}Nt֛;Xgo'\Њm/%82 ~fNo}9酼2IT-a{3\>{M2I U/2̮6"ݰ{/쐕oI FkVe@ν.,y@=j$؞ir+juKQm% HfBÚ^ޔa ;T>ѣL؟a#m:"4Z!:w[JeͥWAk Fwz\ű;#`N6x~STD.)L {> GpJPmԍYmE] Hwdؐ&ԍkEf`d;GTBr-s^^?i`xc;Q5:ܧw 5{4cN:E?9m&1Ͽ7IB-.eoßS{LZk'XRk)/7 (ùdA+ _b5ej)W%gL~ѦrWQ=& D+s]w^t`-J"X:n)̑t#B(I,$n&x#irPuv,}Ӏ.ľJw-W &oّLKD`#P\R5Ʈ3y;|`R=K au^Ba1)eO;4VzuGW2jI%%U뵸@JҎkSirCFg޽Bo3S$By%IpK%]7ו?CQ{|2x%"`/W'QF\!`w'[ Yb3 FHxAVH5~m`A#甐}  hi.ƙwI(uv'wFB]t[->~pEG=XaIlH2<'?1QB]cSHk$E^EgRzFk]a%п >w6*%3:%%iT {I5ï#ȝKL"kq.H½ 󽸩9<4hDp[Ug_WJ@3 Vy &:\ؐvDMx#ZZ"~lnG~ [4&yil[cϯ=fww~䓾8%ڔ-;^p9[|ƎiB *Juxodi m#kV8&VsKj2p}4ߐ !^8hn1x|N@Yq=ࢊw EOdH4vBu-_[/ld~uTxwbT nN ո>#k#lc$x*cRlgjt+ N_ 'xϦc0R3m_%|qϝ8STC₂4S6oԪ ~M5r &8%2xu=4_)C@B /ڧL2㢨g\5$ z'i9E،_LpŋaL_=搥֨ѹN/!Vc 8(&#}V{KVBi@w>YX@Wxg&(*6Q w9U1¡pY:_f:90B3@9wiɤCxa:G9(qU" }-v[ʲWsۚ5̯T6j9$BQΜ%_+c7MO:p|#Zuu ě{`QEm@T5@L@]z ="/}M пPgDbUa7@7AY~+_nX 6ƞ%ТCl727ng^qe>sr`kQm /( YB[K.MhJ ܘǍd% *bqN̪Oh#u>>/xX$i3^ؾ+lxءLͦ%}o6A..B-gѳBgr0FtT49n06[^BvE5vsV5 ^&lBʘVډ(A/ഈ\ BW~2zΙ.hvSexW,=ωwQbk};]A8pfvkm_d5m0ɘ#F?w3qr~n ^isvm۞Bj%s!ڶnJ"(AQ!8wlnɮNzr%ZuG@.lFPi~0!il Ky*iX]w;QbcQ7SD*F"/'hZYS u-2"+ޕ,n:p7o Qno3PTJ(I\Ghڲȩ% @s{%؂s0'X45:fZ05W8Q0 FPlL~Jp[QBT֭AKoe5XOد|IhGTfG Kv&"]|0^H4:8w@TX[0 >* 2+gL- 0G^roFp3cFbAy%1P9*bC+w] +,*`أ߽DfS"bh,%.,xMu 8ؓVS"^^hSZsw ڂCGڞT1}Tw;܁O!tM?!s ^:p(}X8A;~*Smh{g:@$q~q1&e¢qqXaKǎf>td#˴]Bj~  fr™>d'.* Rz5H]O1PO4 ߈Ŝ`c [&%_YFsց%SE\fE;  ZAC M`jBO (7yl{yF3lbuVB,'/49зk')]=7#lj{Ao.q'ڃo1&S6(}^/.~yfWi{C ,/T +9fx|;mPm49QaCZEf56"AsK hsXfIaa/]FWщpR)aqbYS>x7 T:t2W{̰kƱpeA"̧#\t4F ~ wgYdB.#E(5dD5R+^"jNv 4]8Io)JX(dQ ɛ. z/. KrJf,翽;Iy%E (i}>sʥdc 8Zx:0Q*;`+ 6w} e>}%H kq5qHȆn_%:c\{~Um&'w q $0Rf+l{Ro/ ^Sp2"^=mAU;Fg2H}xdSyp%+}Fu?GVHW { WK;D +M^PeH4y)G;\HC9&?>(ڐy hsl2d#зͼy@2^lKh}]\RO&laOItJD`uӻ عUomwx}AYm`o0.9,B?T$kj`h{y98`(>WY6sN ع#}Ͳhh ^>٠:-+g)RGwٵS\|4Z^!s̚_ >s$V6J os}U,v`{ƨu7F D (|K}M- IMIoE.+dݜvs`vN0^ ]eLJrw qᯐ<@@+a*z78mB"fh!S@=Kga?IVRÈMs2R L2+XdOW־:j lr! x'`HK,_;`GQ XfxK@a 2ndOq :1k{sKc={ -J],9(QpbTS8_om6Mexcg!+$%I [%b0_(7㤞Y-bK,t7u~zUHN+!'Mhh9r=O%P@'n,w+1`q{=C;imH^C9cV|o@Ma?5]\TpN[22cz/CPF'//q쳠> 0T JL q|&X`&#ɚ^%ʄ=:@wT*ۑf6Vֹa%%܌%|gG]Z_);"ǪQ8JEZZ)X8DZb6ZG M*z%Td/1j Ɇuwb{!"Jl`#iM=+-+"%p*88\XRK Yd2SEဪl8%bֆ=͗)%NטN>>K0^/g~T8QOEÙ#uޛH蓺*eԣĽ QcP0xΑCB?҉Hr*oɗV̽=-TXa}_ӏP& #Jųa\rrLlCl&VWlָ@CyDP5d;yYA:PhDz/!{6Y[55z;6ؓ˨WC\Mi aau(+DD:mb= CW.r [ K8\⽋īzx}Do-6]WaekK /K וuMXQL8">9 5 CZx͎P1KXdkyBr6N nZulkFaZ f]5&,ȅ$9˲kD,JX׍fڏ&,\7 P%^akVCYN:̣ _T[E{ȟ#uJT ?[;Hv bY7KL72wN(7A@]&tF.qMoNѾgHND C|Y/iRoG\.6K`Ji}_Z9&bjbZQCHbLJ$vT Ԙ8DZTRaPRQx+d G*:B? pYC Qb;_Y/nפƢKb4zElD1 JŇ57blԠD4GN|dnm-p:KFkNK,q 4*TofxOoS>ƺNkWA%5 `m cx /|P ď5gvpI*pd(oLҞew~=X-YG% & +vbZoB!rRKq,&]iwıErDB))S x|`¢!" -GNpiW]6$^w3Jwxé(=ɻ;,x;;Z{Y~ßSģj0H,ȥ+iSR<.hRK{zWI.-P2D uS1N] gN%3mCcX;x=i}A7T<ܣ-=?)qgȱ'b2C Q!p$g/Qcӷ+&vgM|lͧ&>Ϭ-C;:r]B2ףbVaLhj{kISv]%yN\%<'TkO7>8 QVh/4W@ѓQ*dY^C7 RѺ$K{m[;DA> uد@-8?o"<0OK3>b+g}#Ƹ!+UA8w*˥`iBT~r^%7x(]>w2暖>pvgIN PYc(-8Lm ^ EpSx.|&剽=&5:o9UZPqzKM%8bIB{;dXzJXt,=w𱫷+dWJ[+o-vp yG<ʜ L xxJ8pxCu]@ob/TXV_$ iPS-=/XlUI%8:@V7sV4KAlK^T/ x97+4^V}Io{ ~U\R-E%(u YCpB[<9Vg\g8J3*ѷ12? #`hKlfuE,r;;hxl~/m B7:&,aT8vhnW?75TJA/0uG.*^RɛIF ;TUN{F g}U6*T̜%tVwF2$;4 t q _Gi%)V$Sxxq*ZYT#g-!K :YPƣZJ'U;<,X,>>8t0#tгh7UB.`M TsSjP̨'({WxA…U帣 `itdsjUa}=2_nߌ7f\(r/Z~u!%BVbU_ 26/bq~oA} 続W=~GKYdR#%ԠTݜm@=JEJwUA,Bm6 A@z.qmW~H}RZWT%+{GrǺ UU RZeeey$T ԹQAwތfOtߗ"Lʭ!wWTԾZ)lp{}v|b\8hK ?6#3}] Bl:c9809"J_vGl易)į<5T $(;n,ȎLzWX^/`DhUldT5|rP8G(x]S_(;uѳ*9{4 'X_ ')"R^e9JǬd )`"VpY1sCc9 Iq^!޵pU#Hp]! pj]E%5bzXo68(1Y!~[0Tz6l-0G1ӺYRu @ynte򚣄YQY[`cJGld(0T[z;?lե?c~M:,(~< Rf/|zsӸ uZ/9"Abg*q߉o јhсw@6NY{߃/ (b>45RxuQ"gOɈ8xO"2{c;G ,Z( ;HL5[v?qA, 2nP~ _N|=v.V~+:Q\g3u۴Fz&XNi͓%%cWA]MBA>% 4¿l 7V N rm^'xW+[%jGKO`kG 퍋BZ"4h %}-oZٜ> h'G9 $SvN7F6Hˮ$g7 x59B5 ^'M҇W%~]~}ff+db>I#ͻy5dSyYOi-(iJp;s 5%{+V >Pе6(.%5Rglhw`2Ki+9x&kw\&-#r XR`R-g4S__h2tLc(j#+)M&7wpؚUb@lMHU M(+ K BDWdn燇b0`Ð;a;%su7 !jQ[{nV潓7:RElH)#,Q ʾ7sɉc3=Sn_w4IŹ\3g }Km((Z2N>6F]?;iEll}Khh̑WBi?ɭE^4BPl6W |:q[ FD;T#Wۻjvf ; A~e W~-/4! ‹/rUb ʱ>Ƚ6^4Ovck`xT7,vUW4wx꺂M).be"uN%LPvY#;GG!KP)ьz/D32YKqgO&^E"lGqEUt^x?#N)PݓVX`eEoEZE耽Q'lgu$R?]1}Q/q !q 1oJ[ò0 +ZBj+,1 #9thk@7A>vNGQ׹MȳEY/]{-sa5@B,&^$7ohzP=p /औ dݕ%Y r ܡУhSwFE ae16~{h U/ l@ kU[+`;*߃vDՙ[ 8%ڒ7 E0Ih[JhwtNĽ5u8XRxQ%- d%/¯#p=um+QyR @]bQ)ʹHL`9]ȞK@zտ@E8\dO>)! u]xE7ITҥ%6tgpd<#moW }7E"_%nn`c] rۭ]Ei` 6:Dvtǧuydq-.h'=vC6vbk$Ws_Sh  +2H+zڽɝɰ.Xp&IN?AkJ)Ÿyf(0X_\;V꽼Q& 9Z)FSJ,@xCʰ 7=%M[*<ś~!Q FR9м\|r<+ต7[sVG z}+x Y16} N3r1%.H62-m5 B?x ;^OD?8u* p#E^;]tJ)Q/Ќm۫Cōɾ@BOh4_"`dȿ4g'*%av*d+HzGh/fOJ@ nospp춷%SE0d@s3+]auE4{AБRڂ=wJ>*?75h#)GJwnPzxϹ/ ŀW3̯z$5 ;?0.oPC`%(bZ X_Cݰ~Ui{3HFN%z97Kcs?)O Xr~ m{ѡWZ+A:֠gndpL%,D_[@ZvI '%] AK67֤ N,ιJD9)ŰgۘZgrkP4>GwoƘ{.}t5aY ^ٟK Ϙ<ۊF;Ѹ. 1pPa)z{$7wjGۻ@7J$"؁ъU!`⮀ӁϜ{TcTkXa~Nׁu/?:Z5205r:y@Y^;ϳ Bm6q@zc'0H&k #AvUC6eDED+bxs-"4"nxq.xs A>!~60~ƆwFٞ%_cds]4ZmǵuU\W+_\ψ#NJ8Œ\χg{%xQY7R;xhj* zN}{dWi3 8qLl/a8?}?ۂD TA,L݋(+{-*of%T{x"(@thl\b/#$Xr2 ;86eEWc6U 5 fw"N[Y ɉߜpl{YNAՔFCK`'Xo*EB8tAszPp07B{dWk!YN 9|"NW!7&`%: D;eT&YV(fBwϵ7h MMQ@sqgE\2"[//]Pn=_CO t,EjdHF%*A^:z=CFgD/p s-/i ξR+*U¡L voY4=2gX%RWȜi~[`笰 uEJd7cd@"He7cn} 2zrvtzo'mJ/2{eGT:.*KUٽt$zq1%~St!wlSu;]lz_`,r>+Vs~')PgC_6 f)|(,֟\6ay1)Gq1{M$7V?5Zh$B|zÄ@V1ٜĆF-9 E-x2` xX*!k^&k ~ox'^~qn WErh/ |лd"υ1*Ttd211_'()O/VeA܊BIy [ {S鬜*)%W xf?Wd\MYCT'cFRbxPmUiV H7^\SZxY_N T{;k ӮS%4*WhMh$KJ?h'jp`m)Uw;#Z@& ; /iUCW@(V>^wE:Q F"O %Es~ѿC{A-y$&^ 7;i>haaP0~]_T(ѧCFd_Wڐv@3uI g^δsΙPa7h!U09/O޹و*hx*םה-4A ϑbpFmq]W>Jl]́DHlTgm;Boѳ6Ff8o@zo:ȶŻ{Mպrܽ`W]Ra=H6"ɰ),% 0(<| GvQڙrS䤬]&jw.J>iRZf^N/͠[D7wﱉb)ѕA< h$GFJ) +ˇFNhDz!pнqv5fnyWIh Ikc&af{?v*$v߁QB=dY[,%9NBd`j۽yn"(9*cSl.+'`N_#%EIRw[kHŁ _Pя]Q!rIi}I^ aw! 7&{ PNRfhKdoڋ78ݍ&FOUX`rJ~` [4'8o 8 Ů"ŒZ⍔ :E!K084j>K aS ybqlZoGT~ЅH΍3Dryk\CJ RÓY8Rdo1΄0_604:J\5xz{L!;d^Q&fU/:>GۨL|roxT #YO7uBs|/]CP$ޜry)\HrGT5[+?y.dmpz@0FK#k@wWT$" ,D1Ԯx?>E}R+4 nP0iR}`Jj5Z=r_, q^^vo3dʧŶ$@g2{UMW>cBܹg+5g}xweّx"H'Os>xM!.z+|`ss_)k}欱5utpDr^ګDn%\ fk:J\M|j36r*9~8N{m kQ }+M %q+4"ǽ8R`co+ajlz?H{L/^J,1L4vojOm: sUx> (VJ nZDp]\+`AtJ9@:6ZVN+cDHܣ†;Gax/c^"Òa}|qE>NNxvALeV DhDRH}F"TdpaA>亠Kzp}E>^"OcM*Ay[DCg`;'8sاͯIۧ,x5 펆lQDJO׋NNGTw縮! ,ը0 rpN\I~j0L+k0d"E~>GQ&o*dѸpB޴uԕK_Wٕ= 6,I=4.^Fp p mY'[c..gm#e"I ipy_[~Kxjp1Ec -5j#h]ҁmGٞ*_H9LRleHl\=@TR XД-fƛbH$X%B3k ˻~M1$_h(E(̯S UKxXۻƽ?ٱ}7]+/R!wV8RzRQa~I:RЭ",o+H E绗 )Bmx9k :wIq1s]{־o97ZIdbfGDV8Vx˨ .O uM|ƨ!B, -ʿώC.Ke^7EU!M^"~Poi+=~fH7MxلSJg|Vw H"Fz$QW>Y`9<0O Ԉ_RK4 6}ƆT1 ~nXK@3%*`60^)oԮase/` ZQBp;^.qm IƂƪ1O@q[M+iG R gȁ?jJz xaQ;.i"&wUԛxzXsz $'u5A`U3Ԭ##FFGiGW'VςA\*ΉzM#xw}&i׮P~G80 j s׈kDu'z|8˅u>8U#Y3@L |J031q`47 ܂O% NxٯSPdXR1.;F( Ĭ)(*Z"s; M^ّ]7x;aغ!KO⥱1xrc#cT t 4f-|Ԓbkwz #~> h_&z-J Y  AfV}ڳ8پ'崃'.2Jg\ϩnQ׳#y=/*+_̰]9j^i u>X*"Hs 'JHk8Y(? rnM Y_i7rt<KlRy+4*~ hQ§n4>w(tcEy4VȞ9B GJZS5q!n yb=]7|Pz|`ܤFlzNJ6tb~ VV}uhhQoփ#%}Oa5 vY͎&o{QJ@lsH8~نȤK4tp߷Ef86|5No+ڬfx$E}Y%ƛ:H.CN>pCAl+Vo ݠ0l/=xeWR`渭+d6 sM;:vuʚJSu^d^V5dYO c]w;GeC0a%%G'` ܆=ϯzVw,?cѳ:2p7lwhpy|֗$aC:cK,As6EAK+;uT z^َ8~,C zx,G4iw~B;\$)/q9U /4S:E% HFOe|()t(FƠ(*u$]ړ Xv N+'#> OMDZ:Z xjPɠA^%j5^ ,o aP@ŰV(yE+*:8lI'T>w1 x2:sӃ&It.H^OkâN^ZD0wlq}|"%/luęm?%EJX{ot'{hՙ0\g0ЮṠyKyAOހ/.ĝ5!.]"(nR_+*@sxRԒP+\̲JJ>! N aDFQyw>˛RdJ\/"3:?Ѧ2TRh d59 b% 6ZhW;e'؆oģCrVI; 2(}Opf YptT;~*D+}7qqC *DgCg C;0irlZ$tl;ޑCSMKYO|ہ];\W %C>K33ip>X^!jւq}4 IC'UCci~0pbpJw% @MOh#њPP8 %nh:%ITF%5 V8 kY*6nh_ԭ!b/O\ed,,1A;p8I;K,.QqʁO"^% I0v3˲'.(h mq1ڀ/mRj07!zEG5sq> T`Ř&,S>{:\pO$zY}- z4WWFKTl̳ȳtYq h]~p5mn +JY[:l:Y_ή|N?HdY ޭ>BVMHJ4`ʊZ3hqtl^I!FA+lI@oNρv#x:cT Lm@mu/XsCX0,j`[&O;؂El>B Ko2l@+tձYB7kl~de%ɉߜ J]jǗpRh/~8^b7m3Ƃhq7[ W `~񂬄+^$J].тf뷝{;Y{f]asؓp~lw }J*PV%+ UF[^I5V:vtpOlal8ƽ|մh7tT |9*D zu~߉a`⑌Q::1(!wcY}FNS!z`3LeQOLBq^=hs5MfEmMNOФTH3n([1AMXO_ VoHw({G e7vgbDm oHJ^bȠy'qJl,PdhȮpb;8c;q*Q2@oRѠ9h+"(qY{;U Qo`Pb!zJֽ}6Qy|07 MҨ;}f!fBE5?Zw0^%J~?WX^/XNT>!$ xȢ> *d3z H\y[s4P\ Ws;gU:k ǾN3068vq=kΐ42.q=BFgh |X,4vA"|dͬ؎_t1{$ހ r, 2 -=CͲQŒNRiY?VTM v<nh}Yރ/_Q(uD@A7jJ~Qd˴v^{;1'rcwGQtNZ"BbίO^ZQvX8+yx j@9)cb~^7ݰikՠ @kftJ`c' < +Y {C}=Aêk=j,+0snqAِyX饳BbecKniXosx%槄tW[!2!rɢ{h ]V%sξC;7jE(ߡ9=;~-l 1}[׀L9OdQC7G{o13δ~&;l@#DF!Gڿz8XTN6@@*+TQϝX(JoqѲ( ;,5<(g}95puRpf=uͦ ~ӎo[Ї|ϯG/y-'esCt@TFjk0JkR08tU=4]NeDw`1mTX^GAqbK6nݟp稈&;*L߉sZl@.gs?ɓZfsp)0j+:2 yQw8bW>`f`I~G& ̜ǮZ`AgV7f3/e_FTpS5:o`+0/k({齗z ]I4 F㾪U.Bx M ]wc&|yA tp1vϔS bɺETՕhc/[\@dNO#h7C 5s4h`)Ҋyz8Ȫ@hBD7l q&zON 뚟`9+{&d(aVC~PT~g`=VC-ml+箢E xUPQ֍dBXzRB,xί{;?NtAօߨ(ا:~&{@SW"41;Tgw7aQ"@J9'gjd_J%jRR@Rωp6snWXbqF3ǯplτ7/qcs0z)~$P ]",p`96c?'!%x(2>h~{ZޮYa-Nbwȕ~65(p =5>H8ȰGokr(΅~ E*Q99 GR#0JmIqE{3$lqtQ m k~Fi6P{e[YlcC{C(X oyc1!) ]XH~ws!khH!'5t%nڟ4{?Q%W@I$ڢ=*PbQpo8ݯa>K}[A *^Cg#Wg?5ιGZh:+D=|~0R߼hjPY('M3ؤw$%m "S? ϭLR}w艌L-y;^)qjȾ5.h_i"! z(*^B Hgy2P? ]bq׽#dkpmqQ)rͮ Tpho* L[vӑLp;kD 辮֕M Bs uR>AܤA@Jm8h]E]@+rM6 Z+O4K8)|{%z n1G9zẑFsSBy_YK!]{(74aeʖK}ԓn 'zaXNYK|můw~P:ˋΛz y 6 E:O쵟CiEFT0ajd?6N@}8S?ogȜ'3h;gv !kIzCGO\R0_P8&%QLeӅ%d F42"&Wzt=qJczhaEql;~U{p UJfj hhqHz1vSni =ȗ+DscCאQ1lRg)E[MѺ0o-yCKGOu&>v's&:EH_2E(867D=B6 ڿNTv5<ۙ }<#S…g qX@{K †.-&Ck$6 i!J@?mP0 栴EYb;HG:Z [l귾ǢRS@ 7"lI`3w~e hT(h8_Fah f29D/rzL6O-եpkILusr>"8~WGޘ WEbhzp^P\Ϙ FRuJRFo;Y$=<`+jtEz!~*o< QT ԶWgXgN3M¥h5$ʬHt_I,{'G2:Bg/C ^HXk.*]P&qO] >xξM.LfH\p ]-4!:#_6JU>Hbpo9Oۄs hɅ~hإWG%)6cCg>~ km~ #DgtfWZoi}V5 9o|0l FPru/n&Xr"<'"-sBlSC#^Ɛ! 3{9|g m wg+q/ g= Ow('9+Q>䊚[ \I8Qe e,&zJ d <j5j# XჂIHETV]~M+WUq z*)x䒙W a3<Ƞ'o MXcr}ъ}0w]X8 Jw~HZkTȰDǽHٰL‚ȶ ^.ySy֔UْX.hs}=!HʽS4g:=wgJjxUH;f .q_sA%iMSo K<$ h[FEinVaQJY_ٶVtndH]C+gIZ3%jwBx3":L==+\و,a 5<7Uͳ%w{85sY`t'8a5󨱣oA:t;o/Rp\޲6 WG3tA(ޯF\S͛!‰bp2 pᵾ<.i}0!>Ù%`nڛe5 `d`D:WdH ']` ƔGbQ5TDtGH<60;!H[ e8S=Kq,cpO#IW4d9\c5:܏JD.:<hav8h 18Dvr0=$T?ܳo+/:B ' WlMF ű ɕ(:g89ZI%8pNS4%MR݀(wwˍɳƍ5SBxREF஫S ῃtBHTPۣŃQE_AS:Uм)YdAP/<4cJ#G:Ex ) WMcXtCu_RtHPj*0im{Y3pc6^>N#> Au¿{h>+kw3Y$g^q_¤WJu*P+'ÛQ:Բ=/v`di3R1\ǩS@oeopS%pFUcy3 |&lk놄 9f_@ #@Kϝ:dWހU'V0H%t̍7@_m3eP j/^~xN޳L=*EӛL:FQʹ~L;ׁtc ;?7_#m۰шl% @_ҸqGرcUC|߁oC` |E58)WhfkZɾ6+,zhxtlwv%w1RH#I<Ö!FF _ؿYՌ0B? X_ E蔿 Mx}Ѧ1W5QbAq€[9{;4I~\AWsB;z:D x|Dj*3ήAM%hugk՜gS 4a+ȁڟB$5qM-I Rj*wsRoܠp,8d(΂',Fm@\ }ɰ}n@ke.X]o EBWt7ۇQ? &\ōWLE( >Ray7ϛ!uGϠ!E q s,px}ܛ9٠ vRp-ZLpK#PRa T"> /bF&*@{;ŏ3-vd%7G^/۬)pmК\5/qIfB̌bpߧrIެmQ P0ǗqG=G X ru]M|B"9 ߎ5<Bs!OY ux m ~7ch@ 5-JsXg Cy$Ļϱ]Fڸimvz*twD<8k ]:hj"\_]YB]FVT}S$e 4p+.)ӗ-Y;?rY4#Dх$/[TAh =w3 TǢjK򒎇օ?u<*} vHgw0̌l~uVIR#͘ ]5? S@N o5-h_~W3ypxߨ":u)Q|;2 MAI0*.ߠ< `UP  WIH*#2#wT%'_Ean7H 2 nV#ݸ!k{4@V>  #3%C}l ƒPxju+w 0B,5\ ,eeNoL4$hn+Y?)HgoRÆMBoZ$ YP}?I - UHu~Ww@;aVBw $LBbI`R"t {v,:u <`ԏt=]җ9IHwV 59Gwml~Q)`+'7+ܴyzT@8OHYGlpZoK9K~ȿVin;B*b /B[p)A3Wr5k3軗8-=r4Rj'O^X,&Pj8!tnAɈ{:sk7#Z'ȁ$=w ʜhkDM<4,Hlhn9dCqk9W*Ԃ#m!<]Y!cܗ3NtMͣQk^cj՘kW|\GwStgCg-o $(ћT.FqttAR>fH`9H#%ʅ_İ05B41Cw@+ 7-2wSC>&=Vmq/Q .ϻK6*PH^Ra\? VB6UH3|ۄH覷-p${)S_1jXC<%tD\};Nbr%Dle5Щ 9*+= U /#qõ4',:To Ih?ޕ$Jlͻj7 A@{غQ|T 8gxIގhJ xQМÛc5t`n3ѣ `Y=4ֻSƣt yn|Q&pvoMF+rFEPu~Ց\57^U &D%sm=A NxthԊSj `QvA^Ez \+P3|8W X 󒹙ac`.%bQN|@[(,Q6ND BlPDt]]b7/܁ e'۔xǪqC|7SځW[VC; x8ئ[n| :FeIZ pspx< kK;9obF"Hٍw֕Cwy:Ы'$ odJ^[gOvIZQָ>7u|iIJDHv^y~#J+1wY#IdE1h6G /. 06 Rr!H"7*)Ip~{mE47**d>lJe $(+\U]`ԩuRϤC@JIWWH4 _+$`W5J\W?gn!+TJ??Ѕ+l8&ZQVh —Ɔ>W%u)_w.Ԏkq/٭[ZP$65AG7cO% Hp2 ,wPRY"rﵭYO 3z cPEpj&`=Îqb=roaQAMkZ3-a?5HO|`VgZG>)b$ H2{_yaQUԾ'b")tQ6 ա(=%gH ҭzhDۯ3RJv;µoj KU|:sQ糟9hFpП;^b };s08>5ts{~Q e?i7QZNP@Z ,'Jѫd:]q 4&V*(& ,S dgUf:R7ͫ, _PԤ( +pYJ0d{6,c̚D@0aRPagKr=TE2_F$W 㳡XF$>hlnI?n-/+Ѵ$lD 5w|OjQqc7QhR\ {Phb\&CTa"]%-`M(q&Fl(%{({纚xb\x3S3;|#jaTkp]ķ FO lƎ^EoBIalli JjAh7Ѭ\ Mq]2 B%s+K[N"zU(oyiU.A0+yGgjV_^"hצFSDoK[?f"C : ~F/=+KElq'g c̳>P*٫&4 %:Z𥟴"55~!Cela~KLȰJe`dh E;V!FToXCZ}CD7Z2z=8(f*د;)F뻾ٌ o-ݎg/I}2p trV ut;E;@B# ^d%x6>>։,^DV}D,Q* :16i}vT.*`~*toOⒶfmwجeRwqWkc#P:R"Ւ,YN]|62]N*Yƛ%m;CDYa@- o$X{ TKȥK;>h܈:qSxg31_e% /φ/B3u0qI^Z"W71xkɿVgE1$>iuᡠL:Xk|G;`n9JS<Ȝk\z;%Ⱥ*qo-uJ6uH,5!KC+Z0?()ȡ{Z"qF_ 8 !'}C4?*g8Y.M)S20[e` cz] I.JԤ⇸*4j(w:< F㫗\%׾Lg(5,~7=DSZ҈7IKI>U0ªIWڽCu8T%m٢_Y׿ۤw0xا`Ip$22ĘE?o Π2FN=ƪ`7 LyԿhiBJ߀Sb*y;8a)}h;\нG*]o88Qz]h xv:쨟 &Xpp[!-ls*1kg+wxG܎>?Ьt%aE\a$m%$:%+Qv8$PtJ(XPP aYCаrv^<dYg)5]cXE[0o1E {/԰X U0S'a.+l1?*`OBxp ܰcrLwG5`ڜɻ3oѢx<SXctӢقƙX>3*➈w]n, ☪q~4Z u|.uɄ.h=-= . fU ]%;DY0SSnNuRGÅE=I K&T0&ϑ j;94"w# b$eul}t\G7tg N%lc4K P^jh7Vn%0Lh=Eh TƳyg7S}x`Jt }?M{[Y ,s:;i =uzԔ qZ4DlLxIxAʞQ OR_4z[-D<DMQc7hҙvV[h 6)(4YT =\:‚ϐFCj4>#Q' ʞC,Z8~tDv*v\6{t)k%EhVb2Z/S {YNJJ$-Y뻼H9ye*)E*]Z>R=z1nn+#~XzoF4 u"aH!R>Aq8rVQ*H:J$kУ^83?ߠaq9#!G6K"gnΟ9ք$_VLrі-'嵙A]Z[,Z~\鱮5^p$MXF ,% Ĕ2;k[fVJ7޴DscbH{ ̟R^7xaw$:#٨$VW7ss@*x#EC^ XJ #bm1X1)wJ4,۹Z^]Wf%\T)>_ݪF1ٳ+אt~`M4aπ7 Vc F")wUxr~݋+t`7%6X=$A -p#mf$ʁ:Vkvq|ˉyeLYbP-t$eDA:tq䳺y-ר*5򍺡nU/.&< :'_W0A]{k^YN`fc7BOC49yWvW =HҠACQ'7etc/ρ_ؙq@EZsD?ROIZC#L')IfwS"#{eq~qv}gm{Ou@з e6B2|:Xp+it= W4w1qsڨ &gF\צ1b +I#X# 'sZ/;xi& ł A4H:li(0p#C- 0TG&4;&PtO6rv%Ծ"Ń[A/w bfƨxo]dps8K>vn"o?dН&mnz CEi$ w݌K L;Ts9C$Se"eY:K1 \6l`-}u~n.YIv9g [pH8vՍx>bɰS:AkP-W&+kThw߀ Ɋ\CVlqĻ J\U(ʨ[\xQ`/`CsPN­ ~Y/TN-Mx1/pB AQ…0 &;%vxop -i[o^=dU'[}IKзwdZcwXq '"#M4 w,Ⴧ Q2H+~hsŨE[/RZuDHDDՂ 1;z-2I,˪8ܲfNq90\}ԅBGC ݻ>*xC--G]`4P1(umxunӯ52m̮B1║];ݼQ(,}.hYBD (MjqU% UCj2tx|,p Y^Khk dFD{;iڵхX[&5{:z0̓;9[hp[!|Nb To<w(*94px|0 1Og=RΗV q}ny( 42,nR :׶)٬B\py YN; f(͜E}/^G9Er1EAKMΐCz`#Q!YCux|)EK+v[+0uMTF wOF8یP%7|]G!qu3vYѦNC:a\ʒG5esТR}->bRddp2qGPZ)C^$Ϙ', %g1t^iD'cMt |@2h #t#VwHȑxI[-v0A.p hTlɴӀv$xsWb̖eZmPД|V>yI-p+q̜΂s@:'2,|ohK/A/7V8R\2!*wxe~ВQ'@[#v DcOeqH FEǎA _( 9ٌ^+\?A zffBBC hvuZ"EoIŁ\ff6:Kv[>K95;|-dd`BҙM׈FaFzs+v7JZ-G_+Ӫs^Ä\#pl6\Cʢ۵^ߒ((kpzAt?Ѡch]Z sC UWo!MZys@ *A)j狔(J¿j\qMo'LטM9ۢ% 7Zlt⨄|v '`e/6 mhy#^X(<ɑqts]Ņ5 IpFd2˧wůFIaǝ隩@SD$rIvR,3`9W:}6$B=b#^/}p& x8jahَRYh*amho(\Df*\dQ847s޽\#~`\ʚTAQL%HAस( qH#/@>cƮ`P,[JgлyV8h1L "^&"Z 7ڒ#ao qz>f@Z%\(%$aK&|󡍡xօk +"`(,.Vi@I0^`HoYk“=0nl: 95K,p= W ր0 ,a- ֳ("{˗͐ j Յ6=g߮1F/ђAS~"|0fCA댶W%Ieo5f$*Bt<١R"wb?ΉeH8<*!xk;o[kBsCsQ `BX5bvDO:9chYdžn}znIP`J76Z0I?fkģdo+ْxnn.w(xUJJ)p-Xy|_x5cM!z-9pڑ?G awL0X>~ /V=@-qTUt̲{T ÙŭLQ!AhrX݄o$߈KxanWУ FYJL/!~FFق9HKI \Eu:$WY2;͜0٫DyG E.3,eմ[:`7-)3y)pwJ*;Fc!&7)Jq=_fYnӎ`TH't* ,(G-fis%'Xap$`pFn% 0;FKpWh3Oqk.d2)8p~!uV!n6JPKT}+qX ޜ2}Kƙ;u@JkMVkUp?l܀k`~FfHFi_{xI 炎BQ˜It} DS`QLYZawx t4VX?e c\ƷH(g.j}!XDGT yY>,#lM9"#Z T[Kū{g/:761\Hg=,~7sqSiS3_8a/艸t ݗa¨\n+͸u$rj6@g39RI_9b0p F9N12I/6EW4cM͘Hm%yߡ $|[Oͩ׶hsy*r#^UaZe/ 7* ;k(Bp>o4j5.?іe@q[r53$Q;xE"=R9=Kozv o3$䒀ʺ'm~ey5M[(F{(hPJjl>3Gܢbg9V!յ\SCd\{_s\\W$n3MI61sy.(,6Qq-/m׍绝7#)5x^J-ڼĂMgL1ejT.Ap/ xѵ2A͆+9EPK^;ԡ~pChx2+-RJpQb D \]Hml}^ȏcq!fCB{|KF"u+5Cg#Vn Bs!'bo+Xym ڡ{C~-c)$|aX<7t 9FF]/ rn"Lսi0xY_U*Ócy44ңv^Uo@Lfn cOɕlcg(Sv* 3$.zq%u J-4jtOUb4ovk#[VpZ`/Nj2c;ǻo/HFK(~r~ !+_n|Q:WCcf01^aq'`D-\'i08oU)_`2G<P)[OܬTWxSk¡EPZBr\c=anh(9LJk78.<5ѥ#t5E7$쎛ZfkN{v8r\74|H K[L@Ŏ6pauG*iz]K1'^4LeZT-4閜4\5ʨwѐ]Bj}o& x:׵S{S QIR3oGEvs3W69-҃`dT査:* Jp!Sש SnR"܍8.*Hfʈ [J" &/T$j'p]_TAH0E-K =sΝe~];l& {鸯(|0<0Lqqwʜ9; .]n!Oﻛs(;M$0@w;6νP82Np MoXoعE2|g7`p?-2FU`ygEy 갡'^i̳{޿R/yE ǜ(*1ChN8ua)?K qPudnHzE7~|+Kb=w*CBT[$x4j&.#Tt(zA8›׸C9;#.(M8$r2]1;08Dǎ._ @XւL*R V F F䆀cbwBSDrV:0EMhxVGe7,8=슉s@ Q._7u̩/S`S%W׸Kaw~߻ (yѮÜ -^#O?pv6/ڲ;46ҮqzH7qzPUn) ib3$yN;*\ HKk*rݰVK-#/x Uaslklg2IyA(5nmeS Zߤi }Y&zD+@W9}VBWQ&w2Ǯm,ݜ6٤'sZuwqgb`%ș @-& Q r:bmE@f Z!滲EVK`;/ѽ2:TE4>rY:Ck~n(mQb{,xT /7^akdZ5J\/⥂=@甥xO{[K’,m߀KL iu8;0[QZSl?'6Fzogk/-JA?'J"ilĕqɱZYg (͸ !&qqbH)m~`6{# ;kAw۹(^ғտ{_rHwb֐'jamLf8o?l\J_e@>ͳå$cSe0MSYH{Xj][OY+$1VbM-:⟈ކIT7ѱ{8f}oG,jDA?K4}_]SȺ;t(TȠAVz"0 NՉepKGx z[dҵ;\Z+|8,IU0o+[TK$0y~ Ƹ" 갣nSbIEڱ&k%5g>.4%mKDĄJBvܡk{e% `Jqe|"?́ΪT:b_3 phУ9,YG1[ )Cн6 w4m=#B 2KKӓ6tXb|\c8yGVcTF@am],<[)*CVm01ґRBQ6E(-%7^| iT8,K;J\D,m" Ziܶ`ř]l dtɏbO =F4ߥIjBؒجȝβbVjsktɶ[fP:`Obo5&z٤-SS~O˾;Q#I,11JzSxC.8rkl[:$C)}sht? %HKX*Qix;z-“?gw)a$Sm ]CKEs,Օ%*b PY@wʤAmAnے3Cw;39-KF 0O<k*ubΙRsqu+]bX H[;ZՑ~_x4jCp:"./8-VJW*AFr9Szˁvh}/҂Ѳ ems&^}eۗK0I[`\(R\ ='#&K4&ioӺ&rUo• cR5%ߙ4%Y7(0;+)V$YGxq+QV,ٲkK[s\7x ^L-Zy+O;l$!PKZ4}Fp54Жa}FgoQApoĄŴ gTq{c x;g-7FW(EM7*&;so#{}mb5v sK]dI5l%%"C< {!`gmȥaD(ѴQ7uv' 3<< ]ۻ7="IA X i߿{+g[g'Pm|J?k,)MJ`X=x).r&t6ji`i gSJyzTҖŵg9˓UF s\ƃPKdzB m2c[' (oh!C};L)xF\M3-FcRicS X.J)}-MriZLk"=] qx:Qx\ a64o\#{Z0wT[ZJ[k;>[iȮQE%zBi-gbjD3 >L^m)WIn0_ZʥY;YE|ÃWc.0C+sa/-M9(S҈F ⅾ.LM t[w{3`Sa",EV,+}U5+gNi#(epl_!HQ%8PjقNB ]md 3;t!#OWdoZG-hEd\aꢸNiqgGQء$p5YUØ9`ְ:{EcԯxqD9kI-M Z(0ňenAq fXTr93,a8nnޫ8ᗻuX"\jgE%ʺRf 0C]峾'.㸦3DRwhGC'ihDϨ" =gK hVFE9jxѰ3ԇ C3+=7<:ihQѢ5n%7.<0/KjlV6*a&\ZDCZi(H(GPw=jg}SEBNlV=~>~ 4Ga[kZZcIEh &rg`y-4D|5 H0e;4ybxFUrJ %Z҆ZYgSޢa49e#i+ .)W@NT3h3K k3uЮ[r;1d_qEC}s Gi?pu1Dr߀L-J8ųIb3z9Ҙgu4`G5e-naO̕7Wĕbjq FI`[$agKq'`5m@cM7l[;#W¡4J ڹu%u$w%JcK8wb:2jѯN7|qXL ]ƕ0DCQT;3je4jb:O}Zcf8rH.;te b('0R4,#khhTg%_f@n|m RNF)hA;\.|<! WaYXWo2.N oJZr20\= Z+*"]MayIwHT<,*E$a`;Vw9=[cJKшZ-=A1QCm5[ rW.0ؽ !|B9Oy|Q̂ՕmiboQ~o@ $jC*FfOL|ui5Gu$2NA+m3&cE!R_[C,ʬ ߀o {8Z5vڡ>{A Q3HWri׻7w34e@-x9ŰH2<_#٩kU ~ ߚXA;|ʘ'*ÓKǵ(3^|^۰uoP:_q~7TT3w1>+*99y3RTc䧰Nxw$ϣ`tN-q~ƀa*-I؊b d{e[\S@EAtmB_dñt,6DdJ#KѬIZ}#ڢV.|{vY0Py.qh) A)"` ߎ(m$ 2`s }_8Od;m 0:O[Pa0x\V!u޳C׭!b 9 j@1t, iK2ZrϳAho6GvEuxi]*āq!`0a$p}:}\^>JԜT[2;Z+qW;`EF99BG0kNkGF5 7|,V| _(ě'^(fFlhUԢ^mo/9QVΎu=Vja/Nqhwmȯ- qs {sv|UE '@qn}ܭ&} =bhrPoLEXiv i'"m}Me٘e=\i{D\j= hjh2"=fXiVˆ}O0F@~6ij$73I `-TDa}.'МxXXف6/y~{rNޠKW  ߛ$b'G &X6Ir|n@fAHvnڢ5D +tJ\T[H:֐J9Z=9]i-6o24Ҍ( 9@6(=mOYf?oq| zmx+Jǹ2th;_깛hфq5_z^JIUg ]- 7SKTZy{E KܕQF9x,ˆl^YMH5|EOJ?4l!㌷n JGB;{'w죤l AbPȗ)GHq9"W@00.-(Q~sBT\.vYKp$B} p@uU|KaTEhA h[,uCx.] PƬl#=Å|o sQٻSh=-;D 93ٟp L#5);w7g_][ PY^Й%s ʫjSjB/ _Ȝ+w#1$ʂS9w2ҫ u|'(20?2 -RI-*xylIPT[|UBb ͂w:fF^x[qS\b"ݩ}Ot44Q]Eo i{W-9UnѦ3G%(e-oEfc}_S gOiФq+N p|#Ŋh`j+lpxNctrZEr' :`g?SYx )9E*q;A[53ֵ\nZ V$6$G?e~\E5U~r8AiB  ';[%pAdXN!E7.z|ͭAg8?;kP2Y77LreP2Xxoj17"]v_,,LcNFC]`(Ga -xrO=0DNX6k)ݪ1fG(~J XzEOy")=g4 ZTDP|~]LZwX-ꮍo#Ŋ krtwp/鰙u[bƤNLG R7ԝj!<}r[-hҬQ(]pXR1察MlR6m%/wT“/Op6*W~O;z>U Ύ R X/-^r.-y;{7TϥŐ q F/,T%CBW?}e-VzY$uxH?W+XuLOJϽ+]S!J=ܹ-^jL6On7e-~ -S[x:dF]ṭ!!42U#3˙!aG[o`ѥӄz fʴ#ZĢGzeЅe H6O+?]6TW0j[ANM)!ڢdcoFFg?3܂Cso/)ݹ1p[獷H$`fDihc}\bWA&V"Z4+(\#7ڢWEH64Tc^[N8WzLfq.wUN2g?TJhѭf3hܣGs/8UP>2IsHΤs;/quIB}9-U"sxyS1&(Ak? 7᪅ .wS2 ŒKYGI\LgD;iZyDž[4'Z RuW$=HiE:W xVhу>+7R} `"jԍ-( P ȰH)XhENEz{cCW3 ZXeN k2"ouFLZːl= $D܏l1L ]^{5tiU֙$nu{x4,}"d#^,36ce;{kw7~VRB>GZ8Wt| H q-󚟀VT٩3c'U p?SS]& ;"r"Ӓ|!$-zʈw$&MՂ@ÎxK|(0( J{H ;LnfXoZ- \ d݆oi@a"EI&դ {F#2 g8楔bEAkXRFg8tpEjOD XhPpAC yy2} ji_9(V8\J-Px4| _Gyېw;' 6NX~@E['_X^—LEMT͗sY%lJ1[I(_-6sVfl:geq NNj3^ϣ%uYj2KYetp18c/oRE#pnUd\E݊Ù:~:.6Z~ݎK 0BnY*lr7 >dU;f.)ő}gh 1C,\-i[")ޑydJ7rn!@pHã+G2ˬZa@E ߖKsU/fehH֪C/[}"R+Dav%HqC[ <(Gx _S\Q6s, ]pZ҂Z1ac&7=cWkC5M6:d΀]e 7HS~ۮj!oWˋB @a|ay[(Ui dBѾ/mՑeBJp4v:w2&ۨD=iG aCPl/ =r–4I+UjNy$YޯXgTF6|{R$zZE0|֔;Ȣ#ظ'n8= c'2RnF/V4ϵ- 4|zu 3w[35/OSurPH2KƶY&^J\Ie^x{x&}a4y#rZ̝A/:\疾+}LެOt8V)Vx[<hlLW`>tNAEOZXp ^^h-d0=Q"A[hQHl/↉J uoS aT5\=/Ǡ'S=e:xAaJeYҿڵf:l s/R&9Jݢk 1k4T Y(x6J~:ް-]ȱVr2rCCտ9>JM@%rJ]w-F ] Q4K⣇$߀p]`CFݢ羡η ]\=9eEl0wu #8SC@ ԄOĹEs6 q]HUT\+ey7IIky83=EJi Xt%+M$I{0XEKIC k<[MSԁfӥ֢V8LZ_JQq[>H׆[ޒ;1nZZ%f\;[ c O屸 jv} 2OQR+OaB^-J2;wsƦ|ęw[ٽCrL 7-.+ K9}MtG1>99K]K^VOK{wqQ(Enj̅e7@ebl/KTJ[@=Y. :$`-&6hiJA99)nl[utpR'-LҨ_=H1lr t:7ty ;6nmZgΠi&% Ùt+|ƵBEp317o^1'%PRyD;!PޞQ'~a]{X[nwV?҈*7C*UQ&(Eך-ƞ "*vȠ[4R`n͵]W5;-EJuK4CF ukRnÆ |d.=>3E50 "'*~}ZΪ¼1v^7.t_sUF{J9C9-٢K&`.:xyNyz5T5MQZ.;-\ok$67Ra %{%[-f|7{&4rCu=D%*{IfE v[2T- ow8"Q 5( r"ܡt\V1C+4~#;MQ::{r+}[U( F֜ҷp :V@4%A0NG&$ኢ-ZUx\xZhL3/C t3S3S1 B(r3`.Fօӛ0#LqWԆ+伶@,&8ہj4oh7gjr~T-0oiJjݮ14i83F54W!,Q uA[估RV䐞e6U~\^-=vY/L~f3EdŬ#2Z.gYFRL%.!^@)Ӷ=6s͂0/j3Of l}hetzVo+Gip-NkuzW . Y&Άfs;B{Q1ܵZ$YҲrx s|PţY_WpUڠ@zǗtmz4cН$58ے $%ȾoQ:K\ɹnXCJ?y!{D}Fɠ~v?/⋅CazFjp;E CSlp/Rm؀[OeA[Pxœ73 (tj3'#$밟Dqu*lӂIuduXߪxcz\@}LX&"t߀Ik;;Sƫ Mb 8bн*:w3YX /sҰ/ p{߀sy9&ƱY)9|QZLT4:D`Kp iiRoTmhoԈ"^Li!I#Qb`8o.A.9Yk錷2j^Շ5[T}B#7'Gx (Rt&o_t2wޓ3pQ-/n fxL)ȍkCo aO@7-LBIֽ[p)[drU3a/{#JY%%-ь_%0j.?6ueفjj^Y#,!^]!o:a@C7&upaww"8#vu ?_Od;&V`(x?.x}}mp! i}]YOR/ bN4{`罼E0܎rЩ)G[@h?}z-n=E(W2 v(N׻ E( u-rm>3&!tcYsdz.fB@ ~-j:z*|P%&ЙIYز ݂IJKI:AqZZ-FeW>5g'.eye˙9>hQw7deQ͕sb#ve׸H"hldn*@ Aw5MQ:F܌i[G`*Zg~Ƿ'`:<` uznՁT(!|[E9' kzR^]-F|X.eITzg huK>h c" ʼC{9p^뉡#x-&dSFTo;-ޡ7ނ8 Uٕz:LuE 3Y¥9SH`-vS uP τw,?2҈ZH&xj@!WvB0'{t p\(H1H؂l/)-֗ny,~NFsu\<()H6Oo%Jpmu!?\׏B{HP +p+&NJ0W pa0(8Z߫[&ƲbOF.0a89QI3yt!>;4t`ɏƄ/ĀW MXG*5JqQAWtkY3<%@B? }L¿ x\-ΚzLy%kn=>S.sC֡w% c9G `We!ky;zJ;;RZlTg'YB]O #Ŏ3ӊAaq !e30iۣ=5o$c邰L5֤þ>" AK~L u]*0(AVLn`{ klR~] { {;eɇCSނ x>rH?j}- h~cŷ!Olz$[vi&1Z0*n,%W3F3ei*FzK`^{O5-/Q/ U)G^4r |zkAQNhLgD!#Ob·p:>Rfqv }Qb;wlH GĐ+:6c GȔJ.pM7`@ߑfxF2eNa_9J 97|T.C}ei9h b<--ʊQ.QѰr-+mK奌Z_|'`삒A;𐖿฻9B佺2(DYQ*8܃#bP=Mt)ps;`Խ^;9,u@2-651KljrO}Ox@!?tTxϜ:gXzmb9koP, nAɟ_hi|oyW?[I=~Ǥp^[zլt̑ZP#vӸ҄R"(OМq ~v|F3ˣ^2̝`2Js|fKcXEEk}~d9rIDp!<P[U{i:%Mb)pK-zxF%;xx+YBpEvG_x#ˋZ:O ?'?K`L! CrI{"h =t2DI֩ >ZR@:(_C> 8 .b ,- т qЃB݀#aG׆NY`$exGbQ +`h3PH-0?;CVˈYisa{[|R*1*i t&E?z<% NJ%τ4i,}#~{y" ;a(,đqjX D-% IJӧjH,/j@+ S@q~ dKhH;Pg86s`IqKΆZ,'<31gKACП$isfY MC Î)·׷%=F_ၴ3MylY{8J"gZkZҿKz%2)hAx$Kf L&ao ޥ;P Y0&갣#ץYH|~ liuT*KXW1 sWMڡ{*I3$!KvELn17X4La O 3:V-2-"Y~l{nЋ_)Cjiu,y0dIqV VᚂU07 5zqX2N{#LZ- 2*΁4;dղ4\Z`pjP[Ii{jQI-Xz1'3|ԵxkG?l/2.=F -г\Q3퓌UCbYB3^;KR~;Z;es Ov¥^Ğ+{zQ0PMxpyEh;LL(!trpinzmi QQ C?,k]j;JAa" Idp7Pw(o_%qY5XQ*'jJ*p1No!D:ěQxkR"Gn=~iXhN0x񳅞ENg6Fv6$I+!"3 [i gR[BXȩr]P$oHRUxʣ#B 9h4zd~k\D36,J3R:L7%oւN8PJ_03+q}lٲ!LKnZ$]飥{s:<{%c@\xB'~QA!J!awrx~+B<Ac$[|m/EXH+R;0זWȆU{מN2fTbL? ЭUWC=,^mȤՒZ-U5}#~J:E'E vH0< q)c[ÔSzIK- 82:yiEE`U΄x ]-xgF|Sݜ0|WXYf kx,~3>%EME^ܫAĒte/| t{b^k |x#Na#uU?ɣq, ag6w}=8$q ݂!vǻȱn{g0H h0:Xp,jł<.3p) jҠ£À(Ru7 &,QEPRZ889p댄1Yءy(jBfE :P@(^H4^*E^¦pF2fcwI'CqP?Qbis[2OEeS^#̜˙-*#5`~F dʡ4s^^${R&uukuM'9VZ* >n<7Wׇ ؇Hp7S +#;SL@J(-V--63źF)G!,hYBE=zį@V']4j2VD[I`B0Rh2ru?!eWEt&Ҹ6eHhY=&إd!B2e~;Wc{Do$ș潼%U N>)=k}]X+%WtyW|CD1 h^+/[moAQ0|j栘gg4:VvV%Uh!t\Pe,mZ Nm6 3b?Ϡ\<sBG{gJ'`WCap9 G6tkTH:h03z +,ywN,I%ds~m0b<ВRZ SXKmחJA9vm|p_io,0!ȩbu]KP|#LW ༭ }3 J"&<  gnlAiZ_J<2F6uG}Ng{]-1` L8N O i$P ]/ﰝw/':o XJM4 hC \X :NҚDh4ֶ3.=.g(CS|-֡IMkJ$?x=_8`WA[Ӕs\W-pԼG '2a !伮>=Gފܙl B)/UȖ㌙C_phw ::QJlE'<ڒG-SgƄ_;U?抑XL`%MI/u6+ d(Ae0wSղӭ>ed#$ȦhCiВ;GZvTpfn G u 6VJhOT MmB!u5~.=a.V[M~EUN] ?#¬PKAh:^ \Pa;V֡tl8[:  (€fԌa;Ix참}|WL2d-uz[d2Ÿ9ktoqS)piHR͜ůqȅ te=ߵ;8mRx3q>jCiԥÓpE`B[t9wy( I(oӷ8JǁcB 9T8Ԃp-qhRݢ/` _Afzthcvmb]S hPg ]@~tURB#. a!,5e L  нŤ|_O* X ''H7cKYx_+9&B_ŃtZu(^9`}v"- M1QXncv |C}L"T +N~Gyl|,) lׄe/^r)Ƃ)k=` XJ a a'ΊChADWڰw1]="f t]S&V7-t Y2~hb\_ok%Vr0{P~Yz'ΉAC׽kૌǒU`ӡ&H4%KOVTEz! #q[93=32:ҡ ![bb|j?z/'H#t[wՓ:*qL5 rjŪ1u:ARwLHUa ~N v3#~xΤgl8 2zfG P/8 :+N:l jiKcXhַr&U%I^AʙB õ-e saLW.p$Л[$_;-WP)Bc$9DwZePC:z T/4|Z08; ^~~%0C=^oqY1 x1#`́oD[#Iֽ˦z{!"0('żm͊`vcv^Qp׷spgg]~dL%I%jcDl)^Gm-2,lTG_KA*p_Åz9'W-TD^ބҌ˘4`oL ,:OiqL8z0l2iC {տs iv$@kC fL`! rߠ_?xNU;^Ara*8?buCoYvш pxN1a$~?؄|ϱam!a``Ky}3{x^'xg AQKY7 !ew7cΔ)" zXJ \9 u=YAFVw%) R\RV[BuEt,3\썌K0#  m+TDp$D=w'?fV_u$ pCa{KpT <\|EiL(O^+,H% /l :lxi!^-jX׎NLa$4ЭL1($]v_ 鹳F^'+F%ǵ$+V04'˹Cհ^xH:0qc)?W4 S_}ʆ)Er;H@4G2`i=r`hj uJ]e oCވd"UQ=*P xuK,+bxyAlI;`Wd'I]sbE_V^3%{RɜH:-^D^7VF9lq#2q1L (t͈LBUD"21473 Q[$wi26qWz @Ĥr,T;dZapR /[ aJr_YO\WWf9 G24QjJ،{Slu1hӊՆr0%{G&}%r1E_{~)xVq]~ ˆ>k{iR@m,R-KZG'n_vȮp4ހy̌~>>&s!8G]E)G:^-kį˪Pu=\͎qƢIE-8eU*+{č<^`Bģ0偁#UvɲBj'g lD>xx6hh Z zqxa)J0b*\^dI\v%{RxH1LIJA[h> FGN0| Brq}v2$Mn?>YքhD[$u- Bj^7;`tk%YaG[$+>YN R7zaw;}Ǜ_t"JSB$`,;5ȼ`~mfO6D܇1w kds& e!( ёt- -L{744찾]U*1fG |xi!:i@s5h.CV HWU.rLr+ HЍ"aA 7-&?^07?ZU‚|Lb$b WPLEC ^V^s V=+@DߢX~,N֜a)7zP$d,_8ֽ҄!OrAkq !%?[Zɜx!LZ8;D=v/IX]pJ{*HZnzoNXRIu|k;lcZ na|߉X`E[,řu`D?!Ip8 ko D˳;yN[.Rvܿ(R,>+e517 Ub&m(!\1E/aTTIțφ҂X+,+FIBuB~wY%ƒ v{9#S6ݫao$5Hw>N~r6>-ۛ$VrА]:\K\ >xf9KN: &CbEoUFa?bьfIMnѬ mܗE4\?pVbNTcC@ ] zwZmgM2uE)2 Dtx~ϽnN n]:OJi7f6ۇpWhuz6GȪLͲ4U>nf/&kzv|т|`ZAi Q.$s8 N/G,v24*^*d>1KWmDqCkhZ:|P`'*Ф!.7غ\bn>=@oQ({'Z2ʆ@-_ಡ'@0[@ήhbzf K$-Q hSIh?zj-:8ZHȯiѝUQ^N=z<}A"2I_b+)pǧpqY sz5ʁv<ٙEjruz 4؋wȇJ +}~>0_goo+%x;tG3EhR,M +=b4kBfsk 6Jev(ѷopSIG$5"ٰȕS:qOa\U9PNO_vam$5MXw?[؄\W%)2t"%znUG1J1`̙"-.j;p~΀9{_\Xr,A]J|NX xNE3[_2>XeD &Y6˱z.wyXye==:$v'.Q,%v.Hțv70s?;'n/\oK ū}L ˀqsJk~'s5e55u~/RQ8 - 8jFs UO;K;DwOF~5yIYVxi=Drvt>HkxŠ8Bz-kiy\ DF-oj TSH&a?G:$Б_WOag:\e M+FCl~/RĆS|¼{LgBq"LYZXUa_*(0: ${Get _CM0 T69 9\-:d?q3K4Nb( _&4C'@fҁp? _UI?҇F" CQt Q\|!Lůro/ڴT3 hھ=}Q{DH/c}_۴O-+X/wx6uLd?Nd?j~^@?pQ&LBGRIL djov-u%7%ܸ33L}gm0aw6b0_WMpO0Zzoe!_4z#w cT_vZpFI`8f*+^yau' }Sk^V9JԵ"h1$\]dV\-(*}Cv![jrN//D4XR%0o $!g}ݖ+OQ򸺴E@SNc`fjP+%E ,>hA|AaYA[<ﻹ`#uT] ulT\P3q([z_UG߂fB +jP:csA[WGW)<[/h={XwGt6$QL a [q܃V1="GE['v,Ny {@i<_ Xe٢$t4fCs_GEn#ƻXta)9A`5h{hŎC 0f)&PHѽ ھOG®-  Ri-J#( '! xvg( ; ʌw(؂<|$6rZ'*E)>%hl2~G~!u*-ϣR-$]{e.0>x"K$sTG3xӞ9}Oe<ȞWH[t1^:N$&AȹEc}P[zBQuxѥ\ ɣɻ2~lC WxZ؀"^NbHߎ3L=5/ N$!rz#mH y_U=esnu0o|wa@![73+i6fN' "\Nuz%e)E\[s9߷m|J"|0xJ QXO؏B9pC*%5RI>$Ԏ^P&驗nn*dyBѭt"m>\ H\l9wISkN o*\9]38)F9Dw!+^M})zm-͂SOpl@7$cA( d }SmR EGs8WE!.Pv,XIPzb~-Y f YO*w|P~e DSaWr>FlQ/~,$Vetܣ{/WH^AqVd-lIKw* I!D%fa1BoB JJdYd賯TYd߃?wpI:o4Wc-2p~џ+Y炁JC`Ch+Lè, {Ps۸!{REif̥4p'-Gٱ zoHj/= U+Oaq Po U-`H2x4im4əqK=U1TAAa@~&(lĈvR$g}K~!ZM:d|E[~e<|=Hzt} 0VsDW_b$: TC̯[H48JZMvP Z!`xA{?< Nyy]ωXPa!x!72R _`s 9I5XK r-eQZE]AZ< I}b~梮G;]NˀEiH4~m{c(9wxEXNP4 0h@(7Zlf2܆  {1IPEz{{(ah#{`+s62*h 8гC(*T#!YQ`(Y-7<²llQ&oM O$)QWZ ؞ϛ;nq>JHQahօϗQh&A?XRІ%yz$aep@EFhKs*Nnׁ4-!EHA0x!6ZK<>^+k7q_Ql_UFEg#R@[P_(DpAT_bsmlxdSr%E6| #g>Mo!h^񿀫P-?Se^ayGwE)Ej齾=m@x$jaT{2wwRGI$4ڕ=LyE\t-P/YZ;b"_JPXx>o!mF[X^m/jQjҗIRP=ʉ|Y8|}%Q&D4Bݡ6S+s.g%(#QP;;Kog v(]VCX 3]KɆ^#\#Bb|n1<-Z,zǫcR~@GӢu`\syYήҦ&JЉ!}EiѾPBޢ2u1ѨĈG{}Lٴ1 "J8k4ku8ǧ>z&}E=؂ob>plj0X¸;7^!eM'zWpgKVƷRX42+ "vuWq*@'q㐈Rmv XW~ *=;pv\LM\Cl.hI j3WniQ6d:8|GեZjفWLYh옿s~@2]JM;Q9wu~Rkh!XZX9WYwס$6H;䎷+@ ߠI)0a楕FF _&^ :ӢU)7ޚ#rȝ#>sH9lQ{GT9ִ' *-HU|+kgˋ;:L[ߍ B {v7g2JDr0 (HuwHӿB-N v8{<0p䘞/p4'GQ1WZe(w&`{xy+x+Mun1-TRzv6$ -N4밥_TRb'WmaLѷLbg玎3MxZ্0$Yi[\Ӭ[+6S 2WZNpVoKJ `eэeZgduc{}uHm5;]H-@t),9 ^a\zWy8>d(.l-˨펷/iRpÍ"ތ"d͡mwt;n!qZg^ƳZҘ~ҩ"-~V]-򾩓MGut,nᬔWďnI@ILهX%F54[d[UΉZD0Kr bqJj\TZ  ;Lō2;e{ 0ǑPσiA1G\:>& ?ϱExmi]-i; H_ޤҪ @DhVm+ XIH[p7+4Ϣ ؇txBhJ@J *REiZaidWL)m-iȲ vhLJpւsZa_'iI r:ԅ$:to).JعCߏ0.t6+mcr,ΰux^0fbcb1A:t(cinORļH)mw!Av coQ.t`; @Qa[N; MFOF:-,{mfyDOL\ѩGSӽcDgg|)K0GkQCncK ?QYK !A`JdV=/ǡD`ݜ: =we @ɊV^wӠa!ߥ?:buIwsPqSSiVht<Q=)YՑԏՀ_+b# J:=tt[F,\Mԙمyhk0谿xqVXK,iy;QMz`ЯUz]V% sUz;m-fXx5ٔ'8Z tʈm 6˰IHi,աH8|-Cc 'gi=1-7N/b¸p|GԂH}-fhF^n:l^ZrḼS2Q1;@ n-@χQ %[.Y-įCɳ K8( y%8`6peپ%=&34c_F6~:9vRt^" eܡԇq_2.D)Ohk~b{ `B=3xha!ҫi<;+C~oidR vhA; =Je-&+|-H ?i' \xdƟ|""{+s~iH>xѬݡwxS,4j|Q˭r*F Ң2\p@-+`5QΔ;x4Ry-n`Z}f 0>fvDdG&Mp;=:ߠGv3Wߕ lAw_KFA8sqSC7m Zv|WV(kPCq9뽺i/Lc̏xk%)w`fEhflJ.fzjll48h2"7FۘL򂳃ND!AE4gV ;1G"JIoUpc ܪ5[2gGBȆᬍS1AƔl-z}3slr%6}T`MDN nAS`}v"%AJ䈮hlɯ^z/o:˻WJlj>r[>ܚ8" &:TZԿPntMli@Êti9+)ƖRk9Xx1t:Pj҂IA`͆(R,;y-pH;2Κ8}^-x絾֍~l/ aCg"LMKb$@- $uS܇΍zP;,. G8 y-E=B l@!0s\k;KQ_VwS[q`sau~= P 6J;]o -N{?I'8::lv)SL3uX_X~-ANdğ9CZho?ryyr$$о?SvqVja(ȱa8:tHTΐõ gtIRn ܡĮx~]l3SwyٺMAMnVvޘ'uіn T)&:GJږgF\Ɏ"Ԝ1ٴJեf7`C3 %'kl0IFo=YGPz6^HPټ! Of^wU,Y7IJc z=CEi{;\ͤz VB<|:.q@Aڢ^hBhd3',JA]-ğH@Fl`p" '{ˇw||m0$Cn!k,1J;8hβ3C-hٛr$˱٪QjȍZݧ6!2!$C2%8 Cs4Q| H310k!!|lGC 6fc:@[şBж:m sx!RTR)GM}_OV}q]գ<_s0ȨKj{sW/+>LظצPY>W9푀BREKQxo 6;φB .?lPke4X[790H#h0VڣDK^-x$]zWWwsitAfZK 5Y b3E^!~ #`s̃f%ZY(u7U$f$Cvr[+K!4+zxRnqʐE`3Ҿ}<4<+ s bɥRQ fV7|:TG_fc5l˴9BL^7哛㱼QoN'3>-(~xs<搛*ǭUX:NyoH$ ܤV^Ptcy}&S2-B2m[Ơ@8H;E9!-qP9G Uc0! 2*h8`l{kӣr-r04{^u~̇UL ֈ9]:?we`Ǒ=tvXޥqY׭+7 Ld%pzTC%c@i3<^-la$H>IC#n-'F :팷H@Ql;B*t;5&5j oP06(m j-$ۙsѱs`JEA/ *g+XϏ vM֜ktx(+J\e2!UG%j;^}p{Fҽ[&I OpL&$&- due㓿4Gid׆zV ~]0x$A!'5V芼䞜[0k[m:ڄMz|=;D a 4Dǽl!%/꠸ux== zE\N:F)XS:$U!'4N]2hOK_`[<ӛأ=fE-!:(>S?KLα;ەxK FGf nQw/yIG'X[I4tbI~Zp4~Cy,%0˺8߀r?#/pGe}׾ɲ=cyqE&["@@e˿~d5$! 9:l}PUYY4ddɠBzeICD ih_ &$N4yoюj+9[*Vǁ(٘GS3/aW l 4olXD}=ʎTp$:OA˦ J_qUd*C'޼ Xp)R\؆8!Ǝ'Ek #L#r&1MNߟr.*$رfzhSyoR<{,9P|PR[/x }`KJJd(;@^L^jd5pQUxrNǁ^!nulPN/beS4Mh"㜠}S(Tƍ싆`2[j^k.D œ֋.XDW‚^EÄ+u[^i]S^專!iC Xe vd&`RQ_GޏWw2j LT OcT R9NPpGHaJo+RϏx5.`Eڵ0yPp J$WMLZeq0dzt U VT4ld'#Eҫ*1\4EߩOE 7+%v{}%zgHPJy:;09ډ۫% KHHav2[y~ir)5{nvА18t >+MFrP([ B u3BFAOpnRA-ӈx. pLP5 p/dbd% e7T@uh Ɔ,%Cv} d.ʨ6'0b̕zW:v\\[Fp!!]H;CTP0Ϣ<ꭤcQ:&BvGYt RȩlAWDS4oII8s2[/" P fM_snm9nX6ʓ/N`Rzs$(<#`TH +Ҁp&@4@pmѮT]~[8S8Pv t28QS5 Tɤd * A'% ņc| Ym^f#V1*r*)W`Á@NPUH* @rpF)g~"aTlxsoB V6#:%ۧ4BaԛPPH*֎BVH /9TRT At\yCJax7ʢx-Y,c _ {^n*Q<2rE0aB@s!4*2:ތIuJ8QG[{o 4_bE8gȿ&^ńo_< U:o!%^4oVoNz4b9BVV'[U65s*νH+@ki!B oKh!׺2U[{,4^"Eˊ74Ics<,`3 #˲Ƅ 3J+}xd#EEz#0c&bC%,@@ 4IKEEàPT (zPb7ɱ3^ Vw#! ߐ藿JItb ? DAáQa<%4OlKA`Uy X30mC# 4`Hf\H53Grz|Pq6+KUjؗĩoFL v;XlCMgRU3NI;[y,c7& д_2J-#`Q_V[#`v3C͹KTTGoxJWvz0@ⅨCa¿:猋&U@)ʓCjAv$ Uѱe<^7{Lh!h/ gd%JˢP2X\Î$E(:c_#4I {D𗐑%n[́ڡtDh-nߪQK qZ8&sh4[ch!X56˛MƏ4u-Hܹi 0ƛ".TF*X$Y0ؒNƗw\{DR1jAb>gh x+U(VP 2n XId3r9>Ju~78%FY{ F l@jPX׀$Ͼ^$xGm* "R62[{\a1JI^dp5eѭ I|ASAhlz: Ǥp;\DdpdHE`DڱB^!0#,, Ɗ rsg:W+'x iB$//Y.vp\Wk :Q4 YV'F 4޾}iaɕ%AT蔡m'GA7^'4TTdl2ZU~NWhu0vbk `."xPȯU#gvPEpb0}yXQ;-N~$ǀ*:ZIՕT]pWLfႱ.d4 o.,h|i!2:))7tSH*/ '{-xq9f@0DTF(N @Gԩd9WˀR1`:; UWg3rTF]{$ek\Xr:}ox\$+d(h8<틞smqFO Dј\P#=<*#jN]trIMZa%W~ \HK~.U0b3ABnsXc#Z9I -t54I‹3imt kٚʮnүh9{(%=gY $^4gv54s;dBaTMdWB5Wt)<VoZ &~ӧڋlQ2:5unCe){?SZ;[sg%J/,TH-Td$/<KH:6O`5c_2×s4,_rf<$2tV4RXSq|.Z10y(+fk 9q۷+pP 9۫]BSD<]sBA"T. A=EB΄ ǀA`%)WF/5Cκn R(6JCd{[W⠛H7Zre5_ B/d7& Kdzq0xkM{F?7@qj9tɏf57ijpγU hE`_@uhXlJ:B/Μl"kzQأ.eu(Wc_VpbrRXE^ѲUT a oDf 5OpJOfvFjÀo297ITl4ߚݰRs~8/XJaD2(>$ ˌJUD3U Fd!w\^+"FA'FfK*3SxvSfZ֑R$1 88 1%{ZORڎ,Bᢄcpu.@9F:}i=h#d7|ޮ]|4!7!z)r^Yp7?H#J*Qplխ H>$s4yMv֥xE_ !␰T믒d#"VX2QetVX`JXDK`P A)l"vmLAΎ}T99H_ a[=yG*DFy&+MtBvE׈H♵xP4:B)g}.I$kU`I&P vzc6LdγUqޞ@:_xR2v3^ou{#`gc8vrr)QNCCEf`ĿrzA0NJڌ(VnY2v{٬@p }[kAQI?sUTFxf^dS%9؈K*+pW8< Ÿ QIg'[]l\et3G 0KHMr6QZɆ+Ǩ+gj>VC]ޔUЩXN!*aepHM,V"%*P-!D"hVMc\: ){ΩHaY/ Սvf*s*N|tc*RsꙃNQ .Z/_iL;8WqNhpeh)cgTp8UpkiTbe4XW@ɨ7] sBP l`,6Na AaoB0u3d[p{6;:,B9 y anZ+ `86)'C ʣS$ș[4tPad h"C(s)Kr*X |Llq5rJ9Eai:I)GN ',xaGeJ"/DC$_i"uwh68w(Y) s$;` ̥ {3aP&6\MDI[c-D*S^>А,GJ+za_"'+?62X" bXCkYqpjѵc✩xU~'EݣJS*!@̾:2<&xZdD:uȇ \y<+%<"J&M !Z/8kM*tx0]z)ST1oAFSmgR`dAE؏PNpb*z۪ g`*PDۈn2(QENYɖ}J_h٫V#} tCc Vۑ&a"+|#{7NGZhtb;"Rjb{d2v8Ixڨ$4biMp B'U,`?^ppFC*CO] <\ф>eDP#)ZT p}ͦVuܧ; ?:<0";ಕX+:9MFh+5 F+vgNGKW"~xNGJ"nmBbg #'UҀԅ7H6l4ثX;?7sS^ӾPePI$!Kk_4D61"Qa7 _cV='J|G-QiR1lX@sx7+<ށe"&lRFFoLv#$8>ŐHxz8ipS*d\x9N[ \`6A7$47ހWYkWp` g*l<y 4.0 _cF;aUjؔ $C!!@:+(4h#ƅ(a&vjؓʑa͆&Z4Vr.XFER ޞAS$d5j j4i;. \j521Xʁ-W ]! 3:TWBKl=,/cʁ~JP&CQE9%;.ltE?-.UZDZV{p*G'^!gk:`MG!-kjkǁѐF0a)R͊ |, m)H@vq/ex@!JlǠaSJe7\qpDrľ!A` 5Jt•z 8}n&pa6Ұ(JRoK!"% Cleksٹ" I,uPbYU,%*МE w(`:+y\1F7)Gfˆv2{MGJXRf]TqD~j롡wqw5NS37'0C(BEMVOWV0 T݁g׊oDR8 !;1\H`@v8q0eMm5kXPg˻GWכr7vq?_}^n7·Wb}?=z_}_Wo֛vvm8b?;77<`$}y㇟>{gcS]oq8+E|Xn֮nf/LWElO>Fy~z\olgv7c`V+&U9c,qL?wwכvq[^_Fz<$8dxHX!rzh|yev;׏5x _{xx?qFΔ %;#LB/8>ᑌ&hX C O2y'_/v>"F 0!qyux[na]?#lGASQܴ;<rͱf diƑp_\|̑?t'?= Opt{ܳ<=ɜ'Cv(|{O`o m>'6|{k~j縹=)oOypʛS<7/Oܜ{~?es) >O),7ʶ?͟rl),7?mϧi,7;o/U{^. p{?yxLO8N||oOviwTϽ?Oi<??a)??arOؿg'߱o޶nz8y^߬?,Vb,w_F{*̾Il}1sŃlٴzyquÎXm^qG}TCꛫUdu͙z;{z-vPkѫv:PGH_徽ioraqG C$)/1|P}5us/͢?qI}N#ߙ `Y~X opV; ]/Wכݾ\D6|ξca_no]>^/ٿP~xEˮ|Hh{Y.l$v>7햍Ѡ!kw%l/ex!{5~nxTn.eGž_KŽV?]Mri11lQfG+ܘuzsO$q6iu"*8| \IWcnapozL{N=fk<D ;9O}ei6nOʸ+6b.cr)l_?$|Բ:Bz.i]~|޹g[޵Z8YLéե@o6x}׷}0_vw݃%CJ0B"_,GWT[o;%R ^,wk-,@9|yY.Vo;5W/r*HBF+#\ze чn1ӷx%*j!QC DVt+p}xF4ڵnR9ڮi@ei8{rf0^: ׻8i~z9/_[r 5oכw'oGğװFdwk`;-rjb,6%WD_wE ywgK3nZ]<mvQëeOW]6RMah^X nr^6d~l0>ԫj.yO^2>ժ/ 6~k,9"}.hRg?loGu (|b?9/V5?^'f=c/tH͞r]iVʮ?n?pm?g{H - 1gx~q@#-/IU~]"ɼ޸{fD|}8,1g39|FBn+<c@h$zԂ'f /[xt.DǷ흞H`˭Ei͎Q@]ЛZ#X7o%C˻]o+@{tꔌP/V7M (4y{^Ԡ>j!hj t-D_oڷoW?e/]>-?Xwݯfxˏu Vvx=/[9|6J}I?zu7bݽ^Vze%[?`@nnw׵7]񁷟kCuڛ'7vffɆo#Lv?ͮ۰AŒZGw0'sgכvq&3nsnu=Ҍx ϯlcŲ8 qr4/7F@O߿e1K{|n](nNɧ0w1z>Ohh)kKpW4L5Cs7{ j?Zր9"\7M4A&V?2}[Y2_@>gɉ^3ZS̅%?m?Osf=C)Nd<- ~j86rZ ŇTJs,%XM$8Wb9]1B#Y;X2;)ͦ[gO5sW_m7f1%Oݰު,=^<|aͣd!:75<~bg4-8mC|;}y߭z nGȇ[pd/SyJӷ} [}dHa:YO芛{gvmW?f\(';z9qڵ79ͰKl{U*8+6zϵ #Ff:QܲfٻVpڶ!L Z8ynm{Wcң4@|noyӷnZfGyt7u>b ggm{m9rSѱ`ذ%} !Pc}Y\n)ahQGL4nqćuiT;fp0,9xѐ"HQt=0ٷhw8} Rӫ|llylKwyU.uMe7UdE%ؠ>)|S{xoϠ36upx:Iv7UvHZW0Z]%VOnrqUQw7Yz35;S6U<,u_2¤ZM@J? }/8ŕdZuj&v^}}Ø=#lk?nomuo\qn*bkYMT'DNe]nb^>6FWY+WY !\ew]Z.7J/oww˯UlYm?Cd]k/[G6϶rYcC\d\Y7'ɵ&W"5$^=v%=alq>dH"oVumkY;Sv_h,==re*Mb~&+6pxCc@}ʕՎW}-+qeKFM_0O/CjhWt&]aUˁyxncTc>yا6%%k쒩1/x!lzpCo~ϋ۩'aɚxպu\E'r u/WZ}hW>\f?ܽ?riWܻƋjǷp cs䭩ysus!M/?~ߏtg>n_O7sޥsqxÍw/WHZN~|pߥn%M&]}J{9rQ6NO75I)ݎou@֛_zؽ{Wؿ#|~ Y:|^M?\NO,{W?~S4kO~=}?|7YJ/acV*\?n9a<կ;]WiY߽gB?̷qs# Ƈ$ϯ]x!~?\DǏ L}a{UJW\C?>1bs9W7W=ޏV"c?¿?v_ ᫿|tȟ^Mc+~ĝ.W H{~|zq|}>0]strS_s{wC>쇼7y?ݗ.{<2wO..,q;9OnF6~rr-r_yӓ??RMO;tt9>SQN;Oi=|.Èsߦy͏Y31.}M\;TOnܥyNH c/M38?G}$x;1?O?UZw*_ƠN; ø>ñiyZ H[!u]}{7~Sn =r}n7Wߍ&g= [_Ncv7WmZiӧtڏY~{ÓC=܏x WpxqrWp)oNtH<[NЌoC{=4i}xsݧ#aNiz92=ط}Yœߞx։<&>#vXQ\o{~f܍t8/':brgpdrSlX_`[]}p #+is"*e/Ǧk@3>bp.~Շҗ9FǃЈ=Wt^._AH/~yl?]I8{קS9Ǔ꽟0o>}H9ߍ .괛?s<9ܼxM~ݗu<$:FA`DJ{?^}ۛOק#שpl%YA\}]j{Kx?ٻP*k.L~yNqa?|d0΍py^>C_ncxTtv|MPh.}AN6ۯvϷsH\򹗧ovws/ݽrO8GRM0.ïh<?p8=9R\>uzap~|Hxdz٦/'I t849u8??_=@G~?3XyݵyҤ/Wpx7}?NN{3ΦU^qӇ/y&ݚ.i;|~,>磓!^H{Z>Gډ|#s"rl ׷A\ T~xt?3t<]{Ѕ-pN$*|*/~9{*|92=v̯/kM7oW_+i-}W+jԆ|3}w6=֛N3~h[ 8~;OW_ oa7wӉ;>> O~wOq~q^s<Ñ0Ӭ.//Ͼo}Ͷ<2/H/wœ?W_|7†:s<=qe|\ve)FϧSrD|<68$y!?;ݿ}<'g>;Vi-E~vǏ~A}ryU=:[t͏Gy8n/Ǧ_8>A7@J|8/~p_>j~>}K#W)65~Noxgt}tgoŋE|Si?nx+5QSmtpzWlsY~Gyy Dsgr'~He^sjWz;VqUBN}>mvp{+0yzJ./X'o/\yqz{`|qЙOC?;|LœGz_5v[*qHo5ty949g /Ӭ7P:axٿ;|d6Ōk/ioƦr{c:[OzqwM5?xo7w{ݻku:!Η/ +G_ZNn9O7S =&g:_E.׿:xλO?c:K~Xv/W[Yϟ/_9EsΝz{;Q3np*qrUzGs\(K_:@ VyѷN±oٷp:8qVyy W}wq||䴧1vyZ>i+}HtߧCӌ^5eXoҝo֟>>Nal] iOC?~I{#??z+ ,[wХT?|[|vܮ0X ?¾L>^ʕ/Ͼ>LnydiڿMsSW\ e`a h)t8??ǗNzlY_^BBW%fn?9lZz:2ЯZr9И`|y:|^x >_:|O}Oytlc/@}ݻOiH!Ǯӻ\U | _/ِ"/⛛G-|0u}YthY^ͮqM o;-&9Lj|?\=Oa/W9X,'.{q7C@{կ9Iwwif/Cp:m~<6]v۱%pPrP?ܩO_%kûo?~NgpdqqOiO"dlǡ\gr^'?)1?ȿvܭW^dSyy~p#WO?G9C\ERt_>vwoˡz5%Y Tg]}sH_ -޻5ߧiۧ3~o@#/ +_u_J<>~/>חٴ7{gGBEniBbRᥪx6f>3Ǖ5^NO?KOǧáco &lI+8~pSrd^2/a}8t~=m»XJӤNKW暗-۔?n]y ܳ_,5wK @q{sj'qz|O?o^l{<>"ãpow. /wwW8PIymm+Hߥywۯc:ES*+]NO{|L #?^m K%TgHo-_?>&@sx?s]HpZ9O{>Fނo>*DLJ7>ro{>6"0vX^z;;?7yާp6r~3nril|'9Np849ql_1<.w(rhrb;ۋ?=>==|ӵ:p ӡ?}ywh_aqܓnN4өVֺ.s/ϻ!mL<|Ng6luu<.=k}LXA+}_Y[|sEL~Oy%γ_t>w_ǗߎINa*?$:=]+^ C?Bsrw㔅1OLymhs9lZU9Rlլʓ;g^W*U*wΜFNUP9Z{Rbaizt2bUiթJ%3W*UZ眙UB1k2b%@l:U Bkիʗ53!-8lX9s:URzsfjU%KK3W*_ZۜymzUShsT%L 3W*__4_m;tTe6ĭW*[_2+l*V_zRmԫ>=>ɫ,μF Ҵj86m2FVkV[eDѴ&!F;eѴ֫^-24tPN;kiWj^r]fRѧS'M&]ί3ӫʓBʍK*Mˍ+M*7t8ԤjO*OʫGƫY+bJ>t)/9ί6W*],6SJj3xt8ڤrO*[ˍM6XZmRѧY/A^)/9ή6өJ&-WTpUKyqv m {t8t^l)/7VީF%Ky ^ͪ|)/8V%cj&u8'66%l4x5Z+ΜlƔ{(ua9٬l]?S>rrzu+yM7=.,Syͤ6 ^V' K\T Q^pYYҬ>UF4yofiW*#kmkKZUYѤ6TW*1kms-W*1lKzuVr3KG*/KlsKg|sըJ^hR^[_$uTeGyumf}[S*9 k\,zurɮq%?}(/ͬ/SeF7f֗TOiT%Fy=t^hRP]_zN{eS%Gy)mv}I4NUn4 nR[G/Q;)/Fet)ѫVY-1SNK|Ll2SN[Nǔ.e}n{Y)E>^ѼpXX_RЧW&}ZUQ^?[aRЧQ%&}ZUQ^?[cRsiTGypnICFU~4yMonICNU~KLU9R^C,,3W*MˈըJ22ʈ>,i2tfIUޥQ#UĹe&}U9YX:U)R^F,,3ӫʒR2><)&-3ӨJjbaZT4:̌u6FUgQ#M^̛[fR5ѧӗ[sEJVjc*F9- T>WY^vii4٤;GY|^}gq0295z-TV{V+e<S9: 'ũ:cz5jժʎ31ѐZ<UQq$6UQ^d]cnH>hi x2yjժJ0ΩѨijժJ0QɑK*G*Ԭaըʑʣ0ʫS"-M^W*KZFVUT^4ia xLmTrҨʑC0ΩZHiթJF`jW*KZk[VU7[}IIIQO[~z(^{^嵸v* aiwNWrZIF[ZեdƫA]IF{mz='lRNv^{^ZIF;q4&}ZUU&}zUR^d,7ӭJJciIFfU֔WWTniUeMyx5`5'[4¢yɋ}EUeMyɱ ^ݪ);T{iVNyq~IGVUKN>42ɴy&ySҪʛ>i >)/@TtSS^,.:W*w+EjUNy) ^ͪi2BtvIޥU7E'U#}Z}ɛI5|TLԟV]lo[n7z+%Ȗ2f6N&u OnVJ-llPf-w{uܖO~R>*WנTV%T"ˋPY*TMuVSyѲ UOӠY/;a_F]"\rfWfy Nkq˙4.L|9Z;Z)ř/gNǥӠ9m:iy˙ΩZY]rfwjQffyzmO^_sS*cZrnrjVeL 0V,<jiWSSZqK*cZsqVeMK`ͶNͪĩ< jԪJ흚USy̹As&w| **Ώɽ8ѬJdrW**ϐ6^ݪjiLWQ sdrW**N^;Rq48jJ=h843+B6bG;:[tȣ6^Vkģ^eTF;F2Z.hWZ*h8dX9K^$\9ZyΙլJ:g^W*W*tΜN*WZ(ymzURs7pTJbΙΫS+K9gV{VUT93;x52z2biթJJ8g^W*_*pΜq?!NUTޜ9:mTT.ݜYmZURlլʗ6g^;^UT؜9:U 3W*_*N?+cl :URqʫӗlf3nn$gN{tiSM5x:( [j*ѩv7TFkF+eta;Mej5(40ɟѨTF;Fker{u(Kh*WLaիJϜV^DiaիJsϜd)6 ZtjWR^p,6ӫʘj*>i2r~IG^UWqiTeKyq~:UR^n,6W*Yʫ&}}ɗiN7|y΁7|wF{e4l\I<Nf7 xYfY)Ma9l f={zϮv^i^x[XzFet f{f4SM6,UuşO嶙 ^}hnREFJJR^hRj}li:UQ^iY^֫OETeFf֗?*1 lsէʌ&oͬ/956H:rIqmn}N(qg6ګSM/9ϧʌZ>Uf4yon}UQ^M+/W*7fחSմ%nTQ|%7jB_v|?'i)mS>SaӾ'ѫJ]cjjPV|L9m:i)WYcii٧G>[ǔs*>(T=UeGyp~IDVJ >)/ ί1ӪJ&Ab<UQ^?[eRѧQ Mқ]f:NUKLիJ"baZUyR^G[fRѧQ&ue&}ZUYd&2ʈGʑ22>iz2>)#TKUeIy-q~IDVUgΫQ&2{0йefH^=U9R^M[fR9ѧї[s9JF=:3:( 1iv4S9^Vii6Y{hL4*ɘg>k4Sl\LejUFb*WTL4lZUQq(6Zy5ңjpjUQq$6SzѨʎ26miTG偘iթJajW*EZv^,8 SUY0LmujUeIY6lSG*G*F+FUTN;"- ^W*KZ^<8SmUiLmjUeI!ڨHQ#g`jW*G*NNU4SW*^,)oPZ}ɓIM4m$?99='EE=mY{ ^Vkq'T2iPN;hWQ9-$6^N2ll.$v^kq'SNv^^զ̰viUKyq~*V/M^_oիʗ2cqIFnUΔK+N74ҦXxiZUiS^p,9ӬJ&AɚVU֔W NժJ&W6E⢓*>ݪ)<T}hݪ)>/:ӪJcEfU4:cҪʛ*>iJ>)/AΫ[9u{5rYXtVU#KNF42bMGä| "`nrrѫߨ![njVvK-7x5(eЖmmjJ.vl f{f{erWm^\ZRҥҩZO*KE(-}U*ʖ>*/[T\U U^,Ctӭʨey!JKvUF/WΫaU%̥W%Vy ^ݪjdy%JL~ʫ&JK+$'֥[UJ$ɉS* T.zIz԰ʫJ$ S*ʋŕHnUb5yra%Uydiq%7uҭʪ gy%UYU^,D2-Njz%'nS3[+mp6(rνF^Z1mmܖ69*TQ^K{mzm9f;f;evas[[@pr ktjex2[G'[(է$*4WX~֬ʢj_ijnUW~~U&5VukW%Syunͪd*ޭ]LMƤ ɥjfU.W KPz52|<-ܺUT^+/Aԯʦ&"n|*/TsjVSyS*P_RiVRyunͪ\jci ݺUT^[X~U65𕖠TieRy[5ܚ}II9S-A]drh7(%Աi6*%nlenknve~~[ 2[[qέ^-n@\fVRΥٗib6/jTtV%SKkPj:ʦS*+U(7U9U^,-Cԭʩ£P֯ʩ&sX Qm>ݪ*mWέ[SM^d,D[*ʋK+Y^Rө_Y5JjNݪ*qWTtWU%*'Yӭʪgi%J5NnUV5yS*k +Qs:5ιun*/uWޭ[X΅hp۪j2tU?ߞlPfsL3ۨ.1F~k<4[(9ƭV-1nvniifVʧ^-1nlqivڞ.1[*ZcUUqi6u29֯ʨ_iM|U Uqi8jUBUcmUoկJv{vURUa *ZaSW**N0VKˠd447UTy~i6zurګ_M-L/6^|847z5ҩ٥Ϋ]MGfMiVRɥ٨rҼ@VR[KʫC6vbZ2MO@bVVμFΝNk νF^Ν<:m|;w8u)Evnuiu8ds;CGǎ~nkFOÕ2\nu07q{uro};;T71F]y?Omܮ_iSvWoaޏoT4+k0w*|UUNW+Qz£jUdl\y)JT852 a-E.*'ŨwkWeV9c]X~Ufc֥(n:~ήf*KbUvKlkSfnkWvK ܬ ̖0Y;TjI[J]_|rNʁ_wovXH3#ͤb*Eo:(T_aj1W\̊h&{rmȯn&WO'Dˬx-zbәmMx浩Zάxu[fsTXWГIH-yYtCE.yZ˜}.y\=<.]$[Ԓ'ŐN%OÎ$Ԛ'awy㋪"d/%#A( BaJF P2 0d1%#A( 6+PFhL2B Pd2%#A( BeJF(O2F! Q 5d2$C' >eI(O2D|! Qd2$C' 2+PFlL2B Pd2%#A( BeJF(O2F! Qz=ʨL1"|S8b1#A >ňa)FN1$|SbHG#z >ň])FO1"|Sb-cj'B >ɐY0H^1#l. >˸O2ӻ*. >˘O2ӻ(@wO]dz!oxM0*^Fe4xM0*^Fe4A FM0JhFzPz] Pz] Pz] Pz] 8&^hBu&{MT}36L dD'%#.0!|z]`)a7u$a BSJFP2 0d)%#L'c BSjE$i|z]`S)'Ru)VOSDX=L LRY=R2 0d)%#LA(a BSIƘP3!^1ڴoI/ɦdӋgE3lz1eL$ fE2aTz!6S^4&M/ɦdӋd]|z^4L/b|XL6p(&s'MսT `D!# A'q:D F$N0Bl!``D#"X6`## A' :I FLN0t`%C0A ūgMTнZ&M FhN0Bt`&#4A'п&#4A' .+DhߴT`&#4A' :M Fh" u`b&C4XߌKQ`&#4A' :M FhN0Bl!`&@mJ0Bt`&#4A' :M FhM0Ft!S }&&M FhN0Bt`&#4A' 6M FhN0B\W~Q FhN0Bt`&#4A' :M hN1Dt!P֣P|:ƹb&#8 >O)F|O1|Sb(#HQ 2+0E78)FO1|SPb*#X >W)ƼO2|! 1nWS#d! >Y)FȂO1B| b,#dA" >Y)FȂL db,#d! >Y)FȂO1BeSb,cd'" >YH~l |Sb,#d! >Y)FȂN1D|SȂ/*#d! >Y)FȂO1B|Sb,$Cd'" +fVoX. >˸O2ӻ*. >˘O2ӻ(@wO]dz!D*hQ2`T&/ FhQ2`T&/ BM0JhQ2@4WϬ IVOMVX=O 4zJ^hb >.dzW7o_Y=R2 d'%#@A( BQIƌP3!`Ѭދv)^Bu)^Bu)^Bu)^Bu)Nz}` Pz]` 3(C&a BSJFP2 0d)%#L+6SjP3,WϦ IVOSJX=O Lz^b$ >.0)dzW` ! 0d)%#LA(a BSJFO2! 1Єz]W̝ b&#4 >M)FhO1BgSb&c4' >MHv5k\ 4jĹ^hլs.ЄYz] W&@fMu&^3kQtSb&#4gSb&c4' >M0Hn_1_UM/ BpP2 '/ BˀP2 (FA(xR ^l! L)/C BˌP2 L(/ B|P2b'6hB֛ >N)FtO1|SbD(#DA2 >R)FL Lq >T)FO1B|S`bD+#\A >XIĂD)+E7}Ϥ! >Y)FȂO1B|Sb,#dA" >Y)FȂL d! >Y)FȂO1B|Sb,#dA# >YIȂD4et FY)FȂO1B|Sb,#dA" >Y)FȂL d! >Y)FȂO1B|Sb,#dA# >YIȂAr}|#)(`D,#`A' :W FN0tP`H*#PA'q .+0`D)#HA'1 :Q FN0t`L'C8A ůYÛ귇)Y >ňN)FxO1|Sb(CFA >ňR)^)#N >ňT)FO1b|Shb+c^' >ɐXH~~geaYr! >Y)FȂO1B|SE#d! :Y)FȂO1BdW d! >Y)FȂO1B|໻!d! :YIȂO2D$YY,H Rb,#d! >Y)FȂO1B|S b,#dAxSb,#d! >Y)FȂO1B|Sd,$Cd ̊˹e`wW]|zQePwS]|z^(. >pL/DaSUCfLe8A)yNPJ^e@A)yPPJ^F f@)x4]` Pz]` Pz]` Pz]` Pz]`^Bu)^B0EMO%a BSJFP2 0d)%#L'c BSjE$i|z]`*'Uu)VOSPX=L LQ7ާ\2 0d)%#LA(a BSJFO2! 1s*HҢS*'Tu)VOSLX=O Lz"2z d)%#LA(a BSJFP21f)5CLAyp6\/?8ˏ)cs\/?8ˏ)csLLqSJ LMzQ >R)FO1B|Sb'#NIlDzPz] Pz] Pz] Pz] 8&^hBu&{M m&R)FhO1B|Sb&#4 >M)hO2D|! ށv&^hBu&^hBu&^hBu&^hBu&Nz} Pz] 3BU7]$ BNJFtP2 dD(%#D'3 BRjEzPz]` Pz]` Pz]` Pz]` 8)^Bu)ԻSfbD)#H1 >Q)FO1|SbL'$C8' ɒ< `~: `~> `~B G`~Fq.SL0?ЂWpn@dD*%#TA( BVJFP2fH,5Cd@Ldj$E&p5"YK ,\ 8YM ,^1TM3b`Ԍf-5#n F͈\0jFP3f!` hҴ|J|J|J|J|q_(>_UK F_0jFQ3`Ԍf/5#|A F_0Fa`8L|jE&p5"_jq. p5"_bM-5#| F_0jFQ3`Ԍf/EC|( +]T~x{*Q2`TL0/# F Q2`TL1/c Bŀc0*^Ib2/ FQ2`T0/ FQ2`T.#p(` FZH^=ڄ d,%#hA(Q B[JF܂P2 d.%#xA( 6+d/%#A( BaJF P2 0d15CA ͫg_Tto@% BeJF(P2B Pd2%#' BeJF(M A( BeJF(P2B Pd2%#' Bej(E9ų" C"((_0jFQ3`Ԍf/5#| B_0Q44W`ɑVO _A(X= P|z `b B>lWz4#| F_0jFQ3`Ԍf/5c|( F_Ј^=%GZ=P|z`b B>}S/'^ ^/h7^pjFQ3`Ԍf/5#| B_0Q4+f_T*oJ2I($xJFc< %1QeA) xJFc< %1l!֠xJFc< %1OBh'eA)ygPJFc<$#A$ xh^=*iT Pd2%#A( BeJF(P2B|! Pd2$@ Pd2%#A( BeJF(P2B|1 Qf2X4QmfKF(P2B Pd2%#A( BeI(P2B`eJF(P2B Pd2%#A( BeI(P3D!`V $#A( BeJF(P2B Pd2$CA( BeI^2%#A( BeJF(P2B Pd2$cA BePh_5+{w=@`1#A'! :` FN0t` `-#h%x`+#XA' :T FN0t`b'C8/M[=Wb'#: >ňO)FO1"|S b)#JAxS8b*#R >ňU)FO1|Syd,$CbA"3.B&F#d! >Y)FȂO1B|Sb,Cd! >Y)^,#d! >Y)FȂO1B|Sb,cd'" >YH~~ie ,J1B|Sb,#d! >Y)FȂN1D|SȂO1B|Sb,#d! >Y)FȂN1F|! U3+MR)FȂO1B|Sb,#d! >Y)ȂO1B| SY)FȂO1B|Sb,#d! >Y)ȂO2D|! Y!6o:a d-%#nA( BɈ\JFO2d P2 d0%#A(A BɈbJFO2! Iw\VoMN%#A( BeJF(P2B Pd2$CA( BeI^2%#A( BeJF(P2B Pd2$cA Beh~PIF(P2B Pd2%#A( BeI(P2B`eJF(P2B Pd2%#A( BeI(P3D!ʠܾn&FF2R&ňd)F O1|S(b1#! :Ő`)FO1dW >ň^)FO1b|Sb.#na :ŘZIЂO2d$_3#pPdD-%#lA(q B\JFP2B|! dD/$ dD0%#A(1 BbJFP2|1 AfH2X4f&IkfbIF(P2B Pd2%#A( >eJF(P2BlW BeJF(P2B Pd2%#A( >ej(P3D,_~Y2X}Q Pd2%#A( BeJF(P2B|! Pd2$@ Pd2%#A( BeJF(P2B|1 Qf2(4wQ14KF(P2B Pd2%#A( BeI(P2B`eJF(P2B Pd2%#A( BeI(P3D!`Y$ Pd2%#A( BeJF(P2B|! Pd2$@ Pd2%#A( BeJF(P2B|1 Qf2X4bVFPd2%#A( BeJF(P2B Qd2%#&y Pd2%#A( BeJF(P2BQf25C2"I#+feJF(P2B Pd2%#A( >eJF(P2BlW BeJF(P2B Pd2%#A( >ej(P3DW: P2  1/# BP2  // >\ ^`,]edA)yYPJ^FedA)yYPJ^F f,x4A(X= Pdz`b B> } /@N2B d,%#dA(! BYJFȂO2F! ճ/XՓ/@^ ,VO YvA(X=PdzȢd fA F͈Z0jF؂Q3`Ԍf.5cv( Fѐ^Ј^=%GZ=P|z`b B> }-'[ ^/N2 d.%#rA( BɈ[JF؂O2! s-"C^t.xY ^FedA(xY ^Fed' BȂP2` ET}&yYPJ^FedA)yYPJ^Fed(! JYPjȂG,y} s-@Z ,Vϵ YkA(X=ׂM dQ d,%#dA(! BYJFȂP2B d,5CdA" }jB ,`B ,`B ,`B ,`$ P} %PM#dd$#dA(! BYJFȂP2B d,$cdA" BYh^=˂%/Z=˂Pdz`b, B>Y} ճ,@gY ^,jg d,%#dA(! BYJFȂP2B|1 f,4Y`~d G`~d G`~d G`~d G L0?# -xh#b >ňW)FO1|SXb*cR' >ɐSHv5"S_ )\ͯWd}` W+;Wd}`W̯d)%#PA( BUJFP2 pd+5C`A ͮWd} W+2>`Ldj~Ź`'LdaK'! BYJFȂP2B d,%#d'# BYjȂE`Ldj~E&p5"Y_q. p5"Yb~EUIFȂP2B d,%#dA(! BYIȂP3D!\b~E`ȋ/# BȂP2 ,/# BȂP2 ,dA(xY ^Fl! .iefyZpj^eny\pj^&f.8Ex) "}jB /`B /`B /`B /`$ P} %PO#|-f/5#| F_0jFQ3`Ԍf/EC|( ѫg\Hg\ /Vϸ _qA(X=P|z`b 6+ETeӌf/5#| F_0jFQ3 Ԍh/EC|A#Zg_(>_(>_(>_(>_;J|j/BG`Ԍf/5#| F_0jFP3!` զg// BP2 // BP2 e|A(x_ P2  ./S BȂP2  +/ B˘O0b T s-M q >N)FtO1|SbD(#DA2 >R)FL Lq >T)FO1B|S`bD+#\A >XIĂDY&)FȂO1B|Sb,#d! >Y)ȂO1B| SY)FȂO1B|Sb,#d! >Y)ȂO2D|! z~E [6Y)FȂO1B|Sb,#d! :Y)FȂO1BdW >Y)FȂO1B|Sb,#d! :YIȂO2D fV0@sY)FȂO1B|Sb,#d! :Y)FȂO1BdW >Y)FȂO1B|Sb,#d! :YIȂO2D$_1ˢ,e! >Y)FȂO1B|Sb,Cd! >Y)^,#d! >Y)FȂO1B|Sb,cd'" >YH~,d-%#jA(a BɈ[JFP2" d/%#z&y d0%#A(! BɈaJFP29f25C3.:ňd)F O1|S(b1#! :Ő`)FO1dW >ň^)FO1b|Sb.#na :ŘZIЂO2d W͸[6Y)FȂO1B|Sb,#d! :Y)FȂO1BdW >Y)FȂO1B|Sb,#d! :YIȂO2D$_1"0L=d-%#jA(a BɈ[JFP2" d/%#z&y d0%#A(! BɈaJFP29f25C/";. Pd2%#A( BeJF(P2B|! Pd2$@ Pd2%#A( BeJF(P2B|1 Qf2X4bE$#A( BeJF(P2B Pd2$CA( BeI^2%#A( BeJF(P2B Pd2$cA Be5=<~>~nͧǛ;%D֬~aw{n~o o>wݗϏUշ7wA=>|voovwoWwW;\&*KWePϿKjo^}aokv_,[7&~[?fۆ?=0D~z؏??}?|c {aYG~v-kn6n7676ϮWt ¦ yܑzSEp]ʊVE`]ʊUEP]&jHOv?];X qbÛ]fb5`X &j6.Vvb5Vh1l]ƸvMl]vb5vhDX&jvZW.V방bN; <~zbn7]ݦպvZ.Vզ4vڄMcM4vԛ.VfjnXmMcMib6]Mkmib .V۸ib7]ͦնݴvv.V~j;lZX.Vjj6]vqjWo:XMg]b6]vntvo7]զ>lzX㦷վv7.VvjmzXMobunX`C v:`Cbuh6]fա v:.Va3j&c&ccj5&cM緩Iw7?l?f??53v3v&M MMɲ)55Yv5&˾dٔZ,{RsewSjo2oįaS$~ { 7H9UAװө NU5vįaS$~ ; kTE_î*J=UQװ󩊩0~įaS%~ (kUE_*JvAUQװ%~ ;Zװ%~ ZװK[KDUįaWTUKEUįagTUKFUįawTHGUįaTHHUįaTդz 㷑5씪_^5얪_~5옪Z_Þ5욪Z_þ5윪Z_ީM/o+k?UTU+kCUu]TU'kGUuTU'kKUuTU'kOUuUU^5Nװ$~ ^װ%~ {^װ%~ ^װê%~ {^װ˪%~ >oįaU5Hv[UįaU5Hv\UįaU5Hv]UįaU5Hv^UįaU5Hv_UCoaiK`&_m`&_m WanaUv`&_ Wڦ??1Jװ*TW5 įaU$~ B%k*_PI_4`ʰ*SWa2ei̔aUH B5eҰ)M_4pʰ*SW!J_(kįaUiLaF_%~ B5 Qװ*D_%~ B-kj_PK_Zװ*iУaW5 įaU%~ B-k_H_Fװ*4W5 MjįaUh$~ B#k_J_Vװ*W5 įaUh%~ B-o+kZ_J_Nװ*tW5 įaU$~ B'k:_ХqI_Nװ*W5 įaU%~ B/kz_K_^װ*i%~ k_0H_Aװ* Wa5 įaU$~ ke]mڴ.~D hq Dm6Ѱ*nM4쿊n D6Ѱ*VWJo%k+_XI_Jװ*VW5쿊įaU$~ b5쿊Aװ*qa_$~ b5쿊Aװ*_$~ b5쿊i?3쿊i?8ngi?3쿊i@4쿊i@4쿊įaU%~ b-kk_X; 㷖5쿊įaU%~ b-kk_H_Fװ*6W5쿊įaUlH_Fװ*6W5쿊įaUl%~ b+k[_J_Vװ*imm%~ b+k[_I_Nװ*vW5쿊įaU$~ b'k;_I_Nװ*W5쿊įaU%~ b/k{_K_^װ*W5쿊įaU$~ k_8H_Aװ*Wq5쿊įaU$~ vS_jS_۰ mԆWԆWԆWԆWԆWԆWvԆWu%kUWWu%kUWWu%kUWWu%kUWWu%kUWWu5쿪įaU$~ kU_:H_AװWu5쿪įaU%~ (kUG_:J_QװWu5쿪įaU%~ (kUWu-kUWu-kUWu-kUWu-kUWu-kU7Wu#kU7Wu#kU7Wu#kU7Wu#kU7Wu#kUWu+kUWu+kUWu+kUWu+kUWu+kUwWu'kUwWu'kUwWu'kUwWu'kUwWu'kUWu/kUWu/kUWu/kUWu/kUWu/kUW kUW kUW kUW kUW klưVưنMcl1j1jͦ1j1jݦ1j1jæ1j*_5j*_5j*_5j*_5j*_5jįaU$~ k_&H_5Aװ WM5jįaU$~ (kD_&J_5QװWM5jįaU%~ (kD_5jj_5jj_5jj_5jj_5jj_5j_5j_5j_5j_5j_5jZ_5jZ_5jZ_5jZ_5jZ_5j:_5j:_5j:_5j:_5j:_5jz_5jz_5jz_5jz_5jz_f5j_f5j_f5j_f5j_f5j_vݴWڴW6lZv7aU7aUm6aUm7aU6aU7aU6aU[I_įaU[I_įaU[I_įaU[I_įaU[I_įaU$~ k_6H_Aװ Wm5jįaU$~ kF_6J_QװWm5jįaU%~ (kF_6J_įaU[K_įaU[K_įaU[K_įaU[K_įaU[K_įaUH_įaUH_įaUH_įaUH_įaUH_įaUJ_įaUJ_įaUJ_įaUJ_įaUJ_įaUI_įaUI_įaUI_įaUI_įaUI_įaUK_įaUK_įaUK_įaUK_įaUK_įaU;H_įaU;H_įaU;H_įaU;H_įaU;H_u3զ3a_u۸ m m m m m Jװ$~ Jװ$~ Jװ$~ Jװ$~ Jװ$~ k_.H_uAװ W]5įaU$~ k_.J_uQװW]5įaU%~ (kE_.J_uQװ%~ Zװ%~ Zװ%~ Zװ%~ Zװ%~ Zװk$~ Fװk$~ Fװk$~ Fװk$~ Fװk$~ Fװk%~ Vװk%~ Vװk%~ Vװk%~ Vװk%~ Vװ$~ Nװ$~ Nװ$~ Nװ$~ Nװ$~ Nװ%~?:v`BZ'fCmrդd N^p N^p N^p N^p N^p N]p N]p N]p N]p N]p*[_e/U%6Wp*_e_lK8-WK8q_e\p*W/ʸ~U 2_8q_e~U_e~U_e~U_e~U_e~U_~U_~U_~U_~U_~U_~U_~U_~U_~U_~U_~U_~U_~U_~U_~U_~U_~U_~U_~U_~U_~U_~U_~U_~U_~U_e^p*W/ʼ~U 2_8y_e^p*WY/ʺ~U 篲_8u_e]p*WY/ʺ~U_j+8Um|篪ͯUWWpZ~篪WpW/~U *_8Uq_U\pW/~/~/~/~/~/q/q/q/q/q/y/y/y/y/y/uZ/uZ/uZ/uZ/uZ/}/}/}/}/}/s:/s:/s:/s:/s:/~U *_8Uy_U^pW/~U 篪_8Uu_U]pWU/~U 篪_8Uuh} +\a| WX~B} Lé\֍?p2Ɵi8u4κgg3 'n3Z7L)VLI֍?pZƟi8u4غgl3 ns[7LɭVL֍?pƟi8u4gq3 'n\7Lii}}}M֓'r4ZZ>h}uy.2^0>7`O3pizz;in^i7ZOZ/Y[xwZ~Oh}J;idPZ=VzCjPZMj5դVZMj5դVZMj5բVZ-jբVZ-jբVZ}ߣ2{#?w?qa?ql{S7w?qu+ߕo~oڗ7e?߫O{oޢw>>?Owbw>>?OwbN|~^߅]y߅]yn1Xhn^Oo?67x{/—|~{>O_߈{=''{=ܟz{^nOO_ҞsY~=?ff7~Eܛۛۛa=a=a{w{~R\ K{FoS_{ӔM/_d~>eu3p}wbs}w5?pχp~>>?owO_.?|߃|{~=ss\7O&Wop~Uxo'|l?wܷi?bv~qݞG;;y}|~Ưhlw>>'>?O|~^ %\?pý DZ'/߸p?qZ9NϯNgϯ8epM7O_j:ܟpχ:oϳYwܷ٬٬6llo<Þg`ag<Þgwv{;=?nϳ_oWw;pѾ 5Ͼwp}ymp?pp>;Wn? 77>?oww>=>?߃>?|~>7o7~og^ ?~rj&x'?6O~w+Wkq]]mjep?p1qi?l7ܷձ>p=?v_>>?w`;w |~<N|~<7{Kp?pgO_qo+ql7~ݫ?qc?v~i3ϙp>OϷlo799xM>?>?W} ~wy7{~>>n=?f_Þwwww_%X7zpo?$>~31ٸIܯOqtyj/O/_ ?W?pZw ىe>ϰog}|~N|~N&￉ωϹq￉ ️ϯ ?*fϧi|}~uOi|=?fϧOm_o ֟pקl7{}z~__Oh9?:ܿz%=c~So ܟ,{ͫ~⬆Oܿz'\'wOqwko?_|8OO/O&Ϸ?q￉oss[x-|~.|~x->?=?gkol͞s6*}~9Þ39>ʰo39Þ39xx}oU%|qKo?_d/WѴ'/~{sO/۟~g߹q~~jaw?qχq>>?/w7nw/nw߃{>?|{ωy?C^)xy~}Q?ZeO/گ/U ?pfV۸p?qO 7O/suM_}{~vM_w}QBOGw>{G$_ ]wt}EȢ}wt}C?#ރ?{OOO)2f~ WR&_a _+J~3d*2WiJۮp} $2>d|-Gƥ#"B]|-GS G.RB:676767676767Atʃ)S RB%疫/Zߴ~h=id}PzzAoZ?^~CjPZ=VzC&jRI&jRI&jQEZjQEZjQEoG(jb,m~eplWd?p 7c۱ߎvco~;۱ߎw`~;߁w`~';߉Nwb~߅.wa ]~6l~ w˟̲nq?p߃&ob&ob&oa[oa[oaefffffffffo`o`o~;s^{/Կ߫d>lO?qe~>;߉Nwb~߅.wa ]~ߍnwc~7ߍn`=~{߃`M7~M7^||M^o?_?wh?p;;;;;;o`o`o`o~;۱ߎvc~;߁w`~;߉Nwb~';߉.wa ]~߅.7xo`>lۋ3~9eͧTp?p 7O~M7~M7~M췰~ -췰~ -췰߲~g~g~g~g~g~g~g~g~g~g~ 7~ 7~ c׽jeͧ͏Mym 7O/۟~';߉Nwb~߅.wa ]~ߍnwc~7ߍn`=~{߃`M7~ 7d~7r%nP?pWkofffffffo`o`o~;۱ߎvco~;;߁w`~;߁Nwb~`7c5ͧͯfap 7O/ ߍnwc~7{߃`=~{߃&ob&ob&oa[oa[oaefffffffffo`o`?0~ߛܯ{ѕ85Wm6?m~}]~?fNX}⫳psl>)s2g>hozu'6eɫ3?Y9rsji}N(vm?_w?q~7߃`=~{߃7~M7~M7~ -췰~ -췰~ -7ff~Y٬lo67 7~ 7~ 7ߎQ7WcoJ/6l>^?w?q~';߉Nwb~';߅.wa ]~߅.wc~7ߍnwc=~{߃`=~M@XJfE9ciEl>l 2k'WkoV~Yլjo5뷚[ 7~ 7~ 7ߎvco~;۱ߎvw`~;߁w`~';߉Nwn\½ݷf|j66m~|g'/߸p?ql7️nwc~7{߃`=~{߃&ob&ob&oa[oa[oaeFk] Xwk.`⻀e|]@K-9ВCK-9ВCK-9 -Zo_~~3 W8|+^a4B:_a&_aMnzpӓ'7=MOnzrӓ7M/nzqӋ^7Monzsӛ7A˧U;ql4o+,+BJ|WওNn:䦓Nn⦋.n⦋.nҦiMGӦiѴ[+hw+pM7tpM7tpM7ݹMwnsӝt;7ݹMnzpӃ7=MnzЉxScG;eoZ?^w$VZ>h}M֓KzCjPZ=VzդVZMj5դVZMj5դVZ-jբVZ-jբVZ-j7랠]xui~<}ti>az}|||46?l~mVmXav[ݪVmjUۭnv[êVjU;avXêVjU;iNvZӪVjUe.vY˪]VjUen =}#m!oyGțN)}J/O26m~e[ǪM6ڴjӪM6ڴjӪM6ڲj˪-ڲj˪-ڲj퍪퍪퍪퍪퍪퍪퍪퍪퍪ͪ 6ڰjê 6ڰjê 6nvFE`~׆>A>A~ѽwMd~u/6l>mh F|ؼU;iNvZӪVjUe.vY˪]VjUmnv[۪VjUmnXǪ=VjU{cXǪM6ڴjӪM67>^Q2_4d>lE;a~mKnThThThThThThVmXaՆUVmXaՆUVmXav[ݪVmjUۭnv[êVjU;avXêVjU;iNvZӪVjUe.vY˪]VjU7o2J}iOo_Hl>liOjӪM6ڴjӪM6ڴjӪMڲj˪-ڲj˪-ڢjgjgjgjgjgjgjgjgjgjgjê 6ڰjê 6ڰjê [ݪV훌uyvyvyvyvy(?NeiO/VjU;iNvZӪVjUe.vY˪]VjUmnv[۪VjUmnXǪ=VjU{cXǪM6ڴjӪ}u9#䴏>BNW曌n/6l>md~(jWjWjWjWjWjWjWjWjê 6ڰjê 6ڰjê [ݪVmjUۭnv[ݪVjU;avXêVjU;iNvZS5#5#5#5##g֛0?l~mḋ[۪VjUmnXǪ=VjU{cXǪM6ڴjӪM6ڴjӪM6ڲj˪-ڲj˪-ڲjݍݍݍݍݍݍݍݍݍͪ 6ڰjê 6ڰjê}N/~vzlΨoQ Fdv}ˋ3m~Mo:c`8iw>lj Z>h}{?66_4͇w6?m~ټUe.v[۪VjUmnv[۪=VjU{cXǪ=VjӪM6ڴjӪM6ڴjӪMڲj˪-ڲj˪-ڢjOjOjOjOjOjOjOjOjOjOjê 6:} [>'o}N\^a򷴧S}Kl~ksh=)MQ#>7orFA'h}+sh=)YM^IN̠I̢?ζ9J11 Co~(K~!%HI᝘PdoV7]8fbENeU>n7ttzse5PVWWe5VhDYMhuA+ZVGYm( e6ՎQV;jGY(evՎQVe5QVe5QVe5QVe5QVe5QV ePV ePV ePV ePV eHVs"Y͉d5'՜HVs"Y͉d5'՜HVs"Y eUPVeUPVeUPVeUPVeUPVeUQVgy Nf6dfJf6dJ D%-olyg[;[XjYjYjYjYjYj6Xj6Xj6Xj6Xj6XjKmcm,6RXjKmc,vRYj;Kmg,6Yj6'3DWFN`ut8L:tNtNtNwcɹYolΖO|kD-ɖ/B-lyRXjKmcm,vRYj;Kmg,vdMdMdMdMdMb-b-b-b-b-Z&QvGQrG}QewGQzG}QW`~W`~W`~W`~W`~gQ ,d4ʓY(OA<(O>3ʓ}F.Z_lYB \_w~a~ `~ a~a~a~a~a~7`~7`~7`~7`~7`~6`~om<ʓ(Oˣ\`urX\=ֹX\=V%WUUusʪPʪPʪPʪPʪPʪPʪPʪPʪPʪPʪPʪPʪPʪPʪPʪPʪPʪPʪPʪPʪPʪPʪPʪPʪPʪPʪPʪPʪPv~Rml'e?)IY#JY#JY#JY#JY#JY#JY#JY#JY#JY#JY#JY#JY#JY#JY#JY#JY#JY#Jw/lj'z\qE>' 5-lƖldYf,/lyeˣڄRkJM(6ڄRkK K K K K K*K*K*K*K*KKKKKK:K:K:K:K:KmKmKmKmKmFy52F>{ ehw(CCPȄf ,?Pdya+[Ζ|cw|Yj6Yj6Yj6Yj6Yj6YjXjXjXjXjPj}B 'ZPj}B 'ZPj}BVXjVXjVXjVXjVXjVYjVYjiGCǎvr;ݡj,j$k$k$k$k$k$k$,R,R,R,R,R,R,R,R,R,RXjKmcm,6RXjY)Y)Y)Y)Y)Y)Y)Y)Y)Y)Y)Y)Y)Y)Y)ɵDW]=FC9Pvrֆrֆrֆrֆrֆrֆrֆrֆrֆ ֆ ֆ ֆ ֆ ֆ ֆ ֆ ֆ ֆ ֆ ֆ ֆ ֆ ֆ ֆ ֆ ֆ ֆ ֆ ֆ ֆ ֆ eUZeUZeUZeUZV V V V V V V V V V V V V V V 'ߙ6\='Wpr8\= kCkCkCkCkCkCkCkCkCkCkCkCkCkCkCkCkCkCkCkCkCkCkCkCkCkCkCkCkCkCkCkC"*Q ET-ml`````````JQ+E5VjX)RTcJQ+E5VjX)RTcJQ$5!SdT=;J7%[ݡkC5ֆjhj X6CyeMƚP'NEc=zP'rrttuO6QjގV/zLhuA+ZV:jj6ՆPVjCYm( e6ՆQV;jGY(evՎQV;j&j&j&j&j&jjjjjjHVD'>dO$}"YjHV*(*d҅LUJ&AiB.EVW&EiR2;uEg>Eg>mhutSt3'd(MV:J4Y{Q{U*tohu:2P)Й/Й/P)PڄV::5tkUjCYm( e6ՎQV;jGY(evՎQVe5QVe5QVe5QVe5QVe5QV ePV ePV ePV ePV eHVs"Y͉d5'՜HVs"Y͉d5'՜HVs"Y eUPVeUPVeUPVeUPVeUPVeUQVQ;'Q;'LURɌ2Q;'Q;'IQ ЙЙЙuuЙЙuuQVeuuQVeuuQVe5PVe5PVe5PVQ(Q(Q(Q(Q(Q(Q(Q(Q(Q(Q(Q(Q(Q(Q(Q(Q(Q(Q(Q(Q(Q(Q(Q(Q(Q(Q(]Mt6ѵDR|*9|$|$|$Q;'Q;'Q;'Q;'Q;'Q;'Q;'Q;P;P;P;P;P;P;P;P;P;P;P;P;P;P;P;P;P;P;P;P;P;eUQVeUQVeUQVeu u u u u u u u u u u u u u u u u uɕrrо?)O} s s s s s s s s s s s s s s s s s s s s s s s s s s s s s ShߟBо?)O} ShߟB͢B͢B͢B͢B͢B͢B͢B"Ph'iI\GyQv'IdGyQvgE%QՌFyZT4YjQhgEe#LZFy2jɬe'2ɧLFy!(bjA<;f(N4ʳ!jdA(RIQ]}mh_EEEEEEEEEEEEEEEEEEMt6ѕDWj ]-tHC]Q;GQ;GQ;GQ;GQ;GQ;GQ;P;P;P;P;P;P;P;P;P;P;P;P;P;P;P;P;P;P;P;P;P;P;о?1} chCо?1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,F*TdO$}"YjHVD'> eUPVeUcFc仢M;n9M;3&n~wk4_h4iVGӬYM:fu4h4iVGӬYM:fu4h4iVGӬYM:fu4h4iVGӬYM:fu4h4iVGӬYM:fu4h4iVGӬYMMMMMMMMMMMMMRPVeUPVeMMSPVѧM@=>aiY WW}4 =pp:ʪvv:ʪ||<'s<'s<'s<'j$j$j$j$j$j$j$j$j$j$j$j$j$j$j$j$j$j$j$j$j$j$j$j$j$j$j$<'<'<'<'<'<'<'<<<<<<<<<<<<<<<<<<<<<<mݶ ]sÅ>7\v.ԅ(ԅ(ԅ(ԅ(ԅ(ԅ(ԅ(ԅ(ԅ(ԅ(ԅ(ԅ(ԅ(ԅ(ԅ(ԅ(ԅ(ԅ(4y.4y.4y.4y.4y.4y.4y.4y.4y.4y.4y.4y.4y.4y.4y.4y.4y.4y.4y.4y.4y.4y.4y.4y.4y.4y.4y.4y.4y.?A OPhBڟ'(?A D D D D D D D DdB5Qu'qI^GyQ$v'IfGyQFFyZTYjQidgEQGdBsQ9hR?ʳ44S֏) Gy&DZMZSM?G-mON./A\a\n_.>z>]m6cx/7Ƀ2dy_KKmCuסgr=?^wcǺ4]d>]gO.n*jrYZ|w/򿗻GZn'VMƚZ]>]?[,jWȭ*ϷW'&q}yf4d~2/{iwJru~5|x'Ϸy=|V/8sޝ/ǕcpMz[)n\1-{9m\bNSgkV*[Ζثj~\\Wc_;l?0w7f#a\A/޸x^y<O__8ݸ>]WחǙo@\_tOԝGLƵptsr꭛6e,>[68owOar}o@mGN0@η7hOcל/vwyvfp~pgz|8z:7<mf`=YnVg-ZS/6~>^s"0>;@l^O>X>[ݞ"Cc\79]<:ט/>-Oow0X-McB|8M۟1N^V̬_nZjOVnn3ߖo)roCfzz?|w6_Oq=9b6~z˓כwsO^n_/9;dr%;'O;Y/()XdRͳ혷^_L7#۫W>|c[y}9=cΐ~#2>}{־k@&_iXߵd#'~U^m?cXq'w?rw9ݏ׏ŏSڴx|Z|<]{-rX߿yTz=̋Mzw58mNWl/?t}fx\t8/Y~}6㱵ۓ;qo=0g|қ->{ߐebq {ꍗfsr|~\.Bz\\ïlGrn^歎їż*:oܞo? ~m/.޹G߾|x~Q|ܟ w'Wy?wߞjpo#Bv7=Yd9}so} >"n9wφc[_axpz>o%ש_O~O^]\.>mmM^|<^}~4{œfkd}۞}6Xo6>\-=>u>>ٴ^]v%Ug2'u>&Ats~D4&)xƒ0aOM'gqƿDq(ܨ_@j_xO1]`C7Z-o|Z|]\;lϏׁUΧr8,ҫZ~BweQKԛ^>;j_A`X 0H407 X7{7/F6KjYy2O6e`_E73I/{@T\_e֤OR.! px!i@'ms8廸?5-~0cCǁQTfh>=t EMJLz0[4sZOJY@dKZ̖7*=7ȑN/6bSY :34#5Q9kMT:oz;} f;}wop'p9J2@ǜ-5էʻٜ)h46qh Լ#h-Cmy܃ˁGa㟞$y0܎ZzR'L(Y 񢯶,-/N>ᦄ%J4 ̀Ը 2S{E/+qUEly?!? .CwQkrIUIS0Mb4ԉe':PbsO(/J#Ԥ` ? P|[V@<) pJz4aa㣦0>H8Zo 6̠IDrxֆ G|ύd--澑J gƜ3ogy`"d 0ChhIa9L O"TIAim#nH^58$D\P)]`>tHkh2*OoQrIVy\yt?fC+OC9bM7?7>-a/'P8rPsjerfwpD"&F\6_?=S\+JHv4qgH֐1܇<"P>ʝ\yL(3*R.6AF>ik[࿋-bi3oğIZpi[\Rr3Гu̹IVPHUG¥e_O9!sW<>)*#vinBht}۟{.\r|yY*Μ1fBu/BeNIM49mL8'h4Jk`ȸȷYCF38ea~"AWHrfNC>Tg7g ;.'9B:GqN18i)̦-D(zAܵ͏|/:T1w)v%1: ]Yoy dljSL MJҤeo2fo눣@'x8"~,HlTub6z+yy ue8ý+e.E)Ly$9~I].{v"уKYrԠ ׶yG8jΡaV  TB5w]r+L @y=66k2GL yCYZU)F u.T=(Iv'(lLə[Q!2b^|m I'T8NFeR5h8ەj:m3u{7jlRA P0i~Ayt96[,r!!ig>bn{'(k8^ q*7Hۋ湤iy9HE&D8y4KqW@rP\^=wA9uQ1Of}3h)^*H~bYYjȑN18 3meg:wlp])+nEn;tՈwxq얕~6י3hJazǔLʌy4 rE8ArĐ*(CgH{)kB 9r?ofF]X77L)F"AIv6< hρ509b|:§V*f`rEgGOoE[?:d9;e"ȔY93Jyzw/1xqk I&H4Ihόܗy׭j4IGqp,,?5 񖚊4&%Fu|ݖ hF%]fJʆI"mܟT(aN14qą4,fY=B&ԙPeWbVq+5?7r(m6QnS>l r6n(C߭bh/VOkzjOKTb.*̔ʄщNqw u˪iȁN16q{fvMC@Pqsx]ωhL)vL;Lv`L2K5"2\j{rCizIM1 2d-6?nب [~:To߰|lWͮO͂CqݪqrSG8MsH)!߁ƥh\jYݬ8n\qN/4-y"pWgPXF68놎doY , H̐OGNY JTT۵:kXF:sThdH,p%\0v?_{77ߺWלi|!'|Ιmŵ(.ƠD r戁t9Uěr"7ߢE#Cd3v&5ɩӻ}cY91!77&r4G MEI wLn,f& 1djk8ޓ7TP}Q2 Q(db.%0ځ'e"9Js=q3mJp.GK*[vH˪ m{qA?>ڇ-123@k.#r"lKW)9q\ 839D7.S+^mǃ")H SG=Z:v2p¤TW\pDoB㟘UQnFwoi`o`0T`^Cn:1$Upipqzab\b\q9Wql{FupT20(kZvMkHgUps;;CcWdƥ'b2LkgΏg'?hjN1@qJ&)d(!ʜYv+}F#RN{bƬRdcm&V|v+w+N(IW@:b&w;{YJE>d;;PZSuf ř2}M#ߠ:maΚu5ę('\AII X}H$^lOɓ%xśyX^#;LW`j8K8՛!ZiԸA w{nӦȁN16qQ&'9[43|g$i^yb\$?4S㉙PIt׭˧7@"߄#G@P $ruv?>.xv70_LO aP?3k"vs'g?ϷAcg@iGl~hFaK1[(֮Yr vɹY$V2D\i4f<7OJ۴˴&(hS ŧn-˧v\#6v&-F* J`SI<$ih2ZG>:Gæ{EBppݔDw1qRF:lPˈaoBy?f٭VxԘ:ĻkP08L!;ҴX->/-s;NbtC9bpz@~Fs cYcb˶}ˌN;8 +**gV,/u!`8arĘ9P 18m|gpxj}Kߴ2@f庱A(j'rb9DM+&ݹy͓c9 #%~T%%o~>`F,NxhQ56d#lRP([ioX{D1gHig1mx{wyz_nSeAjZezȚeu:6?1wΠ)3K\9^dzIȌ*z_uEa$UJY' e5U׿bq,[g`wWTZt`㴥4G)SrżyQrm&%j2GLȴ '*zvԴ{l,[~h `hёCe$n\ɖ}L5]'7j?-2!S#0}PI|ק(5pS>e%`.7&?}?Q}N.fg c1Igkd? Sr9-q"7,͘O D>!|H[V4G0'`BZ-٤]|Wm?ҖPt=uo޳?SMTfx+̝w*4SΔHFD5?w7pSm0"7!rĈqhF>/lTXsq9Р\Y$H*:N܏ K BgPI:8cmץ4 vZb>/PniߤܩIw=Tfw$G^Y1B M貋m_@T!D)q*ȁ-NXK@=ޯ{:hRize6 7>%Re/s8Qr4H11p1 pK`~K L+ERMVBq KyA%Rޭ] *6=@N :&KT^ XpA +5oq#n@š#}T+;Sܗ T[cpV}d|fۂoKH:RE|1&L]4{N0#(?5v>Kk)#xC뱁v6O;vakIM44gEq]:c $JՋ2\Yn<>EEhjwԽM7—'x蜲/6 =zb>~(7~Ciڅ(3%?R+xl05Bl0j+î'U)|VsS=ȘlL uGrF2ub:3FP$-{uEꡩE@2"^ds.hݢG(Sr~\%F(3@H`=Ze7w8{׮_)Qy OwÚGL quo}` ^# 2T?|)CoF98F.1<8Ny]Ie2-b_Cӎ6w`HeMM 230k\52}e)M: h804օs'9~njl .I2NOv CaGƭiXe0u% Lc+#S>u݂bb} 8g N ~Om[Df0_zSzS l X{#ʢV0v{7̆˳~85XR)9=]sH,ǸrưGi8? !)7e3#Tto;AGg)wwlio2Foj# '9LpA 2pLѕ_Eʒ#k]|TԨCL 4gocʗC+-?:4(︃qfjx15]-\6f: LzǻX 9RC"^jSs;c*[s <>M}{-]J(c1(Hf^q83B=݊ (.Fa.10%ӧ45̗պK:͈L`nSe\uGLFx۠q>(O38@haeJR0}zdISXnpy+@.QI,IYC|9ThRepa=+ 2|ĻX vA %CÐ~ܻj inC2/b X_ߍ:9G+7a"d#Ŧ94XY G i\d؟ciiS7A2Ӈ8j#UBsL*5̗WT=)vHu(Ϥi^ڷ9N2G(3F&pBZSnSMOUj]5zOL<34mY5wwSg C/%uyν]ĺ `@ imUs8X DX,W2aohGGvp\ %}ECj1:vSa\c!rWgGeloc[n}cڢxRIؔɎF鲦,YC8Ď Uˡ.1:2܊)>]3A{>܇{S?+;v[/3UJ9u>GicڶDa./0"3-˝NH.C6ڶYLXT\uL% %CSwk]ޢ2u?ŖQ9s7A4S1.3*ҥbҨHWWF²}Hݳ^a쎬YG dd/NM`sOwq1r朁 Q\8ap[笩k!S587z97hRe)BasA6Ă//\wq1 sA朑% ZP`EH9-ĔiB#cv͋mնZĦJCYl4=TpJ.d6+4"< S thMQ_ H'KLqEp*o`69sد=eE|wUNܕݐ~P:=7Ui("Vb\9gdD&wYK94W\ SSA.302&A[/OՏ|Dѱ0MEL ¸nW@YIe %-7fMI.sF%AƇ`\ 1b%BC9\"hܞ]*,Cy=(SSj4B"9^ .և s&~mr{ՠqN us˱+n pbFv tȌ֚tEx Q?ٜ5Jq<r :Nd_Ǚ*1_ޥoK-&?T?HA8keQ\>i;5--w_iC0S.3Frpd~n#N6p|b䊝dU9ѻv7l*;$_2!a$߱q; lYɥ^h9>@ Ms}N s;nb{w(IgOLR ھ:t_&&:;Cj8TQ). "|h%8K#\ >.z}]3L #Xa^JOM0HSQS`\p9g\*ĥKOZ"ϚKmym7C]'u0_xzPKPy ''1ELA1 p1 UI86=sg_|]^[@PaSJysܩ `Sg*/zاTY;7ja.sƦAlz)m俲 50x7U %aP9 TVƛoy7^a3p 2IgWz]mB'a !9(R>}myŭ aZ+%kl-0]^Mi&AC2zFGIs#\_}χ|= '(t@/FwhV"ᗽO0b\i@p34Y7hܫ7rYF&r *J}?V0ySxm[ū+z!aPic{78rӤ\Y#ʐ;rGNxԕ˘`Ne̋1.3,hJ̀\rs~y}m]zɇCRv81sIWF795[G.dzqqCS"Uh&4wt M]BUG瑍p^h̜8'Qb~4?qpkrh'>^:g"䕆s,}0uBOnXʇM=v4u7F☭w|&Ujx$t{P5'"GbY#Y CPhȕAnC ~[w@ N3*ם0/MNZDugh)1~\ ]}QQfH9 />\7O]r\T}[`DXfQ̕ŴG_9:ЇfP)r@ pAQ {rYoao#^zX>x3${UqV4G!?VyvŸ8$ޝd@9yꗁh.U?'69ҧ\=𐟥 "D%/ٕfzJ4S+vLJ{GeFx%] 51 -x3-8#Qlz]mnZ|sR}6 mA}ٻ!S 3셙݁0s@ձ3>ۘhp.sF'0AGwQ,+V^p$>_כhJ}pin~荍|*RK LSJ)+|䕗X9H!gL 8G`GHّ:^ax%nU7ݔ_M}Vx]كeGb\cds2ha:y SuJZĿ+;̤7)tB@;,=E@OlcAR258_\:^y?CXs挡rС4X>2Hf槑,S#@$WE +e̓%ƦSl:5A.30S*a kD+,6S{q6#{ФGn H7Bki +i j /388/-X*15!9:![{NB] L#9 JG vc%sF)@ާ'vR"pDxܻ8ۦϽ/ysSQ@JOy30Sap r<ao0FQ9 ϵR[E$;|j]Nj=X$  M\R~̓#B*u ~Z'Y!7mL.3D򒧖}6 mVe oy͏8uW.ݗ0;JYtl#tڐKO'65C>\X#LdS\,ǹ`sشMc^~s sgl3গ?ui Sw&'|3uaomV['= E^>H߂9cx!яzy@Uk|{JmF`zQUw8|]M7CvHyɢ<EE&%ٷP]p,t^(^X<61W<X7X1޳3J*Dz*_8M' ߳n Σ=@hO$ 9MM/O͟Yo񹌎V{oΛP=֩XOCtΚW*x0te6Mu1.105BZ˵1#=^6 x7w٬oR'f</2w-%E%^\'NȦXDr#x9K^N͡.sF(Ci~M˸MeݥNج"^j3N ܱ1=u.(;I(w+aeVHHA2 zq QJai*,6:ZH?f72AwV}*ZME]65[鲣Bg8,c¤R(zo+-3*/>(ErWM}+iʺjvyXJ" wI)-*U9j}2kLA@H\}w8:h/!P3_P($!82^ 5Ҍv9 cF͈UEFbC/yqxV50zu&~Z\ P&%= qUDKb񎨇j11#R2v1V5/z*OnYTZd?:PI;"dvVfTqOI(N3,=8tĮmZ㴯ȍ=l ~:=3dY12fXR'Ul#=3OrYD1c4 F]B_$_A#|t$MŋMG~( !#Qؐ虲2PS 4Fo6IxX {! o^x5Tml?^SIP+ǎΞbSԩGƷ`?$IzxX7!R&]P13!:ёjQPeĿi.^bkFgm~E:sLQ𶹞$̩A+pbIˁ6 #ƨQ_.AYx;VJ?FPv^IZ'nG$&tֱ#ꚊN)HnqHd]yܮ̓Xp昁~AIm-.+\m)gga'tOۄ !i JȞˢ3B$ccI鬭_ ht4XyI`Dބ1R#*%Wt kzGn:+^z).gm(Ky>1ei,ѹ:04%%#Qnn1z'XR}4_ &mI怌%C{hǗ՟|w]-[\|PXJAH{"O⒳{IS?N''&R!@ 6,͆;6-8RT+6I{D'a>:椩<̛O'T!㚰8f,"HU{>WmdrG%&Zիﯪ,6.X!A%lv~>frJ cmZnjVOhuN@o:fIE%nG/dAD5o-#wBtFm=A߮;'yM5038Đ{u5'FV NH]crigܮ;Rcs3:3x L@'p ʨN`;TuRKx%vC=_0##} `%7U\HTjH!|`^5cY~zONH&$( c$n4(\qs&[n ^\U;/ެ ^.ڶs$T Ŝ-J&\oZRk>rlwaq1Cf<"L/]R7i:wB &n;C1AЀHhnh?ylF7)z-.jGգ_"5#T`T*M r}ɕ\Ϧٱ:f710>ZCVnjOhփ1xyefm Lh,z?k֭06.䡵4dT5YF/3 #ATr I:5~U䋪1ĩxͦ® Sh#g>RG*@3IR. 0<ؒh"#9 c$nz}z}\`"Ʋ]kFRhԑ8 mKv׸[/uJ!&WR%U=%Qv;Ob4 oA )Z==/o2%m8~7youzic{3 2CY<+!9!kK G&L Xa ;d=쮋y NK}aZT=SSZ54lhqg XCwFёlXQD}[r|&Gɀ{v?WP*Ŷ) Ԕ7]z%a;fFN*ǔ˴v^E3#-QQa !As3# N4N3FqdAi/0dLFBG~[}x_^0iR VTFa46c,$g6:}ox&,dsXG,OQz8z?@3zJ/mgMCuQdh6Kӗđ'%n% c(n TzNz$_֛v]]LftAR\d*Κ!wE^F\;fh>BIÒ9 c$n|Lq6^V+̛U&uS]B9`y%^f>15뺑$reVt`s*G/9r̸MO@==QzS߳۴xYmw;̖|m:TS!JRoef;ߣ9f;ThR)0@hmt&8 cF&.~P(8{Z\W+^)5Xh^7h0&f&ueWoV=@\ZTvLR T>729r̰ՏAk+2$:{ X"m>Ւggz}eiFɇv %I&(|c`9S|;~:<ՑIL#1C1RvCӟי#CC^,=`֙O1M ޿!BJW|kAC&RC%=fꗬÜ9blF8i N_fYrxF+˱Y\,J[Nwc*1ٛhPDf68tP@meWu q"sH~xift"7^S,DNkFGtgP5?gRDq昡 K/5@>zODtk=VZ@וn 423o9WZGf Yh ^zwlNXhœ9fpicļf' (fxvU?xTijLNfT9d1MqR8}+Sqt+<('\rF;兾iM]pΆAq_7_2Q[X>ftH(IF>!,<.;! Kp.njKG^kSI  аG%8cdԺ}!O"I-q3o)IF0<#S9Sxn@ F :^BYyU,VhE֩\6/aY10!|]Ζf?tS]"<#13>(}V nnM *E_vlcˁ3v7?3}V6E:3 psr`~2) QP9fT@44!w<4FA>~RTZ\%TG,d"|Vj.5Н[8,9{&r6njM2@K='Fl!" mw\}Ff^yA!oiγ6'cJKKfUeZA{sq,"6qx`>rH gqH.gkH<4Rl~r<2XuVj(4XKjF5m`#9fpcdpKzڅjb*^Aڢ0UO%/.xzߛ!=wC,)NM} D1LԊ$]//B$Л (f/~AҜq eҘ)& Emuli0:fV(Hr{&j6NċmSv зOVHGj2 bc^)fOdY~O+ ;`hœ9f`z3 'AT~IO;3_T%oÞB$?e#hYF#qU=16U}ME$nBA |GLvתqU=-V'}.鯁/2ղ!'\y"b{|R)6EDrK Jc=ex3'rFnjH VjIo mY Wi ngީ+ŝ-#5yGdx߭(S :$~`rtD;At-Q0Rpg19JZ|>&HLٕi/;Ze1* 2ZEe_YX 4Y2%r.NjK-%RIX!Nß#]LRHP&W1K-4Xf7HNhf#Jv#&)U{tU17CC"u+c2Sd7 @ DSyjd"e bsTϩ "vNQ-MҬ1g;#&)!_}Xndh^m\JT[(L@[_ uG d61cv@1Br_uB,l6;-:3h5n+TG@]gT uc2][gHCjggn3G:s\D:sčPT^Z"ٯ%7:w&saQ;YUبgrr4Izwbr( cb$,ڠbض.V)(򉯕)RW>C|z4d/Lnʣ+3o,QjN/f$},yxa& cg"x&79~|" >3]K&ג:OM P{hF~ `qUGwWhiJD"΍ڒS:1BOxV4I6&D&e,L'#nrM}fT(MKDvQ,lI!;Er;-2ٻ樭fWۼ|'Gl7a˶񈣙H'}UJUHF~t'_3:'NXoByuSo'Gc3,i 77(Amin g.\?ptBU9#sẗ#>xhk~Q #,0 mu6t>HäIAЋ&"O.:\tfOAk%#>n/yZu|-$EL^~"ύ<ϗb)8*{j<2:c=:*#=L )@XcxVgxH; :"p`~SOd"q- Ǽ%LqdCZYiݹ%Rd)`L,8rʰ KUtH?Ζw2v2/MS %3tk_Y}:z0$V;X vjsu$I~hpUNgjR[DV,8ttSwpDo8G4:EMPFxqގ8G|4]PKΨ2*-2Á%|GbJv]=gi.UFd|yV',Oc^.&u.5K*2G,mE [-pAz)5go Al@N]ObY> k@my,-w?.i|f8N ;0J# ]᠂*/e=Ӣ7Kv^o7|&,XQtc<V8ʔDL{?)Y*!Sp*Q6=VDa':aa.W;YoZt25X`lpA)B'HȝU30cG#u pFQ8Rr)P\b[@u$XTzVdBl#U& pw=&NDsբt*΃7b2F`T mUz XDg !GZ6{O1&EڛcPMŦE0;S;˜7ϗeSb݌)Q"Aq4 #k.n;2-\ 7^%2ݹOm'^i-ZGb@›9eD*@> .~`A\n ~W4˼TR'a<+7Re|IR8 '#?R'HFTlc9SFڠg&=("keD2*Ut(SL!`U8ȶ2eN8 Į8=Q_!?;ی)v=x ضp}Y"*uLS#`E'caI9T¦թxxKV|$ Ha )<,#<MEL tTT0M}8Ԁ+d^&H1 I &>uN` rq {XY:4Y|z d޷Hq@v微_"bb#HQMa!M\Gm9D8[7C)sԭGRbm36M>0fs6~KKgh=qU-'T\s[q/YdAoL¥љ/Xn4a]3.K Q ` $/+l]^*$1b iCD­[PTcS"HuAZsiÍkbbm3.'K i snJY|(6qþ<*}CeX-6c.s'n@~PelamDvhclu*->2m+ٛ-p V_#^9۷@LB-iLBD+>}pU):F2BA]*P[>GQ؜26a$sԾ~%*~v55ܟ92@ o/-j8 Q:4~Iupy.(=ӣQ3*J)R|>DcS7Cs8*;\lK#*$>m4h@@9;oȔ2>*+t3V{*4E= 9B )C6EpgsP,A5imZۖ+t%ļm::Φ|+eMxq9W^S\,E9#stJn2[| st^T˲Y/>?[uۇ^EP !*E?C\_m#sl,;Ct >+Wkz"MSݢV&NB# ,A#p@[&:l(aUp2Viԥw킰n ՁƠmll7Sj@vL6 0~q2vMuqx(n0Jӣϕ6X#DG;6=5l(կ'RB *9alX%BOESeESf/2XX KS>e*ߵSj8GI#ImӤxN 8-2t4~ǨX )CH"-94SuN uB^z5<BJ,*3X&Z "ګyvms#LQ)#AFx 0,w?bw\.[ [lH}^$ΛoMi{-BN܄,RSLo,Vp+ rX}n !@2Pa7ddĂ^RvWFol ڤjt$תwKr!pxƮI~\,P+V-D1%R3BP: ᇦva]~e{]lM.dQ,5r=_D+,mqt4(ZTB "mɤUE#K182NaCdvk?bj"I깂L02O=Ct\gn!^?;nFErX )CD¡,ჼFVqAY;p˙3yV[[@NB'GmRrNHgtN&2 -A[iWu&?ž2mYM~'L6؛3IG8UӧIb1R$ޟ>ؾHќ)ƺpgNQt |/JXOT!b X=wWM:?>^*ӂnK?桱L vL$5;PyB]IQ1 rq "@=)hPWPjU'`#jnUeA>CNYĮ'x!pdK)4Y^7+:amh,;tݑ\ߥv^7Oy؇ypƮg^/6y%imYS=8Gy8O P{rN# uLsDgHJX^e\M/(!i{ un\JILmK,xyuJXѡǠjughN6J ڼ6USSpc.ir請b"[[X#AsAz9 'KXd\Sef8 L08;#t%wy^ժ'.\̞jQ\/y֫vVUu&:?ߥ! <:i n0G/iT]T,G:sԈON >_ys}Ct+bo]jXJGAhpd[c:)51*#$ĩڐXr攡 !M,rx=+Q._Gȳ*U(J.PLIԦ.tB,x9vL܏c9SEx:);XeX/no/tV,xNtɝ2-*&؍RĜsT3~h,8Ҧ P3 Aoc@vn&R欵 :86VZtr}ń)%!U>&̀}vަGf2(SF&T+z䛦]*y]܁j׺,mavThԡNss/q!a$fLNq-P.+n#HI.YcBa滌bdsꕦBJ/ +:#S WugTNV@Nwp 7_ZtdBrVs rY@ek 2Ndc0Q2W+v'%ߏ݉eތ)?΂UԫO$fR^ߐe@rDH<$7E~Y!*ג2ZR~ )v? ^l^(|$6; >ZQ;\xk:ͅTʒJQ Qj3%F7#rʈ] zJЋY"V’ ʠ1uKc:U;0h?2E8rʠݎ2;1sF(?{ײl"wƁzW-II-ɐ³IHa9_tG3H3'ρ̫r܈Xo+tjp,qcr`bynED{ OO'E-L}"T1C4D)7D}{5NI M ?ERl}Wޓ 6\Jak |:ke'IH>D/na/`&0IΠ1 )G7ʛČ)h'-Gfެ{ wolXeC,"5˝=@Ҡozw;4|Qud Gh+- ABecU~U]F-U'OJ\;@0D=d/mO"cNU/9bpf\dL\AM5THWNպ5:343͔(Q@ NZBed,xzdXYC, IQN34qϓR5}e8KH/_WhaE:HeX[u90b^3618 FuW֐h1:p'AO]xp,PiZDvĈ^E%۝c?RE3(9#ϙP^#'^n$푟@g?Ρ)s昁i ѻ"{Q]ϗ{tQBJg酾 7Xѯ3)9Ix{9{$KIN~v>dH\ c)n >='ƫOk6)<~\Z ufžw8! \.9SWR} m# wB۠lsYoxBQ|@LYvN]I1qĘ4~~k$szjo7l^YS0XM8Û9fD*(;o=Z/uo#vOHަ@5RѦ]cj|橶g~;8 ce$X& -jf\W+4&u$HJN,(~ly6J=feӣ{f 0$8/Md$cw?|Y[Zv^; Iq&njE1jN{q5۱AXn(gSL^&NO}6恌yZduU chF"93&'6X/iAoF%a O$ȹZ ͛S)iI=_^K.%$%AN/0qI P ` qN*A}t][|!kA-ք_Y:ڕ%g!3DkwCުn80U9s N$gwrN74Մ;t 5RCrdl^>@\}_Ǘe]i|THaZVnjC@x̠sM=u7 S OD-仙1:zӮy /{%#Cz<$R3ôS-:lrP]Gp'3RyLfKxzPmVZ\=Ά<I'X`,|QPD/laSh9fh&gL6}/Y-ju˷o5)w R7yITU;H\Y;p~ݲ\oz,ZQPղ EA8|tC{ s$W5'2> _nBn;)R#uV92Bt>݉Zr^zFD=$רzZ SMJnjRG(ER"xD<"(ZwK֏CQy mK)XhR ٢q'h﮲ջ:vl1uHq昁{!lf.hmiavB}ż#m}~Y>F=.o̮w2Vʎr&M +:w rA*&*U9sP֧=T}^X[x^?@lYޭ["k!3)fLfUedo@I&Dq\:ЭS!,%1N3.i)N+l\?u [ C-GKCt:\ʳq'PCc3w흂]'8:gJÜ9flvXOy)dM@:e:Z-{>7 <>"=xVc*q¦Gk5` dy,> 6a& c'.* Ĵ b%?I@:=@\J>C|o0ޗD$Ps[l̅n ЅI]<  }zv׬8 #F-8rF CZkʙ!+ 7v-H~6ۧr7af͹ƛvFe'7Jdxm. t}-G$ cF&d"̮`d䢬Xv@nK,u_ڄj`)fUr+fhPK]ˏzHI( JC.?A&¦PvSկr}9jwvryisH" hyg-eht8z$MpAk 5C\x >9В2mHcv6'Q%j%&%!N3,2G2j3@I#Իb?.AThXɣ"E[D^RZ><: ߟKZIOC?6Pgw _#潏0[H_添uO9.Kϖ/b_.&od¢j-qagHVso\DQ) r昁I}<*_^/K3=!)"!|Kj]9sP>@ig'[LMڳOr0Vn9fhi֨~ hA/U} #dCl^tqPk.YfsU:P7:0ݹCi8R|=>4uTp9b\:\8c)4w%n̟VL-=VF0>֕Os[Lgs[C{_N>-i:T1S=ÿ{.WGsx;W@sքoMV`oȅV@ B4zBSu>njOK n)/vTdg^jެO *m!^L֩ BA^6{ߚ ) 8&(]aBθaq7?) 躻y3#wv43$IH$Mg d[W9}WKZ)wB |HK~*βTۙӧ{t^X̖|sq"7̕{_猕9:EN3>qU]}1 񆝻bt!y,V&Zc}fL|rhD:? $>f" F1U::ΖQ^R wCL$F5M3(=2FZA|[-BA-!Rx,7Bc-ؽZ>P(>庿24<q GqpnjG\ k m"Aɲ@1$b1W$=>GH9$Wc\F8guֲ D۰56ז=.=kNp:fgZ6T,zpUKzYd b$!&AwK~*3 .|%RL|<qjog Іf-VMx,d틾Z! s_))AxՓ>DxrOw`J}`b} >OXi' {l{ UyBrz)6QP{lCNfwC ]M @2{HH\s<`{r6LzĤF*HB/˦,|z73vM\窧n*EVPi6'`O;cXwAjp%um x>Ub;uЛe!zw{ .QXMh])HSo:TA].b9C@:e$VOܦ~|e%(Moj`u$}/we~5^i4i.GTԽDZ0 z``IaA KJE۪Z?8dY[y9܆w7oRH(KMp!ZӘkABޢ! gĜ)\`9gX) ]#.%l:c]arn%P$vx&LP$!Ec ަG<7 Pt 2q+vv7/z S YXK‘'5ACףyTBhgQ?xS=:N2h2"c} BPX p3wAUP`ˉ! !r$dGSSذ Lt5+)G眐4L1iSvS=J(e(M ϲ[i~ğ^zۯyciC5W X'Xr^WvM7Bˑ.3>a)dSWk|/:FݺG@m<298!H*&wĉ'JAX s朱@>Op^E_)Il@f:]-:jM쁤ƭZzZ[bSCw!uL/>3FR;t! !ZPV_v]9B gP3<{B'Ek *3ԠʓA$~$7Y<~qxlϊ 9o͚ Ǧ22ӑ7YwhP1mZ^+;As Bb)s%,( QoT ͏1r#!sG$BF#bq䩩%R]@hRC") IXv! !ZB~Un[ǨK¨S]TWlPp@F+t4"@+G9mZ*=n>9m;s%X r朁 !Jr%WkZu*Zc'ː˶VsaܩP<  - i⭥ґdqt7fNHJQ.؜36bӇ.Hz}h[7wy7^~ނ#]0LSx5ASyf钘P]>JR38$NυN{LQ=0İ:a/d-ԀЛ~./gk7,w m\C";Nzҏi4 LX ,(μW 2>dS;F%ޗcGx͕0"x`GiFHFP钚 J}xl3S> sȄT1 r )7@ 9-* .o;oh=ئB~na78]d&﹥!}K/PQYt {!'~~-/ s:WހuS-o!sق9@!gV.q<.eu5 Ҕ][>?EuLyӟl\tuXe*Rm>M;\{~G 2bt,t0ur 8pMsX5s@3Y( g ߽,aQQO^ KcNx6< x꜁ [șl:+cf/ֻ]w'dc{>'ES"N:M`M:ϑyй>sF),`n*xHSs? UY7uQ:]pr']&TEeuܭkT2TӯTOO0di0xc} L S0VsvO կCP'gW]9~+ˊ,+*w!PDUBfCSa_K.3>k >Uh 6gt|ƹ&\Λ~d <}`:$≥\4\(V@Si%e8m+!dٓmEi؂4DT!ͯ35QT ?TI\09gLdaځD6/j7^#8&L&A<Í94]:c'݋Ц@yr''t*' FձmchAaq- OL݃2fI GsIW-3 9k=ޡB uw_7) ]o_wJZr$vHIG(O^ZQ+ӹStRH,sL(_Oڦ"aNp:Za{@YɘN%-.p(aEd $l6"ER .KԅpM S"ߕ]9 PWAJRoiIxTB;q[WHe!Y<.09#S#2aPdj #!(-g5S5hs:墷jxsmѥ KỳX)KI;r 6M4s4 T/}c+  j }4=\ęH}ߐ+|y8c9c"6u }'쬳"=&́rEUa n=f<4Vn(sDxRpV]f1?(ًGʞNX,_D^GSթ? j9>XtA {! e w5W^MەcZu%h4/(BI)6jqw)dlӭ#c.4Bc9S#8M#Hh`Rg#$a+Poǘ1΅E'\4sVA|ᖌI5@_MpO+cx,t(%2CU;E. ݬ[vϠf ouoO '+W S8V*Jk9{7cb!"[@9gPZ%W=/n?{?+v>LWBx.9gL>Mw6.2ͅ֌S>CEWȓqծu잚]YF a9#vDB!+Ue69W+ǽ;_z/ٻ,$ Rtzy= P`9D#+r Hg R#a+̭bZk`\`3[#l+n~ٶp$ĺNWCE?K\ƼZx$|z^tW:"ʉUEr΀upx-L{.)LC 򪺋]Tij3M2k#gRQ#-]oj uf TQiCnthЯw-d|([][*UwF&xœsHܒ& )d(Pcn T98K}MF"c1sF$thp޴‡~2l v kwޢopt^ MTmy'Ix Cϙa:aŞ;R D QX Z )[B~ +4͝@·@|:hبd.h>P6HF}" &',rΰ,mՁ{s-%0@jϛ{FLz%Б~m^Ŋ.OS|A ccb} 8 N IH 9K~wPeU=퍐c˦^^2rq~ب^=xlE a5DI `W d1s*l,9Hx.eȟ5w!}>Tݰ:/ C訡Bi輍8MJOx'Ibc9#!2`(:t8'͐ٛzőuW]"7D aDBNQ(Em$U0}qgtV3bY[9vCޤ8^jw׮^YIps<<}?RR\A@CEJ-4 ܫ,1]) cP,F s&4#>pPn `XoK'\oSmX.$;{oSW$Fd."o'쇤5 ^ u ,70\A}U@|(D5#5犎1&*5ǙTLR+GW:Sm7647]ۍY^oFHZʆ#YKGeRQCY ?Җ<_NE}z<hk ߻zH].Ւn;^캦S͐$5`-O5"XbC#ӛ)֗T5Lc=O(dR\k]9Ia:s<`X䓕@KO:7x +vsl&(Վ )g`s؄]R܄)c+6o89EtgpI405W` 9qJ!qi=TOZ|9=6I9Nr^O&~}>p]*䥮p2 ZUrZru(p>モ^xsW@stM+ dw%q[Wn[pqa)RejR!{`,JojPv jt2of<=|D9[ z3Êq5)z.Xɥ &=q?IcjrIR vCr^q , ˄L) + vS`,_a{P&WvX.{[TTybt^3tK ʛ!?J<81"nNkQo؉Ib -ڐD9C@.3`p!t8#FXt@+ m@0zGOMt7;8T{}§Ţb?9?Q s[3V z} T#F"Ec@/8p9fMxtXށڀ&$(s%}ѧ"GfkHX3J\$ koRs <0[z ӢF?g`2KS!shB]9gt+ro4N2q{QmqrIu=rYo" [lb.٪E&/-SjúsO']s`I' JP , KܝK?݀rVz qŊwU8FҡpFpDMܛGɊ*9f\vwz'[= (pgm'}%T9I;sH~$ztX~_ѩS= E% d 9o\ﻆ,dܹ9%xNZ𴶝h{o)Fϙ{V2-[5nAhaӠN1*Xw,\)e#~WM2;pD6&;"bdv]R$G-ݔ=~cS@q朡 [ FB |P/5BG!2LYT{SuKl¦-qM9noN= a4}@hi?7@ݓ5Pw}Fnbs/'M}A%aJ<2F isv~@40h %NмzƩѻF6ƙ7wc,cS[GѴP(F@]:6H;0ҝ@9"@x}a(^hxjr NiO4avuNnH'^VWӏO$V{F \ .5NF]qk{ DЋZz+f=B/onƙqKWۡ܆akwܱq* )vB_ ;gzl`{Q4M]zU?BlaIi-.laTh6XrISʟ>[4JFHRsWt:})zb3jh^P:g(`\*lѶ)'RYQo$ ߱G9{~?޶OFR}'߇ teQ*0m-І:!|fS5(\T<E]׿\5yv)%] BOaE n#m .KX裋>0(S(+jI=y<mz%:Lޜ;LK˫sPRҠM SBw(<4^9gx: ?r[6ls*HtI/6ck>zˤ2{ٸCsPڃ^SD]0:g))Y B\os췛K)E#>g8]_}@I8WMY0Eƪ3̝>l+i?4o̝Jp 4 MX"E%ȉ1/%x+=(5$_f=w )QHz5B$"SV@xBm P T@M o׫*_wPuc̲Z o\8J$BsdL:M 7=qOAs4{NS=\ 00q.؜36aW&ۢbTd;U(7QdAQdCJ#UO\:O\n:j_kM"nUD3:Jere*F\o]C?D9^y-wHbBWad]XgܪE_&{1D&0s%,`Ss͸JvE-T'f K.1:Dt%uPJ2)¼dru1ܾU.~*t$ҭJR]+>e$Ҵ7 $(s$l~Sr1*Q`eqW?8\B$Z\Wo̗p8_*wx{L3~vBvC11$(s%|*WRp%&?1(6Es뜤jxZ" smJَ:i4F&f/QքD9CD xvVȅ{*vZN27?8.2!8(X]{4VO(OJ s2q9M3Rݚ},gr8[09gL–'S1M|P˶ܻiinML#7S'^%Yv㢿/B}#;Q.3:ar`& ^"I%$yїu,Уmy_Mh{ޱr!uvzǖaT"D4׏S'm ,Q.Ȝ12sȴQq~QV5]A|,ˡOb<&/HJצ<.6˟qzʓC^XEq`TFT-"n/GNy*Kw-9v,3:~`ZqHS$JP , KԹC >2^fqZwn@g+eBוcqUoтApEv0OrՆpG rΈ4H]Ueݯzr}0c՛z 8{`xa`V or4G6h#\`9gXZ,C$o'E9mxW S>,(fynd@; zTFOJZra1xͭԘ"] .K , *`* HuK.(qovGvDSd4jii2Xn"]Ni1{84.3@q-c`|U*Nhs{c{JW@=zOSpjcdz=*vCϋ 0J MQӅ$8tI!2G;g(qYf {ī "4Z$R1{#iɃHHr$mbH#\P9gTGR9g^߱_ԛ2shko'nnCDܢNLl$OkX#TLSD?h%8s&{rF)gMUB}1s㉑C.濭;Q1 ]E.dcѷ =uA _Vs5uf9&!.1,DXFUm!P`خ:$UqsީRZ&b>8g:۬ ]iIau"e xA K !kmqjpIs|0h_?4wSʞ Mং6I"(sN5TbntܮOl=ilNP < OX)& Z~)6g/H  B ~(Hk{&>iu*z~˓ [RiOz yT.)9,Aa.Ȝ32a) 5(q݅)9 2x |C`&rLH<~!S}񱺖"%ؽ1`a`s؄͐JN9|O:Լψ`xc~Q`ZlmJo-4hIrM:FQcGxP .s%l4c*Qqs4D–ȠċuUy.T@'dLxj 2%uc$3}GAnǘ_G{dvC$s朱 K!m6w?5L.3>aA]&gQ'|4: oUŊȝhxq@`d8FuMJ*`nwIGc%u`KyQN-bmh GX];L]>T E6Q󢪊#$`dӜ;rSd2M5bJ#})7M+s"!p-X5a!c.>1lU?N td Zusԏ#7lov4u4$ONI0+IFrZ=9H\9glRx'm.:;7N|W0Ӝj}.7nW]{S.Zݪij8+ӥD?(ރȄPcAQ sCtmpTt-;( \50nq~_K6Os{]1+.v슃9@ք$]O/-,xMΗaEq34.xyxRt_}w5Gbi<TwIP ( J،nQ:+?۟ (*ò[oynv 쵢 'LPx0G 8}J ]rI0ۇz5,Gz@ `o))U~#"뒙~5K3l\usX9C@YR2͋ulΟlwXb 'LTp$΃yIC5ܩSdpK PG{ab ZogGlWy(Д*4vTD:ז17A=$oRkLDCO]_14v 9V=F`Z' N~1P֤Vf%a=mn8bw4W0 JV )*!JOLpAqzb)sƦ&lEK!3D}s `y6.h34=Np,V"d9_ʢ>6hƶqh4F"}o;Z @t̔]Su7GD[C !|DF_Mzе::`1.B 6*psx#Wn ((hk̢Rt)Ky*&GB`i@sЄ_#S`s؄%&:|_!E6hr8m?]26#񔂰 4Ļ-.# YvE-Z@u4r 2̀ Нv%8e43<1^2gK=4lWid9=]LwZLgKٟPv?V uO~OmL |j%< 9Vh]ٴkL)oMh$=&d4!,F1.3,acc&t'lW-78{1(\@8bFzs H&N$: L6|JaT.$)$c\9g`j팄5cS:$]HJnVzlo$1?g `6 n\sFEBb-%ך@*ZB77c;S yLۓ1HG6S)965%c4Wj@t6AZ9\~h]{oCf2 OBE0N+x#Jy̅g;sme>nYނ9Aya:~涫0kyJ |Uetrf? M iıFP:$,OW^JAқn}ݳ:H[Ù{^.3Ba#Nq5/@V:M+.u|cǾm._uH 0Xi:97&S$ ~~Ӝ6tOjq.38a)XJHx?W35&& 5ǸkjD4<1 Բ2đI⤘Xqq [!/ޅ>-z ,aȠwc t8en`\Z0 A*5;SɁPNӒFq;0 F-3"aL4"&_Xpe~qUYƗ0E73*MO*sLy"ISg̳ bH1\X s  Sil!LY4~\7#Fj[IcK kdəZT Mw=ADokq:Ҝ4Gpq!jRc dl (\6xHs=u9v tDnZ"9]Hk^5Dì9⩆1 t朱Z;n+ X_Yl*b{`sG7Dؓf}MNkʜl{Kt2sr$9s5ܢc 8 ΀tNVLϻ+,9s7 B2{KZmntE&ݰU_u*lKC$tlq 0×'>A$!N:}~kQlH ac/J#|)ƆHs#4F^OoBP'4VhMc%(:WC6UTt:23stC_f0E< þ4wza148^9#Z[MR\WNUhIͶoJ܉}W@꤮x}_$u,t3R8'/~ h6 +/7}zf-1 7o/9#ip{$zQDA^zB#drOc)sƪG:ǺIݮIs bϫs*R4i)\Jye;<B%;LBB75B^jn4AMd*G{p[!xeJi GA:yb}/hK+.1@5JƤy?v\M)N;8vص?/q }|=v ?9*lv咟0'OCy 8tЩtĎmu ? H$-{tԤ6_Gc'bz:.ʃF._!ȑ*Q[' 'zU` 2U)(!.3(%cZ]Ht)kHi2Sk(Tպ~ڌM) 2C AnmEO"'#yAE(s%lpj.2v7)B؟j6[|WC ŁE>)y9L2>7@i3vD J5ԤtD A.؜36aQ$TgN}]o1v N$x %ycʺis_j+I t$B2qF z$% "YzS9=18SBia%s&,UFxhp"M*Mc|߀y/ֻDKI(sMCѨ$H]]S>Cr9<{jhfzhdž 4@1@AC]gq7::24Δtv1<0ʲsg4%@(sA8zߡݺj0Y]CM!Y`pxH&TCj˝dSeA?A&P8罏Q1qAQ 6ljnV|C3LاK2ghbthk5O"IDu*4ƆcSӡ:?WAHsw PjyյfS>?b}`YЩHn21,3$A:v4T})j-c9sF)l^.lW,:\M~jQsg'SSo]:]CPʙ;t&29:ПLMz1$v93 : ]w.Y$gowRc=pvn•/#0z1.*luך2,r<VOpbP, sȴ *-}~Kkg| l7ꦁfLYSwޖg >=gg^MUcVD'9CBR;8-Nˆ37kݵ]}x5b* dU!$f¦KM"&%b&.u-.SyA2~.H}U87AUTĆa35s S 0]:gFHAΏ7idَ~nn~_`"QuF1ao%V;@iQuDtOTHx቏ UEGh tAXjaRi9bK̝>YdvCpqxݐ?K{h6 +.8E vpgZ+fhUnzYd[z6<)-o$sLqb9sChZm6Wbq,K4a~Pƙ\ q'6` kM$aIm>T%8v9cvDJ ݐ:$2p_i8{Yo71,룋 { N%鮀6P #Ƕ2Y#dB]Ż@tERF:!$ӅfKf"Ai wE.WfD1]rGapIYKBY6&p̪jE;W &qYy%C[c*lp#"!ZOwRO(֧G:]CA:I/f /:st-RFw__/5|t5$#++yӳN; (IL]3Mtʛ0QJ?7ؘa)SF#,Vi}~W#$e|`og:(&S $1caN5\r9IN-RTcp9n;Ƭ]Zh6qhƠ۪Y~|,<eu3 {j-8$PZcʪyQ=0eK:tbe_h*нcK )VA Hj^gqQ_oX7V`WӦf%iiZ%t*7}]t>(*3~R2h.JT:sO' ŷ*zKb,"v+x5Y?-W 6in/ h{Tpb"v@ k|"4F`;cλr38 N "1^q}O2[a$:ն{8#,mFg+wX+Ep=`:&pB06Tǻq8gtN ľĉ.67xѬo "cX٬7gϠT\X+'#v ieɛf܂@Ӈ_<ɀF:cs؄y:c>Ʀ+<1<$}@g~Ŵ)GtȠ!&hg'yX:!y,0jT$щhynR4 pqrἅe3oDB̳:&AwȨMem)w'2 2/rDxl4/1.FQ20a6اCZj$x|\}YqcEf@+jm|5.Z"&ȡ$OXtI~BI#m 5 wsA B}-2hZ%8qɛ'U%R# 01kv'#{t LM1ͣ2"«HlbC-f>5^;Bt>QhU.帻:Bc)S'lq,|}An['ӚS}d6ieeh-@$"ܝ]AbC|GN3NAs!Q4v@*UTؐ[x#BG5؄p"xy)NOGFroǒƿ\ȑ Iv$1V19eL:Hؖ**mcͪf'!tnZu":'(ItN4>H%t96w)]9e|B(&L$G|ohm\$z3o̓.5KpWU 'S'dBʛJ]ß+0sBH8stLpnc;躭HFs`J#fyYsX5B 8S`ӑP0E^;mvcĐXq攁 Yg.UY-TX׃[ /(MI V{2h|0?##ABkuXgxN2Rk%u M今XMʚj^Kv)0olݍIacCF 6QoDicUKba%FdmF {g+4hS1e:-Ly#i$6 >>,,ڑ63HOEд9q&I%t˛J3NS dkO^&ԤiV X<[8]k2]2a1{=F:)K2Da?tX|ER,ݥ.'P Qt3 HXY4_Xy5f§&![^+K8dkE3&zޜ`,LUmX qa {!+Ri9rc=|^'OUsmtTPGvgTǝE V޽[ ;p gdN6}&ݸz٬K"}`ЁUBC~<ԁm1Ԯ+# #2BLJBc9SF(l.H%pa&J u%2?65 D^jK #g/ V)0("Q9eTbƮ8s~n떹GUW z]nlEÌVC6AH>:/8b 49K̩%gNA @uA'en<-^y̐0?yrn:ΩңL jLk5!S;1הe'5E0SF&l@vs='MX^jv&b>~3Z MHrB!e&Iӡ"m#x;Gͩg!b9S'솜'ӶEyYW7n%iA4=T'ұˆOʵzͩIöŸXs攱 k!S y7wH;]4kX7M'|S' 6!T(0}G^0ԣC(,G6qp%3j\w$flq@s^O7=O6X$-$aߔ\tҁ9%u )VA.2 z՟'Tɦv<(^&>#(!ͼvz6 P6CO٪:iV)F8se|?UHL %/E:.ͦ礴KNɯ<.F#Jƽd1r`:t 1 i o}ZVX[*H#Jq~a 0K"ą2۫`q H'ȇ~J\vA k!iB]UKϗUyH!=Z]U#ާ+\ۚ%F:Xu[Kwwr0C.tQՑCR(S%셼DZPU,]h\ƦPB}E^^pqdntgQz5~100".gѢj[<ౠ#TT@J)#eLjEnAJOq )Aۘ7B!=p.61QFAvŮ1c9gpAO'LOtܴsK:gS90#9exJ໫ɽt΀ƒ6 S{}qz=1q2I\5Aj)GA{ˑ28Ub^]_׃;ˮWRp"Ȫزk>{)q/xc`c9Sƨ%m jTmiNnj-VLĿT.3ETw`9~A)eSFҩwes!{7) VB9e`zf /γkE!\̮ fΓuG6NHz*l=f/9n ]@ʥc_fHN )(ȐUXm {u_oZH>XSq@ ƠuJu6=7 y ɟh?L\S)&9e` S7*Bf %_U(VO5-U;KN1ʹ5IL /slD;ctUQ'm>mu΋ꩁQG.R6!՚ "&[+ aqjPNOOiYf!6#b%S`UD(蜎wWC\l\Ld»T8ܔi7%Oqs1UvYU0 *9edLqG}E},(=9򄱁ů}W<7ۧXȚ$Zlm87"]~({K)I,#{X{Vsrc+1Ȝ22- SobmNHW*6?o;V_w[@Za'JͩuE -Ov!C[؏49Ki%T )CAB$V2\+;y.w_@B˾Pi[0 O\BȀ9+=<V_"(S$쇄5X??nmn%uC(-gGde+ *y$ nCLzo蔓6D/N9e9at*XtCNe!,1)Envt'8{[߯6;ps 7Q  ?N&pZ)S{πGy9(9seǶXg]Cpz; 4!N3>k 2(t6;ˬďW]B'g!vˁ2:aE6w7x2dbfWz{^ZlVO=* _˧E]$h]3̣vxqVɻ1d2!YtF !ivz-Y9`X,)}ݯO)qMlXcJ罽]{XkV@IXt +".tц@)}|t8sЃWa} ~e*"9 nYS+\9;At,:s4Xu0}<~+;<'- 8Ϥ΃+s$i>n(T Ne]i{refDNiAң],.Uەf(H>bUդI|/3-`HK`$%.cNեM Ȃ/cΐI⿺”{|=X xA "i|l+2Ɔx.NV-oL4VINLx^xd _f<~A҆|~MǴUxV'ػ묌d_l=h%PT$T+$_z($3 Jh,:st[`ey0WPCpiا&=5mLT0NJWM9u@Z[^Ed#a<,E9#s԰>b*XxF_$Ncb1o@הl?V0_d9n$J́ؗ#Em%QLA"'@.O3ܪ*|=,[+lDЈ8VRpg|k{>zg0l9etf(ɌM ۇz*P C:hM7U=V?rm}jI+wkCzTcLh; H3d(:F;ct$@EWpX?C*"E}.~FtڜPs1RM& I>F5f 鐬 )DF)mr^ޕQ^jnѡ&n_sD/;gsn! wUc?dG2է/#z^[dYcN`3>Ot(`oWղ:Zq],Kѫ{x`F'V[!4%2jnܽ:a~N ri|! pFQ=> *1!JYgLsN.թACDSn ޲xvGmfDN6g4I#5*wKn@w-" z^pؖ*Vಭhʤu7CzH?"Xqq !ce)BBy~ACR2z[6_G4dL-A;&flslcM(K٦\7yܙ;,$(S$,ULR6w rWIԣ:m9qT,e)R7ɷ>S^kΝ6a:3.2Mh"9epV(5Mndm:5LPQf4\aǧVs\0Oޤ} L?ךwhޜztO?+z3ߚ$,,X(ZϐKp0 UˇU cL~,@1QَMΰ1fKު'KFo FՐtPgpN͊mdM$ 2.!Mb!28d<4CfX$5x %ϙ@/")".sGWK,Av ZO+6};ݲU@3(͎q} g|{O0!gL| fLHgtNtoc$wE;i78x~VAyc'.e`8u/ppAٌ5{&-Wr]- g`Nr~LxaWMBh}almP4 ~Dm) iqjbی)?^*1k, ]hxQŢny[y=_UxMqͿjė'K<¶ga rF攑!w(WxxWj..rUY-r#hz9[WO!FבZa:ɓI-?8Wg҈ք&8S(vZKַ_S~f( >Px\H-D(q)W0ɋǔ?aAm+>]pÝ!:e2(\[,V inP~jA՛H͌@Fy(&w(~u]Fχ'+ID p1 {Ucȩ$ހZUߙ|&m$-RU,僤b~1G]c88e<&cې?*T^amkmY6ܬ}$ۓsv1y>FW]ST#19aLXm@׻]m1Q*0u\} >/{>WbAr˴kNksW)g@UZd82;ctOPZ+ʟ쎏n}ٮ~bPF\W?K&3ծ,17ڷdў0Ƈ"FL8R9'8SFFF2VM~U+̤D혨G&9n랉{]GB3LM=nj}'H^3>Ork~m,;vUV+6=x~;z;hFCOlvH;dSyj;DT8ghN 9%xMZ߿[38p f.<_?{J>*o `H >&u:LE>9IAIob:ev(J2HS~}>W8|y,tf? ڷ1쇚s5[m % V6;8mq:ezĩ׹߆nU. t߈cC\:|[hs?RiHA:ʣ!GQ>. QTb?S(lvKlS! pq.o7EnCjhvEF@A汖)Kjq>߱9E>GG6)*)#vFZy4w_my_&2?1bupj-A\-o qEPz܁5tro8J쵪&{fʢ/|q_Ita2:2EF,jI*z]mR\?Ȏ w%Pڡ|$>,>={l9*Mq8_WP(a8aF0 JW %f$CUMUNN53j6BR'ӍxcLYACsԽCQ:e(Dis"p62HY)^dL/gmɢ118>dHl)3Q7f% 7AȜ22a]K0jj*7ݡU+y{+W8lIF6ZURэI(ƨhGD ) qa4ton j&\vF1@蜛>,U\m:#CGH*A$Pdx-MƩ{Uå?vBG&$ gdN,pș:j?_5XΎnoU*_*;B'۳(J\aO8GwM<h\l&ha9eXn(IsӞ?/Ew,.Vߜ29Vsc`**™{e3sOpł^qkN3ῒ`{ &I&& )CWC \)4>:.'hrDNSymћ,rĊ/ulEB'C4H5J4A-xΩ"0+ME;t(Pr淥H~1~}߭7ۡ+W?u ˻Q >#v]IS~RW q=Rw?BS@B>[LP34 M %T~zڐ?z[Vc?FZ ^b݉wE1@TIv7SSmF8Gwr\9ap&%r ?rVYOE 7:?R\-,,]N ;]^r*{Q}u|VtM30 LL[ {njjM[.!?VwXSl~(sTo*h:55uFyUa~4'YVW-NGE'oH]\r+ј6 $h?y*&hryZ6SeXϵAk]C**y:eCju9q+K˩CWYJG _LP34 k5tI}.hx|=!-˕ڛ5&H1])năoqҜse.%%(epUpJ%fN QΘizT%G^;ڝ;x]SnTژ;CǓ3'Gx Nz L>ygC %>l_j3$uK6Ι*WOȓ˹ ňZZbڌIda=8%Rhb:ejhd )7}k|dٻ$F%ᒞvFF5LKr*I܍}QKHn(SFAd8HWf,v&o%V5͋ySySOܐC6z#<&{Oz g[c @Y?g (:A2:q7*#/*_ĨQZ܀s׋eH/n5.#Ԑu^GpaJA鰛kf .@,8E )VB*?4t[-(ox_$g;y^Pk{Qw@1RE/a)tq~,+hgK0fNRZ,l&(u?ԯ&eܼ?$q vT8Ȇc5ݏX Q ͋(p2a26I1gfone lˏH{oG ѝ[uc?3}@Gӌ4FhpgNV$TfH_hB&Zοb1([~[9- Q)L[#tBE6gw"x cg!;Q!KeN 2Ha1X ZW H&(=9BG;Re;53:b-эfB^f.ԛTnj,7;f1.VAD KLHmd3 G)=(4?'K:B%dUqǾG<;vB [: }Ya٩f*{/?e*N?md vF !%b""vBq d/8r1i™D`-J'ddFޒTOZxBh2lWB'zE)2)cBJ lbEgP& 'κX H!T25Sd= Xޟ:qt䰺?)Fx2aBicfrŸc/re_dm)IpԢWje>|~akmQ{ dZCz) !7e (gdN RFhba?UɗfɃx+0nw[=cwv`j2*/|1c] e̽#դM8cs؄P|dJkR puj384PX$_U1)%()Lukc_=54. t܋.S(셴27o枦*s)by~zИͦơiVjӥܩޒL$_,GA=%8ax3 HiõM'<5\iv\o`ʌ4I%?n.t֌Z,$;=-\q+ a؜06%4ߤT- tDHq{skvZs7PǾ( a\t%Ar攁)N5~-e$M/3V[2>a)PtI%@WLiݢCxrt(P6S&܂AzLIv?p ;fX]~SYșIftX͋`oe;ZQy.6gO%SR[ gXNrcy_8W/!Lp6 r]?@'m~t:C%៻]su ]K#:<*"1F\S$,G6qx}Õ>~7ؑ!dЌ .t\#pAApiNJCvQ0+<ޚW׾VmX9e`& ;|0M>qr \}Ap`ҩ08O"RrN(Kz71q.R34 M-0}7%ےL HZ?7`ʅ% +n KOTS(Of?Zr_ -%r`3 Gp)P#m2dZsvzJQr®3 ^; 3zqB8 >渕4NUX s攡:,\䡅7]" c-ŃK{ &C^ĹW>ETK1θ2.ac h/I}|P(",.xUtc iIpTg#vĂH1ӎSAciAK54+{}Q.S'b?c=埪cQqeZh--V/Հ_Ϫ>RZH8>0O%8V+c;R &n~v›a9aXjX9!Ҽ^ױt}aA$cWժõ3 cu=ȥoUܥ:E'eЧR!pgN,r6^]8̕*xI y:e>*kMQjj|'H6ܼ(i8,}N-Bbm3, KX9Ϲ>U~᷻nE?#,6U*' 4I {8OzW )DAqIJJ;@wpg C85j8Qr񋪌Ȥћ$X|wژ8rʨԈJ'WOd_=6զeDQ,ʚr̛$&ʜXЊVSV4.Yi^^l^&=v1ߌ) *fFW14vrjU]MIơ Q;(H5^[$B`zig4S/b )6A^؝+pE/HL+6 }> Pn^nnTRzBc2tviDJ@*!QJsU{mkLݦV#arߍX)c#60R:f],AP&(mzVC3x?/ZQp Jgb,%xNBSyW7=Jz`;,֕2ՍO#nO? p6(Ü9ep¦~v[5J\'˳˰csQ e>nc+E¬<;MɒV1†1MvM*E 4( #BnDQ6SƦ%lZ%`[?rDgOnCG AІrO:q^yle&x*DufQdV9 ^3FQ;oUYVΌ8O'ӫCpMXȚdxhIfh탤dvb)S&).\\^3RUY3xFK=^  :YI2<1d:r_x9!@ U$ՆXgN( *fFlcM`Iq)Z%"AIK;!)Q9 /qwP;$dJʘ4O%(*tH"tnG_ERl7FmRO3 8~~(c)9=H >ØGe7q oT9:ejQvw= FJx۶AМ24B3vA" i@??*N PXKYztZD>"( Uji$* [IN۸N3JRX$EAkq \3*_}/cyb-7:DCTZyHl]ڬHSa+/3g:̛-g\N qi= ^A2$i;`iTXRhoj9M!'`pJn%E ˣ=> 1S%BP=?*L T}BN+Ei#ԟFG]ʠG"<;Z3b9SƦ-fK-@Y|/b Pnxp{ij5̎~Ym!/bM#-,qDH^H)Z~/AМ24-Ajm~Ӻ.qc$\2<!4E&-6cΑ`^7CʸgPNA4 Rț %ߪ _sL*ŮU ycM6O?"P.]bLvojPta)dS6A(@#Nr>e#QX2V=`5bE v[+HBEQA:9j vD nsʇ$ap9CfKEߌ)c2&-wR:Xr\uUG >w/v|W5U߲'dtzNkAG䓀vf ŸDSd:mQRi Ň+-w=DsD~ׂ?b+XH`M5.4U>:}4&̢;|G_/eK1θ2.EĥY.@jU0},NibAR;dmS88f^&dg .1gqrH rF攑)AfwomYErXm|6g?-:Ns,AO贩g:WՋ'b):ctUQ# k@_\v޾[_{5vE!{ LIY.PLrXQg.xwg Pݣ$I )CS4-0U#Ͷ=w,8oV+Dmҹ4͜"@LKKjv63g+8 |&xe))Q9eTjHNAƁAVw_{bZXh^syF&s$>x8SZSX 6$FΠ2(a)].c|OGR&6cUbߪͶ8uBqFh5 ǙHF*yH92q_/{Gsvr8fv 4)iՓC.v97p(VՇ/^n% -la@o)Hڛ'2(Sb@,z/$\by~j 0.˃ rU !τn&j=a:I7;3剳_z{"G0 NvJjŻV*>]9t~[ʧEkj3s@yD/2RӫlVuenSt'I ػWjכ ջj 58oܻ >7-a[(J IȬH_wЦ9cs؄!`dk/M.RLAok@o,0?VR1uВ鑮־/vX80m^Otқ9eh^Gv Z;4RIoFk4? =u7c {q-1=auXfo1 T@ HX^V:Бt6g;mّ><Ui% "j_7F:cs؄ldaSCmNyeKqRv:(U' F2 sِRugǠrl ^P34Bx6qh}.le ]cᔸz-Wi{nN`Ժ;օDw3ݭ^PȒf_YRHH!9iHJGKb@7{~=s'5AQzZhLK,B)`6qPKx3ޣt!Sn9e`^G6c )C6C!Kf18_V+8 ٹy <8{sG G)>ul‡V>nL$c )2",uA;gyMBI,<΃C՗,?Է*k{i=j2;&V*;#! 3’GЋT/KZ<)9n­q2.W ,XYG0g]2ZZ>vνx%r32LXh'7$}5X E]7y1 GJ`ĺ'B P8jW MsmTb'SBF\mzf]L? "w#A/֥8y|\<4`;tS7D!֊{M/ceٸ4}g8glNѾEt0ń벭Z\\O\ .[>0qN)HʂFN4h9K]ɼ8^)*'r3H R ZJQ.kn_m|jRY{Gm(8)j{gCRf5SzqOIz'@182N-452oI,S?WΉ/ ЛrFvBZK 4ԒߠpVniay'Fr`9epz(*UG: -F.*q9~^ y_SJ:ut(bxi鹉7$/N@;.09*AQ20qIjE~z^G+4U4Oղd}S-"7+ٔ2e0 \S4=]5Ǡ@gpN(JՅpOT6ƃǷfK1=O~4kl҂*Z~a=uzrzO;Aǫ^H|K F8sUQꭍ:BŪy&li_|¶=B\'L@WG 529: "l)2TWk3;H J۞D s3*PȤRK^=@$T f۬c"5ELrow-ѡڈ<嘹8*AQ20aMT mkVpTpbNדVE,.]_^Nf#(|eM"_\ 9]d =YChDn! k!MSRn]&SLTPRͦE |+H: 9P:wCx̖ޗCTCrJ}0,9sԈNL :JXvM5O+G;t28mԦm~l*vJUoXuS1Z7 Jp30 LL5DhvEE&GbM.wrO,ka/s{|7a;=G#%׍LCq qFQ vcd >@_=` 05KʓH4w !gs顃޽1 %$0S${lIN\5em;=lŃR\ȪG橿pdy8d >,'RDK!{Z"MK8gpNjRXOuJ̢k2}ku܂fO9A0 ;\5kLbX t [ Ojߠ:RjIomGiHv1 %IBxp)Gy :G7#rʈu ~ $ELI?]ӟ-4k?OLtіs [IMw'!V|y]7k2G%8Fu*H'M*t_0|Yג }b+~8e  )zl &Tl]{6JsLܰg[>&%R3&IXmSڹMaNrv+vU] 等U+Qي$D G[_QӬ+NWG7=H .)c"F7Dfǒ8vw-%@Z?kj]^ ȃ4WA+fQ.ds l*ceo1tτDt k!|zP7= 돵2{eD3JB2T I * Հr1av-.$9\iȑ2-bv"}IHaS vGoQu"Spۮy $%=8# e[I4MG#2r į;2Fa=- H=d]8>9*jVCTf\ىE*@͝h=6g!|zfM"] cSEБ` ] $7'r\D".z &lfn Tvn[@RD9eDzzAZ@T ^L őq_UDv_j(WjRsg]/hpۤf6S%"/LHodwnc&:Pn2^cax9e|†(Ph ͕Yy\TZSFb ]?O_nW$gq@=& k8K%ʡ6S(l F§#OqBW/>DŽЁ"];P77hڮHk1RdĆ"95ndḧ{8!/I:s%hi"nOt)Wu%љާ)}Z)o)epmy1pm/MZ\GU,AȜ22a5S^FlWC PmaNSe>TL>7-wlNl;&]R][zZ >5h3b:ej$_SY? ^Âm'jpʇ2&}AuoYbw[XIIO>հy}3ZGuz%MQO`F(gNj3*"ۿT-JCIҞ{juKMWl 5~_`CL.Ma qFQi`S dA%}MN!{zJ-7M?R (,).ƿ;ȞzIӥqDoA)*x"xx?tVn5x>R-7[Y.qܶvsG-Wm@Y9EDNr!z'0S'lR1:UsjS]V$MF.z@0mj*FӧRUfUD7!Y5>?,~z*A6S&.VE Qcв\My]EKU8B%[ԅ.4:t.5DE%v":eR^XgASy37jΖ\JL?ö˞_?u'5 KxtɼMgtke)LBhщ )C"D9I]5 Q/~Bqî\{ {{0{*j<,y#mPTB19eL:Y i'?~4`~LY:[iEKK}gO$?wmS$5AvsuU \)8_$AD)c60=)A4d}V!pyS t,;2b|V3K\x?zT9{u!.Sfl郶-Oh IqUޗr| ٶD0/]:fkVt݅1A^=貈iJ)3:qaKVRU{N݃Ǧ\\UǟJMEe$s@9-~PB9R"u&}VK!a-7)&zc? wu/4 u%n<ɹS1h{Y츞;LJȆ;^D{,:'r3L S05 K@lJ>V(VwʦwP:OԏvK NSNuSQ:sWrh֬"QD#Q9eT*@v+#ȷeGE_X.ߗ S ӱٻ帍-+ыZ r\@"rw *ب*z_Hzƶ,Se߼ù(056&ph\+ݛ(Q)sSD#A9ePj%dBO+Ԅx[>F*G@g5ё[TeHb OCCiÐԴ!i9ԜK$V C.96q`%t L1/5zd^RźLn"BelJ%G;Q'9x.fIo-cSPAМ24q#})/l@5٭>,K\?< 3O.oOk5*!ֻťv9M_ϹL6S# W+,W_6D$E\Oɟ^ct!`KJ8{6.RjfӢ:QoA9SF(nd, i+LulHs)ūS5vo4Okϼ34uPZ YM/;i}iF;8ZUaO16S&nDy1-~-OYFCyS5հ1f'o\8u`Z qY0HAŽ"ԤDtF qܲ,Vے]ܠ𡸂׬/ژWX%jO4Aq3ȞRHΨ0*T|g!WqN>N.1,7?F\'"֎qE Ob(U]#AIpx3"HItAKB5 =ә!7|9p[x>$kM\N8jO٠/tB"v4T~dtK{tiGWI )ACޛrGg*- 庆8x{Z~ Ta/q͐41?\b)rژܤfI|9-MKp3.K`rȊ5fK!jQ\ ʛï&L4ɔXs|b[&%)&oh1G8rʨĥVUEl[!7ײbpPZhd!]6J\eKjproIZ`Ӧ:PqϚmtHZΎ`sNt02LqA)r>j&ǽ߭%]>7umUiWB_ pcZt8Yx'Z(5:  $ap]3L S\iW;:lzSCH˯e:O1>g=J$\yZ Ng)}d\[6S'p jH'Գz{)נtȺ.Y|#MGOYI%3JbqPC`4?{{!.?1 )2,t^qoM5mkMoIӢ=fux؞<.i ɍb CiJ#)SFc$4Fx=+?5_𠇐M+oz P} ˇm%JҤB :ΒIW2, =؝|h&a6mbӮ[x 󶾇nJ(Mtki}:J!Դ+jiO* f1FWC5SLr攡k!SxYIܧ&m&q. 36*s4:3T >rP9Yrw]>D3CWYUf!S6ݾ4"'B4H"\N<12vxikűCƘŐᫍ e'.Ad.bO4ZAwἸhzPC\[>Wmִ׶͚R̒&C;jTws'-'{&S]ڛ5uIAȜ22 !S \=/ )(^̾h/\XZeK &!A;ø)oC[rP7>r)&F8rʰĥzxo?B[On.j)^7jt/yzp㐑(t.a4Tb?^&튆LIgXN䱅vF[UI⇺EE(+F ܖM͎1J5ejÑb4w@:|bqP gXNޱh,U@O]1 m7_1_>-u u&6́Pŧ'҅OүN4[7͒DtbltB:eBWR(m="mM@cd !>>.כ1+[& B5Ѣ]˔+NݸSrdqNWH!02LqdMPuz"FDMnάc:D#;tj:՝Xr*!U9u'YaS s?ORgTNw@I4P;NBy9MB9U \C]a޶Cкk[!G_p4r-;1 ›!9eHJ3Qk?-WK;% Ѵ4W=+ y|$-4e.& 5Nwih!HD)#S2 ZK(8='+j#G,@fCzB3mZdFTMy9Is򢠤9vpzuLp32L\Y56 *wo˦^QM3K)WUC~Smې貰N3mD i#A{sE[e hgN[yQ!^қ^o,9o1ң('4Qlq{MR9rʰ3A+"!U~Fz*+'>('E\CA~މtUEnqb$ OJ 0xq~Nn.M7;CtQ%Q5ᛰ <f[6]Ї,֏_Y=itww>5mL2dq!4 ? G)qxcUHQȜ02#nhzLͻ%o]=5K^0Z UwZvV -xS P4$0T5JB26Km̎"<܋Kp3< O9!"qfv(= \$, 0ybH,$Rz\z#罿9[b.> aT"8rʸ`E9qLj rHS%zq]w|W!S9wfey+dIo\)2=yDrFщ "qB$ъ*'[Rs*Y#0iTTFmMpK8:Ԋ;~U+N͈2"q5uTK`U-zn ]7aߝ4$ڧgf77}*:qKfKǝEimp";t MwvuP7DP~3T).m,'F@RӓvC6LbԎ`p:bhDv1#54&⾐W˿HEdazZآGޯ( qr46˛z| j'9'bfMKAgA<3lNF'gN6 * x{[lrN3: ؠrбeYBmQDH8fC-C={Լ^3*YQH\q QhYuRBTbM )Gz\'r4Vu+N֦O@;ÇН )5LȶNg?_ai4N;->AU9$ZaFa m~X'=_6fK_Iͭۄu & GVqe.(e>)(HT?`{( ͈2"q)I 9g,4;BB1DW1len}7TJ235)UJVLr C'oߌ)@) w] x\?R%mV/ 'h~ /d>%nP(T;rmPc ύD?NEDwFQJ4nT,HνY~oTIӱ7EkihzW{Gc4G}w)Sf$lC77BDT$ӮlWǴP؎iI#`ZJ:AL=zH#R]He "8F P(t`i[>M me$FߧK]t $.inu`T6x9ՔYFW1Au l┡3}[aNѥV]\w7;"*;YF;@-@D, `.TZB/p&s|Ӂ6ad9elX ӈgklZbY>ӵ .W]8@fKd(hK4"Uʖ9EЩv¸0)yߞm3:NNCy{hX f7m}7y~pCYőp\[M*K!jM-IuBy\Dp+/yfq.S!xlXyL_x0xĖk$UJ'egc>N<)SEPj6B1  mnnO/4kj"4>.4H.jYo&bV4g{K%ڰkBsDаP9SFCd*Xkm'}bg(kݬh容/xƳuke灮Qƶ/9y_z~ٺSt?oG8=F9rʰξV%6ޗ%ݜ:қn*?6=Dzct;6 )c"ddb$ќ#8lj)3>e!}.fkք+3/W(nErf 4Vw[@ۀ ѫ[/$|3O1QU;.B7/.R|,I£ 'I6?of.)`Î?2=Ѡpj)SƦ$lz3cT\~j 'mO|Ɯo ÎYI05r<̔vkα;#fPN@ u_>5{fekoW='~Tՠ,l~UIm|?c9Yd'd&e2h؃m?)&0Alxa!UwH8%)$F{WmJzj)C"ņm$V_݁HV Mpp96]jD?0sz:+oJ*?5כ ϻ| wL`JCш݌)cvBT2`ה$)x[i8ocGr0'D:n-Ei4S_z6RR=XRRxa ["鴎ނDE٦|GwRIoS5 2RFLA2(s Fll:g]^S !BR It!Ȝ22aK$>[ܔt0 r٩7w۲Q55<ҵ D8Et^3,<*hjOU'M_ԣ1'`s xA"(m?Ts~Xoe @7U1<ˉSŁAs|HImKUm<4Swa s攡 {"UD۵N}0 JRJ\= r:#C׸yF>ok$r&>4w08"4NDUIJjt" nxsX㜱9elJ&Ykwwϲ#SԱH-{]7zAuΕd,gFH%_G.2Nе2j"n2#8m;|gi0)6P'WBmaQJHo1VF#j E>vN厑 B.#3^9ygcCsvw| )CyN/黲.aw=iې!u#'C. P`pnZqibn S/y8Ϟd#?dgXNB KzC[fK Sv߲oٔ=yu[:T:]]N8 h Ojݐ9 ԥS8oA %wRIhg6h&|HAɈO06z O;tA4๧[t!0 R'[N/z׊3rmDBQ9eTVȪBXjmx[B٠^"~bJ`,`!ӲG,%)]c-ܣJE raz e%:LlR";_u82NhםB&ה21Ap2 15PH=jAlc%V|XqPfs"Q"4rbդR?App,tj>1]`b?S%x}M;9#.%K٦;$3E+ZZqCn ,sT n*qǔ4n:st pqY>V*-emh\ e;*] fnisBqĒw`X`'(S),NIPp^U@!;K-^@_{[ަlA)SFΫq-$8C}AJqgB"]p(N! oF [ kRr͋&l,)jm֛s:DpOE& H7A UlY Ӊ˖0 \{N># )@y),^' bZR0cb+Qe++[iQ7Wk?Q5s)::tu3ҧ\L??R\*hޤny"t,eQNfU2 4Y+N1J-WsFpl3G\|25'Zۦ}Iy<=XvZmZJqA4:z C͹|t1HgNrɽYyCO:]ls~Y,<+I)Uxj)g\wjqC~ )R*qI}jMf<јi|UaIZLTk4uO}%<4QVyKc#C/gPNrJ*c}-r~!\ZkH֛aW4mYN T$)oU ӯ` tMՉOLQ2PݕЧCnkKi$>'Jy)Ysna/'pgNJHI?V[̟:/rYoA˫)MsjrSIgXq9t1ŠSG^lGMFpl3G"rV[9>m郸x*\=XLASv {tKIf繾<S"A.oӟBoSE~%3uˁ=zMYTJvlzE%5qa%G&hgNFCh7CY犗AH|niRxahXUF@5e~͙w^:f8glN>ENBaЧ K[5HGRNVKV։-( vg3°8rʨtJ*5!^H{>G/ZFAveRd T ,`K#=75i>͘2&q0GJBz4e@폇|YO6!׃ed "XFj:[ҿrAWWu!6S&BJ~YQw2_:DBX$nJEHԍNz̘R ]eq_qd28H֔m`Ü9e`F5M[+qS-n(uAt3WA]Ue 3# W}2%989Yc Y*Vrn-}R9+ަ.ŧF ۂy楥o(3t~4IGb^">up]Qz'MR6+&3h U_#N3>y ;vZB|ty38-X%f4ag ke 5Ȑ6Ɖ7A2宁eg!-ꚣ3R%~JgQ`G7#rʈ-Qpy/#CԹULR|gq@wђ7(>*mw_m]qLo PJImIlֶ!9eH$QM\Eyy'.NIbˆ]nu&:`|0NKrxwó^X|>/sX uJYiAY)<r<UŻz9/#vY.2dִRۧHueGwu.<4 ħW(f]7MWcwi~ղ s`mK+gm0ckHo3Cgma4:%3:voV0ddWl>tiho}܁(N[D,Y?!ɁQV37U9sTL]Hnj~$ _Vu)N˚zN@½SZ烏HWqEgh9g(T({ F;ٓV ˱4@542}]`s'..LA|+eIpqj%c#&Ӷ+Ncq/4RqQT"YР#9ƨA,Fgjߛw"R\S?8OT5;xoHݝ&EJܴ;ET5vG4v?0$+=6"AΠ4(qIU걥Ebys{xŷW|6g5E5b T[t0H&G+ȞګB,cIJJp36'MO 9Y1"+EofYO3TZ/Ժ/Jlۑr]+vϋK/ uN4y1O4T wFꤑ#bH"͖ |fs u<ʤsMe_GO՞o P#7G6T{ɜyGPQI!m3V'U"IIê %G}}7}C\iy8j4؀H+F;ag[YS'U5쀴{NQ6SFT))!}l6֜HKlLES_usUt֬Vؔڦv@4}s4w8r LA؜46%b3BK@Pj"?u>d kŻ*}m-٦-xqsuH LOj ~I`- vSC]-IUW &`n4wXzlJOSQVwxa IF{%˜ͷmSe~MSTϓ/|*h3?7>Ʈ##^AG\AdRLc9i`~(ulTtéaE6F_ZU\{/һ𸽝o%uʓI+oݵw ً5{z;CcM4FaS9g|S/--qR\m` ĐhX嘆,lXfR  `Yf'ƬGcS}W\M}{7(ʀŎ82 3.pSi@ Ձv ^QL/06A4:ayҠ6YZJ; / u*ڠTGAiO>RӫYSB-zG!B9FfDd:- Bҋn}_/BQ^7>ρٕsv`t8l! st["i-"3G%(SƦ rRI#_Sy_2s"8B|/Ao?mRɬO1ɝK#S `XzH KOj!2>lH?#Daͺ lJ&y޼_9 Rn0Q,%ԚGoڼX=4O-xTT6s -vRfw a?-Ն%(FBdi &oYO1ՙ릾F[{MPG]v9vqyue6@TlmPV&OaМ44ai|ck n&SyVyլŋы͢L:gN)̙Sju;I|S!0w&Ig04EWc/:՛8gpN27J>8iH&u iSyCCoozpFMC ]NqHz#txı_svtKP36'M#9̓ƨIƉӦ|Jno\5(q=JV:ӧ?Y1 }a.Ԍ(L g`4K$)_51$c9ih:f&pvy可qP]u].qɄ4:lI >B XOiZpd]?褢j֚C IAZ\cl_/ܢ6/m\*bt X8R ܵgaZEJcqo :@>/|fU ͏s/ʇeA ޭ'+'6 |y6fWd6"<"&OV=/G'('lRezXCJ `!]W*=P}zS+X5t3GJgSۋ」NvxFi\ozTEMBz`zH;Q2< ,QHx$7%c^`nR@nQfjÄTd4Ƥu\wŭdjs|rބ9#sȄhOy n0/?WySNb`p VѽHfa(}7CrҐ]H/ӻ~tV.jEeP)[B܃JȖ0,Exn9Sn|1r:m%8Fp:/S+\ ~V>-2HTb^؄?z zHі9Zrִ٤[jҴ!pBhN=Rpc:ihpܓV8s!+|ԥ-UjwLؚb;wZ5<n% ">GcMHVIc7B/qZnOrTVCKbo9BλtSqpϳ#\ &]ju92C:ib(9 {bj gբŧ bg^{r{ί{V }m=Z7}4?cZכ#8sP|Wpidg~""vtXK{7i5 X6ՒREdTgw9tZ$^. %r3<' OP&W0~ݗ=^0!m /:lۓ[kD$9sk$<<%ۇ=G:tP!7td/KI8RƠᢋA'd A-7IKgjGثӲc9z#uh8rʸ2R)МkȾ,uLJWmVu)د;w^55:1ScoܐR,w$M1Xmdѿœ9ihº(i8h/0.SL{ x]ku[p.B] 0ݡ F]Il?uFfPNA!e+ov~$ jwCa\>2V[V7-?N[:txɑ1$5#0#,Ios_I^ґښ#d Yq(f9}P4GwZ>G]ۂ]Vfk!B؞XƄEд؞+FjfPPG;G` G|ͩC@Ahm,[/NŢgITwg R[u(lțHwB !3.;)sܷ ⾾hCIvB& TRA:^S8_T3JOeyj֤p+t~}6bgF6dV`0r88%&K\yTmқwQ||}ńv!{TJoTHgԁIv(<|6ovx)GH&<|DzV/@L &]ח}QJ2[f#ulӨ]w F/6~\0Ic6KrGl;LHI#>eWAzUC}Q'a~GkPdi=UJ¤;H6 I"8Lo8:4MS~X3qϙLlB˶L PjuṰ @{HS!~mÜ9ix*֙Ovz"ڵI|vvN^&Qx$-MX;v@b.wu=n4z G{lg؆'H03H^JY߮&ET/09fc8*ZD&R @g PXii%/\^kԩ]_Yu j[(Xl5.6r40:YuR}yT߯>u Bc)(?Z%{L/z ,Sx.@%=B¬y>v¢l~Wo|JFV(0Fq.؜56=bII^? n}]Y1 ofgolQncNeˍ3>e:ё:{'wՁ̡92I%}y|1es:ms?]HTb#4s=w<˞)Fb FgQ%iS "L&Q.T?(lL4J/y 389ܺ7ˤM\+tp<7e^$ $1$B\9k`=8a:6Eu|l̯d\,itE23rdy֜.rCFső`u\}ބn!tnUGHH>Y I1^lsVfP"~0oi>v^DYCQ!A^h#X)P.NZ'P=]hۂY#CFv<;:i¿G)⡨G>fМ'lzXཆIxJ?_]KR :FX si|qJq7v0ϞemG<Ƥ7Mq)Eţ`1a1b\CI:yA⤪TMԓYp欁izbq xb`ZDo!94ʘmS.Y}.[*Q+)=E8WQC%q}d4<K/05La+d"<~wӷqS>E8/$↯SV] X踲Xr(¨Yd:ib)%lB_۶t'xnm]pɛƤCc+yO1%isrҸ=֚ 廆Sf >x^$(sOBdAx]$Y9.Pn `38<⢥m`8Ĺ;͈L'C[H،hq^JbX B\@9kPr%Qdޢ&mլ+ywx/v}*^p5:z&mKH?Muo~Ib)%nzI:oq/..2Ƌʾ5lM`!MW^Ĕ]|%ɞMJN-c 2gL@aЗ&Fҡ<XPkQhg.5-$l|~ 0WI lg [ Ov/}FsUeMWKϯ.ݲ},O ˹KI҄4ToY!!p/dRh9]#2U޺h_bL2),ƺ`tŕ%N;N:ST܅VRȒS|W z sZYCS SQc\\ !;tu98X')n6HM^xZcyMdmCSwOUX7'LPI@52+^#2G:*'P{-i²'4bm BPk# oM׿V˹HI{nϲ!Ahs.5.c.UN'RrE9t1 =i1,tP`ƇvB-V?O|s]xD>F>v':]+r1kj4)M9UX qD'N Q/h5Zad/% 6O% ! *bofFv|S7F$I8ִϨpw8/:y)2c]:k:F"窹K~)`nV(I͋h"̩=f9/3Z"b2#b1F%"$-DeS~OZMFPl^כØ;f9fejQbAHȥEx"ԢO^4@pAD$R 6gM#btcणYWh[!grdCN$3PC|f(EZB%5?}ݥ'-)2B]:kr7 ݡʯJi+؇kcoMmR;q2!nύدk[0 iP buAE0A.Ȝ52q9d<+M(D-yMB](8>;^vIȭ|c+DƠ1"L*s9o~zYԺQ/($"\p9k\R()."S%Pj{_>nF _&lkccU\^1Qs>(4#n)G?BXB\`9kXFȇWLVPS]])j?MV6 ),bc*q:3ZDBR`|.4}ѮQ1YwA^ʆԹ] 'WĶ5J]"#TP, cN *+pHkp.J&a!eGXK.5Dq'M/\Ó2ha1Bΰ'Ֆ6ؚ#yƑС0g*L4 QfN;b(_4w`X o1 qkT?0vCn͍. v7|J[?t@#耼IPODu$W|yI61/U'.F.5:aPS܇]"_V/h$ M:`t6@(3dSQr= [+IHIPrBcBɤxݤ)H[kO2puqO_WI }|pkgmނ9#Ȑ՜k]wzEƔ'dS=~_d.dphgA>J~\R"S5A2S t Sb@ C'"0L..tͦ'?~SO (XR IgB,h"VA!\ROӬ=` 8g NX9Y(P]\E* nKe<-?7fެVRA8(*dݧHZ&eet^6cd"]9ktJD-S06+kydwzSW>{cM 5w@biLTQ0)>"c)F'샜Up_+t AޗU3Bˍ{M}ҥe!cT59-YKԘ (F04]CxVT]UMך]mT( 6zlvhwܴZINǤ=r`,Gt 5Z!j;S>2)C9O̠6HJx vCƓJiq͘}E'x&)*F!.5,q5]B;tkf$l + )zB}tحWv<کUrݮI=;ʝ+%U/@5Pq)dUƕ]O\WU-~ևQᮯ BUhRC( N(X}tj"h9fB1 tɀ5E`sPL%\K+mV aPnPy6TtO_¨Tqb Q)IDһ+D(c1U{^0" rq)pC^9ͱ/4/o=VI>4Fk(R\C ҹkt9"z̩dA}-}wcD'7 yf綒92]P:k jEz31W#{_y}PC68uqoi&$$ pj-Er yFYD},tS"x{.C]P&$2$[Ξ'TkC\9khfx ‡E@SUorv2/yZ=$STt yOܠ1Mޕۺ/,{nO!B;s"wN!w|0<'R;) ǪP_I!10(&c\9g`JyӨvx[>>~9l)!d|Vݫuʙ.|\kKEh;t>e"ӆoq)`|lIY#.2Z̏ziӚMه]g= 3V=GNZ"U*7CfTa%($셼KTf3~ݕ!^]z3%̚}޿  \ ހM+Rnft\"Q޵!8E)i*d(D`-CE~cC^rNnM,$R)grrα"MBb)%nRj?j&' /yQHVk| .{ncnM?oyt)a?~1=_{Kb@2V9r2Q.o.^ Oz`I4@7B3"VI=ެG*./zFW;uQ BgP\"$PZj=oC\Ώ87ұoUSnc.|ru`FM#zٽ5$zƫgZ4r%ѧV%:S.<(rn6 SH'ht\9khz&/Iun4XmTJzSpt]rFE-@3$SIY#jp@a Kl'*ʳD Z-!u|>=gq}J-.W#޲9TD]95ͮD/þ~G`s4b33cH)AwA.HRrh .o΅dBvfWIt.Jbw2> 7VCAݤ t/io5 (Es蔈NCSWۻپ(ԙS77uʛ?W+b$ CLʞ;~|֧}L&]4랣]@:k*&H$!_nwA|[UGI^tKs>8OWŦ)4% Y`mXC\1Ť. F$(ƤLjıP2iuqO[xkpS)x,W4 T9#1QT%knEDH(ҙY .uvCB(u89+RBz' :{ `|C\K~7*N{ъS^ Hg R Zzv|J ~/@^3FSKI[SWf!C4erL<#VJjAdcJR2'jK"ʁwK{r MO`=7H@Y}xb"~5Ɇ Q !󩎔O|JB*O>`?#4ߓi^:kzDk饷as_uɳP-Sy{A-cdAJ=67[I^A`*2vch>8\WojH)v9*t 5u*8y[x/o yR;rf& deN[`3Qdɚ_*h,&sU;.L!$!.5.q ) QP7u qzo>3"U1XTOe'>幱נ[&NOj\H{%顀kgUSg] La@MO٭H̛ O}xKhyV${KXGz pʼnE] Hg R\!&Y'fhAVwNƄN t`7$cGGhGsN ZuP09b5бڨDYF1:)xg6]7 )jی5}tkj]P_Z^M!Tc#u|<>H i{y͒ewH)Am>XG)7ʫAhZdiN$͡պsS?fdbTc\`9kX:Hjc]ēKpp[k-~:U#'rItiʐp 3x9Y+^YO3kO:SB 01 !7-x71بt_պDN[|*).8Rz'E1A-gLH"PDZΘbhVCp}Tp67g\r@:iAVKݶ[ I8-FYӻJuv%1G)8ƪAh_0xǗݦD+.Z  (C.Aː !Bu)=L3H÷QN`x "gH4!ktZafAe1Q%0_ϟꛪE+wv~=mLu>ӈ=f+2uOMs_W#Gu`Pla! E ~J=HE5%W>Sj䱒Q= h5X*{ {d1ָMt ML 6Lkɓo=k mјL"[0 `rɲDHJTHxWмZShuA +#LSXo7&U[aMRr3pqOվ-8}rI7Eܗ_8fBCNYWETP>P8zsSÒv6`-uWls?ǠofZRNcR cA 'pFQ&k@~F4 U.%Oh6oR2+kMXթwJdj1FoXiyS&pBX4RpצI)/gc Lch97qH˛i{9k,5gcˣS?o;T>l@F\9khHW~@"A ɡJ/wPZw0O*XT6i% ItC |[ibҁ#PAi6jPnjR{=zx'w.u{ EMf* bv( u^Lɓ~^2x߳Sy6F%THG!SvKiM/ծy̗'nٮj2*ՙ PZ XiZ+% 3A!3{-dP[qNN4=jY6FFo2}Y+HE c!`Iܳյ =AR68qͮ!9ߝ'&(CpSX^ןG2} |`<Ph "s;c9+ݴ2%|w Ǟ/)*цs͐ :oc]?CyC"mywrS9d=d7t!e70Gnj!Uԃ)|oΡ6(Ty#6z^:N­㡾icEl$]7?=>yۆS:V0ŧ ^w4F@sЄ. @|U]aKG7"*nUO4P"~-Ԫ;"q%ڹd1sXL^n.</(3J쇴.1 ^ovwtDݏSQB⁷3jV*[8ɭ{z;GKB$<ڣcL"\P9kTJDpRT8ϳ^Gq-*W689`Ne#I:51L夬ﻖ(Y)̠{|mέYB懶2{j&=}C=Yכ/+X<|7tcc;>ܩmKFb#Omd8FH& yk^8Q6[l w AJ^сHy[P~<WDu"#rw~l5Ao>̐t(ƥR(N6O~iȹ#͋7sqNcswpցWP l[hr"K#/Gv9Jmb?Ͱ$5ͺ6RXh*mJ jˈ:NdbGmP4D-k"9C`F/==PoN-+6RC;ܔV 1͇+7-:f>v[ReMNf90t‘y\nq 6gMi%XZ\8zutfEϼGCkVbYCFl]2*#ö)ehކr֠ N8H)(|!A\嘯 !D\'`Z!GnC{t9}a{"I}Tb JgRXB*E6Oڱ|&suc '1>𰂖 :VIgk5XXQQz؜6]G`>Ƀb9#3LZa2Y?Α;^6ct+ 8!%XrZv*NRK*4,YwB>eю h2EI%gWTr^V;V~c27EԼ6' *psEQ7ϝJ$}&r Dg QN Pѱǯq.^-Q])0ϯF!up}u_5(53hW18)Ǻ5C> pW:R3S=Oct.*q.58=3:H#5$z2VSդ4zG0H.)7c-yL#'6lP2zpKMڢR ]FvU. <[O|KJ,X!՜wש_^owm0p_WN]:;{*ہ1bef[^ y &+EXׯJ川M5 뭸+sE~>pdvI Ph^'\9klȦd=W0z_+7c;*oOW(=ۂmqGH[́O@8`rT\p9k\ni-ˏŢƻrsGқ^z L2.[w?"Ri=CaOTM(ItQ.5:q[V&(Y=ogWuŠWEd}G [)lJY=M9Kv]CӠs݂Y#7D^Px<ޡ۪ٿHXPo(H:uDcuZY<|3 3hnu-w~w˘@D?})KP 6gMyk_Ѩ% _0*< 8ްd`~6lg\614 SHKEbסB/V|G&8'.|jV՚5p DKe`>Tkq ;Xk&V)3KfHVGm7Mp{#AYHxh]9kxj(h%7}vď` /.Umx##C^[j #>̰fD:~СGƈ%D&(&.Rb,P,}~FFIqVSzq|HJn nۣgw)&&N3Iunrt]:k¢(J?<|vnVKz_f]7E:+R #_Q,%h0FKX@:&c[ 60'oygl/oحs%٥B6}ó˿a]xDYVCVycԖC{[/{ײd"NDKD[C)옻IHf|k0J,>sZszqHҋu qb[&t( #$J%lyU]o=r;UR=M[nڌk4 \9mҖN#\$L` 2gL(5o[]{PJNKvj  ፱an-כ>)<ը% (*Q\9kxz QҐ *8]mFێusO t#?VzfFgnHPYpy9}9N9ФSD[ 9kH nWۇu#3"@ּpBvobWCT~R@:\%w2t̖KO)N ]/Kz`r?9:E`tP)#M,9sG_W[='(=vg (>#8YOx+4 ȥd1 paq'`.} aj*4# ޽LlFE`Μh%lz]{[uU~(Ÿ IP 0g LX yʯjnW?b\H$ޮ׫H`_wLD""zJqE'&KdL9ti&O *_n >.%,IY,5[}GkF@>$k9wA՘]FϫV9|}ιع[.1=.'N4KЄ׶ADZr]` s欱i>D<^Wߘ50=:Qez@4ay: ȔzOP[HiۃSN\_1]lDt 2@=Љ:7>8_#6C/[tY9k9yNN8MlhL7zy]ˍ1XFpx &gI ƘAU驆hX*~=,:vKs8 )e335`\(F&,F&N_?`)ͪYiWS˘Bɘ=zĢ|cg˾qRNjqF2˘İsxqʃ@MKdA_3Fqzc-c(Zg9##i,w&r87Mịv8"rpz, oӎ#uU Op D Q"ӣH[.ǻqV_>\_>q[o{[t:1yHz.`rDzȦxA*C!I ͑: Z#0d!k,AoaK:\Wأd/)7𴧠8݊(@ ӊKQ$)\XrpEdQ$p|wAQajUh7[|Q*5kUi8- 2fo>n+D6=QGT[r7vJxb\s5QL)9JXacse,,oM ]uӮj֜:礧xQ%fΜ\ˉḾ͔&_3ɢgQ2\9kl(Yo$Γ.x@S[xRk`k)Am_x9ita)eP&svE( n5\{S`\9kl(yLr=TX1|z:|Esp fWo]b] P1n6$5Hx28P" D'CJ@(%q*orsk,Ԁ8f.j LO*90J3Ǔ݂as 2LQ)oXݮk U)r=QH/GCץi x$*qX\9kp¶(2'M͝."s$]mtlD =ģwew/4 !99"Q\9kljĦ݈L^۾fމN'|-rDi+)T~Ωcr^wula0*`ND&Z"^:kjP&^jҧ =v'JC/j?Q1&DށPČVEJ8:LOpOJph gGxL:Z|?Cyiq};"JX\W})y ᣏ ` #3U­:"Hڲ &7 Np, 2"J~]N(':y\{8aK_:=Tg e!ptR玆GSS1xGPp g HO$ {E[VA*zySg\M"L`Z uP4 MxQBQXSد#5oBs۔D wAQ*,G=5g7 RĽvրťIZ򷮑LNXJ0=WoVud,\)ɞL8xzs^{^ BP*OB)D/ 5Hqi ?ve JWmwILOm{dBvP @%v:ӵ脤[d&HA rA朑p}S' O࿭jl'xQ#178F\ovM;y(U ܼ1 QYT3rx?_؉&tIJq>(..Cyx!32ףWzߍ]uwUI&^*1U8 G4ulfuyzMg|n%$J .gK\ 9/5ٺjf9eyN"$*]ȒwQZ2"VAB4t"Z/`뢌JɟvU`<-ض=ojiMG"gИ<ORIQY2<]fgO\&y 9^Wg*)|E^[7?֌1Oy }~l-ђpnjDl! s;deyo&yqi%a0C`LܯDŽzD%b*W퓊b~M褸@sM'e|4ͷw:]Esa_-NF/O2̯>T}RM)*#Q?tZdK8[ 9kH{-l@פxNSN/S%.DJ'WD,/-0.ޘaҴ$C7<:|G'ot$D-5$a=tQR>7:$#;w >w\ːeB=='7CJ3I-ir`v tw?W0dʏTʀdetS#kn`V.Ez[Y@{[VD76Vɣ6BGYjh)).iRщYC1Js)W[hdA'smv7պ&-D #I#p 9)OFI0t$gLJ75Pv^k% |*)u47A_O7!.хsPN\&l7}ں37Pf +m 2=;8&'S׷iJ')+9g8.ŹsQJR.?/gWŒ(sF[qܣp޼طYw)e:lq7ܱ[L#)ϧ )xIJ_H =]LB\`9gXX %\ߴ jGu `tb<^p}ylVUΘd,N<H,%҇ x1z9oqt~y&ۙHsļIgP/|.7/Ġ﹇ٷe{{|O=QS;ԘMlD@<3"M\2 9A-`551jNzWoU^m#gHeUm%Ww߇GǞ¹ =Oa+a]u´$ _ytypr֨4J'9]> $+h~)'Hă ?W@p܀W[+ *"5yV!xySSyN=zHGG㢁30JVYM]]y;9G^7Zo6|yqu]o8K9i}#.ѥ@9TILU4 :G`Nt. 5Ha\NqVӨ1}6{uěUdMBUc%gu+-M]x 3L1 qq ۟V:ݺ{O:\rjM9(io@FVت8hd1('pED&J Fg@Mڛp̾|ۮn;( aqR$rxH#F]nIGh r\آ0+TCYAAAU(vE\*vJ^ז(cJ42C.$E-ƋnA 99D:$s[=zYuYTKśf+nns}η뜒E9NG:E0MeB{nh4T8p朡q@Scs^mwu[8uQž"bTFG;> Rۢ瑧s5҈zsȼ~6~pDY#S2V伾ߢa#y'CnuE[?) %Jß@2Gn&e%r̉#;2vGcT;lN1-p5q1|BIdH8mW4]>Ƚ LyX"]bv S%|0H{WܶeJWedRҒ?X%XbL.$@e+{Ϲ:X '%&hhq7}!1.qiv}[)D2^U#|l:IYX:Vp'qOHexP/M@]2&˝:i"[+j d44Dĩ!j  ARsšx]yvN1*4Deg)ce *2FA+0SfiTͪz 4">;q1>|c'D=Er`` 嫿ԼnJbn1V߰#F*U%ja:i"TjRw%` Kj~Ox0k»*)3yNshѶH]Ȍ?C 7(Fpi3'G$ tKмaM8Utɾ --5IfNgfgf_W:s J0^Ʒ~KGKW\Wco&>U2S2 z%n7=n,w%+@Σذ.OMd{gH D vRe"W;t UR6Dx]s/T }@zC_1;I`75k{]NY!GR @zޢ;,I<25"g&6wokt&ع҅3C(̀HvB}0Eܨ;<=NByV.N7>nrs PJgxN [rrr'(b݉vOw04yRz}u`L.QU ;mIV6:B ߠlf>rK_7_bt$y-I\%989"O Pǃx(Hp}3(' J$U&xx#qҋ784mѺH;o?j5"[F66! Aeq|N['<'Iw ixD2NHk?ð6 M/̋L@hzՊa34~U0q?1FYJU qq X\[}F뿹/KMG% #^4AE!^x4UlYuQ8.-txRb=9iD"dc'Qy?ITQ:^.`H{|L$I!~] LncM򑑽L[C-ɼId $F%@I\b4gTuipTM'+-!|}"Kža+q]-"Ҙ&%x_aq^p4sU ?Y*_ <\Ii ௥to=?ؤkV|X§nEi}t%XPT&< T2/z14Z8ӹË=4&?A`B/Vbg&-͊WM3zʕyʹ1=55e'2a(P u2Y %R> ?&^V:/ V{ɮ4fqH:^,J)Ѽ_yjՇPT ICxk P[|Z8Dq~T$u2|+ȧKtaxѡWUl`mԨ}'CS"1ĵ})GA\j7rʀ@I])UM^?O{P`.nͪ/#lŋc)8B<732s?9(ݖl:tyx& qK@4P+E(ز\lf68'BǟF9*bPpN4Ak%?:ڎ~ ]hTs3夊D[ I("Ws=r&2CN,k p]C9p`(ރ4.P|ʎF!D{]8rҨfHz1\#~<o}f _#C M Ù‽/#:sNyV=e4< 3O& jk6ںR7Z|_}Uz[:e˟CNкp}ZxcsL';ڽTJgxN ?n )⮩>WǪLsy4Nk9NN(m\ڒ_g{/QS1(Ьs\ \ I(عB"/4-zK2Ӈ6)n͌%RE0X`u4[jSsw<8)s,&%θ4.26m hanꦢKCMpMAe "'n:l%dxXo:#ISO{hCSZ.GI˕XHEМ44K&1xk/y BaBrWg Y*@> 3h[OOiJV|PeTOC<;Q㽻5 .rF攑 D2jכ񱵝WI |0M7ʶy&Vo㪝g_%pܴTV<3UУr6qpfHY_.m`0 aQ"W9sfHy#!5VKvݠ;w[qT}ZAs~N'erzhX fJ[ߪFCW&&r3@' P DS+|f~H˼W]2@cSM#^S?}P+/Vʘrd$il'qlJ"5L^LRam`Ry";t(5Rg ,*c0}(5.@ğZ|u'V%xzP]RB8,}k;^Od؎NbU6qhjH+ _5oowԾwv׫BZS},Y7=Ee(%17řv,)Cݥ5uL5<{z9k߱yB,HgXNH ŻSI\=R&Uk2N/ g7P7GᆺJsųw&nqݑfq. 8`4J:i k.!M\_Ɨt ^QUb.SA:2 4,l^&ML`)1m6i77=*OP3P' * BUoCx;qc{~~lȋ & ' .&/v}bgXaU*LP36M bEwUA^/gX^?U4Zg(PYSQ2D@3d6c#3piI2~rBE"8rҰbHk4vS7[jqSLKD=td袮иTmiK dcw]*RȪ%Ra?0-}I vFJ'vyY+ g#vr0Ν tF|+n8SkbTXZm7"k^}L'0C* k W&6u;h].~)xyChŰ3'5=4KME%t:(e^tЩNgO,ԤD*r椡iA8Xr<>_n3h/UIE!.MX >B dGL;zrz#wc ?֢;ڧ&$R34' MtO_51[m8@N=^lt|j(}(Zv~ذ[l)i͵oK`']zle T=J7OP|}{ߒ@Jkx>C.9 (mƘ 3ƘXf4NxcQ,` / 9O׽.B|JVIgj~uG0,VZ(z52iFɟ\fGW;CtEȻyl)6@_ծAOyՏog=}Cٻ=Zɱ} :׿#)kQ;i"9}l [nA}ƀ*ȐU:VC*eyf(%KnQI Hc>>KU(D>(MQO~@Y*>.a]~XZjtcS-;0)K.{[{8崇AHq$EKIP3.'KG>LPr~am<0/I\ƃ ?r_-*5,1nLq|n*2c$K9øIP gLN R4#'4^WA k /7ͷjmzL>t2*A:F,ͩ0j< ]IRΆ$2Byy-WIZ>]ؾa~9 &Zw| 36~ w&=MCY 4Nѹٙubi-vAPYpwW -۔6=\H8\ .bh!%ݦt`cGpťΥT)c n)}N<նZ>/9]][*epN.Ck.E)'^vs1h!JP30' L$b3au@Fyx;V뇦dѢ,U x=F\4!l[" :@@KWk-=?yMv-~͋m=:~ ;˥;ct .̨xiߘD/bAFص^+h؏HG:xݐ > &PE%f;t52zXtƓ{z֭Y!0}GS@yY"Rlܦr#7΋4:;:8$({#hN7H Dؑ$(%lI0e~ ~44j'zT)=~ Z.Epc E4Iol9b_b FgQ_M =-_*RXS/Mvl,l?DuO]NINw%HmZPi5Rp v! # Y5m6- q4V P<4}5*k"j{>)rشGŶ(uIbAP@PC/&ϐ8_3s?OX^45uXz$/S+w,=ӓd^`+t4g&Em y049 c\9khºx[hdvtR|>n/oz}ObEwFƨs@,]LYwD$2ޤ/ַ> &॰vs'x&>AH2=QՐ-,Q8uZt!MrԩDt "[2{/͛q)SJm2ш xad&O͕]ɓ {JPuԉkSY 8_sⰨ< qx˻Q&:%c0\kbɦY/3O/5}$?QJO]* C0}E7qQE`љ.&YCDV*^U TQ{;)oq9怹<2‡"Zh{M/{$mv$jJku2GK?ڱo0M?0dŔ.~OAڬ/lJ\Ii;31#$^^^z"_v Q W\ϋ}z~BgTy0Ҋ(y^nxjdZgr ! zp(Ղe*ݭR/nһSgC| M"|Η6=+V\E28"ۻv;3 Zroѥ KgFR||=gqdša{>&9ƧE|j l˯n(V.$7=!,NpAt.rKm$q8)6A.58=3P#<˶շ; c)w)?A^ Qet4#%QG ÓMCsz)ט%8f hJW]{k[7߻GkĻMz+^4_gYw9tuyҬUDV k:91cN(\~ RgTX 9RWMǿj] IcFAz#}p7:LAf6CΔMkD]DCv| Q򈓨ӏα^H8IC(}b@ pa WD>ZSW\q~cT pi5>0_id>@ZF>Z; '=H] 2gL P$^kZ]TB\ %\ ܯ\qyi-,-)[,,Wwbdg)Q~4tp rֈTHcOJr[2-aK}-\ݵf'kdBU&t{WpPr/6D` &F2KOڹ,/Ñ.5<5:qD\oa,Ÿ6.목|7ٙP7SNP} $(%20nޚ漻<%=ս6 tl.)tFJ3 KbH_\x_xD?{~g҇óuHC9T:n1`t£2'((@ؠ_s(doȣ`x拪Ls۪;|>u> 65TZ~uz3cSN#YD6E^r3l;\FěGTNL1/Kx::wMNW듭z3cT).#]:kr6 Cpd[]ߛ!P jۺG_}{6U=[6朘BqǞD%S&BONtE.$F8!IE3&\P[TxSy =̛tNF{֊~Ju2si74hEPI*LZ 1vE0P}K#g1{_6`!LIrrW 9>칌YPHpqQS4 !]muЖa?Us7 СպպW$,M]e6iH#AYC>AOz ~zMƫ'u"^,a4 h)zt輅"55VWdNIaAG*Ư3dt^׻4:lA+n$ L,L:9CwUdmSǹK#_aPB\`9kXJe6A)ݬj*m{MӣB?3МkaR]wBG>w:WubYAi'C&%X./f#Wn.](%H,`$ B,4gLX6Pg.t8,m vDusL(~Ggeݩ(4{ \ƩvșZ#YVHm0"qd]9klĦI(sw ˡ^jw]tT ḣԮ%{g eZ9D@Ƌtj] 8g N\E#u[G3WX3]$$9rs9'圥ɾBA"'xF 7Nq%l<8y s次 MHxl]DA:%]ךּ->ֿO߅:e0nC, ߛlbPDV4~^Ei-[7(땃bCKfHL%%1qSuf5b1-6#b)Avԟ?oPOM4\ws~jB>X)i4V6 $~\H3 MHt6CЖ=@T 2}!6+lv,u̩̐=Z.sYGZ(,a.؜56%b2>N\YM|7q2@z()^$ vPTtP1LxkevV9*ŹsT5^,t.$wh}J6Оt b_H<>r.q٫#vuFlN#vMp BgP>BG~(~*4햎›¹PU%P.q|B(iō>9l wS d ^y c4AJ`7Hڊhүګ_]6a :HE+@)oN?:$S4c[9k@Zq .7W?J(ӟݶSӆ51UZ}mR|Rv_ [sB-m&u\ QYWBzlHʋLV*57yR(Tq/g>~n6h\FߧWr+td 9wh 9`LǺt(QLH2t岀nmjmXwk֖ӱ s=dᩰkT4*x\:.ɹ +XX>9o3e+mR7Aq]ozѹ.o7IdPOsxN-1Gj8 :W'ǎh ?HǸsLW z 6ޖkT1Ĵ tu4WAS6 ؁1sf`W&Q ǧ:(Ge] 8 NU 8C\^V5$Io6 <-v ]Um[J:l3@AYHQx%jvgqU??=& I]o4͕Ȗ_$Ж_X6XՏy /14OBX}`Ό2+ƲGD{ȐS77K';"9B`*U= (!9u)0_v9CZt#Ȭ$ D1N]$Ե{Sx5TF!Jˑ L` 2gLM4]u 7;/_GX{(w8k^UuWy HSth)tLP10z cxr)@r֐4IR兂{|g؊IrIh벩wc\S%qG&*{Bz8|y7$'BWB]+ztqU%E&P * n4Tt- _ .ӟ;gT.<N)xGm^f($$IE(=<:j̋2J/o _#]:kŽ(=vH1$8RiN9 [c4:iվ<ʅ -#%L-Sh IpKALxz[bL>ZI.$X5aV%iZYcwJĘ.1m'IY,Z;k!:y >mX, tŅ6Aj,4=pZ-ט5鮣oqm\$^$`д.7iaYCWB6hM88,*C:oU]KG䚞uBl[%lZlԻuq Ն%8!&Nۋ/*x pNkx#?o+b=եd`l"S` rYAN8C..c|#ue]2Pmq7怅0}_<=5)NcCl|R3Ri)mQP,ř3cTzFwYWCNn ޳UΣ>x'<̣]WQSΆ,YdMR_$ʾN lTrAf[ >Xy#{`C㤋zx&R&N1 R13zj`hW##xqNT)X/F(n@"8~D}߾-S3渘5?75[o lBh$ Isw՗nt ~|.Cy7 -CfzݍMXny~=mO9EX vA!یSC՚*p .ptDwBK5 "zHk.NW&sTHgyłbbm 0g L  >h;I&'%#Jyf )-<)$b4wKUːb8rH9R%W2Y8Gk3_Zp~?6ќyvPz*+S44j ob]o+'L|,)[@9kP el<8hFlnoFfK {WTvP=N'w8kZ!,"H\̨mĶc&cL21*F1.5.%R(Q ژ*wG|=_mx@KG0yfOK.5@G(ɡV| R֯7 jl_bS~YЁK`9S/Z@mQ '6PA){Q! PMDz`d9F%@E}],]Jh."bRrj]h\3XAHW^+4"iKGxA֪EN幫*8ʺ`$_B˶x &&.pravv $3XxuсSTxwGs"=T7gPXCXr次i4\"2/۪<9YKe|#,U@:;OSY\<է.Nc}T)Fyх(ƦCl=b?>5f.܎9W>ĺJĬ`Wt{=aV[/"4>AҗƵp2?I=ǝ/"dm Pg T@\8I0~*+:~6*||֟ٯ,/6k* o}+$5JJ)yRajǵMV'5ꕅۇ b] >g0"6cvh|9)uv4ߋ 'Ax%QS#JDƢU!vSW)$F.3( ԱNExnERU.8F?ۣ6)/ ¤wF^4eRYes9Ǿ}tʤsTDrKa]XCSNp1`;0'3 >k#;1ea,sT>9G!jLE>cksWH?qw+`fyyXjƌ˧ LSF,x &M") Zx^gFpXYF^:nPկKwFB9}ͧa/u@؟wP(G&.mߣ8hʥ)t,9fgKxzP.v,Zz)b~(.K[VL=6{q|e«&kL3N㑸±GnP Q 0g L yo6օro>!k_1O܈ ¹RXyzG 4ӤN; "C{KW^ Xg V\.#E+6xZҨ]8W?RGWM]ź'`p:VL$}l|mr؁hp."R| (g J\;jBouRs'M4:5Ta14c.i42H{n VP9ZR :gNX:qyi)Ʉg?W*t6 m]$ٔ&YIQW~!:$HEK!/H3R-GBdǺDUwZxMo4S蠳850oJg%Ax"q?-N#_ 11 pA +"rXn[쟁 r&(RoŒyd,?(' N2̞6?nx!Sicm FgQ5 dJXkbXWft1Zt[)iaUO)SKNXUC|t^`dˣR)쐄ii]RLNSws7u*wp1o%I:lCq&p_h92ǘ`r֘ՑTs wI^ۢ&k[P9kTH)6`yC6H{8YC II+$o8#~WʗY; m/ 0$,&pn=9|&%M6cscW(]IvaKܥ&I'R# 0H|{.R^dKJIu>4u]"-;9~/ɽ&6#$z ?m_>0i'rh "gH 9b׷RgK^w :~妠?7O9rsL*r|P蝱}Byʀ"bm , K oOm ?Yd5"^3^Dע*aAC)=^`RZ;ȇh#G&;t.C6% q㹹B=-mAGU7cȼ,fr+L.1c-riK=v;6]hJLe-̠:LaY@R5w΂ X3Z&aFHf S%` GCK?Ԟ'=ŵXE RU>}]>]<r[ˣujҦ;#uEhJ%J|/2;`s=92'ͺI2dJHm MRP0%\,i&!gá=c{=:m㦱1:.Ca]p (g JIÐ>U-;2_:N޿t3pؖ, N]Gٝ _9ƺhQ~6oHM`7* %Mp R,;UZ["¦"%'!qgDX.H15·}_rx0zΰz &~EԼƮqfK;sDTWX5:4;Z}=WWGz'퉺H6EyiOv~(_kLel1k2#-N6L3yصD6EoXI ;}{Ss\p+4J4y EFw6XU2bm >|JPTk #%:YtIS=K1.50qKFztl=5D7I[0 UF:Tw Zbii"ԙ=vorv ]`:kkac@:.r }[U׳U'5zYc(Z*dƨS IN!@Q>@Qer2d1|s/.05LquC|=]OKm2h*}lp]rƲ njIj5Kľj6@tCz[E`,rr8yqr8\5Nv24YӘ;^\' tr QNq-wǻohU 1=iVE`A% wSS*A r次;ejY#|ˠ ]DI̺Ht/a#S %-2əݮpJT&TıYVJR`(~~ nUvdcKyXq}7,&FcH&cUz;mċae4x1 2]1Ÿ sȄZSBo۬&,,aooۇ.{ @fC#Ub%hg*fg5x aĊsbI󃽐Hŵ`qX͐>VNY֏]#lDҏ˓Ouʡ[Qi`7Wa]qL m^;'`:ǹsP5$ ]s3:7:PM/vPu*;%ю)uFݗ9Wfg2rj~ -p5aT#tI{}4o /0,ժJ sH,TY&h,;JR 3ˢ̠x),sx"u@T%7榫URF%RWG8֟=T2:\_V{©Ar^Y\bpwa*a;N4}&E e .Ȧ M/5Xg=5'S]=2}lzjNYcT"F>v W+{֏x3!w.=xf&Pz-AϵEo4dl YFVˠ5hlp&*7H9{(:8"ՀX+k{A0kP OjLanx] -K'E9x]qYvFքP$]{ p L25ECjvfLi7禜An\U1M;fn~J|RĸE sȄMK==/W霯?'Ux/#O,n~ʶsO%-X!2S Bo=P/d©P! vA "׮YÇ*3'R:J&aos 5!-RIU'LJgV.bI l>ч"_~*݋7;71JJ.u$mӋN]U4Z;reKi:`Fp ӎبRTWB%F&,({wrC֫cVśM3vo.|N52!ci| |*lڜTN rR;Yc4"FV;jo3如y'q ?7R:Iu8蘯ސi&r [r':nU'r?ޝb9SUPIsM) "&moGbAkiԕ Z&I['O7܁*A YVEpfdE}U$?NU'߶[_UNO޾ z{NdL>K%%8FBt GWfCvHʔ7ߴOEOHw;Ј>x=ҍ9~!$,G#\r !{=l6+ FfR_J]cbt]?W# ([B&yO'%O;aw xCtpdp!pQn8MJ]s s|v6t +8Rt|Ǯ 뒺 :3]qr/>E>E:Cڄ}L T: V .{(Fg Ƌv|% go(@\VBOZHWo򗄔ȔcjI%Np FgQ9b8>H8 ZFZYK/d# M]UP[&U:>p *;|Iw.T酯?u,9GI%@Q GSSi&}DUqa Α Ns udI o! "sK[,:hPA,{Im6~jn (a׮i E;5@O-Z G&r BgP p_(5_(Tfq='dğ3iĽ\JxR ԕQb9J '&0&Rb=PWjq͇+|ӝI@GP߰7':kϚ=OZߦ3MH l L%Mcd_ 0ē|<\]?"6i-ؾQTBُX+V4[RVTN?(.5@a'2'|Ju{H^6ala!)Q7;OwMe&WE3=xŮ'5Nb} NgS\yDL_~By$pEos2W0G] lԺ"0h'_YXxRPb٩AZim-}M{uҙK5ĸ35K!dlnΜ)#=˙r+0l ^UQgw$cq$"8^:aT:RaxVh^q\WN1٩'ڂYWAu1@|w-i|hDil4)=h WnRk{jg.ht*(J:Z϶8n/OamikKul73=Q4?P9 Vmz\$:pr1,5]9ˉDܝ{b6XĘ6VAd9qRti*ꡫѼl>x-a9|> Ҡ kBTZEy8*=ISDTQY"Z]uV)Ղ3:+ʽ ӟwҫ+T3fd\V^gV.B hPUAMbґ[ 0ǻt Qp']u &bFz'kfnx ")M NfZLN=f%IVJe:9G`&E##}'D]e% 帇ӎ)tlN$!:q9ğ.NNp FgQ\&wVFr1H-Qި4Zx޶p*6hJ-{wnN'/+,A]Ezm_mU:MŸrָő7 \^s}f<2('J4/ѩj= ;S7?[m܈ 0Q"\9g`:\S)YR^r^7Qw^G6ۇ{.V)G =Q?HZI>^e.5+A rA欑ۢMPPaĂD/Www0WBS^L )<ݮSJҔa"5tp[d%=żWh!(MeìP|2*3Pj>sAMc~MJooVP祄UoGǟWM׊-$58o )ie7q6@UP?S *wh!MLYt0u@T$j!nuS͋Tw/*՞^(M=?[C?2%,]9kx )*:gxVǞ-jP:Ӂ; ;he~(8fg4欺z'XJ&2zX$gVC1a|8_)0U'ks$Eiu- G7oy $K$8 F%n5lqH/4@xVg|_9_K}2DgSikJpɠ8% ѤF,jJL5tlzf#ʙ؉sj:Z̈.VkarC7zylhsTƚ: Mp[mI,> z`3xrٜ̕&+2"nyZR9.IW`_ۺ/:gS`:ϳeu m/p :uҘݓVn<5aK)&;(P8hGr2^ENjoء7D_>2!qcaly8Uœ:c?4HG~h9jlV+_J7b\M nsʼ{{C> 6B9N$ M5 :L6hW@h(D9tٳF8rԠJSWKx暲ْϔZ_uzc oh&j)S nwD!|yq'F1BAN5FbI'V2gg/5/z}q]?Zv@AǞecqqoMV'ٝ31i|9xz|tCL#`9jXjhD0Yc1cLߟW0>QmV ,}FXj]&IcڕS{ Lp@G PuZ$?تd-u_q9{/RJh ˑǁ&\C>=[z-Oi`l"9jtdsfv3uu[/pD7.Ϸu'K.=a`XSQԸ3Ш\_gBMiM@G Pyi;z9iYI7咦=tl65"t((3PaO/|4YQsO&í!hN}Ajš l(x)Io+rV-v$.}W=+XJcY1Q'f5|jd*UCR_zmmFGQ\ E-sK ,hTםV&q{<ֽѻmu_-?P9w8:WSZ(g]sTݷ GVQJ#&0:N5:q Jm=w\w>ВsW!Yg~}y]D9O1A*%ur!n@&%0 #6Roq@ /c]l^W܌/Wf݉瞀K2پg0-5`kr")ԫNcTxeN@G PMҠ<#v&3n!Sy~fQ;v=M lwI yŌLtwtw9$Þhܴ7?)KN5BakS&'1fC'Wxs<߳{ΤwFNsa4ejgO' :_A}YYhu)$!N5. 2 NXUkdn\ D^D//FX&gI5Ӹv]pCO"P&P#O  kna!8q WZd{9߈˽v 'X)1imXQ74,ˢC+a5מM|#`:j¦(?>9d<70GX3vX0>Ca7WFݠĬy$fO+ux1RUfٴD(('dϜ}r^y~1btQjqvWZ|~Y$78iҒݢ=Fy'!X12U`NMQ rB樑 !e؃ @ FXojڬkqA:wԑ%Jk3$vp3[`˹|L`H RqL"P9jTFD%̙:-A`(Y0&w n)LtަW,&4"yKwo])42{˼ˀK^nRR75E)&ц9sPFi2Hۻ'xB2=}yyA>vؓM{yBmJ3 =HqGJxvIYBJ('JJGRG(8%;h ֳB$Qj_ k-SNSK[frҚ[jh ;:llo{dOB7arԘP6*~w e>T?Jw o7f?d[;"#Ose4/.ss~+Κ²p@c'L& )ncO^sLno^=0}ȹ3gu$S ;x4Bs"|!seO ;n bBvϐN!Yl #w xI I'`.A^˝?ˏ텇Q*?yhqw%qҪb7StЀD qB樑.UCkyI3 qqq^n^݄V3H-Vs޴.{7թeO'"2X_Vw8)\v2s Dk|ݨCOxɈ@<_+.vPS[S/A@U*7=a=Wꦱ9.vh&K UH-ߞQ?io;2n% F,썌>!x=ټ:B2{2I=ˣKtfi򩎹hi&6o)˜ : _ vb9jpؘkF ^)k0VFC_bJ`G=.mիѭ2#vr6с'('V`ށ`i#l˪}X M|*GDh#~{ٗ-j`&%ϩ/{׏.s%8i?f:Sg/_hwԷ7ʑ& cq.E,^.q:At?d9#JPؗ#.i[H5LTrFGD֒c-ng=z]W$?{8#(:sjr~fm_&IbYvE:aʎu޴O5 1U=}HFK@F[ N'VM{ w>=6q"%;c\\9kdž(60RTmn fWv,8(l9W!IA,R5JX]9kp®Hy*>y13EaĿ {uסm%A/v%BަGTǗ8kɱƀba 2gLཔĶ^/}u6XϾ_( s ]MLE RR҆<%Ԛ]iۋlxXޭnb9%4W du~wuG ܯ ܳnGs䬎tֻ򚣶|9L=9$=YIgwGm+A.؜56-bGqﭛg;D d$YZ[%iCy@Efi֒Jg~z.tcq :‹(d[D4YoQz Z{ͫ{z74w'|g#!Ъu3d]>'+Maŕ1EC]@:kzipC1oyV F vӭ7wtkȸ[^(8NiZaP^5zƣzߋt+!Y#6BZrGܱh|Psú.]m﫦f66FL|NbzX !rh);LD,ˎA9cpfDT.~x6Mҵ9{Ս-^5 3* `v?ߓ>R3AJ49_rE9vE$Éaџ `jXYF3V:eJ}1eciAZCV¡S\ \VW\ <;}a߂YcvAZnɵbcj? [ku>WQW-n{ipxԯUWP3ѐ!J .gKXi㼋)f5{}Wvb۩MIsnpbuМ&HåSf\ƭ\s<:m}4r 0g L\LclϑȕRLj!>}miu dy%%[&ь(jJ0m۟5xU|*1۶.1y["K%z$y d!Ka1QN%L(!MO JQ.М54q%W΄4JÛS{5#xv(p-<ԑ  %,j׾hy0U D㪼?*#]4[m=KwɷP8vBi% X-.[d!$ XNφbY=U,*o݆v,_ݺ-_<^h$ӏ]BDOYSCo|'rI,Ss ssko~Q7wh:z]{l =lѫ#bŅ. D ܦ\(䷿Zlc@G.5.2J$ Wm \9>VM ie Jt'M2iaԟř|g9MQbY#S"2CU̦{|ϔ3oowQw`VEM.G!d.?ӓ"4<|8OXSfCRtDt J\]ǟj_'80P#ƃqbbo~ ooCkcsA _U* 塎 R .gKe0uhh!$EئI|эV,pcEGB0w^nH/rI>xٛ%S :gNX̬TtV0kW ItͰҨCE&yxvmo R# u9Y91(t1?G>C (g JY|}>u.v?L|+c~ 85prIKa?:);v,6 hDr:!jC`> _vϯ-&?>2U0_oGT.X5Z-ʶRClՊzvAZsO9Z {nlb%'셌KynjRξy$!__>yװUzד4%wΈRBXp.7itl]aSdvA ! t Zɻ~~dm[}Y^Ƅ} MIԥJ]WGW4gWEL沩Vcb%sƦPKpˇO%we|]ٍXqYS'cۀuIE4 ?W/՝t~9ĠrְPlLWhos@Nsc ImbXߍˣd?) #di}b;%U+ɪZFM5UoYbYCeh<߮&HjGB^[M,3Ncd\,$O1%R| (g J\y/ ϯmV4K:; 2Wݦmm<%Q,y&`I1vZ> )KtVfr6*C} BgPnGmwwam3]9 -N]9K3yoRi mCt~ϑ^b)sƦQNItz7SXžEb'h}١?.\iGCii-iɎ5)H|`;3|Ct ݺ Q ,g KUz|=҂/T}f(iV~$ض% +I)uS@7LϹf9WXb!0XbbYVA]>l |vh\mGFOtsت"f R)_:TIIc馞0PZcb} :gNt./7]If]CpMWW}W0&yRN^OX!g)6-4-2Jyު_hO,ȑYCCVhi{]xJy_cov?`G`ဣioyj֍G1SMr";OکC] :kh̠BS©ۮ6$tGN!J lL=aEU 33sN'>͇G6T̕r֨،&fX0]@S M<|s mF9TLK` D0}?<>tR#ѰYBVz7y_.+gg꟠1quUbڮ%7@ֳ5̢t2yfNO/͏iPZdYVDրִA٭754H>c1y5)8)R93Jbl#pmH뺈 h`S4QG'1*KhDt R"ڮW }edX *c7E0T'l Ұt)u4FW htt>D'n:r , '/m$!9x/\,c|Ф~#C/{K$V'lrSidrT9<_tU?/>ea ,g KXYXsHqs],u'u{xv7,qF2FTd,PC2KOt+4<^z)6b]:k(Vs PpsΛV?g6({kLb S8jՕ[-1W2ܵRVCwaYCtiTov?āa2xنvXN} *Y;䀆P(IdrKySv])E!jlImhyOˑ.5>q3 tȑXKvc{'9 d҅QP.,p8)Od 'w}8nN/PCbYC7AH DkDQ*V(1ܶ؍u}ߵK 3`N1t ާ ͹K86{sw1e Փ *YCk4._=bmu[7M$y'P=s|~M:贖 L&uᥡ\?!6_pfLHxi Uҁ} kz[D"HŌ4ܨ_Ի, hLN:D2$IE3xߏP8߷[jP7X]u/hI1SřAԩűhj2ѫ~5U Q 0g ̀]'6k`tb+WmFog) IBc(uA 8,BBSbICBaL,rƸq^i=45 !]W(qtku7z/>isR`&5T~kMm${2<_Ozy3Id=r @g Pu1iUgSV7a!YbKo~XZ"QWԭǷɸ-"#x[?%Pc} Dg Q֥9>{>tyJ(ڶCP Аn >|)% räH:}PFWQt d r gQHV]),yA S*OK(ttƮ(mޥR-ICLKA.Ȝ525!JwmWCRyٛjc*G6FC(#YΦ0@7G{u16_|DoyP?M'r 0g LX9 [,4~?gSʋ缩`q_e^+6DmحG;ЧN8s|U*ੈQTD',5bSd1N.85NqCW?+YXR^jIkEI~ HB$.|MI׿ʡ =K!GY9<8g;'|c%P 3#BƗґE x Tm9G* eH2):P=؋y ĝҴX{ضl۝Ǜk>Fw~(\I|ڈZ D?sL?|vfb^@glNZ ˦X,}s]JTv\.~1HgN{խ3ĢVs$Ms Ԍ1~T:t5hFW Jm^<]aB)爮D}ZtK'v]yaߞ6 o{(ID,ըѱg?ADwFQ "R=gղnWejU< dBÔ-yUis4r]R6T|vɎ6+r_S`Ü9id:DM݊mx]G*^NOe~xk05< C5 =r+7wNqIp3*'JX%YO}*`+'w7)Oj`tkcw®ʐax%_sXl^9&A1θ4.akvCjwX4f=}laCQI^an!/=.Sُ$ܶ;F'r3FQU!F^) ҧyVo rQvЏDf.U9s̜Gє2zKk#}Ѐg3gG /17rҸːm,kY n{]/'}hݱ[{d@ϐc)jGw3lDD8o!"͠4(q/$J_[CyT*} j9LzƋY传byQ|_$'N`oϔr84Qb!:iz)Ҽ\^ֻ>]ȜO5z#w W&V8&|aw69 J`30' L\ w*U>maqNm[Ke,waD aBXI:+& Jsu J)$A͐4$-AR47)5V;R%Х2PT>#Iedtlc"۸#_#iC2&r3>'Oykr35 u8\‘ F|/zpO9X=GiM^w_pcyE*/t6Xo(;+U LXgNΩFՖvg]{8oo}X'TeYSPp=eo s*/%RȭgckMgNH8P]\VP㏯uPg|N"Js KY!} SU*6us R! =[֝8i>?zrtie&.WMHNWLvtxn5M<יW{>`|trp;t(ťQFznYY 5>5y<ëNR&)64:-0ka5fxq[?^5Axxt9$u.r۞H }@%kfglةM|, Ip3*'JXElR|Rjʒ]Z@R$N\5F2J5-z d?_ee:=1&0Ff dԄԷKZt&A;`Yo/*oe F9ĤU[U'[E`φ+#)쀰gTNPA8Y|&p{7Кz ˘{.ͺ ăRǠ%ѸytԆa.S!*C|xu ͏o֜՞bO|Lβ/M Qբ$`$qiJ]fu}*$B)#iP!I~E;#t=PނV_m Mv$y,2-nAO6+wa1sFޮ=*T+]gf;q`RH"8#sT|,Q?M#ΎFLxHıQ&g4-b$\SK3M= 2 g`N r*΀_v7B ϸ:Rndș/ڨa`9m*[z.QUV#$CQ IAIi5/>5j PԪi:E 2$PXҝgRVTXge\[_S#s`QIc6S遃{5tYqv_~`~vU?<. zl6f( |:KId8Dk#RXg|Nr2ΒM}KG~M2E͐Gۤѕ› J z^>`J8pml%t|>6GGgVMp3:'N\y]9 jGOxNd j7Xtvl6gUׯLd=(Q03f-N:2xϹ,wx>cp";Ct-6Z%+(!/щuj=I1R׾/Fkm ڇL;C /Y`%:uv̂ޕ4؛C3EXf د;ctŝQjSR9I<CiԻ}f6'o5-&sJiO龈 (gdNEQ@zO)(6G1 z|㯏zu3Sv#A|Ĭ%+Ex\cB&$!{w mFшG:O_ A.Zŗz 9=nZ`tgDz#eu>Te$ 1Ҹ!! KLI`3&'I/X!zt 6;Rz齛K4!ɸ bK"2{'vL% >8RW(4@5Ԥ 7z]RPN12ߧgIpP˳M0 N!iz;3rT_f It!М44 @Sj/] ˦Oԝq2&*t]~J؝eS#gNq93p"̚ԒsHD9sN"=;R|=<%0T2CFgLHg\Np NNpnj}mVôwygWtKK{ijUVHŊpVCw] jkw.ϱ08A4:_bJheǡ^|yGNYThd?B/x1)MPgNFVJfhTq-ukj VEUK Bewɓx^ ?u?mYrH#A9iPeC4.,ջ!W4>:5b|WP +bȫJ~e#-9FiD.Յzt|p~NS(g`Nr?1!VZt) weVR/.x UFHtǽﺗYHUQ!p0=ԘTӴ9,:tT"#_OAݶ9 (64B"qCͪ u=N'a""Po'4~,O7j@gtNљgEՏ:3:*eWYuuuKtcti[{0LPjqWMM,"k{QC,IS`Ü9ilfHj N[5a3B}fp4l*=`32qy<պ:I#EU w|yl2eš%yYv}"prT{ĪьXo?Q6cB0]r3< O_8rҨR&8'R|DŽ;w_nݪyfoW] (H`&x*Λ:fH_23cvF "r$qkVW- ҉g\618Z/$=Y涾_HÞ6,,#h|%w*j$&uϞ2Fd%-{)ʮ#ƺ= z[F _aiim/q< Q34C"FDTtׯ({(6Iw<~['WO,m({k -;fq..?y4}*PgNR^V9RȕWo:zgj _,Ӈm T0}tz炁1f!$Nl8bc9F&TP>TW*}"lbC Δt2cWTGQ⏴eMS߅pL7>fY#ICTrG~sp=>x?rd"9itH*˦nᬍk>ois*: *HҒK3ոpD5uDǐ{j5z=?+y0U]HCQ9eTQRFYy*siC:.{]Aڼ,UNM {2=qhd$C IE PZS>~pFOe5Ւ;^}Fdbf^{Nu.7eD!$:=!tI9%8F&,K-@qMkH2r]>{BR|ў,%Rș!{~e3iX`yB%VH?vWiHŸL仸;#tŝQ4AGgLzfޤU2}j6OCgƬ-LG+DFGtvqODH{1)04:aiG8|˃$k78PN>ihit{a1a<}Cs9(K7hihNI#FrEo ]'7Ϟl*Ii!(U;} OjS6'숌RozΫ9RvrCO{oRvç|[ 석^x< roDg(B!84N#4uǛG$䷃" }L`#})/yMd펍C?6DU7tyڕ +LS\[ ,( Z}Γ<(%'~Њ9ƧB|<]Y-Qf{)eF%uQfJ'$*%gM󪧗?L8#r|3,' K&GB-ͲZ{`0aPjUړMr0!e WZ|a9[^q$0F$,SA),/%(]셌bU>np%ݮXRC` "4-8rg@PflpGw99bDv1jTHLcWPA|{Iyg/__l-`*ʞܗh)pö=7 J{1,AA40q#ST/mTW]G.Qa]zz 8+x費u CLf9mU%)!}H0*AȜ42q#K碑 bC7S ʛkz򞟨lt`V aFť/ph?ϔ@N Kq4:q2R't~Hoզs/$m|U>4}5"IAꎌ$e٢ L5g'kȜtnt :8*9i|Fg.BADECw7̐⺿|Հ.ñrRuNWDy$ٻ"?̟A,8e,J\.:l~Z<HQGNZ!۩K]M'U e1q)fN FlH pXP^xAR .EJw1\8:%7GG| Ht!М44q K&)|YHo{o4^ʯAikhB k #ԧ+:Nw{ϥGLKm;BpC Pp3J'R E,¿^[rlڶ|aj'.,zwMeDZuFtH'*PUL5{^qJ:0܇ o!k`HV e j'u `:)WZlu=z^q rgpbE ICTX6@p. 3% K{kn˻:CԫPSBWIZ")˭V^-wD ]n)~YߋDMp61 pFMExC0aHA9iP}ʏK̛]mgRo~5n<=׾5v.]ڨKGDgc7zUIAМ44-B:Q ̏kې/ -ZuC\{û`#i&=ҁU'TFD$y@ebX9i`:fTV&$ ^!%ߚ>RP&̳U%#ޯ۾|݉ >&=9+н!ieDM81GZG)ah":CtőuJg*gΐRڤiz6sZTn00S9 1J}hL~xJ~o5F#f4N [Hgo+;T.dkKVEzw=ň2Փv~µ;`d,7&d+N< F'GUz/7 :4@#Ĕ3}BպÌ߉R4hΫ{kCM#I&(DLsgO4(gdN6ANc>]bjMf!SʛG_0+TiJ^bٮ3 y|=~P'q.(lI^r v(jZR#4$t|\ANHK&td6#vej$ύL%}xXi@P"9cs؄]sΘs_\72cSSLѦ}8DOC$Ž"`u WF2 $l,G?q P.ޭKHΰ4,aR1z oj|I#-SPe?I:k*ݭ'uL DT<$߅*U@ތI# " 60(w7LTւj0M~LB劜5ڛ.iIFֺ dA8;&)v:RWk6Bц<u@ Fgn$ WD)Rm9~@/Fhs'Ћ=h ).}AzMAϹ(^G*`*G`p3'GXP ũ܀j$ΖՁ4)eVLڃ㻦 cՔDq/c*(nulƪd6Tm ]O{hÜ9ipz'CspݬA /25r/3wZ<4 F󕐢2ZxM`Xt]Tl84MI0gtNRHߡ_@x[wm\^rM<m+J&ZD;rDiGFPK 1гMWEGΰ4,ave?KE(QwAјfeTCԎw۶YJv_5$QiY`:SqiQ;>>jFR vj Wm}ZgweQͲL_@ UhAȚTٳ9C=戕˳Պ#m3.'KXy]`@xqΗDfhdXujyz y l2CS"# 4.=C;\D8crҘTILQUz'&{}90qМ445B-;.SoP%E(_Ho=m9%/=fc&CE#Qqvq'gj ≽:aL"9cs4M&r > s׀Nv86lIdU%9Ms􃱦>_phc:iZ8l֦8I$8Ň (q/k#@(znյ DEx0HnB&ՐI=Q[-i:ܗ ߘ5K%$ ΃ u)>ИW-OwCҳ]W"/2 {}ۘ9sĵMoT>}7nAכ6ob]>4YPUlUIC%7AjRLm 'NnW5-9m(8{=u`SY /nO;$#!SKvXp۸*T.(̴~C;8,YVx?PEY%|`Tr攱iq548#?#X AggOx;|}۶m_)M=~Jz~kWLo-rP tk5qһUmY"+P2&)-=m=?uWH{"yg{joLU6^s[`O*~2`9#Z$Co.w)I+ZgN-xS}H.F5 4 HZ`zeɵBC& FTN["'ڀgN& ﶷ]ԠyR/ s[]rF@3II-2GX1K,4*H؞mQq98en0Sr4J:Y*cT$HĀ7CrҐP( 12_5j7(STZ[%W& xL]wA@&c`32'Lu& }&=Szڻa»s=$+vgsǚM*'Iҽ֙0Hs袛Q9iT.(HZHOzY@-򱝫/Ba5lS-7ٚZz-xP(<<$ ]5EgXNapₗ0PwhaO}56ȼ*GRq)LUR+[%97n!#h5%0$,~rZ{ boxO'_麳J\ 碯 }QɎelgX]:"-1}9.q28]>=ԤtmH?X0y }ez}[=-.ʼ R@nN]ۀzM2hDPD\9cs؄OI@(L7ؕ{_`^N0z^ROB0f3s^/Ȍ]~mے1I͐4$a*~Mk`TbKndzi|Tݴ6?)ȣ㌙P(cҴKHيý4,:sPKreyW)}S"9)>W#@=r#.6O5&5T6p0ubb!z̆AKMUϙt>~kטE9cs؄OBFIˤR'$r߰?ΈK }B /&NnW$d )',D%w`iBJW$:s暠Z8MyHqjүi'G:NhșN:}M{{4S?gp; "cjL@\K*O)hנ:r @gގwo˧z5в]Lv"J'Ce?l%aOF':iJ(HǷO;ca<6 3Fͳ'Z )If7F+MsӅ?a]R6=׺Q_ aMq^vj܅c<5y ot>Y\BƠG8rʰY[xs<ѡ*[ q+N2V$埫u/, x y$tN&wKt(x_)Gx/pK;V*;ct5Qzj# W\jW<3=.S&Kw=%C!S w0S%Yh]FL yb7]C:i*ī֑V7%y*kwuj[HN%H,Q aؗ({y)Th6qxԄ袬Ǘrqij(35ULs]mG""JHs2οTWJ"e=q%~K(E&r3@' PXEm˚dR(;'m/ds=;/6mM'. LrHp5Nғ{m۠8rҰKPjz]?%=R_ lљŪIG\H"כp%~>mz/C9c|Y7P}SQU=QNuH %sd)٬:;PQVhHm38' NE##\_j38`!9_$  f (څēwsFf=cOhwJ$W4mX,9sĕUy ,ΏdKr.hA\]Y{i0s&j3yWXu6)pdE/Y_:$iA`қ6% zӣbSAHhMj4-G dS`ä$OV~>jn M#XJHp3*ʀk"ut/T5ЛSWDXMuR?%CvëbʑB6R>*~]ab)HJ4>qE:Y $N"R>_f8N(zZǒ,pՓM+PHm]?o&594,R-,Si,Ǖz~HQ\\,%S9^"j]G;#tP .^U.2P@AW\IIr,|Zsx+G?`fMK7DvN(uKk[;NI2 *A W|u !nFʨ8O]RxJX پ0L2MȘ˒ .0F66A4>#S|~J}Uͪ% { Ǖ0\}ש+ps”0XgKhMLDÀcل|;U #_k+F8s΁15P,I=yj}zaI.>WM_tMi X6Y8a'h!ك%O#,#DI#S"2U.DNw"ӴrM2`ӥj󢹯7jUzփDk'2@&w`_7O.Ohpt$+P=uhUV8G6QR}7պPOH6t0lad,==}N8!keБB-_ʡfLN0i -'KZĨTtSߔG]`ʔܤ`c_7:ps2k?n'RŽxDpqimz> bMS*Km3Ͷg'y,٧jU& ٥(U TAaym_Tt|ҳ#9*. %>eKTH{b=W*}%,ޕJE*V^8c_̒rDȧ[`Vo]Ɏح;k۪=v/?Ev&;-e,\mjg_Ӟ[TR`"9s+zKzz,s2쬀ԗ/ IQ@Y*8ceHC !'-4>}ON xQR@"G8rҸTNjl@T:MW|+.6G<^4#DG=XΘz.ƪL}r t ) Jp3,' K yƀРJb'LU ʪ-tWl4KơQcdťx&| $G,[pcvp7r€#@kuJ{{loQ+K%xLPx\%$Q7@N!GV;bw8 g=U>ƥD IS"¦℁APgN Aa!x>ڏ6p!qx^5A|~oVSj-b;}I9ٞ:Pmc/4|Dr椱 !iޖ:)l:)P ceZ}E?0g#50`lzs =#1Դ nDEzꤡj ^_)§P5@[ mJIӤ7uj#G0 ޷CS*6%Z%d#2"9**AW6O%d @ ?hcU|73#H ~ctmCL*>QV{%Xz;4Dag$]Tזt<ɶ42ISQ*o'9 &3p%3\DPz9QԞlףcwŋ.s34' MIl.vU*'o߷KNmz=G3,=tfX(K1g>kު7/t'w<<.8q I3 0>Ks}.eGhoPEH6Dz JGl8qC.$;4G|c2|A9p/mdCKVaBk8&84߆ͥDTD II ۜҎJwʫrڇޅms4urĒ7u%)%Y 2V-I *yM3q`";t(U҄ш{{:5&"rn? w(~OraRhZ3п.i&hgNTR :%}?YЋ={J̥yFbl癜EMea==}yƟ29$ISXsi^ Gu?@67"eՁ?W Cz黭=RZ*@|Y;eShC2 st";t(52E_MS!unS#( =}MAv@:#``jQ*1B_^74pz9FCdZkS'd0g7P}ׁki1-]oU=>CXՁwwMcc mi"Xa#(&@+*Lt)Ej[+_//\ -Ww> So3{>BNZѯˎHwqXœ9ihhE`ڱޕNΚBrS7` w%DXkh|w2rXkٛ mfE_2fJ ZJ hC#K"4.*y~=XtՊ<(0g^H3f,Zh7t0]vum޶(2Jlta _\lX OL~Gsݭ3ʶIƝsoЅ5Xnqgvydh9ƦBl.^u5X/iNɊOTvDMVE(:#Η@;t'EI%7#r҈VnoҧCլF[)ޯM9l40ٔ De t2FHz4c$5C*G&XgN SFT3- %k {?Js(q-;n ݽ=F{V$9bǬҊ]:sΘRY4X}W9#3(V)qG@G{[pTczM 5|DyG\V\Ԫh>F1М44a5uJ`ſٻ席%+7yÒ5Xm5BobȒZ9V @ٽi[$<7D*6[TY]l@:5@$2W)lϲ* i!1k2>JW-LIp ,g KX \w$6=\p^mZ\n79Sd4w̘#LO[M@B@,d҇ƲϺ}Lm-S;䝢] 8g NX 5FFx?` %;I2mR\Ep9 Mr_$7݇ P oEsoɭL uH%m`W<]Qv>w#Xz(ƚ1XGq\ )'.g7^?b$L9s\b\p9g\2;e}" LgBC40 0>R%uTk3y8uZSG&q/aq rA欑 ! '=4|?5Vғ}{Ά{kƟV8.N $x;ޤcpSA:$8&Xh}_ 1#mV\o?:J=3a/Is^Dytx\ T :$ 閮˗' S!GIp *gJYOnIոSn 3}s/ᑺ,Eݺ, whhVh%Wxh54SSht r1Ӕv Uj2wbk;؉n]ѴKDYsP%c#Zzө ‚qpn'5L!J 2gLY/l`{^stoO]POd;*D輠#AdpdzAԐUvŽ(R:Xe뷿uL&.05L44:o7ԤvP .?i/+;ʢקdsP8(rM^#ǝT쏍9rG ft R.[>?6`C߾hjWm?Cxz.'n(<m9" !zӨ-I T] @g Єz̢7fwh I9[G{ԳYb6.+eRGäO~?#s]HN9.3*,2? Z0/:ǎ4&R[OCa Lb$E\2SdV|M,CU|yfIs#~MP BgPy|~GKwF4mRZ\Mc; {ĺvpH e/b :lCRyRvN61Ź`s؄j]}Lmɾsާ95P<u{!eЗdd3IS.B{(.05Lah&RK?=u }XS ]# >V|auB]WJHqW|1,Q\9kxZgp } ?>ڶ]طJA`\hM5=a! Ļ@`gZSOζUO:}d "gH\\t&6|XHm[No?OJ23I'8Z#7E\uj̩7EnƧ(:M Kt.5T?Nٗ@~KbPt[SNh-bx~yn\O+#Jl $g Iǘ\z67u2r Ao\]bŧ<Eǻ3ޢr:z?R:R|N1YwC:OgvCA(r a41)y$k=D8brKl9&rqXb 8g N ٠׋]XHMNYI%|^LѧRni xj\:n|GH)G&XwDA[iCjVʹ/7V^SHK$z_ձDC☐:x[$|`~fsQ9DY7C8X ~uK'`%jS./6$?uI3$*;l2iQ%%M{ O7Ǥٽ.AYCFUMћ=R}Sm 6;tB#[| v^):3]bnA`z ?S!}O] BgP %'C }&E~H9dYv_鈺>UFI/Ja$>b:#=iNHua rq !/*z~}ˢiKxW"u&Yl9!HuBN[u4z1n0$g{Ee:$8FCT&v>B o5m+=S[tp3ěJI66¹M@:"s7ItA.М54a! !$oP{L8$g_Sy w= dl*u[+gq||MfLbxe!b]9k|g.!}jPޔg{)lڑ"sFw0Q16#6鞡j:eπw 4`Dm!IIOB]|ج &C>Ou}?2<;lށjx|n fV#&}*pTr欱iW6-zfqʊ&)&i/:Njߐ 5kOHSO;Ә]G#0sc7Vq=ԷuU'eU~EƇT GA`cJ,MOٜ3^gP) ŷr֨ZȊS[53gu>~Eڰ`j;9ttiFYjae*TeiUst%(lRw'PG)0u Fo7  S]A3w=\]ha&B,ZSEx3..Isk\}&qR`\9kh"(He0 Sݶ3owO w?3x]}~ȿz'ẃC5zu;0&n-I ۠!j)x6D!IJ?mۆ\6P)J)/ӗjTYöw5"U`FԒ-7EqaŹ`s؄=QΟƘʰ_H}} ~EP\6_߿bu8WgIa7kO@Y] ' u}6q_i] 6gMy3ul{@^ .ֹ9zqԠ^WF+7U+6yq%T~z~_w&:]`]9kt’(X)x?3'@SS#H={ Q3cv iCPP~ZvNbC#EHFH^!bKt*5 2߭ .SXm۝Ӆ`)kbI.CY蚲릥 \9ktb(8jܪ_?*TB @ >ruWl~:2RY%K44pahSz`|9\3oG AT\9khz(x  Mӥ_{#^<s:kdF^'8y!2><{ΚƉYAT<(2хt PVU7ݗ=@A:?clRz?>BXͩHtTWiuwGq[P9kTFD_JaRwBC-fNdԛGhhzh9J0d:8M>sx]@:k(h]uM_ʁMN͉s)ܵ0nYxTQ |Nǖr(wIf{{їw8ڱ% h CI0 j>PO^H7Nrn>;g[$sRNS9֘QHeya!Pdĺ@t$Gq jϐ_rb|+!~YӮ-!b(]G*'Kq%l5$W2E~N#;ܜas6wr8[9k@zdM}@VjR ^_fl&<bU罹Q"ݶ=S1L vc\gH-h5a1\W`z!׌ rqT3\UyZ达[q$^Q|h;D]w-q#WR_~an(-]*RU_?zTx. Adĉ'~Ę'e:I-`FŘ8m哝(UDrPxe|s݉%#pNJ c[smpkrykZHɇXaIiSŒSb7<60G~r5J0,Fa.М54aW'&aE h5eA'v;DyҦDu{0<{!z]Ÿr[˕u<}$k8TkBwe {6uơ#cW O5{#cM<:!tOĪX V:Ċ춹,Df̳kiTs'b9WTV"d$n'wXuCv1,;l[jq.5:eBgl G?1qh~f/E]mi$dL N׭OݺN)nЩEMa܂YQvIksnJ n`ħY/@C9 د-iԣEQwXZ$!WUj=JQb9NTP?bD>IM4 זrgF[HZeo1HhN^irP, sġOǧ˯m,_o{Ayɠjc[|O El b x{:Ud'hj yL'N]X uA SX^إk konh Xr 8{_mou#7?6)HiufAXcސ N i~epjR񘓶AYc!6%WN)TkXk PWi9[OmPL.UH#:Rt)8 H.58a"&vm.qXm=>@ GhIUҦ`574ID] :km[WjU=gEy?˾{%FtHK¥uOKHVz|L*tC۞sX vA*8" [+7gURb_NZpF&hI7{~PAq; ȤՋH0 *:M_[:~=,[ėZS$0, >x,2-TrMcR$Hb%ƦDl::{D'5wJ~o6ۺAN0J1UReaL8hȪ tM4TS&tYDA[0Rљlb_{ncty*BΠ-$q&wF ίBtsVYSTYS#0^m7՟cmibdoW)8$&@MSů#.]|NѰY&DH7WOlwbmb麩F.\3a9@ę^ę'D"OIY`KHN1 sA欑!  s^cEΏ8#E7AouW]uG?DctwW ԴSo/6 SS_tDHD~nc'=l\ߌʔbZ:^*aƫ)ARʧ46Bb$A'FxXpYtdJ`uXU`w6w|߳1w.n& u#TPӋ<H&*jS3﮿ȑ7r @g P qP<>e( hx;̏y"W`ɫ#0IRikP(\b_>S硥,>AX:hVd/%8G .Fb~􊐘>> BP^dM/;nzDt$1MFiP^ylDaYc6+vlU6:&3+}ѺgOFĺ3G'.H&b*{Ѷ`"q?OJR[DjjO#aݩ;Ds-m#Ch gFh+kkM~[u.GG9ǚx*[{u˞]_umF ;?LG&0#tW)r*&тnw۲׿<~컙): uQGpgM ٧\j _b} Dg Q &v>lm7M>wX\^^jhYX{geYD ѲYɩE[1 ?s`>"b)% "(MmlX3f΋ \jy}9-ԲNDY$TʝA*syX +)gaer次ipǘs7tA\d3o$yu_T5l>Rb!0;$rF4Jp8BDf'`mqYB¨ܬ7@;/:` n0jk76FCM:.e݉ԛK㫑FhyWs4+. 5H4hTHyvWwgg;{BIolG7^w)z81ͱFLB Kq-`5a$q<=U])266_[A2Ai] Z^7i]j(+ź(VKcefkLPacl j5wAPv}hf0&dLZ ]:{^'$:m8b2FI&2G"Grx ( Jh}#^-BwXmKõBCi+B2MK$! d2s mN;<|fe蠨29.V"]:ki)?wve}(ť6Ɣw=zmKpo9<뒒X;&>bҴG>4uMk).A.5.q" svkPp.fj uH/ k{!yD))gZDd9q3u3KaY>`evzo_Dz=[ڱ2m><膓%,L4O7 V0o) .Obe}:<#c^:kțkN0SV{SU@_VOҧ; &}iՏXwxDhSj7&gUzhbn+N6> s TNa٦U,@cms @=,W`NFD$ib4]~ڏGC3|bc4"[8k4ˤNfgJW3rڇظ }w_B2Xj$~S2%i*jB}ڟ|I^r -5$a#N[V _vD&7WE{~{xq iD˴@t:;l{|BԹtzHer":z,00]9kxzv*~P_67 |D]iٷNW7u[}5ɢE,0(MOV-:MdYC4 D5^_-`t.miPpmMulJ?QL2Mz&"%PqCd B^q:ғkj\bJ`,źt5\ 53{M]l-;Mw (΋CJsUxa`2xA!jH9*,=ؤZa kF8%C)&L^ N0n𴴚N(;%#g1>ݴtO]cGϴ'FV##5uхROǭQHxixs} <_ôu@;| =NGj㎚JiFCj ߚ\~cH)sX,`s؄T{?7Jkזa:x_<[-s%eV0ۮOk"$L&5q̐ŷ`r֘iPrJZuwm{}]R_ dݵ#v5VgWVQ]I[ܑ4.R 0g LCiSЛ/ݺĉnZΆbW Sk|@ 7*OѠ7gS35ϡ"a%$̂¦擘iU}vJR) yTu]}pH8%X{vYG0x82V*ڽxl61&Wܳi%zuQ/9*}"q~o^ fۤXOqcPDsĩPlʕV] FT~596M3{/i·W`3HXHt@[׽Jf&'OZ3;.'3@8*>ޏPn711ױOQzZwneb="PjWS)pOOf ZexC I(Z=\J >U+,\N?lf?3D fڮ'I*y*m͑GBUP|8 !VX~:ꏎ. )lCcH: D~6tE4[l_}ɤJjm>]LJ|>7b^:kœHIbzeuۺd0Q)gyg>ɿufsU^6jTx&$i]Nsg ~O(EQ 8g N)-o`` 83>yŘE/ց[l=ːUJGf.ŽIA Yx c%FFzinUU>2}l^כ,n'xhG@wkKdQI1(LVil6~| [qmMIt6o6UNr5B5VP( wUF:Ga7ncXeKbK!ydh&IM oAR}D8qK9sU3*jl9h@:UD ˆη% >7)D A*)ٵ@GEꎬ4^URkؒsB'B?3 $8%HN\DmβӪ(Ňmx2})@ ꩘ŝ~ 67Lg@֜^L4GdGΠDr>!Hp7mhnϐ7*S~, ;?z?x ]=&Vp@8O/H5RHJէ Zٔο)ֳiV7(skqQ%|o2cVk' :@q (vJa(0Aq.؜56;2*4p(Tw)*@M ̔$vG )lWb `9lOf ĭbDDYR.AV1O?XQ|NfRU6k~t 6#ۖ/>ѡ7W.sL E&P! /I.KqmLmg~j*>;9R)N!m@IB=Nu.(pGi6h2峲AK({%RI8zNnPRKOADxHU]PgǞ!@M^;h G%(%Ff" t.ۥܞfJ[ͷzӻݑ% e)lJ+yDw t'\2czHAk^_{g L@I'=BozIYU>&g)zȻ,GlLEB70/>ݐNk!SQX\9gdN+kV5('YnH~[>mvvMRn E{׊ESPdyE^֜c@qX@U«YWmZ |m5Ur=cׁ&HZ6,96w~(zD>fȫn idIp 2gL$18[cebGUҊR`zJphԾno{# PBg OmiFt=PN` *Ϸ)6K@E<)b8, Lj<(:9 sD('SlC /u$u9+}ف !dѳW\jQFJq fc~s ȡ-5"Eҥ~UǪi-wTcVXqt)3]YʗܥyݡRS>QëDqP"ǹstO夏slXﲥG ] Fv޶RDVsS<*!aSfOK%E'` UR~ְ#S,U{)swͺGY7WogilmwqMdgP1훈pFY![8_hߗk:z~vgH k`N|~<:^:Lg2< (x&KK]An]^NpLp :gΈ ZE 7ۺZ}ǃoVm]nYZmI漗1S|IRE<$&Mvc9sFg*SEWc śr\n]E6~Hnk|*tKQo͒/vd>ѤW՞`>g5f.y*l+TI'^d4{ H{rb/:ًN]\8*kE.F%PDVv^ '.F3{\Z<[d:n噻YjD;@|yYCS#4Sv\?TeSP,@_@0wVHGQ4$ =gS3DGI?wNכ;n.vt?dL <ȟKo|5Β_Ӷƕj63,佶RIzn`Kx@ٔڢCe'Q6.* +9@aXt[BnXal$sG\ojytl=IB?xQKs4n1ZicB_>?Nm絀f2xP 2xmO<ŧlF2t%˟|Н7,X;sRADY#>Z!TU|{_ۻ EIzH^UЊT$d]O$RiW|{.## #iM_z1(8*EK,]liq\PdJ}ݮ_cJ#Mno X{:#P]g)TSSX\9kd"W䵎m;no{䲪Ӧ]*v>sxh >>b 6<)0VSc'@e`YQ.`w ާ6 KX_Ŵ1DG޶~;ʜ;uNoD5V>@ >K:mwg[w3kQ3y׀@sD(e9)mq"5َbjhO).!瀡Ff&u0qr=ǻD\(b~~8G%(Ʀ"l*$/SytQndzS# /i5ٕƦ@cww8i˄qS@y8DkFt.5,+Q͛sNȄ^'5;'0 ЩS`=nkH5/˓vȎ, _oNd]:kBWtjjwULOǴs)' uUS !~fINv(<Ήxb s{NY8"'S-.yJvNOoӻrTGC^yE m.^#^iC/8T|m;v*g> \9klWӪi@XLZ+21"ަtn 9qFlc Dj*ev}fh SNY#"gBvZViUQW0! J5d< y, gN|<6ϻDY#H"d _ӯX=cN/[&?zb\?ITWDtځ}eӗ$6^mN _C{RA—m7֔+6JI:tm&|kv4jPɻE*WRKYmV~ꛛ6c9Sq)-|Z850 u,:ګ2!8{rO9˯{j$ s*Y7ȡJR}}pV+$8ƦDlzXsM7`Rs]yFvH\L/akMMO>aipop\i o]3?T;D%(%F.'"}B5Y]/DcѠ¯'\Led{Կ~SEKMgJDfz@.~>^{r@#\`9kXivV#~m٤ԅ3>mݡ;q<0uЈ D@Etǯ!Y Hl sUgFiW+܌x:kQ:mT`PWĝ}ۺJ}yKE$8%F1Jo^֨lѲ)yEԣ4!eC`*.lZ Y.5մ9)Mo@sD(H󇇺P˙eBUj3w40߷ZYV ޲.yo}ǶG<缜~C/n_f;h-vA /t>O8.vJ*(VW,M'Jvqe)-UD9D@)S 4E$Qx9.j&$0d@LYluA\+CVzboûij`sCN.E OSxvI$+%@ 95D I]^:kFD*(%v%#uJ92.3>UZGMr?vCV_VÓΛ5"J;l Ԁni-~"ApNEaZ u IP (g J )m$ sxզ$`̫:lV3p畻7";$Jf޻YQY> vh}c cYS!>)d{2Hpv:nq6|)WkOSoFGP*mxӢǶ~;Fy?ٹ]xwAQAZ @36՝Uu(]t %IvlǬCL_jPW(&V2ku'ɐk[9kDCZkc[鿗7?8&ɜKmUBݨ ȧIi==.2-hJ?L+ J䳏!>G"vIbs7U`M [ys~Em|i:,AfťbզOwS&U NșE!) J؄DY#("!ɦ?z1`DE,tޛre=֗s /qt4+a,jvQ9T^J` *gJ䄴I7[_^ktYhjD>/M{NFGEc--fKy?`-{pN> N` :gNdKi,%n+Ho ,oS1`yniPQmJ; 5fݶV[ML DŽwg|Ց[&r Hg R$[Sul_:IHo .W͈Kʰ)av8aۉ5y-8xU"g!Q\Two0zW z M.5vnG}35 ;?FGI|zb]Dxq$4t_?mCz]j[#5`]D:crQ'(F(DAz߬K?K[ v6zuk~b&-e8KQP}1%((s) S?;˺{b,m~Xգsvػ嶑d+ n<wҒ-]᎞,)Ry_?H EaSiȬ6j4||IwvKq;N:s9|~ ^yX?Grp.׀F,8ɦK|yi#2=^s,CQ9iT~(TSm@meqWTvA𣢱]b:u>CI'NɹS ~H8>kN{1J! yq +T,9ygnWw^=XH"O~Y1FҁASD5.Pzr~SDu!j)pT>/~C2<o*>>>)aGWL-ְR*LɃ5o8m=dwDtQG;;ctׅsF/tQgHC[q^$CyxN;GhM[.eeGFnMHf D:sER0R)o)Fa淆!]ExW+^1t::g6B8ޡS :fLGD9ʱ u񉻤P-3tmH-WyJSg#?ߔ vpEPFȣ]hqȻGQ Mp3$' @t!KW"s&,E|nP1јMi:s+2,F;"צ8rҰuQYT[[m<@q -R K?Cj}f91-9^7O)ue §C#H/u|mDOp3L S[LcMQmw_iԶ8UrpG}/Ǽ&^6?4¨tn%=9H>W^ H& x!'2M9il(HvtY\~sQ<ޚ&Iچi=_`qaoI8#슢,4QZ_I KO ⺺-chs71\S5w0hT5$BStmM>-W :4Pq*%0gpN)]& * 3>}노\֫݀M~Ypw:)3S\&& 稢´w`_ػmXvI# 2ש8Br<hU=׷C/P~ղA7剻EO BGI#N9ii0٧IIU>o7X7 u ;hltpְΐ^tԏT|eEuA3rEdRM<G_[N?̙݌I#CkE~ Z[e Q|66_l,~hg{uأoM:Y"r'Ă^A.vYPih#)<4FaK\l3+p*WцQymJXڱA ZNW1heOO3ý}?Ҕ}iT901p +FPf|$UVU5`v|)WTjEZ Զk`qP)6B b"ig܌I#vB1鼂;h.Z'vz{FLxc -`uUA5dygM4L5Թ{&Rm3F'QE2 3U\ @ T/lYjxX>|2jw|PR!zΞVe=ޡ81I; A6F'.*um{c{_0^n7}TWܪ[ 3 hD+yɭ:uyph!0 zagPN#JOhkX /+ZC] z 8тRA"[t##ԗbo9cM !thx{!o1i *TL=O4kni}?G٬5xF9ծ=lX&xbU{Fq}8rҠt/d(dQTy^(Fv:n,y2GNvfG!"KMlՁq7Kg/ %}I#*w2KG .7UzU^i_w7R+ӎ`xR8=bIz;27]a7%SCTS*IP3(' ʀ4j0r 0eQ^Vb]ͬ8d+z(%G&4Vh"x ݯۏMll;.yu9'ψt2dlZ 0/ͪΚ iU*sZC^._]y%qN4v6]hpiXPۂ XAϪ@ 9|CdQB*G(gN@U\Q&}UU9ߧih~" oRnelns&%ak5,GelSdDu!*Fmj-.;أ ,ՏPQIY"1D1ZUOPOPOH/A4 mAjbw|X4um0)& E\ uFpU 2ཙ(7uy*avpkMйP(gdN }tyD.jP`]wbK0y*ߝaXQ<޿x9& w1jFGm$oG/W''M"PZw.ii|x:fiا_ٯ:>QNCςC(4J-4[5k-Qqt=4@;#tŅQ FYTCydh}~7WZiν{cS:J\LSˆ?Y1lE6]f ICGpԣ=W^'m4op)}*9˟5™伤vɝNS͈"I".E!2!Kӣg9{K;$^ͯCF)%$?m_CġΫčx[_0>C1]pmWmM&Ʊ 緧U`cP904`T@ZGJ-] HϛQ<Jqd%99_;Fwh Bg3Τ9cs%6$\]veHA-Q9 Dt*'NaFXWCC:)6G:i^(8h$K Fk{|aMS6FWBl's.C.}ԦxGG$Mf@N 6E9B _ס_Teʛ4%|g\:$9Nɽy<>"`ޝ$yx^WI8gxN1X/-:##'I&eB Kj鬱Q) 8mʩPj"]DIcA@`x]UޭoܗjuW-Z.0)WHA9e%_MgV5 PΚ]dю~$aX L40D h_Kj 7cͦnjWȻt EKӑF fj՟8Ѧw7crҘI ; 2G*xjW5 ՅxNojh~X|2h$X8U3J7盧+JHЭ8 t1ޘ+=\ܒbJ/딕ʁPF/s1|!fqx] u; ] %0&T* }&lr[÷N֤źncu*v280}D5œ1ZnZU}iεCg. $r36'M  5Xܗ%\~k( mSHjHL>6s$!ynνSMhҊuq㗾Wzr;cm3:'N !I뎞G+ʉ! )nvZm_ݺq$_uVP0qry:Rnڛvhܙ 6:R(K}u#1A[on1|_}J ڛ,jaMT Ƨ3$*&ƽ˔;GU~2 Op3D' Q:\^-Uq8=82 ñIc4 FJr}^SuפQ'A.'lS'xg o u&z\nw3zrG~R L8gxN0J5X.^7C(J7ZWc@?$|(-^4QH F^;V7y-II;]w0&F9s3hi&dʰ5 )s6j#Ľ˗/ #bX-sU4v^ -ᤙ#w.aNU~^R4B8i8šH4 FMF\LoMO\&{1Rz%LG]#Tyfz亙!@ٻ:+kZb)`A 4~M߁jEB! $aV̓'*Q77#r҈THAG3?)/.]~S9D,f^~hCŸ#˽S[.9)M*g>(ghN0҉xR(].",u|u} OI3?/Wtea J;;9H?]GI4{#;%8'̅QplZRJoYdH^ZȽX[>͚]yUv,!FG<{Si 9 ٜ5NQٿ ti!8}uhtSWZKs }槟)qq'~-Ga50UCSPU8%%(F&LUa^/-m)Zh\Ƚooҳ^!v-!$ŦVJE.Sȝ΁9+Id͓f&sK@gxN0EŪ]`]9J*qQlv1^fxJ0v/وhQKtOʛ'GsJUu Lp3>'OY٨*S}o\Ш+UJܰweߋ~_aeiCL/xDv)Rr~1I3shE6qhIL]9|mn6eQEx-nv0>&VmIC#>:ۍ|M6\䡤f(>ەcgB)RUʨӛJܼ^& OjpV.#CWFU{+؀[Fzd~ZLɐlc%(L!gX=[/>$v+.{w4RrFc>7^T(2{r+Fg(yBL8CsЄ1JbB_)8B/]/?1ށ\:>r-.2dcSUE2InL["Q1F3 /SřQ 0q t HC<4v:Τ:2qUCDx r~%)uZ rh$rgH٫ =u@Mܑe~[lT"^&XCr:%ƜFe&5LWTiV 0g#J3.'ˈ: b m!=lIV\/t&g>ʻUg%ܱ6 5hhWl`nu\97€7CrҐIPza]dP-m]8~EUR_xu`@q7ʄEJv2pc-{KK3XZj]t+D qF椑oQre{ߚ/_0a`31 σ7N^z\&{,;cICXÇұy9xugq4:q\*KִLRylV]={Bq3>Q,ˑtM!(k#|<V1Rn $8SORJR[C !ڊ)3aO[ŪO"$fTwEn)=d_RQP19iL'i>-bEz%Y(/ljJmYHP 3GV\ P=F8rҠiO_"P~CUڈ__U,?t+0@j24SC%lҰBMD 3Y16y6:sQHKoB:ל16QlFBmyYåLl3:]7ʔLո tZp1QQt(cD sF s'?XDX| $UjM]%ZwX8Wka/-Z3?jfS%r3B'PKM#~&gFZ+>5|VL\!<*K3;S8(2/oUayEnƥ uFDcuJpcxV^w ҈m^>oW +;gnA9ƨ[toW~kN|1$t7Av].jxI5oډm"BB|lVwag]hNqD`ru -`-FL592d(.QМ44a5*LjUyX}/7m+^wMwO`)5t"3hq<,$룔^ѮДP*Yj?tJp36'M9WMվnD!:M(}UF iNJ/m^] -dh9(120-́\01$\Hey*LnNž9=4& `et'xW$2$&0' R]lz[}61K@"D | z'a X3(A4$8wẁB9bseTrT"9sT 4o?Ii'|36jb7n;p}XiZUCpUPZJ?(H\&P=0=V!v9!92#9i|jħAWGwe񢫗h8XnSr}Ѭ7Or+X:\4-&QsKcD v1 #"/Ue*,??3Q@6R|hG'"G=x 9R[@I0i!w)ˀH!%r3>'O1_HgGݝQk40w.!%OXKYfCXD^ӣ׃<=Ǎ ! Q9iT`+#F͛v̯%~.}¤(-`o?j+CI]2i=K1VD?(Cھ(gdN0J4VUǢz J󿟱.)y3} ud)?=By\ GF{x x(A= w I5 XM -XVϗE$Seꃒm«<<zMU['Uɟi^`C~b9# Vqǻ-X'K_妊 De RT.. jNnWXJGS\qVyq58J#9S!wR,cK-jS)nJlsTikѐTS/I |?X&gF"ha#`s@gN8(> j~Y%SEAO<7}cWc-vZaZ'&!F'>C ICD^zv>4o` ⿷m!>Eخ>}9]{ et C{HzxyĂ0,1ΰ4,q8T~~MC 4sߦ[ӗ:O5T7NG!пH:'Vylg8>iGRuPv s%+N)ы\߮ȐxH*UGil*]v:P+WrNoTnR0Ԗl`mB}fDZNiq3K$AF9ƥC\*Z|kr/GUC%gJD_ 'UDaVz(\wLN/ yr˿+M`34' Mt6&Je"?751Q7罱2%U[OIGM(] -5C6|(_!km[>vӾsu'(0F)L ۃ4~! )(-O,^Y)+Չ"I~_GdwJJ9n8.>UOgNa|{"yOQMrN} MN9;T b&U5svxٳُi9Ȋb )à(JV&}0[7ֱ4)]%ND4Nu<QQiGhT Wt?#H]R8C8i4JBv [//z[x-b~-E-TU 什q|:r$al1yq`o(:!.Ü9ip*gbH^5KO,uĻ;ͪRq~SPY␯xG莱6,AuCŌy%%(Fhk/O5N-_%SF)ο~m!֓j*ΗXcuTs,I(ҳOd.esGo|cP9ƨA¾(z+5 BJKb񁭂1u:OB8c#9qO{wh; H|n).AQȜ42q d4蠧uZ97S|].akE/ħB #۫L¾6jٌS洡0ѸӒrdJt%)·;Vk ֕=]$"Lw4|[? `T@qv D{ |]U+f:8?GMƞqE(E&r3@' P%JVp-͐^k{$&g?9=Uj'j̎Z7 ;sPz{nu"?Mp`Ob\/30sGڢhΜ$p̊_{jP6d=9"AΨ4*qbe-lGjtխ:k&1'^v/u~x:[SX2< 9*X0"$ q?7xmMa%G%J3>!QHZXnG2v{&obA$) ;̈)r갈 ],zB LRJy'*}w.unN W?4." 4U`Piyݼ7$ 2gaj) )%H'h@%E:%i`G}pI~[6o6]^ ϫZJa)AS9SkXy P)*]3mO'՞{N;#8 %PG1a˪ ˲ PN/~X;Zʙ%Y}`9P5w{^ S\9jtzDwE2}Jl`Ng,|4fZ# VJ!_h(,Imwd<r{R06󷃳7J0'p@gk{?׹aM](~;Fzu˷Dt0Kwô;R'Sz ӎ¸x̓I s樱 N(2}.6 _ 2X/KcJ2adKeQZU:3C6itiCSHP9fTF$Uj4)޷_4m]K۔47u 4mwvS)]M`%[xERGIiNpST9sD(#J^b@B[Mq@+PnO'=ep+hL/E2rm/ s'8 NLp:GNU%UznSOb3 0?"):&Z^=3x_3^".ylj,N,AR^Dv1J;g O7 bJU2=x%&A&EOW,5D _:Mpt8 :2< q樱i!gI5[]ɑ`GHx1o97ziO)(5q"o-6OccLÝ@:jJitĔ[G97(fjP?$.SMTX*E3D!,c}>/zI!DN5!Mx5 4 /۟P$~eUQFXrDAVMiԶaV8ٗȡc!T/Q9l6Zӑn^O/qĩVɷUwhȹO,]|lLdH*^0>l4ۚs@:Iל/IzMpBGPMN]{OTLU^c6f,PR\շ* AtqU8=tH"d(09jtA$]6e ~ܴzgS6=%[$*za@mn,kXB04UK a\$7Diy@.A)8N5:+R2?Mxj$EOݙ#Ziօ,!%8(Ar4)αJ+a+a}uW!nHQ"w>a3% fC$>g6wGz.C/ *fT *b[̐<U8=R&<@)b0IYMe48bvr%{] & ,/1,' P1n@'pi`_pRX}Q,^txP"%7nwy0?ݩٵ$Q"+8>h3g~| 8-W&g*]8VO*Jܦ['yIYCBY"\Ql:jIBz:]W[Nd8dPz}ce?w5[Psʳ=qʢv׷_S1)Rdb7 *0F**+ %vji58RJW!B5zBoZO 5 _QE@< GD,ǿ.DǘK3ys*7\?o@B 6/4z=g3ZإcaL! z(hemx̏*$(QFfA!q s模 dC П677{֭x~ _i5 }ٛFm5 QciBSto;{;t (NZwFAmej\ogUrGҰ xB\vP( [_!a7$Q qq=='uwScwD2՞/>/n[lY-w0+-NgAEڕm\gì&v`:js5I&U 5nǸt)Z.*]JxX%!VFinÎdiaIP*GJ4@fY1"yH@L}-kծ+t ?CoZyw}GT ֳSe'qp :jM%t  TA.{x$*.VHg۳堷Qθj6quш݄Qc8#mt2+{L@qYLH誹h υc%$8KCF;,}o̻[>!^|-U}l*Ai ytkl۪ |ʼSr.;zrXP)yѡ,(rP T dc\xq>_3'&JHZ\իɦ[7[kR,"-<̝݊H>:atQRJglV;E`BX7*Sl$Pgl=,I_,&Q:~W7b|I}mvLKnEhC3RSTlܗߑ=9΁-%MP>njOS!>! @GXO{7M=oZHm~s~UQnPf7UL5RC~.'JNGSI8ErfE.m i~]w/{{({SB ,PC;Tx 6K#OpHG R`SWxiDYAg2ő1j*[xѴݗN L9P% CzK%=@P%y n|]JQ#T" ;H5eqDa~`ΌM̠ PM 6AjKƓ(3~=\=@#F"8 F#FPI@~Jy&&}fԤMCͣey]H&ǁvCٻ,?x {`'@JYi*?,>^ \}3K-Rosдmn!2NLEh:S~3X(,9jlidS"Vשd>f"AnA;'n>>zSN༁^;֙|z'ph?}PFI0w Bkqvw2"~y888gp6 e@\:LI`/\7 YQމwHP^}Ynҋ% p5B!ۉOMm2hHcj>49,u]+.K -sy~6^w ., &u uh3#ΐݵcFţU|zOX$B <)ݹΔV8IxD tR׬T:De1X]a78F`jm)ib)WY!ea̙BފE#@NhR}M/͋S>SrvTyPJEpi;=]tP+`= |7z["mEBK>߶Gpڼ9aURN;F=j߇;kn 8 3|V8E2y8+ϩGaRc%3JKp+8 NJKh[^w(mм-ߓ pcVMO ,+ HGV8 d}F#%gXu`W.qVH*ۗ@btm9/"??Q|bk]=%MVxkW0clJJ8wv E6>E Getv2} &28V؜gMܢ?sȣT:?7S׿\u餢rn Q^y`Nt,RGvA [ SҴNIC%ӆ(^ۙ}Lmh?O/)uY˜aK =>s>9Ѕ@]TX:(a*>w/q^u범i^yhhr2g`Y 'TNnRP"s茈N([ǵ’-V1|7.۶wRUCmyvCK"ڑ3UơqpFi[AdPzDE/uClWROS0Ӝ1%˻X] Z6"fPP# Κr 6n'Pr#^ah*(uEN{ԿۯNXp'>W_mcI AE4ˠ%gM#ψU_gѕ|a7 _SN`W. Ki F v?ijî*lShJNY9N:&(5YWsktJH"WL.2J&z1wF]Y6M CQO$5B,,iZsᆵ< |o*(oM!ocRs#H &lSuVz{4j"ou)!)w#SޙI{%F="0ƢE,: t_T-f;T˖] ޵??Gʛm`7ީ':h%/Ձot;˹lˇG?C}#E$8CXz/&|Uw@_ՙn 8ʻJP 938 N8$B1R2m|YKuCsJGbtQy-iJ?& wU)k3R\jx\it=OKbWq1kբ`>9:A(%r+@ @Xp_:uq VpR z·Ya u>NsxbޟY_WX.ҹ^([gҤrXNKJ)GClTG w$_U#`B|#׻f?;1ҩ0=6J*$e{krL.M)͏(2c]!hǧg ] >d"+{}P̮nʦ &G im9N9,49 s ]x+( J >o;D~ MbԊ)` |1zuJA8 K&ϕC<[!hHGk) 29>_ -L%ȫfBm#,]}+^ kYHac V՛[.gtO0 /)%.|q:nn,^[,~d=!3`ᖼ hP tx4tk.(n4xX̃"b+ԛy5 ^Qon#).sIhA ^?N&(&lEDٙ]^[my]۠OOjQlU5T(,& [O{ @pC]h|2"Zo4BϪLQAKRz~5GԌ16N0b<Ղg2Bh/Nxct ECAAj~¹]tos"5!ڬ$s5y*@αEt=8O%G&s}L9'n"\J(dlJxyUwDʯj \,LO͎U$lfpsvc'(&8KhQ(řN?YpcuWrqztt{f #O\`Q igB˲b EBAe#G}t +^G\U[|OyǗ/.+!5;\M҆7ߝa.gޝ͡8GBEC>y>Ңn}K+>[{&'twS!uGT5]AVӣY?" }nLwsP+t.}E#.Rʩч=% :FwRŹO֔t $H\PϜii?JXhIEcG)yc |)jaQvih9uRC |9QzR*Ox񊾤1R\nӛ‌ 2ZoZL{D>NO$G'0F'lRŕ&giIvՏ Q|;UQg՟U0y;>0.2q\04д]; sLO85 K7t/O#.^gCST Fen)FDd:+ȄO2}?Mx0ƉgƔ:a`8kN" o,5P^ Ӧ#2gVH.PY~B36T(x+ogT#ikWr9fzTi_ U%.:+_paN;K߂S%!tR'үH =&HMQ6<{`td=.5K8Nm’ EC?Q[(7T_W8)"PXЗi' WM0Ma:$nR+c84^ӌd&.%QDt 럨U}^(2yW^Lė}%RU'*D*>$~>.Ne㡿1:, rL ]4HԘQ]{}Wv«yx bcڬ"YVc9}NuӒ=LY+z{DE?тΎ@T-L"BZG]~@ᛷڄ"65:HySϏNo\TWh.xGIcJy5 E*7זP1R/30ɧe 3c`w+>Q(fy<1Q=*%8&.\`eF0/kx}Lru׶wS}UUMç 0[.ٰ,fiOsV8iC$sX t)q!L)[_.;pA\upNlNI^K Iʰ1Kmw1R8N l[KyR#^ahv(x罆*)#ȷس|a>JFzr@%_ƫlbP3)_mbpB]hx㳫Co`J$LIԆq5*S!ާy]v{ưܟk[͂e>]N{|1i /Hp+*J\ {ŻRr:45 deXQ{9ҵ'<9 0_2OS%*O{B,1B'/1<t05bk|Qb5}26@8yK)A}S6\݀#T>6!ʧVZ^lp1l:T']x^Qh(5*`t-]_^ӳ26eSY ῿.BC 9"iL0ߟ.FqyjZb9T^(Oۜ>25F},r8UG;:Us3I0z,H ~xi{хpD EC$ոjUuoa8mԀ*oG^'M޲s2S)qOsxX;Ƀ E5 Ps叁K0M eF. ɩj<]^ž6#t|$l Π ͇tJaG%8fl*)Kso`Ny 8S׻ouL(Aֻѩ"w RawZwgvɨ>'mOiSsT:SFm@aMPp iJ:FzI |jmjK)jFwd%`GUidd>ӎm%A<;Gyt94хt Rl۪ړ N/-DQ]7uʛ2 #?4%%Ov0u>\ȳ#_4Y!c M݅%8ƦBl>'>߶{uq s梱i+()̒CX*Hq+ֆlt nKM CIr=/FsԫAl7P+bC+#+푦\B,N.43@bԨ+7+ndLƹBsĽQF /wem#YW2b0K GI]~$Xb"4 i.$ d늧osd'=~+p­m/Kbd eӝӶ:#r*eMifMy%={ď1$8FgTFhxDBk_. n!A?H|NiUGɹZs5.9*~-{i ӌyQDI#6C6f{ [u'|=nMlػ@AY$݄*T$q._E`yK3n Bm36'M E(b&#>|/qSjίA/e+#W y۱pD(/{!`W+ɒAУnOdteu4n},h/&U{wz&랦J'-!U$gdN7[Nm : !QoOE;duK{҆<9JK&< ʇv0QA$s`œ9idzH:Hdu wts+s^ƹy?np(kOm3JtםiLl$KN??> a|:i9ٯ(p=uC ΋z.\\,Uϣ~!us_`6$N_{Wd͆e8Oc'OB ICE!pQt]k^$wDqUx֑3;i暊3@T1 9C4Sj\^B)%턼58{ٯ7lN]9$u-#W?Mzo^sܺ'&uB|.tNS5Z=;EΠ1~8/5_.''W?zx 8FߨS'F(0LOFnx|qƮ@p3J'RZ'wZTH1.EZ).'qѓL/u{v5:I}Bq:]=S 0[~MwU~ax?BML sFщ"-g0CI]QV5/rjwR|xN49m԰;ͿN%"')+޳s ֔ݔyճ$S#8F$^;2C\|&zqxf~-^BES£)qNR:6/d43tvq/nj$I w! "2(k1pۜVtHtuSē >Ƹ%>0.1Ψ4*xCۻj"zhtd=ϳ'z$XN,xL~Xѷnu PiX>:su{#86 ǧ{'gN '=ZU+JmPs^T˷7@W?;#IȠ50I{L!"IgvȞ,˞&}1GYVCfHNCÇf!%(V51o}x]Y}]rA6h۴AB 5n, e\pfT u-9H\hu+wQԐ Q `\zyQyŵS}e21?OlH|ֻ<4ʥsI _hRU7O͆j8zr-Hz_bjT2]fJ_'2,B'&u#xgi9wN84Nq+U 6WeU/ ]nM7Ӟ(ֻ=gn50} y>P}تs* |L>hC9ihH<]H?bW ! Za*-P_JM<@҄ȗO Ӳ;yE#T94#wMR@ӆ$ 29Sbxwy/ bm3q} # I8- ՟$iijxoWP ӑ*fx :#ZHL9.22&qw=@ףi|)#HlWbGeU1׭QLt ]<# 4J5~%^3̎z9NryӐR*6S3F'Q@"5VwXZަ`ӵު>Rn9Lg/KO6,&iH & w00fCa9iXe4>_r kxvCoy{}*6͚ s@囹-7IR9ˈ N{+Hp3(' Jb?ߖ`ܭ &$(P`VQ;c J6i i<:a^o./-m|~56d3]T&&0SeJ+g X Ov 2o X茷Ljw[u RVgsfy; N%?SXg|N1mbE/Yn:#iȬnsm:a~[4^0z鈘@{h":i&63bdB&,q~-u I>EC,.c#Gf;kUZc3ޒ;޲ NH9i`*( hB`,Q-C=JN.1ZUeZUBfE.AGDS*eΣQ\5)(턢*B>u  NP72ߠ^ԟhQ*[tL7Mci>Q'ְΨ)=[A)ZeRTsFщK!`q25n^W9gݮQdܔwDF}-oVIǃgA9.J.0B%DʳI_4G;#tUPZyB}b=qrUU?P! ҥ1Qۿ#$iCKW*:آgݙZ0c ƫH4F=a4$9juc~I' 2|_}:%‡UFY[}*IraNd~IDVx@%<y:Fz_ C;!@bz23).R>K7E#K]5h;2.Ӓgm'm!Wyi{7[~}C+ m4 raw*Gp= @_]]oƒ+ ܇yGɶJ`{c}$Zj4pFv_]UM7.\q>9S' lr,p@Wݝ;ֹE,\k)- ]g d9-_żt8ŏ*8:h '7q6dZ߾Mg>s@Z'64ROQ%McbY#.5$i%9@cp)94!`yәZJy8E̓\/՘v9I{U9(3F&UWA G7Z즭}= xdH0F!jM\Dj+iP$-yE<a!n%r` >gOU[V#a?G"d__`o&eϟC\ޡpثuT Jء#ZଯyL:&fXwa*9 *z4>|oM9_pvsTRN#vfY4ٔX}FCK"l8c%cYT"@hCxQfAZR J.1c^Uޖ+*(E'uʢehx.Z=zLksEݹ1J\̝!.5.adth"dS6e\krytjlxr7\uudI!?se".E?sVHסoV(XVH+'y^{|71횐?2=$&%N.C/1 ЫBcY#D@~YxgN..?K##?hoA~!bSՙn.e̜FksG:5GGX}oCbm |Ιd in 85iU4QCxѩ%>8 GSt,ǻt05].'tː\vhFpQ:}~:;w&JS[azPw /. eq37]}\:etc^V]O+x:|̗xq>?تC:zch,t4'E9ZgYZ'%{~o6t=[vctޗwUKQREhr-L8*wYT&NUgΡSLIGEI|Ā Q6Bf 훐^y^ ky@ÚQP:D>`"#iF]$*YHxT%5E# ˡ.5B5"p8`̅WM^siqgo#.۱OaRvìF퓂-K9:C^:k:D2F^pW|P|aj42DV+(27K4)XsOTP=M?=ߢ=)nC=%Re@\b7Gsx:Xƞ2?И6γ-f/$A\`9gXJX9afu:jQ/#dZ-2M|C({7-bT64N$5܆ &F.5(a=R vBY܃q%qmzGaɕ+Sq[!82m3A|$esD Cc9(.7<͏78oPd:QK?: h, "҇M B4Rk2E Q .gKYYwt6o}'2gx9\&微c٤5|Bd&DTX+Fɜ<򘎤bP,@sŐ5$C^: Au2VoIPv̀ڇ3#;#AUd'o{AK噔*596]0:kj:g4Bf@l47BO_ym zܧ!(j1`Vńܔ P|n1%.\!ч׵oC𦏹K`]hT`=5w4E29qN֋lKϫ\0`tQHpD7e_yțBdժ8E(_ӂfǣuq13s^`!QA11pA PFj`CCwB8Cv.ЙMy{ m[X`Bw.VP &8t(ﯚYkfPCEr֨J/rJ.bC+;Lim_㶼;;XaUr_y:Š\p S!>ǃ̾:Wd1$~<sE%݋mSJTU~*7]n75: MZ{5X]8w>oJD"/&7MYS">5%\(~=P;Y/n{!!i+'D*x[6ŴT~r'Ŵ@@^jq:i[Bv#mrзqrG/wZyE }yKcL?ƒҁ2Yl鍉ۘ# 0,\9khjfv{Q&&`:czLCڹC{%՝#s3(<<:d& Cv` /гz~<[4']Vr/LGV8|kM1rʡ$^ aEi,X u [ + X }{,')#)k\נJecӮ "83N;bS k}eO~ZHY٣pA欑 o'gM>]{&ߔ?CvjAHU^D?,i =&U%Rɼ^ti9 e\B+e@۪Auu(F XOթ3}@fWC) Az =D.9/ pp$b\,`sԸr"T~ Th·N0\avwUdëtٹp/yPEAM2_) ҄!G{t 6#Sh ]9kl [Bh!XC]Cx$J͋~S>ֿ߀D4 _q7y>XxNiY9D^:k(4X|Vj~{M^B5PT@s8xĀ7Rcn {1;$eAWo|6@K!@`\oˁG><-[QH3v-ijX03'Db^dD!qÍ;GxOZg6 Cyk.棕}O;ISŤɑ#X tN* sH ɍJ_wF'.h9M*j L>/}!)j%jx$9TuYUg?S9 IL1Y#2QXr^0Mz_5O͐$0&䦆7ËVqPG*QmA$UyܸO*:|a/Sh ]9klZ&H|($fg`؛RsO]}]56[qyhڻkLk⤓gڵO8h3t6klMcˡ.5B TH4JWx}Y=2…o5|VeaՏU۶^^&UUHS$e 5Pz4AupYgR"dm Xg V`5 rdzsn.UӔ)GW.m'p}Ax4-ۀ⎭QrVڪrS“#6, D(h he ]nv6e#O>4γjWܩIYꊴjSADxhğ"b9 h-xV5Ck4,T< \GF!.1O,1B(Jsf@yl,(^xQT$.5:%S]E˟M2x ֏iݮ> M]{&8; ^Y$qJi4he9_%d C2Rt &gI ɐì`\5 ɫu.dX-0K?ykQ``X xkd\j݋ثpgP~isHXxq"xx^ ><竷%BM386/'՘JR*miYymԋ%XGir֨U.(/M}S!,w-)I+>|ao 0VE ZPiA+>`)?+>( 2 CgQw0 n!#,ϫuIxx-{u#e~T(AK|Ņ`5*:4<ҦXi%h;)Y]ٜ1(\9kxrJQ+hc7-Cze3P>݄2'x78#{Wqe%#Q G)vCb$&U=wZP;B["os~Y?7ϊ2!N4NҽjV˂1J\%j+"Ccx Mp3<' O\%D9}\^6 &e)iOW*=|ygi<gr]RH;"q )fWF Ԑ؜͢*yFꔑq;Us_ʇ*Γ/8qu 0(dDRbkL]pU2;4Z`4fPNՓ -J;,u:|-^K 힇@a Cx>vmg]ӎ(?`|G^'gN&idznV ]?%9֭, jçM@O$I ҩ b5͓舨IvCbA> paॏX~~B)eKӹ;k ^-oW명F! |)kFBi7=Elay9p8~?|%#r3.'K=>rǜ&%S`6R-E8:X.5-P^ʔQx$}x͍uQNP3@' PXI6hVpjS-->76d*!}}BIoZ%GW#R5(rCmq4BaQ$u"}ܣ2U_ +w3%5u;=h`z,9~E6R`bD#a9iXzJo;R9VuŦR>պKdWIRkvRz -3.x>{Tac6ChgNH]`S>[;p( #`p ߗw$]YZ[/ǖQjSl=YLckȱ4Da)$4wrEnKn <qjPI1ML7SO8Cœ?6 #tu1 9EKR#,ז| g9*<6R4\pz]fjI: |"6<.="E|۷FN5!(AΨ4*a%$I'xcŹ^S?DG<0;%gic>D *WLwD>cn >N 94iDt!oNOos@|_/wXk-nKw G@ݐv7]7$.$Vdͨi)r gdN A)鷻2=yr8r˲ʼ\=:QpCj"zġ82%u۴mM[z?&ĪJVwJ_ $[jހuـ aNX)?~:3 r(=A ,%:|GW @ 忡M0$(d$H},C/Z#.˛_))xqM2$|ugP<FL Pw{lc=K^\6a_wA ԋo%0YpJK//%b*ql.uaL5-{X[55"0ڏB' $"0",}TQ?],ڂ6CRP΋/M@8dVv|C:ۖqj4ו>"#f Lf$ObT"9sTN#mA2c`Y$3=鷖o(Op*~+-._9T; mNg X4j1g S1nG((FFKZgA6tjyGPdi~B#"ja5TM_ Igk<mNo*FdgNR"t4ּ^Og~Bz  {ctxy^ݫb94 m=.m9ԡ96,ƚgLNRH2!sUu_ȥ]&.tDT&ISJ&(^2Fjj4:]ozq C*0gdN)(DWm3҉6ܯ3Oi4rT#󏤥xzcM΄MvFbAujR*,Տe>yK.o!+;/S֯uꀰsqI3>J:zG;7ƘW[5x~^GBzGhl<:"DS" ڰDuF +"0Y|lMC]6CJ,Ĵ5[)\+lbZ";p9ATb79i oA 92C~SXQ<7UI?:hNS7QcwBk yp7 dwC5:T[T ձ5sDbq9i\)(S |!TiV|/k.ܖ_E`xƒ i.9o]G71VD I7FΥ7F|{G3ډUlP,cYF.-@UNOyQSFѨn՜[v,;s$9ct}O(qr+qPglJ0˔u/وYB 0ebS$ٟʹuיǴWvVrf_ >D =bQO0_I 6Ak1w4W!,^{>Jrcۮ?M0rƅ6(>#:i(A$! f>-[Gl6SQ b)N MC3!|%l՝Aauǀzr;C4P`VE IH*XT?/iÎWzi;tjV=pj퉤'DW{]dB9exiHr-|1OASwkՔkT]`V,s8X75S78]4O5#($lV:Chsdzx_UOe^Su1d|zb@ 'eA?i@GC\>46ƞ(;t(UR+P/ߛs#le|ZI<6련t^%=`SdckQIXF)  xI:%r3B'PXk,m7 @TŸuѦmm ԋr S/rX3T"*:2-F$tXGF$8&,R t +x׬ez+-(˛Y2lY lϚwI ٲ)(69CsЄJ%Ґf9OyK>v(h^~[cZo嚮<&('xZ(I _O vYT9٢&.Wrˬ;]ܕK&vO b(叏gK(?o^p<[RmPr椱[#k}oӮkG?tI|^haZrS <5F2p$uacy%z!&ц8s={Z.Ma~J $Ͽ/:6$cN Dӂ"/ Β\j-eO Υ_HN3FQUF$aqY"BϪ N#%}}7g@s c.[\tHdqY8'O\}@uz'ZG՟:OV4.8l[Y94p5ёs̜?Tz!do,apc:iFռ+_\Ees ^+oS&И'lzKg68KTԀMkζɱ vF#oIJjp/Vx,7(QTZ%K)[X'!O"&L`|ka&B8848q}Rqekou Ǫe8`ʈۄn@ŨO|'-ml9*`e&aK>1€N3:'N\dyƑi}wNm6U34%ȠqЉgp,21g0Rn|d DŽCL"Q9iT(<҇岮:2@L?(g<lt{)-2#pdw/8t4a(OÓgDxZ]6H BM6exђ!)T ʘܥVS~MrIE ]j]E պo=!FP#K[/)BA 4Ha?dʈӇ-L:32yCn!/FrT|,S:K)<|QilߋHyU;ʣ~dG94Pw1 k#xWUns»T^oHDu.zX0R)[^JI-E ZkZZ 1 ȄM={!?>pj_l] Q/۲&l%y$^)  wHKFڢSAJ4[$.FedT|5~NxISD*ͮLW]9#Q{e93< ݋.)g,5=ug;# PP FQ[ F _?jJxS=!mg6j3`]LuBψM9jSs8S1ک V\b7G7B#/ `-B-mXAlz%ŋr!`R.׈= E` ΤU7\jsQ|by9)Ktz5ݮwYcDp1iOH~&6C>Fb|6>Er㱩P>лn=MёIa >gO\GhZesNtL>:5-z:S;gu3Tܨ e8F=}|"oh@sĭQRZ ou+ ixW<ڛ ҫ$:a8q A#/;9'R!(q9F(@>!*r}A$'S^W-56Uz٬3H#ew 09#v? ǮE!HmKcd:`h0#[{uU[{8ksoċtSFԡ֫ch3OYȚNJ΢(XMht(*.5(qG1&xy[n2Qyk α u߳kzvH,Arp<. Ǘ;\ ՝CKŁyDPѤB2k~Q*=>"*RƄ|9.{ɅQeXHP| &IW &}H% DZj 5jɽ%٧{] zTO BA+񼑊zby /`35y(F/05LaWFw_ˇ{Oզ\H0t/넿1~lKs`.1<%YѺ l < 뢧̤)5NI $IĹtUP{_[OPlɻWȥp)^5[zsSo2I[8]f===oAs\iǜgOX9S)3Wv[v0VM>T&D*;;s.;*ڬ QNАW 6)k\dVEQub\"seKs>80ǁ:tox:B Dvq s T{:%e^6As-Q˔=}ά*4GR /-vN3/8瞃E%.NNItA.М54=By[D@:̯uUDSS+BgOs=\ JvFChԖe3㟹Щ͑7%b]@:kF(NzUhH?@pXe=kɦ22K7=mAvV`iNR v5GBۨCCӓKHp .gK|'@ZHX!|ZS _lH^+hTZK gA"44.B{nHJuRi[QTc\9k` KdH 3e#Yw*My_єF ]" #Js/D>kVY:aN49DY!>66GU]sGd@f}3RnJ)X{C)'5ػܫKɼ:]ONWx$INP BgPX?o! 5fwfSڌP+a`M3uyuZU43R8x;CuHG+."A!.5,a䍲Q&I_K\]ne9' cćSA6Sv̋حw[",D' ,9z J.5D#A4u>^wo~o;,@yZĖͺ񑜌NP)`ʻ!_`gJȚ{ZN_k<ͧ&&^;gy/Mw^wXqzu3Փ*{y;L ӐKOo&?d"[8k<žB[:i2l]2՛07^lzO:|FQ*uSGD9ĝw"teGN(R?u .AJzMy$7`&TcYoF?NݔSWn@Ub6jضy%NqΧ9F)nRѩ+zn|^Š)oUf\C ^yH PD=][Lx"ZJ2O3&TWx/R@t? EP`rZҀhg'm[uo8e3 2i,nuwKE]9k|(hCpY"ǬD2xy(S 76cp~{ ̈ KP #jsH?SB|OzJtQ.؜56a(˕&[eW4Z|j0؄6(D)X#ٖ!e4/tNe-@>_=ErÝs0li'ߐt93MJ|Kn 4]%'ߨp`Hhԩ cdܓM &! -x3#-RQ^Գz)S36IzVn\$Yg$_2q{4]A(9YZ{ϝ_* P4֝ G@sДMd4!uW}A5TRP6U֛ru.7}QeK Fqjdyne4˗:rj92]0:k*h(ڙeOc0z[ߖS`)iOmjxg) J6~#GF IRf1o.Š߀N笁 ˁnW7ǯ/[% tg  VXat|. 3瞪N۽8BSc," rֈP Aبlouƭv ^ f;ƙĻӸN*:}CclqvDgksZSѻ Ӈ&8FEj|j'Tjaq~%mGtZYN2u]4q< =uw壶diAYBK_(ح_*zL؄ M$--3'OS [ (1S2^S\9kpR(*x.l} -jCNNcʚW]z[]^CsKՖ7LDZf  P$)+ /qe&&)B1Irh\9khN()iv{|7wv8hTJ]#GçӤM'0M V+ s&:K6ʚ윱'4d?N:wq)j5gݒhl-F…q)?ݴd 3/wiv NUgS7#.+ vfes/@1P$۵IU;/_Hi:3@Q\ԻzxyQ=6&WB}DASiHRJuɕ J(0Ig7-K"]9k|J'xl S=z,GJ.;#LwޘTvvs] $W`$MGٔ`=Xd>㥑oG0狓 [ ,V?h+t*Rh02ٰ r < L4TwH}k>Qd>==x?9aL"`sԈMuDW}ɋ}xpZ.w* c{TJLQ1>MԤ˭^X?<PGqp4 ]=dM _]輴'AramuLǺJtx"OYK,v|ZwNr2wc{MIP *gJXEYqޠOmPL5Yzߎwl"l<ٸЮUvħ'j-yU.bLcP s[b8M=!,!.5*aWy25e+ʔx} 1c@jk:sHgqH|im^ԏCL[ 9kHzdP!Ǯ<@9mk"EB{V{eVJr~اG6nSrlL=HQ8=ʖl9 Kta.58qGdV9Ӈgcw6ח (<-p2(3)N)VN\$E2-0mJ!_6K^(˃oOQb9F'.L?5xv, S}\5JP.l 80?1 O,L$UQ3e$Acdc8D7rҠ폳&QU[F!3Wuk[#7zWXʳS*TgFAY<7|l+YŹa.F(.tFHp9EM'8;]f, N '͒\*" I$'m͋#桀|i4fI!Q3*'J\j^UUi4@c7GX|ݫc61irK-IJAHWi59>!0t60 k⤡h~"/oxմTuXn)p-6Ⅲ)`U^%XLh xNBGUal3' GpR)}Z=c 9,J2[h̀.חЮI){ISQ&5 (C+Noso)i*sQgPN@)Gl7M^P?$AI8E:<jV*HvcӴ]d,9IX(BgkUWRLrFʩ9ݞ]QlNd_Wϫe6 W,zJRVM`42Yɩǁ2kr/9 z[{I 6FR36MQ6W>>ηW MƳnV/*Vt( w! OԈf7>vS$Yb!9iHrB2~;ZϮ|\ l,djW7>K^ P29u􅎼gNpgN KR3oÚ`rMLMiߛJY҇Ey1GOS(Ax;+%qp HgxNira6<]gPA;Xkcsg>K{#uX ЌPP% $:ޞ u)N4fRTl'ƨZU8 Yְ Z vֆBv޳KG8$ߥ#U4z7|6?:{/.Fl"L?-izyh/v^{Υ8ױYJkM}:1Q>p/xo(8 cc)(*> an/ٰ«@c<5z-dȽ>WjZ]*|1li,5Jyb(hG"ĺ(gtN5r0TQoBJL )զC91^3%E!prݼMˤ:K+=b,i^B:i W^{L7j } ONTް6\a.TNK,ֻ'$,9^ :V6S`,^B<Ib]3>'OX"qik@zgOʍߛi ]7ukS3&|hI^h{1D>6IaSG,2>%,x,\a zޤKR+znn1}:qӧNܬM q=/gŽzcS34' Mt:?ѳ)I)^Y܆֨gL"{6(iͩ(C+um0onLu)!QH"Q9iTkqvn&P?6ngf0pqZ-awJuJu!@Y>jqAGYCc9t7k睍l|mn!sShi1\/BW 9!g*UrTEAgXq椡8@7 KњY]v@z/_eR΅ݺsRHGlٜ]QR(ڹj}5q<4D(glN[! 's_OM6\tAg6>Fd|;u{.uA^ݪ%GVnQE;#L{uȝ I$pJ&__oκ[УD؛_I N#+D6ٿ}y9(:|mjhG^}shMY6Ow%<x#tqLúg`Nr;IԤ %qgpz›mJLhS%(j#Qe#rɚ ͱ=`~$0S} Nb]2{>/s4R)*B~jIEȖYX(8"meU.2{wA#xT9&b9i`6kWi"Z/֡),%.  ^ط* ]5D%Ԥ+Ex074u9eW)8F48uSX u !*gcCpNż69jd +A,ƜLHʺ۶&KMQ3.'KtNXc`LB&΋Xj^MwMWЩj)q}9x[4,ܦۍvq !nt\1RzWWwGX:f"`Dq]4RNU,Q \D4Fa+Ax[XCQ++-N"&=SX&S+Ph}CQILIFc9GK%Gh~}nۦ0cd)R4w k/GpH f|u盘Ge a38 N #aׂd>mw7Uʧ:I}b5;v)NرTcΔ6]Rwܤ%NRS0%GXz%r]/OϿ{s5Ta~u6` qU*%6D:+/*x@#SfT!!9iHȩ*6R@C|%Ul6W _Iᡭr{R.*w ;='J&ʲ^?~d_-K4F%aX8j :ICH>G08?ҡƎ, `956>m=>o4:.Qb%'."j h6X, i]Gț^LtPZS Hkn38-g@)G('<4Bd&M'aASژ4ׁi"c>-etZ)-PlɑKp"izŒRE ^^Qd,E:s̐w L)?Z3~ 7Ȅ?pIlqhJ0ֹB s!UoC^'O0nFK"yqc{ YkIፍpuߎKςJ.tQ@{vr3F(CQɁF^#!ICBZ+C5tU'+wi;`~pxb9(dCM%4 aƧ ru7e»00M6̚U=:{Yjl87}޵IQМ24MЌu֐CX3[Ӷ *!C(^d7=ʏ~4wHʁGCBZ`La5aUToD (ghNU^i->=Z@S36B9 mi+^0׏߀^@GHcGi?NcC$š8i( )\0&/nrgh~~&s (<'D=Qш}F>.ǍYsd,:tPm9nTX ||a7MWCмf9]I[%7,͇*9^L4ãPfm@NgXN akV$,tU)]ۄ/pa8u9Qm5ZZyYFv?n^LgPNZTZ26HXo:n Y)2,c_XKH!.54DO=y| <*GzX øf(NV\!5WЭlTL[6Ӡ6'g3=6hf89Ze0:WS˴zzLZX$+qp4\-Ձ>4KsoK9w Ș|4cYPϫXxajaAb##yBz_߇^+V9{:t)=VV'8S3V X u  %*nd"BlkӰLm/6Κ2]zXMy"jc5hJ}(dF q3^سlH1I#S 2[uKȟ8l_dCܲg'̒^5цR`pJA.J*ꆌgB(b IR",% %`w9Y]UbY r?5Sޡ7v閜tHFΐH''HZӭ$:J2˜Q2crژPk"lʽ9,M~uxIfWR]n(='#!OO"tkUwƳ{v{Uϑ!(F$,?|ж7竛`B6;;%{>Rp!J+vTR;BZc:;.G~]Xu k!Rl(?+r-5MyL| (R&yl#FHуTxaI&|GcIDT%ygiHS5˰KB8vxg2 |g*-,f쐪/P:F ՏAL9cs؄21 >]O)`c cacd'˛4ἶ%3t#IRkQ\١q˛eƨE8rҨmq{[9>j>9Gw0Zlcvo./ML¢h겁P6U9 F#AglNW@"J8^sð++=i7P9w[uP˓;l#@Kj<~n& ]rƒ3@)[#Bԕwa[nV>P^X/>ʓyasgjBo9$ghN81t1Ԏ]=Z#Ζ%zhz":6@-[^ݥ:ч^-Nj#*'f!{CH.-Ml_v;]:ۦhDoFQ  ka-36!=Tmp)ehX~aν[mVu,^`7 뜍^] z¾}/t*orx xa #!i ^PdSߢ;V#~ڦ1»-Tvwc)2Eֲf31k6*Oڛ #Յ'(Sh,6l_W4H]!ų&v}j'`w%Wzc"8-=eJ6!HA(4J%Ge]S"(Mn)hצ^dR I])=*93M0WbDDg>)WI#DQj0f.̋rUW}%|ʺP1sG62$pS2a(H%d]yhW`mE9#s ^99u<<xLh}8}Yo6 I㺋CdG@mǚH7r 3‰:C fsPtM-*? rfyw*9y&:DkhÜ9ipF3Q9= 8VȭMSy{=~^շ~SH&B؃ӣRLJv&OU,QLc9a`)k̳MSݢ]u Nη믽 wY@(k0ZOϹ1;؞ C cq19%̂)|xMN F-ROC \A:;'XsNuih4 T(fLN0 Sk/7x^uͣ( LAk.z?~ BptYDg7Ѩ5Lev~liGGq` u2) jn)|7֘ C#ʫ,6YdQ$ֆxaH9KW1hR~y.8gpNKx;FgK*$֒m|XHxyW> QQ*(/8-&b1K;EcMw4[GhÜ9ipZgJ_݉7)`lVmRѥf:.ﭢCI]%`|Cx*D.@e]ٿp%9{<C t 4%l A^V_bzA)K6M}w_ DѦE)Ap=FXrM%'hu;-vC,*ošy#mC^w3<$ە&E$(%Bb&*_0lIuJ?_JR(8ũ2arZ┍U '`G )oЋNaƥiP4pxsliLʖM0=o"5D 4J-j oZzΗdp8ܼ<ὩOLNP3@' P EL44`L iI4Qe<󦗨_n*d|'chF 2mdy:OzT.&ц9sP*L4l 0oXN4=h \b.BaI~H]qh@ɷ8t)3uC榅OO2bD IC&C^*5]ޗ N_<DŽ:[()>kt`{S7,t&[0wzfp;e~8ɽWe g`N(2MoʻC U>fljmrpbgק%=~jp9= uMJX|t4q#`냺sL):a:i|x|0ײ C7,ZzE. =\68 *D!p O`Qݟ:Α Ts"]3R'Typ _^O8*shG#5}_a^QߕKN>lQ̖0`%SF!^^.H2=EI#Z,Ы' YM7rx^4cF eJ14Wtj 藹9OJ:8@{nl45("#9i`&ULaƥ.4q:JuVAb48>:MwioծܨIq s椱 #@L}[mslY 70Sa}(ǶΛyCδ1I":>(7ё] ${ŤVT9CsTBSo ij(Q^T77;3$x]}LC*ܪOS۾. h ֱȮ(uA9@ ":i$G).vkcŻL(WjMɟ18̔FljΒj;wݏ{c:?E՞a|yFꤑ c҇`tצ. ϡkpٍ!(đ3K|I9 ׉ZS?G=ӶhC9i`P)덤yvI%x2+:կ}oFJyQWybG\))\kV%\JӺpye#a1pIs„2zG#69ic]3<' O萷nct|Uݕz(kLU])ZI-tТ.'U~1@ MXgN!}hG]CZ6?˯hu*2=Qʛc&b3.:H-.2?Bq9i\Fe0;p(t̒{HV{0guN8t5{kle.*a¹7*0*R?Z;;8>T"\%8ǐSG$|M V kN#;Ꟑ_()Ҏ֚E]'{wΞ*eN6L鸋pبg]7!rԈԈȘ@%'D"a^OOFw7f _5t 0=.ɸPj\paəCL.3ϳ>_d@pib_t[|qYU{^=Py#۱{TV%3]mQ'pڮ@Me<7}5w8Dos.HX tBщdPPZk +Og,Gݛrl:?Q4orV&<[UJ+z{fxW),D9as6He"mϹeW|<!n\XB D5J2yЋn#tztb9 'CB1"ZΗ[d?< ٘\%v9ӤN:5!ҡ@S^ˑgEWE\p3ukB:fZV[o/hSاsTtSwEfջ|gV!p ):S7Gճu&nԜgg,H 3$AQR ,QoчϢ= C=A })uyUF44ݞf:"]n,UZq;M_N0zjNKX51t)aۦ7uCf|J%iNWMlpt{ Ixhjǖ/~AI1pR| xa P"}+y+uPdcz^Dטk|g:ku2>5CɈئS,I)m/ )*œ9jlM$llȭ}!RI;ʂ}PXoźQ?պ@I$Jy(6y&{D]"A\9j`C$b 9d {]|?5Ph+N8u:^(IACr4`NB#wQ;H8Ka& 'D>BrpcXvydW}*)\|qtd ί3~N80J8w=$39*ͬ9"F:j"c\ k+_˼װbnvNכMgH۹(y'8JI DZ-6.͹KzxQ@ PQJN}S LGrST e{Oç^:mjtxT7W9a$c1U-A^GW.}_mC ڱOhЮ7ӎo;d=iRQP{fS""^mD r模 Dy?z^9e o^V틗ji~fbpqI-xZmv! qf7ʼnjpQ\9&9jdw$%\(eޯ8\얛jg+O NrHmzyjԬG 2LVuG;XRD Exz":5.y[,j2e=:벁}⑮$\nj~K" 9uz/ZxN<{2] Q-wU5#keB2Ni=!TVTx|KǥK8s#It_<{xx_ йW8wb_Shw|;Ňj.WmOS&s9= *Gc9jt DISM@6~V6nt1qƦ,Mxo z~5&}Ʀu@MRXܑ;Rt^ 5n~ 8+AP,9asD,^ո=^jEgR luTB$V*PipPߊIpךt!Sl v!F~e{@971/OX/el1v6o@ J&p >LMW+=a9 %2G.fM)4 wBækqނFUSԑAik2 N&EH$M7FJN _1J1$C9jd"S4Y0. >˛uP;1Zi>ncn &Miiީ[QW{g{㖨scMHG R䋼 .Ui$T-2Bm_nz"z&]zymEV{JT{gQ)-C. U4 N4؟;E5!N50)ZXK?rNG_9g ؄=2\>`uz_ɟh޲L_ l*;mѯZ@JɷQ)#˛ڡ窀vU9=ׁcE{mY^[P-t&Z܀Ӊ. TLk3:;mgQC`- Onm{'/VG:kmmD^M !&6 TAΟȢ1H%8D:!t ).Ԝf՚ hMDcDq]o1#h!q)4JD51W#yRd,:s(Ts'L\laibK x9ʠ"%MsPM:A7{+P3X| <rBGP:  L1W M0&ϓeGcy8vC0 }-{xC^ݻp*ծ}bdՄR6GM!x|L)u]bc}w>p˖iS d3!4h24Xx BOM(DCO"!29jpjg #6aJ}h٧3`Ys@3Vy*=d̩L^qۮX7i n`}dk%Ml,:tHYύyWpz4 JO6AjZ]) {FdBK]QDsTJNmPH%SթP'nJ )4c :jZh|ޝ;o8\54w_w @,שi(G`fx2;+5MQ?9w'X)' Rs5 Yvժ+gm-kIZHJZOX21h)2M:ѳނsgW&`HdF0 $Dnfї#[pPvv-_ `Bi;n9qM&`sMrʙOE>Y%Or'q*Y.Wt[gݯ0!|˙Z*ѣ5ZhE\Q|+h?fЮF>ނvfQ@'t9Z)Ae]#(!-qkpVk^0N P^IM4N;&H(c"sRߴ"~d2߳bcQ"-\|JMzREZu7D'.V8uB"8wo f4P"m7CJ:4tCR\9j`Mc?J2&("[xF^/uZ2 ;^Fi]KZ:`uR#V{ ic9 (EZ %=T?p'UE٧<;6aȇTvʀ[G:M}! u^iUژt}( ƥ&\Z5|񇀗9Kn"r@(H\y*nfP`H6>C+ͻEӋO.ˏ{sB xꨁjRn),Fg^޽%Y[;<0p#9$_!!eّ5ϔpR''3%O鑒DSYǃ>,Ӕv)8`:jid6pb^5uJICY,"fsp~->(-{ M@I0Xfi7t\68)51o1^c̹"So: br~^75׭Ӣ#[]'il6;afA #PCFD,AmIh)Rx߼VMmw9K4-I`hҍ ;Y3 dYHm|t}4d?O 0'lE Zzh]K?E-u0oX-bW{͵bB}imp05BsWg ^&3A:0 5O85N-}Ul0^ŞҖ>X2YV]>ϚTp(Y:Ri Qg4#xX pBQ $PĤK5^Vr;bW`~ڴjp@iRLT )Q޿,J,7;sڄQ##"C|ЌǟE)hh\bgcv/gE\tfɻ[QkpK&H(G͊<):uf&t!Tb8pB樑 i ò|Y80yTdFo*vbDǃL1!OHhu.`c4n _ph'#H k\-7U,agߐ|#DiX4i ;ʧ;74Q鄸XQS 8wAy;)O:%hv.}1e-pZ辮A{ͮEnaӥ) ۼ5£רM>vh'lHiq&bn&KX׽Z⇲XLb5I[`2b:V-eJ?L..ʒO '`Y⋎LЦXl޵ql_)`0AuzKHԖxD:G}j݊|Ďk_^Ǜ]!1՝`6΋fM:'8epz 1S&턂:숊ܱx5oM8$Q9ipgju)]~(W)]5ՠI߼=xjgZa'hlzިmA^n@2s󧃴kb87rҰĥ7ȳKPcK^t.#pŒI,r.=#.&AL]09è9#s5)_"tU zgdJr|^-k->(a]tUdt y)G)$yKTluD1*AȜ42q4p"tNXfW[,5VG'f;=h L6CL A`4q bǘ]SOݻF1{8-Jmb47&=-4}p6AӹDmSMYqδ^hyɸ,N&iJ`":t͏KL1_G4DBlh#ٵA"V-D+K ʹUĜ{Ag`NqZ+%OSTV 6M /,RDГv_-`I`'l@ &PmeLId?Lo${T%4!:ih  w5  ΡȕEb|O ءM?5% d?ōvKB0ghN饳*ldu2ڄ;nBQv|nB5>5`dvʯ("4!,AȜ42aU4S)}eˇ24M&6kɮ"wєMy=FL>1"%{w[SsS ƧGg\Nq=w~|+6]zūͣxZ9[k:Y&%M/LLP-$lWՔg9%SDU~oaZ9 I ɕ둭,f}$qVr_hUlf 'C^V! 3]%O.;P4 oGIWX%m$VF̃ؼ8Z$7ݖƦTmTH#)p.8s32'L W I&WvuN:#-7pn4 Sq `^Uezuo5CIG9CsЄrSVf^~kQJY~YE/P,)k q4:aih,kt@?1&'u&-v*#~ =22=b߷oq[5֞G޳#7my5Ψ@9.4:q]S$uG_n펚mrh{"Sj~_>bŇ:JJ 7,XQ0<(ƧmťpDߌI7E>(\ϟR! = ?e I,wۊ>0L?G%ԨϹ7,)a9iX(TޘTs- PrfNgUWG,9Af4pF$[at!řS+ȑoӻ=]F' Np3@' PE+rWc`| }}u!~aj Y^'CXR Xg4hAIui7@ЭI#WF1?-N%IUi'UNloRr> T\?f*T+}tOꊔ9} b =>1f.d>v${WG(π4`=6DÀowyjDYaj9([fےVzyʮ$H U**{Y"|dYb%F'.b!-z[l?BʄBcC{JɈ`$w/pD!F֢e5C⸹ M1$ IH2L/m#N70RhCE "{Z~S61`}Gy}4P0C(%P MP3:N룐""v_.w'D]/%Ao*OoԑI͑Twú )74rQ^rK#, iڔa9iXJsnό"h,gL>D?m#$O>)E+}xH_2R ҐHs Mf@N F)Og-4ݭ 4bj<4z4}c3Nj>AQvhBO 6'oGx)^ֈکTqIe KH;TjvVxgN ^TkA북~E!PŻn)=oklMbN^?@"dxw骤^ˑHCi%r38' N y(>}[}ŧOCsHuym$՟E670NYԶ?f>$ɱ)#fԢ٪!=ٞJ%N7Z\;X_u ʋ7$'> CrIXH,tl{I?9'|9?eGPɩT^frτLm[yY`5# CťNK9lƞ`;->?_^_ \O+<+zloE˖S!԰Y+GǾ?tΑL١ LrÞ:i(JX\+]+yyՈk8{JO2.{U-8ĉA=aF^-%59F/QD@l9il:Ħ:婫\=]BC|N֩-轀3m'KM̈́$hM tOd aJshgN;ŕB50qi8wsMC Ob%&{ uR uXI2>tWg8gpN4Fn~S3UjV(/5㟐$3E&D0:Qr3'i=>|.P랧Bθ4.#Iӊw0,ݑV%P_'xٿ &.Xb8*ΐ\474gxʽ`)y0Z'&r3@ RѦ)>mo֨MKOg+T:KL_uM~Oɔ:dpMZg 7#SScy@\0(*QМ44aYS)COkxϟXu"3x)NWKC/xKUzNJl Fu‹" ID)cʊΟ9.ˠSKq,@ 0DЮK)aE}"֙ y "{(9o~APgxN'e* ϔtc F!yJMྃQH- >O]M*K b 1'+F=8|K%aVO:sc I ,vӶ{7j|8]Ww*$~Zg!!:k$n%L,ҤYa%:n ڲa]U%ƫE:i]8jPI6F6a;Z=lzZĪ&S-ұmQ1TN5xc"NאдQ i!8CHHd\o}TQcȩWgR|0q:3 Es`)QjJN>8h = tġ1a"#`gNwƟݎϮymJijk{K|Ի] M=BzY;KȐ*ˁD0/gL=9͐4$#B([hcf~}vxUXׁ48x$Ȅ{ ehj]eiv$}G] z$Փy?˄; !>E紦=%2eӋ̃gW>IwN  IR&Pʪš[mϐg8WVIh~+q ]Im*Cyb*U1j-\J0yŧIcTFxn^Kt8x_V6e:>Α>wPK$=AR_c,#CFcK;AO8^w ތIR#*Ky:2vڮCy#jYzt #yǜxUSR#dYF+cF tr?y^Q<#uHRzncB ^^_._).kqmV?V'U/ bz#{n8GVFQK:iZj4BfnvPA2OJHߪkȧCך޵4Gdݿѡ|g.Ӏ&z)jqPU_}JU%4\יq9z[uofI I%IaR6}<Ūi7H#on9*쑤^k2]OMm zx ԾBzSU0ҳr ),Et{Q fF1.(NjuT=%2eB)3rP%4F=bTG 6Tm7].WwC&h-,mj{)#³Wxg-'[t:{v:ā t #it!MKy\]!jU}|z7Ky9u v?! ,pTNFAogO3|]훠ތ2F)cd cm3Z'V*% j?ԏ.:nqP pTeyQS 6N,kłySQ D`Lc9]`O 31W+[덅,T/ŕKWOXЩ#"XtEŏ8uѲ{!c{ &?cX\М64qYxTfZ(\jYl]0Æ뮁[%zŎw@LzVM%0D"xtQBB gtNVrASeA][8[R zs?59mHpXy@P*˳&i.\D5cpiDxa{&gT۲widm=~]_Vtd}6]owQQɉ^׽_BOQD''n\(Ie]7ɾw~v6*qv$shh-ٖcq gG7^uEǘbcdC!h柬U o!i ЯCYxY,]OΕv;?b0z:5b"'ݔ6WtTG(VqgDuF#7|"qHiQ GH"ZТT"/T)g3bO'V IBJ#9F*./u 3N_ )J#TQ]#9 wp{Y: &|3 GI?g-LORQМ44-B3.@| 'oz'-K$=PZa@e N!eS2F2FUȠ<.3u!Vt.?# I!,}z_qbRY5 oHRi/8|54ʉ(Bwbj<>mgދ8MlHgxNRZiv&M7| ( '~ۦ9B"!3)eBHz֋6mkR_PgN1xoᎢ6>uLykř7j'if\n/;՗ԱK4gN9tTZ@*-x> l>(,?&//FMx̠>ըU}{7-'GaܻI#[uawd@qax<4 !w#B{%.>z} 4"xn8%a6M a8tGtnkτ@v#8>!=KNxlD+'AȜ42-!3rT'W$6ŇOAoEǬ^{)O YQ+An0q*4Pu[Ljm)i~Lٷk/xg.mX;x5MdfQ޴Eh; *gQP9idzBf_zV5tU_4@7:ۭڝ:3bȏ FB&1i}X{kqMnI.'F&8F'.~R'X}vS)@ C9J:>"H1=[=b?FYnt^;t O 鿫Sh&9Bz,{w'M$i OT0xMSjJx ħ<D:KW09cs԰ 6cõzeʯٮWiBFJִI *]ҤTprL)ц_ ?AQ гpāCQN3D' QXideMa})UϚjyn O Ns>]Dzr ;( _kPT9i`Zf /K@(WHKoʧfąh]KLzFE iuk<& Du0Iqt:i¢H"\qIݯu, %Ur$-^͎5=y< xTݿNRy]}L?1um<X@$2ca=a-v-TpGѯ-KQ30' L4 ,~Ibً7dq1ef@dD; ha Rcs2oPcw(NW9oirXbI##BZvuۆ q-"sG{[,rjהM0׼vGR[.4ƴn>{uM`36'Mཉ@\><)Q\6Ǖ ވ/Uа_gRty:`վ5ׁL N$p4GqtݝST"9s3>xV~G $)xYj'h|"qN((T|W'̂ bR AAcffHN=.HK㢔}V;n ~NZ_Q7S#Yg#Q|I7Eڄ&Hy¦1ӋLq4:qjIK畟 w)pS ug\99s,Wd8|A#N}hDMJC I?ACV-uӔkT[~vLlM&dNOԣq~(N zቱġ6W{^ٙa̦Um\"G:sMPzQSߌM w6ky¯7yʄ8Ȗ)+)G۫Sp ICB1 #͆ [>;b8>&3iA!"i|G.NAptX=yj# qJ L@gxNJ"ŽYwuYۈ5T͠ ,UCLꋜђ@SF>2^~UFf!Σ%!jNopQoc!:i:hH-xr| ج7@gt,-gx=isܺG1\RpBtsN5ǒh}9h9i|ŽȪBmBQ[ ħTy?Nw@tHN/]sVO*iqy$(e@PzLvl6cxRj 2l-o{W-<K E<-0e냫!W* -~Ey%p=ք Mzl'2*S#$Eq$9 W 0:stK"B^7B]:c ,Mlgǽo$h@o Q֔-:0glN0k]`[tu|, fywQo[[p΄=) 6ȳhaAHlb9&  o)tȖ_.D6KKMrвA(E~.0xBd!6VwGX,8XN044<5+mTܻ!Au:|UމiESo6:-rYP#VOݺg-*܆l444 cg'tX:bH VFȑ4>aedԑW\?% nkq:j[M_BIǞ!Ml6By|D#sLZ~ IG.80X6ߘNwA#LciT{|lnz% t;nYDH+:ǡUmFޞ} '0gtN3rvHXRR_^-'=P|T{ (/cl) ml6pmPdN=~I'9&|z}ދ]z}mx?˿Qj򰓆IVvؙۅgӣ(u>לw.^?P:' 9)]]oF+ an`%+R6F%F3^&oAr}X[SSPl3'GB;X\`YXW0Iu^o aLrׯ#0-9EV}C6: MݽpRBs.tK$%wI_s^wyÞ15'Yg&O|559&A#sPgxNiOGgu;R:sQ-fX]\ Ь7w w(No5Cdj1}CWr<ԑ:sԣ@ n~y>\K2wn47YBZoeM\d`MmW'VdL8?AyFꤑhdS_\o"T߱i]Vm)vH8deA xF95)XW@C ICC0}X?fG҈ r !HzARPewX2jgұ$qy fL`30 ["5?W) 2M:#R2".ہY/MWy moUS5[tDk J+y$Dml% T #nݝG/Cv4X4VaeM8.-/zӦKBJKBF'үrȚ*nNJN*]`ہ'2j6[xLнQ/iBm3B'Py륔 0ns* \_l((cʤy9wRk T$uv]FY@7݄2Yx9i 6F1 p!iVd[B{:9eSQy4ޓ.Fg@t'-r϶KZ4][ƕNEƴ^?ʘNԣybl[cK ٟ6OmVcJo(:48a7)Q0x Ό< ʩhc:i*Bj ӷ|Ynaߘה[q,'?8554d+!yI\9,zG0ghN5H3M$˗=ZHm8uxyY6HK?ܩFf9$~_JJܩ]5N9ԩ*yBI6Ƨ!|gTW5YV;tSA{Z:"tq󲽯݉ҡazjƜCAP4AŻXqI%!kn\^-)QgN 4%_6 }(W )Nnksy :k6TQ%?:fQaľ.I6&U6)ݕ>r{ J~Z2z*3%Ї-CQ;\Gz%ypC:ʔf G5HsMJp30' L'`c4Pς^cd,zvL/ꀈUHcό^P`Ü9ilfrRh[s+*oPh4u#z;LY(q R){i ɕ]ʂfG{ ĚQ s椱hb*2T-L`^8#.ke)>6x yҮBʱKMEa'gyyEp6qxP,t{3UYC%j]]>/x.8ۤO_&J 2FYK^~az0"i"\G9(l֓܋_; SNLM^c^zbR$BLbe ʖdq`r {ġ mKR#˳|/ vCXxWX5ۦEtå\iA4V,uQÎwniPhonyԆxR<"8rҸtn/_*ýR*)QcU?{ДiŸN?:nBy%L׹Ҍ̨ _j|(0C:i®'jel Hu6a` iħ8d}5Y gCԖ#Q5, 4c`*8ޞ:~FmT9i`Aպij(w> Lm9\QW߆5Ti h4Q-muܡZ쟲:8WyB?*a(s|Q:i&(AZ"q|#Tu-Ox}c+[nY"4+Dǣ#Ϛ"{ 6Cͨ2*et>z^@'Cy2=cPR>)[32{j1w9{[sEO/^&~q]#禢8crҘIj2U<,˼5O\~zȓosD yŽsBM~Tj484ڳh#q9i\'ZmYv8h^yzu:X %.S c\C<өv+z[#_BwrC5 y]iAtg -ݛSg?K8{`I׌IcW@ =cn=%IөXzm~aك8shJ|ghd2TTQ&'gN ʂPJqPߥה!!H\oow t^-IX} l)qrEOgM^qxl4`O ! oF;(-d);#-,H]XoߦLNh`w2#\ca 2,çSبW IW?t&5/} rSyreU~Umv/S]O 9c/NgB/~ᴷ^AMrpD~m902-hCCUG uGG2F -/_!w9#8[]'HԥTTGWg`{IgB!:i:qRSoțP8lʭjy].] ):œ%jƩ8eC{0zghXw.ڸgV"7rҨJc8 0IWF2%YsWyP6~]2>n_rӂx.0dl(YV!=a׳yn\~\;'s1*/׫}f|wӱV6p}C EIGJqPgN1iYk~ $BV(v#Paj>4.vuGDDvNO\(s:%S{HQlE&8Se k_qLM;\HR+>e7C-Q8g,9Hq ZΣ Ca$BspHן:m&Gh+Ǧ޼K*_^й'J?=j'T-\Г9)T&r3H' RYCƿO W5d*rBI/^^PE)+)wFwS]*_7.f"F֙HAМ44q[BQ8 wgߗAx̛&C AUz6;g>&bI)4oG*Oܐ OaМ44qYSI~y!e$TͳNi>&C|`+U5fJͦԅ.5/Ǯ6;?o;TƈD ID,Ia,WupGTo[>#>K4(#P(%Kh:Vs0$AΠ4(q/ R5 m3 ugSjЛ5H;Eu5(2Xz%q#$Goђ:]ɩÜ9idn(vꐑX u cϺZ2]RnFvC .(.Bj[]nF/'^(ɷĐ}l$oDK=j5 v?/EI*`vڗׂys@R;(>Aqnn%27/AJNL!P4_)Js~}b$9Cz(DǷD'CIP٧nhCXTA:ۭ*kȴkEN탶Bh>CۀDq欁) 9 _ ؿG̓ ƞ˪yzh3<54D|6WqBA ҶTh#ϖg|+KP 0g LX%$pC5ڡs3NMؠP"Nrq$R4=ZiN^CY@RJfyVo6R6|yA̲ˏu}U߹Egd*Ğ2VBS+:Oa'Hro>4=2V!zzq/AmߥeGg_e^A$LfGk|aIzM ]D>,sH\9kd¦H¥kR SB+u#̺i-zHNz2kxq#ΏWw~Ĝ`y󈑤sH"Ǹ stLGM =W)^"4mPA\m^|0`.R<=%vu[0P􈲜AȆbm Hg R) K-;](GRsO+} [5N ElNt=͏||+JҴoƴG}=)]=8Zr ;f-9]V-oMC qRt +OxαԼ0dx%3:gHӦD%O_jPpb]9k|FħF )w7PJw09Yu>FukuzNlhi`/9 E5"HWt4!z9HKwᮡٖ'8[B~C\nl|{g,:`YSNU`IQ{qєOZs*3#X J3 W0 >V4VNT5ͷ ONej\|XE`i =`OJŹt-!8ݖ8(4&%7]9 L6Q/hlu/eQ'8-S6-%c_52q r次["gL(J_kwī\Al>o@qEw)Y c%b_!W49;'FNwE}$8%\(L` yYщ/4['0@~K}_;U]9|#sRo{ql}Dhd(8F*@eK8sW̠ ZGqqom'J2:}ʜҰIםLq"pZhYCF#@ؤ:}ԝRPQyY6ʦeOM҇n)N)zSsԆ9?`u;V:)(A1.5.qGRqGy]m W_I?etJMXvCuhH1eɄaOdSfg}zO8X')"] 8g N%ޔ0:=~]4Sw| 9\fXSNy(cDWG?u}5=ӓ56F*n*Ro}u ΟrҲo|j&m ~~|-G* |xIϞ@#"9ND/sF%.TOpgSeYooQpBk N"1iScʳDެSjNIp .gK; ֗5|ؤ"՝fz6D183,uz Grcl<){ er~(#rt &gIt(Kã6ʉUY=ԦL [źx=]i857}%L$e.(,4̔sݦ.ZDH>l6ruٹoփ6Ra² '8}$، tuC[9k@/\ʉ/Vx/4>כaL@I_G~a t{t#Y:ʒ,=CHf$ئFm3OyZb3F'lNz?hkBq,u^)M+8Z_TH"}0VRSmBi76:A.5Fa=F-SnA0PUOm7!O}=^sbIz5dbM(E2'u@@an+yV6DvHʏ ƣܦ NP @g PO5)hru͆ D}[cWCJ9ejө q{2TY5 P `>XHW_m4rKq-AD$cHoH$H4HeXq"7a5^e1jYEp Ђ|V񏽃ѩfQ8*Ym89\?c@_Yz"Vi{,q$8z\!\`9gX\$Aަ $=j:M-5~6eSv5"EN=C9NOr,oWD26Fn7(:.5DqgCt?70,\[Q &8ij5x"F,:#-n1O=GKQ54AMh!4D?=Hq6(,L!C HwNGhC!^c9!nZ|k~*Qr|LߓOWHoYz:ףMʟGMլozLOZq .gKT!X|-I=_ CX~|[g)SDD("5S5m5#u$ܮq)o%(ןu7D$Y .I~`&>}WvJ)m?:w9]M.5hųGhIㄽCDY"H|]vQ F+n?M frou {ΣjA]+$bFRl]9kt:Dgl0(l` 'J6H'~?%]JÚ4:KRĤd`/;]ΞGp$@7^Q-[6akdn_S̷ XE)ʞ|TOf`j.`1aZ~FY:B~\>zƈ߂9c2I)mQgkLy@s`g5-C}|y)6?Z2Mk~޿?yGtNe'E&z.05L%4=j< x #d*xVĉO1[o<Vy6A{> th Ǧ:4ĀǷr֠UEw_ݗ_YsW}!obMAi6us&h4Y޴Cz?(:}|_D tAщ #W~$)Qeӭ+W>x߬S57l6 Xy xNZv#r SJ)oJn+^_ޥdzȾ|Qnj]R&EA;! a^ Hg R HvTk/q2 w( L'񲪛jptyh#]iIT}`Dg=wڃCingz<s蔈TJ\EK&ۡd3x!bLدްBsx/2} i~Rz[և@dJ^\_8aH:jjD'&z.(5JaM*(-:)2) ?1e8PYx޶Lnwn.@[u&o?Cttti9DY#S#2N)m{jk|$m#@4ldʀ#ݪƌDŽc}(t;R#8$셬n:}$R=R%Lg9QI(Io2K. v1ܫ{Ô/vΒ4zjDaY":uhݞ1)SI jq]ec-6AX6ۛDNȒLTV>T\,-Aנ0BzAWTCkf8= ~J.T_**.Xécp>G酐Dpa 'N錬 r"9eDX Mdv͸WQ'}@S`Jup:ͧj^qfLqx;Ηg/8O ~yA.Ȝ32%쀜2 mdٿR@;`}W=ZvbcņGZH\QZO$;'@`f$cIW}r~{N? dJoK$̋ꦬo.}{&n7HNo9kǷ:cAA&U~^l"@ZS2!8.ŗm96>z.7$ES]7JuB Tt]}~J9V'W&%@xrJkUz ήΈ?.D8%:'tCKSpx$YR35MER]:k.9Y m+d f>rG( 9g/J> 3QZ\LT;Dqs XmP &m` g GpL)S~c>wp7 ډl/HGӣUsIl˔3HҜyVb:'0mϹ3N5)]]("цsVaUvVܪ?̅f*:;**O_d`ŎKL6l%Zfۭ+Gt.503HC2\0|X LZu3E$3ч@jߡEc3R eǰQDYA.*#MVԅLR܋op#aUS[tW>Yھ++8qң]F3=IԊc<7gBH[9kD(:s|G}[ ;$P2!`*>4mz5mUOz :B<5 j;,$ Ҝ\K MP 6gM\EK]|LvO@T!~+{܏4?b(><=MQfrtpxLpS1Z2S0}zD؄6j^9S.("?RHCהBٔR/ %5,\XBb^Xz<'\3C|{60jܢ;,FcY@^OhPJ: e"/RL(~!('I;.0 CM$t'jl|NJ5E%$j?%Bt\ 8HoM[xT> sE<\{_ZZ9&P Ro#)ʬRI nutͺOtS=sjkGs'YOP9 uc$F%8&|jVB㋯\\ޗ;!\’R7zL_@-ߵQo3o A&5A* Cvz%weo<jW)4цtՐmwS\I%>wx}.Y.Kud,w DtvlצƝgq4@)YC!D)^yuzUJ@AzSO10눽wc[ XoU͟E^rOxtjZ`~(51wڙf.dm_$a3z_ }da%\2 uSp$ߙ\ !x toDt PXH|b6J]UtQZbHKclۑ63*ksc$57Yxӷ]QFL徻"3&0gDx_q C϶:G\lV)=N0/MY̺͔9WQIUf>ƨ3h~ĆL9YAi26:A.3@5lBJ (l]]pq[srFu^8d GPl gGxL'3 }3]j)ަ԰/n~ܽu{<˷6Y*ŌHg:ϵTY{Տ:dz1#r| ,g K ,>U\?oyTTӸ~ d %vwֲ:4S[ہN 2QCSoW&Jq>R@4BRn1*فLa o1 ;C ty}_$,Lʘ72|hbF2wy\Q(] q2`,CG3};G&X ^[px~~|hG]ojJ!`' #i ydt˿#υ[v42s sP,Y3v{zN|Ljk y[p g&zR˶I'tjǞS4Yxnf֚(d yfO[ߥkp1B@:eʢyL9I r뀣,kSBteGe\9kp.;i "zPݦ̣{M߷-:3TEyFhW䤖H?ǑCS , &UE'('7&q:TwdL*UoSykF-?/J2!BuyUݺR3{ly|]Rv͉%6sF%P7nmـ&M\0:2j\N! h쏓8I{ qs {Y[Sv߸`sąP4pi~.9rɩfWLIekFͺ,l׬{l+2AjA{#:}fHO`qA欑;k0ՐUؤ=I?^GMB@;2~1)Z2ljSuiGי0?Tp<[9kD*(Ѕ]Vk"iB|u V+oRuKW@A&_+;:1LyQs JamTP*zщY#D15$ ,kZC7KY@*Ajכz=O\5߿OiVJ>!)s(*޳aHc1ayH+#Jp 4g MLH0Bz7C⼬oadҏ]򆬞Kj&~#WL?&čaRi fIԦ,LYW )ؔ.gK)~}69,a.o"*wuLoCٚy!4EGHf.!ŷrָ,+ W饆Ku}_qZשWz+4ʛ. ޕ5`maP)r;&ه~Ǎ2N1CZcxc]9kx>(R.*ffKgj6z-S/,$ʙufcpBN;Q?O^i,N^ NgSX EWWk2Xx'j7;E ˖nC3D_i1A%&8sƦPVa&5|o6D@ 4כj= ߫E7[͘Wdg[ZeiҙZ$pǓΩ SB] :kJh!J `AD]f@y_29RZvT/Bᙒrn O2/GsTSŸ sTL RO*6ks r0ݧ|pHL_vF]ktNIΠ0ȩYp` t(+ >u;H Й:fPqQs,s>l$f\-1NBiJܳǀl|58ד 6Jp 4g ME[8G UJd LCƋKacMz g-a.=[8;ɼ,WCi,YCC14Sr`]ut"8n-(:0ޭ߬;m_Xs`QoUꆁ .C=㴩GTb{(pPB\`9kXJxaԵ=kȥ$ΫU}3꠾wnMbFq%N8-o5i"=20&hW=~[Grְ˔.0zנ-*k#0}Vq{T7e/l?_zٳz eg }AM=}ԇ-3d3*%8tMꁼB:5龿[!J w(^ՏwW]l >>3˂ Lqɍ%:8cP r次*ynS_W%M[QZH].DWKH+ͥDa>{K}: ~Gst3=D-n-\]~AuZ\t_#6ߤ,/r=dA\] uoQyrs #YR"* \]Dw=KTg?D5N1W3,3bShm('PPr欱F ,‰dט ώqٞXNԘ攎m(:.5D B4LEBeԊoVX;^&(KVdjul`"F R)R@'5Yx"p:qN_`7LYLmdNOK,NAOf #C_e w?|nZ߳$*65#Wa.Ε4X@ M&__`RFz.4<©Oťis3ս&I&0o*ϗ2R4'hA^<(0Fs3r \۬A^{yt< KoyuSМs\1/7:)%JO5j:Ok)/kKx\cm BgPכ|S N:A)ŧA&SaI;hH_c;pjy@uJ8 YcG1heJL?SkJekмL(,)-RYSH3{GE2jۇc548Q~~<58_%.RƉL<ݗNZ>mo,9?n-cƔ&1H%⍆fL)']ԡS`]9ktH"0GO;h y6Z->Vk2mɛ7,o GϹcSf6&դpB\\9khZ6P؉_).a4Xe&L"[PUsf5g}\$ȘrLOcxX DfHp&AI&"~(^mV;p1k:[x:+jzSQ(I/ c=#0ۡRD/GiD.bſH|E{Lyklr|8|[5 MX\gɭ!' vI9O8W?%^ Xg ր`A)d}N?W-ς7NMWא.ַ5Ґӳ]Ohd Vب aRE tA "],E q.kG U Տr=ܸÑMYgg:;Lf/UKg8*q4yyyErθ !J)n~&:~^xZcȔ!iP=+>ې ٨MƧI,ub4]oN\Cdu1 ;"郳i&6Orys_ 6OY3_pu{0C ڳ5.ZK͵ysؽO}cς@H}Ld]BV9ESYX>-o&"3e:}Ivl[A;[u}s(F7RgƣXjb+5.,.5:5ӄ"8,WynG,RcSmyG׶FIڪKjʍb켍.F&n0mL"fq_;+Hn mc efުbs tu9'nR3W06u0 Lw߈zss'R:I2}"y'O:u뷍Wޢ Z#w#j1iȽu@őoJ %ȈAPoES>֣KYޚ8 NH^[@%NSk|G3OZ x^8x:fn*"/7UjuūMD:lJݖnH3Rm!I"H.5F#9F(T>}&禮0 $pP~ Ge@RA|Sx|PNb-9b^ |1N &v]`:kH)a ŷ[ToܐS94ߧY@ͷf΃O4.V"xrnfǽrθyqW~GcrO'JO .oʛy>w֮0Mdco'\̄]|a.'l߫ nw;#eJ{s?<_:W)}ӯ;X9>ܨRySǂ"YS!85x+x>ƼL6+(:izr,w\:l~/ݣ {&y9Xk=Q.O]Lc\9k`HBIvVh5ܶ;_xm ?ѻ5F6DwMds.@UDp=A*GA $=^4Ԙ=@90t 5R)-:qS%)ucxi|]4~ "R7~w+w cnÚ`pi(-5 -RWA}BôY^gE#a`i-ԛǁtym=gؐ$ɴ,0R4s'CN.(!0Cz"B_0/ǜ:І7UyptȟRaqQjC^n|mGu\$2A9.;vWJgڎ͐}ETO`*v X@l'g<g& v́YwDNTJ N >R|[o){RC/=w :^& 4Vrvs 8Ic)Kp R{̋|T;DITWq|UuK~ ԯXSĨÈӰ+MBq9?(@Lc-%83' *Hmv{ #sDo _ݕ?W$y`/= Ć~PXT)+y3cg:{6L;(qT\p9k\;k i/V`~զ߲r `AyLϋQn)v%Mkׁ}(G39>rE o]\;!9I;:;"] Dg QiZ"l7'(iśf+rkygv7%w*Gvxߐ7j|{=Xis5G$(FCT`»lxSónӗcGS"ZwEkrSdbmS٩|Q:͕LIp .gKX1k}ݴt׍M}6n3~{x(ﱼSv-%b~RusY}ˍ4`Ju2qC)rȚ"-_dʽ+D!\!r,64.TXҩ?Me<0:Β  H`Qzmy 2Now@B{G)^s]o>c]VZ>fLiR6 &]GgSLnydy&H92@t@6Q68%gtpWO F;po~sjP]bI9[t>N?2R0e~WU94A.5<%3Nz/ax庼|@| 4%F܈0*SW{s_8uI#WXp)>?mi"&H|Jh Gူ>=.d&;n,}2MS0T/M3ӽ&]`(7[](\Stf0'ùqxƃ u M섻t8Ր,,惿>5_IxC礫ꖩ(CBI]`ݥ0 }̊1 Gt-5( 2Bz[bvF_JfW]i { Jo(>yZo9MWCT >ч@sд͠A5Un[@%ָG=`ǻz[ݕ}~LO{M7V!ۦ{1iɭ3߂ܷ+ٛǏIzx9ƧC|"u$MS~!7C (q_My_ߌ҇=IٲbEer/y;tFSL&RYPA/`5XaO( F/v鬩pჴ$ =-o ^ѩbRNWKٺ!qOՠÜN1,Q.М54BJ눓Tees-׎>4ufʿKjN]@Ve$nBI_;X57xoc~n[hʭ4 r*0cs5O6OnL\9kp&)o NKg]}4 %ph.x̝qv48@yr BM 'bbP\9kd2"Xtė^1zřrfGzϷ/ 7h 8\oy3 q"o-1U~hM 6M&)ić%o_q$"jGޕaȪL'5GްyXk)0XN.)2хtuP_H9msoCj鯴iGzhгKnޕAuf*?wzASgjTH($Erָ|Pml#?Ň"M:CWPo9kLTҘ.kB`F.2dιd:&XF2Xp;5(LtmGEz:Cz#IItA 1C#xPP FgQ$٭A`J74|[ыp<64%`ɔdc@DV&GW3`&5u'tJ}Y. 3H .RNYr\tIoH_c^)M&{#-2*]%t,4vώ_.5,qe}T`ۚԀ׷H#*(VZqޮ)ߴ6[kd鸓ݨ4f5O&<؉rPHM?ܥч{U8Q!CD=="6ŧeO Ę"?'hGG:$8녉„QYWDA{_`Am{8/hyԟ??Էyi=xr?xFk#>*}>K@{#zS >)2.57 Mj֢<yۮt'ke<2> #Kp :gN\EsA_D&赇KXq6.zڜE&s= C"ʜp愫ara(}s9zrX\9k`' Gf 7w^ }PT7 |_68kkePCDc$ ݾ&ϼE}#tTl)H8 0(@sЄE* OMCg^iI,C\ ~}LmOSUMhF'(tdƾ{'7cSZ` =*M S'sB^:kFj#zMks qfqxU67zi||4_zJ|w:;%QM<7q{NA z׸B9zȫ %Ruo @NG΃0"p*6f1uM H9M/M/96.5B%"4R3+$ 5]"{Lv]H}`۞6s |sDy""݈]'8(l<ڋWV\ %nJgay- STlO X @PxKi 'wO0)0t RC4pl5!"Htѧ/ei+Yز^p䜹$i -½IHDXFU@Y,!8q4.?-n)'ؽr%6bͨ4f-6=͢?3/4Tщ I!Lu G ({Sa-;V]jz\wngNA,A4]amoNR)LR4b>/EA7ԎmD IwIƸM-$EPV`S5ο;!Zlα@B4P _F/٠AyȚ?u~T_tJ$  ICwJJ_@i nS|fzN\Տh/R_+Uqth>\sAj}c0ru\Dx꤁ ROX#|~#O#k5qdO#o"a@Uh]r#t&Wl}KWLP38 N%P{buSD"s#G%.)b[:L6XNԠ8rҰ}EpyqjasY/SIq٧eshk@ Fg"pȔä- O9zAta $Gpt3$' Iym jx~Ge>2mXmDwl֝ ~#"[˼ON7ʘ<'^i"!cIFA`,_|T(=`{ɕwкfmNRFu؟ٟ8=؟^äcp5:|wO1D D(4JquL8TWf[VZK0H[I0xGtoش)LH{7!s3<' Og:WZ)(b1F^Sli=#3`kCV=`m)*ц9stNS3͆Mj93^78:J:u1)Sm Kr@ )yOOmUtg20ٓ#Ugc8bbe}|)Kڷ8bD&gN JiS:M_T6}?kiJ?qz/vӋmsS.Zz]ǟӞxĤRFiT>#NĚ(=Wr":iJBw9UY,x.z>/T@k̓j2#{|>uCu ^_66 I#GAy`T-ִj'N9).f :iSI nToZ#^Wy{'PE.Cht $ѥzdoe}#nݣ ߚʾ\o-R%}nr{/`Dv9O e 4BG+N;:-1ES'E%r3<' O6Rj`ai+W!&HſMBj+$U҇N'b:#|jm.?X,:5v9F',BHUCnyx}0{TP~Kq54Ļ41[x&,KQiܔhPcS$yr79w'gA!ΰ4,2J=/SNrxƑa I_|]…`28Bŕg$ՎρBIvE!&(HgnVKt(|ٔ鷅o:dLG gN][W9ϊ4Xi#"4'X*%@gxN2N%.M̥Q|x.Je{2IwFc=s֙JY6ܟ#:Gn vev)J40aO {L$Gx'HIfY;)XCn ᢡ"N>6Op<%c)3OR1ߔxߤn͏g0*qC<ȫf^?p Kl9Z_zX-GvrLXr8ȰjO/IW8rҸPLݹOiݗjjz^.Y싎2 F  h # WfhNɌi6AQKЁw9W4-.=5[bWwJ|^AE f:|6.ӷVK1;ư S.IщrԈϔdjW|ޠ%<\L7¢Kç^J[/eY)OCDkߠc?QDs hB^kP.*] /ޗUS>ַf#^L85lŀFDVX^[#IH囏!65y1y&u7)$q,->%9Q 5";Źӣ]LwqجN9q)'k`Tr椱YY@j;Rg8ш.@g0e5:Kuqw)|j`b KYW@7Z!z,5_nUcdz&( ͈4"q3Tz^8=Ͷ뉢2=|&wAtF{;vQ:&N~ơ<BYo9 P]3NӈMH)v!>"vP7u+eM} S )Ӱ%r;ɹ v rJF%8F&BtJZpq*Utڌ (7TnV$CKo.y,eTEI'rW7JۭhC:i((M{5[i/>V(бH:\ARZ JY@3$՛/Q&7_H YPp3 ' H/z )]r|_+lp!*ǐ<_`/87Sus 맔s 9[*E]WY员I7/9#s4LeM sPuSfʇNjY.VP'tP593B]kOW5q7asduFj 2^>9cLg,Xac8zTn@FH E>r0 eoa8VҘʇ:udF0ghNMꃰ|qQbz; KXjnRuUޭ dztz|s<7Aɖ2( r{S(-2gJ9@A 4H#4Xx ~rsp6C` ijqϝ6pQo (̣4~ֽu*m<1ZD]V>%+*ǁJC6HAQH0RaKL Tnb~m5ޖb'm<%7G <6T #,!t2^:f 8`H#a9iXJQY0juTw̝*zi\w=g=$;,ڑ͛Vmh,,7}|>Hzqغ?tg&(-ޣ9[Un6;bHLcfNw Jr(w8`lɱuD/2(g\N FW@ܮ2ŇպiV~N1*oR98U%H e[XCMnϩ"Q1|6r.T3{D80qМ44q l4gTCwv[@jJNcuzv4UkޤcjG%O9 LФDsFщۡT!-T]V(;_ qauHAeZj}E' 1M] ]ބeUXGd0Nzae,y2 C$uR`✱9il<) XQnJ^ыy@:Uw 9mꔖ=G0Y4A(@ ܦ'ÃCxQ qq !U(  3%nb>3kbyu(sk3 U<[w_ |IM:SV/(%& ޗ-0emͪo|T(oO|RL!n‹ΖΠenZ5ۈzRA vF D.i7_=aʠ|!T-h)l_<8w֔'{ %#?rR}0ڄ8rҸcągzl̠e!7Gytbqϥڇ6ڔ&ⴒ(W3ؙ@VuMtaYk{r}N u k!| H!u{WP?N΢PNLl,OI#r}9fpjwFMTPQ;8=N)W+ ]:v@ʻu6ir6m(;Xn{ IBhp7XpF݈ػ帍,+1|@)ZeDo ba8H~.j@O#,Kmw98 ߭<4cDDNb'rėo^DI".}fI*: !P|:i e:U{:-0[Z%CFOYpč24{،4CṆ=%je=)E7rҨMPe!SZ|a  Vki{M tUtB-FN=cֻf#q3?} %8g|N R qvt?2~^=Z3AaWzNfa𜳩43hf:ktZ0*2؏hх9sĥP6MGz ;?WIIjXX9hΡ&(R2ąh_N+Xgėb,E?^ω) < 7QG#%UA)I1 q椁>(G6˧|G5|W]QӶO`{my`wθJJN?y2oR/Os=b@CsdLQ6'"Xq^?iWŞ|W ƉEsg!k#gZ8c-cC%(㕍lM3L S#c2VJOcUHf!r`L|8# ; zSHb>za`tj!:S[[нUbԹv~zhV2U+ұF=xfǃt, y}xe|;a8rҠ} N9[/r<ܸݽ Q\d?X)2vMcqu6?0W^a6 `Cu Gpt3$' I UС~a!_M%L±jzc`EMةmˎ$v<18k̘z<vUJP34' M ,-p~-P#~pHܦ֓|+ן(u[{~)],qG6>GNް]S\ tAg>]98΄k~;6(RW.m`dQkv69@')bV1[NBV(Q٭Kd HMp~_J|ʡi¶9c-pTDC&AZ&xLP>+ K:#tՈP]˶ˢJ_ <Zt6CC}$8%,PN"~^=ZUٶCgA\wT=U.?M^^WbWvL=[fx89.;G4vxs4lDI#"RJUppΞ0;~wtf,'m9n 6Ӥ$i:Ag:u7oofGVC %>0 |զ9{2&!3O]^]^ $u oԫZhJ2t j;`igSxqypK Lt4BqQd*w{.^hCWeM?8(#{J\|W})t$SJgkV֚Iɠk ƙcglN" Y><CoAyq\Jŷ/{{CȜERiGߵMO"Mч$͉#s`Jhb9id(TUÒmvٞ eʋ;boz`)oQ7^R{Z"[eœo,pf?x:t6" ݦygLmH$հ*xηS__[ )I&P 4ICv~y.MPk6:4Fa4zu?m~@}Ix(<'٭KDLwj kh9$yI43tFAg~ ׸&04:aCdd wcɝYk_7vEݕAI( M2'OےzK":½6Y"I6Fh@j9D#[SNEX[P{;5y?GJІ6wS"O_U~ϻvgԂV{R ~JRAY¦tG/60[\:9zI tF k$JJ==R]TVcso`ѐF.#+fN4O`sD19iLĤ{ca]](o(R3X#~Mh.jiKoYK# tuNpyڊ3k5^b\sFi [S3N'"EkyH=,B<|qs rO` &C ~C IH^H42j1.<ҋ"-TU_fvp܁e}lJwF&c v.Nݨ IvIDgYkb]5~6)CmB F'ZQfE*8kE>Hunb'/sK3o=G'c:i^[kGe/yP9>}gʈ\ Κd tadJe =ྒྷ !=->яI0:22F0$ф8sL/ߘyI+$tƉ۟GY"*_竇;(YP||d TotTZyl^4qsS a rF攑`}xqMB6e.<%tPH{w2 Sr̙!UYX3N]guW-vmb32'LI4[:םAU+߳mS~.:4vN!.qvn{Se+F"2SR0C8i<(e4ON .Wc[+]YVxd6"!dm<.RI:E'8F)Ơ؛9WeQ5i33 Nj\.jug-mjVl}>;t>Ȟ 9xyHDh7#r҈eP>x?Ջڨߦ2l$0+3)~EQUD5.gd)"XCf؜EKTkx#fC*J#"tȄW1׃M38' N)3M_veg?Z|z7cR ,: &ez ɠɯ ~'m+bQ͘^Ɏ}9Fͨ4*#oR|_eT!7W5.qֱ%ՙvlƠ[H!f97g&5nG Jp3, ˘!,g7O%N\dK. ChT HRu:=uӃW=8 r椁 K B7q oBR ,W~DǢPPسH *~<4U4W7ÖyډX ^F$g\N q3%IGqێ)X:)X~}ё 41 Q !`X#b14-p `lmx] z2re/*״+bޮܣ!Fb YhVLjqm?DIV>!ϼ2#|2s6nYneXVRS vQzfȀ@jDj_/.uKNHgj"7_/zcP}W-cL0LȠh<2Z-#}c s97m9+р7Vnv2fSG|ޝ7Fj1> R `g XP~`gtބh8[ hgjLj;$!4&'Q(K:Ea 8g NVpg§{kG*DP xG#k|j~<>!#֕֩oi#@("ttن}}G6H=xe,@cx &gI |1qkGMepPu7 |}ʷ/yl4ɋl8 [ x8M86H10Fa.М54a1EH+ϫW4}PFڰ'uΧ˞~lHt&61<ӆkm[$ͱK5"ŘŸrƸ,.܁5@9T^ZCڠ:wՍ:Aݘjֵ"+Lf~+7LإOuO H tn7 zZ`@¢UqϋY;)#%asd18Ի. r7kD!cۈ3P*UoeDT9U耊j]ߌa|*ɯ|MH ȌTD%dF?a's}/(F$TZƳ;L|g! \SjNxr{|wgmE0N5yx1eYd 1*FQ.Ȝ52"S lA[Hz ̗#]Tm:&dl_WpB3Mn^Fm+&tbYd}tX0:Nq=Pt-P@S<cuSArgo\U"sl,GxY]ix=JSrԾFD P9JK^vnB=ܗs^UT b ]`SMŋ.թf`5#tcIۡA,PZ($* !Qh𳼬Ѯ1iBj6?J,uB^۝N5$S:Xq2t99<$R :gN\!3B_)qt H8vV=o˔2T[,؇(BHFV-c.d~˓XԊȍ=-50q= +6B$>!0=V}.1R9ݬ ('|:YLE_RgT~WErjӣ>PE>@3z-=QqY䵖ڒLe v`{5 Q`_CچTun!Necy'ivxHĠ5ܤɧuY߇1)$!;y.\P\\9k`HXmxhDŶۏu=oE6EV )ISa@T1w)$b\9kd8j'%~4NB`ba}Iuy )0R˦sݏtpLBmg^8i60<.5ZxI1Z\С!OϾCXv1;"$Ӯz\؅u{)I-HEEQ;I;EdC8}b1'.FDaPFd:Ctp+j8/g$eAB?40`LN]LL3~ۉA1 p1)q'dҔ0O M+Ӆ57D㿔MN7.K0 :t D:_z?s#rCYyAꬑ"QyW~ ;+ ;|;揦(tRm}74\9z \^wZkˢ `CtpĘEr֨5wK+}(yӕ7 F} ?O칫Uv/8\Q} CVD@ӧ51AHYWE!cjO--潓۪w+,av2E ov!GuK63 ntT_w߲jǔM=l$5IR&0&8^ViOyy;fTeHP@0FuvVw7scSxw_l@t$ؙ}4aX3D;{4x0l ^Dk ~T9FVqОۑ.V]$/v5V\\yadPi\{rITdqgH0PtFZEߪ>A\mJm5*2TevC#:g財b锏wNB;fCbtPKiO"0p )ȃSn״`ZPR;+/BZ) -4< Ec0Q}~~a#1%dPy^9odR;@D^/4f;˻p c^WraqHJ"ss"At02Ёjh9~ 8 NU 8(ꤻEoRz\ /دv|q@w}ޥz] g}G|&MC!(F-5"9"(MoWoj|GL8< %x|e}{7КX_Vo GPJGlaeΡEZxYcS 6BO_@ }A#Yv|ڞG۾U/AiRH4MRqO' @'=ґYF ` ) zYT󲾹/B; &Hz5$&*tn Guq)]7Hs{ӣ=Fb 6gMX BZXjxٛ)yjѱr\Ka\8 LRxv5[9wX} XvAJ񢀕ԏ9*I}C,N8N*KX{8C^Z:Ȟ\HaZZ=xY7[cTO6ƦAlZthd <`*>…wp6$:iJ~F&'Q|(E8BEF *P=fO#imxh"Fb 2gLX n$rs#,$1w6;k&@L>%q)2xd{c9*B^ОxZWWcA"iXni` :keȴ -0slPɎ]ENm"f P"R FgQX&C"=}Z CxO9gۗz(G|؇Z 9AhZ P )zaNc3Q@L@L:#ی/M 8Sv톉α汼!:f9S83,ah Kﭳ K)p%p?Lm 8g NX *‚,_G>Xܳ7"Qc7`CL!IT4F_vMݬG(Wb`CdɐSX u {#Pun9wxNNከY#^{gN+&;-^u˓+ɝ =IM@Ps)6]@:kJ/(F﫶YL/]oݹ6xo#uyjt Pw`wNYC7Hм#kczJM]>"E/޵@0qodΨĪljp˹=>`SDd}ZX w1 $YHn|~|._`>^K\Z4|7#{wdA"_AR^p%# {LueU*Dpizpc|yOc1Apڐ?#_״ ٙ@U]w/U36j\`Ue.oJH8l9;W(r|4q{N\JQ$s5VKD:'w1K\.|ם|4v.4=cڗ$/aL,Ÿ stL%W }|/J nؗMW=W횽=yhz|&9h$|A}sx<`~}*ub@50dSݵ L{Ry.qmbNI`)7y`ɒ]ĚSsyخˑ3-3F( \P9gTKPp~--=U6tBB>7C ѡF ARU{\eGd՞`IѱY#Hׅ{FJa^-./=ptm58Q8JM4S34F6CmAbH,Ʒr֠J+`vVml^<0퍐|^("#^'khj=2c Oˮ(#솤Re{}]r\~SP\k(@Kz[b Td#D7\۱'eK!.50Z Q?ַwL15C٭ïvjg MԖ>{ NIT'KtAK%Ѿa[R\,Gtu6.T i}GD_M sgh>Q/GƩ|F&ڲzG3X lB'~Ii41m P|2\x Z }jrևR zl#-XB]I!wl\ĚS(E!!{)tom7sGsX2;kdH/ s^Y>5!mZuOnܣ&1V{׶DZl"9uzIFG@ +ZbaZ{`F_*/U=FOȲX̵reΡc@ikq邝{Ρ@+oe Bko II!grhx-X׋e7ةԎC, V໘!X@zEzt~$qȤU U"9F&AU*X_b^uTU9 Yp4#e 4<ě[&sMnXԟ.! qq+¥AFCG@ZBQZ#/Q9z"8zsJeMIp ?= uXE6qhD'e4c*޸fuZAqw>o x{+UB0p) C6ݹ%G~{1JP3.'K~R*p;"a4J=gac?F!%,QЬN(ݸK"Mڶ%iII٠襒$wQC'~. pMok0iShJGTb![&I7NT>ӦJG4IInF 4Rp|B 8Bn^]yZ4KqX3֫6O8"K3*Za g_[ m:a\ֆ|)i袝Q:iZD !x 672iWQ,׷W`!s`T3L^ Gw~~*_/S%fPcWgvI]F20.\J {*)6A4<224HUDY/|uJ2MQ"A*>9"wÂ/,'' 5ReҦ,j=EAzd7dX޽e z 8QQ:iJDiZq}g;^[5b ZD%ɓNL!kC|6BcC{(͘4&b2F/˽_i-[`h-d2ao 9c:Bq1Ů֝bYuݺ K/wƟ2xU IC;UyذxW[ڻ#‚r517kX~~I&w͑bBFriu6͠/m!_9.Dt .X}>yh|y. WIqLfAWhqRjV ,RN#̔*ҹ^}\+G\}pgNH ٔ\5|׀"aЅǯ,u} R}@Ru#BE_(Ϡ6`?r:i"tS? MC񶳡 ZYyJqو#pċA:&/YoFOE)ԠKR5ʏ=ܓPLPgNH%y+`$aBToOS]G8pP׾[Ŵ@׈wpC꒜} 3KD>(ͨ4*E 'M)> ί_ 7W걢Qީ+]>4nY>㪣&h %aH;t I #Tzj~Fg N%eKrJ IͿ7mz?C,-ЄS4L =Tey2w55KDz$AsJ|"G : Γq?K#+qlVf(q~X/W@|k: +A6)JDx}ŀ J jGADsFщP0;MV^{-'egdIwy o:t (FV 6RyGr0 o:7e ZA]mzr(l{ԎwE ڛĶ=(§!&:ԍon&28glN)hT7ݮś4W6~jϛOu,6HI,J#FAv4 ȢF4$-VϤiDR+6}70>w^V3ϛ岅9P/ P$`ɧaG\ j<ʗF7%8SƦ> rzj֩+%Kih.Q~l^.o[ӑ8Dk/{}@<^m\&\RԴ\jSh{wՏ X,Hg|N0:g$Pl{3>'37F9S+Je6^eF0&8Fxzf)) ֣swjumtӬ~d@q0EԪK#aDU/KB: E I\SZpp$+u7qs@-V2֞ާWh{=5&.َ3(-/W!oړ! IC#C4naM77tC|4ⲽZ7{O$Y*BŊ]xjj ul$9n9xrX8rҸDFb-o 8i{(kD l i5*5LY4&{*^0uJT"[eeS 0 'xrg~R&jY?Cg5Hr԰X"qW1.#.lwFZ/Ѕ[_$--h>Ybc@Ȭ ܘù"e+^8 1^ Tfr\9it-Aҙa|\Ȝmi˔ZgL4=.+ (w Ezjq12L-184@T* Qt b#t\v$+pj[ /S TTVjZ̷ |rX9uE _8'r}8rҠzP$Fz k^YLub֩Nޗq}B[K ꖄtz IC \jБ|~ǫD?ur> C-t~ZV',+p-(ɒ[׃ݶso O/l.@|fNyHtrћb?<{F0/=*sB;%vpZ(oG{"sxf` I!<$?i֫ziCjl;OD\V#wHI[vtakf_$ 9]i9XYxARrv|5(4>=38oepvMx,vm< lp^l#jv&WgL)7F:D'aT"9s TYk^opEz@cy^zy&xU} &KEVE ׹TEVhmZvuoJ=cR Gy NUtpFQ);Tes'-%b}h{?~K-so*OL|o0}5rE{\nY&gu Һ!HA9'CAV44C~h7e h)Pxhi}^4ˌi+|*B%ZcQ/ ;+wM0glN8 L?k.5JCF:|=VlA .=dM0R4dS&&/y+͗\^9xC I`l0cqEl~ƨ)ucG љ>g(o:3;ǀDe)zN4D,At>HqL"Q9iT;K*hV>ק%aS ׮]LҦ(0dl4I^&Bw)|]b'sK2n-k`Zu_QNl>|aI,}<8{Tyr45{۽zKPgNT׆pc-oau 7O`3ngitMYUn>h>lrLΠ4(2OiX]yRuӭtKx{Ut:όNR~zbz;b_cUy%y(Cfl"9F(B!=o6tY|kaD>O:F:uP>9'RHhZtuJ,wIئ"HECycNjuק I[K2wÑ7Ѥ ̓XW.m)Z: )/'>Իf7uQtJ9.lOqw JGs-cN?fk̷TyrѸQʚ:G.\(FguCLptH۱ӋVXp:ΚDCS L ؚ\fR]!h(:CWMiBy~OE't u_0[8ջDIO:+wCv3%V) Ft\4""Yg鈽w")% >˧r\؜/vǾם^;߯<3[LӔ2 RWCQcEE16آ-*7pXv)lN׏OUQ)P 5k$i-a-0{ K'?Ӟ+ 7+*J !X^Tc4wLz5Ԋ3/SD)$)t>nn Ɏ$ ÍUUG2 s$$8ƥD\`$iC9ϥw.3g;yHKF\[{Kw|Ad9 KP+0 LOnD&0' A\Um 6IvKzggBlN$(~ S֕Q̷01,!\4(?V9b]_lAq֋-H-G9j6d}U7<0&7JwK1;{ ?QOW.p lcQD#mpQKK:˦ҏwivءwNa8JMFy+ͫwQ;~Zr]F(-sQ _F'5H^~#f%ښ\tBS?ss!cHprрtZ8i;-ۦ7L: V2;7B ёf?<:rH %ZGUՒ aFH6B~A;sJp+.KЋL.ՈɥF$qKe`"y"1Ԓ/\VB`UO"dy@ Kp+64$O5q]&N(}=fwӖȖ;ڧm?Q\TmI6Yճ@dsLgN \zyٙ&ui)D EH ?m7ǘQCr88(`EsP9qj.1Tp QmH>P伯 0LR(mERb,}5ql3S #QHmNjz|2p+Dt+duZqTFqid/75RIWh.i .ő%hdh5N]V7|S&0F `+2TbӫC˶Ē#B3$م$Wd.*EjqncQ9c.)we='Ascpyi5W:<}?EBǔwLWT.-2aoΪU4QJJG6?&H] A,eT(eHɥd]NOf{NuD|%;'8K퐔.Oym˛ao) pyGC|ibb\e(=w%o~%/c|^TlHXi<%/Yl|ڜc7T(xĎ}.}킐"rшԄHiAy;eJ"|왝NGʇǶ ~ &%B1Zjö>%hպF=q< ]!h†Hzo Xj~ap$uxJj @&W0Lh:`| 牝%v>.A\48a3$SW$u~wK\ %Ϡ'?N_S``f;֔KDծi=I3a<yvQEDUW7 y ʊW[mR[4a|VώmW?L_h1w\/b-q4sEEJ rb[ ]l/=z 2dL-Trh 92ܭ'xTɜ?ٲpd\hl¦[c>Je[d}$r6OcviV1ұ~1SŸrѸK!'z Y Kն:̖Ujn#koI0tZgq<Ң\WWA󬲜)KFeR|uf<ڴދ }5nYE-9 4HdM x8|WEnNGvhr'1 qq)>z=5~nWez𥸨0V)ݍPVvA`<8i#ѳzꖨ &Άm3r^P?A#]hFHY\E!:MsxIΧє* M+L9qZpfi>5?'W`.leՏ~]^;f\`%|Pi᩺tHpBzBW0LՒM։d, 9Y7:_bgΩi  E"8N8r'EWUjҫs ]96]4v_ W~H)<,2&3P= tSu$ rq ڠ; ,3|yi}ov;o$L?! Ǽ&EWz؟h8 =UB9*lt*:tolۺcMZ4>Jq<<|mZ1$Gh6%Z|jyn%bP=euPн`Q&8h@%f?^FW t M Ŀ,d q'*Y/3t \c=Oz~| r+.KXiuztSM( h'Mg<3Z9iJf&ivNQ9X F6 1 L8>Sjě>ӑUmg]~/S :/D@]crL=;ݩ>/8%$0%싴9|?פo+ބ51;WVx} d#j`JR:hR`t9kϴE|v Lt\4>a[-zV78{XHwS*oͶ)-x0uq8ǞN. > qKwWȜCfЙPln Np+FQXA.EOֆYND")q&#+^1شѐsgGK)<Bv<^dғF/ Nq+*JXi}Vuu*u*HS*:qY~+fB`]^= Nb'lgB!#V`Ucɫ"t|y0_&LS1= *a\42-"Ӏ&-(ʇ+9M%ǩsW嶂y[K* |< zӓL\<kGt᭠\4(MuH%{VU -붾MF44-\^ɧ$ Rׅ[ʛΣ[Λ?ݥ?7E(W.M0$dǝM* ET_h 7}[Nb7)l* )޷Gx!č7T3D& -;%8'BaSD;m-З {^#DPep7g/htuDnĜD[@v1I/ rq; j^/guӤ[\Tw/SܹUe'J1X 1m; ENf{u+0FHb\`d2gB&XvJ8_kr)h*8Zl80r"!Crp_LL;rRhI W`.VZ^Ql|Չשo:t&,:Lʛ;]#ܡkn&:QIq s !~^DX#A9QJ \4FM UMm«`2Pi ߬i]+.K4QXUwQO_f'o^mor(!_Kf0J$P^dIQ?shc]hEὨ+o<^JyajX 3 Z &0z=ILιis` W`.)2ΦW5ys];:m~d3f/ꭳ,vp}! h=EZO9vƺt(52!Ppk@ с7 8tzw+(^_[JؼK6ذ@ P ~t8(=)uiw%,NR?di~/[̟liS+^,OZ} .[_( &Q[>. `"*RfՄKֹ&~1铮gNMr:,}߱}]A#rP HF=YP]<mI{x鞺UaP8@04L=4F|T,ެ7E9u iIB 2hIS}h~@VD ъ~̤ͣJI#K..k #>Ak6C+B)ZنkTꝦN4Zv/x\52Wőc:&#b9 wx1i-o\^wo8M%KP̓`,U-ף9_ s:gNY>\˫jAE:T~|߫Zîげ ػJݮ=;M?=@[f幡ER/16SFΤ M/%oo[O]Dכ>J?+Rs#[IdG{H3 O J0gtNW:dF!_nsЊ%mR4ݦP?4&kOa;PQ} bx?0Fqi1,̂i·(;}AYzI{m& QTDo,W>a|GJ"3&8',,!W<*r->/} ?V4L697Xv 7Ό44u 7e=9a3<' OX$`G=/֔e<e P!cᙸtZl.]d֛h19iLFd0ޡ{˪Wo[%#)\o|7;:uƄ:aiѶKB<k Yl&ˣe)uKZp[R6##PJ1Hm瓣O:IωI?XXKZJ\!`(|S-g SΠBk%N'[IHS8{jݱ>qkǁ4:adRDʟYcCM|ή7#7Ă[M;FMyaȆUgѺDݯ΍;ٻ/݊I#EA+.;N=J'>O׭өQMNJh1!哉uQٜ"flTjaZ:v'9,q48 SisHՎ= y40X'ckr>dq$ʒmgJmԏRp9Z SIEcħMߧU-u87ވɠ(ie,wƹJ s&%0ƥC\:!MGSmF뜸>/o˻*7+4$&sIR k[^lxc q(_g~5G%J38' NX AC Ez1>wv2̞Ct#ė6$x|tQw\8x>0(p>;$do0gtNjKtksZ-Ufį3bRH,4i ;:zo<%OLp3<' H̙yuZ"!ng4_rpnptk>W6s-k3w]3D$Y:"MD,.]ni9F9sPΜF]ez#?8DFJb] gP}( ԛ'%v :̡9rrp~R+֨2H_lw-yUo/x* .WZ|bKfo IZw&z(BnDu!K"gLؾ?_U?}Ym^J2{M tcks?Ѝ{jHx~M 3&w&]\a/6(n|NI5_@ Uf5w\}vK {D:pw(-Bo>+~ ΰBa I7D!h_秮̏> z7:~Aw}diWcn;=(Oys#_D qq+hξЯls=*Ūh,m*`>hetD8IRF%@gxN*?2g6$vlH>g(ߟ7@1_3Fz3۬A7A lǝ{a1"($u0,ц9sP.?خ͆4˧|R&-0xKOa@T)XPPJ5T^Roʼn!*U[ГI!*[ͮDOI|h%n+S{F9}K0vJg"ǵ xK~w-Ypnڈ8rҠPt1) *8RTf0S 3aCDt9QVܡ};͗ LU4F'H{ Nv! 5X]9:Hjs/^-?7?!YenfU(kxfF!xykFPl3'Ljx4I(#wp> v=7X` 7궵gK!kQ>z&F#CMU" LNe2tw@ڿVUU/O_ZUk:\C/ΡiٽePQsvQѐpJAМ24=2@!1m0QX(rj54YƧ<8;$gofsCDaC X{xQ4uowz*Oupzh"g¾/`ʩҡgΟ˜]?Ӿ`T9iDZD$EZ#TUדԢhק>''O ePDw$C Nӡ:@طSdV?a`CfwY3k<4)E{{dsq^^tK:ctQrg$nX Ϩ7f@T墓҅ ^.u]Y|ВGyGj](gdNcQrU6 ׵x[g$v4dHS |{%crkϠ,+MbGD}]rpLNѪ3q%J38' Ne x"WFg!4Es[ݡ1֝ƽ&h"{~s?;a澈v\FG3rSgzXTNN\B5KP0J=KC [$xlj|:N'뵸h] &2EȊJؙVs.,#;ICTX*!t.&@sĕQRkrikfvҧꓥ8_Uޑ0a3;ͲGeG푶N;u~ںƈ\9k`(f g% otQt2OX/׵EVgSljhz4("=c 4FФzD[d_YLmQ}?[:6]M :H 2űP2;7SOyYxpI pAQq1S%Y@.cRV$=Q yP 19 d5¼ȭ>l'h ITGj'@@t-Q E~ٖ[>!-/^5e?ZGWn ض 2yky)TCόSE`C(9EJczlnJИ{_>4q}?L9; Tx#啑u4V#e$8i0YQ\\9kpHJsLi'Ώ/YhI/ ܴݯ>%HF"݆ńPi:ֱCD pai6HWcIΫTa D/HբЕFJVML+ sf'ה5#Y.Oue牭 JFt-5(a7$umg'II>u*?77O kSo>4b =Xx5:'#@%H9%r=csքƺsŐ4FH 5-(@ no\t4k{Ȉ%Dpx-4`( *R'r/2A.5>=3Dc/6͸}?VA\6ODXF-j3^!1D:C8! fO;2PҘwi_ϡ.(쉤/ c-X]2wt9OJ?QkG&hT~r&NDa2Sﶩgx։Hsd \pV" F3 <]w&DqYo%'[.L/7 VvGn4;sxwC7]\ gFHhjjN.li & /Ruw[zIP!60S14 e>3%$}$r 2gL NgXF@yyHNH~ٴ[\)9W*jcbô560l GcwZR 2gLT)oTm^&j[=ܢ<oxd>ѸlM Rf⦓0H#=seʬSIK΃irLb\p9k\H1fK`I@P%^.MfzÉ{1<<9b (2A.58 8p\ZSMw@8ěMzBР*Xamqi5y(e)U2l3³> >A/H5RaE,[ʕL :%>5-eБ^\5`Um[J[݊6|tșTb0׸MO~O43/:b}k+vA ["嬶0ϚPTOqшnoū[}=6gu4PJ|y@WPrbt&(z:sodDt3ey<=G~-px6%|*$S=<o5Q&+R^0XOr l HL|AwM2~&u0E/d!i(a'xXqŻ`tQ Lo{M{V߻Tt,@/eȟ7?`ǻH u&h#eGS"#41!)𥗫ɖDuA* BhRrsPҨ)*3jnR;(J͞|B7n7HO] 7kG;# F#.B~.oPv7қ'qu[IišװL3-gs3P5ơp{.5Da YƧOj+jo:X.CW{7PZncO7>#œ15x/ ~FmX"%(ƦAlt+=>ԛlu9Å6 x)(Y(|qù:!,^bTf"YG@ q$=yLeQZ IV#WMۀ P5g5g±1jӒVfK~C#RޔEM`RcQp]O-x 4v:3DF }*JRdʤ#.G'P8jM` 4g MЌeVB%iă _!N$ vWݤ+}qçEXw u3{#:\+vZ5U{&@@JW)=.[vh-{'nli"$4J `QW>p>,I9&숴Nf/zjB:f`gyW!&I"JN4#vH BIN@3njhl;tR9CRRHԭT.*F Gf{6EGnw@HliQ`֔9@fkF}Z4h!?רCp]9klFH;kCz$vl+\GGsk~^fHH٘ys0 Inw')p݂Y#B[ccRDX #^_.w^uMw8ݴRZ4L jp Ck4d5ČW몭~Ga@c[8k8(X ֓W%vg&W2UOMs3փ୍6/@Y@Keq n;dJMNϽB^:k:(*ԡ|=>@ HA fMZ5AArc"xUot4 N%1Fx@r֐ P' ? 1(Q<2%~4Mʖ:Y P{3V7f- SipI-x5qՓ3MtJ\PYf`adHZP)k*^(ҐSQTZ6|PW{"I6(& #P -tpu\jThx ׎DO( (Kn7 6ߧ C-5"acl|~WS+tvV6 J]ߖP=["fv >:~k brl1G˟)9$@sЄIy{at-Ⱥ Igx[uz6_KD!!~7LOP*IPRT񣮭c6 dH0a vAacSHsm[RZe NBO5f52z1܈`7dY7!6=N&𓇾1.М54aד:EUjVmV4|amBG>xv]!WsDǚ} m[HAv#6{ s҈mZmh KtQ.؜56acU<,-qU&<05hiDP@Pڻ6xXT[/Si=2اK:L.$~. n|HC+}oʺRWuiú}p X7COٷ,46s}&|yE:n-'ZQj`^C_XUC{+K kl 9ӱZq=%%UtN|Q1;:"\P9kT:i#7^l,c3u3?UN(*"-N9ו6l͟TLǺtuPP@yUxB̗r2icTb\p9g\ !ON[u^Oflz?mg%̔~{Ko,QAjH+I#p{ \?7~'iՑ;&XJ i7{Rx[~nj;/RNP]ylb>Ysn7ϘfQ-XKE5 T,.9orp wA{" /uCAOUTE~5:F }d@t Oyl3ic#'YCS4جCei =}Ymp~5M:}F>:1ABVq]d=utЦU%E%r >gO\%滪Ct4 M06;,`:[lR]kH"SzE)&Ef'0K6Xs:G&!ع#FNEr5)o^£XX~~݋y8E:3a) M%bDL==L˜Q'MBYvE|W.3?6wz{+`u\}W=1zz{l8FwzTUГ"0xwA㤉:ss\C]9k|zħ oo5ʶ@+-S *D :H/0!)漲1s@ʀO5_YZڄt?!;Yd oDYVCZ)G|&SOmЬ['.e*Ծ@5O.K}`ht nl&q9O2Ԧ?w.(\,9?W 7X A39m܍]UveM7b9qJk0^ r{^&#aD\P9gTQik-fegRSmm(mKcŻK)>Qq8U LiK F-5.%29廉ЦVtlQ[aizlZh)CZ"X4Q#N=ѥkF=M@p%w$F[ d{ -#"ah~^rz6/R$n9L99>Gטa)FXzst4zBMWN>+~Qm+ٔzuoZ)fU~+A8; fwHlzT,SrdAHr4ssbiDv1j#S=kޭ쉹[EU4ߩOɢ I2y I=/P¨Ìw415X7qxbY#B^KA 'J?k`zh#~O&vwh}'FxنچNӝN유!RN#YBޘ"GxRW0D.CNsptQ5?+inH"|ګ$Ȓ()H[j@@ On]ԇYQbO/H(}x׵4i,D$a/b}GpjSmLG D0M#:P<xꑜKlpv}; }X]Pi  `=ٵB}%b9ωsφ$@(:Qc5V ,-idϾ#]#9) cE(@*R|Tsٷͬ84EaN32n7!)zhʻZnЉMayV͟Y{.N|TIե7b跑:JûVs <j9jtjBg0.2 i6tdSԁ ExEiAvlL8dZ[~syS`E3b#'p,tI!_FcKN5ɨ>$%"ټ!qټ,5ϊu.,UB:j)`ۦn^S%ςsRwPƟGܗ!3$Ye%Аc臥;n[7Hu1N56q7a,w.k-?_2Խ̚LQ?k@d<$_`u-LO2ϻ#zoAO@5P=Qex,M/HLΩ+[I^ǐK=ܾkuWXUgHZ`N !.``?F$ )0*5bC 䠵zB+F7Hizea1,1e1de+-Ξ^pxÜ9jh)y'Y>3yiݙF=Z?<~R:zz4=Z[ JtYq8YeIhE=qdJ"9jxf'A~>_6iOuZn3]Y;FΊR(C`chO|oMׄIL78>T pqqk}Q4~"/qWQ%_Y:|sqlO&<# u=t`*qE%pg5SZvSbSQS>c^Zj PɭQpzd& 2[PO39g.j7xRRQCwF@m >ԋt>}DWa7Er[@w?kIKhxKVpp8Bjy='X`?h o᮷dᭈvZ>c-o azb{8q`:MosS:'zވK<%KF;!uH<-ME7sHO\ 5#$R苶(5YndƂTKdILM8F#IW4/-n]?6&CXc7('hFhe>WV܀wizl:u&ɗTnbF0>T/~9;Lr]ji h9 0?㺜ͼ)By~Ӹ{,@N?U"Z2WSܼCO T'B Ow. yRlJB9j|jƧ|+<\ 9w͗/H4qJ|v4$ȋZGBC bm"Aˢr6:JC%]SmJGRC(>gP2iNs$ "coe34 ]:i&ei, lv,u1 9 N(mh Boaof!wAUuiZAo쳥QՉ1f$|]9;$~HmcRQCDTogwrUyW'M:sDD)q-o>Wj%=_xΌBfk Lٲ/qfG$ ).OXϽZ9@bUصCzT7FJG6},V*u>$#όr{YpT{x ('`(I$ %Vm~YӢsh̕__A;%=HA4<5(Y$|<,J& 'p) <⯶'{ z=8SNks*r :3VDgL7>~r^GtG|A$N5*iC |7sU'r z9,[dli< |qsfN'Q!I^K^%ZQ)?c@h8,F9asؤQImn,}SW},OYm I& \ FIl LˠCLJ]}Z$|zT/VOOW6$WjxDffk!l{`p.3"zhlD6 %-qrY٭&2U+7<=x\PufsLJ"#}hf*"B~v1Gc:j2(A'+"6<{:TMbn?N!ug"Qk3ϑi8Yt-9TꐐԿ9rԸPJYiH6^f,mڪv9z'94OEks_#f$i 8 l]J9NSᆨ'L:~;{?%>Xlͦnte}ZO%ո|(iZ2sޝkLo!6υt6]DJFGQZe BvY>̉i: 3Hu '0-&"3)n= TLܬyQ؞Dr)Q#40BQ; aa Ij&MYx|** G͗MS9] Cᝧ-??A7Dum[b׫՗%}ȷ C$q. D'YɃ[3ۙN6vAs)nB bgɈ3!8p[׵mLYTzbaq<e0ҏGu-њ5T+sȨS U|Voz1`7k?ZJ?0s+^d4Yoǘ:rhzqwF=<0Eq¥:gH'x L{RwOW4_7Z-$b0o.н>P-ɽyД匬cѴntg}=g{s#Q##B]*7ۛ ]7>Jfu7_Ы\oxQ -.*l&m $2A,>ی<#Sm7*le\cZWE95&چ LuN(5Jԇ*ӊ 'fPW ;xtZʼkJ2s,hMP?Հ!hLhJkm]b*ScleY!q pQ=auXմ2 гnNr4fZ-(̔LP?·oVnc̲[434{WۿK^M (&U9jl(VNf3_d~!?wCGWoHݽgeV-8E&1k9=rG _L]謭9:[޹q?^LE&L,LW7>]#C]mr(cޣ6Ӥ P0eSsK._W#M=|/$1N50i[S:HgWO_xKg,ecd~@yI"f=6-Bϗ$g&md~h׺Wjc:jlq5m6 EFߠ}oq;9|.p lj'P.N-dz3H'x"xfmuXқ?RᷨT HC$rMw;{䨕vuzG?}cKƁq?et+Q#Bh+Z <v^{J>SޭKHWD՟紴C3!Ë]K$Q(6&zjiב E@evyf֗G]bR]>GO&谇ƿSY.~=PUۖ71>VϐRgE;"m&Q$NX/PN&퍔N쥑|bZJRGTCYxYBi9] nwZ utK!7&ܿ9j\;M+RGNeSGL{JD<u@M TgM%#93NA5ɋmz1鐂$$;#H|؎nyyWi 8Ƥ8 eZ6d,j@3(-BA$,Y,h*$Ra٤xUG7sf Kr@8Wߪ@IJRO넎Cފ(gM %|^D폠ܗSH*UPO&;B fg3 |@:rDtS#yꬁ {" aMel3N(%\}7`t$-GenKLeّv>=JicNc;. \9klŽH9 6(je(HR`W4AuP5Eӡe|IծʳB53"A><E'8(7Qy<$&?o-xSߧ9(;w\nȁUJ/Qƛt0//4r ۈttǷr֠ Jg]jw059 wTո6/!4u2?cb" 79azPÄ.aCWDYA*]p8qq vCM2i}n t&$lafp6T s',4JRi،K Ҍ=]ڻjI >/P{,7>8~IC;/}iGN"D8Eh rֈVEuLS[u qLʣ>'2 [8Mw^ 9M=@cU<ӂY! edҧ}f<:O Fїg8PJBs sm-N@?fmbcd>nsf9WY#:Z+ J # (8)Kjm)EG<(E*Nٿ Kt쀭xcFDq-kEeY<"z 7gPTI!Ib"ê/򦷻2Vv'u-r(`~<=`DoaΦg䠣ZZ*rbPnȘЋmXu*qXz8(wt"*KV)I.\_#Qp P T[PA+= ,;T yNJ>ˤA1wCj,=xcMiǎeЩƼ&Ip 0g LtQb֛;2}شQdsLU P|]~nRa?NTu/PbSz \}Z8쌐civG'r NgSB QauQn2w啕ŀn+)t4D6`'cyg$_VўTYƬ.8gNtbt_TSgLIhB:_&$8%R 7fe`vN/WA3l-;agϼlUMWk9ZnYp #t*,;d}&hM:af7Q`.RnoTD!c/_r ula3E%8%.bM4PntE*8߁D\RGm[1Cpx yi;A 7ss%ntΑ wA`sd ,Z~mīx>c #|VH_e8o[ rOkFOi:-a\bj7$lCBH/ooL?U_tFN4Atߛz+&=5AT/([2Fe;T)Fo3L&ʹg΁1Z/5b"6/ٰ~Ӿx(Z!RGD"uD&Bx >̈́d-SGB?)FIY;^1 -5&aqdV4T:{lPNnS7~ܶ\IR2ҡ+A#gWĴu.6.5@ K9͜ M_GPo(X{`nGLAj p.VzQ37.7l7=|<4`=JLa-æ"yCFF%?Vo`,7/V˦.8yV^^UZ9 N4Ivd˚NO51h28 zApwIjz{%BW#7j=n&(Bz=lT]1x&֨[?8lԳ=iuމ>)l*VPO܇3s%} k;uN-qʥi";gO*{yD! p1xjz2 jD|VXt6*;Lڜu8AQa%YdҠb(uɝΖ< =x&pqZ#opSm% h#q]FDW)uJ߂Piа)Gy!3Or YCWG&SjrnwwФ*̬zs3kװϩRUk:|sR91I 2DB/rDC\p9k\*ƥ5J)ռ'J/7" nvA|ԻBz᡻3MC:f} #8u*Ow YwDNBkB>,2=}c#>PV;׭:ݳZuWJIsb26d:qIc $-5"q)M8~*>6Do6(Ci$1ELUHtʅBYի񶼩vWh#ZzuůT.fmDǀB#`@H3xT :9"A.5*ad X8[$ڏDŽqp-jʠ*`jNKؗýxƜ(9-Dq.؜56b3e352Pr*xQn>ڧar-ů TJ`W$4-ܭ&ZSBV{u8l ^O5o`E\! =pO:'x$nRtoB&fӒ'G\/#yfј1$0scMPSjyW73mS{k0\n (ɂ)lHIKKؐC< Q.58adTkOH߈My )|ofTܠj[]+U׭TD̷A {)914c] :kZsтU!YXMpG;@~QuF.̆stix^XYuۻt aJ#G@uPuUuCjh8tv_nYwE!>Vc= NqE?PJ8UYFzrs*5z 깁W^ JgRYLj 竛X6 {z]\7MkoA1iHN2b}b=Nn05{s'Bȡ.5Bq[dC!y$1g:gOU{SWL,i% 6|'B 5S~^іO:j,Bn.H vA;TF:?͝HPmdZ6@~kk\;p7N51D}Q(!(KʎIL[09gLFD0nj毿CE~ΙJ6 C٦n-H"G>B¤ ֝AY1y!G&?'[P9kT(&C{M -gxrpyJċLGp_;)*^DԾ֜ϝj5{r#8t= ACPNwٲZR8*\?u҇|zex r ݿJ8?( {dsrLr欱(MP9?OOF$YWNhjt6O)y~hʁk+@P702=LolT䮀>]5Q/x)B=``=rR"P`*uܯ UoU+nǖG'HӞ,#EJ)rʼng?N: qScE>E6o;yͮ~`jħLlot>(^cɈ4:㯵&44/xDw,kO$ h-JMJPkE<ϯ$;s^miSb<#[]4lZn6 P'^vvؖvW\ gIpDQY#"Mi$+ٍȶx #a)Qe QK)2JbCFMIkra[H^;{R-6O@pO4Rf   VGwp1@1 pFQ>d[xh1:8΅ڠkuWe?UK9 HL`5+A3 ݤ_#fB:8gpNuI( $mr|{<ƈύl27G̕1>$ΟD9MыTN]NGExgN!>ZL@ߓǫwXv7S{QyzѰҞ&J3GStvv/%EIcwEK1~mtugRM8 Pf{ʞV)p*Svݒ[-s0Nz80AaМ44qGm$<{mRؐS%4]!8?W쏅mR :A/!jӵiXKÃNthNfe!9酧pn3:'N\%dxS@3\Uguo$=РO 3לHIG}Dsȝ%wCTuå8qI4wGJ fFH >[9K^lTha,MWǾiQxf@ u߁rOCr^Q}^/fP*X[#eW06em9ͯ=4H#)_{v5$FxmO|v:4B3$*T+uF7QR^ wU>wjצOS&0JI;vd&ڲWh?i"SԮK?q* Kp32L+Fn[%*lʛ|Q<HsI]EjR qF@%xY?2' C7crҘTIcѴ j(4"m]ɗA#ps I_sq֞Jɟ>$笽%Ƨ%|Zl̽fENIHޤ(_ -5YR&ˆ)jim l㢱 @ͱ !@(ghNi5%N 3\knֹ_=˞1КF1 6p&"3,Mcc` ̋w4n@gxN V_23IqxUμmqyhKw[t rȑcTkj[NwqXtؖ .m#ɝA&8rҰ KϦVxraBB+7r.zz2d{|OQ̸l~"Hςkq.P.%%.Ztrfy.R'Z94zԙ5ٶ,@xJ83FYX+ZYN-Gk O`3:'N8|~U51 俁/&cEINU.4׿#Hw]X0fLʺIq܀!"EJ{(xHn3| D$x釹x 2]0glN `V"FK%u;fMBalK_|-$ŜA,~O^#%'nRL:9}.oj>YWM|+'#V b;=1U&8wٓҋӽ%Wkv|bxb IvFQz]H7=4ww-N5~|~蛫Ww8Kk-{yrc6Jǖ؍t1 L{% :W/+lNbSնK!^{YXVzgB*+vRÈ7crҘQǜ8UKDMd'h95Z=tGwMeL3v`qD5Rd"H) Ž_?@8rʠ4:F$d} +- 'W^!`:P:x~:H!HPۗ ~7J pAޅ\` 3rRZYo\"S)*icޕۊ^.F%~1nfLN1TA=K$?rCp v*PM~c911Y&dHaLz4 ش0glN7CU;VYo)Mfٶ<6f(8`s 7G{y,6fC Lt4Da3}`#`KАj1B}~BCd1Coi)=:};Uώ.-'8ƧC|:389W^tFj-^]kq5X]Twl cgqDQר`Ǽn>Xvjbލ%0glNj4lެ'خXә  #f]gܖ4" Is!Ib|&}WcѬ kx~O  I@Em0uYӸa-Gj]s9D]oĻ7Qzmʣᡧi͎\7ՌSIysԓ /sP8glN ٕAe༭n궺_Xٞ| *RJ'is܅H +ł3r(Iq9<c7VEN3R'T `U /z)),)ƧKqRgQau,n 6)QP5M2تbCf8NAQe TwmV.o.~1{H<{z EwBCѴS' `pD@+#B9rl)DA4Fq9\I+%Et :ל-1{UV]CdeC5LsXbƓgم9s-QmBï,nvO$$ˏ|Ҳ(&N-&;PN!ˠU'D]dB9ix¢(?& 'zݬ" ?sIc6FI+/qYj2i.g\qZ=lF*Vͦ*` -X#t I8HR%=Vˍ.*ɾHn7gNKBͺ=Zleh]g_fgk,mfҤh^4gRҥt?g=t@{IcG* 3V)V|̍Z Bq{y36[٫?+--3$' ɀt9o$j؂"z\o71xZc24u@C*M F.P_ԍ'N@zHK\Ӏ1'pgNDJ -TW7lTm'o'u d YK7ݼu8 ̘&{I =[~ݐe7V<^֢:#tMЌ@khܵ[N}Nu}yԶWC?N.!>w cDU ;*(C=3ʏ6f2-9)@2BD: DoJ^RC;zM|Ρ9{:4p4 /&t&,C,Rg`N^|/JP<`7:kjpOl-vhu1uD%83.>j YwM6F(l+y̳A'0'|z$D~@` "5r "E,z4 :pI!θ4.q@;?|? ֌aoך wI4cZtG'љn ϣT2~cśpcZ IE1E^1ye7tt76q*Җf8L` 'ΚQG4d9WiӔ:stOcqu.אL5ZVF+lҞk@-Zi1G4 8M~4PmbT9s%Q6$~~j DKȿ#/o*|<-}vJ;qD8F`u6T)9Y;! ;v >T櫵<=Ӂ" x L'>'>yN'ZݵzNW^ugbGA^vfC=ͤ.c|$s]M.(<4F`وάX2D)H|mͪp2STwN:b)c'7M65:%Bt܍i wa.唇cMՋ5~g|&YLղkXP??CJI= D6(%?4]g9+'(Fhz?]'oK-*qUfy4.ɬ<שm& û{ᶝ#סrr${cCe%#J3.ˀ "o1Ot ٞF(zn-8[fLSLd/9eZY#]Yѕ%b=P(a4:q]6N0|j?#i [  %J\]%{ ȲC,O3T U\(ur*'WW#NAe?K=V(ǥV&)dq[d#z(Chtev6~8W=rĖ@y%?/EvI~cb$o]Zu\!&o YWF!X`}Sޛr۴$7CjY䘭'3~Hved/4G2H{RQDYWG!譊:ZUA`<2&Ŵ;(shT8**LakGݑ13}DF(2=Jߥe=Zc<[09kL(p 23&|@^*oZ C05]U>K:էM>HLȌ.5*u6k8HI}S.ur ez:? @.6eʥ\,JX -y.4,|J^I#:&0&$Ӡ rs fgB7N&{i^5;pP8eL֕Sx=ubf9H|b _{"0rm Tg ՀPx~ueJWʊkjX,.'^F,XicfdUN)Oi}qQ$J[K0(A!.5,aG$+Q([I?(AR8_\9:N|ttQ"3ugueq2] Q$Z8g(X IA\߱ZB^BwK'#s}wπ#_yz6I:ئӒ'- `ϱF<*w枈s}n͸dX5%Y.%s myG`%dё@m 7vUJKY驦wfP,#zHPe"9, $($d B8gYn7;|_֨[ qP51Юm᠍,Q{ޮΙZQWɓK-@((]9kxjP_bwo\u%=˺|71M7>f x8rmБNڑCsxص/Sm(Emd䂳 v1 nւۯeJ,׏hʂV<; N)U;&TWvFmD.Dm988{ÓSwC1 pahSS9'Ɉܗ_0Gol-KNYטLvXӍZ3}b=="O!푱;&r BgPX Bo !!=bݩcjpxnWPj'_\խ#wGoRDfAoY qX$@sM]xSD@F~[h&_z۔vbK4u$LT͏/^ri4ՐO/S,8,:wPGث-?4%`핏Z]eM3v3$=<6=//; LݳvԊ"Y@ J+gɌ&,+]al87%:ic$#Aseه9x*/6 UUO9c@`"ǹs3ԥGZ9;W=rڈ]P+qYooW_}1<6SuKTœf{'}R0>HR98]0:kvHr^۫?SJD5M BCC~U^S+Pb(r]*e3h-t|A4XsL߂YcR!&]7)QF9Ҥ]JQHk03F;NiNl %=&\p.@4h]@:kj4:9Vězn{\m*|^ww_v!ƽٙ[z ̟eO&S'#C,9ƨAWZCX- ^ZeŋԞAszӛ'c' ?3N=uٜ@@b|䙥B=|wRؖBa_ 2hh/DdIoUHՃIKq=_Ny[EԚ,:|PgZFw`aU'9XYD ԛd;spR88ORmC=zCt:U "aa"8z՝gg6^R'h 37>A<[9k@r0@:6%$ovX2]&B3eʉw4nʁ6'5*ƽJN`[w6!'^Sm )Y(^;kBlpE)nGuMO< '=?JGE,h3쩑 SKM "-5(qcsǂߖ_7[wzs؏R]>=:$ W1+$0)}vq9GE>TLH|>*^?.,.]7ͦ=*qB".<  h &Dֽxz Y̱-=?2 k:T?.R 8#Y!wuKxipIx9᣷@9{mq\Ob}>iȞz^h#]:k(z?x; +f8gx^ooş 2$q?|ؑQCRTC(0-+hűVhL,a}n.w{.r ,g Ki%|6ky"#$.aRAZ|ziddIՈYÿᣢ AQH1Z,W=ARe x1=?l7cVLTO/qlK4"' T%9| GԶ##ؐ)kn=@a?Om#y_0rlMٚn r4Moy}H&F$r .gK :2 f}>0ThkPa~z6OMl^<: !">Dh]`:k~H"p{ 73Vb/jQ =GLj]sEB<%EDn5ROd7=s -˓YcE:ZR6dE\wC̈́S`K>59bֵ" VZO$P9%ICx?m 6MY 6]V3ס;*~=588Kح}'4Jd$GlbAG=}bh9:a r欁 "sqtyX٪melC //65qA ] u N"%9-c*Dϫ'|(Du "SX2'U;ht_=/-FkxlYm?UG J^~]#ɓϋ ݺ:l[ ht>c;m]lc]9kxjKp{nq'Ko+O:! qGj's9 Tـȳͥ<&eƣr r%%Gcu!C7P3+Qt>x L9eDXF)ϯ?öל^ⰿ̤s.Ww…V2DiI 6FXyI,,Y}48'(s%Kq>}r +늹/el???l%YӃB @!Q>["::N'MDU ,AQ.Ȝ52%"F!|\ql65|/h$C6 ;S3`YOuu+|`/RB9[<̙̞ØǸsP4 #CČ v0 VInK*<2U ])WC3C -NMz^rW#SsLmr?Ts][p4Ayi|a])$Xe*>!fv;^uMSřm Pg T9l+W%fRh&&Ta8Vpt:^Yߩ'tU$;vIC,5(pnA赵HHktN2e 㰕9v-[-иcO=,08 ##lITQ'm]9%p77 L@xU>x^nߣ OzJM؍+xSGN{̖©$yei/hӓMKp :gNX Y[(gc,ҧԻ 6W&ޕzrߡ~RhA_+^c m"n#7JC# ԉ" m Pg T@U ?5=կk1U)/xkzqUx Rt(')Gg "/"+tuQp Tg UXY_T?›g![j|TɕuuZイ3N <){KeiÎZ&rfsC}ٛDwAQ #K ?K *Ց(*Lͻg*HFR؝;LQiAc#B$l\aR5#\36O2}N~SBn]oyǽuZ'Jָ,$8׊6 ԉA+_c\9kd(Ѕᆭo=x 4{Y땸>l6K7c=:]ЪxJx1Ie4lbx(i6& %}ȁ/p5\a%3=&9]PrK.!0om$m\7$&}j%MLQLϝ 6 K&'8hDz}6]]n jxNoc$km;g[#MF,iۤXV*~P$=|(̈p@rΐ4Fr)TrP]aKa7E}W> y&қ+wdbﺔ=W:j^q 톚:w{ZsPc\9k`J&<}u+St׭tQQ9jW> JUjT3 SERd_3lT٩Q /ވ9)l\ŒV2Ü6HW4GqΔx]^Ürkw N Peʤ(Q3j!dE̤ANl"eoZsDujknXe^03+[Kڕ}%Ċ"w>V!؉lxihʤ鵏xOҒzXڼZwu /NtZx{Kc|8wz p.HXgNH%P̓[<+X&^#G3v?aWD3IwЂxvkQ]]N 5My zP/}oOXKr%r3>'O$G$T‚?pX|Lm~בp Ն;qOOVR{mX1X}юAց$BpoV1%(%2G!=`;OyeԹN+q><<oUT*< FS78O]XR̲@ Jq ^ "lJg2FlZ͇'7ʴИ-cˣ}^68roXD )Pxl?"IfK( H%!c-S] _ p޾D3eHx{2gxӜqom3T' U ](U[w߀]Z St1n'UFT9`3o8Hyg ޜ` ;6:хL'pg>JO.5uȮ(v~e5oR&TK6L1g!9Dxz"n(]ޔ͏"ha< . be+?ΰN\ S^R 6Dsc84^3>'O R7 0&>{rl 6C_ۀnbSFu\x%'9m31*p|]DIcS#6a6 k"^Mi3%l ҫ]#$ ycviS98eq̿x3T8rҸ4hAM׫b".݉[8:/A0'ޔvR00Zqi͑\/zyDr$ M4B X'#+u5.ϋ`‚Rw)>M.A[0]{64ZGԒ'':BGE'r3H' R uT9^wy-J^G9yL<2AERD*9h]E*RCTN'Tr(iZmԐMdq~9cE|î@wy T(dn %.m.0RTvR㡇 OI!ȋfWF3k$Y)>V۲Jo ducS{,%IʓX縿CY6z(1DQ r椁ĐhwZ-ʉ)^י{Dԥsn-,1IA:h89,XVpKfHNI!mhl1߫&?)uVZg<s|r/ s3ss,vA~y|3#]3<' O$9)[sR1$b3[4e >,Uw^.|]IYd>Nǎs[R[scO}à7Ԯt{:Q6'2BjPZ~mWMyHMz|+U&` juV'I&Ɲ:!Gmiѝ$Ot1X4V! _)YGDؔ'8()Hۥ!uj@J7قXdĜaY{jItQ4:'- 8QzZ;x0we,7MJuoTr D- t@΍,64A4:#8/KOZDS}5 3秧yka&O2G?Ԏ34`˵w/ؑ*zG:sv(U^%DQIZī[W*5Isfy'YEm|JS R{:ŁM~+y{r/D ICe/\LI^S6uk?K<١| X`'|F6 i /=t|STah9ipg0J&mJѹ٩1z%H?/At̻3Sd1{ZC }|^XlqY_yRƥٳm3>'O`Ѯ8f3/|\{j |:uG)q=됮%ܿQ ͗`M{Aie{5+(1g}͉Սt@D uF DIungL8^u+>{Qݔ*xJ_Z^ m unhέ Q;*:u@iRm |w-NZ" 1L Zߴp$" ICآ F,{G09.B˲yvMUm(߯(;"ಎӠrј:ȀtT4xTX t)iYnj6΄[Ti^,v; 9-ؚj0՗6`m26Bp6(F9csDz{%Al S?v^yÒcVs{S)h6Q7m5:} lvL h K:/q3D' Q䈂!9/hK^A>8A{Wt8牻 GmtEܤGΡˡ#*r>ȡ=.0ghNES8-sC SnъOTnS/bT)5vcTw2*IW ji/2~\vZ nWN8gpNZ@{%}]pHYn x5K \/Iv[KKhxԭ$\SKc5šQ,WpMQ냈5z6~ioc9i*V+a@&)s O_Un~_9. wRB'/eNBon?X4+qD K@3(' Fjü]j/pboۦyH!_fQ`o_Z"vr~ qsNut%(eJ`3.X .mfSf]dQR\2%4t,|Uޭ#\xV1ӋY Ι*vA,gJͺ=a#+Kp38' NtJyEB-0k7pB0k٦Sgfȥ_v w3 9ë=(4&Y ԚHgxN  *.\Q*=~5C/e zGLe &AZ<5Lq?S!:ijEcoʌ_MSm ;ć?F㲼A;;UCF޽VWb/R#8rlǰKϻQ6F!t*ChP]nIigA*)>֫T^.:_TJ:91=@DF^#S¹=N[*/Y"bTb/F:%M n7hm>=P xPcġy8_7'H l`O9~* ah QAyR Pa\sF>T~Yo^lF63+>Vw ?nIOU*|(aNZwcw{vGȭXqT,sr\tQ(ݮr0"\U㢬 fgkY0iV^FqL-eP~SP)Rċ]i=LtQh4Z7 8-Ee%onXT_76}Ak nwہ0\ӊxڇp%`ԗcQmsLyvX5bCEc(B/5q-Nyޘ]w>F(F)H~[EǧOm<=+{6Ƿ#/mtN[VdwH(\im3qCWȔ\hOơK1.М54AJ(\&#htl5*~څv=q;lXvқ,<֣ԸK,=e}ʜL|{3|OڣMb1&H"p!sf8_x(fnjN2 BaOxp;F<*M][xdKsNn^yr7e Et0TJ/V(vx~+;)]On4ՀJCDyPTOimGmh)R`tVׇ71# {숸:U{cݩ>O&Ǧ~uCϬZ v! Q7 BWٗi|g$\j7Rx0VwIC@:ϡ.V\BdYT!Juf n맧)xloi&oCo}},Fd@TjODyJN]B\F{c* Uͱ7LB18Ż`tHwHcSEo޼iԄW:<W:`84dŮk\q}8q_K K>H#~ᾦ#lNԞ @t)hrdh#CN9qnvi6 .͇{v-'| (|7N]Յ'*[G'GZ*iqSTtpt8)ЧԩƜH B-ҘW.pw770u -eMl; 0 [@9gPJ䊴K053/MFiɿt/W{~xq2F&tFq7".F:j$ԯ9iErb,Ǝ]p:k"gJ<ɲgDX-gsh?몕y 㺝82O{J+팞^tk1Og$/:uOғC,ŵqpDȄ~Y<侯Ӥ)R+>YAf ΦQI/:x_!d1ǔ,8Bbc)(EVsq|ȫz(M.Q(uX&b]\vF6(xЪvlHl]U%ă"R @g PEL=?֏PlMCE,cG/P5T5pyӑF6unr=W8f*|slt$!9#ѻoyn9;==1-+ Jgu&A(_ NÏ #*^V_ew_W.;)ɬXirbڝv$B (~q'n؏'&F('E-=m~¿nYFv>AAͶ|Vɉdw wlTxxu<91>idYa.F(E2RY+L+4`qBha02]*y"u5CU*N=Etk&ݧ<:d #pn篟߳D5ncKK5-`pqU`[rȟ6<= x\ȟ1:~nJV6w 9b >gO`85bә+(t.:@Au<G#Oub$lE8PL 5/JD{㝭Ӌ# HI+7 2->*)u^*:)÷@ (A])kKG6UXw*J4y2Q NgS`@iD:|t7M l)2H_[HqLV 56n KN^8s4wGM)o:G_8͹EsH:^sMZtr5- c3Q\*Δ~]j5^":["yr{ۈFr֠HI  B6Zg]3񫮇"q|ЭEkE ^!1pAQ)RJ*-J8ֹЙ+voH jvxXCnbrЉ -S̛ٞ/g7L#d1F)EJk/P|Z4t %[]6`5Ծަap2x}Y$gi]]gѢQA7O!Ǝ]P:k Dh /ۢH4 CC~W-4R>qFxvv8d׺.$v#)^3t䦔V0F-5$%B!ɫu[&gX't L ciu>)iJ}WEo§PpױԤqO禽f2K={bm 8g N4wi{֯u5ZNU9*xD霉ܥV3wA44E sfHg2C-xO^%z+&2CVRUⰎKjNT)ag[}-C~.ƩCzm PEM}t=mWO9fKw\fx<%Ԟm`K"b ,g K`\ۼ+ #*8A}rV6-}y3wD(ZݜQ 6cLn IҀ6D.3FM>ކ _;ҷ;,{sد(!`Àlw{:kz'SPNyyA!γ,7X7n w#P:GgCRg6tuq3㒨xQW+Bڠ\gK֋θb)%DZfIBw+iAbQUZڇ׽?_kZ8+>K9_. ,b;(do#PDphdW#}<%N2G"KQ/`5X%g6*Cŗ/Z4j􆦟ڇh _Zyy*FFN)@pkEk:߮Yܵ$;3]?S[1¨XYcS6mxf/0|SLz߅l Ç5䥬v{l1:E_; b)Xᑧ ÂdHI2CX,F@sHkg"mtCEu,-=z̻͛ 7VmύIIBlvPs*݁1ک6pd$LtmiIs .9<֤c0 [8k(")dfU} MƬG^J;vRlO(iOXsK4]0hKvَ`yv}p\O#?(lb)(DIQJV E/t MBք|xnhń>VBWRƶ\2+nx6caOn"1*\9gtZL&\ 4Fgv[l%u(CCq(Ԓ'a Yarq/yPDQy<roi!cP i*xW:w9.2CR9<4|XתbN8p[>\n!1 r欁).`DaWhp[Ν쏯4MpB%iIt^H=4.<]ad~s71M1c[9k@cƆ8Iֲ' 0xR*ލE'd|dFF6 zQ. ]0&F!.5,1:?0GrzmL,w.+}MUs#;n. ë&TVD̦}Z].5B1a\|8<MOeTVƼ#6 /TsJL ь˖^q hF I#)&@sOl"^ O7:mg=]KDZv9 c>:GC8-А9 @֔)(ֆsNEg#eq>7ft47U:V)L\"1^>'ۢ/Jp: linꪁz{Gpj݇ptլ2 j!b$,qh T˟nwh$/M<28seoZ\TX jU_&ؗñ6KVp}4sF ғYcT!F]xԑ@c[~Λ\uA( α2a c:00`(}t5&_>]&ߣmغ@|YҙoE7upc? L^>z>C PЕkq F`j,+N4g@rqoV71XvA UJ Aewvծ/y>l.~ y5n9=V=Jn ^|]X@zcJ8쯄2#hM["J(Tr UBc~—%3KeR^{aspž:izkHa$}Ӑ͛~´NY \M'bMRUA̔#ml([bkJ =\#FfLN#*:mn}GtW&jbL-;4,}&ajCl5HvVK6&{~90Q|"G,~9ģ1%*4g::OV:gަ((Q9elF9m2ݦ~y?3Xѻ.3A@3Xĩ1̩X8V9-aͣ9z'OGG#rt3&'Iyf 7Mnڐ] _@ԸM^7w-sKo\F"jp*۰jST+vl2&xt4( pFQ{"oR[*7?֋J:zSСB((Dϐ ݱ4IWFhܕeI glN5:ػ>ُSLQ1K^ 3JNCA|)XYʗܝ#NQzB3N?#I#wEZh} ]='q]|S?C3U[nMcy̡NpqkLY3|#U>~۱sTÜ9ilž(Tʛ%4O^!=|W_yp>z;&R.VUtA&*e:͕BYؼkYɿ%84}m7~K~G55֧G}UlX ԶokX.^ND@-iʜf ̺lDfС2x Gt OP3D' QMnk@oXzeU\~߬_ǫlc+[:i"fQmgQisPrܑ@+ .'J3L' S0V3k,#?4503B V\!gպr!?tT6 L;H) )G_: ThNG/5Ǵ;MW )45G Od/>S\K[/ znSo4;Ȍ3J,d&w`|`$!( yk KP3.'K L9r5|{fS|ߑIyin(Ūı|䴉 ޢ%n֣;B)6UQU*(4JԥvZiinX.+ww6:<*d;vȊJecfvDA3-z!ѡK܌IcR& á $8h=^wZ>A vnӀk+El#kT'|qs@6GhkJ%U9FZ сP؉3{W/5ib{ %Eykw/uF.WM$?,S_uٛH*Kdҳ[o`)`ٴȲΨ\qFthjL`30' LtJ-[v߿ˇf) OR&)w'*kf`)ˮxἷ qOHRUc9F(.|eLD&&Jr,S(aù\((<7^qE*Ri^ߜ*:Z`To:d*6>}Н52ݹ݌)#R(l!}L i}ƅL3ϼZ"u^Y<٩H!79a"TIǜqDi;n!r}O}MQxiCLWefiAplTѬ5՚tQFEzGs ?Pp椁 !Yɠ\?=!kUf),8Л]*XhWܦ;6Gyp;Ĩ8rҸԈK흢FRXU^Zz=[wPbx@ x>NCFAuBl9ipgF!XA~Y56bc]M$L}Xwp oyrd!MrI4fDLWP I#3}n-˧1*UMU0xvwiUQa1b1i<|C=L΃٦ I8gxNVE)57Ub!7آ[-ū~S;!<6t9sdԸ > G}3G I#@ 5ޭG|^nڊ.l:!c ƣ򲮲Mnq z)?qh4a$]Q#K)5-|ȩ-/Wݦ"2(J 7<гʱ-*v§v? gdN!P3S7z!s ]7ȠJmP$jpE93sOΉbh":tݐR>8>J5#K)ӿM{q\ܳ~,Nj}mXKsp Hra( 1- Jp30' L )<|+Xd4?ۢkT\EΕ· ܼ㑦 ߟg~EcuFt,, IC6@ 02ov.%Yxi^U}huh+N\͍P ް]saS_/(R!s3.'K)Uj1_h{2Aͪ4?A ESh5.htdzfAN]\vGN[ Kp38' N)WK %pF:JY⮛;B-N:Z2hrYg,%+:^c'~Gĺ>ͽu84Na+ÚpDCGIl8tr),ҧ:,73y:Btxļ9 dP1]d5N}~tr]/m! )CVM$~m6hf Gk9u ^=;ܤcj_.VdV@mG g F 7}1ڭk Op3B'PX kNOƽPq `F!/KT%;G`{ )[Zꆘo4ן@yOƷٜ0630f;mGtDoLnK:ԏ\;$nyȚZ>p$95-P͒C~QIvI:M407=mXSY7+wIWxX#БB Hp,yToc-$3 F!:iߢ}j[` 3ŧ{S{iO8k"uSI=ƢO?H_NIhbsHB\`9kX!d-P>|w/Z h#6v;?zyG~2,p0ݚ[uH=vi$4T: j8,ч@tuQ礒YQT=W~Ryv+EuXzVQؼNJ *qfVx/ `&I3`47hﲟx9I%C] Dg Q"͊l>V 02qW8aNj'ig 9;2IOO6m}YCɡӁs<Щl:U4ʉ\b!*AC5 Q# ^S?OS7exk JP *gJK ZJӾ򣷛 YVگ`"{ :P@f^A/[u=7>6V e^`:k"?Q$*]euRos.Q*r2>xʬq `7S"0Qt؋LC]_Y"'I ?><ե+r8Sz;qv-ڃ;$im+!CՐ) ќ.¤m!Kp 6gM IϙI \?`(WKl몯J˩G>JULTs[l?nyD [p{ɜ茈NEľoXk8If]~.o*W]ߩ(u|!z FvXЏ]/%i^4ǘ`r֘L}u\׀_nYoFH MQ:н[x ȇZ2mi'&T_876&UrI Hp| ( \ I{[`~C*eqT=X[Z84M;lE&6l7B鎰_R =U"\P9kT{ f  yjT?8f{OaiQYLF *-㶴H&=C{N' ]@:kj)l޼Us_mlkؐ "XkG<ؼ^WvW ee)I^yISjΡK)lF ;(dDƧ%0Q]@:kO:5o&޶<柎J%+x}`sY.Fp?lN468L ۜϩ)r*:<"GK5y.(5J-4E#oA&Uhp[mQ @03>L8Olי T iH<<'0(D0Rӎ=F=+x߬V7q 7u DD u'&Tq;ы<&_Ƚc7rL\P9kT"?3Q)8+SҔ N]4u7crʱ'iґ1<8~DV}XBc/o ZT~/oe?6(()rE>s}\7|=|蕤|~%J+<,.PeOCNnDOOpY1||[šBA.5:+ **06kH? r8l zlZAn0P y.dM#}ۢ db7;rָD(:TkW&s)BM;zv³9mxNX'̜3pvyj}xVةoywfs.83NRH1P| OX@F68+pzwY\{JvQG\S;R{ /r,/ktsi)<7gDrָD  :?Ơ<6d^|W+Msx(6wl؝JN {ޡXaMIi>rmxB^:ku䥗.zK~_-Y#>n^20jDS~:+#bR+Fᙧ vp9 Q`ÖĠrְ+K0qgz{+׍ph;Q!w6/OHm?V߳\JT첀;9L}逆'hlQ s欱^[e/,юhНkxhvp=Lvl# *h)L`FIcN!]b73XѧoFQŷ`r֘kC)f.ytZǎ4?W-41G=ꓨ& >1nFF%nCtrRh]9klfǏOM_כK]zt7HϚ.]&Y*9tQN=9 іt >O^NIV/yt.$!.5.y`ULmSo^ k:s.>VJ~o5,ac;P:W/I!E`4|yI5?y^R8rָLKSCkt\5^XM??b<<"Q c!ֲ~[^~6=Xup+)X}Z[xFjBյ]e@(#/S qONGikd1JM樼_[KD@tU24&Io:W򹑉Kc}Q;pPLTgѼa.Qdey4H UD`Rwı u \w0WDU@y/&13>O2w 7ʐ  !"A-5$33Z\VJnoeu҂WBou xGfIxto:2l)@iҕFY&h y}B m~ʟ^-{^)YL/ \d V(6vOWH>}K>*C[] NgSB0pg_ͪ~!e(sA&8uu oIytsN2D(ct'] :gNdr1i_6uq,;{d8ʮ_6[qRh  Nw6:G'뒌N9XT'E=)H# IQ.5:7J2z}6k[~ȿ[=mtN׻]5 Nvs(F:11ꍼ]kJc|!*"?'H%%WǍO/$"*ɍF[#>YF'8YT{u-@5*W,Ek=04Qb] :g*IMAa(#*-ytIAf9q\m;ApBX\9kdoP[gcd uG36'7% |M K{85k0t5o"G8Fp#Afˮ5ڂxSvq~l7fÇ2{loD .9&^Q˲K]*DO|1,Q\9kxKZkj 33,`]?UDe)rb@lC8ʙ\ݝBM|ըnJ O65ǻ"aTb\p9k\> Q.XT-71kFk/ 0MYt/FOn\(6@tV(J#J;if~ސ *7}0zφ9JǍns`+YVV3bz%(fBlm<,jO(oĭKU8O͌vMΠfQ1Bԩk1]rS=:ث?g9ث[Ip .KPT:p |׹ܭxxM%>!!Bu輵4u޵ƍ$_I`a{yd|vcj/sCF'%INy[m*9-j\ ճ 16S۶&ƦElj>x,\E?-\g (Pem4\90]'ID ]ۡ}h*̏fPDR3F'Q;dt]bleIB 'tϊسⵈ[tvHTzj3'$pEmޛAN=ǪQh4ZqdWHoGH4iu"}Yi,azbL0*P9ma6I/.P;.߻} gXN=y NgfNoWHXG>rimOqJ4'^N{ F:Tk< k -˳+ <1.9edjYDϊ}7{YZʒ}_uq_ZǍ'g2e!5Q3Α"jk"gdN3tȍXj^W4!iFJ\mw"stoh`Xt u.yOѴHa<,G7crҘQlGVn * co b¼ڮW$9x%|Y: 2iRǮ"djP 3i;}_0O=sHcfNN3J'R\995nZDd%#i㲈Z!ٗCKyċv\KՐWSS7ɓP Rǘм'qgChdI#7HAooG/0$P^0x=Tr3 }';V 7Dꭅ?aLj\|X?sNGJv]DP#s֫ܯ]aKnTU@I3=ڥv呝i*rK ͸4.5:{;190z3fmf- A8WY}lENq [pN.~ehp7<8!eL KxPj%oIv@B -(!)NogW=YCX.&sʜOm8Z(>2g{ɜK  ]/XĜStp^K@_?3}Y/c˛bb8os3z9=}dڡ; iueZ,UfDN)#4-̫UMy؇.25Ⱦ?{T]h*4f7&L)5uϘa̙{k9ix'2KT=, \6Ke%;y|Yc Iha&H@ltDC ɒU!j I/hN{z>QIzIǠXq椁 k D<+W8uXk`-D/bR_-egZ4ow1.`(p82k8%")"*u&4!:i({\G@IJ`}u=g_7?H܀RFA9 Ӽ]_͘}]DR,B8e8:NpV\>+टe2Мk]ߦ9I R/.)fU&͌@wzo'rӅkPgN\)`hwK(ۇ"Błz1=vx-33p[ff4 9Q$a{Ec~=>L! ICS"4 1K;B]%geGv^?eXvΕp{u rt:Q0ɶZ$4 ͵Y,OhVIГ.Wr椡 } & ]]Ijwuޡd Ͳ2D:ǸA}ϙCb ICR#$֤cUmv^9.SyН^x;n7HL͖f{.F\.;}ˑ ֛/1*9ilĦ:S^@->[,^v?Xś)[J3t]Uii St>NaϪiɜbDNfd 1 rq"x |Jo [~_\Ǿ<ŦXS,7o/ [\ փ#V6ѓ@dyM]@{I*G0&n"|o SP\JY#>O]60IH N$88t8^B3ka͉+F8#s}ݐ ږPQBƌO?S]l{p\n:dίe];ǟf"c<k6 1%C&acDN3P' T\$9-/ͣ8G(ٗe|HNұlG՜i䜧H eMYSy'OXBB/fECҤMao0q4tzܢKnq޶> )̝#Gp=55.P6A)2F4:a7ܣ&UEO$ o+u+̛n{gyG.NHN hu%Φ׸TɊZH¥4"jΡ6H{cX ICA;1-:jlYDd12/iRW,AUT7 n104Ћk!{ g\NC+P(KU[ӖDP9Fx4=Q Lů7F(( N+oz=t|y<$cT g*%4q)G2p#/4V{= Q3(' ʀ .EQ5/>cY\n8 NW`%{@E*)7uHRtq=-usI 0'P#>el~NU77Pew$y=ۺN׭2MZ̐>ڧN\sPƎ)#bxDaߌIc>Z)-NKh Z)C#gl!p(n`:ux]KsG+3c) #`JRYMTwȬGU *G$q7s4ǽNR1sn\D2#7@5 -.mgPN@W,^m3ۍrK(S)j_WwL#'h 1,ybG#cOk简t2U%6Q!:imRi8Xo(hY4]fV)r6$OBb#gDI#2ͶVꛛ3lhtS袷BލϱjTD!:PHt,hU;f*rȼD۽i$(#zLXAX- _u:I) gqz)&twKd]s]8FQ%*UߌIc<iоdZζ/7+.%Pg1_o`hrdɑ=~59]qhIr3nBI\FL1&h&'>4CS'hB:uܢNYKyz^.\fzԑ8L{ 4+gpD%r38' NZDm ]3B^ .~,2uⲪkn(vu5,Ƈ$7$DGb|6c7V@1>#ޭC~&cr.!uGԮS-!٤[?iNDsFi :#^7V?"f eζ^mIVniu`bI.2Hˀ95Wx|"muŤl.y9,Q9itIh_$u׷WNtM݊VY5yhbPFK(,h)h3I ޅyn)<Й!9iH:$bfs&P^U;R# Ԛÿk=r^vJYosdIRg}M=D#C+߁m3@' PO _~r殮I砘\VB9}B?AB4ڽK\8N^zkˉn\FT!z|h6F&LR%QW;@/taR/!25*u(c,4'PϽ *q¹'q*:TZ{u84Nq/qJE'AcnPGzKPƶ]/~shu-TXIFV=г1C3M`HFE;pW,lΣP"?ne9*c]3NSK#xqH j^twViuC%54KT!S"rD#A`Jx۶ǕvPUSq* IFXjq(yنV ΊAt"Lx[cʦ>`<,ۢ==]qA40qY䢌 Y%u A=}x~ ܮiW2Zlri EA\ ǝ~>J_M;?썞C8iF1IGO:@]3>'OZ%ou1hr .2dt ypV'PkyA5.J33)CҵoW8:SP9CsE"|{]Q}[7oys[-Z\:}K.Fb%'OyI0qnu-]4| .rLSJ#%Sƥˠp^1Of+F(739*Q9it&x~|8#c oWWr+3s~[}-jW7 ߺC D|V=RѿFv(eCiq|v66A4:q>I=nꛛE^`^ pT`,< 2MrWYC;I,߰_ \ptpv IwBA1s^3\ ȦbW*q0vzm^N& 63; :m*dLt>[ 'KvVtTUѯ6<0ȁ4:qT^+h*zN Ӛ(L-\#}l9"Vm5~|taC2xSr'M3 fsRʹģ8U%i"F)ZU 5qNPj]:ez\&K~,ӕhHTsonUk?ˠ\D )C>(K够[SrЖVw[< zn{s= u_j..a~S%h:ZXRP9CseP g_gԨNjJ%^򳏄HB2Y+&:yWLB]C|bM68Ig`N AdIUك_/5I#xt:XAp$Q;dV2ju trԍڏĹ4Q͘4&i ϭ1yެwgi`iALY +DӠ2c !>"SզcHXq5p5eKp30' L%hAc&woĸCK񶾹h⪧cjj$][$M ~[)KyxXWf`dH[LjG9).A'ni-O ^Cz1E 3MhwEVYxIĶ@vg̓7} G:s΀kl8Կ~bh~@y8ח&."'l9v$u$ǕCᳮ!5|x@RTl);>&;N[O&jDD7N=jJO=.uቋ5CUF×rgqD&j%Ymx';Ҥܙ;vӠ W'}$wڧ:}%SƦMro W'ȃTQ.^7Vx'\j%nq /6>Qr2/O}z/=n1s~"ߌIcWAG w5~4n#_s kBuQM" y!(N6H##pدєp6qh22 ȳ]CրG^DMjP7$oqu(gj-m cz:q fncH{cS3l4Dq$Ï!?ߪ<x+M@j0mJ'LT+[r6p)9Z&MS4q'󂒃9F%D:xvy L s/כHU <`vM!GŹ˸?0 S{yTI<8R !C8rҸ}+nܽA]R].zo+jgEȯHB&O6C re{E~c:i{+T|=Gvȥ )3U9e`z%-T4Ijo D&U))G)a4qOnO0 _3"MtB4b+fȕgNPxܞe;MYJp;t(MRSD#@=nUsS5UBoeWшSx$܉svȻ W2q7mO9əۇh9&1θ2.큒 &S̰KCJ;*¡֔*[O_Sg%epb0p{7Mm U r Aڬ5TmjYh5#]Vb oi}P@}$'$RK}FBWP?u5cX%#uMUhgN? PkLޢdMb%2<4Y].]V-*zSU[K9oRK#P򺽈ju{s#Pq.! yaj1H79_0 }d&'X7֫{HLFZ.-8:q˝|y!e9n#Jzqz?"%J#b 5`ihp#0<3YyN^ :NMш.P*iGez\F.m=9v4 6LQ mw''M7'Lf5NjQ'vY#!2mQ]AyhI,⌹R2e9 wo.p}!l8i\j۠1:)gHxd.?$+ Ͽv3%+II%e*Vy4YNe <=;N2+ eXj>"MdޗuNHv\a灡o Zq'x%12 A$CT[޸;lq~y|kh\9klFfD ՛.&s'ů9nqY4f>tg؄r-[ ̽ԧv?}& k@bk D 5>W7tM(7DQ!RW_VjCu_O:'¨{AİA%UuwGNH_I "(sFhhmlmy d&ϻhB,?m.FF^UZBd[t,G'lrHr`x03ɔV;%^/ Zw]5>tөl*_U|; ZRE4ȇ>Qu 1dqY#!J=7#l5IXlFb}[cⶩJ FR-<ҀxJZ}l.!m9:UԉGSlJ6F&rB9oƤ`4-4 6;s8Xm}{d@ =NBC.aJNvwH͹z1 IP (g JdrJ(Eh 1eD>}lгm4_g1i;ノn K} ;a숢[9kD"Ip.ͦ͞cTP*IqU4d'bûu mBtQ ;3 -6=QOh݂Y#i݄^<'IHyN79ؗ7+ЈfEea kX:Lӯ ա8\9gt&|B2D?>mMe#/#|UUH@ +B:jJA.М54_A/} 3gc)@ i3ř:8Ρ zcTZ }p~ZY8N(R (9rָD'S߮~[OFx{!fS׿!Gs 8/ghe@j#M:.qM*TpH%%p类l 6$vwkcpwuE/[uU.ѴX{v)@򠯇rumT\l`qpD!A-i]zӳ1sн\YcGDE(&gLF'D̽: (A!.5,Q5Rz.@9bi^edLxfC9Q-,\z +1-ܣku2aA/m >gOtp2Wa;H|kAoPlhx&#bۋ.JblM%oIuܧ:ZRdjLt. 5H4#IX[Ys_"p3h εn<25*h/PSiOGP5>:fŋSI!\'غ tG-07M\0H={;O:{N-4cfLV|V6Cʛ yY1m:ݻ 閌wJ:JLp -U`g9V`n]]ܖێ4)Ŝv^GtJGs[듇Uw|ׁ\wָNw̔ˡ4N]`waTF0 uHO.P<~w?,$)Zw9C$g;0w2ּ";}( 9=c>4J 6BA/ 5H=4פJ ܞ?'!gգNW ^I7b'3n] NgS8x|~ugR%ΡΈO ȃoDm3]ߩYt`J"l臌-._ mRY"2)|@>WwۺA;|ȅEna9őfL'vPnVN[ŏ:YC6`^+W!݇%H|@ioMSu e[cxwO9 P5PMcczY1'Qu%=8xB#5.!ڨ,`h 0UbT\=@3x9H,g%w4d,DSg[ P1mX\p9k\[N".2@Hq]=rXq֔/nj`9 ^S+0O.ޘ\a5+wP 6g̯̈́ ԟW- ΊN b4R|.>=ܸÎ1t;~Ļi+.s/H_uN c jl#TM"tqz#^| D0V4f"_>\^-}5N$."v[cSdVr%j-׊.Gp=o.^tLWBSE9 ASDŭ=bytFP]?tz"{!`i9 A-5$#B2~no%8q'u_FG|"Ioۧvm ܞw~tm $lq!&JY ?F+ (#][;ǵQ6ɲ(Rtl$`3Icy-Ә)eLn4H F)ycpl^Zge7l+bg*;*jrb’*D#UFhy<홺Sp9QPsdz`TI1em;qZè_/3GQ/>a&43ICPŵ`qXD'4ՀT6~&);W֊"Y{sK`XI>uT`;#>q ׀8E&('R=t$]̿ Y\~ab=zl+BlFk.(b1]YN g;JL]ФSbY#-عHL=/\.\: T_sc{Y ]cMBz7x!GbhZ;mj9Fkb2Y#( W#q~Oʸ ":wv]_tF4p`'; 3ny9ݤk`Vv:pT@Y\&[pwk~ܤ`[ج /)*vB2&%Ƣ1h Asij1/&}ڜVB^h\9kpZ*J?lou4UWojhxx'Ț6iwp=}ͣAM5✼@hC]:k:7F6ϊrjݦU)oWW$xwM O:jvlG S}tqٻ帍$+}X^ȋ%L^+<$DZte2 dJ4!Xay Dܖ`+1a+$](9ײϕc?!<&@x$q}*>"KM鯘țSx]:k:Bh?}u}[Xz^4e/H j<$+u;A ȗA yMM84xzR9h]@:kȀ|P^k躬_ gYu]ȳ:s׼?pj|&=ڣo=B)&\9ghj\Ytttz~e"؇6dϳ!P3D*r. ߭w2]rʙfޡN=ٳGb ,R 2gLY-@-31(䮝7g}`۴S&t2r*N4\!t`$G4h9`aYWD.`S{ 24뿆uל /]ilꑒY% glvrk@ QYvE\NK}~ elFq .LɖvtiW)Z= xPIn)}RlB]9kx¶(-'ʺvR x I%j8kV>Ń. rH|7 G|.HXk ZJa@ݨ:<}m0WbgE(3/̬F!gh`TKxkM7OOGGEG.5@  iL<c|}~f fcֈʚL;8 .H$ڱSQ lv-8C{ҋ=lap G VD$ W+P_ _k-OxtL'_t+=T1nǧ~\CA.509SYJHXȔ7KCdW%Kc\uy@i{9q2erCk )A[]efJ1)=?.[P ,g Ki㤣_m.IcvyUÃ˲5J s ݆:7:q"&} dB]9lH -x5q㔳Z; ~ܡˇvS}yJ:`^?!Am(ޗw]]5 ;4WnGj/cC-yV&{eG9q|/<u`5 ҥBIx68|_Wn**<(!7l4d2 wɀΡO4{LwG&>ҏ˱.5Dq9 ,Iow2UN܉=w6kd9\C%t@BrzxD޲aYC^Q~my2?HHi84rK-6Hd)P9'^h ^4#bp "gH†.v,.A'yjmHzãQ΋yG/f-:Tb#o.5,a dDhC3 rԽfΦՅ8Xױi?6wSB*?vtAW4wlj`A/r|, uHT>|Ç^ud *)rVveݱ揇 }+/tVDDLu:RWȾY0}}vVJojXwAQjaKd6އk tZ{ $r!ߖ!2R_xP^W>R'=g6`>yLtcx d&2*dO] .Vn7Bzц4~+򮰹4.iA$,AMK*7o)i?caقYCF[+IvŇV'knM/ҕ,^+lJ~eAMSwD{}B\9kl¦)'_5J҃ xȔ ɲzk7^%:qh=|Cb巉H.G+Î+ׯ )u, dXqN.ɸw>q^E4`Ѻf6}/|qt۔%(~),K"2II(ȱ4ow:\$1NTQ_fDpq:YT!H /E!7Djr3@CMYHat|)1ͅ?kJ0hx#skj\pi< kUv;Uo:ti#qG=t4a‘@w:#bl g H pal,YUU~k^-u7w>q$2I#a=L;tySb1F'lVnK:g?ufwέff#:HIGA o쾫ry_!ƊSqdxL)tb䦁JA,FupUE蜽CtxYbi4 ucs$7&/ Q,‰xJU@)lF"ɥi sˁaVFd m8qg:!4\9kp8.izbĸ2,ޏI|@ZȠ%)wb6}/jRKXs) 3rg\Cgh=Iw8*S˵84^ElEr]2MrE 1/X5VqWd9~#}xM]lSq=P6cW톝-~m=;K/UTQP* Xv!k#-`_ @v5&RzCMT9 "$MX6m,ڋA9 45<e \= -{!=r]ƫOM $5 bC66<*Y#S>RPSۨi; )/7M0x>rƾu y u-vyZ?yk"`!Q#<7;d|aDoբLXPqz{wmwe]Lͳn 9ykE~W|G^*F^Kʞ@E;s$b,t(SEh|$L.uY8_G7,fg]f[ tN#$st!sbNƢe*u=. 2C(*\9chwgI'O3`I=Vv].vh4Cv&bҡ/Ci䫡FotERo1:F.5Baw "?Z3yS?`[u|g{A/ ^QЫuT6>z1D+zlE.5>a}ZX{(۳Vغ{yE~=1uv19ǺSGGVD<8VG8,x l9&UPRI7+WX.&v˦ܴ_w\'l긪$껊>Z?T-t7s 9XTkCh,s5FJg?'{E#H]fW^.ϻl2<.ꍪm(b^l&”s.S/q)!鍜MPJL1i-(!j]2",TmW C)csӻ؀}fF?`r(B㩤ϸgŁA( ai]pQ=Ͷ͢Zɾ!^kx x~鋨E6EGyI#vc)F)G:Pe}Y6ucn,?0Z%D&zv\ 6 Q 2}I CAMz')41:i \2B br,WY;I+"Nmq9SSo9$/[#47TJDsI.(c*/fLzc[Dt8>~}L^1f᏿$@; TMSmgs?U==-xl&BRIQ!5F>TNI6/,E8rҸsaB>TY6M^H !βdokT ,StZb$B<8[8JA7Hu>N5Bj\5B I 8"8zo4s8tA%3X>gH8jxyh: iQu}k;"b3@' Pq@e[ ]'q uhr [|8ܶx N 9OMO1=vQtm)Cu>ogF:]k<0FҦN<7GFD۫7od Q3*'JX qE%XBFsӢer~DyWo:sc>-PBQƜiYc0a)SFu7Er4Wˇ::OzTg:e$v~!c.]uk:n !i $VR*fL)вe.7*GZUﻺ))Gj$=Ρݩ(2/04.W?}z;죔Ƥ-j+X|uDܔ>zx9AIT N Vp;9nW(rdK]-s( j]zR283Oy2jo :*3י2I"!84NaGC1j<>JtyXV:=-,Zx`sIe1RcxȗȳC|/~~?=\ xc1ƨBjU&]q:/s"UɮM;\ë#>-K4N&SY1M.lH 0FXr椱+#Ni )c~,UhY(A5W8VZawU]9(ezˈzO݉ s #U^~vU8fe:f6^(VsoI2!>y#SGvs!jxJi4=!H^3D' QX# 5RAS{wP&^ox[(xZ}qY պ3;NxZTD{"=k+d1g H1 )S& ~9 mf__ !J4'$)`yFg"/t!#.Ⱦu#;q.2{sg A34' M u'-!\"qoޜhw Ʒrj> 6ZAٚXʠɜHEs"!c):/a>N!S\,G:tőN:h¡3E^('Qgo7?;CvVN򴍏#.gRMRDLuAYeј!񦝂a)$,S>oBBS̋%CpUu޳uo_t(VLh&Yͯyz" ^eс<^c?4Xr椱i^V[3KH:QqɥU+?c-{,lI@HNn+H )g=äԯCDP;? ID"CʗJw2@uύju[=!{$LӓԽb0 eeR.ϩcqU9f CID[Oޫz}IVo ҆&1H 8pvjcc)(B7<ڨ}UP>We^dz[ 3/2=,3wRP2:5̴IhM8aX,F9CsBSIï7ߖkܡ/nvӵ>n eQs %Mkz`t'Lyd(E]NAw>xxr/KXv1:Ьmz|f40 tweK:dr'$'hkLZiKOC¾7o 4*9E0@@r1 /l0a٧m;!A wt/6%xudqV$o52DS 0Gn Cb)$`!,R."XpgBu:$CI1~ԯkau4dH/ՖL01 Fb2(BhBk4Zn|\>2SW=CfRc~V||Kc 9EA!Y 6Mchc׃ca (ghN\K)}>Cw9̳C(s׬ܠ^8 NTĩUsl}.қ88nJ`,'rX,:sŐ8 6|}$3x_~'ZPXqnč9& 79G|q1q/~AQS"b9(,,x|UGժ~Nßȏl`\-78WF 3 tA&R;vӤ;VM ^9A IC!T% ޕw-xxdg5v(}.;* F3_*:8@e[3E=z N P,b3:'NIBlb엀NϽfAm^^ϫeYCg  {RБL\ ޛȞ3]LD|Eֵ3Vl\I>f[a 2 Uc {ٚX%PFVWGG&[vK^ K:ǀLӤK IčPXbh3'G\ ).~^6PqڻːIIYao1r.D7Y z)&*&oh=$QS9OrmC/&.( {nVr]Oo Ûuõ,ؽYŖAh},/qwa&)"#a9iXjHqxKp:!+廪z.ï8O9]e2JuJL`V}$KE.Ch,:sOЫ Uq5>nDV\ҘsmDܴSf +' )qI!:ÛNM깢)۴$y!5@i`'}=uX qOi \>e"{J7D#{gdNR8i|4KbʅɕP~k`ɽ:\譡^ M]BfȻNw82Fm\q<x+!4< X/ېHo W *:#;ZE>+DU>fQ|NaW8&fF_Rqn_c\E^b2SZ-a^z6E<6E:4@w'z:<(I"~(yNE˳.'Ixz$߼xa cD9;dNtJ1ژgNBR:6xJFZ5NDK8aãt{*QQ჏'&סF~xEt#NpY]De ZNRڡgXN Nw^O#ܣK{buh:}P+DjB2 yi&:\d]ӍشCĀX pa !CGf{0O3afjsV: - D8XG`)5*C76F&,Klԛ NKl߰/Cyß?/כ- tč2A̵M90eS<՜Q`a3:'NKJq7OdVݢ`t(2F_ [Kk]Xs?n]k,ȵAQqӊ/=sܭL^vfKMQda.:<Ti\a/h3Z#,}4u -!,ǹsڣ+שǩ~$Y 'q桽7(.XKcNqJǙc?H&фYS!8S3m{SNh6-6FDt1߮K[v|9t&8' ǝARa'֜I +ѩ]:"O5%8&5VXM+Pe.IGjʛ:ES{7-.l_caN8$@hu&j L 5Ӑ촌,%8FAdtrbZA$YULvh-uBw)Savhz97 n74.5*a?RJY=ozώpJU_nt@`~7]:x'`##\M9D JtA.М54qQ* H}G\?NJ*o0]\%Pb|n=X6e0 G=9R w1 pp~m|YIeXyLznyyiyӝk&)ݾ u B Foq9M8aR4G8nlSޤ$&k'H{,E"Ew" Btڮ#9(.bH94%"졤-eg:epŒNXLMQ;[tvQzPR\\9kp(D@.u7fRU]ޕ0.A 2;\ -{\*8ce٭iϦJv)qY N` 8g NXeWۇA|l6(@>|f~^~duIɃ5p$֧gzq988{mR9A`BKaT~[WOIJ-|xt,:Uu9JAWREyhyhdН 6]y-y9dN>(|jUtpy|Uina:]ti}m]\z<2|كn׍((LN9#)ǚ O@:E|Pp RgTXy[DIUF+)oW[@ [}ԴHF\WRZ0e2SYx #yc#&>Ĉ; mnRѠ:ô!C!e4tmP`/`OHr.>'O}}O s次IO,m|Go'EM ‘ѿzɖč}NPZ!e痘?ܢ:rc$!,n5aŷrְ]w F[*oU *}(lTK( :D`MC`]u9ePJeO-1!,!.3*eC$Z}F\vp lG٦&קGH!/RHqSpL-5VCGbSxgƒYCB>Ѧd16Ӿ@݈e6ft3.38(r(HMݬ/* D9[r̙-9n{#YS!0Ӛ׷wN&(ü\*m.B&ؐOKll1mQ.&Nk>z4QJ,olZ Q@ ip~C a;h Hãm|_RDYA: 7.ARB\Uzۏ>z:[AzIX{nƬ F3&39G U&S 6ωV1hCg QPlyc"c9%(# jج${dhLQpgݦ:8Ӝ.:t0PP2Ÿ<[W?J ]N&eM{܇n;"(C! aR9F짲} 2gLу?OͶW0V[qH_%N}v fN#TvNpǘŧuF"Kp 6gH 1$xGnIm{ D:K'-fSˡhz")< ^wg w]g NvC\9gpma8?wt{]>l+\ ##}zzJHyDY:PZ "O)=[:$B ddՎaݩfCX# KGmx:pΉo uҢG^I(wܗܾ<|L9|pFExя.#Lztr&Q}2gJ) LY^#>78/% s,\3\aW[?tfe F"0UKL~5yL$ӫIO룮Ǹ`s ͨu̎9O4?uz& -.20uO%~:n=W{%Ȉb9'l~bQz#6R &AcU'ZCpf^H[s)f7C#(]rH"Ǹ@s԰RX`1 {r]Y~pZ j*F\[" mfmǑ9ϏR<Pl[* 3Qؽl1y7F xAQ #{{Y+*MeEz92mIqC7,5 ڄ? &N?!sA{˸ ΃&$(BHZBȘƏ"o,J1A7m˔py텏$[-mQ,ّ~7>&Jkqaς;Κ.(5J54a]2b.yhbz׷mĸh6,wUî6\*p<,^fs0uR ǥ.˝] 0g L 3# )S~Ue1F3RzQWwZ|i;:T@ B!)G̯רvp CYAQ{8_mA>f6tjdG*CWRɿb4L4.ȑ K;Y#2SKbtJjgv]횖B+賋 7w(n}/)cΑUؐ|fPU쬪qqD 6M;ݦR&7!(чsPJd.=}5 p TPnף7ߪ:Ue*bjo@c,n"IT7čI0(lթ36t62B]js;]տG;C2HF.׼>]UAS)<_ɢ]:k n~ޗ`1B2*u!Á֗.wFl)À& mM7ӢU C2HG!2q.38 29dm+z5x)\m/~)C_B.75k:ŋSw^C" BUW0(@sPJq2f鲺-Rs5y8{O\$+ 58=K7.0L1h"iT7L0RB+Gj?κR.߃?T&,;tIP .gKKEQ o(앳;ރ9NƞZ,q3DӽPp,iwԳδ%z oAKH)~_]j3;lt_ZAA۔Uݞ]MɷB)ab}YF'BGϾ ‡"2:'DFX ׯ0|wzW4e76=ҩiG۶,KDh}Nz߁5TzIoTw>-kF-5.qA#u.𙢃Uꆢxvj*z!bBM KO'A2@ Mr; [_yR#*K\sp "H램mjV ui bJ/7u .\YJ G*Kib+iIn9}DɒC\p9k\ʟtuO ֐Yyaw=-^>ef,Ԕ޻sJ@)jMYnUxt)>E *-(i@S~E6OݻrEep)/up&^5; P51ʉs uσ*cYR.S,S)){oflNWJiNT/'?3{59=yJYL8cY#B5 A^opd ' q>zs8>G]KD%]ȰkX{Kմ<{10Ds \=ZĴх4 Qp RgTKH&:@ꫲEx&UBj~c AN[^gNhIdct²gHdAv vZE>o%ɗHD£]&x+}w@U$hx=;MUt>&()nFHȡ.5B= >-s|`KIa>A9uB$%;IN:s)uzTD`SB?.OܻgVDL1%nydhnOu e 9oZuy2Fd_ﳇ`s$'iy tQX\9klF-4Xc3kaZY{^eN|^k1c6F)ٻ帍d+1 nN$Gm^Qa$!`m 2G,bqr\٣S<1JE qbgTN*.hhT֋?7U ńfbXJ甈La]"@M$ԤW Kn֗} $MQ IC7E ,0# @(9Jne 8bU QF, MӪ$3c-ܕ}#u{t=Ŷ4@aQ$a2%M X p=\-C6M7LS2u2۬-XyLqљ!) IDBX%jՏ[ ~P<_V;_pz bw# S݌DfV xꤡ "kA%]b;!j^mR J#kO(ak~e!F̀4 a+$am^6ڡ~=~o ݳ/\*gꁄ%-#RV%M6!Phd#Wt ghN61c9p _>is6z]ƛh>wnU/^:]}zPLX.%PqUzO83vb:i:k/ ?tUIJ[IJ|e_صUuΟ9 GI8) 9uIbC N˞Bb}IGz/ ѐ.vwwoJ 3<*g;wG]'Pԩ*ފJC::($,y4mݼ[ŕWz!nHqg{M.%joM,i$hOD?uw.4009et:4$%e,n ZNr t.ćeU ~d!iK YMԳ!GɘRئnG*#'jpbL,8#sapi]\.J4~R"Ab8cnL_*9pm\GDF{u]|^s;JYy꤁!cȹa#18b gH9m۲f_zHF^9rTfJ8/Bڎn4z)4 %q\ƈX o1whg%ο[^WwMn{z[4׳2[`'o+z6H:2VBlF5 GG ]g\N \M {7tΪgd`"46!0K:IY(1Kn{A&lOC,E5CqP-D)Bѭ .fUW=ov}W-־:[XɤX.eEǻaw_26cqXEL#;fsHm7 LS~[?~J+EH9-%?p,8ud^S9r3`[(gdNW>m/6f4w!Iރϋ.0fwnUe&$*DajT0N/*2hBD7J3:'NXHc7|sOU{3 ܲMЋEZȽZ3ʓ! bo@eHv2+e T(PT%&Vœ9itGژ-.׶䰀<1`.^vP#}wդrvq'rŞ%F*OIk:'3봝/} I:.yS{/(w:D<rЏOI4K q IVD2><`t!qյ%Jc #Q8on .ח+TK;¶(Nq&9 >S?FUU1,V9ix¦HJ;bͽtMjj(޴B uf Q-Q+<\|P)9p8PϠ7crҘIqڮb[ ޡWbQ p .)M:GAx71 /U>Mρp4-i-_mbiuy/Dc}zMS& WA,YBS't,mܟޯOtD}vÝ:i:ױkW . > >1VB g{\GۡBf`i_JSjpvBz" I"2^Kq48a:v: c 4IK'yߝ]$ƻdT EePI( HgxNDu%mnb$vLkLqiq1mu\׽]_B ף[hʓWXW+3D4>m'r3BF B٧vU m|(SOXc/s Yz߭6[jI ͖/Or6PXt)^Y7CH!^ 'p^{/V0焖KڭыRP4?_"d#@uh8 q?H9(9ilH9-ylu6u^b?~c驠,^&CNݦݡp4c]kϺXqF椑 ۡ!} omѕ ^zzfj3X8^)S)2ĩ#B?NJ:8rt3&'IMD7 %S3Αr5yVʫ3#)O1%Bl5ۉR ~'Z"PT?\ 4HqGSd ,v]^.Hh7׫Kz۳{Ypmw4^Ww2G'Xs"'yȹ-R3:'N\}6JtxegWrZ= ,T{ xG͏rn NJr1M,40aEQZ{\ǴM\f+3tMGsI^rYn hɻLR';,ExyXy><8#=Er3D' Q "v&h7(t RґZw :M->HIaQCOtQCc ICDZHc.~0L&m<Cc9ƨ&6o]b7/ _I r"vNMYTrUAFhqպ(yW_DUv<~I >cر_'O1z.47;JG=^7 67uŊ ?mݥ^= a39hG;WGOF@ze+gN<bTbr/اYSg~ﱃw~g2oHi 0o$\Rӻq'!OCc ICGZ,,ݬ)woYm2jovO n@Sl=Lp:|1M_$)4%P IJNh T/K,3A r$yѢo7@ջ@MOc$O'  =>$u7a48q$T*E]vH ްwml\om5aF .d'P4YJr*mFJ3BPK{s@Kl'p2R ~S}@2iT 5a]FP0اF)w͍NǜR9Bx|Tz`3v\ɓJ>"b IJ^s@ߔlK#cz ?"@[XU:%6{C`$#s-ADŽl$ov t椱HNjB>QSv/ju ̫[u}Y b6Egݤ#)--< 5Cetc$-<6)(Ʀ!ljXhܮeXcY$|.ꮫhG{ic9k %rl>sF.AU\r ° CdξSXvA1{ΑPd)p'5AҼ"1)tq ICU"T\ICzޅq;b|7k&֜r_򨆇]&bґLy5ͣƷ$4BaSWac6w3?uX84=}mOe; ܯtCzMlcЂˌϿ ,yb.v"c%F)G8v/\.1^(GJ!ۇ=MwW-EB#y+#y@Ķ PkQ0C/S4&(9{R3:'N"3v\^9KƝ23`T}z7F:X3@᫖]Ҡԝf EJ/Ku? ,f<7@Xt k#+i$8@>B?՚]d;!t!ŃKKOW8 R!T{E0?#y0iASt,;t( RCbYv`Y \}t~{AZ#?>E<Ypg?e]m"A;'r34 M֋ͫYf.mYkiɺ%#zQ;smn3;a ,yTeNWmiMY{5($K5hAhxG5ԇ8=_Q.2{O+ xa {$1΃ѿS\!^MSmV}B1]$ם7Q$d,9^uJJ 6iz$IYlsE3A}|՚7۶C9F@invSb41o‹>u/>wN tA [$gmBӄEW \ g_i=X.ś i:Po<7t5@#gq$K#8$O__T~ϊURiу]j)7 y/-2Cgw* *rr qOtdIz)sMBn{ t2ӧ yꬡ M鱻Pw_;Aoמӫ[iˋt"/ҕ3X[Nc[Hfj] Gf\9khf!T w鼦ѻ0؄oPWGë7Ië7MȎE4 PM *Ʃq&0lKZS""J2f]5c4[;̰a`x$ eh]%^Ǹ1$)'l)u*`Â۞&"G~o$- zG-MDLDҁS&رCsbɾ]qX\9khz=) ^4;pnGq1uH#ɞ'5cnWj!Þ>q$z``\9khNȁXbnyU oZiRB5 (%~ziG΍:=Qo?ow% ,vH?y;B&$\:k8>} u/;Pvfh<҆MZzadaC̚G خOٽDf@lwE16t(G}s]}xY~ @l=LmW-֟SZ#c(s' g.zCOQ):qYGP1(e?kGToSY7tAtEߥi<-iמ`a5KKl"UJ.=-p3y|ûP),A.5.aq21K .ۦ xm-O&JV"M(In\Z*Dw%>%`T#0hliշ+AZf[u^b36 kw ~|$3]sD}IA zAꬑj 6X}Nns\(h8zCtv7iO^#XybLC\p9k\ZepRWK҆N|ݝqN<{xG^Qzg#l(Dk4r NY#EA C.u ecoN3֤ڳM߄QɼVi'aRq v*b'-P>n2/31Y#Z65~{yxmw@ fOL~(nquYC.9KCmOiwmaש%@&|Rh"`t=RjUJvx^}/g oS_]٠wZmF@Pc\9k`)(4N>µּI#4"U'I!w^G1>,h͏YCHPH0z*ՐAl3賦II.5QC|&ߙJzCiQ>BOzƅ#itm7.5.aiyQv grMr:W(.iͶ+ch.eguJ-̙O#2.P '9>t$]~VFd2>B/05LaU%oeVQlоrE,bEn"z&|Nky;1\;ER8[ 9kHz$^u;27x{ qnoWG y~'9|ص;-c|͐aȥ4xJ?H=şl8sNFbɭ@ %}:+>Pq^?OE{pvhNp Fb.9e);yYOhѩsPs +,#ygH`B΃R>~sOT8kְr&KKٶi'8uiBd6$0sF/ZBCs42!.BD}ctFeV&SȌp*N2HЧJTT;W/S1Jr5>BYCC ߂f6?0bt>Uo1`e LS´0GߊYAXr欱E㵄ѺljqO7S\TMm8J1Ʉ'Y)6ВJǪrL=&N K쇺t RS}4WO .T!/b; z~3h)!RwJ ]agDxfci]X؏uAQ"'?ox*'qU7wgmyLLA!81S E`'Zi6_Ht'rNSUd*A!y$pXU4z( T<$Ce݆s9 H`t g H9hR#x"@ÍaqlV]<'*'}9Yq|Oz<ނYcWBk֤[^3P:'޴ݗ`m[UnEJJ^k@v XCN\15kI4v?h'(s} FgQ EUxOVEUu7TEJX6#l9zMj.r Dz.% j l^hHNGS>8.5Bq9Թ#W}&zHonwsE֑e6/EhvO?WGwg -͡&93&, g$c^˛8nmʆ9 kěǺ~_ ILݚ(X1ezUzUo1zAπR)x^L"sOYD"oQt+ӧ>0~uo.NݺJ=] w %h% jru-%g>ſMTA[,ԍWl0'iuzKٍr5 =Ã`Ͷ+j@su9ܺ\@5TbUN.U]5<0odUdgQ+O5*'wEO"^:kD2.ʮk=P\=:SA] H_Ծ/}.  Wcg.#jv@PD"N 2I3Gn'ä<hRVzx[Uh7Rf=T[xo6_;!s 95Lpksه]es$Mb]0:kz^9Rڠ lj!6pS@1H{jТ!f: HM=Oƾt(?;+7Hp ,g @ p:NބwUGO+uJsہ+t( ʑy(z9zl.v䟻PsPoaY38Z]oi&(UzZ0@8mR}eo)sr˞\xwr E#]0:gFpaB/KL=PCjl*;׃ݣv}H<^”j{a8lU~@+n9ƥ$\ \M?OxtJلTntCUʛ*؝Lֽr< 3V*|`|s[ìS~э1(~VEa/K03z¿^{πy4c|J.oց?RX R}-LT5Xq@4jKbO{>nl7),7,Kyi;b_B!oЊrQK{*O £v|cI739&Y#VAjgG2e6wX&d}ؕVϵ}aZog3 :rIYP+yE: eLyx60!K>&l~OM<_\b, yA/*^WNT/ n+n_o켄d.KLmK8 ,&J{3?܋va ; "U٨Qn:p\E5/N7rj#z Cꟿe n]8L`쏥6@6]R@sLiieKR9NGux?Bz4.ҕl/ܩ[Sj!ď)sdBԳ~CSR箈TVTUDs kԦY(*8]kNbV]nȖz0戥$,B/iљ顾 @2˽QP"s脕2ڤu a/,?6P6dn72u2 HXq.5H|/C^eSFӎ6Y#lx\:ecN%Z'IJ+..Է[rXDtJ̴[N1x?kvD5$`@RK >gVxWos/RJPtu犯46%XFqgJƆWFʗeƂisGx>05k2aR8Gc1,t-J,lRmbƫא8}jGJ\ ޷?W/U[ޒs~dYSBt牖㊛vH(BR)eQOp Fgш 9 K˶"OaOFJNhѺ\'P"\,%r8Ӵ4FLzcr2(8s͑J Zk(ߔMbJSAZ{)@ *yJUOd0ti>u;2i MP 6gMI0G}43٤-SئovZ^i:|W%akϛRNK+Ezk!AR`(3}?<(0F( .fgw4Tn~Օ)0tos;%O#Z%給] /aq޳@Ɣy:ex[XЄn&H/QY3#ǯ \P.iTU58 FH[ <(F4rziN?R8 oAi8h\5{S1at] ©-d bYXbiDg%Jׇ Ppa9F%ZnpUfΉ%\~oGźEUqfO/>͙u<6-qOoHp]zx Gź/8M jr-n6Sdl36+zA {K X \oZ4]ffC3gzPP"\P9kTHkkƇ}#G%I%)N)o/f(xll~ ed#:=AJ4gOi#wG»z(^o'rlvkxt0߸q .C-2H,iziG*KzyTmJYC3"4už 7?- +Q4)Xg)-!Ȣqd:@lƖ)cL6u;&ldƎxDoa`1O4G[}kKFOfubf;ADR'%ɭa1/˨}o&L4M!CYT2@mpsU61  Dd@>@.nٓs ;1{NGp < =yg}[&r @g PXi+P&,%'`ڟufx j[a:/w{H=x{GtثgzgWܓ3ux\,a90"хsՐ3Z缗vP2ƻ?a>8bMX40.5>q?䣷!hVlbSqAc싔R\Tz}\m*ʻ\t:fԳ3:-Zgd=r驰>s*x9) Kp 2gL\EMsE֏g{!p7@匆cX~.feLmP)1ʎk C ϱK G`p gG\ ؓgۧ-0~{p1?VwUy7V`mpDwDV}$ =wEȴEА 7?Q` IP *gJ\O5>כW>wei/eAyy,[sRp q[sE Me7'nb]:kNR+:X4 zUm탤pM\5#_zHMQz2|& {UaDx鲸dSC8fxl}z-auh@o tS cjǬ07o* ò]2Gu4瑃ʀuir\#vA&[ RZ?C_l -OV!{ A!yZd5lV M)ۨU֞%י H yiDYvA[Ep}f (ܙ #j+48 Fzu%fK 67.O7MTT8l0l2{$(__+}eT:NuxJ?آD8w6#ƙ4֝:PAW&5iMn Op Dg Qg!٫řv f*cuG_噻gR -%S Y?L2Kڇti1.؜56adRlRwDoqΘL,Rք],ػ=Jk6b(PQZIٕUx9e)T 20&(Bu‡HѧjUs7,y<{x;H gpܰ Qm9̔1={G p1dď=.*U0nKOQoRIRG̘vk2fpYح˃/(8),j@x MC $No+1fvo~BANڠ{ :t@n[t3x%yk"Hq m%#0#l:, ݴh6| ckze[~۔Xū˚:H;p&TMydquǗBhA4z[ai7G@t5BTQ*qr:2 jX5d:Pnm]rc8#eKBl<_Z?Q8$YvC* jt&Ou䋵T։mjxwOG}S\W PkҌ3D?WM pUsNiŇrZ^6?vCӃXT7;՛ A9*$1PDay(OYi@hb/FE#Z lPŠSVޗm96$+2*`lWcy#i*f5srԛz|s=X/-s_-lWzw CT:u)g+Og4زʇ"cʳ;~ԜV]0:kzh*@#EU/\hŕh =2O5?J2r j $'չc qH5rJ:Pܦ߾Itlۿͣ uCHY֚Y%+Ԫas39ԑ9LHGJ-h9d]NuZ`ΉWզM {xڹ@ G\O%Y8ԃ]  YtiHM} RG^v"tq.5:ay4P\mHR.$@FLcpV0W3dcpzn a?ӷ'NHn.0.5:Sl` (q:z^poI{$ l%&tJK'|"l7.pA&RBG.}9{\j¥|xՐMN̠e<:h $DhА*$jÔ%MwrTωjy&(FAtW}޲zy ]k"7},.#*3Oxսa*k9{j~[lOwt4<5DYcFNA#\6!ha˄+T> 34SފϒR+Mstci- IyQ<[ 9kH:6;?jƛr P]۴<`. `~;i#%E&Y Þ]95Dn3ƐGrְTm*ܮ@=B\|5X_#$dѧm6IOOD6@DT@`V\(,9I89/&R(vis#EyꬡK" -w=R/# J |M"Ҏ2A=y^ 0!хr֠Xhr)h#q4_6}W, ݮ98Jܔm4ޗJ0t](뺀ނ'?*;$)ecH1)Qc+Ϝuщ9#vN3?m=.9}cMUn?g5 DXr(2?O3Qqd쩺pE rֈP,(KsY>?0IWڋGqZIE{[!k" JX Äq>l 65v Ӝ88pԣeh !5^H̷m}w_;h]Ël&43SCF~DZ >+~_CYR(SYC?H6W~7f}ۙAQ(}ScJu((ǀ.d@f`! l$ka2Hsc yKuρFH1-QlÐrր]T@j|K>mH@R',hxftq[>_39eU%IC@HI1.g=k h WIy2Gq.؜56a)7j4ڤ݃Nk!2)a%S%L~K%L j)3 6h/ҏBj^X !pvMxs BgPy+D 'AB) w %HXG걮Oãmمd[\:'=5פPHp^qT[YH#>?TplS=/-iߡ3.mF'{ytX-X3e]lN Nv侯EY3"8hA:NPuVW밣nщ)ED3QaYwK~Zfb)cwy@'&(sƧ/^9.ߕۮZ9+UR|S#äkwB2a)S+OʼnhCt0czbdϙ:12Aq.؜56a3 m-_6_Թנ1" ?@ {`/RZwx;:\,.Bd~IQ.Ȝ52a-djɒ)H0zuVz#[Kmt8c, eOZ:>a9" JKgmd8l JWcZHL_xG,Ah0 kgHTWE%S*~Yj*9`1\u=9xn|̩NZu&jzQ(&s$.gJLם)qy9+*D-{N` PR/7TRv//|T*.h9]*ʞZq?dTʞ<$eO^=9prcΣq`GTI)%hhuRkw^1#xwכfx{9$qbEѡıWo]vz8>ccY,[?BoQRpS%[yr*UIܛ[C3NYȌ麢l|ҟ߆;?\9k`v(hSiMfXBvi,_%>UNwW)0*@?t3C fnouӍ 2gn1|RҁMh YOI4R$T9:.3@CEVIbjiGt^ ZB?zZOh꫁zIv/% QLCSV.+ 3&_^u~> $al\9khҎY<ͦF2W+=NJ;L|SG6CG2gUY<֤uj؝GSLUާ)FA!/(5Ji_+FsJ4͗/ݾb p"þ}`T)f7h̜AՏ4L7NIn GS9Pk$qLC\`9kXҪK$oy zXsZzC9 5]}e3BKvd&%(*KiNt}InsӴNY)F'm*D]=-Sx(hEpnFՇFQ=(N-5&c2*^7[ '>Җ@ʜ^+sx}w6Eى ϲ.):Ca7)8ېX7LYD>۳[?|S&޵C6ɚ%WiծRϠn{iz8uǒ>%KKE)uFj݂Yc6C++n'w6@@}pG}!cR2"21I/ˮդRR)J(h1b)^mqӣNWz{C&;7u4Of1NS%\tnR%8E\ShDt ú*jt႒/ߴeGZg=;b:`3lb'IvG\czHvG,wz{`a-աZ ٓ`va>N%9/zoFR]})`ХብY7FlŷEo!;ziJ[Cţ2?p:l*ޥaY%bȪT*IƘP3IfHnJYCHJWY (ёd|NR^y0<|iEfNqwbtIrJLi, J,CC\9k`)z#6 C݋KFuҋj oE5 Τ7K{ԥH_ .'z#CX"Ÿs-R Zylmw,rQI=Or%׻멃Z Yɗ嬩BΚ$.;>ܺx}D uA H+EB:$kVԉ+ <}v`yVj5|%ޣ,OxYU<%/FA}wJCj{GnPcu]J:m|o򐅖.-\R!0-drlWKT_Pzj"9F?2|yW4t}u[7 )[;h,fcesz1֚[X1ys֛zϯSMYT@,{}u{4T)ViSM0'BtqGqYS:-n_twTI8xq}=|u͇|Yl ! pNɚc{AgMSDuAj JiCFjv/kz@#B $*yt/S `IkL=1*\9khZQRKmhw gf+.Nm>zg2< JE.|d[ztdǾ2*Er}nlDgK19C*%Ms~[˷Hc?kgOZ*4rNC47qKfVD{QZK/@@Rrv]Rze5y7 P`ד&=^kz&"]:kqkBQ7^2ʋ- Aw*:u_P.| *a>ÏcM'%r :gN+*zd-QF)Ԁd!겉6(R;9oPL8sQW~j!Ӌ@I oAI M>Pfw~/dEzx3Us"Nnؕl*84x֜(ώ `s`"s ܉?Տ3ήP YF&rawʐQn$;ʕIG\e~ch"s NHк;-fyd7L;0iOPd B a7KޤQ'KY@թ;NJ#48OqY3>w@?.o;z?2p܄]oW$.x^G2>Pq_ u?&aըD7Cyp?Sp0h F@f5?ⷿ5ֈM@;H}l6_7Oʻ4CRW%qZE 4͐B)$@* ={W:"W}^sO#vE 6ܯ](D$+<]#JGi;A0$[8 Q:Q&(]wpbD"ErְTKT$Đ!|=SHoLLdWi8gS]-|x4o!Ƿ`r֘ĥT*6zw2%/\tA~8Λkć ީBÏ2t+;^Gt'Mν+܏iXʖG3Dt!$C@W8zƿgS /zs (K3ʓjݡ4!Uud-}֍)Ypp'"}?tYCC:g*kߴ$E'h?#^?Siҝy!JM*J.z;mپu50$ѱ{u4HS(Ķ@r֐tImEU gǺA-w!ƼيW;ַ' OwxRLXsִ؝sgczDYC֙Jˀɥ#|kDN{C2GȇiC u&ZtQO5& Ǚ"r69F%l ʺ@$tRy7\o[~%d? EbIP ɤuP< 5OHA.Ȝ52i#ˊ5~'X,j UTϱm8fz&3tOkbtRx\RU?21@OPJ/uT/@+Sp"@tմ&O]P^gܙVCKXuIj?ZwWO Vu]{GN49IN] IZ'-O4OwS"Yc66/E;/!3r_6?w⢭s+K4<9=zT' iA}%%JP *gJG:٠zwWHR">6Q_ON]v\YL,i5t˂t=_ Y?VUPq}Ɛo<@R޴V\>$0\wsITg6=@7O[ޙnc%[Hq/`5X57w|ȰVW$fr=  ^1L֏T9GPD,rְ͏S:-^wM8+o v>TX@xX߬tWS[=фe a (g J\oy}[^>$X,/kmydm@ͦ6wے"IS:qq$iecY#wA.Η )@T5/d(7eJ ^.Wq7)c+.ɽ%<;t ;t Q 0g LxE_ʦy~Zn~qv]5&'n:x۱+P,5B߆y:y@K zyȮ'`1+d!HOxëwLAWY%fʛ |ʦyoMפֿѩlJݣaL)09TS|!eK }p -ƸǁMSSŮ:9tQ`3Z*$qM#a1$l$WrbU=R/r\]SBV^iEXFϫ4vPzM gdP]FWDeه<~j>AȡYwBFRY>Eaj`5KvT|>8tm98? hu.*PƉ'O9E>DZR T Uk!Wҗ뾯ǓNneg@Bp._dǾV ZԂj uл:~1gOg8Lէ e0Ӯ˗UjL1x K"_й'a E6Ho;h@H,Ǹ@sдB(alC'Jؼ=ͫ.'):19 jt驈1^q&`ar Vt'lC>,\LZ*;"PR ҇6JqʚWMwO{-2bx &gIi.(Tin5jU}y?2T bWA8|UlեFPFjF[uuDjNvA "-dhp[|}% N*ή;b ')-eaE@ٕhj)o>=<~EM:*sbu?#0'@-T?4ݟU Iy+SSMc 7p-^3䕖$YNhzyD~)lr h)C\vOᝀ h}:dqxӓHVqyXs4Py?u-*m..Z9$uUYl٧nS%`r] ɐy4ђM'tIBñV(SΖK.5,a'E״ \qnCPAޫ}%Dr.]}0TE)J+汦P'@%R| *gJYog1EHoF]D4&gKEN'hWl}̖GPlI#Q *gJFJ=6QBbw_b}^ÄzWD'|@gǜ  ۢ{7-n: {2sϩu耉st.@YÏQ}.5*&KN*!Yܰ:4ְ9Is,_?*(&Gh__n5y5/jx 0f芥,6Xlܕ~%36&R o2.?0eJGPLDR\vMێz_".40*FA.50qSdENJWahi2 $AĹƜ0x]H5 %<&n-8ͷEu}Gˑ.5@q-dpRd>ªIBiddN- "D Ew>oo%ZTYH56~+ ~HUmDMNkz02Y@FVp4rZX ک*I؂YcC;NK%ނ=Cl:mioB}r̔Z8Th,NqZ&)r :gN YW~*0B"qC4f#=\{apP7ɝaib 0f ?VȨЂGG12]0:kz("7n;|\ u3L9ߗ]-< [ Q#{< zg:vTN8)F-1"a [Hژ.C0~ߍbgߟzzׅ\Uˮrp}=4~7^VFU9E>^?ߔ<96.5:a;d9P4t*N_^&Ý]SO.:awix<~w BLq ֠9Fb!.5.a-dC~F0PD81""\p9k\Jĥ2d7K( wwZm9etF=9[ T6Npu6֘&fpSOcEMQ 4g MXY)!t6OU*)H>Ѹ^q+=/aQ=:Il'wI^״ZL,oe9 } .wW`b0V10#]:gr Y mud $IMhֿ!ܬE2Ԭ+8EM>n-eӨQbq.9eX BJÂmP$I%%Pvt=0p̣8W" ms%ZzZ:BX u[ ǧohAЃk^Pu8BmyQm{U1ثmSNԾEYCD=Bj8B7|֜},^Lsǧ w^(SBMW@Ljl%m*se?f}TBAXuk".a}"soi\gg+ˮe;D| f=-19-OIe @ doLF8cl, t+kk0'R߻!9P9o-lo.}44Zc6 ZL,E0 Dm*#z"=+4҈TkΤuV.RSNxa*J%ӲPQ {,MxCRS u>~rhg>[sIQhQ[O<Ǹ`sTbӧTrou'#stZgN.+z[MEÕzMޭH"D'ǢbM 8g NX)R39;}mEjvT!ukGXÏ}žD>UΗ$[\[J/|֞Mۯ;GG{hb\9kd*D6%=O8N?AV*aUл*cHPS*4-VN3lmTΟ&RXYcS#6I- _\Vp%UB-Pݎ۔Sohķɟ ̳xi"vL5kT<'^.;'%B]0:k)k$=Kʟ/*\o"^9Ɔn5Bχ5єA-)g`1l6 2j|=͚Ӧ]&8ƨE %5b&CT㯋|ď56Upg6NP}4<"pP sZ/)5EjՑQV| H_8\r>/ԒCB_8m&J7gzun/6O5mT1{3R:KJP ,g KE)UH%h*d'U*U׻9SP~S`^-XF\3wM.Ԥ㥞;U\@s Բ4_H?rDT|Yħ|Ss mP3%;zW,CF>fO Yn8[&$h镥r0vs.JMJxQd-){dZbܫyԩ[ A< }MM̛ KP 4 M!4h5unZzql~{N,i.D2N2'eZ+ɥi yjnu@9pFF$=_WfIDm/hA^:kj+CJMӞŇߋjOz?}E$ EWLTJRuP鸃 {FD;f3 .$.7,qCdAqvWe>X/{']Z|kV$[aEDOKFw@'6 S\:hr?LxF YcWE. >rb},dO};Wq[^ovB/)톖#xi $|M&mclN_s/tL:! E sT,*X{ݸv GqM|[^nǜIpARlXH=;*'gO%?cd*iup>Nk 㾮bR ~ A^u}~*QYQCGGĢvjEtX:v^?6tmޒ F$ p遜Diچu+#ޔ۪\K%&eٶJudRX\m*E(+IQľn8&hXp9o\άZnlDt6xVcܠҎAu0t@PGP*|:l6Ar 4zhrրȐCO j):wfoxU39W03i2ZlݏsRajV#ʕ(h6h{+ה-7OmtV\ߗ L|G|ARNâ5>hUpThVݝ&=~r6ԣo*H4.5,%Z3 īNlݞPieq{kOōvx<5ͭy%H>_'fݙ$1@r֐e >:HnTE^ φN 7?0dzv!rfJԃ{Ӛ &i;LTJz/KAj>K\؈!oPx¥z0ܤ-W8X@s,7awM?X xp7 A{@R8' JOf]C_rBmFQ zq+ R2l]3tK5 M~5AfENef2Y Kv98+:#[ YMa rA欑/+ $`\R9x rwIy+:$xK4kNnUNfNr8{#op[ ovb܎Qzlttmλvovϸ8 V/Bp0un#h9Gs-PL30Ll:sU(`)> A~+pkNg @j*)e7vSWtƋNQ.'ldL ޻;IU~S=8$ی5fC0PEء Djy"u%]Xvljt$) u&(G#- :zDZ VՈ.]fMG6P PkdD.ЭOyf "[8g4 |Hf*ilڲ{ s3,+@S^pu,<)Qo*:0d[J:tSʛX_w) 2`ٖ::J (uU _d NQ#}8[Nޮu)VIa.5:K@˗f$ Szӧ 1(bc+q $͏dj=:w\Mɽey K4Q.؜565a3f鵅~Scm0KO>hna(D(cG0/"$:'+Dx2dn}գm .gKXIBc`g f*B%7 ᓞQ=L FK65ֱ\v#ZR#RD&F&djCs W 62JZ+H=wȎ.wⲷV:a9yx, 7 \PH)vP=UǛa(Rфvրu`T>4Ȟ,weBoև0F!Fm/*RFG=9W#:E'((۳]ߗ//XH(47\ß&9QHpYCGAajɅ(mW VnMjb] Pg T9g ?ۯj^ k0-n@ʹvݒ huy}h5NzU[RD q欁K"򪮪)e[NѴ+ū"a؁wҶmgeD'&[k*=ͼw[.ï|SOԩǠBh7Gީ\N$YzSƩ&Nh;W;ܛw+%.YBybN)5Rp,Oyl2RbB]9kx]ۜ 0q =p48caG&͛5 p |'i$UbM aO[T_PgxI!{HitH!&t ?Z}AݏAraզ˪ؤ :`rHc\9k`*IIi2] BHUUwR\sÙgz:N2lth)SǸE'rBjʳ0C[vn`Xs 鿿-*xr8KA-|GLցS/wINhr%ʵ>Q2.9I.;̙L1Mzw1ewT2>]rq6swFC|tl,|Dݘ *?C)"-5&a-sFhSQ[LaYT .}䂳MƟyz x3{!AXis b#}!7AsB&(N5 *z^OTe^>͛z}'B^r8`k&0s`5L-[wϛ+.1%?clסH,rθ RV3 mh~]A̍U)mDŽ?x:/a}xI^=]y,21󜮂a;v)V釗uB%HSvhrR}9|vo -2jfTFbsNd~,~xWho2cըz,ii8t! 1DLWu4sp#)NTyw4ՐخL=85 )=Q>euOQ@VN1:mŷ`r֘4q 'ySty,5[+۾Npil']Ox8ԪosrKfyTo9:ጧ =!Y%8| N>ksҫ/lIoOliX{ 9ލi"XD%I(D5x֥M(εH^:k(Tf> w|=&{ΌNLeJ__I |l.V\qD":O CcDM?][oF+ a^(ɶJ y$ZbL qfU~vUu7Br W椺.΁lc҄,7u^r >gOKTVs]v>UQ :|:ԭ!&,D$}iԒqDΉ:tvLQ.58q{MmJʃk>|#7Fh5tI;^=;+hr%A,q-فI H h+M@$r :gNO蔾@ ]D䏶',q~m8_>S#3})T;ӦC-'üTc")$\P9gTzX"N$ڸTMI-/h籍XpJ.dd P-;+}֗>*9UT+j#vK5]? (w`kٴ5qSH2 FHEDx;?K5K*CeGeFYyF oVQQ{g,~c,ż uHՈT6ԏCW?" E-@."&N3{a~t/|Lǰ^ FgQR(= A ozTJTkce~ eU7yk.:I"o3unN G PsOt͂  b} FgQXIm!gUH?a_ ڤZJ\~./=*=clԫ Ԑ7L<| SF>r s欱rOn|M -]<ݔD'#2%PJK:w,q,#FҤK,a,@a.1:UGc+s 3`˭k .뇗*ql >n=qfJ7{Jw6ٵf8."NCS!&x >)n3sN WO!vdZt:4lJЖ)m=}$AQ,1/(J68gNGbb.|9NxݢQ(9RtC}gIơ+}^ټTAĕ=XmEn+x;3PȿӞSp C]9kt&#5j;40Z"Z9a5:܄qm[~I8+PqPkqԗ'ϝD=/bYwIԽ75nʮK3v[?tfTVPxcS$ x񮝦@A=C%̝;h+aX,s*щc dc`Dsp} kj34/ q,&Q]IĤz!ўfaDgK,IO3k$ӧXxqjJ)`Y~ 3Nx?}LZUc 7 tnpJ`TMmJ'&))ۼ;dq.5D-Bye4д0g5puy_}(9jk$I :Y'O2!tp)'ze&$3P Hg RX%)/X>c&hv=6 \ƭwinJڤ=V#)x9AJ36 edxt39eBmOtJ͌|<"VBd%ȢXs`ߪrN[Xv1 #UVț߿Cz+=kmbCܮu6\xr~LYĠH6i}J ;rsRA\Q JgR(Յ78}h7c;ŧ$|G"]!Cxʟ̈\^Z+cjB< C[8k4H@lя&( zOl@~vSJ$-/{ydwʒ8:8Ro1B(io<(RX,`s؄Mݺ&oO] WC/VGܖSPhlmT Dbr2HzE9GVYvEZmMUҒ!e3^k%O_hv" ߪl[, VD JFq.p?*?1.\9kl(Cqu # 6WHHBB(8Ǘ]CĤ֟!6xYyq??CcY7DVicqtUdqS ; ~/N?|Se+|TR 8Pr:@ZMlGDŽӁaYCD^mG宧qԣH>`G5N>ydaZU $QfKz5]liK.(5JqQQ-20D#? SM9zv[6yIEC`rHw.>'4R-id 8xE4h!|vK|* tmNu\?QZmRcc"E;A"2o?f7ÐƷ@r֐IkZmrMS!ʘfʦd+1ކ]y3? IҔIR5rc}z*~wϝ2r Lg S0u.~ޮ7ۮ~IY=5:9RX0p)"{.diꎞ_F1bo~z1vIDgFr .gK. H3ʮE[iYo/~tZs*68̳x\jơ7(Jc/J((2 TxSpb]9k|šev#ްQ( LcSI/4BJSIi'0iEnbb1FXs[MކF,BՉzI[;Cs8 .+H89+ulu!\^#3D4يYEF9 mS!OU%.vZ6ϛ1x9oD yE?}KM%I3sJ=QZwHEw-Su??^mNpvas4Խ$A/H5Rad-wk&i76fBiهpp2PZ=זD'CF="jy[SZ4Fk(.և@tQgdzs^Q̅5t =DU(BGͶ)nMRу@"Z]'}d7ZN Y#J a.$i]mQWJ+>| ^ǐzمx{U&hta},hΤpY̙uiD5=dJqYIs^יʹ} M2ʝNJXN>BR(?Mt24LȳëD{I cY02FD*u" 9Jkk+ue?Ws Q?17J_+iidd)B6^N>}fO:٧En-+ =]o/ Y^ueYrliߢg> hU+ęw!kG9iG j/,B]:gjaa?? hq/\ N/Q$y_?MAaLuJ{uA΀e޸SՅocO³98&s[Dx>ԘWb!!@n?Qġ1>e\LX$] K56?,@I)p׭Ql|ȥBMPUQ8iYXބ sRSn[2Eb 4g M$9UȚ}C})BŐ*z$q^~.=9қw1e^A}"3ʏ+}BeJFɓ$(y֧AYEN S"e c.gq\  9QC0 M"Rwdܺ=$FOGo5eFu'8|#r&BܒΫB]TCytxS#r69z(E$Ma=ǨX s欱i9ӦE{zh*B/{ײe%#ʹ\,[ Q-g!fY_?yHYMK)NܼsI탸~;c lJLq '0Tc91&  dir6C 9L3ZT=ގ'ku #2xcf!Sn)F )si9. L}Mcߢf[@9kPN3&eIN^o'xGpi2W%"f'N6Tv9 K0ӕ&%(s]Oh2lASm v6=D i6k0TX`M!ƂG֣6fpx4R[.>хu@ŕPhT=s87HI*noI}*@Nȴ'a˅G@w3Iܑ͑'# X8륆U}Oy4՘7unҿ9g#ډ("זѨNVNƙǛq/lBIp 0g LX TUHw鿐Pp^ `SB~W/>6OL8`0H&9i9<4OGDk٦ 롔LM˶þf|Sf0ڈߪ};,)SeI;b:G;20l&GH>:;0A-h5a5!cS>j mӖz5UzW?6Elzee^KkϩHqKw|‡=W7J^:k:j5t}YUC&Ļ):ecl'qvGi.}w.da7Dz*[?`J L1Fʡ6CTN>ϠB]:g3X|Qsm ~u)ڀi@śnhn] .ػHӪHS!iJ`G'zFo.)&A1.5.aAѠƧ;~\26MT\~ipς?^}S5FIQ>F(OC՚蜩@{vmS||ꅙI=iʜ.cY+)6y^  ssנ,^('.Bh <rR{A\=լ"Γ`s^bqD#fO-%Mά?N!y" HŸsMQԅM )"5(xll};b*{6̖3(%"Xi'Ӄ˷\rN2Ti-Suш.NklV/m(nq>c5DiCQ5DˋL/qyInýPXxŸrָtKS9ouIeŦ|٠N) ^^ ÆMw{֖Ӹ霧l GtCxc] 6gMtZҧqGx}5?pV /yؤKӜ5M V޸[{BcQ *s@s`I#Y3>, !?GIqK0*oS=BJQ)yjm(Se]: 0a.؜56#b3zpLMP-\L&.[wr=:%mq-D-;6zӃǜ|hdZҠ (؛c[0dLLFj}Kf2,Voވ]A }08Qj]fs[%9rC4ܝkyyb5nɮ}XH(h Mm\2ytB gzsTN϶_\hKɁζ6O_wcT]b({7pc9)BKOt/05LI EǧHo/>F/3IiULJ@\XpVІU>,MTЃ~g̟(Bf]RL#\`9kXj%\{/}JJZV_UN櫟,SYO C~om6(%26M!)(3'&H|.UPx"sBMMEg˗`Nt^IS70w)q) \v]-U%`+G%(%.3Ej"$-*9"|䱎O}MAGEbwX `+Ycq2ʶ3o9KN'0*Lj1A-p5q /`Їk}8n]aU؏io{ ctӤ, 2Ѡ..su+rs_A%>5@ 'AG#vm52l:8H'Gɚ, #qTW\ZoCp*=sG#^#8e@PK o5|l`O}lF.˻JB!DRpy dO$=Wh+vo)'X 8st]9k|H*qe~h{luztZtk?*KҒ{"4b ߡxđ!cdG"9#3LU eW!m%U s I2?`#U[4sbba)ϿZ*hw8$qo`)VaTVly% UnL4:җ2(㜗A4[1fuG Pyx>*0EJg:!O[&N/t Ip ,g KԠR%=Or,խAZ =hvf,ו>-6)s YP;d%6qҴf>ԏP|颕e[v4h/ƞ}p[VQ!:i|a]jP^^jITy({c&{$;f qlv1j長 =P 'QOg`9l2tѤ ;|Osy !3]L)v$[)Ǘ _29tu9jLIzۛzE3,Oq[=@&gQNwjF(@pk0EBH'uQat5(]h"t(m1&2P> oz_zg)Gl[qCh R)> GRہɂ! q欁#+,7^=6VR~}M"Cfjޮ[(YZ z:3NcS G`&'{s hyCwRYn=yGϴ8ΜɁxDoai^IǫjLce he%50Wz̓,j.}_1Մ@F\ RmH9SMXA.5Faxe?UVxu ZVH9h墴?rq,ju$Y*7uez%$q>顺s : L*X()U -^WM{]Wmƪp؋ߌltAC&x]| *gJXiiQ۔rpO%=CeyOݻh6ܜTU.YzWNdN[Vȗ#`=Y4Fӆ9F(R;҃de6ט}ڛh p}P\=;$QOkvТwfCސ5{~j657ȟ4:)Dxꬁ $ҫԳ[V>U&eզX  `y( < ܉kL,=I5&8'd~Wl^GkHt]TlX A"x:bsEr5"u4GIwbLC\p9g\*B g`~q[=N:%[w#Neg'Ȕ!S4b; %Jt.թsBYR"*LbtM_ s\^3=/:wܹ l0TyIVr5ʴ0wkW|4C-~C *Dh-l].J0$Yx;#ڥgSM+WjMxeKk-/<{&Crޥ)*Q.М54a_dL ׫J͗u h$/u60@xQG NŧОw1 2 ;v.hD+Yc FMH-3jФ/nS$ 'O-QC=* y8t OVS# FpœWst6ˏS>8_׷+BT˜>к=Df`iw.Ό\pKFs|C^p:k:it 5 _B1 $M?OIHY&!4Lxzl%QD]6Dz |.Zȝ#Mա9CsԸI2Pnǡ/ͯBK'{\ֿF-ޥBX$=`I7[$FlcI#YI <:HqA<w ^WF->/F;3`^ )\N7͞/xe\6(9sĵ.WUa2OjЬ{7lXUO D U=]Jʛd]n*ψHHt!М44qJR盒5BUK23lJLJ8X.X{BbC}Q֑]ঊ*[eO1 E#'y}ǵq tFщ %%S7j"pUဃ\/kKH ٛ/łH& 0 օEr;^?n u$o&ݐ:}D)]6KxacQdtS'"J+<}3Tr*|װVtYFiG "[g % ghN t1'./_Oyɞl=v Ĥx{yτ}NaGζ:JΡH]9޼/;I#D.HHow&O5Dq[A!nӗ!͏r۴ uhy[5NtaLwcMD@{؋t! "롅-D@}N%S3{ayS2oٵ_hu4brrP>>Ca<#lpo)IeVDppY? ޺Wۄ QtS~ϳmڄLi))/% ev3nN%@gxNڡSffuY$ =O՝p' |N#DʟwʗxxOcYCCcckB8%ha:iI8,5%Ԝmg䵸y13> .DQ+V1NSi_N 0cd|H FPd3'ƀhyUz^WxQp2WF4L9xcDm}d"x뉌l|:H#mӘ&IbIVC$ ie`Tn1_XJ%v@ 0YpS"݈D2zfsqv}f$0Hތ)cɠ @Hͷ%*_B1wu|e)7ێ xby J~k2Ì*!qF ji&,VivZϛ%oUS\n>7:ޚUK/&apC|9OC s !/ -ϟ-|aL]Q zY&M ܰ15/bl>O&NF6gXNaˋ7Ro`PC;p5@}3`ݱ\k`eS:#ڲ,0Zsvn0 IC^kX0m6<~2W!Ʀ'zU!q I,=;:f+W8m ))_3NKP34' ͈>eQ|hP2k_=$nQf'[r TftxI:]c(~SkD Cg?qhҙ;i:st3&zLvøYw{r{ޛOmp7>hZ&: G|vpJ:x\4D֗?,;#tP-V͗/Nb0)^c3tZySOUPũ%nѵl{%fk 镇u-UH esRk#:ik\q%|N Ɉܻ{?^Jw'py$ EU!iTI[^3R'T9 }p[&@EMunħaalۭ)L7/⍺"}[yPi1yaFPl3'G\yg g1w;\wEj՟n]mZ8Re8japԩ[OhsRҙ],~ƐBm3.'Ky_`y=,=F 0&'Ra./S-"Ghn$o"_ksh~? xgN ꂬ1_Wy$~x/Yнa5`i@R!|o(M@=R1c7񞯄Sdt ۢ , ~*~*WE6?%f]|hR,sE@DntңajHc : _s*PCrIS!:S#T8r.Kx_f^JߗIJ{l%>4nڃv'emz|9jXtǖ/ICA))r_To;|wI*|[;TJܢÝo D #jX3q:e&ߝ˙8gpNTĂ}*?T*H~ESiqayK2B#0igWFǓ-9< 4H-4ˋr׻O=1YSP.MyW *+HE*k$>U0bZBrl/L[~FS}=R:{ v! 뢠S`us%).b '1:x8ioi4C=v cG@4Ty^WÛ9iDzBà?["s;d )^./k Ȝr ^̊rZRlYE u}#If\q8)&Π4(a7 jfq[\3%& =orH)=U6( Oyl%M/sv^H::^&GΑo䨽Z7h}{0yz{F}).AA405jSȈn;yD))ёyzy,Gp FQDIrWFLqJ06. ekIgdNVZzjHZ8x GNc`K#ңu"8*b[k%!!i# IBQj%'"ށ(@3]j [lZmL3Q YSÊItttE7#r҈t| ?o5~dҧF aҿzWj71n.%95ϋuFB,(ACfmõ͐4$a r԰)|6U8P_7O .d2vZC Tf:8ַ4\c{FKKbmlO*G&XgNuxǒͲn"7 ͛rU#lУApA]O;``Rii{>~fb7Zj6:ц;t PLU\U/GP*G?EI7Ӱ h<jx &nODI:vX~=@h#9e`FEkTae"} Z#::&d.|!pִuMqjvBdLP32'L֩>o;N_4^\ˡ; -qGacJC;.q\oYH{5FPl3'G\yLZa{OjoO)S)ʲ3 :Vy$fd3Uz &-] S@Ia.F(n!f)1nxzZlP˻Sx%ہԡD=L_!{z͘ՑlNR}N {ϩYϑIB== ~lVuZ8eX_urnx-\e/Х:^-:ͩ>uB9F&.BL/:=cBo K%%h" z;/ɫa^-T:GcN+}"h)ƀE&8'n"x({ڰ5??˧thPuP饧g@ŁY?%@?AENuȡψ4b?A =ǾmW\>r&hG]Bc^[GܴUS乧w[ĹHCɣޱ Ζ(*ц9s N^|!4@)!/8[3` "_Rb*:u8tl1j}d2+HVCf6F=CuPUmR!BtJj&oda`RiՠU|,w΄Ɂ2$sƬ2muAi_DO=(DOC&D$ Q :Hh4tb<4"7nϫ2QDfd@]"2]\JΦ+y(#{ϏkYগ$9"Ψ4*%\?ln+ʩJuQ,*RyM^Rjs;'<][6^]~о;cr|F$?-|cdI>ĩHK<^{l=jX^YCS#4}P$s@afnWH Q?ȰU{S"8I1IK:p:D;ӫ5U̎]p~Ɍ1R3sE^ Hg R asQ׮-TK&.-o< :<&`#dFsi4>ÈQ|ֹ>OX(A.؜56-`37| p}Gdc\hq^=os)nGӟ6sc 6-=HQZ"/Ҡm& ؋r2ĺ3zjx>lq$C.v^ ܱaKvta.Gp\|vws;/~ksV9o*[)8 ?pMDIo}dܬ?DCCI$9O+OEa.&l*z_5*zׯպx|St)]n%QjSnck iݤ n2KB} Lg H0un.*ݠ(4F_Nl@mVH?I _e~<̱, r-T Q8?kLDXuduq|=TT-Lރ"2Eߦ 'պʮt&%

[~4?r+wdzfuuS' Q[YvF:=ڄ&]K\H^,Q s欱 "mwU˚on{vOvzreDڹÒLļ(p]\Qb$< B] .gKXiLk뵷y_9TmTS@EQ"e\RCABq!:偘 LOz YCB:(spN(HrX=}@مJGA=#lx'-gs$%+O 7Pxk),E`s،Mkm.5=|-難06]MRx\}b)6M5=z{E'p8|Ig #CT#\@9kPjHG2&<'źs4 J&twz}c6z6CeTXAEs؊Pp̀{y] g2Sp0|H:6g(F*.NU}W7j{Ś?o@sbCF*W|-t[Rm9sDE)'HH^:mDY#7FL ?<:^\&1q>Ҥ*&]'\4e$ ?٭8RrTC9|59BY3:AlzuȽ|,i6á%z)+J?< *F6E3!c=YAi)LO)A/X5V#a5bbHmy ,6⢩+#:w Cx^R~ӝ'>|)l`S>Ovyw_U+Yl>rN-A$Oǝ=#9]6vS$@p\sݒ ] 8Irw;񜔅g~aj ֪e%;'%K"̆gK .~DYcKF'q; ǁ>^v%0>hK[TaugLa6E`z vJS㮣/. 5Hq:@ÔUa|RC^;NMt%Z̔x &撤Z"z&37U^v \NȀ*Ã] BgP\6cUP*~!]W&d׌j}WSϟU]; E!{g΢D' 7IuC f$N76+Ĺ sĽRpY ?mn^̻C#-WOjcAH-cO3uo tИ%'nV6)}x3ƞd.g QZ&wWH ԚFqhHT\ Oo&Lc4NfID&PPVhAsߧUA%fUYᙽ >(· ˾2&vH=n&բ)?kV4?H7SV$sp9j 9Cz)c#2.WMM< o~p\g>o#Ыb=;gB`=̩8NA)0O&(bJ>1F؞p}j15ry*syz]{j׷(ZÏEPۃ4b&qj:ȎN񧷠wTr2O.F*.R0S@^Dc}Om۶~n:)m餌9%>1jb_I={qyLVZ0*/A4lU8&gӑ10ч@tirw".3_~lRVK gnLσm՜:l-Ftʏz@^tɖըN=^vA.М54=Bzf6qyf>9Z,7'L#N;w.Sb*{f݂Y#2 "C0F:3~MNz\mćp*cZ̒;Ud^&ѕO:6{ G$R)ՎZs K$@;D[v#{ ^ ^%?ãE|RZOdRd:wR#;8!w:%զst#RFi^Wk\}tjg0_kQ˙`m"s=ZE\`FڻU3ufWBP6DyǦG[灤:m'cdNWE{JIht :;9̪gix̼P:\.b .9Q$w͍le o9 rD@B*LfBl(=?"egb3JO <5=嚲ZYmatfa:Oe14G\؟{7W"`O)'(shŐ(.hh^{ܭ8`3hnmF05U^u]wOwǯ8^ RgTH79~~i@};4ʘP;Fh z^= ٰ4`9=;sXB(c3zJ[)-$Kt.5uC*PV)gK3ͷfP4HAN52q„7vͶ>\q5+ɮhW(D{ NޔwyPyE/NI8 ]=;0FeKN(5JqܯaA篫Pj:y_c)gK4*>-|zi$E|]/yFo՞{h}ޭiUp–l:{.0}|u C109jp> U4f~<֐A! "dP4,ƃxM翆o *ΖBw&v(=Uf06"Z2IuQ.x~d2߮G9$Ǯ9 \{P%Y#50de8]_o߼dg&OA5RBi2OP."Hf/ ʇȽXta:xϗӢÝ0:jjĨ uOWY{(ŗJ2۷<6ղZyYZ&P)_`y2k'.lv~Q;DAN56a[zt!}{d񰍬y&jV ٖx0q/HQ򉓬 zA/YuWlϒlHwꨁj0\o}Ouي3p#PY֢o. g|Q kBҬSM=5q'ʴ!śڽXxq #<eDnT}Wo^j򱮷 >uy\lMRg>RS⤨E)@kk߮G!2FaN14aiғAr ,C6ת޲}ޗSiNy޲A89t{[':T y'wWs樱#Bma~#;.ەTu&r\_-KEָ sHkHw @<2lQF+X8^WU6kΚf L[ߗ$6y q ]ve'ަ+#hT+bT$f^h^AC.YqQS:}H j<`IawJcWm^5;[nD~'2\qD *a)NASnqўݷ";S͞}&('l8^j`ywYNByĦgkp9KVVBHbN:ib<9jD^ 9c5|U;.`U>|WJoI&!SXrݩ,< rCm#TIV3f] 沛za☞tp4Rh"9jtVމt5y,f[v]o=| GlqWDڜK|!/Arb1Jȅk6 `>.W}di H׸r5:_7w=LI\}DG0(dLơHˊ?9&8gG1]%5BaN56a%CS1otNPcsݖLzyZ#"õe&$0*Z6B5Xf!x@YmUQ2GL 9_=0fߚzҚЇuy ͛ eg!'}sq .N72C$f PN'5N5*R}~źG٢OQϻoI*?pslΈ G'GFevwy'[r'Xpw\ pɉPnޮU;:uHevu򖦩 \ħ5ʔYwl tC_2b2GL ^H!po6T`3Z xЄ#rèۺ!b i=ifNև0q&_ Мup&S>+ѳ#d) FMRsCwU 7ͼpASt-PIJkkOiPK'ʒ#PK>X[/\w_X&XL*R3crS(? >޴wo)<+N E8JW~7|ޔ5mx\-B?̈́Vo@~XqKQLAaN": .ۆIN.(U)c %@1{xM) fHh^]"g^Yt3fWxlU~H%&6>*jrn7[g?$ ,I ?KN5<9SI6qԡQ l/yc v| cLgN9W=5F o>q+0*zč;螝N5Fb4d2h~}o Xg=6;J݄(-<(T+ၧ(6PJOiyVzܳ׸S~('dvmY_p^/a(dw~-^ ;Jz41k -=>Bx>8Y8v)0FQN52 p-SpP,pJ-iJ.]R^plWiR&3=pAdELtJ!!/2vPƤ8rԸ%ա+Hm7ɣMh|= {x DTpZWfQch4t%WW>?ȝsô$bҒb,G K\ 9q)hR 3.TI% EAvȪ&hܳ@:R":9=e '\J8E[WZ!XhvYO}Ы z)sO tJ(b\̟)f>8VLtz=?`kc0:j Ĩػ席,+/pyXlL J] { T#TUBE`S.k<0E+=&E@/W]\hOt=e ԣ(mޠu.^xJhR:vVt$|^v\) 7*Jy"^^k yYr0-dZDGZ]t (g JIiOƸLY?mq4 C%\~ޅ6Dز +~9b=J7xP|AE%0%l_,4ϸ.xie\kq FmG\ayii`=D4UZwėD? Ή^yڊu/4t0M F%﫺/| ފJW dPG4ɹ=X3=WXt2_.BiZ?C"=\=|-)l@L6%@ds~.6J\ÈM]o-3.jӧAN ''CqxmtH9089HGsąQK`B~ ů27vc!j.nfxyBW6vL~ԑ5|PZxg;A9Lc$cO H!.50qW`I{7עyCZҧو/ ?Ա+yYq5Bg7<:)>[&I <룊s L.3>,tI)xoZ}N2LbMYEF;/s8!͏d@bIlUHl]J'*#;l%3@$,}.zT'g-vs'Bm .gKXV/UM5oлseKݍ^k{bw |6H?mBvgw^oyiў“}h]0:kȸ"ȢO&'mVZ*'>nTX?ж:0Mbzvڲw>xq)' y怛E%8xVF'1zBǢ[tŻ/u/hEgLX3S%,H={p1爢הK88# #l?+N>ʘV{=[T* ųEo6$M~G}%T^ymrjމo1ZKr3GSuv"ը $>AP@<{v̇[ n5v0#"`%29ξH=-ׯ-0 R\c;)͐آ;FOvHvAzl #QpD݂YcC&I- `xISwsP|iA|{͍7o@kjƁl>Oj krdlYYi[麥{O:xoXs#'섬:7Ԛ78lcn#dWYw/͸c* 5@b6@J:y=-XF)J>` GTc [hAYE]}M͐<{y?![޸]3TMÐ|襲38G!"!&s吅K.0KPH Nv gr/֭GG^?BV$؏9-5"adԬ{49t,b'{̗t_V5]J~q;!.48ݜ=w\UED94HD)4F‹c{ؽAmGzhZ%&@6`&[`'6[)btAѩp[D[v^\@0SdMa$82]z5gKGzA>oA9$A-5$a) ^gxB45qwciWO}؈ݴG.c]sjrЩ(:.5@ 4&R`m 28rOcakqvy02UPypBX@ʶ$t7KMm :gN\yւ6xqX6?;$).?W[|õ%e_Qΰ;@d/:J)s:m8v1tkbmسY700 FwfDNMy,;-HL^FImXt":J(= rOVb 'гz kh\nzFmjݬ-yAy4D93(_qo,+.?PrYh@D(soR1"Pz&vWxEMmtUSzω]^]It*}Pzl>h^ Hg RXCImW~ڧ}er*v?B/ߛ/A6gB'߻Iqњ&գZp O-ݴ K]p] :kFh .6L 1XAbEs[4ȡGVHPTOjl[]+Ri0 pAQ`e䜑?7/DR\<>.gΛ.4dR0dQxe4щOSDNeYE.gB7ĺGeC%' C-S*769^s4ɢS@ôm'8F),r\- mni7Ĵ&; jd.< ^LBmhdlgȺ1x+2ݮ~IgDY>Cp Vjb(}(ֹ"xǦO!J5D L̟!pOSd:l'J q1xsQƑM &懀}Nۼ4x*8Ů)vZ7o&TSu?YPt0ƕ6 3wvxre).{3wMs#91ϓmPv4N|%Vn쵔̴C(rWS_16mB_:kj+)# %w9b"]c 咆3܌sWȷ*v' { GRJ'Φijɑ.ƨAa_]{ߌ&tT_sՍr;YsWWŰ(w݇9E9wZ)RJ1Mz`rtڈrְTK yg|UX|Z ]+#P4 y cN.F߽^wjYD!I 2мnɖe3>rܺsxG0k7<8a_?4FK4z5;$]YDQ2љ輩ݮ뉌ߪ\WׯC g.cF_}|C/!,! #M6f76E؈R ]S,{O 0&,0֊P4\7!;a'އ%U{?: wϦ8Bscc)( {+A7iC4l_дzfoF:'')I똌2Eb 6JZ¥ƽKO@|1 CeşW_MI-̓ U>lc:88-!¨nJ's1sJF9F@SŰX s #g1^XZ%QрIڂ}nP\f^lզ3'^<vq]6VKF؈(Jմ&mܩEJ.(3JE(Zq >ڊ$q4{ K*1 '-բV ȉpK'O䒌qaLaA漑 {#ϹQn*:[m]C[⾹mxA,<`- ;|2u'U;6G=\ua.5<Ӂ^–8iFdjv^LWãuRdvG%8*tdυ&NQ8HŸrָԈKBnWKm k }<ܟVSsm"Bx\lZ4@1x84i KA.М54a u)vt;s,"Qͥv@ǭyY1iJ'刲 &nl!Bsۄּ(tba1=u䅰ݬݠAI4Ls쏌P~pd$!SXr欱[ 'yզ c%67G&Fm->7(s[pS+41S`3}c)`sH,ƸsMܩJ}859^{F_# yߥ@H۱3FNpݧӋAL^9upa2Dbh G8su2<[| q-mؐ(΁DIⵯBsH:6S"hYxaѺ,.@KՖDno;,^Xq˷U BIJ͐𲛳+f]ؤ;= b)N0M2F(ƥ\BQ'T~Zz3ܠ恻Vw`hƃJ둑l,8]ңL^2ncksQ .gKZ a;eWvk\1UJq4rpԻN3Pc~\to.ѡSaRZ /rӰ}vrۼqGGA:9VZD{1IDI/(3Ju( L=eS"}en3TU'y#hZYé)/AdPnE K-5$qdx:-Kgȯt|[?`7%0;JwG*kNB܇f'+n9,#]9kxZ 0|w;su[A$ʦ]mɾ!ܑsʞ6/N! Sg;~JcwDo"]^gԓ،QYANYU!-("|~lD3$[8nRMUw$l1u:H&ja"a! ]" BcYcBK~TPm5(D]*ț@mqxt Sf+yt idA;!J87]pL"b| (g J@H!lB}stRp~w'ÇAo})A=;F Y ͅ"GNB )I]SZb꤮)ɛ'bt $g Iq]( :]8|urfS#pS&ǩ"0M#dC6,cXYcVFxi:Exu{n=e ٍ:(eӘ&.8E S.*vNX)I(i 슮і]~/w( >4ߗ]CnDtn설  ݅Ƒۡ@i⦍\Sq.58aU$ -d@'tOU#>|-\9k`º(kZ9%ͬGe=dP!_Gw]Ek+mUO;̑Ry4m:/,Sǖ_UH\p 8?T=#CcYC6BBJi6e@?eLPs/G%gήC;2_ؚ[L4hH}FœFpr>z4q.58=S*4o-2?xd7rXWﰬ˸|T&Fĺl J$ؗ(-Pp0ŷАü][ "j7 #Ҝ8.B{oˋQڑ CQ+R| *gJ Sl-<5 9  GiGǦ֐s]q\fdrV4 /($fBb1%|.'<[Ch~SԸLw\jdK^{n} =Q;#zr\ #J2vn2l0ghNZ;0gߖ+z<_W^-c[댂cz4a0S膪d@=M,;;mCcjO]0i&&9Cs4hIdvTW.p(f@^5[| mM'w)N_>MY!#P3<' O Gb77 <@ iqu^-*OhDewA#4MD,cOY> >NQQ,{.pd܌I#!"smkxqf":A*;ieE*]$[:T ; 4@cܡퟢ{*Nۓ] F$0$lZkY7\`exx7* d~a#AtP0!I`BL4E2J1䌶tnIS?ڕnƲ' ɝs^mk:i’BCd ov:vC*?:+xk? >=(U_:̤Za~e*HuPGl7#q/ϥãNMp3>'OYlNX@̃GގiұL pFQ HTJ!MM;teHkn~VO:bF0R-XTC]96{Вݴa6(r Θ\}In҂nj_Vpα:?סM\xw-BM-%CBD!c38' N\VSS8zIgߠ#k=\d(-@aWɗx:@'{qQВLJl|P׆5;dDIcEɛu}͢x-k| UiZ\UEYC9Lb7]{Å? Z<D>\{zL{G ncI&'x\Z/!c {P7:C/t]ۇFN}o@ͻŽ$7F7֣TRmy@gpNw\\;j?g$1V Q57t+,2,40M ]nhCS$8&++7I!|1xi ߪ"?V!2w}1HRk 2bîy6d$hXƗ :uO\dlgZGuUN&IĿՏrZ5^V$xФ=F542Tk˶vX ^IGpx3&I%A]n)A)V* r\?U*Qez*uq"<1*&Y. $cYTG I@DiP1]x_h{]2ה(-SIclq ұh )iMYp >,t`u4 u 4mHdUQZwvJNa-.Xŋn- oR˃N&/93O"bw֭:l|TCv͜pgx~m~P-<6$'>?7,[rf/ǞWjBw`OIuX#ICGvz M44BqTAB#t|~a]K!ѦzW_W@EPjF #*=mAJN{;܁Zұ4*[0D%(gpN JFQz:s^/ޣ%y=(g>D 8r%#I񹐌R ȶdJgXN`6Ҭu[6̢3c5n09(N\;F2 " ,a9I3lw>Ar4za109sL(c [hպljs_Z\0H)W3qиŠ(mft~mܑ%$gdNZ2QnjSִdOA LQ/ Bh*_0,t j%zуp y5WmDqF椑 !=8K_?5GeUakk .C=O( |SnZsAz8e;cJ IA!C_F{U.4.מFUHrQU6u7R&=ߊ#)Ҿ3 kyDI@[IMk߀'lJ|Ͽ?%1n[DgA|AأWk.o ܠGo;v{~N /,C9̓/,=Y;GD ICVAi%[/T!?kF۔GrNuĩ!lZ5_1(xS&Dl0cΘ6&b22Fv+jY.Pe"'hmUs~ʙo3(ͦI^W :cu^=Yi"C3ߵi|>O vF oB"뫊7Ŋg"xjCgPVp)&e$N>h}SsCu;֟cDQ9iTBe)<,_|*u1|<#e&X Ig*̀q0u3:;|qh9il.['r * ij/.OG9HmF1ߝSZ :Mg{\Bȑe[qg!Q(X5 v! ׶H*,_ʺn>U9ܱ7 }֮\7D2괔>QozM̏|ƠЇuDi%:<<% fb1jrcO06GgqOT~odFʎKg l!ErI~MƱyGoU{jɁ4:aQ 5@`Ϛӌ 84AJh>K96H%X݄lᝢg֬7w)X٨b3:'NX'].;5Vk?^ZcJ/nz(ۦ.A:ضAF^=HΟ&bHi35:s \omX`Y/qYos<_T2,4_HI̳JX|:`4MG jʷ txgN: ,ƼYn<+pn>1hu3hdPcՑIP $ijL<#R-SkS|+r08uGIFp;=: Nv5 $zQ4껫FSàUSdn82 vFQ (U.tRBۚ ,6e E~A#ע˛.iםi!s0 =K˩\:xlF\Lp3:'N΅ ; 3\qܱ>Vu`Gy8΢uz(t9V֍!#ՀsPpa2" K4a48a[e%~/~ж۴uV\TGg>e|\ wOkw>Z']IREe _F,MFDI3!::\~&Ǜ@Z)nqC1 ^t_ob5 'xwD0?VHgxNN"Hft8t&|Ȏ֍:"'-&]g/8O v"r> x~fmM2>2j$%Tz,>>f}õ(~z1l2?Zx "@"|0OQ >&8'LJ[7vU}g ~XEe9n#Jz3wZZe][3(];<; 4E Ya"0 όY8yӂQ>;àYSGxcz;.:jh̉XK]p:k)!7vД{`xÌ SH#/{_c Y>CNA].z^b̙ĥJ FgQ<znh hZxb݇~Vi=xt7‚,;z4+Zv&iOa>!o,'$*W5W 2 5= +NJV2(PyDj"-0Gugfg4j:^f,5GJ @g P\(A1/Le?ɉ+@kͺ$kT$x ﴨ*Z.JedQh?~y, /a`\9kh);+<+d @~f3ԡɊGZeմ JWR} 0g  &6_?7[u hRqu #bJ/-*+}Q Rl%H~}VyґSzqÑh`\w.{h*<LryՑʔdΟ{T&- TOpMpڙZ;+'T1Rݶxi':Udra2[[l4fYw&)>cDKT ;{݉8F!TZhH"*6QOu̩OtqLx*k |k5TH")}J~c`9LS\eT,<:uGt8\! dt;"S3 nR 9PZxXra3.O#ٛN:'Rpj'Co uss vN/!wݾLXo>_zZNhdkP/IM {OͱXءŤd=BAgHM=iKV}g A\?1T|ksP)C2E,eΕ>LHLKj{9UiB' C]ߌ?_IÁ; -hp#^qF$Zi-߷Q)3ntt@i+NjOh[픨¨4Fo6/_L_uL5'G$&&tzwӚ'!xVX.DH^iGݮ; >s.Q:̐G<NTKhJ"]9kx)ObReA=ΧüYokHI'oj f?c$3zt=6!gv]XYÓVG svAyn$3dl*>,d#D4VHgr'K MJ0t/BLպPui$-QS/_;[Pu,2gDa2*?uYmZOY#FZ{'#rg/ s*cҾ=-q>MC™4Sy7vFw89 -5&q9M4c?f4Dڠ~A60"cSqG؆!цkyBocbh_ I0;y^/SY7E}F7&gΕ 5~BARh4FV 1HMBVrse1?zddK0oAh@Nůoe9Zݸ''6uU?BSm΄XȿgՐ/jcQL Vc OG޴:#n2% pAQ !IBM?jd\Fh(㺭Gh0 7ݰ/Dt29T sx5^xkΡ)tAљq)1 G~[ww-.3Kxbt4R@DZ2PeoN.tsw~pK.5@q3s0"ًZ[h>4]Wo?'0.o{8qh)lk*̦ˍCұ&sjέh2MbUZZvjCuСuw<\?`&J$t"O:MtNx)i6+  Ԕvr欁!c|:fKǮ.TY@㩝Mm]ׯ*@HbřS,C#m7" :| ~i,^]0.Q.Ȝ52!3kr_6kψy,_N Sṹ#|J=ʖ{pXr +ruHjOF?']P:kb/ݢ1"liSW.mt@ C=o3:9weTbT[ ]]pmML-8`qX ExJ _t},՘( m ^=uν%QzK1[yN6P#Oc!͌3 JI .gK\Aviq]O_"p S~M<~Dz8ZU Yr,$.K2gK9e{KpDu@IPnfq-՛o i8w =x=kreY:%.5D3A4kZ Z0xƟNXgOs|\*%q}s'{Cx3^>_'֙o׷PE8։/whqOlah{R&ܶ'J䩰=ֿhk>)nlBH%UOm|Vmus#UNUwӔJNON枨kzxMdN]JsUehqM<)NJ(>ofרB\.[R;1!gR*yJƛ>uVg͌O8J#\p9k\Ze1 pϮn6C;8ݟY]m9.:z|̺ g1"|1}₡ɮeOt6֓SϊPt3%.%.5:q[dm9-;nꞆ)< ר7n=.VPui\>BIHvmF*qև_zZ H]6fH\ Yt[!tye|i'O*?e$Jiqٻl((hc 7E-p5ڎ]FF_~n>?!6I+տɃ|:SI#|84Y1Tq(%m"}LӉ(KC>(9*U\9kx&T$$$,~kZRz*uԷBc @D3CE#ɐ4qRZHƥoLƵ8%nI;e]@o3c CӺN6/ZԈgㆋX᠉%e!lFFɄJ7-/V}NBR9CR A|BLRwTfjXNP޽l7 wD#ȥeX6 }Tk~5{D1) p1 69G_]6,ginUuڅ8Y0{_ds(Í˓͜%b1clu[#or,Me0\ iYGgk9U6W7S3q"/Ws,_ M;vw\- R36' P倆w.~MŐeW21]ES苤tw{6cCHPjsB?φ}P ia|1u&9`8Q6#nCD̫L\VL=/VWkJ)(n! 96zUB>[:}~*c&\A.^L)3In ;w2etI{JR&(&P+7:o͔Uo dLL~[<;9uAƱfҝPd.OLp<=:M/6L9'3CNYc36#8]AI6f8{ǡPa&qf"hF:ȕ_6[>=y)6ĒR} :gN\yבm#iMdh$[e%,"FH_GfBJؑxr>=FB # x=8LDC+u6czҕ1iip)3i^hQ9iTZ|A3_dF1),wj%9ڄ[ %OB]BREΖfCzT˝S6=i+>W h3CCU(>"G^-G|Ϡyi`c 2_Ȩ ̦3Ʋu?;2jLKy`d"9sभPDTڡwՊu]/WJ:27ۇ,y0;^+  1Ϗ<ٓrXNzN O7% byߗ<ǵu>͞ELPg|Nhi@w\.1ɧWOaT? נM{=hfyK\H[vhV989ڴ)~>qX"9csԄh4᯷ơL'.Uz0/% V o[HPJCSMX1M; S^՟ss\ 9>Fy'>HvI3JCAڄқfuH/k_/4rn։ 4#5=/ս4CO" HfLN0}(F.玗m/)q fM'L0 H:Rodߞ0D9yRʼna40q]t*:7BZu }nvOs NNi^ԵB=v-6Z!.8=wnAnI ui g,XIST|^3cQ9JBU7P 2O{ao<2Z'8w>Rnڣe: IEОDgH~ِЯ2x_kh"ڡn݇}/VH&&wNR_XhhwwDA qaIk""z~_5$g\Dq|_zs(=ٌΈ+ule;jh2ך`(p:I6'%0"5In%~ꏾ{X7k$?6># ž6t*@zu9ӺP$dZuvzUh.$਱ |8 ݞWGGlH!θ4.i-E6=&7g)^{/nu\6 8'{f\'M>9di$mׇoՙw(ڈgN"[L|+5kUE/i M*™îeךqTɦ$ S51iVΖ2&PgN}6aF/&m_U GQA^Fys(|=m!РR׎ yG;oIū?'5h ICEP#UOTz>UԺnˡmԓʷͪ~<^. THLjbpi͛&Ua&S~ Q`Ü9ihFfp^HIiO^?:?{䦮<4-:uؗ j%7$YdcΠ4pT>;t06ZD|_֬蕆~|ItKxFO% Ho\)טBeJd M;. f$:')êIiH?~gr{N(4Jqw䍖!!u[+>L tDГG>PC 2՜@ǟ6>gDqF椑#o* Ox]uݼV߱C8_[˭h O|(8j30,;渟y1A#{Q4>h/_v&V?ݟƥUV笉I+zʚ&Z䟞e;9y;ZQ<"7crҘ呏*CQ:s# Ɲ3FzѬYoyjpo[P΃٫IU`4Odr9@)OI#EHuۺzxw}z?TZKֱ H'.ŠR3"IOd54͹R,f/*C:iPĀflWǕ7GFQ_U de= 9EږDC)̒:&w dP ݏK 4H*&~i6OVG%.CYSk]}+W5%6Oqy,=RƙAS_F!9:$GIG\y|Y,p&Q2{n'(#. RaDi:Vk4aHa؜465a/%- z'7*Km-P/,ߖ˝x?6gjSt#i C;=2ݮ{{ڞ3VDμ&G&8F'n{o ~~ m4aKqH@>&fER\𭪂k/ \o6x`^M#8$./󁍈pM4˗Dt4SRB8~<$A#6+×3ψ>|1(HD IHF'y,Q1ܟ]4})g Mǯtoi&*$%V:IGƦ+ȭ% q&Л6?RڤhD nFI; eaՁvQo"g`{,Rc jYl/.}p6Lm.|i=y;y/9\4+-pIktPF~\V,Zؐ HL~G}Bu"x֊&s_gP ]:B8ubhb/F)UfjپZkȍO%e.8U ^ub _$0>pD rF攑i?#+Uc^'!tӲQmd?4%tDi.='Kޟ!sھ58msÌ^i8h!ӝ;t(|NG@\cj! îŧF7Msi{^{P3z -q7Z,S^iw~ʌ{wNaC&aL q椁(βKzdjۗ/$IzlZË˻/"}_$=x 9e!m$ƗCknt;[}Yr: y=4m]֢ u! )CwZ0f_5ca)z" RT2Ixy+eӦ=0H%{OD#b :92"9ixgɬZj.-fN/=/ͰM*݂S>ٮ\!]ouѩ;Orq IFQAd"r4j7ʬF§uG +ߪuԎL lM-D6!6T*o&h3Cx"G;t ťQE醯 Duu;-6Muџι &9#e#j7$(Fl* >*E&r3B'P\"E&WO~ִJ&/J} ϪlHsUe})`)}͆NDH6[zql#m30' L"u|\!ZSE' axmV(9ClrE Jsi=޳%S"ioUe}qm1:7qCiڟ4yݶu4@q^U/ 7Ok'eh uhʤD/j+"VQ9!+M%.#ŹG!Z:NJEO!@4P5JT8-h^;Zy!o#7L:R#=T%" m}-!OB¨'3%L}9DA4F=aGCz}T^o7*D;Z÷N=nŊ:4` 6< IR8dadT[ɘ^AdgH;I3:zogA2e@5v xY$6W{ R^|]Atq I3<7G[=ʂ".=%PsU|_30mӎf.͗ T6#єODpr9fe Jta2?*tv)t8#Yn&iقi,dbd z 8glN=F;hycjrh^Y%>T/y(k^V8ya+ya6[en,%B;ts4&YSG8rҨTJӹ~xQvK1)IgśMx-}VfCe]2u `=ҙK׃$d8KHlIufW\n4H2)sJRc{)ǜ"?!SjZJl-w h at@׿ ^6=Rr8yל&g~OIfJ]Q qxa F:醞)!lH{rSʉjS5KALou(@17K K L3ݖ! f$n #Q'❀:jvHwQ"ó>aةI0J;;w t{`*| . [;'j}WGsxJp4G MX)ȏ^5,>!2W >?C0/QENw ;o\~*R]DQS#8 _X .me8K;ҥN$g+Nݶ Psx)Wk$ t9,AaN54a=|p1d]45J&ǼI >‹"RJZ]-Ho{z ޵o FhԄPGHytZ|ejO?!pڮp*.1,ц9sҩdzm_3$p Ż`LIsFwd|J]qn't3iuܩniÂDQ@:PǰHE$n$MUz:h9jhH^rc~i ?ahPz{'R۶0fcVQʃJ:;|w3{/&R:+"ƪ M`'1,":V=|Y'B\4Egɳvl4m4 /2Q*R=cB 0w;hC9j`AZYnܒ.I Λ fݨF\ո0;: q5=>tg`|2ui=ƝujQC@*,բz*\ϛ BgJo`>lUncSഩ9YF$pJhL9lڹ2lM5뾠!%vN5@ad 1fgz x;))/ :^S('db[Җr5R Xmmc:jJȀ y<|7vKxRzG֣Z07BllgFE'\&C٧hPVQH' 2)lAD> |dfe*<UmL:56_TڐRj q^ʞ38]XC$̃|R\œ9jh‚JYo J\҈3G:ѻdjc<;-RLo̜d3Ak`q rB樑6:@z~Saxl;hy֖?@%{;{uވw -D2RO2 fOSƣwn;C0'lR)tTPnޔE1Zq܀j+Ƽ]y-2*/cUlBd0x&(J|5״k[u'( 'R:٧zMݺ)z8R!ݲ.sE=h r LH>/Ox@Cj]^y5E'0 g$pAV/W3ҏ/4Kt&[ǎ=}ƴ MdDlU ;2S~i4mLb1SO2'd^K1V|Hm9Jjב)LNΕN^ֺO^HQ༳w66AN5@bEfyx8 m8M̳1Cf}aGDFpG7Ar̐4&Zm4ֈ+E'hxg@XM7<}9\49YgZ@%Gjw~d."=\@Hyfy@_ DM8q-SEަ/3&`Uq|{SpԿ{xƿVM9'ZQ;SRӫN<դ3ޣuD%Aqц'x'Ppuϲb_j>oIjzYWėu P.^O옛sxEQ= -6hx' rZƠkU'"oou=,en)nW j}3xedU垏 xzi;yIe,?Rw'Ў&r)HzX5HF@.7P8;Ȫ](vr,HR^{7AO b֭pC`'@TTXR=I:}|yzޤDUqzMM*Lb>Xȋm* 褘/,Mد\mm I;lQ#JuLMn-Uq(8 ur)>o:=9^?/O?pxOqRaS?%!\J9w_*41`7As MBj8]X QUzSՠӳ|>}8;yi.X$Ev.I!#3E_|Bo /" $N׳~<7rԠTԂ($=NiN\oވͪW6$QC8Ɵ㈳;l \1&iO3ܰJjX.P`HG RM U A917EJ)IlS&YF֑R&ni[Uu%\! AMH5qq_'vIbt16+.Nj^â|t Bx%E a]dg=}MD;Mu?m:GN8՚Ф0ıZ|7=}?wG:e_I|&aky+"MOFk`%so> (JE*}) $}. ] i`x_aݣHqjyѮ U1ێ\Ґ0 [,^. &.bV?M c>(k֯G jG6qC25Sͦ0t3a({w) :ĕoC9j` eaL٦Zv!k)Py .ҨO[FhY#cfpШA4k9*9s(7D`mș&)wu۵5* hL(Ж۠rmЃ;S&rL SԪ;  2"|8k*wӏea=T4_weõZQ|ܞ2ʛֳ.0 &| F?5|Eޞjl>#ʑK t-(rckRZE"쀨|el$_ %%( F%|,8gͯxij|xLj|jsiCy ԛG,ҭQ&x:ԋ߉6:4= ߄Q#S#2 x|W釗>ͳǔT^֋E|H;q^P-ntܡbpIc=r6%pd&(8 FAšp]Tojf RCm)2x&E3窅g GCϸcx2O4^{@:u4k!4Pb7mXsB PI\mZo zN9vs7?eAܮ;Ƞuڃ<8"z C=yX`l";atUNW3gKY}G=y.S.-*zVxc;,q9Tlf o %c$Iq<"rָQ:L | H)U?G%@2__7*URGI` =,ꆑ +x'hq9~ YCS!4rRGzzVI嚿ƞO]Eܞ oխFq^&S 4=Ia0cҒBg|Ԉhְzul1!D-Pa@|zф;?#4t-5\GFq.5nuْtk0/ ;uSP#\`9kX't%SSytJ|MS'^ 6pLeu#46&yn$aXmrtݡqovyo.̓^"ux}PTJJD'eۮigP=)7,/ bz3Fkt9םarr(7zw?D93:( \?V(5Q[FMBh#GSQ(k#P=ûUZ',F/k皱ǛvG\q illKDI%6/1aVq@)&'KR`i <§#DeL&92@|G21Gst lwT[|6H@FUc; kxP^.kt^FFx5Ϡ j,MFWH%:| O >B^:kB)ϊ=WJiï~9TtIܥOd:G.IE!/G:ۧŷQͱ^rdB?:`H/w:FwmBJ4Y2q*y5%?`z@JJ4WUnQ12) tcP qJ^Ï9sFhB% 4u5뛶Dm~P/')J}0a1T4M$y`!J&F$D#6L̑sMнZ} ZgV hMuJv*Mo`__aV]ipQ^7R9"A.5*2Fa z{{ՖߡR5C }ޅB{}OK_2w )8ImLSE|'F/16)~LbHCMU\6/r*A?&pGSo^%Qs MhvNEc{ (i*-OQC] Tg U8KP))Eu}({-(CS-v ֩3ҿWWp)JV5!Es>]wE6gqӤ3Eڃ, Q rA欑) JzӇ.`Tv9ܱ8lT}S_ Ib4TkSOcʡB>?>~_pH}Hl;92n9F;2a$T!i>4.h+pÄCs_u y{b(B)K%Lw}ӡ^)X`^ ΉW]XxCJ/4mܿװ*W&ͺ9uS.qD!?:AK+x,.<55-O_0 щYVHQKcF7?ʺ|(տu9_ |+> O4oQơ641\gsBK&Tcv]d"Gt J|jYt̆uu_ӘHwtu?˻5$a)mR4Btۑa#{ODZh[F).؜56b |.{ea{SXoS/ޔ#1}9Xr eiؙӆ|1Aنxu@?B'$\:kzDhD4;.I7ȝ_^}~:wea5|^k]qhw;2J|u<~((/DA!-5"!ҨET7 }JaO*-;`*m!SK.6Ӄ<ڵc,9'썀8Zw, 㫺9-3ܠRtCx^n 7 F.xI9?$^c΅G|: Ip .K K"eM ,T>yOoXgOLi̛f{L.}ԕo4}T`g0πM*&qʣWrLxkjW{A/X5Vb5)8:O}yr4eAa>pTU½;+LCNOz#k@>FXq~54=毉>&,^j<8K1ڼlޕK'/4w4)e w'4\:=ZyۡfANSýoe}խ+ Rz#SYH+oR+pAA:OR>Ey'y$qs?K؋sV_[PnyI/<6ʈ3lہ-l:hCCH r&|0E^"4{l)Csc} :gN\ %##nTz )>]ɞū;zu<8O?i~6^2bSK&\IҳR^D9S(*T"_OrU\HKce0i *c`b zԡ%O>ΜxK.]2'5E!.Ȝ52aoFkhӃYcID&&f`Yl'_Sή4א3 $CT8NtAf3# t "m Aˣ]x5$=%NPޮt O/UB5FgX`qȜ3?$ cW[ 9kHZ.<cuwM5Y^׽wJX$Q;#6@Vw5\rz2˓ceʧӺtB\9k`šHG|rY1kuc3|ޮ[8h{vE-%)Aҳ:fLa/N8ptš+Lvxq|'`ꮋvyot L<$wxY&I}uQ.؜365LSak}eYն0Gz)R⼼mz}5DMJ1vJ\oBq:cA';%KDx'(D%Hc\`9kX2(ՖhrWHuC8[PޤGT]O8?n""^iKmz&ZsxXcX6T6c%|r֠mE.w) j\o{bPHf9q{Y2=ZYA>*w@E}/騍+K 9x.E/+)E`r֘u1 Bn#^+W1H~𥤋\~H94S~0' ?.bg -S>cfǖs_2Тs] V=,IlfECYc;n\ؚY@LBƼp6ϋ\`E$jN9`^bӡx֮_E[Nt.5Dadt{z}tW0;QWA5rIJz9)%3=)0KO/أ>r. yxޣh!jS+4ꎚt6%?2ϛuˑ(, b?lcFg6<ы :N5Rzvh3DY2".D;y%Pɵ3V wlP͘V@4} &ux%$'}oP*ډ ݲq 2Lk t2 <'U{vvl~4n7Ry Vp :'On=.rdOtu)kEc[ Gp *gJں6OU dIQnwmQ$[WBz9ʸG<{7FyKĮ\ɤןؗ83 ):Q7kc_^BM62ӋŔWO5FX>t,e怕i{P3:'NE 1}6;R2ls\mp>`rݥ|?u:uAdE ӣdNVj/5On*hl/cY9i|N: Ty.ҏv :P+$]:s4O x+yj:9RjŻfSwW=/eJ4"$Oݿ  4|5/SĊ*]gTN sځ|˺ )&5AވUk==\^Xz HqP Rq1Pf]!DD'(F(&`N~3Zt'}īn6wY64CJ?pW5l馭H8!e$(b:@ML48q:&z]6!Jq|ݮ8WosݵB"M2kKxf+yg@ӰhxLXH:<-UFU> RC v {!* D@^!Wo{ON=N8)yǮ%,o/\D=94A4>5ӂ6A{7;dǺjnڦ?]isڌ 1SyqZWDa{'fTb&73xΘ4&atH͉z iJ< ޔyԠ<(w*%i]]y*P8cBH?:}# g+e*l XST/W˦ߕR/<(iǶB:Wӥ]*bTADr椡KVE]}Yc|]w{$o!]y*m;ܬyX) xx`p f;5{G:&J3F'QX9آ_Ҍr}MtF5^}L>R- (zf䱒2*m QO4}En=mq#rK@ -+B$䡊%&r3B'PX950!wrO}ՙRan^9gJ`rjΒ$0Gڞ0It 0ÌCCu8g|N7E?#뎊?+O|%^֫o @{ߵwd+$CMU S,rfݷzEJȌ ~_BUP2wAj1>{w I 0\g:= UO:uN+Zx߀gQA`<Ft)i -qY6A$ϥ1_tG8crҘg)qwnש]BUN~=0IJRRNܺ<4PNM%Ck9.4<W*M7u +LoLM=m?dkunx*\#¯!%D$($,~J壴`jm>nVr *c]} η@'һ]k!Glƍ"|z92'vD8=~a:ii2"WG{vEHp<~4Z?K1sR>VIA.;|I;=X;{Tf4NkJ]v3)tb,zY߯~_?m;\/WIfF%WGGEPw3.'\ $8SƥUO* u&vd,.pnXygEkgpEUʥ/]5 r}s*4PH QKəӫ]FLǍRx&WgN+ aqel\*)neM^=eTj Mv8VREaYvG秚%r AQȜ22nNrf1yPC¥טSn&iw ӎR_(r#E%r38' N eTzX#) TpF,>߬{ Ԏn9yB]oF>|oP[ ${l\8.4:aLy ]lz0' h4߶M[ìo6LEg*M:Hӎ;HSC3_`sT^m;^=WY'ixڦTuW==oMl Iol&xjxVc NS%lǝx$sP9id(X{Wϟ|Ff'z֬qؙ'JR=|])"TaޭE)"-֗ ]͵'-.̏q,! ya 6Նuݦۢ;1ct]}3\/k5P#n=_9&:_dVr燎W< (E;#tPYg5~u\H8[}];X'M+R,sO<0lgiH3f3݀*?el(=/RfHNEpOQ黥C \(pt^w`S` ZE,< [ E4<;2(ݏMTæ,d7KHgN2 s,?v(0Y,a? bև¦][>ҢC۠ҹ]wسlg:|$`ƘJYi{\oI#FT^l>m~4쮾nL?48&*۵!$ڷH9::J!Z )1Ÿ4:Jl"G;ctQT F?`̶ͺZoon^R5E4xD)S}dh^0ǭzXRTc9i`:W Ï5}c˯ _7oK<в*͑u&|#Ccb}C1 pAW2B<ߤzs=it2-zGX tl`%g SyiPFfpZ=׶((4JaY"`+5½G,%xm>~Esݵc;X{Z|`'M %z;TpjxPg|Ni c6p%/e_. `['ӟ72VcR^Rh6`ͩiўBghNQt*7hx?!|YǠM|So;cS\èApZԛ@,OݻcGȐ[&`))(!θ4.%(7[j~a3q*#\Ns3>"Cd;wȞ{|Gm $=֣c"G`x3"'H%)50֟3,.c_me@I%x'[VVR{r5l(ڲ m@73m ׋OԽw݉R2<(ϱSuā[tGR_ϏF˟Y؋t! [6 ]JJyi<3wdrc%Q%%jڤVymI/:2S!4 jrt!:iX\bծЗ?^QeT͹+ܲ܇qC:0:o5QQ91͐4$@RI*<<'>`poڟ{?j N_OE\]Er14>TB1\ rB-\ISQ|;t0Sgs9 VEؤTC7])AܠE[&8!z:qp*&hϗ6*WMhP>\VV}_Xii|˝fkͣn0{ڈjxǔ(bpD;t hrHAf}piz>,6m侞2!^Ag1<`8+w-q#W -`3~Jݺ;DK*jOFD2Yeϊ 3mKPljsNtIд=0HH40U&R;5ud2B6İ'u^塚se7B$cqiDuDŽ鼦ƈ}%ӶS,x2`X=,hE1θ4.5LX"?"~.Wv K]#ЙЊ]#/׈F5%&s࣪3y a6'Vg\iإ`~vh0C Ǯ z'@Է{63ҷQOA*-ѧ>^} C*S8g ^b!:e !j 2Ӷ1U^ubsR| ̉z9sk,x6GKsza ]KC$ 4BaWĭ/^WöWEghB*_U׫UCi)~H9GxH w <>yvMvq IC6Fy42~[biVsJJIu@:0ԝ -Oj dR޶J:ṳ(jP=:431IVGJDCjϳCWBa s { }[.O5)I+"#.JX :g}h?QBw\S3B'P! eZ9]qDƳ"bU:0x&<ݴ L#'Tҽjݠ[OU8r-D*8o~0 4H5T  ,xÃ~;5<ӗwdE]? ^rtt*"騧`P9!32Z z"M#SM1Ȝ42a$D4f$ۊ)SX2}|[{"(9@%u0Ox#^º#syUBж+OYlXxa@oCy*6hwmqY=o / Ǜ2 SQidi*ẓA2j]Kq4<=Sk,!F1N>ӑ֬ 3futΔN罍_Gdi~SA%gғšSǤm ?W5^rQvۃo0!%ڳ]6ԓo1BFOIK 4Ha$Ԗ8D 5A |sG#d>sE.6(&#\fdK:ؽ^H -B6&v^_2~NŒ=׼Ô,oH z'yU4Vn uGɓX:)Xt {#aH·HcybM#U,5L##4K8_820I,eQ3*'J\ 9Am ?uInEUߺ\هއ|3 R|ͫn%7EN.R@k: +DXy X ICB0q`j#+)Ԡ.n)O~I9J`!c SdjXtϢJ=Q%Q3.'KI%F yIERrm*" n6m}pSc.@)?rqn%kNDҒ)s`gN*CJWsi~㜤Wcb" 5Cf8L )dTxrHL'CIfgI#CRP)r-No%E"w즬|16]Q8u'އz kKz5bPGtlӡCJbaG&R(|*rpF6q`e7yߑ^v/\`T^shdԚU(`eu:۱p04ݐ8Qc;P4Ta1$]`UNktMD[~<u*Uu$LӆSD;Y(M{SӨSxӟ[ ݣ$-ۃ" u+e3 5wMyEMvFVZn ~,=oU'> bȅVg;j9*"4?!ƱM ט#aAPDb F)lmL s " WݚE*6@6#U&͔3ݞM4Hh*A>^p&N*9cX 9i`zfHX 4>͢OyI3%e% }G[-B7=I9nIJQ'.wN`Gs<)aQ38 N ["%2'ZۗbEU툌ളhŎPOci`I*Mמ[ SqPR0ghNVHVEY}+B -[WJXUV7wC-їb vMdPJR@\“4QcWc$O҉68IcU Vü]`~2xXߌIR!*} QrHN Т!y ;=1thrJv||N)N;VGK]{wEY (ghN+!jmç%NK}.VY_x靶wG$TD=<찌L VFgWF ka:eSJZi.Z#I BcWex݇%ze5#A&Qmw0 ]Ԟ|z$=+ 1$"Yxa$#2i p}KkR* H3)лYkv^Nw4Guge0'ߛ]ӵ^]OA IENxi['kvgg:䪢*C%EU~ReH <\kD}T񆂵ӒM`b]3@' P9ɹ}(7_|ʿ$Pʯ\v^٢9lPîJmΰ:&%3(&#%O c{Q3>'OyПC׋m 5\<-FT?۞!ITEܧŧ\L&nUƮzܟ0(Ʀ&ljkqn֝'$![n`U9Tp;_(@Jt 2ƃ7PRƙ'?p>lǹtYx+kÚ8i0~(Ԙ(_w ኳ7WO5^UqZ4*m;f`I !ƾ\Nh/? <0=>%tB,8i0Zq* ,\,)9~\($K{aeY/uzVKD rmʢp[ջT7ChToNN3J'RXi!3ŝ;_Ґ2*{]כ(./=OXWM->RR uQX0}8qr ZsHzdxYt$fLv`t[riUxGW*Hn{rXd9̞JN׺r60{丵F' TD>ob;(4J /9e{~/lϱg4 \Xȗ7W'!4I-cdʤIYq P hgN7r n$Dh?+}_?g%(ε5qg]3eN[:fN2h)>^({Tl@BD,7rҠQxZE@%S@/+vdo1z/ԤwOE}ɰӦ':zJL> /oڍGӍ)`D4Rx%QhuF#obo ,sSmˏߴnڹ1=xĮtkZ$5L a'tH'dpzvzc;!X4Vad2t$7V<`)`f=CH-5^8 !aS<Ր%a{9Ɏ'HSxXߌ)eJ8S{tϫ|Q7@w@:vTh u;oh px8OԝvM8admE`_-44 =*vuN["0.Mr4vSLDngpLSuE7#r҈HDWEs4GTxUy`RK>[̟L =䱽0PkZƙS;l`mt1hR<2;1.F,`E#kEIOOJorv]W%hiOup0k"4#hHFѸBQ:N2!θ4.aYddyuwom,ٿ@a(Ɏ}"ƽo0ʯ߮̈< H,˥9S x5=}+o} g|VwMFuyGm!|_AkS\a^.W%A)(,?cCFi^lᘛ|5F3^+=!"F-5$amd c{p]6ۻ]; Ҳ/m{ta~ң9WuFS.1?}1 4<eA"zeNdu]cY#@69/ O\ka{eu?c{jShù 4]  Ȑg̞l}H aT֞9)np料6ȇ_^ 9BY]n=rw?82H`u2:Evpm䓉2c/ /dؽ;p0$s 8 \(_6滺뵐6Djm gid]I Wp.-Hi!)ES괾dm;/vX qq ;#ǹcigwA@H6֙D^Zkݨ=yl7mWAm;8z˽&bg=ضOɗ8qgG@F)(%X!YM}kJtV-r>n7F ^l`d Y~!K ƨZ:ˎu`DQYC3 4c# C^>5[Xr<7#W`aKV IyC) _sى34'iG a >gO>zCغo/Jw`f\Nf" %dZ]G?\a:ˎP@1r֨M\j ƫꩃ뢛uu9Ϯa)aE ^(t32QJ^RvEݵT:8eBJ鬙cYD6PE~6& s$!QtAhfȬ(8B`4ɞأ-0O@0b[9k@f(j&o +~D(v}H ڴl/^Vp^.55tPS'D|,ΑS7=zWYX`Wzje v1tqz1=8}EeSgy8gDPa*=\$:D8 R 2gLia) wCO,77Jb^xX9|vRў&RR*Nq7զJ@t \Ɔ4c 뺊-BΏ $3ňkP#^J!4EzZ8/hDi36(\gQf> Q 6gMشR(㉁z¹$FZMmc=yl 2/Y* GY3>\l< ֓g "ER :gNy!hl>l(tpvf_ܴ?RI+zv>U P͝oJoxiǁ t O31(u&~He1p d 5C*m)M)اFN3qޓ mjZ/SNCMCaQPm<)2=Spx꜁*8U)lm(+빐4wOTBt =k#zRkc"0E'w%Y)`!j qM ћvGJ gOy#h?նLkocv+:++'.CD0zOԅ9Inu0*L ad g FK`;&ݬcz%RƳOۮtnuPhHVOfQSd:g@`N9_'q$1G.5hʴaa=,WVD⯏z*bAl;Yʘ@ɤ 4u<'rb)&^@G<3՛jP?Hy.6]S ?fSuӼUu} :rVDlwJSb/)$V\9klpSo:$#Uwf#Wr>ΛkAsC;BTpSMZNCVD6U7DY$sNtW3:GJ D Q!&>'PhmҠ@ =Ft/ڈ0T'p98Oش#톺^N;jFn"b)%.bɭX= &Wy 9Squlpn[U(s ! CD>{ћ\HCv3I(q4 rְK-= mTP,W / c%c\e5hƖ7eh>4g_,kI>)O +-5&q+ҖX^mKF]ؒ'f H8> uSYiNr\WfBV̋(*$-7,q_\)k/mI uC_Cй}Il$ f-rK1S?rWLK@ [ 9kH'hM 0yL>VHp&m ?W_?HԤbRh̗>[ Ё {|G6xzA1 qa {\Ą/͆2{ #vƒucsK$A2ڲ52>aEiӈ=,CP꽚(-pITkz1ԺO RpXoA`<\(0N6HJ^sYLmgoǢ_": MLْÿi?> ]9kl Ħ*xxmc4p*L+LWEQԦ{u V|~O8t)}YnUŘ"rꤰXY#TBOc[cB2$%yM 㞈u OwWrZ5[^H"G=eJ[z%ݽoKj(goyV h- oy{#L=ϫS~, Sؒ%!I퐗IC 9e!Ff&M>8`. >Ogk-({%Ŧ2\G-ԼSJ2Euz2e84E!d_cdG#mYV'86f.m]WvC+@hJ VwF:>"A; Й|/M#O!sv;wbY#,N&A.H@O>>^jP%48P>QLƥIzXE:/Z`tR\9kt@y|a1O-HBg1uO ڮJ; pܬ|fr7aԠXp^XQBx, t,>Wu\B<~ʃ ) YΝ `IHŅ4e9>HkW>&k F!.5,'x4QulVn{l4y6ٻ./NPO=ҕ̩i <&Ƙs;wq ;"GPq.jSC|S'Ůb,5"_84SsH3Bd0 ?YZc'骜a EY#!B#,4[^Gr?[]X}\\\l>U1l&1EuK!|{gۥ`y,O=+z@bSw#b9'h#*w .[lXذ_U}݁t±JMwH(4ObTW$)ȳc\9klªHh% xQǼCE5( bYyP}k1ͺ`IeP `wsKΥݻER|ROu/ROiCTc))BwHdg}]qٻ涍W* .ݽGb`%tA *l&$t͓q9hҨMIx.>P@dŎQ㫬x)UA'.`-Qt_jK2 8qIF*AW k_UH uJ\o}*7w߶u^+Qҽ}SՒ`H R="uX8vԖMeuQͱIc4 FMΜts~,oFLQCGŲ_A}UU Hڨ;C9}6QS]v:ݽ=9#jBh*0*ll} ̧&G`yRyz `Ccޔ6 @=ƒ[wjM8gә { çTcLQ9eTQ鵑4Cк?k5n.._ßm*G{^ѓҺ5xS.)ﷀ,JOFk^ʒ9WjbLCq9i\6IRa whr>{/9,ʚo![~ i6*<ntY&O-)*7t0UgGo a!(4JaYLo+dF8],@˔GμO "S@D|O | ipdy,4IMVaډ05E#%扯tp@L*ĎCO{}d49La*9C\wWxC5m+ J5As-+kcOX)}Og$oh[aDE%Q д9"fLP G#(#t!)6q fME20񼨗%pjZx c&+@N9݀Q'4>'RSl9CstM狠]q0q*Abf(enZDb9K@<ܔ3wPm`MG8?䧼 +4@a]D_{z~ A|O}+>eOCjw|ήɢ|=,P=;՘ldt8wq +#+b< ߕ/kQr_U2E#b(E6o<{vX״Ԕ>kTtnvhgN!ꂶt^^Rj+ 9CLy>{),Aθ4.59LPM_4ȦPAVmWG&F$l6#y[Xo0/7GNI3x&*:t5h ^FC9qlJ?³K`*[Mye #[v͑wWqLYFAAOpڤ&8rҨĝ 4zy_W}U__\!U: p }nH3Iye^$oz>:q1F8#sĕ<|OOp23T FZ\ʗ]#lhͬN0D}T(== q}pG7CrҐ%)@uګ!}T[~akIˢ~[oi8 V"iaɛul5f^+yoG+%O:};s Ϩ-aji ÿL;.RҼ쟽wry| j I$LiÜw=}6BMl3"'H 5] v#|-iH)>02곃:iJ\ NZp,'\bp)Ǭr-E:s 2FBPT; /+OėfW_W-A4E'>=x6L%ۇɜ_E)mf&.c!:i>?s; /+ TpS6 + < qdayzaFHL2]sLCQ9iTȄڠ#zmY7My/]~^]~R.D"\{SVyֲ{ꈠupfPgTNQd¤O~T>B 2/hͫU90H`$R2s7a*[JxYeˆ1H=2g% ghNfe5֛{MXwZge :Iڲ )7o(G9Ʀ%lF6)m[\o$M崅ӡ:Xnstlsf@"*3=>gB.4>:stO}뇹fW.e -C}ʠ]lSl!ٜYél ܋Ps'HٜA^^&B r5S:SJH@z\CYP+2q)΍ld&|uo9x;dO}VN/(&`gNPz>(iT`BN/|k:lj34WbyxaU;{PgxN'Ɓҫ}9nKׯB/ PbjtPiLؑeEMKПSY!5fLN@LZm;"]lJ](r~7?=aU6.wH7#uЄ=Tmfhl*c J xx9y.KLP*{ZE]p<%7IHBum2G'r3N'SY! mF.; ('VhÁV8H~cd/B*Fc4ir۽Q=SI30ƥF\Ηq#xS>+|#qӬ>4TvH;}V2:z]k{_m6oU/}]|ɿo"t~ptI0R5Kp{<Ŕiʡ9.\:=&hgNQ^WϩܴHXtמ{#qnmi Xl2TSv]16ςu^okPD#a9iXziLWr*-KI* 5ܵB7@RI޵ m&0]1%cRv5s NcIE>㺨܈[yWuۭ顃x˼IC 2-S`}<5:st >DI6EPF*8%7!3HėU0[*[k36ZylA Y[EGH#{fI,O LHgN|CB=ݸ_U1ᬿCO-9UALC䉜 ƪaht~{6Xg0%(%Hn'\Bޱ@LIe@*2|qdK|E9Ɵ\#5ͶE'+qTR%ΓH!p3 A3M#u*E&8'lҩ,Qo+n;B|~] Q`y]~dcEp!dJ/yh(c ]3>B`ypQ8sTND-Qի%xW왪vG,,ѳ*Lv/rtnYxR?'(F(lZK:xO,-P{ITE}%XmV#uj,%24T>YCP`xBE4%0gpN%Jşlk AVr^:QSy<y9ۘK}c+7PLd+tșkWr#~8I9#sȴLm"e,>Wo̢{z*7uΜ)*Lg&*.EGt஝܃ΡϠifHIf pGX)7K IF޻($,sznL7|RYW.Y"דGGGwFQ$ڝelOF!T)Y $nr;Jאg?]zST ATh!`FSY DYu'n҉Fa־ɷF=phÜ9ix:'t .}6t8q F[Wz#.ALWj/aŚ0rɎqRhFK.#iQ|G"82aȜ42aK cSY`^+jB_~$GXtZe/ھ45A[./0]X>c rgL"(F#.p^rSH 9"WHxM:0; &}h}h%ec-W 3刟+Z;;o޵,m,_YppUKDWTHAlHe|Z8TOd99FhDt!C"|VǸۇ{τ J鐢"Gգu!n4n":z(l lZGv){55Tߎ]7 hZg{·Riz.08{_$҈ky}$r 2gLtRZ9_W҈}.sB xƃ ЩLHK= 3 Zh5]FKH!.М54B{(SFtWU4mJRFih(UU̡~>}aups<[@9kPB(o0~i+{ȑtfRڈzSRy}i`~RKQ"AZ#s)֕:!k'bBEr朡i`u<>muO* e p6SM!]akg"ŒcIq^t]T OJB?&=>(,QK)KܶHF!*ԛ 5NAC217 &nîQ4r9tOapx]@:k*ʧ;~j]## /܎rNIAJ߷Co6tTwFʥc΢s9u)X#U~RރYR. pM_ۺikxSBFUM9Ly>G6R0Q+~~*l뷩$r .gK GYj.z!\tN2}W_~μDbSɰQF2^sDŃզ},%?JCYvCтw@SGȗ^BŭU^ :a/_|>>'G& וB,f`gysOQ7d7).Aa.М34mLER!u?U{_o AIE5B8ɠ|BxyLw=H=W$s0"ȥ q80C]:kJ J{øh/d_6ndt4O|CZYA#vmnҕzCMW\rM|!2Aa.М54@6z=aa#yɈ@v5EpU{$]eH5H°G"h\qynX_vwB-áGݜ*n41*qq餵ȇ{WnʇAku24SUPO5oAǽY(4۴(L@͈]~:n7Ÿrָ ַw;doj0P(.oU9@?{r4(>G)MV8 Oz j%`@p欁0RN&}b|DTnS6.cS~75V0U>2 lx$/0daUG 눜t]p]:kzVpZv0RAPz"qE~|,wWB;orwMFZUߕ?tԉxu sh"G`t  pCT>Ay=_ J ӊR\TL++:S#&<xD!:?qy1xĆ8 rq "ZQUJ7Hr{|?zWq9P8|YSqZ4>Lܱ=:Ou %rcN"^:gjK <V\TmDGmYmFY!/wSRи 33RsuQi*bL܂:ٱ gJp񌵏³'ǹsTNڰ˼koθRC5H'3uy;ҿ>tk#U^*+{&!X|ux@(J Ť:%uxeDY#VHҥM9_`'oR1 4~Q_ 4K.>Ͽ}hq=LKC#ϟ 7Ls6=~Wd3y# v!jVۀvCfM齗Aۻuon5; [vg+.fL9BBX9L1 pAQi^ڂJM:SӬ>8suSP8 gDJ nbHǤi6WӋwB!8c]:k)a2ZM[+|[AAD^}tEӸ &rP9 :.:=(I$ K8t MzQf``\`ԎO:tsU55;w@!qaeihLٽLќcQTb/&]k{ʛ_Let[ 鎬^@I͋u0Ihڜ&+i4mW-5$ B2Xi@ >y^8ɃͶ@6"r.;9ZC-G:-/SEA) u4@'\20!7i>c`~ʐ9&чsR:3;2Vp`SM+?2e{S3!0@r^X=g2 r眰 A pAQ^;5M^,7;gQ4c::KE{C+ 4ȬL%S\dN^m:)9-5(at!xR6S&,N?m1hm97 w묦w\FLZ&qG|Tg.7К~ S 2gL) }9<6^_}eucy_X L*zU'ӥ1]ѱ*( 5>Hr+s/ˇ\n;VG{(Z ̰yJ̢p=P 0;LH(/e l*Lp 8 ΀렔,Sqٮо|(z\%7)g1ŏRۢtG'>9 ,w,E']83>{.96c]:k&(OIB?Um8dҧrt*8J%{HOXdKA'Uyg&Vϋ+ KP .gKBy "M;Y4_w^.h[~8,)ۮ9!KtdbIM$'MIt ]4) BAxpW3ܭ:7i?ys>M8ד3$Lp @g PX`q*i+w6iˇv ,@Cٲ[58䴞tC_uy6Bsd"@tEP  ޶cMec?w0fyJ82h>e ?S"] 0g L iR@Kj͑qٔu@@lƆw'#U63p4HQeG5ioc\9klrHQ0V#" [!ȁx,/7zTŮݔ!ga:cPtgdYxr R<==:nܯj`Ï{˱9<$b\9kp~H) E'^ۜF8Dfv]!"UW#bLf?:ӡ:%(sfEJzmP]׀kFy-Uol3?3@[6~hd&!r -q9OǢ ꪋKGt8uQ_,||]7iR~Ei{\C%q3;)m빃KHTQAY)(nk~lv_%9ؼkk44>17Lhwu֙ndIoX=A4!D},pt@;.*YvFK_e`R%x>gl})u5\M`h/'w.5CS:^!.HvImǒ ^7¢tڤL[Q5)S7F99C۵l7O* OQr>vѼ͂xJұ/tn w!&&T,vo؆OmS&Y@֣vX_D Y1Th>4Wla0D+Ap>"Esd U⧪~i^XTQ~ŽK0]zRz,4 S- شǡ%Aq?/bى<^w]t0S˲m+h]&z=~Xcgږ<9E6o$sd [`Omg͋n IRR E0L\2Ђy`s>6D}{Fk5&Ԟou{ u K#'C2MM}4F[&NSUXQĒ=.[d[dbuM3l̄Q}1펎4_7q4:aw6173//X/!yɰGö Q gA[6V 8 ]dc& "s97m,9iDD9_.ϋrC]~cDorgtcTh)≻a}x0[#ٲ/5rq tFi3I@!/J6yx o4>8:`8/R'`Rm 0Mx,ҳ~xgDn`s^TBE1f-Hq s椡 !ltzySw-fя, сlqu }h˻495wmBbF!ҍD|l9rx-0E7rҨ-7': >+OşqWNU5gQȡokضepƟsS-uZv/nOb$1J;A<&8SƦs.9ilm tD䴑?}x*׫r=$Mj?6DsbW#&Y*;i<fPN"M b4>p؇ Fo1_Uߊ+:f0ݤ%X@΀rp9|px} M`38' NTNoҧzQWz8ujq_!<]cMd0kFkZ4rh,^¹#9s-Hp^n&{S"u_r-85ѯ-ģ#Zع(^FNlcJ2Ӣl{9T:F8rҨąPJGg寏 l|s}y;øv0Æ-DJ" ^ftfs,95Z-M'ZAHLN ʮ@3pXUc}܅AmJŦꀋD%=m?OA9Ά:sPH )|($7AS#HP=j&8XkΉd3s̛}9jsn($Ψ4*q#m *#>P?YV"f,r0ih}BOɝ9G/&8zx׸iMKl"ݠ3Hǀ"Cba:iB(mU~[__c)wZA˫īb}mYUGq[uIv$}<ȳҦO`st<>f#/qqU "47|_  Phft] f*vȮ!G:̄6-fM5 dMǞcJźI:t(ō&yN ͷ /\wh~o˭ɦcx!E]PbZUջ}ۖyZ1tM9sEPJY c'+:qGNvýz|4CwNObt(wN)SålBI7AQ$]Qޕ[tdOsΓ8Wˡf| *E6etst'߲4nmσmkJr椱ύ7q5ix`uf&]# 3u"fNpkvb9pdcyD#J| hf-CEa'ܨ_OyԠɪF E&٦ [JsgkCwrWO&uCœ9ix>(wo.v.įŷe >P Bg9V\۬;HZI9n2)n9AF`D I6DQ:!߾jI~%GN+uh1:e:N}NOexJH_VOנexMIm5 2p8_yVP~iwUo ;5s48i,j(jm$F#Xwfl85d鷇oit7Ct!`u#Pr  im6O:'>r jh2<sTU+blY<^W*;QNL Z}|Hɖ;ґQl" I <}5:NY^& ܴ-Wǫf_4N%b~4x$D*3|4XV}~8MYҰ Mp3B'PH%x[-ZVݕm?BqWَ6Cw,tD\g&e`HrM"stouCM3@' PXEcLWX;cXx̆&dzYGţ?ZE LX;.4 P9M#OMp3@' PŠ߹IFkl( 䈇5g^?ŲXC|S,D(욶tN ލmi_jՇv8glNiOqOL0&#|$~V8Ga zjFN)$>Z*PO_z}Bh E(ިspD qF椑G2,D:: ;0!ݰYB*d+ yG7#A9iPz(I%! <`[v H'dK)jlɘ;d@-*+\#|B H >Čך%6<a)* )CKhn&rxw?Oe @>iqr*1nAnգGy3uݐ-.ur;#pÚP8Ā7CrҐT\y9:bbu\|)݃UK8V:sCvs 4eǏ&J %eln|T~b..ɤp9l"A^O{D` $erfEi]Mep,È0D ICvC DɒOP^1ڲg8mg}/>Q饖zЁQlS4x-%k`/B2[wsCM> vDՈrv*@rk;+KTz6B!82NsrPZU+1I[˪9j=۳!G눈<ʲSEKkǮNR]n'(梐σ?4tYTɦ{\>10!ڶag`gv60p ֽQRlXF-SL_QԾ"<1q,K[\׵׶;jѵ w{ceqkyGJFCgN l{:D^5MuSEo_r^d5ݴȂ`,N{\<:`˝$IOIh`+ghNw<_v fwxUSHɫZCŹgs&ҠZGFtw~ù'"6nFiZiY N(.vá`C/ڌ9[DnGZ`3N/YZewb贕M!ɣ^RO(G8sLV>ݱmQ(ޯxhhyHwW;;4> .2bW3]^|)A":GKu6tOSXjƏB6`/lN/94p" ř> PK_g@#r e3'Gx4)TN{X"n9?>XiS;qY[ y*g`țV9.w"@S lG#NAL38' ΀6::L[˦c[ 5rՆ,1;bJ af+h>,YyOm0; =OfY8rҨJ76SuW>U M7,'N!_wO2iH0>4%3:΀ H]ׯS@\1KcoR|6dvOYO-6)L۶i՞KsLՆ4bQ1_ipMI19iLtHicV0ZF,LF4em~4΁\>ѰvR!#>]ƶZ[-r_unf;Ct./hf :n`\呐֩JUn:pK}TG JQ;IC3OpHf)0% X0v48aNdִ8XG*-TVܮz=pLu&W-&P.}2h-cT$L:"Grbҕ;+v(8A4:a dRv4j_L)ZVX)&u//R6]؝\Zo+u,W:kPSG,9Dk[7CrҐ IkL4iW @`So˧an5.VR?[XYs>)K-?lh-q9e\qMe|kb!^^kiBC9h&Rc$|XH/\ȡgtyn3He{8rҨ)'w)ApCT^?ؼ!%6fU4@#EVe&UPIq 00XqC( k-I)פ&F' 3!+$PoSҁAZ 1}s֎5r$Ǖ@8մ* /!5蕏l`g`N0SA pA4?*5kFq< ]*AF}SLف4帏+!\q91~1!\UMQ9iTǠ~Yֻ?/A>_a1 VgyYpw2ǼyAF2]K^ȀsB:z|\c Dk21`3=cQ׸|ed!3"AΨ4*a ¤z.$?j\H~Zo6A㟨nwhaK]8^t82^-򺥚:\Iθ4.2z%oW250k_DZ7u,)~[1tu9tڙR .1[^ QF9*a%&̀,)ՃxWRvŲEΥ㲪. z3E`^KFa oP!\Lu1:oG7rҠ4Jk@Gk)aߔmcQ6=˺ͳ.ʘ '/ % yb! aPTCLv(('5MdcgN1=c GleVZck~L/0^ əmHCv iW0="m5Bw 5A9iP)oLCHw Tx4pdpR^8uSq t;biu{W%GM^ne6q` IfAS?8~Npu)ٽH{\mwfnDCjo.B`HN;-reޟ# "M38' N9M ۛqldlYt]'C˺nZٝHdpR#)(꺛%ݓ&RﺚDC}3$ Ɉ1j|r) M/#WsA+qoetON.UBxS֫-!葫ٮP$4Nsl?Z ֍K 爐4 KrtgmM8Ƀ<Ϯ?хQMQ9iT {@Gz?%Fwg:jv߮6-EGDFk(&ӈHHX!^wjAM՟o*њ9s W*.J׏_PQ5HGKbyg4g}Kw΀toJjQuPR`hM:i: J _.fU)xJ>Oht@j+ j_QPe4瘤'F@z?:OtK3:'N .ӦcuZ_zz 8(4OZJ)C31=zOݷ.rv-CeRh&(Psb`gN01:c,^Jx da=]1 wi ]h1:橑O~ZTKE(=Tp-8{S#A7J;X$:ghNP= lؖ cPV-[-2׈VK(RT{$NJw{dȇv?e>FF20MA[6[C&.%s-n=TZ+,.dZ|;GNQ>ꭡPMS^W3GiJD6sF c#oLһin]݆`e=FCxp)sҩ!)v,K|VSY m3~x)%I{I Fu3$' IyW8"8k~S5+tK^\/@Pw4m$ٿR>a#?$QVZ+fo 6\)&ZsD2cA[YeD5%L|| KF\=3SV wA K" Mh]/zh_ln)R ow`!ʺGZ1K>Ĝ{L`v{t#YwD鉩GYxfbY >7#T"*ޤtYHM@kIoj͗)ORWN;sOn)xŷ`r֘PP&)wZFm[GSxj2UM2:,BS7HH^ɬ$̢3CNXGb/2A.5Bq7V$Z#Llp )yUV8T~yQl<@dtaIu'9w8zcj kK4R!+5WuQ(SeƢ+b? S֬y<Y14mjN*hO7iDܠ+ LIzbCB؎‹uSK׮сZ:`dkR>]kw: w  ]eOs |A{xU2 wEj6Z^j'@1/@5P 55LE_{ geӵJR N&}.ïC>y+d>F#OdmIGC.iU"XB4"@r֐QH:L.Chz]^uYsc >M* ibF%p}NF u1}ⴭ 9-}IIgxW%Ki|~Լ.>d}8U/85N= a~(_GMw9|Lʛc=18L݌Z 쁫#]ԕ&6Q`?YIbnh`qXQpC?뺅n]Mʎ/?P,Dʈ!E84?ieu6Z%: )(M]>6F' f\>G%8gDp:Wh)׏&gKӃUq4f?HQ-2!Y:a꺠Qܲ|#]wZ Q9ա4=fB pAQpWBP+j۠e.J'L0ėMypq b 7r4L< F朸csN`{iˍuB^p:k E !⼃# CNJ)l^}*4Lw;vsXqȉk7Hڧ߃E)d 8=㧶FG֡f1AAVR֌ߞZͺ Y)urh)DYS#:#CmR\z0V7g%"ѻ0Nc˗KD^xPcd5;U#]9kx’(*GRxU 'D VϏ ]f|jnGix6^.er)YVE$dŤumn1Y[4XoፇTyN7Z|HfpvHnfpdO(F# ۢ]lk>&OS in.A2 t~~z)맇U7W8>)&:]lJTp3@!xN7Ff1"pr`#]9kxzt*5u[-۠)\f끷\ނjg.Nc> -Z1[}"skrp1],5f}O"J "wCOxoI;o,Rn$@M%}SOuc `8T8̗ qXwʇ#ާZ 󐥍lNDȑ;wPgăH.$Q~ٻS9p?@tj8TEUM:u!8jS!7fPtُHVvqTN^S~mǀ@r֐&\/7ZGvS7vn-7ѣOt;OM; ZG4ƌL8aԻ=vC  r欁OLxYŃvt ګrs2:DZámy-kaXKlB/}>5iDŽb1$.5,5RFkF?})1qS*q]n;f߶*gܳ FU`ҡauG#޷&8e9>t㽷创5&8pjd://8>- rrJP3\l6wUFg:z_hFջkl. LmX77*%(FEdTy\Ϸ4NvC/XխNOͯEPTiS{{OwAz!zrJs&tŎd i= rpM셼uhuVdj+$l-fHPʺ;*iAϝQV2,+%',1FCưDY9AZ:?F-yRZݠ.QҲS>p ( DŸrָKNEOU㷋۲ ^ydz{r8w>`ru;Lu7P8yZ`,As8ƦD93ϐ /z#3@h cBi`y8fb3Ee`)ψr5cQp1ke tTj߿78=j` Jyepq4R_-C~=< nDbCx 'MaHST"@sT 5J՜UmY_*.y |>Ok6p[ǭ8kە Ngls0Z>3MzÍ植dLF셸sQTZ:Z>r[?"A *ćuy 0q*}g3[8m<`'v>5U3"^K6^%*N,ϙ4Mܷq\]9ktrHZyVqŶz9ӹ Xm&|Tʛ]8m측#i,N;rhpH"s*"eMK25R5 Et|ߩ? <7 s71 G :sNɩQph}xr9hWo{y Ip *gJj- 5ZX=(@Rj'|A(0N/Me6o^GjVrt"ǻt(UҔD[Xck-{u0,.ڔ8j{#LTp\CMxIsxs݆DtHj_ʆD]C4 !UYYrWUSLR :yΩ6ЛCbyx.90q.58 ӻ`r6˫nd>UQ'mm\bnpȔn!6qN%>dPfx{v£/sdV5T{xb92Gt(Q&J<-0 ƇG`R޵gPHձ>S&0]GL6]&̖24s]vr4YDXm5d_O_Ń=֊ԏwr}hIɊ" wlU@d^\Ưox_(Í O:s`tm^)Rxzp|gu}]f0h}Y6`7K^ɓ`RF8 GE7LPߓCDY4NӃT߿ڴ8A9/v=?X-gw Dv$q07SK __ȤxDpa  (R7MEn*G}N5`w?tw#4Ғ Rݻ3\I"[ v9f;eA[ 9kHJAJVǷV;Nz#&Ty?^yU32A230]rî;=d!YAXl2!,C]:kHiH4UjBGGnp✾N@6Mۖ |!"A@}F'I8Pdޑ1 9&, Ҩ?Rqa3Jpzytiii`%[dZtcI jhّfyۂY#Axːi.ܶ)2=(>!;:Ok}m <БX3 G&)hB[w)]@:k.(q-~LCOe_^_mƶyM y,x~DRf'o0s7x|?ၪ~CܲP(O#IV 8+zykp$%7HY6BZju~RP$]Ddm$J́CG)SRL. D)1Ij.R_?K$9aЇڴ8={OsSPb`E `ZXx8TD Fi9A͐4$ B҆ VO_]mC9C'L.z]ǹhPQ+ En3w_#^k`ߴtOgNRڧ ] e|oӡh07e,cK7˭!f٫;6O(utUDI#D 5h'|k4~ Tca-꽿 nR{ꄂv^1Ɓ]@sv^G?HX.<;sLs*a3;]߳ܪ #)]J:nGnˌP\GE@ܫ?%1\t'/?Z&r3D' рEz2Pr- }]Ȥ(n/D rлRF*&:ycsR ,Y\6]>'^*9*ф9s茄Nme ,ԠpI9묀=|\ 3v CVi5A4 Hy^9iI#Y39sT3N *Qm[.N~U=mFyHpzYGL皒fġ#7ml+ 9̀4 aM]>@|UAe) )m g26Z4hEXf9uuǺ1MsbI#vF]IC?#)xS'.-R'QjttL^Z{xǧjdݰ<5 E(:2FuM)48iYmۻrti Z~pnMOu}@s`chRmڤ^ҀF>RDG8rҰ Ԟ *o#TJ=^.XITuP{αYӜqH^ѻutXSPCq9i\¶Ȥn,.S|װ(zhɚaN?v , M|do ʢ4[j Lɠ7R9FdxZZ=>F5oN+v̲zPd9mJ\Pj\ML|@D;t QETK_m}w5P^)XhG1P GI*# 47UC: Z43:S<:6#yqXœ9ihºI=ɖxGO-DT.e-}g]gSYgh,ma })Y8.Y_RF9s5U^)}<@z;~ l>/Cv/,u87{;wM4E'v9K&G&0&,VNk U!_Ds'E!x#K]c #(Ll#TY䌠tŽ]Gꘆ9S)1U\,ۋUQ'9eć, =e\W:;i|ѻ`_ }nj3\eQ<)zLP3<' OY眍.5S7Mz5M=u;s0lQ4mv$HdHɽ #یIQ!c L0l}s^Hg0::xi~5#w80 fd%/,% 5-(CD IB6D O$VzPIU5D;>Ńi>"5X3nm'f#S_@94A4V㏧>&RuW"cLc#wIwoʱhP9;NGdu#2a6ƧE|:<l BC ӫB<_*^~[v(rQ (reD(:66;Q2rPG9F%l@f!ۧu]/֘v,7Տ)1Z{|pƤM(4YY!kkdjS0Y2LĀ7rҠJ-S bsӗCͮ\5jk]2G{os6JKn.Hl 56S~y! qa.pCm}w؂%km ]bOUỵA(رfO"@ R>KtAv>>./Nwsn)9'lT dcӦN9疠>Jzj^ Y 9fǂԍC% LģV4bU#](ePMXgNBDd-r?WwXد-v|BqA\кY~CB\PR]'+z䄩 Mt_C&P IB=W;2=JdSߍA!U5\]J\dbK @uW V8Ve{]"!8UYrT t K"gBa#\op@ԝz(wZR,)TRf$,(eՀʣYuh֗=ƂxlI ;E9#sԄz0WMUZ5[`%Fii XӰD|lP5\"9N-\+(ghNrVrQN5y~]vKjWj3J|$~]&l5n3bG>0Wـ,m^ ^:'r3H' R uNZ'S~{߆i:H/^%,1ϟq͝ H̏ʸG4M)qփjhX0Lhv|.߬;96i]m zBlu!k#\HoPkze2h kX)=쾧e&wfOMob9rp~c#X\zl:ghN1 JK)acrU}Asq[@MȞ6U]ާ^ L<ѨLHsgo R2rzXН5GoM8 sP.@ərK޳N>yD1&'l)4p:Qucm ?5߯R5ߖbԪh]`ps|y(o=;y{(0[B|϶}dqrv jĩ#N_m;ЕVyH^jq4|+F*)HHz<9Z]`t9*A1θ4.aimj*p]amز.5-83u鈬OdZ8贑?4pa~sP@^-&I0E8rҨJ ll(` `~$h?m6)msFpoEo[uGI;u3 .yF՗3 wdPK&8(쉼E)5pLğc2_˫97F~LiYuJ+ _T5p&u=9`cDsZvG4Fa_U-k2ެѶOKΫ9:AX^h? Mm[qD4wa҈_N}4zo70Q9iTŠG55iכRLMSFYC߂]~ N#I]Cח8Uye7g(Ԝcvvg\N E4.j`ݬQuy$섢^Cڿp#,a9ӑgfw,/%/.%% KONٜ_clB9exzX SƁFaOi.eMPMx8lw!ߡWx@p &(iZj[qn9XoI IR",a-|_5oI 2Y6. 8CݏexѭzxH!d/4A qa [f(?j7 _kwMzG}Hgdğ)Jt:XYh8JjT@HHi(N;iz(h ݵ2<|ūثcEHf o9c9 +LꋜG]$=j"@Trie_ L€F.G tnbĞ]9K[dNd'JYR:smQ0'vT̓ir}c'>Hy_46YF2 ́2id? * IvF!Phbw 7Xea :{;] : <BbaؒGqׄ ^RL!9iHzSV8)FxPy 2BiBuy5s0椬dޜSO/h)}'kA~IDBŹME{\F{NB߶h䳣5{XA+IJa\<Γ,rP9idț#ج6wƞ^Wն\-aU;{(B{IFgkP-]mbxe쪉L(2Jnemp~]8&=FI^a F¥wObg,n6R #,P$")4#9i|(}'Y 7Pp sƧgÂ*@`OHu֣~qMC9uy҉IFQhQ#14wK^eMd|KPuvϮ Ot ٘_ DzKrwisAhq:yQ&F',V$eq^!(/>_q(av9aF&K.X77xvj >vm[Ѧ刞73ⴢ?38 $dΚ4@ eH5 k^. 5H66ؚz?NG ԝXEԏjL5-W, #OX;3Z(Zocgw KZ2$ub@RR'/h A|0dHrNO?TFG.B^:kJ*FV*7YpǶSWW/:i6ϡGJ΀EIiԠMkKF1Pj#oI:ml0YwCOii`n ARk4<)o0G:(ƥF\%`jSгv3}iͰsVm?\ˈXS\b3-í6I8U4KOcltrB\`9kXQ G]aƏW{<:"sSXШl^'Y| ix BS.((c\9kdZ@ 1eqp~W=]5תm#ƙ|:0ʋgn C"]Ƨ鶌k4wTh9c?l~"iSXtQFJed'tKyjllLjC!1}Ob'3VtҤIߚqaF ȚTfb@,rְ9 =&jHKBʛ /a{Y]5][.iI90Jӿjj~^]}N'%2F.5:&I~q|iYt;c\oW[267wth2 zƭrh9L%l'LQb9SA$4Iw1^Ež6-}ov;qM#w/{&̘?WIi5&6?EW؝T)BQ!%OD͏zAk pA Ԑ؀ngNJN^>쒚+%YrX#4R&P*{QAIxVM5|5{.PA֛㕩t48&6]#>>%M'wCkII!X.|rsYT!J];}zC/5lѴ7N]TMck$<r\ vA <2zn5'ԗMQ%e=?v9涏]r6ic)U<d֩)…%snI_$aHĸ@sDȃ[ #,fڛzSޡKHrB;BL)RHTpAܴB:5} aY)ZC4QI%Yy?׼ok,MjAjf:Mi.]L'KN1>(>.5@ 鶺{sUֈ,h Ga~iS=|Md&1u*KեR:Sn]on3^~*u `H 9PXBD⚝[ϛbis҄I?BzϝJ%޲ġӯ u><$PF\@9kP"%geDfww@6eKLv}y*j)%89*Jw[©ɥ]sm  tb] >O l>4!+UWk ߶$߮ɲsF9T N#leq&-C5Ps \FÓK.5@`qrt;o Ll:N!k϶ d9'+ .fPؔG(zyzcYeiNeg0tѩ16肄$ujT*Y*; ,'G"[V\_;@&݉9,qY2mu} z\ZuKn"] D87KC$+l@lCOzO(J PA酋o;ut}FxvqgƮ 7Dhp[|-7qi2ݠG]2@:L}Ro{l .F!tm.@yW!9!4j5~;Bo+ˣn4t.:#oT^b, /OǺt(HSN '+a,@ѱ3(o٫=FցAi,$)rSegHW܄Mo˪:+&ߣ Ⱃb9ƥC\zP\i^?E ;zެ|Kk!ΦpCtIGNKN w9(DOXr次 ]!̶>ю 1d^G '\ctICCCG,O2r 6gM )~^mnsyM-covu[mm?m﷝Ci%f4pWi* yϬդtъ),s , Kܐ"x@57VJ|ɧ۵Wkhvhl$zǚrҜ(-'FG 9c8[9k@ dL{nV$ tn-k{d-9[JcGI@ΥR2o,bQy?M,/1D`za=8OMP,@Y|;1+Y_o'[;u{Lym(KRڦmtȉ|f'IYCT!D6Z̎Dۄu.7.q]_p+[d(3da9*7'|&7B=`wYCؚ֪]ݓo_qt#4 #Z?==WChq(=W󒐴D034ni)r &%8gtNJƚ% 3f%(NkA ՜:s[Zu ЬR3d&CT칷4={uKm`tˠs2N]s_ؚk)zn \>qY:4{:gܟ 'YHQ'xjTߟu҇CFkhc9idV(H/{Sɱ_@⍐i -Y7~>J& IhԵ)N'&u@3\^lB\JQ!.&`gN+4ַ̼YJA/3 ^;Jf^GNN.jf _,vwUc I1! %C[b6BIϕ澾e@P#vaj=ѽ-Rzчi0sE(61>IU#ZVBnEˋ-'C*~٭Ah@98qeYf*Χƈ<1&)Px;t(Q,sC{j'>CVBY+6g6hI ܜC ZtEhHx CYT0&Q$Jn!iNRq_Kr/ QD}ĕ9Xץ5B}:c8G=wZ gk#X'G4;$8FCTs !73nohu)'}Lu3x p|)i"xky9OE7IcC!騤٧f&sSDҩC޽KG#)[*Sӹԑ?dkMGD-a IDQQBr_>B{Q3kb) Av(BPc4ZLBRrl!]rL9idFDɓf6uxU!wdMvTSڌ VFx /eQŶ8sQ?#S%@DQ9iT&DeĄ'_c򷨀tH:|!eëzt&ZdDL7W=ѓ (䢱)"ܩ)KH s`I) v]e(93(dxc7h/?5.AurDܓ0[?jn$gOEc5f=ͽy\tjOP3@' PEry^Qrry?U};H^6gl9`,MwjH8qzr" IR#(Q0OO4 ifI9q7yHBKܡ]ͤT5p9%O չC- $a_*9щzD IvB&@jցC։6C s ,Z=N5hʘܟǀ먟Кfa*"68rҰPnԝ _-(4;FP|RA?\vH!Q3>>(W=zwl140a5St*yoo{ x0u}_੦N[ 9s3X]B|=A Wݦq4:a)d!z3# fK }/2w<#R 8t-馲glR#}j䦍't@gtNJ&|NtзAOf{x(S.M Q oS$MV:ps]ﺪU43k{+MFfLN1r-g&&+d>:r3iCHFkB3 E ȹ#>~GG5mx3(' JX%c${N.בBõw 5?&BPGZIQLИձsKg94#0&8"Ci q޸$-RECQE U&@:pb P~ Ccq9R2;fxuKK カWsZ`W0{(4@a\p2Zkqʁ!nȳ8_k ^%ZF}ِu壎;҆\}ç|h@ae:~KkKq4:aBqБ_m\^'Xuu`eYvɫ-w|S))5iƫ|??Z T (:vIg\N Z[׋GHw KrP?x<>wZ[Rӥ..=uKG q߳F``3'E\D{x x,奉J|~P6E);hE98^2ZE+c(Oԕ஺x>c،I1TJSv]3E!9fG/\T⪮Fr^6wt `dTѓ<6{w_jT,Q-]"Ic4!Fu3źoIJ[e٣;*ٿ+P8:(^@=0Hv\R&&}PUm {$U+m YVww'XM/k~7RTW@ j,bw A:wz=ZJC4y}.ƪB$9ǧMeא g2?~10?+mH ye\0H#H3>.Fd:v!Z/oHfQFj->5lX bߛ2鳅&EOQQ;u՚(ۧ;[ GD5DI>=ff|W6cZ@OtU?6sI˺ƙXg!̒$ Ɯ'OM?U۔0ghNo7\MoU ՕP[e2|H1FʝQq4/SBqR VqpB9ix:!&E3bC-}* wU` [~=٬K4gMBdwBwM@gpN fhIb?, Emֲӽ%&.RN2-(c|Y4 k,*$4c4dq6{}[68&"P<҇~fJ+KTsF " @~% }Iv+ٛ9YƦ:U 6=/1QxM#5X\q s椱 ["6,_֫Sרk[ LMPX L= '3Z(Wa>lq.Q`3H' R ?>-nnVE?CLF" Y7OO N]DŽcǞVFs(IĐ I6D) 65В_w5'arA:7c'`5DR^曠khIA74"8Ci$S{Q rF椑 !X"#rq9kꂂ[D wF|i`}@S' 4ړ9r S攴MʧyI-^q&5_r- !mڃ=e\yJϥ>.?6,HngT9Tƌ G> Fa&B`@W)0Aq؜46a3OJ[VcxOCnko+%}}T?Z‡u*/>  yٝ QUo3Xi#?͒]lrHڃ*6kNޯ;' Ve%>ʓ&VuleYdm@:z:O+ih"||ڗ#Em#Q6CXA$Dbd4_?B79a"~{MiL1%cS:("֙ͲҦ5>>~ь7t:Mz:'tzp< ,%e btfNE0or"]hx gJiP¯vg2ѻ4ͶDv٤Zu?\U50Wu$8Z %*x;^(t32?zt1Xr梡 K! |m,}v1t3\|!`SkY{ 숉my>Ʉ~"sݣ奖$u}GBȡ QWmά+ml.).t͐]'w ,i\GL8; FH,u@SLM:!@v'}>YS P]E"rш5T^U6-'_mˢn&0xCu95|[ۻݺ0*A%cEEg/Fgd)sNJEvCJk폇oйR!- +iшNÑԇ0(S|NۥcD,rѨtʠxT<ťR ^gco$ax߭G!7B6LFGg]Qrs{tyfK a+*JIm1.ԛ䓁6h[i_";l۲5IW&RDi44?)k:tʚ*[YvDsB^h ;M 6GD.}S?!@gkTlc&%DoZ~I;6Cb %R^HXI|YKțG6uF"!ѝU% c>,]ѹhtZDƠ$y/h#x/9{;txS|n@F syI*v_=}g,NE!N]?`w/q|PAӑh Y .WE!&Il,5^Go&rVRN?s|a\40aQps꾬pDLΘc>Tw00ϡC}Lݨ(iI|[(9tI#HXnBϘcH]4R"5&1́~PhkΣ_ًLp8${u{VӰ$(u&gg,P?ɫ.HXfX>DKh\2 ,H .bP/:~ʢN7 ɮo@C{sziK$XJ2br F-˝QAd,o>4vEGZs+@˿-nѿm$eHP/jWwe}zwN`[RO^4 M9T״]v8 üǟ`}+:N4 -|%Q90=>Ɣ9mvQֽS ipިEѓLv"fqN2tW]t]ѹhtɋշo(&rigGEiq!w JT2((xh}5 3DOnts`,ǺBtEtE+s=bѴwXS^&^E&CÒfC`s R'4ګ5e͓<酧X E @ ?HtʲOc]?.*M٧eGq) OIvb3V|=eSDO(,^ql\Z¥сSKύSۧ1$𺎏d fB] Mޚ۬4Qrْ !K E!,3.60"򥨻|G]9zAJ&H.nPj\2gq LG0)E(F%Rlϋ3Yշ ݅5dgٯ]2(+#%mex WX.Z*'DDz&]mߡԳmY<&hb[wŶkn$xyh=aUx?Ia+X VhAkbWuQ9ܲpܯ+D~].( 5fҒEF#Y>7Gm\]FI=Sl+  HMucdQnv͑bE7C%# -~(q2&vc+ny!)JR8xӻ֞N̮Y Gw#Kѭ\4$q䌰2EQ!akV߼]䁽+fۉґ8eD:"ScJtHx =K4dVH.r>)OvXjZ/ܜ'֐?TJGO8/H+tQw Ɇ܂5I)Uio,vަjL4N8k|L8ݣ+ Wl. .qT}#%+4暽Vœcwc6qt.xjz gH/VZ |y~OM܂[)(Wh. 2@VSNδ;iL>!*9D<ؓ묦3d)m\/b9KƧOu<"Ȳ+@u{|y9\֨%4G $];\|Ώ IK"ShRaYd *`zPm@X Bc|f;RPȑ(튔ARHƥ6ܑs) S9#c9FD%|,;V6«Mb7~vC?t;{ fEQ\#Y~:y}2B;yy0S` u ">kY+PaEO`|cu)Ʊ9Q#óak/5uU؀x7z,IEY`^IZL^)􎭎5L3XoݒfSJyI:@)2F\48-hb -J!%X'bQ"D\(?sn5c*ORW:DY~(OYBc]+L S$'8Nu>xM9逭qᱰW N !M ,&MPyYQdGr ]R+4 MTFDBrcVtzt=!c jO㯍SN!^p!Q"Nz +fҼ)LR\ѹht.,"~1oC&9 {_c8v2|u_rTw]p86:qu0TAC5H$ؔ^P`sEqPΒeH@r^벅ñb[ŬS 4>8I C/SgTI T/{7U{`I“ Ovˇ'p /g~:8CӊsG7m=48!z6 ja<䙺vPO<;INSF) օs C@U ];L +(=m8? W7]U`I4BdN} )35 993K]@pq "+5U JZf~|w:d eg- `ϜdzVR go@f4sI3>G&b]+6Mش+?UMn J[1FP?vOPm;>ݱKhb+Ma Ep(x'׳vE ;Y[AhP[Wk^;ߙiM%ˁȜRW89qġ Ƨv.ZS*H<>b׀xrр}E9}-5/bL5JY|d FG^)T=BZ5Gr~^.PAWd5)4vEB֨Urno i:#XFޱ7ā˼wpJJ!if4Ѵ9K#.Ҡ).#,Bj<ȼ޷_N (6!~?N(~eې@N%*zΡ/7t>q1YeSÂ!IXr ; B;(O(c|'ccg J!|,ӌ9ynt8H:":eLT3)h uF\dlYϽuF1[TH:o*aE%FG I=Қ ECAsmjGγ?j=q$|LLE2=ZgEאVMpy}=OC^0}N;[օt RP4<,?7mD|NŮva?>䧲SHv2i{I9)o9Xb)RH皢WX.rRqg{m8kh,c  5\N5EߋWd*fǺ3c6Nt ӢZa:CA E"8#8_'aw #Sحv_N2vsvy%nDFc w(!̧^zZwTh朠j|tV)nD?ߋ{,AZs o;{}u)E.~1懶#|8-z=gqnYKDn}2E]qhzi"N?ƺ^ϱ{7[^U i+xW`+ ZwnԫM6ujl߀%hTX5CiT?^묻4mX\9kd(^vѫjN^aT?ēm~)mMJp 4g MЄ#5$˧OFrUgȌJ<=ǞejFȃvJUA;K*59c::`2洚W]=@¸DY#:SXPx͙%^o\jx p"dcgJ!qn5D4w>7k1# Ѷ̥]`:k )(maɘ.[WŸu* 8Q efcUڙ\wY9)*΢1}I67,aw5q]MX xŀB)% #CF]#7qkN?֜2>b]AΨ|cy/0䌠<GǮdL.5@a465iHOHF*Uڌ!3)˔3[^{%p[˷Fbml&A3%(s*XCMqFIkUp@,VvO,M?cZ Hld^Sst)nʊcŻi9'/N1Udoowhd}]"AIl}]xUtZw]8) RS2=d<K>>&8ƦBl:N?&}[fKJPMR|Q3Pnۯ.1 @2b7'ϲ3v gM_8{'aq&$N\9k|i _mxjmQ"; F[gރ\35OOߎy-<mg49Ty`: JgD#a.J6>cBvԘfv@߻[d`'֙)E=1URJy@ 皸>麣*Q BgP\"E$b=bT忏SKT15!h,N1'w?$5\^> Mf;DYC34Mېs}sU,e|{sAp>̃ -(+}sЂfhѢ#FuyrT FS* ęk] FgU\QiSgoVUfm4Б\M\Jd4:cU`S!8$rԖOo)(!.3*u$Xz%l=( >'|֤wV)ySIxR6<& ͮFjLXc{xEǐƷ@r֐IuƇŷXbIpWG?920[P:(u0͏MOM緿)"Ń+1/8mza{>U{>Ls羇cm 8g N 1XHh.ęgwۇ%Xm0<5כŔ쩉>".S'&t#]:k'uA*ԣl V:MroQؾ՛XY=6<ݹ|I1~%4A&׽=1$c\9khz!5EՎpOUW DD}ַ]NS]ZɝBo?r`rL;SX s ! " |Wt6:=qv#󣷥xPJPU%U`#bW1yLO7΍_z4 G`l g GXHl1 0Vxڵ ~BÛ%¿nuBy3~z\bz ^qU[p9g\XHܲR6GHy/y5(Jbޛ#."As <Jej,~ L&4@(R*( qY6A҄4J! VMkħ,f՘nRԑm\ \~yd |5(bG G-5*aϸdqk{b/ ID!: @6Kmg&pD_MO &Gt6)rְL>iU n'jWҌTHU7|=k6]zJY]vIǶ/ |<4(c9ƧA|zWʬ_+bSvZ bzwUyM?1pdJ6áߧE@=#, A4< IQ.؜56a$ (GWvu&^ALŠ% M|IWMz'@r'{Zg=4' N5hh Q:;T=|Tm{S <:g7<@ٳ2mD!6]W21-3;*Μ[`9kX(jm&bv_/&/h+q@k4qU#Y$H ٤mLc?,\RX"s-lcd|]B/ĭzXqѠRF \+ |bÃUcKԠu hؙ1܇۰E s LE47kvsft)y>mUP WUEgl lR{%N H@Q. Mp >gO\ h[&נ2ՠM 1wLvLJȜ0á/šeY\`?^xl] :g:XiYHC?[hT8a"yk>$ tx'$}%M^L001mU؛@ \ Fٷ߱#L.5>%3.?'Xn MMV}B@oAQ "lq^:fW>7#T_narS  D^)Up]0ز*oHՙ4-'mm Lg S0uA[imJ/_ u>H6@/7a|O>uOYa< &-r7dΜ~'o aH g左:-V/$~r"ڮU78tV/5GVWhh[]f:Ǒ.5Ԉ-=ھ dtsH#9QJ:>4Q~FQc*7|aOqUWM 34|<[O[\.] xoyKEDx n! "#J >^7L8_7i 8m@K(-66z`hqjvz[%BJ/a*6hP|@|&ZgJ8t@ 1 Xwc5&^\IⲖB-V EBk%ӠGwO8Kh9vű{_WMЩp LtUHx'Sy>$E%2ER֒m/x=ݰ| ?ؗ{l.S#[K΋7IӠ]E08s:) &슌"D:ۤ l(k}]? }b[Zq5>f}@j"RYC"(tӗ]{JѱQ6FFq&u]vM" =3fw<+w$go"mcHgJ6tCuNAQS#0eMYϡc?ӝNbz|2sAΊ`20?-]rs۠޳"=_ ˁN5< ŢlTC\6i<oMl6Lw/5V(_Шl)fY=?FPksdB9jxšE_W˦O.6$@, \lh_4{eeQTa‹_PF`ns4Kt\a,Y\ A(Dc:j:Djl:Q4^a nqO쪫O}>s#ooq$3WBB :Op@;M 'l/2tN b;vI4 {6) !p4|! Hw=ZLJ㠒vprIYqdf*1pBQ k"cc=%I%8O22XVgIOGEnTN"z0^11!QGǿ,j\maޢV;P>[`,]5Uw'sr"C!YZ"?W0 N텳']\^'b'`/r c >?V- WR50bŷXNn0}ht HL _cͦisWfjƞFRBGPuDmi%m+ʣρ7xt Nkqi m49^RlĮmZ"ܙ8J'NB( %,rB*OJ]]9-0e'9^i,/u pbh1 uz$fM QVEp!;gwfQs\6y\)` ̋4OHJPZ͵K:tA$L C{oy'۸SxNWN1a9 %셬 Rr\/gdDa_a-t}Eat*[[Bcdis$wm{RdG G C*~f9R(e.TZl&c >cR TPz̵NLK:ݬfJݧqaN5853dJi(Rź}E'&ds kt9#2M9xrM޽D4P{Y5w{4*M5"apR"l ?|fc;k{XiNcOdS#yg:I$~EѰ܄Q#""q ‡_W0%mNDyR{vU-W^D-p@Ɔ|5e -ԦC!8OfKEݗ5KW^4k5::j:jBX~_Ţޢ5իnפk/bZm6jQw[ (|' Զd剷wzn!('d@"v1|z!Dzg9yL3z>cXL[y޿ӞRӅzʝ8p/_#›d|'6p8C>Z<U/byZoϞ%5l*NH'jN勶)>3}`i.Xq樁 g6@D#zOr/l|GOy#p+!>loiGTM!cĀ+xO`bȴv'{io%H( ?`uS8rԨĭwk6s|Y=ef!y…Ky^*A%/*7C=AY?PNQQcwB通C?Ţj]ZǮǞC'=@1ܢ}{daaSbkݹOGHmsBb) &<9 2W\^mU>)\l=Ϫ[Hc ֝*NzJ=㻋arݭ.H) FN3(%GP ),҉Vk4+G66~YPZ KpH#Lpio錤) MOVKPj1 F'l ԟԿ~]U9!i>ՋE{W)ڰTvA#,!Q&M7Cn^Xz=JSh;at1txWa*.c+?sF}`ktfo)2C:j>[.%_EX~sx֑}$M]% 0YPR΄""RQ 5P@)SD,8rԨtJ# ΐ>?=z5ߛzq/1f̑>OvsH.ݻ F{5E/i|RfJH:s脍  ld,o^7ppLy RVCn`gFb_{>TGc I`h:At͐qmR|UYX,z}\NSu&OFX-'`B88"ggSP,8sT :bfy9T7 yQ+WD$/'ΒBp1F\2sT{2!(S., =\N-=bLl? (,cn9'>hkig+Y9]㙥Z)pXrC*U.Md(P EljԝW+N5>a9qMuT!?-{wtD:I%)rXknc5RidR>?,C5FˑN5>Sk#9Ϸu{y]Ȟ `ٺYgqoV4'q>ٝGǩ%.  r :c) FEtFy}ci7Q,r]Rigswބ"C;!2'NiGghrTRg 1 v{#cwbP^nC]- KO8ñX4$R\j&mEJXmzgHs8]RT9j`Jf|pmI1n:Qϐnzyh͞w(T.#DM{rf5֧uT;Bq|)mH'p-J*)y9XlAQa]rFxZ~䜹HYM !*,b=5%YwH#:ys.Mcl3O=E35Ɛ9L=C(J$Et8.xd>^|#B9F).Iho]F|w9:ޏ" CLe<@'|'Iz doHd1D!?<3R44f#eKt.5@q_u%o;&kž ?+bnKz'aF&mcxfԩm}p9[O!gƂX(JѓgX宨HiIEc9bת-{i y*O:JrcOMq;'x}jNt.(5Jqs*S>+a@D }Sb[ %yJ/>H] r<DIX7 .'- d{Nv}P_փa2ض]iQk6/U9_1?[yQ4.DE_k7o- ɺ>8 yAѪ_)1FS!az=NRkeohP S9u'i1@N!,7xj 6A.58 Hc_۾a%ޮ!%>Z:ӛuOz]]lwpS~ LH֑؝Y8.,-(- JW@(><ާӷa8~Q~{xX`2"}!?D0vɝ' y4.VPNbn7VNݔAuKyWiUO2DѦ( ?J3 ^c"iLl폎܆ MQ-.YG$ZD )=V_+xY5݃)Yct{ԮP f?JRo&4,M`!U^TK~c)fѸJ|oS>A+/ Q; Ϙ BO[ Wj('r VUy?(ܷpԚ?uc%qSwm< \ %SS 0^J,AsOLX7JjrԸ6-5,&}r:šHjZ9*-9&L`,ֲNX8X@sTMUx>ݸߴuϛKS\USrw8[6RpW!a<y#yS><9{QIS_~p2}Eѽ~Ec|o(&WyZJ>YC0)ADjQ}[qw TLsk_{ƦL=65hi>mgʭG%. >FN!tN!Y#F1} n2euu Y zہO60g*uCPO a1&9Cp&`ς}<_+Kpxw/T]M z~جyNS[oa,@X @/vϖFZK>@2AfČt:ȇ䣓LÁ.(l-L e xhq[yq󃐅գ;WJ}z(Ex/9vJGc1GsSzt9 dErHE% l>Tz '9RWTo~oɟłAPl!LN"g; q`¦ssQz|hȶO÷>\^&uX#$NƐ';tAOl-'npNt.(3J}A(uNKXOep?OݰIO{.S P @1g@T6vՊs^|XO l4 kHf$1ppts iagB&"rp $g I\{5u_ߗ8&=OqR̕4fsƬesv0iܲG,>Gk:JG$Gt.50q]Ry(1W^ioxӮjXɆB\u&,׬DG%-X!0Rh̝x#]9\׺6HD q'=94qYVFJ9}Pߡt(JGA՜Pn#OBhJ2#T[ c9Gug|NwqWޗ9EpFeuz1^oB9/aY q| #4].3=Hi4YQ`[UpD,ÙE<zvG!.М54agBS˺Vh "YO_Ѣ39ӢsWF`-:ZtS$NlYCZC] Dg Q ѦG^lbȝ~#*ݦz6 ]WuV @a|Vpdz5g17.$A!.5,R%Lz*voY$2SO/Ż:s񦂻M .H (]bNt^; X//O3'8Ϙ*HXai)l;HzRGҋmD_GJMƐ`>s3;)KI # K C] D P D#WC!jcLkUwl!4(r#"».JӱQxfI:x;Lk 2Cc]:kŠHBAk>O%?2.fDia g{'C1}8SD$a"Hŏ̳oCYR!(SbU =oF;Ǝʺz̉Rkg;8* lNjRV#6'񒴌GI 5}<{͋qx7>Gh@qPELW v]VuTN`x y"fЛæǹ|ex@dwcL$q|Kƺse n|&Hpȥdeě#^ #EJ tND=T[*CԁX mЊH*w!ٳ7XGǗߢb<'8(n7. ȧ=}/S]7AG8ƿlڇeπN6KRyN8$yU5eVBjSW$Z=qH8Xqxl,AEFT&$t3viRM_U3H\_pѥȿr*ϭq&a &gISvqSU݂g V[~ܺ`@ )5Goc[#_5.nIkoʏ]MAYc?)ejXtmg#ejċP~AeK@d# Eirٵ@ێ4cд7{Aj4Ӆ56/(u>.($VLZ)#2:︙"S# m(.JB/۸ئطH%] t|g&y 疫T} *(FQրWU=ŌVC7ϩzC;NH3ѠEyAꬑ9,q|]۪kɁQ Oa|n$H=fE@u~ݸʂ>zѨpd.8429ESX iX Y W#1 OW"P\lF&Uu]Gݚҁ1@2RdT {#fY㷕zFBpX\9khr{G&gȕծwuJBO?<=#r?v}N!5>8I?2")Z+ߏ'v״'('ts@?J#DA^YҦR{zGܮgPXMyQ类)idkݓ<$+\O (GstNeRHd=Uhm)Q1 N͍֢jן'MfkY*:ZsGohڝU4G\9k|zg`*S?6-Ɵ06Yt{!PTb& ){ .$cDzv8|96хt(N94Z 0;|Yd39 ㌄䟛2аagyx屍W7I-1CftǴ-{Kt8R(\RkwC W)-^7Yj->*Hm0hȞZ& ozcs5љI~.3(\dDUaujgۀ@r{UDqS{lʱV O; QQmD]_R-fvs͒I4<-9{A!}klHo7]#\z{JX1MAe:Iр0 ҎR5y/;"(B0FS8ܾ+!W{&X}oƧ Χ2"LaYZtjLclMLcC|F<Ɗ0hט$˅f ͋v?j+tWma(=Z;VWNk`9D E#8$,, /^/$<@k^jJ\|Y麳t#!.50a g+'0YxaCM+8ϸ)2 4eq8NOǙjѧO p@&l~ߠ~WvqQf[Nn=O@6'ȣwK5@8S=$#($}tt>hPn=*j3h;}g|:n[ `r2oRW% Uvk A`$\ swC!ŧ/9$뭸X! RN0bWܪkRs-љ)ǶX] a[,Lx[__ k0^/O1_ZבUfڜL/~JB<88eyL ?"VS *\0tHO@g0#6E "nw.A*k=ғp꒤CT!R[ \e]0PY7ާ]rH7=wRrٖ[-yA$Jb"ܐh' `׬08*W.GQb돭{|+ jx `FuSȸ4'Uc 0ghNJmJ_? J+Le)_kd/xD6`ؚ)3SDH DtMd)IqݝxS֡ u"9PϛbSXʅRʦ表to-QM.#*SSdUdS_FMCF*:fgMju30' LXAˇN>OT)o^poiC)զL}WN# LIݧC$Hg1#fPNA#*cc""b18eKvWNa5O:O {&ȍWLHt9~#q;$#f9eh* Y@ÂB35F"ޕg_.X÷W.o"^^t}"n?PQ2>M1)&,ZDmzn@yDpٶh7`HqwPcOaN/xm!;:Μ*GJ{v995 z/4%HgN!*sVk~!Kf˧A~ >0`bmR%O5FY#1D IDh4xL=fDxoě|C"'1( n(04NKgcC. a]9Q:&\q~=q˷fǮr|"3[\dNi[GɜkKD`剮LtCcNʍqI c.ǁ1*!Ψ4*a3yf|ߐ6K~Zeb2]C z)ŧ< s37䁒:lx&kv7DHu"]r3<' O9+_n~(_6um~gt.*px{];g`kVFY'5ѩg @1@4PaY>Dd/u&x-Ui_,L.~Xٸ͢ bJV>n F`gN&CLzl?Lר#lʐOxޫLOeհ@R2롺4 OHJ749{BTc9i`*W̘c^lwSO[/u3) N&i2ڽ,AEjf0ҌЍccIE)_z)ͬ7q'aA{ I i˔ͦVs8 |t8`u8S@k""u S:n"EϗCM34' M,(W;۲nQIس竟}>߶HQrGZ|e6cwX .3i|:FmzE͘4&a=OR 9Io`,&+V;8CV%ѵJг i48@ jQiCu3F'QX t1.-ЃH$@|ez{f6H$[Wgq0\iz<Ӎa:!#xvaY19iL6;`6["ǛQt&_> pD=k< [fi' /eGtt{Hpx3&'ɈTy 2m0 7,F_Nl2 %F(I-v=`w#\8&j)'=))> ?ր3|rR\<竲꟪+I%Ѥ[ղ5]J 4u q1PaX}x ÀqeڌI6=>HE=\>C&N%/h-K#"#3ی`Lݴ Q#7%2my>I6X@yiUYӋ`C^A]z|%VoS $Fjc|u%A(,+b{ȌLC:b8glN F!rW=PL _7e}ફ'\$<1CR1t MR-Yw)cI=d&`s!Mojwc6hzNdwicq9b!P& ΰ4,ҥ|܍͏T5?z&K n={p~}+S+fIшC__YΕE[Egs%?GEa9iX'(u }lPltЙ˷}*1߶?1 g ljFkzɹD[F:x )C'8Spu):N[:q5k: mua:fnth^Kv0| ^AI!:FDd:=:[v>oVy (qpTMnpW^ $ ;ڮ th52'K2#3@p]<։qB&@@|-@s.Ng t7AkI3'!UҋFH<&0;t Mt5o _ N z'h6X<(-Z99Zv!}r"tRP9idt^qXbxڍRfIG4|/( ˖ѡW;LŃ?iS֚#HQDpai QJ.ˊ.wչwފ<M`FGiFX#(N a~@xYP+ѫ3Bp?!)LP36'M*Qm} a/iBI; 3q?J;BÎ3ZTB"E8rҨPy<.bEL,<8MhPTE*3?/bPlڻć *2SLHT SyD IB13'/ܶO{Nk^-{ґ5db _%VP:"ZG$  ICAQ_s޾W]o_sGxϽά5ڧv; 7a_Q .-{yL5CY>1SSɬt'D).(1߮6D$ۯ$E+r,Z~SE;4eI]a/3jGfK'De$=4@DI6C YBƏ4)"Jx#>_RnX-!R.m֕& M2TR x:g)qUwU8glN iUptWZ-`Sp"+!!EkLC46Mds mĥx3IP݉% :-5ww&t狡4:a'UNAHAg|!K4U}\딉<]  J̍($샢 y ]lN]B5#61Uw0u_}g7}6k5M{WiƇzOTb\_KnC]zg`NȆc~e ?6KO缆o D}t%~U>#Fף+zAfHN k mf]_@t23D P,tѴ]@ӈ-ϵļfYpG.r1P^"aD ICv?1(".)ߗ)G-Eeػ7/jU¨L4ZiF~Cn-(iʡ9-qAٛ4!*140a>ؘ&7-oj|j:U2%͔5LVQ'@-|IMvAԔ+̸4hŦώթEDI7@,e.'fEJXIv7 MЗQ|E\XK9ϩ[*D[yC:E~p{BR9WM:6;=<ÈT((8ƨZq@J[R2WxkYnɲ;LW ߙK.,ǎ$ABI_?yA^aE?쮶tq9#e~C3(t@3بKKj:JM_Rz;$$(H:l,};`^wk!bCݬi9G 3Sλte6L5GجL5&'p@/ uAֈG1:LY>0e_qJ&3 OvtꎼR(%d-. 6  w:%Z9ƛ 5GI68AJ%]H(ͺl'H9~autΐt n3d4&PG[woA7)W^m9*GaWKv;!eؚVLĩgJ;}~:CuAlMu<}`]9klʄMeH`ۇ }BHL\nF*οҏvFTo6K`1CU-8rL@6bCYC ~#fЯ %EQtZqU4MY7D'q.d%O}+^BYett\:xu.9AKLP 4g MMЄǜYLqB.FƜ`&W-3#f4sg\+AtmٞM5C+"E6FAF#M*AS|iJ * ehcŧmQVE¥ .,Cɼf탤hk F[iSYDR9v_Q*:qijrKy2'v;6l44SçTc-Bڦ H`| $g IN}%o8 H=:v>%O pd4}yg 9G־4CҤD&x)-t:tv7Tx>[|o(PCTM\k6Dhx-:tr4C<,[P6SX:&^Hpp "gȀFZZow_C}K Ѓ Zid k?IncP Ahy[MH]c{FL18:J[Sn@qN_mpR魸7@ʽSPQE~CZklw= 1ht%&>S}L'03PL r挡 MT*ݒEN(rRe}t5n2v8$hz2n%hjO=aC8_ XR8H3M Kp 4g M\ \6_]k8-6y eQ/ew(cX[٠^wu(]݀430 :]%nH&(AD[@9kP(%vN=k(y{+GBJaǼYa"ԓawxDnr O8:&ްR%$(F%.DA8rWrECDzݱ:Ѿ8BLz+^Eǟ c]8ptCPIT 5<yHqhHyB+aHF1T  C!/3T$iFsimM wA}Ɓ^\ȧ'1o@awd_v`EkUv<*-yD01<R ywQ^ BgP\gޒjI&n?i\ʣWԣ]s[d\)S9$OJʝQsԡiCbDZ;#d>*3XQ淏U?qǨ]Fwxb}%H1XVJG1XaJy3t4=ɦIȍmMw6Sml#]9k|*He#ID.V\!y6*yțÖQ܂rѱpr ZSjܲ[ P׫w XS1<Żt0퐒 C K7dO5^,q^bn?s3(oxw-+h~>QEC5R<2ORD2#DQ cRj;ja_i3Huf7C!j~$E:LLw` wG&[ u8s|A q欁 +!$iɟRX"CWTtն+7ձ  qLIX5S}\]~GĹϩj+6%j я7JUjb!o}RzuCTඳzր}?uOM]p:kƛ1̆Z@NkNow~MtA^L>Au>e[2zC":d @xVVxE6( 1PKxY%^긕x?k6)A艹{KJηxB'dvƫ$J+$s;b&u;$]QnG:'w/#gm~Wvi%LmC=Ʀ 8.fM`!erŘEr֨ĕQF;Q)?{5T=*vt0Q &'W@$'n 5r48%m,_3wh߃=%(s%iDcL2]Y O'Jӌnd'xNH#SO|we|.3,1!$8%l̤ P&̋nuKS~Uwsjǁ%a 4JJ:vbZ7ICSt9)>t06 #0*GWu>M^|9Qo,o:6juum:7<͢B YDY#6G*c3 ueV[Nc5TzBZ6C/AZq&t)ƤptddܯKCr>U~jOOitr欱i/2 -7ĩhMA싔w`rd)] pX +г+Ʌhr9RJmuT\'`asv4C*(njTڢhs<YB`I2}VsuCb*}Kj6OՓT~_gKEg`'JjQG &;2 `R1D|,x`i4b.*&Gt-5,a DPU~w \uweh.TAy 6*4fGq"!iv}IR4FRa] tP-$O6?WEWnx)hۺbiOxeX#6Axݑ`ekI6'8sFՐ2z UiWdĊE @Nɷ3v&|VmTv{tHCs tdTpRNҥ\ =7A$zOR 0g L ["UZ:ljשX߾89=nS:Ȋxơw8 Qͩ"rc3Atq KnA k *S 1GQTxzJ⏺OI*8+{ oq#)鍌瘃##˓tQ qq  }Q?RHP(׮]aZX&6:N&ҶXx ^|1OD ]x *gJ ^Z  JФ>Zn; 2fC#fT(VGoNbS! +,1 Oݕ6{jG~j5qu:Ɠ{s PP Lg S3:{*;bĻlGܪ/8[Kf7,iIJ%2xΟBt (}rDqA欑 e:GTAo瘫5l~*Z|k^ i[ !£ ٜM;q+Ӄౝcپ*$`^j @S385 o⯪QlFvJGBUB;8+IQ O. 5Ha?dAQ#[ '}O])}ak#!\ Mb?/bL{+.C.(]bZp8kFah$"wu{v?AcwNIԀo .cA*v C3,%M %àcTqIӑ2h@s4qʸ(CГ\Iޥ9!Wz[ 5?}ovd3W}zf&'}ijfGDsE #_8xr&sdwa~i$D'T>e.;Dݩ3GdwwѴL>IP ,g K 8o ;1*\e|MRxi#(hr=Ʀ\gt4 9\p%&G#G uHŽO4 &Gw y!Z`Քˇ{lyn".'v3H6*ài:ѥex% .*2 @dȤ )m,^ ёJLyoKtK#eLqpW JpyŖS|b_56 `Ċq~QQ)3sۼzi1oyݏ62 G "-p5-Q,Uk'IlJ+X(dp.9Jv@-]D>NkbrDX.(QCb4G#hWUWEޅ{/kÚpIӼqz?9A.М54aj:}+YزF"a)-Z R-G/!MUR$S_H(yG`a[5\։w8 ;?rOPrRy@ G#Syxݘ6 칇S^${ tn@L rF!.&xR~{%·NK<RR-nH[?2UPc*3yK4j=]?f2)id" sȄWY#lS<-z!|ieLT \1Qws%ˉW|ꮂԵ#efJp .K[oI fSHxćV]1;uw"{ ?U+r#Q@rK]䴩3@ǾvրUXf,MT_}C'ᬗt՚#I-hKN(5 3]KgR<[@9kP;|X{]֟x]O(s+sx/CBl.9T−9إ+Gpt $g IXxӤP5unW0c?<@r:7jD2KmS x'pH;I ]hM7 4qfQSyk^C>e`:hmMF>_U_Pkk)Q5C*ַ4:B[rca#Cܱ{ÁIUЎoy,&͏F(0.5:aC V&:W.K6'qU^Yeaue~a `K~h$65G%(lI:K췫f$#շ~}{}G(`1VaI@&Nu?FbR HsJ s次  ^9dzi^~wSVз= Q8B*{Ybd*e4T=.<,shK@ĸ@sЄ QN'u U~ (u[ecdut 9qÌM#p7t=x6" PNȓ n$2E_ Uu|GkxZ[>T_Hv0t1@ *RM= b(nA 럐JkJk n]N@;DΕ&%#A[?wsd iA(Eܩ+r,Ï-R/&d94?rd`tՈQ r9?q(/ԪFyl%t>,,/^ t_uT̏l i9G 0O>9i{wKwh'$盭x&Rζo(fFk#ϓ~҇?tR[|b@Tb@DsP.3qP⵷^A'mFD(~@1#of)oI09-й,"`:fNfRZߝ*6:#]~49\n|,KlP0gc+0@yd4X n8T 3K٣#ʹ4# .vf1OxSl7'߷͏Iu[]{=rN4r:wIDz/YTW,F(.05La L)? lw;4Ȕ]ջf5?>5^qbڲE|!C\c~XyDWkYV?9uʠn#}(ϫfT!eBSLmsJf M폋75uyMUEtM u [oCg _srI\ۇ1܀VcdRKPY?MgO`si?xQ"D3JU-TA*;xlKۑelYȡ'ޛK(|wR*7BO,&7Ż`tUyADGmr_$r۠:U Fu;AuNF1= ŰRH)($($샢3I{my_A~OZ\d<< +_5;ٟ4Ojd@$3sp/?YGP~b#^`:g&-%oh%jm`؈R I>[ۦ.I== }縊%hL%xIOoWCWP| QEʛ{wY޴aǻ\1J_\ "+[시l0h_My;n@p ք>Mp Dg Q3 NbV]N g;LZ\Vydu%Fp;QԘtēw2|q'?qbvģ?>rAiF&-.snixG *zǿg}Oa=uwP>0pgiRorF53Q60=uXazCh:18t12N$^I{YB^i)Jom 9.tySRa[ѣnb2&.gPK^74q!CMCԔDYCWKPHo t"0<݊S0M$ٚnTO)xHeIy(jա0G%tmT8p&aV48xgC\r6#~'jx \oJtKG#"LYjhb$34 s=xj)6dfݜO߮ߔSgXI6fdu iߓNqQN3܋D%eOVIP&?Bs2)9S8zA_$גx|)IX٬>4=ۯu\<39{e`I3iJyo6(IC%MP >gJ;YLB_P\6z7Nzsׁ3\v4pV^ґHxUUM~$L Ʒ@rƐ9M$֔2OÏo oI(._ϫ#vHOvҭ ڰw" \דR7g0l!3@ޭ9|qrHNIYqɋkvd"NNˮ⤥Q!v=)t ti!?&k}w| ^`{R7[r}[œm2.5@=h % N& ;#e*2~ʌ#?䲿Н]3MN/c+Gm#dU<`Ky$0mI'`)ؽk~Kv[n 3L c "]rL|&e.6@t͐3Acݗ{djHƋ7k\ۜWݤeLEs3)^(xGu$^> BY#vBJI]p j1;A/X+yNVNcWQ]zȏ7nKiSŁ!~'xhH QT s$SkWpN3;` vP]qY-f:.sz!&phV66Bjxi*i)]B`sTO[ݵ%u:>6#GwEڅ~9wEdRyAn4s)9EB&%0F`\mj?wC[xqCJUCu߬GļM]s|tUA= Վoe|SfݠH4eY#|$Ot.(5J 4ks)Տ >OժLQk뉾Xp>׳iʞ;iy?Y&dʹ# ]| *gJ 弩U2Y7`Ǒ4?9 [@fwy_xl9#$蹬|Ιo VRQ[$K[tn9}ƱF#[u ʻݝO^\l~R.it|Zs[x2Ҁ{"& 0ip)Rah)J%>Jхvր:J>ai~{%k2Uj 6:_hc:#L][#Db4'FK$&QJIY3 >U2jأGD'.p8fitu'P<>ȞڡB镎tf\#砈#rX:ʍ6鄔۬ߤoHL0c)6 KԳiI4E*dhцƥA :gN\A;p qwhyFģ3yǀiNN+;5'_uzF҄~4C9S(DǤ]]CmKoT0ނYc#&cրiUP0м|12@dҠ?e{]4J~z9dc8S:1L}\48qǐGrְ dcr XpW%4q[ poe3:'G 11Q@]J="LדؤdhS9MJ0t?kٍH]FK@r$xv%Dt7-_?GU  "}q >NycւDQ4H jsAj%<9z)g~6xӬ;9]F|ECz<3耤# DgΎ0cYA pAfנ>#4?/5 {pl"H!xvÆH3PGCV0DSB 턼7V"kr昱iaKS ރzxm=z5e[suEy Bm/6s3F=Kr+,D9у"M r樁 !SV{y|y1)"[}7k%%aUۥ#ٛߓCNG:fE&8 ',1;9_>0m :{X^7Ocr8$*]U4=EkچS:xH/9*}Mwa{B8]Oy }Ak)HS j grc;_>ȝ$jrg36sU=tϖ1΄{VIJEnؓHMgj+ nd:j XeFRGQ 9(kE?˞ 2ȒJ==SgVwҽp;,Rhoo9Z9jlɸ >V%M?oV8e%ݢH$LB'=ܔQ35L'p=(!N50aedu% F'Z 6r>6\pyɳg~]os> I^Y@]NX#S'f~ԮNhN;atՄѤ}\guݨ-h{R {w[L-#xwcwtѤѿG=m!2ц:AtUoj#f<׹7>܉7{M!8dS:§SwZ:lrZ,z%L=4S\ye3LAnyV6vHD[QAẂ s +"kY?=:ȥ8q=?!+>@kBR:#?Bc"!":D8-=S1&Q"p9j\ĥiInی\Ζ(M|{>7e, R4Sp`,N{g$( %U7sDy9slIcaϹ4ǝ͞ӠV|n2M4δyDԦ8tSbV8'p @DZ/IdS&kD9rfHt̒_֟O=z~vn8m2v0m~l2(Ys϶ 1ÎI n@8_-P|è ,IQ|o&n٤wR:&2ɤ ^Y1fVq^V[7 #vln0gZMpg4,jW;IA5ξAqd9(A!N5,a/ ^T7o̜N]]=ZUϰwq=7&(%0ۊ6#NUhi MF]S#`=F8rԸ=2E< E)L+q7xd̩cCyNx,_ZJ!q*vZ؉na  2j$.XOb Ghoo\44^ldX,3˴CS 2*Q@.濌V~z}ďlJ(lσ"fTZE,K508S>=xMwRKP8G Ny%u~tfȹ{ޞ_Kѥ77ʅib93״ /޹o'ބQ#2" P{}UY<9:j%U2jk'9L8L㩻\榢ٻ5g|7e Jp6GMXy8FԹoE@L̵]+БeF >[!Jf\׽|麙'{[s$ +x'͢'1N30D`o"V#d8_˧zG&a=LM2KJYnZkC2^VXHAQ#S!2s=ݫ!D]&D3|ճY O ` #6U;[%;88$t:sE:&P^!~qtD!X'n|3\#H{1H3$l^rD5hq@&v4 $LJ;IGz)( A5r.Kz>ެ6O]J ?e10uF׫u̬F(vԴ{:-FF7){`ÏkQD92$IOl';V}ċJi@juZ$yb'(=8ۚCp9j\šJ@zy=gD>yM9sVղxgOS؎<)HT1@LS#4ᏽ- ";HCnDG Q9.W[ .TyY.*6N;wtuHʡpP4Ֆ-Cn* ]7v1.(!O@5PakTʙ=k8N!_L<0,V߱!}tM*hWS<*&ªT'77wqT l(r^_,2h=yUo;}R^mRg53ܚQ |.p a :]ıF;!OX5Vb5Y_~_` `{ %?iiŇjd7 =pN1W@,Ld azS+xH^R VD1c3J)hiυ'7䧌ЌܘXl>֫GOq"z+oXCGhg9^KLa r模z!sTQq~JƁ[L,@nxVj^C X!>@w9 J4&@1O@5PḁZzBDVY9Zïi2j{S&~j| PE$I9R5ʹNthJp2GL&5HT8ft;ǹ³sfOx' B)uI=gAf@՚ct<\E: u(9RL>߹fkٙLdO~o`P1N5.=2-ל'yZPLiԽun\w+l<$M*Abw䤙=6=c'¬kde J0'pi#_y];2t:ZnUÎn OJڣݵ,5d3?$ة@޼YjuQ]/P-V,mɖ$L;A1e5ʐE[-W<;qCO<=0'll#g {:Wuif-@7$ɴ9+ghf;v%luer(="G'\&J݀%ƿQd78I:q1b!ܛyMd ŦB E&OzXn@!{GĠF:sNQe dΘt^r9O⊜ o̮Mq3A8{oؖ"؄Qc1!S/΁[UHv7JBŘxx^Spz-w-qWj͝ Իj)呩db$aM@wKV>P #1cQ}&29K"'$<6ӓ?PW|OIyXZS'P Zinh4Xդ Z~:y\9khJ+T(=4*j^Rzu\C`P[Fxxߛ@Fi.`{BѱNR|igASN$RoW{p` :(j۲^Ms٢{^yy)Ԑ$fљ\v2jr~]ľF6z8$Α5=9Ibl1T %c]P:kv(wZ|פ*>F\ֻa҇znpC49T8Å[蔚긳(44':8-@T9IP ,g K ׆MGh<Z(N+~]]N },UUw(L)E]v"J!+i:猰)>ч@uP UnvTr^P ˝0W Lñu/)'rjU|510| GRJ5/՚}_:a|ST]UaM!3<:0ö|zz!ijir|%4>ld5G t%T6 !ƧtS 16Cz0ޕkoBǦgnJ9xpzwB!c醞G.Lp wvӻsyxkxq OA,L IA.58ai$ _ڤ3}jj9KMN d9D|9su qyĤ`DoAQi *:j$m6kO!Dxj/ememhz*C*F쭵aG^KH;ti)2c] :kZs?Dڻ= 7n7ix O/N<Y.v'$Jdw$stwAQ k$ bv 6۳~x&|>K\݃WJ !9ԤQEtaCϓR5pI4] ,g KX#Ix*Fr ;C^KzJ8L@B+WL.(0Ve'iu4:O<@z{01(A!.5,ae$+|( IOɓ$7~OS;WRRYyL "&Vg ,Cg :dM>+I.5Fa]lX*|Wki-Ho)8u֫&Lw(Ҭb!n{E!^ܨ^tN<1".3*u`HDK 5PձԡZd1&שQ~n!߉JBz^fR+~q}R8#[8k0>Hjn zݖBe cJ7Ͷ0>df!gpiz1A.I~#r .gKY] 1WڈĒc$U>)fa4:nQ蜬=)~v&}/?]!(\9klHG7·Mf Ku+ʧJ|H>ߓGcacaOIe)qv,"mVA7Cg 2d%G@sЄe 8+/_5 -~_8%6 or h-g q4VwM&E k+|>JLp >gOiS]AzG]au_fğ :dG16yН_}ħpII[09kLG[S"AX$,l>a]}i`OKkir℔\ώh 2 j.*{o(h!NܼP1mz/ -~Msy?̏SY6 P 1;44`5/^{I]c"Ft1@. 5Ha,D˶\?t>/~wUJx0$cxUPmLU!DLGc;uDˡɆ'}p aP1d!~֘H yH%ԏ][yzWW?6D]ZۄJq[YnS[v =wʅ1wAQp L S!S-j@G]Wo4ہˆEyqjf= Rd -DYR,dI5EG`I~CݪQk;~+uYY&O;Lxba.FEfCˢI3k`Co.aii#uAM&OEJta.585Ar CdfEHMX U Rt}zQmA~&ljUk4t92.-9M1.A.5.a[ӣO9 /zWW Nar !۸YoL^76c$Йƽ䶃iVbLtxpwٳ`a8';bY2 *cL)}ޭS}rl^HS!&nFD>)&C2"Փx$쩩{"tyz M] 8g NX]Pƛn\?v0XB]<4xcp2ŷ1sZף4xn&)KuQP@ɳTzTkR$ޮpߵDB `kX! #:_VmK3ysJi-41E?R(>HE*kJ8EMX9d= a'{Mp1+z`Piss:?^mB؜ʁ t K#c)z8iW3*t/XU dg60@|h+]gyrDZҧ>#x 62HgޢG5ds 6gMLFpգnyOuZh&j7db.MQb~efSD'r Hg RX Ak!`sTm/9USPs"KPVr8%eOʈ{Wp8UFQ.ƦElj(!}U8Uww}s7>ޞNvEC(}.Y~}(yXsi`4OQH;2^,1nꥏSV!hj% =ݽu(Au++OYLJL5:zH. `aZݡ@':پ =v]j=e@jΉ3]g \bKL[09kL(u!:顩~~p[ĠC$cLdķRġgAϝ lol{`OӣaVgNJiX(sx *gJE>BD9Gx`lWn, l<0CwW,pii4.GgG>=蝣9T=<.9KUʂqq9xREϩڣIQʙPzfe~wVCcMp >gO Y)SQdzO͆us q{] EBU~1I D@3E)7K5P;)8E`tUQvnpQj Mez\mmp^o Խ{JxIxc鰝WFs8R=H:EKt.5|nA CGHŻ4~WZmaeRw W+MIl<ɀ[bi|g{g$B -ޜy1G#/LHנ>yV|a]@N+J[fOp% /aP"w!q/Fޚ2%8&,l>w|fHUHttym w)=f0 D\eǑ"́ ;CY6D c 2e73rS8Q,~ȘW.pܝfX Lp;͠S8wc\ыPx@xF,u\q?#cCPdcחz,01ќ0SGf}yQ7:Ipv̗8rRZUDyW{S_)޾xZ]pAVƴ];:ʌM~dH|<wCkuI"` yꬱ]rƒsÁzW-II!jIİխi6%~GUښ#lQ<'O**;fGx:~d2tw!J4%ҧ6/NqcשcTcq9i\"!EN6I~fe9)ܹl{1vWQ嬥ԩdu&cM,_:/heq"Ic!g+[jFB;r?,ǶBf448sO>4tw?vA**NM%>ٌ}!7=ޥSʡ4@rHmEiSsqFz@wY^/!nX5],*x y u&1U!Ha$mP6TG:s OSy׏ >k6o&YVJz%D[SCBcxKى>D e+&.-_gǘ:P{ :Dxq ºW7®{4dz~5էr>p_DA-eΠ4<] >A;(&(&E ͼgtwY'JPi}{;]At>\'b7{Iy:#t ѐzKD.RjuM xO5\glڨiz`ԤLM.薒TZxū$tKeiv fሒq+p6qx$z(D|iMH⵸%z^Gz#ݐp*zMfܷFZtx5kbO/d`LA9iP"/<\47oBC6]׃=~hG6S"qNcZ5I/MҡCp1 =tY%%pjOa !։OWv54z 3֋WLve3*` ?ʻfG7G%=ϡIY) %f_tZsh KD+̉KCze6├)ghbeF ??iN];>=B9h˷,A[%ß`!Y;֌TqKFM SB݆uU!j==9@!04L#ԅ`~ƻvqTGX8 "'Բ[f%?ai]#+˞ZP|3$ X$rƉ_k}x*;}= !>&t{vș2*<}G/+}U_ӀsOXIc!R/Bg,E#+qɡwysJ#%ʟgxz(@b<eDaV:㎝H5"TQ2(K\i6ahh]=.?}D'VFLuW#Ģ@C8yJG қtUyNZF/c7<<%Y&rjMb9ƥ&\z@/#ym~qrGߟ_v_55*c^"eAvLm*8:ֿ>>o"8rҨ$RWyz|]?_/vhf"]+[RFHEҩAJtY<&ǙKyp )F%CHTߧ}1ޥqN<0{Te%0*dfEfEf,TH{W9i`- Mb/켨ݯVD`<\6{+̣Wvۖx j-M10G(v.QD"8s$R({$N>J ٠+;/i C_f/:5qCz O3M]yd4^iI+R36'M䄂H1O۶Yc[_m \}?6?hBGxn$uZ&.$%g2H43)*9sD2(()z@OL*ej߿p.:$jUu|m#/[tz=D tFщN㠥kH+-" Ai) Uw +HkvW0pH'X"BL'+W&粽v9>5 ĆNA.'RAW@]OӶ:ݵZJq\MT KC*u'*ea^80FcIR*u/:Z߬+EGi_sIrOz ݽss(V@I'bh :V3xSR^A:i"#8i46o{jmxFlj7x}se{nq4~tmp^ViNGںyl5Ȧ s{nDvƆ6,_mNi839{U_ohd ^o6Ri?Y:RqN uE' TPgNyQ%ZTf^B!YM3@a6[0|ĥJʎƬv}9&7x}ߣ-/j̍ԜCD(J:3&B)hч/ZJ9} QW1DUYl;gj1"C#roͤ7crҘIh?ݯ7+}|ޗjS+6Cfr(+F]{6]si#!Ǻw;Cׄg\s@8rҸ F?xmpCJzV|&FzUA%ciFn}/MnkEϝU>3/Hq48 T'NLEx)7RJ2fARS~5ڄG#tI]jbcYgXP5#Ɵ[%ݧV$<:t}ˡ %'C°%D!H7͠v@zBty`)mw~W&6;o=ᙽĮh1O5=vhhBI:10Cebm{PR]zpߴzLbFwvOe'M{0JCx]/;v1:S294Q1:i"32H׏*nMǭK Y\CO;N9kꎱd=Ky/E`W]j=E#8F$qB.#]Ys2ZpU -T%w ]zD:+gB4$t@d)쬻/ BdAr"]DIcb;DWCcNf`?㈭1CVj%S D@(نS?^Lxrux-#(#QBz #ѕs+H$B&Q6*m"+IRz _(,eQt :êH!θ4.?2DlZk)u<ٓ9+ʸhve_Hc99t)U`BHw/~{޳qGRgXNaii]ӆzC`e0@es<;^ի;G٘'7CN6R´Z5 OZNsKU&R32'LȄ[HfsMyڬ*SKqZpK,Sڔ5!]'qW)a6%ωbAi+*RM)FFd*/fCK&xwh%MEq[3K<'$Zy )6(4GQw)FAjg*Eg^>= hmWf8 Г9iu\LmOp{*8G]=WF_SGeFfLN0*8qow'+}\wMU.WLRh@xIOtJ;C| vw뗄6YtIMr$$7$ge#|u|7}='J3T' ՀPE_9xcm3NViICO|w:0ĊNd2R:JV4V<3sSfڨ+W˛9mhFfRGl6ŚTN:wA\B!"cszv%Ym!%RWPLp[w]٫P&mCཷ/`ijY 7y8j%Qƣ9Ε65djph ͼxU/afU_r;% ΒNSiR +Ϯ1}uTw"B~|'J3P' T"Wbe^7X7򾐒R$[zPų dx^E:e3|bH<σ=qRi0 Ix#耔UxI`ȝG'>v:f _ ^݌P y.]ڳsR8/g\jt(/SD8#s$(Z;z|4KO?MʓFoڛzywxmV3P)j$T|mnɣ Ǝ U Op3@' PS>;[׎ ^ajc q^n7kVϻ~~G˚hMZql<{V)돞ry߳ͽ 4OHa؜46>kk)}n^'ঽ~A[nv!~ۊ2%R34' M ?m6M7k:BB:n #?14#K=<a|n]=]%sX׏F;v#)'RER 콯x-4: u9x}l׃c嶾iv\b&9N2*p".&]K{FX8^7']et5Ip;.qKN+tL8 UGK$K.Nzk#AG`9%SƥAHjS)| 1>˺%2G>-A|X[vM- ࿐G[UnXYCC1=<^ !?;ʯ@gpNHI xò!:2Bq{Wo{z|RZ ( TBEJufrc¸l. )̀4 R[|@ xߟ.f\|.ݹ|]5d $e?gM Ug5!{VvJ+5dG Uih5%r36'MM4FZԸڢMSo;RHUΉw}w; Xvu K%%Bh{WǑtJsxr$EKLY$Afa&TV/UEVbg &2Yig,&.dq+,S? G I0$oYp{kUe$֗ s~@3>h|9aV|vQv13ɴ] :MmDluՈfHN!| 4_&%~}hnu[B˂W >TH/ݐ$ nͭa N5z1:XmZZ.grp*yǖL͛glI&ժ7[3Sm3D' QDbnopp?5yO*& \O`~ԷE6tG0gW!<Ԅ v󓫌q$!wTb)c.(4L36~67:\>e7xGWuu:UylyG)=x+ h`<&lZxl[9Eд3qѩ0)曽5'$8%,r&HCy626IKqwoso[mwr3]+Uu=l;kx$6M4B"Ի{{"{{i57ib _ b`5\߳QF( { DP\3'Ei6RŹ06#TUJiqS߭PzιG|ݴn䡞뿲P*WvNGޯ+jb2z̏Z[N4Da;sgA0wv72_alVzPŇO !s3J-N򩾴$^Hw6e޻J Kp36'Mi}2Xl݁]MNs-_!ժ5׀ Z1]aT'y)ܐG{#4zv,:$A\ t "1OW0p=iնn' Zm`;<>`VvK"8`KFmڝmkώRtJFz( Ɲ㣤m3L SK"*‘%Lg6gk#q1vt%Iwy8̘LYV%)ø{\\^8,q483&)˿ }TYa g6@W}h/30js Bq Z\S\œ9ihH-7t?L_ciziKgpɪi4!Ӹans51<%(glNw<6f|}Δ+W$Tci]^˅PQT:mgԆֽZn`aԾ8!yԴ I"PCF9S~G3&c3l$hևN$0Bh,y]bJDr2b:rS/Y_^6&Q9ip:g&oSqۻMg{n#.%1ς]"'rJ%Ku޽q~Gw*ayp:YMYs BΠ4(=2E=G `yonVZ -YdGbd֨9kzҔ+}q_u !~ҫ{4FamdTNUՏ6`Ƕ@՜8i; UFR3JKG{yHh&ţypiK` vA #c^Aܠ(d *=Z=K{E Nsumqg5^kRmǜ oA9yN$0R:ΩfuP]uۯ\5 g1i0[T0$ j*TI9$AΠ2(DP&3Z2(7z,f4RKHPRAv.'ߵ%lcl8c1:-4_;e{6"P&%uqz/. ַĖ×;z: */؛a \Sr܂4#(#R)a˟%|4>CM!4垛rCGoWBF;$t~2D-ndF(4@q!d:ĴApQ \Ɣrluj\fJO|pxHuP /s[JJ$],2ir䐇T# PgN r^f63#ê[_%O_)Gu h>xR-NEZ [ʗ 衆nJ3@' P nVH8_hC| l kmQj;]m^-tx}/Nv}`T(sz IC9Yo<0 hpȾ4"Jf|I:5ưV,-xT Gc}!]\"_ZU bz@Rt"-?w~>z劗 4^ɐcrzY`U`zfHi$Y*#Jx3*'J\$\xnGx"G?D[t{9uM yhp\oxYP-fGh!9eHF\A׌W|!IQ\( +u=5钨ckZ:$ ُG^DzxG7CrҐEPr&ZŢ3̄ܦayȁ; X ЀsQwOtxI4 HK!h#)GZ/XAT#Lp3>'OMt`Q -%b67@YS}fl?l1Z/e'k";&'[M7߳):k͎TM4Fq=5M9es'\^ޙbmB DYwYn3LMfܢ-EhIBs Ip3,' KXYKMi[",#}9xW6CGl gRlfݥ\1~АV,s3,' KYb2'd2:60{bdq51_F~r|1.{ =d{ sF椑 K Sy Ӯ6?z]F)t9f?6y`?Ֆ] όdF( PH_I㡷"A4v^ni)K!qG$w)v G؈g?ƲF?jGͨ2*lɺdoÛ:$y~χ ^z #Ԑ*P}'JUdazYbU_Xfoju[m\ś DtC=UGZK5ZtȚ u MP3<' O9bdߑUn 2ᭅ5-^!=?ߩcve%C` xJuMOs'i| u !g}er=adj`G)w2UfDg[zZ,fAͺN4]¹{; :r([ (ŧ鶕0ghN rN 4-u&V-$Es}DB>:53;&My5)Hr玨G&(gBpiA#UXl{͏MG)䂋#*XW;͗Ǥ8;8IB'!B݆#(F$33"}| $]a X6xdj~6V_m>Hm^=J6O5l He~\mjC)l# IT!H*z]>=yvm8ו쀨??lIQ.1Ly~%]~4vy_7~{, #8#3i(:_=.~"_._#kwm3>+ʯ|ڱ<ˠ0_^+ is1I#B^*o~<+m!;Z-sy=|8qɵFG&5?aNpgB(XVR7%_TRh9ih:f(l'zV%-(l9b9١;pL-V7uիpjIcC^k\7w}]fN@Cj7OS~ RײTyaSE: i_~$M8$120rfK*T״||.xdhJ\|ɛoksiLYhز N=HX  IT!H4I%̽+BrAJ/>n3&rz_j  -ۈeseX山ֱuPRYn{-3naFL'VB>X3,L@%'I>#=*bPdl;vm+K"t4P/aHͨ4*a1S79~෵-4!y Z?)ÂgGF-2R&f{jzިBPpDQ/ gb͐4$q#"P99Go!stWo/?]~lY`[=5rS˴'1ճ :, pq U% o3tP`osqILqYW7wj)I$IJ(fFQhzJGwl؛o+o:h}z= .QМ44a 4GFO ; ]TΉ: ?O@h<콖FF~odt]rH0/=e/GںJ I6s(dB̔'="2 U}˜֪)9/#+_P"ŷr֠tJ%差zW&N&EHiv3||z٧͹Rp3U+SB H*2R-A éct>5Ғa)$}RptjmG}Cx ?[_ؗX]{j<0gj)6op;LE"$W;"=Vǘe"s+%DV^:kvÀf]o@]=[1mw|BtpN3Z2mQ+LfH 0<_F𤯪J9CTrq*toM`H>B˵c5~M< GG2?i+ юEJX7&ef.9;(F% \ >T5<!#]ݏL6a/BցH Æ445JsWS2BZbաJ8,ŷr֠Rz55L3?WυS\VL:^?@oa.N#՗DB# RL5XnNG8f-5(a^:~ߛ%nk}V,qP=CQa>qHF$=G l~?ic}qt .gKX9/@|bsEq$,C>1uU 1//΅W.l G2Ǧyƥρx'9%<І ~g/w |xf }*nW%_mMM M/u|iRuId{ sI5:{OE 8pXnM2RŦ(5?T@vج#PCMsK@["e)8i\5n.$m{8rָ=0ЌOal^6t>k?.1?4 h%Zl\>Q×W&ʐL:QY.ퟐ0)4C]:kVKِ8?wg?k2+X xƄس9hYXy e?/O?x$S`\9kh+A+m$qSgiӱ|O~{ h;."'Iw->k+Պ-GmCmR%G_z3:T—WS@^+&ϠFe~ΏV80h e<5 s6֠'6Y1-rw^"dY Nw3|]:]etOKW*NA^R$Ab.]8XcNށLdͱY#6CAX`h k8߷]SHV{v 1)'2 ɓsv8)t;։ऒ.1}E 2P QYCA)jcʁGY#2FznuKi[!?!C+'Jo.obdNW:H '.d8p +kjuU*ٯT1u޴k'HN*Byf@$tʑ8 ]τ+.5.a/1.RZa.41וտ ğU+x1!Pݐ^ZT0a1raٿE:AbD0+,%_ɇMJ5)qP<նFT#VU`ʒ΂S\;M-= /Rt|sT\9kh Icwr21 쓊&B*J(a&}b(p_Z%%}m5?Y nA) Ci;H\5*PhW6XiDrn7I/wl~0EESwc=69co& eu B] :kB(Dtj\SԈ/!( 6Vˡyb$77O甊4mHו.ՙFHGo^+5 :"!.50q+CfgEkpw8Ls}>cp &R.IP'Mb-=38k 7`Ws[6EFҷMsB >U0Osk"ز'pNfCK]&6FW)2a.Ȝ52 SJ.~|ø+Gٶ# \ֱB7mWnET~z¤D,P ( JkDnؽ#*k;T{[u?.#%تi\ߎ~i83HtSi}bA'BkV9=jaT g D@@JWP|_u]GvS@3Pbm$^2C:axttVAYgGacxĻt0Ә=uUwLHX^%{~ eѡHQhv#x.ٛ£EqhTF}Q 귤zIs#:\4ޡȝЉLǾ"8rG{J'Na9ƤLE%G͛~1viݷLBIㅺΆD 9W&*Ch Et(ťPܡ?65/ ^XqfulixQ l72Xh(ԓ=?} 5Te+.5@q)"- $v50;h^cgUSjze5dmgZO JxZ`&-e1ۉ,R_l{41$F.5(q<tv֟ 6XX⓸_h5Vpaz]i:.byw0sԦ;9 &C|>z (J JgR\7{]mwHԸ\7R~ &TއF_2=53ĘK+ #F5 k60l ma= '5̀8AݷfW-zHwb{wnRFh7MGeȺjp4)"GWbi)*\9gdZ J=9զOչ!b` R sͦC㣶FA"WS4dw˹ܴ/ "&%CExxf_u'}r.ZͥD)KME -wE}q0l${_)c ?@yfxU`QG+utMD8! Ҩ )oz"G7)O/>J!YCEBI%d.f3j(|U]_bfp 2ob7YSUak S=ꀼ@KUyh|_Hku =1@.5@aS$]nu$!/d|ʚdKC۞p^D`BLAQ9Qb)EhA%NVQ zӬaDn8Hi EeˮA9 [/;M ].Q1rA欑 ؈P2v1ApWm ӚXmT#6G47UΜ2xN@"Sj5dzhb] J dPY#8#2TO |I<\Nuu~ršBItaD'U9IqC/ 8r >gOA {t^54Gw[Ͼ2`n sw` oOwИ_7tӍ&r+3H+Q9Cq2ֈ~=q: {=섇r?|vsn]ۖI'`' 3x^.>B:Q Dg QpA2~5AiA { ǝ=S(:w]l|vv!|67-1M|~HYDItv9}*{d߭Z_6o2U)qvW4H*8nX ɓ25%a1)Ly2?;90$n|habܠ^mclrXm(%7zAH^ytL8T4`Q4SYd%AXbũ&YIgfgPQ 2L _H{Pmr)˘2M\6h,\曰}rtpI cJRARҴΡ"ܴ!a.5dN (pR:Hyw;ZYBJvﶫ&ۮ6I}ZedLadE: xͲ|q`CLVPA{skWOü{t@;_GI=uG#P@ga!zҦ]&e!׎T!L9yRJ*~=b`UNqx~Ww-tppT:_\i|l&Nd9$c<,`r֘ ϪUn[0fJ},6ݶZC"f`q̒&X.aH<-cW@ / DM%r JgR(UB[Llػ(d+MXJH4\T##"Ye͢$:Fr ?oqFeyC_a56}$i3tS)RN / 1mɃ}pS_W 8tHiW-|ii]颉 wr7#^W·$BiaSRҌYW*zP5%E:{T9sd:4gvG.'^>j'^w|6¥?tkN>R]B ENQiTi(g?lyf݂Ǚ UU*.CCޟ>i2h˔.BlJyI.OŹ@s$2(h>yI*Hzᏸy1FwaK5+;#q&mҧ'm$5GL/ёM_pEרt𲁞 ,/C;48T.Kv/M)3٥ N}pxOti_iOXDYI!Sy U;o:@ >^n~zdױoT@"դԕ'v1 Ri>-ѩˢ?8ts欱qH]|ïu{tt /zȐ#*3H[-:aȑu]KOtڲJ hNb\_@FÞH!5Z@aѦy9&2RD<1b ,b*;5y̩QR?yeu1ňQ#|´|ih-Fʽ8m/ /&hFkN>t1&4-%2 a{RD uAEH\v@#9nu3-q=,}2%Ny3)C:.#ܟEJYR.wdwkz$γ `LK= 4/O{iCQRkR4&Jg<"m^?^<Țbxfpzmâ zTq>u'TXʼnҰ3ԝ(s'ֳg6CZg=Eg<Dx˨%"Q\9kl"cdaWtc-tG[6Fȧ9KӢG,3OiDY!k>sMQ/D%0)oi)Eҥ S4NGGҜԟ9eoM Kp 4 MM[uql5dIt=.*#-@d咙zԾf#~X9:Q"^:k"//4ϑMA'+ycPF2(ݼq.52. θmmNqk O߯V}-JM?,. 5H4\s l\D?$2)wב1UӵH!`+Wc QFjLMwE/'JdS@ꮈYC"-t?~lY~F亲Eu]pS?4&TOh~M/iJ.=r<$JLo<~Bw$a rA欑DSOmQP+@4x᷏%ƼيuGΗcP'Խ8硒R4y\p4]D۝S *QY"hYZbCӮ5EQ'Z/մ/pDn143^p|.^FzCR\ч?wyP[,!QEڱ21FS˻@v 4``~1Du! P #|to>3\H&߶ۻ{ʹ7nd!_Τ9xNI䙝'ŷUM`9k#!Fg7Q]ϰ@͕ld9 &d6>iREJD>:]SZ8L6OyYSDq欱U%v^6<` zc[~n}h);֙T9nvE]|} aׂ\uA3~= ̻7]U%! 8ԥ-ԨOT#u*y4!,TEb;klθQ%B]0:kJ(<َ ϷDb|J4[pfvwl$)WNY> ayixSH.5>,8Q CvzyD63\zGXd\b5tܮhHXTS* 5qpGo2x!lmWW~^\}LvE*'ExBS .BW cՑ)%r &a@"Ƿr֨Ja_~?~X) fjxi|cIZzٽD_vY}m:5Eg<hPZ==Qǻ`t `*Q58"~>p 70A;Tʯ9fJ 2Y^WG=/+zM{a& _(mOU1.G tP1.x=!:Aݐ`{.H‡J)mOY0G6O巧K. %8&qCO:n-M[eXMUcdQ&ֱVgg,Odc?M롒7M/Lj1MZRPC\`9kXGu4W8;`5 zŅtS#597ݷf%{K L~Z!4'=dNk'iqrD"s$v(oZ.(UǑ:QCϦ~zdzc !Y*'MKI=Oiz4hQqP"rָ$*(E߻vˆ)n;ŻʷΗR^EcN( t.1 T%(($J 4g MBUc뮽۠$!C/xkfڜkHVH{V:YyVD'=ktF<:?&-cv&VsuaY)`ȝ?: C#NjC%Â:Uޅ֕DVN{:gCv2o\=պSh˶H 1Vw",oqfIz3e y%: S P۴+'?>8VM.L4'lAшPJMQՉW7WRI(3?v#j҅5GY\rrI; ,pd{JYh xhL8pV_72g;7{۬󲹅5ёy:˲Ur{ 163>5#B(A.؜56 Hdc^j_J =e+"nCPA$݇d$Y$(81Az3TֈA.)8M؋sPTh5j}n5N&1fe?P#˃ ^$lF.qz#g&=S^Ǻ`tQ}1o$zf4$9?4c+Ǜ2`|#Dfy8%PI^82UNQ$Htd˂sU A4H'*4Bb &DlIT9-tnHMMbJ)AK쇺t HEo4]"U. A c叟~{{Yd%teaeA؃&]]:f16ۇ&R FgQ蟻7@aVBSGh*UJPΈSaW0OlBhHlB .Jd&)ƥ!\Pl1ы|٢pv%ŇF!nU7U)7]i 0%>D6mRێDsڜ9Vǹ`sشMhOtz>Msi-n]4 zt]Whk?mH޵ƍݿ>Cˮ' ^$oD[FC3cE_ׅ\H HYÖUS|__:,|&CGcꭤ!L޴ǔ IS03Fc|ݔuR]^vɜx,V9sTsW'9%T;.x qWq;dFFF#PXb'FBzdSZdQ߶HyI !vmwRҫ3XˋAǨeƋw &F%8F&dqtTn`~ aį9t Cg0 ]M9: F4$^e*/O}^ npQ@gpN!Jhr\m%iyeRe'#qW3GQi2 N Z4xo:g\NJ^yUo5oqG~&7xʺ]__]yLJR#[nGh{99Iޒ0sJNP3<' OV /;PNw~?{-إinV6y]T":U1B}#XBD_2zGЊ|~S5kU նgoe45XQ9&:>eײ# /z:^=d><(8)$HDu]Җ{aBBOB %`u.ήnT?SnG ]I PA;[&љ$DWM44Fa_L'`"=K|~ jYqSme]I=;pbqw:`&XaKghۮH~)ÚHZeҧXF7O`IU\' nk/m>an W ;ua'T xt:tHl)0FD4 Y o+P" >M 6&8-HKث60ؙ@Yi@ĸ9cs؄J=ep~wҒdjR?"eiiu|c@}m1'_wyT$|]%9Cs Bmv]|y\N3`ߥ>4@:yqZݠl^n>rew*|cFЩ8*D9csؔ͘jvԌS)W]"8R췋ec.~ʉ 9C)oi{GdǖAd1$(6;Ct/h}HZuҤy.(6C_S(-gbp(#mcl?Ў~p$}_pÌ 5im3׺y.K*ILJ()uq#v"jH#BtAѠSIvDz-Hcg4pjBDA9iPBHil:u1'9YFm5ݱpK7JLx l7T稐o|o~Gy)6yZ yn%!Lz;D Mhǜ@I pu{$glN7DQYg_ x—`6l sN:qZ*LRYIs97KvL8k¥QS8_֘5&8F'PuHs4"gjj $g%cR(Z~tFܽG$BL }rOҸq9! pa {!Sw=05#mYޤ4^%L7zICF)5o,sJ}D vF "$>9e|#ҌM) cj7ˎfBW!d O-zHŞD&CfDN)3)Ѡe,THkqM:8bI+aPvUF2ƣ¹,7"p6G# tifG'xyHWE:G=/5L ~&@?ÅZv \Ȥ$OvX+5?9n}0{(gx>D I!H]ew ߊoH IsňHe$b0c$H0etJKҨdgKN*$yXE8,:sә3A.uKs;thW_:T}K)wJS#V{:Y;3x[7O8Cm34' Mimbf-y :M]=]{B_o\Ӌe*X 4xў22>CYCC=M`RjCM3D' QXW҄`$VS uYӍS\՛}kVC*$Rxq<˱g1ƻago͜-~:P=[wyVYt)=95S@IE>dN:;%S$*ua"'$;] G o!=֞Ԍ3/;Cv$Sf|ijΝ7[" SNhyIۚg`N"u/!55,.[>8~GJϛsVcFcyIl:͓FnyF'gN8 ƦFEh5ΠHMP^KvoJ~*Idd$fYLK#:(qM7&'."jL.P4oGC:z-Րk&>֮%|]'{Gl:,Fd<I&BcB8'Q0 oFQIKmD(DV9(~X^T+ 2Ժ\Ϡ:n,BZʘ6rtTI汤ט6udvJzFҋ#9ix¦ȤFIGܴOy(2*L@|&.z4ql:HoV6x́GPIPiucN Kp36'MX8UQ\_pIts] +{J &Nt!]< 'n328~hc{Y9CsЌMI /.k&Zq/76h.>6̂sѺv=(wr'˄NLnyyxfvDk]c7 i/1ڙ "Bt_52^K gxa2xJeZl!=C561%8iCGPMKo[q O~G{ JkV<*aed4֡;-<=ImeSY2;In^GiVWדo"L-Q%kF$uDfDNI>3G:|Da^Ôu|IoI!>2/n˧kUVKq]V_UewS"IȴZiQ@"n[oaW#󰰧7rҠ͔OKEPJd#VR oa~_;T!i( o0FzFgL(9k.nBI3 :[v+Pʈ<IFJJ]s$Qs'6Q`MxK39^Z /E;O#xF'vB:iD^S&A}oGbdzuU`j!/ۡ*3#FRyhF{Cxy<}v"9"Q9eT*}SŇ:/T 6>q$>/Ŧ~}M sƷKL0(f4䍑Դ$q'6a/7$8DXFEoWU7 "Z-kj;e|ݓwr^8SzL:C9p24x}yzA q椁 kTjGD_$l`qI3;Koe2NjstK_7fH#dg9 |лl:ijZaiq) *5=4`q}z)ʦ=EȀT HV2.{TkG jIV0wo/RH"Q9iT¦Ȧӹv0BPߠd'd9\h(7^zڽǘ#z3CS8ghN)Pc5}rqhcn޼K/gsYL3aztR7%L.@CxIOݱ@aM_gdN.K/Oqm]8!cn fϗoжDyIwѮ:9E?5!\ !?17JDD IWGQG FK1=E/&e!߾]j Y3Ma:he{ Or(+\7zh9i|e?{ײd"f;]$EILQ#$a&KPwF~IR}Yy .7,#~DV*LT;*(iO2%y qR5JDen80,\9kdI$fCCCh-e˧];&D?r$c93$"A-c#/LHt.5,q_pi{vSQwT c|[G8J%TqV F*kdΘ3Q|Pm2_!4]E.(5Jqul?`@OsQzܛfޏUroՎdetiID|| [;vވYCwFi=1@CCkeKBõ'h jv =JG.^r$Ӂ&&5e48L/uhtԥcT"\@9kPސ4&ϗyUY>-DDq)-hZߓMtM \أ|4,25i:7֟ۗ* Dv!)#|_> Ј߉#༬ ҿW86!r3> v!eMh#4 MtB&%(&n in#@d"HMy_5M4,׹wvAQsy\cvV[Qg}2/wANRuO. 3H |0yB |e2A[c}3!r.L'b NID(`mQDsy+͒cɮHo]l zꬡ* N>7K\`tQK mē'g\>M9!y{) &qA<.kYgvDW\9klK )uutu+$T>'ϡ%&4.KsRGtIS:8)'J_v*})8onncM q+LCfPVo]:%$7LTٕ`to^&#\uBY(!e9ݸ.7_%ݦˌ(rصHy cDIZp:YBe}}BjLn;)4хt WE;݆z-°HTͳm`.˻ū~/Mk5w1нqVܻj?F|aoYC4 =;2횜\:kFLG.UB-}zǞL 2;r,%GK+"~B^:kznyrC1i^Wv3Pߟ8j^@'4C2 vOOչ4T"ωvӋ7 s Oha|@W->̅&3^ůn>oѯ`G%L ɝ $0cNR;[$wrL r朡ii_ڠ,Y{{eM.+l,6ߍ^@MU$)]^8b 7c)C8$yaHwPW]4?[aOCMbĎFg'YZlj` \9kp(H)m 7myNF?ˊEGu}_~Ց>t ~š&s3$%ꊼ[I:CS$ ;Ȝ) "\`9kXJ((AohnugvE)^p~bLx`ӪSs %M#c,uzڌ]hI7iZr Hg @ 5ZzE~u^'z<6DPN1JUc\MSe$- z9<=($c0)Pk$A(5}vI:ja]uUn"]=?"P['jI3ݰ)_ZGv Ib.0@M{9:3>4³`xJKoNHYR@39D8m;֓AsAщ;"(:J/=)r|A7I%iγof3q}Y~oO?{r &@,dpԉqB~ 6!_Jz6*Qh"źt5 P+m^ZZ^TmdfW4Mm+wfĄO 72/7A|BF a u=ӊx~0{:%8F&m19sx*긲uu a`Tmc:5H&N#Iwd\)z#0.yN o!I;j&c/ߛᐑ}Fc3ߤrz'T IMc";`s= EEe HX RȾ*2Mfn"{2!']MyQ <4gH36|C'\*I*r2݋+_8G3C8]" uHUTKEFnHگg&2Zz?66{g.@+d|ӭ#:S$[ΉDpa VvW42YGC'?ӺI%Ά](FHh:hHD3PŌhN"v[8stE.&YCAQy66ߒw7^:/#3*w oӏoMԽ ި;X#49IF@.,_Pt1"#\9k`6:tiTs/?@)D })WՏo xzB!I؈:'$w`fY* i'kK&j r9ڶi'%@xF:oMӑswiɷlzیz YCurr0衧Ktc(ò7/p=܄-w)&3Jگ毒)kr\gZOc+7sO>{^Oz4b!r(.03>pd1B9)-2)MK]. ,w;Y?aIoC#KNDEޠ>*)eeNGJz2s#c&$8F$=81}m7] ~?#wxL﫧鉉đ3Vf#)0‹1ypS?nHHq),3.On(U.)N߰aXB\P9kTjD%!Ɠ;[eS׽q[CU _ }jZh,n=j;ӱNJsLޙX\4_N u#w%$R 0g LCT8v!OM-94b]7[ld#ikMgdYx<;qWs Lp 2gLK +< дۧ]5㼢VؽG-0FcPV(:͵?:q4ߣw&@zXpZ' >2b]:kz\=gwxO/l ;ۃu*Cc~aOfE6a ~oJy8l?kvH{t#Y3 :)a!"Ilw+tI(#Or]#"h$ÍW@QfӁMݹ$vjjZ_9}N o1 )ϿC=i$x2ڎK$|=X: OL b_$IjюY'ĆB'ELt.3>ciV>oOlVYqǚ_¬R ,ornYQڳ\(q= m!% xPɃC`DvAJk!o%U2J7TŸaPJWh+tUKHpϯZ.%FIGFc/9XvH.5>i5<}[ 04^zmAv+aops%eW$|5[yŏRu2hv3&N0#g1KB]:kҖ(k mRB{R*>5eO㭍]Q 1rsh R4TSXN^>rCQ.5>iYFj޶5ɦ%h+ko+-o×4DLodW=m~itЉ-i='((m  DZ5/շ!%JPcOrZX*Nے"r73f3w t-U<>࿧DY6G Fqźo֕V|*[w `R3(~R9b=}m6}78XYF3+J@dvDlsS5䝋=Ӧf*!a8ٳS\M=;8 h-(Gm;bǻ]VcjODz+u2AG fSyKbӬS夈Ƿ`r֘m4Z-I(Ϟ6}8,z;z7mz8jXw{A!CS.&A q1Gj&'$r 8 ΀\9'z %Cms pPEz-JbPZSAh3$;`g=/щ`tz6`7Nt 8$B\p9k\vH:%齂gMS bYڐ0/i+$yH8O:ҩRS*n-3JOE>‘xq~ Pg T\I1(=ܱ֑ DA||ǿ Oz= Oh0kz2*Cg$&\xt }i%.oP]0Vj#kMw_GH,D3$-͜xqUJjkkY9R^'P%E=hIQHHlPd|-#5NQfesd kw_sR'J]b^p:k’(B%{bivi{m>1/Ryb &F$bȳ `;RxitfWk+HREEߛ]>թ>=)&]rJ'ޙ)%MhiZ ֯bShخHI]`"]9kt:DC mQK)xަ"nv.-O.6NP^<zIy$M1y$ Lp 8g N߁ә8SC*47Cy?%noGX6Gƫ6 &}nev:ԓ|.qYǰDY3 8 :w6=ͪ\[BEX ] ۲_WܯpWφ-΁8WPW38?gȹIBYDJClcJ{"QщkEk,ph*: =͎11GGs"] @ PY @nr5Ţq)y^WmY'u%Q e {yARW ΪnI0)N|qN߱ sBP"Gs-2Iu;BMJ?rQ h gYqU<6fLcuG5I w,np4^sSDL̝;U6箉pDŽ?m~ FgQUAk6/o+sE.Vwm43^1|qL hTyԡFv0ǻQ9CuHp+2&8=R0l\1^)ۺv&Q qljO"V+E6)PH9(9<.57Ks\ڱ)uuSݾ$8sUQT]L."o#դ ["<,Pа?nMnhM:({gnT12=aEToea5^?6^V`4zYqݤIU|d|I37\7ԁЗuhP^pt<%Ŭ>88u#d<=u394@t6Z*mhWn1Bܔmlm]?4mW1kZ_~AdNV#ݩ"OKB8C[8k4Dct!|N\`T}ANaIp Q(&uI͐^1~mvY#VA:uJAwϧ|Q_4v 55B|`Yi-GGx<{ǹs3M nPUWe}LYcYJ+> QOAv-fKN0VgjA3wN` >gO .4;;Љ%h٦lXRޏ]jPCO'P=ΔAll)qtK .F%`UO=Wf-%‰zS =J۟@¶`2Zzsʜ6OhGgZuGysv$1@хt 14 Qu||t#N9iFu9|_ MEsV E]z VsNhyvΩiYCpyೆˡw@p0e kR98ƥ}\Z.V! 6g9k*cɏ͓  3>f(Mt.5@a9dWmQ:UG Vd>SI)(r^¾&/ IiΓ Grְ}948@@7C:]>~Upx &uEmp SKK<]=cDn"s@12Ǻ`tJLzyK/QUH4FHt_y>2nwFH4TuۮFa}&~"qR2>hv!Y3 : 7[?7J|Hos4ET9}7#N?-RV3Ω}ڮ4hCrHRn[՛memi5Ty0ؔ\)>L҇=>⁽Lm֤4/TQo`HT`] E4FqlHDYCvH>5,F*0+X/?|6IQl;n=VU2K;o\`H,ѩq$3x9}N?u.FFd kcw:UEd!+z|ZJˁH Nt'5H2Bޮr:wh8JAc Ngg PO nY-l 9:MxcPΰwp;l9e[wl09%,Q.WJcTCݦO3{~]B6kӹ̧gHty <%E$8%U@aj:L@3NlR,=X Qц:ȣ,Iڑ,Nߴn^B\9k`Ž(Ep2[1|*F|hOi2=/`F] W^S{q@&O9f@hB6~ZcƑ}R?\?ЏֽNT|9|aZÙ^~z1MRj~ha s ]aЧvz ƫO㊛&mu wv)uwO+}*#38=Q3gt#qrt0g%iGTAS5/tT  uJ̀27|ŁfzRܒ+65Čy^YS"0uF{-o0+JEo]. )9*aEy?:-$]}R<ȴ!"s/WΖLY@75ܒoMA6`@q;rvܛy@oL¡De7=ɹ SNh sĪ"*y@&Oi!>ER6zVԶO%s}gsC~'6AhT7A.c+թ[BkN0N19AF\lџPt3NOJɐqJ Jr=ҰK0'4?*-%NJP .gKZoC[[%.'l^7my ۼ4J*( OĖυ@1AT;I49(Q.М54A3d[5_4_6$i#._͈:c:%FROiSMĥ`ys>(AQ.Ȝ52a !OSL/ OMS}586-2簤["`+z)*Ѣ\d=_a'#s~TCSGsuPAM?4,]1aP k#>]>$A1.5.%2 PD}T$iS%n1E;j~hH@^_+1޽ÖuhR au7P}o1 + `#h!g1tGXڍsRMО;Nե2gL (A=ըA\0Gl92]0:kjhVG:W5&{Niu8N_2.EsWE>а)ӥ AuKP 4g ME|iivw'KQB.^_Kcd9ɣTHߞNJD~ICfAhDnAi.:bk(/.km#R@pA׽ђ|qlF[[jKiRh>[wSx$mqa׾nsW]I ڝZl0R 3D]BEWHÃx II,G K\`&ޤ ǶEczr;Q1)zz4+`}(:1%)4|vfyB=KJI4G MmJ+ie4$|Xt_0a~j Xj~eg( U=[?}!C,ホG;!t%C;_Q|G2AQng9~hVzM. L\0n' G)IG$ '퇒wA'<:4FiD,^Lxoą-GUt./}IyVR1#3U2y*ILK+WwG扌N )҉z\j#2rBԣqخ PO݉)rB樑8+D}2rjqG38؛'8T h "KT'JKA<i6 F8rԸ4K"76&]-R&m)}nEҟkZ ʦ}(Qw-Y3b(svt)!N5.-x Q:-ijl4 BBf/׫m4cJu36F"(8 FLʼoWC <"R8'|I[Oͷ9~P97w^?NiewXyN=an=́ߝ]z4ièTQC#4S~%|> !q'HmϜ&~; @FV(ΝҠ7{#P5PR% h B }\×_ ƫF=G<򆏱yQ\ < mՃ&Yq >z&l~ ˖emP$,:s O#Ǜ{v\_HHAԇGhzt69"~޺x{.qKb;(:BZIosG+GQpGGGxL&W.}!f2wިf N+&QD qyc0갛LΎstM䆜B9jD6gŴ/Q^ЈgbeEy$>XOֲ *NG*:dJME!!#?]qUa'jC9j`^Ȅ\% ]7 yBFkʝFueTU>g 7Cܺg~"*/Nr&iE0G$ &L.źdIQJ<uϡ053*·YS#C,ڠeǷ]%+FFE;1SOmrѬ7D$GM5*q9du~u KH[oX x| Id' #d.8chNz]lMKI:GNGt:Bgg&xL~Y}B#+*UB/G"==F'l/`HP=!W3;-">xt>孏8rԸl+ }|\/4 "7QpF|,{S'̐43&OA` 72; NddOG3}[KLP'4d4_w:olw AVHфFb~x\fn֫ 1X= cAjbes'^m=V0 6԰ =;,!OH5R#!5'RapjU߶jvW>gH[mPSpM"4Q-WD}(Σ2\{2#8rԸuufInkJWĝبzO|ʺ=y$˭u8JvYaN%;_w JaN58qOd|8&x Ĝ4('bf~KylN 8wJ˳?2}o,Y,)Ĵ6 c=:Eh*:Dy&V/}2W/xM{4gLM'D{=X|/]QSbSmBGPK1TIiv2\6mb~5'P˱~^jjJq@[MvfvawT bdI :j:(@ٮIwstƞKEW-{ԻE И/<4zRANGaM`Kp$2GWG=x'H W8\Of7z~3gMKH^>E([v ?s%?ʄMMrsA@범0uO<ݳ64UP:j2)Wٛ{nΫՄzJxS#х}]mynCT'j"FӝFB h.n|j#TO.3GL> G)Lu"CŠn5m#SmD Q%ľoӧ^5IΛPm@>CZ5ݷO]>~ M N9̱A(N4/INOg;|:|ax p:U yBꨑ @M%K+RmD-x[ڶ᳇W >/$LtB1Il!&.Z#Ì{ >fN#S% 'noust"-KSUgk+EQ4Lm kca6Z=.c\r85Ȕ:tЬMv,.9I&1$xQ¦H-AQbtY:<`~j9jxEfΘ??AbA{ec2V?ЭxaNY F^:1 ͆PKpjQPѼ#cxU/6Kg˻̵fRw_/Pxyk/=}, /d4/ٺ9E>B'Ǥ 'her)xIeDM^CvN/{&08]uI7l~fyh̡8 (\*Bz{ _b>B"4k!,MɟYu#`5aRzJ=7yi_=%.B%(U9jxW:H^H_ː]+קk;:N: 3i8S !q=̤QChi=Ͳz G&H ŭoew=a-zZn{qy,_,<;);% rCo)!Wǟ*O83N-qËR wwjrTAd~妧} q+%p*Nn-'Z}@^;a8s.GKMT~Z Ԉ?iԦؤzy3t7J=[: Os$)ε&iTnB#P'|8֚347srd}&kz/OQy$P¾$6͘43hi'bv5 /Al#ˑuRDJP9jTZBeȕQ$>՗9C:4}|2n3e6yQJ3q)4>@$<}m3n)"$i&8cNtgdeBqQϋ̢'__ !,hޡ\s 2S.0PuLdμgq)d Oׯ3zL=/G-"'",)-OҊSҙ;'uӞQ6}+#aQ>)3n /]/5]<ӓi]#%YƛB#m=!S J̒;/D1MGK@ q樁igeS2٢SSP~l?-V1,NpnEًeCtR8"jw]ӌJo!9FۛaCiFSJⱡucQ1jҎH Ή$vיo` r?>iڰ9asؤOS XeZLUt$7))iIr "H,2Vd,%}?Bػ,WZbz(#C1 s섭E&#gvyRRYiUWG~># ?D uI(©}hXkIȮ n ͧK {Un CKv Λҧqͮ}heMGrѨĥ+|*&O*_$kaPmw82LԝWq/֕'7SRհ#}9F)6\4:KWh;:\=U#BZ3’šS"wp\bzpչYwͳQwh1>4HZqsH"BsM2>Z</m ;;Ey۹r; kBZUJWyxЌΑrLC\adXZ\K]zU0s?HwSi :& i8?*v)]:RPwv႒Ao JfVT.P9>垮']u(Y}+Dk7(fLO>n[b@{Hp>U[q@iTZg>X{sx"btUXڢf֧tFέ4یP5ǿr5!t'25>>?Ԫk$4ys8fP;R~YO tEѩɀySn.P Jۯv1%*M׬:<:17WhG%/1L'r"GbuX-p.4El@܎M"4RǶZCN=m0uh"|8Sio" # kȡ]4@qUVyUtG-MM[OPi/y92,Q%%3JiY͍78(QBjlF5UAp.W?R( )C$rm `K9JoTt Gֽ󛯎a:DE#URqS>E!u}R4J.5Kpn~ӛ'j[qwN7K 8:FmF{$IL6)$.^pL`$M*BJn"&($?閆K4OL0UvlMGo/ƵZ"Q[,[#]h|;cu:yCO8 zC]Agsd>|/ח|H3I㒾)'fxrX(ƨ%L'M=~.ISbbCEb4QF\i«N3Q$H='J 'MU3M1x% St-r^kynw̅][U~i)@iU`scō{,i >wKI3@$bmܯ t+ eCG!xA~ݷn]8[Z-3S9t+8E¼zb`^)f``ZmHVjjAv~Jsg7iҙ%5Fv~dI`=peҙ D搓:ʹK[LE#H5TK7G6>Ҽ*iƫlPVv%PݔFcqۮ'&ch4gJWGzlyt~!%)[W`&T_ ^O)F-Qk]:pWw!vvt $"eRO,~st.4'[Xf%%R+:N\Iz脼oϲq;QR\U*ݻGj h4=>A\:*#;=0̹HμCsuK8Wp.+ Z7oC[w/"EDP{Pa>TnRu(s%*h9xE8`\45e$벡g-4=4\^I/ph1Kq1P $i,f)gDB ECNFɎmbxkwo}`D2!q|M>4Yli I18yM qљDv!j (22G&1 nFoFg(ov{!: cŭst։/ Tx 'ΩPF&S+, K\'Q@~U6_{\<&7^Q-;b4/ntUVch͏RAx`$=e?D{^ -"ɆhbE#DDwt-ܟe&1ۡzUsPʜFQN4H4əo9ܑ /pCG{WLs梡{E÷ n)E~vBbG((3rom'̲_bLbzS+< OZb>~mI?bxvۻ9cƟٛ49FY&wz"u &:Q+*ʀ+mU XXC>t>:HbmMfh4ܑ9[DRLV羝z-_x^ al"EsĝPO zrVKDKqG, .#tǧ7C)'"p]&xF^Vçiw;'[.JQ'$C 8-/ 6y^Q9׆U;F)!`4U^{fr>ć}ps7^m `q$q,q?lWw'a;3Qϫ|)&b,Ew( y.c[ . :FoiMFP3V=ȣAޡ{J*ɀX].Yr·NՇ# E0:kGph#9tjv²Яl?vw\'2׆wCYDw(0=Cepzg62'r+L SƠ\nA8~$j;o7u3DG(_$7%a/OtAS28!&ZI#s N E;w.WD{ i6|n.G8./Noh%nR1t_sLiOʯQa=~lت,xJ㜤S~2JvDNer/ʌwB(:a`O7KGt\2,cA Q-*p,{`l_C;ݶ/R399ΐh^ nYNCh9Lj&a"񼩠{˩Rr<"EBrѐI ._BCyhH/)"rr+Ƴ%/sG>>xrLZҥBLIΖ~H.Ǽ"uHUTѱV )Ot WSWPX;cB."ϤGDOD|:'vvDPqO9IR!źtP#s _m[W8$k/$1OؽyڽٔEu%:LKAq{jIcdc5Ћ{K xEQjVXPXno򑅹7I\4?-$!+CˢN""iJ9gQ f0ɢh)*sOdtjoUa-q?IS7u3ƒ,MLhws)sT0iG"UJp+.KNY'W?~ ͛ۤ12&OS In$e<Œ03';g3]+< OZy|Pssq Oz-w36aF<tDW]"_޻u1GYII37THp+*J\I艌жFв5:pG!F\iZ O%Lsykp3#y9~5İvE2*-y9+CL_:u?+[KaL?vH8D|2kn˳y&S$00|,.s\]`pb2j=Z_U >Y/# F3`0i/dJjyxgr;`rgBrѐI%h1%/Kh_;@yrd4'w4QE"s:2i `˗a\48қ2қ-96tǝ=nw9|-xג%&6~ގzt6PԊ3t)e^}z`4q0};%R+, K\IlO0sGE-*ɍF PXw͈ yL]2IDsbDEJsX2 ^e/6M4cgKZhsINnύ1gR~5miyNd"%r+:NKʚ η=^/.o/Т |hm9 S‡ɃLJG7:5=t(@_T!̥D rE梑 iTo ݂2Fć.#b?M@LG*MFק3~5{t855#0"n~N9@ߖELxQ_xzkhIv o2 MG'FM:SN:@nf@G.(P$V!BST\/e"mbCЕwLF^9e,qClw]9p}4*}S@Wp..̌oe`:!1qƻY#c}INu$И5F|B,l.='-5#͉Ì]ah*[E~ Vjm Nv:/xkqgv[~~D*;$ɤ-j+-RWu{SON>&``-XT7tEPe*9VJ-{blP6 8V}0Xp]0=LHq\48qAL,B(򼮿Bz&)vr;1~V {6(fmPNZt["uCd>Ethr1 A:B 䜪s|1d2W9e#D)v԰GLbJVQƃjfIDO]a.0C]h:F M-?"8^{w(tꄼ9ecѵl?EBrѐ V[VRhnYe[ݢ]?Q ۪7uz~2)]rDz?ERdͲBԳz$$@uU]ayՎ-9,N(+3ɓ&oKX$z>4xtvhI}@5;h@:je:r~.WZusT| {B{`0/>>W|`tcRs )gQc#*lj9`~9Yhf7+ž9ܷC@4%KmpUh*P0+q(} ], m<%H'#`X?(|&77-bn/7,ܧ8s9u\vQQ##BsK-͇n)>JrͺGi~8Xڽ'U3pTx.u=>0 w]@yM8G Nƺwu?4i_9m:+KG_ 4B hQc^'F(( F)pI&$ugQ[ЧDW]wi`5vpbGSVɭ|hYBx$Ib% (PI&:sR:Si@&"q}$4O9m+ole=HA1Rfʺ#tY'RpC9ft ]I`Q 7\&""/IYM<_!M,T@ -:P: IExhJmBQcix"M}?_B~=lƻ\TWb8aEwz]چAoՠC=j=y=n?c% F+pJVg[z9 ˧#?b3ov11;7%rK<79r-:F,YWUrtg{dVQy%ړQC DNbT  jsuTݢպ4!$|&&h9t_JG8'p@&Yk\RJ:F5)ѦqnbWz9Sw+,dg0!Q$uјD3:L\=\Eh9jhd}pF;@s/'FkY}r yl蝷H6k^N{ESE$[Q#g&b;ФA޻ވuOݼ}d|E;\M rB]O7zj@rN\ʿ;MPT9<,C )n"!"cIĤ]9׏P觏 G%('l@ z`GU\I` x[gr.j7-S'܂StDUag7vs"\67N5@543o*taz!07Zb_O2V"YlVӴ 18Iv?ۄQ"LB e=G˥Ka2|}P}U-"y|de 832 QÀҾ=;tzd6;&(aN56r1" a\94E ޥcd%v/Yii*#N%҆ur;<]6&1% 'pD^];!rhѱy1^XtSꦩ+sm~Mc~ݧ zn(sJ;!))=%1< D6qxF(Q{6֋DhEs̒Qd7^_ y1ue pfGdN!s@]bQc3"6ͩV~^/‘4(&8qۈ[\4{n%cjS; ;7CVԆƚ Bt)|e~&:*qIP.GK`@U02Z,pn ^;nQw~ŐLiQaHt/)EO9&:VdE|S1U:7զ=w8B"Un= }ĬGS#\b2"v'w])@,q( &ф8sT̘&%TQVto7?3'¢ D,-vH i^ʈ7ؽ`˓#[g27*S[bQc{J{r3mܞE^‘-#jZ}뾱Sk ƙQ޴VniwF" ^G>{\poWOGIE:AtJ'm-D6?fƻ?xV|֏Ptv/v*mRLC*44Թ4jѷ70B7Nפk1$ueyKNzA dr2x{s}ߒBFҬ̔H!%-J@憶M:FG]l9'xb\sBљx9R/+(:R^#R0+ WJcMM)ddbA揹KT@s1K '7x; =PKnu;_eh+$<\_Ȥf8ta Q&gF^Lun׻ixR:`uQݞ8GDM0{jÇ ߝAY_d{{$o&.AN5853 5qDՒt.Q' w. '$j3O}ր@S4V}MQ{ӵ wAj '|ܐbuuhŧ'VN(i^C1sf.݌Falr \:=lYt &Iz $ MX'HsY҇ yYHV2_$uk9jx"E?Z O Q/P34MOp`4N6M)I @7슯 !-R3w5qW9*A1N3.0EQ:3'پaOr\>U޸`qH|v^sOz+.ܥ̚>HPpnS>Peu rzs8EjcQ"0.vqvwƉE|`:Hܙhe^JSiGHfϰ4Uc #߄QctIJr<(Niċi0QRim&u;ɢLAUgJ*2hzWhB9j`ڞ_]uprQ/@R$q]y$h@Lr*VX}C'I:l!-_l_̗w BwnU@T[kУ˫7\$sHGQ r樁 lPN&xzWwk|/c{:7~gQ bA{بC-|˔ Z.l)DQC4!DczYg}[A@L3x/w3DoT9)u@R`~73miū ]}Xupd3?'ynпx&4DkKzB!C% BhT3`rǝ7ΑBHnW?\pQ2Sw ڤuBH-u\PN9UcT9jdjDfftZtRNzmZOPZ<s2nmli`i619z>4ejɯ{ 'l@%md~!;-}Y]mud/N>]~o Ib@L EȞ4"RǥL_n"%/mh9jl7H8c3ZVO'(}rbz=H6DCքTAB/73Gllx?FB-"1mkGS:j:k̭F3–v)&+xQTky5_Bz ~O`ƇՕf{X$ Q|@DĦ Տ=@@?pUDQA7T$T- UBtB'^māh2{47Q-ʻ1Z&ݩ矺gT4G$8 Fe@THrY*r VߚH_`oo^0˛pD9j4E/[~"2lƙJ*4L$, oejͅ:m3ڡQ ICS!4?s( щrKֽcuCiQ$q$B6#3V񨉘H!:mֈ6Kqg~MGz^t4Qq椁r>o IMy>J\W ?qJF*tZ&aGb5!ltq/5=3II#3 2UQݞU_F/إL"f%[)d'".eWkkR4 YfZÞ fHN!{^jqh)uU_֛#MDcPZ ϯ@ҌrԸ ܳ:9CsDCSy/IMZ%uz"tEAYP:rهDfsV921?nVqܻKaIS:7DAμsxiqޭ] 9.(eK-u2SG児=! nq fLN b$vfS/1ッ7ͺ~xʇ/0L wqu m^֡R' w~csc4Fq7$]uA[伓"Q"6/Վ 'xw?ܦ;!ԫ*t 9͔JMFi$3;GDÇ$!G*LތIc&M.`Fحq8:JFqŷMrtץ;Aʙ%!x@Ks/<׏੨?^@gxNiU#O{?;^iBpY <8{щ ]B4>;<ݱy&2!]cY %ioCb>COUܲImm `9%P8D׶Y vV-gL =m3F?U0VQ $Xm1SdZc褝P7aP:ǓKI#CJ3x̦syRFAzh4% ߶Rf]8ujũ3{4 (qX aT9,AaȜ22%mb強h`,R(E(fjѭɓ|x"RIKc# ak1[)$. IB:!Wnt+>On|+(D=8uz_J̖9I;LӔDq椡# n c[EK:P3R27Smbf]E1)j0Ss;!]l3&'IMGI"m.?==-W lw}rZ<]v3+<%),(T ՐJ1 GCMR?H4< 3c,݋?5S w5w2&0/MC y~ ;wU)qJK~Q.C-ϩS[HgdNR:TH:\ګqD ~R5NqOo%YCmHTIFF66$WTNqZ^f/8 ICTU6J;^?] ^̡xTJ@C_}O&V]֭WG*BBB&Ҍ3&H\MU^]X&5%.9itJH@>PrZY/ @^/Wx!=vdȖ&:Jk$rgٍKMuzƧ͎sjPgxNRB;5Шg 㖬Y4}-^@O&t{ahLӧ|)֫)]Z;:U\u¨ ΂v,ca7#rʈTR`P>ݗYe$^-{tNouDIm\OEYƠ_?-# (l+$s38D4c˓M%#f\N 2*M_ϛ&09RR|lݪ?4H -pRf[Hl41:0Nt96NB"725%r36'MZ hs/~+[e"in:DcNhn]v(]jHbIP˦iVj[܎ r;zt.c9id҂o̿> P{M{b躦[;+TlXfbRyT:"7e곝:L8с1 qAIk1=~Z"j>R-Ó+<7|#YJNnj$kY)Nu?Άk#́&J3>'OZEW!;!)~A馁$ b8'liiV867$;dh>UWMM..':d!=mwAzvCMĻi~4骥q&^9י^(&HNW%λ1i럺F(e~T)6qINM=%7 ?S(x->E.l_&O'Y'n; m2yOq)SiC]m}ِ//Pj=@0^ߗ6Jv]<gH AF4|h$3tT΁OWEb1H4Rqim4.)EfbE&ψJ^{U-7PUٴkUؼ'g;VQU2LN偓(*)29itHo4wMc /E2Ae}ZssYIśz@EГ`Z18#6B@FM{)x^|>_AāIS> d_nw7D'&xH2~oQ@|X͚ !I:i.7It)sD ~d;g{1r|v;e Lp34' M\!i<\M[/ D-4s:EOĻvUVYB`2u+76M>+̗yts)Ψ*"^یIATGw[_2wL8D5Ez?j M:#2h Z xi*&J3H' RZEhA択 a=[5<掽bbO2X`gexi"ܱ?vNM+{8ӯ.2b:iXj;h ~oH b%*TYx8odlx.=){Q>=Dc~@*щàgNM20J^b7=N*>֫QmO7C\e RV492 N[o}gbPwq=_Ӻ_@M(,Q9ix3k 0v5p'2V ]/;D|簁G$7)yd#QJS"Y$tώNIu Lp3:'N\ cl(r@ |%w=/39WXI/! D9x$/q:Ĕtx cwq0L\j=SA:iN,?!`y۴Ą{끻͓1pě"䙽Os U4]i G^ L8gpNZm8mo(4n(˻2[2 YpsL^kfH, +Q\9edZE*+alO"Ӧ*;峸f`$+A B6nQnێ]R䁼WLJdY. XH cqeqRp wa[#[;Eb`7>[Lq'y{^ oyʧA2dJ/8->a@ʏOg^XѩQoeDpq"+Q9D]:K%.Ti%m_<;ӚoWu-&쨥fKJ%zqvKC.1Hxf Q3e<ߴ;*MHN|f +KSyx;<&rJf0aT{ MA9tHgtN{_$x_FEfZߠu`];󊟙Yy e"84&KvoݱstC:Csд Mo4nY >օ<0~~ n%+C@W7sH:Vh{C2؎  f h,N9 ; ^e[;3&r3D' Q\Y(bfs˞OzwH(}hŧM.ђ}7ӽѝ>H%#ĔK H6'S.Ua =E)I#B&bOL9UtSxլ7CGCN!8sHӤfeaOL6U;OQ[8jޝθ4.q9]ZiH5nr~|ٮ7$"]`Qdt!@ǝ,{9#8$nQIP"?^i;/y,IC\L<ޕFlݿZ|OmF`7FL .B2뿸CF֐nvRnzÍ;{NS͌LuK '!/t=1s]@[9gDz GdDův.L%?hi>Ll~ SGZ8F=TQ qOi ] Hg R9%`kBj& E8jd fK$SK}O jጉ%s=xOS>EÁY7Aܔwz|j3ʊI߮#"HC=(ٟ]eWD;ԐF$$Ϯ2#$$"q`vA dZ!z^kAoTdzY ixrvN,=qvt#ƮMӧ;٪w|QV'8)lTRtz%v+s+rlÔ1gc}8֠zc`}wH֌S9I]P:k+R2AXX~OZf=P#b+Q^hV̓Ct3YTA?21&!.5.aSsALHN*o:8)Κ]tO޴[cK#v)OFټ,=(i4HzsT"\P9kTvȇ 45FOdo)+xRYs[ezGۢYn`n |]a2'V'GQGPh g Ljpt9?`\YQ.>O6dZoֹFĻfsiSn;XZA|e,HfRUӣT  ŃsxՅ$8%r E3xgmus4آN9VD!#gKLdY*UhI9ɑ(=JHpx &! 9 mZHKZU+w2JrgFJ)m%L`WIQH3V)@?):u{Sޭ&aZCd\9kh*HހYXv1ePvEG%9 i+K ܸüFI*9]Kt.\pU0lDxnã-"/҃ӡ"=ZjuBhZde J+#ǧo?(1_ &'8(,rCCXj'$aOpD߂Yv?AӋO>৛f|7R.Dlۯqmn7z Yc͙]YZBla]q*ҋDwS} Hg R +4}l1yW:Jl[fW[<u} N1jTtv@v mM(0F(,1'<?lZG8Z9c#hj~=R ɣg9BZ%*F]H e4UQ;pZ8>1{7}p]9k|:h7zw]A9*[a}?v<5C*@ú~Ӣx[4D&16]`:k(*`).ԮΈCrZn`$S>qLDrQ"(oJ4R>3􂯀}$'\9k|jgϯ1ǗU@4&dȹwDoۯ:OqW6Ω\왫Q*iw?M b㏃1b1$\9k|(71Fɇ9i]VBXjcH 5j& fS6w[=u΂&Ӊ1&,Ƿ}kG.(:eK]p]0:k)J8{xw<'nY_AT!%o]ekm`>N{^ SY!:Q8KX`ag|Hպm6( s]<@IKfOuT<4c?Nvrʙ rA欑 KhÑrm~c>Ȯ"9u(> s2Ĉ,@$;&M.=!s& YES7F[膛gXsNd9JDŽrd;4Vs]E E gH!u]٩4 ЗFJĦ;> sȌL>g 669צnona 3PܩkK6&W?YdZE&%J >gOX%-{I^%+m!"I_릿6I7 d>ؒ5bތܮG ;_yN@Tiv.9q朁$kP1@chfdz iݎܻ]lcZݗ+L4A-Qdqi3h 'IG PO^h]:k*hZ[iu%%PuTukwU~u~Y'y37Ͼ<95  ̀NPRcs³ ү,:uKP 6gMX%U|Aȫ~tyESُ}C ʘ E֑id. dhy<9/: M Y <\@CЧCJ˕SƊ漬/v^]"C Rlj 1unص/Lg8mA.EhWKࢡEv]9soY2G7$Ϳfi\ך<om9- ;j[>4Q tҨrv\ޮPj3"fnX|G=5 d0'P&HҘ3CuӇ&0FGtFB.Yo!dkϨwUiD4vl:ajM=}cftIөs@t'J9iq`˨̓ ~ʇ{Mu?d#dYPɟ'I?a'Ax-JN*J0O|pgr⦮n3z\^^g!(1z9"DBT=f ߉ɶ"]9k|(h<PA^q7Wv/$)yI3 t;;<G]A[t%,Aa.М54|\G[*uW蜕dʺsn&Nk5Zww=/nMqYN-_Do2)p:d$x Mo=l=?jn͏! HIx(1(Bc&AK8Nx )OKHt}4Se&tHtr.= ߢ]ъ'Lljٷ,s7HZ{Xw縔pC9t=] :gNF&:57{zq#χͶc~/>Jܲ e9nڍ'8:6.pi 4tƠ|"B)L=#\O*~@;A>(}yWEc@01 EeZEfy|o|:jӏNtoa "72U]CƼӦE7 _}.3)}x51gRT%61A?ܘxQ3LJ` *gJXi$mh! F* 0shS;S߻#wǝyl1}%naJx]@:kšH;1om=_PFIӤS*G gI B)[n򍓧#Q7,:bx,)2Q"]:k¦Hn=?'caH+MqnkpOt/ Ҡ AyV>VӨ{ҩ,~\C$%PqAG9kM-J fw7:u6іC(IMlq5h<Ө*ƆcRJ%0.5@a=6& oH#~WmJ,'K3s=i1y<=@#U脍2a.8tI/kmĊp欁 !핵{m,2k$SW9ݺiAri=eb.)C>^!,tY8rU֕$$0sQU./Gcq >".T:k #0- @ݤ< m蜰X%Pd]1cOp:VBF@mN,I^`PkiG?B> 7T;@3AK"%4C٥)pmes !c:7ٷߞT[x?2 ^v_3v뿜<;xp;߮#؛N^E~Ս_+)_ģv NP *g&~ J|T)BI֚JRF"(ݺDYDO'aIuN4(}$xߣvRfhg>?FJ*D 2m㫏nR#'4lL셻t8e >JRgTLΣ7݃r%ɃiSo]ܓ[@r'Ed.38LBO 2ܳL1y{I "YC3 4)%Lg'a/o~݋C77Ɵ6\>@D Z5\j[GgAEPh4Ɣ{{.5Dacd!5ܢ];޵5^U^T{+G@~_i KKd*)Km:ޘM2$`sgee} zH+vu36j_>` ܉:D7 Wy ?iN$"Gi#Jp 6M#+A{0_\e˞G-}#fEk[ʲr"fqG  6--%(R%U_?g_dU)~$ojy}Y{-FgQBth%.*f~(-{Uy(91.ǹsU^y@I'eI!jz'xhuQ*'P[~ \tz\z&ϻNt$^Te|zJP'wwXk6:Ep 6HΑ;oipE о+2Wܷ$SRcWt^xM.5Bad3\ k׬>ɟ#HMREayͱђ&Ɵ(/@5PJCo煮\v0v{B߶? e1%Թ[VlxC:IF gN?Gp9JfF8$՟oAN29Q?4ݮG=&OOۣSGDY!SSJ: -Loj<׃01ۯU.yz'mUoMg R\wz^b/ =T8?2~'$ p6 &yk@m.k[/W;+^7]XԺ^% p1r*6 Gݺu9c-;sDYF%?ŶhkMRozӸ=QN/_SKTR=,e7,$p6:?62B EYD.$!+0'\n }5mU]vpɺ5!K{׻;Hq+ڞ)In? v=:D,rl* `t̒ALTx0O-5*aL Dԫ{%K`Gn3Bv@Q@t9i^qQޗ?db %=9Q-P3D(';w9{ud1"eC9>U&WUݸuwS ۢT^~yn![Xؚ7h(V=~ [^DY?J Wf/]޵8a%dv'c݇ "S#CS#uSM/MrV B~N/|A=<8M&<Yv>+vDnڿ? dB}r.= NxZ:wȅC] p~g Ʊ҄9ye!8.5Bqu|uMk;Oxޮw 75_эP:C=9FIgm;`cB$8|IZA] 3#\J 1}-Ә #VŻ^ӎ}w|8r?)G72!D#\pG%,^vy=49cƷA/ "w&RY#)iӣ4},0M% ox>%R:k,hs]"Kx]mڮP;wf1>iFor&|٤Qu/65&Ͳ<I!!>sP^7ih\]#śz|u}?!}rz[-}Z'%g8\+ܝ`{҇YQ!(<$-`ހH~Zu P5Ϻ~T#'qf`C9tx 2yZh>4^ dګ$l?3-?cWSR h"*qiiqOpx$8FcN0v—st9է+}h6(.5Da?sjT!@e-1i( cxc`3MbWVe&E#B"!rE I%F&,Vp|YoJc~>f}yltЃ=hM& rטXkRk&]׊s7 Hd+$кقY!]ۮ:zcCM.w) 8j57s̠_4=J؟o;Tw|47X vA !A]{4s r|زD0wA،nX[PwA)16Ҭr^|$ p8O_flabGt.КzbW,Q2yi40U+#jC5;uD>$l|-eW}N/f *G^((C>qum ^TU~sEj tu;qf;CǷr֠5[\䮻-8*px$Zc|P2'5PXPQR,ROĠ[9#3'D'hDW`ʘ6Cl~_2sɊ͂iU9,U<0rE:yWz 3tB<)09,s-P. H=԰}ArUW2_퇶P%~ !7C6`pv?Ҝ5SSpyr3_frF )J]9kx*(:JिnuH#!-/$T?zd:\'3;ަb꛸}lxˑTD pAQ ۟bLO*twnq&F؏ozp|v_`# ;sAgQ4 u 6A5FQi]ʓ9$8%,~rl#M4uO^eni'/Äof hK?^#5:\e@y0KNI Mp Ĺñ%UtÕ߇GpX øDYC4!DsY7a:wWHp,պx/SiNJ;x,0A&~st#aL`s، PbU5dÇ.gow.E"Hxح2|Pi`$m.{tntL$g-e9f He'$8FBd-oۻfSAҦq4v"m:ux$jJOznXon*g$>}َ]b=c贱xY#S2s9i@}z-v5ŮThaܬTIv+!kh)D{1'}r=.0kN 0,qY7Dљd`Tmt|^Oqrș>2þzY.PaSNo`؆ԗ8QsD{g1J$L.5@q[s۬p[̍{4$xp/cƪ2ra2S)wwް`4 [wvS }e,c4_} RgT\%SB/6}IR/2];Il2Z %QߍC<>YQd]9kp(*wW`A.1oZ%^FZ+tty{N'9gZzH4gҸPpa }r6HRT| ~>mfYkni_ђ ђFH{xH7hJ`{zx'Eh+tl`I!YcE5WcKtAQ|ΦT?wWM.?߷>m:%8 0"c5Nӏ<< .~Bɩ=Ep<TI"*mYmw]uW+tdYHsO$e {;!t%}.{0|?"rwSHe }T gEX͸׀7ǯ ?4NB\~ݽxo@pg80-)q&iq<ߵ,y?`{bqV5A2wA+@y*ZX!#*/9[mĻ:UcdOe/t90n6[^՛Jʣ$][+PàDri)&O'DBŠReW)A]u^LFRj\: 9Ҕ9W x(2+= d"}'*v ̛}|dzBڶ_\}G31MH [wiX Xhs"\3LYL_ ~,G u {ĕ{r[yzs.Ae.Af)ZfwDĄzTca^0VCoJ n TO.jJ䐚(.5B=!4!n a,1&gred쫛j]_^Tf*R(!#вZelY,NJqb<xJ_;k(\kjw|`UI {u`*(kͣ>sMD&'ax1<&O78S܍(.5@q]$GQEoƋƏ3>yCD^zHe:^T@N l"E_,Qs}Q.w؁xy*׭eԻ };%bz{up]h֩O(S_}2"!(3&,/>j=@-Rs8d]ZtXF,@ɱ_uno؁(2i褅`>SHC\p9k\();X۞t>'L'&MdN ACcJvH80|_TbI# "o!2H0)$3Œ~ܖ%"S @Pu2哙ٳ}LOCTGE9sQ.5z}'KjUޕ ~FF1߮6ŤN> OHHɷSݛ9H7xDD IF)g"a]5Krq_W/s2 7jWn7yH}ĢL`(A+"&Iwr^8;\m8' ڌIVE9)^4z44--җXK=NRaOw'#Q0K0)$!θ4.Rktznxgut;,xXϛuu+v Œ&fEt*5rϦ6ٻKӆ'(F(lx"1$|B2J孀'e~dU;ZS 8.w>V p4tܱUsCh!:iN(y;t~X"@ S~p~X/+P&56eg m:WrWMz9[?dP$ȃ%09#sȄePJzuhMoM%u?rz_=6sGlVw8Od6m9vT]:oAn|g>8CR%,Q":i$FC~G>?S]oljM]/q8#1bHٓdF/0F'}3;E9#sT1W`%~tB$jV9wV7' |tW_E>#2f Uu#apTdhrp9ip*"8uo5|^oLS8L`kEt,ܣ^ςc XWt뽄cIP3.'K `mO{o@ḹǜH>nHK-c HvȊp'B&.Fhh?B70glN LAGaY?=>Б#q+LdqZ W*UIUekUѱAkA]1h9bqI>?t YOk$ş Fxw\CͳbHLCRL8쌂z|5Zކ&(Ƨ|F-MЊi~X\4LoU54IʮX#$FR@o!0{ ц7rҠ JGbP۬Irm NB jk~ZV5 p(jDBҍ~;V| ^;ecck 4I2 .ϟeZ#r:;j7.dNe#҅FGZQ R ''kw9n+8pHxD qF椑A Œ{,'-uq#R4o"6v_]Z6ͪ@#9໇acog𬔄z2]%IA qqaEqSsn^K$T{:/˅ X(Ycwi~Ȑ5<]S6mF-/uHgtNRW?hu׷M 9rRɃBG#}`OXfo)'lP%l*)0Aq؜465b37"+vOWB64`T7G77(*@]D4Ұ cS U/r^I#VDJ3RwzD iPqGS^IcBkNl_5C帏XD%FE $|]-QzIqy_Ͻx <"9y(4J^{E>y-/=Pq~H(fLNʯ v߱?:_V8Dr>t^?8_tO43j}rY2pt45 ގH4$8Q#fTNQ}j_ΩJzu_7 W$͂.K̒<Б4H|ojNnHatL3D9ʗ*A r椡HJp}~\bqWPo[ZJVZij$XC9m*R+:s*ol`^36'MXAa}sh} 90 >E(\~ӧߵ>se={dܓvƏŷ{XhgN%R#h5ϔK,xlV4dֳ4ulN`jxtu:jAᙲ':~1~`&QhuFjp_S>²En!hQѪvٜF?Tms] ~~mV=DXe0%-fQ~q:_J}`gN3KI? Ĝ+O_DrV"r @]&)FR?EjvJT1C,%8'.R9(zsMn׷KX*䗦,' ?e*fV>?U=KD\(irD"Q9iT‚HKr.\%`Xf{R~U/t{Iaي߫ip h+}JQ`Y0qz>=݆T?JpD<u@hˌ<}T6ʘ$~NC3:bi~V_A\okr!ʅ0C4%Oj9z+S d\SP=*uhÝA:iH+HAY( _kO^&n1]E1>᦮xI5Մn:|yz;3[@Xr椱 #µyh=Q._\_glemhK5Gd"67߳t5:Rh#q9i\H) /kK ^TɺlC4Ob9t,K85d`|0ԃTOz|b` t6Ia-r_- YoA|9u s̝l#S"9fj{gs z]^D9id&Df8pĚ{[jT*/~3ۭ!Ms(¤ѡ̒8hX3N9Rh9h?#ۦACmiaAm49]oM32*s,հCά 17 fBfj3f`9fHb? | v! "<?wwr[ੌ!çQC#\}I`=;ԧ驆zF&%@ IvC:eXƌ~_ock) w"'FĒU, z *eɜ ꟪y]U2mdb/),LII߾`G?esNZiYܧ3Tk-)SZd4pel9:yvtYv8:=(cL"Q9iTšX0\K`gr)bS%{5hvsx Ezu3^y~RuGQNИ #b 8A 4H#4j`G߳}Pz%'m%^fR@ ܬ"Z_(yfe> Ϩ%@YȝB!:ix u> J<1 [_"'K1%{zkezc_ٶR.vHqA%(S ^zkT3>`D$񱾹'ǧD3i] QNʕ-Nxd%o ros G5 K`34' M؈RK\AJW{ .ٮX~riޜ$j,GަPj3`x.^x|1pٮƓ>Yj8SGI A)x&ޗ" Kq4:qQVhf UdiMwQTg.7 3,M!l>J矾h_jDs)KρSq\9idl6 (}7 *w~}i 6tRD)gK{/Wz0fH]ewrv{t@\fsvT1>z h1:i(-~oMê3Eg"ky_/D.S{6A:FW NA٪(3J̠7LnF'O).4:q=BLV5TM}w??r,UFK&'eTmJ$!eYV⚮sքiA}пNJE&<j(bdb?),@8Fl껯!ooyhۦYv_3f'VE)P&]Mq0xK4<#3J)(ɜWՎ 8k- Ar֝ N^E->?[`G;U#d4Biq.(슬[L $uze~\?]yA+w4d%ψ}goQФ 8[ t쯌J3L S/ IPCχ&y4wO›뇁^5o%k>ro= (Ͱ4,52\far"9 _Tܪ\l ^ԫ-@F[_4>!#l\')$*QRHl%F&V(3@gnBM65D5f?w^5ץ:a۷ [p/>HG,fl#m3T' UPbՐ?_cZ ͏!yʨYi(He\;WZ\>{n|(EI6JhnWKY{$ūܗ7ͺ-1w.wP[ˆMB?(inabe5 =Mԣڞ[F #m3>'OtZY\$ |.ؘu5c|k`!8.)ɷV  )4L /~=bT9sM FzwQQ/6AtUonz9`Z8P{i2X 9yb#ϏR-Q31t`)gNUʝ}Яƭ9| 񟦴N2=r Enɒ8'ƚNAW]$tpq!m3,' K\$hxyvkq_/Q>uu=d8$<h˖$cU N($Sxbmſ.=/tza)o5}HR o@2Sv2.#tqZ ICG4AAaڠ2Deu줋8Oc\LG`3d1vγ! |cXc9i`*8G+U_O+:32 c`%̡ZVIYpv[<(v$\{ @^irSCu׹hoL@T}ߩ9:1Hg("ė5[.F)llrp|YDJU9Կ{Y[,Rw26}5*Y~>AtH )C2eyװ|_ܬW d>^$Tk ڣIkgIkXwt񊐩3͢=FX> G1(9CsДMmt^|H V!񴩖" aVZTWW ܩR2f{u UVqod6:"p{4?xB(Bh$a bjq2oJT`7v0H#,s*q=0A"KFNš*>&3|)F!#!s-pc9Jt*Vl_tԯoiT->Щ ךJ%ya`tgUJ`3.'K$S; s>MB &}s^Uyv@1eCOŪޱDxf>ѹMU8gpN%r*^aq`ls uj((˺IkۗAs @}[50hmCrϊs#m3.WE>ۣ B ՂGJALR||̫҃u|We*Iw:% :Et,jvd?O!,Aθ4.qO7VXѧG I$( 7M$'!!hKLO[ JO@҈u>t<>勽ܱ$&8=Qn[ˋRI:5)S^3@' P5Z;/w'6da}&wgq{&omJdgs?vڰDID!-/#,ީcqغ^|n诪!#ё.aM2ι MG@hx1Թ7MrRe𵛡8rҰĥPn x],w@6D`vW=wLz-18]lWa$Y8rҠMPȼKLW8C\?M]OLF/Z+c ֔V=Nx:/Ѹl9#K{t l^w";P:o-WkF񇮘Ip30' L9eУQ{ ڨ{Cd1 .NN+$th|L0 2sSD3Lb S9csQflb_7ZII'ʝPOysz'E!̍#/洩E>WAc!uCwm3>'Or u=?/g(Y3*A.LTQP!]vN"@Dz!KG&(F'nb (Ki]oppNˢq۠E!ucyOox`U#~phf$~W6Eg.zg/Mlטx=Xq^ +KP1$F]y9 ')2:#t-:t68LO"2R^FQm}W~.VzqК^ܝ+%Nm mٙ#AiP|ۜIjC#J20UZ[7e}L.6et k Nn *ўwEfU" KCr#:*21٣ QbDOdvV>HKm1yInrnOܢ2͡ȑBD|}.'C 842v^׫/0 O V,H'D(,k*nըi8 *}/>f :@iE8"B9idD&j:h,#`B4TQ(:p#0)I]L鰗NwF7SRo1i6C!ߚ]IؔMB=m |{eoOiS%ݎFBF] C?>wP`tGiK ĵӯx<A!k߫A/mOą rB(P=.Oz7H=:smRP"9sO'u ߟQ{M [tYI k[ `fE4DW z\QqJP30' Lo|J> _*Y..1N_E%obY %h~jdP(ҙtca#CGvHSى5n[vC yꤱ+!}+Bp?%/һW?AH7lEފyxuY}7~O ^o?;%q48[H[ OzDfP*o>{$eg$Z \N`*J $ehe#8ifLNRpY<Ҿk1+zj/|,WVjE7Ang#>L[6g- CAO%&R38 N[86t@%lY?/ǖ!g2ݎ9bU.o9OQ.MI:5LEP :͑tdk)Y ̐$r34' Mita,!3↜% 0 |*W+jDz[T/Д-:&OݣLMKb;r$}~h wB\b+F(.ޱrL+ǖ H'qY -II'ԕ۪#2B )y/ԟE?R3B'H@E5ԑ^ t=͐2׻L+2q$"29bvd'd2gΖ4H)SƦ w)Q~rQ,' ;iZJ9&_atzĊJ9M̎;)z9PH140%UIڃ9'o iMxes[5:i[PkH~8SPdBGݐͨ<1lxcz$=crҘݐ)Tȥ&nNAFB*}Sj2#bR>Lr*CXf6R29Gr.;FHħxgN$bR5gnK|9 Ҋղw]A8RS+&sMY 6he5J;*}НZXD݌ICa"ˇa&N97eHw=2ȅR &;=h2:B I8]+t95+<8Il_Cr5SŒKF2c/&o) :'n{S=G(R3P' T\B >/z qZ6rf8.Jb P&QX;1C>`T`$)>c8m8>**$}Pru:khGP}^6ju"\dTz/;4Wm 4IGd{.o^l&R3F'H5d>Bĺ Ҏ7M Q6?uY>ԏj9ձ=Y8U[4Q3:B t){!4z{pD"8s2^X N竲;rZx773ĖOɷ@ɦQi }nKO9~O#H&&R38' NI2=N6Ey~f{NHNB| yGme;iw=b8*GLx0o罻!R9]n(o:Ct OͰiiZe~ֽRl;8J:T p-:QUΦHjJ2v[iuhl-A qqK!TyL~i~tyD8[v8@eU~ϒ`:P:ARBeFMFMuB IC4>>Q5buTs64(5/NhINu, Jk!mP(DqS[̸mq.IcM ^#8F$,Aa`Z.or$:KN7N7Ԍtطk/|p)l鲦:@u=N&Hbi3Jtۦ)m>B7Q8 $)r3Z'Vh?U U[U(qu_-mSOz]`iYd#,Z>~o}dy|&&R3<' OK ~ 6̃ *Uwc RRh'8Wl<){2B1QDɇEcL%L@gtN>rDHƣ@BiPmq@xp-.Vc&ֺ̔\yA*>Fup+r8"7rҨݑ"hY8Зp~1 :d I(^sSjRSTsnG#i-$8%.f YWF˺Y?_?&-⑂8ƎcKav VC9͛Q> &N O04Lqy%"my)91lpKhSߎS':`jí.ȧq|q~WN^0$Q9eTFyW PG@ ̿JZhh-ߺyRBsxc|b1Tni[hZ8glN yr35.] Т7/OkQ6pY4T#7vWxQp1S'V\#9itC,$Y_0:GdJb=`Tp_aSvmgn) C"3!O9hSm0Ӊ[(r|3*'JCDG?5?Ye^%E"ڗַeB߰OzUW O %=vz0.= ޥSh8M޳8PxG7#r҈ĕ<ΉOԨ`6Hq(6GRibv#o(]ʴF#9ǰf쟭RPx3"'HO+4V4̃#ag~qߟd۟[frTBӚ(7i)RTߢogK L0glN `I ?y'3CAN#9qٔ'Qa }d|$B\"Ri%<.f-">GÁ48qsVG$a3eO W%ZaguġSb3wxȫLj>~S~5;aٻTCb v9sDAGe_rhZoķrBC Դ #lZ$~% (v1ݷa}O5jĶKq؜46qҾPuא2x£բ" NP$|s oVCͪڮڑ73-~ V(dʲ%EK8j鋝Թ'6bh͓Or iN=4:gTXloi|1M!tL 1IQhCĎkK>bhFfDNQ^Y/\G'H4i(@ҟs ~.$0+)SAKcA,35GDuj^Q @ } pt_.몟yzS>mtvSV ]$Z\;< W\ 49#9&P=@ <1ʑdɹ IC7A=MھAypDT8mg({j~OOxGXtw&XE-i\Oܟvk~e@K6F)WR cMKfM>hDz ]-:-ԑPiz[K6\upG59C?"lfHN!4'8ۮJ$ kŧ+JO?W?T7-0-rOwN#LutKHnZ_Vģmtd4sP Y@:;V9]!`"i#y9n>{摤$ʤTR\BKK@CLw صW!Jb[ړT!ౖsba*Y:fՍ4u63՗?|cb)ƦEQHa "HW(tVMy_5ktP;(tıCR*;H 6'Gia I#E c}mHxe6B8lxS.F+|SKE _!&oANY,1vQ+0$v)TSF/UCMGGqF2* ?8ֽ<XUh*.ApdMGB)&GlzeᣯU ^>|Р?V[ ǀ>wDLJrHUC%HWB'"(ƥ\r+ju{ uF߫lOe^Up6꼀P4eyh*| ?>ګ{J8vS=߾U#-Gl"PqƉ="ipWxrZ1@D.a˾XqF椑 _`^XQX[ou@$kېFIu7mB=~:qnHǵ8#^h &<g\N!%KnC cՏm|WԠk]50mzH?9oQ .WVڗ5Jt$9< Jls< 19iL Ĥq3PW-OZP@ޗǦJLxh^-^HPQ!Ld ,J{6tZ;wXIcvC\" QB7=H.~%d54=ct-_e毤;bIB\7vcZI;{|lC3^3#Jŗ<lM ݇p~lwF`:9 @a.Q0tRK5p -I)}j *G m<>̈́!J=2R3B'PX q)zr'Vb ıQnFa8M)\Ik6^G986;GC{b]xsd'2D g`NZ i4G3]nʗzRnq#b'mM77Cr8s16|w#57#Řf[ :a1MQL؞ewG Q{l 2.ڕ8J Eb":h7U64$FI1"FΨ4*q-d(spcٵ^}sn}?c<8 j">Z%C!y~G 9g</0Sƣe8 (XV- 5A8L?TBxJ%#$GE/js&?~`rs@,9s] S[Quח]OuӲu;Pķ wH9S3fB73uly!")c9StmфӦa؜46q'@G̦ۢ0uu_[^Y ocmo]ZJȘ1C+! +)4GM̸ J K[ N3X' VX QZhW ) {D\o+|MONDid\;hMa[~Qݸ,n4>8Cs4M'܆.odka݈McݫvhB]N#ã恖+׏]- q#a9iX~H( 9s4Mہ68HUټy;O05\LQx4(Fa{^Z 6Cd IDJ eK.[PE xb5K(ύy~_А5?ە䱮/4ţ;̂"b}34' M tn=Lگ0RE+w]ݏ 2΋<̙)bO kI`b36M] 650΂?  z!0vVuSĹsF'9گ^^sJ2z$: М04Ng\N1 =:G:&{jofvxw^]W/G-%.BpZib_`mvIgIU=w`gN9 $e ~.n}(Ru£g ^VҜo}~ ԳQ~ pgNPeij͆շo1yn,P5MmFwUR#"E.P_d 6:8IUaL Bb1F%l$W>T14%Nf6Wn|I,2zFf҄7w6ʴN<>iC ;eL )30 LJM^!U]W6Wv0|U)Ip -'5NEG>Nq /FőxfDNi6/BY>DD.°_m] ,oMs!.B $0馍[K Y%[ cd,:sTsŋ"U5x.H9CZ>>beH>MPuS7C8(s;'Q48S{g=n/1,Ha,|z{P;| )F= F*Džs9ON8y`gN@zpvA6TMPu?h̭C7!Ztת_CS~ڹsn{B'պN9fJiɝ oRFPg'd?tI#>/clx꤁ "idx+HDC_c``:z~A?-()IW'`Oepsp"ΔZ퐍S|+<86lAAyҪ yÜ.AȜ42aKK}~Q?I +i۰/ =,5RQXy:hEWfb+x.Hu7qyyW`I9CsЄu\uT˒$Twwʅ8n6d_ C`Ս5Hku+4"Xv:ο$%蔘E(E`vD:\ k÷YanV/'z]S.r}*zyT7fm‚'E"wOӔ$NOγƗ#K1H4Rai`BY~hOnא@ܑ卦A1uaՈhŝt޲}1E9#sȄNJQ]DNl[@f gZ`'ݶ^16.]qDکS9k:stPކa1 r攁iaW YBS|WMNˀ! saDu~-&x{"q1qttyOOLhjmO03&Mά^pJiwg8:yF[Xu K"-q}~sH5}VXAˁd%)iJ4.& O~DI󸮏RHyn$Ng`NiF:Jhiv-@Sg)!bWIfYBY=bjӍ_Pi鍏3O\:@zl>ʥ+t? <a:i¦HKmס{_/;EzaTw ~]ߗyy/rv5vXrJ#E7 ]o_:c528S[ctPJgZ#G('R0t:bs]=`.k\ǩ OЋnDjO~~#<4@,OUF5~9?%Rpwq #j}9lo7J†\G&\uC(.7!3 ^є2.%=KATA>>y\"?rˎ1tFiBҝ\ʁ|]~is!۱k~T]lkh߷Ik?!ƩFSij# `YI*Fx+\(R32'L}/51B!²O;`-K7*7"B=<4"bJģO:Nɞ$qe?:)&t#jGʸ a@}/G] o9*q{߫ Qn IK[vQ['Lz&ΕGΰ2,.lȗ!Y9mKOœOuxe#oׯM4*<+-kBz*m-9ҙ"G2 c % Q|3&'I\j*]AsHG-'{cxPelqԀDBJyN,yky,HÏQyz;ǤX r椡 \߿QE~qcmݲu]C],*S&99ܶq]'S4'b'Dž:inFZ`,~澃$x^桫WH3?hNH%~x%P' ."C;( t%E:s脍}58W^O*0^|"*tȤ#JexeC;dX,"tp'LDgaȕF0gtN2қ݄0,Lx^]R7tȖl2lػ(,+'a<~y06 D0~KPUTT`s%O%3~ʉȗ&Z[g_^Ad@eD]b8O1'{mƱ.5Da5ڨm+4(F/sK铮s6ϱ'B-[KDY 'vHr|KDqA朑`G @xҴӥal %} ??`M1]0AAفW} AQSЪe?pO$ i"m>*suI-: 9|ꖘGisGѶcMQ:)*NmG\|8+mS1GMo4p7 R˔p!O[l}Ѵw|S3 M p9٘(C}\NDǘĵ !~HN*{O02)%۪GZқjyՔ>{2Mdu;2WԩQ*c(Ԅ5hV,>BeQy2-F$d= {%p-h>gl[3_6AX9W!gg6FܩGGYӡBcczC>Cx BE4i˗~Ed= 5pnI95-K7tJ v0Q]0:k¦(¦H R_ 7DSV>7O#sڐyP/z҈Hc sU8#yNS5F?`Nۣ.,.5:a_EBt +n"ŔjQZ?'}9a5:'3\Iffzrd`tQ4*" ހ<8IÉsf"BsHBq]t &IKI-uۦGw9YpeLAC: +? 1IhAudщt -QLρVVL 1rٙh=&.E78FcXTj]k /1q9f< dJ2I=\IV_Gl2<|8= tyٝ;.Y;u`ԛg%; ^z̩DY @}E:8b_U'yoOp۰//6_IFŤl`$eP(rc5JCtN;ȟp~ &uD#]:kr(W|+ o\ԭsG罵>l(50KX6;zRf'&99c \`2JK<)© stL}Bm(|[ 2@6{mŻJxr4ܷ0*X?"QB9eJOďRDNsx(ƺvJt1.Ȝ52a91J:~7ڔ7=*pŜ4$q^1h{y N)rѲVp>=5&ƛ]QWGs O0It薥LtJſ^+/H8%we=;-:Cnb38pJ&mP?7h /H3yHc3"u OWfm*ɀIקIͰed7D$UXI? GT,W9SK VܶM!|Bm!0!q]USw+`B2vN+=i & C"WxDY#S!2/KId2hސ?+bR)-6 14z6ߪ2mHIG<(C,t(io&Ҥs=$3a5SYB(AmI{<ۇmnk`NS!(|ś[x߮ __ܫ ̱X(|= Ԅ}" F/h5ZOAK)Mtb˪^I/nYW}uSä`,N`끱4a,ɇ=&|M}GLD rIx'8%ݲ&5Q>B䄰DYcS!6/"Pn)ڰءzAB?:588/6>:h TnbPހB;"5"2%}H` X_`z7ArA VA!gO~+2o*惣[ {LSp`\9kh"(WE<~gx-$fͫua| 7C;bi+Ce2 pƩN:Cas55큆6b9C DSWw7Yn"l s|y8ڌ Rn`шD!d>b֑<&Gp.5Fa):*=?N~~?m՞X)^?x]?uG|'[( N0 I/ƥx%v~._<kDYTJmrm wq3̅/0#`&9IꇚFZ׆(U#nysT9nL-XQڌTqF͔ %r[?8D xqIon_ww ~-O*.n1sٙM2Ipݲa:CE'd(g MuiHDY4"@NVO ,SeKP(2HC{~=1#D4B&I$áAٮqm`Lg/Q>(쌴SQ0y W}Br2?ǯa47 @{O@}!J-:}x4bG8pF:?&ßvGb: 9u^kX C󲮾A  $|ٝ yDbt>gmCN5%ER.4%J %-4f )n*ђ]tCP(ɛ'bJ';b(TO.#LHd13X|Um>ťSRe?ի"nwx8R쥺@ӳj(Hys;-NmдBZDiĿX2)y,u.rZo9V#WCAP#YEv!Saܨ+ :- SdyGA=$$J 2gLY%c˺/%?j4ӫij~ֻm=Rb^l`@3{xGbQC<0;s !sND(&J @g PXY풏RE#:J+.9\aU玻 ]u <&SFSd%{#"qۍ(.50=K|iN5 K^]9 * x`у\R'>]?ɦKȉ4\BSk|8=Jlo,ف,ȾQ#1hdY_ץ97XbK9s;N%|e(7٘kouWpF #6,(QPqtKwa.->Bj"eu rZz8$o{-[שYZ=Byү3LCqֱL؂W3< 66 H>]mCsOI-fPN A1|ehպR_tl|c#v|-tw\u#gOt sŨDIc gKB)]]kκ.>R5 \~vu[ X;Hw|+ZVw"zAQ<ޕpA:iNh-")AOU瀓xK%^dfUs34' M`\BJxtYN 8"jܤhY`L:SW(+Tm<4P/ԫ6z+>c:iFB*Ѝ%~(NЩLߥm$Ƈ&:EKNv <%A|\E2sŘDIc"/s),fKx߁Zd{PJ\h_R^T,NbА^QxL1Itzw3ܿ=[ K(glNH"=xn,) iɓfYv-}nv6%\|sL]Xwsp8 q35[84N0Je .=-umSkT*垁Q~Ç#v |9Gdbd2h :ou|B:ic t dWͧ2tJkq'?K0HD9JςKz@EHGe <0I221$ΰ4,1 ʸ"JnGY誾-)I~s%;v5fNo@`u"Usq׋=q`rP9ihz t Om?m G[_#Z/3|؄3z9qi_wc|0i;y WvLDiirH"8#s "5< Kvy۴/DG<\p[/\4t'_bЪ3k48|w{;x$N 1yC IhqR^ɂ[.;("NIAЍ @r[D{[YlLuE֌nZᛮrL"9Cs(:dKIllSyі~ gK}z]i|0l .idph~8Dtcjip-pLCq9e\F,\0e72xg/lu mURpSKTT{[:ZM ٔ} aAubsD IhPhBQ`jwHK]I}!ҁ\ ݝFDj!Bx3|;uIlG:ctՈQWDl\ޥn؛[#oRM *JW>cS6 ŇS {@&)u[W֊4D?Mr椡 Qt+w9i[S'jŻie@~ϓ?Q<l *V3!n}H;Dzf HPp3 ' H)N@Lײ!erۖxkNWcrf@N@\[8֧e=gժLR_Ѝ#:ҾyLcGnej#:$ɒD IYZAy̆5 Pp⏺Y NoR eNV!8MlQ'G{)q m ^{qQ4e!upXi;1@83(QY+ZY.G_sP`?oH1M3<' O`z 6}8qE53f֒Ǹ!yd/ztCYnH@r3*'J{R?,`ng8hշCΊӛ>.d/ժ&&Rypꓗ-5WXeZMPamfL Dy& OgNaLԎ6?~NOfi#ԛ5%(9%l.P:g[$D,EDu OQ0ޭO{#Xm˦G~AmVAocLo9ʔQI5"3$B}!aMlF~ F*`ΣxSא/S?{4 4{?`$5vӠ;5 aP,p ۽ ?p$(gpNi+@=H.C,>0CR'ӇZ.NZn OmHsWU tIcpTi JlM0|W7@gtNA5,yw/(ҠjP꺼!| OhԬ^ Hef25뇨|Ab gdNО2c.~.+XY?ك]pFW&gAjѕG+@NjۡOp ,GcpFQ65W$8OoQIVL4O5W%;ث@IG̘sx3^80DF&M120gdN2%oe(CL杴/j!x<%I;ӂ]|֘ZʓbXdl_yZ}6'8Fz睕UtxuծJXfȤo49ߔK>y#k&($-u$^8<:D'["wth!kr<Q9iTZ@eRZ4~=-t6zGB\4'0֯s-tNڎklrpӿʤݰ.t̾YDu@$~^;:Z^)MlN%a?Th!F|A=u8\3']WV]%OHl9s]΃lac|eʟ﫲B]Aȣ[B'] ґȋ̺oC\xuW9Q9iT#!L#v ֙::mKlW*Z~js2Nmt,`>tӻnFISm9ZcwNp3>'O R]ĭ5GK|ρ\Ԫ/ˇvU tBآ#μ;ŦuCd-󂯖k)YzMHѫvAМ44R.u@v!u Vsyn SkF7Z!'4Nn!\v^UiMP3:N֪G' VuOǺZt"PΤ٦4Xt@ip>,E칻}UcٌI ܬAqg %j<F;Rp#) m`(NƬn'x&--gJcU-zԢ ok\ >JTJ2u~#o+S5/.Ƞ[n|%`[Ԓ8vp0{=(њTs"<#uHH-O>Ios8tQz0=ujLjph{ .aޕ1^]DN!8s lnRBlH $6m$0#®w.h2MWs*CJkN.yΜ!.4͊{ ]x%@WQ џ9_%Q_C3$(ƥB\Fd./_ny~eZb EH \l9^rK]VYV2Xbiڽ~98zFXgN@"igH Ȟ'm^:+ R޻9 ߩsi[!u  )L(#azB*=)C`~į୭"FR>dayJO' ۭ# d9$9ih"emZ4 ޯӭj /Sk콎sg8=\+<'/d4ӮҪ<ڰÍEk9J8gtNH844Ow]?`{QP8._җ^ d;}Sm>5A(Hʜ\vL8;Nwy5Z:W% xFQQ!Z9qtR|+ogbZ f 4^JfMA|zۣq>sL),A!ΰ4,0h IfC)pl)i=C?& ;Sԝj>el`c2T;|;,v=)r3\' WdơS'MY#JZ-޷_UY7y2#ܕYlvD(*D47tU"Qô!.a؜46E2t~/_hk/=zػ޶dWz{GL؎1LLXLU]UvvIҲ0wQ8Es4MՏA7yHwb9e|JX K> !*Nc<zQ>6Ēn"RZu;AdN皼sG18A:ir-B/̺rUmw YE-OlO}ޯ7)n":*Z԰$8*7JR4kOiſzҧQDvHyތI6H2, ]]@ڹx)xnLPoV1q%$ߍG묐[1gR"ԁq DxGI IVHRj`WS12|wݮaNɋMmŸ)u:yGL<;eZl!*1!9iH*BV]hU[wkfc~*y~gJKwڳJ{t+5Bge$f1Jbt >lK.a7_j|՘18$ 혈Q`nO6W5aAYP@,7rҨՐ4.T9s!,Rۂ=mm_jx?gNxwp6.0hh=6ǻr) %Bd)F*ld 2گ5=TL'$J~}l5@["šuC  ];|L=7Rd!Kq4:=3䅁-pM r?fj؏c'$PXF/:*u 6镗셎{1!,9ed*BB n$ ՗q;Y)UlA7۪&ΉCqk%t,qn}s3$Κ:;􁚎q1 rq K h@fH˹"7ϑ/ߩ?TB!ûGQ:m)eV\#wkzrc1%2|$m:=R3D' Q)0Dpj#v&$%>/y^pF4TOZKd\R᭗S3NGnXX?Ght9FBTBWmAgngvą7\,P&c̗'-t gH:)|oY$xk6p \fS32'LX )e W>75XfA aG?%ߎLkhCL^A>ɐH&N DWU a3(' JX )ڲ jն!ݔ^^{>v+>S.2}L~^2U;AQȋLީ=?Yrbi6(FQȜ42a1Dt$qWPr~YO3OYExECoȌ5yؕ+4pkeq{]G8p:g͚gQJW'@}Ix@5X6U^N:&yQؠ4kdbǍ>Ch7J8 CH 9i@z0bZkFܔhqOK!h|-՟,ou"O8OCLmZS]KH ]Z9HzC}`X )Rq.GQ </R ;1bq*2* E+ *;\*q.5:!#8i8®GR -6 o\o9VK}+wCsҙ+}0Ⰻ4 R-^5QFD"'(@5>6vSIG.V0쇦?CsV#P]A7DݎvmM]0)Zą8:&@OH(ڈgN2J8XE"1YMP^x;Щ=wĊ <EVwDC`)GCxg`N2"Ovmwt˲R6АT0z Hbt>ta%h}ɏơ:H3ΐNa ID x-QV^C ݄>~n sE&&Nopj `q&#IC, HTÏ.,vwaj )(ƻ=> 1\n^Oyiv&OQ(BiaIU6ߋ>мKjF8rҠ 4gU[z5 ?y시 ZMoeO%Q$fO>-P8:s{ۢ"R3@' PXPq`6K!4_>v+]\"F պ^8OZ L:qwd޻< .χs hgE;t(& G(ΨO#4`Yz~ ڿ. ^hv^Gñ"OU .<3p.Qԟ>EGAaI1t ;$㤒8n 5{5j|Xo6w=UF@\&҅Gy$4V<zȩR?PSĨ8rҸ ?k8+2D&¡~/ vx GRI-ѰԚ,܌SQt`On4F\/9J*鎑IaIcvF[|Xu]Egrrh~|BgV<\jXõ8 'IG@yt< D&msP,9s5`P1p?6T63,s!CgHY.-!-_J_\c?4x1'YyE((lxiUHp 5D|U][\Gc-9o›ԙ#D;OGGTS*E0[x9qa "W(#R?GEmՔ+hP*'2΀qf \T0;R)uCm>u(o؛"c1S\WMg ʮCWBm=[vd#oyk$˩H6O[%zMǽ1x^яOY_hgN2rJp YvyAɊ]0:|?7:MCz 1=Ώ|ڼiPw9~G)2c!:i N;0&%Qɕd -usIs":9IrHMa2ظTw)d*_ sgoFQ K"*%ڬ_ow\y non ?ʗ.NeZ"zVΆ\%2C:$q(gdN)523" 'wZW[ź\ "Bn(^N0`v\O 48F* JsI'H*@` s|~[ b)ƦFl XPfwԩT Р˘1(9ihZ&8hiyXV8_kR.iW8R˃I]/01دK&dwE4* T|ym1"Θ4&b҈B 'the rZ9v5i)5„;tM*ꆔCD<$fHq9i\ze臔#=oqZl7 KvwPnHL["s$9 "{i%M3$'Ir,3(."9]|Z>utԧ? \Z)) Cl.ݖѼ5iA:5P7WӦӆsn`^޴y N,gsd֗6 g`N]rȶ8OP3< ̥-*\w$CL'B&Zs?^ =<p3.I'!xd"nӌ\Z×z -KJSn%tCxmL7Y˔K{wkChlC9iD#ۂ>ʛ66'qW"y\CN S#ql`O0vP#)|mI_\Nc/y p6%-)4w͘r!5f6ȦLHg!a'\ggЛn92YBZhC_u4t>?@ HIF!hC}>TTNN[8ܞϰ R15w=skL>Ff`dfY߭o{ܢ[kn)?Ww5b 666DNPzr2c3d"u|lw=ibДĺtť6]  QM9z i{١l)o:;u }2rf=VFj@V,#ujCGpG rֈĕɤm;_ݑ{ ^;} U/ݓϡ˔HwqQv:qy3dTdАkOs(vWu^ۚ !'}8؟C42d׉ߵL5]ѹ&I'6Cd;( ǥ$s)=҂Uuipø)_ωp]85ɲ24424W#οĥ+6 Oq Dg QM кϔUM8҅ĎL%S,>l |C!K\ :TY0Gz2mky$tl(Ϙێ<1jc]:kjDmlheI->aQdJ]9ktr(YH[eXny#*eכpWՊ$އ&Vٴ"nv# r9YJofRIx;}ДDs B_H$Q*G"{d7%^bEMvO9xvn bR\z&M[.S>`+.&hBAh=]iV$3|QΑ |U^_Kxl%flO҄_6IiPm_d>ǫ1B G$'lڇ0o^QMsIptg-}}Q|Wэ=цePY@ O*L. 5Hq1ds8t꽼c-$kB~{h~fpen37eS|_n:oވ þg<4!2 V(tHuHϚv(G$(nEԴ!"X5Uݷ9-F? ΢-Y:W08XGݢ><_ymhjBghKY5#%ސLjzi9R$E7iHPIS&{4h:RזGs茄NxuQ-̷z]FD.ج6+VNB(nO7Cb:.ͣ@lGmB;B&D_Um}&/pwIM8SމceR{4 96ssuSTXڱDt<Id uA !^h=N^Uٔjڸ@Yl h SF(qrC_`p₆"<F'$Ec@s/(%.3<]Alą(,"yup;뼼|E1wM<*!Óv@)ab4^v'!)pA$1O9G%p@/ `Yj@rxe1jzK1Uf!Nߞ% f>Oix Go} >gOC M {%SWT~rӢmδĨz#(Ri?M˷Q?U#'K[z/mbP#\P9kTZBe2! rȷn-rt*Cx[_4胶m>ё%El&GDZӖXQѩw: #VP|;&xgv>п nZu|`@D''2SDt~ۏMz5+ Oq FgQA[35{}qdCt9^VnOԑ: $K-gn3`o4|oRm :gNZ%jh*xq!jwvtRgz{v͏_kz*ȟ-3u12}b[{6FmLb\`9kX(XDe4%tA~v@b slnZ"'¥n, 1M%kZNeNMDC'S?;p&OŦp*WJC+# N)DXzl}}pCwN\: er$ 뮏0_wLq 8g NZ*9w$ ~{Cw3`J Itl\:7\2/f?S#CjݱliS9#@tD .AmMKu< '&Ot/a1GIC=Iѱ1ť8tЙ !agEnnw5#{Kù׽ }A$d'32>OUfDfjPdsAщ"JNY *3|krቒZ]Vw8\=OnBYfEzny$\9J1.Ȝ52qg.;UM۪\DEޔu՛]!5ytge`=^mCGԎ[MVD꼈NNDۭl4!=떩r*zV( uyi,u ̘QNhLɔ)Z/&ٜfd2I Dg Q\A"}[M2DoEKqZ9EiH1vzB1W NOli0k G-5(q/f!͚,r 8hH8KYӊǠ6&郍{  RI Tg HPV@vYD3")D Q?U XFHݍ;FC4j9=&QzO\'יm3O,]ǜo=`L sJT t+7I&t C)<;`(1'6n׽ [fptRish~x1rF` 3Bk. ˙@G@eI+WHrnzl!j#kn3Dڹƛm>Ssw×OB! MI :gN ʜ2η;2|0QuTAhȴ8p.# I4H(vCf٫Nw쇪ߔwjJp >=ev>{(FjBgBMA^sBsN*~Q)pAu>m3~Q %5EIB}zʷm }cUf^SBPbǜψ4Dk!_J2>YI@&R1>yXu "WZ8\f _aEކLMGͶ#J]?wIRg|3t7u<{XXoFQ̆c+|/%Ba_YaYVLum庌~"^ %ovi/ T;9rҰŐ ]0,RK+M*L{z,9vKm-x+16Ȕ3 |-OT Q3< O+P鐻@i._wBRXㄹ1]InakYN&kv,>8F- s?{,1,FA40aG7ru_~#릅vZp!yϋޕkyפsh}$^1l)7x1+ uq4>a/"}q06YLj4?]Pxg݂AtljyWMwscUEL9Y`ɏ]IW?!*,)Cv 4;bo'ťw}w.a]Y o\hKx{X u #o i n_ã KqA0]T*9 {zs>&QWTjtLOC?ll' ÚTF9s9P"\?FՄ%:][Sx{,afxb7=x,Dw=.:?i ܓF$T C&ًsT_SP5ḎI#T'6q{g?އfZ.-c*xHstLԍW˔BH!oa a3.'KKT:>{xUy4ܰ*#AY8bdGPֻm)iƇ>t~R߯C<4m)$Cq9i\*ĥqV / E Qإz,1'tIC%e=/W֛>+K+FL6.c'O87crҘԀIACM;=1^piȇiooț#5[Ma#lcwissGX3t Qx3$' IkJO#o'ώ2+ρːcVlr$hxN IѬe4+hP όz)F3nFX uiVz7vs;FPPߗCuWBo3NiCZ2#Xtc_ZiyP{H.FB ;94 21yHo I]J B"A^+svAZau&&QAtpKwʡ$*Pn =.vʺ8g|NɅ8?<+}mGAIVW_dW's ]/u@@5>zdi558~p4>Xs D%*BOjI%NxEhr7->A]L]E 䖥dT$wC?|109ipr -^/tʗlZ* =2tT(-_b!cB0glN 9RI+BnzIm} l$oV*5#ciN.yN=3 \AF6qhEP)Tn 'lYߕM5Ҵmv˭57>c#xU&Skmr8r# $?yn{GzgA~Rgf;>n7U'LӲ\Ašg_;nΏ"9֎Ꮗϖu9:_rޘ;ID] _G-Ԁ+WX-_whY`J!B1M8ʄ8k*fMJ3"k !nӴ\)ue9>UYcHuii62@Äu?tv)cഴ=_@IS!:v ٲmW8~)];mUտcB׬kH+(TrZʧH IE~FJwݻ;**|ޮ(/"BCeUuدHsݴ !P'G:#Tw,92ЩAR 8gpN3 3j$>?!*0W ry =Q8ؐ". vHSNDECa9DF{E!pgN6tthB~u~0UHH1|A{7Еa#i汒Cl.~_Ge(b3>O#A~!=̕1UfS,U s}2| ª]'P)!SM #K1f j3:iH\iP@ c<3PMf5L0 0Z>E{a`:Z[wc܂^}ݰ3EhqYrޓ]+uVB&쇤Qb&}ɯrbb ICEaDgo`y \PQv~0j:̐d4k _qM:G11Gl!b3>'OX !ux7|NJc!c V̀2sZcTB Y/;19hܪ=D:ctf{g?I4BaIZ_x/rԑbgYtpÐ8}4}Q2u}X^Y-MĀF7rҀtHmS`^[}¯ ݳ^my CQvŚS(嚸(. otK 4H=;xcGXBb/좭׷|r,uvCJ\txFJŢSHߩ_>258w8椡`1dvh)ȢB*ggrtxꋸXxJ&ZOijeeF"d)),_|ٯg&9_uP nݮFC&ĬX_9n//P{Ցd%kD37D 2-' ɶ62Y|BRԿ\.D-1؎z#qoNIE^zEW5ޡ^k;3NmxE]/~ēVhY6FS?? #)wה呇3E$R3.'K :Hc!S.0wjQ$AͤKk*|NE . ΢z(2R:ܐ܌.3Qaq3.'KGԲR It[@kx.yN ^kݶ?1ON8OI}hc ids´| R3g`Z#n{zs /Utn=N )gY☥;!*`YC"KU~:P홁RlS{q t椱{"v3Om+C.B:o7acLpjJ&wk.؝9h1Kѩ6͌cXd͐4$#AHIެ;y`+^+\A iر,`r_QT.$eLv&8-50FС:>v,c@gpNBMރ͏ig[pq:I>f J?Ț4NhVpsD͔55wt \H{qYI30((4JqKc4YM]>#^m(8G&8'/&6LBiKq?W *\b˕8JOd(Y!_h-}$in=9dn9DgHwı t NC9DNpmzS}gyYk!,{:m:C$M]ytr<>E~ۮs\㜱9ilJ(@MAgag;_u;\F<0QKCYrV,]|k$Pr椡`#ȫۮ[MfԪ;(47_!k.i@N.|.餘iiCHzFfdJ̶!IBB zrKD91UA$͸/ھ,׏AK!Dഖ(w<ӄtTnHNd$=#1* s;+4>`w2  ݝ\u7$##gkL")SFÅP&Kfå{ ҊzFE}t83DI+EOtm _ ѲYGA P8 ›19iL'D獗쳾/4ij󠨲{v:cp0: W D J4{\#sJ'$J3:'NʹMn{/jlZ{Ș(mZ}l6MDkYbBdd-MN9 t$Cfi_n8(Bq9i\:U4Hy௢[h 嫺_db91KLYBr$K7W@1)UGpt3"'H\D r͒Ɨ\/޴8[{[fPzc(W1y\dj* /d:c# I>jBD!5 w.#/Qa3`"4Б7\'!5sL#yKm\z/-Ƶ%NC9F${"6=_/s&+hɥr΢UZ*;;w݆J˔1qDR]+Ǽ?(ͤDt IMM-JRbZ'-aӭ̀vXohĚ6ӱDq!Uya(qp%wrX"9sĥO *V҈ =Ye|uf-5Itd. 3chU6PmV9IgN`j5 l n .mQ/ũ +ޡ6"!9*C.X$⠒j B>>A?8֔9Q"9e`zETv di;9/h!}|^.^@R9N>+JF'%R36'MwUUIe: :Sl%4rwe!>l6ARB ?`҄Fϱڡ* |o.9"xF1WjEMٰ9xY?l·tw-`>meD2mD WYxD*G&r3@' PU+?-; $6b)!$ߓ~>ySoneΣeҤę],Kn<+J,s&wkKKHgNUpPA{>S?T|I([ە6뢓ti=3r&ť \@Jؽ 894B9i|Zħ3JB绶Cm~,3@ 8_n5@aS:eCްk$%$*fP\Rɹ{VS[Dtɿ<ֆ_I7X_<7ё7 K +XD`13Z<]K cY: UdStJ gdNZ ?vleC|n+W\x0}%kBٕrނsNcLQ'}0él$(d L_9--mM?̢p292[(*󿮗Js-|%-B1kuyprٳ*O?Ϟ\p%98Qq:iF)5_m P1ԎQ}6<|<~[w52jr3nFzC ˝uyk'^ٸ͕4&r3>P!>T~~4z4xqCkAM)(urC=6xt&/5R92TM=+' IGPZ[t \A\(zI! 9H4=J;4dђiH!:N Q}?U K8gpNiy?2dKHp]~on~OHjc .-*' ə^r遯Z;.5`L՘} S3G9csĭ@ If'u7qmdd(5cF&'fU"V|2$W|O!9 NGKOI#ERA); 5X+,d~:Ѥ F;:%UtX&,iC72D?VחdOo 9Rh9ip:>cN|HO!,ɑ~Vߗ z %HO=`Hy3#יQgKK˪\nެm;tCN Hpt3"'HO >*Woێ4ߴu 8Wcqg~ s(J.B%:uɤڅTaJU6ꧬ9q֜YB9&n|4&|/ ^Yo]\rz4tRg\bKe]hֵ,zA"ŇRq8c8i<&+74;&Tneht /%;rq%Ldc%rLsfʕMC!!&UCh[)Siu P<z<$ğR;ެ=-0Y\1h!ccw]%)S.mg-/TʉKPϮQSOrgFE>I۬=i7dbZDh ?K%7W$BJtĝ2!Xi$404Gr^,4 r|~ar{wBAW>.Nӹoﱛ=v#ʛCgXNRVEg#:0&`*qq 7!`5QL*:uMU÷Kܥ^`^QHya+! bmźCKC of*H8NP}Vꘀju~t#32m2w~aW)( sK!Lc~n")@[=62H)](ڒ 05uH   :O )F'Tr^nn͐7τHȣm}Dom fIЋ.O٧g8MMp3:'N\ i^T|-,ěn 96c6&mӵ4/t& 96J..*4>zX:^;ut~)&r Ourˬqe  zyk@(Myd.ǝǪ NjS:fvt\hKNK:ct9&`T;c,t6f(-^nkq$r{ '_phx + =UOc/DǏ ( gTN`Ǫo:8yݗ5^ \]_F\iQ/4bev o<ώC>5 ues(L(*9id*B&j =za6N9qu[VU (-TAGP$glҦٻ {xGl`t93758rҸEAC.#vƖᷮ^儩 5C 520,'Q3$&$Bʼn͆C*ȩԟ͌4@!9L)&Ψ4*qں@GbXWO:@_n@W0!): &ď X`Rg"!X1}m$P_`1 I7AG ziMɴ(.+o.)n-ZӊGpep?%RW!-$u#ѥ/(GFIW@q;j~Ħ 6K.ޮj=pF>EL(Wwma%XqB)yʰa姄ez^aCI>5fugͲ5MEzBy@P -|1D Vg.*ƟIp&sMH ===3u;CtcilxvTr޻_z_5mRJGlq}Dw ?%>Ng(A3OF;XD&r3:'N#e0M'w^h^5?u$]rƒE/@$U )Dl NwSO> ~hkuܐ-}"29kIIRt"kKVu<쒎gXN)2VeMڒ8th} ]dRW $*^~7g0)d!H͠4(qMd+ ]M帶v[(~u[vdLGbM"=ӑCpIJw|*$h1:i 5bIĒ~i A67ljתOFw>5C^NѼ&ecr‘'1R,;Hg\N^;~^/|hBݷO莛C}\c7EiXcSIgѮ[6*c Τ4CI7Eoa?g'#:ɹZ\vtj(^zCBt1b 2vgP$3o.@ k@*V9fW$-'c~Їق\&"|XUWR{`hԺm3<' OI)Wğ]Znj4 z{)54D07R:O4JYʟ-ۂP,\H=ncVs|ĹHQP4TqKd7e~ʯ5{*x 8,AOCdv/4Ys_tnC!gςinuH.h3Yg4ӤSNß*wť=t\mD IC1T=>9bcۥ/ J/y^NPk<ɰBQ6,DTAԦUm"n2ipzCIwF68=)l451wFinE}罊:?Cq>(ɴͶP:?1L%(glN7 YD9NfOIv HB~Se/88c+䑂᧍ͦ\U8<|;蔤tpQAcQ4Jnh{ rpXj->"C"yIdAf1Kxq;x|$r34 MM; .kܔ:]]Ǫb=}~ŗޢlƻ JmȡH'?kTlx՛:Y^i]3N'S\9ڢ:QAviv5|o!Uus^-D$40c![T 9^z("rzdBLjI5 8<IcGx) ʩWe[47(>T˪>qTi08[de ^K#y# ?շ `ig$2h:SsEx>jmʣMjb ;b| wA&h["XO|zҫ[O? n9H|`j @x0tKS@̀ˁ=K)>E<#uHuTQRK~Ur ݐ@4U5zꚢ)B.d{ g4N&V9۱N9 OHgTNPE]Ab`7>L@R46sޯF1@yn8=gKF-?{OfԾ(MthYtK% tiM5GhVTbYUhiv; ~Ĕu)Cl[cY~R^$NEQP3J'H(E%Ym&]$&Vxf~Փ>r\M@HC%>%G(:m-?l 92c!:e4y_' 5\㦝$,SIx8pRb҂)#^0 rDGuV97o#9))6tBwlB}C21DjK̾ Qf ^- zoEOod уBFG&@gxNxTv[]ԐO Mxs≮Zn5,%\ D7 D6v--A=qD󘩗lBK):4Bqt.${<}xAE:IPΑ/yw˻3(yzleFICy_t26% e̞!ȩGvq"肜9ipB w EH<PP۫x4 <0mF2yI`INgJ85_x)H:iZ+ZhEH[ь2S"tTWþekK%:)3IIJJhRD n9Fpd:)'7Iu@m,ן__j2kE.ڋ\:㕉|Y5t_^4&$l; +C!o #a9iXznʿ6l*yj恷Q#d :Q#]©sg>[ݹ1;~sX^32'L\"v)w;zx,~Ѡ/qU>`O]>;H:,vJ&YuoI#yީ%r3@' PT߿3a~yYB@*mӫtSmj:zjߝ/~4B>j*8^:Kqp";#t!Tb  V,> lM@{K# ޜqGxR;044ɵ;b){J- ywJxhwđ tF) hԊ~~WNӱrDѺm0 ޣ-|ĈlvvOQ7U}Kc9CsĝQ0ȿ~l6 ܠ+S1*U'; M܈Nhd-SѨ3Xf22a8lC/O T{ uFщT!TK52UҡA@-iK R}AXY#zߺp=Lt5ǥDp-)M;#uHQ w\QT1Ně}tʰQ:RΩ7tڷXC7\M`gN/ n:ǾݦQGU֛J{\?R#+AWw¹hRBr25K2B威PUHAH4RiON>41h;xm@X}z:{ul{xZGc,qI<#-}6F(풂h1>l^p(_V\Ȃesde:6ƶwٜC=HCm3.'K$A2I 4]jͶ+/cm_u(C'JvCX!~ 2?O+=c$Roe<<4qU Ȯ7[;3{{rՠuR֧n4IO:bZ)I^,P?P[ާ&$r38 NW$p"Lz ?iJZ'ÿ_l GNxi4srW)M'"^wjt6ژA3H' R"؍$sx))4( zKpyjsO2N^T-Nx)PlL %hD ie7Yg\NB7!Ff'UM? GMonNI"8'Xl>6 @v:NSZ Wx&rdb/)"z)-BffOmA!u%(r}B"i (cMzw0T;4?Qw?ʝ7)<<u@5h~UBu|nywZ{oůOϐ/G];g:Έz]ëD ٫iFsizhc:iڟ/ 㤧ӣ7`aZ3Pś>XGlf -t;:L@4^JQnMDi=?۽I;Dy0eq<ށ{~Dv!*Qz]6y{!SdWߟxqROXX)ేOu95nLLJK2:{Gn7#gy A6ƦFlJ %.[촖.@g<gWʗ/HЭ8۝r,jL1TH5}G"J0gtN Jxݕtwb8Q5#bݬʡвtRfwA [cb&,&&GhuHQМ44-CcúYsFze ܗdj͝ƶ:$=:E-Uj5yuRާ*y??M KP3,' KG:`Ƽ_nGaNWuIp3*'JZ 0-DhF[nc&8Kwk{sMDt0Uvp` ~U{Ve.2x-20 PCg GSڜGsL Msyp.2QG1>Ww'SkGw uH3\Vud즍EPžH\i Z{%]v3rrm׌(˞Qg)[pWԕSFAd\9khv:sFEyN/Hֵa-{.f-sk-neYT;`#2ZZQi6T _%dEg7߱§=/Y)IDΟ.ugnI™dY"NZ'1AG:xq$6F?=?$;ʒĕ=4` jg>$y"r S V@tu$|~w4|uݝbj B ҜCGKGj'#VFJq41TNv-"*1ŷrְ͑ɐޒ$7R͠ 'O涪s;;SuWߢT]"SVJĻvCYd?ؤ!] Hg R#ĤTT}BWӲ&o3ͽE*У؄n-ѳ:$EiTIz@1*A.Ȝ52aqdMֵޙu^uD&GCۢ؎0Ǒc7l=4-\\YAJGi9rָLK's A\lJ1XxUˌ1t)"YK;Jtj or1OPp59%I ֻ#a$ЙB,iy"uavkB0A{˞.;W _钼B{(.5Ba]dNZѿ?r@ ފgv'(*okV`lT\C9?{_>cX\9kh(z|WTltMd4Nܧ59h YA ڨ:UsWK.&*7A0ub(Or`( NVGLk Mp % eܓ`0j̉4?ݎH7pie}Rc)/P8!'HI^wgGsΔ6~Nt(\=>MOi3uG@N׉Ǟ6Gcs%wr~6WG@sд͜/5`\MP]ƨ34j[ܔ1Htv 'O'6sK 4:טdۮ/m&{YG;n}5䪥A(4 PP<*d<}X$bxSmғNg h#]9k|i/)3駠?og:,vSTnk̿9]dq-. Esb% }V\x7oc(4WZ$u0 ]`:k6ɹT4]~]TjLvV.OV4nEsR0|MZCnA'QQ\ׅZ>ȹ3^x |oNvd')L? Vm| *gJ\dP>i"7&QvYc%^#0Jg;bASG\w3QIcXjRٵ} Hg R!%p# 8ǩ|YܔϺi6^&?ڶQa$!QtrNK~~a ңрC_ŷ`r֘S@?ɿ/HJV! ȯϜ475x;H^|d !- kΥܷӫ{' )O;_wY#!BAA;/ >**jSJG\XFaܧNӳn_l}xnGtI` (g J9 V~.,LF慻q"zE:|ҬLkvgbGm~7֌<7wC@Gs˽:/_6tkI\~7Uc1S^ؗ7"2a86\)]W(|4)(A1.5.a;1xS=cZ|`? u' 7ǚ4aB\gF+izp.gK0=2S8%lFE l 53܉DpMM÷V ѡ)LTm9OKН,'~8tB.\i*n?ohVDv\4!DŽz^SW"Q'PDcuB$^drδ6g>G9)'0DDèŸrָTѠ;Yh7\vҺ Dus՝ [ՙia8}ZSyNSyYb] Lg S 9P3C=k\5uN^nc?ޕ*>}Hy!ԏ \{V˽X܊wS1DL$o]0Sc4Nk= sW%0>0Ê5G!j #O1-eP~V4z7$Zd-'54 w dKt.5@aA䥊PO*~Խ/5\oQζxytt/mJ#I={a#άA3?ݷ#E%%0p*؜Tޕz47uqs&щGۻB2] {hUPf zIt8u7C}'gRlyϋ J3u v.FEUR0_y9z13ycP@&ز>Y:xk<Ťl$ 9rEyUF䙧GΜ-٩/(Ihc\9kdš;ĚnIŷM.MQ<翕߁,V0>'.9 <ӥwOED~]ômQYC4!Ds=O7A{)+`5S~wM`Ȫ5]&`]޲krE_^`|V">3Dr]`h.WU]4BV{XޅrvPf\㩵,rkNv͉KgͶQ qaUd6< [ dœwQ<[o;~W2tDhs"bsăJ9fb=9PbcpAQ " ?̀ÌGQ1ģr Dӧ<*giIK'1?Iv{Hb.c؜kʞ4$(FATZ\LhW є]7ݦjv# ]DF\]8QwQg/349x[wB_x1RD8r NL:ke`k>}9 tP0pvG.00G3漉CQ 23xz#[NΧ%$Xyc8 qY#8m4!`$BR\UIz SV31Jz .%Nd00&%(&B.)dzdsg$ЁZ[Ϗ;YSH6ImpN[IqR#޵3M9n)5&8fDlfI |]V\7U=*`3]0A.!cu0$xh#(rr6/YE/KcނY#?;%s oM|W> Jօq~s 6 YBT[Hj9A=衣ӉN>貋PP JR+ ҐV9BJz\ ]XB/vd ~qs#ԭ=w>ە? K\cnsJr'F%8F&lBLQmN B&E3U6GuqlvGպldh~(J8x+Dppv@4ċ yTgr[t 렌4 *(ov;#Y<^Qw. "Q.*<{ы!ӕSwщߗ ̱iA&!EALm#9x_\|<팢39tFmw>u>R$s70*NJta.5:a=Az\Rv'Ц;9}mrHk'SgX"gVmoe#cHr TrRlG>S<ð@Qkodf͐$KtSRʐA(/5C4i6DŽٝY^R1 pa ;! >sN{)cppT.6+X IJWLꐘ mޤW:G̥W\̏Nnr0[8k0cTAI#UM]C' \xo}ߦIns %I#YCreə܎Sr9QI8 gˍ>F%l!Y2EW(p-x0R|(?1Sչf:n-Ò2Q.|\!\[u6YcmDc\9k`"(8>G:;ȬqlJ[?{Wrl"ނaIQuB DB$nJޕU /F&829Jk۟%u|jY )A\Ůl(:yz\:SYx9-#"4qc9KFPTԑJy XϒL^7]TE㤠ݝȖs:ܤ'Oq!6;r+8 NzBX^ m2oMLˌtV}}J26(j7& +9Fy ZAl6(~h:SrW!hbCmn(<dQg^í@L.Kpr,ԓGkjnI*G#M Wd. ita?ĪiWSfG1-O}o~/!;sP %\&0]S#cEcSy%T]]Sg*]j^m eN:[;gꇰ,M3ۈ,qFe>,ξ3\P8,Gbrј4IQ 7w9Cxߤ|TM\PU%PDj ]\H-PI.r'K 9Wn]>NRd \hdZDƐDqGjGz[l:rjZZ4^䥐ILܾt)JQ1qq4~ԗ=Mx.:A;v'G.$.L)Sԡ8n((LٵPPJ^:&=bRXmnx>: F=4lW`?hkK?UUOu^=iQ+, ˀTM(C،6}oz>Ԉ<(4.Dޕ pdx`5*jǩ@c̡?eA1t8X-pm=vw?8a"~wS}PQjTe `i(*(6GѷfW.pjɷǺ'BTqF(ƿS=' A 0{kДzGL*jpĠFrѠJ+VT=׾-L#dwSO1ʔuzʤ&]h-*S='ةL ECT!D.ٽ固vAZ(F>>*XU:09]ӭNFZI, )M. @Wx. r>6h,7@ȅqo?-زUiؠ&"I$ LyeҦ(] )П)66Dt(Ql W$Oxrp}*nuj1$]%C"nZlN>?%GMNfoxa+4 Mlsn gT쌪' ,k!Kܩ N&[| 9Adb9&b_-wn{`Y^g>6KLB_q9<+#lՐw6/&oyV؄^8ƿw.A' 18]hzD¯joUȖWK7 w*CEE@qrqy,{<`&р頼$E3>oA9;uQ7NԄGw,a4MR: Z wC=9$gc]dzX -||!p~m)(Mݎ<@U0DC*> -> K#LFޞbi_?gER *j{6H[i1hML_2[STHfU'sj},0U W`.ph_ymX \2^kM7^ϯb+ 4-CIHLu .*dH- lQKg+T߶OIRp,"t}PQ;@} MnT~ٴCθPVIc׮ʓyߣ%8g^aLq!FFťf쀛)[w`CTXtJ.A.ެIVЪHNgc)4b]h¶Ham0Uu~wI:ZzEC¤{P&]LǠ' <^ +w9_3]4D-Bzv?M_yC.5ZMiVd Q2V4&^%;`E];dQ6Fr+.K\u,Uy1NEdwݖonvh dx"3)*p"YOL) ȹ<޵)$L7:ĨX sEщ"pqᖼ]k"&t%4} vL1?ܓH H" ҢvD@97:*>XdϞn)>Ѯ]4@q_߈]|6}ڢط#Np򚧷&DžO"=yA'==OEf?{=>ANt8Wt.wEMS3^ɧҒ]O}I:iq . 6ɞ@iN,T"ˆrc%a+0 LXŔ)ļِHYV5$<2;6i+}__-q򩍰"Uy6_n&ci t)xڄNZ+Ѯ ]4H% ͯC{;pQ:f1ۿ*ZnH!gNE):=zJ>r+0 LI GnF !sEIyΌ'"lh o{|IJn7T!sLД亝% 8Wx.੽^_=c_H vEz7IQۣh.KeP,ćN#P!:qRhWvvSʓPՁX@qh!@M ߁ǘBȡD5Χęx 9$K8 #h #%k\zƢ<ݻFN`>۫tcc%), (,ءtE\zcmƍ6_ x"HkV췴J:rԹ+L$㥑z#Fr|+*JXIrhc"/ľ][η+>t.](c/IPLt+yiaՎQ&<V' K1\40a[$7R-QŒm%UV1A*~5=s%wtitޘlL'$cEE49ZÁo} r@n+/UU"ٺ#Qz"Om{V&4CQrv"5+/O$PAtHWx. b5x?|EϫY^[+3ƴ5.1qDZH  `Ty01OJT:ht1uK୤Sn@0rD{sR?}yv >׷Ta6 GUFhr@"3u5S7<+yBKa҈b9F'lntL7.6g$n ?s=C|:5$ ~^%|,@<$r?@e6PWx.RD?ŏuWv<"爵Fmx%\|*XYEr ͊tJ~R=g'bgG^RlĺBtEXr&O:er5I;<((= L69ϓ>(Rh,Ǻ"tuPV貹iktf?ݒ Qo<z 4>Tiѽ)T,Xs]9RkK\ޮaCx+, KX iHx_msƴRvB.wuFwwmE^ge{bCDK /!H3'i.ypvZѮ]4Fa/ w h.׻j67R6>A7UM7| ^9;X܅O Y-gw g(D).6Bt!;GuP_7׺LؽN\]t8(E- ?ŊOt OfY.(*#QXt)R[h߃.g:Fmn&9b*aщ"䖝hIPV{/Թy칦O؉|bcEEKuEQ_mn }^8:(]KgLl^t  s%pꇒTЩlq#c_q=* ES!0 ."|D&_zב(:A&l'YԣM$사>8ZN Q.#^ƶqp TL۔N]K꺩Qﻟ0v"H[-.4k!"x`$Zh,bH±1x~'y*ҮBlz9C. hkb{>Ggn!ƪMXuCOW,>ļjoMN5@V_um9^]uDxdD.Sѻ65K#U0F(ƧC|/CXS*P¨ߚKvx?~VcT>V/ mcԶ01 дg09Gumn"bxĻt0mi GPM"o6/F3ci^s iT2f1Ҡ_]g}dW\.!2xI~th QX*)9.4MNxC| #M1e&@ʎg]›rs򰛈SY#h!qLt]@,r֨+.}~^UY3 V -oN\:zdq)C Imڦ\z$M9*>w2"(%0Ei*Z=txXu)vY1^ҞI)M,&tP?iSH,Ÿs 2 8oE[u!dgM$]{_!lj'JT`: LRzCA'1Ƚ]i(Fx:A%9gg2Ƒ;˛Ŷ{/99ԚZOGY4t;LҼf)&F1.5. R(5͋8c$:̭`552$+v7)]hl'Cdđcԏ% ua.58-ӫ'g,Ӫ swbGy*=2=%2(J)3va &ϕ毭 Dp@DEhQC|_Ww8Ҏ϶K^~+81B+ܗ; )x!߱ ¥j|XWzP[.vcYH!hַ@k^ZCc_fm NJ8I^P1dH=s5@CO,'6!iJ((&pAtַĦ-`ءX@3P3uJJ&9Ms2x#<Px gmLu2- EPfH}C hR{p̕.$ĩỵY0wt-V:t[9@ <ɽ`Gx^9@_fz<1ցLHN؞0{'w4Yɡ xLWmdfpir!k˝:#9C~- ) =Ʊ 01K-5$\Kz}WQx8+p+os>UR5鎌+NvZT<Su7 8wF taۂYxbÕY[KliM8|7},oDPw~U2\7=ҧՂ*>X4\dTQ,`[тv ĮIJO?5LׯԪi6t EP& >ߓhOlQh,`t2+`2^UZuS)1=K1`_E Y4t͹ jz+IhDy ^0^;.ƧC|:-TlǾ:&+*ܪ`weܗi7eŶ$8]L"P)5|'0cOWWNY)-dcb] 2gLbEiDesާXasoy aS '#XzD~$"CćÜ'm¡XMz栫ĺ h@ n3l=7v]4ŸZ[@R" 2+tBHnh357d&)XIaT<8 TA;?'W0FejL0uS:"  ri?t=%ȠCΑ&H=t|KN u LP|(" {(}_ry9#9!Z04 9^#a"2aXvA PpJ ]nA*ڰ)ݼfgzvP$ƒݼ%dп8D<-Z$C#:4ij(O^Oݻ ཫTrR4,`r֘r(.C@Ͷ]? A#Q.A:Ў6я09L)Q"]vB\9klZĦO~s٢I:lc=:oxXsPI3w`̀S?JSbɸsHׯƛ{s$Q 2gL3Js`;b:^m7Kt%"mjjox 8c#j% 8]"V~'9PԬ+TkBK @|Vϳgo~*;ٵ0*8vEʽkc)<؊G'qcPFH$<qX vA* 3i-ɔP0farPgygmIrӻS.:5y?i`zk@'pBx %'mbuxr* VͺtASvDeRgԉv2c>7}XY!aʔ/}-Ͷ3ᄱp޳,71OU^ƈCRkߔ1M5+A8AN7}:!ƺP@IF0蜵uӽ.jD[쏤j D-#nZhNX|K[<0z8aHa<5aJ$HXZ> SM%i.G6]99IpJJٍ:1w]n˒xW";)MH!A==$r wFHyhz Qg1i$֜FB<ѯuDxj?a}| .gKRX9+}5|S8l&Iĭ̃X.g'LjE 7pfB/<ĺd@b0}^wY&c#w]|K/YP%o.qnYzI_Iã+Ҥ3 4]wub6!\ssd~c׏MRm|/{(xw54uOӭTP Bx#H\Ҫm]ArE:OL:Se/^ zV)u:4m MMˢI68vQB=<|ݖ *1{:ٕ>[$ӥ#QÑw%qIT}q(j_"%JE!*$D٭п\Pn$"+bR.&5.JP3*'JXwL>//Ytt8¥6*W=%f$TȎ.ңdIW\cZ&jݘh4Va"Y0(Epz̘wp@\8 ;qYbSb9 Q>6Ө>"vה8i4Jtg+T>O h-xtiE;;X ghZkkЉ﷩|V;E{rfDN%ai$_w(v-(4[GtS=I"U J "'ICvzx38`A@oFQ [ >G=ۺyȽn n7CKh±!gQ3e5OT1ZSjKL{YpTxsT\~hee B<#uH8ɤ#bS /^l֎4Li"V$ Mk*mj(sm=Vsϸ`'A&&8&,3&*clEo5iaXr'Uksf:^@ktǝ(WBioMy}swL舙1d(JIciyڞ&ⲻN;TɗX5mp3$' IXT`vx0k\s~^VöQ:9 @|+C2%=LBPidH3#.VC I Wf֛QLj\=kdw$`v(NJwLlS*ًiW ml3"'HXIsڒpeE(ʉse(<~{UŻj|.O鉁Qf|A?a~5$&8(~AK/>.$ݾ5I:`~$N7?^чM?K+%KBg_\bDgw_c;t m˭r W8Cu]eN9I쟺h:%b'Vmwѡ}7&iy|Ծ mK:tŐs6kQ9?jܶ7بi60a 'ܽϽnDh~ܡqMwc4l9cs؄UPFIR|N S`us38Xߐ2WѷpQPkFv<=a`XFfG59FAH4R"5[VAHy""r5_/۫٫]&R%Q-j\,߮IUZ$u!PS8Y# r9%ޮ NX㜡9ihjfRZK _3v(mB3*߱9ʳ\vDW g6v08tAȜ42a_ KOǾGUwF d(T" ٜ&yIz'K7#hNaHp<Ձ ;$JP30' LK۝0`UAzqQoI_ */aJݡ/k _k$ /p2̑w\Bm32'LEg 14 m胐 dH؁}ӿE}|&]]jK,2c0yZSGs4:( y{K>. |ꤱkl.=S_ts!H$C_y4Ceg~m{p^p':r;Kz$՜DQPKxniAiII#m3.'Ky%0=s ?Kg4΋M[oeKI&^$Ĥ%6Rjl 桩! I2" 3PtL.->"'qp'ersU d𣒇{0ՃC{C(0E:#tx@r E 63$e|[7SJ۰107-A' ۭx-8&(3=lFR'Ը]|7E&(S6J O>3i}ЬOPq8h肸h=NuAGmdn;qyތicBKplY]Kju%uAR_]#c}sYA IkMiAjKGV362>N`B9ixjg2ʈ*wV=4_4)7 HC=:;Y֝\#t|I$@upU;p>:5Sg)8-$8FAT&+u?rZMT J%Qfz*.l*>l(ia hܤJ8l5rڸVBϙKܫTfINj ]1s7}cpC (ugTN I'R 0B">8[-^W[9?!:dHT7ѻ崬%{S&dD hjY} ,}ݠK rCKuJP30' L\w!WO|̍ ⴆfګjwj1iTjz( hI Crj?WE"qHFڌIvA ɿT+jŋLn|6wi&7%O&u6Aܐ{NSew%OgGAQlf5yX((x JéuA؝!Y,c#˛f{w 0H8Ĩ=7"L}-OKiAS *sFiaYC7k*;gΌ)P*0 t$TH"#s<|n Dkk s59#sTLo8p9%Gl.nUwks?@oa+R,V0{܎";dCXjdf NOr#vJ&p30' LoJШlWq0.9s P^~wAIm—7e?Q3zě'?klZi+3,Zbf$1L]3nf)8{J=X!&Qb9ih(SnI ke,!HqzŻih[~ԝ'ugs xv2)ėG`Z̨wmy'G%0$l|.7tTS-aYDhcP_ћ-{ ׌v9+nJbjGu[t0<HgtNO/<+Ǘ_$%8߾oIߨ??WORsSyiK˙qIj0>A 4H5*Z|]BmّsKE4g&Jg(dwH LP32'LY'q߼:Ͳ<)&ܝV%I+ 8s׵В)RK׌I֢zGIigz|MsPA9iPR(\SnTiidl@sF݀OR^F)ekE-_ud?)r38`QQ3.'Kf'כ-Yu)@mĻt]F6]LIAm =&B Ju~z(aypf'4A4@a=9Ël~*S#r ?un)>p`Iصk@㜽P7tjs k~G+G#fDNɝONiguM]u$>AΦSMS~1Yu9 LK8ŌUbp-pc |8l}Ξ;X>ևu9Fg@t }woosS&t@%XxrqGO ɯJ%u8ݫ9b1:i6(i< fdoAr}[ҢÍjM.TprBChJ&a9CsЄ:8NjZ7mi2qj'Y]]|sT rƈٰU)0-e}.]cJP$U诽l,)xֿl.Grо9CsЄP b2WaB/CQ@yX˳?!Hr.U'Iq}.=NS@pD xFQ9i9{s'-s}C:R/guqt7uhI{>v/QmPcp>FͱdW/K6F(,r1r[>_.A_@ⷺ_)D Rrۦ78YaBG &1$}BUlIZA73GmW'(4@υ]U݂X0-B͉/D (/q86}Fjb{g|2p70geT+݅6bzҮB%Ffdڐ[P]}۬ 0lp ;`g91sod.ZhscHrTD#c.2&ũ9.F:sLϠs^ޮQ.' sb\%tmBa:z(:Fs͏BTl)2H@e j3˟՚kMwbdlΙ'My9HR:.6,gD - ;Nr |Ȝ)Άsu JAМ44@3Ios]rvV&RNǔES]?s+I4H5v!#9#K&ŧD ΀dW࡞\$(΀ThgCME>i:I'Nrs'.66>=pW m,zw d2B2D)U|gI2E۳y " ICDc f'?-]^'Fͪ^r"]N6D3 $g`jzF3B xH*]3N'SXEF}ػ溍W*.ܽ`IIE*A$$"7P}7R,\eɼ|Ƿp9-*xZ>uR>L/r{U>T!UrSe?ܫG ŧ=@8H3]1sΐOаѐ9m-+4Fa=$-X@#T˝W֊焊Thp;ϚMP $Im孥-`Ël4o-'#e1Mq`9ipŠH`q }Q>~\5ayEqv~h P)IED*=B+uiư"vNC*^#OrCO{G glN#3}ؼV*#6j~$-i܁ͷ]! W$OD :A:ix?|w.'` S;A{nFi$R1iNe ǜΑ=J{vPgN1^lthW0|]#8/T[6Lj_~ G٧)T%g.r{;l2 wy)JOP3@ #RN:nR3zd Vc (T6^t#')#^Qsdp* Τܶ+<ȣ9;R:.Q8 pa #+B W'hy!Tz%@⸾sƁkP2Io5 {,1_0q$_(9:4Fad|RDLKOgߠ~f2zo2t#ZMsg9 kQ9s-R6X 왵x $ ϫK\m6Ʊ3agDGapٙ~9 3`/+DB5)NuYg#FJǠT)Few7_]?]Ws9cB wR3eY?~[J(gdN-RFigmLU?+$<ā'h"/5O("lP]jICOfu?t?G/z LP30' L4F8P3iQ\nEj 67D@DZd)Ҽ}Ԑ)@VוIc#FC*)I| v9<PNV+{^dп?~K }Z[gL|J)Zug"` w]e_4[ݫ8LaМ44aOt @syP/`j70WBϋ^cľhLf1|XPIGﺊ0ܩ R1&=FC|%Hg|N RIrA O҇d ޤtHxpܝGYdJ.dm^'F=kp0`|؈7HA9j 94/xC:A2H5/oPPr椱;Pd -8` ̐:)qgAWOךV,ۀd5p8?ukEՋZ Pp3J'R\EUxO5|f{ń@6d堢UTOUCSv}' ؎y |xrt٫AgT(l;ߖ˼\(_U]5vP 1}hWd(ص& tGGc F`d3' FG .PX9j.(J̏u)ξ}ˆ{PQ~#WG,^W- M?ahuDyg S#--~)8!=,E7crҘ5ԉִz-¦)|Z09_U6f*.[LN=gO-?yb BXr椱 !h: 2N#迾-ņ\+v?snJNa8Fj2 $8t!$G/iĥ5DWgTNP3ޖeU`*5v\:/eJWᎁy^5͗+O` 3_S#d/K屗΍H ,Nf|VAIcBY }uٮF39q]~] 8\Hhkz˺J*}!4N=J%-<ݚ;okK>5{86>M9'0<8p5dK#lUCTt` .PG;\9;#}G8AW Oy=KeMBfIp3*'J>%3~nw3+j{[y Y0(0ngڻGuFh:isxӻG<`Y%/9ix*gLsIK% O΁TO is $*ꂂ LG݇$VCGS# IP3*'JXIޮV(yє;\NGLuyu{IР+ݚĝ7E&ax)1r7, dH"s祕'R9#sȄ[}*_n %xvnt,`C'H'ȴ8$ckhn5#xp.頢)W.b I",t$!km:pmO8^.j@|qgV71aZ~ңa7kpԍ=HQ7齾(x7rҠݏ1R[vS )䙎Lo8oÄ́懺e,xSsHi2u\t<{:蘢9/ya `UaCw+|[{oN/zܴ@SLA9iPFeJ8Ra]?xUVu@HXoSEow!,eaۇ9)kH6_Ehyܠ.~XE!.*QМ24%,,Җ<B_{̻L;rڈ7S 5xAq qN>eh"= do|^;B ICBI@ gcR^Y$ڱ.GYL{Y,^bFj ;w'}:{A؜46a%B]X,Ξ R#dbTiܩʛE#G!^7oئ˂sgGGW/4PefPNA_<Zwu#I'l5_m*{mY TK*9*Vy15SS4)gzk")2>O M8g؏wFꤑ "=ӆh#3yd_ne:NH=;de&p?G`'k IL5Q\BVYguzA:$g`N#rFz^vl0թ#aoޗ4SaKs5WȽTp.HQ$!"A͐4$aCR&L!Ҁ;`,PD#n?>oW H6,( E{FZVU~p?Dؓ@]؁1ٲtj k<)w)wl1< 6DQ:}1r`tզz [ovEsr NĐWD2; T> O<~qF椑 k! Y\VDڸe2\* {l~=Z[>ynYpb#/ %)&/Hkԡ3 It!40-m@ k\~f[>&)WN߸\`%U:go6arBcċ6njyPhC9i|Ž(%R+g ?&e~]S꼬6ڨ_˯MGq/{3^uOДj'ts,9 (cI##22i|{>ʛ-n.QpTiofzԈ%¬F. `pIjMt]]N9Zf]ܻq`F洑tV5^V%SV\&LIHʛIHҦƠv4tQ3Q1ƑIq s {QgAY8fx.ReG8sbSr&FZ9ٚtW)Gu`4<<";q3.K].C ,75 ̎\JafE}IK|gC^YG)Iê:d[r}:!Q3@' PS(-ڗPP.ަ@;%Κ궺롽>:O5fGpA[s茖+M1?k"Ȏ ?Kt! pA ۠ )OCmGFlx MwsA_8@28YҼ*!(=c]q+KӉ&8F}{XcJbgqjW/"-S%8am$5<Ѡz@%^G#$JP32'LX ~(-,oPyNob|v9ժ%'z<:wNfI9Jgv9Wȕ^>9*쉂5= ёQJoJ+rmyؙPw7mUu%`նGqĢ¡|9ƦClh .-nׁGKyߑHL!xmfgbd%m+,MN\OuB3gֈeSOH^?nbLXgPN/ ;&qM%?615גyG"x7XLEOqϰ=4tXljkyh8$t5/[BwXȋJщ.)nbzejJg Oa`[DjI2jAʦz\py8/TzI=c1u*QRys7?ј›ʹqǔ9A͐4$aUj(jŷ՗/+"g:몮V-N!+lYoPDߦ 6?]nFadQoDZA2l䑖hmRێOׅ}!fAGSJuUUãՙf߃g_mNfNC(ELP :gN NLjRrڋ^?ʟOͦEGeĽ$=_7#-{;ȅF|Mx~ԷS%8&C (?{LL~\3Bוu;qSDmYœ3fH?H&c0}%nI@QXw=:KHn ~SA/X5V=bXSj ý~=ru#azѮA"Ŷ$:aCZ{dib"'S;E"莰>Ff@d|FE3VVB+ŧ:E9JeAN}Qʏ쑤S(`>n&$0$pC+hzHtwW ԝ'%s% 嗼ǰW L@$:IsϘ:vĖ{*ϒs$U|ri.Y`CqUܗxRL_}|+iWwiSI,7|^"ۣ:8Bsn`Eh4'G4Kjۺi'ẹÄtR؈I|]'2+$kj޴!SνbxC4GsTn>`n˛^{gՔenzK^Tu8%Q:7h{s,wI ўCdDsAѩZw|/'|T|Mxծ~-"C3N=Hxeo9ssNMKRȍU(d)%._6щ|*dڤ MNj@='{G,<9!h?(6.58-S4nU~S50FވejQM̏_ }wPA I:6{Ů+^4\q*蹂:,uE:F%0FT)UrEnዾ~ ~ImՌB5?{PZp# e|t3(:aԯ24r.5MǨDYc6CFm{C /tFS>Jek#|p/ʳݣceDuN%KGPx $g VGz0IrH.jT؈0t.TSV1Re%&2$8FfLȔ+\[lgx/=/ӏоK¢(Jq]6xrTWLo)kYp7harAv:PEc\g蔸AYC iS hүo\ GL5P+I13I^W}Xxz΢4ѡ>GsDYC 4O39Wp% #8=jkd+I-:>R#OֆXgrSф (8)B;yA.ڧj=گOmܝ nsOH?vK,Sgc|B峴$8%CL "C{} #@3|om!:C3(#:\aA$G=hP&^0NM.5@RRG4.}G}CJz1.|qWÛA̫lKNQ4 8S4zgď<8,Q.50E7k/uE_y$NDfQj IFJت΢'%{GqI1 q欁јm<# hA\Cs{syT]\X#*Hy9m+XZ|gnbq?CPx" ՛X6e̮^5Ӿ]gMy[gj]!A= /[#htj{: 8;DP…`߃-:>Ɔ%uLຼ dJ|c*Ys%-Bcp*T}+X; =hNRSHޕzsYCQ!}&#eDzm3sg*qY7mܢLzUΑ~g{Kv>i!܂Y#eBLϯT.XU$@nyKxŏ[N8&rYg~D7)-Ҙ~oS'PG;I<{2Q>5Dt0GY ϛKoc.6cBu_@f ӢeFj Jpo@OO ~0N!' !B^)A k~t0SMIҢE 8?$^?  IZPPr3.q-HI⌼0s2b*9>.5B&!-j6ifDB _'8nlG9v_0j}!ͬyj1srKң3 )t]ù'HY c~⨺"y#Î ڦ:`-?,<,'P,='' d?drrd]9kl! 5?!i^Wж;%zkV-F'zb  nÁ\xz\TmN !-h3?ZEjy>_(4T xkYkg=KҰ_NN6:M'@^&SԘY#S23\'ܤVVe3%pd Ė/wZCo'5H'&fJ` 0g Lt"ǔhl A,ax}M<=-a#NcCϸhG#N;LVOBE 蚃YS#0S,濥qweVsx'ūqF0_nT A]h/T+G O6sJGYx!^= ~uMwWv\']ԏ_~v_Ý+0~5o 5fMJцK)sWf1>eXn=FVnyr4)Mŋ[; C\*7frss5rO2ꤧ۳~̦xDY #+v'etHTp~һ=:a;0+~փU.ם MYPH5םƣC<Fya$#@@TJ}n=>(s:iarLC\P9kTc,r*a碮n Lwwԩ]ź򵖑 O#CVqjgb07[ eU''H='v^:gF`@|`[w_ӗ^L=WUs:= :odhYN0X;FۣˑO”LϡA.М542N;jPߨ#:rsRIrQW?Ceq0glHКa>ÆAj3jq'\&ǸsTLW|+5 sO8["x~.S_86mtc1>jP%Mlj%ߘ^(iun< ibTb\p9k\;d|]땈+"ѦLJ3|LI3)`WȾP)^ +$3fvQCd 4 4MthU͗$B.;g*=7^JmMe >ՄMJ\ީݻbã]? xzʉK嚚C :gN L(5$GA{.dHк1ez.':pmC*))L RH']=Ӱ{ҋJ7M0lH a`-;|ܶi^`xW?APu_ӯ7f,3CaՇsp(HQaj],3\f!Ǫ?Ip .gK$`,V%H|xŭ-oh'.9YEvc |!Iw]N^HWyl?:2R}8[9kDBN =en>ʃ^;+nouz݋}P:@T&PJd+M\T)V~{sk'RA r欁PTT[ 8Y.d:!8RFѨ^ܩL:h|V Su}lwA la^K_Mo˟>NXTwT8 !k74v ߠK3'(ACYS"{DV9~8!KP Yȝ!F,;@x>HV绲 +~Ua_FA%JI[8ǼGJ NPD'MQh"]9kt/dE@]z/!\_QIг6.C`W߫Jz,'N5ȧUE+pggK%Y9AQ r次ypV}l'8tLӧ> ǘ\G݃PO4R*;v"] :kWdJ0y~PuŝN*.ƎS6 ,O`MLM{4P"ˮ 4Ɍ+{m4n]ꤳpzrgP`\9klFĦsYSw[e|8LOi0lH.ݳQSzA)b %4D񻮦/;BX ",4Bzƌ;`g΅SՏ6{@;6AXq0pDG}GIH/R 17R;muq_~@~}2+qQ]UhSZa?DMk8|?1}f[Ș'hQ s欱Ppʙ)6d2?U]uY9Wؽ{$( ߮ԁ{ =y#]>t&NnAP,ʄ5^@_NpIvIWV\Y&tnf|2FnQβˌC%W)rwcl-5 r <ۧDwKI|o?) }rZbMQ)({X-̓8Y#8 Rcc=/oȡ\oQ]rVыZ,s!orq ѷ3\>,BlȚecfiȐ9,Ic^nM3>'OTJsw;[෽"hNqR*7u]+8ag;_4↚4Rg9y:{8ܣ Kvȶ1.'2 %!6OX{^k.Ίsy^?_x-şE 쥷dj z!?6vC QL*؛v:(gNFʀqY`]mmbBvjBn_o:Rl5h I7[s榭ۘVsX4+C>mpgNsm'׀rVVJq[mA4c>S\>uqCd%g1{y=#+yrG&α!Cաk"=䏚މ(0(U4psPmtyXtF_ukǂqrO^l>->EPoXXFI%gض80Å)'DeYW7{a qa $*$߻꺄y+QtwG-bO\^tP ./ b(0@3çki#m36'MXeI 㜌[ϋ5w^Ûu OE{ٮc@$.9Լ}-e!UjrA Y8T:r)l0WBIM36'M%7>ٔKEy]~Fq0̆FT\V08Xt^˧uQ`,Lͼ U "һGPRbjbm38' N\$2@w#b/fϰt Y s):TN:S '!E԰X&k clM{؋q[}2Y !;,4^/:ڶ*]IȣNta-?=D$N8y9"9*F9sčQ`LPNVTqUeg~A16kKjXl[גO=<:qSN;0D=R?Ǔ'&PgN0ʏո|^W|ڝf:Jo{sùȿOk ,v@r.%&NGř/.44B="4h ,v%"S|lwS~q?&-<{o~p<`,=B{~l9șU>0OKތIcE R2<"|g7@+o':jkuK?nX  U1ұ1%0%l*we 3(%߭.u~_2׻!R2PdYkN5Z6#BS>{q<nBT#A9iPŠ(Znf,g9}Y&GG)wc]ݔSd7`9#45ʜ>`tO 5eiL2@D˵Y{e]$.SxڽfԲ{-XyXC69{+{VĦlsm]S8b8i<"(zS4 r`ƃm H!Im"T37i_x&&Hn-/q^NK͘4=^u\߻SaL`3:'NŐK:-mtwӊ/]h:PgjӥC~LqB %r6GVIfߝi19Ah Qv9 %|S"7f,4$VC#e9@~n_ T ȾgޓaOP3F'QXŘk@ꅟwؖV[|]o#+l%tTDȝ ͍=A+Ύ#ݤJ-&4A4:q .jmqQ|.N4gEQ*:dF[COcX>9O=S}Yy9H4ͨ4*qr1p5 6_HX>qߠ-4Cu]x壩LQ{˰'p=?@zAp7CrҐO'C"\jgЭg|]/KԲA$Q}2 Ԣ@/ v\5fS8>dU`JZn-j0il#2LG5.'V4?B8Tof(W$ p55%1l2SMFtӏP.p6:cst / mDǵE)[ a^U,/L\ L&񼨔x;ŔCfd/07rҨ}PJE9^uѺ{}.(93GFva 3a_n&WY$@Ore!RCǾg\Nqohibi^2~ iiQIіyf_WAIjzVXK0H3: NtgXNJ`j KB;h%3SFr3tD!+IgԞ;G]2Gl:V5eb&ȴ%-&Hg|NJ;sMYPo^4`N\mY/n^ʺ.kL(3H e$%_]b75}tvtm t +  jIroժ9&`l'~ P6/UG"b}mYNQzEo87O 4ǝ.h٩E;#t ^0dÊ _+>UTEEz@l=;!`Ҹ'ޡ :Ӿ6%M~CZ]qxՇq#TW8<;tИqpSvVALjbeP7 s]*޶,l%Op橽HiSx6qhLF|W>4{Qd~<nH.'=,'-mi;Ʀ\\j`35#8S0caB f"(D@\/VbNtl@.ju 49ABK#Q$EvM@Wg-zPv7<-RWg'6CI#T#BcyÒ1Y $ΖiD}/Vw%)PT&vnEcᇕ# ٸ:W1:Μ9mKR8crҘ}ƨh@AkqW ׷ղPNUyQfS{7P 3Ұ-jvf=$>Hy{Ec'_EX2ҾWQ3pDIGʚ$k+5ܢ#EͮL~ŗ w9O5&&8SFhQcșGEc&FW-n+Ζ>,UQGLp:+R RxFkPݮElrdb6:2qqM.~yK_EBK [!O ފuv lQKޅ\z̠jN:s*8U,DQwBt/a(\t9"+H{ݟѷ o5 rF椑 ;$7bm ,pt% 2$}c#_8xWM_cA3P:tΨy1%hFc,$qOcx wcT)')e9@9|Zm޲dK0-nSNrG/ɲzr|3(' JT>CzHz׻-ߕն7ֹV7zh,mcy]rƒfQǒD4QP +<;m ]m]2PFh{V8’l2G']Q=QR<_>_kML ^cE7]306}R'UN! tkRw| _KQ.М54a'$NiHl7[J&'LdW*~շjLȵ$DթR 9ӥyҍU|uNΉz u-3.lAIk p_NN㧟LQ;q ? Ϊu gsnL@%l]HѠMu:=)%v<<_y9]1(b\9k`ºGigdPiDA[KJK tX&GnLZHjqsUϜ;=ޕbc9F),~k r[$hОr@`X‡'ie֗zLF;3d!T|g>4'ƴ=`־Y#J%모qu u?ݡ?w Ld1w1 "V}o2 i^}u3upyVFDOd@\:4C6Iŋb\p9k\¢Ȁ Eцg[.c')]Th= @i7,>?ERVtB91YfLnMj2ķox5)ن]/T5_ i%;9Mj:08gN578u[q1qa{!bˁA~ÉM}FhR č1Ft>kM՞'Ƙ!hZ\ti٩,']ȮhPXP2 JebA&oE*qaPTyflžqtcuJICL.@rlXQdz3[bP k!aha6 %W\AA ܀whx䮝BJI|TDPQ3g(Ϣ 2r Hg R ʅ`c>[EsW4,:#Z Ix闡mt _N=`Iآ5Iݺ.8*C : ON')E(F',b+v~@rbL]-x x0Kw"U8nX'J$k(%,4/i4x1:D: PeRX#-r[ ޸$v˃یɩ;j!b?꜡XYBy.evn=m_SUuK:by.`FGpt |bcYB}pRg,DDsvUc/EU>Y3a71=%$A=JƧ5XMʣcuCSCIl4s Z|* o~*w۱c3C uԻ8usIpJ4VmIVs˩E:dLQ1rA欑 K!ǥX=41^cdJ Gg'j`G4@`)@)uEӤ70iIcOl0ձd`ioc)sƨSD5 Q*9e}]ňѳ-Wg3zXH<GOT E3%HQkyg2Tu.5BaAv.QWe;holr?lcw(1R{xcϽPmO4ޱvvSGΞF `r+9@bP:޲9BU__HZpuY`pR %g(I❹Lȕ$؃޷-p5p<%i *h5#Z6gpO"Ak++! 8i7Bc)F _++*&L5D"kH1o1 [x7DUfǑ&oˋbHY؛P /g>j_ܸyHL ()=(6şhTv[CoMOF'<wNI 8Mlq-Hӿ` uq.5>p%^kI3HaY#ϻj}՞bJ /旔3S'n]ghrBHNhw(-5 =2H Șhh.#G5w㺰g}񰁞2>/4rW!mgǫt6ZŴ45k\9kh (v=&vJ!4庾ߍ~4gத4fgww̺_(/ѥVh-A/!Opխ3 Ngfg$σXv! PހY~ nc=k=Vh*v[:b$mћFm Gzm. Q~ߑbYvBALQҮYзV⾮3ŮJI=KVg=^[ZZL-4I@NC~{4HݴuYCB!6)P>@sp͑⊝=s!ǘ|H Qx@I8;ɡ >17<ƨTD't X8ױBCa'"ʆz*ڼ(WVXeP (oIn2\( @S ] :k(X90-73i˶^ x<6OacnLPIˣk=4L0GZ}zA1 qazNnC8dJ".m;*)0]ONWFh4Um9Ox"$.L«R\v)GPu.5Fawm.H-[}|? ;/w;=|"=RfX^}Z+ik#]9k|ħqBYϸwMf4OՆ]`~=&ߓqN39T, PH儨9hw+7 ic9s5\k8cc|IyA o"^?zJff{Ҁ %?<8 ÓW&?h4.$l]0FWLV2ٯg>ėL!2=rڒeʖ‘)KՓah \9khJ.v&J Ȯ;vgoKyh ]>/yY%EoHC%͊^$BGO= :OYH樦Fn1RW\8"صߖoۺzy`QdMgGE]=- 2)QJ9N&V>@YT4XXm!+/CVkf+yWU5\Z2[;h}ZE\K!ňS-w?1 p1iؙk ,R4ИbRylrX`~ <+y{%Lہx`D!-[LJ%L3-cL02 {q ~Md*5O܈agMۀmػ޸W Eo~,-?vbHF|;Z-ZղFSbwdw\`@t's1 Zӱet,){I5އ[HQ)Yc4F=l#Yfl郾~*3e}\xUGp*D,$IN;F-գ/GjrcQ;%@x5ñ_9TwHFz_=lTTN|N:qBXmKsx_5 qfInrs9f$tE zꬱ+Lʝ=ԥ=k"rl eӞw $(0؀5(nۭ><8֍5~1Bivg OP H R/)WAHpYgDҞY]f$c(C% IW) 3VwJ'?P?)yŷ`r֘T(u0c4xXб ك5wI͏LKwzj؁*6qal9-сjlrŌ)1c{>a'LRD q欁L"ZK+?XtzWe4{ {dx}(W3ew7Qلëm*0cc)0߈ x4Nxf$;tqY4"@2 Q=QP:?.zg˵uvln j&Q5&z][ ׻ 2gOÁ.g"xj9fsN+?VO:iΌ>Pzu #֫V/Le/5L .shֹWp>@/1"@fLarX7*!|0(FXs1Ni=#:V78ƳcRz$xy\~sad:p$sAiGSLp v@w_Զw1H1IRh MїY%x״o 6:M1A_y=Щ Syz9,Q\9kx¦qvoKm;C؋N ~occO(;!LD[,z%pXΜ {}ڰLd8HX5 &)C4x+c Mt.5>=3(mS?!+unC9]nڇ:t&CBX {_A!fx[;ODY#3 2VKra]@瞂OMs9gL06Lo}-$Sc=t,NDP&g.F4G?g'(z #] >gOm2ܪ?SH<di bвzxr| c*ڔV;0},[С?pܺHu t sQgH t6hE4f{y~/U'Ww^Y),{e)2|BIRv_0;^NvE9#3²Iwm wnI_v@js=…fu!&+ir,8PnFdW&t햬)@dNYsn0; CM6'0͑L.8m;Acw$gw1Bv?#4 ޴R)?(zKy[]?ͱʶecoDYFVU[CZ+q9Ʃ#Ic\y-=bn"o}$x*2b+W}N\ b՝ϤDYvG_s䨂L٬0'6A2c4bək M !]G7]`O!ެ,"#)2Y4"LSn \]>LZɤf]׹[C1ީ˥.s4RCg-EGT[j>U: b(St wAAo5ooP=TZI ,VD1>C7ԍ.>n@XBSWq"Qb kZK$,Ƀ9rָ% zLDz-%sǯC ơWG 1^jZwOꝧSw {Vnd ZOt. 5H 4Wz"kێ\j Ki -Ee}n-P ߻(ɇ3hGSFD=~k%[Fdu(1.М54adJiX%mo6>l7 U|wZ|zخƨ!{Zat)=\wpCxc o2(Nr#B!jy LP@c-r{ UF!s)?^K;jjEᱚRL= ;`Þ$uR\ƛ TsK5ްN` :gNX9m\ A@'&6WW^&pyFO_ {qi,_kt;gOXWf|:/Qak!]hzź1D-~lӇO Բ2fȁl k*9Ex^kGffȝkG_G/HrQaA!T!&Iϟim.PdnE7H X(yXim:`#ޅ)(*슼HG>w(FÖΑ5r-}@}$ǯa% F=p$($lY,Xk?r)"M-L zb c _Z5טP+d $la~/hZQ.50a/sR6ygo}.VN(umFH;XM.\KxӉam$6'_%f1 _!~ݰA)i=:>)>Q"^:k:*8{ص /K XԲUh%Chn,B2Dl"V:',z] .gKX y8"VzYh׶j^GĹ!݋64}txMWoמ["2EtźY'cؤ%E&(',SʨЧ:!f4FHV r,wBѡ_uy Aar'80Q ~U8YCBޫep g~j^o+Iͅ)h.6 ^vQrn=nk\sa#OLG'0hB&tB6X@\ś /M=v= BJ#MC{vxg׳/Ñiш&pJ"LCP:g~f9S!y i4H༿(uJ`;)ʈNl ΘPВF96A.5>aa䃒)z ].tNg}sW]o |=3t b '&'+*?x?Da95ĸr֨P` ;TG %rExqvggC|Gy3zt`G`Xl?Q$=:9*5헩Hsm%r1&*\fԥ/NצϸAraS[Ixc/l` rLҟDp #P\\9kh’(i-fO Xs/Y8/S˟@IuVPJ1'IEZI".(쇂+!̇ۻ/-:flJxtEZaxz ߷lsNhmۑ#{&L\9khz2[NE95ATC'D~f%]Q٤3HS! sd޸Eo!Վy~v?x%Kv.5.a%5@8{7%U71H/hT6/ktm+.7ױ :axbYFM)']t zA (RDUj^ h]Ⱊj[m(yP0 "ɛ!#@ aG1D9Oלdvp92DYC Dsd 4F_Um.,L?M^U맃4 𶃨QdaĆhkC a~|R\Dt2>k0/MnP;J*mٍ]B ֥P $8mzm…jꀌcIp 0g LEErZc߹okvq<;^p< &(qh ;j49 cY#*=zmnngșI&#ΛuOumoLg;-\gOaTj~*q"08﴿h/ښqυ\t~<:c'+yJ)m!kٍY]h1 ;sivH(["DU U%察*rϊnx8G2XŎw<;q[4q1IŰG@sЄQ6{`0F[|i6O_TC5jR*R2+Eհ|ҋcT<$8&'-J J-|LIr?pJh<_5DCL'e_shXS6سo~n'o2]E@tհ7":<ͬ`plpkU62~ @pގYtO(qOTV:P0I0=#S䯱eOc] :k )Z;AGuoKdC%>,W ?B٦/pD6{FO٧W>}Pm"!'eRMh@l Vo}CD kqt1rHgrDCM7FRzzaĤzwF MUkrt" uHR.vFSԆE|rSSw֊ k|+rD{b@աYqs40,1@r֐QTHx^=4d]Z'^]r Gf d:~έBT9,#]:k(T¦#Sh#bY8y|z6ǁCc3m81v4D6~ip}Dx:vHkMybpT\9kl)~*=4]j;v~irk]+;%"BȈT|K4uj"Ӥ_Q?k|b  8mD懳I4F#i xև2ۅfYC6FKmUA~k]꓀\rLvT^VTƜ%3S\eF} h44]c^`:kF T`YVmLB&ܷS8SȔR V*/>&g91 x1j`.R == UygptS]DMWD\]ײ7D ^tB<[ 9kHȅZn7>gG/+-ޔ4`ڧܵ}=w0pl%׌iKLdķ8BMm Dg Q\y슞n˲BMdKTAǽz.OejP.f_!*Ee޹GПe"@9RJcI K@|:uEN9-^my)c*=ϛU5٧6b/.;P@z*/._tj'݂Y#"ez3cz3kdFC)WHϣTf(._peπ@SvQ si{P@7g-j''"A³/`9Ȣʾb [AL+ȅ;(0Ci5^wo6۪w'_mv*3ueHͺ >pZ;BIBM+6ҙq1%qYఖҩp!]5'bm>58 tH>NP1SQJ=HVOTxP+Pl u $.Lzx(UzU7rڲz#7`6~'.tw4M팎3Ǧ 8sv#넴oYC!4]zu#8jx u^:뛲z65#d7L,M!ZpJRT h0 La qa k#8ЅoCyZQ>=*J*copȂ<{j>eW]IKi.CdF$=$l*^v ]=h&NcrtIo1*T~Mw6!!OYR.=14J2K4 )b (g JXɐzfoW^.ߗ$W]|hؙe"Rӥ'T&Xo;%J NTx:YR~\_)Ih[@9gP: XAL֖$lCor=8@2IxAd[NQ|.+$nL08e8l R)%Arz?wu,0AFަ/6̘|/;wm|}Vrwqj9M7YV9*Aq.؜56bFm" 4www)y'Dg.O0)sV[6en#۰@L_+D/*$xm1wC?~Q|AkLT+8cr ^ATC4ς^wifw\OؾYs~p^[ 9kHdzZ6-e~Iig{Srpu#)f-D# mi9r)Q?<>miÍVfT[6(lZ oHn_M CNN B4deK>craGlow$#| ϐJOl*6(:u'?d2>DzSD)iB "=='w}朢 s LcWdk^!7Ԥ\WW\ Х\f7yTgdΝ'0φ5rp1@EY6G t+ǯ.Uxw>kuaA4~ts.?eJ}ܡOboiiqKe% ib c6LAq/X5Va =&Pޮ~a58g:60e~BEhD4kϖߩ5}>>0ĿxIĥg^YIZ* /}\Hm5 ӡ0cf}+^W%z&dZ2bֈ֔GNɏBɮ4UًPtq/x5^aӤE3诚ꯒ<P;&Z2IQAtPJg8G Y$tyQ% JP 4g M0Lpt~~-ө.B2 M]~IYr;^uH^j+yr{%K+y&f)$8F%씴ޥVy >ֺKx⃻QRӡgLpもgTrʂ}&1aSr ƈXa Bzd+"h8gZ{%FJ M*P)J/b:M/9@՘"sL@ G%(e@\ d^=6 ~_G̭v_sLq,R=ʂt4 *̳q `4ָXDPw4Eܡ{iěܥoшeoMDn".9iri&!3RlKe"_&ԋTh\9gp_um,SPd/E>uowն\,v0 hШ:J^YNKźk4B۝}XbR aO2~ojS"O􎓨T::@8TdPډc6(ƹsN+p~npT屢Cʷ[j/{bc9UdvzvcCwd>{<䜰8s ΐi]ZoͰLKcD%ʜ;PEpN!I@$r 6gMX$ԙtfؼV/~K=A>x6o; uCQx6ZuʑIBFWM{DpqadBtz\Pok|O:oL#1_EbIBnRgƋ$ DǨ!ơc]7(<ƻt(}o]R5m;ηնKы} Ғӧy־fJCV'leRLO5}Z ->I tA %[3S: S~aܳ6:yBR1l-Ɇ)&$Ѡםuqw8q rq #-TYASpڟouO-|Pmŗ.%Bw4Bv]imd@-bȹ Rd'Μ8O@tљ}, <]/dlp^ѣ+:i0PM 8Cdo͉[$pf1<'vҶ90?)6ыwꬁj)@[};Uk|6ɂ=̱.}IؿTah³8Qe*֠ȗSn!ڵ}P##HDtu2dj?VM#BSmCDrWr/=yߝX5ɀ-gUVncpn'm]I\9kxj&ˎz}F~y=;2҅R|_5Jܼ“8"ǷpjRUQbz0dDғ|yS4 otA)x Q4A|Q?Vk`7m;v-L !y%,ia;# '%&vɵ"b9W7ΡyS?z!r:mGr Y:w` g7e6%9di>(5S4]HWO" >uE["JN_'2-5c4V֙$OG&ytN9,O2_.Q\,9s p> r]``u2I(BrjL[n)aǙNN3qEψCf#:mqНGqb)ղ4/ꧦw1Q|73 .OG 3(?=6$I АOq^Lb$VXi#7H'5REywK$k-~xk+[gާͻ)}*mf}}dHW7~+.F&|&8c|7rQ?'nޅqV1 Ȉ "ͅ!J6ڋYR tzϷJa iHArkVZ=䋸]'@ˈ߇zA C9qdt{NAáM?p|b$t)ƺ@gN6J$ c -TL,㻸dU3 ,U\,R.tŦtS0T(yjpൠTxl85RMSUҋz 6F5b).,8io5 Rf# $gP`xxx}Ko yʷw ^7fjv,E9cs4Mt7ZD'y˦%y8.r K >"iJux%,HiS애#rg*R3BP#YL%vj0 3M )qmSvm ƪ 9$%O PE2)޵YBd@Bc i8S KFv3_頩RAg=]|Eguڿ.ƭ<ИO'E'mD r洱 K$UU4ZZ5"=Bsf)(O, cm@@)0HbIR%#lނ*a_愘Xi#G.fژYUsQ"M vwS|j6Nq6&LBSuG 8@ bogtz>ΜL<[E9CsДӦ$Rᇪy͐5~Ys5f}Xt!]^4I"}_ң.Czg򲋋Q3:NX9!X2~/=Y<΅o/_^{wmN<%Դ;%8W]nQ;ҭ;>P)8F6>ac䬎i e^JB iq<*>-W/%[UtИ(m~5L)Ik^IN6*s~\76.䆔R`l/)l^q<^*+E4 M=-gWbibk/[M%`̙ 5nQ?Vm;Z(c`,G:#tՈmꩄOzU׹ Ui m_>=V /-`yo% AkQrqdeIԯU^{paBɮT6G1:F;t Bi ;5߭O"rÎryG۴d^\mrVDkd収@/z)$Fΰ6,ac䅄s"HQoC},]4ݤɒ"՘[FBe^#\t yoBH*Ȉe*?e K0hbPt鄏G ^)*57>U^kC^ TKq6:aYkk`.9Yj8u uyt]࡜h!슦yDRzs3BЀ5FK0R\m/Tl^E۶+jeЇ VGu:n3@IgF2izIz^dF/;Y\_*9@=uhUGݻz.˽Q`lǁ ߫}dC0 iIla[O3:tkN@gxNH ǝnH ͊)+ j0 IS!Spl]ªgB>|q 8E7crژɘ-RCL)?nD^7],/}2ܾh';>A'EbVfM|fһ}exgN: z?V¿Z]]~#_ÞwHbn@4}dudQ~]p3 PJq6>aqp~ZvYuvJ6vI_tov5z# 2?<;dZ5DCAd,/"X+/{ R7Q8L9@gtN2 GzޗGҫ_wL5{|=)ꧤLb ^Ȩ{%tYI,vEdm|GD7G9TPl uF*;'ĵe֬{ A{N7{Z. /aަS!ML&%OӜ~nu(6Ja4GW5J߸2~ {Ge1:?K.i ֖Dû8z݅aRKW""#O{G&K 12aМ64awT&R D}p -c7U=uh^x8갪Ep?)N,PѪ(j<2h~@;^yeO"cm3@ PT\_ޯjocw"{EL1AC4Sn,|giZ0-mL#;n7UxgNC 6" -v\C96wc꡺XTv%jeXڔBN# JHz(HFb i,2u:~ vK'b~%uGGhA}PmNI`f\//Hi 8Q:mzDQ9!]!Jn]V?VE ~U,"rs:,jLF۽bz)߱LWICcm3D QX'$cl7ϰBx H+7v  l@a̤LNN&IX 4`Jqͯ8#d>>?oqts eШ_TF| l]Ť|S4$ykCNrx3, K\@vȜS:xM%nwwjeY&LlΛNƸ94Sb5ԛcfIv 6>53x# |os60T.>n9>Vp.ۙb k[Z x)>jvvOhyfQbc)*cKtu_\S\gF>˪yx# :$5ll6 ܄ w5t~{^#$@xg\Np ZUqS ڷ]iy(SW;8lyaNy^dlo1Ǖ^GԮ!(9mh:YNX^hY}]cv {}ϘVCDwbpTr&tO,kr"~F[,2 }Ι+ fPNAiRC,7u$+5 M]6Nt aHMVt!Jp*Ȝ9+DkK6B 4Vf+5 zRn!E?[dIBOҕF'OQIΒ \cm2$٣|֙M tFiq) Qn*l/S%'O;ejWlۿYǃxV-Ra]Q2řR~2S1x!&JGS,fAvyFi%&\n>6OQ@݅?%|ʈsޖfYpVtkԖn8[vK4ZӲ(5:%Mk Gm<V.2(ӆ#h؞JrY<<8]i8TǮbx:ⳗtYƂo;$ؠ:DZpi1.ֆT~j<س:!QgbOk?vHml,;t8=itD]E%tUt{w,$pgK&F(,T&iDU\C*쉖f~p2j1|1;:h 8f9&zuBe%;s: - xFQj!,ZOxk,+_ XՐqkG6|9#ZMK8! g~s.H/-BM34 M\Ťs UN N׹,|YU)]FHaҜ5zI0ܡ;B8*A60qi͝ ~Vvwd|/1?ہfp@ਝE u!ޤiG;0nCOJp30 Lic*‹/S ?Ss+2o7_db3y<ɳӍ;=5Ee_oB`D:#t6Ei dzxP(Ż~籏QCpizFJMw>rw]4Ѭ lƏyJrgI3¢HdTpqT}c%΋7ЉM\93}|32[^) HUOZMSn)Eʙ&$gdN#)xLZ}C|ܸ,+L<OXמșW >N$%(& xeK;an~+$mܼlhG[pS CJRTܦ[4hߒK &#ݐD iCDa [K.ڐIJ|n{}0:! av訝h2604GǥR9Ja`6X~YcݐL)}nzN`TyR< TE*<]Ÿ޼Hs!b~H ٌiC&C~Z`Z<_j0D^B]iHRcK txxPq3ǣJq#i Kp34 ML/,..W;/vI,wss~-XOyeɚ[v;u Lp3:'!*8 0JS:+l"u-jt3uN4mf(JNGWэzw 2> 0nrTC9m`rjsc.;0-LϠťI\>/1#(.ݨv7`9CCl囹3#fL;q=0~L+u H!؜66a7dFYUzgFVMج 6 6脪qpq6N|ZU9:6@ Tk2ihÄ?-џ>+"ͳM̠;uy -1:p9Ysv(q6>-3 @ +Fe^>?Tpͦu3盪\dq `,Meɰ`3X>fQDV0gw>$_L}m8gpN'k-vDw\azyMn?dZVG{.1+yÎȍ Xڑ>qQfmB i#<zއayMu_mJ/GpJgU5DAN45O^k iC2 $cp =x.C$!x@w+1gelu ,PQ!6ф:#t5ИkBjϏ٬\y^m4/m/tzT;I -h RQK}{㇗G]р5&F&0ӆ&..4&hTo,.O q$Twˍ1@*i̵V]$N_D tF !txUWs,d9{lC7Ϻ9>EVO9M/@ۆ/ ѐ%Q+D]^Z8"Q#8qFV%"?=gW.ΛǚjH iZ.u?lr-1kƹUs r9XtutNCiDN0P̛opm  z_Ĥnd,1[,?`HZc$ˀ)=Sَc=]7g$Q4lq iCFw+5yf}{lH42&b}^jtmб(n%h,@GZ2$K={|q9nbJL9mh&f̏Vw`pzZ>D'{b%]lo/˲+Qt vE|u d7dap;҇h~~~P ISY5 zXvGsNܯv}υ?yԃL5<ꊷ!Y2lKyI̚[v3Vvⱻܲ[HghN,r^K}5^o~|]Ӗh@ m%|aqvD\ZyHtMaX4i~iԉO`:s= ^JR+ M]* C `c~CL|20o΃=<<ٴE kOgۚefѱCLfvN&`gN)r[P,*;,߮7{cM\%e~taa"XVyS!VBC"Φ"3]I~RkdSБh}5^n/{m@6P-5h+F[ӥ֚ou19~?ؼTY76NWw$G;wˑ`gNN'+uU[M-]}R Z\~PV+ÐSt(D;awu޵a}sG4}<͑Yπt  )r\eF=\Y<Ҝ59 O`ut9npQ8gNN Z P5of@^[ OktqywޡFYGl&GE(*Y[7NZq!dd챆%oA `Nˌ $2}E'\ܯ&CYgHcZ YhȐ(K32LȌ9I]5;Il w_7݇jWVZ,6/G9ΗcדXv=#dȗG;ӹ8suQE6Vw.^I+qZqS TKd aƄldF*H:p閖q\ v'$8ƥE\"̊}#-Y| y.$gZnoW d'r2خg\Nqr`Ms}^airщZ%U'_s"4=Pq(<=FF27^hH՜&=M8gtNJ4tqX=s)¹"{ŀvA&@B“Nqr.BM\?7u01 Q"9md(R=֬ЃPW=x!JSg\/QL$@Rx6>%ggNF"JSNxn~Tb'E9uY禧~H2,8|ƞg9S}p3›ѾHsbJSu ; gыGqZm 3zSchDBSe4 =v[wQDgI#-Q+?ם\†(A䈵 '.u=xٻP䠷%@$s<$|ܭ[,ҭzB{~ȝZ"9qdŠhqIen<~#57L;MV\W/-.<,fI%HF9+.73t.* lm3HƸp~(GCJP30 L4AGwHڶvFN\_#Mz׍A:A3&hȽMS'1;xӬgw xmPͬ&a5cLNKICj]!)ʺd^ZYsݿ|ى]H-))C]hBKLoo b>Ppv,X!sticDGd\Vk| rs> Ń'7sR+cҝxd({blNZzȀ% |{HVdRkA_%l  wȖ9ilZX%#F {O2iTy($fn4>׶@`uLJ0UVcTxTCD iDzm j'&A^p>2ΒxZ퉺cZ я#cKK7[+Of[qs{堮zu/]ei@X2Xant^&SϾcс Wi .qy:o;Կh`77adu͸R64 K\lI6E x]֘czgdN%)xݴ.n:xcQXv^`I^՚sex݂K5"Wk:I[tlګ+ HPt3$ IKpUU[eA[z ğSE.SԬCc/خsT6cB jFew|h*WxQJnM}~ܬ׷4:R@ r;A>=(E{LKS[fП> Wp5&r3B'ЄʄPVܤ|'Lisʜ "tzP@zE'`kk-JNc.$Co{Jcq9m\Je:pz6I2uT*8ߥN/55{hDOJu%~HԱgrFP3y?+FuĊxgN PꜯTU%~o7WNR]$yt,u'I_ p-r.jΝ 83(glNCB'E'-.~a{{k֫~1w.8mɝD0#䁧>.=\Inp;Ś q r洱i^:%^ oW)M5V޴WMݏM~Aݯ{.̀`4ðFTܸ;Ul{S85KrOMq8smTR*T.}W<)6 'xo :в\`Œ)&`F\+>*b5FqhܙgN2<%.&Ü9mt²HԿ(ưF1̈́,yq,uDAUQ'a{,J%8FgDtGRg#뿐ۯVgq-N_;%-j/-#n< M"IU2!i'wkGLy%]/aGE%W|= u3ǥe݁f s +#iBWժBKȝ^z/R|r&:y\vv|hة7h<5DrR$M-#ykp$/wk{bql!:ml~ZoL@DRSyz*WM y7DtNđgN"eOO[jFS.}S~vqΪ*sט2цDT {2>fR~ǎ1/vBP9sMU OSlI ݍ 7uJ/z,l/M <0bpoa:<[!v3O! q洁QhƏ w?$oc 7$Qs <}qX ^4ٖ] Rϼ, S iCVFJvYO~njP!6Nq֮oe?ޯoqI-.\Ϙ73g LRYgǝ(&J3H R ǪA㢪xK[wepҏwPUb3O !tu.D%Qf?LE}W,A:mI) v^oSyZd^HLEizq籅^oo3>-DLƮHgv OziLz)r`㜱9ml:fL  s6xWt: |-o+$~KҨɩiSl%!D52.:^!eA<4%J3BPX")mVO㶹iVDG>iRZJy 8 ԁgLf"^ɑzY(q#ySUB;H6Ra*ZН=\c"[MgZo<_'M.5̕8˞=Lo !y%^VIwA r洡^:+΃Fޥbizȃ&QKJΫ`cP'K%P*!ps<;5ns@lđ1:i$)RQ3? |mvBOYlХp2 cUrcZEKs'tNGup/<ã#́iI¶Ӥ/bf*jܦ~x ~NI>R+tǛpWy(rCo=F*4w#G{SC:c  [% U46}0'\}}:_cz!a\իu}3ryހAlЮ$Pʳ@ BF J?YsrF0& iCJM.Hy~BߖJKEM3=w8aL |phrF+G<߬M)Ck2}wY" iCvIV 7MaU7 Ev=K yJ?%g)-'a|.AE(VhDI1;i4# i"HeJ@hQ}G5!wPƳ?yܬ2gRF9C46%gH)x*s!RSul澛A q&*8_-/U_752.G)4KZfe{\!ycue<i'RV 9ipiP׏rAzCs( nFQ $Wbwޤw-{F ڌd!s 8A!Rw^KdMrF洑 #Sѡw-܄:'JNbsۛ+^;EE=챈CX2Oʝ8gtNS!Y3IEM]fDu!*Nm02eQy-GrYu:r2'^Ԩ{^hB`9i`FX%DS )u`~DfYQ=s=BU; *8drGgɚc$3J=9p9ƨD:\AEJIKP5rʑ+\o! L&tx d8]41vE$6':m²k]4E s7vF:k(lm'R7)%-Xyv|} :VHL L`32LtE[EXxF 8S)m6w'5=CXv+v ^,5+S,8%=e жC=,986DaWd^"Om ({ylKtIe\ N ?ڱ܂,-ԉR*mE IIt^ç) ui1;g`ji#R!9,iюiD)W_7MwMP7ץTfa}D G$wRJN='ew͎p 1u"C5 N"x a.(LT6՞.Bi>R`.g4k'xΝޒ0iXXedY@nUTQxo/)͘6&aQdU ?:V:X85j@]`z^8^+84~ ܝө]E9#z R6PM`?Y s洱 k"RRVo7#*ܲX2STmsGG(=(>۷_ ş@םJ.C;RrSȍdQdΑsn`iDщiT"Nu ! # -|gK>GM-I/h*~s]Nf[\;++Ol%Wl wt t#Z!D&(ӆ',nU\כgF)~o@WzzϩukWp(yÀv ў Y\`9:0i'{/:C&xZ_Ps u;w^E-`=O/*۽ :D8 ϓcZ(ȝK'E9' J*$4鏛lXKg*XCeڞMР>ʊ^w [o?;4ؿ.:'F$J34 MX9Tw24ML/HߨLe-t:d*7BDB!yT21ӆ%l *:)=e}COz S'=*3^eC{ݱA*: 8=W,#y Mr֔z)?W]P94QA:mBB4d?w#ZWu< ֛Mf [EW@RS[+g:u%C%,'Bb'gXN5)3لJyElYDDuڴ7+a&(ndl$1s#AzYȤfDtF+ ,td}{Epv׫ pJN'UoltlόOZO^ҥ8L[ fQJ%쎼!ڨg^^.p[.;]'}j`C:v3_lFX2i_Dt)AJ xeK]=km34Jn G E?lg GE!2KG4?lE ]3D Q%UCѯ=M=-@`BTZTy!a sF ` [w(d_fX{a%H̕Q]I'hSa#5"8ӆ#,)$?<- 'SXXXh+Yh$Oж=S\wzz;: JԶ u{ i#<*}*P]nnHSWrsS-ǜbrfΑ{D~F&ZsĄS-45#꓇횣 iE<5]?3.Fl6 LR4`gΰrbI2tSOaɄyLN8&::pawyubd爹&)(Fj$:kuAn"^Y@䨄[lfd#{&9ed:iiq6EG'߸_xõ 6H4$>7,cOr gIžy<"'`l<or1ώKﺣAۻkzLP38' N {1*mBK Lfn"Z{?1Cv$ fU .Bs{߹B//4G~wC9ml(@HCyϮq0[Ҕg[1"RfDN/:yKMW >FM7aQ]8]%D& q,驓H/ƴ(xuQ8?4 =^{&20?^a&>ѽ'ፆ>aKGڟQ` uFj= Z.sh idΝH1:â jd{ 쨝f\TDsd?${sxNϟ]`#9mtZFgpd]=4Ȇ_MT{u3K(9]3߫[ʥZr5N}y%!4Gc8gtN J6 bue~ᕿ<B[:AiCkc]X1k6zjp myS"Z ghNJ!䜃&Zr7d:: v X?@[y X%(`Gm;^[-= G5R=(m3L SXMИ{\:"c`a <;d9eǖ-H),j}Ͻ] ;վ'ΕDq7bs` uFGb6Os*VWX| t&lO7פt=֞uŦ {#8E7mq099sLO+6ӤǠ;xfcˣvd{>*}Qwde®3"R@\=tqG_œ9mx*U.w x.+NqR@z`ڽݦݐ$% &8mt;A=Wv|aFH{#9m|jgp. rE*kYLRh7cI:.HmO%0;r R9ʓ{9!mxy|wSbTb+ƨzC*7TO lyYīYq??n?|?k.6pÄg kEsRVp^u&3G&袞:mZ@kk]X|;V;G 6TLcgbX,4޳v5,kHg|NiJXJl3ow=%P<{F_kz˓шQ/'̦c^{r32LL.E5}-ƟpjvF%}м4Uw :yX()n'ʼѴ_ ^v1fU_{)B2>~!.f@l$*c=OwT@.)(@o69l'KSLA PW%pH?qz4@ ֥D iI* 1 u ވ;MmNVUsҔI{ֹOo`D8>Lw[v9` H+a t $)KxLK]11$8B`ڨ|9O ~hrQRrrY?2̝MI Bp\;v\h )6@8֞Oy7=넮1G8rڸuV&l7 ?7msfc4à#LV[ׁ2'`YRH*y{sHS̳i^ѩfPNAd0Cͦ]-zfcXEgP{ fb=7ay`t]ޒG${XZDdlKtβKGNt_-˦`PBq9m\Dr' /| t=Nщfzqf_ғۍ۝qc ΀t;bo]Pʔ΂z+stb:m'܄+l_YX= .oϯۄM_XqEAyX< 'zM㏨vXKP32LcKg4?1||"Xs fWѪWQV|-ޠ-Plͪ _\cyJ^wLl;CuPU`lZX&Ejl+?հ])Ljo~A.XB IkY8/p|1h11(9cst͘4=𤽱bs zY.GkAVH!ˈP0v!ąx\'A'KR|3( JXXwʋVpU]k D #Ӌͺ&7<*R«ϸhjK'ns#NcPp̜a< K6>a'ș7byiŲyh6 O1qtu8vY{ #DـG{qL[zsߧkBl㜱9mlژ[jU, sSB#io.>2%/GTp;j.,ax(臘Hn>ϟJNj(4:CtՐu&$_Ο Ng)\qon@քP+q~Ӕjכ(ǧ`& 6,X:N^aPǾ/A pa%Ny[W%9 iVS 9`]͈X\ۡ䅐G\+ЋnEhI'Vts#>몳92mD#q9m\’z<lFqS§'.ԽLYe* WB"BDCbY> pshkb]7HzߋW QŝX7KLrVwڌ&c34ƻl-[23*8̪EoB"2␇~Ӈ:҅r.$ X~ڎu,!6t*ar!xpaVS`W_on?}ïri'\sh tm6w?_9}Ŋd4Eu?8-܆}>?u#̱QQ#7u8_>2-ț`k B%)8( {T_xo[Fj=oQO.>zQ#^AZͯ? mqB.MM`U) s] ~id ;wt (Mvz.ĉLۺ{: Z~ y Y涎ltam}^/tM}yV3ik)bn GFn^ W{š07WOHlrK4~ĻS-N%?^tROۀ-ZH*qc<,.dVσO߿XqoѢ(pE±5?#=5zx;A^Z/Y?P?tUWPb8ֽ^c9?__(VeBjmq&ST1 PT8֋W̃d oP(S< O?|?ݾ[xW&wVK4 xMĦVpU; Y06"Ī)8{ xfe=ۈy)<9.?K(^2xӟ :o5mB׬űU +?l'|fͥB׌^QH3trLnQf Ô~9(@/8d^ 17vKh-A@dik&uϟ&oNtm-֓; r4)^q63ӺW5Wv? +Pu i/bɌdAwS59A撚qSpL YxR 1BȦY1jN#LXŊYS`AW!X=+kBA^N\h%-4wJ1;Av/oUIȴ5_;j%CAaŒO]oےM{Jn' 0(aI~3YIT_iRi:*í )XzƋbZw)au,RA%Lۋ~RW>[2@8ֽ^\OĎqX>:\YNɽpq{5sϒds3]^ATsikʅvu6F"e'S g:=,*ʽ0N[]!6]sm7ێq'{ӺWӼSMHf4Yy*kҩopUv;i'e}%ەg[{uw'Yl~Lj)$I`{[sjrKgiS*+ZrzӤ#ƚc _Y7@bJUhk щi0Օݢڊ Ɏydx)RL 4bE5 r-&TbƤLnZ M 9ȷ %P.؄^^1 :ˋщwA76qHϮ:1ub_TXݎ'9GhKADXH ׮1Nu(8g&l n?ޜo_ۍFN".Vew&u+y}~-*IofɅc?(vTgr n׌~ccm{uv=7fi㒔TBUpHQŬ1EٝzbK5`[YAA߳cK,+.=ň2ŀ2J^\=NC Z$]{ 1V}}5 W&Hn,R_hZw˳f6ϗSaZ =f.Ǩ I.J-ܕާ[>ƁLa1.aG$歍S= ҹ=|} Zp˃p) F]lU{;wB0av ՒfЁDzyT߾*}W*N*甓[ 60GmzJ7+26L{6珷*uB?%+C0g/b] GpOsYYMwtK0ѫAdς=W Uzڷ;*WB8v\)d4y>#]a_wLdVp(ecϪF a:sY)#ސ]Kv =RKnVlUaag"A^ˉ9 X[ѸaϞI6Mrd 56EM}huJ,w%:fv}ܚtjmQ[`'U2BJB`c9+8<,"$&S hD +(;bG)Y+uUIhQ^TlPHϊB:Wm*طŚG]tZ;gR gKcW`ZwFf[\ h(۳ӻB,n<Qf xepzp']yb;$m[4 fkהi5x4ܤh%WdU.-EHpyivQ9܌9 ͷ|vg d1nk%.2OU!ڷ`Zwgm~{K Y9gc[w"ݏ;/1R,+3-V{e2\/ݗ;/v@k?8AHw~}fP8m~[ dU%x vz̯.+ /-Ln rD mͷNPyR}K&9TX 5sS,iAW^d$#mn?-Ft=re-ӠM#Zmp[GIV(ATɞ |i %nveaJ ;v+N/ڤ L~Aphw[w-in #U| ϜB癫t2^tizbt:r{ ˇYa:PV|b44T BVP'up+ g[@'/FOnC-XwsklH՚EHm0鯷ڜ Dj#fBԜ1#a_R9G]/]ӿCD N(ɍn]ج(PKa26*E^\π|P v:% o:P8 :cYaƞ$$"3icB9F٠NVyu]Q&PA9B)- > Ozv11;j[ z`.]M6ZE4Z<#f^eWx k *Ȧ->;޽dgMcgEӍZ. 32ʻuG@Ujv*ePǔe7ou.A{j7v>yw.s ͕j›Ht1js|2єMt9,wfTZ\'*] ? 1n/]t\E1mMst/pqeؿP‡]_cNsµ9#9Ӻ߻k8qNL=gsw<~J0o s<꨹Oʇez:9͇J$C`QހPJTHz.mamM!ua~(yu"|Zwvq' 2?uKw|=^ V>_eTEbiSn4H l^ kr$J܄%K_dܪ2 ;9^qlӕ0.?ݒ"HΦڻI%__IDyzlҮT/~ݓbWq \UtY5EThO|rd }=ʞ d 4wUV-wPdc=M|r93Q@ yt:xZ:tk}T^cP% UIߠSm"@=noim)$"-"l1AtJ 'x W@4e ^uW+NoE̎oc\OvV%ZBdTzLnz*ÌŲ cTIDNUNQ>nc&KQ? o;)Ƞnr(Ed Uɴ6Zli}7llwϩ*ئÏ[~~= t) A\l$K*I\`xh7nl)Kйh#XNdr(96mڠ.]26 ,Z?r}v1M~^Z$X׵m[&1y) \3Rg{x (I p&39.x|F1fQ'ӠYp,q7.ϴ6>  ZxznR ̭QMop7Ҙnlb͛򌨨hXF%%1oݡg[siAܿKorҥ0>-eIQPM38$9E[!4s"#Zܹ\S{\WM6 XH8E… c7>IJ7+gp/ot{(lǪ'xJw2X7KA]0o%bqd-oYC"g3KuUOps-^tzZwSTKU#GhY]kmQ5WU2̵vi}vO|-綛MA6JݟM6c]B8JcdVYf¬{[m\L+ iZ@n޲6TLsH..`9z v/s38·yۥǧ&"%,L i5%Yr?#CCSz}DV`aW6?jڿēH= WHYz]xy{K4JMS{멽%&Sh(y ;͞wz,}I5\X@`p1"eI`νιX=>uMj&A7w𫹊)hoY~3a%*|dRv2AnQpI#e%u~q9ͣk3,?֨Ӻ 2J#@`ZVK}Z4Pٓ%&=藔S2juyeeJa(.(I6m*qnV$Zw6?eLK,J^Ɩ:*IGLsl zALJ  go 6 wgTrD/zVUԇAV~л z0ȷh=j+ VgJ?}>[-(%%j*[isN ./&VAb|KDV W`.X36A0eU~/r-K vL*X v{.=nn4պfPāRճl,L}D6=rr05B 3䝞K,/YIc8Ze+`kĦG[UIښ,uP+X D;LuuWW ]xzKS;xrG۫F{MlsAA%l'-\!N_pcT'7ԳQ򔰾9Fov¬y.Y&f /MfYvS[YX,ѽp}j4xi icU_*EsO*[BF\++ -ͫ8 c?3=S](TVm*H~Ep6gʠ`ɧ*(>~w7:<b7ճ2PS :vb= mj G+T izZ5ȵT礪&0[qkTC?v{U2=vsJ=tIڽوYg/*sW@ `^T ʝG N5NnSnʹƜ 8U"fѴjGStyFW 5v)>Gn RzbxforUH!itr ;Z Inj4^P)4YY|[69Nw&%(@H=48D,^T;H+Hj6C8fXӠM6 `ZwJM(#ϒ4 5 wq}D5h]t [ZU;m=egfBF^uWO"5 ;@Z,֋} 9QnX‹cϤӗyn{Sה\JuQ -v㭻Ch"Wx+īu/VӓJuRGy+ x 3דA)D6/Z+g (JP0`߂A W*ػҸ2VIK&MJ5*Ȧۜ]Ll+&~3xbr 6$o] F |T{Ũ6WP `cpߝ{Q-3BM~uP>qSPT^ m媰±mQ-z.ǰ¨;kk/Qт4C\Y6T?Jb<]&zOI;)4<ڵ W_gLR|՚6je1^e Wㄫ0 )2rW}6`KʶwoTwm2:͕h.7r˵vm4!KS#cs+5mZ"%ƀ6-*LL7շՆi]{nkD'ݹ݄T.m^x*BM֣XU6+DZQ͸* ܐfk7ܽI 5IwSB5nJ/kC16kG !H~wfF 2o5c#x=+ wIχW5ɜ,eIk`Zw+٣- ǺN6#QwgqT)=m%\$ڪ0)?oo! h0/Юb;Ge;'Hn3ZTSFX{ŵ5oط'(<D>QB ĦzBA^,d]% e|I}>ËA}FJnjYJsB^xWy`7X7@JRYA(߶_ܔ9#l =<ĖGI+|=hFb-l{$AoOfo%+CMy nA`±w{= 3 [nO_u܂+>c r=Ap-z疻 gb\Foh6ޛ-T#l1U'2nc NeoH&`zή=Z8ԫl$%#W9ֽf[x2 *^3-}QVXYY@q]Wh1w]d.waA*!˧yfvݶTI- ;ˤiF, AͮfbbcK AX6J"y:K-ois/8BVsP 8F~q)ervO?swB)pWI~dwR0d+k텓΄h)beOL`ҼW^KY~]-eD3mkvXBKgq*Ǻ[_Y40\L;t/26jDw#W`1==s+ 4aϓ[W&Qnqg(J2 WV!?8[ ȢekJIczBmKz`vz=_N1:#"]%n֚W=K) ^8\7J-sSOr.ּjihuӺd]ͰL5f⨀˭<׋cd7OW}p:qsmvjU?x‹cv{W_ʖqwT5dcW8r}ʋ/,0o[j[P<\2l W4r)w->5>zZ!T(&FCdL'uAEdLMY !.Ax;v ju0<;٧\}DL% E\:XS r:ha$-V8ɳPe,*+Vu%V 1qdOnImOθ,(AyӺy(Hru~ZD3  iyuտ-%.oA$暦XJzO DL`.5)veKܞ9qwHxS=W 7]L8+ l` Wȭ ~T4Tkwo64}S{-Kc&Lu3#ŬpP]@ɡJ?/-<<=_xo[wFS`A+guv>5!ŋ LpN+Hs' eۅnH{.md=w-7 @cPS e۽Š=T^޽9PoXkCnU\pZp&cTo0u̒ҜN#f7x:Ea߆'IǍ_ { <h2SHfRnupqЩ-vWǶfyUA]h6 `(†pA֜g veecΪ*(܃rP_-Q  VK@kZE]BmN x1}μ 6cLaЩar=Ч$O-fBV-eG{xrqШW:Q)"k2 5K@CKJs(u [գKu($.Bn/ٹ/Y7f~Oܭ2yDS3j|-ŗMÕDYt,EӺs~_܋i7yA/8G{ t_x a;,!г[$E߰hw y޿-S 5XG2)w[w{|w/B`)7mdJ-SRA\Q kiZزaU~s]O<>a,|Jս0rK<%EuUAԮ J /cqA= lq`bu8zj|\5/88@plDi}NAa6}W9 y+ua]s?rQq=oq- _` nzA9([ѲꔒŽ}a7ȃwi.^\ Y]TTN+TH6hd:,ʒim zqz,kؕh|gI4vmZoد#;RPߟ9ff橑껡"} 0^t*v: ~Œ{۳xqs0^#MZ{a ksW8ߝM-~0LzysސFs{#V A\ I]pi~#^ zF $WvM76#4RCq0bX_ Ȕ(%cf#Z`fȠ%*]֚8 .lY8 FəVuu Ђo}V"Ѭ\+2uFPG$"5Ok 3D_?Ƿ++Âufe*(Cs=zc=_&Q%eM~o7Xv~%^icR ~yvf]`1ѯđ{Zhj:{ufc]Qpb%9ng|J !BI J%k'̜JIQaY琨K+:l&cgjc#3 ѺS/}GJVDw+L~/35ysRj .(E#׃9 uD8If-W* z$309xzG]:DQ&2ȷސh"W5^1nW8ĝW<ًvQgr8`[،Pkj29oGFR֡Pd8jM?]S6p.EVe#8W# Ow ;лCX.kZ!}3ͷ׳ofec +8̋٫?Bgy[w{K?\8 2ғu' ` :.5u$xA#-%Rxaܰ5 K~).3;)e3LnR<G*AK^uW+FnmP,>J{Ӻ´jy\9ȴSk[i9ib ([%ѽ j\ޠXHͲ*;V U, .lHFW0ۼt| s ͷZ)su1O{<7{H֝d9e\OdO_g苂0ND*-I(Z\#1uɫ ӺkZ%&QChP c$_EE~7h24J~tג#ry,{+m(iJY#ΌMNǓi\af²;YnB*8WhF0ִ1%Yku_6G(0'^D@=8|Zŭ%y/imp6]>Е! M luuZ2Lƃv=ϸ tXr,r{:-"Iχf.-a3=ᮊHP{F$ѓr4d|گ1DԍȷOuXe%Gf[* 6w=:HpRyD+ D<$5+gK vVnaSOϢD'O%Np/=BF|48 7v[{a Yyqi'G{&WRD idCIj` jA2wv_$qF)<(-ߣ Yd$QpMPņ&R o&b zIca C֒B_A~_cRhx* ({UᦀZ; H72dO?ݔne8%7T*~Otar4K3+GYJz Y%{ަdi5v)@:u[ EL{]b^Wg"(# g{x;Y!AcL|\iZ$931J~}.I7ČZ{SժnrZJD+tPp@ݾ Txmq2Λ} +"̒2^Y#`SfVѥוI++ r sj 1<3M7I~ss-aKVM$z0.ض*gXb @Y.X[4L^ˑb9a;!#ہ%lebV }ANdEs5Kxڶ(L]~7y7rxS.9+@ZhΥ;c J<8М w~tu6btꚎ#{ {su{0+~+;GۻF ^ G L0K{o,0$Q~2Ha[u x&n+Fe?."sBK+O$w`YfJCHJ \Rh 7TE)i_wkKp<1n$DLe/韏g!ڊ ߡ `]oԤ]0t-,ЩM8Ph|sT(Hյ@3j.&)7<?`/eРHi/ z%[bӎO+uY-\  ^u ry\:)*yOSgA ~N pT@+wrM/oqQKqw//"OM!6]ܪqw_Uk#uc/b؛㺵y& Z-h09L~1XSf4[8AE"I8>i.x8m ZׂW!,NKЗn/rmzp,,qCo! ڱ;YO}]5Y[uD3;la馵8*M~ eZED 4[!bx*X[|ez BRڄ)A,~OВaOıPA^Hr!nӎ w8pXw|H/ZdM\)^G^jϝ1 e~}[WFL(:4LYay냙:f6[i7ZlnL`~be>ɖy0#2Bfezq]* ._lv=1:f_mf:M~ѥ~U a|a'f4`B 'lvmId,%@mbD벪cZPh-%*Car~Cd OVe0`8PcrC Jo6'm>ue,腇Raw"/xI-OvP8]ÃD 8vz/tEc]!nhK,IeL Βn}ƪE_o0Ĭ[#VAEҾ»eS)wJ2St ʓxU |Lj=d'o7H{"i_Ip{g  tc96wT_ZQ{N ^z /"O}FU&;n35 fW(Mh@9muKu1Ek\ ,we4%ZvtfIRp;>w1bQ72]뒸Чy!h⹼?e,wW'#Ӫ*B8HVԇJv(&3 C_v.0G&6DՠWj M֓lLstG) =#gϠTi`$ǢL8ߣ]P®AS P.mƳ R(h@.bS R vQn,1 6ѷJ eyۚ G~5>X*!T KnUA}[:LAlCwzިBޟQ*M.);>ؤ@$ _ʡ]~ñ&o!aS?gyEwhC~ b־O{+I52{Y|ȡ> ڈfQ!D}_q,{rju[K鯌{:+ c*[T7кZZ C07VMw$tkI0s{Ey^˞|XBy0?&+1^o--IkRΧvϪR\6 žmrn*4)gA.Zz_0p'9_a+;kSV|>UCB4H/,aPԵG{4PeP,8Reؑ g2~p{3y2~FJRxUcMcϽ-|լY}ʌrǺ7 ޥ`G!oϥ Ó 9fT·\hВuocqp^YD1\u[\7+hʓɯ qUPecqZ#;+{/ 7leIR9W$ZH:yem(!>4hِ9H“o$E񼬟۞vs O{ 4H؋v9@yR~ yOriizjT`pӝ]14V X3ݍVipU ZCB<nhNM~L{)IO~;Ne?ya)XCMԾ홨Y]օN\;3 ^^LX\sK'\5hƶ'8ʱj) LNO~/,)Ƴ//$N6A]`U9 +\+\!P$9W%xp,]dRS=L3oBA&si>j& rJ4B;7Y6u`(Ժ \Xuh/DR%JC#IV]S#[3lmYn ts3r/9E^ V\I 0>9X}Z3AXڼNvHAAʅ"3"uǗ,)X<ӎ m4DBS#x@mG^u _# ,*Xui*!9=ʷ}õ_-UnWuM"طQ Yز1PXA(^a]o3)@?M ٱ;0OybjV! x+|~2u}ʙI!K+/Ģe1_4Mݖ8tP/q/M6[qϫɷY^6ٖ85(uڟiZ{E~KI!3ĪÜtucw#=QIU;}Fv~ 9?&j_n -zA}֋j uwCx;wgr^V&<î\aF~\gf  IM"L}^YswwDɃz=mh%]p"uHMMY]5UJ0gS+ظdzWS)׼0`X/#lP{0u)g|KQԇ3_j5&Z=DP0R*|l*a<Q`[|Ϣ9L~cBپS!-_x49_`jo 9 Jl SR'pnj֓~bM6 &Z-|AsW/W64cb,C9FhTjulDoϦR#S=o02'o葠UxurQFpߵF7DWʿ~ H֒dӷ"z׫S0or|R'5TӺɯ@ oZ$_q}i>P^o˿Z-*,Aʼnv.ŭ Ǻ]^\co0N~kSܯISӴpA8[c;jg'_OѴ>n%˽Ǻ_㒳ꅆc@Ac.9(Z1Z&Y@-}WD&tWM~5EX9P.h8 ``|CЖM`|xkE d(h7St\ZZ?Tw}sfF>z![q#ۊl$ط*|AL(ORP皪B;=ۯtO?$o*\T'~^._8>"m*QI61V*BkZ69_}L$ عe %qy9$; hyDag')KR 5 = Mo/yR0oer "ս6{8Ô|n(A _hϞ'5lZ˳ɱũ֘;n‹-BX׋-JS.WNo6'|,s@)(;K9U^xh6Ӵ,I9iǺ㊗>eyQD.Ӻ[5K6>N*8ݤ_D!۱^`gw;v_W%e">@^Yy D}=N^/l4:ݲ̺u?V A%V=smmTwsֻ=OxUwZ|$rv/ݦnݍbjQa=ۺ߇zO~Fu_4,7=]j{(3-X7Z L x65ה^%ӄy{B{=;x_r,H7pWL1fqc1Aq;s+ 5&MjM~~&]=pW5 ΥU{xa)L~ǫeW/l֔ԕueQ#|z|?\4Ro peK>WFq"I6&}Yأ]9y`[DN)jG\IIv_Idp/Wʩ*+u͇Z/D@[][˚rguJ1Bš!iNG^ g9F JhWos҇U(L͉j.()ֹ+Q rU3KNTO7LUɒC~D}~!>ʵYISvK+g=yZw.+d?Tn.|rʁϝӶds u]}GC-|b ѢjQlmUô *Y'bƃC=GNO}}zp֌ jCǨ u3@ݶyρs,.@''z/Js~}Wu𮧣ƓUn{t!uЮ_.jO_lPOznև3U9+ C;8:HrC6!sjuUaVS )#:/lOsG:dkZ gHxg1XkἌ^Ts{_I]Pϐ&dB1 YVuWܵN&%;ae PG^_-cov/{6OSdy tJ lq6]Zp\2Q/ 9n_$„ EUkvgP$ ?`j.a&JؤԵ@W]{<ٌJXx v/lHNA[~C '%ZBvmQ؊fimz/>-* %  {AMLiy8 ڷ@gL!4/̆_tGD9&C3cѱG4] IHSy\{Ta:an>9{<ヾNo_%lxΏuA͖OJ}n)IhABfO} s$a3nuU oXwiaPCpLBaiuT ]']zxn{VKAd]9Ȥޅ@YQAIk׭- u 2oWx_C᪠&|Aa@u9ޗޗYDmi ݩ>WSb'[M^Fݦ"\?xz Tz,'tj=F={.B귢F9IЏ[c- JmMۃmV VZNo)ߟkUf6} 8ڳg#*~A7gǞZS_bn'6nEo񧄏fz|(5<׸G!EGspОoD0׷~B{B+qu[߻W !Ktw|xeC+:wT{H~:t:g~h#yn\=75ڻ[vYjJ'|_9$!}14o oڵw}2Nbo}FxlEqKܴuj³Em;MR!35xD%w~MD=Lac> 'ϗ>>"ˎVǻ{s͵")A?;n1w?nR~ 6/]0=//Ykln D6dqvNߟv"I}ٞ\wzo}*;W~atO~a'HACq,O*?yԓDɫ?og@1w挑BM^%<5“07B(h{} !pxp{{П=&ɫ8 c\E9 jb/Gq}90&sp()WϺrJ n_O`irc/ Ga;{xLI۱BxWa3T6f6FwY}B/q}znH޳hn6g*7w'(~[f6gr3Lv|sϞf6C҃7q}/sj>y:sWaehϾr0>ܻu[ڏ Kϭ׺=RPFU\qyS&syn[yu^20:)?8⹗lUXHS{ÛS0s*mEOz6~{^c<6HHZqZ2sܲszn:7Y_e9<~ZY5ߟ{ck\"nGG2ǟO[к! $:} dz#OtR|ctW>I{ O>W9Ssн{*vɞ98l?& }]Ϲ_g *1zQ_%YyͩhY|T=ewp'~г~V/|Eg=ŷj $@g۷ny|8RىG)rݺ2Y9ѯ9NR/뷸1|>5=҉7~وD'#):)?Ix}D'A꽭\-p5h/~aL^W?K|z:.3[֭ˀLGyogl?wsY!0Q; )Y> U?coK>+'3[~ɨ7Fn3[Η/o32S sݖU|߉v|}6gζRk[%IY}\m^W|޿Bl򟰃^β?&=*ޒ. K!_Ke/Ћo~%zV%U-)o_Je/{ol~zbڞ|&w^u~^!Q[t'>9˫QsHOKdWuuPxs$PEԥ8oֺIDe|kgvsP?M!fey߻ݬ^]]s0Cs,叧QzvJk3_xSTi'?\}+*c#@;xv6~neOx'[;K<\k~\}#N{Ioޙi]_eӝ-gPWauEt[}g[ NZono|rhiO``/oykBWH*\7\QO ugcMK9GOx:q/1[1lrչ?*G?~E:qR)B=h{UV'#Yt`(t{ܽ (A}noPOA6+xxτ!:7)Uo_]e)#MB{vhPꔷ1dOs?&Wޡ)L{t]#|[b[ #. yBK7.ڇp~/&~)P"t;/|Oo ,1~4;?{"AZ #xB7~znﬔOvu; 9Ɉre?Ijja0叨"6=3V͠m" #j^iv vDP:nf (h(X 2?"˚/paݛ'@P.k 'qn (+/;4Afq d1=K i&F{nʟwʴ +3?{L't̝d_G 1E J#ZN;'L:U3O͏0|Lf`W 2^gLݻ"uN̜7<0H>AҜ}pC`{$Ğ  'ABHIP{$"& efA'X 4p `O[Gh 8֑2:R[Gh6 z۲7tj_k;=:.p9?Rz'4p {Kf:G%WbeS _Xu!;ƶjL,wfxWɾ{[ S]AC03l ҷuؓ $kĕ$ @'PjhRpwCjG*\V̀ 5 [gpKロhO3'<)@8a__֑AN0ϻ! &8AbJL/: [@JN'gnQ3Bt{ F[jl05{CAzCCAzGCA<  $H,p“ 1 2z;z; z;*v] =:΀6jv)hS0NRj)h5A Z %jh U,Op"{ʠxJ mb'!\ =[+ pM41E::B `[8.#;l)o] ghXLL{PT섣fh}VafbW 'R_" R}d~cp []GٿGN/p{`؛ă g4yEkJ'` Ȃ-A@>E:`hȪ@DdK4Q=# ز6)U1~]AÔG#D9Ft*sby# re1 kHh2:ɖ}uRTX:ġ쐘X 6}Aam :{A;CŢf{]v|Tl sdwhX EŃN٪tȄ{ mrGg`ϼh`x$XGq,\<  ,O°œ u0\@ZAA [68ز l nuu4Q/h8ӐC}= uJɖ3J[Nՙ~lQ`y_RucPul0cP-̬ȃ wH "=Z!\/G4l7cE0!Tc <D>Q3UP[8r e h[Zlֲ&[|Z ӂV3hY5ȧ%L:1o-1ڄĒUՃ xίK(lYt–GJN E[rAbM LޯSZv,ff:ܒ=M=#1RoAGcoʂ(+ l`(z$ N'A)`(z$V* fU07R֑ :pmjA[G6R5L6oA2Ar0EL"Ȟt 2ҷu,˯(n&V9E1$}gj PSK>[5 o]LmmzEQ33BPjR^٪N%}d i Q`(O)CA*ڔ*hSMҊ6J'PPZP W3U3 5&N[=r7uG4h py*~haSM8aҲNnYJh\%߁l5io mt_G޴-p.1#Gi/{$1ɖfV;Cp4[AS8 + IX(H'< K'Ab ЬѬCЬCѬQ[G nuu6jX֑)UVЦTY Yme u=J ۴ufoAZU'FT .4_G W/-I;mSlgOu2Z _-E0#B&NUlGHF[Jh FclF q 1&0x ('@P5q16ݛ870fU3 槼͎}C02;٭&Nͨ^p{t uD~7=dicL' Ow.dTAؽ5j>w|SY{* OZ6 R'}  1m`(_a h9"CAzkf5EޚYoe5 mg$Hrp5C*\Pj5QUOO߰N dT1qBaԲOk٭4?FaF5N|HU pbnԊDQNk[z/Z jm{]nhhf2cP30#<e{[5L;ZzI?OLpD_ w4쭯)U ȃ @T|c( XS:244qM nu44q g4s}vkzENPk}Zl潠-l9l$39N MA޵X fWK=<9c0y/[ȌM~T˂-Bֲ`KW*[:Z5 ćοG#{]G)U&X;^3{S ϳ_%U3h!whdV(ҋg WD[7+,pHwElWd-H1^3dP9 3,Te FCGBhG ޭ*ݪ`ޭAVOo-#R'g@ ˌ{kA< 8>>+h'=^#EOw9==T~9O .q Fж rh +xn*3WE{wY ½uHDZx;(Eeы a-#!Ns$HsE_~9>@yvѵ\Țwӧ=J)T~)+s"UOyFJV盛MSd.zl/`z }. ۏ T`egg`rY.|ўSE=_{I駽 Z ߡ=G­(O7PM f4 AqUE4%{ 1&:$8WAy_JYrO(R ֫# klQMa^ն\?Av TU熢$7ußVfm章M|<*hI S//uvvX pwkKO|a]o)Uu%'Ibב8%AfOGc ؒu޶j>?{]5n -iAW޴815O@RDϠoo],÷gP)UM)3 f[Ή'ta)VR#J1ٲ/lNr b@fhPa%w  `( IP(28 h IP[ު0VE* nUuQ[Gh-U :Rɖa,[I'N8 }*j eNI߰'ʘv ݢ qp <%7|3B'ԓ wIڲfo|[̼h z~JZL$F>-mUuDS_G3bav3b: 6P$H,MҊ6J+ڔ*hS.p p5C]5 R KJՃ w@0A͹-wI[TY)8uϰmJa*N0-p:Rك0BW͠({P;C)Ueæĺ[灃p(H74W4ē PNx$"OBAYoYoYoYo :pmJtB#+hSM"aG3og' Rg.H+1+H3ނ̎XYVOI+oe,O'D< rSd4-Fs;-pBU[؍h3e0;f5PAQ B@N`U3p_f4`(y$ bL`('@PN nBA mN 1x (yY98ћǂDztgXY&H-W>{R Y7^_GNWD!1N _r÷I[O5݄lY̟U3h.#}'_Wuӯ#dވe_G5CvTcgRz? bZP'AB h֡)"0ČѬ&h[S4ꮈQQ:0vO8A W3T fQ3 Ea,aʯ= NNhTނ$ȗNWb NdOG'!S('X|({n- [-jOf-jivS̶>[z A[!lI3 GͰ8lONN`o}M@zGR5E5  D}ƚRP֑c (hhp먣c=~{E0|ײ +{A#yO'6 ;RK;>w}ao:Jl-VZloO{eZlؽi !n[*E@C^Q eZ’ѼLtj+sjvIeYV͠uh;+?qWzq@ 3^{{uc{8ψtW$(vEqR» :eyNK]A[BhG -?ay(wFTEq7ѷ;}dne"ɗK\_`/zxꑊNEK *y߸#hP^9f4AE7Y=C|uE{E~)׵(Eeы a-#!Ns$HsE_~9>@yvѵ\Țwӧ=J)T~)+s"UOyFJV盛MSd.zl/`z }. ۏ T`egg`rY.|ўSE=_{I駽 Z ߡ=G­(W׬!(beTo@ë )dWA[I8*(kI&Q} Z1%*h%s)xB0*(X״kh^=.[U"af\y}f,*rSQWA LU Z9"6eUPګX3&*hNITF8>xK([U S1+wǬ*\jdsWA\. ȗ":äy*gX'hTegYR 8g׌[LNyԒZ<#w=R 08!}-ٿ5CaTP'5p _H$GHUAbHIP{$Ğ  'AB:I` @bA'X 4p `A'ؓ 8N'Ab#%uTQL02 z%en'X8 i05 ~93`O\pȞ':Jb בĉ)1r , eV2h[z&fψehfbO W.p@ @H @ @p5C[5 bDDzw pe&aDx_8!Uu-pBdv4l {˜<[{2ApP3̸іW͠~&X@f6KN{pvR+p(Hoh(Hh('Ab Nx$"FCAYoYoYoGEގ+BGЦT mJiB Z fV3HAD0@-XRPFnO|uKvD(TZ(A(&NhE 3 8I uesgȞ3?{&Ъ_[ψf1m4wo)U4-' ǔ:ؑR-PEVF3>2zuN/p{`؛ă g4EkJ'` @|"=5uTDU3"nɖ hhA{F-]P; pb; ҺwFrfϨluwN4` nɿ3l9 Bh: {g|Abf5Cwٱ7{g>*-ȉ!b[nz[5Tuvh(sX5C!;X.5]v8OhrG׃çZ ,Oœ r$H(\<  OSr k kV5Fl`[68ز5u@[GQg{+D d&g[C\[']Fk˾ 2AWb}ܼ[yݒn=޺i:ɿ3D@C gWAnGek7oh(:Mqh 7dOӰkS/X5ȉƠ[8r (4Q˂-AD- AeMȧfвjOK mޔT%yVJV 꽠a4J ` Rɖ6ќܔ  naW rw[{ݜ!1N"bA*bAm̎T) LUۖ0 {g,h( {P(28 h IP[ު0VE* nUuQ[Gh-U :RɖN4|MU d34Jrˠjy.}3HYu-:ST0먇Xɞ?D< 򵎺-FuwvM#߽_YLsJUv\Gm CüϐYaJϢ%`BkY4D/>I-iNnANkU ZZ(*ZNl)C_}`-[6gDfTZ5Su?CKV{*lsѪgG|+AT3X QQQ{7a_ AeՃ AxF ƕWu"AyF+2ۖuWD@ .qzE{KNv٣i GBhG ޭ*ݪ`ޭAh2bEe H!)AJ-=+h'=^#EO CO%E_~SCyKo\mqB(3 ys ޢ,iUўZ: ֽ"TI=BZx;(Eeы a-#!Ns$HsE_~9>@yvѵ\Țwӧ=J)T~)+s"UOyFJV盛MSd.zl/`z }. ۏ T`egg`rY.|ўSE=_{I駽 Z ߡ=G­(O7PM f4 A{4d y%G*(lyBlV~-Wkhײ_C#+yNB6g*(uh]Up.R*(Ef}pH2ےM1XU妢87u$ |2ksf?_Edm章䉵WA+6gLUȝ|;T(~O6J*"1˼8M6q*hϱcJW#j?2I>LZä{ &0 1)\͠J`.HE*I۲@9b<VcfL6HF2A~gH64Nx)"SFzE `- )(;pM&֩ALsQ7Єg Q5èj1U3H#=A ?z'?ݫjQPAA* UP6Ճ*8A` G=NXo=zzm5[G nUuQ[Gmy`7lW oo70AN }^/e\Fzw_vް Pp^CQAH&'O|)RL[PZ77MjE aU3h [Wjf:2F5CpKnl+B CuxPPP dnl"˚/paݛ'@P.k fj=rÞgC긄 rM33r)A/GٍLNف~7G>fw+@ md*'@2-pB3p 'In V͠6gXfbg!v8ļj9$|hL?Cry cJ<0H Hyn= @:,=  @bOؓ p$H0E ,h7 ,h 8 4p= k)#eu9I'o x9I&'ܴ '?W5&N,ώT'AuNm4D-sF ز,IlNh+jl[ڼ̞2es`gjV}pE!1f&$H(8 qe0'P T+ W3U3HIsN-pBKdi8!}4HD K8lT8*gCXG Pwz8ᓱO@bGFwHlz :ܣf03u=`֧{]ز9r>{6g*  ; IX('Ab P!hۡhahQѬP8v)U|3HAR%wEqV3HA Rj)Q3 EalfL/{/Hlil;Â-eЀ-GT܁؆0]Goe?C0o-޶jE: H"obQ3>Sl 2*B,߂{{gGAX]}N'ABIP`x$X.no°œ u0\@ZAA [68ز l nuu4Q/h먯F _li32{SK'Ϸ.y/H) epB) e)Ճ"eT]#LS زLp"q9*=Ry @0fD{X ec 'AB hz$'ABYoUz`[ު(:2uTQ[GnMT-hH&[8A [0A9M5LL.#} RhrB_'yZ'dȴG''T{ nZm)U''A_϶T)UY}+ɖ cgω|8Q&nQw E i Q`(z$ RѦTiERmJV)UZ8ԊT# | ͑-ږ HgI8malsFvT^[Li'xʳw 'xN"߁l `8Q] t"kIb} ~84:=j7A~R5!+  $H,Áȓ PAhh!hۡhap­::BR5$P ڔ*ϒZGVaXY&Hm `ge .Pr2AZinaް -ag[,pHgX+1$@󂲏,7:LM@(:C0-={@1jZ6h tG#F[X1: b  b x (8 AA b W3@P ȗs9;:iB o&e4H(GGN,pB3JݒN~]rϹ{]Ή03d{K[* P!t bixO5{8iL=SeDw<OUW<#Je54Ĵ 1OBAL $H0E1zkf5CZ1:jp;CIX;C]'4Qj W3T 5jh yk|7'ҷ T P= N31eGZlŔ:Q,1k1OK?-Ȟ`gm<&8Ml f(sI^3U3ͷ.yŔ*j -SCgT4ZbJUFeFacصlû[okYTRE=:;C~]-rufTZ5֙thYN~U3vk [C4|w .j6#'u5u ;= `&쫁<rp HpqnHP 㶥r)7Q9<87=rpW~>&V/DUHĻUe@[U̻U#yw+{Xg=AwKNdǞ֩ HLqEO=RQԩ0_OHPP<5λt5A'1 W>'̮-Ȓ\嫃(po+BKA*_T 2B{>G"p4wZUDPgW-0]ͅ{W=}ɚo{ѣ4_8RA"oj2'r^_gadzKO;z4K"`r_ M Vf{~ &WAM="h0\sJUJ~ګ~ڳq,܊{drkVN-*"~O^[)Mɰȯ {@uWA+^7B v7ŭ\rj'yd?XP׫Hՙ3jBnn194Fyȣ؇nS&%[81YIj T#t9 ?3h[SyE7R%v(LfSM9~.˧:mj PSJ3-bBLX Z|NɷL(7/Y e~+Z5Z E2H6BFѡf`XG#v9H8; Bu 3^":P2 R hS= {#:ZЬQupQ[G nuu4֑>oi00An͠&V]FMNLjI,޺C= nFzFeFe& ޷\' ߺ5W'_-'^<-ͼfߺ+&RN9Sf߽y K<0HY4wCؓ $$H(=  @bOu$4p `A'X 4p= l,h2#%uTQ 6v-pB+!Y8c먇y%=W0qBX4< TMd[ehQ-GV}Qr-.'t[+Z5{͐=km F,OoG-8[uQ3Tvf&$H(ɑQ,+H\8 NHZv Վ U@ja34-p $m(HVӃ=zu ->SD.#}8pKS|n'^A;7Cӣ=jAsI~]AwO{jn{L2[j-*{+  ; IX('Ab P!hۡhahQѬP8v)U3HAR%wEqV3HA Rj)Q3 E=lsH.els|t4$eRzE V(Xv PL -pBے8~BGx' o.;( <#Alq:S?v4auTeG)3)?}Q3XC+N/p{`؛ă g4mEkJ'` Ȃ-A@>E:`hȪ@DdK4Q=# p6[1J@~*辶niLo.pibogh.R ؉.RDDliܭ- زGw=ͻ %U3pb[y\a-`ns6Z ~Wnǀ)%yЉX e c᭫(j96{]glƠx$;.?o r$H(@X`x$X. a'A)``ԁ5B+Ab lpe-l:ph^Q_ [l-eM'=`JSF +"6e鼈~%3bJ_巸MG# zFm:rϬ{݈yXC~RW#`ƾ_U3&dOʗ[8r e h[Zlֲ&[|Z ӂV3d*,O2Ae6$7AA1 +edL['')lY" t-xCbJ V|ɧe{]vW)j7Ϗa+AQ;A@w[rGS^5vXPeCA QOBA $H0E QOުV*fUQudp­::BlZ֑MT]&ßg oi ɑ ;]&H>CCu _ pQvEugNUgt'uK6d"o2^HrvpB[yAk p3J3ت영Ze ٳMѪx_f 0D=  hSGCA*ڔ*hS.p p5C]5 RP;iƒ w݌3Ȟ®m [/Sy;uv -&Nl}ghzXG>]' m w 'BNp8\59JfaAxz | _ug:i?L~ے tCCAzECA<  p'Ab)$H,dv0vv(v:pЦT> :6 ڔ*+1qgho[ pUodnL\3JނLɞfeߟ& N-H+NTKobg~`DER Í\n{HQ43%{DzcQNܼ6`N'AB /p1^ b&N Ɔ{'@P j' na4&).C$LB2AN'8QuL,5?æNhM8!Bna>!$8Qf^@sҘ8A4a7'f:T͚!-Ө* RCCAL+ bP$H(3G $H0E1zkf5CZ1:jp;CIX;C]'4Qj W3T 5jxo'=}S8HxKQ pVyA8 ɯ(&N|_X p e^-F[vk34'_Ķj!Bʠ:%;ԙzޢѣfiL_C0쩷 쭯([h[_SzPAX XSP@`Koh)U e8V̀&:83G3`dnղ +8ydv|@fղ XۖZɯeglbv-M1v-ߎײ`KU7[Jf֦Ox:axF[VCp:U)Uoz BA% E>ŷҪҪC˔~;= `&쫁<uܪa-A֍ <#+ :]<#mK+R n0yK_rx żϐy[e Bw:UHĻUe@[U̻U#IT pܾ;eZֳqEO=RQԩ0_OHPP<5λt5Aswn: A`n$RngO6*d2ayT;fWU3>ϒDѤ{CZO(:JA١ZF&l/)ȌNcE !4Fns5WϾzPmTpL?D_=˳p Y_=W~o"a_*75&YL~m6A{"ˏO>͇OSuBZUAiU=w}#mvv|Oɞ7kVԱ'C>,l++ UpWk& Z[zj_Ax㦩o _7 ~S F *lr aXԯ ~)6+Ȱ_A+2k1ud-d _AX+`$ʈOꍑO&r,U͐w* GCQ n󃬨udEXC+U{uV5F4޺bF#,hy=edahTDc+#{X$;?;voq8$bq# ިGxx9 }QآWۈx6Wۥ!2AgyFs1T%ؖ(0 D#9NAQ3~%y^#I*HnĢjK]3fȤ .bg 2 ƆL2 z$SPO#:*pza\%lۥlh:ruthҭE6::l(c?fHWbL1N^N tnpb^;# ~5LRjm=4H H]!M3 @L4 $$H*I3 L$S$d8Njl8ILr"[Gɵ\֑+:r[G=q#F ѯļ33f'ة8oon{tļ9 Luw$wÐѰ0Ra5.'&Ô*^NhEU34;xJakF [Ƹ(r63q*IgM t* i8 `۽474jU5 "y*Gl'Nصޢρ'4~[N_ ;|wk58X ]KQb; ϰ BQ 3a{-h AF0|a^7agU3غw|;C Oqpًؓ ٛ $H.$ L$Sl(16q6 6l۳>X8v)UI3`ReC?4[`fV3(j\ (p"I nL|[o2L1)pN@SŤ'N{݂ 48!w^[׭{PNx^&U33w!:]3&_v0 j}OiÖ3Mk#ti4=r"m\v'H7M2Ͳy=HՔ*L@>-I@>3gY|-u4DHDMj% h>؞ |{Jk6|whyoR6$1-cW [Dt |ΐ4xϼ'[Rf|pH Afгhrޙ- = !aU3J{U3jt`f?c rGϯhY l`e$XnI[&ARITe$MkN_NĸAѩ^WTkiрuh4_-: $A}lI&0GM$|热fQ5 M𕪏/pb1t< ?Jdۣ]T.1z$ly*Y.N؈ہ?r6|nwN\4~K+ZQÖ9?"e~б7תtClkOQ w|_-}1&PW'CA\ LBA\,23 z&d[7%޺QЭI:tm`[G6ҽM` Ru vR–9T+o-Ͳ%ݭ9 K 5lh>Њ:?Gy7jס[Ni]9Gft;-WP|.yϮ>h6u {zՃop4?gzD{J"+ O+IC{Ao {2>Cc'9͚8u%/Y_꽼} ەgG25 b1:6U} MJ,UWPޟ0 mr(T_A_>6.WWfʰ{d,W`SQdLԯ TϿ:2Wxb+`$ʈ77 Ʉ7M;ayb#Z_}6WPGվx_ n5z`pcOg-6+(~řa Zs7I v fX!m(ҏ shc&mOɒ'S4lf2D&3( !mT#u$ʶ֑ӭ#6Ȥ[GnmuTے2^*hoዖQ#4{ϨnFҲ:L'pQnaQ_;/&Dgu3= h::IP[ MCQ ȁ}E{~$pDvuXz:!d΀n6O=Ml$aIOE4ar>Hb<ŅmC 72 8]Jp9 ;.zIl gT&H4? j |h@?E3`cPmL! ;C3ܵ3Xb뢡5{G ];сF]3Nj 5C{؅ɏ'nbV͠sC:ʆLcCA&TtD=)Zl('h8bͰG.6Run9: u4Ѣ[GnuoS~xZ KKc+jpb(N2Ak^N'v#xnpb @BNĢI?g p{] _'-g^F#S5OS>z6'|ܚ} :U3hN:dCA2XPPS r]@/E$(/AP[G$(1A`tT@hva Y+*d=ePGty p3f J皉;'w]3egU;:)pM*'줯5Z?Njg}Qj Ȋk34 @R-k{k q>ҷ_A7(wA\f$\4 $$H*\Gs#S$d8Njl8yp%[Gl8q֑ :re[Gnt'Doy-NR*pBE;7 9nbwNVv|d}?ܢaˑ'YQAeAOuW``ayqxSn2{vf3ފf't(^l(l(HPL'2 L ج٬'جgYo(bϦئT*`mJ (ӄ [`fV3ܙ (j4x8zg:_Y&A|&_'fBb~l5qb]CuIO;eNu{l[žRFc [2\Ě48qM*/2Fc5ø5:k5üܴ'[\ShbfgdžW԰-;uKVi /rIC+b'L L7fzȰ7 3-E53S2Ϭ`KپGEeM24Ѭj4lӭlI&g NL[ iBO|N>&gmty{ [S ~ghngؽ3>Ҽ`K,~e{~Dh[Z| 7񵨚%wp ]4{E]3dWIЊfX,~:8d3-M\Y~秉!0ȦIT`e$XnI[&ARaؖINd6XnAbkAbKʠlآ-l`E[E6::lhux_[# ly/'1_[WG_|hE[Ƹ6z rl9j<޽mQ|&[QA~k4 v'[NtͰ םL0|aOO⣉T?t塃-ly`˻Q> $A}lI&0GM$|wM޺H@> N'  No |[o&81O|. [;\z-KvMA.?|S}ᑱ}'KORu Nd~ܛK 󅽡 Z5賣]fY^{kÖ]}PW'CA\ LBAr18I萡 IT[7!޺)ȬnNnMuѦ[Gl-:rɖm<`7[[=q"ϨMm|^D[v/pb%_&ARR3٦TdR dN6d jd6- |fnY N~r58vNwZݭ׉>el_o]P<=J|581G:mp3qQ]5%w #(fPdֹ2TPl(Ȟl(H&Ar $H.EɅaecgޞ[Gn-u۔'ZG1ئT`Rӣf_K٣o7} 7~D2A\9}xt'[Ö!_5IC,S_l2[|P$H*$TP'HP'HPК8AN 7  j$2cݲ2A>OiTE ĉW0Q o%|tKX 'nG^8ak|?(;[Qds*z 0}otwx 1.>k1o :rZG Ng԰ɠ4fw=PI/2$2  g'n#"!CA"zf gFYoc~):Zt;æΐI\;ìBrt5ä&]0j5!Qڨz,,pB-SO/bgO0kK$w C [Ҋnn"|{58q%+"&2OQbSd;jȺfؖȍ~3a?3xĻ5ɼ[ ]vcNQZ1 s@Uts-=ѫ&y^|=2=29σ.]qFk3ayT;fWU3>5@Ѥ{B@ZO1IE%f菠q-#ΔsdFȱӢrf[g_=?z\ GS*sr"篞Y8ޯփyg7tOGS0/ q | &6=G'Cɿ:^!-¿* *;ɾp;Kg|dOr5+gq{בXp ,ѝy_! 59w~-V Ưί3_ ^CYx_Ax?V`ԁѼ jk=p#~B+C 0_A=!52$Tԯ ņ~6+ȱßUf-f󯠎~X+hc$ :)?2x G)d;̞u>z:x{ПPgՊ oo4  nGy4 >zU! j4Vл>Pp;/w: ?+wk0ŏ hC~,fCPdd3h{*Od=If3,%26LFYHh#Qu$FnYE&:Zthӭ9 :tL9HFΡ>ݖyO1":i6:*ΫHޢv;-іM(+^Aey $k:bμo$7[>44=X&wX2>јH+#}X|ŅmC 72 8]JpM&JW%k=i<:2A S~F[#;L=(bB&[ľv{GCDuԄ`A /ltsO8u𷖳j~KxE<(T6d 2٦zȤ'2LbCA>QD m=rYoYoetQЭI:t谭}ю'4#X軷48qo*w;*U3P' ~a;U3v|Tj=i q>ҷyİ3tSHITf$Ih&A)2I Pc' 56pB L$[Gl8ɵ\֑+:r[Gh2q',}Ρ83QdžFQ$xpgDӌDŽF Nd++$:ZFѰ&XFÖs- NM[HѰ]RQÖvwn-R:>Q5{d?l"RqęI 鬉$N%t8 'XlҜtbf&]Ͱf`8qwNVOhO 7D=IWOؓXNX?oݝ8/2#B 4l~*pŸ2ܽDB8tW͠gnrпGa =!8MIņ͆d$ W\Df)R68L6YE,t;۔۷lMEqV3`l yǶ3tpH 2rx ]iw$8>bmYƷ&6)po eI{nK>'ȱnN轜 x!U& [: [KptE]3z軷V~g '|N`o {3=d؛e]AQM"̔ 3+ؒ3sGbYG M4M4t&[yUЊ`˼yymЊ˔~*-%|NǽfsX{Xogk-o'>wA!1 "AU3öɖ/Wߺȹ w{[3XEF4E~ hgF 14Ua rG3X Hr$H*<sIT`- ö#Sr [ [V-el`E[.:r-ua[G{ݰbw19MUxi78q' #=_>tE [n@AvÖ'/eguW@_ _'V$ʐYnkɖSA55ݼuz5}f!oly`C[6lQ-I@>Ae[W5 cQ|v4 N}oA.q\ n";Zu|y%B+ly1h.NFѻw"ϗ]LR>!֥j=Eǰ]fȰohKתTVH= ]cU3{?#cCA\ q 2@Id Ieu2뭛Yo݌zt(Ѥ[Gnmu6}#glSvZ^Q Uz@+*6 RH÷|:[n78:t}3ʊ~j{&p{m^>=j4El483l45JSzޛGÖ3C]E;C 'kt\zs:c  LBA&۔*lS|M6g,(Ȝl(Ȥf ,(,0J5 ?|'jxLvf=W^QO(8+M\38a~|wk58 }8c2D:=PP<5̨iok[fЧv:d ' I\(Ȧ'RI\(6Q616q6 u4Ѣ[GnM,uy-\(۔mp\LD(|y* Nq&}hp"QNZ^;[I\^ H!N$rRʽu/|M} Rߣn ad_/k' +]3purP$H*$TP'HP'HPК8AN  j$2mGfTLS|)'&Ȱ2Azdx|AX>X xYo D\7|/V;Ww'l WPλfu z /H U3XBb}-Opl(H$CA IId P6m6zfQ,h ng8l;CvY'41jIW3La kCM*%pmGÖ[W٭C(Rx'-3ekVTe؄|U~W>GOܹt`z5lfa˕c|Sf;# u {e^wo[k逆ÞR5s<+z>Mc͈ףV$3R2<%l?GQpܶLEMLmnb#~q28Uf5$nM#+?wkZH[Ӝ̻5;RwzAjD4;Rg>Uts-=ѫ&y>CgEy`y$oܢLX^9U6AEwh̯Ox(toz+WM}'5(:JA١ZF&l/)ȌNcE !4Fns5WϾzPmTpL?D_=˳p Y_=W~o"a_*75&YL~m6A{"ˏO>͇OSuBZUAiU=w}#mvvO&whL$YrψW,Wth&cy4UXʯuT+ku9`ѯN+# Uཅ7+u%Xs#(_AME Rl(Wa3Q;WPebf? Z_A*3&WNIoOISڽiK< k+WP~|8:#3я`p/gO9/P.Zsmk0ŏ hC~,fCPdd3h{*Od=If3_U*KMf4QC2>G"lHmѭ#[GlGI:t n<8_EmBxqNvcFo;E(JWT^G$ֵq@ce#_ߺUhq8jB:^^:~ gg" ~$U3{]!Ľ&lEfyrU3iv ')?X$xEU3`ushe]7пG3ԃʆLcCA&TtD=)Zl('h8bͰG.6Run9: u4Ѣ[Gnu +e7v }ڠPT&HZNd R5- x(%.p|E,)8a+ve=`nNؘ}ytk5C{9U ߓf8 [a8!n_G޻wӼA+ 6[l(H@ r6 r AA쥈Q%HPJ{(pQ#&HPl5HP ȷN 8eF`6 4eq:'Ao뭦 W{c hT 9<#{* ND YN}+{ T͠.xSJ ztJ 7 g=Ү}:wrHHv^ӂ4 $$H*I3 @L4 p҇LH&HeVc' 56pB L$[Gl8ɵ\֑+:r[G_&HKi_y' uN<7T4Я # p'4( ?ż ;o]B}WbQDY Ѱ;C~n%:Q5 A]]3IA\Gj98 $5q@ҩd'XY 4 @n^llҤV ,;KVr]NX>RzĸNu58qrMuȍ3XNg8|L݊b2W:w>⃏$j~f+Kf|pU͠u-ϝ]=PPPLBA2 $H2Eʆcgޞ`ޞf=룈>ng`RuOT; )U6H8N6jl5 [`kC}'N('5_[Z&A~qlKRe;G;x+ߤTK ;ul))C/bM8yO5iro͋Xdbo]/,59co&]3qGבV͠+v~5l)3 ]3t/~ y߇=$Hll[fpͽkoe'L L7fzȰ7 3~NE53S2Ϭ`KپGEeM24Ѭj4lӭlI&g(F@zÖy 7l3op{ xEN1w-uߙN(yÖ32~t+*c\E:/5 }eM4ѢT+^QO9 [t=]3(%&뀆sgudQ| ;O|~lƠe$;zṎé|*Xni- r$H*2 öL$Sr [ [V-el`E[.:r-ua[G{ݰAZ N܈{΢Ac >v6EMDGw1^H \ lli |8mliqtIA~ #H#_wGd1 {fx9jt +CNÖ9!d<^ly`C[6Th-ID[>lQ-I@>A`|T@(q5rJ3ɍmw'҆rip®:)pN}J8/88aND`b' {w4쬈:]{ЬЧ Y\(k IT(+8I萡 9T[7!޺)ȬnNnMuѦ[Gl-:rɖt4['^&H?v[|&W&H 2sP~g(pfkƠ ;>#3 3{y48A+?f% N[=f ['{tp`15k  8d(g$ 2٦TdRmJO)U> `AAdCA&]0f`AA ҂LAo9w;zOu 2n҆F=*|wWOwWOxvO~8ئ E'tn Nc?ߣ=ks Cv 0 a˱sjF_SFuS [F+|; ٓ $H.dӁɥ( P#lۣlcllthҭE6:bRuT(۔l.p)/p";e4=J`ʏ&ȝ<|bP6A0\N(p#fxj'nQ'N,L`{2<#ipP-! [ )US2ep_t0m3|k<ώG|Cf-og`I&u2$2  2$ $ $&N {k$(H"CABj |[oΎF7A}G{vz/ȾңOG־&NHNMTg5qbM E;Ý>;:u;' ϝG ߣRȁ> Au3B.Y >J,ˆ Lg-}^Q  _d(Hd$ ND&A)2$B٬alp6m6GE3l ɵ3̚8!$IW3La f]3Ee4-~2 p}`ENmbE2 Y7:R 3VOav'aG(*p"d'|ܹ['bu03W ~X-&A?@Fk__ؔ]5Hz,tݮVV𩷱fuzZgl:pb88͆RuC e$wjJ w d}NMZ,(S5 x:lh9d6߆}{Ar---tj-u"t v-u΀~4lu=$GJ 3O_XAҟ=-߰N'[ޭ)аX{)U37*HfxE-MARaeQ77Eg9|: |0<#%ʧ:"cyFQ-SGspS<CMML:iU3jv ^YH[@ݚdޭA^>hEgwH3>5jA/솪dWEG,zUJ׳Y>!c#_?m6Az"˯O>͇OSu"ZTCPߓ|><ngid}P}dOr5+gq{Fؒ?I;/ 5A`NJCP׆T2*VxJy ]PΓ@-!X/SlE!Q]͜`S8x`,AME!H?4 CP@g?!#kX +(#My(ARiLK&!H/^J^LȂ:Boccx/A 5A?wOu:sNnO+EA۲aڐ?չ6("X QD m=rYoYoetQЭI:t谭}:u n Q(2A>=}z r Ȇz\rt{.po<6.pUo]d|'.J;C'E<5 ut }>U3Ezf ߣ=N}y& xz$6 r AAnRD$(%۽u8A$(AG $(fǎv2at +^Q&H&4 qc * N3?'n;~,JϚSU)pBs~J$Ұev uVz-w 6uê| 0qBkHnBSCb5pBHH~A8 f$I i&ARHITf$l @Rc' 56pB Pc'4 8Nh&Ar#uʶQ $f>F Y?x&_e<$END hoyyq MJc1$2|Kho]480CCgњ=#VjϚA3\QÖTta%)<ѯ㰙3 @Y'H$J ep4 `fHsދ @ @t5ê@Z NDϰKlnAn8c3W7~~FXNDXnf0WW:22&9Q 8-  {JJuWaK[ Iņ͆d$ I\D&A)R68L6YE,t;۔{vlMEqV3`l 6j]3Ee ~d'Nl7U-OMg_+/p"!74-&=qBeu NHx샮(ZQ7'L|Su8aCSܭDkIb^QvV lK[zh;C~ildKfQ4 N ٻ#:hXв+ut/NOvgo8 [WD[: G*4G$h-IDF{D.N)| >f | rI0G&7޾N48: :]zJ{;'. N9:j2{w+jr>ʥa˸]b{8qirMxE [ ;V͠35H{T^WAPW'CA\ 7Q lg$Cx&ARYo݄zd[7#l:thѭM&[ul-B(ŕMA9'm\ 'o ow/pBuTVWTTdi77]Q&A~`: ѽ|ZGR/bLG/fG {@bU3\|?36 qP$H.dM6'۔*lS|8ɆLaV2AyѠy@3)Uw.1zai|'8\@SoQuE[odT' 7_NL,XFV3]5n_Xnpb]3},o-;z]Ɇd$ x+ ;-~g(p :;CÖ)cjq^ [g4בwͰk ?C#k5C\ g6$| LBA$H2EBD(6zf`(RuvM3!ZvY'41jIW3La kCаN߳ 2$$?cĉ=rb8Cs7WO+-Rj8P|['l̼GW 3~괪f1.U5A֮ xow`[;î!F~mݰ&zTEn:pb88͆Ru?2 ;5;[|ؾGT-ulh⩚MGv{s-??-OƊ=~kIO䛣a=\?@߽jx |Ö{cS&[^4=nJÖ/?ؔ-5 GR5w ?o=:Sfp{ OEgXz~w츷-ϐA`j3 ;+jt?GQpܶ$"&2DfO-6JUy4OV5ė2hӄ@ݚV~4'ntw| HMϠ:oz'+<,A)*h`cEϼTg|BƢGƿGft;-WP|.yϮ>h6u {zՃop4?gzD{J"+ O+IC{Ao {2>Cc'9͚8}އ(hp\[&Q:^I_Lμ͎rit+XXYOH,A"X_Azܶ ܵ3H迂Y5M$aXԯ ~)6+Ȱ_A+2k1ud-d _AX+`$ʈ7&)}]! ғu{ OH;0&V¯ʝp&Z7`WP'Վ \ƺΩ=‹ <{'.Sj}ߞ+w7k0ŏ hC~,fCPdd3h{*Od=If3,%26LFYHh#Qu$FnYE&:Zthӭ2/&P|Eۋ?(*Jމ=&Ijph#VvM@uH'XhT{ Cgtߺnh{A~Ѓ GUL%Q5S jy^Pd* 2 lS=dҁHh GuT6KجK2ut(Ѥ[GnmutQ>~vv(npb43*Y>Bo2AЂNpe,N"6;6T]ԭ54_'".T`W˧ks&{عK<^wfqyyU͠)l3PeiDfCAN$(ݪ_HP5_ѡd'HP5bV3訚 Xp~/dO(jyiB6|g/H_6;hE N1'lw U87f]݂~ǧIUX1~J Ϣ5w *U3UwCFZ5  5_Ew5pBHH~AFƊZjArHITQ @L4 p$H2EB jl8NuuNI\ȅm#7u& N +1GgЯ[SRz3( fbv$|'&IT+K }e3H{] {Я-$HzJyo:/pbtHL#zgxNQ5M=Ơ!^{] 6g [węI 鬉$N%t8 'XlҜtbf&]Ͱf`V IfGjpbL [*py-Ϩ'Nq=zd8c yuqհ)3jpxj2O-,?G BE QgS־{nt58a߶A[7PPPLBA2 H"eCAYoYoOYodޞQaM3M۔*Q$ l5 [`f5!QT&Ȑ;/}8ቅ_ekL7 R/Lzℝ,zTh+1ipbio +8r/|4l5kkK袉L3z{//$lYu=ү"U_-_7 }`k& 0-p{3d؛!, _躶Ք*L@>-I@>3gY|-u4DHDMj% h>؞8~ o )U'xFN>EN辱~T*-=b y!{Öq߉} {]t@r2Ă~7_ Y=62S!O o] &3 ,V&&j`qf ZArg{ vJu*XnIg~XnI[QaؖId6XnAbkAbKʠlآ-l`E[E6::lhu 6UMTw>EjyEc Q2li qe`KiH-aKI` ~je[t irg>wfx7AhXgLMU3dKyfBr`C[:C&(ؒML#vo5ْd huU3|>gQG(3J0l[:?S[ GCu)pBX ZQÖagRnzlwlEw ] qnB. N#z0k g6lx5l9ׅ-wo56P CA<=*ĕ L$StP$H*뭛Yoݔzfd[7[GA&:Zthӭ#ɖm9dK6Ayp÷{ 5{( 2Ax:^Q YFoAzmzg| rw?c+pR. k ut' Cb_DCE 0#hp"FNUtFT͠A|FߣXld(!CA< P6'۔*lS|MY 2' 2jY5 2žAoݝK9᫧T )U+['N38"z gTo*p³ɰ{8<~zOu58[ ܇a,DW5NGSBow0ǹɆ${ͅl:p"/_%˅aecgޞ[Gn-u۔{ZG1ئT`RMk >;F 5|ThAS+{8AM'l1b48a[1 TL|?oĉB <ak,pS~Wp'؅T&kː<,6z$]3_ohErP$H*$TP'HP'HPК8AN  j$2mG[` 蝁=H63'Nh@58!+{ŗxRe:{ADNϕ۽a?/R@ny 6=j(0p)'Ne(rnbj{ J+*1USsV5M $ޭig nMs2 HAu7qrC{g-[˯ Hۀ1_E7RzlW#8OX<.t-A-΄Sed|N]![tWQ*2(to;Bܝ]8'dl3$=J}K%DŽOASEO[iPo?Bu:aב" {"hoW0nBW죧?z*)ّ_=Y޿z֣g_=y޴?zM`j \ sj,Ly,z a^D=L&WrD_A~/-i G3­(p7~A>fY`͠QΣY j8`c}#G!I4g^V yn.9 JKb}$ݜfQo*_AWf͟dT-ܱ_AiX&_A%AaqB'9v8?R3&DgAe<<{e i;^]P:(TsiP7 }XuT4)x,PrN8f["A C#f="1ɢS4h,lЌF,@>"BGh)=Bq$phݣ wʦv-_9֍(5$Zjґi4רFl?(gm(A6[ rؑeFؚ7&sQOkߙuݛGTWd@xjQW,\{T5I2g`>}rDꌈf$AFI&0}(&Ga}&`ä5L 1)\ΠJ` =jMjvD{uϽ3y*JPC|fJ'S3r&ϊuKbBb{dB&Vb&FMx%4!~*{2g1k,sk_% Z2gP 3h dA]ꁃLFCA mM8p"S0E yQ(a5zmv1=Zw=phݣ w3Cܽ P>D!HGw/ԸSwϼ'X`?¾9$ֽ'2@;3a;cW `=d-r1 "WpbGWf HbuDCA>#7 N V (<AAx Z#sGcCQCc-6QAo:h]߰) o c*pB< iUΔcc]F’ׂ*g3l95  ,@ћ \g 'Q>3 S2ua q8ABHNP$t(\\$4p `A'X 4p v 4p )#e{w ˢG8GoY݁xd48A(*pOs;Z[@!}d %8!z|yO[pbvD}P Wna E9˪NTh$}DrC[ זqG'5vu Wΰ-2Um>`'N'8 o0M7 #Q[@@>DD}$*Z(h"3"fK4Qt8aם?-q޺`)Ep aKт--[ [G-yT:&l)ћn)aA>X @,sCjo9!V&N-i@DoOdr8#>2h2gžbcPk:z<ڑuߧ*r ,p% r 'H( [ Le:$$- Z-8r \pZph#GG{ݣ]ъ{w8k"Uwm~Ψ|` huysE [2dHؒ[ڏ-` 9gcg`wxma?z{ al`P!HSw+-t8`˓A:Au$l &#7[|: Ӂ3ȜQ>>oa/;TSj}lyLÖJ NpqD*rT cSW2GxR2 uaF%g/qvxc3g@W?-Gt{d,!O֊ QV0DP 'H(D pS`(H8`ު ު譊#G-{fKՁvmj A.'%H!HvR {>tEaW3}] ܷ*' |Zo Uv$-ݓOT9p{ϤfywH~̧.ylǓ;V%B 9 L-U:ѶTDRmK'PP9P 3PP5`wu&#g0C5ut}T3ٽΰjܿJ>[² @Q7؇ ?^9Y Nxz g{MuWΠ:s]9CŹH !S[޽= lCCADCA  pD8Ab) 'H, mmmm M{цGh[=ږ*+_QDQC+B}mrhl$8 8qV{ Up|"öhN#u;g{'24 eΠ&fT刪~{|(s@ĺ@ghu< pBA 1Np1Np1΍ (EoNp1^`(1\3 F86[uRR|MtϽNIA3Lܽ-g?'-['dJkAuFJ8aTW`K>Aݭ[LgN0Jk[f4Cô`u +ʜ׌{  1]`(MN` 1c[[S[3["FG .2lh! "̍51r 3La rQTĤFӽ5 ;^q)? EgVTDQR aa%8$SW+ HG Y7=j9dot!ĺ9}ۙ3(kI7쮜!:jז*_`-i{hpNp{۹q{ {۹L?( #H,sK [|.h#-U 3FC/Ns$8a 樍'odlsIkE[2wW%S^ScV;[#slSǺR5=dPU mRgd2h)1I[`79v 2g0:@2h>⌚wbaO/= 2>&@ aN: F}8g`\dG*3Wat[&WbpkGm'7O儋aYտ)3Ly)?gݚ [Slvk`n( [,#He $vU5ʂ%_=:~>zF鱣G Ew/+ zgY z`zLy0em 'AMJO, t%0A$r@/ $9WJP04AɻZ ~H0C >;Õif#D)h ln e?B@tZj׏CC Z^t#ξ\`E8BW?}lq8NE%(6ގ+Z[HMasX|>t˽K7Yc Zޯ (a}F5>sۿh *~ӳyˤȄ?G?B]:ObRu$)\BSЪ: ?oBcOp>k5?S:fA@HgF|3=P3Y{M13 lFN,i^BРGDh#Gh#D-{Q/qׇPWԂ:moE939cGy{8GΘV $XoX9|߮9(B4LP1=ڿjVagT{dA(ʜA#JYAme#lDd>|O@cLX$lz$GAƇIpR`[sw0JS!&P E9)|fstz|+%H}*'( Ou;J6jD^&㌒A{B&۟Q1vvkYBNuSW9>k(ۏ۪X'iF38s"dr7ߣAAf((4d- N#V@( &_=b.B]v#Gw&=Zph#GGaEbVb.\;GwAH8ֹGퟺ',BNpBQ3Z5}{Wdp8- gtHhZv(:lIQ3*rQg`=!HNh(H@?$7 $G ('@P y$8x$8x <2gAA8 q4C6|WTD|G9 ߧ.B+L NkT ۂ0%8s-Hw) y $S qFV7fJpz|L3:4gʜ%aKx#QN'7'71@8g Q?F~l#C8 $'H(  @pu8 ĂN,h 8Np8A#4p pĺGJhHݣ8qu$kb AS&n߶'Ľu/|kWdPĖh-w8 ߧNu jK81D# GZO@CwO>a7[vu2g`9ѻv-D90q8ABH< @`OAf(Lp@.z/4in4i +si}{>' _S] N\qFW2Oqw8!#"CUP@ZN[݇gP3 #P~{W`'2-T[ '¾ [M9öz"a 셆썆$ NXD8A)b4mm m'譯W=pmKթ*@Eh[d$l 5!-g3@d 22g EFoP}yKF;bPmЀc7˅jKi4o %8;,7˅ aPb]X-FX-hݱvږ߰9,:gl|ֲp |tj>R5NRN| ACܩ 'P[7a$%S'( -U HnD}$ [ܣPG9hݣ-ADсvFZ[֩k'lSnNl>*-WT[:H#C "%l QO6 Zjwz*gXg7X=`uo+ !s#;O]3ʜJBu3\YЀP v JAbMGϚyf O:MF% r 'H(\  ,p°% m0\AbkAbҠh؂-l`[w6=r{=ڵjE?$ 4>~ݛTEvm$ӜXݛ|;aKǙx vHv]%>U #Î dܾ,h( h8AB h$"CA4 FoUlVFoUlVEݣ w=pme Ձ#ElZCgDڻh f To 3h/|k6fIF&8!&N Nhu+ '4bG+W'P{gb-N{d-ǎ{S+rD,s> 3U[hcP5CA4 P*nPJ'ږ* Nĺ'`b\03g@AAfAԨS|]q{w7uUӄx Ֆ*?*2ؚHk_^pT V4_kE^&ڃ|r? 2 [tז)aпن쉆$ pRNX(3 +=phݣ wжT;{dmK -UM-F ZټiND{/'F2pr*_yFӼ%fQmb; bĥO qvQj?Juk/4mo4m'8!  sBPGQ–(h;<[Cbsl)iRn-Q n%6G[%l~u(r8 [ydyGl-jwjR >s23(–I3쓩v{O*;o`˳-GG*gPyoR  Ko3'`J! _IwA|`3 wpp3iL"pbr~Np# 4NsF RIô(HBh $Ɂ)65Ef9A2i u՜mK^h('Hq|+4'dwdE HߥH $#p$#iTO %)$ #i߶%r]Z$ xUy+##IK"p{B")8ܞXR_$2 /s9< '?#:HHbZ#sSS+_3Ȝu/{9K|֊GB^F "gv{vQ r Q ['#ॢ|p"~O gA-zb cۣh`QN48|aQMA<+ S ֩; aR54`gw%z,69՝=tKWw"gAFP?^cYԾbΐ|Co[t6mIHߔ0DIOsGE $~㭤gׁ~+JED\֊H%O<}}U=e`u)=pIʷ$$$;, H: |ϟmJ2Wg^E-e/{x=ܥ*&%, Gny|A"Ck+<#Z+TC֊,{fz:@^uFYRkE5;#(4Ff}fW raG3H {97l9ќ>9|^PwY$ 5{7{$gBRq\I#I{/zDK(3hwiʈ܃NIr,\E {^WR?(", SxƷo֊ "h_ܷuyCڗmy* 4#N3E#"辜ϥ֊8/Ҏy5.g}h -E[M4ADLx|e {1|yX 0``s FoX&88n YHX$H,lv$Foh,fGcyvNX-C.HwIݥw]xwRH^sLnV{bk2DؚllwŭViζo7kc0Vk<©@Qk O]"6ve *0b3,s'n3X 8Ngt}-:3y\{ bPFm{ YxGbad{TULSPʫ/{3J]$j3g$u^ggH2D%#E.PEY_"]w `zzWW(7{T\EL;ĺU0P*3FtU\(#֮3rVAv 6Xe:#A*pV a_9RylΑhRxGJa F( G({$hPr< ǣ*p< ǣ*%>d[jD|לd\t5+IV0m6]M)p|8jh߲p*bXǧS,jUHTl + a)5cN슯 LI m؃fƂ Rrf4Hnו3ܮ+g]Wp\2Q*=Rڗ!<\lD\ gpʘEc\gӕM1w+&!,Dd1G׫GQ9N}JtDxwʵL׮EpͤMOnI2 "2'+B G.4Zu"t"/",?M"n7k 7k7kn*b4+ nݕܺ+I0]| [x&^0f@wWX-Z\10|s}u%]ajռ+fWrl7aV З{g4?W-:UlrS|NЮeWc-ScߵJ5>cۿv-uc!iR1OLt!nڗ.MXb%IJ1@TdKRQDwL%e&YIKR6dwmXIɗ~LTâH*Bs̅q KRf %6^eS%%HzM0~a)y`JxJ>@yib4@bY+N{iR@M_5X1\^Z)& C#%KjzM{ H'yMIK mB\u|%&w\ P7\)0|bY"տ\\!Z]]1x e"1!Л"1R.¡b\`KAyJ< @>^4 ^,ZS5sgKSü=LtۄKRmrRJ(&{p83&;s#TVf!%,k;a%e-.Ix/(ƒV_\v_\_J9gaMQm[p&tvbXS-4m4h1b-¸4m¸40؀y#G ݧ}|vVr&u<sre~ PW%=/kQd6xŠ(J {r% w3udL^z"g7Ɔ%4ke 2bOo2'F+V>< <,#а xX <,¦kKƥ nM% nOƥ nQƥ nS5تKܮKgD-҄.xߵ`O\~׬J\~‰f1¦KluEhQT r/q^ Dwg;(l*_=h4a҇"}";0ARG J-۲3?#Jb@x2} $ҠӁDaP F>4]1 -a59}L*9܄З¤ӛ1PКtYQTOJQ4zT" X11TS~ 1:3 ??{=|}G#g'a?ѳﵮƉ Kҵgqo[Ӽ !)^l4Nie z}D[()>Q`٣aMn=&(RE~+?SXHF{)zRAo@0)+N[2 D>z6y(t :l.|Xks>rz0N9;] zgYc=~wQ 0=u=udoE:}p h19N"7%4 }DP t{[{hQ$S!Akcd`B z-OSPyI W~,˜j.h´t43($)hyi.hiXRmy )l J;-a-Pr;4 C|+%y>rpߩg{( =t|+H8 _ |5ݫ 4%>;dǬֻ?rP~vP ܡAgLPZ^4WW+ 1`3Y4 N3FJhHQ@%חЭ}Dv =R{6H4тG}%\Q6c2yś89^ 藍@(HkNk4*YwE9( մ{GgsF1>;(s ݳ a dFX'3EGVbݎX}zlYv+B* 6;|Vݯ?>LE=>koE g=VV > E\ΠJ( 1"S펉M Z3s"ŧ9J}2?g0Yi+qu2+ lO]!P%b&^|"Yf+ qf)⁐3'g8}Xo3g`W -sy:ݟY9۰AAf((4d- N#V@( &_=b.B]v#Gw&=Zph#GGabP!H-A eEsB7'vyDǗET NZ4'ڏG'o{g{joFG3 1'T+2= 3ĺ` =r+gгVW ;7=s>QZQAuDCAr! Pw0$q=AAx$8`# XcX(G (k|& A5^Q ANpA#$A2զ QnTD㷚37S<%"CULVN{ ܷ}-r @Q 1ۿT'1i3p s|d9DM #H29HNPR8bHNP$ $4p `A'X 4p ,h$=RBGhH}6N̐_'_F+5L]YWޞ^'T}(6N쳁OdH~ol N(( @b+p=ڷrGk->>2dΠB`3q*g8l6LNPOx2S 4@愋 @ @p9ʜ@ZNn Q%( ~x%8!1*W퇉Wn=<7Ǻ'Ζ [QwUD2gvHѮah{?1unmɻr18#+E?ǰCABCAFCA   'H,p"ƛ1 6z6z6zm׫mȀBCEh[›G _2rh9 AZ #sBQC9ÈX}ITFk] %Rub]w4Q8suFlq&n g`CB]N:n9li#hDlxބ7&`؛ "DrK'[@@>E{I–0(sd>p(aK4QtnDPg({N?%oSe:~}N<#MM?-Mim43w+6ꤝl}kX4L;O]"y۾#f[ƪѿm3(^@FsۛA,suG|2gP?-Y ׻`vlǠ$t,{v:d4\ ,p% r 'H( [ Le:$$- Z-8r \pZph#GG{ݣ][ݛ c.pX; 1?c4`eKؒ㌺aQ–,{ % {rGUs+9o,!W[ "D '@}T)s-+e(WΠ"YW#l7  `( NP(28 P 'H[AHOFoU=phݣ w6[{h-U K' 8q޺: 8q7Uu֠ Kꩋ0j։p~F)}#6GԁpTE}*g#NjRu-V[8|wG*g+r>j m6 `(L-U:ѶTDRmK'`b]0.g3 qb azo='jKUd*'Jp(~{R5S~(%8c[TtUEkA ;:Muz=ڟ͖9.pb:¶7ݙ3" [Pmh(Ȟh(H8Ab 'H,E8:޺޺޺ݣ w=pmKG6жT@ReܣXgw2pqa^޲QCkDQ{E.6yu?u NAm _<4E9F4jD@$t59-k Do*rFlM3EG4Vݣӈ6X NP(1  1Np1Np16 Nĺ'`b\3 FTuP MPTYT W6N4Ɖb?^'dDN XgAބ:#o'Xٮ>28ݖս3 ͜ Pϖ*F-M?:hퟺtߏ׽P .0  1E',  bh&hhfh6_E0hE -2$Vd [|MLa .gp9̜P81ވ Nܿ7k', U H[b+ [b`؆4~SW<ĕb7VvʜA5`d}`.sYrpYЮaD޻rOݮl_Qtݽ+ggh N'P[{ao{ao; QFX 繥 sA{y–0(sg΀>wDA| 8A_a9 85h^S`KU#9 9y*'@Mh#@slyW wHR)l)?a)smir^!zSmZgk?-r3͖[z2g!S8&~`R z&%k 2>) :CA>}0d3 OsFH%E 4:NݗO!Hֳq'ȏNdҠ!ZIrdx+6` oMQ)Bi߳ eަ|  RbNKnK! $] #p$#iTO .%)$ #iۂxSnK8o`^u|ﳋRJkE3h۪["9돎]gEUd#:3Z'i6<:CkE3&3ʜAc}hIE2g`i_37Z+ʜnuaW ?F1l-)م1}Vd8gķ"Q$S2V`:}1dD9*B[!GU4P(sg΀s: ÆS :^E%~ֽU$烈t3JEwݛ&|SYʉ{)4sFcSncȻqNZ+zE^lJ~31l3a17ǺסIߣ^Uΰ4WQ9~F9kХ"*E^RQ>W8Cbz|[=FA."N*G5@3dt ZTS;-$yp[C\uuh;fZ?h+bYN il{5ҠVWpk[ I9D%m IǨlhӆ$$MsK42\d?S/|#u*Ҙ3گ"1aY awgt F;얄NR% $%ߗAҙm8Nj-RrIZ+"W;'?tQ֊G=kOa!HzEP I$i0_/YIO.G)G{iߒKH fQnH0 .K3R;P{>x =] x = g_v QHdx?(HB @e+[MS=6 0}V(؊3lӞDQˮH||[1O"g;dtfzH&`S- 8s뻜aBWnB )׋SLd9gA&o{hSX31JΌ(9ír[u nՕBckQ&J}P Rl l bEEW'=.B `wK>HKK`QKDd믿qsFsGS}d'gX>1c\Oae/{x|Tl0;koE(33bC3ZVؕ ,{d uWv%w] 94A"'zuF}rh`Wx($xw31XtiJˆ$%al xI*,S%'cqI*0sʼn4땬}Tl._jb\ږ9/y7 Ѽ$}<cR-̤Դ{O$%I_%I+-b4m \2{PjUwDBD<:qxxM0~(y`JXJ>@yib4@$h8I5#|izw`=/[M 󡰢5!ׄ!}h$6wi"@M@qOd$3)uizMYKS;7|&mWgKL%1l?O#ؘW ^!׽Bhis;%E=Zwi+_KgM=v1.M ĸ4&8"k#.M/.\8'yA؅KrY0W<'YKSDqD G]߷7^jvdB1sRfj2V7ĺ$DxϞ &*¨Μ`g% o%j-4mupC` nEl[p՗&8k=m`֗&8 KBۀqi[qiہA1#6KK` Gl`^v}"h u8TF+&<KkC"^Ҳ F A$QF' QX_OSm4jVJeLseP8Ta4 xXI%֎KܒKܖKܚKܞKܢKܦKgD+҄,x'OX@\2b9|s{)@u<4Ճծ @HD\dR?:G Btٹ;|vmƋI $$ծږ'C2k+, 2Hjٖ/ tBQ8TAŤa@W} j didrFNeS9O}6 G]ED&H4z9&H8I%$}< V}S@TuBrTsg(H:=cGy8ѳ$NFn^Gл׺ '*Lgq/I׿mmU$xx/+W;7@ߊFQQǷLqČ&$ HGE h=uQ4aG([ƺFBh0HNѓ2z3Q4O_q":}[ zѳa@M)dsGLS9~z.m=3AGJ|Gϊ{=~wQ 0=u=udoE:}p h19N"7%4 }DP t{[{hQ$S!Ak CgA %Sj.S"Vk.HR1.\f15d =(d*X Z)\NAl.3Q~<(q?)FRS| v[[嶽wh 2A -lWJ|0]va6ONck-H8mvw~S\#7XIsA !E|ugf{K,flYt`Ϟ-"+z+MS.gB%PL kAg.Zq_WLlL0Kh_%&1bh_ݲ8p*g09U9UΰW(Ug43gGIp(LpLR40zSP%8 GEh{pфG m{h(lq4(Av7C9z!Hc{sb'8a#?^N '􌰷/|=Jp贖7vr}Vt7'ϜAe"sݣhvrѶlZZ,w&zAuDCAr! Pw0 9 `ћG G Z#s32GA*5ND;3L둩0=Z5=+'LN,EؽǤw) q{Խ7T堸Gyגi} <|^Q 6ʜ9:1v%jn%Ɯ>✁D*/#+Q!Sgh$  q8ABHNPNh @bA'X 4p `A'8 8Np8Ab#%{vTQmmNY--{XQsBg}d-U|buod–ጬ6N̳ө}k j$@jh^ʷjN hZ (c49X='l3$dC2dΠ z 셆썆$ NXD8A)b4mm m'譯W=pmK 2жTHkBZ -g3@dd@( ~ږK2 ^Q8AHUԅڷ->MJpBd JpBx#:BN;Pˢ RhVdQ'}_PzB3H 78sl"ވ.ؒf:ukKxu:r>Y.\e|hp(-`[D,M~E|" -U $aK{9H2gym{%(:H0:CoX-p$jq'T4j78Tߣ'ģ}h–cZNZ+JƱjm]NG}Nd>U}F/>OU6[mOUΠ+uGŤ"yG3j 1XNxLʠa^Q s\u9cz~BlǠ$t}Pa2X. K8ABNP`$- h2 [ [-Fl`[.8r-{ݣ=BZQw\gs-~t'v`K[ivÖ%@lNRÞ [>NS.?c]^"ֵo-{=2h 7/@C;/r{#{4Os8`K- _GQ|}T!+!B q"vT&T!v|'bUa{Խ{[ʜAWv ԩ}͖iΜF|`˘I¡ P=PpBA68NX  qBuFuAuEuG-{ږ ulmF A2 Nj( 7vN{Ny)ƪ@T5z6Niw/|[8AΧO=Z=-}eL*g LڟQ #mpBA, PcCA 1Np1Np16 Nĺ'`b\3 F0 6N{MU=zlC{$ ur|ub?{FG'G N( SWM $'\}+2v  W qz|:͜lngZx꺃3CP .0  1E',  bh&hhfh6_E0hE -2$Vd [|MLa .gp9̜P{?>9uݽl&8!wQ}; _Gwf`+ }D g׾ 3lqJpB$^1lEpU%q[r!=>jKՈaW@ ֮Ύ9.-6 Q{WΰvPGQ–(h;R;_̑cս?gK]o޵`}F j8B%-c7{;{ECFJ [ruإ?-T۟e CQwrR-'A`3-O*2H:4 3 hʠaݻ`J! ^ht7uayp' Ez 9#{2y@5{U˓kR~d0+P7Laq$ Bh $Ɂ)65Ef9A^. rd(4H3Z^8A1!_TVD ) $]B=G?L$ ~H!$)$ #inj Һ%9Nۯ"?[)z$ )8ܞH x'K .s02Y)c 3>ݞm_E1dY"!Z4 &$:+TL7"@V4b`W232hZyђncsFʜAgOG9TU?u3qbćjewR +s{Vĺ4ϢZ1l-)œv+Bi_nqԡl-Nm g4QhPVocH~ 3ʜ93:'{䜱wFǰ| EU5f~LEz1yF# DA*v9#=]uC]sV{Ea 6kte ,Dc3Xo(s 5Vщ߰ku1l3y9e`DrS^RQ>W8Cb'3 b?6J 2GH'vzܣY=ۿcyD8 2;fZNDoV96G* #bݧp*}WDoNYAaݿbcUCo[t6mIHߔ0DI'aC ISSo't':1|'ͽT+"Z+WR~m֊BեHy')ߒHܒc%DM_lÉ"fشŖګcnDlٝVo?"/%uY{K︀ :Lm;yҺGOCT|$z$- $ ]nH0 .G= ^ByPF&1㝒];$uV OB$ĎmG@v?T=V,/Z?$))|=% ?kLrNQ#x$st}uHah] UTh] Z&uWP2^np`?/ ^ *mAߴAsk&6$^gad_F)$`;`POhS <"؊c+<"؊c+R M16eƀ۔8Lq +IWc\$b XMQ|EwHc @C3F,݉2`?TPfyiP"9нtNE8L\WP% YI ݤA%Sq{hƑ>XR0qJ)m x *nUB㔂k_&J7<%׎~ͭB~vWw/G+dǭ~H+eR+TV+9?+ڗ]QNt^"!EW ;ص/ޥ{T7iq`*iH;jLU'vz @E+i? ]hH",-i!VDzHIb4Z$LrMrrmMڋV,f- [zi# &ҫ/Zc/{x&^0.՜$9*瘵b,C(S; b#l]A4yb@ Z^tXc*$sHc W$*"sCDWUIÚ4x% ><+iȍgjvx1T؁!%hF!M0~)y`JJ@B51!5 O5)&CokHi>[Ӈk"ׄA}h$75T'/~$.3 5r 3}KZ$y[%0irKXjk3C/ RT`-0OGOs)Dׂ7~'@FHi[54ڇc [Q^xakXn% jv dkC*1!oz' H%D kJݗ 1G 2%ݑJ#!Y;/P RnfTؒY#YGo_lMp/&4ҁml-ؚ_lMp[5.a5-[ n 4Dckۃ5G8`yy}*ck a5VigwRyZT~65V95(b{IenQQ12RU`N먥BH4ɼaڣe Q@hͽL[Rs.Nb,FbSK!2(=* xX <,#<-ؚdlIpk2&=[ܢ nS*ckZC7-ؚesf8^u򻶭G#ubduJJ[|v2bEY޿ʅv1ŗ/M*$m:s~o@ m ɓB;~'Dr# >yJ1aDARfٌ:L`H1cPU_Àڂ6qy\xSTcH?0aDw ϗ,\G@|HP n*p>J1Ufpc"+)de0;#VʞҋYG]KGO(;zP1O`x}{_ADqn%Zwio[ϼ*CR`o*wJ -K'oQD0r:%`&#f4A'i@>b}-E*bE[ _E (Egrf =th#8Eoʀ#FRi.>AL+ Y$ {Br\#7#W~ ̲qxAa]AJN\߰V{PpL 8}@j Ώ Ai<`>\ARs4 Ad ZOJaqP:6j.>A+շ Tav>r3u6߿g$]ctg;$%g{FYS3AԼ}4h͊ |Z-io^xƺ}gVgAR9c0[g+ +3 'β/ ׉U"r`g4<|ܧ"G gd~NJ`gԡ(P E?#ջ+ZwrЩnu;)Igur{FsM3 LS k`m"F]fBĺH+"w?oßO֊nΠ~Ⱥw[D?u7gňu ʑgAA'PP)h(D[,EH0E 'P|i5zmv1=Zw=ph#Gvr6s!Hё ޜ;i |^C '.8ٽA?~gt NHJ9an^GQ9% -3-k`K!,P;2 I  GCA"P3a#'@P + q XX/Sws$;7!) wnq mٻDt3 N@GjNc[ 1ղ N>{Mbv4c9gM Sgl ME{ĕ3 l9aaewQM #3(_eɞ]=N#H,  @t8 $N'H(\ LH,h 8N,h$=B'X N'H{v ='8J: z l# Z4)27˳HEU3ڑ=>qB!zSwF4{3{erӶlnΠrw-9йGݑ*3Ggh  $0'H< @@'P9BH.gX7g@V A4?jϔ}W'/cM'rrM Ns_|k?Ehx]pBc!o*ҏu^\q5GԥwFiGݟ:-UXzlw g30?ujf߼G̭:MT$ BCAPtBA  H'H0EކކD)GжT& mKUR{5!-g3@ҧ-2ܜP8 q"ǣ$ ?|= $ N(QX1p³#8!ǭ{sB\7v1!{q T:g}DNi qfll{k>9 Q\ݜ}$7gy9=%(:H ؁gKhZTS'т-$ֽd;HU*^ؒu!l{eEWTcoMћήvobTgtXؽ?2h}zvse7UoXTo+@xݜI1Q4Ěwh`$X. K:ABNP$"e$$- Z-8r \pZpQ#hgln^hpk_:x-w/p"[gw_ N-1gKޭ;tPtaKNS{ \S׽F_>#( LhꏽEbCJS~!*gH᭨%ϨM[lh噳Bu– h:.l t\&֡ :n!3@5yNiA~C#+J?edly0{=*p-Xk)8'2uߧT>ڼT9[FR;Rrgdfǘ{Hr90HPeCA LOPe4pB LQ NP*6z`*6zpфG 9=Bl:mTCb 3PCF4ڟQm?LZCl^ NNQ Ni GU gNS7PT|ްGV%'Q-UQݜȬh}#nΠYs--Ns0D-PM'H,dm0dm҉J'`b'`b\0o΀p|Mt4ƣ籜^^qb qFwHSFNщ.Q2 N UDZlEhUdGu N?j Bް~s{]4k^2AG^[|A3dOot\P74' NX(Á( P `P0{4тGwжT {dmK -U6=N{s#yAgSWSk]pBgH6~2وu# SN0'FND/|ƉD{Uΐ[[QfQm@ $' }V Ug;$f`cFX:AB 3 b|  (EoLL (e\2WN6NIGˁ[oZ6R4S~3O=mrǣ={8AVb&`?#7 \pBƱ8a`߰zsց lJ NwXNWT9*=֩  1]`($ bNX bh&hhfh6?E0hE  +2 [|MLa .gp9ü9(Cg}x8Aa'"C9)|wo N[GUQnY?o['2uwGU~Dc]pBynΠ tqhR'ֵG~sg~s~TGTgm~sAQy͖9ݳ '(-_h؛;Ei|qT|!h%=9(n΀>w.l&Fz:HkAs8l,o`yvq{e' a縰_i [Mb#`s\RCRQwj-^y3ڱ{knz;T #~r'SmԕAD'2T*gOyhҬ{Dub'A:>z_d}&P iyæ f0  ,,p' ;#v)'&8Ǔ;81 (jTIJ.Bh $ [Slxk orT=^b#  j_&.'HO,'H]28 rٲl"%\pxZTg$g̳SnphGU9dڟQ +'lV g/d,hU9GE30gڟO{w6HQҾtz(pԡ>L13(g4?E(s1$?En΀Ҝ3ĺ {|cH(a[݂ 8խѽSX@ƺ4 xSwu3Epk@^1툍ĒZGCX/kkT@ٓm?s\3,Ϝ֨No qV<7g`,hdCe.9^*gJgH,7HeKO8J rtbUsDy Ew RLBz!jЩA?#)H'X V_|(ћlf,;HOpU"'.ۺ4=RΐEv"| =H1j$3]V$+ib%+ $~\߼cI "g_kEqH(@X]J$w#I$#oBҙmx'qm>E,޲:$]3;N">p>4>g-:,wޢyfyJ O CHzHwiNiKHBz/+$=Pa\x ,Ѓ=Lae/{_sȧEPj}"O}W2cy9+^ܧ.hS =$-4X@cy<=$XBcyK$]Rdxwiݥw.]JRPb+frzيa _RgDgyE֊옍cYB̓ "Ѯ}}_`7E>XB"*nsvOV6zw +"3 M+%cp n">`V$8钥{$H泰 'V1>x ԕOR`xÜ7o__j8Ż?BsU ;IW0+` LG7`o6R$=RJH0J) $(%w8J)$tDDpRGVYxdEGVYpdE䟏ub-ʌ(3ܢ?+fvu/ǨuWӓh̄Ϧ>q1Pq 8Οޣw'tvC,JP>WPT_$*$ *iG؄TIi&"2ԎL&A6f!)hR0ܶ`mWQ R v.`RpD2^ ¾\!p̈́[ 2[1w(J$ UWw'C ȤTQgm Zu5-xYz;܂a(,uL uEX6 ]W֮10t±"  u4V$=+"#$1+&p3p3fp36fr+N^- nUqu=Lae/{_tjN2_=`)W.tAoCg/⟩!vWD(Ux aV-JIE0J,xGY?|#ƺydcWiTCxOڐߴ5/$/&sXJ.B g~\$OH>b2 SVVT88:.-$)I]L:ķ  D  ^˜.ĺJG).ōx L:?1mMtU_Jْ~L6Y[RQ5W[$ o-i߳e-<֘^ -_ ߠ_YޖDe >d4?wojnIi-{[Rqd+UYC>Iӷ>nyGmӤS맑*aa*[A[![j24Nxka_L5}&R,MڇFLbs[jzM{bH'yMQ7a!ob_+jDM~bƂφyj/ֱ[et! 1e[ҥ08/* ڷoW Qr[#1blMp,cD ]ؚ>]ؚ [rEY0W{N tn`0%;r<$/Sw-TJnE#'ɕ&ښH.!E[RH/5R) cyf*!iے_lQ mbkA#G1ck[5XoMp6[gd5-=[" :K7bDRۅ5-ؚ#0p<¿<>J5 [R VJIt|5ા%Zط f*h @eڗitG+y:A4YpV{OfOsW1yڷqϒ6"8ѸeɖT [g+)ăWhh[ghb ܢfPT4 xhQ%֢ nSƖ*ckە5-ؚePţ!4D>{('"[ wNgd =C\ױVfZȉB6f s<3E*F\3$Mr:NQO.^:U`17!M >MtO(9[ƌ`A ;Rx^3DiR FD]%2 //a5!98UiS!VҨSlCh\ϴ)#6HkS nl*p>J9UO Vig?S,!<*z#ᣧ{?zL=b(zyF'yB0zy?T࿯q8zWt-qWһm !)^lוW;7oV}gE("E9D0y34 }"{1 ԭWфQ"Q"E ʙik$ D)/c E'ҭg D=s>t^ hN'S>z`"D8գ|t)矃虯 gzP=AG6`F}SAғNd&(NP 1$rA0_B?A"HG@'%(Izἇr ŒZ':H Oi.?A6$Gh՛ ȱ~Bz墐\]A򄢹YV4Q; ö߰6P1{ q'v#d(u9M4?A"hmDe=|v4O}үc7ON?AF0j= b*^Ac2VOC'j.h(74$r{F=l{=rA!*1ik Jˋ}Y })j!`3f4l&)`cf)q'@4SR/!"="FG$pHڈ#фG 9= :N}mT;Ȓ3Լz߿_uT9SM;9׼H|޿OŬiGS>xvt#T 3bTpMGR9N8lH)[b}$G\ )Yu(B* 6;|ݯ@g}*>k{2>|?@ϊ{ 6A|ۿO"A @Qt' m̔}`,E KQʉ!HϻRwGTJh |%&#+'ҽrbp34ݩwӇ]iawS;?DΊC&8ݜ:?hޜA-Y$Z ((4d- N#|V@(M4{]6z-G w M{ݣ@Gi Ct ~ e$$)L|/pBNKLCb~ btZ>z_pBGX/htbSn;n >΂M(R~`K#Fll9@q Q:c ! h(H r>X{ ƒ7 N:u{F9 QqL4'6M08zuݣ7!TG {cpB}Լ3{G BPSeA҄SǕ3">bT+{Igt}w=>i q:ABH/!(  @tu8 ĂN,h 8Np:A#4p tĺGJhH#a3}qtKay-<Šgt  o'ލ'x( N'ȋe}~6Nr4[~g{GQFx k7gP9O]7ݜ]nΠc"`ol3gퟺ@&N'H('H< @)hҼ 4/8 4 @p9ú9 ~6N#W*p"Ou uLW8q,|'XgT`XWƩ :C]4.8iK#謹|;fNX{4kKNG^9rvr3G'g8[|¡ Pw4$=,$ tSh(Hm(mmLX"{pmKb %d\kBZ -g3@dܜP!H>d {|7$ 3#}Ą x-7'~ Bqb{dW3Ϩ`9tҽ9!T<ݛBqTQ&ewHL(~"Sǣ0Xǵjiwu\9`\`igx#Ϩ*rxFsEhq#ބ {0MyE|"wKȗCuX –0 (#9х-ADсvFZSSm:#eniD?n"[R[b-ؒ$+'zaK6A0G-rhc`{lJ~{E31M 6tĚ[ĊfİX 3U+ؒퟺE0[)c]yaI`yb4ĚTCްrI'H(\  ,ϝ X`$- r-BKAb \p傃-l=r{h=[hP G(|'v8a ҽY[N9-1!8ϊ + [r8N' [NˠAݾF_92ؾ3L8E ~ږGQ9x6ĶWT AȂ 82`@-DAuXqaKX–0-gqsO8!9݌&]4ݷhA~#d{XFl(Ֆ*{X9 `($ 2ѶTDRmKN-Uǃ 0.g7g@AA ;:CA [jiŷ$F'u u3YgdVV?ܲ~`qlߣ{oΰ?v W0Ζ }^2M) ↆDCA  q8p" $ 6z6z6z6zw&=Zpږ ulm*݈8"Nl!H^gR+C,aﯨ tױq S&d#ۖ qG-NRw|'mIϋ'y˨ #yH"l9rtƺAoXB5rNCA, PcCA IS, (Hn| Xw X3@PK#wnTuIGo ۤ =M ctҾ%NB'L.8vԽJ,N_ǣMVEE6z}AM4Ljㄌ ux@8#9DL c`>gC:-U!  b:PX:AB h$"CAmmm m-p!"C:AbEyaK 3La .g7g E5WMa`K6No[H>u|IԵ_P:#v H~`Kq*pNR N0?ڽnΠ: "2ܜBW3MA>9gd{o |wL {eoΠ;Á~ /4 { N4@[P@Q\ݜ}7g@yłGDA#|CԽ#6'l̳\"(p"7mq N˪pVOBcV +s\Ry+ݦj-uψn rr, i ռ4rA F'n; DYݜAƱZN9k]d}&P i1L#`$X>Y. NwF SNL!Hߓ@a\$7irdкZI@ޚ`[ uБҽt~qEz6/?#l ٧YѼ(̏֊V=ugfoo>OWW!1gް F-nqE{^*g{Uΐ@Җ^Q 4H=S]7g2Exî3(ͳἈ6HQҾtz(pԡ>L13(g4?E(s1$?En΀Ҝ3ĺ {|cH(aS%N/Sp+"ybtuJןv_EguG|lp|A^`:GC>a*@^1QDqF7gP?b{|kXޛX'g.?Ɖuݻ-kܜARQ>=,z GA."N)Gw@x)H!NA EIEN ?Uk'`ŷ;Yh[iP96+ߋoA{Nzqu'NU04ȚwV:C?Dz$9c!$+IL9%J6djj?Vy\a$uyN&S~*(OsS֘aHebu)p^Jʏ$$$!H: | ]i 0j->Iy% َVTIC~h+i8L=Iޱ֊n a+iAtZ+kQq{"H F$$#3JbIJ"`$&{)p& ]B H;@K>F<>;%e`:w]Bc{~>.^Č|ũqj?Ol ڐ?"=ܛC0G>n9o_>yl[C vn wC)t**SipJ|A4*m`]G/ i~"~Wf Bs"$Lp03΂{Zb9#FzHIZh0<΁xIb<.g$ t>#IxwĻK .9] ^0z ~\@^ B;S/`YPԃ 7™2jO5pt춺PoF VTOn qNrc+p @ s >Ycd>|S^{J(%։=yJm֜pAu;'!GwNRJA=q(,\ET;=s_ROݎ _N{EДMZW]$_?lőҾ L_2^V"hD-"_gdjwlHQJi! F)$G)$ғ&hR <"Ȋ#+<"Ȋ#+R ]1veƀەjAHZ^1f^;1KĨWoq KO]mR_Hw"3oV짮,xLdV\6n /gKnCp g{= [ @@6ci!E(hR0ܾ`}Wp]/4B)eW/{qJ]_~Ȋ+C.Yjs+%+\[Rd-EZ[tEAYhemBb"E:G~\\ "3$ҟ ]WI͵hLep 9\{T2sm!@\')HPG#E"{HXHw$Vi&Hdl"n" n"&DXUܺ0uW`a­b81񲇉=Lae/ZYhEnD(䫈򤮭]B&gkԭZ!N_V0 1 [c*ĆXV,vXd]dG0P9ð30 dx+ ǜlcB0dOcz k&4Áqp`\GS™rora//)81]B uΩ@Zրxjm)±[B1&82,}@W zak; /lM˭d_9oM5D=N R"|;P_`%T̊dF#UǐT<{SJҚt*K">yobZh/&[ B6 `lMp0&8 zkޚ|RTF:S[5ؚ#0p<¿<>lĠSk_{k)O+.PoЏ$n;ZiI%J#q-JҌ>SQh(޿F$(?ohFq0j^q;T3LDٟ%!*A*}*s'i)!l [< !b?R$o˟hiU>h@'}8 :QT!Ť/a@uW}q  ccgtcHNS0,qH4XDT~3KBR]G_JgS4T"MXyLM"r`{lbslʣRx~[$=|}G鱣G EAޏO2i_AvB. M/+>rA鸾AA9jbqFF'v#d(u9M4?A"hmDe=݊#HA '|{"I=!|BM! cWk\TͿXc}؏a"I}VnZ#m.( QE΀h7٧"V6cFCf(#6 6fFcи Ea)G#{pmđhݣwS ޔ8|vpwEwQDŽ0te)-ϚwjҔ+gHGJ"{))U>`{޿g$2;*yF ˳Utϩuqx+{8#ܜ8ޢ`#hg\&Yu Mfz,Ys(>K2Yp>u(r-TEѝ}1IM{띁5rӺWA,f bL< ũ9rڿhƟ+*dB'Cܣb&deo;b.?f:MCVEo% $ 7g[$TG4R8(ȼ 2 hhih #=J/?!Fo.FGK#G-{p(Q>~>xur׿wRd+*pfTa N[6G~AS&nFF) 'dhZuw'"SM}dC(c1P\Pp4$ 9 <.8` '@b@PN#orLyͣ 2_soNxvx47YUtڽT&Ϫ: NB-8+'A> Nذ0蘛gdHL7gy#L3̓?9D'+g`W+gxv3_nb|D*/#HYPAbHNP$  qrP$"X 4p `A'X N'H{NNXH )#{T'B|P:cPh N0w4^ 'z=uDw'H'=tP3>VD3`!7-UgXw;3Clc? ryZb=S!o@&N'H('H< @)hҼ 4/8 4 @p9ú9 jyAFɪr#U~w*_qBfԉ0B05k=otM'tnu %:Uu!*i!Uް^9Èc׽?[8ʷMx 3-lMl_3-w>P_h(; NX(H:Ab PP0ۘh>E0"ږdmqaK h9 AZ -gqsBQt yE캻˸#Аt|wwW' NlNtĄj BN::!1'\O}dFE1UO]b!_'{*2vֲp o`cFw'H--+GkOutϽ 1 <$ F'/8Rb {KE-U R(H.l sn΀>3]MLx쌴نHyFػ'jh8izҿe;8!zaK6>l^R% -y$d?֥hRNh[ YSmߛ ;*/V9:6h Ji?Y41ݜA^;AôXG7gZlǠ7t,h&ߣh`$X. K:ABNP$"e$$- Z-8r \pZpQ#hg(?ۖ v~ }e,Av&~ %73*pb7wT/R->:4]Rr FIZ+愝@lT@+b2*gЙh{떨 [lhBu– h:.l t\&֡ :nC*g_P|N1n4*|J`=Fub7t } ~`ӛ|-MrIiV{Ě*:u Yѻ6[ƱMl3ȾA#Uʕ3DdS97l󮥲 (  (N` tU![U[Gw&=ZpfKՁvmjmZg_u/|km2tCT'yebO}I zՖ4=;@4WN7z-1yo[Z ! NtG~`˙C'*g r*g86i rPJ'ږPJ'`b'`b\0o΀jFq~Fo6-*pbph?L pQ Hi)Dڛh!D NȈcԽr Ȋ1*gg(=7g`bkKO@934' (.X? ;cT 5ex֊S$q6k{ES~ nhݧ!C{-(>uNOݽz\N.{O2Z3S݊C>a=ƐOݛ ({ rɞl^33 WGkTrLzY33'>RQ>W:Cb'<3 E/=(5ES҉]>E0 )fw$B}kɠ|| VA˙jow%z,69ųκSWNN>񽸺rg3JC W:C?Y-Hr IǨCHWMsK4d ħ+ɒ60ISܹ+7o$Y"X;s:KcE~w[>ui2m֊B?(K镄NR~$ $y$YIo.W)W{IHx%u.IC$Tx&Å)pa-e/{x=ܥ*T$?}VD"Ui*iYp^kIz/e7MF3հCC(ZhS3 F)ʁ~o_I~šJ"giGZVt1c;I {ڟMt"$ ^IC5^|nkE7}EBM=~PwApwHIzg$g!8D0HLR7<߻2q.`oFGj_q dȈ?k=i)=_C^C}>}]$?.'rv6 mX6dRP66h6`Se΁WCpl@03 6WdxRHJi# *áJ# $C<"+<"+"|naf 1fƨ0)QKgrۮEX@=F{[锾Iw`r \]R b. ve:>AXi~;+*iXiOҠE}r#I+QaWPMGIbqJ)3 *nU0Ϋ`W S:8`A (}sSy]a.[\1@Ψ6^DpG )8gzB~ r6!EWdaQ<0P+V޿{F6$C ʔ۔Bo /'mC7 4V Ѫ G.4Z$hHI,Z$E DhHMMMڄʵX8 {*H,Uہ`f͊uޞ`\WgSwdBDJi34A9ةb]rL Cry fra>B2iqq8w88KsJ@W8cmB.Ѓ½2g0K(3N ǻKq#HߏuL[?5_3#lޒ.b Q ߒp24sK*" Tp:;UA%]:SÖ`t:+)[Ӈk"ׄA}(qs[jzM{2H'yMQ6a!_[*\ `ҖTt__Z)k?kӈPKa0X%f, lKzlAD<-xv*:ےHi[54ڇc [Q^xakXn' jv dk3L*_Ni=mȯ()ْ>٭6^́`2@cޑJvk"0Y#\Y[/xq@bCӝ|F}Y[-jؚ_lMp/h%؂5-ؚ<&8 zkޚ n FRۄ5ؚ#duV7])gO'u>@c`HJ#~v1+mb¥c) f0ډ!惞J0 Y)1 .CO}p/K{JE )CX>ucT*"Y>pfF 3h BGg=]x(a B,U 8*u+ q#.uFhr:F\ױZR3%ړpHVe$U>AE#y)GdPU_AMdędgtcHNTy?أs-bw"Qѻ,pIZ>{ "/}6H>J$&gSıcFH Yv!8^Q a{M`G;Ӡ >x޳Q0:aH[2*A4O_q2:sy-<0uҁ4p9&éY?LS=xpΔr^|L<Ń.ϔ%C`x GikGp@uLQMN3yFƄ8$&Bn%4 ~P r{=,R)Lb|!ĚZX/\Jq䲛:! co4; iys@3cH(>9C'/v~rln9 O@X96<ǑiX^#>>@ = Aoy<> / bh~ BK@64$L si{Z '?@Mrh~! ȋ},> Zinjqh F3(%4"~ xGDhqDG$pqpqFq$pqhQdr49·Et^ڜ_BL(V':'((hjFIuсڳ5yW\dz~~m@ͻgKlmn|sݘq|4qV޿lFfqS3l Y3= *Hg$={K VMoF FA;D(r`~Ϟ@>k8%"Yqgա (fQ:O_|e کw3J$|R=K,{AT"-B;2CwYh>,%3v{~ Ϗ,EKy&F5u5ee.kS);xwf ,q^>^))Ld d- 'G0D M Y=Q 'P|aE]F]GKHhт GGa6[/mbTeR_8Rֈ$ Nsko"F;G$6ѣۓw 'TҿK8~F^5su;'Gb^5YH|޼`kD%oQ Qh>Ѥ AbXHRhRw0))8Heo)uS 'O[J8!a("[L?‰vU3bS ''eaAs |gfاRmr&*/#Has7lAb 8 HNP q4:d 0D&@bAN͂&Xo4Gy Gh 4G+H-TgYM ‰Fw*N-p{XRsDKu[8A~*9>UspˠuuV ]>Nޖ%lY3S?d8$[ 7W*H{4[- F&'H(O d0OA Nf 'PHse&@M4j5i% eD}rp"Hwt vwIJᄨWW!hՕp9]U‰ ^% Ҹv*Zoֱ{랽w 'bhw b2RKw-`D1Q k? ' M 7$ %'H0D&qA޺QoШ>Ѩ>D0q2ږv 2жTH%kBZ fZf@dd@() RF 't>ANiU R8!H͛B%'=аq ]vĄΈ _#җNKh}.`{Pmλu<ꫳAx@ ʚA)uĖ>⫳)'H1 7 ACKG&NJw7MdoFW'(L'[@|" D'h&f@$khQ-A팴ĖNiYgE_Z[R8i N<|{FΉ- I4Ŗ~r]3u 0|hZv3˚A!IJf}u3+-X4 ={ۏAÙu[A<fo:%v JAbgGKظ\&,pK\Pr 'H(a$ [  t4h"Eheb4؂[.8[.8Zpqh8%0v 'j'x lBî͖v u)T?Ѻ]b߲KlI#gT5%[:Ė&<\h(i&H%41hX[G-Ar[:AG B>IZj(uKΉKT՘%]fC(Fg]wٛҏp"iqQ 'v:Jᄨ!HAR8wEbJ%.Q*D5˛Sؕf;:r G6j:}o埚rBYФ &Q60)J &4D& 1@QoUz`[ު(\\M8Zpqm@#ElZ$} ݷ N'nNV-wQBf@[ US8!D!@pb@{jm jZ͖N -Uj)0qF=YmZSnX͖j,џa%J{DU3 h j&pĒL-U:ѶTDRmKNN:af̀"qb$k"?/xy:g*$gX?'ht@.!*BfX)ˇ |w7ue)W =uxMbR8!;&1jyQO[v fdGT0*hW0OͰuY31#L[IAIAD$d '  Q8AbIAШh[4+ .&\-8pqږ*h[lHU 6J8AqXi6'3HҖ$)Sm'F 'np1Np|sA6hƉ5N먄CJl9Fj5_{@5l0ʚAbGkʚWٵhm0ZIA, &?8 RNHA -{s '`r] '`r\Y3HA, _:>"A dw $A@D_R uΉpڟiR ?:U.)`:6Uֽ)%u pbʂjD[:Z5|²Nj AwTW8qka,B䫡IAL'tIA, h‰s!"0)QoMШh[34L-̰2ep 3Ŗ( W3La fY3 "A7q,ᄏ3@&)`;MU#~oR8!N㻻\gՖukap:mؒcP_'3WמJlķie KF{ʚAF-|_apng[Q (g̀r[H4~r4Q[bK+9-}[Ѽ]%|5̑bK9w:͑bK]h/#Ŗ|$jJl9v04[Ma5@[-gT5C:)kg/qw>äZ0'nFGD| f8AB ' \ 9#d2y~@yuNa-IPq uL֔,$`tBh$IByk(yk䝵u[?Nkvo:A'H ka=^|Yl"< $z!$~! IAQA )$ ii7`z 9N"V G.9q3lh' ݈fm3و>{?Ɛ$u?5G3ֈfPQ{DY3S|cNj5 ]3_] apFY3sFt $ -?PƗDsF rD}u(<3{!& o1hQ ( Ϛ%9ős: Ægv{<&>D@Ϗ|&"aO[|%lhdm>ʐ<3F}[32h=Ɛ',\1<_ݣaqc3?"k(k>ŋ#h/WAkBrI̐5p(>t̏֨aUDkbQ b=U^*ʳ|3$$ 2oY'6JrLbL%,ZT,q^HQ̠gԾdA* _ ƣYl`<54_>t,zQvx@AWDqΐwy`q-@@QپmHBkʄ%aC^HvA@: ~GEzΈևHWQ!$!Xw̆$ΐ!O gu)p%A5ҡ7!Y=}tǰi&$RJD[!籤+;sцC)'1 @%_ozXB!2Wcd㝒|px==(&gRQ*-!,(3N|[|>dӔl/Ƀh}-;ߦ,T"ʺA?aS <61`S Wen"U#nٰRggaF@MYд;<%;W,!WI4H My{6;g$g {, K$R,)^,^,MXZxbb)%Si|hߚZHd?TZpL>[SiaclvЂ>sc-TZ̳7hF/ޚ"M";~ǐ?$AM~tq.Y;p8=PβrPw?1(,p, m4ܶOg3- _I,eٞQ퉧 kOSBiNaL(~x#z)Kz'tY,E*@B wfZl+ZȱEa(4rUR i oJZ J&~TrΝJ*2@vU:(A0$UZ,J2ͰDS-$j)%TK{éZL֒hNxJ SZ8p<)-NicŒU>Vi[飤HHԂkjk㣖ZFXa p:3OiO%k N8Jjq.(H%8~TA0JbT*MStw{LlhWChcwI,Ւ3M n!vaa9/4ՒsmDi2^ #J_臨c[U'ւja2KR mTJ>YK]2vI -c olhk4O9vȵDbHs,Y80 q]h׍RxJb,<|% 1rMp ]38M8230uXnp3PC*Ƌ%ό2ͤcӍgeuEK7ZJ TRhޘJy}Tj//1PScT/ߘR/nL^tx'"ӣ"Fn?1e3F7lR&,#TDYE=ml!U 6)u6iti WiaztHDXkoL D7oG=!0-4ύo"O #X:bz% p"O8qHStL'`h7yA oLDk1@HJ)q,RO8m>G*!LnL5" @RKPސJйMSSfܘ4͸13hG'π2ܘ>}$xjL, cE+*zcZ`z]t S+ aI~yfoJV>yr-ZRr C4fq+7VyۈqZh+1nLp;1nLpK1h5%lŸ1Ÿ1Y[ߘ༭)փ[ߘܭoL m9ƍ n;ƍ n=Mdܘ6dܘ XGl:b#)z,1[kSV&+?L< sѓhxߐ\i ǸC_FeM.7S8W~z LUAܩPШ "v:h(4n|_tBJe`# 4<֟A#!8'<;LAOAOAa]@ABCDEFƴC;-Ҹ1m xĥਓ MȿAG8Uv#XoV&.FDp =714_0VZΕ߶k0*!(HJ)APT uied *FYDG) qNYDq`HVSP!"hnɫtQxсI_u`UhЄP_M~8FTޕve&b&]0(H+!G H^kc>JzW]Ow%)D"Xu#+iȪܵ?Q,{!?ƕ;ҭ]t?xi{G#g/a?7F^Adq%һշ޿/7_UBxnY:u{"`:0u )G/^D h}uE4a Ѿ PHFD%b D'ӭ3g s>L^ hNS>x`2ʙd8Ճ|L)A^<(m~THd㔩9 N@6/3 On):}GhCws@BЗ=m(<&rh; "_<"B#b8"##4#фG.#ݼYGEDgyBwqi5n'ή&: OGQruGK ~Ȏv.َ9ºc]s{wؖ5.jϩ}$Y3kt R5GWfX0fVf#:>"WL0vg} aUOЇϢ` P ZR DŀV"2&Ң/ԟڿDbQ3{ÆڻwnQ*&xm{i.%s;3t[i&^&6s ᫛uDΪf ?]UepWA>jf0iu9*3Ȍrw$8)Ld d- 'G0D M Y=Q 'P|aE]F]GKHhт GGa=Z7v }۝$H$HcK޾M,R rNV}u[ip-B-mȳfPz38D}#J截f1z AsDU3hHI/^z [#J$ '$| 7L rJ'@ RgD6UlGlQ\g%rNQ {޲2?ɪfPD:ٲfl_$Ɩ5}6P{ JH<LSH3( Ҝp{ F Maè"@Z?‰0xfs;^)0UW 't﩮81W 'δ?NW '2[gNյ&_g0n`=]{m.蝗uV佧ojQ3piN]'(k5cJuO8)^hRѤ % 'H,D21zFuCDц h[*3@R%#Ŗ h5 AZ f5 J$MU^$ 'ȏĄJ8rѾ*  i>J ";uGTbck4hp=\pc|y!P $!t2u`4 g |u7ŭ.ıEQ 6fhFKl9%ݳw9Aʊ f{p X Gh NtxބL&a|u|" D'[@|"vI-a(kHf6\D(:HK86'c|R8jwKT ==Uh-ל7Q-]rɻwT`F_@PU,kkJj 3SK+uߪfF^}6a% [J\7+3[jfqh5bcP=1yio"фNPr *'\ JX. %ÖpC2M$HlZM$Ė NlĖ Nl\m8r8-v6XW b{nז ڟQ '/%;!jNv-gdSl)RT^uvmh-$F}~a8_>Y3Z /&ݙWW5ilmo ?5>-NlpbKG[4QIuDC[:)uh5@|:)ӢKL+U?‰ ]QA6ݜL~#𳿮yAĖpy&FT xksR 'xqQR-cɍ}fH F(=#͖55 5ûOOk8۰*ga_,hRe(D J )pB  IA4P[ު0VE* GG.\m8Bl:H6['4ĪIУNT]TAn?ZN]-5jd}$)~HND?X !n/(܈+b$[6[ !uuV‰Cj/{Sl'N:m8|73+>F &Qs0)$dm҉J'ږ*h[tp&ץp& 3k)!A.q{Zg^DDgo817a"A΅FW 'vOѽJ81jR8!.FJD_⌺ ҵ+3yߡƂ"7̰f`Q 'xƬwѽfصBrSwD 'ن&M NXR ''H,D%qB:Qo]Шh[78pqhږ#h[lmC\c$A Q‰YnHSNq zHCvlhc#gpHa^bT‰7q?[O5R&v3/e!.1ʚ.B>}Q (k!S i`R 'H()1IAJ b )q '@ 90.0f@ F/M²:#(i&E\ỻ{I ƉC| NrY:n>7'|pB,ıM4LjKrEu5ز?)ߴjNt&Vlk?S`vY3[gCN0)H,^ǒX>PRS4ᄅ$"1zkF5Cт .38Zf'H0Slp5Ä&\0j5 *$hu_LlBRY'N'|+XCE?d#>[%R>]}Jlyi4[ do+basYgf8t4ʚ-5rvg DzÐꈖK|w mW@g[ˠO߰N8S8 M7mpB@$ M繥 Evy-a(kȳf@|Q-Q`gt/%ܼ_7G '$ްjK0\gR5vJlI#y)|7 u7GcW "Rl)ֈJlI!`} ㈲fFwƤv0jڛMʚAWa'v$6ǠAB+3C h/jFЋZN*} &>)u(}0x6lc#,(2NPHppȾ3L"$AN{"A![ŽK8vhݟRE8$H^ $ )Fޚ`YNL*kѠVs),'H!`V3OfxxnXsŶO ay u#HB"HB0ݓp#ex,,:fH݀K8 o`.Z?;[)&|/$=! \rxD,?1rg5HH> n1H.!D(M"9#~9":т=ƐqFCBGC4P(kg̀9sa󆍷E_|n"qݻ>?D _խsJΉDl Ɲ{ qa=ƐhyfX1sFgCD[8lB#ʚAsY3lU3Ĭ|65[x䯱+3Pagt=aQ Q{SfPߑOc#Tg gH,P7ȼ嘐҃\4?D ECGhg^R uɂqW rQ3dAy`/JfG: [%O1QvlH 5UӠ*U47p?9Dz m HǨl_iC@\S&OcH .55HG?gf=y8WmXDzz$|R,)нHH屉Jd0.=wn>SD鋷~)JuG8i&y>lHQVA?ٔo [rp>^qaiR;V}v/op o'ϵ) [n ' h͂& qbIwJbhw:AZhMܳ=;%=[Mܳ?gIX%bIbbi‹KK-t9+FX[{TZ |x1xn+ZB  ߎi'g;L-4H H  \u !YQ$+k1uJxDwU˺ik}3'9'єr>Ψ,<%de{DV'bJ~x =5O :93=g,Go_JoY(yY7JSJp̤oBLgWLRCXXx>̕" $U v*ƝxDR L{"v .xW.m0@߯g?mLJ  9Z) %J( VN`ҞDDpj%SX8p<),Oap ?+|mA3 bGbmcoX֠ hYP<N`1-( N8熟t񪇉W=LaUb )r1Rh4(?۟* 'JkZj ˿Jja\%Ts:$?/YҌ N_]V: W"uv6_'oKv&lv &R.ԛ081 W@yO^'$0uc40S0홼7T^V_f7c S:1ͻ<T@\S!27 R)2f0[Pޘ2r<ZaqLpBeܘt7&8a @=X0:'Dpc\n? kB_h9#v(' i=6g̍ώp|ωpL3vh"Xθ}$XrXnBY 1l.Fش:gvCۈqZh+1nLp;1nLpK1h3%!lŸ1Ÿ1Y[ߘ༭oLp7&8wB[qcێqc[A#*rĆ[qcېqc#6` XG쯎@]2ۃΉSB/y0]Bbraɱ5B}['/M 7tZc :\2iD#8'OQefA |Ш*b#g0۾/N)k9"YC(`B xB xB K7&7$%t`"57&=;H5D+=*. wNR 963kFuJ1CЂ%Utgq 5 G9. ADjO;9]jO^y¿BR4xc$)1ΐ CPAHP?Dg`bOD $:|L`$QH?W@͢ j+0ᠾ 8 qʩ+@('Mbxpmr`">JWO{%!sD"X5#rU3bNYgý&!h?οfb}-D"bD[/ h?e<FBh0u$-p} 8n9˼}lg:P@t?8՜Tά&é<8cgJ9 gx&AoYgʏl!0< ##8 :(&X֙㼂lCcI ey M9 >9 `hܞs/ˁT ӿ0:mė>l4v\,GL.4?9Yڱ?ZwO+9cSs@;XmyPQxc@{͟^Ql6?e|2ܶ/a d9O#e=鈞ys@(NYrnH>@:DXyB>IBCnBh4oc󮏯v4)=y~rLPF^4#dLiJC8f4EM0F)0 Kƃ>"B#b8"##4#фG.a־?L"椳1%0y8:tB J߼GL\\uLwl8Ɏ4p\lG5Y# /3XZwȲgw doaa{{"2>fX\7FDQʫ\&w_@>ϲ'@g?|ceoe0Yr~u(j- d@{2,Ir) k߯nqЯLӖ'b#,%(L~uaꫳgT ?ݭv! Ȳf]gu?9*3ZdpE 2M 2KфN#&((C0{Ģ.B.F%pqpqdpq4hц#G}h#h$Ah4=1:͠]$H`!F;Óhy[q_uqFDpw 'Kw- /՝Y30{GEb^5 u:}}C>Nxv 5ktT=I(NhR\HRhRw0)IOHAxpD X;z XR)uS 2TAoجN߻ljCj\5F M 'U^FEf`h$'H($9J %pCD`$4 pM8&`ANpxpM8GJhqG*pqT'|k '6w k '\ ߚ 9߮ѽv u/1'ȗ?x[lnd{[ 'lmeM p5.Ė~cKՅ4bNqY*~ĖGhdp $0O 4LipE4'\^hHfXY3Vmиm V ',6У=Z7W‰pH+,;ҽfQ]>3pB֊-wJ}C Z%$Ba $`gf8h][nmwD%}fP=}]5?{G{IAB& 'H,)H8Ab '  IA\Шh[74O4꭯Lm̀2 -U2Rl 򚐁V3@d 2jY3 N?9XFmN/Q HB%X3F]qF)P?_{IUVP '踣vNĠ>Nl5p"g5o%bp >Reg`w0WjK f^X.\5y+&NJw7MdoFW'(L'[@|" D'h&f@$khQ-A팴:_g{A 95E *%nq3*Dȫ$NA}K,D;`XΉ-wi-$0{NSlbG% ?|gKjKwaj;bY3ؐpZ z&bV&,kq=sq5_˚(j2l11(aŎŁ<|{2\ JX. %,pK8ABɰ% m0aLG&[V-F-8[.8[G.-@ME1,_;[0NQH w ';e[!G%2lj(Ŗ=[0|ֈj唸H,ar8[3Y.΅h_4/`e06D%taw :Ė't4IPD&MԑbKi:Rl 뢣% W5OG yS*&l0=g}T ;{ J81wʭ=l0Ĕj*vI\G%c]l b|1N;Df!,jXjg~]S3wjx{IIAL l`R 'H()2pB  IA9zB`[ުVEhт Gh-UZ)fK"AZ7  RuupbE#8rjեpBB }Ǡj 'Q۟яp";]oUkWN/"S{Z '}Î7GT[HWAV5A=ѽ H!FV5^A ͥ j iL `R 'H,)DRmKN-U:ѶTLLKLf (RY$H }ωK!حR.N\I<[+:6QuF~N'3?N̓W '–*]9.7lٯ=v ;2aw bvѮA~i۵FTbmaSH Ф {IA K (XR'43zFu G .6\m:&8ږ*IoE<XQ E-6y޳7uHᄍx+Hᄌ8Q '\-CDψjKUdC>RB?{S ' v7uF%p>P#ʚ}]Gr[hF&PRc38 RNHA -{s '`r] '`r\Y3HA, _]lxK 'LFwI mHMɴΫlBJ81uI 't8Z#JN>?U_[ALJ8AG ?{pc3vqfsV0q#3=U-%SG}e͠s">?RCN0)X8ABIALфN`L bh[4) zkCG .3lh! 2L%kb fp5Äf (I a7S8?{,Ĉz!_>2οKmQ}uam[%+Ψ [%8A}llx݉A]%XrHǖj #d]glieQ?XsD;kѡlז*eݳ-UO5qTmOp‰ ^hdo;( |NhB>-U(B>Sl GY3G5} .Rl"Mt;`}:sx樍&\̑ aC Q'?Q '8i-69RlvGݧs-j%cWf{ǭ!:XoDT5Dlҏ/UͰfdIeа䣓fP231h8E˓fP,wO*fvu) I@3Duayղva#v| f8AB ' \ 9#d2y~@W;epr 'ƂxNp 5CwhLA$H]IBޚ"`) Fޚ)!7'NNX{,'H 7߀4 RvnX_tV/[! $nD^H_H{Y۟B7 EځC:XZ$IxCsJ7BR%)9̤13(g4?D(>rFY3 'C%Ӗ~ud(hItN}cBZYVI3ʚGI8!}î5Su{*3xawaj5~j7,UrpQ !^*ʳ|3$qd޲UOl!.Z"8*F]T,X׿8Yvr4A] _ ƣYl`<5S=HN\eY]UN[[ IAH1j?wM2xK4/4{!٥ς~ϭ4ǃ5ARU$>_8% -e:#C?(եB¹HIHOCt #?%$al~ֈf" Aӕbj!#y,=im<,eaoa\qJI C@zH4_H@^H@~ !KBNxt%*=LK0߱𪇉W=LaUpb鱋jwJ w wB p{=>LRx,yJ~2OiJhgN2Dө6a}98N +|N)TM#teB8ƒX%gBS,93bnVS,9-r[KՀXrƫddz@iK%)zSZX:Q -FXRB ٞxRB rBd @S%%}`!)fWF וf,_ iV Еڄ%JyXTCHф6tuIG<|%#X:pGh7Qt(6(,apKnWgzxī&^0(Jj ӋMM<%s@0C[%&CJ}7JQ8ߤ+6Ӳ58!bGVaLϮVaI УD]XY8(v/XwI4)8pa!hαOf?Nao8v8\JS¡; GHG w/+fό%nPJb33XtcuXܨў!~c*i{ #8*j a2SJDoܘJ~%TnL)^[^mӜ/m1V, j/p}@(!规i#R|Wsߘ!!5ggGe !7Rk;H4M0=a6y@͕pe$xjL, cJ^P+8dQ"{V0Ƃ1xiFtӖ`N͒gᘒ[;^3aY0- o j-ĠǬ;F8SRV gm}c1-7&t*h9"rĆ[qcۏAAj؀u#WG c'R5gK #jx,3/jWF+0wY3ږ@XZH<%71} /C醔51WxaKû\Ծ,:+e-w% L48 9* l D4n_ׂXrchPxgi4hi4hi4(+vgܘgܐgܘgܘgܘhܘ6hܘV~{(c( wN* ^'!HȎ1W7 .0%.%".l=Fh_=#N'Q 7ź0擄|iFd {Q.D@N}r('=S($+8ZePD(* r_M+tnQƤ8À3 h:8&4C?kr*Jr/k#+JUaU}V"ӷv|+8o%~Z|^M\k5PSY^Gm 0/>x^Q0:aH[2*A4O_q2:sy-<0uҁ4p9&éY?LS=xpΔr^|L<Ń.ϔ%C`x GikGp@uLQMN3yFƄ8$&Bn%4 ~P r{=,R)LbPXaMxSgo@bVAu =|dRpҟO.l; K@k^fs@3c(LYne i}\ < g$(- }14 %y~rb1~_(6D 9u w<9 /V~Bd 3OhlSI5'^,ygi`&(#/@&4Cj!`3zP,hh,0J d,4i_B4D8Z \)\Q&\-8pqTyMy·4 %+9(@td1_]Qi@{E7cf]JDNw!p{֬qi:\-w=ql[" A_ߕ֪\ 3 7IQxYUyS?94<:9[v`^՟k^$\#ﯼ\eu`-hkV.wx o5tI9i^sE k=VV ^].g@%PHlWk;ht#g~?h@g'1CkF*>?/}61C]uLT8Gkt mC"9~)׈G3ĮAKOA[QU%jYR8(H R hn #9#=b6Bkmv#;Gw*9jpÝvlT27xdoNTU2qpB7' ] >[Fվ 6_v n)Gc E[vzjvEc ȟҷ E̜f8!R~8͛Z=eEȂnDi q@BAFGCACAV?q@P.AA0X Xe hn ({9f&H-^[8aW؍ ` DY?SgIX5b؄ǺQڳ%of5u֨cǺc ps;gбrʞrL#OeDDfdȞ$  ;ABHNP$ $4p `A'X v9B':9r'HsvΑ 9څ-9ܒL7p=g`7EkAG>2d/|'U'7ĉaXKy*4 Ru jٟ--`Kޔ1t>gd!13HrgAeśa-raޜ~"g#Cv[LNPW2U np@.z74v4 m (R pbG~?ln-{S~(D?*[o'_ʳuer681OG W'Nt}u{mt[#!_[:GdXMQR:3u3 "#g07kH?{CAzCCAzGCA  q'H,p 1 2v(Z0QZoGЦT;8Tdr VdaKۄA Z -g3H9(귶UL$&% HKNW{[/A Ŕ*/: ]'%}.\)-ӲP.?' Nܳ ssnB1j)Uhw`+cJ;5+ ؒ=pLȐ_ RgFq >;[Z؅78R 0Mu@>= S@@>EɆ-aPGsQ;GAE iLXS\حh̻V$INxnzEb. ݰ2,9$&asJUvK>р-K]ozE)Uȍ OE:$V:9 ^>!v3: ز8C~3'Y +#kBE`` sU1(n]o= U2X. ;AB3P`$-MR$ $- j58ز lpekpÝvzA;G=Ku9楓r)U#yz?l[ڌGm)N֨B8|K߰_gO(`/g [[g~TԛhdrB}eÖ j?SFM!:ت?`[8r+ @Z MԲaK4QEo-uZ6l r-;g81%yN'dA}OI^V=:ۣQzE[vq\%Ĕ68>ĥ<)IKSɖuAb 1][)8 5U'J[D؁6=SlYz@àVΐQ4DYPeCAԝ Pe4pB LCAԝ ZoUVZoUVEΑ w9pmjA;G6R5 R~FU՘ROb pjX#FUß5npBx{d Np] ߖI(b?Nh~oNS){Ӊ`KH`9(o AdAs&~K?Sm J?Ԋv`[uZCA T)UZѦTiERmJ Nĺ N:N𪩦Ml2lpBVN- 2c]IF;g-rWdlkr g;gKRgϾ:bÖ-{S8Gm Á}(խаѰ QFX 4o)U( ذ%99h{49ڰ% 8;=9vwZm]Q;jlpŠߕHhÖt&eÖ^JoSUKs4mRW?dz-Luua=߳Wen >g-C.GI([P״ 9wZrķR4!W9v7OWڬ%H{MFA.`9 ,,p' gZ#RNTM¥z1(uwռ}A} WI>UB{@ҼUE(XV 'Heޝ _p4^:Y RSϔ4\9 $:%$>%ꉻAc.*6$œdn$u[KZI'K̇v䎐$^!$\p8lw2+:!zob9 eJJ3X-~@ެ`}4 qNX[,-ٿ+ bk$}ޕV{f43lo"| :eO /INIR4)>m$)ɞjGm5Oz\65%Ij}l"Oԗ[L7$7OY;DH JjS:%|I$II6e"I,yͼ/%%If CֽH+8Q%H-z0RK纤Rkg$uԜeIR7c၎AYz@:KJ]$8%QtDBJp2\xpр6^P񲇊=T^Y: #WՋuLY#]; #y5? tjEw.À1r-Һ2r0?Ii<0 hw<({,mw<o\޸%$ݒ08D0ȨpߥZ8>K(cKA;KЎx 0*y_I_{%XalԂKGK_;%P Fc.Eo\fΔefG՟d8M^W;uV{ $ޫeW;ENGi»s4m!Eg+Ƀu ڹ{Z@m<9rk>K@5vv}T`if݂\%3kҵ);EZIh\y-sgI, -@ز^H*{぀X^%Bkj_[:Y Ш[aT?/,{}fdWäyY2Q(rC/ۨؼf E2cSYۤ@))2]mFU ā׾`)G1<}Au%(+׃Ѭ}e?J,p%~ơaZr;OgYYrkI0fɭ%%@|&Y J3fCbA>=442Y-G)R| JѲAV8zdhCGv4zd$=2Y ףIb4zduuuZҵh8o7k@P*@QOaTe/{xCS-tzP M3}7{K^Ri3-tlbVi=k-aSfբPR >-Hy }imB )) x8̵!f^"w k<+c?8I=a s=Β"atsw`Ec,XTzKmkNøfa"4qؿpߥqX8>K(퍇4:Y;tkAM*dsKLSYo0NuY[ASON=(/= zʏ!0= ## AvULQUJs ZƄjYML8\CM%hk CTA0vm PHPu@z{N_# 9 ڂz_$$ė b4 U [N~'d[ۄ%ϐAPۂd J 4+4"(B䓷{S1RN BCTu Ѥ큄39AAlp`ћ'@b N:.h93 g['w&乷uogOߨ% ny6Ajw:b/[~(+Į pB[Nd3mpBșJ̴ %SMқ0휁S<)} pA| 샂#g(G9gM>ys~ĻVFZuc`HNP$  ;AB:$4p `A'X 4p ,h{19RB;GhHB4 g/i-D_34${ Rۭe(k L''id 1@0uOb℘GsN-lNHCpGc9rvGUћi$Gvs)[4?@k&v'H(+H\ @*hR T78 T;Trs8QoԳeϽD319fPa[d ͢=zU[q5C#\HuM NCu lKFAk4GXpBݛd?G} ςz ᖾs>;l Dp(Hoh(Hh(;Ab N$"FCAEkz;*Zh"s"ڔթMaKۄA Z -g3H9( p2 N͸r٨k{yAB)U(_hJ='T֮ktsuk%uX37mpBTל9kG3h[.w0"컎<0lK ǔHvlYrlyAkȽ Ju;&<7q#c "D*OdOD{$9G;g@`GmM-hkNx֚ pB9Hot"zRe^S npŠ[w]}Mn`'aK.(;>*z-8MU{:J[/bnykXOh O9vrkKJ&I(.#}l"ӲgAsu 5L5v/vΠr،Aq#HXYa+> ,wŝ rq'H( )``ԁ5BKAb lpe-l9ph^Qp?N셆%%{ߦT@(AlszZŮ[.韖{Soؒ EaPțNJ-0hȮȍ XrbA!vd5H-c L[V{e )?l9`[8r+ @Z MԲaK4QEo-uZ6l r-;gDd}t!UsՍ Odx֚xK6*Πe䊒ʕ( ?S-1@MU) 68G[fGnDd9ﰒ{;g0by&[3@dWtOYPeCA QwBA u'H0E QwjU![kU[;Gw*9jpÝ#ɖ)dK՘RťL{S)UśVS5Tq'/oWdz[ B']Y+6yrRnpŠ%uT78u9إn32 飔q ;E0e$ ph LDXݳ\m ilI$#khmP;Ab mJV)UZѦTiERu0n0.g;g@AAnT^SߏT4< h1qo&n+Q!gI(Ta r68!eY 챮8Q- mpB׶yp)_['wjkA-^GšYQ9D9'[f= ]2e =ryx/lW8 + NX(H' K;Ab ZoAkz; UsQ;GhSVYARemJ'V+@VnM.}뭕h,Vnā$j$+`,/Ϛ^'f _ /H̛Ŕ*3bı떔ϖFNpsD(rolY+acL"g\:X[CA[gPcCA 1 b Ľ{7op&mp& sî}vI4Ar[%L({ad'ԚA'mBhhȲW"CbM4R&t WS~v*Ӏ-d(T1,Lw c+9Ú#lgј bZP;AB h$"CA 5"@ -Qn.gp9C*\Pw@( `b=jX^cℷx<[z)ר8A|-&Nthn~Ϛ~`K--`Kfl᷿X ױvHlF娚}rST!휁-Ǻs7}d[ю~b%e6u8pop;78!  BƞR A [œ3|PG [cѺ]34V^Kґ:Vt- I^Sa@R| N05J^ [׽%y [jw%WaK(d-YUj ؒBA#Cg:U r@Ȃ( B|-9X)rZ&*Ep|g( ݪ n+jf-A:+mn൅VgseWD'X^P0NP`ye;H'8a8kd<ܢx ' ܣ7 v#"Isוo!$ [Uy5opFg:pTZN({{t 'Hn%Hæ)k)Bh7%S@HSHSR86)I'"mIvx XgN"8W!OI / OHpxBbے؋2 .s0̡F怲Ju6W$}z[a!VDKZlE/d˛+"Y)D=QOb׹R+"n%Sa  ECѼuc+R*,<rEDQ9Bﺝ3H?t"Akh \\QȰs3Ց>2A:@^Q 0-bCP/; gP4pɵPKa kTQ֨^PVcHQ599JvX~4naúm%{dإHϑ?ZTP RMZ"M,TTר%u0\/˴LX:KHvkZuths.Z5bQ+3{ ҽ8}^ʈ5j79"Qghs.]ॢ\˛{'b+= -Nz KKlv)9GȻ%y{)kPMnvXCFertA qCb7ޯ(ћ4ޕe4ЎpC]i`aQ5 U4^;qga} [ԁ$-~Xg:$9%ɳJEh!Dd${-7O|T伢s}v)2JAlۆd4.Iږw}ZPZV) 竤|H IrHqD:IaE>^~IvIbNRԒ%Ix/Jڶ"qHܖti<4=NPq>n9|ړD I${1@wY$Uj$R?$!}),:H:l"C%P.2*wi3<4J{{ぼ,R* I[%}5q/[[7^?e)=-d!bzٴzkg~I*&y>h m?$^0?Ox.%iTRKW$6*[t0wLNœwȿFiҌ 4PT #27!*&y!@cÃ;3YXxpwcI,$whOtw|/wItK"%;Kw*Yjxg㝥wV]کA!$9\gii. %F7l!Nj-,9=5RE~ɮMݛoy j2-;I΃C~n;W($ԁZ]pofv4gCfp]v8P Iv8en.\+jQeo<WݫRjxC;s-X^mB*!81 =-L/R k6m~b9XMgw}'Ҽ֟h.G@7ъ7cjh31k_`C1&*\ n0m=5[OMpSЦc{Tܫ-Ft S܈ b2\yD#:`ѯ<NL g#g 3{Tv!l<*AixN6s@9BtO-ԓyZM?FwÊp8 ZaiP4qX4&S n7Ecj15ј{(OODp4&Qo8@ O|5\ 9Fi^ZI| jز6": y+N0r {z+ !SLҨBTݻ z#!BcSuD)c)]&"B*[;N!?i)V{1og#i>oZ+dLzT}0A= 8z_ؔͼRD7'ݍܻA8WnM,J׽ԙHxu] u+q.J~RUдKmTZNjNߦ/ғ[cKviӓtN_~ʊ KsoZ// ")^lGQ_Jxоy>D"Q ~.GhVҀt?b=5Ev*bEn׵SQQOE h0y41Bth#8Egʀ#FQ]e|ʼntmgӗ>xy-( ZlNy遉p*&©.=8c땲>;z zک%)&q+`zL0em;F]SA-ȧc  '(Բp9u|  r"H/A(ACL]!;ԯ()q!A` Qj`, ş^!Bz C; Aާ[-Z.-•zmك¸qs^rй RN BCf9 sH)X y(BK^yxwE0kq@ڇרCHt:אsס(4P ERGg^gpּ^Ƨ2ؒݮ2FH\xA)5UuolܪX]Do@FuA + EH]9C3Kji;g8={d;gڽݠ, g8G5r${ N UP6X*8F` rY= N<#Vm#h 9Rsdpw:9hmf՚Gd+^*ًA}7AJ_b{4ֳe]wש#Ce9oTϚsހIopBO'2u*omRר?G`q4?fl [p pbB^.ߏ]uC}O{ ZkK/l)U>o0-;g UkHZ^PPPwBA  p'H0E Akz; vT.E0E)U~MaKۄA Zΰ`-gsBQ yaْlpB 5];A^p /\' NhGB1qQvA8Q eP(TٛN,PlٻB`uL1tJsRhE$~|=hl *3qh aTo9Alcs@| NTao {ɏ]'( S@@>= Ql{$;gusaK4Q'N@TYF'^Q ۄnpDzUb pbuxЀ--+Ů+^ݒk媢<{nr~a!^\f:#4xsd.`X4&AènА~T/;AhgG"g(Tg,`3ō g0Fc]e4\  ,wŝ rq'H( [ LQ˥4H4HZ kpe-l`Q;GvzeަZPlsJ=.XV@{ e>lY:[Id҃|ny*A!qH?[țVOs(:aPp 699yΠl9`[4r(4Q Z6l &jeÖ Nˆ-abZΠe i尩J{k+!ةA^%yZ#2>cP'x{tzRM#{ Nق(81쯖kzع* 7']lv CDzmɞ3V?C-ɚG 4DYPeCAԝ P5 PwS4Pu'H[kUa[kUQsdpw:9BlZΑMT^|eb^O8 _hYK] R(˧*;fm]k!nl g ;A lܼY:Arv['Vۓ&W%{\gA: j QwBA*ڔ*hSMҊ6J'`b'`b\Pw΀'G'goTu#ȳQV. mNT[9eoTmY+o|Mb"a ]z $m[F'%}c]s$^n¾^ghh pb>J{Ƞke_S-*{d3!%IJ ]Pnh(Hh(;Ab p'H,E Bkz;v(Z0sTQ;GMZu{sdmJ)UV R } ?K򂝕4oV® pBR!Vnz@>e99e}׹ @ ^kT74mp?lI9e #%E'oh09C,5_rE;gV`ΉQk4`($ bL`(1 AA78Z Nĺ N:wA^ѫԲ$ܣZN{nW6qB){'b'uCD N7 NOnI6!PZ',{MU68aY /bgј8AQʞ3h su7ز Ih l+24?X(zbBA̝ PS4pœ&SD`(ޚޚޚZ:\dh "Cݰ%m .gp9CEQe~oV78c9 u- \'m*81?[ni[zdkZL"hbǽ3ln3ɮݢѤut" -rqs!6eMs+[4F];l9<踜VN NTzCzG'DAb|@T|CоGcÖ0h (ߣshphÖ(h`k.gw#l<%=Cc:e7eڼvJ'Ju#HJ6l}MnnUK0R쵴[dWKI6l)T [dX/٣7E@r ^Jɖ   0,ٿs)f@u`]i 67Rgp#I0ʯnTw+ A: Y#乥r fr!2}c]XfA I$ .%"B{@ҼUE(XV 'ӧ*}$ ('B<[rvNSϔF rIT$D8T`'~/#!I$[-I9fI܀u!i~)Ўs|+$ '$Rp8́ }_5{d^lC߉s1v]ed=&=%+:HN?o\'޸%$08D0ɨpߥ\8>K(cKA;KЎx O0*".ÁhB/7^,=}-#EIH˦-l9}~GO=S+{Ta($DQE˿*yN;u`!DS,E` )S`/`A,ٝ:,SɹJ/\B;Hwf4>ݭ%ޒX0mwsI4I b>XOB#|e0 t.IxgR;K ,u4ΒL^mnBV k_mՠ4u%2ZI_Q@ a7["8 8~"-i`y²^C̄# H rD*oK`Ԗs9X"XODv{Ә'3"%,>}$?:?鏮7p _~_??|~t{sO0~O|67~|c7y>߿߿ç^keϝ׹"珿__?}o>st; w>m㫿y}8zzo_O_=:W1_-%o_>맯'w7÷1y07?m뿽]#s}ŕk#I,x)+gŇPf3uw ˻wo~sOh{\ӹyțz_>~8_{{~/bg[;?~]ץοyb{K &MK_굻~q?|Ì`7^}wM 37_[^VMd~㱹l&"k&TFy ~卑bΏ܇?~_vQ7yoM/߿| ѯ߼066cܾR3nw Z,ǯ;?z_I/[yW;z͏/gt7_o>-U*+x~-o2_l2@ǟ4Vs}W~XꟉh#Ϳt؛{f6?|x+_wz7o߽ {>Ÿx&_$U7R1n7HkLL-f6Ww߽|g7^̾wo?ߨfgǾf龚\V}La'E4?{uoּB'NW5y?y/>׏oWqw'w3׆mK?׀/y k*ez2\(ic~۷_l|oӻ7o?\c/['hmO?&RlfMfEjvAGWXw+/>tO߽~>h_>!{ۨ~oQY>au]1cYi,MC?~{Lrf{ˠ]~7nٻ?oKg˻WFvT1Kc_N!^9"=cѼoZ5=n63m6If?_Sq ˻>߯h6Λ%~`1Xz0-cGm!\&x {;bJvOI{-DL_v86J0|tfs(,]iv~1Yhpl4O+Gy!*}}[*ϓ=._b_]i7[G;*_?aO(iݧl8 WO0ioqcʪJ?I@O&|fQ;6fGإv_E<(-f0|E$@;| ^.ˣN>qknvCrJ_,M-ؿ5>6QGllNj@xRܵzVEVOhKd^Xe_ dMLh<@aM_b?.\xE"̉h-((H8]N~Jl3-ָ_f0} } 4k- 0?wYT@mfk{쳎υ H)&bKx'~T?;@PN/5u𼡅xg 93:)dH3L\ z_%^{z?tnt&)xהLLR :z(H(8; 38$Lsh)˦@ІǠ]Z= ˵ґ~Imgl=+#;jvM`N2@vZ!҆owY1 rٔM2+Gt{xllfK/ u:G4 N] TqfzC0j1h0oGL8[\*K֜8!vvUR1q[nCЄq\F$Y{Gc#?:㰘ϦGQc0_H-~R*t >bXebedǽF&H o.V *!IMG”XIm+遧PEDgNCW]0DFNf#Y/]G{Ws瘟~ +Wnt& ^}ԍtv8o 56a8v=, F:iM[X8VSb5:Wq6 z{twh&!ARH[`8[Hh4˧/V lJxz1v-#hXGM, mм@1sCiLt±1q亘8&6u1 ׵JkE*cܰ82AٯN=#k 3e8{bGBchc6*ؤ ͸05Tq˜H)I68S kc0leĺR&d)qq~c\^odKWi6 #I\j8x8i6m7Z@viāͬRlYXәJ+dZ ;ke,<>wMጮ=4v< kDbh6_67vX5 .7X} ch8r|={g!5s<&Ձ'o j')[t+Eg/'8X6  7uD|r*zZB#-Uےh$l\<6 598Q<Ȇ[=I3\d[7;Px|T:~a3Ņ`L1-1x-iǘe&W8EDM/#6[ڋI"W-ō}s t}1 <}jC9U-*vMdk9:e0<ʋ}vF&dA|b:~<~p:rjjL]{qD!|8X(ǐ9Osya[dq6 y.MqQY阛Q:fƽaCbg l J7ٙxk; a~Ř1.$81xҚw#X_Zoچ^nNd]L.7:\"FU*808*I)yX}"$;nΪNg#7cr](Q<<0W$CVJ*Dfւv.3ߙz#HLj` Ck+v)c\Bl72IuɳJWJ/IN)}8N曉*`΁d` 0&hTjCS8 UfU8wabBq=Q6~2'\G4Oh#,sm)2`HūTn5A.6#`Ңta[i/eFʂٻ\.)c p^dFnˊ5[-nB*Dv+YXDC H`ILGT +ipnOcJZiLd쪣?\8J[,Ilπ=9>ZrJ^MR!8v,'(i>n?j̭ۈBq J|J~NCŪ1ylcy%FYŜ2_nX>Ίc,Ʒ l*=hg2[1C닯F;G@eIcK0)A**5@d#Cd7xC 1n\FB~` :⏇v'rL o|"`]Mq||Fld6Nuģf;f3wZtm˞Y+i=7Tsvuu%7InL+bДڍ!6C~mJuUd4 Mu2@v8[`:y(46қ6v?v7[\`Z'%>&[ibw oJ:;xa?1 afKe+AҙBQYS FfV 3P\b?dExxvif)Vq4njx md^;qme^ോVaxUX*)^;)%% / v!N╂S56BɹW.ѕlv/Ďab툙*ՙxuPiLF ʻ$r>E' Png2%2VmRĤݤ9 GOzT|nt.ى/ʐCN`8kG?+DAZ s-2K17h$~X!81Cvd:qzwНd+h%ІU~ 3!WC Hp7d?dR'8(Z?ݙ4Zyڜfp0}r+^3:, .8ǫN&t' t\FI<10<ܨlIl\m 1[қrzIy*`(i>)@O@ fo9ɄW'x<X?yzgl3_z\ kV\4MpLI[$ԦW KRڑ ,,y\TMd偈_"|'P:8B*win.7fm8`BzyZea:ȏllCw7;!C,+0d-1N1p:1.4fofykInfvPG+3/WzYS$8vZY7~8r&7I8v:["+ei`|R?7:_;|c,ϰPYLxuBox+ᅹu MsE5{w[aj-ުs6>3$*࿓h; m8HL^7xW~vykBXEnj6K\KEF/cNq^SDllxpW|6lGFX#PM*G:P7ykF*^Q[`liR6<lz]-~&EkwלDtӦN>`8clIE&!9s'";8`__$[WmfV q { iebI36$+K7|# JIjEu+/)n!xNQ.kF GrGFG>>jLpm͗ϡ+nx% ' r1Z~ I`D赠 /ݬ;\Za0Z?nv[:CRmfzlɯE||AIw q&_/Zl2JbˇPy=--羱Pnr>9V]~ cq GrJj<8$vchpdAZ Jjok`nee2 7^%!"z%Mhj A&W_lt&mz& 0J I"|(k!l\40Z@oMXq*^}-_->hoazơdI8:+x!B59|q{c&:+›+MGgmt4+=hkUJ3$Y+$]+VB->$1u=$]Xо7a+Xm箱Nͩޤݑë7uธdB_| @FWĺuti\莉+Ox&Ů6_~-ѥT&Gd# Nc|aJ![;[>wf ]gx1V܎/ѹ˝.@Ż6NQX[ݮ%9eGz\g`1|--x: Ldc;:?Cb;C8Y'x<p-QRkJ,`llD:.S^\( 8[M 37* W`EOs94ؒE_Rx˥)ơIx0tdզEh J9yw;Ȇtm& FJ)$ ':Sn<9+aH|4̰V *1y(4Y+R}(& *RRW*[ҏLGFoz Akё1Ƅ+xW*Umͽ%|oD)KWқ㭳G6:iir\ p2S()͍"s/yk o68x~JLw›z]MKq.a:!/;F{(J~ H 4_yl0;Sa.ƪJfs?VSpuw'F&̵5LƦzSFFbNWo8IZUy2J>5Ms UՉ?d՛+Z`Q*Im,RE4 C6v澫0x*Y~OUKbƽ)f+K*qEj)[W/ɖf'z/THQ֖H\sfW.ӿP3n잸U7Pْۜsbµ7,и'(ig(6^b 17ڈ4863^l4(K)*&:ƫ * aI൐cw|}p~Ǧ.3rhbZH,MqM3hC7Q7gp?CK)LlB+fCpd+Bi3Ӧij- saw*VLxuBᙷqMqJoUwEK9+ {*ݭ($J]A]˂^EM=ip6]%@wWttOÙ\ rskLv׭ K]SIfWnaߦMvX<jK!J/Y7ɭN3vF=ӡbYd1\ӽwͤ5՘ yz`72iC`mq#]VV/|fբcP>iEE;m : {'Rg Y+zuۗj#.W*g`[y Z1ZnK1 .?jxWvЌKݯx#f<$ݴs_AS'3R-0d-5 VJ<pv7$W*M5 $Ź`y8!b~3Ƶ|NCF"Kb1+OstUB-$[Ib2O'ld1DHg\kLs+<8;c-Ү?>!я1V}te;{-AwyN-7*^Bpf3'ױ-[„_3Ze8yԕ]l){ʖK(X !`!aOo)iQC(yUq6f*x. CL=Pzp_o:]8wF6S;j] M* Bk rE'|#=V7;R6QhW~6;tгB{.0A'8+@F'J&=mঘ1bS7xOZ;SCgW~xME(q om(1O.0I' l(&E @'?$3/8z;J꒪MSSj#~E xApFIqg ?=cc#Z/AKpzճTyBJqNLrSh"|&:+rꐺ..LK~X:ǵ&ww-C`KnB=IkLVʯW_gI'˜ւRBb%mH߳_Q#=9ID 7#s J_v(;2-I"`*d5&PmFؚHVImA1Z B\]ʸOvevu̯b% -$ˤ#iug!% v)JZOzS 2¿3$F^TEj|vyѵD74D?v~6ܬOe>-I0`Abg0W enqlKS̞"\)\yX3ZrFAZ ^wdt-3%UfW^6GIԞ1Ɩ6zNu S*8Z+Ʋ C+SG[^ Mxx}Lސʸ%&J±4i -*-ȱy:숑b%ַlgMYB [1Zc:S2uƗ\K,8/Ywp({Z:(ONʰ,^_WS^ejX//(:u5d&̔pWe/f%: I&4XgO6l7qkIDmnuJs\φ;>3.vgG'*ƀ+ ~]4 u?GΎ h'HYA `c|57$?%\j-5hƄ+Ǯߨ(h*=WI,؜0y,=Bi]G+GP gݸMl&W넎l"Uk'pÅZI,^ɳt#?r ^1J`u'Q1cÃS'6LnM%aڣPDZםK3YԥFu{.)<}byP7t"8%ES5񉄞U30h#@xk o6X!#SbM#x kn#^.uBh$iQCgWGZZQpY5A> !.!BۿWnx):d k,e2/1<}/E_IVDk#xxYi۔o2y&lBo_K~"80WZ+RR,&ɍ!QiHgj'.ȓ А+7z溟׌8aOW~#{O]l%;>5:e*RY*_zzV)zy\prw_47P;MƔߚf-O~Mxzd뽸ڥ&*k~Nz¡+N)O27]_a|f)C%~wL|]aw#) G vce}N!ZS #DU74icJ$?lw[%]AS \[=FW7W:"se ?p-[%8T^>>V6IP{"fcU]㎪r[7^t!ȝads/)kZ3*pA)?.Ԕ'!0_{*- ),}it6>MG@ z Wfv:7f]%۸Rv.VmUWGY$feqRxep>;)#bCrJlp \ İt)d95vO3[l9M3hW*":!DK|ҏ ɘ`r9É:sě( M<4+G]F'vm\MW5;bZGZiM Zq>ruGJzcՃ-cא7|w)Ԣ'Izk#P_=MWI\?4~O¡ dzVT:tU!e\sQvǟͫ]\۹nA8 M}nz@1>ݕZ)_("lx͕ TQ|ٵһ!HXEo}|Ff4:5czp1%0.| $$)&)n)QR[a|nM(^ג^P\|_pW~MQ1Nc@yóš ^*?0Tl٠`QPw< rj nz/nvEP Y:['G_l$83v:\5ha/nzA5E#F* 7F|_kmNn(,Aǽ%:hTͳV0Ӻ݊،%+Hxq*: L+dr_|t-Q"ޮ^MŷB{Y|}U%}hH%yih7 a tH'i*abͩ](dcY7nMn sfһda,ndeofoR?d`t&W[Ubᑬ{ƾelSLgx1Vo73X%;Iނv d_v$z\ad_ q=nqw;hdsq 􅎝.nU 钗1H ptsXII4^ l|!?6 a)*fxtZm])X ]Xj:"ARK6d:79nRidr䦴uRu [;ݨ3d7sݪ܂M*|r+2n܂ Um6{qM[&dGfmM"v^QV8 \r0' E(py^zE1k7TB~畒|aw:14_LVMN[8|WxkI%mBM(K^krtKRᔸQ1ix$lE'@lsh kAbm|ѷfŚ^{|+_SmM^ѕgv L^:T:9֖xߴ'#E8P*06 inLaH 0hm/. co<>F#S,σǏ؃9kEϡP[4%t3WzpSaw~п'xZd-lC+OUx%ߞdlu,ު(Rk{%ˉ\18kNE+C~,bƺ|% Y9ik` Xļ|JšdFv'ttRToq8TJĥ)H]C^ѕX[QRcY͝%¯J߱ $)$ƈ/07*T\%-=nz" #P?Rx8판jFGjo,R5MP4z /?;;b;Hc֔<9?|]Oɳ6zK~N;AR@pL!˫֥En6wƈXMFyIx|* SNoRf=h3ap3\(%1㤸M-(>']"^P'+Rfs\QOzLƄ+8? ͳ-.ߓ42GEB\p|Cρ)()$MȂWk{76͖fnbEm)Uƒԛ(n5e\F6.Ǚa%2EYAȔq;JKts_/M\BŊ!lB~T:\.D:M7TΆ7t]mZEKW nDvbJimxJZ?0Jvcft_ZK }r;n\;p3./z'jkITr S gv?Wmof)<+ΨsB{hInlHnt騕U (zĻ*BldVJuLG%yenBJ}ٵ8 ;)Nm[6B<9O|E#7 E>'J/W N.8UɐN`8`&ŕ+/~e{U_yJ_Pk:Ggh0EX+yVHGizxW^aa|DK,M@gl剮4%G)W;`&\LI?'\w& ;^d$xM$nn]p͉7*]xHP,} %DQY្$@cKLhs`fM4\>kxS֡cbUl˲ey: Z1ZE"n34 % YWzd-e`y ^pL[eiDː]"1U3= y]N Fx|k,vOo\-9h:T+9I )TZ[\e gj_-xqvu#.nq6Em25[[P*b$`{ Z/ ^9Xay`q[%+R=2ƺ%^20ά!ȖX+a=/!|{;Ɩ(^jJU|xA#oG!6қNuԏBὂmPƀO+S!99E.b~k 89ÿNB6¿KkIG_ttٕn~SK܁Kni9B~Gz/.[)HB pv:.bf۳(Mv}6ٙ [s2Jn 5*X4vR`sfnFDwe!nGLǮicp07:OCTAI.gIzItZK_[hTxj? 8-{Pk=!%@nY+~p:xVF2 M|M0ʒX\F;ZK 78d%Iǂ`ЮRs#ǣh' XX|PlP?>ts*BVOJ\R$Z'tAX,*UV:K"׸*~o~~\Oh*W$ǰEpS8vŕNc\1H8zborJU&!UiclxS\!dZ?w0 -X[u*8Ը9,:Oe-5%:pt`!5Wlou6ON.3kcXgvH8"y\c%.Dd٧,kY22%Y'ЖmMQ14/?8+;1QI[L/*M5>ZFtk$FPfؒaP49Sq@<t⇼3@8=--LUkhQh$d7a0\u@%b:?l< v%7ăv)}Θ)f^SaL 5atƘ1qSD{Bҕ!QZt4%I<'Ix'͘+JͰfڋɊ,Lo`;:0Nc!ǐN.ӱK8oVgp'[\?{oChRY'ttt<~ΣhKs#cV?tAM? F⻆&_x7h;| ,x2LRN\ qt  K9%X)d.zX3xGK"%0hc_~&~ O7.*,RE? *h~NZ ["4 bB*%e!SRbe;> r)K̃_>̑J;A֔բ i;H~NR7F,OjGF\p =2S&;gt$&ϝ319(~\X\jcÓU;y|A nৈIGƂcח+ Q[7uBưJCMqLF Iz'Hw`1 ظǵFP$dlQ6.x ~H{-@Ab +qUB;0[;;HAx W obul Hz[?`-Y%E^@益*dN.GwL!w0t2eD5.|S~ pЀoq8xrZnf6f$ƴvm ;fCw+uB.Yħ䞒5El~;]7rsfN>2iQt_ACӅb ![' S$+-^NWo:xf6 Ƅ+7#aRzѓ!6OǓWi OF 쵴8cxtn5!Y~Gեat&v:R*(8cie'`T?tdr^} I@Y;' l?gc_$/!0QnŻ]m(j%ŝcى=%GLQkqLI@I~ y׍46ҹb١)!L5")h3h.7!nHCXE|P⍀Nj!#*႕ɜ@}K% 󴂤;*Qc~rlIplb$ĤX cK\b&?71aeX,34^)78~aß &@7D;C݋6>#P#3xlZI0A&nq!۵xYb>yw;Q xT _'>햚V dJ*h$ ݐv2.5NSw7IXB:߆]JRxޕk^? gFkhz\N7qi<,<X;[VsHu1?Y?|;VMQ0,14"%B&[,}0OUf{j"f4 u%d-HJ!zJ:IV#/(1\ơ7WЗ \7yLtJi1sʑ2eRr-c2JbIZw&ϱ)Px7,;`K|3 x"fΙr?9=y|aEݫh+S{E89OyؕL{%#ւWkw.78 K aTqdRYJ~6,c .pDgklئ֙J޴ =[ü0X<Ї$C79Na0Zz%Hcx ੤8n#fJPq,hEb) ~vB@ؔZۄƪThq6Xy!E *M/s?a|19+k.\%[nCM3^J7`;c&PU 4kdEeIȝ|z^C$j9m)[?j<ם mA|:WDdЌwZ`m"Ϥ19 Y LڐM=f|4]ƶs;&[ɇ$6۝[b&wڑ*i$ĊFdGV;#D\R,ЗQ 0b׵DH׍I^;(-anec{"S@=ձ C?VwNXcS|f$ Ab'=.M.0 %Ž2k:g`U?-R EINy%¡sJ.^ؠ> Z9Ib+[Ms^n!8Śh` Cna!3-J^ ƠEϚr (sͫՕ,=kiCUx`g<̺9E-{Xb #L+x7=s- _-KtT%Ie+٨8f9T!ri4Dɘb-9d |%6Q ;'QK8A-ɁG6lx͕5^ kܸ2DnҴcgpcꔂƙ/W⛷% ߵhL L5EV'; $V⣺G& F hU'88Vki)%B=&B|lx1Q p*.+Kn?j`35nxr&s6N ^kAn*BsH4bҏ1*|( z0mcgI̴WH닳OZ^j0FNku닳- (2JxЧ^ظ_(9P{&8Hh҂Zc`tW42 >Munװ:ŧ=-t>nw)›ҕ{6_'(HWE݉!{RQ~(#ř'DKٜM1:[+l{t8)iC7zNj6uKrzHAm,BvYa-BvXoZiWv>s7\ ?S:UNLf4kONH({]1bGq,Lq &A'x7g|^a[%եF,Jg'Ŵ7@ܧ0?3&3Oxv^74܊p $^ kuh|hp#ZZ8c.КNY%3\U+r´f?ĎOrGA\3FlSp >ju,FB pt5lGp(, Y+BVOc㺀!VBJ厁,&ɤr6^y=~ˠ-q74i*'z:fJ+ita %0bht$.* #*]I <p}|k f4VB6e 5@\-:c-ǩq9c%nm~0L\n.RMS8辰m53ZxSLyCħfL|H]u k7`4nxQ&>w$ЂZuN ?|| ܬއ4nMkͳK p)*JfMꃔw|A7=o=\ǚ/{ hq%ұ46<8?x|ו(RO9cdW|o7nN[*r6 SuٙzvB6N0 /3%~ f'Lj:ђ&`+NwbwS@{]Krs6o:6 ltD99gW>ZklcEwx9ڷqmlV\H] sWcTM`B3onEJ+RV <@rV%J| [fq rWwZB86qj+`ހK?#Hrwn'tOE+- ﹄hE'0֞s7<wZhZLJycc#Z/(-Z HWɎbʬ OVo28.!#E{L|LwNqt#2g!_7+ v:RrCY51&yɅ:'sux0mo irq1-h'oh%[[Qy>6R_ajʶD_ ^o/>38}VW U 0Q3O&ҍ`5ž0J`S |Қqϒj}k;*Qd|Xܪ3!cv8`tTi͆iDWhw>]3=*wvZl0Jn ,If:o3v->2*v0`;ax В&ށ Iyu&1X1-tF] =S~_UJL63J+.׷J(Ytl*az\7Tgrr\ \urUx-aNdĭx}wa+vV\̮]@tG{cI3&MVm e -+=1f99\?GJt+% _mY)״kT#הm?!lf@7#MXz8(1Чyf{b"Z["\S{xZMy^>6G ]min+"'pyh?W8~Z' X`KL %Cy\<Nx0xLA00Nve(39rj#ABGazPl<d^zbwOI4%Y'Tx&۱1Nhb+:6$ӝ fO1hZQK.`C=Nq ƿXt7uXߪ[X@~YߛPI "+F +.ک{\4 aL O7VGPcBZ&ǏLDG˥ǽ%`w.׻Hg]Qq@o^:.??7vtŷU_|bBou!7͓bAH Z?Us;^8ҩGt@ƎO5zOkQ.ֆ',>>b8.QbTx;+%n#,n- ؀@cLQ5:ΕLsA|עRޭ"VfgDC0y.UJY.le!Ie8>{Ws\%dm!QZ'ٴ ,x;7>M=20:r3 q 7> $Ġ2kV$jǧ1 3#&i#HRoZ3*xp ު[SB*K{ \o"\ޠq sUѣ @fsU"C/ N0%tdx>xWN%EKCAMHhEebj) _n Tx`UwK\m=4ڻ$&ɖ;_̰!^RJu&>', ;?.4t2;J@'h_ffsWx&%Ӝ{cІv;z+5d^KZo .0Jv#Z)=2sc.X:V9 ?&bA^dhXޡvތ'lc*DScJJ+F.b$|DORkM(~\Tf#Ef3=Ϝu8-.*d^U\Tεz덫CJd*:wN58W|<2Jr&J(r-ekb[*]7{ZsOp5ǵGi.;GAKR]_mpv!ꁒ=v,z< q HIÖ4j[D50ZCDx^.-_M6* .Wɖos`­ouzK4ђ؎LKlD#oS,Z@ ߓ7sce|=lx8%*]Qݽgcky! +XޢXA$H\4a"f2&|j֌d+:oCЖ2^YM퓎qJR (; "^Rr+t&Yz!މwbqig _FG(5`x'7a&: cC:1n?ɑX/ $xŖmY>^Iky3!?l7V_m~kl,WYX~/~ݯ{,Iw׻3Px帽ݬq]?^>[Dw4e| MW9Ly =<޽# oܽqz[g9b}%=\Nޙsܼ=n"D>h%K8Erړ}Z=YM}􉒣Tvˋ aR]}9DR@ m7r!4JҚ{Z><I$>i}_R /VmHH+R$Y 2wM\+ OKp9ϐxܽ~]N+_T{EgJӼZ)'NW}~: \gϒ |5KFH^' .GLWlV_?{K7Y{.;S|nuÖpy!KUO} C!ۛտ6Emin-^V.]g 1`~F~&꡾LK $ "4$oMdJ.Gb4/fsFy@Zr/(Axiެ3XSKmq^DgՀ.LJ*b9ݯMySNw\ΰD >(A=f+xv==UOAY E{ @c- 9~suBE+rSDvh*wTns@ϖ\Xl-Yloߖ~"5RCj$CZfLT7.]OvOM,{Pt)-&WOi+✗ ɺEzI*N\PivFs"cs74HxLQŸ-xVI"%Ǚ?|B4tdܙ/Adgv|ߺsϋEYOš֥#^OK<谚zyuJԕ 2EvgrwwYwqN>:*~P*{k;!gOvͶt55FXx!9y3rơTEJ,{Pt#aww﷿?P 5/E/)>="%j;YCt[F"'SXh{-YhaĝtÍ o.++Voo_/\~KљӘoWuv 'N;gHphtKn|I gsB$j/":wnS-/1ז/*yS-cl$ԻP}5q4%2v{R6QWϺvIz7a'zy #ń/w7lln(_xKJϚ"gʳdX׺&%ED{t)Rͷd>{c}ֵryG.!K1wpl+Io T{,v9"~q{Odgq쓓AZO!Ev4"}X}u77O|cCvhIk-{Xxyv-1;=5hâClޯ~>[k^X_n?wy'o){\Tr~s.~V~Ks/o6,7l^YغgkC~x{p[hQp6{ > brϕ+߿;@[ߧˏκϛu(M4-|\Cw?{ÓP}I፳Hx0a$h+a" Z-:u])X.)s]M!sٖѴq'k/%E8j4<]ޮ[>XYɕ{ٿ=#8%:^DM?>n7o];+-ĸ҈bbzww2/^pa5{1@qqwpCS%Epq(#DO#7D'!/<ʎl?1~9ϑ_ ;[7դ'^&91:||i8b(_뒜>5U [ܹKHտqW޵u[\#A|=9.Җn~o |?•ųK\թ_e 8OnI$Ppko672Mķܜ/A9} +3}cRټ?nW_n kNKחߒ|:6o\qz2\7zYXڥ#/lVPG'~1)O,]Bz.oכ <YDa#m`|[I̥P7R2lxXiW7ɩϕ{Krhenq{ޟ"^([K`K-Vs$ݭD/Ee:uW>lnWf;ě%L@@A'lB@Vx޽??" ^.kny">);eÒ#*7ݕ,}uz{2žAy 'y + 6E0?Ǜ_5&i7rq+lu}-rz[, KZv7ǻ~.Gy Z7՟7 5fhz{*a98qqoX$x&e]5ߜtf<<w2u scY[qeyqY8_9B 4fݯ\*}k^ˊ=z8#nCeYORۡ ?W,r*#F$/j5jW@}S׹٬~<|qUiYYݶvE).!^@=?Sy=.qG|yC2-"+¼l]_^ºg\ӹ9 xin"̾N֕r i"\/!<}|\}=&?u[nЗ /a{7km7g\!B[f[ha%t-!ٝ>.@ 4|U WޒuOGxV=buE-fq eq\pwE!q6nޭ'%d^(?_9+7n6onJY%aFgp}/"ǀh)sߢ>KХ߼vY93帜sXZۯtB'.*G@ W>}-\D_t"Tv >om~:rN#l񢢴Q.sD 䟛=Ut3 }_T~Žxt+]aWHLV.*<%/rVg9Z/+<:~lܿ_ ?yY"E琭y7?a,eEٽKhey nVHDx;/m9/o 1R\?ƥˊŸ_,X~U2JV.+C2LϛE<ťϐ~povn^oޯ{=Y̿J;q2QB~o?lwehkN@!g։KPg/f{Y~&^[YLwmqҷ,I+JREx bb]}ۿ[G\/ OGcpoq;'3abF. l=9]})T5ɴkNE爱Hffq+]f] &|J~fݛRMҪ[V~S-癢381]}yKD ۯ{/?טknEp ΖjY w~w뺮m\[E?Tmǎ(%.ae=:\ÛΑ]MI}ݕ+n87Y](UHqHS%J\Qz[Gauvbۛ[rx>^âz/now_I"[{) %6Zk:Y _7B9mљy38ڥSo҃zq~u09ǥ 뽝÷T%=.B]p]o;baQ?=u7|QNPOǥscf4Pe|[(a.ʥe셲̛%p(y"ZmW'I )ϊ FYu[ Y>.ˀ{TMrc_G x\}ש.]Ty ͫ7|pkx)~f\OR5-Vyb B+ftEa,{X~6T0k?eJ{\N߹˞ܷB|KyE}:tޑ۲?޼?/,x{{{I>Ö->FqMC??}xL.W!;; ^A')"#z1(3t=D:@*tUWgAuȑg`K! N p!T,I,zY|-{Oȃuyrq0j5mzA2R `V,u Js&K/]< *fZ^ ]?#|Ǣ߅xlGע*WSL6 8䫥AIVǏhLְťMЍmC&K,u-)SLd-Zp<}b+^VpXfVD61FbiǵJh!Нh|>z࢕C_9*ދ>`'1Vt䷨*#$X]r֖]R{o:nd. FhY͡ђ* FGUEO$t. E`p!H^ =bD:^Q!Y RVt(o:Y^k[5Q֦y t}F=+< P(yAk0%zќw&ң' 9f:>_Wunȋ} @^Bmj^pQ K86|S "c\`R;H㕨EkzV(;| T~AZh =NRuoDx;nPM.{rt` 0{H w:עOAgFkˮ:6xЃS=rG F饝9TRl+A)ПƚWRH_5E5։vty"ʎ وsМ)V[E/#t?DJ-u)aݮ%2lrC0aI9 gd˝Jzzrv+l#=\ ,FK{/C"!GS\.Y8BTޝEv r6#l9 LtGl͖r-6@ז0DKv0d2mJϨ`kF( RU7b#Da|͘ev MOd%o:v$W]S*W 0kקq{un ue x!5k1㉢JAt1=zfPXɆzƺl3PQWl4&/`頃 wcWZة[JQ\]ogùDwCp}!+Ji4Q4}k݌X%ŻAF}.~ȎŸ(N]O/d.#&)S=cbT:nrb0Q`8vG언;0%6MbDG4Gu닥oDۋQ] _D':[kƉf4'Ϩ*OV<Ϫ PΑJ Hf{kucz ArOpk4;t)u:HNz!"L頽jbՠP Y8 ](Se3K%2etFylD_x'xwrW#*T #3t6u}4J3")ҋ_+Uё_1n<̋m{|I٫MC]>?83\ňӤEO6V)n ZKts%5o$}8#V0f}N;(Ou%QN|=,X@&FᎂފڬS"ɊT<@Ѵnx+Cp-qq5/ZiT 8Od6|iV 97mZ-?>Xag 7ݥ,ŝ&N Vv5ZNhRrqGP>"B^F|ȁfI=OD[h}$>i*:nn 7$bȹkEXG<@)>H'Bq5"Զ*ݏ uV(18Hn MD0̑Y\{ vmQE 7HuV6m0nx]+ڃ|$W<˜'\;'t(aJ-/"38U .퇨| /Itٖ@o~CZZ@bu&~9sE!8ؚ!4FvḾk=-Psϐ֢{\mEhR6oȸnϹ!tNX#e-=k平xZ+ĕyEty>!Hqe-/24\Al$9rj0VUc&wsҽwG8&um$8CX;G} n]{mF9rᔜmNiFJ 9r\i/_+Ivtn=;#E`4̑ dAr69VcEWPDA2s2YfK~;](by\:AnȁX&"y!i|D6ɑ[ ELvAEn-4;#x7HWpncӐG IŒ݉(拥D䏣WȘniȾk#t9d83n/DOfݎ{Em-o@1~oe'k$= Y!9p0-+ {q Mz6ۗu%.tAQWZa~˳Eu*X[mz܌ĝprМj=dV6}( 3h\ߐgGoi1Li.^!pm2g0nÇ}\@Sfڂ]BC&gF+rdItfAx| }j!׵6WbZV4^yl믬7k2#rǍCF>MC-ڄ|;:+%Aty>R$ɦs5䁐gG.VTzw${"wRa )~4+y |3K_0NrM4nsmnyf H~ЈTVT 8$jӨ9|PD+zѬpkkFOiKC^Winϳ]KqkpSmDmޞNW'ږj0F C3f8G_dݞSC>>ksf~J2X> 9t y0Cq2il 8^'M! -iUZ0E[6L$cS8o&|bGy>lQi!(*Ot[^Gx%zcWhL-dS+$?n>D VmB,4rZDOY+m-2ΈHT{+R :Av[KҢ봬 mfl'pk$@9p9b\hl`*V؏$$ľHjd׳<*. "tUed8n\EDvC, ^7QTp`H65b|>{' b&dp֬Zg<,x3f庄灺r3x%;B(Fq :z WPC2_ƻ!PY*P͑RsEMr=@ RӸ)6,z#YYgKK*#nԐ~jc_ZA6ݐmCjyу@],T :F؅kA>/mrv4J0^PحB3Q⹯OC E˵ ű2^(z >mSVuhr'Ӳn sJTVtwjӽHQk&φPʲ(7T` ' ٖ\m<s݉lY7Xv9 `_ iRI4L6yh8P+Bt]R[֢iϱ`Q>.[G#`ckNw .s-"%ݏ#dp(M8 3L tcZM@$xMqs)Jʊ~=c4ij):ָ.iul W g/Oi89i8*mwᖓ H ONr'd'ЁAtM!բ y +]QY6{aA,h ϮotbщG*h{nET닢(IC DCsٜ .)\3荬:_rl5p]jUt;3 $HcBe oD"XI\k:^ϗhC|۲ 5x/sV6`W-:ZsٿQCt]F\$Ao7ͤ% tcDY3T50$k $qԬkΉp&Lc]`dWyvd|$C i/uё#0fCeZPJtt/8PGZ#Wcɦc>m¤j7֏F'z<17`k̋)RtK~K=ǼF膮&:*p"w.7fCtOgT˶3Ju#ֈVmmeE 7=Хs02!=!:)LM/DiuD+:s| uzQ81uոdcY0QNFKސ#^)w#Zc 1tc7#1mwuzrI4ю= Y_0TjfLtТ3?7kUXyؑSZr+hN7rnЮCQ dpm}@VY.E8r]S.1Nw 7&/TrTΆ Quސd/4³R] \Cڀ'љLm1z_e_:H[ sȳK;NwȡN0:I+Aq֡G۽dm^#tK8\GI>P-z %;v$:aJ5]lVhE:й tm{޴V`FL5#rCúrHYHDK."myƆ\{: 깯f~Sٰ{Á 8!ja9`Ģ\nk0:nzt-ueJmu9GJ_3DzCw*!ǒb]!踋*5$E,/ț>"wd [mlv\j{ ֋Y.#Tk#`<#r)^ZQ8n+7 ɚj `PqG^5}UuP\T7N%/VG١p1 ZdF$9 E hqz\}I'{ވǴlɞA8Htn<9ZţjTbJ67Fx#H ~8v`Dɚb:EI&::8^TYUD !7W9vɽA"\=gx3$ӥD.ɰ]8UGΣM5Yso:b.\TR@~X@[zּJjCd)f(4Ԙ!WT5G>n;[\AtB;lbDdG1h1ݽDX6+=]i$2O8Oz0V!̀[:NQ<2O)vTƍ孢[Jyk]ԔǧV(*::P;Qp{ b%9N],R$',׳u㇓s v#/Q MEOy9,^k͉P"%Q~mlh0tfu aGdӕl1j@\`9hv:E)2tc%,2op&69dtsܞqc `Mv)6 ET )P@9pC)+X)  %8NAgEoxL0K PM7zPV9pԂJ#8g`kIpb?8#pUs O>+1_y`77k}n6N4nmFK0HBJkE7IqqLH:rPFs{4̑#5cw979em (#=t&J9yRM[; E_-m\M2!H͓ A5o=hs!H^-!j4Dl`(D$k0ʅ R,2~,ɷJSԭ$;Y'zꖚn֊v1FqS km r}k] W-uKvʾm9DmghE6WF+`#u}M !l9˦ѱCɏCF!g;A(+&S_O  XJt1\ݎ٦..)#) R)K$N5<`LKȽcгoZ7ySR\‡yZUC>\]$*yˍ;/w,(D'^[x.N#BdϹ&nJ=shfSbc+l~Dma)&IDo9CqrߝJNt`˥^YL 82΀nfH *!WjWmːL(%pܹ׃s%z~`{FYDWf![S+qje;nDL@lNSqJѫ7T*X̐hs+?_Pà}# >>y+sȉ(9gVr\$$Cn<)`O0ry'T.rS&n vcYC\VaCm$?GWl#D:tj-XO):Bm+<+# .yCy3x,ñ|,Pe9lVM- Iu%x=f ΐmPȍrM~KՆ({}@p2\-}]Ih#Hw3AO$C`z=7T^n}2t>5'pvRD; 8O4HK|8&uFNvbj<@̿D {qt9).6 ; $ 8Tw g#pGC$g(jj'UqppCD \bE@L! S$AQU8ȟ-sS=s~[?2T} ׷DP q =dVv-MN9.x{^NtP sܚX*NT]-2u}Nko%v x(:C^'1SN}Gޛ m(heGVr$y*[%#B{lkӵ1+xk!7u@q$(< p&{Z +P+=]ȹ*!cP;Aa6AfVvվW҂~8_j8hG5 F49b4ЋƭW(r8Nlu|,N( 4[$Jct5O'.̙ЀkK--#[Ulrcd3q61iSx<~7ȸNU: я~ݎġJ ^te10KM&o)ğjJC{:\ l~dAy0 *rl3\ΑJܣho߻nyb A-n+KjlΑ'Je1=\DTH &vHB+ySrC-[[lC0jV/n%-ً7dk>?CQi؋k)у1KqH7Gٴ=t qFDW!klUd KȜ"oM)6^+`\Sg;/s؜G.)np\6̟h!ʾX%)p[G3#z;.2(YUoy-$yĖrEȍ`75mhnC)H7 8w92|>o\SP(?KWm󕎲;]6Vρd9l;lq`MQ1h%#}sLc}cy+DtG my}d-wʓ8AA6!rd_!w*'O;Z?Q[F"g8}."C#.~ xt s& MHݞ^legk[-ښД7UvQ3DOCO:9 !IM:NE}x61^%p(TɵI7E~_!#<gh\-ʐOܬ"ouCWRDkDgӃ++`]If[WRg!w# xl>@4@L5-AB rsQ;ǘR-۠SVl\E( 4!i,}.4Tp_ D r&]|RT1-{4{ :{9?3T4HZM;a~w^,#E Qu3ecY gVrɽSsmVIpmhƔ`zOmndMg}.ux=qPy% 8Dw:ZaX &E(0$_+`l"wH ۪hCvbrD lEy7d 7vȁ,F4SݞQ6$I[D'9|lUN ۰m2>ؒ+"!;>xh`4 G&3AI>`㉮pds;kzN=uJ6;^{ܤnSKpyCJDvܰ|Dfk:߲MnDorUCI˞b'%X%ޥ EϬ l4b`NEaV!VhS3HD-mXB 8(jc6G;Y'¸`yp`x p[#q* ig ^gಕEnX3#nH8UJR\XF́(dDN-5|S.ᒟMp?ȣ6PMWCzaȳqHO(Pٞsǁktp]-YJ&yR dS#sɿv-f \m)LSlr rwUc9;+# ANE&> OwxkNt`xVw᧳Wf~;NU~-);[Y,L8v۰pxM y 8TǐZ JSsGl ֒yxSoDCX>NLd/ϡ:'0&o.#G y+987Qt8bg] ʘ~yġ +1MR[T$uM勲-D mls*cva $~8O%az~eD)e$_*PfNso*ѩZpOYl`B.|zZmDZ#r}gEm[AoA~'$ ^+8׀7fd)DY I8 2k<)%lwѵ,Ƨ_.(8E8ўQ8K~b n ,m(VuC [ s!4VsmWNhh<ߎEW#b %Z!?:XNJa\S,ܬE)H 7YVcn=nM} t:$Ţ nC`QB7n4L6̴$ ЛD=H'C)ږ A`:1?9irk?=5<(^ZSp@#ObF/;N7!7GIɸS6%ݠ,W[Pm-PQo٦*i᫒on`DНM04YEwᐗ)FJtTL"c!= {MvB#I찖V0G= N$#: N;zɒD7K}?5jf1C4ߡB9nj^?X閚IQ||(hIs){Ml-mǢDކ|%/lZr]E^5O{VFz\c<и,E_3 ?2 p2ݎXq7yprkn.)wYk)uɇ34N{bVюѤ#dr$~Ԝ ±r=+r&z0=V;nwC+Zv %Ee7Y3j~qFנP+E˅@]ސ7K+ 3\:vekN `WJD', x3l]OF(A˅N-I8 t`8B';lvǚS\7hћ*n-8 x3G2B@ђ5ϑ{ V`SY&́GC'-9n L5Úh[z"(c҂ك(x.ϴJtegĤEϠ:bλͭi5{,w1o9Sik'z k,O񂵅+˓⢡M٩ϐccV*ݘeD maM\c &wG &^Kq6dsщFUL##~L%Ph>Mje,곳+A(t`Zx$A׾/yb ?(d;TZB:eh9r )",6Tމh=)9e9lW4{;sn GѴ&&!ӦܳU7kzX_gY9lHUjJcu|gbGD+mI{.Uo8lj Ɲ$V" THEn5Sղ!I㐒`A#Kt58G~w <9n<3znIU.lTars*ّXʈ2YG kp!'@GF=sA͑fEz ɦ[o聰dQI.v‹{QF. i:UUG_v^ rDOo,&V'9lcuOSJ`eȁ "t! \'-S gLN6\MRD58oBC6$%R?St; -xՒؤjs>D'mz.%u#ځF K# M)$y!9pв!8_˜i?Gq eހ'J7c肧Xj@ID-{MTC ʉ*8fQt'Zٳ@ycd%FNY<t徶 )Cւ gvķ+mDtFwND>jBoTϑ j=%Zsr6͑["8VVkm`qJiYhxH(-LM`FtMn* `uguLU KY 9\AP>cϚ rϬ,Fn-}a‘ Zʋ(! btpĭɡN!wa;[&vQ B9šۑP/yͰa\Zj)Cʇ$;jViFL01۬ZS7sxH(,5+ilsEXL5F9EZ8y4ǹ症mKRX:; 5|H+0nܵ(_zqśu!͑Xp,p>9XM]oT $d;UG}Hy0QH* 7X*8Kt~v\ӽZ.h)l5?ny e %H65g<w!7{2jHň9B@yrte5G(ULK @En[?aPIrO|:eWj9-Ędg!J};rl~~02~< QX-w _ 8t{i r X΁^fNW clsxaNgUݎ'BJ][R,Fvc>džSW>/l> ۉ\N^ $VGB#,s[Hـfd]u?sYrSP9;{ޱGu o5+M0+?kTֱg^, ~cY/>tŕR|"P(UAe-nAq/kZˆބ`3k7Qގfj9Fc@'.aM^ :%'qn^BuuVޏm !g*u u zl~b;Zpq`g~9E\q= r[ ,-8Ӛ'>\Gynhtx6WgXk \"Cz?>(ݠN1*EI!qy E]J NkrcxSԣVK~%,q;p&(HFo.!>?M[ـ[gJlk_f/MfzN*mиIroǗp%nqGOWN @":-/4S-h t_Guk$;Oȵiܤ]% uvro&)3cQH.%Gjgz"ϸ,S >=Zc@O 9]YV5.}'> rլ;o:&Njɱ9򋜸^Nvƍxn䲤cKMInБh\΢ˢ5BEp2##4!?^MFFx+CWpz)" +zythaRyi.)d|9KqpYkt<:d۶yPτ%^φH~>%x]-++4dӧZgwwR Aor\}]Pd22pmw:vE@OIǕ#n͓f$hLJWKfߥY6c;,.+RFN[ϋd?%ķqO7>s-۹⁝\5QC޿MA7#"6W ڍ}Bz*IK?n_{cO),*ՐmhOS .p_e\*5|sgָQ_4C~?#ʡsA@ȻeHZ3xYib*bW5ہ{+c_ʵx_tTfZ9i-Id'Bluj'rY:T+~rߧe-T5*>_gn5ΗӂqB28Y=1 x4䇟$C?@Gzc"6 xMieYZA7T3#~[|s oO} 3dIgyA7N}D}o зBU7zop*/_-aF>ҁ(N hl5+4.?_SOdRyz] ^/rBo'4睍 D:뤡K3CD*\7{ OU>q$?GV2s{b? |kB;,87pCrfքv/@s'Xt& j蒙 r-cӖR*{h}o.>)?d@O]&O)YNI.[9Hwn5u'fu?1bEf+{WJɴݾPqQ^α&f43)?eS T'DsD^Kݬfx(MI5B/FoЌr8~3I∐vO8#оeq ~A_*ȳ O6" Ryo0ΐpɀL|f雾_ L;!sK, srBsÍ4.ɦZ ,ѹ-LuAnu?]^+$5b1mj1mΙުv9Q΄6}6{Z<՛ ȸ|3SF^ټj\Ib-6d J;u䍄7էx;)zYN#Z\i9IneoשWE \9 >9_r#OU{_}Rt :W$ޱC a:M -#,PZ4+~ju}:ykZ*k=r"ylm=$}IOT _!ۜnSRn8ڗGU' *,/6@R6xW*jSleo]޵+rfε$ywĹڅ,m~+kr'H}Μ9"\W_z*MN6}Vō'YIUmrU;$Ӫ|U|mZ:%=\{[Y-_þk{_k>[\5(,ӆ;~Y-d q)VR0K u?3yڠEO#J~}X*D΂,T쏛s\:YoC=qCe8|ߊY'!'|3=)߳%3ՙq[|ũbZE.G|b?s.<ǍesfU(4YBnrFwdg!nyTkqF =O}% _<8~-%DJUa*zKJ2~K[B6]):*~.&O}DGR/FsAn㆞QU.pk~ :L>}׽FLh΢E: rB8:Cǖw%9_ޛ|-o3oy]uh?/9/#YHBޢv$us/t]Et,Ac#G-.oEn3GmA78<V 0:\o]|# _kwxzRv !d/t&m,ۆlr ]?35Bڈ-K}B0r҅3w(v!W*G.-.3xWt)3#C.[KNm@9+mY^!t'\.A9/H r# .s5Fpbˀ>CXK'Ux8-߳!"pV3GtbH/S .K`]հ~ZtY9f+g~HkX>.輌=J lɮnSY#/y6[Vq!UR֐z#繪-#r[Qzz")+r#h#ʺh * Z?!p9dޟV {z.\ (}8eVF%9!蝑Г"WEX:s=a$貴1l./zis9]r!Be4.r Н8іwf+FAW>Tψ|IV]C.K.5RY[]z!8AE2݋2veAd5]|+,:5]RA\[ctK:/h^lqì^3?^#O}7 .)Rb`K(VJB^}6@&; 1'z!- t!3]}%p#؀:,W;^Ei}E z'4-sUUΘ9:0vKj-R+tUiՉ"<`[Jn\%Z}:KLsf$Ws?o!*З:9NkpEzB>pLRGx%;b$kyiQӹ.rpK]ר,Έ.\猊傾-uֵLs߀zI7~))SIFG:<FS$,=r?fրk4ml`H_7{Eb3^HJ0#.5Mƫcp1 aw.@;-3ثh~EF3=ra"iץp{4"!nt6 f}8[(Ż}{"rtF7||ΊzV+,/p'AVX:|\ hB*zGon,2U;ԡ[DM%O=% lc}PD턾BbG:!sV8<8[ktTgYN@_{{tD87!w2G@>f.ܜW[t\,=!)LVd_b,`kd*uF$m} G'>ҡ7Y_=G>/gm x0䀾נFl~n atoKBFEn1](ts*tv"x>)T"\͒?lҠ;|8+獼Xk>2o(HKjih=c<[P8ˣ;ԠW\㶂VOyhݪnG?(nט>0'gU9dr?yg=Vdg1'o;"mث_g[{V9kO]7 gqGFv?I2J?M9hl)J\2MB9ڑ,lQGbRkAh ]#A'\"voQ-4Yh˸wQR^>#gqk,R: pU>\|݇r%-xSIv># \GeC Q 9Goe@xcW,oB\bsu G&Xu7i 8޲񹁏Xq큽OFOiWq#qddY#+Wފ}ESۀ~>7|͕XM= y$7ZQEogIحRnޠX$vwvhtaLbjJkf,ܧ'=:=SIU;jpU_GnTiJHJkDV2-83O+Ou>\5)'ͶFX肋|mʅלZRS|k7J:Fk~@,6}bH|k Tϳr~A<" 9Ef{rCk>5S5n>9 n a+ -Nd&턝6.)`Z7Ac@sH'r nޗ|:er!_DgͰ7ný͏0 saidayʌIs#p%*n9ѓz\Sɠˆ]Bo75y@zE[? 2;&JUT6OOk*!}8\< _6iP~Ll7q[P!{~zVCR5j: t U:sncrECC ^+D{?{#@ 6NHvguyKAcz+ZBE_.SVrަ%rsl1nwإ)4r o.RWgA.3lk&.>µx/з"B^ؤ2^Ő.Gisʽ'U䜫a"vۼF*7줋.[ Yom }IfgubY Hpu%>jwb߼, ʙ6{yz1>]J/I{ѭ޾uǀ0&ByBAD{] ʑW( 5[RtZ x,b*6EN5$Mn/3`YOpBZj$<v{z\GG]*+~|'B3&L'e*27;&:Gv{z_5hТD9~ٕW`LE| | *c_Hk &nw5 ichAjo{+|0frI݊?讨TJӓBB4Ccha.wȀ~{.G@8?%p,?, %5]@Z/ X햔@w/٨{zKfe:No UWoz.S,xϠ.<$z{ZK5Bt)Bl쬗Љ8Ǟ̪Y<)|UnѠ+_o?zQ)W NEߕW* Aˈ`=g4iEzФ=٣Š=;jk#pș{o_zD`zì_)0ʺjDEN􂾩gޅ|TE^_w\O] FwRjȍ]e[E^~0,@/{0 N#F??oY/*!7t[ Li,L)oڐzv!Q!.PnUU! Xݺl l~AmLw4rAwi>G~9W} E rîqgٰ]csg^Tl}A&p@3y\^vޮN;GͩR*{LaSi w%|b`.@Sl BO!_-DŽyezFvAw$d賢Ȩ{uQ?gxE K|P~Kv7,jueֳ-#:m킞'SDӀ6&muY:} 0RnAl42tZn04J*;&*dd -ՈtE:شiV7;?TΒkǵ@ϼc.CW4Ri_wgh*YՇBW=.з5O5i$;W&;uIm>ߢϢT^E:r|ɶ8Gi_tEZ F!:z4~LTƅ|#C_Yf K4삾CzU쒎vҴtS({;7vWy yy3Auϣ)oOcx$O"e4V_ի Gչt֋$cċw Fy/9ե!ț7{9dp!o/VFcIyg/& %Ƹ]]֘]}Cןtt+cn{GT jItttqT5BXcґSݖ)yC>Ї~q, >`O |ҫ>ܠw]w'u Nh \Iw!E>}f<ާɳ~,* KsN#Z| 5@^ckvSGU$4 r~oN*" R#JMRu&+s;Rx@A6Hf :_?PoݠEkfx Z](*=/|8.xLbXDu1O^CЮbe{zىMV <];E ofY+5g$Uh=I/Ͷ@D!hrT]^MN `gq52r?Vt>= rL ݞE uE [3xdMN})_a ypͤE;{q8EKk&-kզؽK[%v_-k8r&y!U 8jC/rXLXΑj9 t GZ'@f WOWVۧYAמz~}$VpqѮl!t_ yONU,^9r"?}xRDv7_\;ِݾR7hF Ȅ v:η'ïB9}\G 9PNI3X`'Y!_m@ Otr4O2kCNeOTc4?I\}:Gq#qz9JgEN8o9jNA/Ne, ],\I.Oz$vAA^8#BT.?]!мU*%vfY)s+,nhYyb◜2[kg59 _V"Β'B{z{JekdLu@==#4 ]ڳ5F9.6NܶCZﯓZխp vv>g7S?9-.@umha=@αB؜fM J+eHмx2Cy|zQ1L2'OZ-}ė- \BeAXG#wկ[-o7p'~8qZC ϴEǵN2oZ*Iy.k^'BT4O_znkgwU"Rf\+C)UJ7r80WBm/_i[Es^Z-Ԡjn\:sWʛႿ O[,U{8 Ŭ)ZmZEo~3N.mGv{gi!R_-aidc.H~o.!7M^bh <-NvŐasrBܟj'pֿOh/o3F;qmC -9"6O'?O69_dMlwRǺ"gZ#X~)&N1 }Oko[]hn} ┑|#Y,eMyҰyy_!mUOoi C{9i0qfAg]68dBӭv'fɉ}izŧ5nnÊ[9u :6.pߠI:#fDq׬w('p9ϴsdb#Q/Wi*B/Ԧba梔n'0Hn=w>C9 ^2kkT\W7R vài/{&4WN䴚+IUmQ X2\βdT}'|$~| q<܆e=7Ot :JkG=^ש04pb'd^VG\*_^w$[UL+^}s!,iqB냔EZ, G4ˠ> |yJl64JxJzG,i} NmIw'ѐ~K)ۜ y\k;:N𾕀υ J7?ϼUlrpqvVqОQ+x\+O^8om*|UV ݷ%M(?N,DFvr*O{Zz9]I-nЛ_&O.M2ʼnȓyU\_P' h}Dډ|:KuB(\byv"բ t߹i 1!,< <[e:-ܨeCBiFB]΄3|T>-^~VErh2y[,$ÿOӊs(fy6nJ:s[HO}Ivh/'lrhv'r"רgRN Zo=}¤E\=Ay#=~`N4'r]Ᏻh:Koi6Q+;X.v[[GX32Bi`sʸShVd8$2\B[ɞYXcB/+||~S}@m8Gxŝ4q,}\~+9& CinJw}jV̥!ow{-\x&l~z5\eHNU\g9sfAvh <&WZe2]u;*[X)YgD|B4P,ǵ"tFwǵ)Akb{8j3A16o _ޒ.TN[oJՐ*_)NV&naM7[]kp*o,7Z.| 4xQԒfZr6d?)6?3u0>}%E'ʀU,kٶ(WQs+w*ݳ^\_!WbO=BA$Vogj; jJ3 {j @t7f07%bmCZ/6_cCJ]k%>V1sW诓߱y4|o(w%ji-3-Z[ռ3G䕡龉oˢQgg48z \ú79Ng7~oJvzթM }!C>7Z#bj>vzW ]e⃼g_9:>ŵ5<#}Ěj!hWYmkRZ+8Q*βKVe,/co41K!dF(C9[YБŅdFNl9 xuyOPkhcZ6?~e) i6F1zʭO4#|fs aJc5hˆhr#j9j<Y#4@leGcrHN#=JEn^nEܜO>{[|f7ykìF#.J6)s; FVnyҼ'+HŠUU- 1y9&iol[k~1 *5oZ;N),۠M;[.|N.PF4CFnO dl!w^pZly>La,N!<1 %m6Lr0| (Vp zQ}&f2^󦊽ڵ^BMﰇ'*9[ Y1e8I4lS *MUCQO[ \dꄬ6Gޜ4C wuR\~zW+-,:, y[7ZrUN($wYE >݅+r9 `bV7jeM\ Xȵ<c1Ybv<=8I큻oc-]iK[TlNm+KDUc9ghu'@?&'_\qJ\WyY.aڡ7WKs b'rzȠ)wȄ֮ɓs7hWEβJ|kI8=q"r֭Sh+2'^e13A!ZnnjMފ{iX5y\Tj I-lbnJ:?on|(gV{WBEsy}U,tͦ΋;+6 B( |97^nEL! =4<O<|q}Şg+ M.!Pﱨ |&9zOk Hʛ@k}|Ilt6cIqB[g ݍq'YgUL1N6k"=W4Y4_WHdN-YSԊt8N=lepk%HмN :E.nki%Kt'{S\b)AbDyJ>Oʣ`}AwZe]uݡIn1#?{w/mfϲ~V2́cwK~mYmh3Om1o;LFo(.OkFX1ޠ ^#C_1I'6 jnq +YЭq,!>w+ : IGS]7oL$lm3;#W=g?8ro]Ǣ }iHNSsqH`z&*ɸSSt JTx淕i!ϖĜZ;`S.œQV(xJ4m[fo~y M&<褒應bnpFB9tÖ%-ѳ R?,šNƂksK]&[]aȍ?%S*#7*,e&6Ho" t[,h1$đQ-Da>Z)nlTcmRf]4+E>fj˝UKQ䲸 +p Ex~ؙ q؛|!trlaFr/M"DrDb$,wv9Dȩb9nSE>V(dY<A'\&^ a\u\7t7}sr[fߐ[&ZS~>]-Î}"v|o6MR/+-e*B#Wf}6RD޶>.kD^O;}qE%>Q^UxA;@k/r=笁6T!QGgy!wVh`Gv?6&TB-LFS#k ~ztP6N*< _1D z|on9k wYI#@3lVk5E!\| # y[%3aSڎOJi ^}gtA_nU^ՙ[)5}A8|-fnY3ѠD+lLUt`WAvykFL KAynh>NA'Tr?37·şaENȦ 2ѣ|4MM { 48ź >7[/F>>"tX%^zՇSuމ[t5JN=z)zrd9aR~֡px9!ۏs}K@S󉜸]K0h'M$!\U~ZAI: J?m& fS*Y NtTh x I2`rR|Rj?J$bU̐Y3Ir|$ Jnl}TPr9Ebm?[+A`uͷq <+ ygx^_zEt-^Ct .pb'r*!6.@2x Ŏ6`6?/VV/༄B >ymja+M͐5ǝ? NY芢]L}~QUhf]9-v0qUw G+nLZR ag9~#h"*r*&+M[fYo\W/{3X^n}&Cjup&͊&Wnv\t05a˽>Gc@f9rBT+ 9]7mAD+щ|3QU0,P7JRt/ޢ2U'y]Bt>u@;m5M՛K8Y48y=q@dgi!V7WIAoͨyf>.qDRpX7 V)TcIA/-r 2.Eqe yhQ,v"'j \BWj엏EstEU8sErS rBkĕZVDu|2tΥj )Ӎ[bgb}:{^&BiJ^IG, !G\y̲,C+jrX$s *p$mϞ^KиhM9G0/sN: ,bb}D>ͣ7iQ^WgpkA6v?)JXsU}nIъ:C)bTS(@S9 ]5Dzzn1Nt n5:qZ 4%HnM^iQ@:{kNvj+l8s8N#m+S(}p :}O z߽xh6W>޳.l3)sV`ENS̘ 2YDqZf˱vz؍n%I 4 )r%+) 'iyJޡCϻ5J- sW|v~ȩy8MO-=@No(l.&8jnk=."? 1bU/8-k w%vr OqmNWkЊͲ_cy_{ +hS.*Pȏ_-Cf`/ yLhH875-"| ff'py +z7 I+{Rzأ觓ݹJG$_ׇhBЗt➵D `%Bƽ ,5>|3!^!}2;9$)&Ht>ȓ .mŔ+bЬN* [7r٬Lȩ Q9&"<eVΖPM4~kx*#͐\3;4ՠ䯫:myJg-IpVh{]Mش3%>kUBom AoO֞õZ֣! !.೼>+0kH~7ZNܻv3nN(_WȢAW;3k S&lJ{|o6h|K]z;JDJyWZ^`@.s+̳JYzMon.;ׇ ]&'ez"wK#h漞~е~ng}(KΨIg\ݕ76M -O#ADkũ2d 7>'@ۼ)p!g^&X)Og7z;e3n\RF1L3yV6ѸL׮h8?q%0<=p-#4V@7,ɭ&_WMC-rۼ9ݰmwA})b[\SÂG̓Ïh'\4I|à-5EM&9%n&f< 9ڸmˣ5dTO1"0"vNѱWkr*-}aۗĜ$WbAv" @$o7͊X+t~:^|ni4?pLrk.MЌ7Dj'wTr^]PI=6 Cx޲9P\[?O+ǶϿ~@I9?-[Kes}j|Z. Ct!h{gf{;`O#L; f9Lc= ?"A 7wu#&j$?ĸɹpDӲKĔʄ^IXJq3A$v!9{̹ DbDdDY24dxp r-Ȼ/*D(yȇ8D2SV$_e !'pg/Ir"(Gq}e艛זYQhv*ڭ+Q974 Q|e<р~f-*ȝ}~|f=c`~e 34{9Gz<fb#Kx{4Kbd6|E5{$X(tJ|*Z J$ QQb#_k5ܗؚasUXv7~-MI㲸7KsDv6O՜j| l[= i  }'Cj`@'rdž{{ ߔ9qˈ|] r2_{~ZWoԻ[r(B| */j9SBE3אԘ>.C쀞e.Щz ~0/^]Zh9~ "ew]iSX\Aj't^,dJӹl<ҡw㾉Jv*ܪ0~ȝ<:U*r|C؄*~ς\c)ڰ553l*:qudWZ.;E.гzAqꙗ!/TW3AϢW]wg֡# }GFAiރX>u7趺O}j1nۮ+OНƞCVe\Hb3pmyYlsL,UDx1>5/XbdV%a$}5 6tˆ"p?ГYQkEuv_FLJ[μS,.XNՕ菧y?"عWgtЌJ"`W*c/G< iMh+ 3::λH9̨aIn;Ic!RW+)~Cň6?Rku=)Oo;juA/ 9ؾ>w-Ih #0V-zwa'Y䆝vn4|~\@o|o2bd_>b嘱m\%dh;\]F:5!m:s@K9ƨ1>Ԣ*td&Y5E[ZU.Fewz]<%Ft y F]704to4jʊ~}"o&9лƅ| *y 4m]MSFzN/YݹcMq?RF{VoB;-F]O̔-#m}98ŖwG?y{̏t`|AsBBi+SWKzd_꺰Q"s!mi-ѵcؖo/%Cޟ: z6|zkkJ貶~PTܡ;bB$o]H=c䈋/Y*t\t*=c##A-%*} tۍ|,%tahV`2 ,Ί.dk䵡vsBop̿A^E&VKr7%~c7i 99L t yNvBgy$6 KF}]lu8 )OW^z9e #7vJuɏ4}荜Vh"|"& 9`c#4(仑^ z&"-;Z.I D|/^n#@.(F^c+ ƅ4RtA܉#N2K"V +hWddt!']W曍t\nht>AR_|E}ca$>om0&W .==-ɳgx~{Etm*#'>xn :|-/#OcE/!r.q\Җ_]_@3v~ܖ h9VbrA2\Oz\ !]l Т(RTVJԳ`nîd?mz֥6zx]Bszewn7o%:(Jh#QybȃPGK>Yzq!1mtyN7;42?TGoT]/-fCӻo4Q E鬶ӥ#ZDžiĥ^IeD!:c:~H[|19J1yD v5JsޅwLߨk;Y<^} G-ql&Kiu}Cܽ4L^~Gh:zg|3纤Fdjq/Ou ÒWJ0J8~U;{껟k df oq t&4זQ<Ό٥IŲUkѫH[e>S|%E{.@~6yҤzyb$|=꽳 -fb_p5T\پ:Io˅v 2tN_%=fQwC{iCnQ\L9M t|kҠizH#*yn+5~ymUC.4_c.JzoUI.C3n2g(^#&m:/u@GS(`L7'kWV)!mE LxMwbta"DLD..? ]z1@EN$tAo(kz)(ŒQ*FuR%F﹇AЌ#FGzD_'DYG/Q]$^t/ՋJ6Hзfze3X/yAN lRm#-L-*t~y`޸n'Ӯ} 't 凼wQE tܱ jȼK"=Rzzϣ2.쨒NK^N|2>S-1j'rVty*zd/>μPybE':/D SFrG\$N/sLQ\-B\ʋ| :EyF━A S+ 7\޹wH$&ֻK~:Eyߔ4iB~֍F\973U{NY Mn,нDn#eNYZ'pK(C_RY|XJ1&Cjr5+ $rO94z o BrW7h=ClF+YVJ=pX S,\/1=/](I.rVW2^Q'y_;`UGցhDBlЛ $Ký |*ȁq5D@FrJp}(,b._#&]RjX5 bȑ+)CN_2`'W,K|9q$눍|j+v\c,٢9,##xV>);BÚ^*X"ϸ2LKk+\W!x]ZfrBDb?#2T\uoȑ\rKjo&n5\{(|A]i'DNe :I U/TUlEY[Tg(! 얡|qQYcO௸Yu!A~/~kWh^yf5L~7(Zz\]1CB'ڜkt*ICl\7ܓp?w' |{6.>%[Cxu FOkn%hOl3PPVGĹ1:SVV=f Fڒ5Rj'7y@)+:4/e?/YU Zcɲy#׵Y[:3ęo{ hs+ϑ#Ny5ZV#[V NjO^)H}ECYr6XkRI-k}Q.N?}z:t;HXdо2,(xZ\)9XbꕇGCNB>CK7)rB~+(vQpNܢrQ)r69XѧVB [U96 d2v圼Pi;rhɡkmg.૛9'xOA~k|e3o@ s ˩1lJp]dD/> ɇA@d9B^g&o;B}QpHY1I$xnj|"\kEh%4IzB xbCq>b=|΋t _eI:_29"a:o'ϯN_se}UߦkI%-weE-6j'r]IJ>~y}$K>}xO3eU"sa~ډ)b*~n"^8Qs/=7l|c |EY+4' ?.pw&.n˿ {s rf7Iȓ_.1\,Y8%핱#lo(Zm%,oX@믌y:4Ekhgz<)w.ob~yi~<_e$psh |T]1hjG"?l"ʵ_<Ob:9,ac6%zIMޚZ6y4imz*j(vmК+5l %o>ǃטWb#oD -Iv>ޒ jЙ֟Ev;_!&Bhv"1V+Yz@KS~g z͓sBէbkpi9>zX\ډFtF-(;G*ɉm{5y7nY>!hnkfZ\rB8Sɚ 7XH䏯p ga4`4zu:48۟;ϙ:~bkvL+RFp؛*63B$r!A+WJNWhe$o_iABi&O"\3xY1Ї28#MQm֡Zǁ{n贊2.7ӕgo [àThЅ=+yahѫ)87Ji[FD~pQwA^EH4"; t򾨟g\jB}ϯD7 [~@tc[p te(_FНf*j_^A.ʗko 03-@5rw|E} Y%dn>[Ois3BOW>:2Sp$f~Z!x^kUp#b#= ZDNOcھ"5_{L[Z=}:ykb9em`),9GWm|1Q@4UhoERoQ9zg"V {œ.[lTq4Clm-e;erLyT>zݚ:NϽAnWB|[$y*4Y5|)ndHjg( !}:n&?6b'pmS#'25wT8#'vA?' |8i+"ox^<Ќh%!wʹ~f8qqP^Q9pҵVqt8KhWF\dQ#Yd9:$Wvshm#"'pl[9]C,)}Te#opG|jY ~S TBlzz> d!' F %#g͋@č5ۈƭݸ<5?j%lY'rӤ1_*'pH'q9ﻯb, x CwRm@ ydosnjn#ѻ8ʌ[{RR?j[$ɉy ='[y7M_ΐlo#b:T򖾆+@/&}r|MXzzZKvㆍjDzh xBs&q_P.o?K ͺmS4O)F?ٛ|?p4 <.=FBg.oْh vƑi!D߀G^ܟ/ oOЬO-&i}S<|`ϱ/> Ouu\'+y* ͈gW(5Xy_-#a)jFTˉg`P '] {:ٸJ~N}& #Ւ57I$y A-~ [nyDЭ[$qvSЯ+Yl)ЫEk8}lvuP'py5nj%2b)޹E6{3 <%*Z'ʨK(;oӦsMh:"mtg<[[gBm\IȽ[Qj 9O\W!Y}<[ऊ /m*[MCV3hʓT:sf^>9"Jx[X.p~܂/{Jni"Grg7C/ى|>oye>uiPBޫ6$g7y"S]՝ޜ5,ZArpPAFnʍ1N=ttIy\n(*p9FZ~I+-~ tB̄F9"%"NLoy / 4$rm4->W93wH߯1ˉxi,󻼐A, z]7p>jЁE򴑷5Sr"ן$_?"l$HZ@ Nb/$0_O‹~h'niR\f=q!phȝ~W;Wg޼Ot{0pfm ] _"Ov3zVϊ-4HT/}6hMG^XsWs} vj2~r#o)[Mr#+{%ްf[nhpͮ%^~*<.:thX,) %D] }i *1 }q rY}nPr zo 'p}z#`j|mBcZ"$ FRBiCN+ dUtcZ+"6}YG2}N}KgVڻt_W!_${W>eݚVîA^םO*Д-}+pg}D ׯB &,'N)S`S,'RRZ9x?=VþG\|3aq*k<5&GCõVNTݑgw͛/:ǩR졊.׾oh$J'n!^)u6Ѿ酜Xfґrz<[rlRȻ6 -PaNΥ(lf %A(`֊`O%v?|%T 7 *zWDN'U}L\\6vkV-LvƾZ2|H =ޡְ5m7aFÙ,AkRRN}[0 |Bא#O# v!/ 9rUAHja]8)aMX?ݹ6N-]p#8֐S)dhƔ]ΩCDN]d}R0}!ĝf*<%kV9_zhI=?&M#el:,Ѱ7O~Wr"5>]/X2`sd[+/kYS5oc>ScdgmzZvWeƩ[-%3 >c*2;֔gWC گɢe7i>k|]q(/F3 oT |߈?Dm9tq[;mq^#YB|^odl''r?<##p.KWAFyfط>R;zCKDbymqS-m2!6"Ձ?5Lhiy]IMy(z@ɐ<.Tq)!{\$SkzСtkn0{Idz[2Cp.p#..HҪ7p N%2\|?7UU3sP|\%S-iHJjhŞ=0r=%}6D9[4g2Z=q>-W )]4.1Ϛ1@HT%ћ}@{9 >kL VI1.AP\'nHoq[6nt)n?9#(N=.gʙ]:hӭ c ͬxWV/`̯9Б[sW*·= 5m>*2E{˻D{Y/G4h؂f|"W$_E ] E3+ۺ}u|&r'˧)׫>47?2g-: |D<ϮȻߜkrf'~FBNIK{C'-ډ#{]TepLhCV\/ު) ݁l y;,.%PJI{4Ɏ@~@-Gm<rM1V<<"ulg'r B(:CFW!0˸5Bm\x_-:8VU %lsSdTo眥^zWz2^)/rJA#>F hC9t#oHTXC ظ_ɡ/p^Ї!s?c+uwh qSk})u@%N3 @&vBץ;e $$^fN7к ]DvgqK4Xfʢ} +}3QeHo>>,[$1+L+EDl_9gٺ[虱w#b.e}\b0Y%^^c1ր?PWj\-YY4;_8Jcaγ<,bР~K#g1A'r 2_6.&>%h"uu"ʛqr j*t?3|/jɦ)*vkנy8E8Qpm9xٍ vX.52-KdF藷EȄqhm ,ef"Qqn$3t FHl CubFN]Qyͺ-v&y'wė;5:ਏuhU!U eie9j~>k{( oIjoDD W!+v!u.[ZG>AِGW]Ͳ)OeJŐiR/ڡ)fbOTۏsS1aZۣU@*'pwzw=9wW8`|f=ђq}pWU@;9] ~ C_cJЃO*"9Exwml}A2φ}[©؄fD^e]*1B\G|oFL߁DADnv-CkiQLGBqJ6jWj\eq Y~bjN)[-h~ONEB!SqbFcN8ꖛ#, <'k5L)q-NiAWo S-ZvsQHV@/&9U%{l&lP?C\ZA~H_z?S C)"QLZ*h\>Jش6N5Bu 8GBFF Uzپ٭=@/ggy!߾ ԺiZ,X4ރ].j#Jf%>ȵ~OOk,3XkV/3yUhU4p@zOHtXTY>R%quth8quAOp=eu?\كo6fYep_!4FN )~>NGԇM!wA!Zx02L[do[A%t'6(F-q$c W&зaWKD0AAd+R KZ)sqfհYT|% xf'8Wn%Ҧ ^܄d :4[[IWvJ*t9ПeZB\U j9Ե J5ք}[25tϹ$1( MyGE]kl8EJnl[Ye\:ſNܸҭ߾R# Iy[>@9Mg[J )į!p<?6o;~/n&/C3gc;_ْNY rz,,})F@/Pj67 5H*ѯ\7n~)eC'qo [;bק7H&H%¦*L>έ GC..|;${=EdvqC>U|%(@S[|e>:$`;yAk Ua&oyq@?3|+Sj.}1^/^&.yʰWq|<}!W^nNYZ8NN7_7r8qi-d>$v#K߰5WiJft]Q ^Ѣ` Wlt \bω: 6GX6~c @.l{!OREwg`˟̠hom0v>b'V\HҒ}m`4" M+8eJirY&զѐ/ }cw[m%C(xBDyP%lv Y 4Ft}r x:$q{?&4p}wHX.\{uMN0+ç }B}Z$>b!(Y+ю{%5ސ]e/rvy~ ln |bj~* MB,=+r%.*~WD>7[#O(H<X}Zxj;kPWi Q|tk5ԫ󾪟[ݏE{,NT3 9M,{}k}ѡ|S$4Cn& d2.z~BSy]Nefq[Tc ܗK0  wUSӬz}'u8dW!?3"D;b38רf8]8vF@Ґ7=>jaS)׌䣟3*/P7<~37R^FHC=щ|)`T~&Oo>4ى9:ifRr(a4p'*T#qI;/7.WP6-˗B;ON5T}Bg)BQ|"n; ͺrY.@kv{F5,#x=.gFsa>'֠\&B+yUzAoSZ9NK̞.^ Wu&Lt}GCe`q=b@ oŇ6uMnnǞ܆U9jm6l6˸;2V*6mlX{|~nr܂ʾVn/- ݫ^/?WY=s,$[okV##_ϐ_] d}*WU\ܸ,Ka_bQ w4莹.kEW|OM[Y̊wXbSqk,q5P~/^ \q6s!aL'2y#9\mm@/k%&mwAJNmٌ)q1zJ-783l ' %Ab<8Kl7p,$LiʣYه)n^oOvwJ/8?k6}K'oT{2"n;X/r\!+}wZԇ\?ާ _񩆜!n&5%>~ h1i^rOlWs&S8Vlw5\aiv"(mϭ峿Nl30r˅t vv}*.y¹ k;.AεȲ-8䮯 q,@ '{ tBl"Imqb3YƉ|ԡ)\ F"1"r >r'*嵔]Ӗ} ?MjD> ZE_&YL-SֱO8#~OfFk+yҹ5Aε.nHu =BI!Z܄|AL#NLD^mæ3oAW zߓȍ=M4st'\ZohDE!L S~ w9 |ɶ&O }qUyZgc~%5AE  9xZ5|[1iv="uw$%V@fj^Wz^eɩȯ ^y 4;'g>U/M"K #<3?M^oo&1ԫɗV eJ`g闗S( vY]6o%]<5,^썸6?n%O ^ϓRr@*t3!۴|bAN-pp~> Zu {=A6 =Ad?ug[PVurE:y7\{<56.KpL7py]X\bgQ,~A\wOKXJ8szIεD>[yM z>A_7On"gb_vlf;("&w!'rJs'9v{KRpȑU|魎LMR:VA_+ǺU&ZQ>wuE\:^}u\䣵8E^JiTo$ m;ԥT}2Wf)o|V}?s*o=]Fy q' xGȉy,qv9 B~h|ϰ|u맙DJ+'ߔ8ϯSC(VjM) 9E捼g3bpoD3!:n a3>5} 'naqFT9HK@b 8N@\rtV y__g.g)AKYS@RՍݍRSB/Dn Ǜۈ %TY$rDU"Сv :ݜn\[srO•7tc.ȩp2ޡ5ogM:}10Z,^}BzэqWxg)СS:AF W!|<-2WAmj?g"6T2hoYHF#G?I֐^/((W6r+Wۼ]҂: %#qQ4WkF^cG[0!vȯKTq?_cupi@*}=K|h'큜;ivS<2 SʣR{D>sxl[HY69@@Wy!'>K ;\7'Z}D5xi@ 3rԠIP>'l~odh&pēn!=Xm h@+Si,ydД/調2Π)Ӭ6 fT(3DD tсKR oTVE~99[ZwL 2ۉʈPgғRGn8[@^D7>;6!.C4{C)!7>zTA?WBp-IYꛭDܞV?X"} .iQ#d'/ZѨ-(,]\ܸ |]m(*pSˤ\eu-ͬDn z98{6Ĵ@O{r>B~67no1UE,$Oߎ4rF-%zkrFxX^ ډ|ۀ>IY'aƿ;ۇNfj$R#5f M~,q#ץG "/I{fa=s"[Yl 2CbL2dЋcϙuRHo'!q#م%?t9RvÏˍb~h".RZ(2\ ǵXmgD'CMWYCC\n;?XVCvWqܕ9 ϤKc/s7RE\a9%#FnKXz]2l]!'TFy͕-4{P?(4 ]9T) nFhPP*| ֍ 4i,'Oizu= :7L:d-8E{dT?}og<\P-rݱmQ)A+2{h [FoHB'[  \$_{.*nt \sW?|]S B.] r+] %6>%@=N9?BO=b-}\S{̃:z(9<~Te~MqcG^y+Za_ʊ  Y/ D[Y%(Aol{~LkgoX yYU }'[-\WQc*T\gђNtOp4Zƀ/uޞDX&ǦhKn 6{: 5!(nm 4i3h=gQ@}횔o-jε{dMhDЊUm<$4]-$c3U=m1D,4DrK/'haڲ\nh%"yeOk%5+[r}<Ѽ{ܒCI9?ߞV \F|"6ڳQ9*ɫxRgKqc 3 Mp^>0p@w|+_fZmMGv)t/ܤ^iȏ <=@iUR|sLi:96G'Y} >F$ +n?ȷ2H,\y8p2o&Q'ܶ_:}W?뺙@+m}woř!|e UBN!ggh"u]qA\W=/3D"-oNVEnW$DӇ w|~x">k'vʛ^U5/!pPp+2MKO+|3-'Dkp]pU] QLnKwA+'OOirۇ\W.'pHXf!&ԟe3IG.MoB$e7}Zъvv|BЪ bBae~VΫRtY3I:kךv2Kl8{߳U$t@h&߇;a3Ģ+E%=0:3p Nrnk)gqC<m.r˷Y7or[0+T"TQ5n+Ϫ#ba;/Fc3˥x ґS[+r%9f܂}CZD;>XB/G QYm.}r\mmi%]y yG jFQhEJMK | ŏ4p+)}]@Ӵ$ xNζ-\,kf|G |=uCXi\O0{o wM,*m{^~!%~ 9V(|h#VvDhm۴}GeB/q .BBE%̄si] C?CD7r[DŽԏN"^Ѽ,ױ;m♘Y AMmq᯦[Q΀.k,b{NbU &+>>2r:"K* |VYj=t7[^K߸5z^*J̲rP*g[GIu2|i%liWxMK(*llY-Fe4kMK!O$%ۃ`-Lb;oMGq9~oyV^4{ډ[G ͢ 'l{ȄrwN+? "EQB. (F6!B_S[/ A<IVy5R.{oܑ*TnjY| 9&;k*Y*wqb˟q\i~'cc+C`-C:20쪧^W2@nԼ'IHi{T=R4}f'< =,V-iڄ^v k=2µ@GC[G&TJ-+E>"$qdP"o+9 }N[^7r'yS^r| 38C}z"o*By(;Jqe))BBANH+"]Wtf)+?:tNHЂ&e }EX 5zh\G?G2E>ؠ|ʬ_J+PBĻ?r\NeRLK ~pȅK>Op.zPPaJKAyk\Q}7խ^))%ۉ|<5\y~LNkYoNQCb{źa~kV?+m\gɡ".!LCR.f'%aB92q_vVch! _]s!T9qf'1_ jk'p{(ݪ ?fYmg=6j;Ud/p ]zCs_/Mk}[9r]c ~3[②:Y C<Ы>Kq`N1W0|s7 8"yVUnHnݪƫߋ +5u6Vnn>BNWT eڠx]".U*:So|<ZreCkKsRu` $swb⌌k*mgT9?AiqC 3*G9lj^E [8se ï\ GQlW-ԧEܬ6Ό RrBSX'Y_.ůȕ5Y9munI!,k>1cC]19O89%dDhV|3Ȗ(iuXfJ5L -8 ]+dT8KHGN@m\:%t*&tyd,hSw- N@ }c!-'rߥ*6g9aX$~#9|{˸Z9YZShU:/}3=Txj jL y?yMp- J4n'r'mo%^'Z\- 3hmX"DJ9yWAGz/4k$oP]D^"q>CJ.~gj>N=&9[*+ck'=(QZ=ԐD>Vo[͜RlYz! 䞳J=OBЯ>gch#}ӱ_!=aS .Ȅ/}R.>/yá W@=[qU_ƞ++U]%5p8n*CN8ǮMa0N \Wr}mrr)R[+[șO^2"cUN v[&؃ M_au S6;N I'rǕ\wl6}T&p~xx*$0ʗʳލfܸ4k ĵ8^OސGm(t%{Ű,[Y y*ȯ!@;%.n&q"“N뵚['l wmߣ/]^}I#OKmUC\W <=?5wJm7-Џ ^3tB~}38oBkG?t5OZb?K"O;7iD m2p=3JeCk#ˁqoʺL2̯7!+/@N!c",'_q>E!!Iy Rْ]%lGy 8oqn.A_"orgfRD]hB"c ~nK?6Z9$ɕ5;߮#fah}>*GD<4[d_u-Muheשc}ߧ)#W]Cɩ+IBF] 8Faa4|pޞ%l"IDCVW(um[\S-rq\|:71*D~ucVȽqVus)$Z9K z1-䍠Hm C.oدy O`ˌ{KvLCb+Щsb]Yg>t-ς.4>lnQO̲BWLbTc_EB>B2ff z8Q\lӄ\qi2(|#~zB lm[)xSyyJ 4z쇙ONpDޱeV׼v#dQ#/%劜ݶf=5(zW, |/b@_hޮ2Uhrv5/(Á'Tޑkiq=Gvl"?n#gHCďc('IO%D9/iA._5@|q-އ) USđ*JdkH~sܭUy7ȉ oP;^bS+6ȡA EnO76[Y1r@$վi#\\׽L3[mJ Z>"CҠő|H`;mbf ҦhS@sVovH=ͪFn1?tn'}5E$mz ٍ_^̇kᚼxB?Kx(\2?NI&.됍1jy*7l'{p@NN{9pr,ORHZ/)qMt%>k<- OoӔY1#\19%'pC z΍\kCQm~\KM/*COl}Ė6oe؋㠏TG ;uh /:a8."ܲ&HV4pN!'@߄ډ:/j\2FcrhwXiKu3R莇<͕,ZABq>Kw6.ϼp9> 6YKO#$>->x hč/WY=5bkxr n/KÎk 4sl3!x+Ck$mB\DknE| \YU-_FcɃT ܮBKyߑE2VAđyfo!w+{K6r6dOtD[uEuټDܾExS޸}7(?7(tmE^^Nįwh}o]GA>@oR_pz?(<d\p]zgW#[:.1k>=|.|iUB/Ó H17E6:qje5y+p=2_FP3+x4jC?сw>WgM[Ң'ͶGCި ( &nBr"/"'r{mw\" ູqsoC!+]g4x "M~-x`ahWv"7ߤ~Z6]:1=7 X/mruB魾 ס'pq ψ;ob&Z}v״*rGNkfTI43t#i5J>Tr םqœ}(4ǕM^u[2.͕^v WJ vPHNح[ y}9ں EjZQN(.~9eY.ZGәD|5@ŧhhX=Ž>|lC[vܼMWN1kMg|P&,0JEǦlY4hzq}[1C:6~$ 9IQ4G#*#Ϛ4b<|Rh'A:I{@q+%Xĵcs W׃ln곬໫b,z^\,tL˥Cw]3C c^]O7z_8"FI«7(4Kށd3N.<M ;:nLm?yo!.;s/ .ЏeR$zubKi j`OUxʉtQ3r5z+!Ym>Cʻ5h.dwSq -C3sx.^,n'BKmޖ$7h*/.B4 a eYD?Lδe;ln entB߼,ܬ@ bDߞ#Zv>7ZWjlj6S.=D*6INȚp#Ɇn?>;Zg|<2phl:GIFdY︾BC)~:t<6X.[OhL?w߷?zCεyߡJɛyPq `BNAN<7#r ͱ'{3O72,|9=MuXשj y;C3 CV?RB/nfEa%?*,zC=e%?nC]Z7PI"sy:܂{@O=9Ns;VEUx4D1ѰU#j cnt}p[EGZrWΈ9@N5GZܠ0Tq\i pܥsfF\Cٝ@gFe#R̤bs :#֠^BfN}]7X7BWV,|}E!Ojܓmn sղ^b',%T=B}T'++@8/dl%̤ r8(֯T亍^tDe5p,=BEzc52|M!F&^^Zv! 4e]jȣiBκ=TpX5j^ O7J1zq2\3uTyCB^}[ ۜȻo|"Yd"V.tCW[QeJTWFt!r1j"z*䄑dɸ!n/ҺF'ڗx..k (M*bv H8(3EFȃ$j. m^s p)qĆt'hpM ]!苷DnTst~!o)cc]@E>EU 4=(/t@.sm@_XƏP']oy rH;t@o902I?7h"c{)0z#^r1"Q1^)7s.R9+wB_N P7wՋ^1I|rCKϵ肜1ntۖOvR%.Ƣ.Z %Nh.9'^6g>P\ȷ1t+J}2"vEs^.*!S2WtmG2ˊO机JQI,QݒL:O ywK΂[TʟN䜳ܡ69h)#uAE[f -\ɩO;ǥt^}prR:^HV*rOZɥK\_\ے'J6N^NmnAsF^rϚe~;kqN\ ;W>[ghZNQ%-)ZNnY%C:N:s4N*t.{l/gXl }aD2!q% tINNѼ[ȟgM'O>l޺], eZ[,|[|kqvO}3^ %.F/B`[qMr&bwv/n#yǂ\ \_%3DEƉ|ոEn!qkwEδh]g% l: z כGp6Dw b4^ G;9c"n@)Mw{&-XԬ==(f*46lS$q294r8pY'rȹ+д[C <$ħ#W/O=$W{.%n{a\o!^=3 %{eslT,Vry:KRh#Oе4ܟw\倮."ȉ/wiy-4%,D)FZu~<.uiC"n"8EKwi[$B((6"r-8HKs <CYf#jD.ްX̲dŃy-Bȭ1;,2#nv%Fny˂7ͤYy0ZbX̶[SJm Ery6`/ |oo+o}|qU@7||q{ q=evxq/'][R-I'} ,q\aXzn7{I<`Woβ+OuG5,rr9s\mrD، KRh!_jl;=8:_i gK>,_ܺ<Qd3ݸĭi2kgOI#TG{8n3wEt͢KNG jГNHϑMsA&hdmTȥJVco#Wx c#nY];-q-nqsʕ3Uyl\-<[rq5dİsC7WZgtw(Nȿus[r+rCڪY# 4WxQ #[|Ǖ('l=u>Bm>n1*mfN'ruFFv[Srշu>=ކUЫWmwie )2V7|'s5C5?-\qAo+b}&;TMILvY%J>?n\j+|ZC*Dަzb#|s:Iw6'Q?MN^yVSʓ ^AS lH\'a) @Iu&WG.,9Gd)wz˸|C}ќeT,[wdW-1"SՁsS%;e=PySezD2ļP(s/{mY tDN)K{csmtMYҠ\ry)n@S$^6^wjzDjCj-r7_Э-cG.R$Sl zɍN!m;rmrrZDzJZ6+z|uMZOՏUVD<8=U~r{[E~Qoh W9`_i{Os2|Ű!*Q[4n0r _w?:46vS(xW#nLD xhs 6KHa; y>mNH#6hwo"#Mc"Q UQO Q0dn}~Nބ.恥>[GNwkYH5O¾!'#oI7 x4^el.!y[hQԑ7)^8}MN /r_P@g\U6",NeSd5+Y2:I z \N"; ޖR39Gg; ޟppC./ӜtmC=If6-) Eg<:Chq6%,=-c$DI|zҵ\=+'s!Cs |;xgh /!?k'pR -5b}u#7w36c'KR xЫ5qZt7I.BZ_9e֐[#c+ hԷdGݕ$ٍ u &'t/^e!CvZ7x皮p{n>aG*>^}QΊd7AqRz#<9AlݬBnB7lJ{#_2I[Bu5NME.1N00Gy#M}Q\8k/T~ߵ5d*q) u7n| pַ/ B)ikj`_㉧(EY A7WP HfQ i.a&xCo?+,tv@/Ag_z-oSHQ+-7'MZkb#|`IޖdB^fڅoxM~Mi =4=8[*6!Dr|=yT>֢mw'kC=tTTNkj<*6GcNyGj_e`WʷմykaB(m\S!`Ҫt=_+>n]5Ԥ~X zjDˍ9^1 } V42ʲyռ+y[5]E-֌嚱B E55,Z*~A݆~1E\i dГ\t ╷g\Ow7o/k4:۫Zi]bo&\3YhO h]ۏm1BKzs.c$\(]Y Q&t [C1%r F9y7r+MGeAm:rxJlڑe1*65g7tNMB{Ft)|6{^oi]6ugz| i0rp rVX\(Ҡ,GF)6O?G fkAZ]lK^C]ު`?/]+$-ep6kDI޲ɸF/}j*[muEaU>d1Zǎ҆H&]pt%jy:|IC\+M#&x!J4@H2o2t.6O?ZQuI؞N[hqV<*!; Qvn$Qؼ'םuRbz+k$dtv H/ " .[ <:of8Ю269E׍Ji/SRv@םGȑ7 d)V=ӉBʽ8O :0N@OmVM(I W}D3xIG6YNpO%ݨއ98v*w|_#vZ:/!]EOrex5E#{og'Ik4HKd#| ' P}?ctKm @ZOdz=nLs+Io-}ۑґMNm_ y:ǻd{%:B>-[>\Q/KW\Gw(0x h4b]\lAmܒjT8I/qlrˈǨtKzG_2E}%S~IMЃqd\qJ C"'tq-֋g @]g~Z]*'{d7N8ίEC2}TnZ4_wW} ȣ eC:f`'Nj38ֆ̘o-_tat$U 4Q"^_*ycڠ YrMҌ|:IP%heɑQnqpa-@ Mnㆧnd|l`!}E-Ft }seB2ґsTp;q b璌tuI7vR'vzjAkJdt@CTl藦 o]_4ʶ/iM}RZjuvQJ.,'E]rIzK~;١74{֗W~1qݳX}aV2Tr?/ӪTb>H6-ޣ:JIv'_EK9!Yi'XwR1*vB_RzGEw>k cҬnT/{ܱI®c'e#lDf#YCC+Ck!dݫ]eאsQR7c;KbмN]}di =].b2 &ANܯ rU[w>)ӒK؋ܭrAo؊CTnв` }bcv5:N0dC엷ӏ4ͧ}f>JcUcG"cJd |Ĵ7% :L.u솭7mq=%A{Q~hR}O:MXP υ~bXm<|>gq ė[8{o>C׃;t3 v:>k)WDޣ;?-E5Qx.5⚤|t jǽvΡ{yiCoR+vOF5'c$>%SàK#N.dpKe@+]x':J 0YO.#N}_ 728m0yarӊ\V\Dnufa%_4hI?} KZN{Qh@=qM oَks|K ^ቼ#ʿV y s^.i^.Ӣa3/v4 U R>g@qV~MgZ03yhVnE*0h:Ůw-*BD$0e:ru}dh-":Bfۚ*164-DЗ)i?s4J\_ f'r]\pdOO|jؓjomS^6F>d97HR3uPn[N2~}˚\:wc-+=<EF/R@tZhRrZ}uBlY]uf 4%X:]#H_Û3[)!=)e{ȽA;mf.atfT*: hK 4>&t"<A6N7z1Q;eAvDeu;Vp^c(:%,H¾jt$Oɕz;+]Lw=UAukz.젩u_m!0~l>~ځwUjF{2Fx ]ZBgv2tQGt]sboPm-]WaOtOl CVl=k:!Zc `#i`F~\1O{vu̞6"oT۲嚗XG{TtL*S{ƸO_nH>7Y^4h:5zdh&^9t񅨟QH0^ܞN Y : {e#HfdlȺ\@ %_:=sFîE]Hu1@zJuu/d'xoAO?2An3~b?C_>fM:A聼g:!cv7txN?^\WÐ- Jt@AMYBO12 m;ݸC[]zKR[o)4IؑUO%֎ =WodPFh: _|Q\\Qg2cRI?JLhrW< W`| ƍ}iL]{K؇K;;ŠwI =I zDHKջe۫Ʃ22u/@݅siŖB4|Dx. wQ-'aalm90fKQKX5э/5B˿la0Ku5.t$9 rta:Skȕǁ_iH?2:kt3Vӫ &%<]CWuLh_:]ŧ%4ȗ>2m)OQR4qtFluvb_zG>)E#,-O"cv6'i 5Rx_V S1=/W BEDaB5܅GK 2 R"ɲAKHb|Ӌ5-op@ E'TpUz ``ML7?ptgr _j/~] Z9eq" qNL%El-BjbR\ݗp7kwĕk+r=kN[&$_'@Nu=x[*rBbNz+d`70J7tdxL( {qOI7v5s 0Leo4Pn]{܅:VGQMFFKn@6w|HZnpע_ OgJ >.Iq)yAG 8zP 8̀ٞ&{EK *[ԭ'zEȉsZ^~r]$kE慠-@ܢ39=x@7Kπ~Bau8>N%%Huk2G"ܥ@_;wa4Flޤ!?| \2;Z6Jno4F~-ں\90ځ{ 0]dzQgŸ7MsѸ/3^H2^6tr9℺Y"OvI~᪌̠n{*;'5g5Ԓѱ6C 0xm>Kp-jG?/)W^I0T^i,ow+!gB@5vvxo]E5r5M$N BNy{>Hֵ brZW&Rt O1vЌ@_-K9|tB0CJeK'r"%޹($$qNO[6]Z+N6赙VCWx2f8>@ѸG'-uȐ.<| !J)ܪәZמ\f\Z}"'~R{c7Z^Oس.H#oK6] z#P0=RHk - dW܏2D;GJqg\rF55^ЧH)T~ۺR^9^v=1% jMGm%{qĺc]:&z 3L=']b뉜v}UK/'rH?&='ّ}[\89ȟhлF_# iLEո(g\at@}ɗwVM>o Ӛzi@.9@K`^R'$˭"Te"q!`Fn1i[TW }R]f#oR!lQ`KE|2N-RQ_}Bu( ;HCۜ耾Ű^ף8-Tg$usl`vPVM]UK[2$pR~A0ԝ:§9@uF |/ v8rrީN_ ^Akw1eZ|@_Q r=g54% +"~/ :k/1q ox0zf ]60sN4Rt27٢/dB']a?mX}-iCǁBm]6!']eKw#~C])Ֆ!T>KuIq(.K7:XPiN$j./(7tckL5ݣ- I3>@.+A.뽰[(rDrh_Qlz4Eƍ˅%הN ]>US22{ft_iմMޡ1\%d[FΡC"7rʉ4hntyhH>B_?'^axB? uaTegr=.y9:#FܥUh|1SC׊Qfu>KwyۗӁqzbF=]3՛_HZxk5wvޫ'+zFkC'2r2MBUn'v"=2%'=؇k#e }ٸkLXbdgbR]֝Y$fa&fT ڜ%Z𣏕!% SOfB_ǍO5Ǎu[Zs:aDّr::E[~֠a4;޸~NRRf5՘dwː+r\;H##^W. ꌽBR%類eoR]b~z[<@+}_6%GttVͺ|ĠHOw!?>R,H9Bz{reu:<;*G,0 #ȷdZ]d a 8as/=?RM3hQOJ aBK%WJb3lu:ݖz\EDms XpMh_ˋ*{ӵgbWۗVjQv&EyA4t@k//FUEmB[^J!H/}*xׄ..=zA_Fob@K`Ņ-T;v/ݬ7ӱnn zˎ#1|_t> X\ycw K}| zot.6pvcpTJc*s@?[z.f bYnl5vgA]O䙱 ٱ;:fPiI5t3\x].Sh׹"yR*/_*Eqjj؍|SSZSޖo{y$.zIWhBNl@lot@2H ۽ɴUV^OJ]B!:{z CWdYU.A6> A%b=ov0t3~a|-D׊,%g=%Ұ(|9S:0d^44I7v86)0׏ٝxTe۸IWg@Hn҃Ԋ<Y-=/!'2Vٜ}u1d'n4vCנ'O&^JKah4 /SݴY"G|zKڃ+oQ j}ۄK=[v#w&b1]tG f*3V{ElDho}57h fNY}ZޒGxc-9^?f߻KՠbCѓ_ u_-Z֠[aLv^ e}יZw+]-eNYڠ76]^/TnZgl5K:ds1&~RIjy{&+mr):iEfFNW<v3`7Wÿ͠c<^$v*Yd1=0JЏ5f{woI8طp9aw8fࢯ9{IWVN7x )sߦ_>OәA_j\~t({9k Mf^]Dq]}hgPH \Ym'F.:>{d2 ݶ:M8K>\й} Za,3D:.4;MCaJ؏i#oŜ֠x$cx:+xSAL͗_O̊ߙ̇{K:ϸZk:F.8rWS}@E_ޮ ;R.Q=쥈V ]b \{$'u?B :GK:aSO|}5œX/. udЮ?ߑ=.z efb#I}F8O3P?}{is琘bB#]%ٌ7@W|O(rח.|1 GQ,\zB\-u|S7rt|"ʯ \>DZB#㝵r{O1n?OTBЩ@NK ϥAfQg .u&=ghpuC3I_giDR' 9p^ |ֶ#*R;r"r")]?0r~ i*tv{c\,{"Q}B.ƲvEZ#g1=]/&De\_i U{է{WB yLdO_±+ xC{lGE`ҁfN ~'$^# 14#nxm ONR4%O_+eT  yKg>l7jTݠYcsn}ꇬm>N<#'rg5^T)ͶQwB/'T6}zIzEh2.ٕ@'!dtLgSw9c]4bSwhCM]s?s Hg~,HKi:.#Q@>` n(!΢G:ҳk :cZ:);z 5Wi--4>oYkD{9Fs9}idqaoNn5`4{uuk+tN"F.'#;z4)ά$; |% F-z]^3.}F6B/og_;E:= \bkrV%f3zșHk[tB٠{|)fي[E/br ғёC(J!P~;O$KE]>|/=&Bf7}ڠ%$]HmtѿD6_LG zOWd!q")4,6DWؤ˾"FzȆN@.=Qh3} zΧ r`$-'}:kuw:x+EHƴa/PR7םJ, }ni mt_rstF Hp6tu@D:fM:$t}-*^WECw9ӑu7pKJhQ8.qEǞ7rU[=т+SB҈r~C`ΊNrݿ#1- MYe}Lt֐dI7t*Z ۚKe) gCooEe"r\8=SF;WL_2f cl -0o]ߨ$cdCwQ(i`ue)}C.Юnu%XS\SQ֏%*ؗ7@{x tK)%a%).QV 宋-1@F{/fr Fr]\[QJFlL?,z Q?0SKO-K$NJ cWӖiUD`9O9g若4>eWC9Y^]'NBwG۠7WEW^T䖪.c?"ؐc${QY:Mqȇ^,/avZbpZǁ|"zmPۉ|wF2 Wo{1_hO[b0Bz#ř"؁|2qA' c~:C#h.ؕi85.J0V_n }=}]&kWǠ]FЇJ hУ7=jhGNutZQMO -Fg@7h9:q t1VFM5]j '5HWd?YFo!e}DԺ3tt? lm %ۏ֥1Uv=Sy7}EyAo~1қ_HɾF Yugn Cp~,^l/1.ti)%zUB˺-ER->%enr^A}1Zd 5v'\z B^ΞJmWq\B7^`X:RS]NoՋ֑xkt^>oeAZ=FbO F5--McZLȉF':;=/GgqpuT7rƱu(FoNHR\7E:/iRc2cȗR@>KpIsՔsF1-ڭ+dYfW#l=8 @x97ZKF"KYrTm#F?|R.6Җ4ϿEFt"P#OбunV.m\/_ZDEz2.I0žjWc@Hyr#՗~D61Ȏҳ#c)]*r/U\%}xE"#]}A!k:K;:\w} 2j_[#͹~ U|qv]}Y32#uW0fQ;3r *iJde|f.Ї:2nG^-#4B }u{NIȩ(@u@3G?~-/rl4 Z&"RkeZ6gm|J7E u]CŨA3]_vP 覾B} N}fU=}!NC/}D~ `,!)i<L-ҫᧃqL6;]6#3(`=k^Mѐn[kk@;8D=q|q$ iF>Q@ zR3㣜g "CKIWNJ? = }@12pDlL]ӣP~$IZ ]#I_kGHqc/!pa"S0]"{" Z_؇ RIeEEjS׳=zCK-&j`Lػu[6u#RLI;rU[OڜľG,K vN4a40 >^/wFuv05$&`/|@oE6:"9&f_F,4ʯ@H:>v)gQ?h~ӯʎ5D^{]W'1{H 9^׍^+]@ F]&<1h^5 St w֐.[H8 ћujȟ =Cc!t~gKo iSc-BcПtz ?vB7Y\'v%p 4K?[Iב#˽sEYgeڔ8R잝܍|aoknvh]hY\qbM6a_cc }{f-2DCvz*Z *Y]2,$f|_xDOOfb6οFN1viF,ࡍV'܍}_(w7rWqYvR.w ]Ӊ}iOw1]V_Qa*v+{II=Mm!BF^kУѷe 7 ݽCD#wICȧ[Y@EZ仢ґ\,2tYt$,~@UG=>K.=;9_^ zC -֙Bgdr:Κ{߅2BqIGVFQ:t$tWXM^>*@-^$`4B/{0Ӊ_ B1~ttً˓pktEXnp֎ 2vm0M?pI-.2,n؃:T^kA$#.eUb(t?ZSwi#IѤEbzr9*? >ͅefPNbtr,56u[3JycdXFc1&%c$M:݆1ct" 8JۓDNWC\ f-:$_4+!Gk P zl.=n-F56f}P5Fuz/{9q"('W+v^1[Lд4}  L% 2 v}DRFScY{@F-/3ׅNzybo!K?na+(ȹ ]C+2^ /;/|anYS È=j#-˴8rwW6-3p9}Ep6 9ە/>KE[l}uB/]c'M veTG2C~E~qx;̂vBE(NGwP-b'EWx#YA.YzM LGރ=WKs[{Y`_ʏ:ìoJk]XPDзR7!a@n)_<@Q z2ڳYt,%4S7Ew'U9mQ.KMvNwF 9u2N3qd@.F/ywieb?"9T]֙Q^.zu "*rЉ[@5T9XM)tka%(OPzu\䳬;2g^Ree^GEӡ)'t5o3r`lcKrFNQyQ~#ߥ*t?q}>ʽ Z /i=`uY|ѼLC/7W׽knrڜ0h-` }O EM5͍VW:ˁ;Q!2t"t*!J7=Eډ}EkFROcoH#7cK}gM'iyA !-RG?j b>k08zalFӊܕ|K#% Ry.D{o oY:FTjSR53Q} fu(&Jr5{=Xoqw\%Psz"礎W䙺|GgHD>uxz 膾/taS1kRn^oϥ(04}tsnk>j;;FNR VN[ `9~E[iRцޒ.7L=@*_EKg0u30>/l e/X޼AIœFZ2/Y| NR\lmYGo[[ ]{K^8Ko㗡I"cS4_ J00gE-=a`74ru_ vK^4 IWZk^h.b$] (E@:p= |]?n.pڣogGq劌 %-t:h1U6Nw? љ#S0[=%D zad4H{ū 3{IL{g[O@>UlS9{Snlє17lN-0Zp_Ѡջhw@+PRO(@ LOo~ZkO6=9#FzMٕн[),O^ZCFާ*U׈!mƮ6 g'KU`d$Wow}xG pUvY~=+Ax!gIˌpo]W'wJ*jșU 98o|8U7.p7pQ|Ex]w_{藮^)4u.W+v}!ZZVX5$݆&Wz!/qFz:K}=\R(]+bkW7,{u&Tt_`\JC!K\ՠ3E9qMρ'{[%:07p`g&vJ_~g!z#/2/6xu*2N5`ENWir v`ʍ_) fvdRwY#v)KV2}Ȇivoྣ8[R*rb|"+-)^q*w c\ɲ41[䙩`3J,!H GWI/OmJ}ߛAWT@>}%NlgwRR*aXjZT9͢9[/ 1:5;v/PklPa%^㿐%'~kU ݃|;]z. Mo+o/7pMG5 yH\(>?ȲLv)1ײ˶pS9vBѡVtoJp{fH>2y!Q '|F?y#go{8K7eVi/5 =4 |uC!BY7 *r7=/k 879z_C#7 ֆ]'pTlzD0|^kI;Z~BС\\ \cAJb}h5s" _X^ t(k)H"ېTTN SOb S|{Ě*+Ն]SpK ;썻.-C_F|q}p<`{8Ė%ai-~>ͭRl``Bעd-{/uEr="3koa&ЫՕ[f\!b_#Z.d(d菓qΤ"/Ё]NtjM8r6@x0j$.?ʎGXwG:49q}7ALz5د B7}]V"=tp>-U N||XظɅeI~AW~fhY|] zJd oo]l$ʞKRUDteqe>u} h kù:Z}fl_o~s=Xxi759]'r2U|,.%Pm~Jl,{e`uT+'K+s/~bp`䌑Qz:@jWu4Ja'޷u\>2{Y2hN54зJ]m 9Y@V%ve|xrF|~p4{k~"_gV|M$7R+E  #于@Nyǡ3%,C{˹/e <6W 2ۯ[$30t(9ٷ"gpʅx\ϗ9 j.o%<ȑҦ|ڔ;ćm6WmWpkѰ%͈FŅrݘ#iD!S, : 9_9Vf!T:9:A ZvuR$6t:1KyQ="rC.&ÿ7G_8-;fzsjhhؤlzwr)dY){3_7b? >h(Y\%mø9_|dό%"zZBȩ mf@r>.?5ЈCrn]z]97)7o kpN)|/,tdxY\k%"ڑ#^\Ly^rE* oK&rʺdzKf*SJ{A>/{`3)HU9f5lESj+32ө+ +Y(Ň:hv6TKlw~V 7ne#'pxHOg^;j&/g<(>o]G^\,-`䲜e#WTlq4YWOsLHh}cB }m hv + ]K4 B떓_Q>5G%[ޡק(-uR[yotMv^䒓fГfR!fP vQ[|0O'NS#ѐ;վ>9z~\돯uvZ܏D^#+5 Ry@&.t?w@/AitK.{.m=HE;A4$쥳ā]L278Ss^B湒Q? `ȏ_/UʞI$r@=_UC^Wѕ}ܹю]?〯Lb `և3:ʉDK_g쮀v@x|7#o̬Jת(|e /z>BE3v})軨귿oD#1ln/踈 as:pDsGEhYht*vm)a?׼Zwh43#%Uqw /f@{kőC.7tAg"]=/ի:*jc@VR0-R%t=#1}it}6?S[a/ƌa^?..+~xA7z|.LRǫ[f_7U׶I- [f_ả6\Q_oRV^j' ʂ;}n?Nj@cBٛ&!v۴@N!"&~|ik̷Ԡu\5NA  &TiF>%w짨#Q@|EDah6~/pF_dž^B%3}#甏I TR[乄=f9%'?țs9EG,^ܠH3Ko仯+Z[x8s*૽} <ψ&/2Wz"/y򃽥F{ O)ZR7E>Zuh{,>-_1?R~)aCE y5cj[_L6豢^g4Y؀ ,7`I bP?;m-H.󆾵W@ܙwp/ދktmdf`v`3*K$ŵd=sJ7Y~o%' ]:WY뀆aн)G"h%7ą}Ya.2wdEyn oG~Pz`?Ҏ\i6 z^+;;#=Pl&]z:ǒČ}r% ?^b~ B)UהHG` L: Cf&NFK_1^t d-!tJ8:wL:oTcg]yС7ELqT߰kWavo켥rv_c+ Z:z+,-L"NwZZ_QfPODR*TG!){=N 5?1| :-N@^iΣ4ķc' }NqޕйD ~У/9;ǔu N+i>H;bT*|B6]CbYҮ{-#Rby!W @#O/&񠎋|4KQ\R8j;UdɞoM&sI Α¦dQHw^Lr/Fs*EQw>FH/7OWLq8\edިJ[2x|,|^u^ƽY/Q旆kZB"V5귋W\zN~LN"c/{(}Y:nW [XBD.+ZdלS.K;BpG\a\Nn1@vB_>r|5,N=qysŋ!]V[D^wКBյ9ArSٖ1i+쒬j* EPc'eH=|n?܀^t~U,q!F\.cDn8]}am\h"K6B&UVX1ir0rY6YRً9ԡ.F>H愒^Wk%"g4HKZin gFNSX/iu.bBVtY]Uy\=^g+9%C\v'չ}AWX*tIIȣrF PANkEMaK h/UAv"'޼e9Mt:By ٜnUG(_!͝e~1ى|Uynr "8ʹ7qEcw$4FyEd`f g'r^8|>/Z[9|zR:09ςڸ&uW+vX| p#|:t_˨o=ΪoOa싧.hޢ7 _!d'V}{OlobbAͭ|l&.,غKM{۩}O-.@w{gXJVBj"Gt'pJ+ruz(K?]e,Fi f[}!hMyu'O=>#[! M_YI䙔o}[ЫB Xxp5WC.o%$ˏ]L 7 9"Ѫ #u4Gߏ6G\Թ_\Ċ&=%X1_d[4g Ni~[|gn A; ,Bv '>qia{5&ʧa5q_~<{ t \)J7pv*(.p?LkA<7] ]Lp T6Ȥk̃f=J!En4t65aCb_2z%Э^C +9OakB$jo䒩Tl>z",R޸9g`Q҄˪X-Z~ l诳5 }d~D=[;NqU?>TX.pkDיy"tZoKq]57 5CHcG.#ӯGvJ{( 1D@'( žjCvwW}1rBB;[0C' -@NQg0C__]p^ ZBUo![}A+"'v1@D/h3l%2t=+n֏CGwvB8Z[ߥ5;Q }q.q]WZ}-lcF@߭0k%N"ZUj#SuUtׇKBF}󍗦*<3g}@vrHhYkiнrkHzGcFܥ㉜FT \n~3eBz;K]΢Ќ8D 0͐šxu-Fprj#^G;wW|/|rgrmr1{Ҁ7y$? LNx#< By";Kv7m C~w#br$uiŞT)ռhvchIq /jc/b꥗ /?71:+tn>%_,l5wVnjED.V_ I&yY((%gAosu|/KG~/:x< zV,eݯ ڕ[@1 v9Vl=g@> pM"ܮ +<1n03]KVµ:W۞<-~Y 2{wXXpZwJz#78nGHО[9 imIJ~\|nW|y}{&"H[Dp5inQy iqOe }> Ե#,7ܙ-SV=*y+\,o) G'ъ_춄0@*ӯ[N_ Cľ@=U0gRܚ&v]ii_䖪zHJݯ=&NGC2?/걆7 [VIEgbf rn~w^5 k 䕰$r!O%2s&gK$Tc*]N%e&ϭ@#4=xS| t{q8AavKDetʸMN:2<"K,"&_D ~:eD|!KQ~ d .gjn"7G>fT#aiȓi#Z;Kh2ϔ"o5bb @~,NymQ_!p+c"u $*%"XWL ~-Kw<wlH-?gBϼFΞVrA/ੇ\åsQ'a{"a/ryW]co 7҃2tBG.I(. e^x֎l7Y>HRDw-@O\,k ,yĨC.V+69&n!{yOZxUA!F'roA+$6yFZx?XbYNVE>}Gmל7nEް9bCAWv 4yr>_[] 9Ua2NPF.zO58UMHw-y ,߁>ˌђ:C4M4LЂP'r3e&笇; POO聮]3B.u?3 ֱlv5{etpwAO.+] C弢+ci :/|JRf}]E+?fK]é8;`OHExGzƨ߸^oҠe^fmxmM;C\7t 9inpEj?9:EE+|X4 ,M T:~}ݪ0_q]+xdaEk:BݘF7r^.\u_~7?Bo:fRi\"Aο tGt) @\| EOGM |֟R.SOS hW-xRz[,>H6zcrטXht'%i^xp[:.I99Ao} f1񁭾#hc#C+tj{GSe@ ?zJ-Ҍ=my[nj~*"q;S8toܲ)Ojrȱ̠A;C B~咴3ڑ_{s_9HN"? ʌ-Ȯ|-aUگ%Rq&CUN.}UQ3mDTsw#77SY0vgߜ7F37hA*7-WH) OWojW,de5,k`W\X?ۢ5}ٙ< lFX>ߞ .kv1F`yOcѠxx'tqWO2yt"cPnΖ߇k$Z [y&ZD}6f 8Qh0Tw%Og3Cg98?O.EQ[=߸A"jS<**eB>4 lDo&_Bf'p]IykЧťZÁ~F)#S majMwÙ _-:ZݠWsQ/5Wud td#/tgB75_71X6,1Efۊ =nR{ue]r#3EBNAt3dݥ,p~{^gһĭ( ;E!T5;t ]cnc2 h.eN h\v}N ?}[hNZȬIo*4ӏewbrk@醾VY !A <^u]E 64>LCGJm DuF Tjȓ˭ MIm}]^Z=b'/a:{ԞgR3rψp>䧨oqJ[DoKF\w@פ+;X:@|zJs.ŕXe4SUz[| < 9YeMg<Aݴ+ *.3o[GJEr%M^W&"`mdtAZ:yIf+#:]Joz[]K̈XN-ֶ,0Z2E|yKFNxNN}1gZdZSs1 x>;_U͸!VO޹~IF3Dkг~¶N®0 8 YiV2pB%W#%dnN\nIN6EU"D[UtϤh>AJ7l~ {>`+t?\ ?#4}A <7K t!tWw G=y pNN` V >n-}'xV,D/* B Jcv#OgC Ǒ?In|#ڟ}98 鿑SV9s-}`.zབ֭;psRh=AA mQ3BEK#R.ȾB4N98|gx{NKn 9?rYn*Dh8y UQ]>[-ϿVA%|7Nbw~elgPJ;W-Nbt"3+=jm⬍n':0<~<%>NkЍD2|X MS[_7G_iБ|3W+¾b.I"y*r޼o\P<7 էY^֐oC(CK8/ql5aeoqy|9,Dr8%DAtIaquՏ-G~8]_,[MgyԨL|δM]U zw؇ ލ8S>VvFO񸭞R#}Jbg[Bf}Nɇ\ <<|S)eb.O)L+[/;@V"M727#J&W>=8nޣYu "ӌB[֍Z|"}AoOќIOO;s`</5G]:wO\E|aZ:& aմo&g]A7'5ԠŶo~ˁ_ ?䶹PhVqȭ3ay;][I(a7MGg)WSa+Z/u.CA&S/FoR6Ut[s7yN\)}RE/\%🥳H\[/|Ji qB9S슸,;vd*rt&@6IqCLgux`O|F0cd8G^ެ.;.p$ȿ{Cv@>u }D^.lsI%q_YrZtk |"o8^`i.}[h4mCY^Ox.3 EOzBggEqdԆ\` ]YzG> 9/ټ!C'Igf]n;-מ卜B +v`!/ zp$}!h_Ч5賏9x6. ڼ@*A kynNwBoAMBg#Y!]fuN TB۩B̌B]x(.Ao}Ϗ:*)u̠5~CVbO@} .;;QITm4\U?s^U$m,W3q#;i7׵6\Ẻ}wr f&߫0f#k'Bok <`.`7ڊ4/;~v z)DoKtBAlP^3,]; v_-TnjRD*#J28$^5T=؏{_K~zzً"C<#Y ,^bh2LO 9i_޲ZZBn[ Д/Ξp=g٣~"ehW&~|x&cߡM.!w]_)-~8͸ȷݛ9$tƅ[ |g[/7ډ/u!zN]k}:8,UvKݠ%ˠxmUDo䫽]A}}v!̥Bg.Vow%zD6ro4N]}Tx:z6+qB|L{m7TW zNe+=?+HIY `ПO5So֯e!/3 RǾ9_Z*}Fz&?)ĵp 4/eR#z JKMA$uui#M9-u{]6hVS (JfK}תT>e[ϮZ~Z#Wfi^ךM5J~+f~f"YS'Ϭܑ?֙K? "ժȺ_?nkEf\B^4GJX3Թj`߫b'^ =8om`{fPi(0^%~ߌ"οNJa0c߱[v7d6ᐋߨԉzmO[lB7%ن/\A1{z~L2JrAP :1zSE뮦 *~.*MBN< yDCnq2 *N:Gc'ksQXwbn~!}XX=m.#o4Y n݇or#+ 녜YƦi@'t%Nq/U׈=?FfУ ;棤Ь{c\SOL#?ۆ,*[vt^k+i aӼx#ڜY:beyjM?6n0?~wb[Ȗўp b?;:&t-Zvt1V+tɵ5vZ8yap5LDvC-BfI.+@Cy]i#=܅7rY:& f`NzVON/pݢ6(qe LPb j^%r.ph)~yRvnm7}ٷU6ܦKt^*}X\V?Zz\Lj x/v}B35qB?ZSG6`.').ax>m"jqCj>swv9w`G\{6}>pОOn8BŠ"?$6޻C3+Njk,REvʈG) bz{يD84d|Jt6_NE~iЉ*=&ofȩ!g'kוo x]akR>jdTh6%ip@w]iֶޟ޳ב[* |q'/mu3rP] Wg# πȲXVܳZn:HbN3Wi'򽐨 _ֹ:hȡu.%  *#L4k\Hmrr!8{&Zx[~㐑#bp YwP^6\[C}~V!4p LtJ us5{onÅzZs*IFDVp];GJ\+Eɼb6k'o?.q{>"]M&E-g)UBr!ߤ1;CYNHڦ`U\Nn./a'aF>ԬQ?PMރL!ꚧ: uղy8Y?YBΗ< R/HR5!x<"ȥe; NxJWȩ qu.jBr_KMl5@:06ax\ dfcKPou`% K稘gnΙii$Uhuj =g\kobΔ9Eouڡnf}gbAVoX0ߔ$,Zv%Ϸuy l"ų۬~%6Gc9U''P/{* s.!>t i'\'e:Q*4өRnJM{XO///ᤲ|A$_~su6- 6z\Cislvf2 H,Ucyy.ezyߒ͠M/Qt{䯓\Fg>]zrr>kN(*6T^ɅypBSq4/TN䶖*n4'Af(k!>+%n=~^oeYн 9sdenN6gߗr`lvBM~Ex3n+k*$$AD3l~TZ,_1.8mgf=TN+YDCZo=4}I: {[m|˃6hYJx9Zf~7k]aFgp!,Վ<5q\ ] GD:g&kKp9D 7YoZ;ttInC5->[Nܑ-.f'p=դ~ |ݫxoxA/~h$MÛ,,u%EyY@%b"Bc Y \"*M&-NOIpqMN| q9˾,P tWXgbK9}q>^([܂G)|E]qpDxPpQޭdth:WFF_W$9Ӫ)E)ZȽMĖwmrfX2YKFV%9Mfw]e;K7_+5ˉ/İ:ju>٪@(n?˶)´) NHojγ7S ?@@s'oNbK1W-DC$//gV 7~v;oЁ|myY{+k8\]g4t"I9}/+wU=$z''ɮFR"wni5q~46^,O-ʹp{^M%¸$.9 k7pRML!6h=f󁷄'n<@q,+Bb'uAZM\N๺?O&- ВHpS-Klxdd˖ˊ+5F*Ee5Fޢ\f%vVOu~,ܲ-ЂB }7(tO <)7H֑QZG85rPl{?-)Dd'NWFU:6b$+#)zF|JW;t9_csͧB9͗%?L֋Q̷(_OkC }+S*_6Pw5Vx@Bf&jD'*Cdrf, |@̠ 'p2~(]҂Ÿ!*&!t{"9aEHx!Ĝِd,s6㌱+,>XX#N/HXbǕ"Zp ,lqLZ2B_O5{r,O^Ay@_291^#lq~*v lzH?_*B[|Zi7)%XZ^3uR5o&|6V~Ag,͖-}Zxm~ͻ%G9т8MDA6!R5T%[k|_52L _|YAq~b|TǸVNriyW0u*~%E*3h뾁\zC^C$x'ջ,r;7-=`%rP$_}sۤd/7m?\m㌠gi7u~zJɟ%';sNIWؠLq7s5Wh'g5,cQhVt-)?^O҈猆-[PXt(iJ&B xH D޸[<:]~ 8CXه0x2rB؊(@_E!6S{y_UCy 2ayjЧ+A]U>C2s|DwŸNh;͞Rg4*trȽu]m؇Tk=qEzz>Ny]1F`&t>χA"2Kp5Ӯv#oޯUYb5ENX\{KT&n*Q-pްjy995>g/3ق&)E;m;rQ:pUSG\.I&:}z.g,5h֊iK9K7BB:KnM/=tvy `:r$'ɡF>́?PJ0-}8Ȥ sԍI87-2]e!6‚\3cR*|ҟkOEڠO t)'jۀnV= t/?9c6ypMNF9 /!U1A.$# eXSIʧ5^O;T]u{>;`ډ{;8w艧tp &kM%}.EvrA}.+,UZreoK 03[Qdϲ\K'=ݒ<&9ۧ4lhm1gա+o0 ஼l˵eѐ;$b}u@M fE:7 92%h+ɀk5n+f/Y雟S E MA"'pQPȣ {m92-_}ٹBIxwd|Y-u}VU[P6WTNZWHRadcZr;B\VΖ+#ZJZY@3>Zz[RU"hvVJCx>>ŵ$6y6:erϲ[V=-=0zu>m^?ѽ^YC.ko4U'plAL|&.+$+".rvA .Onr"OZ|%c,OR?&_tslhn ~6ޑhFBt/?oA?c\ Ǿq|2 $- 8qmch"eʲ520heGnĶ~ڀ>38)24O}`r66 -Ǟ\ORޙ 8D[d- yZuBbV -+f,NS# te|Y+t /{㣖bތ`޸i,ۦ ۋR\!#FM $Nk?< C(έkE~1i%X{ِTB}>-LN!i7K Hɷݷ \ŝ}T bЙ&nƝӡn#眳4r g*1W?VkbasSX׼4u2o`֠ i oiz̚۴) OC#sVhmҙ7jЌA?~#N$7-=udOG>{>?Rs?-t~o5Z|wsk}I̭ w+3ŦdGEr̔J')Y8ByE;0ȍ&򙫀KJ>#ڠDZmĂݡ|ED>BЇ2ڊBpр\[ck5o xAUj;|f\W!z"׵{9eZ} 8ׯvdo].p&p_qx oKOɞ I)#ng$rO<Ս.1f*5;dj -ͅ{>Aw⺹\|3YD܅Yqe56Nnڸ,qȷRyڗ?j=lzUWXY[\U NvD%::YD%J=WCsOuIBKZCL4S)b8u#R'Il-yNE=IF;O!7px̸MD9Y%"y錜J0zW\e:t8Ig4+a؅.'/Z&/ZwR-_c,A!ڼ~!+\rD+k4˽q 3NDDgtf>" 9/+ sk|Of7dܦǒ釤qWAR)٘K3^=k&.@BJt"oKV ïu%:,ΞdapyzT[W} ogK]JN7$̈́ŅdpϑrcOuZ~4 iP>9&@_KOɟGG$|"85e3!KL_esqMp-9mc!~ugâulv>B"UK׃xܢb$},7kA/tkz{gchC_5]xOe&_T}h = ZRYԖ\֦7q3-p}*\TƏZ73a<= *@w>ov s]nE#XL) [/7^Mjl*tcV zNQt^2j-oum`L;!i?tM|aN=Qckբ.S2!0I]&w_^,Vy:*4A^תaeFuu tHc'5m^ec/#a_J%AWϩނ;iQzId@k8}@Jvm]vЮ{hV ,遥djϨ^# 7 ) ^bK?UOyf1iyDI 춵#)sDٺh|oB]vڎ6~cŻZ[@0UfS< |I&}ħ"Hq$  -COexڣq?\!%k %4_< WS3ԑXV mQƐui[?Ɛ=*=p/U䆞Bc$oР@Kzx}7r$3%_O*ngQ:o;)Hv>52fܮ>n#cjC&:4؃p)0s_w cyX.ه@%].L&+?&)?.C>Ű _wҡ=-\q1UZMdW/SV/R 0nNv `)7:o\[$ky.aϮ3{|A({QxmgoP $'|؜pQqwZH)w"_Nti{Ơg^r|q'5e}=}ocIڠ >;?oG6SD3 Ε/񣡈ܜ쎋\1!Gvz#"["J ޺ ]+-y7z . $T dwtG(RG\I\iOž/nJ}yQJBƾB4_*]fpR13pZ%xaߓ."&ds^^ѽ2r^mFyLo*ejj赓q} 2@Y_`D :i@ Ti_=FWSd"7k|7 y_K@v#o,.nZl^*Km;s;-fF.&XN@-ߗ4KС-uo7$ >-bzaAZ=e* Oq߰ dvQiUAytz2-'z 2k|wqݫ wzHtaR+44 _ZR_9b,v r$4g*tK~NIA/Ys|x2Caq+ǀѦ=hLےG?bTUc}^u]*^g$iܳ2yD*q#'cݯWgrחЋdo你YE|ty` z݅@ 1ϫm<z:CNJ:*5$ڽ2)}i՗ٗJ%hF8﷝mX~ӽH=']q/L ٻ`yΡؿQGFkxJ}d@kMkMٍ֨Y{f*}'>FQbsze^)b:Sa#/5 g`w{+\r W*5= vXY(kyY)k7 +$)F3bctUUUUꍱKϩ|o+a[3ۉ.*UEF.NQk *r=. B!.[1l:}ڀ!7x3=t|i?hiVvcHwy~%9j [qY^)B\Eœ D ަ<#Yeld獸I. 4w%=ZXrÑzhw>!慜bͪ̚ZsEce9awJ}ʠumluGԦuCOݕV6%kTP a* a4gk?ViɸVo0Bg,fش;Yٓ co9sY'Lm|>FfNvJ ߲upG634pjRFA>6z[$G:zv~q }˝G{ ggkxLB?K`˿N:6DaMۃq Z¨:@`C"7t?0W+<Qf&2BzCPa.cȴ_o_%*0Yəsn~֣@/?6=2/2kb% 0u,hm*99/\쫃zL!7I8꽼Ac/{+,3y-2\FvCߛzW&p{APm7CnRf/[1VVɵ깲Őӡ?V+mg,F湲q q-#n"x9y`C=ۉ|*!hF潤4{y 虻2L?GU!<[3+D>nЂîy*qFs})[SrxjY>T:C:44[lV, *`3rP#[e?sK~\{|NoO:MJPn3x6 mV@ocCLE瓛69GY)9Ƈ\?8Y!UNmQB* ᷯxzS"@ }jjnzZ4h:Ny59֯UM*G)smqT$Yd|(X.r*\ON7Y\Rl9K^l%myH)B=WuO%L7"Y}-^՟^C=dz {5 1FAnk-Y@n1/ zc$"j~y>&rWv!Aܣ~k.4m_%\- }$Dv!ή ,IO2蛞,{'g֠uWW*yn4~29QL9aYWL0ۅ:3E#PM7ԬD.Sqr'rHEOpU'pUj љ 'b3*2ruh +m\z$bm7,!䴛J aS Gc/Pq>kHZdLn~ =[?8.6@p!qQ%x*yS~"gʒ#!3r^{u)B Ś$z۟eF)rEyYVD>bKBVBDžBwA! j#W0Iy! 93<[TčGkH>L6sľv &jAh7r 6|%Î-j.bKCk,ǎJ9s?s %d$p.Qckjm\HZBr=3׏ .?B1Z:7^tįMoܙd)vOeZEK+g=%^ ĵy L5mpigR274䤶gS`}Nkdi:g,;+ ܯ z'5yv~HSry:]-ClEk' vݳN1ƚH:ٵΤ D">9DNXz/_,+pߧ5ɀ9/ob`asB.|D!zDBoCˮrnheE[|:_CP$,a 7)\Q8 E*,u w~ok/t4I80T|'WzBnXccA Zkzh C;9FnS^ yy5hgqǸ?%9k=@s\|!AD~ yn3om ,|Wh%;)-s#+ bWŬ^#aW(DXt",VT_mp R>b[LY?o1͔%'n|%Klò/6l :Mn-wZߡx Z[qnAj{T G9XY{d,鵂'p+rB%(=Cki}q=@Αޢ&"JXTo2tf!d%<\TyDv}s;qZ$AN#+h G 9Bf׉[dۍ-@Ǣ77wI T3_E̮U]7+_ɫG,  }|e߶"S]x?pM>W5p٨Gc5utKHzJ>ABp-:o~n&ʃ,!ne.0r<:_b|f'5YVo-J|[$* {z9F^?9MޠCx^A_~QmʋtU6Sǰg̍.$ Oo33֮~=G czRu snы V \ S:P DD]4Jtm;T+%6[ȷ2ꙸ6~⦌_D'L YJ٢kems/+COx抣#wxN9r`'-_Ϯk[דG\1gJ`S{.SS+tjZ oYm2L94oJ\[=;Co._j_Iī)$,~:h09RMNN;+.tvojDyM/Wvڑ+E,' ȓ*ݞmϐ~^WyWq.vY|pnF~Ż(}CnhiɧtJ67Y)0o.R]j=;e|8&l_gX{ZL||n"A|Lo=SˀfP8O]y%"y"t@$KV†A!UƏ͟M6kgl"_9ݠ-%R-M}Ī6#[hkRb+΢^6ܛ)&YZU cX}?dx>7Դ@K ='@ ~#R>{߶)|}f l :EDy]"%n yNr k:6&9Cx@u8FNi~6fi)D2>5t|4__+da]e,4pCȍ E(U\zj'p] `* `Iz !h rJneU죁8i :*3jUgjېS^?5¥ 4}eQpZ{֠}w^h uG@]|O_>{gl Z~τѲr]oTDlim'e<͸Fo7o5]G;C,Kr`ۼt Sya& O |rAYoh+2*7 yLD>JZV3Y_9W3ȴ8$FK"B'}| ')"[T^.B? blNXCn^&'wrC6g!IԉT2n&j8z-Ѕ<+%9z9Qlޗpz9r,_kn@b=G't|?u,qX8-v;,R k+/O_EN\*7}phaݖW[NeI>U 4rVQIo]Z) K'38F9ۚ:BO5,kv[?*5[cW+v)u*| lk5j:6CNtd@GQsthzLۘ=mvnA 󿁷iTE8 n=ʎoNxӴTx?{ 87r[G94|o̙!',M ϴXw/0ǮSgU/_I!Wnj>|Wh6qɺ1>ONY"z}JkTC=z@Ϫ<ȃj6+~~d@Wb9ϧG4 mNnzhO#{Evz(nS ,;paZ'h7'l)bY&=ʚy& VL _ ~\L#U"ݎP֐3։g~OಈqixT½9 m0Vo%.$Ɂ{e*7pSϱuhmW!E"2qxy4yC{'b,ZB/]8+Jp&>0nϓ?c?AzUQ|5TnGU=r\$qYQ{[C5hY^ }RnNx֩PD5rcA͢Om, >it@[ݴCHtoȜ.yo1nв$MN䤱dbfA.Ygk)bFAmK<7 t("}m8|^.Q,;EJrA/!9fV;>yJT+m?f[Yȋud^T!J?%nlsZd\04%(BJqKo's]_) }ϲXUNHr+tX|){Yӳof167ے׵^E]aW{DVN#{n zO9ݖT' 犳ot > 4'go(ag\t|aVP.U#oѸZ슽 7GdR6;T^pZKFZݷxXX"N}iljn&˖KڱE`*kvoA߸_Hp5㹩Jzɶ>✭}odKĵx͉αR;-۞w[u3 #ji\i9gsHfTJ𥡝t4de,FF31gLbͨ-gמP|x xJ #ʷѡ8 |߄-ZWVf۫<aVp YG/+Z]뺧ްY[ EweFDQ·[D'A_j }˰+ТuR}o2+b`nŞ핔zhͫv|^}ѡ_ߧy>Ⲝu !iOz ĵ(f ڼϻ6֠-_w)*(FF| ksժA#-hTh(~/?8w S)"D?t#q]|}'Sr:i+ZY*)Qኯ@mBpZlaogfzۡ%kzRJ G:F't͒ߐ%|HesgfE=p>+0:Yy "[Ӭxyl"3rFZ)q_''B69zg$)&c"ɢWќU]\#.JZS踿м k9qɗw9| tgŦ= 9 tnΝg[n~y YnG8V"#3ƼuYAE(Kk+C! l3(ggd/֢RY"gCΔJBK1\}GR7"MޢE4Of~]5tG&WhgZ4W(MֶPm[l'rJyi|zۼǠ"rO 8g:uUO4ï!4JQ͓t|dPǧEPi7F{ L'n]E9\-yޠokt)&!-> }5Y z.{jքx2]>N6CoPfFraEnf=]0yzei=qMN2O?wA-hUo༮~-a&N5tbfݛ Wi~"@Jˠ罒xqK>x_8h%˹M.w=~AsWj(t8yC( D;*TiU3A^S9)hɕ 6.Ej1 R> CړAK!Ri؄1w!l19F?-疓WN(jO@۰׎EIRq_-c2c5[%eZ@Ll`䜌ܖV،ϩt 732S7qi=_&Ե蹀Dh-#By3, ա^]ejr)ٌLx"W=;C,nk񵲿}xN5yjiUxH\//X yNo_n^WliFne V,?`t.@]kS%JNEJ{CUv}{X䏣s,4wq;Luln3YB.1Gzi|$w 'sNSTneͿXj;4e wQ+4fn\>u%fsPIyڸ@6Lfz.Ē[ؽfx.z'p$T/S@cMMJնSS B'nŽB ZN?ɸ$34Zؤ[+}5*L>qj(֡/[3DON rHq \ܪXJ 0~B%&'!p .]N܄y Y})98yDkVʚzp|ƌb =$rBקF I̵y՞b?RDn9Ǯ67&:W2dR7`\uyOO^TOMVū-N/ns))VX*kxM;O1LHJ֊؜yQza\Fu3P'UDed7gbD|L\Ca㠇 =C ./x+&fn b)OZ=}('U̻U^wA %3I-'r_mwu->avD^W~",v>XĔi9*ҡ۶/පyySk=S"ק tIgKlm5S"?T2=TofgKj6> 7,qTo)'+vN< ANSl0-!^p[: z*p6<} td|#{;w蒂$,.|R +,'rje+WZ糯E3K"?3 C@kqv7pea{@7`v'k}H (=4ŵq-NtU-sECO\{nmd/6,pve+"oSW8ZS!%C)u!ۑ#4kGDG OվnŁ 'K8FK 0+e&.B] 5>xd$ӬUmຓ NVoWhi 8#Dur.UB%FNnS͗>Aݑr m{W*zSMB1|4!$k@ӳ |ԞK6jpBC/}\E@ސϹG{ P |?#1w˻sMEnk|"V[8Z{AHnS zt8qaICW? |BR}8E"ǡopDCVEhg5Y!a|'4W A,O'hMW*d1w$kFx*^_nV,8W_| 5BSLV/{ީݮ.w" :rrfP9tAl6zyudo!ɊK:`o2|S;Ӓ O9!OCl~#e+K$'rB`VyޣGtL2}jxS,QZ=?pevl ꋸ DOmEDkoBc\r칑rs2\IN: s|pTIcEuq%^6r}?xpUփVޱxSGo7paQFb)x$ZԐY xȬ6,{WrkhOϝE毐.muےKWk9@гNvW.b{h8 4/۲. 3z9\?>try#҂Rr[[eK-˭]5ILV$},\'.p-ϙiaÔ묫kfShlppYڡ|aOa[sےAs??^R½'t9"esn蠒x#Uuj雹.J+D tFN\ꉜd ľJ} 5>07Zc\.RO9 ]·JNsxB%ty ?$Q|2x#q6CYM[D0~@'nҌkHktIŁ=m.؊ T.5e|Č7~KZ8:/n)#'ѧjdg<e\H=O2!e\6Ն:-dkBKdqa Mmv< !?z`DMNycx(N1unTȯPM) lyt"ʎ1mE- }wjryzy +4|/?GTLg![|=6%Nt&dK܇RHfXY]>K V\k5QlZf9g"9 Wd/n8O 8tϔufI|cfPrYu[Y"Cܞ9.f@.9"n#߲PE.zyF ʍl9v >z~ȯxO4}b߅b.m=BML\""*w観f`m=ЌN|mmw7zХ|IQGXۖm‰G$gϙPJ%&".'5ڜ5=Ond,t`oF$y S ynCg&>7<+< ܹy7ٰCAybEV>PE.-x]7nYʄۤzF?`Wìxo5s[|ڠ t"3φ͔֨nWt1o;REߚvlr sg2%*h ""$xLuOŲLDPOyWmbA=ǫ&@|)cJDj[->q=:D^Lڱ7NǣnfiLNi[5Zҡ_IrnPpB\caùtB+Mktoy}!XȠ--|}tAJGbq5 .YWa'/nYi'3<杆-VRogW#7@Nn\bZ._L,[tUJ)qVǖ@Ћ9''l]S 6iǂLN/=}t'^wgH-g#%okE%42,d/RoY0{po#w"9tU 5qz*C =V*=^:'=}#lm[|;Ck:̳>g*!v}j$^( Tw"7]<}Y udW$5odk) G%[_gLtI&?ophU'iBu<ЅQ6tU\rF'~mM*"JMZ0* 9%kgQg: +R$Ktn>_gBiQ7r^ҡw&._7XBr.#.-I)Y7ol?y/^6_ǞrqlQ ٪{ SטPp<5epCj}t"eA9ȭ-țd,tb3BDy!PJ0e_2})4]Y7_-bATvX7`_)h .d2/7LZT2{pAzKU0BCvhj(8ď\Gε/ogl8Zf^}v:DΡ7yL 5THxgȽ ~9-\~JIb(z %1HJH́O .Nbe xm#<  FH5WX3m]WKN_ NuIbQ{##gT\UW>f&.t^" λзHW_L-NK+ZŽu3IZ.貎6i7,1GsQ y[hyBlr.BBDt<ܼ<6E+: Y|[淕{X)5{>+y)W䪙4rU6lJL:yC@/qP͌ J y$Q}J֣t>5 ,Ѝ,5&lAo9h{ٿ5MYL.\Lʍ|%Uy{qz^;d 5d8mrb+"j!XLlrTdI#d?)s>GJɾ8˗j|OMAYgGx"޵y@%Ҝ "P2Il~dzGhO%|#v@OM/)"|~^ɮdK>uS <t|TRU+h%sPh].Hpanj^}jA)F jn;YId~> \%SHMYų$l.5-fBXܱ+_LK*);zӢnf\_!}p-n0BYKc+w')K2FbDSz67&aw.ynIbEtas6-2*G<ϔQ^NEpVBѦ(Owh2y#L*ܨnW)A[q VK|ދXjA.^-F# c}ґ [w 4%g0,E P?Uu&<\l缘{@.k" |Mg|jkA%BbɺM^{q. |J$mSwN"WF.kgER南pz@[ mXB˩psՑ3͸oM"g!lY9_&!0;7Ï$YWUuށ"G>۲d,#8exi\%}n57||σ`(c?z+ lpx]'HJg-^,kf nrMirTBYuSCop Oby##] x/I/{Z=Ktɧ G}ý6/V\K9oj@O5Z̉xKRB'>-F9,-\9-j;~]D觃or\Q9IdRqmM~qKK=RW[jx_5E"nj ]ׅ M+'Wd=U|08eX'sCϫSZi6fa:r9*_ >'RIXYkt]J W.BajywAy+e5p{rIDO׽G m=y ~ry.}~J-!~IMy)NKI0.gy|G3g9{lx,Rna) F8yϳ7hr5: "'b'|^}Rn'gGW,{: M,uBud{Ek#˳ ڸ%KqogTpLW62Q{JC :v |˖f;K>O8 DǦamoԸG|Y}'޲u~VQ&ž% }/,еkp@w~}zYQl;.GW4.=\cH 8U6{-Я, 7E[%B>U//phpT6k9ּXrX5@[E:[4e6,!ҵWKػ U 䍕)) |ֽ>ޱ̺]|kpu?oNUl4GpŠ{)p$EueogE.IoUgq=E~:hƄpn|45) ًOF<h rSB&Ų?A'ѹG~^rMВ?͓[Y)1ՑiAB%X%wx3 ̇t-|$'_ڼu?s)5ZU<2ep-L{䵞I zIk9׭FУEȑ({Z*-Zs5P>j7C+ںu9C_}qYg8i9D:+SC[C*`/w%EX AY_E/ |_`lꤱO-\P,ն5<Sקƺ^-tY|nx7x pY4WzjPVC.%BJ) 9ԺQ;<),Wc~{!>@>?C; ?M N-bh_in}<&-4Ж, u2j8O{B--!<:CxD\<&;"fχm$sl^ˇ?w z6)3PB:aܣ;$l{K+'r_h"5#K]#x̠eHhk)t46>uq[ =ak SC3HO^e8yXy񐥶l-Њߵ 616Yțfn]5wu'?M eSyȩV*бE/ep 8s41w1LnCm6臟BB}CSXi=rx8??/Q9LZ7If"E8؋|r"q>*'JE;R sU)$y9BJB_${,-peՑGoȵR* cV.}=}u^ߏHEx}4>tdgmq؅;Gl'אd%'l#%ө!(HyPWˈ7rWhv7vF/J=>н}|gN'Hˡ'c[vW.#hESm !7.*|80 <42Y2r>^3 ~|< F=۞ěAay-=/"/5[nemຜ A綫bVyR:& WX#GXvqM5_CS"O_ ~PhM''f:q#1DZ݄(< o*k&n -K;sF_p;af*z;KdVy̸:T,ŕ6Dc_{'|;]6/ <ա5o_R"3G^o/ 4Duݬx^GOy\ "rryB*r=w:T\WCnrY=|e0rK?SX|0Cw=z DD1 }Wc>-bPS7r;jغY>z%;4MTodm°#h Z2e聎9I$ yͼ"L!m%Ђ-9Ӳڠ?%*Pj'tˆ% x[6#ABB7-}%[D UNUqv򉼆!Z~&_t:p=v/O1i~ otYAn-Vݠ[dQ+769pvƞ9+ε ebP/M)9 PnU<C 4=N.ZE^l- "v*F>ޞ} OF^;}>6ܛNs .4ZjޠB7?##hh;5Y_h^|th#o1-G!Ӷ Ch][v=.ImTZ?ΙըHr^3.sϧD[2&Q9Z/0NYC?D%{[z_y/\WP y[/ <6t6$xFlqh?YX|s̵AD7քB '!,z8Ns;z] EI{f-%dz0tV x%JI~/*v;/vCmo'e [tK* s=9{Şh8䶚2c%XN)6:㚜Mo'+šnvTj)#w*#G | ΐb/-cTsDՌf%䊽Z.z9ܢ,Uh+Ez@˕]k,S9rwQ%B?Iq2+YQd϶<)=)¦}rJrqh~9mE%Mл/gu:m{;CLZYwy{{"N/I"/)t,򍼅KH%ۜ-?j;h{RJ Aɦj71h␻gG4l/W(0%έK+##'p 7hq -BKF ,Trs;/YMv7q'r]EsPIW4N *O3heX /qǹ RBc Qw6hs!e{Ix^uW;)Ӄpg o V~B RͯE@] hAVN4^ nטsq&8Vg}f?AI"u4d(pK(zUX/,(9QsIUw&0xر9*ͥeyDB4QyBr@I$ТP;֡8t \O༘D-哖 M('-) ݦh-@]{ɿg< 4=~|!ӳzO6=FA[TWVzǓI1'_RWQ:WQW$Frip/,*-qQzv yUy&Z{e+%ghOw%gHkZE|n9m (#Ob+HtWD}Mfq&Zsn@S:LnDž+lCIEaSF.N}ᣗvPȠ M4)! {i+t3WY{S6mOiS" Zs(:edK C |Awȧ*bװ<.w0+_5J`E|}6.fvh- vUuVӌ5|+n`5?qX#_60r!;{:Zr2\9M;*D$ iv"  I /g.!י$ 9屽:th =/lQY@ɥ-;M(m;M)N<hՑSi|ӂW t۶.72Ck0ulkr 2nb\>v?# w'G8G\ÑDΏ ?E޲Utݨ4YR3hj3)FNTeoʖ6yO= "fpi)RKX ]E[ĜjlkU@V,Mo-)o:i#2BB/n}]lW:p]mdS8\MA W,6pu5ݰ)+ }q(WwNAu+2pI #A<ۅ{MѤ%꠩}O86KD5{sY<>dY7lg}^j/אؚD|9rBkn-a] r9R#wC!6s!N*gclKm͞>^.g^f&Joyu\rsc݇_Q]x. :_dwjx;lyLMWT]\"7}>?Kt #-9r܊-XF^2efT\[tb:nzǫ$e蔢/M0rs7{%A.M \xvI\ )<,91_izd'&OǢ/=>u%~G(W>&)(K [4arWt+'j1-M}Ŏ[|bUhwlUl+#_QVY,>ܠir[ZD)˻&t tC+g'/ !RhC C_5]X| Ni{ z8Ь6,o/\:so}DߧmF>)r?\ K,ʃȱ|$-rۜb0T:4UuBb3.XNu =#CyǦlo'U\k?圂T#$A/p:[l'okXu~JȑK :qeC̋ ?/ 9,Gny˼yy _^NQBoIv?5J;r oWi=[UcUrhmg6+sW zwg.`HB# ]wAn/62h\ nu&>缜U ,S%wCƜ`וJVl-;,wbfs~y εj|E՜f\V>͠-NSiαg 4ۅܖFe*[ Gmђ]QPbi<9Y%[=4:4ɲr!y22.Akd+ ۤ6]$l{ ]ߗ?3A?d!3^}ܯ,&+ڏmRD|2סNʥ\"Mb"2 ˺O[Z=iN2_&f|y@o2]{'r^JEjW^Gkա4UL&ȏT'%~9aOсq/ȜxYd\?}bgo!ۜ,B\*<}]^P>qgj;)TUHNuzn9 '.h5yOl4jU}?mۑ@',=}4zZpH@1i%8 boDW"1vQFkEe.Q. S\BY|MΑORt>Nl͒*!gmɎZi)^{Y=Qɞ{B%=y,eD[ 8#gѸFb[rŎL7?$ZݬκljšwɨyISMފ[S$N51AF^/W!Bߧb3G+Ey6fZg :;#֥KM!WTe/_YO /}ّO)RfJB@d:v)DӠlܷ%vBo1i`[jq2s|9ng{G y['<8gkL #:+8=MްdsxIEzFAqGq%s֠u_\zB#)sNaq'p$?;'yػG 6yT9YyV ׹ cfe7{/ ƔG~DSr*y:}Gf+JeKEM/m%侭Nm3*Z"=I{9qK,C=2xsk{zɳ@'4"Gny>=c9"COT8;dOm*~.}PWO0rT|)SU_lTh9K7)kq/xSh쬚uL=j.=!5E:pTMn%ʸ y5y&J'ä`5pF<#qu澍A_&8 귓y֡LJ/_䣊#P!]"%C2XN2HF^xirZ+]CE^{}KF9Ch-š~}Keݦ;"Z UM{Vl5_aGvx/r}r\o#L P*RNsw?iޑ?=Ppsz"1QCsA$G+xmWz@!=iؽ MF1@wye+4qJ|wB z_d3_w*可0ܐnI 68Zƌ(+?N?\%wɿTЊ^mj:^!Sss:bufog؍7?F>VV*$_&K8ʼnRꁼ*()^".t=ժB=Pn7rVHg 9g-nv#*tS9jŠgq|!{Jy4} .-l@q5:{lY9ZHO8|Ӣi7dROmu<(Ꚗ/ā 8(oKN |lމL1"NH79|f&).IXr6mlf5b[R37@ dvfT7rFP v)xz .rۺnG_2g%^[ 3CvߚWMT66GhlqYw] AnK+>Qƭk%QqSɎYhrѼ$uKs;}dؒu:7Wk'B}VNVoO\_{5, ǑUy* rR`O{2Dx{87ZAէ.Gw?GxG`T\~DC%CΜyh LU?C1(VQ$̝y- _jQLbeJآ!&J˒ rc`Qf 2 = ޢIGZaQ h<%5(B쾹\TK]Ҭ/SH"%QfKɒ>gyнIąN1{kK2!>-AC">Cύ=Ƚ*rYS:^_%>wdz*3!yNvCΘ+l~CۜMgDvc$np*Nkfд c 1L9K[Ùj;pt͠J%<%f;H59m敐ٛ- >5Uj&4M3.[}dW߹ֱQ"X nG ]X}NqDOCˍG>ǨkakBQH|I jvGQQxjB7v @W9$q=KڱEyAPAGZ|(ay=)aԡ>2)l\o'(oh?쑇2r{a ? o >{ޡWJ~sX' QдxUw*[6Rѯ追 .辣^mw 7;utcmO^ EtGXczV1v&Vd~[TK N}Kt2hrf/샽.]\?q␃ P!9xT)\o{]ā јz[w[UZѥ& muSX{& ^'7ʴ  Kn齺; cu&Iw`.s13OC?M|r|n͕ze!ƅ^5d^LB,u{2GdZ/Hj>蚣fgpix -+O }cKLn!ЬRo-|*hpN-qd4cبIN!ߣHt=ԕ!Wy4<.C;rs$CN.mTnL!D[#>$ [jVc-r:sge NCYc<1)r1ط&alh4"]7 l~ϻ8Սz z f@nUt/=ݰil/.&>dhg%Q0>2UU4Ձ(t3ܦcs킮+w,6]k]/%%0Pf1]6ekȵk-͔<; zw4QCLA7QJjYZp׵M7tSN;^:cB'aܠmٗfuհ*Kr}a,tEDyCdkc_,MfQANVRGT_nB&Qi=lϵUyR7'acxAޤbo}f:w42e.!#\…DzCdyT{^kK r)`oI#;5ڏ_O*~7T rt}'{&{߇*t|s~ЪfBfi؜}slLW.r vn?V9o*tAޟmt[,sYH6qcѨ#mWp񏀽>by>i;Zp,PnS蔑h&/_[Sw/YJbNm_iD>B"_*'r 6+#?/MT^򬇦(4#tT_5 .ȳ Ya7,<Ԏ;e/=⁳@&G:Xn^hheYyvz JnVF2'_z]KQF>oIaz&H^5nÂ~Z鷣p "-$5:\qNW 4No?,ֲk,Q~ |ug7/ys~ɧvZ ]|exͳDzCiR+rN1vBBN%sZњ6hk5kB[DRȀ P5h?o'r(5K鱩+Trkd˛b8 E*DʧKWʔL&_,9,zyK.\o >d@w -I=UXkD䪂j(ߑ)\gt"\][El "tX\xӖ.r}ܣؠ erP &ϭ\ɹle8HpۉU\+Б^ĺE^Nr,WdP*K*rhM)QBm"+&\e#χ<Ǫ!O_3I\d,1fzG2݆t\iߧ־^\Ҡc$q#}eZ襱|˾ 4Vg31`+I7삎Deݡ<@vE!v9K[-C8{._S,tJmV=K8ˈ =uϧOx>__)q+&?+~C>*2=6CBxJznVojME rrي,TM`Tfa KB/ =[ikgwh}-Syly:S?&HT|B/*yZ^O[@·=YP(2$MXU]eCX<}3F^_NhJDt6-)ܚp[" whacq^z{9.E'ړF̸}ؾ'n>? B.1nBL;cr:rB(LgMDs*h})M-mi>8ogiy\BKh>i?pȵ `!TkC$Pb&~nu7׆Mxv"ԦT x !fL?ߧ1SI'e?\[VL;Myk\;tkz΄?ŋ!IoܾZVOZxo(x-y(Z= lpM=dRC*Y4o?ᵖfͷf6ݢ~[#ǰ/ uwG'GAz98Ez5@SkꆼDTFum4|"WK lᶐ/ F "$e##14[l'tr.{.Ihz|XPb_{To{Jo'xBEfօ2E'5d\.up9"tBNRh3!fC uӬ꥞kMW!誙grNV"a]#8^WRPc m;5ms_h9s".5@fOw]3ZNܶJXO֜N4-s:="q pҐQx ]Q ݾvjtͬU~rv-u @Ms#jfVaϖt3+2|iZ q qyݧ<|B-x *Ћ$>}IO"'# h ]ݸ7*KA9g U5C|d1ȓL>ޡ yE8p7,:qT: qT3$US)cG%_@P4b7ȓ斊@9&-J ghP˺Sϵ u)lSG lqM]k:BEno=2ҐM>Q^3ԑZ[_wkR1;4oz׵e>6n\$݊mJ'=y!oqe)raxFsThmnOlumwUSQ|(.ԗ-ߊL\3n9$o2CJ=kAtv섅5'lz#Xb<-) -yz'kb#/lq9w(׭:V7rJv&"X=$V["ʦoװ257=l[^aSK(%g3h){-ғ\TTKoTBD%rԽܓ, mK{3{!*y>`.de7[MS'G#(lm-穒S w#2a.@F~ANV"!'-.K`'-ێ |_m}Ӳߪ֜C#ܰwitާ LG,Ѝ\F.$Y.,WO93 'ścZ,C|1(~ݣ/` p齝=F"~Bﱆ)5B~OiuK& 6?8NiyJf ><&B4A71d[#='3>B]ST6l{آz U ݖ{ghgW:Gfve/Rpl=NRjzx-mJeͮV)"NO\=yU{t?:IX?k#E[@xb"vbo\z{g*M S!;P6}=['e|Rb]ʳ^?y, z H͐o-^&|Dl ޮ.?`^W(4긗@[۠Љʫتt Qec oV rb$fL^ļ}ś24%p]UZsZ0q^Vo1h[Z봮6(wdNQ1>*t*ٟ{Z3sGP{;DZ9 z?2׶uſ%{ޠ'+2tZ$v]++2}SM)$_MГ`Oo7?To6\W9ب&oru^b'u7,jT@>*>`-{IYV^'ƴh ݑc}׶܁Xչҏ H?t-;IN# gM'C%,_]:YGzJ9xq,P@S=ޛn :#u^15=.=K]s{J>-o)󀾕YBw Iډn ch[wh} bO\nЃ^Nvy,dj1ĕd*g# u1r3[+m5hohN<-wJ}Vg}ozvQ;r_ChECft6:Xd_CԤUY+pU͂zH>m ;&^ +X3JgG@okn+>~Q̗#5jj>=Ӥċ"LOjNy' Ӹ!WY=D;DISx)GǖD]_k^c͗7u]bO=GK\$3.wFM_eVmrٗz!nP'=mZ n`FN9Gđh 3r2 %fbȟ?4B/{F eX|jj*o<\ xMXh;xY 0v^FO/\itؼyjG< m"GcamPF>k)tzM|=ruko-bi᷀Tm.tJm9k懯xPUS%Psfqz@_Ҍ\[O':Tuf? U@. t1Q_ 9r'FNT"f-[/Б!l_zř {E^DloӢ/!3A3cm=fk Ŧqfœ.YZt߯جoo!orD"}Qq8h]-76,}G{kpzklݞErU԰y ^Bzy@r~9a+;S{ 7*1 2RM/ c7cč`bB~W$F.,tUΰ(SN'rͫy[Im*/87rDAGs9T#V|Wmz&ׄ6p4)+LśW,W9i7_Wyn">8X^ʎ:vܺ`,V=zpychU{[;^AssfhaC?EGZ"vzy:8rO+o]7qŠ < - c\ݡ 7n"xp{9,.^Р3/\E"bDCdW!FN)'*-"ojwtIsKĕf.tDB *}L|;7p fL xUNSZVwmj?XmnSVf{T}T߻6e׊7ty^B1ź'A/Q v9FR~ר=g͵%S=KytV\z|#-hw!vyi2qbwܖ^\h7y:x[thf67n^a/f!7ncBvo)*}h7rjDұ#KIyOp#KpYVsMIFnrRrW3$fo xK'<mM[A @7p!xz{9}%JA/!xKp: $x:M[|SW 2p꫆K ;&".*F.qgDJ͊?CSAz3$u䌅aH W^=_k3X9=¸:P"U8b0ݡ`@(H-e*Ff1+j&2E-@S'f 5kKzACQ)T/] 8#0d }*! Jм~j^T;@u.r[.6IgqH(/Ul P;>O]Dz[WEqVZ u{ TdpAEbk"/ {Bj |Oɫa#`|!Ukz /n-\/6N䛉W2/#'O9 ]㠯>:ϑ_eatEN*)M O q38gPTG&Wp#&c_ͥ :賞^ٻA ~}}@dEӭ 5;Aj& bC!aFgXA3s{@oSRz"BZDn"\/q|g1N=38[qgB lROTf@ddAD8;'-Mзd%7ryVf Les]H*Y8^l=)[z *306vK8)mrYU䗟N^쵵1t'rEK8q7r -E(P;%ay\rYqm+ꄽ6D"Y"JNpי~hԵ@/(k qDs`% FK\cֹ6;+r6q.QЅ|[>59;Yˆ!w)*Y˟ƍĥvBvr>-;X@}:_UX<|V{BOk.Ї6PL؍նuULc>N=9 SAW+{J%\}\C 1MO/6T *r!~#X_CH_w}Frֿw'սyyͧ~RMm{$٠BCcd ς-5Mzx=Ayji% }@d듄V12ҁ ܋Ag2=NX AĹ]@>~pM![27;r=3/vx(ȍD>jgtPlEO5⦓0"?+K ^gtpUR.0 BAo }s;V_tG!"+PjMH2n|([_IXrl-._Q^pc#p7.qu_Fn&RNWF C/<N b*_ܺf5m ;܄ yǎQ1g -W-Y; )~eZ7uTs{"Љ!gq#govksvq< d,+n|T:Kx7tQܖt̮"r!C^%gmEg\uWcL8)ىjo4[nA{N~E0չϪ}"%*Vz[cd[\zq|&g)? Zyƹ:)t,'~#xĐ9⌇M W|8I?A69N΋quYe=" V>+ZO䛻z+^G.V.mݓUl6zOW? N% Fj@ :(H⸖ l8D=rY n8Gwrn{G+Ұ+O'|OgOB{D=sWW(;ΟhqM=Dt QBX} }I73ߟgT 䈇]}|/ET}1YF6)|)8ŠFR^r"]Mc+F8 6W5@92-z' W yIz?o~#Ae#-ܔo J=픻bshgɱzrO4C~c:kdGCm˘+Q2Q:SF3f9,=CF>b^67][^^ ( ~"B7c9 T?f7nS)JZeXDENz tPlk(m^tߣ".Z͒4mEhi:k%ؘ . vOog -Ə#3N~f'u#* |+ !fف<(JpWaV[e<֠~ϕ WwZoViZnky:!oٲqrUϜ|j9ZR٨ȉVY) x:2zl#t%٨k6Z"s#TheٷCq-N!ѻZKCN[^c C7d( _d&\u#2A vo}ſNve#f>/[17DK3C57[ه۸e6)v6;RAB/Е]&8nr܏&y)>s8[E>ǃ5ڑfYo\+4c .$4nVz b}pZd}@xտ/mqYqഈi54W CTj>9t14z[$ҡYcZ|7՝W/U~'2ȥ8edlˊDqmN2 >XDSr1o:%wAŭI0aQ?.˻ Z9?YC.7)yv85!- I &u-\ģ[9ѷB#tzڡ+/m:WWL?s]ט~u䴰M#M6zAtM.qX:|9˟hz9,m43[hW G)o ܗc ֎"Cnr{, j9P': CSQ>sdVI\ o/@ߦx{IzJYj=5_*s8?|e[ڸ~ 1b{,ey9}4n|3 h_њyV){lz]N-f_.r miV.>%cFnQzT#m-X|5_y@/f^O1iyh v!%4f0.Vb#HXȥPn|U^%2x#n\t fв#ĕO)Y K]n> j՜zW#E-4i5t@>2Lt!7X؛[@.^;#{ Yx Dq!_AS}U{ˮ V6$6hr!8M|*}̝VD,%Y'E,BNqbm'7:x>Y-g}.ȫ6./{\URI2MĶAy{{حjrPlh=l }V(O%,U੊IYe}$P/fs>.Jq5^'Ahnn ɹ]R|en5s' 3gs~"!$e+tVs}R n-+3G.(wn8uHq@-ȵ^~߸-Lp*\K@I5vfip!/K[\@n Qʃ=xeDOUY,cwGSMZ6u^B_x&m5__yfq>䣽uS{.+6/r?_~&h@>UĽy|}?Yr&(Me17BoSɇN'q`xyf-6=XYOTh*EUUy~^-b>ne/rYE?)\BnψHtWWI5O:MR0 urlT~"קR@I /e/"$7pغ hcxӗ m\ͭA^b2Pޑr!T̷CE"ږY6C;rYoಮV@o>5.'0-[% MK% .w bQy[ݭ|aUh6MQ˞?6k,}rH<,޳\mJ |z=PR~K\yz|[&qVf~[ \'t-T !+^QvUs]r3es ~ŷN Zø$vR.~OAgp]3?D6x8^yoV;NjT&ʍ;?@s_ڰx?ЉMZ`Zk$)6e`ȋ9-٩FxXK,O5S<2h=q= x"ߠ$?ZӵTwzcfLG^Uֹji-rE!1 ~9hORE]r$)Ѷ5>"U?'ଚa+,:KjyZbq{,,92 Q:!e5m S[9Ҵi- YFݯ%ݼDI&XV+r(岸>5w?h Tij%*t'nfA0t ވ|Aߊ@XЏ_Ύ }J~6Ϛ]G-/i "N@!`9W0.njVZ6-l1>gt<i ܿouO])*C}OP нD*v!O ȣCMRv+>TڭfG9u&711q C΍ ]Q~L>BVt7Ѳ[JYmߧa+Qd+SEŲD-#`s< !)+!p#\k6 ~?w =__1\{e woXRנBe iS!yYDF/ol@Ù9Aw̻^%b]B03B7,b<Z{[~^d?涏D1B[C~' 8 ۬(ir`Dgf܇e} vR9{7HacR5<p>ܯe(HѐNSAK|ژޒb"J=aEWNx.Q6;v':9 GO~ُ&y#ĎșSґ}PTTս¸Ny{dY^1rN.[;o6Jch،߂|K,|gIQJz6:"c-B90ũd gr [j4񧫴p)ȥ8UTk'๝Hʅ#J59Dc7PL&[]6߱|TCb)oD2A7[~4hD֊ y Ya(|#Fst(7A>l`=.r 1\` ~ؑK}!mUp\ iv,f@',5?wuC7oN kΫ-e "m̸o%:+<]/Rˈķbب]}7eUrh!i-sY͋- Icc+ grN sv)sٔ$rJQ~@׮9 6e9IlXZ[RqWuxP. ''r]⤝gwrˣ;2't"5t4k=uX=P-|4Q ,Z-+|n[\Zv@ܽ He@eޔjQw'r]BԠ·sҞ&мEZo 3BB7o-|L5JJ_.Q}Y}hz? r0zbF+Sy5C!A~SwW[vLyM֡zJ˷,NЍJ2)Z3a6hs(nQz촜3Z-XH o 5fj E.Nl K ;pY"0pG|Z30|\)NA#%NQN: x :gWu|kS U$lMк_pr33^ö+oS"MP}^'7jk.5}BP@iЛӯM/%傾:ؖ 5RE!d_oo>CSʯ|%BLchkvhs?k *Րke_гCuѦsEG-y΋t0EaMg;vcQ콅 ^׫,4l"N ZǦ"jB>`4pD!sڠiC:Q= NMc5= ݙKLV1;% C *~1(GKhSN;֡{ڝC<ݿd\ۚ|+qbu` W_~-tG[.C-ΰx|0nw&h 冞2]UP!qXlQK$̇`oE C%ި8qoE ]sނqfp{RYv ΛElP!?'d&) d.<`?f\ {k*],JIiNǁ}ȕu\32+8 K :SEM:n)Œ_+d3RtV|Tg #m:Ko\醾 kq\uXݖ@'X˧y9; e[ gD۝wm7"{,O"?}԰ǐ}r=|gmУo:k=B.KxN {^P\!L2`NH6dHl?͎ }mI')CEz)({d-媢?Cy^~COb_K|'L4wԓk'NЂNb 3#I2 "շfa䗿 295*rD+=EZ>t.@>W㨰qS{Qx%0\w.qWɤOe?ЌvQML2{zJ ]i'ȝS"}B]Z7͍$31"/LU?O|uWENoCQBq&,qu\G6^_V.FM^BazɅ\B@I$y@4c,PֱW|G͵|5_wV+Pv"zL9Jp?%v\濑yDk'eiȋE:jq(A毡q+5출yp9 ݊J7-BvR%@_j ?ܠٿq ͊CJ[;oq>lP#\@:+}02wLH# ۔Mu@(HBNu }ҲpVo* Э *b\"%J\Wnkfy#ﱔ8-hg04񏯤*OgNR<1tWx=EY"ey<-7B8$,>뵚|(sog_Y^r+@]H0Yv7)Di#3+;BT }jyVPiG^Qiy\bB@mfG5B0A98PqƗS4ފ<-Ҡe&9psL; ͓ҿ2 T IaМBaYfk⏛~VRK^7:IL,&G'H&X3M\񅛂 b5{BOMT5K֙WB Tm罿AC*Eā<.%;q*"6'ѳO CV$o6$aә\ 8!(i>TB[xtUo |,"ρh'}YT*mϠ{B 9_pzK֐k+д tvib}wVpUs-!yzE)zo=O.t/TohҸ6K (>Vdl_Bvq5,Cvx HgƊeq'҈2oQ77kFY/(r=Sys/rs 7 j+u5WAoې-"&P }x&T'$&=D|\ŞBw]Մb_ WgjQf֐ 8Q,"DnOaV xj+qOOots = \ۤmBx9# q!LO%Fp=g^bwBT h&вkU(([[zD\WbS@U2>Cw2Mom -2pTN͹>>m :r,l6hzmv"ҘCyv2C^<ݠ_ :}_qB3~"ﱎ(): =lЙ xdgZ3=Iˁ] *Top7|6O~|D$9Βȿ{z T=,mBz7 _uu*\f9oc)VE,'r&,pg zj5};Cת=%!{?'rbzGXnwmq"ͩq/7~E񜈑K_>M(0W?>" }rJF{a3HY6dԚ1@/jNN\-nZ^Oʀ]%|g^'"5ZyشyD$!AB6-6⊙I2yvʈs3VzahRo -!`bQْI;rgż'[':M].ԄBӉ?%393l}\B"?@䚀]i,cc튙X |VϞ6]s=gx{j1,.gT|> LOqktY-Ҡ$OZӬӽ(`YN6yt%9>ϓl+KC^qqt|kzB%ZG)ژmXR q$r ?z#sz&KCNY~׸r}duWFpJwV@?6qO=qi'l)e( -r,ο焜jdd'r \=ڳȍW\V>D> |ۼͫ f,4e}d|ȇ6kf[FBbOkLXɅׅV0˿`OT4]6K[/O@-uߕ,"?fM$ޞ}^y :'IKscuN񝒷ޡI{L%?z$vYp[[GT|ubp'Lm{Qhn, zCKO#CMh GNJh9Ʈ:njaӠ =-ZIcm2c8&ڠt}¾e+PVX/ U _#td~D=09$N))hWJyr>JۏRJI Zg_,z˾,n -LZC +1p 2c[0e4e*Ň* =V"ceޞР-T [eV״2t.0_}gǷ>5-&~cЇG8 k|PAp_2OatCG4RڱoL{Dv Pim&7t ښ2STtSCwf`Tv#j+#gKポ$&4j&1-\ M"+Q)YK|{/xއJ]'[to87\5WcSP8>&j|s3 7Ϯ{I>ֿDNd8y=dA HΤ+E\p ݝ Cߵ =VjO5"6V N`u#&f7T+3,6h^X.= Csf1Z,Oy*}h>N_AoȬ?=HχPo 0 2:g]]l ;dzD>%~r_Ar`f["f/r]~$)t fy~/]EbQUĻȚ]3q7̄WMh?Oe>W M_C~+1J>-_B-΅Pߺy#$:ˍ]⮀n{a[7.t-?캈@%UzVڽCwg9d*`y 5|ݖxƞؽ4{;p.m|ތe#}KT|hzi{q>;tTedFN;>5F3>28I)(An}cк`M*3@ޣ) ]U۲8 ]M&N[hqWf"_aݞItp/>.қAoCE`}ScGt2aU&zqL[<7 <.!~kYbǾLOs}2!/)$;wr>@IxNєqo[)%˟/+6!41.z9\@f MeyP}_ӈ3 fOR{T.H="qƑ>Y î\[dr5d/wf/__BZ f$/ 4cm^ /*_[M<2Wߒybڀ-"_A'/EODK76DKa*h!bi?6wnV-9q5+C3.giQPL3&2'i?S,u3K}! EE֖o7Oiӆ\|βB.k'Uq597asR 4ڇa0bQ-3fl!kxTdgK,V_A&.} @OmGmϫc' ^RܠIs t/Onl>^>,5 !ž"v"l6nWIՕ2[a*arZ\ l<{R\%{, w[a2?59ר&]9Y)^!K6c?%nC$)7t{(E vtu7 4ЗnS ]^tshv"' 8}`n"OcлZ?o5/ixYx-Y\mPT]2~~V@Aq*ZAʐ :Et.hC-̽_mݪ CɏjS ivT[PwhfSZ~aZٻ|_n &z(>кޡܻ]Y}&[ FN%XYVзm] r:XKi*Aꏫ`RcaO rMDZMj'nciAFwՂI&|FFLThݏW"Q6/~(۫!ff :;q[gMCA -D k  'pGP15[ Rߣ".hsOlb'p/?[to+6FQ=ϴ0=U}$~kȹ ~5\!N"m/=DW^3cy*E[@*r oܛ-+ (=AA; i;=ezKwaE+-ʸu Z=|֧ ~E|Ľ&I !M']?=vV7q73>̖|?B~A#UlyԠ7T>5o:j'F(c 7lR|@n -]A^?-+] 1_'r]<״zͬŅ^8nj37ȏȩ竓|Գ 3FTL_iש|$N=od:q1M}w@vhCXt.'9B%.(pLqy L65;d}sܗe hc>uwC dZ^n?C cEy3o`G+ NGگGȂ>q}NYnDb7 {-ۀnG(GT 5>>-\lHK~l uќNt٪O#,>礄q#$边KeQ; t's켑s,lh!#'t\ N'+$ ܿ ${+mN?ؓF#sB5Rͭ?})UʞYB^j/_B2ԥur0}4C"ҜormK"3hMD<&Ї#\WYG$7+z Wk%gxRC_s.>b46vWCqK2N1{n >UM.zŒg+1O]$'rZ9,,6C 4KS ]&Lr#Dgk 2QB:,U6y:٣y,fqY9Pg"B>y!$[ޘkЇf.5:[~gVs;o φy^;iaP w gm3MsbUA}qZ9#z&4"4ѻ]1(H`NOKV{0(F,Dž>\o}^Wc7Xģ`1|)o,lcW'{ >#ZaB[.:6!+p@+jYd>22~LH"hA`Yc̻"J9Ӛc(hoұR{G2Bej];=KTQȝu֟Nol/{еwڛІ^C[z#gD. zXNU5F^ LcKL&\gI]*7r*}ZoS2`}ڰO^ɥݐ)b7vtFxPOό WSlS##ˍWcy{õfnqTBS*5=~L65ꀦ^7L}=yYͼmBWuu>z ] FnMkA*4(9]:QGUlʑ`;.j !Φ|;GESH^8S:2)+@`o8Ȇ㞷< O= &ѱ|xӧẌ= ֑#7v${UjχDZz7*kI$W cAcO- f؊2THvBZdoA@Àē1 z!e20vQ*.ȌٝD%_Gnl$,:ОN.=ҜE~<Uc{/k@^ՍkHr[)`Rkg^A3z?96A>ً;7@{M~l@Im?I`S_]k" m;u*W3m,>9Z%e~vՊ@3",!Gw*9==@.I2453/S&r*ԑct ?؇^'u "Ul!ݳN|wK|͞$I_N?_*QTeZMΤ }4Hz&!,NN{]FOpA:{[J yL[Vc{qJl2@ȌoiwYUKn(QyBokW _#* cO_c d1=C Sʲ3nkz+CT}`u" MM?-3a7Kbzc24"]b#T~ݽG2N:p[΃?tΡ?tLeI>O'Mq+? o|^&m4l@׭9{C ~sc ~uMQvZjX501_vs#} }&b94&t?f5?гag(Gn[451t$N+ʆ&>HB3SbIO&i[HI MWp =ͮ\sA |b0! G U*lCvCW{m ^U^?ts&z7 : }6d.zASSfiBuƭ=["]r|-"pEg5/UZK:|_tM2@%XL#辯 ww"v6.n!;ݓI}^^֑s~.+ ,cZ=ip"/nj~7\ ZK8|ؽ zGFVC^*8 칗/_S΢ |ϧZX`κvkf>5~?SWfm -<#G.~x{.A-uvn zA>12.ȿ-\JC;w^t@gIgSF􆞓gANy=_1hNvBU*c\$@+FcόN\r=S|ƞClaDz(4b;@#;NQ+B5Z U"q-8Be{|-VW"p_&)?"5]Z o= }ǑK%>f~vgݒqrWh"^ܻ ۔)&S:Ҹ;{k +D.KICnwn3:E~6B.=4hf֡{fIq[ua}/rjȷ Eܻ E^f|b`{_Ry_Ku't i Vl+A_މ<)AzQ/4\@0_ҩW6:,@]GlS=%1uy{8;AK]2D%hM1p9k,n!; gBwjB@ &-dhIN^;&v"bb8w܉ZsȥOSǙ8 y(Yv E\"OuۀV_LG>X3sY sQ~&.IeMG @RƉ$>p-{"e^{N ~y eb@eV}M/}CtMd7҃!?DmUz֛c y[l1ܰV=FAW¦Wpm-ʢt\6z4K]džEN{ĸSS To=D wtIn:l$%{~-Fۀ2g9 YaH@"FU肞>ccް-Y#b.rqt:Ka=}ؖKmu}5爹bC^C]u3ghDE&iwۨE`I7ZKj:h;J-R~=EF>e8_<&R"dgWC/u B J6 u>V8lHl^#mҪ{!tlF]o^WkN7\nQՋAk}|<6_ד/IlNjkOscW*{[f!jc 4V~5d=_zξ^ŏՊҵ_5v}{o6JWc}c%u˸NKx<.ryRLMh/2O`wKx_~[Dz&ߑF$ߛL]ǸERhl=谦4¾PhtA^2NOM2&u1i@ȺfܬH&-6_mүs.I֙vhNόY`Y AU+ASYwo5/2@nJ ZEhZ/r г^( m:oPg;8z^tl|otXk)^y6-*=9zEJ6[.3&2nh2~& sftu;b{'%mM S[lZnt!hpY-_>q-֠5 /Mz4ň_O~kNk"`Kgu)̨?9HzCvs: u!t~B)M^ߚ(0u>ЌbS$!nN)йQrRihO"&G]&8#4y -n8#LFlI*Y)!ZIӜ x&+@ _BSr%'-~8y>\boo3znț uzJmRd=&+C\o~! \93` .r&;K. " ~/X0,=i zr*r"Ož|97fzu{՝U\-p@/pU[$N-C_Nk+]&OXC.\2\쭐Ydr~$"#9]E<:f(=u`kZ5yvpM^7MCogY,z"rOie's~"GޢЊWI>B6JMҥ^.C''n %b:q`-G:}ŕ8rgHzM^xpMο>7t x>LfrUp] KVwEEu%hdS=ϐHEs$4?ӎ!~LSLYK/?X>x\.=HdCv]7pgO5\46.m[lHÕ|᮱ϳm[Od^l&2"˟|YqecXn [r[U3 2hi6m/rON\Qh* GA[e`fYDk}ly~EOKEBk~l2Dm.aag_n3Tz&IJt-TymМΖ&u 6ǬR>EXmufEp &1kf`1+GX[ü>#xy>wV;C:}p:}pS2:S w>/Qrkb@pz94'rcm/ X\EV# xSޢ_;+ yozfZe >jv?jEPaNnѴUpSia|6yDrDiu/w}7R gڤWF>%Ko-t u]w[HvAQCk]#NУ6.KZ>Շ| z w].ہ7'S}!̣I.k_܈RN8X9 Z"-!^=#x߭^--||beuHw98ţ_Zc%D.ٗy P8q8xjПreagG!i)6𱨝:8e'nRނ%CD9E.wXB={y=nщK&[cmW ei;/53j?gPZ&q#yzl>}WG _s-תS$ɓ q'eF;O9X(6n_.4BXcANITpӤ?xTdӫ^jo? ܢ{r%Hg;7yEN؝gv/pN9 rt@^fUhB>^ӿ))P)]gVߚoqe0 b=|E]#D6oc523K)$|B]]K:3  | 菳zܰerH4S'po$F< z_乨-KA֙ިJr ((^ߗoptN~"O68Vlw+g F<3Nov:iF*狼-<0p"9s6#oy: G 논Dd` 9,c|*\Bԡ 2*i+ b䉬#8W|}NP +dc{]i: A ~7{ @GD|Ӓ ]kyu5ұ̄DޟȫB'iِd=Jˁ|+lD]ICALO Dg{h/ņH LN#Ҡ(͏X#AݡT-O?pzK%Z?jlAy*~.\17rsEMx-ីF+\]ȎJyu{ #&癳7i.N3, )'G4Ґ .Dkm/sR9ybN*8_ȷ7\ G34͢1jlgIN"ڠIexi@+*؍h=հCJaO?Eh#<{5C#/܂gG)Rj>r m \U~9AzRB~zm/ܖj:rq_?d5^Y0oqx/F\f, K8C㉰u)o!'-R 6vqHM툢;d=3.7ZBHȇOum}"$Ǒ%7X m1{FM>`71D\봑W5Ϸ(R߰u)KA{uO "|+ݣG v^d\^۰)tE/*8/Al>,9%FO[.Lj9WR@^.rKXҮ{iЉ[{#lj|mP׼-KY"쯴0q`APPV=D`,zZ!y#Vvbȟ-ԺŅX}U6EI5cEߛH>kD9c|{7܎zIOk~9p]C~#ʇ $M-04іnٛezs=`¶^Ĉ6@b<'},7rI2*ڥ]XQwTw̺iZOf#ZgSAڀ~;`/7nkn$}v䚹7nWad}A'MMEAdJ8GФ8"7rvJGȗ ->B-N^{"[~h>:l\joՁ/jd\4s=|O3Apjpoy،,;(B-@~7$6 rm<$6{CWCOVdc#ytn[7U^jCӚx#?6mSB?HRWz~5Cy@o @ )a6-"oe] ͊>Ybr9:ٍБ}ssc74fZO:/opnJxt溥WҡɈbQ蕠s[jSvs铿7/=וMUrbMh?!bo]{,ԜJ9Dlyuƍ^5Յi>FQ> 7*^)),(B牓'e#OlxdZ2Eh6a g l@Nbm }<6 4dY!bH8Ց Ruc̳.8l vָ{&iMЄ];sf.iT:5bPQuI䌗7x>=Y7xl׋ Z#l-#[zڀv_i;mc;^T{Ѝ|8M~2ڑS9Y%|Qe7xOv&;N|CoiJ q ) ^C$Xf1 B%s9HAqg"F$Z}7~pY}1Z'sq `?ߨ4YP{n ="8&3]^ġ?>τQg2oKӨC6Eo=o"mgi\7rMbػ! 5\m@]s9c\QZFr7%U\Zَ۟jTDsΘ%Qbмb6="^^5鹅I:8@9۳\ +\8Ì^_a䌔-{85}uى8.^C3҄lYV;E ̩_Oe~З CZXu7Sq5:6F̤k/<@.nAWBnCﳄeyÕJ\/#t/Ɩ^@λ 9^CrP3I{G'z;[ZqA<ʁ\R .Z99~Hu}eM=/?\h.gqC޽Ւi K=z}bM@NYж>BWws[[k?:Rn&mg˩5pTІ|bv-uƈazR^%Y]HD I;WK<}#^㈕'K:5sm0-gNGw#KZ={Cot.CgO])@.Nmrf,q` uuJ]@w/thu ~硛@t5S*mkuҡh/68R@n2 cghs9Jzs;/K kΌ~1? H܋ҳm]ŒB':FwrIeVhswd^Y@Dr~<uKXZ3M#O^ rI*7E0:[ ʩrFFȥUKl\al2n3_dg;v:z"ߔn|2M< hB[n yl7[Dk  eoi}}b]˙[FXIwm'o9R?XZM|7}F͢9jz".: ?~{@[si@[rNܿrTI+uXcEyNWqez n1;4ә}N'`w/]'\nqd pe (gQ_ႋ\|x"I.o(}s蜛#?I$MK 9ktv7z3 zOSyT{tQzh93BhЛ _-+4rL~^|yD\;{0vi1* ;9.Z<c_7tv'y >3ۉq@vILͰ5jzTJvBEN[;K -gN<>f߷: z7mn} Rx\?jpE@_u[5wJ6g. RՖ]ȧ|7 YMoZ^:婄#]#08ǥ?ӯz@|%4}rt,Qc(4岑ozYv8zm= ;y 򳚞^dLtq̢@rN ܡ"'ů }m vB>nv c7y׀:rs }4׆#5=jN9>3^z*4WƷ }[f*/,&c#\д-/IpB|ι[ZMȍ"NF/24gՕBc]B_yF.LgXO/&5~CW-.`Mz,?g\208Ի2IƁ݃g~ Z8زeFbdCF>ǾchTٍi<ð]5wУSZ:m̞]q96bchUdmtT1|[.5F>cR8o춚3Bi }*D Id(CtS 'fⵤ&q#r@^m6]XkPl:&"1"g-C~o yicmvDnOk8UBF~pkMА/-j]y]fR[~#,%˻]f y囖 FMĩyꅑ;2zBgrtjxBOtwEz?0G1  ] ]^zjh<~Q9%V= 5M'\"elzBJDf+qh', n:=r7'L^dӗOAPB/8\/s}5= 5=S@|I@q.ڌtp!/OoO[Sϩ5hF<^jRCWhC.. =wU@n0?ݘL_6rqM|"D^@@ޝ(ktx,1!4r=Xg`CVm'r wK;S$[Up9L.QyQ9W׀kYG~0LĠc{D{7=3u@_JFnyj8MةZhyIL5Z^G^R@MW2Q-F,_\DLhO_X{DιT 63.C'3E8w^:*YF>wO83ⴅR䷝mqi6\o3=vKI-:PFQ:yq0jN΍I%Z䶓y12.݈Wl'%F}R؊ZNN^doïʮ¨=yҡUZhoO7.赺%y+ڮҕ"YLR0hvBG5`'7d3!vUˁ<,U \<ˁ Gj|Bgՠ[倮.˸& [1D7^[Ţo4Tpa(Wޭe -B^FyCW#gN 'gN:z tlW`ԙ-\ꍚЫ|'Yfn#@*cZpჰo0F,ayz:|K#&9oZ]]]Gu@;{y$c_-wdhe <}= 8c' 馻c#ДzAޜ 7I ˥)A>1K SccmЗ~O}^~' r13WMÅkޭ2Cw $]="06\kmCJք:C$HN F!l\̔զmtɶ^/cнEIDɤseޑR?#Ln۔\X/yb/vKR,t}{aU;LO⹋@סAnKóƢʁ|. EO<큭͟Cߺ݌MiN*%S gkF%B#wٵsr/Cg/j/Л@v=!Lw']рv ܧ뾪;EZ$>U1z/S&r؊On29t]Z{yU#oWa;R±:+8E hv|̥Sҹ:@tIuiCq"yWL9FN[ gKvۢdhC~:2R| 3`B^VIzFɱZ 2/䂎8]]r]֑]?⥅r&ڛ)8F}Th_$.l}7~BYM:Mݿ:?EКWN3vd@NԵTGCK{pC,EsFggN\{FkOɽ:]Tdr.aI# )j5uRQ"OuU*rif ؝F5+Tvht{OQeN%w~-變-1Ω_ ЎC_ܠ VW Y9G9zuBtc2@o\/zEЉIJ[J1bl\qLԢv~s-c+K/`t':x'*/eQit{qd#oIZTS ǡS/.Co)w/KlE])#\WV-FIш|IyFuzi/'CY."hJԼ=#gn h[6>F n¦.uoY -1ch2ڲyCgwENe^R.u@@>f!}[+4er]qwyT#e Z LU ]c vqͧ{"aSguD4!Cv]Y.~]WK7Zg R =D{ԡ^go]CHoW-xaoIN^h Gpq-&2qơ2RC:F\Xзu+)o:J٬F\ݠD+1ϡo1nMz녱F' hͱQ@^}tGG\@4yqF cYnݓ;2rbtEZ 9u<5::ؓi{b^{+¥7#P_/^wkCiE5=fLAF@NiTERvhcFRb ϱ,/<=H+_cZیzms_'Z}KE;٧y)xo^)'N#䃎PE WDU԰RkT*aȩ8s#ηCo=o]7u GJɻx:{AAC }Nn/5R,MT=p|J7*{u-:"EeB]fDN5V]G ̔ԛ3@3u /[i{sauu"?bVS˅ -UҗD ܘ-/֠uU7zI⼑6?ynSѬF퀮:Z xϽw謧\"gFc]\OΣ5b Jؖ!nP^>j^djTH}:Я([9kKm7UO uL_)uYw'0} 6MEh{d#=s^*p1N~%Ha( |{H`wZf#n.DI-ygkd,2|ZDkT .*檫4!Jw -C/Y,=M,=co4a9{s1zC\˪ 8^L^E0Ensɷ%iYtB0BzHf)F/] }Ю6.M]|@)dZG^F9.vW]w:Cg0CyzI.jMg4 CkF͋eԑ[tD6m˺ =e60 .d<=16ՙHDO>RlZ`p9G5&~J-6t$I$-F!&F:BB3I8{rt< >,t݋tñ^'ivbNz_*ΈztޭSFN2S/Y4-.u͹*|.ͻL=k,5FH7aT9Of,OF_5ToC:޿$K~tӭye12h llջ<_Stzټs}BW ú' H/:w̠6zKF*t=e U]ޮႉ-t{N0 Ox'G9eѱQlȁƆ.5\$e>I+>v t83t>O݋r ځ{=һ~xzH"XYvź̥p}w| K{B߼4Cn H}1€&r"'>RJ% . kQBҟHЕI9׫ƙ+c9zuCۤ *mՁ0Π/t v6zq*k/}gPk9F $r#W_nK/Z#=eDZ.׎llZp͠^>3/2^kRYy`0聜]Wo9@; @~7Sx[zHL١e f$0  :m䷍$ec`91_DЂyF|ɲ QmhQ鍜&e hJo3^j1ZIƍtMtL}֤˧ 7oFfhq?;B{ |t9"@ځ< i7ȲLwϼ  }ހUShzWL{B'W]@>sx!Ke0#͓XfXd\xs}o5=CiT(7:C.q9O*6%|&-w><;}<E~9T%#rn#K]r|T>ys7Yȟen# Z@Z%U rÅзq4sQ*~-C1$B4z%_ ػGrӿ0tdʋI?o!Wr[{UŨz oތK#:XӈrfоFzkо#%uiJ6rIiO)yxvHL5u@w08[c_:uݐ&ub=zW' {@7Guo3&䋎mIJt@dXv,KG=ngfC\̙ouzhԔKm@1s+G|)%2S_H55_ɝ_5%A{j CocZ;RG>-n2+EE'p?[{^mq ݍ]U]ft=S(Ӭ:tH%{Mz:ƖȻ0׿rۈ΀1ZR%ؖuP%X[_)tۅD8)5jNwyˎ%rNj#[u#-emrؓ{ξ-)=8P6hњ{t.˵.HoeZG.FmbWE>]m[[{jpQ_i)u06tkvڐ{q#h70\-Nmge[3-DNZd)l&.U]o@R`vWٟ,bYm>9u6ݐzDJu x0F.R-咽>,7ڼ@O$"Y5#7A22EZ@^yĠ_s"ȝߞ4''B@&t}^\{xCo7;W~q0#✗%Y$'j|53]-uB.:nX?_ڕ F q /'mh˜8\xB}Q H/a )O8"öuD{UlI)'t R}le.d|#͙Fo0>e@G\~bL4{q<3{\׍>JJaZ2/VzCK4NzqR{.3XPE~YTcAt"+]Kk]:kUFJ=:s+rWKENi顜ЫWCt 97*U'Лt͎ uЙ/B{/7PLVO} ݼ0+ mA:xY14[쌗y zC7䥗H^{l1،td|˸7@]SR9-#eTT>(zrd23GhGZ&kszJrqUWmKw 9tu[_fיpޠS)fX,'vW,3lz!3^?G| ASG\`<9Z9+yA*\:5;=9RCЏ h]MLK촋-1x9om`[9qq~wofޮSL_gNrH0h_|5^;"1h !oIfZNYiХ-YLhה~.Ϩw^ k~<57t@煨y&KKɎ04*R;DN.0stIB޷ Sh9y٢:ͻtZ${wG@Ր%!eZ7ԙ@nh0hWڔ ر/=英:yhWUle⇽:\m@{ajn4 'ոLܖsX%یg+Ω_e, 'Qa `(6Su\GAfT 9y2R]w{h#u2ƅNg^{vm;Ћз h__s I1tLvy MM3[]j|YV;99}#uCdwfNwƮnr<Ui|B/Pߵrz2"aޢ7'pH<\3k$NkDNQU @g {fҡ $ILuy97UP#7`*y{@OH] 6ETT6B'1F.v]݀|eMpdodK#/ȃ-P9?wK̭}/;M_d\Z;GiW.4lk('{=w 63o.&$rj ⛦M/b2|B7rrLG{7Cэ &|DiB.Z{D:>ޓ*tߥOi/ HԆSpIF9uBi͙\\MW`%G-GOxWw@Fm?,v"F]T?g(]"E'.$@xƾU)yZZ*b`T\ʋ0GHwԥ{+j67-?*K'rL KGˆ.^ҭF>tܖ v]1OGNH5\6f|ӭ۱/n83ʝv{ةO1põe+jnԑv@^L @&J{\u9 r!vKz}B_葩349FLv腣qN(Ṣ6Aλ/h3ew^<2/x=:G--NCgČ|AK֎ HH1#zz+Fw(]Md0xq@w18/<SKQC,#9'[xA06'Sz6Ο[U(ĎtGzBՑdaM`%:kSwB/>f7tm4:>^<5@^9U)Jb{K}}[ IU_У!A,N\eX?ha4-TRatlyS>He`K3ָՕEnwgpcJx7L3{eU:^!4;Bo{<^R^5R)$#lcyƆΞRF-ewd"6ݲ{Tȷ5i[6Uvx 33~EolyVl#=r,1"ΓqNjغmqw;lAJIZHR\D2.!lz, zzD$|Ԥ\ ~6aO|~߄̵G^`~D_΋(AףgDeTCJ^̿y0{_Ҡ5-/ƍ( :W7xB3AFN?N}yga|e»7\<]&З7 Cnx >Ϝ|cjmcaԔݎΠ} 3EfߏԫҲ2ORp%1PKLv@fr@o53qWCߪRTݠk/=hV^>{{ ˁv) t3\8gY$ļзw\NK?e05/5}qaˇ"CoxϋR raW<׺4Μ+Wæ`H"RZsv dK 7H㛢|KyCgխeZ{= @n^- \vI䜑hDN!^$>.| sweBf+xK: +]o :R3y<xYg3ž/wߎFT ]]mVw%Wwy&0n c9{vPyծ{ztr$S齡MSu=ӼD@EYF:r'@W/E!.OKod25XqF{F rJUg ߋ|@״ ߗoI#/ZdΎ&/ӳ 4Ի5.@n@o16}[ȩ2@뵑kܧ\.=vϭA T^j3T7t }ӥI?R5 K$r̎dtɨKg ᄃn.Ѣ)?Q5&eou2T ߸1W_SizCL]6m2z5]ȷ1-[-mB7z[/R*S0'ru]IDz%Z.blӺ.V.5y]jF+ӋU2ⳗ 2Wj Lb!зStX䛈fUΝ\Nɲ{lS/͕(dk ~[q'QKuꂻ z2ɁfAwZy6rvF3ZZ{=WuG]Ts+|=[{u7K6A9.>X4J #cTt KoQWRb?^v-@ji٣-@D}>~m;:{cAt:W^T ]VW*j }y齟["7l.L2a1@m %&tM3XYLpyBgOF"Wua.7F |Vq.\׫}zKPw#MyxU"`=x"c%C MRrM&7,p TS%Ӯ n7 yk2n}ZI{$/RwGձ%с]tz._K_(.tR2Zzw*%%K9ujN-WOsC޻y!zfTO r5N% =sYB ṿ z8TwBR!h]p#=Ũ2.Їa3Cx*/-Tяp~4W腝FqrtݑK^]rft;]Wb^@7jQ+]:4&] +,<<߇)dVCNLkcڗ穫Ӯׁ/ t/.3v}'t_ ntzކT}WG~vFt Ъ!E$IЇKRD,U.X˟7Ԗ #.pq W.L\y)3Z6KW e'cQE^w '6X {J f_k _v.rnrm 0rQqыأJWB>zO vz%z_R^i9)Gn%4*Љ(k.̼ [/2r]g "A9iVxUz 5Z9@#3y(#Qx Ɏ170\[}y@Bi/W5,NsUO z9%ˬ<͠ۻ9{Tqc66a H'SDN[6p$% dz|!I~/rN&S Ynb3׵2ܲӶvgܺGmo,3띷&p @\D^ {8룭gL n8~Ѐˈ( xˈ.+u.W1KI[\Uy摿 5hsdc?N Ѯ-TwY'M6hK< ]$ w1fx1J䛵[!Ѭ'rMo@h`z Ws~WXNéK5WuU Z{IFKǾӷ@MSiq䃠23Ljgu)d_0auRq1hy5s*ZoMҗy娫SB{1i66 ~N۸ h#<]:B>tǩ O;E(rB56-~ Eޭ/p57xK(M ~YSfC7h~vWv:H%Wvٵަ8%b)>Kr6Y2_C0tд[6}4f3<W_Q%Wǽ$m=eUx'$Vtq->܌/Ĭ!յFw6ɩfO0r]~#q-y_jNHzyص~Y89M-?%y)\RYhO "U.fi| AydV$*Gشy])/Y}04=Y|O(隷 rbc{-wuVG: 5f=2_v)nKx{$3H> kO7H~{i"#;`/}^\mahC-*WS.(tZ@Z"vJb[N|Oa4ʠ*{mMwj r $K %mC=y. 8j|vYa<1fF) 7p]>a q` -+(Q##7>s3&pqt*f@L3h Yg<_m&Q*#c|XocXeصkgc@۵ nis?K7jm^׉#^WM5NS໫) |C&~vuGP5gKKa_wR/Yܠ!iAo|C( 9$j員 >Ɩkz|>%;5 >O5wGR֤?fP2/ 4dXOn7Zk>p/V{t=@!t`ώvX;I.5p)TNV8̀.* \3%C9GU/%wSW_jzE~O~-Goܓ$<9E/Zo7֐g 3_;էTeCv#yEׯY jMBУǷ86}5mX+=>ฮ^21uhaGȫ_tul"h =AӁ(Oœz給 ـ W԰/֗s9ˤ4W/vw=߰QoQ9I!W$&?gL|_ P>y n.1F^<'ݹ P&)3ح2kz)2Di{;h=+2r@ߔ-ڬvFYQ;݉=ۚ5qY3 _C>Se*~MuX%Cnz>7/CRDMFx Ub-0؉C9ꀞח,gO9`&/W䙷 {H^ݪ;/!'kN?|4k\|cڑ|&ߔ6Q:S[#'ufČ_. *{nglpSI?S?qV;LXknj`߂L&vX3aNy,ݎj*wݱE/F=I>G>:.ȏk˞m[ ͒iCoShf?7%繳!c> 4l?ν{6DN&G ֬{7f;^JyNOd&Sjv򍚵^|GM)Es ҳt^Y0͐x1$jUޕ|]L;5]llE;L$|/UAO[Ff9qU!OGl7*3>xɦ[G|$T%IQS+9@@qojA }Sn 7GZq=k+͊e֢ŧE|IDS h_Ƿe?;CofN~"Y"Y<vDvgk {]s荾a#>\дe -^{*! Z/$iw'gMH5| ݮtk@%Y3c4mra4OAWPj+RxwF``tBgk_*T8TnB1/z9t*&2Mѐm14es-{k& rEgS223Mkf34no^zM{O_䫼gI:r8uh0g4zg#^=Z xh -Ͷښu^ 7x Cтs>|J#?bRޅ@OG8UA(y{ͥxՔu9j"OKkIzaY7ط@ۣ힢fЂ{ҠSɦ|BWxZW$#VZΆIeSAN_*-uX ,'śukzڪXߩPc nWs,MkkEm)6 ~K?_ fp}$]M:t\ =-٘B uym ,N6-O%uxɗXP}u/NG $J|lM y7J^d;E]P`elV@7&eo<^bڿkL [KR끝g3֫ kF?כ1O\Z\{`~"%yAt*BCWmQv"W=7^s`B'2'2a3Amiz-gh<7o  n'X0(rG ?Z?ߐ1X.2X4;I|YZr"O- MNocUHdzKvq;m9е\GvcsI|$ ],uo܈M+-L=䨭#Jz( ԈC!Η]{BR&ϲqU-}w>Q년?\0?=8v٬U9j`9 ̲&;6yлO f^HJ"e@sz%.7J'v"')LVJB-ܑC?[֊Kއ2ʦ(fl-"\Y49W; il'6Aä$vBU!Wr~F{.B@|Wߨ*6i@6 *9gu8ܠG\U}VCrr}Ї%qOĐѽ[q R{R@h=,3Y'anoК{]ӳUhʬ!=ȤC:o%TZ6Ѓ^6ej]>^A^^S]MIa3);[*J9b,h&$;P97oBBޗyU+4/rz[77bDP=u]|}.M%Gqݤrt`gx9◌Ndv;Kح!zw-5}ɴm rB߶FbJ{^EsUkt95 I5|5{֬yU'O",: ;q`iA_LX7Pm@{ӐFPN_8[#xtq-͗vOsShl5^rе?ٛk8bD>Nsn>kʀ.8t|gu=ǫݲ< 1IL|2bdnv Wm-}Bzw?& 菈I@N2bg)nmdW^&N!R&|=#wgE6ˎe4>}y:O̯|iUmM, ^ցBSlX@KW|zxflfDs~Ie#W$Sd+utE`&VKc sMP*/z^x`_=U rP vrrR[vc8v\|;21/ {W/ 5i6۾݁e?C]^[b܈iuh:SYg-UUУHݠ|_Z~/TL?i"5dZ)=s%S*ܔ_.)p!']$Q?T dRp! ]J77.)XD m`ߋ [cZ`Ў{]G1з: AWMxB/?j7BeZŸ{z6VՍ[k^m.ZH{ueE&;hϩH8L8Tڃd}G왶AzTcB8E+4& rk |q`rl?yh}v[*_/#;y 0[?s[Y~'Z UTsSz 4}P?SPHb"ЂmRgbVd"{zȠeMZ}"h!*q"-N ''kLqAPPBm;rkGɿΰ@N\B-OIPX72kKoE3$elIwp` doKǟP)Г +x?uqP*O|U( cb`"D[ܕ]~tn-clro9qGYM ~;?Scf[8?<, DK o^+rK\=~/0'.p*+cD7OW"B=1R7l#gbZD>m= T-ji*gXYz 2U>7 E Z1)6V! \^Ź _gm{~_}a'Ǔge+3FכEgނM5mYQnv9^Gݕ$ٍ u(/ (}Ǝ.o! 9ᅼ= c̭{YCZO=AzڤXuIV"^|]5rQ6AJ=>9-..x>>Mˀ(=KOBσRQSBKpW93tTI JG.chs{!pr@' |WBB핍ܖ`|$Iz9unE(){R 6\͎KE"k?,VQU%%n pWQrKK8n2-]1㹑[p=ty ?E -׳h~p,=;Z Q?6!Q/ 7k*lGnM1 q Uk&J.[\{9SlX.}9U6υ4|$a ݼvs.9R٪Bs@:SP=b~YԦFg>aY i =SloI@$l\3\O,OrQ =%Y'&[( -'DŽ=z;-(?Wz;Hٳ®a'5yiQ%Yam͸$Lvqؠ%гNN$u_y"S_T?S.|>:]斂|C}T{t 3R:dp#)~h{:A]:)zFJN)"آ":Yu8ˡ" QH1WnۑpK &ta:oLڡCfc# ,8M=bmzLR9t'|BhaT=@uc;hvm qqc{ts?Ga}}Tr&2u- 5砕kv C?@GtN|:9)Daso_)FU7> Rzݞ9f}\ ]2uC>Sgi9(7VhOހvgIZ?sp7gv c1ZҰGܤycܙҀY4a'Boߔbg\m\ߖoN "*<ۤ Gǚml rjZu: ue%&U(qR ܐ 1O#{<=3ngMocu&s/0E0:;R Xq \_}_{61ˠ/-g+Og }9y' ADGj3dOo2d)-Waqج4FAv;>=gn\lս|g$Y9OG,,DvIz\AkVxFph]v%[K[1@'t !#\$>>V_ k@^Xz jNSr?O\~==:f}愾 F~ }/cFc}UuZ 4;fsem CO.G5;'}7h}VUov?jr\7X-_ V~:Iz`B9ytRiQfIs|{EA3E$kd`ܾω '+0-Eh w}-rgE*:)ya_QW 6x#w}t1yzytXP雟4v-\j߲V ,Y7y ) i"ϝ_)r!q$䇜#EЀAEI߅<:Bxܖ`cR ZT\ٓnmjRJɟ(n`g`IͻjW:]ݧ`7g*SG6p[VY7|0F9fmjmBzfx(( Tбvt`Bv?rs\/mtKNϲҎ2kÇg+o^6>3Ak$IN5\RW_-w ׂN=EnX~IlaIjՙd0#J{CkUud"n2"4!>%7nY"3B//͙w>zI 0A ~X4|F0^b"؇lRt#ұe(K@6݀wg HFLY~6uqk} }QZ{#ϻ~}Or|^|pEFσ "zH7S[6!hY~i~X)bؒzs^kpi8f/!=[!DbG+~`=xAusߙU4:r ¾NıbV/Щ7Xϴ|G4H_k-7q=э2:Gձ{ VOiti'f 4k艜6*Y:>˺0:ݹ0,iKOvB"/} [Ӻ\}:~ ]/  ah%NJ郼_#Cw5z\A7WD2Ư̈-V,gC #7xe7/U'sR+4at ֗O @Z㨽=v.=^S8/I"]36()j ]TWt÷vbi̭3xOȎ }f*)]Šz.O̤țċjY[n^.t"Ȍ5;R⟁ 񁾕Fft}2:]"ɩLwIHfpC8e鋰1t#OWqGzlvB?mȅ^Տ՝~Cn{7]mA CFΓ5XvQ* 5{*GFz;\ƻ\gBy#Ӑj(3)k4Jd%hw=dF̭׽%ZN-f>z,e_E(ȝ%=@>h@SdC_\g_vviz@Asyjp)%Գ "LE>9E_Xޱ^}|-b5$cTCc 3]!s5$G%b엺v↔6rok1|: 2awY &A'Ԇڿ^k{iuJh6~-|B&G#V/g)5[$ K}q]JcFP =6=afgدl$hw}_Vf47kz ?K}M<;$iTvsCU;D!¾UVcD2KyUREYbN1vAGh2Q|\XI#3+,1`gB'0H 0vt+|(rlrfcɗp+'qhf\W'^H"S7ʧLMƬ~^-^=^SN[ZlP2ԽR}+HkO0[uL)}N\^\ R$p ߲Ğm_n6`/9{k3{Љ q:J{K|-Rr> 3mrumV(4k}\Æ C'JC#WaMo/1V-Aj7 5~C>Г?%|$& s+wTs9OO CgAWl/_s^3?}<YJ B}-"Spk,ru^l?G0K}ORƾ9z3c3,Es/u,\ }l@Oq|t/0Rx@ģkV)|cL@w:Ϋ|VR- 9/0p9@B5spoЕR(kЬPz\va+fQW=LyJ+4kNaunշB.Q-/P%N]r7 hQZ?VӠ 9:RT$_lcَс}&fbZ k. " ku>By灝W&0}mh]b|5Q?&bt,^ҺH\g| :}̞ 試<\&$N؝΅N;#[ ._q.5QWZ3YZZ})qZuJrgJ))вZ:5kv*tEK|a9gBG\u@KyӢz^pg=&</ e :>py-{'ݢ#Ф}0g!bWK@W˛vGe%nX7Xb/.b&ӮQKzxM>%L}]RUg{C/ }8y벘ƴ}27fz}"\_eZ }iȔ'4)E>|R 0Z뜾5krWܑ[Vwmi@SHF>=Epƽmk}V@!hV6V^w34D5(9h-o{ʳ.j9r,_%(,edyagn9}#C-,%K,],L.4ą}4KgܡE.do@Znk~Q >kawKF}L٠~ }h*P(Ww^2;,l>kU>]F n Zع4i`kА)X:r|SyASgM{Yyh{!|E%Kt}|"o&萞6/~A{GR`+{{׵;\x0yYBAOɏ93C x#ߪdՠPy,ASHZy#!\4v]# Yrqli9^a/4zߢRr"'C1rL}GއbU Z"*v96_3 cWD 2\%E}d @+zow\?4#0FD,k ~Fǁ|:,ޒ[Wvq9MPU%YϣoW)poxu_'n yhz/;'hs} g ˨ГrFnS |p*зo5Dt"f2PLwRvɧG'>,2X< N^cU|= VN zeNWIj ![7oBnܚ)~ #!pkC>;Xdìr}k+[7-OK^r psZԃȢk&T`6_!` (,EBkWah2{gف+_}n[?:Q;tTNo5Qm6p[,2tB:򕱌// 2k. 0,zozH.+,5?ث Cw4N?8+t%B7|:aަK=@EBrʱ^CkO/ qc.Y)YyC]r&.+&=AE\74c"䢚t.-#CJPhfXFirLD^S Trshy~CVHsie#w~\t~\"F)ކn,Q/ .^#c*ٶrNO!\.SRSz?vaP" ?Y7A~>!F[gTl{_ |&y|l,+cOrQ' 4m~Zq h)Mm;wY*~}eLu#8`Xcdfoܼc".Fo࿪ t`t Yx| KF.t򗥥ܧOܹL17W׏|Ev(W W]=A=l::$rzc\f!7n {P@zz>YBV(t@7/N>wAs(&bDWm^i˯-$#ZHFXUdF7͉5^T`(.Y *X=1,Wok9z@y*މb(e1ЙGmZ*x | *_'W)Rv_bIΦ ,VMuip6wF>ѿLJry-f-90i͇^ 6y^r.k1kDbQZ0oȕp\k< yz{vрBpY׏KؼWEyb qvYȍ_~&Gn.KɣY~T=܂Mk/$,ypHEk{3N?o!Bfl-jOQJ.3 ]BH{>ZͺBd%w;ù 25ujEY{-Fm6oຘڌ-7T+=22ϼZ"`.Л͜2k~BpX%C]N,{S[f%̗ӳ}s֠ ofnċDZ װBI}7!'Z-^ʑ+$XS6h"nŠPml>RVLtG 3+V;,Kbn]o*F^p|ؼ7W BЪ613?([dee7pm> %KeMmÀ7>yFYkW4gnX*#gIcy۠spR&qO3_{= mr*w]BoԒÛT {V}#-Gס<;oA,Y4rv5`AC4vޛ9Yf,{2D'rN'vEhWT_ra#ԡ PծXm 0h񸑷E֡gδ@ [ݷ('p7ٹaxޭ VSAN8?deDNZ+kh_sy]N^3&O* rO݆!HY\F nFˡVog'-l"=e:\eq='ܣj; OP6>~ϳbqCN8bi@Ny*8┭rZ'y@g|}\-+K _!*cѱIOFAz9qlfzfK%M>뵝i Fݼ't 28CNFU1m_Χ{,N ,*6pZ5^FC8DK{#%@ ir2nДD;M.\O>Qf't=,8K #7+t Ĉ8J$ 7}N֐uV#O=P]51UJ)/5 aܩ r…;sYWڀ[2GprDtݲq-ړ}uk<ދڮGȊf-VvCl9 gbtE'g3+g :::e /j˫ϿDr\.K|7l m-ó\"b7pF*JqR6ZE;)~[(k(Y~󝼥o}~ѦPlNCoZJ|Tыr`+y3N>q#iT7p}rYnǑv>߶-Ysmx͚/<_ ,man`$6YN*y&ri <͏\>ar]R)fb/Lޣlm^?kp4x QY{b_Ѡ5xrI{H^>~_rzOͺa|L?.rJZEm5Ӭ%]lpSVFb>M?"#Ek(% IU}8pmҍkky_{; =%Q;%xD~xEchFNYg+?7+³pN.V"Z~*4sudHm[\$F-| Κ"4quV\þkGtz9%YXyLѠײnNxjUYsVچ..0-~GrxO'KJY拄s=x拣- -F݊tYaw_x! fY(bV֢mVJnNomiH{;%KZY7qg`fp?|pY XCVN\6[Wc\c| Or_cY]7wX{ FNWJhU{xbnFF44>73\/ut7nJ}>-5hKd q݆8]6JN N *z|HE-J vƧ)%{唴vY*oϏ)}Rx=s` !C*B'dtGX7?~ 5[+C7+8qo'oPnS7I }OT c W|k$;ҫTYڻ5sM^N5CՠSDu"V 7e{BЍn+ }wDq|$wIy !0C_Ȝo9-=`! T*9m2HNTn |'Il&ϫài8$&玽GVOy#5B\hC; }Tr9|3,U92g8|iVhu}æc/֖F>r3~н[mɍ˻àTV[ аOi'VY߇npM"~ۖ veWHx@wu1\4{B|&KihM'~g@+at _9cl:?w.v@Nbe34繐ۚ7-MmH[PmVBF=;NYr_5oQ-Gnz'ZgIA59%yF(Ba\'tVkX:.p"X<Cڡ> z/mUroF>C@Fy?[?O-mr&ZLݱǞDM5R*4rΆl⁽?w[ *$3Rޠz7p ZMQ|}krFn9Kxy% rK(vkRB" |k#uNYƐ8AGzHG kj̗AWq$j@2 ,^-{jO,Ҩkm M^@k]~̉8Q刿A?SLE=ZyEOygH.J&tןoU3S_~Ѹs2D떧/8FZ |/QH^#|u}'!#qsmi"^ideYy.h͑h* dU#7Ua V:R(ˑ%Zԝ'p "(X2(dTqOkAt&w_RYgrZ{@ng+&,6WpIG#3^ύ: Ӫ!%\^N a7*lUr|(VF5;u\y<X׵O>TE~Yx%h#&Ӈ>bKF1])WIz8b]tWZ{Ź%%~i@NIm |#jOY|r89S[mg;c) [dfo[ .r*.zfἑӍ[9:ѷÈ~9Ur|#صP<Տ+ kkF'YfFka#z8y{qk9|e$pSvev+YɏoP[J2Ky]*s7;,E \HG/ W\ yG\,[Ck+_VKZV}}- }NTeݚ$Vu.R`tL X)9/sIn?* 2Ǭ9xr4CKZ1Yˀ>eK}o3"*Ղ`|Y="=g8Ҍ5|糿}q8c\[mh)иn9( 3:-nL 3NI!NyNK'}&)4%kܝ1ݲ1 ,#<'Z0oYZTT5;~Q~o)thYlc`zYE\ 9cQ&ab*kae_n)~-{Z8Z~A4xJivZ|ckJn!jhN"akR"nj&гýi[Ԗ ZƬ&%ak۳6 ѥl>w(B ji{Na>ae bn5A*. Z!/MOjzf)!ְ̼6ZN7 S2v:,/ɉy03fC!n ٓ޼`r>C9ff-͙|\ #擊Wd){|(t  ni9M^,\]he&Tzx#+zqcy}k3m-߸lS&(5: j=[$#짽q༁%-z,}P`&,\bIN[FqPmwMlm{yŧ,3pcC١+7ݸNtG{[= ĺ$]jZ#|i#(毂k7Y/j3 s#uFBW9}5 O^GNWw~zףxR3z$s:tusf/с"@OfB 3%y-O\ em77}s!DnR+kL'͸ɇUأѐ+O8et`"'YmjA"{ 1UI/IPlL/1Cv#MC^)NhAq~>=Z ˉ<+g(kxV |\3|Nfy_N;p~" k9P 7A(g\ |Z(Гtʢoz!P&o[C>`fr_G? r*''UL<<t[[Gߔԛ!c)0N+u(kA` +o5^!@jA:U5-U)м8nF>f(, |IޱR>R9 S d\S&=qvf+1/ܡ 9C_#Q\csoc -x'}lnJ/54Є[݂>4osB|E;rbD}h>(vHk26@3dd@7>k6>Êa% 6 a@_URE+G0|4%O@;IʱkHK :k\~ Idv[-]NS/>G!d\˜Z)Z.j7p] ߬ƍ+q,6+mvV%b[ncmБ*|uE1 _RhEFi#,NJ?)ط%WdS97tsK~-[.gM˶3y}-z|ʾ.xT%Ag[\%%K>W|6r:<2q o+EZ=Z d'6t^]~y V̵-Bނ *t P=2`?ٓQlEx '?_qRw8q)pNE~_N&U~I"3tw]Y:G9$@F)e.؛ƧרٯA;uh JQsM1-6Y]'ľFTHOa}> ޝL5KD ij\4,cr.A?I;i%I~}&uیoBOGr"iJd2 -+s%rr%B'}A.i40{v`PjzcU_zb߻-:/ođ EC?1y)e 1*+^#@ph{CڝCVTqŠ|nܫ2}̾}\G2F-D{PIxb.;H[di`N,FY Zu``LUWF^l;aeNj]dlW٠m<ކ:UL?f߂3ICrFHBoBG0lvz b̿ۇFhQlA_Moz]A{u$z䩕N-N.Zd؍$ v3k_htjNt @i̟9!T>.|A2T,|fO3Sn[K'QwhML~Cw=)2n\Fe@|,/I^TFP)H)*VWf+Ґ'4F!س5p+5WYƗr][>:19Ϸ^V^uiFAa`"[M ]A%VޖD%h FBIz`ՠ$;YL8|~ }J*GV,e)ud51{gՁ{]pY=İJN@]Z>uW|$l/*_-1!]-Qk.jQSˀ>1_g5>+U`Y[=ް| ]1`okYUf>.Aa8NG.h|(fk95+AcBT]PD <;))rGbhb~_Bu|ƐN*c}!!xP)χj1V=w;?Wrƍt FC:fr5{;Ͳ~T2%£I_)"[g苙uS,4D?fTIv~hLd>u5N@>ڃhz]>VWhTcv_ȯe^.b\ϼ^^Cd Sͦ AId%_Cogi"J,Gz7d`U=~uIwYb/_&hj-bL6A忡߬*a➎=oi%r-?䔧g,'>m|CXnv ڠ˼-$Z{Sd~K]ǁxw%z6 sx9}qޣQB׈Աy}Gzgث}S%M A~ԧ mxE).XNjUoSG7f1z4 >4_5{\i;;m=qiܼ˸l1w{eD7T,wŬ=Ję]tg)t /WPطҀV9M nw-< `ϳ9Y1ENAM!dv͡q +TDHs"À|"q 7ct%c M2 mtƦ/ q~G{[ k} y/eҐIxKLQέ:fSyn 8\HYj?#2zԀȉdAy@e|R=+|>v&Ï%5FCƌ,8f/J˚ OɩGin<_q,u OYmlj>x\uY} fb[;gn&+'ˏp,9?KdBZFgJ@}đ(t,ܩ󟠽e(M5?P9BK *pz4:2)B3&rBCqB{3]F|v[xu*-[ ܆dXwwͲ5N7r %;{ %EqvJ zH}\屳ur9\eB̳T{FuivJDz5䷓J7G+#P |@N8y 4j||RKp. NsaUCVi[[\|QicƇYB_{e@YjЪgͲlnacOʱ+ta-yE_Ţ.eI@G6C.{7p[ )+$v h!x*Ò85Kf5\ڌo$V|Ds]L OCOl5x_' tO/נW@Ku~V8z_GݴoOa8} ޖ49-ShA_h+vdl°?O(뒋BW.kчKOե";Nx1FrY7tZwd -rBnh P|@;Jt8*y:OȊVEY9KAR=sqlbvJ]LTDٷ]kF9#dXEfuȨ ,roT&)o2OK#&xImrCxwRYXFK[ŞɍYĵ xhX2 .r.F*mH̸ q]%\I }o S>u<oOVU4ß OWW5۾/:\fR]Ͼ.[*ʵ63 \&]j ·[4ۇ+T9*txwm +rL4W:yPKR귋}yF7BfƉkC"ԙ|ѠZ}}t-Ts4@]L=SQW[=}%yeDdFI _󟐩7vCĺ$.p":O$Dկl!;K;O׵S~Vq[>@1V s-09rfްm kk}6'++#s#\N[MN%*ҰךŢ気ryoqWTw<\}nثA 5V ^Þb;T8 zR\SɫogPTl& qoR*t,\ z๡Wwyɯ& H,5z='&oJo} %  &%Z,7# F3 \qEFO >R[Dj›]z4k!iĀ^}˘(&+>|z:#T>K1 ׎zj+ݘܲ~a_n$YuhSh#(&lr8d9<(/Bvljԁ| ŬA |7/ᚼ+;t }K@|B1V8E8 4|%RvY0\ÿO-,yrWw &DZi޼5z7~#޲^3c1%d5yFb'~ dq&ozpZ܏B4=aW.ck$9jĴ&|dy^7Q|m{H^ν&QJ nSryt!\nx m7Ƚ8Q(Lۈ$k,!5 rx;K&':L%,$Xe6h@ѼRCEZegh߀}(v\ M?Mf~.i3t&Xk=E3B2[r>?8<YW^@L.)#$ ež;˩t+99mJy#|<h+k\;y/_[$qiHZ7İ$u_߸ےI_GDXy k=Z {q弑b M RtK\*TJ\:Yy_A#N|P>RsQh35Z,|@ Ph#myrйmx[{+BЯgUW,/?d pEա{^ wx>8GG+-KjKs3DO\C7n֞63\V}|m}q&/a]RFm6 M 8Z«%:23!+?od ɩ02bG!"UVozOR߁g>8L)+||_Ɋ(Poܻ% J"hQfX~zD%_:eɆ܈k8]=a 96gRħ }D2lujw4Ng Ss8a} 5 εDyVp~qR+Fc)l6Y4/:z v3%f#,ٌ-Vj L)vGK{XTK05^^b|W'Ȳكf nJs|d+[:2KXU7,uWyKj`3AgB~}d\+!pY˪F/Ż73NAv%t5ciQpx%Zz.i+-G+5> $5kn4c[he҆ҽo 3־Jtrϥnؿ{MɁ\"bR:GNzG rl |핲EՅds5IѰx聾p2;y\H Lk75͚N9(cSlIȨ&d~l+AtAQFJ,udkB$*~=7fY@A Fwl]0ow~ Mć@gzyoCfRKy:݋5?Q/b̜]^3Nr(O` |,R x#FB'tO<5{sҜb:n.V'C?Byp~IVQr^V:97rYڠm7:x J$G%9@|m5;,Ѝ~zuH,<RU- G??ӁG#o.Q}/>гq/E"#/!5y hՉ^t`xm'gD\eQ߰ۜKΦ2rCr$N $*J cʵZ=P/|>7dоr ڨzzyJ6hr5~oѫp S n3(BrN *FAeVn^}Swﳕ{#4 K(CD)㰹Fgޒr(z f i~N2䪂k<6eQThrUyB1-ȹ7r6 -–R%1I͠CK)6yoȃ WBx;K^"K-"YIry#=jRߏFrqm>~b׈2h[!u k )73/YzT{ -(4%K2ȧsB\FySƖ1W jQġ'Z[L.E亘o:fdy8 q&,k7V/'Ÿ LJ|&.s^7ɽ`w) P@69|@KgВcyeai\}ʑ%SReYx4qm#bѻokqUyK`t&v"IPHk`QA(#ndEgeaei@ o  ]ZbuqU^w!j^"qe:;BsR7W}}3ɀnj_qGRYRm~зVc;gFA7%1ōjZrQ ϵGW!ܽ`ynt@#\)O;]>:Ԋ >yFA/TV _z[yM}~+O0El |MG\B볛҉;IВI{ZGzP@!gl}yZ;I|;f' Pl榿MYjht`uQJ ݩ7?1Z[83=])dntlOtqWptt1p| g2SNf|LN62avНH}cu|#o}-*M?*_4J(BSԴo<\"h5Z&<. +j$y.av0r[&JC%+C-=?TI;Wx 'm掷+$K=ښW}Qk_oOL|V,y v4ޮ70nSˇhݤG{Q5ޅ ɾ:$Iu-}R@cLX=wE_)Z ?@>b CЗuI'CrDk}Slt]vz:YU䴜FA! !*rK Ϊ?/ML1!zj-4^+Sl <+iKT;8UY>e); CN& 3=v7{i]CВnҺABy{n?g#%*Y>< evه04وaボ"i A7*'tmDƶ| 2 br\ zZ%1WǦ0 $L눋}]g.7z^5amWcK[zSՇtړ5%oGotvFNaHvh"_̱pdR*XZ&O;=>^թĄB^zI롽Ciά%ztA(_]Š}u,ԞK1ҐS' ֊ ^fw䛗"C[MO?"b Ðz>%v(8Zq=F1`3! hgotI ;ٽT PErW#T8^5. ^RoE>ۀ% +x6d K*D fMqJe|^gx3J?Ph 6{'](0{(UOy@{: { `#xRYNH\zLNC V2s;,TzO}͞l|UVfIA)GyD=}.N+!x`נر՗+Eiwkg 9j?ݰ&벭)tϲCNQ]"5tG4/`O"Kfnmq +q iO((q9F3A|zKU=u.Ӱt|$#w| Fco.Kb2~y2 C{d$,d9VzbNO1~T}xR[DNBYuaU;HNe0?U > {47{darY@%2eR5>T aƉ|VLyٖ@Βd>Q(, uEԕb/m+UvNKݑз VՁUEBϹ Г,8ؓMgzď4cM GtM5X]Ms־,3HPwfItʭ" Q$Z,#niRnPd"[ۭ=65:{S>5}utElV Zr"&FT{ݑ}[J`w~oA44lnv6d1L ,7.t*D6W~E _* O0f #)j0.&jʼhB<!}Ev@o&W7z.7Z4l`E6Rc II@6eReTnK@GK sqzT@"'Aρ+$^-_bC!&_wA}WZje52oW 8$}=4-i9^?eHzoYbWz1kz>K}}ۥ,U"}MA%Cj%*bs&7)X'K^,AmU,9o.!\ނgb+Ez߬I6 } afeN|$5|y*f_ss I+bg&]6ykri':K=|Lzs}E{9*p7yuJLC+Z*5{o''$Ξ/>ys|OKV*O#24 ȶ12ƠFnkAzisBCz"[O4祅k}#Tȳ{ S\(&~~B)`fS^GϏ\ 7ʵ翁;hkw<`ݖ[/eL%R.oFWMO7s|%;sboludThŒMSF|Eez/cB?8;=ꂦŝ|qr(BW_"񄎇;E11lW,ل \Xyy`g+Dn_7m#.j>bJ!43k݋*N-ar-+ .fn/ܻU+cao2!?D e@㉖#[B`7* z㮋īZLS"; Fe" {9qh:V{GPQ۷3Ii\d٪]9zXt<[ܜedCeb?c0)>]F[w#|lZuB~X. xl\-/-U;*>Ng^i ϨR"$7(]#o^c3|CtA^oL][`6ic7kThj*Y&.~/8'tek|K:8Yn7$ ;L/-~|%V:Ec[uz9A3DgKh:Fˊ"- p56p]E;P*>p~Kh&Ԛ]rv"_;լ?xA<:,w+Y3ENog&oW!:y+QxJu1w_ENט΄9 p7v4=7M5-hy&3qilrzt:=㉍|􍰓2:Вzw\Vmv(|+Ғ@kPϲAy"π8+FNk*C#=lΑDqy3rT*!$}DgIB/>9 L[2rVda)W5h*S>M2/qw>>O1s[M&~P |A֑-[ |D@KZ&@+nZuuR>՜|ƶvY yW;ڧtnq.j%2I2);/%BK d_&qsB&ݢ`v m[&Rj (imf1CQrܦ\eD'6#5͖},IBsYn\?z(z]絥Ayh5VrVh>CDHQC:N+E 7K{a/F^K UZ4l)tV޸w jrr_#\\t8$ʏs#wȴF^\!L"6isOǣ+ = d (Xh%WAgXe16 f܆ 3wh6ÏxMb.kur||~ zꓡVȘcTۚb?CEMNISrN.yjm-Z5Z?}%yV+A38_ٺi[$˥SD*!3f0R֝c<^-'ޭDKhu:'SoDkUiMt`_6] 9&]aQpJoThד-V 9Ol' 5dp# >za,OM-ڡ8OX_MN"ȹPt<ͅp77MSTp g44o੤:Ku5(w~zƢ31tovQЛNTzkl;F*rj{K{=oi&.jh"x <|^I#t @nI@NT,+@>ƣ?tnM \Scdb3*ְ#؋!VxB_ Y.?Zw^̭SNWIP TV~ر3r߄qj-DX|#$N[eNl.Y f)h7r_l\NCRޣ hwy'ijdѬ-č|"VRyiEt;$X6~kxSl 4(e~l>A vxP> v7N+$ ⌈Յ lv}Eoc@\aYJC5k E1l/z gJ cbN y Et(y=C_f7zY {Ӏ>Y)kDй-KyWð('[|"W[ |_O]yv''/X> ,+ ֭jz#D Ї=i&COK^bt} #B`F+[@UN܅V9ܨk?|CՠUǹ A6 =oFMN%MSq~!&pVp (}IeWl+%2;sr;Eq$˹FVEzQ%,Ar hiO/xl%XO7|i.lP,ܤ'W|8pj`wBQB.{OAQ߮BWĂbw (*K$**yLTـjW7N >N3 gKמ]lE۪T_εZ3Ps,%Dt>5`/dsy ΂}ͤo]&h&+Aey_bDߒ.>f+,WH5'pMNe-N.q[Ɇ|V"b1gM0}o:C~t:OıRJEMZ8nT5m#d;빁o$F%%H'CzN1Wp#竍xֳyJL7V%#c@B m2ǒ} hRk~,Q \]Ќޯ=\\x#5xKA6ִ_|H thyI<.2) }I+jĔE/yGO=\lnFSY$CzFޖ\^.^3:QՆMF 8NJ+@fa'rN]lE5*v n ]7_o=<'  wp-SOFoəoqqS ߕsmk"WgG ^xazXZD>rNeO,. O;Mu(!͓Ç{Ph81יB>!eShF r؜(.ͩ GY:;ľcE3&JAF~=6gC3iQ3&B yvm!MsE~~LzLʺjLOb־lNAe׽7lsq[Z yAбnh7"ʍ7+Ѡ7=-/3F|'&C/([ r2 ݎSW ̙3'ƭ|]0jř 5 -ZDjC+E& G&ǣ2z[ȉbEiBnT3gb1m Q߸> \k bY3TblG+l YJP=`1EβC-ol 5<)4kk}σۙxOew>pTg OSl!XF[@u D}e=i[NZ u3%uȳthK_=,Хgo5hWMWNL[DCĥsN \vZ="%y#wָ`1dVJA{΀ޠ?O>Bbd+aL}zBeo.Vv Bd R:CgbYykzݸN W =o}(@Hs5v\w"_-%De&Flݥl =$ g-Lf 8j{B}̈́e`wCA,ruV#fȇ#o3cB}U6S7p[j'^0\OclCGDul-:]gqYQt\M]yNktXV䎳*NU rs=+۟KCn8C.H'%NUW7nݗ65:JG_/؏~yߓ}kq A&o- V5{<9\z<!8O֞jܯyj o'9s[ 'uS'ܐkwKur92?+#h]{E؊%Ut$[O ˖Qy$.qJH*߸-\e~!7O>=7c8J4y{C99tщb^D -_V,D͉"9tX*tb nWղGFރV/v`k>u~ ]I\6sֵk[dIŦ/ՙ|Sn=[4zC JXid^ϐ0.͏whv'Qϧ_ CTdIo,uy$ڞOxT%~Ɗ psjD `-jAv^ԏ:"΀幬U,|@Z}I \>ùH] h5*}t*4#uxҁ޷qk(~UKCnVx3xef,{w\$'c+ؽF.¥s23C@WH Ek|cjDΡ b|xR@sQvGSem8uVc:g+b39$i~!Lҋz4r_zb@b\MN%ϟFfN`lExb+oD=}0z JM?`k?`S8ߝV+2] 9g"z woV b3*[ |8ϯylk0eQ2Cߺ|o%N/6OFNeeՏVmn1ٿYuI2Zm"L?*o-24se'Ê7bVf엲c3 wn'[,-j@]9&T>ٹr[j.LgY)0ka\Co<60u!J( 5~jU"ʂK=C'c[SdAOirS8) 6q|?; x OOP}7r^Z@̝z2TN]zU59~6+KnEK"m }+ %Aa}}X^sy+%4ykg!qDZ)b z ]AX-\z=Q3@/gwh !AaԠmz>>{o\H7 |DÙt3e.}%42o-{?僾Q RxŔ|C6EZJЪO\o]UfaDSh{'=ϗ>.m*udgqZ7YP5AN g*OQ.io+qШr_i ("')i͗QFG}>t>`3lq,]#EnW 䄞wWK`u%\Z`ŗ h:b6՛gyK39rB|;:Czz'%pT ]c3bV0bi=*Ԉ×.qRҡDu`~g+\U-ȷ@S{˶ƀ'5;b4 U$4U`@w, #ZxDw[L\AyB''> 7x8WG2:!(#ܽmhLz`ىwU_U^}uK.д>f{klO2 tVg47e̎?O80oD }2¼GtUY|ƉR4[Ɠdz!0&e,&hF|C j3}T3CӣeѼZM%hd>seצ 9Stwξ |S^uqϠ@W׽ݳ$QCs/ء=I y*4bLkhY'>e%r*R=fĚjܑ=GaZ9k4}`@NeuBS2*qn=[O/w&[`pJu1F~-8ԐTr}Q36Śr=S.B7tm+kn}I䇉3gwC: X'zh(M .rB1)+>.SWQûi?.qg<2wk }uͱ7]wjPvbw+[$!9P5VCWx@׋bs~C=D2P *hmۄ;֚Roaޠž3堵^C١qG(vfxF]Bdf4wX]ccdHx}E`GH*q; ]0j9[l3@wk(ΊI:f3S=qBW8@wl^s{`(@K=k,>%GdZ[@.rT'GX6r,S7ܰW B{ȿρTosv 9*c5nG;O$5 Cޕiby7;5hV?g7hDždqLmzecQJxoQd*>nF֯t\u@9ؓNfح|}s@s'Ux Ǟ ]ũq17 t zɍ6UF6dͤ $G a,ݶB+Y$O=j~ޖ"WCf`@>z]-wC0_x"Q#4<5\L-iԕ'<وUC[A%Z [ܝLc3zh.f9ţi.D^++TK ϐk6,6@6`D>hC Lyͻ5uskFP+pH@+!7.F)/ EEVڄL]P#ЫV(i^͇Pz#ץE6-ډ3thQg9pktB4z.]sns^_hE^c35>7r$FZ ͪΆl&ґ&肭Ӓ?k^aOExgl*zzܻbTL$]L{9Q;r0׼QFwls"ˠro_Dz8-r4Cs :rf.Ҡyo.i>l osa:M gϝ$p-N䍼^#Ori\yGN~;JXQ޿-}5"rΜ\UZBgcYkD ܯz'c y?^𕶜 Y )0rSȻFwuP\E=Z|ʏ𓤛S=B'WC.Ns|seM"-UۺRv;m ]iEkOҎ!Xm"\D灙r'7V4nou_`;4*9bttҒYb7$yխĤ.%%V[q."mٺo/| 9/eRߡ:?Dx:&!|wUJPB4,S.. qWar `›e2cFŞS>~ RN}`^c Z̄kD>KR/1}L'lLrik~jJ}me9"p%μG v|2cɂ)0;uX 459_ˊU3>oMХ wpޤNZN-r ux6svVhg:? .N[f'4sbW@ȭ!}Qj;/2wJ3+r|$OcKT4CGcKbnM.k<}ƘYp:Kpn%=kdM*R5B;#.C5~ Nx0s]2?oe% M3&EGA^#Lի}*)A5H74KՠY(Rz袣E}ǚ+a-z @: #wY˕ }.$(rn' 7 *'">Z^U7E83{Fd`DIi *r]@{ ,Qgn'^I@-y2g^Fvr=[\ P+kRНқ)6ͅ ^8;Ն 쁽:.zbHξ6f8Z^=̓;tC3 xՀ:} ;0bw ]XLnj o"-x5{j1 ^{ul#you4h rwمy@UX^ZS)C)Q5z[SWٻw*ׯW)KZ"<:8IEQy63{ pNC+i$3+ {b/|Sھk?WkЫXV̢+4+ڠg3#kt۳_e`KiɾΞO5'>3c{YS뎜A:=%7%nB}- l:a-СrX]TwJATC$/O_PfDu÷lm<>bkmڤk]Gtv>~b4dq=IL1e@pq[xZƉ}+"%؅*ǛBSTe54lWzR= 픋j$[j?kLf{U^F6- {=3PT0JB/g1#d&{iLhEʵK&fK_>7ZP|x&'I#I 2q/7oEZ{] yA`KP't2-7hA6j*v]KMB2*0grHVRݒ 6N=4P[z[ '֡'_fQ0q>c}oT^y=~-H B<F?;ɿj{X_.+M9yb`|=AV%ZH0BeG,TZFd.Rb鲺w}k\ ] 'Clt^jyq =8#;JFT@koٺ,6# In>A]-ċ+wk( =`b ]DFAѷցn4>_;q%;w T[֠2v@R؝ y^:0j-u <+X҉a\KW=k$b| zLt[' Jݰv~]d\io̞{>7:Kp?w'CqL3͏=ш;J~xk{{ٺvނD۷[CK3g'뼗2 }Cs/+Occק$.Bq@^'thqyߗng 8_=< bV2b3\$7r 9l@27po+%.ޱPj-m̴֡5A<شDw;B!9ܒ%Ju@"joi. oKɤ|Ew[ \ּ|;͔\0]n+lX؜xQQpȨ"|V+W:Y|VoI'.xRwb^Kx307^ A>ځsbc!z;t`1o-}?`&uI9CR ǙivO^x[B 6C2}庇- x RA>nv}7d>s&.%qne o9-nDE 8YMHAl/5vfѰ9kGRZ-{y>=  ~:yϷg>oa786U/f9IG`dX}^Heo#$r=K|4r`!9G;.?.=[+BN|Wm\e7n!|X|Vd aq a3*$aݺY7ty'so)aӨFk] 7j^K;eѡbY_NyYhDo'7ۭF>F}@k|#saR9m}w4 ܠ3X5 FQSHch7/:ȉ&/it/ty}KI:m$-yC)Zhh6lYU7t͠NХ9Cusܼ m6/Ӝl䳞j V ܢտ@wBvI>@mm-rqޖ'6~Ze$5Jsϖ̊")r[}DB.B! B/ޮjh2`Q[Y8Ln9|9-vEcw7)qk>S"W7=s"\kowzv-d3//T:/'ͮ%6;}2e%#6rGsB.T dĝ>o)TԡhxN{]߭8OR(%"UC"'V={]-~`go zPQ0(. ʭB3W~¿>MTFG~J {zA)~_i2N$8]ދ?Y|Oe^su+'<ivb #Aυ{d>]<7tcw[;0DE*#-) G-Zx`(;5(vbvЌ$=_i FNz". #)PK:c82Y!C[\oh\=cmaNt=iCG:j'B4 }ucbM&`-wy+ n@eAi9xF {絭]q% Ctaot$s%a5"6}[rcfуV{coQ,w /=wg:D sEJYz@o8tA;jGtBݗY^D >#lnzU NIнo:2viĞ\ܲUA[=su_tpukȡf&z rC/ f[ =%bOpC;g{1k`lؽ<A^iV;SkU+ۓv6@x`z0tYj-7Z6O-ڼ"dnxۑ̨Uc:t:0cuji&زIM'G^1]hf0͠)鞁͚Yj؝fqkrW ,]5L!;kܚa#g2Vd-t]U-}_op}Nh5i[nb M#רhEhqnnas7 >Q]2?牏ѳng m;;/IZ VAi#}:z)q -&ݧ;_6w$K'l Cu{nkj1;ETW<@NZ^\%/S%&M5m3s/[4cb zw4cSVUIziPq'GdG>|N9n1g)8ͮi:&!S );iݮ*=:U#j#Wނԫ0Ii̞{D#Ie{`' 5xZ=0w_aЂpwPLCFfncR>$Y=zBC[1@;L9UJ°%)Ho_!RW.3zSC{QZxܡ%w^F-9GC}:/f+"[*O 1m|<%-N~k O)|4r+?a8+pIM z672U17<$1]pݞO6+5 , ŭ,'|OO["Bny"V45 p-{`,~'=i;O$EҨAyi׫ړ*ՠWxʍϤt7R071znj~xlmNCS{M3+$L7/@n,6oDnr8bGH]b }mulzfD#d x |7B3&ɰ!Mu<zH߰)y.}N{xwel=gWښ-۠%Np}ꇯ+3w΁"}`6k?:/Y6o) ݷ EvfB&'m>>\O伎JS&,8%=|;4QHZȒq4o'z՘qSYy66ُhmlH?жZ(5p-%z#Rtߞ\#qs'U䑖7 U[MMklmI$*V3$~)\hrAfN9Cueh$+ƾʜ,Qq Y'l=h)15B6lJ6eØr#^2%AnFNoǬ>[/)Ydz ,s[}7_lE,T{W[ ܕ^eZԦncMU搶eRElL 9 *o-ff$g8:v[kβ*!%C?.!ЮBj|@ŝPO7)Vr~FXYˊ,Xh|q }K* SţBȭ~?9,rAO?]^~[*!ʝٺ+DHnCoD`AF]4@,nإKDh_ O\H&oHVvr rorIЁˬ=:t4OS}' } >nN+Ze4zA :\Zckomm%/ *pxF&Н!U9;.r;,Nz/?j+RMN3\&ph,6_#x{f|In&o-^YK0<8Y"~=qHUyIKټOV9%,k#=!3u/ޗ󨅀6>%}@+ӫ0k4/;cq-dfɕ1_ǒ-C$Zb_|z yy&Z2P9+e= l&*C a93<%A?j y8"'+ o r쓪p~*A_Ͼ/z"vRB"oU^b.s"r"7?zTZS Tܔ;qډN.Bޣ1JsٰC9H]yVV'oݼpo}t.Qf)ХQ6WnVH[t[ZwFp_Y4whx2Q\}5e!K|lވC}E2CD珝VސcT&Ubo懩wje=-$`ܰϱ & +, K! 7}YM~  |?bJo#& 2l KݔL ҠwW^Yo->UtOPϻK}Ox/*y0C[CNomW$j!B-gfsY#tZ<+OÎ+Ɵ4sAhi<\$-Wϓpgi:9+*yh=4s,3-Cב7U>ka "@jxObirPa_M`$̨}xz0p(>s tk^{!O݉:/OtJȭ4IBJ6x['ʍEt?8zCer~Tq;A?DO1X,W$PtCO!V N+/k9F7r YQ`_U“נ4ύиRNggzKMgѵ.<:tC3ll qoYDH$狃.npm9.*\ڔ tD,oj\l*Jfe/P(a[7p[8t(DU|=r'EOɥgY~BNNH BޮߧMcLACNa&&E.ʇ)ft<䧲[ zzא /=vp䵷3NP͝ $ Zjfs GB!7 }Kxkuit&:\}Cs:IQ+ԱBAoЂ3&ΜjޖܾUANpj+!+7}Y A[:rH7r ]$c~#S[ߓ)Ŗ[BSfco7r+-guVz 8*lnoy:ߒN**gCW8:-`f]I-[PE1}ߏ뎫cc%Ewx6'mvA/K5=tIw]|RwCDIu~ ܲZ ZFg D>bLm Lk'ҋn`$٢pA[%i#oU'9ۅ.,8;H>stg)ZJ>qor&{ouu0觟s;nyŌe:tH._gEX%vKʶI|%ryu&+/?cjra*E7|!Wx <~2LZW*If =T> j/_ -;vc6|X;)(ZbЉyrge)l#mDz]?}J'h^lAט4 ?bC'Wj '3!aSަek0Klqۑw*i`+*?9'--0v%bgE5]n N%KaclڈDԚ f? jSwyO6n jim>QB@H% "'puy I^ 8ɹhKgk.h-)vˣػKK'5ೊVB|G% r_{o@ G+RJ ]vz z̈́e@K&bޮ&ЃZ;)@[SO]87&9RCoUܤTw/!,ˠI f^DzeiFg9=[kKL+y@w7q/TG!T<#@*9鸐bS6'doFAW5ąprFB3aג* |Q"'ߦ9և){q QT$67 ɋV35MT&p|$m'r UtSxvYrilqJYQbKj3Vվl׉c~wJN^yיSrV}u2b#V[$}fGch*_)7@4jΡA9.t V`Ik[H9Ӕ$-|YQ)tuxLj؂ \7/MWgr2S.#2}yr~#z; ܽ+=q3XZ|6ťXzJ.=wk5WK,֧}qSޔ: )i ep?cVqZ"rE\D.FD9\+9>$)Y%< ډ>=y E>fo2f!"D$]vl"DoȼnÝc]▪b9"9wϡS3%V{m*"3!vJR+|V؎-rryԷ=ۢ|g8193sg{oo?AȮ2h@iZqU96;,I./4m̠W(Nc { ^-Ѕb^v\}Gv뒷 tvdRK?o6@vB8>/W6NA'xbe&yϬ|:v) GfX 4'dZgNЏ%gUE7wu,O.dyX 6ԵmG;,vP߻+$T <;_ϲݶ 9"$;., ^+Y#\ n]#הE:J@]G ڽvQR#==9l#2rf*-ʱB- |,H $kg^KLZh<,mJC׬|Gf&8N晬Th.,bmrԠ!'朸1txɍ | 4b0W]T_yqO[q;rEx?N@N!C]fЦcmvVDlSl-F:qrO4_׵bJa9o=|o[+jZDA]jFKJ(g6Ba>*}Tr3DZVkà.tO. B_1P!kQ}BKǤWl[6ڑ|!pi򙔧k!.KhV#cC#ӕ aV_NF>?֟/֑kŞMj"j$yb RͻOmqԅpyXp t6x W{Z-F`qeV9,5˂L#oueIJ'?iENYHGʗ-u5~ -ஷnЖpTԠf*H2w9sf^Ą\dзr\k :+#g zϖsPך  .{qUs%@]kc +V﷚ZmCœ-J׷@bw# zڠ&^]$m2a)\|n{Jbl8Kdćr3%8:ׇ[kJM$W1cUڐu+_3=1DfD|cOxz 5EyE~Iu!fR{}@c籧H^ls)5WWS/1!9pP|^2HMQ ].Iir Ypn9^: S_DKi"ث.Ix#dIcɵrFd*x-2̭z%17#2}hS뿧)cؑ054D}nrᾷ{2|]e}u 'fyi9SEޖf7t !m]gu ߪF_bJ7thڬ &*?7վt^MY2vl}^u%y1Qي`v\ C'jVQ^E+d(JymF%G3'\6Þ߃*v\ ]j%7ƞs>m1N [ʣ%yt|#O|P pIjlwCejB d' M/v៘!*PhO p̺#117 M(1Uu PXe~} _}|`s7M)gg㋽, Ы~FC}o^M!X3jtV!nBrzY?L<^ГQe ]b@zr[8uN'flJnaKƾb%Vh i/w}Ofw#"Cڮ8vh `*R}0z4[&[F?:ˀ~T}ʡQ:R [hۿ+7$suPNJZb%C 6-qCjǦ) ZWaýe"g0 {;Rs~ga}.7Xni:MH?uC =Э"'aT=pĐq^):(.&=JƌlQ>rWB2v|}47+Q.BB_3~>j 3N<>L, }|'?HV-fL=NfɼڸLQf&b}IAiz(?`Zşs==X]EE9@ߔҸj?->^1BtyZd((8u5\ǟSG4ԑ?_;ohQB7FKkP^1v]N}c/"?6~"f7&ȟc6XK?.J6 kA^]tyoq z}$ot^TZim}[a>v֟X`l)aogЀTsq@ 7h}v> 9]t][o{$+bߙ 4K$E?STy.2N|3ЭGL^?J%Io N&ɯ~C`k̛ݠu7@m.k9 ~i$@K77+G&;{/CF>FV%EgFBW'|7D2۷'鴽ެОD0[NЄ0*|C :R]r>c/,f4u-pFgBrqt*C kOÇAk+֒q9u6GA:ģd3ne|cIe>v-?K{14Nl1R2AW;c :^C2{xBwl}iKqvsݼ3΁}]2V7YlK/ }iTl^5#+4 #d3s_sERDSaVwL-f"~n1$[/_9mЭpޅ#e|ԇzYN9mBoŦR 6nSy;F;۸zꕰ>sd#7]{ =vC*H>4' |P?% =[%Y='r '7nBo#+|c&ƞW۾zq깓NqAKF i!yM] ZTg">A0nFOG!רFLr r[$ Mbg[I_'KE{꾄ѰS2<)WhAjtA1Rr H2;o%3n…7hOмA/k crku_#:$7d3]c\8l!}CUA_1F.Q$7Jcx?ӂiS/5fӪBKu':SLq>KIZS?>M^-|/ѠB$̬7gF4b5 zxzjlF蛢 }d􀞫ڱmOS!.cb'bkZCWK'윏RQV״;nĐfy} EK ?=e*A{ ~F󿇅N3:U3g>d:3H{XLDJ7x!˰@oRn|e|ٝ%)Lzq͛yW$i87ho=u[͡Ћ3\ozgR{%WW -XO_6ENKشWh?^_#:\e`oMb`_$t G~*8? </SH=n3T͎ɋ /c#Uqrg=YmTliTyBBcD"dF3y&b : &Эy]W;A9ufsS8z!ti>Zg4ڍ}>̔@':%GAs~"/GB.QU~N}17{д+b"{~J)I͢p#snAs9 h~wBߒfMgm-7y=i>SGn}DZ.B_s~؅p,th˃ :]#]2g }9O'cEf.q^2:GD}-]ckގN##HBiy)8>.rRkq&c =~ZJnU~}i>瞻6}yָ5=T~Xs_{l-w 9!CAq6ߊIZZ~}*X֩n$+ }$s+\ ]uq$[G]…,RLnO;FޏOX{Ґ1K5n2`55m.[tϒÍ݁Rz F^֦Ncϖ̄?j'Y׿[}AgaT3o K鋝C\w6-v^RzDX<ۚUdukN$|*F^˞=}:e@(%*j[ Cvt Y5,zNYf8g]QJlı3r;MyňAd(^ֽ?m&YG~7>9],W OX./0Z@Mj 3ԫ1f tzz 4Uيio]z/3z50JSpӑDЄe-Q=CKlJUIrtU1go)o.I>J''KJv%<@o+zKDhZZ#-jGn׸Ô~KIcv2>muyBo+XOϙWWJVDZ(.2 W4N6,?fl=eX>e3 ޗw-R3Rά \`&}wI$T;XҞp™Kΐy5AOEUW6 zWܗ9y'#7jLm4#`$}Z2t,β\FmDOsϚ ! wK_zMA~*AmBKYk^Oٹ+~HVPى94-t*cK?zvVVw#oK_yst\fZŭIDteZA[.wjIwO*tJg%)FTܤMk]S7| U8 wh|ĢjO0{;EYͬFy+y<%~xϪv<*P~6ͫzdĽdF!5?Nl~Q C/UPĜJ[VrfxLп&U^lǒnM!/T ۋ(Zm|ow 8XZNj0FWF?_=DlΥfkE"K$4%-Ϊ<2rHn}EM ҳ)hw͋}%8- V猐PڡAdt7g[1d)fvБG#c|떯[/Rr"O))عm_Ը;vr^ʉ0>웣G.O5Ϛy]슕k{7n TOſ`T|pBk[&^^NO|'aFYP"N&0 -GZQGNYh)>J|YrJN^=#;c] 춺^*0PM<:KL#Zr*4p>ǂt4?Smk!?$JjFj3n m3zB˓m}ܱNM2j=AEzvo"roՐ}NB⓱%-7?sB{AȔ^&jQ0umo].ؼy#fq%T{,kdk#52YS2L(!zE }bu="lrvv"M ]gR=ey-uRf߆J eh벦,6ҿ!7|azFJ ˼eIOk 6CFWvhC.⨴#v™󜕿@+Q܂Ώ CG&eJtՠC¶װ=VH ĉ3V6h&,ԠfיJ8 t\g#֐qy'ͶbT;ZrqeymW<+HbG\אBckK-,V=3.{>"I`ahYyZt1\rz,9)O"K#|?Dzm$|_}dQ/p5EVKBn )㊕̳\ьqVF rYqkm_&̳Ri8vQ,qqtBf8>ִv^/$TdJbs\ʦ؄~>qo#Ybw]׈֐䵎 mIP>r d9nWoJmmA&7jFכ>rr(=;dl$j 7^}_?ʪ`o<'{ Id\,kY[>m\ҷZygSA% 1[D{(6pUV+@$Mķ%tW 9jW4X^iJYڠoڸ*>a-W7e [Ԯ# ӗg'u#+N;p%[] ^Ŗ\C^2 %Lۍc n}P|jD=à3 N[}Ar/)[U#! !=-9ʃ:ht+3a)Tb_"Oσ%q[_( Nmy9 :{ӆD*rYz;W|I{H_mi<IyqWUDO6=h;o }LMJM@Tkni繑Pph62bNDy/ % %N|,'Gl+i'p7Kޯ})$ˣrKyǬyzTA]ǺZ?]Jq\Vζ.OE3Br#غ7 \| -D"DNRfC#􇼄 urzhZ핍b| gWg% ?>{BO[7𶴨'"糵xgނN-:垖3tq8[DK䥟8n=_ Q+t!T Gj!W#Y},'pu S87OI23wpDPR'rueAuϑ/OB 7Iw\A۪rVXib\*:̓p}@ 2o† \,C h5j|'l+V/#${Uc8ӌtIY ޼[e_{L;}-XZq^eL/k𹀷GrLUX>X2v%gh^Tr$eF4S@:kalʆΏ$Gy9ө؞$;0 4"CL!CoW3-lF^C?ѡ mWygݍQOcn:wƶ mRyySSh#!܍: C+jBhk P!nY~q20܃Si^+nY׾$Ѱ_3ۨV#tmpOV끼>)dߊr"6L;v%kR |7TiB?At*m=Tl$kB U^jmُw5ǩyGl6|x=`3>)vV"% {L|ݡR#TY ܞt>R *'f+: ({|̸>]O*R~= sVxMg~3ι,kB~ꅛd8 y.;p͏f8ZBlU{X&T"/WR?% ؖlS^(&qFZZL1ha" |;NVy٩bWwvR ZLƉJh#N(raw!cA6 S*OBIFfј$ z}kh#zRuM-WOЊ:̩^B͛6#s)cog.q< ,a!S>~u}G\Z=*+6y#_D]$(\7NNFBPHJ Y~Y!n{6NћN|$0nbm\‚>ұ4KtZ "3D*2@-J ЇrEf^ud=Lyt%@aX,~ }x }f3qߌY9/^ӊ-Rvi÷I3'gصoŭjؽ>w7?rk4zc% BN$o?S7آy^ 8ȯ6O-;]\->)nD@3(w9x{s J b}jt[&'~*>alIߗr< f6Q͋E:7b+*CǍX4ZЯY|ꡌ\8UIO \ɐ;K |SYէ*tzK^B~h93U>hk^Q%萴OJSh,)Ɖ(new;]hTP[6-or#3Q-(N)vuX{$bK goծ֊탨|!yn u.rACЗ&,+ÜF@!G[Y&ɑ(BkfO4_,Q.yo[<+r̶~ ]6?,!Vꉜxy`Yވ3oA췁Y'(,7p] "ti0+ZlI@#!+As/I7!0Rj>E.4N}ΛAٷ'=<-8m֛ޖeYEsV^Xj-5 j'NFiͧZ]߾]Çj^,^+4 ى[BZkPS9N\iZ̄ljЎ"7Apqs;+rZ:_yjсbJzOcT |dwb:}Vg(7gIc?CH~Oq-' .Qim+7p 2)9D,*"WuѬu*68(%/6 2 |>>MIH>SbZbW95^Qțx)c>rn=uc`X{Y\^S^ VRS<#zB,GA$WԥS{wZ.6L͚G(^Asʸȅъz W@V~'#ۥ3-?h;y"BwGtP$۽kY|^{-WhՕ~/>b _<ߔAH9t Y!?CZ}y7BŅ־[q7q|PN_3˞6{yuA6hCOnga?h;GML-ENHCpgws@!㐡`9*yнQ .otk[l*H<-D\[9k ݔB|I #V^f1v(7>p8EV1Y섏qrYF+ ܠNrB>'Mn1ڐkŭ1ޟu7>׸αJA }KΚ7+A|@i-FȲvry4]Ƕ? D[99tgHUERD"$Ţ-w*I].FܠHNC 6-^SBnmMt<0$ t۹ӰgB'Sۤ=3EFN\Y#6puEp bJ|&1ȭ5m[pR]]gŠy%;3/1-6)*й֪ⶃfԂMdYiSx+vGDיSso㲢XLs_M :C$~q&WKsŇ/-A[8!~u(+DdokYޞD7:ĭ[_-BlLo '#o ܂#$ܮ#Ej,ȋe5JcRVBN%wJH  >"Ub J$lzɿ{ z?|thwO9}iu*6r''bwX)ztv+),JSVg$їSS1"g:L4FV+2ʍE ڈ)/s{;#Ezf<~GJ7jj8L1-ulmU:ֵ9(5[KD71rf 'vC?d?g^${+N9~0E|p]7~ߝfKq.#$|퀃<^g%ɫ M!k𹐧<']W]G7 햘p *Hq{oXak7g<'wSLV$Qo#y ho˘DAޠZby_A+uXZSE=jl؎e~環9!^԰_~%fljf|6s"AΣ o o}UB ۉY>bd|?_8 ug`+5S~ZCw@^׌ }RB#A~:t.ZIfjؖhf~A;2)5p#g\pGgHO-{q]~R,y7aQMi~UfmN0rz$[ 9qзz"Xq;ahrY@'"v"P]. $ϡG 4 D:Yb Ⱦ>7W;qĤUeXDT%f3#> \o>G{ 6AfK6?[T䋅뉛HNG??J,9bW՝ڣD jMم|Z á _@ZTBdK;ݦcsl;he5?-ro'Z$sS3 gn @˚iE(*y*⾱'nk,yRnȹ <}<e*m8c K"NOt$IK;sӞBOÅLl[:uw'p]Smjcw*, ]P)~Ssdh3;n'=-(-kV"5OR'cNGkBI|<#"Zi_&{|>7wDnyb u5lөC?BNeUԁ|I)rwiF'z)¼U0E(A'[]#A*j*CNIWr8͟S>@?mȠ{6*6f_(K!w=߱ 慼0>b{ZX*XJ '<{$vyZA>rOܑ:EĭrGo{cfz"ޞҠ)?[fG.;YfgܭAW\IJ(J_d2RI©dZq֝9.pr {0rJfȳ1DhRH7foN3O}C_:zل݉\%6A]kDؼ.仁[kAֿeJn/eIQ;Bmu1Hk|3UFxmYQnx#-h);j$?ȓX9$w9he@X./uRUX:7etv!'pѧwzC^yWqvǬWQZDF3m:]-Ah|K[RB@4}CeS9 .uC#iB.1v/ߑ!^ȡY.$TSh&ȫm]/lRZItmM/t9#Qߔ3B"ܠ^Ccw;'~x@V.ϲ7u[q~.wx~Iب4Dž&r,}"Y:+*YQ]&VΜy'17݂Prr#hl2qBޣ(s#{۾KY]7EY~!xD lR>hj.uFxKOi"V^ }[OIY\R 6 M}貹Bo󧐷EZ}ЧN"͆d(,w jmT*g(tVYK\5's-r5'mYJ#wJ7zyuDpϜΜ(j fk.Dq}k.u-OX &6i\ȷi*޽ϙzbȳSW )_ȓ+:od]ȳ{VzVqĩfnإɍ ;t1=rhvSitAwQ!wH]6 \&\ zZGeX ii7 x}jvA^NrA=Nw4(Vԥ_/.d%B/˺Hч@wB'@֐~ ݢ5Ӯ~RQ9t*q-]< $(ƆAwu{7p"5lVPl 5#_4O~ZUQ-+]Q> FN吺F70?b6 |,rQw9+XB̥<й9liǰIt|JoP\e@ojxk>Bؒ9KǑ/p v>c-'f.kTp} [=[Lݱ`a펻O~Qw5(py 7'k;[xn;䤜{(Yۥc>9y ړX䪜ypr@7I2{li+p\[;oB|=K8FFRJ:CwXt\5,.yTEfAw@,HĮ Vv[wCm߻YmrV3sm'iYrߦ_p[a+e#c<=_0pv[,Vq}Y΋^6:4[$ 2 ܏(ɶCmJ@ \Bص"o^Oդ8Iv?^>9.$lܛExn懋\u6YK6(LZVh|REqKArQ:GEjDVO-,7!lȭybuoX>l \J4?if4/ęB 9VTlȅm{_[ly}fU^Ho} <5[4[pCțJ*$n-ԡm^9o^}ϾK$16~JV'||X&sUh*?3spw^+%Z\Ⱦ-Pqu 葭 !/ 6946#ITHƁEoMafYz=qۢ6s, RČm]׼`Rt*tL 9z@^}xg!ר|=K^jYG>2V'B%t\ϻTyv&3>:@rGzrʼݱk0oݠSr=-b3IVțBP'HKnUwԳПgm? =4v.r0K!* йJ+R6T;SB<]r6>E>dg99ڡBvAϪ ޟ*9%͙F޶W0PkR297onY7h[Y,o/9{ʠ57{hU^i'vC 9+e*{|PCvb>_cV)< 9EQ|y"vy_Ln[Mty]Cfcs؉ܝ1j1od*4Ex nZMqq3Q| ސ(r!?;MD*wD u)E''Xij7an53 b2ڗpOyǽk?G$ԡd=R(c_{ 86KB8W?V Zq.OW"2rs#'rž֠w H+8?~ ~iyCz)l9-'پ,v.m;仭%:lʇ ׉E ͶS*>F'N%܃!9rk }&]RrZױfY/Kk+DSj`A\_ HpJnv3 `yNejzGyˮ4}.o +R1_׭\3ЌwE↞VEar!H~l6G8OsAe}4TQ<-:Ʀo aGUfE3=X>YA9&}z!O2umvD>{=8F(z e[RD92.Ar!`yf{wŶ.>BE@fAm$:Kz!+e,Nn}C\C嵏(ЍvW\4In͗6sT躚/5wz LΝw_5$:V|,*ЕQLu7n>-(T}:c3S[$,{TꪤO y^gchLա\7r RWy*WkRMݦ[cfI@\W@.>Q4GwznB7p(y栮r}̠eDh Kt.A7T &FzdwVBBNOxq*95dīŵz dzcNȍ"*rG{\畡\T~}, 6=6'`4TuHZEF]c>oVd%^n+:o0q#ׇ@F 9 ߗK zyLm>KjШI}}Q7Lf6 zPz/xbOH)]P=eJӮB'j z[ h)ru=[]iJo_)ո8xg 2ƍJqU"C!] I:r!߲-t#ͥ#v^̀ǞHDz6ܤy}.ISXwpɺizhCuq!w#F7m1A(3ڟ'WEBhЅc74~|+^}FNYb4+m`~AJf8oѡm۔C vTDLO+@,~Fe^[4E׈TosxM!"tqIx^?Q-M}8tOfA5ճ\ۅ{dհt*+c$Zivnn.e#ZhLb|t7fUG}z:g^4o1t;wBez z.]#?[N6Z(Vt ԻP~# `g7\(z}ˍףܴY9+:jK6d\>QsFIg NrC.'uuAjyԶVe y8QNq1ޤ}IEpK} #yz]*wPQ -sD.u;|s@K r5.kf0|KTڠ_{#a;>#+hAK.TO$Qf9='-\֠ jxԧ1=ޗ]e$ '-F6܌ofia 7.1~: ey2.Mľc+5 }bۼ 8 W("Bz"(3f;9q"KyLӹl`q衍~@tV`mN,K ץvJ[ :2aFd6젮/qݥfָiwsW%:5ӮґK} n5 1}lWar;}[%Ԟۥ%aPv2I)4ꉽ%}GG;!c'=( \tu6֗yk ]@'w6"$R)*g1A ]'4MYmk\6_u&=66w9K@S>?l'JX s;jДX=э|u9Y[.DJ#e&W_th@.Wְ7z":6Q?y״..3G+w]\^+ ;, tl7)fι {yʢ=1촸FteQݠHVq~UсŒ\u}sTB,Dr יGȂ:>ȓPZIg }+gB s &ŹC^R>)Fm\DKz\Cqi=["";3,sqX#S/,Q'e~3YiTn9kMLgEVKR-ՠyfw+ ȳnɥ!B.3L^N+4K'Z %q3G&]]ҽP$|Rp#g]TsS S s&6PKEܑDݽxbx`>V2dW7 ^@-ںs'reKDsD!p||,_tunSy:q[7W]֠y{wx zWe[Q3"_Fta+.jL_hP=oJ:-Ы I:pQ6Xѵyќ8 ]9Y#aj?kwQ\YL tHhwLt_|/k.9MҿVWQfG,k:QtM+D2/G=7Ykl3#V;:^ՠkiz:̽WڠO郟/V~6tQ' -3 -q:5AKط\0#'$ȱ ^7Ҝ>BZ #Eۍz͝ vhuh b3ZQ`$} ]rߘ+tb,0]Ą< ؛`ob@S4#1WаuI2l7U@'^T@޶n__8 Rk @WsZ{|}KZOwv}ёFޯGGQFAr"]㨥H$?5ԣb0M#.k_4F#E-i`À$@<@^~lB\N ]I?fNq\㋼F՝ݏ{CoΞM/7Q-FUi[36Ӟ9#]4I};Awv'r͹.*r_G z۹%$f \˶ýGCFǣe@JͯޢenDoH\3er,5z{uZtʫtїC9ޜK %wI"4&#!C.|=2촹IЂ|Y7Se)OO F \앖ץRAkԆ DG~ ht%iV;ޜZׯ_F9S$NҐK:%9ct=5]~GW|~AYal/XQk]\~\*!/1Lu׳=^GIxЧW #ahtѮ28u]*.S3>KcXZa7r5˃s=ӭ%夥b#9D`qLܨHIvuL/r֫1)'P@z/ջ~/A}CN^>g jv7S`k8I ]OkN)hh'H @jz_䣝n l }~<[t:.pyzhgO^"퀾s t\'3Zsd{ՃAʡй s􀮡@[Y\isˉ 49 i,XvR*rB9tn:L9qB׼.2Zˁɯ/6p|ɤatX tLՋ͗j BvGGҟn7%襴vEݨb5޸)޹&!K.U^W`8Ջ ܟp<u[R$(@.Յ!sG/5XחLT.1dR+V'ٕh,1̟ДƋ}_N"e]?-)ڀOG[܎̴CGMxи Yz4tbhf^}/ًv KƮceu*mi#@C7GrX<<GUzq )v5np?;!Mt'69q0NohRN,6tWD9}ZzD}]2y~z$F;4GW^{ u=漢5Oo A%}} x]3:3TWĆޑ Odo]'C/Hguv] Y{i ^bP q CzKZno:mЬs0pzT|c*?̾|3Pn M) \XAoMo,;r_^ [Ccvq:@ק5{Mrpc1gDCa=GTybMAwnMJ3 ɼx֣_C{ƾ6jǦY^+TvA)  ^ =`ah= <ւ~{=F[oP}✵+Hް=_C+ky}dⲾ!HٗjڙioB{zW.7@6| N'#3nux<߀L ӻ|@oIzy\Ç$BB[|FЬeJv+eYٳHG[GB)͚k%.{s^\>r/бtEySQ+#P<*WMZ'#?H>5;o NkxGc׫3ƃk)9 Dm}t{nVvIa+S=+.UJe֯?/Nctl<$D[btPb(]۬S]2 jpowN^13zFDcca}65dk m"tb\.^C 2ǩi5< / 4 ^Sͻy(z.:G.\wY2}Mv׾2Mn{~(5?D3Jv>cu.#]vwB-Ie~ZSIv9畑?՞.RM!m9DftK5ӥ?|vZ'29>>k(/;}|gk\v}H#exnT%6dfN9F| 3%#NcQ{ O3,{!h4;XZ생4H.g~ 6wl-`Y6_>V-~ $1B9kUhBlք-$ (r#GR Edž^/!&hFΒ ,r]v7T\4F.{Vyq=tTCaGU*v.带WنKA 5~o.qZJМ4Tkt|e6jLl@Bo/Q^+v ?j6`/Q/ﭣ :>*Qo@_{鍝4dY<ފCgo} Myt־N'ym/~\YIFZbg [׀O쿥?_T0אX9LX|-_,@6_ߛn62踷S@a~g`žIaAvf>T#P%[ }i̿՟ ~Ѫux:|}IV5־g/~a+iѪFJLX`_!9S@_jW&%n4B; Q-!" ^._Au_ 6쓐Q|2|Chma?LX}G!3G6h ԰l&| ֑..vr/k;̜/(v>$zcq;t!p",]Ǻv-` ?ӈ3@kV >gP3$EOqs9aWP6[Nrʀ&kf^"۽v+yɃ|M!сh,DZzcx>_ m__U+2q6lF(eNǀkGc<lZ)o=' 2{F`_ofV'J_ٱiȭ.c!۝-b# gEinM-_^i>W߲SVh/x D m\8-TW-4x+Y?-~ eg}ɀ]RW6q&ILzKW%QA'0Ľ:/ E?I3G0^Vb1hݍOu[[ִnu e'm;Gp:M&F}/Z2);iUth9 Z\)Ր }qtd2 6 9L꾺a™C/d/tM&>a_7A{;Y^w/b׷z\q?|@'N=:+2ѝjkxMѠgIT݅>k*OsO΂#w ccĿjo{퓘^3 q]qVݛ+LJ4"o|'gA57#NEKfそ(vj|gp2| ѱwj ~`5״+= %Dj%[샽E2kol">[). 0:v C$sx̽f}\8vP[!37{KV5lf ?d? 3َ+^Cc.zgר~BX}[v6֕kJ>Ru"l J?k4gFYI0$c,^XrEv 䠰,y)$f"wP/xaH\>|@UvCoNM>T̕sg^C.U~NP6So9eɎ&IE䋚A-?^׶h34(ΑM"ucAX96OE]gZӐ5P-Jr_|+7(zA%\ɹ'^Bk, 7 ,VYA?1 -=&OFn!kbZ+![SqWQc\?}opמ J130A_쭾j7.|E}+ ;tL5ta_ז'\DFovp$zɄX*_i|(9nؼu wvd}k%!?gfM.GSM["S.;Elf@uMw͒X4*3,/z. >GR6?v hS_A ђ ~uKM8MQA?Qd.O5Z h E>on,2' oP$_&?&8Ov-Nž/#mФdHЀ%5?9Kv;ԠG9*/Íze1x_>]8n`%pN]!׀F]yȑB>9C#}[N']~ q'13s85VžCP&@fEܴao;sk{{0;Z_\+qؕ;DYC u@}}rrdh2V/;)xJBlلhTgdxKe9 bDPkZ^RS o ן_m9|ic]';Y_/a *5[~QkbW p4=pg,nL\6vYPu]t: oЇ} yaL-6fn9{59ȣ#O<+u__CU~?V(jEؕXo s`4b:5:t6U} 7HbWޔ!,|zuE[tư&'&=:{_2vu {+֔AUԇ@E)-Xվ%~"k5k;Ȁ^Ֆ?WjdSAi厓vkDZ Ij.ߺ/RD7}v6_6Hz<Ǽ# ^"3TAn!.ꄬ._k@/׾fOv$#gv*nQuc/?)N3ўYsQ\u+:VҬ[_Nӣw }2"0~¹B$GItT CJy|C{KX}lNq DzXb^\}jIޒhul9#K rF~ '/rex =8D_"_.%\3# Cv}խ{!Eזm =Xu74dϕ5] ʯ̇k t`krr.aQIZa y<+§oOain 4;Se.I6'_Dp5`HڷePaҡ#I9 {~>7s>8?QڡO-{R__?Wȁrnߝ. {=RBo? cCbΒK㝎 e7_́׊Ch}dSk}2|MzX=aO ߓ =fN:``y3}ָ'*>~SU#3q97a&l$O5| [}NSNJ[Qk J^L.闡p5ݴ%\e|'wy-X$F. rROIGIB |{[Ejȍ&xH4fG>:X\<v'L5zw%o]:)>UslƘ^93n-m)[od:YϋoP?֒xɥUD}^ M=z~S uH/5V1nQ]%4Wn_T!UWSXr^^uw Ka}/٪2yh{f{Fe rl#wG^'C_AgmodKRPɳ4|%jbj)ƖWҾ^#;/ȕ,} E`jYVMKN^adT|p)׉}:vO%k?0•[~sD%zL.œiƈYW!'4QMwWQgI@>`Tf~;ɻaSy >% >#h䴡sպp[̐37+yb͗6I 7!y GN B6}G\{\ bg>\{RO/Shʂ@;G^L>R"îHa4=wg :[;K4MP~SE"pvx$uvsL3Jq;ՖȬwDq[lAP1[R7]8CiHyru J28kh.u]tQ9WJ5KҒt {$r <]Ks^/ zGʋ7B*-=5 ׺}PBYzL֡zя5I[Mι|WN$g \_'ڠ {uy$l+ՒUFm+Sna9gXdD>dy]\ØN-nThvN螩ӝt&g|LZWW9֯Лv^c^ݧV'MXlw 9 ?UB.f1z#1|3s!ց=ٜzK<`h^%sF7Et,'r_4*i=Ү@nqM Er %F亅Bfһe:Q."eE-aاk}"^c²Dnzudd[*vi9зHDq8DA:thuݮGGz,f!r@ zQ (֚!?HN;c Pghb ]H97XW aB:,H2D~s'覷hsuztn1z o:԰ץcv?È(6Af}rziu+j]iiml5o,cA;t+Bm!}isb"rIݲ9Jq2>iq1NL4Š]9o:mr_~#_!CL9F^#sko{wP7_5CKTvc`~KkDF? 5>nBN=Ӵ ̋CQDž|FSUGFo/t!M9kK+WGv:EYȰ;À _%5 \ء#ˠ^6wj6U]þQ # -{ڲg48>8cc SATP" 4xKD&rީ LHY몥][#'brZ:gf,HG:";:'Fc "tMR*#[e^r@/M.c/d_Kl4ꂄOQ-iVtȃ.DyB6Q˳,g }]=~YtNrO0$"A^Z=פ (Iܱku!?6OQp>JߨƮ9NG3h#v:o`k]{]^xy2'u@JWWN􀾣:cC5AMք+5fle GKltoRd j&"t)\ua 9d{{ h`P-K/=ycӂi \w7FFN6_Oㆴe$uv/}2WFv!턾z0EOQ'^ۣ=2NiW>F/gF.,5M?*w=c5QcI|bU!Wu4RHaYV-uh}Dt&|B"l>_Z0؀F _#2"{c/$gXVUVl uasNzJKs g:ehB'^62t};^;m,;+>#G2n0` BzWziͨ3n'cYW`]z3_wSH.Afv`UcuPo!^Fn0fA݌/ȩ6߳&2j'_Hhvooё^^M-/ib )"t/A3Y_"4 A[}T=-.<7ػ rz-c,]'DXEE&ǒxtlKޒDNW_Gꕑm%/AI=oj+Nvx{#j=J6àxZtӣ#?&o14gKW7+oX /59g;%;]2R|Ћn;,_E{4Smm5ڄ=]3Gbtvt/s:n@N+5W8@:dTFc֢r@auPndb윑"2VL+oA}`$XKR?(L{;^ 1:RrK}>L(cNG~KꑪlY]/[8^ dwDqAت؜(OwoHg!_3Z^'ꬦ3)zK[bO#n1&X{˂3!ϻDO5MmhY\ݗ6ޑc:aD{vq7:JJdFI CUjRoҒ ?olZq@ߔ M ]{x)ʺ"UD^aHlO>xfU>B% ZB5>12-5D.k)y5O9O06_Gݰ%B/bk$]=(d"yWBWŴ%X:4eq#_{ޏh%D[C,պ:JT!M'}%rd d9* 90z)+E톼*lu F.mO}Z9H뵜R] (fuعnyF zpDN2.YJ0p qZGY#7H F%ݐ;rK4}cϥ@n cl俼1titMM:#dcGC#0ֲ.i]'r9_ [Ёh Ug?k ԝzN鋀,&}׆\Uz0[@)4Cͬ2eU鲎Ղ~Lm_򈍊 /BVPl:N䋰f1ESnIʃ3VXiIy t.tpw:e+z##7>V3}w MV+y絡K(S/u2 {GosЗCKѧsIAwL?З{ =$`9e( [q[}@>VF93 >-Ҡ^xJLuu~΁G6qxIؚEΨԚAW?*EƣCX< FHd@vsn#AkbqA3c(&G;gط:{kvrBo- b|MMk tb_ CuL`ow;K\ |]/O*٫BS׳4zLj5dgg'2O`[G0c?JΕ ]>5 tBno(ȩؓ}>N8)G癸fiw@K!}oV$ "Fym>iv'toVo|'6 [{~+|%؉]{ž!uw?j TM$2'X}6]&ZV#dnW|@I>fn/S=])3|-;Bz\Qvim\]Ow[1ݠ3"=&flvG|@eVC;[;Z'z{hsZmJ;4lgľ]eAaw\Ҿ0vڋE[9_ૺŐ<5FԸWq]U(-E5 m|E+56\&5_&:xV5B_i1tJ?KV:1KVv'i^gP݃ųZ+rdAO:}$ ޸mU\ygз&|:VI \*:t~N|#.d l-,u9 vS4L2+YLXv:zcȅ9; :ukTC&n18YkЁ7^k.Sϧ+^6=yN1Q/YRW=,nbґ\ciZgݕS]1s?SEU39#.B<<{;Ņy!;99S~K7is5["[YZYܸZӕ=):Nt}!һ i`1o԰t~;W嚸}[ ?%Dlp}Ź_*-#wW{mMGݕ%D G;^K +ħ+c4y ]9qOSGG =o&SBGo_ SHN_ j+Q^}Nm;A9(g%؇sWAcs/gg(0rq+_%cgȇP ܒllAg)z~&|߱sDYd`Y'U*|*bO{K2 *tǹ<0q:n7[w{.9h{sT 4C ?KF^ڡK}'F+$Oᮖ8'B'Y3#@^k\c]W7pR:=`U[4F`'7:,.:v`UL+k\߸YhŲ 2%ae5shENS.%'"9S~A}y)D @+/"qq7Q\Yԡjħ,l|W~!ylI>WmusI94"̶+f":E_Q;2y|%ZԠ\ځNQL8. K]2Fξ݌|]--gLrۍ6Ơw#S&z7r~'!.~t>2߻|big@[45K{~:G=<8/knR hWϚG`؄T4 }k?}F^/wl3#>|C"d:OG Ζ %?_i+Az8:yrN]|Ny6} ؓ@ ]]%dzE@N%&o#eh)Z:GQ C3%dg#tm@V֓NL8LE;ӝ/s\'A3%9Sj&~K ]zetd5V s7l_rYPb*3clsgh*VhG1TDcwɳy>E+Տp4]ɛ@g^$BoE_3wjC_s ߊx.1x|Lr]B2yQN|f_!`{f:To5`‰]|nՂTcgY&X-Ȭ!$Y|{rڠ+Qצɗ"ytot9_?>-^Ubw?42;WF Sn`E^WJN3+\{QUN L6fsB3D"fUW{oYxjE缔?Ip { T \sΈ[C5Jvxzy|>oo*%ʸY 1elh= `}2qw꒟f<ݰ~f |Uȇ6o!GŖ7o-.J@yWdEpϳ͘ |F^Bb\`W@ܸ[伖G})$Vܡ}]UVXQeE[Jar{nإ8}|> }} UnzVz9\ \G7`'1yY 8BNη[Ni_ۚ(<˂^Z5} Mho5T[q&["cs=x Wśt[m{ԙx;*wz] שj;B`)r"o9f =W!5WE&$*'t肫mdzBS4lgm 7*oS1*%{l\(tǥqB2z |b/Ikr%}E<>yyȟ*;i=@⾨vȄ~+$4pN\ziC`!cH2{ !;/B 2-V3%#5} jI tTm_};8.F-i|'XNEOkgv. 5^a/׵=|9eAAv;KLC~Nu|R]9E/r3iAjуa,̢ލVqW z0jPtNŮV'nt[N3-uO첇<)&|h$'MpZݲ'0_\ޘ_;1֡;1"R]ӏì7 Zt0ЭVfKX5$rÎ,'a rtKTexRt}zU"{}r<7X_u譎_іU_2nڐlt^y_[laV![FrCo3~}0ltC GvS`E|[.A7i 2V. ק@_7IǴcmxp?4-0m }1b4 oTzm"s`Q~mVH>ٙcv o0U>vKMЇut gaN;ŗVW4 K4c-}5£+Vʍ,C]}$TZ"ߛw+”HڱS[JOHث6섾vgxGn<ݲ/`}6ñvAǘ{}KN}FyX.v9o)Upg-Aq)WW\׽~#`]q'I||VE7Dm}_7e].n"fhn͐}ڼDCtrI6BsiG\Yin{'WZUo'p-{⾕w2Y}E>?'l=Bs~\ܮК"#o'l4ފ_2>qgRd@ȋr+ "-nsiSN_c/X=/]7WLYEe@s~ɝ7?N$ޛJ7ǡNoa\G[r t۳iu԰I Gmwɹ6 yQx(ߍ:G _JR6l5fN[} }O~aPR͍Yxy7)뺾bE ܗeЬ!dm*rәoHK 2\5~dϧ: ~C-ء[ c5Q@<yuXtؼ "|鍜R" yZ!GGZoOV-.Bs(QaЉB֜d9cteO%d#nȼ7 ʂ+=хD|@؎ :P w?}}: ."Z!}jPKk; >H:=. b&?C5b.auX;rw%{Bz¦_Ys_N[lX5Y[̦L_((2}; &a C6N-P{UjM 賈xn+3C@Qp˺hl/tI>2AO8 5NW g򓪄n饼OfE5n)r,tzU6P{ǠY[+aj7Y )|Xa7B|JDޡ+27rzFk&?3M zU^b; .XV#?pab h?evu75ݰ8'SoʼnEU_ ߕ{7K* +#Z%;p44]emϔdp۴9WhL,v D/jvAVzVyds rɎqbLrӳI}|=̿nrK g?ڞ}fX_O{cs<$," ZRYLYdkhW5Wz<8h57p Vd~i*ޮ&֡cW&Cf_Yd[tpJC6'0pjb"%]<-F*ܩz n.r'U?LD89-g4]iq+mۆ|;?O@qݼSy/[>Dhaڡ'YdR9>.3iy| Miqϳnj5y/qq[GtlV=Wl_f/ߩ,g'oVGw h7*tqB\ƹ+j\%E`E=n}udN]tB+~8[." r rӵM.Z tYmO-^3nzBz_&WlYzBJ4RאKFzt Ϳ7CKk o~Xi}D6;͟[|U%tf>'9c`w|ee1Gih (g5Ё Glu1B6ei&TO}Ƥ!O]D#8QX7, 3]GU#vO4&4K^/W:{9[A-FԾ7(t:8ZD]\'<'AOz oUZ!f>" }鹔m!=\}\_~-M }LjTB:CzK;]?}~X7,FZ Ϊ'8M,1{.FuMw\x Y"?T-vC2mJ|0l˲<˸c FY]-Ze{{{4C_ߺn ;H~ͮzvBXGi$zǦ_3"E;2On+] -xv}#4^8˾bKbbou:r`nkYg" jNȆ퍜YE~Ax^-\MNW2 sbV5kTu[.}~WҼc"!K\ܒȾBFB [kB˼!w|`79/b.\y+/?rUO/>!{zC޸-6Xo+躓O(c I!\N}a"GClT*oB9;8LѴ-9h\^^ eW`1h¢^qʥmpR~c{L79]1tVK[PGO'\%䆇0y(2-v5@?5bna,%)V\,T|}R4[\bMgi/|YbK,Ϣstf@'mo{\w>zigQn氬+<ܸ-'BUV:)ۇkfVz=n;L7r O_qz;7}Lfa_Ör o+> < 3ʉ//_MV&B醮k S=qgo ~UÕ=v^Y/E;;c(t-?V_)+Ũ-lЭ~ }eP|Mif"Nzz[QbU;osgĥ};UD97lN}L̄.qc '0nrF㗿,s~n֡fSF"tb+ҠI3[2>#u]}>rw \{y@TD|BPܙ} .aEi&>"+Hrp;l~+BN:RMb[#l*/=hg~z{m/l!{a]Ћ.o{!>_'AF(ӛpe#; ̿[atౝ^Я}_7hε|3@J EPIV_Dq12Ná-dtOd`х y+A_>,5b(Wk|fWN |kT{#l ݧOt~ j| c@ss<\E7Q䇿t. +[zZ)->?J홎p bv8Qnˉ\Y⪔Oo*9ܯ,rZܒi )z0Y,4fjk[u'f燸\fϢYNӺb.Q$NAZ \𖕱tXс1},L#oA87ڀAUUh ·HJT6d5gRϳGXt q xUz&]A+$p N?>l{_>I+oBYACyhg rU|M$r XU_ŵy>WA}[Zn[^K#Wm'EWƉ|gS ׍pkn6@sjw237g-ȾkSxR?]r#bseUE:>S^ D\C޸KpK"ob;U(UZ&ǧ̠qrr֠[fa慼5h BФdsO4y;4Z* a \\#AO>(,~߅<p]Ty gPA*-Sgx!#O"-'r 7 =RYdmǽw~'ՐoܚⓅ$u9G+Pg~ֈXLonHnI[_{{ϧ14= : RA?WԱjLկ y\F>_ 7"yȽ:Zы: y4 1s>\/(J9>Ҡ E;Aлuke[SǞ)m 9p|# A[o{*^1&6?Røl Kok]r9$Ecm;%Tܡƶd,<9vQDѼ?߃^4WXN74-Lj/UKlsE4nK01?|o/%:o)t?yȷ#:)qCHopdG5zAtPB>ܭ=Å=߄ ]WR8s?'թ4bY`d(Vlb3*-J0KNpABb3}DvβLd--S;9 Xvtt`]/AuR~Bo|n ɭ ?? /" ./<Ji,懼X\\䛵! ܢpmt[[ts 3|tЇ %ʻ J$qdBs>T[a<1]PeЋ24\]HO. ,^wˮ: .p")'lb4+\'OzqE|y1UrϸD S ིvȽ=(uEbC3gƂ4CIg rM5UUN"jYV[V9at^ֽѼb78/dQ_3cX5~?94.rW CbufƝ{#PSNΰ<-*al?OloCdm?7fd5 F+lSv? ye^k9qq]i f^s"Sg78Dd*{"Eiܐ#ך/plؓƉsҠ76hڎ=/9B{ ȒDV_! >VNx\oQpFEuK4=C^OQN"CiCo#|`WF6ݴْ]W#4oijI+/d8Tx#i'(tG˅^H+pD?O-й끽+q z3)v)#:+3#NNY9γw cqar^_`h|\rjDa%iC$ܮd'u'rxB -d=Tl[o@qO1_ 0pR'ל~38`nN',Ы7f^)D@^nwX4_mć.JM "9I5hY+]Z# AT7g ֬ػYx& AɯP_7=u=[DD^~XNg;Гng7sr7h;͂(dk FxLm[Cޥhvh7{+zyQ͛O຤{-&[aN{X-F͛ٶAI7#D5rOȞu)m8]Sh:'4prnyZ\ۺĺp?Oz[|:qHykqh M8^ /uムI@8T*ʊpm3.r;MN*M~ 6x* UD*Wm'1rSo5A~0 }Qu[ T&bfWsѸTIbovq I(w ^ΡC,h2{vGNȑ yjrψXYt7rJOn+yD*%ܐYjTdf=-%U&O`loy`Ubg,{{ q7E>m쥸iy.u:wd( ;ת"z3.{{:WˉQ %}Pd7?ySY # ֱ>6cHUH 5֐_N.^ܓ9k z>ۋT4S|Eٗ* gm#l56=&7B+P~$^ o6i t/IZEi;Wp*aio-ZrUrUɀ>&`\j*C)x$XF:BL⬂OY.ckqVk"Ofz238?- *]~>SP2W*&h]淯$}Ϗ xv:bW&chlq 'U^vӉx 47Tnky^T,M%ڽ(K#ψdt؜a/M=se\OTe' 侼mG+ \VqtC^NW%VԺm8q;]%}\so̗^+\ZYwz^X9%eWN Qb Wvh-ym( .}˪攱E_ػ%vEn.^"ХѪiCgNMybsY!G{ܱ !9]Uk4>X4n0fE]&vB2 "-4 G;+ibg\ 7Ehnnǵz]z.ۉ&\pI5EZHel{B7! 9Nڴ |S>૶<͘ycjl^I޾h@eTblR=ed|Ul:,;l v5sQ@ʨȩH VX%7 ywK ޒ8hΌ=_F`-׌.7 ,SVR306V O"^AzzU=;|ݠuNZmЉ}ӛE7s!}),hAu\|g; :!+nv@78%4*t$\cno K&wO w9Zw9l>bߏJ N 6 *I=E3ZOƲ=Kta>Έidq4ߕS,(sM7rZce܀Q[9]R 7)?'Lln'r46`F&-%(5AnQ]9}k1oKS~"I,.w!nϥ؎=ȐR`uU ǫtҡ3hwv;WhJb=bЙ_G$Zg-!Ɲ>FOCkؑзwڥwߋ_]־*0~94fy~_y^O!^IO-4f8$=M:tRs =*iG>zC*w硤, ~6Kc!9H1Qȉը'tZd =8'$+zf~y͋w{vaKN:vAGt ߂qb m湻`{\BLVn_wgi"FTW,lp9%+|@]$W@..hd\d=.eyTEu4Zn^[_h#N]Dg@.Ѻhbk~#/[ʏF BoGXdPJ tU`9gۡYF\ufyۜ~z/A׽`SYPhv wƅ 9q=lcr!5w0 t\$>ouRN!}:bS/F t_ޒ5tлF/9@ޣBW:En&_\ 6R,cuy1ґKQA.t@o| zT[.YE:FnZߨl6e^csEf$.ZOIґt끜~MeLrκ$&]/f0D.E<7čZxnE3}V&̵h}}V@W.k5"Y6r ^rH"P ~BEcnI]-GvBG+Ţ̸-jErџ肽\o~'r[*^En՛G/\P("q-"ԑ͝Fn7'3,r-e#*4_Խ7O+ f{FF7W)|E+EtELuت"y_5ipm؜8hzQic$.ttw>ϻ"]r3Q&tٲ R.~B1zK胜]DE!h#l>[TX8兎z7_sHfX :.p `&䇨Mi4csZ<#b%ץ&Ni N޸[L,fX`Waz"~#"A-(ߒҁ/AY="4x- g+PB: +0lFnr؜5hH':Y{ᶵ2"Y:nedN.I ;r$7o:1_}E$ˊl[t0 ׬;7G6kqpٖJ IJɣޡ _7MVPx]/~Ckʼk"7ǃ?Z]|HV~)C\ 5yUOZL#P}u##wi>5J}Z>BOgaKl~i" S͑~ev'«b.:!X3h; S)|,ɩ3am]g4Y!w\Ha;>K}-8~?n\72|=C~'60>kA^ ]5ntnM<Bmt+(r4 "͵7M0Sk 赡uy*M$pxZZJ[gZ!1 ZE|#RAllҠ-D>гOh^b>FkU VB4#5]?4-UhɊ.NEtFin*2*qRQz#wbcRXm=ͯYqdal7ͅ[ वNnY5tH4r*񟓴x/sA˛oi9 Z?1\Ub[ ~~`o78:.^NjkxA稓ȹCqt"3oc;`+ =cK(OxqnPA˗Z _*ɱP S@H]+z_+Z٬~#iF #~"Dȑ |63|?6m)/ľ/f(;z`| ӐK<]ݱ:6 }\$fBJط'WhNѝ7`i+zBo ZHDvBh(DG0wّլTg^c(Ї^$9man{m b(TrN%f\l K"w X=f  |΂N-2Z٫:c&=1Z3ӉLoЉ/q_^Tw xFAg`?VtF_I @&a:N!hл]3 T&/_gCf,Wllor.QSٝfm 1B8^W}&3jg +lT~+lc@!C"y:<v{Y)`=Ҧ@JU-(a[>=J@V(ŷ*bJp:`Qc_@#=բDN=}ũpGA1MYx%6 vI+q/ƽ7(8Kg 

uQ)3ѱFWFVނ>섾ԐK=.'Kkj,q\?V ҘQG /S0Ʊ,]D1 QN>+7Cw .B.hu _d54;4|z yRWh.ͺ=AvV֮ w3Dy-ub}0{`?ϤGeh~ UG$o3DF;I}lLgoٗ&|I'rgwX肩 'Iث&vtp;}|878#{lşUFܺ:cܺwtvB  ~ZN/;+&l>Gŗ2W?؋~}D` 9L{˚L ÛAWלV@= V -(y֩ߢ1]Wl(ClDTr }3SW,wvـ>o},O{X/ R{}֣a gֆ|& {/_N] QpMCN!oͭ씋mg'؈+A{;TSr~"{83w?Y5} +WzYd?grEfoa z_u:X- Cw79(Yp^1j174zt!٪_bUeۀ^i_yA~3v;AndDoi|O-.LG{g'Gl.sc4l'ڠg5l|B'@2^lj| /4#hL yL,E*gD'vKfY?\F,4"[4fGCNw }91b4{%Tf~ :!wۉ=aDn}}jh@TG]Fe5~(#n1.l1z,:rn):6Kj_}Xa؃pIa0Dx{7#ّ!w7횘_%N.ˁ< &͆{K>Nu1m#FLW=. `dZ*D_ ?')+/rsfzB̸c뙇=ugc 3ϓ.=x6|[Ͷ̌ȕ'vsrޗK'1C#ݥ^ņ. wB&ii{]5Fq[@טrt.q \ѧM1)芽;K-M{zs7Fa]:{ƁحutZ rj4oymWSJ#yqr{pmhLk>)v 0=C}MZB;ch;Q\Ҫ[!;LF,f;g2/蛘a':ܱ4A޾69o 3mʹS!m_ΈȾح$vh"t˷HbZIXTݻ>A[ r7fd7}[b,fh;7\V>@Vd #h|RIN\F+%{xUhmi+#h$M?א] ^ tH\7-'RfR=%RIeW\U=@ C/yk'<%hS:l/}vd!MokQ_Gڍzt*V)ަF׵7F'+rqh{ [[*3);rwZʏFﲣ4{ :j*J93YGgC߭`襟{'I-:b*jtuqecuzD*[3{n_squ`¾ٞfc,coԫT 3rrk6H^{6PCo>L+rMV>j=*sܭIZm ZJ{[(ݠUj[v%ՙ YE fB;XM#j'=4TSRүK|uX=vvm$k8 A6p"*՜u&Y7оܷnWW5.ؓ1 y%ouȣ٨񘺸qɯqN=E*Petc4 pT~\|PU oc*xΞםƢCKBzb蟺9 ޮb îQkwݬe cQ%\F|ݛ}wWzLͰ4{mGBHMB'}U[:zBvpuIoIb2#MeAnO#ziȉ[\L)%O XVX k`5H)i|@Sd&^].mb^7uN;+tf\O.BÁ 8Ǻ=%?ʝ) <}@0wo N>7f;ܵ~}=L]?n2ЇcMJZ[)V;-awH"LMvN4w|6p]&x[nDr A2&e\-8'ȯ,r;Es|sPmY^q"h!p޲KX!?klH1}Bav…x@o똓%εylR a>P̙i 0)NvBmvou~m=#Jx&LbCeDc׈3A1pJhER9vQJcKm'A_v"W׊ݳ+k\" [>FP^.W''\֡_ku1kr}X`TARB|#sQVLZƃr(i.Ft`'K#4;-$'uz_1pA_ C,7L_ҖMo>ҠzopϷ(ZXoM]_4pm^5Cz1%}3.W?,Jл޸s}5ܱ | OA"ϵx s РF{-&}#z mѠUqx;;\ܵ.UloQ]gz*cFk8E< D?I&/1nq0hO*7!O[_BƉs,b? ^SڙKrŗB^l;VH\wd M`ݖ`& j N|ɡbҫ^KWCngQi5 >Ϫyz=5#'}E-F.8%5/q% gvMą|sA@Am9"'[3j~Ї]+tNY9CoS8"Й!gTt ,bAr3j|ݬ_oV9BB,)>j=Ɍ}7𶈪VfuxsV'N={Thjp |ZD; ʬ⠳Ap"Mߣy@|~;}/?qW.|^Kno:؇p!aAnencUv\wcK +ڇ~~ @GD*Rm1* j-V:tǹP{#Ẃ_Q"77pYS\!b$4!?UہbbzPU34ͭaf+JQgg6w[9q(k戭&G',A~t W" ㍻74Pdw.>;! :־ qM2xSsIhV!kyfCE.9NaUĈ2[:fS}fS;J](8=gB :t6ZzusYX yWOP)q>Y<[YvJ.L6vYܒS6r mJ#7-ٔfp_XR4LN.v|Rsfh[$II`&Bn6r^ h.k%V4+ ϦXB?C -W+4Y㤎7;,f ě6_Mԥq#R iYOZWjaqDDN=nyH_iX1Ġoŕ,@͢/zIJrjNo.Fеq 6Aζp+f-A_-U!) գA4v~koI gp/m6y|"L1xҠl}hu/qd M7ŵ>mL%() LG۹b_ْ-*[cgOo$79=ܥ-m_/7z7z|h[Pjc+t{Y9U螸f _{l&՛bm,W>n$G{SIZ?"5d܋Z j>. jجzr,ROWYґ7*u+AE_gZDp$OwI-wLeh Z#6lY9 !Rtz! x3(6&,Eim;J\^WgE1OH-BW$C*?437H:9ʡ 9)2-&֐!i xu[l5zOBΠA<2Ђ\+cFRD6׊]7'+0t_JHa>yC/kb0t7$2ay.1h;VKmmus):2zw-,fFtr?PNyN˗\{DCg,(gqae b57}ҝ5gsFE.Is<*ܨЬ=K7\,lAiYMpSa*MxfAv&[;*7r%jj!}Z6vxoprU#xT,?X?HKy6@{nSܪvOk|S hpwh!jh0}I6݄5"uʍu ݸAF׺ }IܒC+*Jұem\ LW|F٭`o҃*I/) aݬ>L|U-KQU4x_&7:ŝK8ݩqpMr'Yk}f|5 ?z*d=7r[<:_'` # 6o5D=}Jv o44x^NcfXŷ)f9L1r)CS߽J)Vo%g\㒯S%>+xg ,^>\k\Ŗ0 t GsQ|#[=pछASWaF^ 6r,ɹCoQyU-L}ZEڭ};@)ǭDnq=[&_L'ZZLJ;.toQ>o#7XHV0F&b{,iCjYdB)K/pفSS6A1p%':6zڴ>e+1BFktOn <K7w,\QP/-o?+g -p OWi4Z#eQWrU>"m/\ϔUX9V7jo8P8Y>y[QEzށEzF8yux:sA`}5uul[5Jm74^hjN,+[QPNJYgv֥jbM c&+ 5Xz$dYMl}]Vt~Č[,RґYXȉyKf,z^cxABe5A_W-:jghBx"-F>pliE<]9K7p]$R1ZLZ4G|0yIu吏NIj.I3&WW^»n 2s5A_" a:fe|1Wqf*A.5թJ׻糸|0r˥-/GkKlvS77ԈxF+0`r٦xphCL[}9ra̠5\\WBv浻Om@*5PU3L2|i4Q' itI>UdwiYj|}l%b-?~S8CMVF] tGȬ j'r&`"-ݱ֟"8sy|<8hW;){omJqT'(>}= qZVGE8yHMpS^as#r>?ktN,^aB޻~<^5nȩgAߟE? jt Yq<:HZ_"Z-GtTㆺ IH7r}2 nщEcb9f&-qBkl3,B i+ "Ҟp-fCWY_.uKEZZrߠxn.򒙻"*uNR:{x}ŭZQ@lbM2-nf_Y3fК:krbo.2L\/ʤ@3OqsCֱWʈLE,@_zEw.o5jFltߴnFOn[])@9=eEY`ldP1P. lͰV䝛4ywƾ񔑳 ]-;A9G9DQէx אEy;K/Т0^!n:,^pwn>}E\6W \rQ2N. ӝ \Baf\ji1B|yOkߠ'r[Hڡɑ~qz._e>m 렉{c [Pp܂a"uyY|2tcoEis?_ >w9G6<ǟ:t kDT]S8}VwxqvaʷҢ1UuKO4lv^tz!8 A Lq&q>-nVA07^d`[!O@y5"Oނs`>w6pY;!BOZ9\(j MNwؼi]˛#gտ6BRxg@lд,56aO7eFpPLΑj%yo~.},p1 L݊$!TR[W _~J=l/#zftGEņ[#okwBȍP8!h7w;&&<[IL=ܰ#QVkbbSjIn9m!Tmiq2UIl-r)r xvfX?M{ S/VU鷫M?|o 6Uojś]]֢.xJPᦙF)q񁼯t^g+NMkt7r^طׅAqW.+"/#=~#&F.kXk IUu+( 7rE9T6װ(7&5c4z#oK whݑ/lH>N z*iqYW|{窧rޟwuzYV5M'YK4J{=ڌ㨰InqDT%k"kڶ@2↽ /`"'(6rUr0c}K6VNgjE~g~؁YJu:͊](W~LB%əd]KFБeK_fBvс'C5o 8*d@~ky@nzJ,P~K\Rq[vjn]†dgU( y;  <۳dQƛް-Q+:*p# Tj嚗9/#va\9S!4'QR}̩2kK~~ 9+ްA+ }jG59Z7Hmx-lC Mܲ)/[GGv31 irC"HW>md9E'pM>z"׸Ɂ{ց7YZ:6 <xZ|-b-'rlGON7OnY~tdo-&U?8KNLB΋tO̸dmk "g=o'&'[ĺ>}e:;=sd%g_ޟ76^^Fb[ܚ+jMx%߇LO2\mW!Sv+ {T%dsw8eIz/Aq334qV֊"_odYxr2@ś :ߌC?A2t쬴=òB{`81g$$%E\2 ʖDJzМZ.,;+S{>Ob%^5- |9Sv@oKv~Zwn:gApyF*jeͯ'+YЯ=so<3tT_>!_E)rO7͂<ؐk!΍`y =p8҂oEEO^[+Zy<{C6WCuP!Y3q9S]y{<-m;+Sw;J|#G 9RJ kɥR jE. ^+z &ؠw⵼qkOehI<ڸyMȀ&δXmǸBg\jd=bioy"W7h!!:&.nsNͪqWp`ȵ5L\Ð?OI \8wbJb?S<ȥH>Bc)=:;1Ѩ'{(1A!oܿiy`ܤyh"ӧ-"nzO87rͫ Mg8׳(;9#)=m6p?ѱc+ }oܛlz Slpqxh3V DްPՕ2LJO@ۺX-T|mK+O1(6 Ey By*b_ߟDcrwdllat؄ G3.#OɻVkEN%[? ss;_^u# !"].L2oZ 0s_Z=Ua8|8KZ^NɯSd-ܲ?V͟T79s8@ddr?{"q w">|se;#$/Ʈسr&9NK">ø}J-P\ϐx @[WZK݌nЅR_ NE ܉m~֍'KɊiQoo}y'q s~"wl"wcj]a%Q7˫wC3ϊ9y̨aWF|{VG$oPjCEU%A/q⮡uH[ %g)')yj סgMnzo |gTH&A\7e7p_)o lr8o<^%G9n6K@&0I 'Ic槛C}=|ek&}cS:eCp_\MxN%EycAonޖtF,-#D e$&ouqP\>zoLfTks!jneuނ/%ʝ zm4χP.SC[ёKudЬߣ8cO dEv -+x `Zg35 <2eAo~x.b>ܻqy:(Wģ<.pQ}{A'Z.wαAo:Y&fjX GfO Mfũ#$SZC0cƽg)rx 59BĹqE~]"|oKeu@ĒLJ~dvxK[qm^#sGk'i7rYi?b/ G*y0+pKH/؃Ò܋}μ5zCcΟ@!}#ߗؕl,9c''<'h;˓ ,][h-go#6n]xנ o>؇i§kdq#[B,)HH -OzitZE ͫ<7rիҭ#7-*yy\ҠЖ'5~Osa򅜱SuyYqYxR؉cGGQRnqe ji{H%Ȅ4cy.w.Ef43:BhfwZW5ݘl=SlKt&6_1mrF 9KK׫anW-Md};͞lvZd?m ͑ֈ1&N}$IH} * lR۝<_܀ߤ,544+>lqsސN\6@`x@kFzd<K!ual#SvQ1En>}@7=5GJ{xcw@~觿ЇJ8{L2!*tHmM(4haqc \ _ 4wGds캡~Q jm#GG29m>Kހ54=%qzFEՍnShN7L~){$v'B tCT>5<0B 4km'3.* % /.WIn &,3Y,3{U:ϐZNT=T \>QICf8z֡ %`7kU>#CN<8C&Ğ,P :qgTzFtcW#7_odP6l'VꄧT/K,dG61D)&Q@O"e !:Gx,WcI;ޣqb:X >hׯ7|.ɠBM ǣwCR>zCʹ9H@sSrb*PhmZel.l5vUB^胝zl?g&6sp@u*9'{I\ t|?F|qefFx/cƓj(gt9<<_?,ڼ l"~=6y JY!76sܜcdD6MVRF}xt :e^=^.W+4ٰ7wq}E^螀<%򶆿@ks{M;xY_'䂚||+BF*D98iF^WBP# c'}hr$|Mz|2t@,t94Z&-i* ݲU{hVE؄BJO/ފ@YsQ(|1&ʸu؋TF#X\&"M?Ͷ;hnrpKW1/I" mo{+̖r++r,rǁ7ns]&F T{^\}%N'+ouYJQ, [v~Spfz=zV(;+H9m9m "Ҵ}meE yVЗ$o#8Pz=fOgTs)En<*A36y#oq~r"sY(u,-z]7#ï.agbCh:89"Ù G}{'U3aLZy~-ocKp4:Ty>K0HLo82*y.ro%S@kb'Ĕ}:7̛!3kSp. olC-9ȋóp7+d޹G p: t/x#+m>J΅~&#ĪHN{Vfs@(Uvٲg@TN5x :3B*ҁCԥ=OwbI5: rG~!ܰEfK}._Q\_'3sTNirN-m੕:jq.׬b!"X( u 39L3*S p_H-Un z#yv8-~FGʧ-r6C_2 η7<'w|@&jނ>Ж7rZxй2T4sFI׾BC ksSb>/ΐfЇd/Rlڞݹ Asr[K{7HNm-yY2E w\HŋzݰN,΍]˽Ikǖ67;-ԾVHtUP(0ֈ+&7>>OYNNqy,3e9g'g߼!(X6^JiLONolC@WӸA4ύ]-Ұ\ ^%nq:cV&X),,^ 9$6 )d҂;Fζ$RUlKrm8=eOV}dGO^X#'eq|PuW+K#/Tp_E'RdPx@ƂI8ų?|ły*r2 \cnK <+s+6j-\!E _|9Yq1y[nqCܱR#h`3 щ|ĖL+rƎtwpgl' ιz:=4׆H"G\8ԽuZ(-m9D͡&|OԠ5"_.E ǡ" SNnFh.͆Z\LǐOz1\Q6q|ejtʙʿq[f|ʿ2%=;2V'bˬWAjZLoCνSy']էfF +@{ [ <'q~}ΰw^s9눂S-F^RVγ|-ϊr-`dʒ}n~us¿w¹<̝"o-s(L3{;yh.'^}} {ěr g2!󚑫6SE,Cwn't&#7i"NiءB>brC@K'}7~/ait Jܐ+|: (rB,?&q"y錊|5IďtpIy_6 |ﱊa?BΩghaU@lH9̰}uJ5޾u2m9*5iˀN K>κy߻ ԡKuUڰʿQ‰^2rx$7kQErf}ZȮJ") #'nDfɏ\0+ɫǐ.y[rvۼ!Sgf.|#Y躟,l,.I/zwuseHVOg,B%[ "Eg9:@Pۍ]gthr/ +;dqk_"Cmyp36;H>P]B~oU0Q[Zr,N{t0-"wc[NQ~ྞ^ <@K*9"mȮRB(bN>^#9-}ïvm,RRO_7TN9RdgeEη)nVDqhžNǬ_Wݴ|:nQWp ;Xc-yҼp%# *z}wp/n$L˺rOrqC׾u=gk7'K֛y}ލ>rC7.-)/[( w:ū ~ x_e[+U$>s*mКnsZ |Ӧ I-OR?);8 gLdٜW:۵fr"hPrA+E1|sR褼-v| $и,]zȽȵxkj*/rz_mM÷/r]1_} i8؉@x%^ӼuF@x݅P^ofLި~Չ6<`M6 |&zt\{*ea,# :"ٲkYH$r"L itQAo87>-Z߹ u xO]:3ܹebHv?- ke vB} |7 IzOǶnWh%j'k^~,VdvAwLoS!13"* Hn̹+"E](;sz3s!P* OjA?D|쩄L5$_~@}T7hrrfN, '\7&^{{r=-8\h;ݍ 9=װ|#ӭW^:eUf5 %jVrxC%q3D.hlcK'c-A!M^e6C~,#g#*6p,aT$krK{ZYtjHs#D2P 9tq4 ̵eDLM/:YRC@(._Iyp-;#9Wj6 A̙\"#qMBdVFa謼Ѕ|_]i~Ma]l5&Zdh&M{bq~8:I^c?p1.ڈkF YxiqHOah5~%{6.fցn\ Rٺj=F͍r^9t5+o8-;oܔVO鱔Ф!ׇ/"egYoBN +UBck^)4Y #yX>hNxs q[_NCǡww;:C|: +z.;ށ|:yQA"ɽ wwSiBƂlq-.2Ί @DEzlHߋ\ٖ$z{RK|qY<лͭgWms FkG~>3y(TuIIkԧO3肿 b^ uݏk!Vy2E pk'(GfY[ drz+deټP^@ȯsbM+5kq"'-9)$"Oca;dtR9IL\:E7 u^7@N-+j"\y׌{H'vBM}|BeڐJE0t(סa6^Q(\X6&tA诘{B\/e2Fo ^w4Vmh߹-Cgw klwkEFq`([ XAN~O24 Le1jHC3 n'p^*dE.WXN|>9tjY]g:^sw5Yg\tCh+t|ʀ~5S7p[fЪAgVH ʳ6r/+lutgI|T[?I-Rmur{Ā(G8-|Fi>m[Dn}fL9y%9HV9Vg͉ |o%+?9'{agX/;ހ]5XG~T)ФH.ŭW|yJkCMMg{@;+W6J+s@DN/u-1x O4+?Wu!=~"okOH8<}yѧ".5`jޅ9 29NjBޓ\|@cR+0 &OuFБe>+ķ~yԠɜH|tXԡ/$#y3 ه)O? k0^, Oj'FB&BD}ݦ-h"Wh@ 7-DxĕQX 7A#"^ߧM') j,+_wCeɪ="v"ucݫR.k<[85湋h2{-g@UWoy[VW)9mr R4^D~<Fm5׮4ڠ\.{ I+EfI:N])CIo4Ka&Ѫ91[f8ېCnVfHk\|E^[0~#N|u>Βqc;8} 9j ׬(~k!d xR{*cIľR4N5o\|T'pi 3Ssj.p}cP^ްGKO3ռ0rKW5AWcrdiQ 3;|Í{CKSxbh. sMn WVޟr,AWSR,qf4QOd1FN;I$lq|j+FIFEi ܟ8GVR= 򄢖 Ag+Qe#EDfAE~[\=BnRt ^z̓KC^at.,.݀acz( -JΙڪ W;zGd|aASP`_Z\覷$ѭW$'a&hE6t6#y;ʛa#;q&>|U=67?ǐ%ۗYL`q^. \4yq[x},vJXm |wWz,Q ͼCH Ng>\t:R% rIxS!_er\zySZUxFύ2WAF ?-Bbeɷ6E-.'}SV _Zx B1m"oҏ_*u9ʬ>Մ.Z }$-;t{> 8]W<<[ܬ|o]>l3G@l \+E\k|{DN{?N<+ m>y[,c9;SdZ)v贜WWaCכ\s@˔.T.qȴh-[N),Sf#[Sv#ZOu'z?B뉜Yfz,D|CA3h~d;/4wg [J"V0OrWUZ-39 Zeǚ+srr!~ÏlM zJ '-"b-L}-k&!qk2?A9|@ZFpx$Б˸%CτHu)4kz%3<`K rzgEX^•@SDqkr= \nkIvSxh 8C7'$Ʋf&n =S]#۲hdjQ^o[Q\Plgkqb$ѵ3pMNۍKR<IQmqistaZNWLy&[{Erۼm?|&m@Z\Y4o =X}"넢D@K)sT,mpr,huiq|> }HgC<صwc1%iE0AJsAL'\|Oʣ rqhRGQp\ͱ1CxVə=h0Fo a<ǣ1g>~cZA$h΋zX+ĞI^kws4F>.-|}> L {Z=%[/?.> \rRD>+݈9.-K6d'Ѻ&yڡyᵇp+SY% ])Y35lL69K(^J do*~爡JahJ{Fx[?t)1CK9TSyzk(ii'Ɏ\Y"Ha}O.N &okzW\?m Q^GP{ȃTస./;}R|e޶ʉ54dVnFq*mDqq:r|qM c]1l1G.~o[zְaُhRrt"lB~Zxj#o$:ڥ Gk|5o$'p?B BU>u? }iXrzX%6Egaɍ;m 8Ӊ'pzI},~a"U~,FRUIFq ~nn! *_-V /V6r 79y.S.:M7蛽ZDpÃ7S3Iy.;G.%/יKsrOPS>Tz jA?ԯ2NrguCOv',[M,3f  !#/Am3UA |@7៯es#IZKAﮊ[K@n܂ʹ 8}"T"_ʛJ 6'hcMwG<# ӠW|[Ѭ;wnkՕ'zkh>vB09!3 9(nme1bd&dVͳ:8kܿ74WRZ11OiؔMrM 0#z"Wؠ|\im@Of,EQC~ʅܛD}BͰ ,5eVk.LӚO ]ND4jϸݙV•+r >=A8/!wJ$ʀ:zY|$geUF>+#\c)щWkrZ7ڠݜ\n-!GV}$2 =`x7&NI8'=AIAAqAO]j7MHGn |qMNBE:W=Vq&m9b׬9 o@+y w<˯s\j;EȢ zJln&@+8q'+-YFb5qFmN]N> em&iySYY#|X3'AQHvmDiдȢt!ۋ|!KPV.l>*'irB)t4y|&HȻfo7Jl^,[Z"N} -1p..IxvoB_ސȫ }o_Ʌ!\~V.'MYSu/,>ɁZ_D'T$}nABe䯓ĭ넲JJn':"04@?n)"|pR{mn hud6.'hVoV;(@#kuZ2''P TĐgҠm\b1RK2v0'04ᝬB>fy +t"e[g.9ɏ[4˗Z-5o& }npuS}q3hàn\c| x r2hsO6DTY5wd_ qƴ6ZHbF#qQ Ofg+Ym Am_y/pY%;ŭ Fy}#Ic v Ѝ\ J/=yC[?b6/pC4ozgkB7 k+DNЊTHny tL~?"jOD^<4':yR!;F's [QBۋ@oW Oͥt[طf%CoF:3mylf@hyGgI$ }ƾըBPe͢+r* }ؠ>N۹ }>! 6Y7ݗ/ɮ܊,ڪ'y L$ -:It̓;2=g6!+t֮}a(SAwj0=Z"Sx ?L EV|:]KзLƠ= j ej.n~Tkd3М5TqLoiْ@ψK v2W?:s҃чg*m=ЗbĿ ꙟhTeGj}xa.T+Տgj5*{[Dw']77dx'vkm&j7򶮕L;k֯:ҧ@@cRhF?V(Qs __ [~CXLG !1Z.x*SE0qlE W׹J~ !7lZ5`6-{ڢǯ[ȬUTeCF#a -n3~>UW} zŇXR]!R6C?L~h/μMYgǘ |;@222Z>كB@oOB%zKIZY-).}R:ZڃbКI5;I6wdН; `:L>k@K4wkՠa :R"(B &?FiVmȡwLnӝ;}c}|u{:123m JC× ׻?\o=A5괎x$f0#c>KSRNAXSD2)N9Љ]b\J?.cOU#?X쩣#wH\f=1~=&@Sop3]!.r릳Bv'o( Boլ-)GE]'tbUQ^5;[>"Q_߄Z}"^Җ{|ȐbWxDӒpknKR䆒R$WU^ 'y\|>k]KuTYJkT~&q]c Y|QBo sA{+M(e.ȳmNgno: HhemBߟN7 rwnAS&\yy=5jvkv ^N ۱-B3nKy(4%W FFMU3 K z_$ru?jiz!1[WVzVS- #?,foO9Q1HlzCH˗ 77-2b Y tK`d}H=T#]J w0._Q셪LCۍJiÃR߃>Z[.WK3mGy].&njE\1{SbIGg1uc.]sO݂aߩX(ʍzt]pPӿ}>G$?1}je j{.]vf7`Fl|>ӴC?K-}} )iڪ?Lv׹.q82?vO݂Mِ`-R (FP` z! O>m$okl΄@;TZ6̳7+(k/4BJL@SRs2NgO'&^[90)rK: RsBuBޤ"y`hXl%//9qU/uϗ:]#7lVYi]TW8p,#P^^c]zǷ V`D!7=G}%FvT2 u*y^a| cڎ1ɯ1c֌{@@l*O7A^#Kv[-h%bq}4k3dyo| 5ǠŒW#믖Ner9['惖y"r"k^Bvs^F pլvEk.5.j_f W+I't^<*ˑLo7PU+.{1]_,\"+F2fhU BCxK:}'ȧdn便7Sf*o蛴ǰw)3G+X,zO,}S\q6QQId'p -G2bQQ9F,Af[GAo7 Q?[*2 ,~l\p SLe-vod@s eh IRoܯGro7%U>?x/ Sb/<+Y>a6>nY|Aϙ2d'pYU.pq[<3[f'P5lr/rA "QdZBiŐwnmb ZUNඨm@ Yю`qiҬBHnI~} eP#FҰ˨J̵cWj潯,he}qqRh2zEYGV͹CiWp'}ܪ"?<WW_7 ݥ0 T)WPɕJHjP~=R~"m Qi"&6~+ɘM hfNz_dDID><ԲI ߟgK Nfasq%ȴ-Ezow 8jL:tùد]n'_4 Mo#DѸ,J A3G̩Jl#3VdgQfQ^=!FNe)f̊Rn {1VJ[)1-`c 8@]iR)_0ht"5$WҢ'-*t;EjVrJv~5 dX7Tfkȫ7[ֽoQ7wBr"8!GW`Hf`AF^r ߨZ"s&9J\;W|˛BۓPW+As Wi3n[pˡD>b܍ uKbD^7RidN4N5 ?+ȋ^ǢH2TWji9w Tpܓ-B~/k`;bmŔ@4>*6u(Z 8.bqdyE_Qwꓸ]2|܉ߠݟgnQ6æȿE~,ki#%͐C^sw!k@˫z{O@/ w[lER^ Y3r*%&WŽS^q_3 y3YJK-\V;Z5\Dv#.&* -Nmc[q4+9:ܐh~:3Ԑ Rcrp[6CcڸV}J^ iYE-K8sOZ7EqQBw-mjEC N.D弇x oS~VC\.Mǵ5rfR"-ꊥ)usН~wEnS>kvx[D6#/*{Ur ķʼnt8Wy\c~ jy92qN9gb.srsA [/Q 5h=*'+FW{@^C}bDE#gm'r7A5|Wx"޵?U;$3G.)(ǒ-v=Eg oCKF T'c+?a%X*=^K[*9F7E9TeqJ5ꬫ&qVѠ\&ץR$x49pXi#, j9[]cPMQ'Ug 9D>c`]"b R?7_ v_|Ѕ\#ҙ 6BRu&TT E*_Ǟ=3Ӭy|-ϱ+tӯ$}剙mـ>E|/8P^ 9px}3{X/ಸ4+ 2p-.Hkr |f'hTלngjH:YO{KC'hDEEjד.=<@k eqȴRt1x /> k}L:L,|D(wu8#K1Q@[Rk-:ōeAo{SF^Arߴ"8ם \%aykOz1v7 '{ƕwc+\g\D<%bj^'FbmlR5]zފbf3Km@OntrjʋVSrhsIE.{x vㄭArR9qް*m["YmZ ~ezo^C.Sl9=bGn8jо9o!R7.wW>X`M |h[(B7m5 +)g4HIxU.ll7t[հYnQɣ xBvNYR4!ޮB"bȁŚ\/!MkWH-ͣDHܢ/r^m@'A" W[ |eT5zeJY*A+ |$B;yu'Zۭ(zQDAg]֑ϗ'м#קh,k>UWwjb"3=CpM}&亁r0 //ckvAߜk^"W?H}Ss/}Pmu'6@KJNQSq /r 'wD\{ _mR^k#[1}6J'?{p]O3J~"PC`7zRzg ȇA3(T/%'~ )]6Ho}Q3I[~ã!B/gUxZD>vT^U ;?ϷLK Jj_-H*D(f4Lȟ~8>9nWw87Ies7MlO|"orShD}<+r&wt/:Nb)28乯%|>5CbŹdqu E4$J=KD\clB =By@m/['pguhIXz"ϓ2.9"ҧ{9LjOg?9G$)r CAkĪr;KMWgq g\ nkUwurlH }FgC['p'wu~[ByWhfJ'oX8BW4u&'{$9JO VN:CC%}y!٠U?a\g#Ndy l'p82hE>.gէ`RZm~էE(e#oK 6(mapzZ^gWX7^.!`{q<26U<Bvl@ڞ' ;  }nv<TlB*.?UV&L@}3eZxEs[IQ;N\pd,Gq?xH'}kKmxjegŰǰ32Ww4x5\Ų-A¼#ˢ*UvOQhi׆BoC/Ժ# 4W@_J9~2"aAQa1nGYU!|dgfd""KXm]""q7=J!&DDXWڌ#ʂ9:qm4g-pw4tg>Z}+BbXU1Vډrז+֡?On' v:_jz%Њ&=7F߁':f?f :Ο7-w!EV/9uVv=z/?t)-F#/?4A[uޞB+ DpqS.(5هAgT{˖{RJV%Yycnӽw'9p}x%\%tZqi#c@E<[q/tX F*rM7ܩ3 Mؚ"Rr|3xwzOMOgdhɻc,2q)%ݠeBgԜH$iK޾@sG9,>|h'{%]D3+t,YRkһi.n}iI(tT*o>P6z|ް/lj}蚎j=}yնYڀ&hU`//FnD`5ݐg| ȉKk>Â%H5&ulQ-#! r,ry4S*@N*N*k;B :ne{OEbip{D˰Wj ?J6Y;Jn13\{a.P=SfZr["]:Sдd}R =*3k81jV'b9y'l;es6@ZJұko;rxv!(Bb?Пy6h;}%fl6<P"|;S@S}(t<_e܃wasX8l>S /c5^3E?dWm|o~fG wvigbձ㖵<1 $OKtYEċXstʝb͒q[ʒ,k6вNTa 'έOY6yVoŠs/^!oA=2j&>N&PA!;rqVBބks~OY`cO ꙱`U ?A |&#φ\ [\_!#S/ bܰ.4 \ ZW||o8@7o+{tۣQ`Ұo&Bą?{to_wh>oH^Ci#O裇$0*&Pg/?J4yD HNr{F~!"K ;&ځ +l!5ziˉ"j ZXKD lj7Oh}dU&F:Ut39G6_$?/(Q~\ݯ8b¾l1KBOM |{@-tMupapa617SzXp=)jbʙ8ymBy!whY+Gw@_R"Bm7YHuqDgo)RVZН[@P#AOFv)n^#B 9$M 8E,J&o9tCqP\g 0 }Q6W5]氙VWAN&NؠO3S4 BOI `䎳o@l {/ר(g/Tɓ|s ؎jcaSjvnzxvM7(K;pY^~:3 Ǘ䠂Xw}-W+Uہ?d\IWs(Eo9Hƫr2u3Do86k)^Βڠ;T8c^ϾrF>9?&kVBp =m+t=Aw=$/k &$ֵЇ ܊N|]}+3 N zߡؐ?(̰_! ]'Y)b{!UOD"%6hQQ~){/YXC?̾4g[`n, gڠoZHGoo1f&/䔝(19]}yܟ(vQ; AgAoi'25x~ZRʥ\Om_Fذr#6|u*M=^I\Nz"5g셝C-n|ْ%>ZUJښ,46\ٓyA!&}Vo4=GJΰnݾf sEJx %)fޮ%G8WG5\פvWXYs+\[W>$);a/ktfͪ|5vb!4.x!n5|@3}з1 '^-r  ҧobBu5,)sV0T@rH@OekЩv[jg]6Qd!6޾AoQsdicuE^§ȝ0p@N,!6NۨCcobSА[a^/[(};_-Fžy TyQ9MFsYc8Yӂc®Cln-I/DBՀBq윬0xxx/mUvf 'ߋi f%S?T&Rר%\|ݝ4h)BN56;)WW;|&EC]N ? ]GL'(KQ,)5'^k?r7 }>BnPirb3 - D|w[wJeDdl04J?OW&쵂{!"輝ͬj Seܪn ^*30a\k&Qڝ:3/rĿ})LK}@G.O\R!d1:r ~Ğ'éG0Nf^=nq6Ch4/\g;=sCz tb):Q4Zyց/|]?]}eYzdqDoPCz#A$ ߤ DnJr4M 32g~>b,Ы43"EwT zn_^n ~=e2>yx\(UluYM0~}?NI3ĴUTP[؝3]S(e2y* n{:0;*Ǻky/Te"uGܠ=UyZ+A-ȳΦ(R ]w*1#v=>/x u~}~v/.ojAk|tKqGX\Z ǪPKǮP90}2 UT`;uڢVu*_HYFqY'$hln[u+70f)MS&*|Efj,V -r1pfL>Aё,mRB/2=j;>rZV.N MԠ1 ]щ91 eFύ+l<`w+\TƉ#lƨKLhFL~xL)#IE:hX26?S)3@JgNMREHwZW7 \&u=[79WkQM[fp?G 1 CL}FXt%{[4z͋-^TT"i#zR{T_mm[mtZ'T KJp٭1#lev[,9dǘ8IbsE~o"k;m?6uRrDz C~a >rǥq. fiL_ao]N%4+В vJ}2r"3/h:IN=c@c\o{A'fL߱\ua%b|7K%"ρ{cBm.nSA[{crY>&@_] ;KkE쇼\fN a߽krLZ=y ;uEN WvQꀾ#B,>7RI/2{F푬:^П$l;/z}S9o'Β$ { 7GIrGC9JNm'RGZe2`wk/IA'*`+1-[ӪB}?dْUPY4= ݐNg/̲$BqE3)oܱ~b9A{\1\#] A?y'^M-U)*`\ch}{f&[ =J>2y 诓/: 0ݮ/r4;W*]n"(r^sd7whuAH=˕~?mq'YF ڒ1Β e`+gD>eȽw%-G>3?ZA̝Fs.|Kis.ʅl.O+Iچ\)zC:Rx/-D|{,rEB+H9(kA^͛ݎc'}5"Ӌ^&X7!);n5 Dp\:y p+gl̚w/ms>ȹ`+Ł\ gR:Qt瓤_Ϩ{G?NYpN^#ӢTn% fn 1:4OP͓׉"e>קzyKZއ)\~|A}ȃڱ', ӉRR6i+3c)!t~\l4fkvX6Ze|V|# ݞ҃M1 Adɖ }ǯS}" 9'x=e`QL.눮'tY݌-r}ϵfBg+O""j9`'ؾ)r6hy>tdA>NΑ l9?!r h[MeSju.j^xM-A E yK=!⚜֐wl9P5#@&Z.~k፡鶕s ,_pTJN^sci4}k*5Yql]8'+cqZOh~-~^c'u6xhRCpN^ Exm21.{.o }sho-mrOU5Dҥ"3^&$0Mm Flg xpoo1 =5hM)D& do{0Q 9URؾ3 ?D>Pﺻ48 ~t]O؋ג)+= ,Ҧ0ipk6K4{ߋE*\.@.1\9k,XLUj.C&7iYɂ8IS<f{nM}z"B KZn-ĞyM!*n6HE)hՅԂ&u@@SoYps kvJȽD~ҐIec5^NzB7vDW:_.?)y-k.uӲԴtl9T;,Lk)yqklSGok-\+P<˷/`"r$orY8MT# {K r5\i濁ˈ.=U{+ܘWszJ!'%=/\&7lۆ7*d_uMt%}[=xZ cC&盟:T/1Ū :[6Na te}+E.Y<! .=JȂya|_=59=t\"0z>.`8+$Nacڶݥ LK*ȷfZՀ|?r-m7K8\_଺3e+МO6>uAq4+6|?7r=遦~rrؘ5 Bn C+Ͽrt_N \@xxx;96Cg ےWqźL[UZ^!k'lKNЫ3Cng"ϰBxJ>xu+qe#)U?Ȼo<~T-||Jĕ3Ͼxi 5$fHqqϞ֠ ZkX£Bӝ6zYM IQ긠?Uѱw3בE?K\s6+;N! iQD҅|&jVAEL)N-BTqͺDN7fn؍gr=)f&lPIqcZ^*D@ξmBkk<>,#)8$.I.cy;[89Oȟj~g50ds%[q<}k2@q9SMb7=럓C7+\#y3hA)>^\Fs^ UOϑCT]m~-\~:Z_LBRޘjE29Op?^/xty0FvͫxgR=v̿ v:v+*/܈+}^ȳW%W1"M쬇8<tI lOˑ_AuZY|-ɭPAG66|9 jYr1hi =uc>{ftߜO _q7t1kT^ Ad8K4-:T|*Zۉ sX,+'"ۧ1SpH) |W%=r/{#@[h+Y>CZ|@N]X3 FKY>ïtYܗbGxߧ7#^OF&*J]nE3X'v!q6 /}@^CY418 3 hK-ϐxt 9URF>Z y '`=C) 9,n @D醍\e~B%~K!\׀_ o(e\S6Qh"ߛ¦ЧUl ҡ~Ɓ[YS4Ͳw KȾ]9! Bq ː߬jșq9G$ @$z;fxetJ~CI yb8$4uhVȗ9tm,K|z|>F!3iDFw@TYz<:Ë7pz;m)%Z>*7pIaVsqU5A8܇nu梭 8ɪ&jqjBron>E$+'*os 0z"H p {OP3OV\3bBbp~ 9;$zZ-Ё[b_Bq8RANm_ 7ʇ)׻Ew/fZ-@wA5OU0aP˨B8.\ VAq\:ӕ-3ro֐e9}{c,[6B$-#_د]O@/N!WTjċZ>CGsfH;裲כDž-PmlT|gC;_XQwY8/e s(7V|/;9u2DIvx>Ǵt~-,R2edנL9$΂uM=͵pM^˪ZAzH6e( ~5.K-DZr~Ȁ~kQC8D!  4"OaY3vA=߃ +_r )r,BF.K4_n+4|Ww$F&YP@k%.|B;KMz6]Z2S-dt z\A7/'MyN{ȋpC/@yM hS+1165d%Jv6r[}g?̣,'<˓ ;(fv#x@1֐5$dc-FxJL}J ѮSt+ :kBՠ,fD.,Vө?,乶ZyυS]QxK \֨\ VLATGjz7h5|O[7elz+uˆ:"'p8+LJQMN!X+R`) 8cyd,w4n_aTKSdX+e -e6àI9j{/OybXϳE㙟ns[?6ҞA6Rh:/X\PRօ7pq\r(ʠB_}$R܈E3-)^ t\bh-M_߻p-һZkYUKu]!adK6嬃SD6}>2r+Ԏd >;_N9bhܲ|MJlrng7>|6# 7p|D&QV3%tIk^"K]32vT_YOc3t;+_{+#cVZ[)NU }tjN(rZ3nhye(ۭ|O=FAI-{4;T.t<\E=ND^Nb\^^n++ºƝ~)n8$') ljȝߧBGDp,-NxDr;jwz Ec;Z] Tœ;^ \Bp#8D('*^/8UAmWCޡA_FET o*MroA'wд2HhRyb׳GYY5' +eCY{ S0C"?nYulj|"oL|R~^2z+en#.kr?w+p:;$&ҷ_:ۈ Zj kZ$3$q>e-gX>@}z7]\L"l%FWʸvzKmWʶrيB:Ȥem+'𽲯 Iθ [þ/Mrۇ@> zGC(VZU/%r,d7K0ASϏZՏd`/3#of@IbsvE|%B!q 48>-osq%eu;CPF*̵uP2@ZH$ۍ<(2+bA>0ө(hQ@Go AGDNbFΡ-8kMQץ_}A8dkc<#-x}WUDtG&'pPnQnǻ$qe$mQ|6|\ͫ M,\y<uz4&7r[43!VR̤I_ C>/lCJ+.ls˲y6)ODEN亴?@mV{|ȿ&|r(crߦB+Sr'?OF('h|P%{ELGJ5dgi'l5\9|h[WIAig_OYJ}lo`i:GyRc2CJx Csmr=>z|C7 v$KS'. x}F3wl7tD`nA6pꡳ+T,=h,lZ5)OSB\&攄:ĊlI2'hau ,g kn. =eCSl/~= t<<Ͽlu48qpD f WFZ x"ٴ̽CUmB] lOiV,kE!٢`YgsE5sc#aX!\5- /g+|3!W.Sv୕%.R%-ʟgLY9ʃj>A3F|eS_y<84f s7MEȁEYJ4m'l#oQ[ ,NȢ$/cy2EkGmwݖ+G?E &٫h.@jEUHY,r2''df}2v"p6rYrvU7"oĝW]~b[[@٠#b{w&?%.SMȴf(Y׎kMi .vXywhi''r ;akhPՐ%8 ~F*z[ _vrmfUi-<%J\ ~oKn=R <{g% ;AJ̙] :%o{h&4q4Nok*Dwdj5d?Rcmwqc.ru}|2M'%Fo*-),91E1:6wh-N4K xOy9rYu\teh\ +4cOm IFVUhgy|%Gf[i@{<)}&Ap'9? ;-7p(*ZSk(]-7!\g95#wYTVVFY6gN+N)4# $H3>sI"/k'pg GDbȩ$zADZ8Ѿh؀ӣʣ#?$#L^yI&p~ 56C/ Z.jay*M&ytn tFHjK]܍zAA[.nm)C7lɂt-"]Q'r^a/:mЯga9K|&, DRUl8S@Y9[,ƹ4}\}0v+zj,t}Wgp a\Íd'n/3.pr|>y\sNI9;T߽ȳ+x߸ uqf i)Y&f$Jn5p$z"ոtdV-!ͽ*ހqovJ\, $3)yB[_=T[nFUU8>O 0:R䤼c *oe=)Tvu'\ob'W''ry 5A 63UB:~<~g6;N @q"kNN] e]!,Z:K2X-u_["6*#(B%*9uxgHzq/U\y_p 6-?D]~?#Γ|"wN?mafU'tKx\Be_W`7/R[삈+#26Ac/ ְ'7;{h {E\ѝT9>Uer [opE; }w^GÌ=e y{Tw]Lbe h_#x.i\&ӷwVm7xz(Be`gԠ]^ Akzjy FDc]+ ;<…B՞C ի"Gvcwu ]Bͅ:~R+#K[R ƽ3vCVꍝdZ(Z,L7YkU1Cuqh=o#Jrbo$Wol[pbESt`䐱s4sf5\!kHyKIgltyjh*ɏn/S#wǞ#V{loZ@>5й >=ԘI3ˋwhnrk\S hh5x:{GN}"{4R oIUjRWl2~ckd=p=|Mn.Ct|#l=|++ ՠ5V _4=5ޅvdg'ZQ=|d?fZnۉ,:dHu5c[͙dm\pb߱٧ t3^`O`yXOmB[݉|Txsy}A:t;}wQ^c Z:Ext7}ڳ1#{;5sdm~J; g=9޾/rWf6PDi,RʣT;3AOW3]>D7Ҹ%[A?TNz5{_$Hn>BfRs5Dl"Ik%+9iwS/tQzz.E1 5;s؞ 1 Z&x7}ߑ^}Jnj?FoSts@o!j9oQ'T %/7ZJٵXV_Jؗ}/kG6X >%o eg \&Ep+l"gDOgFn-9xIڠ;yot 9 rldtljF0gS}Mg`G%w>>UzCw (ʈ끥|ASsG"y -6&.4-R`=+FU!FP_Dq@Wlk]D!=1*u镕99V@ߺ;$n6Aثs =f%b96zW~R Jn-F~ z{kT3><-WUE(V/! IЯ硜A[b~ZEmb3I)eư:?3t^w.+@ Nb1Fٽ<͛3Qa$u>mJ|U^$VzJSԢm߽5^C+lv1-:C 0$K  l |:}ZǛʴk, :z::v#G̕n-3KsVx=ORW:ٔ[:7r&pJdtcb<1|ޑⴒ/prXi4eQ+.k&}u=&o +kUO-i7%gS4 {Q ir|#pmsХ?l.!RHٰm|[pQ}֦йh;O?]:?e_m w!"gE[5h;[\@Nqjkf, -<뉼žwpgŨ-5K K)Wۉ_-A}כ;y){ !\z}UV@(zٻ >K4_)1-ph':~$8%̼ǂܴ%QBaޠX~@C [|K@ޢ1$ t|&ql?*)%uЪqnCYc[rLDN1r"͇GUMN+nd3BVZɾ.L{lp[;\@'7<7@İ[YDyV䖅N:/ Ok_/ԗl@/+Enq%u4E8BOk+m:5D>4yW2hJsymwfi&Q,w hy);mYd,U{y>|ՐT|oS 0 ii'r^G!爍2duF*(t8Z;tIyr9w>q'`*{|إ)2醸Y+u<'M9\_iĝT~N'roV>\ XA,N//t;|MaQ"DyjC"5L^B>h<z֦Cg`~3y_!/p]x#wsp֪WFDO(4Ĭ)Ay.6L/g|(^AWDiQ*fP_F&S*ޚ,qx9T}pώKIF^uTk9:Wi:N:T/7[eBG>*79k5`%>FCp^M\3 b/h"2eI,u ZF||QB^Gn.AWB3by1*rwP96 lU%e: 2qN].urtpLlIBf>Lk"{4{l QQ+h%,P .؝-2 [7^ 03NsJ2^qVCKٯc/~򏫔hkžpx<_ßkنmoKqec!W }X؊ K͓n;;l ZFk̲=<?nE !->m-7v΂̒ x1PW5~xVM,1E^)-~[Ś?F [/K=_椖xZʗׁqV'M#-v"k.4zhWFA[qo'IZQtU%]*ɳt4.-RƔE.v!XϞ?@+ >BYzf: Ce=MUbw6(EnTeV01n:4 OSv F>D_r|#:i:ת'݋k؉֌zpVʨɥӺZ2tcNo_z+NJEo"&2B>"RSo5C3-Y6Kdhj!VkD\L]LDNF>Zsi{r.Y8cno?!ď6h!PB DrN,kCNI["7lj 9ڐKSOu %.jXM#A/pFEE$9hZSܒF^=JI&|4l+ 8@-jg&R[LRVÂGCYXo5x Rh^q!LlBNO "-@d?Ƶa|0tBˉDyC|Y FTI9.pr\֎r$|5䔜F 2(":We#q>*g5C ]ct9G[yxXy[Lr"-WgUSȷP>[fP .93M43 ʵzZ\$6$?&טsJPԧWr"- ,ບY )[Y '#GJtSro``_rp984A]. KpwC;[\_w3VyPASW"(+6CNdk9`S+s8Te) ]^^ y|&"}ehM/vG67X86NԱL>&Wߙ.aJIvsas]\vse{&ؠ_o٭R;=_~틙h)!Zj)*c jZ |D\Q_AD~F,q)D8T$Nl~.ONmψ-ȗIvqp[27wXr[R#qTlE15&iЖVz8H66}s4.gdf]U]BFz/Hޕuvy[Vm %[g!jQ =X~5[AԊ͵VkO\"Y6(O#h .yCN)'涜 aէ]!Ţ߄8kYJlH \Ƈo)6>)*ڣ_&`"?[:K^qY,:S}mlpDΆK}Dk9OOd?&͉МĚ2 5ڹB Rgsq@{pD#:'LGtAx@vNPyKc]&\U;Aԭbb  ]m.mjv\=ȝ1`79]4^IK{fs[%Mx}p?>/;rR7Pv *.=ҡ$v^No|B_Pz(433שpC"wX^l-rDMO~)RD쓦m^N{v=u,3=}諊Md)#}&W-U{'.Ibh!~"O6'h eĞg IqkY4GHhϭ[=ܡ7-oRcKlhq7Y,AJmm/t*N U-#I+0^ Sc"Z9eX;кB.瓄2h-K:l.؉2m3O QMo4m.-/+re)V*}-J'YŘhODrևU$f\g[Jȥ3kIҾتh}pղ7ޡƅ<ۣ/:~T6 A %I-G>BU++|ߧA;jX pp P[2JB ..rIQ.{-\oY~[Wb" ]G: PBo U;Tn/C ZQ=-u`yv[hy9/uГ }=Q tD--d_yH[h1QRO5p\ [_Ş2}|,rX>EW59_6oaikުTF o"-aV蝭~XRo¶|SSSE.#:6N)_/rM$>WND{A ]೔gu\SL!ˬ8,aKfcw\$wXѠ '9/B7*VEꚕkTB22NH0v,FUx/z gd[lUL/iЩ鍻eV^r\[*)E0Kke /Y[yei:^.ް:4/^׮ސ{f=sľ;2Y[{ @.w{WYq}Em&%\O>>OٯZoWIn"W\ȽB~FP<%^]Ϝnc9̴$l.3 9FK98O/Qh'p7<nTtrxYɵL-zC)N`rc5Э Yn-vizSҹ7U7䡅} K[5v"ȹ ]pAhən?umR+=iQ\*o&yr$橌+ZbU['t6#3t[:}NҫS|b*A7/' M roV{ .~4Kݰy0S9 },<\,]bs0IG Y7tDxN }/4{ea%,&\Gfu:!wcowfcWTCS$1a ]( s[%o@8:E{ {Ρ0KސTo-2GqUšdէ-/T1`zNè}`l)iqUF=0fcrH@yԉ}zv7t[7t^jz_P ] S|v )I1}93.9{-cҒt*.ΑBO=;2躬.{?ӒN ESz.l_tJlfzQwC%p7X_vMk]$:4W)SF3gMhr``hK:n#ʎYQ6N7T*cxaC_&k {ؗW. ܖ9Y7rY<2=@ X' TrQ*uYy;4eJ LhڽGSC[lNK~^?i=\{ 1Du+d_}AKnr`Id@tA,kWNւOxXZV;F3iTYl.9W GSC&m:pSj G}lc#ح 09Em޲nuV8nVcu )Yb :M*L0rI9G߮hۨBN.6o3/.Znw:zD3ע~laBE.xIAuA%%E\ү^jbKz[g~W)zۈ9_F_if1/j: ~jBvz}ZWFf'|OOk3\bQzKc3Kxԝ=4Lۍ}|#v^׆EqÌ 2lj@#^kșL_jۺ虎-By|Yp%k5[+Y ޱ=#:[EcHrg=Wɫk衵%ݶ 3pdؽ[&i,?$ Ð;D#gJ G&K.`6𖩶3DX((fڍ]r 9gi~Cc֧ :~|/]Z{K-.k{uZ&~ {ux *zk=u`9Պ=^dثהy߲_~ozdw*e6T/ֳ&YR&y:r:rcO@!5)ZC]7!fr@k.С4%Uh,~s$Z@݉i"˛}Bϋ?= ܆\)JP Y$TȷaQh/1(Pހ//oWg}BIc *x.ns*u8;4Ep?>wY6)]pȽr!'YfE 2n,Egӑ#f x|<#F4c+0SeO&8m澨ɋ,:mr0a sO)*\s՟+Hle7 MON7l1v[ny~qAASat!+Օ2Zr]õ50W-8 YQ4hqFpZ1lx>@XtتMZ@"74oa| zV&A=tJQq\L 0fLaDE[gqca㢼[/%O@ef降O`_ D/ȥom Np0A<Z5+t3_qx qtm|Vp "CKNW䝡ף[_&E#4ۿ8ok+zܜ~5>#X֜r5g?'~|\w_6ti .ܠ3NDce"=g^~^UWOчڐpEzwKsE>9)y^W|C{L[4Ic}g+F9. y:΃ '\5__c/_;$ЫVv0r $'l ?|.H*gTQi5ˣWa h=a}oJ!L' أE9nfr!/h"f-ԠOq'$2 ';17Մ-vy xsM92dz|ߦ |69|{W6fa'=Wkn>9]Ȳ NXMn{.|y |:ŵ8mZtZdb u &Zϐ_IvsS7r[Du xBg'@߷RitxNy&U>6by69iCj3p"ȗf(\I[%bbyrE婪ȋe 1!w},6y0ŝY{ O?a4@ \!qfr\TV0;JJ9 Yn๛ MM1}J6v#!G)BoPpC0Zni,_Ɏ{c <P˙F;_=v* r:NW_h!ARI^Bhc]Sډ<|{[#61-]#|{X{C[hmt"(c䑖?+P'JuU_'QKRFn` R)})[4c/Poa{Q"2|i&}sZR?OWBP{@ۼӅ\3hh~V9"CFc2 QsMGZnX!@ y]-Qym]b=Z>zh&0]nп<*ߺ@nq*)q˲9{Α#3;Z.tˆN4bz[oݼB3z"jgB,{=辠"esa^ŷ>{.0?6r>.wyc Dӕ[Ztkf ^-*ӥ۸y]AF;+DNXg .\??=Dgn"~JhtX#8kv[=\c /.z& h=Gas؊9,9e?. ܅DJոemBs @b=O1Bor]Bu__if]S:3E{irhV0f7죳oCuEYibGNeA̪]m d@}|qTaGJm}C]*G?Β [oA.lFe[EUAmы x8!O"o|bPduZOqMJr)..{B\Mʷ[WXYAq05}1*?eq.W|Eҥ eq+ Mҡ^>\r5vA5(BC/26Ky]K].j-GԹ, .E:!?6V45"?FO1ߢ/w8@D%]kGm\s/Zp._o}OKpt@G7.4J 6֘e[wtU(V^+tY4z{8[~ B>KIz]uA?F.h}\ݎ Zu#-in56:6_lQvk[}|[}FҢ.uCYd]7n~. mR^Ͻg8+FKu#͚tT"ų"c9-]*BGCa^oob4ͳ˪-y^gyO*Whaq[̹QQ1JShBrP"l!%n㩑&l"rݧ rvby%}bl999b!W֘b#߻UsJlDZ |_+؇H-ʸni3ZL7]Wa6z}"O,3;9CrK;oEΌQnK\Ѡ r Gތ^5Sۅ{Yf e))gpa7I39&(*u՟cc9 rc eu\ I="Є!Tktri\\{@^_>!ﳕ,/MBs(_9 7@]) Yqu!wGC\S z#a@p+fhnSXw﮼>N),~%ǕB" wjw@3m>r=sv"hMfY#OT8QXہ(i ۻ))2C8`xl+r(ԛĝ`!q6(Tv6CJfNu |ɮO=||uuW̠h&5h^C@hm*Io$"bdAE@_DXH w[ຊ?=6ZgyGoUj?sgARG[ -RyO q^^hqtGвLe>8䲓L//' >y/ [V-e<-0oy#KM>"(rY `7~e zLR=͋ bdB@sxA%\T:K.xCWr1Ob&$ }gy_u2܍|gZ;rGv}DjťowD`ِN,5H7yVuW4 7UJPĜ} ?MS0.n J\/O z@ADD d#oʡ97|mmԲJ|yjA/w,Vf`N?4On-|˧#RsmHmo9dU--My3N,9=]y } |F08YwT2Ǯ ^͵6Wr@$tW+? ykM?#w(rR+!*n>sDQ_lV| ;yk%nqV{Cft}Pyt :xply .~>z',v"X=x7_Ҡeyx\'oVx-.fn }lBN]F[XM_fRJ䧳>CӠ-.CNAs򇏇}-ХxE3قn7b%VI㰸f{E z^kYue#OUO"%3.EIzدrPiwR ܘ"*6߁QyKeY!ABX ɇ[q[ɱB5.bAܺ*$Ѹ=/\'R)< = ¾oDY A $֚fYqhAD#y_PehoIisq1qO-r-r-r"=z"l _7[tCa !G |KUl 3w?Ѿ5 }Lj1UYb!BoCد>lL'ȏg7puVB~<xz0cw+E Cɋ Bk-5(,8QY!{@\^Dn1h2G̭#gZ^Bs} w]P5ݛ 4= ܐdz’W;!e}) taXYBmtA~R2ĥB)3V,Ae8 5DQ=l4W_;l~7@j zDN@C8NY&k녡EZ,HD Z7rv7' r4A,VdNι'V(в.D.{IDz8E 6p*CO]x~@Kutv 9S\%nCWH,.SFf.|^:libkFF\knߝP\>Lξ8-^AG)`WQ9YA^ } ~s\ko=o[R{b˶CWsy{ͳfkjdI:]kY|V8:Э=Uusu.}BD-T˄uBaq^an h1LZ'._/ zbCmn_J@E4^k9UK+o) ;k !vw|*boD{u fF.N|N̵isK YfMQ7;<&2C9!Þiٷ)fٚ?zd4v ]=؛Dn9o"\Lᒧ(G|H e |cz5Oro(2K4"[?hCŵ6MN+z¡xкfߧNŐ" EYtxjljE̍%pu} \ 4|#$ o૰p操ʅį3vZU BϝgE'Bδ4JGVej/|ͷ{b=*Iz؄5c99/+8(t:o-\PHĕ |:]]G<3ob9L^=_Y;81ϽSR[3|a,ȑԷܳD\o#GrCGhRzũ ɉ}/ Cgg^DFT_=\<)E-.~lFNJ-SÂr9q42o]cw'B?H#"4s [@Ĝ3>7d]yU-M)zZBBK9K2G.Eމ ċ:$<>6Wht8MY[#_vUʌ1Я?~ V/N*K K4\}F!9QyqM*;JO&4[ }C _GF2E3dTo> uZ}Lؙw7a[wuh@_M/Z+wFE~Bo躖.uw(hb@צ5?o,*rp\)oLy%^?SyO hC&u-N4nnsF?o:\h-JhO8E"E.]|hZ$ (Wkd"L5ʖ'q5ߟ5EJ^֮6_oyrvi \<|\a9,KhoYѧc5Z[`-ЭXq1/͹׆n~d10)$TrEE#S7V2T9ZsFk@~JWy v"vR VCM#-ȹ}x}Z5-=9JL V4 賧\卼r$ 3z/ˬ]痐Xr^AoJ/nx\^Z.ya=KzlavF;KB+F,1 N,6>ou"kܸZv06"rA&l>R mDU> ]?Vx@)KPž[$ylLZ79ͫ[gmN W:tQ^KZ^E>F 7Avtq=FldF=T)8uv۵Z=*TةyaT}X {eszyvdd9f]#agj'`]I?ZK|˦l]yu..2'͑/%k~r($Pscgp:US28_Q-МWN)i~nr 'E a ҌR>a ]D:^%`8e\Q f{#fd_h=7W HөoW4 J_,y.߄'X6is&Etڼ7 Om>36D]2d6W:EtekQ 9Ir6Z]f}C)M rQ1%.DnNX}:h YFz:ށ<]=7^CNw.ܰ#Q9S6@qKŮ#.2BE/gQ'qH}\B}cx+#FV>z4qޝ4Zg-MvWX׭ hi"CFL"\^؃2J`_S[zAvn|K,x;z[@] ΂zCoxސ^ib]=HjA5ǻ?WN9*>y:{ c0i%a5Љ\1u A!u!UQן;P&xQ;ouҡ=9;O\c%ҍ%K+sDtq1Y/!;:7zc]{Kl!ϦǁnYȻF@A]|)Ґ/F'ё &vcҦ)6RF[[]wcТ@it}SEa~B3 Տa5N3gŌ4b5 [b"jo`))Q=wOWlJBx],voJ217t.ڤז:Mh=i98jT)4 }_ cf紐*ȥ'T4n0r"{;2#cvGxaq cw|woq~ ;{ٯ,?n5jo"-7_wMudN/Ow]iu^n74xEZ\O:pGxBW3CF'/&v%{ {t}yzswckYI[^fmL[G&pfmkt@/ʁgsFuc͢F!}LV./M2GZFd/,}B{Lwu8-ňH罊-;u@إ=OB7pIЛo3iiVROc*!I_x%W .Ӂ|C^39y`o%3܇ZF^|~͛sQUs'zqYF]sD&ٲpSM }L>45gTO;2֥ ]cmAr`Dnw^]K,o7NNϢjyϘy+C;aoo݋\5닾DjqZt -IG78"F Ђ.hlDn6-d.h ԲF-oމ"Nw5i:䤑0LWo;Qj2h~#Au5>S0#c>݋z@Zi|KU췉kƙ%aon3tҮn-7tk&JV=|f]Nmj>.ͅ?ߗp\GN9=kOgz=f#ֶv{󄆯1d_^ ng*q?I]Ck7zMuAV%J#bMgVu}9tiP Iz|Flx* %Ddw}y}𒪰XS>^n~B_MĄڿgtLװn[&@S%f_wIrC~FQ7uP/z@ޝzr#MǓg5x.XB^Dzk_iڊ4ȳ C:h?O{qf4Íedmx!8bM Dgyr·@ Ā@F+.kv=G{fJ`Vx͎`u&%2ݟq\5ewoV>J=u$*(ȇje?O1ػ$ysh}z:Fi'd~j^m<|ՆL89{`exµ;)}8l9dޛؖ JyM>vGP:d~]p/*.xQ; >i؉ j ㋝̽f#ۥk5bz^s))벸 r\S)_O\/VA1Ԟ_fc~3(P(>s#f&S>31aБf$)^8%xZϺl*s}]"8C+Ġ|>,Qz䆶N- 2-a+޼9Y:DEoXB1e쾷qc<Q -xA:c [*lJW`CB/;3sʰ_=t>DR?[[gl? ^=q->KWSKr5ufzԄ,lslNc'] 5S{Suf1h)/JęHQ<#WXC;ߛfWn>K+۝4Άt:]m‡~S^wZ Tcxk%s;5Q5,8@9u9śZ. 5C{o_ހ~d/R7Yoo Eֳ UoFŊO!D42oM]v_ 89'ɽZ3mЇz~i:t|R~ MVoU2[egA^I,蛾D^=A &J"Gy{=mT': 8u%Yj_AT\nVLAQ?[p*>VT8iϯu "wL&RwR(߁|a]ʤ &? ";)vЗĈǘG: 1nVܳ]lN~I#ǗQNwfviƊo˾Ett^˝DbW{Ht:kwGtm9v ؗny*.rh!\8 a#Z1Ѱa?+GxzZ(AYz {s%]NN_FИ5_@֏6xEQ_L0ruQ 50}8x8r W_q^3>6:d΋P$^vH_FE.N| 遼_Mshwyn-^䃼xIJKӹFgOӗh:k%W>U8Y{u=s9RJ,ukY>%fT:p#]Bn&# ]Q¤9E8莝*=95}2F}:xN}f' DLpBJ=O 8޼5#dAGޘAo?&:绘@s/&Уi1wddD7K袆][ƣ }CC಑zb֤w!uFX䜝џѝP)Ro]E-$ls ^ޤZEʁ\6ұOQ u)T,'v\?R8'4͋6:Ѡ3]*_ȋ#Euz1ot vGk֨ fț)oV(3混@!g;Aor@N_|%R<2"qF7-3:W()i8xFҐ'/@\ttDW*ZFy;aJ;9 ,f[4oSzˆ޼^W1zcEOw`ڥ 4E&iyi](͏աw^`xȸb_G`.yO^/ FՅ:oFЬA'}D+tN }懶-⇟tVauRY.|B.,ZE>xBۺnNiͫЁ}{b#r 2sQw#>[8~6/w]j-C: #n.XвTkR!h苕1ZR,{'/Bwzouu1N$.fWg*ˁYӀ FKۉ:\{QfЫbYcd.;-;F{Fk; [sUZ 8Sh#Ebț!myNʉ|@ȻFՌDВ \}WgK'80J7qquH2dЪF|@io~k^!u#G3ɕNQVzD}JM[*vҸ7-|~~ Q:}ح, .r?汐[1_<իCv8g%GCNڍ<5 LMmLfM:֙1:\5_HLv`g'\ MeU8z:ZTG>IVcDu|kߥHy h~5ư~ ߫ Ъ)׈2cp$ؕu5YL: O^e^}>xYb4r:M~ir}v0[ZG{{錭kѵթpIc =]?o4,Ms .ssT=]&`!?oz2SD>@n +EVoBPZ7S|z*Ъ@}:՛ r:X=G|Y#A;Ԏ]i}g_6uz@_{Gi9 nT'Uuۢ/ ({a/ڙ/.=a e| $:6yIJí }jNE k| }?E=>S^ nU{NbLӁ3=\'H`:1bFozs] |re9ݩV$1p\*{vvk< ;9%Ի@_ ׸r0 Tm-O@?F%F.Z|O8&_%yg#߂ՠu1=5^2wڰx$:0jya/1ͨݾ&_э}?)R.4;/aI)iy- z%5/ݹ^%D lu5zx^?Fe Tc}ݥ>SQNAn2vv7p{t \6-Fyf|)no4ݳa\R[Qþk{͹x`f_`^cu6pN,2Tsn1 cZyu_4Ӌ; )N^Fb#!Q@>qΙl>B˿byED1ZKwK#HuK]'*nt!~@'I.a>r@ZO)ں(t߫ }_O8"'z@l{A_ɖeP5yX67R4dӨ86|%qC3c绛1p͠ ^RC:t]Gv"Tk1 %ǍC#S!Ѓ(Q%2}F3hN@͉t4/Uhw}mvQ؇lY끼zt9 хJ=rDGG~FØ_d|whu_X .6]ԩ`0tvCqg`20>%ݫy|9ǣߨ:{&_Րȫ/d c\ti ۼ--A\o{10.k#3y.ڧ5y^!g/fE'M{Le Z-/ vL$#nsU%uRɝ<ݢG1b\4/c 1 W#+ёv5rےEȉz5*;O]$NL:t]TI5wp#t%[JO%bɻdE]^]Fd7m@.R]SDg= n&_woً]$kx# wFm˨7G1Ulz? a&AŤMEv*ܙ1}pS]kwՁ\cȞ 80 }"I"YcTҒs:CmtkW[0T =}Qq=Fsg] %]O\Ǭ=o4cz@cټ:ȱqK2l4gz$#_d.>kkl-TJV 9Tg46$ yTE ' %m/>kȡqz7}aAROЫA쮑&g!}.qW'4pjhJVq|n~lȋBHk=m]æ*xm%G6]^xBפ7Uqec|#Yޙ4{|ָ0YKtf+ϼF/csqv ._,u a3} s%XZpmN+w?KuO7xAul-Gut_L] Nt.БoCK + zk͕"]!;oV^m4:d3HF< ]n#Oq\]]cghR7Ksҭ)2uĽk+SϥKGO+QeZZѤ3>9L> hf+g|CvBaz TϔeLh|ꕡ je|5>Q&n.$U"A>ۘWv~R%CU%Ulq2SGЬVK8X;'IKQh1l>+*TkƷ,=8\k=}<ȗ~} }TTz=Gei_PoM>v;,rXȣ/-<)4{m>h~.zwPS*cc艹m9=]Zti*{>Bd>.}FlFt ̠ F1z?t cJ?žbcgtFWz~]\ [&ҡ@WNFET䖔2s`{HCr%(3A:S{~uvbϾ5hwit_Wۺk }~nѱ{NT\Y={uuv@޷ C_پxK.*'ͻ$xg* ݐn>CUV&5m#_/1k4 齤>RgBsAF[nmь,76]f&2JjNx}`d(>) *JQiW_8sC&WqFqe#^Hb4uFh|@ozB,*#-e d[acctGvZG&pJƗ|0C@|֠ھm 0 &]b2t9rw蜷*FnV)pQ{yHOz[=޾4 [Z%i#x=M'S޲]! 4p$q#I1t\ע /zzK+kQ mdcH)=^ϻl@W5gLYfD`l ybot%/#$k؛ID:?^8A/F\$or޷4dRv_WgZX}a#mt HH:q[_i;_"HZzǦGg/{ J?{1 ;1}=wk <8K?\Rߛ4YjVlkxIb'_'ݝQvtVrj{{O_< mx2+NVM 0rJog,EJ\_:_WduVv{&K87NJfdqY#+|y!f΃5-gQ| =WPw:>Gi~Z>2$,F7kw*fN3&9 G^Lз p[ {u v/xCF> F&}=WDk3s ށ6v4WHn=v% %sN-vd^cR''5VV3Gݹ1}^,㞅zi&dm /koMZN 4ǖ)pMC/Y]+]Zt~@YQg k}^_7ɚ)e;,a )TrD:Pf]5s;5!̀6NJAZM-&iЕ_-_=Uj#bjG*@4FRh5jUq|J:MwٶeqFn2NXdi a0V'i`!lCfsp-{wAŪgf1:>Lu Zg=s8~auP^3%q>U&v-V#9mƍv=@c_?:Xjѽo5:aTZo^=D~Z|]bD>c@Lok{uJÏw0bBOI<?6%D~S|!daLJiJeS3KWk7̏_smŮi&trw&bm?oD{7f79\vOt!{k"/R>G= (?ncMC_$!8ﳮTDkr} n_- lg.3O*_lz\GY}ma&8]Ǐ/%z `}Ty) ~{w3G 7rkuh)I!Lj͏ЕfϠBC L\ {c왏u9h*c=KczQK0d-HsS|3 D}"k(OP=třO>sxNS'VKGK͠oa[&íNh-]׾ڸehְBǚ$Ӱ5ږaղad VΞ=8 FI1tfGvc?N>Х_ppk؝TAyFC-ȟ]B&%+凝|7w#G{:vjF[\&>TB?1PC E!O+{֮#\C;6v'aO=e">|>#(OKM͠[b0FlǖֱTA܁]`5T6|KB_)43ŵN%U&ª:n7ߣ]3{썝(c5h  3(r7ooLav/{^ƷP}^\f^{w$_Ak]m7 \lCh ; YXټ[~^Ezf*;?8*,_%_/_@%Y%ѡ:|x%6Г>?,߲jKoM3!恽;iΩ0U=/L3Zk+C zjfC^#Ьؕv/]Zs8;*Mz[z,U?}bX#j=f ,AZ,;x]lPvWVvLDڪ_웡KTV?{447BjzRx>MEDM>5kmK:zMWhﵴ|4Ʀu`W_؀@zS["f'o,̂\M4{ߺaZCMtf^|_Cs l+"7U_ O>c>µ/v)^.nq}7)ȥ2 :5{abKk,SE4bo1Hsɚ6Ji2Œ8ȆE>ѷM5#vKbGǾU󱕲OKt|eK5} {Ix;a_>)WU&_&MB9YrQ'v j5>ػNSEvMz]=-"3x9SAl]]On߀N/JymЗ&twM:^wjIF= dQ7My!Thͽ[0Kgdn }S ʢa!~S^TREi%AK~3_K6;-;5$qc*|FޯkxTy{;Hlg IaMa/vvB:5} 2LEvx?_ƾ@v'޿Sc-xľ4soVXkvu?Sk:k @o'L,iQ  ujFtlJM4Rtv%`\%H؉?FkC3#:n C7ȏ?rd&ӾN u?mŎVĂ>!*~o RzRP^lyt*r%&w 4L8;;cYBWO|}F3ȭx_kTT{<]WAD@O>׋OrhXjlg5д ֤`O&nxɷ]}Zw'L%[d3\p}][&hm%_uw[Uozd'i_/>щ86ݥ2x㉪dn5zMG|=ں$(xET<z΁y{?<7w}oAƮj"w : nQtް>ɧ}d$~u'ՐWBx+cƕ9SJqB$F[eKM%Nvlֱ/7Et (/Ƀ3ɏ(mڤeg@5VR /7K7֌\IA/sWv][\<藒pJOvRkk!w-O~5!yA_y(tf07-j"[! o-x ͠{xJ̦o9yE~y_bA*Z4ndЂdwFՍ@>J|,rYjtk}+yͩ wE.;}``"oKj!_unpA?N|Bѥ+G֨nY-E />+vaҁ9m)"אzyزc\{NH<,vZ]mU^J tSgMnVv:تy? i_Tdo|1CuJ\CՊzB<$ozd=I&^,#kra'v;]O6;ZWVț3x&dΧ7XO<1×&%?~>!KM 5Z:&պTXŴy!H }/{oQ'7BwNѧ ).rؼDd aB,yHrA/,7v*:墜m=\ge#KNПhtZfQ1S?Dt5i'PB]!{VƁe|tȅΏ.OglJuBY%*48u#Ze)%Bd{,Ҝ=i`mvCkQKr.%΢A]˥jݦ<']g@K%qvdJykj=6z"l1Z5Cț$: G;34l蛯3=r1>Ċbt1>7߽_W0݅d]+w|R#G:5KJ;FQjG:ī :ܕCO{ūa_]HDy?*e1NoڱoR hrz4> Fv,-mrvͲNs 2+࢞`O&k~uum;j}xF%NUhZ>F=]<@"or"}LxemcTŲtudg |;5ݺ'sL9@z ~alo2=P ۳+y m5-&&:>Aa /_)af4׋awG7D2q=]~QWGnwЁ]{Mjȱ4Ӯ }_?D~b:z^äz~D^P.? G=5{%,et9O l}B1nIbx 4VglwM~ _9z@w#Iu(Xʥ<%ԥBqdsddmT4bz,T=O okZme- PK&$4ΐ*~8D>5+u`Vv h30Bu6hICN9 'X]h&nh\w!fkCZp[^LFɰX|@zz5Kp+0B纥7򸋼RuW 6I* bLtE-zy5EP/9J@O>:Aˍ|+އι[2^B߀]y@taȮ)O$]1w«8RFmD^g-#əum.Q?Ky>3;ְ]D* 5clMCꊽ`<1j.9#ߍ vv 7r ߇Tq@_:q=5FacoJ=!Fu6vkmI3ft}&xc `Sxf#F *btZ&շ*<}9˽פj9jv"7\%)YJ3.L15B6 ˎI=a偼r|Nhr אiuQ>6ewb!)6@Z7GzYn2 9iyM҉_BwPdز;u_@"'v/!/ :QƄPKaU|umtҽR).[鵑}^1:0Yݿҙ4#5on'uQ 1@u% O[y[W4ĞmEׁ&-7xHp?QFOH랎.o)+QW;dz\ٙ 2 /s%ؑk8:[K챱VBN7ۀB,r} @V!oPFcmJ֨|"W;.~s:v1zLckI+k_B^} K+uݠ;tw_VW2WtK*@VL%w-0ACFwv#Hd6 X^\dpH?b@7wvY_$_wl/R)LU8 2=c$w1 V_E\E~q/俋4 +eDoZC;iIа$֠g.л Nc3뉆kZ![%0[D>㭗`kwhk9>> v3pѡgt]E7Y.f{Bkks*9EaR-z,0Cn;Ҏ}QN,D)j4L_6Q&@y@݂4'6>zu M5]wagX0=NyO7hH׭W_ \+t_9ҡNY7LcC%(Yӏ"C:L[o Ƞ5"U뢑g^ՆĠd4>'C(KYAX]cuyBGkd@dȘN CfGev@ZNN M`:Ҍ_Z,[m[Gk-9jœ/m }y"ޛK4lg7DFG~F06r[Ǵr1\t #nG.Nwa_V+hHHRzaQaF>"'@Fky] ENͺ ]G)X"F[^TN얤.}釫h-ts%owb#< $̸;쵷`7r5¯ȉiUސ]R@,Zu !;z[]zoh,F{Җ݇ܛR<78y y0tgQ*\M83,%/kihl3%{ϣ; eT:׎=_ ZR 9"IYh{R5hIc8^>~F`HyD8ŻյJRhs;S,ȝQNΆ..b#-@ϊuR%uX)]K|*,rJGЇ'.w5S;z ]^4+:m{lG,%)൑WM[|(:K/>?V__ݟ^:^)(<)u28Q: iYG3VT6BO uD͐m!cQd@']@GŘb? ^EȇDA#|4.Xub3z+ -O)].6pu@Ka'x'oX:n/tE%[ż+D7D:n|5ЯP~(?Җ$0tNҠ)EcEz"]տB\lB!5#^ze?7/zB]^CVM@޼m1QlAvfp) )~gn#K]]Rzu $^6R:…>iX)~-?Ri{>ҳM+#.S_hזtP}cC'd |ф%'tvpm>]f~cu7b1 rT>TX zK+z+D߁SvbC߮'7J)t`)!5zOΛvuC7 =zo%Syu__ӑh^6pn4C8uj7BmF˚z=}!oI2 ZΥxqO〾0{ rB:bTxZzՠϑϧnI'Cw~[^}i|:Ni+:Yf.+aIK}gЕ>ʪsg)q) 9\}@h$rv@.Yyw> gͽ{x}ÕEt0_lrK:ЊhnZw:\!2>w "z\/GthmšXGt|_fлbcTQ {^C^^Tq2!Ai9\e&Z))V& ruROK|6߰)yβm.h I2-B$Q{]MϘ%^_vEhVxB±,jed?Zԛ Nk[3, ;f(_y+I%sn:6츢J,*tr]I9&g]/cmO4xU؜* |\RȲE6hu<*+[>03+hxn)ZM2W8|~:;cGr˱["\Xm*㰹`~8KtE/þB\2lz[cZ?޲j-Y?_ t q5|*[-PںtXڬ?Aoe3d&o#7- |Yۥy0:@<ʳxrkp=@;9Y4XƐ#7pݡR^5iwgq=LNWf-KAg(麟DYz INeu |-.v :r]ҠdD1Ʊf: ]3o;|7'ṪC5C?e3]ҡ+^.ݰ-G[OAyCC1oO.d 7u5;j ڔkɦ!R:&Z5ZbU{arF7} 7r*ޱPOqZ `^[~ځ_Jo 2͖n܊7G@9q;w8=6p KùzJt[*Do1m@N5,xg~T~mНPJ->-uqG0Y.B|X@'}4 \<)U~f?+!ip*~0!*왭+)r?ůh̐+xXXbyOʻOkOL: .rzؼNYB ^s l'r,UR2%{O)z!d>EWy~"[ԑsq  3Z+Z'I93c| =1;eu8q W3yuKtdg9ٖ>)ෆfz;7b/uqKx vϜ]b2M1b]ao0{Bw)S&[]Xg:{į /hqi~nfNs%R9ŧBoG$4w]ijNe&Фm!Buߤ^ط<*4{/軫k' 'wCv}^h>s^󊉬4rF>v<k-~Vp8aA.u }@&>DO|d(QKK}p]پ1{U"OJ2{ojɲAuI KIYvo^5Pw{VzVцF߽7jz,%KFe Au g2C>L^]}tj{9&7UogXzī?F/ЧMmbVf | efh4~zN~{J.1d*'v{F4L{u1?}>UK)2/9y:LL8m\]sy5ڦ/! PzG"1[g:LJ Z.q..\2"H|؉F?]*M- 2i'~h5p+\fVR[ָiu ^ufֿ$ef A#sJfSj\ˉ|z;a*|B}&l|Jh oRK`l3Z4=AG5[Lv"VRrldT{՟%} cg;H׷F @o&7t ޯƇOG{Bnk:Nknn*Q H^.U Y=7/fT8sB4<ςv7R{s1MqwjsG6D|vmuKܱBRi@gs`nr] '^M3yAZ.^RοSr=S`S/`uwq!Avw 'mFh5ᒆ9hLYj}՗gxb);k5~OU䯔$ aG A<݊ Th#=j}$&qb=.Z5GYAg+=vQiȣHpzVBNixT>޽^h|ߊ>;;>\mv|N'^_K֨ tƘzb78K+ B )Mwh|!p"?[i@w {=}7,K zJ&ˍ\J)Rןݘ)SL  t ZԬ*uw_in^4b蒩|~ɻF#bz3=ԙ G!_ݿln!9awf}y1AJsF[4v~r-91\6R83G@%ZCKx`o~΅-2G~E27d V*Gbyۡъ/໡L||"TE^>n,`KzoŻ }8.},ޮv ȢWț/E𾀳_q`KzXw{] n޼8AKyYc -I9{AT`Qs`s<##TlGP2v'p*9_g0If1L%~@!q][(K yG{E ZhsA2::'4wns7 7F+0FGHOTMVw1Y\$7rs3KGQ"FwՖש3:{A _5{ȷb/cݚqs'ȟ'Gh3߾Bx+r˩ d/_p;3Md2Q??Ȫt8 "lqC@'3GH{XJ&F(6EIt0yW[,|DъXH#–SO^^\Cj|*Ag}!yȞ\HyFI",1r2kC@b"#Ds7u/T% _|s Ip6jGq\c\i6_ _7e04QnzyPj>s Z |\$V^EFov &СƄ Eܑ ~|Z||iq{z(sDN1ZT6ޏI_kr1+^ȉ~UY}ﲌJӕ;OrA8wc|]B惎!s j{&ghyS6x#>^K iK9ltjnn,CM|岎N",L:ki0O|ao[O"+D2"gЗZ;_1J]K8qOLd:M( vaQ@+O۞3¾Dc1D"wWew*ow_V_۸ójzOWAM,r\+v\#Ȼ(4 (<条O+{K 'rgZiAGDi< coߴاbIR.Bz^x![ý`rfFNP EQo-ez>qK=gŽ8w~'m̈́CxGHf]lea䶎^jC#D6j&- a?4Ŭ&fُ\@Bz l׋pwOX;)Wp78 x󱊬`lޞtV$+*c%l3smѾH}͇s䪳x7]7hRa5V~|uD$DHk3S74z̷eh̹!QFN!𸮂B/}[VMT ]B[>_<"a;βΜa"/O`ZjOZ3Ҏ\/Ϙȉ2jl'rZ' ܃^Nͥˀf[til0͗ x>B 9W_ϥRͮ'=8AS7I-b揃}>WB<)z@"g#RRe{¢~@; -~@ w'x޸սuX*o9^a>ơnWȔGk.X;x "W4lugGTFNik=kTgk&M tx+!"@34^ͷ<6d~g"CSZ;qiǕirbggY nr'd |zSoyMe@>E5qPB߂!Kiqx 6߳(5/N僎+m/[rk?H|agTk0JPv7jK#\gI?PhiTB>NMz h xӮB{4 <(9:_YW9]I݃G^>@M4wEYJwKGu)nGXQj jF>< x 崹UhILU6Pf=]$ol`c\Ɖr*tBهlWݓn߆u|ŎLٚ@QjT_j|Gj+ɣ+xܢ\lPgv[qϲ޼߿&,k|yW#lZ| \Rf0vQkmRp3h/ކE3CC (B,'CeЍV߸֡ $wN4e:?M1b6=B9L:wz{hvV/aϦWAǥ89۶\UT-fa7ZK"+.\N7Dd,@^ʺozK'ȡmuS<\D ~1@5aǀz\\9H2f0_j+_p U84+f`O5qoO\ƽnx2rv:%| ]Ұyo$)f AmF]odo=pjҡ+pFyk SLrXo3QiՉ k'0.U*+ͽiqu27'Ha}kE\Y @d1?my,y硔 fyMo_'؃Z.3eϔ.%#=P\_97_×<}qx%ƚ|fn-K x'捼f3 ,!du @fؚ9s.& Z՚ =j]8-V@>!g&X|{z9yf>MZ[w,^7$uL$&p z9x\fAͶ%|!/q(2r#Tt5ICڰyKY*x>Z]>[oŵ8R-}I@nyЦE,JpkK6Z}e- "ˈH[z"v&$4ȷ(ԖhiFno?aQW-愐*-滈[ v)o⣿Kr9Z,8BK!ЍD*[nvnȻ^'G=|쓡5]r"Z;6_(b\5 7Cc,@IpͬUuhy^lb7rDBbrqou\o6-VNkMIss ǟ.Kx#WrZx=xރm9rYPKP ?ȃK :3ř.-I ne!\/~:yWh-2]{CjKN.UWF., gJ!(8kVn[Νvb#g_!qn3 A?4ZDUh͍M(d6w#7VBGz!Jʔk 6)P`':1" Yujʫ5?W"eL7\V^+ЁEOe4kqs๗CxcEv٭yb EnmK4.YJM.oVfZ8D?wE$TFR^5gO!q*R|C-*r7򚴐ޠeAr8qcF^P; +q cp Q7#Xn:=ե^fIwSTwzh_5 ?R. qeCu/YPdM}1W_-\_Pc %oHlz6ɩes]h7䘸Ml6ZfL2kk`cyz^QZռ@ɨCoH }$+ѫF80q*!ֿ invwOb:-g3o`38䵮Rd-6o=RI;rﳦ-AR%T/?I]ݦÝ1\%5[E|e%PjIBsK:K±c}LNd[-Ց7p)H o&FtOѼE719v\][|*~=qfGc?6FyZY)2B:"5/Ejd&fkeE63"2b/n*FZi9ʰu嶥 rm5 7*̽-k\忌yOre'= 譽F[]W@Yyd|ȍڥp l^|2)t4R!^;.R 8=e*W$\(޲LTsi)ڰO pnvn7ǩ,Ukۅ[C& |#:͸&wQ6=bVBRfNy ͤxJhD.W-y@)pZHNvS}rխJLO:ʟ:  I/p r~P_+SU^w8/"?z*+E RE$dҁ2/ƕtԴ7yyK/!0)p`!c&1?gSD.TXE6Ht dp}2&'m'~"s?HesY~5,BCןXNAHE>> MpV)[x.~bb4Iƾb5NeȀL/rQ):.ӻr|(CXYln<4[ckAwO{ٸ''elr" {1QbFt h<b'<9Ђ-k;1sYaO@K*~гE4 (nG;YТT܃)gs{t&ϕI3s_ _?+>-s r uw@sg~"ߊ2%pp|w3YsguT$,<r_ܧ^VB&8e!o)x;ߞ| aJ}j Z2l$+%'p Tfș #p}8ܠuq.jeTlrԡxmxt>C-N=}i _t{ !BkpZjh}o['^9 w|;ԩ톦.~WdB/϶<~nIJMEI8Ǎ+T%i[u/zx+9cFΑOr%r,}ߜľA)wSM*6X5FG&y"L^=?OE&jF uhҶqpYy.HXJAvⵙFbž@qY72E$i7}ܛ+Cn>ϩ rb#1RVfy0 ^W$νvbFФgMޢ'OV!jg&!ɭMU]NL4YNbyL0S%l8J> 졐RptX:xl^?dB|[}GEgh}mCp`.t_YƷI&7:S"o~4TsDOS\Db7d/}MWd%(+> rmp Q!M|C,&Q{o,Q 7p^ -=voK Zd)I#T"OlkV:)Nĵ};˔'r^&wlF?)Nx<?%N?u[MCyZ~5p?P[K Cl,˪.K(  \rZ ϽW)TSI Od3kM܊k/1:FKX{D1|p-e)z)QNkZ֝By DS <N7쑿L(BY:tϖN &BF.5|BY2] {9˚r]4\-_κ4%Ƈ {q=.ˣZvo5Ω;lNX ( }ׁʁAb9%rk82+D/*\G17WJǫ#^jT;vϢ37pece 8*5叫X4)nK=SFJuJКbIlrxRbr?d%[B6U,*}-Rx辇XY{^ ~ zl&d'r'Y2Tހ57I7HOLsk'핦ۻ:  E_t"۵kJv_WQ'T;h9AOKOՈkmiz$Œ"J6 ?Y~OImŖ[eosSx+x'p rG楒&Ujq18NRډCZ$[x) )_9C`wimO4&PΊ@^!G #NK}`I2{d"oo[e:/rj0XBIظ5n'4KepVy܈貸+>;Z&Ւׂ9~4G'@^ V/\zaRv;Y ; 溈qšy&,B24IK :H=[wBҒ c8%%KAohBUq ġ]TOsЫ#S'4Bu_ͷnvh;+ﱬ/<58e{to_ZFnw5(~ځMrۼJ'EV/5"M;mydr]gɍؗ9[($rvdmz!~FKB4-IrhiTǵdy!]Б{fdſjXs7]eJQ] {o@?=nB:IYF#44/ Y\@f%Zr7 m/)4\%4t3qd>JBFɋ''ѿ%^܁}rM}k_䙲L.0/kB' Z/aC RHvU\Vb}.~\ \ tfzk3es~q|9cR #c!hoY7F$ѡs- VM(6LT.ʓKohkuS Miv>3hdO侄U \;OIg\/ov{TB^_ϹJ\pHʳ |/ՇzAnkgv$4NI̵2dK\Vn۱_}WeX'+._h5qnyFտ;CQu)t א9akIF 86Tfz{CKSGM[z,iV<' ߠq? UW( 9¥UDq=O]9]54U'i4bTq9G}Qzt3\#ʔEʺ7emrZ+d'rysߧ B}BW[мQ|TyZ8!IO_WyJA[hx榭`rNp@N#*6dOimְ8d2<z:8Lk!`|ӬY4X#UD,4o}q@!=e7sM :rEJL*ogC96h9!h,b́q&ĩjȯeѼpӣ,$<-y1pPi\z B,/gVxVbTzuA>ʷ) _9hۧn6y [١#w_xr %p8M:F{O9Eӹt씜6Ϲ1utFVfVM6tZd7rYCYJ=g9Oq/pf95hgY۪]5\*/tB jmq[b9E3߲ou ccٜ |+*ԓ69ApLto[~Ve?nQM0V/WLҒJ'pmQ7ƮzCZs9K 5l7mEx+Ck ʼk^WZ[|Bn-Cep-Nbt"p򑞛"ߟ k_C+@}/#Ik[&hȱB ; ,+OГ#7Is<4hNEmrlN%g5'qk\.ȭP58E㚜\NymeBJswa:p Gs\ͽ2l_Xh4U;>% OJ涞^HMAK!og1T*ӉY;r4e'r%ʓOƻi'r_~|KN)6}}+t0TJ3.PEn5ȲT63/T킾GZ?nܩd*|[4,*)U~zy HбQ/Rf_6ԸyY/wW Lp(۲m1,WlӉ{XKsTT3Z/nʽ/,#ЮBsv ]C'-)Soz9#䃜B2 zM.QiUB}k֑Sn'4K[>v~ȃXq,J\/'Ns].ElaoRzpM="{=guܡo-ټȯgp[܉8F.߈$ZI؇8X}۶')!zSh_)t5@ޠTڀVt>e tn);ۊ8O|pv->b>nbe*~&5>f׻N +nD:U6y@F+)/-|AipUQ ͂7;-/G4IJ͔xSrU`<4n*;3WJK -[.N5Rv"uP-^.|σeD5N`B^Ax^Ne-pt;vDfdip#..vm &oOX-➽Dh+M{$|wA{,Խ]ATjdFѷֆ+Pø92n sʯvs\#VX֟Gγ`/Fk5QHZ}o%>ZqD 22G*g}cZ[\ t,Y,IA{e?LSr~*Ff,!`/s'_~b+4[D?5D-0[Ns .'Y:rg NTSdsShXR]RM; ,rnkD.=b/P493&nkES O VNdtkS2nI ďYz26&ǩB$mQSMׄDžv~%9~?؞94r}МC-f>G✱O:\k:[~B)z*ti|aoYVE֗ao In^fbJܚ^ke:A#W2/P* p>|ܪktds#|"DN7ªBoZZp5!=Dgn|2*r!ћ=C3N.AeB+A3M]!5;Bxk' Wzct:.sYL@s6-YDx-\'ǞIZ3֠{*{^n,zIb=ۇ%c;g$.z D#^d oSm w^ELNI=,E-.WxT ,%WgteBܰ@_d9oySϪj qTZnIކFQO !6iIsz,7'7d~Xu8{q7t]ޠD^O^{\k@>6\͚3p-?|C{^^}5o;tX/'R_ΔZׂp΅[_|n\h^\+e[&}W&!+vQ4S\NXx˚oVTGxϾ;CQh qv"5zZ1[38i[.ƗN䲖>eի-26Ai)cqC*ڑ> rܲxTt{QljLc|%+m]gB&jYj{.^Iʁ,#pqSKlnKY崚ui 4>0Hb_=DnuZ4x ]QNthO!!,^򦐽ɤ-|ڡ}&_=`b}{,3ӊ"Dȭx A{"2?%VnQJ(Ek|^<ùZh`;AƄzYwJJ59uib6~M}̳Y,r-!-6@SGk*bU9s2ְyi\l22Տ9 ]>"b.}vVЩ txSuRxu#Ż-ۉ| :Ӕ<$b"/uhZYRU:CO;kVxo"Ƚ8z(9ݡT˺"^tVEW~}-+z*29ۉW/N]_P]5KL޼򾇰\t78|CK'A*t%m^cv-ޡݺ%*7t][>SkjߒUd2-z!縙d~\9B(HT=}^6_W~ޓZ y9Y]XtSH#3$C-ݛ'PzYe56-֑]oB>ps*4c[FGk𨈠[{ppx~NS/^~)еPBy7lҜn#g_Gd=1f=l6qM$}k< y^EadiW38vBTz|wB+ vydj#?B5{ylK :-v%h"Kkr_c[%hy*z~[jfW9+@u\WMQF!WRu3Z9˸[7!7;o/WlUdJ/<7ݶ&~AonFO< t(|e;#[eo"r|pW%; r\|vj:9x_Nrh>:93_&U~:6AN&O$߷6okhAyQ!.Ny|Bm6bž>q iКÔyOlQlrCB[W4@k%x-౫Nv # tr-}${G"[w ^gwj_ J~.9oCIM)2Cd'FFDz FԜk=Ĝ8ƤfFpo3bhzeoYcqV^$2\S<-Ck<#H oлfl:ԸGwln >9"g-O~B/6ع.9`WYFY~̻)3%ӭܾōY7x''NT^[u/nroFnu8P]j]0\uhA~\)z"oK {Rdy IoI7"2N4L0Hg˭Dh$xCػտ:%mA( Logɍ}m-0pu&ȠXS;$QC!sxDDjy3_БBF^_b?%h2?)H3%/cd}"#~"DŽU5x@rw+SЉ{VNE>IN]KB6*zZ DBucZoSM-S8_NDS9Ʌ̠rY%Yzn?&sM f~\}H(}ZhRq0 h6-_)1rx6!w*ŭ dm[Z)\\Vn x?)I̫g6>2J~Vt>RXna#SL(cV]%Z:9Dȟ'S4Y\d]˯Sp_{em~':iu3Pn^T^\eYGdYɩt:{U6v̿6V8 [6Y3MdK)F>qN2:$TnORsО:GEN%+ ]?8A 'ɏr'Tb\(b}؃QI*%hFn|вmrB57CkFjB-7pYTȼ>BدP+'rjlwDډy.<2\ZHߋSo}1ZG]'+eݠ;D=BV+9jWj2t!XXr2$ֻ߂8Bi9u yVNk={#5,}}Y܎^C Y~"?UoC<}ͪv蚂Nf8;$%) 8i|!l'O)LY)85zm\S#fmo|9 nVh~s!Plp?[j{fqVhMWO'Lb|s['yr;se"Bþ'pסirk ?g>}trb#/OK|ۼ-<ݨ)3w^͋SOf-hV|vB} C%u6rYs @o'[GMJnmْ2r[O =\yߪ#B>L.^ |߂=jvY|@(Ԑ-N\.IOq "jMV-O$^zN2BSO,+#_OE1 f XըB#p,hؠil~ՠOy>׬-dNʍ<5ͱ%j8L vܰB/_0yfly_r2@g,qcHhHDD y O}:ɋAkދ9z|+C<:t`֮ʑS}?m.Ёk$S Z ]8ɧ3AngEr}4VJߪy~uYBƇ, ];4W e-ѱ]@]p80 \b͠KP/8)z>s|*T~j,|J. 36^2rUt"9fe2,ۨ+9e]GE>w;-ؗ,X y@/ Xpb:[W߰n$?h2!>.HE&7 yYM g7f#JJͩR_FoB/ RWM` ȷ.iyJD"E<dZ|8HAnS9~#0Q^,tڠCCi|+m,yeq}Mȩq,ҡ ._!KVԺH-jg1hX=hi-%29FBnd#@?B o;vR@nڗE~D7) sV~nC.%,.svh6yIԌbg1m  C9^M MKyWd6bhˢbN1W+2K{w(_'&'~"ץ9\bv!qRo| @Nh|^\;qW@F-ENY=dprd[>[eׅ TSrPNm =8i3t4Ek[\)]z?nS<:WpJo1A+tjwp}%N6)|[p*z T( gBgIeLXB!5W)'HO4&Z6pYVOYr[ѵoۣ%l}f$56tdcܤ}%d{@g=PkΘ$kt wOSSZBbZ]q#[e |.Dʢ'r4:J>~+S<g1aO~ZrZ{-'{[/l p}ȁz%brtqij.KjȡQ5 l 65;o82|s) ^jQ'n-=디]ȇ$J\EH#&B )jU"7 is9Zdp;fO@q%f pf흦Li8} &d=}EgGF^1yVP~ƌ"Qˣ!br[d oND)tj5>E+/o8p>ϭ19_r[CNk- dI!sD::9?\ ^r jȴ uH0ˉ r;y9""-tM_͒Ny v#G<,L%" Vl{TpOzB,ucwd8CŹ CFFlTiQ_gY˝c'=L.Xj ^|r"M"R0 Z.aqzj%뺁T*pqJR`爳r|%B"|{[+M!{Fu\QL.(#,~p z\7hW'6CyFWr$47?wdmrˢځI&r5,RC:Bނ2uqKrG Ǔ',y&^ىV̂<׺!a :ݮ-la{Mh8Rr?6)]O=g{53ERn*{ =Xy__2y .O%hbܔ93ゾ$*dZ1f$%~"8I>J Wtms^18L9*g)Vi-%xp&90p(& U: 4|Σ,ˉɯqz)m,TxZqMn鴀oU>%1yK! PIÍdIxJ t~ټU)Ϋ IZ8? \j*ii!ANHԜ1&ϭ-gO]6OyvW$-%VTp.}#Ɉ5;Z6/7>)N6|CmNkslT;eS@/lWo%)FN+vC_V/2tjIN-lCDz/ir]]MfCn'F.Iύ\w;[9z9K /s' >b*^GZGhph#K?\\'r#wXL6xMv6,NћZkSu#縩B;E>H2 ܰҳ3˱Uk6?.2teq7pRshf9MyM}E$&y #su }۶'p[IH5mfMs'pJ8"nbZHj(t51˟9G?T^G Pf[SyfXֆF|&,x?F/57pMYYLdoGl m>ܒaK%Vp7|[(YʊMct)΢,X/gG1>ȯ4~þER//GC>?2lch+nϧfMӧ ᖽ wa{f UZ,>r>Ph9"15wVYpyOtAY%=~>V9kq>R6xUn-Cٻ rO Wuu>E%4sVoͼveMЖqe83B`sډuIIV"c 7&?[+MR qMd_yGK}sp{sKZb45N]J}IӪ ]rv))I-oa\RtDs,ܠBǑ̹}gi􃮲f*%ZZ;8O!B&gTyJͲӑ oR{:KWށ/^GFyI M'- -lg;&ś9[\湔l8 GEFNrx=e/o"Eo`Dn$7['y`yZ/荬#GIޟu#5YZ Q#ShFO:1x[ܱ]ҟW&!kƍn_)ѱelzK%yeglY'yQƿD+ΆMod3"G9 :&t;odF5o:*8 !NOo!#?5C6]:I|k+%Fyqe/hNt{W#<-^]ZOIiZ%/g|bf<NrLep\g!s t7G(܇s+f bZqZ>9==`r|Xlr\b2ŠBdCh޽y.A%yrS|| ǦS\QT(ȭՓ+-nܚ\-^ "jYPTyvoUF8]M6sQ)rC{kөh 96-~dQU"ϻm;/@͖ n}ȉf9z6]_}I>cvXÞj2Xe%YAdjຊ|3r0d'IhMwۖqDV>+򻯹Z\C;%6r_ZC {׼s!{ԛw=Piɰ,;Xi,n`F3µZ<.?ӋP{,PL0u|iz3!%F+wo]}%Խ`˱tAe^Vs$rzZ]KN@mCMጦ&YO|6pmS pr^kNy~vVX _6x)I.-MZ+^;Aש>L&'𾦆܁تTS@wAV8+|JN`ܪ)Sj2 H)d:D+uB9I`8Aaݲoy%_B )/X+4S| Vfڒe4[m, Vk3?$@rjxzbg[*}jrT@'pЈ![\o8tȽOB$6gOy;Pn.,7M_y3y֟+r|/rh!f=v>@WC^IPD{]sA < Pm/=7vp2)4p6=`,}|zd ;y5 ^_um3= w-'l,'6}';qnS\nror"Ȳ3\yxByʺc+٦/,%7y_`:rBf'p_}/rk]ۣF,hgA'[ R_Y+#'^9/MZҐ4)=}ȎO$AtgWr\ zy§$OX[n9I}L ʼJY[PsAPɖFn'+/B(y<ۜnMu&/BK}Z"&ړWڭ"'[| (bf~7bU*G{np_{Bj/.^./ Af'>ϡrX)#3I&ً["*U-'n\pp\sY, Wf^m=Zo }i·ț^g{. }x<5r.n5yE.^o9T#s _qcYus9Eo"oZ J^Vӌs. ]?n!rfdeK*vhU =ГO˕ rY:XY9ST*qM/O" p_JлIayxv"=o/#ۊN?p8g] = 7ǁ g0]&0@FNޢ|}>'/Pk:m>T2Ao\6" CM"+58'ZzFbzB\bt<?#?f5һoE>Wjt d|]MFfp{hj2ٳ[gg+ػ+\/#YnR6'Q0[Lzo>(G Ի#dy}p[Fq#w9[ z[]}m c=kFrA.FZ6B3wl{?-e^\&(Ffnеz!;$&;kiZCz?}W c$mFܾnax~Zb&`_`6CЂ&jrO9>?9ak{_ -%/Yyeu=xvge:d76[wa,4g v*nvlt!3b߆t{DuHN-dF.#26ٱŸ{HjS]M>*~yM}=oo f 5#ϒ} 8jF[D({BI-QY9xb;6Ϯgk1{&GA>[F`;)?5eʃ'HXP2K.ȯgoNQG5o`B-#Ma =}r<7l؄!?q~]:\Gt٭#lmf<W^#k'eyf"N{7)9TN-e:r™n;0C: Z_&& %cSm[p#:'pSqۉ;+B}<7GNi[=A  ]ȷ@< )vlG@4G+tߍvCo[i|ϳh^z+бr|Ybg`>ZkSh_QcΎ܈#z>nNVr;b9һȵF R2t^pPdy$#1bVBL'r> :[H9Oh7AM^ksvx%DG94m'pP> Фr uf˒]r|Ihڀ}YooIrvwlMFsVr'9 Mj,Y"!'YB.õCD y[B_=Pîwz{6y˺-;{'.҉]7`Emsγ*3*Bk<ܯn d"nnݶ깚CFbܥ wn{n*ʋb7nK G}sVK "h%~ƛC|t;og ipry^3/cŽ1r{ݫd%56\ȓOJ"Nnܲp-M9kirOE'amMΡ<]~[D݃歐eB,o ̜k\Sij mz{M!$%0:`1Wl~1y[TMΡS~3wnڶ,ROI]OI7y )R5aq=^SHOAFj9S0$&2ȋ\¡{-"ȢŪh!J ڲLXx=\H["W:Wl !'70zj2s5A~8!#"ȯyb&ȎbN=&㉽y|#6}K #԰jN}P+NA1G i໑:3  I~Mh:byuZ`zsdEnz ~@]F޲3t-!"'p[|%Ǎ1?BCY$fS/W'p*NN\~ bAEt34E6N&AS냞2$WEcpزeS7rŲ3۪2Q8odg3r—#ՐDxI5L.mms:\v#'6*!hPyf\V!ԃ$г ˎVoʗ$>7e\לl䲘 xxbb&z})#V#{Edzp}Mx_K5Ns'&|TOPnMl; {nyL>"Co5\W(yk0x|BM'^jKyxUy0ŠB~:hq?ɚ^N[0<"9H)ULF=ԡCSTnк5㑖#43.Zqgټsp)rE?ٟD>&Or65輜_6h AȜz2i~mVIuWBk#G(W!Gs!uZ?KDsGV^VT yr*tiZ۵!t"%mZ;SWf7Z"U:r .W13DV.)x!״5ȹFVjt=O'Vkq?HϫVƻ@3&a7i{=5|eF/S'_ \"AKR4xɋB9u8O T/W!v94yap&' 9/shrQ%VZ,2ˡ{d&ochf{*ڻS{|ݡ09(|'1e|>5/gpvc.m sGݕ$ے N7EtC:i'j~)8-40BkW˞k?Kf۶kĺa.H3ln x'p/-,72yf[kFZ=۪`s!1ei"vG\) y| =D@re-\w޳ݞ]\{H^(9V(1mQƏ[䊍yqXTrTQ|E^GaA916WKboo'/ z9%<#g.6+s\>4햪\)p+vLzߪe2Q(j fmJSVnf삉 'E%AC>wCcL u*:rWgb9sCƞ iyjlk6*ÒHbW!kvbLqM8[}9mYHl,$C}9|ޣ9sZM^)}dד/ ȩH?d[$ܴȻ$rh)3bj(,:LbVO&~R/_%sjpy) KZEtnǹ%/n lv)Dnv놧NUhqr]7jkVj;4[\o-}|N~杳L)Yt該|e)$y U -' ggc_ygnL/sARHENI8)3uL%4-}z>9.[tdV]vZo'p`_ rY|86 =qඥ9"םR/O(r)7-a>~FleTK>iO\Gthv~ϗ<ǂr_&'C,FY+2hx,utS,pchf0> NyuDuGek VhJŨtb]{v+M,{򂝘)~P/=JpBl.&YQ{Y=o53]{ϺQw'p]6kgt"f;x[Ԅ%_4_=])%5^O58tߙDFJQ;tb_mݖ_څ.Msn+GOyKM Kgkh;vS~P|x]Z<6_=wqyY)r"-L|xgw ;9w6n>K[C? ?Ӭz$)AW~ |3 uQBuh2HQ:'&Uۚ4`)+|UchYHgѴ5)΅lbfVNY󶸄h\]P: .KѤ oR?렵LVbkTvq'p_rfތKl[HGKեL1kڰ;YBI/~18H9-N}ץf"|\m-wZ[0zl:C',ݷr٬ srqb,} { gي}4ZsqOD_E,$|!qSf =KQm'pE GT. ͌sDm?[x tD٤em)IKQR(NZ)QS4 d +t\GM^c;H+°Y}ԦIM59^&߽=a5eX *lvN?!B•Oyl,$zƾe~7_w G$NpGlhؗ&-e rY~ܵJ"" n'=7NR,[v΢blgjK;Y/"1Cu*v"ӗ%?ƞ_jo"xh,2sAn -5Hl2y@K.%`'h܂f'r 19y_8rwDW>V/(;R_-&X歪h~K ?A60nkP 873;';=[2t Z>֕L#hVղl0Avoq+ MM |Ps un P 9H/\1"d{iooߩ-*7۶|'~}$E@S`k9]4Ss 7kJv&c_>XBZO齯!|v>__59]ylO|i& I3 JyX*}UO%(+Akg}/lM: \X+ 91ƑmNftY2Ȅ]% [;w{Od;nӰ){Ax{J'Vɪ 8g̽3=pH;9([܏9bҡsG<y7\>&'i)1Lߖs4Yg8>*A@Y )bKJȂ 879iՋ9f躚r͵LNgEaoH񠣜%N=V& jqgѐom]' ݿuۺ^#GoY҄7$4SD x_{Aᅮ_Q{3);PDni"iRf0rnY3o  h֓iW MIH؆@;mH}Zg]y.vd2 ƾV􏾡 4qvE"c1\AV^cڍ|Ho"&[lH6e;^;po *y_v_Ni(6ݻ߯ Wz_<E FA#,z(WVb[܂! ?9ۺ{ 8>TN"{?m?~? "зwO첾P]9oRE)Z'G 4?hJw7vNnЃA?[ ͿnGLO@}|w`I~NȽ >qAk%ƛ4wb] @.+`3#粘0ui ֺg2:zY]'ʼnf# /W4]}p 1%Jm?)7آ! ]b^[jszB@_ {[ }*`o5;ŋZc|[<:W2%)91T 2v@r&{볼vO2ʐZ$15=+sSc:Sݕ $_2Iԩfva^BB9=y>m_n9d{䖒s/Н?%f冞|/ :Ȍ_*!Ccu i:i޴=KI :;T5{25 [kԾ3A$q{^L<@?KQsA(-;Z6CY6t_}ɀ|<ޛJuUK%}@: }_xB'{oի&lZ{)eeCHkWiJhdߑݢ`qYcٯ*E6c>C3D]/}) t͔r %sa?Fų #@=ΎS`\]wZt6K4JůB'?-N2Z}oЭdf{y̬l22˵+Hc5[|"%ʍջR+l{o{3 ;'Śh-0Mdлt[BIw@O2CQJ>5g ygd@P =B՝Hn\p:mS`v"o3ȏIv U0u2-*ȮWtHܙ-W?5&npgȮ@Tjd@ u?{eBg\oflN`TK=YźK,ç0NI]Q$)mۜoa\ߦ?VO9Y]-_I+{n0ᵏIDNy47:GCR@e膽]Yǖ""~f`Keس~D FЅi* }Q7zeK&C;=[xtW0k\{t\ zsHOo>+%O-h:%}gݡOH]b뷝3{|%u|>1r{/ql|.%8"Wľd]<}ao{ X;r^+-д$S^_z`t>+lK|~#wI -8i_~ωά>y}K]V^DeDƊ=noyzV=*0{[414'v>T]{td a@Gl =,aC5Uuhրy>37ť4evx Y_ tGUUoYNcoCJ7}R [vGi|ϒ`, wDmk]jAYA+JOv7@NI ݎ)fs2pYʎȉ鸱KlaVg2ڂyATV]"Y *:ݲX*'u^![n=ǯST%l |/=Q*r;L[*K{&8VnFR!d)dt D_VO,=Xl:h)g/ :+vloQ2V(шt 4e>؉֞wzDُ"~_:2쩁ƾkVhm*n+Cw}Xo5"o/adqZ}#ھ@oUjb+zY Qi=KZɤfAbNИЪ3kuk&R0eG. )k^?Kf7vKn3SNL]rM0S_6lIbNJ;_yƀ³YLs yuthjRm}MO.r*=}Z=Rw })84"#F1w\&@,e#BN{J=w~# `2YTem6peŰ7~/>ޒ vdoƷi3Rl>+E[XȾp[r/ zD˵j8 zw_yq yz@$)yYD.e+.w!Љ"19$ѹx˻؍~r9KK>(r¥%}%l#9arm-/A^aŖm>υNt\]\zERα"U< :n䯐@&|Jn(>ڈZ\4pa,w v'vHpg%\;O^CA ?q]Qanw9a\Gi.dk, /'khwuhQI9f14a'y W)ؠ-b9 ]b{WxE\,s,Q5v :p;w_Y=۹EC`:ʀjy̲ \pٸzsu`Dnӂ}T^3npS藳e.^9D L~/P\)n<\½JU{o"8\Ǵīd5nz{}.yZc C1'x0$7HfVeǻ9BWVo2Cl'ynqOg~ؕDp]&[*PTn`k 'JS]]J'@ڼDqf盹-8KڰBw>e-7[KKne; Oܔ8}e#o뀴*ԙӉ,qm>[p:jYjΒ}[&* 7ϊ?|([;‼G"pm^1KMAdM7lh6%Θ*e|&[%CKV 'rR*ɧb^ynEgT eB% |ߊ'&~76-CN&s27z|Cx}J l|_%zȠJM1 Ƃe;n%Ă}$IZUU8T#5pvASV xUx]>^OCeuXbAp&m 욙O5Ї]8syL"Qf7 x"Z"h%nAJ{/4dW)ۣѰޭ>-k/'י+pa6`b?ΒM .Y▛ x Q!¥ef-rdb@ݯZ{o7߅`Wr1<qj"㵝jH_RF/>ZG* w'zz֠YFEBk=H#Ϫ8߉t²}VE so5ˡ74M:6Kf΋tq"oOҠ﬑-6%>}ulx,bCn';km[owe ~\<"tC+%GY՛ s 6߶y!{6EۉZCf]:oX Uۍ;%bEtQ}EB^}v\C`-hM\o>EY2r1TkO%嫏z| j5󢔳tdM &f^G԰YȉVJUD z>BԊ :{0O&n7N%e3qQ6BZuKbZL~:6 8hӬ#7Xr! bz,] Z\^&xf_o;-~ÄF,-'\nȐ g-݉ZP4mȤ{4YZ':rs @$l䗟4;[X:؅\׼ Jvۼ]#;(w1'=c>Q[6 O.W߬E[}F*K8'{)nCA"ymY@U,Y4֨s =$AFαgF)ɤ͛n\ oITDrLq04T]%qFHBQCnf12qm^ĝnyCM:ʉ5;b.~6f-BnK5tF+ \K~sg_Y=؟)P:xYeDny|qFN*!%lZlQRWB#ۜ/Լ5~`+֠a7 *n*Fq* C*z.lc8QR7<עTMOfEhU>C1ZUFn;EE=۟>U}A:V:(s4=2=#JB+FBS!l$GHl0Zmrf+WDDALnX"lwgkfй|~N7n|k~|j'Xh&'_dEX|Dػ"o#x?Dy`i%yWȵyf@cDR—U{htdWkDCm[r b/~#\E춸B X7p \^>WOe(fZ|BlqCy+e`IsD%B ~B>S츚,bY@,y:[fr#O(ݣ(,!ot~$/i~Τ;r(J/^^vdٱ]GtȝJaЄ[?Sspq?-W ס@ÔIMv=Gk<ҡ t /Ʀ@OVois H%D2~Gv:UIp/^[Wɐq5:#1ؼ[a*w!. ڼ r't^6kqsx &rt7(F'Ag$|V4O$,u@ߡwSlgiwkl9x;S?wd*_˞|>?}+W 4?1쩎 }d'1{B k;6$To䯗gԁIr JL:%Ɯ6XBN? q+ r|k |,2WP-ރ-|YBcp[@rC+ýY_mYriЂdw؟Yb^T8  8Ўqq h&q*z[$CKeDR7Rֱ+2&ߠ?ؖl!p@(Ԝ1 7iu&JΖMą|:a:C6fq̝]r=`>=3/oH{.q.J6i\/L[v7 ht<[j|!M |KgvNCb7.r]EOzuwKT Mo8VdF\5,[cOCt僼.QAЛA)An|7Vux}˲tv:y@kPp KZPk߼3ݶͽr[5ܘW <7ಒ^.y-7Uz﷣PDZ UNV"[-K6=eTh6.Kt9@.y7[Y( V;_6W+xS8oT'`%Nd,5?yГN˷}kp@д<ӧ#Gd裵=|Mof6M8em 7yΗlrF!]`+1"Ih]*rY4Vidd{__"-Wlɵz-wӱ~.FRn}#W@Z(~jCq "ļ+1WCZcύ._:9ϔ`nr9 2YY).n"2hgdilKB*!NIvmfJFckB+u lr;{ZEE.'Smz94rd;l.⯗ܴ%\j$R*_^o7v7y{4Bkzn+ 2jq̑0y#h_r MD'o&ϧpZߊtu\)K +H }B=&Ӭv,}E^n"iv-6DW ոDj )IW7tr?EN]l((CCč\Lth`1v-K@+ 뒾>"mwအ(zPXq?Pvo{F'&gy!ހ=\1znٸ 5tFtK Z\T/ǿVV&-u+YPZDxe>Rcr*I`]ȷ$Hy/\ \H!6$ӿ}|8PB(4K.UbG?k i@&x{ZzSM:. Qʯśĵ*-tY^ ~ {FNIxxVoOnm_S>DNyRE H_ :M; rb_[jp& 4S=|"3!E!,DhU'*kTYny^2om 2Y/?߱Eb{6'6p #"&ύ,3[ jYq lʸ-Ü(t,7:'g \[Z)F/M们2O6;4Bf+ Wb^#ԞC;]%\Li5YM|uĞK1'\]:LRB+BBAƴB-{C٧"O%ۅ'{_0F{œ:&34"pQ }oRR˹xi?JH͐^"$*佁AnKL*P759갼+&R}8ϳV+v\D-[L.x8L%."wx-nk@؁Eɿ4н!D\KT:N䔫1"|?/u)hW|%Bq&'d٪qVқˀVl|nc@o_ɭ.p֞JX[p39 + M 3Cu@6 y8y -ɢSN@n[C=rr(}GkHKLNS8B͸f2MQUC\Zejaȭy[JæQƦ8XzZFr<`l"2o<ޠgMh'r?m!V]eA7jJ 3cz&Eq~nW~' _q\L_)t!7e}sʀ~_kSe\mo,BNm-ZWH^w)Ȳ=4q2jAn vON۸q*vB"v_khКٍ.Wi!= e7Zy 藓^f5>!6-P{Mi<͟>憼vHe͂Eby RBA.":},^^l-~"Y J^mr CH29eq#'h㇆^*SehA* ˝)}!$ËK~C'OlTFFٯJހ趆̎E?*rrGBBӜHNyާAA[qۉ{У r}=DBiy,ؙNn.63Z&DUW\ǯ^zyKNǓ^&%Jk$ޛ]Rt`Z3OryG+'pYGJ3dT4ۆ}L^pWߛܹe񐊎ocU ZCs,Yl.TIظ-( G>_UN*﫯kyIM bgкkOg1?\]1ͲBOe)6^Ni L^ҏ9 2n/(h`d^ޥRf*tWR{o,-G i<-ny(.iY,e^9.[( V=:zAC/v=Ǿ~1 klsaFc5SVvVgF V>bȭnu]JYxL,We4]kv!\Ği7) @qDׄzR,Bk]MVDZ=_\-(5FAA51!~>Bc/QMvc ktz=GwL>LQ<> J-{W8巸z|?G̕!h;̮i)]S^#qX}ĵ:g>GiZ;xT~Q "?vR2M9Lv$Xwc>rd{[v1]-uJy;ʯuz,:24&X{sY܍s|ZGC_}s`"Hi]e*DJ-7r['%^ƾB[ۍ]VA£G;xBOٵhUОüto'zL>F?v%Oe1@>~k@*K0;3 9|>{?:&EC}؝cw\+ 9d=ϮRC/\q1;i;2vd_Vw`tl3fM7'Æ/ .uBkl}QR -^i;AKqcutɡn> <YFtNM~ zQLRa*9H$Whckh,?_DGj?Sh?J%ax 3 r&SJd:Oc0V;6Dwsoҏ7wpǞN{[ֵC3(إί 3"{[}i8 3kGK:LDNJ_sI [%)s3D H_) ~0 }$E侸[xCh]YEP1*lJz6N"͗Y7Ӊ܇wm'yP}O5y}/{Jʚ*- mDV{u^z_}wUѮ9wqBo1dttE?mњӇ K39~oZV-r&'-ɫ/Lţ߲|#8NbnⒷ]݃\ʉ[C5-C楑R;ur|C3@*tlZ׍s{CkF>}r&,>rBwʉzFjB Z K鄨lU0o3)r5d2_4KH)){ e1e2ߵxNt@ ytZ FRې#ڑ[ >S򨙋265aD2ȱp h2e ,OW"'ד>Sxu37Gf!W9t 7 \Ckq,/ |I9;W?U^z[ԙ~i\pmZ#O,Apju[{W Wj7.GV#iF w\qhDrg?zpXn wh+NC9Nлkxxkxxk'ffdW1Na֡ummd5 :yP d ]mffȴW -6.I%΍\3l>59:cUПNrϧӧ*nT1hv#]ztH%eΥ}Z@#_F.g~y{vE('\䭛a NLIKR2rȲEl_MN)3:hf+jYCC~@WUOzŔɖ[Zʱ"4t\ܑίd֫HQT}*._JCM_ʂ |I]TgկyEN RgzY 'K-6@gNX6*vos u@ q!Gc gȥ-9= b?GV|&o:PcYB*!+%=^ nIbap"xȣr)\WIr[RՕKO_ȂC zy cKloƶJUO\?ei@S[A[\9eDv=zAZ&:{|I6蝏#y~>ckG(Ղ;Q 7'>-]6S!Kx}j(R7fqךyo@g,WZ|.Ow)(*g\2 |ћ4ʓWFQn;.I.J \%^F{ȕȳܸ+&MOP y5>@ {B㋼X=[iЍ!=ZA vHROh$-hKշ-F+YpV3,bo֮yZ!? M}CY }IBNvgY[3+.W/,Уjaqrm^q6MpH'5+3/SzpaD}%7Eg _Jf_X"ȡ:b~9Y \Bܖ|857hJ UgCr?sn / vƾ֤tZ-]Ip;pc`\&4 ZDZQZʣ jގӕW5i+~s2)Wΰr_=]zB_FGL>tFʱ5!nzd-)+]73%) rӳ\3A+EoE[|΁N_E@.`ۘA?Ap*ZءkMޢ#4:tHl>,YwAbz"bO͡΍|s_^ o7AM \uWHP7l'N.uAyQZ{ͳf'r S@knzl[D ?U ׺p){J+y B \cUB$MNQQZ伄cIV@ L^%?OliMńo,Nn!봷U1% S[w()ѽUߎCF??bNIy*yso9kop rf n1:Ō8w61NdZܐ~+['vlz.;iYqf7T -+U٧%6U:t Ӆs󓰸wO'a@˝ |Z@dա<#U>mLaqVi r]N> N\6'@^O#$^z37(4"&Щ]Bɢ˂KjEN}ٜGE?X3 |T Ï[ɹ@I\VxhL5T1ӭi;'t\ %ԧG&>FZ+t<^{ l_8mѮۀvo5׼.b'4>)AeG y]Q%sƍo6X49֎eUJSo ;QrAvaVsYK]G?F^c(7 ~I/2._oG:4er13?} ,5獼Ųpftq.31̷kv=6S;K*s͆R../JՂaTzRɥXPB&,'O\ܵӁ{+:ZgN[wf߰|DS]%m{[M'\vv "xm~BdŇ6a&*%5.SG .#>ւV[zjv_S }+teң72|_fl2y\\ z']' u܆;N%Z ):W4g(ۍ\io׊F@`S;F{'rUh!PryjÙ8\rUN͡q} = cg?Bg+VKۢߥ:05zS2h}pA >b hd幑gkNwN9Ob_&!7Β:Ots&UM22fv3NEeW,{ Z&=-ULϩk;q.H>\DKH;q<|7k^I"].KE*]U*\7_yf&N੓DvFщ[C%ɯzCwɇ '*X#*eX ùS B?Qe#ul`Ӳm2kr%(h}zy `dZD.'8v#WN: />; 9PY*eOr3d{ ~Zlp)m&U,*/C7څ[9rT2Y)5w )6­%=z PPā㾙3yӸ瘝`/D1[Zvk*vK.::6糚ftR8:x !Dn·_4ߙlm-s\ UG;pKT.T ?Uh*}nyX>UZ[!g#8Q|e wb>'{~0 jnY78PqsNIAnuӫtH9ߍڤLV'w:Ӂ\uJB /LWdŞ[<=z!vʆbY- H9P6h:YЕ'Q;x|2,\W'`JKHˡO%K0:rWNjmеdkj85YԐ׷ɱAT|J:8.k߀rDbHk[b!̼lDףOy|%IzCwђaq'4mR[r]u"|\ OA'poz@"ng_)CSITO5F*}$oe#%g!l_2 ("}qߐ*7 ##Mr܂}[U<&@lB3e^Z.5& Cb+ 字R5S;2so5r޽ݽa7ʰyjjP{,A|oQ8Ϭ9QgrYV>I Y]{1f0?C mE7(lJ^U]ޗ@0zoFN3!!l]K,3#\v"G.k9E[k(oa[y"n.,Zh>9=Tj0K!_ #^].jUkޫV zl:2w}A9q?'kpBƙ+Lg %B"(Vf#^SdN3 915?sf*%ִr.(x hMcO^x]cg!蒨;Tv<~,\m>hLgWKhF+v!Ǩb/g~`hV{inO@pBWBr`37nY/pgoC@8Yl@%4O#t ;BǾ?Pz;ˈRdF &KD"[]տ"ojM 6}ފpnzAHդMhykZ2nBG9hKqB'EﯴmC7XZ7{}ܳY8?$v\n!:5ؗ |x5ň&IƴB>Ro #O <4p ^مcՇ!/:57旱g~֏t׋}CP^51bQQV}{_3g$s t+>Ŧ-ʸB+ɴ`<=rj7:oZՊܵmv>6V@Uwk ](kSB*E d%j'ڑMޠgA .{?V+_BzB) їE#ܠy7.`SQQ=x,*2_Utt)dȳ|+25*f-5:rׄxY#pb Yd=* bD\Bf:%'.QF.~fN`b~aok%^nkx?Au4rc+-\N,F>KO ~0b\chŻg*4^s=A>ۈɡ{#E#37܊P$nniq%|qߛrOKy:goXzr5eќ1m7 Lz,_Ҏ{V? Yzβ"Ы|IUd oJ/]<-^o(uN-6E9'kbQ;o%mkc"<5- \qV/ݛ[3T#3;y#g_T-טpHloxyYm%8_[WzܙYIMR9]}|&'[fhުI}7ܬݟu',تN~8 `jкc;Ye@i)g \6wZO{M#{HX7_ö(2Co7畵ѠF=lΈYCfuCv2t٣/b:au|*^~6FEEYSty [GТԾ=k\"{zkہݫ -Gzq8rQAYUl`?Cд8}"yrNR,yo޲z猼>q?z"GzI57t{Wn,hCŒasoܣ" @-o{|l0} \#oepgoW_ e6O MR:eKfV<(!3=*Uɹ'".)&ܻ`7pK->WGLWT 2K5rulջhmfȚ>i-KqǾ hH `e}RFrKV \7:K VzշNwzjȡӪ5Srq "?rsnVCԾ%Ll=Wѵ$neVqF^{CM4ɉSęhb9XRl41qZ|gZ!]PTŬpwho!ۇi9s/V-1MTɇ7*AwqWǽC^:/K~ w)R92q]|59_9b}Ng!U|7џeш} ?0v:]kހ;#WnhIx/ 8h囖{?hx8TNޒKQ >]AOgϸB}Vw@\O:逾mC>6ߊZO)iނQm=p!nSfFl 9s4ʕCJ1tCk쯃_7pC_.zEt/zFvyE@o,svsn6)ֺi$з`i׆KK~CRkDVٷ˓p+瘿~'Y̘w{?q{MqгN"' I7y⦦y6C39}^^@4>MnP>=у:5u==lSQǁsKr}VYZJ_I!4CkIFvj|4⭉Y`@e}]:pyˁ(PR7O/B. HT :Lis;ZS!)ANtF.2\IE.{Yx\¼̻g)Kf"WoTZ M?O+W5 =oQL+9SyB@nyȦ l11H"fjUoi>B:+EZYz!<0= I#l,1M[Ur`Ao5\U;9F\#ՐhU;6ܰ F&tEٓr=^#;fV/Kk쬝&f~E4TUS<x'nUA`N*V?\G+2i"ȩV \ZXVpUKAX9ZWs9].>SE`T87y%ۈ*d,[i nܹ'ũQx!aȤVy~aVAԐB9KCZΰzcoyo -D%: |sWB'Xd‡G㓰czCd- AhSBt`ѱ{o.Nt7k4}#bBjP7Xq:Qʊ3UI t~cWҌWلnK>G {qb퐽2wj }]K>~} K!hmnJ/M VrSBA؟p&*}"Y Z=:qxev+ 2jIfUqu}K ݶfPI?%O5~,euoh=y'0ՙKdÿGc4Sj/tj`߅|tCsUD3L5Pڬ@?~e Zi15@^?eo͂#phBw_) UF ̬ϴW>@}S4êVq=fzJ=7$xS_ՙ1,TzcR_:Iݵޝu2"2K˟Y~?MN0 3uz<]:\~/1͂u@kî(~@ߛ9^󡚷j{}sJ{dz' T񃾵)Zb.Kbe إ/[eŶƻTv)MBx@WH;|Sa|FZw5w_z FA'_kF[ }TTOŠO!!˒O||pڽ1{ؽlab1]>o)FyMv92z;1\fO2XH~1tB){[Ѓ:0 Dc-4rgbZ Ɠg5vQ薒;cȓ2̖%4Vdɭ> }{O\fFFaK~/mO"'vgtB%ѱk*6p5hL1FzkFErzà9m*䁎-g \|$砧-6~eM턊-^}fN4'xeK {OZoG?f̺e(ЯVB{)pT saozRC.@P@ .mt͋,܁x@ ?)NtDư%}FNWTv-fJNKdAd>.ӯ:V]>ğn֢1>PCr dgb_ΓŪ|Qu9 t]Ffʨ х"SwYSvLdTWWg/*2/"?B/°'] %tmȀ"2{f^믷7!6 (v/Gaw}IR7 &*UV㭫å>7+I5yP@׉.Ff9 z[ޯ>,~S F$vrqxSzo{WZI33} ?1NFDNTm:;~:jAB ܌Mnا;g&w!?lR_#[[ >t_RK6G鍼^{͐{4_lY6 ?wERy\JOArO5jMU:ہlVl9|zy#Bo?*&7RC>L\͕cͨ3nH進!\wq |C7Z7x?yz;4 Fu 6,J.0:C.%g=$KWꋋ\H(AD< j=j!gB' xdztAQÂօdY mupe0k8 9r/`Ti'Y߻s j_eM<: ղgWti}8j#I,'\- |3jRR3!|9-.# ߍru& No;X'df_krZ_ vfK)̼>0oP񼜠#r i^WYw%dfx -׹W33t@,ZЯe1>,e\weIn[zŖzXCKcS|+ 6yv"ߑg7-&[;^6o^ŕȝ~R=K #It}LE'=.p+.~3.]2^ΧAKnR?WnZ~;RS\0EfL~#v{!w#J3/gklo` tEϠ 9( |5d3f*9G3#; Fw -x9-{ɨ{N#oq6n} $zSB!i{gѸNDʍyآ7kxou$zkN^nױcFf#·:"ZySKHRL^.(e ag:?3:d * Kk؞#]yˇ^Q`w=WfDejz&7WkŬ}aWͣ}oڐ=-nWt }(ύ|=1/Ч)z7%-g2Tp8<zt=%?W*A =H #WI3zJ&pj`3A^5t{x7r׹7;-S4<x^$tdRIX6ms+"?-"ybZqf&rͥ= J/ORG^27iMĝW8kn֊=&/f'PϮ-"# ,"RpA(B -f7'*MjOz߳ρwޜTXl\\|'/W1ٖT[|M&nW)irqby?v7ݮd~w8YYNn[sޖL2geosfCTn8а6=ֿL nv^: ;m$hIYMo ls6;k, 쉭!v;SĢйF|yA; 'Zmil܉Vr0~#hx t2mb}zU;-ר7X\p?O~_qКw=\ghzyqnKo[Z[F9H lrHQ>Xl'pvjgZkC Z̄_1?(f mrܰEzo wDrRBn>N*9 2b">o3jښN"I+߂DI^׵cdM,JYr 228"r2WVfdfțnWk#gc}sǓ?W%3ZR(:a7pqpء3[x&8 77Va-'Bm- ᚼUlJlI7o8/jB^M.>Gy}AM.r~zK˪-4M9Š=<\hV_n`s6!;yxwzg=Qȩ$' t-$~Ng^yF17rK[Bc WWDvryWhx >|9h8 @Nꊔu: 4[FMo"ġi`isƖF1St$ YGh^[ rZO yM)>sjzq%޽}+kʂ |,rO\$>35 x[ENcޡZC\ T>\ͺw ͎[F!drڽD! \xuN|:z֚ 9YpRx",vw\a3 O. ,V\e죍xl7)IV= |668{?+$ ŕ(Wm,=!/$o{{;ԡesz^/v+P˥ɿ _o4xhַ̐*'ߡɂ>Ri ~,r[ok+E>TrQBE]'pSM%|j١.\q] .@&㍼5n5_ Nm[Z=U)y9Xd;5lQ |@!VlˢxX\]=Y‘ gS|Enim꽐kǽUPޣGx j٭ +dE68e4 vSK,JObqv\'_Yu'prN*&Nv45[+ml%Zέ#[<۟O'gv36OA)yF.ku@bɝ_.7Ix#+#{C7H6\~R- %VlBdt$ù\8GZ^/iػ["\&ݸ4rU^"z,q[7 C "\|JȵBݭ睖@B tZw?Gp}g: ݡ 86vs}{f i%Np󰜏[2ʡ=y/*M vk/hd䡾"[blf5WJY9IAg#4y x˵dcp*TZ?|J]D9 ՛B5(kl'Y2%ʼn-G"&@3$TdPZR|:dCFNN.up=,<y kz3R.bL-Y ^>tDHo 䜡UohWr\%ܢ |<=wCܠy7wrP_E;Z{R ]rpśUGLFn]Qȷ֪0ܐ OKf+F)>-6T"6޸7>\? ήd yߙGԸuHYI^C/5|Q ΩY ?.-{<(eE96UP~<)\[7ׇ]wٱJ{:u>c}ͅCqi @SiPsW!A^:hSxoЮbakx K FE~St6JȪR;Y=ZpA>q{{s86Xbau>w~" Y-Y=Gru:g\,}Zo xj;XijhjeUe w |s@:I7d`ohtl7rck*1Y+^WGFБpv^X5*"U͕{\1r@Zױ ৘-ϪOPo1-$w?kir8U'}'zNg?>l&_נQlgW$K_ϊMs'Dv |`\^֐K! RF.e_Z gŖ M^ ƽ:狒/1''!rhuq=Ex}Vh*=g9*(#WFpxU[ <3AӴZ8̳uȅ~-|imt 5TGpd\Ы<ܷUIڠFտA5ϞM~PYWpe|ݪե"4Uzɤ,ثd+x%z5DKB] Bp7pːX 'RD.3\lɋ7 t1<ʸ#R䐨t8 (K^W |ݸu͊^9COJ\WogI :h:o5 0KFR+tH~;q&g,+2B+7@]7gh؆"t-ȉ|Yְy;oڡeBe#$ނW4yrhE\k4Y:9+s~cq#%>?N iu˱ CGs2LfhL/4m!hvnjbRI6$X&'d7JAf'4o{Fve \r¯q=Ū:hXEp͈opyu#qUШXW~,r1>Y1ck7r]Uy9f#Gu(޵ )z|3Xӄc U!H8ʾ3Y. }c>G퀞~h2v g@q]ډ|umtSlΠzn-{hzzom#om;.v*lm~ oI7\͈^L;K7,j-8O5|3sr@'_r.bzEB3+'u遑R/@6nCzދCgRQ/Y#h.ewt#o|H {Ot \8(]Xt7J^LB'9@RowI&sR{` 4OPkz.y.qe)nז6M>;uD7z@$9N:Ъ~CmBO:^[`g pgˉ9 q—IN쳮Vq;T랩r%jm)Qߖ 7F\*hą]vz@oQT+B_ !@VqBo,jeYCG>EҐ3/zuZ@u+.G;ro`iRB xm|~^HR8XVНQZ/t]VwbVJ pxIp# 8HzƔ=%M>#Օ9om)_dUhsyEto鮛[z(\Vni6… ]g' /.m-K v=*cXЫB@O(4Xt ^# 9'-:vd,9M@q#$ ItCn٨/qH>G@^5 `wi# 'G]b:>sg#imMuT0Dl] cR> -ey4zm|/ڞy)47z"o-"'r^5$֪':rZ:<0:>#`mɋKR,;tZ zN>~YC b?{ްY;"tB:*);bcnzoNQGg@ ޮ]{HngV6vW+9ܤƅ}(2Zx,NlAfDy`W`8䒬ޱcb?Ю.лGC>jOdf́!p%vLwAwȤ-ȺUt`y9APP ]~@^oln 4uTkX&] hbŋΩrPhQ轠-%}+$9 1[1 Jy?T}[/!+Xdz`.z80u5*} .\nzsݢvkuq:[~XCn WN_cw(;ed'=#0>z(MAɌ^<)fJTHǶzn*kwjm|};h@=2vHbK]}m^Ymk̷IQInmY{04FVC2rHv[ {MN>E٤r_1boDcuv2YGocbJ݉\ڈtF RhN'L+VYЉޓG/>)m.CT>})~]FnأEd+B I=2);ҳKjtH%O3a_>c5 ejŅ>N6k f5[ D Zu8'2nyvA$ՠ>:殕nr滈B1#cbߧ-ȉ Ν0wAU֡nQٕ9~@ה=!SA3goH *f1f6Ӿ6v܏CڑjA*:2N7N!?;{* ĩ^]،痊-fRG68cgi<QχXwl)2lg䉀]׫\6kn>J/:.Q1Tl I2$S%ĪUR{@N~GPO]2ʋ:]^QZcJΏRUuy` ̥#Ov[}5rH9Ѻ]ETj b__nk }cwU+GGNHFv~O/*4u*R 4>Ƽ`56|/'8avS|A/c=v Z2=:y,845Ї"^y㨱#?}"L%)Sڛ M"45ԃ-|C\ MӘ7t,%b:%}1y`/NuDw [TymwyrPq*Ԑ]}EK/Qw]hBq&7qCsuu2; ˉ\|d@^7z_~kcFβkt nz@7:?gTY|_hްQM=Z5%2^_&fW8Dy2.lQse 2r"A_:tϹ1{ut%4:-j,r9J.3 VDk/ ҐeE7gsBZǝѡ7y#F1E.-@Tw#ghQNq/_Lu#_Nwq߅V׭``'/|@MϷﺌuT佞|oGg&h{|A -rn>HYjt#'NU;Љvط(qvuu;t&nDW)dzn^?66/U>6/{> t;} *oU 7vfzS /D\Х8eB\4SZv >Og'&l^S] }s^7tbwظDȫv0&@.#{pN3I|Az%l6>)%Id7JxIsl@/Hr=aBc^*K-&Kҍΐu25}}nV9gPҞ_rhen20?1FY\x|Yہ8>s[d rlg Х{Npz,OHОL3AG@yr.61@kdZƍ\S12ێ>$r^֤^Ĩ@&^r:k4>2*'àW8k2.r⥙^:zCCt7꟨aJ@(ņfZimF9&žKiϖ$pv_z ܬM7|J6n횜N`lW豺iKMBnJϠr=u2y+IEnT .mVDwe T|JNMV6LY45ּy 09Q3\q,=0Ak;bw}4( W'd'ݽ&yY=41Sz:;}anDW_*5]G|) VIjue]5Z210KtHY#5xLWjasFhiSQ] îVC(4kW<ȯҸn>J^b9`_Anv ֙9GXC"g輍)lU&`c9VaC/'~ܱS24rg9"jȌYaN}QڳW o'COHgtq2#@zH F%쓤 {v6rruATzoe]R1R|AxQ:kC]cc\s" t~ WXཷ$ ΡC[^L^Jt@uz+ Z2xԴCm؃i1z^ ݲDrmu~]I.;ōfm"eoQ)#z] wEuف|o4 0kBZU$]_u xΤʽ+Y\\ VpC[\e#'Σؽb4}JEhӵ MP-! DTj:UE}K\6ZeQNzgQ%@kT]Cw 7B~E/#Evu x֨7_S:|!t|D 9z/2ut" }b/d, =$-v[^9|ڜeTfde,A=Hnsu7[6ok, ;\}n:EHyYnb:*R+_&iL@v0 ErBwj ݨ#}KuW75ktwtzE3a䞚:N:r5/f @ͮnޫZ.TTQdR:[?$}VE%^-6 OF-StaK6zMDY֠%ӉF=/ɋф.~UjFgz:z:f7þDjLW͵a_ {9yB &St.p<>֙-C_4h 6:7=K 2h~KSky3.q26X:: 2.9׫9?ZEx YqP~@֎ {]俋 IOk?Ge&ЋnuijGژS*u nf| S[;{qJ Sw>[FF~ o*ٛFo TlupX%RL]@=zt֐zR?%ujH[/͏"F&-NWaVQ䔱I o&5\m:1y! ) H{~6j9cȣ]cޣ[d7}C디vd;LRhA.ǽ.ő>"1CȫsIɂsU9mgނ<>qtKi\ާf#<@dS^qtOY @ ظNcB|uicl#qYj؍ 5;oh s"oq&9w [;U6>1h.ݬ7=TRh&])iu4.J.-ؙi\b'?.ԮLFBK^3*1zJFA't*Ev|~G^ ~c']:@uWΰ2%~i}=5i ?e IvyFaY$ݸWhEbatq?'!}) jR܄;`ulyu֋<ڠ8oZ+\|j*ZBrTtq g7yYS#diXzv45hKN066X)׆NH1?:Ek=%pA{g›=^~֧= 5-8ō<2zoYF3Bv =nk3%A 6zd7ߛ}\΃%F }$cp]F"ρ[rȃ Ym?il>ȸ+K'eٱPkZb HlR)3@ c&/,;:Mw1y~Ĺnd ݯľx&R5>ή is9To°AWԔa}#ԡx/s.LuЁ[7H$mοxOl10ց]e,M17rI"C!K{Pc%TDȇOI L 1 z{yȉi32(2lMd책J~D^M @FwvK#`6#{#l)9XT1tf⚽+$/iЁ<ͼKu1 }vu]5z?O_?RHoJ!7!g8l@ MV θ-,*еM%/x~/MC/t g-1NvRxV|F1zw6cq_/O9#FRF[l/F/U82i-~~~鉼}~ݐW Z/E.#!/. dYTziΩ[  oڭK]72wӎ\f{]=˭MƵUƾK 1FՃ:W:NW3"=.L+wZkS,zw 6Zh#F(vً # 4CcR$t}T@.>8- I6q3 cCoyop90ܡOVKt߸9}d)Vcǖ赑W_e ENNϧ> .vaI}q;y rHz0%"#cUÞ:hjtI!,þW<3=wٔ19%i[;+w&̌Q?C7|z_)B_4{)G5dIIݫ[et˅̼B<зz_&p&YQM l^șze\ No1闎<_dz:Q2~JNi_&[9lA~4*^|-co|K㚜r)^YHkM,\RR:M>ݥ4n3.BBMiIQG;}X.fz9w=RJwt;o`GHXҖ˘tŌI%QV{Vpɷ\!7x.GǁFx@w/7gK7믵TIiP QQV"~S_ ջKK5t՗+,cf, w67֩+>xWnLwa^Spk| W9}v|SqYw쐽@pi5b_]ejM% Q-% /5\}>GJf"ԕ:ctu&`wq^s=|y c2Ja{}KXeVk<|qaR\{Sk4luv#hur?nCh=Aލa?CY_[N4Gj@903Ş;`9}6`&7T4M>M?-T/Q>gੌEoLӳ __#ֆ<8)5ty`?Rٚ|aho˔}PJ_! zºN"?+@_/9Q?#ͺ8-4}+ɯqEq:E.ЯVvӠJbUC{2k ]/ 15fuxR @~X|s/^ػ끈N4fOa&oY@HŭM9qUi-oi0S&{ez\y{Ć\ <A7`o.Ke> [ɲ{(gfo`};:x'%7Y- |{SLTr?C(@١-f^wݪEYv j I7_]8ɇv~[Pֵn[J_Rﴚ BOB}O[ ڊT3H|^^Y._onyætGj~?]LCck/ysXW+ $7,ƿ'9Vuwh\lΞެ?P2NȹY 1T?Љ)?33#N%6`iK+F5 C']t ;M6Z >z+VdeɌ;J>Qd=t]ؽл!p>Ax`_K Eu>su_:ܑ~qNjzJ݊Y? Ȇo'xK'ճyN)a2 ;RwǣVQ&elx+09ՐB@ntbak\{jGV}ZEkH hTCVSk@y~]~/JvO A!xO~qr 8#D%j\3WܓKitA?ITO,jZᥠ ^{֠kN^~[5skRϤF.u-ybY;{4cid{Շ`lxJc<4\:PHE]vbO%ui>M߬`VE|]}jVǬ\`0t2dbx"_Zܱ@0x_Q {uE7?"-' hҨ.+çdMk;ԫ"2Ɓ>ѠʁΈx;:AtTЫC7ָW 3 mORh^';ە@>$} ]6igB}+Qr_jG;6];u7:c3Ĉ>.W_>mM}0y|Er/⮉6C!ȏ)gM"UoNv r+@\KS=oThA ׅ$hW9u8Mb{ L6%x,=K@Gr2:kqM-@skq )5]R$JJ,Tt6kq|^~X|x,K nn!q@{XZؼgS-vg *rcy;7?!j#y. MIϨxϢ #OQHk&VfYQ2r`9źG:qvVYjI sǢ0RBz,Krfک~CopE]m[#ZŤ~%8:e F\-rQ]Qob"_D:/BВ8/ht"h(.Ț}1zIQ_e$/56+urzC_w|@`8._I~}Ԑi\4kdU肴-hylU$q}3tˈDNn_['rn%袮dtQג5 Sf]4r\.yot>Hks2"' }\@yh-Gvdt?=LWtي5gd"`lvEfN[N:47Jia Zeȉ=ۭu]K9`mu]rə]5Fftw>f 62nlIm[sf OO?WWZ%sE0"CVmu !M/eVͮɬ؇GEÀf10uI"IuKyfncky P޲w^6 LisNi6s[X^6;R=b#ߗrH>61#v7T#;y׬L[CcSk%щ}v5hz8zT Z&ES@Zf^_r/?s [zaas@t5Hb5-PR$ MT;|EWF_֒f,Doet-T } m3z(ʒB~Gr5#H-3snQ,(N@,:k'rɭ]Vy(rڼXZf=fk9;e_ APP:37:re#S]kV/>a[}MثGFMef^رza|\CKve+=>SK%ץY OzDO{ZVn$.Y ]>}%u7ޏрft=m>r$u PozԩagB}B7g^"A oD X궴F 7Z:Jm[^:#`"_'nm)yE1}z5.,yC}x#o9q g0jh)Fb)dtWj `U ^`#{wiG @X3>@i=c .LJ톒-yR/-s4]/n rETτi,OȝtCeu(E@k}`<ղv&:}Z8Y/:aY1n+4N5f7^I$H šF\3h(}.wXm#)YuJ{PLzR>[l;t7gȩxhеQ @-]\g.bJ $ :uaZGz}:HK҅Qm'rKc.*=ޗqۼ+2ЇE f{лBO/z+_q*}MjmxYKљBU:@,ۑc3}P[6:"_7޳Cn5'^ Z~_i߆?2ty)k$hsA;yHз66]854:vuO.ضi|Hͫg:Ro0jV#_ư6-wqN% }`_>7_c#kM=z^z#ћ xM.QaYƓ!:8^i:{ܮP|]hZzB'hr@2+hF'XK|^$&Hbe=*؜/cЩ3_h:4{xW#/;RZ{D"um@poR.v/5`VTgIuʥ'9KG޼tOKŐ']FGuMk ֽb&^J\~ gi9F 1q1hA@Hy"c]Z )5 8dgWl;3|Cܺh` '"A_~"ߜl@/.$Ltbhe/\j>F.b27v7BŞrg%hzq#NӑFn.Ȓϊ ,ptahOz o~_4!!{plo/j?cΞK@e ]R7Bzz&z\ilT{\~ХÞɢ_v:Z+z?@>?eb=M2 ~$#>7?sjU tbDN\ 0R˙-\tJlTyM_:I=GdEoݨz1 S~@oWӘ[2/ 9-;d zEf%u+;LCotIU졩KK9թ3Éz}R}EHcVIo }ՕT}y~ saQ.낱#Wό9- ]4-.QϘ׽yJ7v'v1mG'u-ۼ  A^$FSh|[1&etC׫ MWih٫#mt*ԵvM}ؕn$mtCVhn15:(FvFaS:8Yi877rY؞/w3]fsC"_7r`-ut@;1bW4蝴nCK:AFZ^}8/T)^ic"'Ȋ%vK*U d@.9: cC .=j{]a]94~@7w[L6ru,Tu#uL bZ!۴Eޒ>z/#vtk9;td`#;]wx磳CND:R*NrSk얊5Yn]bȆ*t@gbX#h iN΍|[(xneл.옐}/'ݪ!'zkzQ%IuWYA'mk]p>/vauPF1 OꤱIީP߬b1FM02$3}CהDkuTIoͯv`wuLAL#hy:N.2Y`Oqׅ9-^:սe\2MtK 8!!E]|&]63; Iu `QJK |^4d `&2ÀRɱцVr5GyUj m y5S~k(7aG}+)o챙^ֆS7}Kj<Wao' ^nrƾtܖa@ƁH>\Tr: \[b>6z[5JG26+LŻaWcYOf/y[J~)]~ 5Ͷ#ThRlߴ Ou%))XGS֘9SJQ] S~jn7:w“*&K`kY(@2#Ǫ<na٠z}ieUMM@a>[OX^t׵XyxYBqsӐgMB=x'KX"'hց;r?FfOU'/U;ێ2sGnFY+,ԕni@ȈO.iF̳Ğ)SIYK>oj70x.}b=M2)}׏u 'X`'nI?%h@buU7ְ~~57|O)&[܀uqA~]L[yP7ih>5ߚ ^wq |}%"MB`g͛IVg=2Geժ_tH*nD;~[]f&ZM~nq|]*'w:d '>eTf(*R9X.**X<+F^0t-O.^U*ɲ-4 ^}M_Tq.VhF_.2nJ惦u>=hj~& I }XE*͍Id?Zqʧ.|O]u9C;9m]?ZT~RödWd:ƒ)mI3fٸ'L,OjmWE Aok@'.̈́໏UuDhk~9[?Zpe`叄IW0R?իuq =!˫9m-qm&aZF`'ru1nָT&G-z}|zAMLqyYl틜2=ϦB^w1tw:')C{J "%HաΣVNhR𳃲rþiRW4&woQkU&`dn% !1m=i6Lc;Ы4 l՟НU&t6I#D$*C/xv]|ˑM,@fF.` y豥w^q׀<LCޤx^]swhK*o-Zod<WK˃CKyM3l؇~ؾKN셍=rUF45 =a߬Y>-N9o|D䑎Y2CKaP޶٫/>.-cc<9RY?I=#_,D92{xAB)U䲆8z7T1}ה^y#򳲹3拏ze mTwP'~u#`ѧ[7#O[Ch=8a:\}zWl%ѿ9އEۂTXE6VYyuz)2RbMT =,cR^-Pe]G!7B*OQ 9Y6v(( ȣ~W>rU-fRzD|oZ|Y~0=ȫ6&(w}Â\?7޶'4c\m@N6-' n^{i[@ȶ#< fo[ kf +6y%[}֔I:cxpXEKʺž~g u[7\<4Crm6؃cx5D{jGD`Uh٦+JmFR ^SG;4t7kCfP["kľYcy譝4A)!o|O55|L Pn^qSgj=e6 - [V'AU#mҘ}s&YL8脧dx7o }M\'(]KᣧVrI>Y7h̉~kӠD(DT~dڌv%m$Ok`^Ь'}Z5IS8(}uT^줙Vee_]o^r*7>ߵVlq%DZ朗8nf+JZY\ _[:yjf }.Q>O! > JW;K[T{4U[#)(AK7"n i8Ƥ|[au4{e^KQIce 6{ٟmߓȠzCfRn47>T^zpOк|'<؉GۙC C#S;0X h{$9w7:=T} ־YuZd1IRg]{AW]o6,4fu'g3i Z_n̳ȍ?R&K";cv\c(YTmV/'vp5'ZIg{zY܈͍]㎵_^?ٞK>3iaJ r ؗ?5\ ;h)U5B {J8k4xv'[,'<BF1`7B/5&d<5p/]VhN[]Cy#uh/52yh3Ao,Bc ۪u Z5'L쒇rIY 7(Nd|>зSp2)w4N&y~OL:@~x} <7V~_1^iऎs9\Sn~OAW8urbghm*yM{]RV 6=oNS&Qp^ y>𳬊|yֳ]V?ǬɊALV'W|Dq_ɞh"T7c]^eH'yB6,hӠٖ&?DB=/eһ(UY: .v*0\c>< 6}ag&kPGdGCOV7_v\֕Ƀ2m#?J><||G2:+OG##w^iv#e#{vr u9ב =,aj-Ќ&,I)Qס+ -Y?iDpnU\Qiy'M=nL"'ϸ{9I"i!ceq{E;vC&{nZ_$WhUa֙}ٸ@ ~fx*"hcv΃&о#ϣ{{Vϴi4丷\>*>m#r5e1Ӓ9?u*Ӧj7ݸ_n:Ige iW!@r]i }Ge^s\ {IA>X[ƎĐ;H_гIPzE^Z@O _%\f;O } zi\H/i,o](1Rr̠?o*e}w۵l%tcor7}cY̚~g ^~oÁ _Ia݃9Ϸf#袆8層_k,-޷:/٪S3 ]{1}=SU o:;ҡMh3G;b/*=ڠ菸|'KSqt)7ұJn,l.Yそگ\I: {k/Qq+u̧i#)Mm6>"'8~+v4edck\IVg4X!q ~q>Cn~lJ#(_}Rt--v2T>73b`'Qߜ[u z}Ʃ4:2[rO J~7_[D)Xiv6f%冾7f3F@g~CVԤpw=%MRu$uisrs;%-%gvK ygީܗB:ZN[ɶ"sݔ"ӭe%],fk }~`uȇB‘ ?0[ݢ!$/e@Luw4RNm,wk#z}dj(S|ES#Nۿy_iWo?gHu."EΗX=6x˒rt':/~N4=rU>bZoڡɾv@^}4_Y˙I'm SݥՒ.z6*4{6j].?RCuZA*BV 7_VyZDz[6:eZWT}2xxQrh_ac^Z[CfKO>fxh($w:&E_pΌ&ܤ4V4vpW7!،K8|]6tQÞoH9K(Alƀ.]4tn԰%|/#rg*uOaBK4>Cލ 5Yym=}d Hyx"AMbҖJFt=)ݠ?u@~%u!1'@Ύ|ev䊱%q7I^69[^ѡ)9m{.,K'Jeou_&vQzWl˙01 G*v"ߜ^v$' J/fI.UOF/lbA9 IF^$ۙ=nA/ʋ3W^vQoȩ>N Ӹi+[AISKr}> P.|fp*FSG?%AHOfQ;N]/F?Aߢ;*TWOUz57Jʿl!}0z^[9+TFFKb׼K }~d =V١WB{6#_`}`HLW/` m'nZ ܓcPoAW N3;Ezܪ}MJ:YJ՟ЃR'vapK7rc r7{#+yOۍ\mi>T@~1e焜-yA UFcuÆWmxc6nN#ghd4}A $:-BsrzO /)>F[A,з5/7u3a ty'nwdv^W䣗QC v- 7Fl5<;;\})}B_3_B[C~k̓[gyeC^e}/c8N.HS-&/ zC͝\=9T!{& {0Ԉ#$D/<1nV ^NZYORl`I)ŝO/l1~Ý+;6{$z a[r0%q(aMTg}H>/5%fzkqWSϠߋ:A<(ىu'Z>Q/R˰f#2XL;%#OͧR.UHon]J92͏2y>-uJeD>}е7S+vsT|xMILu;T/(iJJOVk<ۅ׶="Cϋ;:KC(З*ø;:0omܨ}NÐc+bWB1O->B==g+Kk_l}ny M]tL]rdQu-,]y4{+ЛKJBI/CyKE#;}We<հhGy٫UB1oU/BkBiМ9?KB-}} P*Hoj7оXC[tgJo@.^&-Lo^ #z#( !fmFN웗&vzQVP41/\l6UtKXtT#- 6M_bPAF- ~͠r`ouw 'to`;NNbXF؛Foԃ@Ba؛_,qkt-]ܠ+;OjF}}麬;c/1T ̎*%t5ltĮyhBе# Q.kУ rBgS~֌*dZt2TAwQ'n\urB9͙u~y_tow?G 4TEOz%>,}H'|buR)BJM  waavoli M}{A0O،"IX3[ 8g $#%ϑ{p=K_<"`8l~b_S/fXտW56 ZCR8k뫚7N6- AvZYo؛h+7L_ 7zt½}p>3 gscZo{hf5)kVS'-v;?FS.1{ݼa؃kc  )k$ziҢ#>?=>CNАNdJ\W` $C; iB _Ъ-M@EW|.~D{OK[7?atx-U99y@#.G9N:77촼>ﮍ'ڜ8;*)ytEefιoK37 oCѐF#gѨ+k|`o&-{+w#*P]f)I/,qC@M[SC {QrQ̀w3]˴؊<Fe!}͎)N䓰aCeF}C%oԛB=.kd촴c>q?Gb,m|u.g#}`9B3e}`kS~BBOz̒ĴQ2*pԵ~N93eW_5{%{!0w=`ߧ\}m|2]8v% 5|W`!tӐ5[rN/cW,xb_;}ث-v>\OM,Sӽ~ :#4c%Zn;ԡkzh6>Mb~鏜ߒgbS؝Sf `5nt^ܠk|f ֊z]2w1L/qx _)t$ v32VEWCri :p j=luh>29S* 7K?Kr o&|* uVCo!^! "cCȽzá-Dlzbo"u;2 w(dB3Zȣ3NROmB$j^wT}j^ڭL9 a3P=2y\C}if 6{vŖe}Oo ΟQ/֡Oߨ?U%+7ƒɾ9 / ~~S ?X^Gf`pn}Բ4q?)r@ yTNxW]_UUGemtoI{d?2ؚFo?VoOa{ > ^%6lh {w, rث|?18 < )qP bd\nf3WΦ:i|>uE5PꃞO>p _$pis`+x"U$YDif^*Bb^r.xNqo4H Ͱ(êB79 {@Vc|U'vJgWʈz{##-]Y>LUSvLtM{'y>c̰!Ч#&$3/Q0=6I'/}hR^bdIX SVbC}"}tbn9kb{\_=܋8j n/0:ؾ,tvZE$kWP鿾ˍ\]aIίx#,V=U[|yN\d~*`h۫!.Vk&]”kA]\,,P47xМuݳӘ^[to^ktc. hX}N 0"W=A.oR?6,'G57]v ֢E6ȷ5#wSy1 !ʉ=-CR7puu1Njفn(a(q4e\9"Y%r⚟Junv~:+?BZ[xpEȅ%}$?| 9aXBRETW.̭#-aD,>v IIݭZf[>+i"_ Lrl(Fs_@ng$+SEtD׎w  v跼[r,l-pcnR(v4 ϳfYC5 tX!6 X.,BxFuI[,YB|(;_cGQyi;{9PBg+}2W*/u.Zr˗;DrlG7?Бe -RlgBR%JyH7l73NT;"n)[:#W[< 8! -[B 1^fǩg8i:C~ݟ}g0&k Au|>kՅ\?]?lРէ8Sv!j+:\߸R":džB6I{@$li= G򥲠QBw5oFY+[6k77#[ \i$øĝ"+a YEaNdqW),$MLJKs7jG9nV}ޔ|F: bsilO)S>'B%om71W+ zg%=@s-.Q3z 쓏F9,=AV-"΍h` m!]~-ʬ|6sIAƇ3YUh2 y\zΟ'8a*@ޒZVD yTxN`sw gM;2F e[s7𞣕AΨGɓ;-޼{[Նڐ3sfS8aDd!nFdzAZJ<.7*F>_TqcD¶WqCLP-H`ҲGNLPt}r'=]!q,)7 16w@F>0}yہyySq_ݓ5d'#乭>; 21^ F⦶'?D!.LM39O _c@^ .gr<lyZ>rG댭Cc{Pt'qoxcak3ۀ5ڸjȳ 2Ƴ/=[xn!J**p \\Vse^2S&ey#j;\ Շ4(NfgAq=\|W^ ZElc,Gȇ<cFx& }=1ȕ(Adq0B6pry8+!~q*י|yu=~F&Fnϳ%^u`W&z |"Pŏ ,)2Bom[ YZdZK 7+fޖuĠ@ KRCcKW+zAOk?Ҽ "A gqFn)jGg'bq3YmͿE.GkG)#x-!φFX;2Xƀ{|onyBel(rv%өѷ 3e'y5.!aRk5y|bh?:!|4{o͚}319il7r E^}3$}xqz,Ǐs4¦#peՐFyv ŭϜfy> Hٸm,Xbsoa3[n9toUkb9pJy2}o<7Deft[AX>Ҡ`[ Vbhb!*1>tB\,)l&Յoköˬ.\hi`e慾3T/Q_nXTD?%w-k\Ã>i3$W[j'1ő%8c#[3ƻt\S(ȱΜ𯍿KY\|!g}Rږ7ٓF*P: }IB_g9m4 :DL?5Y窹 3Ugr*%V_ArBV 2ttkzB.<*}ݟ}ҡ儾D}TC7mD|7 (N^FUok Fm Qz Fbn3-F=fWob`ɹkV \r@J oBRB~"*fY0rx^k FdZk`o~83E`~A$p'C }^f-}Hfv>0UfB6eYaBo|@_.KoݔNZUjQE-1}Γ @d`/|͠eGWuMKH5G:\ַ ց]}Ca:o3n\>9m?&abЃf=e\ʴ:t}e(&)^@VG|.^:a/tu"a>%~:r\̮}ӞzQRS:z 6\wy-_Ed1q O[b'꫙=vR|E!n򉽧G_ZLupћr"|u@ -Jr]}7wYXc'>j"7i'|56NsSξVZ:l3-j^=7[-`_3S6v@NV}NL1ߢ9l 49,}Cbɰþޯg?GX/[,!h1nAkt97'<*p%Fb ԑQp, [l. /QBvW{L.vvu]m`9|Ɲ\m(5^b{Q8Fn>~CSehylZkrP8y`-d]ir8I&bΎtCT8Y>Pri!w56bU3C4>k T)ؒ9Yz`O"KZh%$;ә8rcSO}{@+*Z f{^E2~kXVONoL98g~@'vO}DC 'Hz؇4\*44nطVq]X1jd/ch'?_Y"c3gv"FF3p&;Gˁ]-w;}jl22_&bggfޕ]<m=ӝB]]&d6+[']A/ܥ~|WvVQZgn}"vCHz}u tK\GQ:;Sf{3.+%swv5lAtbTg1lPs2`>f3m]_b8+y!r)b38]s^+=N":?~5,|!uL{qA֡y߻G'$tWPQ距b&%]2Ԫaw/duF 2ȗpB=H2WWi#xS;)@Eנj@3{h^rPl-#S|>IS~& 6ʎV~9v]Iz?z3߭A+Xw'uB]Z9/g=xHzNZqQt`Rʍ}4Nߤ81čy rߣΟg)Hp]Y'qru L=i 㑆#s# Z{BuVFhxOoo.3)\-v#ILHWb3\/rBL1 ":?Knj }TSli"e7/Q-pʘ}~GZ$F4%`+{Bsn-|L W?Og+9jw^6t)7tfڗ]S[zIA{@_ >nͻUK93n93ءK3ٯL ah%AA:"cKS#fJ\= {֯l1KzLr5@"^ +[\FWKEd/}GcyQ%7(&eЙYZo8ϔ)5txˮZ27[1t'>e걁SDُ gөWD8Jzj.ڠϭ>Q&h3YL֍+>+\wO-+^#y"'JZ_hCE,yGc.AS|nȼllat;_r~n&t:#ݲ Cf>+ݐ t{;g)oD9bevo^N~| %DCm^g}u*TR,n+rt7Db;f7h^"crػ~u~{GcN.K]X}Oo.%nq2 xw#= AnRE?[Cgg ]IU5*(λ12YZd&!DMNЊI?eoAW-=~&Aos(J8C <h m@:I;ד/Z>"Y@]$wClQÇB\~#'9Y=C^+INtʏL)";dZ1!,IӲ.VcKz2sNs;8Ok~ -tEZzZQ3qrhi7ג#S*>eV\Z7\Hx$ QA~z[F^`WkOЉnoû7CfY\o"&QXﶙOZZ%ym#L9I: 36F|:C{4>r3VBV|b\RW%o(s(gq}nݿ)79V'#4:wzB߫R\ ǹ,X|HVbm$\ep ~Ab[ZȵVoj\kCoa*;賗4՟y"nsK?W; OgK}l%A?R1MN0y# q` >P)FeE__<^6^!v=aL} x vk qK}"ʭ@. av9ǹ'X}J GAfО=~m'x'|Rtnkn~5eA⦸[ps(H(@)VC2K)uS[rW|FNnUЏ _UBN!iZb=s%r\]|<YA<Wцۅ`(;8)59I-7zrܒ wo;nXxʘ_ni;q}Z7/?2ghP&88t]%zE=ޣbi]} OWHMkW dN%/m\q]zB1tn@޶  hO1[ 4O!I]:YCu6FNDG3Py#ggȥ![AOnE􌸄ݧ2N~M_\4-ެv $g4'lRuY _M"I9Gvvc"1/n7@WͧQ<ǀ&݄"ǭko7AIV#dBgB3˭!<)TiD܍^bhKX.[j^Unb@7p9H?_U- \Fms5;˖Iz8{C&Q7׵3 zH<όQ\Т` <3.s-uX/UF>+ g+ѿ=( q&o> MuLU_ y !d =*pv>,IT7p1pBݼۗY7 }.nvn%F=hLjŢoK7W4f6eP9G/qcmE5BФ8%{OgL8Q~G>Ϫ)6NS ؎n5Q~j:9i7Eb+j#g^6hj|=7zOxK+~ lqQ:yQVYm3 |M=Yn"<\ѐC  /IY ;ȡB% ͎\-*2lqeLE3 <<3!!w$qR6*~;~ }]R9EQ_cBУg*1 G.C5Vl' ɲqC'D|Aw6DT7I:IY^bQko5yAJ\r >% .]Yl3lr*JE~{篓cβ.Yqs|hlvAO8j3I2oj|8WW $E*G+:%,%b#UzZe* CN2iW?@u-#ſb8h|s;< 3#U{eZS97ϓJJQk:3e"[\boYYm!7o 2r,q0Ӈ1xɩ,T"7rrrX؜klmӆ7ü,$ IzKy~|zh7iN"G̷ A*#Я=ˁXZuV97m,@1ZL(*B/Iл7./>LZܰ+oR{!`&6I - 2r# #jow?CZk5|!xa˛7͐nbO1̜qvmCͻ ̰e[}e 2$b6rs=͕2\efm@{QV?ObnRV봸.#hy="-ctVWa߀vFNgrx45ޖg7/kkȣ 8U3E~V֩j SX \aoJ4Y~ _)C6]mً 8uY PI'GPS ~E>z hja*67o> nq?T6C \z#ֳ46~t;} h,(:4p" Z}u)Ad߾2b*Aϸ_O5J}pY|ggJ5_UȳO]VLli.1㚜l>rf94 ƬRϰ[fuݹyS}";2IX w术HVIn+d!͍ <.e:cW2H>l)$mȔ͡ h Cin9mw'><qВ&T*x=9TKy9Vxy'<@Kla z_2򖭊pU뷳P@Q6܉S L7\_9Mk;VGN5r]Z3)2zV||wrՐ9M`tz?C'ɷ3dB.KU t9Lh; Lrk!53 qUI!ֶzt΋ \viv੟2dB+ޟ71Rt=CoPN*=ڡ5( G:δc62wkL] GcEIR}f!-ЙyI^~$ eɰȬ#"KrIiё֑W4X_A"M>+eE.r 厖>igY$^Or2؅g7b- PT'}ߦbK>c Ʀ8vVWk_XGN9hM{9C$ľeJ.3^Zb2gMz4M ;Gf.;/ح (4Ngǖ$?>S8.90_ĽL3 d w#]d[=-~=Cg2 /2*2B~$!bv' ]*`7v/sA1Րҡ]fvϭ]00u~/#nTKɀzC6ޢ=n;5xVG9hi++Ԙ;*Y}H+/#k4;uyjD=DAs@I"%|c _b;r!{*BWCkEsor}=?ym$ 4.z]9:@wBW}ƞr . =8xa7Zi<31Ƥ"d^G@S-X%FfƮDo00&rh մ>5ADn>o N6Wa3~9Z@f?]Ϳ!`٨ȏHڽƖ8+/%Vz~6nKӿaO8hIV mրkCTnd<>%c ʽ}$Z~qz;;mH@5!S' kv]! 2~Bh-"n~_T =У\9LbQuuXfS.vEs _)6h֐K-љP4 _W'0י ra\c0ͧ#^baC)|j)/NijXHD'q# S7i@kf3~Z²@OD:ņ2ST}Өu OJQ3cSl027i,z=N;r?%NP>Ng6vj㽏(ͼ7E'z{ ]bɛQ'Ī~ [Dǘ1!e)Zgu -NyWb@ o_>5M%K/ -ٖ&{ zE*rcd^ n3ZQfw `'g@8J1@elgh"qzC(cIye<!,jt}ϕpkG߭Ӕm1f@+U [#1#^Rwf`K 4tM]65KS*tKftAO(\oOW3>Cō0ө^bI2褽._(g:W-jn~uXL}7-@b8p>ГvCafoZ ` 4 |3Öl(19d>]n~27hEB\TZEtLU*cx 95at%5{Qi!>Zd` ]dK>v{8}=1=µ{-CǽN&~ u/&naOgD [}%GV:}i8%=B5F9ߚF^YJVNVU Tl爉<0N_`$l*{L&w]ޢ3F4G?Resy#i_V_N,|oO1Nk,U#b%FCBTxYͥG('h>s4ĽO͛Vqc}HTzx ;~`5@Z| GLp7pqy Ykng@ӋG>on*GA/uN˗`;rGZy ZK㕸6om e(߸{##GgE ae_˺te"mc GDzזqh7N6-G|48oO]W܌et [*4ak6O=+-wiAB%F~q\rELqm)M紹 r4$\8Sr[ІY:eq'3t-t/b_hy"緙t}@lퟧhHVȢ-䯸E|Q6smC4ȉ$|͛hI<7\q:)g4Yl^Pn7V S&Gt2Ȣ2 8Ց/p[DqZFk4FA#^MsVnV&G;9\ r"Azgf:@K.jN?8- ZnB\`xI5^sf꬗ /T;Oy.pgd\]ܿUǿ6W9/> tbNcMgqFv{y*U,EDڡT=,dY=9$s5Cȓ|ZJнҭ%pi>&_ |rt\Dq7d=ɔ]p]2= 脅2m٭^"%߼7n?Β 2" hv m+Z~z680 |Ay紵P't; eE#~d5Vq[F G~$Z[rOc,#b n#+Æ r?RKl^Ss2,N=?Nh>$=my|KУrv!".!*~m@nFx`ˠl?Xn84ˌ,б.['ߧizrfO+Q73tZ.rq( ~~FeI'!J[$D<"ʆF~J"׬6̄Y7F6WtAP3*wq/w 7sFUXNz\n!Ѱma-0:\TwLA?tׁ|>7 2MyR y)sQl[:t!D"v"LB {W(:XF -m5*4d ]uq5LuD&&Z'%LpϑeKix'-ޱׅT糭V· hX yVm_j V/j9^>2-7F'^^^BnpzBd5Xlt0,@LW7QNKVchۅ>anT%`s,ȍZ.cA]voye2+armA3{|KCe6m=#Wn#VWDSÔ4DnxIs s+Yo-fnК ʗyij Q[$*: vɜ\(}P@ DVZPKhu[YߒtR7vRkΜ =AO[B,:OڋvõbouKH>=^2[4m^oA[ 5nK2Hv<%g<5 _QIj.[E:=>I?mY5A3v9E⺷Њ}k^K\̚ĩMۢ}%<.k)gXF^>L1K[o\?~睘'~Pa=-CͰ9 5.<['p ~"Dn)%fhӨ'~Ra֖~I «Ɋ;,.mnXe:Z-s4ZunhN+ VGn "poOdcf '\&p ""r {%_-2wg9x2߾oh )ޒᬅ~(𲸕x~![ʯ&6䪣sU:>o^;m4VrW>[(;M-Y6>K|Mrodb -@ (}yzOZT %o( ]=?q Wc6/PAAlk#m!妡)eNf?v8ŏb|ڀOhiNmDy.@[=q[snj,qSpdo 8{vM 9 x}$To:Aq*~K<}'p禍/p ?V5X$ӕxF\W)cqC}ty7(W{wGn#-o-BdWMP |n+GUS8 SAo1]/WrppFĶ8߇mXr2|:84.=iЉ\ײ*xH4KtXsq|e-PkG4rk =&7hgx8G\D5\`k"7x4[, tb3by2g`Aߴ9LN:9M^҉Oyf^>3p;#1ed齭#+)[f>B&i֠:} lN?s^s 7E:U/ٱ4Z[$3󍜲ǰBkXU4 @/QDb_;p0^Wy9Oo"l7rѬdQ "KbfHEG?;K+j:ݜkIyvbhЯśKZ|T;g84hru8$BW[Lg\b|Pq+ڠ-YMl@g19|]3,rp%"crN>mc:PB|]45נ:+ Pڒא5p^[h]uMZU;p:. |,!3CJ |$:&^ϐEJl=e#'ZȠ{3Me>ekvBohV 75Gq}'*n:sWgM}p ?7-#3J[==U?G >@/}f|*GKVlTl|Fn)] K}|q@;DoG*)rraz"(i?QgYkrQ@F /Jy3h\o ۈvEp:B; =] X8*\} voEeZU,2./yFwe]ej{C[{g | mRA^Cdș֒2u 93Y,+ E'Nf-{C<&ed^V(rD;ٖ'# lW] kc=Zxzyk^#b'lihFNL|Bb=pQoR-58A \ 'mkk sO|+. f&mͺe+B\{,Ėi`&"%'5+rYΜwy^[`Gsom3ۣ {WذKmY c\DfmsFޠ@ȴ^Ѓ1 -bF㾊8]٧]9\-D8,|#:!a6)d5:ŠOvJ Wa?4n'~j-LZMMڼ: a%]x# - 81C.g~HL~@s:CЂ-)xBOua]Tp&4"g*Dυ \C*5 f &U8uUBW87mP;o ]:ۯ*2|E7In0gmtE7<*0? =A$r"/#3ό,~!%8c$-[X22E\>XvזDh~\hhuaʙ.K2.9t{:2{477-w z4+nby ٿv(trWd#\VOM['h|hiGt ?#VC?CR #){xM)9k]"QoA..$huޠX < ~MRFVu8\_dE 9m6p^U6 *p*aV]…VM I~†.]zіy _qMg糯Ȳ|p $)v[Y ]}>W<ϗ8xz[n]^6.cNz,%7 wqM>ПDquf6ⶪɌ9.g~+OVeIWkRlj$Y;>q?gN0v糷uKAE{h+)*6_;3A%+PD*ލbO[)Qj9w9Nbqu"h''n9[?%&V:r"N=ҴxD7J2Cٸ'θSpJ\BF.m5p[ o=^O ܸ\"sf#%{; P8 r\&/&WOj1Eq͍r#/Q:;{zak; Sq->,?O˲ק'r+|yO/ 92,k5ٯp2t@q'4*2zf_'վݥxifU.WgaFD) gX,O5hфU3o[= Xh\x%l.-A`@ YW7MҮZEďZ1ޏt WQ=5Vs,29յ$q/[o>N^\FC~rTvGdO.mv [>+wk" W?{56p]7:Cp%laa-*M --폳䜹pNƱ,ń\4sč| wcپ_& ~s!3}3ESsp-~i-UcQyߧ4}({ŷu7}؎ ,lr7ȴ >"p!')~ '}ϡ2tcF^ bԽ]qpEd|\k]ii#I% Y7Ǧ] )2}ext? =zo>Dȴ$t 4R,נO6Rȧ>?+zyXәO=gtk`Ӵ(Nڳ`j6GS #\Τ-7gqJpq*KlP;o1bNnEr/3YbiЇx]4n#T@ނ6&Aoꭝktf 'hmDrٸt}L΢QQ%d''<Q Vj-6cIJT9es^2zb;7/ȱX- >-;0G9H}I>\%)7Žhx%.ܺVmz6;sc@_=nGTNV'0"y?#WnăN#V&t8tPer{$L.e@v"KZ[܋,jw! })ԵWZ#[ZĹYp lw=FZsU%7&z|0ҁJL - UK9LJRp9bysD.w!<;C]B)w>Y2H[MIn7pJ0 0\Bn)!^NDv"oqƕʡ^ {oCnCΚOPzy9#rDD.A :)c!ۼm$ {X]>8X~@`-'L8Y} z@;b/׾OKSVIb\<͠+M Fb"?E"p}˪DVξ,E\'l_l;-~|%$cCO^B!Z ݮ:8?Ѡr @fu`^q5&0`K`pVq[#pě:M^#+']'!#uL`= x@|]xBSY1D͕>MR=S <'b&,F>JJ:+![[Wr1$N7hfЩmr{3qa-ݩ@E宛C-Rv*E7I>3]R-)4?roo2>Z̵ZVxx}(ϑAW7pj1ktr39fy)4Kr?#k%pRAAZWF: !d~Lډ…ֱ7G..) {ų[M|ɧC@R}=%Lנ Kv7+yQ5fxz< u}rr׵M~p3%1H=fS$m54iػMun3-F]ǹȧ umr#k]hNirW"g}N,I--܁%{[}QBs:`R M B zI!.c%55y *~nŏVS+D }j?7T'W"'Y܀/N59Q73fo3hS+ s=8PgtIQ:% UA*w"-*ȖXt4hP4qqjuXOǙ `\I-"QTf, \U֭-Rtob5DN=}EF>s8aFȴՖP6o_xZ^J=0ՠ95n*\)(eMVha~{H\[dꢱ?wrACW&5W'6¼ ]^ISjCE.,\>9pŧ)">䶈3JB+p'rbLD G{EixTۋ{S߻M*@ $*C8?3y[W<絬hv?77=ԇ8=TZ$_V(hKPu:Rz#D^rXGxWR#5n|,A?p wV\uL oKY m-b5@>?E|ŭ'l~/T3{CՐb?)rNs&[(ߞ3-n$ȮB,?PG :Jes-0H3D8.Z%Ƈ y/L'ֲD6́\2!^KgʉrU\ 0nYGRɔ|Ɂ=?T; hY F9Wz7vl6m-(7^ 7p!/Z󕞉պ*Ϛ^7peYݦѠL I }7QߏE+])M}:Z"Dw=Y۶pon\!ʉF=3~=DD7'X6pZ*}w`q}Ex_ i'E}=!/|-ˆ y Ł'0P^r7xm(W*C2&>ǹ9~Z%!O:G*ŠG*buO/?7J)rN(ݔr|ok!'d,n` zMtwRO}Cpm:vy,FٸZY) uTTV#zrL:.]$XTf&!@\|K\_ʟJ2,Al=<ՀcU=}S}E+6+,ȾB[1kes̫0bomo>M%%ܺQygȇGZ|8{̤9)q.LСEB^WB9 1~%~AGzX@lP+߾Mg?Y.6"g*'*tO p |&}*xEO~qS-->b>>]B+%h'p{8y7AJWX |6S-BO@kp$Sr\<7@WDl'.ͷek̅|HA>~"RKW÷UYRV$S!IusIi'jSnZ,弑w-8WFtНqZǹ*~񅜢ai.%Լ갼dFD |KQZp l>A,%eOo_#6+3@<5hM~mXA3!Wzv78qR-5D'dlvI^ؼC =M˫)E^kVe3 oG~g'2=d>l. vCCCt&}an!^]Nzm"vzyQ2 p syTkPN?%|>y@7,(œ>^bfNZo,51syRoÅ~Y=,?gtϮy#Ϧb5h'*rn%#Do4o?'ݶ)(G}2&B['v"n#*Ͻ17} lr&?Ku0XH?;[.C67d6G薅* #hg+WHLZ|eƔ(ltW ,8#K}+'*fԋxePP9\er\^qKw>h%&,kR)T%"bt^NCUX,T p v) O*.ں.m}mTd*\OMې*IDž<+\k"8ӱ#2Ov U2vܲGbZ^?Z~L&r:>/Ru1 :- Oʡ ZUz@;yW\eDKUg#}G>yVwtN~֐}\rgq[}CKmhoD5C%=*\1'pM~;/Cޏ7{]舨מpz`o@%R@geq&Ue9kr躓|a{2):&j}R9S"'oЩuN຺ N߭+Bo=5rbd 9x:m9 aGsM?Ckc"wE%`eF^ bЇ,ӭ c"ڠ&?Bq.d5VrT7\(е&Ob1BNʗcVu6pE[}P2[`gi|9 jHvsr"ߗ@l]lΞ%b&NU:K,۴}dLȕ9,d6Zk֐-~ґ[ RC+є~xKOx|1W$*?^;08gxNY4S%_ dT-ޅ!&X'6y8FeoyE=| 5[Z+DS j[e?]89 *r=}V(n6'YґkD7(E-oz ԶޣB9nX-&$z? ʑMVBnJ@6(t#ĝO%ťg t@@/8Z'sdW<.5+bN"qY;P o~\+=+ |eVΔݯbf&;7G_͐w[*6 _~[\g#/י]9spT(u j\(q ?#:$I_r ѠQ&AƗky+Zϲ2j K$ .#yPpT._/'YG~9f>+)ujLyUq9hyyV?hRes&=ҡ%+fGҶ`K}۶z^0C<߮Vb\&5]%ٟ.r}{+Vs8A^c^*.#Z2SX+["#,5W%!ynG2N1ln6{(QL"ĉ+2rLt"\ǞyߝuXin{>B{9z bW/r'n;IHnOGDЧŻ lEs. Ŧys4EKK=bq{ †"&:-XFu!Gաx̤63jpܰu54EY4C?MN=YUS2vT6ًz<տ1sU3 '|7 _?NTʼn<ڟŕBeEn2*x>,bU8 masUgjB>ߟfЉ)9q.S G.Iѐ\Ynvl&"&Zב2,~#Dݶw4@I3o&(Jl7p{P.2-|%+p8%Lp{azZ;pO3plzڻА=eAT.sv`8M, 'I@/ 1Y1cO78L2]elO[ELtȉ|T]fZ]B!^ ƅ,z473./}]&|!\z5"b3AX6rH`mS5i__UWWYWଫ x 31W[Pʜ߄Vv%lG@j1zGL=:CKhXkyԧU\wϳL{4(Cj'tp ~Q|CnnM 3Ev"dZ#oL}mc]6_zE :cdnuQW&q-SF<14Fr3W {,!؄A3,{0O >eqV>u'_G{I%;أy+ ,?˸,;H\VC-6i[h,rzz'4vqg1g,BJR܌炽j7{3Wudq*t-G4E?+z }d2耮~=ydl<"7|C/Gz. zwLlzxa?O͡+h.r!=G*.yerZ rc`>-v׏ Eڞx詔[<>cQVA??\%i&S.[19 .Jux#3El"2-rQm2n̤}S[UY "Mntnė$\ŷ'2'Y"CW4,ɐ-.9끶{Jr"w)կ 1v#'9}c;zɭIyA_])8 v֠c+>;"Bc=7(;[,mvNLloJudE 3Cg.Wk= )܆ QUMGGn5Wَ=Flv~C'}ޣ'q滘e "U <4\! sybGөNi!I[+aR |ĔE;r?hDN%o-I!Q;hY24'zceRZ-/TDpmi=9tGf|Kއr \B'lt!Mzy>-^!#ʞV@S1^jm ГZ~"nC~@k>9$.pjYREz .|GyVjk. |-fmL~Y![O!Ͷ١'Rؒp)KmJ.s|qB@B^%*<àW<Ȉr;&9"n@7z2$DtPC'4o6/8;#3m-e7p><@ e/'/ %z}4[BK_o>UqN>eQyNÅz Zc},rʼn6-h&r ]wp芿mr/ԷoC n,b׊bWCEL`?E4ʉ|W49!-e6S, 8eb9n3-Ny | j-&Y96mRK%a9O,Q/9=ys#=D\݊a?irQdcUe t$7'pw߱ǶKsɮtrC:XcdzS<&IC.Wqr_Q|>t#O\, gZ!7cNE (Кwb| j7@ 6d>PWaspY{UN[1)%O51=q~zܙ͸>qZx/ɊLQc4lJ>CoS[G..MkÓG\OW>pz^j'І&jނ5ďrC.m2ԵC>E@7}U׸cNy[j=un3%qN6t e2!םWiȬ>'gܶl!'px=m&Nr (=Bo v{oN|2)^~xjkȴ|G,LzfJQEVƒTa5 \w3#AZ'rf YDܞRk:&qy?yҧ-DӵM/gtW [?qkN!R q r^҂{I3U08LN[Vvxe[pB m^*e'Yz(qy =]bSųs0Dt!Y%N_bSO65h.릚Ol xq =OsZ,bz*:Sk9>#[ )`Aσ.xkYn#墇:SqS]xýT!n8uz9S Pft3׺6z5rfow8qJtOVfwhIuFsZ[3'6ӛKƾwce 3i+є,v7;C`?kqi'r RE_9)'Jr ),C-oڼ(6$ՙ<7aE*D?Fx%;n#x=S뉍,ͻ6h?j8 h;sw; a?E 4pn[D"ͭFLD8,q2gInyخtCt\ۋK=*.wqx] ss9ՠz;Y2f$oW"6&o8(nG/.Ubtڃ%ֳ1&=^fҐ# qBKB״@kyQ{B/K\+O#2wO mųin;٢1$bUSvdSr7RkȷyZ v'=2F-R}d6"e&[;RCvsv!gC"7c{Ygȇ|/@WB^WOݖ~{Kt)4^~eɲL4]VovNUxYs-pg~`T\9ʊm ܞ&g/--2yv yL$-+9[TmJ}jP%k!QFLq\iShjXl pa6`b}:WRW -:T*nBf[y{( !.dQu<\>½Er} \rO㳔 a~SV޻H3c v~<[zDJ~>0+/3LYVdGLZ>ʦֵ*prϳ,'涖.0t`~.QU-fY"*n(4`ů# yr+Y;ʎEUG -Y!UZwaC.mY] - =>Ud:6o-ѺMcK*^]8t.v?AۜeDKu+aapyhNr Porx_1cdbb38W[wjόBU}d|!׵];peim[Ҵq 8 WhX89M{^LMtτ9 r>_Byy,WQvo{-A&Zl7p]wjִyt=ѳS1y|e`o Yk?Ncf |U*+IRnE|]u˿+aj{V$KY2[EBsuLW[ (1rEEa01s|RXI7J5hAywl[˪M9m~5 4L(YC)N9ȅP|0jo`t#' hq#l.YvyN߅ۼVKq$䗿uzwՐN`Rj(ϜIv(y@7`~!w:ebQ~˯OYfڂm]k" 7V*1#d2]xC'd'7߇Cz1CE]3 \Tt|%*[ _kU"E{k[8nU7WK捼|yMl[=ü_|ԡA*I6hfϦc4/f=} $!0sq5dk$% c5O.(Пp8:-F.q4Qu !=X_!x?lŧh3UiEcvS_ItŠgN+{!NQSdň}k𵉠-j/3IL@kmКmakTޮNA߈$s=̕ođAm\\+4Z[}Ң^Iv7Rc$+!%LE.&o^EZ^ 9Gli]tX"kpood}Q-&q|2woN:=oؤa[.\(Ō*t8"/Yt0C^9nqu!K tz!`T Bރd>kDrvGCyWy㗼%ӕ,>ޗ7\E'fBls)O G`W{=͠ y 3%WG(RZԵ~N<= Ǒ߯8M\nȵ8Ǎ8!M{#WbN!z[V*p;(}rښ톞4Cw",qԊ,<3EK(&& |O YM\DYJYtzϛESgC.jA[LY>N܏תѹ;|?):} BϩN'rb4bd3#Sv&|=yo7?e32aO*MGhL2$I)Ln5Pg?9O!l}V&$&ndo**droR @{73v)I㟿Ah5'pl{U6HZfN}g]@rB{ D+Y Fnf9ܶjC$liIڑ,ˍGceF'𴵳JбҏP36j n27phOp͒F?oƉ -s~+WShyE,٭Bw)jN< m;J^3DS gn[ްkVT!@,NڗZ;ܕ |~%d(=C~YM-AqKԝ 8Ei2`$Tӗ CoWPIhh{OvG;VX欒v-8"t@[eMA g+D|peJSrL,.po-vk]ǹ!'<"t1AI6+)V6Y?̄8TzL؀gArZft#{p}ĥ vmM= )6TS ݬd*:,B9;Y6ޑBy҅z- |с=GY4 O۷XLO->xG*8r[\Śdx*c IyTW r 56-! ;!'-RB"Eu4bR$nPF.K(t[g|4֋?A7mE@0diqZ^79EeNq|K~N) XiǁжrEX)f~P#Im=tE}J>G%(LΑ/rˬ΁{ !΋&p[&OCKx#@~IKnGU\ =5=GYxx#1eC\[Lig`wD`}hjU6ANʉ;͢a,#] y%(x#V,jӯϫ'V]||䔉Vy7FN%VT2v!S8Umm(2.0"{O!q>< vOa@>A}Z34Ӳ6;KBRVA%?o{)[BgQK|#,~/_y' tgK@z.WkW 9c%;[@[8YE}xBb|oà #7/"_ydABڸ1>S:{+uJc'Io7r &?tq9ɞ!2E<{q})gwc(2S v+ϑko #:tdRc A~zPKXewfEYmWi˯=j4ω9T8_ tr?B~X|* ekdSnveF tʕݦDbv] cZuUϙxBu-0pM"tky/W{9smZfЙm3TZM'Rr }/.B\RL΋UfQ}w0u̴FpK6~'MFkVh8Ln@y]2O+7 Bʨ7(ץ5Kon 若۲x_ λ7Y7l ynk_FvV+[?HՆnK (nѝ7rYF_fФ%h8bk.+_> T!hF㍼]bY|5ȓ٧ROLЦ cQhVEYBwmGM ^[ Y&*6ER狼.r|M_uW2p%U5mf.yOڴhGwNr@~[#/!zyW |3\x{ \Mk8"RAڢtrZS[ؕP̯Awk?[V3dkmފ@> `Ɠq\s^ -+z ' Y?乲*Cֻ䌖`pK$jq.2r$fo#g}8Vu䌥c6W3Tr3\B\ԱXSwhX8'p~nVwԠ !゙o7 lpt]V=%Cnq`_L3 *LKo; M;k,,G ]^>Ը.zBlt^*:2trVFi<*vOYDžY}ϺC>Vh3o~Žk#^b>BtC0k=tBO¥h+&'v'%Q pw >ޥ2+>h:'GKfL\@2՗=^&&cU؏Ʈu@lY=,:j3MNzbK;tS3fll2فdpb ǧJYdڀAZZ/HMNıN9R0В5+kNאyCz >^t `!=f|{N%u`ߎ?{z^4w~Bo}sKu \>z4}m 7P7.tS>ej'Ǎu2\1,J 颈7b;*8vHwI<۟kzx %:s,R#'T䄞]YkttH>Il1X}@7NIľ$sxO@n7m2>Ǯ*)29wRMݐGrՍ&#iw3hlWSp%}& zz}/WuY*uK&^)Y{a؛?ę"EBr!7{'?3y7Bnjo:rKgMM9(سe b[R}bV.92Ndq;/F|° LB132fnO8V@Ƙ=v k}3]JPײzl`` b5"ڮ ى}{ؒ6Ь|n_9Cl׌ ^T }2ש\+4C0zq/v>[c$eb9% ݐ)}}%؃zug>{hBIsRu)VKf{(֎ 'YrI\Z"Vw?ދuز6t26slY?ad.9ubϠ !Z>ؗ6{[́Q7[.<2wjKŠMl;Cx`3 -'z܏(0puʢ5CXha91Saf'hrjͰ[98!"t_@_hŘCzvdc&..^Xmз,YjZa =&zX\KlWhonxw,HN oA^xl -;~g*W>n+]!Фg*:q?A N?5Dfœ_[;{BU?-&LN7^]cco&JRU0ـI]u忾\ 7۹|S@r/7Дy BrfIu}PGVj \Ud>e(}3bR(aOsؠۑ+h -ǣ=VgmГ1`o+%Sj%uSvsA[#u}hr/:$'L[.hKA>S(MQ {M{7g6v4v Os1gQNqthHtFCч|Bp .-=328vz!$~^ɚlV[oz:Po|LCXD)@>+6*LvuDP5d^ BO4\j搯H_0^ؖWX)рfl2ah0"Omx1nUuU9p3R)*y'iksϐ#c;`Ǖ"ݒJCGI}H|3 z^%+; x]ZIlkJɝMCZO82Ph꫄Ձφ(GnEПqduh++]8ڢ8"H9֡Nh=}2->8rg޷~<]v-CMց?`Jo$-wu{_>ZYNz&I=''񰑯"hpf?2ΏNCktk썼&\A}#oK ?:5ܳ [fX1픙bUOFnkjN W.>˨WR*@>os auEgծ r^UERd r*O+She(̒ m)=y x9 P2nd?q=T7[q#iЭ5_ r.8C8eɒhEsT\ѝzވoUץqs?Fnк\錔ƷBЖ$יtmW'|8/ߪh)ѦxX{U|RZg" +$r7r]u@k9텼/V\V5vjG~>ܐ{uo-I` 57#h0cO ' r ^{,# !,%!~ܠQRU ; |>Keŝ1#-|VAh<4:>@OJ4ቒ9sqE(X\-G;NQp1`2o]1\{WhYV= bٗZ)*;ےȕDo3;̹!Ț2WD6>ǀnPIF'-xx_o\J&\\-4|[n Z g{ZÞ#-9ih?c%&{>}8<XU>T%|%,]Kygx_؄M^M5L#Z;7pdzy)lUK.kxx\瑷(} 91>M;'6 Bk\ҋ!^"ҐZ"yKݵX7l NrpS,w5w idZ \CZnVa:6& tQv[d;h:-m֡U-{ziTځ^=rr G1A*oȩxK֦|~MJ|}wD2{lEݿ hBұOz5d m .Gޡpd]q R]'F>gYvd<aנkS SS<c-0T!>kC%m碫aq KqX :ג~!r&nyʹa ,_g8Uf ݎ hXtĻ>/#Vr+B+ۀyxVpBGƢaP6\v+t٭PgAkY0oTbxq)̹of-o?PzޒtoE_c(NQoiT6cMKd1u r`Z;c7p?N#V8(fr۱ .QUZ++`E |$]o%q V߬@3D|! !?:"VKZ9+<"`)$9+rВqb_yk<$KZ\B SЅU]Fn>s,vv9v}_I<; 2rhGy%^oA/@^jgx Z!.T w9OIz9 ͋B/7 87*kipv ..p ʮ49ʼ!dFh UnE-<{-G~A}A V׿@.nC'm\g7,4ɢm#ɗ%ɂn_µ(Ǚ3"Q[X=۞B턋+nƉwV"ǑCNlݰPK1(B!R~F nE8zYx{tVv]Y;ۍuy~8Sv.6-Ul$$@?$mgރP >$FU9"\YK]áVvm { '93C(9|mWqom#7o䞑<7Ͳ(~z2V-^+ݠ}+J{;5]nHrp@fe@$F TjkIVW6.eZZSp\X/pcy,!*ȹ/{:XzJ h.kOGY%p+QZA.|#T9i̜ϲ0q`Hre#xtyU* bk/)b8B@y"o)D䮼A*Ulr$ZlʿdoMYF|Mk`''V$ ^F.9(E+o@) |a|#iUu! ̸ MGgg9*'̠gBk$oaН>x VXA& #6N>i@woHDwm.Ban!$1Mvo75p y3 rƖj?7\jUn)dWhϔdmȥ(tځ?J^, C)Uo5B&\x_H~T#%.&$kekbs@$>6 imZta./!A@Kpr)GαG#g5H˥6.rx@BD@NyK\ hp#. )ԠgKϓ9BaVa.٩A/39gou)h8R"Gh%ΌBXKX*4?By#gA@F7ry;Cy |Oശ r8q RE:).2OZwS!ǝP)k7'q+5X,^R"Gl–ocXIX9I%$"I,#A eE}Vw3IG,slPyCD)kYjv7¼Tr6MinKw٨;JNoMgFm@BSptB‘o* ׆S7tfݒYvh"m#vmuuu[ -~ܯ٧mQ'/>g}[f,-[Oli6,%~<@>*N} ӦԤ~XPR ^Ϗt/P)Ӎ:Q!"잜f?Mнg-&s'rq[?E;Wh'Ւx.$ Ӟej{kyT Ǚm yBnl^ҁ\bLW"jw{ܮEǞ~;4AXy a""z}1/D}ӷ*u5 yEX~M =WM;%~rX}oۦЇɁ\#*Vjk==EJ.@37߳@w'~ֿn崇@pYjxv.xD)4ou%X+#O+Gv ͹COylrj.S%Wma2HW+(Wo?'p >(\SŖqNt 8L ڌL䳴aZ{>{LF>M*"wH}}/V䖜#X4|c'^t`S3S@ 4IA9m-d-J{6}QeWoy}%՝_Ρ6TwyӀV v3Jr:5k8[ұ!r@(m#@<t,'3/fڌr#5glu*E{H0 S9.ęh20ި lND m,H>'!9REq{xދTt++g&Z4ҫ '- eIb(ֆ*A7Yy?+n3ֱOҹ}DyJ nA*WmJU\prOAS@*GYJ2l!AGsp=饥"X/q Aݷoqײ7GQ }PFZڡG=?m=r~9?(kA{K{.'4锏3Gð3'1[~h,zeTQVno-+kN֞ǙkX9:Dܸ֖pl`ҰE#@g砼e\܄Zpf:no6;{ E9K ¦hKmĢPeh8pKN;\deQm5蒢~؉9Qn}VEK4-1c1>V?N=qSɝ.c^^+}025w%[x&[,}'LXyqe?r'NXCԐ'vj2dbN(#G~,hz[%9{ҔI,%{ ŎhhT M0spj7AڶY#-!ڲrnȃ!nk(&"o2ŝJ'U'hz@s۸țEz>7/$7I08voGG1荡Z,bY"!yUˁ 3 vI$'p yŒV%uY"Ka_K:s+7"WG2ʉ<ԡMZogk˲\>)62Зo{:D;{ gwyI)<<'_m@̅xB.n'pYvD~qc\{ާpȟzӠ,/b@糊]6rU5.pS̺3dn!8/l/ao Yhg; ȴ0}䖩Mnc+NtF.T_@o2kf݀r";+][dGjM9Ez }#ט|E鬄?8O-F˼QGne+k#Or6vlER EmA^GZVkr*> òjj~.VWOrAV{{Bo˒,rJw%0PiKnO?~3v)=s8O3`1>ŖD nmQZ fiq7}6 Q3e+ OHLemYhfβ፼ƪK1r'c}&b5cCd.߽BN%5q =μPlEXɦFו0g[Թ)s?3ơ:Z#j 㾑'}+S&r@1=S͵-::gDʀ.@i;%EroX&N1>͵ '4̉@N-ݪί8R*'-Ҡ,2j_C5,]ސ[|K<=૶zVox[ؼ +D#ޡ-!#kGxݜCGgh:w$w aqf_qϏs$roCNMKmnĠ71 TZC;Q7j+YI}|=*瑧MYw;!#𔋕+έiy]2@|$+U2v`jJ,o-hNՂ.bHƓ8{ &;Z4&nv1}lj9MMNo 5(cT+t5P>w8EmճvH,h6|ͬv/NXXM.Q-*&g%̕v;.29{ϚR"'QkGYNN]N<'.t8!=Blo{bܡ@Ey7ϳoY9;}2;Y d M7bM*xЙ-ȷ-iJ2VMuu~YMRkFKLo[(j!ʓ$oaZgy qv>7cze"͖ȁJfoub*D>r rZ~WG$Whq;wThܙWKݸ}ir^9CD\>Sۊ+A.зv$7vq첞 |7A[k7 G)'a֨9 A/W(kzQ I3BGͦʻ%%)u2r3C̈́+t Yr&.'"ׁ'tCO^׏b,SQlj=o[,=򞝖 pay5 ڳIg-]tسrnM劷кȤIѮ<x6u>K-[5!bm 3~v1rgZ<,*abL FnD2 4rQGN+Ϫ؜Drd״%ؔULlz NqbN˟Y :ƕmbOl =c%n!oTV;n@5ֲ9[5K捼U.q:gGߐbrZ*4iO=lTZ?ba`S-5 VBs, .%If փ~8j3g^ߦqq!ۆ02b?8$)R+K:{eY;' er<zBb򺄴Do FNeq)+xeBq]ɼơ&xy XnS^#U6p6@rK| wkq zS_u~ǩq5F>:v>P)sr*{G:;t 'io_'Wd{<> \WW>sr] Kx*Ϻ5Bn#ۚx[,*U?]AK씷Nz@kZ|k㷑PoK(f١|ACzjoٷHʫBGyMǑ煨 O4svsiQ?S6+L'9DPjC=_Y-8Ny[x}仐xyJP}<$}KS< 8-Ѝ [%gA#:[GN |b^VT w:}o=.1R xDl9dYZ }_s} _tNoi^!T< gO97 D7B|\?3J*4 s=T$٦j8׊%:h4ol-KdR&|C&]7$pohi4Sg??qFt#PZN\v @˼Nj!_T3e)-D8<OUB.싻DbN2S1UAOFN)p;t6#*tz6A߉ |䕨sf% -Or-~[ 4A&NO.978g/nC jo>=2+w袯 kdBOH;t=)՜X$r /"n8s=.hpu i̇O3>kؙyF/LsĤs8E8`o"JmouzsmgozRv kYy?|>\{|@+#gTΠW(E"3 Ny$,Aɱ2"3=쌖i[2>1s[0B}\'$dob ܒ'|#۟fgGH l&зjlx-TVˍ[umqZ7@?e`ӡ 6WAo''4(WoG>ˉK+ͽOc,ɂXB ]N]"hUjZK,dEf@n@AЇSޖMЫY{YBa{d{|>.T\y-̢P]z@cX;tw '[>e8'A && d#e^w%$MNit3uߞe9B\oSw𧯹D6 ]^5lCG;M5}'B-Lch'͖ܳJ9p+~;y꘏8 ~%J~ R?/ l|yл5+n&VȍZ  nЩVjjnDQ^tkXϴuY>K@.3B)(cSqVE>c= o|h@YH'56ڡ5n>U#ȋNqߏlg"=Ж|^lyXtihf* ΊE~o,qU(켤ÊKG}g:ݟbkB'FNɗg~@pngp%vdE8Z,! A7$9HSHqE.u-N\V.QvdF;֭z 1hd@ϩ!l#uIq@kGY]7g~}'}5z$r-t[fB4N-_v#c=_-ɹiv2]'I OǶ?KTu'9|)E[ oA<:Tk*rbKސ>nJ:pz{B'&{LEGw;~wL5Ҡ0|Хb;ioF]Gz zׅun)w3\ڥ1y#~={Ni9x&й@rMطNC]-BFy/ Fe#b2$mqU[a:n{@Y }oAB'tϢӘ/(ZTj\!"ܛ[-)zfZ{&n+,%wGKC.C'Y.}c \3 [X!ni]݁oEYM8`}IT`JIDž>E>c$U.ܽ o#cl_蹦7trtI/uPt SD!ߐ-iUFnIx`Wd%lQݖaˆ {L͗I5o~c&a0|E|]AkQqgp,::姪ESROS Ȧ(@ z]p/",ƖHn[.Ig ;/59ڿLZғ*O'dZM*Ɉ#o򈫝)?.UZN}6la')zw|IB9qT}ԩ;k$QMOJEOĐԋ<ݤg$8goUʧʛXtdt5$ݐx!^!s?vUlmW>ǞtLs۔z`ρ-e^|S[n\?Tq*ú51I"e+9n^[}-Mk.Qsx+ z LbA.S&̝'=U櫂Jb]Еz:E t,\++AW<[g ȹX;$ZZ$kg&c 9b4Tǩ60N o{?_e[CwɁƖ`;P}7ՄJ.:׈!gK%xI_Pu CsC{ #G΀!?L޺8E)ڠو3 c.% 򌦥f:Z,ڄ[SݗK,`k%'vѻ@q6D{V,L1޳w7֫sB/_Y}? p[AT˝cp`1 Օ~"ezBs}C߬S~;/n,GvA% A.i ]+-Y#6ufOuAWBqS%r,${!BSDg ֥NE+`إ J k.E;/z` }H(v1hs@Ә6 gۉ}봦*9:DZ;%8۬74@Ym#*ԑ2GܐTx@AvG=hV.SLV_\♼NpPp3-8)?灝bxgY"3ru6y-yJ;t;sLgY t_|_jZsR5]cB- X.'αM<:N4Ms&.Kl,n/+=i&caع~ofhIhҌ+vw`K{hMG3q3mMlo{z3h起7i>A:Hrn[9?lhzx ͼǁ}5nٶ!|ְI09A}3I*!y+f17t h~ku{r(?6PȖG*4"=ZjW 1*p7%=zN{5 {g\ 7c=kidM'o˱d%P#l9hZxa*Dz[/a,kAhf^?S3kXirk.MJ{8Fٍm@kꁝ{W.:53vYLHj?U2t-&$L.wno@n)wƐH"Wݞc厗ux[mMx B2!Qmqo.Exf󪁾 9fN;0t&9,&ڎ]~/0KtTy" D=[AJJ{#ߖoB|{kmywqucw9P𞑻WVO(0'+>3LQ :bG[PyɢUNBκ z" .p!VYn˼Yܫ}.g:e7e-,#ȡҳOx{>Cl|oІiRoXj#kpvCx.%B+, -].CfN/]GV'Jd@Ԭ6,}X2èeUk7£A?y]Mw-y[ *5 rk_G>%Fn2 UztCD0Ж*0j. \lceYW[hkS~^ą:y/8J*$k@9gw<8Q{LpiE2߫Q GƜWy+yخB;7dy$Lϖ{f+ <x97#Ix2hr{',%&Y<B ƕx{:ƕhbݐu7ϿtC><:W֬y_4/Ph;ߊKԴ&õ  TmfwfҸ; "oq 킜kznjhBkwn rܬZ0E&w Y6}"oQgB+mn9C v+Ml̥ɍ;YUYF YT Ms!Yv!E>KuU\y`4;|\R"uBryuu6|,Z,č$d˫/"_#s @δ7W [.k\5fCLгb̠ٗ!/NDɭDNַK5AwSWz+XC&DA'5w@],>O. Ԫ7Zt-{v0z ,}hioٺ[t۾WWw^ $ǩg?uhZ}O=r^T@0-s TG7l.U)5!ț)rhu ti)Z&h8G/tf qJl~шP ;A7r[ArΪD \byUf.GٟrtMD9..Q{C+$5NKװ]C^sP;D}ySLiRS|0v5JǑy.;f3]J-Ƃ3/'h$`9`{۹z򆮋R q{zF3bRoxK 46]=BFc{WdȸfK` ;V@3 _ R(4v"zDUl$z#k4QtK2zo~B;*toH wa =~&[ VwL&cT+h3Zo{4,zȗN탻р@ &"FY}|STX@[" ە }K  n7WRZ(%$3>Ý:r:@Dﲅ2r`kw5Cs=.6Eg8+[a,4AW{Tҋ] {x@Ԃp7v;rV]o)[c \eiq~uQF(ӾJg6Cz9BFz-Vq{^O)zbO6+mh5[bq}͐5Uhn zchskҹ' 5Y>#M M}-'O C}`߫Cv@h{[LўJtWZ/*vrҝzk&s NoEi4+Z?9 =u{{:ŷ:k}WSLwfV> aM9>S,E˰n׃Cnz]_w;kLg+@YC&lY9[,^86Y݁Tr:tJkýt&S뉼.aԭ}5V[/ 'n{䝋Oas:00v.ޭTO7'ec㉝ŐL(Y=n &!DZbvl%?GgDg=m'x >C{q~3ˊ{ER%G sjN5CoA @@V5rW.M"c=#?c>b4vdϽ-Ν?k[&ýc+'9uhT/;3s!:!vf{\.L"=&P>>;Te6o_7tˁr .x7οݵz'=[ 96pO([2침'TA]M(P$C7AAƥdO(rN({Ʈf{K2 }aEQk`&2n0xC}-+v$nR1-RO;{э ]e*w]D>[rwv^H^a~dkҭꇌ}%Ź֡yUҦvg[, ܙ⊼}3躼«B|F}@y{NI] t:9TM3_T>>AY7J6 iӈC]V6zA.Rd_}~zc֐4I-a-S$xu{d-vktgIcMc(􍘫 X!?Kqvi=kF\J,SravnkS`Y_X*>=ץg] ޖ <+Ghs.y_-梡ȩX~"W,3b ؛҉.eEf]9d61]\%' }S78-G hh'vYà c! r5٫}}!i\WgUk--f݁|4z(tϷc1 -:`-5v䬽vF?b2 ̻8X z5nFZs}?a5-Ӗcttg}9.T}ľ9Mx@ϒÍ/K̟؅aUvFcS vPWWncƉj@k(ta)=^bAN-Aߏ{zB 8Z0nZU O9QawdC]G)rh1I 7*rm̶֭*'RUvCދԼڥoβ$4|PeNѐc9AO';`6Kv}-CnK=1Eq^nK]bo: 4ilYMʈX'0c蛪T辩u؏dǥN$|57ڗCv(hf2>ǾoBO3bѿ^[ݰFcWe}7M5ah^o3\3^yU9a {D>O9R4:i=|\=2 ,$U1x_Y!OcB=wA@ؕX|ǣ@\#{Gd#A7~#FE+A҉ۜP hhnvykL ]y&{b:+P^Q;ov ' /Ԩ"5D:v!D..яY47g-C PYbVQSX^'ݪ ]uX"K\4RnmQ<~q=hC> .fYXlm>ѮP貿/a)e8Ѳ_i /+q>R'·79 =,ɹh rG=.ǁϧg,-9yy׸M|.\Ցk3gT_.n|NoCΗVY+YFK|{72`/9\΍U]'ݠ'Y !x5lqbX佒t <pY3rۙ7>Gk؋G< fo[ #/)ɟ!α 3"}oWȗ xҁF E'ZVSCnhJGWlK{ \W4 -4x>K{v} e TXQ'Ǒ%aF-o ]m=9T˜KdbF}92My".itPz߲%״ecvBA~Bby^=4#dDz]pyfTwJ~B5YufhЮl|rppSN#X8qҡ7(kfmŽg"噏+dZ}#˼BGϙu.ziG~Qmo3B q"h?[-z|ұpWgoΥ7r ațy8%+">QM.ZbЕK3I۸=ײQ~$g쭀Klo) -m2͖t 8eIW.Ќm'- |,2OŸ |K^(aP"JkG̒i3#?5y"BѷoYxZԎ{x"uXč\26ܛ7YSXpA{7p> rȬ'Sr0+D5.l&e> YJۑ_rKFD0rto׈v<}~+ْK*Q <[/g+ڕVIOP7n QM/>Tr޼KD *>7rvUn;k6- ~]8_KHAy,%vD+e6_S.lP9 jȍ ԶmJPne>oF#k6˸5yN) `ձYPQ4pSJNB v!޷}UdZ;[IZ)IJz=(#w)6b#[Gpzp'^^.>˥ |˹O%)A`V2d:0nQSMSxm;<zI?DnxY$KϬ+Aw?{N3yWFn׈&@I <'Џra."rKe4h'NǵD-Vh7$yneo}eP`}q~R-AzR|`|FwB7:W!Bh59#`bR!. t%я'ZVrݏg;wrp(WУ En o Ɍ7yo"%ҧ \vUlŴ[B?:sAZSrF"Ve]r}#ս(< 6rد KA<[ RCw̸Zr2KGo w[3-GNX|gԁjܲ!Ef̳'b.>UXt^O}i< *nG[ xyJT mb/zI\U GdS(O8B\˰ҍj}#ARa7c_DM,-zjkg[dY;vXrOB%8]=t|m!,'.5+3nRT=O4 |a VCwS\b˳3>/b)Рe)J$2r ah&dͼk۸ t{i6)~u)A$X7ruQv#4\SIx˪y!?#6{@Ρ@\GFbwl@0-8fArO}_{~9aAo"2:߸OPY{Uܛ 87p/=#E0Fo鱢WwbX5lh0mt\$r\t̸ _lȩqoir=hЯТ$4߾ZcBnb[6mS^Vrrˤo[l'q)>:I(螲4\y.k[e`|q9̖yNO۝&KkWTh#erb,"N\x!8UlA濭2V_C,.!އ$OS쫜2TdN͵ <]Wj76K3[EӬ*USd䵈*?jHy"&I`Qձ*\ [7rK97dv<.g#Zyצ# b($եA"JuY5&폙tǹu=K۸s!_-:xp(E+q``d;1?(z GCe$jǑ.\f꺔6r 'wfrwW}9iyorђ.$^!A#JL~m,mu@+i=|/BX3 ZO6k"n/|:t5K[c{gR^P^qMygޭTk|\ukV*voϿO8p ' x!׵װHkv/B?Oʳnزd#HϿ_ z\M#V #^nYKWQs8@Џ1ou#!98Qor l =%$~8MbENyEݟku:EYV@SXFi`;Ͼ8GZZ,Kh)P`s'Bnpjm-gYnK;sAPSC>-s[hs2vƤg^*k7gm)NQ=!ɽYwiڐLfX_mWz_3i僰sʂt[,z>We#3qim@GK7{#oKx hIʚ 6Zד\,cN3*{CPL 6 g7-['+Gs¹.~05|H-锨е[Sy K)}Nv7r!^VC_tąGvmb1i+ IЃNo!;C.(}os}nrh16f7+6r[EECߧ+6X4IZs9k&]{O_ ;eYpz,TL WdW |\%ZE.Rg#oH=C{ miS\m8-忓Ja~+E7lASnv*Caʑ!spb'\(خ_cB6r,}f<lS/5h*z7ɖJ]4 W4N.qYyM߳!WL"dEgmnw98ZFf>_!9;~}6?^;[S tG{we\YJ9O<ηy3n,3g7RٹG><Ӑ)~5 [giy9i^Q{㮱QN! |%Z-a^+YyŃ(Hy6s:65OC{ 2>JĮn--pa->yϛ[>nM ԝ&یF af1/{K\9E¾/]n۲Ֆ#)6 9q̝=WHߛ,%tui<޲kj',2 ;ccqs,Y %ޗYdWs4oJUạ*T;$ ߁Yi]2y{giZ -*5½^ɀ&lͽ5AHgPP􂞮nO,Rt)UdbfNKB{A&Z]`g-- 9 ې<[9X:ʽoOmㄞ$zhB2>na} _3'br;׮֠2qUўn3hh4w2/juB\ཝ #'ŞPe@W=S2Ažv߈aӘ'`*Qةؽπ&.s2/)ى=4E/F'v^0,CywH75v..-#]NijV2Ne}y;vv)3m>^jM@:]}>-a~.;vy}mr`ܻ!1R ].ZȎ{_cπnq͸b Jϧb U[27.tzBTmO Z-z\*e1=[@*tޞ; }>ϒ4DCNx {΁5>U#G,7lIVbvㆌ5  N Cexi%bjTX@&'s{yfo}SCOOMwSwOd|:twOS g٤-H/_a6r "etV{9d 7H BƩ6#[WU"UXڇx{ #J$L'vWr xf+W<5I} .TH|וT/p- =x@2 { xS}kL'¾tdʲ|5T.y@:$U>;>ur{:TJJt$5}f;C#9Gm}IceXLڽOPh_;DZWl $1NX^*gP 9b}RZ3ڧeb>IKwGWe^Y] kX#w}ꉝ$n F;PqC@Rsoq3f*4Jׯxφ̨ @xoWH!6s+ڡ}K添Ps^;\Ǯ-dh *pƾCݘƸB>ncN+WyzY)QJ3κor15.C&L '>x^Q>r=} +ϟrLA*x?= e4舩c/˚b3ޒ< X(nNq%_y",#%rЉ/|}?-]R}V|&3#&?TzBO,;tǺR?#%) ma #`loN5y ;X*wcV0 @~xW;fg@sf ]Bgx`o^pܻu VOیhkz !HO{q_R#i |E*|Yv4xİOiWڑS1b;۹C0}Ÿ`l=;5~U[eF0C (ѥ"|@uiuiN{)r3jO5\{`܏7 ަ]Y/U }Ywx@.!IHtry믇qerWse-<[[YXKkțK\?kdaVu=Wxi2΋ˆ=Q$W=O)5>z A Z)r}58l[tOg(n8sX^z;ړnރ7 - 7^zlP ׻;BTQ|̉ϠH:~Cy#_;S[w*@FZ# L=7;awuta]xfގhw&`= g+4ϚK;S,9r0;{:v^9wyWM`CR,kb_ލT!7@ivl὾[E6;`>i_lCRúo k n#tqmٯ~@o!+tuœJ 'd*"^O7c|ŴԪz@ﱌI;LN|rPkHÔye3o6{SGܯ8w5°1-^s2 f9uJp 9X4b'Ն(t9 E"@.Bۼ$]o}װyNt$4G> ` vh#XbolArx׫Kw> x_/2h ;^IښRZKi/r'b:/5 OlryzV hK4r'@dˑ+G +$.pbo [Э $f !Lwv/ bG:tC_x{9ݚ%h<]-Qـ6%h97rw7dP,#/R^ttpؠI}}(ޣUD.".J,<3ء!a{#b <׿BkOnG{y.`%jg)3)<^!/3ڠMF^,EJ޸gx',ʸ'^*$0䯳([+zZsPS9&m#zc&(E\Ş#rOI.л{nl3iVY$$U)\T-)8myOоZ(9OfEkO9A[oZ7띘BMi,Yĝ@⾕|RܰHcʵ, Xs',)>Ѡl;“D +'HW\@'n*peТJ) XFA~6`^w2D-磹p2sw{!>7y[x@vx[Q] i,M q';T@ޗ.-21eEy6.eNւV&S^5ڑ v h|\ygf˓3αSϡG\[**rfYu\x4pkG&X=+Y&x̺ՀWV~5^UU],Ft-?hz7*w,WbYxDP#v䅠<Í{-MgP!Q YIy+Ȥ!Jv}uα'Hsjς?DY{kW"vy]$('Zze9 :Z"oYh̕I8;|x]>-͖pd#/4En%n ~hI"4NbED~u*l~\Oٻ _?Nb- #Qy=H)-žt6]8x&x4?N_>L }kTRhн5ENP ʙ2B&¨8O;/?e %-:q.h=4uƖifŇBZo%װ%J9%HM[ip#KWEΜiR]tzghQo7t [YT\ g <3[}["Ǔ/)`^=4/4K}/7rYLq IJ)KSYa\W {4~@_nQ} 4jm=4q>й1,}*hx bvHƝ͊2 <+v)y; g.C+fIbIb"mǔ9{ %f+_ C 1h"o6ՏCȩ̳-yPG^t O"hu,Iy^W ffevx4)bqַPERy캓z8Ƃlˣ9|Q2 dܢΣV =p {c9ot4'Y#I?%<ҐN9b+y7ERrT7?R?vmC߉;+KWx#ߺ 9TZ.>zvIm)6\ 9ʉ3!hAُ(I 'NQ/dz+r*H)BΖ@X m)mE$E,UO92=tdqWJح,:L=MDms#UZ h'|F 9v6p`l^\Kղ'myU-}dV[T{%3IFuyȩ:r]·k#טYtYmn:-ՍF[ˇ]Xl[Ms^,q8Qt zF罈\Rh9ňziF^c\ܳg&7Ayh Cwny96>_}7l$Q 5ש@~䩡+6Dz`{. '=YRzC,-]ީ"{Гu>T˪lU&4IG^7F 'p/Aĸbpsg ~e$YNw)qy<+SD.q N{q< 9XV 3'd.AgibV-A y2qQ؉0.tPJ\tm6PҨt;gY#%L Cpy;;c_zL\ vWQSwvΜ}fItBVCu\ű*cw83M%;`%zN={ƻ3?1yVh33=OBu|ν@}gc624bL~$ i6$C Km*' %*sZS'n H1Cg]_ﱧ8!fʂ3mF[ :uwy8%kş#n;n:wpE~_3kx!f;qa H*'W TzucAoK)뉽Gwsx[ӥ=bB|Ǻf~cfͼ]pH`Sbn &Gk@ ʹ}6BN$>2.t"'~LBTtʷա UDܾS^G."h ߓ!jWgo7 Tq;G4㞡TK`w݂\*/Jx[o6jR+\rsۉ-@Sh:w9)Sv.y\Yr'L't]wb{RK8ikĠ4ϗjk b4a_j\2rT01oǾK>KL$[z9K&GzT\7dFv~!R>ԾHa602i=rSwL;uN[{[Mc3*'Qx[%kЊY,9/2+FB3BʬSϝxuf"c&nOX1"'[M_kЩϱ̼@iسdy*4k!xط Y?;yc:oʎ4U :s`t"Pl2aB!xו}%b?)o]Ʃ~nJ6!_S!q:rXH1Ӌ5k)nM}/e ĩ=mKBkɸ(2 Dޑݹ숽cGfOIuc C~HO!٪Э]d2M)^/I*zBweaW='~Z:Ɖ}FT2ƌgu녮42o QpO2QPP;=NYٿ )-jl-Gs{`΋XD6Nnj~Agc|vKCvؿڟ_b#d?O~V:#Z.vdY#uI#v]WXd77dz.c4rB}`FȄkӸyUߔĽg\r۱d~ =h^R44er>[t8b'blɄ̬9`>Ȑ--f8b].v%ON%=ʟ/U֮h%S+Z6 M-OC<̰[` egg6nY4:#6Z@eb ŝ}Cy k bv[=ש߲tI{gvh좉4[k&+HZAdN[+-D™{†99i(?(޴9-eHRC";'L*lg~-C"w3G R찘SN\-=k]y@fԠe mU?e~|SN !P}\>ZC>w}TڔD/5=t"c5A5flYZr #^c{3drvM4~!. 5ÅRh|z\2ܠI.F\Yp+ܐ:1p9^hU'IfoĮ!ӆáNr 7fޝU;|\TY&`'IR{4c譡ڪ=&Nmz b伝M >.byL='v E6dU[}y1n̤G,,y!c)MM tq>ו=Ҁ05gSOèY/T蹵k) oK1y3oꭔ?^~eJzOmI6^9x@'4}[U/K7*&{{l=oa!?+eMRgqBbbОJ,ЬvQ`Sȝb7{EL1c4IE->~mM8*AsIluFLj<L G\ i) 5sWHяf:I>=f_そW CIq7rM׎b9x>^ȷ~pRߋFbj(.[`'O[ˏBqH&2>w$QL[&cE14Ct{h厝BO(ϭHW o (;TȗgjofW ~:e@})| ǞJw{5E^Ln-3FLj[\Ɉd q7 z*rE<)Hxn9{~ljIb'3bKntKwb)-8B_/ߟױkx{Has/tξ&O5i{<Y2n%zgI<ѡ dVwZ=k*x@4 Sc("w}ncO7=;-!ilѤ(Q}w zҖ' lJj m yywӶLV*ryJ@o9i=| UȱXmvk(m=r UW-ʌ|"Չ*4rc#,* |=;,&c`P/+@zE [yږ;u21.p#YYn.o=ZZb7k6W6rb̓D~"\rf>F|y@8r[RKdzj&sqOޗy"9 qB8q'o drInbQc eG Fuuj5l/@g~Snud+M*sQӀz]#_ AܗkI)kkhMP OٵuOWA/Kuh;2)~Fޗ)<&qy*RUՠ #Z8|]_*g($o{ YoDU/ENޥeΣxkx y- 8+7 ]oU2sk A#V+Tao+XrpZ۵˓OaRy#wOGGxkd3qo~ %ѓSu=oOi&X*pv-l ulq⩙0C9ȉB.WK@*RX'M>.꼀[HbO,D Ķ*I64{}݆vr pa=ܸXYai'(_5|q"__6mr3\nS5'dB-7ܛʚ+ma;F^#A$w>FNW8opFlBSWkz@zi9yݴfWASwy2.k4]B%eIq-?vBzq k93t[z9נ:Y̤܁k:IUD6~6妗åp Y9Pp2=/ eJ{D#ߪVWʭ@ޢ:b9ww_W 4f,IJrN=a rbٰ=ʎB+QzJVs#[/@sBF=D'޳@.G,?;xУ bb~3yiГF|,}N&r ՚*,!d@^o>ߕÍЌP&FyO>m>bT0 T@l-@>t ^%'\퍼@/ x5}Ը[p6f7򙜇ӍJ:S5z8Z s^$?6he rYm]:Jrq9H$7Kq|}Gқe{h"V9Xx9׵Cm \gGr5V(>yf״*кI;iCle ?qoڔ/u~!Ǎ Gp YK4K4+a~w^)mŻ4M?Bn*Y1-rYKՉf3-LMqSGnai"/ْJIWdfof#譬Um#*83V!3h?q7r[rc@ςuJȰU{Cs]4) Vxy|r<ЏpO8( qy!"?ATx_Z c@ρVnu"Dg9=.rS=6S[g@%+A+Qm)Ua?BA/|2?-frBz Aہ|"b>}KSȍδ~;hZTr1 ȩFְ9KG'3~ ZNRT}133e S@r]S [݉$W7Ll2-8ҹw+xgM+E'lTIAE -w;'Yq=`K8e4p*)spӜE,򃋮<4\ yu݆77XZko~wVfōrq3WYn |&-|4&>R^%~z{8g6E?{- }b.#,NLn-5'͡NOk~h$c H̿!36SxФP˒J$U;RAmX>S 3JY\;,*XFYr@GXځ\Pgh[n̵O'jJ,I.qNvv #JzE9(*p~~{g'_EГ~*yHgH3Q|#e/-PSd#w2N[M .}klc4h,DHwEn?CnGp\#(7{V0B1*W{&Zs=~{Bݛyt.BΗ: QtImB.g^*IR㔽U rBKNfRG8󾖴l@ey~>"X )eLk76 "F1uֆ|'4V忏&ue-EVˆ>.V A閦EL{-z+xZ(&@~3ƗK 8IyTt8Ă'Co^}3*rږ.98I b^Vg>} n(7X7e _r[l_=# @"CNpFt5We:ّ%#'C{bzOksw7U.|D CJ}q_}Ѝ|IÏb nfUpG7:vhD^y` ȎlULyTDSKyd["QX'EWXʋh=mz.qՁ\ Xo,Vosx2+19C(c"3Bfk/1 M|Zk={r\C{,|_|āBTGf,;Z$,zpy'Vr!D2 Ow94BeВHw8M)h9P.;aނĥNҰ DO?  7. -tN A.h|V 7r̹!*omuYˡɚ'JM վ76-}#ugQq:fEMp /CB|NzĻwojw8cmslP{,x%Z^+!us'xHKh瑷An2ZKhUuRw z&TF~y>^;rgK}uNJt B;kcgw tB5W:T^{ Ϣ`SxIE9u <ׅOتy&njooD| \P'T[%詭V)._{!G.4Igt1Ao:7K q*B{y(e$m";|/" qmFwbtQ59e } {U6y5Sn#,T69:9wA0MM킚n,Y=tIyǵycKV~1Dsq \^FۖOuBo亻M$͍ύ܂1E^Q xgO\Gl>Is" 9Ϣ7ڌ3 .;`0gljO\ԛLl#6?fl/)SDi٦X4h ꁼ&iHJI@N5k|D?68>\\Z TE3w&h[f,{iEb ' hDo5qk2εì~A;I«!)=uޖE9 4=C\uNQȩ]EP-&刖ZlYv\=D˒BR3%]{87p%:M{g3hV_o8'z ./#ՏYeik4lkruuWkr(]U9i;G>^BN"'r^$3Efm}n{7a7MІ]No)ywˀCwIF(eopʊa=T+KvrpOV29nR`ؼ>-ؼ>K} hQOQ&E^B9_̫ܤhS[ x y'͂NX(G tіB.K^Ü9 <ׄL3]iEype %jdkAG.Ii[0| m(vjܗj;e Uºe}FMA-5CnjmvYg_ JG\8I'IlP#G^D]Ž\MUtmfA߈)̿q;+>T'(Mdđv-}"%fmǖ2rȰuVSt@ڋo}l=vy~d5[Ȱ0*NE>Ar < z4gp rs$%a^P@ROym$U6n*!q䩝qϋ07x#7O'_-OՍm[vnj٣r>{+kɵaoMhW7M[t!ʥI9aN\5\zx7lwqLB)u=ϛ]lo-K. E9RujD?#8v )șR)B'X7A7SĆ#87!vy4nנDBxxIi &g93µzw=UY^?nk5]g2nEDZ9 {{#o3 rIy'nCYz *snN_F Qdw54 v_ԳU1xՐ'$S}.2bV/]·-$$k%mNGȥ[|Ycd_chkV.fm~?6AxJ :5ZLJ<Z1gCD\;CĶ h_y*:Z*%>HWGTC26p!NjYoK_X=>((2Vl3??4 쇈{9SɖK QOwI{xĹa ?E =A}-vk9u7t vHZ>] h~3rz r}h+5w 뉼_=&EUrݜ.};zq P*'tBU2tT8۔ Fc̈́5tzuo5:,8-ćWQ\Dc/ٜk}ط"a/. f(z: > DC> me{܆/?Gpe7^}#ߛrO{#ph٨nޏ|'>^;,Stw[gN/')0PB~n} RcEى|eC2Vοݓq-Q)/g{Hr=-`cט%Im{BOw3CN>C9o&1-Rj:;_퓌7rYnw7 /ineֿǾyd-2:l : W{yOLi0;ފTf˦9xG{שߒ6l =|6MK9;dրfO=Twב?SSEK -qϴI1SvLk{NsWrh.N躌ׁ:^xMCO{͇*v̯ vWKm!ľ9J}ԪB_l_(M ឹ7!t2ܜy@%PZ rKzoM&컑d=SJCR=Ζ~O]Ժv3n׌ۦ) 25({=3STJrnЄ$b]yThFҠd$Nک,¦ lߒ2 ~ĹW7kr[P& w3>!BYr0Ok)4Q`"?u@Gd"IJ=}+:@8v癆uWvYs@ݲlnC/T " a?SfzA[&:}C=VuWUJBz ƹ~q?5qͬ?BQ?}iδd̓l<ʿXy6IM\A@1}?q7|7hFT"^vĸkgBh'w_~j] cbnjl:d)ƃ ,*;SzSnWJ|:ID6@3b]wFĸ,K'v؍PA"ws㥑_dFA˜%}\=r% %Nt]VOorK~]VK \}'ri@~?"cOznnYb'Ϭ#>!#!0OB+omKsRTZzKuGN´ hݑE)cNMޠ뭨Ndk$ /65P~vi*tmr H;6y-躆؅ Hn+^8'4 7V3Q ӕ4dvByx3h*Zދe4Ds7>6oNK|KTm^>q4 +tWc=sԨ^,A/K^sQ_wčV?ǾOL zZ #c/{.6jWh<Oߡ=r1="Сe&.%ޒ^c xCQ( z$ڿSV[V. C!׭:ιM/!OL)&Kvת'rYdr/V K~m0ԫ)\i;,<>zd4h@eA&tfu;s5gݐ3*1Λ#>3m%m;msϝ%޲z;E UIV#f|.}RG Gejʱ8[ Rݰː[8]iׯNJ@y@ S "_=u]"֠?SHJ[]9mN29w, 'Q9A('tqAq3乞Ї۾IZ7k}V^m]NܨGϋwgp;IoK -43[9( T멅Wg 55c6yoެ.jPom٢B4z'tef;%xb/2>U B]ckA6k־'ߖM*w[X4)<t.vߐ0ot5;נ&)69{ _k03fh {th_.^K9f$/+r2*@`* T6'O\B1\?g֘-Kz`:[cw'bRuiHVU6cU7/QW; $nߛy hM{ '4608y2#t{p,LV-1KOϠd|{{|.ƖwVVw r[#>{9#bR%rX?)T]7VX)Mz8k WK$&Oz:QMNi;􄃸,u{^1cs0ڡ%qV=}ghi9RC5!~o]7`H]23 )NS6 З;-W;A Ix%$g N~} ^ThrzB(: m+`zF2d]OLͤy|nkLs?Ū,.v25Ԙ4'co ؠ|Dڮ PK::th|79IaUy%z+{YCS4^kZܓC^r룜[tMgNz|ػNSaՒ•Y& !-@ l -v9BȯQ'|k3VNvh-EwFJS*AZSM6 n'+L~ #diq;Mҿ}V!^_jvڛBTKE$&]nمhͰHz@OaL穗5rTc5p6ݡr(NzNݤױg۔5t W h L\cKϱ'Ce C_3ψK[wȾ^shŚz[Vð>:5N7N-?.YgkiT_IeslEd?׵IZ0_rWT ނ%ۧC=%h'|ɀv!i"ݰYes:AӚ?H緪Щr?σ:"?h[ёU^iXݷ5CK"nC7E&ԁ1 ԰%hq>/k:F,r7 t6Hcɱ0ݮ2a3UHke 4CVϽBÓA|8ǩculTjo oqSjZD8F%LRdHt +W7AuF%X>ri$stZdz}C&|Nj3˽%lele*9{cR EW~@dn؏84D 6Qf|?4xA;UqQʼt- ZӤ@ ziO͈'d%Ѵю|ɴVl d59>jtb׵ m},E&2 ^iR Ys~Bƀ % ~csږwE׫4QswdbC^Qޑ X M)Iz`O4[ KSț؜⛯i↻kjo^t[r\k2T'=n|JVRat5&mLdO5&m=~:]]^0>ޖ9k9>E76;_fC7mN RoMrq6wjs9#P3`jm'NfoYcboYkc8"'Lh#L (/Y6L'fCwN7ƏDRuQgLNٽW -jzu6V %zE7:vW@}a7 ]yIBnUՔCe4w8֣*t! ;al- ]<6do>7:GQwlO~J#ϱӚIA/Ӳa4^'dy쮳 |=kShunP6y7IpE\Ki뇽F ]šS2l&h'x Jռ Vj詒PGG.~.%`/ 2[kZ8Ҁ7]i-omYy#; Եt'+-4 />_Wa ?8ݸeIG#>P[JL'= #VJ-3˶Mv*牗%Д[_;VYC~Fo*tiSqOܻ M#Pd; NAGXO'?4:SCX?9qfr/yw1\$63^%/G^!wn(9D#GN2񻠨.R(/#n Qonk;cECž0#rH9s%  Ʈs$lA;7wÍ[ (C#-.Ǒf] +$^TsPf.q w}Z(Rhul>hf#ġy9u"tb)_R$LQls&Z# VkąW%9z0\gRqhfUiLr[Nbaȶ7I-儡z{潬% w|hIjȹܣ$\"r gͤyCǁE{E*ZrJyxr=$ Wk\3^,DNgYE=\4O}T䊈k}奪 5r7)˼wPZ ݂Kϸ^Ni$%[Z"Xx@[bYyBE3J_e ؕ،g]|k^(,x Aώlmg5q[(O h.]T5!˚nݲ _ y>+LC37ria>hdV>+hѐfՖϧAv>q7= -3ǽU~3]:ХXlJÂ|x oK s,fZ-"kI3ȅ y"Kh?/54NfpryH<~oG cy7 Q>Lsɵ^Z^ {lNY mD.r \WsV n]k_"p&~G\z9b=*xA *v%T/_x`[tK[Dվk}UոY_!8'%{#w-C%7KRnypC5Vd>N#}>8Iqa~ڂ.@iIUnoJ+#\4npCF>R^EC%&-.E7f:3thi WwZO߆> |@V^)r^ A3i17t^3- n.!zyOIe"nf<=c#,Јu 5K~:o5oE.@s<@/\)2m%刕}Z^x]_hŭh=" Bz;% &Y: z\M}t0hpGVS˧[C? qͨ[2M,F])rGoo7Ҳ5(Ф%h ɼɡ9OTTsx}ȥ:~\iK792~2a\^,{`p#9Esj˜ AdRVxFq^G YEƋ!wOޠŞ9{x'xil6I&pV1t="ݽD>B %)O[ϝYǦ9UB 2\דfЭV1%?.pfwg?ͱxnA.Sn ^!o .½Y%R}r?ZIΚp"<:Mj7LD-ԒU J'pqB',B+ݠm71ߑ_hm 51d6H1C%YOyYE&o, 2UlZY #\QIFB-˹,Be9t)1X̷坯cܶnV<̠A>#/b]NlՅ}RW9{Po=`\Tr>#=,7)j+o?Rs/uZs &r`lP&_ <'v B\ ]cFGlZGN#:)@[\# qv4 [{\3ГоW4/O[`?LГ̤4_Nm.tZ$fSxB\T˂^#D:P 9 uIπIeZTg:ޠ{`HƝE"qi_B3פtN-hk]{r֩#f*oꭟƾUBga#}K㣵bM`D6oD>P,7 vú~xΘ>UjoyUX/Y.&9У;KVޣ9Ac X'1.!{lK;"C+f%6m+#ڷ2:}$Ko7{إe)^c{n 2$ydoSrzĺaV4\2}` ˼]5f|x)+hOn>of1ő58|j}à=S`GnNAG.uC }S3!R0,vx1L5S,ؓԖ*([9 ػ!BEn}(k T?-R޶JI6e^ w3K9]N͡'}^9k;h66r>[*j;BMN8r9%"z῱ xbpH/1*ao]~k8M3'߭MV} tߝz]mЬfvY(WhhoiRk;ֹou:ܵ: )ry@ǐk&ȣACt4h(NPEӐTSXާio(/>)_9X"? ^#al͵Y'ѡMz+YdCjTO5!_=3bNKq]hɣ]rLj1C%iT}g_ari"mEޟ]tw~:l-<A>ڕO,:`z^1/Ko Ŵ:-^{rـV!zC48an:*qƟU6&iCj;%tZ^4->уnvj e"䀗.9#C%\6;=C=m = UB ~Zm ^kTk=sے 9}~o=~4͋cQ.u7ܐ\z@s! Q{/,Tm!蹈"U1.d 59I9X6;B/~H)5=uZF>ѱy".j#2 zDRKrNhSE0F%/ո@'f(7fýMsF"MnDž^zJ~nE |3(cE`u2pN}צ[֦i9cWID %vФ{\ IR$Jkѧkze.]O>K/Y]_4vN-vq!qI-vf -KRXhVh%Cuϑ-_ytF߀Im6#h9Z*8EW;I?]4V| ډV??ϩsșͲZ]o/yz xn$%lNn}ED]Iqr vR#!I%^k2JT5^Q&G4ğT^Y8t4JA= 5Z8c3#=kOXBx%)b:R3RYiB>Rl%WbpylRyIM oؔOȻ|_-Ld@{#ʊY."d|oRLw+=Wt \DCs!?A3)6Cg+9:|9GR3F>ֽ2Vو[gB|Uu=:tBL9c9@w(ὐEЖ<L&Mmё_α\3agY^}.}w͠)ޣ(W[wW]M,O|^:Uy9|4CNogrDP r#d$ir@6r_BabuwR;B*.z,JP[\UhQp{L]8<j$ s^g'$ܥC <6ěm+:GtRzLUs8+;+)ܝ]-_EbGbJ6'Y;vS8Sf_%.aof=j+T+ y]-BFZۤ:br*\e2ۿk{U+P"o#ns&&)~<Z%SV7;# 8oZiag"g7y#UheYw:jWDKZ3Xa9\¢ɂ,2+-Ty947S/yr,! m(J1(^#TcŬ.Ki gmDaz؅%E{C#֚fZw ߉\ U_ܠ [Tz?׼ݖ cy)8!!EgZ-9ȷ#NaEk-{3XɠDYRlF6-oe9tyy;<\7fw,y#lGRjȓA $ o- f+$+ѫ͊T;,$K=I-٧9Zߣ=Բ=4YM,ݪgSv.ދ{Dzto!"|ĊAhnPZ ͋y7Y.'Vek77?t|n[w b nټa;rQG0{#0!_-{Sj Y"'-$j/mh/ 9W wx"=֎g2\nS;׊*:`S2VcKEy}Lv剗M7נV?DBn\\+֡wؒCz`>*4. 'N%[CXшЉOXQ>$^mUW8,[,3f7Yo#SEc"F!.\CϭmvĬu=Ѐm2=m7ǚL 6ޤoZPeWh~Fgֱw_4Y 䋜GT$آv\Yy^,Q IO"W:S ұ|/Òz% d֋Ӑ\O y ڐ)`o\)C+UV]ԡ&'-aV zIC9 C%)EN3so?*AsYNWtĠyc 6B[JS=&[0ATd;RKSr&Zj%f^Uh>6|6"7h˯!g89ߦ3.rɢzu#Z)a|C g7UŰe-/伌/yvyl k9|\58cu雕rg$gWTp\e`w*5k`kǥF^H vy) 'N5R6zYȣs #9Qv~%ֱ||)D*j $dd1%o6D>!9~Ox׀wޜ>ނ#2Bzm\,O_dbn;Y$ ^6uB>p%xl;yY9-s=p/+8Z5iݠ.E:Bao-c_|jap\E3X,[ (!/gW_dU~.N!M?mIPౠB'7&pDޣ)3a"\Ͳ-^x>v{#U=RN?BA* Ӯz@w;٠Cz#QB~f| ftlBI zQ\9 ]-hY(WoBN!c򉘅]/*%7|obvs֠c_3A7lɍ9q~W=[mݶK$`FK1-N(-,rw3#te"\aF3k|= A}׌&ɮ>o*4UKB }Qs١SRdhŀ0:vv/&Gu.n޳>E+ZxD=-ոJrcodC\8wI$A3UKn)A^&/1 ^X!y ݥA׷_/.b]t8/ zx@K~ > uȨ(= {ޚOd[ʒ,7J uw K@tby39; }D{=&VE2q~7_{ĐGb#g^З|`s6K߽nyA_CfF1Vu'x}J́ViG|J5 zz;Tnb>ola_vfsi*[L-+Z\\co2){NuI R[.<jQh6^V7b4ڧc Aw4,k,keG]QDCɱC $znɓ\a~1`)ƀϣW Sǚ*2v*%czo|x`h{Cߢ#EBoQ!B˃݆No)XZ%Z}: hf>>.vc~# }$MR٥1It񙺷PE^"ՙ#'/Xѳs0XV!l6ĈgZv C3eF?貼@+A)9/&whf= Fv |FKva\b`@蹞Cr0C%ZۙeKZvN=Po+:ULHBN*!?G#7B#z*(F'5ju]Ӗ5`nqޚK y*oTz6=@B^;`1s}S쐱,_S3B ]D$ (#_-} 7plRse[ >>+&5Bd'e 5h@ou[IZ3XWjl Y&K6Y콞-Of퓵:/f2II-З5?N^}u̸ܶ>R}6oSefJkaK_ W=҇Z0z.?,D ?;Щ5 Z{@zY3v`3sk;\qѐ)W3L8,us"An?6cfo99O33{|HU]]Y/Э0ݼ)ՀS~{4zWU{@r4oռ n{3svs_\심>+ov)hU8d٠ĠjBI=x?.$ދy%pAE}^^\x@_!3Q6!;9LZk Z9nMH%؃+fQ.tޯUruh7U:9&x@Ьr\caf M9v)Gt yP iE+-m۞mLH\kz? žuq~.j!5Ze@쪟h+o7`D7^s7Ԇ 'LnV:U,FNW{Nq`, oXE?9By@^nRN r#=vJG׳WPjNjm'kn⎋ȯҖ?Awʵ< sui 5 v'fJ{̐eޣ@/}s6K>+wPa6Ɵz 2%{#yJU3 B;t>x٠F';[?nɤqXUq[ɀN $E78ߡCc;(Ou!Jz|kӯѳ{YUdO2N(ȋEb!_aǍ_zFĐ[7]ڠDo۾oӻ[-R>ΒZ&AЬS ^ \BAgVa^])Z-ErJyW/'P7qqj@V:Ohx9mxSd7#ƛ7 9\fIN64-Q~Kb>+hm5rq"7Ha[F4Q"we5rXST5V-! CB|}节(;5s kdCnC-.ϙ/ Zdt++9g+ؕ3Wy#M'qyhThy tQ"Xtڠ=o5'}' xvN,Њ| -JHchVȁb}jyMNN+G;F"E-A,7Y/LZJ,s 5D%k Sĭ.^WgnU:O< zP1u牧^'cϞR(/wxEA@3A g<~9ZbЊ8 ܢS1OC+*g囎'd::rHGtlxlEtBNn_2bHf&.hسLwcWܥ o趔{ ;;' }%y"_1*Z ote CE~ۭ 4Ϝtowϡ%B}D^2.\KK8&7tdprHv@.礸]*^ZDWλˬB۝3C3֙dYl*J}=䒷:C^@N˰+$lޔ\hrAwgθ߾Ym0duK F`.L􆾔0~@/a\%v"7QywكA":H1ýeNS_tfZ '^zI@Kv^Ҫ{^'"I>nrBެxCﱃh5.W'>%+(H, iH\~;z0#U1`V굑Src!=j;e3YEIᡄւy J?s6ij%ŬCQ;;vnb۝mrql*hQ /"W̷E|9i9 vvQ.͐oIu@ pO/z4Xoa[G.tyi5h\:k4^\fz:=V$ )D͵Fe=ktv#HD/h1T8"r,u[ܺpk!+m趴y?3santF/\~li5]晻 Bs T.(y7Kt _^?u^д5|-u4s=o1*М6*p] {PGޡxCWyc4_RI!*w#ٵJjY[6=RZ ^K)v|μ:1 @8RڱӮjҐ_,=y݋'UI?6 n3QzEHQs+C^ }Qd&/jZ{nkwCoũ&5t2 zS~ 5zQv`.@sH_,җfjTV,ڱ>ҍݮ[ ~%b$l;侱kD˄=.E?:, *\}/ JqO׭S4>u|)WIb{wuIRL> X{[ }[mHpE&49/Ҟx^cw7t5pNh%/]c硧lPh[3e]^ӣ =袊m {%^TҔ[͓F䍣kLxSGV@YߩSXܑ 1.Oi%ԥ6 b<&iVt^͐׭b+2.tivjKlLt0|{x 8mQj#^t7.W0'r[D|ԕ2"=&1m/BWNXt4]6RC6:e \`^Qg^tyCBjK約/'%KV=å^B[ t%ֹ#kHʮA dMi)cu%ǫ`5$2A^FS?蹍Bz=_$@ESh2ҥh: ]ԠjN}L += )FN,>BC}b֕,AicnI&ɑt##5:3Zj%zZ%] tlxҕymzi4H4>@ޗ;#bmtu3^Kk#瘏:k wo-ݸ]F.A#EI4Ӏ-7{kWM̶=aOcv[,A7+1gzo\HHF1=zcN.AthQ!󀾽&Kbzj;F^_]DLxS˻:k1s!7u-T ݨL3ĥN`_CTENSsŞI B)%#!;'ޟTG$dRAnk|:< ]r:e'3;ڋhϒusvVs/hM5Q;KbuWD:uE7j-yprR5耱).9X- k"FLcAoVWu݁ǹS;t]ӎ}p:N70~@Wo}taxi!a-j.؂m&nQ- }gwIdH훡%"ƍl׭rvT5ǁFO`Bӑ-#|{Ot_5JjDI|ʇ龘|@_=mib7-ȇ| OjJ9u2A6=(4H`ܘ׹szJ4'c7VNtP䲺NB;Q*@k? jfvB뫙zSkqBXr+=\#wF>b?݁:.1N#]/h]Z>ГK(q܎-ؔnϱ/@"nK`h9V~MGݮ66Ǭ܂u[ 7NJ@acwHe\%+=v>*Osr8%>FAN* }26!LmcKn &iA לoPj6LAQR?n6l2IhA)4Wc{4AN~r z$"&JТNDcO^Fj@$a d<nZO|*kXCE4_*2@ :'?| Ik=T7"A{(*ЋVN5 mG($\aWRN䫑oRM^ǞbIЭNrB^>4@!v8\p߸]A eK3- Bn&-z_{ I%uV늱XՐs_Gw@XAb$ƆNɀ[@kb9׮}kg X̤ŇwQ U">dFN}K1[ȗLKFlE v vol)&4!CekkWȕr$ JezVlŖۭ޵܁1ԑgz9{`<O䚛ۨk'vłT:T#f^T }ߐ@X/4Zov0KoonhIb>11阡ӰL[RUFT)U[%b-Xպau)iWhGAvBKǤ w$qaᥞ":-Yt*\yg6x ֹ+2פ'BAtmY4f?r0ow~hpϜkal#e"-M25GreIIs{9 oJ2->Sk9v]/]"9q/N=33EV֨kW 4-srt=7P̐Gz_mt!tbpBp8}`o}zw>Lz`I{!A\0[n2\IF,'*`quE>W:uKZA4áyV(׆>>{]g>L 'n(}HE$T&1ovR?,+ -wX"!AN!W{}sfo?\I{*ovh%wC^n?[aViXqrdwH56z@e2q}]aђcv0 XĮks؝1NJS96|}11!?Rm/jˣqd5z[,!A+u$tu5~Z+|%kx,z+A_0 K/|=[Sױ[LBX?qd`ru&xD[ݭpov^2TC,E"b7ogo+̤9k}?-v҆o1 tY%|R)E .t:śZf (k}}6tu͑2xOQ/ʀ't7mGPUkzdnKM ݹ}TͮyH%{`52#Z/T V>C^/iE"c nBլ=M rpC,x?[! 0nH9I@O:Bu{WqZRj# Z='}f19y-5j mVs-<|Ȳmeɲd#wT1k~>Ǿrgdt2pkGʬ+rqM~LWhe삅K# 8d҉.)vFdm]2+Th pɁ|S_rM֡ ҢhK-Bn׫"עH=˥ܧ.{5yOfl.܎vFw=iԡW6iEХ}Z%VftU%\ }ؗ:?Ѻ#Zx ҠEHb3k)]}OQժG𒹌Qw%IۼB1q)>Eg!9v]Z)m\8 z̑:I?!JZG}W#@vBGᾠ7wIšJyU&G趿pbU[:r=%#I֡ؾӼwC'OČ-#t!*2$*vjľe6u9LD:#ƠU[]]4(( m%fҒTU}{Ic:y$@'sf]հggk<|좟6f.`C}~.P7U~ /6֫롊qšSQzϭ$ =ASd( vތ:]Z`c&.H|)>Sx$Q?M_ zuyd^?C -G¾ܢa^}K̓q^Ǯ9 r̤LYcxۗjEn2cIo%=܈'ɄjRkC6ڸYco\|_F^ՠ}#r֔/ǼiMKzTIȠw RGxѡ3~M<{{K t_Л/4q7[׹ oH*!]>ˢ hL9*=ojWse`'b;W ]0hyI׿ ا%6kDLuqu_`9E? ,'w&3daJze5e4g.qT`ăO$wWܐ!z̬cFCvn'Q փԚo0rcBzlvVTMQ a +w twv`B/v腽T]qR_ЉHhH|f-@ %s9+KyA C9`9>]=^=+ )Q,8/~"vۗCF3ab85P, 4!WѕK<:tZrԗT =<ȁg2@1h+r/O}a G޼kk}JvIzI ݮvvFaE֞ݜg]Rk@8q,>.tvзH~o:+'lNor_;t':;صЉB*3ݍ5$v_sח'.* vKg77f7SV{ZeՏENkcv)k]݄e\xcW u12;?;/XsJEc1q C2T>_*7l Ъimh= wr ) ޒo2Qsoo`c7@>r6@c7Q{DŽoU'b_rЙ?:ieu}5ܠg/F:Gedm/>s'i̸˼peC ɝ?.K _)WhYv//`t͹kœ}%J, YG(59řc~/]ROo蒊B<ݿ МҢȷ-b0/@j~h$~RNíB'|1_q'xкM dcZ_kZ-fnvXBnx9T+8|ShZ&y)aoAǙ>cݐs*BoO UܗKXsJ<נ"zBBO=ϜC]kCk~ZS}ʠ_~ɑm`qfz./[gQb|k0AQN`S^e X֒/.ݿsy`_+#o[ Ǎ5sDY,'ETEn*.ǑV)X>oLoe}R|QgF̎|q%No#8`\נ:<'aIyBD|A)39 ]2 *[nAfӹ9yjEVŵ7g 2Ub &}ָY6pN+y2hz/G)~1CyLk# hg7'i3Hegoc i)_ݹmö* 'jbB[P\*]yOضSC#ђYrߣo}ȗtωGbk8I|)M~F[i5&}c.bvi3o7{LJ|Sh *| 'ty\ECoWD"}~aM>b %(Cx~;Y]ba߶JȋB-zq8Y< ]~z +}_-}%+Ao~p|nf{q[BU#D,Ԑ8QU)rr5\$Zp8]vnil vDqZ#ݠ1 >ȏ=(]"?RJ$K.Ą|#W|>/b?DGHϦA$yWxjrA!0-6;N_ keJZv,gj"ZV4(yMЭr9ΜD̠uh=U2?oTxˬ=W۪ٹ =p.,p,(_ſ:rԢISiz |eފMoO8a5Ko4g@yΫd5&"yZ$-cWԡwl}NRE,'C1 8]&m2M>+;TCgYbH XB@O~eFݚ_[jiƬ{Ȃ9b!Є8 ĽTy=herґ"-7X:/Q v$$Zn6%| ˲6 $Bb-r<~[b<9Ù/]+GZ}x & '>\~^Eyq*M ]v4EV -^seu{ xJq]JI0S·tn+q.I =e }[-mR'h<'$n=g6Bka:jrOG[~ 7D(1mkQk~/h |>j-6pMu@YF(6MyP{ef]DO2Cqہg5DOK}ov"g_2샾y' 5"WE/Wshea ύ8,ְ&-۠^޹.u{b{<_!/ -Q|7Av9}>6ׄ^2k ц>_i9w%y%QaND^N,ڻ#Z+hO S9=Zdhўy'ѬЦI2}/rg:C?8B.L|T,-\DNౌ`K;8qNnڐd+wddڇ |^,B :X (e@eD+A. C緣— M^[҈7XD\~B#X47oNQčJ^RXJ*G^5Wh{=a)bĬ\7v~!ElUXy{ےk+[ރSqI-Wn<Wy [ݒTE"_(p|e kݪ=V?1M<%ώփ<=7e-9JAf‚m79U4V*oi`UP"4ssd6 ޳&J?le5=[:,l#R淹qĿɟYRZ~,f[ |̗> 7Vl3T8GAaaWG>3[13ȫ$t$wozBӠ"v*Fޅ"=*]3ef,l'eC3c:8s]\ EiB)/p*^YIWb;be~uAdBqsJm[EZfhЊ }}GjJ3<R\7H}jr/}p'Z$'WY۶ ytKKDN :4gKK`e: ؉wqvO=OJKA"q7 w˒ F ]r#;4?=tu^apOxGKSgOWŅX~&nF'yA Pؔ/m_!\?^AF폀;-xZmRg^ vZ'Gȥu諆xz BJkŏAwR}. SiDR2N>5G̋]-'hh%?W<*W3h~ǹw'Ͱ3}DTĝjc7":7)35^u+ exvIyŗnW;jYӠGd6ǼEYE|f^ͲZ`'2Zp '"5D|FʹCg:~׬ Cw~Sv 5V/`P:>[' K`[Ք[7Ȥ\}a߃K&hV>Ս}gBzq>L&Y~X>?_ӣtiҜ؇3Jq۝VTْ$AuKB|)j?C&cLN42l?5 mAedf-4kWbhgݍaN<}2"/z^UhR-ec#gdTj߶ۯgK86wreB r[X=y C ,B^O-m c|'䓠ӚqbԪx@ܿAez1n']7hH8xߧ NmpCKTi`n\T{G w6]2vyӲ#59zwwA~=s5LW͂3@2%coHͥF@.H>UO^s-}'oW^=ɰ r }^}U }p{5zhSJEŽ{!?1#&o/̕K R}T~,?xoo9kAvy)%kM%+M?G` QWhyޑw^gDvjAioɐ/K{}ޗMNY*샿=fIFei^OW;|>Kÿ7y0U9MxaMԫl֪7N;5B?KYF9I}j2N|]qu' ֡tKx&N(Q8z Mek*ӰAJ61`}7z(InD>%Iߘm-{G=9J6󡒢#Ѕ=e8{Vt dՇ7K7菮mU8w`KNZ.ArPn,,EP[fn318]-r>@)&~!u Ty>NЉ?kb+׾|)vzq}BXt^;3{m腽ewBN_-Kٺ{ 8?,8 9EH]բSyoԄQzU䨡‘iz!ɏ^ӈev ;a_9d}_eb荧׫?Ҥ?Q#=h{5>s`O:za,A˃=fRI 뗋R}#ְ{5SU <~) t"ߒm.'5p:9d;rF6Klx/xAPrŏmEwo*gIxgI śR 4Rⅻ=ɛQ|ה xI7%dkt .I3Yh)M+3Z7 ~$crVٰd%i˹iF"o 5d˾/WWNEVkܔx}RCW*Ix|?`:)?ԣDJ>,ʰZkXZf;*K߉:^l¾k׭®ɶ9r(=yk>}]Fn9 y@}9[L꽄fb$X/[iTA>|wؔK=3,~;~6_L-G6y2< 5r h#k"3޿.d֯kgFz_ [ū'{όçzas@#eA+/pv'}x*6Sat[~KRmڨ~׫<-?].7Ұ{tQx5@fgfr!2}-2vg^x#'g%&\z8omf[xA_2}1rF>(h$B7_628^NZEfk~Ig5LW=ZBa24$c䫱3z3=Z8yfV9w3m~~jOIv QDG*1A<ަЦwhY6p۠+}O~u pF'txB<[.P6kOkWၜx~ƶ h/YHˬ'^\E>۴qjz1Q,{W*g\F@3ŠNz#%gNfEtK+vMSAm,D|˳-r7Yi02]p1P-f"gy3V7mV.F>n.rrǺ Rol x>n D5Kq^9K7z NM3ԡrGZ!`7(p~ Lӹ`^>g,QDepeHcp!h5La0tYgtr=1}B_>]՜m@YrDԖ+ݿ(|B߮$U]vnzuUBud%cDCA"4>SqC9n-d@O눺л2[?/ȓz/F+iTdTrtWGkbz#o{wAʁ̻.:?Z$4.Ҡ[4L\K:./t5p{R3]BLϫ muo ggyzʼn^s uUhGߟ}X hM松W+\/ƽb9jC.7#Yn]T跨lhBHpE^^NKxq;I -"I{Y:ުAc Av#zu/Kr:erv6^53uXɁ<3ƅzaY݊5^_jIoޣ*6!pKkz4dp%SC 37uU0}Q2el2Bh]Եݓ]a⎂ j??0-rۥ,.rE }I5;^:ֱ'zUHkfI6rˊHy$/Td&2T%Q ͿxZbH䀾+m }feDt7j r> xC'nom'/!gτK9ZYB ˆ%Z)y=ilI_%d^聼IJCft*2D;/6 ׼:6ths'\Y#l쾐Vt`h R)u/$r77Xh)tB` zQDn;DۺUipY^?> JWbFLkCN]H2Xz覎F_ j$d6N优E 1Adt_k RO!w7)o]4i [y0M}s*^r:лkqvv߇ރ*Sg!k d{nzȧ 3^8l"5UCRK.#t%]2o&m:RR,NK;6>_6t.^;CY-7[S;~7l>S_#P^UF] ,J9 hڑ q %Cȍ-gh mnCkT9e7aǹd1}Y׭l rF^r4)U\s"g?,uuz0 ̊n&S33NI$kz)8sezC.ChF8]Ac>]鄾ڡåըG!="|9[ˆ^3gC=܎U+J2vnAe] _iZRMv>Ƙ;2ۈlSr .lp2,}17)VӐ EtS'q䄩DoܭfN[EFwGL>Ȩb>e[QNٯ䃾 ||V]>qy4ha.ߠ]ChQw avu :Ю6$?ajvA{}ͺ*4݁5kw3ImKfcisf]6?^ *2Q޶CߒqOԾQS|jaS65KZ$&󚟠i4^׵ 2vbߺcع =6KW Act27}L:'rAoɉf ?O|>nc8xZ,>pl>Q?Gjݭ 0gEO,Eo5e-!_^yguI7fb` /m8'9?Iw^ 44r\%7@͛ & >/Y\<'p?Wio~S!E?.sGzbG[&eFj[?yRw喯l++*Af̓k lxR=$7|b_zNL|u@};We]̾pM ZGܢ4B^o{m\T{ :ן[5oThWbCQf >-At`.оK4TLls)q)f˷N?k<!)/n8t6e5](\~ׂd$Yކƙ c{o޳Jnd~ѱ tf080/#nPXLV}Z|-vG@+Pd~s@{[~{,<5hmn٢|g߈$0x#kP7Ƽk!w 6T#tزEYnI7[Z1Mo!@I#ԎMUay^|jǎy9a'ye_4d|O~<ؠ폯U]Wl x6ޯ-xM/Qwvߒ'/ASslUr'-|K/Thc/_ڇ}b{ǮZӂF}wOe<׺ſ.'n7j,y@ vuYYa84JR=_ɠAS ڊ6`W2@=Jv*6Ϋ=VC~_~z:wvc7qa3iA/3y7W~/[޲p a턓, msN8@C](-)횞N[貯¦d#A=Ԝw%ք$BPaodvC5|"Ui|Evc`gגX<___f _#hkGZ*HS썽b j*P>Ї3Wٳ:W"vb)e -:>~*M&i a>9dsɄ(5T_T-C Mն4vGWR"g+7Bsn^ &(ŸA?_ؚ[LbdًKI忢/5nYtx>V 6%ߩϽ.K ?Ct?{ N.[J;&gM~dzCna#˖TRJ^|͕Ǎ-%=K} ״6#W*4#{DsLzf 4>WI {ȮF:"aOuFMڡ9MNoqr]o oKeȿo=ЌJ2|T%.s3_f20*=;A׀^{}8@MxTk%=B{a ȵkn* % JN#ڣ@;-erF##+}E}?VKzs~rUmqbM <3.9BSKwj/.nP>527UF*Y33@k}.,V78 ~ sM52 Z%.\KtѷԻ|jj*T7/CE 3 ʭzMU;^.6'?"|+.ZAgxuUfҞQStf`w$ZZ\m`o4l.҅t}Wd9I=6hOf|dry9/)h̺V?]ږp/扃5W,DNev]cR2[R ݠ|Tf%5x6ْޞ|aֻ.Jk| *]c--߫7U+RV B@BoN~e{줽}n;p6s-k}^<b{#7 S^Kf{ OZ}7\{ßy iB.2u= _-4(=$i4>\[Z5G^Cve񌜏|Fr 䛆8)/Xحk? $vG22bs$civy<^DQ za'ud?y5ֿVdȫY@JnlAlԲ "lH4z'7.вmv3VYyM=<_rdKzi*?^\v佳]rEW A|_į4E;|+|İo@%zk(JN+Ƞۺ8W~"=^&wy!OB:^h0;m/HorɕP6l_H/tgtmCW]|5W7mOM5~Eԡ["8o.rߦv:st_h8\mSrBEڠ9f)}hn\Q$1 19/98 |aR,O ^T7ޜm$6lcdqvc0p/"ma.'trF\A)1"nGVon"3Ygk:qn)C3׆ Ykp%0e!`ZO5ҡB!1LU#C%#hr"Wrly=7^\idW,-ms%5h + 㮥c9PGxdY#]A-(1 `_%N4yTPhv::[t"\I#DRɤCסt[r>eVjz p')#*7z Z;gNЍV{!߲jF| TVw6Uz#'햫ݚ*ȭ.3gt3Zđ"y##7=6Kї7FS"{3pNR@='+$˛ZtԆ.]s\7KZYځ֠(/ÙMY g飞"i!WFa:4k>b%Zt|滼hbЁ=`bkTe Գ1 wܲcw Gz/z]CGֿ>RȰX|eZIJRD!GV+Wv2zH=…{ gGNdvB'wZ|A>tċH8G^F;Y2N|$ 3rxbA]3E_{': hYF'r]#X[m 9ܾw[ym3=Zt3TKkUƁ|xgRCuCZ{q/n2UHŋ5Zpuzi^H3qfoztsKs+: rhjƞ9FNc%fv'R .c"zO4o1зn ?J)~~z+Ȫc f`(hң{j0TϺ{;7FTL[f]7.r*I':e;З:'F[^XrQǮ눲hFh9y`fה5/|3z^$Xm4n洑$M٭Ȉ{}SG:{a7RnK s[;#X$є'/[ysRhy}sF::ZgGc;}-_b^Z[reӰ< U?`hh K@P9"KI.`pA^&z_=ݛ<ޓ>  M/t@[%POe@!NZq|Mƚ|M= jg׍\^^ns+*% aN^5{͋ѱLqeSO蜝2{]b=_ *΍]u킜0Z șt̻zv{LdNm2vDҺ_Go*SDGΕjKц> "G wQ? ,#}|7[R^+r¶A(`HK6^˯SQuZ o|S'ЕZo.[C^zKe˄^ӦNyk.+>|a2K>>c6`;A+r;O}B7OwUIy-e ASfaQjl2p㥦Fn] uo{O Hqmr3Yϙ7@ȷ4/+\䴩,BQ@>ӮYU#T>Wt_kmsœٖ,.gUzӻB1eVu/fY/UO\B#'w5 ȍ &;ѵտvqkoY׼4yi: D:y4z]_m/@KW~S0!GKuy"D)C^#}`< h)rm:/:rCFΫE{qV{R:35:ϩo-kD6M*.#U`bG0kk!Q9A/ƞrʨ]Yj9.W7xsŽ[(eC>3#'sa3l216^sc.6mJJmkp&䴋JOt{5:hj| w@/e}H\w]e& <=b/NQkG~W~BUZvrml ȤK ޮFw>{/^L7 KF[y*KH4ځ}鞤I:!籓OIe#~@3uZ?m|b}$".i| XD=K t(1+iicF"79- LBvItK5|xtE#EnY/@.ƨrvO2nyb_#D>|x16䳒<;ЩDV=J>=RƮĞn2@;|OZy9wz鏐it!ڶ}4h蒋zxO~A-c tOG:f< Mf\0gNM"q82.7ww#E~ C+TPH[JUFȪ<_a+IĹؓw'Vs,S҆L"Է1ImynYhXAM]ZT#/uM ݏyhFkVln^5=Nv.|~v5;Mr" ju1H:aGd*tzzٶoG9H:tqDZι5ŋC{wt%:|9c[2UyV s Nedt:tZu>>z!Ci#pm#SBפ#F&^ҭ _V-nDzMՑd3doB`kUwF(G^zxNOY5e^ȃ]>]Vb?N=\2Ci|TEFIXKi5J7:miqy g~]݃RPdr@> ~/= C=&ЇN0BѤkGrs=5b%<+rYĹ}UމN[:] ۨ1$f%SjF <xQOr?;w7GwV}Wh݆5J:1+"ھX =Իy@^i[1VbP9XQ\2+t" k/Tx+I$yӂtI<=|1no5I!|ӣqO]D<2:\GlzjWDbBB~*ay5H\Å~EN%w_}Dk֓Yx7V{Eg.1I="]/[d~O~[FT/!T@;F9{a@^];}C;h4?S.rwlVlcr-USk#%ss#"h8n/#.iE.F72oE3dZwZ%LH秋 ݋ 꺢ZsS.uR^@ۄԳv!#mݗZ fm}G ٱU ~_̬KknÉ\6jG^ru%]P5|6KϼVhב,@;? =;5`~,zC2nFޓzt/ XSϵיJmkB2lRԷt+3CiI Գk϶vエDͥgC[&T7UʋeEIzZENr"D}f1 nU愾E!IlA-?j&:+CJtG2Q(5ֳh(w*luDU/4K6FNmia#* o]`5BZ^.-M7&x Ht9v5^SetA;RQn_qFDQCZtF oCw5=HF){WIkHBc~d $$#]R&b5.-@".R-%58Yntz23]nCnCc|o.E޾\$fz6UitbF^Fw 3f癓%{#U+4Rm+/9ͬ'B}M ]õ6_ ӧ vBR:uE^Xx!ir@"G\srZ9duJp8wHdebn#zcH+\R nϽG0ox2Ͻ#n./ccQdzC|>uRcm;:BeC_.bǞ]6%+_葨)׹3/K)}ƺúsWd2-EsƆ{dkwES5|1`_6df4_K\ߛuV?PaD˿F.]b4KeEFOT o<>~@ҡ BGbQ젡A/rr eE /[i0^ [!v F UO#I^mI"zFˎ*yd`|1䳸CוZC_!)@7k97__ M{׫qB71%gMțR.m \y䒊h^ԣNJvPz',z[gq@/y+HQH?x1p"#qCY^tNwIK PyM^F~Ӭ2=#}/LֱE %jp[^S%ňhiW|bTؐ%SzYtnI ;/#8/zO Mƽ΍09DzjKVq ߷:hz4吱-Ʌ#6[ˆr7C,;ؚŜj9'utVȩWRG6XeY|K?/uNqЙbOrw߫=(=-{ YnZLEԛ>vG[_(E 򝾅(^UG5dJ=)xvm.g}t7C\F^S@*rN=\}Mq''Oʬ/F^зӶZFҍ:KDfg+ Hk}[Q֣z]o }rZP_?uCW߬-i &^63Z|fDz'/or jWhZqҫFc7Z 5l({a ]Rq h~~[ׂ|it"_mQϻ,9pϡkH hw\/2yHK%`ID:< {cHJ1؝/?GCNӸvi/F;.|kGtZSވɨ4UZܜrk"S^DO9`vFS^f7KI1yõ$֢@nӮY[Ng/]G/D=ݪLSF9tx)$e=PT6m170ΎxWfi~ CV;͈f!:sq.fKd.bнQəFnQ,^3O!)YR} `/7"0!k0T{Jȱ <ں3¦_+/k ٻxI]I*8sO{^SEt/6h_$@sh'vtw`u(bl7얪AJ't\F.^\Jn|řרT^gE\;"3`6嘙sQQ랺Sn'=U/ -j@% |XNy>>?ReoY&"zB8 u:~/^z4vn6ߣA)>8nj `,2Fq3-7%,\$wյ|12_Dۘ=;iL8% ͓҆;}Yi(B5\iG޵,Ue<WcЗoLN{VI.>kBw5:,ZT끝s 9Riv(ୗOTlN3\,[8.Y6r }^}i&^TsYS4vMP395IgZfbP1^Baa.?FJ"''>s.J C urj`N),=ҭq\A:uB6h Nц.Y5=uKF5Gܗq˞`9 S2C`gUzFz{/&h лf@iɂKea]`7"M =_j~Lt: ټg*#Wwk:eQWM{5n"tho,# \IqٳA0f2+' @Ş5RIa }546ޓ}Xީ4tБ?вN4ᅅ.t+5Feq @~4wqz`>[ }S9K:k_^|ۨ'9UIJ#+ ki7[CNYjKà[Ex/ 6>Bݿҵ>/g!mnݮk3գclٲ8ȗh]FBze }p^}66K//KH*FN|ӥhf^F>ˌoMgnۧAHWzLs۠[zK ypH@kk.1$.F?-9.Gf#{59?ײ2x I^. A|D-:c2׊IIckܽ,bc&%Qk=eg^>Rc<}M!)j/{ 'p6 {*oVY*Jb4i:}&c<;rWJջǚ%Ozza_%ؔJ:/#(ލ) hґ{ej ь7EsLrAHόœ 9%Cl|K=st!eYP#ͱCWN۝ɇ)B54ed@#?-eAt_.Ԕ2i5 ߢ7?>m1S@׭Dg~Sz] =w칍нAk%}թ!At|.JcEfw K}yd"O{[G\Q)ڲ•^yhImtqfryO3؊34$ ^b'GObZ[U3k^NiȓbBE3%kS Ҥv*?F/di%C r}]xl!暿`ȯNq.3hV֞WFt+س"_, ]>Luopح/L35F^a~Ƌ zru!la@\<k-݂B̄Ɠ-Zk{Sw2SwuM߲R?dbS1؝ddAQ[MVۑf#S$D^\'aEŋhk>\Nsv+o0idO?=5𞇬 4 xuX iPO+tWSZ\RVZ 4Ծ!f0SwJ @')WN ^LoS+|•C fN}TdI=؊df!5/-"kT?ֺ0Վy|SN&˒E~jGkĢ10x/}fc )VPiA?.A3N&Rb;h3/ݬѶteaAưOYYI2z]R/ :R_w Z]`:זC$asK^Mv* G<_K\"D>GVFn֑IMؑ$46 | ޭ$ixR}7 r5D?Ug&ڔpmaD0<\]o6y]BWTw;G7q%\W}^,ȑ/}&'!m|'vsy ͜$b9}uiľSƀjKżZ]>/vpzQ4"] q%@ 6Cb{`.urJھ ~a/=ϷuO iK*tG|qoku(t}Sn8)wA1%\"D:;D}E 3¦B]LӺMz"'{X)-QA^?х7Wo*~˖W-}D4}9ioɴAI1~M 4Џq@=3'oY]cT }$C-1nƷ͓ ,Q.LGgúgdZ@O[ zS`t.JΏUT;G)NDEN_y8ZXެ-D*89YϏtHL<\hZuj%VS*r¬}N5^]oT#r Um:/.rzYR =z i]s}sܶ6O8&mu6< ł3 ڪ- }tugk/xR#薑8י(3ZK#vB^+r wyrFA1(d_KH c@Z{FZ%gkbҠ7#V-]ic\gϏ44ꈍЗp7ݦULo1k_`l}/>`EݟRn="Q_-[7yHy$dg3&ƅVN} 4 [:,#cנBѪ'*Ge9:5[\#bZt?}P9 A:6o}"wHewiDx>CNڞoXbrL'=I{z@Q?UdW'_gjN thN=/5&tLXUh}_^'ȉR]h7x@N[wA'ruuǔfx 9oM u{IEKZxH:=|UAn퀞.,[ȷJ6jnۙ}mOۋt]=}Nぼt{'to_C7H/{JAA=vlV6ry aT9=*nIЛGQi?Fwq GY/rUjރJu/ UlpL)r#co1z@Ş"lyԪD7s|3waaH^!g$ގ]6AV&EgBJk?ķ)܏Tj=%J-{%+o¨'jrI"tR:?L'ڱeO l Q=3A 5E ۚΌ9%}KJTOuT33L ^>[ݙ#'#NԈiWF~Jܥh&eȫӴ?S$=c'0~$wdrthe3riT}06,t@kt䢆=fIEu)BӥT֏SYzځQ](.]KN))^yFڛ~|i"QX $ywͭzQ} ']${UJ+pY [IwԜFw6-` Bov thyFY|:cqTh 9@;M~BO9 6T:w^l@GVXۚx 쁺o;hUdR*-c:#{궤ЛH~F?bԂ7GȘՂyunwZ%t!buJ_oYױ]l;]Ju&o)rܡQ*[8eAEB2>LMymy |W}oz=* }WzʾҰ|c ]k)'HWeC-.n{[t?~+JA_#r"OKIa'>z_ۘm@whV-Q/^Z,ickؒD>b WhE6@4;p%(<:vK6žO"1l ͉t1~Z{llrs.ț}&j" 7tg:E%yYJ77Ձh6@ƪܾ]3]؛R"yl@D򰹬yA"ѷtf"^S ݂8u.ΑHtl=YFIux"/7ksZ%I[ޒ-V.'$}K9AwF6{kd#x!4/OKvt͐|z@cA6Wu^&@+K o:o|oF.[1M{?ui^%: zf-tMȅ(Ũ̢:w|2Zb.]m5{@ͼ KNCW2:ƮeD/L$>wqD$ȁQ.]dTO1cN%v^.cXi 2NzK ^#ΧAwT*Xл7t[Rp m<^PtsR5FimA*1ՂpE i щ|J`v N&5E׏IPj<թKi=m)wZvh=SttЪz"}Bp2st/|@%b z/i\R/}AM~_(:zIٴ}:*nbP|r`9vqk:Ǝ+x5Fԫ4& 19;_/v\:f\/݀v;_`|=fԠYZੳ1-Wy{z˸ l<`#ky:|JO[$ D}:D'r'5VFc%E.2WRِ1 :S.N+}gngyIykw /OXc_|D]6K23UJ*kAC= [t-n[kuo+(AowFHґD}~.'N+]@wʕ3:_hAI*5hyhOqB%d yVݼH}s!tqBOC JP"UoZNK'xE֦)SuY,Aս9>F:~@;ktJni.#݅+}OI6dG60)HW'>Qa]}Om؉: xB/3&گR{o%/ܷh,zc30%Ae)2<Io1,MiȋT>F1{WOAN]̀Z%F85z僼ގ@ߕ ^ dTS ]LzXk1ztmIlGZV3tzjSЙn9DH.ah=v@OC^4T䣝i;2ݸSskf-8NOGҧ{b#ZҌu5J(Ѣo6sC䮷[nW7']'wp=]h#h y47a( :% `f#6*#ףU|-cNNkF.ӽhAFn<=}!W|RYAp%}wʥ n!r{AݖD-a4؀7芴k^luy Y'Rv®1iu \MF,VHO8K]E`LnZ/s$%U.F֗; u ؔ>5v 2(tFG6OocWQO @{8RMg$LZQy/]Y mP*{,; ͐գZjCK>WV^j ׺F>K%tk/rcA_*{mk,bqZ&1q%ZB-%Rm.cWg+dw];`Q-zFkE1_蹸;:eDN =㊒gEbɛ] iB03v^PRO?%orC,-( z$V/bG2?_论 }S ׽9 <ځ|^+ߪYO//@k s =--?3ϧAky} ֑D5 tIG$m-8tp7)_Mn2?f SnTˁw[R?c##)W?Nz| dkg]"w>J }“7{#F*3Rd:6QI@2a.oLOSf(X :SKIw]A7q;-{]^v]Tґ#$O =Kpt|)|uܓz?<2D.5}kw l]aOk/ft?ߕ]d^ޞj.+7C2|>Lu䂉\.C Zt-ŒH_?$t B9k:;xTNv#gmm,ƾ}Xuz9!e*ЇvV^*vZJ?%- 4{Q }$zIv}zÝ.meR'iU]Ǟdp2|3k"OHHBTb?5=,fۀn':OȺ6" շÐ<G9a8йCzX晈,7F0+rC7x=Nw?гTjiZmV 3i@O!sޮ=>2BB`m`'D'c>7_4*%Z) u4/܍$jmCJ/: q'YTKM@0>f' w< Z|COݏ]St@V؏TˍV@yn-,~"w OԴu-ΔxzIĎGcv]}B\(4S3^=Z1]6쾷ʀ.N[z]?bl Mşof:N N~Ah'Fm37j#kEL0oqz~3|ڿY {0SMTz"zL͐M>bG /<k&M&8?|ETl4>ۥytLL |Qt&O˸'~[ 7r_{CSEt΢o̙\=4%?fnk+_-9sW &y;ʔ͠7MBVLlG^Pl4y cg[ m5VCm ;Cdg:)<|SPb+otx/3 Yp?4O$ 7HD{홖|pOX" !'Z-[,4W(*!~&'GhCsVBÐ TsgEC(!}z_Y g'z![ hݲDv]nV# 8riom=+n|t4pYg@r/7xr7[ Sv',7(ZVQۚ |ˠth:K]"Fނ{3=:$fz,nk] GtX\{y)\} x F^c19|? ;VX7pa5ۍ\wr;?O]} ժk ak'r㶘z6݋fLrb*&Ve+txE/伦EK;7֡w3z.h`ޣpV<-}Ѿ]OT"52v{J+)ߺo=ė 7Wn7S>ru[gmrI2stDJ ܋5i߅!26g] izΌ7~~onz_i|c!RHVۺ6M0/ ` Zht:ט=iR~^IQY"69ϴ7oytc`D`UzĮlaJtא纏y!m&~x0kbOR֯ٽ{2=˹1Y?0sx=ݠy.t;]KvVfSϳ6;ˉGxFj{|'ڡ=&/L&NEޥȡe6]{Z35ӻ#S# :}[HtT;E7(CVzOg|L猐s=ɒֲ:m5~b' =tw@5 ‘`(yDf'MbQǬ{@V*S/Ӂq_ycWKB(Ҍ:j|_Aw־>q*5U/zBW ֠]3`ax?M`Cp[{"'^M# ]18cVIklTL_Ƹ~ܜFP~E[u@g=-OW[/ܚ?߈*Rɵ-Toz~ Eo姠3zoz#\3ySL'y`<|;ynI\'7xZ9ee,FOntX! ]FV=' RȞ^P亳3]N|GC5;n}5?yMN1*-1pz#8◱IFmB4j?+Pv(7=$TU"oy) *'{Dȩ`z\,2ƳdEnoغ$=WE|9]ń4g:[+ڥ:z]+bbqդV{&}=2^ yJM`38YiJ7+%rZe%F>7pY7+ Ok)dJ=koݭ!Ka5ߧkQ-H'^^5'7@a^m!&{#ݰɵ光fRgFygd&'n􁞲c?,tVƍ-h{f%El1xY4hIf&Y<9U*Nȝmw[ `(OyWA :(it[ 8E;p_"_|okJQ6{/[cWBo΢#.?IYJ@֐|g9Skw+ď8Ϭ=CtS7?[dzƪyqV}ߧ:C}5?vVBJȉph5RThVmp`3{2P%\;eĄ%On{R&|Z"$fyfE#7ooff@lao um~O%8=zř^WɠҰ~bX#h"pG|WZ‡ojZɉ+O.J=KD:y,ޢt&u=LYBwHrkFѬ DA \sOAnō>y{lw^8I0)}n 6I^;t%d{ksnW+Wg{#f8ކzy8,;,.Mg^*c@VX,m|NN('hVmNj Zwne@zˈh:9'G:G~G32k-{o "fƵ-KTc~Kj=%3[w= xrAʌ*WȘygAζ)lA/7+K~5zTfYoFqŵ9q:F"O"\DΡ }9U^U5 y"ج7fƿSP94#'@-yrxSB/7>?Kޢ,9'l[CӡڗSwsrݻZ'2+\ $N(Z&/ΪK9l^5[VEfk߼'K8yk7Y׻\Yŵx?l魏۞48r)D5r[}>  ߋ/k*!7X Nx)Zv:vgHEjKq_4V՜ >AFFn9!ySVHWfD@xs_|>SFN u'gh:mNͧ ̊:LnCrThk&pƵ8i7r /(3?D2[牮2Y@fV9Kw'hM0N/Z_gg נ)oE'Ό 8YhӽBB<6B9SEfy^׍6ﳭsKESJF+L9Qd~ z/c..0{Cy&T&Kjmɹ7pYBg,bhrdZx7+%-TFT~P \Gmp\sC^#ҡ|=\*JrWT U=ȰFDnx&nRNGx݉MҠz7ȹM 'rkufEwstq Z{(6U쓰[p'6&X^ ̈́2BgZJ٤܍-6φ9gPl禊ltU>%]hU׭b 9j49-^vbʊ`GR|Cqpy@ M^f)|O l6>K9@=(!tNȂDZ6lo"_|Э6ӁcKЇo'})KlX<Llme)bsithVL?B'pvWq reCJ̥B* &YR .rOuM|GK$ ^0XöurX:'Qx}-nhF #gyvt^.m{۹%\e{{oEolS\a OmRERATi7p N*)rKmxZÆMj4<x֜ĵ883Mon3|fNoI'🤉A@t˭Mo%~ħǕHCc8~Z|!7h:pHSWD.OO3:19qy{KCGo/c}vf rPQx˺p"QGP/ȝ.o-4y<Ğ>_|0 A\+5J+ t+#b.C^).zn-]c9loM6l[a%c"?=|B{/_i:IWC7Z2&}ZKƤvz8'@_{ˢѡ'B%$5zfG+'o B= &iPCH":ʈԱXB FҐ9ȗ 1}ޓi|B[EOd> 'n}c(~BK \@'Ynʹ#'yȒO6y|'(Ѕs:y ~ ,\aQB,o#:];H>}$|-HArXh-A2wn9jOn"mo׸xJ 3Xup]cq 4ougǀn>bsB ALaE˿^֑>A~}ĀB|9tƁ?X{z dv+]UХzBoN/Lj>q6;9e 2]f@Yz* }а Nњ+ъP+%kv م>]e`1EFbM`:zO{S\E!"70%كLu\ 1fc4AЩo/ ^ =]p){|YuGpwB'b/rb׵t]D@zq^f9vz ޝ\B@N%svLCSzaD=NM&Ro跎n@ӛ+mKy}Kn9`[k?w`uR ,u9A" kF[.ј3嗚/vYc2t 2c|bz"}_@t8w.;KT+HnäD>Q피H PM6O^18p-y`HaR:PGNNyw&4 ZqvBgl` LJllKpN>+Y$dW0?䔜YZDWKЛVuШ 5\u&X+ФS*5>lF[VZ'E.PY ]< u6%m{ͭUA3`:NuuGK/eR7#?!&ώzXSGSh,gK3yAľEy>Nf''Sqڏ)tn[rc4r`n zIr| 4IcF5AYboPe\@Vür~` @cfM.#\Oƀ*?U?ew`ua YziuGmeG}b/UT|\k̐~,O8IZ&_V e\m~]ȐMl'tygQ–4Vf$dN}בuV]]2PMb/~h*}*;r^r2+ˏݣ=U pW:GsP1b0 i͐)O`~Bץ'_{/Ғ^.[zgLqbc|]H@zKk?1Ylߛ[ 9n]CCQ4> {`W</t 5#^з6[î6 >o趮();O_yvgUvb̠+ ]/FSjk'}Ӈ*=[DvQ_f9 }gEv2Xǒ3lN=m4нFk924^c%/8^BfUP;%kV*"D줥nB4'r.:{vB5 Ms:--8n N vB'bI M3!jBd>Klx?bɍ(ri_5+=ƣCo느*{_7DA2|ڽ,YhQ6 ن [jVs'tFg@f|S2[EE6{zLm \cGd>ɯ_ ?<@.Z8VRuqC{oΫ]G;T*t?w; mʲ'3TEt=[ήAh&}[%"JIY-[WVg)YqMN1Q운c^.u6g~ECWwiGU:/.m߻Z]pd.+H/^|/pNT1*5CU*{g#m#%  M>c]| e=Z y<ɖmd)=:n;ݓ!ϐ7MfӴB9B?mNE>ר88&{f5I}]c^WpNS[h6jMy@N%nc?tzm /-AݽJovh-ѢZ -2KR|Kt>2Xkrx'vح {5$Q쒉r]sz**F'vZ؊cԥUvp@уS%?ׄ>rlWƳ4BJ@'[K'T葤8}"_5Qgze/r@$sp*AQ8erm9#lJASa6)D9UI'rY$0iLsϨgCyz?L^c~pJ+yMT]7g"out w7}V7ѱ54>DQKzy5Ŧ993y=l&߁υD%$e$[-6τcKP}p p\Y 8"j_Tm'U n[:yMma 8.vinQktW -|޽@y:hWī_d@-1h抬$8?F7כT䤼s{8REtn-)t +`1ܛIyJ1&o ZeA]F NWDP^iZIs |O@X>,>bQ) ݕv_[iz/mkbqCNkWpVyN꜉p // ff¡be8c Sp 㙱 ˱r:JKUI} r9/AO;(oJ<-6;K2n亢ahx > l \.X#F> m&Yȅ<рf47f&ϳ-kͥCgrsȁ|*X$Q&y^dgT@oو޲u@Ӳ{?؋9h{ oz*c?%Z H%܍Gk=1޸a+4gYqMTBz)!½yU,7[xY2f `@N0.;'c-$_5ޣ4edzS]'!ro~*ڷsuyM: is|М .B~ |[ԟ>CT7rϓ.fS[2m/|sX {f͜5R Gt~~\?1 &*OvGO%CbM/hT$9=E$ɶ)2ƝD3oHy][ම}"<#w[g '!? 7H.o>SD7r% CߓmC{I&6v|*Aτ$[,>-]PBh7o9t,^Y}˳Qa#"Y93P|+->{yE!gZ5TlSJbF,;Kn; hVțF0עJsso!49/ޑKQہ|>a^K Kl̇A#[hU:sv|G܊k~$͒,w9&I#í3`oR=lޣ͢ tki?'θ_h2ΒPЩ9H]BYg7p%d~%;a#U:\-o}1o翅fkR>^ĩ SYgpYv,$i34Ԑs9NM$7+7p^OC&\k#/| a6L^N]Dl]mY bf;{CB5(iBO1Ν徱C\ZyT?^j˔-#2//B_eK7]6:r4p8};%Z=Ne>ICuGx.Š$tu+3ECJMٽ_2!g-Vz5&h'v} 1{[ݕ%*]]" +v4vut擊}W_lZϮ>;q_._.q1AcvfqzbOKgFș-N%Zs2 þĕOI }H>v߽Q:(KSx tk@#OE?>{edo'aelw)iB\'t[;&*r5T;\VLFGvv+'f >+:Gs\]H|-.!q8]|@˾7GHo'eD'-b6'+0:EfrU3ܫЛ.G6,j؂ ?DMO=vz&6܌dgRK㸾2GjZxy]@FCѺ;gѵu?A91`3vy{w@ro!.a!璵Vx(g@R,-tK[[3!SH=o8q֞_Iq/R~^2\O>$vtnX)>S9їpN 2A~8.}TƉ}>]L|Ol=x7ES42t9N3ל=F0N‚Vj] }j [S>VڡID t] vJw;4zZ>Af콏:kyp7۽@8q|> Z~Bo [&;euNM՛|X{:2d!zb2~{oLbޜ2'!7ว={G?_-M>530F{Z%&YXxI* j|B-U'} ^i},sM5{ sHS2]" kZI7 VglfU>S,o?\qs"յlAK}y+sݡO ,Q22Η;TnA^n@[- 4-I%Z줰.]6l!"{+wA?Ԓ oax#hOWk=sj>3,]칶T2'^"+;[f4VIQvhi?yde<>)|>rxt1֏kZc[?Voѓ =btANc}/١Aزr Ϻ"4e(2iI浩3񰕞Na]]i /*A5[]k#%'.r߶~A8R\Y-ix󆮋Ҹ|pQe2$Ws:K5> H⇻p*!`?u1ۈ| %aS٨-J)RMO.Lȱ}E.5)--3N.p`)L s_)|BFR f@o|\Խ׆ܫM#-0?k~WN 51~t|Hz`f^~xC!.+`1i[ K?UZ/SwߒU}M:leχIhy>İt#tފ$da}F$35N}>?T⿼]b٠E%7zHc"sw&4!F=bC %j} @+p*z}d{7R7iF)l Ͳ=57]: ZoԏkE1p.[6eh{oIm'{x݈s'Y57C`*;ƤP-9QZ\J!?1nm}+62+@rAo;za!_: h!1LJ`*v"oE#C˺}"[uq}:.tߤwcu~G߇+EЌ_9>R_FmȞn;}@(HQVKq@طI W>r| .tJ~aJ$`M5b.FM#lL-"Ce؛c@۽q7J/dej{57q:Uo?*S/}wg2>0G3?,™hy|Y߹GMvj$$B\Vu[}9H^YCs5?3"{aL~cؙpxMF౹pd\bu(tؼG]sz8,Y-EXh }6O4Zez.{Bޯu>ɩ8/3r%Av|vk^͙\ȉ>=oǝy-$uknxF+ZIBŵ355Y5herYĄFdVg[{GvO@_ʠExڟ'ih(lUtU u3ޠ- ]5=\C鰸͒o'癰o ;LIE2&I_E +qn] ֒ CYZ+~ȯ(dӬުpදVzKChtmŷ"0)t/O>^ЋZ'𶮨7qsOJ,m_KTz텳]H1FPf}?ёi)u w _ Lr.<_oޖ=+yqA!Wæ!XgDm2w*8I?:tWg _Y7zAw*t [\dDq>AՎ:4hBn>}NYge˵B_ ,7[v@M)CW>,{EYO"c1>V]OQOT^I\/7Aq.n1)YJ):fE%2zC3[Dn#V}55V E\vxdZ6$C>jZ5Ri-CWrL[rK&v"TtTinq`s,^7A_x?-b/QlBY-O(="ЯM1f W:t\kfib6d2VjPSq( z͏:Md7' ^1rlo."3,CCgd GPhzwAj9arIbJͽEWn&ЫNr ye[o6ϸC='r#o3>X4qh?s4*vZ5AܶyAn[vgf )TV Ț؂dDn0?=l 8StT':59Xqw<$xXh^6jpO=vn=YiЋ5,^[j-U􉭊9:I*Z.͸B\k;xMN#W#_y1ȿ{Viܷ }DεBn!U~LIG%, gO(|l$k}~Vg;#/wV4lʞ@e+zFg~o2#Je&2K̥>#_gYќ⦷2\ N7Y|F4-;5Gԥ !3Ҏݶms;}D`Z#r~SٕoO-8{Wkȇ^#7FϛOanIwgyy / YNki {ǹXCﻩ!/Rn#E2cpxq /vr.$} x{yes;Ǯm6n\8ˬD <^}Bw}*"|nQId+F/mS?^o+Gtsf'3(&hs"ox)\*r8+[y8އBߨ2ކ,nK j3 \49Q/&d->JINpÖ,e!DUg'wh.h{>['kQROc8.p}n8Ka7{}r@W~=Jr:&Lmomjg:m&cܳemkobٍ Liq x7,k"E;A !q@3ɕ?%>O$M'J+eA9ǵSRb S,+75@qr5'L[y^KC$ke]MЏ1fobO<7l8]e-Nl6;txI:֑;wv#qrB'B6 DL3ޤqA˪v ]qMm82w(i)àw>_F7*mYr|:rPQ{㮻eK[!;+miÑS#{ }8emF7pfVahڑy@rUžZg̛ .׃CO&x[*ÞyD|rYbG63|QuNKβ"а=¢\VhEdQPEܧ&~8Š?N=I dk)7@..WG]Rp-9?ë.>쓭 J&ȀV2J|k4>&2wp^k[q9,Nr*cߪ{?\o[>o3+3vLw`M3{"W Box`j` ]~8);G Z)ds =>}o5a+hәأǛ}Ů:10vb>s/i7f-tC~u3\D_-] Z™|±Vv̈́z♵@f޷̤eʉ^Q&^Hjr]arN.x`m.fw I4q@1FM AErG՗2oFqgWCI}&~/ u }DY=-G~AN%2V?fʻkl K/},ѳ[@U,\͠G5_l }fodҿ[boН0w! fs#EŁ6|r~ZT'tޞ4PN.ibw]HQndž: ,R>.b_ouϱ ]4GߥE4M@%wMSx{~ݤ;au@޻} *ypCZoZ uܮ_i5Nvtꐃ<5$c`;G_45;'z ?>bevZJx{R986A90t*x #[c2dľ2vwζpA^.\.D>kB >?4^Z?xtf@]/dUURGNo5|"{hI~Ot_Wp>p=r{|ĭusni4o}'ତU8+ۄu}/pVoS] Oܙ{Ti= ^7m7ak/ }L>b`G ZR}X6i"Uv0i'}n _wY $] HU]ŖxɎ7Jzt[{=b3 O2U 7:W\Q,e93\+v H ;B wE?>h-mZl5A; 9ׁd۱a]u劣AW$&U0 <<OQcTAD%\'N^wR}+Af@~7@s9xK?3w2\Kdٜ"KkF1 7´Ϛ^@vyTFҡp (U^\BUR; ;]̊T~.{nm_aAt*kX~ݒ)Yݠ;aTd%G*s|348~+BBKkl9^.K mNdx=)f-r טD_ <$}Bo9֐|0n9XY e(on\+ a%h.[5{Uo;-zqs]ߏ)ȿL9v{4y@NI$q=u@>m6Jz++1.AIzU} i^}>6_0h賜5~T-HOI4 KF7vٚMJЩxxBE}|f9"u[eyY+uPVv=nH"C7 |C1%&lT'$ѐv=I}ML|DCZCȃ*|b^6H{;˾Lv15IFq )悾˦'\6˰I3yc}|櫄#VA& ms0*þ)k/8py\à.oM,6l;q GχQchfX{wξTqw/ZeZ&)URT\>Vo;1ϴY?נ+@R֯`'bGtN}-xUD !Shzy4N軓d{^jC:<^5Ɇ|%8<%XtA 0ao_3#A0==2ҡY }Vx .{ZЏ[)clDb'91ԡ7=dg$Њ[P&,w~wGEsWMjN T;1CNywAng4*'t,<@gT .&{@Ņ;<~gTUX&lg7/Uk7H g껆6Np+W'醟uoȲ`kA\]ycZ5|`>j Ovp_;IN.ľp;tvGZp8keJ@OĤ~JI }.dz­3TM{Ԣ5k!<ε~B]kD'{wU* r"s] ZSzK XsS%`vN^*qH\1=Jz]nꈩ̬;֤%%b^yB>NgkN,j]逞` Wm+ lȚ[/͌S6^Vv/vkt?Y{@ q<_(r:3fuyX.%h`loi`bH?[1F%7vZ2|`M=(Lmv*s Z/LYzIs w`vUJ *=Tyطs=>\2J1895 9ZȡO7wt0S[6P.yʾNl5Si]ER7[61^ӻe"?A!Dn;S5R7jn5fg 9W"{)6lfZ\|mdSpp^#uQo.Ъ,)ɋAB7H^{yTk0>dH:|B7t;@)>9Ai{B0/XO8QЫt! t>sN1J˯ =,͐*165h*&&}'3Yu_-AsuKB}@* s(_e{@/ f<&n@~؉gav&ͮѿ+L_>9>E+';FOu^qI\~rе$~ԗ*A.[`kvkS [tXNQ.%aj$tx5d@Z˔ઙ.*t'̹%[@*U3HcY̠t iHhuOSߝreRȀ4Ż)uEv%w#8|}FS = j?RMڂM _ӵ3rXIL*%*ro0)k̿'C}H+]_(jP5⺺)V3dj$6{U&tkfy`]4l)EFq} o 1ZJ?;[Gɦ.tA;a{[4~b>G"Д8?C{G{vklr gs֗ oi8m `o^xԿVULRJ)-N6&ᾱOswc.rb[Jcwj5_ b>4)ȾfPo˜gH>' f"H*;.rƞ@w?͛ίr}D&ӑ >:s0NhJ~oӀgkCNxw\ԣi?wYH}g =e2a*tAY4Kh;2t *f=,`@소z i넼9]z@и`M`j&0IXd@Iz9;9SL9ąR}P.m_-_͠yȪ:* ;œ*z?|G'v_[J۔K>s0M;-,Ѳ'^y B^{,zq zKS4rQ1ޟgJ$dW/Q6Dd k~P@Α0ispدGjTp U3&`}mvv{5Vf}L$ o NzM<˖#ɽ5TTF?MjF,k \ِ~7B>d?:s,7qЁS ';Ќ0cru-+ا1G/`&R)qF͕.y]ʶ?t׉=|5~"GzۋB7+% 6q.3bU?'z ճh]^KEw|gwfSԐM:>5#-RB:/c-ƚǼBg }c"}d^7% =1WF-e򁾿S?Nk';i'g5;i/Գ_ݨJ uV \@wxdo'z(]3!șEY#m'qL&@h?,/Y\2u 0dI 5`Տo7hV@^ce/Qh&uBiqO2SE> zɈot~BרjZND!,(1Arb+wd.2Ğ5Hp#Q=V2 (CE?sY+iG&&k 3e>$"ȫ=~Or@O*| 8WhY[?C6/(k8ic;lv&IҜo[GMoځwZU5zid-]^<05Wؔ]#IT%]].Μރay{×NIK&{S:gjn>H|X}z/px0o"?B~vt2'ny>> m>8])Ghޠ1޸[,_]d-'{pm#/)}syMNl.T9H\ēۈ=LUz"Oz\+@1|=՜'[Y⿞@ʕYv"ڠr3ȧK,A^/Mg=u+n~E^64U:DkHZ l^W"Ow !#uGLұ+ĸ'cy#Ǫ4.?Qp?S ;ao-Ĺ$G$ilJRz(|"罿m@wamz:OUZrB*\eo+W,ԗoCbxR"K,G[bt/R~¾wIqoV:'lzVЧ|v2)\')mؓ7 :$EK/Fn^eT]B<硍4r@UH;/uhȥg$$Le |rVe x;',4=߭A əEe3?wՒu k[h.oaCE{Qk<")y!P{ȾU\RTq@ӃK7qKm`Q~ GDhi''F\b\- 9G:KS’>Ɉ+Zֽ7pٺ 74+fWo~DF9]f`Q3GܪrRYQk4ס \c[8Qj|yrJUO ݸ9n|z [IVrQd~\s [;74gzЧ$3iKf1lջe_%V zb{亏=jW)7kvЭ*+=DS4 k9yKBI` oົf7Av3+LOX셛4]kq K Ԡ7U腛tA(-| PhdU˽1ZicRG5zIOFn %J}WDľmF޷왊"XHjC.>Л,T'ψ9bBOГouf5>*C_RWN-#d ,)Yg|6i8=Bu^D}[̝gd7?IJ>Zu]^uy`OpWl ƋϗJ|gPC|EDk x1rujC}|ۭ1t[KT^cp/јشc`aDOII"菵b[S5ZbJ4#9voП \kY+Ջ0rGDbQ|YD!|nÁ^Bj.9:luk'1;(tɌTak{EIe9Z(_Tg@%buj񅞝R^cXDOZe)[_^cHTӛ G<vslW6^ 722f@}$.%{rw)e |^NC.7MX#W/-'tR{*Lb߹;tN41e}tvB׻04e^?AFï zٖy@OA3rزh2?[%6*vD0"4m w=S $t k2J3ȷG*aV7,6d >7pP(X;&tUUE 8qJn1aJ9E4wUo_ O9$|=I7dlUr`nT~odE x}U0 rw_Ԡti}<0VȺ2.3s2XThHI'f#L t^Lʥfa%d>!lQZid0QçiSUl i \szLV9>ȌO>biYA7ru`D` /~yk}SK Cg+D\^k"*Sl7,6`QYe)ߠnr*A_,;iq ș6WYZt f} X?9qB텛7\5Lg s#87hgtрfzgWr]gvxZn{ktUwV`t=. N=ƚ rӲqe]p㠎gs3)lзoZNd%ȳD͇&KDrnn4sLx~75·,;B5P΄zw_VzU @O#V+^Yvaq{6*4A팇>ϟ !ViB./}ґ{qӦ16\$[9ʳ-> W2VAC*OF>݉J^W6q9Nb;m^bЂ[yza8K|33: =?QOT|%끼LYz4ͭ(MH36K9L[:5:(^Cm:I%4h_ :2.r Βe)йdn 9L`I 5D@.Wn݌~:zÙLYxuA Ex\ׄ[yvűQf; }[iPq|ј<y4[Ѐ%]{U4T䫚כxʷ +-n#ʸ{tw`o7'|D1tXi4iv 71s X-ӸOJlooe>%azC)Co6!Q{嶢lfovY\3|L!Q燭iϞWb%JBF' 24R~yfo4D'ϧ)瞜`\6yAwhI@'Vj5(W{@f҅\^XWѰoUEC'9#7p]-ٳ+Fe_#q%z9 "Iƕpkk.' \:ϣYPa8owG }&\uEr~'w^DXU`NӿkB9ļOGi?4s+ĞtIoq 4#~?fOe'VʉJ/[I4UXbб?"GQ{>Cޢ7^^sCmy~ of u/OgfnZC T/J |"yF%_ӈ6^xI_4O Zjsdj4TF47>ca(nJj%+2́[U.XG^v,O'K@%4dkB\T2o L`wf0pAFq>6ur"OطqֹyN @yXS`GN?ONzpV cS/ыr,9 ,Y )fyc@ct qĠǐ>8Es0ͤ"~P"_nP> [&6_%OL:CZkEN~<7 3^ RMa"i60cVgOwtlQpH%JbII@e;~Z =b/e] 48]+s:k0"j4$Տj0-˯mآK {< fRt%on'xW/ ye8؜A+~ sȩГ8ƨ`|>TM]20Zk< kz4:-F\ސ!'[M ]8Ճb9fb2>Si1sǐ]{`g77K-nP׫ \y}%e:3x־޾Nwde> 773#Fp6A`FN%鍑eLYRG8k9"UY _?tiK& P9?q|[e5C*e9\,.t ؽm^.Kfl펇ƽc i >xeYWV[-zfulFVZ5ު8#:r%5Sg=.Mカ't2Ǯߤ5dCtB 9$֬=km6-"o䮻Ы@Gn%cfYm؜M%~2OyQ85&(>UOGMW0Err6^)>+$٩ w(o?K/뤴6~.׈W +qJq7p{ϛ]`ઇF?~3ăl9kș޸u,ba`W-gY7TU@^R`Bjf")ڣ%7E7p2 !qEyn/a"٨ڜ*ZݿkL( 6j<̲'[ y]@Su][i|%Jl&BoUrA~lkMo(8,\&^ |󵊵P }>FTZ>ނJGt16nu/.t@Ϲ . kEcK9Wl |BK*[M,J7nJ{{OBWRONJt ^RM%mjv3vӉ}1 l Џ5vu#wvN}M{f1CiqNډcblWR{!Lv~-kGz}x`pe]s7h`kv= >႗%ky˱W@wVJ=K?Kp%^Y=O}##ߥFT'VO}^?g.[.>ٙCL0hI;k=%衟KY{qBwG7CvKtsOkTlcg1>ێ<Cj~|F L͋dx@%C Q${J"fޮ :m.R<#>Օeq̀Z_aF6sa/)puUه@qbwfܒс3A1Jt'Q!M%#WmU}UN3ww |(=w҇fa\&|Q g41| N"US^ /e7wi9`_Bq4S#,[z˄],.t"`LTLppY" "'yqIq߄U{Ơ5/WHo& L߸mP^ҫm07p*[nVbhB[p]Z⭟%YIlzڻכ&YrkR.>6|%j6N+F{ommskUG֡9t~#o:l={CyrhTS,ۑB/H?Y2:rB<"ЂsKs0fdwFB^]6D*Enob~0#G'r y_"ctw0t'[;[KTO+2W곊7 FQ7ZFC)|3\nB߄7zW ְm ,q˪Nުk$Ľm V::oxu H:GQ23>FIc{׊ ~ izI) 72O[tnF.Ճ:y:iumiƶ> oKG`K;[+ (;7}^*)C|KD. ߬ >[34@N5u7:NK 4*r29,4n%{/Uq@P,>AHOFQ}:a,v\vItR!*wkRŠy Zkf?LpCp#k(|Oo#~]z /.;\wU`<H֑ruYH* }0 =hYoo.Ck#u(*IȋR<@>V.m067i5I?Qҽ+]){X㶾mtFn-j#\}}<7_g=ԅd: ttfujYQvFC$5fb ݬ9.BӺtwWs5hʋ./p: #b]0]W@Ӧ\cm.@NHCo`ʮnSUrWѕ"2pmޙ̨9HHT4s~]fE^"HZ[Ҹkoh"=x@wʀl\/ 콯'% {˘H?6DLZOb;7ʆ}m,〮[}ڬ@gji1ڝ2"h sA~:>f5rԉZ9YAب2cdvr"/vŠ/v6sW8h'/N\nE1򵌾:tۅ`趹$@'d?OYʊ-ݠWl'.}@sEuQjHĐ ,5") ⋱i{EVf1z0qyAz:yyw;o߯?DΥۉRqm J{Bo Ii-|ˬ:z4˵q5nJpI!^n&k"ϩj"EaDiW,nE^oz˸H/#]mE:+ _\ۋ:tء.bt_أ4=d,Ő}Ѿ~Tn2WUwrˠ.IeCF+t")pAƺ[ m䔫:Бc'KyzC`_!s}|=b(#^֭jm9 ZtҼ*)$ȳp=Ch&^ 6遼ƾ{ tU1v󕔌 mrzECOݧ5^ wߗo:o;VծџEeAo?K\<IBzߊl+l@~?ԠEiK#e?JqU,J ND.erF.k4?/'5?FrݵHse@+r΢ :r1n$w4Yn!&0nWD{RV_;4 hi:&)Z+ܲwwZqR|w71Z˱)VADI~\ u}D^~Bv2to[l)vsz oqȗ6h7z@}c{0Թ^si>s94~ C%V[9r#eWq7zEYoW䷈&οňJN|DHY;3Ģ6p-qF@N Bt"Gӑe>*7 {*qo@.[a wYR< mQ9:zk4Bg TDYLOj׭⚼V͠y]?1tKT;\# 39.WCn-*6Woy8AKrq''9=%|]^t6J9ݟ[e(pjtItKF'tnkR ~ ت-#1~Zj^Tځ<{4+_$NjJ4}8b3g>K,iKƳivhjD0! [Ostvp#iA0Z?l.Vt-oY|t/F~ܜ(@^ﳑ]i;嗤+}芾Kh{pXh2JuNþ箵}KuB=8:k$]|;q/@oAF^yTF-rJ|\Ή~g؋:8O9k?&lI&gk#\g ==ѵX0؄_^N=yQ|ƕc%Ũ@=e2NWQUgƴr!Z`|"oBct:䨠ct 6rY*/# Hmnb5@ttЭ׏9+#Ujis 904yW}K#ftA/)—ADI41zV3qDλr;zBFN^4.Eo\iиJRf]{Ttt"'zC 5w^`Π>9}!;+E޶Ӿ.. xsC*ӿ:ŶzHur:%iŎ0ѭ<]"q4Ɩmbt6xKc4q ARl5}"oi#]]g>K<  ]փ2>bsp^_˗ƻ_#!4ۀ!D~Kaۉ\xq OqF#D ޝ`uT ;%ۦ-m|\ÌrBD{(˺FPКW<҂N]6z M\>@2Fqo]"7\_a47\o{֣3mbC 6a"]Z~AX} :"EjxQo:47 =qڼKWD޴~ax"͕F$'5#L'tFoh|˦ysFd\t#! 4By7Ꚗy2sAoSR9Iwdo 9%Hp=z#ouz&#닒 }^oi]` :uاK^ǀ6:/;|Z= @'t}#i5&n|r"M* Z4U@>zHguԡynݮ~"+YLtHWVGu76oYw=J} mF&Fu@?ʁ<ڧt~^"7{|c_Ů@xiIЙB/K#GZd0KA]90 }';¤j=*tYanztu#S=.Nޢ>F篻it#e&^mkæ5R&k@>#=n6ݫ:)=ؐWg˜a]5b/ɀK]a7ic0rnTœv `GQ7E`Eh֐JfMK-&i.m`}%Ms=ST4:_5s.VO'9 I]^տ]i4]=7Č^ȍ#X?P~w*ʨq 70ˀ_)DWlಈޮ^$.wUΛdq}_ɾ7n(r`:ܮǗ, ]r9ޯ#֠my\TGM[KRG}ËF/z'ti.F/~tex.ܴ  =<|KF[2tK-- ؼU ve[iл]}7^nth*vB} BMiЫ7D3Ώ{/v]iA`cuFt@hIk4it9^m/s/{y9DŽoz@_g7}I IϯT\͠lwL;o0zu7%)܈ډI%5BWGu<˨;m֗+%;Ky6ӕC Y9=#To-wϨW=2H\ < H "؞~#[H 7"Y @n{F 2 xBrWîG[. bQwm8rCC|hRt{# h$0i"3i_C.1fȓ]+'Fu[u%gzר ^Lv(WWE~I /g4_tf }:Goՠ+XhEB/nL\[Gsֲjf=IMmڑFq(va[{4hB|U^Drx{1Bi Vͨ7?R5V_dtˬ`#o]ylдY}/s&xBOjy+AoءSJF'ta@jr+AtbِB[H۱Nu/Hƞ/uMHETꆼ? uM-ɟtI-Io8rޯS]#I l uv9m)V ׫Du.pDi OFTo)U*rԻ`5z C/u٦}Kz]U܂p󀄞d$[^#_7SE+_gNyN9n>)E~Njj65Nӽ\آN>%Fcc7&W)&{У `z$Y =cZt`fͮ| "狍#_6 -6J~r3O=\go=h˼\Fo"Xt4 9Gߥ9[ؑUH=~|-Leol,ˍIQh=)^"3wȍ  |YyF@C~IVv7)ϋt w팺ִB' &c~s`4ܹۑK[[}; :_=h@46كNV:wew7cZtK[v7| fh*r B`LcKz "%igHnkH_}@uOvQE~Unr 2{t9n1 ]Z*Okik|Bzx3T}zjPtH\eα3o#ns\Bv(0/.lLW#淚9aSJw(PݭIr=~sxx q;&EpwV퀞u[rb"o;,Bf;j!,z{ ֫$}dիAw0me֖֑Iн]V6.tBI,unԥkleƾ ?c*@FkM~<}}ݔ& BWj]FȉN ݝwzaHsBV/OZ]Ijhmi1<,QaЭ鈹Jd|n l򈴨]i]z3CF<vzAnq북6P/bŪrؒb137ڲR2E*m@2oS}_FGLs@!H`^{$*`-cG^]R~Nc ,\5ޑEmwhF17h('E,y RIڕv'$"5-o혒"Eߍ\a\U侻g,xwVi ]KruB1Q#veeC^CLJ\;5!eЗ7A/yKl2̛ۣˋ^uz/Rh*`mG-ݻ\5r,ր{Yzn< + FLFхKLE.aFz.Z胼F)\Tڞ-Ou'~j*}s˟EKN%(VЭLW`!7Ch׋|%j/GY *a=-7F,y?|Q|X^*[ݐ4p&r)Фo;GRО[Z,jztg o]ԈylKYL?"_7!iÙ{6<*JZ[fE؁M3 BȕTw*}H]oFנ2C6Uh@?^YƁ9)WIO#ZM:2&`P}dEϸ9S5tK@[u3g"͠P&͸ Az`(֠{9?&uG=7,ܭ?:3tdBgҼb}K:?e0G\ |ՠdfl]C߬d6M k9jdJnL{*y&\J'69⪉qI3ҡ;ر7=u3R.F>]ܫ*2Ѷщ=<2)XrOx|ҽ|oVNT$(ɾԔr g5."q׫.1p;$Q-PVz%ֱu4ąG6}>Y5J2_ v'rM.Jt($pbO'.o3A3SH /\gUi1 ^bd3cFy\L`Bꔔ/v[ ,#T\vO%q_Q?2]!cf=Ox24 ) so j%l.^6#~6eI4-E:tC[䌻QvYOkiM5~>5bW݇7^VtC^۰ד\yܯAs? &.略/ -]~Xdk4i+q#, };,j3͇wcs,ȒF`]rlԫ2~=Cӳ%?)b'7]rYnY3xWK=ysTfY^|{K)6k3B~|~X~z ޤ+LCU=N OĽFʸS3tqZݨ\}{=e/vU-%^=_!alGڴ0icجO@[N0`nx4;1p=2l)|wYE1JJ;~Hi<@^p%R=s,@GAgz:>X=:M$Zt;3> ~  OFmg5XXC(Y#?%7Bznda3퓵r~t=_`>5={|b=jUb7ݬ ڀ.lw+ߐgZ2;-6~؉]+A3GO?I A)Nk3{ sH?:;ŵjFs .e2/|JE54<)ɂd]cfr]_o1165'ZbA?5؄,[Tev*z;xS1_8O\9/j6 ~Lv .tF>m{~Pi',]rkN֜}HAţh; m.e[?%ds_\[tnQnA9Lĵq{Ph>ok b/q`W,A-hnU ڇ;,b2y=mCw?-/pJ ZlWFiRdlAbU32'}'{oDxA3G.Ⱥف=׺g=,F V"96TS ZSĮLp 4zG^nh?"_V%䯵Zd|TGxdfv{4$㌻|ahdvA#y p&Ŏ#?m60v@PSgٳAӽCG{d12ctz_eUX*@ ro)[ySqjځ(ЌNXhG~z_i!Dgx 򌸏;Gb4eӦzʯ#۾=#~bݭd5mY{_P:l@_%}_) kr>ֶ.,47Ox$QkD|Y֑Uy#52]/GcOټD=i r}ֱk%[~#N_ wk% fLC>ATQF!1ͱ]tݽwl/Mvrj zA,|Wֱk:S|k Y#rAgQsa/YS#NG1dQLp{D\&.v Mna { ثOқO؉)_Pkvj|r}>w&vxε"c~7N,/v *asKZ~ϽĀ+#U-KL;k Ao= _>dX;?ְ 򨝑,iޢJ_F{c~:EgPBm-B;.e)} WwW{K+4 ~5m26>П*a~GՁJt=#&wR7>@V-[_AY3ow++Rş7[?/pZrOr5A+zu:># ]}yd Z'i1o 9E읐k5I5tݪi-ruܸ3ė)G[4{ZeA#wSу߾IcLl3}벦h=iG ё?֚R_5'hV#tbo%݊[|KU f%5 gydɐeD3i 5n[_О_@/ K8gډFS#7Ik844˼|sߡy|;B78? |jRΜ WM|vQٛWE^ʚ[ 4ݽ>5xѲL}0򒫖\b-:"ɎH|73,A%\1&-f䑟O;2=^OTmZP=ܫ|}G8N b dq.g[Ote #ڙg /%8ЭOM2] 4;7(ዽF 争3O(낑co",*k5^/^hԂܭI yϧ]t7IdBP}=5JY4bu]CWj|G#3G܌qy |RP"n~Ğw*+.^ێ)%'ݳ -UY!K/ǤX'٩4^mVjMl,u H7><F^/r B_S~$NQ:c1p=}=xGTQ76rog6NؽЎtWGIe@9 g\3jd^ƆkN'7V)#=u%:C|I`s)cݠXnt2V@R`MkECQ/R*;rݏE񮦧\Bgw"gKˎV^t"#攟|f4z:tv[ _ ;_m)AKT.jJ+Klyc#|Eݱ.:N'ba92[xZ; 7)W;u`fLZ4aqp}hiWyk(3Ee"{]M.stz\+HZ=Z P{,Jwޫ#AvWeXdIаY?Q7FAb"k3 "eސAd=mmpq< >hG1VlQޣJѮluݢ{,tJY0t^lh ݍ3]4|6se{^k`g Y/ftHZxב̗4!:) bݨ !dg/4`_ ITeC㒸Zy|sTjir!96XmCn򻽋< :E=ܠq2 6wDEVr^2~b ݡL~,GiD4vpuAK`oXz%ɡ׻Yy+A|ڽȳU -%Ion,^?b 5u{>R:5 y_zA/\w {Ј{yPD<^^7DnП: /4ӆh-U榱j{ u.7Z*#8]RE3hRz n<'Zߠ`󼗶!uCv+H-؇_ ud˥>jL$LTjr άZ6=\Կ}UW#>tiSBEPxO=FA5e=Aڅp̛ȀB-cy^Yu5dT.{ ;%֑}({xzHl-clۍX70h'iȎx٨O!׼\U~K 76ҺǼ/Zch7ɷ܋Brxm|pc>n4}lZrMGZ`^աpB<z)*/'t Y[͵y_o97:iDЁ\׬jY%N jiv_v_C 5ၼeР(/oE".ůrإKeiHV!KC:v/8"{̝}gg #ׅB?)sX[h,TU 1Y#Gqِge6Oᅳ 7stz[j(Kߐ[hGN]Dۮ@E>ԓ'J$EIشې[.fڳ"oAQlI]Q7]x|>頋tI΀ZKZgc5>@^-8:^aR 褺#U4˲"DD7OiOb|uo3]dGC_>ht)Tr\аJ Eo!tȵ o9^F)[S{]w"u)zIB^֥)R>"Β'cd\ht:2r!O[SX?7) ],R+e1O fƖꠜ}Ӆc~1X"L$)Rf34a]aOqOCn_P^ B4zNI=/$գofLtb<-/ky;tEzt";rxm2:TGj6 ]q+cx霙-6t/M*!Ӓ.OH4ӵCKFPM IF"5<`JT^λavT^1d]z"a?zNOȣ(#ձ'AC p]5uuH+˷ޗM><:Mۺjt[m4LqHuF:lGnKjUGj Q.nu/> ە4@.˫:j7hKY$U D$LF|S W:$_Otީȧz 0lIf *rrxw\3ucEnL&SJŠӼڟ&FGʀ3# !g<]aͤZ,ݱ#x GIq@wذE >c kn v~> .Ղ *pÞjjK;YE9'؅S|Orcch=V|XB^%SH&_I;ba$Y`::%^Mwo]a2I>n@f_5On9{ޘ^=OImb3^tyaaYTkAAj _kntp;͗9mm`\ '^Wv[rG^Lݎm9Hv&X5 A|Vdo*Џ?cj6d UZ5BJc[ݼ{ >П`l%MfX&[d&g{NAtF!cP*tUIbc/sr۝)fB!^nkB1\z~CE@?Ȥ(rͲ#qE&<,XXڠ ~37@|q?Dۆm|Ξ(&hvb.jz?R>}D x|95qٗz3tY ;O'Z=JIb/RHE|/!sͩP:cE >YTd6nGviʽMZh-}S ;C_=h.o-4> :ط?wh ?jpTB;'=qfs'ei^}N;z}L^-(7j ^ ,'s8 V{ԼGƗxB_ZWZ8kd $ ^AZXr`Eȗ3irdfKN3m"9=;|_#&dGfwUA]g :y;N&kC23nh)/gH e|'v8dM'ɳ |~*<"30In3k})=A.US~5S\A zb'ز5e/SлUN=zKGg> iRIkqު30 +"mB!z^xC^_GAH3wD 4ѿ#˱}cJ5_O=Y#5T9(|@$Ͼسzi.=߸rC{doqgNl9GL%1'ƝdV pUWoj 9ao}(CN_xBͤ(*K1$="*kfe{?۪kNY A`Ow L!&/E=L%ܓpRU'SV [}oM~?N r\O πO[) .ngEI$,.v*_QK]"߫A'U#anŽ ''[L?Q 8A垛7x5-;ёr?GI,g;4m(O@bDE yDXgMknG2k+OlXԼZ-g Jg̓E>:t7ly-^&=]84 K#˓Dꆜz)WS1Ɔ8x[[ڡ&چ\KM8b+.rɢhK'KߣƆ\@B )z`@<ґ/ j(Ͽ\I/ gKBj{om`rs#um1EVY ?KԺbЭ;7 n#u.馈EfBj: Qt40 N{gL3 }!5+A/м2EU );^/eU~s6-l/y7[tĜS!+eDׇd\ܶ/oQ4/TlI-,[8/֑5!ʖ;Wh;H`#02ҮQ*¤m_4C^Kߡ pKi? >z~#]J.r1a﷗<_#,UPKt$u{ך5@ 67?E>2/L]|2Rb*\60,IaK :cѩF:Mc,Y؟mQŠ!~4C [':(">-]4]ߘyЮ]z.ר %@l -{XMJnՒOG<^?K=)X}|Hw0t.*kݮʈ!B򧗮̃ ^m=#p̻F楳Ϭu@gE^%9Ƒ/21&]r@OۤŚ,zZ\GId;~Yх_pƢ!OAF V3ӶTꆼ/sҡ 9R vͨ z͇]']/reaKձK!?ȷz PIFcҪۑSL0|r{tQ_8!rZߑ׫]y_#CFf8AW#ߣ]$.~"wB/ڭȥю1w] 8_c.M仈ɡB#G.u|Y×%K1A˺Gcݨqܣ9BEqXSlB'+aXkޣ ڙ3 `@3IS\{0:X_Lg('MKFrIwl:9]Fj Ey~qxTBN5"}IّQ^5#_jGn#W(}A_vHi!6vY` jww^bxb-su`ߢ$Mtbkܢ$ 1lKW5Oנ¹~^Br!1yic#yWd[nآLN1uvWKo$ѸUd>mZѐw#X ˍ.~K<Ywv8OW@. Å'wbKu zTo}yY Xxh +_nla#k8!ȗ˨WU蹴P۠:ҖAq|nβ!4 d46U]]wI :U qܠSic8Ӡ_.u  ҎMڥ"{IJ넼D2_v{K*֪'vfLp.#բh 9jzK/~<_ ȹ__Nw ]iO.>65yaH˄~Δ6) .aBnkewȗr0N22Mh_Q:B. tR?[tC"malD-= b4p"[F"lGX̌,:ГBOA#_es];2!_E{ E`0)t{#t7Zw\?oOxAD_7{9@Xv}Co`( 9Gw;t kAa/f/A7pF[1rh<Low0-T}e*4}a^y!o˽"ȫ[EWivo{xLwligKy t6C>wnGvG Y[tVT=l_R7ތ ^#_s!]ONzU|c]:눹gę}=->!Y4=n̵/ȴǜJ\ۏq S,HZn'LFe ӝQeA\e?-%@~Q0y{Pkt}m6 W~!y]뢙t_JbW&vIv/^*( =:Tgn#|c>]S}4~u#] Nky!I^z5Ş )<"ɏݷ]cd״Q`؀6ct[ Ɩ/wBhGܬ2KGhkw|?3[zvθ;?s]xCThIB/Jك^vw' o/e#OҀ]|a75ԯݔD>IIm |uz ,9}6mKMc-'W F]S Axax7рąT0>ɠS5K#P/"]>߆˼vڰ(`i; JlDyb0},[ȻE;ϸ1(D;-Ŧ2[۠?/+}C.ԎtHvȉiB~"R0+v` uqa`G^6}l`3v&#.p:BHHd #}cJߡ:m[ճz.qɀ&3V}Tg;^.+"7H]d;_D6ef[.̸'B{FҵzGgc0ɦE/jd*-u:cEL˚Eǡef c>3ƵC\9оFMё/j{ ~'nL~S3CWe,W&:ِ?]]#Ѻ!qUvl6vEqвBE޳d_ƚـg }fyK G;{]J@~享oJ|:v%}4딇rܰ#vd"-g :&n=Ъ=uM鼍y `Iy'AӅe.b=ea;3+1y`致d"z"`2gWs5}\U:r|h Z>҉:$8s/5$gre C#Xoۧ!CY5г jE."4 ayiHCL_v/ؼzd|rlҞ)ݐSߝ[>֫"fg;smQW]|R5<;\.uϛhm] ERzA{yk˨ }=G53AgBt]J)8iݿ +3q=hI{ҾQcz]uSEރ?VhCu.dSR݅.~.j,a1'֬G_a, Sݰs\HΘJ!6OuW:09z`|\+Mr8k=Y8$f @ڌI-TB%PfшO3;'i=}/rYOЬ7 L{H l)ـ:z.Oi%}t5o{V;?n.㕒DoMjE[n]"G5@CM2Q]D톉}^-"7xkL 6PJ]9 =ю~uD w,-NS;ng FbKl~~yP26׹tA>m\v6RjWqCgFꉾSeȷ k%6%|i#3.9O-m([?NeC+jWb*x ֹBzm">kTt ^nIaOr5-1)v`$YAUiIzTL|uƦknY\+?8Dlj.+ؑ/գcpShC+7G~r`h8l>ohyt}ukzπk͇OO%NI4&'vY8C3x| sK&Jv[rݻ޸bc!7F>g$* gS0jv` &|psH'q?sF|"w9cAwudS3>;i$~?Vw_;v'G!;v3^$nZ^{6:tS09"?Nw>N32&{᫣kȞ{Bc& -;V Wh#ȃ3q5~ߒPGQؔmoI^KA3f.ˮX{BEOe|̫ro, c&4QG1K~k]dߜIKۜ819X. |:{GZVJ~MKgߍ>L)0 fIA7:9Xco> +n:5 ^>tO2||⊋}Du?%Ft)\k?%Ҍy=b U7H w]C#MWۙ6 t Y ߳Zbo1rLw)XJ2FG:z pqaE%o~ DŽg tYs>\\%vPѺcׅ B{[-o).V!om2dWʃnR,f;]ZW[b*#?Fi܍Y#hOVKJ3eqw}~>%k. ;cCwv];5ZLƹDOW 9\K tsXKlt9Vs}}<סqWE^8'OG`gjeb@TfT"e‚F|k}p5R6x^`_//x[~d(rUfHi~&GXʐ}s B0-,p.=;5*.v9W? zqk˝jVc3;i̞agWڔ1#MKiz`XΝak׭/\@#b4qv!c'^-x~ _߯qPֆk5+re@.&y?>3zV| tǣ-v utz1J5),3?&Oz G_9#7Yq,o8 H Dχ5KrP9}{b_[ '|]칐PeatݟqpmRO;8:#M;]'+ĄҙKz-e[C 5l |9 ׋~Q-,O7!,7䩞uِkH:X_Vlyԣb~:dBF%F%DSN~ToEKz4tlg">ƍzϻܝ=/QmUG}lȗc[@Wta;)o{Z3tGTUe"%;kd t$^5ES1Ywj~JW˄sM 7twM!齁-Zh$~ Y7"?ʆ<7QؿQװ=} Em;xٲ;%Ͳ8cz@W\4Ao =?sgE"m,z;AҢ.NQG&h%*"Ce#A z˴ձ!p 4㵕}$knR=*7V KH/Wu3{ܨ+`(7.4\/keW˪Ent4;􇫋vGkhkz8]=[DOS&ސKEv0][i۽=t6$XM ]$ra?NC8c7_96 r$$k {?v@i/t 1wi"ϚTɖt#d'KF_6k$̿kGz/z :K|BQ!}kŰƼF#E:v ]Źu$Y]Q!CLB= 6^\ yh$Q貮&@v׼J Z7~?iֱm-k:G[^{z]J)؊@ʿZ"e;+= \5zҷ(0nTrRp4FSENy3=WU"]F{G-$&7䋖>Of:s=g4#_RBa VTL}lK[Ҡ >{q\j! 4#@!W͒KkIFmuһ~w*\R750f&K/{r]"6ږ6觑M{ԃO cn> RCuCkXzudfzޤ?-B]kЄ:KB E"ktM0>5R!BMSl7[ڣazea 4#.RôCozuu]AfRuo6cvI3]i sFTt).Yà"']G=5:]ȊkODin/9"wIr-C6Bo#aT{ԃ4Lh Scpľo|E xa76  -Lt/Xnں_XLB;r s>bN}7lIsnd\Z٠|.t:rU.2AKEthzRT7v-۰܏ F{kFݐlJ.Ҭ^9.dyG.W՗d;ܠnr ʋ˥et~,ɱ[Ih^k=׋SO}U&L;,*UBnFMij =P׺!Ԫ c%'.vj%u-@ޣۥb/#O^Y7 RGmޗpZܨK 9q|J#S\?zA U;b~.Q9-:C.d\?]:B w ~Co2̜؃NQ82q:#Dj' Mclbrn'I/W~ܿ}^ݳz?%iiàϗy)I40*zӞ]]|Ҍz9k+muCe #]ר$fA/CTO+o'ܨu[is .r込zi w0%z蓑}ą g+a 콝adIJGozц]J(*,+GQ쩮k︊a?K۞. U{cx4}귰'.QƆDp ^yvDE(n5oFZ#QO^tč:,Y"RDyCӉv#F@'h1ylE6R&6=%KRBEz7#[cu9n}M2C^C)A% n؉"{s꽹ɨboY듭}`tuB>]h6Ҩ^:xl5kq+BV_.3G b1|lBI#M5Tn0^mw*re(U˨kyDyGڧeL/SY>󥭲n.g:tWeBK#5Ѯ =NAυFУݡ2G_'y`]s1hi%.m襆ƿS~VmBnQԨqkTžhEw|;V_n^1xϋOmZIҷnF[ی z}ߔjEs_- ͺfcCna83|@3+=6AJ q?Z%n<%&ۥ;zEf\"tܨJ rWEy!#xՠ_fmC2kj1' i0uZ;$GG[rӣ)t`Z2~5DNjZ,tmʀ6Ѣt %R9[jMIs=_V] 7+ReZx9 ``vfb;ov c=9>{[Dޡ_Gz}y(t{3LM= C  x3^FߐSY)m('J$a%$MdΏTߪQ pp+^dت#lqEِ.A#cy[*# LЧilBAVȭd zm\:۱L>z gX"khԎ׃tfHLp~s~s\F3_'cCbW/u#?ݲS[0P;Ӽ}Ii[{TpWq,l؍k\ֱh.#E5hBߣw0Dž==71.ѸvduFcC>֨k0N}EeW.Ϙ\idd =.ŋQ4.c[^ލOat #Gvqȼɛgd H%Ϧ4,t@:Nл=ӝ{[ 3 9j/y!ȫv K;F^zo`<NзZLfkȥZd Z7K:!o/r N]~G_TlyNNX0yvnA3-|/~4BOH}&|S=붨M-UO\x7>a=zz'C7\~}F;M"ȓ<2Tt'xIth^X,J8B&0Cu(=X]JGݕȎ 5Iɶ\x.&) 8ӎTAF'^^b/Я/ܘNJM;2#QόwW iz ӣG'anT{{ꦧ_Uϼ>n*u s-iZ;2K+yulz>gԦ3S,-ԣ'+yѭ 9{˯h:NwloڠVD`hWOQGV4tHiY DU,mW_Г{ =;98klB y}V9V;$`S}]CcjLՙ# ud~@WrFt̻bHzn28 G5pIYi@ *oN-Н:9i~(ltݴ }xYa g۽HFxEgA&%=|K"e ,?=Q'.)V\EHvy 9 )|j^>wL=L ZuoDU}%?J t 984p?7ܥCwB쉼.՗ȉ /?);FBv\|y GBՑ /ޥ!v1=A2LW?* !iu^R\CƁ|u@oS> },QBܕuC[꘡cٲ"m:Fy0}rk,faز ysC5 QzIIEtFtcd/9g+r:AVWw$oF:!34?cڹ&XR F #Yfn6Ը .o +{kG2M71a[z{@S*Ȏm73x+G#!gt"Fnzzo_F~ ;).r_ kȅ܂uu-嫀'r^GN++Tgرn|Bwfq%^oս.XG?kjPip"Oh:l*twwSAeFѐRr@- _a48IӜFOIs!z"_; ͭ7*k2M'u TM)vaKzW8Vv;o{yCeGM|:z4_굸^ wGV.O┼(2qEDN!,7Hst:{kNvBOqVsr+;MڹȽ>Q)8 -â!;+4BI+ԬΒC+G.FTjf/ :_gY*ZWj?ݢ}|oZDv}\P`Uי*z]Ӌ>xt JW]["Ont~%'Z 7J7KG.-;W_M\2@Sx C;ͩ#F Z읨ȹk=w:Vw͟A/Hy4^:M-OXՙN|Xgv.>z }FT5^mSDOwټQLП(Qk ف~fYZv4fuIҴyC~Fyu&ҚSΏ=.xuH.,:/r +FVr5Gר}l5Z"zɢӌjnF֑t%G>>IdG'iT@>֦.KEAHga7q@?Ktf薋G<.Z$ Щ{(^ HiU;/9QUUފ|eP_.quQ]_$:&P/'r*qjc&`4Z֕{A/<gД]꺁[00̬Wt2ځ9!hVO/J0=*rҞkidbcV;cGWC~G4Ο7T0r\.r (39oRK 7Ȳ=* Q)m }Cv=ޗZאdNfmUc1ڝfPGx#(3zF@9qB 459Ո(9_F.rIQ*=~=C1>K@/]]jѭbWi[JA. =t ^ڮA=_gzH~#1r Czd[0&.r'gtAF.yrT5$c=kW躎*55jS]wW^7Jw$: >z轗W*i]^]'8:byD$oT3];^jz]ZeT =Ĩ@α#B> z[mtr9%`)^߇WPV٘bxaO 1\ҩ/Z@7{9kPyLľbeRtuK3֎JL;G 4{ǸhS_]rB/c׍̻|˖ *o~q|}Cz/wK]gvܣr ̸8l J\q% 9l+(k}a&NcmIJ5lUz p)ꩣR5b3䪮v91F;ZNoKk:ECŞMT#ά{^KQ>ȓ#%QSY颷2,Z|4r[\ ]WyQ+}MD` uf'!erq ߷RCmO[BFTvRQ6z@Yӎߴ#B 9adؼF]ԩ!ow;Ki]y EPv" /"FϽQ-й%BhCWF=UGVEo "'iv@߭тMVyq#^ӹ@Ǘ^NM#_j}M.؄"ؙ9/ե_"BuzA;4^[M4l Z.ivvm|@7Kt{o[lrL-ur=:{k$Q7-= W|iP譑#[CMά)^^)8- 7Jb82Vl}>NkWkcy….m 3:*|H{ݻ^ yЪmgz5}dty"vKZpigԸٷ_IV~ 4{IzaLߏ]H_x%?0*rAi,1l酠k논8ZuU7Ƹ)ct[L51n~-ǺLر 8]J]OWRTZ& Y|^/Fg:e,JQS\f=]do [h&lgN&g;\L\H]f8d"/Z7p]2u1*9 )KN/!Rcțb1uþob*! NIi-<6PTC } rFn̘E\QrU zktr7$ uE7rL[f-7P OBwi67G"yG-R;+D?mهȭ9v ^Ҡ7~>;tTl& V,asc^Vt؅RpS ;MZ?ۚ컮V|g2TDFg;=f>ZG FuBt! y?ץܯKi Z2/4h v 붨y>k(#| 3袼.2NzoQu6׭ 7/bMKicoYT-M+u#wQM 9z_J(5D#6}"h0*%3vKӏ|9ޅ:Ih]s_IA[OOԅ zs׵=::v^Z?#^Ov=ˀ66:݅fh߅K԰tu.ѯ7F!vC>0*wȨB&hEK&\0xEEN s=130n Ikؔ@N)]Zȷabk9&|!8f ]W/]/~$5=E.(r \s63N:>˭ׁ=-_Ӗ{&.w>f_}/EQ@ӎca {N.uUԶ֡ӯ9ځ.z ai{Z <9XSK9<i8 jͫG-]Z@! hY.P yIc]puQkG7Թm5AN1NGIcm|.tz Y`!uv6nkv Чu5sz@ߚ ƃN>4.8>&ͩq]}45"ݝdo2OnB3bx!g}E,'t'Nz5#0=N_=/Ir\$q@߬oր>x_4;], lBG.rZn%5~(1VsoyrAƸ|\d'vc YV'igu ҙX Ch8#ya{E z-\1t zn弯Ƭh@oRDueOR$AHo/b䅠?ҕ{=<= o{{ <3xHGU^p)Lz QOh ]@ޗp &3ؗ_'lZ.' 6ςt*t¨<_NʑsUصmio58Sl9_"o{s'r e-&'v^ ߃9܍Eu=.>#m-mVPE bxF`Cف34IF@aYYCyw[,H*t >QX2K 'O_`=oׂM=bDa%Q3J`kd3{ȩO4a) t,)n /EkZ#{ i{]׋J=z9rWIcVL=oDd4īȩ̼.&qv ;zJby{H @.Z9OOc(T]7葺f[48ٮ8 H@E.D:^f-e(49E)#ۜ~ Bt]MSJseYFFblUbkD+4г 3@BؑiDCs0|mU~.@yn,Z@0: ] k!0z8oZ+F_Ӻ r\$]F8_СY<(^7t*%3w_Z6v=}gt48r`\ܭ{|_>ȓ\~"x=S3,eVK3b}vҁ$~CW\}/K?G>"+%A3I=FB~rTۉܟҘYJR>%B4~M'q3er' _'S5#cgeu6#e열[K舮w7J&=mSgz"h]09{/ Z4FKܾI#ѨERlnF'vYz(NBOxpi㺺f-}ӨSYr^mLZW/w$ݨBzNO_h.5\ EdStұя{t7jGvsJ?WTS/;HᆾtT7Kloئ٭>`kFThD)?UFר*@/NYzƉ4}ivDgaM_'nc1~aĘ^v6?Pq y ?6NW/vA]u 3Q~7d/@oѩ_s2XbA^xZKfd*,^"!_WAns? MpmQ-t(O >kd]ȶґIt|~ }jڈ?A[l)j5bMQhwNxIh-.7~(Y@;7 \?c?r}fݗ^M^lOlnrwNDgB/y b7zz={B}R.w]I\K Q ^ P fn#\p;cc`~$Ѝ %{]O|w^kw2YhD}[:nx[۠G/ƎkxV`iV'Γ'v7 [@~ F }e]t^/eŐ;{}]˽; :QZ{=ItuI-[ 4)`} ~?|YH{?- i]GO=;S${b`p h-Սb)d(4$K}VCmj6@O<޴킜[-/]ʚZE>4+˓JPX/kMi ? lT/,;MO3 VB~E/r 4~\3 @&-D+ڡU)a_Nuh.̕\s=4U?9ϟPO} ?[v̬Cݜ7 o4{${:%_vs5H9s4\Ƃ\|Ŏ>$)xW֎5LQ'#'XSv EEɣv&*ufP,<*\G*\ɑ{6d\$~RdcD)NՑ=ltCcub롔 Iq}w٥+"\k l};LOTcز/U5*160Vjh?o K0zogtںh7ћԤok-A\w/&}`/Ė|[gnJZ3.^\~OBm`\Y:8O.dթ-??~ =/g[^A-YҜVpk:Qw7r^6/~ksrXmզVEK <>SVi;M w`lZ6nV B i׵Җh^h>ii'razAguM,zZ]C} ;rD$EѶ;iZ 9˽.T;2q`mj{|9l$(DL3]zTٹW(̥"c =ZV7]~=V^epN7 Kڡ{bj1 M)D>[ױ?ў˗7w9A˶S'TC2lZ1bn.= bGxF.J碃 a'OwxFL.ObB3"}4Z :K=]9,m?ʯ^{=(.|:sI~\{|JЧ鋞5m@w/Vo3i\]@vCEO9c2|zY.xskˮ c[+#+K\~^/JDatu$纫#wrA)i-`kc@BJs]"'/-F.K3̑MxG /i1}`kQSɭz[]R-)o#vې[/$|FF?ZaF L*rBlt^90拄Ro[@t\XZFI qCHqu }#N0|e)ʌޙvƛMuAFMˀVl-fՑRe|B0 =v9x?]VZ3;^7wSȣAasHyęS_-\z62J+Q\ӧ Z|JiV_$ NvA!C45x!ϑul/侹;I;( nкuvo4znW-}~t\G0tDnr+ȓg]JD3@=s@>hu.4ã"'=kнOznzL;Xd e^ȷQgh`15" i|<.O5l=%w7iirk@w1d|+/ϡgMM Uh pOA49k,dcOz/Zv @ ف|^;\go.N)ks_^<<1@S3,3ޱ[m Q9Sf#]T04MLOA'F| GBZ=mN[]J Kr`bC5[ gʎԛс_!q#xɠ)ԥ쪴%b(S;q $!Ѡ:-wENzCq"?5螗T`WGzmyyq_ L|nP~"֡i~Fȳ^fo\if]+yG =wg]J+yq,KGf~qEDb]rcz`_Ox3s3.vibA4N][V_KXr^肔ڥM_t^jГK'k=]]bFN:'\*{(@ɐ:][tĞV䌑]`=X }>D9 Նx:ȳ6" 'T@kh;i|Kz6r"$3D/ :i 3?ENު AyBjGc\ 8Q++=_yFɻ4mGKF#;Vec4k-7=EYϾ{ktkA7mOm 4-ύyJ̴7B,TMX۾~NHwR&Qu@Or~CߔCs$}I˛2qq n9/ GMf`qf4@Z~0~4F *Uag K\Ҷ}j=YSSYD6uS5ke& :$B涶yf]hMG&'g+[[NBym/JФI#_,/nZ^wF5OomQT;^q!κ4zi4: @{ -?׾G.W-:!aעjưȇoT~-]uY 7t/]IݹХMI.K:uvp<9cEfK+{ /;aZ#o=v=x>69"FD=L`G# !S- *CNk_QBV vYdOٓJȓ ')*﨏3/Z.xG)|LͥpBKV:6#*6]oB*pЬ9Ce[`r9])DE|l {CW.WKZsKjM,w\R""'_q&_>.9Jp`hGW;>.*y>?Rwk|1 "(%;+a ]a -'لNO̱W' s(O_uuCv-]<7>6Z:dSYiݱ\N13*?mGtfBasDϷ(+Ѱ7^_Wu^\S#udg5~5}Ce+mQcTMzrGNݬHbtӡ_7͐/FnZAv 04pb;m.,P H;g16j &irvJ^M~Լ 1řuC Bu5-SC&Nkv"߽t"Cn~xIo%L\?'}diJ:95Ŭ󄞛#CDF+s1E>9G8s:=}=P|(.WI'cq C^dF+2z^r1톾/aoK7t]뫨U /:Vo^Ÿ ,d9I2gk_.qƗ:s5ޑjz}{4B/}\)aAgcÚVnW+bZ{}'8\ya\ץ;/W?F{k߀hGo>7лF$4绹= 07@Z͐ݙ~Luȏ)X Z3Sn;؅ikr]$x ZAq !qy! -.Y~lb#崹9ǻ ھHLR#<٠FsW~TNHQmt44An>6˺?9[ .rsŗNvtUoR2g|}AkSV>B&uz;g9R^7$>>/'/ jh (4/w_};-[90Cbdy:L]5} #οxT/}1=54D 4kWzB.8; ez"KmoGor;XaB^E.|VG~N޻}CX9v|,%/m]IizgFN^Ct뢅"ݭ|XǁG礸c򺑷E!d;|z_iLJ^fhkZ*q/[9I;(z Oؓ{&$FK}n@bZ? C+p.ulzqsTA/қث+!?Gʁf.Gh*[/+fD4;904NwzVO Vul&e43݋7a'@^Ќ.7r љA9U =)twt}J*qX )#eXI ]B.9F4A[@%:C[=]9-t!7mo4,;cL^A#otm`x!-)(i*{ 4oZk;g)M/ jQF|}tE=Kt }r"oV6dw:j;M@jHWOTsa<{ mti5^E*@0 c'Q 1fl-Nw񋣼 (_'tz>R',<{5}:1+?Vk4;ޣ*0,m_ C/g&%X0fMВkS+_ZzrbL4H%G7r+R;R\)%'(r@: zu$/>M~Z =)0jNkz)%/dz }JHF>&@zDJޙoOP 5\cuc DAKp2%+Z,SzQKc16>Kd../-/i!,zž(șv(/:mR# 2Qo*6V:J^E"o;pվɻtlr"yK<@`hnS5qݮLڅpN4SE)zd7a yY?;mgl?ljdoя9#7ԔUd͈~#'r :Ior`7`LJLv@2C h)ZkFO-oRqRVAZ,-O,t:;:D6 C+inozM'Y[b?u@Rqm_ȓۘg#U\ lz7;VO߈VݾBw:t0rZRXHQ[v1FBG^.FA4;s5zj.Dd>K|}|\Y㬨i#MF;d9&%Y,{:2vYz[1@en*-3yǿA2=ɤKl~uxGI}uwg?J=> ]{ܭ5B;9 ~sl ԯpͷAS(4vrݣ o%ea _o)&ށjZg @EzG1jB M{1TBNcSwvQ7ZgDn稣*v&cK؛5CS(E:9 XsaӰґ>[L;M,; )ڐ:V>uUdÏҏ:ΐ-<{ u IEC|F' 4e%h&h_0{ ADx+W,GŨfWE6||\Ykc! * hxq+4z ~ʗ]fVld 6,ZF⮸d[U_iK_yxWda,^/z ͳMm7<߫)} Я<;} wpݾqA\f ֳptoݚ#l$k_tⲜ :Wj=6gϏX bVMY[=򼎝e`JYU|]UH3=)}/jxG[ /k1偝`ɪh*c<6uj]7.%8gȅ'!8m Ir$"U'oAN F+{#7p9G\^3? z]g-ŨBsD|[{Ҡ)hCXp:GI{\s3aKr`א}I785`'ؾ|J{^JiA*٣<T?j<5 ʻO}85X-myx^>JHU U~3Ni֒^"pֈdzW>N6whUx+?(ٰEa|xS{bQҝ.$/kfJ_tWowO-lЉpt[tX@kLgidM'͓ұFz>B Uh bOzͬ4hwo5W5OkexCE⚆e搻(bW}w؇R?.` MͨG-UMyugo?OI<~L`d H#3PfS |-=4dqC(\da$a|hd'~Dn@z$5gW "#ڭD'|]μDȻܖ#c^- Ώte!~V>mNI ~4ע% D }ܵk\QC.TNDK :/)vZqZ}- T#zJG9Q=δ{*s-c+/ɉm:d+6JwkbϹz^y= ݧՏ}518=s8_c>2Ei%_+q@_ff6Bi;KJ7-,-ґzw&9is =9ݕ,oK)yг~~MiP<9O zC<ځoK H311GJ*ϫO_o&ѭFdOJȨL:ayy"ȄM>N%knge;G׮쒂D/H~Ejyr#ty [GկQq~d:^4׏#r"I@uk,^T9xBO&m)\b[4(K/ӛaz]+{NB]WVZ.'r'τcBY.e5Dk!@rLguYzzH:_zK[ u1C9υeg5zJE}!=]@ڨ_KGm^%n96zOro*{[őJvu7򝟳o#%ffb<-[t}Qd䣟ȷ ke3i<9. D:%rMk4]Z"ۺ M7jl08'p@Dfy]v)зi3SDn{1ݥV#:{ȘVڽ X.yh=I^ <ȧ Gx)}^NŌMrBsF;[y[RX/EzzQ#hzMr?5V|U/|~נr;[5".ؚ e{tbH:69uJƞ~Eȟ)fHf]<Ӹή7o Gy i[$[~ F1]!}</!d2ܤF@70k}CEo~\荻,vb⮏n bt~ M;2RZ_lq9R!xEQQJ=o?oU{1+k;OL25Wϼ[oy1K WA.12VMS.Ẅ́9zGP r[3>"/] o:ˏq_r|㣩?#/*v `bߨ/;t|Z'r;RT#:EHQYܩЛ}/2p];Mb薇s'z+#!!*~.~ZNz:]u .r5BW9' \G oIjs(PV#6FM|^L]d.yπ\ϟ`*d t>u@31rF^K?k4n{I>&(k:Ecl@ZY8ց8G+I]B894t9'[ 7d=;Thk3f`d𲨅[2E'tyR E\g(vs3gJoD\k.fom駒aWtG-i\$ЩL^Cib>GZ|@ q6:4tZ ڢ\F.|C_xI[~԰ptܥ؜#z_D BThCO *FNT t `STw9r%ՠ $rb?o_ }F_ˣUfxڼxhԮH z\( WmWFV@^H*^7t-Fȭ.׵!BX[{0xd֖g Zj=bt?{ENb> bT? )t]ѥ|yKՁ=1=JRp|!٠:ѩ q@I7b t`ȷaГFؼ-t|ĥXox!/%R$秊di1".?>) 4mIIm2s^[#v/k^5Zw-.7jfDNQ` JP&](3c2rwC{=Gu72gHb+MHxC J c9eH}a׬IQ=]}KK{~r4 Hl9T_Jddom4sf"!(X:2>eauyzHt vG0Θ. r++r]Š=^;R?u1t+JyRg ݋'t]T)dw!>]bM@ϊhnV0e*iݸ6/)*rDwj7rk'' 8vGF0JM׈-G;$tBf\H=4jt+ܾl^:EitW`qQ k03JcF-)Д㵅g$Ԑ/l.R?ϲJi$ tJ2Ij7he|X M=nWw-A ݉$bhz {η(%vao:HfUP@vHez}ĪyieF>b\?yx>E -~+MI@]SEz^ȏ[,㎭D~wήFW0费ۼ 6dq;zf}g5(m,lXx}-ܥ#˪YvY.pOc3FNTfK]u9@>ny?&n]nK7Ayg$}F4M>#=S֗𲂭k'=[D&2 *ٗ~(;]"dM>+E+{%dŗ2k53bS^jJ?Gv`C z׽RYk[^nO@nL{zØށU)v[#}NAÜaQb/V'謗B<.Ͽ>t[s>.ДH6rCNF&'eOty%% TAKI0MFjktf|I50TtAo4zHLj$4G &q]umR!٘3N?!9L < ;pEJC%ECjr}&tScBTV;ӒSt[7ɤ32Ww1z̚!m =3އN@$ݮ^>zp$rd`F**AL`\nej37GJ}ھAwNՅ]Wh5'I^W+ЫsC.Q TOL;Ћo;B=Y?#L&_ D~α#KZn~1!7@`{F7-r)|RZȉw! 슴 cg_|BL*-.uXձCNDNhT?.1(ꍋh$C.d J0B1.5o"c^WgƜ@uΖLXˢuޱ1}wd@k /?׏c0$ߣk\nFx:K:3utޢKW. /~qE$?h KюlYѓ3uz7f/N#0tӗ8EMWP4ts!\Ww] O{^mwL:# YG7Wk-Q֠+#*9;z˥-dL\o!{vghЯQ%9jAOD_KP"<>cbTmN-L)^tmD%]jBW`ӸV{{;tӈJF׸ܱ%xAHG-a vo'ALj"'gԅ3VOrQ`%^<fu4I>zFc~-;NOt@SGs@׵OJT>D:-&nWcJʉ|iRM{b._V+IeB30#2 Dx-]N6gMx)_xiEalokn_0C/f>I][ 6rtg8/&`]԰//=(> wƾe^ƺc@]fݰQØn$!b/ yaD.r:y c rM>r 0UQ;ecW F{>GТTKDב\NЈ}5}oՆi\NJdl^ @N菚`{_ǰ|Y'uLRq*t?sѺnH%%Ƚ!'tuj_}kG24Ѩ0T~úYUh^,[[#㬥;t^coƈn _%4/}wfv;25\#Ҡ&4z/\3=5cuZ 3)Ku٠Vm鮫趐;r oA `@ qqMX:Uz[&4\ bz F#ahĶ*ch~kUtA'8* T>Vѯc5z^sƉ-@12Vc ^aW=tc^i@w\Xʑ‚&yFOL&5V/wpRkT-NZ%0 t)cɔbj4|a}~D{a#YxܘN%G/)kuu 3F^'k`s*}ig2< 8s4k Bf꯳ҴD:5/-ȷ ELz 8<%IW1%k.6ݖUAS/B_gRԨaHe*QFA zy̰vjwdRRZ`&Șv Kk7?(QB;Gs`EBktzBoG(w~} Ž$u3py;gnke!pY_b\_ybV9ROwI⋷urEcz$țң3 Q;ZZ:rp2O1s:CDBpdBo2R,1oX<Ɓ&9e_DOiQbTC]. |;" `hDLa2g}ȏJtdmce~SŞiKcQ6: 9(·4X޽t&\Wi4\]ӗ,uha r/_3d5z2ia,]Rw0EAf sB~n :z@+.FqqBbO%#̃R-_\-:H2jnW}v:OaOщeSnڑ^WT7^ov82vY/T胜)o7;{Mccxj{t?y9$ @D-w r 7 ABNpiQx:u2?ГCz"$|]h+eܢ -nt$nM+"'ڋ^ { ^%pQFF]Ĩ.U9oWh7purl;f|KChu5 36z_ :9k$_nQ#h'tʥ)aL't !/B|~u$z&Hml J4&o9ZdoKW}L5^NJIje+"ru:@)2:EEe ݫ3>[8z^ENޒGZ ` dлy  `٬xE=;[\.m3&aT=]k]/#ug"Q}CWot7!?F5[F充Jhi30E;EhKy@7^kO-91@.GjԽ*ao{_&+]0Z['i4XK*ti;}(:S#-҉tAwMƁ|@ za' ӰůvF}zŮjn{rkJya75=ir 5NQD?ҵN&] {._AGZ􀾳}=" Z\i֎tDa7_RdWE^=Re"ޗҽѫ-ģG܀y:Awz?%o1 yv\:":,JkIQ/I F;ڕ04z[l@%#m,w{C"oѨi:qG3XR5h&?=Nv[EGVlZ|֐$O|}کzBːRYr5VhѠ]=K֐WiuEo=i@ 5n]!L7Y\,>T# g|EKl^=? ;b AE{ߋ ={E"~߳.juVIQ,kKO6dc/Ĉ5Ij[ozb@Eؼ/H nwbjυb2{Cv t,h"0@_k3H'-.L,pP A3wQէPPF3.SU3%ckUt`2Sȅ/,^ TJ|w5NK|]BΔЅi6Td~ k4Sk].Fՠ1{6+r;HgKr=9Pdog+8KMt Nܲ'};{k-cCq7f*й 1g#5Zx۫N9dZ^brY<*h~ kQjlZt"I%f.V\摒;T^p',eJokn [?TfA7$&dO=mv)4>{*ϷlIcl> g jD Iv4D"{w?my4o\u|oaS09KԯMҠV[KO#&f i.ÿJ\Zf2)X>OBR/a#]k'X\qX%<3#rd| jܕp=87'*YW؉תd -L9num2\']ޠϊT)CHlRk 6EoKUƜ߄ӂ&s&p) =_-53)Ќ&)Ⱥ\ kUHWl^Z 8Wtsh`J_33ͳ~o5dL YF VB;<t-J{NɠA=ZuڈCk`HrfQ[ݞF}40gC}շDSn̬c(W΂Ih|5hZ4bm@?N }&|&L/%1/vMorim|>(vZ+o5'qstϠ=6 >| 35j[;r ~Y|V&K7zj;/v%+5| vs%zҠ$oa鉽*tbГf^#@S̍>Ñ!w%}ױpN 46?M MKc3[bV^׋@t\J3}ŭW&\"nصI`32H6J#IX>!gu@OTu!y%/wRbҕˡ3/iE̞6_Ց{Gex[#֡~/x=X%Go䆠ɞ^|sNaž3!(yW_%VEBXZ3^-a ?SڪZp}U2c?"{cxRH kz6S|,93޴oou.}Eao{TZZՕ9~ža;[׭( yϿ?O;_b=S{ ]F7n|N h U̞Fс\9=<ѧA}\t-r"WN(9RcAEj_qQc{|j2QNqU4Ge>?9K)GGgB{4ڠ{η%i$XZfv/) N+}zem:`Hltp{4]}J cYa`v3g|CgPd6V/}GWm=7Rfw"7FTR`-%@7H|/H^9 $HV>伆{L1 ^KzBߤA.m^#;ASxbt$.gr< 0{J:F`bҠYioiS訮v" t>Ƣgӫ\F*'B?l.I-2VJ[nQP׉9\~}g)M1_(\6,DFouգu1 ͐Y ;]1_,4\#:~ {,[ ..f+,d\6t (H4!hN=i6{EVy tC.qoGRG^e]htdVCvL| z]^eҝeIwmJ7m޴mVwtmsZn/^FWlҋeIB.VS KGOIw7Vh6?0t]׏B.\V㥀O^fҧ٢2R >cȼWĴ1vp(5N:դ0k\W2E :_Đ[NkpGq|S.7;ܥFiTywjm5 /aX^5nU&;_FONqac  z"M"uA2ΏTV`4VEuG^^n_i)qq$\c#J'7Fo^A:uT=Na5khwLQC6vUh/"}zͨU{z=nxqyZZ]'Y^6hIv׃|4\7wu_#zN:@8o1л[`_ޫʀ3rM<LIͬv_f.QJB0*tf;/ckRry2\>dOn_Pum5H76a]&a-U3?eI [6Л=4k]]#vA}9b]@s(;(F IEOK_"a䆴nE ?b)X3qdλO-8ut lQE &d*cOy^*N_AYgmF#XF[Ҥ)50qyG& mt詯W+t\kةWS4y\fI~^isKi\)FFF]:CobR;SRGs =: à9@Cg:€ޑnOi.1 5cc\$F,/&fn_H9eQt˾N,FYt_{ˆP@n7V)t&?FC}z :q/HRETd!^ ER/.йE}1&}c*4. LҡЉWAڰ5sF4v]t_9ΡAu~Iyu4G^u -v0aJRyEkF޸b'7svZ9HЁ[$+K(jȤ@Xzu-yI4u^jҺp (lb: ]w[|NO/)ּ` :U=u]ejrϧZ+;_EWZ[^:,I#Hu7%:KsEڠCI0jgoU/ E ꉞ]33o.ڌ`ҽ9X=kZ>U4\񎐙T8Ko'ΏV'P+/{߂}؃rσI"pq"_5hJ*)V3!C'ݝJ7^cwn=>̖ {K{>Z.xY>>S\#C"jq⤵Lڻy'v 5'qm]OJMT;UMhOboAS{3޵|-(J6gN\%+NÍ?R ['vb`wc ׋!S<>%@v&y/uB3}֙)/ d`Yf; aֻ|ƞ4-ůV|NAmok 嶻̈́Gx}-W'>(2"sGS3r!|[2ECFotsLA6U蜀(OzD]ׅ 蚛33tC?gtQIF '}+؁^"5:AwhC@K .l$.k]ZCv)YǾd"9p5ŕ#Lnڰ1J? c b a9-1dފjrqi͒/uE./#llg؟}Lc eiqu,Ov?OڝjӼK0UIy}VFtg7 ~CkiJk/*vJ95JIvjM2 ޠu9 ZcY歹:Z}<:˖u<U߂vY<o B/6jumn>"}+wp}\ ?%mr]k1-21'A/=N9>`?E@s#.~^67Y0`rщ+طV{3oyF|F~ ~ Ucczn@c-VTQ݂ԎLћ1[HG Ǘk }SGwqB-3f V)6q/6?/AU~G]~iPIfNAN@ByJ|j5!utƗp**TL$s\裝 SG>b$c }J[3h -1:I5^]#6 ą\pQ:mX'S`N6HYihux7t[.ѫ+1^frE7Э{]cSy__OyE >\?#g0r_W4JdLQ.5G]R.o czU ӁFԠݩf{W-GZoޣ=*>FHy#iӈNގ!Fo(JGF5FX"g^RO-* }Z;?jbrOG2RqL]aGCz8:nlt2 ۲y*8W%^t+qBl>{.Ize(:2]}E ՏGfnӤ啽R]N^Bȅ].& }oa߹Z􍼮&@a臔X#A}^΋). ]z`hmi[$2Net %,ݦ }?~ln֙.*4?6oYwi#7tW,whDG!5izx͑.ǀmimesZ@Ml,& yso>a}aс|rݐ;Z|T24w;] 68׍#D%cBKz-˃|[u}Akksuft\_5|yE Cх[+1'AЍ}tځ>= 7Cf}Pcv]:8-kt!=Jeq?keh ;:璷 -tK-wg`:뉜BrWv rHTm$1j=5Ҥ<}>k;k&@+U&w{ˢAoh;X~zK BBICct/txߣnWQ]?Fgj 56 /=[/95ZCjJ+cӣo9j]_Gϥcm$\8ݥ;eľXNȵg4uՠ;X$^ܕpZޜAǁ}D"ө F3t@}ɤ<3A%H_ji{ sҌrz$fĺ1z. :==JU8DK5 hF5;RK:X{' 8πvxK+bϨ԰|󇮮Q GK^/t?]^Q#a qFu{`oZ wZza(@KU ҫ*K;e_NJ|0w# =Wt 8]X"3֏Ô`F댕8>kH:rK*zai5Cusqz>`+] X:CoŽ=ȷ{u7ف4; **t@׫GCZ܀\#]C\O蹥61+jCHbԥB+zk2FOualuJF}wzE5*#Kȩ~>2KSkQjKKAet)ةz^5< 2ߵg$0ްo5:_|^U߽rـJ7<5H 9IfM g6&O]uk)M^ǒyE*؜Z}S;)m'r^`j]r@[SC 5:[AM<ۻo) àM.nn[ dz|h0Mf_Cr8y@G~[ȾtM ݍ/!lpIw׼Ȭ%B 3a>ۥɬ7w:u_&w(r{DFf5@kSʰI$'zCOj9k>n/>ZV_b;M tBtS@c};'M:t?8.6q] с􃼆2@R.ms}$s7ՐcG{:h>^@~H3h\ɐӮN'z Q3A/Fo_|+tΉO5}VS +gliK@*=%"Es(RwGrb)@uq0ꅤӃBoŋ6 G"ltS1cuVȩ; mEH2/3hBksˋ5btjRʼk sZ@G6ӗ@PJL9efE[ I>5&LYyHyL1ED&5DMnz(s܅BL2KcE--m@>b꒷%q޲ RŚ.7\]PK$e4QH+K3A#ɠ 9jt"ߗG*wd[/>+8Bȟ裒F{\ kZv>{=f rW|y=}wқA {_鬄0 U-зj8 <`2}L^)y(QQvOB]tt>qcFu^^]Tb) L2S˵ezcQgT-<)>S:$--ot#r XHw(2Yr i f[]~]h)ak^RGXTܰH C:lA_Enkgvg}~)?Ӽ'Ϩ61ˢطakԺ}"̪#.Ƒd;(]z50N37:J|w*s֧ uɻ.Њ\0mЅWWNeu[HccŞ+?ܽ!UhuN{]QO?oS ƝЌ;uk!}M>jkԾGw@Uߤmw[HhF`T 08qG2 53Lf7xϕ/nПHWx\6@pxz_kԬ25v7_ĵ{b`3-}פ~E~.~|s4%.}N= u,9}8P_Spgyf5еq<k"oRC>}I}Fj^E;x_{3:&h__4>)b]* S?剁8XCmWE?{p "@EGFe~>7X*:1}gO>?WO?AKfHtBw H{o"͢GP6r/v ]yB{Z?!D~5w|P.]n$z<~-oKw{tAvy'~&N[\D/Oސ|Fn)9o{ѩ ׵kJ{'K θ@+nx+} @GJI zӅ} 7cBV4R5Nq> /vJbƀCsvrˢ +r^lmx_sf!ҠONYj1B=o&Ƞ/(aH'{Ni1~穈Ҡ[þP *tc&?XvBf /LQtXMwR`t~2ue-} Ud5kG8dxnN+.ԡš?~\&;d4\΋s1i')͠%ZX(TfTlu$X ^<{WnQXWskbhL_ y>N5ze"OJ4hzA 偭}fgҠE%go5o\ _3Tɶ3tָWz ?Ry {ϒJHZ-Kc(b9; nآojK8d,FhsbߔϪ.szInTѦy!s#n38ylbk8t +OK"Ei"8Lgzn3r>o'kMb'I5|,_#) [kx%䲛}zz$y\}g6d/[ ZiZqed?Bd _XԠo"J"!2x/!~f5}mU/ 8 iZt9A\W}opIkT" 6@>IgWpNG]+n)__F2f1Vlݧ)_W_b'/׫ELj%;t&Ly`zҧ卡PK"'Kn57d v&2xjt g)=ujٛ|cKrЄ ^ͪI]F;xV r bV txPS@i`Q[x'Z}c׵^uɊ?.X#O=$ mx-6hf -uf ~_f2wmЗAз'С-v/Op`1O]b2Q@Y-Y ^ply»(tl_VE7䄒|ĊuH#B kC7FvtW~kx'eHIzM47v2" E;ɛ!Lmp%u ehdÛn)r6LEZ#ПkbT~Ku'ȏhyȀƾ+rYsWbU֡evFv"SYAob!~ H%m[pkA߳ycuЪXtJOZ)ޒ"_= ~ DtAhRNO5"MkR ~GgP~]^b 4'3$&7x//B$OlZb ֠OX$ϹTNBl3UQ7-mj._V'mTnC= :׆5 6﫻J:TRlZyR^[yjFEaYME1C-᳠5hZonALfSN.hy`r/< fm.Fph2-ORxhiO웧f!iztffVTv_bbNԯo|+r5"D} b+(}5C עW'~0Z7LEC3C^}x]G0Ckv=^^L%?Za]js]FqE. T^[s},=fTxfgMIJ_QnhŨz?&:&X~ohOO* 4?tԿʐf*vk~#7,˯A[1i _}ug%8|*@ +O|=W?O%~dMN_(c#|C B\I o6v2X,)f~."z!2*x*Tŝ7x }nps zݫZ }4oZ.9+o|ce $፾Wv"~_-nЍ/g]P?~1^Fuƫ,YGkV>ma .7AߋNOfN?o /5 \``_-O3:mhzL_%~5=~crհ?L 9Uς_nORu~)~<9?xE(Pu#^Vf+)跒~T }]>?e]y֣Kz^ehW}͒6>l3+*ǥHR~m5[VIp Ԗl$I [/;XiuA%|#+l/zSBNh)J]4.ThD42khbnЭUB'@vЧc],])£iꅷCO]RV7r-'t7kWhuy2@/ʁBʬ\BwzzDolS"}]$+FП~eڥ wS$kd@?:2_/[܈)DE)L~g%F ו4jOKrEN3pw-RkɁ\custBeаt'3DF۠Vh,;H)>f#xgp.U厜Sɘ@ y#=dro.haU>S d˷o3iC*6,05>l`*7r]:e@̄4z}>"U :u)ӗ֡}$K .r]-"̣r.]Z^QAT-9yD bao6r n4[xV>&lrTJ1Pę6fW7 ${k$LCOїA~G72pu>yVHWn_ܺз(vF!\`v?g@i%z`u'uTWAj}8#-꒞~tZJo }ImV5]%-iR8V2E!L)Ff:-vr˫8s!x {cUtYF5>S> Ð3.&o GhwIm-bdYHWgdQѥjȅf?O3hi.eW=d$ t[D-ɤ4>ǚ6vLxK!3<fMh2Z !Y1TncL4N5*%UU{G[am[\Bn=f&"u8eRڼ8\Nw+Q;+8fxt|{0f {<5mNmj[y9h@^jNGˬ zlT?ED/#Q>[\j^X}h]]tk|]/]T72$ЧH@nHCt8ꩅ]=9Z9Fr.Huf|g /Bu>pN}dWw#`~  (3[caȞ޼\V(L]v/[~R#'ZSu\R3.nPς4/rWd2|QGr e:z2 \M ,GϾ޲0Kw#51p@NYBh$.MF2Gsc:ՑA.뀼̥g<*z!z7ˈzeFzBԒl5]u̾"{-]3Uz O ]19=-4ESׅ1>rOgah}KulDg5ݡ ~t⺋mGIq* 8 %UU0I"OW1]| 'Y'n ,\KuZtoJig٬-B+FP٭3]7EJ| OH@K_qzkEa}V4ڋo@=Fy$җ„|vmMzii|"] 0ŴKJ{ޕr ]Erι;! ]Qni =7Vcudk}PMڑUuvuPniQN]=|?"m /B'}SZ!g/INr=\GJr[b'xҽ-vT:ZYcea/K 轘rc 1rgr S&f{H]$=)cLSY|t@ϧt]+rNj{{1AE ~*|J;eIڐ##Q;]D :!Ʀ'S?@~KC^][ZjHh{t,"WC~I/Z6pdA]"U=8.k})9󢚋uvdw>$;~yA.߅M:v3:Q^TL_$4vŏy"?IAFȓҚ:5+6w-.eH{j5^؟uiI9'D zR5zrw!uCi@0=v-l0=z F^?%Ld}~t o5J2>gYoҌ"Fglg@Grn3lٗ}5;ϷTrp}oJR"h!9![x4;rn/}xF!1%k7q=gcAkv&'uGˌ%hڍv\e)B{ 3n-Ƚ=S<\MϤRNȳ s%MPxxk">'w Obȟ틾:ѓ~թ6]d`#M+GVKS$;q'ެ::bn) ^|sOyzQSA?ٰ\m6 7M (o\;KlxА31؃%`h? ߯bјVjca;/grZcYCHkOAskNwl[5n}~p+ :M>ϊvr!IR?i)&ӤkջYcccH&TdQP߂iu=OTI>ֵDqO3\z<}@[26nc#l6P_׷}[u]{f.B`}TB<>!;\45=n@Q|AϺUo+՗qs2-_g}j\ #_c]u? odd͌ &-/eqO]Y >TɮƞwɰoK΋if2>9-|d%{dtz|:7$oeI%8yo@󪉑+GԄ¸`[u %VqpF]m_4iLТє4'xr/k/ZVKbcy(Q\4OZm&Q,])~Ty9wsqV쒔Ol(qg֥ՕGn3 ^g KCm߉;|cT^u_kn-%R r`m ݪϟᅫ*jw7Yev"I ;FVs9q<+Q*?"2;cGMs~(bfҀnvF[UvbfOAKDzL_N,ЮQCiK f7,6=q?Qbbug97ʬ$(13E^αR 9!SnN<؟V!ڪ7vIcb^ go^Eeǫ֡g7qOF)C^'3jGէz#c_c! @ ӁbҮC#IMx̶=#&aO2DuO_+ KȞS}zlOrks}bWWkiV=zluVhgzUOS*\ /M;MEc&sЁTx Zyډ}K/M7x+[!C$HVhBO䓳5gd^=)ɞs/^?-RhM}>y-6BΰQʵ@i$6ط5>ըYEdbjrBeWX"~D+|[#,yAS|~~2?7a3hr=֞a_l_ޓ:µ:2Π1^ O\qPyA rfǼS&|saU;Ї%}J֓+j_ >lJ]s'7vr2kBjoB}'_bYZ~6tU /:͐#~؛O-e; gd/uuuj^Tسyޗ'dj+X~7@i8ZO}i;L u ?AfZN8P\kksȯI֋Ok| 0|uwq_+q/v ͖|\iDU CvD=GNJ<əԡ7Q;/4osGJCK%] M *Sp{&,5h{̊7HfWr2ou*&"> N?Kne?3l/W 14Jѐx=[Y6A[4g|  od) d5:s7'#'K`ag]}p'n'<8dG找;rwF=_'i5 m4x9Zn]rm ?kw 1ә3nmhGE=-Q^?QטY>P !ى5;jhUX+oٝ,zfI|MXk}@-'vK~A?b& A'shǯcdoG=k6 6F8Stڇ)7]&\ 97:琋v}/]*55꣄65TN-gL!_m7GOZeb9d[@ce ;`}>Frn)nŻ')Uk= o ;B_b uelx]J/UH IAet`KobMw5<+pS=IAg>ȩ;{^9dz?{cu2ВIVxl% -3}Oǭ"Ä/ o4h<ͳ/!\fnymPZ9~)MRe329AoK_xd#*1wle-|cDrMwصؐƭVGqq`S+(v*|˴USW.|׏'WB5ɺ֠a+j.3jY3jF*~t ;[Foڮ+h9& |6roXǨɠZyt '.oJDa}D)akҊ 1^(񅞼 yUBvDo)kP[*y`Spgc> $+h<<6nzpe"c-pOۓC ;~,V67).͠?oIrUܓ|43CYA,x5h+ZO/e*JN-/>MM /ovb' i4چ"H';K)zV9%F.e"I|22oY녽ȌuM^oN% .C! wd6:зl:,okT„Ů?|zoq/wc贒")V C&v_D'ͼyYzng9],_G_nM\\ymB~ }(MG+/$J~ρLir돳g{['|uy:ِx.WCI{К To̥ywhIg/I tɇ6} J?yUӆs6#,>y'! [S6뿦>,ܬo-*Ï1^\N1&;Oy4dM_u+*T/=B7sLV@ohfO qs!Ќ 'z^b%WjV N!>}է~"*z'kS;tL~{ǮK5G'I4##Kz$9!|2"%[!BS\dYx cE'|uarl=`jvb%?ƢP:q#ހ!ˏk+3.hu@Hr~akyD7`~  4EI~/a/+&e1-{|w>-/@}Y7=y8FЇ@g-6RoW=_GxM+m?WiKZ4nARv; f9DmȠ3cqУ3M-Ѳ|3Ұӳ,ĕc<`;[=E 6 S,O?I nP|d 4uqMaZTCˉkkT:z#ޢYYJVCd}K2wKM;_G/顄=']x;RٞKN{~(Eأ*IɃKV>s2re2C_P/z >wIЍ-:A6~7æh%' `@/3p ~o`jf[2Pe&XrA ~ID^ulъuhqV zz3Ç uNmWvFo<:q̈C/E!c)\7i. {0i1r(C' >f]m[2)3l1*~}eIM!R LYth\˺3UeSN|})BJu2 |Ǟ=~c rq2|M7Ycx,/nk==%lDnd\)7t j؆3z: ֓Mи 謷ovިqӍGi_L /b=YE'ܲKTע6rЙrv`S{=c =`WY/7kˉ=%ykL#܋5 ؇/R@N!;V,MȇI{c[}ShzCfE)r,g7=<*U4H>oG|ϲB|fܤ6聞;Mc"؃%htp57;@onwk>k4 8=9p% ǧ y)5S^蔖*9czr2[?E56u[ W&}Af[H0 txz] y¹._*7;.Hű6-^wL#(in[/8-ՙ>d"xf9']܋{bPV-!4k{g#86亃Ї_233轱bg*4vpv?no;zuif'*l5gcd&䝮9q~41`IC=wm}:9ch{7vR z`oh6*[c_>"%䵈>C{pvOU=^${& @_;7ܮUF.:Hr>.в#/wǞ=iiV}ob}=Uأ =yJyizUзtY[_w;|- /8mPa6dg{) w!Лj!Wn)^= NL^{6޵jK7@ԇ9p-@xI*&GR|?7vqZ$^"%Y=wK 'YnM n_7 zM-KJ'g,r۰,kR`2p|T= tyMZ鍽msPI [j{^!{j^hRyA'r ~jwy2:CZpC%05E% EcDz} DYq5 &1IܰTJe)tsp"H mJ[`#fć+%qn(E nnF>bw$UzC\i0tӸf4 tM>a+VByx=Z{GqMH.Ϫ8oo\efg̗3vM& <Zx7Xu2q2L(A{ApC%bE]Nٗ~RcˬXIv`o# @vsZ]`Y_xk }GH*U\ NѽE 4~Lu$[wSM5hVv`NِB^57,fTatb/ŵF'-)2CJ1_#hx'}a+oQ\ݎCUE& :WloXd"I̯ z~M-߯qd"[ji rK;D+A'`T]}+2|jyA̒"Foe$ ޹+zɨ> e#0.WF>qh>l;" :ASO:e>&k;~QA Xv4{noJ#ڷa~Ȳ5Щ|#@fycb\VK8>ZoJC I:y&S-«‚Ԡ0e-Qwո7=&6qzumlHmJjt{hkpWGf.{6c2:]7doHWUO'(MʧalU*n/whYKF͍]m|ycL$w5=mr@_S'W^p5o>\z3i5sc-s~zT욽0)}75v%jB7ej75y!o'Uv !knw) -mhBf}~ --&okK;RMEggіa,̴[^"lœ)jQ{co94̱S0y@hВ2yCoS@$5YЇ\ut}B_󱙈 tv+="ػj^>8'+i0diZ,8vh = Sg({ia wMf>}/11%Soytp^5/3p2?݋aiժ{+=bL+CD} nD8u9 # \CR~WxGbL o:`a^Dov7/>aTn|?BWz]|q>ÌN#b3za[}co9֙"!Lp/>~Wl$hK0ͧ):|ҕ}A\f{@w;NfWh.ǩS2׏7yO9sbf<;Jz޲bHav\|ao)j=l,ēχ3u {tNh|!(.-QyEҘiW,Ac_vFtR]XZ"Ǯ:J֨WGfy rDT :Etm@'\ߧ^S\(N}+1!K)n͎]ryM:PyzP@t,.Jr:/N}9$AkV%%&V}cWUq 36XȿI򖹱:[vCf'I^7it?Q ]rԫ_} gpD>նBjA>v7ƾG ۵8o.7vͰ@8SHQd>}ۻ5М6Q/ fnXv`속~TtX+2Fo<к~VnPZ.twi<*!gN#ګG 2f!S=ڛvl%亮vQٻvY/!K(33G1#140벎-9Fo7Eh[{\\mg7RL1X`з{?N}ߐCW5K=kUTL_Scyi˨oO!؛;zL54Rjv\(k$o윶Wۇ_]z1r+c/}{In<1j6d|cWS4ZK(zfK>5-B %C\{wwhε/KL'ZW;wLV yzL5d5G0P{pC+ maD4|ao)[CKЯ{_xW@bϘծmپGrG C)z ^EVِЋ-NhY:yvQN>ڐ3d4]q3fcFZ{`꒠&Ro[Gv>5$)ڛ9;j+ *c〮nAS~| pC`,C5m];dܽd69oӽ+0:#w/#` X;ۏ !(U'bt?cwba ufeЍ9إwG#O-=yOh8i.t<۫7j;b'͞e~i)OeW7m_7`$OA+q\5#yTR>|rȾlo-{rD_*tW9sLdV{Uۥ+P˙C7֨foS> kc[<,v7r|U[͋ݮk3 =@wM]1 8kd3R.Z{˥N H+Gx +% #g+eKݻIe4CEXp2'z˚;2D)wc@Z*3 4dqv1ycWQPG~nSs:uȽ NN:D%bn#r69T#5_.3o*spC8 n3R@8h y_Vpɧ-XM%-Kc^= &^go+[_C.4d͕Yu[6HS l4?>2n"S7|G$VOËY4a?~s;6:ߒD]-j-wnMw@ )(dCω⡺Ou ۬!Cp)F_'jF|IB9IhMN6)먿w e`w5۩AgB_|ugZډ~|;ų4wџo>+Q/U} qJz fb"r;IrT|U:QrK|(ZЁc>z8k9rډ~.I_gʩ5_cn:s6\ƫuC6w46k _'_3G(:CoPpjC۠xhMt~w>B_|{U[PZۏ"pY"7,2G _ZBЎ$G]q IwA/A[qF$≽9o dB%{P#e]zA֖聞@6?T^sJ >Uy@=_q|s(ASҭ@a_knq'e+hnw-ضD ^=g~3Ǜ"O]|?+qr)(x¿ qdqUzm9_ϳ3#́z(sA!T-g&jzkn֓Q=ѓxAʁN[={~~Y^?/U-ɸzZTG8KGvdqҚ e1䚄(3d_\RvNg|Ecl4jgԬe٠ *>f]m=RȦ:tf.ݐ{LTn&Z ,t5ysOa. 4Ѕ,)DŽj.kW m'M{\rѽ.5KAp' n!X{m+C6-٬ A6[^R((8*핒 a~8p6tiG򾔵Ҿ>A lv}*X=)DГbgO^&$yg" _nY7 hl^}#P=O|H0r'AϰO/etRS>%]J>qs >v{KFM[}>ab>A!SӉz\6]Z\M~ψk~ ee6B)|'<ץMݺ컚ݩj(qmYu0\/[ /Ѡ ]|snneVDfRh:E#)EfF>H;E0h C/ZS<EZHZd5Ōt18CMFj,gYByiנm͇$Ћc|b'agҡ | "Þ)~ 8rÒ-MW.+ZDOO!5hb𣦲O5l.?>0et'<88{c-J[6 # ^ޱIڏ!u])u@^D_Sbt)^r8 35lf?_~]6t'SAfGxJ2x(O=G :4xWVc^{ƽ>2Фc~sEcLlYTF(mz&>G'yoޫ_9/3J`Iy͸^lGOApAez=!?tԘs~ '7cl벲C)T}Mޟ-wܯVS s&^”("#G%3w.E_퇖LwyY"'r{)ov]BOf%k'x"7e ? Z8y\QqRؒtkivfMU Ķ܎K݋Mߐr=SKtY}oɎ|t,AdX,ϥ=߽o)7ʯo9ۜ.GlYv:#t!Nre~u9lgvȲ -w=79wք Ҩ:Hu<:m um߬y?׏ýp}CZq>B-̦ >$d Noq_I})q3 ~V5CG}"hY?<ѡ,>̨.ч0 }K~}Sh_kr&2r*f %q_>\؇A=,/OɣVe?{ Zַ IV&lZY&YO?Pbvr撔1e'-)،M–eS*C~B+S8|m' 55Hᑣi*)0 [97ЧN56oFូ$XE.YD}q zB;o/I9/o ؛'8+Shcf'vHD .vyif͗g뇗D.|I+ yFHlI'>">mCf?d2t*pwt_hy3vF9f.vbIz߻mupzo^ >+n;xjV9o=1'z͕,UhfV6z'zAn/wOi|suB633a.AzU6.4+'x~)ATuxPhPiM?Ove~zp˯bky\7nmZ.֊y"ϞLۨ򇆖i} 6/Ό{6wt "gYP}|eYğC4oЭ~O% ZFi##􆰧k%{!a?Yy@o~ݚІD'^o$T. :Oti<@WTFEͼI B}ÏS>}@8/xXgA_ \*窲%e@g~+9nkxJ qt|ߧ%q.eMN_(@oob{'-;1#>aFN5ѻgN=%J*wF絩{σmm|@KlȋRALfC#=w) ! tBGĹ'z %0|U=ᷜnj+7[qQWd JƬЇI+tE&¯xlrqX@x;yqrCžcSWW(\_c^ }i<`;KR`3؛3τg~af^Jjǹt` r9vzRq>!w&"Af]hb;՚- :_ȳZ2>u|"_ɜq!D\Y0dЬRo躕ڸz=O[X :"dG5sv`wIy ذػRvo`m]̽/bz*r/>؆~wkCNtYʤm^*cO>i,ic=D}@Ntp/Ro(tA~j h4C+6 7ts2\=yI7rvDŽC#U 3cCClзűuE#-{h讀1carI2XޕG&GXnK7dTc7jV}>ƾ0=64nr Qdx`/mB$FZw3dV ^,}r i^&7xuzvkK۽adݐ^Z~V{cX I;{|Ԏq: %sCψC -1C:/P@gioKg {ǻι}\[zɖ3 & 4zsῥנKͰ4" k> pZFWnݍNgנ`i7vrV"VrJ;4l Z ǤD6HU'u 3rO?C{IRv$smثo 6 {H+|!Ӱ$F-uV95Oef<+廖ȃBw .zl9py` }OSUA(DsZ&k7W|xi{t+V3:+]==o<$;tkTYg1v~c]>2<M m:}sFת/n_%:HuKI ^]C>EE4d&V}ECF"4XnTy"*CCMR){w*c/:ťyuϬ8#Q=Hd zyoUbj?oUF"[t r8 H{[kU{ g׋_ [Io"m A{KKdBU4hV@%}x%6l_jeKj}鰄..YG~1W!lf\A8Ů5\lBo9oG@~[b5^ r#P|eTq_f[?3`An fJЛ3:%Jib~TK Mj< U^]j\_B( oc B> TƁ]{|X;"&,=sjɿ+>!P鯔;%C퍽^hW÷@$Yr<{bW;[vOd6XG,= ThC|Bv6H0%Biب't7hAQ &nhiݲ[V[7ܯ%Ŕm!0!/ױ*t*.yɌP~<#}̟֠79]>J =-kL1hvLɹ^.]ݮ#d E@gɲr]߫ 8C& E*d橋_*0v:ĶԿ pºţt‰燊=q }gd1v{ˤr: CPGNf~HoM6<ϝweG憾UYݑaŷ9З׻; =whH9O]WN͐9t)d,*#Ci>|kq/؊xanTYm>K-kRqF"qVSIsz`7Ve\du {KqBefNQu ػKU,>dٯW!T~.:lv촼ܟq+A#@>}d`z卽e}far;C&*.  =ԁMOr@'V,S^ƾC/gz![(2Pu  y͉):n>nE5TښvR7d!+Yf)ТU }]^[17x>8m&,:,~$.drRӸh"Х7b sCd&Ÿ)%SR3Cn2Л,'h0ԛW֑oGdmeS> f̍}Ϸ y$zOmS-м0-g*XeGs0z,p%~Cbd+.)">C/C}#nd'JiVۻ;,Wځ?SԞ!o[&:9eqC'}%\ێcӵ;S?M{~:߰~&-.2]*yH"Xc.3kvЇfFT6 3u@ >D19&XL=w 7 m5Je!#|\tYL(=SgG)xaT ˦ƾe*A_jnR\bb:%SD \ٗ.܃Qս#ӱ}ᾦbÇcˁcrLFC3 >_`hsD_cXe :}i%ê]gky@;_Ev(zni=gz?F=ُOBGz{CiXBKA~R"um0&a=;.ϊ;y׆^/?Z^71s^a􈙐̟X&Hv6f^EÅ^3Oo:vIRN`)#Z -:.oqtW>v!ɝ-E؃yognK&8#kڢOsKC}IWgTl57.b+ O^9w9%#ź3OWE-sѡ J (Wh;Ll ̏cFGn{H5&`i%Ev޽d7Wt5;W-}A; }D,\][hr;Qj<\<؋/^Tꁽz/"Syc7'A)ÅnvF{0fRDZ GbYثE.9"oe%}nPNr;{>rvjZTέ*۞({,v~a>Rn?9-pW;C֗%.zmMV$@+.W.5욣5Ǒ\G\;+k :mҭs7Aovu&} ˁ}Qϸ'a+fb^ tFҗ'G鑎LnZߪ-/ }w9o[.y]3 }o*֡7!Ӷ%Cjow9Ѷnx:CvL|ZV *|d&V:ٲ~L()xކvk.jxEc쏵{w"|^W[D,v:r6~C'Ɋ큗< _Z\]b_EӍ}ywzl%Z]\w 倮N!3c]y}];bJ$Bs /ז/h'㍽; Z2[ vg\/.cz{Cրxсlz=%.N ]08uc„ qӘt17.άZkF ?ZrCy졺E:c;ӥx]1؜eyr7)IMQB@p۴ M9鸡-rkG/*Wq/h|Ch#9BƜ1?U1>A>dFc5 }|ZAGe?z܌K\*l* t|;r/~Co3@/S}c mtlz;]|{8:;o~-V;G9N}ݛaoJv}m^gr8K4j ^>5,vgj {O#ga:{oFb3dBC gn~F 6C+%jRMR);Q?\>!C$C&.ocs/9渱}x dIvg샏͔7v$rl< }:Bu'NrKS-|:c 5schi}Zcテ2A_c/ײm+jB')gw" ]jmGpL]Лw´ G.aRÅNjO] @vcgo$-WB~Fзx@6~@?#WKJ87jB {̖5JP-3!:lCo҂t7EH7tq F?J;wڪpɛI;Ŷ.}S-zZt62FzV7tt:ASm]/+5oŔy䅜6dƥ+w`Jtم]T,g4MH'oÍ \L]c-BݜKc.c T"o1 3[JTGuy۝X pλ[l-/_ `s2hm0S~!W_?.zGB/[z58{D"'򂾻0jIл0CpBMa,[oꊾƶVQ^IƸnKq3>,`GLg~Ao*Ŷ}G#Urwuɂrr^v3zL{B'^T兼}ۄ t[;^v} K*gxk+BnNZ jlQ*m(ۅ3_?p(s?QOvImC"%%a>w:wh06ˢ2`zTz=eYȧέҀ}PCg/Ĵ{D^ 9v6TALӀzMЗh7rs;wGnݪKi&A~zOTV]F It^Яm͙ 65x\-h 4ޫ/޺$zuMGo W¼\zxCآT/=eG|F}..cE݁?͠'7٨gҠw؉ |tp1v=ƆͰ`3k*–<^{Bj;^ڋ{?nW#F3^ @Z/]5ҐO R= =Pי/R0ը6Fv ?淶8KqI#3u_ktE`$z]7t \sŚ.>d\4%:O#2S]5w~ ,!n4IC@@.H9F :н\#z0^ʢ Gx#7Hg`1YFz+w0F,țk|,W1i5އ½wC7}C'`ſD&-S/su*:qH#t @ei]Jq4ԑFow'y^CH/FM  |"^ADr]f%zۏ zJdX DF\)/=$z] z >mQڽ(~)}./䷴d7Fֻ |1 x:;.Plx=%,1.ew\4/ƈ/|>ȬHqdtG ײ:Ȋ#MW!C"l=`]}K*th!r#0m#]uhA&=~:]q>SdZ̛n Cfo"3Za}yvl z\ǡoy?ѱ5ƈGtyLoize{uGc v%,uHPA_ _ȷgt72R ="3/ ZࢎŒB۪ށ=Qةvr+%#cp/#ly:?s6g/UEWtry^ȻΊN_?⵨h+˥ӭ9Wv߳HnPC>郠Cg|РRzGoc;ݨ ]ZԕO\H[}#j[IBN~:.t~5Xސ7ӌއ^-JϜz+ܼK7As}k5L [bF" GjW 9u}۪ dR+in2_6Z ݛOϱ:m^KFrB3t1jЃa4ݎCoTd}^.ű3rg}my|kZr9ocX]EN9Ь .Zf u,w(nWM,vu\.>mZyDctV|_ŭFU Щf ^/! [[z}92Q¨w uاYBg]Rسado!fb4'hgn3W#i{ ٟ|߼ғӃԥ1(nt0%pm1b &+.AS,#|_]܉\SA7FAE5М8;C"]pk]6pˌ=rei%||B7ݸid;wNR  i9Ip.g"nNwGWSn%Ѭ;\|5ZԤ%reiI!ݜ syO(_A\L^#WdD4^5R]DouW\ `O]ܾYW-@-ف\-C*@`($_4N/tKLy$ i]ttuIϮKsEr4m[$)֐:'h[Ў4kCM +#J=Y w1=wfX tX >X!]fEڐIr#ue;@StwAwm俇;N }A(rgxd]?ߨ bz ^lwQyLv1;O_ɋ49.*s$nLlv}9:+ȝTzߣ#R9 }::&~ \FN{c\P?tg^ En4KGְgte[tT}!;-UxZ]SE-Z) z挱z^&h*3}ECk.AI=RsTvt;|ɗY [FB:'xLu9W}0Hj+X&t!:E֩AOyd@O/}kl'U~;uoet&hk\8.,AQI *J7;-0ʹ[0ߧ7v efF/N. r^ 'pqek|OŊ=l2KtӚZІuy &${ =~-a/;?FgNJBuue*S$i҆--V>eߥdYD}vng؝2B? / (b#D f†TE>e}~]kZyzdKgȁ&M0GڑWxp+m.g<+nyGix ~DQh5xVYx$ث[SG"FԌ5^|%u iɶ}B&Gɲ{&~*u^uɪpV?k~ OudԠ;"'gy]i, Momz;wj^u嗈Zk ~7yRb |Aт#Mz"'Sﭰ?KR*JZ"%N[=>s]ڰǑ1x[@9#N%Jk (^>]-Z*] V 9!kv" ZLnf}?i>%ȃ?_ym`U~~H9ҾWg zϲť$/9Hx|*MXezEB>{[uHv^;N>Ѐ.n.%WwFWfH)7o;ir[lxkЭ`{z?e)lKyB'>[*T])#q{#'߬2J߯{q-j[zܡ"UųAnr"mCf19D(.w,q=]ѳS ztT@t*x^[`Zft*mita:7Tiq5.qZ`l~ kAQ I,71[_G C]zlʹQ܍ݑ?Q*qQG?Avt\"#N[b܅rx7{t9 >}_.E$e+<-9*})PKe]zAX-9/rr<_7]Ӂ/!.uNbʧ:6U{Joð_-En^\t \yתgJ^֑,+M)]]f{ף|uf$z;/r 3ߡ(UEN7V)vP<*Bw^z.A]472rTv:;A؋%xuJJ̈́-~a'6˧X= 7 *:のbpJCrKd-mǻQW#;t N6_lvZ/13\iRHKji /bޖP~0EG[/R)og荵V耾Ǎ"G[pEztQfQ m{jp=.fOwyuFA.O#{c QKQ'Zyր|FY'M7Z; zߘw՜l$1ڝBsvkVtt&[D}s~~5%Zt *e.E"&9&R9n,-E2RF9ҥ8ZYGz oO("ЋR5_y[j !jy$z#t.Nwz&AkjAN)P.p\ #%a֡ }_<ˌ\kdEn3dh5hB|lΑxn[[ur\ktE B-=umփ_Z)ERz\|zu.G B&~F #:cF 'Ѯ:?R5tZ-T߳=dJ:Q+ ]8Ex.j7}t!m^Zdt-5Yׄ.mI1 #}<9yg.[&tU9D]Z1W!x z$?\bл4Q"T Fgdl~sz%԰{NzUfcG[AF؛}_4\y6ف l=\mѥWJ[Ecc{$Q%-(IX\>s+50ځ|,ˡ齃?& 'čtmg¨%ybd)]w[w`Nu\ r_wQQpFnh)`?::fAv[\<'Y@6:S$~,o6{o໗>{ULݸR1ŗkF ZrC?;DNPONѽl2}xQ_ ndf|{ ][А9ZqŬ14"v"߄9GҥEk!wF[tKDet2ݬ%FS9m,r["'7/t!9>-G%2|<Uh,=W/tov"}-C5o^|I]#?r^x;Lc G+aGetjby S]H2~ho%Fm5zv@ߺ"hc:瑺ru/|[#^M7S^z_wvyܡ[{좱b|uU]~!סmiTq8қȷ2tRtusNG2Lmih?=Ņ^ˉvo.@ϙnҼ(تW]o; аP@tuWJّ~{V"w^,:⪝=zvI`|dg_)Hm9Xtwdsˍ:S^S{E^DNb0*t.뀔B/zڜc{vkr[߽ b>u-VBqw=m^CƠ\A$q؇/,gb49g7=:RIy4u4I]=Kwˠ_*e%.P,IbxKl_?Q׷vD7&QE>%cpQ?9vDȞ:S DA7ө떙BO|?Rj;7sd]"PS. hUˍ@0U/.*k.H+%D/eGؾ  XW ok˨lBIquQq)طi.[?SH^K !tHB'Wg.Q?L_7CNV¬na1Uc̺)qnd -NچW^&N%^t-B_dP_RU(DLy$NOO."+:c:j'}pJȓ:ʁ5i_OkfmJ7ZވBz_wۋ-3lk$"Oψ7JSV.kW<=7tI|{m*]uLK593Nk .rV?b l|Y@.HK/|`gYעc켋'~%Y{/{oٖ6?`Q>+€ksr_?Bt.1($p _WwHLcp .v(~s_X5063s(t :z?T'N*3I֫!7zSLq ;OS9 }>sh1KQR!4}oKK yd. 2ÿo`׉V4>Z2¿ )p0'},H\رx^ֺL@ jx7d]C쾩PfV[{ GˇYDVO  x4woq?G왨r?اD?rB&TǏ4B=]Bf71SYO |N6*@4c|SCu| 64;3/WW$Kir9$>];=.tJ_5^(WjFW"Ӗ̲e|;=7p}| 1Fnb2#r4rb=.\q[ sE _sI_ՊsI`Si6yyA]Ky@@+Y>wZemdF]ac7?J\}}ݬ;WI8m'\ÓWw^^KM`TY=})9L*+JFUYp(91ݢ]:,&%mj 0_81tEh{s: ma٪s?W;KR&}UtzD2͐=]cE^E-Iek 9}=ef91DA; r}=S+,y] o|w^0C}NܥC"jE="HS4yg>N)W/К생c|i f - ᄂ>5C: ^};-u*JM.^#?[}x:$-1W"p!}؍cSw"FvhFd*?Ji匎-yM4胾űziK(LǧLUĽW>6澭{Z@ړ*1b\)3C_j.*C*yB'v8{e`ܹoњa_ $pBpƲzz hSɴFt45TX?hH'9kD߲؂3`*Ƞk>Bgkqo)p/*AlR+3=2V|rTyOmo:f|-ojEl 7?ڈlsZi%٩ ]rY-AarXE|U GɅ_kk-aIN?y#2I*QwhI^ D~>K9Z'>ADU_]R$A CWUWv*NM$:4J$UUCn? Oa*ج>\cNS≉÷biÖ'M7vtWOc_=bx=J_[p9JrRmط'/gn~*Tա[VoF .'r^WAqy#UBS .ȠOl O5tYx 9l@f:ޣ?>[K05Y{ZC,;!H[Cs}卝8XzMwGNziSOݴ7vE_ֺu=| 轡Ko`h%и2?W}:;Ж7Y[ghi7b"޿N#@O3^Bľo:A7ӟ5dQ&qR=}~ȕRY}Ӫ~S J_t@y a5 \ ?'SYFA E z 6U=П+r,k^.W쥱j >8%|q֑!CUVKkD촺1FX~HӰ J=o!hq$Xu@[>k1ㄾˌ`zx63*1z ßڗŠR-'qg*Ɠ]dq~,՝h 3x J(r1ʘ>4~@w } V4!:礴^~~sk 7=T pI9}r2׉^3z#OTdF1:_bz"БQEn1˗ s\MOKd]\#y`(rA[,f2WGuNchT@>.Lv@稣gU%%uzQ֎dy,/lEYo $ 95ndI/-[Scߖ;Ϗ4GCFɪ晼D^6S]ȉT=֠9^OH_e1>>S5(#I@W{/ [^Cc\6r=JE[ẁքv"ϑb;}\= jVUdh wnz< KS m$ݠ;=A.k v`\'[Dt4K@iRlim{4]N;0ar t}ݤ-mZВ];(lIKgy&]vF~@w/~dq֫)zjd|t]H>V薴YM$>} /A}tRGFMG^5/&awCU?u?tYk {j4[cg鼽-"wyʻJ>=/VDI%{Asp٧6']"71yu7Bfה)9RDN:X3p ɮ3֘I0diŃ@NWwD^%"BYAхf.1MhU^e5z逡Ӳ zʈ@V:;u QGv >j%Fe)cH'NzH[5cK2Q>N9MuE7rXA>0lx%>gzQJJ5{Fy.\G,e6lTܮRu3A|{hunRס)@n}MuB~' ]K?ۥeը}$z0՘^9/a<:YrZ ])ôӖ!7ӳzcҠѽyh^{z"ڜ$.txK9xal<7vi䁾u7dat efA0)v@XIYA2i[BNNԐaFyit^S A\|רG5:tAhl]ElAU"o7 %PO<%Ⱥ3.vvt_TGՌ|!Ox6":Au:Ct+Yp {n<ȷb.5 ./7¨+ !3C| it[u3b"'kx.e]TPO D4ꂖ "Iwn74%%.. ltRa֑Q'r_{zv\ Zwr=I{_'Q]WJ /8߁ He@cu?BwG<us5sx0}K+umNYG^c ͊t#X[^ȍ`||1JAnΌ-WGa?Er H9r.Λix^ 9-PgK%kþ=yWS:P>@>빶_)b5+OoUq3ER!͐M>q"-A>Jg~p 7.\Q]_{aN2y zZD/u -f9lN5E2#LGE@sn1wQF4ex/Z8, e:u5EK?xBg\g{cdBێ.'蛮k,0yb }u/Q.v 7~TwF6#h #g5%{wu)^ڎ=Wt{^k>auƆ" 4]ްA>KDw!d=W| )Z>k|}:ʔZJmל4W]bglk?pú@Skų2*@Wl7;4O(#>no'Yy*ą_ WY.H39S }sH {Y\&h)eor5>t[M-{OILt@[%t_IǍ1d>(ti@' @N5v^#g6V{;/y6wʙt?ڡ@q^u0tA]Z'XE:I.=e} +Sθ8^5/6՛{ft좔'e ,u#!Hν^)k022ځ]Fw@^c5e,Aq̓uhΎS~gųNBnrgN\õ9Z-rtgw%r@BK;2t]ZVݸ]]]]y$N1`5S Bͯx+I"G\Nt<ù+>4Nϵ:kcqߡQ@nInUVUȷ`]KI] Q>cg^)Y [WQ\ꁜl\ztN{l Zeu\YVOD }5EWw7Sޮ4k7t_1ݰ,W`MJˍwTkhB+x.|p_ rlr|o.Wd4F&0pXQ׏k<t gtvC+ ݑArp"rJyagQ3 /.Qd9GE.$f' $HZSduE3#KՌlwUVW⎪TvxmFzNsL}:hFr댎mQK.OV l'tc#.#hW8>/)m, Lإ=}[-R]ؼ%z oѿ6b?{"aAD'r.ڀF^?6qH{52h%biD]gc]|*Y=zKSu ֋>N:d?'1"V4LqǾ?-] W23@N]{ 蕐y:Tr#R;t:{"u4u~$嘱Qu=F< RA~CMMy}΋"uw^QW:JA.qBf1h9Gـ0ܨZkuЙ.Mkн tVGV_t^d\y[zA/1Dz Ȟ^3gUzU$CSs[ :X[ 9/ЎNNoQžxtR {sk&R#q~B}]"[>Β5 dur R.ahͫ3+F)vER@nbľ:CE?6Y?ȓ[\hW;/y>FRK 9ܐNEOK͐'tuyAő{Aat)%"ck,RI[5FFP-mD޽0]݋` k6Y=ȉnKzbEڧe },j1AM-")HB[;R@"ߊՎ})=]э}3["ag/{hȵQWڮbz]nQ.Gg7h"]ϩуHƆ4wN^ &y#cgn-uy:tmD/Wu.T:Ɨ PQ_,~m%Ԃ{ANI!hQ  45F伈312WhVɝx]gBtV>9r_nQӹcGHSе^ɗaT䳎]1"$\_{ƸNLr@fP\X H oktE,^fz\Mf=#o@GFo9& U9wnxI9Kyc"Z?5R!/1rFoP q/yʤ2#ő2FRhk16ݴv<9ܭкT:֯ l!2-nm{aA?G"Lr[3yG~3VOS0|T:{-#?tf#h6Lёtsr[!{˄t N?# MNw4Wr .A/ x1c?{` uqCM2QsP骄=g s1r]HrRPzC ;펉Z#~ !9~ o77"jSczMݿVy/N(`л/wQzk"NFWRuPw"txIKn3ܘ[!iV{yiLc*tg^>+;%n\:xiuBf|eBR̃ݷ0MJ9y$à AΡ$c HzvP(^%RrƖXuji@or$'dUF4&KC3I/=xJ쑢u"MWyQC/9}!>OGnZԬ7p //k[z~=j}֩*ReS慜([kЊ+h4JpqA$-l)K'0٢g5=#.h!c i=nV|YT>F0:%\mȩfs/%F`K2F; ]j.v={uOv+Mqؼ= dI؎IuF֣T^u;.2z Qq>$gwAڣv| H.}͸b˃E/Ԍ%_5a" D?7C A'@I~kt`˒2߈-Ryehr.v@ƮW K(\/QZ} ~x s-3);M7Ed ܐb4d̻j!l2KM{y?;q?lON)mNqF|oLqZޡ'TmUAdOlx[Z?']] dZu )g!5Z krXD ._-k%_ zEeb~ +ד=n Y'&&5J=Ϯ1v]jw^S zA$3{|3χB[37ga\)<&-_N  1mS_ϚÐɇH%ܖNROݚž;h| 6ͼfW}I0 r$f.SbBfM/_# :ǗJ2.Z-7z B׊< Yov {Cͫ%wfd㍾IH9uW51rb KSg\#Nooktgyw(E<50 Y?^ۮk Muk{n1 hw~=!_%uK`@j04YMSpfW.4/ԗW-\僝wk؉ޢ .g4ZM*݌_GW= u!ا5 _d̔_2wqisCkDo)^/RA.nx_z֑;5?]%LSa V%]>F yywè#nz o 9;DJwrp||lNɕ{7]1: .= W]XMwkm x>Noz=vqz,z Lh.nD>k\ +q }@tT\Z-Z-R yv 3,Ŵ]nb"om"ByZ2kY:jSMnK`c4 #tmAu}KR3䊎E^YUUuF/~Lmh36_i. O= yuh|wkS+y]Iq?5Q)lW*#-yi|*H^ cl1;oo). |:z=^C]Hz5^B{:vĥrT;8+#$2/ MfVFCJЕ4 `vBO)BH}9YiV^En%B`~%[a5b=h]=p9l`#c|ӁV kC`|OƧsW]$:T%"c"[J]jQةḅmVv 9Q)8sv ]BgUCtxf'n>` qMݗ8(F>P hi͞у9ҡgu}&1=Nӓh膺yuj}l[&d;tg]-#C狚MG6]f|"02ȩ.(WehaGH̀n{A]h-iI}6ЎNL〾Z!@uΈ~>JģCK[![]H>CЬ0J{(^Ƶ9qBP{yЬ3z#.?2rpt>]4EOGy08jzpmkOE- wSET?eW$ QaWŽLSP.ezna"=ңA,@"r CJɬƮu׎2;EtQD}(A?FqUk0¸o݋.Z胜CptAnWEgB.d.yEC}+ZcBB]&EF*hMhE݃\]ûLh.\"邟Ee?zO.?-(]}2n^$_D"t)Z2 Eo*-^Բ0.Ph\Be!{9Rk ]u)}D@x.hb,Yyּ|BJkJӇwomڢq oQЭ0z4_N[;l +.OsqNK}agxEiq\`[ KG@OjwlT+WY-]pՁ_"r/_=7J_ssnVgXĦTb8r"wB FHEun/*/r|FmlaѦkW7~?z~W]V%6zF)1/w/٨3znq_EZk֠ź/{76;u2BBUBmHn(6nuH#Α=w-ȧlQgKzm.2Wzl_0C󌛍y^3BSG]Jtv>)Y=3.ӻܗl4<]*kxG]U (ni"#:i*~?8hyQ/ʀM#Tj{$ti'*p<ꂽ iٺ!-\fN%⹸"r%Jޮ6Kg ;ʲh-|__Q˞E"zNGOrrεH#c=}Q'rh2,?6%zEJak? -'.KVu=z}5$ȋ7$ݠ0RWxv7;clw@_A0c:sڽ)/מ6z5^lr|e;ұh$V:Lp'DWԧJ:Nk$C^3FgjG=ZOw*Ø%rX''0'VM՘~nUhlr}a ,'1kTZ] QJ/cCw-_YЊF𶮦msW;M. MĴHwy"_&ϭ^rnu]搰6#l}l V/%u| K-1/ؠE|K]cl2E zt/b"y07A^>F/qfgFvW{5pڱ\.Pn/"t1?u]6}{ANeQ8OB:1RDl46f)Er 5}H[;j3yi| 1 54GfuGJ/F[|;(zy#-A t]a=Aثj9#} >͛684Qq/ȓ\or"%[ S7SǝszǮ;Gy"mv`KfݩS>e_ k}V4[/m~Y/ty ~x[v䰸j! <9 Z@N[ [K=⽊@;:Q]v)<;a\1cPQH8Lvz蔑>f&^73]LBM[estf:Y_*,TF?8za3TONt*k~YXcxLO菼.q%9Fz܏Rh6ԻdH1 *@K$hWnz w t~9V0ʿ:|)B5=Kf끾L+޶GT?r.ue//1]M޳ )b5ϋLo4BPxCihxK@[ɋ~sŮНYVt y}nsg;c /\i2 ЍgYQ0_Bh\u݃\BB #?uwQs_O|!hk>kq~p r [~t(:r|bh19-K,;2t+Pj2W 5ILb"jmeT1Ȝ@ٚknD,;N躚F 9w_!UiN8\ID =;.SՈ,$a\^ֹCk2;;MÛ= WNȵ~kfaW:ؽ[Gzȉz؜A*.Oi_y|9#y~iîAٝl5]YE6^8{@w9H3pN} c:iQ0<;G]6]#US^/7G0ʛ]ڥdͺ1.wnΉ֠9;&_쏠5.F"ޑh_:F6gBs} t;=!^x;>_7d9}4V EZGޤ"/-V*-!/zۀ6ffG5^\Veh 7>-j3۽ // 7m|ihởw5bjizu| _'C3lІmm5{c\k/ke is ?9}k <3>)5R 3tš][604?K=/-W~pŞm`^"wU}Bc|="gMZ w-օ=AY@+8@EsI)}sԥr huqR;AZ 9!4TQs8Dl hY9 i\)TpC™ Z+eP^#pґ#덐 Tk|%4d!i5}Sqbee;OxŮYt׵S}T=c$ Y%%# vӓN*!\k/7W$ q%3B\w/0CM[W"_ bkѼtڴ×) ~|hB3:կK$52ߑWA>~g1FNVf*\oY?a)3 D5=f y/ ./]+.f >e>I6]}?/Խ8 SP^ 8kQ=ɣB; QX%#{]ouWQ֠K[0`Oέ=jK|Wo(bP\8k$4A&!ئWW> b#v(j *^F_ Jl_&gr̤P vn3 @͓ ZԊKjJux^TC׮5P/frsaZ=,/_k0?^gݳzj\,;&Q)%t:>k .GV =/}td -j~ -% ,Y؟Υ#ψ _ɲϑ?|K{RH1:+rYSA¬yIB7U# ^ "bq\1-g z$y;Q::Xo;/9$GWj?9s6Tǩ'mvh:OL"PE˧̃}@y6# 8-f96UϱbDׯi} 뗑 [j){{?D\q}ku" ̽C/{~9kR}Z-䍦DI: ][zR5TMGm<0we 3c?_G^.E'8}{LG!%S孽dOg FBž4ekb{~tpl@N7v[I%@o{h)=b)o]59SҽT<`l_w^sF?'kk5@o'jЪRp!z /B|cd,u`JxBuuBRڔ/>9oqfn+1¢y,wP_S2"b|2s~Ty=\#ɸy9.3AnfwD(tMB|@K>*-N:̐6urcy6 679sjAtW<3 vies b|z]wC;K;K+A% I7~RpxHd Xbq݌컗&)7mL MҼuSbDuQ=>e!_Z!5>8'#~@m)1tgֈ}pT^&0S/LT/dhO_c/1!&퍻9_♛LSR{=8\Žrq tҲ 5,m܁,AY+I: "Z?RڢuF|!lZz \L^zsft5=U5{aZ0[ϋ@9O g˝ܡڪA>6n rk+F*2t*]\ȇSU2=T^$DH:t觻l JJx {&]zKN^R^>=<|"SWB:)} 0?<&/f~Bj1 scu[l AoFK;^Ԡg/@nԧ##t%ti\Z9K"olQ3yY}uj>{,qlטH^c8>} )Տ{^:7 ީQ#4r8‹"S3tU{;^b `\/Z$ɡR]NsLwԤ}'xuN)n<\#DC޻OR og7Ԝ!4ܡ]e)WۮnV˄ F^)n,O A9{wCY=wyrj'pCGt駻Ht"eW+N4.]T~ 1tZ뺳\\?FϫBMNHbK^,^(\W ŖwCZRj 0Ty{t,}ʊȳ =!6YsED\U]ף-#ViTBjDgxDNtbnNQ`](U;r-]sAG5/(z\v7W583Q!_hdQ 䙣-jڜz`|v@oݏDhhjtuQ?/k 6/9Ek `AdO"r-ؼLEzB]]pwzeނiF'y[j];kDqu_"׸$Ԧy}F2^\:)ͺ$>) =b#Nj3 |,НV;?JK2 `;7aoĤ:]B=boWI lw' ~O _@?OBO~+1A7%,ߨ?7"Jm\˓^c~3n ( .  1h/{t5kk2zIƚcӷ:g$c2ϐ/x*Ax_-AFP?9A/xZ$6*0{#WP7v_zẀ8g}չݪ ^>('P>5Mn!oUfZsa?<~7'{ʲPwANdZS*cH/`A3j-!Of)4_eq+,Uos|Jx&U=뾸ش_r@߂y :B<5{c]}l~b\rE%e$56[q ^jp{b L5+dQLk6#)/lu9E.,Ec-lqNTOw>t9'z_p߃+OJy-ŹC*З,6 SQTrݧqV[4~BnHZbQksȏ*e L/,q|!Et7|DU`goQkup-勝44#贆|r56- \S }.@N-;Ro]& bekJQ{&:csiFBw7a䣸Awᕒ#Z/A ޤOy+ YiA:5hBع|?W"̅/aUb'6[]_yA!F"fL6qsj^oVkYΩ=H &}d33DЉ0j5zAX^㡓㡹=z(A4ŊMGJ_uj#=݃Y0J-LVۋ0IkWQ~Oa$ɍ7vq.D2ˋm!e`Ď .%UUɲ+k$LvV@==њ$?ZQ$.Txwe h:&b4jrzSγJ2/ _E&r5-ءhT,RizLAT["_ZbކY_]U 64~TX% g^5<4C|Hc ~ p~&8uJ$b4j^RAnHxVյ~;\i:QW^7voS=@j(otF 2퍳yA3H3#ee_)hb9ǻ*vh7r->'yi_@g3yo#Uf88 [Vus(ș{-]y4_\^/༥[CЋd@^Ct^*>ia||-*teE?)vj&B30&jsa(SHLzhݡQE{ "= `|"I3 x%dn[f(9Rҳ뷄ቼx~ܣ“7l tszabYJ?ScBz:G)]F}+#-mUMRqUNAS[AqFsz}S=#)#0tbnхOi\+rƧÔ5 *V"[$7!E@2?ץ=./,b<ǨV IrJFw_BUZ BӮ>[KwKZ遨#KLH.Dv- hL+AoV]k\L 5kŞcd# }<ÆmzdW*TӮ%$8G Э]}ahm6̻F;ыa+~ oqoa@GnRݒzuVf0;k$zYv>Sa_#})7iwY.nSD9'tCX/*'o=K: }ޘRʍ`UwGpR90.lyݬ @oˁPQb w0j͎6bis*W^eB%g|6&{<\NtN[myK U)FqۉznF֕Thw|"*B59˲tnI8v^#wӥGEЍ5x-򺙀=OD>\_^i;1h靖9rAK4j7~ex<%J*81H;uDV}DHuYG=/էWAҹ遜g }:6e} ;D 9cDu2#ċ+ɪ|SG#$Ac b'QPxqN٧8#-xUZWH~g`KI3 @beN.1wRGde)c)ѩ  X^j*#.rؑ9n"c.3tly{LyMz,fsP2밇brG떵oOgwEM"*gSE+YRFoɨ5I/MۦRXE^keԥvB3;µy[uy߄]dz4:~:/5tn9rD~`V4$H .2h~Խm|Dtjй̕*:tVLA) yA2tz]<^eZWtY8:\?} =%0y&G-b_[0\C.5u z>oL d?O6P?YIb7r.Ӂ<儽m/xCwFHu=}y ֥ѻju뾤ԝ^:R%#ҏytGڅJvZ}VyXaDXy5]iaQ/.yG]uv"ǤR>55d"׏γ oųRE޳<Mm XitF(2 ZRGľЙ@1"`oFsLݒyR'=Q>=4o `B^ })npK~ EQ6x/Q/y}/^BQoJ79cuD.U쏔9ݬ;5u_BZFha:6IJ@3/3褱|بoȋFt@K@5E`.ˁ>!Ht$Zr-͹፞ i^yRbqbO :ebЕ }pޒ^4y] h\^ErU>:/ƼK%uj=IfFXqLHu]O侚҄}XxuarC>-9Fn↜VHOwܩs/N[X@?F-h1}uswA.k2.C ư.l_LcdTH蔇]1N3ܨC@.qNr'SG{JZ^~Qt@_|E[Eȡu/TRTT؅iW[n|t <ƈl2A4d..ti& " } "/rq86jiW; NerzFqD>*oBЄMzoҠI6rLANӉs::0说[9%h،E~[|"&U:Sy3Um^k#ut^-rRt* 5R]GWguwZ=ۺ [Fy=XFS)󋜣].,yLG#,ÆȫɁ|D\U>͋%.ջ tvܿ(sm) W\*4^G z_Wa'YHEI)䁋|ʹ"H %q^!}1!^_,)}tNmtoЋij|_{ҡc:^7Π/y'W`5:*( ;O?伋CQBHjHt`wC/JJ)ս!/6$0-Ёʉ\[#4-|q] }iۺ6k^~1[=:c4__PS |#ypUOcը5 Տ%FFwd˹72IdHK^-v}ѨEkȻ=mvb7{E=$ kjc1_eH2/`;6CoW:I`TBvK?eLz6;g/;ڡI#Tf& O](H#wdN.T;6["S9ydeFr^6[^Ы(B .*r)33^Ǡ14Q? &'tz-p#rLJrz} Ӊٗ]NFA/Nш;{ixut~t5rD]c+dOiQD˩ЄKlMC: Af&cF{%z@u:er"\F֠/t[KR˜.F}~_2&Tr$ԡ_ /\|#{dL`OXOciлFsAnTE<=F܀~1 "T1@Ye * ;Г UhZ:lղ@ *D><<u_@w|{~Colv;XVqis7.Q=>ڽ Qv4ΦDewЛk.qФ㊜IMǾ':/ty5x˺kur[m~-z 97w2in1ҡS9nx$_;^xJ9z7C|gRLw4{K%"H %Ѱ)vrZXqqTs{Jݐ^)xU z F_ k=qINpH/Dj4DWz.B}C\|evx4::9kFzғ=ahȎ79qNa+I[;8.1h:Hb^+$*JvBe rJOjоr^Li˃Gq4S _ >c|ԣmu;=_EwWrrhZO~֍z撬, '{ `1Rd]O!eԥ3{$:dN` uz^ġ=Ghѩ_[湺HJfx=@W$zaKbeՙrJNS0 tq=.s-\j@&yYHJݑ4"[{=2:A1\hΘ ! tNt^ҡakrC?_k_{q¹uRe)A a-sRz0MG2$^:Pk$cmLt6{ yDSN1"[0вl9O":Ғs;Aw'kPҐXSA ڡe!omwѤ1bq*?}Urt]Z 5t]W_!'-) rSM,%SGKuj:W zfD'}QZANZF5z[|")N$@H"ϓo4=0yO]{8Z ?@)u ~CbLUW}덜HO4v1O-E/*ظȹ<ɨҐ;A΋OG#D}_;WŤL$mu:0}Ӿ hy<>g[QJxZE6^`FB!;:Z!՗lGv~ =%<v y0jg59drr-F- &am=PݼH&>BⅯ:ݥȷ"kEG 3siŊT-TN}i0wXF+םlG^@NA/k[9k홹04}qE>"uqve~` 0]z,=3B'9{2_Rs r HKtwv>]"C)4'-3<;2'hM_7G*`P_?ȳ: }ə6Ot2<ޟ{)+uDbK/S&#IEa>{.J g (2c>[,2P=mD2l9fTdu*<ѧ`<wj|`lv[/yU6ZrB[=?jBll!&WxYdjޗU =R#Tͤ0@2@L騁_~菫|9 6@o r~āf`K鍶/%qN%(us}ɛ%$:2Tـ_3y^9 |}Id _)Q5<+Y[/]&-HZU0tv@œf&hRO0?jO=(n L`υ}ƋVG^%RӊLg$mNj#B5j^ְд=Ro`6.<%d.f= p}9 RD>%vSBe32p[vs-@'s ^aڷ%zYsAnVK zczKRe KMKptǾ3z@ZͱV޵uBU")GGOSҍ޾N1.-9xXiknM΃BJzza!.ЧyE3 V=p:yK"˼@ N/[7j c>%Ř9%TԜ3C jֿ{ Hr@gE'07ftY:GU40v~4!DYE[88B%w0ŦD3+xGyr]ѫ7Ѯ/W.(F/}Z+tBV2K5)f^bOuo\wM|E>^z@ok r9} rVFvRcG҇k|ۺDs|NL>513+;Gμ\oU;Q#Ņ#?1nOmܨlIWV]9]LТﭵc fz lHHWjrDL5 Zvώ@N /WA}=:^B y9,W'3dWw 7{OcoS>[-ROe,.a[ WS0z+ziUۯݗxj|9EIjݞv{>]Bf.Gkd1GRc5Vėr=iRv}v`̏B6?ȇ[K LK t GI `F7+ms5Rh. cҽVfbܥĚF}~t@w{-`ޒ]w m\t׈)(]xO%:ՠT@߂E @oqGݨ:(؟(-n)8k>" }Hb橝lpv0`\s1An 9c_0[vqِ=}Jߎλ,ݹP 6F˭R#ٍ.c'aqϞ>^eBN2/9S!wRNK tDD_͓8 ̄@Dyncl̼ooMlmjiݦFf?kн ON5ZGvWU0V5\MÿR&"{$]!~V/qTFvIŞ'at#.J7~IbJo5tt.g*?^BS\P#ek}) \ ^m)[fj 5o->5Eڥ*ͨ"_3V胝msG~=~W`f5>0v5Z}qVϚ߬)mT,z/vB|T)P\Ҧ|֊`mB]bSZ.VY؅Jir>s/ЗF?r߳I| :pM/av|Z}=x),AV*Mo]l.7BӂڿlgWYmC})d)L5x4&GکoZ;UXO)wFLis7$𼮟S7=;(м)szbhKNB?4Jѥl\JjexbJֵvU}LW3F3{.C_VxM*͔oLB}r݂]-=4eC"H pQl;kF:ix]aZ57ffHCn%YǕOn| {K{ЧX$eJ'.]{}uƸ9JeLsxf`2 ;AkFr.VS0 H_Oec/S3C+j|Sh,7t2~t3Vu*3btitp?ֵe)xE>ԣ}-%ۭ߹c% /*z+iRws8է!z_KA^cxJC+p?s\ˡVX4ؑ|>Ѽ9 M\Kw CA=?S82n?' tJ1#sEgb;.5]WvV vyv n)!G.z Mgh4s<ȩ|v;rń<9&R-'<$syAV"OH˰H3\4MA=VskuR;ET@+2ud=j}ޭG|W%G z|N~g\7NQZY}B`x-sQ`ZANx= |cȕNG!]be74c%ٕҔ-C]~ մ7L|tA&]ܢɡМQLK+2r&9s89t|At]xvAȃV v:=pr_ze[+.dP;P:alG1]l_WO 4k,/m*''tYU~V ^7 ZD.79`XfthFz*5j)}Z]|]̣zIkl4z{ ݫ}Z*g TN:J !D\w!h =)yY+ȉ9CsvOꁾ/ZFmMcz/t]z69yOt Z^i?Z6zFuv#M5l^zҳ~*ݼ[54:Euk kɽ"7GGz|q2kPxS00@?M.~f偮QOZ,. Fh'a^7ttq@ВisДDENr/`Mi/y{g9oV щ|kp?ﭝк}yF;t'[$/#3oy$q14=ON#C;ėHs3mnJuvulKZX8Y W*3>{F Ob9gҵ,i*tB%CZ!70jO>|ɒ9 /)P e^@RI ]R`ΡV+rR[3"Ӻ"CZyVkA4h4M9g 6~/qRD^.]U$xBLfG KhB_3(j0M%rPd;%r#'v'Jkmqݝ:)7^ҭʁ|`U!{^!}[=GG@mXdAʆ 7K;8R݈T5{' ii>k.|BkIMu襝ys&kZ|Rw^ *J`ZSbߚFĆ<&ʮXAؕ1"SX.P|.n8.P==_]\G]}a n\AcM[Fݟ礦 nb7U#SąJћkk_0A?A=r.k̋<UKw^woQ % }KpC=8oJυۉ\3BWB]آum葿+z[cT[FPyD\4C+I6 5e_<П{f~@﫵= 6@u{oUj4]G z@O-#xy^_'1A[4-;[.ȝI qL1'X QH‹u@t@OY)}6ZL0:oթ0þkۙ.E`4v߇G[Gt3[4B@oZzi{EyO?u\+~:Le@^\k+Ly\br~32e|bF](ix% -LSpb݊kP+AOD/rhF:"7~i$ c)E 21.@Š# /Nvic*f vqkijd__ݴrTϴ/XE>Qstn!w%ohQߒ#89eT)r[ꅡ;?Ez9; t)Zg6*P(rp"7B裒Nu]Bus^L'U}~]])W+͡Ez?]S&JI0k\{6_y 9t\_/r*S70y[DԪCTځ|GfКY]xNJ}#߂ڲ5/G ؼQnrZsJŭ&L:Qlm>T\z"v6hh@^ QDV`kٖW9{9-6 /M@=,jن~#/..FNWV'F#N[}nJCFŴМs=mߐ4h朮ײNSw;qEHveurv I;^]4Άmu:s hx .F~.-FH@+0̮/r8otitk,cS :GL源}KC;45wDUGFpŹ-C =뱯`kq}"djxI`^kj|o!Q!{:DmNwU&Ϋ(-RJA#bw$<>6]}&w}\EdwhB]m@ y@\>w1~sݚv;V9#.pi't xo)gG:]ܱ$EL:Q|"8W?͆0}?ǍrUW^ӆnqJ8rD>xGYŐ1:GwxM$A-h| ' t*i%b"1|IƠ-"QW幰q!pnR?% 31oIo0J },GL졜j [7"I3͘SBqq =_ҩI@}s2ܻ0o[6omhv`ϕ3xT iW]yz;W)4=D/+'w}Ro+A{.:osA=_=r68/Sg}{>vЉGN#[4glkƠbSH|M 5o5{ 2?jp5%37x ->Zk}[L=xnC7Tc}edzC;<'9Lr@4SZ3MO=rA`Y7fkG1%'׬+skHӲ*d[ÇRt{jU0$Xja| Mzo".tig!slIwꯆAd2)~de /)cz@)W>59^dT{~9(5#sA\ËRu/Т\/zul^㫀yi'ݭAK\vz䓔.ص~?ggĕ#Ҍ߀c(u]?pU=>M'\Z2rLarR6Jo"$^з,M:#*q^5x#A~j2^籗2v"gIkvZ6{|APj*>w}w93⓪~V6F{<`/@]CI2 ~8Hs:b-6O6|iU|>a2 g}Q}N{4w&J剉E5"c7HjmЗ=)W%z>[6%ꔾ>Yfzz>G]H&7nX'r@Š'f/t[Vv+ldKD/IW2z6Q]1{~RVY3-T+6H/ őS@qa}$qAX@/My oFn*U VwyQyj^yN:bBwj7IAvj=" tM{UމEiP!$Qk}gaaȗƈFv*-P ]LajD{ڈܕ0cbfOrwz!&t* zg}kNzGD._92n[67|Fз}6 ?}-hM7*k#D=|eTqWl0z!Q#}mJNau}`/Ik8{d=#G.@!Q<u@I4:j7pyD D#Iν|K;gA.cWELIcGq$˖׃\հz=HeքHUVH'@ΑS,/V3 \x@cE6h93)7E. n,B{EݡY JfAn^BE=dw!VxB)i=+{ENb.]L+2hXo‹ I`˜ʫ54)݆DH c c]1@tTꭗظ.G)w_4O y~{U~(iKR{4=n+qqTF't]`7c9cShy4b2r\=1zuU9[X}~Ѝ/rt|ROw`ZFqN֤*r`aEd)7*_GOv1t 0jO`Pkz:i鴒Q,I-ktY/]R\jҕ˱%^*ˁ#QE$͒wizi*t%[D-b5~s-Sm3z Yu)Hw<5VNyl`@ϼH=jCh2ӡs/kQ$r$ӑBgK\AN*k]:R&=.sؐ @΄Kv˒󶊌J WhG2I ,E. }/` HZ?5ߨ8?.b2{ЩKnԨ z@zB%/$|v/_\S\+tB^Z7q^?5Z#c3Zz[ n3쾡"+63HeFM.J{#RiZy#$5ӔM_=EāNB'z`/kաI/T%iǷr"`E [[ cew: qۻF͑.5j@z3mwq]oe{u;ۺ}+Cg 1[BSNzTi|y#σ/zvϫj+Y<"rB\=~9tH@9u e'8Tn[}/70Qx o詴-uy0@+eH\uTY; K>1 'ӡ{Ñ((tnDGWצ6zc_`Dnnkp-Ȟ.-]!9^ FR}*! p8qD6/\\/}eduGI]_ ) ̿ۨho{F*)|x}덼XQgs ]@ ]z Xˎ}?#I|[\@tI[?^79 V.6Ӏ^@Nsn G!Z~)2:QްD"r(-:qn.2 7/0t,"qb9I\Q\ɩءemt[h/tʢ^JԿU=г ) 7r Oz<Ҧ"n(;FXz[~LQ#d5s0t#`SYm }5Rhs:{F|35q n*p>!ع{9éd=).E/R>@c{I^k379.`Ӂ kǃdtOk #0[9=]C:Cˍj..B*@^-cvQ H[fiUdMWE/؏h[V!F:-zX}^ĵzzʤ;y%}lQ:[b}?B,zoMvdєK Z8ۉuѪzB_dSuTr yQ5f:ힴŤ_мF.y救 1Rvm-v<‹bsQ~=N@}l|G< %F qr|Vή}P')@872QH=rz.ry(c4G*n >FT1hܽC)}#Ww kAh=Qk^ EIe1桔g{ջ.dډ=.k#Iz}Y43bFxuJ3{i 36΋Am]m?R%ilE5T4J=m#KT`趌ȳu:qҐJ b.m>鄾Hr)C2{2tNxz`հVN*PuhzS?ۀo8zRn/&h^=ÅoFR8p4 ^:6Fh[݃3}K+R- a^YQ.[IW3K̡.i\ -_}/js6~yFJJ|]8r=+X[GSRʻ`_1d.Y+r%ٴx[\yetRadi^cF/,$A",W?hcA~i!K}/k]/IQTTܼ6ez5t-V׈k^Tr/%<#uqcPi{?.\S.f ] ׇ.mwF-q_nD5tG8*"7鉜RpGS^"0N%2_ wlNvv:#}YBc%ivܓt .2NՕڐt×OoV-2N䙼Bsk9esr`Dnؐ^`_Mj&^0Ey@ENe]M]Z-^T}뤉!S陳5:<=SyӺ]tk2]cCj?ǯ/3t䌑cu\gpGwQ!=sGY*s1#\rhy@8]uYzd{Ѱ #%h1٧aT9Յ&0bH]"jG 7j9o'r(KK"#-qCF}`tgj5IFۑ1u vH}ʣF74=]i߽Qc@@1Wɞу|#a`꾞Q27h y w~έȉv1m:&:x!(FꎧHZk_)j_dnFb>E@z^}g . . ]OmFO04j'Gc&IKy-[.<з8a ^O/rytkK*qZ]I8P8b@JkZTU.G.cI.68 t^磊AKEvg bV[ AI#&;[P5 EHK?trs"^!!_5?OΛOz =U-_!Fvt_iղryMif\Nw;%!)s/"yK"'p4 G{r]cyRM-nmFF.=~ *6 d])F kޞ>L7F NL>V֮.|BK^Q$tի2BMz%%RKioޝ>dRWr9.@F̛q6W#QWgG2 0ꚩCw^ p"\ tW?6߲ctuGVu/12g[::MW=kdoh~ҁܗ{A\ZidFf2_&#.rt x>fQёrwuIs/t[-0!Zz%SRwPqE;s<~N{6L_K8ĄD^Gy~ #.W`x8M Z띲^=ͨ>BY{؁Gpt4GyҎ_bFѦ-G9K:k!5NI@^=v .rͼms+5)BTɳ0j.>'Ӽ6s`I_EAoS{/рn8ګ/BHȼE#ZBCW/`rBr ;)r|SEK/pWyʹ6zOtk-:mn*r=)޸>;;vK}:rE%n )j(сQdT2 ,HwI|Kr;;3J P ~(]+E"۝ A{zϧӧX*Sa9oB`oIҲK::;W%{ro Fe$ZmeV=)R:ŗYՎ0em n=yr0Of>PR(}׸UW yAOY'a_ڻ~3x٣ב+czJӐ[zse֖M8ysޡV~%6 =7Xw[j(3ЛT"KGAԥ ]6@RFl`- :5tZzŃܕGcp$Gz64Oq5R;SN3 r \xP@3B 3E-ꉼt8;-3&#ҴwdbG~Yue8s;F*Nzjx=mBub9LZ?\F[QB9C$]Bg+G]-jpx{*\4\ќ ͮaxJ0 {?]>4H\\FZ7-&nnu7-$Y }e7|?L[ ;:mޖis)ׄׯ u[\cutj|@zY)y%9ВzĮx@O^*4E]j-ge.MKt&. }ŊMoz"w(܅3|G},/-c-<(tLA_goq@7ӭ62ƣC+//lUzGZȵUխ }z\BltJ6QԜ%xtV0P}N-]beuT^ }tE`S#᱄lWԠiT$ڕ^@ˣɮoT$_iݧwj?o+RDitGe[{Ir @r 1PWGW0ڳ @ABrXMxw(tw8e>% {\.л#]1:GcFž&]n`WA.L4{]+@OIa%[%>Nd=z0 ve͎AI@ o+r-˾ i2g}(`R7xv끼FSV]T[$;WR?6Π 6Y[n|klgAvu՝_ezjYAgQjAosIx\K)5U]5X] 4BFxJMZ;z]j԰:lTOCc aR::J598;r$s3=5z{ k=e󏕡#I+d++o`ȕ^/m$gz@o~@FR9Rt#O+PP4GνHOs RƪLڷ -y e@/35$jG% j9Q~޸U%}z(ztVn9r|c^Xk mZHfaihK5\p9N%9xsfT/t7֠ # @I3 cʷ=4;u'Thst^Rc}Փg y`^і|z$V:FȧxnK*JGԭnq 'Nh.,dY)x%Q{f5=:rҳx-7VtS$>SM-Nc\CU=%tFWj?k,ЍQ*vIoSt=F~G[threid|r˃c:Z u:KT4AKt_6;_mReV?%L[$1GRn}> MK/rj:aȢ/_bEct F]^q޲c-c$L ѪЌ_6e [mOයEkۺKͺ KŨe]9( yv6L:s 񉼭VϵDk^*或LK4z(nm|'=4&_?bY*Sb`"Ar5/p-r[ iк$مhs]\O\c^4K>ڳy $v%-zbF$}(t@pkN[ *K^O7rґ'FNZont螑Y=`=QK@͎*fv tJw^_If5|Ԍw"-6.h-Bm-U !b?5'PEE.Ixst\#GgiqgDq ,d4zRc/Zn+Y/ #%4}A/}I9dh~x_OM@*1nzr[Q3c͉|^Cc.T(>RG:_kJN@f\.=Cxh> 6Wև/?bEJ]D \)`zSVOI._"at0|ʷTko)g=͂!])t\)-樣Gtg4GzM΃|ӝ ҽxAC}yEȀ{(o\4ohUpp;ӈ˝1bhF.ɹAal79[/huKφ_KP5:Gt\KH{QW{Z]FϞQFH%$GGRVC:uԇ%U5QS#(;.O3i_MDzJgWKyLAޢ—thWh.&~qGF󮑙׃ܖJ7IL@_H]\|!L_EHeі,I X+Cj 4K z~7:9})Ucp3 r0ؓ9;xcvuݰ-gڤ/U{Ӷz_FGةj \ơs)=GRE޺^k6{5Gˀ`4Dw.k>RR t^?ut^NW~92?]>JsGh:n](atl[.1CF+ݥ}hK#Gxa&F>G6Q*| :o\FcaJv cTu&=NQ쫯}0> 3sikwe,=v@YXDTآ#[{bU S~S }ܐu5D&vsm犱` zi{ Ci@WiN#̼z] {f.8VJp 9rozf1^ lw^n\]tBہ|zcCNsﳩe4:tl] }Yf@O 9["jSCU=˥'.tBE".whݗcQn`|%ptVKtrt~"vDnr}0rɇmz gLX2ރ賘+Us]I7ҡn\c&^퀮al@[]6hb%{]|䎗t/./8r ޅ3ENHұw9]g!$(A'rᅐ=]!,3"Cq7:k5ZݠeCzVzU1{V4XuڠFD%#ucII2r=ickwi hQЫF#=tW`W0BOGwQ8 ٺ#YcUBz&bϾ+ivB:r҇)|O_nU\}@w]ZR҃V[( i ]`wiۺ\A3O.ְ^sҡU${]E i ҳ=N5 qbڼˉ\W>5]h(F#S]FFɁ/3jFޖ80cs^r/<<E~"^HrggE 8>JW<TV m\oջ/4勉>Fऩ rH*ذ.]5F>0t\$k1m/A+G ˴F y>]BԘ.M5.!FH=)Jr \11,k3,ǩcT#mDEN0\Bf*'%\OwBn0tɷ( TJ8'Z/bz]ESE~%5\ G}N^EVI5;:Fc#h 5xה0P79b{:v`w;5V|+rK9ػR}>YG͐$e|ϼA5|sS;GE0=uZˎ,kϜϪhw7q?^2k7 Ad& aﱠQ{AV N_ ,EθÍsݵKuo\|To:q ́}4zGcaŎ&i5n ˤCyo>@z=4aƭ" Y 76跉2Mea4wp+*Ҿ('>/OߝwJ:r lgoi$azc Eܯ&ؒ157",/옆wV|w4/X6 ZݕyGqqp4K+)Z|;2=is#=zx F_6)L%$YoQdZVWFnMJ:M /5WhVkԔ%|q-e W' ItN? W{22 ,zbOr 6')|]D'x~q`0Y}<8zd轭rStX w9ion.r^m[̢An;unຍ''ʐ?Fb R eœqZ%=pUHC[uJ:5KV]n2I-X]i*60twϓ{ ,G]c\&{ edcR3=:n\uv0!%{ϧQ>Y|4F/1wh|E1/uNe zJMcwuk]ž"OfJ ҠǛDߣphA4i~2qx M>{c?7Ь'ڞ6Av IGj`e ˊB{[蕍:`KTF΂r "o+ }&,Ƚ)p9Cqfmu%exv,ŮAOZyU~j/.UC?b'3`3|/i4֟<.mLf>^cc q\5$Cw_µ|OL}>i ?'9*3?H>'+^L=|^ _Is/>V.;oHm}maT+:;޳ٰOi=_ץdky mrȟ9; Fm|5<|r'O%pOÇۨyukJN~ \)wBPYBC.qY3h}8@!w'j/Jֈy}w[\׸tJFx}D>_)DW͚&m+N#3b,)ͥ{q>-B|Ġ"֞[%D jc}ڠO:R^>q}--A>9ѷ ~doAⓋfdn7lFGQjM-Cਰ~kbC-^5X5ANlf\y]0yIM8B$]ˏV] huU,{nM l)co> 2xe׈nZ ~/Ι?C{N=kD_ȃ.kw.׷ZZ)V 9l?]ngh{ba.o% ajڀVߩk` _>2cc3& JtiFi_$c/?kHoYȀk`hꕫ"7UNc$:H eYf%wʹ}920vb*tЬZf<}/@O+eNXl&L1>4xD mwj]dUe9Y!I-b_Zwl,(zRM<'Rz[⁦kx^ə!~qH>$)3vh\pF-g=([]\Y^11CGlÿgưrn<5C@K|T,#[BRE3K~<能F?nmpk4ixFJFv[T<2O;Sx Kro[ZRrW#UU+/\O&b"_I>JOK\7K҈";D^Sf]-@U+t G~wcн>_a>$6E2VZ 6qoZULo:T<l 0rs{"O3q΋]#+Bf{>C%>ߣWDy*wȖ1u E zl,IyckL' a!50I-7kGk{ S_-՜{,(Z%h| /b#I]__{K7< x>א *W "֤n锒/9g]ן:v%yq׈?,<l9M:3^_r M"ѯv|2ofroXǰ'PrngZ{C| -/ƾNAw(G<{ؼt%pTSE8yȵWM)EOǵ;Qv]z2>mALiڑ8K+'I'!i} U}_z9hpL"|- zژIo~OW_i^ʝ7M rq 3J-z1A.-:6ه?k \?쭋O 4%eZtiq7L';E)RT-6<; g=x$!p~w+~C@kנ+v;橭`~5A2 ]ȣD8z5-RՏVvv}Fx:zA9mLiN_WeBѵ~"bCn-:v.r]\+4F>-FFvX]}=Qf_31cODNo}կڡZdE^faTYj_V}a88!9/dq". bFvqr.>8Ry9:Eɐg!@'lKI|@u hk@ނ%te|:#͉?RרVzG W-5 }v#dYu+Wsv3r:GlVxWG/IF{ $WmguݐaļFmIwF~kFzhuc*Y?зpU8`z_Y F~E,z{I" "r@\3CQ̭K<6r5J@v' =HFy^Ի^-XNI;Fo/ Ҵ92ȁqFvbV.0E̠ήV[MgYqBO 3#[(|] ܍~XW:4efr@t65eϷE"ͬ }} ]OFOtnb: })ւgd\W4djQ=Ko}j= 2Ar o5|aߟHԨv# Ң}H:@3o"Futp)MKfzA ˡ:.1z2z;qvz(1rHF ?F$4%0kd;^R@4 /-i)g)ѫM}$AK8W=9;\ 9z@Ph&M뷓m4tKJ(uBvC5 > }ۅpSF-yWktk:-| (ina .-##AnkëS~(FK5 }/VSqgУva}:uF1:kK}}Pn6ioj[l}B.Pt-%;,mZqq\4 0ۅ{t)#tH,۲z^?%tȣա{A_^("N:;J+rd$=tt1Lݶeeutuf ;(e@*S'vW҄]I-X7Eq.F6_#*((0/#X.!ݓw~.>hIP (Dֺ- ~lyjКc5OҘVyCWmH.@ 09ي|af*b\:/(;7~:ёkA[hRoE1}E8[/ZytYЩC H=67:zAgնA/rƎh2yrhrKG֠guut6_µ58~xZ`47t u V' ʋC+1R=^c/՛j_4ih) C DiG2H` uuH0grqD5F<_h_v7)9Bn. q/I3L #^[OH=˪0*r ofuq@K&{C>>b7IңwRj#i9/9I:=y]7*un+4? 1x :YlI`x畽h4":SDJ/it~!MOo+Ul &R@`l_ ȁƒ(kt2r]{by.fv W2DvtɐB^W#hJn{ѱtʧSltVєFE](Bn#푽25DV/tyC|^=e'݅BWgB0b=1ypؤ2m 9/Ńu+!wFG6_"tU_AnvtӣƤr㜽yJ 1#.@Ng^MC3${/))ԑ#d>.KК@T0&w_3,z()F͎BB띯Vt-ͱҨmŗ1iluRO咊* GauþQs卜pz£m]c!==.|F!.0gAR䅡iNwNjțCN[pfpܮm|0l@_!~`!931>Gė(9ޕ_#Rm1./֋^gL(UlwMܕhR^>ѾwI@bZGe/HC'KZA1B3v^1p}LϯTH)^ovDZrklc\Ws+@Z=ϏԢQCbrKq~Bu*T#c}u饜6*Loa:M_RoKͻ@_:Zh:dex׵|M㆗@Bm79w!Boٔ~SHy'E~@/_Ml\db)l~'Gi&/`@wA+yw%duF.uԊ3"';J+yJ.3BXDtn,Q y#o q|=/ ]I\TQQHAoHBquua@e䇔zRM FoZ*uFV=K O[4g}QuB ݸПQY9ݖy_ pt+hvBK:|ha}[UJ]h^r^ z|;R=uhA)n4tux1at@k5]M7K0qlN5BO+=j&;[!ctʓ^[H }fy]'q`@ߌtaF.J3vsxhwRJv|y>Nt2켋y].1a:kkLǣ 8fkT.r9MG_,|v9rEayt:Cy/@Α;"W,w.FsVqEa2xl/G }K֘wݲ`Ӊ\#. …5;bnȯR[t{'b43Aƕ'*^u"'9ݕR#_Ԏ[ƿȟ  :\V 9XtI`@E:vN .ye@ºˋOH.Rw*(Ũ=8tډ|1-ZVt^ޢ.Џh]./J݂7MK.up;jm%~o-$4r7G0ʝ26nd]}#\lP=+#l<1w$:I6(:=8G&Snk)ܷfcNv֩'AM}9Gw4jA*{U7Ղ4w!mrZM͉6zrrz4F"GQ"fu4;]VmXC BѓԱ/\m7>c lj(л]DjJD)%z i^ȹnQ9hHk" )~FUW/nU1J._ܧ VA:z_z@:Kh-6eh1Fe*Gjn #K[DJBFn)BNq17 -b ,@זt/M\ȼjՠ=>k;yz-b؀4JztkeEJ"/Š ݺQV7Hn3H &|cGAA"ъ0o邭!1z E~LF}r8ts Iiu^]"r G" /}7&m|QKv ;&.X ~An?ixǶ%e?ȓe"] 0t VyQ}f 9)E \@q`z;P׵\"+7HRw2 Rv o%L]I}(Kf? [.d<ȷޫ6#mh)o3!fX-f0~}"'F붑n]̰ݥ:4$^?R":K4;dz M"ir_l*KPcjbg,IEe]ʗ:z V -o@c(P8L7ShthrNenM<F?4~I_oXʘoA`B&Qi>K.L _RZ-|/]:Zo$b::><%_uJ'iFNz@F J-3*T!3dq?n/paZO= `p]\5 MVufꏷl1fF2KGllqS)@>cLߝr8]ikp1 FFEGϔith r~S+?k({Rom1Jץ=Kd7@y,\ ZYJN+Jz4J&IN= b/A*[G+,GO CSg94me-c@o)김,GX#^.ڑ;^Ix[FArsǞ?FF~֓K C/˲s5wRVw4X9ř!H,@U[ Dt\ˬ5`ú`cFiLxhw/SZ'գ{%CUM?Z̟B10}//q:6yW?V[SM92 XyiBJwɇ>pz]Bc/;ߥ:/[n؇&(ҷ)dM /#ƌ4ezzޒʶ9LR`NJ eξQ*|z.ۻۈ>gRr99UL@+B?G5Z1UfyHtS;m.z pt. rWxrwyPi}~G~Y"v˃y],]fL:`3uA 趴X;ۥ.6%t7Z\Wk#0fp?Ҷ6e@nt"WMzPd&dMGQjNo }'s>8|@_!GF&su4 )-eU}Yao r@o4zTɁ\"Lԡi^[{T$?6ܩk{DT[F~qUC{ݎ ;orr; 諪#pJ!!䤥feam*3Sl.g"t]K 򱺮CEml ]K)ݰow 蔞v%J_[|0EMrz} uxzݸf#j(+6e/I =YnuhFqǎ07談TyULC.9DcqR@6Zx-}Enlbh7/؍yyЪ[ k#㮙O"yƘJّ6`ΟK$s_Ug Zz{ W[=׫'ŠTzx{v՗91>[0]K:x;FfRkzz(]>m GBkۤ< }>؜2 N?[^F5]VaH'n@gyzNkzk7ihZuEVbwt'M,N$fR Aw&Glj^215kt&택B~> 5!2S q+ۍ:"JK2{v y~oS]") }D_=mI8d0~!)t* $p[ZZ?' iK[ddŦ_ޡs=Ҡ/M_AZee'j2$I; ^"7izr1g$@oco  7.& Cψk<Z͹U߯dBubM2u}-m`{W!%rAS]wz վ>OKHI't`!˺gl4ܺ&l=  zr~7)!&ș<|F@7R: Ǘv~Zk"OB;ڻyauڕ+ d_Y(AQyB3e04eKri!d iFIM:t2*!v^ :^^MN&z_RVO5v q?ӐsTؽlʣu聫y( =n[^ m%k* ~kJ]e|% 9?#%|]~dݠ}&YzzckZ*t!֯uTl{/`eKk,-O؟' ]xaOeZ^?vorh.zo/CV)=<#Ar.[ ӗ09+;l&4{|o3 NSShNO>d>~ȳ?Iы7rq>G%y>D+7xJїB'|U䖇;n=氛 E *؊LĹ ^b_X*ȿN#),*v_9rN=v-u}u14l!ԛ>)$ ^ؑ l{-]b'uomqG)=[%Tb'I!7x3 33\ax EuVPCA[ob^+ya߲/D~3\oH8.^Mط}pJƿH6rL F}Є>' 1l{8db kj 2j_lg'dXL]Ȏlxlx`i> W@\N1t+!,Ywe{U|9$V@T?d;d=;xz~9oЫU#؃/ZI}|Ro4&pX?S48@_j7r}Lz }o/7OQ}ボeIEF!K޻wm2IzBdj~/U$tM]ɶ=CoS9G&YgT4o칞?hq&+;Jg [ԇ'-nE/#A7nu=kz)ʁ|oM}[}dwUzyD..>q{JEf~SVvUn+HH5Hhp'}}` {%[fﺏ:X <dže *>oAᛴ ֜ݗgW_bC.H֬'tb]h(5PGK컯g2)~!߼ ;l'=)ŅN_Xci/:+ϼے@'vu2V[d)oo<8V2Ӿ\ {O2L]6uw4Nw&KEfiM&Nu>Vb~bX 9!*Z/}5U>VoAZ~5 z-zLu~頻-Ēo9U^ChbǦ5ij! :Vs8Nu| o3+r5|q^x>Z=4{o4BqQ 5`FGnVb$E_??A*4Ј>yMؠ, ~+ zPL勾mbV&U%@?Z 4sFoAdABn ]p{MGP$l%gi:a Ԗ7x%ndZ]FPAN'G¿Nsȵǐ3✔O@žE5)k9q擟ү̔ d)$VxKn*1>Љr6aO+O)Ey.Ą7T`hC'e e=If"QҠe~ۺY}̀kx*0xG6)+5p ?~W\8ˆ\8)o{] ^X UahmΑݑU8,d:Kt貮0}oT^GHa5ُz[QZ󪸆(.!~-][]K8o:1 /z 6QxYۊdlBLVB~FΊkdвD3̊ͬ"?OKu ~NWle>B5x)+fCD+xMRjXu/k =,&NZfXy:jØSd=Ii" 䃽~jn35@T14a 'ig*-$]t7Sv6yt8^.k>9m}ҡ AZ]U[Nj"q-ZJuu_i="'v QXg1Ʒ+%`?q|B۝JS,*I'x[6r]a@O]yZNYWk|]7 ֠Ji;f:#iK7Hi2ק5tn=?S}̐F }/aS9_%λ y**66exoay=,Zy`E7ẘneV&.XcةM?p}%_tY5R#B'"߃Vd-eu%O_3x\ wm 5aO-ːIUO.Iǐk/v!^{8>^"TxK0!GMOnfG d@W#?Ѩl2Ƨ:}((?)\^fdJGu_OgȫZ}{4~:J*9!9HCrr^jyrkxAcu ^lzh(kr.W~gmӴ9.A.EW{KLwj*5l+5ћҟq]Kl($47}ס*v)D_/h%hޤn^W6dg`O!^] ]B%lKa3-#脸e=(kpaZ-T5|B^*\k:ݐݰw凝v `OA#}^5^cѯ6E?߻=_ՠ :%#;N_eMز w=LGɞ܆/& ^zL`pjSBʸ@sQZg79:jfD4HrSQpnD7v-ce#dJ.m}Fm;(B(H%~j/qnH'xXS/ϛM(9gW'/;(ra/G5NL%_-j#|MG/5om"_م}ZiSw]& Lא'>Yf^b;2 _8j Md֡RBo);y=á4)_m=E)>Ԇ-u_+n-#ĠH?֠F sRg'd_s !=5dzaܟVC~JOo*Ń˧ij~5*אDKO/ɡ3l&l[A;B}QZ;t}™;Sl ]":; _AӸ ÛbW(mŪ"5$ٶ9 >φ/fBu5 {yϟz yqX&uayǦ n3AtB yƞ\YL!н7vC"#Vawr _=)qQ&9:dBJCѨC 9yס5Y0ZGluI@>) DTaxlD'Qŷx"ɼH0 <&_;C4pMN4~SP>ITo:+l3,i`qy*fXfZ r>tWG)@>Ǭ | .qOQ**/ԥX噺Pc7Н}r]-:lz6.)4z /ٳƌD9f: %l }i @5Kn&d}W!U]ˎd<\ v l~9Vc'dv@P xIw6w={M9AN>ܧ4 }W'rt}ʊ,`6"tkR(s%_lY; <9A[E\{o{8W"/h+yn%\; 9K|ף6/t|k䄬GCtr%n$<=8p_䤮:ac#J)y`(a+uq'("kn0>T, #vz5zA7^!Aɼ[2?d/[F> KL՛ևnUnk%!5QȈA, {羢Qfy^( + 2L_ȧ@w"D't<-+@nvz oVl?cFJS2:tB]n`[/iz?HR^ Pz]k9uOWh)k]vyoAnOȆޞ,nW_xV5U e#PE"iu/UeHoc!^?Rr 7<eF6;ߢ_⺹6F.Nb$<ۜ=[lzr 'ߩQR=;!H&w_==!Vy\".VQyR.S>$kx:8g$V' 6}>#{ A0sz􅟆-Fۉ|vF;h ŐEfcXmfdX#}z)tJ$=gJߤ#vvʧ9B]>ϝ] NPt<&t1btwBK[!&u֐CL%:j|Cf3dC!GǠnٿ~.q dh~_}n 4G_GL^}4=R &ȮR/!ZKJoIcNкNz!'I5*: RQPbdv 6x(\ p!sNuiP_7vROtsww:stݿN TEONfm%賒GZOPfn.C<GkF>mEN'=#*ТLeʦ^u }q: $-cdJ ZN*$ʗL͚.t=7W Iؘr{1shz3BT@6zSOOfh6)I;nNzcaB3_>iX2,~mMՓfQt _SU NqGI \ |m308G r'@&eʢAv4J USq/, n ZCXІNޯS_ZuRr) 4 omW~Yׂ8tG>7OZVJ=aڢ"g\_?F{I4ٸ/QlqbvK Kf5MCO%g:?bt!ץI^|aG ӻ*Kk>Ԡ<9\ai͏z{"ݷ<ƖM"PqLij+6suJokƖ &7|q +|==XcBw ¤DG]ZSS60gJٓy1ฌ+'^N?z'dv_s2r v !DWcԳ4h1eJѺSntK+^{} tB/Qkн^J4V@?}A7[)?K$a_K* "9Tie 2{䊄-O^9-/z2=-A_nCIiL7YWph[Z^BF/-xր? _r:`mi :hpo>L2X#嵼d&E+{8Bvz2 x1-bVo}i`Wo83}Ϻ'l>G7hʜp`Цo*bvy&%6JN5uP<@,tni^?Y0WV \>߉uͤs!j;um-A&Wmք[/%_24)oU'( .ŕu6E6=%}v XR˛5R7=vgKȖZl#7qp^K"A6bFeGy |spJnK!Q+j#X4SfZoi, 88Db}glM'={eOm/\ y~Ȳ`_Ʃ9hG _]HY zVry'@p 7ft ] DzBF*,ቶ9/x|7ۑDˏ˄nxO-i=^fRUZlʙ=Ck >b  E?wS=?lqhJ}k ȍR㛥 -l-k38D-mf6|{u?G6_C9CWuwpלnRCĄ3j'[v~4?(Oo1pK>h\~Jf5g68[V_L*еD>r>?UGU'')#é"AπsCn/E{@gGN&8pW9뱧ւ?d>EZjʒ8~p}-@rFn/%me/z{dH<i]/fJV_.nr=[_-4p8AgƅeurQ 9%S؂[$݇N8b|ݺ)uҞC1&5awnN9#TO1߫\? ]\Ll|[|*=(R^͵ni5;ޫ`]ee3i:im.%d}NSFpȓ1?d>`P3-0GrCTQi7 r:z;iV31]+0IoҘ] p ` ;ǭO2hIX^3Eo |fT_8P,3ho]|*Rbg3 clN!:l)Ч^4aLaM{N*2t-6rnȾk;4 -Uq 7g't^]kI'_(\z ]z(} d|1)l3dfޟ-C)?>09AHڅ] 14Z.W<~#zj FS}i3A MVv Sg۵ȋǝz赓rB}*|/٬N/cn.IA0.%)CH;/1x*b!l3f;ƼS7K7t FxApmuVK#t] M{vqd{5eNtm}sڰQ {qL.ctuz7{9R)c31~QoOG1'T #ʐ}$=[dqB/Kz2_* r׳p$ͩlНS rƮ;W4!k=:{ЫJׇ1@_c I|Slgshq&& 0){E%alb{񱒴*UR0@سW#}7UC``C>F^GyEa=R {zd7hWvDrp|$Awj4r ^xk 6Vfd>@=شWLP Y.G}#R`K\`T"CorC*--/4M: zbAhKMg43]􅾮25&YXVf [[ =;#kc?vwI>iw _Z ՜_goNN Kt4j=ՇKV rJ1mթ]/ LD'&7" C+ ՛cܣ˼ (h%btH |s6zz qM+$xr>>m2rڢþߊ}q9V@g-Iz+rv2ct}H¾+ fd&-1j#BgWbbFmkS %˼,\V!c]:w.zY} $U^w;Z[sރ!? tnVP9tw~b5UD=mzȺ䗠~# r ]]gKVkntXZ89b/Id'lFk/( %F<5B'#9/*ռ=Gx$m {wOۍ `stB_t@wܥ?xƘf$j)?(}bv5& :Ik'vIƆNiCzǸC+F.}C_oe o5=?L0bV'KC%ŗۛ@,R4C8dm= }ڠCNz =+^'Ĭf;1Ug.`D22vZq:O"DN>VUdMNmSR(MTI4׬xh S{Y)6MOvSmE.oR;CS"LKT6y[eZ'7T5{GuC7E[Ang~{`)؞+*.)}{##YC۝_}26:j̣'5:D0\4vB8YsuoI/j =?25_b=rCC?Tl$ޜ_*z  -zazL>.tY5v3=f~o^[6vv r}^!K96¦ؖhAN s7uԆFȱRϣ9s FԠB'[O$$?ؓ@/BؘryBfhrBgW9KOQT鄮޲筠ռ ,Cy"(^*co2[@nASUs/V=IVzҫ"NE ::Ired$2X+0|ϸݓ4GUCdgW@-'t \cn\ehfU{z?9f\t 酝)#Ɣ$/a@nL@QFs>׭9f-^] G:ָЉevvF%Zv>` t@Zhz{K~wªAbrB'O~RƎ1>os@Z/g'=*D*;`,3vW"}+.Ku3Co[da9s/Zm*=6\Ɨճ7TD&H~J)b>Mu~# `'kSÞ{շ yt 7oWw}eA@3 7ͦs̓Y :4J8?؛O"@/3Z5z:ĵ5.VCIf E&vA%̆X{78>MLCC^R*<i^<.v_| $v}JLV= ^oqTFNɾ!SsX0H@Ӆ]FOrs;!*7)xTېrúa9jiTMly'tJHOƠ U9}cW=a[LOg6҅=;ѷWK {|ߝY-MԠbtA_w8L>}X稪z/qM!{{NF/Xی)[ Cm9!B5bq/=A!,%*G[1yRd noWZÙ }pAǘ|y :XB:-qHU//kԹ|}%I.>FP Q]Чus̍oo;YL2<Eۙ#8gܿb;Iؿp3 oG{wo+l ڼҳH w'ogW! \t,Y^M#䗑3 :Y޴V7gۋqO}KAz9LujF} 8T¾:fBU\fO@N e 85| t GtD#z_ۼZ/y6R{:}~|f-0#'2N~]W;i_,JUz>{9)%ḼYڅGcF`˒(hSݼ>H`}X}&auʺ8[@_G"s-0X=/cg$o\ι׏clMT=}nY =~d?w̡ H4Myuuw4p҆!߇ z#{}e^O##@`WV Z8gehm0͞}J0{1A}t镪/瑴r9O@__ : EOF);>GCm ̥(a*tbs=[3wMOK~L^|YMyI/YL %L<>WQ, ExV@ݡ+5!Nrٽ̣&ЅTt}/. 8 ]LnJs)w*[K\GcYSĞ}?1ĵ{-1$׮fd/@'?Qh;9`36cjKء#kUT~yy7Vxl40T>_]F7Ko;\FfIv~./)c0%, /7%]nj!Dq5M*r nWSڥy_aj;cu4r&rA(@J£k@6;5 2rW|Gb {]V?#MO˴-C p9ݥB 6/OO +4jOzn }[R̬,tŮ|a~[,2{>Űa_Om|fdnw_<'q5 u474${2i8ξARUdzN쫙K b9FG`RI_)-P@oTz^."9J PHV >O*EmzsRл-kuQSE~QIogy\$ 8ҰϺr{%ii:7;[A2lC$a!9hܒvdȟ%< J?v4!peurnt_R,AleZY%ڏ_)N+8QpEiuЂ,:-$^\윢4KXWB+zVnB.x7AS.Ncyr:kH 6{u} mo |Lu[7p#$I<6ɶyŞދ<([ȍ<.Dh ꉝF(Tk}C9`GHݼO.TtaeȖѧC}J;4}eЋtG/@WVڒNZCAٱ։2:h5~4`A&2TgOѐFv= !J'to2SF\0Yh$Jkpa_MȜoګP|=+ KR/z~vQh>JEVNȽtB' ҩ*D녽<Ky=g43btAi#lq"}zc=^JNŻ`Ƀ +x+\yfZ7ucejW?}a?K(fls8z=c1kZ6At_tq^"&zaAހ|(awrI 4Ӆ=T[lwRJ'إzwPNeN%Jn9BrY˩C`Kjg脞+k.T Gz$Ʉ^׎JŞ&M4A\={I_ꇺZIS$!/r7'j 媆Y8O>p,N5|zn 1۷zDž`L%=b2Z*rZggi 2_=Bý|޸#$S,C@9=_-MCJZ ]d-ъ~}95=GRwkUJK6mI ǃLٗ:[.S% i }!f[%3f# ,rWOE>;I-Nya͋\3jF^Xf`<6}}\! q+a-E Rgk|a_M9!M>k%J{()zmx vsP#1=2avBBBuC_Gj/@5Bhf͗ǘwzpbIȆx{Lv}>Yx먔n{]gg TF q>ͼnXډeA۝C)aC'NO5BXKO>Jԑـ`n "G a wi&'tqO-4ТC72k׀|R}% D;lCC 2Kh2vk sl[f 5DAAv, 4PAfp>9*!AfWl[٢$+}\#g" .JnCʼn|[Ou斍o&h軫6];Ba |z=WV+-ГXZ,ƾƊiŗ Y52fJ؋: -;Rib 5O"=Mo|);4G,"G(C&]*+Wv$PԔmobIa*2)lA[h0vaHmCd;y0p^r:=ŠgbR鄾)}G:tO7<Q_[Kľ}Zdic'uZGG%l؝SIFu"o贒NJ}fiA>+s 17d4pL]tߺϤy| tT^\}CƮShB*=ITqs^A>Қ$^CJY1MʚIoC=: KRlU` &p$2C c(yΏN]_%Ze1Nlv=UʕmNXW`)g؆^;<v /WCQB* 1e4P/sR˸.czy " J/SK wD1TzB_[n&)X~:mA7k2i||gih 0t|LZN},\Ad*ȯӈG's{=* ݯ_;%xr.FisTIc(qrЎ=4Wy>τ@*01ޖOVhKWɓw#F㺂W=IДbثtl~{ Z1^vXU+#®]FRO_I:}Y)y\޼: $mf5RuvukЋ4KJON,QN {b =*MUl!5:o" R9׫8s<8!ӫȸ2FB8sja?.rIrgg;ox 'B3]ͶRQhժ}/t`k Z@S Z(}XĈNw deԠ25G1G^o 6 ([z e\ $ĆdYI=ė{P"@nĞ>0Ner_HWi"o9fv5Iha't7Gc96auf Պ_{JzJ>b:%]Z|>fz&仑i#Ҫ7var[H[Kzut%5EשXO-;G*v\@Ρ[Il+<*b냹揳 &d'gIK\E&ma =M 4.Y@ds.}Q!Ć.HWl DsɖQ0ub/OUs7'{;._2<65>'+߭v'R@ʜ:99?$i/|05dCVf&MY.8v6hzFۓ}V̐_LA;B.ױٿRO΂CZ]I[&EٷOe*ums0zqjÐehJ Gs;I 4Mv7i#c5dlHnFFcW :n*OC zaI( 0{S""dfʒ E%?]}z =\j9Wڋ2[pGhm4%1#:Kήyyc^>m?nRO}tA.4IcH(6.r^_+̒R'lt7cT\dO#ʤ|вtb_SժAO;}]t9{/}3zCpSGwq>{֍_;c}z j)$L@)MD.;bw4'=+temuOFrjЌd\N##= ;=jfKSs]\ջKe 0dSȒ Ԡ/F *rC[Oe& T)^%q.%~c)t.Lik1? FN{ܝ{{ՙ˔sW:T,ul#lzu.k2u2!. ={h) _sg;|aWI cKk9ã }~c;rڔҶ &r|$39/ 2pEvmiAk2a_9Q.$lcZ,{JawTSnҒ+#qlΙ,+?ROkԠ5z~l^p 9j'tul7wƾVt/)N4i%sD }iAO9JhA rFJ,E6k/Xj2%^v!SOà͉c6jw%KrVk3$-C9辿&AEb!z%MzfL 6LK>FI}l?Yh7l b}c.9T}ю݆~Lg rt;Ȥ=s#P|6{ \ t w/$cV/eG4 ;-.'Om]5ocCutb?/jfhI;?@سf#JN6ZU>Әd7tz>fOq{Ԉ{7I.m<^ǖ!1v}KilCKSm>m<hooN}Bgk9,:b "s~^}.=r }lRM34kTUv=Ǎq͊ ( ]CzD9I >.ٳou_uHZ9/\YŇvTR&XiP<_,2mN ? ~CBT.0rWU\ |..N>_5;)_؉B2aߋnwS6"zLl}D淚e p3ݭdlCg$Уa=oY `|gr?GT'ǚ/4!7ֻC*|&?7쭔x_-麭'vu-S褠ić5=t5b4zflo7Y i7;ƍlvB'%: ^ГK?H[];;Ҭ@vawInsBfvث=ݹ L'$ʗ=3!rv==bS25 t{Ck:fnoPP!7+JBޕh-zwv+1]؛:hl=wF>LuP-*6TpF:cC vK&ɯv`͕r*tʉ<{/fj==}%*C%{}W3 2A-1[ו̆Ǟeݯj/iA/UFzrفb,%D0*t4 ģ 8EqLN& "+ ݦnzA=0fډ2͢2m#=@Irq5BG]█2 6"9̋̒Y }q=,'))7_R/W'+^~JP9 :K ;I92 [2]r\8lcǎ<[C&i1ۏ%Ao*(<57bcGoOi=B=ЅB.Tyga /$w&3>خ!<=v"[$Ŷ:9MSnA8b珷3Kha_H}-ż`i6SZ./ju|[|I]&͗]Tc&q2rVn3iZmR7OŒ@/v!A1.)ҘƗǨmKksb6G) S='X:twsrL{ӷG #Ͷ }mXU;n}ۚTķ+*'\oP:kI ~Nlhv9M^D7ic_T3huJ3p|9g]#zli- qfCA+rA_ΞYe]^w"V2r+oQ&dgoqu,HfMMU5^%6NJ#O.o-ayNG+ :@P"\}XgƬ6oZ䦵7tF5u}󉝲0ԍ>E޸"-ZKy2$kŰKӋyp]n^gľQZ:{|S!Qž)*rj:##cz.3m W@#'|@`~1ya;AX.5NqB|Bga*6_t*c:1]-DSn1&z2 4aCs:,ps|9L k,Beq2^ Ы볩SqcLץ^UuO*;60; T%Iߓ=hEO;t 7I?G^]ԫcyzCAENI2-4z56q΂SM]9ed)NCesȏh{)bkhҁ|3&崁S{Pwnu[7-\݌ck8gmZRÓH/a_w+]_`Ab^Ut\SgrK<- Yz{zWi3t#) mFA-tCq;OGy^f1@%#|N7rer[ls & d; o؛G*4W^.5q\ ^>/6;S=[$̖e^l"+ c_>Jo7v=7M{nOM(>.cy6N]$r^D'QLCTZZb.4`߼D=ߥB_t 4#CI: cvzz vޞE\F7)3oOLzB_RɆ xY.񘌹Vj䔙b7H0Yhl4/1.϶%5h®N!19sB]|Y=ǽ%QQ@ iL IEN.cB/͝f;mR|/'=B'nWm+F'ŬonvJr v{|Bk4%t"'Z(>qK70yoTbU\ }=InYklmUz$47X"Ȳ\fB/FnkB#DȣB> y*nـ&B~D>Ն̓x9"AAg!͉+% RՆI\ '|byl .k'Ag14j]˱IO)2ƽ^!7V52vKl}5Y2H24ޠdؠ}wSNM a=r74xU{v",:; TLklG CGbT "GCzr0cC&:f8z5C}k='qV8$ znj$% }/٧<9uI!k=QhVSVBv s<["(7tMILL{5] vjUc$|jC~b{4kȣdm/)`H+ˤl2W7}j w/ic'g?^䱒]լ'߁ٙ`/Sϻ? hfio6VgJ)Uںdž>֬&[emJzƘI1ҮF'l~/ReXrƿь)&BSz.&2AnRXI"f9w%`{+vag8ǁszzR P}c4vqk?ՉM\r&T+J/]|׳Ȃ5jaYafEml|J>XxIZ.CFU -ZռJ6޿TudЧ k47[ՖbW]-z!]}\eѡ7Q(W=̆6΍BInoMk^u 4 F.tqrkUOŻcWL?W(IYk:i=P ]<nLK0;;G+F2.޶&ٹ85ZqhW׼u^v*ty9#%8tBP;1.TUN<#K.k ,+i2G~/:{2h/ų kl'SyJ_fסJZ}ZClE!|tbg,F/-z}\?!dJR'!N]0!hw.쮒0 ]_j\A@7JТD50C7eN/4N{~ 4<@Z1 uZ2ͅFgƐ'R;u V TľG'.T;ZܹW-Ozd.c9 A n}~q\=cJVdM:%Au1b$ =?dROQ7{QCIiQ zVcx=4.خOuex@͚^f7.W -r+[{}ܰivݱ$5}zvƮC ]\ g<=™@rzHЧ糱D؃쉕y5Cև^m 5j pKUWAI\-'icB?J$A8)j&%"ǘ1w?o$.} }K4*G(\sze= zKQCSYЫMKFǘE;x/r2Q4kдYr},C+B5ʖcR/S- jk).і<%*' c4]ЛS „ ]eANahLA\vS*tQ=:eNcYaHLNKw 憾IXvߧ9=BR4UFz!٭+؜"KJz'3V%[w15ٷfC[y_W rʧP*od3 9DZfv^BR5C'`Fa,C Q |EmퟩH_x|04Tef1W86S>Oe2/Xɡ9ւ̋ XL}T32I6z˳%#\NcG##Mod$RèK\p6-f¾-3K@o5ނZ9ӯ"u-={oi- |dOQlR9sπCd|7tA)й{žO5  ]ɠB_?Ѱ:n&h.t]ZbAa91FVv[˃Ɓj suWEG2w;7KB&>:Hw=EU)&7 ąQ%w"imA~L] =n, ε@YrJv[%Ϩg}AInsh%W2cGƒKDݰoqZ5PSp=/%W:yyWANr"o9 jd,%\w6]Ҝa;qw?^i,BFu?]`SI(tuԼ⽸Gܜ;șЉN{)oEKz mZE\F E.;2(W\̵"#{Q/cM[_q E%67wC-3?i@hC7ޟR?6@Sم<9Bm> 9зҽf *XKµh9/F6 ] أ8G/D'tv P&L]$&zG~G#Qw)i9w9k0Gk菊n#]/逑Ӭ7U]+tk='wǦQI+A.dy3<ys۹A^~d9rA|.*MGxI}6j_%Da}2/]yzw}!B0@QԡQm~ӉC ҍ<4)@u^W腝^z ldIu񐚯"'_7HbC\fC{]zsG L~4K ԧLȤNk#P \ۀ#>vgD.N9cj-#lȟΒ */9#[}/#j)9kY_z) ]ץZ$gda1" tF~ pdV0c 7(9;p܊nQ9vWЉON{iCRɶfԇ/mĤ6'?R_\U5׈hoJbȉWThԞ u4_GKL_FO^5L]zLoQ}y?ɛ̺<`B+lP!QJ袿Pгd!IKwo90s-ݷCJO%h"f]z>0~}hܸ>e\2nɧt)!m ?TYL7v[x }bxwdB>+t"C\n <Ǜ\W7C (S>u>I^ǰ94tW.'j} [xvB'>ZU 菣_J e~QT`م*rR繸+K]z">Jo:'oʴ'8xlt;>eчr[D"u˧ً'b^f5]]d릯~It줌rf"Ӆ}d2Η2 +hν:S 4ӷ\yZ - gհ3#ڏN֥j*z;|17h4A31r6`ۙuĺݟB UϮDace[c|UWDo=! ѷxZ2!W e -|QkFcq{^&B>]>nMra'/-}JmPl{~\ؕQS}ӓ}D|_ؚF*1pn== C$ο&!+ӱƳ\vAvA'kM_E.Kb)ZA ?O !=?ֱ93Lsś_]fJ zbLR>tqFZV r"cTk!OKCInm݌t .}\_ϕB)l ;z^(kn4oAGŞ3#^AmqjAIvj]&Yvvyo ..g]!W1;l7-}n+,rJ!>{G\g@ġs2'ߑ'Y =%d:EbM}r6s`%|L {̝cD>/^swƦԘ ^'}/ t2Sq..deFN4 _qɃ߷|~`sRmVOm # LnX=sJ[dRbco_Z_أ9+m .F\cܓ]L^y- <6Ml)лg3[;ؒ;vJ([/h0i> (P{`Wd=[u_,Q;:w,Keeɏ/M&riξ2al툘#X{WV2żW>U' )zvBRQt E"۱7K_chxD Y?Sb6~.tO\JF?zJ)MϋPTux :ɍkx%QZ@> v|D<'b"KAf9/KY?yаsݱT[_osf #G5Pir-h~gg8I4Ù҉Υ\!hY'./9\^ ȍ:\zS3Uhz\ a'al3fd1%96SC'1Fήe>u#]u='r~4L{l-"]smwII㹿y7eNqy\iw˔lDi4/33Մ31~@_oikM<Ս3l$"+\ ~A"'KR zLfv`SfEꏄBǖ!- .р6z_eF9z* rp֏|'RLC,Z`X˼Ct7'D~ {ӯjq 24 1]zjht"ϓP !ueo}Dy9\pDm{]=`I*tC_?k9㻉e=]rr[+%RO7^N߳}AU5>bHNqO(ޯ]8N.FCсNtQ&VҠE3ڬJCK;3i@wb.s;N }%CT_R<lRu'qI9O)TΜP,u` /t[St.hKgEcUu'1tg"7Eo"_r :_Hehs6_.d9xGZ#+#ZQEIXO؊szuK%i].(B[Y|C0oz<ky5f7MO715d@nYnz]2+>zQbhEx.mt椑"Ikevsu- T*Ѷϸ=rL޾s/ ={'lwT!W] HH}-v!z.}}Rpgfۅfz(zN&Catucٸ?vƮ%44#iț zux4yC9L쮮Q7bAH潋& őhI]6G*} 2:rE%54͎{DHoȧl'auCptn g|YM鈕EtaD{%vQR|+V{]ņ% &ڇ]FMW Ao]gh|cys`z(nNEgi_|X8 E7u}(uqm/B:\jǎr6B|aׂץ^O}ToH'mvEZ mYm8lch"Dޞ@`oH<q;K`w^.г;Օs9#FVש9֯Ca&Uy;rzy{ k( zNRBϐơޛ.2/- QJ硓`Lk2."˫esEK4=s՘O5:z4+yɘ]Ŗ*z@y*v~uvȣb6n! 7/)MĔ}л q\{R\aӋդ]\y͛:ОJ|!4c+&X.I sI2IXTv7CgAS׵ŋӼ(%jfoM9. s$qVҩBKK;}Y7%䡑LSƑ"'9ux |h4 9OZxiԉ֠.T []?_}z3e,CcbB_7J<+ /̭o1/3lfB^D\'IF%/d4 v-w_ڑ] A.n#ts?;֑]]%O4'a"'#B/nM\#K/ =%..1"yt 'H`GvRo(҅</CE^\fG#ZF xHK 2xrv{Dɼޑc w/jF&Ga$iȸGZloo$xH\b!_ $NcE>tRB%>u[>:Q]#JEixp.P ekĶhۡLʣcC%&o%ԄqQKg/)'|I@=ehhѠ/~66O䢻ȾԊܹr"_FbsrFj3M繐&z!Dw/̡9]#[<% hVWOG1j<:8? `,u Mtב$&]qwkͽ!3.C\c\rDžcCwW Kp9,ȁO=AQ-s%X:46=>4)s:k=BkE`5R[S[7I zh\n}zfDg˜ \>y2f@ȳ:h v.eE]'%c5^M깟Ћ7茡mS_~C=Emj]]Mȇ>%lY. +|M |s\T.1.94R?ut*aS| b7./.Ч‡\+CK-][!n?I/zg^#{3LZ]N'HJQ_2湑)a[MH~iRd^B/#rP5e*5{@nA{LkR]ÐB/sF?܋x,5%@Rsž{-K7r@i 4RwӸR|4^5;G]ס'rvi..z{S .>ޭVh>co#* %=^# #_i{Rd/ ulЙ\AJO.S?CGr;R|"Ӌ|T$]jWĨa 8%ӮC7̀aTSY.W̼: 3B|yX4jo|\M9t0N@l #=T#7(`O sbgݍ;*dX$L6)Gd'GM/̎! HkھF?xj%e{~ %{՞&@{~ ZȯV~T uhnkV'QNVz_O ar&ꏸgVE|Ao>nTS v=fЎq Svf_okvJ\Ǖh A5M Mrwxc]L+0E]yU^1!NZMEU2U-)=!% x""瞝I8ވF=cwxepڠH/3%˸kOPK JÆH aTOܘT/ z=rLXX>16!RIU :rR8x_S L*d\Cx$פz/OiwMOR |,gh2~OB!W.Џ+DMR&p9J`nMǎx;hH#hv{G*v 94/?h6'Ob+uV~k&4Q%_a+٢UH';o(Wo{_MڮsϞУF>yO Q@hMoO-U0\/Y׬չpşw3[wc9ޏ?PT W-6~M04Rq "k>Q>䏠|gNU= t(؆BAumcw>%8!1Pm 1{Oٛ)g䃏dHq?V-_y/^BnD#_cx\^!scQhe52yh&xbi,Yf{KV=O+f3C˛z]1hs}n[ >gE4SACq!U` -CӜ[/),Şf?+2p0FhY ml}1{Ev[OSr;(׹V->bݥ߃zeYJrhB++]խy}E>w jgsN~crkiйGa }=MA25~RX(s={N#\ӉN)&J 9کDINfzw7;rGLN/$NmTbޮלט뉵Ѕ?[KN4CƎR/yZ9i8N~nN赛zﳗ4v1_kc޳,$KB4w`O zZ叠QqZߥ)\x[~URblCS@9؆; {' ;{#)KC:E~i D;Awoı&*s!jحש^2ny親{v͐{q;xumAr w*=ynu)5QxSnhOم_sje.v-wШyR^g~)».Piyo1SK&X%}QZC$w];49b ^N I#ǵ+e|[wߪiaP9@9(i="7v5oЏ>;c iZ;!G|V^֠fnBtqޱO|L5ű[S:| C4kh񊭷{l|WM>FĵpŎ=;c} Hw2)ޱd:O;zvM#%`LjHw3 g(:)]Igh1)顭SgbWU 'GO4F&Loܡ/OFS {VY銭H3jw) [+3aSv ^'$Ȓo%.U\\>$1f Q:{K%lk э8Ѽh6υ+r?|AGXLyS1EQ?%kvT9Sm|7̭_<> TGWXMO5o>O.bTG2Ȏϣo D8{`oN A"iF-YЬNneZ.9;+~K}3*hnAO7tׅ榄2 |Y -6s&p]rxݗ8[R2('߽$]N5ؖGi]\MS`W&#}sE j'G_Y*R G~bm7Q|MՄW%/IŎyJA?qU>ѿ|v] K]Ca6PdNQ1o&5}*?ktc,^Io=n6gF9X(?{7O#ōw5wD=k\uVVhQ;_'#||3GWܓXDZc}ӗz[U-t/= n(50{?~N:w%_K^;6զgc_4.ǫy|`_ޏ%2 4߃hنnW?Gz^%n9}@2 iSh/<B)1r2[[} Zch&oWk[ٝ[^}xS9ZL;JupXWCW콬f蘡R8canw]}qc$ 2-B^yn;?ahmwO;IJk叽2a==<(!'B^]'b}Z^~k&Ud|;J@A`.+dce4Ʋ}ڰ4:v ە v-(#y#g)/.t{^ |Z.}ﻤ{ߤ:Y5_-<(wdJK7`P @aKU.\"74՗ g܄(ǻ bW gW,ӟaC3l3xm+ԩ,'O9CkdWPm <|43|y4:|aGfܡ_UwװU7u|S5a*y&ݲJ,`q'_ RtcMVOmFiN=Q+͸)_.oø[4fAuH-PߡSTb~D卋6ct*9_O]M&/mҠxQS䐞6.Q`D|G XC7d G Na"%TkuKM+"*AwkXnޭQyS~7|2^=B}:\ A]e*}qŒyYB{Q^k\Z|J<{Pܱ"' J p]soOL>w~BC W/^[*=ش].& $)rh |Qdlwiոn0-N[[8O 9hH JH7}Jh4tԈ.koYdT_MA6!GMUOVwlA;t@{-A}R:iYQ{cUZK>{6*#imThxz3tgۢ߁GcJӻ_jڝ/r9/`"0'9 ^zݦj{LݑQzJJޞwl`Q:wpvNȋRZgd*t 0K~cwk4:҈8.F[NT)'lTNJByKAs}4~Bg7afyRm]/\=*s/;)6xUŞ.AV'gN^R=d{n/@C^喁 =E-:O=3Ѩ#Xq >Q[E^t!EFNy]vjMFanSٓޠ7Qo:@'Y {Oq5%Chϫ}Yݶ=`>p0IQ8tZ1)t"C/{9gfD^B3KC7Ѡ'${{siKPdyw'1#4# uzhlȓ=)e:1CAW])=ry^9cG80,zN]^Ǒm4IՍa P/r =5C_f [Aty(7hzc Co=%Os:"[Z}Ͳ JNy^mC|wAKHtWJ~ٵmZ"裸d|"pizÅ{F&xh]br 4Lnuv%_}B ;?C=أA/BgߥՐi7tB)&{蔋0u^H7#N!t ܖjӏ%PK'nV,&5{7JLu\ڜ8B)7ґ/\dlG]FLO;ZOަZl*8jz񶨑ӱYڪA']/h(;?Fn(F?Ohs\\^<{1xCZZH景f:Ȱ.ti9cFGWbT6f챂IО 1DXt4AI~Ys:h[q2_k+hC> XէTp++ ^\Tw}SĊMqcvki3 EN>H扌܍؎@O4HB?0@DIv!;!trz|mȧs$w_s[E4pD2S5iyB*zܴґ#v>IO ^[I LOw?&$$ݑ//Ofh|kV 1>mc.ra' L{hzg4*k-;btsz \Зs]J$SG:S{C/W)|$Şo8.5ݥp\Fqz%kwIv#s ^=CVqWĎ^# ~z=ep]?B ָk(cW.rha|ٝӉBv@U+էaIq;/,BCd#]Vwf^`\􀾸-CHw3oJؖmf^)$_#a#VzIO[ tH$èZ !N?:yjm66/ISMqϜ#ז} @R6r}KY`U6י'Og]'G]SmF/f*z@W5SƟ! iEKV~ $s <_j؁ ^Ho i"4{G}F en̿親-\uTOh䫁A=FZp7G4]hM5ymi4Lb7^ qW"J=/#xg >y y&/)Cohp; uǡtVZ~-D3#gO䡴g.Rcȹ.EK%u͎3z}kfdfyq/#yCkaz~}6jyNi9a^,f77 6kq^><GՄu:=FR9;ŐnN ey?&lœR(Gi;\;W[DNɹFz>Du]01Ev$vqCzRnZ˴˻%d:]=C_[zB70ZCN`jp%yWftǙȣ mآ%r8'+}7ZZHx)@Qž\n*J7zxn*i\^l\蔔NS]"[!u.*r~/Cbhuq1,uz;71ׂZSBHM9#\V1.tҥ炚&h=Z z}6$F@COzB4kK7dȳoJ<]$2/q#GeUu(8 L* ޵!wcC 4ABn=i0dӐONq7:rOaQ3yy ~ȇ<vGۡirzƋIkQK3L^s:z&ly@ib.I3ZwQn R:k0Q 1DȗLO--&GQ!G EA'H^ͱ@f[h/QPWhnyhH33~nzdu.~W!-FĥM]].EGuGR{񄑟ޡ)u|zOt>ޯH號" Z\s%=*i?%<+ rb/.1:Ȣ5 xYnv{DW%#u]W])}2 ]HӶ*)KSsH]je.[t}B~>ۼYxsN34>*P}fLܚRt\+JP3/^gL%E.{ڠ7ՎxݯW:<͜zx:.d D^..E:eлsaO5wRF[$-Mkݼ(`& k0''h[U]|AfRIVx͑SLv녹e\ \ubyFUVZOr/ȹkl{FcG:Uh:o4= i y΁| tN9D2W48jw`\DGёK".E&lvt?KnN=iC'/Rxaw}7Hk:D%tu vNV9U J9/4Oe7)^X.@vG:Rx]_՝9 7x,҉; 4*ˇ|v {q =EDzF%}FR\2pJzWH#X%AM-A'sS8 kd[:P1%ly#z:9Q'n Uu['t#.`h5AgzBVok<4`?Fd,/y@ޜTg y~WzrȃJջ.66N}/l--BD>o:]bq{yDI/5I|}y7<[I | w{Fbk``$lQ#ʹK 6;:EΨOM\i,L9n:^U]nƨ0b}"F$A7K2Md{vQfkAkrzu2H`2ENO)ta}}Q:o<7Ig-^Kn>->:]4vv/B>?QqQQvlQFKt9]o!o1* ]b4lɛu2tQ3\L`׻/!eތƨ>_#)g,Rjo%AN#sUݛue[Ā]򉼬FP },j)T61^SϏ7h t";##4/q k_QJ!"Ql'2.%% Dԇ<^G7h1xYx K~znP?evDץ;+^9(yاlWg&.0:ț+1 Z1U`uQ,'t5@\Pɋ CdE2GuASj %F<.uHqDiw'2qdt@Wl⻌4R]h^6n z^`ƅ>􅼸< v)> |2}%(fhb}sd& #EJ穳wHwhQuJãGSm ͘#ߌ}vp9QLW䶴/r[:GΝۣeڏlƮGKyѸI %R>!aRc|ni: *ˉ| :Q^{.8юf.G؃iJF_n4~,7<;`@FG/COJ%س[53pK< )zr}JsO=Jdw;Yc|γvZGl m3 mgjHLȨUdn+z``K!z=f,8`gO L<#3SlR7h-MA4%>UY#%D.6tNk7L(S<&R(|n1}`Tĵ]:]n\SDTm<':xbI<ϝBA[^oH~]žetɂLؕ+%c 'vM:#ɩZ6u%?bw~57 M<xvmdjPvձ?WO$ҵW?wښ5zňV.K"U1.xMъg5)͚$^?=P򈼉oN'3c1¨S U7npuŒMkqnyG]GZokEkEZGL_4mrA>ܱ6z#W5]ػwL0Zn΋FE8w^tVJX͚/֡ySf)wϺќ'e>4۶G>4">y].1i<~ Mr} ՗@;>AU"Z)u7waMխmiJ. $+0x;疚sv"ϚX?sOSLm|ȣ2M߱7V[6ќ=F儭zXJt1a5RN㼃:5Vvyȇnlt. Ovcϥ'ߝ%cs'gp^m$GG1fAc=Chn42WیMc췣ޚ䧁&cW['yk>/Pn ɍ=(ж5즧lVO.V#V`jB `.#{?ב ?PyEztZ*u'6nO 8tœqkKmF|{6sGtԕ:t[P55Wz=C˒W2G^ >{ܠklᘿ5O&A"Kb0(I MEU#1ѳ'Wý%o8dr;>)jz)]3rSUw5v 4#OjmYM W¾oTMM(L{ \U&ƞXM[J@7 WOWϨovh#fbPzr [geGE#tzeZ؛SZXpQٔ0ر s^߱9y8qՉbthV<1h'տF}X{CxJg ^t[uݷj =7CCQ#l[zj:r&a76l!sH ~ՐC`UABwԼqS?VdzA;qD3~oݛԐoxNA '~?| b[_+;jW j[킓_qOlc~eC,s _6S v,#UY|Z+,kMWͣLrV*jnV־s|jT ;yfd5S3?z\^4Kr҂|L{yx6P Eh?>OEa쵳?p5'8U!ye 5_ؗYЕku?heh*"7Mh}rMѓTeQ~Q }hdg;zv*.(Al6wchmeBZVmĚ>ri&WL)%itԖvlzw(Or^6r׀rObhzKw2?-!N]cӝ%Ѱpr-DQ&_ha-C<*TY ]#e<2#w.& <*6nʑ w |a=ExNi"QSF~bF ׶M+]]ʾVl;~ԽC~##jtj4!eku&VF΅Kv ^|gF1S/tHY^0/ tU3n}s2|yY j{|+;kݾW.=Y^N}In>y<'<XF"&]l_!a5 ܰ!F|=!{=ÉRʆ|͓q5lT>{rO봈)ɇ >jްi%!7=ػEyx B ; =k<Ո)_}+$>Mu0ޟ뢮cޒoe`[$/BU즇F|Sކjy&M= 7[}֔ڐgPd ~7#T_Qf r>1CkA9\سl#ZR\;>_ Zn|XfhA#KXd䡱I_֍on&4觕RPd qZ/}*d vOFh|^79~NL";fors%$ۊ4ǪA39MhX>[w=A&_O[Kؓx1?o\4@_7HT/ANI,.xk‘ꡙ5{< 8c5] ٗ 7G:\K\Ewr3WWNK9U/zJk{>T#?V{_ҡ3,^n-"ЙM|a_j#x& ;W,ABؖi)Y]=2?ic.8*x9g¶'/k6~2Iy-" є:5iRo [guJ%ϕ/K$D97 Jt:?mU^tA>@oƱ{u_Ǧa`u`swL8JV#Ks߭9;DiNZ[ъB]|.mKq|hYpsǾIUScrǮ) 7NqF|IN Z}OCq/b![cӲ@Cj"ؠ?}I0df2SE.7_L\z4Ēgn1>(Uh=?A4&m^]!zXTަ ^AS&I>H 2Fߝ#֚ojۡ-NF\K6=;k/ASjwڦ ٢{Sb8s۱dM߳F<-(رrr B>Jz^;|F^ݪ&vL~u蘡tgxU'A 4hb'#8&Ď*:Ќ@?9$Qzg&M ;RVs3z|dLa@8x ?MSP _-"{hٛ|4^Wva_36Sx_\ Xek -C/$5]<>COMQ?uTSm'hOjKt>жc횑?wW|B)~^5E 9hHW7}C_B/SJ;WbprAvkTnՔ?:O+qX2r }j7Q dNtvt|1'r ؉FijMsu5_.\>1 ETRvNлe潅+ɶCtlO K=q'U8 hD(FIA@Y7 pFҒSB^fe4r~OAtIx> yͲ]Ʈ1Cp8jߍuGdlWk#ҩijI6:U#>՗@tZ\C zbc}TнI]/Ŝ+Z*]Ԑw ^t6l>[fBf5H7ublװ_,"Iiv.W㒟yfN|DrC,Jݿ%,+tjy%xfY3jJ6<*an%pLB r%*r!̫Z`N IV{G WHDE[GKܒ^K{3L66$㵵ݏ4ru)PmyU/yi_};d@O;5a|,7Cʵq"M5 ׷G;~OYDo~ Ͱh|^sDžέ~XqNЫŏI >/f7)\7lhyu/E4mLe!qӿyuf $1?؞c3k{mUg鍽]oKAf$`Ǣ0# gX~ .| vm덑wBh5(#WW,%>iMk''D/M*q'M ^ުth5U,A5hzJBFU4ި}@GZ%4sJoTdh"[+:"4kWl!5D؆{FNf}{r7_qSrug{x~63Jj :+rFyԣk"U[Fo~:\#H)XUI?Rn3_,`VV_iGW,z0#42#T6O*t*fN7 '|ZJ wR\Tз-^/[sS^Jq '[?W rmGZ/FГm>δӠ=$m|gQ wqɺ֋T@/.u݃\cGC_= Spȳc^rMSgJ6~3\H2#[F}]w;d| ^.SLaoFAƌ!d%pIFW ":bG-;$^z֞Aзnk-yN&-,,hq7jWzzCڳ&^)ʟC8tfϡkx1{ҩw =Y [^u9#׫/ѬJ."', }Nݢ% Z`-6f^mFfHoj@W:r^-$+Qp^jv@/BK^*Ľ̽D)S%q:| #w7ЗnIswY̑I dwߔ\7u)@\S = @<yx0-Q*A#/Zt^X6Vk%)|Z20lU%%e"Otыmh&HO;"q- Ii0/*}˼^BKs^ܞ9VK"3Vqco!!^8ӗױ$AX x6 _b ˚wbhYj060֫\+Љba3uK ;Zky %I$GA(1vyPv/%twYOd=nI{AiDnѬ.LAQҥؖ^3mݲ^_^S'ФW+Nk*t?-H;:+0^5ՠ]sز.w2I#ʀVc нkH,8-dkbBͣ26=9uiGxL]qg@?#x ;Ȼ)Ăؐ HG MHC:V ;]xi#9|ĠK$[,L%PzF=:4ᛘ}] #)B3ڭ/uh]MMd~#qzu LMٰ[3>32p?ӵ> E)=0nڵOy5&z_=QhTKb<Ȓ.u||,xhe P]ޝUE7]ƊmajLxuQե^zfA@/bڨ)x$ڠ' c~f]̀!;m`ѡVѸ% i$9RESh.FM&Uv)_Z9El{drM-%|,TyDѼJ2Z(Hj`MUI5Uy)%<i&0`Oȩ. G]tJzl0"GKAn<"趋,g>QY^Hw vPɋ1`a/v u:)[gش$-y-/~Zt7c4FЇNS-~{)<")ȉ[TuExLo]!G}i9/7[d&^|HyFh2r*X5}p6^ r%v2xIFj_(EuGyXhab/kHzo- x~i/5-N7[@!3U_)YSA1H{TRV ,N>_@|kǻ^J :}h0o:Kၞ e&`u=t0r@ΓNQQS0]eGbOa"fĨT/(c{) rYN|FLĨ_4f1Ra>fnKJc;t7p:r}ޯ&vxAPslyerSrGTF@R7Qc@z!q=y1N1P/Vh4d1kxe& riKu}~E_-Dn72Xq*r'Fg4Z50r.L#4rV5"Ͱ't]Z,EbSIRs-o!h>=t"A5q/*7l\ܞ$U56 'h\KW}gN})Z4١Fyx0 &'rw:t9}˴!.IoYkܰ?(]2C!zJk:ս߅OKLug(B obo3үkx471E$$n{1;A~mSUulm e&c+n;.VA.p틚KRn[.=TyoDhcLm cfC߈{vڋm|){5-\oMn{$n #LZ M PͅzqH'HAr^A܋n3(#"yc${c,7ty_@ݽ#ۥ2ʈy#dfU]5o_{g۠Th.Q:MtiTxEN7̲ mƂ/) #2];a܆F)Ru A¤6E^zy[c#n^T:2M$\Xw$hVը'V?9fXstܮlWu yF|[=p/rN C~CHel3fm7Je1zG!]I^W1BNїӏk !%ZnGF:q/⮙ڐ#.=jN*)\蚂ݣ/$_X9Z<\I.]wU]ytfb\2{o}wuzCr"whuY1^*u|܅^@OVll=1z@ߖk>݃|^,x v^5 lKk|%5I%PA/6lQedd?.zX h4#Bga13م&xomðt`KG(u Eܯ^5{vkD-P2T(OLL[‘p$PY i4RA.5kQt QH7Ŵ%^4!/rs~QJth˞:ZtkuK60'r .ٮFv| +14mM~ %paε2JI}_z՜C[7:WuL5/uq]Amr/24H}]%e,}y#GfFzKE)؟g91-mf%]A^c_;ЪRNoe - 81wr1G$3Sl[v0z#t-Zפw5^/Q)Ajt O @"_@>3him|y5:9Z>p貼^uAhu.(#AnA΀ Q ʘ)6=ƐS.~u1En @/.K>Г]ݲz [}8Ro0xC_ aBl!GOYcuᒌѐ[g~ N؟39P㔽|Co29t#_?gn!/p#7-e9jrulH[oKM @h=׸nϙXut[v6ز^9Z$~WH)y!͐ k+pw5Ѱ5;) ZwgLƉ@m"4y/@!WY:ZЌڌhىbw:#oi=R9IN)\<Е}fԻbxzcD]HJIUhuڡ*4+ؼޗ&Ps`i>t6hz%eot֧-j1{f&_ίF)O+sKgǻ&YǠsLz]Z{sl 5M{%TYܥ]]~XUFo!gI4Yk}^UFl 24Cxߛ9'0vzz,{icg0AviHtGiVN +t«穗R*r=$vw>^h%^5;XFnrg)1uZ^/ctJt^wz)cwVhҮ8o+N,G:$3 J[ech#/+|}2p/Wo9I<3ݝ7Qk=tILXW*cZF؎B5Z545u3^@ϭw`bR?I@zW{I1}^_r9nЮ@ Pk;gk9sYԗ{ mIflvFRe>Sg.rR| "NX #ZSJ8UZUY9j6'|n\.Q J~Qa -=jyZֵƃ\[D0ttmzSzAZGB|`%]8jͮ%U 'tat/1*1T|V6.vŒ"srsނF{io3r^Q+zQxX*T|B.* y=`ȯwbvB.R${@^"G->AN%ԤgI373"in3C_[=ł=o/r[_tl?hZ=\Gԑ R&*V$0.r@N'񝖫W-@WbsuH?C?: ^'ָnj6H ޱxSDB5B5CЯ)gA.Kf$ (}pQ--irW:%/|q-F\]98M yڅ)(2]p7/%k!t]W/!zc=/Whjc ֪nQL5>N:h]#B zތ}Y5g90Q&-]DNcV'skb2S p?kgFm쒋zE&`H;D݄FBz@Z AKSyu4%v n 9qSL| QMGڠ r:!K)Rp4V_h&)@\^ 9ߝ }NQ?TdV/Эvzf8`nL !-~$F#>^l[nWը2Eҵ!zy 6Pz $_ @f,zȟ(W-o|F;As0*ɁAe&Cuȷ;tw;Ú %|/Z~h뤻0gލqji -FFUŵ򮋖t} ~\Vt/b7th YѤ kE } 7%w>:ɿȇ.@ P:9~Ƹߨbݣ V\b]ݼk.Ĵ-hv"h >ー^} @v aע'jUm|нW> ]mCnV@t7 L'BB; h+'`a1>^#1O_{uF;[ t^Q E>uϭ~9Tt. u3I@|y)wazx_J% vzGRo=UgQAϾ|Fe=5⚑]l%w̔SG*9^Wu=L<`ý59 AOj-wB9\TNm"L>go;#:z}Mz} M:N-QSu9,$p?QL?-1}x z@O6FS6⩿lUp6 m V!%nQ;+`bO̻!#v[{j8rzك\ u_gA{$4tw[}X|Y-+Ytգ#g&d =:Sh&) =Y$Z%PXOQ ]Ic^x@WFm=oI& I=?*k h$z3pRSbdK`uh:Ϭt,5f9uPΐT_ؓt\*mE{-^oQ &j][/QWa)FMy ]y;Fi^0AN,'UF5r~~=FryȖJ{S7hgQkڀFP8 KKA^/I%O6BgCW %ʧzu0EKS;#7/ErTc 픑V;,s-h{q |qE*1(]\?"[k!O-Wi^5Qr2:(ۯxd/chؑmi4%blzG,#[]SDJ=5o=rEיM@^nBNf H [[f.z'wK+.Go-"SdJП_I[*3 1`k=kxY@spX~/rk, &[l? Dx٧[,0Tn|"ZzƆ}TsB+ȟkHu;vd&8l}8{3.&&51{\:^ 'L No'R=$OR}k/cQfp-0`< -KAެtN t -UPmiynwz#tRC}g#Oj?=k#E9V/r(0z!XNӋ z9mi77d@UedKM7rBuiet7/ABWeFp; a[^ݮ1șͺǦ1;&9G^"Mw`hrU.+#bu^ MΘ7<_BWuTП͗-):ڱE$#\f)#U#[r 5y#@)^ =닓q~+k#ϥJ"u?ka0]I6u_P~@Ŋ|3 }W6|Ƌ]{ޮ_{鳖p=QwHPPo ZpA408͡%}F1rq/(e3?ϩLw:AZ}HUh"yF ~FTzݠֲMWPR]|~y͑@T|໩+C ,vk_T.` d1z\outPi f4D̑ÅXD/{3B&b@>.z7ivM/`->֩/\Jw6?|uGyz3A;{wn3EǶ{)#\}+B;c35Z ykf zI=v'BM#h_Fr upthv߇w]dصȺڡ-0|y X`-!žv#r@(/i-@>%WBI^O%keW*%SB85hK[n- ѡS].o lfQNKFy=wBok쥝Qn2ˍQ~!@>/r2GYځ4Gw($Btz\;GW%h zSF]R-Qn.Y2_JқS)]Л#Tw lZZCS:grF>BBj{9cgfBor0~66#اk; dt1{S_g9h-I{v䚥6rnl> -yzY8eКZyjx=:Q4&hN`6un1^ځ\1] W* Q y6(Rӣ~IT3⟌duDCcJL]\fd #'[]]+oY]ES/tg!]n+`ARIk4C^]-l pvF+ThC1F {: ċz>*΀cmn>u^`z0nŖXzcAK<f+BznrJ7XIYV :^$cR`ǪS*)Jٗv Iy@Tj (_j;hwtle=Y:zFde@O`#&< [g}VԟP\1pqe=i|9Z#*C / Q=&_}9gw5 z{cڮ,Z:`T;%¥0Z6wm/V|CO Lnp]Q[͘h]~IIm5tMw< 8+{a1rl1[&0Y.ht}tĄ ]JG 3J "Wlhz%tBmJ6j5d :r) +5B%;yn=$>3颫(tq):Cߊ$ݽM7>z*'J%EMVc Hm3GL]Euu)n.#3e · #fQsEl1jAoaw@/gd USLw:R;Xb|.֗ݙuQ%Ƴ2ŦwwL9O]thl"8a6hG.\Nj/8C ]J9 ޮc_FNyl:ruzdڋ?1=@Vy5(H~{'.٫*>V V:5:o(*B;zxz@Hoh^GH8_HhtELvJr~su~mF|n/6fDy[>T.1:AMŮu^Tv4SCN4?Ϩ:پx;r  ]BkRV/Qr<*{b*􂗉ȽȈ;tOm1Hr;h}е]F].Ψغ:SW-ȽL23hWnٴ@_ip< #u,h bx` D9 㽇[=#gP@^X=f؀޾;; yC#ϜVWA]]Ҏ*$з"si;7Jٗ~!(I;[ [Ji@Fڿ.ls %ٙ~KW*=pH78{S:Sw [Tgn:??kLڀtʹNЅo4}jNșWk`}[_-*>*䮰{g7 jrY.v1Wr C );%oE'6[3Z4䌜, M2 H^5%$ z;sIy^z BwNCِߢ9t8W}{AzY&m@Zuus xE3|SIEbE%+r@wyP=:~/:r?bwu9@8nj\CtFK_ȭt1W'/ _ k?,}ȥ7@ܱ:rFC/RdV=;5scs쾑k51`,kjȩ8mi&$r8i^Ю5G"_I =N̊Z{] 4݇[!2#{efմq @ ZH/[9vT$!iaUGW'jؖuj'_]܀q[_LvuC_ G/ ӕE?[L{4^N{ΞK:ցa#m}=wQx"5x-QTdk'p9* 0QBH].p)}@K?t-3(S"at 7k3w0SϿ[HdF)̍@_RN7 S_,K.вF龭N^eϙ?6V@vq{ʊxT?Աͼ" nKt}X~yi4$^>ɮ.=z]<yjԀJk0~|<}Ri;Ϭ+-+rPs@ E]^ś]h?˚Vv ŏyJ&n @h@om\|}.y//@sdZ1$oǚi"x],Y5!w$ҷaM*×|FW/Y۴#/ `͖vY \ ;e 4ë}˥T%5 *9u 5jNxcص-8#`qd.$>.|o4 dox53z#!|LWU"I`.tB'6e.Mbaf_ ܿ~:U7:_I:nd 9y<зОu7mdvK`Fk6@倮Wc_D/_Nxk9e>D/OOpl7>E%<{r͢MPw:!Xȳ9m ΐ*^;{4CQ}Z)[T) ?ET>?/F4p8sVfnK~wآ= X>m4HOc^JC{%Mp@:{򉗻,:Х ^Ijղ _/ZI%ߘFlr54XfEe7!Α> N=x6:ot.١B[ZCؽ[qbk5IC|b'krh`޹ v`ZCfN&,;m*}JU8jn'C]*4v `G'vRi oHثa[vf@׸%oú%9hu^4:7_ T+o)nHjnQy@')MiT}cf=4A[R@T;o+i<l̠ uE$.77 c%chv̄pޢ| /^пT)i Z~8v=K`'wN=4pĿ[6UzdֳwJIj!~~us}fQ} <{u!wM9hrxў&Mz@_4&ㄾWm!Л u{{&1{ {pmy# +)4Ʊ˭]ΝcfV4 V(tYMC؟Jso#ߑUhA 2x*1w 2<~5]:$+tFcٓ|chc{@ks$?9%vX9kDG;b>zr}żѫze:_$NWCҼ/r/r`+hfՊ4d}Fp#F|ET-f >)'1 rSrʩ3)v>^-;sx}ݽJ\FߘwdjPS/xɍ Qs}$3WhjledQŞ|^ߝI|5ya=,B(Q~b}+5!oqdJGb 9oܦ5{c/+ΛA%7xj4 &Yqϗ%Ðc}~VMљ4|/>ǁONmK:n{JtU{K:4;S7vhaO4Wͻ7x_5nQϞ^Ь>!HoHtw;N@INuC\_uaТKr=g. )!+CWԠD7Rk)^}7+bM=~8oƔ3-Fvgō4o>5/63l!4yn͢i>yCbުW_| QfiN?ɢ_BZ` L՛Sj˜u"hI#J7v VZn ט {;ԢfZ֐k gG ./}|MZ7xJFh!"vDw}MXGv2NDER|ىov<%d#(qAq2 ΋_"7eth-dּѷx@B;;vؔ|_Nj%qqguV|\gWd12IM[Vӄ}ݚMCNI+4߃KUܷu*-5.7d@m7K!.q4[M폃-,Jyu'֌ 6^Œy?ۂmii)6x#uF^[9vB&KN\_G0n;O_uUQoXM5s+:]\"رrAS}[  nȬ7v1>xrv톌f\+ģڱ9%#^'O =6O* a}?q7=.uBe*qݫgo{LjA Nkb>a {/]S//R-3y`{ Oּޞ{,r|_-.У3o8s,B[Ե7O)w߱@I-l'K/:,-I5b_7 u:-;1lT":ܖVh ֽ򃼇EΫA3+)&FKTL.rs܉|t^Lo07čq oVW~/+2÷~8>g^V_ Ty_SxUS.tCHf>m~ EWGЇ.-QFn!;]s9/u^}8.{[9'ꊿ*g#A> ay^# 8Z-m bsң!ꔘp_i' m2<4R8F[an^A_.a4^;Vdh͏{y5JT]]hĭh3`$)HRo%rCupycW2E"Tj~o8.,x]3v%rBD#Dꀖh_{4d@i[LfUF9E녠g[cC쁑{Z|t{i2 E7o"V. 3oc1.$9+nD&{)۹ c/-*tS^RƦ]7LѼk'rwR+ ъmt"5袘ԡ"oz%2fLxF7qm[8[$ݠ}jN6R׫VhrQr@%K(.],tVOJh>w[*t?z#q\kv:[K07׈,[/ϭm8CCo|f]%/g$뾠P/EEHI2JSYi5F HDgE)>gУv=וZ~GqKG xNjzIm vhKwµduئf\5Q)+{['"gD@d:ؚEƖc }ӭ}T˾.#rE y ^c9)i"%m8Q W*6?J8^-ِVf[b:Y+-d>V+5^ǀҡtu-d7~0vhq?nv^qu&qIB:;\i(ݖhghy+F?b\H٢ul.lCshk@SF$%ϫ=?Ѳ'_mu߂ȓ OCy`2FK[q<@Sr]Qh=,G_>= В|t[!c=\ -1B >lu=IXh{=׭~Gyma }kv[GkG>{a7]0AoH[v&]Hk(Iupa(.m7KG\{ -˙16h?06"= y0B0}:䕺4-2Ya|Ǎ t3S`=Zn֐.KLv`.`{QߧFb*1}qVI3;ㅗe*`"x\.[4Rh7}Q@אrtyRŶ5W$B7ӭ5QNți 6x#tYFBsZ4) N=HKjNs]buguJI?ۥA bdc1_7rˎC9/_|1/rʍ7E.h|HRdyLyȨK)hv䞛ߗKll͑Q^&NEA`-z]Q 5#\o\2L{Щwh(qKOck+Uc -Rgҡ#O캺ϐUM1rؒ}_7r  B0sou ϙK1`@sYo t{nvO:eBG$n!ݕi.  z|>աWef2./ ήJWK3i.K|Nh[тtu}躵jA4B~}0t&^rWt"n$9OFA/aW훒)ðOW8yAV^*];@E}#-a" GZ\Kgj7Co{U+!wƬ8x{}-~B&kgP]{%Jȫ>Buآ$ziK7^yBbaO1ndLy0rһ۲ T<z;O}[&X8v)4?SDL+q 45h4*[ë7N[Ls_;m3_cuf|;fؾo*z@ 𳇞M^ zUw~d9"\ aE}eDthTtlh[P#E>B.礑 )…yd|b̹f#\i@+h?&B7w);F<.rnm5@;$o9 M0ȓFNEZ6:J-]~hѽ)'NL[ gn1NR՝]!߈VS:#Da@Ot/ECxue:haނ2zǁ){s. ȣ|.wup7)ّ#]+ez65א,zzeE@Ї~/ רshHekb^Z)@az򻑻T^/in(A], \<@`ľdKwTu5&m&5)݆ ?gim@sQ`s꺘jЪ@}pف"gT I>;ԓf-a%T[mH8k4 jY:Pm3OߔMxixSj4xgr|T tf$Sײ42:6#]V/[>>2a`,'ͩ'1}D 3֑!Ͼ8I/rΗqcPh.@+ljFt:n [ieEҁ]/ɡbp'_@e-3"nkAVovR=IVE^]7 w7&hF94U'єo ߏG:v)i2CuG\R 'e~{/]ۼG $кݒ\&`6:QQ<^dF4耵BsG-b 5uFNg5KAfuLe;em=n5\.2ZKؽ,*i?vNk]@^E2G:P.5 QhYJ>Љ#5e@~Zۣ&+zȅ\e;}PeӈJ{Y4{AkGl<VEN[tClVhpeE Ys}_UOT䀾FV 8"CnlMv24\`7>n4"qzh\"ѣߌ-`lk0qf^k@^VC\#<\ܽG|ksnK7jRnY{iW/ݑ?N+!?G%Mռҥ:ciHCw_Hx[,K 2 5B>ãt7#4 oŨ #_-#_ ׉3W˼jLטbTJTʃkڄL;A>V5:pIz]ڀEǻƁ)1$5nI۞'DԿjm9anH+1j~|C~C,A$ #h=YHz_j#2 t`wN 5N rم澚?G3=-1h.wݛ_ȝ=o د+E`'!mvؚNVQa̳g豴@tu}>:OlO䶖FȭtEvt3[~Q9t'h3*t .Ít[69={jՐSdn莑 bF[F"bPBѭg]Y帮P' MJ٨T`I|-ŅiI7r_i[NFJnK}2gdPbȗ(6a9#u>+hm%pZ:nÅ]t˅}݂`3fwݼu).G YH W47E0b3m|UhmsDN-#-t.&쫱dlr7z( C#Sv&p@k2}[lwۑkr_P;vcH?NODe`dU57ż55t}Kd%Z}z K@kT:]py\- n/Y@,BHufXMu#Acn1jv}0SàƁܗ0C(nQG&ȞrYil4&XFb 4~ _Qw7l#[&%_qQɅ7rpюmfӖSpuG[\譝4YZحA|}5j9zZ. dR}l'RZ;^(4$ĕ1p=Ɍ~hxzgD&֋' B7FFܹO@?EVnywv¶BޙzVeѬr==2z]a0n8\T2P,' pϜ].t=Z(yvbO];7c[7tɕ],Gbgʭ#Ǻ]oj,HV r1-dk@YsC6>O4;Ax%=^ zūe[܁>e-l-b%Q?ES%#w6_hǍÅܥD>hKq>{5hҒ6_.9&"nL7W_`纔jWdZXK/#]/Hm-xA+/҉^筘}hOɉ~'ምr*~ެȴj|PيO"5MNz.Bdi󡂧b_+K zJ8o,$#ʿ[n7!'B+:-7g)b/roy7xܭ+j|4ca~M|[|Shy YԠ9nq>fBNmW L jo˾-2?s5 g/, 8~;sI|œoM쮠JVP<}l bb' z?=syV,#3rpnﬦDzdܞ?طeKӊn.gWh04KzD'jZ](ohm2Cz;f]zpwP`' ;ThĮ'J%7Mi ݑo5'jikm!'V k?tMiޟ]{2vS9;f4NfBMĒfmb+.q]V1D [5r1 苝J7t:t4\t.>⊝W;-%POnВ~2Dh@KЭR ;rX:% e=dNwua"A/n_'c礻A+~.Qpk2$7CB 7nvGZLr2*oM-\ߺOEo ~d[RCp\.s5h3;O-؅4mԹ65^(l"eokzְ X*=gAB(BIoaIQ0l*AՌ2N;hL\llBZ4h-$_g#T9<82L~/vYc(/Sfo wKa@{NдU$ uӠز_^%Y"_{LܕH#v9V9Y#n7աC{'Yc >E<*4S0 >Q'= :,"M1+v,F+@ܔڼlJC.$lغl :!h4KϽ=kpP~NC'5o-(D.瞮k\1C:b/Wlmu`$Mo-Dg/ nˆJ=~^;ktm,\>Irn8كY6s_^"rs'wr}+]#daW/KhZ|$[R${S}wK :^-.S{'GG٠jvboN*} :t/un@^zE.*iD[`x;A>6.My~aw;r#GM#ng@cV$)] G+ ~aUr{&8T0==fcYTN-:N4z-r]CcfzBkWF.LPɇЉ'b|%$nQL% #c#pUC"k$\%ԜN{+WRkX;ͦi[l߃R"t73^NaWѷ?_TujpЛ9% }?¦FRfς .P[s-sdx #bOl_^>):UV$/Y~Z逞4b7Mu@T)EOz) :_i {]T}dKZnKcu(6{Ϲk6^-M>OxnaQthCQR`SN瞓2(0n_m/#b諱a3䃷khVwőŃ\,*p.ȷLwr.|#OI:cBXF^nGpGnX/ h5~FK_Wz+}nͪ{*q\°u;@##zۼEn1K+Sx!hUoDqVS*z=FNC˼FNzsSY@kІ 5!*<+JC=ѮUA[ n-'zkn+q╰,-rܐmB፼._R-4E}=#YARNDt͇UŃ\6R6 7r[b7Z,ϼ B^s+<'"7-;?WIy i;[ثs.~)l+pY 7H-6f$Q:>ӳ {faznNRT zl06Niwh΋-z8WkY ldBfQ4!G-Y_k~>g%/ .~wuJ59*tB'8c  ]e #ie0s.-c:cew-=!!_K1.ؽ#r`o>*s9?䴉 >?b/vIc&xncH #%Y }~#eГW?W_Ir|8y{"A IzuKc7$25S|!ȭA.1|-,Iœʖ`7:}k+FpoFz#O]*/4on\tG{,q9{9#2tZ /Gޯk.2h7ݽH7t;Y2CrrKW$/W'w;c:R<d\K*Pp5JwaW!FglnTōJGNȾ]Ub*2x1Z{rBK./F?9<;[E ؏(qY|օ% ']5\t"S%IyҋBs4<[CDCjy6d-uD>E =QB8-G;\Hyy>Uy趌S: 3I2~>Ҭ/ N7O=d7 zVUm3;+ϙ'a.@Ԓ,ɍ7%hӗe= _#68ꈯ16R{o2Fg^4pPk'_BoҒ~~IrZENj Y_<};e {ʙ<[c_bgˢp&ْ#]л1\UGr5-j #io.R4̫h=S(:IFn)RsC3$u0}37plwoIIh^2]+@ޖl*Wgm[vot3ZZf#ŕ )f/e<en[8"C_['e,FDfu#Ff7E>"pv "TI]WhyhBOf]!?4"ϮB鏋k_؍'v nϱka|kߍ[/EE`wX8aox5~-%5tlCHIX$N2XїS[29Eadš{אoF" Rbz_F~k ߚ#lЗz.+ wUjF\Ur*rK,z"!+]tvJyga:smmJ=|~07oIGӶ$dy_ ]Cz5G bk#:nX?ӒKxY~}}{avyԠ=n?e>!8c2 Gw7r[WG?kk]iz]fފs 2"'_yYE9~oaitR:O]!_Ёƽ蚩Цn`t?F/g>z>[{9zA!z/輋EKw.9 x{2$ZIe3Gz􆌜8z Fߋ̨[zaN:Ϳyy Սv˼[kH1J Im`))_5ڻ|ANȤA;Q[65zХyztw؇f@kyW;P dOU"T{.ʄ=]oIPhQƁ|DXIob'<vBw]gTĽӑE|[djHKnэ~0GYH L9cC& sudg^8<iUJ]t.B +:y-VfS>w]]Sh9cہ"aNwYE[;cdr*t"u6yrY)r}Al/2;$yp{dQhG]ZNewS<|1U*밆,:ބO- ƶY 9j"Ʌ|D |9\|{1qGf'], 85V8sb侎rm@OrD`Q^XJcT.r} 6 uwO]ASrrAO4R^\н]q ߆:[Ѥ}'1 _SABSf=yh[[ ]ڮOt y@ΫgTZ%\~K3EvŻ̪.o z1ejot{yR\sf97aЩr:-ڰ۹ Ֆ₩WhNR{r^*t|tËέ*оk @+oeV)#_n]*epLR]J?{(& _7zތiS0d,>1K]g^AWds)b$M$7:3RY/4;wvch* ϵ:Ҙ@_q:E\*.zBU͇gD@s4$Йq~(Q-Eթjp- UY:јwABQzx [g8Ң`#⧽e^Z*ttoP|QqB2tiyMP/QOs-ߑ;"Lfr] ŠY?ӰVWwakR Q9dt7u݋uՕq|i1>怙z=˒Lm-$5 =qQE/ot 8PuWDkr65f? ?^Lr/@멸;t2w7hiuNq3Kve4|zQċvu1rMguw2Ao9#MeLp!H\&zy^m&!2I"AEV>F@L[ݵ G9R︅0qeq K4.-owZ̸Ы9 Y ) O;-=μB*GBe%K!5%AB0:lJ@> q?"6/h(kpQCU{k=9/vI{I6Ftyl3,}i2l:ϡkI^ .tig-zq ,O u6btB񍼎Si ]Nv Ҭw!=QRl.-Y4ӊ1"ui~. VzR78g-..G]!-Z@.!B)y_Fn8Ў">'USz3\,^"wȴ.AxG{%L7Ű}N~&FqY#Gs^UM‰!1r(,X- ͼXR?)6jŮ긝:Qk.Zp/8uK:xU:"su\-^:׈}6,Ak oW+%F $%_qTQF0שcSjvi J{zO̒u=Ťu~)OSy+!ueYC篂ԄNJ) ~JoR=n0}f#R+رn6> o RCvL{6 E ] 3_[\}#+x登C!OfUZ*@zj?o5F&d2\:/u%4YVTʠq $CRX>)R  QАv ol侾M'ؼ:\/l_as87#3+YPot-mvtDw<߹C3[d꾌-T'JN+e xC `}ߐREpң;登tI2Z\dԖR2ʆWS>j9Z'`t"5"fzM["y[afݻy#lZ= E4@ГU.L®Ga |B}ak}H2smoKŔԸ{Zu[42xgN)4e ;ܾb[)?YKzncp]RR6A"zއO2S\ DE:cɫԚ1 K]7`$r$TT佞ȝw//i5h7@BAБ{/Dz]#b<[k6]!/6z/] |7lk& axYT.R<7pQVe%rVcڰҔ,BJ/Y,4]/K)y]^CSӈ2zS,J/CA.G[ʏ>Ư@\c\K9s"OqR)/|D?oԔ}?MR褦 #L7cj21)Rf uqC@(: >/\Diq_,vnyT&s%А QrN`Joْv-, yykaК/bW0i)am[|"7ۊh-~;Bs:"%Rњ ZUփ|`n=0:h^E߮Bn-iv -wKwJ:ksDˈtth/f,v=UazNt\qNnb.7 zU}?<.d]*AkaFgF.AE/t+tݛ _o=%TB9*/v8Z R.ŀ{FTچx hΫ̭d3ϏtMǁ||:h1 YrM!\Dz.㌖ySFFgznEȉb[gu7FkR3qdp}9zFȭ=?FŽ`H?N$yAsbq|>ԑM$UB|aC"m\{"o>DPW0ǁ\r} }7"KUKCi9v4 RBRqt[4 wG$uPsu끾l\gPQrWHqܡ);d"wn& M=+@$,rZ0nk7r]R CӤG6cqA>rGI`˽ޮMcxt,G'ݮҰ^A{zCRgmiL2:;8 $Y|n-@.Aap=u>z`p H|Ǻwy"2<M7½Go@S69.u- ]ii66!ȉcWdE#!'0$c`4y][K[v=?u}ϙm`LŴ>>oWƆe%9"r)n?cWθR[4`/lcGt=OuUye荐őOу<1&rSdb2-DKo?S#ߋ EE~Ϋ9D;ʌxwtȷHFgP2-}%}wc\ ^hm@G]C@}Έu)_ %Xnw|<]eFK1*ղ|n\FS=e0{ 6n)c\fJz:hЭ y[BhR9B?G-r7P:yAtiShR-FSa0h)-'t]o]N[)}VwδFM#CKH8ľvχqKK:v>vȴ/V*JVwޛ1HO}V¦חFi{F qIJA6uE'JkMc6AqsЌ/w{b΂yDLsӤQym,A}\{nUL|Q v.LAk_ oU&#̰[=V}G^bbڎwhV4`"^3q^[#CN'vr[Φ+r㖔BWO{Jxokc`i$ i|TWBK>K>+aos-&fh$"|n6_KqiP[~|o߹dO Li^з`eC%[}/e.4ڧ>3b; 7/?9r5f|o9J1+R5k5oe#4I/yq6䰑Yf>e"<7deI|/v\?3_ju^hRE^#S1>B=D6\N'qW XS(ZRa++Ū0FA:_FB;j ~j${oTY׸oNlD#.J6h[bRPS?=֡wV==s)yEȩ1s+W&JM7D=+nߏͫ= x2mo5o1@aQ:U#ߩW[^c J< ݞkݝ_n-إ~s\:r6i9. T&AS(_RJ\ܡW{㒘W| S`hP+?=㏀tjp+hZ4 @B1k܌ BBE|ШA[!u\[lȿ[$5{f5>YwMݙrJZi`®3qc~%v Yv^%^*Us.:4857[/p'qպ`>鏃ߩp b/!~|wh6hD|$vnY%g tB)N4䆁S>iُTd[=x.o'|Ѝˇ85F їiG@Dw%ݼm 9 &=U}$#w^'^tpK=8x&MNL)R_'R+rwNi?I`l IKy'¹8oI$I )ܛFWl"cb7bҐrBl_gN5$oiD&h!)Dg&-Kֈ~օȏ+61DE)-l$*ޒ`;޾%9i~NkL^lZ&7hRY\$Nv| cx͞meDVO],؜*Ir=B쏘mM5M{^ maK_dMp5/1 3*}ϱ8*.91TR''d@֚l%W{kr0 3K))}M;.K/=3v-.x]Mv$%-o[ :Ȓ|vRhOAS{Ӵ>xM-Rd|s]nDo]`+w L7DƂ\g^Cu{XnlJ|ۭ|@;PxoR’_@ln?W6Ի*| 2v!c~S ~|߂ԯV 'iϓd[exVW{,FyBɝ !|1 r %,(x Дձt]SʙV%w=/jnwlyk߱M_q|𜢼o.wWZGߨeW} cC_kTו|2 ݠ R"O235`N&c ~ JD<5r| E\q?}>PRxˢԱDD+.HwͳJǣ]/Vܨo?W.'=_+r=y ~G'%2cC_/߁ߙyh5Y?5s2Zd~½GJ#3b {;ŐW8umLZMĞUJ%+` kb3{`O[5vN}qm{ror 6Go׫.vw#*1#_.׾7gȃ mo򖯻(nW+>oVG۲h|+qIlg?DNi|]@L['ZZ&i㏰i˕9{Ŏs& ,{bq # ɯTw%iu`oL 4;NBd6 RܰYFB%J(r/r>p[НNʼnLOV=畳#h.fz\ozv'lUnl-k|݌'7|#f%|<蓑B)e A{· Ib0wbegPv$7h^Gd]CFTWCۭ3zUx*kUQ{GjL|s;e `KrNځ6͝ }˶< [%S>3 -b;!}=Jе ݚvMQyv+ľn܀'`NO 7z,h[i@G͠a߮@'iQ1SIl'_xVYwr׊LdQAF|5.G j#-Q<.%H{ ҿ7 K:Qڑ0Y. ?>HivKR-{qӬti'[\J]BFWוOĤGoB C.vnY{H5!!&XoWN'tu3a!mB 8K,ÊekW|b{OBߨi+ynF[*#V7f/%h",5[-\3C~r|uG3sse(Erxn1!KD=~qr"󂞜*(BX[q2a E [r_7Nm}= y7Sooм7E( Ŵm,%wk\ OkO ޮ<*7oASq&v>ţ1=[A^ەzU.ݎ:oukةdƅj~{:T䔬&#⍝Bȷ(?}os>wR0AŮk{ j' ~-;fPT"ؗT/UءCRlP\C%h{륑/}7otA[s'͛7YV\tt9{cߴڡ7_?S_^Z;#H@_~=Ь_b,3So^uM_ F..x] 7 dV?3a;Uc1Bԉ1O9'-k YOy!CVdJ9y-Y\ƻ/ٓ_/ub{A7}77I B@Y؞ί4I%X̊5a'qE;|cj1}  hm|n׼i<]UrI㙻 dG*t~ }F:v@4kfm5D4uDС|rihQ˽xDAor+V[w nT' g;{?5󗜰)*b1oȟ7nUP!ևCz[|e8 c rWLI -y/Aif zmHABwE>F[Y|F6̬zjmnL/nzNFG+'I;&c_:I*[]-f\V:>Oe-ZgyW8k 95d|ۺ])#=Kԭ{s +ϽWC>%tU.z[-#Ju.h0x/ &A/ t5Jns@Yf@ ]W}aN>u1: :Oozr`;zW%+%njz.kh^ȩ:r J "x)fĂ@ut"=#tB kvŒ|JjDWVu ڌXM-cOUJ.BB\/zwJ9#FʽT8lI[^bxvW bZcENDÿPCe7$_(vQgu3v;q3ZS/5j:uˍUI2T(όexv cL` Uۥ|@yU wR&]2rUGun~wWyE|h^zۈr=AWV'}#3z7Q6'/l]t #}Yh-] v`Q[zJlhkDSIi{|וi2/T2}b#wJb˱fA{\.#bOO-iD%wy+r8ΟuFϳ6ly;ř9Xty%1pclTY,3%䩇 \IJͲ_$` %/xz%a"Xue*2nd:> rSLMw$P ݙfVh%f]VHSV=z׈zz H_|2 yKaPY/[P8c%n.pLԡKl(JLןL]+s[=^p >G54o }tĴ+όږ/ =u.#]oWiG:Xr~A{bR^/]hceMr$B30KR1Z|EQq` r+D/:m8irj\2kSJ}=mBFNNbvbsn/΃edލ*EinogO4={断w$n;":XEu_eIhqik.ڶp荡9dzBH t%.t.rh4env?nX}DqڿзKmЛWl]^Evv"oi=R.Kn]G@D|XRed'{1muS_b@^: der oWC%jlL; ]6^#X=u ̍އq茽B'/YrW7"Y{|gF.9.}U`S_{KW kXx]8x.uybo[R]԰njD^g=WbMxY2FfnSɂ#9{Nz(KVOhYEлw c~UC`hA&ہӖ`R--Jz w˨[uʒҶw/F h%-:]cڙ\a3]za?9jzF(ڨ!nl?ɍrۮXn4Y1t. "./7ra]Z[uI_D3GH7pimr`l=AOeI|r,Z]ŠSF0RŭqYg^5@&ȗXN//iҜ|{K<'B-d"tgd?`9K۴'>VEJ!7_l ol1Cg|kx~te"X =˺Fsht_!Ev;ggM!_ޢ;R'c@Ot}h^tY2_Tqmwp}>32#=Hu;L.a> %o !Lȥ]5=%ػңȽ~.2⢨'Jaf3ulrE[]_*4ىrϻ+tu?G1$m _{7L{:ƾjy-t Qӎe@RzivK/B@Ȇ Sk2f.Q9uא+7v[@+Qy)I@7]nF0IN%%d[;5CJA }^0K1!9~Q!Jvce(a}/-i^> Ci^ەxK$yE1U+ `似SHӴjz gFOyH%;m%l_Ly;5=c /rYZWK}#OIA% Kv4hӷV#slN=_ ^̼=\/5^,S/2o;S3Sr/fit]Cʺ#{%SAIF/ S3u5!ξ}kZCG=c?6nxmmFf,6 xM{i}Kn[h)1$l! %m{D_u^%hR5.sga,w # ņס)dPgȲё뺾F3ȶ@_/?3 E{"#7y#;rK-@Ȋ ឹ؉\3Lbt@_!dJ纑kAfYԿ-w罘si?t{V;o$ -uz ']Cw-CWu胼EsbYR vuv@GZg~"]q&d}$Ց BJ.K"a֯U k"e14h~$bn-İ:Ǩ3!:YңQTjtDƾ-3F^[SJoÐDN]@ϙ/C,tn;V5V?zh 8ON:菴N!z4"Z"_4fKJmXwֲ<_50-9_[>O 8&FΨ6#J {JE@-H#vi#%N}ϻZ9tF@.#/;=pҒRnjvuJ%Uj C^0$ς/:{{9Y^tk4!^v_ДkE."ųUIGv_W>uvd+" @h#pn`q n3qxv~؛-Nw]0ɩs1HNA -v:;#ϑ[IK+ijOG)u4W݌y9_(}N{qv`IwXCfӁEv),qBz][]Z R:AM=B/WDC-{T iFOzB;4elFVLIӹ@%{h l5&;+%A Cx+Ż"Дq `*F-S4_ޢ^ y2TΘ3文7hr*tGƞ޸7G!.:`<ʣ#zq5Vؒʠ=-+uWհ' J%u$u|}\=3jSGHxR~Qe(C;T!W̽Izv`JBTΏ]#/RH/4|$Cq:pۢIB S<-EN:s @4rYJ='Yݑs\chWyxZcKwiD ~ Gs/@i>OE>k>Emլ{#04%T0cF%9- It֫/LAoԲff=85#T~7 T#{^yιhwݽ($/rB _E!qjy}$Lc~*yWtߟHR/3;<[%]yrոk-C/^vnGK ZbB~F|+V'EN>Q^: IJ>k|(5j9EQ7enʃNAA/5ڞ^WrAϥ%փܖAaE[ۜу'Lz^}'W7DނW'Cd=QTő!LӁ|7!#l^ /~[n6k Շe(Z ȷmM~.&4ښL:-ZnzDx9zv^ܙ()u?&C_<ȓ#vF })Y߱3JN%r;IGFN.IIq)˅}+aq 6]פg}b]WKsN c9xoɷꖙN z  v}H_=]%kIՁpo%7;IW}R|Kǩ7J|H HHQ/؍$U!{M聀^rMܙb;'vd`Ty${* )yD%?NoE ;Qr%5fd/@U?G"yo-8''R b'iGP:|pAcy}O7r,}{}͝;;:}˧".vC<0*Q!61"'Z=x|C>Y jo͘wHa2hѩi~^]>M&M3dĿ? zU߃U|^]y@7j_0s .%M"?ξa.8ڳz i=x<[%~^Cvs,.9Wl@aol2kV rD %Z5(hi.` -LU{$)4 /NU-FnON67f >|0 *q$@#ӯ}&rb~_Tq\ۂ8|[=9 Q~4ߓT0`cͭhR荄)?bۋ15^[kcאnB${o! ͦ1vu3t.k|iUXVW~{]qפK0 h~o̵Ǡ n+}mXqϽq< ~‘|xEֿF!ksYpܠ9Gž|ػ5oѣ4KuQ'_< vy)tlxMQo;4p-jaH$3ױ=ӱDZre֭?]bkw?{y8zyN1.~ν"[D>& VE\>w\nvζ*vouJz[Ŀ!!DOk5lqMs$t{}zFMchź|{c7: nRE4^}/s^=+#OpL,c!tGxWa;kzR(aN(CL~JPRtJu w:7cnd#߀_>[En-R?1Kg:4,i^PuO V:tݧxaEA:/\t14s=K'vtp9kk ظ-"tM-F38{7-v|{z@GKxE9 Śy|cV/JЭ)~c_CӼATl9ɏ^2EDO=Y ;7;e+RcbinÀxe/=iT 4M%t1C?sGWWh $}cOMҩ#}&B˦t>Il&3<1'vf3{-gRI۹U}b&Mn#\R톞2>?V v7:t&K20ؕނD6_'{U?S!f4LޞSh9[> B_}o\sE~L(a.A׭fYUݡ|sԔO\s稸G*Y{}hb%eO8RڠR;iQS7n1Wܙwh$08Vn܁}wh 4eo8 d-8Nfձ4Fb%fٿ$wsgةAch"4Ⱦ)n\o}fZ*OA~4Nui]u؟u?&6Zm9As5\;G`O/=x2`Nf\#[<; Ke`(gF # 8)ž1=ŭ?Կ1-WEHug2>Ǫs x >JԡsGҳW#>*4LJ`Mը@/[IYp.z[M7t`ju}K`W/avS2Ǖ6:@4)Dȏk=_tTMH|<{n׸2 w~j3KzG^/#mndy_co2=dt{&v8U ]U9O;fal5)?sq~Z[Uz9r}~+^ؗEJR<ɋ _Q"Ǽo[ڤio:qL\&-́Hna/#fq {7j֮`O'N>*2=weAN{RN.6ɓmz_jDOjc &;l?6EȼC^"Vll[]:tϋ\qQ2.=͡:}E*7vݛ||AkZ+= KHy$=]ҞЉ?G伲@k>W`\]5F)#n߈ѥfQ34':D叓l,;vO꺱GI>nq | -H/[E=7)E;8k/wY i*hk k lſS)K {oSmrTl'M7ڒ./v*u3c\m)Դ׹SY\dNa-BZ2+^!qFpRH5i0ǰJn+v0nN/qۤ47$e* no *^pk'?o/U T?ؓ|HWSՒF6*$Ö6g =[<s#~mӿKUUGZ/ްn'$Ǐ1r,KC\5J7qj2=Y+%bgK1tNf~E3[)(6t[&]Ct.!F2T{{xUK\GY%GˣkǞB6dzv菃b:M`9'~Z2Jh{a>M1Z"z$a{QZZ%ȡW祾d[UkOHj8DjM{rWt-F_6}uő L6rؤ{&et6qÆRA⍽]ճ-ܐ׋k6~s0k?ff4"DɏV$WR)z?/ƖT[;mB$= ~i"eNh>j!7'{uɯ{S_۫wx%9fQQߴְc^y[\=MF/-гF)QBw&^ ?]BlUL2y-s_3KWD`:C5Bϑlmc{Ms\حz;Ub~i .`׌lz"x_A {9\Qj)ߨ#:D쏈 jI9Y>c"{]-w ?>OL6Y`-f&\{V`R;]!<}KO]=[VtV4ů1 % ]w|[W o㎿WGq>w2Qdr_52bж>T$PK%{9=-E53ְM*LEH|Uc Z`ߓ6Zp?l^64?i4|Mt`D@g459A?iĨ#/(}o2q_1 2h }|uJ B8s|-E/9o 4I3d&R`Z/?MI܃O$QtDasqwZBTtB yi.VG >v1v' /!k7]$k4}ȫRӀ 1ܒ=UIMd*?^hyc%&XXUǹ8]v L1{r7fҒ\;h{{MI0&V9-IkdIFFE$Xlipnwh6'c~&0E|A QXx*;'}yaW1y՞mX>Vch/񾖫7hj!Ⓓ]Ʌ_ B[H +2A~7qKgz)RљTkȥI/= *2fゑI G&92eMfu}|'ӵCMJ5/천(aTJT;ڒ~=ي?$yniDR:5@b$/fA Yq%uOu9d,U? q =F끾Ne]Hm `5.qܧ,{nPI8Q>*A)sGi~ eoMl6E~Ov14]uY-o+WЃn˨uL+vl/'N |!olꕡܜҁ/œų/^/qɂ=MM9qIm:og4x߼=L: pLj(f;c XZGI[ٖ{T$,uXJk{* +CRaAEptgN^䬳a_)m4^Z[KvwW7,3=΅d썾F[u~0}Qmy |ɓFR r_Չv;7H2H zH(L^sۦ`O,7iy&OZ~7 F_8yZl[+гY+ݙ[lwp{Ёء-emr@;/x>V:Ao?B!?{bm)Wf'd2)dF֒kKZXj*Gk#(!C46lIzГ*.]&v5nqG&əIbA$ [}&Dߡۓd$r#{pߖHin n߱ב,)cesD|'MN߳;tBc.{dIZy h[KNLby?ԵL5jSn\4K5Dzq_%6#^sL& h >pzqMk,=9,*Ztʸ^V넝 {Ɋ4 {8xL˽ع)qMZOk9eޖ3-"JJa7v4ְeQ^%#⅐Zx/'T~=+^=_ixcpIq[_A$o{Gnwm%qJh̆GEu2cֱq$[|f^x߂d/xXHi܃BvB瓞5ڊmչlN*c/pwrdٛI }oˡ .9 zCUkxVrK;3xʹ] Y>e7S] C9jz~i\ǧiq?jf ZyAY߃h3Qw?ɨAHzJ1'|cB䕗{zQ{[ó\ƾK*ٹ]fǶ=x9}/ZS7-(g񥘩]^>g%j? }^:ٽ!PV‡|{BDNiozG9&C{" =ؐK>⻭~e CKǭgnzWt ȉ=/dйܖrvFz*xat3 *yN]Cka:S@'sd `8tT)B֑̏^{D>y{_: "g,<{ ]֭N zP@340^hR_]G~z,>%3hngP ^C( Q'T*ؓRNi;#论1EEo5ǡ 7$P^h$[p:2ɹ=+ =!)9p,UV*MBq9lxP;lB}陱#?<28,=v~r'^LP\zK1B&I=.7C5å UA@bx4;Pw>(릩9tsF8Z羬nU\m5zo*CT:ENn0^iCPaMrbSip.&4BdM06֠'9GO<=52Ŷ48s;q>5xpO$3FT=Ui@EN*"J}"KoMe;bnPY*z %, us۽voENU=/d;t/rst\ƋNH˥r@:M12xi?^zɡt)&Yա1L'-2ox[: |BOuNzYKP- vS873ޯJ) @'T.whV̻^sF7wG2KSX'B>Sb1밷i107$jk+';SVh#_*{:hj>)f.ȧ{P: :YՎ{҃k4GFF3 #mо=_lՅVK9g}e z"@>/fR=L'%mEN\cRw^mm?\6}-ہ\CZiWx2v%h4GS賃"4nx~6_5 z}&[! 8u;90hR1{/:T@ ZO`9m-SE n\Bo%%ަnWi~i( ݗ3a8Y}gr[O7* 3j2JGxslB.rǷ @F_ȍȓSy`l#M C~+rd6y$FTyyo&ЋRji usZ;;?e2"y Tcn 霛/5=b .Mt&I=vb mS`U-:ϱ*2kRs#*s]꾐KЊCHR{)w1H䃝b}LhiĚ]hZ=Sfέ |4%'ԩz޸OS,[th@ZӀo]`p4rE*rBQ85 ?þ(!L3?--t9;Nxkؖev:S*":4Gx3^43F|7.ԛuB"bxPtƳʨZ*6SA.hO#nܖı:th<]w(ˣqiBGC%aT|׬kl-7bq/R@CA]7].捜"MO 3B)<!'d==\ϵԠ׾R x2SAj# \mSв/9]r]9nQ YW\919z^lj-n{$(8Nv-j E3}T5E|Qr^&ۮ{Kŝ 4uG{D^c=^u_Tpߢ/ɘvV`#UW;nRۉ|otEN46ts]jȴc/gJ0r׃c!s:~\Sn`I~g}AWwCFN7-*bLZ~twfi a4%q,Ջ 5'U;yחb,>GYn <9] -S}A/{>륄LFC^SV%H44 Sz5#}aEN/mnd칍>[BS^XIi]O|y=Kf/NI\(ϒn\Of[ =KN15@N6 R#ҾtӶf Eb{sdD%1B(?/x )gFYGk)<Cz{DDjRt1A2M9R:ZxMX̯Cދ]6"ա{udߔ6xghTwBai-_9rvhzҥ=68暴n"=;drwץN1Nȩ "\x`ݗ.%)o._=2Fд4y=@ u@3߃C4@ʹlt5^p=%]b,z+g>ZuE]]yGu1ɠ-w0_K_!w/<5޹KT؅-K@/iq^އαƐ }]WeT[I~!8[8^\c-(^\@oAk2s9^4ؙnO냜\*؟s"ӝe =ս% po ~Nj껝QMoGxEރ P:t+') n-Bz K|=;%I>FѨUh$ePG=SUrC/s⅜*Ցc[y~Y40[]hSlù"}/ب Ez@\Wk=kD gJ9ƻӭ۴|N}n4'b1d28#7I.Go&v=C]~lwh ȳN1(Wk BK,MQEF^ݡẻ)-{5(jTSsdwF ^dOi,kO"s+FND_ x0o@&Gz~4h\C]s;@HJyإ}{wBo6H7~F7jhbBg|EПi%wT22p.u-C%7j1򂽫C|5p%.A| g>n;OigHB^|H1rQ=)@ڨ`7%ti` SkAZ3Z+^k( -G%=;r>˺:KH:g FaU+ U:o\Rw\s㧁#fӈJ^,μ0twi3}U]Ij`l9te)W$:rƸH'JES[C7vs)+JУ] fe Zu4kI)տD0zG }AN_QŶDc{udn$C_99$bl岁[ V~d]==Xv.Iem݊O{^k y,E\h$FܗHD^`gS)ERftGuy/B./ |*ŗY C yN x)+[ j-|kfCh>B\t唾&i 89mH?츴=\\ԅ|E&d5e<з[ 3<ȩ7:K u5jdO'@/qUکnΌne-=QJKY.;;12!W^ea6jd{=%RBI1=[|a;|K+ b -G/In s+ŵzK9"}y;i,ػiz饧y98bOspHKbH?hY-s#G q:G٥ Qn<%Vf{ud16r -byC7v5(0<,#"]9t˶aе0tL5"ݡhɍ鳺KMu9.̮B9tKicy2ovIhd#V(`иfzF~"KkEt9 Cg](]Hi~O ^T#ݗF^bݝx#W6z˪\rs=ֵH7􈴵#E^බrQ7LӹR:u;/RE/A'Iy/ 7.;t5'Tn<*S.ud^ơƭ}_-&!u":K'쵺}UuХQ_Sc)!Yԍ]dvF `dNҀFр9S߁$YIWMwV]=4O9{Qjy׸Xg4/ t@Ne-a_!ӻ[`Z*2rjN6}Cц^c)pZy@Ӥ>"fy!i.<з`_P4Oy-f3SH:rVaHk@>Yu_ս_^#:g[~T Zz@ۦylsI=ENbȅ(}ՙ(rȕtiACkk}v;c0;'@RظtvOY;խ}q9eq tNIyn.)jscT2r<z˗AnKhf8t^t#:lב t|9SLGd=uK;o*Y3^xeWdPGݫܰH\26fv~i6_}{)!ȠK0zQ_K^ǜ_䲤0E)9Go\U; rt2I^'r #} v\;ε;2gG?gyu@_kWq9I__*ܪ( ]=6hEˁ9i6٪G=UXdt_zNF4liδ$A |codAn1[;ݿtܠ;=wkĹ0rJ6u԰]D7tTȮ>oHj?C\7BsԤ ?ҙ*)v@ohxivy;junYA]*k=S걔 y5ܼ#n{XR z2ߜ+nЮYc</A/L l+% O@}/3W;k_HaZ/יCW=[uhT# `hhիz-G{|Az裄7*Q_Be2G05 lЧ޳@J:}]ڡ{q煜sW:ZX@PÖ(H)4%dz4qԟ6Z#}#oAPZzLץW\e)Tv|C>sNb>ܸu]i \~4n#iu4(toR;im{E#ZMH[u{&@G(BIv |S^O" : =/7\ƻsK]i֡@/^Rdwַ0N7hTIІg?.t9eksr4?_8] 9am u)H{Vve5Ty:b)*б©joB=GI+"H3jqy.[2:-F#AI4=] tEy?ѭ6ni{#Mɥ/?frv-{|淢ɨe,z*s7\\cHGͽ |#`,*?7iv@KҭB/I=o}7#vbw/:}=ݘEn7LFn9t^ºT y[Ds]{TG9sPGhЗ }q xz6m'mI:?8W(>?QdqAFD(/1pNMlѸ۳h{)ȍ:x䭨햜?9s:̉BoKE])21C'Mu@sh~ M9G#\2ulwji\Ҡ[uYa<"HFкW;}EE^:/ze uU,.G}Zi?ЧY}\0~7yݳ[_E"ߍʁܣ)tN-Wö&˦}ۦRNJnRVӂI^te6Tr|@oa}["GUu$+;;05uN# \c6-lȤ:R9T[ttvnthR=_ȼBw)瑧ƻ;qy=6w\šۺrˍ|dg_ 4Ϲ.>Υb4-Ft5t͠ R (*vBklzb/_[{69{7‹Dg1mIЉ݅IF4-.ݴ6-tk `#4[<Һ 9!g~|Ehrt/Jml)5w{ȱۣ.=3O4r hVhJ5/awh"{tty2^{_-+4# ,O`"*8;btF# `C!|W 0rM vj^9e."_WQ=&wAE3بȷ{3li拨d5Zpᵱ[r|d$Qӓ]g@Bp.틽"Zi%n$e @\4h=ՁGN'yGD[Hgb P/#h˙FyRcpQ䁝HhTj-FF{ ?1. w\P}}xCϽP z*N t/ʹS$5héFw~Kw(Cn{Nx伢LB7$OZ pz@oť Nш=Ȓ+Wg ))hJ-ݣTxK1%[tdIC`&wJ>YRR}6H'IP*tYbz$vtU%qϹ{laLRaҁ]C '\R@ t @ߕ4^]a@0+-¥(K"Q'T~ tz Og2/hgiyNl t;n܅dRu[u7 lt*ѿ~&RNNӅ04 }1wx][~yE>EUqm}5䰧dBs/9w%Ց޲ h0J$FR_-V0.&/9mQf'd^x=Z =(x^ب͈+t$;/tYX$t - }Ci\}\f԰åd344^x6<u%Ft^Qx@EuԏȟыG8Qh L)(2^AV8~FuInЬIlT?gҺ60CG,+$FzYt\=9t RХъ W7Xkf^V3ԥ "vXEMGW rBjz o}gnJCyM2FZ$;oynte~I}\+4Eط5h`H=޺)k0^5= <t bH]\@a7S92F5Aۀ#NTo30K>9c|'qՅ/n_q4hw"]Jd9QPGno|I`3/SQq,"wK-v+SKltU#0̓bua.A7IkuF}G{v? M0R1>P^W~"Ż4~)(u; _:>/h҈"-W3脑빾Cj:5/t.\_p1^ěޡS4v)2صS#޽Д2)Qn6 eA^ö/RlҦ{>}cTRbM\{y h|FKn [r8ȩgDֱ29]4¥Aw}oH3q+ 3\jx҈[=܇nmTC' YA_/s`a-.tR?Uv^`߽: 4:LH9z:/(ONݮY`:Է> ؋y2-VӣRMػWC} <-um |ޓFR*tҨ)"טJI!5X9elرBG<]ܨrx[\,ЭƔ{yhJH9̺yyٙnӀl"/!L=jBKc@߼y/7l34GOe/KQR0 bf@1f?ȷW1tz&@I$} ܦj+ n^ 'T.b -3۪٠wgJ'h:gyύFp()w9qלUdvS9yۂ.e=h]Ser(J39udAn٥:0r,7٢7i$m0в/,w[ "Uotx1ҵK!9зqv硇AP ș.i6-އ^l)COoB>[սB2悗5h"v 2B>F zKJr|- r jaun5p%h =ϝBtO+J2= ܜ.5k%= v5\hߌz@Fs>fIxHCҴzz yCIީ?{tЄtuQ!wK3rYwd:s-}s/Dzh]OatQX/R&ϩץ Q Fo9xEK}/zIt5/,j3#v r]"k@$dh((eE7مcNq/߃|xtҕZWMO +u+]y=:VoiG ;cLN+-]>i&?țE 2/EԳRyx;2o [a2.˚;r0>#v>nяEIBG]N{ӗ MœRJy:-zFJG`:9/@ϼB H-"y\̷GM/ŵˣ9qއMgowT>QP?R/(;Lo/6HD ]^sHHf9\hэm mAByl~qPu@ua^]uMs)rĊ6Qd)__"i'Eߥ||%;R;!t-/7rOy}̍F8#htߕE.7_p;9gJ2Rt)m{6k~ yjY'4ii4{Y@&%QܲryE1Z}FNq){OGwwUsBθ ݲM)jHm9uK;G_FT4kj9 rԢEAFE7Ԇ1*:C_4=Kt_@iʼ#];EV((Zf00B_,q7foQ uiuRQm@";O},c*rn*wrD΋ ힾ'l9\H儮˨)fQ9Sӗq;rרg?ȷb)Ng!t3|7t^;iؔZӺ2ܚ.R0뽏, !_nYϩQz o g9o;6S rD={gqTf10y[fAۺ>:.{ !'.%_~}%T0}q4w9c2K=Mvsh!LW<m9x%rlByZY#z< kth9j)JOx}}fgpI7Ζ]v<]+.:YMZQ]@mVC1"g4=%>U&Y zJlN*z拆Ԭu@J˙/4"au}<$w?ڡ5 ȅvNk13k6[.k;7 }hH#Q  \r;Z37C5b 1c?@/r. LЂ)>:3=u@{I/JA_3zyS>fP=?s=!͓mu!pꅿuU^3z<@zMS["WBg-lw#->{#/^:!DI@Q0"W@ރf,רЮ?6 jϘoq:nhJvļe@@.1CVCDkj8|?\FSsE=;|È=֕H>wiUL$AoҕՉ2"]fr01*ՋO+]b4WOtgkt#辎*w JîԅN/7Ղ+[p^{'iZԠ';+Y}}!}v93koK4VK<.ti>6Oř_틽/Zs:)΀|&-4;n̫2:oc!bh 2-SC |eUq1{H?ИM-rn3{w|$k0x>[4P| Gb6ow媄}ײ'g8h)AS4sbqW&%gutU*Aڀg]^d3u~U\!{cZVl@$i5">{Yք"߼FGgهs0n} 5<5 =7.l̴c{'x ۟yBJ %rʯ;gB{QU7戧 Kpe~MdݑAE-մoԟޯ*ĀȘ[6`$#chBq}H{cur 4S+}-bsjnq1+M_/GboYHϧ%u}[%qu5`pNM5HNfMꈒ{Ĕ௓ K ޖEf\uD:^}/})r܁ r8⏧&l{3{ z}hMX,߸[͸b_&ddqɾA5|֒aSz\/͓v[qD 4ž]`@ }stO *V?W~k=ݳ2>[`(qf49֢м}oKWlsU┾xqg94|5 >?J˄@Bo"* Khz:RG+opHs 9j!̀n{[ף@YTWm)ѡ d{U[|{ n?b_{2?T#u+%c .@f<6x(7#[R^/Da%b7 }+idz)K[ 6/g5L[eȏMzq㲓Ȱs6 ^b@687vɯѡ'‹[Nfg6ߑu$X~'$ĿC\Ok7 z`Zu\4#ZxgH",m|g0 yd0E5~\ {aу:t1BtOT՚%LPf~g?ې~w&=P+).[6 י- e,#IJq<Ůi }ۖ ^X }sF??f]5 qs8ٙx^C`\ ?w`KnoOqLm+-!El@48 o𳬡8%Qd'qH|]bc6IizC_{ -jq{?m'ϊo{&9k`Ʈm>qv4Qd;o)Ί5M[O/oŠRJ4u^,ԡFә{+rMG9Xʬ*k"NїeRUd-?bĩww]%4$P[6o_`5|J25 Vo'Dȵp/k /qԍ{%]wf kET͂mG {)O%M 6[Aƾ8yי66˥vGZp(79~=vn=,Iyɔ]k'%@~)I4MB~ @pC7O֬VM:8EwQ\\%(wܧFVac/!%!w! B}ޢr-CZK>԰c%N7x}'3ȧ 3?YSjn\}>'$3ZM[z$Wƭ`PUTf5Pr^z'YMF2z@dk:;WPJ1gf͌xF2@SQ^~G >0H7gxZT7x _Ro |r_-rb*@w3}2+?oC 6R _9͚w>5㏌[&{8KmL(>Hv*KnutS]{rhPbޮҮߔFɺK1ϟk#sk|n̒ T!FT@]N6`“A(12nY=y]Vuq48YtB^jlj_ij :;&)7yiXX<mqa/{ל>5[S8.n}lsMhjUvU㞢R⑯ ;[b U*vvF!c'o bk1+3h~-rqGSLoŚ 4ǀnÄ,JH6i}8Y77|oKq~?[& j[&&'8= wɴCBrZ^yv ` S1jcs6Po{ZCؖ A{i^,mI5<4K>2(uV.(EI6[(hAjM'KL'ZnhdU^C[?P_du $cSsaCܚf'e{P2G$8/7i#=9& ~ny/QIA"_'gC@-^=ԼTzblOMzDCюB{=/]^W4"S f =ЧL7x =Yw9MR;i$7-OVAߍ7\b4^4>ǍvKWR6#rW 6lӁo6h H=\~o$kEq`ܸSYwB.S>#*Q" HkRu}D;`>mޯڲw5iSp9IO{cE>TS{A)M]}!,%xdn4Nȿ%KȰuםt@ A~ىәuc2# A2عJLWF]6;oT)*L/HrGwJ@yPcw>CA-(~UbG !Ow>3O#@>5uh$Q:aX@S`kQM 'c13QɎu< 67789sHJ9à4%{o:Ӆ_yOAȀ\LɴK}fJu}H"~'@pr^)%˚e ;D ~c!gN=4U&=4 ;qr:^uLU4_y1mYn}Jɘ_7ܰSYu0뻚FmCoѭOC{Ztz@?mi21V Tbdfo\PV6o9x16H m%cd6uɒQQyo[=oyZɋ4 uaU\??ֺ89ɇ̯\pڠg?9>/$_욄Q钵}5v A{>Gu}C9HC k!+ ];um9\]xa@ނhzEEv"yJ%do©&kj)qy]?pIrcl{6\b s>>7viКWdl~#Ӭ/]'>5&jOrW{4yĠ7v?Yg2|߇s ~hdLWNklpby5 4)WߜK3{,(Ź?OVǨ9)^u5le,[lġg/贈ΆmMlZ,q/7 B?2h; Z`9?/'~Aj.4i5o=ڳ'hӂ7~bq$4lߧ~z?5\ ^[`oߧ$>3fOśt [ VʏXdGDǻ/!dexk䍝 JGf-!Үq)>{2D¶I([ڞ]|[߇b".VJ@w{>?H#V|&c~>m܌`͠We&/r*Az}`=U=f]A_ֈ"ѕ]vƜchGEN"oL2cC\mL@og O }^uàL~ Mn'hē.<;|D/~; XeFE~7 oaeVkYN^p>]~ZFΠjUgVA]\> ŻZCF>:JK[E'2tYh=KL^(GhzQ>ћ1t9յ$v/rt˗>:rQrfȵ iu^tSD%Tl,>}V,kRCXq+"B'kȭoi3my'93OCbxFB~9@~b0u /4{fW%D5Q]|S?1ҡFb9LWnH{n5:^vA)߷9*C#q2)􇔄O-,-e}纤E>%`^a JK#c[SlMHq/r :@&wrE0?}[K]e%)M_H@5c6GNIŻ(:RYޗUn?|' 0𓾦~Yb8J7#7u/FM$ɾSy"WBբ%to[KS:<7u/rB .enK:}]_lFgKy{.rhqwdVhrC%h,!钖>v %WO} LU^37/ŏ?D9" `7/+T3 @Kb;ӓnnKʹh4E%mO:.bBŃo˺K{'(FKX떫 h /Կ=9J0l_[FSw QF]tՀ]+| '[i :vX?vpk=t^g/B[$k i\w NG!6[A]*]邞{ :h"8YN}@1c$G| @d^+!C_]i w:9]7"CKZ7ǣ7ܬo"}ш9o {ƖlʰA^OZƁ\ _#CQu?9TQB}Iq<ZRxk!2S[#Nzz:W_"I&Yt&h 3]hsqtV|q2"_+}sҪ`pn R 9]<1~ pLw]I! 6`]Is&:zT}JzYv6͋bl}Ψc,y_Rq'~t`{cO]qDn $: B[`VwhnksW|.'tf/2}kNZwju-A79<;ٰ}IH. ْf\rh|"s.ӱ>ZLh Jz+=C.b;#+nv<,r5t9p!̕%+2( t MYCRԏɊ~[tF_sKo;-IC-)t]tm{1ߧQ~G*.9a z@eY Z}l6p&Z:@#֥#Z iɤ/m ,݂FE@y|*ujwg"I$Wm`Kv;h[BOdM$y7r_DR@AЃhTlJC΋^:`|i\f6;]jĜ;2xy^^ey2EAq9+,犡1 aɐ~9I|\!m 1}j댠L],*:| iF\{|I vy#/AToOmJ|}Z<-|\w>]ёC#]$ȓB{')BLqG@<ϑ.$Ma#FJ| ct7B^QYI Z49C?RqBWf7.t]Wjǖd D)L@ߒz}tt!ZR)t/=F3Bgo+ $:˲PY(5n4-5qP 2NRAEȠmhR}5tz׵#9shѽ~t ю1}i~T0yk-9*2Ah醋M3NUڄ0@oc.{y[_[ R[&)8 /:o%q`wu?ZK.mVւNTpȷ}Cu=`(h|bna"[|7.@NX,~Tg%z8;Qw#;a k=H.)-oStܮ Ӗ__]MD63 `9ﭑ:)7Ӊ :Q/^| x-~sr my(b^t.FK\5Hdz2-ϰkj.C;3er%3Şxi$ WF"wJ,CSqAޮ鮷vׁW!eVV^#FuT@GAِ[;o7S#tEO[T^އȥ&r)"ё:yJBSGc;q^<@q8s} ]L~1&L e02t-9uצFQ7"f'-D* a82r h,|+6pIOu!k]]4\YvTz;uTW:vj 0Ԍ Ivur VDރ9Ϩ1՗;fz JǞ0R;ӓ˳~&B8ϧQbBW^ ]k\[';1N$#+qr_e`'@qFJW#C 4d1Bۺ?ȝf$Қg^AYz)2ۨx^Z{c#cZ݃|~bqTZe_)vN=u~UC)IX4Gu} xu >AO׮9b:֭thZ :;KAu=Sb]-+kij|;x\=p;[$g/|IKi*L9e|#+18ƳnEcd5"sHXߨ|~ P.Vb#\7uȧBztq@S}öߣ,ϴ# Żhc [)u$5{ث@u Fi;xZtlӋF7Wǫ>?7ҵjVh܏Vގ,cIv(%QAnu1~]6큾9i\Z꥽j21l9Frȿطu@-E/ȰٺvѸҸBK/gn {.nIGfʯQJj:z t<ijdt}+v_:ϨeFmq~2pFw4:yX[cΨ#^NЋNl+ BLУ]ˋy]:o+rW]-JuT7Rw^-.!I|Xw.((/:Ghވ~綽nj,#AtY*Ў }]"-3!ځB hFeϋA>+ij̅FT;j1&HmcٺĹ5zax2º=Wlk~^-Z:_A׺,_:=Xwqw{:2`F/_2M /, ڧFRxo*^ E+loy [}r<&.*yVRevܠs|MD_9Gxq*A0v Bk[K}'D:|\FNQ #*rS#{\igԸ_#q)"]\Ly/Ǘ_ S\H.)* 8Z>u@ss_mP_)ϐ`GbY6Do.qE%q8(Yv#h7S,J|ZQ=uNh=)tt7T @P^:,exnΗ[`\eM>-^ 4l-E%꾑h!h=ȷ0huyz]XWrw)[ʼn\ mh = cx馫Y* 2Q'מfh*MNЌ(5#]u8,?a(djQD^tc/U誑Rc_snN9ttS4_I;Ĉێ ɒv!uqw!h!_yґӅS AN^/1WqKD|狶uE7zi%΋E*SA.Q(C.3[=.\x_sozsSoLط PC.L.ƲsTD3czWSzmڊy%f|{SocQ@EץTRXOiZ]GxJ@/n2jӪ=ǺU=F>Ky\}z2%=`]iW(|/TVkleX nL.񚍝vpx%άC~I7ϫ7꒍݃hGK;$R;Ȭ%h^n M $EI5pU44zsH2Oz7|`]%EΌn(W>t [cA+1:R{[(< 4 rbNMiɗ? !}F=Eulm京G*rsGZ;}LKe0ol_zobFא4Y z 1ǝG)Z΄"Oie@?/D 47> TM 7+*A)QRweltO$LpN'F.$y@׈њBC/ji#1t[$MRtx,Ycq7H|"@j9l|"K.IŖN%9c@s2=id94HoLO:zyIuopۉo/ VXla̫,C<蟘ұ|jTj)S/{E̗D=?F-c_v^X}"]ǻxAte}u鉶H;?Rq#a,5#=<zZJ̻k?Q!lglʈ6T$b#%g7èm:g?ىhq\d,"-gK;C-/ԠwiKtlz@XGGT2R zvFCfG:_亭z/9--Л!'t Q$%$GϨa:>/mBS^z+ԥXI_b5/dvfP1z즇2* ]ţ^wɐgG9[{Gjgi?RSy0P=b}wvkZzc\\CȃkoG2@^O h~"W_1\@ zB'ڳaO{"`I`׺zRh4tLy@fxK9e]f7NQ'd@ċ.޶icnp}[B{u[N5=Grf:;ߟQ6l]j92z8@%Fl@Bb> Ze6z@OBo_z#RE>UyE.e/3肊7]2$ձ%Fb@ɒE`O򔏚)eȫ71nՠv=: zKRfsmWK s*M$L-[M^s@ts7>}G:gНΌowCl##>疔D?Й3勜]@C֨O ׋wGV 9bAN#j1CaE{.V'ӚW%6v>>W'Ikv ZM?k5j'Z.dv{3@M1鶽蟩A.wh_R% zaLaPc#ZTt_?AWʾ<ļ%㘡=zU/:!]7[ųۢQT#-KQA~wGiTn~[v~v yC&./sZJ[_!x6rIJVhn׺E+cENFWroР0y;œ"rZW%cȫێݝEK7CwAӻwR S SyK{}#٤"F!2Fők<{V_(nѬ$kgQd{@qtto1)@Jw<۾"hh'r[uWc賝XF>%p49$z4}q>eз]F+M~32Z?veW-qBWT/=/ȅoThiTЗ}3A0U:b/i]T:H7d=<c|B3-&|5 ͖=T]#YVlQuże;Қгs-Fh|_N}b+C`7eB%3u.yC*^^ ,+yd]{y@8au CRzֵӉWWdzxOlNr/Կ-RNy0mloUP7WGv'B1E4zC#F;M#om|Bcl|Yw.hv7LcnmĶFR\(I9lY>ȷ|[v !-\pu7h$+|"JtUpL܂z< gk@7't?I;ӥ^=M$Ė]ӢzN&fBwŃ-$a/ɏz?,wߝzzԺk476nF%=Aߍ8y`KlwqcyzЕgdikM2^7dh/fՅe9t?2;`䠻/tY25M`ƞ]S[;a] [/c+o3uyNwkUdG=/@F9s/l%ȵwD]G: {8:a8Oi^J=&/wBTJ}$) 7;5<|Yzċ;q?G] ROkw:%{469tY0B{P;iQ4:N/&diOyhWz m=>k]-Y@sQOIOǦROO7ki_pKď5 2_*u@ܘt;5Ԏ}&E X갣{ hZOQE>3P nZe&e`'}FkQ>A% wuw;uZ/5֤Ąܔ8B^;W7A30//5ޫ-Kr [a>ȝ7UWcdH/ghH 7c;{wExi`6ݖ)f) 책)ȃur{%]$sƹi!m 3"_; ľi0*2{IKxnDW=ȊfDaZHWU@A㑋ե1躢>Z-TAkcL{2YjK7]:fIW@)i24=CfR9TN܏H2c5m6ŀqBmtCnO;ZX/2B˪U'/Z_HrzG+(k12w{+ JTda5FA'v<oknY"z_GL1nxt`^nIXO$a\/1<-o ƍ_ *nUΟSm) b?|ޙ #ck@HU<<%( OvdJ4>##] b)#T4UC>Or?n5MiLNƽh{؋{IfC :[(܆^TVN/CNlUuVu[#3SxB"C {.sz& K˄|vkǴ)׼Jԡ;90˸PC^do - U>I_^7`3y$,| .N7RMSY۞):@1k@g%*JB ]2t X?Qi''=LR#sz+똴_ثymF^IBubTl/ZG>4f#'t _-f[okzO4'C{3[T`Ͱ| }:r^G]b2/FWd7}G}rBުsA~h'Fƒ& @k\USGu3ulZr8^+}ÞrmUa 8M G7Gd{7BNi/^.a;ӽA{vC\uoYo~?2>u MgNCܹ= l#&\/*UenE!ؚ ee }Dl'ϣAAM cǓUl[깧|G(zbwcfӡIL^Fz&m׶\]pok`oHn^CηF`Zl'jkNK$ZA .5luB^dIA =U4LNqG9:QΣAjCNN>(to<Y]W?+I׭ }Ho[a@bUpK}q00A-򂾔 t[dCAk`o#l}#ۊ>&u6t\:Y2:>=-F$̌sl:CZr2RM"l&DY*ɖjOܣmME?{R997{`\oy-xϫ7Kȿ^ODT%wW5F|==IT.zm$~M #R-]yqߺmE{;H¦'rɉ5XoLob#^=h|# ,ȍotӍG>jJCϣZc \ȾkYb.}Kl.A+$:hLЎAg #oqNʘw9V'=mw*v|iCo+[8Sʃ"̬>5S5psDĞ<9jru*a}IQnl0b.'- ovb5@5x:z>K[NF /r~+n9VlV,9T/rp%]?ZdlP_ z+o *5XzBkNrBo 6MSOl.D Gm"^wYzbPx15cG!g tJ"\p[%O$2۷*ڇA+=Jz2f$܌pĈk3ؗbTRnfOz8?>if*:зrv٣F5\[Uqخ`׋G;Oثscn筗`"O>c{l^h-ݡhV,<K7\@< m(6 O=~B,*'cdBRI1k03r{M`CJZfr`8whemvBoqWǶBߌ5к:i2>~eXu4黮cAS`M{`vuw=luP@*m iP}ƏiV A_i[Tb N0H@})w|\k@}`Kӹ=o;9AOKZf-iqaOǜ~ieIñ]x %5J%&DRuUt @ \Hf_[iWoa ?Z썽]t!ֵЉL+;MfwwI. ^חfJ&< iNSh!*K֤NVG?CNv:%.=Y뱍]֦ hiq WBHש[ŌA~a ݧt'|ھد<i}c?Mfx^E Ȩ|dADnڱ H]GO٢;aA.< T _)TyĮ*}hdi#F̚˴Re2YAa5~aO6UE&+{ :T;o>.WP}kB;-< ,*;&*}utQ:}E:?YYC}[kMݺO%y`fL@5Fn;ʺxo&zF|bO!H.X72mB.VtKH*ݖ!%L]:겕Vʴ8en!}lU cDNC<ǿֲIwB8ѴڃVm듪b{˱m$|}G=S@z^t_.ؖط]6*/Zgԃ_liaO?^FzUbCb.7Lӿ|ޟG}Ns ̞N5r.oL :J ] 4?G;%'eVv>uhQ2%ÐSy{]Aľ%KoZyzfV؉!=%O}͛{1(_nEO0Weu">㜈;{ͬ*APЫk"SmnBW7trQ@|{`_=D.%זtT.yػէs;(\vb_:t-}FuJZz9ZГt?KҠ3HizFdρO^o2 \V{(i Mh[d1M;y7>&{KАfI}]"MؠwǓgᑄnsdnC vvG-ȹa4:AUilIM!$ QZ |BP9 ^_#H On1`k|bo"s`58~Urd-AOo1g \Ղv-(CkB_Rv)pN}w7wgM\4$=SdZrsS+AoEP m/O*%Id19R ~dg 4ϝ#|ϾR"hFɷs9B+>k-lNB2yYcsCy< 7r3S27kz UNؔn!*U7( rRJsBK7A!gEǂĆ{dq5"5閱Zg }d.&nď J /GVg&ILΞ\.c蘜o"ՐLD!n>Ϲ踴]"s )[/)ڹ@w5/Cd&f_s_'oLIf д Z2nyb]^׸+%hʛ@WY7ޔ,~g,? ᚽ|B_JzŞC]Vz}لqx]eO~4>;1@tŘ?1 ӫi^"mA-8pR 6V2*@`BgZ75z }4|vpTv.Gqg}7,c؝J®!Ӗ (z3BAlTi'tL9/A y y׷Qj/rPNfӧb7d{hT5\.Ӽ̓^AJ45by(~ a̜ؗ6D'tb'r*}:(/s,$z{r>jBm)]HNyB\Cj&k@x&cI#^\;;D'v󙞸nL'Qf}i8RB y7D7hZtOǓ:0m#={6^yENثS[ؽ(5 tCu7 4I]' 35fx!ٙNcu)|rDNy*t =Ni1Њ19XN"m%cc bh>%TL8)Rs0i@Y;n%+ oAڮ=Gx,U꼹7^uJT_2q~@'1.ѸI $QAߋwߴLfߥ<hY6l@8c^'v-ZiA-nN85J'Gc^f ( zF1_k岺setA'u! \iI'=gv]Nj3B2b-ύ<6qҚ,Tj1ٕN[xAF *ЃBmAd*U=L;9aJk, 8d t;+S,cӫ%fʑ ,BU *ؽ(tNCe<"1. = I 膌rBo۸ sL]S/f@WutvC :t9L`'Ⱦ^G,BGǺtEJ bMad椦{)G|Bϱt*!'1CdcG0 غ9M-# }iifio58K=+HF^'´`'CG䡼ۻ<%;7N;q:iu!1g_ -0Pt畾cĠUogA&yW@*з$J)?&dS 1P7w8$?v|bPK>ɦnu-@76:vLi/|A'L11}4Z|q! } WGUylet>{ Gv"'r=+ /{M2t"ID98FzLO%]g"@BUh/ﯴUpcc' a_ao$Q#-E y7WzJeiS&ܻit\x:{@vA/Rۓ|ݤ$c*R"\1oRQ3|!=/tXW?5w 9PՇ o#wقK |zAkL|={,-V[etҜ/ArA[a 6XqMR~NK;&DnOtU#lS􃽓2_>mn] T,7vr-dĵ!_)@X` e^j\RO(GPr/kdF췔VuJdž}$lF9ϦYW`_'sWbV;9'=RKDnd-i_Ly/\!3]ؓ [?m+&h9QPւxL\OcZ7Ųf;$MºZZ2a9LAR7hj͞}!C}>FɁAb ^r.;uj HEOK7 PKOg5 ަW@\b}#kdk#S*h)ݟ }^X.-Vsed_{;moxD/goDžNYK&h)Q2P cv\ocI#S*\ˤ } m6R }t8R>Sjw\@֠j'.3^%.G8E*2%j &HPqے3YٱyL yT;I${z08=]ΆlxU9P<¸)m\̤ ݺSFYz 9{7늼)UԦ\iu_W'1mQ <@xdW諜v=?śI ;mjrbq݈9&M+ΒeujN(CHyG74zã"ňKʜ4#o)y e Nvbq55]B'1~硳\upq_WF`~҆x2[ }}dLt]Vѽ/gg\Is8 *qd F/{g(e$lFUH"j6d3ʔI<#n`-M\uժ]T-|f7Pq-["wߞ\1AR}^Pt?ru5RRhVorM:ʺ{J&GS81ɒ_h1hWn',nv",CkI }J}U [LSVO޷z#{˳ԛl\3wګ$>_ylwizB'YGT Sckc/!Y zֱŸ76`w'dBwreEnp}j{1$htJNES!d&aO ۍ]Un4{s(S9gW80^?:8IG4(chڵؙudy$qLꚥڜV žqB混샛Dgps$O)C1$6<;%/y6g6q4GOn ʯC7h%O2;u/ {!:+gޑ >{goIZt\@~fL'fq`Q^e;L +)2fSN;8'O'6+U1[xq|<|~cS,?,FĄѭ~"6/I](w߇>RY~^6Oz!s'Oqks->_WBE?&.к,/NKj׮ q~M4}VZO@Fα^սeN_FO%FՓX$38a{%`uqvD?+TQ$u:ʎ ̌H?2ro4N"Ho,~$ДZ~|K[9#tEm[Z8)VCuɍ^Wﯬn'ڠ"L +]=mຶ̾ƻN>$SX~CBȷeJ ~[Ւ6KdCb,āY4 Yu $@k!JSIhMN?f|"wȯX] C%zH߈\6uJ"?UKӄ |/^4Nȼ9e5#]BϘSɞs8wW}{S :)_Z$)%V7Mn-sirAzD쉽Z6a6]OjH;<~?gL -7QABp<ǝq6,咂-T,g uSnLN[o86 T?6NOSa?ڄm Kh6['s&{5h~o!-ݓC>NT/hv :;K|ѫ5Əh~9x~u\7߰l? ޿डxeWpg%2 8R9lJЄt R+4@jڌ :sP3v;l=j ZgnoUܿSN8.')G7lkJRB&Zjlg\l_9wໂttgr?1}O[HM~,ctpP~eiD}g;Hi 顒ij-6j ZЗ<%g[-jUYNB>-  zJaS 3)z2'a >-*-GOloB5hT~w?4Kh%G^cVhqͶ_Ŀ,мz9%h %Ϗw(|OqFց,4UʏIrHtz (T[ߌ6r>tG[Y־(4.Q@?WWN#ݳHlܨ7$B!_9/m|+֔:5.S&N+~y&Jn-k;+}k_j3}WUy -]}1a H>ű*u,˙Ά{B%h&W/?giJs"/ PV_ « oQJŦi/$:E f9@KUͮ_QQ["B<7̓J =s}-c*ɱ_Sb{˯U*oTފ+4xTU و=,C&. r~\卾YxK/WKA!RkM;E2V5RX فL o*D&a:nJO_l-QTIA8#nՂ7jq9HAKGnش#M]'l]o #yr/s6 VϪQ/ Z$%\̤B'8&sK !u6:^Ύi]8qaz}_r%s/|D ~N6ϓi8Zd:asrqF,%E/@Wm7D_`9N}_F6[,ٍ]\&wVrA$blRȅ| R;yswrI',!s%{7H *xJсI<^EIq{l}f_ 2qs_ݶ oCqx?NMgA/IŚ 8y_$& iK{P2+M8+%AGJ LbV%|!^T| ָIJOCqh~M !p}Pїh[d{@lF?ʩj22Ec^KaFŞ|gOZhaIO;Ђ>Z͈$5k$~3% #pV^SN:D\ '/LcYܠ`=gPuhGֿ'aΊ֐=I |F!4h} +r*~zMԭ6_&;%$gʊ/UI^k`'bU G';MmD*PY/TUw.[l$~1l:쳒y—h>u_>1\ xwf m }[hM?ERWm9W/Vo+tb9cNJwHȉ} H~3!*ժ2))FB6c W'nΓo_(3IZΚaXȻoܭo\:4RA϶FQ-CRO5bᏊw ~-6H/ȣZ"oYP EN$6! [/%2Zd_ Z\m^+tS")j\HOwMߐO^~Jjl"/VѿjB('Æ9;W.͓gtMz=SN>ՂC _̅`GP,s r:qRY ѣg߮ZeDFB;2("L5dZcx~&wh)"F-htcySG CߚjKNChF_G?T[K20wG IS%|,<\GNq z)iyfu}\2g?z2^/nTi \QoB\Ώ\*BNH0=FbTĩ}O5ll4 ?bKJ 2M볫8%$r'mN"Klޑ{4?Ћ}Z &q_c? tx2?/Uf)y_Uz4h''FT2Q_"[7a*V(v:}U@~ӧ.n3.& [2$Gc_dc4"zXb,bܛ̼[|_h0?Ag9+'s O>ן)&X|5eAgZ~UO35mF?sKx}hk&#gܰXYFrKI'2=UR:rLj>5z{Mq&SMT2~TFzdr wf;OڅS #غ{nPj}z@İvO.pelI_'_W)[77Is,+ԭ\zzVk{XԺ2~?- PygKpI [).FzI1CT-'xR66 'E}v{l־ؗF(4 dɶVEE'xMå"_8=/vT.CJpntڤ_O(ftz:PO4OIæ5JZk*?dKHȿ>[aOѿg%I_Od-/ ĄtIz/loƱuV/".ĚlOz]RȖ47b3ػفMYAДyM\G9ޟ,)'+8.Qo=G9g2W S$9OzeS$"l=o`+Œqc"Ok>ѳQ^1>&eM&G]yۑ8ޤ=ω=I#c;S[vy';uoG:c_n+Oj#Km1KT H;;v-Yr*68z?#O&܈'5zvBo!yaJ - ġkwڠ]r>$fv+>K %?_؛;Oe]{;W[,yF.q_辄BRx`_ub~"F2A qiy5b1]foO55@+ݬpoN\?[萤y@h/=9m &lWBjԧ>QzQ,A|O$wFEފ$'t7Cy5GİMjZYǾjX8wOFB'3Txc6:mWW6*Lx:P#K%^촖nGUO-& |!z9٣5vFۿ\`;(B Fȩ{^ނ^,i3*;vR[*o ҿl)ߑ=w6^Ҹ z2V"eЋݐ|qĩoPh 2Ri'qAdb䒉XNQk)ב;$%_ƄJ^z 9Noj%S-๻ȽP0kdFYX^'bGzЧE{df/jieߐS c{_.^sPP| {@)4)_َ]3!_9N^XnU K5}c${2Kn3ZK=Q?38BN;4χrP+l{k* 9س)r۸jllb:Du a&g)c:6$G{'*W;:[th}|L5hvUoS|{M!z :9_bcCo@N9{e -+#Gc_c6BDy%(<t{=wsyXq1.װbtۀY>m*;|5n0 28o8Csp,?nR{my{pf!V0 hM x<}*iDs"&Z*Ʈƴ˝s}6K|VsݥAj'zK:r~~Ŵ~Ԡl˒` J;U4ZO䤦V5 b/} BL ObjN}O~;f}Rލ1a=6pV>-H=.i+P\UE7L]zQRI?Ǟ` C$sW;܋l-PZNF̂.t! 0яcI 2iǓd󙌭$kKoA'еϱ/E'Sz$A-zunyoSW=ỳ^]e6l뼤妫Hd2?N߃bnjB=` {M>Ÿp}%l$O'iR›&^ 7`lcySv+vB_ŽZu3L/Jfs:[1*r>ΗNoyTv=vV#'Q.eI僲b?K<JCmB;0r,oT樣#rzc_bA ^c]V'Q~|qFS-Itec϶W'I/;s|]-F6O:0{|BKj_+wcɴ=vA^ƥ~C'&>lV$U:uq?S,Yȴ"]0>-}Mԡ́U?3C=lFRh+v] }^2v]G"sOV{mr.ֶ $-N:LpNՇqsvJ%}sHTdӬS_~Dk^-xA/W-=ոc SAۉm{w,IM_UY 4E\1͔tz 6"ךaqѮSsvlάې4{v2CS ݝV=Ӊ]{6V LnH\=IIÆJ쇢L05ZDNl{{0ϱ/x&Hψn*ܒ:PF{5thr{Nсܶ"j}z1A&'bQavI؃NV/ӯ2v.%CI.dR#i>t{З{̆ѵ-RLY?!CV aoP'1V5ş :5jo?ENbI-ȉϱ|v9Z+z9Wڇ -0' :WMCF>Ы hx܏z6̬8 t+=O?C$qE;Q-S{GK!xV+2/i=Mkb5!{JZ Te&F>*&=/⚰U܃4';Tq}ЂqOW媖C@fcʭB)wBі)v')ܪСt< Ktߎ)A)Ӆ|m'" 혣[k!{uEFךl#eh/Uml!?Lf2jhIس= ĤTЗ3b/w碑8 }7 ۻSxQoсGIGʎ}r,ܡk%,bd@'d8tW/趝dӑd Q LJa6D~j|] o.B?vН3P;v5=ovha~BW3@7>ǮWv\;D 4u7 /u<7^'ΩػL2r:@KlqvO_cF\x#EhKZS-C}%za4( O,tN}*4tb?uN4Z={a2{XT%Wbp%7lao.6oe؋E meG,dB'q,dqJgI#D^nz =ֱ7"ʉnFČ-) >A/U;ٛ:}t=Gi7q6Tf隔;7ӄv`YN5ۓ%.1_yk'ERk(އŒs4R;`D56Ѡ>z%aWyr5v` Zd{grTbݱY^6O9?|M;LB_Pssd *> [V&n'++,i CZdUcs5֢B:iХp촯45-p`& F qrl9v^#E;c\2dW:"S4)6fGF7 OɈЬSZxCt.̶Q7ޡKܐql?"ox-vB0H}ﵔQxr\C&lCwIb:-ݍ]/63wY荽 g- })g[kK}oG4.A't aI=qQ"huLyY.~>S,y|Йcb5*XثRG$Y*=ulM]i2uv!b{;!l+i s ݨ\rz+PccCk` k&kz(B _eY;cԪ't"STg={u-S"9,=`OhOo7tѻd3h2elqd/`W$>q-އ3F6 zq.UA:g]ocq[Zӫ%xItXtCsSOԠsBnw (CKQO, :bE})HJY{럐q;}&sS= NYOkr ۵>HwpNe y7eAZ;"K =9гJ3dYq|i*ӕu+~"&NPNE zO}w'iTKS:s?>$PRN.Қ:B |XHnߘyborKZRl6F:m6>UqAndri:(DU+;E:/XsIQGnȌZFQk)e6U\^?a3 ) MDk5F~OY}NjCv>--WOHz?g,y|7;p7{zBFIj4>ejVˎjmhBN摚.-bfq5շ u*AK{uF,@o 4q3,ݞؗ[VN=y vmΚ>VYig$Umw'*ĮHWL7c_ 'w?Nn3W2L/a2D<؋} }Uf9e_XZ@\<;(jTzBo&P ]^9繡'XG2F$boѱ~.uvYFT9@zf.A9p&>W]{ kZiGhm=keRd}CkҡUjfȉvFbﱺJ*q``fc@'{504C)xںܪ^n 4+&26h^S'kG^CWz=Xj5qC[k'bww37yNq#޼9 ́,S,#o&K}@e(8{}Lq{&G.k@اue[9 tJGRt7vU%*.oq6Wu C|!'5z.^fh$[2V2)m),WƹՖN%ܡ4uv,&t='dCNC;v pTKB[rVt3z^#`v,뜵 w:`}ݭ4 Do*\Q7U>j-'_OżPx\A6$Fm]6d1ӆޮ^=^ -V;+ؗըK&Rj] {O!rȵ\zg z+Sv [7v 'AЫ2rPdQE0}cOmp]IV >3{$BR8xc:AkI,=]k3ƅ>l:krJ.'KoALa9ݾTNn>nu ̈́|rd1Sz7f~w d gtc,MSj]m=ǹg0{{O: lܗ@4q}{FXO$ϝ`輽D ;^4t{@t-r=V2tpئd+ >;SwV^^籫e9}בZM,aoMݜcqO}s 7vYAG/RtYj'5̤ffs erdXGeJz p'{mI|}NS͈gMtps$KrlCa'\n]=#weH#ө]3=C3z*f֮^C ZWfm6e^}{n rjCDS9R[kuaXM_+gnR[ `HNu~ifA/Nִ-E# u[u`;'t"yKgCoF"$q`nSڄ5|^œ%\)"MЯ+r9}Q5;7lf ~,ȣT~LMTևz7+ 26ؗwJS1Sg:/dJ=u ֊B#ַ;G&^[S>/"M>`B2F Z:mnǂd=Y ~KljC/aC9 MfVdx{b[òf/umas^̶wCcKk҆f{+Eq 1ԅ_.p}m=m ]qu07"?; W7N ]֐xǻZYǹQZ^-=D؄ڧskl>=+2뢇/G4+9mj[W;uը\Ұxn_s5Jۉ2xʣЛ ıo较= }/rrghʟ]ͦؼtjbyzIg艮z-k_| _fCS}nIM D{ხ.@qF zy$\(tM.k;7eE6J/:錗)8۰Fu&3`],Т5Dާ%yC`(9u,SƶzthFw 6v14d51r>mWh5ےm:t ěhG -6KYzOtԋm )RIձ+]3#: ]z+w6'=k(crfӷv0K}O껯[FQ͂,pvxac2r"s>+ݷ@UCgۍ'[0 ܑy[]Ս$Nwȋԡ=9rCFZLt5,=n(ȴ^%X_'klt N`hr9njK\*luT䔉>:;I^H?ådE^xTucWk g8m}~CQ@[uXOkA;4r"1>nj7wϡ1O~4ib>dgk7JVԍʚ+Gl諭z;ܣ4B7IO0l9>R_2Ao`^Φ<.d$>55uihvFF P> ђ0^՜߽g뼸5𩳜Љ,hb=_bF$:kRˑ (="qe ]E\o]z@Ɔ^“.o=;r9Jb f hVb{ُ t zz UoMQO#wICu|4y '^/p,r4E/o+t =|7 +=}w1F= u7K_[z '5?Nn)r{y4\3ײd@{cC+B3^J82 =T0^#7H?p[z#g037w{^F#~hbQ;x%SD u\Ur5^3W@^M1ea҅Ob$z؛.REK2ݦu^"6r:Wkl3"gDIѐȉLGbԥ~9"aW>P C4povBwKA60t.<ºd|Na(ב72tSZ [ۤL|u #'aegV_njhIti"|emp8^99i F{K}f:%Ɂ~Au)/nuqGk9g t~S waA.ЫE iT" j:^]kFNa6f Q7!/sh>R%pWjЛ"GDk]KNx?NJ&m$A3,t *}JvSiVZWghy6;Qd䂼C^,ޡ't){H/J/|kzaЗ8@aZy7tk/sެuti"yz2a| wMiY/C39[O7rM.j#c=t)t _&#EI'Udw5hȜ9:_#=y聝Ci/ HwĞm~4r-Zo/+A~P-uR>KveK43ʣib h6*{vC;AɿQ#xO/E yHvCk [2(;UنҌ^J]#.@dnTjvȗKF{NR3Rjȷ ]͝%DF$]նy@ey踑>'rX]R5w{kyUhf$k lJuTSpϜ ȗ[w]lcl`x*a/yټ敘w8<ոHZ~ՙizo͂ ]7Ӷ+wN[Ǻ5i w&(]-%{},N#2#[^%%>)޽os[:emR8P^>|W/6rrQRj܋{~z gzKW &o -C]ǰH[ANv'洬GV0uTJY{h,@Q.Jn5B^5Yu}hkt1KJ#YXбef6^QKBz6M{\f/0ȃ^I}dUl_iׂ|Rˁ|_@N/x#KWv(X# Fq1>ZZMoT+4ް.d#lY,bhq9F]Fw^2`4W-Fr@\ʆ@d)0XȐ`VnH#lLY3<a{=oʸt`dz$c6׷42|d/nIȳ/5 MSlbwu..pzFKVbZۺ{Ky otЋˍ]E$^B\Be.FNsMK}a͎6k7v+v@^CF:SFCg:v$ Io RyQWv誣xQ h&t+uk-* P[zm>9/NM6r/I4;Z񊗒<^v}pc_n5m* :GivAJ߫Mqk_Hj[̭yzΨʰh;A/a8 ܽvsȗKM}M 9M 7S_ZEJC/Kݥ+c7NTm!҈/nksmVǽ)6 :۸+'> hUW ۙ7n_*DtgIO]I^Gd0^/ŷȽGI51y豄{/V0l-n77LF&݋䣣`I_%{$C+GcijזWG)g4$%7Vl7bjȥ.jMi̔ yFC擀<[I:>"67^ tUrqSICx5_5]M#hR}nqyS$} &݁B.eЁŝ22\r.V/wR9>nS }Ŗ\@3\6uZx~M6rLWs,*̚n`Vi(q:㥍^ ݃^tπ\n*2 KFM\{|~SMoye32K$Vd.$L}ӥ@ @?X3yD 2eMS#u^G =x(nl)[QѵQ.bV5K\n2NuVO}@iKvs3#/F/їٳ;dP+s6=e:2m%~f*J>=9д苹6O\f@O>ӳ?1#$ ~=zC|rcdG+탦vhGZC~ȭ&KS<o&%T:p}[S^wT_`^+#~?@U/ԏy[[J_)&6~ޖwI K0ȋs7LTGwJn&Eh:| iʞ'ǔDEEXh-N1Ƹ)y ÌK/<>]!܏x&¶ ^=i-gE":L-MټH4 ~ܓ?ް*/~e&rza()g_葻PT}Zҹ?¾aY.2w+ ~ Lmi}Nt%$AJFeASݦ\'jE@5 މ86d-O5R(sUl& E@ZE [4pV sZbozS!q?"jyѰ%594"HRAN+jwو Vf6M [OEرIJ YU3tW`_vt%hΟ4$= t-7:>]S (xq+rS\2]`wK_9F$M+rJ,R~+C{_'_cnB']ϰE']gnbY̷ =Vw2Ŗ_GweVP>`' :A(YnIIK?KջzAW/'ҡ)Yٚ9pI~N_J޵l:qO_̲f2f >[/iBA|g3z{e$6KA/гd ^I=|gS_G߱>ӏqYGY6b#5l`s}OUT0z`J#䠿cO U{b_:߫_7Ovc￾Z<^Rܚ7|[vl\Jҋe`W6_=RBkީs"HJ>}08yh8~eMu{j6-rsmVU"'/#PCЪsk>[:O𮩈n~|Լt~he)놊7>/D\;B{Λ/#EFj6ԌS<>ed{f1srˉ=[~r=sAcUli=$_lɮb[DTRɯZ)M[&[LC E浒El @@Ej 8A|7Z{WRzH^KjJp_ʔ!+vK+ʑ:i^{t޸Q.m}="I?ЯFv P#֑ |/mBׁTVWջ:$cB7ѹy_9q׹~a lUln.tč/Ћ[<7])f͠YfOŴm#nF#M^k\ڠh}Ћ6B[v،Vg~竛Gah/v# [B1P*| T 4|jSYGPKRh7<=M/MG{Oai$kV+tFGOat ݳh_dd9py/|u|pWyJRriawFPG.K(rq5A~j_ݗ#,jC$Q>OKv'iEKZR~^XݑZF/Vzґ몜+ש](FzlC @?zzN%_-Bw^مzz^V I~T&A^kfi/ٯQ 6oq]rO:rdEKBAT8Lw ~gu⦹W>{dߗbq x/j_,%x/THrU}5r8#TqO'%YW=6?蝔0׊XT"Zozm*Ҹj;49 | rHoNGr\_+MVN%chi3FwȈ \d~ǡ]EٚyCϣ#WɔNǠr_<NM fHSt"Nx:%C;EyCgc SDb.z}Z^jz@ /{v^ȠLTUĊ=xt#/rK.cO#}CFENLZgЉcQn n.\k9E@6]taF0/ 'LW9׹{锱Nek*򝞳].}\B/Tp9s4C蔽aВC/-QQd9,i|M9kNDy,S)]C7:cK˯CЉylfKnz f %#х͈8b+݋Oiڠ̛c/T䷬ yDW9D;  Zm8u>^IW15Ȥ>Oda yt@gw[ҋ7Ǹmu)_] !x.5 ]zuA#ҝ82Bhзhw#A Zfn5횑#t oXGйHwC1CF9u KEHݣgу3ݥZb5 ]z/*raGt@KIث%rAF@.U9ޣԠoFzn)p~y=2x\9 |NR>`JmAlm/ښ4@$䜋Dm49UzUT Z녵k$6Oj2N 7v5E)Ǩ2t t'2_T8l.V{/zQ:4%+{-y S՛Q{[ջ5x?1F+vSnq3B/3~BAO ZVRt\…r~we:JBWGmq/_0MVoŞij~8R,k֏k[]$b |`R]fJHmդJ;9j^.3\~J%C_8}oT[xV>GH^өhDnXj=2WG6Hz\; %vUN]b-/8sX2ȏOțG(tJWhsٞwcIէK .Nܨ]':0M6.Ћ5vSnb-[@yŮES1L'jQdDץcPI /R%{Ku:'G]H v^/u-Ԡt1#:Ww RC.FWk^̞J:gg{#P5zDHereb$'0@kC=]$,QA'uә羡"O*tO3\K'l&3J|#m7W3ȫ]FЙ>邾Rl=LrB7i<2/0(|"'rj„̘*v# gwc"S{cnbԝ M# F^M X&a!BôݙϙtQ? >щ|xC/5BۺF}{#_7c9Ff2^ta,N|J6_z#/'-̼3w qU [.ʶ5#7x#z11r2O*oئXꩯSw6R܀ݬbl:]bfhN`ubFfDWOiaRԦ]i͝(59sAR49<~}ѓ@oMkmEG׵G"v\LdoTEǑQ@]Qo!4~Ie`iUh}dt^?^C;J'tݑ0hʞ]7k= Ԡiҭ8}dGKl/ v9 9b[VxYX#_r:O,0MJ2ґ_}܅05\- v>uЛy G. \5FJЂ#ϱߍG"s:%]]f1aL*^^C˨9m|COؤT//.tRz޷s籗gLȽdIBfN*Ƥ@K[ xvݬB|v`^ȧ)-R_RA^f oRzE^&7rH x [܎3|90iaΕ؆d yO(4g-dYA'@N\k0jv$VױB?F/n1UvF*bi3bwځ|H{ϧ_s ݭkE yRbרxFӴg`OmBN; ^Nka)V;&hVԹπ xaWN*hZON\{~!o&4m1遼S4Sѝ1o#[4bsv:e'} x/~Bb%~+676j|QNlKɺ_ĺ.AS8XhR IH蜰:tJan/{WmzJN GaGT=U 3с\_RJ/T0=H咩/|B3ޣ M~U0z瘎Vz (}wx=n8kd#_V$)Fmz/CNQ^x+ʨW#k7UzHB3#a8t9je=/9/Ky}Ҩ6dz>/jqH'\:ܱ7Yf]3{E)7:]p FNjt_Z>z`OFcWc=KJN`FxB9)%u/u쾡߱.s.1cDriŽvhߦ^9zV/d}MsUugxsS .̈́'r;]e(m ]+ f_r?KѦ+nӭAjW ZTz$6$':E/`cw*\ ɏPOva =9]1ҀQbd~Bw]Fuhcfs 4+Ћ4^FG.6q;3Wsl$L)tXײCg9/*NW&Vo hA=^[3Oy=^"%G:ہy螫Ot! A4Ew{Зz@HtȪuȳR !u 5367Z1fF2Wə " :Qv0 گ4lw:sfto"e F>mǽtdbi'r0Ig1M =:r%ɷ@Nqx$?lAxI֚{ّ'27S+^c"]j7r[À:ᕤ"NAj(pVe0Jy7,ЯQSd0ī^2C_x'-+4nnk+Zvαػ=MQe䨫jmf#^XXҠNJ;Ǝ}r.Uʂ<⺑[!3,6IiE!:|-c(~*iv[f>〞Ѯq'/F~Rb:oX^!F Pf~n}"Tՠ9Ӂ|5(Љ [bz7js0luH!:/ڍ|hq-7tYX,FoAr=wu襆ћM}tT't|Sh)cJ:=rukQJA֍-nJ/^7_XSO.HHq;i^.iti00v"dzҦ$}O4M~ڣfН]cX-&tFGW^aunI#*1z Zita&})ۯ4l snpt]4(r1/_Onд5 $J\k/#cɕ}54$ >zCr M!mv"?twx]/Q 1#zohG|b哻oD|" u*Cܰ؝@,̣A_SzvA{ enV.w)SRFDڀ鯃'J~sysZ]`FFNA07[VErN}ޅT-S[C~g ".̛7sQEok|Rk}yW闬nI> {E@1}+kG[f@^}`QYb%vQ s@1Co .D3]QAvtL]TZ;5K-8wg‹w4)AyˤsdvKav7p[ T_׀n!oYJ:KDǀ^M`G>KOѠ.FFm ]^ɯ ǃ;i\eZBD~w Euܽv|-}h$p#KǨ+4.-+Ck `_bI%'t[3F MGNQ菔PbQ7N:Ix?`d츸s躨cB^?_9Wsz\w@\U^c;$ڵm\<9R2C_J\,)aFU#cb ?nЪT 27;][:%eα[\f]H? s}~Q3cue@,Gocc:['rzPqobzy&ܺ$9QG> =sB+ xmt.HWSwcu!PNSI,I/dl]w/J 0h aJ`H\)rEΙ(rHDnA( id,EOoS- 07fzq[ʅ֣}qHZ4t-\P3ֽwtub"JGp ^.zRjCN8o6 Cջ^ .zKɐ^D$@iԊ;'" Du1ko\[g`̳q:߄ަƵ9~-^ظFՇ[ˋ -kLngLmOطF.#l^ ;zmr_Ln}R\Swλ,Ji")+0&(6%t%HЃUGMi{A⼔v-^rMГn |,Ê1Kk/o)WC/v|ۻF;#&/btD~,Fb_KK~ֽkOMO䉞W۴`oøu7 ay*j372;,`ݵh>4l⃎?ߢqZղVr!yaSŕVѐ/-l}.5}ރK_WC:Ecwݦ~X,pj7ZPi4X9mlM]+AO|ks ]6u-B\U'x߬@e+v[kX>/U-\NU ~)돰K 9#g$MZu]R?\Fp\'Bt?L"!?"45*`BUNkqh =,N IH"RJ?\V~3 |_({~]#G̳!Q}Q/(2 I;1;WbݸѬFrpmoTp< }aD^<9Fϡ:BbգO6: ELQ~/W*4ۛPV~Oo*&wѫ=rh;@{/} .$TӣgH[lK]'M4" _Fn6@U͏.bӉ:^'lz,]zJe:h}e"ggToA0A &k{CjYB^:G^a{LVջ ZkcƟU)C> }~dY89XT辥fH tCK[OzgԳ~ _g!xa7^7-ύ' {7iך>lsJ֎(c} Oad6t}?j%7C֢5Wf.ܓݧ'v &l:틟]Q۫ɵ",[Bώ4pPG]*]욫&׌,_J);Cn(#8y1su)~רArSor ?˭Nˆ}S?oS]n*IT;,J4-^\)¼<9i)Yfoz,͆ ܡ2bULI^_N|ЊM 틾{8Uyy]U?Kh{ʖ@o!N:\Q;xN =G^~`UjiBz~hqtFc=>~: SgdᅞmGSVwV ery7,wj)N?L?eR`7IYB B%F+7e-VYs:%gk,_WZ<%{#h6Mx[,wk4US}}YjAVFΌ5_{\tIཤ*т!`ǹ/JYw~%ZF)>M?;?[T%W{okb9UsY\F9Z_"Щ%oQ^.4aIMΤkB=CK偟{G3/-6dФĬC{%ONuEr7Wȸ\O˂$S88Ul*lwgԐ7?lO{vOr*({.v?}]i;L/z% }]EKa>VMKV >UL1h'EOy>h>=A~i)Fy>,ʑ a= Q6\ ~8#YmktWVfC/{BwU97{7KB>4iuPC̐hAD~#&U]\Fוk5y"دr`3e]Ao͑PVFҼvzߝhDxV#K|.+-VJRK1|uC|9ӻH7kc4O跀Dc\M>OWNy@ Yfv"wȼBykA#0AvtQ>u }h`ryy#hRAAǖ^Cz~Mmn~%'@?β zK=h #RYY-vhá ѵћ\.ht&(ZVt4AL>bgtb't (r5CzT]@Nz {H'8:{Ot -6P件jsUŵ9O2ƅ(4nZ^Q ?@nMe c3[Fq _Lc|GhإfK3ymΫf,Vވ>@N6O.[KHWEc$ߜµ`FOWkӾ}R{I]t 6C3}R`Qb =Sz]ݠ;z-F,=^K~Ou%/+V;2|R}c)^n>e,WZGÌ{ 7]ɸV'|@x)r+/oS^:MlƦUrM~Ɉkt?]zCqetX ruX6p[m: C|dXIt#BDMbljts0fijL"> ]\9q!j퀾άC47r[IfDF3G8]S~ fHѱ3斪zǨdI4%wF ]B]/M=. |#'Wc@.FOQݥ+h\w)4qG5hA1r@`,ޠgsd$ޱI3nE_2i9klϼ 퀞\AsTyɏALFYFr[EcL\z| j~o?нYӝV)# uYz#{E ^Ϗ> =ti6چſ)t#=v_m-^:AN֮!WvNiA 0_ثחZ4e=GݕF@朣rKN}] \xEu{no]kV-3zd#o riqձȺ-GzRwEoI[5}K<.._e!htˋ0w]3[vW~բ[FC#ZpEWY<,rE`S',@/jנ6C[$cyj^gz~zӅA<<=\vo~<}/lFH7~ Fݥ57y"4rQ(sK%+/@˻NħmQ3ssdߌtl1 ̏2pp Y4Z43!J˓35iEF6.n'Q|s||ogt 6t#j{HRF =3ݪ9|v_.OiiHg/y_<螞C7I0d0n=ܥD2:GJTueyIF7FTrוֹtmz4F>Dh0S<:tE j?۪0^늼LO$" KiK?'24OI6o躆C/fqޤ.@Rg~(\^bzM0J->~c\8m6Z`+=亩(8%ӱ6e=FM{s\![}_(B ?'rYE %l.݅|F):#`\O%%ikuk-K`d)N\bȓzz.Nms*id6f!6z Fq52zE{HzGjkۜU]6 'ըkq^?I7N׍L XDM9S7p/,hOka #/ z.JC\+JXMv-*r#5踩yo| ok[:\>ꞗ/WA?F7=d- 0BҾճc˻cb4eE16hiYх]\8+^2݅J޹4`wFݺiaG3Uw \ "cz:_Эʩ6 n9MZ?\:M4){ gj)\yaj܈kP'M!}fbNBg&@ОN^onrxb8R2[84ؔTZFmbZ"y!u]5 4y4iӳŢ6A} p-FFb=uV96^Դ$7e рկɔFز}}.G'vtDH|􋋜 }ݫGؓ鬥{ lA@mYaVQGW'rYa`澝"Tf7wD>F!\rF/m.Scf@Qt^ [W "±fn!@#uKuQ;#t"jґQiz5ބl[o@ .Zy_(GrfF.Hfdcu8:ép\ǽ}q 9zQvo\DEN ={]cTy/BzZ68ʎK3hQOm]J"v04]Z}:[߸%$QI?~n}?hN7 0ŧɯօ@.8C)7,v8K]ݢڡMn2"d;tl *r^~R7zQ\;5-#(K~[ c/ӯ=z_o{OJMEt]_Qby:=Zs;z*41T12V_w'tgd騍[Enr@F*0t#_k*tۅXN!qyx#k`E=gOC]l-/\w5QvrF5Wok{dE= ۺd qm^ױ.ыvC77%h []#eEtB/sgpq:6 EE^}k gl.֍O_`}A}15ɛz) ]J R^Hklo4Dܦ/BK1yo\Ty=& nhv|LmFxTl>rN 6t2:=G:,oNSàHwqCut_V'j'v[,Ͳ?^8^+i\MځW9ʌ #<ƖzH4]2M򭗊1I= h9,h~ўaiy:fv7k:4݈$FGz1mcwG=uR3r&A-W7}SN>`736^3ҏ{k7{#M"1g3yKwB">%Y.@:4ĺx@_@/5$m ,?A}.GLO+;ͭq Oa[I_]p \tT#0 I=l`4.Q2wop"/QkRͱ }ͽW uDF;-eTBAb y]+ރuDtX7#$$0-Nٰ[oȡE/JVV ,7Ĉ֏u OJgAG%ߠPIIZopFN--Fbm v"’WvJ}@O3_LZHۊ׵W5Ö!c=k`@^\0jd@ ~ytBcBWh͚tk>?ˀ'L}]͏|7+MѠ_+/ 2]G!y:Ne| {T>oeUp@R__ ~R35oLaf#D/.OƿoEː/S{Tz*c%鸡۷?8rgp"lr[Vr+.O@g8m^[U}x}x{Ђ 7%GTޣB_-kDWir _wY+'k2 ENw#ڸ*6T=܈Im#LOd/䅾ZȵI,gx|W#Xe jZ5+apz.>>{Y oKP{Gk/a:mͨ%C6]1qjV㪎(ʪJ /x<\>? ,5Qh^j< ?&v@f[P<}]+C pB|'=wMJZqm xF%bͶpc79>}JEWd F^o?pw+BE?"ÙNnJN>z=l}վ-f$hf=wR?MB1ýd>A5[c<>0U{8ߗg/ӏH\ۤ'1=򛵷K9M>X8~%Гp>U%/(.fQ_g.ky~q *v{].  <5s*m%a}#zR Y h^5m86O"k4 Ѳ.H3+\|qGU9?뚔b,z]׆ez93YP|d ojbo7lVkj<}>e毋`˧Ͽ9hQ< ɽfqrE >kg"ȕl/IJhfn ^B蘒^ L}|O),^!J3O#}_jsف~+tb~,^V{Fv^b?-J\=fA/z^:Gq}*bh屜myB^]F3Spnn`YMM&M="_Yi~Xr7opp5ׇgj9VGd|{Ԓt,Ma; $־&)&! uÿѱY,EyV5}f %EkE}k5^SCin-ΡЖ=T~o(4Ȩ෪pKuA@7AZ.R u@' gjܡ@HB1)*q*wc?4;‡*Kz~غ nW7Wo6]!K?pz5`2_kzsˑ}0[-~@s\jAHyk.4yӐr(t禍?&Yݸ}uFny/q }`Idm+v5ʘp|\ lFG:}kQ^m_l)9|r.G(ZkV %n/'b}̲6ˁ% ^8%f<},.Q^eIe@7)oMoΚ| O1*3Nj?bX~Mh"Fd}=-΅K#eEK^;tz@,zy}7 7T%7XGހ9]s|>> PbҦCsw% s-C/JWd[o4OAO7APvɛ:".AI[J"$|ov6Bc4QnLj^82=aLmToVڟxg7Kq[#\t \[[\*@. +IBr tn)M){/B7s@¾$͆L -1eE'+|,"_qj8N8$%IyT)ҰC8mҴ蓦m=#K~vhMKϋ;vĩ^Ou>x\~zc[zoBB@4A/k9e&  ׺^#ؘ@ zz{'ɕ-/>_{<5bU "O5E 2#2IMd|šy8XvR E&+=i8}FB~섾Bj⇦0|Tp3So /s{$ϓq ͒ o=rfe;2Sڟe-;7nC(&$$U6^uPo⚾_/nSȏ,iZ-W zҾ{z#wˬ^-zBƏáS]bFCM ~@3A?ЏIaBOWk+g$/4(WY8!Ag~ƸRj|К_<%*8=M*Е8Q_mmA_N? 5R#_QazMEn)噯gq@j@=<^/gZ? -1-(;-ՠxcoMIs?ua ]l; l1/kkAyo?WBNgwidY #i} 5=-f7D>V14u>u;P_t'5dѤ|b@{JQΕ>%IY5Ox1>%{7|3 W-_-6@W|߲&A4jɌNA lzS/ )ESfN rZMnؒƠ7欕/}z'^:,On3KʹB?#l-{[9Դ-cM,^b!8fu/bnO|d,;mv _g3:%-/x & 'tz}|ؙ%, -5Fd/+_~7C 0/YtNo9 +/\lv./ˏu^ݔ |]Iag C* =o' ~k )a{俥A[~>d{8&nJ+˰O-cpJN-ܯ4m$!Nc5<ѯRo<Ѿ& j{m)et7䗊(x^s/uržz@z3_WN8)2Bl$˃5WE Nq( JI-wIKf.D/җ %qIv%DUBOzFz |mWv$vjEXRsؗļ'טwF97\֬J[zK7[#]>EUO=]zMׯfankkui ķWT'3mUDOy:!3ryy ][WZ @r/d 6fUk8zu [oX`ojf\7ER1V  Δ'tMԙrߙ:R9s^8ٵȣ^;K *rk|ݝO?h91-rʫ:˸Kش~eĽȍ.iEvt VV{[qp+Ɂ<7GI J/II*%uq,cjِSGGtCOK@A4MyXeZqUׅs䩊C"uA׸/,S3Unu=nbӉ|ov`Dr@4 52uߧ~}{/)tӠq D5Ф-7N [L]r$}p!C[QCna3 2Rn[8w>s5:~j0xR-"t@թی\rn7rљu|UWSƖy UߎιZ9/y[F "y6Őbw ЫiX3K-ހg@JמR2qI*.܁!4DUrH]x-Nktɡݏn92 iҦv apa&hGo\m3@NS ϏԠNB_YQϐchێl޽}136; bru젡r ' 1)gYsO;ttl]仅jF?FP&kP52ԟ,ME#_]{={O|i]٦3حY@Vx#Xv^BGm51,z#ȥE|!}uw{tt|X[]_QF+{)07[w>h {M~ȹ +fO#' %5hbKlO: кmKŞǼ$y5]OWv4jWLqܖ`Ŕ+4iv>ƍ\Hic\ROoѠ{3*ЎN@nK>pL=vꅸFW>?T_mК}ȷ"'ET'b61{t, WGXu̫x TN\WnFtt9ڑ̺ݫرǼj 'v b&gNS$@?ޖ =ٚ”j0{GW w$yNX xɲ&}];>(>̂"! O2;rӒ':^l$ls*=bהu! %c /tk`#o^O&bwsm%0AfĶ8x e >jP@/kwt`AV#4{D爱4oncehґ]y_Ե Ĺ4}C_:i] [pyr}$*i ]d ΐȾȚmb44Ak熾wNS騍Mtxugdi)oE8n]WT~e)hȫM_M9]SYq ^S*pFzk8 o8*h3emaM'FyR\m`:󹿾ϙ##'G膞 2C"!/wڑz@/]Oyv9et$\%z::'[rB|w_Mi5_#G,nz:=ݱ~ќASYjRZWO] 6ZCBkt=_kwTѥ}#ߢUҭ禱IpsK4A /%j;!wV=Doԣl7Zsu@o ~<с]_ż-W"LjF-7(ZfidJ ?F#.7rW:̡`_Kz}#7Eh}[))tb{#ks`Y}>蝱LWʘMƋ :}I9z.;~crBvE%y5wIҐSu97]x#,G]NWn=ռmFBgZˁuW҆EOTWAz Bo./ 6m8Kү C_ۏӫrtDg%9]rEGEލrJ:. RolhCF6AZfB't]Th^f^)FnḲ1.'rwDQWwJuox v?Fo!\7S"oQi x zWҕH6]MI?:K9k][FЉ2K`OƎ:+jE&뾻 4Z Y~="6RAݖEqʨD>kW5ude&5l=fԥop[bc3 cXc긮h_- rQ\ܩ{@_jҠ#/bySA z>ƾ'G[uF1ܝ?hun3RxF~JK-݂ݕzVl"e7B^"ebzo#bӎ5Ҹe̷4&9/>dB>hThnr!ŕXTG4ՙ ]R"'~tW"-֡WWmAc⸻1e5]sd ϭ)FO Y?-N/T,]~& ]_F~(/}>A:.rcޢ{DK+-.ufxQn}lQ9qY>%&$~@'gv wE.ײK޻ԙKVZ կ^\~cEd =Bz;/R`_]rkHԥ$ձrnlLWG ur L~v]uA~khk"/-)w:kl.^ȭ*'r ~tal-}kIВП7hT|B$倞lc<^WKz QO3%dw q^s-%H-r!/fY59E̬#+D{Kxqf1zC7XO2#"wQ5stbؼ\6"ͩd@STt3uq* `VN}]u5tܸ8~"/"ث:D'th/v֧[;/Jak|@eЅ"w ZCȩڈf(t;mYWl !䇴GO=.{!%{nGȁ9J yӏ=vrhASln"Ned.RbF4ƤVOw0tKۉ<3?9zo@n?ʰh(5]vȫCS]]ynW`n-F]wtt8H=_@-‘+ߥE2]4FE^y_:C?Dξw]~ \oڠfTl藣;%/#:' >>FХ"ߢS3*Z[S|F @NpyQy}#ctJ]`@)]K8zQ'^$tJ /8"k-"]]m`|#'ފ. $7㔽(!ՙ.AWudX4h/|8:.5!/0n@BiȮ䋼^dqcG4*'tOaJZPs~CoV yKG17t&)cG>O{n罡Y"Gu9,bcL˯@];+}6p琈ttF^|+^2ѱl=Vc+jFW;3领Zu Ғ:z5hw\8OcȌ. kIϤKbIFTFrWε,+.ڠ^IurU=[-@;/qQ[CED1jdqmNl=eĹp[JLUkh">eDE7ݦ@_Q9K\!e#__ 5Q[]D'K]ozӮyՕ5@ Z]5F]4=9캡uY !?FDF.AP3= 'Ӎ|oyBۜ(n;[h4zQzhZ ~Ի`_3MR/,E ,DOe}z]"7[|{{#`bM>>ymDvߗ@'Ѝ|WܠKWOqoWK`n\oiwȷvІ2KY/ l〈љ{L 't23i[,Ai*./4%HiFhq1)F8ֶNv{ u EſVհgQ ?5wqa]63F>f^r5z:> z|QNS\1˒׏*4).{a?BcHfT$"x4QO !K@9Cpr7o.~‡eϿ ze Ěiqԅ>BQzƍ*5 :_s\oy=G9w.Q_1]Ig/}7^6y[mhynWVRE{!3"~AUEy;QgpɫbE qŅ>-KI<8>"Wl;/=nd?J/mMz[ t*r;+v=:t'0!}1Z+s{Lס;̮A]0coȋ\v*t`' BX @g0Z@ ץӁ| `A0׶ yGJ騋h|__7"~ _.F},HǾ/D^kիvQʼWVq"?̈^#ӭш]'o蔛o,nF퓮CtAt}LyrdF>BF~Ѿw=lyfq$ }E/_FUJcr܂vGE>yDHBE# '3_ 4t%^7rF]Ul'˗d^f$ty*3:cKӳ55Ȯy _(ˣ; 6A36#F7Yـj7Ux"'9)Fc@_`H|6f=re.iWaޅa/ ܡ:p8]%t]{x.T$/*i-ct DՑFgݾkLRnȮČ @Y>QWMzpuS־1t8^s#f2XT>KgѨ&d6h-}o--koG9tiʯBr #ݽ=@[$Z\hEUɌ6팒6t/tq`Y=gF$1NCNE";wU@p {aOB:_b&e+qiuCS0&2k9ZН:μ@+~ G(Ȏ6#m~KxBo:F ƧGP 6ֱ }FltCo.#-WW#oc< NY7!Ȃ7Z o`m@?K0HO)ue56vu?0vMoA;2sN_zn=AJG/\ctaܫ#$Y f ݟG^;Vtu}mxk Y7#aG=nT Vk-^֤qSwF9=p.͋D=k gOLہ,ܰ ;1:EaՏ7C; HOnu%ՠO7RA^ڱ\7S  QG;_9is"\)/eo%)Ȟ^ۉw"jȞ~]HX]VSdaO:Jn"{x9@AcҎg$ :71=fAp(?v\Z@.qZI#⮶+?.Wu5yq}}.EK-^kTGCZ()P;tSV+0"iVN*6|vbt”h6yH}IZ",n#]/d5On2${5R&|[zxKW蕀BKL=U(7oXXtjԥĆyʈXKI8Q|t:L U? 8[K]E%Mjyk=ZaxɁ|~ MJt?0ڠj8=$//7ő?Ћ^?_f!jdݘ֕nn9gɇ4Gw;^7rkugg :m0]{ig}z,8*4UǼDӳH&Ş,9yRbOG1?{7:v#ש-:ԛ[ d-:E^)C:Qv +5mƔhz"O&U%RldU Gs"'6-V;/ktˀNȟ7z=̇Jr+]h~DiqgeZD݂@6v6[/ }FqS&=#ro_u4?W|4Gn-S@ jr?Ly qԟk. ]I6CAL1zߋvEP1nܰ=]yExCv9 tТ%fOenc> ,K5z|Cgy 3avtLvuͯ_85.uSMczK腑[#6RGvi7 |GoԌNҐGzr<]g.ǘ37=iܑP nSűVCFIWwi[`/1hDJv+Cu/hux% ͻg+r#pu:HpRY˜hMeiFb{HɨM.~s٘/Pļ!o!G&NF_̆N?bڽjv]E@>jtRmUEo Sx%F*[35(lIbd{`&xdkWΧG*H/`FvnIyo \w!YTRk5%L'l'm<}@. UN\;1=-u_Gc`KM}ptrWYw挺nPψnvY4tI7뢖f v` 9c{z] [lZRE9:xm֮UUlau٠jN+vMgKz6i]]b\yUmVO9AƵzATWՠ]Αd!Oo3Hm/N V9K0/>WWso(yC⺄ȑ z!Q __)8%NYa+r^׵7hRluC) [{/w8❞>uĝw)'蝩A;a}ȥ^ENZ2KY˩tB~+4ZN-J[_rI}IoZir<% 3'3qi+QO .}iZݺ:EP/~\jx®(H}ym}C~u?qө^3j4}yE]3z!OCyݠe]wGŶ!RS6\w[xmy(ÀNT ΋/=ƉqQ j{ }f菴k7IB^c'GЏې$Z #ѸkG}]\ȳG|l>l U.A(!n_|5;⚼<0f~u6ߢ; ^\H,y.pH#瘍ȂOkݜbt;e-)ip uNG.5n_g1mki\ףEW=}dKO]̪63$,UO]7;C.#O#7"ѴVun-j:9h`7/Tv߭ؼ:xCn!3=*r`$z-#)$Ю5^tXQ 95:.Sx|NrM*= /*Ou{y&Ohb3WcxRF:6䗠G#VmCnG$UhrCͅ,#C\Xu0*6z9hj>E5X:tRom-0ւsz{@X:0. |"N>-(3OS8J綜vȩK;z U̙04mװѓvz~ʎZ܎OBWt9L`xHO d~qVe FUWej &m#J#ؠ3"03OO%BУ:ݍk?+#^.SBoH#A\\g*:vصjԣ @!/^$(ءOW<$KW֒3wZOIRB_ Wk(tk:f6\ÀÔ訾;^JwCHhf we%>S9 .^5th :H9z'nq}iK4oA3TøSl햣7*xsWwms7򋶣rC5E7{Ԥ]9 h}FRB` $Q["֌:p9A7H7}cm=Rz_aq߿0%ޣ2QG72vqW5 /ԐKςF:N6m)G=eg_it*g`=X_r7[γCؓfrƎwӈ]J0`"yy#Uw趶ؠ5*BAuзSi[噶5ٛBWvg">}($2Ghb`I>,ՠiHno 8sx؞cQGviv;a~k[P"?'2Uz} (/*=HȠwV?iM [ۦkdh"۝^^U-IoQ*jੰ}R/N>A/ }`OsgIX#DZn<~ |9IpIxr ꩌfI6%/KM vagCGSc؆ե4ݩ}?F}`wX_wvVO_E,Ʊ;hoU } WGO֣ ,yy=7*_&h䗊VB_pi 9\f]lZ~-VȲͪAEm51a;ɿ@/P0@o!8kN^98]ڼdPM-O솞bB(~kz)1a_> %60r!Y 2QA+ ӭfZu]#B[xL5h ZqFM_k!$"^2žRƏƅ@W$ۺ+ڐ!?kH_4H/4%5 F_~΃<^K\)?x v-;uiZ? GstSK^uy5yCAR&]zzeYO zhiЁ~&#`OG~}i`ǖpEؤ!op+NҳI.rB/`G;r *DVٰǑQ`T謥\hαcKrsǾg=m>a~'U80^nw9\=^b NWz7MI!I[HFϨ١{;7Y?؟l <wCh_rT Eҡ+Z/v"(o"/yOb,KzPjU 7 Ce5zMC_Qɴ^8v.ڌkzHhpF.pjTUlzo{|\wazFQhK^HЇ r:\ׄ2tQ3ܿlȵ8I: ~oF~j)WƳop--914uT=]ԆW>Q^;r%jgkp}ݰ$[YT њ$Q }FIW8/7S8c5/I>!G)ŎBwRڸƟy5ճ\ڈ5s0d^e{_+7zZ/JiJ޵#g]rf_[v/Iѫ@O}wm_OJNx^Ϡ؋ ~4 C2~׶k.OSBA{l%Cֶ̑_Gzɱߓxf9{8ՠ tDb^6~VON+r} uh]YJx]MTjcgJOWpc?y uI3X8|!wB$fxFJn ;8c TMj'd4A-'8DiƪEc ]*(ס,\ۓ[$3^`m<$IюaeT[=4$tqޮqKzȜ|cģZx@ڠ#{y֏p:6"668bK |FW;*б!o1URiƖTZnwOpQqրFЄBˆ6`yw)t^O[tC.lvZН4Luoy>Ë`Su:[H{{Goj^Ul9ٱG;J!Fm7EZJz|=ZZFgk]&DT6$F}(lni :|K@ :Xm|v3;.txzbQ Gt_֠3uixI4J*Vx.1 *+Zݬl4ұgp)}|xno3wd#}B// #ح>˺%ti؍uQ@r 94W`il~$W7(2Y zzK)ޣ[Ƞـ9 97r]љ"|G$}dM=&Fn"?cto0޾h\5&u,K "uMMOawm ('x]^c^ľWd`l\apo4C ePٓ[$-<9oW ] (EG'enz']pJ r=dcnKL+6aLYInQcw7vNU֞pYk7ڠC&ې!m 4MTϯ?wCA4 v|\uiUhqvuo5,됳a;4gJ[cLclB&z1hj'j#uouBNB=uاw7+ \z"+C_zٽJ029cT\Ux0bE}U :yIG8iW\~&;8؁_iFcr;(.c3e19yA&#Z  jT*^lwGobn ^JMy27TLsqD]z 4CNHaƲZk]bz]z).5۽k\ 6&-|A0L>݌)9-S2)c|eA&5zBЇk<^T%^7n_6Ӿd5}#`ڧ3tg#ovbͯӍy#i^L?Λ}"?,ℵꥏݑ׉\gTzt~E!m؎Gr =oө@5_I{!+;*6$@o{E=3_x^s=z`T}!`pͩyӔ9-u`-na{>_ш.BS U]C6ѡI-Nѵ#1*t}jN3ͺS5js7rErED \Izz7Ot"{: ڐ ro-OzgdmMK>j0k~RAqR{^w 3XcR=K.~ y[j-Gm>(醜(489.r</Q רnsIrkmK t$xB}K7~"-ДRmN 6VÒtFyI6OE[?3CTdl/MCЌc#{t7i[Uc\uvrD}XSp">+ROn[Bۜ(O0FOwHpgGew)3rErt_E.ֽۢymVFnTp:yڜz fDm- wuiٲc#.rGr4zCo]w4aRԘQN;#7+mzK>mF2d7\c\֖`g5On>~ ABл~#:Ko_˫%#_gic }Ջm{;]*+- y[\epKU'IzO.9S$kB>7I͕K=wG[FlCnWQ ;r+@3E zqbCyH.^/R 9骋_eQE6zCt7vo KݐRЮмWvH=2"YimX}KC^r=22/{o!k^RvE# pvnNE$Ӟ6ϸxIȉw5b Ϥ z٥'؍fA(e4W-ڱ; ["q¼iF;F`b/A5(H_b#_X7Iunp"M5FKtZG:/vVWBD2,@MY8#33KM * tQ G_:d'Eј;/3,weНɐ75/n7X^%F\uZo^Ԇ|⭶?3M.p^7(1йZXzd\ErF>|9Osd%dGSqM9nvyz1ctU<}z֏PV^N{2wJ}LJy@kHi3{U۲ MLE_\Ym}#9|'å{yz}kOYڀ6T*t2Z6ߤ-_r2t!/zTx`_lFb2\m?4>zԴ=;W@Swjm-p^me}"(o3 Z^i-SU9N|/z_,?ЏuzPIV~؞hA}V\l?>C~\֪$`U#O+˨Ñu-Sf1Kʄ*$Xh<9tM܈C~U 25gr @Uhmݷo~][ z grqKlz>٥MJDX7Y>>7ʽT.R9cSVh_ ¸G?7!5ʜ|E^s0Gδiih^$?><5 Hp ȎsޛO7z~Sǃ7|jeE_oA~Y#1t/1gmen崼Sb ^ Z̍de-; Ztw$,zxoFaF,_/M1hnaz="g7D9|UV.;lS`'24kf5ڳ}bSӛn?^gvb'T} 27BȽ%Zd]W*$;6*B_U dQ"6W3q]G @W8}qN2,鬒Pj_/ayГ!=xnRMp[վ}; }#?+}yB8Uq *i b<,|SBu-/2 ĒΊ}N<S$x-ۮ/-/x7Z<Ϛ=:s2.?[H;ye ~D).(ĮH=Im\/.2l_|Dn?Ku\"̬`6T*=a7-7_ܩ/U?%YpJ^i(63HR;TzqJp6Z;CXzُΛx:8O>]W~ Z:S }j/F']s`omw1Ck~#~ř(A7G zdZǡ *Nn]C/ߐ 7R^3XtWp?ؚ ҷ3_s~fhu &̆堢wJ~c!+2"Mm ^ >s7Ï;V i^(S,F;.tKwb^@fj_fԖ#x{\bfWHa epJt=4~Cb@:x|HheȨm W^U$.vȓREp`4}i\~\Ux}NL&]~טz۸#G}1ziN#k0閊}xߟg~dܱu[h+}@7k')q΀+0:2Va+sWd$xCoq_m^ B_lOU,j7.v*=}H3k_ؓ4r6rIYC/h%^W¶z;O9$Lߣ{FxeE:?#~>P:?Yp䖼o=pb/V Xlhmr*(QZ^3`J 5Q ] /G@_B?\^ZOEw)4Oh8d[G,Nh[/3ot玧l;u[ț·B Y{mL-)SEj){_JC5kJ3h>; 8#Tq<2Л7j?[hTŽ?Sbt˧)Qr^pLp2PTX?ΐ*̍_/U\Yl^q2|PRaؔ*nڠ ׃qܐgܛ;^mk26SONU~Mׂ:z~Lo| ?p8M\k6L yL%W)^kԂ}[,ÛD[ג?4zwөCE_WH58K#N+3K~b8ج㖜/- O'䉾3QS3T~9}h6o E)4O7'u)?_ꊲHb ~Y~K nINdwFRf#WDGf(r%z]gvd}5gf5N;~d>C+ލ|m\|_δAseZ0qU?Lt@+l_`u2X5%e!sh JO\YB_6SKGvzg A7x]=`3the5<(%}OT~qfwC;߂/зՀ^6j+-[ zxYz_kѾySľKݸ?'&" 蜾)N9ndVU}ϴ8E[gn~'`g`ݫ-TI@|9ӏ%l3M@B )J }ÿVBEv#j] ٭YξK~ANόqj7!UIkz* ?ofc2}_+ߐ"6}7g'aoOIb!}Fmq : )/nnWkݽ?'M3<pm?=¿TZ{8LR94g"_UI0b۾d~?o&G=Q~'m8J?]gj*->[?bȎ3OY~?#f {j].> )=Gr\-#^wBʺ A 2};SM}#lߨ?KԴf}guJ-зЦ'_w8]Cq^9 )yT:#ڍ>f.G)B%~v7$oyyW*tĕ{e)C_ɈEfz=v5{g/RDz/w\9y |J E_YkB:rGNlzaK\7I@L! RSG/): 9K䍾Ɏb2rt2OiSnX9 oi -=5G?+]s6Y6%/zYke@|я{.n-??oH *A_ ݷ$?k-",ZTEF`OZKುe }K9&O}z&OC؅C7{^ G?AY,_oͩZ6k}x.ղ,#?R[HcaM ӷ.R\q_yp!?3+EMzE[r(K@-g(tL{N6][F4]c <<|.͊n #PI}D$k?3G>ȀnR'v~}c}ѷu0Km%BU4%no@t3bj}EOu p/S8֞kO}8)$~M!gd-tAG{}zڌ zvr>å[yӌ3LFvp9~e`%gr,8.Ia{*ܲC0Iz9'TszЊ MEY9YE>oI#l,\ c',% R07%ָ(=0kobUK`.C/U ?OdG+U_7׵AQUtXC&?r7+G5؞SOga8kK?)ȧ ?֎}cliGLbjt}Mـ]< ڿ#(89S1k. Ka{1*2EcON΋RB/u+wawfBA}$3CJҫ_ r=8s%E2 v%U_֜_bgEO$r{Gk>o js9 9zHBOq_׳/>EFOG;\# | ?>j1kK6@=&8m/t>>)&,)XBjx = 4az:$lZLz`ȾH_=x`^k~՞>Yȕ]WVKJ UKFQ]Lnh?XR\ 9P7/uղJЇ%?LAL;6{~_כ$cE.Tc~P8}-6M[ț5 hI2cMKC&Hmݧ w2En"(x >MA.?vq{_M%{Z/-| :u'$ݗ#MoIT {]ɂ dٓuY)Vuڐsl\A֕mO%RB6 Ůu)A}юyҭmsLf \b@ǩk]kCNCO|y> O,xny2mM<_$@Iĭ 9Hډ$.+Ѓ=^y /3N7=T %j&M#`.jFx9lxbD:}l h>|FME{譋?6iL[E~ssCP"khI|#gqy2Dzy/hHg~utE5Q@7ݐ"P; \mu^LJhK_2VǨxy):хJL2 c4\2*/n7l :0ɟ+ tn'shI#Tc(F%8Jsk4}#뮎@2 A.G>%*Qݏ{De"^#7kp h{oWE:tEwg.QI3tT7Y4㥥?mU4y[o;.=N'^O׵Vh!EA6;t8Qݠ;Q$]خc A\=e&Xe=#D~7<{0l>'l6cah}!+ˣNB>VkK_W;[/7kx=(]Ln5X}ZZ3kR⪱"z\b hߤ65RZ %̀^SȽ(Q"җ~uCNQBZn26ʸ瑸Q>[-XV0W HۡC#DGd9.r";t Ww"܈^7tY,[$DOץ }!]9ό ٷuto*tKE]`@nԺ.0ȓ u⮣W΄Qv2 YAK.7>*Tr^]h Lk4䰸t#!۠ixC~-ND5]]L6"dxc`$uQ1.8RF!U4!mQ r\}N!S9^<|&cWX{v0fpQF&BAUa=99[ =#`om%] sƧSΎi[|ɥz oj-m^ZR B~3w&16c\ =c>> /aѠs]UW8\ш@xTfgL63eQtsn:ѳxC. }k'.rK~%i"d{$iR:tmdwC7_ ] o5vfҡT6m > 쥻rvVҺR+iQ~#wdL5b+c,n /|tloKRZky?';àg= mw7M-эvwdLskX ƭ́Iq1!nT۸f/8"k p#ovWz#_Ի;gҡ0[z4d~kݿ䪛C|ů%Tݵ[Ϯe݈US 5E7|X9S09`ovvz&Kprs#*cuCrCnHs úݓHVHsF0.]KdK =mFn3@O<|֫%~CG:*:M9|_!Y/z=[ yt2`ʎ29ԱݢpI@^L=Dބ.-]78+4qJOʗ #.Q}t/|#CjٮW@TF]ӅefQ7yP wG_I#5 ]dzzBSbS U du75ZҬЛ#ct["7$^J`:sp(Mv-KfC(?E)r-z@kMj3=_p%ZnVCI y]E:2۠ xjYy_BW,MOr8#)zcm-+n} @ΰЭS aLkEEx X`uU;H7[`Ts*r[|w:ܨcv58#crE ;:RvorhtvInx!3瘃vcmb_[d0MY$N45֙aӝW0t1}:Ƣe͠'G}E $.5:\yt/d;aWv6=>^#kntՑ䃼y3J,..t'ڿQ˴Ku .WM/M#|Ĵ^:7t ^iC~ :b#MTNW[\&jI!gtFЃiDU٠_1;K3yOS)hFBj";1 R9mȩH:80$Y!_f%}CE 8'tFˈHZ۠CCE(2"QSb z `>&4y7稶.{BZbBڰvi,wXVOubЛ k pC] |uuG>sƚ9cǖhtذ|Ck.CgWz +YEμ y[G>%98V ,Xsq#Ġ].9F.#q1^h\t./qrxBOtX[~!F1Ę/rU6#8z{Dru\S?mtnHou^fd]7^X =Qw݅Q{T䦑?ggђA ׹ߔFM๛*. '\(t!-k~6?Ŏ6hwiF GH/zYЯ:+Jmȇ"j࿜^A7: ZvkteH`wbZd'GrԮԥg7F~]LH]݅:Vʾpt@7Y4t[GF#nuh,*]jyޭ3.*/jFmuXGFNtg2;b]C´NQZ8m_=Z׏ahN gOwVײqw}ӟ ^W/2?M 8V/ E b+C.3뚦'FHYҪ14*9 UF{O(0AoZOKPk>yD^@+bh5zU|>Fɮ@|xFJ ܐC8*tHK#O9d R!oܐw^ӅEޒ(zl-X:L#^5]>O|K4l\$G6 f :iVS7m{h3R7w7}/)6Xsiw_:a/-$26⯸ OnL.G_{ =MJ;ĭn5f }r ˩ȗN= (; DQGLfщ3}=.b՚Hp*Qr[BB%>'H}{4rkW65nv =`EwޥZ_O.\Rҿ"A-+=|Sב'lCqP7]o}AqmR@gl+{I>nt |<;t v@PZؒ Dޓ4*Ь#hC^Q!E.?lVG\r7yяeybGmfO^o$u35-H =u1'tUz]RΑWxja>}NqRتR ][<N07Z( y@=4d/'WIweq_q>N'e@F/Z4sZ7l]HzѬ/mk@[F6hCkBx#1 p|bnoU(!jЩK2EedDʫy v[36߈%fF|_)QoI 3Bb3crb/;L|Ppht%U[E蹮xΆ\rsћozh,Bwћ-$$! fE61@>H)ƋU 9Lr]bI}FBꎶigJ%\ bZ9}fvĩ_.!B(6rhp[c^==)(YFn- Asv[0=Мl<@pҘzKeu_gj[U׋ؼen׶\^boE欟FHʋUϏD9ạ뺉Rl^S#HiV'(gz5Dn t }CGtkhn{pI"FWddC ̱V-ta?9_sm.}CuiC~6ntɿ˻)+OwIjTf\G5(RU%'@E׋Rno=v!ۜؐ¨CF ]-vg~CϦu@Dz[d] El Whn17Aw!WU!JGhtMgFTiu^ [fԱAo;R\$7ՅccFD4>_fe7"lZY Mo!mH%\< 4Ɏ˄95\nvt=P_ޠ_Ejem]M CDc;Z}FkbнQs] )wBSo1@_ESN/^QUzF[ϰ:r+K~ tӨ%$FN0閤n/SQ%tY|45t˨7#'|Q.ɻ謮hKXtMS%}#w\Phw8yyqLo-m>h}Hؠɰ(^T I:CzƇ9hQ%dW\W #cNjta^RAXkt2PKp5挬D.Cu_n7vc} COl .^#I zn>Zbɣȯ+Fd\6cu-N({bn؝ݰS7c:rkG# 1ZcmNQ]u4Am^#u^sr#(QG7*o0hN ɳtBcrR0Ivbq9Zu:9O?ȓ\p5]4th51:EB>E F"u2\$96WEv].vraW3 :sBSv+Aݳ%aCw"XNSμ8# e{a$0^F ɦ,TȾn(f~}CN22/r\7tۑטǘw@zؼNJrCn)١ gkN^F?qK2HuDgF1zոW6"#o3ۺ?sH\ҏ๋&18z=dT>VVT%R6 "Uh )ri3`o Lܢ^Є)m=\S*E^;E讑nvԍE 6qb.Y;a6-|LB!o+26Du3hδ3+ߡr Co5]3:H)~NWC=HfP/CvՠE 9S6IRhw×ӰH+y0j_JóV>\z!^Drn6] Mi0|:m`k`|n!K6:4;l`= imxf[&r YYus\}@o( 9GA꿑tØ;/XГ7` %+c~%餆Py.z޾5QuzEV$^ E,.$eIY fÆ /m)HfTJ,u// $> ^8  }3KwZh?6#6רuQv/z:0r9OoHwAzSߓQ` )5u<*jœ~a߼W{=ШQ$@myt+}\DM +>[\e|"?G?AA'%W #w57r 4XE=h6OZpT_.r=S>[h1O90:kRQ=%o4AG5'oYT&+T~n?Q7i:Q)پ>pT?b(.*rlJ\ zZ%"#D@ϻ!bR0"+" tK?sRc@ӭVG]qix'չEai{^S_W-ߣ/ŐD7z`א®BRs.o\,K|IvD]\ZRz|l.ub@NmG6ilבЉ:ȹaDf֑ ^Ww 7Sdзzvo-LFGd4ѵpoԊ}hGclwUq?O')K d4*S묗}'\t{Q*,2>w'Kz\cag&odq`:.Ot^Cwd!Ջ""sh4mZ, 7z5cuGվjK/m[an賴X׊\n 1@S^:VcdhB=IEObBBęwpF.Aat)l}@no3s @u spK0_J_`D@i$.ڡETOKPF+ HK*HZ5N-'rʞ AG xT ѩP=. vKU#I+m^ r8RVڝht!dwZwF#ϥ"}ء,k2Ⱥ 2FŠ[ lpY"L.py^|Ng԰Us/FB0h﷨Ĕn"tE퍼/ J-5yEMAE7|́}e-hms-]>oI7t[Бhn-h>MsYJ<%wh@ahDNS{{j="̌?P7WtD-pBtzevKE3zt[GyFh&хNx<0b+}E]:]giE9s.vz' ҥz˥&KKkrR%XBJQ*6q'r| ?Q7B̒y53Wp*znu\5;OgM GtIE])ąLF-谯1>{Q3l/ ꗲK ? ΍|}md(]=?kg]=%/#;tHlecn2#;[0zYb50~@{ 0@N+Z}G$3 f^2`i#Z/33}/7t]˗MuƚYM 3habWE6:- ~R)tӗ29e+0I#',ສ#רm @51Z(E]aتhҽBG1&\:5C.HɋB'/}#տi# J>/E MIlϵ /R1 ݛ0iKa$O9 -HKG!7H䉼ܸ>uC篨c5rF֮D"]t_zQ] >I6G7}P ${#^B+T7ŠYF3$h&Uwo11eQn[ JeG.YWn"_<1nЇ պ X 5á3Uq#e&.y0He4ma3}#ب]rе[G{k%N%q"kӮw[s7Ḧ́ -ѡ*)He/ gyK^R]|,H3C%}¹Ч#4_#kfg&eㄞw/X]2"Xʶ+!WCbWv hvB+J.7rA,=Ry.lBSAs/gBgMu9OWɓ4 ;p9%:6 Y-_h_St 2Iz|7kFk_7plcu ?:>vہ9 }H`ȲeYTFn Zw -r!9LenѹpintHj 8.ˆޢ{.Ѻf]-s# f>uЧWˁ.]$:E+dc臔@Q:y9>V[L7r ׍~t 3lJ щRl'0{w˒c•m]afö9a]I.NαR~àF*N/tyĥ4h=Q]^>/W`䚭Q329r ^K]*rfeߚWYoD7 V޸(T'gGTg!?&jc/t9o&l(jYm`I]doŐ=zu,C'tƢ:zisrY"1\ћ͇Q?NK]t \쀾ULKY\_鈾A`rhG^]0Cc+P_Ԥuзܸth|K;$OO䔇 }\]C~à |gD]v/CGZbznG\Bo^(ȓۍ\Qy֡9=)O(:-NHőN6b%-/-5^zRz^MtW_B5tn$Q_i IwZʻudWi}"?F]ځ|魂\Ui24Z8; 0RA{'tY&^|nx]Flz9K"sDq#eO~ՠZǍ=:AhO'9Rk d$ze􀞓;X/[H z_F޿*\Yu@b R%ĶjiˀIЛgꕠKҚc^7Ǝ-07.3e.3.&oa{=נa@ۉb/R:2nu02R/H"O9S;4h~tˍ|k0  Fld^%5 [\b? [hvneO5ؽe 5 Tr LG'fW͵y&1z| g]]ZtBHW)/J]F ebȉ.J 蔴.qrBS!Bfڄ>!uvUÄ,߈?ȳnX]+m";׾FDn3ܥJE/~H_ ,z Mםz .jJ{|RK6'Wo-*zw[]0]z\z7Ag/RΑ '/uF6OfwutG#-O1*THNĨW:ixJsȱ<9;i>yy:݁4\;5>J}_r&a-#9 ٱB`Whzfy=AchMcZ/m SKit6$h~4еgS Δ6]U]y7 2NLÍ.2 5*tQ/L%'0xɾ Ǻkz y4D7t?ʐ݂uevLR;t]7)rkc ~{{?\+Ю.2`"mlf0u3hTҸۯ[k< @gBv ϋ7(,rJGG6Q}-#/Z$"E2 {/ԟ^pgU}SF1h ^b*3%x|I(O'$&v޵k4Ժm8;j3:La"=m^2u22is ׂN6^_zck*3~6/r],ξ􈍊"eԵ_[:;CY;0бyv95y+Ob‡7OcIK.anයסI\=:9(#7Lg⇰q?O_:uy-bBf̍YD7! ` ek;8/SIbfZteR^c⍜B.)J*ݴXqFy> y0*@ڑS]:ശQ6:}w1/觻p2:2d]6M @^GtyXEf"&/ҡP>Zձ?\@ 7`:]VNdz]ji } \6$ogE%cl>LҡQo\RǢB |֢] l˙+:/VzYH+;hd7C\T`oifʗ-W?6!K\^.-Jz _@KM}.@^"Ay@/qA t+ZSjF.[qս[4IӸ/zfplwɈ.ZK/{aDcທɈ\.n:.tr#aFi `wt;#4B]r7òQjȡ%^}k]ݤk_T 9.%'kk =ɢ:B_i]99H O᥎`JnOu>;A$7t7mmo䲈-."'ؙe#`: n~D,!JQD>CcusntcߚzepN~CxJg^V׵񺑷E/] ?'5l+4}4wE jC.?Sv ~/ Lx7Q 6h;-?S rhe6ݰ2/=fFߪD ̌_)/_El\/~gȴ]D+82*qmI2졗[Ln=d{ĎvY$&b0Oͯ%>wj .4$=ދ=ULNNlskq[v g׿NkwSΈflBBa/㢃<$o"D\w3;N tEો_+Iuo7koc58酿"7ooS8N[Woei Ag7|r):7,e>vh&>ן,7s@}@7/xNC7nZ} "X_[cVS^/9|M^qѓf*?̙}K~< yZGT%~Cǡu uhAHe.)%dzК{tpإqs^noNw_*6'=#(.@: }L.T#5i[}K}$1}P氌}Y\Ł{7#  \quo@3\W^7}VMnlx.q炬Z~v;vX'w ^hkx|Rs;kzN)ȡ$tKgZ~Fmy ZrRCW餒 ; P'xx`r5Ϸ`&5eK~mh _駑]3`vM[y8NɎMT}яN5H`}_;ݸV߿k8b8έ-2sGJqnFՊG pif_jYsf ~#+zj l~tt[T$ ߵ#cآhYD M J=XP;kv qѻ8}ؚ GA/~5eT$'x(KTgQ-L?r fQyy}M1^c=*ݿzJ! )a/aK'[tgy:K+ G3eY >6iMf?D{*: /0v+ޚ b/ʮ LkzRؓ.B?sX<('/@[/\s]]I2I'xitYBpJ3v*L7.hbzΐ+޾[^2Ծ!Fza)=[(HYc2AxO'<bray6vR>p^@ߕՊ@P/x4inm Ck_&PADdީ#42x#2CsF+א@w;oV`йJm 氪)Dg,Vnr O_S q蠄+\\YɵA tp`nb*W@y6~31Z@O_ t#TL@tz7Fr!wTD>F_M CBG:\Vojȋ%RQWPs'hޣ>AuPF>BFg}h=4yMٻGocщoKf~Zͱ}c1!tCk|Sq>#ມ"w /5biѥQрHu1^]Α=2FܑFZX*p =H#l"aƗ:F.B_t"_1Ͳ_=*mg:\iE?K++}zcI\2mZHF\w'p +/,rzK_%W\'vuAu!C%~1)ZIz7dfD6.7:6tJ)Rm:N[ H;4ѧ^rt^T9uUq: x56wtcj4o 5ȾtЉVנq@߂]3/͡э;cϻ\' =E>#5:R 6:?Պ~^#%/ru]ī/Fnk I,Euۏry$n ٌhCn`P.uQhb?`F>QsʼnY"ry-r\\Od+*65.ӝktZYRESCu-[7-0 'JCRhPp)/EbлD4zaOc+|kNX*1˓y[/AJh.S79.fLt@DN=j}4{3x`˽Pxo\Å&|`թ#(?83u>Z;nr[3^iYw#o{P*#fͷD](ic 36ʮ%0."?HU?}&zϷf|L!.<*qi5vtG5^V2jm-V:\NKRw8ZÌ:i{Eh)4?/R7Ϗ4USn=ȁ302vYӲXM- QR7@濤 30/ugh=w:'SN%f{jג.U2s[>VQt@'%{vՓU"M5%Q9-Ѓ C*7t %>#b}]jJ>z{1_!#%kڻgc݅85sH5/Wd6)6Ѭ#%F I527-s:n/퀾0* dW'unSyaL5ƉGa%%>F_AyE ԨМiB#8G;JTkS(|\t#'4St̡y}5*r:e70@k. x:*{Gۻycֱ*@71~#߼" 7rY-]+Ctr@]^Q2B >%oЮ_f(0t5&z ?UhFr 'Q]d "(ՑsC:sN$̻U_Xv /~ u~ 77Z#lt8Bw^4#Uh_0ѵ(߿v%//S/= o,rL`)inxnWr<{\ibO|COBӍ(b=e Z;`J_YiuؖZS=oR4 !8p槻KNmغF6H;d6IoI:d28riytdK|fzܓ}-V]V&\hWN^ r"[VFwK ZIDޖڛ Avg NŴ}3l[RHX7r/tzK׵^I/: @#1 LzQz~ǀ$I6!+#U}[D)mЇ$ǻO[mJR'[\zˌB /:/t!^zfWVꡡצ1]HE[FcRׂ=r1X,ё"t_Cdt#SfMSYI%$gV{{X=] -SHyEٵIo5:v+KNz & ů/×qwJ;CH =k`Ԑ"o4ErMYW6jӥ§/\ 7n})s"ou1hKN/:]$MP^l}נhn7^{oݢЭ 1 _!nqQx#F-Ř+2{#o{iHit.$儾YB}Kx7.i^_˯ 8sYA?Ed8"\% cξ }YBW[>9F\WOn:dŐ5.L~ ݂M_BFEM6}$unz@Wz9.2LWХ], 7h%OƲδ}PezgAV5Օ^J{l̨^?7%o)gZz(=rFQcpp/p<GJ{ 7}ְoao|t@MQw/eװG_wFޣg4Wh7\sf¨Н<'4qh5e`q;~Po~}=#Bk4=믅t-зjt7lv]wSY۴}nJQ&Fbs 9FѯAu|>D>]g-HT:kI Ӆ)ѣ.EtVR}B` z EU~ ]x |F z[t 6tw5&t?r@<4bs蚎>IFC']9Fr"/?+W%0|^['Ҹ7Jk="BLx]vх9C. ⍽FȋRha tu5t 3k_ 5}F}1zƉBll>>6wGtV^^GDAK4,&v1QC ݉t%^UYI?,DBq+?b߿ ʞzʼV UB/Z=gs@ZzЇSɨ:$ԛ@c)),r.r* Qre &7̐^Ӽ ]JzT<4bD<X7>aĖ6ot44߅䶐 5K%tp݅D>bNC#*vWzIw4n㮖y]ac]QuVΪshNCM%;h}Y .N=FmkWT- T}}.`h7pSt ǠndTdt]JoXQv5j/Al ZHΰ"= np*dٞ#YJc߽ɤVBݾ]Qa^nY=FZI tې K*^ 4ǘ,IF/:S^0.,$Gͺstz>7pt@t)-Y (w;M4 O'!awܓ_GHuM_9]z6=4ѵs:QYpZE7*Uq _5ֺNct B}z]͹NF/=eIs{ 4TN&5J1r\-rOt@czco(Cȫ}OoVj\bKc_I6B_Sy]{J )6}:&hKKG*|MKҸԀnu/ -†K:eDq׻-vHTuyET1VoK>v勑˯b#qMztYA}`|@߲BҰЅ~6 B"juCca*-tdq܅kn0x-*+/9zHw C\Wg`K؎NQ~uLjt]u_}<<΁|@ShQ_Qk33t'w GuKvȯ9Gt=m+]DBC~T.)4}{-IeqD*rXx~=[zN_X`jA֌-7jٻx}lfwwT;n/ŨA atkL-GMWgn%ZFPԽҿUCLo'tOwirk'ٗRҐy]>FF@ktZܗzk]k;̀%θSdgMrO Y0 ޳-t }Ir~z9IZڮcרC.HZpRoTYJ*rq4m?I^ZȵS.z- _ (*Y3tc#/:Gzͤq?RZh΋7~liy H9[^eOґis$\.*LuS4{5Xj2XՑǗ~lα[̀*нM׮7h=cIAǹnnp?sth&еQF@yC߃k ]hI?./6s`\o/ɎMbtY+If\O_zo47FnK×1[.M:so7` v-RonǤI7G6G̻gF#7Qf1p )}` + % J:{JWhNȦэ\GzqqDé$WZ?FFn7tjz-ZpCtm׏0/0Iq}8B|nKF Z KVRSߥE*ZxCo0bLhW\V5m33B@n>tT{N/!oۥ:Fu]wQ#\Muz5n~@Als";ݥ۝̦UL: Ӊ'iZ= ɋ8SHTR~`+6'Ie K:Jݯg5H-j@^y9ѵȧ F@^a@r {ŧ4?(uK5Nnis.5C:ߨtHN13wޕ^{ttaG͗: 75]Cu|RJzt5F~GuG'RO>+WQmfLس ⚝dOJل#,7'wz-'Hc+ >s#ё{^ Vb kYJ+~J#xuAse򊽴C%{ҧڌҰyF3GSw+9S'eT\D$.ENr ž,hWE*"D4#G7"ʁ|o튁F= o‹0':= w- &-=Z8*tfx#KҨw.YnЙ..$n?k ./ӹeFH}VeCh5T#Oȡ1i7B3>VO lu-g!?nZw~t ְGcuYIe^\5 _ Љp:tigwcGJYG dg@E^5f9bzN r`̛ROu.=re ]fLB^#gQ0̻n#>|ꨝwwqC!:ο .tk@N%w=s3 Gi#:5ݧ,y`GןЀRؼ3ZGG~Z(>JJzb[;7r][*0 o%3}}!sT 9Yn-n4W7p>I;L %^"i6- Xzû29imB.@9"I)Ĉ\ꉜ,\Աi]%w^Os/s]@ޢ"~b07ZWh6ۯInȴ.*sTD.'jI_mQZNo.~c$㊝X9 %]y+Ia҂nY5nYZ]NC_/FWh"d5f@[V1K9Żq t$"C&UEw#wEgVxa;}$EO6RZKu#_]ȕrzzY4_:K}|w_(Oa]%a/$놮kN^s{#ZVQ=iULK4lQW=߈Ұe[1uѯ ȩD1d;LoSK:yQ&טH4Jq:MZőԊ}Gu4}ij` }~-΍l)KUʖ2]pm6^noi\@ޣ9:!N.rOүB]4U;гK Z:gXDŽuDHΩ[EM_#,}0out'r]n6'u#O;V/ :%[ O4:8 OEњ3ƧahrMfc]û :C否3VIf[U/ RA _\w}"\d #'+z@_~AK4ѽ}ԐJ;=c u0C_#]vEB>z"!FO)\D4z qz1eRj<jгIt,]Jt7:#:,G&#=`+viFn!HKCn}#IaF-eo32^n8=} ]zt2L^*6M'n^ zٺ.@ިtBnvqムYC_ȋDh:tlYBcCc)4VWv3i.3hUhѱєinFa(w0orGoзg{~-nz GueRtCzZ坜*:|YRȼ,]вz'z[Z ̷_O-Ԙg_8Nd2eoȓ7c#~XMq5}o,k];ۺZ~h!*z6Or9(+h,7kD%+Ej_">A. ~#u tB@c{\(إH}W33K{&yd!S,O%fr|<ץhym}lOUfmOlA) rb_SM;`[>ں<^V.'ȍ!X~_0Zо25C?8 vkafqpXTPi `dorBl~ V1vO/йaSH5i{,QbR%A…>f/zw|֠ޝ '2jC_3%K+{ M]%o|Гl"YKhA]~eo/mIBx6=-{þ)7vCÕ'v'3Uq m/>bUgVg+KgKL{>XmZff֡ggړbM!E?4qJ8R,GTU_]'-^dy7h#RLg/]~,WMa/}q\k> )OR#9Q ܌5֍| C[ Ԅ0AwoZz=G~ č7T~_'[hDž>[4f57I$w,_3 )i1E54A~bOZ|qjz!` ZCI{=,'(gb\ƪ/xg݄,_(Eqɩ8[|㺾Xd* ^BfȄd& ^7dD6&K'_}$8? ?[:t|P`ZcELyI^}Zoh2^k6[,/=\;gv3r>"m$ Y;8EY,&SvqP[ 6%Z-\j (Ch^#V::VRգz  "'LoFP7Z,`v+C8{,@LD<؛Gj߫@+t7zZ%aIekg,Wȹ:Cb^Bą){Zo'hɼf %SWFmYr;l6/ YF<Y%־pf,E?&o^Ҡ":&OR75 P/؞rvUB5Y{k'BNX7`+ `wyr}:Z`B^b<o'_u{l!ožyRN1X{Evd_WABN K_+6^-T= $- _B/Lbл0?}>c"cuόk.[* d"!@? E/k=]o4 |]Yl]T#[{.Iא$7_)q &ΝOZU,Us*e\wn 6A _)֦!@zIJ/k_ZGV~_3{ZxE2нWAՆ o dY2TgheMzj%3AH f[v#䴾?,?WN.-SAsF[/'+?mкODѷ]vǻ$_~mh5^ll8Ix 7At]q3N/I'vj! r{^{k63/Vr6Z^q}<99aW6>R>m=$ IO}&\sk:-?ox-i p:Y"ӛn}pXp8MBO1 /kz/v }-V/gF:_(^|~ȼ.TcaZ]D>`7mbR{ݍfuO3_g&Ɍ U]@ ]s:p_ȳxO#j!?w_%:g<ћiW~r`C+#ŷ9N|HS~3FNF.DzHCVz֡_aB\ M#͝b8"ϩ:_]KɷȀVRuѬEz`B/F[ :257_FLRGnO'r2a՛껖_i?.6wwZ-H:eU}e _Ѫ"{h B~Z=mT/MM0:ܘK_ž V1^$#C6 DD*tEˉ_Y/Tur8T2i]@ЏjFNQ_J8ȠY%ºYCnbp:_ ];C(7zYY/cza"5'^tz^*rJF[4vqmlj|3a{ os^7NIkk-|dW ,Փ }LFs4m!qhOE1~qcs cZuZy =.[ם.2J&BH7 amY.x4]~kf.hK~D}c%õp3] Wr]]ѰE`]VQW;t5֛tl سet#O AoJwLvN1BRNI0C+d҉]9dkЫVk\xt(*g@S ]F9/^+{'HWQ?R;]*S='Qz&-^L$CF o^αIu (%"9fw yQ_ͮ<Ƞ8#7t^"8b\3G8 UXT15ꋙt)tqt#;q#-1qfK`tž-вr#_ |:y }?{Uv]#`9Y%7pߑ Ȇ-|jtsҞ.\K4 /@ҍ݂O!E]nmuu@_JOwuQ=R֖(Et{"wB҉NғQhRnJ% 7bFC胼d=j:lΆ>z AzXI@0/y@XcU@ ]ؗ%ֺ/)UMwh[]S}TJe#Y z9_*IH8d}89^*mKa}V =dJm3Micn,^ȷ6RAn |,@!}BVH}|3TP QdjV9,_~͠/N]8}X^/t?L =<_w)\3{ӴAŧ>ojU|F{FtvWyL 8_De>Ϯ{Wb?_*6 -W[UdϧyAk͏@3l&yy͢Z~ľA]J<<=)AWP&%dHC iCNlӿs (97Zy*8JeMReG6[~?U2A?®[K(,-*>'VR$~Qi-3T ;Njr]/}mvJS>֭¥ p&O쳈S$C6A~)הk*A7+jV>Sx#mϾʑjܐGj[ VLCɢ_iWlD(uSDv~7M \*Vá<х֣'Kb F:vؾrgx>X-c0;6} B,.kT/w1O;5fk3Zk4ׯ5-,xg+1ȍzVxŐtt`zĞY|tx ":9Ծ lD%INA2Hm rjD _k AzN Z9CKFR7F !0PrX\mx!N&A~Ⱥ~"4šXW|vq?Y85~i+7K( \Y^?<'z+q.Q^gI#ڝYDnI_K|"/2eЋ}/|3/pVIB_D,x {g oZR4d,Y?h{O=OtNY >Jt@Ez`o\P6e ^C`W5|zM /r4ۓM2vo\3h" ݽeW4jSC|eFW8XI%}.".7BtEF'l7[S[_d}uL:&ԡ{7[_FSyN)Z\n\zBkr{Utϔ$'T W/3}VgPy1 oIt;$:X_Idk4d:̹4,̾Z"]'9\⩂[&r4oB7m/ soy<*v8uЉalݽxPSi:#62[!w^ƍ-b lf}h]e`s 9"ZTb"mfm~ P zM>X7]Rgߨn/tg9=\(4Ku\a1.ȃF}o"薗h~|H-GXnRV&t#%:N 0=>J_{F/T bn}quB>wաIOAgD9۽_hmQGF1ޜ=jb2 _Km9h1Cw:["?y yFL.6H-z0AYy>_B90רVcWcF0<. vG\4q 8GW8I0jmuݦ}G~^Y=:E,x>b#{(k:c[Rk]i`]#3 NU?ioL2P,}K;:u~3mȯs8j[r#ؔ*[NtC^iWvJc]FJa ټ֕ȵ~;ct5#.uM-&C4m -8,6?K&.."KGϽ.v%O\ĵS5l=y*r淸&ӈc۰紖f t=B%lmtTISYN'$Xv2ؐ[[\enYO7O1]-#}W`ՒMnB IKIENKLZ:A= PЄ(!XЙbVv)v#UWlnjWX CWYHy߆#_9g=1 2ÅJ:/ =kȉU3>nTpJ'2_;DXf_HSPwKإˠhҔ1MЧVzIAkؠ ĽC: ho_G/1Ri$Džg^@O5] GoTIBHARwr ɒ^2]dG?ωhk_"s[UݠA!5ŐE2۽u0ڀsLԘ!kF..E_*Зa/'{2aĎ.) zt~4Dnz|n`T腜]dE+A/ˑ-9"|^hޑ'r,ft&uo16h;r*UZ:XcƶxC+ Q_;:Uul\+4o3I7II.~C_΂ܩk}Xڛ8^2n]$v]mlA;C?HE<7vH z>^/4BꎜtAw^4[d2y9@AFnY 8>ӕLh Ȇ|#~r ءHz9l@3E]lw9y93#;ryM@i4۠h<tbe7k).=| ʬtz6%CVhdϨyR]4ktD{x@ z^D@Qz!' 18t&_c<X~goՑWƄhP'J>4u#OY׹q݅m[OQB_}/ҠE[Fgݜ7 1E/C8/RftK="Q?xwͺTxgV(l̤6䯴[]# hիZiK߭*9SYe 4߈w5dugMaҭeA`RCw9uO薚!o o9 : AGSo;ܮ3/7jyzAo |NC{DYPг*o$ ɬF3GElC~]Y&_G?%^ sy|/cF {Nul]i4Vs\V"-%H;ЄF>32@0fhWRFu=)\_lk(2NkW쌑טo-uY7S賚q~E96l5T tQvzX 1AEN7NCQK9#iit } W6~I0hDߨARutNG~5JlQM =%g `b7c4!?F5#Oyh`gWڐKw+ W{`E!et̺K9='G O-pl 1>O75NapljH5v4p_g €> 4'rv齗ԑ,ݔ^**PAΙf* t[?hu=2`G\zn_ElX iR/o-dd 8׎qB6nu5h~Rz[}IsK#. &co.x@7rD7x\9aOtSㆮ}z-jl.݉5U;nu~[./G5#}#c3xqw XKԥ2pRn䲔Nu4c[Ӹ]$܅|9dDdVhe@v=cn>6{ٿR8C.nG)Q_b:QpU5ِEQ֒&3ܰx&0 gD$cc>ûBo4:*&vi-RZ,*UfЯ2xoW[K~|]]Ab*}S4 o`?<=4+sj¬, vI HfmU7D0\ 8Rdڒڀ_$I ݢ巂 tۋ՘z lkcnL'mw`06EFl%^ OC<+ ?ho{m>d0ob70uBS(:*2L֯ÌhRݴtW`*Z/u:=}=&ː~CՋKx;;\\CϿc/ֱZ[qMz”Hrf%ibn{_ XBubI hN GDC[c.Yflԉ:]bX )Szp{ȁ1.>qa, ]We5Rbh\^l%-FCW7pK`@v7pi h7>jCF>N闓` S9.dr}8unGQkؽ.1۠_—u ylȯy`\Iz"=]CdjwEߨ螋 8K 2yom?uTgk0ZO?QVTnrm .ԑ=Yy#бF% 28Ԍ^ڒ ZuC.44%}hݐMwu;b^ }WR>ktېsZAE5Ud-Яj<^@ PwAa}~>> 0ò]0Z6o);uz&'Pj>E;r|u-e?/-D.Š.*FND 9!a뢑/TZa~iݕ&y!Ey:#rT¾'yC~Ɏ ڒJ{R{G8ˤKw F-m[tySD1zY ؞&o `9B:)1NehN :uC,9#4yE#Yǵ9IɱG9h!=muVݩhi:E?cy0E{tduޖ8+0J`_)rTsx#̠'G1XurGU֌jG`)>9"ଧ;NHR#M_ҝ 9,хh. h]]a }dd(ˎ<067\CFH*}sBoЭZ>R*r-)4 ߒt:Ō0 8$1 }Xő ze&bм8=чSq&o=Թ!jx|MjKĜloH`Jo^ Hb7`VȻ^2V'oG4`4V +?͸$kB/zci-qaIK Q~gw?zؔZ[yFkφ ^U%%L-IFzK͏G66rσ8 }*$!ji5,#*~zGO@VA\6T(Sgyݰu-+z 2:j^CayO.NBE #֦-M?zd ]<#;=5Kx!Si35}wZ 2Za (8rZ5 y>Udǵ^%쪪QvM% =qʩЫ*Y' ^/{٦A'&Ohwޡf}o&yU "yCcsq''))g=osz.j`j&&5ґD9Wm_N2 Dp_tʪZ%8xW3DtO Z$8K9 m*DD^q_N_zf$z. -D[DЌ>? plۿ/*z^5` z{kgI)>&0k\!'D=Gm~&re etz%'SŚFCN*O5&I_ֿK+ג s8*p6у.-$)R*iߴ~EUUc*x"b'ʏOւ1,d]7B·VGpZ| ZIBl02u'by\m 7 Z{5&)tevAđ/;D.K[9 o3 oPEVxcyʼS;&[)au*7=(ZŷЌg n="/ 㛽g[Ggh#ZRj<;?E_C7ڠe͡ u4xmf<Η!-aV tõ_,֡^sMB{@UBo[5KDTN͖Pq67I}T[|ۓ7G&daC`;iUzȓAm*۸#GZ?{4g|Z')#=a4 <βrRч{I*P?JE;:WkzGV5h-\VeqX?O_`z>')':n-5:BB]+8Ys͵p%+tcqK_[H YA./Co<9 D?z:% [r2O=+ДkoAp5<?~ZOhzwWvp\:-{Pd*n=zCX^i MZv=>soN;|kyNkG t[SN:;D ?x9QavW.b猡2lZةD!Af3?H]6#qL >;O| ^d%©Cax0vFO?л;x_N?N =MV{x}qQŠ8;M'Oϰ$ #2x]\lcO:r!|_L+Zy@ q&C?Җxʉn-<l}r|7z'~hŵt2- z<|!nymQۢ rP~ݗ v[{4MyzfS +$!]G4T!o=EZuU m9n]ZlMNͳ`\1O5m> - zFo䔟h[W`-#:Z%b[1Jjt^YDY6ՠuҸj<pFYސ'QiIlgd<Ƀlojm~TdF9c덑>eڠ+~ ?2荎*_䒊/ju# z1٠$W9 .&r"QDm^]FZ0gNԕiCNw,Gꚝճ ymk02B$[=A [?/=#ސ3+tdsFY 5T~Hid*P'b(pWsx#uCotizFNo"{<4mBqԠ d'싎(YICҜt G$Ѩ1o!cs^$!yC:u?=ł[.־^bnFQ*y[00gyALU^nfbP!w^ z.! zBPJ;0SOQ黿L3vkNn|ma{Km"]82 ]d8ի^R-Ee}M~];![]H9"tuDkLo>ȳQL]!o1KvUIDA@g#9oϗ.@mX/.@mУ:F˒5Eu*wKI{Gd9f1WvC[&?`\oD,ދUq2ђ ּn;Sj3}9QgQ 霒)79Q82R6V/1Ȱ?]6􈗄z26Ա!Ϧ)V I,"@գ׺y#γ >D+7+- R߽a9_Enc ^z5@>;[vn׍fhu'|Zݍ\[\ s ?Fmg\W 6!n EN]_-ځ-WmGkRm y.M_ٽ [4Wfq]#m-2I{hkA7Xk`2{wUh._$~9XQ$ϝ} _؀u| N, t#GxE]=?Y?Qp-O|M-<%Zw/**RHOƑ)g5S{۲U%/Wľ5RY24RӞ1V>Hc|ѷ~c h?rWÖh~3V!> [^#gftm7 !XJs.;oƺJ.x | Љp݆$T/PB*'vɠĥ\M5`MKyΝޤB$q}02 GS V=}!a2kL%r0ـOE^`>U L\?X< }@w]E ~]|$IcMNyUK΍r_3 d,K(y4fA1m8b\ۏ_t2B۞I %ϸ9K/'eJEvOu-#~yNf"](&+% d9 ~|[^e]"K`> |oB{?e,5 geZ8}@_rh0s/``j`FlzLuv9oۍ\J O] Cm˺Q]\em]}X^ v)-iݔ{9+52yCbfqg>vxNCrF+o])|p ?Ч<T },zOBp(t?W>Y rp_ڞ9%d߱ݞ˯)u_5i[p+yh2Qs\Zx kBK?H-d\۲!f7hZ\GDH-zl|ѷuyoz LPI,4^7/'"DL4.SuGU$зRu-q*eR3[}H+oK9`R2rt<9r=W65;͔R}ޔd? =r?LCkzY)/B=7 ];7c)tAU !^+t9/0t5縎9% i _K.gGros c5g~fa9:UdYPaY*˓$=O-h*ԙ~_D.c-@` -vY˿ڠofXnSd)q?{P&xE^)\ !-^6I>w3LEK /YP5d57 @疧̌;I/Ѷ`&R?Lߢo76~'Z\S*S{J,2Zʆ3?)z]ja,ϓ$ߴ15~^gf|mƔɩ4*Geh.z3\*_ YԎыOA ?d_?'5܊@wsJwP^FEB+z<-gشEEo־Mk+}/?L?NAzEoQ_fK!! 5-VDGWIB].8ftlZez]7o. I};2}JR_SJ$?`:Dg |-1-~¢׼f>@҈3ЏآÄKN?ץt<#G+$[I>,t9iNҴՠ9(W'Qw*C_|eS5~~טϖ$Yj:OkH {c|B_|Dq-8^\\ڰVIB}rI;h2} ө{i ~f*\&~s_o:vj\z=yP4lXP5ok䂮g)); ͛^cB* s|]Dm%Zgǻ,ng@ "_ '7ެMx~rCǛb?F°y -WD/qǑծ/ mQ~, ੤4CC"hRߴd"]k{} >?}eu)Pھ6i rU^-fgy_k8UN/guϿ/hz~IK=z]Mu >e6-TЌ\ ~bz,ٱ>q1IP1KԳtUPszLWMmozmABW%T~O̖ `Y=U/#a] ڮ3E_8ڽr v.Ņ~؞UfE_%*f M#*KPCq|yGחUhno&fqth!Őm_ۏ[#řw7AJH2 _8P|}U9>KZpmo<!?BFz6`]R/W@ok 1Tz/%D 4"j?p=uce~K8/ o9,.&aSi%%F:boC_ qE;ϩf/j*BSդ!^~`K&ԟ{'$/ q3K_LJ4%OEKTEae?d' ,NU,,Vf*?ܦp'\Knlೋ-Cmc[j6iM AcW!ǛE~2$q_5F%Vda_ \S^VV@~Y^b:wp_+x#Kz33eG!:}wMVbbF;165ngbL͖>"DM~ŁJB %e^%D*9?KqrF؜)?ǖrxO 7֓dbo?'T/A{*~_ubo`fS' =^3Ck3n؍KZTޓ]p/)e fBߺgı,L2xJ!k%6n#K1r[0}MfKxM4' )ߜ ޲}(=h*rgf } ?3Ey=}wͼhh-tYY:ؠ5~߬Z@wg>O"99=RR;/c m ZYz[sQqF{尨ytZ:/ZGE ѱrT_7UU5l&zԘz9˯xtf#_KC世}1&naX'7do^[' fRY^kA:rAx tGR\gbi9"F˭}Dy-4{޾\I`AS;g^/"{_#MShtx[3Rhװ޳޷柆հ83b,fGΣ~5@^-c@aKW '-Kq;( AO/zj1kcV*̹I5l< l{ͮ bV\ܞRʎ! `tmո|;ΈK1  K?{>y~,aЭ?_Ik. -uk6' USsy3"agֿ%$~AON1aV6pAPzoH M9mV.U~-L<'/ )FvscI%v)IBNn4눟TMf?)jJSk)o#q&?1}?ZJr'`5~izF[N_1e@om57f>Y>Rz5pӳu3z{ffM3V6d|_Sq_)6mgAfDK 虸 ,cD\[9EvH%* 뙥>G}KH;Lӛ!&^.s+hbmZ2yT} ~M=ݦH֠?bJD1re't 3@fR>Ici+t{>ޛL䊵uhk}}L_!8BO2^z ZM^ oT iXKA:QLDr_#dLyNQVhr)F=r0 2tbޭ!I9 %>+_1{M{oI WHbC=Shf7?vX \둑}|DءfKHKxxFD^nK[y V2}gk3C 6ki?E^lȯSՠO$u D_m茼CT]\-3"wn\!_MwoxSRbXe9Wr%^Aȉmlk0::qT9E8Bo.4擹LrK)?s}[-houޑ:ji@;݅Gzz+tt>9勼'w49zCKb6gې.x_e#0)ruկ6@'CfۑРW֠eFk,q=F@wly)ݐmvӽ];c Z7ȉsWꫜ~`/yMZ"[؏Kj~C76R1]WUZ״tAmՂ1ċDGoim!ySu䯴~*:i2>Vẃh 0vȳPnAIjz[|A.nB뎎YE>ޢRn.qh|YVq!.҃^Xhd-%~CuuUY9&R yR 2sd>"Ћ!c_<r.rҶCS*7ڥ}>OQ+# qBNYy.gczc*RN\3b˻7ۀStb,FoJq..SdC$Q`SFvPtYr֠] ȘHCL1sn4*k4>{&bۡKޑkt<_;Z6-S!W#k&У:RݡSޅ-پot ,_'JT԰ˢ^ak4lqat tHV3~~S c䇯 -5u10.WX XT/Ņ܂~ j^C!}9RqJ^myn.TҚ:-ȩȦ =zm9!L) 5cGK`nr loʎ8#WAuNڝ=+gQD:2UeHLٓN&*r_Z|#'Q.}7oEU׽Ku"A 7>^WIz_W?ZŶ\Z]r2n-H%nzFm~_Ņn)v#.m;KFgXԃJE$BtRҖ~ W Ԗ7 9e$);[0AJ2vMYB[}u/5Huc'鋭IHt9x8irrx>Fnq3` }||eu:t6^d\3n}XiC]6+QC0Qh,k#ѐ?O%>DI#$xƲqJ!x])e: 4- |c*E6-&3uA/\Zmy>zH)ZKFR19!q#׵xu$gR?7wh ydTwOO.L컯_ҡ$s.2"& yN+4SKNcGH7f-b7]W%tG.e}I`WfH 6+K,.R=g<^Sh}Wِ?UMGuV/]s PF8RhG>s.!oQԱ'r^}CԌnKFs~-Il;r4xq yjHs$IC Wu.VƋk]DvT ]j h_ܾ_>\.H>Gv g@/,]J5.FoI.h L ÖwmiW^WgFN|ŨYC7eF}=IB]ZFLWl::#т. y]͋Ru[vBZ9 !¼TzGE Zcl,^zfwBcБqVtKN=o]#իՕ[] ZJHG!QEչu? 8-G7]ݸ]؝Q__ n0ry!cCJRGN,-Nv:?Q8*tKw.sVG_Spm:Օ h7$HuwuH >+rp_.}WxՑGSJ_zb_kkf}Kx=usM .P}>D%hJDY9V Z/\-ù%zu+Pˎԭ5̋x# ҁؠ_:,[0 (MFB% zh C[, % ]!znK$sQҒ:*m^7R7^;Z 5ou*t5B/덜W)zNhG.:/謍]Q RUJS Ӊ FTg@s[@WDc{qi_(r؝RH{uܴj}n){u{7SeG~u@z#IIu{G1}ZS.`=d =gav(}1FnK [eXy!C.v]ձ4;C+0.|f\ѨV`v+z[ݢGW>iC勊!].IIނ-Y@A־U٠B`uwb_C*v]M@~jir~Zttҝ͠ǣ#פo9ԏۡAa}o[KY̨ȸɢŮcEkn e^2}\&=#$vq+&8lIQ\/Q.0jJ{"_# P66/)6#n1ynؼ3*"'č\[M5WYQqoTbۢ 6|C {//s܏&2۠5zNG0Ŗ2tM|uy&M3}裗{*R~N}<Ұ[w_bF,n5h #$ M\<[FJ7،YKތrgy2Jlc^CP-{vWKLVtd%:8#ni !]R .ЗRF |+}xސς. _RR鳸hp> 2zos2 t>~/mM+qFoq&q<_:.{C bKjH4 =Ҩ|30\Wz|Ժ_ctz_JGV&JWZ=+Sw6y ?H#>R.+j*Ql=uiq _J_^fώaXDg+rzAt s 1̠o%AðaT_z6jrv\]* C3ҴvB'-i7;0*SX|ިuSBԥA+ { o@ԉƉ>F3:r;;EPLkΥoui^gbt|g=$mwI0(uC>`IQa#̴T,IZhq*@rCUZS®gF^:pu OZK>Nhl) ҲӨYo ûokDen2cg]vC3"",mCnKGoЩ 0(@qw̻B3HxUӼG]4O򾄌TԺ\y~vaof}q#'$I O;Gл/]9׭H2b_ K+Whɶ F} \ؽs I\'o7v#uXq1Gn$)2蛣et&92r*Z7W翗.&C I^<Ee;Wvk_Nиknԍ:mE3h . ^ZG[j9mVnH: .Yt y.z9ϧxk һ/R|g+W49~y]*\յf[_sE`hBW;K@GFHy/GjvEgT6nٱh*'rUT ۼ}2z 5Fs/2%|}A` ZƖ/5z+CE eW1= %(͎uR)4XˎƆ9o䲶u@/Glȉwn~B9:]֠=t߾HRy},O5-tAo:7N!.9onSOoɩEq}`}>V cTv~8F/{ȕM%uCcHR1 2:ϼtNE-e!GF]տ,nzFu`~qoȉ%GFmFƾx=zZϨ|3Wc6; k@=/RBZ'>W.rvo趆3Bu!_Zk(%ź4݇KGƴǐ;i~6Ou1Fn#_z>Ļe]>^U.H oJNyDsG^"1}`u2 tPYIu%{1}~c~ɻi?k emP[}TQB~22z+4,oqnd|znzoЛ;ˍ<LԱ~0Ԉ)@ɩv r o6wޅRהNb}~ߨ+$Fu: ѱHA^6'yQZi >vy#GK"ȥwř$.rNŝ> r 8F:C]+GWȑ-mq' E[=5+<@Ӷ+G 7^Lom#ܴ9Ѣڑ5˒KȌM\#W+6r.ȥdwc](ʹb7G& /ZL&9U=^љ#HW{@?o5V/fku399'f 8cۑȩ WF/yXgAox]1:=]H}GG OS.K/:]ehVTD]|uW 5:_2Ыv]tu`FN;d@S8=wIC]ц܎֬Czeސs0cӉR]5"8y_u\'.w)b݌6,0zGk&r.q=:޺h%\]EYren+Uw0ڳ]addK]Td~.ِz.teTɨ6#'ddDbv b&Wڌ?) L\T]itV^%J(aW^#\kQyb"'چ==6]b.!=#cގOIy]|쵫_C\p#)mnt;[W[\ |ӨgF^}/|WrŜah}R*;LOfz˨@u ypw#F]\ /DZC}76эxՂ-fl}AL hOtt)1U6#r 4Bn`CVW| 0n[#ä/.vB;>Sc*Ú|n .֑-J楅y@󻓰{cı"β!}Nt|JƋ8tWзI]"Q.ho-=: *orQ?u3y8i#чsVg:q9`*ПgM'ˢ HypC^#$֦G]̑%yqܨE\7-~ >6o6c.ݵ`7]|.Y.Qwoi80l\.JȎ7"ɿդ/v#ww}y[ iy媎4b ^Y e`,\u]aVO}^Ѵh!7- 9#z}@uC%i=sy RZz[ }CxޡZ=tfq1_tקK$Qxz!,}dQ2ʜ;\umrHG}{.Q'QBdVx<`x}+;uBŸ8i<^}9#粮\SDjEf] 6_ݨ*&\jxA~r͹ѥ|nYk._ [4#qWJZ]Sw 6{bH B}/AokU:wql-=FIށn!ϣv #Ɠ`̗bD-9ljm/Sv_i7zcN96>8A4"I׭tS.> zm)w=^^NG{:}]Zf]†0u[˃[T2GWμTKڥ&oΑxM!t.'m2ҊFa_E^qNKLFr^b.^N'F30 ^,\iG ?4wekYD -!=5)Q]4D/5tRBqR_Go)3twXQ񕼴7sBW @94JtVՓ5"d~q#}A4_rU'K|Ƀ{v:7G&ꊾoZb꒭'tZk]1GH4Ы99wnГq}UVѡ(ƗA7Ty_Kf̦0FtлЫvn7q5Fo_RN{rh4"^(nйFGП?D*K.;tH/52q 3H,rbg=|*7Q;\h-N)Fhw^R@lz| N Fq英%f\dHTIu[gLGhuB*=sҺe{&k9#?ȼyKU "9e$9/IW}1&A{K6ޚbl^)N҉2kpq"dc3vysZԕMd$Y{^$2FtEu*/˃gQ BW39uQQ` c*-gx%^\sD‘5 yRA>E{q/rJ/7(od\.݃|B֘ЇFot0oN,roxC!c7%;2կ5ev"]R}:YKa1*tOFTFk*P_yj$,qnJ3zAICBHzlmݽIE:6Nk :ҕ4SG }Tv~u|}&Ѯ+4KHZzN IߘqD YoaK}# Oo`^)yH^ZG>s~GD4:w׊E{EQ]xAkcS{A܋")mS/1f,Q>բisoZZ LЍݶ֍mZE|}~$ԭe{г; nk!dnKJD4}Ƚ.*5P5Q9rKt5{,:r]R:һ G;.h! -o.;\v5:~vRcx;ňtc7Gשi6Gx,L?З'\NviI)'uĢ3ZGT7#{a.w%eP{Ax[eOW'bjwKw(I".즹 Mx Z"u`_80)=k;zmDZs^`_dԠɊ`c-;ϗ TsE:_uÖ Z-sHzBƮIaȲ V/^->U*vY{_g[CZf:]׻;V@ 'PE*6BgzLma KVUdʺvBYMh8Q}cǎ"yA߭ shf*2!_Ʊ;:P{rBG ͮэ]00\nZWث7~ 9z_&5}o X-ȅLs1* <,E^зV| |N_Чz"@K|^^2΀r9"1c6Z}DyfGfv |)Rf>fW/ n8}S:dv_nkIМ<} rHf"g t [F;on383|ݣ; =~a>~7׊7t΀XuE;yE~$TZT~O}űBg2?ciZsyc/;Y|νml7E>^ޱs{m+\3 ]#P>vnQs7U͑2=C;'b$&t5 vo6H6lIǬtO\YBB^>)({ޏ˞8zH5@2ړ9u>fer~q(Q .'Hzdos9/Z2JuZYC{=;]0OWOĤV+[biNFR2A~zl]TO j5% DG\ޡW >u5J\t*t櫙_em>bZߨP?S|}QƦ$ z}}5y܈ZґT|1m $b4=N>ek5.i4yUzA4MY&<}SrzjY{zkxBȵxA'IC&蔽wm!Q+ԙз|/dw0ɒ[FL{F>wґa*Aږ)uSbC/ { `; oU }/Q*C'S@ _QP,MDc/UB=L>߿9z`en!yt]~!\={Z.^/ 2?$E\Q<й/--9$Nd~#M^()%H+=!8ׄLsQܰil=k*XyOV=F6ƀ%xxdUZO[a"ll"qE*\{KLkMN]c eA:@zq ]c&Y3 %/;a|Cs${-π]Gl"0. xm1gʎ{gl[Ub촆#t: N^/ ih34 E8U,+>-V}=3>^S24\Ձ.>Z>!C1(GeA1o Ӳ~ofŽo#[I}Θb v7{l|N}27yw6h[ݟm| ړ#Y;U[ZGiL]U/K=gi&>0_Xg{]چJ8^SXSu#_j(4U^[2Ʊa;鱯xQ8T&Tp jrkj^c_"mޗY '2dɟ}L9v}eJb߃` 2ƭ}Ҙ5}l}]Z7oC~ȫ4wJBrc/BoT7E7Bki{chc(!;tTB^f@CIRn`/WkГ~QG;g gS NzV#> ~K{Gn,}ao$-@z*|AZ}}r#ɾplSɁVn*FڎM$$M㢃SKa9U:J44L'b6=}NqbWAo_- ~ɬRќ+:A>{b7񼼑4:ֆ}􍽧[!UykxSؾ{7>{pyI"D=zۜO+9 QvJoK)x&RI>S,b [qKXs~y?cOc;$A c|Im}ká'dNuS7582br@g^>$_^[F -csdM P{u0rycim/FTGw| -%.4?%GL3ܐ=uo  zЛn{S_?J^lcW&}^1^m spwc ][KV:59'bl': ^݃8JYDBoKwp:Us)XՌ}osdv؞E ݗk@wٵ= /=8$T=/6S u~C_dwo螑R vq#bzD6qԤf7c/׸Ğnsc*JFY#%zcq>99}a19TB.ފ'-%7 [͚/5 vT+>Z~a N+d8՘*q~M峤=<ЧU)kaS Q+`(n29듏Tg+㚄mb/oedws:݁Fn!}3ZFU5lf5{2%t*Лd BuC r7tDƁ>xJ&lz#s7bƃAؒͤV&؍0j>nO'+݃܃U61iÞ2!xb_V4lv82կ llthFqDrJB}|BƒNzv*LΙX,F|l]!侯|/W C؈d@{6NF-SpD>+=\D%vG)i?JR;Wiom d rM%~{OPLeœLv⊍}Bfr5pq [**#w۵|N_LUi (ǃ}tNnWIqKђwhmoU5)ǡ/hg˱*FV,{&V(XO u }޾׸knյ"b$%]=RGkC OLLEaB&P$7l`v쑘s1dО]bq%=̓Kϝ*kAKLԂ`&wV8зFUhK.*{Ѿٲ nfb"~=x +4os.oD9`nWFzQj'o=|tZ0يA9q&BSNs v{*}J[z]S] |Nq]]bŠ"g]=FJ9!*&яUفsvGv~Ե2ń){Sde*-酱er@?0#;/URŷuhb1e:N?G |HN"vc=ހs_"֠`?^(s\|~KS{P7qK]Rvbo $ нvMG/IF>-F|ԫ^S[8)Gh;ϽEO*3duOc{}oy[ƲjeZ/MT@' ͒1 RPT~YN52]bK@i >fK]B/796!jE 4FT$-P#G7t2TٷFIo9hߪeO@_Ф0Gy)GB*Jޡ˽va:=n!3r=6%T2- G|R % Z'|&bfLӁn90P/GעXF=I #YVic}  pVj}{!\?sN DX(`װAc=kOг2)p?)G#h;ݑ؟~DɡW9߽ ?RՐ]_9gJ0~[G?3/ Lx!MA?I"' }i|F#]҉>]ŐEd0Rt{rl:O`{D} }y[`ה#&"#jۗŁw**o#s}6*!?J}wF es-mP{Z.eCvY1SnR18- Z|3uNhR^#w)*c39k͛]r }g[/(١7!W;A o9L퍽R+9}b]{p}ۈܵ&̎zI^9o=5)/%*M] 5~#،{7rZ,;"Gve.Xm3H`X?)] oTILWYTl yߦ%LO=b_bnzJ>?kZ7zû}v{yv S S sGE= F9]rCgB{ V#H]n7tOEs4̲#sktǩ3%"f994u, nWL_$YuA 'd^=.&!;I}$YOt:@?x;rx7"G{o*]ݡK>ktۧFU],om"LjxUg9`>g]=AG9G=g}}+A\vyO ;tgcc=#]/7`t%s/Mu5ten؉{y$ PϹVdl^3Osh0?T]j2؊,DL0a72ث pFV^gwO!]ՍP{8m w_cC_truV"s<}M:8ws_ yS*@oـtp[{a JV (T+@Ryטьdjt &$=@O55 g $b^9920vbr[ܡws߳nmnM3dVV: <J50!_T7&vs7aѴ.z$Z2z2F(BK]_t|RѸTPxվ2[^Ӥf8z`?IRmN%G4F⑓_>CH94x\%]㆜ܽ)Z_R в7pC CӹN*=_s|= AS9/tK9:EOpOb?Љ>'C}^. t?ޘ$7@ wP͡(nz^aa6vjRlu\؉̔dI/hV YS`%%a*'@oE)Rnx=va~>Ұj]t)Ct Ar^wӶKȧcZtZQs2DCK^x}?*fЪ~)4G[D-AdtE.z$9wqCf_1O/QOxb%ZU 9koˢ[TǾvhFfP~_TBf:E|f]6RkHO#S{2 {[FcЏji {VwB 9~AڽhK&4QʝxUGݡkLle4Ҷug_9$CBZ bbo!TQ"ЮQN# IShn~eBw6zs,w9ƍ> Xؔ6mNI>}AejWmз mRd[`܁ )dl 2{ݻ( BU %ya=S"N|wOB0;WF-zhm|>Ho,p37vN o~]|S6O ZN|VaǛzW{>Es{BJRCY/!Ө|B&8`*< z CI<}y9bTG2{ش}ƹ75?0*Ўؖ/}kcA6H {H26s[jnq%Tf@n.^[kW%'Zc(ڇ&r5;30zk^- s81ǹ]S-4)I6}Mz|L }ݏs[tz(^+ Bn`Aw;hg+*ȮU>[ ;_棛mūՐ'5ׯtz4Cnj`){Anq붳k_l/ K`@_?A75.+]^7ZװGb5'pA5uZ,Dܳ'{3r2]&AS# l\yWHB-iuL4 'G;tZZ>{Sjk7ߴ\C^o.kғLX"?G=~J1r Ц V=}oJmqLW& )\lAg .{#G^!^tLurm3}|ItK2ۍ)IzwrSToR %YRRT{"{W GhbЩ%87MciQT39{%`>I)zo`3A'zQ䍝$k֬8g BeC&eJ;+cIph.q.'~"9f=\yidm|B1;Q,O%v_ccxSG=<}ƌM>`%M xzFp\bly{jlڜ ü,Ǔ|Uv(xoH+t,Y`mr^^:5I9XpTc25з+.BǛ4~^'±5 X襾"v\@o :27vP=g) /?ɩr4&;_ЗOWlJub_LoДZ fcz*S׭Y]`]yΝ% ݒ$z݊4s\ =ױԠmOF|}E ]sSjEp4Dߍ!I6MLs Za4)R=n%dە@ѧY`Hv7}nN$hVU ÅNro`yr_3bojx㝗.ș'wY>PyEʒt6v5u.>D뻟'`XvG^|ޔ\ѓЖ <={N#Ųc}bl+A}(%!oD[ 1C j!csTîS9p5B'q_7L~h:-NQc}o tfN8Ik_ej;iZ^#'4 _[h`9|ЩV(G^?ƻ v}W^GITjvӽe%_:p= -ne -bukzBOqM}ϩB FP}cgT߃* m6Cmh2њ΢1r^db5q`[qתȍB:%@]f}1fȄ }T!&W!{@G`BAdLlF^Wc)Ң 3 \/[EI% :G+`$ILI ۆ3_SOY04Iɳ>t`#_k؊=7vHwԁ#4vN"~V 'E%$nlVjiVm]>0!'=']ܡ$GOK 8eGG#sEW s[%o]oNmri/[c'<*tax׋|5:27?Ǿ^:rz{I1t<Ǩ4Vϱo9OO _]SOLmM :3t2uM>5y)A$Wb(kj}Wl zʶi5r-O[kʳ{]  Q\A؟13.Oj/ rjQ*FA|WNԐCq3d?z{Q9r.=Hޮ T J@${yG?ԅz!_*rgͳ^ӓ5A~n<^W>K{2nLlo#CrhGOIWHv9bC:z/CV$?EŶC 8Q?[j|_roHjh#ռo5>ž2@2Im(؜#{ sT_-}&CBFM;u]|%ᗀލP'k{y7lR=/dN*1Lqѓ {/L˝7>.JEuXie]kҡ_[K RV[7z \~R㱝vB9Yy*ួy1;]ő< OlI _b zβ:YvȇbqӯN}>J~_N2Z[I9VsT_ñ]:kOYF ,cێ\b *vh ہ XĚ5_^G~/15Xh&{!gd*,lɮ fD Ovݠ]z8G4v"u]Z -.FZET} N]ATJu"Vk"cuQ߀װ,j^)o+<o~㝍Mx[N4G-9| F;)!ï:Gn nŽ9y<5|amy??vLᯞxoy1_;vCQHy-C}/.C[_i_a۽B[6g؎:W9!)|8j?3<N 㹝#RRع=?[|l+H4-pym'")y2gkCdV gkd}<ѷ?>̴}5knQ5()LJDdA+{I_Xudk@-"~sF^fm5#_T_O;u*yO7Nd>pʔC2G~3r^:} y"3Gϕ'U^z ]~Λ}!N/YkZM{NpwEP C{ =_#"ޗ|m;g_C`; cS=E^ƽ{dܖ (vVz5<|pO^ʸ5ڦ_5vžB8m^jOj*]ᶿ^pGGv? ,u07"kՠ )Z xdA sGҞ}5SV ִAOY+q=)密 ?}.ЯСo vF)o\Eå;>RD;8کӏ8ps%5~B_WdYϔ.Ci@oDe]1=v ;GgWNLL| u/Uݾ;-yG 4WsI<QSƙ ܎E|l|_$_ݹK\4SS4lt`]T׿N"13K)ة+*H.*t M&dٻ1BZQ{D[ۍ/iA$ }2eJd1_/*9Oi}BstqN.!Oh- /T-Q oЋa ^1Jݰsou_pc amzrLt JL ]M߉;.Rږal$| 6tz [YHK:r6@[`ߗ/ήX穽lah@+򆾉͡)G`?r[|sGR?.ՠ{{]rhj9YnK2o7|z&1=xLBi Xhobt9CU?ېz9la^E\ٔ:Gx$[Vds_V%sյvM-uӒՋ T `) ]^I{BMvO^{M{ &ZgWu\3}.;t%67tZ1u.#_3OҡSܤŔ 6=з xB'Kq$V򨠧ni#]gz5ǑCD̖ennh~|Zr>p v+tڒ<.|?5D5&픠\a~ԑIĮء?TNU0`(P= ^_ Uv'u޳?`Vs2 DvOs5X$mLxVnrL (T}s4Ʃc$ƮRʵbf؁7X–Cb*﭂t- 7g 85b1Sbڢewk\'L f߈Y=lHsr;G]K$Eoл>}J#OV4 nAmW!7F%tKo$Qa]9XeYqϹЯԑ (r8kzDX1dz8S]qfWnv)ƾ媪@R9طomc_K:zcϞLѳ=^dI6ybڧZ[W*!RsjY@'so\MԪ#MT'9)**{6j7إ^f7=+ۿ[{hVBKXٞ94ݐGz,XVQkJ}L7*j{Dž=?з&Uhlh$@jЉ{QN1Ez.w1.^9sG- 3ǔU }.1w&f:pKbx- M zq9L S TE*ll garxmmKx\M&UyUdQcu4$ᮠ7dRZ;zUv*ʥ$<螣T\`kҔm~q=@})+݃'sS 9J=[W3;=-XanOԫǽ>>\X0=j0ڠ鍶JT7N6 é}oIAN{\~hiz Q DO>5ޱ+T70o]_nُT:tCVq}tdɁ^ȣzϮ~B,jHtV;MS5=ΛbT71ZSOZ3goԡ-ZorʽBwށnAcU^:E1sǎܬV7[@5­d0!S{ۑh=jI-(&Fe7t ]TH%ކ9I̎<ܛ[Jϙklr(p:qOݻ 9Ν{ـ*ڌd:DΗv9wĸ@ۡmȍ|^ =0}<8UN{[1ئLط&܏ԾNg`DZq#h%l<14*SB3 :O7VNLjayO趬 zG^ۂz֩C{*#U ddk^:7px]_G.{CCX)dޟN}e1z>9 z}T{8q'7vMPnv#iw?o\_o6Щl5I+oH}m 6}@QJݸ-kNǹ4cַ׬򚹕lj!wwo`߭ /|}CC Gh-$^.DW#hxb@2vKƓ1j=񈗮 js#Ftϋ}Y*!ncQOcx-^񃽎̓{Г-C.Qs|F"_,f?[@[čnMf&)3Z2n;{ƾb$x;2ǎ*7-e{y3=iu!yVݭ޻DZͷ12-2*xEOc 9sCZ}g΄J\\*Qp4#sD^=?;֋)K(aNp3qZ?зe:Ԁ~ȴ=(徙&z1cVx84t?ط5s ]._\Qk#b8%pwsdaӕ7%c1w;qmV-EqSzU)rvKFR@~Ef9)ݔD̸c#&5x#vkՑvsdzhNe޸$+4߁S8}7lkl==.}Qc7}Ì{\xSx1^4dзբuh1<~zw;ݺpO=57-1c{B9Lq܈xO/~^?52tC3d%!;tȢ/Se 7~"ӑ%*$_R_hP\N/z3 pycJGppN!AGi ]0d4́VY=Pϼ!c vEiAB}~񈙵v\ZyBrI5Mש0k "ȇ'^R zAk{!ϩ2h:;NJq4ss†|H_ mj1:I7^ox`<ӂ Eß).Z?з*\:žNhm:tGȲ*dhٛ\tBQ6I:rr|K RxbOE zV#~-ώ?@۵œ:ie}ϬB~U)Om>aK ,04@ߎ\ԥ}N}*ewŻBs~XL5ǩk@/JU7)ThYLfՠ~㈕!?%/22w7{{KFvLKdC/f#0^`˃Y='!p+ 3s_\GȬښY, U*;]ԐSݣ90F>8>h,DpKؗ'#Se6D =XyO{7N]=iM8xr~N\atϚfrX {^\t]r| @>]V!y4hU[l]tDn}vlһ{Kd%?!1[at}}]gy:Z*rFܿΩ*3!ƍ\亻2ˋFϽ(Ҡw;{j< Nq'oũC籯{mВ 6=o m76 7dWq}?65vҼp]1NSԻi^BB˜, qo'.r{Q-3UhSQ~uJA38=T;JYW mF.qZU,{%z2:VEhnL<öl>zLQ+M7x Lܠ*_R]|؛\pf3<.gX׌R?S i_Ӽg[W%Ʀջ ${Mx' RZ)r{Xn=>ݵf 綄ϧP[C^B<!QbI.1rrlc0'@T~6e,&]_T ]>Tp`nŐBi$ߥ]Brf2AqnqORpyEw7x%|AZo{F YﱯrzGR#9 {q{rA݁c\C7ezt˝FM|hfoЭuh5S')cӗ3Jy̹V%52Y2pTE!HIb{/^Us JǡWS_r6[%C}-e&,Ӕ|a_!3xdozոhC=,WC zLe73fu7TB@n-)pCk#-v*3y/rNwzbi;qcEvmݓLzL92ޠGZ26L }*S+kX!KJ<}xr q/M?з,wlmg}k!s}&iUW>T^=^.-m{9~h}/14z_ )Ɂ<طx(c}[&zazC;9ƽu{o苽9'}]G͠W${#ed)4-{3uC*:Hvq%PܡG*>BCS`|A\ݟhg_,,?vi֑@LSeo<ʼ:u@ЧB1~"fkhǴ<=nsLc<3<2 R異|S k.Ss)uh4"L!pB7-#SjfpGw_*{5՛lfm5QAۋ:>ߡ|(EOꄜQ~mؿg_?ͮdNJU6CYy}Ў \B˞WNOkf V7hۿ V 5 ?') `j]Hs;k>ׅ^:qFCv2]y1G }=j)3t7?HNKԯաw}~~7?g?9~,h'tC\ϙkȴV/o~qw3]q^,LWe7k1DsEΑI;㸌#WUֺQ?c^[.l'(VG9 u' B،e*,uf^з`pbhm"{ k9~ke9n=Բ6 )ٻO!_/^NSRQ:'\?C _I.UlѨ~/NlFy>-Xkg}pSӥ 9 {M߫^NN n:űV\]g7PCW$i޺.Z[Vpo] +f)"^=VL7Tޜz Vc#O~y6zO jDƷ0>oQRݠ~lX L PJYa"j*aK q,}m-yLuh+h4ՙ1z}wolz@ѓ 1hZSwΚ~z^ ߢ>M%}  n*e >GD#kYE_siO"Q:[EtNK(u"b94ۮs׹|BM^jK^yQ/%SW̡rʓz8LV-KDvh}AOBGΓ 2]CE_)᪬ F0].sZl)`$AtKS_Řcnˀ%Z'X7-~ZmNVDZl/`^r/!JЧ@}TbI9@燻V|~SVhs]Ⱦ Jwd,Zh'j(BKFj$ ic;7 &,QYLOw)X>t^X lxzL@sjM7)m}?ܶN>jp_.dQ " \]/Ʊ~>y_b5lU΁>*Ù`"g_۱|J-HF=~}miAx'ZtK Dқ%™5h:E/G>[ S~zv2I }(W lɹf'Q47b>ϻəwϾ5?у7iCOch1ЯR R\k`{a}W.MhSITzς򳕟5 uUW_{~Wo5j5=ZW {7'(Am^BfYgȍjcť@氽o9q5\sHcP=4`u[ sO亖JM1nKiU+CՏ:gaJ}cwz 8f?ސ[%(N7`G&GE?>]Ưґ7ӈVsXt^DɮljvD*A'@o. S=6/zڪCZKńb%uJEKo:u^$õ8rL7\;sAT)_>\MqCN5&/ɫ{@8 tIH<|Jy#v4$by-N>E##ǟQ.H7$o7_~T\aUyCKX sd-M^6Cϭ/WJ}z!#Lz!~*S5%;4y hq ;?Ǧc)/%>CC5 =O&Al]& >+"m^M&;AQ_bQЗ_~۟(qo+AS/mIu|!;ҍU}5A.$Oqz__LPhp^$wKZNȏkGXpAp}C?\c!7uAƷ, | A?AG@ =OsD*3&#K&[3.Ff-.eokt;v{ ~.- =oRʄ=?ԾӅѾ/V\W d^]5`o.QۻB!b>M?^&\C43ۀ>eSyS6% C 0rGC\]b}=^\ڴpݢc? 7y[ dwoG{qbE>.FЋ>91SD^9tj}أVU#Zuz ȬFבwJeX<\K#DO䳠,6躮g%YZtdQDy2·ȹ!]zt]w`pMNiy>@CqBO'yN4א3ڴԠP7>2tmܬD+ }$=R.o`9>?ReED~1XEGwgAWxP豵ݑOoKJȎm;ĠYAOR#ad_F^ зzYe@n_?c6T K7x~E*[Q&GbBq5.~ 9isF(ГEY#O&'n}<*"_qmׄ]jr vpN[(t;@9t/aݷ(@αv"[8)r)>XT4 M^bڹZO :|wtsYs܅b-ERiMLYoJTtfc}@'-k-f1s& Ris ӛrHO=s8zhN:i*ЏX9KQРݷ';*ȍvur-Tg4vAoryA-W0'uDέڭ1F u:ӧˊ=fQh;K\Ǵ (gt67hY3'-ƾʍks"OJq1G = eg!M K_#<\(ő3>zz1>s G}E blmۗOK~BFORU}Nz2> K :7ȊMudڠ||s"Ⴇ^ɴ^}iOEH {˰ܡ_Y-/g%C7vy{E69he U~M~ҟsH洏dހ?%gа a^;Tfx\mMx3}6{Vnvݖ|% FH^>OC6|*ի6Wg^+ Ğ՟9F"Ik{x1'\om)З?B/u ;Ȗ"O$͠^׋,tMv7ԉ#Ơ;^_ܦf`y_&ť@%Lm"vP5t?Gz`#'{Ck4X[{-[y{ߠ[CO+8 X4bOeEOɯXsmE}p.\HJlFi?>3RhT zՠ˔E6xUV {1ʿx(t7zq ao?y[YNéO\)FB63W~BgǷ`rnCO٫ڰm1TnQNk][r T}bP9R/^sC!|5RQ *e@'3|C䎝e'xP9#^>hO=X_EWb>MϔM?f<яdSd6az dKC7o|Oޖ*BO%qf?bqwno[;ŒxCixQhSzd?&+r~M {QHDO$F!orX~0늭u`𤋾&W_`AuaNaf|]q@֡i,D^6iu] xMNHv OvFм{Z-~X ܥȓK:a3%. J1Gމ7!8\?GUfWܻ!:!3xڼͱ'#,뀡 V t.s&ifnF‡@tEGe~%[Gdgc7kn tpؼͯ#GR;'Esߏg?B>M]i-}.RkOS0H $ )|}<1굿Yb@yQ8O&z_w~1v%e~ul}2~-N?i'zp^6h6SSwd 'xuFD~_@!nb_7pݲ ΁> z<#pn-b~[{1߹S$~Ŗ_>'E̹BwJY9Yd{q1Ki= @FOā~/vV4]u]َސVM_勂oKuh`lw Q5|n(O9M7|Y(OdZ5X!%St;L"ZM/vh ?-S^~XGܮ'"g|`UG4 b^i}XP:UR[Dg(~1"8al Vl/bZ#w?" {)ҩȿL>zQt)*9ǵ[ b=_ =oҭO>5UMEv6KngF*t*7贛_ZJhu:a,TQUM/-I\\<n\ҋtIjaYw9[6C&]7) &OQ\YC[ㇳ:dþч˧gYT1<~j>EJV\kQy-S ;:yGwnәw2,xr}E'_hn9ꚬksoy lQQK@wDkC+РymL}}v!oFks!yTCD@Nx&Ww6Kcd@%HȉN֝K1}#!Y|X6W/eBnfN.R8wLZh,a\o1rC΋b~|˼[l"ھTT^t \Twnt>:]"nSv@4(k8zZ=L+5^E^\oh[FFՐa΋p.릤ak0Vw;\MFd儾uEe@k$xsőY#ŠQ\2rNhz N|9r&;r[M/0cɬvT=]j7S+t*_=/e_lo>KIޱ+ȯR$}H;_f4lnMU~PM NGlCv~35Zxi>|v.S=ߛੴWm4+x^N>uk*=\^M({9VyDXO+_cK@| z)L^sT"GFO}znoNSɲWd|}O(C[{7໳'<8rZbץznߑ\=__I6 + y6]F܁[i{))ʀ","yMisK7 98#W][x )"%y*#C.qz߱sf3O߉KГrՓN$~׵X ,j5EFy% |Wim\/݋ 51k :Oy=~.b . էdW/ܥ6y@{~-ZA4wN}#zc& {jw䛾\ t4β֩.IeFவ % BH:-z2-Ѓ/yx:EUC/K7uMTNj':ST]Nc<%]I:k:dG'v6\BN~[F)VG:9<کaߢB|/4 ooklKMZ:WjtwFpM~`j"d7ɍRAoA{(Ud7_:n?/YyfZ:P@q--{.@4Fʥ Vռ8*DL/ZlЋ;tPlFnyk Ts*'rvk /j/6@{:b=w-5O=b- MnЗD"t$"UCNTʁ|k|2 *rgo .qqTl5-w#%hY$:H!6:r"%v)=FԄ-FTɱKdTy1vYN7Jz eAˉ|>oסy o!*;ta'GLav@_՗p#r R) J ο{ M5_]>LLSʁZU_n9 9Mudg!z>~f4/y|Q*HH-ߢgQ7ߝw:7JܟгOgL A6Ig.eoGS^v$=fF?iXvn,O`E|vu ځ7Q&\Y\ݖtυN_z`G,3YL?hi]#gJeXyz !ޕasMAȯ@rȫnʁРZ?m: 4 i񉎪Eze&^3]N4b+t ߷.w7ދ.4 z@p;B,gN[4Vm\yF~2{G%@qEp՟`s9eBZmm勜6vn&Z9mukN= .9pn{osr'rhi"TG:bȵw8ϫ!{ jtVS^U$b:9(. =]gd_F|%.i؛4%U :s!vrt[,Qѓn F2!]|bZR ࢔X>9Ű9Eоu!еq hWtЎ } :KA$k]Mr'4ƅޭӟ\}↼OR2 hpSޱ2:K6])ru1Bks52] !V@ٖ̍.}FK'jD=zGflG67u[}% >_7}cK><foO5V3E\ q'n̳nk]yT2&uttCoWm9&xo< >Yd7}by ht86\hd>ۧFzVy0zIru4u&[;o ,feKsEB{e9V֢O𼩱%ٮ=Vm5+kE.cYz~p| 3tFp{3Ε V=eL̊M|>KAʜFww?!X&=f N{~Tnubo)risJ~ޑ7EoiQۼX8z]+V^j!@.*uC>_DFhGs:)ZCF>8[\̴ \+SꁜK*uʁ]tL^<1;>bTB itѓƦ:'[dmCwRO.z^V %=ӾwA\kw˒RnPV[3޽И[M${}%^fBӠo:oJ>JY^TZJ|I 4GQMm>7: 4%GH.ZOX&"z.7̜!+5v82D.ѼaA14"Ŏ艽ć*th3 HvmtBzkroaz]"_P5!+i>pxJ9]ƿ~?sWB){0O3P17ïaao%f.B k]E9֥dw״`Ld[h^}$؇}&7Ix@(_Kw'+:~ ^GX 5SNTm GY=E[耹-hs #'K[WZF^ߑ#ɇ腼o=mt ^VG=Kh\cxwtO[|U=I憼.CȒji1WU% iz@`p _z؇ÉP_/K =z,'TF} UDN*;_\<~p>E'w233tķ^fWMۮۤS{KVsYf("E@+6yRM' - bDvtv 9;t;ߢF/emRKL|gұ_Q~}+-@y;r/ A_(Foؿqz2颂8B_LڈFx)vl^kOYp.C rxO gȁG#br.1t'f~.w~6F;QwO5}{b5D~%'lvnW_'zpѷ VX`Tր W}' z'?YG yO_qR\I?,rC #Kܟx#d~\莜Wl(͕SRߑo*J$8rmTF[v"hr2CTN?z7{B46cjZ5ynnuKܑo^3_t [87N*فbŠ6Ogt1@&K%p&g3VYف|Dwh-ہܢvbvN[,3/{J*Т}Ю@z#ityz8|r!_[Շd'cW6WǴI[?=}:N=譿9N Q^Oׯ~PZ+/c_GJ'c^зf6e)+N8NmCq1lh1}Ao1֚ xD~&LRY/B IЕ؋)iohПlsބNޚ>D_?oïqX %6~z ht`Mѥ6"p,2NzNgZ}'^?+lZNnIBlPJPpްwߜ|v[@K·JH˼\č7]-,"G*>ѷ8iM" p:~SKMW5=rZҳ_}a*Th6Tt uYN"f|=R˾xwoݼFLB,>Q 4۵q o K=֯f h8[t[ԧ<1<4nDNMub+2"O?*opC~sbY5=>׈-ڡOxOK WIC\U.Nz 50z.oafS˰(8'|9y0R9ɐKc؎NVN:Bx79aKů/QF6MjLJZr],ٗ/ZtkDv[M#CWL*dwK.^fzv CF;7.԰Oo(ÖV4zw&_3_[Tȁ\xmKfx*2W$H瀾1 z>yQžmˁk2,BOq 6[}/ a-L/jz(Cri;`UGR 0OCK~;+>oaF.Н/~eU+$7Paoț㬑r=6[i';Sz pIknKz{/3GJ $d)czJ5eh;5 _ AQFCUOC?&|Zpoyq ߄7[.HQ©rYu%G\?5 I 'Vl zя=ȷhUlס7{ґPXʁO=oQ.K{]P7r]th:SI9(i@;2u;v .^BƇk :'EOtO<݅$Ϩ {xnOZ2u7$.k.y/tYnNR=Wey867Ѡޒ5 \h]٥NqmDqtz\ෛ%^^"/Jyn\~@!hL"{K]s=Wzq }@󫑷&Nlo ^5Vgv=y>6lRD.i!lm@JXg!=нE9F7贚膽FbuYg=I>$V:rq7bDKԦB.nk(90vZ(NC+j ~5ޡBg&p.iuk(JQw=hĶV9~vOM;v1tg-|o+RФ[rK 1久]H3bn װwцKE*r8'= ݩGv] IGd|GgD@/w; isݝ J&%ECm<,}lbENZCt>sm +B7B_7䲒ŪzC46KSIJEC״}:C.r-3S.["ym:d`侭}% fЛ܍y&4NӢ]J}}rl/ߝ;~kw&&\tݸޠRϡG#g٠&2}o댮 tѯ,>FM~&C5{$&w)W?)C <_ ^WW@+t x^I 7 ~Yޖ4rWBvO%V|_Xvb`хS2&z 4_k{E kjom*=`aE|ܞ:RRlfy`8R!lab}a*dO_s{`z}֣n,A(~}?@jւ7<&wB>OVWˇ߰aA2\;.!T\tM'+іDޢb7yoI;$nј!COaJ<5p4~ׯKEN/YWjH N7Vpr[7r/Mvzl7/gk;ń=&qAW/CN+3*rbہϸ VWS6=l5hҬdR%Ed2Co[oFCȪدs3FwTZW\FyuC7 |;T-/~Hwnu24r'!_=f>Rߞ4 O"rDt uc} τQ&r]_d!Z!OKG/Fׇh1}Q6i,N躲.tb~c͇hѧ ?7UvFe 95Mޛ f<9:HqYwV>*NyOG~GSkRPUȖuCfv@e YȌszT|c; ZCL zZa6@u**(fH^K;V3z}R8AF W*=˒Ek 2BT|y$f@_Z{LSհ^m757Ghţ#).C.Ck3o.`ސr};-7*[NzE1W'S`־ia,(YYSݩNTE>7UbkԁS ]f]ǂMZNt*g OB#AmѻՁN>]&D{]ET߰}X\z 9ZChN%oc!H}%9KVS.>뢱O5'+-?@ NRWG|E?zve r7]CɤʙwlTdߑ^oj6=<\_&l]yNU+ߢQ&b<+ՎR_Eadƥ!ey ,RB˜=id~6됸܋S@ Z9>~ _z0E'c&͢}lyydc7@o~QOd֑Ҧ/["Dn\QIlVE~m-~-y #\hA K<'(Wk^"I 咗~s%1 9NyԯeW+J;똨@KJEl (G+.Bnd_oe,RZo6o\Nkfż'UГye\-G"(Y/uK8L>*9vY&=%MɝV 9)ȭͿhzc2:IC1h(Rј'ТYvZioj}t[Gtٔ>bcx<ӭڄCJ U"b[vgzBoX`0 ciCֿk}} Yھl8# ++b:oޮѰWr| XkrףvENdyM?H._gYfX zKVy;1u GĴ;ǭAS{ZOmk<=Ël_[NNYM6D_fwmb+bOȋiv RdnNcz='Wއ vޠZ:Ę'ZC hnw7{:5>Y5䔽I~z^vplag@8ڽb_YY> =Xjn{[=TK5ymoG*OTuHP:knieѡ\)#,\5nϒ&Wv jwz%ʮIC,%A'3C ]֣Z,TfOKFMPk} rA{tOs>֧Nf,,0'c=( 8f']3bp^+Wd_|+w63#{{Ñ ,6WP$u czG@/necj<0]*bR#6f2E5tZ~4& ڀ MЁ-2vN1air4yBu }StK}&W3CƄF̯o;8orbq<#YdNIܡíz]_)?38JoڛzN\ngµ{/, .isOglTշUk1: u&gkסF Ժ|)[ a)k ݮ :žGiuZiL y^Njd[Bi3k}l,'-#Ջz%˵vcI?V+-kf04nV#v'p,FgWt\Y_2wzPt\ZQvߊbز\$ Z>t<\.I1x{RAkuq`AE[Qv-_캰wf ;y!"m1AvYW?֡G7O?VR)ӑ`ܼAuٜ7q 3(h y ]Ӽ8<յթP˙pVx -QFԐлcV_UyzLg"0u7~׈DW/SŅCzۢkҴ;Hn|OΆ̀C=hZ,eW=_tƂJ~/"B5z2=AZ:Ѿ3q7Ns -}[7jhgRNvY #zJc`kZ [Ia;aq)aq.1R&):GtvuuL>fj!myudGȯ0Qi/v,BBoj)k؅t>tk?lZch쑨r.YC[%thϪ =]: |hZ22f9庫B'L%*Ky];r ϪIq.gQ=%mk0B.C\Z "Z9LEXoدi-~,5G:K$1$ȭϺ@ tugYz{0ÖLB}=׸c?V|ƞ1H>8W)W9|;vʁ\JapSx#\{`5ޣ:/7/#.̂n%Z0 p]Jߡڬސ[5_Ձ3k`)/9.H|[aB~8j{!.{;գ s ?/7:U0dP׌.÷2u~ϨfAE;;^֡rb&]UOb4MNa }me",-=A˾L!pTݑ"^L#@_ ޶h ;|CH\es6WK_sh-/]C@/봋ps2udJ5 .r*tBϰM]ȗz/,}]RsF}S$sfiH-}|Gosh#'|YtQW,h:\-na]:2:Mn@rέ_;uor†$M-+$Z8ӁSɁFη^>f ۰Xm sݻnyݡ!퉼,@\v(nCG۫kSc 䜵Fnk'GlMퟒkysK Jc9bO[N36$c/4dE׉VWLi =\$WzIo6 so ~ qz}?+} /xZTVIߜDf{9}^PB:3roV*\R_oFfog>uf2_i<: R&/O| ~M_"5 qoOff6᷏)4|TBÉ~|jPSW?2/c?Do*щ%_g;WrVx3.%NM;2KF ?æ!K2oNT2xaz*<3o fC֋)恞reV z&O-*Y~CE#D}Vy^\) 7}wB:`ԘH #~+sCuɩ Q?ˏ9BQ莽վ޳ cy/J.Sě덕?_ .=Yk?n ɟ] lժ}&5%93k9\^J7 }:\LtȞw![beU>[y:5!^>˧WW߸=G!w-a~MYvR,CS%L[oK~"EW>mq'U#wV|..`Y鷀UZJڋیl-zFƋ5gah nU~ݦ %~^5h)ʮ4~&' JAϱۊT7ӧ,:+h2EUz' -#])?+ x*9M: `@ۊ7˗O+~^jEvyy zMc/%?eyfKrlyNMOyۨ/, M`L>z4ET& Z0Ƌ.=3$!cbrtz׆(&KlǜG *:A8:␟=m:rzcvA9N[7yoЌxЗ$%ݤsз Q`q~| {.ZY(¼p~|#;׏F5bI 4iZOz3ii6B='zV/Q{@y|3!ЇuV"o/?ŞؓEN\G9[ 7CYc]"74|c`v|ʢ7rWU8l-):!ބT?eS^7mOߧ+cn_\_/ +{ɒbri&. MCkUHgR칎 ٷ, XUBSiU{񛺲3>N&"gOmm U'uzY*i=>Dno2 _w#߂-t&i!ײyJA_sP@t\|+ޠFq#H}$|D3ނZ?F>Oyը̚C>b`B >L!(ٜʉ%$vUBħ.{bnLϩ:w`g劍-Ыߐy }O84JO L*'t]~NWtꁼ3R.˓e\ž!ItW9 z^.JdȉxZ=R_7:xs1@3ˇf_tAFחF ruW0ӃT1 xOؙz!of+f{U㎽3<$/u0{_؍ R{] m :c'tk9Pt#ߐ홡~ mr6w#hRg FP za櫆Y#ո֐Kj&tʔb^@_D7k#.Յ2~iXbkͧZ!nj0 i'eN{=r@k}4袺kt^ hqm: _bPtH%#F@$ZoumAÓqTvu+=ĪœGυҐ}E0~xc#oq/.Iv~% SkdP;?db,鎼?EԠ;7F5)Q*ẹ{l 2yѮf9F*djq-u/!n%DC>Nےk:{uDru;MMc7-J9vo߁ߑo*FBەVV!ՌCyա%eҳ}nq{5ZBN:ސt"=Zgq&^e}$[/pGv *Rnct%~ ܻvog\0ؤlRNt nm ?\A4ԕ-z݅H#tWdLѱa|oK +y"xɊ[iƠ~J|:vBΆ]JU9[t{Q=W0}G*ɼD ]uEx8Ķ֫6@ЧvN\pKd~ȝo⎠s/N_䩡d ^RHs Ӱ%i >>ͭu_#RA`N7vLAdt]Šz o8!5.^6/˞ C}{2ʇ[ yeXu^Zȣ|G,ixH{ꀠBu ykysU?ߨ]w\rwth rtdzJO׊0;pKkEDwy7rFޑoT5h4V^G6m|D=k,`%tT|i_߸( }GғbcwDά@kzcei=geE>Q Ȟ{޿6_MCIψ6^Y]]e#h/D}e]KskF'­핝kۈ?g$!,;Ch^/֠DzBEJGe/)E>=^kIpBF$?uTDo*OpNĻYP5P>B '^uk=^FOX TsKXq&ڨ@,<[^yERY*-Ʊ`DO_RN/k@ M1Z y偮"21_RX=%Nc24"~y/NX.1|&1tA{m }>|vI}聜B\M_#b9 :L }'`P伋mrlr%ȋwO^~!3팜v2.2*Vye7$E z@km zi-WW/ミS̍ zyA[FtHgKc5":QL(_/m@g̺xDvBq;y^WL?ȗhʬA/2PZ}Q:A!Y(y-{;S]GgZGZ"K׫RG7tm6as[.rW44aKZ6^f^ldȕR y@us r; K(YQ7{A@n14.!]#2QCp^=ɐ>Hà'/uz}B7t wK x54vuz;4GjSc3Vyw eЁܮyz^P0oOrmjآ#q `&h1o^ G1{z)I5v_tƽk+%;. 0J=|RJ/nCTH_d]3hN0 #Oq N[|Qk9VW1͑1c n9A]QkL=%$`v_)5Hz:toi|Aޗ cーj:xm!FwI-i"lL.Qɮh^GD1bk4^Ш9W0F?{?n!W5T?^枏 ~ґNXG; z]sRHsj ccG^#:kC Hī7{-~<Ƶ`O/؞v`s\3co>Ħ\@c't:# //sFBGF.nk H>ZuTktx_Ǎ*Aqy^@"ףܾNz7բ7UhՎڳ)=>^hBzB$Coj.@F]q. [P/SSiToQ=%\ը#KHX0L vFw6o.҄飝p03/gm94jpM"0JY?Gh֐NvQk@rFICREy;; ֡/{`A 3hETMz]FbQ `4˨< 9%:שZ]+ODp))װĺrd/7W HEg{ @vj ""E?zE Wr/"r|B7*wAm@FS1CzY tY^K/q-Uw/_ה_R\ ݵ JVC`zKǦR>D/A4}.'eb&A:VSWC|Od_,I[E+H<ЉC"e>_41{|I=e_ -Xt96pF8MBTc3z`׻Т4RWK͠ң=Xb2 Q6SkԤQQZF^WK M+G)zOm`]>yof4ˆi\WZN; :ki.teiYKS/)3ϭ4A/|}x ΈvQnѻpmzZE!aEC5_3m/| 97iEY 4ظ#ݼb7\ls_/ehq7t]wOuDsa|#v|3S]dOi\<ǩ^?q@E2N}#OB_ntqֻ$:ҿ7C3,ĵ5TfҠ:#E3KT3aOѥfHE'vY[tBi<6")@꿱5NC:b}L`j^ : 0]AWTiҊYKv_vHHA?J1zR/fAvu/o4`'<ءH1:Op#}^Gbp!ch>I^_t49tOڟ7|}i,#"|'FhFzvq+չGuفCȁ_`#oKN{$s F|E#[vW:65*.}p$zYx/nAFjz9J [L/={?|%Eo2}8';RkD%3o>f4V?zCQ`MuW]4]zNZ:-ze(P t{qHy1^a$q1"2:RqEZ?>((Pw19C)]PIo/Tcad{a2lҮ:#`WQ{9z 0Ez[|4#Oб7:&n.1#C=ȨZl:[^3 O/&Ȋ}l[xAz{4łZ3"tU/?pf;Ah>§ɉ)6he'tY:"~F2F[%m]jUBYKz:zncUGzu.+sܦuh(u(}dDEtAM][F5h5Y-\ϱu ͅ~[)beD\w^5~Xi xj^_ kR䴥q(;Q\bNNc 2UݧtFܺ~N U??.Zk<]̥e=]#cӳz]1ttd[byVZF#O:͚Hj.u?S"o09ɻF 㳺}#&-+_}߂wpM^3%{-ZD?6_\=+n.pe\Ё|6/p݅vtj}\vNGi|d䔥EWѵ:;= BqB]\_Gkzu, vA_] ]B1#rdvD#j??#eG;fIQti_Uآ.ԭ #ȳD#Ї|t~G٥0qW'\" rT4Y! eT>M7{ g@y-*JQS-Fnq)\g_OEg9WD):z?ʠ]yilwRP.ktV/)>:tmQsպc&.M/yBNЉZ;5텐Q}U}9|Kh WݷLL/]t.!ص~(9qr 䊎ntۧQ :5x:E`a(/%Dtvbre!L^+F/蔋r>{4N)C)UWr57th&:`0L?1hC#%^3F}RnW9}!a!WGmðH/@Kq=] $bqBrI#}F"S7!h&}RpLT#4b;L JPGrFEyHEރ:*! $FŮŠ}sɈ^ƭưQ{@Aȱ4 Qȗ"a 2X e)^ =`v{u3:.ILt߿猥<}q.{/cA3ufN'}IK%uC^U>u/@}šRu(Zm(tN+3g^}-~_$u ~%R+GJK?$rY>Fl_ȺzK/;42C&x:Y@M!M7ffv mz o^,_BS\H _yzϷ>hB/Mޅے(q}i8[)6FNeޭә(2Vぞtw0d>^K.܍QEVx.2wjZ$Z}Mo<-=hKҼ~S}A0|@i@If׫9+svյ`c =gSS^*Yg<{uԠ% }250@NK KZcZlzΧo4\?gڕRU^//2&:?% .Hr1Ӳ"K z's" }u1=-Ed ={$=Iuo(Wt|B]ziE怞=6F:#j^\k=ޢgW]^cD].,XNwEo{%c4i Wp19n4:I5/~癹B7:$BO> ]+5o[eu#IN_57"Lx36s\Y.J)^%V ;"o胡oV)R9 z"|KհOEd#ҡ%e_ N[l5(@N8S_ܕf}Noq/Ajg1+`ݻ6ɗ=IL=鿮'u~ {RRk#'tFoyú ?TWENZNi_!dXrH ЏXnp-U콌"cj] YQ%jZGWP@EN}ԋ"7`9Z7þUZZ=/(A7"aj`A(z{j?VNKwd!Gܷa҂=o6;%M5>{CJ䶨^֠w0Ispнi076gUp[La\_ہci^. Uht/; }ދ8G #(;S$9{>M [I=Uo hY`J92Џ(qNx O`bžׯ Vh 󉜃uY@kzd't F47]})aH[z,K=jO{W_%4ްs1C6{0ϕ1_64I$F@3Ys!,5D@ޮ5zxo}" ȇ~o2 tXl'Y"sʬG(wj_Soht&Ԣ_y f:n|1A9*3Qn˃|w_@G)F{'SĨ-T n#W'&<55*r5]+Kanx@u4g:*9r [{ |]L+#)ͤ[ejR6r,T;%{^懿.ygr}#vUqM8Bn|@unZK^kD~k_s_+tku Ё}=56I} ^|"9Q ttkj͍"n_2=OucڝB^c .3rD77~!W yĽe>B %ayu9¢nͪ\ {+="퍜}SZg((pF~KToBcn\lW9K B\[ w\]&;q'^Bƫ\\V80ȝv iEIC#9Cc0鑻t.cB]t'@.gMqq3j+ReijBV篧s=fWa@YSo&FM}#G:]DHWG%CZT3] wQE/)j<]3 >*kty#b:yQ:݅F /77){k|<^Wjc2ƁGn&/w^.q g:2Jf/u1?/*Yb[еt6w; q:v@8q 5ratG\h*)D9{ϊ4o..vk(0 Jvқ"3}+U\/J&_Si"a rHmFg3BGaW@/hɶQbPfu=oF-c G~D Į0zO+"K\_B0kvCNwl.$52T+ y/6t*/75Rn#9̾ŘzHSyz~zF=)HɽГuHS͠@/ ;'oǩ MUk4Tyɗ/ Q52/1}/d[Ȍ67 eD+4!' #Gv J Ui>&9PAtZ];Qs =.< {xbc gHx,jȱ<Ҳ^㻫H.m%G4JYV8 Wo]RmGJܾ` ;MNBe7 r@9hJ59mX@JzVL+!4E)0V"s[Vr)67>SF"lD)v?Vh޳.>FXFEfu%|V-" =ҷl 9Izqb<Ž=XX :M̄mQ=t'ۢ(3JgaWO*ȭj@6dZ,=Oܚh%Ct}iEgU`Ui*^[-suŞ/57)iPސS=S3$ѩWZk%v8$uˁ\;4St[G ބNm鋶|[]@w];2ΒA4NgBqd:=&\bң2#] x[tfDв4TNuVv@ :nt6_蓂_en@K5fc@&mY_. ޔ@N~>Gy u @qmNz:N/2k9Zک{Bvy'Cd^^5"t)MiB|s"]_Y+n޳\x<S'䚎[\TǾͮnu{ 0\Gm.*9P5ڢ[ qy)%OH؛/ltW~#eH;rh9/#Di%Lӷ]kZR('vIdM9K_aluD[]䭮7t{ ؅4 sְk݊#g|L5O_e_r"5G/_>6א,G$.@NbzIqz:R^G/ev@ӭс\caotxGِ=X<G4jž>|_ rYiFyKe]p.exyoC2qt|-ȉYƻA]tfL?/]H}Z稒y1voɴydV[^u@+1K ÝkU:")s=M-Kj$)TQ5:Sz}6t Kt5]i]?e9Ah3@Oa@/o~d2te-tS] 8?軇4I-ttU&V>]-"_I g"Bȹyc=::4JSp8qP 5JW]]0eA9޳@^#ﺿdgS[3kcOz7]lWxNd7f 7xd={^tsvxfp]g鱢6r{ IơФ't[190.]miK;[x: O$bt=3AxK/.tv a&r%I~R'l3>O.?[\\k&9]5"]7i7tl.݃|!%r@[7DNkA &پxi F/8ӗ$#d9R^.,9;Fr]:֌r ìF,c#F:`\ī w/t **ҿ-Lt_g-(-6TFLWHcӱZt Nir"uHw_,hͫo /yt:i>Hw+_NRK.)Ώ5>R^\o~}/cjw\c.G2CT/=3K͐KRr 5{כ=V`_@ zBOTgC{rk`3DΏG^v: I]{s?G4:4rZ{?s`LFsWzJ߼Wރt~\`wV c#oQNcc \c%v?Sf֘E>k.טϴIhxsto"E+s3oק:SiB- 9%Aq ]sα己)zU)a`Rv}gΑµ9Q?[El*y.k?S ]|K]/Ts`w ubVڕSEHR5mCoK!\_rgu{E9/Gy8ƌ)6 {>}B.u@R|yAn.>^ШcsH{AGOi/zZf~u/们q?R纼{]׉[,:/.'qȷ|;k}xԛCj``/xmh|&17@KN@zy|kvNg}Mx*.>lFQgTŵ_vy#u)pv9Jk.r}ѺE^~}!nd:r}>ь֠S]w%v{!di]vڽcum#ȕj;0:V\>1WM6vq?Rmt h4s<JH٥:jDQA!vBɮ@vݮŠej?k˰t6"U{FZJOաt9{a2xgcQ#RNu#6(fr@[Q+gڳW %S NeFeti(9xyzf^u' ǗNku@|k`ϼD-} HWy A)$ȣ>+;=ا%ZqhLIxҝ0}'SZ͐ium6}^;x[ݮz)trZ}^-fX:%%K. h ,PȩnNƆ?ڳ2T4Y>.K$ERĤe`Kw>?'GC>Pf1;u,[Jnʽ[ "lVƏ\;JvhZ)؋u{$E6Md;2K-weԄ#|3O蔌vI}55Zfhzҝ?^xhzL As/ynwZZO{) Vځ|&-QҬ1zJIRRt u(2gRߢ[^=gu2Cӭ#5vNJnaI=ܐcD~ӯ]Zp}T*GkHҷTT`hyKD'D c֩,-;d-<"$=m^: ǚ †Idx{='+UctyLnW 2 `ʞ$I'qCdaB]b-pzznv^F/]؅޺#ȐhR:.#02'A+P2<ɜ L ]#JjuӲto@#!eS_Yõu  `t"gtvO6rR1]/+th>=m/@cVl={FtHKt[6u6@n|c'rlQ7 ߚ>NJ% vuW'Nq^8>75@Ug3\~BoѩsLlŁZV\,fƌcz/\^cދ4&X6{t].;sqX=^!Oc3*=Kܯ@'0z5z,o)7c@}Ww[Nz^}?F_yU79$0|uO+L}mё}V:sd-^ rar䁾0T:n|7*4Oj10~ޢ8FP~κ8CڽKAsG~5#^4$] ?JXu쭾R9}o3DC8r]܏|c1k,+Aֺ*tb1Fv@SBNDn Aoy+?Г͐?OSjxhn}&7ڒ;:vTݕvy6RZ/mMxyX{6]?⃭7r]5)"S*TN̕$FƪH6yn v x xl8?QlاTiݯ]tYkcDĞzf@쌏925QH yFy WDqqֱiT䮧FN226JSlwH0̼y0* )5Z leߕIJ8:F#φZ]uQ1ScMU93:kMw.\G']< }~6;EmRՐfl綥Q7+͢`Ð9 "MЩv:ӊ30"Eq2EJ.]uo4&@vu-`E/9zI >/ z3ֱui'Bz yD"H}lgT\+!ExK`Q脱i;>p؟}z_GwɖngBFxQ+ڣo=ʗӻ4:GkfU"Bn.x+ڡjI#GZdtq.?د,C<`FlA"֐'Fy uHO} tH'KQsu挈roSܨv"t_6¦}:Ex1Wu?v?nZ^}a^Rm)a6O=3H^-6%ͷ$Ł2aV+u.>.HFugi 09Ÿi.  cprq]W*-2R' ZWDDž]zv\j'%J\ ]WߢщG|zktӥnkD%TI$NͰXS?@oNx|@rޯ U;Ktt`ț>l-3pM~_cxC=EI:Z} HK:4jv@2#茑 =}{4gv;-iOvrAOqSfL$C` :HPȁ|]OwsJ'͢yq9oJ5Cn\H==}_l\-Nwc=-^=.srC:tiK{ɂ_~ ﱑ^j:ҁs=E"$O?kщt EDh0~F6Vԕcs OT#/r*4)Gwq⏧A{ GIt\VuiF]uMI=T!F?q.ct@B%4=Cy[ Fk}VKw|Ywue: j8k^QH?w1!w +346h=ivao֏aTދZK9X"JLva'F[ޥ1w-:^O!d/r &`%h~P=ՈԠ%RVe7)c_MgLe 2F x|DLhN=SRGTk*mOt(rIꃣ,6B4_i CN>޽RޢI7;OO VىСq|2S Gkt;pkpU tҡ:/F!L7ߡ]ފ~#3/ŦGCFONi!2K_#wE w?X@;렼bhg@_*zfUa4^ bׄw ߇*AwS1~зG<[sw c@.A.|B@[x{;(1NoKqt.eXٙy8V,.2ҼO3SuadH9O35g;ȉ֊3vb`lz7 wcnC N+c,%| 4t=D _U:KwasC\ץ2>wԍ`D9 -_Қ'S zzCߒiEubzY(IGIgAF}:@Jc\䣆ɰ 9@/3 Ү;ޯVL~ecVC^hhˀF,/juRT6:IGX޹ٯ}}snO\:lrӃ5sad3iy B =:wv{W}<=:zQN_L5kȝ#zBޱxS59:s021Ws\Ŝ:ݕVcz qWٻQ%hj}]lSrNZ`;+5iϾ45&ݛE`3S͘'h@1t[gpг5=Oo[Dy^hu6Mv;CkCAZ[j=il=+#u:_RA[AiFwwKݗǪp2cGtm5 E75v1]< {u<+ͥ9ǨCtIvKz9^PhͷJ@&^.-*c{ #ڮt_^ENd»IE/HH놊RY)ƞ7yVM~"FAJz1\^Lgu]ulz-yshW `3ZKt 9Kkrg1:J=?0yK\W]h'"ηH@ΑReBENVhMZ@(Iaw\9_K_ZOb >Kf]Ց4iJU 臈J~vR OZg6J_cr)7OJ׿AS{7Co=K$\m~ R0354rrJ7+7r ZkCKI?oZ,%+wz_":"` uFNw5܏w"w!lqZ e$tl\]:fXh/jw^ݝG3&T+.V> otr/򚇣OeB fv1J@߻ Ck-j+ }yAEڢ.ݙNdYg-űz4bnr{ Qڨ7΁}Ӝwyo7_=9wvU"OE9͹>u\v%ei+"E-E"N貨eQ>/h=0Zݯ;7ڡ7i}68ȺdeQFEK]t ]\7k=ctכ-ȩd]) gy[`ȓV'Ty5FkHD-zy-| Ru#we .p?E9Elt='ٸxEy9Qf؋smhud \( Q>D/7|,N9'-z#Qotn˖whV73e(t(Y>yURw, :dς(2s\Sd%Qz_C+VOɸ}dO(5VM~ѭ|8i{NTC5[4"$2p7nFqʝ&o%gUDnЧ G`GG,)!NΉs@߷P=:m+-I%Z-34vpl5lm||;=g> ^;tHmзNLOo T<(.y2 {j_)PT*b,~S4 8t*矀}$ \v(GZ0=.Mk;.r\ur_ZIBc9N(-իz_[)YTgf\% `S/A+ Y]ǕZӝ}@Xn#Љ$YqɖԺR:4ds=k)le〮qЍ:"9nK~wҎRKgo{b=;^:b=obT.7e..:7#D\/˸c>Vڷh*pD_:+ _F1Y؏,Woc/:zDB=**zs~.k5&]'A@CbyK7c+~.+j{pGC&|[4I[R{~$u7~d ;z@NW \N|#[ҩs I<}'5"c]4j =lgo J0 D!NOuETNEt hX?b5h NL6t=N!R\)]Qڮ1juQU׃՗b|4 [![ a@.X= ݠYNgQxIًFWA= [kO`<kBWv-@϶gA=hǿ94KS1p꺒6#Egeq Xi6|Ŗ F`5Ec'鷸+_<\랫b2زD/7: O83sE L RCISqFӋ+i<ejk*tpH2@za|wRX6O. FM/Ȃ\\0m.wP[P,IY@0WRp#~zi>t9ÜSF/D_]][;]UJ-z5ـrsº5˺^Cr&N{}JI8"xo5}D.3e䷔ ߛԡiR#?6VN-]k'Kc]#gA[F2SU;@נ{Rr>@q[Bm?k:0V:]]fX F3?] E/Lջ~kp]{Fb(S6;mJuز42I_ot@˦;?;|%e]^m13{`LкFy6QGOFEn vɫ0z=ou={Q~Z}/`K{[vQS]~s.eoNǎ%k"KxD/z֡]mNG7M_[urow hQ?뺜"7<@bi^[F6W=mx.DS S|M묎zN)3uM[6z6F?wKyjSEk-gɗV_pЬI\Ƒ#ۼ&Όץz&?Ky+fuEִ5{{YF G/VUfl[߭w^=d4ҀsnC6_g=Mfx;$;$59z8P}WAa\Rvz^Ȟ6ʻJꊌKWWqm>w%jz^K*y :1ʼnFC#B( ~E.@ё1ͫ[hwIU?(QL }]FI7|Q*г1]3h>34J?N7OBu/V\?Xne ;=i ĝ73fE 9>诐ּ:P- xvߴ[EB7PT!tNՠ8ror5)trioIGf|gC_ R臶g~,a 5n Jn_hJߦoq8#r_ -GomAzU[=iݵ~ }Ͳ$ycϝ2}P3{Р ,C;:C cKX k0*˳䐡|[nL=GRнY 6.z67=Az|^Dz ҾS4'<^~S nM薇8?Exkz'Y g6#>R!Ŭ}Ai+E:Vg:} @ ~*K%_h:sOx3Fz.q+Te|˒bVgW/є/J_7Χj}>ھ 4WYk`zZ0\Q?ЯPg/-$j>'lU;GAOvϩT `Eq.oA7r\~) e 62HR/zF;qK]_:~CVNFwP:As:. /)"}D?.;lJHa/Єk(;^83{x?󒪦y6L /)"[2п, 25-y~%40 NrQY9v#,c$x*6NŖX/pTKЃN%AlBq W@,Dۤ__lRUp'$zxMV%\en*6Sɍ_6b\Z>JIs/#\ӓk<_%h[NJG }2ojmOi{ 3{h,ΐޔW`<ސFQ5Gp5(hBp͖O"\ڑ{$7aR^>μsl)7fKrJ- ; W/}Is߂0o s ky!I-B\?* ZnDJr\] |<UasrBxZ} 6Wcٰ׵&O !fjȟ+tZ޷vGiq_#+t7r@j홐=Y?=_IF[_ ;'v.GjD>'-2/: %yA,bL#I`w]y@}6RၽN(p*;aEʧӧ]Lvjz?qޛ#SDYP="ci e)MؽqFnS{Tv.Jȡ ٧뢶tJI^wy]tP:o5yz} )%wB1)m`J< MO}Bc_ 9u(3p$M4Q+3r(j*" d^k|_!Mo薮.\Z|"m QR jȩH ThŠM"Al##u< ' !./qݦ0.r"zF92}#׸b[D=RggצOҹ}VE݅br~A0K~FϭnR;rf8,BnqX9}jȹܡ.q{A? RoBJxF7li]R5G\{ˎ4[B1=ΑvD/NRY/E 2[epG12'drdFFφt>]O^3&Yx!/XY:{]!=q,6Sܘ#K{a%:W#o&.z3Ikt9GZ9ڱ9>5\]맾ZSS'#.p{drtEi}"@z{bOHXT5uB 8<ţ=w=Hb+*_{@[ Rc}xL)nAtxTuOFи4b^/mvt5]/- fl{dFn]]Dn9_G]u!hjɽ I*2}e1sq'zLw싆$_TTfaKGh}Ydf@??ޠ)Tyj/>ۍOwt ~6ŚOfh( y)4{JدN~LܯTe*;s5jk> 0wzYGHS\V^>n`$1,y02ހ%0غm ާO#gE/=S 2\Իް) .f0k/gX?SSl2>`5DOREI28$yυo!?I {V'pڼèM\8i֑@W!HH:Kt4t//E6q.{龔C}sS'Lqfĵy/!7T1[s:s.R#tЗQ?n*-:ȺfkaSloX%)t;"y@ f'@[Ź0^rHyy< y_GBM_5FL&/,jV]jlKoe^D?[L.$kh틚}xx溣3rYvӈ6sl;:k|$'D@ z0ڲ¸P_zn\%'ͩd3ݤ\^xܠ B~-u4+'rI+ Qv.'jeH'jRs1HmY־J؃n;myЂ!> (uao?I`vu}!;4ɐ]=1fSzfI718 쎆<(ԥ)3Z_9XϽ![^mMw {Zl^ãlFɢ {0FӠk{Ǫtv/)_D<|KdGlJߑK8JE42 \)q%!!{|ؼeZ47!*YLUMO0W 7̙8tH5R:55.|ud+}<xԸT(^7g9o4F.KL.bPaFD a\V(GԠY{Z^/:;׸ 8`,U~{ ʇ.o4Xtǐ}$gww,BȁOY ׆dnte)t$󊊴nH͠we-ekrӿk J=ύ ?ڱ-zxO o bJ^ُe%Hyx]";CHjna^k$\3`Rtќb{VW95ZvG/\yBkUz^'nKgw[AwiQ.-L(Quu f4x2Iu54ly~Au/Ms I$L}Q7r;5sk $u3z˯cQ90˄n2eH,lI@KRO-Fsz}Aّ:`S`_/[!Ϸ~mp.DvzՎ,`NEF[g v9M/_:t_(Vj }).%O` x36x܆|/_c~$Qo !{u h!( +teW6ktucd:S^DyUv47qmisW^ { :cDs# a4e:-4`l{ λ$/Z9vz kLynn>_]GF0e JMYߎ5ܓkzfE^)c40pmNy_sFS˜C"e= p'F0"P 2yI\@G1=^~!w:(RazAeO@umuO/^:z΄1"w^ 96'Aoa]& )t)=mS*^MU`\18Iy1Ua7{!?ݠ.TcpԂO wmFn/DNgR;ʹt FO*6ԲAo)Nc x9Еb"?\_+I^г.$)oߌ~QJw z2KkwhGbKaؑz642㽰ˏ"dC|#}Uܡ/Ils-wP kMip03Hwm܃X{ on}|Nԧ8N^L,/BՌ-QV7SF_ou]%hfO9?QwhɧAﱱC~K}A?ȴBӧ"2b^CGAkR ,/#r^绥c/y؜!Gk5sLxFާ "_U4(w.0}*~!o1ild =OB;52hERk\LlwC\2y')T0Bi"YTgL2-t:%vb޶(/2# r$Ok?\_܊\SȺH;5%*-,N/3-SEҬ.u*C56zn-4\[򳗐6Nr{MgV]Fk!7S;ⅼ+uP_Q7'u{A~/&=_ՆkOА*S5dl֡ u[(aԓ.I:jωEQYcG/zǎ/yd|!o+et>^3KQСE>74}_]79j|^hf\(zˈ2K ~^„yNOm/84ղO1)4e`ZtϦ#gŤn RCNu Y\зs@'uџ2H*&Xp/r ~C}G=Ihds ]~Svb%(q(L{=KB8:}?7@AH )6 s5*`S@uQg@7|x=ܸfbsXr/!X^kwtp݆D.~=8zRw5{ 㼣EUvl힝7{i!T>c\~7}/"?T#ũ;z%l }y͋gd;z]N,S8%BϿ&lϝxsMM81X.>L_Uw^+;IWPsCpy|͹鼰pJs贞79rEŴA_͋&'N:Xǎ5iVNߡ-n;!H+y239~|S@h^1όX=mx]YmGOgo,ۇ)kJV>5X}*c.;"'79&W-+*;EgU Z~8·%wpCNПAk /9uI0u 5VS@B/\VHl}OC:55t;x DA }XcA~=oীpΔ 4:IR M`r@ 2'z;kI'yHKHMrCi;C7^|LeGA7m8T ZԲMkYGr|; loK9V[ډS o8F~.Gȭ??K*Ȇ8v'4Iޡi]TFb^-]w؜ 9eײk[+r%v7#33BR'.BSm;z># l{J$-RѦ-'o]Oj i35=i6%814'"!z׵ DprA(*Q裀J,/).tzחk.Gko"TZ@v,^j6#;cգ}Cs}.r2g(i1Q2j<ϱl5lq\Ʋ(Qbk@A?< o~fs EK#hayi>5ܲwܣ@'}~jcX\Jְۓ%nWnx=[ 2\4G/ٵbu r5%E!]J"ҷf\:~,;xg`<ʊe2^Ԯǖso5[>ݦЀ9D&H=)$S "23vQ_ƿ4q6p^b߅w=&<#;fVtMbZ9`RCrdh!*a{['`|ZG/pm5l[T<:f|# [GnqV&ft5;_*L|u_SW/,aUsTrf|q48Ьˍ;9:4o4B{}H?Tn{tc\y'Z936TkBz4rv'K!xjTpp`xjo1OH\Wߣ,N}`46q(!!9 y~6fpK},Ke zǪn|WQTEEX+6_ 4qnEkx&>^yݔpV;y~.֡7B:}uW:G-=$ǩ8tzǛo%Bק17@qT~N =_o M =ŲH͑{PNZ[ݗt^2<޳ QlG}&Ej3p/o iua(dF!b**~z?=jqwuo }ϝi`SV-G8cSg Fr=--n xA2S~LY"v>ߨisE.4A6\pɞkQ-vo,+OQYp}eC{r3X ͝dn'IZϕᏕ77b+ tÃ\7|=*s =_%&7Qְ/SLEz;>Lߢg#?uEmFQw<F!a1p|]Eg~2s?ܨ/gueͰYLfϒNzheR@_CVv:\"LfGgN-'B#B~eWlY4a8ˣ;Ǚlz<5{UO DTrW'+Ov3}[|N͂I0y3% ;s_- ۆ~5 ղ;.yM'vsl?Bׁ$5 lymj(m I'$:k#$Xԡ\v#L1ЏOޘ#ZMkeǾۯtGf]zA|n} &AWeF.^?Ra|Z6+Y`Cd?5,n;n/tȰ9hqmcGEݲ0y|S 7k@YFȻ?,m9 8= i/}sCnH6BIՑcGYib-^+Xvu]S~ Ke_5Mw=cp 55҃5ȇŞvfD=wzTi\nZʤDjf}h"_OTŸÆU8㛍hM|uTԂzN h/U.LC4fKvn"^w-e/gϘpL0ۧd@ }~_Nr0ASKCCT[&TEAO2fЯ,ѩ7|x?>n=}bUtF?{6j +_azЧezRa ƝwN1G~?U v)[Ԇ=f a)Gqpέ- Vt:O9ܑ!ӆBq.=gGel*:#囔Gv;9X޵;SGTAYI*؍'/n]3l\x`|a >4*AO5++o:4|N7Y. ~eW遾v_'g҆6\ћ}_wH;>9pZ2~컀D&hTCӓj-W)^TҊHy;:^:}A,}x=-nήG?k *sm ''oXE % x ? |<-O(T<їb+C/'y=@_Yʔ~O tvwiaޡHy%y02L#G?pWǗC16L|LӠz_6VMJΕ[7$BN/sTwg S B>:k~J nOMq>R0]G wYGiſP @nP7ꊗV{ϱ[~a5~)q9; 6kkuO+}o ţ쬖`d9wq 732^Ojȯ;SOzh(gR4u{';CP踈Q婴oq&?v:vnRf~R7=qo+}Ce@ښIɥ^hlrRZls0.QJ&7V"Kڔz_--o[؇e(racVcwUeyCͶ~}~qܵoO]⸰پ\gVNGw'Ei 3oq>%}l-]nb'=S;Q$m^hZ$;Vly)J*=dҡwZ~^3 tVLkDrtL:rj?fثO㓝eV}Y}';rm@?jN'wɡAwsE7Օ-vhG@zFe{x/s95'1,~Oæ(yU@?$oЊwS B<24k-m9n@D'Y\—,hǑmYwS ~~*y-vw{ac}C[ЉqeSx X3=x>/ܞ>%iޣ>ObS i.7G:* :Rvカᮑ|]N<dZwh udR{kiش(=G"?xqmO6>xOMU\Jo ;m<" OIGR>_[fUE͕bG&醾;jrF ^;O'!hDxO֡xd+r~C6`Ck%pM_o(}cXy^3ߕެ7 O2?U88BnyEJ }shXXG~lB~z?;OJLq҃+ŕ!HdnԈStg;r$ioܞPv-[S4p`ӯWn̈́'%w.C\-Fՠ7Xs&RyO>>Y 0<xTg]RY,;Uщ}\3<ơYA/m eߦa$;f3pѷd&ݛ 1ҬjAя;dT?ӥ 8h_Y)t-ֱۥ$g!^bb/ϫx#QlgNB~NIk<'x޹Â:ilg{=هəೇ 9Aaζ\=3C᧴݀oSiGS>O֤PehܑOdx]6oM`N_*LǗ bk!),y ֦taBƎpؤ&slm2">#gZȊ$tIh=G#dT!gލeIC EI-Nؓ*HdW>l6])}1՟Yhefm_ch*BUz<Şڄpa>6rvl]f?Jt^">\87tgxQJ *|[:7xb,½ h=EAR#/2[lq %GT' 9ΰz_2Bf{zH9gNs]i#PT:ǑO0jѩؓ߬F}}t{$ʇOp%z U֐oX?LHg1{6תB 5Vw+4saY"?Ԡ?'ZN||$KO+i|~h[z=Ҥe}̧$Z+\X?rGvGG%oDZlz//mk}BB ~FZf7%yhڣj琇?OkަIa\mIS~( Ϳ[5R[%94Iq4ey8 >fvAb2 ^%H,yE~ pָnW9 EjoaYS<Пﬖ0kɖNICZ>J8M𠋱~Jrr%رH`.:lg"\Y G=\9ܾ6ŲPOs6ňsG49&|;A7C, ^lzSjt賨ev¨h sg#f'](*v`G*"SBwh>mI*}\i3sd^xabqXNU߅" 1غz?O3<5Y#Tڇ˒xWghmE;ﷅcd]>qSI^=FqL[?g~d='K }Og7Q[j$9"w.{9|񶣯~T'KZ8VY$ԠA(M/ՌUq^OmNmG/+@U-sՂ띧1 fd4\^l?Q2tfA_#Iff`e:EP0K$rhrT-}?5n1q^S:ڔ;WaUްoIVØ:e^Cq {Lyt]M9?+5>wGfߠI/:Mb^>x]= }]w=G!+l G%T t~d2,ӎ{wՠLa*/{L،epMoꚔX{pJo+ ='T :hHF;̘#چ hA g{Qhg d2s+F{ezIp7vrjNGӾ*47**T0}l5lW4֯TGNZf8"SM֛LpI9Km2;:#BN lU䒊myFJȇՑ_Y6ElS q6׵zVrXoG~&qqV*$  >"F~fIڇvSz ,K^H9voQ  }$a"?UV?s ęo8vf t7%8 ~ӿ,TK. -}JeQڧwTe^c?yF,E6H&w^;َ~LGݿ\1u/0O;ta9;;|ոT7d.hO{ ^^#E;tZo_+/2-rf TkIuY{=OumTuN;|Y³~Z*,Az9~:f=D`lmQAq^6._?[V j=ǃۡ?XC_] M'OyG]2נO 'Qn{?uuG39L$Zo UГNFG% $=z_Wfcq g=cl#ir0x^y &65--(GjlRuJO\iY^5駰b0'vۯE>&L#N-TAI"ud|ks9J\+W s}8$yQ^uv$5y/ix썿mm ec7?-k#}G%UCKؗs9 +IzY|)!fR'k9ogz/7uG1H'o2g'VkH1Vv 9XLn^੗P}zzU ^ZG5տ^bAk{z<2蝭/?W Asr/gj3C~HeCo6]nO.`u`ϭ+?hIOjϮxH5o;#`b'7ʎ~ƛo D8=ئ4Eز.dwq=Kc4 <)b{Wk~7]?dbRkcen&<%!Δ&1?BwP{_,&nL듍^~W_5㑥?ٲo1L_%jpy/Hp^$\GFq۲uVk_^㡚$ЧSD_~,1'!/Vt~AFzϣL1Q.p{3^#)Ag)}AD̰7+^g;4fjKÌs; m6'/ǩy[-W)/0TPؒCeGj{ô{^3nyCihOޱ'=kot׎M pH֎MGseW|?^6Xe|Q#HOvz& l1kp:$@n/!T]g=㥒Zny`{~!`Q2rҸu#g8UkDڡ$PU۔)"h1$T5"ɸW,w@/ȯo>M1|/ljQzEx v*#-IՂ'>#?> %GISXe uG$ZOr>i!t˘|_C}eĘ\sNp18$ W*nQ]w=Tu3ʕ-Gwu6X>oQ/wlBI.`N'C|e{>UpMߓSgV_-7ܡ Mz<_k롌Se9wsh!T*thП"~B?Kk]c4[,WlL-y !?dCM<߄*>c/x-~"4䡸F'ɹK#h…Jx)=""~A\NYT۬Nԕy_7z6խC^ *~nHulм7ک4F{<}A>ڡ=Ƹn D+c0ܑp]EE*̠-^ɢq4y鵿h`LFFko w>\e\Nj<ȥ;RIw   CC'ʢ>*}a3HS hȕ1wC_]u J@<'JL/oS^Z^WvYQ1U&!.2Yӵ; yX^פNc| #._Uh֩%Bޢ44U_ U+l]h+GZ]\#0== IKzuJߡK )tylVqC SO\O_$#r1ȝQI;r wٻwϢ_h"C'iv+ջ(EN#F/! z"1{4*^mit09 IK(IoOe)+Л)d$a`#9ueTy^'r%:-JMFU5qh,iWOLa[ܧtI#?'|wow]^ϒ\o?fX_ѓn C&ptnFu3͡4Ш'논Kвo#Ӎ|^ Yyyst QKC.^{TcOc F~I42}sCJSz%-DIMs!'͕֮t]Jr_Z9wtQ^Г@B7dֽ#hh 8h'P(Iva 2ÌXstt!?$Cwv%ւ=0uG*/ 4NbĞ xתq4#t"n/#uFo2Ⱦ:t[z21ڨ {-%'P3wSw܎#O">ZM"[EғgBN1ۺkr0mQ_"b֐ܦI9u=l]\mŠ^~#@zSӴSҢ? y bDQ/"mjKi:˹r[*/-f3z "l]6]_)R~Y*xGQEu ,z.˨3<ȝ9J*;tī t ~ _yku7a}n@OI@ANyz [tIyY.izxMN8M_{3@8s) d#0uq|B+[>9I.D?.A-TzMh"atd]ЛZs_qz"5'r;;ryPw~䅜chv [$ ̹cDNan-/Emyl|<=03]b7X]w1F\_yv0poK^[:Ž>}y@Bi$/2/S_jq4$tTYaŰg5Cg"EvNі.?m!: H_h7hK.fvmdB[8 $E|*/r]kq='kj$b:*+$ W@f3u70R{Ѓ//_.Vbu yE]JAn\{t&["hmbX]JbH1伱yp9D>i$/m- Д_4h] z6xGS=ˬ)r C\߽'֨ZNsBn? A L1/ T?4Ԁ1 +$-;ahB<$0ByN]BnkCM"  (J+vr}/stTsuQ:'}5/ٕnI:q2r!]] T\ ƅ C 3ѡN[+T6BEBnk]b0;\eB)v8Q1g*#.r6{yFVЫ} ?jYg7%ؠO9'I>ٙ(Oy#᫵(*t_;E]i5-Z&{!)׻ꈍlNq2y9\BT~ @Nj'L'}X%3byzu6oUn~AQZR5`*ҞWo+u5}붮 yͦх͓y8 fsOT-J !q:2~E[N}.YaLnW9'p_Bu: z:/HX. zR!?"9# _Lo"\.kSzZ|3S#8 Zȗπ^%賞whTzcA9'I͋jzr9̨'rJ_)w]G+`dCnDkQK ~2_Y\o9 u8s~_q2Ep\EK{`!JbA<3i/TiSD~;aWtog9bOqK25I ;?N4L1Nmu5Q b82s*!._N.v \*F;$}$UDS=rĒ— ͑bǦ |n+j-Qc^rv^L2&\!IT.#UGJ}+# npn]*r%hF, yCR'^#cTƠ2uNЗSr,e8, [xMºGc7 -L#7*B%Vilž󁾮/)ıƈFG_Z>>_/O>?8fҡ݆盌\hY>KqC,I }Q4= '\)I>lo15EOF3Ij?簄z '36kfl;z%/TTJ™Ըkeu;kt|͖+?&h2(}X/-8)ըhP/!9S˽|X;ڐ]'v&A%Шi+2@ϋ&o4n'' )mQ|¯>hGmEah:1sٰQQE[}R痃:`TGyEw#5y*г}rEN%[%%![S{^ONn l$OHS^wY ĬCoS2bPz{Ksd7h4oζC6[K2# :]״<6j'Ց%oh;Ui>%^5K;v[p.5iZ`iݵɄ}c5j4Fn1֡ }/kn}]ۚ,[Ȭch2 |ӯ /)Ѡ),\} }|:%֎2J9w~㕲 F]v"RidkrE|]O'a"$3tm44 p.t=9"7ƚћx>O#dޙabt$#1YGP>-bڰb ZDve"wW_G* ~CnS"Ə(Êk@ojGD' ~R;τRՇ+Ɏ"kEN(39x ^9+kv^ο!w,W B ٿYEY=R(KY[{KAgeJ2y`tANHںyVezaB<}O4xߡR&_kzlAυPA$y!ef9V"ェ-wyˇGޏ:OT`w 9Xv.^9-n_ zH'sI厼2rHhe0 Px>y,BW-+Y})+x h#\˟CQdCsƨGVW|{}5-1>jY`USeUSwBE_-+z'#Ǿ4Ĥˢqpqd:v1n9z3jx3dضg)8Ak;x|-(ٓ+*ŸPfQ##;IM~ C. gh ${ob?2{+~ @+^U>ɺׂam0Uwbk|xɶ n1m?ֻ[w٠(Sy;ey`z5%uk 2y.%txueEn|>5g,c6Ysw)A-1>; YwV o.)x]Rн`;kq T3;v^:<@lqjt_O.h0lZ6z,חȋqƗi;CJ뽕{ϵlŎ}K[ȍ_2}6`Q<;W /i{C|,j͠O2(G }w*yOYJ$q;xc8tv#HGrsD8bzoME>7蕗_>qsɢ'WKeUO]Y6P' X&%˷^7b1JAWfA~s}oˊ]RK+5]:r>O/׼>ʖ0nlތU"M?8{#{ -:k 6m~ӆTR݃nȦ'?m; %kTе9\o' WkoK_˦mrm;9g-/};0E~y bV>p 8Qjxmzy=饫C 4CDy \VW4}#!>N=Za'v* 9nm>ס[@.If9Xa[A;<#x"rO1[Ik="W[ oBj5R; #C *z@ջZ.xO}h}.dJB 5-~ 7Co4BFw*Wt 6rF}I%T3 `L0zHF-`30JG>"t@M v`^ R>u}e '.otϱam6hhDwT/-V'""dBȼ˪oE :YM3\].KY'%ndZE0gN~7z~@3 ti6Vrvh8GxqOI<).r:"A>K t 1 @X=Zg2ZW=ś9@ 0ƙZ-]I}e@ Wu!/eh!I#W3q-X\lyT<'c%yRw|f:|]Z;8@4!cM}%g4g]&^aפ9}sJ/ CNCN ]$Q#(nTIxnĝ=%IRu^3Ɩd ܂{GGeʪR1llݏQD+r[V #Y{ #k]HU<l-(eA#vQh>upG {3[01tn S+ioڀuv U2i)?nY\K l^{VI.{]-˃|^'DxVz [ݩȧ8E =[ tWGCENw+C*vAd? -Xr-QdFucZȩ,ٻ:/{ \_}d E3 &36/QGkIi%IgK#4}A,a_P\7r__I,7=HOWc~)@g0Wuz]QO)co43u2>{nܾ> zT>Vp.HJ%:1tF2, 5s-C6} DBTt^c)]dBט+bݷ&x .1+9{!!d@fqgYzQJ{Z1^ B^ x⌄Z/9pZ(E)] ^ꍐ+:y[\ iEs7]]Xs7ZbQhCom I4zޓ\{u@@>TLsis~7o^X6z҉\Gm}ȎeA/x#oO_WxbϭCOE|8-  ~\WQ!`a[g!JvEOͭ ^ Y9(޷{qsst0ho 6aNy|}DYAz_r@v} #{:YL^4vFԠC2>nEEd3WT~@KzbK mr(h+?&ه;muD~\':O#Pn? /t @EF([DDOB.BFoGb%eh./ho@AvbwNeLG򱺭>z35g+֠-_aN't8c`7m5~E[d@3E[>/o~^kT\yɌzB1 zty %_֠:,Gr .S~`mVg~^"b\U7;u?56C}hs.rBt}Sť.>_Nx:Xn5H`CuDbH9!k+Y*@ٝ2#Wm>EZcs=`;|콨?FτQg`"1hXE~ENm5*|9zJ?׫&.Db_GYڡu/s^z.JN/:J$]Zg1 _t2^)#^+i^JAw={G![ݲ *ڱENb]rz: X7BGuB>?@xk]vE(Ӿ+7ht셓@Qe5ڳK׌Ul@p)@]/:Mz5qF Ǹ4 6r^;GWw}e`f׮YJ:(Vze'yrW?Ԑy2bu m?[uѠ_0xv5za8b+$F9#؄Vstߵ^ܱkK?](a,Ni%1.;th C)Th:##=sitomC'B?ę?gx "d裞[Tu~STUe@?I 7GA,9i[:4,-r-OJ *8N6yA~.66ӌQɒVIC$5tr):)!}|@߃2*rCz?7߅ t/BG 4W3>nRENwٚDĮi .y]SJ/re1 ‹ ,Oۺz5U3}AB3:&iv)Xk kDbZ+^{Kdvboi(v@8=M$;$Rf -vaoTtYdi:gй=Az5z^fȳ^W8>F׈R+TЩŅz1*١׶sWJ^@ӹ9Ҁ{{9 ZjAґR9=]b#A69(s/Y4"\Ns=[\N.Ud佇jPsФ[]jE4_ V:}{gN[CS`yxRdfutjz~bȟ s#TEίtӎIH(M5`#D hCr hZ 8݅\+\cCv OEoblSM̽"~ ~*CaP |7dQy]z;mny9R崑|{y@MV 3킞c/)p8Tl)Obҏp*vQ>상 vB{d [ jN"쏔)}n4܈ .>-X/ޮ+V'ŌC@v~ )gqrҼp݅(G_t6KƁ|P(Nk^Ն\J^=e`k{1ӗxjohڑl^v;=r`d@^w`/|9vս' }ԓN躮ߜ\[<~_d.\hQcvv;hN o-6򆮡E!"IK)αrˋz_Z-X[xV /az"K.r*s|ٖ~.wu.`yc$I9wnE\}Q3oue]@&zՇ䀹~\%IMP:D[ 4Vq#/dT|>ψ+2t|ѺFAV{75r;K{r bOz+LGI.z'U;<Ք 92e:{:G{l% >d#yTdZq]=3t?6/`dKJ=Ч.Eţܩ:9|>)[iA':.k }QGεz&?)(.̌-6K@b~[.>kzfл>)-m[zC:ã!͵K5&MKUhMcQվZ]HmЊWKQo#8 9'U}, vc\ErBrg>H VŽ~󅜒5o=wG& VJ|CW!~̥Ul]ZegxԭlY3z잮;eyoyGʅ {A#V[|W>KNk'jX"Ƹz/Ѻˋ"v`uKR1]b]:FB4>QXbow QEQVc {|A&F%}c(jc,!Bƿ)Lr"/7򊽟Kw_g;`}ш"@EN,"Q DC]Yc;EFig݅J!rtz|r@o7jRR2a7_Tn͇>-nc;5fANȠЛǦ'c=)$(g/t] `W!!)TóL^"iӪW>гxk4xFqlEp!6lZ5ĢC` TtuCz5ιz,Ԟ6@xaYtTvCݚk${zz$3( 4'ݬS&nr =I44ߨG*m ;j|td;\=BЭ:9Ѯ0 QtY+}uD2I茐IS"I&p=]e`HpJR>6q 8?GTnzq]:{CNv{a-2:[d#7ImGE[Q藈Nj4O#:IjsUd]17)XPfynoQ9Vha%._Oq ,`tKrv]suj.b3B׎_bWtO [д9/r';4 oF 9r\VXS :.Rv@`tQ=נjNvo5՗,Ь9:~_…4DAj1RTvB%?G"n =t_[hֻ6H,yu^%H{d#U6Z7o-oX0|]<#^N׫sG #7,鱋)]cT#N t C{;;w_.]!X={ӊ5̉].tϴ5 O-Џik@>}xWuiw΁uN֩mݫQ]fhl.mtd7tqSde]W^9،.G>]<lukFo@w|;*vUdҙ `7pZ5МX']+7p->Q?ѕu=r ʹ)M=/Yr_ui`p>Gھ>"Wй.59s@4?řT>zκ]=K}lJomjFoQ6RFNAqFY|ɦb'|tn ȸnyqѱY\r|8(e끮!r#udTԶ(ԑK RnT{YG}Ѥ-ef!e HTKX]&]8֏l=g<2\B j\:I8αCKj׃Z:l* ~ C:=(V#cיLE$1#'4}#&%5ؼ %hERiYM~cCROӏ8_E^b&G4Mw5>Ԑ ?|G,9UhIg }ϰ;r:5Hޥ"zc'{|Ft (_#< Aꛜt)Ak8}EDo;[d)I/z.P"-#?cma^3;cˏKpjЎoZ[ \/= a7?fn|7ҿLzd{SYB&H*12Z:OW>i ^c h*^׈Fkx䧘K.<RB5Z@d֡SiXX[>ZjUoV{]Bndg Dd5NBK EۧGHd7Q}i@fvqfVYcMd g#e/o g#E_W7 lM쌽L߇ fKksz )WqNVHo\P?KA.p|]]*\72ykstv )tIDA9.i{VڙmsPgA[rdn B n)5E:_9IR+o+ `+X6d{]z$D5L50ipOX?SYCF^3M?.sE\QhO3h!i2j_e`58~{ZJЇjv?^hUUّ <LA(xӋ֠[~vG{׵&; BKE| Uʚ k=G&7Cr8\y'%a&ș} zzG\X_=(>D6=8[Uq>ȑ~&x+,ɐd"x?o0I .]2]Ŕo;I)ȯH˿;94hhտ b?eI\j|Z}5b蜘{ua /57os/bZ+@ vh-˃ϰr94ōb_5-RYzEDI>BLCAVyBw73yiЊX=?F(HLb. z3]2GX]/dIA!{r:Ɓrסn-?&9pѽ]{nE>k-LBt;62^m-7>'@D:5ozAnQ 3z9~!3z[:6O"g x\԰A2‰XdW\6wƢ); ;QŐT#Z 1*_^w783ӗ\\ *r xAWˁ EBS+wI;2+~L7r* a>Bcu@Fv]x.gץb_Q[t'(EBɁ|'^c@ Ջ9Qv55:Swp^F4_&_}_,W"E#yeExhNC3N)N{v8j/5FivHӴzYct;[0^j_)I Wt5'[OFpcc괚d%pEo'@V A0 oyoltt*o4_/a ;:(QǸ le}nKBvƻgPK 24>{4%U]4Sh 05 Ż>9VMr1yMO~nvd?eUG .q2m@3RxJ1V +UL_њ#-;6r^Mpe-Q2dKһC`h;g4z&U*Hq>Vk1tIWmѥ4V~@8"D)B^FW+X=m Wde?O WZe^{CBh%V' r&z֎e&UZ$ ݒ;e0[&1o xzGdVхr%I g<\PF*I WT*Cu6-^;߿ɖd.#*t{/j=.trxvROV:+C7_b5[[9ފŴ _[a^!;[o{5ZJkuY$ 5]s2 ZƱ4N zsUpN^KG{//`$.tF(2372r[[];p.&v غ؜4'SN+| og<#Sc\cp7(&u ~:zKw2C>'q婚8CH$-ZZFy}t =ǻrftR衑:/yYId0'"'a;?:$?Z",Nӫ7:Xi9i ̾ Z5HnxeEgk|mAE=&s>@"Kd@wLd 3T r@eb@]\޳,Œ?tB?{ Ŧ(~ q!^|bȽ_w.*^zs!3l?/>{^g]9v1٧Q1kthF4ΔAc: @Nґ_R3qyzd@'t-!jВGԕő@n*I_V-\wf<9/ڱ/3 ]GW.8 :y46i9_Z_p%e]$#^:F݈TՐ{#ݼ:kE[2s{> G`ȩmWkE_JQ 9imT7VoE=_i' FN$3ܟ䷈J#UN$cg1z {AG?j`Q~#ɺ͐##iX46: t1Jfz@Xu.s9fu:@.QF#o ;=}_-~N y~ o{ʈ-fKsX-_)PF})cn<Ƚ6*wb.f:Nut@G N'M3GFHg]6 _`nMZ`uKO{>#cF n:1}'t]ww[\eu]qnN(hU;\ &2hɤl c3&Z*2pb=|,@f0sJI)՞?҉noԻtQ*x#O{]izAk 9;kIZtqnu,jC&ʇrZAOT@>0BqtjƅB/MA0==Ƶrtq"ok"-a) w1 _r 橐 toBK5d&=-.}Y .zے7Y>kH*ٟEƖ(v!ܮ_]j7LݞK5:|Nه@SfW`|Se1TN#?.7ԯAdy C2" 95SiLN 571BL-_%*zn Aʧ|NQOG"Ձ8iBuW2Ajyy&kp*rK\F6#S6@Z\wpݥf A^`J_-}"}|_ڑ'~Nw} -(t<[;K֑7:FθX9ZtyMWi_7"t_i&̄~Fڠ Dlq|lN{Ko\nt[5ȭ?R=i<.EvL`tB׸:j<[x6AnfBDi!a.ASh z$*|BoAqoCH}x@D0tE-tlZ{׾-{1R@N:ThMƛ~Ӑ{Ev`IyϽ I~'5䬱9iJUXDt#'r-w`x }!MF?YU[TLسt`]W !7?n 0dyv[|pE_ao*n dUt7$ԕK]3zCi F֧im9/ sO%/.~#?Rpme9TۉK6lYJ]2n =[\rW#3DT]Jx:IVOw .̈N,@F/2IBvǂեBT}r%ʊ]7/" Eqfr[9-V D &eu^춘Eui3FDꁼL3G6ϝ:גTFф^ :hao/Љ\Uz7 } wsFF?z<.2i1tWz9:"KgzA^wSw(S;c0zlZqŦǖcLA6u溚/"ҝ]Ɨ͓8c􏟗{7p/u@_S9ݥE-†<6zK  _9]տ%.FzJII ya&1:E[ љ* i=t 6yj7M"'] B{ ~~.fvQ?]R[cOHj1cUt||~5.x9Hۣ5㊬xѳ<spң#bC?` dV@.15[*h3\"\#3t-r\lvQ*T0y5.עX-ԑK_"^k^-{?\=d=w_ Z6l]K;@z1oL{ uתZN于RH-tj׫`t{Vtޡ.Fnk ˞>S ebVBhj]" )_F)htd$9b*dhÄ3uAQcA:-2/W^^bWO>2=CָlX4i KKBl+nu1rcS kĖZڀ>,}42蒎JzG4fաUݤћ''Z.s7pWц\ zco|DW^e/nԆkYD]Z =EAT]FZ[-Qa/!ZiN'H4. W0JGfFD^eȻs]p]䃜S%h1:QFA/&q@akԲek [([FUEHRZT7-)inW@>5y_ѰU mQ/CSisc7J3A^x+Ћ4rxa<{:ykTGFvFdzB@/#[i!R9E5jXE~B%" 5@܏+n>{U4~"/ 3Sإ6ޤsI+r&+ANP;jv"`^TAvRd#ݯ::%"oA[ju"ϓ44E%k_o tE?6^Ыs]:ȉsCn`4k gz ߭^/*[?"QF\:0aEqW 8ե!퀾NHe5/HNstߨ_H6{h\iݒnzi4GBO^z5}rvWR\] 2ӈ}~w<0^P'/K/蹴M/}cK:>><[}яZPH?BNY$ՋL?VIfJ^baȞΞovRG&7Z̠\G9kT|C˥ԏRjz9Q 0z]W޷^g)(Z"owh+9>55Ch4l]}u]rKCrʵѐC R#oBw'Xa=npjr,ލ0"ޞMip?QCFJ"'~@]+49:{BUR`wC$@zKWH׫/hlR:gn#5k@gIi ۜYnf_Z?*T"4hLyݳ$y 5*+>]H^m~)+3)Uc:q_#U_%KnKQ*4^i؛х:/nДgul|j<#Ye#%[ ~ڜuQ~Xo躂ѵi(QZ.V7F:1%aZQtAFFc;!CGVF$t1A$K#Vl7 w1Xa֐S'gpt;:y]:-;u)K;cv}\-Gd2=3%ف]Ѡ#p\ji,v dob't ѭi\LNwiae,s[/ˋ/5q4h[ENH䴻 tXVsErB`1zʋ-R[r]^r e)n_WU\CƷGY `䚧|{.ochvQ|U70HOwc3q, $r[ǰŀsFH d7!q_flQ7~pL.t hą)qj(]Vfd+}>}Jf\/ctmO>i O'gN>I . &ZNCm^}_7tsl^uj+?L=ѠFA ̘4E-k7 zE %oCk36hY߉OCe6($:.r] x]o]+$.-.ѰՑ %5.t.9^(olhZ+h93lt]aEZѳe;\5rRk>!<|}BsPC^Z~q;tQG\ub>AF^?KHhRz9VO׊:>+"1.ro!%#1ns(6znt{%w!n.*34ђ$9tW' t Uњwt~;WB"#QG"QL^ }/z|)6kբwA>~pa右1{wi6t$s05z{]z U.ЗQn7枈MN n/OtFC>^D~)zAUVg.ɢ/;hʁcѣ(t/Z{=j\F> h%*)3CnH^#G@Ҡhn 32XQ}y:/WKЋ&t ]h%\Iͫ6tqQr[;]D}FuѥGv4q ?&RzŰ5(SF=([lyo5q0#OtC,Hutn/}N'-4 C9R гdo^"=g06{{Fbm2uV.-?5M +4rѵ }9ʏEBzDGvIW3W iؕiK]QUh{ s"OTu#euuOtvU6˰zwt\B_A ֮;GWId-8>8ŽDz@96ځŘrov3U#-^ґr ,l b'Q.>3E) YHJ ؑQ)=ӯaȭ]||= 6ZEM/,dߩ@7H)`%9B:|aQdbWﺸ^*4uD>FhO24~P&Xټ{5!{!5!e+4yI\VԲy '^]+An?Ry / y70V-A^6lq~c1N4% hR:sdZH?]=X En/',f( W:D>]=v*_)4P`K3 g/D }2e3z (|B1rjZ揰s)FFГƚny* 'Sn8cw[_,(6km F0.P|@=Sic }<j^/xɻx'a-YR6m/,cɵ^I8#KFЋyyOKM]YYShhDR.[B;49I0ft⻋V~;ǩ+qof9--}$ k=2#c*h~ͅp=q؃VS-y/i~KθBˢbEaz?-V> t.f^k7 %,ė K'zjЯR3t5xkLՄ8H/uThBqTbg +r'qb~:maSQ=G\C:r %3ބ占N]y~j);)^ۼ-:7 sCg^|EBGf)SO># q+kx'ڠ5uI :qO^#ސ;7bNt䬌d|Ϝ :~ܡ/U r=|Y~C"#w16{kmx&E&7~fB ŠvYz3F.t ?V|WaO˻,cy@ }MgD _IVrr+M/6ːkџ7hΊ~Ӗ,b?\+ Nni#nq^[pn">C: >`Z/ku9OFyK*+S ;N@/-^;*Ѿ4H)Ð]<#nvK췺S"n%EGdKvG&2UsL9)#v<): ɉl ]~}-1Q+ui7z L>ei0Cze:E"ܞDП:v>q6qvi?%"1z.6tGvB-Oڑ4ȍݸ*:jhYR=#C*rׁL%e=?fvq4mJV"VzqjzS޾Oa=Y;9fZxu[ k5*= tzRiLAWO^c:}U. zOx`~q5*LFVݑw@ ]T:|[2=0jk#\my2;C2|GEo)UxN[P".61K<r^\71U$Ӱz@W]F;~?IURn"s ՝-q$ǐZ;1ϲV x8,Bsʉ.͓,'L `u7%ݽ.o{2߼=\ m{-|ǢS"O5@!h:/e:7 &DNG$Uݤs~/~@WfrWSCfdj<56#[ތ$kVwb4SA*t 3_PЫmu~HuRV|y֊y36 0? b_e`_35K$t͟#nP9\ᵾs{$2 [wwE׫g>% " k+`K D<>N#W eMe|7 *Ck/vc+L"躶rBbSez&rQ^']vV~ZAԱt[;懏p=fznґnq@ Dž>~:ZOGj{Vx}#;zVk؜v*c*uhHZi=x3h$] <[ɑ> MD@/ͩCW鉽3DЋ6 NsD=+⥮]V:JzO!t=Ti6toŽV}PXVkLE+õXe WJwOwEZx{>2_QUyt~(BX"gbO`ߗ.i

 hv9-e9]^F76zx_ j׫dL{ޕl^[Y2}( )yK.@{`\{LMa*ϮUr"QCQN!^c \M/ʣ.ѡG]#35䶚%"Ke {^2l *;/,YڍT.|Ա3/YzIV@4nQCqG`oڂ沱UXBKܦ=bwE`F?FSұu5H$d' Wvyɭ6GtrJ }@H4Q1Uɉ\CWrp9ǁ*2Bo:obKŎ-|"lWR>2T%I83y4GrWFةhQoy+fe|p|_O\:؃-DMtB=#xqTC%ּ6B> `ma]aƀwm6:tSίy\oE]ErYkuWZ}=q~EH mG^WJe>^B9&}z-DϮ֑u rp: qLVIuD;: ]ftZ}{Sm' N]2rjL^I~E{6]$<3I^Яw^8T:br g8YΝ֡d&̅VX8ۂ~ ]u@5y޼Qs.<ȓZ{%iJ!_-X7#&KBy{gׯ|F_ ZaW.fw!a>G)C]+̼F>IRW߲:wA/Inw@/)fH"5IGr.MNw+OML';݅9":B%z̓k.?B/Q]Eju#oKxl`6팱j=rfZZ7pOJ$8U2lHoB8p+9-ѥ( 9zjEeqqvߡ|^{7FlPw(ltBJ lc[A\yUό> rz{E92F3=r&/љĬ7v::oσ" X<D--&I$g:ܣ;Qs_N]z]O\x]S Vpi㗯te:nm :a`CS*/%J-.8Eݤ~t~ ]k7>Zt5r o M\=vF*EN[#l;Ft2SSF^;i'M|Y!)'t&㔓+0&aZeWh/'K G {>y-[#'L+/^|FT\ƄN*O+%m)7=Zb^聜QʯNL\WFX"zY#Ww8-fo5LcF5*Cj{"Ic2Lpmދ<݅c}dvHlj=e"UFh2H {aa>ܸ׆Z{)!ށo ~t_N];r]n5tyҍ#'=-nqB zCxMu9Opr.Y c_ |/daО.-ޖ@*+;﬛{1Ɍ'\5zSz@$pV2Z.:qH}SӚ@kpoSh@Hu"CGt*t1) M5&:Zzh$NN9"82|]'[ cidC4m3?eC 0Xb]z ;8^&3.#'ti: Ro{]|nήMw;>arXϣFtlqC?&h8sb_y?e+w#^Ǿ˜C+ D[#W%"}Qng!qyKNFBNvi6,.C8onCaz}.ڔ}zyHG)ؔc%bBwJD:7p}y- Ԓa]|GmQ}V[.l~[qU^|&ExnGj)Tb5Z@^r]t#\/ndȕ=ꋎwdGﭾU'{锰Gc(=QoNe|#[}>K8T&"O#k֑;J$ ;{ecSHNdg^_,EDeYođ@Ы<-;ynW8恙'} uwoC}M9Zع=9A ^VoiuǾ$z{{K:xp~wyf:z$Da=>ՑħX߸d9~j$0Ap9űFAgFbO fK % tt?6umv~$y*ަ$3* :9^u%Sl~ '}#b'o/wjo+%1dgg[R\=&&s=DOf 7 8dB:>r顪wfCk" yܱKsw`riAF"SA羔 呕Xn(ޟk# eE0w#qV{b~Lq@I#?=U-SSh6{I2hN ]^V,ȋ2gg}Q 2x'OS7y߄" t_rJyfbG̈́!'2(CBo}]@S}Sejȗe̶vMFp'lF. {>}ԽE>PEo>L{B =JT^4u z>Ǥ'-nhOӯlq` ifOu:C7'njZDr"mu9,rݩ#J#W~ޠ5CyyLZv_nяQޝ}{{ϰHsj?t[mNz3dk.|xlVx/OD lIX+)8}mv[0eu+4^nv*v&y\pb} dGt큋-Z' 2{U~<ГE5RWCD^_kv +v#ޞ 'M% -9.('vX _$<8#=|&/<Ȍ2*Ԓ8\Ly86:b}4R_LsU ^+Q2k-eQi&8!>H=4D'x1~^ӓh>oFʓa–M]:sf/*C{I0ZP&4=_:DJB"24l>s}}r>5t#LW5VOýx6ぱݖLG+ռyKȽMk`3OGAFEQh=ʜs=~$OEg ^k✽_ž{z?{l ݣs"3ʸ MyT( O윢DУ{k^c՗kVHS$S_sj=p vM:G?fT1f^$C :Ew|`_hm_ԦD\E|E{ ο/Kx`߹ /Q1>f}kOƜNcHVX[>֐Y'*ޟBI%Fڞ/rx$ ɣzgZ?r#ލ|$/%%EN@C7%mެfG!z9U>{R9ү) }c(>E 6h4|mFw~]~9[Q1D>f ͶE2vt=% f~BI+4ɿ &l-Џ#yw4Lgz?N}1hyb}@rDLUC-+E#P N/oќZ H1->vwrv$AqY zݴD>OŰy$0Ld9rA'vOVӍ;-{l\ ?Kr<~UݳnkvKnJ܇3tlO1B-^>k*M~ROjY:Gs[2%ž0}xFo@\-Xܱ5 nޓ t"=uOKv{LYȲ0K; ϣQ 4_ ]~=niݰ%6|ˋ}FQPέs+AlfF?{M^w tI/#[22681QAw74['vqMj C]vc9/q13 .h>}-v*>ݣ>pt6C;MDX VYYd$Ə%lq=~;q/1_x-g;CwF (%h!t#BDI>"dM~"CbcAϐI{_s1!߿iI#MrmYZؾ7}ՕaWsC^ZGޠcBϡUFؐsL=@|CGSQٮ⪒K̬e']|'@?׺ן2t$;~"E~*jo9o5ٰYؗCu`)Ր#K *En,T*'i@q}r Q]$As_?s/aE2ϰc~8>`6/_?r0 @[_Vod|wj:r~C`=y ZSxwLITߕ>ѯE2Mq}jߺ5\*!κS[ 3]WZĝYoBNw }D*rДe{sU3KIPOYrgN =rBøQ"|COkcK({;{OoW(;a~y>cl4oYeDy5^7jDWD}v.AwGHrqrQ zfعjfоC_9J2f);]_ɀ=q3ϿxoGbr~;\_WCY_wWG tC醾gqؐ[%Y@I?ѯ"lY Wc'9Fy:Z{ɖ%9[㚲={v,KsE>O4h^s*N=t|n% 5 ~͋ ok?߰eO(XDyW#;& =^86&DA0?9^tOەK6Mir%{Cߢ UTTU_FUX_nAoSjG&)϶p!yQ~x~_==w߻~sk\s\"ڏhnL)oȮ_>J5/m+zu(h[OOJPGnWzRW(;;*h:;_Op|AE Ǟ: H̐G!,#lԵC'f FsGz ѼZc2tqB䨳C2(. 6ȅxǕ4A'E^k|sZHy$D]NYP>D\6[I;{꣮x[=$ 1Fdۨ2 ="聠zBXwn9tA iȕRJ.T-+6=%E5h' "Cr7ENXl=<ҺIJAhTsl 67; }Ε^#؄,qa}ΡUFB j]m .tO5xָjoܑsǑZ4kzt \ X--dNDlNIoHtsv~2^fx#qGv/s|$  W_ z7BHD!F=wqݵ=fuk.w [x\V c9׶arU,U>wb3wrKMAN5hbiOohr0"6{+0l2 b -K=96A'tf|@ΖZAo {*;CwL5-'p@SeoesS tuٽ+=9R&mu7U%'{|tzK"57l&2skkEk:Z%l@2ݙ5[I"剜OMrܟ5C3$_N6gsёO7z$1C=Iw,1ǒ.r/6"S}B0vx= K\Ndm}B-bY$rdޟWN?NR+4$q^^\Ƃyµ;ڞ[HNLknӁ:BzOѰS{9Bj}A/yW:OvFL >^0{s[2'x\:C?LvGZ@g{B_;,9k7FcCtb 1hzq ˞,+ϔГܔ=RN ݓNľW #חmǨoд]TLE<\DЉsQ44{ F<1Co^4n,==Roar*.1%:ݡ* ~ݠl.I$7Who7yB=눏"y/o'woNMް8rS]'?͕Dl'4vM{χɰ}fE^]"ypszB; >BupwsB_tk輗uvҾ'~]sg|X7d=Or%l;thN!/=Dx4NחJ1ޠ+{OΫ{ *z߷Ȫ9ԋcNU}Aߗn 9 O-6|ƓjХ^KzzԔ۾-yOҡq5b ^moZM3\J`@ZDG=.?_k"GGzbT2vw8+/VJȯ%}˛%ZAnkC HN=NKJ $7Ng{a`S.s +K H'{4 z_8u=cR ?2ٞl'[]/IK t` Poiް[ =*07\ cs<|^$8{fx-z<о&{ݷpb}m{ש!K%I1 FrG X_[x=~X} +N镳*+;F?7-{-D;6qI{1E J_3I%cdRk4 ޝݱO{o15=1LMEGYf)z̔nLi)Bo 6֣ >F* w߱C[J*;udF 1\ԗ+k"'Q~8 .캉N-ak\ h'H+FRˮK5ޤ lK{ _3al]kcB$ )CJE^أ0.$YjHpboo-ՃuFlh{=5j/ȕi//5ӓZcܑk\L_o[TYE)p7RHޠOJB7KCH`ʓ zD^k6M"ľzAZPʼncX'zPHonFB4'v>rJ=Wchf|TO2ۦ ѲTFyT"BK'́' :tOF `"K}]W[$ׇZz&np'ľݏ3Zdwtw-+8G:Pi*sAFqz\뵷ՉcECCǑg]uЀھ墰x=~ܡG|BXӘ} b> ( Ca25T QBӬ1RҎ't˽Qyf1FO-n7tyBߌЃwϮe'i2ep}(eN5Ls+"Bֵ>3w܄?O֤E_f kQFءc=fnV{lNAhNc }qˎ{;a.t(R`\|:-B;dktR)RB;rin"PlZ][9k?{\.}38J@F{ -x*oXidH%M}Raԡ/"ioIR*vFQM \Vw˷haQ#%Ah3n.";`ߺ_S>~R+V>]nW0Jd~b_s ݒ2У]::tڗpB|SV3d@9(d Aw}T6y|Bn9qH:ȿ( jv^"r߉Nl< 8J+tFg'xNҠ|IaG;F~D{-EQ[UzC5uԧb9> ֡;}VX-~Xj\إ>z;wh!'v1q\}\5{euw+ ,:62š{'!ol)9\f53tTs*6^3d&f'͊2K 8Y %5>+퉝C{J֐.Y_i䅝" +mw/G]~'CS]"ФAb4#͸i }~b'l(-zY Tk&'vO! ۜ7niQdp]]d&"ةI7?`L!=eN'sϧ"Clnx"=|FaS(/1&7j/LU v|;2vΪľADZj\Gvzb4LW~B_ߐ=fT/o[暡l_ucS.9LNI¦d8{xEȞ54ރf{3pz{K6h6Ɔ%5hUT*vb_=_tweҜc T=έ&?N]h5NdX%T5VXвݠZ6]K1Fy ! FA/1 MezK)ىC*thwW'ilzKqEN?l0{ \^\k}Š6e=GS`5O "$ ^j/+tg |`}B+W^ } SK5y{.#Up֡~ L6kaAN0C_ؠ{*K{{nʌ ֒f֥@ ݷڞ{hEMqS OD8-7zc.#ObW{bX|QPA_Y8 ]] ɯEakׇOt|lTEM/{sI'vT*W42!P@RMt"-4'tv=e-zŐ9#Ȉ@cؕA!69;qܱ)ľRr$O-z = K2=/>S "S&܍M艝3!썼^aS_4$\T _!5{Y8;,.ӣ-b//%E_أ7{%_ф,c-Sj(ݐ>RL@Sċ~:%pI : O29Mw047W'_b~j)l|`ֶ3rwľ{['2\/>6ӁNrNf!={ӂu*qˎR/[IzB8/t۲>eX}]Z}(S˯WC2R^Mr nIM*>rȫ+y$,s]^0k%AcEz;,v&۱9}#hq"ݳy!{KkO`J0U'@MSv'rSdo!KK#%OG Nsm>7Wt=O W4h[m$;`.ec@gVVзV=v(!@rn_gMޡKj-k A_=4[c.WtHrXN@Oj'tVq;ܸsE*6UntC@0yԠ9º7t,ё(WgoKb1r;w&5QZ"h؝xVxV`'t˳qjҞoN:GO^"dYڽvו(r2B_=pvyL)&;K.$5drZbˆ/)t%}8J'=; $e!iO8S25VclJ~d,L)p~ 6rn}Oyd_f,o6%h~uI&xٔ  ZXT[O!Sq_?OhA*lsZk_ق\Ea ;E Yܗg_8?_ u{5œɿ׵!g :93F_BB0K72:Q#jg_~~ ̖@7M&*{Ђ_-Љ&Zkn% -HG2p g׈;9>HUĚU }Ϙ#ҿ\J4WZatAw\3o83"B;ߡ5KI|lSM}4gZm7{ʔG_8ZwQSr.ɄvheMNp63~QLдDO!Ak~i=KLB'Cw65w7mx+-~o6BڷTlkz#Lź`L'H(t[5mN#~n|uwl-eo>ܝ:2o_]Vp]x`OYZo&)7-:!' 75 4U/jg:k.M=\v)Hd⽒u5FnclV}Ȓ'6G}KC_ci2iF{R8~S$N+suo?){~F _9 #g}(riIiΆtْzo3Rrj.3A'Ie}xOi΍ L3W.n9&kKhakl-xwE38[7,}O3I>'uliT[Z%#غwt^=jwOןq'8Y!v{;|˔:\w`XMݧZC+ӈviD2j ꏄMs3e!~cߛR޲ĺYxOyԅ.;6'z̕)'߬M 3/Ƌ 2R}p~3SknUh*|S] ]WKpJ"^&))o'WWSA9kH˪}7㋥^j?Rhn+v3=:ik ݗZ>OI^l?RD '/硟~&%~ufQ^wuK Suܰ+o-Q?ϑAsn)GVFe;SyZM)舯- NՖ~,ޥ\-z } t3߿}K.k>u687@'W 9pfgArn!iZf}{o>='Y7Q:tOyCA%j73mP>\2U쵩Yv`ԉ I{Cop 4|_SSAa}i̋8s2nc*Ya?_9Gy*_sr&No5#tngwk,q4EHB+^|ؔ }+uN =ƒ85)?M?UG1t\LCښ5Q[m-rY^c1Y;k%y}COJ/F P#)3"txc3hҽ\[63'O xM&ǦӍ}\'(hmboJ-څ|') Zf%KfS9Z]j4:<SΆv/%gϹ-k}iM5[S:>]t}Ȃb ~U%cHD?K}=GnjB|pI_ zrd=^ɸ~o0niQ%_k bG`1CF,-#"iww+]]g "X1@qSWFźߜ@W{|{Ҋ}!}3okT)Sz߅47-MEr>=P aʼnب!ڿN:C_K܀v7B>rd;S'UJ{W "θsߓH n2QJ8,\y2v9_}f|ZM߇6?O(|I%{EgroC.M$xVd'HNIA?YJu'+W4DE[wZ ^Dqf+l,-kk $m|ZS:հ㎮/W ]%1U 9_H͋~=i n!~4YsiߔJv!M˕/r]go-Q"g |n;_${)M]>ýE{C(H \TLr[[GqB=2I}ݓ~OA٠5W\Y;@wF\Bw'?nֺP8һy>r~oM(r[#ˉڡdWcm%<#ONț RǞ0KњIoG_; 8cg} w?rE񥳱9w .hl*ȳryikQ}{EO+gO7p FULI : ,;דe"vr:&I}Y Ih4~L] @d׏vՆm6Ep_[D~$ #e9ߜ"Dk#Şa͑uE64+i"{8M\]}E9Nr>pt_ZƝo5*[f 0*OMQ \oeGwo\)X~؊#f١ SN1oz;섇sQ_EW\T{,SCyzė+g5r3x]/VAvG^R$/~'# /E.$ } !cvk~<chd zlM5TY5?ǦvTd} a$/$n2dkZqwz}w5:2Ⱦxt.k"L+S~{kKl5B_̎7'5^H65|_ZܱRsCO {Ք4~MK;u$|Z?r5о3<| :9w/$Y#tAUWuAOЋ/Vzp[N͠i9'GFeu*c555Զe =QXBO;䱶5IR_ yGZU4>_kЦLr|gY"0~ޠ,h|MBuҊ _[4ت#cmuG ?Db=$ 7{tWĕ\gdj9c% =aMiuK=:O/Vй2V9j^K~~SM 3G֠+ZkxM NMWS *{?]Χ*r-5:frjkȬ}41,}kIV٩?SF.&W{b#MKtD{7-v41WKJL'X㳭\ʗ%FtZXl#k;7JpbߥkS'xR\G }̗) ~VXZL-sx t mU/Kfa<ΨWv0{h4eXZtX_U;asCD-rEA5&.DZ\ ouC_VQlV ;v> >s,Z\o1c]PcЇޖE\}F :N9V ͔;uzR9{jf'=ǃre)-^.eKMV],<_]R͠'vIi 1*u}B 'nD^^%G6\#$[R*V^]_LeNDLS}N 16;J\S'DL~B(KGQ_qshT vp޹5_Nn'3ݠ?T/{8t;ܟЩs4@dĪ[}4vd-iLIW9 W8&-rԶ l*p'9cK%ľw k%G5f=ӁEL :JO"WK csۡZ|T!L^zV`Ԟ9rQ!wzyY}d2%^/[zcRRb B'y{awr%;`=ݏwh w>I$yt |ٽG4)4vL/6{Cw$U(2;JwUu*a71.$I28af?/!<'L;1Oce^P7 ȶOw8)\4*&'NYg6S;+ƜfT#x=2)͞o=1.uf\mmNJZV|ng;+ytžՠ{R]dDɸWa/$G4 tDO5%]~B#3lF**s qUĮ1`:O.O=A-P'tۂ2GƉ3 =/N Лt_kuw~c6ȾNW% *y IA@Tԗ9l9 Jo?˾^HB_]ꂜ¾;ȫ[b Bg{y̒ lԺN;dz:t|$'tCc_s䏽A/:,e+L5b^pyaןebcMt"?)Y;K/ңzbÛ zC Er1{S7%1x@2M_C{$b?b܉]Xb9b rN_؇ztաIvb",؃TH.O{l}:`|FVȯjݔO%uh[}iÎޯ GcܠO N\0m\kLOT+g{oc}>`Ȟvh1JoB_}a'mm+^[r؎\0gklr݅s쳭'96vZ|UyƮ9t-]Ou ]W͡yt C[}ؑLO%YRG> K{8ܧ݃Մ;xFwOEpݜ}+1WVXM_ke)Awp'd@7>҈R?[;svN?ڛj\zJ}Oݞ=ܘ[7W#;;\(ݽ! ,.T[{=S:RvQ&Mjh/5%VG.ㄮ>:r;t蓕^z|oTY.y ͭ^} zG&ϖoyGۃzHS }3c$)ЗV4ӔhnӦ>ԕ$IݯNnٯ7wعmNw&hdO蛚6^X=G!KuO83pjr9u<[{thrboI1&-dC>B< wt}IZKU}|Ωo~Fo>L=<\=I$A0 1CW-%ok&ᾄ!IfYq"n[FO촦G͛$qbޜGg't  ; ^.dieJ ۽SMk*ƓWS2't e'U k5< i'Vf,f_  w/oQ%5HtOїR !@ow4běk'pZpaB~jz !Gp9jBI E nro[~%ذK}5G^me袪ĺ>g+\Ž 8/?>c]{#WHy,v`$4K,WY.wt-.'Kث"~R @wwu/ѼM6~gHհ=XSGflJ)6ۅĮ:E)b_kff84]/3oFCυ3BL6i; ܾ>]~Hz>f*e ~[< ~SDkGV?ѯw)a|Cs:d~~e15荋>ݥF4VJx7FۙYC*4tWn|zψK@?ޑѧNrHC\`b} 5gi?%EcO'ljIs|-oTwc ^OBB$TjƧP_eڧ{$=mTT,+zٱ_[ 0JȥR7x_4slr7_{ҍ6mJi{U*S3(ϖ*42ٹlt@_Ӄ*M1lg[<,Q/ *?D߯* C(I@| bȾ㔑CWsj ~Oܾ|G*3e@SOCxo}=;"؍>NY\li]%:;.?ѯy uh6\[Lu.zނNa#KfWe7Gi+íRvyCj %n)M)gyۧ>8a/AǠ9=Rn'DKa3^\~ 膬s9nM {U;4/#CTQcGGӐC\%X-s״8tuH%WngC,Q.SRtAwuBj|D ~̡C|jSþh ΓHjy }D_"%_P< טټ/@6 +H4"OߪszJ~ jm5 ϕzK1&x!" 2E$5i[zWx*Q kO=G5D;W— ^\k?mvfv<.ik`Ѥ95lڿ[Jz>"!?Z}7#:qr+9Ldb.ak3Qiy6F6yTM/YXTANvF`vi')Kv/y1^Mk=^/nl ^2O.lוct r3N*%;ȣ/'!EfvxmDgu\>]_F(󦓽p$o֨Ͻ 35QzݷX̒ %Jur+;}O[=LyfC}ly[#WGRgsr)r?3OB˯I֣kZ 3/ͧ=}׸'Нݔo!Y?S\s(OxVƗ{I>KC1w''糡]\͑r5~/t7/|TB=۱2!7t/[<(xg̙᚞$]X-FwE 'Έ?=>n>7y){871G 97ݒɗ[vbk^p,!U;T7+>ߓ[u:s0~u6xg@O֣.N2kĝI1c =fF$PMS2>/op~e}I͚_3ݩG쫭}ɴag߂c@+=d&)I=fCG}o_| )V^"[K: :G9ϑQ6 &7S!}1o)Rcbi|**dM5i0'խ{A6O:^(!bi2SkJmU^TFB, TxOߞR&IEk|BOc8,r|G"ϣ zCV[^d5 T ^&up B_CU?Wv`7t-?) @fv񕂁+|K|f[SЊ@bThCԤ^Р #d i ,yhz_{4!'$V%](cJy=X , ũ~8խC5;iWW"թ"9#|Cp\/1gs֯^k'p72 "`Z*6=^3'ciFAnO26݌::ŤĶ8Ύ:*z6rɸ|er@"_ZxnW+W;eq߸@ėс~5y~}.|̠ ݋՟?SҐ kl7~ˌDƭaг0r;֥| A]F?|F1MOgo ~eh J/1CNOҀip bv.U}n&;( 0J_3ӟa{CNw7'KfVu$.|e~3UFRq/oƣ .QJ [r?87ÿtdZ[Z3!l[n~^y˸?_@rɯ벗YL{{HfPBjMdC^CYgf<ՠck6y#+ |w:4#Mfm~']6۝Zޑ>#Sy%I PNजܗitj|B'K>GJ=#a}(`/D튟J]? 3zc_ =)5 ٠u/=z2U OX_h:$E't\7vd^%gڸ!Aoۡwԏ [fQںe;# ц*AkP G'|::u5-+=*j,qwK%l. i!_Fd~#QNr4b͋ޘEn-=:`oif勑tɀvA'B3 =ؕo}x˨o[#ȝ^ץrK F.zYt w^Oc>] `o족 oomU&d&b^3xuгպ"MiC~Dސi2"dyzA5]&r>a.42_~ڰoRAu2٠+AؠΓgْ~@wC:"՗1aI[/+%czr/.\^{Ho׋̩w3/ҧu+H!?d]^sBm-y6uAB.';zi.t'Z ѷ/cGj>Gzoc!EBϙŌ]o#.鬤 9 Oc@9h7K)t]I|!ϻ@[]voP {{l`mLsVD=i7NRV p.: ~u?6} YEZ¿gE6z^Hi Wwr}8[\* eqr~#51(~cH Ҋ7nfuk+K* 4hG~EIwDlOF=(rם~#݅꙼[@{ku`R@>2O1R_yM9rqDT6vh0ޗ:_ub/4oI -FciЅ%ǨKb1 z/}qO5\/'Ί>aA3ww+;fd߷ ZasŨ90-": CF{s%U\!Ij%5G:uJՓ1ZT!/n;Fv%z47{גZ _׻!?n #J- K$J:y> rc:U2V؜XȌ*ϒJr/Z]Bd\Lr5#yFݑS~`{MX .H 5CuK;6cnW nu dsJY>ޗա_Of=!k$;ĹqC/˜shAj _,!Ih.Qh|$_ܠS/h r͝#H|O U(+z`ڊГݼ.{ }] xdwu ThJQʷ@: F.iB>sGraF}qDF!.}YmgAзODxF{auT'y9]݇dE&Ѕo2\z9q\ D_Ey_d^YRJKߐ_%w)-طԚռqns갓?DyKt ]7rtk FG3j:#:Aj"7hwڐ1 :QK;9nGЄ])}>!`FTyCC?}"gGۍ䛿h{kAjqv jVp|B>cO͒._8?_;gS+3W?ժk=knI(l##& 0RVq >j/=hzy\d؍N;ō7zFo'g :;*mRkԔݒ }q7 YRO@; )m5h }>FOt5?6rf`6ckpNEK+4Ub :hG>>-VXB~-֥*r-;rWc9d|cgDӮzQhc`\a7[8 s:J*ЂxCnq3%\vRvluCNO5~RQENvtQHy$-G)m ɡj_6ϻAن\B]SW afm4u %Oz)dCy]`GοтF\",'4q:چ(ZէI3,ofUIvxM\t 3֐O 4si֊K|#à[w=uS[|{qufh]8ڣ&L!хI6=֎[]_ZeK@s|a/r0-]u¼' =z_J61n-6mc^CHB+abB6uA;d[ۘJ3Ҷ-Ā&yϏ6N]GɡG0d~-Tμ~Nq47-{ԡۻ]2kώzUW[K/\(^ȓ(ࢯ6|G:ԏ3Z`ԍ\ 0tݿP=(;]_"*)Uw6^| Zˆs;aKhSSffLFCo!5:Fg=֡t=870nt]ߨcoy ie'd z@:p-4\Z+9EN_؀Eo/{2SuBq@s7Mzz!F4zMhGt3+4N߬Q!sr}{#t_ȯӌ{Ҹ6Wq5r!bt,7t3hnt]Jy y=(;!F>tsq9A_tޠk0/f-:bW}AHU˺n ]Q쑮xE<0$aЎn.7taXhEo賎 oU䈮_2I?wxp7rMF9j\m;A):mV]@QvO~nepr?9.r)ศp wM0ޑ }w/EB ~6-JNzsF#FR]-{~mV0JgTu^V l.ԫT~NKfI-G ron'!QTzBTi/F#wA^}»Pe@09&iWWXRb|}#p~Vpz@~7ϻt^]K9@1(qۍ΋®T߮a5 thl_" -R'kcd2% h)I?AwW:5d.˄WW,S^maI| t٪{ʙ1S(gxKweH?Okp 7t3oIBS/VobWYZR+qY-,!'^}Sw&Zw/u%tc~--h J}QnF.argbWn9>j< 4ՠItrOGώ( 軝 67hgDlm\ܬ䰉htwnP {{η%֑RBz<lhQ?!5w9ѾJ ؀_j@s$sK*T6fX) ˹h#ϻmIu9[ ]7X5XGzSr* Ymh=]5Rr#uJB\/ă6-2F>C3fѿ[  }A]mu ~>`L6޷_웒+ 3#FS]{;lNQse38?K 2Aotm[Q"3K1yKXgc{.0+񆼮#4ud X;:9ǢU h &*=d^tCz_J> $ɖ~n4ِ:t5e|sX:ѭ3JYi諫;4e`h{$}4nD<Ȕm#^ˆU[Eؠ_jC݅!mޥCtl=kpaz=)^7uҺ nм:NW_H pL%;0e;gń$GΧ(\Zr.}#o'ybw=NJu#]r]:;\#wk0@V;~"vwqmxFD`P{os^MhߪfX6#Mz}'-7oXA{S{@^:eu#yq[m#5S񛩛{ ZݬmgP<$ѱ?8ׯCvtNt F^@˽ygahc-_^o)TEI$tm~Ό ī$|!C-^"]<MגʣI2,j1Io䮙μ.;-/c|AEad3c2zh,=#:@3^ɗƸ;B^gv9umݼ1M2%-I؜-Q.%:٣- ]Sڝ4 I%cކOMB3Z-cz{=N@IFo勝EhZ' _j^C924V~D aPo[x:t?>Y0O,Iq_ɹ$\'x>tX!c|k BiV~#:8RTOlدSvq>ʊo] UZJl)N[YSPQ֍4[/%N^ 8x%#JKPTr0J鏦SfTr- pp`TwqS~T$;X"ϊ?%nq5סrk,5p_*b_rxg+C_;oBg^ yf@5:UǸ}zװyKv8ep-_+}E5?2_ܭ[LL]9wHAx>F ν{B!7g^c akA:<=~Xljf C!F! {@*LQ\B3S1?tO-|b%] &'[;f?_bپN*/>Wڅ:r52~`MN 7) 噿5J:ˇyM'v7v }nFW) SR"@k_טg^8tu2ZI=*x[ \44c9 ZvE.7ZcVhܹbk]})3,Tt߆<|:MX؞WV\):O52K$\[N |/x^'JiH-?,OL}pHOulmޡ>^Z(/z;4͆ <2t{?l h/-a~S57h8!5y+lȴl_M֠7$r]o؉1.I¿*)NYS@ֱvh) |0=5N/ל ~~ͳlv<}o\Q!]#'ԧ5=)y3Q#h w(~hRܐC#9a}p3`)m/,ű|շGTԛҳ֔1s^bwlKZ^ d/N3fB/[_ `Ɍ}:O _L"ə$'9E2[g;*4v dul@wN556rR[l3EPlڒ="?HZ8a7ZR_[8=m1^~Cyک8y{tn]٭x4CQY9#PY~=.o~gwI_ =?ϧho}mՠ/SIֺ~cA7@tZj{]?>%7xCˎ/Q|5ZBwZ8R-fA*otxr0G YZ TqR;- |}^|9gg틽#{pSuݒh^{h)B"k?b&~=E~%yM z+`_֞+tDSY $9&62JGA>YՄf{ >gC7j>Nиʏu]ba[أIbl2!GE-sDKDg@BwvIQ,XX)`G˚j|{ vmԎ~OlWZv^4(c˽3^֩YEnzSj;ݾD/}Ö[;;%AK( }>  2wJr8߃e,G_kuu1.&OP?kytC_ƠL4Fg fr?بHCsgBKB}O9X_JoqzV&^~MO%c)|:2җFxykM+(6=s9 +ɿNcawYoEZUEݱv:,G[tqvBNUT ]=Ir)$6< ~Gi>!k./׎tCixݠkOZ%=tY}]\ iM8wl?QCn+-DUkC^kU)AyAV2Kj 9C3Uvb z u09J3dP3>"D6mQ$ {G3lЧ6PIokpb!;Ȣ04?BqN>̜Qitez3O|ɽYPtpݻ2A= .Fl`c gF A" ɚ^Љ^@A:5٠L\H0"R(ļۜ#NF~JkvR#2Vp5yDơw]QYNwLS}` 3Gegm>"Q+^z!wYr~l>nzIz߀k!*t[K{[X:ryqz9y\N&Ԥ~#c>B7hM 5a#,EU)Q9*v˽cVINRvuZ뵷[][O2¨,$\;ʪUqM@,.Ze&<㏧䪬"-yߦ./St4[Sδ܂4T8N{eX!ϭ ;y煜(.ykȬaAO^"-8B-kM]6D[ kd놮(KBvSv<\ȫ1ZÌ/Ie'=YtoeBۺ[G'P,1Ls/(GE<84]*ٛkD-ǐ !, jիЋ\h*1@WMޠZ>g(71*25Ͷ"c@+PNo| M<vtxpymNtQæ$ȳ:trJῐstf H^lsґW Gn*HtVx&^uVHZb;t^„L+Ǟq+Fc&պ!{Jp[FUwK^eFBYW[9ou򶆽}fY=ht)`aР5lct$Eܠ/ؑDq^{! πnC|„!oϼ@W#'nʻňqb6^.tu6.$)ˆlteR)63]<.FF]Z[l }j8ޫ.-zz]ݏЛ}F#䜋dE_Ytq^,צZRZ e>[_v}\@ޢ5x.F34_Qmm*6uF:Z/b\jkKh[N"Z6tnem%69.nVzFJvoG`kBqwҠ#&Ag"O%F4ZVGCD9uom Ӈ_G~Euw.th%t=:Ao1Q ]Uѐ:j& w_VR}F%=F,w_+k4]r(K9KQEc/ˊTPe rXl}WH^ 7c1v@.խpV}zzM}t=(Q3ƖK.tiFfeBQ ef.ؗFhMofc8 5ϧ+tJjoCGsi9@Y^Џ2# Q+rYw_Gf`,őٌ Ay/w7r5S MLV7:_7즑7ں\.>5:y zH@ә*_9 })6$C?Fo$:21?>Ȯ l󖝗'\e6䞤8K&XnȯHحQ]~}tG~Fk>B+<=]#2֧~)<ӻ`_sNY] ww/hK~{ $`\ש](2bQA66١sԓ+ .$|Q@tnͫR 1_{1mȓ|SRo(y#7<.tؐ_ޡI#Bg0Q#y!l ݨ5SjL7fE+yG#<"5;Bu2u`< P/up^UgG5#(Y=5Qw3uUCyn5χ+S|ұzہEѯ3c&˽_J?<]dImQG@o4rS& :iݠx4;Guljy5ݺVvTiGoZoٝoQ?aېKJJߠ"eM{<~U=eat<Ұ#z)#u2zJ@F$cʈq6uc7,P}ƖQY $RXuC~ ]66էJEmGN-h&7xj ]cՈc5(!)" mkh C9uà-;]7G_]wgo2L;]E[ E^ZQv^@S$Wٻé9G-څN. 8/nvuڡkNqm`t㽵Lōh/7Kh&. ]a\M{94: < UGT 9/1򴋊ex0dQS{c/k5#i)=&^Ivs0Yz(iv-br>6jv$Z۠u=uEpڀ&D\+CJLJS#,}>HIlrXa]y 6A4RG1vu̍ܢ[L6Q֤!F#}}$gt., Դ t?2RmWd $t oy3tp\t))|iᥙ' {M=vYCcuCubo)闑x׼,-lޮ4 Ty.C&]}15֥ߗ<{]~\W=G~xxQѶUE:1zt=|xM^!XcY!T^SjBW[M[8AwHzِGAW;sf/r7tDOu t tw\5/3( ,cs6y Rv<@gߠT]XB'Bރ5!c.H!Psl<-rvjG+kҝ\4v{'u?&@7৳G8|}ܑuOJBz*4s>VS\6}J%I4v^:]5m?S COJ ֟YoITrFׇ뚎r*HA/ul9rTJo1dߓ!s9ܾۛ~at>m@3R,۷i0E5~}%B۞>ʡґ*^oqu7F#I(QXtoŞ i3Zku#{_5np12/Y[ ;@قzk&.xlqa@kY_ǧ lz gNDQCjh_3qׅ&lnGġhuxVSoE@J N'_k9GS ^MY#@wax E>[~~-rk?gfI/[Ӌg{W x@Q C# :`=zVTz<'gKgF"X"̀j <2E6=EXOA.uͩk;)QŕqM5 K8Nj+3E͝cm Eߛ 95Gz4ᅾ.%RwncGHwvΗ 7?ѢkѶ.MbRez%5N?MCj ^׈jy*3}hje/WE6=Um_zCqZK`/=RA7.o6P-IPoF$Vq/)FGЇ'\Ȓ{dAeTO}P`-վk .[jdpУte'6|fo'x~ -$ԿǒIF}k/AtdA҆4,wM $Օ8j9໧;kZ=EM65?\^/Z/nϽ_mz| -Sc䲼з 6w>间TKŹ4\y @Em#e\NcCVРD| ag5dF_:Tmql NR2ܘ8=ЋM5}Ivaek԰ř~x}L=qpuRUnfm4rw5.4՘R^"=hk_/ 2kRGMԩ "=3+πKtZzp.#)'$BkեP1ehY`/W0ܲk:~iX_ 9klz~cQB%/A~SOz=6-[AYn/z4.d/Lجû+U-c>H~+5SO_sg;]7crwB*kBAq qI#@FH-Y[!8Mm ٰ̡f%;v_zл7tǻJZOc+i I8L* 2\e!|&ِ٘/D-\ y]bń}ǣvސPlBߒxK/z1WtvoQz͢ʣ"ĥgB!]"(kS:3Ȼ eHۆjC1&t:zڅogHL[E^$}nKܴ9Si) v9+>ɗTdȼY :: ~C!$3+\~&ʺ#a\yMW E%[^7t?Ѓ }Dh.:ootd]ym4! {NN.Ĵ9hy\JF\֟J61kHRc[}^n9cq1r@59,  C뽬YzVȳst#_Z6YbȯH9vny:Rfސ3|=b =u$ _{i$M76=]EaWj`ݐ\7ё`{N?* N?(FIFʼ=|r}=@/wu /Loԋ\Bs2:4eޗd^:͉+mSm bҜ)/hױ#:SKlt>)r^N%~^H9yH3sq\CC!jAo FS܃m׽ًa֛2İM6|E[:Hl.G( }VXrс/;  }DNv V`5:ouB>Om6On1ǣoX3sGn}zl]-=xl ]b _QqmiwHțrc>561Z_FmcC>oC˥Hݑh`Ȉ٬R{kqפO䗊'Wou]9JȃU7!9lxg!)ߨ\%Awmnpr^g^uC~mAclw=KțDґE!5_h&]38"GE}kIvȯ(Q~c'u;V-Uې׵']Ő"23zu}|.rU)YZ2Ruj.h뾒ݧQtr tq\mYnB5. :杂IkOZM6-F9Ax's7z vt J^B'ʶ!׫HgSuC.G;ks?|\juOKڨCb-nz1옾{K?F(k 9L%.*Wۣm&KieTa椑$kiytڌ`pQgw$ѧ3OA.HH6^ڐs~Zze/Cy#kobgɏ12e#٧-SŅNw]b[^\{ځ ~wl @%^Q=;F9qzo1g:B9:XB t0.RUh YgIM'-o*Io}/ACl.I ]#M''!ֽĨqO1w,e{#12ghĪ]}׍ [_۷Qf/u}T"4C_Ů׀8u7wN`z*5}M6)f39ٔ뼡-">@EKp\8>Rkgs^9_pr:z)pX?k fqZZonmbRqooCoֱJC.43Mr%Y~b_}5cazA*Jȏk-?ӟ:t4~T0rc M#UU33R~Ň[zCT<]MԲuS~ Ly#>==N_8\@*9ݾ6h+ "|%N=l@gZxܷ_\=99ߪFpYQT ?%.khqDKGNr:/묖hEw/xwZ ~xH#MUIiVuຍO{+,Tgp6^5$|pQEVVOXk\NV#c~e@tDSE7}zі"f[,Oa,ד9pv{ZWUDTz^ ǀnξjA:=VL#v)d 7ٱv 9>ߓ*ܐb__֢mɇ ?,"Zlڿt%q% ѷsb׊_Š8;9߯Q޾D5\Z~N1%O4 1:2"UK* VwQ-D`WEP{HW+ɄysC?9]!5O֬t ~j_U6=~}Ib6'₷XbS:_ C:~>%" :HYd0&26Nry*Y8 Y=wW UfT&䱸dA_וr|ɏA"?>ؙ'9TWyEk*g0 84uUb)<C>*N5jAв9ܞJl}_[%UYO~4:_W)k$Zޱm17{j~ǯ~I={wʿ/܀XZ৿3]A\:I׎}%)i2SLpۏ,4Mzh~D(7P4Bp7 4E O%Ւr4;sdb٣-7kMkdpvbHsaq?Yg<]?{5:L$K?h b P&̕f>. 勥~S>[MkEUl lx!Ճ"upo?m@|'N?P[:ЃmkregRl?}>JQ\:8oK\j]_z ݢY͡ |?F HJf~.x=}5W dϑ_o35cf>Z$sw4x;$I 5]Rjgwx`[r* ~[\ǚe[2F;Wf@^[ҠSEb1ߕ4@8'/-|i' O [YCq5>n˩КO7XR|`u`˵q.<>`&ݩd$?:gD]x r4-24䆿95Uev1՜ЧxXf3Z2XiJơvVe΃ը [G.y/Y}e{]͙1 '_}z,ؿ=t4Fn-i'v9FHl@_][ZoI-fc=frbzV Be-~zEg%1.T7r!Jiz)6B LwG+Y)։gDX;΅^16})֐ koL8BjXW@ݐJ x=ѱC4Ty#WCPaA?C zb zmn_g'P|k* +ѿ 䤥wx9}2W{=7"geK~N]~Cec+kHM?oЪjOX:@0/َ=Lҡq}# ]\E޺nSZes%'tJPiAMǂ1Cb5# sG~H斣 ųR8_ի {pR]R@>3m-&\vؙu)+fbxvlWvEAYoرi30Fo%E/ |5hkAȽCVjLEo~ʋ |2tC_r( 錆gJ^/Phٻ`BNQw%I8BqphR{\ RIK@t`w%)3czOr:Ţ_}.2o")WmC%> ^'YyIحt6SWޑk.*gޱW7{.#M1csq%"#Jޮ9d Gx\Dž BU c8sw= |-F\"\.zv[\:O(ޭ y` 1P"fYE~h݉\h\@mpŵЯe{@Ɇ5Cn׍<7sl^;DVD5ZТs>-{[L\lC~C-yK~aA;H 'j {/̋9䷨"E(䬫DeYSaϼoO+FTn;q` vHǡSp\zY[Tr(ԃUJ3Sm?ub|j+签 @7rYZ]tt\c]h;.?gxt%z}#{13xdm'sIםMp[f^"]24U/} =.*%hK!0$Wڅ~W<O(ЪEDCoGJG^.\J~C3$R{-gN2]*ZiѤ)vC`.JW]TuyB(QНF~ Ώ9^z#]wA=]TkLzS/8hvi8o+yz]OI\DF><\K@^1LG0Kbe_.X9VWuGCEt/ٻxB텐;*eCns+t%z+` y[0q]r а/FuNq1VhBM荼k CNg7래+ p?DK 7ZJȟ,@/Jv L7hA Vi/ ו=:~.I5Cf98]Ŗ/9E/bv$!Zm`snGMW%以sVe:)" z~K,V br]s!NjKϣbחu9tCZ9zB141TYxC/'r6h3^ZlK ~)Gcx?yh 0'9:/csWGv^≼Ŭ%Ge,/Kt:8WT`-4|)RS!OUz숸GEN;~h er IzY5dnK6rר]Le ,T赏 %-]F@b$5ݠSR\f[s=/*SKRtpCe<#Jv/+řWRdL!2: >]JN#&Af^u`wvY6b*C W.6G6KEp*#aY z} @ɴhvCqkҝGG5 h4տeKRG/nv24hC`X )*r|>$`A/) 49S\TGnܔ"hk;r֥3\Υz&-NEN/>:-V_MJFouԨ[ҖQlfn M֭~:FJed]sBakȱ">_~=iN"*'-&@-d<*C[C7ചZ }CC;mF]Ȧ%K񂒻H!'[uS8 P=ƈs Cסы&uC^r^.O#V>[^/v!O5-2_RhQ64Mrr- + .:C崞َ(^%#'6t\gcC^fL!IXߐ:m pLt BKSk}j` Q wYaiǞOEtwZ:r~Ko% vK sW;:Н\nЕhroq-DDID`4tg,2FKd"\l>cd}cO! ǩGK-Eǐ+trFg⮄Lm/z#ZSoـSr]Qe?sts(Z3E\Bsx^(:7P$-ҭ6"]=C\g]Ck\bpJ o1rC%gk>x=r4WN׽}k#oA+pHEN;t1FE.h`E_dg`:t!V6%]m-ƣt4ruw~|GMdNj,ЊxŀxiEӡ\w B/Is)h0m!6KLϢ- u>vѨqC]}q#KENRCPϴ!wGkVupq )G7_qNlMy1ue@N <|૱Ȇ\ㅱ[u[ˌWK^2$V;R~cp!FG&M-5#q>֡]Dx5 $b 70BFmG>VnOv*;D{7?KC\jf3`A]u ]؍COUbHdwmE{uE.SCcun(=4 |fSrbG4%W/ iqAor gu#/'ru=˙ 4>Nv7^.}^wpO^.6>Х$|꺴t[z 9ŸCBoKϋlmYaK{4Cbk0<ƣ}vkA"U:%r\rˆ-nr::Ѥ=6(^6Өn i" ||Tn;=VҶs"BN[Db4FnzhhHǖ5ݐ_[RfAaׅUsy2܄vþ#L2SrF-ځ\y~)86 6]+K OOy)rj.xb_I2L?{OU^ՙ _9rnΌ/A-_+k,j1FA>zk?⦭{t/V#nF~ץ5Gv|hY),d ߖﲝG u3qT~}F ;; EΒI'w0Rܨ|ͼ}\|˲M`8{Є%\^~\8_ذ-AΉ=qb Lq^Kݥ|h_NE[PnAc\6~qc|ѿ=epNiUy%&7*4QbHqj]p)a. 7kf4z|8%2odEB>vWB~b5o=^o,Ť| _@ˡ!_?ϳ{`'*UYðhx!{<8lި +_a+r#j89PQk*D˾ v9{iC皔/5z@Ka_4=+pfj`Y14]8!>T tnIţoQKQΊCOKE^'iHtp?h2?/mUǓ݃ʂ=<93 >ɡY)y .'mRbjthފ 7t cwkG/s h=mV7j_-ki~ 3Eӱ' ;| Dؐ ?\pz *$:+*`R5Pj2=0KОnko r[~(\GzUsxJ IC~֖\=zr%zO$An^'roЅrhs lЉ%9 cMzZu4ϰnȕm}D勾cUZ<{,mu/KW= V_࣢.gԗ/zJ )"H >Gi{@E|+?z8ߙWΠWtC~^!7]3)xUW^NxA%fYSiˏAl{d*Xa ɈPɁ]4"9cz92)ˎ|faZbDⱽCdl?=\P"oy]Z^B/}S!٠7GW'7gPSoΖ0Wݑ_Ҡ} -࡮{#7+ :Uڐ_2h^/}lEYi.O 2`9UIXgB i+4jHِҬȤJ!oMD]7vXQԡIGMvޢ'Au-6qJ;aT`X[ [֭z!^h!w .,0 y2?y7]>V_jbސ?Dntr5䕘6͹<ŽbƽWN'p٢p@8RBksl#,lGޗ_S #|eJ Z*݊s ځ'FN }D*p7\Hj۠..2t>Kbt2A5XB7+uDyN䫑+ Yޠo#$9Aӆj9nAv4ȭպ2][&lg^msLE\ntd̠E\ZtBYnk+xϪI+E{g7׽`&{=ߢ C{ ۛy+O\wM STMps- z'}ݮ?32KtP.#FYW[LS]=Δz3SXv%iY*t^|kؓZY#Z]1yUg {{i 1Rdž|9z:Aov3`Y9´a+=WuWvF9 x| ׼ե# 쇾8r 2>rvǨ}7̉r4mAi ]d9ح#X=#UA)sݐj׉pjГ..s>-R[D:H(ЏQߡ{ _xkn4F۠ϯT!|iـ1ZttqdFW-3?!d|T7cY& =ϼzF绗 y%F5.™0b鈷蔱bDeŐw4kD+<^ܩ 8b~!e7O^=(u/vVNxK .iIUlRPE~iSEG!Z2CrM+CDz,;cQڟ ]Wƥm|]7:q/t*}\3oV7qyjieG˘x 3W_S~qW*lI+Gz G"w_gȩ։{4s;vtErEat#pHe˅!]1ݢ:z+0SzalC+=uȗ,jN~{B~فr5>~]Upvm]Znɨt.rŮk Z/6< K) 57vcv8vrXͽ}Ӓ`F>3=_:!BwRYN_{/0^: kWK˨d,J='^/iwCjYѩmf厾2Ul ӴqO=93M>/EIahiqͯ59 vomyJ4MxI#'s A,5OqOnyUhL%y9COox[U8$XM쇌/ib3*N>oj+~r#w~fEw6kuӠ>Q|w~cޡIm Fl^3T 9ʴbQܞ]vvf. ,WgVuԬH^qOV4ZKA]_w`uP>K9e%GZ&Sb +zܠ;O,5c|R2O9L+m/zqly-wp ?4ZEK/KM OY3 a?#c@nپ-~_G۲;[ 疭tA>s̿Wve=Xx!Gv`˘GH *CZmi ˯[(:]|͔;dVBW[,HA^K ,:گ(ce`J*_g7[<\toQK^~)}nhNrU"G2D Q+}r_wGK1Q?ykZxSM-.ߋ+90N4^֊T 靗u75 []BϸNcč=SQP/ {GBh;z|]Z&$ 'Kn,z"}MZM \r?}[:4xjY$&_g>[ [A2=\x|яHF;䢩|qcjL<9ZSv1 gJLgr\ 9AzXyOۯ/ G+{l >i]DCyz=,6* /zE\>؂.n SNt4 [ԧf",<\腐r=F3dhY#y!HWz"nEqؐoLqc3ɏV CK%<x]9)8k?%8UB^rQn-FT1R38o~.k<.,N$:yJBeyz7|'OɥhTma?~%k0ޖz(a/Қlm B_fy1ڊtXe]\UbxjsUA[s[/x QNtKԟ'֠U{PKL{YoQ3R2wfASl]ڊJ b??X 0Ŷ-P1ܓWu+O#'Bh7Vu8V It8{Z,R8L?зV2Ѻ$0 FȝK~\Ӟ=g.flaoy_RvȀ яKd,@ zAՃ :M e04dqVb]ϾwV, wXUя]yٔZ6Bދ`}o #\#/B^GO 87g_ugsJ=;wݑ/Y&l6ҢȩaO>q *eq؇6ES}nf-\,'Q9ԠYK#\XYϾR*=Qr 뛍SW†2E>دL⋕2/,/oמ{S +-.^74BhV~}gC{f % rh2<= }՛/z̸WDs楉P>v%W"N?8D}A<yQ4hIqmlIvbI+ `)Q֞ Y_Rd|k4趥ُV³&S*OBzq:ոDjIg/o}TvW}!oG:Ω l7Tp j~%b27ޮ &n7Ȼ*6$n}v^ȩD Ǭ9.Ap6 _IF[Nܔ|ΜbNs)V"mE r_}&)DB. 2EMӚ&OnȽ^λ,Oq%{ Kmt̬[6VF yjt"K~8A;Jt¹^䋦mCn@kAN;]]XϛNR.7:1 ̷po伜 (]# -mJV9tJYW%;rvٓ0mqN\M#^ؕV0y)ܾS˞$g]'Љ:z]c_Fl;AHoC sna è{H;r \;r}ԋmȗ')׫=^$4{5[SϽ5[/T~/;b͒m wgE~Г2Ӣ>O=)-J #mC:C7Ui`}R6#V49`XmCC;<ն! y/n+$9Ӯ֪ȴ]:ECOFWa6ދs'v3rrbip0}22#h1m@3@7crbC6 g=rFc- o}P6BN9W`omYwHiSQPg Oyݐk>b@] }դ7NJx 8:*=^a4ȭ$~^7K1k%.K&b]DU_HҕHnJKMZـcHdS."LsfTC;pJaU]>rBK~Zט~,;.cCWܘ{I9>2]FHo!vڝ?H "`¢B7tohPyR:aHv!)ab-R<HsAL2c4B£ň.#7fBO_Sx 4 l;Z3. fkr59zuv:꧷;yl픥tC砧͗C{ٰ=`JG2h-O*cwN 8}Mrt] B" z~a[[ ]ja< 2Yzo@NLuτQ6ų.于8)w5m4Qߛ/KuM{Rw tg4L50!"<%WS+IK[7azRlb/KZ9$_nh|A.w+Ȳ dbje|v ,4`}:}2RVXȗBX<*rsZz8| z W*(͗Zڑyc؆BeZ9ŷpilyQդ_oT\J`aAc5},nch{orK7t!iq!HG:[29^%!/3ƣ.57J9 gtxC~ eŖ'E|V|%F٧~qMN ѺozYW0'"۠X2*-LhF@{75~CbQFGfIuޑВB9yh3v }1,ilN|5"5etې_;ϝ<9 @sW~oK7h4,i m陹0wvnʆecwJ۠gŠ!C_B/Vlٿ#U6I-n,9/@O>~{{\fQ ?%3)X܃[q :G /]t6EDIn- S9\ 9q_pOS2GCKn1=_k}Ƚ S텼cc#LJvFгb8\Zažaȟ(%h:4Cj40h=\(,k\{!_<"c8R}uel9D _1RiCqdwh^~u .]>7Lt^:ߥB돝^λǞ=3o"?\/!>Yש&ȧ8^ؑ2%~f/hejIf%fCOY&)F-dui^7 8+{=ZaH=u7)Gڡ纔KN>N%u9B7j YکT\|,zNxGS ]ohoѾRhhĹ@l7=г3Wq+BlC>3/Hiz]ނM h4 墶WZ޳7nAwŔh4,w|Ch~n`˶эVoO1$LcLu `!X tzyG~̲%Ɍ^WoW _/zHOyڂ-U.:~mX[L!u6-})㐾AQap`FJB/{ `bU_Hc^/J`g}fbJ$/#oY]aFb}C[e9Ee#Kh~Nqf }i`=5sډi0]q/Z7n|R c+܈?PZv ml}e,-t'x^ZZ47Ftb)kFuYdq1y\%_ %ht#+tonLfЂ,yz.X6z؈0z^2Jq `5Rʂ>GSqȭ9Z7KoZYǖ˅|Ċ+4/ǍN^J)j%Ϭ#ˢ)˼eK !oG yC?G.vMMʅIA.j[)ۭ~؎<ϜKee~C mCN(k!# 5i:Жc&;[,lN^ֆE+r@xCPj!Зfw^rXM$򾼘,P%9.W.{(zUr+g@{)tcOL}qs 6R^,륭Cg{wGG~I-@t5Fg]ݿzYfo!qqF4ឹu%6aGѼ_V:e66nƆm%I}G_.*ort:*%`)q-R.dzX#hʥ8^lpш%r%IEZ@ZtB9Fu F#ڙNuwGW^~ӽ_<΂1zE։"|~T t<1ݖ󹽀{9*bs 4ѷ@%^ ZA{AKuǎ<ٗ ;^JLPpH>7NzшaH|G?fRc 6uC~;2cJd[Dśk[{L###8G#b+y<'[ RK HlAO}}7 ȍkmC~/زEwːzh!3ObtCc\Š9T}ޮ=:JfA{Ӌn.p,.a#͠ih --fyQ"*t[Qml9vE1tB4O*SŞbQ/7mȯ'x$8>AcawK+]U6( ]bJUhv!%\C%uo}I\.elnm]3\?g~|EDUc\8֡#EPJuܔ^dtq ^>;b E9n2S~kC[0Rɶ.jM xog# n$Mz=$_QVj]jn<=!LruK2ҜJ h~uw SYdH!4V Zx2_a@?u/.ɺsҡR|Lݩe JJ Lؑ5izmb_ ɦWjУ"ug "w)i0KRu}~ok*AwBWB;4{cpǰ)F>(v"#7fPӆ-ԡ̴JE>u\ }c֊5ꢿN%Nݷv9 ֟K"Лeug SwɽbQ#gkCץC~u|5duG߽fn/N ZHx/EI>FLmT awMK =#7_] [@~Z/ !o#"g"펜HoѨ ;;x )XׂOrn?ΞB { %m/Amc3rGn-=|~  [C{EߗͨN~ $o* sE;K>N- `jVѧ7BSc+ |Ke'xYY48[Q$-ܗ[ >!T'/؋2Yzzv.fOeBgI _Y`NAU| gs~V<"Y2\r@UC>z`ϕŎW6!8y<-H:W/xYԡX5hȜ@ef&R[ܬ@OE~|]z,mtg:KQ1\IZ_l.MjmCSAG] &#X7$ۅP?Ye D~7|hȹYu3,H(nSSu=mٿq;K_ ^\e|װCv|MLg,tn?Sv-!k_{N 2x*?ۡ#jȽ'| llPq}K$x$r0f48-.=gz OwDz3ՠʒ@_QDqF\*ϛg-o|O+u8nh. ~ ~WA^_c }K6+ o_KU8ṅ|?X J/H33"?gArѡ4L+kv\"g7,b!WNzUdVcV߰Ug'ȍGpφ},.4v#nF zfE;"M\~,"Q9Jxau/zXͩk^$ ~|;I~5'H.gGM5g]+oEJTdJ?&[Qlkպv]$AmeCD|6-1sӏɓ -82nnpU[8$)yB8.GSl}v9,[Gغ{n&⅞ra9Y- N?žrqf -TAN3\~C2C =!ϼ0ې~OT |?=2r'EϩD y2f=4?͋I|ż>f=zJٙUQ-Uv`dߪWErfʳ B K v B>z8gt_ai = $*㋞+ txTn[_[`oצb$ܛlYT@w9x]_5= Bto>ɿ:b=aΧ^mNM w ;l7WOa*G%(8Hu]M֐gSB~@ |Q㦴}S9 ;A4&ߜFT'?$!97W5kpgQ26&tM STB>{m?зc+Ke}Ɲ4$=IB `J0,Z=RNy %pjf n*{16ӰsY~+5E}w _7aAOMb =yosg9?OX"ۆ/f Ǎ1}gܓ"9~ضƂ_ ճs)@d6R,*$ɢrITY#:M]ZjUNȂk@baAf1DyZ=o[}?o&SL^3wEhXni7E݂"*?VI^FLҟwZX~#`l!o?* {EM:?| Ԋ/_zw/TtTڟg\aV96^$Ox_Hdo7[$+ =O A3B8 \;\^.֜f;NDL.֥Yu=Kqǽ|;$,Q֕6( d,V9ß}I^|Sk9eLW P^Q!J_5&#لzKe*h[64:~k?zi煄A7s4 u_3ao->٘z삄S)$R rI+Vc:n/|}wguSGm=io-|ivk#!!F8~K4 :/? \:K%wK^u9#͠AN|]~ 0\?}\ʒ=z694ȥx:tϋYC23|dkX3h+4ɞ8~̬2nn?p~}[׏_)}V1M7I,Wy6Ҹ !}(o)Ѫ!%Gb{H AoXr_`o 9lj*pO8SeA>/չ-:E_k1Tq>P:FO-AHÞ$[gґGI y>#|Ѣ:Bԩ@ Y|^&r#~a~qp^[EO!MoAv?*ACMLMT 7zvAr^8ٟ ̏З2T* Q?V;<'zj䉲_zٲ_~URٚ/Z|)A_g.4*Esh-אG[<KlgJG$C~f5M|?XpR7QdFM5vvmK5 (?O)_"ca}nؐȏy/ͶEUs.Hp#Dĭ~Xg揻}я*. ¡\yl:GXOuܓNmSe)95+-a+ `k!o-9,o_%6cQr."q;wꏣ8^!77+պ"IG 2}F}ԃЙdZˎ7N}`?d@W=^- ;7{R'D_'F%A#KΘ A_5 |OͦȊ~g."κ jɴc7Iz-͐؟E`:Rq'xNK/: B Q'R>&sޕV)7SW|oFނ)#4e~Fzޘt;tiԎ<>b{Hl;fQ̸tgH7J5ST+ԝ;Y^гBnk*OfD.4+ f/ڹ 9μG 9N&`D9 t ;\ݽw|OXV CwX>R>9ٓ#(Oe.C7lډܠ+Ew-)SBЛ 9GUٔ.G)_u5iTzLz42.x5H3KEnlꐶ۵{#c?g~yEN RSYm#bW[ߡ04N9G|J baҡ;Ol&0/nw٠_V3r1&"#;1rnG|ve/ȁNdn Y*cqI7rh:8qݱ!잗~jZyϡC .lG>=hGm@h) v z07d6{2j ;H6aؠS=z$vՑ@[;t]/Oi3ޡ/ъ "{@ނݘ7to/DM7׸n}unkR*@tWv5mTL^0hno=Rxgz5~5F%|H&b}\Uf h זsu}wqom}CNF/$Egu y/FޏTYI#GHssGt\ 3rvg.Be թ}SGZW  ܻ _>|bлa[#XaR"OBٸpWu'FUf)<7Hoڠ)ڢnȩdKmN5.5h"e_bn4+o-1 mdCV! 9#G-=\3L+E{Zz8{V>FizbI/1eA,1c4tFKv(6N6[Nb [d-)o]r>"am%ڕHkңRB"kv -V_] CS}H;)KlЯ=N|ƀK՘=Ѓn^-"cCVcШ zBZv.5c9jp9UGF=nFz.268z]]ve4}"}%Q=4| / "uMI9CHv]!2ouM_NKl`\tB 1d nIHeu9 }Hs}dP?sT+GČnf$άsDz(RFЛ/ײ4s-E$6 8#ȵ4ݡ?N u6Iدɤ C~ڻ}>tZ YC:5arذ'O-<_j^!& ]e9^Cz!tܗH+#v5*e8),q{k+@:{Dmq8ESfz{qr܏7%+%%[x fкLZ9r=wNMWTö&}f%YB%(Aꌆ yN3T;τnhyW] :Н-~_FeoodD@sw%v-u@G/uB~2}k|!()zKِasbpGJXG9SxQڡ{rVVצ|荼{]L7^h@/ˆ`5›t3²QfHEe.170ХsNĩ7hXِ˪GznnsC#؝{:tCnh7]&d=)vaO3z/KrJ@S]퍜C}P贸\r$Mv7WܡƺԆ$?SJ\]Tk9;/+m˄ gFN_k:8-ޖ!h&$k;S"rr#tsw;lmxЋn//N7RNn H ;35VJ=sOc{xZ{MiĽ[x1neuIKqoG~9{Jj#'/Hđ̬b2v녓p#{iGartXۡ_֡e1rN.l hrz[ڵH9m;t ~!+؆kV5]ɻ)^[cxԆ :d Qˎc]ͳתFo3ٍĥ;9SbVi7v#~CwKw5p_ﺱkÅ/a::nxo׈{_U6@ꤵnmvJ%{XW;*neGn1sy,Uz#t@dzF>SKΊ+=[ޜU2ݽHr:DQy=%ޭ#9 {?p-MsiJ|&}4^-^F-[-i>d@;+rmJE2j):d}/|N=YLkG5}"&IǻO= ˃Gy?T[=Vu⓯Ji-;m|sHt= (Eoҍ}yj%n5BL2eH[6omQHylFT t*KI?-68Z5Hoȍ/΋F~9} z wު m7a_ a2@dcs t 4=6KQR/qN_c^DFovXh+>9tP@ُTeފ{pF9=e8aζAp'hv8ض{$e$Vo Xˢ(B4)k|)YcZD7#8;2t錖A&n Rà]` ۠_Z*4vn{t)]< fl:X]s䉼yn־1$2g.; OyiV Y^SUJy`)X}e-rRqV}!OkU:J~E[ϙJ@QMi%hQI14gy'd@:LWGC:vph@s][/!G#K܋(v7 79/sR`۫K0W`sCFlNIM_Rw!K9tsm3U%lw\ Ȗ(Ӻ1156$/<)-B\hWOԬo?Z;GSqe9asaK p!{P!]$GqEVڹ]-JǦJɀ~13] a.N}]^|]1 ft10mwTҤ%7 ףzj^}մy2ry !:'rВoE>>RL+]\;7n֐'^ݮC Œ*myXo#hI6 tNsh̺^h"'aݠ|%RQhSϖ&7r .:*5 )-cܹ E^>"{eV?K)E u-u3 -R }uЯ ;me^mG0l}%g3zG+aЙ/^#\y1v=fޗ EZ݂ 1qnc b^1)`ĵl9 6 pG^c9(>p-mCCwtvuב,9/QA8_l4|og1Yhͬ%%Ԭd~DhV+iu5t4!\\ ]nSN]L*؛Z7'^hx2(!/.􄞛#30W=9$\[e*H0]@ T!Y##__}"o!?1,`ӓaϟ%F~JF?ǠI^/37hOidc&lz:ȴs2r|J/B `Ehq ֡~R/}wEt!n#..^Xfxy /TitEF-iGyX1W%xr#pb X$e@F.ZdM*OFO.pG0N&as7,}ftl-2C Ա#\W/ RJ lTѳ'pߧ~A<\zxrvqCn|@o^!K4wh5͂H4ӈe BN@"zt#?+"ft ޠb ݈.+е,_f?LjJboduۤ;fhǖ%L\mغpUAs=S1AL9>F]f@׸Zѐ\p 8ERz!'&X=^]ȐF|%zP1"\m>i Sޠ,#Eѕ#-*o䜷Q-\ȸ$$?P݀`$ܰ?ж|?8F*4S[ĖlF燊ͧcbt46Km0eyVD#?ƌ\ܥx7tOɁ}OOs^t/JO' sЄ]=s׵0,njhv"oe14r=ދ4ݐ($E 9ߥg#t +t åoȓRfyTǣww b 0kڼfЪT\}|qTzK^GjY^ȧdyT%ͭo)ufWB:m+mkdƅ>rB>~ՠ.WFB?к@9n =NO`Mi Ds-76V vR)Km 1ŨNFѮkQ/Wcz"_ח: 7兝= 4NH^*_aK=N䳖N˂H_\5f|i 9{AbtwB.GL?Q얺p9t\$׭3ݭs/1̮E9VkF >JTe΋͐JCڑh{WAE7>zZ[7nt WFci :{ᶻK[Jдmkt|Sj'tY# hY z]꣭`5Srf/z>v-N_80Fg#zQ>chWD~% ; i9FG'I?]R34o4`%ݻqAQ][ݰGVa^ɢP[ {-'t V\0Sݳ;bpAFmNkH]Ei>\p]]Gߐ[.3/=<{Wn{JtHD>: RoS*k6%FG/ƙ^Wo.댄!o3~.wGH#/xy"CFKW6 /Ze6^͗ŕ-lD%;w)ݵ#EWu7Q\!!Hk۠4Ƭ쀱+Y ZU wI.)ri\ҿJ <{O-C;R7!I4szYS ȶ :EI=}۠K '#E^3~5u vcdyKR}1fa ݢ5UCp]CuQ-=3otFOʆ*:gsyA=w1m =Wv3$ڠ %Ch׵Gr7z˾zz"*җsA6E cް"QW& U۠sP9K(HV M^F" ̺Ǹ}oJ *5͠G !uJVB@Mq];ԫ첢~3Csor?a5[F-Rclm_p0Ϥ 6D7(nBF!1ey[F;=Man:^b-j=ѓ0fJ]u.@$hThzI'oRvgރ(oؐmpRvMVлi~AD~2L⁑3R sǐKM#_A/&u 42B?H|.ł] zwrA?$x@ؠU쨞k+Y!  t[Do3Dn( y :4ꦟۺMQGei%,퀑\eP?/Jof<>\OA#X:y1ޡݭ=X;rZ6uJB.?IQl]lacn"FN{u|ů^f\,H1t5=)C tר'n3U%Bw o`_7i!g]R5{%%1k-yFrA2: vePlyþz'S"]X8,zNyt43RɻՓ>ZA.dyvq =6cY:Aȫn3:hGc>nHet . ꮘ>ftiHU]4eNu)G.wxiaya]F`NU]iC{唭'0*e%u0r ZI{yzA|e{uhEyaR jЋ/5 LAgkn!Y+ްm> a^;F'i4/h3ˎ̺fBu<:kȐ.4/~m$DB}yya.GsR)＀+= ㆼR};q`uȱ捊hޡ6dLbzaȶ}7􃓱{]s-& KխպV:tuC~NӭC`qS$/ř_/ua<g }ًX)DGK;hqQ7yDZ|L_k4G%p_FOͅ?J/:gt8_4#VB"yp1)1]NJih y[j޼x>xJtɗ7%#{ٽƴs|undXz9~5.z|~1 My~aB^D/RsylY4~xN~ܩ Κ"uƝWjЋUyC^|%m>bN~TPJ9!w$3L]G _z ܚ D[}Z;+AkE d4*_Z'qˤhrUi$KHHE0nK=F!#*#ˀ>&O~ =hY )k"{4Ja.+<_T5/*;rY#QYK$'EC%k179'$wC݁Ő*/_P~EɲuAskߐ02:u!n sLus{.:l#>6F MkHB֯a/K!C (+Ƞ"fr;F#w^-jzA^4!C'ݠ_ؓ]1Dn.~de_RIM쩬R<ȘtHA+gjkv*hy!11>:..q#E# h \FWh#"/P%d ] ySWw!Ń͛F{_z4M/wzz `=fțs"׵wX_ԱA:NSWie { z /q.K]ͻFGYrۋ$Eʦ:cL 7#oN΅\ȣ/2 _HIHޠUZ톽87Vjɹsq W2d_'G] ن\~7W-_je^GbƎ\ˣYd!GiiɩB 50rʬA.~kv Tz٠jF;4ig#f1{:.rs}걽L[FfY9 O~z:vw##i)s dC/ڠ>Ptؒ}_ \x_K?'B,[4|{tu/N3a1zrxAOY_g ao2P2K?c-=~hB]eYj d 4EIxA+\F횉I-ɜ.hSdD~^`oK y8utˈv }FƠ"&3 # ]?DjkrSYdlr 't[Fؔ!_K~M̼!QꏱOes͑h_ݼ%.Inz^Ju|DE>vN&W3/'{"'=!/-'t]}Q. iе c\7PVY:tKEs7[41Y^\ȯBz/T|ˉ/-Læy܎&8j[ޣ+!p?Zԅ角)zx=t+Ibt%/F7n7׻8ӽk\_̘ܽЗuI}Å\&dѱtU);*1]el)B,;t @nQㆽw7Mj)^`@[}˅<9fdЃ:<`p.5 ҡۮhαQQ[af GKw䒔6@.H94\]#% Z[ֱ!o:}^Be<: Q:ݬ>ueWKU_ 9)ʀnF, )е(,ou{͈dž]CΈ}fr/A/k4|̚^u[з gvHrU9cHVg 4f^y*m1z®-o)| {rwE2{D:v;2'z\Jmi$dCT u Pf3B>ְ7}:.=IBw_ zH7~5v^KV9 1JԪ]3z'p[69-xϗoD /jB^#&:3PC1FzЕ54s-'5V?8ГC ^] Z/ꀾ_6%Pm;f\$6iF]ޤQ/G/7tɅ/jۭ!R"wחCBF.J祙ңK#4ݙj"LC\w'G z1ۍ.q[EUU1FnuC>qvwL<ې KqjC5BO"7,O̹V/,VftCu:ԃpG׫S)C'\!7l]ɓ L_8ך/;&O""hZ ʛcl yJ}CJ2xNњc^j~ [TG=cx辤eQbz/9QAjLm>rQm>3?1% vh-K@S1s8%WVI =GC 4teڠ[L`xHF5& z. luY I u@3w_lu}Е/)Q_:u1Cs{LJ \>[/7묳|]HWYEM%=,wv)@,0ГϠ̊| t=m fҡSƑF_,],/>B8L'ܠLR6m^:C.O9ay@BLI#ѡu5G.y \x35ǙпZqcswZXeWb#7žluu6i~txBg˗Kՙ@Sx w' @>xM|>ո" p{* h>{2?ZhxS]^>>We@o:Jw ^~ۿ=s'8H'[<YFulf<;s/jCoIFM2r{'Z=O=ezY3@JX|>w@eݜAw%Wa{QZXl#cok&~Oٯ%S8KJ*w䲊7| Nr&CdH}_bS\}[5Q?bO |-)x;O}: o[e}xEQ;z .lM~⣞=GL>;hG-X9A+=KXQN;}P:r-UC5Vy%nBȆ'^#S ш% _WKc2%2 5\T[n=ПRF=- jw?:\7z[lϵBʒ=Е96$9ݮ`₟I‡b #p`ELr-H>8sOX+:}ݠ+_cħ۔<ز%:xI^;n~rݗWrE~Ls{eZS^bE"onItqSV"q!mK, \U_g9kW|OuhFW:ʿ-{El>'P4>YÜJF NɎ}:#/"Wy3ri9eE?8ГMGN{ yFșVh#+ dc@sPH-/z"bf;ΈIe>;u^Euِ1z.Ճ..zB2vi z~Rf(t :FEκ E1C:Ano;?r;Fv~9:uE hdu辊ȃϷL |PH mwShCѕ7WI) ް=>~LL 9®N~lo8a?C6k3޶X,/DA:BTW< C)}9"djoA7 !?26:TE-.V buGNϴ O76ɸ:A&0+fhKZYݙuy]E6Cr-fQYLqH=$%nm_:1}`k$^vah&-g"s]\丫;_# sf$r)K$-M4v4Shu!?(}]@~Svhq~!?-j$Ty?&/KvJtH.:[~fDM'rfKBM#Gwn,%xtaseD]$3(rh,*c;!c+y+nG.2MuC>S.I حcGB+o(4yyWKwץG mr^ݓ٣#g>"̒TG^؆\50 ѥE)ZB:1ϬKg&/\72# `V@BY~y=,w\>ݥ1m,6z^^_4IG{"j}y*Dވ\nkb@40hbݡKhHgYu|sgBαEKY 9ȅtuB]b{~{^RpQ2&BW8*nKC߻hF+E(1rB?Oz rD'ɦnu6tT{F'7t˃՗9Hz[W.bh/;r Ӭ?jtGƎV7z>V]ݎ)6Kz0_f; A퓀;ipz.r;dSB3RUYȿ 9ø{x /ahE}q%ŨЛu䞑a{N밷,˅١F΁1={] x}RtgB~Q6^rnjMi⺿$erkaw0H cM.#j["ysag.$pA6A'^ 㱀kEsAIJluMb]%n3_-0͖B5d {g̵hDTB&h yq?b%?5^}K=zw&f𶤞 [e;]mRI(#_ Q9K i,z X^wVLE"ےUA|.i;||G1.6M+\RM2>^*%70 rXsT9I^~æ^Mꏉ |^> 9-oThՕ>ooM֡W{$5w,WN\l.vUd4s7zW*Gc`wY|>?<^O"v#6Uhq6:Vw5.gtԸV [XqJs,+B-Q4̨ tx;+k C#toqx{8.=퓭)L4ô,{$Aùr$h>_u'*$^{sl 6Ume{QЇt]B+^nU?lOd^~ yY2>ڞ Tez[aRpѯz]Orȑ7W8ߔXz{d ]# 7/%G="-uI.Zcx?96py}oSgJ |i >/Z>Vgfع˟#xuStxD8)e](T]hVd!M%~% lyέ%WA뙛5=0@o֚P[9Ŷ:ܹ?Я]y?-uҠk*\^Gu*r]"I/A3>CinnKK "T-9GKm\E+'KApTXKT$AUG/N!Ÿo璽X*'ɤ}OJ7z[Mz/LC7?bF8?Y7K`?RQsߵ(4QuCޢt zz<A:o7zKlLDžޕ7.S`[MF%Nc8V/|*'ŜuhトQ߁`gc|$aq+K;)3nC3o?Z6N_k[|IدQ;r]c^G<$HރA~2GcC^bkd=0#9`v_OA"oo,2SC/gtݤ1 h*M_s:u'5E<{Cސ^Phtl 1蔱=K=sǓF[LOM+7loiyN*M,5;zrvQG^Z*+81 ٩UuFԽXyׅ@fy}-]Or y~=n`4hZӴ\{/7Yh.We~"w3jۑ! 7JcWv=(6詫>t@ug/̋'tS:UOrҰVf?= C^"c=Ɩ&*B0g/nt־!]Y7"Gn׶C[o Z,OJ1kZ<| }ZK3 z]4#.tzz%j+3;ɧ~)iQdCH\W>t0tg PzZ`c.qոV+y yȹچ:"u.qKR)6.H9e]iD͐.} gPFk-tJ&[rtsؐ[68Dz|E=­K{[=JѱїL}wL}q0+$f'߶|ŗLIӮC١m\G25z{է zDAoWh-bhVq'xwraB~~@Sy"aW8:CNl^=:*Rk )%Xd(P5:zcU $ 9II،2;c}Ji}"Ww:lҒ(1j4.sY~Tk_z.Ɇ1bE͗vp MqVM憧2+lTKq> ;[K>*/k@?D}S4F{]NWkyi4=r.-7+o]@ul Iz.3/51.u|Waeѡk8{"W~ƗĠ&/YNxUݑݴ9Cz܋BbS~ԡuzxܑ]+ J֩zgx`e 9G9[Z>B-(0@7Hi%guGVDgf}}=C co]6r\~cF:?R7ۑZh -y.̍yCY7#ՕՓǣaGjނ8G^#=v'#sR5ױ`3[Mi%5{cGo+ s=Jú'0辀|G45'b&~?Y(.KD+Tk;NBoqÿ:nd{/}Z`^?=-uh%iOQ7&az] rdf}'yȌef3$=.` ԓ6j}~s^qlWjY b⚞z{\[ @M%pK7!OX!G;l.xo.ݦ .ЫMtPEzC"7\}>p[~S_9 2g\BOϸZԑ$컿_6D٬B?2>lhcފ"(5{DZ ,-ےS&S@3ay !ͺZ OO؅I ˤ ^^`pY[:Ȁ&Eq$'m30$s@/Y. |~5->W#{'"uϖ[I:aJN* .~پ$ΑTsHxr0ݢFUCVq<\zG,oO/˟fq6`)+jm?;߬~C[$}Ǜ8 ]5|uc??[Sn!IoBx1Q}M%^>'dZZfy-%ZܒPטOZTJ&hƆۗӧRh& :|Wy,%w\ˏ|dZ© ]RfoLTBq:x3UzdDo1#6W_9Ho E-}{[kփ,xc7DjSwz䎽Q-?˓{)9ȬddٶYFE$ÆRAeM@_c[ *Ao-(Ms0z0NBFD3K-^B~7q$Y^OOX>>Z]P%2َI!^EߺkHź""k[(c<N/_ym'7x^*a.gsAo68na t㕓9m'EI`h'ҝT֮} g0r3ނ*G+ JҟI}0AݩApٰ?tpN>ּҽ(vnFɑEnx'_ |ƿ*~K3XL]C7d7xאK]`ǑC&fCـ^qbfY9ܸѻG92-oO%r8ٗ5N7sD:HlS}$یȆ/u|je ߺSIuڠ4Cho=:HOIzUAGΙ4A'{y(W>,*"8S@~?y8O {oVA0|Ij^iOe@Y~9Pl}ܱ׵ʘ(OQ[l_t-OB{f5]JvYE-L7>tS ^,LېӯpniȍxY2VcF?BQ\28 - z e$Jo?25/CkJKpvFq!ky)@A2M/Gl 4ݾ1Y- ۾fiԨ:AH2y\*5SNz/X6wbт\6io aWU%;8'ei,iɁf#9Wch&cMBoldY0v!N_7F"ڇ'򾹴@Og pUȶlmz,!Oń\ yBd_3%L'/Tb~DN쭄|I%A[.Rp@_x| <;HFj lCc:7GNogY>/N7N֐;8~MΪ tVEobm?)hg.0eR蝐]L377sqK*x07-e<=x[q,~,ih*n!~yߪGy]-b[#.؀:Tg >"I΍uG6Zh~=K͹RqޯJV _'O}?Y- lSTWVGl!MUy(o15F$4pmUeT4Sϱ_2 ~5tBn*v?S?A6eg^ܣJQS rAH%Wۏw"{d죒f,-^f*ds1Vu_TlB +k78>k{\y"pPF-nĂky/y-I'xqhѝw(oGz0cxi{B-g$l"̞zg1{4Ke>cO5zKUGþtd@[sLvHシc>6Lmg>i4} J@WYM}2[s?3#W)*|:qz~*ˢ{p+b'j~~w^$gwy6B1s$~. M_<2<ힼэ O'%Jb -#0В$\a9p6|v7sdf`6-%&k&Von |{_Y:Y襥r?";o>yI 2im=K DN>V?RHڒ)tVpG"V$GP;}8kb#*I;O &@w@Fq}@<|'%zGnHko՟WwQ Q:Lp5}כ"㵷7xYdg{=}o\y8%W_mi lpVLџ!{eݥ75W>b*:dU@/Ci OFփOӗU4?@5}Oi hܟaï5}$8"b {bD֡Fx[{9{\lz7xqmmV'l`9c{ﱼ1gn,,#q w,7 ZE 7.]φ%X@k8/Ij֢Cnwݚ=_g_/9 d~îr{exFK:cYC~aδ,S2ҡ7~RZgTc$~ 6@z8-Yү!@y(cʮi#y;S.͍vh~djvoK;dSr Cy8w߃EA>QVs4g7K_Z[RnqEKL?gJ_ۯ,VBh1˗qBh;}x_tS6P pS4x˽n?3+$K?_J*d8=Y},<$O2 ޑ9zJ W'f/&}xgsK؛Oe\-ji*| (TC|_ f1Gϙ 43!ɗ|m"퍞Bjf]^9W?Wdʰse@.awVS^B^"@kpo4ߩpR |Y^5YߒbK \MۗVO>̐[8)p*]JAUz']MNb]%{s զ @Yyč;(aK69)G"Wd޺w >;A7IrhO3-`չ;7{in}(5H?Ul.ه+\b6W~@MקDJB>Bƥ=K2`Si3%7E烈H_+6\ay\W:|;v י0!>CC漜ɷ>ۯ<"U<ؗ(5Wr9T" ZD},3*fneٷH'Bs|^;2z/ixzw$졮Y2!쩔:S7|TJ}wkR]^t|yMW{OƤxݟ^ >7hp2u W)8xe+Cݡ'b0q؇KeV7xiRQ4hC?`$OtORn&VbEkI$&\59hc!<9}+Ǯw2vsa>M~/J"|O2Nq4g^xZIBF|:kr+>[ >MfX{_?O. q \Gtjr&rWS;Et+o}/-?bhQV*+A÷w `ᔥivg86F=Ɓ3A&VFS;[ӐGt1)En7K~}@^i`s &&4^1v!U^m\Ņ|D)-?Щ$y[t|&&YBCz|}'%;h!Ʌ e8T>^[RuA_{NFl^⛣v ,^E@\1Vc#TR#>Eȗp^V?2roWϋ)tKֺ y_]͘c uL`qJ['Jn 3Ůhl1µzφCU"/f)\{msGDo"ޘakc-Ye] ]h l_R9όqnbs~Db1:q4ˡ@.n\Лud5]&7~E=b͚9>xe[d>jIg`*Od.Ȥ#LvW| ǃe~=7ّ[H-E9 }i۠B>=Bˁp],nxB?pKr]GMgFYZܡk3+$,Bm>ymmѮW,"dg{AumEgRDNVfٿ_bۗ)<%Vt˒BnU;t{Bq8SZr1ݭ#ރfwJrA;2e@_ڒ:]&el^ RF _o5"$— Gݕ%ۑ uTa{PBPOwDO^ ̐X"Bw/ʥQz\;O}|g^ߕ3§Aua) nW2u:QP: X<5aBȭ<}_x$*#+6xf27VvB_+;i43 Kjoޥ +Hv%G Y_d6ЫCm]\F>~Ԃf?C@3.#vԀ٫4j}7O_y :-M4Cw_ϴ yL*yjIr%Rw -5$kBoSsB6렡z .$WKi'^Ң`ܯt E$t kzċwp!A{8ȫZ ]c]Sѳ^=iB.%#wi3t:(y~DB޼>BCY<7Ԫ3CiNe+.b~YR~Ì22i-FTNK ӯɈ!K3[;:zgH:C}C 4"hȷ7ϑ3gs/!_g>ߠucЇ.}ʲ"SF4yqq gYwXש/!oе}vn$},%zEvLW3n%Mr委蹜Kxb {YBX*훔v~+V:E_!]qϙQPf؊cP&japut}L!/)6V24镯H_JFWG SD<ٗ*m1sf}fv%Rc+ǦA/.GL?)-||R59s/zyL1+Re~~,}][}6/킝:硳F4Fts[B1rƋz[rˈF]0>P42SMc0E>]GBKlٛFC"AG~׆<҇S00<=;)snfq{!)g, 64qLv[xg__h?t`Dv /O04{KgwHB1e{ڞ:RX-=Wh'i ޷MW/>NjL/^,|2}0,30|Nr7/SiSh5hyW_<&=mV6y1'0?~ԓr P^Inj\_$-hY<Kה->Ig}< qgK :~EO4BΐyrN++F7z'SF/ы8 dS<:Go$]Xv.%Ar|q7AN ^䏸Y櫖;92,Aީ6>s tIR+RBn|~8zl?|7 faӞI1v-9 {__JZ5ۤoӿ_?/Jk@ WTƶN7xA^$?ӳڰڣ>`J7m4y9?* Rӆ50&%6Nq΁^+ݿ\R%觶_k+x5V gBo7MW?,f?Ч U =rFlPb=1&fA_WTnSX=0jg~\C=?Ugࠩ?Tcgz'I}v(_`zȍb<ٽԠ1b 3Wʗ5ch|WJ{ʍ=:Vc#OJBvoV?WjFI\vAfK? JVȻJgOܘR7tr]OVȽ3Ohus Z"Qw˯̨\ ݣd4=׈SԠK2n)X^^NB/&]zHKD3XzfSO+6a>t{'1hpJN)A"I.HI;^>c{q ? 5n{Ttl ,9 iaR(~fv c쑊][l7N69q_O;r(9 썝G>=5cL!3M4cר>a'h7A3j}{*kàe~ \S7w2{Y.n9GO_& {؋{v\y{׼{-Ef" :Py]BgFGX|wLě c AN$.c=wh'tu&Ev?|bOj2螻9k$V{ubϾC&9޹ }JnI\3 3_&SAV!%n3QejoC]D^7+3r]'zGϖR`>JmpƆ^%=&>IٲyXߔ惱6hՅ}JVɐ.N= fc#>0;_IȬ*eZ3dCfks`2/@?K\ž\{K:/v{rJ)C7 } 魗_=pO"$oUBSJ,5 =mn] iRIKAzy1稪ؗPϰV/d>+7 :zmːL*NͰW}THص.H -ȍ=' )?\>%# z`P%_Lq ^ThGMWK |`Yz^)@ 9؇1.0{ y{0>`0i(fR v֜ccoK K-9o^'ub'vw_O%0x/஌TVe=]c dC >ܠ2j;o ]~OMWde|\#Sp+ȓ5/Qyd8K)'7q\[3~͋ep]I= :~341]#m 9pS;`؎Y fo$AG2qrx8'ے-T=_= |J G{h'Wg`CM]@H?)ֵ@)ROi~͔سyEB?LR%6yi%b F-Nk4ûȐS*^rdzE̸ /x;dfW%*mKEl|qjV)G~Axc@kVibAo KxRG[fEGT]VTh c1_@1mF'fA>d6Nj-bD3d@/Oz*}W|xa1DJ+ZOd6E6#sv59샥~kT"4!;%ILI75RB75_[eldV=K8J2d^zB"K`|؆9bWf$<d&W,姢4J'| 3DefLۋ!C'X]*n̴rc|*wæ@nm``)dm{WQ3oJ-wQ>`p5æag5EDM[x@ GO+^>bk'%?/F-B:p{50X[p p};K)'Ĺ,Tt'z;G ׫ >e܏ `oV l;!nBO`^}*0nċ>۟{DK} |A.ϗaL<ߥ\ Ћ4M1&跠W $Sv46S'n?@+rWI#%o9S}=ܬD>MR%OnXr̆d+rی"X =nQm=m <)}bAݕfޮm$ d?jIhjrt*x )C)J/mkӰ:tEL}u9-OK\cC*9֐XF^튘-4,xqǶKҥE6 ڦ|cLH׳~=.7O؉}7)gmynbWh51e29~ǎDK5ayojǯ@ Y*>2=GBe/?˵V}kՂ( 8ͽWK >6"&JzmzsB#zEL7y8 4k˝f\Uz[/JnW OlVSԌ-qGs5F@khf5NvG/UobnGKx0Z-3!p$aj1`7!b_vo+5tbʱsHxUh}v 7F^~?i|_lجEh2rc]-rO{F ޑr>X!ߍFQAa!@Fh"3TM -ڎO݃vfS OȝRzq~<=&.)" s[̸_kMGɍR2;K|ܠ /Kx~os~`@hT2LQpؔk:-г/ JIFd"IT,NNs=/1~#Oc\}ޛ"_Hs^ho_)|'V:R=eze׈(M )f׷ 3wVYߙW&I*eÚov}q~m# Dymh\=η(4\Zwyve~DmzAnyU r }nГ3tuQޑ FJWL@Y@>ֵ M:<KcH~9ۼ7:9W薑497z☰u96b^78x@Jr@/Yʁ_cR2==Bu3\_F:a3UCw MשW&K=Ǥn $ר=eilmY`Qz,?m\+/EFe1։3G`S-t2Ώ/ȓSg>tN& _C逮nbԮC/}3ȋN|Fv 튠c+7myަtULoaP KN75ZЗ pE[.\+<ڑ<r4v  M4w15/u 89w:]=va@QwFBIs^ĝIs2WL^4 ŶGy/4Tn<cҸV~KL3C Xk~3QVKd:o Q}J5Vu\H;wXnrZ=ns U/u=lIc:eȦЋ)#wǴHs9ub":`峨S83{K %ĽԵkȫ+3Ϟ ''hB@9$0Q'bȢoZ@1B Qozst*4<}#hLcy.HK.&s7${">>(^6ɗ4VFPm.À }ޡ:rz2bWeni1 {dSX -5/ ]FJI&{ N l~7x[# }}2B3t#PͭxB]mCGy$eu@/ym|[tȃ<:u_s/tNSh#TQ5IO-Wje /ZY|TͅH{gONŷ;fl[/KC)}H36 vޕ:v-a`][rH95|= Aڗ}qw0 =ة{ס[s֮%͙ CS 967H H/m[A?WHayfhr`/N 6X\\`6Ա#ecta9[$1RV h/@:Srsq#vzNiehwkz XhI3RvRrD΁ BN^<륱 "-%XW[A (\Ni6faztgm£sdB#7=Ån5*h3ZV.[L,]65I {hاo%u z /ͯuiZЇԋgBSjcwHT΢Ї9!w2i_mJls)EǑ|Z9>[c"]nz>GaT4=Z {zC]l%a s&,.mò;9Aa%{Z.:\_jtsiZ84o 5\"ߏO7{%7x(tZd}z0"4&?fmsQ,킣y֞RR7KȚ 5j }% OB䱶ȺCNڳ\Nc)qoR2A~(ѮNZCN(Hdܭ_6L^S+нճ{ "yC}ԓ1F&Hvub7m<+v!S A^nZ.9|Wh| m_z@5MU,rڣ=%nԆ _cc_AEnܶ7XW9/v/u=vR '\V"i'ttI%N]XE ףxd^(9>>{Zֺ%أXLv.o$CNjR~{n>-Z7b/DrO^]R rd(Zk'r36ӣ .3H.RX)/qoWɯ 2S/\2)$t+|ik%x옐yvu؇nlrݼ'@y|0} r܁Q:>FȐIMr8H{uVl NU>@,2HC cOҧ]NfS?wh+&ؗNRЍSˣ:ث(䡘G)*tӘF[A/}ӱ-K1KMs6N{1SVD?7۱5舑N4Md zvmה@ ]68yϡ'wo{Zw.zJ!=Cfr}v"G=t1\5h1uT^jImrLCO^}CE 3ʼ Ly<(D/]V }=&];|ǨcOfW Ct+UI\ۉ]4ǐ%`zRzR/H Orx}24*أRC-l^W z}U[ ;}yΫa1ޱD,1+_jj~-A_N؇MZ*b ┪_utb 4DL0,26Pҁ|Lq$D厼G(o<qǡt{y+!ˆ (Ϋ"ז^ldUYyb`S;۴c zjA{c^==)'t@z^v zۋʕľUM7Pp|N0 M.sWz)2mVH#aF>4mj/r:9dt°X$IS|sGQ{(}>ip5 rcc<4hsR vn{r?rIEݼ]SOhhggzvzYׅ9x{BEJ't- `k(6't`A7drT_*H?uS:O0e4+`B=o 1-Rco.[4D}-y[dFVx )_OWގts'&huK8{ǚdEγu vl^I9^-E$$|ܷ-wJMaQc<1x'_3h1VccC0uK]삾&4R$ExK7O#iKN#*UziC_~KrL'AKJiO~ y*3 ثwZݜv5}ӐWC7E k[ЉXOM9잍|9nC|8ve6a.NģmC2=wP"ƮÊ{ Z.؂?]Z6xMp,A @bx92=vۉ=?-7KxgI7 9~@3:zqkgjX# ݼXꙌBwb e0f.so)%2;?:OO ، *Q}8ED֜6Jݻ]mSSh$}LKJZ x'Ued:rboi:]P,`{vٙ+Fڻw׌U$NZdxRRnCwtm|Ba"ĮS'_OBIYo%2ГkuE/۴^,A1׌},zZ0\iN޳Nn!C+%=5h)rL4LNj-3D]Ou*I&}ꁰ`̘Yse2ݗ\{3=3Rޏ!ڛkҠ(_5IKlXس{F jl@[5wuR})A7H"Zَ. tqbf r6Ф\: Ы׭{$luƱW2 =ENJ S<%CT :{ gW!'3U#b_ԪWĬ!UQ TG K#L: T]fƚ;Z­[u%Q{F5 `tbo~2ߥ\6tɽ~GRnk0]82 =^D9JUh2ƮBf11=Uj3bՅK\=O=7hi6\gyQj^GZ% |x&{pNZZydN 3-ކ^bkȂjשBSl9X4*f5W2Ć.jjFv(zJ5w\>9ܠJL!IL3dV3iC_$Uz!yвI V}XO@j뒡U"'ЖsvY~ć<P|B1bP9V: 1&xw|-\k>׆Lޅ*'`:֭ދ3)ŽQ3ziȟit ̂ҞCݿF^wo5:on+Po |*ֳ ]깩^rL C/iKleO CaSV!GOY^j2ss$bMw1G׭zU}ʃ 4*Wg#/r rJ\?QuABe,]CF'tT9"2-:G ܺ% ><[OVEI*~MiIm;Qt+|b7i4}?箮v>*_5ӗ 44l'a#ŅNGK.neXC~=>,]]aMЉL( WUhu>9mVB4_^}UO2+ɱﶔy7R8zuEB ^XaYq;*D_,"%gQN賝4F؆ȴ adz{?J<)G)U;5^;Nǥ{:Ț낡=#M.y17t~\ }og '`77i0"qEZ 4U'%f : X  绸= yy~(pC1KZVHyk,fvQ_7zD΅-2ޟj3o[ZϦ=)5Dv{"3w2ԯGEދmd[vщ|ǐ[\tkM2UG=޿Wg޳GB7@SM~ocEkz攇ِ1"DKG<b>B/8ǡHz~s6fĔa_z4 zagwA)ˉ),vm|b~S42m$3ՠ.6=h9ʒٚ~nZ/|O[hBl_= שs%*wjZG7=#:&v,>P}ÈC ohA7%v5W8/\v+]^=iXJmbt-RgyxZD( ->y#_2&שO+1]N}zkVd褳 ]SJa=TFtMf { ?-?3RGdVNa@{ϔzAiπ X 5"b+O%/t@zB+}89:[LB~$Sz UFZG}{c:O9 ?*h]3)WX4.J"f3e)5])Xڧ&.VG[$؋r 2]4\qjh/( E[ͤb w{y=3vr*G:!|b_+iKD劙*tW|UpȬ'W_*Ks! =ZaZ7ehFLc> ՠzŮ| aַiM CU"&dLvR3{އh~mn]_:mЍ <.XzzKxqho?{|?Hޖ)2vW3$v9J@_Fl RJ؇b{Iw<ן9 [y{RE*|"7W 2t^#efƅIRI XtLY7ef$ȟ)YzsnFțnkjKE>VB֒co^)bQme^kJ;Gj#".1glR5>tugz,CPGʷ߉_ZRcUxTҼ?z)1`km6r?ܿvc'NɏNk[= Teh_vc_r[ȱPI͆>VjWȐLw&LpwRu3: &uLe Ǚ/vqO jkl諭 W"ڿ>w!2ⰼx18%tT}qy$*v7oVD$k oL9;K d.*W* -ЋI{P {/YC~(E滱O=q?Bϕr>WgZ~E>)rk@..@UCoouPb+RxAɁܞLq2#?$nF9D͔uvr߂*Xr#Hp ]-j%i[};{/"fGW-F^3tϗc yRBFz#:fPZXn5gzJdCy{GLDmVb4` $9A\?YߠZ1aL ~Gy+]ȝS#rqSޠ%'~W+!LhV_3йD$r^Lyey L)~#O =C }*j1lDvb/{2諝>nU #C+V\`B\ǾLs#*x  8 olA/#-ߙw y\1S)[C#W W "yľ8lX*f@kȑ |OS z%GwcfF3-^e/OB:GL^#FʼڷIjݪ'}\C'uKZD&'Ї ڊӜߋ<].ױWW4hKվgn}q-FTv' |5-*OY{{˸ع]3MSBQTamJP1xt}ycȍ5ʲ*)rmaI0XL׹+'DY^}"k&o95thUg=ȓ$Bn-ra #G]|rdp C م}iU*&PBfZ:/Ф$cam[mG zαQذK\}6S sZ/`v-&rb/NNt2_^nb ),rGeؒWGc6 ULЌnAf5ՕZISeʅݞYEjcE34]I<=A~8do6vs@ 46?j~Q3`=/Hmڮs7z`o,r:O(.rҰi,oZAPK6)FO&/ wgsA3d$_5 6g(Km*C8])#-"V78JT۱%Lң.aR5|{ SbZ/3iEQ̆N[_`1CB'?nj|Ql,[AIb>U6K^r+yml-Pu1Ռ=Zض|mޛ\]x3zW5rΖ(F7f.]+2tJ0.$n;X q$_cCZЧ ZJ%jcaYA&c'r#w*D+ijU\F&j?~[(e&U y] e ]AH4iŲN)(zaWwfoڪRK^y:ӗ*tmC2UlwNy][~OB?@'M GDyB(eoₗxnT+1CKer&XP"t@gO +|b0J-!'v$5=zh;&4k2o'*vB_R ɠ'/b 劼:zuTyxq zqGyU1 \>s&5+UWB2v{}ȯ؉؛7zh2zZ(Ws2(c g>O=~xlFLIWSݱg{{hOY;]dhܑ%KU@+YdiF"=4JeA wuF۸)~5zX!ocfg;LrD7&~}ӿٌD⾑svWlCыDž>Ŷ:[l 7ڳى t+:a-Ff.c/QfcS_kM {,8QJ'vd&v2N2]922->H(2*v//Euc_z[GRLLeC)򙍝(r.؅Gn'cg#/N'ƗBkw{&P'A!?Kn*tj|J~lukn9Oվȧ '3TnJ$p3K4%A[0&ص>~Ri /0zA|\p#F=ur*t{ >Vi]p"KWWC>4a+(MQ y 'q;q3ރ\˄|`l"J:CpՖu. 8 >:lm_jH8,ФewpLv^jQbo%yjV$5 ӌɷfޥ1.'_2ւN;jl Fk{]tJ| +N~ rKa',9#.&'v"{d䐡c<ZEע$ r C_2 =|r ݗ oKԓ_ zv'ԓ{NW \*͂LYA[Eɍ}nHvs6K*ѷgBM\Љ~(.v{uo/GDZ'ʽaRmDekYZ.S[lEl4= >~G;Io؈v/U}MJȉmAE@rb0׫o0mMk5$+'Ά`ϣceCg^B' jUU-𧫂]-Q lq*tWݼ9c]"֩ٓSF{P޼ă}ɸv~OjehR[s29\^,w4>TZE1\X[ nZ!CB2 Id^}5FsQR\ AؗMoTtC'[rp?T I y%"ȋw:}kcoR䎂;j܍ۮ`~ ;}:&l,}YcKViX^{)Wlx+ǡ {OȓX6Dp r~ /K<ښzbS&TkԆ 140WOO\ <>" } Ae5dV/)ظGĸ`^rL '*t"ȰŞ1r22tɡpptN { /ǫ\vn#F&]Kf;AOg:-R5RTx:@~bKy 2WcWzHO/wbl{X蚃2ؽJe.-ȥ$=u2{2MRUc?c!L zS7lHG8?S^2vhNƒT_=sTANۍ/ЬQ,(XzֳHs|epZ"|ce2|⋽E(ȼ7W|}`-j>KTZ{ӥ؊,K()pН_cB9+,BN:#9//ojCAjSYHovIrȰNuثK13dJg0TLC$倾xбN=e56:! )1V'_>eT)>>kz"zomЧ} $*t-.zrUV7~ Ajkl5\d^\Be a.!cowkB߱ 13ve`ײ[(CI\Mv_HTC>ZgUGKyu6":91=Bz:0[/ hKzBw#GnA ,84RP[99btBw[ph~u>% roB7 "c^6"՜iRF ]ٳzEdE40y{R"4Ұ}ڏ!FCS]Fc9 d3HeB9Xbԛ~"ަ̃d7WҐ>OcTף ;xK't fh l۟ <4q}2!I®L꘡StE`ߎ&t%7Pp)?>P0ղ^9ϫ@2J'Vۉ\=`*zP.kG z3/x\ԣ^=](ixy:\ 2N^soP¡, &ծh)2|pPJw/&fAFun;zJN TxJ!S_n 72(:v"lcuoZM?>թcQYz)2]h|BZ E{X5+S09Ji]ј^nS^kt p7^Uj^[)x DZg8h }o;qqmNƀ=$zR&7 ^owWO^~5Wgo˼.Зd5ϹŢlZ %ci'XNd~C'kQC.`hGv6x6t.f):.ft䪍w{ȧ}BbAӰ\޼A0-֯bTKu"dA)^e.APdgl%>57Y32*ש|IA>vbƠsgv)d|Bgw2Ю6_U9`J|b/}P )CD䁄L/43Q^3HRBoC>*Лʉ6~RsB(.ʌ[]+K)afwxC}~S)n&-S~ht)0/ yzY 6K`G! ;fB34%{uvaO7iyܹ;cu!4 g ί䴵H z8VS7d'7hWQdfQ4C_x rPZ< bu^0D\؋S |kGm vbAK3%C$hGeP֧:4Y_SHmm@ұ^ɼJϒAd=k(jk;gk9wWY_&b~#vԼd*^yx}f*y}ߏzD~R3=?ջI2p.Фvy */#Cz1U~s4䂃(3% gUV #.١7E,X#"&^<)h\N-^rԝH|T^KXd|EO#>Ut$5%#ɥ!{{"Oedީ,,ՇdQh-&3K*7%~ {FOFQc'!羦tB/ᐚ*vy[3ݞ? s9gGuz /~pEN>V ' )tj 쭘1N|,Q\uTS݊61OT :`{敽8 J@maf>kJc;g='*TIXŮOuLؿ*>{|ܐj'%Ò*KA ԓ7d]?Tv-aBe|d5Xfhnkfc)$C{'7u'WlÜOCc2]瞤")KyeZ7Pd?KN=TH.Si +z:3ؗaФsmʑt?)г]uzb{=tC&Ǿh4Ϥ\iŐvk8ƅ09# "7u"jnOl|k$e=؊bЋ+ #{Ջ~bȄSK[ɠ`-Bځ}7z ]Kt߷u%fܠQ]oK\tw6E|2cS;iv}9=YiIq! =Hvf9/8˅:+EA,i6tsӡx ~-`UN^QGVm_[ƹ7R)+!i@{GiASy G* U-AWȬrDjYLP[\@"fk޺$6?"Av=S>f{ ;x;F" # ZzCa=|ZaN :1>݃,N迏wJAB+dH4-*F߻W̴Iڠk8Cz&&5*J\qn>y}i|gCZ|~Z d{WJ0Noy`TWmFMi[?xb|Ag_9ӵ8u˽`މ/⬰UbZ;o(V4tkۿh=qc#z (h3 ]BZ#goKשn֠5C5iC1ə2LP$15XzkA7)س$p$3D%{O-3$E=/5&[)4ͥZn7[K{nо"?B[1+sVdg [ᬸXQeݞE& P;HZm,*yɁmb }FLm}Cry0F{Z0Rx5^y)"w<7~sA>AC 2azBfhм;R`ob +K$Q acSkϱ^q)tϱ[wȃS-_3k\#yko-&` % *zmy+oYfho+O\a $5 Zj_:]*NW|6,;>h1zŞ>D1Z@Bvh Љ,6B8\:w,L t{s„KNyL#^wslS%=^*vY__E^݀9s-#Dл>K*i DNK+|hM 6CkxM_wύ`d#e7lXo#tYWhD*{co!- 1-Α8G|<_ Oޠ^ycgs:G5Bor4稔{2{:#}e|9+ڐ%H+r vCND11v;[`Y AaĒ/\۳TTRFQ vBeJl~(αf5kl )|g68R+rK{C, V?!ӢW%=e@o/]DnK\Jj'U=|pznIT Oo|< G"u Yzo]LE@!@H ! zD0A&J^h$,[tNpr[q$u԰Z`BN!,5HYg4SSOJN՘KbỴt S_Wf}J"C s J='7LFҵh*y›1'9I]z z.˥Zm8%Q7Up#莘.Sz ט+'vK\7P:dv)SKoԈ"y~cxQ١+U_J]RY1Rt DZOWkоyDY)^Yִ۾}ThmFztJq Yno{ӭ2bx_5}dzwpuqBh`FRuODZ5Cq4'qijSo!{gCo Vv"^#>Snxcok+4jعVα}]fC1~B|}틍e,.Zv ^CZJJ=? []׎5.;˱`KS5$8ZUXf; kO}sW*[,NI6ŚWebVN5/{84kQlj݂{p(RSL8J6q?Ӈ\`)x5+yc`bĤ~^Tΰ~ Ǚn㼦Soahi)]:j`V ϪA'd$yCh)qTK|yc7~½]nb=a\Ϯ5B!SзY{j'>u *^zW/-دv,l tDXзcU{J,5oGLLIO^hEZ8y2KA22񉘘@w^R{rBwwcX4}6K>ArkCnͪ_Q鮞x{zM떱XGmTA8? =9| PYRgW ףڰ)am|N=]gZ ܒikE ϸI:tԉ*5+kpԠמ @4@wUȾDk.FƟWA}mRطcpL) !'%9'b$ZRZa/ai,ʷ 6ܓQ(r)xۥA"l= jp^Shu9S-wڠI${Zϻ] m/Y-5.Md&J$*Ra{[عqp9~XCerh][([`DotY`\Dg$k^r.wgJ>bBt@׋u ORZ Pr|12>=e_=u1{`w5uè*rVI~ׁm\|ҵA"D_줱㜗}g.R*IЊs}" 1LA FNF{PiFC% ݷ^BWМ`Ҹ+?j/x]nZ"; ~]^kAo4ś$^B"epX+1i-y]%hJHobl'iZ!u0}ϳZ96hV lGUz 'i4wRdq|=UB^TjMwj\5K}zT|wnדu@+ͶVF~5?OUrg3| md'OqYz:;0_+׿N>g4.D~@-%VIQ+ Q/z E=?KF3@u)}(iQKN|n΋)2eAܑٖ<;rBo:z[Q_E3jO[E-B9AW,el1J x 觪XK+?;XŅpw% Ŧ@^ZJS1r C]BOg%G%?蓡h6|oۅBg μ2Z tu.g caO˔v@_8^[?;|e@oqp[/zzJո|!a C+)E#ZN A+>rulO^Ca]XŸмsV Div9vE۷tl#Iͥ{ O ZX:DōczY~go;AC>y/kLB뚘}yUӌ%a_Xˈz-V-fcwG߁*u@ٗXK.٭Wߵ|gmƒ-R{vߚZiEc}sq\ՠ;8K.pi`NEoe]%5-ۖ&M To_BSլ/egQg~  K6c"E+,uf yZ/xZlƨ`kypk^n| ڐ{V ~+P$MS|veֵqIA>!u˳39=)wXHgڏ|zbep}ozvwvzl/?YVeXՁ5f%^q{{Sb4+}&7qé(b/\bO˂ZYwX*Vw٥0*}gvv*M\7G~IYqIa}POLgߡ'?7;ͶE-An w{hf>^yLvB=J7GH%f^o3`we!,1wnXP*gz[N:t!Ē/^$Aʘ߱׏ݛ:GMap.vhP.gχ}y?\W}!ݾ[Ƙa"Zc1*x!1,ؽ/Gev s*v OgA;7 N8ȩàgjcg2]s[@<|E"^ԠYZ1̷y9.t+@NSEN]e@3f9ߋнC{ve_RHvw^SHƍr ' dU `~">c|@戀}BG5+j7Ng>%hjZ$`Un zsA^VX 7`B Vth-}~K#̫끜Cvy1:R%[z+6T`hEd0왺)'$ZKГ}#5FGIЇp Un¸?v6}=~}7JKuS҇fBOV;Z8K2*IK0Akf~{Teh7׈m۪Ġ/L?gml =0:8 }/q^?=wf[3^ݮ^\ tEJ$}C/5h0?mZ܉S2S&H7$gZț$Fgi^$y5>݉$FDoh>"G^MBoנ /otk7P]gGo僔Z?dy?Xer Uyݰ4`b.Nr; ի` G(tuF ̀.EHjvدQI}\2h-FWnn{coq@o^N:iS^L^] ;\ rtmLo[n:^d~[IkBWjt:*zc_֝8EJ%0 {~-m]ˣiy)G_3ONz"ץh^кi}-[W˥%@Y=brt*?3t-=P:W@z]|=H끜H*DowKVw>y5ϻpE8{"X-\vaБNs++2ollQM 4>o)oh@yCot#E>+ )atW@1:3^֬ 9 A^Cm~ԑ\@Qs /bZQ>g(w!5Oi4mŘ^~ ?Z.1\ꂑ\PzZ }ޫ]DKtaB-TҺH}@+bWl#ˉ:dC6b y?r& 'nfG94! =c 5t4"E^ $Xj-74>3oę[c3O:SV^3ZвF`%g@fUG]rF:3ܒFЍE63WhЇ$NڻҪmё" >@̤Wf/^ʃq 9[Zs "rC -f\KI,S_| A5WuA#eNu`Po5Az˴k4 "T~oeQqQ # >NX]$gU~i 1=ےvړϡ?ތT]jL^ ,ފWMS,-֘Ok:Lں. ]#M e DnL{/+e!?E8JS8%t2^4bbuDžNNh=g 7*n_T}Bq}XMކo~Լ%E>}S{zn1J/CO:~N[=ϜSjBF-]/UՈm'ɟHa|OG:G_3's(M{Wl&rwbh._W_棹MvѴ|ӥu>anmjh@>SlO v@ ѷDD"ҋ4=^G.v#`U㽿"E}m 9z'qޯDGy .8eT:|s Qb-r w[&k^h Es)-&ǵ+dr܈95n9.y'޷9-kX2nO }RVWa^t:0_Ё7l]ɢZځxQ۷sg[npxFeiRlb-jSEխ;]$/]y7"\}-oj'M:+үNөO۲J%zRKK ]"JCF/p[b9 &.S!зbo'"02r3#Z\@/eM/0/T@7遼]-#+ rm9TwNu5z\=?إ0tmyFp&\1K .cWc^#:҉s@r1"Sewo-VL] w~ؓi)W;Fs #RϽkxԀV5;Ww9$K7awC@nW+I{/IϩK:EJZ\cQ|y(Iz c]ArJ#zYz}kFݳS=SP}c2FLm/mZ6@yXG]EqDW2\mIkaYVkK˘-3CIs^:-^)zoSgymtDqAag' "Vm]~B0n^c^5(EzDg>Vav-{tұt[ C0t%Ug:;:ONzHG²i, Q2bn-ZQrWs =UYjZ+rdR8/r {Qy= GݳXKSw}FuQ]COdQ+FfMV9ГH MFozCԌ`j[M %]=wy@n}sFz#]l̟H"?#Qz]Vڋyu}RLΑ3*rx/R_(x*ezԒ3e}=:kX 7fi)F.С-Nb7mFD(_A]\3tc.6 G3ƸAN^Bnqx=t.Ϻ{b/M"3s208%WЪK^DC?Г=od(qPP/#Cߌ\~˪Bg#/Db'me` mD>|>h*+!WtY@M% ;ͥ>#)(Uѹ?73 J@7yF$sCw9eA73+EF)'>[Gfyь^B|H/+Z|+e0j:g:w .Cϙ\w-˨;uM]fB^={/{1NH^"aԫb(=7hNQK]{7`f*~ okֆ<+wB;ۅN'M(jr oe)M 9Trq?*J^uA3С7zK5H޹5JÒnHCҵէ[ep㥷zB{60P쒴?"z:u^L,G%/0|乧Eu$BW򨒉d2+'*)-:rlChxy#` g^ǁ]4gǑ )ȥtѦ~F@&# !@@A i bꠕQLj#Zij涫 g\䌖:4q;t)hFuSx"n'r[tcjt>>?Ӽ?N!LԻ&d=5uo4䤱nJԠ=RGu.xrzKuNR6aaTh@N=6lf,m}o=\;GŞL\@>M/WuGڒ>D/nRv {T*`.B;<5UuH9#rf|B}o|F /A *nT-i5otd7i_^7.zRֈTA/:o?wÅNK/H\1V[ |w56ǥ4dw1q2sA74ٮƖzAW>b n۵/l+7 ?Q^aa{?ǥAzeJTr2|;\͝ ܑ8GxɁ(W7h'|0dZZcls5&:_v_yLŦL%3^(գ]WqLŸ}q7;[<3Zzs#(:;7kOEAIz %|ފشuHf\3ZP%VF\ʐeEzS/r5%m'@^.Bdgt7ԃ^"7ZUzֱgw4Q^3X"C/9'˝"rK+ xs G%?!@{z>+ tqdDW:]m0Tбektܠwuv聾FF ė}J"ϡ[y}e|čnw,=T[FN"c&Ǩa LZ胼.{L||B.cTZ{>ȷ>=e4t%,A3/[/~g\pٞ28tHfLNv[i`h1ޖA`3uF`yw9oZ;riT!] mN;HNKm]֑|AOYZ-ii`X 1z'bd p|!DՐe"apO} _f\ zE'{$0hkԑlKf7J=ԫ7謑lj<`jͮyװ}Uwkֽ b:3(3]AKxw V=lP^2{u߭ {EMf-][ѽш s;Ϛ(LKVeF݃-)ڠ큈$E5Gz;ދf@+Io7z̺Ȑ.$TrUȇN'ǐY%G [ڸ-z1ǵ(7yr^"[yt3{zNꄡt$x:)c ]NLoh&'}ˀVf53a | TFGb)1}oCv뾬xYa yiKt^ty?ГRn؊ T0Q*l1ap$4 @PkTFK{3њK!'`J^|ȨGw^#%`tmbWh-;qA.2tg Ow}Q5zȺbvui}kCOGG҃%=kg遼]^2;`FC7ɶgE`ȏhun6itYh/ o#OG+GH\/:zr@o[&;_|I ;:eq;0Z*hj o|DXubt;؛i9rpGE.t"J|^Z_2 d15g!_.{[YbOL"Mvε76r uh9haRnv.:ט lZ+IHA^ W,utIZ^`$^2\LZ-j/r'd .=ۗ/= $3.Oi[GёE:/tTwVwq";ɍ)Řz u \VčIZ(ihIL`@DOۭ} \?gNkϻ>zmJ@o6.Njwz׋tۆ}/6]ShŮ7K!-K\sԂ 5;})I~K _Eτ;;/)00@rƸRҔJcJe1sT C׺=kؽ:R/r f'tw$]}N}`5keiwKN 3C;]rZIt7`ʒ:<3|v [-.:$@`rS} ?ȷ`z 9Ѩ-tGo l`VNރbKwY@zW;BhDN0ݟR܀5~z$"9QwUeAC .ȶQLӚ ,֠꽟g=Y^~m%as}q#zvK,Z%^?0+b*i>"ीd$z1[=;8K;4J.̃^j ewbwznOIB\*9Sy7>uAky EГ (.:jOrwG :{)'v[ itUuUu:?}w~X=HG37c`$ uj'\n^v?.Q>})1l_tM^"؇f諧K yΥ}>ҔٻUvq/ƚ| 2(37v}t5h:ʁ< OtH4GY;נqgIq@]ho /d>tlnzg"6h=bt G O Bx z(#} Eq oq|.o b km sAe1R?зd3lWm12^z&^@/Zy<]. ;#[3-邗gPFct@x>Co˱N lWӪ6EzOO=lnv>/wkЍ<jygATwa']F't >g[4sdޣuT+:GXfm c.sw<\b# ib<-xHWBL|/=S_0I'<@ Y+PG;[46vFv5sׁ"_U`2Uvʀ&ֱ|vqB0Ɛc˦P5* %EB$ji$IcM􃜲X`Zv[fTh^Z"߼*кgJGręb Qk%ZA{=%"n-%)>i!.9t&%+/QzLZP{RbK>|nDqqs53!/fzl\06ܥJ-pW41އN!Z3^ZJ#[Q__K39lz~4?R*H@qRMގd-]& VSY^dž-,a7YB;`F|CKv2 {[ mԴ2ߧZ?2_z E9Ќ9-UJCFN)m |i硏EOk@n~^/udCo.iKO>ボb2].i|ˀ"ʵeЁץ^3uf:<ǚBO`pk|}_:Oݭ~@e' = N%X0N zr/̗ ÊF8z"Fs:z >ȷ"avIZ#E ZJM?)Q-0ݫxGgM꙽<$m.F WZ/{50r[֡K#CxJQcK*kfF.Q`3r!D.~'LR.Q ߶Xԡ׽9YZB{K[/ yM"tK_tb:ڍo?u>ڰ%:tffhm嗮us)СvBץH]^ԭ_Kh֒Xr9Qݼ*hI#Չo,Ũ;C iH^g"ľGTs%f/3U4LZ*/,)>R۳Mi z[uY'AI6@_u\-~鋞.ˋ$9R'VV \~CON ]nKtI4z{]$nG&SI>ujwBުANowëkd~3~򽥮آ[N_w,ޫrIL+1Nitt˦379s:rI7C"1rLMt@ZFu+!X̺S>}~S,܁.|B[X7O}ЩN% ޡzc` "h vnj@>b uvU9xK ud4 }]$\~yt~ޮK$A^C/ zYzp"a3xEzh74{nt.v&B|@@I 6nzt _vY}g stߧPG>/py`Ǒ'~mNMw+[-M仝^+~~@keI3uEs. ŏrD7X^6G {OړRg _0zYE67)߰c^gW3 /vqH1Q!uϔ$^Y /6׈耮" qz A$q`9c =X#/2GT{3jXE[p2TG?݃Lkv1f5I+]HKތЄF"uKîoY.=#mySUȭƞn;su][/i So1qELhC qӚݳіB?-l\ܘөdgw'ĕI AH-;vr8t\9^D7[ր;vEfa/r l8 !_/ z.MVhc1=8/~G@ry-nֆJ6n.iJy"|FkpG\-/9+Z\9u!|W +2y^WЎL$) FٻƤЭ(mYm "UKBc\-d`+ODuYF}TlvOiB]G>G.ҬЌӒgN"$-ꁮ|[@;-|#ѝM/º3++y4.C-o^ڠG҈l@7C9GstbݐV^@+6`[N۾S tezvQ 0"G׆REqgGX\7\frBV/KJ3뉗xMlLOh|)~ҡFMW${~-d@TƉ=嚯,tSLUF #D`bb^3}s_&įd2v@b6 3P?J.A =3^H5 ѭ2u'Bc(ziyrz a;yS:ϡYA;6_ A_uin>at냼)9&T$W.2 E0B4.5%}%8 0p'T4F@f j ;b2OuiWKd@^]^I뵟g/z z>G==ƃ<-<8xȣzcT> )%W:QԾL<-.FfcEfpVnxyU==v-"h*2tEgk؏䈱ϩR0lԕj Lt" tڞR 4{ rc P~s8J.Iĺ"qCީsI9R11xϜ+¥[E9ؑS᭒R3Ib&C3yy- QyRH]BOY}\#jƀ>uY   -e$K&e#;-xp[^]{e Lt[.^}@w_zj뽑s^gA˘:\hާN7ֱ/w#;:v9J#W/btwq]JA..}N%^Kuvh;μE|"\նe(.tI݋ηvH9uYvR__h뼗:&e!T{-bW9cza5}fj?%ub4y. ``oחdԻ1}^e v")DeDJUh$- t+/t?n_*vErq- dKg%Ev)/ J`eAE aFMs@\wp0HN-cy5nU#_=(v@u@ХƬMǙ'?8rΠåˉ<=nISψd@?G.d9v 3"Ǻ MJO--tҽ5dF-q'7J~ȥtA9ZfD=e=t7EnR:0tۅ]6sݭjȂ#":݅S:\EMiB޻!أc#UFn|ݷ.vh7sQ#eg j"|/kfݖ?[rѬ퀑[F.t UhC3'ZUYe u6r}z wrL{o8\K/{d:uyDc,A qKWsN{mzt@g:]|TAnkpdȑ.t~=o8:/2:NJFˀN`_B+k;3I.郡I $|7#cG ZVG2wyD#  (Q 3ցOgpfzmyy,t-8ne6It`)Y^XUbF n`>ȳ @)9 JK:hqU_<3 ʨ\BFDJ9z!ݻHHfJ62hsfvM^, E} 2"\ .:gu#.2 YQ8QrqŠURHZEޢy̤^=^1oYv+9(EY>/S 3K%m'PcCFN]x}}gTיoGfuyw`4:O=ޢri(!C{3[COz{zrТM*1Qn ch*`Mxs%/d(r4oG} q"o~"O4.6]wGI[\7ݵp@whӑb_$mF7ֳ_3W'A^4_g3|t;RAN5gujܑӱS/E:Kz.H2WR]nmi>ps3`q%ôIjͽ\n)R]8:i4- ;3[p2K \B'ͦQ?עu@hv] tAy FU9KκȉRAnWgFB׆ =E7>׌yJHu.DAיq^99sw7Z ){5MI-jzyͻ 9\n52ElE3\㈁ 9;ڞ8m ?:/úSX[GyV̿2Lh@[4:Cz?TuF_(F@? ]pYwKw~4/567na鈡yFtK:y/}&Wryutv cb* н.t̅rޝɘTNsJd]X&-J\Ŭ0^w[] ;=ͱQ耩xܡ$UmjRTDG[v/ifk>{sj䌜zj_O8pk1q+Ax056=RSϽc* 7iKDrTYy@P`Ғ4xnA(=2WUh^#-]Ш5p qIX.{A ڑmF[-7BBP{t@ŪɟcJwyCQ#[ԡ\=]]sya&/ryH/5ӮLk!`=/wh3~Pcnzё uyHgO08bHFAr; z!)_ːAs0Hp@c櫘^RycɰZ8g_tw XCN⣤M\ߣ%DNzj/jnt`U>k d,硏ǂZPk_hjZ5S#xbnz'rWԡ{yzlTd^K4֠mXhb\lw@3{|6WtTp\G-F_NtF#+^\ 8^1~KIyMyaO>@Lh]\|%x vI o`K`3\VzÞ|2Ѐ!w=#=]Rys$o[1k亾D,:OǢgEP6ft lNpw\?QnMo1)Ņ^#yn6?uLmT3 xSbձf>k.q{,vI]pO]?FQ!N㾯miwsD/rB/l{@1<*AG[vI]Io2܋T}utb ŔΔjv@rfP^kӮDODcg-+1+sَClVw٘m[>$haa0 %9Sg; "xe" 'rԣZ[i@H;aYfrT,^zc.EFZ9{+Il~f&I [uP=EVlـ"juj d;O}{yCv Ч>zd]؛$5}߫DAM!3;߰z̎$#_fIЕg-|KC8)Ȟ eY4QɬANQ[G143|},T6.%r[ʫs=c,/GG4c[^u [:%یE@W`sD |-~Μd]1l>gbt//4=l@ja>:k^<놝Ku;|轞¬BEil;*KFw\"7\M ^^$;bP.Rl4]|;pjb7 @"ߪA.()R/5k 豋o D s\U8-tr3W9¼L\NRF2Y >>@|K@{Egl) ߦȃ6? r$[;BW[ݡOlD[ِ~zE YͽgņMѽ<ݲ [bc{x-@kY R113C`\xAՋBhӛj>gsfNu RwT%vscKH{`Du3^Fꊁ:uB#-ҝ@N1/rOIh[y*0n.J_ L.'k.`f_+_J\.MrH'd߶Ens8_PCN.-c^U隴,jгQZ%#G9Α?cZt>5-R{e)X^y2Qy-nY=y 9/+epIq^ϙ[Dz/xkػ5T;Z[#X;R'+m= t-9p)zB%3L2_.K${:ݽ:輋ƍ7z$/ vu``hoȽ.ZmzZLZuv VZXޠ]|I <Mk@}Mk8SC^ZI x_U@Լ6ow/ﵮ_ï{ ydt6umb㋱Eλtg>K0tq$r9Gs-m!h =3e dWǀJW&g˜t F${`/^=q:EjV֙8%tG&m;jZ|\ nmz#z"_BO`iV#/JCSF_qnQ١B']HZ>c4-t ȹ:w!] $qxشb- "Ȫ=oOKp_)nHvL94*}L~EfvY]n#J:9OP됃|T,A#<{QzBeH. Kto<w1A.2dw[g^@_#"OX$ L乔o(6b]Na6gIӥ*/W `9]0֕ЫWJ'֑$`/tH'@ם)Au ={6+i>mK%>wXc .ȵߕB@e##ㅼNGFm3Cv7y_&dŐ4{Go)2Sge 5V>Ey]jEنx^F-^7k0|y:z~`_t0 {z_|@ڑ]}ƗarۛzS*{ 6⥹8m96BVb#2~pݠ_$\\T6L&纚]*ttt sz3m)_=kl. xA_S_JJ5t|РgqKVkG~HkvoDF&Ө=[/d:usFِϬ%'G ݓ:ʮ߽big0!/5 '_W说nuKA3Z$kaNLSկ#\]7ro/ h5yF[|Nخ/bB绚&ѯ/)1r E5]"W yw+;hWwCK+,}AٗzR|wÎwl䌭@|>b5S]#madA>ݨE"IC;^syǜ;F񌻯: ]JgE޳C7cf 9y@YVh[ݖnC'A)ezӖ]Wl}_yCTj!hlσ-{GN`F:=ɢ8 AZdJٙ'kdОd\<ؓ 캁&?ι*rkwݙ7h5Vޝ.鞧0q|F7r[JB󤪎ܗjݠ?P.1}=:w־5F*/xM&yȫ,=B%wwnx[\Z7{HZ(Ӎ|>qʣ6Cō\tvM4L~ N\B'|?iہܨ tUTk\tRށ8 {[Zl~Prv u+N2gطƺm\><t?wdD=Q.z)_krt9s> őW4 y_{M4#P&-зW뿂k荼Zr/wy(~yR5 3{\\uC7BYǤȹTLY:7r{]o=^Qq+rςl]5>Etew;}FEܥ6͑Qh}=#B'-gѠflg}."F.L9ҺzIi|CE?Gd ]Ik^O葉.Ѥ-KwVhEZj*QQR\"a^4!t3hBB.)rhˎ\"f9jAv;ǁ : ,zE4Зj Z4Bхe vq{~ WϭW%#\qj#. yà+i;N24l y)ӣ<ߑPZp,^:)%w^ ;mZL MeCNq]Z]nagzG.=] QFtsu o̗>Sx(3J63:.6ޅK_R#ڠ;FE\(ߪ]4joFyNґQ#ِӒ3ȏr(=ǣfݵ*yBץ@T:o#]2m}cnݫ 1/ݷ2h6mC~/CE~-"FD!w}m7c~4\tD.I\C•FR놻siDy{{COu} \w }zJ^5h x=FES:VF-h\Dh7iYlGNѭqI#䐮lgNѥƐky%xڐKt(CD]b0Qݽx1]Vk&.g utlk+{x=]Rdatj^dxFuY's;J+!]k6\MobsF.a<Յw|maW#z?jtre9s $I뺡uc猒h 6ֺAHb=`d)r9u@WuZvw]Gƒ6azyQhu"`Jo5"ە'zq}(A\53-tU MfoD>-O,.:\]_Voر7v]$]Hx7]X3ȯVh^|4ݕF|IGPT'v#G}Mze=HMOcޗJ!d;܂c`PHtFur7},Os r)ntsFTR?g8%dblyEFohkA*ںe9e2[nllF Y"%RƎgF6W@z;â|=K#%l5UL?mK駣hB1xcc1=:kj+L5kz[FнQ딑Bszujcؼl%dwem̸\V |bQ\:[k=9ݼhcC~20Jvo^ 3r$7+ۥ1#ms3v]G(jnϟUaH"Z|f[龃^LU2]0Jm׌0mgp wi E$;zxU=ҟVϳz.u+)y-FrgZ0/oh !ns5FVNz6K$=}cGul}\`N_399Cw>m>VcL#U;;q:[ 9qu:2j;PaM\:J*6){u#%4V:'JVh i9ؠ"30[n$˺͒Vz&~x#Fc@EN%O=:+#56*%~ dy_Gm.] TKCWqVvULv=4G%eouWP @Zj /t^4ҕ'`C|_WN'Jo;Z/I2QN%w*O u ^O %OF[/GYC5B ~@d FTkr%hZ?e*@k F_tCϠͿ-Y!;yl8#aKB`u-"wd_09r 煾.v"t7Lg}7b16eo? O[ȱc-$U1o5|^ZE+e8=_Ś+(#{s9Am.Z([Nz:%>!aKzREP]'ٴo2AW$5 ?/c]*,!|]GԠ-4AMы;zr.8E_`>!C'}/ iG^z&3ْ͐:-V Ƅtd9>B\D|g=VKrNNW賝DkBf Jp]>)AI`#NWzc:4Xv^NtũV t2G}_؀/z=j#܋M ~IJ\\E'{1剤_g`)r㓽3&pqmQO }'z#Cгez߼&ȵlnko@׃ZJ]t[9ד~Ɔ>YYyxujgRzUֲz>3pоs]:\'\ zY^6[D/ǧ6~N0+fBpǜsKJ Ea 6ʱeAEϥr`mz/J|zCv @3}m;, ['h=N "7: A~?١%N2zm¾J%3xEHC 's+=.x, G-]Zx[ a'=GUB}:tUBcҕ_YhFE,a3}m:t'~׵ ms?A}CZ.j|嵃Zb)dУxSK;gg@9=Łj*UШaL_v|/ֿ_"X\?L&'p3$T]/IqzMS{ "r ϓe }$К>< ~AI/!+xG{V>5l?ϴF!FNp틾R1T/x]B_eZT!R5B@o =9SCAyQ*RINΒF֥}z v 7 ]Oq8]'odm[Ud% Q33-OzΒ - 5ؔ>%FZ\ctݹhe=B/Ј}/4?2|€ ~%+s|}dBO!Yfāh%Z }z^;+Mr47}'l"} -a sd?4p2_n T~*AoL 6qlןȝ|·] 7^^COik|-qb?,c-/ @'8= 'g7)VlX?]3KyK~dߤJS1PIe4M_VSl&?L_B͎2^jvo aDlT%Iρ } L ZQciCEp }XhQ_*ĥ3剒B,e8E'\{?,mJ 2(}|_Ao2$ut;͈vhqNzdhYu_}#gJ~`5HCC/1I) ~oB4dt>ϯ5K歐α$hWz'zޏŹ1yR%h.}NRߗOac}&:txDlce{^=)ttQ9D~NjNF?m_/}=N~)Q\GgU)|j ttz%`@fD/ ='<&D\J\1wĶly?Џ. ='bo.vt~E)v>|8A|.> ?OMgI~8蓡-KSDZGJg@q~TyO6LghӯK/$}ʝscp?R9qoK{ڼނ8?rMv_`?g55KOr/^gֿs-zpC%P+A0.vߐeo=1z'ɞU!+mm֊Qy-SH컲bMאKwbE6}?יG Jwh~9}6;/VDV"dqS}9b\|G6dh/?!l@މ;x]Ei`c7۪* .z@T2LF~eI|ϼ'+i*_G.fh_&#Ih. 3ceaO=@/6:Akzub0Kr>r%BNX\!CK~3|KA/I#*. ^Zoa{>:ޗ*Тde|L99Or뒤@ϡRzҲ}ƖG -]@%n][h0O ~HDNx+7Ig/-8 ~C za8sz@%aH懋1>7N_kNzLp-_ j`-r3gUi3b( O% | o}#Or3NGє3{oqu>TZ)|bC߇aj?&Nt/zr&6K*֟AOϵ@A*(ДKKx M :A ;JCn)/@:ATYSTE 3hJ<7_-:/ }sl PI~! 3;zN"^u o ʊ-pU|Eg #8=d9_n]Rwͣ>LAPk{*lϮ`Xx_>#A;, q鯔˷ }7n1k44$ =`DlyMyxm 5K\@~HR>B?kqRA/ K2g5u [o\K,eꚌ|+Q  o?i kZꌕ\|J"#I/5(c\N9 uk# MU\x|R#ĩBI*C#<"*rH{Yʡ)ERnt`_8V}6G~y Roh<_*v1 GKG^2}7h~KBݠ;#x_%f7 K+/eY$ad"_ZlY[`s i|^7h]__rzTlA4- ɧ$ <")Ư@ |8/l>ɹ̏:e^) zU W\˟xȫ_V_KroA+$!K{DUj8Cr Z[xd溊]Ҡ ]Or5Hq8˕{CT2chuB*h\΢C oLfz_ݥ2G/uZ Swmp}R-OceN6_٬/IǽY@rM- |йx];jk7~C:yBmJPWpj7;5c&a7Y o4 }g?jvfbn=яZK#R=>X?MYe4,bGF=SYА9Ґ銔ڄջ0ۀM M*ЂDҾx):#5ǧ sBK@\1z.{~yĶ2\umOoc c&=Sm)*S Κbgƴ&ϥG=:pep(Ja-si)VrJz?;&0sF_  l\ӓy3LBvgM_{#Fδؾ^M<>PQVڟy3q.}Rq9ZiWL 2S.WH3={躒+!w]:?ig~lP8%^VmBGRVAU0<*eETJq >>) -_D׮o[N?3cBo cG˶ZH Bˍso^]"oКU=Y^S/V]~/s\Wv_) VfuƮf@ =L}VmӪv <˴{z`{:kzq4ܠl[p|z6OZ%HL[zrmS]r6=9{Sm kfz(l}F5B z #ts;Uˆ\BGl;topSA/3clvevj-6V$"'& ,T. mfC.@:&E!)}Cu]n35:niqeC/% GEs7=Jc1@F{>G7rҸf.P.;vY?3Ed2ֵwhli}C.Da {yBOUAl!o̻!D`I1z_tXҊ(3z!GI[D4z.Tx+!+]g[ʍb]b;id2kܹݯcLuI9w=%_[C>b/C*Ql.*68iWyǛ7t \e\1($iKc><0żme:N'39#=7Qqdp#8 (~~)%KҠG];6hL]-˨˿_nȳ[qRY :G9XۆAG\wiXM[3^ C/4z~.,P*9Z4RY[b]9(͐zsňKEDoxz/54kxF="{Þ;3(EjB{G rG]v#wrKT4/ X[kI=˩T:3gTQ9SnaFW֜t(4ᬆΨ'3V(RGV1 ؃@AZS⁼W3S#[n9E9v# VKU&z@/׼/Ҏ!S5woM#\ׯSh_uh Iňzv@"W 5B WCν8eO:K ~HGFʐJhGbsZZh_2vK\txXlJ 50mȎ>ƚ_K%3 &KׁخH^#Nm'towmx)S#u)G>Ͼ$zz65d Yn-0~^uμq@C3եM4긂K4 ŷK>]Fڐk,;Xg Gء,"54 je^Ct4ץQMdnWҗ A`stCok PtJvڋQfף*rpd}V#]wXj^Ȩ1t 2_km`SFA"^ ~?R TaHACXͣ436C:6D19bwHw#9cjyF~`b NA.X>+R DLvAg^[*9}XyDҼۺ>b#ͫ7.5LKe-{ENCevdw.!ꄝ }>'ר`oz'lzz:y쐾7NzP|F&@q-,\Jv9F|oc pG/V݅b;4rmedp)Т &d;|0:fM:?ZvNEo uu8..T)#7^oq#'n2 9l,yq^aȅM J04u:ֱŘچqy,ҍUb/ y7X~^vhJгYenB.\qaZOstI4l~k~K_Xp8 hC;vvQ_<vs Fg?G%0!%I׮%I%`0h%`Nؑu9xTdF9噚 v]7vw% i}]|s ]ࢹةjc f7tJo*?_zy`9 )r *3H r`$b٠Pc>ȁq9E5 :0N }rvO/|ѷRa'So5Q>d@4]‘{MhŞKې 8ݑ8I]Gk L.;HIt;̺F"jՖH/q^Cz[L>-T91W Jƍ/ʆu^k;!:DKeݠu^x ϻiw 76ދ |FG&&hWnTg]5w9 z8*$˛FM_}ŠӮ/5HR3`| UxD2C8zlLF˄>BHi!Q_jh96LL/]OW@PFt('0יvwHhP|iîν8z!]>fo ;0K0vflF;/"6 P}9[ߐ|%fI5(:mL+Кiq#orw%hQ&x}#ȯT`?K:tkRbW Zdhɑ" }F^}7J@ۜٔta y;z@Jn3'J\c2̬;F]/mwtC3A>w$Eiy ~ГbR(]uo5#ڠo_IFeh6]eTaVz-4qU]N pv]rnp4=Vlz9FVv褱&Y/a+$ݥ(tr#h41zueċ4{O=OI<0.:vrԐ7_I,ǣ;;w)$S%dw! Gzk/ݍ\w))#uİ,O'C۴ ?c|;zp-R^X"Vob76յ뒐 Mm|>ғCtidqIEdm)EF>+͝;r йn-y:ؐS!*7 = 1R١|Nȁm[ٺ6okekt,&# :0q*^?-]چ\JMvO큫wZ\cB|-٩;zj`]- = =;zi7r#*EЄ]ݥ-HRr}4nYwߢ-̒{vy@ KYޑK-JRs_Nm:;\>х6.zy.r*mk:['Q"X]/je : 9/)ލ>S(ͯBV6 ̙ tN3m6C礦rط-|HzIM^|VtKz/QHt 4I 5k IJ{=/u.F|>"IW_E~ޖHm(iߍNjl =i#OgHYy@VNvt=ړTD`rFUaHݠ_Y6ASGW)}=o1ߍ)m.!:/5/2SP#{|1( }9U~E.K4bu]׵: ґ:Eb ݑK<.ա=|Vk*i/ l4M:tS4;uP e-si?҉xC>K o-J]SF>_TF6,;7ʡ n/%50Lvlj1pc:g!֑0Dm{8,]T<Ɔ<~:}) F'JXB SPh%/4=^n=0E^{"O7)ݡeSWHZ ,k.}tlR'%TJ܍4כntf/MJo> aGotC8oDK[j9#)Qiz>AȚ+YOh ,+ Qʎ.uШy~rK]woTb2:,IitYzoKR>tِ\(zm*bdn.-/d)rS 30S}"qtǎo ?][S]%3#\70T3ؘ{"pn 'kefJ/UI&Yip4&L[JJ>%}YȠBʐhZ;qhM˨] N]0ԣD/)W:a  15^Ї1>"Y9dϦݠ{DbIEv*ނ塧HVwr4oKe, rEV 6'K yOB}+ȁUk;LnA+4UGܮVi~T\ѥ\kV|ɓd,М^U/t!ȑ:yxCrv Zc^Z`#:vU}ni-A$;TR͖~Tx:"Hc$cci4=l^r;rnsM@ۍ#;/9n4ّPݱR93GgL]ţQI2|8 =G}[zJMn_Hrnw~$+t_@~U.ISB`-< &97xM2`,f [#yKPqG }G$Q4?D Aﳑi>7яz^"}Up5dj_zp|CW"rS7>C"֕mo-'"_wgB.3E7mSªF# Y~O틾5VÁ= 3x~dھA!M$1m;jiC9ӳ7(=+AC=/n -D:~O>Ƭǔ7w@Zfs[reɊ &VǦLgB(ѻOgfpR* <ѺJآ!5ޮzP7KTؾ{M*<<֑3[OOՀ~F+_#o|z)ʐ/TD*A[) uaoMӏ/r˲Nꡢf56HľjN);Z~T[Q X[e:); ¯$-Ȗ״|g^jG(.[O)CP f3D_^ :=;898g#2r7l1azL=@ }TeҲ Aoꋱsa;yS'A ; R2L.>ԙ ,B^/mVFpbGKPfIWa/tvv@mqA7qzv]2hqCY>( {mZ|S^GՓ&z{|hOkLqv42hR օW/N S~:-b֧Q͑8+EE~`x ۝˖ OE~J*x=~!چy߸@y+ǭtï~яHptcm<2tIyŠ/<`ޕ U6%F.=_#1۔:#B?b3@#] ޢwv߃f'ojp "cLLkQRS >L6O{S9EO,?ӛ˲,%!7 asz F}ltzL6+ڭb+>;hԠ,_دwtzjmT_j=QA6ϣH~} omun<,~u]iDp4_"MG*q&ȔO?r&xO/K 5qΛo曛a_4Xy֩xY 1V `=`}ĎZl yy_ymMƴ/=ZhvduاG7Z˺/! r8q._u^ 蜮#%֮+mzމ|*lE,W|Th֨|ѧ~=8k4Bt#d]y/@n^rʣ_[=\S{?溧z^uϊW裛$LKe 8?69rFXx5C"u[ ';!#7f_^oK{ Bx#'n] 6:]\nI1-_\ykEҖ{LgR֐4Wf>zP}U@q kxD`%& =\I[d`B:~x;vz^|/kߗ:n$%#m~L+!IM=;t!yޖRu T{fٯ$88r DBl4W*^Dȡ~1^uE^r'E~Ӱ7#s{TK\ǽYee"az捏 =XuLkiKE nlEZpjdqNqros3|Vmrn6>_7bE?L?n&x~?99;]Ö 6)uT\DH AfBپ{ɶtF DF@賨SuB?U4J&3Iri=P_uխm`C/_St {GzƱe6F~Ni~#[Dw+mqkJ&49):OSfEM7F#\lQ@T/Y)ie~ Ĵ˭"ղ˻}Ώ¾55ݖ짨[\c!B;ˎ< B+p7 gv:)&; Pzynm~Aly^6wTl>6נ᥆V_]lUlrGEW=A֠=\{p֟YE<m9\Ѕܢ>?Oz3OW\U*C/d5XCK1+mwf~ntڙ]L{B9JѱE EAj";/tSSMF\Ǡ,PP[R]CsoV6dv.vS]+X@qaqrW>_mC~se)o[,y#,Š{[F3^b m"܍ܼuڼb6٠ˡkj<I }Iȏ8ޣ%CڂˏؓLn sV7ېH.,"х*m)Ϫk#S\ꩉ >bّ4=k:a茑Zk"bߡ򶚺@Fcu.5.|B3\876ײ{ܥ".ҥN=Q\KߠF=:j&[}BFI\[C =j#I{ҡ7Dw䗠;ye)}#o׉,U6HuTF2Hd,<3yn;ksi׍=B-;/݋S]y/*cr15o ĥ:e%MGMմ ͉KOWx#GY5yN,h+,R1Lnט \BeC.2:8R~C3e9ݥ\T rAˑQA z&zD=r$7Ɍؑ1[7r v,|#9/1rcb9bӎ\Gp+Ea4]K6詮Aw9Q.$3Zw3M(d[wuZGcs=6ѐ] W`,g`s}Qd%≝/I+L~Ν6y݅ 9,\H HWFYzkrbKݳ.dSU\L]Ջ\G/1ҳu#n 5pm.L+ =^*l M{!ytpἼSXLCE+o?+h\b[*/:u o-݊楠s!'ZA<ң?th-G\".g|<ѵ./HVU$^]/=/dCPx>m]?qޑR%1"fmCkեԂufk.KޒctCo/^z/Fpl/q"ڡZ754_WIw!uY/G-t2REYt$ɀV06"cQK6g63D.mIIt*ٍ~zfà.wWOrԱ#(t0rGkރR8r@'^,}efe䨮c]jm͗#hQZ{ ߎ3$VuR8;m @=[_.o7JLG׍]b+gvQk1'a C}y=ZˤO @%;L9ʭ=/9*ɯEvۊ2vH~t[ww]a&Ya<]/1F蠮u+M*E}V%v`Z/M;*w $ǘJlKAOu3N ,Jc!+II.=4}n4/jѪS9S/5Z؁-Ki{7ȉXjxlxu ^1dsBku`";d Oy/.ήBRHF[k#м^EI'H|O}"xZNRF~Y'}e}L[#_y2_腐cKy.59Nj۟ǘ{YbUސ_y('JrC&ATCl9<\Y1Zz7{\K-~SFݠKcC^=Z^ ]fhfGzD*ULW\0ruhѵ3?G Wj}Kwkd!G*_mzAu0..M#i/Xu-1H94k4{"/|GvՑN!q&ȥͭnHĖȄNSs .t'S:~Z 7tEL߮u^OF/_#E&vF\S{:A_dvͅ: F6^_E rBokx~˹f.G71zE~\=UCo1N\^ȳ&lF:W۠s`@dr8 ]KA0z0 z;d)Ahې_"Un~(w8Cu >62]rV-)C쒚maauhwZ }mӌJ6n4?Smwac`/.vb>`5 z_;47߼['9nàGmy"ϼK^#C-(yn>ϦѩeYTSw0e:]L2;3F/.(Zi߭>1G*1/E4c_bME0QFG>誏{uy]Ǝ\; @To>Q #&}Q tLK:W`ٺEJ%IT:tgS#Lie7F`5hvWH*rιW庸#P.J#w+4QJw^ X`mYu%$IQoVՙ 2r9/ l>>w*r( M }hdF.i#:_C?:OѺI%F+e5T>&m /^Bܠ:Vh~^h7Wh,LҎ< 0 f\F]d#d^,mcF04"7n# -/|`wKzpmnxy.z;,a+1?#"da.-`s<fآ]d[eCNE,괽|r:zWl7meHJ/>dcŖy׺q ߘ>w ԟqJ;-"ݡkJM0{o9_.=QZjď!']#F.qut>=uXjg@<Ƨ[F*.t.k\dѱdAXOCh\.r5{6ڗ*I4`D{/1pJZg=\=3@G!u#' q=8o=: ,\9Edk9@!o<)z'q R,ȱ[?֝e@zȗ0Yz4G]軴#OOա%Hbʅ @ofyAumyy/7[ o~!}e]6I:Q~7{ %M9zCF_ %Z8Қ7KUjF~E]ؠ i"]v%)%ruȻ]iuRz>!t[CKҠ y=]_:h z[i47w?FO+:3 )UTwvU#9heߡE0l|K2BK\_b_ܳ6|a_;.]IZX ǀ 2y"_^F&f T6znzL@vٹϰ>bBJ Fbz:XtZMt]<`]Q?C[LeKPjtQOȯ }+4ny֗w|DK',3u,Aچ\U.\pGnDCycِSd]F>6/nsd~Eb/@#Ӿo#ߠ4)PwYjVZ^"nUkȍ#,Io3]SA"zQ#V?Si2tW9?p4p# ]=.9oYA3[n@-X{ːrM*k 4v=I`2d's~Jok/z][ .r':rC R^Dyҋ]e]9b7^lރH*GelwIVEVQQ)Zzr!xCnƴNzZ')8feD[LBxCw9Wrn.)a_g ,\=H H*J?Ŕ0r"ލN1v:cLS٭>?T ݬ%9.nU,/0KڐFn3 &gj;*W5*%TNJmsYe $R::K[NyS~mh #[}Dq }k%[ҞdOT&X #r>]n>AHin=̑zj̈́/KFN^Qvܖ1*[$;\jE *Y xV7i۠Ҭ;wq3nu$g-zz`yA kֽQրV!u7rY& #/DbИFƓİ9eAQunt] .̇/} I# ^Bod6WZGȂ6Я>EJu;녭am٠h7%ԠO#?D y2.#/kUFAw3ߞ5:FQ}#f`v8zѫ 7IdC1 蜉WrƸިХ 1J6:B.Jݠ_dFs=2*\# :qlg8;7+UnVo$t'eB7YyMf"]oD1zCM~ >6ϖΘ/OoкMuCޖNEӵ/1, ^ױ_> Z!콣zL3-zZ֑/錇mTǞcp&7$`ԑGsCZzF>6 { ydk;Dv[\;gf.񎒋#k3/-ELLrmd⚽enuՀN:a(d8O"/dཝe"sw(|zJCZ=C[L9-On 6[mGafR^=y?VbG7躎|I'&AFKVjHpC+Wإ x^=䃱]`za6;A4'qԫ/]57rK0tIj}C+yU-6g] Mq7t^i}'z#d Ot.~ATF]{+ú:lCN2p-3Io'2K?2CK-7rCv"YHSUf+ȅ4#z#'s|idm+C zEE#. AE8z^$ngԸ3ZXkP ~t!VwI1a<6Š^T@ϖK!E>2,^)LZN%Jh)!7tk<|Y]9}`B7UyCS'FNFW*/'Z{{M25Vdݾ60=MM=֏ MUgPJv l~pk([JU DNtid0i- Sڒnk:#xUy_[銽@S }|_hVw{eFv4y~\kx2ϕz.4E^n,;As=ٗOZZ7KkL-DY}C7\'@o0{IQWŖ*YEQR/\ ]wm@oS<(-H̄V,_`]7wu`\Cn%'.XW^=YOިm풧/ %A+ї!&t;OS'z׏bndԐd:R#}|}ސT[tF;slԏd<u5*Ow!l E7 AOHznӱC: 9UiStҶwbzߋ=]# z1|:Hרv@0*J}hfR xϐ_Qc~ae`iKp"л-;ϙtvYGF!n(0vehORȉǜc4gU߽.:<P$tŔJfH' =;ޠ%O4G>]ˆ>u,|A 90s6bhEv躠f);o݋jȬ}C~GA.Uw{i>J^hFn;alh5Nmvu.,[h^Ɯٻc]Zȥ7p mJN EeϔȭEZ$^]U^V駤>.r+> =^d4Wy#rYrgmѠBeG7gK6ouyȳ~"`4.\7CQ5$WyK3s#dfbO䢎5ŸE2a/8֡Fvrt>%7k;vH9{_Nw`0HWBKƠ49d͌.E=apu|Ikwp<^AOEtCq2HV`k|4rB;B4i47F¢q^,FْD;u;rvONd Qf]ЫƬS"n KF[B~ 1cIچF VQk~AT'AokԠI;[6\#w/SwT3RK%>Wqjq\Q ЃiN\jCgzK;ůMy%{l8ڡϗK A2B] Nkichsw'|KoȉԈ+ycc"LT|OdS,:'Lų{ z'@nax#SC_Ig)2d8D;e2{#>|!KMq_Wehz%*/^Q[e-s7$K{k']G}^ںWshd:DC䋺.i,eA1t/N?WpKvHo5Z/ص|Kv9چ4?bwӏ=- n:B*9XK;)V۽(v&zckE9gu )l/41h7ej ryG~I` 9ӧD}M8f%B=7nDF׿?ٔ~D:EJ1+r EVz /䴾Qcf׽rA_J=旿NEBcE=YƳ"JIs[.ݠ%*b2&i`L+PcdVcԤЩT6T5۵@ڠ-Go}v{Ҡ'uր7[0SKvTt #qgNTJtdTReZf"f}d{,_O T7a# 8fRڡ)-)BjT+kN4;6ˋv*%,$r ztOO {-H8ub̖(!y/Y1MT:;I7{z35Ȍ.<}g%$ αn̗wt`R~IB[R Y8A/zly ~(s\g zR_u3kh_lȎ|M;49} ]m@5h٢HkL&h1׆&IS\)ros@n:t^@o2pezZCۖ;#\7vpt\\EuG:z~Ѷb>[Zr /Ѝ9ra;cۧq:hQx.7"ɺ# t+Zr46p!dE|><ߢmy\VS7`wY\('7t˴^*o :Ȁ=Y7r 9¾Dq#y t捌]Bm1A?4 k{ă"ɲzASO:O=^!{("'x`Tnk/^Gd.dTp#';XjAOV*.YpVM{{"њ gp uB21ѹ?-3ͭůhPv )P~`[:j_sxu9'UwKӝlR\2/z_umA/y8(@^g(*UDbSp]ʥMIEnm7*cAEj_beTk􅼆$V7ސ_׊Q/rRwFl2D )rlE;t 2Ef0=j@gK% H}B9o);vx9^mż+Ѵn.*rlv*S Y7[FЊ#E;9pSـ_㣒D.*7Q-B ufWfz8 _EŦzrݏ^J(08J\o+#'\H#G&z=JCnFE6)A'A˪#i9 n{퐐K-KZvҠOd2@@ Ы5t7r%]&) 7!ƗF]0X:AGOuqEI6:~RA#o;3':zЃ],9׭uOy$oK tkde ԑ+}簋Ztha :qյ_xlq,t\ckݡ_&Xat0 6C% MvӤ&_#SݒsC hU>.gh ם:ЩNk*}-NKOծ\<'G}i۰=/="͋ /|S:u䳱.<=þҭ\>/-BDr^mNqӅ(׎7RGLӤYo"Ԩi/ !kջ+v`7-qNgBCv6}E?^&+~YgNz6mrgG#M#Ka%P!KFQ0 Af.ĘMRԿ-G=/<25}Ϡu .Uti&D$:zclR9ZF*I |/ ސ{F4A6[ G+B: Vtӥ;ܡ0{]7r^BUc>4Pp|S͝SyHZ>؃*5A֯Uo+_8FV4I`{.{?%X uaޠϢhŵ#70t#ɭ^.t=q.SIkȇ:\ T]$;~x w Sې+*c7ktv& ׌KKbۧy䊼&C~Yr_o-Hd14>uz9 /5!##_p#} A/c^"莭Ge_kJsT_"sUt {;h±Ok7L"^.{~/S 9AXۙkSw"o91<켁ˉW 9SYG㩿a8֧x*+If̍=gbfa E5J'Kj yM a"{>$eT_, zS[qG1ZͯqSAV7lj2vg#eHfYxvlc*reݠF'O{{39 |*ۚxrOZ .=lSF>ȟQ@3/\F \8bCRZ%1iA5rJ _ +$u:Sݰ8YA|҆"afbrtt$#ߤNmCKI_x1i/en ~F1#+i~2Ξt!RtPr9!WgxA;Ktm;v-{77F^弐@G"wZTIŶQYukV 1X gZ\F0_)zMcoȔ#eڐP/!e"6r*שNgs~PO 7BdУ]%4Ep_C eӏURJo藹i?8kGi2c/hξ;C6snc+=Ey=@IN3ns"'! %f'cN֭KC)Ќ BxC~96{ʫˎ\Q:J`tY 5lO9&ʮ60%KA @mЪdeC>aݭ[|.:94֌~u_ [fwF.1Х'W>yqC}?ltA2eIcGO[=dQUkvZۨ)I|4ީ o[\d'‰$#{G-ϖK{{s_}9T&JǴ;YBLZR-,jbg,ɅEyͩ*B~IǫIkOTQ 'LLEJ7 R9/xJ>%Dwi&$z?թ<77-0 {[TAKG}BnUyE‡A@joa+8͹k]΋{G捶v8UΘ(6\m=c-uCnW`_4?̖ëJE^uCa.M \D:Zz.IáYR'r}niuC! z ܛߑ\4K=]FL 8ܘ/#ѯ`+K2U*>'jz3m^=ɴM.U=jK{{4/n)0ޤޑ#|]&Y8_N 't]"\1ڙ/o/΂\$.~& #Df;Lk.Le/CSy)g}zI}lAC*'u b`Gqhri2II t hOUn >}8k^6^1 8I tJ`!=tiߕwDhvԲ!h/)]o)ve- zJw sȯ 0㺉s/q$1C˦ϒvGkG~"M7bo`WhNzd\ЗP [_tZ]UjJtU/'Mou4[|b<.q0A1mICh\IDkNȭ,z>([: z[f; {~ԹnGLFgo`=M˦3]z-k;4#i0ْV f~-K5c4W@B.=]iԺn#}^çyvl<^! t3^MZ{1䍣?{4H4]K^:6l`z[+ z6Z>c/j"^]:^J;t\lwZyl/nپӜģUYW\#?/p=0> 3tǮbӅ |{:xNܢӘqCmV/ʲ$tڐzJcsѳ{#ce:6>c;ytu.tG65d jG1hT!a-^ ]`Ӏib.Ѭ N&B -BF;v`D}H 0V8>_㡑2qp|}q+A~3&吹;ޭ͑u|OSQf#CW; u\_6o54w9ƴ!ֱIF{9)0-X5+-eOkC7J9umгS_"ۃBi't[zcr=_۔KHkBW-Ҡe \7WgT*@ynk+S!Jd;AHƎBi9gѨ֯;R5Qd<-`JA<|;63iN󀣾+%^)-ovfBIrnQ$42>}m8 6sr+~b/ŝ 9^05Jp;\(t{K|%em$TIF/RBΖrCZ{SRvzfۨ@PYǬ.NOi #ӧ3.rO}y{^ld[S˨{-7u<%39Ssoad8dY]ž: 9׍Fg3"w\(;vHv{%-IB&^GЍ:ʁsI 5B7w2o-wN&n5-Kؼ4N yV7wA^}BoQl&{/ J+V _4.@_Aʬ^}IT[ϻr1-$*C'ZCS8e:E[ނ),9Bn]RV95F HOr+.` zn) z[ARdy:_iFB~tkȭsM~miKTOEq%^^!=ޫZ6.6@oz}2HySK|Z[|#1Η;r5o:rBFފA_r 0,xUMڵ!:H_/E>ō9*.$z =nvtF~ ;2jNJ^m_ Lv;rjci^o=_4K,F6Hв#Dy-j]Pݐ-q\7q-6OZhNeo׈1$u@tQvk`2N!0'XLȩ~$7GޕbۃK43>=k/s$1tԾaבghصY"J)Ձ)ݐGs> ƠaTޑ4ڐcQ;vA_&ҳa'OW=V!̜:>9ltpgt[D&bKbNۈEyC>"]Tm@/af%qDڮEn@C VۑvFNU7Eȷ?Kߐb9 m muTmm ]:'2Os)Doɓ7h *9hTd U4><ȓrVC{[,w)l&BTKuz|q `n>ep<:煊nk<&[W]%VSj4qpEl/%iRh5#ļs(8䓍FKǠc+ruk{T*t]l+E*%0~uWvnp1Ft>EƧ n$kt:4TCЭHFB~;auh+Jc!]~u՞g]宕pJWugŕRȥ7𤢗Y)YrB^NN\9p_B@A_4˿a҅lճ - -a`do5ޠG ֚[K- Zw-WvQFdIG^}#oApٚC>כFXz9߂7ud1r?_=]EGD~.FF_ eۮda= )[7KE l"[`[ZّQҡOM2 = a럠ף3c3EYѽ[#;. 7RG抺ꆜɅ+4߲=-T#huT.:w ްW5)r]RϠCKˆ|٤cNry%oz#F#4uT(}~^qkJ%t@+/}^C`#Ֆˢx/MZCkWh;=q+}ݩOفEn@/y7kŽxiPBqOԠ ^i1)@N`]thnҿ:e]p+F/=4#Fԛ"lJb~#S ݯߡu]پгGסGjԆ|9ι/.rbw>ʆzhGc2miX$ .1wB| =u-GCT |$ 3uP(_AI%^G] ho.:CKGKOS~9']\X7hT*h5s `m}-a.Ntt{;Br[#ęNJcTvKg|HA GK^7ti#Q'iKkaj8R|DoGFہICw xIxY>Oԙ/ڏ6ߐS9(MW ztaf̴:^s'fGb+ {: PBȘa4>šD>>`v:eүţ|tCOI}/"tn9B/A}}Q?K i}y[oiƦx#JZ[nmْMgڐ+&b Mzk(S/7]%wk#'[@Tw#fu^Z6S#/Tdt<=qܨ| t)Bm{+Mϖ{]Li 1iX ;}Ti\=;7r1hzzs=ǹ^VkL 4wIjKÂz *9Y89ļ.- ݳyt#[1X7 yw)O7eD 21Cmqc^)nh zOvAIЩZH/#Z#%v:#g|Orv y]*W$Dн@/{"KB7jjCf @svZ SzAV+(sL]kXtCC>F _&Tɞ"aH% ^ھ 9?{tiѾ"tzTVf3-֡kj?D_JJxx ]ְ2] OkރԎDС=mP~K-WIko}/By q*1L2 2,A^r{#ݓ^?RrLcar2j7%^U쑖Q{i?aKyQH/-)-eFzA/yB' Qv`n<; 5m9m|, kX C+JԈ~$|̳$_'N iSdN~?_7Ioϼ%(зx̎l7hƲ }GfI X=%>yWU~ģQհYk_!aS#BlfsA‘#͛~ zG &ޏSL2lQ~ľUBQ~zȔMj 32 }x^q+\ 8MUG=V)rW8rhp௲^:h.Y+JAM8m c+qKJ^蓡=9У]St y\ϬIڡ-׹a >όu<Oݛ'xO+ .~WTn?h\H"6'gzi?[ҏlނ&κ ]%%ѯܙʨ<1R 2&_Ӈ@aU:=\tR8kKh"qn:@w@?ǁ;mVyw1=OH9B=沂~ъ/x_Rb zћGڔEkΫ } [!W$dSPc+Q_끭VfWғ"_=2zF RP]"hۗĒO}Z샼xP16MWGb]ǸYO-{}Z}Jp ^m੷G,eQ7IO#w/׆|_lh3)/xu8b#-t(/} mzE^N_T(n@3T>h -aȏeSlyOֻ.IM{0e7lK?ѷ\Qhg%7غk t* vʸliWJ^9MMi#Ki_- r`b?ƃ3 )JW~s6R|:e"/z[\K5:_Rv=́C-20pCO2l]&T,7=hҕySY*@=h8joVG5X/Z!h˯C{55,+ ̛!$#'(6q.A7yJMVRP*l7`—p`C #?fymR=Aq0WdyuSqn#X~e}.p/ؗ|`6b+,KGn7trmbWaIRЪ._WbdPH (e/K|iA vSRGu %n~ }z};YC(QI@:q-_-$YFLgkܼ6?~50:G2I*pX>|^ mlk|T8Q^r[HE"~W[]_7x,\ ?Z_۔?ylJ*Cyq9bBVN3Y`Jz˃gڷ'&0 ,c*䌏Gmh`?F^y-E+uyһ4F% 1JTէ|}nx}_#*[yM1* ,k/a24Fi>;NgpDS2N#_gV,ds2G5V{X֜\i,o৚@hvdY$vB.j_~XHQcykl=[& +?BOWH|{dp*^;0zNܖ'# ͨ eO)ue@?] v;mN)~yI=$C}ϯFYߡ%*Z*8{ۯIheN2G{>T /wIU~>[zkȧ(OJ-[(y|C5>m願2K \ĕ)>{E96l#AZO65W|NZ9C;k_g>! {z!CD7}spA_~_ X&w Q`[ ՀmV!?B/pBԣĩM^ZyVlU׿Г]U6~oqNhB RZ3pXr^[NNoS&hhG}2Y$/П&Y=ze#ő[ dE䧖^C&_@!j^krq3bnM |ku hvA%>_M^ 2J (im_TVyaOkRniZ,ZQz:׸rE+>kS:jKi %6fh0k8Qǿ խ\"D}gx8l矡?OYn\Z?}%u_i圎_='vh<͠KQ(˨0 [s@f1G]ܭ#3%O/tQ3vAyEq9={)8@f@w5o=|>o@W =_%M#-g=i*^ y3$adiLhqٞ-=B {NY6@=y獗ߖ-aGeuCQ%žc, _,I/|]zrMEogNY8h/©]$Uw.=)*hYĂ|7._AOJEZ%2Z2^Rsl?Ŵ|M4Q┈}eh=_㨧޾=hҧ=2x*_5O!E$N +B>b[rjm,u^tY:2gq.7OviyJțSk@oP+حKT-wYsB T>[54O.pHl yBX9!Le1I7~.2qA%OK6܏qb^q\$Mo۪UVFG~$N}:GB$7(I8.S:#'  uhEub1յ`[|gЧyƈ=cFGX8ΥwhM}E~Y.B{%vushdpYz]KL Po')M?D ~ _oK+?CcĩG5fDO5;Ce{eIwY5>3ri|2FC+< g ^ ,SC̠~Y.\u6KB**xj?8JN>bc>5Lj?8E;4Er0BO)Gx%ǯFkcW|rw{TZ?ǥ6Nq>a[\Y xsY|FHy'FqF |;*GȚM?w,tLux{ [)(SǠKz4j`[g }\qocaE |&;&_\o'z O^Ӽϡ7.>n.cKDu?sͦl=,/~7)o)bs x?<<p/AK1ɥޟ9K<ܡ&?p4>.VmVIh\?I9)e]2=WlS 1-ԑg,`;J_cVRBs 8g3r$-kA a5wtl8)I7|Pm6e.N{]r1cĹÞh9+Kˮ?Y?2+rS~F4 7q6ɥzBTD{p\a@cigL!/U~ Nar<YߦZ yV7Л\lZ;!3@FoْK012B&qICeL,9N.g1zNm4Ipr=.G]8}={4Ԡ;|ϗv>Gh&F._fnBw!YW#V746䋉8#G~e񽰷CsZ+%$lMɞV#J,{B$}J1L0v2Ҧȧ9'ې \vq辣Nl 6J3mT aDG~!n'8S+(֕K90z!%L"B-ChxMQ-l3Rr|ccp$q6u)CΌLAϓŸ{OoЯnaO6bETMfnK^ϷѬF#-}qnڙ.@{"p)hPI-˻AOЯű+FQj;՗.@Ş)/4T=VO}'.1YϋKͰG:6c_:rWX6*gWlh){/ߎ-/94rM7^ "J%Sa;­H7_>ݍ9J 9Js=wb旐Em#KDZTw!ֲ!;J֫m9'ҤοKH%/nIg@+_Uz4GkǞVzW'r]rqVBv$=B~ cO^ @|`T>)׼)Z6}5Kz^s` ǒ7h\N/TّKGאXUdrCǧ ='KGtwtz.ȕ8u> r8rQOp?t Ֆ:nM6mѤ8wTK7fEdO)eCtz, +Cv{-r./TRON-.cXQôQ+x{T_" ӾAګؔ"_i䔕f34EVcحL$tCϢA>ԥچG@jxd%=b}0}+=%cq')SB{$~)c˒zj)2tIybw:ݱUg?ԗdy K#mgKO7h B[/>\u/%̆F*KB^/1C2}.!A^"[ k4DZ8GqS:.|GneOè؊i 4SF!#5G.;˚I۵CwcSبv4/`7]> ܸ\.M7t 29";vw5.$gb=o/M\.1: M/g¤}J Y$r5Iچ7tYS+? ]]PcIi\=w5df'F>lIE>>:GBfI=-0xʏ!?x=&=]: C=?s b.73}S(kn/MmsI:^$1tW~C%oX z߈I7m-. {Roj䘷l3!H?6:Ow5ܘ/Eɓy^弋 AoX~yO#zOZzۍUF:0r*oCNR!Wsf֎.eˋN"WD̼\f$tUʎb]ڱ[8MR JpD=njA/f;'MCf_=/ޑSٲӰ u3<-.hǞeOk wDZ}.EPǖ-;aOܖЂei .dSSrF ꀒˍ|Ҽ-R=Q/t>XOԳ ,T#~!쒸~?]`e#ygLVW5lţ\ ]ôk [< B& Zp} }5O/=ޡK4aU"|!hҝGT|E> ^Q @zM,C mȧnz`[:\!M5l{Sʡ -2W3qpș6W(CE[cԩ ]wW]:{t*2!˲P0V6AӢq\<ك{ީS, Zf9}b.b3lyau<vY/ -Ps 2Ej 6h2S-^PS y *݀ܡ׌d\h/+ɲ4b AGy덣(1.? % t =a̦A]ڼE0'hd)/jIe~DG{O3l3EݲO-j0,u^ 9yc6]5#YvOiuK!C= KO]ESB~N nmCk tEtG~ثF'3}t=.{.iu.mIZ Ks!?g/à3mC.$}`OtI_:"o|bu8j$;cp_Ro|"o)z0Ʊc!$?m4?̮:u#ͷA'1N':!6賺;1|M}G~*11vI9[7ILTzU_bhheuV|QNItnQ`ZhO_NC.58̅,7>WWn8pHZ1A H2iHBˏׅj'5flR3[9s7;wN>,MzڮI`k׻NW%vB _#ZDr!!=q$l(4tɽEiA.J(9ӈepao8 9b'H/\}7S7afozarU5<:nBȼ\OO Pߑ{5{)~NcA^%M9|OnЗ} 摟;&ʛR zj, /^ϋu7nlȼtT$ʷNW$ruM9jiJy~Qмȏ"$oξtK^Fן[!{u&'Jd@W\?c?Y#he"Wڛ/%K*#`Ng8;2nbwǎ?vAo+H20#%/=bk.EL2hlK5 n, zAJޭ+~nZ%1$ XհzjbOz[e.3뎽ti rzݠ˺0 z()Gn/tI8؁*-f7LZC,E&#_tQx =EI9$Ey  Ȇ~5e+TSL<󯡣:IA=طykxf%x;^c7tXRn4I `>2yļۼg=c]g&x6$/V?RCjzGδ8CcEAJ ] S3u=ǽJ CkdSIU zRfEt+E {emi]ALnP[Rx/'oZt+nKkx7Y̫Pbh|V!S2KAki21GxzRB>Kؠ)j$ ۆ@F%Em7ħv/A"*5X'.G S֗G% Gc"Cǥ8[=x@wz4udzq@>o3Ačv}қSwBGp]/p"~G+:iTF3"jl5 Q[]4ߌuh΋_5؍r.r2ۍ~^:kHRS3ٽsҜ Xy',0f#0tYM[xH{7Dԙt]U Reba겺FVRۭȀ=t<&y\::}$ՙ^6o\Zҳ)tOz|6(:q@w Eo\geK)O=uƾC^i*4g ijѥD*!ZW#DG_AO~:4Msd.9T1ua zlf%Vƛ4Ak8 &{W.9U~tr[&7ٯK3G ya@+zނ^ف|D8왽\)}q 7 z]Fm@_^tѓ.ecw\ˤvi)c7D]3ٽX&ly#q\u{^6q8\ϫ/He^sݫҨ↼h5o*CYtkƌ4/\wh+ۀ3$ z]<]QjՁozIqв pA? [*olFxJ] :Oo/C_ 9Q'?"aV}齿ԑkiWޡs7a{ yuёodv/IQS44SB|5 918J=}f}e"$]7O^mb^ȳ}G~3 -A)q !XfժukSuˍ;risz.z`Ė ұKib -),RwptO/bОI۹{zb ZS߸f~>~aocծK׷(BxB35G}S6GМdC~%#oZِKPim "տ8ϸ3~([uwg\rW}rkuyEDCShJW~A'j!Iܯ6T {Q ͩCz%֦'ӹrt7y 3IfT9(]wA0Gv{3\=9U %m4bb7C AEl20YbVVѢ ֐izHfpl?/W~%YR't^2D]݋ya}欎ںFN^zYJ'p^ń \mxQDuVIԼ\<'pJEC |JߝHX$djpM+J%}avFWh`>݅nlh)uN/t`_8*/8([vKA gbE2hZT~9JL"3Q&]w-sBePg]9ѵlIވT:\S ,l*!1۹SW_pg͹ s"bBaˢLk[E,6ڍN,ZN31/i Ե"y>˺L-0tYEeG p!t 7z.-y TʋZFd\ׅE>%^c3cdgdC^_K@B/c#Ǹ) KrOaW-ЗxyL0_ʣ4b6SwKz<$`ܪ.:\aU^AG(DS\i>md ]rtG|/OhbnGN`v?/Ġ?1pI绊>3;w%ؑTp.ygʼn#5NFhT?ȉZ:vrFgXSF^RCs.Zwm.%mlЉbWǢnn9קK_<-Ɂ}=fLGn̺.W3j>x@ GldGHhlГ鋌}#c< 7=$@L_γo@~oKxIC1&t֑wyjxwlQ z]WAoYY3lƢwxK^w^cBnBр#)3W7x?вѫ4^%嘵 tmeCn?Inl qt#W/tUcl!K-QsVwەtshZA<3ɏ+qis} |lKSJOu)ϐ]ZmK`3rt;qh2 9 |̐ц|,Y#5/;r] jAg=Dٷ0pt :$QYmQ= <#<}&Gt^9tdW7^]eaAB :G_׏a&W B<Wx=oUޕ^S+ 4[ޞ|t㰹UP@~2Cvh6",KàB~/Jvs$]Đr0h}=+h z::hYwvIY#;?seOzru*]BR)"!<#^z]YN)9r u@ZcRX;k٩5r%#KrLR!JZ2$6d֫yBoK\\#l]]m<[[,ջz&ݓv"?04LQѯ`/P x]9`֢.;X褻ۺU@"f\QBge~Ɩl|\3d/Q:kne.!ݢy>Å/FOfnĬ - }"ןo!FI y&0qs.7Ӈ?F%.#V]PGzN]:LI?q .hkНDXza5nc~LIޡUww{Evu/9dz] +^Hj++l4ƫ<`gp!atط8;/7F@S^i|`?F>ըRS,EFa\wrtTW+CuZuQ gqA? ;r;4:^3G8 fQx) cPx(I-]f MKpAZ}ܕ&@ %Xtsʸ? )zBK\(]ri֣;[P7VԉI"̀1uӓ%u?"`ZݵNT1-ݢ1#Uh>KuJW+hJw' XB5.uރ+BJ/N_X ,5vGCFߘR{|#(;K5v:AK1\bo7Dm1 F 26阌ǎ]H.F2nϮzT k#;~yw8F Hk89;eaB;nZªdFc=wJ}@vн5jFh5-3a7h>T}ޡǪJ=40rL'Aw^cЮ7԰řIvN3 i?Ҥmt#\6t3kګA_ {4.qU)nS&S6v)/.rY Ahtv-޾7],~!טx[Z t y 3=^:HL@ga !hL놽ł,cFy_jLȍ4Sciv ]P2{= {y{)؋7zAcZ|=j\d^<{y Uwyd~$bj62.ٳ ֜f\JtȄdQ} w)qm 1ApHgp!A.{mOੋǚDYݑGR}+>uH[3uh/oY]{k]ֱ؆JCgynkd|ϐ%}䎼Q3dOg=$`6/d%R\'=# :Yl=8us"&@-ґQ,:ztnSRh%U$B~N.V[.C~J{ y[B_kntyzJ'ito~I_Jtulthc{znYluvRBm.Wv@o4^WQ)%6ciwN{~*˅<ǥ"k4咗ksX buC~עȁ|u ]P3)4VVTb)d(hSہ= ';]hD.\;|~`"0|7(ܕtxlѶI2tx~n 䎑nwz5Ƽ![ w,vZY7,cN<"1ޠ7W38ZsuQ>`?%[׳4{DE ֠B$5v VƆa0 =2B;tFzbNE#y =M7a:_%x]S` 0 ӠWƚ늽,%4]#"?-S/qp_*6r*clG馧hj\IpҖt%hҶDNe]З5aȱy\izG ӫA7ui`]6nS]{A_s* }l_(љt!#gڍkbt D9h,L3ZRB}@V:wr'4]A{<~<Ia_F=Їl_'v]-w'89F?B0qtA_i ( 9͐"ّغiriE @udbST>2dΑȑ%XoꄽrdwALDFz#m֐iTRX|>1G7d[z 4 ݐS8wp.yL ?;E[%ߪ'x*)Q-o aHcت@.%܅685 n)(9c&k4Q;jP/;/T2v_!#'^SWz[=7wKFew! Q//g8pT\ [_u!?W mtiPʹB_!?[e/5B#Kץl5H;DqF"h@IJao1}qU#B!hgi$qȾZCk4K󰆼.)R5OѴ zD0alwf=Ÿ/W.RCO<~ьroFNK~=|P 2/q/↘Z3ەc+m+ga7/s!iGF# ͠ltwtIβK_5Β0BgX*ȏ5ސO4F 9\j${;]w3c$]#n>Lžйzu`787:^ -7')t%׋Y7*g"]Rn38 \Kt^ڠ=9wmCӍ8vnrt$:oק?IWm5;efNu7espMOy٤  =Egڱρ슬$嵝u] |޻a jL,!IŒSl꯷ŏa|o@`9Ȝ:/Y+K0˯h5BA(ftiONk\u-]~d ۠frYFY\6џwClhX͛+#w~+Tߔx⠠1v73` 8~fػ˾BIj1Nd^cB |g c-+YwE% +z`lRi=9U`/Ct|8yE.xgpKlzz IfgE&cqN-9b،P`~!_)5| hSkfA <Z~ f9e5m:!6K[ o4{ƽh϶ d9y1k J=GzT-RסR*kv[CR-pMeќ,?_ *f]ƌ]UGU0~xCidZ8?o(AEß;Cw>&B97mP2w]AB?B~;+޻?dgXnJ]G*ؒF7$"8w癣 <Io>0:a0K2:r~9l/kF ]S~A.r#d/S꒒dmCqRԣ=*$Mhrm{\-y*6%I!gC3f `ϹKc my W|8}Yaz%4x\ H_}HȔ׺⍷su*P ޏhRH?By}F.ozQp~8+fԁK g̬\.n~'а: ޯ$0Bϩ&`}oѱ`Kh9K ~F8%lAC' +9}NK`kȵ^sYҡO'HV3\:6T5lN?#@% Q!/ HVfzo~z Js8"vfu7 [^+tY+{b߄>_:mCw%Ow1On#}o3{tY꣧:o=ױsͳBLؐg58kyΝ';zXҖJ#j]WZ/B6Y>[SlrPHgї$s9O:|vДۇۏCJFGNQj q|y%qƒh,U%YRa^1@b6a7q>3W]2::BdmG;zZ~?g3YE+u\ $Oз5rvghW 9e{?JbovIpf=*j\6|NJx=t/˯Na4cYEah|^%ʇ㜝ЦT͓ȱfni,5? -}/. 9ҷ/S4/4])*5u.;zƐ-o=:R\;tؖӗzwޟ?S+US[rׄOtMtΎ2TGO8Ȏ~*tI)鑱2eJztV7zWi;܆:Xiy?[d :L9-2ů>";NI"H-{@$@W6Vx3, "/.ny\e@w@Z :#8aM H[w#,NЍ/QW?h\#G< ̇`=3@mZ4zU=sNmC&ysaQ4)7'-i݅[0]? =? SggCוᴆ-JaY?ݾB~ܱw:џ6B|O>"g ]3^nBTԃU^OJìN4dRsU ;x Π\m4܆[E~f'h/JpwpID#)kwZ^BCkzΐ>/x>{asC|nkz|mf Dx߭@gfrؾ265wͳu5kӷh J ~rpTZ:9[&o1' lc ^c?_}kSi|/1dZIO_Fڒ;Z|5c*W>Og}k!C: -@f|R*$ zf,EGɖq9_JhȞZ`IȖ?d-?ԀkL!'l35 QjA=+DZ, 9l?:k Z召CÏ)jAs'hlUDFo9ҟU!P|Gp<ĦqZ^Y4e0 /xw_R,Zs_~}`ƇS8Uq\[0} lO xVTsl]hQa>y׸'N*uIOykM~Mw}x=qno~ȳ=ⴐޠ>Ҫ 9W7!iPJv% {-_O==T,$ b9 .1f) E#I֯lP=em;tכ9%,wˑ='r~&0tBXj\><V>Ű'qk.-?k,f!w^|[7ة,YoNm$Bwf3 _DFlF9!$_~oa:t{Zrs1 -t^š7̟RR+nF7xErC7*4KT_=JEX_O%B0Kq>.'bi?yNcWm ^]xY*6Y1qdz-BkdT. Ķw24gU{7l3!:(H }x*#=Niȡr|>xVH蚔Kt6x |mv 6=V@6=wƽ@'5;gOK`U գ]C2ϺA/I7SH 2}ٞ`?a{4$Y^Рۖ܊y8NlܸiU)Ao,r}_kVrLzZfֳtow(guQ?˪we#Y,@u,<>ҠSr /+\OGqz*g@u;~F?Ŗö=~ Ch<>cmyIcĶ4Zq9=4Ke]Gxw'SbY߱zP#X?I+bеxq=_s7.zVVrY+4^Ƈ#NϙL%lu$.O+WfgFjWq@y=;>s}Hhց{Az:OdWT)\0еI֌:7 E)8#yc˙pRBoc,rmϓT9,!Gՠ,#O5Um%p<~~1loԭ>Y2-ߐFmʏGXR#:%YZ9;w$)O?<Š:Ϝx>@ނ=@/k}k}fW,ŀ-) g F]@=w:C+WIm^ziz|K?W2BPd8SXCo 7xZ˖g*b&F}\R<Uл$-a6h$omzeKZ-5gxAIlu?m (žrS *|$FoKw\9Y}VqrG׌nSxڿ@&YCWb#Iz7NXI^~5S_-N`G^<:E}oiq9'&~AÍ?|TMܳno)B~LyzVZG$Kw9O&I(hTzo_Q {ʐҐ!<ے~u-C\9'ӢiD7x]30%הf-ͳ2y#i]%Ɏ^B įA˹;T'751|y |X>LԐi[}KnܔUs/4Ԫm?u:0HvW*xߖ139~5plоMz !ySĘg3ѧdլ bkaɇKԡlq@MY<6~߾S:j@_CM4Ao>}GS.jF?U2ҊK{ O,OuȋhzדhLo2d3 Z̀WMӾs^s:vN+1_9<ÙG7Tя~!XaSq\d`@>LMgA$\?='qvC;=efjiouM$o~Y~7[IgmBo?KEόqMO\+?WN>u˜-lb8v@XGN=(]?}%8-m0ہ'&'[o>*!hle)BʌX7}] [;O47ddfYѭ[_#W#+,~SL:4^O=yvYLXƝCgfޢgb\ r!o!.TqoN@Nk697H!% -O Aoq2;Td%Іџ[BA*1IK6Dþc> 5R%4h&n4rzq9Kպ[5n tt_7zO;in9<ƽA^8v04}qHh!7Yyth$asCe:b˳Xľ~ zzlqϰ/W^U\hFџ&ܱW ~<ZNuz#baSeـ!XN6M5}=}U1Ơۭ>| yП F벒[D)&؋ʫInkXIMz?s]+-U} &v;2<{.|MuT\򁞃E?}gBpc,8a*:Uȹ2BW>"_}j7hɀk̟/f~y[٩o?x`7t]})BoU=M@FnXf^mvFh|GdBRw?Rs=ܙ B?֡$g~]~t9YO!@_ե&}BY48|8NjYX?r"ƣmiA.ne;xY堺 |YzT$bp8NS >Ϊ|x;q@Q ,L0[oT3}*z^lMȍGd\]v:tfO~*i'}?՟̥p/˷^I']레#7LxS8Zg ?{_8̿?_%F>SP}   ۼ m%0Z2MȕxFߢÿNмOֱo|P$AQz+w?SȵH+;2',[tpJ#>l8Sbscw#' y6SF/qk/nB'h} Y|y0~H9|2MsKg,ҁ]䤇l!l%@~VUb[#+b[i 7vq֠W6kkz@K^,q}wK. їK#WA^1@>*-3EM]Hܐ|_?]evF }YnӽuO)S;j=lztd-Xck]j&g xrqU`s+Aʜ ;Β^+%u?bDʸ[*H?\O9#Cx "U3n4ظe- %Yw"2%zOod%쁾;3 (-ʧsrxG7Po-&J =ZT2||SsK¦$)ymtx y_:* jٻzԯؤB#wJ>PK/陱!kc~DY{1ؽ !3C> -cDzV.u ނ^?5G>ץb|{Xb 3~_I¬JeY}}~eI,6՗ϥE#3I'>qښ2ч8o.2cjlzi}]C "9e\9,G{!bo#)7s<7xfJ(蚊>sO%K'y=E9[~CzUd-lI.Eq1U3k*y? }N|_n✺ w5gcT[{w_(Vq~zaRS} N vrDŃ$=4̏־i>BCq |nVlT}`-e3y, kؾZ2˱(:ưϝŷ`"tZ ^㠖W\.΢f&er]Z먓AJBN֠&@O%(:e?⼲t@ ued\*rr6dhҐS=(ު~dGVmiF?VM2:16>LږazC*f*l4,z -X[/#菱WbdE{Yw>?ց-=Wu*ikeeL?x|)zwqe>QGAݫ\rk[.EoI WT ^#J x~Fפ@q{?:\1[+`ڠ'B2 nh:w)39NxR!U]ȓ/W~;Oȉ|]DFi yN| ?oP)Aե&FQ@Mw)bOz$S a^ЩG zѷ_г_` h,o2):v[U&rikCw+ _Ukhoۯ VP{=WDzoBQHQ}BTL֡7* ymL nz Ǥ恼N@yLôRҰtZ~拽רцcV+t%w ^(T In6ұ ;p V-Ǘ9V2?]|yb oQRd=Fveޡ2Ĩ yJհ/7\ȉn42F뭭ؘf !Q;nsE|fX6.rҗWp+ r!'짏sh~:'tKRFnr^~I&qST|m.Q>jDOWcOx~I!IzHFПg&'r ZY4~ь# >dPn#<%Z|'d ;t좳ʷډBz߀OD:toWݐk8,/*4 6N-\mٶP/Tx7yD-נ/Qm.!EDkeyɀ~AO=fM.":ň̔{,6CNY `j }9K 9Yױoߝ _d70C+'q6\.qv_S2j*BjE|J/Whv]73 /2Ҿc/.7hkPF*{@/gH) rbI=W{'p.t:9rڨýh{nYEnq}f@.{2F/%*msS.k^=ѕGuG]v':Q>bv^Ff;wBCT~lAܑk#=[_ӎvtZx+`.}FGp4@6-t-V*zBGv|Aӻ9̅\ը6RFR. C3^uټJf5 /tf@:]SK26%LNi }|r3zZhbOB>k_ƀ>9Fur|(fT&nht^y]a1З*rZ69a7GR\{IVz(=S b[0gxhxL^b[~͠.<5}ʢwӹ5ҢmM6TJ;P+2NraP2zq3qf͒ndI.4z DzIUk~J@ w!ΖB>ǻ~a["7/?#hArʜfrm]ؕ 9zYH_{lՉ[D.Z9@M1p-CnuqtcG9},ksS\9\ؽ#8`ֱI ;򵅁-޻n[(\9iskb,􎗥ҠEȉC%v%F\RhDK53b"^G9E@ -F/b wk [^ Sc_h @M E*.>|~B vKi_6B/(%B1QGkYy"0λZJ_Oi6i';udD9`S]_uFӵO" 8l>ˁ\|QulOőu4p%]hN/ZSWWr; b/Ծi 6`OڱC=Kh'70. ^_iv=,WrBN YrbA4kt _3pVKÉ~#6;,ITreI0Yt1%L wi>B { +1ZsldJGAYbz\jTuFR΍: $Їk]-Ҍ>iG#o@Ei|ʼq4$/1F[R͠I5+%ї]3E[F+e6ϔQ|ꋋ,yt[K>>ym1^):/#r1jߐ?麸67SoU# ;yIJzusK ]qEvbˎh],"Ȍ:*񺰏yЄ;tpcS񖿜gS ޳Tvft]w(w>؏FfِȻt: tEs >έgI *IO觊t@{}]iRuW -qS qf}ɥ&/M~6Ў#*FZ2.YM0q&[. 9ww\jGv\.i=}Gt7%I7dwiϪD-"n;SN\C_ yYi y5nsSZ!?F+jvqR^}5Rc4A*nڎ܂Uטp]E3hΚGcQx 1*N%k#PBLG>=S.BQ6G/dA5#\Xġk;L}tG9@es`(O{@I|_\ d, :b x"jL^C7v*H=͈^Z6v՗5=)hDedBn$mH/-:ŏBo-t4z[u mtɄB\;En6瑽tbT&6Z{]R nѥ=d #t#ˆtY;#a䈱W3_Hh@#ܫ;ڊ1&]ݵ\>bA]gmt"t(1Va\{78k!\N.wxKz'f~^id%]Mw1vEj( (8-) xyv阡HvDz&))=c\m pe/^G0_N,gK;LæԵJ/!/aЯɮ l_y HAo3F)Uӱ0e V_FHMź ҏnS΋,^O46CjeGnx=RBхRFRu#tQ.׉h t]~).6'B>͇B^lu7ʾʈlvHy8ͷ9.Tu%x\,.z?SK1F1 ed=*4]w=oprr=[e t3 :@ 2v0)co;>Ox x/[>Q^HEP=J:jV [Z[|TxmaX@;{u0^ +/C t#/)r-:t@Wu"ƌ1fhyuA6VnrYoa3%_9..(oTd=nPݥ/eBЩzLaQks]K9O$M ~˫9V?D㉼-fYO~8(AI53hL}l5v4\N~H<0r{,lS*t\䫲2_{ize# -Ggmim :detEٺ`ц% >`eGNqfQ Kb~`j^t` OT# ZL/ $oTDM7!k&q~t f==t ۏmڐQY+յMOBD$tb lJȸ.M ~ ݐ"s65V^L`?R*=<Ƙu&H^f BR p!z 1LϾ{$@FuId^rAyޭoj3*$s 1avZvuN:2zofxQإQzCNjc\L!Yc'~i * A)z41ʀ=K$35zv_ZsU 6q ~U2ySP -_F_Jo 6"3lJ9QqU-Es|1'cG9[&/ӱ!ϡ7*n:!~ [gO{w'k&$R[?㑽ȹz_Y+ȉ^VΘ.ؽs=r_ #uzyRCɕWaw^3lU#_+~BXCdDH$g(ufvR&D~*>CF<5,)ZJdS)4tV~Y},QCfW 9)Y9Ck0WHr-lsYܖٜ@:^zqnGӥb2!\r=u iiڱYV_G@s3ەUGC?FA?uyX+!GD]U 9]#C__iSEـcߠG#`f^uS۠_tShef: ];ͭw<_,hØWGޛ^҆'rNLxE|ޑ[#դs 99j#ok}GI/W˯vž҆ܭm#AJ i.fB34Ǻإ$TQrXl$|;87aUɮt!:wzv+coMQ|߰{'䨾R7̝ձUH1rdWr%9ὐJ{N}"'/I\Ǖ5ѱ)Գ72H4ww#WgzK.b4"?HRo~}SIiBtV hݿR\U#o5NVy -U%1iWCyՐPW*;ƍϩ1gUJnv"أ/ yy̍2Vfh&YEb¾C".J)y8v2z[͇G,z?G F${} \U֖wɑδːqH>Fl:`L $odiohݽhq\5ݔToŌz1!B@-z"7j~|薴ݫ;GġB=Z)YZx8ZCeDTʿkl=-”~o y=/rTSeŬ;.\T ]:Ի}xqk7bbM{eDZN[@7F>"&F?J[ftm@H}{6C]z7&Jc~!WmПi9,HJ'y%Y:2 /~3.;B4o0ZқVz25V:hIХQ#=%&kϩG CsW2Sy8 L.\K׼7rt-2.Z|KZ2Rr [m|>@+2T Nӻf|e|,pЮn0v{zk/BNSopo%υ_:^kʧ ]Ndыs3Ck ]X ZYӼ~y541{twA>.sF@]v@ޯ>t'~μ'vIVt`”}RoC= ;V t79^^UZË3ecҡ_,%d{Ah wZCWŖp7_'Н<:<\zA}\lzw7nilePUh@*rB`;mCjh _0#Ї'ȱN퀾"^o[ċ A/p)n &zFz'QQ]`unz@|6 )9 =?j5Jِ+P <"=̎"{:iPu-ea1DVRi߲'`b /Jx;k5zХ|}KAz摪@G}Ml\v;]aPLեKϫ Z]MiKC$>"9˒Nn# hlOs6ZTN_jh0g!NFgZ?w'4q-IEZF\L0k&ʎз iR8yU F?ț΋bG^\Jд 6αFnFnz!^bHG9/ U//@F>yiK9V@&'0 sD# }{yBc31ƽgu=61jKZ h@OF쨍uEF4UhaI qyhϋQrkjՌU9:'% 9ى|Vu1eh6||g3a^h };- Q]rC2BBANz: PCdhST [`$%?Gط?vk2]!;jS_b2$ԍ^vͣA>&!VkV?5}[cm{;}/!I>wКu>N,2snj:y.7y˦*4똨b/u C+B.7rh-#_nӫ@$c9N/K aߌrUgT*.i; i)q;=0I2eM=:K\2$ {y8.d"|lR V_-Fk p<1[ YEP0c>*}%u&A>(ݗfy}w\ulp .4:?P.>yQ/ ZGltHGhz2;[FG'̭޽b>[hzCJQ'a4(=-WGQfB 1kT{\/n/0iPFދېϜCAn`@ț[cOSQ9ݾ]Ot "a_52KQrA_C_ĮHcH,>k*i e5~.5@ ъ:-BS#mot<ʁ\03ƁxeևC#|"0!7k1b8O&ΖNmLYFԡSƃ\}B ypY|溷̷yR8ucNaXfZ>_k!yXz].ЫecQCk#o4%(:unQn먣$d6=h"/ğ0ѠS"mFinN,"ţжbW<-hpzn#﮿0_-oB^Q|wo6h%6^Rs< zQg0}5|Sr:gE]ްH9n޵O:rrbTu%#C!5@R a|zq9A yAK4G]bp;BKHÃ\5J82T]T@n 7$R_#g|yA*F:t֌F-*Ag%Ԁ豖NÍs}wKeeڑ,[gM }9oVs55u3x N)f@<52('\e@/KY*N.&JTaB<㋝bͫ^}2BSr K/C"Z|q/ m]Z'xke@a_MoO$D8)[2YH\5ΐ_]Ϲ,$^/dZi'xsbU2 ]Eݖ8XG |p;c+ņ//s-u^Нnj_}sjO)c~-?>u3GGn7?gˀ%#p6rG+牝mn|YR UMFbh/ TQؼg%3(ЛfbkE ?ypTOtryޫ5+KD}m ĿlAϥd|W@sL싾gr?,"YBuͬh={7/zMYڏ7p5I_7Q뀮M,AªУfV;kpjI/[ oz6;s̿7*b=:[F<ۀ==_mt7MI@?nvإN\R,8Iz[g} ջ""T^G˲^qu80xm^K!Kg65izUlT㋞̷ڼ6lъ֚tOvm0<}lHQ>=qRrA'ۻ|1 oGSlx*98QNϢ#ݹli y[B_˝hW=?>ǫ(!G@<7n]֜5:oliJ,IBw7;f ^QT-ПPewMӳ[ #~&h ߠKm7F_tU*r5[k~i9ϧ~ч5CE{ZX>Yr>5/F2fлl3/ ZfcԸ-e3EݭEK*'cqzX,Mii0>UKg+Bo >?i"?;$'.1XDŔ6l%.N>]L:Tz q4q~7H t;~o~73%q0Oy쏰tس. Ƒ7q8$^ٽF̺,ˈ ¨CϺ~s)1Ymr# Gӳ-6>,l5 _"͒W2Z||w\Uis!{}G!qo= ޡ6s-8~8znɥuyD}@FR,yiiCoR )` h(K6FNЌpW: }]z^2pؠFԿ[ 8GCxKVg%57,A^ƍÉ R Mn߬ȋřW~Z%EGK\\9Cq[j6xFO-G_\_*Y-A\TB`W߭hv1Qя,O7Ɔ. ^ҿZ;=[ s[Ƅ1rrY~ܐܺ$ct֓Iەvp=hGW']^8 D\@?HQSE&Bnh5鞉7A=Rn@]iGH/_-^/fTe/xˤ F:㦖̛SQGbw05䨧2Ǘ~)^\HV#&^g~.cZzo?YkP${:7;rQ/J_=Вyl߲&ݠGW?D~e|MU]&K8WTGl` Lvág ~ dw|és ߌx"1RuEn=oKٙE?\Uc9:Ӳ:4?8KW׌}*wɲ>|WgO]\..} =cUVe"ܸRGȐ?FTV͂{I?t%hAo_VyIFQ.盥N\_[/euI)ȩ=q~hruݿ+ WdDھb{X8x#>jֈz+/KݵoN!i[l}'%֠ٷ{]9ٳPot&b֟o1KnjuIcF/-~F Н ?1)_l?N׬ h}7|,6]z_qS|g%*Г*j*zP© q̞_7Nl{Ri?>jAG_ݝt& }/= l y&7xþ*c,~aŸ?y!9 V%뺉fS褞zH?m_کӆZEZ\?\oZmNl+Wk͇z9Fo;]z=As8{s5`z=85JwKe1x$ZÙz6XU;q]qÅx:vU!vqB=۳I޵)Vחtt}RT־CvEّeȋ75 -I An.r% gC-.KZZ#go xe̫@dŜnYЉ3m"0o#yT 9{u:FLђWHx+%/RMaZ6ˉ<| Co:Q_$İ01"X#]O 9-x,@}æTFZ6sy_Ü'vBWZ9w?жls%*0t1K^8C&hxi_ GҐd^w ]#yOtp 2$n9rc2XO e{Ǹ3_%èCCBMM^9꣊CW%BߌQ] e7=TpZB?)L4n ]dJ}N}'Z_R'k!7QvHFvQ\ ݺiVu } C[PyXͳX nȼ\Mz@WǼT*X[Ƨ|Qb;;sf o.) cJ:`Lfإzr@ W`9/D}^v3UQQץQ{~2MHZ@W3Cw L\AoMI?,/'ds6ѩaы^ _#*tv oz5FQhV3›rQCn^xFRVrc;.86v¸d~iQLzP/}XB)$' )QkqF-ږ!SGPIC?E5PcKF"¯-5x\+#z .^06N:"Ņ6aeE(xG?ȫ[},DDYUmWK 0օڂy&lݕ\]:\#%%wq:v fE>:_&\6>84qKϝJ}b\.Yב ҭ/("֓hmH3zϑh-JT7Hb$zeVȄȺg:+vFKZ}tN@O-j Bgsj#p]ZWX/z܈Iū]- <<֋ 4Hp1⋪"7G _2[?WΧtIG^/#TT.(+xθRA 0röނ~J%tfN@oL9p"S!G ,8o9ڑe[_#h%cSh/ѐRX]Wv!OS;tG>z]4 xiև  REdA2~\hzHZc i8؂t 7I6.uHǴ^H)}zCHZLI/ 6Rtb/WFȷc'= fc$.=`w9uZC3AHcD`o=)AV$ix!wqRq@߻-T7\.U\wLBи?rZ)o َ9tM_9Tg9)j'Y0jkVJG4`BrHA7r`^|} Kya'Y:ttlYk=) &umݎߩfzXyz=ܚҴe zpoD>e$xݒEzf^Sxk,l wH^ʸp#8^S]/Z=He]/йz9$wp-fydwawt>bt^lJ #S-@ggd hDءZ^n0fFBZŞDѩmzN%ؤ) 75<[O9q(l~[`t%]c:Qv$e@-*л ٫{׫xq/FFZ/!2NG >niA ́QLӨ$nU"Ox}'63{;#2sݸ7WJ]k1:rքwfUYP9l- O*r?>uu Hsun>򓅼QVuI1˒^EN;=!l}U`L꫸.-=ot%/?W뻍/]賆6c~G9>Yk䍺P;dJЬrG.Hy%/r;7l՚%. kz1ͼo3[Vo';\ou7 /B\^"aE6rAǁ ۟?Rƀηԡ^)xp=tS1Iy$rZ&.roBإL:Rv^)E!2÷uVd޻Zu)UZ@rv4k\tf;/t^hR.x/u}"BAKL]VR;#tlF"N4vލs3 aoTvi;Zޯ-kҊ3y#}xvpo'rN߽bQ^J.ְVpE\D\Mi$/z[ܽ0K tsb$9]͠[^m7[_軣.֑eϑ]Ò=s_LCsZ\mdc [k=?FM!!i&sb_=g2uۮVüi;|631;Z=fw79vrDz=sO]:?+jaJ2'd2i^-|cڌ=gdeobXx,l\95- r8':ڐH'^ ڲ<9e~zK+={KkVgB[P^ ҂,I|HW]D~M!elbVwᛷntTQ5yŴ0l[d't'3dˣJIz7d~T"z y|nn5ÆBx8^K +%z } ohc^/숗yC%{DyOw)%&ҽE^s.=S:x0jG^#2FŃ\}Nz[61m_@^cAnw, hrI7"hVиB\ܰ;^B?] ;uh?Ї,@зbmk5+G_kp0Z n۟cЛUL>|o׵ހ{>q.q/0gn޾qGIb}FwMH;^TNK(s5:['v9  )%eZ_8&u>1"fIF?%vG ݽ՗9Lץ!~$owVt<m]Mޢ /IW-19Z7^֋-;bz(l77M2,-׍D97xH:Qaϼ ޫF/]#H`..{腼 9IZܡ5qk/YC7J韠@sz 6 [:BaٷҰ_ҔȗA-g>g]7hSLzpѢb猥]s׾mS 8M~JQn9Vz:z>Ch}:GFB| /[b%ISgήglyaw`NF>#_]L-6˼ Xýd%t.k?R!ANHcLva@A>.x9"r9笥YϜ8^QM߻ h4voy4žLϛϣGCIŸAGݚ1` O.džnDЃm$H U5 ۩@.>X]h %T{n/2q+V rG@ߚ+$r0BCKA)]9`5$HlRlE{@S0Zȏ>)u}⾤u|,cCmz]z"B-Z <1lfhQ{6_ 8wcdmdpa'Λc󼋞2 ^12ܸNްS)ŸO}1I^B5/O0ri{C{Kk<`ĥ%;ثAvz_v.-ҫ&'tAir7`ZԥW>nQ+r 8Cm_HbѶɬ03%)o 9EA}8tT^/r@Ȭ@\JfY*ȍJgR]!S_Uet~iκ8G9\8xp . ]MǪ;ozIDϜkI]How֞)C' ]R`4Ƀ'tȀꨝзQ! &Z^oX;4`F|-`/r<>C1Q8Y6##S;6Ņ*op#.a׋]P/k 3s_ZYЊ:H( ݪ[~dm஁"ľT+SAn'ԭ{ǗYQy;Ϟ*t.>Ǿ ǖ 7d}n`j5v5#@].ZK[^.%ʮ\n&>DOMycՒۡCN` z.oкk5󆮋Gz ]q0 }Iٺ4*>\6H<Å>Ri tztm?ւ#doHl nEz?#dv3tvYkdMlE3G4La3Ӧ[wҽ´S}6qBsf-' ^5ZN:%r>Ny0AWLݲ*ϰu *,N#6ZVO;}۞%14Wpk x`˕ر/̍Al<Қw. 7~RN۽ԓ1zm=^$r=6`e>+g9xhyІŁ}{ocsf^r";e3KOl>)tI܏NYhN2v/}-;dWdnՃfÝTs1ФRt耎wOK|@KϩTȗ;qe~D`2C{7O!9GMnFB*l}ۉjFLOv>%oQkMhkls~B"zt:C7~{VzzUxAbZZnK=ͼ]d1.˥:{2[QH3Sj<[ocxZ˱7PZ+4 H2N fc5Kk@{AҪ*',ܗ2 I[VS +4ZI?{:/ςl8wqV&ھNL&'ڷ8 ZDc\55d 肤oqyO*8̒0I:tD[bJ^u,t'r+vS`kDsҔ[g`$A6ta0^w+D%KLj>8! E_!x[}co3Ny =)zz>@WM#minM1uٰ]jNU|PTrޓu2:빱k1bmmƾ|tW Xwmvs~|{.d/5}hF!g) 3C[D9 % HNaW}ճ>\]2u-fYÝ>Nw {E57ޣy=k|͹,vkbJDs0iu=onK\r,],UԷ?V! ]}{|BlT@p1 @7x*zϽJƺ.n^ ;ٺtJD{Ͼ5h:5A=+dZ deQLĠU[Ǧ=l!C* 9q"~":q/(CY!sMh]YjeeǹPgסK:zI=n.* ͞\.З'r,AwIv5wɖMA/BR3\"2[{#uᔁMg+n< ZzRH v,#G(r)y{j%O=V$ ao+U^$,p6.C>i{!MWgh~ //*i99?c)'J1pˣk#=p'/m vb.CI"م,ר@U%wmԬFhUSM5:ܝ/.yH=;ί!P?zo]&Њ8zk/kFuY{F̨Nn66NsKcAsCL.p{b}ڦke!paFث?̱>zaMN3+tkK?؉RNuZU W5sL3ֆ8Stzc3rH |EJ'>JEND>!-ܚ͗~oMo-&^JE^*Xvk Ay9_tׂ~oc5E?9]lU! As/iz91R>߼Fޠyxz> }0t+TD}W;Ї[]ܱ?gsr@;- v|blMuCG(6oֻ D.(IrF؊p+}ԩހZO r=? f^\bkzq5he vBgOaڜALێt  Bg%|)`>bl vG} ]Be}ř1CkGQ~gʄܽ9{_gb; 1<@o;,xzNW98Jڷ{}=uTvv:a:!wh$*>9EGOeWvۨ|߷g:9kMzHVV2!d@g)/C]hC7Bb{Њ |Ǻ2ތ=`v֘J]AX1cԗm 1=ݕ)xfЩ|}QWIZE^}c=j'vv~zR[x-ID5DPZgt`]fCs/ǥyJ2w\ϱj|Tˠϱ7c8{KQ8.0|&}{%0}d񊙒{9I>s R3p GCC6K'h1NS7 )$Y >)d78VR:r'<зs$5W}E.z~{S8e㮘A/>^ 7iӸok߼EۑO?Nb7Nn{69nIzCo~? W0s1 zpd?gڡd{Jp /L 慲Z^Vh`|Wo~7kk4PU.ڽs"n500]_GG;;\{qǹ;Q3d¿M }x>_2vH%ϱ? XlVvb@o蚃 z]lr$'ʚv/s4NF{ ܉>;~Z?յo)tt`o~L cUߪ"ϝh쌀E7M  ˃6km`ce|ѷD!ܒfP}Ȑ`+k)W$bL6k"+[z7}̓<3(n6.vB&\Ml-={˰ z$LS3i"`rAuWBbi#2;=&ya\Okk7mzw>h9b/\e&;ػ%r 'bT+ z_O]A }.Huu.l *eA9#>z:dȗxW8QJ|W;[65^K%Ҽa\mf=٫n-8jC74?-sbh39%2?Wx_3f}^vB7LR_Ho݁e ^6 SxZ`z gh5}d?>*׆$y?9'lyۘN258O0?#:CdRCtwo>V'Ic!m2, v2QRPk I릆9́v&1C}Yn?n}gaA{ӵa'_wSF߈ cG{w 3Zz{E.:ȴ~_žvN1Bs7+,;=~Eη9G b F0i]vhX[V%ƶc'tRlDb_j] <CO{g &YbJqh{c;;g.@ǻzwXiQ_T݁;(}V/8@Jd rc-5@lgsdJSJ]jF0r/yNHyGƠF|B'rEHݤ;v`5hXK9lWl@\1S]iHҙ7f|< %xv{ Y%q }>5i[@@Ϩ`{]BNS0F-Ru*{\,a]:GzsŐÝsBų:68idkzt !pJ{KVBvMUb[o\b3FnY %$參0 %mT>|.gZh]OЖ :2Hm|sn,st`d# ^JA|@SB_1cZSI4Q"kWj% HOs,2ϗ:az2wp/j2dy\1|O$et@4AUL,ug3z"gQK| Xq@mR{SS,a35x] *[CrvdGJ؉L &}ΔWD1_tpeN_]Id4J VZw*n \^nDrcUP^^Fym՛nr={LW؃IJ9ȖsbW" GJȱԢqCr1dOҞhtvê )`c= (B/SOSMI:^\{E)V1 4}wcge@׏ﱋO%!<^?9yk!O Hoݔ^ P>3k!SZC {?o5ŠūHoܻAW;mL^4g}9zN(x7`F@aoz9~1j%;Id4#[N6tqvG>|p0#G5P]U[wU [޼?n;V z;Dhi^=2cm2>u@ξI>/{ [ Sp -*?ЛG3g9PDyo@m֝:Nwf 4O\[~#IRݚ[Х0+We)T?u:zV3*㓭RͬbKH3`;^2x̱GbYj'=c{죗RƅN)ϱةCg2_R9GzrB'תx4;n OLl<-c0ř[Ԛ\<^n6A4;o~~% zB9&Ts1d®Q3}}i%;|N{ݍлAs| A^јe2p⬬7eu1O7(ߣHx@l$=7tȍj*yR&ۦ>>s/? P$H+BL:P:`z3s#dϔh@؋1rP8LRjqE>*r/LQe} nm-3kJCױk&b1c?Ws'{P!=bU ۠zc'Bb )W©[NF d qs@TF;,HnIRBN};=|ȁ{D@Tj'vV،sL'%Sǃ|㝍GvD!};91 /ke"ID=rk`c/&ǸMZT =Ynkظ12NU!}]pCJCw+w[Ȇ2}4-Z>?kTM%eWKG&%Qok-)|"ߦD{3joٖt z@#0 ҡIlu<-ȋ]%=bx5e4]VzUL`)]7];>+Ba |k>P :,oa%7|>L-+G}_uUh^r<;Ug yK2r]`/R dMipoD>)ڒwɞ؃=43Y3s]T6'j[VU92hfJ974]I01Qs4\ir"bW݀Gt\9N,'Өٰ}Mw)ᛛoAG*-9|kzT:#9CC/'qx7$jNH:~o:?])$S`h453t@7s~S\}/eZ5 zIj}ǪE-_#Qh}O\ ޤߩCWSF軻- Ðw'4._)l9D:a ťڑ޷UlKGAFN0I_߯AvwS֭>BGXﶂO 0*Yz'*_I}V'|h//|vzeWs_b"xO'w/~ QX?-*Cw3M Ji䎽]GuWl6;5XI(y5ƝQ5el@/qڨ5H;jB~̎8 Ɍ2D,r~u!v-/urk<ةS""۫Zi zUm`ך~%O)u 0߃sIc-:z [\-iL5ܡE)H[]!v9~ Ig x>Y}Wg] AhE z/9TA[-~G ~KzAlG_CS }l?_l{={RpG%u6TscDMQ帩?#L٪^30/ɬ>B\џVXB7R?!e}l52?[J|tWk+-æ1(~vZ>_SoU5$\GEKz-NҨykGqs_W5n27r-Mz4i( 9Ѫ r,.?G-d { z` 4n쉔Pbaq _}s,]ӹ*ū})Zr_{BO|QD}B\ɰoA˞wHs6ؠ-sqW/vn)k~;YM0ӂ>Edlx z s.-!yW'jhPJF.]V] r3Z/GV~WVrؙ#E~}tZőIS?F%b| ?c:_.N2&A'DA_XzE8 eYPEoaf!7"hl9hЉ_C`Co:KZ~/zo1>' `_wYFЭ9?Z)#_i17BGLڎ<>s9oyUf1/1Kej%ۥqZ _sZ=D\՘~pZ־ A HEZ^t&t{\}sW朂-.s2>(6?6RY>QGDꦒõn7_JeЮo~WAP8>A.qsH GjB*V_^<S\i?nBKRZbk/{_ܠEc-Sv$c_E~UF:nr} ܱAxucD"f5?AӬ7x Ԑ+r$ޗWh"E6892#zyZ2/9E*$RejF7n/! }α=Q d֠M~}mFfʜy?6 Pmks yO)_}>;ɇ_ߏL]E_[tKV =GW۟3%ıB8C(%pi߉/JpO:x/{1f s&Y !t+_/e5B؆lÝ22ԃp|[|aKhc x!=7W b~FD_0|}?uYWBϱCzOSwص2s-˳4]PaEi ퟜwC?;tɄ"S\ _i o~dWkOk7?KM~T,DξMv^|}"K]9UFoq3HapQo"Џ9JGH:AaЉ!"OͧmKe!c ދ ]ۙDj<|J_Zzv~2} vGZʏ'w5Wvs7GM)ǖmbge.>.ް#zNKOwݥ+>".Gyg42'HKmt_qfڠKgw "ùN;!)ztד+>.^5eF9#LmDr`M] Z`vLGڢ mjgwMVz\Ӽ |/)++Vڡϰp}eT)W)7ҠUz7ȑ1Cu Eǽ]"30ZݐQ{(+鎼0l>nq"S"[ZZ-^&.O0Iȟ;cokЩW>wCZp }0UQЧ w"FTva ثKosFWMO):8ޮ쭆 ybLY0QF4\o ^hGHUX9f/Cٟ8#/^A;h] ̺\VTv4GnH{P%Q¹ɉ] {!2oA+6jL/M$aF@ni;nˡu\Ht`'{ [T\l\}H+vqWAGg O'4fLyQ):&%b>^]g n:Rꕤ / l.7t}o4ֿ$+Q&-Z`/z+e}tuCq|7-#>>)ZQRۡzdcd*дvj) lP% ]{h#H|`NBIO93HF# ̂N㕜HRn*HYށˣJ gx;ےP[ޡO?4֒ȳ$)Gԇs5*P@wzRwrFȏL6s!/XIIkX89ݰ[$⑖3gy">/\{},CՅ|gʘ[W*CW. r'{Ji)NG6O8bn_}8f4'{ 2ɕσ|:=Nw wCI|E3BGK/c| ]h)so;zdh'OUNj╙@sgiET@ yo䣱{0 *[7}9*ڗL]h^FOB9;=;]D -Ag]Aa#kkwnZƇx vӂaJyvګ{$ Yy{MpO{''a*҃}:L?ܰzl:)SO5=e盀^;tPf z|da~,-K;z'py ez$Qʼ0i>`Ny pأ~}޼ITCkeńT& ,瑧!sЗEDR5փ]]*w5~O1#Jd<~{c{t1exH[i dEl=a u'_zwjS$CoʏMA׽a궠+7KE:1CRyB[o})@2KYO;s5E9¡['Ɏc*@-CSڡS_CB`/*fhVU !3Q}s<Ы*%birfNv?T˽Naz"ޢ7BAM!]՗y@xcЧdMIYneLPN:!eAاt/| zߊ\{r|WUG[fO|_Gq/3wYw:l6 @ʼcoI3tܵ;t( oX|gH#ș4fgեK>+B2<84t|^nɞ{ 9?n{.|lW)w}LeGYhz#_$snm SKSF#%OrĜH_3";Jq)ڐ }l,;)ZI 9a9jwwLX9>Gwyv>u@3~JGا\ޒ=ܓ}Pd Ia1KNφ-l'v@7x;;K~[\XEU^ 'a'U6'ݡ/y1쑩y_UR5_쵵vmVh!/cw_'T0$ 2u4akY>_m{ >_-kj;xv'04us8k\XM!=MD;tn!l5}/Ц EvXkREH)_jѥ..)5ט<ЇXCwวxe٧ŮJ;5UvC7?_JU>.b,5:[Yܲa+TJ3exByyIg}rJ.Ic^ ];R}4wFgا4ZB .ΨBj*Y]M U쀾DB'=S;lTz`v3l/-z =KWi<,4ga۽zms ӶcE+TNvЫr`Lv~-%G4ZvJk! o,좽-[43,zlqąnd'%zM\F՗;* -f/MǏ$~/Y ]b tLwOKŅN[7Ԍ*[{8ɥ!]\ ?ڲ;}QIc=ԑj}QW:STn, 0ߒ[Ɛ@pH9h&s8:bL?hI^e䗽oA8y'GxS;1z}L[>;9nS؃]B3NjH܌!2ɶ[%wS@72hFؗehlӺC>R v$;bT5h#c^e3`JI#dޡJjpf~Ź=jW:/ My\H/ mJxY<69ÛS%Im8y|JIYm1\:{4]]/i̫k0^?U\X[(TH 7eZ ]*ɒ}XAWa=G'9w o%*9eD-n܆/jRubkzDNœ*9SZ #CVu2쵌XB.~_sdSC'uǾV;&:cф-\gU0sGOzUla\#s6@|7ŕ5*t9POywWfaD<%N:5  {"]^CP)(;ehzEh73bfXʚKw.$7AWڡe/sAK'A_wp<Ҡ7aӓɆ.unîd^Ne~&;:7 =eb˂Goa檌=;WT9_)f4FΘ`/U>Uq0-699rb9O%L?_.ttqq*]@b={\yV軥fiNRK9Ic{2qӏp/=2t~Ԑ3ɗc ZLFlZx$˼KFT-ŵAo:ɳdž-R:Cp"%]t~ 9/ӳUAmЗ}\Ke;px_}H5G8|Ik=yځ]ֆ.&6\\ 'h!nә2}AtLlKC~I^|+&pE-zֻՆmȘާcQbfzGSe>qp#?JggrVj}YR4ݡ~A@|)-Ǥrc?w-fl*r)A[t'isfI*žWِ+ט\dF>>7(aS6ܢ }I|l/2ꁝC(,) vU/gڨ/s9:"FjI;9 ~w:NĢZc_u{BȰOSv {-uY:OJek)` {gk2AHZ;R8V%ϔC5RFlE;EUE{Q6D,RQE~d\Wcdt`'񉒍0rkԾ︋TOU8t(eXdz]Z[ՐUDwC{g2b'_o IE_ʔ7J{.вO+jgUyB zM¶c [mtn؁.W]ZlWvgu jEp73MlFկS)l`<\f942Yh>@F(f*-G ]uL_0Tҁzل4p )&Ѝ^{u'Sa_by/{} Vz},ҝ0S; @H5 t'AX)Gr>Q{zk`R]':6iIzDڦ؎]cc/c@/OQAFznAt`_E)&:s\_.a }*+vs7U;vCr%[%C6aL }W{ )M1}|}j(AuqM׿=g^2bc_nqC:mLCE3SKFpjeЁqbRL0!=.Z̰C=ۉ{=?8^aKDz;1t 7^tw xӼtEp{ -.xW&CI-"o2m >{](!]Jf+9(L-c_cKb>*ܔiGؗO`?=}z@+qr,PZܨf藝8~0NwLdc"ݱ|ހ-P+?=F%h9˶HX?3N=l80p@Y$6'y dЊq Ϯ6OjP}jlMېK TݑfNz#SRm>hmu;0/?7_Kb_Zκ$k_ ]Br蝽gÇLIvS"/]e2F=aJ4wSك>ǩ%;惍A @Q>jaV+ * |r2tGdž)=2!!Wqe`c7J-Qɼ9!c~-}aȘ:J5n?@ÌyF}9amA_:6v Cv)4*4G2ؑsd=#aqǶyc;~9jjڎs$s]BvEw/ErħhB0_@=qEXhjr׊21J{ٍM'*vc>= Z 2GZ=xÀ 4ԆL))IDB|ِ?L-CaـKacE17.=-|KWOjVOaƒz/E4pL}׆z>0v9%hih=OVz- SZd2 ߊ}D.qc`7o8W3ЦvC 8GKr6"/KoAg'?ױ͘G,7Nxe [GiƤ;VSVd.ͧN;cϗM %پi?}k%> {>FOe'}Ԑ\ث79y10!&"^V r`>hw V3$r 6=)K.l8MS}^*d|˫(EjY ůσB\?}C&lC]I8=r$ 7yV%[;${ RÂ΅!Vh:Xa{ŰCv5(^{+7zy/4[Qn@rMЮڕ_2Hۡ/lu 7vk %E=aЇ:2tur8W9ۉ A$kخŐ_vҘX?؇xmHA Ɏ)9 )UqnSOv6$(v| \U/%vʬA띙O$OW_lĩ`UdC %}b_jvZzsZ&hU˥7aD$U5p]]y29pvoT09>}YzYPubV)Ygf'eCy7cУ0oŗñV!^9T~ 9͙i)]pf燩AKO$3I 5}Q԰2SSrbChtLtaO^ʹ`'ϟ΃xfO$Q*rC! 쀾2:U} N߰Rb&=ZVköӔ/ ;ĺWzB`wi]>M\7^!Е0udCErw{I.vz`_*C G.La5 nƐD=І>{{M4N=`c |񯪌ySa󎽿:ntcJZӼ1U<;1?N =,5lխ5DmǼJ}/6h ,Ƅe̵;2ŸISj;wκlq4\ym\ Yڱk`ZTv~Y 3UþQW޳`:cg)vF}NƆAzKqjտ#gGiήk^"'-Hِ;֛=ɛ/K) %yBn^~)Ɯ}\yN j*.TJO|143Htg11w-rx/hEhaz3V =N4}9*] td0/F?@NAEI>B?ĩ qf#LQt/ [ٿ$ݠ HN5v 3E*٥{ !`Jz ypG)2D4eNq h+h}dJp}z I[' 똴vOʐo c$24z<8x:kߜ_*ϗ V\Ypa){Z(E`o.= WBϫk:Rz-u ;]6J뤀i6r緸\~I6Ł Ťpmwi@3xګ\1'?-C֊B;4v bzwĸ93ștr`&;zsS^ThCiQ8]q9PV|*-{(/q ao4vu2캝ݜv&@Z$}:0%C}OUE@h){*e,OWri ܄Z+05i$R  Me}Ы &آN<_)C1rBI)6t9a*qOZbݢ7t}Ax@bkغYiZzX=GDוQԽht*δCiR`A{xɥ4As(Do^aO~ב/-r`{=7t"FW2=ҥss' A$k6htvQtR`"dfFǐz{? }|y =dϫ Լ(TvL c5z/c/q<^ JEi;V9^B@J>P=فSș-u{zs-mq`"ς>t)C[%;'LOs`>%b$*RVvKSҰ󅸞ٝ?]$ ys eL1i)5]3uKZ^itkh7/J ҖM qlyGNټeGx-65bOva{p%=ثo:^cw9؞dz]p>R| u\X7ʙ@k Iq\褑I%)~,/¾Q,(K_?RhKὡO^{. Bc9#ݡ+HW`g+aE#d/ )nI|dʠED9R|GrTG恞.1-w,!xI6qakC// 7f_kFތQ;7/tOgޱkdLf1^äb|8l6zڏ>dedJUd\Rꘅ^ť͸d?Z0(e5`J"ЇׅnHڳ{d6~O>@mڠ/Z' '%AG^~4-̹jVޖK_Xy`Kkp0N˜&h%yoSj Xu@gSGvNv#ͅ"|(V݃Aw4O+rGII1GҬF_U=RYFRAbq>YJtȌ?ЅS%JMYԿ&)<@_CV,4R! 1-4img{۱N @f%G9!B ɉKЃ WuVM+]T~gR:3nZܸUP6Jn>Չvm*!}wSތv%ZΠb4BU7KȹcԂ-;ޕ oŐ[Ԗ ]]Z[}?ZE 3/KîcTf)Pi=ҭ26W6OhȄ|Na/81$NWj~tY&={,ǾJ-AzEyCیR0f_-DL!wٞs@ѨFfhF; iہRBKv䋹8+PE>52t#ó92Nf-p;^tD_u+uhp#?1o#L.A.h\ ALcG >;t, TQ2f$3d\ yh"1|/ j)A饢GYqLM3?J,~ $#Q?į q@gwIyIҎi~֟G"蔉=_mm1nhV3Mxe^=6ո|[pM)ꂭҿSk*wudRq`?^)GkD` -i]b%@'IW<#a UA[F~K;]V*CwqN0IV4h/zAA's$*O5X5aB,|u}=2,Ӝ4'X -=7t wK0?ثE ?Q $l3Q% w q{~>K^cwv̭d!J~>]>Q `#'uj4dB*4 R͂ F]>m6h2pxgLK_2d0QMjz鴶#/!Œ 7ww)e%hJ[%~-#׎eO5w-BlBZPGx!sl-"?\G1ω|qB#=ؗ`(eh~Z\>HBNˑFѰ}ҍBFP6k)u( 4'l/?2^T["!#c㙑P2NdhgMp NtMqB@q>#Ir}^1'#`ߕQ"g=f۽wڝqa59{RT#3xؗqOIQU ;[8ޙWڭ7 Py;Ӌt m/~[֏zBKcga/Cy=ϫ mIu~Ti7ߘ-,r@' )Œ},QeK Dz?{a1xQ}008> maKv\îˤuR22kR 3FlNàEO%Ut z hc콫[zdȭ?K Amiem<҃}Y- r,4IMCR:Q;y.3ƾ1x?-99X6tFz9me$*7kZd =9 Ȱβ#7p럯"2g>V%WіLnAri?Я^Z3HjyIͧC :uM<_<oSA V 9+cS_h>Zs>\aT;:\<7C'z_/bڄgnV&?\?쾜JKvs?:yJub J;;/3{rtU&Zv ڠzR?UgokTW[#?K Y\ԫKK籬mp[sQ19I,-S9MD\Q n\6y4ؼV~@ ]h}#w'oR!=O5 :Q<5 -ҊLun׉;lN~ q)?ЛSjA?b?9_M3uqrjE~. >ސ=Pۚ-F_BZ(5w;o7B}W-@/-VgI\~oW1>/hֹWg[61\7 hbOtA q\7Zo?O*'I&S#>Q(_N ߢ`Wua6ܤp@_5,8K{_C EE~()sG;I|s|-Э~/:VrODL=s +*n5]h>]-bMO6Ԛ~:B"-"K݋ z@ӑ2_w &\E =on[dMz%WUW9R`^LpIy ׆>V y4U4i^nWfw⋼NE֍"i5EwiT5ZD\<:h#_|;DpMqN49b A\Oz][նسﱤA7Y4oS.L=>䉟.þXc}ћ/%Rs~\="?dYXX֬[@ϡ.{%??V40Mu ٻ,q5y+?#sVLo^0T3TWFUE$9e{'OsyV/7x;_+w3/kcJ_\Jbx_!]Ҵ@oɅMp?:tfK]/ƅb?y3>(nG<62Je\ 2?簈`Mb NV^KtOo 99NWI) t"ų벲WG 0xM}W%!/HhkEhcho ?k89̟m)ts۹kL12_\~??ohSؖf'yB0DōMB}E[3>Z cUw߀dj}M/ &tz.+T jm5E:o淸te;E7P[f>kOW#ؐާj't77{?flXjLV\MK6y+ )(?{S3mW쫏1ͯP5N.[B M_ 9bpҤg'^A&<Z'HMI?sg+c ?J1E' @>}[ ГG¿EG4EbPvʹAvXDӜi&Lwy(ћo: {#^}@"ϐRz/HoG m~ yb ΝXv4#C1+HS}QSj6+9_." zY(@oW|V 8z 9_,Y|O{ĠUDL'V 1"eu|e- zd ݿ[9?/4Ȕy!zxs?4m8s>ۜweE^ /@(W2% \Y<ZGWf3MܟYxqdzИn%Í`8,%jC79 9_p33.׵&?{5V:pv&2c2#O/uSmn|r<Bȉb>YpNb% Q:⇡Y ?Њ}AvEiC>VuSڱa}\0pqApBF=p/g/y(>cYڭ͢=O?_%k{0rwq,5748g:+;rIuBuMUN;ӽ*Js?(bz7 |DD?)H۬K+k=q&vB&Ў{51sdr_c&8ېeh~^.ب}퀞CBG)sU.{.ݴh2I*I})ǞUAz)]Ǡ] KSƫϯf˚63}Vi, uH-S; gF cS x[ə5cL iRMd MzYK!嵰'Yo=}.E޻Ȃ\.EtZm~>Up"y tE^g':duIZQgWT)Lr/?[pARŨ*2{k('@SMGE! y=Be>lGz`W<]Jʳ+=Cm1]z|JE̓T853]g!7ds@'k'eq=n˗a 1QW^w2_+ulc+_b۽XBfu^@ ZG)o[ܴI6g!.rbz4r-%%m{1iUK3]LKHʊOREc۱Wiл:6ڠ?r=)=az4nC7IN7[oiIncF%Gl mʕ x~< 6 wG5.EtCNHmܘKi%ؗy"=@ԣވ‰H]2_ף_ζGfWqe>NNqsn^0Ұ0SlꜢBw7'kk=]q"±A=:p@.TgklE|=OtxT7$. ݋]FCZ΄)lؤzOu2k%ڠrnwW1heH-PTà^J\ yA]b 7J:1ٙ.\ roU?#ut⫘H(tJyOMCި|7^+ xq ZG@;c-'V* \^G!.iOyMإ!A.լh:j0$U,s o:"[ޑ?R e1 zf3 }8}sXnL6Q/h<~_WRoK{C: 7y\C#ܿM3B~=薗iuƂ zuђ|'j?%/r3|N|5 CtnɼEVVE}1#wUdCXPL-g7 s9;[j7g:c>U;r Fhh>bJT:Hf֤bzn]~IщA;kvnA,&FfAήBN~'b_(XW,\rzAG4^.r!3C.u\CuU/#}=޽\mpc^kڐSx@oLm*;u >uURț^PwC9#AU{)d4tL/Z5(:Vat<1uF>ON[_%4uddFW 8{W7J }e!_I!T$?/\-di=ᴐyEMGc.3B A>5.#>ybuِϛQSh"ݜtrFw}HCmNѰ#& 7LQ0 //B}Ih|/6ZSh>`p4,>ȋ  Oȇ$+4ouܭly>2y~/羈cP xXRcQ?ҵ=݀>З \R+\ ц#_r^# F?RKGgtѥ (ѿ3]ܠBgK7:?H5|7z>/ZtY #^I$G8{7ڣk>KuuZmJ/n+:>eGqcqQ݊mrSFH:wГk4l!2]8:sG%<"/n"!TܢyWh> 0)t)Eԇ[;K˃a{ԎyU˝.&1b{+FЉG5٥^w)wtT`S.uTsF>ǫB3-^"^? Aoհ.if0 ټA%c6{s ԓ/q y1]>.lX5St /:n~;~:+_8s' z/ꆽzsc;$42.Er7};:WU7[dV/k6o2QCB9~p}30EO-J2Icf$M0 t:'vhT>9`Sv(~aUS3ߠJK@/գ^CKeJy3/'m!4fYPͷC!_}~zTaҸco`zwP~ĝƨB !LDMeMS:r]֬~E_L`&HycAW>)V iנy縟)g+9(k sZ24xz dU%0xf|))ُ:%~ˌ Ҭ׌25Z>C{Tʸo 3m ֫a9v̕On9sF92Q~oy⑭ث3up3>|4`7oP[sS$/mN`GiASȏM};OEels9׾ՈfW(2U5z2g:+M+i};a*ag B{Uj&7{pN~=նRL{ p5l˲#誦ډ].bB\ *q0>ZWIBgߞEؿAړ?HeU~?ib2A؛f4eޮ1Mߨ{[ m;erLC럓3K|qCЃ?Җ GJCn8p`۲4ĚmC'/AgD,n@7T|['.𡴹#!$'z@- mG})pXkȎ\#'{g'5 uG'E/X)wVB.v~F:q۱f z6O%nѻ hA˒7{TGi$~J{WJf"F(y&7S:clЗ`<tfYWx&)ۙ|jY%B=yb z끞P/6h@`Id]KY%Ѡ)սZ< m#˼dlӇ17/vbVo195Q'y2׺#>O}_`wݷwZQ|W76rdI od6F zki ֠~X=л|bkղAW |ҿ}PFw z8f[FwvB/NOwM7ri l|Ad{d_}Eth z[2_o&G~$ۋt}f-]3,cP뇌5nX]ږdsJٕL7&١/Y6p#&;.^we&yz?Z|_"z';z@oy=l9$@S~ԕh\FtB)OB-=ʖ7 h"=Hg>gFR'e>.rENm+.qta h}n{ԫ"CAF'KݶL PmOtQѴQ@};=S :GC#[&l=sijArq˃~Z6n(!$ӂ(8(|ޡOoak#A6 OLmݕv̭psZãބ/rVU-5~_9Z;&c/I)钯ь}K</qfXޠ65${- WJzD.A'LJHf"AE%!S)dwwav8W^9Xbt=z d.N.ji<9uQy.3誑ӺQ2e[cZx/r Tf1Kx!DsceB8ʷI8nJߨ&z {jT OF< q$s@tnB20t9YyMz)4yR6گA9n*IY˞-UIi~k֎3?kkuy Duq-\4?xuE'XܑflNANt2ءbCZ7̗^/ VܿFe~G gOU"]haW]sq  1"n|4R+#[{Q_+/oG@ߩSbڠO bȣ"{/>#H5`lZv{)#?餷>=ٿ2i."vxϞ5iAr 7?D~nɍz*r1\_'cgɺ =k?BGv7'sa'oR~k4ϧ&^i%@{O40flL7'2^Ka%a O -iRl<ȋv뚚 5vޛ}t%lce=O\߳CCl {7N9A/l|6(M;}B?nLo'47!<О%zٰ]mio^ ۸\Z /?4o\ 3ߋ+܌7~ E`N#&-@_.üz0iz`cmfJbLEZ2{ȝњ 6o:W^&Fn\1.Gܬ!|M.$1t伆FuRhqց}:͝=[Hμ"aC\poM 27!]ܝHd##k&AB o8a] Cݶ ͎eyoS]䒆bs6H>b ?/SAR>2AGݕ$[n 9DfJG}5pTk<0+r͐kQ.k4Lc' 6U<ش񁾮U)OgUNk$M03n-"AjZk5^(R㳂<>TNSLK-\nËakG{':4kBb%:TXԠoA|ҷܦUY]b#|zH] Cnc-'[c :$?#_MĹ<4tcx>^Cy3WyݖXҰC e/~R"-2*AE^ zcŞKF.v*:lvl^9Ҭ5_h.7iw zr*vYFQhryi:$ yaXLWC$]vr[?|\ϰ.:V~jԵTطNq^C.fD󙰏}܎.p؍AW4z3g KP۱[[xK/~.>ܞWN%^Āfue݀?3!Ct.G! mҟ-NY%rCEUՒR\O{q[|rÈ z uӹߎFx ǽ/tﰠ}[YNɓW9+_́(Co``δrUfr9a^΢Bx^ ߉ŌNPؙ6=A):izFJKYc1C,?TTBK6* JhoAiOғ? F4[E9rޡWםi/srouX3j-!ЌʻkJQ;ę8]Vݥ,l@E-Е*3G4>ћ*ұyيmAOCWwru5 Yx 6B>2kcw/o-ǰh&#߭"'[-BfG8Sf2tB\Bŏ1&tfeTs Рqwm[能-..eKNSGשeJA~KcE"etof%vttAŋtEZ:J !K&0/W!Z}Қ2JDxS8 hڑ];EtGoܸx+/Kʻ4k׶!C,2ݥ]rRWԱv%T܅Y2ҠHHQrWuVчK2l>U7vQ jkl:}C4Ta$+zS{Njj LZy jr33n$9Dg` ryr OwT"Lj岰?49d>sp7tGךBXG~mNfAgM]wzV?F3{z F{w{MNsnw=cz=%J4N= ^h؟f\: `N HV^¿ϓGlv5 {G6dZ_WA:-}@Ma>l`wj?犮֡e-.,ނiC;~\#1EnʀN |{q"U\O^&͐]-I\Nxݡ#YO}uriȍx?ޱ?MCV>=(7= %'OT4B.˅Ɇ6©)gDڱװ;_,*1EL.|8|F FJ<~ %K ȼӉV Z$_Y֙m_8[s!.tzy~GV (~gVsYK5Tv菀Ozq"X֣ \I78QزTn/Lإ^B6S;)GTm1z_NAov 3؋b!AC@[ؼC'4!' _<ߩ5:`u"7hY3aP:w*BN^y +vjScl9<]CYtQ,|iZF*l%e¤r\TtK;rUv.+^aB'/oO^pvg%?-HνMr>g7tIQ2?C&;zƺAurذ{0\] a*ID+X;riO'72 $v6sGhJ2(I6LnBFi!̬נeCB3x@_![+^OL)Nj]ꢭf}F"3Kgݩqm.7΄sN"Hv"!2;9G l7+)Μ˯ CH]z!9z0r[D8//v0D#:H\&=%y|%7+ȱ膽_셸=Äf.\ lIܡ0Tsugm4&iг[GD/k CN`h7-] -FBOФ1/t7jTi]"^^/ډG"5RtH7{EZ:"Ǒ|DwD\ dA"BCUOs-V}1fR5uƭysـPo_t4tlVYJ2i7[HBK6ހ[ws W<ح#ڍNѰ5;lQE 1ʼ1ozaɆz: AϏyN9SÝ6U6Aꅐwmmb/mȩD!+cpv^'ŠiG¢Bίz* ;oiYG|iō#; ewk4~J)_`Ͼ z9? p=S0GTGZQQ7ln B #/rqoȭ]_ݷƵ :FEo5Ґ :lFg?чaF%P,ҦTف1s]6YD]㽏ByP/=ڻ2@E^=_;1 m.rv YLXhd@SdZ znOs3 m)'_p#iRUat3^_UjEFFȘǠj<5Φ+B>bt }ȳ5SoS% 4nDr#Qv<~Ůck&n峠2 {ߑ'VEut.w=Ӹ)hؼP5NK4@մrJbP({nMGn:DZ~/r\$_mB1WpKjf&:N%ԯ :. P4 ,6I E6I?%,w~+iB`G.1(Ckݑ. +<ű`;_Tbp,>֟sBG<~װ.p3G#K*nMZnkuthr=3]s. z|"0zJ& Ea_n:-7Yf1 ݎV /*r&ѓL^]I=w#7L76m]ǢyrLd!>Q79¾3!\~wHϥ@ PMc;k6N!ymhe-s)rXi5"yL8GjǾ7 .$CD_oDeTW.ou`N]5.f]nu ][.G9E"FYTy@v9wز)C@^#M󦇣&;t47xpL%sIFNz׈.T]i?)Jrcpnelmq"#lNX% ͉Bkoa8!6?U)vT}Oɗt`w,,ȩW B-ċj䩋v;Ţ1 Qyz]g3C/;/~y1iv %h 7\Q]%yA4،_ڴy_4]W?ܥ \Bw z2w֋p dt~#3մEI[y$ ]|#`aEn4?twFޔ9}ޑ?#ȹePt~;z윱 ڱKSo GF.Ao&Hi9#a$h<&./4/]~|q!x4 ;4\ګ)4"So*WFzv~[\hCd7-Jcкc7#2\@Na*]܆ȵG`T"Zˍ6Y`撰#hkRR ƙ׬:vn\! X3}]BOmIc%hB)/,JE, 5u t7K PeVN6'Ě]dܭ9m| Cań%sd&&|Nů+UCdQG>"KߠcXo|?{@/keEA=:V;R#Q7y dеe`46>3~@)U"crzzτG:b'ԄUS}ZHpR&PG|Ap(`=RR?5XC_^li\gxXmuڠΜSGTlC,6&ܥ{ 3Dϝ& k"ސ[:4ޯ/#:C+_>ƌ~ܻy=GJog_i ֺA}4hJ'c4~gWY%a|GÞ|M z[;3aGw̯emP>K vp$Ѧ&6 #' -Վ)UlkҴAo4Rl{E5h#?%KK֠BNL}0 y%):t./{a LQ :m0t(v1F]a퐄PiMAbmLJy@k%/IBӻ \caC5z.]pԇI_kV}Oat~aVniW23)DZߐUc4Ͷo @~t,6'c79ŴLg(g7h.,x .p dRzոgEnR+vSќaTyڮ4GRәafݑ׈[UvoƋ2tG΋2H z]{GB ΋0+J_ˀE g4C5#Uچ\=aS#vӮz ϱQUh׶#Zl"eCQqFhwsF ~#.݃^ D%ݐ/z:Ei`(G6hgWޑ`phH9]bb9{?:\DY[tH]W{hC'зvh}yή]Ra~5f{}Fgrvyl7Tk_ vt5kRtnϪ4c3IzѠ*ttȧE^cgy_zsAʱ6g>iqrㄞWEonMr^3/`OC yN'h:;;nOcehV*;_>:y]B _y%~kE/sRvuuJ |V"KmUw2~9 :K"T3zHa?wc^`.D3ˋ;6ZW>it$ѠEky |ˍ|V <;T76 Cw a`Ei4>v6J4yFJ"a縘0Ewkyw6_~N+ЙhKѪ"CJl2|or4H7T7NE޿hY7 ߛ#YG?i5* /X|J@| pbѽ7;RTgV eE|nk0{}=w!y̍>mԡKsqi Ͼ"U䥮/o$ISA wx\l&.4T )S@ ƍL}Hd@RTfc τK]#4V<ߺ?)uThkbYs{b)J{)X۠?Sh%CnKyM"k-+Q+M֩#> ݖX۬\z: sѱD^%7ݐ{/7.C.Vy `qnd*3Q&mrNKlQղx3mз m68Q.jM7jf,7 ./77p-5dO//,k/nt2uy;rVHؔ4aDn]D}K~XE~{>h0&:i E!lL_c.MeGK>Z^6nUhF~JtSE3;EQ/ؼrnNc!R/j+?,/FE.o {J@5_:9 .x_Gwsͭh4^-˗X0^oq[73IVeSoeq=NEV `;G/\*WF`z4%JNAj:$VfVd%K/β۠'u]glqf~SՍM%"Aת]G5^CY/z^7)Yc Tc̅~S2wv5OPBS|F\aO/{&؛t@gjșȉ|)gcu9&45_ ,6WT=uIޥ0i/q8B{GoG[;KR'Bt`5=l b8Z墔eSh6X]≒)3 " fBu69Fil3)$.C8`NB'Qޖ%\yB'/$Zb >g1gx-e zGv n:δ 3L"S`XYd7dNw.+m,\N|TYj7duVN {i[%k4[ qN?5+ 6O3qq~FXlRi уj-͡8ͭYېl\^6xC^}$nv9Oev- TR+b4_E޲Vՠɬou7͸"LZ] #1enVС[~'E֚&UhM.mCPm4lZ\B[ا=6s:5?QޠS*m)b:eBgj=.pBt Cs-wS)zvg#ۡ$[ly|ZWBDzhqpfH Uoh*!׸Θ"C7D6N3xmȉk mFEzS#=n%۹kTZFT{#WĐs &yzhw,ް9޽iUh?!׸hpnb|/*rrhuD8.h"ٚ[M ݗ6}]%>sTzꍝ7+A`c d?g>ǵ;q|$w =x{h%b0oGs6l): 跉|%e`ۡg 9:fx@g2 PڎAN%kYOSh0K?5Jf'=טt0ې]v 4 1\Z H>XX ַd׌{֜Tjȍ=<ߢs3W#qw _=|B 0sY C/T; ͊`vb'Zږ0./|rݮ7ܑ7+ m _C{Ͼ/G*ރu>^gqsKb1rIa{/rZ-I 4O"ґ /m=I\;u]#ɲỵ[7dwE~^)?e-uHn/xf|ASYzewB6jdzzr}3ܔw; kݡϰoN!}}ZgtG"{ ) [fpTAPt F֋\42oA95"'?qdj>:=H%|&%jJ}}Uz,dڠƎB^V7#\֠2vjM!t\Jїa2o5K.Sfِ KJEnXJߠ?pu@/r]7YϥGqwA#5BНwaѽ ʍ:#C%JZ:.Y|/!qT n s ]kߠ%]T剉in!;7ewxȽ.~L}}-Y~X|t\Wj=KF:|gB9c3p59'G!tH%/{ _ :FO34 S8zJǞX/C\MEL{4{/|F}Wdu ]dž\rj]<[Š/Ɖ{_.SHP[ِG(sK/dD%͏:ngDjGsVAan]z$c@[=/~[NOG*w EK'h Î[7{N7?RƊ/3#E.h;]K&$Jg\2n3Y۰?k }[=.e H%\_IۙQFH+Jّ#m.>3r] v`#J}ޣTd4ޥ/~FW]@! a6vVo4Zv7^" 1j# g~\%g| }x_ؐ|CM yݸgp|?Nڠ2ew]R&B [Ȼ9c 49usc@dghw[d27XRs%Ҵn[t~CؑbH.dT,ś$uז􋼅tDXutk;r2": ۠K7drN{"``?EF+roa ;:݅pf0=$.q.YZ}|^f 5١1G5WW=jxpرɭcu5l}k ?/M[912S2١eYxf5Ar lΔ}ʼ!T,%uA/7tib9HsݠYlUr]B C%Ϸn18:n{mg/˘a0uk2L34veLόyą6( D~ȖW'^Awd|YmY"7';vI)1ȹh4ϖ|N~=sir6h'=pTNq ֵ"^s.?Vj>˽;3v*ߑAl ?Ұ7؄Nϕy'k ں$vy"^Cpe[-:c#DXCI~b0tWTN:tǀ$:}$F/`}zFJP~cPpָ<nJ KSC'}G;kN)=v* )I;TخgliEJ9K0 e {Mfj}]T0.#אW&_BFnY:t69cg|oED䆽k~9GH3uo/w{>e;xclfll>hmq Z[Gj4 bۡ?2ǥFlcCZrBˀiu"W_\"٬̈́%&b}l-h^?"oK{G2H-3B>?ҒB7䝎R3_'hDjGqbiݠ{}:eh;OX^FwKs ^nW"z)s=/DN 4\c:m95zCCw5`v1v)qB2KF.m#j.2%|(wYاҿVT\O> }8Q]Ia{{ȸ*~OEW;ڐsl,T"{E¯ѳIW̬ݐ?Q (g%ЋOCCm5FL̓Pv6p$ő:Ey[4"on3_3~Tl)5JݰKdR"AWF!@06LHy2_ ~pΑݭفע}ZԻ"_ۥ|[g0cT\n53D;_\[T֠[cD7gPH뀾!-cZ{[[k:T3Mrx[bw>=6`Lt.l7Qҙd{lJZm}t.i;)W7ҩ[a&mP^.oΜ/h-1rNOsN灜IA՟ꐊIǽ>be=:xsٸUIނpqdCVsؤC1&wfhΧ%zQ> lG-W˝o x("MSA43:|]1ak.Z$%[EC+nuF_)Iw>e=9!HW^t%NG=;{JV'N֡ä5iRȢ' gk2BAU`u$:Tr$U0};QCg:!'>>ְlx[ YKj/{G crFW[TZ?$g A:mKduL]s;9,\GlaK^Rῳbгf:=tV ~\=zc3+CNOb=T쵄FZ$"&.v&/ 8_4cd'=Ij\_->\[a ū_i膟T~Z)>oZ5q=fM>+Ԍ%{M*:}[$.ANeUO]nv:z4"H" O2\W&y2@Xs$1E:bifJ+yͽAk6Fm+2tLjibSüПl];ډx!U*(I]~l^rG6讀z.w7zK)[V!r=HIÝJB wDˋ},v=2s0/ɝYgzڑ7ɔ:2_Lڠgѱu8ݾ_DѯӋwhe/t Ͷg :Z|I|YXl_lrZr]Wn%}\bJ+eU}"q- zDV7 ̻~%뺂}j}Dt񻙆/TS+ ѥWZz_NEB^Fy H"7z?s-qS۰KPAτBjaY ;yjAo߷&0Gs!ﱋFfAO"(65|e+7s}V?]rE\sӽ6@E=ƀ֙3|2iz:]rCZC|tctѐ~#Czӎ> nA|ȣڨ@$CbkWȳ=:/g cm!@n#Ecћ}w`1aWF5+]B7:EsTx'K?kFqN]HƆM xHcyz 5J:I K#[C7eU͠C:lc7PņTe^9x65.A_׻5Hf%ƪ/%)@Е4Dus3d vhZ?n̙Tǁ|PEnraw֟{Q"{ю\Fr^ 6EnC`E^܂OmHnj֡ˢVlC.K\ f"ь3I*34tm1IQF74zd^Хfqa|>ylヒAfko7n1rrCAO( OcAgB;]|fK9SaZ,G ȂVgQ\iC=nzwu[6Dkk Hu|7G7zRE^E?):]eт7.C:8ߢ{޻xLnw/4]63mv9X=B>lwl'?`I /v,6)c&dʺF?|aWZo{q AƷڐ{dA.CR_Ph߽xA{OKpC_}k5vO@.gwͷaMAEF34ݯŒM"zo2H]w<]ܡ=nӢ_-A_[0hJ-Rdy zUC2bx\>dv}4`Kzٗ!{;vܴY?Z}w|ffuNZݡ5ǑU+> \QjǛVJlM!-Ϸ N'yӲ5;".cm-;48 N[=fn܉4Pkk"| 6[ޮG{Z2tO8Abr^SZ ȥxij^{{qTd^w@FFI/tIO;r\ jЫ9y,JKrY(`w n_αn`HgP'y{GUf{[z2!AG==[֬RGNxIz٠Gy`[}ե>3mad|VǽefT>E=SUԏ?f-`œ`EŁ !ǗZꆼ="D OD"D"ДO٣_ʖ"o0W E?dVh_ڢ.mukcCE}dbj[Dpϩ.vzM@&g-WJھ2 MP9KOa8z]!qR W#r,k{hr74hݡ{xzHݹnГϧЌs^!Əbu"`O/f̗CƆC+4\vK(a nXIwg ]Ms 9/!B^]6*+dXEK7 y_쬽N{G] 8~Ky}ԽIHyw !"߅ى/Ŝt_4[Bc6+Kc%ƤmS} /{}p-UL>C`wg;r]Ѓi6ޑShӗrun zZ'7kE)5K$V:fGvl KG؝:=UQo)/ =vӋ/Bw|} {~K~{43u;xgɇt dthl#mK~Ht+/zr̃BE?ƪyD 0_䲘 x兮r:g[z}tIU 6UA["c/lп|BbeIUݹZ>[)kj;h%~?r \DXȘjz5qHJDud^cqw&Ei`~ S2SqHwjJg)z4`XrbڀŒFwH8P3mۚu%R y vSJ;Q]F/EM yA/\0A#/rkRivy ?ϑ*rlaX]1yWVvC@TݠG0cÇe\i&%j\"|q6ڍ%8trCuB$9zVx"8bv+'b|: ĽSoHD7x h4dn7E;vSuٷ4GfB}Äh/]/6L75 bm{49zmC>Ӗ@eٍ.1$KE[rozUb}C>p_# '=kk/2S;c@o(kΥ"G$;$Λawwwh z\̑ϡz)nv۠Jp=}ЎܖnSl稵\5& ӫ7>mУ] =y_ Fv,v %]}H}%,|% FX3SݠMؽt@oAQTe;ǧWW6#dOϐF "5ޡh5l9Fwh<䩱ZG~Ji~GM_V-?&H)եw+ȣ#-T]=g; yJL#ӗ;̬얚!Ӓ\K_S+]e}J5f/ =" X{؀ʑZ+=o/G=v:U?\}xCmGȑh Zűs4ޖ؛S%v'ɽ;?l\%B/bا'!׫ݰ?4\v<_ҡ;H|a@Lߗ{?-;G7c4hF{FXwRġ nD*g|`#M6"Pk{6S.k<]k'yп ΙX!M&Lbc\]]Omh/b; :/2C|G>f/\{ժAÎ/vDxL&r:|ev7 f]͎4) i1r1;+\:NiAKYu6O+u{Rz~ii7.Vz^P4YbR?2T~ ϮdžݬdOGrhз4φחmP ~T:?b&\$nA8t#s fۈu%:J|"okm5ݢ!I!/v &;4\߯5|n1w9|%"f:^meJPdӣʹ{j) r"-=UNuܡglMB_O?\#NǕJΌ?n'7V݆+tl 9۱,BWwV)fi:ǞXڎc̼ ZPJQ2gh RpEN[ȳn;ro-((ȩLs1=^k4 %tTȖ Ͳ;_ʨ&++%! zNttcSoɳfܥ"U zs#\E㢆D.75rsrrw6IZ<) k]pXE.5tm'%Yae/Elj=ۦّKi[/v +Z2%C>lEn~a73$R=M2i,j=phj,tPmgQFA<з4.<c [+˦Wo&$ |F[2͟ltR :f9Ewn/t}0kjV#zzH*(a3N%ѓ $t}( ,FS0Zz@mC6b.>s4CuCNq>#r#q:{1 ] C-h`o!z -8sCR#qxC/< t~?/<9qt iSC/цܷ^C˭lYϬy!`?j(L6QHGtrAThhEbsFo1]9p c"'AW3doMȞn}spcώv[چ7*q-5 9\ { H_2 z_^}\1>}WAK[|`'Eb @Z 9G' _=f\,K/Qڄ|ڵF==#q^ڳDCH])oȟ(3I&/t{u yֵ ;/-iz!tK.01*rCuv猸ů^gMfhxhx8؛ol؛oECWv'gaWH#R8K73Ne8"LlyclxN×jp.Ӊ,kz*@2ayDBzIeo꩙AOz^WP3?ֹoH`[6-fN2xoe85=$gy> d([kFA߷";4h r> {Z;Zߡ{ 4zSl?xzŋ5s3[/whGk|+}mM7Aߎ`DZ# 4XUD澸ް?7 #Iw/"Z5-V 4WBNcx+kPj!٭D&&hn'~Ȇ22dUhqxc)b.^X尫hn|Kb_zt{{:ȯF/:z:@\wǮȈ8Ȳ|6l@(;I-5OC <]l4买d/kІ%|] Zr5{ =)4ݤ>x^+S?$=1tsO8 ʕhhNS>)tkY1+$Ypߔ |XkC#^G3QBN(P̓*idnG ؁?2E#Rpi GTNg|t6'CcþL ;ߥѠu}@W;| V-d ?!7ЉC zJLR~sh+* >[{ }AL$'3noy@3Kr\l_b k4(^'`X]IK iyjH·eW:RWU|<4::RI#pWh:?[48[%ڌ*b#СQ26>jwF"ywccjww䪯&?E@  1'ڋlgU׆r$^/O_[c{nRCԕ nLJM@Ӟ Wyd/ԷǡsƢ<5+ c|w8Tշy_]UזoO== :_^7uFIoWJta2S,AI۽CksΦы\"Ь頩w;u_cc_ֽzG65aȩ!.E)tK)]8"f̹q.iZ ]3rDs h(!^"V7l^{AκF/ƚAJ#D}jЦ;tnAtv2 RYvC06}49fuir] _])Iw YN7AnӬB3b{22i_=#e7> => \/ qb}s; ZhwR5KY zQ%XN5"dʶCW݅wkzaW ZQ쀞"~]T;LI=2%m)Yl\b-0CO5 &5;={^VgiK4rv4.z'Czq]Vy~=ۍݠ$OwP{;_j_%fд%JǗ%Ʈ>2JT1h9uUف܉!7Tb{Ggh^tBF&b[[iaO8[;@^U.;v]sƆYmmɊqHO/ cqB2ą3y Zާ1ڐ}<)]-MvaDqk; [;a1e씀ʨ;1ɀ2$+ލq%*Hg12IC_ߙz[32J:Eݛػw>Տ%Œz̭= f:ٱ)6Ob7Lfg8|JGkD< Lo;gZc; ڡϲCcPM-SgwdrJ ;GZa g47MIP)h%/v [5sn؉bc.h9 :LU*َ/kC=Fc2?#Uac\zKޗm^15hF/RSZ['/mqf$FRiwwgDfkRBD 5TO =/ [́ZYl{ގ}yFV{] [B:}u:/֠ _w_ :t[}nyY0_>ǰ6`a;tW㰃Lް#"M<&xw{4J.J |Li}B7;/r{u@w4?_jIg: yayL@_p7V$rGOd{ uŅkX 3UQF:kF^ocjW'I;v_U [:=sz|f~N/q L#h<$8SU Y.}4$yLMu>ߨȣ:"(^bgg@Zo:DLa\s ^ wU[kp1A|S`SXN:/ĮKF^uSmrѠyiI#ffh=Ӛ$x_Ř7:t_+Q!/<>vu$ 5묺ZTO!jJKq7,IС9- ^% '䩟v/QNWsJHgc,xb|r[h&D1:;띒u+M.cGݵ,nJ Keg{jg^,tL4dn_n!H:\zI{6$Of-T ]nMD?[pc胝fz;M4NNCk;I6V_kn*u䧕mKyZ>S:hIs?[؝Ai칋5Agx(5M cuYz*"d.\p zorJ֟K|i~\|]sNн=!kyN1?m 9+}^tBCh>.Lw&sAp)& ^FkXBI1`' نNt#johמ9U^v{VŠ*~]~KƋ@K ~2{/T/^oj;:iHy^8h2#^vh~.y{@O7:cLRdW`:D͉y7xWye?^qr-?  Oj|E˥VϢZOY5<ѷnhQlKёk۪ɳhmзO?uٌ[V->McT` ~=o.XyWSLUWT4||;ZLhv!d)gd3YrdGN 2ҼkI =+_z#EHڐ'=Α~**}[#FD>[,L$=DQEc&Lw`d@oˆvUߖzu >j'}8#ubf*Yi`+~;rzkrs#oϣeAt#mj$)r6rd ~_U_[W/לiDH>[ ;tc&5:[HOa\>" ,3_U+ՠSxBX'YvUcs0Q?MR;HSrnrld}/+8~Q .LN-yemF ]oB/-7׏G.Yuds>p@9>q ϓA3QUhQx|Cb/5NMrƖK9whv&=ho]i끝zO)z#ظb.D7e쩊K#WdhoӳKVzܨ!;ZBwZ}m(Q(B'T-6l1&`y,rbMNW'] twv]vA 2fe8ve"yG>9gB/ fX>C+RO[Z3Hbo=BK.ES NtթRiRYؕ ݴՕy?)3ϙ>f ț)= zRfQ*f0}+c'F~L._ET>kFLh,+o=;aSz_yз 0Ӂ|%CnȩBWDOt}'G{w8og kԾo[U62]aZ۠u;SL8"O8 'QZPīK!QdsvkJľe v3vt#u,k&FʁGt{th?nPn }T^8^~fHzNhWV˚` x=g&R^ o՜bוSh ^2qT; AO)0.v⽰ohn\(|<|2K&ҏEn^o {uN8-u yJ@6Ʈ"$φ]O)19^-v5fw{'2̡f'@@/\o#3kzIHƏǀ{ ZAB5dTw*#C{zn5dF޿FXKl9J'r yWE3%8[;t}:2o7ٳB能Klm7g2#@oX{¾IºAW$S>0x2ZN{7EWð5RHwx!Ruߌ턞 zQlNNНQFֱ)W[#6 վt񨮶oKCkh@/ o쓧B>&aޛ]1ܼ?S_,J } A1(^?%G wA) z9DG^e x wlw{W*ȩo^C ^j4\f]ł37M2oWGt`Kt[x}o^%:kqfnǵ:^kݜO=K"OvC_u{YQMl\쳖;UEp%o- N#kHE|Unl+lTNcIfxq 1IK-O/C/hEHG)Eʉ}^aFf=/DĄ?>уI>`B*6! qKsvB*=S8n:dC { yuFA >/=L-`.1Vg;lE[֣oȎRpBk\.EԙN] }G|JAN&szؠ/.ZFk=ddLBؓ'5ژkIЄn ۙI65o䇪sI5hR9-rB#5k}"'vNԐ/>H: Uݙv[= -,uu_A>bv~A-"gVgZaGe;|Z293= t?}<-1m{3eތ>%j_(S~ɦL8 9׿{\ \Hzt_XǾn8Sݠ{Vj toSޣHxmԙ~BQ5h}fivU:kަN%"iEOl/+DDn:HWwNJx2_Y;)/vAvo2i''g: a& !Q/lkmOqJPf݄η{E$Ƚo1_ 5.ݚf{Ä#|54uMٻ#+ R~?O79ìaD[;U4$*F'v1MY<5Cn{'6R;!D%Jԛp Pg .`㕶&d[˥v{6A&hwy7`\r kWPn?Хdl,ЕO(({p_$[̏Z>H;7t7b=/t rHaf|=]"W}z;o,ņlWCC7ϔ7-}?lk,lBw=P z@\Qze^~aKJ9/X.K Ŝ[4|@.v"Ymjv|V{.5zn\Fneԕ<96KZf Z삽F76VdO)  >3''tK${@ODVh3 r=zwCu>UQK nH= ARKɦi{]+;_[T:rT;ZM ]a%rc(hLv͑g'U儾ٟձs0^I/,.%y5\s&$} z#|䈟/u$)VQTxJRB'Z.󋽆4B^/ X+)diQk'DG 7S=ŷy(c[p;߬l؍O$mЬRCJ' ]60z"wpkaSANd&vֵOS{Ǒ7U͍cM5hݘӛ7c3_%Y@WS0:k涂_Q>zegm] {WnYXo][?co6{]*:L==R{>, C۽bX~]+ߛ=7cPtwـb͔{䅝keαae1Rps$SZCvpGQ=?[UP(鍽ħ:~z+mB۝B} ޚ\,zBxy.ȁۊ^J/fqZDmek9e%p HC =0type5u=sX} tN(a'u^|Ubj},w =cox̱X)c:GUF=GC"8C[t}ӍY`Dl f3w{NYpVMln+ >^Uthnn$MYnh̍v4N~>siزז1p]6CEL#eJ[ ƫJڃ>bn_sP L9a΍}^̖-S&[ ;eWy>Gzұ'zgb2NM =FZN]sHb`=`hfZ^'za4{f/ gT0VK׮=~YC*KWKN:֠7ku.{Bcv{%89Sshn\r>f,A|^[wuy?g 憽k_bj#8ݰ!Z~&]A'+}$Z2M&_7<7蛂yA]4DfϹKA.8D> \%ͭYF[[}0S(r'ԕ{f%vbߜuO\WVCUԛ'ԩY{q$W#[ "z"OV Q3>.ӗZ 2an > ܗevQFkà5Y"%>¾ه 0i` ԋ*t|.F(Ӛ}-=X^a֯ٳjSaDG BqiAbKB%1}^Fu}"K+iv^T:Zo%0cDOmB{$ WW&~57iF:}t4h@_D҉]cacv:|iUKr894't"uȫ&CoٴD} Lk*@1 Frs؝,)wݔٝ_ɻ yJ/ȡc;|{ jFwS'9Zi't~aB `-2D81:w| > 2vc9׸ v5ziʻ2GCIOY[Pvlmv`g,qѠ/$xQy [ؿV_K> ^ e2md.d qG!kY7MBsmؑzV'a\aX_!/kԾ2%&CfB p|786?>j=.Xv׈1Y MӯN$ДO=DR n*A>.trBXe0!x:ezG^;4O,>ktF9 ۀc|\Ft.j]M߫D&5"^?7TozX7c2?Sx\uTIׯoUrA`gߐq!ξWXVNj#gDTO#kb9rCk/fI_!χ:+ 4I[3vaBNP3=JARV`:N ?ī;oKr9tDF-ak0R`UG&\ ''Vq]6_ tfv"_jlAOL(:49rܔqcdf&Ƶz'o#W -%XLgFnso8uh5Rzj7lӹxKC5gKfL=gb:L6n[K\9nQDt~#k6ϙ4eɇF+t;GtfU+y¹YvCY=_# uXrc Sq1 XtxOѠ8XÈ>E*Nꪄ ~iTG6;qeO1k Ez?GФτxBO$&쵒"'t5*tq눿 лvZ=hWB^KVuA~Z<ҔZ<=&/o{A %CFL;$} fȏi~ 5%^lQK,#e|M}鑰KC^|z =X̡{g}wSڃ? 3lشx zf;-asq-\#[)5hS.u$XҺ{SP/VO4;eH1zJ@DiuՓa ? <#d@fQ_`+YZN`zY[Q˃Iu.7'2z@?^NA,X&OpN?L R QFMnK՝h}tX wE,4ExC2l1Zv#1hX9H<.8F0з#0-R/ R\T[-zy檙o5J 3#d36O>L󏷔`GvbKTt4(L3;|#ߛՠIߒʽar?g5;Ҏ-Zʹݵx跗UKaѳM:E_#x 2'߿&O4gYtpK}}#WhlF?)[CvtN_x:rAG3&O aFR}갭GsT讌*Le=oz%l\| RsG(=Rh^@nx G뮍:őT-L`W/S0I"F}a@F#@b'3#:F&#)tt9H9_LЧ#y Qa4Jz*KE֠yF@BnRw҇ե2"qdNiR$_0nWF?nt_6 /t'wi4 0t#yJ3L`h:]_ #HQ1=+iV5Ffkv{[&]݅|O"]-::R鄮Uԩ0h^-BƟ(%or.'Xb,3YG^FZnrڼH.QtޫJr&(>EQ2Oȷr#r;cwuNh'GjOWD<˜eHlpn =DFh fTDBt݇]cLRz,sl+mjz ۼ#c }qcy?oQLrlt:?Q]]r)m틼恗C/z\ޗ#!ԳT.)Dޢ%Ww̑vEtaZlA`pSICD;j'G/Dq:Fr>"3gxNqRWle&]F:~1+4[hC rD8:9sqsaDv~u~d].t.v oN/ФcAs=m>KjAbT:ZڭR3澲_$ؤiEejBa]ӥC3x2nIhsmA>v :Xu0hr]~5{pv~*sqD9󒙲g`1~ 8'rZw[72ty8g:Ы#{geW_(bΗbF%csttמHߋ }gfyAn }ވaSb50 |9M'h2ɚS$6RK$C5#g!'-zXzA^"/M!tv@׭-y.N]`S6K Ru^"9g|RyVE_G/6ҭO ,\| ' )AgZq_GIh@h 8asI|lQ`8蘬 9*ty=={/Bԏg t׳ PC!v4w^^̻:g]ʬA1~LoB ш*c[@a6o1j[R޿S#"Z45t2_ y%[_}k}@Q-Ai^w9NijV#t>7R}~RnV{R. zaͻ{U S}-$L0cꯣ0芮['cD@\x6Oq{i!lnuF"p#C;2fJ7Q 14TGu X&ZDz)Z~Lk\ԡ<9j>O ZHg2W+]X\,7XghT}hV໳ZH@0n_;p8rNwiQzi{DB:iPBWRBɮh`_jy]EqCt }B']1:Y,/5Rtz`i[_|wt [Ԩi~l ^/p1=QnWtS4umq-"ȩ igteoFX `QQ</Q_7Gð']/F=#:AGO趤ܭ / zߞ^5[/mrgxa"zt%E^ˁ||I7֡.4H[C^lw=S4~;rXu%)tNXO4.)g꺐 ntup);Sr…^9Fd4h}*^ `D!kwz)ս#wvG`O3*JD@N[b0>6sfGs.O1r yTJ#fE.Z]wTFxojtSJ6w?]tLBj.WOT"yFCz!r`KK:t]c[աW;AQ\ğTBxdT2u?]ZeWI *҈"rOb7sD>7W WO䛝qM#}ߏb̺㵚#[]A\S==-8xh_uT|df6h:2*Cс'\M6F"Ny@2u9˯dyPTzrDٔ8g(s2yY ߵ4bb:tw]>宐 ?dMtKŴt `4FP !FC.2,险 j#FEYMߝ2$A#&z0K>8\{t0Aw0|ge+1ȷ(0t@nВi$L_w ]Bs^s.];AܖTm>YizIIU3 | us[R~k\yy~z슷"y@JC_Z/tSenxx59^Kl8;]F=-{Fuk$/(\|yj) {BïWCqGO9F"trD/h#!CNH}Bp׼}}{ES('}*Mشc=_..r I5p4P̻y@nS:yU;u9@7 ~[O5Ki?i@ gI@,b×[HI!";R/'Kh~rz q,ؔ{#N]uɉܟ3)h:ZWhbcCxA/ ܗV Z>k^yr Wƞ)޴:t`$E2?KkENn =TBxIun?ay ~|\.U2ܿ+@!'WGd'~/ Aʷb_mmqՒ= g4骉Y{uP%hJe99TSD~Z_z@׳MvrW3Lh'7CYspKA̍˚ A49kȴ}zdSu<]S zMlH<^'ȷ`dn{w4z8H^UAg>YGzrE}(I3'covhnb7rd|afG%s_)tNM1 KTy$zڼ}bSv8=)rj^6苒*{yڽ'.rbv4@/O_;r1QV5& 8̈́/JT/𚥔@#V6,uδ~ V Ij^>f* a#8!z oo*B S?׋A(+ %_GR7' ~D"ȊbE-Ad'=rǕ\ 5BDf{U "8;p{N 0hu7 ԣ.e'1"1V*sEDfq?湬"G˺גkbI <]!C_ϰ݆P#?5}KyyC疒3=#! _Њ|lPzuFOqq[n{2 DI[B!8 >UJTkyzڐ{Ļ+*qD5g{DhZ>:UUҜ*Zh oYfybFuN񒰗sͱؓS{}vX. ?4w#9BwJ<{l3GטwfK8^hqžW8qoӫASWioڰY}'@/:Nj5udo9{uG5Y\-ُP?Jq(Nxl:tj|ЏO"2#/$ T_.Y5NIްYKMK9'V$]/9cKٯo7rnwk,ݼB.Ѯ9\[?݅b a@=5:m>)9y޷L/qOׁ,"Y ͅ|Y7Чmo辦!6+!kq*~Bby/sW.wYN*߉]$[}^Pc3|^sCz,.3gd]"coT*) ȭ똄};ٿ%^]^9SN㊽T@ό>6Fhn@h,"Gy4z*y]knآiN[&C>r9͓ E3룛 `_2t)Cg_V>N*3\[tiu.uF~M Pǣ4dV9o$q;K@7`l8ڍvTtn7~b5rlֲ4n2bF9q|esF3}5;T }n|+do @ ]TjPDth~ґ,W9 1Jk>Xw/_/sGu@}ASz@E$|q?Sh8-䏪1aw8@M/9%=ra^ghxЬQ'r[2$0r剱?[c(FkrQ^q)^'{L 6ey?͞ݮ 7:HZ]>t1^cڃ8ˀK;k|^UFH|gy^=҈.Ri<;efv9OL]Fǫ[ }{^} aڛH }bXΝohR^jB@35eK'1IP y^-2sY=@.Y@yiz #^uGvKFyïeais *!^#~uLtwlҠM?-2&% _[LI@95-[ġǚ򚼱9v0&3P#Om{X*~@o!=#*fOO~in{O)ey\[.];4]H Wn*}C5*`עЎ^2ȱ}H=Mѹoc;M*5n&r{?+i,${UK>Qs?%!g^ rgMOM/Cty ) Nv;U֓+HxwAHL#]u]IXM9bTA\;4r~v^%%+v V3I*=r% A&^b[.өg=jȍ)~ ׸WÞvAqm i3P,LuybRWۺGLhz"OIߑzE89eDh]Q%\wWypNV bNȰ-ݑ##Qnw=)׍znW%< MR@"K#.p&>NEcv|qw)b7*ҐTxZ!pgg9.ZE+d!C'*00rtNugVF[|1S. kzݯ{s^?e9C^5 {eL; hЌۇb*͠Su1m$ha@34>sp2N"LCFNFSlաsDsǎ2!d"tv@ΗPzzmR])(WޑVvdG}uuTz,3Nf9q8yS~a BA"_h^zڑ^\3V]=Ҭk\j_<)uVk:ͥnțͩ!d>Ybm{\d?lI\Jz l|)F|@oAR#4 Cg.y ɗ^/IWqj#nzBoZ` g%ȹ8FFCˁ|_3:*r|~<ɱ)Mхbb䍆=0:A\+!wrޖQjrDWɁؠ/ƽ }/MwOp.^<{F^׀"'~@)wZnn",֖{ysQ~VNOX@F!Ydʹ1%뚞bQR;u9[Vxs܏nAս"gS~"w&GͨSy]:i~|u{`"oD'`wȍfN׀v]ok ( \l3Ls9ǒ(>6 )Ӂ|H!uӨ+rtIvأ؊!纝끜bX.3Es;-2>q[@'m:.@k| [Ƙ^g.Αѵс/7y21QAӭmSvW":I,w/||ٜshʐڜsƮN/:d*%c*CwjN/myzǸ=9v 0ץq]`ب;҄lu^2)>Fݤ )D\DY׸#u=١vԃ~X%'uQn. ]{@/1!tq:G2InW]ƿQ˜kRЍ:~BŴAC+ W1 p$m6;M2vJv:xe#7LLhb5#S/(tzY;ve |Ix AڟctjھK)RQ %>#Jua^}ῌ?~&/UޡǚTz~YZa._ƷV)4Z}0>ɁEr zg!\G&oH:=p ԰g $Jc_摔vXsP'CH ^"+e`^sevٿx>=5u?3}F?Eka+4o i/zi2C H }n1WZ ~edI?e~-2|Y_bīتaU{U&NEci2o__8uQr?ڌVaDT, ^XI_2g=}^ E-AO㏊<)l|K('5&>JdV>2C'/xzjқ!Yb kNqZD1^vuh/s<\z8e_%iB^[Lܚ\2u -Gcb#x:Z%hE&K ـGY}&(=]%F#yFsRqV[Z($~w3/ޡs7a|"UM mȂ}Kcckd[<{ޔHԐ&5)E&v`;Ll̾Vey-:CKePk_>pM0Wˣ.TרQSkxΨ f*ߣ&ԋ;4lU.,H+E4~t7&Ⱦ 9EO΀Ck_'[*t^R2}y!yz x^W}QN*jطR Irz=AZ7X95>8;7E^xZ%7Pf1p1lx`ϔ >!3ƙ!4 W/y^ʁ$XOV\.SHsbc~A1X|O;8;vjVzOr5SYRt\.達o8Zߨ"8}}7s@%D{'ZM)xpރuK/kl[ TCfg)ϗ'[R&*rj9*K!.V䭿%uz_Z ["W Lsk N^oY[loM5wBn$ V6~di&O~GB:. O| 2 o}UZRvB_9[;rA}oSC$ ԾBSܚC@O@)zcѓ0nh*RF?Gb7]% ^PG/JR M^D e@p݄-s-;!Yٽ }x#\F#t^$qm¾Tln[kz { k/t[M]GB8W4AJ AD /DC[bp[EOu2CUrGiIdm=Ўu iR :yyV^ٶ䣸Yq<+/rgZ4d_.r\EK4FA7i;bA_^pxzRTfCHѵ+L]:,q?o-|DoM_Q"_7J"܂|A߯#G'䎼L>/V{UB_n겹 驩¾u԰ܨ|S}d^"'ȒY$!N8MfL!L̽$_ mr ϽQk!0\N<&KMYc }mCPkĖl225kɐ{i.,t d. 9 =O6Pqw}rBUYgpExcCgF@ނTh7(eG[ s$͹ojRzw:؍4[tW4#Ksd!^A>Zj {6WW6ʳtFn|~ 'RhUuTcPr@F+j\Mt{s;L E&1*ug\m4`uS#A;ht:U6v ЄsŻ-`7r y}e6l20 M%\% H9[. ^[=<_O|@/HuזcI74JƮI}OF%|LMbAȷJ#dUnS`sمryy)>LtKlw3~au:7,k/QQPsƗ|SpKͽ)(369`</pC#EVVUԃ3хHSi\-X#KXwSH:]G3 aMlNmBz*X@i 4l+6E(p,2[uiWG=#*|;zM؀>I[tǀ^0}#\w)@56T*.#qo]] knl[QE49g_w(r8~#/d[.F5oOoD2S `C >w oѾZtSw!2Z@9 J UetC zd)HX^Lу}_a%䠮9BckE43-~!oR>ŠY]qVhFlv#Dt /:4ArOxI+э9ٵ^ft[dR8R:̺=K]J&lrt 9:t A<LhN0@]зH7C0&ٵC0x^ tNHAµWm]zۅ~l΋[Fh u\:t߅J2?tTr|1nL'vA+],AOZˢGMI1:]9"MLb<Üͮ bP =l:*L\Je.샜r-S$ŔH=<tS[؃:nXߪaWG~̾:Jй=mP(hҩD>BbN՗k[2)]I/nyu+l)L?) Ѡúra1vYBN=Ujd,QG59{J<1Die9*L]< *Qkf% ?*/CRU7򖤁{j6nΘ"ZRт/"ϛ,܀OU].j Ҋz3u;xzuuZ.}[(/]|-92GZv4puPlUt 8Aa2tvA ק Dݺw'ݮ,]Fpki*3N݁^k\w?E0l$Nbϻoƈpe҃Cdb99 VG zȘKS ؜(FdQ]Q!Epv۬C`+x^?.-)9*B/9uyR\^C_84UNq @9ߤ|G}4]ɚ6e23E]4]lJ_Z 3^qfmNᆽFtdMJ?K̬4|Xʔ#aǰWݯ4 {YҒ1/ 2}]׍%1F^ו2+,9N`fx /-HaA'5Z#4&Cr|>GU_OoÐi6 }_t@lɺOd w[%Oq>e:>@Mote}üX˦Q_kt^c/h\GL%4p+<{owEzA'wHv : }I >(F0:yD6{]F;_{H1̼E 9ڝfMջZf2`mYbQڜ} kN]: ZVu݃FS]baBm]m_J^v|ѥa]y@脑x 7 9c7r*wЮyv??%}tu]NԵ@eP{!Mٹ.9we=zoMֱO]is%z. ZM"ʙFΡ^f n'p ,9V(t7#uo=d-"s#}F5BѺneÒ\BN*?B}DUtGQ ˒|١?5DޖA׮tkBi-OoͅB{K&y gr[F[VXl"RC=\O׬t~,'U3D&h_w3B7M Z./I=9=vkDxyۢiS]mI۾ѠI]<{Ӯl.d%OUloz#h &t!']@{BѢp"6n.0Rq_(6jd(7rY͋֠E/伮IA4[^m߳vYB)z`!ʸf#V4ub'΅<]nw)U]ۀ.[z-N3DG^P0dT? "ѡ3F1zzQWso o1 W5dG Pȇ ;{oBi襯( \%y7r /Ȯ>_>pIkl"uk&.o[\.Lmq!4g- 2Bfk4tF`ﵷ _Mˁ.y,4B!%M^"wr]ȗis?F\bqۼ_1̵#6oTb. &z6(r t_2^*z{z$R9D}(+~ZI@3*{Fj- ^w z`ȉocGW.'m of$ME*Wϰ *cMAޞ6V0M鑃qI\=o:~ASH8ox)WB7UoyϜACmRؙ0<]8T`eX z UBT <aBA͑慀}27g/9=,of@8·l%WA"M+g,5ˣ@tT_F5Ƽ;f{"RydO'_Qp}_M%\ȩ.C;\V}R FBU7rIWv] u[Fs>i_a";F}#/8tqc;q>d/et?6Mtj5=-#R~#~F2 zdFqA# &BAw9 h63[r/]%YaxRѥfnD F y?",ꡍ{Whu}!Zb՜_=Bv*PizTDrt978 ZKo cd3"q3Yc/@krWC -uK wݬ|qsx)f-.fݪr!Uԧ34%z6JCTB.ܻ_%B=^"gvb  ^OP  CNAP!Mqnw} 'UYnݛp ]CB2th@"oui1K.0Dž|gY"ƜYm+4f}ѐ#aFS_yщt: _F:[GSQZK5(iؔh͠hL9.B_<ft9SݨGtMo䶺RYu8wyQ}c苁<ᄋ>sFcׅ9hnTvt t [{a4nq|&.QgѦ5T贘/{ *}"gLu]SIj'0ґstB|k.6Ur.;c݅"ɻ /=UƸ {:Z#P'N!Eꋠ~ozk}mP@?G_.9fB]stۜB:J;reWWf}i7pױ%$f ͦWT2K9BzvהHW "t@')@7ZQ A_J7.PM5Zm=]{T6z2Ggy'Q#t})AGNeZnazvFZ ~C>ku-/.͈5TJOn Ԁw;4ߣ6^G"Ng:fMt=7 ^'}X=w _ӂ3Ȉ^F.+4p d_63ޠ󗒲): ။tFG.7- 4-gGج]>9LC֔0__稩A|/k+6-t2Hr=bеm -UVqzzW5hRg@Wj^ٲ3޺X`FF86T>Nu GGjnyKҕmy}ݬ#J蛇À|sR L]|Z[4Pvՠ偵:4&&I fZ{#z;.A/S5ˏѝYW0+C\?bc2t$QHG 6];R z1$5K U1sZFzAwKt}ktv!OheEgtzA+Mƚ7rv7 +65ͻ[#;|FG;KVVX\"]bRFK{#O`nII|<$\@ [2"[ 2 IZkj͋U\KԊo{h]: ^H& K7[#wGwt:U,[dy"Fa:8R\<ߠo30qANz ~Cv%m?{r^*Ei[Gru^Y#,6\ȉ" Eo㱸ݠz9CN)WOeJ뎸ѭrT]y1_Gp[A/pe[o&e}ΛT肮@^g1 Mqo-T_oM!+Q]/i@/O|#ׇ2. 4,:Ҍ]vC[A+JTU&{  iޖ6Wr 2Jz\cqכF|ȝ:VшqA!9ofS]ܗލat]Q9YJ߯Q2/M2\ bb?]R yr!ka6-1ID.و6h.qC½6GuN:کnCS$m 'f|!Oc*..&`5.R][ѱ ˯swh9m=dV^/<2/.TV@/ୋ#EGCzLb Г/lOBa/Vu : zAߧjcv( ylueБzw!؎ {?hGa?&3 ϳi1rh::_y_1VKvIzcu4tKt^ ˤ!H+yQ$e3ZqEgt[gз{^j!>TF.M9)14=t'X}+I;M& Fؗ\ x_$;C~C /QI|-Ast.# _דq U"tV-.2MnmN1si^ks~C߇j+vP|oc]%4EvYQ#E}@-Z .M|/.Hn].LOvC!1Z5Lrհ.cuw*Lo7Fߕn{LN--d4 ŏv!]]->+tkqy?E1bdGmbt4Nw>\c}f`lYv}/Z@6^dyi;"t)F ۷qDEM^{8-]Qm.Aved Um}z$hЇ8V:o 3GH'ɋXszq8ֆ]vA{Qj/N'ŭ.F*|"MLd??{zbl tg1Gô:nI=)eF5E͋*]'T-:y/^?6o: mtn_nYޗ~{bLl h@[u"ԣq uh+^)o51Ro_辴oIOWvg'Gt.٨\¨Cڎ@ GCDb#Fq4Avu+UlE.*?ޒ ȅ,ұa, z;}#86.&_}qxbDKef zdD%eFv^nOseң.]7V沁 ݣәYiiҍ PSvaHYM3r%%3?; JüQ Lzv{5Tk\eC;׷D y`f(t>{&_Oϳ)F8ii{Z B_5Fn6ko1=N-S|-IO.>R<ߧn:Oe0Si4E^"_KKxz6{Q1ƥV^:T`)Owd/ծ|&0op]Gyt`q5p\~ S&&ʌЧhTHàS{ 0c }ߑxoY6,^*=2Rn@ks Vz]ܡTc,H" W+]S#I3|@!`u7hexi%MڠG`K]#$I[i?V7@NcvYz[}ڠ;"O4^4Ӝ~䑆m"+sHǍbFкefulF_ȸz~"%VBJSkuXoZT -*̀Aͯ”hx 94g7@ui h".ƩK9Ot;,Y0l==VXy Yg@NZʏm]hU2 }4ot`oN_] 3:Q@EFm5FD+9旌 )Г}RzzDlt*oOGy]];t;JB~Gϧf*.%.]Et& ]Vhw}i7_h7KpHBkMuЮ7AKRA+讼0n3ٍEn]nOG/3r`.|}-3a9J> ±.po1Nƽ$1pUXQdw GHlz|&1w/=DfT1u: \ (W+Zt١- ;׻Qî+RuO{[$SQ8@Á8J,|[5FjhlY:%z:c\ +Őv!wO @:ҼRX{0r mv\})K\W7 e_@o"y : 2.3 H!Rް|@t׫iFnБ'EBiUҟ >f_~BOt*F^np/ϓgnuk, 1 Izڡߣ=}V".7JOWWG%G*L+m$ 8EQ_#n|C/|=VCZnR'S䴱꯳V0{ -7Avnpܡ,!?ƎZƃ<wM@!)~2TsWDvT=imgA.FWغ,zy֠tfd&)b5R9wPkGNhM.wt3t5]Uo1)4 ce50jNGv]]IGG@_=?bLw5^}kqe.?@զȵjs4Q \/ܸB -~ zKMY"CA.-}!k՘{=K^tTj\:Q~!_:#es䯲+Rtr!ׇe ;zs.)|e FB 6Bsu;"ql& V.}uz:o(\Q0zmK xnR7t,ф]V5*aFm7r^G@rWQ4#6z;IA/IL8Cú~#oO!4n|3\D_΋M ]qY;%VwnzCsgr@' )r˽]J~!%}=zW[M!}EQz "v3J>N뺸F.-owh+bUb_\k"g:k0jF^[XbKr#'Yt\ ~`.+%1he 5) q} VP#Wwt1=ܢkTkiq0}ʸe70: 9O>( nsn` ?aEꫯ 2AJV Env#/zs2}sL\aڍ\N~ND.B BS@`K.376wsS[+IiZnWTK^гžb3J/NW%g_BwSu4(kgg_.Rvb!~-7ЯWu'T/趗v] ,w--.|zvAtRאO|aaҫ}:"v㓹==*ͭEJ/^ry7kN<֩]/SrQgF^C*j@nI;A-MxQz!.,̺ϠlqZFF"ゾIv ϔWE.KpGtf`8ҡ3J4()A:B>]G FWhbgèk[r+?/rA_biʂt-I43o=x3WHuQt%x"7r^ F3$1/4CH/F[ch'1K0ꄡGFuIMBT0~ΒzV_i\NWЂK O) s.Yi!k :2"^}3:Љg ݂ =3]sG]Cg5=}$rt7n9P?SЅSSR.ZؾB>s* uͽyW+K;\`}.w@SIU4ihO& Ug)0nMW {,A:P"2~"׸o̐WH6]xɏ"ה2D2 .ʏEvGF# cU胻{[01fina|]BZкu]9V/roȸV'綴Ag5r]ȻrqDbu5nm-ח; bdՑ)xTR`'@"$Ҍ\L08giҵ_)9 Qd<-#|-nޑ]D z% eh W#\D#.v^J[4LrTW}F3auʪ@'~svts1a^Q#ySeiYXq5)T^ݴO)ܵ^og+]hwfd=e@GoLAM;[< |r!o[F 7-iߡ'ψ=ZUC#`M"~.͗r*Aؑb a6o[F\b\pP, ]O/C{ZG5jA+˖YxWtvAoE{Ynk z}V豛ܣbyQ}x;̬Y n)O0,OKuAklyfHB䅻 ;˪u7h^78h$ZVgo(aΎžb%>&tA׸7 [Y?7r<'6r#uq~'O:*rOtb֠@эGM4kݛZ}/v53葅R@oȐsWw@#mg,2@Rt.^{G:qv ڴ\5 Ko_GP&dƮE/"h%],YFwhGŗ7C/JGc˼RDFҁG}ը VZRc4N'55:ry |w].3.AZ] 8JvA!8mL^*6;*]-4^g1*r9ѭbݐǺ|Fu䖴9`3ˋ&%aMҥ=: rtrYmQw4ё]]/іf:*&ҽcBkmB(` ϼKYvFػ3-| h I?6zS/PxV1jr_41jI V]H]<Ъz.*~#O)ըE:H2^2:2!}-Fm=$Z/뺁]uWluWMF^,^G#w-f% [؍~eDvN]yّw[LџSRUt|!P`_-J"_tu,r=(45.5E%dqS_wy`E.ק_jo^@Oҟ>!2rխk\`exR%9=e^LÅio6j/v~Q3twѣ6tqN.Ѹs4k c5UfhKDcg+tE݁>hKհ5;um9* /Wz6H5Iq]ur8RRy{LBFSzҠSCwC,]ӪBu6>!WI=3\ (_r+*2*#[᫘΋ P [HsSJ#}5a2Qdbq[} 7p׺7]gZF~旋`HQ^ճ\Tm~zAkf 9 rR4A'v(U;^}ѼUsu=u^m@7HfҗN%F4֐18aq:;:#~L5-9vA%[ti1z:n?t~d>c@-.mq>)[@[FgG]) :{Nq9e[.Kc.&>/n˦R, -$nA a}Q#iS oܱeDž\)i.Jog4ؓbv\ R4Wwp׃tk5?o Bu1ٓѦV u^W^c1q_96owُL7EuI9n|ܠ$Z×?]BG[*{8 j#fۡEjU pڨolS³49fJM])v!qf0hT*_eul1ߵ ]vD{v{=%J&KAHLҸOgy ]skӅ[:nfĵyt5:"CF~K a{DǍ[9GH~!9]$9>#vtSq.BmK32ZSc&슎8E4@}xsu[AFgt CCnjIAn1ao5t]!!o3~>bDjܐnF1nʨ=/ܠ.kE*tvk{˟Qgf>D5}4S槁2mL:hR ]i6x*+f=/Ax6o?K,}s^TUGf >|Hg=Z0JfГ+[u?Aރq C.l6]s#s0v;Q|8A*lywUZې${gGVAKjj:+XCxz&0Rbd]xs=j5Fef-QO4gqptKW㵬t! "E2BdFے ۯ酜!D4#`Ⱥ*!Q̀^ |α`/ml\T}Q/R3SHb7ۘ34hɀf3PC P3 o)IGK` {9W#݀_$+58/y&dFB%$&i%Rm/+?j ɺe1r5lrڲ}xV~[}ޢ1=3aȱ4u_B^${p!5  xd',X^4H3D6=_V]kmq`yOo1Ba?,r^X#6H_&ܺ#z .W Q!Lb#.Or!wy[GTz!G( $?F轔Bƴq'JOЩˢm=FWDj5Õxq4oWW}o  ]E@7unwӂZeP3Ѕ+W}ձ …nˬ!3k?[G|t{8 h Rlw}m7.0گPfQP^ Z/Dȍg`/1{s~ʏ)7y: {L8k6# tWJJ:û {k#oXgאj>c^ РnXpx'J.j{zAQ'OI/+d3VBnA_&i\=>PP^yi::47'r %*K .BEKHa@˿e_Z}V4Wt-l#$ݰ ct},z/J!`ϻ(F>2e_LF[zny錍2٦Bn$ &~^4:.W[ f h#9%]#)u)o6)Q^ 8[GN3 43 =|=QMþJN^ ~g[ar5le 2R]Zۅ|jNY1ˏw#h1ά+2m(?ι>K#`93"kKM5r!&ޕr`9Ew~C5z!o?>Q Uen^KuC?W`[ЈyTAh~ButWTj.-(.%FZo[,fȢ`aշHw |!9ĠCs;R F{DS_+ͳ,#;ˀ6 GRg\iq.Q<3tzT*|ʢsh4Z@f|1t/ہ^yy:C;x0z~5zfh5&Zt f,"g>W.1~AIu(D]#UB.@\KԃV)2٥g@?B Z%4.c1ʸzGJg\=g]c@Is =AGF^<6r#=T+Lwz]e} +w ZEm$m 纖A~ h>:EduT?yQt5o~"oOפp?Q"-:?)m}5ɷ6iNAVqTExhyYwQoXޑ.t{@skME\Oc)ϺAv׷$9{\o /+.(zz/=]YUًo了#_DNR邜t> g0Bw/Hyb5ՉoWi_j^Zi4CQ0H^NHZ.=jqKԤY 3O9܅<.7r`sw;;_}WsVh4rA%ݑ?`w}#ϫmr f/'\c}M gF^֙]>'Mu7v˗7{α#ׂz֛9@jHw존dq;#-ZNii/tzc{;8葟z = oG`i#aϻV%.LG Cg0K0Z~oi$k۰"7vV~y쾠b2%6i[):jGנ2;:I/sUۅ S~ ӉD{}ڰL|Kt{Jd<0nHٯ4ZD"r1zlz{Xbܠgv?Sj4R6ٻHS_OrzNt}ݥ!?Fd*0twouP/Z(^:)4aŏJ"K#%0Żոхƍ\ Ox{}8sGF΃/R42K?9*~-ykaAfk$ 21ݩ-)QN8r ΉA9dq̜2rl9T5c_sFWJkܖD<Z؋]8h[B3.RW`rN͵304/ v =څ\-QɅ7myK"dk .%IWtST^܂oQ&f{MMD9ef-z4:_9RaCFe\G^9Ru+4?ӣqQZwT$S3\6WWIgW;t<R[R_A7] ;uɵ@ *o^ż/O&4܄/= VJ+c-՗[;?CgW vd(1ԡEGjt1]tDԢFL˅ܖ5]3j=8)) U*r FJ$n$-FZsQV:ӱKc>ƾ$#] 'AӢ$]r]E]U袮uyO =F'ˁNMz ݢ8 HzAU蒴&{ENEl~ڈ#2HT/}7[E]Ծ\$~ݽArAZ2r{lNq#wKi+PMCɬ2m[Bm>*ig8wEL*|0z {SWK9-t ٍxkb){} SXХqc=ՠs?;_FCIA098kap>a0Rrv!G3u-C\䬹7!V!iHʸ1^x>1z\貏&:l~!_'FG=%hrA};j-Ƽݫ K܃9ޟ'vAwu΁ι/ =w}"؝JʥwM?euGnʕB F>Brq9.r:%E];q#.t7Vl䅮| Kp˺$>SX}&.%/T?SNnei[F+-k:<nbk T+/3.( 4e]҆5d6@ R}Zݢa@CLs8wuj݁+-;PF҃웴M|K߼qze#קUQ Z`ӋFL}31a|[s[ftvN hի)4\ kˋez ̧}})R wuS.F`yDp1It tYY:,:}k}i&C|M|s7~m|{t;CgD_[>'}٥\xklCd;=$k,/*uI4ɢsxQ<6!G\cA CY1#lDH$ @ooN[T*#0;*; 44Q6{DU]u[yUk}"_zɹ~!ET+rG?N Zt}#Rs^y=х|ʨDk4]ʑ0_Z+Y^TXCs5Qv)b":"ޠS]*T/ߕި94[Kᢃ|D|KF[+Ic VTxDhL#~NוuY跀G^u-:2v!o!4d@vim=6Z]Pqi ľt)fAΫVw@$;a?F[n!|Gu ʷn(lю*^e,Ѭbf<ȝ;R>\^XMLGxX+nt3~<3CՂ :YS:rC´%2|I~=i:ںVkK'0f?;$.BA>ߡP3ݽR ldԣ&%͞W?Jo/ݗボj'g9=.P〙 z`s]*uB3miгlOeFmo(ul)hw_٥#eY ;?D`h(qr>k_-IkfDA˾D4ߘPn݁y3ꍽG>ݱ)$R}_ =r_I^j2fz:w#=e;oya_|=uj:@[r}2ފ"g9>^r*t};kyߐC}C}ԗ 0|A8!gl1͠oaO-njMcF%GMӒ;ӟh_:hG_kνnP$1X[K5:jh`yq¦/켸R3DtQ. )h2=x. &ƞn!C wmN5+MRER9U)гƵKz[9rEHRKOb~>2CiM.cuf_cnX(6[uvAWBr`4/&]:} =CfZ۠jhI#vˇPyF\Tmw"$zRLza{j@_ug 9O']z]t3ڙSYZ4i!gocۀޛyB ?"N/Og=(X=,]`f䜄 tQMJ8\tw/,{ EhFk G 7͝O }5B#?V}Y:;:Bqrʱ3_^{ΠfaJZTn}mwJ{Pq i>;e"ֶ9u5F]^ȅ"`HO/I /l_ `U "_>%jd'MFC7vM FR('p]r DIj|ĺ^20-RqAg8՜/G/.|"+e u\n?aFE.0jADGlC2E!hw$Ӹ(*#SOw/tpm|Gp]Kd\@T.gh'D~l>3`(ud(7;GNBO*F߿S>m>ӗjqͤ /i*KR1TD۬U؜+fEa2G9 y KO[B;c,(&2'j,?^ѵr!MLgA:BhWz:eagT tOd,OSGDbBL3BBogYwXG=B_+{~<=%CxQY݁.1ڝŴu.ma}z*րf~RK꾠Xt1Mi/;@@'\W1'kfx~=G#?Hah z^EۣQgUZn}|je,]"B>=LGVB j^;|dO.cB4Ք^; mhyp-.]˺/qc"Io5z~ ʯCLZ\H Wl,Gro ,|ۼ@][RcyiR 2= qI"#cHQŁ>&Ug܁x~?>?zu#Tn{ 葴J u~Fw>N3/;Do߳Q\w[iBoHIKU:d5]Lߵ@NWNЛJwVX }ۏW\D1fPkW«zkzS`al7rYjȰW)y' Im\r!ݓEG> Д#E_kt[Ei\d0F<@B/%3#_zP0TI/c rv 8_%_鹸+zv%)ޣ#zFDÐQDVK::-@A.0 4"tť]}P mu\뺃ѱEKV12pVurAP3مvuzC`I3![@g(Zsso ?iW4EN%W< @Un˾5w {#%ji@J]IݸCALO_gEg13n5ὠA+<=nkQ*4 85vz9T;IMβ=# m9/"luCnwp_7/S{\%j]-VBs-"6prxwfP:Ag[-2h%"%kJ8/w*N`#G*rH'p/-B#1_r]qe\|i7Q9^n9vZL[t\z;Kl݋:Qhn=2MHM3| ,JO5 *㮺ۜYzt䚗["RLyz#[Utjny-^3Q^w?m h" U`;S]mQp`'4Xb6*),b__؁ީ'Nӧ?!g/Y`<'(Ь#0o䶐w.\~}y]^޼kGў =rAy] u"hbcRސ_ jҢ=]"Y8b_K굛Κͱc^/g>{#mF.K; 9ǔqG&ѵETWLuqD!BZ3u^[ԥ}FV6L`QneFZс Cwݬ/*tǮ-6 kJKZ]u#X-ґ~](/yte1)gQz#F4x BZ _ƺ"_+ުؙ-|Z26A̍") [5؍[9|}["g$5v[H531z[:{TVEnz.p;a h" =r<;C#oX4ޢ$[J}yknw{ 5ͺ#4= pОb;7~H*3]Pg|Qhz:{>-Ze1G /ٗhb󫹴7#JMNv].5"`jjȯb^H }܅byW]ut.({=Z拊=J*nu>&݋vN֢(D73aE/kFąkh7K6Hiѿ[Ŏ-5-ʚ( 5. $RDžꮫb6lR/ iqr@#C6}/M6!^JoG nmG#Օh12/=3Iuҹ)AxAbNƲAo!IQ$7 :,}5ЮǢo3=,4FqRu#H+h2Nm-X%ɷ]].um+6YkгsxD> :/xOUqXS/Р6Y~zN.JD'M[QrE\w Wkaؐ;a0.Zv#$7 ѧF9er#kf ziAঐq[<9R }Z]π`KT#7o+t3 5-kA9⺑kPN䅡I/dUo-GŔ"?АA|^Q=f%]Ǎ|n\إ?)u%<:HdFނf{@GٸXvaH2 @ V{CE6&Č$}~mThyxE._x\,_c#YKzC׸:_Қb" zYU]^^B:$IDwHL.qnN/[:Yِ /[4NI?QboqU9q$r4aFR6m%.w=OFGT9i\SEvCG)wAt*Hg]TËVa):J ]y*"nx4$u"m_h-ЏEzRuLвm7ͨ^9a;<@ZxG^?!S>^ 9GpJ2z:4 #OoZ:h&Wp$ =څ ]=:_-/}ܖ 6:qfOK %_0yzYϬc.:i^cZj>Gcat:Hre]#ٝQ.BHD KE4z tjOxŰZG}hY".dI.jKq$]W>xI9 Pg&1mEF5Ү y][\tE»ﳆPULhttU:Ɇ1J%Mz]ohwQIV=J V(uG.ua=λC%E^F/7&]H{B{f7ҹm|g#ʐ"_ӲcO:qF#6i2,7do' z]lҠy$*DoT>F(jY O*e7:=m ݱ 0V*Ǩni`2XdiwrÄwspQ[ԥ2 GcCNuu;zD}Rm)rtΡX P]7]ƆRVNЬi<Ո:5P =^7t^^7qLg|;sY{~Cו}n8_kŎ7!DKGF#1ze4E-kGZsݒ4B&wdwDz4s2Z]C RC.-{/C kBIl7#fn7t 3o4{/vDn򀾚(ruI2Ki|nuթ@'T՟Sp:\nq0tg]/gS KR8QK7_&Hr#Q1Y,@c >mݢk BFiaTmȓU]%gl Ӎ-*{jн"u#&V֕&r)_`JPf^$o*Z}7r ^ݷۊ>=/^"䧼!?/ʆ-ƺ#O) kFttl] .62zB0hݠβ!y:7cK7t>34aI ج![S H?Ewi4Rk5 }o߮(4Ԡ! #As]MZ:2hϑۀ.Ӕ E,j),҇D)Zl=.[F{Np\oȉPhw'KAG5=.)[{TP=%+NƗ_".46Goי.B;8hA;RhQ {woIa)>J"o#h3 ~a%i E=:wWObigt1VHؒfޒ %h~FkّVI* 9}y%ܲ_mgR a|yW1ƀn덼fauyvw1lF9 T^@kրfȹKײ!!''K3ak04 sދ }L^s>dYK~k#tG"^R4r]ݮ y.{F4+ k4:GRw2s5:Հ~2_;i؞1zu \ 69JFЯ١Sו @+mлFV z/]=F^Nc7ð)/0S1 ruD+=K_:wO~&`Wgېb(x,rg[x#9c"#n! =ͫt!/6 ]]xw\Kw@FFiw0-[x4_#K.5$boGdEK7toI#71VizvB;.v`Zܧ6kj˾jv u5|rkcKQIBzν! .#֣h;7IyFhҏ_,J|)5ՎjWEA ހ#]]y _G[ȳ 2$7 \\DЗLP] /=mcv[FNY5rE[ fUG^vFyA8ڙgt#vGnuUo"SzMDLn5}W%oa._ $If?iȠ0{Ҧȯ:n#\7*t}C_h5[=^gnTyM" qF_]vKr 6_~ЋGajȓR"?lo>EwOa2V#z'W " nO$j:ݿ!Kc|!*!Kzt~IX7IϓAw/xi9̠[~'UL znݿ2yBViZtjfNC$U._si @%o@zy琟(GoP=>v激@6RTBSĆҙGby-)3q |>{] ~g]3)wI,øn?jH0^bi?π6Q*8Q%+ײsVUaҴ|dnbj@{v^bώkky/E83:+&awq_Lno#Zj 'XT^#M[LQP=:mmڑ[J ;xZ[lv- ڡυ%]h\r+1۴lhy^EߎP=ηxѳwNz(sz8z$~O6N eN`uE@:w.wϠyS_U<_|_ ۋˢ%𓅬M?Ҝ U|ojNJ^-E .N/*j~bt(¥O~|֮k!z8}_aZɥW1> p rYC'vڎIq]rx3|^tOg/3=ξ= L/ 4/QqSzdgf=T^ nlue2_v~>Ś ;7k|=,ۮz>8~Y⍝N/лz3O^e(Y˵Q##;txO%Je7ohG uզ՘QkVh9`{<t5Ez 4uUL-Xyqݾf%Bߏd\i=a>c} ΅zjo3Вcg`طOST'G Ŏ\KGU)+u .V~\/@a+=^'/-4\pS ҍ*k_Mm'4:0=/}D9KoUTqgbT~3"9*lʧSbvG/q3B: kGЧbEϋ rT_[/-cIնͅEOy/B?d[Vˣ>Iլbͯe=«)r;AVڠi2C"p>,iLߢu܍}w˞IX?[N/ܿ$M^rszɾuRZ-[᥌{& bK ޶K]zU8o'ߵ WFpع.'KXh[o &d2 ~-2o2н?k@9#RT1U[8"kNŒt ,|3X@o׷AJ{JzA$2P*sFCrĹv*rAB^B8wN/?X@Of`sRUx,JNisz27^e8.tɬJy |ۚl-$m' 8 PͰ\>B̓c*3/~GPU:2_m(ZF1[C~D >JE 0ˆeAV> Agth?2O*XFE/8GI(/>$Kٵp}jĻC|^j~ygbܠWR^b%6ATJ_#ZrZu|ף(:^Ca@Qz p_uX$[|m$ u?G,hԝsN=//ҏMq+Vf,axMT~#<&ޚ#: OMKg0vֱoIcy/5z Z@_{lv'њK1483.y{A"߫;r`0Þp #43."ێ yzyg tGhG>֌#^yC'|9SmhAO\ i/u`'<"S@Atoovlj*ݽ a"47O}=ha|/3k4* }HB^#ߚonH۝Wp890; ]XT~ !o_7\/旊S YnMgQm5zgEy*T2)4>4:NWqkrY^^t;r'`/ Πyy!f#wI~L^2onʻhP6㕍1yz˹{s֮J!Н 卼=dԠjߑSp:C@N%ŤbJ'Ձ0AHq?RFGfԺ#"g BCǖbl".r[ x?ZR΋FʖzB-#rN7/Fϵ\$-9R ?Ddr[0 5[7r{RdW]tw,;]7t~>OwLsbz 64O ]HoW5t+ېS4\Z>9ǹcOʆ/;%QW}y+2,Lux!`z"P,+Fs.{!${\䋛~i+nN>ڹthɑhLϥh}.^]t~Сt9tn~hf!.k_ao\Nw*6K9E5n':+6B - 9ɺmǩK9Ak^{h~:ϓWWr L-uA$UN}cKV5RFN8GŞXۑǽBs^]\Ƴ :CJ;'9?Va^r 7p r7:T ̑)/v^b(eu^BI yUw䳲ڰ1ԣ{CoT=L5QQFug&Jr_46[1TĮToD eXtO}`轃Oq w5 >,|sTWW ꮟT)#zw f}4|tf4|w:r `L'B?Sگ1zι-7U7~ [p $8!]Kj_cIʉ^6D3KxG,!eP8ݓ~\ZY> A|.Y 8٣z2#ތd-ܺ!EOrH^lֿ.2Z?Joo W|_:Sd8(y̼KTOs ;4S9KG2g93ːGge }pH*㋾xgȱw}`tXNzƏ#'$>{X.!!_w/gȑ9Ҡ.f[WK|Lh@ĥ aXg#}HIv^-DK%11T>%@7Obd) Er;C; 4 25׆GjEǙ zS[9Cgzl|J~9߃n:Ogq-? OM>ahuXy7<='+~>J9b}>~9Έ`Y\EeWf\ z@~M=z̖n 8 'Ήԝޜ˙ `#ZS+PCv 4mBoA$#*dvBWI}E8[3B_/Us1pIGs95&qSǀ^L/#~!Z_/grV}m\{%/}f+ ݫ;h 6CxicL f%tje/V)JNKav <+7:4h"Yfh 1vI_}R\5c;GV\<4~<[E^2 5ϓд~6ϑVN趥}W xnkw@ỏسWE! 'x 6r_ bB /:ƛz[U)v?fŧQc5a|ayq{MۯV#Kfd/Zth>f*__3L!/$v\# FQ {=uVo3es^ 5/=`;Eɏd;OoqxTжPT8#%q>_ZVDga'lzIzgL΀v*yN\Rpg0Oˬ /r!uf֟riٳ*y%z}SA!g/&7?{,H?l c7:#F?tE&L?n_WZ7d䁾Dz&8qsۺu4}A8/y9ytA~A=.N2,z+rô`u\"йPr"R;DCB+ސ@kiCZt|^Ѫzr-KB/@k+%Czr"q}-%4aa>T|4.d33e+yC/Boq._/}\n]3*p:!or{^ĂKO1o(?["`oȔ >R'9ŴZE[MW.AUTBN٦LЂG {d+~k4w/ɴ~g 9MH5ᑃ=ufsOٙ]dm .tZr|½?Smzn ś,f{ 44OF93^y2_Y`' /fZþ(&'x 5ƦM8uo#}nu|NE_Jg1GEb-ԑ=}vA3_MmPMMiF/o X苾gn fT_@;]/a ~/kzS|"inQPudß;ޤZBS9яc8z!ϼMY2-A ոUDn7L uz:)q&,VGX @_3=Yl!S!gǢ(aԠS(%g69F8D+2zɮX}V-kf[b_ydblܿ;eM ?٬qr=G]c'5q⬡\;/z7ۑ\ c .r+{noc)]Sl%M>k͠5'\d^&ꈕ RQצK6,2/LW~n[@6Ӱg^"?oQINX-z3Wֹa/xZǹĠ|#Z~99}Ş;=D_~CY@^|ql(J؉W9׿*a"7-MwBzo*U_x2GM XF/14 p94䖫DȌհG,)Z)ЫO, ZCcee=S9ڀ6=͊qzؾ~/_0該컺n!(]._L:k/_5֐4IzZE߂C=t-~3ݸl/ zCA1 ~?>ٿBuVKQ,!-|VDˈ&sBRPGbStO6j%j@;?&y@Ofa2B 0xrzB+}=t9(nnCg-;/-hdg~Sˏovz}U$t,ԷSOvcfi/IB#7k_-*qt_E^u1n`Aȉӫad7%w^jZ]Cz]-JTĵBr~@J֥N^\j^>$KWסB΍[_{eBϕzPKсj4,;}[&Ц9G[c --cg5_ཇŧ  wQғKׅWp};/g9TׇH|'-?aaIA1o#*^q{:سuF 5~b/-v _q7~6h`@j[v} V%Yiϛ B>'[#n?fй1-M|>~?|9 |$5|~>OO 2S\%*SE_cbiqNPhS} (??&56/az6{w?Чg{8mIlPS-(Dt0=U] 7KP(u vi:أ5~_޳ۢc<Lllp㢧~`e][?ST< M>`v!\KzGcAhVl1SsoD+(BMH5"LcsI }N{WB?/"l.S nO1tj| -r97nе߱~es"bؕ8i"_mh¢N">$G}kSwely(_~}}T.>:kTR<]]b'?,D~|ȃb=%(#/G+@T/IBd?lwEK߉hgM5!+K(֙3 OVO9XAN\@E]g 0[ݗ~X1 0xF'+jͫGž,Ot9=%K$#س_-v >_ЯSʬF~FBPе{}!|r!'VOJ:8 QR][نL"OIBV*rp}=Ñ]֞l޶'^imB Wzm֥idQI:@KIqXN3</k'a7FbDI}6|.\%KXޤ?ώ|bG hUUu-Mw_qZ6{5+$kҵ@ }Nbj8\ۃB%r k &TϡebSC } T 'g bE^mi װQ1~d7=|96o!L"*2ED_QJ^௪dh17>V^͆zal6_S;TMF [:"|*~\?LeIB:!xLM~Y⨤¶!S p }[ґɷH>(Fr/pٓMG@b7hl:YE_kټݼԲCE+6 ծ?sE=ً{8>/FJi,Vl ݠ_i\F}^ǭCW }2.l<+6UwºN~2-B6W6b{!0q@ ŋdC{ڽ;>o''r'>Gw3hS4v"DtAao4SgڐsO 9 ]n=Zi"yi)v+)y)ؐ!-u$utAQW lb; ={}PJ}C^EY&ȯr`.25 SY5FZtkb+χti]בS<[G-*yL0f-??b9 \nȯ2”IW}]˄!hΠf/m:#YMfЅߑ?Q^SQ^ݮq!]MWo_|lAo8t.žqTHj;"d 3A}W9Ȏ?cLT]H{lȽm 7ذ۵C!f O n?7t]EQ2iЎOo}!,:Vnw)=c:43W9Gtqq6E^8vqݥz],eh1vIkNzHϕM.9@QqDaݕ*Gilj<1|zx}~ ILpu \7rU?&!O۠Cknx[? !Eڠ__}Bvu*c1@3 \yCv9C CFe7z_|Ozٍ>X20õLxW> cǗ\K_|{bw5(cdX_G,0tqgn9FU۠/>)+z%DiqnbxSQ`)ymSȴF~-D7Y"q Gभ_ 7#޸&}V?N\@hzji'21=?Nj ;g8˸HkmQrUB~ٳA71jm>ޢ%&(@: KcAXz[Bb~t|_5& 0W3Q}ؠߧ$Wƞ/_OPِ>ƌ3LL\[tJH[`?#c)h-BnݝUЉsC].vCӂeιuZ_Ӏqr|O8o9#TwKGtW9OE>k(Lͬ y!ӲaB7ی@_da.ij۠P㛐avr͡ιpCQ5:d6P4{G>bs []9{ӆNÜ3\%R_BSdy"` ]K{F.q= ;ENH= ݭ[r$7tYB*<^u ^tgޡ٥KKYre^]fn<,#5/ԉ2z] yq328y=euCWvu-Ow>"WM6-F>֚WǦ~y#op4qr]װU 9y޽e<ڠ)bAGSzuy4[ģm/ZJYI*r`a9ڣ3s!苆E@2LE$ ͶGe.lq?nas2\L;EYw"6|coʺ!<=O2B/Κnl/7%lFF`AX}EZyw1_/c~Xo37r :z#47yS!rC XS+cΛ\+Cw..߰C/6/tMԪW^DkI4$gǒ*pt\ܯ7]4A.Ѩ+oKvT#sRlTiL-/oȾdȓZzpA^S^)7]$Uz&'!rnǰՖbP[D'{ 7Q*2mڪWEueX~}XQnwxIX>!ڠSeIpBx͇O.u^˸KJʆvtxRnrz#o1r'n[[ًsTLFpJCs 䐮l*Yaw^<;_`o~"\rGSa"';{#ؐ/$'vnk cIփ.׉ێ j__jgSxG0zNt[;A|u]̐,܅ZxLo1C~jkD&f::vK̏\ɖ:** W2v;]Lώ|5Y/LύhqVSTꖥt9Й"Q 1`3)cG_ ؋l7t4txI+KM%wUFeސs6Hgs `m7bG?;6j7:y䌅_ Zw_Z+ؼocȣS)ǭNn̽2ֱ! tY=F\]Z||@I]덼{rB&EvwԎ3S֯L}w9zv1V[x*g#O" 6vJ|RT"wdId"V7-|TW}NbDηF~6QM[4I.3-Mwonnu K] 9nxBFF~Pȝ-=TKِK:4k}cڡoOcΘBF57+ dBdiZXCfgwQu\b8~qGy_ŅԐ-VRװ}C5l lzUuQ_#mq~M_Xtɰz C> a}Ǯ09Cӧ5:ZИb ^}yʆܖyg#\C$!פĺE'3EvF 3xGN%voi(O)}A_EC x]:8Z7s+az˵X1+VTHFuڞ|H9lYw#՘pg}d9;fpk!CXo <"c٠׸ǜ/bq;s ]b\drkc/ՠQks z]ByI .GF̴AӺ+5B6{/3qϏdt{2(=X7etN) }F^Grhǵ]Fž3e \_)c7_~'D9eԱn|Hԥ6;'4[ZP_ a`XN}8 .FVnmKCp0SQَfg%ͰӒ\8Мz !)HFbL5,R^:;2v8p/E.dMqX:As]-)0]my]Ҡ]Dc~Q3}H[^Ү9)toko" 7E{m1\e]rǖjE%!)=ry]dwjADEiGN(1d=z!F3sTu)v]hs[tpz{NoI E9Sv_7FO=_y_f0qu;FG鎼F3@<[3)Ms V=PyV6mͲz./7rELjw=ۊڕyA SC,sKSڰVtCWd5O`oB:#Kɝ6yB%ntDl,AebC[vh5)C@{`ܐ[#'AYFq 5N]7賖Scc_["Օ]l[tg-7 k{T] cK&ęy%E@tY 9Բ5TE7qd=/_ۀ>2tik!7cnk$ }u |50SBoh {[򆃡2cEMDFˮ>:*rQ~J:4y O5bݚ3MW2#;r T'xN^|e7zwBu;}xMR":N{\AҬ"Z^%CWQIs{Cҝ5zn+5+uWDv_w6JSN P 5MwSv :M̊&5 y6 / F,CsEC1 zSew3Pm#!C2unIvn)uh4_"MDǍ՝e]zJhS_eȃb2} ]x0az#в 4"`yrrHt6ޫ'vX9K-Ё4F]zl1K` dC1snz #Sp. z1mȉ YA_ib//Ʈ,~AvzPp7^L@'=8$RőTgSHYN-5)-VucR%f٠5( rjO&wL6׵&-k_%q-x4v= ;_Nfy^w#>RT4kR*F`TK37^"F>b_ EruD ޣ80Ezyٝӗy@ϛJc˥h% {;tX=A3v1v%*Qq=&"q/ەv$LbuC~m@W)9Do}3-}]Q_E]'jD+_Ia;;CX7GPؐs_M#t]'cH%:/tPh$Yӝy!F/45ס@H F00,o} %ro# ms9EiW|[$KN5c%ĥȍyǬ*tc6[Geڈ8Snн+.?_ TCv*:) =&~vo!y_#ݑSnxMa{IQ uXt 5{!׮;KϠnEUwAonm `:LkJQjI/TbEGZFHj\Gp2˦".7szH_bzFڵm]l] h^BK&lҿG6!TݠX6Lm7n<=ԠF]䥛\#)%:yi-'-o`<TU0g`$dFtxq!U!En`αqoM֢tK);7xgF1j{һJ#QuT\G'zot !ݠ'~m0xq]`#ץp+t>vzؼc> l#_(LZ!CV>ޒC7^xCoW 5w:s\Q:.Jnx 0̠e47ǃv4 d^x~e\9i4WPæ<|g5Kh-g]]BͩkpfA|w)niD6*)'VWu|͢nSO??t ^өkOeGTܠv"븐S,Lӗ*U bhz;A\QoXV篟K"w.l`}EKbA/fq!v!-*oK`& z ,#?T/)UKЗ:57umҽ\.E\ | -m<F.k sIls8c#g1o!6ץRgfmt-Ŵ Ĥhym=ѕ< AH6ҏS9Ҡ\-%c v%5􍜢(GTY\+%TΥI/#mz+je>X3伺 6Ḏ֋[A/Έ nyv.FC]\R3Ŧw]-tFvt^=.>,]3u603_P;ۮ|Aw:IBӱ%)ęqN0=x=r⮤րt&_!K.vX9EƮo_۠Vo8*!S2hv9{cm@w_s3 O{c3@:y8QoJwa_|Ԩ3#?d*#v=zpU택B)`)ȓ$~b`e,s6±~rzM'N4 ՄpS_h`yzGݕ$[nð u'Q"oJ8W<ڿz__ =qx=e}yY*'x{AI4*C^{`n_ؓQnS6&'#".xKo =):ѳsqI@c'S9ř/ddRǟn^_Vر~_dq$ZW.g ӘQz[OT09YVGY]lߐ46@\I n`8p 4/'#㣅LeyOJxY4WpFzWOW rE\7x 9IgЏe! K dJ@wqhjW'#AlJ&=k >+a/ѧ[L&|ANghK8@Mxd.]r|o#F_US(ih&Xf~%5d܆3dٞ|ҡ;#މ B*KЄ56B"VoA4ndsk+as:A|퍾EQ%S93<}Y~c>LO1Q]ޢ'Wc{'y^BYos$,H6ץY/E/V"eZ/5fr}N{h*F<><#,15=Eĺ‘0t㘛ѷF'h%Cu(Ǖk\97l 1YXf {n5j{IB\/;Yo(KdNڐzLtcL5Efo !ZVt\7K5rV[hD#_վ4|j_tDq/703rTO1eZW'?#EyɎL"K্ϒd3^yŵ<5z/g]졶LS Zhsq2h3jSX @Z>lﱗ0~Ĥ'%SPKSrznRm[zթ`S3ԍ -Wsesw)h% Q> wɰ1X/EJur޺7й >jViTj77hJ`c}G4lQ)_Sm ySuQYRj޺LDytܐѓi ~]bжB>xTЂG3s$Ϳɬ3)gI`2?$]dwAѼ,,: ~T*4ppϙo,ھdwK[m,.9|?/ ~?[2p:y|t=%34.P R}C?ڰgD'59yYɜ,Cʈ~pg Z.}V#Ǯ Բ{ANњ| Z>6AkgȺ³rf0vEK)g yeI?˯Q=O)*Zϕˑݧ%M8$&P %1]._qh9 };/3_٬#wyXN>+l3G-_x#= A}>–/쨶蓼~b3Ɉ|>Šg >^k6#}CIw} O|@?,؊jA/H-y&C<ƣ֠ؒY$&pI#~o_"Gri_Q]%W[ZKJ\?[YDTѧBM4w#v7ApH"g^#4GEV-w-Nq`!~;"\÷Pc-io)oRk2IWo,mD?^ȊŠO-HZH~QS_q{~068}|W19%@i7ĘB;f'bzq\ivIMJo5Xu#}1<784)f ГU{? w8CYzl,/1Q#[\Q|s=}vYƧp 6TZD@^~4]J,i n,Eq^ME0p@o:يy GK9%F9s%=Z!豚rh@ک>\ђR'Ue e G2o[tE,ōuV2X+_NQ&K|F*s& -'\/ ;vA킼ls, 6O'z>=Վ~C% }99Szc2=_X5޹Oފ>Ԡ'p:5LѺސۮ;ٹ̞m~3{g;vJ&n϶wI-5CG~B?g n3lZ6Põh׏!}O6cn7) z+";Guo?Hִ{X{|Tױ@ȝyoѳ_ehz}p]Y,4yڼз`J_l.֡2HZ w{uCR ۧDMԭϢuV"o͹;ޔ8|h=zP%H{#mԳ$yo}3u_􄧳ۥ :~vSуM8}p6Ѽ0F~ai*N}~]k'Ɇ1M֭[)rgz.Mo%t!7slV>,֑iw肄vrh*:/%b}sO]o%^w}9 |bx8=Cki|FLqMO>ljMmqܮ%qփVܪ~ӺõZy%Qpt+X>/u,X8xtqX~-m5Ym(*a6A=K/VcVף{{cOp5"nYࣁSkAT]#^}3woT&[Y Bx%Rܐwz7A߶/ɹ3_zeW~x\s<LΓ7h8SϷX=IeH<|ĚeÖZ4%:!R >U,#-O6Ӭ :5[Wk \[l]&]p/i$=xtxJ3riZuӗh"[~b~?/`2?o,iз >"Z!`ܩgvvڞH˒c.^Iu$θ>īgQ"EAqF +?{K }hsЦ7sѲM :!Sqc$tTQ4o炱ro{y( g$SY< x80 $oZCI 8O NsBw<60_=w Iա;{:\=`Y:؛|b|?uz? H3~^+Ÿf j,!F_kU=X.w?{ЁC}TG<9ЗqK{a>yzCBR{K mik|OYϵ|^׾JDIWOľgꃹK .OE1<5b͕}I}z_;,Y.;ʽ.x/ӟ2 /{=gC77x+0>-;ԡBZrw/n}R䱬Ka_1u!.]T=,IWںE@FIZ=EC+/,}vڐ'-5LCtqύ9Ыݽ~ V@u&%]Z %沂Ml9T~1^J rw7=M3h`MxRC_ˎƾLPӠg<;M*Jl+h4+qVS 8y7y.{Y~ fg5|]-N-߆OAg=W_b^~=r{=5gE*{eWfI?C0k)p!e?6fOM'7vouT k3j֋#Qo줱`9J00rO]U{%Vn$STNÍ6< K3\o~'!,s~52\coDC| ^ ~">L_f%^$QB~ek]GjB-s ߢ_wA91E=U3&iN.k) khG^KspMzUO@7Ag1ߣ}`.TBO1b跪dyI-szֶfz_,Yx|IRҶ\NK~UWZ{41 t'ʬ~KE##RF-Zْx^ ]mՆ|rQ胞=_9H̱8Wu \VõПm~Ƹ|1A\ZoN_Dr <ತ|ٞhnCOM*}Iן{͏0 g~4}ߕQCz3JGdlwz )(^P ]eGN%y 8JN%ZNұ)foWO ݚo#\:lЯk;#'z{lJ~@?DJL;E75&u <^kĤ/uNhz&avZıN-؄77輾RjЋ+-!-3tFu4in}?gmT~@u{"gf֪ȍ\ K@%''št+5}ؙ겺fCӯDeK -ey14v/춦Ufwhb+gL᱃ \7)6e4/,ےj WTN7Ooo'lD:'øuGtMsOkjk+xӽav'!SEtޖkȇѓrd~^ukuH{H<_MӤ0h>j}QT+v~bOOz+œk `]l9*Ck_ۢ"qw1H}+aoTc6]5Lqݣap @/3tz`=[qzY*CH-{[tF+<Ӻ#?`sN'SQ֤FkfWܫNJܰ{"x86ݐ$V>9Y"##lN?ѩTsڠ/Y2#%:XΦ/:b!k z_j){v/@Nw[}#$sbz vsHw䇨ΰbsO=/iNt%]~ ;w!#{?k sw}c,(m[xʱlk𚕅ru\L mNw!x;˜"7yNFE $#feC~2) \֩esY׼݁,V? "-$ݛjssŮC{#n- zfl{9ugۼ\kBv/m]Byۤ%Y}GLW#Ou=].|}g Ţ#7Eeڅ܃ш`n?{]t伩[ȯ:nns0FRKG;E"'ňݑ$mי"u'}9摸 #oHדơ=? 9Gڒ\Ҹ_n^ ="Zћѓ`ݢ?B~w A.ZF}eHޅ mOɸ†7ccjBcl}ky6L|S:2$ ;csb<{s![]Gѥ$E.W˹k #MQ]̫vP_\IBju\(7 tW:4k=[_L{<]y^ԖTm2'ʶ!2z82ouh=f L/ E  Y/ΎܑbhRC# _9Mgޑ6-"[J}#⼪X=dG&4Jf۠A,$|Otw%}ϩ擺+iJҍ0mBlkhص_3ا 5Y9} Fݔ#rt[TuZ79}#/x.S- ;Lꂣvd*}sWg$pLj3<c#Hx;+flahu#u!5ʗVOclq^]Ї=CTٹ[ 0w~ @ɬ{!'?ܩQMᴇD^#9gQj^'ɶz?[V᳾C ˪#xT"-'etuGκxz{.u"w Og[ҝrcd=/n7~.8<%:lF.wyNs9]T:r[}uG:6?ڪ.$#=C@N?jlhMBNI< _uP?"ĔܠIz"o? ER"Z-=^-Q!6Hn$vVK5! &+y L}^`苅.]Vϔ;syz!zPzE0꺻zu9Iglחeb@B܏AK3G#~PFF^"z80o'E,H|.?ө?hF ~j1TA/M!ЂDGx 5U~fԝRoC?9/gⅾ̏ ً~d{pJ+[t8&-$0ѦԀ?d&gދujCN`TLM k;F7Td[N⻾KaՕo9AEO΁ fCb_yfCsGQ@ӮE'vEN-5 |$1˹T7v?zc21~-g W̨g- eL*rFOJ8sS`\*1tU 8?CC?зEBlzxoyС&{vija]o23>&-_Fz%a/4'2$^z)$+#A72.Ԡ7𾄕DxfIg1$vz"7gKQd:-9rkؤ->!GkfNoY}3h<*m RsߤMu~男ʕo\X83rp<=LҞ_ OZ%iR:<8QGTQVHڍ>=8ܔFT_?"d%Jyf~?@%w<9G`ϡD_~fϻkpXrc$dݒAIG7)jDk灸9Yȧ哹Bʲ}Xb%6֠$sT\裂'9Y5XZ,6qOFPT|+)}äo9$sOc^yY}<,j Wv٢eܰ#f@rt=x>kM&ݳ>L멭\ס| >T U[NSTWЦ/yqEOcR딸?:r+˗G\2Z:d ›DƎ ,wשǽ!mkL ~_3oeVOzjA|8sH,C_곴7x_yk?-b_:4QMVUaJMaWFuաb6ߠun0|͢aSm] Q}GF'xdR`Fe&xX'o`ɯa;houBK|~^צɶ}"7ԏ;w\yOՑ{O !;xb7 ]~O¹ ;ܬ[k~D3-bmȦy?ƪ7hE^ǵ}M /<7z EIӠӛ! T_q/xj T9tB< uj߂x M@nI1O%lmٹԅ S&-Wɻ@^crj@ӝQz!gmu[k^~9ڇ^xRmMU>IĊ@ǖy zXJ=5=S.د`/H zD%Eq̽􋕾]Ɇ~VM텼QZDKȓ7Oշ Ȋ.G7lJhBG*S݃ijlC 7h+AKIa@W_{۽뱌:]dK wA.'4[>B Ad!O]RuCKGO:G2[s@.1HEU WhgޡStuk@wՋ^dv?lI[%(}7¨Ҏz75v<ȁx5O$A'ĸV'aω].7d2#nB3 yH=kQu5. cns-]Evհn5:4<LUys%Dе9 JcwM/rCST 9>%rM4ay=Z7ۿܷ;4jC_6tqk|>ϓՑKϸx!5YY@|e>RŖ447<d^vuZCGrtI } L 4;Ў|$qLzHSwB7.ރցkG&( Mcb?Y 6!%>6 ҕx"[6LoУe>tCч4n-` !»yQ iP <]Qʞ74@g\ y#5?QcK7] z;;)^e5@ޗ Uݐ׸btGP[{3,Ų Pr 69"uEy@hwZh҂*aߩBs yV3BДY決@ѳ;zVuUn(IO# m(Y@e".>dy_tA% V@?9ІW[+dyz[E%i漙0HUl>/r]7]zuݑ .u"8G{,6udТ$'KGЄuʥ 9/Cu뺾N6r"o?ݩZ^Pkܡ.uN#fԞ;.yPhHѥ])s 뾮EO-9YfY)6OBV輋Ek:ϋV\,Nz6\}DNe\{:i)Rw优ы U%r99#s6Z(/[B}ȓ.␺Br1n FXdH:pVWK dv4AߡXzF~DQQp+݅tY"[XmD {G\,29zBERg7 z<\׽Bע\hNjɉz9gE9S1v&פ:9-.ʅ *r[1!-eᅜb?w.396On^g?QY,&mh{aEXVBȓH/iLpq~"{?Z$b1,ܔ, ` -j9lY" Z,9{,>+ǫ=6Wڐ|Y}^=6D|KOYts^z#+Ie (o?IsnN:hmP!oSmzyGY/^a`tG~lοܪȭg*UyۀgH~z^6*:vrnmܼڱ[<Ŋ)my#5pu W03YWwDAk=NJ-.W'hyjЏ8~jQ\l"w.]oaa=.YŅoڠO0C\K`eIs=f ͡]b!dGNmGxRsMf~BrhܡR]SY_zIGbB;4u='rI+ȭ#ߡ{4&!CZ7v@3]xEG;![]#hW//ShMb}h\iI_1C2փt!4^Za")cM-߀;uiQQճ=":Qxġ[RhW9\jg溉6/j3D"mԋ!ש.ô%m}W/vp- ;ta\;d=8GFYLyLմ˨hQeP6B nu^7ڮ ʼn# rB zI>d9aK"cw +u ;jݱ]I9d-62ʯ:N <(v1v@;'t4wq~CD/gX)I/ॾ}`9N`n!bvr11چc}*r"ޡ"5TEdF%tո*iMvtR\}iH/TbvBf!UzBoA>^)LwP~/xCуɗ4壙b A7Mgfԃ mvII_%%vi>1=c zT~f*1R[HA;oyCR _/آX%ۍ9-NJ9Ew}(*;N# ^}8LtJx G`duzvu"Rچ'"Am ! %zC9#N[먎/ٰh$=Ɖ$TQ9`Ϳ@/R 9.H ZDh,/3+ܖsG}lva('-iCQwpα9x9WEvtzvԕ^,E:9lb\]o2zL1F9MFڳYwG^ty7rۖ.GlQJrQOJ>xpw;tӀQNcI߭.kgRnOl>.lE);'D[ [Lj52Y5i/9Ǡ /M}Cf8ڭCkڇOg! tP@3fq$!OGtG ='K K_'IˤEFz}beI}+b@Z^z#sG[;kn V_];luO y16_4Gtii7O2Y CJ^_b]ON{dw{M5I rѲR**!OBu< O?-ɹw,Зڕ)(.'t{ِ|Q@myBw@ ' |AB;h[䴅ێ|y"d"Hj>F=/gJƋ_chR*)IrAog%GKf{ܯ.jiJ&d"'p_fm-W?$޳OE :Ũ*(Sd :ԬAϻ}4RO8gj_]uBxpeAo bn.Bs/# , k.h=Z[.u;WdǮr L44]]2:vq>CvaͤM H?z\S"Ar,R{G]l-*.;uMU]6nr$a$[HnNjmNӵxe#*yU@Z zTAyϮKIcIK'$֑y<_$ʊD^{^ ?)AFvݝ%lf]$9Kj碶8M%9Y٠ܰ Qѯ̓4`7E6VN] Ekߠ<1(:AH^e1R@2PFΎKtB0:J~p._5xꏻ!Λ!bZUĖ'tA^iY]GDccE-弳Di%rzqW6*uAFg}"f,R쨢O#*t]D7GGF^%\Z6~"Z#NW*M5NTlREhG{F+ˢh'*{Ru^&##z*Cܴ_M}\ Ky碖9 :GzvH7ӱ$94E:ùVE8k z]s YRH;,NACN#$fmጽbHlDݰ't%]2L>+]6ze݅ra 6 `JM^3sO\m^Ź4 -KG,A' *_t>ޢh\~{}}]H_г+5:@kY  FnP߀]hGN{$9a5:F#r/? _.w}Cw=S?YttQ~9I䤷Itatoq0*LhC>|ClыH!gw"ZH9GB !?t9TBKzKt)uƵg%}!$IҞt Ry}`$[ϔQC`ӝxkcFړ䫃ļaJߡ1ez\u i (rԟ\tP 9'OۑץM{.*Wh_"jAD[Z\pIKsn_" }M׽=)X4c'p59&E.tV뺐GM/hjs&}"5{X0`E[fTyI#t ˒a<٨uԅJobȳA voᨊx؈voit%-g22܈PҩYe]}C~Uf&Ν ,"ߤ]u4;t])j gQ Ya r|qra^FP_:FzG&A2$yASk *0⹟#䥫?VI4^c8WȘ6Ӡvf\~%tasUF~Ed1I ]YftŨr tM= k߀׸Nȩ.Y;E~GfW*|]{yBOڋd, ЕV܆.cҤɤJJA 0>/ݎh y)vR$0sVDWƫE%.辂c5 o ̻khY eӔIss!?ǻ&< ۜcx11 {/s{ٸ}^#2B/o2X-R7䲮+6ON #/Ύ ?TGq=}ܠ3.ǖG<#j{Fͭl-sk] z΅<9nu]/6qNO.* 5CݢͿ{$%])PB 4;iߐyh*Jb_W*4r_CO%\M< f sŐ 9u׭`uz-CuռйY]b_D4̒\@WYt.-. ʽ}Af%%蹗J8:F.?"}ASDdQc4rK;^TR&c}S]zTiι$[|!8 |B YVE7輮rAW~!%{SAۋt=7#}u~ru~A,"з /4Bvy:L2hWtWUUd,Dg`v3;t*]c5">*)TVhTlݛSʰWhmZ yz-{`| u^zn)tJz@;t^(ESF]֡Ѯ79)u{NB@УF-/:Iei$hwI_|N=uz:CM]hN ].V+t/`B~5n;;cD|ԡ>4'쳵k[U":rh΢ɓ:}Lpt˯uEn )jWGu=]ڧρW_/-q5/WOBvdxЭ.zI zӭ5qN_x%m7G7KFu:xxo >1뀛x2͋|ݖ]I庭 ѱ>!uYS4iuOԅ5SzFmlBgyd ̹oeC&Nc=|E|= M\wE{ިY'w-LFgoUH9ЫD,dMT.Ф>5/c۱of뵡Տk4^/]Fֱ/a92H 1@%JjuKk@\':"3oeAkR)ŗh9'@Oo[S`o+knŒ!iNcYu v&v#]U$}2P7`=_&wJy;c#}[; T\7:%`< 7`у{͓8ÊoG&}i#' bvLcY:ܘc-j0gԄ}[itM߱V'J*Ѡ10nFwx}z/W21oy*֔4Mm|lp^].j倾'0ԡ8c7#Y$tNZ L=@^ES|FnDq}ŶqV26_(gh)ymQhG_z*KJFi_6ueedKfrLy Ž.Cv"C9yoSjENN~2|z~mn[3iBbBu/`w#$~tN}1'].!M?_i1l |#.Uhv2ifd4KM)}_%Sn0HlȺZ?&l`weG7иK6JeGI K?)r^nj#{ޒWAkyu@.oq&!s$N c&Y/-U"Й. -s]s4EgGd@ݱqFDtOLgKz`/KEҠmIoO3vhn?.)%ЩKIzOvw0Nb=qzi̺X%G𤼲1rH]ݍ\֖ F݌ ШЈ |m?{02 v~:FdZ[R4%-{2tkq$򙯄Xmh^wTw$Ґ3( ru/|IWCH{Kj:u۾.Z*.4&r# =:k_z8FZ]:OnBy*ٌ=.'.zbtvI0T{E?/A:t\c6YF}A | B\ rKz _b@꒐f^BLu 砍ΠGkt kء+RA^rH;҃Nwq%bi3賈Ƭ.3 IKʍAHGTues3EPƔVqc{96et?MY_W맟4egp5W"^@Gtv@n:Pv o꾴{Tz9s'JЉYNA.3j#y#0v;c14YiYbR1N/33b|@9J0JYҝyu݈ܭ#Nj HqWB5jC_V9%tf CΞT>C{wm=ͰY":[+{G&ϵjЕi+v 2&4iWtMVf2169*Qdl42Hzvk^O# O5^/2j'%>|tj_wI!wqnI7i^R r\"_} ^Y-Jee\}m'u%B*u|HgY-1 |"׸C6:#f Ugz'.w:\d%.g]K^,ruX!2{}w=UՓf c}z˘Nതg;)cqq4kƆob@\gxg"\\zQ q4zkIBW!Q }KlQc̀B`]lFt`$IyzLM[hUz2J%iT-^gܕ=y)_`SIc86T\7S Z`?eGP/g X"UO޸A'k[gRRnV=UwbqGz:-zF.<=e$NGҷh@}:|B}gtlG]~!ߣT}mf~aLؓ<½AwHK o}I͸ޠoJ|nJ7,@< ܑc#vz|GNj1JQ؛-X҂=iIdEH [e'ECd,QMW蜑d nmPFkgljzY"/P)1 uQRHk UsD׍oZ=We"Ì_'c YLN%fr͟J b=ПZb}-w`E7j&|O[͓z+k5]Z (PL Ō#9i6G!11wlvj;KjTzuKy,z{)Z`ULB[+3 2P\~{C&wBR7;6%pSs ꧫ"ҥ zJEo( .QƁ<[DtBhcE~ﻼҨ uLsƫwN}_`i˶˃bމdrED)*0 RSAъM 9/;krmKwdmKi8K%5kDzq@k4`䡀 .j4x Js8op rbiՅp]ʺBd p+.r(wd-cnѹa\'VO}ȓ-cu c{UB?:սNW%ZԨ/Ww*tKL^h`/w@9z1x- 0$KXwh_a3!R_$sR_sfDrBַYZ#'! z[#FCW{)Чb1N#ЫidJ ݌';r]G' L I7^nõ]K/4\5vg|Fzh7) 9Dw800s6Gz%^Ϩ7-=}MwBS3c)^^@s^EXdC|LȏQwA.148gnxQ3_l78}[9󉼅F6'߄>N(rto`}(eޜ,:ah lšW'$"ufmS;R޺/亸ՠiTF7u-6S]*〾LJ@ur;I/[0#Z8ĵ豓VТcy 9#'xr3 ^-2/jl5]SF|Q_-jiU#Ӂ@q^ch}}umu߈it/_ft)ؿYBtz ר02&F }O) $7: {B*iw%,Is+4ψ]cxVӭ#wwM@v=Qna_m\M,4Nm)%0mHFqԭZTdי_Н(]JL{R^cר\#mQ)|ͺի -~~\ :݃]zzt͑xG͠G-8UkLNN4b_)W_MSoFQl~"/i45iёKZ"ܞQSCSAAsFIx2tEO*| _ed(U9%[-^xnM-h{Z?/9-tL.UBE HbWFW8N·5kup?ˈƿ.Hհ(mнJGAw)؛] ArKnT}"Y$lA>BlThF8?'\+R}/5o"o9{/7h%9|Dkޢ/hn+CWs%7Osj.t t;Yܯ0'Z#]A-KDE!+ccy$kT}DI+[@Xҝ4cӊZEdG[ FA;t7E8KEW1vv;zy({L/ERxA$vt1 rhsN]9Q'LZu)6 H_zDfE[\f%DLhGϸ"ߛS_)Q:#Ԡ# 9WuN#45ޠyy:V)rX3jyGS]2r% =M~Kgנ )6UksIV֯ՐGHO\4h4gA!2D=Y .\A[Oٽx5UQ;eB >С݉;=h).r J6쳘X#4_Z~JsAnz2iz||.\6OM&+)#iN=z2Ah[\9J'}44]wEM 嵄sɟ"d Sҿ6HusCyYi36:QuVdH"=ƁZyab[亯Ck[yJNz.N|+ -]*}<tRNY\N煼Ꙋ!,5 "r]#e~^ ]p&It[R>p9 Iis] ՉE~@ޗcKHSQ=._!vEd1嗆"Dž/೔ r\z"89 ؎/}kԳ5E(qktvN5~Y,2| \gޢm쭨.ȏ(_ް9_D/D~ᐡxnmЉKqEh:2}"#I&)O. +tSJvV{gE(nX4mo5H>8' ]%轢 x2"9omq@2k \I?sA׵hHqsCfOTzEpd@yޞQ]z/t-J ԥ9~Ao чA>hLz cV ïC7=ҥ_Ѿr5ZN8'0:˭_zp0Ys!'t \0u}4{lat /Y KI/rI}$MN=^}zEٱ}vv:k{](r_f[]HwF{9nkAK_f:ׁku͗*4H|N}my fUOoFx9cOV]S:ڢT7Eh8t! rNM Wx޻qk{Hy#/.ikEkOL mX>Fї'>mF5c}lru;S3Šwk=3, j.4r- |B^YkuWoM`,J;iA+Y.c+tJFnT^+uZnگRq>.6nDƮ< >uoxnd*C/{`艼Ǵ%0SƱ6WdxFA]Hs︱<4{XM>J@pj1z ^ڱ{N-ҿE ?G?l.nLd)#InNɡ Fq>݉k^򽽫6:%lh1H_Ǩckvkhh Q.4h>IeciL5J FUg^etf7=- 2uu#I{u&h:MZMTjEToOWSյ;SFkQtdi㧣[[N F&c{\,yB*[>Y[uEF~^ְ/c[;kL!n/y, Fb~0lcᾠv ];/乱ǰ40ס7jp7r]1H~?: 9r1Ѳ` 8DQc }nF!R[/@F@.G,EzNGu}W t"Cg2}$ЏMV). ?:nW Wo?w1zƦ'0d䔹\qwH9QغlMJs7N.dYJ?]-UGsw /n'=O:)I)jB#B>?R&=#ڱ/qZ]cwzBQ+E;]@v7澐ȋV@.K|\b/vQp0rAQ׵"ȡN&dsdT~-Rl{'+]ᅞE4+99Ql(rn@7*.Z9oqgh-:bv;rG}|\=OH,"'"p&kۗ5>L/rSɕ.:|CxJthI\f|oYVYfq='%FB<"=ely`WsB^S :@$A^&L)dǦI&r|;q.ƀs߳|I.`_!=bvB.^= Y#7MDzZ]p;LAVЄ<9P]c^RLRz 6[c-ٷyD9r|l1e CO#c(Y\}-o:=i ?uiVa'r5JiM;_OW/I1oANINGs.58Lc(Z=?U.-кOszqZ(r_ @o Zjb>%.WRT!y}F?y `)@Q3c#1i,QشFФ=qLk{pI'09?zs_`4M>56Jfz[BoN\ U:1"0 7JyA+kvbA~czՠ2Ґ|jT늍_y9SiŎ1 _KMWW4| .ЦUN%Zy[g?u^bH>5̭Bo tf66GB}nAuK>صaxZ p3Kqz+0zlj3l5w -Am @lzg;271 ~g.O$!%F>E3eyޖPw[e %=6 C׃c/uN.c97z>c[f/ϔiU"KAГq_**VmkFhܞA;jGƜWz94sIg/;Kl!Y_rpkd ͫ*ˌY Ƭg,7.N pn@nwmZ5Zu}`@wlĤfM}iwOΧP(R,El^ScE!py+>bQ~Qy縒JWi5t)6]e9/]:$8%IZ$mhd‡^=DŽs]"l˓E3 5ryVR3|=o3J4}(vz4GZ]|P"jE.I}y- ]rfakWՙ9r^9zTS:/ ')t)gz<~+Rmڬg!i_m&٩^W}5ߌ@_(a}Ϯ%rF z/`jI]J&֠,RᅾԡzZ.pyc[*вm=,iFׄk)\[a brIr ?~^ !#=m ٱ)NelǎnHM`&ơQ{S/|RAߐЌ/y:mn ]Q?`@Af% _#3  >rE2JҚ6g\':b΢{,+PT|u \2c2|S ?q){To,m{>]m`= q%26Vn9ss,]gU۠;x/~w:ڻ?t/}qOy՘RepL=iLe;PʚK,AzzRD3#!jo[e#_хB'+bї?^\"귪1Yʼq| T]ݼ폈cфr΀1hBՉlWOq |Kel|6<۬I~s,$=m#| :xFQ)5"R| {>2KLmo**3m7Y ֟\.[DaI&TTl{i@/pBiv,|~lvl1%BoK~vexYY*V|[$`d}eA X:rf_k(/b^bl=]^p<\}H(v__+l}NEM!"e[>x2jE/H9]'[U~SR n_UEk<>uIkLFY;~?POG`{_z\sM? a\72M%mZ7F >h"vG~Hm]s䔍߇JY47_5,hЖ'J}{o~2}?S->GV_JWV#DYdw|;A ""h | _Z;r~#[x\A |r7 YcnfIH(N?TKI-vpnn/ktOp*+}dvwo^VFFtO2lLI#/0nV!%^uMb8-dzC$'/>7VPjkU92E[/)3jbjZoI z×__魾n:ASeiVC>8?LGV,:Gj 8n!:;a{Js:Y6eܽ2C|~}iZ["P1So*K~[ .G+rfbvƱ8S~\SL8mz|}KQ_3mЃ,ۘsps4L^[kKr& (* 9/z] 艉εl컃R8Ts#]~ǯxzG.d/xJh]#B/t*тz*N \%̞ЗNe/wsMu_9a/k$XO١ lF W#% #'tY؊L.^ho :DK_Aзzr{r|׽PvjEne@iO),vZdȾ~;z!81C'RYa\/&>}4-BB8A3&S*юB:quqnZgڋ" N8$n]U|kT؂qרؠJT[E>#J'-}ش7rƺ;IHlsˆN롆gtZ]W@m:@[+jڱeD*َ.>iY5 U׋~le V?jjյz-Hn^ۖKSFK7$ 2rMGQ5Ob`l~Y;[f.ph"_{HR+2ud0-||P5G\945;? {0OnN:%N" oW~WYhm9t%̔5\`ę C^^m9{Φ@1{QGTolyc Va([cUy" T~TfAH[߃҇,S=M~W=|"'u@k.#uqzDeF9I|3~%jx!Ք:[_ۛwHOik >u< M՞^ȷ/IN]RqEߧ1 $8y]k C.o}z^*0}G{M:!bEⷯ]qQ&ac"mvk)DkĹ ՏZ('t`8RV~2pWAy[Ž̀Ls /!."g>ё@_䒷9 tq1:9K=^/1޳igB~"h^Bi)#5m FmelОNQ.,chwɕET><ąN4N5qqWWzK.A)yF;5'hs5Fan큼tG.#r@'$yVMwx T/=-uI2صL ;S5u_NCo¢#4|I 1_dps<ȝ"ﯔZW&w9?RklBx!Oy=ǍN*U}"|wk*tˮJA>[} ;W\}NYa$^9j?sz:b7hzE!EwSAh:t ^#{ I*<_ ]儾 +A_%dzXL4hɿh@޴CW==Yk!c#k_If"An{-yij}7RY{GãIQ3!̻[V&&gӸI`oq~OV .al)H"ȸgԦtJQqFi[XR :<#cKp2LO_zh/>]4j`do57t֥_G |CPslw `;3A@8<2 OOd:ide)^'0L苸c. AGFl<9I+rB.{wwʴzt@W)=_($ߙD˯jM^qlZ{|`aᏣS{v-[jMWRsԠؑn]'ZJνVCSzU5z(IA>]#}/_QlYh<NM]׭>KS`b@n~P^k([kUM[H^8FvċhLO!jJ*>i{g>Z ]2 XA*)Jkꥁ֌ҴAwˁ|+*6/oڬޣ9ы{vtk>".H5F0UbC.) 2}R礔wkn廑S'b'Q }H;cFCMW󓰸͗/4Iu@o}BKYA[\'8*io#Htk%WQޮȝVhӼk w@^y}YcGy@+[,Mt#[Fte]z@H%>I0>7&&ۭ1O|]:l}LMSM-tPKw5H^Z{mr u]v|sY*K4+, 2} *@nN;4;7P@>qk~ E95[hzȱSi\&"`M-|y FH25Dȳt=NHbH_1SߧDO t`itC\t4$_y XdkAQ?Fw@ްEѫ"۠yC Z領-3U뉼_~zczY@qn<BF%=DU(Qv=)NC=ƥ0r%dLۯ[iنNQͪhE[3͏YucdZxyL rU~],F`S웧S{]}1EdE6|mmDN%9XI@>|R O`C] ]GquC_j9{yGaZ %AnK:r8VK=I]-ݲΐ~JGJ%zQzAc,\'r*JXM]"ٝߨ"mTW`.u0i?з(2v"`n:t8:(a<@-7tw 9h1\} 91~Dwdžƕ_?~a^H XV':iI6Zsle&@אLJEnz[/RBPY/K ==lmN7/@v^ݏgx'0)[(I嚷)#8k?G! oĖ_m[#»Ġ(Iim'rGxܫ[pHg 9]FůxANS;dӨ7h^ZzzVh~0F.K Z,3S*.r*;{VEj>ܘaS@g4TOQ 9s%#:O 2tLvUʾ.u)LB3RJhF .sR>Ju'XpvYZ}J`m9c9-/R+-|h2zbVDN!rՑўA.e  S\zv2. 504 9{4E)3dQNlQ9kz"7hTG]<# i1~G)bzQA>m5j7a7Jβ9 ϴ](ٯ+؄)'t΋FeL[~#o{"ﹳ 1tEcN胼]^|TRqݼxO p}Kj`3:82cEౖwhRs[,%d^cnZAsҤFK.l NAfw֘qDbw'ZsAl"V{tC_ /?䉭I^Ԡ&la) xU -HR0J+tQ> R&)],t@^O[)WË;J.qXX-lu`EUg~yLO)tp\"t[ie/k{Z .tK]zچ[-9޿Gnxj!yB03K7Wck" 9v"orYLYvhbas Ȏ}iLQ?.,+0BC_Lr^9(K%VO.Yv}\xDnqFbFEe}Z;[E\x6l]3$~`׈6ESn|zˈ:b椧:8C#Uƭ`ߪ]e`v=2;̤Lҿn ;8ٓy1=*2}RZ߳x .>[2AҤJ5F e*Q3{soƙ`a袴X],z .~QNF/WC?̘ڝVQ1UAs҈O5RCFEW;"eϑAo8c Gs=b/YFƵCo]N 1EzCπ>тQfPtD'):J7-X|)a}>Bؕ%=>&]c6?S*T .rwq\,trYPVN{:.oxET@~MNJ,rлcc!q=7`}ˢrL}rd'zbo3G(F?ng,v ;I]e aH0r sr x /; T ܕ&V=[д΋G:r+%>]c1ejUy2:c .9GRz!2ς=%/WJsVW*Iy'4$9G2@ w֡I(+^!Umy/"-Q'CkI΂^ 0 `,e3i|D[׮ekuA r l*-I386l9ɤ=Q5|> y>]/5 y:JkP[OjB]#5֏AF@/r&h_xZ?S8]!_ ʶ"$Ơ ;Z} @]Ny7J=SAlTvT'0=Y#rz5י}J\Wdl ڵ{4<(%zK=l^J `K9QEN{}>R+vRly둟Av rlUG~## qqmbTW17 }˓;Rr3۝0䇴~fubޠgYlT hH9% 4=or kc/FwDF4VݙWJ6NS'Nīl`3rtːdz@:zK5mtk+/VE6,;n%@ޢ8n^sQG|sA>==Or.I{I<[4_8 PIO {ujq*8 oڮ9uX[t}hTF6A;UEnb퐯R"lh=#|Q3//nC_{6wт7י(#_+z#̴!8z[-ؽ:͜ 6a`+Eؒ4Nt՚}T|=N=6; g~aԶPM[ vb^SϽ(a }20{aXlx)oMz[nE;gJY="7HZBՌ%Hp{[1 t+Id.z_GU쐞?5_;n|.3Jȁq]l)CkYm(qX@ ו0Sh~D/72:$`pWQncBK 9uhЉc|_,ѝnyo*Tv hy$c24IK/"*5iɜނ&Ww\c%:um*ltv %mtR䧔LcuuS~cM"1f%&7x3wkedl@01͵yM?Qqv5>L#^<YBԛo4fN\jHh" ? y#;׵}e9-M#5-d] zW6h~L=)ӮЌFnb#c+גa]nY|RwvB)ɢ2l{;k]UO3Jà0ă\/+ѵ,y]®ZAc:4qQ 6 Ed^YSjI"O a3{;Džar}W5- 셢:H"\xJ6t|yRL2CgHLȠ?ҽ&}4tu_g0g׮rrjz}s =FE>-9:kƗYgtF1nWwjr4#`"Kk#rq:9eάCձwa5q/I<ͅO[>enIeN#uhδ9%u'hMo x-mӒE6I}JqлcOWeoUh7Vƀ^M#p M=b iNOo  1-8qREKmͅZ?H#*閥@J1ldyHmt-zFVi3W~]|Qþ=a)%^-q}}p`^w@/_cXK/*>9{}59s.IЛKйJ0z{ 35h{{Z=;Z\h't?q@+ݮ"<@n3k[VO o&h*T N25ͩRȕR-;HwqkL~:;t/;K|"yƞv'j)S?|n]{^c@{'xZzaa`e| Yo߶W 9KqLZcI< Ȭ ->UE@'Dr&#'D;e+!WD^C͢o/聽.d{@wv71Myv/jTZ>j%_Xz8>X(!+4䙁V>I_g'W`k= u-> daT:ʃN[DTEvχz%~qqb@#'uz]1F sJLmM-vd`oqr}{;'t_Xȷ=&'Զw͘~B**.|BӻƵat% TZ6I{ lahU!;<4ٍu_-IWyLx#w/ d,;Zᶗ:_F(_ j_4[M%NhsqV0t't֫v!npjkNIƴIr~9UlNe=3;Uq$wjJc6tӕ-P;rH-0/i܏j,xXře0cƍNQm~5O`_-?an\vFHL>#5 6xn{x@# ֎[UhനHܧ@7] SQ~d5a\#_IAr%\g}IV^-k;ˡL2ޖl54}IOCS2Q4'+Wakn-mr7HN5zQ߾foX6,oJTr+؃Z{ 콶_KrlF_%b;پ(Rta4.hgdW@cL%N? B?55 򕊶.d1R?Cը}g -BLǰ@La_gB۸;h4/.4'OnЍ_-I-_MS)wJ܋t)|B_fSlrU- ZӾℾ &f{]Cq ]oqC͗ɸC ij%^ns)m٘ ]'gްr,'X\ tݲ4=P*eRU- (ܨlN&+y9ÝHZƝ]~!sqfv+&;ˑnw/%!F]^= G ZaG 1493cWdDy |{6iWqVЏ}@2yIW">@[ }-.1I T Ia}g<Mɛ@wh :b9蚶95oThQBt2wofUi[>^o +AÍ_,{)QN69)2Od% i=)ǚ@G Iн -ж)'GqBMQ?Ԓ"4Nݢd&agإ ? 8켧:g+2՗bZZ-9dmtV>< -}yq*NV쉽x.)P`'t}$Į@82Gzbs^:~YEYLSQhsdrDڟOch03XAAoQ[N裀jҟGA`;$MY o#=_10qSnq>3Upz}HCg̀om3]|NK#Zr亽n} e{,i}}[$ K/+cj*y1M]iyqդT& J >. Ӂ~p+iZ&χT.Ԇ]mouI#1d ¾,ut/\5xdTdY9JA;ʱr{Wk=K..{˖Z\+c2RTKXaן:Mmt?͌Šx[^wg 3K㩔(9x'K#dn@bDo=!ގ[}b:nϴ{Ҡn}Qf8;y)cq1[FO&);{.0;&X^wK V#ߗL=gvOrCNw=)hlj'rܗ 庣SA΍;g+?U|d,d-L䡧xE.YVП%:t6f_ljG#zO7tyXhKmWn.z y4u/G=۲~<8HGmt}An1uq:?1O2v'&.q®ޱ{ӡ<M-u6$x7>`/4]LW{=]jaԠs yaO :-~j٦[\ '$vvv{-K ݦZ6+XH=t Bט㍨{C&nί Xܓ&Y˜-fwRWߛƣ" }|Mw%ho2 jEnT,l_NTAB̜A̍GKv{Wu෬Uh8I'-dELN+z/> 2_ji}ٻ^ ZvBBpɷB'. {e!5DsZ[y mXD tsyN\dE"a0v~ ;A/]Gջlh)" {*LFeʙu6H^3FK mLҳ],**l|kK3yfľ6yŽ߅L5%o*?gc/D}Nc%AϓH%ә20KPg)м .'K_F78{* ;؉S!7LƯ/M"A <7^AbՁTx;% f=0gmUXO4#_t*˾Pw.\gֵ=[dl g7BvA+ڣubb=:T^ШU{O(^5Ra=;.C5jr̍_%iCbnQ`w^j.GuUKO {AﱒiApǽpbןF_Mo]cnq@@/!wgWkWb5'tT z%'gAC'fr3RiNNyGf`Oܘ)&<:aTΜ_{LF!C$S] f?7[˄%{tݡyyb]`@+e=UҚn[. ޡ$ubfW:)C1{ 1pGnQ%[ڱyIٜ|dIe=7tk֠TL FEe~e7Bp{Ĝ)v3ajL?JzrQZ[wel9C#_?mУ$@IlҡyO%\ąr?lpf:0B}e:I[-}3ܩe+zxW4os:1:hBh| WeUl} ~>e4oN5Qh}Ƙ 4E5=6JîKuךW]jڈM[w9LjSȗT>i:zNe4JWMvh|5d!&ÙMZ -^NzMm }YHuߩtz@$7& Ax_ |VK,KyV5< ߺ}4+rGk+?C԰a~}i+uT9R:O3x|?KJ)W2N{gÝʹa$Qo/mNnp/sHVwڴGʛA6.Dee}?elƢn|,A%U~~S@Oc\\L(43x 1"&b&y0'OLeoVQh~ft Mtl5+@F =>O-q1 -F_\d c*2O(DL*Cb_4Rkboj7ա' %s_b78,hTE3opR;aVAno!GCSlU Z[]tm5|x82F H)֠g w[h#֦/9J>#w*}e\ r?e #ʒ}#5֟lЬYJ~.#/e{{Ln)h:pnG_lOțςo5<֦hИGJ_mzW-g -;##{<лs#=2hhAC_8o-УsM#c+|Ҕ8YpQz6eIYG.4IrsAQC笓okz)\ᨀI͹C(q`hV2]'v?%?"hlQ_|-ğj7d|ѯ̗XxV+˕% }"3ք|,l*\%;\;]6.~_+[$>rgkBt4jM(VK=@y}}-g =za%JCv't iRHrD+=d$҄ ;ee a ߃ȣ2þNZ Ed_[*ϴojc3D z@?%GQ|MiWVdXF_঍ӡ;Bˏ>L^oe^pΣ'K~YN;^ ܟ }r|":~~ ܙ x22 ߹լ4].;6Jk7=9Fz]{HѾoVࣉ~MSc׏%Sohe[NJ ;tFux()K&|ȏ+}t.xk:z̕U9 [;,9TC< >5ˏ6I"w }rhWK}d'hF{ֿSL*rkNjrӷX'{*5~m2TMc|'ɈdW,^h~iޯ[5TSdjZ/{Aqc [by/~4ā~4SAelEXd/ n;%-Hc_y[S+sqv_Jdmo=h~K6hJ6}]MhhE˥~ (dˡy;`]+΍} (;%jt6i/LX^c5yl ן/Rܩj=If~=*\dZψX 2{oe­,7A75n=<mVB\Zg: 6-sS}zϡMs|}9[.kJO&Tѹ/iϨت١OԳkE~+[|l]kj&\#c }/i/2Z(%oq3nW>̋>Kbܧ| } i)U3WKҏ;"O-6b2-G/uZPG+ȉߨxvFUY/97[:`~:4rRf_)wյBBdVC;[ߊinRJ7z;@?'#7׽Mdْ ɹ>KͪtkTjklʝo= )wCoy') 9u?k dCſ{6kŞm}p)OɠߝmFt)4V=:'+\!-lƳ9I[=S Ԥ'x1ay|n_yyNϒ*6MX\I(Ƨ+-3uC_c0 ]#jRS>-y}MlgBU !lQЦ;MUN~IҧXh~I vh  K+>ZY4%f$; ГYzA(Sr,v1-7D_RA0_ z3["CpK@}wen./J}KZ_[GB Sdۿ_"z*~ECf TF}+ 7*]>k'9ޯQz7^?G>FW =Q06-\TwM d2 _;n_ `b=Q20n=+8ck]鈆*QAʫ?&nuXz=mv?-wEЛC57O^B ;sz/{ͻ#M KA}§(;1 Ml}2*C%e l1ڔ][%gҡ͎Dl/$SpS߼[hTE~3qD!8RF rsNr(T>owBfWD5*Mv5cVs_G7D /GS^ B~*kZ5]#_kb&KG{aӥ s[iP:_ܱK ԅVr./>?B8Ӛے/Egn A5uT,l = D>^F'|+Fe>/ө2.hx(G_:b5NZ6~Ŝg<:}qS!R| Ԩ!W̝i8Oppч=y"qM+vk/nƍ}s~'=Dǎ3 3sQkVź}紌Ȼh 3'M =$+BZ2D1}vS7:g$W=;u4dU X yLI>J\9Q.8VF"jf$E.#{9tȿ]X6ϒ}==>KxO5z%h6=Z3?؏%843)v'd;c,rH ^2)[c&kѧ&-Z7w hzCA~q;QtܳйiKhCN:qR 8srqCR&{f{C?~tXe*pO唿 rڵB@ ڝ/ոqɒo{Pr.xÿ}_?{p3Ӝ8͵227-؂"(cؼJ_-DƯWֲ&_bq%[R_ŚޓmY{7+CpwǓt 'c?_<?&;ǩ2ڿRFo? "IݩQt>|w_/\J) t?__wq2|>6"f{3[lG9iCs+E&#!i%^!~4ė/U 5*ͳ+_p߂a:qOj4|ZMO|oɳ;cGWp]G֪0eiо w)| >UViסNM^~Z [u4\eg{ܢ(׳ӫ 41ߺ7SS[&*_/ӫU{DߙF Sb/C7*Lkj|Al 4DkG'zF,oW*t~n-Ʊkqm]/9u7ۣB>1ܯ~94vu]T>c,u?I |}Y}oo~B^Tpgzu,W  In[~]P3A/}|fq3d˼YoA?nÖcCYbV#,]n[zߣt_ &;Ī&&a\\\!{G]/-ei,,ŅyqvVerY3[7:ٰLN鮳`TgSŽOU&(獵! h'z=aіL|K^xB{5J9sĞA/~S V&p\.jv&Ǵ"W ]D,c{NNsA>ޛ~_ծxֿq\A.XSvq s[7u/vyѹ12k)w|A^h=j5lW~n=} a0evmiyhOxn9rz)IuӪ &YhipC/Ê~ /iBЛ\Voߔu8"?RrFro}:dG }Nq8bZGyD؊žK6\ou?WՊtv0j%4FSOzK: \\?/Q:&orڿۥHif(Z$x{_/*q^ (OGljٮnőG$qj\(oziA'JGk։# lr۹/xQ&}_75?B_%%{\GDbr#f{;v x @}>tudOdJm>Z'6=vp3nz `;h zkBV/_./`+\s}O ZRg%>>ΧшצZbSeo7UVJC! >ǛI2M*ӌùt^I@l/gJЕ =ou|:H>ߢvR󎛉WeIimu!S* ДYAdG#@oQ-L+`qF걓?RY4.|O͚z. =YܔٯcIXˈ1k I#u'\3<lsİV4^?^笕SS#m|yttE[? Ћ,_Ѓ5 h ե-m%BGw^*늾RHõ.DvkRK ?ُ9!_&@zOhވ7z e:v-vaA}>kdt}Vknn^E4JdU;4mu.{Y^)L) <ReR$?nB>ow*bexC_Sȷ7lwӑi µF //gx_dӓٔӯ< i'PCת YtC>x.~潨fyȚF !(Y/ӵ:l˴F/2wϹQڜGcN9#;өzK/rC&`b93qZ R~B{@٢sP߉JM=~ÅJ=,~8徥\Mq^IBKޓo%2FS?,-A'I#jV?{Iu2Qn7-fHC踩W/FF<|wC7YdLᕡvLW#rO9լ;/m AӓkF&S[D*9Qf($+u|߲ZBDI9pQ}CvA&<y2W7RpDBFߣPR/Lו2Q 4a'c Q~M+r~)4IH[uBt~|T% ,:^'ڢ|_G +Aޑ3Ǜ~dNN:P:ߜ5R)T+xx5R~|~1{cPn>o{N:6i|rvz< )O".zd,ȕhԟ9!N xG=󿂿Ed+`yԶCwՙـ{]^-ޡ) [HChj7X;#rv_@N+nU3K@i6ZS=v^--J5fԑT>ɳ{_XB[~aU)")w= lgC4_G=?,ᦚ`}zGF,5/vݢ)\c׵FB˓l*C_ŧ#7o ~/D" 3Р(r|typr)u ),הoU/?-E.n}9{Iֿ?woAP퉿Fa _ub'¯埅n;T~?Z]~>ΜM-&Z/{ ݡgR |]P*N7KUIagB?iֱy~Gv)vzd_WGށz.n9 >nzGažůbZRi#wV:[,ye)wGk ^s|FlмvS2G^p7-h2#o)^.ZnpO7z Cnϝ|*\. 7=U]]I-yJ^kmn vBd)3dql4{ M|n=T4>7=F(<vf,4iokYZ`ް~TH$Sf9g(aJq_z:ЄXW5Zܞ) CL~΅;޺.wjЕ voTƯٮ!Z%G> ΰ{kF_KY z9þLg4 vhQ譍R2iS;& @yΩRK h{ H)Wvh }}]U'~{v>2E{VhQeT nww%eUUr@n?T 5F&r>r诨kҙrNkQ8w# a W7B~b[O+=^XV1M0l „6Aޝ=ugI'F]wt9i'M].-zjeg~Betl.Rx>>8pRBS58rF8r]]kq{BkpOKz2b:$]?zo®:B|-6З^]]Й }u.n=yau y ߐ 0١99sGܡu> +/_f+]X>n_*Qa?Պ-}'.O ]~F Ƃ\>)UG%k'=3=jq>b"c '?vq=&j ^bDzF{ZGIO5mɛ@RT_o]jakp n̘]]^зF)^Qj"٫BdIv9`~ ,b/󴾰ۏ2:r޲׻B[#K{i7>t|}<͐& Ixp7צ(k/ ZSɬnΌm"Oz9EJqWO!WaI&QL=ﭏ+\WuZGbkE-nʩ vB|1=4&[ NO5ӧT5зTB'ɮvdRe}Csd (d<~~ԾCe7b[ 2f1+@̞G嫡KRfK2)?'M…NľNc,}ݥrS^9.!ς[b/Gxə:r mZ@/h6kW-71IM3Ck }|onOHZJSD9 K`{JWBnz:srKʼn}T$@"8'v*l0NΙä\~BC:HhrSuku/Dybe!2Ж'@7=>M]&^\`e('E↝TEE0ȿU_[Z7鲕ȕ&˜{VhQ_"m/7ЁOK)l$|v).uW( *Cij'+f=>|h#e A N)Xr}~MɓjקTn´oKFG0_Q<0>ո梃㉱D=çy18?.$\[Ы1*gh>'Z7A8F M ku˅}JK܄qvo H^Q͒I7+=|ɩTcؖWy Cؒ('tЄn^f=9Չ}\MNḧ́*D܋9kPCfkN;1?irNsGo4KW ҰOrƒ,3j1ΙrS_w*y|KE:Licvաux#ġw,BN6E_w( gO[Tl.d9]iPyb%.Jszi=xhY;:eJGaO[D74 uh>' ]`Eؚ=s9);cmZ3|6|ZC.;ԯ4󓵖ƢIq] lMN?_ WHxN_OɠߢS&Q<#IԾrgkCm8-I|>ߝ0=|{s|ӮRROqqBYr z*֫3~gFR54Io=D<:ZVBn ڴ$t|~ί[,Ԯ5n!7xMzr7$!RޠW_q_y WXȇǞ}j:e{o5=+}oa1ը;㐘|W[,0|͑ Q"Ckl)O/lDnRaI0|!(«Eq!.8i{zItL`l8-߷lS-Q5nx "q/fZu-$hO{o'1YFo=92h#K@}8>/y\3'9: Ysg=D=xcTQg2R2/vnNޓvЮqD^,4͝] ~{8ڀh+-y2ȉFq?zmzw}Eѹ_l+ʊ|?zG{ Ǵ}oÖ Aokezž+]"s/͐LK~N?3ul-V$.z*SqĞX0T熾$GAo M!&dqBc V/&kYP`8wJ ~qڔ*Rɪ7fzIYG3<#(تҾK \Z-7o7K~]GrZ4hMN735N8j$OtE.զΜӝޣG;,䜩R{02?K_S"uYp'dY7@d+ަAIerr \俦z*lE>z!g%PM-Ήѫ\%>rBF_bsCm\(lo%NPhJ!j_/iB}ơ=.* k㌆rTo;n> ?W> <CW o/L ߬I{/џtE++z(5{) { ymO_oq/<"{|Zύgmz"ڹ7ímq9_ rPqp}Oڠ~ ~Eo"7NFf77K2|򅞖hXS$W2/qtKe}Y :/I > hO ~ڡ ~t3Z/uT}Ͽj:-9 7ז@OtQ ֓^Y/2 H7urOf5\{7\dCqMP~U9/)V6@e!#&< dǽ('[$9ڞW5 㗍{ګ)gG:ÿUco\!/Wmf5gSƟL)vOq14M&CT<­}GirIR#5~աoH~Ǡ7y~p5ؽs,=zU[)eh}ߚ@/|N<%{'Yࡋ5*+u'+Ѭ4WѴh}˸;\U?Е;nƍk6+ )[VcQ &6ӹݵE` v!*{Żb5e\K.ɧ;[b{Tk9NL:'_Sz.سR#b/Vrn^~|po5+}Qgi2 sb䩠vz'ew<[ J ""0Hqd ܡs\bvpҼ]_ڐMw \*_͟GiXݨJM>agj' ڝ'ST?)C'WC  *zN;Ch 6Or |:|-(lqՎCq-1.G֠d~Oo)wvͲBKTi଻UntmIp+<#F:BN?Gɥ$khwD4 R_ŲZ-"{͹YgF9:9޿ۻ!e5^nǓO! ZgT+$^t@iDLɚ5f z>E`L!傜 K T _GcO;e>(4#QCM5Z\TӼG6K =4X4'{^yߗq>D/3bRZ`e6g_Z|K !g=l9}_rv5)&q75-ء9wyKQ/Å߿rGh3>JA'M#k_)~L_WGdVZX(M簆Of/ hO={{ ~K;|9_&yNk\D(늿Wg2_S_A76ڮrǼxy9O:wDE·(}VF)mJD{u߰YGm{]kReaJ?V=k{•|.p{`Eqlk, IaXnn+L;ܴ!J {,3DhXس!;K %fK#pmwCO%f}/$T;TDZܰd . <# *\^ec{jvy=B_w3ߒ# xɖjVVeVj%o"B4YU8Y%me7WuVۑ+͚7| bXʔ+;ž=]icrܠ 5c{Om {^w[$"K q1שDYoK.yfLP[nSC?f3J9/m }AZ$jjXŇ‘Wh yBm_lc Gz.80h-쉽 :-nJl٫jOk4|l@/WL^ao|9[$^[*׭"cm97F=Zb޻=ON] tꑧn1 |xqS3=gΗmKNdž}EҨOãgj95m/{#id tz|-HYX ]rj*<Okl+ct~w)K j'6~b!=M mlw?Гv2 7btۢu2u_Eۏ;tI_:4FX fߖ ݳVY/dȥ{5P]M-dMծOkQB6vIrυzb|)4S]RŦ>t͖zvK}mF؁('ʥCsP;w-؋}C_k&qY߰S˯Nr$pRzeUV#3%]GOw1h{v{9N蜼M&)h{C_gM SlFB^Bή*'^qyHTZu;l^r Yj{uwK5G%O~L7 w{ݒ#V_aԮy0WƔ(gج_k|.Kjja'ą8nЛ1GyJ >$mok|KfU䨓lx9mw?v\AJiO-#oƞ7TD:9y&CG 0=oE@KC'|dZA, *{Sh5h-UAА+lQHZCnHb́"gHD,~n+OFʆDzߵs/d9^Hv'tZ`$"T׺=ۈ\>*%(w#M5e z6)1k^}kI A{mNŬaG,dtjq?JIAN%ՉO5GAIܼA/1zĖQOKЉA>t1<{5M{݂~ZLf|kƞ9=~ =b'vG(]*N r+yw?ƶ,nhC/z"i沶z mY<ל(N<8Ӳqt G]ioֺ-*o#׷uhx7rmk8-ط貸,Q/l(R|}}m9C5T^)h a5yg,cOxIFYGSg'9 [nz}{唪;=Ҵ>A0mYh9^\^hoI5%Y A{燩2$LcAbn\/?钦/9K27 Af%/Nk sP;bBelmKxBאWvh׶ڂ?Îݨc)OscdSɻK)EBJ{hZ1_!?2|ڗ7lKJQ8 =9>'Ŷ) (%R'mL~Tgh& N饃wJ-_wh}6tTq>> w"ME)CȥLN%Y͠3s_T'r3C>dxcJ>gװ/֡ga_ϣ ;Nǀ\B>hj5=-7zkP~RzLu?0)7-q -.}&[G$`c_ :uBp)gkV>it }tqoHaW콽~NU BO;i?{\+ixh*#6E7,?q\}B1ݡ T\(g"^`^*rǜ*OR3912YiװvCRrlT"OkްGu-r|QdY^W ΗX)I1 $+QFQ;?}[LGi5W!$<(#oQ)O4;9K4tI(ijhk`6՞+G9ר+KBq1[zg!oBVwe6w䨓-r7^з)wϒQO5t) F/3%:Ў߫+tޒ)k-B 'whW.*>S:!Y}2>GlO^G?tà);~`oY 9yhaja,جwo?) ]AO5 1:q{xu=%>UY't|Uo£ap~o'tHAnMkL}lemUZI Sk5s rkV{5G%7Q }عN~cH;eEDՊ2d `1S^mE= |z=Sz,{z?t^atG4;j^b[\q22D"Tc'N9^|-Ts>"KTHN[ ,zKC^Ǩ7,}ӥ=q_ u[un\*9!!j ޢ5Ȑ#L@Qq!:iF@{ Чڠ!$Yս=[S{?PdoPͽ ]z=mƺ>;VL9} #.7Hs>Rt` mwuo̺s`ߓ/q}faƠn,vuV~{"N Bvhc-,>ݽkBKy(EN % w5d7t4:.R;tRÊ_\Pl~cpz.5ߤT*ZG`SGNB* g8B+yVcwݔX1dJl׏&/<''vt*;g:K1D&t9jjC].Yt`7OztR53_{F.Ð->R|$%CB s=K:9(!ݷK4N>BNj]Rm@?G'b]# `?HشCz6d#FN%piuj C>ij:aB't1R lLɲY3AOԾ)* ?ؐC{WY}75 '=nqR/Г!ۉ} b]NZyʦlxsF~wA h.?9ȌӞ hKp^fy׫ŧjC J_v'WL^9d 1n5WxT/ven![x̲G,e*O*?RdZݗ< :zlBe7+t~S Ǭ%Z߉ďh|fCoIS=Eىrt['Bufo\BQY"10N頡Y&ĩ!,!-Ҧf7u42\zܝ$cSŦ&n$ԠuidvN$*MVJs@W#SC/?7ͧj} C%Y}7Ͱv n# }Xq2NAW龧Y-Fdt 5ԂJ1{K,ccv AsH*VmIqvϊ7[Ūh h/b\m|lR JmR~'A^ƍyf~mѿef8?²}sT`ⲽCv!k[Zk&I2};A+͔c:se2twc i'bz$+ ;Z^-@RAnCe mgņ}Cޅ!Vܺ_啑=,'ݛՙ B?=U6jfNwkA}?~wJhceJgt8,D-:yr-_|P 춌7h,iUA Qt IH{>}5hڡU[-vVh<) yWe}Sޢ' wƖWFy0-n!g6M:lwzBo[{/eM(ֵٙmB1"4Nـ/@OzUM[fj't\mr!I#BBMe*C+Gպ*@_^0h;U.aejVtv)Jrm-bBO\c1"KDq]IA7UH*LPzLvHOYr2 4T}h\Z7TGϿnaޡj?-Pz&tpb1҄t>ngC_3}@-ھ^_C6\9=rp+#=_;<Ƣ5_fidj@!GUrvw4=i_w{=6ԗ(;aVvXВq }KRoڽ;O/Jo/mgZ$QoW\4ee~I2ّy x.manN͇Y})BRk,oT%̀;ݓ7M֨׏ }`*C'Ow,L1JIlk͔'p?Ӽ92'vyGE ($ӽER.VSSf)х%vAnu[5\3^N6NC^kuV W_wr-+|ۉݵbbZ"̈ 扝YXKIХ^=nK D1Q.YQmxGAfͦ@YF+p&1kK[G22~eek1IR#I={ߘ8'rj(GsQ^i^qc:s8 U-7rfhJ2[F;8!I\q[n/lqGH;?priKfB@bC{AL:y}>'}\,cǗBR3_;qyC-!ڵ^?k=di]D_#qyġQ|#oAH<{ }Qa@wzk?)㺸hBхD]c \@^C^s8~IA3|UWt UT~#_jZ_D6[~' U=ȉ,d[Ͷr"ozK.Rc |֢%^MgЧSE%vMYvFy(#OI<8u}|E֑, 셡ו->%i2LOs/У?Ǎ.eB]5c.kQS}Tktg[ J?]!%5/Z3s%R3&\>"*Ȯj:Ib]:c,&]ԧpr9]FޢZC"8:G8_ {Ȅ7 B4g 5dfv R_li52_[<73+6ォv?e,-2䳲 rӨF0Orҫ5I8ZbaVcv R}9mL#%kL_Di[/as"X>չ*iE6:[R[RMK]Ir3vɀ/ۥ nt蠟xeuhR=)= lu=[lHv: bn^d2y7r 6`e N.n)y;н{A+$Rh47tqA3r_ՠi @n^(_jr0IZ/V$T_FE X}{:h؜=F}UG&i7i\;:3u~I]ݡN)@^}-O0pݥFvH1d㰹&K^GQ :D=B@7h^Ɓ׼ 2Q,zT/EE5zόзJu/'L^U: Ϸ>>F͵}f5v0;_ Ya<-JgihcR\Z8@>m#"zo]t/8^1>^FzYz؂)s%'qT[ZG^v; JһNRxT1\[j u|+tV93 x3cT mwzNgFNQ^Ɖ,:F/!ND1BL?NIdț#"/GH7]#m[.ʏ3u5{]:-N~_P׼_J㏯/}]1h=Q59,p[$XK[\d~ȪƀnY9V 8%%vPmk`vڼy@ȟf>5:8[s}Rms*ЕQ@l dGQ^32zIqWFzY=Nع).1)q6k~3F^V-ӐmtڼG-u(0 >BBϷcoLեx8 .䯎Cѷj06^̒A.yzz2J䳼څ'MlnCpWx"cy.`19*v 2zzt#'D)}`h_^ t`(rZփ4ZFrfPAd4ogė$А5^$2Vk9nf'9|uX}yO5?rowMo亏Ȭg8_:лف|F{/8Όlu.8ZxM-.wQ.*<mD1&@_Ƶ9L/n`9T>@E>XAnފWyBFvG5@NoU^EHWr3[tڜ ]lj\.|wTnɮ_NRtthZgq,3 |/aBQIIBU7r*12ԉo/͗YO t'%μ̏ՠf[[@yr`ws_v;K*hȓxX}1itaߢckN珑}X MW_/zmȮ>>F 2.{'r{]>6wё;"ûLHqisދ2nk M5~ Y@[%xSN路k+2?z?돢 >[G:twݢYJoВz_ϿߢeJYJ ysTA1T@>?R tuP>(Ľ1ݿ|I2`pѨ|lu@FyT䒈DNuH*TWeN_k[[:g\.t?Pqs4'ۉf_ik].r3M_:3M+)ܠD#_ȇl"?Gdt ur~m7z;SF@` :Fc/w!wu>>w;|_ EXN16=Z;IH'+-mۀڼpm/Ic )Нp98)*;[`Ka@[]vKN>ڠs^ms(bYʸ?12?׬[0}H%VGb-A:sW賺><}|r4;0?3iμDLgzVҌ@o%-lB{E ݳV#nx&A.\r|Z s:$mL^G ;Nhbs/o;$vb׸$chuIzcCuێП "R2N,Z[yB'u~w+:0} ; 9EI]%5?>*tD'n0 OoΠ=="zNw|=7Z]rXЩs;SFR$}c(m ,];G;[з0>SNF(ߧ}ݝCKى5e]ںbUe"'6:Ogo9ݶ+r8F \l?<~ARƁ|K8nSJy@BO~# _G>G]ŀ]Pk˸5љ!#DKb7I]fh90V*{cjpGS#x&I_6GZdf nA"[c}):6OfF^wzv f E2/"#wfU]D]W)r ry&?)<ݟ"h"r/!NIz5EnD~Kweo\作֫ lvl \G+~4{y`QϮ˃V ѥF=`_ 6j|VfFjR+DQ|ّMD_k,8|L7UCFO2_8=05KPhit"W 'xJ>%J":;-;x >l/F:~Nip+ߚ*JMjiE+ E?둘uɅ+jMYP=e%至HmRG>eƽS'ZƬI | lay7mK|@5$7!"2Or&QZ)} >i-An 6A?&U r++i6#AA87ZmЕ ix2 ʥ7x$ Ld`ʯʌlڿ^sH ״5<D@Gn?FpN*s@6!/uHﲉLyYOT^OM^qnIqW*izKOA85=Qލ}?U)z\yie [ 7/x@i{,/2m G~ڊ6DB/ApmMAAϑ fOUrȳamura\LVdU 󡸠X&sU ]R_RM3 <'Btq 4E|`j: =Kt@}B4E \+D;mjיB"'2uB7W!w件9$7Xo Is 1.t;m^:`heAr|mGAncw=^99zӴӀ>Fuz< tԠ@~e@ky#z- `{{B0d5mY4G[/?+ǝSK,'rOt% pm."CHA9.CWuZ7&BI9Q^u"')9'Jda1).p邑դͧ  .AGWl?|8QN/-|Uki뾐OȩN]×,+zf+A^؈u}Up/p >ed=kչ`gm|'=W55FOE_5*+ʎd]t#]}뼸_r4yrJ>e&4F.A{ :&b008x!Ϻ@ yR :A';{ uOi*E.@бI|׌/ -vSt5Fem+@>\eaG 3e-5쭋.?[ u363L|IG4gU'MR¶8[[{,I36,.roR],h]w㨴 ##_܏Uڡ[/񳐋鎋 CyIޯ9sƺ~0=.Bb[i /c c[ׯuu?z1J7qѠ3Ƹ~=O+7跈8^ kg?Vh|IUeKmj:W obrw)ɮi{Ԃyv-z^5 AAg/0"'T*st؋x!8En3i^m&41} kS 6ˎty#ѩ˴!g57pz[_( ¨,wbB+uЉ̹#qm>p,?`rqf Zȏ.AwHc@BЏ9o~~".hed2N}Q7\cz~ƎKT9%uɵ8v^:ݞNkdG-]Z~Io=ux@f崹EtN{1}`p﨟X2hUq0_K;-:rB ܀nt=b <"zڜ\gːhˈK9snvڼlzx&rqޅh}l1d0]GW@Ўfh-#2x#' BEr\ 6F^%v@K@=> "rzzq}u@HcMH=<޷Xc| h)c~@m@#YY SJ' z`οMB[^B[EFmj@^qU.[`5*vأ۹ߥn3FLs7~t襺d`A^`i~d0E^|l|[V3k{e!k`sav@77{DD8d{=ӕy5w5l.}& =8 ԡo0 ;JdSv#uoQIo֎֡Iہ\i^J7z t|E%x#ۼs@4 x Mh˥8r 7אc59YgrUtoK $4NQ.v8z=9b@%7wu?[Zt=JfĮ[Pz(^ݨJdm{Vh43:BGBe|k}#](Ŭru6WKzGGr5-Rc㯥#w%K,@_[7n y/LȲKk/>[?-@za\uonA%;s oazT3}.Qz"fv@K` y~zH6MM@N/ ^ SN{#议R8z;Y-cjr@<*,066;RqZ=$` ;t!hJ&5ۭ@rFg#Q/ Ja^͓*4{GnBϵ:a]N#Maf174{ !Э]/{aJJ⚝);з;?z%zc/z?ڐOO >z;FEmW1h?/Q9Y 4/NoJTz3-_^۬PO{ȝS^5Ӥ gpzKXUd6l9I9 tYW?F'6R{vJ0C֓1`k)C>>9Qk:K\ϦcF2͜˯]R퍅D]]9Gխ sh_4B9z\u@~EUOu2aK|ly=f!eNٙc>:͢ՠuG *ۡ.8<$U @94$zI%n kkF RαNM?oOF>!DINsohs\ȁ%Ќ* ]rWىQQwiNg~Z]@yӧGƎ v 3ctrl].|.zg #th1?T8ݥG Zv=ŏpMNEYF?>ViyHG%ۋVi˃<ՠΔCS_[$u n}ҽ3RU/=lNc! 4q@Xq=iW1"Wyhx _cHy> H1M7@|~&b5&du( GT??ѧd_ɐE0G8cb <./D>3t 甿lw[l>_mo|=QyS#6~ЏxhFbsdA/((gL&`0FF+YkGA_lWO}`gjԥIv;NŞ:4YWi3,+>}1Nδ:ܨ~EvWkR0kv<"^' 6^j$ n8~o 엊 wnpfqnE}z/O[?lo!;b~:fNJ|I$9\|JbK/[^}{Wit䋂p?,o"Oh-F3i,sz !{+tAX &$ic@;Om‰k-kK v[;2gqr7iVrɷg*  jMly^(>%ɚeoT%h_n Y7!׬MNk J z:z87Iڱ7& 9܅# =uӻ6'cd͗Pqq7p <[>]4 "|zK_9W9LNqj&/ܢ4]qhV!d-+&,V194ޠZn֡y]^bg{t%iXF-k")ѸHuoaHJOEEitʥHJU9K|,l,YQ͖aO9{.t=wȫ+8.rz )3CKlF #hBn,L62|&'6{# Aq6RhX?|O2u?09躁k$Vpo+&U(1Y/+\Zkz }>!N. Yik U:z{kvl ۙd>F:_ӎM%~p!4-!G]z!^clHhg](iL]%?[̹mANtrאj.6n.ߩAs.W%K[5\<&⒩˸(t!"9ŮH.v5BcTY; ; - , ~K:zcoE8Gkw'Ӻm!JED>|V뜦͓}u.I[h^ :A珧tzc:qޑ"NPG?FJ-]]-bHvd)]0`&퀞b'|AOuugoj32|~lasþlDr/GO@_ Љ{ fgZ{ @-#g}COgWU;l^[xGd֨BFk=25ErINGK?鋚32~b'58:+tQ|j4-]h(Ml(*^#aK*ǎ0 ^c MoakwtIFMvEktlٻuCnL;rEu/ijuwI>2FVϮQ/\Np~RLm>Ӵ-W3n\__jmv֘B7^}3d: c1Bꡗ8sFkՠu"v@Pq>`h"c'ȓsCHgNBN.`A#sgiqʄO5'rVQ1/ܶ.sxptxd~+;.L-$QT># ؼo4YjT{˃_nZyuAtg,Xn5m1FnF_RQ'FF%9 xl]["c織=U9' M4Nr@X$F`o]ay_T_~C]B:{|#YRz.Gпar,^ofT4誈E-^V֫A;ceUz-)s\.SZGJND8݆u[_'9 Ϗ3)޷&Y_tg^?~1GFJoRY{E/q;^Qd5B߾:#C !_\s/w1,?L_`H񂞤R\@ \~~GFQj:vu~?:,ȱWg7_iA3rt]УQTmmY{] rw\mCjط˴{:IklIAZ .|rCSՊz[aW9n|4-rJhȕ@ULkú^8_ ?Hk &$l=>bw:αӕocy  Y;H5Dp2=i'Ăt#c̆L&\?9%_ ;"=e ߧE[s1`+tS4ʞ BoNq/,^}UgEs1Q-2.e'.Dٓ32t't#W Zx{.yTb^K =}-@^;氯%C\tuۄ)Aێ/;HVet(Ww 7M0-Ju #Lev[ڢ7|Y`Bϳu\K/riLO_$́=vFw5gy!o)<^$/}o΀ځ\nՐ/)vČX,;]*5{!u+cq3E)/BkcB_r0JpZvoUtCu7tz$5c#O5r'fP*oyᴵaL5s"iگCCKo'ifh.V:k˺d9g#slqD |vdM :~嫍|9BJdA)MRF,xCKJzK NoqI4Гȯ݅ ͅX,j )ڬqqD עy ].RhhzK:\A@;y_p.ت O.@'h5qE|$p-Ooӧ,i }kr0kkU-R|$4swh|ۇSd=[qVZ*rjSlV/A\>?z?>Adۼ(/H_Y~k;[0K->9 =k|J ^o^5٘@OWT\~N)]Z tDK2 $H%ȅ]Q(W0S#AN?bbNkWɟ_i:_mWuwf -e~T֗ {TݞbzoUpOA 6IDqpR-a; p 4C@Be%-޻}]\qt탾ybrU.7,8` hXrq69:RzD5zȳ^ޠoFr B3,B',zѲhy~@' 1Tȵ }gҐg/TtBZ;0D;O+tjFvK[Kz>Cit" c)dϹ^9i&/ ?y#W+9z!pۭɝ}Q.r "Nr6dwY=y~5䅼^z!Wt ՠ~tv[r ^-iIE޶ 1aϻ}A%D=*y@sDSl\UL=}ꙓBOgW}I<k~8zY7_EN4"0vMZyQ.J1.qS~"t1J?oүޅaߑca7/kvF.l gM/*JD턞>h_j99tMz"/0dwieQʕ,!zN]o^u:9-ݒҫ¾k/-@Zg\ZoQҵRGCO4 ~ hJP7s{sI\ /+F+6[Bg6@n32#z7hmQѵz.]̎${Kt@ICOܻt#.&+F<9$Fn᜺<Ӯ}FNcu{‹0Be|SВEcEnb_5HCorR^ICk䀑mb^g Y``Wglm9.r2ϤaOj F>E"70)3zQ4{?J';~Cfnd|џUUWDhUhw (N lv&:%m%}az1$j$t,z*C_z`אn!n7{Л f'c/?#<> gzSaPK8#C`kFTe_Sx:M ~@ha:tIj5GfI]`Ot]nZC2z#/WJu/=%8|~ $P˗:AtfXAzfzNQF~C"'*tg0֙-]F:pV/q: bcnLYR#GFnܢv>%o \ vD'=- @h'p "ke;KscƮ*FIWZW+Ab+ 'Ԭ~t x+4%1{;L6Ҿ}!ыK!_zԣ`g.dּ|oދŜqKiH9"r@oq!9_Y|:/fa /LT.34ZX}ȼ=/Q#Rq)\D@{ !cl^W.8Nx ?#9-pɵSwFslfz oϷ_;2gˉ^_9u)(y ,2Pd?_wɕzvJ@)E׵n0;g}#II0֩k1r#ҭA_rg-֊pS6a}R^G#;. }r5|?s:dV,ϐz߻Ԁ> v[q+:EKD5P8 zD&zA STrcNS-T#˾Jc@/=vٱqia0 -tC5S3?{Lc:%︼? -:Kf@]tYC`quR9?R  ldBoR^G7to>3Y~GE\.eϗ>ރ/]/&cΏ4]P$ Fr`o_ Qo^i=SzqJN1#yki~-r txh2)i'r۔\ye@g/zw8QYKd^`8YQCGOk: j ұ` ?gi{${ 1Ruu>?ѽPg=r\b1%׽@>h`ȸ \%5ڰ_4z#&{ɈKm0rpYO4]F 6L);,w)4RN/t MITk^9B]Bso ]ǔ1CO9c gdK./UKy@҅CsCS.h^V@.6ROmpmN~Nb7GYW;tAjK9|y:їJ;[ޗ9#p*:8j'tH4 { @@F_qd4*1bðW؉@oL됏i2 [frI-wg?B=|f`y8 ]W7v!DXM{rA7DNh@B^2|CJ~gg =KO^*J:!o!v-T.59R4{?q@5_O]mݽxA >PH [Oى+rk54=*rN |~;IUyGok)Bz!ݠ)o(_4%]LqAwH؊Y =؝syR_(\ehrz[67>Z*/[V'*qzk.oL Y뾎<A/{;#nuܫŬ/|5iȏ{0Xg3ru&0/躃"Lᦾ*K}#r(+2!7p4y!v~ɗɝ͋"]^`KySE8 K@̅@xMWӱ?W}w`Ӑip^Vetgp/}&+>4LeЛa[d.T5EZENR>_D9ze{QmqB#[;W^ˁð0"'͸kX%V逭N>4H[9%FRǵ"Lߝ.K }&#JC~m91zwENAE/zbR\VIk{ru1URCfL>ȧdڋ\s珷yA\z.mlo)1b`Pd@G2zߥQm `[lN 8:H OwTt>R)^Twi$e耎/]5xn:. أE{@O]Rhr^Nw]BG|ڼD|?Ei09?f#.zS>)e`/vᕂb>G2.F)t$Ӑ饹oN=p$3贊K Эl6mV"Կ5354o6d*+n34*nv\pc3P-~hY} "_M%omwD^_땡YzeSx`Lo_qES@h}U(8M24. +TI$R 2yVcddYSn E$W ZbT-bNOUmy(rwf:~ί7bOB3ea4n=ֿ,Q287CZ 9 rlʀV*=Ru6A[ޕP?o1*rg_5AvsxƊ [5eՠm?2חbK24z+PO@)<}9'σfϗ?,rsBaru~*#<:o!O0}eH<3?+гLQ=nJCo,$0#7|٠ӗ"T~j0Ok|$e@/_w\-G}m{O2N<hx|AwxF o?yd +Zu|[7`SxLSϖ:4]@=ֻM#Yoc tVbNU-kZ0MջG+s`-kkQMN^H(W+b9cz;^D;Ȥ-\ݏǕt@wè3ƀ|nz=13m|"$6]gjúO/roP|٧>BQ0 v@ORr:'Eb }%3lrP{t{|Iido+߭DcO@k=ofN_\) =9EN%k*Ґ%]?E3K#bqNG`jȩ;{.22ij%i&]ꬻYնaLn{U|t6q OJ3ro;}SpDM`vtqN$$R{tY^8%0 ?F02t>V0:olxNqs@-j;HZ?EFVmdŗ\5+{ {B&aΒ$9t1=ܥmB7zL 0ʈn"'*9Ph 5zyu>.FuO |S% fSp g>m#7y+uȀ س@/<@Dz ' 8 lhi<|9 L)^٩K&݋V@n{{uFݮ_κFuuVvУty|핑ˋuA~r^66e}5uy Kcu[e%$\*/@wNyӑ={om|4F] }E$^7jѿ Z`d E1e@Wn{2Ya|݅2y:ptđOKbރc>u~ zˉ9QLqoRbeB /%O: :EXV/15]cyrFI#^l<%:^iPkr ǖm#q#OR^KYg|YR9Ȝ)Ξׄ^Fm't/#}%rbם4j emoqR̺#HF{0]:rdY"}8Z|c|ѻtlLD[ t{|S,LQWXu?|>K<-f_~Qޡ"|%T́>g*X5YyCV`A}SO0Ou4L4IZ^80n!rjޠ]& >bʖǠ?XsC~mI_p)bhgq<. FqgvX>IDźpy\Jտ[|~-l)r]_^oqv4%')a)洳2Gh(V}upD)@/C:_uAk5d/7K}57CovwYB/ ~۸Ph6)P&_췌mNzפvskrnT}M#{n}KBK%0uq]%r 謒i^%$]Qui;|i'dgw=9ŝt׆Fޢ>9I͛*dͦY ذeɕ@Vw`]hg=XZ^}'t.ٱ:i LxrާR84!~%״oAкoc\.ݚ2qm.~Έ=9\< ]H8F߯шѰv8|!  ##_/伵SBZ>6_; BR~T#pxޱ v~;6 we"j>1z#YgF>AOg}= …ûY)YjtM 2uYeiH&$䇴v I0p&@8U C .t9]t wF:F%=moL)4Aף m]-rr 59)]=> _ٲ%[_LrB>с|Xr 0VM:ԲˮIzw춋(ȧS%qcKsY%>T`o uWUfF/`Xԝ| 08+E5Wnf'W_v>IhK5tO^+I?FĦC/oSKj/<7[ohIb/zs0ÖX*>>'=ԛſ]doӷBe ?~gZ5Vo1RNwV4~ lG3a}^C} ĞooTX/34$i?Wmh{!'O#(.mT1S @f1EQk aqϑGuS)j Lt@2}$sB>w=\rkE_-$Λp#Nl}Wp(4N@}4o?80ązG/o3/)آ J_Nޤ"{rŤ/gqv``SǾm6}s~Ze";.̆& @g3|,epi_`)nlz/dB?B/FŪ3ܡ>[\ƛ\y/ Q ı] }Nmj=1h]޾y)rYBR^b^Eq9'oבj-.Gq/ n94n0o6ur@w2e/\]/X7's :Do#QRIahI\oucĦF !/>k/){`/r5sTP#LEo3)+" #e =2&$fT;mw*TË9ȬzM>&.-H;Œ6>|%Oy;z%Nq/$qMx ֐~L4R_co-J ةq?N ,燙#-Q{?mNq_TAbJ oJ"˵K6)'B3 riwq [):C7; /M@|wAޜ|9"">oeAiDF.]yJ}. |ǖ# EWx;J Fiſnf )S,*eDlzіC d1@l;Xt٫|X" F wѶ uѥ!'9uyVrY=GqzPgnkdeY9:*@ޯjg̵ơ=U$V]i+ OWs%*Z9(27p r s=-W›Xgh1n mru%sGWt/ןҷECѥp~Boi^@y<3E\蚽ϳ"޶r]6ٙ:7I=ϯ3dh}:zE}7)l~xsv+հ+Ausłv}ksRO^^gz]\ }\=>Ŝ;d]9t-8:рN{sAEڔ};Zj{#}-]\2j v_C`)8질 v ݊["zE%B)rbb@If,$_GbTVh:6~\3sR Btn-&rs\J+c٥ k@~ 0 fmstIM3}Vf&0 Bt3VCHW;.5.&ѡ2eI|MH30>ű#FA?/9o(hJ^DP/)g/.#ߢbl6,井j[!U}ؗE9>ϹK~@~m+.F?e_7hlz CsC7Wet"[uͣC{ш7wN⊖'s5 zLB^zoxomlr!ѕh]v0Q!\%RFlj4F1t)W3\K}{g{fpgdtBwfT^~4 hȁc#}>D!Y9\䴲dMd tsqcaw[A+ =O7R[r| x7 H %z1)&8K""AsПhr h*Yz ޤZ>6  y8&rõ~ ׫\t\\+/E |!H'sш TZ$/ݺ(yR?,;<\o&hKvb{f 'QNA5!w^{Т:=l\QoCN(B$f7^JUp(7y#opMOπns_ d$%;BقŠBmz %:A9Bޥ~ƻ [2l.ĥR^vt:Qd.6:s!BvkTF[ty#]ы8і\Xq^4ع_7=ul#=8n'S\GvBT~/bot^wJCn z* Z4R6סWKh {[c|V .rZG.k\MTpZaQ\ -F,y,^o*:w=W[Y}\7QgFFz./9Bdʥ+i9_Z7F_"/7q-N^wVy^|'5.B"Nt 7-RtA ;L]Rat;zju;2-R]'T2 xSNǖ^"azAZ=B;4stN_ȇZo趉 {XO#}Q>҃7ZO]_C^V#cK]-#Fng3a'/vad/Ww[: ޢS~vJ +aYjft ܵؽq֠ey aл"To"Lǹ)ȹ.=(]}.BWM'ŀD~#K]:]/+'}_ֹO:k!#VW.ԯ{fV_Ĩo7c $Ǽ$wHgqctBsj$@|F Po'zYEk:.h@S/g @#Oc\Ϗ^vQcwJ*ӽ0kMHON.1 H+:S}h:-(!~SB]r1d$'t"(~sҘeI㋗/\wqne`3]6{QoUidCw17rR_BSu4gp9qo`/v7[lTbH;^WmG\w/nyYv"ݤ4,aF$b:yaA꽰[t,uة~kK2'\2#L'>^C]F_/φtF-.[9Ga݈7k3zK0GNYO?Ib2]/Q]֑*1s_rUj4z.w w@Αy3tCk>G:'6'YmbR;Z̰4c跔a;lvM8*ȝ!2u~vA8ZgH{"-2hzL ^2yd9\P#^:7[p)Y\(%v1fpZK޿[pw{z|Z͝Y9AyN@rsDfv`[UcT 5s}; iO׻io_շI^%!|ߚ襆ƏPQ1@?hrQ?m[d%ȕcR\~oQ;ͨߠc߉84Y53b_ΔIaLQbWPV/}Yotgh櫾N97I:r C 0z0Kl1L쪨>)n /qi>!oe}ċrDq۔g]'۰5?lEIA!2'+: .o75fGAdgz&eX^ [9p]6 ʁ.&5hAvTٚ%:r15} z.E)f&nYR/xڗ‚ ?ZM +|\?J\9_CdjA* Ⱦe3)r~sM |JY`yfmAs{| Jun+)!gf@v>8WgשBR8?Wg:=~ M%_2*4"Bqj?^#QHB7WN{CB>$GX#^?~sM(1Vd|W^:N 3便Yݧ܆}@Ǚo8$[/-ZQo|Vkn 7snzj f55tA"[@Nfo37kؽs&GӀ%DnEZJBeTf$yCW1ZI F2<1__LMV4UCpJyhiq@V;=w-|$tuWG;Nz%.]`K]b=—jrpFwtE>\:)[1(ZyAϻA'^i}X{!`?$َUnEhPy;£< PI=Kg^h0cbum_}3cEy ==pڜk!{ ȿF*4k”դIK=OW~̠؁Fȵ0|to2z5u5/@S ɂk 4˹"ztW@4}iR~¢U,F7e<S`}/P襝ȷ2bY]uiI iջZz: $儞i3cF\ tc_"m}i(=vI/90tη5G7;X8,xIk%j']FΉE.k>,X 9e5lueC9.ӁR2?J.KvH^9r+u^*#;z0F~;Gi Kl%3rSz|ە4FN^8p;ң9*:uɭ{(L'+mFSI): yhw1tR4zN2/aC"gYGjG-N zfN]]a䕻l_Oo2~UJ7fdY|[Fλ쌨ȍN=FNu{&~ KHq"r4?MƩ]4R!c]v)=aB7סR4=gݻn|"xAlBK4h;FEN)@RQ+h 2H<]d_$)*ݗ:]E1 F>#kxą^gQVL9#/cTNi] E.[/UңJyk]6e09΂4/*Ć\J 8Xݭ؛#:/tjJЌni_ӛڅ.j;slnrtydn2k.=36Ekr?A /tйBx1/j4iύhHq}s^ә@n o(]&9̓첢_[$F>f9eaGf.Dc_/ ۅ=v;rս~==RP gk(ܠ(=`ύWy/2=TQ|w9jat9wt&κEJ]v\Yz^G/ZN]@}*'*asnA&ddFoK] @-󊊹AkV9+7@v6`Ȏ.4,~Њ;BJ{#8w׊}IITv.[d IJõ}(ItВҳMV˗/? 7y=G=_D~He>/rˣCoB<̋}ORj 6S̶>:$~P;ҖyВ ו[ w^yuA7*WLWbHɄou/Qf"8=S:4&;Q.7&m2N[KGj9—A1;kd OIT 9+ .tw4Z|e';HO*d)M6 g70}w{GFOE+}bف 6cCC*wl9=i~& 5Vnԙj~'2vvoPzkQҌ/xj_9-5Aoo*bT:(%zg -L_HIʯ!I[=|+ns3-#e"*"Ԫ8eo>]B.ܦX~\uT~eی7PHF-3Aײ%Hqr R/.غ^֤Dv5%2^x=cTz@>O[*M8kvԍr7x d Di?>5L_ʿM'ql uF؊%7dfR3v:? }]`)ЫNTm~r޽>57?5/~v]:?k`N2.Ƌ4R?`+[D%) C tXO:PO:}WrBϻK}cCe ).W!BzB"KhR?eǾ-f|(ibo-rq㫢-'xt{V/Qw t=t3#3j2as5Oj91']s0C3^ }R`QIL3*V\1oTK=->Ukv|݋T]H5[v/Zf'=3LnЧ szZ.\VHd@Ȱ 2i&!=pzB胹JAT߸.Z>S25$ 9461/w~n(KzBץR+t{]"EZ|+26)/=͎-RNP4 & _=H`\ L -z!._WdGZ^#'?\fnb7쭁jtǴ}zlGRڕ)mZI 9V:5U5PvoF|S.Nb+x>j{am䩬6 Mz2YO0)ٰYup_TgFNzuw\;EsZDڞ+#r_=r{,P#yjെNWⲌ>Sg};C6z켤ksdDtϑ|Ɓ|uZs)4X> ӰE^wȥi[Q} Wi:nz} ^VxyouzewYeF")-2=Ge2]XЉbj cJX@30z/&04ݕ9J^jW%nTJB*Bk5g9C!Q}f1<T(MNuRZ.S9s(#Nf!A@{nOR*e#^fڕ]{O\(q]ډ\@깞m1#s8$5{N[K2CL.Ktw7Cv>Oz nZ2lklSuwo ݅¾T!>Zλ3{:6[WE®^?V8Ч z#9ZcKzuYN"WbFVƖV^OÇB) fϩ md^Ռlv+E-T/JT?v.Q Dݠ+T<g^B6\(Cu1Vֈ~L'vYMiYgVuZI/t[#]牽=i0..|c8,psS^j@!@ރ晧N~ݙFd1';%` ]5[=0޿ә ]qZCkh{^jЃz]by{˛qߒِBnZ¾Wrnc1_M"7)ԙ7E.Wi-YC_RN88#Lkx"VwC.G{XVQYOe 8e2CNAʮ \FQ%du^[psuqcݢdЭ fh&kol3Eс }K__M4m: :/?J;^.5Xcalmҵc,PZ>ٕ^X N9{(R5zqsĖߩa/h9GqB!7$cJB)X)>,)z %CI$%)WfI(};/h5YAcqĘ]ZU OedK!}A>Stb%yIn[1U[%|"@=MS3`'v 7͠ꉽ{T"#;asZ=U`4>slxf%_y>Us"62"b=KF~(1ebozmL&[ɚTLEUan.ٓ0ɉ8"5VlPn% 1;mBefh9 @o<8&p}r3^DlF ]wh jf fdS~q;Jzve(@K1= Q%HP ] G(N4uFSũ_ v&c6.ŠGQ|[9Sv\O;`fQ!}MP4?Q'^cG5WBtnҋuR$aM?&>փ_l Lt2d$>;Y =Cn/ғp/r_j > ~ӓ f^"F'i`2LMOc,ا6{7!q ]m!wY}#0͝Vy U䯴p:V{zjmN_0vVNOo=$Fi"n:(zȉӌ%ޜB Kް86Anza2N]O۳0+n{m,-/o씡l@N[\\# (S!{z.'Qw%I8CmaB)ʹ{fОHp:pyT,:߇ڊ/yvc~UH2{)Ryî^^Jg|pq'zj//E6w2LOI TO߮ޒ㾈eI..S{f,dC/AO-D),|p/9o/uר܌oYCWGÝ/!fQyp}&i%?]sa3Zz`@q9r=TtR{N3䆜a͒fm14ȄZBɇ-Լ9~wBBnL~K}K[]=9y/ω ] j>xG^w̷BbZYG/? *нNXp[ G/.9V5i/ݺuuw(X]dh5CAl/Щ¸`^ef]n~:_+_3!苕s\ꀾCMVwT'&Ƽ@N EӅv)=*5DY]f>R`fNY@!fOybG>{P'!i cwZCM*iZ3BZIwR;I}ƨ}3֡kUwiܰu'U|tƩЙ\Z$D-qiC&΢{Lcv:Q謚_8CN{.OZTO n2`oqZ Bt]e0|,:=wjF1:GY3| W4JyFCmȶx7tn;1:w=EL92Zb^ZtjzL ;_ ޔN+Tnju\FY3XO7Mb~4 >jq1#y&k=bUEGc3)6'2}'8H}>M OCŮN{2t5sMz =t]j=J;BՆ ҍ]9oVO3 FNHWֶ&IDoj_'T Hr^gbEVU7Ȼ|/.ҿ%StJ%e[er!UN)9O4-vbo3.^ެBkF 3_)tBPgt78S6SՊb^zz~eF_8Ҁn9tntѥ=J+[ȡ8̴# |Dlb/UX)PMh["%wU&u9N[MǮ5Z y ^{'N<>ylB&zo^hhz|ݝ,Fb/\_<,PCڧ>Ht=nsBjɥ}p;*X#cXϿ:TZ?֫ݠS|nX>;g>ЭVZ^_YfCڝݢ*>8rv%F~?YYE].JЪ2^jTy_J/E z8_G@V}]ӈpMO/T=_oqO/f cBȨ(ZZ?TVЪ7;>k\la $' elȆ(e} Vk5Q"mjސvGu\ʶ"u 1[ n/Yu- ]_l{/VsCҕ."w/͏#>)h@[ EC+;_ƗݐJL3;2]_𷦇0NjY_,:'3h:v4 ZsvN\._S-7ha- Ѭb_ }nWz^[Cl_Ƶ}MNjclBȱ"{hئ ^+'i]zii tCzEbԽkj}hEf<^ShN=M ..vtwukNIM`H|\nMArZUKj't* LwObcq,7֣:e*}o(-|b7uZA>n ZL`(}S6\O貲0ST9o՘9 1ΧozMiKz=JIҗZ)Ҏtzxl@rBHco9S^crp1i}dBͯܐE/%^[%h[4$L}1R-2ThBCvf`tUglẋJlLoʤgBVWA:Fg91Dx~l!}#sbЭKdDO/skp4vlȻzڜycU]/^AK LK4/ؗpM>s7r]ag\x (\XYk^ /&&mQ> zebmVVU8a iOT2{N9וhľ_3r68m Zlv@#-9VUa5)o,^FT#{.7[VJ@=K>]է x ѷ vI^-0f t*w/"^a5zcoq/Awɥ^N)*U+4tz> rOSF?jR:V@.&WGNxQ^ZH(/PQax6G5j{ןdרa3u4^0 mNWF^|-V{*odY_y9{QtPX m!,ذREAz`sftz =I :4c&n%yBt[s }_k }^Q[ENu7/b7J'%‹@0H>VQ]oGȐ*:MwV2jGitq"֓i__-G[ٻBO<l6sIV؞rq?v"?&>R F:p=sE֑Kv.uKL,mмb= ": )aمfn, VX點r ]Ս|kj\ʙ783$;An4#jm?"Ehbȁm=Ͽrݢ11cHLr@_gt{ z~nt"HxhD~f^?hG줋4\l D} aӿXԱrxC0:+J.KDZRt}tvCzCgR)P Vzt]F+kHV>3 }v عxAwt }]-7Q}ۼP=eENr /Dƨ{:rbAVC~,ս.Q\bԁv3>.q*}>G[Fނt~'!UJ<{)\@ J]tf^ dS Rt:TkkA4z|93R\OOV+4x߳C_ުqD^j]O%tiCuԎ*F]j ]Qץb!~mdc!hN/s( 7%Nv8J?ed!e#CRYZ/"H\SцAމO(L%zptiMNA6a4t/+TS&Fњ:ZֵԺ/gh2^b^LZFu0[Z>V!~D>'U蛣^4GM]@R@K!zG2ú= v莝]L/v\Z)]'eCkT\1@~B|,K?XE8]ٽXIS:2c`ӽwzr. #?>n KW/2 :o&`)_)kė"Iu!\e8~CoHfk~;t n#V Kncthfo3p N ?z/L9Tx73a3x"ҀRj9Q+!j|@oQDOSܩu1 hQLb.'o bqGb3ύV(ry=/rtuJrNc/qVhޟFKjI(4[Zr>S{\ 8PTd,QZ]j=}J2>=6-{laCAvzKv39p. 8Ri!eIGgC ۻJ ܖd"ok `^|#I|J]i@牜QV\eDntIir i;rجEca|n ⸄ ]~Kt z=QY"+]u~~r,ѯ7.pr FWmAE\9SV?rEŲν"{rt ѱhe1El2҈/gP)Wt[s=QqڼI..'u_#z6+eu<[\7rgNJ&'tLz@o}t &c-$2t֠e $uCZzw=[Oowj&W9sjбedYfQc.;>Oh _ur">|#8MW17_@o2$jKZQrz#'[gnI&-ڡ>5;:eWUN݊V[a4lht*vwF`µyv o1*A.q|Ig^NkrEGF}1A7:~(qzjk }zt9t]Bv Jtut|QX=D~}sV'tE3^f.1)tH.Mu"ZIy1b.{Em5F_?E }Pz9zA ɰf_:\/j,rYz cSsqedo뼮 ,-YF7cĀiugG9J̀Truc%I 5v#Goڐ.4['}! jDŽy@/M1q?{raZh/!^-Ⱥ@/YKyUx,Io躮w>-z ȬnEUzCL4Q:"*.:^ɠ׳! y7/[j?m(ݎ (.f+웘m @#gqQ?fk0^`)B}>Rf/ޢҗct^?@ Wn[#huھzt }z z6zXjq[#y[Gk \f[|%Эb-LZгMF'GLMһgWdT&䤱g5yFh3&q:K[2[um|L}6pY][N#Q` 'hR3`/d8\%=kHӒ_~fm7s: Bv!9V_umw`0GXq `\k$tqcO_vhwMDNwVK:) VoTvO5:)ٍ. H-V1MNLtshf]ͮLQ] ] 1"M3ɺ/-N ` }B7I[:eÄ# q"n_?!5Қ%݊Ht%Honj?P,1KU2$߀m'%[^lFc:ߗG;vhtB:K5Љj= cē$3بb*з*cJD{HM,-$.eeF$R>p5k-&Q;oNZ^tɮS/@'^!>%.П9ոCMiui?>wW^㦄kC08VhEiyB{! uzc cد3r`f7r>bw06HЛ^*iR?Fא>Е.?Ы^7uQ 9k*Git5Nڅ&J)c7JJ:4K@1ntNSR:LpSҞ=R\=ߣt]j: :<8՛n_iRBce_;E{/pO޵bO `r 15`nPҺkv#^ʈM'EA,xoGqq@cs٢/@b;2+NF//3.:1Ӂ15FF{gP9>9%*v@oKI*t}AL't[E)/ihf_g޵גPH6o3 Ir{3ep놾dPV5nI>!.${`t&3;yZGJ]Ii^tr];, Ku.ڀkrt Mcf,+(V>͙v=Ui@wG{S4r` nt _$/`~C_+0"LOwq1.ƹhtH>iƨSh}-q3+ӭk乮(DBCǦ-m#" ҏk}P }08@׈E\}"F^. hu6hNR3#dtB{E 3M>#%聗ҁ(Tv<\5_ 2t}i4I^~qE.zE[9aZSwюMakbDhѺl fpn=+#>\#OQM_|ƖO uoNbH^7%ꇽw2.NO4eǨ*9fAN^oɧ%E}y7nؿ硣NMMڒL} taDdQ^h ًSȉsΑ(_'5_ ZO:xo\WbW@."]_,q;C' vTidӗ|BSIֹu爽^{+cd[dKW}Űtk9M 3riϮ."e.1u>_Hi:\ӢFBNN{c7.רZJR^fR:+ \ST?ޣh8sx_胋 0ZvqԢ8 MY#6vg{wĴ=KQ;.25; \-vWYKr#*Vp0PO4˞2XZ, *yy,<"0n/PhԑtCs/3d +lt^Ph4]h s!Z2s),F} uZj$q# d%bKwkb.ň-nЕ/a"VǨ_J,=/ }>1%FA>:rt?>5r@wF(҃;mГ.#͗TPmE3t=.!OhVtqlkuk.=g?H:Yw̾kZW0-Ji/$ƞym]-լxC+;u] ߢSЪo\CƔK5}QO'xk[O/@^捌4 hM){T2V?诙"bAk~85UhmI)a3WON|B++}'g2%9D;*Qr$o]B_k]:H1ei),\/~[ˏ)8jF:v'U~M2v.Ѡ;~{ %WB֐.k(&jвV2}5_>U/9V ^נyo Up}q'ɘ @7/˗~J hJ`' L r$RyY6 IO}V%F䣯=|p~g[mcվdqg4^"JV謦/4:C&vaqвw];Ʒ7qTGV]' JO[,O{ ;a:J*zu;x@/vbkEVE-tg֐l9'v A5>{L)(Bs{ƙ'vL1牔 TDBdWC58p̰[&66 c"mkt2id9t} Cˠ?ST?)=1&߇ۨ 2g4u:'K&kix^SGv^v\$U_Z"3^e|ѧ Asc77~*\vcnSj lu;s?̎=[s>pxC*4~\f a,Yۃ]^+vb('Y%1ARyIpK"|p}4T䆪d[]C{$CG<3PV.OyVOf Ll-=˘mwՏP6 ?\BA6H"ś4M}~`OUFNO_")3?LrUt>{55䤀L.4CS,[h-dUα&[ wq`> 8n\{Com*_4){ԒY7tȔ/~KDKwy 4ǔoj:_t܆׈fȮ5$BnKc5e䊛(= Cs4}hLFMN-=MC^=.2V5du '5dbB ^}'55;p}Fro@.Az::c{ `?A٠E}5}ұBY^gmI*ɼbǔ}{-p^=X\6/=&6bS [ޅ$9/)\js45hmjܻHE񔊁*Z̐Ad``K9yiF-[mOnp "2)ޡYJx=K"SӐ;5ZNstȳU#OДA/QХajGvqGвrmyA< 17Ό>Kh )TԱ5G􎛸'șX-_^E ,ЗY{O&Z]3vlF\h7bjƋT3?CdPZ&,":O>f5.,[&,O?:5XV)M#Ђk%_c;ȾeRnݔ-t&֘׶ w 6]V6h'Q*^ 8}xD3ggݡ |]e5>׋˄H[,KIB? }Vd߈މ?jM2dAnbZ`aO3اO I7enO?Bv S5io%F !`_E?!=,ȑfLz`@7Ȩa^Y5E ,B;L-5^eI/2m^`yytI`gE_u6 |.K{V -Z8m"S$SFF+.{@߲C8ӈ jjCd{b{tƯCb'iw'Z}sU?yg1ڑS`ŧy- PK'y@i_a9({Mlo#]O)Щ$_lÍvR-|OR%| -W1(p*2Wgl%׉z?'_C'ti8{H9^jR{q\b~K $hC}hz&@UFNޭ UVXH{YM)s^+rUkdL̅ezGӼNЏQ,x<qїp}YrQ }^VJ_Ѝ3{}# [FP:_Ƨxlwc輔a\\'t[(GN }+CupV+In } rPI_g}k >3ȶ?Ӑ,Wߺ5YV7hv5sdRVo`anzЫ&@*儾 BЍFxzuZ!4҉-+u8s ʍ'͠SO=w <Ɖ|f 21*ݗ12rAn7:4v )jCl^ZD~$ ~DžN"sgmGIg>q8Iushq-v8K0; &dGIz"% tFzqm p|Ģ3yޖ@^fDΝ}ZB`A[zy;י\I 9PO#Uks@5][PXl:&ԅ39у;,-n亸;rhV z@ewp uA8QۂY=\ ӷ5Ukr$w[o_ޒ5ݍ| }oIGb՗jtcvx {O}ى~CoQcԬFO*t*GEEENڵt2W4KR2+o-} C.<ӳ!gZWcbĨ:}N\*V}|f\5V9ɏѰZXd{*^F?Ť{AdF+0i(QM5ߢk{a93$wl[@ނ&?A6%+1AjɲDU讋R?k. ץV(\A.q7ouemi˷kMݚh+ЕJs7{KF>⊙AIFiVθ1Jxd6sPґskLqxh5tu]k)rF/I}ZJrθá:L'=^_R|9RoM@ - ERC??nз=SqjL"QOJ }덎fNnYÎ/^3醭}ȧ!y{ԡlM@CʅwاDXC;>6 aNoi'ƨrw- MR/7]zOZ.32o9IVRyplr$FxT$6O%F+R~,M#i<&{Gj)H?<0E ]%ahӍ|EorE7rb>ee>3Hȗ]qݺ(܇ ]Zta卼Ga$ڠ #MOckanm-I$) ׶ܱ%w1@aǜnB6hԐ̂ms*kuCϷ 3.E*3,2r]Z {Fb4hqUݸؽ]ȖF)*Ԩ+ tz.lu ۀ.D[G].cH@\BU %n:te\-[S: քQ_SV}WMz)]ܐvuDu 'vbR$I`|`1㙣WFM|IJLkrn䲖@ErhtN }7HʯUl iz*ZlAs].ծ[u?scrSL7MNB)/Kނ]4Nʗ)/䀮Kqd @p^Г5KЌ}yT9ʼn|r>[i;euځZ;sQ=a Z;".AQQь4Y]T62-3 Fˍu a!]ՕQ smԅ[gom]LIV2cTFW=j?j=ZF/軒&?k"2r bWs=\W,@J[A=i4Ҍ/7q|ItQiuDKXvTƍ~=䆗|(tAn\./[ߥ 2N3b? ?O Dߢ1zz&1z_Tؑ5z AfO8SY^hn }z;ۚ ^C|\ڠY?iWW)-fI-!)ug =x!b8'j`Z7r\\ȹud"Gȓ7:4u$\R=}kp\2}s<&FG|4@s\Ne@^+?&EFN.RtBoЛq-ըD .=>kd"$s7^虤/oa)b@R: N_;4?8ccmfw3H-XF; гQ`y5ytK$z|u{$+[k,ώ9"34,HҦ|@1IFc^paT~ T>VkBuߓ}@/2<U,JkNvГPc ܝr~ݑȻnK['tq JϠ.y[s*-.Ƀi#7ruFGN_4פl,u@rF~_vU22׽u􎜥ّlM +΢n#' C?t}!cC޵Fw9CYKפ 'Fqrd!FJ+4;Iqw0 z0ma:.]ot躎5G{.mzZ}&Ď7nj9^~K;_|D<ޱwv5/<`Hw)`r ' t:¾%º`Lѳ2?8sqα,U~ՠEj/5U }%{0JT–ڭ &Л^TZ@oq:9$M- z.qcdTиiBgɑc/zU5ҬAґ;7Whjy:c~ CgpW珫y߳uu^f8:Y'Lu_~ ![ \l|"w5Wv~]@RsK?yqxz#3{c? z>V q,S5{^R؄鲂^9:rh$% ̆' wR J1W䱣-9O`Wi֑##ڍ,Bc5[*K׮T``3׌]ܭiƍz$:A7(_֠j;SJ4 rh5v.J+~METBK3:"WGd|ҸsY}+_T '{aKer#Klg`D"'r^;0e@$3їވY*iv ٱGCFTV5tTyT2 dl:Kgzwc_#kc-H~Y#Phd*؜]H^m1H.aZ]|7p6P|ywT4t w.ER~}wg5]=ZK_iؽuQzE~H=F3VieOK.##g#+.˘'ڒߵjzv bnFKWh)zg.9&@YeCF[y RO%"|@_,+Kی[Oc\Tr9]t຦Bhw9 AOGՐ݅8hm'#Zz^9}5hfR#Ɩ^WF} v!i Glr\oJ8#zU)vbo?wMd(s#u"zFBu?(sЭ0#z,ZWZùk\1Uځ<7+{rB0: qBOJrL\2ӘDLUmL~BoWϿZ/C|(D^Ch֤;VL~Uy v[ateoqF'pK9kuLo//rRnw0|B_ Q'ht[dނ"?&3Iph{o/o"c\bKwp:>UԸ{`l r J9G[tBww'0ҁ|D`MFNYr=2``s2c;B]z2oֱ`?ESt%{#3gKQn;?ѺIKUȋl$kY,ƥ{3uiЊJ'r5/?={]OYO@%~t@ө4:9/C`I6nߦ #\c*%\gst^o j'}4z|_gBs[ҩ1{?m)S6KI?mIc'cNyҐ|5Ԍ 2M@0|[d^"΃x%iޤRpNye@W ~ QtvN.Gy,F:_e&jzwWQ"?ppܾYBK,g䌐$X63GNG\^o?cqw) a3`oS,dT·=oJpk ?Wk'kTzPu|8YUr]cY jm䯛Twzoʠi*nKb;k?UhZ^_٧{<̯Fn|xDITDR>[;}aF`\>vha/x XL+p:QVk~HЬ~28x[,H5n_opxBWQ]\>,U>sԀ.),cvXY1CO('xC~\=wls$p ^ +2xbshQkiawCh|OW0Y]llb~ry`7p&"k ) ZľȋNDW;}d%í?)J!{ sY2'30rgiM(9'z?àwkL/]zQLmZ{P%[X$n %ϙRӚ =>66sy@ ~Ѧ]םq,rSL؉ E6o13ziJvgRf&68xb _.n?:. 2R{*4E䃽jޡ`wō3|Q#c? =&ONIz?1 Rh_U[ r_k$uCF_i@$IfOu[{C ~<?W AGK v|нڲjA.WKU~g%&,`GNv1<|:553"*BO-H2]ߠL[m)|L >#sfo!{FLɞ9.H 34h3RYh!qB!'/_I13da|[}q/3й0igrAVf! u?'ITV&lCx ߪV|Ҿ&gu7v{@;,Yc?^_l=;÷ktrт {! Ӯ_1V^zМ&,O!i'*dpMZ}ؔ& +/6K'Z~ '].k\ACEN) nvvɭy`'MGUd)N"3䃝G6cLvlo^v/y,Ls37⏖:ej:tFE19RĮqp&UL\`˕<ƠIKY5HLU^>mPtvn@vߩJ>Β+L%iQf䎢B $7@[ q"?3ٯ hKn#<[(v Ki͘C<vz-~{!֓"!~DH6:~v u:&!=fdɽ`s&?IWs6hNZ ~+PAV.;cK>S>?Ԥ~I v:ߢ/9==ݮiZt╠9+[Zeru8zR^Sʤ*З)^\R#m]TKkH|9s}ϒ}qw]tQn_ZLhzF͇r4j6!dbѷ=c&vFoM;T?u`w/uW}T4}-VNگAwZ}:M5-~>/Ƿi [& ^'9+-76xy`c, *]&ҏ<:5 Xӆ}s7"'V@&ˢ[m2o%nVF:J(IS A$C%2K0?X ґg:MO-S_\t؍;}(t2L]jqw^< {zOZiQ߇)r>9~>H>lȃ1[8;]Gw-pF(\\ᷦ-t0hv?fkC'v 0.x[o+cvu8`Ze^4׈!6Et*eW}@w:v|m79)LKߖ>*tGR$OAO#{OuM̲/ K'Trd*.#tf<;Ŵxl=*5=x΃}^J:x:8r?gmy(?x2'*c}#&=l&̅rnk{1z|.uCm-w[PfG׭_Gg}Sdde4^/'P(9rj,zL Sjf?gufTaI <]pW%A/_Xȳ;~ DC7ZdOJy-JdMW ݚ$J6 +>SkxZ{m-q"'RV|~o+@Y/k$.!Ȇ' 3 /d&4vE`c}O CZκ͒T諿=cތI'v o)*2khɸ{?V` C Q~GϬ"=[M6v %5^/~_ !R[ i%k!#"O30w 9K<- '%9M/𼎃T&?ZQt&D(<{ev !k=QR.WE]G9 ?ưo/YBSKC틽 twؽvI*v,oҙ G7nU`ˌ7 %u%8N1N>Eh֯BlsjdfR0s:݂4㌳np -ч:2hP݇PaO0G4C&SmePКmIKqyk#12P;E.YnAL# :y9 M7iLPȁs! ~k vQa^j탽\BNǬ-rϞJ4:|+,azo].tdYwMmۥ`T)/ؠﹶvkڐ}F>J {\ikv=`?Jnkg1tH=ad)8Bu)](/  |_Ksڠ|;irI֤jw1%0h ?)fۗ:ՙEWrR}=CKS~mCo1{[rRM rh)ӈ-W^yy87Qa>r@|>%/BCW࣏ur {Ǥr$;9~gUEŅAb_|5ɃQ#]&NᎼ@a^+tOe3>\}a k[dw$ejfKb䍽Eg*4ݍ,oyT|9P}:!? mλ!_+0kYezJM*У>B/U}KZ Dn|80Ei~{M^(Li<UG&5 Grcn`os7<lȏ |yAOȢ/)~mGV3J3dïKUOd(] ~ }95d3m=ȵ39]x#,=e͐KUSWk]#'*U֥a߈펽Al?EA+tкorN3)̎5O +X{wʗPmkMK6;Bm^^O[OoDaؗJJ`j댍ay[o%CX\xoBo=eZS艽aMʤozL :brc'_سrH$WlbvIn; 0# E6XOCS$Iw}-d |@ץ;эA1N{"L).+43Z]\k&K;uWl9n/ԡ & }V/᪅!UsPڴE) ..ZBž+2AKk b/=[W/B_"_sX+t9V¾n׈~߷TQfdY-FKtu!cx]nxTd>MNe1 +<'o{V赸q2!/I ]/-spWA ۫%׵2rs9仺qk˿4Z?Fnr[K|2Ëd(8@S>fet@p",;PK#8]% A_hhsω.^H;٠i{l V3syn y%?-V;ris[s7~őc#Lng hY7';uq(@zG4_[G.$232Vj#sxD} *k*M#J#&tiDRufvOG7|FCؚ,%]tR"F5:v%$AЋ fqtZ,w2vbeK! ,JGa," +t?}aVg8YV/Q + cž];=og1;ެ]9ȴg|-捸GV/ZԵoGV5j@#6e z+c%E6}L>Դ ώBjֆ~+YX*9hXfɪSLԑ;PeAϣtf_U =[&ΌKmHž \#7WM1##ā_1BzUS*铎MQ{m'mahj?WpmN];2p1zq2w-**l>w{tV)L {vU>EZeI.1}3/8:/mza:eVEзJi5d6G͘>*}+@N!K_jtT ]TBft'd~>E|` \NJksg3B"Ǘ҅\Ƙs7Z3#GޢrN:.k0К/V@"iEC[i6J9VQowiOp9PzEn2jnp[R۝]69z־^:tX|8;g4_2_=|G $򱺭[CӮ1 AM>KLI=&ik0 rd3c7h^i}+于tM6x1\跔*=ync̨h) e5pBJxc&z{NӉiݬs.CI =9s(M>%i|'^9iuE/R.[ za&^v@%+3c~NWy7:r:ow;>V , Ho F~ZH- }2%CEN:V\|$HnMUT7(XyEk[ W*LT239S|a-cսJRjY=5fѽA@N_/DZ)}"8EuwB`Pkb]KA~foޢ]Tj,r =\Zpk Ϟ ljsASGyA^qzRS+Km /Q+%=.4#GLNN+%h[{RX<%YF^G閇Hy.}Y}CtdltK~R.@=fDF&_cfC*TI#vεcvY:^wu4DbRb].hvF}Dpa 2ݸe K8hv"{YA{KI%;3udzi1H7dqRutϒB 9qbVBN`?=}+t߈bJSЍ3mF}|vd 2 z)W+^_ޥw]8?r&o+/~b7` (6hTI*Hȡ]O躮Ψ'tYt#chQ[~)+E_̅Ip4qʩX p:-X]$0"]֞C6<ױ5I^vG2j;ݥLF^y]#{! {H220MZrt&/?RR=WgLGr N[˛.1izǾWcsRz)/9n@/Lu-=ցVd~ 5d"E6zjBotWbh~y8z M'9lj cxk]c^7p']&$) ;{Q#$4%)Gjгzy {_)O:uh*gXSݑy8㶸6'q@Q_ >t;%Нտx{ТDyw까!t3|1{ҌM*tm4S;׉.}-rV{F3pBOa#ϾnwB@QAz_Hg>]6i1{i>L+o|̼AGRG@Vh|%NΗ[dKz1r.K:q=QI{9=]By\^ |*7[ў:SZY#)퀮kQ+4Klj˜4A纕]t(4HuߨV;[hh5̛ =y|Uq|7]#:J5&2Z m =u[Bf'܍F0EmuC(gHGJ}nt@&w!FbzXAEN }_*V':>LGRccȻ۞4><Bso ]ޖ\с$6n]M{ҼHutYT \,z _[=ts9rtgxC3H-~w- @IC)/ _\fytUB Ul`kd]qAUʊKoF[^';Sxe^jB.ʹ#EɐfHu :'_UӰ3Qf"w^LO=tqmފ NWH\RV)ic-Q_!=<.4hŜhc]Z*:s:(]!WA>sq\ȷ`F֏ li>C_$/ G,Ȏ. ѻhm@V#Stݣ\tE/hϐܾhJu]TVh!Ji6d䔟F^|TFι 4nd Q/^_E݆n ƁZ@I"I.anɋºImѾ1#'VY*5 -}ݛȩDI$! >UݖH/Yʘ(W3R|ϧ,- E'}UA̠'Uyd~#-Ook:~-vЊ̢G97ͷ]׶k-ЫtY=%9Ĩ3r-/\"<+:F[LGq-9imVtQ~6^)p[4E[r:K]"Ԡj9YQ)S.j\@hp?\rA񫪂|\glvPwYQNk.R߲vQo4+?T(}/pܑ$GBqϼ2pE>ߢݓpW>B8\V -V1~}/@Cz~~`Rn\Grg% PsAl-B~zŗͳ4хVo  otu 6ʃ"K]WFF>3- ]`p }Ń(&ޤ_TץvR^{at,5Rd:`jK`#:Q$Fg9,>Xc#ΚB_Z6B(Vhq19\jڜ,[/=E=*=vݒzȴlIWz6zm4$k[t2e4'Kb<*O{Cіu4=k|"A׋ˆ=D$q&j6_SeDc.[utm)@A/^F{=.jzbF׋ Nc^HJ%EMj'r #]ڡczb4#U6Fhi)Fm!n3c<13 ͥFyA:F9~~swh1`jdkIgOK1-ru˗.zG?ԽiTf0wj |3HnU^׹uN=UE|(&|F֡FكC7Mcܜ:BqBodaJTԣAOHk2ELͪ?RIe/+\Rb' n&u \ 0~oNa7coqocݻj1F -C&'_vt=/`NNӆ0dؕygu$[\W-] c'5CƉ\ Ryi|bnMc+wIwXrGK#ѧUd~-6E@BJk=eoA/a(}u_8otQ35.(F@̶{μԠ_[^5 k@COaS0KI :H9?R"}:u ۜB[ti|7 ]] qnѥ/ޞn! @RC./FrUFwG. /$ҕh6dWρCJ k7H®A8fwdn=.}fI.-E&8DcX?QȻ^f1A_5soB!5t :}i-1bn9}+mF~7׭'Ⓕ *+Kpht+z @gԠ{4y714Y.{/<_@hV͖OtHĐC^O(ttw\3`O_c:!N3seӮCDB`k`t[Dw4=59iTulKk_ATpO/xF~K`xd|% P?''4#z]U:?R#{z)q60F0z^%ėsƙ!/v%.}![G^H%vi~]d$󁮻!QNqglOWF?]=#Vn1vjًpRGeȓ $8`M5;;G".6w{'IQ:?Һnt_5( y+k2_~Ya1cK$^hЙZ.fe"ee=GfL;Vg@ C_)\WE+n>>͜ސ;_Ka&t5Ze=c#S[=w?foıa*rBu`3;j7]t,=hPc}q[rY~NJgҠy]7TԻlX6(wIQsn'o\ t;-3@t׿.RЇke%?cC|(+P]49 D.Q/4wPfPGKVl ⵑR}y8GHfktF -.9IrYf1~NRAnW Ϧy*3XJ]J4F:t[DON:5}ml5t3t:/ @W|=%#\wfr%5hinz?g}>.Nˉ*kA9ূެFt٠tK9.HQzӭ@8`]tX/>kղѡ닒vއFf }kwlC;ent[/]vM[K},鳨;1unHF83z~K۵^%o=va+I('u :֎\JzGzlV}]NmI\I UQ9Xb|K@$9{stAຖȏ'{t/98-0R|i^ Ms3t#J^C؃iuZgy[ӁZނR4i`ٔK?J.TtT5;zxec2_J_: )[DNM3u'򱄍V8Ë{lt@.6k+$V:r#ݝ(ь!kZrP#nzv(t`B6@3e>F.%Xq2{#&t+nHД@<=ldfOաit.i8]~^LwX# N__uhZ-op N*A-P[^OOڠqGV.tfH~%S۔ -6 y#l>S65/Zr͡m>%ڱi Otg,lR\d%KR2ͅ~Q m/Wh>}ch N}q$۔2 ~&6}Kr+T;:i؇$|~Ak0~ڜWT, {GYFqd ,.G ^ QI{=W]bcToB_ѹ[nM5Cb/}!EN>eDe"G6eV^duFmqD^jIYzH="KO_#/_0: t-:IK9+AEE"5qQr Q5\79lT:rոUc&ln䒗|.r퉜wWg@d沀ϠX/@ \9].C?~-Ϟhf2N^}׈3`3rȒ@ Fu.#yZCq[MaȎ>F=?aB]Nq6.nL*")|`oavA"9 // wZ.}\WqM!9QCY+,3Q^cѠe4w[~"u* 2ˠOvg>KV/ oY~&JROiƆOr`omZp+t +_3`'0Y"nŘqUPsQ؁9z[\Is"lQ}J_NiSCiI^d"z"Y^iF~H.p'c+tjMwzY $M=nÃR^'{)*K`lQU8CvB3 ~B[S`9\)#Yg;`,}71Fef~jǾI{(G ZaZzG;s]k(t/@3 0!%[T}Ca7gA+.'V<#ks0|S*0 Fmȴ^ohq|]k0(Ў<b855*u upgA-hȑqV۝}>\tj~(uB^E)\FcjB.*SPˬ4o$ܫc|xݢ{/ #`]bdIϰ.6 꺖792dʾ^V/( Eۑfa?ʐf<9ITu sI=-7n_zH*x#"s}iDhzL{.K菘K~m5X3=d1bv:%q#OܗYf+b'<ˬN}! ^4>ۍuB% ub+b3yQ6\-:_H\+=hN䩬R]]yzHjn@z x cuqd}EJ)K[ucTFF\Rۘ:ȷ(Sm"t0/Q/ DO!* <ǫaF9?^$S"7hR}^D0vׂCSүAe8D7#F(7c5-iQ`\z{}fgF.Gk0뎋yZt7aouIwd7lq%@ĺ^`ׅ̻8#k#%;gt`'KԖ$]=@r.hwk4z o@ZoΣZW?K\Ca;*gՁ5,qo5w`{@JNdyH*A#BЪuLr^k#Z5.-/{T@Jyt;]"/4s]l3BA؋㴺Xrhl8~|'m{#ksǠcz:Ez 4:csH"A,Ơ3/t]i}=bmtAdyUnit@o3tBq熫W^ctS]5_LkuEq2@BA_) a;ҕ$!{z9r_`=û}L7 txW'. ~ԥ_#' _(E@'7R4+7azv}~y.Mw![%߂\틼,==)MitV`9nFR*ݝ@?QQE>2*vp/r]y"D.աwh=v"Q1}쐨_cݙ6>vh^ls/ܭ,\B.**r@KnİZ1`ڑF:t;3хU9?R%X#t˷[ENA4;tV6NQ9wiM>3bAz/5=k\\ CsF ^ 2h[^WՁ|>"ۥ MK7Fߚ%Ԥ-ȉuueѐ6:ѽH}oG@ޯݮҰ }zF3mS'Y%+w8NU[AG~K1rQ:S412LxwPϚT4_W 9%2F+b.(ChVb a<%/R֐0u)6dsP [E.A^zܾh\^9_4tYR-;躴\2=]C苘=Sjt&Gl>3UK=XdWA^jG @>/?<\V%Rm!E/.kK!yto/rWa7AwQlѿeE ֱ-ShΈw@v1K<([tzn&. *bmZW͕+x> xvz+Y:tEPc{.НzB4JhS@Ɩ\YhsMyM@<.BגA?EtvTE\zn>г憎K^QA;2]Rݳ[`>}բܻ"ZJx}u }xUe]Pa`)g/sgt4Z +mlTBC/nz+iCvFO|ZEtqK"[ QBk~"GbeQe4}t&[8 *p%-zbɺHrEޗ8S6z=o=l#u-\Z~DzlY]@?"թc`q7:al^ Eg`Cӷa/FKJ%oZVOtٗGîE)>ҊvBo !'>FEk9w9鹧ӉimЩ.r#LF$]?%NzANr6&cГ{ >ڠ9i`WiRD廙wk"2:#VL]JoZ2KJŞY &f~+Q;Sbμ9c =U v"H([yvXE }/1]Fbő#8Uc5=6r_}|"ףDUrvq㋭Rz#@*s "?Gd_hOSr?QдnK 6 s3cKɪLQ#]zuk+r y(r}FMl-0fSqE.$KЯсahMF?=s2]c:gdZiA^ +]݃|Fd]M-@ 12̐: _|c6"E{ct菴k;Xg]5]g4).| I9;+VH:J4z ,vn:4Q4zYޮHYY.Q"hG~1DG[/t bx3(X.>RG>F1En\ c풵ⵑ;R_QMp_I 2>@N!WnlckKJ~W,z6Jy L:tQlj\֍]:*đt5fx[6/Hwe4 [ XsvDt =iBPZ.n9\#t3sX,]s@a+-UoO/7G n*@F27gA1p`,9P'/ia `0-Vw9%vfh$#A/.M i p83uH3S:K %/uF%.LzO5=r"pf#魝mUe^޲4}uhu dJȩу|fM#I^ My+V7He =@fB!UK;h /[ė:Y<5v_##}5pRIU*}V [1m?9Y/e@Ƶq`(Hy;.&@n^=ߥRO 2e踮v"ߵxk%= X?-_Hu,Q 4 -yͬzt$~Rdh[B9/Y2/G[E{A}i[[cgI Xmy+w {` =XܒǶ%Vwf踴4FN9cƭf KSE>Bqԧ]LޕFnUT 5JK{Qq]Ъ]@!bENXHk@OtnޓF>l5hʼ>?cQdGeE-ߒЗ z T>t|Sܠ+BT1PDq bBN *RN#"{V>Rb7Jޓ|K-f2Zΰ}}֧ ZRϜ]Ժkh^*g׻gWXجQnGYLF豮ˢi=^'T$XDg` +5=Ł&?'u~m\q?XF/ kzU݉_Q$~'bM\9=viךC x,.k~O0_)Ah8`> MF.^E6y!J%q]9r*X>2%Ć< ;7)oO?[kZ\7m>{IGR2c)]}' x sĠ/ PhṖ ;d?g.\ zٺRx1,BA5R¾H\gD~65J -`687jΆd2 6j?0_V:2Wo9!d!mf SO>xO>LE_+t;stgZpOזdP:rR#x|Ut.q,i9>!X]\;/5Y@?OӱGVo/0 ^97Uc,C{ iLN?*f;29>cGP:}Ha4R֋tN@4a5obshUb87/fjk8pFlt:F-Ѡ=9tR}F{n{(%d^-ғ |$`B2HOKvA\(eeti!,U . b_7[B.Kpbki||$1}{pǺ@/PpYby-u ;ͤ-`O)XMyAc'\4_xf'^okrZK7}:Lڢb/ {폏u4Y~^"#3ȴ=L'-D |ZE|g5./YpϨJm2ƿK$. LȂ.[~NI.az JD/kŏ`l%xg͚pAV/yF۹lE=AQS\Tjg_yi53:o!^`J ֝T3ɵ[M^ EiPzR >֧P)0xx <_eൟW7l *>סBDv5M[4DVhF_P Aw97x?A/H܉Z7c|Ka^܁\m@,SuI&讁>< *3\ol(.xokin3hOSW;ik8b`{"I~{oFB06 k1^LMZ9vs3aQ-t}y=TzV;ir&]v.Oq&ޝ=vlKCdf^O}r@˵\1{<賛uULo ;]}V9z%BļL_jО) Z}5Zוȭ02b=ޣ[?cl{ `r]dqbm\A3Flcnr|[%#BÏ j`pttR"a}d"ݲ5x.DzڜWߡrGAо"2~s VhxhyD -.D'X->9_g2D`ϷGsnk͠ತf'j ?*nwzNLATh|9+.7PkXe{E@glAnm,q>eYbvɱa4;FEc'WV(qΈ;c䤥f% xVŞ"랤)!'\z_4ֱOճ=?%zwe s5j(MAF"b?[̨h 1is.`]9Yj,ܡ*[H4Рi|rʲe+a4W~?ӽd~?ljeH ;"/D ٹxn*GCKzzK[s;"K'UfX4t~ C]!>7t = __sqwzEMB6zoCZ(v` |vDpmNJ+-zEܑw鵜SW e56v`ё877sz^ ?GȍEAރO:tO V䀮? ?@E\ ڊ N ]_F:B-Ekr@ߗ7B7~Ot[Օ@:vbb"/웛4\w@Dъv1:y%˾4`6"hVL~.z Lo\X|?\:NvWs9FCunsCN$9OF9QƷX`ѻeԜ0Edˁ]0 诔V1ۚIW<.QѬ3mG,ւ~>sݒ(C;s]Y]_%6sD~bz9:b`gsi?KB zZיO趔dNCm#His>YjpCr4Фx=zc:DF|a"'? GKf%s.BѰFtݖ!}=kpt+rĕ[W;tA =/qU=^-؁\OSI"' /#MIe(OBCH z_g~ay41tp\ڡu4Uh{#/~-хNSV C:-ҁ|-̦h{ٛnҠ%ƕ|"cr ?'?y]?/GRA p9SޤQݚOTFy Wf <dIn] r&fH##+蒐zK>MJ;u7t :S՟K-0—t#6p]3br[Yo<1"_m]7Z~[:lL!9Pc[r SFA >.@_7*F=H' ˮ/ܯuܭ6u^V[i%-3&r"O )7=(}ol3r> it |tݲm`KOyҺؗ :\8~bḌ;u&th-I۪F\_' ރS]q%䂔itg$ ؏ GmT!'0@>LVKp׸T7;SR]0 }<. .荼GtrZ RFU4|q:9!8qC׻.4LL#FsۻJz[M/u5X\w:]ͽ? }}̆54A3{imKpOegm : 6" MؽҹqQe U7=ހT#^ RVaȞ.7_E@4RTL@#zcz]Š)>zKq uuh^@ijǮGBk0F`CX4e_MȻrqO6rཪ/2" FtyNaԥi9˚1CҹG.5v"'w']`Oa}t:p2}k~B~Bokh12;e ~#~K W2}(]2Ѝ]&-i|'_".K }qd T4˖`B. uhZuXĎFu*Y*Cs@/2ف0km\佝6O|J}%հwԩ]J)8~ݢA:2rz()v*%{b#_$UhwѤ?ncE˥z[t#w`78?Kf0G߲GO)دۅ03mlJăZJ>e12;z@0%VbX=@{EϿ1ZHO05V`Vg1~ޑPGnLsO.&M{H7U3dhM-G6Y=|Ϩ2vsr~n5 ګ'5*976Kq[-[Uy;Z9vx^ap.Zu :n F5: mw Svpڏ5rFЌ@^`WV²\SA޹ >Ӯ:2nՍGc9FOv Yiw_kGA+J> ú\n;od:hu ^K d<؟cQ1RoVIslTC9qVwtXs%ᵑk4u6!x3^%5{/DzAL^װ#zF_nҽCBue [rvPh2@}@rnk2zKi-Ṙش= Y=ȷx?E2YP( ZI.b/ }ѡ#q %k\N^A:p/TSTR`:#GsɄk2];SvYQA;ޗ0@(,z!#IGD 2DBfxg'D g?H78e ˖/,,6B46M Wƍ+mmoyx|VɍN$/pyF`|-~KgA&s匨έQ/aˤ?}54DI1[sQBm]]kC, @;羨xYׅe\x뤷@뤦J|+7䞿_\EKPᄒ0\T.գ ]KEeС#:iGpP{ }D\.ۢr|M;6ؕ_/1Ջ Z3b#본U߀N~iVuz0.9:8z8e=BM{ 29 g"7E<{;,2C7 <'[ K+6}C 4d="q@ ~q`FsltjN31xnfK{]A<Ч`k2:}]VPozBB(fȍYn0z zGD"^i勃 rG|ˇk}J]ܞMyY3ilIc[Fo-Pʀn\.5gSF;h@鈒4`oe1!D`k&룼j\D?Ԡ/vG@ ,n|?F9FE>+I8O>pg| okؒ4cby?Z:Ї"FuBCqڼ//.5S݆ ZtYkR'_hF.iq;.)HDhFg4Ëe.An)>ˋ"WŖv]2E\{K))"8^sl*ZفN_:*r[ڡs]5ܝ ůC"K`6NGY:E4_(;D};r"w.t(2LzHqmk h2E x* u{2ډ9VmgLt tL$c\X^NyN7NЇD鴺gڐi#N賎>i䘮鳰tyu LKN. z$a$:p9]=fM*wa="i$e{?9~s1hO')]&w@݋3i,~a->OozAS[Gna`/ ˾}ҳ1 >}ʘym< _Q<]2(c:[_Wɋ:!~YP{CÿD[8Dr@B)Mf9}kD1=@ _5(plAGz x%ȹ g;]ȝ=:Z 1-r]'?J5ɨIPu;%#S<~Jk"B. "{C:k]:C/n\^Jp?Ph7vWrtƞIkgTa$y}iTG+h٣~=b}D'镠.!, #w5[tUzpPN 9r+OV;{-} vډ]=ѱ/ȟF6䠮9Mo>ь.ˀTx/ T=6Չ+ ͠zT7Y'YOm}ͿQ\TJ|sC7['8.'nIHr@I_hϩ)0.+/9Bg] -Dt;z"I?-ꧯMi֋~\]MYA/t% =i:4-H=kAΡN\z{X @w5f䐞qm\5rt!4eX؝Ѝ#or"= r~u^DO% 1"Uv\{ _- kTO-Qri6vԏZld]ˣuGAS^ʁ=w$r`gS\褹ž::Rډ]cn1ruDRϴQ[0󂦽,~F^׃b"〾+lpm~2@׋$Z/҃ݖ /D}#oqpV]*UOYtch5ރll <+-!#j Vn}:/bGu rSj}hFӱ49o=2Ued4:$PM/b=>\Z%fxsHI b@nt|lUhO^Qݯdm#25 dk5V "HShv=L_ tk7%-1}>)I.cS:,N蔜 vuEwb_!Ǥ͊x[>=Ƥ͠Z!& =Nձ/њ6ǟ0}h5ON+t}_Ic:(vz]G#BRA>VKm^Nk[/~*ELCvcw~Bzn>6/T䤹^iIm[W_RXŁ|;"np}wH7+\_ȝC7\j oOoޠ=r 2&7JL{#_,o5ҟ GG4H`H~zXN3 o3k-֥ĥvt?X˺={}nW:ŃT&u/58 Q\WOC@ Z7 NcNw6u'xf6.,m9t]Gti˦us)V|C0es{$Z6uJvZT`@ރ®Vī+qBbtl~~{-PG^"uM(ė5F*/} s$V>f3mwCe} ٷܯtbd41n`<C'Kh--lcw>.mc_ d'@;ͮ}K>+QvlQOD::/z> ?.{=y[T}TtƎvs*) x/ahe#4\S.;M\_)\ӻ#uc^t E#o rҝR8M:ku6~/xF:"Ͻ h,$1*t[ .t3lEiD0Y1hLB`PGJknPio`gwK7|uC+6rk1 o31}9I̠94,`bS{F@IRc|AOAJG_':dND>, ڠg٩F{;2QAqփ|Vt@%#5kRd](/Л| SY!Ij- >݆ S^$bzlwY+>dOo&}s7^+NuiA+ӷ0@k2(܅\%C:gHoЭ]@^\~r"3uSyqS1;#N+Ņ.vzȵ2mѥ7RNohVʺXh/3ꂽ,zũckv q@MBB]]>?\'Gq[7l IFJ+Dq @VFB}]K֠Ak>9g0 VSA>bh$oQN~W;tmc5;󖏟fDd -F%JVZ|D[+M{EU;F7ڪ,JGQ\`7'p*Q|@}z_:8`?p_gjYukQ#K#9wH [ `J-er[.B. ]=GuDNq`ȑQ 6ʙ*'Aؚ5ǹaQr Gl+e)|@'t"ˠ"UhdE?\ ɉ}lBvx }؁|_4:;yn==RUxM)tK?%E3Gj(%96dmGm趏!ߨ}n>g%|,hvBci6T4]/)W䪎)EmC`{W+j#k4n8ҍGb hzztӻ)P+tQF6t#0hUX:i"ЛKAn: G~:]%>%u;U.ɮrciyiK Fq}y>M^yRD.AK-t5F ]I R#֡Hb?ڮ^FC/kBJW sK]I[zF%uLaE>fG,)L˧Sxyq_)_ތRJ[2W4[9}ƀˉܮ=I.zAtO"m6/*A踟ЗNBFfHХe)F.[1R0U$?ȟȠ%wWё1*Q*^:' y]P F-yNcKME>]@Nwrw؈mhFd Nr]7QT2}'u=ZSWR7mt j2t2Ӏ̚AN8#ʒ,a؅R.qrE4)O`>Z%. /ZBƽӾ^H،WTJCϝj|"PtK jE?.H ]׋u#qS;Г5"ME7tKZ:#i(I^0BX:.x" +ң)vQO۹% A 54zsӺfh]T4Wɩ9lwAOjMxB/ЮL$8 &i|NET|e9 Zro Q4E TM餼+E#KhCq%gi zcၾŷqBY5hrH~a|z ^ӱ%^k;å]~![1ըm]0#| [:C4Ѵrdt}sާnAl+i^A_1C;6` yKN;e ̀J8xZzWd~-̄{0z_u#BNکSCɐ=H< M1c}aAXq?*SxYN7NoUJb'"y߫Ag5ߐo%C\!K7߼Gl͇ 9%nm^]y|7?2=6d\6ۅ7dl~p>Y4^AlfoМ#:oJ_dy^ J!/UK}UÍ~U! /Mˏ;k'f/ʵBgd29%\u({{4ȵc4,9x-_9~7 ý@?#[?[̽2Nwd#S=Oơn?d ]6DcKwޡ9(D]zCFL5>}נ@Pf?ۮ|~{<}nB.v-a?>=**v*FY8 ]cP &gm c|ZJee;ё5,o{ct趤Z`c/,Ye7mi'X8,xO?n_xKm[ sn՗Pj;+wD^}kNB }DIW/u@rf@7xZO ]CQyzIz5ԀD|/Q%q ]}7_Ð7xY?gec}hĐw|cf+OL %Iu /M#g!/A/|t'>~zI|cz!g"֪g]}:=8jMiP;4y/uu׬^;]C3Y=C?K\FS`5}:RS{ͤbbPjWr7%,vo >,]KPε! 8~|Ԋ^J/fI4%{j}E^)-,GS. 5k 䍝Cfcڐ`#Ul>$ol r3.f=?|=yzUr}L$]F h$7Kr]1bkR;]3\5W7fFڒ: 4w_R75z1ru6 5=^l޾ǮKB\irS ?͛+&y@?-P<>#:}¾ bȥ+-7eES\ص{}to⢯D]Q@aKhjyk :Z;SAʬ@M)ӌ8t%{?kZ,а/r tM{L \#ݜGM6Sb9f;FR9q/f^k{3Z.3r_Q֞~d .пgȇ 6AN"sv2yJt2hWm3'T8{K8 ( '懀|ϴޖae@màUZRO>)n(SlCϲo@;i)nbߴ>/!Z5xeB=- R޳3#?[[5~'Cbq9l=~=rbܰs8w|% N'Pm [q${BĠo(O˧,vJ2'[Gũ_Q 1T! KVkmQ*V_oJi^:GBw"-q;#ZKd rNb'wSFX)rY"f/Y%m`[l)vK[VhrG5S?]-v5/uXt2*R2uy\g /B)]3o<Yq~ . *䖼-nKѡ9ZwG9D^S'y.''Zw@OŻRFZ?5b[E^Rgi ڈ|%_BMnܨ3Fz8q޲&B%ʢ97sr7q{ %|F B?y5tI\-J-zyj P&"߾9uUq:!/{h 4gddW:r [" Jڙg|h搎:Qm2CP2;F?5#w)/+2[Cb:{XO䵽6@ƉWl"u=rwcVњ:[4F.)w>t1Kz@lIBNUvio0qO}d= a׽pϜ3:9jm'x[-!_괛0U/>nL#S"/GE^%8b`5ǑH*:2!tPޠs@emmuv發sӫB ?SKZG+nƈP'Ҵg<)h;3^ 0/AmRIJDyg4Ά@+#/RS^K.wXmȭƑwnK`5D=b4׭Y+s tH@SGv 9Y*WV]o|wYT{aQ/wNr%tsׂx [tÂygD>BpՎǁ:},a޷r$52]GBN1Q׋ :^j+3\G8M8zKpCr9ͩK1h n'K*S]/;ͪ zZD6EF^ìzOYͼyN'f^f-kĞ1"z͗Zyxa#{dk)HGK N_#?"pxt=sXcxg"8: @n=]U9n*|\c׋ p_ >}6MǛGʱP\ 7һr.c_֝tzlW9{!lzg[/JȡNsE.QTjljK4Թc7\L}i|=S`\5y/%^$C.e:/NyꡂUZzA:S oJ ׄS߽ƂI+=):6ȧč7tN]5k;#u^]udJ׎\7@Qex /ErM"/XroɠNF>ځ\GfbK})0:?};[̕Iq|y*ުVaMWhʆz{F;4T]{[Ftl׭B ^E{T%vKjxhKN1~.^0v#O[cOǩ%u{K%.QWk249Wh/{Ĉk-'ggbȝ lyh%FG\}vYC.-ro?T[t4f)zV; ny1Stq0>oBQ_9T Gdt|]*!3ݘ!0 ZË}Yޱs9K,9rr tV3}xR3d}sBр֮2:!кXWIOA5}`N=!8oEMn@ό̽S^BPvF擙Z}є =m5R2v'5MoI9%1Rm~O.S[;Ix5SFȈ>[x if'#[wk.['{XG߳,[.ϓ]mt/JзdK7?u]8@_8^~aOk37_Yn8QaCnb`e랗lY}3m`ӭ-ګNBnZ^͛{ r-7xcee mm׹6h;7lߠ鑐ͯʛK\W{S2ۭMՎ$I,ߓυ`j4ɟ/(Ɋv=↣a nÅOg^MQ[~Gj;1G{(හr邬*b쮌EҠemu^[LUC /ܠV="{Vr^5o캘ܠ|jbw mojT9w݂-+C.Ɓ촆W*_*8oj%WІ|]Ss .v5x%߱o ka xO5Ti`{ CR`x[ ^;;p/ANtw6yVG {%ξOD!Uf1ؐ BZ$7ԐOT6p!'JAޢaˏ]Vk>F}8X*Z `郞@ek}m_K)}Y{c3}3b _]5n"ou>o2_)hnP| - y=gi065h[W#zoH|`a5nd5^vXh:+$޾h;ޭCc\{cA]7feXؗdʧgMW|$ɭc(~[ A:u󛨶w#h6y7?$)oPMJ' ~mqeA:yti5kFԭe@[2<ҥ0G {\X_97vNbgr`GYt, f;WǍ%.˕Ttm~@>xRDMoF.] ~q}O%2\34LfmO|7x8z aܣɃ{oK`.1^N%WF5JWBws0lk/Ɗ2žcf=(/&ۓi U)NbGӵBg}hm ~>xߠs~m̏YҀ\DSǏ]݌N1ύ7x]JA7 Fx֫,iN7ij Z0${V-_[Ԍs#k0EQ'O:\sr))8Bd$}iH&{M.53hɨ ;2NT}K{ FV˜̨ӓ Kd\6]?9}t0 ^j=A[JUuf߄mg*#z|9=ּKAU&dKD)7\u]Ȋ,f/bҀvȽ z@Oe7%u7^4DNd$ γx->[ 3e[N02u|l!Knd {a"h͋E;|w]b$-8Z7Ej&nn?VAcB;@mܒ3 "q "O)p |5"O؃śr5=f5;Iܓ=.ޏ o{~*pUs(\KA'-)'nVDj^n>2xU/43x/2}tIUVpKJoԴ葍a@?Q "k|o[Q 9nzbM m[! $?1_f >w uθ?5N5{H}:)hWԑ·9~ t>^k(Kun ܾjRX&#š(ݠaZ&½jO=ܫ&7~ ^߈&K~w {/G<'M.JSAnݱHS BI/=yߨuNyſk pn Sѭq!NٖJ#C h.'PД5zlb6(/xN^@1%Gwv^D,BHht=QÍ#\BSH7j1-X~} 8u'vݜmqS࢐BjBB=w-yLy:}!;B8thTI}ݦDu F?<QNuIAsuݠIzՅ~j~/2N#D!4ZƔHr %ӊBO5]JoQ3Ұ58 }m5Ԡ 3^#\wh|][608`JȌA@V4o]U-硷0vCf '*.0%rpQi{o2]{e~&qہ|sa:D;(tU-6 <4CI[%+t[9tN~K \I=gY􁞊}+ qȻ% Ǽׁ*R5g}W#:i^/tL.uբzv낋Jn^cV t.uCue/ 3R+V+<zxʥZ;nhtEm@T[?}1?f#nyŲxץ8shҫ{.FCmIsL|r[HY 3>sK.O[V=sk<,CW㽿qӋ#XKDн lBY^Snڪf.JkU@u-}m!zs2 ALh=>]s lMy[E]{Z 톦D>oD^uV]7ҡ獝)~Y>j 0>%T` 2IGTفh%[%|zκLeƮIsU-Xs9vG=b' [Cfu互ġJCoGu)t],6QIVot/4 yEfc:jh5)`BZ9[< C%P.#fWz]铐udgt<]. v<7b퓲e1Ҏ]ah-ViDlVqo*4ѴM\}pslX WFC1^z<*_#֌sFd3ܑۭoyL}mn񫬧 Ucƭ 7vt':G"G"% mlAi_m\JKk;!Vrm6`7]-Zg"Xfݪ#Jц>KW˥Vђޅ!>A{dx:s0܀y#/Tq|yo'-&b]ohMu||>w `k[݋glr .Th&F$/C -1;#]zٽH^jn|s kɃ4]Z.Z;ڕw k4)G*ysZZt]FIcmZ]T@>^QiImpZd m`KG*{{Nl=|3^oy]ӗ֠%Kå-ݙ#wfwka^iJ]}ތ%+t>Gb׸[ x@O 6G~ }rU]a% )vl==~U)U+DgxLyIRu1O9ݠ^r%Ƌ) @"z@*tѼAN7r:~or"𙓝^CۇмZ wK'{P/ۧ 4AraJ[*ieu-n Ya3*΀EIu}tzU)z xDxS` ="I1/'}V0_.SbiD쀞W\1ہ{h-FgZ"?T{g?ݣ_]VKF'tF׬ō@y(M$r@`xSqA>BvC_YۍW{|T=t$d^0Dw=96EuoC#^rX%cy.r5b7y2}eQ*t;Z(7UYҎg]=t-;:h< ` :%6xьnxvBЭ)]iC/k 0r5HyD)tE$#@ҕ쀮KVX y{Fг."zupH ]GԅDb$h v)KH%ѣ,3:"o1ʉDI' |5n[J@7[ؼ _tV䱜&^ o?*rbFz;әA_tzߍ:{u)<A)Mr/:Zhҷ{8wkAI9ku{ /qGDv;C ?)׫4h_i]:X} 4 Tv:/I-@,穫2DS@Rԙȕ:Fv` v`WJEzQ_if^;$FUO]`INyAozkVvr f#71,7gieA>bvdo8f}iwKA'{KSI-#}S_bDm_jY=Å8*W%F3@23G}oYt"no=U0#_d|B65x[ 4}>ПQ_ ;[8y&cMkGo鬒Л@W9k"*{n[YFAЬ]˝YO\Ƶ֠kɃ{ 垵`D#FNF@ RO9 q/j倾X0t@/*k |mu5ƀF>]=hT2i=>r:j,o׆8{?a<k %uv; dQ.5]JBڌIOw E y!ђϙS4l~T*(d"\ x!@^t 뉖z)It, }D V*y)@gt1lh{Ƥ1W:-kr+jԨrWiٽ\-#u@'jm-)d]erM=5vʱQ0ۙY{;c9Be |3RAG̽o]aO0yu1@`~"=M{͍>^" No3ls14۲%]H/|kvߒ]:ШKgTw%m *6јM~K9p-F8/CYF#FވcR||P~.+va@k> =_ ddd[Bg:􃽆+Cȁ\}2ֻ+["%{53`\z.\c.e;Ӯ+]xܥ@o'pymŸ#oq+GhQIB]zng]F>m-2'4-2'Gf >2}o,rw_VXrSORz:o)Cצ~ru9Ց /M'yJЧ.SWvvM@uBۼ^;>iE !3@^n4C0PƦ˼̨Pb.*w>Ґ (l=cMK׾֝^]TC2)nƲ_QgQ nՂm>Y={po ,ċ,[\C3/nWxTdnM;^z4I~q{d8T 4UҏQ:4Y"piC~&ϙ紮9_7Zh5w8u[QdgoQ]ɇ=W3؇[$緊6/΁/)9УxN:ٵqK eBר-_M{N5I#]Tz"F_y}vpϜ/# AШ7iM}7]t@OV " ϡgh֢97v]o#.rCEN]r{ $5} w0YB(IJ{#ddعn (Czu];D^.9@&vIhEj3ߊkQ ՕZ,28}a _蔪:rv1* ޢ6򬋠'.ϩJgv|ٍ~ߍz)"ݎ&lg& T6ȉ<;^{/ނcė l]/mw5*t,A7vG)c#e%^'v:/n_b&A.?>NN@5?c/KO~L@\ǙxR4no (^tڥX:B=7Z}3^ī[GRgR@rY6ty;ҾUG*##yQjcdNy,&}oCuYC|M\ Z1eѼ:y4WNI)#Y:\cڑw}.FނEs 'Zs!\MRz߲ؕ-$p. u]s 㕠)TRE0^Ҡj14pշp㥭)F.A=Rh6c'r wyKD)-|~$Z{to~GhHy*mA  s#:-l v_mmێ <4aq>M_Sy.ծ|@{j?%sQܽO8GmyEN%tSw&7JivQ <|~`tѶO]vIrL m`G3#*ڎ/R; qf/t_Mv9!| COЗ^k9]GʰG7r ZZ 47J9}y05.QQo רA,F5A&ZT{ ZBCTx/hrS荜9&3gU4hה 4}[ k*۞cv úmS`m{@AKWKA>YȯOOu-MnJoufIz2@Rr͡uǾZql=wd zm}C70Z՘u{Zf h݉=NJmMfTol>auZ?? 4#vJʕU|/VsDS62;:,@ '菃' 6+`m)< ޏ>-L1Co3}o#sBnI?>M6"j߃UQqg h?ZaK;%=S~9hZWrǹ'a\zc!3 gqB1ovTcAnڹwh q;Y{,2T 4]1祋/ T圵6y.@5*]\ ;~e֑4A>r]N'=1M ڠGɾ#yM= a_ Hg SO^{J +Ak KF9W#V;K};B_!EΑF/JBRz2{KdE>{bױoL߃רY -G.] Cdɘ$)Y~4@:Q:{YGF<adY.Nغ~əM2 ְu:ts ]b7(~^%`jzˌ3jzoh, ڤ2_)膁}o-)vcD\R۲WȯKWmA몺?V[\՟tm^Atawj7f4 .=TycߝIwh\( œb9,hC^/݊gѝ\&o>ypkwtWB [xc4~[5٭S}s-T~S |(rfB5 c{ ׬AVio3gbuETP]}o!b\oZJ_Ɨ UVdlT>i%;#_6#f3= h'i*{ |Z#om/ _3V􉋽/߃-»fu}cR/%ݼgI|Ǐ>Z9n~c7d7$Z,ϬFx>bc0olA%@sxɊ`[[vwgϋ9 tnqQ~}#p!׺DUO䃝1WnY/vؓn-9ۦлT},p/)Fo1 ^o*Yw- >7zɈ^/vAdR>gkII[dٽT[[3 =áu®yд\:{A(?&t־ OH\>N*H\B:HҼ݅xBωOn>.q4h W#/W=3Dr_RTНA. ;5h~ckPQ;#_R{|cK:/J漱~-fwS@o%za~N:%:U|ڥGS,ϗKkn+̯DlkqQ ׷Sd57WDs^s[cNI-QKHEN)%6B瀒HrKhMT^ =ΫiW)'d ~2c|mnJjͻ2.s;F./ծ)Ʈ&"uؙ̒}o3#az-㵭2^Kb|^i%%叓ߒl`*{F9*˒D {܃KlZnoE&Qiゟ9M5NNz9}o`%,BB*{}Eے(a+#E:sצkgǢ[tj(?)Ys.x27N29.%Hx"htg*CS${KY|/򞾉ZyCsXWEnuӭ8r]|@ Q,a*F@9 =BKO t+zD߀XZDf}S X(C7t]bEW%g2]Gr[].-Tg;.9Y\$rn't b'v 1[T!N+V)TAnkAX_R*Y>RdgcGzFlW!>Eh]r]@FTF]v'Zȷ a{3otInRIb;MisF~yŶY^uܧ=ƢoJmQ88.`)4eFjI` $\=;/mBZ> `m`C0$^,..˄4cgًIQ~@@.VJjhȽhb{1Y@]82>0̟ _/E>_TK"ˀ^xM7+t.?,mg% ZSbb:9&5k"d0>Ǎd"g9#\A.Ocq+Cv׵r2j(r/ zY #4+'f.rl?޾)ߡ/5u=$u$,cps^/r]̮jϙ0^cw\AfhVz[eI\H9݆@gס0ŝvE5{q=xKz o;"aw6^m8j{G6h˵^> .p*0zGKV:Awu 8ۺ{/KS:񆾽zy@S/l`dlu2~5h,Ϩ׃,<Lj'΋G:-z~zkseh]gN)bث7v6riQuh&a_.dcV>sʡу\m@+XTly9Kv!ɽw,#>v\J}J r @.IJ @Rld: RcϨ)!?$>+͐tx"PUE{z"ORxq &h!3\jug%mQ.t${R$bt偞zr cG8a[Jea>m]a4K>Bs])'|HFv kHBwS_m}! XSrܕTq}p]ٮ;ږy<zKeь6tp)+?GoKv0٫^ =6]bTyzQllőg;=Ӌ4tzԠ{}N mLc(x E逾<JБ= C|{{W%ӵ"GЫԽ%&3xr>sqȉ^5njnW~ou֠%_>#z#Eo'r[ ފHc/U]Dɉt?2=%v@o M1Dt@ 0ޖǙ'+J*tUwihqfn{&%#zrJnĀ{O2/Fu쐾}&-/Byh{QN䶨B Cʁ;Qԑ/F(Zp+‡"pY.1׭ bұ ĵڗ4[-*YRwH@4ZN3~ꪞjo1q>QV>Zf ;ϜJH0 HsK(_5pq~HKA潴z^5* YifIXE]+"D\uX/r^xw1r?E}~y! #s=e:Zy 6K:cR_b➥:r܋[ HG"/ѦqJ[Q7h.&0T 6ȨEPoQ#eq_ >wqGz>%q zB%x).$ }yj9yi9\Z=׵@6֘/#7`ΖYu-=kZ\V*4R*dQ^YeD6EC/y M-YU@/r4ICw#.28qBE.=Z\S/ݰ OtSd@sQzOC7\-}FԐZ@g%Fu@ϲH Ϊ.z.|sg3Z'߹tG UB43E:zt?ЃRZՕfŮ!K0JDF7-FoA$#] oN*!_T9򁞆M<bx:Ec>Wȥ]E 6t*gXGu`gt@Jɨul{oHM)J;1ͱ:ZJ=%ZN^J}waQfݿzj/Uhʫ7DKl׈ 3P^:׳be^/R;%׍ uL's֣]յlz JCNR-/#ui g) h-I0䁗K唾3/Eu,/աg5Qww@"n^X`Dޢ8_!*K;J+%th[QWsU-oQ/|-.9GZnД+'v0%&{a;l{j'y-FTvxߍ.@B`I'䞅-iOe=WhB"wXyЩ}6A.*мFkV3SX[޶P"z[5Fg@'/>Y1QV2(:oWLf|..t,, ڡ-}r+%\{I&}Ipk4\@Α喫 TTn^ṈоL|@Owۯn-ڢE7>y`OQ:WŰt^R:wDb]~->↑ut59VsGuWGg1C7/ōK=k-. .r2\%_AuҁHkг bj"au]^5i _doMA]l;@4^|of6^…)c~g/Lt/2lޑ\OS_=S1=y1t^1vF2 PEy4"PZ^'hb76de@ok ;-R dIQxt/74&vbx-jꖽ[8-+ETQ=R@'Iܩt%{'r[v׽ϼG'wEj3ϱ>D Cq8p9%1zm*o=$H.=[(0"9Kx(guQк"t8sY-Za6Êw2h蚟,]n% .5{_M |YGVNX/=qa):4wDR=ڀv&j[b$3 Mz7|KX:y)]ZDZr(JmTC-^HNPznI-5j;?*r9dZ$^)-/ueUke֠9Щd[[ƹSw-ɖ:pCC=ͳFѣjO*yȽMF/v 9WQ.~ ϣGȭ?k<zhE^⨶J?Qo+9}eĿ--sny-iW?+i]5-¦,F+? A7YJP"Wl:u$>[$ ]!b+A#|*CP?ʥ4CzC?Чe]i ]錺mFLqz]{T}Z<5]m>/Fg̷ѨLFn\Rv7.Z$aq{蒮`}Os .'r 3 3_jN. 'o/G!=6A|:gdZJ6^_\Kf|ÀY+D6wy]Q6^ oENeEMG !H.wQ"Uy4:Z] W]~Sq:R{jT.d9zѵ^䀾OE[cdu#nh5Tڦua-~uNڱ^O.+LMij,@,Q x9by4iπ0uM"4lKK0+t]F1觱aԃ/^KWNu pyj8y?눹`[0B: UoK%^"?QIGr=i,7u쀮q|!J])@vBkøNTk{Q[%܈t1)%ȧIjshi9id8ҥ/M!h's~}S}',NNWы6C6Eyj.J|Y R/b>u {7ڲ=m:Ńi4|+/c_2=u^4Mehd#֍TgbZR#FвrK4Ò xl]7.Kcr/֐3]E{yQ %ŝ7ysσQ%s;hQݏfcBwO=֋k\uP4m:BoIh׃ ]=T Bl=.AJz:C5xK|GR9Z#ao1%^x迃]\TQچx`VI{_b6thYf:OrHaq;wD=k`Zި?u+<[hw&nq]'I=pxyz(v:vT|n4Vrő-]%EVb{R.r3曘^.r+lz)ȇ i25zVjKn*|àFr?/:_pS?Q/ӫ xM;٩\>nس9z{EBNtnzHilDk|ieӵ>E6rglDž b2廠STΆԂkq\ϡzq_]W[n.6!(뉼_5t?{RA=4u |fcAS7W򺊮{O%_tl3vb5|HHݵ{Iw`ڿewACCd*3:3ܫOwt,*iKLr@uJ}ަ߸+)MCi/51kMC4Z@5`l͝9@1ɹ}Uc]Θ{`tNž?U^ Vh7.߄ߖj4dҝq6 o ޺v[m㾑הSnqW[U+gҊOzpM-kcٝ-#c{}qvov䄯nk|Zkd KCB^IMD/%VUcO5~ u~T] [m,?X<5b|ٮ[#;_`mi{bcPIzb "Rm>O,1˾6G5 zMރ&YAxA~#o5"lMEɌc74qَ:;\.?y1{ %{N9,וoIFMy%7/2*vbRxd7s` |hJ= 7d9~+@l`< \NyJSv;2 ۲uԑL\o'NЇ͒/%Y#h.;{CnHHxKMd%}+鴧TΉLwb'˱ Lo6+[CTۛNV\7&!ot)>=5on3#.PAvcoVd@؞́V>r.33iإq`!iw\9Z6F^VAS#_}U SOr<5eZ ={OR?92a޾Bq76]l?<N4e/Evl/ Ah\[7ǔ9T3>$8{K_/Ag.=,*VaK{`j&m/uNZ)Sɇ,gF)V;n_uti%蚆?y/7v runj@~w8 ikT}0esڏaʙ.vZB2]{~Ao˭MEcܰ{i^зHWu%}=N#S*63ޯLb =yҸ9?2SxNT}{=Zj^ |_TZ=W7T{{i-B*Z>>A+7t1q ]HD'v{`TUW[M4|?=AX/HYp֤4-?uyI5rH5Smܵ6bjG--R~<G 2xI󊭪<o[)\im3>qՁKcS !NIZK"e訯Quh2mňڅ|f&LD7m?$ E4l J"o'1oЀJČWf1 )wҭ"W2q:?`ƾ>_.}.VyOP.ݭ/c1vkpԫެOW=Du݅-֐ ;=b6o$+c.'$B^ k^ j>C+0~~ի -2\>h &s5 y.AEt2KK4'dW7'7WZ`f@RTgA`ڱ7}:>TǓ$9տ/ -#)=E:<3CGo/2jK $w.{uּ'>I 7ozA寤IG ],nj_+39\q_IOb͙^طՂ5+)f!ޑ,o%ͤ*y+{:7pKkmya<A(Ƚko/ip靣hd -m:J|#1צ["kaރ:Pm$A/ui˄c)5Y1EӢZobz@7x-_2vYS=W?|_]bд ⥾F/1䛮 (cYB!2v+]lf` zA %Vͫ\ЎZvk$BoG1L&=);jYQ9$2o&}~N~=ⶮq[y@_p;YZgz(kfO9 гŞV'J7x^8[XcUc㥑duŰZAg4 fN6J}bViG7>iߝjD>A&ru% z}^*QtekB/Y@߷J#Ԡ^@+3h$1(VG4 &Kz yy]y5y^^WMk_kfve {zL誑y[0bV푮'F|i@h^lq]bBg:QZQІRΨPT~DOQǵA1삷£ln!Z᪝VG)@^.*7cX-僼Dޠs{}2сHF =9>S}ܡOUͳ!vj-ykn`9I̢IoD'tG ;"w.Ջ*4Úy#Ы}zI[dTt"O2%(شRG)A>:-o z NdNDi}tk[`9t2>7 {вJS^_Ϲ#5oULS[1 zYw] Wˉ<ڦ"ӧ1߮&;;=; {?"`DAwyrw:ŗ}I@EKò"g3[qw:uk眎SWGKt Sl}~|.3F8z_Z+{|G'Zbv^"oa78[]Vg9E9#?.Ul]UN7-F:_,]Io (T}ڋ:B{_ͱl4Z*`#W$Av5ftN6;lbtpvٰ߸:~[|A^Q;ȗ;o3_fw7}>O=OEGh8ukh#=-[tNvrKuh&>SĐ'^ʱ" #2(rx=5ti1 M'T~"n3VStb^9*j\ݖR}[x%a'ٮF\Bc֠F`ﺋxHu`oN/lc'Qب n ?&˨cVS'Kgܣ'- *wuGj:n{ MꞄc*kNq5/ 9EK㟆mRgکWX4^56_utR^W[rIzS4*}.:x 9aH}w>1)osXb! t ߇u2LqCN"|@z knS*Y5"Mc^y;ёGSuo[r"y^k^׌˗]) 8;ty|Iյ#֑d^Ek$x?7B+RZ%΍hFk}W]wDtܯ+i*yVym]q2nԩQ vMIChbW[6*m؛Zb4qs]wlkmY`keTO)!@']ri؃SУly#?@}.AAkԍ|{&^,ӗb<36AǺ~HgSK7hn觯fot"T.??48#5d|zr @zSk:9IA'[yLwKԤAc<}5ASF5ɮru/vϘ[NHE&􁾩e3n,tW]^9~K#Ӟ=:.~ U7u='5Ljr"ufK߂ ync D2dyb R{KyG!C_7WgDZ>j:ڡ/hHޥc#g-v~ }^*A/_ZnHIC _R?j٧uO@eNLRJV#%MW7{FGu$/ۀl׌‚/tѾ..8]ˀdY;ng;:hjZ3?GK&E{.IxBwӖ?#fDAGe=iKvЧ t>>A1{bQ`e:_(֛B1!怴0Dл}Rc?J ր< vƅY3dA5s`fEs>t)^ 3[tsΖv Z9y;tO&'tL/uh5e/h@7F݊*ݯZziQ ݪ%t =t5@/Bāt:Ԡ"r"O]zdG"<_亄C˻h_#9H"r4BKutK͊bIREvNB3Gtn@>퀣%h@# .]p%?eO 7uY龁%"6M.Zh^Dt:/eh}FNqS$\=.}у\C6RLW*s$<.t]NUB3J ozĜbq|LcTuaujvۂy pF1/cle<Ǎ62,.%:-.I.:8NNTd\".w)Я Qnҫ-N- #U;+NMhczGi˰}$L)Yd*`H{idW̚wPJ^lu@D] `|9ȣϔ{=[] /:D\.ڕ*4MZ?A*гy]7t  isM_'@ˁcFZV/ggq+Q׀2}j_Z>Ri7յf3Ԍ(r-3;c ;*9xo[U ְ5+]4n_j`Y;zCf V,pFo菥u?k.Fӝi C]xm}0jwhN4zxitݴ.tBOqy)أi;ӥƐttG&5ks~r S z9{\42~i7t 9ȃF*rFd=0)}Ȗxky0~A_y,(ي#5\?ܩ1~@g;JNmMXt[WZwrri4e6A]qCZsQH"7tfzu4%$WKw]uCf1V?FS7%/1+?`*H9deWzv% 4A&qy~#qH-:CF>ٱvӢH}1]."lEOxM:׈z[:~ҧ6oD$p#(^F{C޾,#Wȗc/8_!K Ք3ȷ1#$zĜN:}ג|[Ln1O-}'-.`ГMW`Sz#uō?LuƄ<ϿeF7JtB_U$B?M> i\G|IJ7^#ܱ'uy* QČCSz>9isUML[D ||HCu̔CCNbb/e:'߯A6z$~]: ,)O/RP5v' `1_-d g M;{l.+Cpzl=&u`oГnGħthwl"#׃|gՑ)RR\!YM'YrWTK{#eج=ݣS 6Kmͼ(t e[!9NE:tRhbBI|LJ@/uiԾt"}d0/GI2i35|"G}# hZ Ox!]Fgq3]ӵv~غڵn)=ȷkGf=ȷ S!htinCw%QS;.$ Bt@ uh;]cT:!ҩmh0@S`e;6o,vTnN8i-%4׈6;9b#ãܘ+y5^Ii|!r ]/ ɚF.'t Ԩ^^wA+ F]w}T}Qr&Г=)uo"Q?]nB~`߃Hk1M(E+Чxzq|=K./K0[%;:kkriÀs6 0O9‚<̗b@:.AyZXTM Ϲ~?(®\샜bhld.K;{t<М.S@}=Oз4(ބڨl"'p ӎ@^0(It*'jNK|rl^?zAӣh E?b^HrG0yޑi ttRFiz \?1}}'Y܅z]ۖ9AN,^ͱN{n$\x_-ꅑ a|׫t4?4J^@/5]]z.8 4y*}K >"-Kߥ?tP1( ' ֥1לJo4hӋ ;W];rMCQLO A`1AAw9a=>}"Eھr0U%R9ߢ"}g?rQO~-1`b#mz%S(<5=п)~#Iًԉ@{뒖3a(FeH=~.! ]>M#-hhZO 5sܐR.-쌧N IzjvȴD^yQ9S}f1!X^L9;Q3nT_#gTڣ~#r ٮ=2J(d$T ;YJRe\4RLҐ^=yL8R] J?H#h^sӫ9dwKTBv >%Wd싻> 獵4*kѢ+m+|"W<0i{ucQmɦxQ,`W_}7}x @S. EQSu\JA^*5 GZe,O4k~^,-^׹#4{ߌЙN%o5X;t=&Ka#Oϩf?ҵX!_N5"9I?:aNŮ1]J *86ʮ-.-*)ԡ?F2룁Yf`i[QϨE£"_mݣ> i%hOz }(Vlu]ju)4U.K]g_\Oh RJNY(qα)-BE9}Jy}#:V7֔jDLUhZR;8Dcu|/Kƞ^R䥭I]l~=Lz} qeM-&WslHY}5GLoB}`"K*}*}.L`h>cH;Tc Iհg/$˜fJF.u5Vob+׼ |:n쥡G@.1ٝГu ' Mcd@*|˨]t6rr 9):A#W;ygln4o#ɪk)>s,eW^ֵ>%f]t1:7sEf'[X4#hŃBLbvv47tgh*>2^V#G<^UZZle# Q1dc#o5 CeG TDא!?/:_;H:G:r^?ȳ.-0E]D'Z# bu"!*'t#i_в>j\Ozߨ6 1Gn/~܉J-F^.rKc>_=e@o1ّdqc>/HE{e=ͥAKx*сbX.Sl.W]rҠG425]EGȩON=iGw;!q =ێ1K :a$TcEU[ikt|\Ϡ]>U.> N^ذ.'Cx`Ԑ4>k|e=JzMMٽgd Di-݁ܽ"ep@LKie>Bq P3&ӲטLU>say줟\yA3R΂Lw=.k[}p՜CVbV9Ht>$4CZ?J}TknȩcW:ǀ4;2=z6?3Y(npCN*wU-x:7 n3gQ~B#,- VΘ8>Ftaϊ}yBz%o5u 4(Y#ǀ~7ފuck/_I4򁼮SF\䔋͇dTMQx ]bЧِW/5rnx5KOd(wF+z~<tA0Kl rCO^hA_1nXAnX&ЙY%#w'%}v԰Ov9ںz)Mia[.a"<%\ oĩӤFA7SGS#UzrE:|{aTn򚎌ۦr@g:SPU0yg?Q#G:rE/$$]z`SfFOEoܨ5:{LfVԡΌ)2&uhVW&uj gnw@gʮQ-A[`ș0kt(rELLzT_Cz2QV;C/žB+ /O-nJ=/c/BMj}Ŕc+q?o3IQhn;扼9f-(]bh}j,LC״Z_[P/4Bs ݃3E*C?N0ha臱|Itc"(9 ;Y- >,ۏ逞f M z+r QWC~_j?s;41}4viыz~%]o"{\w[_|A+HU4ǔwD֕";=-9NKx#rƽ*r;}vBr<*G-&uB3|{Zq/G{iu4'ԨK+]}'vL_]|{Z`]Hi=ˣvu^K~Cՠ&NJtzB/w@Η = ѵ`9Oܘ]sC;i&:): A]_uI0wy&::p) 䅪"?oz.1$a%/tipWhiŞQZYwt@zÅ)W{ݣ-Hq$_灾]v;t `'a*vs/GЫwE||n/rQZԘJ=dj3}Iʙmo_&֩ n#jzc:`@y|Y]SuNQU2N=▻=$_K\+e{@Oy4 }E%F1@E=7\_,ٽzGʌ|c_ ]~Cz[;J4Y"oшi(C?z:3Bwud`@O"CoȼQ/Q#8SAI C |S${pЍmqvNMN))˶3澉$7R5";aKz`?iM^Bwg9J[@ORz[hw`r\KG})ǛN Mr~TД]KgԗC"4G٣O4iCr⿜+Іu*| ϗq@NA+:]%Z LA}~r xuU䓣G+pߣ9ђe ZveTe9Ģ"o=HK5y sndKw r H|.H'_{8y [ZM5tu>9/Şt^h=oJTΊB% ʛnzx[<Ȭٍ2!ˁ| +a60ȷd_. uK u[й}o|R%@O9y =viD>] tm@/)&F_$NJ NɖT4 L=,֏ڪQ.aD:K^Gu{Mn Ѝ`_8+!`OƋ<`̢\^"7hӰCt ߢr3: H-"Co.сpBQ^5B'yCCܚ?i9EN]4}7~-I,NrqLXr`FȠtg%$ !(Q;k -GlgJt^CFnB.IJSA>u3NjM.2t?nm - ȟLũwE,Ÿ7J%7##bwT]cЫ:ZsW^Dy*u-<%4fj:L9L9')M´/!/~S~<܍pߗ)˗(v?RAdr`,Wsl./cKJ"_=1dg.q@/Ny]#.2y[-k<:~Tt6Bi}0:t]uE z FL'I7p^Ă%{t#4GR{aG~ЉHsz dwչD/5-w @EttQ%~%AK/ghޓ:ty;Ŋt~ $3=<ؼWT{(v5!.5Kwa;$擎^$c}CG ] 5v̞%baxW?miH9EN퀮QLYlŭ}qDҙ`ۧJvb&7Ҡa[Kus ݻ7#KIRǯTyzr<.6q{4quȧ;Zt,yKZZYE>s Y=XwiSy^(2k[j_1!'|*H- W Htdlr\CF >KvbU:1)>-hD*p#K#G/ 5:-]xՠ77WK}Ǿ~u;?n/|"mgHGf9 Y徬Nut75>I{Ǥ'ZariGLؼB;Il/6p^?P-|&KNj Qgް%茹,I i.|=V]zyg/]>75i%GEG[r]:֡IC-/r(R r/J׃JLs3߁g窢l.3l"rS 7&G)~%&?o;:)A!ybtMO=T. NNOO\Zޓ{꺣CN*g۲#_h?зTGizKOS-5&-u~SQ:m5# }I|_Y\׃|ޥZc^pR,s^Bi<ݐ)`o Cy_eIq, ب[_ zc_mw{y˕Aoi/H7t )UߐZ[8E*c_խҍ|t|]o BFz^2>5ENJsZKc}3,cCuhZN&Y"_ /?<Ƚ@'"_=궒cr/ǀ=;ُBסG?R#-خdIk7iKA=ǘN2?kզoȍ2n _Nw((BTSim=B봴 BoL ƵBz_,ףނ5MdŃǩ^;<'dv}ZZ?/^bFT2 :^4vka\al5=Eu/;霾h2k50;JTz|R]2o[Ȱi^>Пx sݠk[ ̱;p7i<^l z`A=>$E4m-ƧtNx+Kj2Q?O+}[pBck}c0ˆq˼I>u|2^N5 B|z35;y7hoZ/%gO+E>2F9{&xZUlAy~-FlK௒{ltK {L0ug1%ufuGA8joK|<1|i~ߚ=0ŐS'ۆEzC>o->UdsGdWb [C̖TM@/804@`N&30y{85f#I/j3o쩖0 ~2F8]\Ӭv)&cm ʹfóEE6m?GZJ`t2x/xZ[~:bRȚ ?_"i G]S nAOӏ[L{4Iu~|Oܤ/ <#ˑzNoO䧒,doS8?[4޳'';GkԳ~א 3:@`_tvh2[P׵=Ӧ#3 8Y5o-~Ssj| t~i{T^_rO9{qdQDlB񵼝3b"ǿorHdTa`oE)#·0nߪxG|%?wgԎrqWv |b'z=|,1#r\ >LS zV@%F=ӽi]&-ǪoEѿ)&Ke$!^hbɱ}4~[4T'`@uNN~/iθЭzz G".W8im̿RCnI7h3p*N'+cԦya0E3+vBuhӇh'c g('N:ly 2v0{gLc^طpΙ0ݭhj$蜐GK7eJ@T>z Ah-}a5>G>e(pR_{y ST^#OgHӮ ~ic?W߬grͰcoVCeژWojx+UBBWd16}x@5F4g{9(DM(`&?"F~'I'{lm9pr̓h䢆4{7xYЄM4zc̩!( |S)y7dz"oZ Iud(s/-"] r艰0}eq NMl_:BX+o,ϑ *>\1ط譙{Z.cO7-b׸@5'M.1 y C,]#ezˢYj-Kr YoYfVo-Az#F?ЗcKHIkӏSaB~-sAn˄16!Ot]"7Sz\*@AIy-Uڭ2)QA/=3P)ȓ m y G{!-=w_FO7։|](45U;NUL^}yٓ.J$x#f;ӫűс;_H樽z5XbQ\{Ljd'K#L2y^+M=K(hZѤ0G* dzRǣN5k]Ž-SrS`.Opз-oqh|# 9.N^/|J{d;nЩ|=79-Znz]uaQ zJ?Kxe9]rOhM'^DO[ʠsui0v[=kZM7{KQsF}kRuҹEN/TLh)($qٸ]H?  _-;rNEΠ_`"$\[GIsGs-mȳ.kً=OHꁜ$'Ntݣ/r"QNLxm 2' OLGoZ |b9щ4ugCݑ֐(FN]QMΠSId.K5t_&58#Oԃ"])ayˊB'橯'5Cͽ;o"xU;5G3Mc87)8G82uTb hF=&Li.Z BN N-:[oԑ?b-&Џ"jtII=c\t>h KS.}kj Uy]r)*t}C']iost=GK~HSv}dIa50ko`M?'Iܿ%q }qi39nN#|ѕ/uF+l:O_U<ی/IFi% -ō(a]C;}v _D{F 2z~nZY54m%sQr!u.BMS \蒮˒}o{H`Ka3_,.x9K"3],nH'?%_*Sjkx?-u#E@@.K  ,Ǝ8ځ|?zӞѺd[\׋>^1k޾NVLjSClm6pʮyJDI6~UCvpl0]Tz]#ԡv ڙХ I]-TՁ5$;hIIq_,uGǁ ]N8QI)M{!3;{Q}}^Ā\2²t;lvٸK˵9gcA.H{Ny@'W}=YNi^L/My1:דh ~}[(ON u3^jc2vri!D².qڙ拵kWzR|EmЬۋ9+M?LƨzƼ[~EB9W I;$(NȊ2F忛5O%Tup CvdR+:O{4M>q6.4T':Y}5|h#x_)E~b'"SfɖIa5J`Oy^B~S~5Z刡͇Κ[\56'L|]s7ن;2*=uoo+Qdx>[2}: ~:8-] )/) ږqXq Z|t:~0Ix?اz8~xMcNJ<b`ž'lXzB69v؅>aߜp NTzV~c_q* }/ܭ -6xAA o[%ghm.s7+c2IVT?[Td54_Ib=zh^#7 $9{/ o Z? ^VbZ vM>ݰ5H:^00v+ߌhk٠R?Ow>U*bR b0-=o'!c'2'UgقX^ڡfI7+_+ MkRN!)7e7# [2: t|1aג6hVȼC~ Z=i㝩,_ry6ߔ?93u& ]ß{+[䝟@3*(K礁s<'k@<O%9Xs,Y)4.N2lm{U>mi*Y32kL65͸Asygrz8&Bߔ?[R>R }4Oڭ>؟J`>'+Q#/zAG5O-^Q r&r}|~C/zڒ>j1YyjĜcI~4zi3t[2GV4AGok|YGYl3eg\c[5F;a>/TR^kd^0i)4Z۽[9ߚ:pZh]o)/3XmwzcWn$Ooۤ Z!thN!NWf}Ԙ~'CX.hGyi1 z-|zL-w&fSlNeC>qط( _u|>) 8+yk^5hݷW ؛o[<&tZSN]bD6iȭ|G[ձs$[ٖK#m\gd732OC8{7y8?Pu|] r978Y R3[%iWox zvjI{ GN qC[$ׯt0prs=),_ӽS&M7}`Yr'i vF#__yΠŤ6q}\FWg>7(aOF1F㝁rX2xFFJ-}ru (ƠxB w~] KhvDK!a&' 7521UnS=d[軿4hC@8)^cvn'tW\C%u2akK/ƻ$Pqo3U{BnOY`!ǽ%wZЦYFJie_zi4 ~'ykQЧ:MZZPU{/Q"cFH^ =5'vhc/ѳNbf8<ģ\*r!fo}x]$s/e,[BQzz)KѻVvSO!ak _[Ey7{`S/gs ~jFރ kꥈװ$wb$o{n2/,DC+hzzhy_2H]6=+y*4G9WfwkǦ~%xH-+qF2LFa=Ip?˚;AˍX/!kwh;z^R/5xA{S@;6lТLT苞W)ݡgɜZx[dlZ?)x Z Y/27knBmh(4755vOq4.v*α垒Гxom=M[&5j2iZba{[ /;pF-]9zaп\~ j{ {mefTrY57 &7Pjśb/qImh=/#u j#؅4z4AKE)B;.7vYFyƮ!92I}('[C/xCȅ,Z~ngm֯^εo+rj;~)/ȬlA~R`ĞSajE>>YC~&'[.49:}^=GMSL޾q.;KB~gl6~kַ>wo$q\y21q>)מȲE{0!vB>S]UY\zKnj?[jC'5wr VYwZ\+*] _?~@);+ZE^q̯sYl[ Ma#Тxyz:A+&~I, f\UB.w퇮zc XqfU^੥Tl۪tFh+._衕6OǺ؂&硛WԼ'R=Z2{ ݉J7xQrlw2RC -~k֞=Fv ӗ !3M3kU6*нھ"-Z|Ʋ.ָe]W=\d@/ 份[Qv *~*%9ҙkh-|q3FgD7o,Ba{-f0t9=mS_x R2{`1 ̈.c}6ǭ rK<ꁽ9AК9<УYȦ>@CrnF)'E#}/rhYSݪ9_X} }nFxnfb DFIdw ѵ]׵lwէS$5> wZ㘩0rA>eBuFkpH1np03kf;^/1ԡ#D NZLnԓfDCl籗B;B7_$% /~Kf^qEN=WSțx~8,Y*EaclF{Z}Prtse͕f'Y^J [Ib#@>-Vn8cQjކ:TF0{w%{Nf4| @:Ǚ۽vR En1`/a،h#At@7 K;#g\@=˝+6N6?J}U"z~[]W9cy$`)Qe#}#N\R\:O72Sԡ ܳύD Emth) =лzT,G]mtiDo_ {#E7wKi@6EhJR[-q @hoܳ*$U:Co6~ y4tXca\zϹuC+En{8<<(FGN0]*pG>V)_h 7D@ }- .S$le 1b~'AQ^ŅgT5F?|E6QWc\p*3Ijie8J$_DLv)]Cq 'J%#v F].1xzq"h]Q@ޯсm /p{a]0r 1#vOzVo4&o ZIbaސ]I>Gポ$`g{qMARLO-+r&>Zt"U-BANT<]_.l4{nO#t?`UD zɬ ACAW[ȗICʆ3Vt}/Rk, yF?`lHm11p}D n`*xۃ<δTzU ԙ z+V5caj=Itٶ˂7}ROz }'vkqQty@3 zCF'>z.vKE4 =S- *AImm<9i^KبBDlÍ7Z:a'rxiWЙ:h9|Dq?{ء zh:cOJcAA},{2Pp3x7.FEcm`$1hㅜ`WR.H$"uũG;7"A>B"~#Z ԯ/c = x,ydwK ARà);#^jݠS4:?ť{;kv`og~0Ők|ɮ.2hvĹW&üa>3p-TOf$9n`]%70X]BNr*߸W\VdʲGc\#{=2l1ѮwYX졳@yΦDTxA/1n Z~ jڀf ˬ5 +Oc^RdBFނuoґ@rnBЅۙ #$BE8\9:^'ԷwxR}M-i)'ߠ)WwfQ;SoChgRoaXЫ|٢4:Iy#Hk|b \kդo>sr piH͂3Kl-;.NS= "jWz,_QZv^6>e']9]%~ Hgل }-\uͳm-byoϚڡyR~F;%.Q!썗4OV4ɫGV]B7Kc:%z`iOZ= W3ÄL8nlrˊT[&L댸pA>⥦Jtr)C/}yH }ۑ o9h n+.2F6b7#/ic#3֦л3E^z=D7w" (*pb<]a؋B7+"|]/UZs '\^ȕX?6lFn'P䋬 1I#Y^!QzͻE 2}wJ:.m@;Зc@3(登cJ*A2R]jd&A0^]Vzǡ掦Qdu_ \<@.-z(Ѻx/3βnh~@I3 :G*7J^FGEF.<ȇSJ -W7|4c] T ڨ;-.9~/gzv Y.l\䷾r6jJCw[ުNQY CNr-mj15Bg`ᥛM%tXO{h?襬>ѼX)E?:c XW.ݻ܋q_S]gh,nA2^z%!En9P,v25 ƶ޼Aܼ0͹ 6^c\-_v5P_G;5K!#'Kϕ :e;۪P/"ХWn{zsu ?x{K3pz˕m 9Xs9L]H#FJ~Ie0*WSH2Jv]wum`kv }uge#ɮVENvIb>J)mۣtʮ ^x[AoHΞ3kf(fOĈ ؈L㡳OWߒc|ya~jc#I I쾀"~ rj@+1ؑo!:65 t=zh.-O;{ d[ q_K wWȐc}}[ %7\ޠ%[/tc$CFrGβZ`<[-v0[tuLծg! }-j4v_R+W厜/RN/{#PxUvBM Qhhp"C |;}t >"uѢ;g ch _qTd=y^R3NW. ]}Aљ@ufˆ1<{fDECB:w1=[:Z~RPWmШSZ95K!9t+ ]5l.'N F;ZQhiZc ͺ{K)z/J(ro1O^cm}UlSi cߌߘ(;jV3x[VGV_0}0vWru@38zG1#lQc/p}  jLwXg-rugUAv@y{!a 3GD靶E^ٕ ͿM:žt9@y.:hc.z?B ;;ck(/4|kH)dKr $ }tic.Э"럏4/WZ= P7MI"WJkFKw- [v4uwk Ni;[$ c _.RZ}ZB6´y,tg薶6tz"a4h1x/3 #^AQu^<e{JC0GJAyM98=93N _՟yLȌkFH4h/<%ztܼАbzm}rBU# X{rYC8lT*5.lM5A/K%Ct`H=Лw 1! ]΂\X%Q>hT-Wdt-#h_),_|Q[6./%h?Ia@7=.s_K3trx-`Šz=O}Iե\VDnҟhP4 ~ 7i1/{t;@'o̗;rw o /0rq N+#:, 荋|3jѲ܁p;w鏢q'F@^=:н07;sY,bW;> :;FTjlvCg;/ؽ,ܥRWޟEw)Cwu#У9h8ԥ[*H5XO P Z)Eke(/[X6B^F4^/+\9)r7NґӮ"n6 =( P9#}O5nϙXvZ FXDM7GrsTܒ`Kszv1fRB`svY@n{j~)]ĖŻFtiLg<{×qPHiqн:Lciͺt&~C2'@g+2~Wg1|sH;UW:K0?UC'j't✨[_|9_ C32/}6{зc4j}E.<> MϩTxHߨa_e},Zh? 8:g\")')(EkA2ei̇0u=4 s:O+L^ /纺H.]<[_D\ <%R=UJ?ЇL Z:Ӎfu  RxBu@/cJGGFK p$a#i j|Q[En,ntvWtvm@[3Zo?ȉr:4[붓^RCз4hn^o=Y<^+zOm9Q?{Ql[iƔ9x)Zk 't i>4P%$`5Ԡs<`h4-FQ<=zp$d|7גۥlk my;N] 9'>`51~K4Ɩ}wo=zC#}N.B.vbWhwf<ȥ4i7z@^G?O99V|#bk^HCfr l@fVvEǁ\ӟz!31=v{J-%_9uT)mv8\HV.dw\f2k؉B._Kn}D^-)yT^<&9>j=%o3M~|{Ş4AS4Og.D3J g 6 CS^\hGfMSciV 8|wn#4I0c~7 t1X. CCɖ.<DSȋ$0IyC"J[0XnFC_D|,TKޫSTW3CG:ϩoQl.3So.y{!'b硓KK/clKWG"yC0 zCk[+Szհ6~kmy qV4 ѨRԇVΞWuQiܭ[wUIʩZ4%u@ S9D-`|gdДʹv"837]^:{1%/Ѩ5=7m/rIef~")E=df5>9SZ.RU>ËTg/=_CXJ2B[x%* -j@ ;x:C׌yīY!ORA9Q`̼,G}L#O`Z48fM5f`+aU9w/&fy[ܡOyo5Iy,LtmzOv AwH6yI=PtF7M {㈕mt"w>δ Сbr'w%5dq,o3Zb#,/ru'+*->9mh4EK>}m`$F>/Ÿh\R(Z2LYsFKѱ͏U. A6VtX3P )݋Վh7tIytE[zgkKs".-Q@%Tcȱ.@ytC 59}e=>nԴf9q]V}قGQLsoCQ`Wo_`[uxKZ'0[|`Ga]ێx-͌}6?[CU}7_L +-]'\? /i\5Y;ӪQpY6$S^IWľTw@7hDNY [-y,Sݫn|C[?QWN)Sbc^=<;gԴlQ&_ʤo߶볈y4[t7⋯>}/ߓoˡaCk_4.Dz"jmo0r2Ͻ#yuq#Z`2478۟ߔkz]T6_,iAܢ$~L'k~aԽ?+K\ (UnvM AcnJ[b>V Vk#n]Ōσ*t|ݭkzSϿQ]~ {a73 m@[l$US& {: 14INN4,&R!bJmmzcn,pUh"Y)|6QGͮ*a]NGBmԠlߨQrE>9{H,|af 9w'O7FʼpWgUaʞ xr=KC_Hz7ue4V䏰Qk֘MgPAi0>XP*EiZ۩r}̺O32+_ͻKz\V8e¤ȭ*Цф9b{ɒ^OB~*vw7j0tVӣ~c%M,./k[|?}ɓB{_]ӗNkb4_{疟=Rѭ<}|54xh־-W)>Xo֪U^3|DW+AOI۲_ v1<^B X7B_; :YN|Q:tHf'RWbM (HOR%S=m^ yC tJfME.{kC>?oU. :;Di:^39o0 '1[i56^ATX{p0p{-?@V*<^wl A^38/%a\WFLm@>x"'PvcB>d7y`.6[mXW[~'_(qfT$.74hԣ/vnp@jvw 4Ы~fulzPg",IGNln rga}yp;IM<ʻtؠUV_+hG{C{mά<捽]C- K ;`pyERc Qvv+rPQ,o5 :Qumく'dHjAZj^sx5ΤLGG^ęo_'!%&}KJT~oqrp$_֠>lO ,_۫uŠE|Nk=,'v] 2?rc1qq?6>X4oqɤKWhVG͋၀/ 䤈ѡ{滊0:'}Յ${r&knds#~ r*_G "#_xfDrMis̪p>#vh@Cwc^?:4ͼ&C⅝s:Ih "4Q! Zn!&kJ\#XU`Z 0ٲE]zbt|) kھ%6l! G꒖VWݾCAٛ|5FonJWce>Z+ h76Ǫ`/٧kRБzNƽ׃CsǗzI ewůpo fZyhyusbM,f&_D#KV* =X=/lZr_P3h;6B׋#7uq43`B@hD?k*r<^62wfZϯ2U\ȼFmΎ{qoNkh)r dT$r'<-yq^;@ZyXmNFƨr3s֣EMF:^DvhZKNg@_F8@t3VBf1) ^ r=:/sl֌ }ki]녌.ۄн:kz #ƥM3}~ءOvCG]i^w^H@K.zաA7EϼS4n0Q=sZ4 H?ț#fȴtyx.w%-^QK!y+t--t"mT2<BΨIǁڔbn^FkFnI =H}th Z( <. -{ţgg+"@T< Dtu@WUʁ|R5ŭSޝ0-5Q{_#3Px"-A^oZOueлGvRV)"{ڃR'ZI7zJR07(fIЛ9uuNz6E^mLݐ]=:vϊD@.Hb=sdxk=3"l7nӕzr/)_do=%zutszz-|$ n+x[,nh,kKȼ`3s{&mJ}\]mTK 9t Z'\B= I[9fukҒ5s2 $ľRu;]Y L0%T{=D~ 52{W.5B@4f yzDjz`W>hECX CTo>@ÞŚFȎk{5-ʝ-7^s0 %0Ө/ucGfH ;__th+!n `Wzp:h3G(5nk;/YoF *rCz_Vƅy8HE >ys݋.Гt*tB_<@,Qݑ߾O=ў,Roy|@g獮:huϲ~Ѭ @][7Hn tN:ct܈a;c}_y8Sh梵U^ Czj*H\䉀bөT9Ћ #E[rsK%'r"EC.[r<72 2`}biKcyT],inI5~qVN;8pQF59Ӹg>#%m >,g([:;On:SmkNĠu;hb=)cK'Fnozsk.3QRA^O[Otxv1 A*~-儁#]r8oLdE 0c3DI@o9e@/JAcrσ&ox K zN ]Ssc Pzx?з4/Kf\Zǁ|w^ZJ3ݿ`צcp7>ش0ґA'e⭗}'cTBNEu. F> PH$>kIݾϡ75^X|\PcMdHq.VKLX%Lf|AW[i/. Â@o-1Ai֟l%ңT/GIj9-U\e($͊zNaЗXЊ4선DK>H|?'뢔(تݹ;낄&N/}\=&5ݘhf5cX@ӽ~||ܔ3ľ)u9æZ*`M_c%˪"syzb|8{tlyzDA?XжMIOv7F+N|ԙ &#UjdC5 %O<^Ӕ&([Nf\ __]틗 wy[ EЊ6k@pbյא#~'vqÕlݽL[__=h僋ݨIZo+nqr4Ҡ䏐$BBPOTZ=-hW/>`-҂7yW*x/]R\HG:^%H̷!d@oRYۨqH>jߠԌ3E) ~yǠ(r"L!k軛̈́ذW)R7xKUF3Zn ϼ& ΰarmҾ7lfwhGN|sV٠;e:YW4ȓ܊5,(Ch`~BgO8խ,ZXQ~b$Akpm ?.%hG*޼w.N삵jl}ES^SZ+|M\Y h~s |Y^;>؛WC(v+p@o~2c.xIA#үNz@uh_ ZFn`ȌssY:W>rEn}{2>_jjlB_kzbg_\#ohj_ +օxWL[w/XumK|~~~jݕd9w"O#5c ]s.`&ȷdطc4hN"|C׭OIJ8ЫCa#ؕ눪T 1ߠn^id#LUzc 䆁}I&hAIz؋-p<ֶjZ=}M5s̛qէ7\rqʒ Kwm7';A/ؗ#V!Oe;j -ABx*CN${0`'/Z?4;800A|}t5SMz.|2,{pn^JZѤn mM {I.[#Ld]]Ζ.WxЬ7 Z?G R_kMNZ4z4lv",_ibK ]/Y{c-w&I{Cp7T[f0%˶.}D\YR1lbN1Y4RE: @~N벑1–ޫ)Rlg6= +Alu}:}oR<+t{}7ME K`Y&q^ X#hٞʤ죳PG ^2=I O)M@#o-Rv,7f\܃_Z9߰,*4,R{[n<$]|Ә`c;lٳ$ e*+rRF{Ä.(B^$oKTDqM,H]42nk/zުE=ud<_ 13A/.k|GoOFJƝհUv8[/rd G=~W#gNF{S?Sb ֈpCZ&5Y'؇ǻ:#c %Th"Qe!o zjW5Ʈyu h=OӃ\ʇm`Sb<]yױ'ona/쾛G_8,z/ٲ`) ]_؛c-X0~A_]bOj8Uh~lCsF ѬыQme b߲o_2s6]}? [.u{*/C9};]ԠiM}Ļ_4u^q]chӿ5 IA`)>erܫ#2 ]U( N(0ADޯ3:uPK3C5p$`zQleޮn ]υ%HbųQhFH&( )ڿklow JZ=\D3;_j4qo)|pG#{Nhkb옉 {b+-C Dr5;2)b BoFF1]ܫbQRK۾# Pl$Q彥 |~? K-+f)GRm(ޯ;sz,Z04Dz#_vmm}f-u{F/9v*iM_sntXb3 ~+NA/p}coi:ۇ!ߔ޳~Wt p[~|og aljU?v[B"VUh64)~יhV} ܐYS8|n$yIZ}f'#¼{'e}׵?waZEݟ3^=7yOt VYE;*˽B79ba#^N 鄾T 2\u]TB69/AݸG&qUSmՓ7=j!e }_+B\gU.WVw}okp#G45wp#{xᱳ9= L?N2VT} N/\%Es?T ;63r! Ex$!M<[ p-EAKo{+tJcWa^5ulPY{Kmk}$JWGV+jIWLJ4}\+{@=13f~@EbfDLp{4fz@?}" mtf/7t>2CJC~RywA:x@;#9/=:|mfe͛wTR`_ C.N]w1Fn)Mqc"q-|H2:?HWT@DNRacgw_%[{0=ؗwKMvG*j;o\Vu`ؕTR~5G*.Q:|3U>W&U'vR))r` !W{CSU*^U[dyit#ϡ Z:h0늁fOW4tw2?- ~l{[ZW`4AwCv }Ͻ!?Kk{C-5^2MN,G,>(:.:NKxZbqda]Z'?2]͕ڡ;%>|'b~E<2ȁ{##qޡhd27n亱zjNŭK >%ĮNSS%e4wj]{u/OEdK [ͧ,/`N+7!oiaO Y%t׊i]f2(:;J=Z|)w`_)L<c衟;Vw]<&ȹ@oM ny1U/d rgv~B_3=omɣ(m6U$}>34,'\LaSv^mՒ&eRlG~k'߭%);7B7 ASfHOKe׶;W˺o2 QqRf>3%*m Ĺc8j-E$!- c-ԐGΆ=$t2qi'] > ];6o |Vy-gT3N"B:16w vK?Of*4o$NJn8O"8dF;VO.K7GoJEc }TFo^y,]A}N\6t}DXΎWŅN4:d {@44tnRSve:/vyxLj>R\=؟vLU68:A4"ۃ}ԥ~e;nnyys3r1#`RyP0j9wf4wԐZ鄾W@Qapb$[Iބ]i'rN5 SN|{tB﮴5P{wxCo~{* Yݣ. -p؟CX*#_0-1=9&/6lޑК~K֧޽N#[`W}m{0:ݍ:S$ {v WX$n<ɝB;}g1 |x}'ER 9^>w拴jS૱Nރ;ici)r@7_XЌpOĤBU[mݕ@ X87fONq4a}]h@n7t FnrwV0t Le<7qݨ|_]r>r (S;{4J@W٬~"F嬀}&,u+0]o99ybZRZOרND\z2qZc\$N~}ťU刋|>U ND=9hFk= wUV9ײ.O-"2sרMV.ݢH^5j=ke(W㻚xЏRM^ N褹S@;Ӊ}Y AD)>uc_l /M|ܠII$}0h7nWǕ3P|g0zA𳀅^yO}K fEgu3L ְK@B{@o4ڲ>}\Ѭ*A/`v`K {=ClB6h>>ؗސR9 c?ygNԲAi9וw_cc;?CK ̓|$M LsA+K^`7i;r*_]-_FH+&Y}fcڃ:/q/ 4Qۉ5_2 Cꃝ|_\tOC ݒ4аkM7L6vٛYh)Ek5 -ߍ\]&i9vZU%T&__~o)3{8SCE KEd僽_‰N4Ɖ}١4PSw`*r>@QeG u3}|Cz'ͳ_[|`e_2cO:bYZerCO35ÆD9&Xp3P Sk'❰^Ǒ}'2C+=kE],?z}th;45񒙝{6L g{͏}VbF{_CLcVT{~S}nS=u޽ dN{IDr/z{A*}g:T*j:A+zDZpv?= D[ٌ4_.dZv df&K]8~5:kJ ~QKtjCvR pC ƂjzD9MkF7蛽ˇIܡ;aY=akW|YgEyʻ< bc+֛Qg#%U@@QiY\KL8ڐ "mŒ`IŔU}ɾ算 !xtBJ#&:xbЉyZoA56iW UTvS\qЃ1#IN 9̈́Э}7{Y΄7tӪzIj":O ƀn%QOK1\&=ËAWzrB'myk:vRdVcw _gFRC ]VEa<̚b|Ը!,jsh~$;Y %Y4ؗ ]KTm ]] :moOD?Lӡپz4/rtҀf|e>tEIߥ^5Yh3 k}T.a5vE>=)(ѣ+rӷF"g7%*HqCo]zjЧN!ɰ_cOR yNIKzCrl-`t~k`y\&lӆd+dP}cCz^C5iiS>AOyRSN"Jk2>TuwVhlτsm@^[b;KZHH%:-^0fc'=ϽA2| }:%he R=7˺t$;g{,'ܘi=lnEm^M?x` e2jk`Z].13h3b)'v5Ylkfmz'm{PF)X&ぽ!aN.hIK҃\xiѾc|Y_vҾwPCmC]/upv^K{d vXI.5i#C^&KmȢIICؚ&5y *\yڐ5 Չ7&l`Cg ,]_h-I&n:}䫽 \|WbWoЊxm|>Uw>ڽ{DD7ɥjDl&=at5lqWwUAzJh?bWӧӸFlԎMOzsYtThz5e?ЇK-2v'|NO\x޼Zx`_3^(5譟>5 fȫ3V3)% žۙxc|bڸL`ELD}]'b,"14qP||CgڐGT^Z/o1hk׶-F-w~vdUnA/ 4Σ~O{9UoH[/RF8١!3rdk ]>H3}+ܛ'teD>So`䜽' i7WA^c'jXȁ$tK!Pk 2FIf]`hH{:if1|JUat+=*Ԇm~Dեof@Pi3fJ^4j'f6{f23uY6(.3.:T.&%[8n?`>Yl6l oִTLcdhٯ?9{JsP5#w5 }Ka l75b8|{w m\H^w~WAZ\Y?ɽHCo{_1$6E{&\LػKA.F;ԗBLn- RO蛗Ԇ '>W:N]ؠzޭSK&!x:;AfL$۹E]*Լ9%y:v[Ic?Ԇs k3$̕;T(cMK YWK[*bx@Ikԙ3a׾[`APZ"rRn2Y^B ɞu KBtq#(?{U5ik'veꎉ]iJͼ+.7TWW*}{G\Fo[f>d̰GEaj83 |ǿt"]+~T`f)$~byએǹv$L?rtdn"-D >зIha|B껍\5@k3h~xtB騠KE7`ȗU8*tlIN =N<|ݵZNו:tw@'mQzU>#zǭSK7bn3dȻzu3䐩w{]ٔ)w.{zomLqbBo{ =2{wGA'q5V!٬~Of2TZ|cԽyJy hF}4Ͻ5gcddp[2[-; hnI`w22;5Ma `f.w!WusM6$ Jå͘k4/=gvGt>7/-bI3#g`?jf?RsN,fb'hhή}Sjk}}c9vΒib;k5sr"d؃%-[Y[?^Ӄn5j9Z*mKnmMzvpէߍ{S´?LyԳb_NЮbyʹ?B5\~oOZoyLn覊s{e G&?%[c{M]+a|s@+B'tɶo/ %xqU:\EyW?z13k=w pOĐw}=5QsSCȵз-74ܛHlj={,`<^\rUІ{Nb?\d}udg??"Lh'tՠ5pqb^^PŴx/g{Ceh,軼m,6φݡ^7:φ^s] 1-7jw}{@fn VJSf^>W\>|^u@K2>gn:2Zq(|pSwIu5" ؆૶}[Zl 9&fnCJn&m.Q؃tM+R>p.@@+p@]:ZtS;u`,^Sb7F7gE,ʍi"6gb7Ͻ<>ww;A|kZi5 f[7icoNe9 r|7I{Ҭj"ߐ=W Be2t9Ld dp[⽡*3Vg,:+%{}jL1/f2}<)hTfBol@7gc=Z]*H.'|ahUdfstʈ{mg֟EY?2t v/*9 d7b {&oԋ{kȱ.)KK 2+ zR`iz}fKu&VX: =B $Iy^Ҡ~wܫw'':%;҃%|Ͻ°fg?#F9I9[w/*l-A]Y"lSX V2|T?Ժ7tMWahnQ`o{ ]l|߽S7bVr@'\/jmG̃Ý>ط;Uhr/V،W IÇ4ҡʼn{bK9׫mERYw0;fz0eK}:nͨU-zu@s'mŐc}d?Л\ڠ ^Sx չ?N9_ؓncFְh h5k 8MxN+)vHi*Qb[?K͠)>5&c}{bZCުNCߤ,u0|!4f9M$Eb}9{>qIa}CoW} p'`j٨@:݋ &5$E3G~^à[햗= [z8b~DZZg,C+T2y^.ĐyrY nv"o7*rqB)[ =崄\'t/bua_@)MS'cs# ;cٗHԧ WJ+v|)0vľ*8pUh=EoNLf;y2DЃlG+}/(4yO;dc fvxMGݕ$˲ =KoD 5;:fO<qg`BrB1 rGBvBnƷh~[O U"S% 5ʸ4씶<_֊kNё)s&˴.'EYݢ]͟:Tm7r iM ݘYSZm~B[~ B۝sL3v6쮱|]َInsf H'j4~XEjس4"m'z~B;>iѪЛ_&A z6c W}'z[}g4;5soi“Ґ:;;{9F/6+f%d"%_Ů5b4+U:Nݏ=b z5OXowqFdܙi^M*Q+.Wrs8B{gJ 9 4ZLd *'kʸD)uWp_K`("`ᤜZ7zv5DN7A~=f/^dVX׹&sאB󔇕:z+t&ޒ ZvkK i7e^aB7eܲ,\EZQ9k.uշʬڠyoABVH"#_Pt;-nr4wY V=޻hjtYr7:Y╘BuǧtO{a4 ľD&S*׽iMзli "t~A) VKJyY[4[Lj1hJĮy5G{yzu]1C^ ]طVhQE\ :3&ݶ8~Mka3'sV~`o%sٓ S[ y^cB'tw06^N%T'j>h!;ŀ*25`vC. 5?*Oi]m5 T}/.tFkm՝9ӂӒB_:&4f ~ 4eؾ @ZIf~'F]6Ok׽Uo\'nHvC.4c/1AOMV_Mndyf*-OfX*)r {sy2qdN}>]N׊f'qbܱ%5i+')R|t'apxgK/:UUFי/= rIN3A0_..@3\/MC/;c!Y4;Ao} 5OgU O!.ae\R#eY ƁT49)x] t@7Cicwo]ve~pTI\K9{K$a4T]={ȾJlbeb&anx:H/v2yu:ZJVe7l-3nJtO]zx'u7z@zpµztGi`3¿C zO° Ds1@ľEPK.sfhf/WA+]fKzz93M_:.#>s"g`3}Ixv_s dg'֌C7ߡ [lZ9kY^ņ|?p^IR3TT 4_ '@ZŞ[$"Zm>` t]^?5jЛ }ߑ΄HꅝcyVn%wP91c&0YxN^$t3:.fN߂ ga2|K>ew 9?'@wd4ݝn2Ť`pM<;/ }@sY겧+`%=lY`rAomV u }/0wT'2{w^C؁?;.v9*2=p 8t}ݓnS < >.Vo؝`w싡l<[V}c ̣`z-M.}/3H[Wt=kɥQr9"`B'[4~ }^R{y=f1[/SOEr?*qЪf;1Cq}krOCiCoY[kЌf.?oKAtSdwC_m QXi5{g,E}9qz)#F*rzLz )G:UⴵdavYdʾ5wC 9 {6esgo-QOThho'G EYzWdn󮦫!-B1q<uh[UJz&Tzh ~F`s^[O Z]e叵0M*~ɉ}݃x =Ou}ok˾[hL h3^́~_f2i'3A6IE^NC@ 5˵fBkQ6BHxK$-.ՕЌ˱җorOk=6x/Cm]D) yQ6jGslqq^'cpw.\iqL /1.^^'xK(&\=a滄}f[buTTnt6Pැr.2?f#.qwhk=zOl%2> mH.ӎL-CFc={z {qݽ /_sd2,eqbo*OI6seV{_*ׇ:>-joj;S.2ʀo<)zȺ 9@}ZG}݂\4>@r[bs&2&3"8ed+w Cv/+Onv},rHy{QipWh0b"T4LY9$vmSN(5UpZV/+r:5dԠOr?o/- )t| Y69̢qݰ>D~/4p@S Sk zhʆVq`2gJO:I`u,TMNOp[v73u1F~P;_9dp|(^#@0whdTho'Me>\킞f7.^+e}j Nzqazм*zBk= eUa{W-'4_v_jBG] ;9:~#Hk^W$wic] -G4>/CޓͶՏhie' t.hg뺫:q{O}6k2.)[5H7 9qz}+prB+A75֘WX.qxPk|*/ 8!/쩔[ fK>r'N tn}ۗxv%NLNk p7 v/; |gfg}'u}RNeue>%@.c4ˬK"Y,X.nFo=g u#o %eY.Ki4wOW }WD3|il>[ȱ..C;\wy-KÈ_abvvd:t6~A <[ʂh֪z"E# %c`#Ʃl*T虀}audIKVRShR1f0Mcc:si;/?ޯNbT#ץ-/tN90C}S|ך><'cЄ%~Fkp]\hv Y3@Z7_(tt>͐rxO[ۊCܽAwK+ TlL;Ȕc^>0TWX2kw5胗[` {8 }{h.~A'- C?Lu[$ĠZz~ɍ=:[E:q/'vjA$hHvdZ{SݘN5N񧵁ܒ!;n%Tz֧:=C6[eظN$'C[r.B'λBw%J ~*}]V쇉FweOZ~d{y>Vp'N3kEc2/l5fၭʦɔ9W8ȓJwɏ@tأkf؆n)~3*!.[|:t3.t1 }&9GMu0Rjk<#qz͓Cne 6c7e[b@]zCձ|!_ǣg\W1AvJ%ƀזHNY W;kǯ)g/s` {/tdrM^WD/S a5{x/L) #zI-&zoZn%$g:0c;p"é "k H"ͱXKRovBg:vK2ډX5# m웺&uT=}%@z"f1"tOm:3Jw hmʦJ4"[Zj#9r.'v݌&yq<Ն0>(}*K aʛ-.4gŷ%`ȍbVUX.#,u FAו۞H2.S֠w\ ]T˜n S޲k՟K.}ȩ'! 9 /z1L7IowGF陃"yNBw}@<{AdR7@ohp} /t{e%pn:]ѹ=ypΏ=C[Ig=a'r}]V;5ETS ;bV.OW"wϠz"gz.[TN仦[&NKN&e59JLH?c+ huJfȇ!rr}ARe8d߂jAzrBlAKJ;|Oggh5ght`[˳ȮoTȉn)>2{n;ܴnWA PvbA6ȝ x`qV~T7}gH.eGzt.N:WcA*fA~Rc-}2/td" tpQxe4, UFNARl9}8;{Kxն6|0qlgztѠ9T?7 DRi:CZ.&Юלo7!Ŗ˘r_Ԡ=Dͱ4lQN5}Q\A2j Pd9H꺘-b} B KЛt_iغ$rQdzkavB5 (3kvmc7kTL (KN5cP?; ܗǨO5(jc(n5;/y,+r^IS R~BMH۫ =x,HIo'ůgi]X*ASEN{P6א_;ɴ6Ň+t6LyO<u+n?wW:m>9 ^m/Qf|btm}i9\b DZ_wMz[2o|⚝jd{eU@VZ!tI*Et14¯:PD $4NGDr۝?$%DB1UPm9bn+=,^2ՙUk: (G˸E[4~ j+[m5ŔC'ؽzc3h儮l;D5R-A2kޓB }}zt`=-QBAq,t21뎅_of'Qi ֭9P#H&=]"h^Nqw7'"H=C!7-Q|. ]3\G.p^i'̗ ]H}q|j߁4bWzZ005ҳPn: `x]S bik<~9V -+zP턾nsƍ*\ zيڡ;2WjxbtokB JE9S&! .A]lh&V gÍ;2Mr7ZRo YX.g4 9g^[s: t)RMO ]t ~,)T4 &[E5/իJ%t_[jT9 ]C+Gb{$@D+}f;Ԥ~C\vH:e/)2r*0JY%{t&d;gCD.^ Mvزr{e!؉\bK"'=o͊=Rl}YUIW.i+nFн}de7=ߠGkaS;B't*T4W`:dm>OGߤ"ij##g?Otkq"vt'!<ͥi'Tci ^V7xvVl :~k{]w}jL Ar.9Eo K8SDKOtdd^c`$oת"oJA6=? (J|y ~Vh:A/7my)rb7z6* 7 XH |zgM-eQ5}/5^oέߐٍ_ZKF˳,x- 6n>T>ڪI)^nzSl)1lׂ$㍶&JF х~4bg;߆O:1Uk6 ޗ=!WSmvm_>^)S=[I2V2A⩬7V}nAbt_J.iņ=o5~~9æXZ^}F<__}M OcfT'he7+.BiNCc&ͨr:n5tQ?ت f;<>>?}~ Q:SnDNᗞQ7&q >pvco*/m)9SJ;EDF8ya7xyG"];:FMt'Ty㸎S9rqpm7xK& n-gjA'5\rZ9J|Fѹbc+:~97RFO1A (9X3 ~v`PKCDM`/R!?dRnk>e`+*׿BFA,e-̰ȹ.԰yCkUfԄVo{K Ro\+<_%GkKEЫ'zTg+_1=DzOҊZ2|1 w* [$)g/Y+.eM0E_oQrQ/W/M }XK.2 hw|q}(9eX%u/~*E|[8K0=y, ,u7׀QAeoVDo)u(20z1KθAsb7B r0i ,e@~gwUS]Q^ *77ǧ[CqJϹ&Ð~:uGa!ۅO5¥uhǙWZ;fzvACju9 g,n$M5os樂9DFo> eLbx^CJ!qz#B*| 0)󫧱x}qTD#Dn@$/YAwNßjO'+Iq tk6BQƛf'蝆uRL5.-M¾nz ~Qӵ5ɋ?ЯqM7vIҙ5^t|jE&+n_y֫%YҨkv,_u@ݑR@|j+Mo~>\ tnCr.;Eؽ_-\g(4I4+o\=awCShJ}1&>ie~ҩ7}Έz_(Y\E5~ 8m}3q6 r=%=ޅÖ&8 -)(Nmh^.\7aBLJ7}p 4cRW<忒?^;ϡ0\Цz }Qe?VbÖM]]w!e\ h= y=/vW~ꐆ][ޯdU NC ޲-B»i*2@^[,Q/th ]>KpTer 2knu@S|8s;ѓ >(: %}SETľ I>C$Z_&bN }_ J:RA+L['K lp= 8b6'lFI1s+8WN9G/@K } Qc:Yf/RRY-]v9#[kH|߾k]rsނw*b7f>rBi+^JݴVGjKSqbb@&K$l |~. ^r&d`c_kA,eMe|\NyE}mNAIy4cuV1U{z4% A\_ !mvޚykn5țc1d_S3ZGrF&oZgL꜔Yo pn&o@-5^cؽS {}ZT s׾ BoM.;(o-:0v {!g4LT}z&7 z'(cU :vYE~ :g6B!$j'|x8v+aOeK6|vj *i Z)TKk8 } Ւ_}Vk1IV䍂L[8{wfa½A.wp/r]EJ td/YjlQْ%ɺ 2h 7 q S:Ŵ{&[͚T.!5 h'맮tzaLmL[(0Gq6tz ܟyY kO?ZDA)-g3&Д3+K͒c'Ґͮ9%x5d_cJ&1lvO5#M#I-rfR;n1qY~FZ'"wFӋZ'ŞZ7Qdoi,7u Okc oh<먙]+^?f`Bf0I15n;Mf@gba,,FJ;o~5@kKziLꃽؗ>4{R {͎oglI9~KL+A&ѽ-9#;IMo _J*tlx2{I^unI'uǻy]^MB::M-Ԡld3i=Fa);Bהn/]CʯUh-)k-mJۉ6>4%okSP%dtyo:v>0i1=wgߤL)zQEN&M.d6Md'I1- Z!+'vrzD?e!`kWY Y秊LJB˃6z"[]?#w91ؙqu-OzfLƾ&ꉶcr( Q"-! VwĬf?HR{l،p&7uQ3w*'tΡQ(b̾Ki%aePb;\&ş #M>GyopS(`H\jHw-=3w\b6T<@)7~Srݥx2E ]s)`El_eh*zBOY L\SLMM-+dǺAw{k'YqDi&9Aݲ; -2n/:XTP?Tʆҋ#+Ά^S¤vB~QYlcFHkUL^;UVMЋ"w5䶺惊2Ƒ:p¾oύ-;&v1G.{x_W4h.[׵ A̤F_b8^\?yRP2EY@w}MMY`.}J=+%fk{5M͍zP$}poEȚ ]Bҗ Z$ɺHcN}G=7.+tGmg!dRN#UeI[adB%Owoػ/q9? ɒizNS3j:M]Z }?J쮑8!}t"j ꆑ"zڧ3s9K\9]h{QnͰYTP7VM`IËrg|m)Sb660?.1ȭ 򸯌]6l`/ ]vg։QPyË+KÞȉ},\^O[6:7q^owxUɇЬQqpG D }IrB"['N|/&I?Şyщ]V~@'5)y/Ttyɖ$,oBPʛC⚝3.}:ۻ/G@qA_w}&\ƫ:"Ÿa]kLV}SImb}`~T9ş^`.Էe_ 9p^ja/vrr]o.dɉ݂63x^h/)S;д<] Ї61ڛ W|maOa2N*h4.tJ:[ y|LDRbB)'%VkMaCljbsEWFMo9RUdok?VlɞK]\@ìf?tl%K):ﵮ|zB*fj'WʅeŮ"KKmwN*У=k6jWz#om ;H$;/ȾTa*@5%/ꀮ5[\s ܱe+f{7EZx`R. l>xb }T[IiZߺB# kz/S6z bno5 ńBz^-' zJ豺Hsp˧+6E\w"ʫ/K_nxN 3 42XEq3h٪WΑ_GNfT:/h-/#gx/@vAl#u^!Wi'D wrŞip_[0hV(']^G@Ix{xK4aRIi]nURDw{j uI+CH˅{On~#Dh=ר;\w z(Fz/v/km@$lj}Cpp{?>`v^j&cWkwRb7_}c\%TٹN_.\Li !w9X.~",@_%۳"'^p^..qNv~'MƧ= ;jN?sU;LDЧ2\ >k P WGCE7dȁ.>WrBFU3D˃ߢQہ,B7:ǂ\pmzH"vX"9r:>t }q3|Qd>F rYWnzrb"К#?N})?R|*az_ryb+,mqTLk ]fvy 31no[TF59Bϡ=|4\jSQp3Ĺ;5*d[8N'/_iPh Gz:<Ƶ BW%f U v$A:-Þd?>} ¹Zr8,;)NN\)Wm 86|b6 Ӂ;rιA^=3?T؜e>>/3#?}DȉpV~E0x[9ԀѡC:k*yo%Sb^zfȟh/D8?IG(RB ]i =|7s\=;ܶo1cP;!Ɂbzq#ƇWY! }mAN1h wl@NߏH-,| d>e@H]Tq XݥD-tgzKMȍE?%Z*.-ܥ4wE \Vב^2sIaQk9I}]Cߏv"8K碛/ݖ*AK d2V2cBtg`=n泖ҵM>V+VuV6-Ҫ[h6*䉾$U*t<]f-^\R7N {}.Zy%nw^ŠNT{}ck?o10ShIeЍ~xt)UR*m.X^C-KA&-g3o%X*[F:ѷtp~oK7r_=wkz}X,Ws8X m 9 /rMBN&hG_ }::5)~m[#%"$T:,. =<*8Q=I}kzl/Y_K.sϏVG۠UBF~FupZ3]z erJh l'7iWx%[ƝOuK.3K#d5lZ7{]"rȽ<oEj:m+@jdOr]?Z\w1KۊNI0ߨgZ&F3Uh)`}#|J;-2+z/\+bKp@kqSouo>0SbW*+"_µ|r^RDfm0g*"`8ŽN{;i /m`O'ɧW;pkry٬ ootԒT;]c5dm7X[J.|)9:vв 3V7:Vty8YC"w5_\&dpsq}(+ʍuД{;K87t.~y?U6LU^"'6"z;^Cz Y29c3:-[--Ʀ7vQ#ȑ}>=yt )]b1̐k) b:2ܜgZK_;yxH~>PAC d J/ӯ4Fض7 #,ά=p?:M|4849hr2!+\߫tا~~ށ_Q?zOg'7ҾC|oC_GQɥR}ޔ3b_ n{d7v+;_#7nzY qk 'z?~|{Z0<UX~%]IyD6С";~uw~:6-Vy';t&̇{iԴ˥Lg 8K 5 #|-ioY"< Gt1,R]m =~>9Gp);BA;56pC̛^iMmFCλڈCtUiEX0h&Gu@jR9)'IYFC6zp?@N@[0j؍􉞴?̀򋸎~EW߽jT %1}~@ߣ0ahZ'䂿=H?S_F_>A3ȗoӯWIZE?Ew߲xZ5ٻ݆h1CKA>_Inz}"{y 4硹FKzbl/EBKх]Ad5y"3'rL]2 NoT?W+7yre[0KSUx<,7f9P:M*$Q7EiX RpW.Cge_Os>\d 2Z(`)ED`o_?MO ^⎶kA[Lߣw06-ڬz3Yٵ t̊ෞXchhs_l2]|&go߮!F2߰[O-G~=X=`GHD2ldhD\""(Q9lt^囡ǙBbEOD.Y [.^n kXTh{|9} _GF?qKcWy5Ns8iܨ!<7OjЌqR_y%%fmJ"סAc'nk$3pzi }`q FQȨ>GKQ>)]myъ%;:O;DW =:랟]7_J^|e](BZauc-/.rb:t_PhwcW2[Dt_KY%69KO@?ȿ֤E;貮Elw@|ulc22F<_Tn%`=29zz˫CX#E\$'!?D]0ȏ:L}ce)2rrb/t]Kl{;eX{ѐ7ɃdڵDL#}Jc0t#2K$">җ@ozlֿȗpCƋ}mJVRD#]ۧBKoo[jh;qtp]{Tq%5]I6^~,d(I c/q9+ڠ)Ebp)yQWxӵk"0G!>A.!zQ\w"a\w.qLVy]\]څ2K dJ/tK:_߂4 !?G: Nbeˢ1Byg7+[||)`/d{~ WE*X-r4UhD9-M<LENy/Q*ґ"k 7w|Sy@OkA_d%g~N[Q_䳆%6I%Q.c3[ 9/rKY"{z9EtVyt 0dVp#9:?Q l##2/]k:uiUkCGŔn>BzJG" k$mD% *^ I/GV*tȎExysz>"O'#O=:{RH7}\xhJ9o\oZ|­9fXl|ˉ\sc"Yd.?^ MBn9G_3Н;%;[E=k:9I2aqpbqT_ ݄ >CȴgE+\彰GR8hŠ%C|8/rm6hrڼ˱FN蜟hK tik[b/λ|F#ZNAhk[ xf.*|:L+e2E9+8MD^3]~:rn:aAcdu%=:QezC<+.1oS-@OҿO3#TEΙ nBBv=ѶѨYg4h\ru,tyW:6_ e ء!s 49yA>qq?VOW{8JTr%F 0ޠiwb{x%^9edr2sH[d53䜧ۀNrzhEԧx|ߛGU`+D~PYuo{.ѧc,H^`\V9s\]+%6v[vee*'v닔آt i.a3GϚ(vDEj_ZDF!-EK{Q.AemBɕX4]32҉|tTluq- h'ѥҁ}8]z+c_H]:GZЕQ}Wޑ3 ZխZ|]R;n#+FU]{TM{fu[.-NAg.N.]N"]v >#_tQ*!isbWa讋/+ѝY~& .#gx\ h"UwEy:t/׼\Ƚ CEn }0l|(KA]u_n 0F -] jŖ-*rE12@-6-Z"YB#k ܜDIf7Tɗnu4,\0~@Bvm 9w=:y!r/.y xMߣ#;ϋkzyFuxoӭoO7@ rTK|DZ9֍C N^?Ŏ9jiyvL@]wI ^cc|/qC j7xp25h8^|-I[(ԯ׆@~ \tPv28tsJp~O[EO7z A|Ϫ,ɗ =l"x,_Xl[7mrO W}(žt'W//BK/BX^ݮaQ.6h Duf zv@rZ&µ ψX;сw-Gd5g{,~9e Y:5nrݣMv"/9~"e [:DKKfm N䚗Ib)zIuiWSS-3]GfAmsK%y39'm0[:xQq};>$:d" 9?b?ȷ)&'rIA|U_aмdnr![`?+ .ODhEwaՉ#ȋktBBn@yTf[sp9]$f"Op.G  @8<1$F_ՊAo&.檶G8zf4nV>kpG3 䜲DЯLtރ";# F\J݅=_3ZY VƁ|Wt"6/w[6E܅Rj ]xxTkd2VN,* Z>>Wy__Vy6~ނV &ӝl v#_$jW=0ETIƭɁ|tAtzV6g:g`,u!\s!_wE\˅|\oڏrAC~˛z ?]-ݲ.k%*-|hzBhVh螲8rD70*85:s4^z#E'l}xM3 tX}cj+c :o顂r_ҤCWvylJ1]>7dEGN."l#2:Qg\|@$.N+*iŞwqH|!M\F"moKb3UNS]n=Gkb]K>3mY$*>SyA=Rzk h[A(/eQ' }Fd{:_V]<sŮH'h998iGtE8bags)i\~[I׈eG5~e ;K{#窮e7-:Qvt@^ }+SDbGq[[$ЏЉ%Z7?Q:נ>΄L; xs[BIG;rHtA_ FwUu=" eMQx`&Zxva3vWD_WT΅-wysRxPis43.eV{]B y4\_|4zME:@< ]n9b$.ohKz]U|xk'/@aJE]蔻F= ҙՁc5?U6lbyF+gY?{Bwd%а.?qZ 5;N=DҴ h#|I])!jkWun˜7qf+/ǩ%hYDS^rg>l5SZ!gJF<==[?B9I< 1:!q_ۚn+=EE"~W@WߺZE6u̹.x*-YuxݦD4G'xK.~ԠCe|m0>xߣ+HjF=fmރF+teدrbm ɟ蟜>>\ Ԛ oe9k{sY3[{#?Lvs/8s;tc:/:PhM$յ2̝łX;;7MݼS[x|ytN=/MQGͮsTotmC_/hJ/tX|a]p;[$^ftr1-8S;/:}$~"M;;aCtgm#-ZW9YW +tDQ9ҲQtN F96R "'߾C8Fu2zuO5km^bLEp8we1ސuK;:2/0?B=;.D"-:r2'}g.qG~Ɠ2re&'LsgXGN[ܬ7༙d@_rݢр. ށEЛtDG]QriZ.\v[5h]v0/дݹDwγF`vӆn jn-ޱ!Z7`נksё2բ\]4q9SzϹ@oѵХ%# z;n+-Fs |aK?t lHk5hMU;t?!Q i.ɥ@N)뤱jttЙWWk(*ա Rv{[ؼKT|7-F+E~}xK::TT Vb7讇\.\.W18rB9ߑkF4෈dпŐGt|d{`d\}&F+ӏRA:ܾ̂huKEDMH's ssACq%E!uu|%y:" zS 35: ߠizu| }C.zq4'q`nm 2rvy] -ޑ] i_hs`貲_ HW tE8ջ0pu0tz8z0h./Oe>lgt}N=Rf]n."y`+q(r=]jv%ꌭ*Bj :/rG[zFz:.>l^K4t+t[&k٥%MWލ"v@o!'znY!t]+F>|TE񉦶0t?r@ĨU LΓK/ts4gI.E='o۾oZ5ۨ_/C6B !#'f lB򤢧̗?%uU7 LuntO$Er o^tr"8>zn]^}ݣQMDn_Le@O$3nedWH[R1@^ꂣ߅:`:\?):A+^qf )bv1Ɓ\vzKux=ޡs1冼>I xW #3:n-Eo.zCN{kÐd@^t}r! Md uGDȟw'|VwZ&nΣ=EO>R*Aq]3膺ًFg蔝d3#V,w_Y,|Q)|uC K{+;3ǘ -.䄻 Ƨn6ꗘ\K6eS+~~D %|^zN*vɛP;$J{?_4YylK`o;<3SX.y'3b6 ^7v%_͍b:~znԱo5LjV~uT~#~F qom- nyFjUdDB86rS@S.}-?霸S܄f '7-V\z|)= 1E@OY>6ь/V\CϵOfoƗ%i[qpҫЧ}=XuܺjїЈk//Bj^$ ]J_:+tnu k^S>byp DBͨ`lcǖ[{Axlӛ$ f٠]g(32{.Jo`4>_"to Te㢿_׮/4ξ ZۃxA?p5N_?Z^[&.6MKi]CeX_fpeoD% m,p\̰y?|Y+١u!&(zLBzq ekˆv "Jt9@6̠;32ڂ?L^:rm7u' ?Y&9 ,cu{C~*9qF_o]+4zM#X?#::OS]*&,J {h] /g"̮݀lNZ6:7*׹KGF!t[yG>Cy. crۭ!ʰѯ9tвk(h!'ʛ~tIKow06O6~)m_gjD҅=:N+mv4rD#%}v _D{!зГC2.{Dz]"S}NM:rEW>'Udo!"=}ذ/r=gE T݂5ef ]8?Riy"͓b/cf l4ᅡﰈF;4J#%Aɲs$Z.4EOw<ͳGSheLȏ Q)tQzzfBL#R.\a1yFJ.Ga?kGutj.)XiYzj..rMA^&T!}q$mJvb''$͸:{XW-Z1t«eny.-IOfOrRuzBO (4#Y6Qb<͞iLRbGTt30V\#ΑЉ,F%{NcnK.QGى1m=sis0oqiMd@|x~qڐqB AȾXo)Y>i1@/t?ɼC=oM9{4{@tQS=_ЂsWo-}=tdܰ):IUW Zٛ=,XkǾAn{DjCP{:!|F>㟐s¸r iXodŵ=>* ,Fc|߃Co% |>,2%us(568>_IY O\m][whi%[ >YseDE߷V 7m3#TڿiW!\) o*pVyW{|E삝;jثct#&׸xpCO$f iS!1[k-kҡS遝 f/D8[3eK07lv0'v;cD/>rYY6iM]rv'63'Я`9WVtaz8L]I߫iss[ʰe8~$tA #Wy}ޠ뇣)` ' s<`d>r"R Yڑl$~y~I( *6w;Z nl9燸L譇"S%}C~)C/^e^F-C3?P$)W@wW7$i֟'_cn:Rg46szL2? ֝2tXivR6v3]i1i,K`b, Tz68s<c7{BOA NW]fTXB4{bБ 9St}YQO%mn6_ɈsO5艵>>RbPMV2e]m޴;eC"J.Qp@=l + +wt׵j:RCLlZISYXʰЫzG)N/N$ȯ +; WJξ"kcu.azQxBO~h>3u^{[)X!8[64BHˇj(F0vZ2-R=\_bLN!{#dogz&AmM_虃qn> Eu,mo=]o싧"SD/Od5ddG@o}sf375vMc%*k:sΛ$deްgZp);&${~pE4.R 6=|ACETxS3@_Hڷ _;,u<[A=+=yh6*Tpvi'oHwx|W.Zm,^.R@Siu݀OLБXf;#s*vJ3i+B{T]]G8h fXSSh 2;9V7.X׸{{6԰rd A+,JKUANdȸد]_p+mWjІ$CjF/s Y z;sb)pnhoȻS:ZFG/{x~a =`xpk!~Ak݂mBh HݰYu1Bgן)9u 7üvFh&RQaLeKIjY/}]C\\ ]Y%#/s=U"kAp F f7W6 Ty{ʇq\3N^ dRLB3.A2Szܗǎ5*YN +AkSi= _Dxt*u7biwJɜh Ȼ!0q|L$!,zg’)X'Ι'ަ-'Y.9wL fj R_1!!v@5߼ANouoڣq71w9XCAz cb$V45Ō-ח'3 v87ֈݢV=)K\tBߟyt-at30l!zwW9%Tv~tdSl&o;g-g82n͞{l()|K#-C+_B6 _im.{Z*{ib'<C+Ɨizcm>DÍ. pՋ1شBwWo^Yo$}8BJ,;t;dƋs}@-y+=܄![,IOTziؓS{x{tʝo[ebZOU{}i'tjtd=^c[GLޡ8]ZYwhC|`ㄮכޠ׽!;Zfe&=vbtliCϽ;Lc*r®vI_A+Β?_%|Q3/UOH|;6]N L,?TOS-O_ `+ҵhEՓZƵ5;=;T偾&/C)P ǣyt Y.'PTy $z̲IC|'zLO321|GUO =*>[d,gfX:<7\_SJ!+4R^#ګNAF//5_A]*./_)ڑO~ 6~C(ηA /S"vsy[`Kd!VO7Y\A_xC_:ήVL euR]\w'/+Yy[ݰ8pd}_8^>Z[p%e81뫼\V 28T~cqd#>l}>oXg1+ ?˖c^^_g싳.}ߩh^R/g!E.5:W{Qr+[*?~"t$yhŎ2"űo5~-`ӝ}g0OA?T |'v{ ?EptWnXl߀ }O2V'zٷdЎ#]qyGRz4g7r1cxzϖ؈)9f8^9=[8s@d'ׯ%qe)ҼUGV3_$)։`SNoy\;AI~{ҧd3fO13Է6vYGX=z5d~c}&5hq 4曕yݸ쬩 FZ@_? ynZrN'?LJ;Ot B"rY'w O B `י_BDđN_`\!%f .zj/[N='o-xJ!wIuƁ6m]b~A~^fR?L\AOu˟.xFk?^OIgl]ꁎ_mXe: ~Ϊؐ]go[dhЎ#8I+D֜M]{T8!z3%.T||r-oJf@kG_o"?Tg8m.'tRۀfd5fXǖ0~E16)L1iKAFD:l(4Iy1}.tMEo .1jT~멚?wxJRlM9_M* h:/Aw8_ڻۇ@#7+M,ᶩ[uUX^#B8QC]5.Q_>ً=l>TK=4 b yoT7z}1E?V+7kT^fKpM,+H]zgIq)2RSmO# ~ =i#/}K/sþGGt/ɰ*uVm%>kۇyԃWi zW8wttѢ(aa4_=ueOCBfŁ5kЃLL?~24:K}iM{'ȱ~%i昊䁽o6SK`6Yb疦O_}G!Ua ڰyvzpQ{[InW7l2l6H!畔m>>τ^9 N<=C B_o&BLfAӚ\9 =cf`ޯˊ*r!N8ZRwJ(cS+/蓓')om9:E7w+^O *YXIJzYTUZlhq!0cNޞ{E9s4.Ԗ6s[-ϲPrY?+>R^7<1&q *rO:Pق\^l~s}2eI%O𥳐+_=dJ'8jz.taQ.&7%VW #T^cN:48fp̈́H`<ǧ yN/3-%&F _2>hr@xL#~z[ԍze"lf7FupznssVЂ_=R=_8G%ɧ/YOyFx6z %ô6-}B~ 6ex@ d}#pw:(Q9g`4^U}0z!QQn!h Χq))xԐN ׵6\7ZcJ/v#-ivf)WSf̩-t}/i]t^5 ҷ_לNeԇ9MNl/?j'k.א\]# z0O1\sAt&wkQJy; :*TgD;a! x,i;-T3J^R H-] jЋDvZ>hE"6L6%O73rti("o sKLe$?,|~[Wz?[R`t_>>+Ff }~_ri{a聀|Dh=L\y%\cXZ+RRnw$/b yZav|ښ;CycZȧonh6ڜJF/u@afrYh3聽ŭ7F>V˻;"t]tL7BC/itJ!:>S4}`Xk6j|E:DW>loOG3#R>r:iG${thy,3j\v_̣6/Ka@VO"L5z ́;Lͯ5?(1PN2Nf h=7Bﳊbz@/SݟcY6g 2x("CB\ʮD/='rTz4/]jn WW>/SSȞ]u_MS1ZF/X' ċNP :[YOa/`hI^L2_/{!.*t8s34;t% w)׷Dđ| Ij-1ez"'m~-4dKӇp6ȳwG65oY҃ ʣep"wzXnN _z--޽C]bkY2QOiz$4R`ٜYn5+h 5g0!aRmԑ;I~^:8Oe gtL_(F=hRL:6g;o^R#]tU%|{zTl`?_ TuV>]|~֧ z)ydӀiVbp,ΌI[=uăԬ.)Ґ(K>ӀV'Y \iCtWUS̫5:ޛ^>Fg=[3 td>!^tt"s{x;4v:ty% [Vo,RhEb|2WJԳsq^*]D %u .| Y؍! u%_-CZDߕפO };rEDWnis-c?uTY[-fc}r)BNбF|BWt@CLFo"X-{I 9vˬrNwRO&L >7co29c= q~Bczt5ݳE.1sLE^KY~fB]ɿ6tĮ 1ɺw-3$ Ɨ+b_w7q3X>_ &~巨 ^܆#xIۋ;Y3^<-30ɋHd mZI|z#vMr.6% " ʨb 9lSbMpz=thMuyjISqFVzOVv'䪄^}!O5M"561O:3/en)B*.Xqy?Ms?=gZSʙ,c'lP׷w%sG>"e{*ÛP~z-}@{^|>%܏՜ڳKn5gjзft uBJ*#5Z77 ݵq&Ήs5Ny4g;x̤12'XA{U@2/0P'@Nyb5E!-~ [> %ԵlĮ,}G^ޡk̠>Y /Eu ȿjB=S{ɧU-qZ]Q?5U^g2ˤL)Ha/ְ%!r2^3:6nWޡɂ.uZ=൒,a%.̀6K0u׳0^|MWG>\<7%"ԠwH[Ѻ&ʀKIPh!A9HrM:Im'vzjHRݲKBgpD?Bn}1UPYe?m4 q~6:F |ȵisЍ uH@vhs\" |׈I/rD')~y:xagݦGNmSD6\:y tΨ,m8Km.`}9Tp%4\WOfko!G,TzxKikA+6mw# Z!T!,=m8j,qڜc2|Mw3Т@#P tO2*m@%h:9tzNh=pM䳌Djt+v~˅5ykr"wQ;мB;C'XΰXB-oi;0P:Vv֤?ҠwF-\ێ.rCT\+i"t"N[W<#/;W(.p_m Y?|%5!czyJ崙@*ED [+t(!nBz?sLAg04 g0uTߪDt)zdN!:.HzGU%A;RzE& z֡F3,"O1]ȞA۞hWY 'Lav+!D$r M 8B yhz9,ŐrD^W)>j&;rz[p,mDAK*Xp" h'7+,R! Ev ;K3Vn}<#:X/.4l19EDrh;-/|A-"nJ@Bm'2 zG~Q/C)eX,\qv^NAЮv^Ş-x"'*zГE'[u#hkgl&f₼Ud)WF.=O+m;reh-6q TV9ɉŮB \DZ'R ͳ 47zy !H5gN Z zqԐ{TVL Zya>=԰fQ^.kK+r `D>S 3"͙ lq[xtEхO|HbG~HǨ$[ѭ"7Oψ.15a_8v.3ׇѯbqH\w! ]txRE$4*; =yܫrgyK]*ra؋*9W;+:N-@nټ}edDZ+ѮD~nGbK#t-'\i,Seshl}[ga;ziMNOr|Eb=px"WF#5@tMRe3:Ywz3^X'|z1lnO5t;]ː(az~e: {_ wUp~GSF{h! Orvi;h~zT^ cy}wU \ڞ1t. \'Ou؀XNPC:T{q'$&A~#d/-$ҡzɐsp"`~^W[[P\<"j+4zA 6V=*-e`'Ț[~q} K| ".}q }ݔW]ZVMe?^K0_o.Bsާ=NЀ <׸AH[{OI% gk/]WEt=$,`x`Mjȣt_ÄVf_ % r\{󙽇Ӱc|y.FHE#y-F{/WtwUEK^^7alDuu݂|4xs8{6k; 㷅Mh'M6 Zlrx[pM:!Vio~vN<^Kchu鮣)M5;< 6r_#%@w ]Wf$ܠXg@vr;ߠ(\eFh9^*N%Nwfڠ%,%4*X= 4cWHF[#+vKZBwLj,F=YW/9zX1|'tT]/WiTu1Rm4d"aBu o5:/zoE?ÄLqͪAPrgJsw/96z=ۇ4a}Ղtl _3&00tΉzX39at쉝- *s z]sdIE.Q^i1}ܱbıi|iFFWhZxīCF|t)@ޕ--|{c.%pњQrFD:wYWr o=^yRhՖ~E~I8"r"o;rz,֐uLxwcnn:ֶ5nCϻr {eNKU9*R4~_V55gȋ <[\m]geGt*!^A8|@3v7 z ")mGZȇk$k-NGorY镐m=ݻ[,_h{BH-ۋɋى\w3 45=h̴/!#_^\?:moYEytAJ.]pNֻp۴zoANtzC. ӰoIG;`rՎ1";e"[ݩ;%B,zh뺤-E+i).5=G\xI5cޟ<7bS䭑^6A4/nzCֆ+[tatЙ_inqT.;rtz=I|:zv^FAW+efɮ;_ `Iܐs Ft@3!) F349`68S]>UT~[t^ft)Ї§؞XttdHf/-~W_uf.X2;j~'A|ZȹBxYmuGk؇#cktqGIkޕK yXnrBOZ}6 4 q0sٕgȽ0E{Ɗ.C)m45KRHϪ.Sơ)f⋜^WXiչG~6whGWrȧ׀kiy7(E}eh 4A0"ݥ^ |6+ڜ7"yHBH$CDG&8ܳޢŰKlk~(-dz|Ѥ{3]$%#c_\~ pGN*_qKwt1jz"MB:5"~z9񍖠M^Um }`_2&tߎ#M{dU?Qr;tޢΥA7G+0mB1tLSYq ]T"0^v]rͺۺE"BCwZQG>FJՐ֏tB:iU0MwV[[ۗF&w$[ HghyEH_VngZe@N}C>"R76w  ϤgyחX/e.ޑ۾٭RF5|]w'r/0#'KU3bq8m=.r'|QUG[4^nF!o AI/\ S,E(KW*y бu2hȯ@/YEJnwt~7* mdﻇ";QLOW]KEާe>ؙz+ShWOgu#+/TE{> [f۬Sj eD<]DBGy bt+?x[.7öy- yrTά/;#ԼuA'MV?/٫L%m0 xpM:^?b}Aϧ]$ؗjmn۵Ǹ[,/'~؛艬>nfmӖяK(d/5g:ܡ!b|J7w$i}\ o|)e,CG7zh7[)jܮ{C=Ǐ0*+If+}bznWӏY\U^mbЌT4-Z}Cfj;I>'__+x;4+[{ϳqkД3=~00W~ϓ2#@רonoѦgFU"/b'@#?٘h' ĭ' OY ۈj݈*6'#~& q 5D'!(3[po z+=l?1 hF pUgviAV>S인f;AoQY58tUʂo4;wtb?zgT_bz.^F؋eV?w̐SK&O\8 Kd:ތ[*R4cA^^u:\7y3/ MԤHB:Pc }9%EXmΙ#wsw+a#u|-)87آ,yV&ᾪ9~x+CBBXoT5$kq}I cVòm}fjȱnPr'a&߱6}Gӡֹ|?4Z䉾ڨAԻ3^2u%lYv_[goqWjO{3)ch>h׶YTȻ7^ j*|\VTAgR"#[`U'xn3 IJ7lWKD =r-w5/=X4P6 > 3h] kA^"'LfZ* }d+4y'~syc+3ר6 UsUZfYXZ/x:7ђD ]w_AlUvC.ѬvRM}Þebl_St"!@~ɏ}xC_䗢|(+ hoStgr?A^ vnqqV==uƸ@Ekw FS7EuQr57Q@+닼2 Tr.f9%m9:z^Tk#eU܀=FE^ )Wie'"A9-^Mw/n^lj|z(>PFNesөR xB_Q} 0Vu =\}.+.rb:Q\xⅽE=# 4`Z靐= 4͑z5m"e^iзZNxyTt nWoZyIɂ\O/sO$yo X$T7Լ6rg/MqRw'vdEK@(/e%J_ 30W9r;S\$|fYOWNB3{q,\O_v7\)MIt]p][~_D͠;:ƁܐdD~z=_Cg{AXsy^*)(5OWOWϮK6K 9Fhگ('to3aˠht}H{֐i#hЊA'9BgXOja:v]cgl3zBVˡ_!R:CL&_N89Xj8%:G <@3 "Ell6ԨFL=Р]jȞ_'r^޵vK*c&ude}$" Wɜ7. xk'd?^[!/z@u9oP]V=QۋQSESZA R>> y 32--?/L[~\m`HtT7_ݗ5̈́IW_=ixWc9Fe-/7-GwN\6r=mnA)A^)]o`oHbQZgeN%E*}A<Ӆ׍I]zչy|AuNޟA7EO5xSA/IOosFglm.v mGcHt_&xq}Hf]"WȮ%<}g|ݐQ$^@aگRAOGR,`F~4F3F[:w=_.輋ҡө r7jfu RBe7$wbb 9o}B z\BYҿс-ziܥyXQr|E}=C%.t_<#=Rh`y*v0e6Ey3q"rfK\9!Oq vĕ=;~@;+] 7}ǗZ7ꁼ^'4"Z@M^8v; x gYXn7#LLоBε&WBnӭk_ b4|"/[k w<=H䢈sۺ/q&$;mNS,#;uuC>k9KtS8Q;r ;tgq]܁ͫ碙%6nur9q!NI:# 32O}$[?kQ%"oLܡR OCO6VWh@.ìC78 /oAoe>6t []~K}tzAD@n-qȉK*+Λg>c"׈K nȷ3`m0p0yٕ(3mq?ґF]7FLsC 5[._ ?>^YmN5x 9&] jЅEshлyjN:t ݋3^0uh>^s[m|)Gސkb@V@ 4u\wzzwwa`2Pt:L]K zBG%[E]b4$krQ t`Bw5죴[R )9zrs]\>۹6Y˚ݐ]=mnέv Fvt_UQnJTw%nӋ"{].^_ThGkU~tz4I"nܢ,"-BD||\.r0]t#Jy81+4]]77˯qL3J .Y_I#3MqnE]?ҧKߝ8]zE[͞  u2amQ0B ף$_Iխo1.4%/tȿ7Q{xC| P-zjT}HƁыS1A ;-.j: v@n\T:?'E]Hۀ>!WDߋ+,X+kiGtd\#7W;`"Yd|'Y:owGE#SyOHt`"s%LȦԆ7ZZ&Y}s5!/Jfe-CGFt #WIQv 1tޡG)ktzP-/2#6~=]iyȈ2z*~G"ٕzF}+{;nU ՝c{Bdqv 8iž(Rδx^48@ґ{^<[5`1#ܳ|coe;P2w҂>c9D,vxq7`ya -ˉ|#}Oƞtg e}5;|~b?4߻-o-nuߚް'Ն+)Q#Mܐ{ӴoQRuto1ɐ .GF)pY( Z$-(S#;.L{V4ks?0+wč@^yJ"eF. Ϛ/T2:bN!'QfTI{9]M#oF~ХŒcނ̑a煘c]z{vpJ90eLb/虭tf뜔St}#Ib7N%Fy쮄-!']DE_mUɯluVo p!~IL>C%Kѡ:sX)Sn3!=.5&u0{ѱ;&q Q9j䶽2b- wUbwhmC[o3vFjt =[r@3^סg%5VfU_5&D!=aК ET!XnY ά[fOň{/ bgح]LtKCιF>t-̓H(nm/kUV@cCQ 9l\௛vhU8o#VcB7*3 Xs\ ]Cߋa>voh$j?֬g(on^ <%-M<ÐrrJCr WOdhx_njhIRF_/wAOL|ǎe*GjI٠~( A;l2ۭ_c HqW Zq|8?DjSn -lL5T9V]{=v)KRKGSp_,7:a˲HES,&`/v%R7hX+GiWJ?ΔްUK[|ۻV!8kt?\R9,yPIT1K!Fo@o{[4#S| l5:c_>_GeGߤ,J\>e'J- G1o5}؇k#~Jf\Ԧs{4$'z" 0[փoY ~͓?q+뮧*5xwyȍAk'}*ɑ+Bނͯ>gK*c+E̟|D=(foY!B&ȓe?KQ_77G6O+f˗EIxmpp~/|oq&K{K0~)hz>$j^y˰I8WBîn ѧ9M|ZNYt>z76^`[u}/]ҸGGRkIF.y !?RB1){ٺ:of3bͤ9I?#%2/E,3`nЂsŋ_iɾ/ BwI'tR*穯HY>6-O.^A{ []R/ΣF1jFr Ej&r=+ͦjf^t_*rzO=Z3h!MN.,,NąN޶ghJ~>FTg@N^D@X7%:yi0:tWyve'l58>#\6Uu{(^eRr`[ 3tȑNzFv?3Z|^X~'%hūQD|qD׆+C3;+n NyV]^V?ҞM-LYN-#߆.a`.THO #l\ӵ̹0g8Jt6>vRĖ=x Ăʌ_QH2bn gߠTiA~7z1o=="]]Hd5kdCځ4Ȳ y8{` :e$3bfP[M}Ijyv@oAϜvX=xiWGghsvoFrBйra:+С& ^tjtt5,dOv5r`-7c|xZ9Ey}}2C 9:_ThIRShuciB-2 fCr6q[/DY(^B kWO_7)QL4Pݹi-2#+][y!"'Do4B<ϊr7h%^cF%"_.őY|ƁЭcW]-g}]Du394i7p裏J k7EcpL *~Kj ނ%~@nWhw/ru E./@Qe{;{i'{1ċh)r" 6^Ñ7V_NzW ud콖uu<ʌ*uz+,v@9Eb0Mrw`8≼Ev\BKG"ȗ?vGoX>8]|.C{JIqO|BpCx虺]yW>|{a4xit^4S&׻݀Q*DWVGmrEH=&Jvp*a{#t>S$ޗ|'ΕO:V@[<1L_~=1AHZz-Zq 5RQCg74y.dr ~D5Gv0MҺ04ˣz՛ȇNZk@>*YXMr R3Hmژ(7y]F1d;3 jnbr>F \9רbJ Υ}0Zh3S&s j&ՌSX;R7nNwSoxL5~%6`H.,]&wYQ֙tǫt~"?Y#dRk/==9vgеtJX¹$6MJ7>" @L?Gob+17:\<38K貨]#oIcV}-^Q֫aFo[+4Oz=Dh`gשx!LHC[D[e07t])9͵z"W3lq@LJ4h#R5=jgx\g4"$=kֱ]<B0Czk<7x^K;San^H9h]3B#'Wz#2{ƋŸ]ZWI¨ ^Jt >{A+Ԭ>oʹЛ޳`:bMЗE35z)aGuԈuF {I\"ZkRu/zCGdaw#ݕ.VђF3^gޮ]Ɔˁ\b~I@wugjIQ %t@p~#0F^r@|D΁\4/Yw_nM4nwkt=W@n =/F:2ȡ>M'NVg^Q_tֵ4;\r5UL乴Ql8אqJq9tz$^Rп3ҫ菔rn2D9&|cBNԛkDvOz 'M/N_^ܰu긜G̦*гδ\/"8z_$'Ztu0Ruߩdz230t{z kaO)hxfev)G@Ы}d7eMr`aEkh$o.ާx"g R_O! l-lWvCK6kr N ]c@W$"4kl v?ㅂqT z8N5ˊ^@F2tl:u ]&Ö=y ?GZC!W.hס眴(v[G쪦 4t3y{3CGZ(kK#=[nm3J '_/i$^V5[_#@ZT͍ž ٿ>!Xc4;^扜2W^|lɖ.̫:[ؑp)!`E M&*r@׸ޡSz(z;{Ty["wF&3gkDQC Эс\>tz,ƐϑF94̻:AJ Akx|kI-2J퀮 6x =&{+|ҎHzarGnLB>c`uP tB^vK:|@#Z'o8ۢݖN%P{,'vKs9ō^fr1MS7r hZ,RB7ٹiݲ4vDI<.yO 'n glїag&TloLi܍ʦt*CKWOmD :vЇ Ʈ/Aw>y7zIQ=gZ `PDvsV]|7Lk !kxV(M ^ (z@'rC;u$Yg]k nC.aB5m/5Ձ ,TSH azaqOV='Q=/"V7\EM OW&I^nK~zL b5o߾bR7}y`wZ9E_NЁN˼Z^.qAȇmI^7t@wxZ&yb-- Oe$:c'^;Q>tI 9^%]'Fn}s6jNUz@N%L1lfО;\_g^@]`h`q !됡F:o1Ibd]oxGS)u5ZBǡnҠ=ե֩4"o?GNsE z<+-3_UƁ>+|;J`”ALȿTA/-?r /Fɢ P/s7K;K31r+Ԙv5ʤqF5=t.WKzV]k{F \k9s0f}ԠS:Ql% 0׹KL,Ə-W/YcSD>6$[蹷;ߤ mMOSc'k_VȡIk| E#*.n'Ǩ\EEnn*/ּy $_BCFN;$ґ.>ÅbUaE+Įa//uZ ԿD?fȄiCVQ)l/=fW#@ QGpidkVE~Kuxy#j\gp`":7=k4_:CJw1GAIdf#olPSQ;t0<chKR{qoiGH̐t;kPk{6W2:C}#=BE~%z6P.OB{DkDe`/{:4 g/+>BSӈkbvz,M-t r5le@~/$<蜅`sh]?/3R<ˈFrpO]?nL{SKR1r=o3K/:Y#[~(.e@{z]]Ϗ}| kG7H'MK}Eofls>k09itմtotur Y[:@־Nft%yG[FN"X\X=$< 2 zKv˯CoF# Gjz/]JwX\'t WEթd}})1JbgC/ r8 X]X/[v{O/l^]7y|Ǐp* + pf[ kHe"'Q?)L/R;)1ܠqoVE?{OK=/U{ %ed#4qY. Xvj͐ЅpX%s̉,vLFVp ޛ֠dK;5F'oX zj6eN潃|Xɬ~tn~&* ^nⲜ#pjM;-F6Z Jٰ(HˏP.+͒7xgҳ{y]~-"Y<˖``qf#_٢`MYFߢi9ٚ<@6qӣ}rjYV|dBdMl'oѩOQvܸL,}t+w/v?~ݨ_@v(}7pX->^AlcM*Z-!NK#>A{)|~kp2-bv*+JE27S-q-O|}Oj~YhѓVD_Bok_Ñ.Л G@Sf>0\r9uCZl(:ELjr^rs>|~TI hy՝f67; M#Y=o-?Zw}!OMe+Imt*{|N}kZmK  4Txr\V\z:GEeS-uTOma?@vtm/cM v|C 7k7%7o}5vtċΜ Af( :с|&/ 126;\"MgGE>8]@FHD>QBkoG"uQЙ .TL|Bo8A7!m %Q[SC>Ftg~bX'[NuGF4y`F39=%5W{ oV(tӳ^NVݾIZ;43:Pd k=n1b'^U~Bi ݌ '{eQ?iWvYW *-=%i:յ-Йry/2Vd6Uaktk}y 5f VV)ZB)|E?|*Z(^ }i[}#m^ 4:DOt8C?$_`nםj~LKrav oAWh-Sݵi5Nr8abE9ڢp#QC~t˩*;I g.cn7p~"vͻE:s }%kaۉE'3߅-5uƹВK@.e}\dbtdk_g_tl0+nd[*rK;2zC} 쬥]?xiH>J 2SMHz6A5>vsK֠ čZ ixEO/E4oWV7.%F3`FGK]v 8ϜCR^V[t/4-"h^7Iec-Y2a@oWH*|BtuХׅ\;0Whv {a`͖'=rebOw37BJ_ aK{u3UDNqۥn1qBHȇnCRȂu$#ҮoZ \9-6rFF>3=f Kknql70=]-.=[lx7*׵(lM 7$1O4C]`#ɉbMﶵ )L+)yٺZ޻μHf+K"-6_di}Ceuzc6Yc'z|[^dTi׼٥#Hi)b?%U@ wnH#]@bߋi<ZZg߸[d\Bϫ)-h=*t@Z4>|QE8Ε ] =u{Hr>@\H}R*8[o@T-E|ȹŕh{;΅z))(|FgMa%uiN䶉y3Nu%Z.G;r(i9[T Mp"l['..tLћG2!w\z?]5)*C* #FˁnSVrq!DNFzU_¨R=GJO>սɉ0&(>HiuQ䚎{9\73+RV37:sHYsAκDK7uqis]^]Au4h~AK g$v%-[Ipows=s,Es:z_q /!3knϱ1nt2ZOy=v]kJZU/dؿM z6lv聽 rt?=gvR2Qoޠsx/ hrBQgȵھN;k4y#.zPI-}&ݯfΡ]Ѡ/:mjṃ<.}'om80_2N>pVÝX޶`w'9RG~SKPtG{-DvlȾܷ[u:c绳qCzFzc{1ط+`n*2{n'LAc~Qp`\D$UuKIޛ m=2ce[ ]q}н$qB%D[xz:ao-/v%Iz4KyA#C1Zg:hew?G ]nasDaG4(&о*pw1thr}J{`k'[Sv̘/Ssi ='wMi {+ʰ䱋k~fDe]2Z&F:Q.<2}d6j QwWm-[fthGQo/9!SO]UR*ru)G~8QGIv`X(>FbD@.B5?w7ۘ}r˂O7Gz#_| OXwvЙ> `'6Jĉk]mϡkEFNn:TYHt 밉yzžz=i]{;oYa6Ɓ6`n) K!oF i\";gᄼl#Ǚ{%\A =-$z|wB4Ha#]nxQ /W5oー7Ϭ3 N:{-!Hz)ޝ9#H[0tv0AVh"nKw9пO)О4~ PAvǾ{04h ^l0o&^_j >_$\KeV"i4CcTT-V`SuJo{t`E5| gX[ߨ6d佝[~ThEv]ɺsMc`,&ͷwR%;3/v)r'[6WI1CLjn ;u'cg ͮs.^= ızʾ[ԭ WJCT h@{Y/-'H--u9/l1ПC'Wwuڋuϴ[CnX?Ww-+a L8Ґ{Dg^F1ۥ6z!oU3 =bȟ(oReAnw-r̅V>'o{qW+t/On`ȟ( rI00BgNFЪL2W'Wj^Чn]BwQ#IomDR4@ V^LT坚cޱ'v~A.2?Ru/vy|ꂼH]C 2tY~[3ؠ}7^3uzkznzEXB+3ΗTS/3/ބ| K .ۈ \3>ƗuY}oiە]XK뱁xZiOiԐϼr=~kMHY-38qz-l&fuR+#{vuh{"g?O=S (z4tC{y.{K^;C'~}r( h:dH 0V7hck/؇]9~@.aݥ.[X{"ͫ{jvLEH]ï/O. v;kTbQ}B۷ޜ~ jTW5:(AF> rS/eh˫G +3/Z+䟕i֨Y=Y\ܾDlw]/ZcT>Ud ӛ%ꫜbۜ1P_/gO轁yFf). ]Tb~]N0uv`c7+o9zQ69کC! ;MsZ{$`HٷK ͑4VQ7n0p}V?ljYW1ȵG>O9&^G.'sVg=#4=j%fL!q:>;ku) O\cGxʥF.9| 睧 A.<%M||$bFA AE#-\.fhV-tZW3ev щ(Ffy^԰eN躝ȴb %+`\y]/e~B#* < ]zI=lcm)R̋d)Mdynk h~Y9 xcڜ!ۣ.:Hf|G9 }S-uG׽ ;J^4Y;DD, %ȇ@g^$UB/kdUK\i_6$nhN䶭6rb*]ge0h@w\؊6^bR/2BOi}0V\Gɉ}捑|Ul8rrȬ.tw$ۜ<+FOcLd3}D)0"?sT zw@oګP~Nt:G7,)F*AȨ؝^󁛪ޒkحv@]pB{|1-6􄞪z : K9m L:w N+4BGg.r~4- !PDα uP7he&'ɠyg_f5ͮ :x YHw/D6bU#c)tUvMSXBr3wga8|;$n=3_$yK"WՒdȽ49ZN6 =EX{aw 4#nթЛOkuw* =oGjceGd Oe${O"AC'vAЎ޶@^:-Ve)Uj :{v/Z76m2O, ^ Ry}vijN8ܥN;-\=KY*nI ~4 { Vh1^giYgC.<#zB)ۆ* <Wo=VȐ4;RDz7I !x.3J|Y{`w6n't*Tmf}Щ6,= ;bط :!IdsL{V-m@&u7Rmr3^b`~Q+^zHȩ3~/:t׎+%{䨌b[+D๼K̘Őcf&2vo].Bo ^d C,p : E D:SmZ;s`{mY}ަ L}͘Ouq֕W{A3[3SH䈉'L ۋ(.AГ/[g4-Vv.n1j~9I%7jCl#u~{/lP ^!d!膒(o_ұ2u56wq22f>r=w7?Atա'"Apq>ӝ=a|Bﱋ\zہ14AI05.󞆖(voCy;* ޜg"R >MD 6yuyM:77"_ t>6Z!c(?6wNj{¸I.skU9sDzꁞl3 {%q׫F|_j0$^7-|"9{_Cb} >E?xnA?ȼ&Ŋб:C`=K/fC]bW4,'g-?خE\N$xriЧŽyOezAKq@B?Y[:|tRYYc)31=* rl]#GkX@Oɝw5bJp>4l/ȌݽMb|"D [烛ݑȢ}K3,3vZ״OD Z&ޅX 7of!h?q{OcK2]zc^tbO2WKFWFyƠӼ]q=bwk9o-wIZ'֚ށ.&.t2)o%G#R)1O~@z}%sd@YVhʴ|7|,_z*y~+^cS ff"Im7ra 4Mv>o\ ZZƁ?Ӷ}4˱)2Jou?a;0cI)؆pbKFf…'zDInt;h/DbЁ}:&0t־ ZT%QNޯ6 Do6IWhJoKDg y¿#*a}DO>tנcmBJ;@I7}a +R74 *=Qh=ѳ? :As t_i}htO})8 a ~%|\B=sݻtl;l) 9t:=cۡGo?Лyܫ(2_gbmsM!3x3N,!9|u$3٫ nTM,3.vId> w܊ez mi[F%ѧLq9j%zOYZ_cl} ZkӗWeЩ:\E*N)B-')#GwKCRڜ14'X?ݵvL4Aw/oQwŶ#4meÂM]]>b'0tSP <de(܃"r8?;%zd@.2^^h/h]hah>,:uO.[%Sno=_2ܩ'>'T :IR=o5ёO{faR+Vl&z+)|%zLB4;זSKȝ|w;]]w[8D8:[j/O]ZZx@g K%}{JUS&i'v X339ߪFІ6 E-ׄ WKHSՐG!$%/`F]!G;{.4+; ];069$ h\O"ݍvBN)lg.?{_srb{Oئh|$a{R"t6^Q+y&ۍ>Kd:=ëg} 75':Y+tz-ݐ1y h+t]s D ݵ=2aN]k.OS66U))UESvlވ[/o5*}4y:Ǯv"3c_ǾMkvfX`oevb.n#Q^Xt`:I$qC3b[m91h;j}mmC"ɾڿ[$, $o <:<&k.tq't 'q#&tK5U NcoB?i=UJ ʚFZN g'(Qvyq\! V{4}{>MVA5j)r o 5y7tZo ժhq7 O-&LnkmFZ|SK4*򢼴vBPj``o!;#uy{6~w\u~ kvTMK+STM3tezbO"!ϸha'tXwsŊmwĤtC[0-x?|IjD~-ߙ ];x112Ny% Z5Id7cn@۩5*:}$2`bhJλ{"ϭ`3H@Kb3UETwxKc\,_Wݑdݏ 7gB1əagñ֭ ~WT쓯HJ1TM!4B$Qpß)r_75-/S]O=8ʊnLIeO-B|||{A{TzUH^cef&xtoIK2> Tɨ=݇ XO~.ľ }Ӡzɪ䘷̀gDy@OK& 6c :Q'C;O}_O\ nq^Y^]0Z'>vLLI>TzyGi]q]2^{NȎ]&{zd)yŰS-Q"7~:3 )挭9E38XccFэ|&KFKHO=)!>:NW j{ zL?KZ$ل3u[ˏ So=fCn%!vNz7dt_Ͼi>{dŞШ"FZ9_: u$+b3ff!4{@}^ 3`STw7hzSenm RޞK2#do%:sl0ov*uWJ/!TBsMзKɾe>xf>u7lPB_WXt N&]$J}ފKKMXα1&7-J}^BzdO-\-jbcL"ƍIx@wMȔt”3Ea++4-$oI؛Sڋ Ueu s2QODI)|nT=ߚVWںW&4wMOUKVjzt2G`؉>OS&'x/@:a1Nf>%:ZvSLN讓U1hrRvˇ[;JF^Th/!c :!E!|``UV@n>NS{n|.:gāY~#أ]b4o둛" r2 N|5 4WV(G=-^d:/cbX~^>&GֆtM!51Yo95 ;פ\ڡ4#}&ȧnw#/W 1&K/TC]oP7 @5l}sj`SR&azfC$:*ٝo^z[TZu"&%oV^R$<&C;dR׏fB|Z_j QYjC.Ledzjah: JP2| +L}AI{D>iySj{aCwZ{Bչ %*h_j OH2tw>}ق,=u)`-9fhe6h2}1~̙}C:9~A:ZFp傼qE<}-3ǿm>9OF^I[?OlEnh8_ oRKƺ_$h/kDUF2yO#QZ}ЧOwC@y@RGhj{KT:k>GvI5i:&?+} DB';M'G-T'tyzj>t}:iTG&סs4J;$λ}q}Sr eZ3hq[-:}zO{<}ЊBKcxYa伫fEAN=֪՝]àR J60;x'Bur{$X99SE!@ήxBUl9 ]7FCŝeMqE?PL_zX)0oqh5zUy"輰"wpNЋD{. ͟Iyuegޒ1輥I졵H^z 0Q=.=?~7n-.@/h@izudmq#罀?W36%Hu~Xg6<WT@h-C_3;FT9[hѬ;^Ka=m <}.扼F5!y:XBjr Ϫnq#Ҝ|K/ Ś3a@=K+5^=bn`8MgA/OQFDe]r1NqNح`?~ ]TC3ծ`^(GC$6s֠}[|[-߲~o6*7񉼅 򸫿ܢ-Lo蹑x}&5Et"E&y-KG0 G ic.;\ա.I;R/9hlc";=?R/UEKd]ڠ."M֙oCұ0u+8B*zC%۠^u:Y/#VԜHR3?˗T}rWc1Jeț񃼅Ⱥx[D&f.t\Z~U)S*}[> A+x^D^ A;ɒ$'=g4'v 3AkIzʎ}7rM'r% ns3I1tOxI83끜C+] A2)f}/ WK]soa:a;ר\:pCqvj3Hv-u˺NSFUY5?JN Įr =y ]PJ <_=v#OrM;>ryz翑;F#]HAKb`f#'BMTx nAǑihW'ws{乳ǦxCzz݊o@nqxΐoV@~Gwc;gq6rˈC E>>[.H,wQ/Qy;BJ -!+:zI:'!{Eĭ8[\:rCwVt@o1/4ѸDˮ.,J:%=֙wv@f9ی]#~H{+qo֒E@($NO~)Q_(yHxJ]` 騌^K?/60F-^vsK# YcQ"E-XxMqPRzgD m٬yvuz sYLCw,vV} }H鵎a8 9zM]5,W ,?[;:utjnY{.R:kV7^o+R;m.s_ zzqu4t:rrK μofwELP: voBVmdft؄W'tr=ٽ_ *:DNaWضLxfW:0Ƚ'EKjЪZnhK47}ռhz]Fˢ! -Vp1i{V &'j ԨhԙݓN=*sz^FE+X3;Oܷ$wh#J*@Rut~K<::/} zQm .Qt7 њ:&ۙP'Net)]7tݤAS9\׋N';EwO#/G|J% bJYjW Fp!8&u7lbT\䶕\$ g6ӗyM/jGQ|:S&e7H} 1Yq7nB/}@Jᷭ<v:c8׍~4hiO #UW B)7:t=hI>voL(Z?1OEj3En*g'GyҡF?^B[ zEʯ_: 9_ֿ>]5[{c׭ #_ǹ.y6hv,D!WзO >n{d  $wVh˳#T:47z݌ӔFEohs;g g9΅erk 7^bQ| W$2|hKޣL%"n,/uB7oKi;gMeCA`58)r~uy˹V2_ı ^HO ܬeIT=&M+oM 5ffG-K}*jz_sX6v!:alG)?p ӎN9}] ֠}TƾpyG_)˩ =!-?)Q@- >'k9Ķ7rAW9=Xd NѰF\У7|WuTd No3t)~o[S㋭QO"7lGȿҳհulUeK2A3g~3~N%H7zIЊտdWVvƟ5a䤞Tec|/*tJhM/qN^g6A3W^_7a.riZrjM]= ao/1 rz0ZnshikhJ2hI+־ !wl,0W_j=]ІՍ䅝JLex%%P=}SpŶ SioAO.,\^~ؚ~\g="+t0[؛ZBO.m;ϵ) :[膟|J:m#G}c-ުaJjdLV}W*zk&{a [:oNB9Kc[bO6k}QiG;$]Y~q b׸"ՙg>Wx02!}7BT{jA? %[G"<)EUb]`^~П]mkޕ(IRͲb3X_ r%^kyw66AMjTD6^V,sV/;ǏnYy3 ;+{eV&k؃|F-?s[~w% YVFm_t7{pQ_#UFpf6bx(󮇖UZ|+po.$z׺ѷ* D[~/%, [Яodqn ȅ?.S MKEҹ%Bno^#F4˂mvV|gOFKDgاsS_=3[[]c.5:Sձ/QweIv B)؄tE2ϖ}|L峇i^&N|6m =/˷ EKSn>uzq2E) :DOT W7𲎂J6Q r]*_n#Co6gjil{:P8xwd7WOЇc(^s )27z{ki3>lE-C{xsK:AScaܪ}@!SkO$b0^ZG67xkc*C-9I$8ayq2IxP'Y*KXz=*(|SݧpwnhoK]{Efw7 ^$zPrGTjݯy@ % -%Ix}Kf];[Y; rhT.`+l/"s.|; gL6k|v4߳qMj;x<[px>ȟ,\ѷ͎,+t<;?X=GS @C*7pߥu|z8?U;aw /{0l]7zYJC}پ_'mڞD1tnoTb`#Kiu[U[w`n> K.Zn(|[}Bwhx p\B^[x;(z86\Dm>H?.ـ?7A[ӗCBh zsGPjLI/fxerVKg>ttO>'C{{J4.:t k(%?ȹQvݷ\ xIY)sz`ׂdo4uaW297p73TȟloY֎ˇshSWf%"S"9Gf\jNHboԿ`V7v?z)9\C6OA/qpy]@xt!'dmʝ#-%(躚5&k|T%gbtXzr}&U_ϱ>g ՠce7AX%' 96NѱXAԌ#o|n4bOx^tpmz?Z4Bv ?tRL7z%Zӕ>_RV5ߩSzse^Js>N.Bݪ1T3d-{Kt@Tdz&\?oqh瑏ɀK۾dpGBš[ 4%ͼҿr8%Eo_L3ؿз:"!o >GЙG ޵ ,9bko5Jq7zv}E\&?2\$_3mt}d=NWTnnt)tnbJ5E" |i{Cdom/ђÆ@yN5I 9EЛ"j `| X^׺lqhyfn[C 2)l8&h晧۷N`7dbO?JdNِK*I=!vUR 5xo/K@y!dO۾׈731&oZCpT=(MO7z[~ #7~+7ne|%zVµϢDVπc;r){t*q8Nr.'{sj%,#>nJo?uVgTA39_dYN3lԠsz>YX8_tXn3^8BI?r!Q\>'/K.}ALϰ[nX&2_ zV~80@nlA* \cAPյz?,E*aEL{i\ KwB"DTSx= ǹZ~{/Tȴ!"`j*em ^Ke߼# ~7=ϳCGKfcٿLqss .L-xSzx_,ux#5F}$T;ut9Q>YrnƝ>-ޱL~|%Ÿ*+o$=S?=Gf=\ ;7'}eqj/-^o-*UN= Ou`>}^#C(=̒mNજk~>Pg^ܦ=.z%{oK7 G`TdAk9.zIx`f~lBȦw0_!"7ڊ /a\r*{ @KM* Яl 8c%5zd5'~>܆WۯtN7~ U%|S7 @eXٓ|sߎVyQߖS`R/&}A^{& 4}tiȄ-:g~ܼ&2Q虠~ A6צB 2ϙGI╢ڠ:$T$r!r|u@u>Bkq_׳:š~Y~:X'K'[Au3L> pv}a};z^C+rn>MOaɗ#^\>Z{$<s5ZhxA k/iVuy6I}hU$W\45fG3֏l}.xH,rx&N>_#\9:ǂg kntpd8GM8O oqUp}yu伾t~)q[@% ]oOax[xd'x3x`C9lW tj.~4Z85zv5ѰO y$Y'<ѺtG#jVh8Cj*?зڔۍI?y½Ÿ;Lz~d** ߷8_r9TO-ߎt9ĵ=}_ɰ:8/ߑhMl)#TAg)J#MþN6MT _YVuG/WEXK*&aǓ8]&>b|T# [DO}j(żAF.C=zJUz@s,;%>IO=hWdVdܑuq6AZeu=[ٍ>WItЯر5DikROKg pPųp̝q+hlހO~f?dޖy#u "yY,fΗx|>卼͇ ǖ Q|tyhSݐSUl ly a5(ImCeDnZk/ 7*01ڬBJUh!-5lMF,!Cs__ADoΜ7uG~ @Ļ+Ew;ʣh 2A[ y[QD#Z;t} #.qT\-A'#_6}JJ/VKˍvd"zڙU_HȪ/m]"9d|!(FA=鹸Fw ,1.6'AyՅhEƞ }kjgd!zhw]p4~.٪;Cc4@QK;5FhCI"_ju֖E)/gGۼٮL> nN=4 jw..ߤxǭ19y3sV'huQ{98hܡ "90ꏢ"'ʩii3b_,#a윑F@/Ѳt橮3SoJ Fynң%gF?2@7䗞̮4nPiGQL"g]Dn8RO0ۆ|̼T/וB$ܥDpahT"G Nڏ u.HbxzTZYj;K t+UX5#`֊'mnˣx?FTf#@WtlA׀ni"ϋ+*x*8 gRY7uH}|QG^k7zr~ICcT_VrVFet Ȕs.#JqZV$rڰ풘yszHtYbKmCWz3%hn$ɒT^, M!==XƓT{Kz93ڑ$@'Z.h.Qu*nV"kFd\72gcH|v І\WCZ:tCiG>EBӍycB+qdWn:/}:diYgޮV:zr1_&jІ kOCHpHzHď2]uiWgdCsrFα67&{L7#&شv/sԥε5`=w0D%e;4h܋%ZS$,S#Fx_FО;zvx/P9zAn^էZS V:u{P4G5GpeR/5ڠU^3K,Л=1u~ ͏֜oqv\UQH=…b*V s=7^K0 aթ=A, ̤jUEŰ{x"grNw5ݹ{!>ާbi.S?Fۡ\Pl4MW+ktqϜN z=86p76=tr4HK,𫝫 =t/3W{{E:|=(MvѬ*.TOz>r;z0l .ozVq7s'-(#v(iKD#G {pFᓗ |rnS靦u'r!J :U9Ze*nY!'/z;t˔s䌱Ɏ"#e\Ӣ+;Cvy݊mŘdlQ*S.Q2tt)7co_hx#0FǥbSFx{Օdv–<{4mj[{A.m'>2u6$ܗvQ"մL ,h!1٠ה 4 Y]*=ƋFygκcdFoLT⥄ոϤz+FJ&th(1" ^k]Ӫ6j&0RGagtWِL툔"ͽomwxF] iuvh|(y_)A{nӳ S&uOS$Ay4FFs}20:9wh`2o 8>LHS AOo- ^Ɗ]RK2wnuyJJ!LeN>C} J)A3q.3/!'_qZ.۷ddE:6}e>n}z+4%FCPGmphx~lHe NFrQXCSwHH6K rC/5P=e\3.$MiC.kRy 5tJJTRMٜx\fgY={vg | 7d)ͺ65 vT9GKݰ t@ ̴#庐pOVZuCna_MҠjFiqLo\oly8rZ&vX y7䴘r;#p9ӪJ]3 N˔F^kR^^Wї7"3N3JRN57iȡ.ΟxY6>FCpv0Fs*LaZGzzʸջm\"dг%:C_hRe-1P.iыnS *Yk/sUۂu~mhG!SPog#}u CL\ZpPy6Чq"+cWuz7c2l讑frCvO~bwy ւ"rY 2h)Fޢ 0t^"h6zGnB/FʺQD+6;KxG]#$so)SF=F</a[;FV~FN_@_d3/p=:;z_҆\yX4Mrf=~Z\jXsUΎㆾ.G 2ˮ২TN3MYMqW䳷L^!Q> {9gؿ__:@qLmq4Z+g8CU Ljo Wȟ;eIġB'i?BD{DuAH}oޟl3ǖR_ӎ" ͠oG`s@\"3!?-;3oO!4zd8IԯsKGu vupGNut۳qz7B$thB?.ZmݐWzP r }9Ћ#Ǟk>|,Г))"~)kV<6]fHtyGalFT#n@y~ z7_9=HnC#"=g;_4rizm_3Qܒ]/ON~TRE&1" ѬzXc䰉v_,aC׵[&7d|N䖾|\8.Q(E=;! M~2o8@{E^NIҐ▴3 .znϬ"3C{J$ɯ{tJ\BF M3w.FcAn~Z8y>lcᙗt︿ؤO2+?RuٽUp+{wHļv⍵Z֠@_"y,_8[U}H$]e#sUdQMɸ2r37vUJ!=hj1uFI># ;L+_^M {5`MixԒmOZ-0^ʉKs}, ߬ @ONle8ǙDb";Jio | ]svGkΊ}ʔ\Ǎ5y$W@;#PʾS* Qt9Hq.=Z=x*>\}zg# V9@a=dзpwgn1I/z©Mb 5a'lٺ|=gCŒM;KjREZ $H8Ŭp)4/|]ao:Kl['G<'gmW_\ oม\zHe_z W ƽIA4G/D+qV޶}]z2G?BӗSIjĄfڃ4Btk\ӔDX/Π&.zJz N]3G3UVX[#FU3 #8]ܲ6 q3|6 tzd;A$^cN^c?:;[?#sE0Wb$Vae83VIKr ͮG|\:/T@?ZmHN zܦ)ap x3O? TSܗ7)üCyQ СKhO6/ %A/ |6:yiAN 9 A FQU{W\-C3uļk0Y^v5paez_F=%nK6de>D5J\nj}2UNZeC"\3AֲdJW%m'6^WeA73t|].Dq.͐-QEFnӍL zNkdUhX|tHN(vwv&R MJ Eݗ&;tdeK=^f &ZB3l*B3&}"ozrѽ|H|Fo"9eidѫ.GI\7|sλ24w y'6 *Uȯr7g~)78+i/+=:}O2z f97=h;1udi :۸kG./jnEn"5ךIהR8?E8pϜi;B]:3+]@7r=(}U3]udErջ_ ^-mmCVad0#*krCFz @ТTچWr ܠ~CADt0]yqLI`h䣾 :/5c",t5$f˨Azo# 8vT]CO} ~F;ag^ ȑG/YMt/t1&/:Z֔ :|N>=o$F>8tgzet$7\Y 0 OYM+c?ٕZƤ`b/PݡOG %I|}zΆ0YEX"m ^ݍhGHd^b$-'qk<ܡY˰cK`t"#iRxC;qoKtde- -;ᮊIK3Jw skW ZhfYji+X.ҋj}J9l)WjH=Bw yYt-E{/b9\=]u.o$.iQ#Q֢W+֩@}y{c r/ieEo*I`UWL"2/B3:e߈]s =ut lCݝDZpC ۩G[3CBk䋈ѱw`=%k$1r8ssM%*e{Tjݠ"ၗ TČ=ZoP>=ou6 dTSFjOet s 1R;-,V(3|, b9M7:NB;Tܥ{C/ }dϵyLK;lba祌qzq&/ӂ0 7r P7=6 k%'fzN/ݑ0cх<.l,)+B~.+,u)4pSՒ-Y҂|E=P-q+u95ץزj9J[>sʙэtם K_xN͠]eޯl;k列-RXfBn6j#p}7en5g_**OM ^9/Nlv}J4l7xζ|jCtjaឺVB#2j .S4.l5!_0S0j.+`=uh43`.#HtO?Xh5k;7y7#ߍS}@y/y?EjzK}R!m~bgZ&FNh7t9zH478'%-Gkz@k1Z$} D?^bc+!/D9+QqH9Ws ~ Eӯy܇ُ&Bj%'&o);jQ`'~JWt mQ+b*_H4zEJC6yuɏ` W蠧eB!%GߓMKd;7xMmJEk Ծ{a- |SHZDyq=|}+}!nA3[h$#pC˹_E.sL\ǹ_2ҡ+)ks*q]cxEbyGsh.g%2u8qp}_/?g@~_-ޠIo>2Jk%|jLMXl{s:v$:gSGd[C>yk45y|^_=e2s2jNb&R,苽AUh̅_)tǺ#"&Dʔ=xʈf!%ӚXOJ>@ x'x߄mr\dCEO~PIwu(?я24\ 0]=.5Nꥴe/)1׾-93zNR톭ۯESvhU)%Vr5F"aMyf'߳}L-Š޿u Q3i!mN 6KF\볜f%!|k+_U(%W|MӞs;)_9hD+u3*3pz߫O˹G*Wz*+A]jOc*,ZjqCD_#7P.|Ӛ{(9-YhNY}p_tK]~ 5AOYN/\9:cNa?6tzAW3_\.u Rbe;֓KB/ѫQBOI>~V5w^57 돸i!6X6迮;Zt0rM")3oP#!OC$%/2[˲rDm-V&sB_c 3EV/^yeGNoWOy49ΌuefrΚ@hȩUy'ŵRz!OVfpv^/ijT~EF m%*vѯ$GLkA&ED> b)Gppk#Z{tE%E>y?NcP2>Xdn &lԑ[8COȖJМ>O3w4-:iq_٠ o37Fl$Us1ˑ7%;/@غl,JMߔ&LM.)BfZs~ܑޒ4.B?GNk\5ON_~S\^{E0A-9ؓbz[7u!CM'vxg{*˦GE.[v_)V'5k3ʍk=-B9N*^U謲fcc},ܴSE~C ڿEbhV/7urp_'_m67UA>2QS7梦=K>`{4Y{L)vU0oT~B |L7=FvU`Im ԓ:a_vCs~s +/hi°D'vl:C~_%.xHԞk=ɆR,ߩw1 '?`t Z XOj23{ >QBR;C՘I|4:NO%v`n>Q_% ؂% q{$k^v!>?[fܑkYu-[| V}^㓭 ZVV/vyUφ2n믃_ڐ7aO[&e~R@-ns%!dލ(+EF5rt9C8}6DqY>t5^<墦vLf <1=ݔF|_E}‰T4ľmiǐ5^z|%rߒJ^p9-=I8jy_aոM; >) \r9Ūi9@+_O/zKgz?3g;8uࢧőSL( +ͽ|c2=Qr[!7~} B|O.QFNsq_SAr/x[ ~n~_:pfyΤQn۬SLޖK2(^W]*f"ZBin|<ӄ RG{Jl(v]U%LQԎ Eyo]ضoR<[CKINNp֤_cF = s/9GM |8V Xe-7h)ݐe}qPW(/h1(4ny6F{hAD!Vв*^@o*벭S 'gU<ԸؙJF"h-%=sS zw•x;K9QPA=_ufecq ]ͿQ#g24fI^s?b{([;2Ǩ Ru+lnl /|J%FΈɒzŶ εJ-)AEkB=]Lq_5ZGWXE͌mu- Ui2ޑ(/ |ONtȗz_ @7]HnB(EY҆}6G=} duai{jfy=g+%SvdaO`7~؟$~IkFξr3wޑ_6V |C%l^A= 7mjG[zA;t/tWA6560-)*nzO#'rgI|խ.'"V~H뎽,M+Yqt'3˽hCщ og"B{xmH%'!wQNc - V7LpntY24/7۠IRˆVy=ը ՘CNm~q*r?~C;~b :C-!Y>4IPo-~5-Fg2WNec.>AK6pLt2oHsE m7IoFKԮ\\H١[$6qIjq|Jн 2ڐ[FY4FnQ8)5r#_ )6<=2=tBosK赴ƾ!$kC^JFO䧷8ݹ0_V͠zv.t[hXȈfj5ײV.q2RHKܡ70-OL-izaPّ.HqO9Nj/DRgn=2uB2RSA)y6Wkz%u?stQlLiA.;y59`,@5ޖupso߼dye, č Ek `B78"ZzM3h/͖d.xK?BWI>g~IR+:4xz u^zw c^.)Wyu }v`^Fo{q#Ϟ$A>^#!?F}tD[6rtM\[vf7}ao]S Ǝ:T#}aS/;v ql{2՗O=.qL7npxp?R'hTz?sgJІ5)̍D&֝YO+T)NZt*J/ ~M 뿦_o˰-WV9Bv4];kH97uZWzr9ޗ(p#A͗sx$ z~"X8)ķqFMz"]-/T4S问 MSBF=#65f!_Q=2S(qwBIx#KB teAE~1[.6JY 5tHՁRj d3^EA7.9QЕiߐ_Z.)|IΉ:gQQ?G tnqnJC7\r^KY3l)l @#A~2ulGZt^~"97F@FN!'B8tzJlKx` W--ՑEl= ]V3O+*<}}=ADQq6/5u7Z$ЗKST]x]87tt0=?MLK22Uݳ=w#Or;8;g Q=OU=]J;[!,9ta\"' 7ZxK*ȅ$z)O &K݇ @c7i<:Mr4:wqO}l9f.4 27 Q!5Af\-EVLw22ﺑxsm9~^V)Nb4]EӻS絈]g$´C Xfli&з.Skж@TrftcX隊FZ5:+ԓR|ޖ f 'a+\76Jo- *Ɏ_;ІL08+4e!ح&׻cG{2ҜEa12{ Ow\ Lh1\DE4&lT!?B'\z.Euja X[>sIʠF$k S}0Ec)УQ|9J[] Gl՝rso ̉42S3j/lH7tq\ 9^ Xӗ;})orQh$p܌^IJDy[ӂHZ)+xgdo *eϗ(#=POB:3|1mlR~#e[HRruC׵nd Z6GFj[NY M]JW79"Ȼ"]h|:8IG2swUFga|*w<JyBM%j}?H*r{$]kH6׈JۡP^v₪nk,M,jTKK\?R?.p{0c@nHvzh4{4kd$Š[}. ( niu]ŴTȏ .9fD.(o/N:$硯H7l+|zB 2(4-;{I 4}'K"D)<:`5K #BoIKQЅJ^.}6n-ߖ%E$=z _k5ޑE` M`!ͭ_F컠u}CN13*~Q(/C3Nu^/ONt\tNz/# ʚkґRD>q3x:zC[2UhͤEG$+/ `.'tlk/ic|=9dR67eJ =صQ]bv X')"5ֽ 3KOnB Y@ГBQ`! :IPл,.Qu)2tz#|ɮK*(t '--fRk@ojuuM_Oz Ǡn $>R|A%ܝ:=z7t^B-/}C6-R0ܻk 1`oji] ]n).L79n]pV6j7爦p -+xۡ/ ] F_zyQ>׋.jyxj FIn7uhK-7rY;;lй)ok|S.v]7nS[!?Faޱz/ {ꥴGň駘 ZwHg NjFEwxLQڄnI{ahJ,:ȯ4c el qL/ #Ƿw1G^ e[ }'Fj̻pYUݍ"@fvU7.F/n\?fJpO}*;L_ km?sǗKO?lAw5^:"yYQ~>ӟ+~k1eqjiOtfs;yOƢrf\ɹ@EI} /1N{ErCo`DZwV7B~qsAhBm"}qON"KZVE^`F庠{IsMJ{&ӗ9|nTFs 텼eB=p}?XskDɈEڥҎcgqy\~!bi})MFN\Zm^WR YD2\?WJnmєgCoŹSE>9 g ,- zvfM7tHt2q}!qr~؋.Z{djТ +C+cTm =/o4#8uy!ٽ>Ubġ݊%Z]/ȋ.uю݈>']O}YӶtCN"m?ݑ_s.:uQcdS7I6Ws: /#?K }R"8u3}Ms(G3`$Bo&/=yrrCsz7duBѶCMъhqȵuh-enMWIvAь;}.kXDŽ-!u 4i1rʉmu*=/֡F6辈Q"]S'9z&'%X#c,KTꆼ-j2;uoэ|r6bh `:wHC7(62^RzG+yqubUߐOԐvՎ]qo=:u([#$"^hc=k]܏Bӽ~"-ȬC -L].樣ShD\5r]ؓ8|2>pоGź }#i2k]Hވc=r2 ȷTQvIy٠_4 #pOU{Om4ltC>E#\AK)Elk#0riihsdLnW5ק6}-9xo13וFY̫ު禥*q z[Z]ub]AFspA^YdRT$ i鳁Qszޡ }W{y#.bR.$ib3^%M;lAZӥ\B\]hC>Э;XnH l|)] E}~N@Щޢt`-x.@,|A"A>]n]ͅ7R2.Jb)8i6E+uZ.(3GsЛ$e{e4Syn1Q#Ȳ$,P{R:2#9K2;kmEK ]`$q. 2ݙ\b_DKW_;εIV P Z]dž(zjތ֯ NR?ӖZi7+َ*1h NQbH&aP%;ǵzVlC^赗˸8Ng`67Ѵ}"-a;/>:q.}CKThy]bBK0{kn2jW5o9Jft{}S1SL ]Ob\kx?bԊYMa^<"8 uݰb b/-OSh |*t~NNw5R}~N cӏeP;4a4oF2upB/+w'οW^?ҿ=603䓯־,bRUhL<:O}"{L[Uh9ήƞsSoY@Oq##Q/ig -y*}CSK S nKRL}svjL<hym:}2N.-ﳷPxK}k,1MAG^_aon,f..xuꘜm $<^bz23~'Z~O)̕mHĞ yWUۙSpU-v4wXG&6SOܓ;]bgw&Ip^h(y֠%Z8>z=*3FbTVygb\BΥEf﬋|Kt' mYHodn92RMb4?/+`El@}}SSAAr>5>xZv{`9yޡO(Zi?4lSiƏwʖ*v̲qrPV>$q[$׳M96lAgY7^QNz'sрȄѧ;͉x~VEh<7G%hon |_h{L(j*r~C R""g8-+x5Vn] /z^ F_8yo1U&]M"UX(C;}|f|wxE'!+n& –^U44kwfsBckYo^5rS۱O9}G9W8F5א7K\|eߣMQPM%jJ*o2r%UH )thSvyA5K^7-:6b~<'0 >F8q-nb6lp~}M'䒄4y^)k}OZ=a{:Wr5/6ǚ:pϫ|wgjVúwhS :p^sC M } Q>yf홝3As/|tQIzBO2wg_H jhZ6:z*C@ZᑥA7vx&TԡAZ);%d2ŘK+cG*v9[a698ث$o!=9ɑgȑa(/@Ü$I %2E T&irɦ :ѝLIsCIeժtby=9_c$hrNod>ԺyY85^/ATJGEN/Z~ un%Vkn0Yyp^%\7<}̑!@V}!O>wq~ҼeqSn(oa$~N (hI_RJ!wb|  ekchqr )Gȉj̚4=,vx5#=GFNR?A.-* ٔ^=Ev-ztQ]%Ŏ\YROТw UzUq.^#/kOݏˬ42Nܠ[zGI#z#XBǦaڢ^<ą:*tH{,'`QyNA[(v⼅tL .dkDyﱈ 0wݐ_,ԠwVat#ϝ&NS 5i $;VYTƶlSZ7CE%/'rb? yǟc W^o7") :Ms5zȹv]giQ7/B]B#¼Aq<НߨhH^HzV+ o7VH۠xF}չKLtӴ^ChC}"ﺸ g\8#3;gLF%+.Aҫ5z!rޠԩu>ǡ{_qLɵ]rۀ@! ]ex#Ju#Z==S$  $5Q^-tCA)Gר.~fQK#aСJ<[ЙvQ ve6_"$.mz/ْlI` e]iv[KR|~>]>We&{D1 Au.f{o8ֺGǎ:.r3ڐט˅ Ü~<]&.rUMāLcߐg5EOH.K _@KԥC{ EBn/эQGtZT!-fK|HmȥE=iƗrDVwD>iAWE.O<@+_̋9K OKCϱKqhmz nzM/zzghs STZ!3s ޿ z,_yкl/)k#5JeQEzAz\9u-6誎.44.K/<ؕCĐ v30o}ZuC' =g,Qɦ =- =`<.&wIvAӍ'n.WF [&%7V:t9oFZ- :FN; :;/tE7*e.a 4ۺ_4O ^`{i)tWP:#_$iȏnWuWJGM7dNC,Bu?s phQnTo~qGa/P \ @cjzuGt* q&2-F~W%wԓ8󿢭K{AAf ]Q{80΀uWk9 /Ԋkp~ԛz`-'4\kRezґҎyw![7KHN[j I$0rYiZ"-RZW8zqw͐nzlbU]2iq:؀uaIrxCo,c6Fι/KvrߩO i>ufqW=h!O?#ݍ9-ҿ擌 yh־55qgrd~K3GG*i4!# [HnyICoOz끷\nůS4ZFߐ% d?gOc Զqѹh|Rʣ:q tte ]bڡV"LT -ne2BV֯]?%y%hW,>w~oQKM]cR[m!8>"6YZ<ohxks>%^q""7\: 9/o)]yllja/Yb|G(͸Rˆ֥ Oݱ?Qn82IᏣ6XdФa/Tס\_)yMD"hۼ 42S&uP1d"ٻ@Nj%X;绖T6֭^!3Hؠa)HYWO>:d:B 4>&Wr,2s[lIIsx>=改pC?t%^lwҸnu]ЍQ*ke zfo,zh[}΅ Z2͊E[/;]]W=7r .}Tl:"Ѝ~.m1W0ƍ,B34~НGe:酜M7FRۻ)L) (ϚuyOiȪ;(-ȜhZ/r3tyD 2hЧrO@~.|\V^BrU?B{BO+X0 be{#芖rؓU|-RNy ݯut,7M~c^cWu\xyлIz Ͻ6oь,/IҠhIrMN!XUENryGn&23/ 2,:a.stˀZ,r Zh]Cs.I6춤첖\_Y\kݑ_̨ !'-%+tcGs .W;у:׭AhKehf_7="Kbtы;:z E}u励o\4ڿQWEǦzw7=ϹHnTMZWmSt*mzN&th"ZB4 ~s=\Lӟ¹S:у\:Mڱ](7t^wڀ^uѯcvOSFFauJ @lRҜheig2СGFvwF/QQtFϢT;të$:zYdȧ̓pjU6OڡŮoԢtL ۡґit .OZuƠ2^=2쪔s<}c 6 .ĝ\w(ʻs\/"E榭rF~ӳJE5$J-:ÿ\ozw/kU4:oƥA]2O3v?Xcphkʌ?<˻WЇ-8Dup$wo3/J "cq%;+v"7&c g-/gI0.rcP^gI' u0#봹.E=ˊ;vitSZ*}K8_\i$0/'ъ\োQvm Mcѽa0}6`SJ=r_>D}&ڐ;T\Yڣ34ʹJL;h6$|SI3x{+'c;tx^PV)i|=*W ލ#/Q JmRsV\4Cjb2.\=PČNZDi,QJA }Zv&7 0d2\g*vƨ[4|)ZOIrOOghno5ї }"*AZc#xpM/?EPog͎ߦOc% ojgǀZւMoSYu.g9b}ꀮ|+>gANn8V+h[56rF&͟tv'? oLj4I|_S }5h=엽kV:I9ZbLlMO%RτM Uҫ GKR/JLҀDqlQ87䇙p˹DE.IJЏ rȱgf@$ /K;Z(;/t(Hr |nxf.O?зxf#>r%Kl?d)fϬ}N$:h Ǚ%r[9Q 0t|4q(c_%~)3Ke0nT~C~̚YA4Ir7yd`gZrK'H@1S?}֡'x=z}9`ogFߡ9ZƈMkIFCckldJEG$="75Z3#7,ۭ/ʱeցbwO2=r/~g<ʓA?↟JQ~|U,vF'uk,/zrGkЫ _k| 'K gd_s\ۏ_nRѨ#-jn$R0-LԐk췾_qZ#Nf?r6 /}\%$#T~_Zն.n!\_n0X-e!g$|^cLKhitz4un h_ZO~n$O{PW׌9L)ppo0t4"t?G&^8=7+HY>%r GxfN_DL7<5 cTY[)N?3K^z&7"9{$QO t%BP%TXizNb~]O6utؖo=4+W(?L :kyEv{I_rk%mؚM~Hofj١5$y3MU<5l-NFC' ]a||a?fq&RW|PGjE.ؐI0qPgn<`9'iD79 #7dea䭑A}:tf9j9Ҁ"Ņ>m!rpޑ_ Vz!Q=*lCerC"uBvvs:.e '^4^ee/-f29Y֤7t< G4?*%ty_,M}e-"m%NП(ߠ'tYwڐ`$\J!"?)/-BЩctmqQm!:wrv5f`rRj.w)ﳿ|(* iOUl\O'ݭ~]"n J|FLt.ON֠o38BN .nx}ӍIxV @ #[fӻ/wu}wxz%fmГJ<ԥ#4ސQkhm\<ݧ3^gLza')ơȳAPPgNMߌc7~4YCV»GLl&][ތFCl/`E,Yѕ ڢ m7ysݵqCfu#E_Mθ| Ƚ ..2Z j>6V% yP͵qg;tAzj!cv#eqczWېk Zؙ4[v6TE2ڡv!m K6ˑ{c^PPʆ\#raUhkFWbՋz"9cLtNbnt͐v- 3Iˍ\C:h.x<njܢO&_ ؛=Fٸ.xiMErMF~j;J;_G}KyQ]vGo1_C].F]5Zde-Gw- NŽ_2Pk߭M#9Z{ֽ:pS+lT'G96$^j_⺋ޣ6cN<6%7Ξ#]:ٕ{ qE<贻!KS@i-kqX\+D; KZ+Dʨ ]iN֔vi㪌(V"2y#xCbTSnm̠GC6ϐH1V9:TTN/h/(յcK{u7AR(*~(_D4v_O1v@w!a%luuqRף]Q|;",".]z32׎x>\㬣F*iv*OWmX 9CO4 0c~F.-L++#xU)\Wzѕ=1nrL7r-n;\*]o|ǙldWH8"ꆭ2j_V2v&@afr=jt'rxhނ( 0qzlԑCc >}Oݵd[ ~?Km|y;VVVB߈P܅#m?>K{ċ||r@d /r>ZM;\ks2:^-G7ezƒJ$Jdrl)@|޻/6o9(1U@wӋ-//:hA0 dȟ*' |kKt[x6uhɝ9=S8:>GPVt2 N' GEE5dž2EbJK@4{oT+XJ?aQgTe*t@ gNTz#׋ݽY/Dn61 ^=90ؑ{c2ٰȋ-}F=p6(Kqu^GgekzBS }]4ꈌVW?GNt-TC4jo52 bns94J=EB`FusoJ̼U$L|b2p:9UQxNهd]cc2Фa>TȚI%t.Lic"Sf;>d; 8>{*O@`s==fD93Jr C37.rR#7G#^z3TlJ0ģI5;sԡSځrxc1ƌNƜckPɭ9B"COEL<%lf '-VOϬ+^ z$ݜ[P. Zzd8Thut `<]~[ 3kԠCz 9Ǽ$.'Tx;6U=/I|,:仮SX/<jȵ4]$_v)vHZ>׮3;})ۚrGFbC&Ș׫oJQ7{hJUb7NK֙@52ɉU3Z }P[^uhx"r5AunU)lqɨSm`X2Z.m{u'|EW$ls$%"zp-m [>-2Vnt_MYvg$Eplwv X>.MN $ѩҦ](7>9H*ty]f gǝEҏm3 Hr"O:I'qWX⎭HA}Qy@[?EDK#.'Υ)=Տ)Σ V]F$: x}O?K? ^$Tʉ׹c/S^>e5Ƞ'-uyRKJ1xls? roJOI =զuc?uv[^␁UKS| IDtVS/y[zy^ڨyxlju]Zt_~sޠ)t įY T{5k|SLmIB}SCsSfx+KiyVzځ]VT XzTC|Dzlo}:/5շCs}"O6o+нZ,t[uBF/ }tLcQ }1<%]GwuS+T4F<;?GPQ;Rߧu6U P0-F (*OY zar]_wHz '=D 4ޤ=8 yd-M?3[bj/vuctC9oBKw=φtܥ5kX\ot.H>FQC!ˣДN퍼G2l=Uqshy|]JnN' AkJT?L,u鐡w;b}aؼC300$In;khr!eЏb.u?|<knNbV,WzyVsM^cN D%SE\7Y^\] /T}g``µyߏQ䔫(W c;з;.g :K_ xL͕(Vl[&ϛJ6@.uӏW4/GA jky|.лf'tu\1OOOithZRbQuh.*|H|9I\Wiސ][4ը8xa퀾\V %/܋\1m{ZLbRn܎fVIVF\d]|FB0j9s^n!.ECォ/ OL3:O/vBQ(* yrO[Fr1phb*E@߼>:0>G[]rFZt=+mh~HN9W^#u<[ꅑG-?= Sse3G.]JO)&\arȦ|:>C:+Rȸ ׮A.Ta\yzG٠#4"z(u,y87p⸋[D0<7+#sb7[S~O8un.gy|Az"ONaloukbGRF>/.'usor\AԎtuEchyܛKWD,'ѽڠ;Myˢ]b8D"~%P.%;E/0!3ȵ\9,R=Pm= ?[-:3^tw#foA\0+2ErOtsT]Z[*ۅ6gf. Fj%d§ѓu@wD)KѣEkM};z6.Cot楋. @/yph)]"d Ѫ#x};< /࣮>`ӊZZ= zsoų]]zH9)^VPksZ3z _b4# ݚ[ @}.\c-~O%{^Zs( >Q$~/\.llM#ՠϊB*9Q-\E/(-҅Nm-+% 1^ 3틼8O \䞧9JpًnMEE{lԐ@˥ HCR;C,)Q[|F輨eؼiQ]lv(qX%+Z^R9s}Ty?oW7lhZG9q.bsU-:tTܞE0TkUC?ȟZZXI\#O>F+EwBsRG.?"s{;LQE [RDc|6H9%l1vhO7al깳sh_Eh,\:\C"ϛ)Ūټ8 _{^ zÕH# 4;'q?x:vuq)T肮|k&n|[z`ٹI!}L1*Byt -si=aS|pk\~>M9~Kr[BZ䛎c@3\ahV%(X[AΑdr@4h9;wB |i'wtރ`VEnQ\3t75dpK:I.:wY_r@%3+.zzn%KqcSqd4a>I\uŝQl/2ɺiur=2xqfx-] mî~ `5@1zZ?y벗-&|+C.z}R,M&T`t?nӔ[EgwMנ't4p>ynzuHuFUK'mҠ]-?ҿz=t }AtgQp9K;g! e"$䔳 }Lr'{F\hdڼlKSB#W ]jѸS_X]".(.]dB{=KTC+Q?E%=@3ʹFm^ZOڳ7rttuգ{o2w.rKKFZA^#咊_8Q3t1>s,Sk'rzCgR:YeQ^#LB *} [Ε7}2*MM~Sr)vw+:9#J3zC/њuC5/w]\ucZ)"\ OBvVwG4EhoZ6G.r 7=t{Nz.GIz=v:軌$At:elQ=]ޮ.o/@5U\_|'y3ddwB{: FR%:Jv7r(y Z!z+t@>Ft_ktڼg%MU]W;LNk{۲.7*@3zht)hG7tYڅkt _2iqumunxSc5b&H?UU#gmQ׈ױFɓ =\ %Zҽcv-=9u4-ZFgQd5 N9~"ۭ[a4 $jьVfqWczc_{4^p=QZ5BdSnRYNF/dkCl?L^䥑}{4$Oʃ\$.ABvR>ƨnNW_#QuШ7hF'r EK:uO%tmm a|o7cis_t4/qS]U@xltk ؈g^H#zӜ fBt/œ/'/d **_#$F,wHԡjFcKgGGcT 8_Gu@7I/͖oG[ٙ'#ڻ=&4vR@3 q|[t/oMհL1_u PCT >tYE/T{ |U?~-֑!Xk/G!m^{,DNr$~pkok(s$ K󋕸w+ `\Û; 75I-'1뛻WPWno@?|AG=y K@s֐o xȱ\jw&"VRy<_)rz/v)G A}7)to=Y+}]UZj}QۈQm/e) ''eyh?h;9E/Ae1Ac`9%02"7^|$.Oۣ->&EO- {uXo6?'"1;O,\{>/S.l2)5ХnQV/2wxxgk4\q~%IV<y~_UhU]_LBvjR=Asw/8#yhԲ c}?:lhFn/;+FIhn'7M// 6T$YK4誎 ޗX3j|5IA:Op-?<"ֿ{; OEUfJEU^$G`+k4WE ~T_[ s$B_/K~P`,+u_tz\j#VtSWhސ׵ ~)qh7E\ܑ|d <HwVrB'9l?~԰ߍ=1 R+*L_grMt-fԂŜz_JD8͊^mWs.Il]d%ű$: ~Vщ][ge/r8؋@\+:<^z?דOFAVok.<卤:}~Ezb@s L zY0liiJ?gwD1bK z>YIhWF$s}??Gqd\| M*7uɶl z$' e^OGS0i2!$q}Rag>y)d\7뛥7K~?]?v]\`ۢN5p?R幱 _ꓳ,(7PC.Caz)@/%z3xoUtD`iXZ_wEU&n'Z#īC'82!ؼ-e=֧g2u̡y%Nk JܑLq;X% :oKPpJeR}Cf>Hq%GaޢK9tӷ!4E?l-x]=fl>C^=З7!({/\"_Zޣ~*-ШA[?+kЛuɃCZN4OJ[4_3Ps&cTJtޮL|UkThι2ɠ)urϱ2|hj_:%K6Ʀb_[Cw }*UI;s\ E=jgp0Z/ Go`1EO${WN1Me\O(0qi y6kd6e_MG/-NG3K 9}b(}ht]Fo#6zհkO}7A_ҁץK"PxFy3b5 J=`/5yLBo9V6/֡MU@Nyiksl`/e-MC-jNuESхQN5yI t 1IԷ~ez3ꁜ,>Ft$rK[ŜwE2vM;wK؜<)Mr$6FCzJ VہF2Ft5ru¦vZ].+Pq:SYh=^hDFR>r OriuA~媆-}rBF CoI7  'Bt>uU1Y cPTykg #t>d)@g7y]4^Of@>>Q~_ՏSmBeUZTuGx|_\B"[{hDNvG:+pUHW2 ijĖ\ث/)6Y[{3iWi_繆W2ҡ $ͺ_y/:e)g W!]~{7fdO^'d4^/_\zZڱ n 4kos{$t+J??Ѻ\Cbg3'JeTkgigs kBe݉rw.bBotq69/FV2չ%nwqsN4* J'?})0{.z͐\rE{u\4rH\tt].y JN[^sYڐFJ{̦5uT!DuH rQFm춴9'!$Hk9UQr}3y *vۼ(Fq;S ::Eǫ\JLY^9#ߨB/끾-glѳ1^TNeo4>r/Ɨ<'jC>%ZW7!u6 ֖AsI@$ 1`o }1b$xk褑HOmXJ\IZ]}qe8=>J;tJ_Zz5;y7Wޔ"YL?= Ǩ.䅞,Wh$"OJ[[B(dgTm䴅[ MY mm ~f@G]RZ2W8yV(,o˽>TM)խȧhY|:6F;"\ чO}Xtxz==/w~z]q2y2G/e(tHw9gHW/m:ktt Aʭ|rO7; z%L_ݮ ?]*4%-ń_!34@緣$eujpImNnjhLR%z:-Ov@ET۸,rY^j ftEtӟHpS1yL('nCCt Th:;A\6XEЫѭ=]<#ȡEBdy_9GNbd[r `t>g\))n(Ypۢ̕ .rx-MǬ輄Kޣqikp.5ߢ9\\\D~Fw!֟R*뚷<V9ۖܽ ;kT#y1FHsmHuB_]HvICQrW(a=7c 'n^s*z@:r1FvH/EYA]muꈡ9}xGv'Zz<ݠ-AN: yrRv_7ъB/jԍy36˫z9[/ A|`tN9:5}L#.@%[ <&S9o`ЙW9Qϋ#9"^(=%癱BN VS;Kpf§%N Y{ O |F˃5z}ƻw.-.thOglDoע+ܑ ^r8ѫhB@?SdKu^Υ~P'_ i G%} UBk_8ڻm :LptÎ/l΋Ѹ5]-o-jS }Ԙ܃s| A|\]Мz\$ctھhsNt`DK#pOk;X7PΙom%t$5H|~&[ULsz _nϧ抑h_(Vi- O.&u°n6lMId+\ :/^:>Gt-[^ z;[ǻb>Rwb^bKx,vy NfDnB5Zk+r,AY ] .dUg- U(A/щ}meAnyF9"FUf襅pk\Z9t*Th@{^=ȳ:jhFy4i\̡[.Ff@ ]K#ҜY<Чx ^s)v0jS!ֽZz^W%tnl@ $Z4_RШꦤϡK…3LۈУ.#=J|x?}aAꜙה3\9@Ltn1̥#\D9DA.9%qܫ+<{Eµh .<~yy׮tYl:}-9<\6%W$;D t^Š/Ϋc c4Ef"yv># H n?B%C:CoEt.dλ&tZ2IFoT {g=i y.%ݥv|.ҕQЮ.ohuq_+\;"BhGEo{esbi̖4r(U>FpgEDtb5Ke[}ksuxF^^4v`>yu~ 8ѹ cMNBwE.G'?D^u^yˁ|d]yU !C^mmr0gIg[G"}y&rh'乾`y dN_N옞Bޡ/^@N4s;m=Qe"t˨{9 )ZQQ"\E0*y yfϥҁ|v;9qN'k=J䶎/Yˋhy7u[v/~gkT'9ύE:瘎E:*@Ë޻)psD{q02rWWNzydA:XUչp2C2zL\Nv q-Aщ#}σ{fo^)ka&IftYKF+!NZ綫C3I~]6Sw"2%*9o% K\Ӭ^}uFtz]G| &]zN| A#W7tٻZȸ6ߜ] 9"+J'c]R1=0ȍ .%^<@ Kp0ko4‹tpB<-^#WAkH^ =%n5 ivIWN^\J*&//$g]mҕ՝FZyCeo*ѹ n7n]bޡf.R.e~} ([{t=^.!ԥREE^ёFate2(gAb=U׋I.cK]]kNccLteF.mz>izP-ZKOzėӧ[tiJ/BҞY|;zSK_-$#y}4 譋}k!'j"V^v@uutGAovǨr=[j}1ˮmQb%ҭCM=UHDnV;ΡsM6?n!2k;]xFs ߚ]@SЁ|u|=cHЕ%{& q0>mGCGs^"c֠{u]1gɨRَuI\5^jZzttl~1OK駿 wt3-uSn 5ٺ=ܫEN$'"m u10[[Q>Q\i׃ܢB#MA^]wSlO=WiexB79[$]]],bu:vD;@KJ˼/=R#ywQA҉>F{~-RCڡ/l-k)SZŠ2/ & bo \f&%\[ő;鴹FLsX}kL=2M\#kQ=Q0z!F2C6z!9u}Сu:Iyr"@N H5u(vQ F'S\ױKaB{kޚ#tQ~vs[9:E*<"-s.׋fT@NFry&0Y^@h.KB-ICˈtbe{ي~ !7|xQi]`y[Q鋔Sk:4n.UIll.܅H4#̽4bsDGH.ɑ1c^.4NtqT5樊-zF4җ1Os4g:q'xrl !o=M+騜qaIA:FAI#rL]F`"u>.ӿV7l-&r;3Ҡ0O?dZҘd2УbBjr ~{_w{\Ie= o8 :xO*x/ wv~H9i{A̋7zy 6=Gj0wcG\K zi#tEz_dqm&-a͡Z]Zyՠij[s MGC_->^/שw{d0ROxlziD;F'~Ը{>9e#${KJ] 9/}Sh)3iVS}V_%:kpΩ :H7t_$Rp.n1;z{3鉼.ТT& 3jzKfrfF+rsJ ( rU>h(t ߪ .М Q#G|ndSg/7 ^5Н4~!{MtKI)z~S9tYrywEH!h̽ѨK@'o[ʃrkdjdz4zCL_VO~ScxGiLP0 :ե V> &y#ol4#AFis 7Q萮tU}H!Af ,~itu4djCz_BAܳ5zk٥FSҏbːq GiG7D0$>Q27:8NuWA 4y8}Q7nG }o9͉+e v\$v@ _DϨdWj87z(0Hg\@Ehz pH[Bj4qKα^L>K,(CHkq蔑{[E tfy`J_<ԨcP/LUW]OČrU"%_pV-Ҳ+y_}]B'0N5;4:@HGQCg#x菴ұnj`P*G$/@^4 px^F|cfeDG4*S|d.;y_ y>75Y2@>t O4GK?{}o$Ƚ^,D# Ulj@\zg/$21ta'9{{00>|]ע w*}l'QWh~^"JT\@'&$u倾Š$rZVi MԥruG}xzzul̼yՔ dQ."AN^օz/#u˾b` 1ܨe- ݢF?%CҞIK ag]4#5NȘҘؑ }wT)^R= V7voݔ.jl,[;'{3>K eqF SPjARW*b{- &plR#5ٶ񚛀lY8n.E(y uqR~Igd.F>#Js xWK_: ʼn ЭtU Tn`y%QjosIA=~m^=[;5Rf^Bod9ҏ]<-`{omyq߸nli.βܝ׋Y7v QYy*t$=Ϋv:..'rJizAO֙*r*Ja1QEstND'ysg/^&pqCסv}/s1ӿKs{x y)IL̽LtC#FSh@ /- sfF.r1e:"hI=EZ'љ˾S2D\žWf.q|6;p[Ĩ2Bwj?xꎽ_)7ruV]X5sCF9U)eȝh.v/7caarJtt?|'&}CFEAo5 ֠~n9}E x\SQ ֠h#MN;:~.Zہ.J o#Qe1qOdhߵ#Un,}1wųqڸ&Q͖h7:')_SύZ?Qʑ/DUsȱlNCLQ\Fу135:EaTw@&׽MyJ鈰Or蛀޼ Ns[hrBttbsbh=!_n,ˢEPWnC#;0}ֈPtEm$r<L &@FfhzXn`OznD?uI6 MYZa|6,MfEЋ\4HӉǹw}Љˁ|-@ϑis)ߊBI=odUQ%^RaǾLw HdžMf `ْ~A2#z]tК8-^' y򢖩熜~M!MtY9i ]Z]d>m^C/b@oFMFQ^мCaANϫnBNYlխ~גM:EOg/b^[8wd$bBM^p/u)]UfEgJ$:mQ8SKȟh_-.~ N^WG%ad`C,Tt*⥴{,I? DJGDu=#0j,НQ"{΄z=8ǃڡG^bɈo]yNū3;zST ]f%Qz -EǮ\:"Ma(-2wG%:B# -ڰOCal/r5{KOBԩ7b-`~X&2踘#_^6BW(`4Es]^NЂہ.|PwEL ø_gCa51~[>G:٥c#jg5Ό+gfzmWΙ.k]w#%ưOuOvzϲyKw6#bqǧг#z_ݣF^"l<+R0 g Co%KԐ?RIZd=}hi+S)xtw詨7:~@]H\M6Neٜ52E.r@%QuhIo태KЏC ]KIz]FJ/Iy9/̯P:[.KSBt{/r:F7/rz} w3:rldF'mK LCtBXuE#o{˃|wT9"yEsh\ᥳ,G[AF~#]#9O)։bT(0rbtqM4bI~R0h zfi/%KUoh"z #z}VCN\(]~P1?Jm{ ]ew[s[J*qf_쵟K.ݠ9H['+M_d/ou麉aO8S\:`y QtEv@ow)]J$,Z9y>P:vu](;x0%Q(t]шؔz_sGAKȓN#"=g+:Uqm'p ak+KAL)r ue Ɩ%݃:EЬ @F";5(M. i#5đ {7tWt^1DnSt-="_}q-./Q6y^l9Y?㫎ߨ_ȧ*M\GEm\ą>>t.鬞%nt8tkk M7B+Ї!4B9vENwe@L7ܥW C:ڹP7mBotC1j^V#ڼVǍOk܎AM>F/AFW"u^h Irk>. Hs$F6z}s`Ge7AVkrA0eW$]i- XǮ34?Zuu4 ^\b Տٳ7=jtu1{ne_%cz2G#yXDgհ?Sn3G l}oiÛot؋ҹ[r+Sy :S_Tc|Y$4ۤ16sxr"v"oK_RGv裆=v]GAJJKzIM t e Sz 祁uڜk|[ 6(Hx ;F?eDfnc4C_]bp!s$z'1jF_1)1r޵#ctÒE?#K.q.E}vlQ*:Evt;ek2#dSYHKT캺F0ee3u{^eҌȣƚ94Na s}AIiuu0v r0{Y FrQ/m. n2xfܑT@^]?ۻ/wta& . t? =zWgӾPq1KjWNYJFr*&`:$nYfdo t,R`^?e9ˉ\. c/+] 1K ^)v^uѽ 2g73ǝ j[,y2GM=6څF_ R[[Z?+[z_@^x_"2bkJis .âLӫd4 { Эj%:.z}mZ+Vꁜl|;^})u?s= z 8$,^6.=k4B8:̫\]M2ldn =.5h,{! !tW-{/i Gn#* ;BbP˃:4A.k\' h<.IQu*tC}'0Hvtș@N4Kkas-:pmkݨn6 Trr@`{Rlo99zו2C_w@}F75iE)r9--D]4y_ 9)EԝqHtLSxnKOEOhY) [Wxma 攊(AG z^{sQl&3 wkΥd寑S/kxO/ThV?i껈V䏴/uq솺dG8 eѫS.7j py,L.-EtKr7y.[},/ڼ6N_Kk@D5}5tamB= poJDyܥ l?ȷh6.},}ӸAkv/yM0^ږ-cF&ボgI} =0[DҒJ47 df0d г'= r Hɒ`ςaHeB~6 ~iW̃]c^o/' cne4jl3hVgR* |p`w]WT ^fd"WGkteG`4چ~?3ZƎz?[;Zm "']n\MlT( ({ t?҃].J Z@𖆿7?rȤ1 鉝"(A4vBus(4/ VߧG6;x{]G5xf..Tʰ}x=V7.$rJΞ:VP֘恾 ڡ1CdݒKК$N`%@E2'd b[݁1섾y^d9~Y;yuq:}.o\Z|NdaDdJ.t:;7E 'F|ϋ^ ;Mz芃Wyo=-%h>Ƈk/oNX-gX,{ 9KtE /2)ī`o4#A)&p Kx ʼn-wK-KKf'/U1C_fw(dҡUͽ?^bfV'^7inf']{2gZtH2HF}Z%@|s܁G۽e͜mF'ʎ>n'tY_- ~Bo.zիɦ{pcOjV'1Yi I텽_󱺱3.)Y}ڧyZ ) zQ mφN@zN%|BoyLAc5Z_@9zyM 3i'v7+sbv'YIBݻOՅN2#€XK>jZ`N=[{+/yZGz9luL^*Q._#ZХ艽_JpܧC᚝T^qf(ao/0;]݅qϒ)shݟ5I[/[BjH-wW'njl+P8S >yAoKzt[/ ho+<5 }VMkPwĬCbo[Jjv62rCoqci>qNAkTh}V,=Y&8V|ËYr$[vadufF`.^^">"j^9;~ eA> ևCf4U&AE^ PoF+Ȧ83m/ٿKODž@VXÐ*MB(B%#C912r[! HǀMN~yˋEx4K&/pEu$ %9ӚWsa{G?:ٜ@Ǡ"I.' e|݅N辔4ZE:^e<ހAF'h(L#: }0c;ahu!WQoD\!\iDA uΧ9ܥ\~B]9N Nq镄.Љ|Z9e#l>-m2t lE#RCV@nkAW,KJAK>v@kNе_GZ̀Sş&dt.5[Gm,F[@$tEm<[4b'}X=ueƁQ't>.ј~꫰cP^2^}W{_f\Wh:'C/HCFN>ۺSu+r3zF- }/.CWe]:%2N{ 䣴L9#.'6BLd1/zAvn!o)L 8,hYlbuG"2XuKfrW"` ?G*jt *vt^B^ۉB\ZWT?\fDͬc{B˜ h&u7% :qDW5 k>W(#8#àw9}kcܐ^1u#ۋ|D[RҢYEX/6aDH#HTޢ'Xwaci1mjzLl =Iu_v l\N۴0}\X̑8]}sBotBπ>*u)BokFwUon C4 Ot\)}'ojSt/uWxA t[fkS(G~ED~ĺ#TNs c|o5"Ř EE=zn{A]"мJk]m+YQ?{tIљ\Vxg/]mVc>F=_|6%NqX ~nLZotz{paQ[2jhH #ޡSBA[TR#Ձ|tbwW}¯.B8_n_3_8gOQk4So~O&s6D?.Ձ|lgГӈ6HOak=(|}S;~:Un$a}"9 ^3>"l˷&[D!}YF@{+n꒮ [ ]^nϛW;þϗjI#~oj0گ}=oZ5!q $Cs6N н~s7\gޤs0Zw#`w_Tw{ (㧨"^z)9_A/Lcezjo(C{e{Deɐ8$561f%c_mEf~.qZ{#ky5=O[G{Avl&sLX ZYzꍾ [KoΊ7^[~~K~U|Z9NK^&-_Q@DVcӸN{W]~_a5#2[u| 媵-ߌ68_*)aKߞ [&yQK]x~z7UFbI÷q_n[.9"/o Q?k|p{/5FhsQҨ (`z7], 22[^zōd 5G[F}8~]'Cw0ˇ%Ai0f۞8܎#gt[ܖ>߁Syo1k`zZg K9TIt-/7$lZh-$C(ה^.:&=?,/Ko?A._Z+yNo pu+6Z%b\Ԡ'eطTrUxzŹum<Pmӗ&}?ntrC:>ﹲ4h,c_ )#S,I?X%YJѹ]pty}߷;A5[\_FoWBo;7bGx=V4k7?Ɠ'<9k4>x*K7#\;_eCNoZhc[?z~&FBVi$PEVy󃾮kg芐ؾ\'odU?ۈs/8u<ɗRh˗>j3klQq -u_j{cX T 煞R5uƇpPp* sX8y~-mWhQLG.ꪸhۺe؟ rD(|vu/z| zGH>G%/)xZJ@az qVF7EHq +d:ݩߥȨ]<~EoKKt@K!|^_cO􃾅o7d ꯺h{4 \KѠBO} %/~ 2S4M˒M|>o6H^T7*vTƧ<,^ۇPԐKz͕6pvM ҥ NBʄˇE8?mιLQc}TH5C+ʟj\ eϊ$( <򊲽ME.~i,?ȓ43y^v"E*f.J$e~ 7-":L:~ ߙ#)v]jڮޛ<)ϨczmCxSG!X:1h3Г].襺2/3wIWU{*zGZAnALo ]BN}K"Dc7 }J9,J6JCy'zoG'c~AYڨq jQd…>m͖"kv.Ѭ<ĠSsVN5βlf!h 4 /e>&6MD+e|E~ǂ f4!R-:/?4Thm4 G2{~ȜwFn6vt{!-fYya$hҁ|H/ƾ=TOPap[eBBq6v>⌽SY![!@h0 hӾg-k֑s*%3.ms@] {0 9#m#$rYuaX|F&"znpU=.ǺYW/NWVM#h/|]ae>8\]۠%]ׅ9]c/}Q_c&wҸ ?}x}"YtMc\C@Wkѹ')MO2=_J!.rJvEQ$޹@~فܙ.~A;zmrYG {Z:Z3&E>^lO]At G]19v^?s[ :k1:mN1pJ(P5:qvȄֵ? 3wpUAxEBZOoh5ߵ =Yo>64+B.MB7Oʪ#TP*~_{ѵе_y=a\/zQʋ`_7H]Ta'p kL· BN}Ka_5hctR5G?.kM*tVN7/_u" OtulE=+3ZEQU ='t"."Е. ێ\I_fHf}}L3MWg<=F~shh6u 6u.yoAZ>턮+R;4-zEU˥! Q6^--syfދr\W4TbuaG:{!yyz[G:4Jw[tG02qwEx5/ܔC7ibȔKI5e'~]wzyf-h :62\#Ԑ IR];梯:GU74;Ok 9Q~3]וvP2I#/$* :A2_[pThbKmA͎$onX&ξF.KK)KrX^NqN=^_"- /qId\Ji=-j&N}HSGv Y )ȈRh[8pXw y)Kҥet$4LuK1J2_qt)+ݻNP^'pⷧ3fEQ#&hVy(kR0xt)vs9эYAff聮KXT:-1j]`$5w%nU7z o?7| I @[:o/.@*r>R&Ӟ)7y AaZ)hF_,^hDo1S/ȧe]Y *z4h{'@7kRg[z5փW-,%(?\:6 ǰ)=h!*_RY5l'i:O/)MԝE/!-0~SdWY@X_L!| wLU.w?d~*AFO4qz#jN7j} ^\7!g5x|8>\Ma~ 0|_oE_9[ ?Mٮk~.O'}g=Z?Iu ˈ/:;#"T/㯞 TߏX%Uc"ۨ}iUޓ4AS"*ֿΔ'r~`C) \d63MnRYc\?oz:>o-9$%V3_ ~OәЭ|$_*D;SkVaS_kVηnKݨ_kttf6ݹOD MS^x.l,/ŸNjFy;֠jتn%L9F!)Y? N[4E}׵|Hz+>ӈ3M ܞi|KQȚO 2|OBχ˱_uWsr[c ^0sW䘩kŃ%S?uhOV+М#(~9d-wˈ, =_PY- X9B 5iwc 9im|o-[f =-YWh~>YΒzƧX 734K,SX/@wl]] }?: 񽺺,ܔ]^`(8셰FWAjj蓳 z[}:D2я?,bI* n&v}Nk>Umsu1S ֽ,h@ƧhhYm%~#t_4p;:I HVAoٍg ᚷn)ﱈxȝQ[.4 {weB.fykFI9{>a8V].QODՎ1%>WD:~ ->u25:lӃ7 }_ ?sB:"ev%paNzZKA=M\%Z S׿54g|ߠs[j#z ihy5FkT}̂v N?wRPY_vu ވ\_(Q{o& u >W^/KEڗݳh -zW'?-κezTN {wAn 97S}-o=@6{% @vmr"qUd'156 9O?/y@Ikw r䷿k]z.g+BJH vwk̨&>Zl/-%XPg<{RyvdD^ {-/Sp9O+V=`} DK~BӁ$+q B]ACOD-&zak6No=쭝5dfHТ\D\N{7򤾗ח4AEG~)R-MC3rUzz[rcL)rFxc:ł^*I1X\p:ىױ^ۮPv6` z*z["`1z]מ<נ@/1hQf1VY7];NZ>b Z"fr@%gݐQ{9 ' yk̾Yٺ%%}S-"κ*hFl{`qp:$y%H>kT*Zz;n2%WɅ^EIR:޶{V5ulH=Iz Yw_iUz7|BKd !tX":R)쭄1`Ksg~vuӪ2rO Q )Rivp;nHWO7lOz gmQ-6@eiB{A%BTۉ},UaϘ"8|Vgt+%mM%cu٣Nĵ{_zOO%C?LiuI%,–pVvdA#diZN7C;lʴ ??Bcftv3# C>'ѡIڅ&͎ZA?:, !rBokV`Wkz_w+V*`Y`D]d\=?sĤlaҙ"WIǐXOt'߫4jaR0}3XGfX#VBX"6궳rcBkd,)Y\Nm>,1_[l׶6a ŗZ N_)Y&,t'c|kJHuWC 2M;,V {>ȤtW ,>gI}̈́ kWiOWw"31wDfwJq׸akıab"]G׈ksП-{ny3`y :dh}8{bSF;`%-2Vy-twﮖZ'MDߵ#GlȞ~1ޯ C{'vZ4VT>4^ \A{cCFRPaf7{V'Q=jup_~/{jI{Ü7 R(8f Ձ ]oUc3vǖ؅?A!]z[2t*1},9[;ח˴(gS2qjAF/{ġ]1/~V~Y=uԊըbL6U~}&21\wDޗB-W2rz[r }|b5>b^5G-'F;oٛ\d*{&F0ĝO.]#@]-m|CvOfco h)-]MIC?Lݥ:^ !>xSZj2hhʸ%^W>V } tFB?+L5t&7Еzאĝx%O)%]wjE!)B'Gǎ}٢75e/;ShSLy|5C }մ M!( =WV}_F+I8c] bZ ]R7UM@;2A+6;FQn*޽),+SxRReIͻ(=Y=y ;9KK8ⴔ(W+4OޑӉkMnl߫`S2C⦗J k?KU ZGY zdA=?FqI:b(2r>s,T0u;AM_e~5?Sw{gek^;ҁWjN 8R>]fa藺¬}@z{ _!F~Ұ7!tgK}=ʱp^CgF-+OV}.?3>6s6qQ3*w'9'bh/|]k UιG:  CHӲ>55;<ؖ`A֩^mvN='bWttYڔ u y!Yڎ<ێ\ c7Xa:Ē b>·Urw4Jw[Ә.̧qsyte$Aw "{^*>++o*i6cfYcv^'>ljCa/*<1^CA6Q.!Bo(;4[t)X: :h.]ѐAu66as2huRn]M:>Eo+6GL[C 3% Iۿ[jxg[oO iT-2^]nDgȒ[KY ; O{l}v{B>RWZwFOrG |>s ҡ?T*u_gIx|(N]rE9=;vFOl<9il!yB[f "TC>3ΝuFlڊGCf/40"~w{$X~N^Y-CkZEϭ τL .Kp"Gg|{26}F#/#J1{>J}Ao:Wj1gv/g@<Ǫ_`':j=+"ԑݽr{  Dܲ ]}vd't1eZqeO#s+}[~-\Fϣ6{]~mͲD\9T_[G@;{U/Is]ή :>jГ0#*ЗF)v%:˹v8=#Ɖ0͐{J/)6U9'8sD8w ^:!w:9لXV``Io!"o}3M)>!ޱUy}4K~TgK/ rDK`)^9-}6_2]mv`B/dYX%ATˣ^?b/SLhJ4#c?h"]L[0l֟ȷUFak:G6uVlaǨ;* =.ܠ1\Sܸ;val~LXVO/ݤ+r}Xj1h,Q6./I81юm`g*z!$W.CyM?Osؗ ۚf}dz4y$سq-Oㅾ @9>*_ԗVl#~c.8뉎jR Lk0,ck]߂!3ɁtCFѧp">.&L}k>bo`KOۯV@^ks+B<J{CTx[gBguʄ_KȢKgB|K K.`g"[XRUkjԉgVoђ}·T٠7ACV~ {ž\ZpK* ydپ%װ}dfyqdS||<% ؞Ì~ ӯ?kԇء8.$ dZ?n=Kem` s/ %D?gyYg+0!:]r@qf3prgkB?Ckč%3l8Kq,lYk8劾F)?< !>zw$*ET䗴P/j/F8"?5CSj*tVx~{ïyg5@7kwOzZW.e=7u6V#~r菶fu@OzE:yN/[gCQڧ7eGRz}}'awchpk ϧKV,@$9y49 :Ҟj"2u,@g T4rhR9 T~יDi, IRa(BmצPhE-}`zv/\D{{CP _[LQ!'key?ۜdlG'xCon~;@_ogȞC˸.1G & j& &t[+cRkٯaK_$ 6tN}!pO̟?{<@7ϰ)#DWG tL%t>sR^_/IrDOL֠̉/N}Z;{q GЛpMsnX'Sqz ؤF4ܒ"{Cd\>mXna]bq_OY%" 1|Ny:t}.J^EJ`i UgpW?[a_|x ٚ(p$5.Z}1r)~H9hYQ؅ t5{N &3@7kVX[-ܬ zkQE_V7R2S?ag‚fj')b!|KAV*Lv&.d)@_U"d}iQFLz*u?Зzoݕҳ! K̈́'p7{W)+7pe?4/H/RF.s:fm }tR~/!f'໨T#?ӴxL:$;[nPQFM}YFT]ݾK *!9RJI_sHs~tυp|9~*hfpY֗^nVMRlv)rG'E|G>x!nk^Z0tku&¯ \xiUcyLri3\яjgYo 0}55(k#%z X%O"'UH6Κnͮ,E5W7Vok߾ eo?Fx+} b3Dyi|u+t5l-)TyUWUMg<^&s/ C{S_3#fP;Aٹ[_BFpO"MKNȾO֗]v)9o>!zsk̳W ZgP#cȁݲA]ݮiVʗPߨm~,c:7u tـΔ%Eb!'b =EXEN)hʄϕ+,,EW R,\>?K Trr 5:{`B ]b3 ϚD^Vomi-*,[ʈmyLnלE9c/,kbҡ|EkT 2LXF0yu5d(zSՕe\k`4͂c@Ng' ȯv~cNR-U܃()nz9vfZWBֽc|{GnB%}\f5uz;u;^2vhv߯ 9BsFf`'μs*ڠ3|UȫZ[\"Yqޓ vBO֤3`)Y&*;8G3_7rgQJ`+;;vl@[^AS2[._.n_,t}a8y;678kPo .h1G\] 6y;p KcOf=k*?R/Y'z.ꇵqƚ''Y گԁHjgq/;| |+|#SG&=^S(b7[ɹbϒk{:[4a7)Ϳq50*[f (M<\49m«F2 90~(RT%9Vfaq݂4 E"^ {97W};L BkRLOO*!ZC^!zyz>nj\ ZLfiN>d-|4 ޲xuꡢ wr螋Q~i;{fڦGq@ߗnl+ة|cojGv+1]%vE3'tZz^q愾ճBҟ9[A-4F p~2~,z z?]Q $]N䚕Cq^WĠcE^!;CA` `S=^^zi;zփ rד~b_$]Ndѷ[L97!gr't[CJ/o$U} O]Rl|>:vAY ]R PDž>KiȳȽo1}`dW9خ'gȑ6MdueiǦ9}qLjt)G' cЇalFvxR˳#qsNcCk'K>d׺AkQu6?cZ8.3V}B\64^fߤM. !ADn Hf17LV'f#*=@ LEU&9^/*R} hЬ7ØWd+|*7貚՞5k;'3}jW<ܱ` ޹E*f]V%:e܍+.Ro<>N53t$)3e%εfI>2_fZ=yx erZ%G\' l4 VJE11]a'; ylmIB+oASľ(V#/qWä5*%{Yi&_ɯ@{ZcN-JlV}=[ީ/#\ഩ1,m =$pt;<9%}D"Ӕ%ތ ]3"|xR8LM\6?W 9־J;Ab+ƐSXirLãdSㄾM[#}Y!,ݤv=}pDEjزDLU'+!:2m>;lhf q1'?6Џx] =姶2\{|wd G}s#$Q={fК~}߫I*klB_n[T?L l =HUς)7 kfzm.~KIʪ[Y3P6lhۓئO}637ў> K$ZVBo㏨ t|/^%H1}/-ɯ +QrԚO ~l% (4 c5{S71wE6)eOۯe[o.Nve xq(kYc/sjo%3Ϭ@!?Fl{_kE* VOq5u&HnY>szAOu})NUlR,^,L/?z&ЇO?'yd-4|=|Ӕ12/uC RAo~l;c{n~N߭K^6kj\u Cn)M۹_ ߭ofhYrFf}~Pl uuv~Niؙ@G|_~MOMZƋ,iY:,2p&.d77? OI jn4F$֑{>οVA/жق7l /,X\|2Q\;AY_яY춚Fɰq)B\c#ԁ#ޑѷ\WZ-rOV|ҤWi {aǯ$ ZϹ]b:՘jd^SJ~i%ͅ+ E e|ʥП|@*cQZ}V7ʰo֏OGƹDdH\IsyzQWl$Ku4V]:4hoiy/n¿(4dׯC2l #!xq2sީ;MYI| `qV×96vqB3| bz;}do#@3P@ed_z6>1.zezrAK4qL%O/K\u[p~3 $w% v͕ ZRduze]pNޣ/8poAkytE9>F:+ l73FIrfj>/U蓽5n9ЗXuz3s>+*{nՍRJ#S(TvN }6BkUs.0\.r#4ތn$hUoYۆ;O䒚h@Me%5,鼏jg -ί tϘ%؃yDR y:2ݨtE.E:KmrVWv@' kydYDvOcX ET?9bConvȞGʐ 8=ɏ! 3L8F!%6! *U ߨ6(֨+?J`ްk-O:v3Ieٽ,yE$(m CVU }K=1f%]J]Za}h>m$c^{mRjCbO>GЛc'vDlLYW"fde}/kaw4C9@)&>Zm;1-Iˤў9ˤbG F[V:6tcKORO}6Fxzd Z_# zemБvm$M,OYWip({"uȟH©TC^ZC {ˍ+tk<ǬL";5 .ӵ9;a>3'-6ZB \g"#}ZЩ KBA gk}\({/uIKavtN\:T(p؉3<:%W7iwW F^sSO#il<\D;]cֱ d/,G0n.hr mNKit o@|/ =Evy%5f]`%:K%ڰ+%M)&c,ٞ1 2vˠ~Bo? z1't|kI.c}cJԑ`dLjC{yBԠvѲazST/yN眠Tn>Jy\3JOCC93pBЪlV^> wd2~ʞdri>&V Ncg8Kes:h1L7,9ąWھTy[>nq.]_{VT-:Q\ToGN/xj~c_j[הz Ow~=ވ;:ۢG#Zb 6VX/jpd/D^{ ^F'hGps:ms~R ޢ(?r5#{Ueg` ݂1EBQYy43gs {T*.^^vޟЩDTwm=_fY#' 3{W[r=V %0RUubF2'v*>ZĒqB9r/"/!LTOz`[D!fgҠ?S׮{g )zS"zMiڴ!צLc輷(K݇2rwf'>I@J/.*%sZT|0f5T59X͍dY;tGF_ɏ( Z:FeVK (cˀ۠Rd *c'=P]σ~Ϫ.! 6S- 40DsڠJ~J}&!=X;h ^`%hy /}u;>/fc;Q{S\R8J$i.Il >tBALkR26O7Bhq˹ˉD2vxB w:@zUT=N-vI&ڐZGn }4jлf+Af6>WT#ܠi=w't#`KҐ}גJ͌%㍡I"MZ҆ [8Fk$i~(DwNEOPW=(3DtAf}f_%*;0!{ENqǧȩ+tQ!//JU}:IMAͦ:ZqKm_393cCY }gcuhYtyn;flJRXTa#Afuc]'8G_\K~*wly^V/AJl&d&Hۃ?!o88Ȥv֞%;2WpM D$-a޽ǵV3%!&@tnkk-C% RO^~JkC/nB+Rh{:zQ[4zŮLO ;џ9˯WhceAI6>N=q'p_g-iVsy}à#$ :iz (W,8)[^K,4]j6xv1 \ڹ b$؉L @,_} ,y;eKQ [/9u'ߢ~V!3 沎xľLPk6y9VL4{8au0v,/o%6yA"^B;q2g-/R: ߑH^A-/7"Cu^3 C~0ք>"lEh?ZtW51{]2 S(Qy}$q97 Io%.+ ruaJ23!O Ԇڠ\}F"io;Y0ڞЩ=+Glwpz8FVޠs}BYzS!/sP." ~qj/?/)Y5yN_;o C{;-J9\E\zdB\K՟s>J$y }KERݲ+ zczd.בcLK24lC$Ct~Z:,gzzurRj/!pen%I=7Q]bhwFB2.ܤ"y-;tB87^'t PN5^xc_gdZnг?3<P$ރ/ O/n5]bhy"/e񓌟WoݷlIj6bi'tMY1˺arBukثV)*kTG*k[DuSh);g\ThN\ie*nu˅ܰ;)=‚"x'-8-BO{4L2뗿Q{chNx4;V-(%3A $kCdvF>:-nxgGKN9)nvqj{;{(#>N"*{d@{#_us M|D5#S 箫$ 7c~[l|KAyscbfe5@NĺSt|5}ig]ǖY0' A暎\1GV'Uv C>?"3#ƀKuC䉜~w9&c6e5f#ȭ $Y F/hhgI)1݇aY#ّ@_s}ľ]u[\ICg.T\]2mY۪9mB? &mӬO{ݰELtا"VIN2Nmu.,905uj=2r\4d:;4;3EfiM]đKjrw&*fˊ1]= {ZS鄾aVT^4w$.)xV:i}a2 .;WtS\T {/jY9t6Ӻ} vq ftBN1jP'R|cVlgхU.'F-RN;u65ܥp2{iB ?=W_3,FЁyqRxuن-lw! *ҟNCSE~GK[f-JZѿ8E5 +pɵt`!_@{x;𖄅ZZ_.868m僐M).l5䛍nfN0x /?QcQ-/r?%W䒚4T 6&o$).p*wʲZ8K-%ng >ADfE݁kFc 8Q{|z Y9M\gH<-0qZٸIC|Fu8i'c¯Cg^#L'?UK+]t/<{ #_ ٹwPX&Pb] z&=džJ<?__:HN^aeOkm'Y>svffltR,SWǟݙBt>?FK:qa5f_gahJٗ(Z%v'1p!^,-oovlXd/Z;)w.E5g7ٌ]B^#o*w.3]C$YRX3!w@n..܍]y5ѩ'/ Eebs]7e-p[D]^3En֑z`ןD1:to _^Y%u!:{aTQv1_jRҐSG%#@xF=5{qbJc & [@g7H/NŅ> ѷk$ð}fB3;l֡Ә>MsOR<ؠsw6. x%FGl|?[W1X |-O䪔ow_s ~ 8:ߨ˙v0oU*~!|8C]8q6Fvjrcԟ\POT995D\+U9$P5~뉣St*೚_^iT!ln ;r+,t?YtC.ɉȉXiB,a3k螯c.ipI:a@K(y TZutK̮~U 9Gl.UKFTN;4kpIY"^UxUx.Uc &;ɥ =8'rG~.DE~HIk+{n@/<%~Q(>W~*ֺz%\ jc쌥 s߳ާX= d'ow;ϏTM-.J r^4#f>~ hZ\qx_t=)bD^,0P[8܇I)ȥ'I X֞+(AeCb"76"9M!W!K\;m}8rME(fSVpr$P~.~ 7-pF5"L"՚Šo0?eSػh5vyn{Eֽ12}:EgrX,e;rQ$]_B5qdFNO,t܁Y8e aΡ5_N" ҪJD Ƹ?iZCo)PhиeitECGAϲ|ρkm@_Չp{*H% h9(g ki5%ޑZ˿Moxo['zb[k_*I1Xd-WJ~:z7qGn!o(<{ x^r ޭx&HN|*nbiрVDn uOQZ9AK>C/M6'o@y%,~Y&wugyCfE8=>Pi [-9\~4*!XWW S| p]cbجx]EKİ79!=>p}KTi/PqIltܤY>rAr=Yft󖗯l৚ t lafF t]/L}gg"ސo}|=d.5YT3fT#.6|?\m,d[Pʁ]+8(a_tFf~(;uM2ų/CQuEޒa6 JH58t>/_CY}cZ|1 !i=Lw'uȏI*pD璩-ɺ@y27b}%["L7ܚGK,~/6 ܗC6B6 ݁OS/VBNhDժաha-X8Xӂn9dS(4nntyhlb:|ӡDhr*UG326E^3`?[+3A#dO='%[W5KqtKMR;G߱wk2\yܫ>SNAH 4RCH|~>]f5qXXEL8 "?Kp+@%5R:`x"xP-K؏E`9 MszpC{ ݒؼjŅN3:tYv{(Όyۙз D#`VoM@vֳ{ }=I-fѠמ͙!J[3$hWh"lVl#;nk3U'T5*n-+c %|>+Sj;p33COXh2 7%'4\KX}iAFz&uZi"WfޮpkgOw-w5|}y -FD'еo;́C5y<z.)m:3Dd +5sۥR#gZ%ǏDWX-dwI} C"}x\4^4Wq[pr 4Sx>34$FǑۖUA4!d%?Maఏ[ xY E[:(N^NzˬGn` 7UWRcZkҐ]%zיaK,$ڞ[t%QߑAKp]ڡ6C|gM7;M{ͼsؔPY1亸}a\]'vH>锃Ş$_gua+pK.陭V^OP_] $@)L9C$[B6h ƞccX;!qX'\ǵ~>_| }Q~7YkT;z^.-03:zd|M|4\ו+[Wp/2.~9 tSGZ."#Cg~"yLo Q"Z6^s QRw ]nؗoh%J.)R_>-w@_ ]0t:&+D*r'tY7e{[LQjjk?Hڋ"ڟ)6[Uq9ݘ-2yR9C*rp!rf04w&O6 ffܩwj.']k!/z!xK~܁0SE҇=8"ԑ32X^]77&HyWȬ܁k7{ĥ0ʑ*pׄ<flp*SUaEc\+tIN!~6Lŧ";Fvèi]sD~G.?^ +$n~jlT󕺀m\"vy\xɤox|Y|Vpw[9c=0p@NtQ6ΚAQ:? ^c:Č-K<]t׳}\}3}^cSD21PC)n6 yWzW{ \6 ; 1~oЋD;t0@yr '^D>[u'#͉}H9cjn }w?7ߡK`7xv*qd-0z^xV^-NBqH[> M2.ӭL%A~C}:C2 ݜbV_Q-~Tq3}̓ޑi+я D2;g9:5%Bojg7Lg9}vVtt2`$kG܀ۤ=n} }_aR anh}|ɹ'Evܥr<ʑj6wT]d#0x*t!7>yt׽qU\QHZ\/ȗM);UB1>r>C]hŕ b]a7C'i$0(JҲ*&*^fAs[ _B;!_\,|P V:F~>K<֡%tafE3tZg\dx-Z2*6[.aqιfQ ?iӞdiͯȷ|nkZg҅pqA>)4عmx<,'d } g!BOT:cek>΄W #:]4 ~DZj O܀h>6܁jܦ zX=;pc3Nh bXJ#lt '?LVNQ}^L$(p-job~+kh6eR6ԄM5Fy;ءxܑÏt&ߋְN!} c넚uiCBasӚakR){ߐsC\~4 )CDOog1lOpZh0w_fʢk+烡 Wo=xiMw>\eAoy6 Wx(x'=Ȓo WFN7#p3.(T9ZMdkͳlܑs~tJFn5;pMV=VYxiNŬ'bjV }\k>]-]. `$$1&`[̜s̕W^}~ |jVc&tιD6_OiF +6`. %r"HNEgF+Φ ܐ//g.~,JȑS>>+.GG|F6*>!aso(cF.)a.|o9SUV?d} fS=v;.rCyDF w-dGCgͳh~NTpR#?V׻6 6%Uzbb.!.p%,nǞġysu`P7N^Lh7˟^.)\ŝ_Vv3ni6qnЭYa>|%ɑk9GjŠ`*=0 "]( Ȕ ,w1'R퉼AJxHkD\YYM##DKvŏ^q!zGO-q?m%s[ Z8j!oAHv~c"CR~(ܺ2[Tεi% R4]z?˃܍#p!c/D?ZF Ĕߛ5+,Ъ/|SYOF +=ȥ;3 }c2JpB[w^זV\.$BreY] ,"%xa礳rn|*A/=w䴋ɕ8L6ulL#FF<9aDꆾ-VHĸc(3He#ۇx9}KX]w0AzNZ;P>D1ҵpw{Ǿ.޺2 }=&@/Z ?Qu.zhB'P\v=+C.7w-f0.\ -L}ֲOPxȁ 9 ]bEȝɽ:HۭYYڰR&? $*+wKV85dQ3[˺+Yͭ@/zxwAcΦA8'Rgy_ !E8Y34ZףR-n4[HϨ吉݁R؃:/{yu{d 8{b$"WReFmn~ Ϲ XTrỴCk9`)]zםRa˫;~stȣ?rBT|g|)E촨Juyl%Ҡ)D]m EoT\|?e GD~^"Ӛ-m4ŒC_!a)&B}rim[{_8q+fs~(*# >/]FnsKtXjsmr]oчJкDDZ|]bc~GW䜷כAr2\S [ԥ{ev% z= N](<ŅΆ;:<7e9y%E~>u!q[~d6E՞&_6{*O2#r䙟d`Y,} |zuww F!԰]v/ՊX-"ryk|ȃZ:v!th\+PK^~IߑsmYĞQY?#~XuW-ɍ.T/8i,)eHYޣ"{4+\_ bVH T}ubU%~b=G3 G<'tgY`3u *ֆ .#7r2ȟu xF[zy37j֐ ϥ `kBꉜb":NpjҰCYa/\aB\k$ z:43]4Gľܱ~^Bχu8$ZHdxުB;-1BnNc~Le,*h%N]ӑL! 1Eric(d[Qqz#uU;!Gv9Cѳ%sGG쁮]RG쩪q \b>~M.uqo6F@7rYZdz!+Lʍk֝EF~9zW!}i8i$.1n+:ޮ`4їrw{5i>b.9/rVޢ0M"uBOy%03Nw3M;R~Q CIݳ-.G$dɸ͞ kL-Ggȍ>F=HkLyЩ"wvc Sh}'cc4h3oh_ŪR5o%æ>}BK2VZ -5})8IM?Mx)^^#A |?jDwh~nMo5(0kglgvEm(^VZXo^m s,OYu OQf䁽 ^W#d;wT4^b1)щ\";thFKTort ̅q!6yx98h#%i>^S:)ќud/p6(*ɟ[q "TTz6;SIo^N=;$RH9Er[>:poAh?W5d;CEȵ~+/.;qŏ޸-ҏsٖU/( ¾EiTs8&Gqtĉ}rOE?T';QZ 5דU~[PHyoE~a_+<ӀZotZo&?v wC:s`@*z`/+ʰ 2vT]H_D.&=/SSà tF?V(i_փBTZ-h] ]dF&`l. *)9 ]`B2*v;ќ>wN|'K|y+ ln7<!g \ x WdWt񁌻S;RF^YlqYOU,*=:;o?1貿w3x}\#:4r%Z|F.hTBNd\A8%).K+~/ܡC!Ӭ;{>^E{' bs ЩXK+/ǰyx D]Vau_h^zrwhbWninYުs .zQuS :7U~[:8{- ]{Ξ1IШ Pm6xQeZzeB%#aK?:ށ7v !&o)4ƘUKCfљ(z#ղCg5N[8~'ǘ4CwnVg6DIm(.C֣x *AѓϷ?M~Np lz\[H>I~LQڡ 5 |khcӤ^![|)ˬ2u]SxUn!hVTϾ`+taa'RWfNNUo_y3Z2Fbtϳqo1zD>G "A =r]||PJ+W/]} ө69sM>TVX .>i {Lg1d/hiK׆mOf&Kž9|/;Ju+G69sB^o:5N*иDD%VVy3;rtj>Ľyq ='vi.k[@3vxu\-?fzo-љ9/_ah~?Vr,)|j? ¶S׸MFXj;ߤ@+w^ =gDvj*,7p^&w 1B3G,LNE*txrJV-k{[{Wp\*!Cy^wS T%p$K zT{9:|&ⲣx XVlĚŨusAl>ch'#:q!9}lm8*yZ5D:-vt &k@Ȼ'r 21 < B|{?JgžW7͡D .rG\#'ZMv5ob&o9Vz4-٧x6p?*m'-Vo'bzUbda3-Кkq ]}>ZB~3>}*tj+i/H*H-gGB9qmqp]FYeBHNŢv14Sɉ[ ApWi+.!=i~po#؇.&tKLtBKJ vm ʐ{m40 _ \ZS㠧h~ER:^LSRBL/Kq>Ȱu|njO #s$˾5R\U ܠO,c)z,;"Nc cT%c"F@7\=)Y ]O4ߣ<&$$V/LwޒTՠ|[B^ת`h1ϵ  G`_H8\],(i ,( zOf]пgahAU"z@UdtV3iO|ĭN"8JT[kɬ*/󜂿Iv$Rhާ>ȫKЋPCBNkR26ʫ(+AKjP?.k_Af\Fi?6޿a݂kj^CMYF.꼴ʼnq.$K1$e|N2@nLss5`< VΩ -mȯ՟]giZ>.f=\~gqW]v) n(t?V2Vg񶯷`ʖ+ʃ{d%S;<1@hz b2>vVn3z}uݵKV_Y !g1$U+)h : ='ͮ1!~٩rղ{l:*VFN=Gn;VɟN7Fʆ|%en-V_]z&ϼoJI!FN+N;7uLKZ'mqYWEsd8[lȱD.`<NZo\GO$3CB\ =σiqBY,ȱoo=ӊ}yrv.t[HD:w\WZ n`En+v3DNW8RU[+47 {݈F>? g.YJ&p+.%-/gۨ絗CMU\JkiQ z90 yCDfЕHsm=r\@XQ/]fl0R/=p=ȇ' [_窂RG}K3dM"g(QlC =ڎwf/{qC cj_CA`dؕKkݸ~YBWz X] ةHݒXO%R[ݎ, qedHcɗv qyQ4My q@k.L_kl%4=Pt :=#: ^l|8@7:34CՈ1WDô'rl$g쮭as3 _s.4.3T^"bla;o.G1߸[.nW9O:q]-#YG %a uW v:]kB=4쑗7'}.3tzXYO3FY[:28'ȭJR9D]xfWb.no2>:CwKH[p1.pҡW Ѡ/[,FvrpjSaHO< CKv̿FiU'B;B8:yfStzHLz#Ob׋hnqQǡ!8<B+l'r z ! Ֆr59" { <䃰 t"Նr=暫 =M[ :"oiyOVpzmܜ=^Ͼ rLEo3hQ*z!2Ͽ&XLM>|떨 \>]g:#g]q(mOQ_}*arfm]5?o_ah |>̍zyyV\ༀ7Oqm.@Gx(D oX١+\w1h.ߞQe5-HĭKxIeo^#Ǫ{_Zd̜AEbNg 6Nmʀ%r&Bɠ|Vȷj :_ȳR z!XDΑĶ@ ٓhb7_o#O “rk@wcK~LsfgmKYbX+Ӡ!qzMYNtʥ!{B^"gq hFF9},UU$O8==b 1TFIq.mQWCn)s.JU>|:tno-8, ^> /A3$trVXY؊39j\6S>qkO돯dT|%V?Oƭ#{$mNk}CW$?C\Î\&=%g t1Sd_΀J_0ydxL!Jkz5;= guJ*]\*!SyDs N@zflN!1B};!4E'$:3с{ל}@Zw#Gk$;8q |ć ZqLjR\)PSAY齜SuXzWSW/'_0˕Aw <&AjxOs>B~i>+pjkRb K 9-Q"nT!ӆJ<;_| {^v u@d?4qYYId;ȴzDi3SCi*$'r^= o bց"uvL5@z|tr8oVOT WCO%ˇp['m,Az;9@ͪ<|`Ώ>CainK|qOEJQ5}}nEDW|G8vܷ>"`'+"z[|qQh _#'FEw5M#W0 @YK ,IFѡ}eOYwZ)!R#O8ՕF[9=V57g8QQ"%,57w_l-9"_a֐qGD.Ace+ ~]EKXv ^ݕJ|A6,ݼOxgBܠ ~⦵oVq7YYo[7Ϥx硳uqEpvVw4:%nu 9v"%}0:!'UnˮAOy# u;%;ncrksM4N4luh 2t Y d||CV8A{Įv*Л*vr nrDs|E)Kps7/%{TbM'6x]=7ꡟy8nӶxB?Z.S+ v"ߺCm|Ns!p]͠uѠJQ>;$ԉ:w nȓCp -9]^cfbb7EnߧBnNX|sfWES[rx&=Ӏ~<]"= yjf x7HrCoT:Kd467f7?ǵң,}'pZd3]A6y6m^"ʼn#ߔbS <3!',]iS<$e#># -cE3AKxy3$&$q\BOkr2[|r gg63,rv 4h$F`&QAwYxo /' /O} $\˝z7 ;[QY$D O.^e\k'pZՁ|N|?E |[8m>pչ#B-CK*8r9r~Z[ .Cr}n_i3W tkN:5qГz^%]9""T ܖZȋD.kOwKIg-wy)EfBl:YHO_N$fxfoPtkٍ3d"vOP?kNW'Ӱdy=j8!'Z]mqRL3of$uAծgZqH6.ytY#BENQ;v '"C콡Q\:OD {e<_OCUN6 W7g"n97CיWB:Kga`u*"v__noyQV*tDjǁAϓHۉmv+p}\u9gYVz;g]֠gp"w7RF5EI:JqeP~A{(6d=1#gN x@~ \;{(6 a͑vNoHirddVO!D[u#.rxL-92t?29Y8o伈G |~9k. 槯XpN_qqU\''l,%BδG_KZ~(Z]Mn)T =R9ʙ>So=z.ogBHv`/e˹c3J7Tæ } \GI?Zt`NuB\ r`! tӷY6?|/pFexXTNS 87tj=d=|9rE99p]>`# gnV3d̮ncW̓oB#W 8<,$&9n 'p{NFOD Ϊ⡉wY>_g ˧\l:9 d73\V<{qЫZ-^MV̎ ;>?[\--nCKJOv3 ak΃;sЄ#F^c`+1*7rmOmX[VCX% ,R2o䲚E$kAzJXĹ"m> ){l8g=Mim?:Ny1e@69G(,Z-ǭ_b85]^^B͐?Oq!w7y w豄 yc *Nrk,[O{i5n Z^kj87tFN\z 0 Z/xF}f rUrƶxC-5'*1iSO_5ߧɱel>ݣܶrie9$c3?#OH07Ϗ>>hM7r[d&à6~?ߧ5Y4(AJhn-Ҹ~PkV\78 -RC4:kWю6 og}ߩJc8"57%2{^!+.vjWMݧubKC…>khGZ7bfFLD{,L|@~@$8+:_͛6䃊*?{|N a4}O^ϒ.z4%'}+S y_6{Lu S;-. ,_ɼI"WϨB-Po]M -*?=k!ѿ,_Q.g5+Qkn ĉ}XTc@χKjtĿK`> !ޭA21r|0.;7|u-eziuNGỈw~Gb/D7͐%8.vLV>?ϑ 1 ȁsk(eҨ;Z7d솽;3ԑ&Z =]:wtt J&hVB}=!E%d蛊QzZdZ=@?!6_D}$Y%𘦽C1]@MȐayznkzˍ tvr@f$X}@N4-fiЉ/=WԞ ~ꐈfEރU M/9]_e~ݐ${R:tks].ِyAήS3 {a4heXfbH:!?N4wǓB3hX̅d]+fJʈ)PHrx'>Ǥ *Qza=:)teu7}"[}.(ea2= N{+=i?V9L\C }k{Cd{lu, 1q-e&s@И@ )gkGNe:\qw~Jᛑo[c<=m\쳰 I`l[_ sX T&2׊}>I}O$Sbz@sS}/[7r>LcTr;>X50K}LGwa؝u[063{αJ˯ݿ@%,^azci^^CI3p:ǹ^?;Ml/:omj8FJ}|{0hR]`LٹzŪ% ϘfAnRe&}` ǬiI/sa+ȓjXj*Nؠ~ q`FC~\7u E7!P^karjyQcgs҉z׺Torj9[w-BދY+yl OE \8}EydZǼ }1@r>"l87 #to%v F~L#?A4q} 9oBS#,Sbv|N7] Yoa}@Sl?k~ <>j5}ⵐص?S䇟DA!@3VP t3ӕA2 vWBz>T/z>*!O<|{8Ebs$ۢ;X \#;nB=({U,ux3YУfaȯo3 2E.#zn}?HFnf76:]1yX W>5J<ډ;eDG+e*=g=uhV{!C YE%ncCOܚ^w۾see0T\2,| 6sqs!4Ώ͠(Osfy$l@CLi7tC(<:%xƐyjZOlܩ)Zv<ł5MB۳Z27kv'n[-pNH}8Brp'itސ?My1b= w45QׇUDal =21tq˭`PEDN R ɠRF"#j^?,3\25_Nް<5 WvZ rw-pwgJځ{++v.>08;Pc* ])}@Nu`K'wtX?͞H F>(Nn9K7ʋΗDD:]%SQ8gݾ~ԉBzʅ7tn蛇&v!;;րGVq񅛗g1h=N;?"3c#N%x\o4iRrS3NG#tAuH3|m8 ̽FpdY?af圧kYg@K gno;mfr 7KY8b,C/Ѭ./ }ı7l_dK2}m'*|*Ohи }, <!5tɥ9f8|ִa~"15䁭ȷVOp }Αa7쾆? {fͱ5 ž< _ylh>2E1wcU 'n'!rOw}\^O Ɇ}ik>K!ɐ9qlQ֦ݕXt=Fvs*v!{3GFX6?rq;{_7zV/T\p$bVhyh&r`*=sJy3ЂN!-B5ryrān̓a&?|yLjֹ- zχeϲl}Ӯm@R薿뺾.شo[tl 0Vm%z^})7g/".5y5VIBA|2dK3O[Cin"tD,Y;GyϲyvGth]r!7Ye_6kc,N)q='"Yĵ_0(ibK<\Y%0P95BTF7>6'.7ƪmcTh7~gyç}*-/ʛ||BAM:lk]'GfЅD@d1[nIy\W4+y47'h"*+3$KF#g a=?P}5 r8,}@%c>y3l^e!@>c 䕧c '*$'rYF&Ejr*Z izzhBM=_Y3㻤#NE*x\b轡y>x2|dUj)xFq`Τ}&!lq>-ڊ}]Z\#6p]}g+H-CZM J$߻8"B63j1#燻5y.̰ q'p WA#[UH. FVj\|t@A ?,g큞f;h|Z=N)MK?TO{{O@{9o+FsێV2W4nX[^2W@nyF?*? x8c:|3L;Zl8-RaT8-}`+ RK/=|7/3}5zMk*Ug2;Z*q&+Ur[\װ֐Wb#߳ V7n>PnZj=f{gSo(Y@7Ksy ÷Zij96mRDž>#* q7pݦyszߍ.9ԇ* 9}q8ӒɇSU7-.U .;+٤*)ݕ| ԡ׃KgA5ώ_! Sm$\Slk]VWA7%129<ʴ7r{Q;/:ao"g'ݛfU-Kϒ;{BnxF~p;gXaCN/BD" 핍[|%Yj+eF>ߟZ ܅%cXZ?ꅫry޵meU#>ak Bcz r4|97pU299p ŵgYM2G\zfzr W㤵2kdFb{ȅ+^g糉-gy.8Eq-Υ[YN = eS"ǖ[ < xV+#te 'q>Fc7a>o3@7mmsWh 7g:zr~x֠&'-ȶ{.kCn hڂ/!i ʉX.D 9&j {%A\ {C.4_!`nvM[5bJ},;_iD~>Gs8~!w)\Ek^O7šN;KlKv YZZ(YV͓-dh] 6'k<:ڑG2._ٛ¬Kk$[wpT0惜};95\?DO,  .AY\|xH|#'.{9qg>E*2,LM35wFb͕-P=_5vnKδ(o7p;8)i}SHzΔˠOlyuXzCT8OaK_ܶ͗M|}mI g>JI!^ B4pFDIʽs }#t q NIi7qY*:eX3s D'X,6o'r[ <[3 qYO \9XcԠmف[۟gʿ΢9ro#QMC{{O=U n'=Ut_H&ӣ"まg\Ѧ [r7JXRsU'>W trd'iG9#G.t<-lN陮hU\%I,!j%w!D)v_ba}״Z^a]&_w 9s+?}y5D6ȷ&Y^tfnND?#w㰷'yVz~U{3!Yd***gC'r`vmKrیIDէ#VN֞P^ eRwXb*v,ǞW^8sYq=> Ve#X0s_gd)ҖNc'ёgYD^5YoeRM})d5?O\K4_99I#98 >rH!Qx2^5F ௭!Їc8Z/ C yٳ.(mHz{z,{6V ˉ3o|f,n /|z' EU!b.V'4:W=zd@ [J$جN.dJ͠?ۏׁ-f 'Գ" rEƳȧ#G܍-f`сL亁7a ܒ`KL8O#GRrih2׽ݠ9~\"S~9' ,J-T}B"+4 c]x*.[I[kuIAW$ˠm#?@9Ze&{kin-tlNz{$0rg(ۇM{]([ϻ Fk}J5hJ_%2r m$@o͹J9u5C7I5MD\&z! 3_>'#q{Kn4WE.~sX, O-\2$ʅc ӆ9-~^^R?n֐c-z[půYsν\Bgŷ[C.*@BI}lmVtBr'- 𖽸G 8ljmrҡ7X$/?6̥e}ܴoR:cYE\rF,V>li$_B ~>+U3AIssut֙"B7˟1yQoO0Oy5͌ zUɻA?$xA\a.Zqch:~pv]UF>[;Oe ili++tOe!Zg~,v確 =N` _wc⚝Lanv`9jڽϧw#} jۿskI|{?V߄]e؉OMWdyhTojMoG5=}Oh =lig/ W҆{f<ߠmyb>1nLI\ zTv )6.#Yb^;ڋ|e {\ZF|Xd&KKi9_pCGH3e~cf.C>j_=H˭# {_&&=>FyuG:?b8 .rV9|g FB=s䛺k(W6!K)F7A}:yY+˄=wMΞmzF3,b}U}<n14|x>6]^C˵Pc9rᯃŞC7dP/!Jkv^$_9}O P5^]@}菷uhj ۬пMKfӠԟ1/-/K h=) 6ZV~=W t|ledf{(L zLƞڮ3^$T*7v^0$Ъ)-t[(rgn1 $jӧUZGHYYXB>}`Yѿؽ}$7 ;r6h@v?X>9\xAْO 5~A{ rw@3VNVώ 9; rDݵ+ouVg4Đn,7}u3t;xL}1Vޖ`+ֻL҈ }CbꁞqT+DnK 3@`3`Нh 'n@m-Ɔ\+Ig^[8{ ~d VY)*C,AWy Su 4vQ`Cw5< |don=[z^T'5HVl >|^g}x~ŁkJ?eW~#1{:#!8G \}#iN*v ~/oNǗizUr#L^$rsjYn [Zpݻ]MhbTubEA h=ޥY,=D3ةd\6(C!Lk==}!gU c3Avѯݟ06 hv#2=uBtswjЕ1_yI8Za3]I $G/[w:_kjǰY8{^:x:7_GUG kT=r]u9.#C2K}?GmOƿ8!鏈݂Ʉz9lUc4GK]a{jp L7vBUhKOژDфd֐}})p5V ݇i:ZS.L->+U}NcλwU( 9LŖpU=(,bgK7>!N~Swfz#FfgID>L/躄 27W\[$c d7lu z.U*7tg -ʏ5G!C=WPk`Ǡ:)ݗe 2އ{kcJp 9%)oc2ߊZ7]iN#U2f ;{T7r=!Rk9tAëM:C ɕ3P/g>}S~PeU^{Fv0?/{ ̈́Ӵ%~QPFz[}ly.KvLиkmX-WU7iTWl-NHO!g\3S%f6 t|#1y"g3'XX>E_Ou:Ƀ[j&,v'Z,kЩ ) }Hk.:ms]VhL˹|vd5(8.#r*tJB4םA ss)->fߨ{:4U$YłYS܆AIQqeyz 'puԱS1y5䈮"'4N#(~CdCf]|~%՚g%tÓ#"g[.ϒ5}\KՏk8لy^f? 2p*N-3;k3{#8KUi-%9l}:)J݊;>lGh.2rr"'EQ9K[mݡ82GoTЫ-&3Rm/t ;Ov.|_O󽗽{Tcsmɞ)Cmq^RV9G5>M[OFc RjYɝuBnR<yir][b(^Юm W.F|oarM/w'BA|zCf !B*k!ɫA <^JXz+qn4w.|z"ڧ4%e!֊\;eQ:rkC}7%:cwYr\ojZ|$۝-n'pۮM=j y=KǞq{JldkmLǩCdI-Є.Ѣ4I 83I4q-N.T^HQ{J'ْkCzfŨIiW8,'C,➅c90k|:Q-YUg ]۳ANq>^f bӇc01A+I-,:'eN_:d腼MZ*OfKePETAE9+IE@$v"W 8ҡ'rg߃> jz xƐ|C_RȐ5yniI=g3UD,-R>tKJKVAcs#={lا{z!lFU :f0te5hZˏ96P@.}>?6w#=SY+VWM~l.!yg<r9 zYRIR뤭ݾM-iVzKՐQVPO6SB|!x," hCz!̯DTka kϖĪ02?{dvkT.g%}jt摹F+WaR:yHޡTm$/ޕ@s2׊6+&r"ƊJNSQs.pus:r/䛢Q!|Mt"ߛC3eAn=7|Rh&~LV 15bJB%] |,v[6FY*|F}}lõxy,x֭Cv *KF$/ .+]1]qeP،,t"oxr]Oʉ<*x )z('w˥Peь?' WyץjsyKV3-RsTpϚ8u,%/q*(fIXd]% 7E~>97=5+ȑ}. /mĵ+{ڔ{ŻMQ⬬bǕvuSb!Sd-S&VVnWĈET?ɓz=|W9B_Nɭ|꭮yH&oZ+_\f-[O-9ƍ;WFpB[q'vGEfY%l\W^|03e^-;,[$<&t|h'd 7>|S#/:VFN=lGPʚՄ%"_M w8/c?u3VZ$G_c@#EPUΒx>B{CP󃗫<<38@>.r[< O &$6!t!fu'ә\b\]9(dTbSuy4qn$vy}$#A/Q9هG~uD4['={^Kl#Ҭ){j v*BI9dR},8s svD$`/VRuaI<oy<1脢rY|+d6l"|#`Ur?+ NUo='pFv@G+7oGb .v[78:6Mɠ wkmsł5hn=MIp * 'n- >vyy;}+%G :[Z|XVczcGNL|"L\)e FAa.8Db}"&/DCY!AўgH*sPMŠ6hVꉼN/+r_-i>yhNZk~䟐U%Dq=#Kڐ*Nx4c uK>E ꁜ[`#lܹ|"Jxv@ޣ7D=$.z"~)dZNv_6#xzK^MC-:Nc-&4>5TV?& goPy}(-bCO,{б\F;sBe:x!.}o/ߒ9@5\ZOŏQOs2UpKVxLKF~"od#S< CO'\W>B?CǞx =+5:"R.&rT}* I[=Gh$En"wQ'nFn#"<x*}mk(uW,ǭ/ &' [X Q V;xW{X8{C.gi fb2}Ċ\Qd\N^H 3ڐl缡s0HY.9"dFgE{n56W"2||.@ϧt蔥 #Dr{3hecH46Yĭ^O zm&'h3Qr,o5B"ޫ&DT+,-I= %I>=_Ҙ<:m5q~M.Z@.[eA)ct ;rϰyH-<*a[Wu-:T @Ny#P| Or7 mp 6\5g<׎\mޡ|aO,Н1vb\]%!\ 1yrn>fNǍ<9 "T^<9Z-^^[4H NaE=4lC#\酜x1)"ţWF!"&\C g쐘 ܷsݗJKVrY+ŤGD>qϰ9sva`Rb̯0snYm'$|&9`o=T:v`)ZV)&''-9#2-Yv8MĐ>!q@Kfzȴ#DЙ[12vŦo&} lr|$IdJF D?#-L2"ȅ'qqkC/4[M>t2<}/IPC-DyK)nqqP C'zOGZ?7X|.?j3Dt!n'-~ x@kͪ?LޘBCb9a6w; U1C"7sw\569̀jm{!B.?Ɖ|XQd_Y ön0פxY~\-P[8d1ʈ@=΢ ܍kai_&,yeiy~V ^b|rRC{yύ | BISlOF.7va7".]nF<Wo*-"u@iz#Z)g;9E9hiL`:oxG<Ņ>SA&F!h}.?eQV@7t]}ʡ2 / E;;58<00,I>p;39%щ\޸Vz=%ϼ^:tH0{K>dwĖS[ohY7_#~ȠN Zbrv·A>ՙ=;xB$v bb7ԣ x'vS3B^cާ31R3K="eK8#AZtcϓ\@G|llgCڕo5XdM${׻_-a_zV!f1Cn>'>LHCnjgɒ:eCz5\j+`k8Axp<2TǗJ!X;lF`']$ُ€?_{Ƙ_=*,#)3 te 3r&-g3 1 羏md$;f3 m5&y[[ L\_sГgՐ+nk.8=`z@1N"uAf%.(S[ ##gq&hjn3idՊ\q`6l π[JoӒ0?M"V {  ۿAuZKeC݉הɥ.ܪt1 :Yt#{FRFάgd7̈́~jm4~WKS#X1a|fRX?$ٻ[Lf*nlv^O#qW/չV4b\l-u*G-1nu@]kŜSܶT78cR[&tiLՁt̝%(1]oDgc4./;ʴ2KF?vX*.i=ỷ}+qؽSg,oEv|`%:~C͕DV9ևZ0Vwvr6\-w_G)a qCO5'bޒVnrFC-RE[2#B $ijb51|] E7׽ |:FY_ª|Sg.$xAw ~~o՞*,xgNzAE}꿮l) Bs5F.ԽvjkyDo8٩ʂb:k>/лW{u*rI8GKu`s{UC@Zouo4Fk|ن@̾38"u QY59/rܮ:'l|A]9}/tWvL,#a !Cz]+UЩ݉}m~>4={b͠{[Ri%s+g `XXvԷ r&Un{^leFV z=; t zrNԴץ3wVh |/ B s=y&5ȳAp әwfÐ>?Kk'MK% n(:v~}6 :#oK&=_s >rocIoo/OVЁ}0$ޠoP '\/WY]d_rGqq|hՆ]=3#Ly *Cs`ۢk$y4.^/z-hr>* \y5ɐC!iMbquan(o[B\._93EosU%8@.Χr'KEh>z#% !- |z8]6_Zɵ2{{?\]ڶdCUN__~EXOkSlaIZgQ8jD>ӔMB&7<ޑRͭY"?֯s|zsCхhI)C_+TgO%YH[v|#,t`y(֡D~cQLmv _Gr-i΍E#kz5d^ g8 :ի@r>LqzR1#_U>n_$ET;>iNW7M3V oPe%D(ю yۆ.kŜ#ߚU'3)ǖ%ck'<Ƀ܈Hm,l*=,ſ6ȥ]} \x&MM#e @H>BBj{!i z?y5,Box=x`QwߴqB «鼀 :을f$xd6x?Aq&b_,cc™y_ A܋Hz4+boe^n![/#mi mk^V4Mh |f1+74NYt}SZtzߐ#|*D?!q " ocKOq!'ZKCLRΆȸ#/\"вnReO]/T+M>Ju^^NKDkr;ϔJ[8h'\|bOn=|/֚܈g V.nA̶V`Ccu@k?{rTfd-s[cn_ɉZ͡UE0$ح~-Wb~!?<-_T!"w_ρVm- Clr-,G+pK=KBa.yb#!G=B|y^f֐Cnnk_n.1gYZpV,1(oZ FnA-C͚ /%o  x ZƯ!Ep{$OEOb&K[i"(,r'i3 s.Th2(ͩMr!OI>_6(ㄡZj>~X#)Y޾"ImbJF/8A?JRGfq5^Yw+c 6;fozŨox6}/m6YAg7ZW-*^,\lCXn1+.˩%g[h%k 1EYbPpkZ0|'(Ѕs, \o z Xhk{u ғ |t8"KM`ɲk4ى'nw>[Cds{.T gDa ]|Q><'w_g q2#l3}5ޠcyb 8z,':4s^j ZD.1a*rrr[82ck WWe'=Ll_ܛaCGEtmoI2^KqOu J%Y4qCKeo]*:5O\eU166Cvbq$ Zۇ"T.8kNzEmrb cqhj^o$J~_C6F.אI_h54?!|c լOU0k,Ηԙ>>.kqʅ + S+x-|ڈȰG7l YWmJ?{ eЬZhj~D!3rAYn>xJ&e_d>x4RWgƉR@MYH~7(cܰ_>Bi{<9 [ FewqO=r#CͰ?OcMdXy!Oi+}m" 94aى\3O\?,^X#9/R%R?ϑ ф#~(I78&UDaAP'r_[u׏R=>EQFsC$2y(=eFѸK΂jA[k:ߛwb__yߓ^)87\ȗwoᖧ$wEyUNd@6oŝ&7px}EO.x"E\JlTJ-f\b5RYq+۟Jrq;ۧwusz;K 7Bȱ|XXXp#jwq?+XKdt"(.XMNm;}(?._h='r8XN[Kǀδ_& &a r-DsbsJ3d_Qo)4&!F騸A ¸Ӻuk͕_5ڈˉ\6SOi$19C#'gnTtg=RS/{bꏽc1nh˶I+]!v]㐙?C{B3:̭KE削[ܰ&ڬ9YË\VnM^ouD =L ([fSQA7Ry o:]W눣/Cۆ]7S\kc=ﶊUhκ.[Co7ڠiZxZgko {?~Wй!S7."*QI96/j9s2ч Z^j,-&I.<5Ѝ/>+Dˇ ņ-zv=j2h' )&hN!*9W~ŀ_A/43rXY~\ϭnh1O$[d*Hi'M},|#q琡)dy5-n~"~e9ZCᇉ9zA"/zsiߍ5֯-6:z6rh>B8k)jt`#<5o5V)KC~-{CI303q!}R\ҒT.ޒgĀ4%k{4A/J.UTΡv'I8V/-rۉ\V8@7A.pboyԦV"nO?lj;fng&9iCC %pWP9;)EeT[7d/D[䴥soTk] \>r'\d)t{\tז<'!>oF #:-#NqKQ|k --Nrʬ5qmtyg詝7KYINZo)s7s4 [Bi-Bymȡܥ-|Sz朸ulx7r 2rv#}'sgHXj$TVp¾Y~rE&;Feԥb7Wx"j~J5{ϴQۉlme;ea^{4'dJk'nZK[֠Y~-y:.-6cN?l?N',c-}r}YbFI= Wzpxe"N%?ľlT|R $6lGh |O-cgȹ47<u3Jp=[ .39_iOmÃT>c5ْurR.jnkY&,&N<}VOvF+ܧyh>m{\#+Q=Jkfs%? r,nny[$Rf۪HϚϽգ(zvfJ∵~(1Z%)+߸\[C]U.1,!Q6# 2/"4v!#o"7Y7y G뽄͵%ǒ5EAx ON_1> dKGU`Wm/;XD7BޖAok+;K4~&kBJ_iNW'򶸪τ"]υ|ҠS&=EzǍoج}^m m {+o?: -V*~a 9a6r|ƀiyʷ2y(g>y1,Epm>Cqޡr28*؂k5m̥Wg^"C7e)X^&oy:̵6a( *V` ث 6ȿJq7ɯGY+O%1KBK4VO + D\_!e򵤭 `~#ߺM;-gh糭Uc֜IU}]0A+ Zz6"*جZBu+;o$KduܷTi!'/i*3i*o-2[Tt.E:| `#>D>?ťP߰"Y]ﲨCWoO-qZ<曏3=xJ6q ̇snp޾RRځ|> ӞE.l{԰xj7>j* z{҅Ll)w\9dmf5K7DȝE34 *;ӳt̶Z+];ؐZ٤u/SbvKχl`΍>Ɖ|vf䧓N^rfNKoy#\/} }|d *B^>V[2cs?FSg)"hn 1C3rbkAK\g6XvY:rEf/yқ"Y t^֎\3!nq!6l9j.>7/LнDvy B?T4܅JITYu}C"tA+ ENA^D{=/5dԦ=:4OhľK|s@cܷ)2<.pO[u\T@>b觷!-u-(Bφ)glU Wqӊ Pl&z+#½7q,a]"q#Jt,֠{nK4aes+ίUhȝ" 8q> \"z:GG?"U- NۍcT^>o[]yzsݯ́̈́řm!;E,ȽIB7`Ar{@}!gy}x5ISɂd`ϵ-o4rx]޴[ԟ+C_`ޑ[Sɱ!tU+ACU"oR? ` !bGT8Z]Z>O#+5̆@?㹁E|< B'KZt#]۲ Oɡ}ԁVAYO<>k'/kvY^޿P'~Q6Wm^=:ZM?4i7[١ 9yn+ފV(>?n,\ҭ`UGx 5ZDMMcS+2o7CI> TVjx\ꛥ0Ǽ] }gu5VPn /.pV0[/ MO):vr\چ_TS Z`u3ōU86=aJV蒳'#*trh54^6}y .rer ]:%mI沒*ړ]k|Tȁ8[c"l_N]GrSh͜b6N8%dg~6 ~=d ,$$dl;뇵҂m%s#@ߐ?7Y|ƲM-В#cf`vr͊Kk!j֫޷`s5왧fȧ3PB>֑S-zbN?R/ڴxAO@|6l7S@^2"WCFak+2.=r#zLľR׶?On.FnVr`(5z&yr:No'hNOgнDN')K[MC"w9[:]Y.#aq\W_?[+:y c'[/.kaM#2\%ծ_d )(zLQ6STX!y}Pz˨DBjղ |n yO'lU }3%CKMb&+6wm}NC~j )@o/AIYWaȩ-TWBg|=Y6ytw${r|F3u>- |{R)5@CKXokCئRy<feVh1NحBۜD.oY346lGwխ@EnBntr_y O~tЂ\ 5'ARXڄ ݪ - =۶OLG\#9 yLNoN)7nЂ@RBApral6d%}ܠnY vkSXljsϼ9XQf}4>7&U;-_!@D?ȃu`!|VD.qghARLK-*z$̴CF:6O-q2+9Sr챴-3:RDN| 's? C.[-.A.ۧh+VZU5A PTa A3h,-8 le?璘B3$>ZPXQs?{Cwnx< @&Y|}I\(sD&~lvUVM[h{ p_AN rvŠՅfA15O_MVƃ5HrViB_MΜ^:|r,\#%Ԃ05 /=Z%ʄ.1I*r7aWB9Ḻ?f>kU<( yLx_ \1HYN.3q q< ƖTrٜA.)o}RuVC7ylCt;{JA:E.3|?}0Iyg't FTx`0 adWN֘N֒%e~9ay@䤑dD7v~EǏ%ztqQ/G#iy&!G?)[&ʸ-wCUVTv kN7tok] X?<b+[X<-X,b %`YTo:r='g'};2\~+FHRm 7_YGlfa?+1=G&?15U˝`unK:G7~^Šw)!_lV|?hqw3^j^<gg9$J9qא-c=pz<7}zto{JmxWЭ~͘µtqfGvkOZ- J3 gè)y '3L zA;ȿ[Olo/rJy KZi5˿YGbElSl}fYͻ]&߫  xTlܭwDy )K.~>?wouA<УFQ-?dyoN573,n+wF^6VhJJƦ}K#/%_,/Yqa'GYOP-*57.lB5OW~XoIAmܥtFNW]5Y7٧.#w$Jh#ϣ'܋+>Gc'\.K Dos-eJmu⢡ҡF.AC#̵6mJ C9d?pŒ<DἷzZRaYr\&9Z>tdaduGRۉ-{k SI>3:p#[2-^ "谢f'9%/䚻|~+fX)ci %I " 5gs@o!X*@HYY{D.ӿ#EUx|~_ oon^!qH/z _aOqs[oɤ@W63e6<24 e +Cdɏ 'YH BT${Z9%p>(͕D>oevE>d_OˮF\9$ :-vۼ 1 Z8|6L|^E8q,'3rEUloyϦւvYЉ(m4QV&ТFDȇxIZ*"'p Y aTqY\B\e t⾮&w }58P|:e t1׏4E.(jG zYb93Qʠ xJrhr%A"*7B W 5(bnݎb qU_SyNk-'}Y/&Ɖ/B*Mbդ<ˢ\T%36K1 z7YE(WiTnϲ-MC7G( eOK9^cв6"H:Dϧz!Xu~D֐Ϫ^Tq"H-,i0#KL* |_UH[y&:t'2l& xhܠÊ}ƓP(ج$c-nl)?2gC$Oc:i^kmb*D>V7VBp+ W&LlCs:J|Ec3@$ $V|D+vr!gsKr ZX빁%hCJm w+5q/R'C~nr\FD"7Z Pj_V8Q,IJsIa-4?T[7gwuF^ tӹf3NCURBˉ%D,P\VLڅb/恽ee#9\1ʻL#`y;~lu-p]g_*06f},! +x@.N.r*N{SNyְ<*pW9^}ePp*I^aV-Yg[K2 dWa'pZ️gSt!REFx.O͐'TΡ 1-}r T3(%9.ޏ J \{ؼkY^:# ySn0tw%^3\+Xή}'xnOZ g

sPkx+0IW!iT6r "d4k 8|Z_Jy_Ԃ-+)V0Hz=O ݓ^\࣬-D'a̩q8<öZ[˃m{n C󅼮sfS蔼&kl ]iX?Ŏ,H\ B2k 5&rm &fRV\ZW'Eιm˚͜%+rRI*ܠXdzyoݸاSjr.>WYpuTh$r1S0 AU1BHIq Xf@6,DO*ЄngO, }m5AzO6JF:˫Qs2!6;'#}fq]zd!yҼKl+5#;K;ac y"/?_hؓQrBt ߫f Ouq 0LFnN,t>5kXؽzbBWN](7t^k J @넾.}rb06Rs6h۠?ctY ,>ޮ/=f~=l@&ʼnB,5Zz;4> z&^Mv6@Q'Qkjd^ ]5T GLEhP?ЉkZme;M$?p@;ilYB;;oʑA v9kvc/Ҁ<#1æ=#1N .!l lTuCO"Ked>d `:-( x9E~f¾u7曅|{YKd۷'7d !ĞQ;ASS"gN@w>$TKg20:njЛ}_* ]+7'lxA6| _g4cMf_kJ50lzc_K{U^K g*6z0pb1hcJG<%ת | 5;h>&48Q7]-QF_gehY.z䫁kXP3l%OeV[!WX 43-|Ql>BwZnRK/A fKn&<+fZnq|+aKfyAY:KƘKaƎ1c,Z[$[Ju7x0h 7^v6[\ /I -1HoQG۰+lR)?e1T/{Gd*C?[ӗ$a_d~26ھ635teIr@H!_<SX#>V75_/ r|\/}ۀn((\bf }+FUn-t᧿4yA4BK#kB3ְ}V;N?з]e_ۺ`᚝F~{ɼݲvLz ]sM%`)eŞdeqCڡ>~\F8 /fv7.t<=5B`U}e|s؜ =/"C_[ԧ.GߩOy;y]2cAEDd61T:s;v._!BCfɟ01n@ xtV>г-O}4"Љ;2uk St^ʧ!1.'Cz7aW߫Ҽ~Y'WlAS*ui< ͅxSb˩ԧo'W dvog]Ȼ\@.z>Rr bYYG~I--DŽ}}ߟ_y؃|جVAhvNB7B[pҐ?HF?_y@U[Tj?X}Yqm^N#in: OF7Zjo”7S_Nu:fydX7:6Ɂery]b۳E~+m}8 3ׂ6"=WQ[CN\ۉ]j7n'LÁ-v*:A+P( |3 A/^ނ 32Eܢ=05rafvz)dO˶ב 2lNy QS-<MX5F[VLb+ 'nF$wX21Dh>r-p]R*kEG5T[Bf7j|y DCJ\z#T}r6pV|Z#Ln#H*r 4[C/əp_"#|-Y960~r3>8ElQB^ CO(f_ol1-0=){,/\;vۙ6xl4FEga[|D>_~m ,rYS!,Y-·!53 5 v}:bK)k:rBINȢR.*yUr\[E"'j[HL^CDz}Z []Bq.\zOMxYf^Ur\z%F,\vOe ^\_N+rP :L.F,*F&3GeQ*r?&*|@҈ݯXC\8K1A^>Kݽ-ZĪ*&z"6(jZ.W; .w@ \x}2Uh=o$7|MO4ʉ|p C"Eೝ,nСх|X6Wn$}j>!UaNҟE\ WnߎEzK̸R;9eeqN1k'q"YbQB]NҸ17cިu7dFZ7(.X%;rDEwm7pԕuy\gL_^<8kg= &wMNs[ĕ Ԟ,B7:?"Px΅ˌ!v A3șK6Ņb?jUc҃y{nq1Jy.[q:hn=Ҝ|ىnSc4׭@uEoҞ2t}xaSsqF"䬗G_[\XSLS_>ܽG6+.@׏![y=!7rZQg,Gx0 a͎KR˙4{ʍ=fJRIn(:j&߶|"ݠnmzNZZEjC/|]= Q-͆~n2l;Bk{hduQB5vz,W\G+S23B2(3v44>?9^eb.*)q}u۾ob34^7 J((Iχ: e!>S>+r㷏H~ë~KVw A_J5{˾FE;ֳ?ؗ0е^d-F$欘o;kWz!lV ]V jRskP =^oci-Fџ/]>Auz\-glGKDe uhQ~W;WA+րk,[65U{HEK!ezXB7tY46N:ް; ĎaZC]SvA'Z$u d` yʮ I.TC8 GjSV9FW=zwr ;3M rNˏ%tK1Tg7 50ljo Љwsn˫6A6;s[g# 7]>cxmSAQ[{d0U.K$QrW\#oO^7PFMm;VEpQ":*5mSTgaq*>=[spM \u5Bȅl.4 Uhvn?%Y Y5.W -a%TZr}ήcsf6[T}iPLԌݓi|cdp&vl@NH\a06V里*6/'5E9$1_ݡzc՘so$3$-37Εvv1ɓ}/tfH؝$on <CL;zLo#A@qY-B(7ve9_%=^7 u@β%h➞C/蛴:}Ķ. T蹍?3ש,RӘ^ƞlۄa]wVo3-; Q Yd"HBK\NT׏(IwM/Ŝ|e~]Lž7s:IgIP{DDXfȼGpdm &m3(|eth_1L/0*__7 z8^7- ]a&]$Qx+" bݐ= |+>ڎ]7Pp!?F uч=uP"o9`΄dg>3V/;*pz|mHOcubn\&9 IK.hAYEz(ڄpޓ!OC\]7h&g9;-Mp\NZ+OߦsT| ONn?wFgxrdj_7ۆ<[l͠hZO~__;8ֱG5z]6tV |,c\ $|%NCgj 8\r¨V<Ր{;tJ'm&Q92DS4,NF:[rQUЎ.iybewk#U2y_`c2:7kbC8GAT&P\|/ ==:V'b2Eur.F5k皻Teh=EWDyL9[.'ĞemSs}hLyO||pv?=ɂ`w,-"Xpg,i4rhmѧ@THiTG(7T<-_Ky!_,:9/_ zeoG%zJɃH$Ir4b u:H%+ CgD>׆{J8C#:]_%hgDľ'l^FVmosanUzNU}!Ʌ'QN%A Z%߶-sT-O$8s*-xl7y7Wh hZ=o=XEξnr h.֤\&O]&ܶdc "-`4yvn$'pP;/:7jUl7!ަ q'f‚KtaM:lbSKSlI3UtBZj47.}e{ 6WzNb VO`Sr^ /֑kY 97o?[T<_A}'#LhjXS*2jZZ[sk,O;n :sde}Am'!n۸Msk CDi@O!v4~ aKRP݅>,F{ݙ>i⦢>>5KV"i ')i ВN$X͊B`v ;7gRy^bМf̷/OʈL6ؓ5@79vۼjh-C{rr 2"CNgi݂o@w&5#|"߼&Ew]&;*:ngɖfϚtmqBz:-9 ?.ϵGziZN#A3cɇ_tIR\PAjW'S˩T91̵ gH|&>'$Lb_3FB6.),\m$n#o۷}۷!BD"h~_ ]47U}YW}&v'Xa-]79/u)Q;χIrg>iؒ#Nri%eAb%Z75e##?C-;YW)OCnm'İY+z+ ~Z-Xd,$y$xdfRv q t!RT|ݔo྇֠gCOo}uUh"]\C>A.(}m<-h^KڄY-׹)5=6͙;{qo!/4whν1:ѵD\SK;F~6l]:X^\g/l󟟮8 ERbr*v?lp^:+ ri,[QU#RW#U##"΀n= zٜcEm*!1-Y毳P:O5zT*RH;T_]ʼgV}Kd'C&is,ߔPYm ”46$f:+um~O\ oc~e\Vb%WEP+vk6){.kkPh佲na,sY#OfՖ \?x7},+/'rYs 8e`5͔v^^1Ӣ-FԺnDLWcS<,I33C{e_e#i.EN]O䛭ցlE }E^>GU 8\IbЄqGݙRf3izwi}]Dž|p #:^Cr7r@Xׅ*.ceYM9w}Y"G2 "N~N'gOӻsqA@$Ɨ*& C~ʉEߵd92gz;nBnS||?ES-p0憜ju/5q b⾗*rpr!u/z\6Z5SW#8:4C>ybZ vNʾbd-9'Br;`5%lR;ݢ5xxIZJBv/F׆{W:zaٳPW '/l's~sf+^z8xTq}6yͪC{m5 T Ye@+‚x[ _7~B5(3?\5xˌeoŸ. Z|"KPҬ#7Z]Ab&"/HB \rihu.gI6Y àq{&"l퀖58zZ!^9F^M N#o"\GCs>ȯvݳ,Uph^ BoXWh1Q} $e |@34fyz"ߗBD=6rroTutiw{HkAn%a4a.\\rfԥnYlkdn:}CR0mqfMPp^WtYC? Sw_o԰w@9JE goZ2l:g0t-DFw bytoɠJ+,$$JyBЯ Zd"XV?@Eor$QlZV;ZsTxʌ06uRZ(YvBz)Č};TN_j0N-N?S򝽓Ofq(*Ooq-*a y.;?O0™)nuclaC9rA`oِϞl[jk4%:$]-cxzJ$IC~[͕: Fm h 'Aә$[;9ZpSt"wf^ۧ*rlĿpnr|gfDw<34h=5|7~/ɸY?|ueq T-}.] r# g oWb{2 INk♵rĖAE楪WnVZ/'eu9Cw)es[6ʩȏ9{5edIJ(k}vB~Dh5zտQD31!Cg?SNge/7rl?ccX z3V;=0hf.M+/Bj>%:scp;л7葿Mȟ!dG kOǓ~SʨP 7^3Ul򼐧 *KY֐zsfh%-?W3Ʌ+pZ5HDKT#/T4-Wt;6~$r ";+KrdRG\/۪p /TkR[M$ckB3'ru=.g9K蓒-;BԽٗ_3^"ee%% ]UMeYМGn |I:n^'g3ԏl""Q@m3Zd887rf(Хge@+HW|CXlQD"ήh:ZӲ" M.YX0.LrD[ QUr=r>=gѫ&g"C󄄢 K49?5K}-t2b Wz+&'neY?G6pYW߽P*mg[ mA=טUtrV kkrO Wl:N߫A]8!]*|W,}@74׶_Sw+=$IGvW're9D\6bw*mTIЙ91d(\H# qυ+#8m.Pxnm@)Ud~o'.) ]2jTO.3-9-n\[y~764 {y97O&=՞ȽyDb4VoIo[gԃ=}ܐon{ vPf8Of$_ ]&ՠed7.ǵZ.[P"I29Eo|:c[Y༃9\8,aqõxmADM'uj7M~K(5&nB|ku>.p>N[]uh=ޑpaqV)J7,'9Q1lY_Qۉ7m\%~ g8dt)\ݸ{l!ʧ #@P[Ô x7=KRtq=.ŏ=qMn29G_h~*=A<9y(@S-]Xc uSOǁTGCS5?=,)0z -6hGY>hcbB-wA0T[NjmWt?[%ɏu1 ο0&H[7t1A;#v: Aƾaм쮘țFm@TbC''9[Rt\ςf }$R@ hhD\2{AV~Ӻ"yZ׼sB׵XoR ~eD_i޵l515|=}t&u$tE:?,V}JAL~4i-ov;Pn/yWT7EhC.7#y*-LaL~C)#]o)_%R"9$.yOI6lGʓAZ$gB`f}[JM$v49" Jj?~gqf2h{Zy$'4 `dp'솵z+"'/*t;St~FA3s}bw]8e?Buvʺ JM]\Y4n:МJ?]3zМ_W3l9 . `PV+ -R#hY >bXc,%[W&_{!JO[6X>0`7W0!n5c\#%WJB~*`(֐tr[zv9qSn:Lǎ+[[ݨ {M- ,yW#̐Cfo"#ೠlGkc$Q|6[M G%'#8;-.*/QډRΏZvd[(-ɭ2,v Oӆܧ ezKCȁSt/rzXMrV O)'>*pˠҝ8 &p 1^4'G %owJ7蛧rTW#nm t7ZƦ)t[F9,= #); #|o hb֝ z$68g@+YJ3zj{xH1<,@/ "髿&(K pMENm1T yEsFT[ [,:rlM5ZjY^J,- r GE;=MT,z_Nh o}oaQ^_O<%%J%9=VOg"y2-xUx[Pa0/BWPiig/Il|Sr\)<|AYN67Thk'sZ8--Ǖʉ\B}pG,_=W>#B;xfNNmÉh>wظX9sa&"ś>Dk2=zo[ zqh;SeUCI+;Bɥ"WT~lαg=6,):4=;ƭN=̒%Dy ud<=Ѝi}V֢)E̋T y |9{z,czY+ ;5e>y сwYgY-Ep-Nډ<x3:"/NmXB?D)O;vIa"K8 D/Eܛ؋ZO6wIh|#w tra#pRxD>[{ Z>Bm`i 7yF]2:<N1-~, F7M-M·/"6#$ADl\"+c8hCW}{˨"YdF* bLϚd\I2;D.[.QnՊž:j m͌a7_ʢZ'Yz)$Jʧ֚>+-y :79>jsL3&qCNIÿ[ -a5IMn$0Q-^*ЋYN|H#)RDN\izp9dٻ0:.p=RJ'CBtE[tE<^C[ X/'f,Yes- @ ٤=ݧn^r@'Зثst@r'vb`5Jo'iUŌDA',yBD3I'+TE3&/Y_&3 d8~Zrxඳ,)80,v -Д {͗|mn,'=UHj=!')yZں\\AխX*d@=׆30ZáϯkC%tԗSOaMt  UˢzIAN}q1I ,O[ y \נCT<NoXMJ~B.kkDB~GY*N{\Sh;!;sP{9B#"9||>z|NOktu1SF䊽K%FW+3mz:)ʹ;aY:Lru{3ǧy5>]3['#}e񿼎vʷ-,oPޖ<m⋇~k~y\ ̕V]\ 悱N.g) Cz ť=83M)~l[٫o8ۢVHy3;`.ع΢#d6s61tzAxҪ7pڡGB9"v y K=5gVV}ۜ3Kz_Cw_@I z"5Ϙ?b1t8rfy5XF"/F9$rxLzC,-3e%,*>3hhDO`yI䶸'C8UГ zOj ͢y(rREГ!ҧ3Oݦ(BNfhe= orH}}5VoHiXz^lp7tSZYveA? YZ@~RmS%>'n;D( =ͻpOX1U%Lu Z@FnʲRA;HiXczyWLq8KɾP.~3S)0+H_2pcy]}|,=~E=s.Tlf3.th) x;݆'pmrfI|,'g 4;O W6gm.pmI| ˹kwFDAlۉb> 8эD`YCNP"~qÍrA{]~4޼jhbJniQ%TtZ)(=gk8Y(1Ӻ gZ$|XϞ.G鷯 |`%Ke-%GA%r2?\M0$ ߼ [cSCq˫ ܿ [B'!iEDcqJ9: 0rz#Xe%KudkG5x]7,mNkۆmbއmS\V9^k,z/2`GEN4N534ÿYLktPr v^'`e\'> mM\9D,rNlmL{wm\7I)Ѝ [kZ &+ȝ۞ ,8I, d@qM|/#%iDyGޖQ+~y /`K`.9!c7#Kލc'YE' h_I/fmJ/ e~9>%y@_7zJ5QO:M:ts(ԥ_9N&g\a!9](@ (nװ:\@ $^c%ph>\sù6b.۟ Xz do?Yj֤k͓\N#AיO{Ff'.?&^ rk,٬fV; '9sOǦI1OUvKh#?/\es*QIG+]V>}o5}3N7?->7ɝ F -o\NX iVU| 4pzG<2k~HNeŨQCy?ETŻovʹBdtb_ {!v:S4㦃+4e [$ꓰcه~9{#o]kW>sb\>ڠ ~*nkADPܗ6|,ƸDWL$n~v Ҥw͡B~-P\OW,:-L"^# MoKw yfdyjģ,=Շ8]?-N{ž#DM*3軏f#/-1]nb:&Rb?z%\B44:tl x(=JAf',Hf[g X[, Y5'nb-R\<`>Eb?wk X=Vw}`O5Z)|_V |so;sPFn"C-TBsh૬q@S I#'5|o'&kB4+ Pt#X6kM jr"8%aS[N^K,ˍ{D&)t\FL òwn-϶}z?="פУ-˦n1ynӊQN{aS\\iYSWdwWbL gZlj|_;5r3KG)Tr_k@QʏԎ$h}kԞ>T s?P*nnW7pD[\*/*Vh)jo8WK e3C|`o&:Hngɫ>!.oULЂ]{v%(h9E*'@ 9ȓ)yؓ8Y >-}t[s9_l\9)0 ~5vǍD8i'c>Sg5:tї, pm7t ;}>w7ƌH̗q;;ѓ @>n6 Df"6/YAFQPC=(yzq=2stްψkFtN6?вp=YGsw ѽзU ;sf٣"JwmmC*Q7t[mѡ[$v_p ]@Keu /H - KKGj;"rQ\٥D 47t0zЗ ,PSU*tdVQ[]RfCu}fG6;Y^?_@~/fjcj,7| o1Hf[.2{V^_?|:ԅow`ؗ 5EHR` z!LAﱻ5lWilZVHf[(tL"peت*[Oq(| p\!o[K$`:lS r#(K<ݨBO jk o[:|_[|y/38SVhលEWo-. |T`KFs.mMw5.4 3qh^]S(~7&whrwG^JB'T. .dW+}|tw싨uR񎇥-~u_i $\t Ly6XHCL^SO}G_֡]Y힕 d2zzn*vګncn?_ڲ>f&я5Z|N3Jvck'iN12Ԡ::tW :Ђ3ħoӴx;̽ zK҇!əG+W!L.߃6&lg)Dwl~+|MNmvuVN-^_q?\}D\HSW9y%W#EEn7p]JϝWK8 P؜jФbko _N:p#|ht>o ;-,^=o"IIɢ1Fc>,%\B^."wI -TD  qQtྀuQ e U^]-%:Qlŕ$)# |)bm43j?} $n^w5vhWsDOKFC~{>_Io`yszB61+ 紇^Nm :Aq[tŦ4`U49+_g obrǁ\""rB69)=Y32,]epryf@AZt*պR:aOvڡ%(t9Ӄu:5=.v"߲Mŏ|du=ZyJ71JМ4鍜]R^.Oc#b V’D%]JN항-\3:wيK ^,}j9P+N.L}X)|u =Vn +L f-[2`Ɲk .з}K x*4483-SROЮe}ERr1ȻNipm'I@Nm>ox3uBq xHGv^OiKE&v"gs,ʜa,?䂭p97#CYB'꯫Gc轸w@'$:KUV9g[ مkS>3T~Egln[B2hRjcNyK GW঳!a&DNmЉ||=جFeL//Om6l?=g(wa|TKAs8/4CLYIBV>o%&X--ЕQh }Q뉛V`CUv"^ (2N>}nk+GdW!θ뒰besH5+^NIPofMm  (@M h˯YH ͠؍~YN6'p!w&o~ & L}^ȓ|Cx@jjr'٧}RzX mGī⾂ܲ4*zjn7=\7ȅ;9Z",zkh|PW셧 8I3eƩb6/ppX*v`w:1ӬeRΌsk4[+T"f &C?$r 4S-"r>"u?ay\[A,} =e*6r~hGlwx^{@JpyTg_MNb'Pptfi603W64z`ai)=>>+ڋZ=I=W÷~`ex)0_,\ cːy}@_f+{ .V[smA "Q^3K l ]JT:3]-vg63:r-zOAoYDcBt2Eُ}P)}݃k}m}St& 2n-mtz4=!>b;G}-{\ Օ <>\3I[;LJ|J3A톾w]C懚l=K}Y2d9):{I:h7/(}Ψ / =qTYbfIUUo|I/ˋfةXT fGuGnR9^S3\k:bUpdOnr]ә"?T5_Ը>L9LOQa~~,)]RY CA~w<&h-/naI ;elEekMc]1{O-I.]c;_S-wvEwSZZ83YbwܣS\?((t?gՁ"-[fmvvn)0X񯦻Je*vAj?Ip2;<_9ݤtjTeLj -NN9CUgXGbx-nRy{HC9<]bF@ 7_'MĬVedžj 5)t~POfoR׻f/*vj[뢴{q =\YX_muIו~9OZTvW'>ɘv}FI?PcB)Aв~eB.Z^j0 bRsƞ |c߂ptv ՝i:eba|,F¨ؙrZ7ƆW&ӱs_c>i;Go!RX Uj+1gn+ȅ^݋IvvǮ.]ۏwyluM `b휉Чb)0!|k M䆞VDCϥ,.-'2CK0$ ]/! ]ֹ>SGu'^MҲ1]P,zCA̟v\ #`Л>c8LȯmVy{@]S {K1H%d{1ߓ]bS1 =/ CT~]:v[/_N6G~Ukxk褹~64pN v^2tc0>fq8`h~?5]羁>["/({mNGl hMK:t?0L>ٟRɇK*3٣Oq-^!~DZ=,uA#ǭߦd6{Ez}PP_):qoy0>!k+<=lk쫱1b<3L}??f!RoPqڎ^d%`rhT8\&ρp͒dhV5Ru=| 8y/:D$Ź,SlЕO3m g2zoBig>b"&3czE7I >6?ϼ)"|lТVlse [/~ y#yJ:g8(ZN:\5"]BAQ@PdKE|Zvk ҡk!*O1 ݵz%EIX]5顁_ytNHesi|>ДYFE2o{Cr{+U_%1Nk l[8KCwxp;,N!+g!6KW0CS"ʸL.g֟9-}7UfCF>%_]4q_!kc^8g{ϝOe#w֠%[[pAzH,.Ȥj'rޥsoGW6\i-?9 nEl꾀( b.|r͖,F Oʙ'r(v17o-O3Sf+̶rq#0@6y+n6(P죧ɟ̶U(: \W:tʢYRl=t?SSv"ߤ#m\N+Ɨx_#]Qtsϙ4lҾc24-&[]Vmkj\߫n]E׳ u~R!A3Eˬƍ9ʎ\}soO<+k5h? WDO|4kώAN"ɝ>~\g!qB\< @JԡszZM#7py?ܵ7tQMŬkQWHZ |p2H;kO:J.o+O#e) ײ:  -t.D1r Jg ]rH3}@OW4=ؒYCY^]nݤE!-MnQ#'3W 3sE^nK*U."jIv l 9Ee~ҐskraN[-h>(j(?m`~m mu̗yR+vpnq-x];ϨJK4g-q///_ z5._ifN>D.W)Qr //k4b+OyFyr pKMN+d^RmbДlT1M[\䖡<3^DӞe!Wp.9q-{q-NI1"*)Ы { [fJ]qήg6\'4ki@'[$"l~IAK y^8Ee\eM1t|G{Oms%Rk_#-MS\q%1|/o &+pw- Yx47̕kO{0!ķxݺۃo+BmqYTlĸo;LeHGa b? rQ~-^r6;xnuP:@;Ԭ6O֞d^G\9םbk&o/ y dz"~UkMEзM.>[s )|0?WO&kJ%YTP1z}EkZoP^F:i򕒻-&1@1z% \pY[7?rZ{Ko㡮 l3/,w PnزLUdp}E/򩑓'Oޖooixd5#Fn[({@HoL"]QkOykikP:bn=r Z?x=;'v"xj_(Acw&6dt" 8 8@Ҡ=wb2y x-<*F٭dGr&qY"54?}`}\ŽAM-YZh@w@zى6&ت6E@v~,ނWAz'phqPg>jD\cy7؊Y2PEz<1ථ'd\] 2$z$\ܷF/A[b# 9 eygfcWV'j<|*%Z(6&^"!*d|ٜc8erɽUVW'z:Z} GHꉻ-]~UM֠+#,d\aq BaUC:5ӕ <ɳ'a>V]r@ORNԩx\o)=%=VgV.>Jt%BW.Z 8z^ PI,UGh~_9}z+g:.ŢY5Wh-7hx[] Д13]]w*7|Y\C.˫K'n}1T 83y 5Z9(NjIbarc!'6hn *NZCN[:ƭHscѐ2ڸg'p :N|&\KѹuY]\jJV;lhC'o Kp ku\u#g&=DlRm1dڜvY) y$O=GSs2 |>%\eN䲸䰗z30W'/>Z$X"Byb} CO=+]βO%hJRًk؇ o]'-hȲR1hY/'JM%:ؔ7/_ɇx5#>bmuZ*?_gZ<dPی*A~.EҤEEN䋫'gpNWA&6Hߴ HNŅ=EJԹq4k |f")oNR}#zV  t%=캂trwJoc \dThoW}Z\ow۝~+[ꪰ?Af$?K-EB@kv 3C䆾{Dܦ~YȱFϐb_iCI?kQ'J,\OݟL@Z:4Iȷ.dB7/!C;05گR ^6/Z^PY y=9 79*3#5cDmrKC_NIeJp 9*2nI"R|9]]HbWOuQ5!5<۴(2t!l-V^c91c'lO |!c>b_:L,$OZInF>@ xet 9)|ka7{L?5-aVGH֧o`J9ƞ {^NOl˱MF{D cm)$4NLhK@7`{7jA Zܪ ` ޼FNFvߩkfks*V_[xޕ)-{bN|ǒR5l7dOhݑTi}pw_-)FAn+ct&OvBglfBn8g:B@t <'d\DŽ|k/A.PmX=u]I%; з01iZH/x-+7IqpKO \50ib?nReb̟'߸wMTI#E3Ȑ݆94Ngp/UV_~RNHnq !S$+S^4?ZN+dJ裆M ~.o-pN"4Jz\Bs8]n}yp $X[4C$-am_mtC$ vc!0 ]9V#{5ndB΍Z.:405F2Bx@밨nNsUhTӿWc?5}C-Zejz8I`89 ]nI~Avp ,Tr*4ےžڧ};$5F6&l@y.6tb ZIX( KI=V Sx_S A/TcR5[P%K]&yiih:rc*7<= #T%E4dVNmqAf/T- |&,S+&J+@ Ey?2y=/q~ kDo,v[|o:D-.1 #/2vZه f%ڹh·GFҽ'8$-,ķy1Qaŵ>bԠtC@ǻdbq\]׫:m^Ǻ޲3GW XԜi?w(!䂿6[liގn,$zPWWKFegr-O/謄&td_lYOtKEi" P3cFL@yK0.Т"JS,½u&lOW>]}:5'z sl~R|:i@3+Br<'{ -ղյ(ϖPiD^- +x>vB^p8E*O%CF.kBQ9ZY.,3Le>e1= RWߴStpJx'>qΙ?Gy{_/H>dd?&_m!H+Բ^U@oې?S1Ce_{lpS`nB8AVLtP=VĠO] j:- xj+\7|@Ԡ =!N/[^As]Ly.VBGB@5Ul-v'|/z"Ts󲼄:5o!%5 7:M+r"3Ej=Zm@t/pmv1Xb*'W1T/o`wB˝U؟L|Ki,x@Ǖ.z<ٷbN3C?BAz>K8K~ nB?gͯ2,rȵt%5̓22ڪ>}zٷXgf,.Jt"0 3+]&L]z➩UtE[o|F}3^wW֎p*vd$+%\ֽթ&k9.n'cM3Wqqp(:r=GLc78w(@;R??|8ݕ)[C?5%M*M)JxvK>NIz"}ljb%Nm6{"vw7Vr\gYb-X,[r.&HGߴ]5iiȱJp[g DܠZl#[W6ihbb&ϒqY[qG~ 3(O5Ir3bSHt9RE}rD͸"7(ЌwR\_gRyRׄ: \MrVd|R*4N-37B P猝m$},.A,LZϊ߰er?57低u)>pʐ஍+?5mLZ~mu/[nROh&@7hYX |8).ڷwp?f K3a]Sl hN[+9&s@cGx*'p޵]U/5x2&NʼnF=Sj%{92_es?W"cNV)rZ٠urNQ}uf]~Z ]7*-t},~ ~,V؏\mXVPfj;qXnAzWRg"m .Ӂ!EKRt &T&rUU.jS>OvaheS6Oْes[pC|\FbcIZ҅x*rzA34Nu"{ 7^ي>AxٸNީb&_+%=nb&֠Ɨl1jЋv(Z XC'"hjQ.X}ɇ^L__!>,ٚuI*]͞>џtd{CwwN|~F6p{$x&Z*W@%u>A M,~/cdתA7ȻoOۈQx7_Ad~-y x χ|uwɡ8tkM_MxWɾ*t=y"ORj9/ʟ{*FϰxY WdA"ϳ5!2ߋew?{^)к,^: Akܱʾ]kgC+!['\fɛ5A9N{B\8_5y=>y\3bPÐ5 |_VnCnKf['d_[X+[Jg ]|WO] }8יDʂݳ%ܨF%4lr>e:IY{ |]0/> ɵʉGqt|thv[]2pqK ^0tchE[.JIcdOwZ.{yY&_<>4F*!~y9]m-9-oàodZK-)5T JL/"=Kqm.LpJr./4 Z|Z6ϐX zO_Cѵ-[UhgYw>LB<ܵm~MLtbȃ\fj VEدP=o2+E*sݰ=Y6-}IM+'D7n76b5[?`ǖv9F ]9k@([:uX{B3z`q=*[z6;"jvrznMO.-"c qO-vYz_*3݊X.Z s} ܾ,xaWbdIF\xZ7#:+ԭU5e-t1@yKuR$Xl3&6FA)(Gkn#%߆K*E>qn1x~ %Uj3J Gv%nu\ *RmEW1~^P:Jߵ /5lA_4%Uz?Ғט5eԕ$MbLn;&bbYYRV 9[p x\e=5c'ms#( y}$?u*8=-_Lq?.ʦɡy*BT ?|G94\R:mxt=2+rճ/pZz[[V@ +}8'!ͣ y <J8j!Z^nbߛx*xk$s҄k8R RoήV#9b"=}S*^r7p}\@>\ rvߛCo(KLUhU.$s/wEDޟCrlLւjC,|{9/q[\>]"dn./aqfIFNzļl<26笟vJi}1XlgPAtla^is=x4bٝ̊ izSGgd2 [ (f-Srr;uRZ^_~zE%?Tɗ >?"mKщ*Ƞ/r[}ѡ7b*7r*Iq,W̒HY1vk}3ȐCrL_N+-4y*HNm#h*s-5 ԡ*ݥVn䶔 fq}}09iA}&hPot:]J;ނK$Zu$KO`M۵-S{kr<ár#4#igQEE$u8NMۉͺ3~>PZfo,{n΃2܈Slݓ[wSN{G~P|Yȥ)%JFu|wi/aܻ,(,c7h1Dk_m)|_mQN쪰^sr fpn{~=rS.WC;m#gF7rMV5h#*$o[=Կb -ONJMH'd.lrQ9[XAd| A 3n~HkYE S) x_NCp^qy*Cl'Ǿngi,.ެIL[=5 ?DД!v!ߚ]Ɉ~K tWb6;SȈ qAZ4*:anr@.)艼EHtBw~z='%_ꀎv>۪Bg,^{̌ŵp}7_>nu3xYýȇ-5TuגkI7:? ؃&d<^MJQCB=7b;~/1ךDҮt6B?Wyo[LYD.`K |sCsB|[f4shލ9=+МRw:Bѱ ,THN{MQz'}*!+̸C}g[ӧ@dDM'lY;96!_ӊpʈ;"_"1gf_[gL{ L&v ˢ\,r֠'D9E|S nz@"X6tH;ד̡^KPdtwU?٢Ag!YreKYݠk*CS(%*C v\'9ǧNq|ulo}Fj}b/LH:rhx[ЧJp[#nw uT_&lQlyڥԠbOn{,˶0yi7tΖ9*\T䭶+%6:Oh px Cz<)9.kt̲djkAfjsm7K^ 'e:^+r2/@S+M2~lQ;OWhIP%"Jndl2r¾84XkH#W֊1:mĞÑt:b;=w~v# cklhR,adе˅.RZ4YknBB?r7ܒ5OPiC^BTsGEptš;Q Y0" ql)`eqK!Pe9oU\q]+ZS2O!b]Z%Dx)(~J'r)!'z"߬Byծ\K0۴}Igɤ!TkI*6ygiۃ='pC_-e^'7{'rx=qC}%Js {^^ K#޾B{ݜ7p7߽Rv˪rIuhPYIi/e-Jٱ)Zٻ̒ _/i hj}az|"h$ El /ݢ"'~)wpFCȅ69jR;oSޠˉ9ywa;*s&ƭq<]֠t:χ%^ڡBfxg+1穯5:- ]gf B9oxQ; bfw2fC9FgGOQyW_V-5DT/d` QdK\7Qj;g%Z4B^u4ȕb/'n^TYߨ/~Y"xl2Gi6)C^J:+q)E|х|C%UPFrԚ0f#i7{u5ơqY1NM\̧^a[Nch{-֡{Ow ы \~_4{&cV.}:Q_װWV13 }xbEx_OC8{&mAjQFKdZIl#g5T,whEͿ1]L~ =9&_,J\e ;躸T[Oυ_3hm 6ojpȢ?j&SĪ'r}A//^-#Z l#9*ycK#,ugܩNm{h6REv&5M 4Tx}}$B;U~xT4㴾G5dR ~fiؗ%oTl{Q&RM(O . rop#h,q6Eþ"Χ|2,ʈọMh& 3t8TNo<+%sTऍO ];W 4 DvRj5h꧸%̡_z:Yں򖥈xp?@ BKH;%N錜* ,Ki-ZS<=' }ITZʆ]>AO_z A.l{ iR8ԹkhK< ٸiU֪p]$=}'8)G Ľ ~TnrE_) }IV$ߢlߴ)AyysG 9VX6urey(rErA]rܫ5DֻC> I0q}xh2gm3 \Avhin?eP0Yo*ϙ3.rsVB~d(g\iv8lO:WAVtl7'#lMK*5Hlؓ*'#*&u, Tqָk"Ez"߾d7yy |we ONa޸G =k&*N29=y|N9rg/Wȧ$E~StC9땍B&F.&9|R,:5), zs_z_OG4JFH*'p爼Boٗs1Y$w ܖVWlɧ݂+L?#OB*!s[,z~| 2!A(`o 4KP.0D$ Yi'pyN}!?[?{$h-׸d6gb't#s['n^t耫JK p;?[Qhz\)Ve<'rY~ !gK$Yy\<0膙{mS /I'蚜ɖ#u>j0]h9T% ink2 Px{уBKO[&<M2qn'-W:x*qܣV"qOk/`{{IA-tGA 3w]lĞ~8bt#(B+z=qץS^d>(tͺ|}-ŕ hMp&Џ W>^ybc=g  q,FORְdﰡoJ'l 0Fނ2gwOaŢԲ·]ˣsbPD_ɍa3;EEǖwi}VƤ):e>1/T" =s 1s&)E.G8.87 @>@g"s9d/Ԏ߿<݂˗.ajŮnsK1Cy3Fl EYae- NymiS{N6^ЩʜȱTmtU;6mA _"QG7ES> ZoPSj(/T){:`I0k2lW~B7:s_fnnVUA͘<oSLhb׬cze;?%f5Ĵoԧ_K,V(v}Hh5h5n=O0v}Ȃ{$^g g>Xi;KaF~? qSǺ~r} N*TK0YF/Зbdsސ{Fοgh,5{5I!oT?tBSPm$O#r]rh2q-&\]WD::'ali E qΔ 2VEN\*}e5dZKVcK WiGdks1;}X} Qd90K]Ⅼ"Wd4;aD~K -2^~l)-;f5Jf~$+QugƔnXU 9ݩ|?[ ڿ@Om~{OIȝj/kVg8kj^[LMB;o[8NZ#DJ}a8IDؼ|{Tc eao߰$# ;ih_op4L'vecI9xaM6A5 =g#dPw ܎5BGh3G&TgIQ~4{9zrMn!1OSm s M@h%y~ڽ)-sfT.aX =ƫ߰:(`nAaJ٣ڳڷZ_cڝ\ZQ*^mM8!ΖQ׺aO 9RiHzN5"h'KsBReRK 2}O[C\|qNث1Ϸ]>k1p)Qzf, } 9~A74&U'=A?<{\uO9FZy}<"SL @n:K%ƽ-TU4aNNp]6y@ަs݁SQ$^<4aO GI=oi8roi̠}keS0?Te؜X\9BG Z+ ǿQ}~XF7Ƥe$RϰK4h^ { {5hOOb*ő-k_W{ҡgyB>g*H<|×+HsH+450ݦ鳒Qh5NHT:M#>e5vbOuWdI/&& R7]fً8Ar_ mT|Tj],LFn [FzLƲw*q:Ƕ.t'l:'X@-zW4c(Bّxƾv$9SIgmHQejнӞ=%`; 3͑D2P&= TGzu}sA czғ?[,pC)29>"<Ο#W-ɚC+HHh1Hˮn;"?-I;rH+[IХ8ywhq]SuMƯ8>ãX(ʀnR vʍnnSt#1ڳ vc4?T繠{U%ҥ~6!l/]nŒ/Cs5H}0'7Ȭt^?f_{o J1jIGp?-VBB?O)*FQפ9),} 1b_;tk@S2ɿ8 /sC+e镶4Yz?-Xڄ4RGg)C^_6d@o7r[WgCe[E^Z<Zݫ+" o*'J wJg]_鵯5{7rK&rFZ.Kj)ȲЗlN RK\iP[E2 :YS3|FIWD֪>Eש[#}sGyzB9.34*ᄌ+"Ov+A{'_(['pBi\Q8@>Ke(Aǐn3{n?%Z/~1 o&#FQsLy PzfDNzQW?J}.eR"$@^_ '˧#o.)ZmN@[ zS@gdyY4~Q:h},*) tdyoȷZ)D-nn2T#,.)Z&`GLKI;6PXn/9jQ胾DMl!ϔE*tj.nGU \w`C} Zs(;&+a Ri"ɉ864B%KYm֝~#/q%+P6odU^:PnkQ[@& s[DE N *ȡeF~"׵!qWx~Z{,,JYwoU9FN:~_6L ><*:SCMr]A%vaJw4-D2lz+|w+Z$Ιcaς*X6r*Ō!}<٭!7(R)e۞ZyDqu4&1P~tƀe؉|ߵbf~^&*O>2L8" yH Xf^ȗ8UM/'6'ڀln򬎭k:M?Sm'p 'Jw\Vx@8\'uP藓?asۦm>[;}qfu=}+d׳x E+֯ػEov^wGc41W(YC3ms;M+rV>rLe,~U9(Q"rw8vL13 _03f+3l |Az^ Y\p.fxk`:- #lo~&ɉ2yVS<#Lzl8>M _G*JeGDLmAН8?ȳ~kqnרŽby7]J!VC.(oR\,6D>46s<\q?rG.otnS\޷rR\s%B>~|d\Y !xVK8C6y+-~l,⍗G9魛 zߧ^Gm; NԸ"BTKX-e^b2-t`epևO9 mu rIܷUB?s@)z t6Ig\0$@q?P ȵXVc臿V \&}Zgk E57BuZPKlS [U{Z~:zYi ׬DN)`W  E̘fVԴF^] - :$@.k\i "(j3[z/ H_r_jnk'p^䄉Ug`yG3~S9m!039_Pa\jiwHܼƚ 99EX2pbw\⵹Q59TډQb>!$dG(_ϙ #'o~ /-Qr%|^K<g^s@;v(/$'t 8x`kn#r$1Tغ}u*-БD#{tvNEQ֨ޒ8+3mk ׂ\Zvz_ġ n%he:&X\M-*^A7f& [|UoPjsV :mh{7nRV&{Z&8f:9!.r'n_8"[ŮH_Y *bK +4!d3f+4'ݬnoA֐k|? Wr/}ƒ]- A+#z:JA.|UW~n`ǧ.B׉Ody.4Ga8W7| F~5uNAw[~dx uVW$MՕXܑ7TFJ|k4ߟ |/р>F*I1 `5S?vS\o(Oe!"G$56FNGMOh^ =׽7^+e#6~ Q'ŲVI+S\ \<Tr5]8 i$f lm仳Ozݰfs b$'y#}8{sdWhk?%2pW95\R2tsQ'f)A;ew#7gfL"11FAt^Vx6#{mOϔ#8·0ΧUl* w A-q9OqǍ'#-'6/56ߡ9!crNȤ2k$\r!aN;Պ[N[XT{ +g1FNy>o2p 22vyՅ=@v#Q^6xYՔֱbw؋{ m[&ѷNu񟅰 =(P>5J^(t}c0;\DV t}tb3D\5Z`)7TDX>V/cOE"i1~/!nWH=#ޞ{`'] 0 oJX62!/%6]MZkM>[r$ )&dχ6c/ {_w6L3zAg 1ƥ.Ve|QI\$wQq}]G1/:0s3ZE6e V{[eY*/ܮzɿ@#|+4)/)>EŷI֓:a']iQZEv!0YZӥiKFB;~瑶dW8PANbh%/7*zU0v/.PRgf 2nD^;}Ks#[2ٖ1ѻ= {׸_O7\ƅxc dd<DŽaZ.)͂tCJ# YσJ7v,T~q]dIf;E1+>;Z L(C Q/uHf`Y.Y@tlgu*!GTb }w9H߂3 b{4o~C4eC~[c=sl|](T6c=.x$zw!9Ȯ=@xzu2vlFqڒ+KM}ڠ;2Tr-|?gPY*rD_m)?%.u =|_C`C`)RT ]GRNyDbS zLm-c}u&Q7tPABľE{+6+̝cgQvAl4˿`d $+utZnbBʸ١Aj>؝"=J=a` >ЫDv')vޟD^ ;z_k4g 92eH aҡhzY 6_xJZz_|ӓfa7_{7|L.*%~AoߜFF'ab@/k46r^gzOprUZ񁞒O3dlJ?kzV?m*KŖHQyGbx`F>/[wDaF*adK‰tGahNYklF؈c3}\]jɸϢ]lP_(vW@]:n%'bj# A(f2jXXj|rإ`p8^}f 6{ ujK4Y1ЩzcwqlyG7[\Ҁ!YJ<"DQog*ʯ+I/>z.M=-?ρݗKƙz $\R1}ƷPg#Cʍ}fYCdəDkZxt #k3# ۴婮ކ ݨBјd!?vA&rA. UM)ݹS˹D3/jeCK=5 yA$1QSE'L+ccN%ITkv.%N1C%CWoW=*ȯ?#&3vőnh]bgÐ{O<3 bUƳd~וp&VYk)ĵ{uȻQr F~8 mTb-+қQ)=T DރY{^}siZ(A$щۮww>^WAOPٛ__GTQȘ?l.ੵI ܫ)=}rDPFvר,A~ʬ$" j~N: l[nϯ3Ҭ9 ]'WUdT[B"'B1?jf y6C< /N_S?K zG(}R|,b!?KLGg(e8 rON3oLtʎ"7U/ ,}Պ?A.[8i|n! <ff}Z\/TvJ*? N {~9GTwپXFbO8Z\XV܋VSNܺAgg\) s4#aOJRj'o.n7M"7N>tTJ[ׁu+_8 zFΗOO2HjaOUN-6*] +~!5V-yOv^c&,_LEgꋤ=ٟ K4?ȌD>!j-fIaфU.z|OT8y7;d\P,`:A&_e5=kΩ.>ȍ<7C3*k$Z$~pC$W6Obt,y8 5K Vmɗ3td#Non^Y?Z'-8"'reϙTh9o-ᾂWhN'Gބ#sUV69樸'RLU7 _ZjG¢+Ԡz,BBnqdةщ|}`S3p^f\~tdIN0 {;|}k,|IePN)0yeQ^lk3>--wm477pP1?ϜNx5Pw(eHFkEdouQ<$Z m~ڐBW67ZvrTSa\n/'ȟ'䄢;CWKAfNRWml-o)j&2r Kk\~ܶDYZ$i?Z լe3.OR*\㊜26A3]u]/n1;r$$>{,BJ.5֧ ;}7V-+7 Hnf:hom?[Lw\\DyN }=#1P˔;e?R 3ބ. έ=B߹$#l亴69p,2BMwЋdoMg 5dn:bqF!^-)_5rCu<.Nnq%Um'迵cʲqK3`/ 17*ގ q\@j3Wٸ3,zf3uSY!lZ,ryke[L"mm SVQJW +\>.Y" \"qw<' hRT,dkuZh@^Wΐ4h6y֞K46ȳ+ .C\7}[~:C/Rz"qp"'hNYq vo.lB'Tk{9<pŻ璇2l+ϳGi֬VzSx2ZhZi3P*eb}>O#2txϳBWV/7H[P*?>(=y@߫'kZ*'Ӹco) t<<=y^;+ w6Q}F!Eɬ"r"!ϬO'4{W|"& R&yo@1wQQlj.I{D^NI*{phJ~n.uE6IȧCDi\e>ӯksz/ToE89=@nk8֐8ZŢu25a ZV鲸_ Z 9z!3O3] |a{'prx_ >̏ytR>NmipG]]oOjYDpq:$;י^NMtjvmqⰉ+Nyt@4ͬn6F޲Gޫ}l ܵqޮEN~@¾w仒>&wy -{K6xnDKBe_l^#e"mcs6!Azu)R|ҡ^OcF䝡]j z:ᬞu)n&ōsń$q3h2r,NAG]O٨Iz|plЍ i^Ჯciȁ83\*viߵ&:YnTP>OmM`{sNU>._z3sx۬Jy:APkD'|ȣ_ ;c>NNϊ9j E.t!1%lKJFnk$Ԝ H{TCΧA^sX rYvLpys`$vU!A寙EQu9=c}КDwF$5vy H_3acEDuSjVf \-4 HǷgOk+*|;fx[L xN/9iedX-?rSkEBT^O7o3uhcyPZF8:% dZ.?&k^6$%Ko۵&Y^gTrs#o?V6v"G0B_Ү'pHg:rk򶛇obe/k'1, GVJh vy4eՄSieJ#Gl귓}A3d^[_ϓrY,7d r2ȹ^RRC/MLx'pye ]9h^]6j)t^.T*u蓍k64j6pCo{В\cp"_a%EU3][׉ϖ.p6|_Ў2ѐgTHZD$m xq܏dAzu8ONۜn>FY--\ xHr{jxZ?Rk;zJ8Dy[ 8-\}E|VvS}vܠ-% tN-Bx5=WQʋNj-j t }MBߓ&I-Oh1*ߣ9z*pr>,~P4VNFNe23QLݥ:s()O+.r19:!X2y[TAK Yi|LVn,`I?S5yB)50zJ KAK *uл ,ܢoಖUK# .>*r3-'p\v"V .tNT˾Gt\K8-uj@lshN¸M>֛_*t5v<dugbDE'iy; -66{lu6r_jݷ#nċ𸐏\?'BU}|6\^?q}cj8⃛b2NbIWfZ=R\Ttu~} /gN_YɌ\ czҿ<&pIX>{p)ĸGK\="tCokrvdzۜx9&r|Ao$KDγ޳ _WU+!wX&pտ^[VkO":Ҋܨ )\Z~#)eȷ+-v[A.eWd)][Y:K4 -H%\qVl$*ۦE>P 5~!=.D_5Ru3M7OaɥVrUxpOKyj0qGM.}Ďᾷ/t2կ/@#Yl@N1tm*,y==YP趘ΦG{Inq*+1o{B#cGt V&'G`h+,u(/'E7QvہkOT|,h)'̃5b;ry|CnVi;.,Kߞ3C;r@|?[$vŕ.kĆw}4ZivIisN>RG^/ -uT/; ^:lZi̧\p96\-)aҺ'JBd[W|h҄?K6Dhm]SF^c4D>W ټOFAНNnc}\)K~%Op 'rhP3}[w.&dE&],N"ϘWݹ%34 Zݙom8er(. *ȵedQfkϙp֎yOceť%!E"irHV.y+Y#4hoѺqB#8E`hw3B%V i]K/|"yv# h"֕KTDrED$DZN5yȠu\m89{2 }7$߷ )bb3=;iC~ z>w a.J,y[:rqZŐü+ku2#x)x *hϯ3FЁeh3m)h76^JQBH^^5|j[ي*AK=%[x#߬!gl[gj[M |/a˗j(?)ך :q\\Xivn yޠۇ>mK_}ʅUGgZڞ(9}ԗMB>kwA]9L6])МQ/qc jP.˺dNZyY&ȥ$QN[Ǚ~,)j'm֑j͋lyt}JL_|9kSxqK|_;_쳞._:I^}%_og ~> 8`Okm+.<)rB{9s3Kv>IY2C',dv'  }Eȏ%2jUhg-^! i ꀾ~W6p]u0I2y>#Psoz֞r=~>yk! cYB#mt"` FCvz\z_ѳr#o*vbND~Cboo4M2yhDDBỌPiˈ}C+Bz_s?Nem $h"+G_OMYA8 +fMX3#w;%Op֍ЕS,K 䀸s?՗j;AӅHt?/|YڐCD哧 'g%1+ vkR4q_Oq Dn*y^OF=!? }D9C"tlQ^ fsЄnKy:Ǣa'rufV׻ZZn[GKn=!S,Α,r8@!+#;xM~8gOcqJ6߱& BcAS]&okg1tX浳|қq7y WIv!w]UO pIr1+8jrh}n+]ߧ.Q5 U }Yz-xF0KniyN%:zpQ7ѩM v23<J=! PVɘ ng'.F^ClD~@)le=uyZkDƉ\"wc"v<,ڠWm Mrz1~--vܳY{JVg7EF~[Z14/ʈHן-?}jrAUE_*vY,[.<zB#c_ {ǑF"OcA~CGf-:,2*EN#n}Շt=0tEJ um;=CD]^w>V_Vݴ{_wc.K$Bkno=DTiWx[;]^^R ud| S=wʖjO}$U~nqəO"f#vSVM +49A}ꀾ8ճݿ*4o+;z-ЁH[¼ߋS@TZ;=nGvƭs qK,ں&+9,z\bF9S)=KZs/^SWh/_j͠ugzdgK^g q6Ԣ8G)y}(7@!Y]VcsNN6,Kwռm,&t1s'Zѥ3KW`ϯRso *LtxY̋9`'DO3Z懾/t#5̣y#Ef*5!fm0hiߚE3}h4?9ezt[5zu"ÛV\Zzmڏa:߃Jh̉}_aVX1yc8SKX}xe=.Wa %#=i!,s?#|]8{z{:`WX]7:gA?kf]̾Z֜\üdR_#dOi'teeG^WNIUhm=W E9_wNjĂ=K:zLc iz.]Z*7s7ĭ vyXz#$2n-~pǐ\ :gsf`j꛾;.waŮI^a:g|p)7o 1躤jjIY Qb$1F2iGI3$|- jNF)YnU(c݉kw2$5JA !׽d}t9ظm>_w %t20~EV2Pf&%݄+$߼@1~S)k{طk-a]oT~~c kJY^}@l'a jiNzAo!j33fl&LGzVn7Tސ_U!h֛Qex3%7LxL?voA2`sz.qXs+x|X(Cre3D$1+C8Nd!潷4/ t!깰L`JJi@{D]'վ,fU;4$س2ك *Z-5Uh>!;MR%6-1-JE4~k1-GINok?ejHkȚ$7{<|W?N1ߌ|ڏ82s`S…>J@DB ;"AlDIX#:Yxk5_jJH3xJkIxbOŽM3v[W#EB=wkBO:u0ZC**)f" Y?LZMu7`/SӿA3{K&6jե/Gn@Q&ˏr:$k?kvRoG>kh%5 f5v5]Whr+.л(4,snf2?@VCIo?bbFCԇ[v6U%c]om6=15Fe|Ƶ"x9+Q*z8~ -^T ET?S9л](v}mI? {Gjn(ポlmThaݾ)o1ȭjo[P#M DMo鱋2'[b'UK&ܐ$$|[ ~x-7t$?֠cL bjNe'l˯{la#Qibo2{ه@ěIX5s&RF*XVNDk}`KaNݽpUnRC%)?O,v۟ l_Ch'B \aoiT/Q>® ߦ U퟈)'n[bo+~4{c&:_gB:vq?ȸ(D>k cAt"%Y]g) ܤyw|bU͇SZ>:`й)Z٣ :빁;!]`vbO}b L3Eܸ9 ?`q<=: AgLRE.'r^jE.(\4ak"kܼ4pqfHų)d 'R~-Yʴ6m/hX=/rw^RP;?Wqɧ`pi_'./ŵ瘗AWAnkDž> ϼ';=ٔ@-r;Wز-YEJUp;q2ZnX"Ad4k .TV>b21ˠA1, rObƖ^,|#ۯ/TEC֡i" K<7r*+?}вn\Ry3>c91_c{Xg1}MADS@ !B5?Phm jc՞cؖ٭@>}OOSf.m,?1y^8&lC}g4hvy/rټ8LS\RY,h}k)*^so0Pv6tVWEnz!05huk'Ey+2yH8ie\~ȋ\ȷ 6Z_aK$_P9 --!A76z}Zf-) T뗳r}O.kAQ!6YR$kĥay'Ang=lq[\iJ |DgK#5>_p3R| n x * 0ƵNѨgefA~:5Cg+QéWBْNAfoREY"􉼄Vxr.K⋜VP/Ӝl'mF^ &Fe:C3q\> WT|xhЧӉG\jiˈVEsq>)̆BdS 7z儞 o< FPz! rt1T^3/p'G %nߎ @'KBv#*'-d\NE[rɸ7mYDɭ65֜b#O6KuL7r 2oy(|"/УqF }Џ_'vir98I~r:{s+")繸Oyr\E|IYhx`hr"",YRIȧZ$6p.**_)ʣz G|E^[G~8[&}W;e4MM*׬E{^ȩ[lj!ݾ?9S ]bk>b|k=}B;zϬe#sd 9(62`1Qby!PouQ5E3/i\N2aCʉ/mBkl7]j[5Ւ {?Vot%l/A_z-}Ꙃa@74x˂+_!0k~[&>׭YgB B Z=lVF/?@넌T0ײP^#N`W\>?__aЍ-獼/Uӊ-ž DWS͕>Z\' VO]W5+Ī7r A'(ɯ}k%# >ˋD"UcJ D>!D^BtBQDKeߊ+aDFF:F܎#|!)] )U\zذg^rOp3/u+d6~W?'ҡc9J379TJNVByƖKA#:nuI@~6Hʉndy٩<:?j^mF5WKCNnk.sr`Ɲ$^?MYE _ѧ"Vdu2g$0"n.D+΢ogd.܃ ,{76U#? 4HjاZv6Iyn ?]q4yv&~"[dF'r$rsȕ33JV_y:6Q8Rof,ptrD]ʔDO e22lBfx"wN<0rJ?NZgKVed%˫tH `ZLy܌.!( rs=[oص)Ӭr3?|RX=),8 _!XزQ΍yOgYlj(.z~},Ny3ё\^M,VKs{#dQҹ@#oC"a.4c>kh;04i)70l Oz p\xwKva[IW)T)M)[qlz!rt(Jh7[lg%Sr4Ol+BkJ'r Og7,2'5Eq#=|\7b|f-\?Gշ@q7r[]-ЕsMN!QI[ǰO@>v, t#'^R`{&!6C?%k}GK!x@ߺ-jw}R&95w<mv[|T0K;' =ԱVJ6Z6t^Š Μ%ۚnunZ6pq.)*KguQ+rHFwy@<^ Z>3O?)$!B3Q$֙*~ FKyLfoMl8$ӡY ]{SEd\m%,ؚv}D)SPۓ5[8 m;YR-wbH /DlJmgE,\(J}<4aNt[` H?,#ȫ9Hv4CZ/-ngt׏o+ K}igGVo"7vCkJ|SU@1UN#V]#c'zVJ ]HYBLʯ-:#g$M~]To-?.ߦJANJQ5fTNÙoJŶ{ľ/쁿U{ݵ/95k rci۩c EwdU{4Xl  B^*m8\cWQSJhb<ډGG 都E.zkm/_<: gB?K{X=,x?U\".k:2eZ" `]7} ެ5ii7tYH f2~K(6FcO!,'v 2p޿<'_r5f^>WB OWqUU\,T]F*BIM fEēyX~ ې yTcC<&6ل`.*Y>S 2oj[}pV^DKfOYbS};'}VDfX@oEjK RߎLQ,R.ے9Sl& ˨+Qm} =yu\ݏ嫐(2!j{Xxb%{3>!rfn[S:w~5]:[Mf41yizZH6Uj9pIMCm.% "Cm"jAvh̄>fuݢZ2( h!(WV;H~ՒqcL~7'A>Òrg) {eLj; e*fĦX~rAY$؍]P+UUzgxgrCFIv5NX~'K\4 }K0UgTޠ#C0֙K#I*rF/ĮO+cB->Sz#ίfQucGؗ|AK0|HAn'ٯ+iqCoQ-Mq3\l7v]T1BrN~&ѰOň1F@z Zh~|rkuf ^27] 9.`_ m%}^7 x 9غׁ5躖z7{za\Ci-Xo}0r_d8eC6_%{ŒS!*z!voXTTYuͺ!f=5֛* <ނib,]~oj((]vOɛ۽XN0},˛UfOeV6rOLvXXk,J<\.ð)잻bh:jD! ] {;%9'z!U|`RbkzOUݵC_{Ok14 /N6eg]"SDnNNDR w ,\yunlne ύbbȆ >^| nOnsPZ6אi!:_6S XUhq>z+ z D#KtGݬJN#]㜥jIY1Om{^kbq5/}S zthMO_ Zbo)gsܓ" h#r]%E^ txs[`yF\mWE|<6Oшڡ* 6 Q$;-rFā|+4+="y "<;/:'p}F)t_13&ir`U"-*Y8 w/jw oˌ+rLn-hrW*=7Ќx+?>^ZZ/[D`׳dMMNicbCX"5ʙlb®,-l'n 5]"Z|UכE>rUT!n7'-P8ms XM>."}kpm؍, .%9_>h gX-9b0sDJlqvM8=qCl~ku_Qq@b.xVy: n^) WZ.6&|iLIΌ ? |t\ȞEf#8#'4NQw%ɖ8BqphRz_ddDm OIK@f \9lXzǞ|Awn9Y -qn+66g#o7D ų*oϾk@˗*`wBM48WTݵ Ϧ-zC܏A >AOf'O؏,y EvKmo6̠e~9-'WbDkoW!䤼=źd=Jgh 81;|cz|H9'ɅV7>N`Woxnk3U^GRҐ[e p].%AϚM37 ʏ3+^5bm؛}c3Ņ6Nqpz-U :>B- Lt y :vf[m YPɠ'BĽe5HGr5ٽ͇D@e 8\nqX-/x%tȔ'xjURtTKO>1[(> мm(aF%5ݫ6"_uYuC?BywO(3ry89A9ӢrDWѡI\\",iEᬆ{To,_VH"FޯN#o2w5~'8ȴ\ ubŧ{eEҖK#DYVbHg+",pVAy?͎ٛ3 C.T緉*>`M{ \T[V|6|D"_75V>iVRC5@.%ڈ,W-qmYA;{(q+bv-U-gvܝLX>ǰS:Q@6Т|P_.0/-r-LkIqniq5;B8a Iϳqy^|Q.l{- 8attd')D"X9g`7hOOj <۟ȕG|CN <L,.p4ZՄCO zyVBӛ5; x}6=*/3r}8n}b z(ΪoTjm}ZCl)gBtMoBsT` qy\覛Ub՜L\,."|Фlnm]MH)Gq2S[OiT[mR={YcZW%?T*rSak(:7] JEyWh䬈)jFn3kP1wT,̼Vn%x#`[gU41KӷaX*sG ̾&%xwֈ{/0Gsȑr=H{B|+}Bc{euˬ鞷,{?Вy%6eMtpzBNvv۪Y^\"3Q < hڻT~zNDiB>N<O^q^BD.!hT5K=6nBoγe"Fs@^3ap_P2Yo.۱.&g B(t2X3Tncݎx"O'"8r 6r"{#x'_=@w2,t0#%gUh sW;̋;9y`E%Gqdq)֫Px<{ǁ#ZLVZW9̪-I]b'Te=>9iVB 1tS%<tinmao0O'oTc|M.2j؞ IfEQDQnggq=u@Z7TBNm[Ku^" 4ә >SDA8뀾'/|B:o)fO͂-OȌϵC5n[?Qk=,_'EXn { KYMTf1W;zrBkROmSr^`%sqjUK5%/g q}Z mA*skz0js_ўtbAבe'7WbE2%.I #,V./BFK}̀Y^b+^z9E} o+ΡD &(Qm%[K%TmquT tueYUMjz-WyGrS v޵}kʻ&.v8SYa9zu<4#:'=`6xZ_V?L!FfpMSH^E H= {ElB'Y\heaKOD|@LE֏ΡL(q=v LENhbAGw7t حգB+{"?E `=WԦh){:RN.3 >+OnAw4td9*r IREZ:6E=æΧՙ1#-X@K.&ahE v[;I͆ ],NjJl".uk4=.Q>%<}\[,GzX]jm'vJgzYn'ЙC/HbaA-ݓq>!9`z`;0wK i\Bg$14y@V>rfɁm1򩓴rb̝جyFc+ak EbtDձ݈-Cdu(rz~Yu>c='˗ǣ~C;"{coz +N|=C*=%!#WTn5)kTi5c=[+4 XiBx+0t@5V@3ſ‚}z_W]FлNa}=s0'Bv:h?X@ U ]pRkȉ}\.[q否0>w&-\x|[Ǵb ~J@Qv`ok>:a]B~\NS\o9/th,gD5vuf8זRCŶؠT2%Y|3J6}зFEL5w9uq#f<,.J^kžE|;GP&KU^5h= EoSt|[Vd8 Xݠ'=ז~t_=s9EUf< S /O H%&C29zR'hyz[{ 7kGdRе5I{<2vN~"r41hi}R{\M}t)Kr 7n37ؤvIfKtQ*nמz}Kk'taMت^j$vIYTp .:M GF:ތi;yO趈]Å%}~忧Xw&^b]߁{m>q4M =&a& |V GHCA?/m4 yWWQ6H*$F3 :9X#.`\w8̙9J[ǖ˒lK@j BgDu#/#zZAIh<[ \ u%:ȃ'.JYC*L[h5o9-8u}'vȓM^7p f !2pҼBoQ w/Ij#eIOc"Di'IM`ICj>>kC;eȷ!h7lfYƙs&dzƹ" x]J> \2<ĉ.yCEyRtpoG#o |4$qvခ#8&B17r ̉Ƣv;K+-(8) AZA>g\%;2#Wx\-m%M$-زyt'. ^s~hܑ/q{ɏI,Ox@A#ANCm"uLcr: 8\d d"nكsvYE~Fď~Pv \ m%/qKBkvOM!`!R7i16˓3 4ʻL :_C | ( 8oҐ݈|xj|R~:qO3[1m!m@ ;3Zy+٬iq>t*}]KL㍼-ѭѠk9;vC%r Qދg{s G \6@ o'pQRm 'r]7Ke lŁkViVsm-G.EՠLk)BmovI,y.7ncAR7}Ÿ:eOPm: x̸Kb{"Bl [џyWfEО!DwQFqܠ[wEU\eF^tAѵ"۲BOxSnro*'NqH!oȑRUOwJhE^=Ù =]d])0H`pf=qDzoWz ^ l~ե4|v \.hfo?aD>rLZ=&{BX@.!HEc٠v\w~'FU+n-+oLJ#Rqkղm n,R~i"'.}=V/5ݿqt¹%*&|l[{/tXdE| fT >>|Az#O!(7/x<^AǻߠeHФ &"K!ϳ2zϧ {eE˙*t˙H ]lC^}4sS& :] "_qi^Wܸʯm9|| |,RxZ. m9-z/dhGKx;B -)^ \ zOD.oC.y<ϼFW;|}P[\i>L>Å4|C:\;"N9XT?hȷ~v1h٭6xFYyȤ‘`6q3] tlq۰b Bjv#rbns,! Ao=#rZC xk [<E3-,y-WKuxo$z;&1씖'r[b+ Sqc7S Ŏ3{6YZZ.r_+!R{%hİ%BR`񅸻M ⶓ[GgOq !,[$m\*9ZeDCSYG +0,*D&HIږp2O-,E4q}><)gVo*+].fFo俚}ǻdaYɁ|VC9}OEOpUll^'I膞(rs9s%<ܡ#oKpm'㍼ڡ"_zWECQ+q{#YyƑ!`$*o=!ea^ϋe$oh!LQBƧج9pϜrT^C,{RZDKN3h,-N"ruAn͓=oZWk,7= Wkl^pb)0r_'^qM_ՙԱ}=-F;g#zTdM{u{FZMɉYA_2";dribg]5]:sWo- .6|`u*hu"_<mz1+r̀JdXߜw;~Dn={v>sLM dWVol'_KHG%1E"2B=Ta^=:Ce<3s|")]S} e' TzIV#gnɤxuh] *{`5ۻܩ-Eg.};I+dP,j:R} a ]"2oxF3fo'9y Mt[ ><||,ϒ"ߏ&vbd=%Yb/ BTPhlY" k VRO貖2ڣOe>Yv`mTL?=B;!23ӊɤIwKm% mzϰ5ny\`0*"g=vCbߺMm/ٱ~`OZL1ݶi@k D -ɎM"2L&ڡT܅G۷XNѻkG9j<vр{4T~I8w)D_1cV' |+i;(s=ekuBoˎ 64FWrtTU=;\Vr[՚c ]Ve;oc3\Ĺ.i+I;8"ۉ\|jJOj" M>SmF/|@ WlNZy`VlПOo5J6q"؅:˵fy+VD#wb{>~T\f$9mŵPoҫdHxgh^e-vzH/-]DsXi{"ŜFQ ȻęݽF7&0.{ J}1Py֑_7r[t56"FNy;z |k~ r+׉g\ 9ӚgA 4i\ƑgV}9_-"7w:6 n \cr/Z,<7pszފ&v8ql4'Mm 3( <&m@OBo't/u~wt6&XT)oKC zz{7tO[{'lQ7,y7 92*CAvxzσWh_].[Z{ֱmɸ=tCwK8"{CoaM&WA\;qE2CшҠ^^z;;謍Oy0R6V3q*oQKA˾ڲ0>hU fx["fл\#/B뢖xBR> iU{e䵲/SO`_Y;8r'ݼ7}IyKA.٢ ՟ l |VaGfouD#NֱB">9 ۬&Ü fShZmͰV{Ur<գȂ=T |Z- \nvo.oKx\}5D=^[~DW 1py aWb pyˎ,_#T+R74sHU)Ul, l ;|"_,͊v\D,knky4CօZZޡoD_s_*:x[1^+r[27Yߝ~ֹ߳r"/0g}F_)D*izAq59 ȷ9vOE*{<(f |8Cŝuq\10T6q)7@I }޿CRe߭\5i-|{}Co tȐ7o)E}.| {z@Sn'7jn5GL/wE }Ɍ<tLY4ퟔ{=ޥОؽF =;}TIę<6`!c\O5}xޒj]doY;^n֠wfwBy5~bxS2Cڿr H2d;i=7s`e*]J!g s`!{z[RN;fLE OT_M. sLJJN獞K=?] }EGzu[{SZ7_d 6ne~Ҝ2nX*ZHN=Yj,t w2+hN[˰;a9UozA[u9A{oֱoۏ#4NTM:Gn2 w=?"1=LRQٮ#wjJg)LWb9GZhX6o|\=zbO2;'*ؗLة |`Dc[%]OX.Ec hI ;qzhyzr+'tޚWt[ ~z*'פj]  W$tS:9iFBSty5$:$ ~BiZYd}a׈ q[?[h#m}8},tlbOrIRw Vˉ]G0CE]"S;$=$~~}IKh4*ɤV8ĠJ ]G[tY`*Gq(|N zrҡ5YHrHCcۡ1`Ubn>9Nix飜2ͦsͥr+m۽]Y?[F{d }$Bgo]cUOeްhs zj^3,br2cW`oK*ْy`֩%h'/#'a:>!ӗkkו=z/=.]Pb}Tb'~ek:́ r;>.=#VţѐݓF[+z[iMۆHOWpo7s0Uv _&E2rt ~rt;>rC c坌=N~BWI(`a6Mc5 2h|;+.aSx`-|-1]Zr5w: :vBo@+[cR rƹW& z p*t%.( ts=z}zà^;uCn&-'?]yTdxh'+Etd'򁽅M_A{݂5j>K1z:hO "hN&z̚ih96!(ߍH[dTTႯJ?aKFThi\1¦pQw|"=[Ѝjr'r 'rUG.lˬ30n J7.*2Tb=r~zC޸}0sy6 \m[>k|Drk^.z-|ߙ`#E4{&hNs5M܍SR9B%-N= R'1_;T:.F6StWE#Te>o%}p^Zug+[ R.rr*G21f+F;kBOI9\bv;^hڎv.{n8|~5gΙl[ hvi\P G^-]fѬFmcy>!9ڸ9}o9Y)5uƝ[c":t5"ʥA?CĽ*+/`^}p/hcyoK_~7~:NPxx!r}<f͏-7M\:y=>nV$>S)~BOK [ԦiJS 8ILpEdDx;-ݓuMA:3, ao١X9>ߥI̯R]*CL SK =k6t}|VyQPbW;yՆuj=o(W/An:Q!r7LJȽf.\B)2J;Xrgwgv9^j7y-[`*rCoSxP[-ߠ^3_ޱrB6z3nqs͊U+z,)g*7M 7[3C/%{Cq}: ~EwOR tv!R,v [ȵ~kx0䊈4s{聦OޜY~SS\*ܖ qͥ8T%P8--||V>o[ {2W|  ﳎ73V!*{#7 nyfH^,_P^Z7ܡ:MuyMh- pSކZ~YfJ.f-{=R WgkOg& S+U2O~YvzXyjm[lru--L6pyƽRPm]I;1iUJFQKѷ'vg\ "j:ayO3DR/ 䣞~<؛dor_({[sC3TF4=sqsֲ.Do_썛D\,8RJumS"_ۍ/†* =M(\ WE Y;} dzIN% Mm-cۄ'rƊd!aOe*\&b6R$ |y%/gMfF"ջ/}i<:+1!Tq/9*p$>bi3<_n"Kj79|DI-ml@wZy_dЦ w /=^\:2_аK*i{ .J|~9Դ^yɗRS};^z?1/蹱:b OmYޠ7%}Vu{szCQV5mB ,Rv7ѐS^zҺ!עvO? F Ji; yv]/>"/Ņk=k'2ۗW1n#M ϩ_@:mÍC !COYS{}P'F9sVJ]Ԋ{݃U?.1q 45dD '/Rq]IGv]\e\-Γ'v^ΚqЍw /9x@eϠ/ 솵.[r'5>"1僝, yQXZ? cmгx-h `W{@O"sz\i}[{tЉŦ._UDٳn 9_&.TzB}%Х#Nkm'tS,E~O;>S]y{k9m+_g#hѨCΑKx1r:]k0ƊN$ѫ oʑ)-/շ3bH>E*tKF[3E 9Ka/WWlG1rbX=MջxAOQ[﫪'-4F>}*o!isoQg^m`gAO Ry9i7 }4TTU-?dNZpwk'$DKkw=e)^*4a }CԮu*!I7{soORv)MRRO?^gd.*цe[{y0'rg&*Y9^jF4:t9x@ߖ@d9Ƚ:}R]N,&3Ag^kO`"jpep &]G,=u*5ngZ+d{}/ iB'͖>=t'x[wp?հ-=U}A.l|B{=wwzD|hV{rbO[2APy@j85Z^Nl[f$w8+r$<.u8UeM1SRa;7e3]*KL#^ ]5hPK!~BW'ǩC+z.AGT=G,&@_)ms%K7v !Ц|]>ؓyI\D Y_4Swں32NzZE T8oŤҠŞH3 {{DN~"5E*v>˼hY3t>@ :,\@kȐ@Ga2hzu":> n. n5(.t };'5-_Ù:Ƶf%Fs;Utq$bÇ@]>.bƨtB}T I:?> !|N}J=kEfw:ɼ$+8IPeqkpgpSLr<$pmexl^~Ztc~*.t*s4@;j8$:4ԗmInZ=;ѐjN%h=m1nz Z{_{ũ,5%!vbq|!Lv +i Z%h|y`?T #9$aN 9ɩ@}AYi2cO.>uN;E>LyQBH3f7;f4l<>Se25Vaa1;׮$߱h}ɚi">{} yY}ktgЋײHIOn QO{.=֮ԛ&_(Jy=XQno, z.޸~ 祬 םz}K `uxo|>܂x{J*#nDre9c|/7jbo} ~Up/?=Ϝ"ߚK,֭xϓGw=Yv8O\^4޴op_0⑏EMThN{އJK_r 9niF^mshcIWy$UDFG.C|dk$u +AAk;q@o6jo "|dWwBwo9/k$z.DЪD&ïJq|Pƽg )]V $/(,[dv#O,- |r:El[Gw_O*9#?ܜ>q,bhk-XU^uBtUAR*MRU1*3t8֤yڢY 2"ǘ8j)ya\׬:7m3Cː89ђa= EsC8y5/S涚+}Jc(yoIkZ(Lhϓ{uU[<Wb{鶖γ(G+sx>%GB$|ob +ՄR{&d"N^D#EZ8d?4Zpfiȥ~oޮ~b{Dȅy sXIJkBr7X7Eϑ晜1䨶AV[7pbiv 5-5C%y"_'XT,)bUrig7̴{C= 8Ď-wULN #NC]Vr >}#2&?VWs+ Z5ptrR#YeN7|[. ?ojLd8]pVyqd9%Veqܜx=REU쯓sDS᜿]}jmuUş}#/Р 374|WJ:ιԱ+.nqNԖLz 7V^tۅۮZs{k1Y7rrp.80\i>f=iLm7r0K#ZTŒM ܮ |Srx8B4yuWzN%lt&zAt赬3qMC򍜒? 49NS! /Y[Ȥ,DT7645d2%_j'ϻ8$0<8^ԮE:toz#k9Se)V|>7r B7+-*V3O[wJ| 9ڸLP!.>?#_ʫVd@uy.Z߸IUCx8TJ[#ceh7z,.@Z{emPS0+E!}IɁ 9QAWif2hޗƐ<{zhtJ}'푠eҹdɊ-7pt\ڡ+\ظRDNDŽK7.>+""$/Sę'Yb8Iom"@ݍ0ku^75_}:I7\H(lϋEMÐ:Q{]$"eU/2pΛU՜y .w 6B՛~V]?M!|8%^AEN>O9V&(n oE ):r Պ|mK9XȤhF~A۔D渿j4EE92/sl+~|zo޴fp79<]*k9üE_r?ђ;ڰwy߉ΓthJFeMFĊQ_ZCѠn5 Yj8Etf߸oQ/Uܛ\R^ ||Yyl7%nr>_ t9AEwt'V;k &~y7-k=b%f'>3@ޔ_j6َ-PVoO"D\2X>)Fozil ρ}e4P7rT|3_n>+9c]cE23&E]Nl'< n>Yg j|Bo3_ ]-kL%:|p7^B iݼG /;:J'o#Paa.pIY: )CX4Zե"(!p!E6olyJuy#!>ýAovF]7s?| hȵ~my%b w?vg[/egCO'%aO+X(tFnyZxu}k}rnm%q?3r簎C|f* 䳀hoc~q"97r%!v[8G bЯp yToLū satj-8Ԩp*t’¯3)ֱU$;Z43k+_z}ωⳉlgwaD=-l3-AIڭRNՂ H |o`\vy]^Y԰W8 RI7h- M˞)`VƶnlWoMD>sj@;۹qs +ˠFn+h[y9U.꽦?J96l7ɡ7KXFX3cAv.Bȓ\:Y {L%_:[x"'g.$SMՠK]Nm{RΑ^~cw@._瞽Q.qbkWubBƮnR168b}rF{o9rqˤrgqdR-i`[khҕ^ŭjFz'UNΒ!SHیhAޮCB=-=v2O%{+:_bRUW5Po1gz՞2Zy:zw6k9;o#z7>Үسң;]^MDboAͤ J`%?w~}h@zZC٣tN==x@0c,W4a gҮruMZQ=Yˉ'G\;8slD}t7TĮzSGT脾͒AmZi;bZѐc^9/,A"Iůjv2dyg0פxb tBШ={S] >=l@{J[so\PXW$~=j{O;vNй 9UB"c}?C"بrK!'3 \ ݂907S>}@U/!6=a-FtdO߱Ωz{J})IJ߃#Y]8Ǹqu؍i"@ms7rY޻9XZ7}y$wR ['5nrņx?[yO z0eAۙ.sB`!?w_#\_E9ka>o0y(Ak'ˤ&Qog3=^#oMEM(߸ǒE5ʙM3Tr;Ai|#Zޠgs#ҳZxS{mEN".seϮ5݈g Gw%T{~Et Z.H-N xGB{;ƻ9 Ui@qfe>qn"r7pWcKC.-GX *%ihk b.omi1Mhy#FAjqBQ-|AA,F>󬴞hzh h I U聜dM>o`zE8E+}ۍ\J'J.'8p[A譐Sa}XJ<ɶxM}7X$\>!F|1f#Wo' .pr#W)홚w㐏ܳpWϡOMb> q%ši&MOё;O.C؊.9~~-pLkT ̸"T1 \CkOh*'?q5͠hM'68b H6*93Ad~" bu3[4g -9fi!X Zq*4I29ЂJ\uϚ6Œ_oAt.o_ Sf̜)4e48nǢA>FNlS{2C6fi7-^DޢޟI v78JT<'˹ BZ3]8 ʡбޗV*=(I3Vz~ȍĉSXӖ Mi퍛uE.+<³~6lqInQF|ňK9$Յ.>V7h.- ;{e#rr޸pO8ӕ_$.ЫM7&|)rOV2ܚ?φ@%DgC' .*1yvoym%m4e cm!Pli vM{y*Z ^{lɥ 4qG^Mdr;>ϙ`~nE'G>s|ze'VY5d3<=/eM8t΢rF FuʂBo~oC$H셐Tiy;N@ ͌왨lʈ\'C,ȵ.O{Vo.MҠyq- ܅#9=$#Xh_,Vy":F7]Nlu/.U -1:4LM]=&C+%l<ܶ)69vrYu ̍>'q $Ϋ,]ON*Eb\'YGvvqMyFuhmM=½~hvn[ru@Y}az(fG\*\ŠdPq\np"MJ*]JБB9 G4q/Cb .S4WJz(LVVv QVV2[yVLЅ>q^,XM2rO*r*kDޱ5Vs dB Q8zy$ Er3I=7nˆgfȓ m?&rx"L`YW U2or'Ms@,L#ObyΧzBwWPT-5Z%qe^+MD6*pAѰS[Y(c՞~3mV7zXTO1%{E6mUE)߰VKS+PqS/r:]ozXD[P@}!ry*m@Snm_#-'o+ܶSVtOFt.MG[A}Dt-؄ +@N>v"4ITMn . }Cښԗmty@;Gef/u{ׅH:ľZ r%Q&vhqFzYǦF^jtkDWz35.b UhAy-N-,ꉝhE q^*m$C'MvhPޒ*ǣ ݗ5Zr1V.mw6 Ѣ'vDߗ:mst!K B_Ԑ1o-[Ћ}]e_Trr]sGݠIR>[NzcmqG B w :0po'z<;cMF.Pe% uB8-UmUsc=*vKp rױzBw`Ѹޥ3YwtVv y{~ cwL*w`BfK񠸥:  o:5nUNj|C'lCrR+i{PqcAw+Nf<и_ !7 z*GBw1rW9ނ ke :Q"k"C{@+W}@Ly#Zԡg~|5@?$Bg&qḱ륚S '3G*= ^B|߆{.5+{^7 hKDmB('vcA?$Y\^,ML/ )-rGIY;(IoϥTqq\o_oBX'zN beu}YL_3#mw6FȭM"Sqz t\-^'TYXk{罀?=%pnФMz0%ڶXsБ;L xؕ~\@+|LCkJo.`f =НT4An~Fz?ENeRu=oGfgF!T[?MGاZx96a˙`ǖ—V#H6z΄Y8Q5/p{c|!O4⮑q9o#)b7 ډ<(lSj 6Gg亂tDR[8 اՉ_Dq鋛"aw\zʲD5>In1Zi߉S[*j y[[-"7nyh)z"Uag(l RםB3 'C y?z8ǒ7#ša|OmaGܢpB_{К)ryFx7ǘiyD

5XGxRa=oVV_ݬt]Wkn~ACk3wA>7ښaKFne7ʓS z4̆nΡ ls2;}<1j~j9! 9/ҡ;2ڸ%h[p xnKu-VgВorxsqڐ5[krJ8ng9C,ꉛ(vg'px[e3:{X$*˙* *ZO}fOv%تȿgV5d$|BГ6zk9 pe$uKVܰR5Z<9 #G 2zY<:2r4(:V`U yFAjr"'A,dt!x'r'"$J+1oQ_%DFg/^_1y FbVoq|x)?GiKdrJAY@Ϥ:gy#-،79Ŏ˗iFnY [RgЈb[*4:V]%O E`n_ygݓ#irA_O.A" #Zg}[|;9wfF'>=aW~J6,$ 6>_5GiV\XNR~2k6b_ ڤHٰZ*E#Pk|N<IIo&Urs$+i(N䫓C~^ڷĞg``F'ކkrN)iofdw N'  *(ns.,*4kf\uTl: -) ]o[0pf\ؽrڻ :u±J뢃E{C} gp7)^Z!x2A;%}=gj}Elp]6ZfX/C>}<9Oʋ{K)طn#qhC>}@mW}\e*kB | > z/FN%&p~sqCVc:PEO- V_pš(?2py.5ףE}CfV8O}с,lŖJOѺp#NƵސY *!Jc:I=U6j zIB^;HLz}[. t™dMdDðGoS^2 #߄A?&E^r@ l}^ȃF1+ sd Rw@w5[8iajli1y+7Gce~VVK9*J'ֳm,rHȽ%派Q 8zlIo(&TGWhgY|q!FuYr%\=ۇ3&!MH6*k|Z" vSF;ۢ4|iP[9UeRh傽Y{n V.zd_[ϔt)'"/:ٻ!wW0yCæqb h=ǥ9:F}Wh/K>ŧo{@'eq697L*~ zݣm mEh0L']LdW]"gTOY9J: zzkxgV bRr<|6M.)>IR+T.c %r܂GJmD)|oVh|D Yop@D+^h>^5 g䫻ENt_/gᝒ v^R>>q3}BXUh'p@^?:!tZ2h:<~.Jgkؙy2o0m:{[_[yZvJtb3Te=G^ŮqX|wMEG.sѠoe!jf9d݌\nZKx6_g% ljڅ|D/.W7 xWj$OyҪ7\\rF[%&н[-raVk?Uw0(qv㶮mkRhϼ}*3ap=AVrD0/];>rUoKe@oz:"j]|~)8,+ z} &xVdksJ 2GO!GWH>A5\ LuV='psYA\r.Ё\N2NVJ*-r!(-v&i ȕDO轎uuȝqs QacMM|OأC[df-{/ݕgO=qI_M/G`KY,4g~N,})PtrkO.p[$Ad GĞB,XǸ+I|"wlEH;'Ox4'v"o 6IFؼr h6cYC7U5x)@fyqirowC6V k'D.8~TK[ ytm:RorKIl_g%UEB|=Id=j5C3r9c]Nu%`+Qmr]usЪ+G!r"* !?;Ky+ID>v W!v|S2..^eH)|xJsqΝk!|B2x g+%0ȟ'[C*oR&ޘ$S'sՑL?Oֹ F>tʙ׾dd)4NXh[yFkoP£.K[PPX[hXӚ4%oM='Fn0 y]|xK6|eOW}K"s'[W9E} P{oMrv.#LnԷXfYYNlO CE.˧J6BYes P) xQNYSLhfӻm=+X;C} 6/LBs)]G T8).ͷ>'p-eh|QNm-13趖;rWɡK! }v'SF>o`neN 5::/ CS-!U[%9\ST/uJ蕛YRBTF?TEpLFmg$Ѽ5ԡdRLb+6"rǃ#VdmǾ+}B.ܻl /5G?oOo$2+|׆ mrZY~͠'2-Ņ@o Vn{'9'!9=w"mG"v㺊 9pk+ȉ3|ޙ L[p${p~N(!X7FFYƞ{ ,w,7e/'id{Fnm%0 x2SARMVkiP2)k=\/BK__5yZb& zs[Q+dvAC]B)3>< `S5=zpC!9M[ 砀7QJvly%tzkgOTd6߳3^?^4VbO쉸Bo5O'h!]|Rq"w`#_YN2oU@W|F*wjz-m!,F1YElNzؖU"ρؗVge#As ßńն*}ʙJ\ܖ |Ye=7- ̂y dOXVD|#'hr)p\/'[R7c/eylOz_VZEXm$ucS#&'*:K5;v}BWn d_ ݐtrH0o ܹB!f?/+<]zP[s8Q%+ɟ]7r9b'8f3 t^ޙN{u>s }ZQV3Jz;7y؉|By.ML䂍|V-f'p?4Z!V9s4ޛG\ְ6ZC4LS6&j# #ڊ ,[tVi~:Y2sx<1N*'6]N0Yo|::>[L.JWYZ Edз'zxЩ}+1T?=S$M^ N}NMFpyl\~9$kCDƷ('p57cDN-&+H59gU婌Y!!rI x6OZQ]%zZ=~i=bZȮ9$ZεBwweRM_9?~"yџ"6Ũv"\NFkrjOb";KyCn!yǏ-LHA5vU*2?N 'AÂ7ipă m8ww6{)=0?=ء'VD/3@2J9Vny# 8MgA5;mx ]rLZ_j:+t]B_綰%H:g"rhb~CQ屷~.('KUNg<bZ@m_mƥ Hni 59"jV˨7 7ǷTct{Rd,]2D٭=V^>@'}؋vR .E"ldɺt`_CwcH$j*rd_ :8bKcS'@?&г..>._M2_Tv52ˌ4c z37)4fu+rd7iy4W5Ǡ_.QY~Az"=4gM6m\`xu_S~Ni|Yzѱ%)IC)կ\ QfT7oO cȆBɍNWWㅝW";49}aߝSQWD+אVh݂^?Hf@k捻]b@3*rpL~_з1lIy5*\"f.+~Y90#&И<<L_j-G]7 /v˾ZWǑ0{.LNi dHHԣ؟Ø{ F `En)QuT03B, | `+e^9V s]FNSoTA6RM?U}HR3`!62Koao$ceSVi]Vn^]?}@˱vfiN~[+V'i|cOa z@s GV+MJp=#6SYCpbu$SJ|LceI Z˯>AOSQ CުK8zٍ(3P* dKNKO/~~[qpԡFZQ–˖Lf'vDU[OB?ˏˬ:Ə Vb&1~sj@S!O/T^"se4wj_3%:X~}$wĞ (ۚ#'57_R ehWOs[CvC`R __@W¦ʬ(vZ<g`=/+U>kA%f|7~o6! $4Y겼e!SЭX`w,- L`<ɕM?ZͶgS \͵&6t=+#^Se8|BjB+6H-zcXr\;׀OВ4_k[-~0+3^~}5_V*gkhr|R}HȠ+2 @7iZf/QNR "$^RSܵp]mB'4ExOy^i'%]7>kwc؎1Kccȣ#i)ؑ ڠ =rzȕd&8CľUf}?=[̙V{ő+Bȴ6Ea-I=!ȟ"|y"Mx#Af czM}toFG_,@6{L^ bHVŞ 3J̔{A1V dX,1Re8)MAf~@J7VC {%Ϥ+ӡNI;Ij˧0 un om7pv^:t#h9__ҏvuKolL&O.a?п{4BP5>:#}MIe 𳤿.S?%}P5#eQIGfH[T3|2z\пA?{艳"%3iO2) a.`S FREv}B#OղJ;s.#DGQ.g{b<;| JOzl7cCS~կ7Л+' fy޶4Qzo_I4M5$&1G=ݧMmGtǟ}7})9. <1h"S~p~؅C{3*OtŐ>}(vU돗? :3>ܮ m2pjp`~B+扼B詇ADz(1-zvD=+q _r*3eU}#ߒFrQ14+~F߹RאNܛR:_i]»hFUtpUL;qEϟɿ-VE*6j'pJ~_zR4kwˡy9Y|#PaMBqm>oZ?Meuaɉ|+vdů^^ !-jb#l]D9/f 9"ifčisl!'?9nʉ|mQ`KĒ*8q+Am-v˦ \ϊ/Z>4nk|5$?~#Yu:eg$#yrB ZTO䶷mC|LnAE.r2=PepAU~'EږwϢ I1[zd5m141.KR7#tp ̶CGV f`48mQ@H9:>Džfni7o#O z{;p! ]Ю]\(Zqsɸ5iphG츞(NȔC[t4ipҾBDtW;sʧwCo5xf*ХsQĵ8@>_ !eUjR=mZ d5tv/_(J[!8o_g$[/%ZZx^&% 7 nh!40%Z,*1- ]ܦπ眙^co WBem,*6(v*3ʑ>$;qrƖ$Dno zټ~,%3 sK{P |~'p?8W?e_c/b=ҨȩX@'Mx?c Y!mm3k*U3eQLbt}0a#l 9ű֐+9o#Nm#uм geei0y6mQyigcT.#|jέcOȿE?Piv[_5 ~?1EȾBDcr->>}ٸ_d`+I%,>cTfvڠIY7Q#eѐ'5˸ <ךP?=#7h !j:A+U/[(4pڈcl٨HsڶrÌ9jCikQ>H8(P>x+ 3mpXHc>u!t6k |:Cq~4ȟ&s9<!ko0SVFޗW8 ,ew?%b}Vb wQ>p$<<)Ob* x'z!{d*Bb ! k@; bFYJk,>NͮOdalEd0e,r/}Rk=OզRND^G+regybShB9jv@e`n4vZo_>5hj6]9KiVlY˳+}(mj`ϵVzTC鮋<*m%UWl&_Oǡre 穵Hݼ=D"Itlgqޒ}JNGprLWRcAEn7pf4Cwo2.H,N =Zr9"*qKЧ*.syy~~E<*+= ,Z(0dY논{qV<@[1vb/+zm}Hf+в=UۉWAN㲹6 COn-Pqmܲ*6X`7T-+3U$&#q{ʩs!maiŔB {B#iy]"4`+iv!)K-#_-r3(bsˢ6lVĮ {oُEc.>t *"'r^"}Fn慡Rnvq#Nf]}6I-NQ=? .Y=oa\$N5¸/b3C>D^Ң놰b-=Zȭg&=p;?!J~)qoŇحrOꓨ \񩇜5EJ }WXH's"@nμ g)ȍ纪7JehȉZQ Cr>ōI__Qh'_-"yUfs&Z/VylV%o([Ψ(ې <њ%816_;tg?VvF3l3w=S&Ғ<O\_R,u|ʟlr:L̀#N o&nO>Txw-΅Lt^n}Awn\؆ _J$_c~w-_^#e-Uޗ~Œ0ȕ7 )#䔾czvEH{`N،^ˎ-uȉ:2nK{I::rY0_[>FdX}"A.bQ:t}g->T{=+*t7|OR+2 }>B7v^>ImS] 42z+cgRin3RZn҈K:r(u5$%vRh1~p]`/505I/3#+?ȘIvǦJI7*zC~'VՇEʴGF4CƮfgByZ)5xU^ݡj CYl>+{aץ(}hwgf6&ݤm߇Hξ=cɊ ?̞;!KtɯDT0)=JU :( ŭ?W(Ȭ2طаUɒqؽŃFʑ+}{K2N~cDP>5wc5Fk.歋 {/IY.eiՍO~nB_s%  w5rWv{2`_/5ת<|?Gm[`р ^o;Oyڠtw־>r袃8Y/UnjMtC=&[&/m^h0{2[m徲ڐ#ᅝb 9K6dL/?f5K-"AY{U:4O3]-^ڒƋx:Fd78+씧'1t3yA`<@lAdJEn[TlNRC-u Pcsd?"'_d{SLX6|-ק^cbd#К$=Hb {Bx@ϫB_ml=^^Bi(2JmpK]r@hyU]c 􅝃Y4~cpg2 /K}z!.4kʀ7裙T})TjnD <z6E!ܳkO,N:8Uh=Ya-#+6kk!8i&1)B!{*_зxր]fdyAQãE2>j^ב{5@>gS {+C;S='׌=:  ?c uFCҚ潰sc\ qSğr碚m/VZ_iVns}8fN~ ~Bsy^d}i+$ER \cāC7۸,సDȄl7r ɘ x_z6/ht>ښFё]Ek, 9~qǰ1!WC]\t"<4<## C87t[.rvρtY; Q+9V{W^ccb#{':˟prdz\C:O,'Db TSn+"&˨螿zu6药qeIA&?$"/{M>1E?3).<%j=}1CA3-?穡ik-|!1sulI G{ kRN|!u|3'G0mqUip.L0if6vzЧ"zn ^V7 }m;h>jkdp[ V'n]C)f52&YDIuUU;}qj Zeʉ;i~"*D~?=C.jnۓ+gMe ˴y K&SD.M_PZ]cV |QCW%fx]A9kȣ My*RYBU-;}~㴾}E8!Q 6L#B9 3#6_!V69r(Or :;s N>>Hoຊ%X)eر/mW%~\-eh@7{RA ˀV [`ӵ( /Ƈ(|_fµYMIv:vA˝fQ/Ñ@ˇ ,,yoCF%[P.4$m ZNf~W[?pOK<وgB < "|T-޲ym,F~eYpՄK؂}]i\г׶ Qal7w TzHQrzՁd*tv&&ue Z|M-dRZ]=5uh ݸ=m,}N[.^)t 󤢗pl!8'|\59fsy5}F+'"2]Sj-=e˃\[wFqD4frhCRu1]r>[i*@(ݺȭ"(ts9jޝ-Eu-2Y8Kf6Y M&**{\+^&ؚ{oR ۧp@NGjMC"ZW螭X=kxVIpoIO@Sip~ \MO{[.H= Y?ZЋ\[Zݶ94u@VoyjW)2./9WH[(ʷ-͹g$B` җ!r ڪm']4[jI/J8!r[' A(;ԓ}SY쁔lj,{Z[bɳH3 ij?+ vs?pS4+J(qÓ7nj {o#^ςg~!AN3/G x˞i'i=0svІN .6ϢztF?Oap|?k@֗49!V \"uBg]$n6d[h~s@_"*oSrmb=Dž:fAcq[i=5|rkE%^-VSc+YݕQZdfhQiD>B/ d J 3!'͊cֻe5k6Lgw̱U ,< ^,w7?'pȟsoai9⚟R]=@D*4rɘo Q7jo-bq!7e0eu 6/[y[tu)ϪT~Q*t { h&GK-9 o"O-+&J+Z@ ^{*߳i1Sۍ5;_޳29QZ2 lr $oXCzՓ$I>]&h;^VBXOY:36rgy,O6#d'luJ%uutAAe\6oKxUn~"wv5j%Svcm*rOgwh*tb9Dz?_~`CNl~5%Fr&ȉˬ%$̴a*b:Koɇb%X dkT:!Jz'(?{®ra#t = 44O)|eTN/h$ˡzy]T7O2sa|"ﻭ=P\leR^'`v,h ?AAt_=?Zx_s62{=`uv a}ȭ]55$·%18wlj\>#WE~썜E9qzH} ׭ұsr Vayʰ!+SQN .2ȥ4^|jNv|B,mGy,CE2%q,G=Wm\< M!)S~~>tcn xu2]"p5^l<|=7rߴ4MR : 肟7YEPbyb5Tg"ȓ}?b怡NBgMK<gm9 ;[8Z\Vn>#' Aed< -EُAms١wK;X=shb\i_wGpKЋVDk }˃ȉ|k& vskX 4}ﬔVY^)ӈp?Pe-t6V |+A>j & 9847??1l<B9,@ z5Ye%JSf۞=}1 2{7:c!X qYFC-18^Z/Ao/o;Ȑ{,]B:mɁ=+k,7I56%3?[@%|&Y)꾟X<ۤbz"}@g}6 \+eܬ-k!h9?[ˀo.t FA9#V[Ryy3T\cchAJ˼!Y > &l͒i"*pzOiq𳍒/\Z4ޛ^r}`a}nZsd%!>l΄<"yܠ7O=.Y|6Uڄ4?p>gWǓη|Ŧ~t\bif 5mNNk|%l]D+#;T \K ޠϨq 1裌}eyψͩ&\U 7A}@ϰk;<;C+kn'<@L"-UR:i bm2䉊Ʌ?ZIb۳~xsWw_dd6 #dyCǴjn[u|<H\dZ4*DQџ>< w,{^fEG~c׵<l*DfYf]4əJ{PLo}ڎh{E {Z}u"213@>{N6S&7t|z~.iz,?('vX&O{@^?K.t =] ඨ+# ݢY7k7_$tX|G=֠٦[C{ CuǵZi_!}w }Wc7ܝwWn'A<(u|л~Iv 6UK}B/U^L]^ok@Z\qXo7tSا8{]B'g$ ;;d'l5L 4?'j6(.v|a,K)Ut`o!*k_֩Kк <)i=\촗97` ss } 3{k7X4l0(`o!#lhk6^-y3> !JcFXE^"TeIrAX/QI 2I_軗~veMW8[ήG4HI 8x마"{rcq҇μpFt薯)Y&#]V[@Q4, sYg8{y!}AŠa_jnAv3+;YiFnI;N~.ndeοfɻ/B&E:?=?m>z_evZ=L;0>Z{WUH^' vcOˋ]jf_ WKa>bw~R?TbW5T4_Tl_{hC_6ϮKD+?1S~>%K@Sd{IN揙":읥/YOw=LU7;fXKL9fCҍݢc=Rp4ؓ,Ђ=iGc;z[|oi~k)fA|0Z[pS <)íA/ }8/g4;Lii~U'?} %n -NN>ѐ}.37hs^b 7CZjЅDm@.?㙰`o QYC|ϲ}qk1uA!}ӳ pa&'\~H4et w9:0 }cAZ9o:zDt~3uV,jLO.kG^ ֵIqk:p\%up-z;rDVjyk ͉[K6 7xA-\ |7:CSpVMڰw{]Ec(m4o;[th0YfA {BU i 6ŷ]53+N_r rp}mNN;Kb0%VOu)<- H_'_ b/y>Am (8rbbtC.&FEj`&_=m5Scj/VH&LX\ۙ1Y;t,te AV$r")bm Ak+D&{_'<>%SkOY6kHNYO hmz\coY,=ѷ%!o퓔v"e-뉻F(Lg$y Kl] T-q'l&'%)boӲz oE"v,bfR'Gcx{b<վjV.:kqr,RGp o-:!uW$Ǯ.B4b_LR fJ@"Bo9c7p{6qAUg҃mo׹鲚B\C>=e '*e>ND*yMf-*n!;c.ߧA8Y,À儉a3ơ=;mf{Hx/K!6z-uڐg V-+N35(*#w8CW&B%V?}>(ؙC*{kyWiKX y@XAcyDnL }ax[&屖7J7[^ 5ZFW+`+qg]x Չ$eq&um؀F~"Ō{K)Ogqk=O\y&1SҁqZ49k rKbw[+]}0-rC*n"p>A+)2eh\]7 %YC,[e ?>Br*rECrh4|xZAYf-  ! YR\q9}@K+]8P俎*>ogCBz2筃SgJ+Zrţ~f\||VCcrQ=@o`->.KapGtX+9T4OfWsv`ýY8C_5Җp5V87ۼCS,|x$%y%O4#NnIxb-?:_#'q"U)C,-'͐:DϚLYZGnZS|կbGeSZ$.B^J7p ~0}qN{Ɗ^z=vw3}%|?4\ǧA?9UXҰ wwzgKlF{oaZim'@WD!jO^%CDmB\ Xڍ/l~.=Eee=P)b1,.І>L&pPڲ+ST|e(7r[*3B dILk݊fnr`ܺ=#S,ZJK^="LC|j>DaB^?=(m0r.9 {^sO\!4_&A'k*Bu?RHЕ[C%FC+ XC紹Mgj}]B7B"ÜJR^jt]-{ͦuwZղu4jy& Q gYyf?N੧E!+^0eKL;xF!ЍR}#7um[!jr h.Wx+нOzJeqAp~zfus/ӋbM!gf\BF^ce_c*|q%:I *'r 8r\& ?ɭUh[Fq R>C,;5hٖS[PQ ԌHo[,3kȹӼX"ٲQ"r <vg(9vBDےҐcE~<$Gj=VN# xJN 5;C6C&1t:H"0>('ZŞպv|4=ٸT<7l\zvh'X,G>נ;-O2D.NM_Ѡ{Ϻ=*X{_=ڠY: -zkRԙ)~(g c˲N&K7V~"Wc.zX3QdV%eEڑs8< .ȻEG#b%a3D~z"Ɲ֎*Zh˟.V.D1SArb2OUd^U oh+%y8=AZ,6Vf\cU}>xΈn ]q=UE|P?p/tV>p,*tG|][-Nb ֻE~8o=PWQIND&C̫oȿ&C7I2ePh)qeM|_Gyj y5䴼~rCll4<&rlKr*)RC |owf䇟8| %\wa\6k%82|EIS"/,sx+[c_GDuLdoS.E#9>b࿐ں!F^ KέJ' \] Q'\qhޚe9 hB])l%/RB F^w/8*TOoBEOUgǽW βf^)Y/rVui'`=FgXZa@NkY0y2_ss־,+2yL\YhU׺'v[e!oZ{ \>r)ǝlWA\;ʍ{l\T6@]nh*S0'ܡsC xfHAnk'pckrx7VHr7xC d'kWZn5X)Dd2a7l3:t8=xԱ5EXlJtʭ \#Ƚ֑Z2ng̒},~PQgU{dʂE*:t?y*2|>{37T|6?{~jl=UG7tKA@w7<Ns>n7[nٚc~nu\JFq{r}^ ;ڵ{@@οܻz}@tb=ȯҸH`;"}^1|B5{~An%hDc-ԓf=!tMS{oB'g^7P'ܷ(6vpr$ET-ӣ+BSd23ݟ>!2ߔ\잴@ 7ɧzt2زD?Zj-xـ|a?!h@;t72ojLZk%}pLrC'Άӊ{K6{HV!qe<\zDT|BE6{)d?Ϋ;}p@"/؊mzX/ I;;-ubb$t[8ZOxda";ɭ.0f7Yt<́w;nt7v^RWeqo^醾J[:N@.RQjpŕ)eKڅLvCwO}?K@3Fza-ILKCowr=Th5wqy_icD_Vƾ ;iR^ֶ4G_%k }J2 t۱|p_PVcFo_gGu`7ezN_зA/Ћ'3q_J4q3rcO;4vD;_s}#U"iyEQ"ڒB]=g$Kacآ+XmUw˚xL/ٌ{1C|HzSӯE$X@Z57i zMڸ;.vaSAY~~7f)QWaTDFuemRrDUn-,#7b qꩰV }⊿oϩuqlSyϔ=j{k7`oR]x܈"_2Wh[Ko|a%GRchP2]fGaAnĐA{:8kEEv\ ZIX]Cm~QbO y .=jI?#*@>v" ])Rw#/Hd%Bz6^9dmZ },偁mUu"m Ǎ]q?z7 HiNK@ ނ]幀!_1d%|y {JWsb~R"rq@V=ݧ}֒^,WX#l*6?=yme 8[v6Dv7ezSa|c#O$k¢ð~D9ډOSG4UKM 9!Rg=cFKoLJ:\rEƆ(N]~ 堗ˍGo2 maԗ T"]rޕY{)j~zRo̠miOxAv,荽Ңpr߈yZЛ-1dZaϛF̮@{6~ؓ!J񝶗C)*/C{)&h6ˆcfHQ֛~{hfnr||g }F^0 Gm ==Zl-^k$.\0%욬j!7}n2I(=TIO&:gu6ru5z=euu5dm̔7WܠwܞnLO50popVP x`7Y? ԅhݸ |KOҀε to4ZHˊ<[ S6i"/2?FAW xoC_+#+ \b<}"䏳z-Q 1^k4*&b~<x5/z9U>S٧'GQjBeo20pt")q?OhS4--Ͽx5(5 ]g$u@;tn# +W>qok&N7PZÁ~|6M0ZoahQ #ߟ5N>T%~(#% 8 wȂbwBcJotD8B˼*xRl7$Vӫ٧xKoT)]x4hՙ {[>3q3v.jLe]ꉼSq:rT}96!ry2C5nn+YLNbnLV_ng݈y)Fl'㬙ZA Qk'p(q3GeнD0o,V׳ghobBS =`\jF}rw͠4br2duKԟ}49 DCpyNjO(NbeEyJo=SN( xj*~% G'7sto}E.%RD<_!Ibx] =8fV0'p2F^o*@.A3,u31ϔ 9enL9 [̄BSef;ey Xf^.][pco&;kl<7=smr][ҕ@0{i+7ce@o8y!q`R+x=wk^ނ.T::; fZ%Le\OC#m/\?/sWqqkY-WP֘eЀN f 4 s{G%F~x_[qtxŅWmW'fZ =GNZ!A/Pq"ot ?:J{f^O^lW?7!̹U^̎֌vj u7uܱʞN|e )ϡjvҸ^ȩg-_=4f%8eO7P?"oO/gt#Rh!P"9G4C2˳DcU΍ۈ) z}8J!w(([r*锸)"Xmv :wh rz l8Z },+CמLh,CCwYFӇbnnnH 9Ւ\yy{R^9Sny?E-5qo_l=F$mܞ#ymy)>Jk~ӏd:wYDnK14^BaX'4(쾤r D.$hCŌ/”$y5,s<]2R˜\<2"ZB!QPײ^յ<(I 8QiYuZҥ`%7AYha{e*>顯Q"g>+l,~"' "g_: =*rrhm GFmc#t rFwP86ȉ|,;][=!#C)Z^{zAOD>ے2Kz1q /"z*NĦi==Kކ)Xp]?$3#!4 jއm,Vyɺ{9_]3^9^y6>?/}T1k^+E nLnD]-a"bw)H'bgޣG^ UNfrs@KW^G^"̫A'&'e6BWNnAw%r6+!wǺWZ"MܶA&k҈?e++-!_^Rpa[_{fؠ):po (~FQ<[!as|g] \->QAW, V+Aޥ[H w(ݼ/FV.$(:b|# 7;&h~wCu޺ĿANu-Is=ܫf">ڏ h7 *U<<%0rx2U*r& !O~~8"^\x fY/ܛ5y* Ұ:tl2:nYsNUZFYB讁Dn!f_v‰\c]=;"Pz&2'-H0?^`/)ˉ\`6|8'%z_3#K4ER[g"oomB %rif]..sPi[X}x 4Jg Wz?e5OI yDdʲRk? `UК+qJKa rFFSX,ZNxZKіlv *O)ȟg.1t2lr E"Nj+Sׁ_<nOn{tBg `(}6D-(m:N-Kf\K <ۀv^tJ)u02\w-ՐwC0toHe[9,'.~Ow&h==nʾC0{Z-/CN=-NMʾy?By5tӺ#j `K9D>A1r ՠz=ץf1]>}[ƾ5\T9nUJ,N]ym7y-6%]%iԠcHVnm.43sTAB561 (\9vyt3WIF+\yN?}_xr:(qiڠNk'k#/6!B_n)y s'*w3iڽ@J$#ض)QΩ:q*yyφ;Ɗzn~ hw;)ܭ[[[D?`r"* &*OarSPF[ k"z=i~uDl\Kk {~ N䶤;Cן5;rx AI,> {~ P΂C}2_ Rvl]chbܮ7o\;ret9s,Lb;}(:/d~򽸨zf }S0)]_x3 oH - 7+f-T~η[ #ϝOR{׸'^,BwmAO^ПD.!3)ݖG𱷸 ɤ>tKyz=ε8rG(=zCoUzϳ ]'ˈi*]W.Qr zOR½a@&` .`E~#fDq h!E?nO+\)fџQ-Ct>AKMo*Urt2c~9>=j%#QɜfmGyA }ugz7%st9]]-m,,c?Kbƞ8y1$:,WU}V:J7˙HS [벫!g!@޲$-vt`n7|O/H? 欍s H>ltC߉L^#%_뚉 ]t]7:.LV3ϡS.G*~i1u؉Njn6{ 8t[_9xAнB[W];ԑ)& ~.E^Bns=%\dU> (_n5ٍ} -smŪrA% ,n཰ˢ hǦ/ź=4؝#r7݂SfI 轍oa.M|Zn{q],et@fL1lI/9)ƽsz}wiЎq;v/z)~>4lhݬ gTd+܀Ei?=ڡ/v*#q=r.{1䪂!#L76 ; d =V~חj%cZr[0c~m?v ޘ Jm) b54-^2L:+=U3Cs8y/=S4t7ڍ87dDLNɑ$۾v Cӫjo=Y YrX5hK/]D/}-n+K ^c4zC|w쳾lOhgڳ_MϤ5Z1h6~oˬ1=`Cw5Է}4h>>=ʎ,>?"Ka}a jkʶ ]RY;G#IU\r5vyZ-ɒ^.Q^;\e-O!& =zD%i rgzUJg {gy_9vd"&}{I5}pC7-+ F`lЩJGO E։d{,薔|yl 4%i,)c ƺl;uIa#H#(C>67 z%v44k{ h2uޡ ]S'Z-o<\l =%2-jⱩBK/: :QHmڧV6@ȢƮkq 'm4h}]r9-k,_?JKԒ5{AOŽc/ciTli?|UE8"FJyU_͞U_mM9rAW,Lo>A}k|T_͒!N]oc3ƅ3!>.#&wy#S ] zi zz^1r_4sNY)1CGݕh ={&>@HLCb h>3(T}$@=qqF k{1̨\rBe*wEnK7fN]Oֱǭ!KVKx{8 %q p;4\l4 g"=y-|J\UuVQEjk /u(%Nu݂l -@vV8|}jtsB2Y0h: xgD:N'/؉V(ϼ"$/yLCw*-$}pyF8,V9^~X*4:C kwHg"fY^>Lc.Fu "zU2Ni>r/=td~ǒVGlyDŽ'bE5hj?s%|9;BY}ZPњ@x29m /gXX<70N7CvϽaxh$%+3G9`g#̳6LSYh=_bQ +rj[!Xr]YA\s|pr NHDn9(QVYBc*􄂳[ŗٞ"~K?%l1\q AE^S*nPk_;µ9xّO E!2.ΪT's!#B= K@t?Emȯ|∍SC&M 74~7蝄[Vy-%qs+(o}!c$ٺ:VDwhR9ek o24oHN1ym/j*Cdm}p~rxϓFسC,%6qr BtuAޞVNne5?vPVi+QF}c˕G[oPːXmxl 4+3WWt[]|+Z0r1Ɲ#~ϳ^)U3Yk|Awo]Np7ryjnjY{c7e?n4BNo[27p}46U t[:{լqK'J&k"(躋8] Ľ%/)~[}qB?oWy֭h:Fʞ6Nn{8;m= vm vnk8 /7Dȯ^)CQ.@.挊[?$ۻwz39ll씫TWo'tssBgDV ,:D'_' e-+} O=bzc: 25.N][H--"{oX!&-k):{ =b|nk/2s:1/D~ƞ8b7ׂeЂ>bzȥI"Kv9[=(ꉎ x]Vӯx<=;w \VTF0oe"В-~gƗ6U ;_u-87Xs57\?xyϟ _ZVS GN 7˽ui jf7_&%Gۭtv݅m{G&ddK)k E>)%SwePdʝ DRpʍ7ӣ=PYEnTG& kX]z]-du.ӒmAFȮ]mG;ڸS6"B3zK_iwt4Y&_!VF7l1{C ɣ8/ ^<0|Z@z${klI_L^_nAZEk_C/=jEGa*_ГW^^ܞ 9IQ[V爋֡W w:\ >ϑEp3o5Nώ}_j14`mAV=fOg9uv -,n '_GX>ZI~N䦬B !}{:D*Qo[[A=},{7ڍR*O}\yoL;ܡ{Hozcu΋2`52׺׋+;IJ}buGdf?yQq]Z >\y{I3/VlYp0 yWW=ARɵ:SIvPfqc=2+ک?n􆼳D]nu6٣ڞZ9pك_վu]q*wtk=>Ij?F=Eϛv-CrCqEo-c*%f3=}R`af|t? .#k2} ]?!+C=(cnOwv\w}GHs \"r3Nv7UZpk< _,Y3E~SI#r?݂50Zr|@s@ d[q }op(Ao/{Vkq?n>^s-n_US&P }-Қg\)hz䣳wBV~?@^45 [ɹ};m81;O/9bY>\よS8? 5%#t[V zYj|T/ 4fB3*ᓼ ޲H'NVY_AȴH}Enw0ƏW;lF+}_Vj{*:?;m^B iЬvY*: ֕}=7 jN[oS9!sȷ .)tF {ofyl=f#c^Wz\~fd}84~s48}}5-O=ņI~_S(4#r[וJ[R l`WT{`l j]c5m o@'=n2=T*jf`5KݒMӮOMc/9>j^W_@k*4n~4/TJe_eXDvZ/3,޵U[\r%G=f X[.t<{˸ejV4?yF6M7>QHn3'`dd~f{ӁvNsz]~\_أf }Kp7-0kQH{Op0#docRβ5VQ1C[NJ/.4EW_M5Tee wu?)<aY^ b TbywD|!=$Ȍ?طr%Z뾎\&fGܢ/;(%[RE~8(OeQ*gaR2|^cW:p>}<5H.?=kJň(nEKqWuLMkP7Er뒽-,\:%q& x?#ڡƙ~eQxL[DТC]ZmX&n.PC`\?fYhmQVߴVh rQ2oWԑ2i#\oImYljp z4C쪸'.ow!Eqޛ=gͰbNs:А>iQ>[O|)2e H ~uMسb\u&z`KFmGNm0nzNΌ]R!bS̨#Rdž>3vNҫ$a)L6lD?>{aJS%=~[\(_-|7,3Ur}NE3x}O'(4uz㿆FP:TGu?yA߻-{0c}@(?UgĻ&6,n.@fyN;Vz$^Gp!_j]➫A(^;9gMA惽ҏiq:{ O,=fE*ƾ֝lͿDn;D!_|LtSʣ-5@"/fڶS̈́]a3+af {[:,$\ a1^toK2u/`@:O@?#\CNE,5Z:E}|\g_ Hi RX_>r0bLZ[`UT}N*kH\adk@:^ ʦ yG_=. VAv.C{ﭹiѰ;Ew}?l2)`Qe9yL(Sڠ=,+4M ~E|.c{{WU;B7C 6$?袛eRY: w+4*Гfݐ_+yTם'da-pQjuh*r![2d^z,􅠵Nٍ}3j2|>qv #\Fw P}y\}DҐ^wdϔ:td'cDcTIixQglwqd. OqފBWyc=VK\KN9hb C_"N?yP Yr:!gJ7\y*_0 $ϸ .P] 5{;.b=!< v oG zϭɏs`Ϥ5|pNh>Y53x #>C,rc Cҡ9@;z$1f;5j][ꃝM̗_Q]O?V_9kB0-Ǒ).Rv}ݒL(L@rM ~J#tyf/>ĪΊ0L?9U2h_'ߛy]Xnj -Sj]VQՎ }D'.^( thZUAe7[AEiijyC(VObXu4fo}L>Ic Хx2i.j%_FEvIy =J|}z\l:%1=ʼngč3w1+)=Utc҉bG6^69x]u\Yۉ|Tɺd mN̉"ak$,T3o:!{y5 s!R'<+Тb7˻@dYwd .~ps|= %-ǻ/z}ZTKp_,}ޮxz#x}:5ާ^NS1TeNܶNpqP?S,Thqoq #D|a]oixHNq:@D5kO`'rP;.ѧzJF@g>Bu+yaYO8>e-Vpֳ][ %!\_?2toy (K N =oUl>{7W!0p9>Fr<]mQ0? _|yzƕYz|_[́sɿ.U3o4Jgv|̮Ɋk{6nCcӺ;t4~|y#FnQ)2@h;C^&+ŜaiUq6 /jgw,qJ|=%;'}1CX<>Oe9+ b+C'e6|$quFv؄ orvհX' }1&XtTr׀}Z6t]8erW_*X+95+"+\5y๓ TxDB#?BOFpT)|Y\΋]xhM~ONs.!Ík^rOe',_2#rD!4-?_ nb7.A. z^V;s)W塇56A3#ha@7 ľ؄iV|Y_8ߡdqٸ]76Yw"ޠ fbEj+ l!nk(4I*.t?SW!u}7Ș*-ҘAo$6_T.cΑ5htI.P]ku E7~[/\hDvXvb:v#mv /㚝Ln}-ZB笭F[zv4*CRQ5a Эuv ){=j.ȳy~ڡ1B!MOQhu: ]c#h5`Bw>B@/ٯ I'r^ǟAhDwMx S}CE~>R R>CEh^fPtIt\.7t )?Ĩ zz Tp>Nyxˠ~F$oZ?|@8)QDaEӋꄽo`d¾3,7v}Z8}sm7t ƚ0.}A_p729}cuz"}7=L޸~=^컄~>b&zC t=籹*4AÈJ}K[y⼚G Y1N\Tzmp|XAF|C^akj?)ܽ<ݠU+^qh6Z8 e $I}9ٷ`5(-y}a4:1q | q hZvC@M\~О|ѐ_=1 /ҡG.cSwTx&ŔEMwōdfjȒ{-ێ gi_'.2ǘp$صA Կ<&'J̐ IM)27[3$6 [9gP+tt?>so.Me[OZ(G~儾P!NV^V*<m5$ w=/9w'JIw-h,t[[V3y@wbLtJN%s-3!l1uA)Y2Ļk@` -+@~.Y)ANcꂹLl@M͒]HFn IتzK%+z" <-Tq=gzLg$f׸kI6+,W5$OvC?T`_uA3ڏ-V~{u"8K>]9\/rէBF┽`$ciĞTh"[/E7i3}Ysȯ/^-9 śTx d(zCץVzi%P2䭙% |>#K{_1cu}$ത H^'=ً`ӌ1Эy|CAۜAl@kA*t-3l@gB&$%v?&2*2崧 EZ 1ry8EWI.={-ǩ Eq]cyk)hwuiUh& {_^ vJv`z} uD*v/wfLbF 7WZtBݩX;0HZ3O'=WZFc *c0U]Jڹm JyG =γ%}SziGg?_QY]+tqZ-(#eB"R[6(#t)DJㄞ Z^sBJ'r^MYV#'-1ېx~4 UG~k޶u\TdYRlO(C|x kRT jȺHyԐJr[<+8;IWБxB~P%E>9#ygթH{6 x2\|)xyMFiZOu yms,,2%_Ku\yxNf)bEokD} 9䶪 PJ9Sl]Yvo4|3@3*埥Ndz#Dp'pY .urE%|#0|zS6m\1^ %JqqK8I StSF?@ |e+ }YRs[yFnVrn/CDdcϞ<*BQOL/Fq^q؂e?pDY W=pMB—t !; 8iI+8_X IxJ( fw[WEWJro毐+bOk Y>4}|5dɺ9n ;Aj˿–>4!!I"H)2$Gt3!XDC/χ.x6)cЍY Ɏ)x@ xzVscxŗ(p6K璍|9lH]󻌈X"?b+IO{(%}q 'GDXGy/8bh$A ֐3DRZc-6[v+ \k\:#7]f ~4h˕ 󰸶<=>Ӱgr"׸Gt+&9lz('8 }o~9w1 :E,Ra]VUo%\v6nhfbGsCSе皕wQLOX$\WU 6M[nЫ|ϡ,IJP-m~df %=X9hY%ɋx8fJj,z2չ- ڠ/#7hAK'3Ӛ'.nšDc0!HU:9`/\ng!T7mc]FpghVE\"`x_U1V<;s<[Nbн[N}ݜ.uzRWkiG.j& ]Th75 4C%?Ep|*1kzOq`{ƗAK#=OhFREdD>טVʉŵ'NŐ:vGMg{^^S{ZyZh$Qb[/6л.:HOΰ@;KNnme7v$Pr˗'W Dt"Gbo}9Y$E6>&)d R<7 kֽo"L^\~ȉdOGԐifT=V6ܒS*_}AzOwG nO7Ue;GhS*Rz"urWgqK^U5^ u%8%JWs7ʸKucg'-7VOaVg#:Np1[]zhB(r&OYx[z`p-Y9{XBl oU | t3`5im \J?)'r[pà[v)ZK6A69rUm׶rY|7E {#1dlڐeEu4{Ǐ-OO+T9$}oJ RC>)4u]VGEN嶹S(W/TmKt=[#pɎY8r+,_)3\e t#,{}O|I#MQYUf EfNd+lk)61a`%P'0ԭ(kuN}&>"n.ƒ hvD,M~UifyWj[*IyzG'phL~hލr%!'I/'rB ͢ln]x DO}-5>kgl욹u \cmr¯y,*QqsЃ5hOi7gD].ק['-Z3"HD91 _%?\,:5R \W\R.ևB9'-xz^j6_"f}TUx,-KskHa7mg!Nd myt*a?KvD>!gkq/("eNzBN~)L>Vst)45NMQ)1lj|%pV ,>v\]#4shj't]Q*vS>? "I3PGf-!Лoлpg {I*"CxniF򍼾P #NgNciBf"x{gGN4=VtfDnȑ^Ig6eU6h?uxtDE G&NgltL>"%B˯eoږ-ZC.(z?*DuoMvv\8S7Ur1uFޓx*t$'SU ,Zor}@OV*dnITJ ˮ7}oq"nDhOȽ+M!2nCuNtN-&bDY 1ā|D!g?'5*- d;=n`SNiJ}LhR"gimob-]s7dn퇟<3#AzA3#/AԦ-gV5kcP!"Slc7u33->Sy r(ro l"g,ny-bE.;bKG{#곸rbN|ۜC{ujRM73^}-yG;0p2Ŭ 3^zwYU`VpSi-=zܛp ==34޺2\ӆXF'n0[[X5*m->ZkBIf@xZz@>Shp.г~HrdV6}2vIo?fyOZ.SR?ч-}{\=ȩ:B.<Z7r݉5Qg\C7|A/7'p^luVܢ<zoȒx;n*Ajn}zkz^$'JGqz_-vl|1#ے腞0ޡՄ'>+ ~߀>X/95T?\2/rw <V"YaԌO92rݜ&RYs $Hq}Zj|@*6u; q|ۖrLhv+tJy~:htяykr# i U)4gjEn;+z핶< GwC._'7.k*d٫zZ67p] }Bku}u f3rRo_ d@N@~UJ jaBy zZPeGY(?kva}wO1JSh!F}r^I.Rn1?;..5WHXC-,UhHJrehIaZӉ"kgN B.gN{6C M#x= f!2l,kC5XJ|oLu*2yC -vٜc/Uנ !,zTBqGscIRFrBYƯs<_fIuGnim9;,uoz̈tOQ6٧++'No9gYy]v'6gS^/r[!s7|=x0o 2qͥ_e3B^,7p^}D!DW'HuاwUД\>[ݕǴ!o$KkQ*v<,X| 'ݕnЪ$W6r$J/uq-.[+N%*d\[W_,rv" {p O<>7t сhiDɭfcNg=a'r^U|̾gWFFc SYz>Q˚t#Z⊺79/x&rqs΋]Kݥ>#^*󑬧l/Ҡ}}@>PϦ*YDv~C돯tO*PbWY9 l\e Ϸ3wv3"C~|%Y+lx&ܨh}zzQ.5*8yASHgXSulltTJvWC8bl#plȣ8t􍜗#ZO! Ḇ9YN%\nj-YNJf*cT-G*LgR_Y|B/!r_ * ΃v m0oɛ@K$Sn5!Е\6ҰwYyRB@vәK]Fӹ?>MV?ngL3\sֱ[!{EXj-Y)J,3\^9)r\˥mק`TP$~ՄuQR%ɼ#뀾*@dv"\-.Вw8ُI$|ܢgB)9U=0B 61ݎmq'?Ǻ}( MJ x=cJHS52AQ<4ׄ-;UJׇ[>&p5ws y{Zks 8hV1C.Vuj[ +nx)nl*izZ@K/}-#5h)gR'՛<6/|ʯsJ ɵ^m5m䦭y'xN9uh&E8͢~&mװwk y+.vE炚=~*=Pki32rō2836-:Ech7x +A_{Td lO5 ږSN,@7rǾ#-S!΢)fHлR/_qD5T7.rrxA-D2*%x|!t# Rz[Y&ԠDE/#4t`A }ma y+m^[xK5Z! TeF%GC h3gS .Ό zNm6˘κFMIb[RI\ >޸ͰCKڼ -cg"qC㋜8b̡c 9N;[nKdMmC:^k%!yXʷ[M/P).,+ڍ\CG-iD }V2;Cv)InkءE..܍ё ͹ \U!DMxMV>^:Dn^v{+_]Ȫԕ8u ZW0[k,y K˓ڿȵ4 |w ݗ-Ͱpx\"--&CFYxQk>ސX /5JvͶvL>;S>@W 9(e?#W[|Ik60~A;8ŕoc"|ZeBb`G4}%-3ʋk MO|M>-,QƧJ i'?/r\8Z6cI-wwBYGZ˲1/Oópl~*X%}qKfl.Hn{&k;zeql M&_ثSZ;[m8ch{RE@ J4B=٪7t W{q"א}Uh3Ou 7> HpUw{cKo)Z 3` t~m y[7A Gm/*E2 ,bcv&(ȑ/~5Eᑹ Nr>bh&/ށ _im%jprmzy_SSF`$W5p&_%apEU͇n[|S)+NPNqTZ]?"[ctFx?Itho^YSj ;lp"OR žL;Nҏ*cxn-N"X&n0,%]<]Z<=@KݩX7,(2?3G=Ze#ɕgHC~>PGmYj?K!ּHc"J,>Lv<{q {в뼁E*DNT^KڷKP6ȶgE|Ru8*ŁE+qa7lkH )W<3J4nZ羷q?D|s"rAehoifbPٯ"'?x@oqAc[WNܶFh'nFEϧy Y'IFR"WP?gal gɟ@GDn;k[-H7p<`v> 7㈳BH[N 2͙( ]6 r|uK"'+uM_Y%" W{,j6tCY9#'˷ߎȏP:ʴ8tpk h[CGOi-2·_mдZNxX,*+bؾbtJj_f:oP8O#'Oi-NzӚŠIf9of.I9^S\zAU@踿ѽzFA/DW^'yo}Q=g5ˆnAp;lUqۼ5F q6M7 .VX1֊Va,4yoTN-nޑP5!i\D1rQ4岹[[Mf]Yn^6oPEpm,$fZS@]g5P~4?k$H9 nQ̗Bq\jXgeTAk߹: ]E*r?0ݘZ.W!nO h *kZlk,T+3Nstf$?~# g闯x\6Lۏ@_p'ޫhf[ ˗xnċ"'p r+b3ǏW@w*F1yQ=P)1_ǰ[JG,d)ܵ_{@˯)73^;6OOٲ\+dr:J{F&6w=q ViA=CJ]5͉~䴫V\lNiݸ|7ߠӫOucA7lep XWox>+q3蚍s(AD;l"}Њ=[`*@Ww;{_6Me=9-.z~p=1yhܮM}q1%?.#[ǘ.Oህ3A"k*b=T?egw^1 Q6rvtF%}eBܡ[gM </N+.\E/*aŃ'q8-.YJV6.9rM>bĩA5گD ^ -,;Q?wW-{W&8g/XKu B&H8Zq 6hLrͧAWjrquF X^u yf *N6SLRJy!sr!9Z“6 }C>A#?f,@̂DA3 9Db;GE|HfIIrEI1Hl'p]SZOa'Rf:!2Y.s 7o8#͡n{}Au9"!Ry|mӎNTDqlsufcK8v#,= "k% }ԠU^OK362 R7'q~N*va*5̾ YL(vZNN|vl'ȷv,pҬ?B}Dՙ#^6K#m CD^^uh,zZ) Q`=_  ׵y;t3[pnd1wKIn GoV֐ CsGV塯=D\m |XyJBr⼁C I6Y6YQɵ_6Hu>+!":G>,Q;gRp7֡+fvϥ}azwlln"rz?q.4Y7R0W&d aWr9687O&yH%T67qed\h:J $[y^{(F>n`mb,DY$TMf(G>iI5 rnU8|b#o1Ao"Xq_ue;[ V=m&z"KSv̶\[m 8U?=Iq݊}V+I"ղG 4ͬh򓋚I~q2C\N =0e}eqqS9KHӉGF?~h+m*;bbv"6gԡpu\#U `VQtk~"R7*f MI`>"HZ"7n6Vi-iR64YMl;+35m%R=>\7ͧ1^h~}+~zIKFh|,53ˍJ@U6bc ; q7/\589R OZCF6~|DY".pY%{|yY刀#KYmtB*hs#@gߠ?.XzTפI1}8["Й+u&ߧ4 $4l ܂ z_gR(79EGη;[|>sZ:c,X-{ZѾ ֩uiW }nr"|uy9Qon WF6GT\9<A;y[/K(hCvmiM[EAQU&jpLJ}qyV3ϳSۑ}‚--i-yNly½k}mGfcpEa%J&lVeIؗepWK$l?eLvpțT}+D6Y}d&p/eFMa3@~:w{bZ,ܸ}n*OV<.n\gȷy ,rɣ Hk)\>VNZU/mɀN GAEn3+ds9o65O@{nu,9 zp(B^Wϖikr6=s4SDص[5h 7lnY,*=2?SR/ofL9yuX6sE!WA^1@w4΍|<&`&+rۼw]bW%֓;Y\rRN/xDo'p^+}ۖM:.n"U?Z{_}Szn x[KMͣ .W{wGѰ/d'Xra:r9y]OO]@1@.J{zޟ[ڠG^mV=;Z!PDa~;,u\]%n Q?С'݋"7nkG? v;\[4,9RӒ?*p}( XD2/[뎲f&hiZ.[O١YNݣ"l -[+H[uhq i,%"һޗ X){m-r9WӾ:' ӌ+̳v[ddny. >*p_qfjmmv!-?u@ =ha z;XyfJ}lrR[ GE}ɳO1\7~oLϡ-)beO7hV;|_~A}z<{nDjnyd"7r֝ZJ7<75ޑ;,DHNEDC<^CYC"Ė.;W8VJv"?ϫ\ \_NܩbB3QTdqCZn}ݖՍ9'#qx[\ľsJSx 5'ps 9N.{rYL8V[lTh*6' KUSvt9EI:^kPlڸL^Py2o<+4CK=؈ }Jq )mc!hvkKc%вTXY" 2jx]ϗ \Py9z+:Ħݾb+_,WUUr!?= ?RFs2N1 PuF癜NtW[Rcr}E :c>г?+ސ{d~^$,?Cҏá# ?zy؎ t%~0@αR{E`7lrH!u&ۯRE-#*ط^9Lf<;vCwEѡf_J!=Zҗo>SO~4tOwl[`쁜e27W%C̘N|u+ 쌮z*m?) u`ߌut =u*O~>co[ng#Oݕ$ɮ p_ERro]ԣ% -Kxs9ߍmFy<k턞jNvd/tN 0W V3qxt!ڀv{U>nuN=21e .+Zgp{S) K/ȫ tB7Z͝O=?Tbd fG8ۚ)5>=5}^+-1l޲(o}w}Z;46CXv3_Z1%ENf492;GyAGH;J#;\ =oi$azbO:]Qi1쮹b=Ѕ5ݛt Bƞ.nNAs(:7bz:E:bzUp9o v{+ܘ~"o˘KJGnE.P1)hByD./#+m޷I O=d\zB@ecz]]0 B{-y3^$KMF*r&>6ԻٹY% rWR΃O~z_AJLשEö/f'YiXEͧOyzbw!h<ʂ^}87g SNiвMda:%}%HЉN{ ]Cե,ѭr{uh js! ۘh`khVJأvcwooߐTϒ}U7 ^֎>8O6ͿK;pՕ?GT"E>%VoƦA$=#23o/|@`UFrd֌b1>Nu3| >qi'hq vTJSj }T(3M)r#=Gu/SK=j2%B~doF{# N$׹s2$Z5Niap}@uݙO-F< X>4Fez+QgZOkd'3/, \-HoƟv&ǹ. o͝;M37>Uvރp  ,e)emXўe:Iϲa"[Ԇ1:>-؀f=to3,G@ewHY{ޘ *#~1^cg˴MoBmrڐ=6o p6*3O9Tb&hyV_%ۉ=kCc/T8xR{ffWI'݌ Ǯ$);_Mv}v7;sd"J^@.44sFMB9WoY{edIL~>BotUa}}烽E/*&n?آƽ]Rx ^7JG4zngb7Y9nޗll[ᄞ ܰ yM@/vROW 9 +9v9+bwGˊvk 9k}K}@ػ#tj̐!hF{X.QgXY7h+4_d>K|Y??TKʊ,CZp F܀rx m6G~ .mщYqs*N|P+ZDNsطqO}5nZգk13Ћ(gi/}4`Gt?+_ɑV]m/BK[Fw@ tM ThCvFK\%Nq/G#͌M0ľ5*4cf@ zj (tcOvnL ]Zd-16w5-s` rv5ءk% /m. JST/V{Cp*K|_)ƀ d#ۀ+o{G;|D0TNz`(b7'D2V~cX(^"D%KT_ɑ$b>"p#倞\Awm't ! !CVm7Ro-{]Ҡ%,䞜GvOx4YtEO :s8oe9#l9vr/=nV.Ts<}-fۙ݌qC̀G=CM/v|b{D ,c 8,t"YL/EA|pr{]S_Mz!;AK}?gj/}}};C81ܐs/]Ӽc&U Y+iS6++.{CKSC8-I ޥ&7ra;rSX嗵 Af"NS{<<ȓ;Gk-i~rNS_Ҡ *_ȧNsmUukRN IٯwI~ˈKu(/W3l BfX[v2Nhq ߉W?Ab}?yLׁ%В{n1ћ=\svAy1Ǹ'\! {Ao./?=2 @˰̌1'sz@0r=\#`5\CeK&+ةfT]z(^6@S7tYT89Q;U^:k6Q9[Lf&PŀMf<*=z E:5kȕ=z!ȾjfyK*P(CɁ|{+o9ᨑ^fcDօȥgRCD8XᆽzǾgg%v nRKYB'q3!s.6;p0NK>^.vU:o+Ny6.tbהx$Y][R?n _ޡͻ}[߮Nw;MM[3e=kzz/vB1ϒ3q}rֵC턾ybЇNS{Wh }1AJ%O}~.8kZmzQYzǴ^fl]ɲ5?ۖ6y61&qv*9<=#Ƣ50(t.0%qnTH*9,,x^RԐůlס.-h!E}@$I`TY^#tvrul~Fl֡הVݖVcƞB;+ub_Ԇ.&J6X [;y@QHzK${)|C{$d^طY3}Bf>A_2rQhYǐ=$DJA[OeN=YV@n^>Q*ͩ~NYZ_`v%QNu Ći/|Bik[U?z6Q0T3q7dYD3z/}CeC }&6ew=MyBOb 譶as"껺ēB0=ȱB "VW{zthStK݉1HWk8׀Ю!C%QC)>w{w#7CR}} R8tx#C]-}D5T䀡UgjbC}Dx{YC?ER۬D[M!G.?)@a6Gģ"']'M@"_1$s|`oK+ Zw\┟JǐnWjbOsW[cquѦ.h>Lveӕr(ȝ@g2 S CyHqCxY@nRZ;c 3^tas $<å%mm2:v}h:hhfFh((Fz@KĿ1ax @BD.z/kCtA.ϱ9ܳkA߼~c[UBqc@5Fܜy߸nu=,7'i#JՖ.DJяA%yƞ9WׄC^!Hû`=]\ Zn%Go'Ab'bfSڢpD"3nJREp7as2C@C'z 5Y)@d7^WeJGĺ7n}z]7(ft{+%%ZxM`o#da'`m z&&d>8Aoq#\gC|Qɱs{;F'6Rb.}>V˳<O;"ث'^* #VGbz)tg捾HZtQZ:F?K9!5/V > !y w6+Z@S]!O51>=%0/F6Q'b4%g(vi[H>-t.OO=K%K-iQԭ}۲-oھnV+XIPqfLZ}JjDKi~+t6`ㄮ7R ~+No6!'u~RWS'vbt6Ϲo;zvyܐ!jzbWuhc˶[Y;)-BkKAWVlL%};s=׫F+ mXL)!lB]zXs`B`vqd 4+#V̤Վݽ|uzw{o-_cm|`i@^9RM!(U`h{Bș`;ҋ;Ьm|&UN}Ai ywSV|Mr)jƓy' ؚT( e,t@Kn\y@2a֠uHةNLgw6QJh7)'tMg@n.2wW:)񉽅P+J-e]ak`:C̛ PdލJ2\)u@/JGQc$"C},-\}mC"^eq']|dC+U7۲Mt@w.N' iih5lq:}{G$'''-v+B_;n/##t UiԺi]vޛ!zb߉n"Cbט6b=vi{u{]-=IN}4jtݘ?/n[]zwdM_7^nKk4ߎhآ}ofђ=Hj!=j~$Xxŗʄ}G.9v wh$IW~W;2Kf/<: :fk iȗ Q~mўk(ܰ$[w>WJ!E[cR{KzӁf{(l>w ퟣk>Kcc C5(guhJl^[{ʈS Ȑy`o1Kl>.IJ>zm w*T.{0r5}LgH!T%>w |ARN}",;VۚZA.T|byUwZbF hBɴ~`hl ENA'3.uy\& y^04+UۧC*]7yfl*jEvro|J-*pϱdzR aNK >3zUN#z "*ߩ'\ck>]bco2K:v|ZVv:]Eޗ`z S䕱UQ%ؐ&=i/z wO෫4 z,dxݷ{j-|zB V2U}%'o\5 =q }( } m{]c=f}N)僽H^2:k7]2y a;&/556co2I/1%g l}[7RŽ K/6cȯL#` ۧYz^1DN@>c;fyq߽03,I#fDtgW|̯47s )b56?{/9з-c{=Ex'>LY2EV'abd-*iM8]oEV$%:K4]L3:>S_ rUU{>oco'[*5^ ^UOʞe? 2_&o;9JA2ҿГ+vD7 cDCM>͆yFHo@ ]uJ3~Q~b7zGS# v+ưʜ5سX{Gceg"Z|kxϒ@x>X#] 14zʼnƆ@K:)ݜ+類N~Qى]gu1M3}x<8A!np7h WWC`XscLZA6!(2v0&Af; @]֔ 4u]5q2MJpBtb'^v.'b>Z3Ԏ}͈DwQgc! =K]̪t~{4='w4q茀|~`Oe22$>֬T=Y _<DO3t~̇esxhY UqL"?mi : =Z Iݭn~νDo1r|o{hs/) W&nb-9V2 D~/zF*C[zz_ub˳RomzU=v[,.U{.J;wOr<v5_J,c'}r.u`x/m(\{%[E -SnNC&?4LÐ_T*ɲzLjyZl֚Bxl~뒑4 Ms\|R {$[cZ%&Th;ɞ)X}^/#h7jz #uEVϷ\zb稖욕rV^bm :m賆7CQ\ %]/&hOMu> =3bȖz~CxQtji&蟃י!OIuMd=34s{.#ꉝ֠V'\Qn=aR}gVy^kDM%c:/-Z66.twàٳ8h@tھv =mh&/-}6s'm>@zE.>:k|n@-ϜGZHlWl>>TZE&jϹZf֑sǶ:;m`KWhA.X y-\cbM`f|3>:m _9 )t%'bvDʜaW-IOdp];/yf^c{imJ{is>4vaϮ @36X*" G:fĠ7G5{D\=̟cwk; zGl).Et A!{b9\C_"yO?Unz΂fJ$ }۲aORf*lXKt 1r?H" ZU'eQ C*~.nPJgZV/='{/ЛRm?=Fd>Y˅'vZIdkk

+ |nZ&>2BC"a߫WC/|D;O:v''E+M$p}ks?Q ט4BgbCރX%CML>"XV;Iۥ!XܗW izBŀhZ܄KQ< 葰f^)X޳0p!zB_GCգWEDu|"&i$qO4.>pƞzL&dDȈLB`Ћ(ns.b;uxXu<ˉ=WED|e>Iffq@1 }!"E=%n' |)"z9vzG$+PmAoG<밲shB'.fi߀`!>Ł1}0@wX/Ǯǩz Y[ȾeFhKQdZ?5R;\cH GDҾǞÙ[? -N>qA+S";gA/) c G'5E&U"'^irWg~sufZRc$qe<\J- jFF:n3.;! c&tj3d)Z8]3Zxra}A6AwF vCz!_WS!zj ;dru}Bin&AllzTygdڠUR2U>Ge&WB J_2>xDžN\U7jiM#-A>X!=#u\iKl'яfkdNz_j+ (^継вOKl]ls\yȼ!CĞY0DZ>%e+Zᆌ| {g;V(|mY䚃/b?a>}v;t:#=!f掗.:GTB :qn?fqسQЇ-E"bYv_6z? o @+F~@eV bo1¡|{2.Ю=EgHE|5ժp$#cO=~.}H"b2A!;Sه{ltp֧rX)CNF*W_ɨ[Ɩ҆ރ=8Fȁ>=C[>%] z5uVwʴ=\*t;ƬL3br@%F}:; zb ̜sJܐ,帺=GN^^C H909^hDy:/M){"5TO0ha3*)(NW[1W<}5\ y.=SxKZB{o&^Zk1bvW #o ]|vg@F;/ޏVh~ν.Aؙ~}m^{Xs9Z+syCpLܩ|n੎ xj fpǙ_5Asg\sy;_)^W܂&.-='rRC=%)Р{^;\.)RoG Ek]!gN>%M-򬥐un]D@=ʊ lqF!*rex #7r[Vݐu'jL9FV+H,oD:å8Ȼp2>kYnxH [ g.CvPt xdKf@C*o-KyՖkKou 'Cns]P=?O25|#D|SYȷaGc^/~vh'vyWq Off^eqU7l7wv 9g[[]~ %HSd+JtU^;`䔂}U=q5mk]t8O<J浶mKU#_}vaw?e?z|I2ܶ1LқDMKIb&r CJTR䌅᲍Vnid"Qɠ< -؍^Pˀ.I E#qz |>%$;]C<[֕Xu9YΛz*{vONqq\q[ VCO܎;F=<⮝7Q˓rFdqޓ˗3 0:E6n% G(| |,_=k8_zx^*D !oJc~9pXCd፼Ț"_g3$K%[ Eǹ5EXj^5*v7߀\|]!q ߝ.j'{ey-bCby!5ni\̮kÉ4E~+m)Aw?ymtl#NCglZ |=C԰oDzuCUtϡ8<}ޙu.aEW!S*F˝ƻW.+Ommia?)xNِ?N*J#pɧqD{E]d9%[xܭ,Dm5g4\#W9|#ZrR rB[,(z%kfF6y%OcpCŤp#Y}ضg\ c@Uh*6ڷB8A?V!OQ}[>N %<5瑏e>{sf;Zy>Y3<sZO-VV W~yqA_ߠJ/ݛH1o^"I䨙 zaj2[L% Z6N ~淉0~#Ȍz&,wnQǪynQG97 *Uoh~RKtjKZuY;H%D>p2kҠfl`Y 5͉$ )nVĄByZ':t\F_Q~; @n"Ӂܢt|\2;s]s2o@C٠G4]FR^i# <6cz.Wd#Іm"kT$ߎq[4nfZ%mc~?AZ5oW{M 6+TrG-8Ɓ|q8:_WD\yˁ2]3r ##V瑛"$,Wa ō("-'F| +9@I&򽘍巎NX0rgp[#D J!op7BC0JZfj Uf%;#Vb +'oV>`&lTld͋Q ȷCD;\S罂-92'fp#bki2UL%糯okn-u rLR卜J4o -z֦ZZew@7` vAՕ) ' 5טgk"SG!Ez\!7Z+ =, [8`Q~UQ0JYp]N|L'HYJ: i>7r #>A緫=P.:XDc) :Df2OHtzsg |O[1dĥ'ofRDBI@ 䭸jزw_ӕ/3֡M7Tqj5& 18F7y>x=}:dGoP.)}Qom`TN}{gus'EEosvZ1Rhi' 98\ZND֞M+V{h#4L\]p5USfUC˩Ų'/s,i4@St@ 'DWɐ~kՠ{ Zo/o=>:lk UT7r>hޒb( Z_mi" |4} Q^r:62ޠ1d2iO5ᡮ4))\ ̵8!!. |oAhjo͗g鈻P>%>|2~o܆./?x[|Izʬyٌ#/O3XIZ?yYvV@{s\.kgȕ?9-ɩdIQ( J6r#6tZyAvViÕE&Z.s[S-]Ԉ3*n8`Q5{Zel]4Ql7r7*!5=Vil8 z! ;>j{8lbO%6@&p#Q1=y^$'7gNgc,̲6,#B!Q;KG]wnOಆpMr?'~wWpOF}`g2 7SȤ7y EK7vCJD BaWt9CS J"'Ns,[ ]Ohy㞩aql;df[,y}T^#Q wR%ۇ~wm@ox#5U:̷!.rp۽ɐr 6rPZHGtmkBOG9Ud*|9h Z yY;7kɎhىb[u*yv #D%ˠ܍ȫ ,p]wՎ#-GigЗ2|erl˝Iøa0:&\߸Q%lΪ"6ֵLƚO?4b>^C<.l\=!!֧a|)+$:tx02t.nAwANrk;G=&]_"Wozy_> 8328sY:r5/t:[C| D-#pB!-&|Aw{jV/x_e-MR& Z fy=y)*tq$픆Ur!: 9Z 7rG]T{>Eb(dV8%0?W.yS_ ݓWZOTgou*RL,}Y$ =RGWKy\hrCP'ݏ+!s੠]+tL#X>%g'k<%6Phy#o!0|^b}hs Cn μ\43!?ogМ*Ѧ0c[H 1${&b".)ŦLo5kЉ|kƉF& d&ʉܐn(g3yCB!"3mk ^u,Ft"nGCr6Ffg{}Q('*϶‘žkRKd5-^ SʲEE> G)ç-[ekȤMÖ^ĜSqއjKA偽nSy]ZYs-%\8>M%i ]NA+\o#m,m9po@^b9&Yzyeӗ2S!+[||IvRV_Z!.KjߢzV k ,)/?zV'{h@W %7/)DkI"O=|+N ɫ {AiNVBjĸ}#y6)D։ꁼBEF^t^]BSA-ZmIvvumlPwnr )yl,=zhMO:C;dn!;3t Of-fa3r = lMP7p4^Й K'ViK4b;y2y:#Ȭ.F ={teU̷6rYvl!8sԼl9-@*V_js6,A( ¾+QYOJP.bͲۯo_ t2|C)?r򎶯dqSH#wq hk9$b׺ޙmʼVB6v]6\,w5qEZ |/cZy=ZѼSx RIC̟%l^ Y.*\#)hq݄3DRL i,337+xdҩs)C6OT©.mЂ?9ʟ9 rS<-g ['{@d~"-4 P9Ϝ(yz&G21 &+d?gFN|T#oa |2unj*}*qDRiy,89Q7t s*:F)K) m- s|;$9c8LD^ܗS{< li (3-Anي>5-Jerx!YYq|ͱd =g o|]Cμ9+yu@{>e9g~. YU\ ^T襕pm%oFh),9I#ljy?3hFsOKKdmo!Sh&g2Cw 4ĎhkwI+o3p7pHZ~g=yJNZ |g[àu@AOH?N|TTm~W2"7vSQh9 r'CR- ,G2Nx [z"7z=mĝb35UWrز%9LyMIX_˫|%-m*!V[nYLOヤmOsm8%R^o[/[/U-l,:˖t{"Oe*#ϓ%ڡ`))KlHlI,ñyJ.>9*++d٬):5o<G>c%)cQKvRّ) ڐY= ?%8OzYo%㕜gmV(y' \Dy)Ȼ6SB_k[Ck <=;vϙ9$Pm EkH.e QeK8I6q7򾪉j^1dIvJ^,5 [/'NL;A)$,cQad#S),ܲu43w_v+K#? {ZZٴ۸ʭ@U>wE'׷>.e]gU 8:XN3!wpj̳$l*  +bVR܈vcȒ 1HM.kbBԼV6li*Aa)~5Cog?|D+]FSY)yṰ6Ӳ/s$+~)B#{8ÊKoH%]RA;7=c Op9%7]KTko;ȹC@mkXDE3TO絲[޹t2I-l}YģS.~$=ۢM_Ecێ--> 3^OVho Wx7V'g8Z2-hO͕'G^E Bq76"O^1-lq_"XxonyV91ߏ=C>rvh 7"Veyߒe@o׻;%soЫ-K۱>ō\zς•|[=.5j N[{/{Rɲy#o24WdWK ] x\F¸"xP<{!֐#)^S[ss*lNŶczhjx_S}F~:IR[(#JTθB#KVF~>KT<[[\\\FFF>0CN:)ȁS2#D%{}v@JG"f ݶ%d PyoKk7TiG_4车>8׾Xi]o;u-YōvE[+) yα.Y~:Ԙ3V( O>8c%.Dں>/ߠhg CGk7p~]6ȸIsDjx6" 2gA"|}.9SHBqkt[d|5f:koo4coũ/y36l!%g rndd\(D[7p}-t"J)jN6>+k'>@>"r!lWx!H]Q'ܢ'3ѱ Ur} aZOaz|q"W( vm?{92?8&܃=ʹOomґ3 AsI+5bS |{ Tf ,D-.Us^ֳ"=l[|5mQYR?r\c9 zUg{^19N!褜,SAjz򂭺j'o#ێLFD{K{Ii\]PS;׵:vb)Ou +M}1Jϊy3NG^- %GT ) ܍}%6lWY;/cҥr[Zr%_SLl \4P '@SGNq#VR:=kql[1%{B+iR1~#Zkf*oiW9tKu&.5=.o^P@;'E\P.7=R 2&eF=8Cj`#/s?W:O(*d'>1#$4ӎgF GȜD>kWቫ^s8ܛe5$^E*CNm{($-Ώ ƞ D i;FmV .n*.$D~) POӍࡻq>m^2f B‘5>_hiR!doXZ3.<Mo.jiĉ*m8ٖK *rn_ lN_@EO+y-GnBNeQǙ[@&Η#r mhwPlkOU"[v+飽SzCxù8|>g+9!wXtQϖ&asi8sP `q3ZRI;z =ZcY(,yjj't%O;[E =Y!nJr{LC/%f#нx6>rmQ~ 3\]Z}¥]}ֱw CKt @:%fB ] qXS*yHa^] &n\cΝt_ה–ROqVi w]LޡV`o;"ٶE 'N*5ÄopR]2I^{| F>,cҠ3,L*+Qiqwaos3Г*3WȇNj6E2(8\esL]>*teg9vD癧=L>bԬ1_s"{#oJ?q\k=bEmf`>*R𑯜;MA]^߲ 'N‘RzBDY1x|ugߓ|Vfұ .oY t39c8/#O'Aplcm84 :JO-Z>ؐOKwŠZcr_oDZT6o|/A֋F>d]PB^eڠW6F:gdiStBg,1e }nS@U;pۼㅣz5vvYZ_y 4-ѻ/$ѾQ6YFo)E[g^J}gIZ_Q6h{/;TGykL`o$ĬB٠os}AFD&sK?ܷdςmq-aC 4'pętj(8ڈs6/omrk!% .z*rUїYύx#'q@:Oޙ!h|ʧmR%7Y 2NgN93ر,r[_~1@MmJg)d/39pv5cBqg1z#51 nYOhVCr,z*^@^T bR]Ph% _e>:@J1.*-jJȣ0]Q~_)Or7Gfi}ha=3 ]=u 8_*q%z$־(geӕpZprw_'N#De-8 5 s 3XZϴx'^E]`I4[k=Bo8yx"Uo-wۗ<>_CZ^9f?}k/[oa|7.,rxV=pSMHmk#cDn؟h8G%}8hhs=[*CTI2N}R-B WQO0pۼMYf~hpVI:--:'=EA!N&Kacs8DAH+#QULmVd?|Dұl3]6Sy#o!$e|+q)[>Ze\})>i,lPCZV|ϕvP b=e\4$5z+ߒh;(GPR9TLZP[Kmq6nˤKEI_@.!"G{# BM5F#@^2 4o6h @sϗ3U zIFh@?R5*O6Coy'p Z" ri?K~n9Qk&3#o -W'U8 av^\D8r-{bh tG\Zc~/>T)"D>i3ZFDK7B~CBHt=1kdrK‹ԢcSko,'?h93qOAZ:NFy3gUqJ+csL7Kʙ-;9Xx6S->Q}H=Rg ]3bS zIez]àIChNo(uo&tjKCVy,nO7?9K>-dk#0t%><@gС%(tN>Ƞ֩/͡>LVKntC&x ^\ZqT22V/1uM: \ Zc\#7 ڊϺץl"m 7q=YY(t{Lyl 5ox 6}1FNm"/~v\KhY6E =Za#A "Ol{yPZqK zI!KoBikl퍛j:w*pljj=*7"R 8}x[ymk{zl\A8Vf\_6N;>;`khYI-{B*y`,vK(~$/Wâ vq &9/_RT}Y ^mzp [k҄ ZꖹSPZǽƉ'Y#f2h"ō/fl! kS GV8kF,(otO! z)ze:58ik9yVq?}(NXrmzO;Z Jz Ǚ[\4 JB#h7/ӠDhj\OGst|mED-Ҭ2 49<-LB\fpz z#w (ktP%=[5@E#Ql9?-ْUNF?J@G "pM>by;s0gEnuIQ&\\䖵>ӯ\NNsbH:,ГϞˇ:-~c+N|{$Xۿsn<*<Z?B>C;Y!Τv݉2s&QP~yۉ#T&HgUQdZ^OLn?fAm^<},y[C(G}y߭[' 1zh==J^׃~3%v>קjw>g F9K4y~vOkYS 'r q+З }oоB,8pF<p]bW:%>of菓,^ =ˮvE-/y;e;CT'tAR9K:&OTd78>Б\= zzoU~Єa*,y]UKg䄥WMZ h =ZkOV?ѧh#XoDz OAEO AΎ\W;qHU'E7P~"OR(Aǵ\o/ߴx^n/:c!>*[B9eE#(@㺴D1ԡA֡7_4UrD[F:i)z!ߝb| AW)ْc~: & iھ=W}Jƒ=BWW⇜\\.%E7hv↾e`ˁYVԇ'́՛yuyiz~s~?v"6S* W)q^ek-{UX-2J6[>2{lgk6DHY#Fwxkv*pot/ؠfG/K6GrhK $BW+n#Ъ aҦ'rjh8Xqm?N~&n?Wk[E >)s%lK^Oo%: v#8c zPђd*?Tw5lUMr^d"'~ƍuh]Mݕ ܂5O,ɉS {9۷}zl7lsSgbt@߳}e^N"BcpT폷%{ENwcC-hSJD-hoa9qlZPq[lSMPٽgu-\ֹi&b=>ϗ@ʃ gswͶFEL@+ w[FQ,R{8난&ʁ[IzX|Eo\)Ԡ{Mߔr7[˿S+wo|}UhF[Wx^in5J9@d$dB^jɔ8ZqMÊgsǣk;P0}s("jФ>ʹvC!7Jf:2ɿyipa|2"_ P =k Wp>bFEYἆJ"9!^BDP:0:,o-ZKyȍ{Fjg$&U9|E`)]S Ċ}$B_i_iЋ} 5۶Ѕ3Yro:BrO \Vya9USg9ݸ; rL弑+zԳOnsj1>45pp)>arU":r!W5HB>5c"NoBBK.?[X?CM']y; \?yliWiRKj;׹aO#h lMl!4]fϲf, vz?-@F١5zɤ}N=Qz6ʅ[ם2ZyP"[1h7^N檆0cvk \ڱi&OH $;]6xkon1fu2?q08?[ynmc/Ky{4[(׍'.H+JZ{hgays%f}dlJۑ\H)bA<ێ+nd/>8v9B=}̶9 5z:%I7TS::|s$ʩ-"KIPP1Tj^I>3eeiޡoY{SHS49.;zO"wu5v&gkFxL߻L k2zBUmͅ<Y5ɫ W[in%#vOK9#&o7$)B>|@8Fl=w$U>OmZf?msNV'ho7yes ?7̙QAK^BL.mmA_ JF^4I[ o4*6Q1e]ߴ|$ZQ8'q]-+"&o?U8C\%Oغqbqאx2mhv'.3~歃xȜ: ,RDF+N/PMoe48 bNҐCsnD۶pb'ZNy1 [<zxUoW&Y*^h:eQ(V贖Z.pK%8Z:7p4?s<׈+Fb' r\5^n|yyx(:tUJ>ɲ ʼ-Aњy4x^A_m Bˮ@~& !ܞ6 *e F`K򁻯cj'>ˁ{8J p#~泥pۦ4a/ '63y>u it+9M̑ ͥy=l8kߒp֡9THn5ak^S?,ޠy_' X I~ڀw| 0LФ&7r 6x=^r^,"gd}ԛY ZgAar rN6w|% MZrۼ BH&ϕCiLE'-2_P |szQ9g{e<őfveBDFN_2#E ם J&$goIb3h/;D#9%s53K ,'>%SN\\7=^2ʛg*B.1G'W8i>_r-(Ctj9Z@DD nЄnto?.p"-7Ti7V.45hu[W(?~3fr[hȫxݍ 7љNsas!5\6_BВN5N27TnK! ߾zB~@WAZ/D'}C#ONl5* gL尶BoJv'p^L Vz ңDEX>wIp-NMۏc'$|!ׇeސ H>}'#gA \s?q?קGPy_N%q#ٲQ"4pp JZLCuBF:DiR+}z?LЋA$'yB|zuKT&HۼF~s6'G)/JۨA]_f]Dn7/'j\焭[1x[Ne*cxc B{&v#rԐDd8%֐~\~G-skU3be@^WNfds-r"rpy#9%3)8 "{w9y{yQ}s,MI6>C=?> }- u/Q5{ =15l6?s!拼6bɉ}F=ʠy\KG#Ӻu{aoZyp>*g/6#DE1g-А X0a x[\z[<~ sr=}z6*~2ί26t5 ,uMV<":%GBj6r$Zx^[${^& ZYƔuA<*8Oɵ_o Q0 };y(vh |\ `=ݵ5|HS/toOx[É>^hť-[G:in[˵$mrZ[(#ΞOF9rC'px:3P_7Z(Rp:QaOTHM)8֠) |mc;-gAlK{p}:h7>7r*!U<&BnJ):}hn|Sq?мLMwF{j3C<]ħv螭7;"{t|!GIڸ=+3B?9rF'eTah-.vTa7sN4+4gՉ/XƎY*r"HWgg6`[p=(rK4k֧C1ym/7Y⊜eX qh:"q ݓز7$е% T7!$89vE3e=D@{B_}ɼk>(U ޷wh~6z˻!нfk1zO" lM/&oԑkZB\v:#[|'>ڰ3;+ST"2 j Ă9}2Iu2i xɾ WhŻ*N*$9g}){~Γp_XJ:y=ZYObp1|A/P|4$thVG<[\xE›,GTqK:F.!K u7h2&Ck$yM'/ϮIOn>rۏ}1fRjWEƀk8}4:ꞇ (}qy9O =)Ͳ ]m!n9tX:ЃR.[^9nϓpX>v{š:XDNeŕ-2(k ,G.klUQe#"CT5΂'٨c"|_)oёS-n7G,2/[( VoBYHZyFbq~\g!7pP X6rRGNG*JU?f[kfO =/VN~x[~hjY m,q] \/ WNqJ |UͣԒ4 nTT;GQU\Dr\W SgNXjԑϞSPbK"kF^r@J2R*[fjOƭ^l0@+{!_gЫ/rckjo?'+Ȃ,T@ޖ(%zf4qյz{f\  ZN5 y[3`sA8; zvUhfwz#o1Ysj)~1:-~:KD//ȭ!*Y}tbuUz_O_7nf,/ܲ5g/I.B4yIӬ+\0̴AklbKH)wm)w_e} 5ߐ"NouI] 1zT%L^D?fh^p#T:lr~JҡوөnzYqt'pI6Id5܆&_b}PxYW?Y] \B3I/ >Ny's!>'/":w6WHq==)U }!A9evJzeB2h]xDނõ-+yqx8,D#"U Z8KD{ 但֥_;4 st B|=-`/JCoU $(Oz2Z]5YF xz :r'u5YT|%i+ oś˩$o#{E:C,٫[hhйx'T/m#G~ܜ#k i/RQ*7t OmΫ󼀷؝6ꂤ0yzI"F^c\^ynڔ@Oh⨔MX'l)Ogy.Nxoq7-r\Znk|<اZt+h1_*n^?o4!֐UAnH;(g=7:}}f\T'Mt$p.% bQxw^ OH| ݕKq~;KF.r:k[ JH3ٮ TY5i>4V3,ڑ+ cf,ȝA _fv)6}E} ˞b tqJL-k5!H"袱H ! @$KO:,9ZJj{C/9/W#e[y{+Mq ΄͠C7pe8!U7/m1K_g^{3XoNOۆ͊'YBnnzג\{xygUTЧć{uFQ rǛњedQw_GL^pb\b 7#4S-ך-X#FyC>@\ZG mBnCuP\6ϻsB[[п˗&do~\'⪇X)JC쟯gHdTkZB=5_u,+"fVui$fv}UJX~)'.kq^[+Чj5H) j%loոZyXs!o䙭#.xBr&|L޼D>9y>eϪo53&$8pdaZ9RĶ2kqo}]k;T榺Ȳ]7Ih zwM/'juZo{|ȮB4bPCQWYK|1A?9^,5:-r [JW2dFqxB_ouMaj-r[\ :N#2ٗ,e@oY?v#O{ fWz=HzEyOϤZ.aB>%4s`7^jRT ZdxJ+|ܧ>/vY,UlMY}#WpT'p.2{̇)zZ-?ϖC3Q0!d@FfvgJni' ;n5[z1W1%IMΖ4vA1LJK yyJw ܮK"LcjnU"{J7;G uqR 4T|)~3 /\b =ŵJ/н[|E%Ft/ ( )yo6bb[#[Q n!ܰ;=9 xSsؑB2uSJ+JW8ԠEc%iNƾ+;g嵽5iO@n';NwgG2v@'/רl Vn'_\[Yz]'Ao'Ў-ͷ8OܰX+}m& rwx={O{6㵻/Q+C>N:fyKK[)N*`$=@+4*AQsrgJ:`+kI:mϬefk\}@bor 5-+=o1gUy#2:t-g37?yntzaH&Wo1Djoo.5@ܕ%@Α)Rewd޲3ݤCG F|BN]L RS>trjhBp~5X1I&9PuKȰ, J\͊ + =B96KelA{&r].Cp$>N *Dܑ̂g-Gr##?AT҄!L!'-h5ȝI9AzN`ܥgη?lm*fZ:[7t i}tf&O>oYKC竟CoIlzq3rr<>BsjR%|[1$m?pr_65ӫN^aq+Ia- yj.Q-A!Ok d<^e kt&V% m'I2 (Wze4x>025}Zwnq^s"[)y χ $rҠ"Eإ)7tY{_ls j:z#"# Ȭ YxJ:#oNNW7rYz@ }e R6wV]Ձ=e}v򳤸y{1q6o04=[[oaq[VJoeua{g:`~p-+2IO&ȭ(x,gYƔ_q_3dU "PxVMA$bF_d2[%{#! 1zXĚA?ADȟ'pMNU7ɽMBҁ\jR-3Z8~RUܞB%}Q|C?- BB&UpavZ2e`2f3lbi+._h: :"iokWF8KG,ܥչ][q Wd&Шon(mSP/aeo͛Rtz#rQ@gnDD6WZζm/*7pm؅grI-Ad$6Dm-][C"/< +Df&i."M{lH̄p[vXSYׂܻ%?;/OHD"kuocBaRVo >}@>!xˋ *AC7𾎕B_Yw'&pi-<[rt sn ysG9!vt T`)ۺx"c5+@AH!-Vf54" y ?O(rjj&@}mpI;k| -'o:˕8LhRr(G W\\yfTrH$C!Sz#'FlNnVye&@Ӟl7ͧ4&nF-'CIkq l^y̭C; gOgr 03#SYV,G(Kio# ѡ,"'v` 7/ :_~p&hW6}$(2qy_2ԳB.@I'(ηȠ[{ `ѼU>s|HIre]]JHGk';RLZ67QrJN[,OulXO(!iHp][>.-DÓ]198~n p++͏הY[uF!Wb:#DlFCk?k]c#~6?se!3_5 49qn.Wj$mh؃~6os R=g 6Z.éBele[ew{\ua,#y}Z1Q󘠫@~ 8gVr-P1\O֙25*Cļa~"G˶"'=\3reU' [l91wn3i!H,2zb=eI@K.VWʉ+u=҂p荝^${!jtbн.#:K;صS ʝ=ߐYku+B7u3y kR!iuy"9: :lIiv@X_MOdY4})}4#1р_tfZԱ};ˉ}Ƙ[|"=*MH_Vp`/*!ge[,7=Z.cݑSG~Bτ}xO_%k p3u҇8E.2]yg2*#io z?z:2?tXѫ48nʾKکRnC޻&o讄rsCO+^ʂI\9ތWt9zeꌭ$'v^Ep?ԉgLR MT.{u} kC~~`׵I~;K9&z.іA|do1KF;,dO%F>Nu\U2%<-RvK%Fo[g`F} 뛾 9$S Fz(Pr8Ժy2mV^r6~ši7t#З1k XWaW%tiO92tF>h OIkp3='>y_,nwdLlÖN촤/ƩzUߓ6;W=Kܐ -5F=GNb$Ս}t] zj`Qi*A StTY`C3Ne1>tB6feI1 :kb'_C=5$Q)ƒEd`˿=ķ.ffǐ䓪1Q[nR6jzjQ~-Z1=Dp˥*9T MM>Cd][91yvN[(&8xE8}l! TUtxկ"s:uFIg.@fzgYdw'0ۥ1,ܐGfFۑp@z/ܼܥOsf]< =j5Q{;&0ap^tyqDNfe4>@4^%:bŦ8|\#&qfvAo=@Lw%=Q`]Gx6dMW:yw;t x\7<$wMY Uo+GkTh7oS}^0KE?γ`I芭"B'͹vhn:J7}&6 2< ^nVQxoQU"Ao{=mxk 'IV0OginIlaszޗV oK|mo>cvdU^bfzН8%L.Amih>WAJ7;l0xY)e@oԛ3gR>;zGngQseHuRH@n,2Β‚<8F2S ,6ȩVMIrv{+Dݹu]]8E:dz~C>_~_@|OCkw=KHEEY3ѳܛfX԰yi{s!]@(:Vgz7[Kuhv{dPoܦ=$m,}EWFocvV#/KS6lEEM|y_G;J`oJoq\7p?4: ~N7RRmD{^:'o#+kоB29y@`dU5)CoA jy6_r"'<ϔyR1-*N>nL~\tgݼPP jA4" Vv%\D ͛VB&qnZa2Eb |OxoQZo=8Y7OkVA?QmAkH5I?[ݭ蒹dkh#i}Ӣc]> Iwh.˭Df-1:Y}X(fB^J)T1hh zjW6_q-?hw9\cύ|? |K6=D荾aI~n܌SkwW3U4.WqqDA\z| 鍜ZҢM!4,2VD32ņw 5]QcU)XOE_aГ,] Y.piWH+!^CH&dh*U\]+a K.[NSrV])Gfz1Jm \?8,A7)$Y_N>+ /t-a+]7;MC- *𙭴e]#fS9З@Z0G/N*vv@/kc$KJSsA(۩j&'a&Ȝܶ)Tʥ}5kVś$ <@O#;ȉ>KP]7_Ńr.s+w7,vE5#@ofY>*6j;RM2e>$q)͊!޶؞ݸ'PxMV "N@ǕB^c4߉O\njo+QsAnkZ<|U\PFbw+ku7Ը{yu((Al1WsP\_!rgyB߇yL€m.>3DJg~ď8MTֲg`BͤJ.I YX=PTliʛXBZc\3'\9-c۵O39y'Oa::tmtf%KO*=)v3s'n` 7ady Rm5:\mtֆS =Ag/5W{x_x޶Q {{r^'n*0r^ tj.%>Op7lUg7~ՠT#M|\W=|w:gAlY< Й+Mo%CTVD#2$>!zHCQasc,* %~C-*e1pk,9GF~n wki\{'m 4 4/Sn8=*o_U Q8k>(-бWUGE6*/j%3,_)+fjNGy3;T*+4\c' NA4I\(jf`;"dޢ1x)C{GÐW/4hT䍼_A?jlZir*֟n [C{YI;75WnJ卜iK3!T("KM.o)\\x@< D͖'9{)zbk|OUD+ũ$uyCc_64ȳ f-Tk\Waب9 F*)r;_EZWE> dو^FStTp @ 6sFqf,jQR(\]ba>xjJh Z{7YOЍ{~!~oK04I)y& )b| nhܷx<r0 wTQlp1"pr^^K(ɡuh#SJ 1'a#kXchh2Q-f!QvStm^j`ŕm>eVs}@$n5D_WNg){1eY%;Nh:ygY5V!hYalnTC;XB|;yn3),~6^~ U n|VO&lzY}#@{yY˘>{k#o,vz]G^pKܞW}oKv~#07;rxAxⳉ, 8gO'eZeo+!ki5;|.u xNA9OmI^+\SX ]`>}"k k8VWB7<ˢzŢ4>v>țc5}@OOܐc9;ig85]dgX<'` ݷȓWFn!ӗ `ڍU5]ГO^1;"hI qX,O;>Zxzv^jgq*Մ #Rio7$ yYڼy:1S :y ϙhJD/cmGרOAk*j^22)7EVm[7\{ZO} 'z QkS@QiFqP>Mw-gIJoܺnulX)pߙ!*,XStB$9SEדF^=c-co5nM洄\}7 p^TЂ#-^3Rp+)ăk>@Y"IT"θ)ŢJoysplރꤧܲ?}^JeqWXw_zq_,ʹ<#3xb!b"Nq?}Ė<=-SޗŇ_: aqMZBj|{JI_6ffMmrɻ!@p*\5 fnOUdJYRǞyz 0y@Rr̄ oV 2[ډ.PzhڷB,o2 ;Y/[pHǓ| ytO7l<_z~m֊g|M|#)7Z_[=S.eBVoHK+nbm/bNn񄋛ʊ*QR*4bfuA`ľv{72!O$޸5AؗI'=6srh%a/U =I$/4"/p~^ZN[e6fƲZy?#'* r^:R8뒉E%r,j N*ɷC\{۶[Kzg T$vPΧP:Dc>-KXE4e3E3N;4,}DSŮSFcDe֞ƭ䌖'ARw-q|[aRG*շ<6yP%o[_NG{ ->}C!q :7lePhOƊg1[^Wv}VI\ȩQ[:Tlh_#@Lq36W[6w.<+V/ی jVw|1U;UGw@pF>yX}<$% !QN-@zaU}A]bB'NE{3ATj\ʋtڮMO輴Mڀ>2T5kL ] :d5kFe9ϫ;7d"w\WS.\ f`Oi/"C%*Y=:uT쫁^C<\1C{dB-F}6 U;o١TlInoл4XGTIN;ciȟĊ{_zj6,^fvfCR RngA1=Nv9E~ Ujuth'tۧߓޮG!0 &>QH[NB/P/챃IF3'(f~6;Y5mݭ~͞;-ݝYzn @԰|MB8K)3HvCnjs%b֮%Ş٫ӻ\{JHM@VN~t`1n0o7:Re#2x@_iG|ltdyN^}Ӽ:aBHN>(lA}zL?#qK_ܫ@Θ~OWi֐Z2]eXr\Oxľ-i1/kAn,57-)UIV_CZL*Ģ'v[MtdLӫMډ})UZ-W %tcf`$׏->3nl&Ubߞ-V7r%57p*ѰcP{BB܂fiJTQ"g9ی%qȥPϾ>#\$Irs9q>U \&b)jX/'⚼w rZN%~UB~=\7y[>gqa+E[,-/AǏiri֭QlF97%"y{5Y8""iN7x-zq)hZӿv'i-5i†-r oΦ!( ɩ-53]:R9'lEMHpʥ,I85&3E'hSoZ%Z.C^J5ܭ ޱ _fլȝ[{Kh%M膭1?SPk7yҠK}2}'.&gn|4ʼnҖJXzX|k*`j yh zS}?+\IYu@z@gX Q<+6KyYES Pضv=&vʁ-x3:nDv%LѴ뺵] 2_KE ;%:LN)ߨWua`g# ijUbT ɿ2 %7zGFg>ݐC$VC+*wdF9QU6rW En*6=7 4sr ]r).d 5D+(n^Eb7*- Ν5>c0s݁=`-hV_*fֱ=秞k0^Vj)4:w)PLaW:ȲptWnE[К -}Nfg.Z*<^?l^o`%#G=sn}tϜ{\jUHgC{U5aiT@UeS4.8l#t=?Kޚm"vXd_|O SpRכmuq;},.~&"<8\[}nWEF{UZ祏qTQ߰z5p}q?Jڡ盿[\]{yͧtI*Gn[2TXSCq 8Gk؃ғ5pɠX⁊f-@B>ܼltVyCUwv>m^km~:tk[[ 3C6 7mL&ؗV:*rjn-gs"!UnocIm#-d§CK*娑BC޸5=h&▏{,5&$X:)IYk-T-QC &SV=JV'im(g|7%i冮^v^B4h_xiBރwnm2ITt=~ٷԃd hUyy}J>b *u@yAx퇼X bK jFog&Obp&-gقT _)eo2-)y(|%ySu-5Zq%XCVj -DB_#o>"EsÑ1x23D~j6,~uЀ59ǚU[ěk}_'o zSKkv3.p*['uћɝ-NM>}U*r0|yvU3&-KD3-Y7o=zBpKp y qψ.#|`RoѬL* =ҙ& 3T7tb 8vڑvb]vs]d |eR}cl@k< 5 [4nLg)"H~@D}lRkR{^MB'KrAƅ;dr#5h2?l48C._v#CKV =^gͳT i*]&9Vg^}_㚝sk}uL^MmPن|ЃiIg=&1~70}ڱV :mh&}ghŘT{}MCOOK]Is{LGa}}[B [,KzGN"{V{N}'f tBܼ -V ]"IV(CuufF/ȾNT$ѷ 2=6 ؉Om`蔀7=.tj/pUng}?fL@S1O%鯓WC@¼kw*ݖ[#}.;yTe6Cv(t?gwo_'- zJ=FrQa\{=v~\xe!<Ƕc:rG`Htn RPEg}md{Jalkþ1r7Dq%k}".nu:ErZȡ}(^:oL tyQ4٧> t]<{W $\geDI!SU2?k$kfgg5_eW!' }KQ9.W (2vT(;t)FRV?ނ8@ 0Ntbg7w@ 6K;CZ>hk YN.\!{'v$c@$Me̜iE_2x{_H"Wx,kTe!GN16 )lևnϫ[4ZFeqMvǺ L %`o{;fky:c(V3xՏF:N >ЯS14<!r@>or4;28{Lx2l} }*#3Yoڶ)DT ]T C%}ª`߹e3za/wS?A ]r`5AK@d1#>|:X~Z s2uN'򺶰M+t`/9Aυ'`觵NO lqvx:EYH5)o%Ι:W!?IT3ÅqW]\ޠ=݂WBҡ?fKu`'5sF m\w#?/3-Ά)⽠vdѳ^CЩRKx8<]>[5čvfR}Sh5U=kRՏM?+Us@Sv[5_5tؽcKZs:#'O=D|% -8k]廕\Bv\|UG)vAGGbT搠C7UrD@-rF?wͿτ=k\|.[Ð=]j4߸BBJ?{ЄYM~DZߛ}"'CG]bc8-xz C<7?/VA-M'r=@ZvcT7<#-B3=SH {ܾfA,s4\]cי4)i29NTcЗ7 {KrJ\jLE2e56ږ͛ͦ9E+:$oCQ+ru 2vdC=14 z[FahP|] T@;S [&](l%mm$9!x<ۙ1֭}۴M$FP\{}#L!}AόedJ_pk;WDI"~S.1hjB2nq/X_ .tBp@%*i>ЅLSnk&'կS.eOmqAoD>ؓX+4R"SG߇bXv]"WL׏ٛ/ߣu5ۉ-_Z3?z!SM4hA\CQ:b@1k3򁽇y loN_-ѱրn"k' :U4A~bVS;7~~ЉZ :}|Pط$ͷkG6 9h+'dNwǖxhO5eb=cjDHuP>k<ٮ~@!=_-u2:[^Z ~9{gYzf+Z(|I ]$5l_t]׬^K`Dw|ГT9snkwbт^9As^>-q;phwk6UR`7Jwϡup~BlN#Tv|ya4n\ {t_G}cߌ S t"s`~!ϴZg\`ZN,>g:-讀r_T֌ A]F[_ z &ȑqu(e ڰj64m n"9dg}J`5fTi1Et=Gv\7 ݢs}yh*}C+r] /_V.)b"WNѫVzBNUVh@l)}֨6lR&2Hoy\ʆdނy!~໐r֐Rb>=ݵRHet0 ߾@+s$1ct䌽D=pNdD4"K}W;v˃eׂ-\Г_2SGHNQ[o I$߬t[\ljud5xck}tA('ediWfIvL(5`'v8VP{EW]Nر }N)]W p%W'CP c`=s:N*&l_fЂb/A ? ᅿ}9AGO#J*1+4ͩݚs-@čvߺ*Yx`g3{ %垆~E/r֬ ޖWllyraSz}A%[3b{ȅ:i5iLfj&|BN3V@AWy(ɠ\fgt^4go-Pk>ڌ$#+xu|\$ձ{O E[f\wRz`w\4A Ѣ.9@F7_<S]w;iGmm{[-%IfzJ9'-wi'5k߱4?l}cu\kJ>}} FcT ,-rf}1vt1BejbW.2r8jl.z,-M[LGjB񁮡e]/YGRMx5Qft{\qGa| uD*dkv"O[:{Ay(QZl6f~+p쑗lOhvv04rs1ÖU֌19VYoHJbׯK[ |-{`CC|y M~ oBu)!~|}ڹ盄}RoyDH]Kk`WBg }&Tn- :uvOԢ!O(>B4w3ėՉU05R 5HYf?p> *=pdZЇ->L^חZ:c+fIra] o^Sh& [Nz jV'Jyv3m׎ܯ^8m }91r ^؜Ygc`Hd~4,^|{HD7U3tajtysmu^W7@okBLW=-8tȉ}oZO:ߢ1\DQrvtkrا|&ك]Y ҊثJeUifrbo |[R?vuDHk",S՞ZW9ɯkTK)φ!yspM* [D\F)AƖ51O =AP]Z*Pk zPZ4 m4ed g}Z=JGЩ>..|+wb-]|̯-2"i4Yzge{^[+97uzas=\=JؙŗÞr󝠅RFԠ3VּҀ<B躗+!bҢA$J[nVN)4\Y\?.F3<_忇tA4 \/+5:G wBNQYW<"$?}G˨ 胅tZ͌%"OMm wVbk;ǧ+a"{ z u̪ :mޖ48+X7~fof6x=忽Zw =:ii8u"tJx_,53hh`ٗk hqyMnK5p#={-*ThL*4Rq sBBC/[]mx!e h=6 7]:8VpLo-rlfp.]+/qz/!U{q t^~˕?X7+`J;LQ{ #'!=k)l7QW=Ow:/yQpjARޠAO5剜-Sj|ΐޠ{D.jPLah7F^w/g--U[p^aSnojH#d?QwmɖrB`P}ڎhwέV =R)x @F^Nr:S<\֘j "`;4#ٍ<Kv[P'l;"RD{rp[=+**7~pu'bCa{?FS/ޓ1yB(j| :;D#d)>sLa1e#q#c79'xasn Y,|#xM4ecB7BNUerA; :vDMޱqSv>78י~/l %[ۿ[}xGNhWk?a>O.l]W~$9N&@΢~,?& e{YW6RPA)J? "IzٯO*h8_]=SMݑ# Qe_,J 4Yr';$bA&Jsa?Jj7Š:4.CA{.R$-_&' Q?C_iɡR{*ЌiY)S2הs'׶b'-Í<9QUx?P|-̷MCmpr?4ʼnJp[*FBf8WmC;-Z"hY GٖMl{SskN._ W^^s6K /r^!hLcɒyo}Bg,:W jN9bnwu~ ! ͆Dަv|t -6H~-q% 9f'iyVyy˸sT3 2p+Swyxlmé}mgkϻ)7;H ҧyEqUMvB>k=y*Tslץ)gǛv=k|bm G<<`JqS|_Jnnrsn3@5 &Mk 94 |RĔzv5?7L PTs-h8MDogch!c,tl]g1k-h.A]lmrS,3ނ2EZ,Q~u~2\1۸kH*BI>4X<ӬV 9WQWHxx 5O템rlhOh2>8C3ne}/,Oee]ȩVM |&Q 9<'^[ 6x_}l!~JtIٚYj{[5^0tOKnmʇTF鷗s4m]| |pDIE{DK+Qe:o *gS{wȒ L"%cs(؋>Z$oijkpɟ ׸Z[6 p<\toF;vnlEA>{M>@uZS{r wjgѼͺɫ  ZʤӋhHYM'MFNz0gq 8E6UpmQ|xI 2`r<7C)N14cuJ!\UH%,#ʪv۶+Th z6aM.Y oN>J}'p ~b?/WRƼ +A^L* H|^\y{qUP[yҬ(vjЉVhh bENBs[Rh7e^8Wf[H&J+ՄGjFЌ!D-yc9MY==ܼNZml )ru%5997aߨ҉JʚhmN[ضVꭗfy^R\|륮,zn{L<' (7 n|`v( tXs6s֌hЫd9IU:Y`pmW{e z6QstȽ3tED3VjuLD N0[?qx{C<{ 9N6neb=ߍ^4)'r ~9rD YH22I ۉ\ 9ҡ.K}CguDrw&bWF#^}Mz!h\M^c*3rj}{!+k}Б|16p}D$wnEнfҜKL5xxy<Ր[ 9QKg `GM:;Io!GT Aqλ6ěRl鮕x>+$b"4kmvPz!#Yy݄BV,͹g[q5dL`o4?=BΨxh>n/Si,"'pY Q!ǕEX$l*5lU3׵lSɨΒ:C eQ!S1!O <ϒ8щ|RX2UG,V/Spofms9ybC/py>kƞ X6ris:59QlȊN[]e!?S@K..[>Vaeۮ aRpN6{QE{*)[?[[;[nݩW7.&3qoONKqC^C|J@rr:wĭ#ar&,grFs3mENډܣc>u)մVJݎš55ǫy}{<5Ϟ$C?q5D,k䒗Vȉjvhgf1V5[n຦T5n@\l |5.\>3fd{ik g9}U%7<߻|EW@zG{m_uܸ}g r'=ܱ[m+*AKlőYjG)Bnܺeo .$Yw*\ҎSenOYsYpop+}qhzitDK}VqmSL'DZ5ZhmfQ;6s45[q^.}dVA^C6@MNSvBW@>&ayqy‹yoJ6mߝ(:;t3(6|ʫ6\ C7 O#2b;˒0盬BB$ѓP*Gްgh6iPbfl\u1zfrY: .r7$dJYi)p=*-.!:r8}g\wI7SR(ɷS'oO;EoT #bQs$F Am-uhhUͥxc><+L"IFN)7Ojt7>{h'_C:ssT,g>e| y94յJ40ywU3ڨ5o} m~xzl^[էt$& :˨'rxl&|~~B11AJ~@.Xy_F4SPo:gl<&XrDST?fz9"НgneXlmliϳU^W߸Bc߆rO(lG(/yB5lŕ| ui>Q=c[KnyB4drk'p[)̱%YVS"Kl`;Kr. jݕ=\Psrs u Mtm#l$:΍e/F(6ɉ׾Txa|3tLbvn<9e nYM[ ]Z"sUrdkPp&7;-/Pl#ǰ"]B%8s|_ȷpIӢUu[:=# J$%tx%\ ~JYUs22\&:G!FO- }&ϗ4bbnLX}>Kw'hڛ=NOkob͛|[]3 y?WH^l9oJZ?FӉZ{۟5{K[ߍ?N@绉`1mVOWIy~~L tNT)#ӑM֮떃dtx]1 6c6p#Ws 9A^j`p|T|^8]nzӰϗo=# :{BȩUuc*]sbHFf:tCOr,Yp`߫5}ǍWlIP{p*G_jt/5R{_Ϥ.ؗ&t~CoTzm2_9{s{{/ȍ$XМ9WT{|F>\Q7U2.3RluZ*DR|@ʼnvS22 &䞝gbObBVɌoUw=B#ˍG"-ȍ0kNWBR }SI$r&N B O;qpyMVBOEas뤚/_qOoa0I%}=Fr yzME]H(P{>ԯ(696jiNS|CʼK\JV!_ښ#{fnK4*8~SٽB;VW5~d/+CwR{[̞*;ӂ;QN?ka#c1G3^־,{ r>{JnvmKj[}Plt侀~c wcZPdn#wHI7Ϫ#ΫKw.91\W5W)IGsn ]3l4G@G3\Hu\KEe$oҹٔ*8Rp =T) -𲤲}eRZ/Д2n'0pE܌V /=]v^nk|/w }^Nln1aux|/l]ڠ+^#{cmyupBqM2>G%Dm_PFȤ ~"Ϝ|N*OkA6B#~![<|Zkqip7iVn{I)m}`A=j^bk7 ՠޚN[*8MltNu@ng5f'"s>uqC춷g|9fCzff¤#gZΑ_ͷ䉅gۯWƇW_S]f>c6}nzC5Z0+$u6pe}T>M+*9Y2C뮌Kna_{9$ߞC, zXZZ#Y$i@LC1yV9'ʰl[VͼJO|`4yˆnYKMҍ_5,>DVd.eb9Q43a1^al'l 7&xq""?@>:Cػ^aOT\g#/9% Zp'}ы+N'pNY9#W$YLs?R5ד^"9dvdKB>o]ONxPv< ՠՐ^k0اBJ>b!ha J͛ɧ&Ao2@胻iF-+$:Rs?-F+F:}^b`N{|=Rϳ!rty`uou3AgIV1Ҫ_CDDin\&5lh#WI9^~Kʢx[N?^9-*pVmqJɑ ,|ߧ%YA?Dp;8&'7m֚48p!\oNa}ҋ(Ϸi"]N9_wC$'4_ \ | xO 9~ءGqޞ ED!^ |͡}Nr[qgj={hOΪY v<6&% 5JZ,=,^JZ|GGmSK8.M$yg}KWisxO>ҬM !hݯ._0Nh8͖nґTߋzuݸ$GN\E>TOk[SrBv.r5m. ZITȥ"ǖ&y[\얠k/Pn7 $ҚRl-w>筣pUlf_xxyZ7rep}r<{0[Aꁻ/./ץ"xWqPub:-ܲvm [ _n4Ce4wc-5`d9osO%l|`ۮ~ɶY7 }Y&u+JX9a[I+[5Y!^AICOX_A /5}蠉^`6ȫ |p+wLD8a/9 WDȵ&k?׸2|Aʻ;{ X"vXnc7[I}>6]OխF_9؝:y陧uJ@O-#܄N6LtYO4 cDR;ۜ,/h$Z##^O+#@xJ9ϒq+͇qVWQj{m18Qo rEbd*_-ι=Unw{"~!h H WzI"fU0p}?-L=aF^}՜9itChz!XFJ-Oຶj^2%%`"7in)yͤ~HWʣZ+`5dԠiA+:O5:]hdyBBD^1Ʀƫ2f`gnMPA&aq"<Mi=x_)' M=uM&SlJA⼝G4hd=h_Dr] qJ%ZS2x_ Eg[dwh)/%V64uD"5&V"^t3.'uanCD>s[S"Jp䩡)yx>S t=վ"uoLtdY͘7y-v_E3h^{Z4DZ>ލ/\ٓ |DyVWh r@dsMjvn#}qkx{̢8g8B>DJs)ݏ3m'Xǵwx?Bru;b;-B5O9`7i|zCth!޳IV`V}'_[fVkOx>e55[{:vgy#`;͚h&J Yޓ_=Q9O-*p Bbϳ+a)ʋR>qiz{I^G6rV.|}ԂFtq=kbz"ߚ|6/&O#Ji;8NzJPa'z" bTq'rԞ#]QB~G'\ZDJWny Q3$b>7p$եA+5y>v'[z=5mK\wuAɝOlװkn~|'ѹ;#|zB_9o//ЋY.7O -a7aǩgJEEN{~X~[|'TeM̶&I[yfsPwd_ѤoS*v?ԡWsW>Cwn=#y,f5q8G7rC%\B`E I7B])n('JMGk|c?DV5\_Y8tyPVURB iuFYνؼ3VOGڍNNcsej DEv{'A:WrB% _ ='=3EhW54}Ks+2s-} 2=\bDGt!p;;<FrZ{s4@; 0YNxhFgl`O3N[^BenbKӘrx 2svɳ pBhG0;!CŞVi3> FKzFE֓kBEGԐHJniN], 'LX%bub b10x䂫B31;6:8ax]}=Ekn%}YDJ`{[Ы#$S&)XRaCt~=F.(sNdܜK1zj7tLwa $:HlM"w ts9eM~Q?Uj!(B'4[\Ri?b߯Hio4*`ef~9dg/ zL\ۍ]0x؝L=T(Z"Ї,]8'K[mcscjJ}Ŋ7&U!:ty$:@C'Ҽl~cY>>b.g@irfS@ߒxFn>:u 0}bHؽ$S3Q/m%-3Y덯rgXՈ5+e.싽0 0|eaV_kSW7#=yF̴?I9/v!%kJMo^e&vcOzߑ m9hSl XV` K _5x7nۇl{6>sgҰO'{4SήzJСJS2ϋ͚>][_j]I*P/{Hu GMݪ/̉Z: W[zV;qPkՆeM~}#mʻH QQS |4["]}a%u)J:_dn#<"_S-pkȡrߧ]`^切}שm։vnƨ@{8u>M)  owƭt`zS5B֚IVI N7ۿ(6vw0y0GFv؍PYx 72 sVє|8n4ۍ:$qf}ZLps,L9豐J>̥,5%_"-QnjȻtg*5)mqIQ >ʶ V$I-,ʇ"8'U$ K;:9&P9iN j -n1yCf=8U亓|ok,aQMi~bnmVz+9أW9-Ii*@] 1C!hYuYb714cɮ̓ V|~y2 EKY6跳8 TF ]©]9<4<*0YZ.3M9 z6}oi!@+D =EwlBs <'<@ԆZo`x6YM-PJҍn)DdEoub_'Y$Jn\Jc y2te?Y22m҉FCg4Pe)7(d̲&S {R>w@n[ yW{W7d%[Z'Fi[M>DSMڑDD+Մk|5$+O^Ѽzf,"ry8[z:5h{+rOrcװG>:/{ : 'Imҩp" 4~ILKYk=,5LrCgYraS0tțc#!q<~n :7ECeDk%l}鱤Rtå½'V.%ri+B/q&,gj6[f m'~#E:bbsȱ74p_]Vlyad:]R8#ԠOãt[̊-*NX6X>Ԑo,r:oДbi7FeӡqPm=u&_776G]"m*$}p@|[a+ov{%&,͑ \ " e*,Bb$s#whS*"'r 쩍 }TO-ĩXBrs| ld֠C-@8pO]yXn-,.s"J.O6L9JyTnSS'9HtN9V\P0 ,օ [|S, mnsgWr}x[[\xAV߹NiStDα#<{Ͼ& /!|rӳ۵M @f`+_#)P4{^ꥵBO5{ 7ymo^^=^ yŜŬ/$"B冊d''ͰR3-d4u#~PHo? ܗ Y}Z@Ч K+؊ y uaH("AS1^:XA ٵehV9eT\wP2H g8Iy}ʈj/t]&e>1m)=h||/*^= fi쁐[BI _=۩gnB+d6N(Hs>qkUٱx}zV:e9\rz? gtyK oqp)Jyܰ72.F ]x={+{{AZۍ|$I}#젨Ks(I,ұ{,7rT0/d8`'27Mpfօ+9t!‘ #牍 |-&Є <ϬF8_f_Aяs--7osr:F~H 'nA+xX68YRZrn1;6F^^ ˇ#kDܺ  \Դ``ˉ{گ5hF{ǩ9ŧ[/sR,|:7=bي۹耎CUJ5ygeE+An]DYz{w;pkHR@eo5dV4u⠝";^"LX/(PTZ2Xi#d-|ewJ#^LWbȡm |_sFFS{>'ﭮ΄4껧ǻBo}/ruck\M9a ʱ6:!d\5#84[^6ofUͳTS@*1KK;ڎsP) }LI]ow{~)k֑k5x!p}lJ|p]P1씜}sw$>)[3B.Ook\WMNຸm:Z_)VjG‚Yρ|UJQ.$yPU;Wd щ4sΐҢ'ÖCV^a$OifщgW #A}sHBu_~MDnqi AK0e`YκZK9癉)}wҲB% R5:ϥH}iv׵I(O-]W;2eseɑ '5ݔ2YJ][v"`Lf#;{p S3T>Se` &N.>iLتH|E5uV%;1oС<}lbfءk<#GdԒ~Q }w cD+,} =mX.o@Nse?~^-tۼne\ |IC<" ;k]g A@9dMrEJҶbCr(šNxv*׻OKC =Wfzk$;Ď'E`E)yfsh#%RAt{9QTVG2Ȣѫ0lL!<%cLp'pzgH"N-q'vP~4̩erMS y~O=8d4B^oUͧcV4.܃6-W[A@mqp)%OqDFT]4ym)l.=`'dL-e6WO_iybC"oNr$,m K9!p'6K$>Mo .낝tF&YRkY0Ӈz4A~s)bK}ȭA@uQ|QR_M!\(9)C g =̳ #DzKj ۖ}Jݡeή>a\n#'pԛM`X7݁ ֤v7:-iR(7Q*s,e5 N*oNȳBىܟRK7PܕRbk7 ﺇW䶊9QhOU$e擶:p}R=)v ̀L= |l['kA+-q9ydVJ&^  n $:5:嫿[d< a jbۜۀ͆EY}Ԋ=lާ[YSeC 4{\Ͷksf=Ŗ~~BKNp{BTZ^NBq9GM1yBHPn37rDr)kH˼S 8ElGDz!oQ20r"{팝nqjj̡w・>U^W#[-^#-7 K{-٪H֠ |g,B4k'p }\9G-p3e%I񍡵h/Spʼ)Ei$W&qo3Xs ܖvn'p_L6ItzD%$ೕ,7phy:,;?< k1^g0o y0#,tk2l;NȾTFR)|S3ETpvXJkK+D!=ḁ ?#]G K1uBG&YL>gQ3Z\'>-G@qۻ'p_؃u)"wԶO;dܕ]KEs+5ϛN[Ùoϳϐ&HYF}vBlߗPZ4=6򑚷A$/hMxr4~1cZ0n,~2Qh^v= < z  [cr|]&k-mm2Km>Ո+TMQ8cmneUE{϶+ ;F-'qFLemp_Az.!Ba*LxE\}u*T_Uđ:S#b|voՋB3(NHppYq,'Z%KZJkllT],tmuC$n[~W>Ef8"vMΫL_!.?su3$tdkqB>ޒ;]R)]xC¹NV˒b#po& I.'py]}V 4SsJvuQo9ը٭\9þkB.A9,ei /D3pyS?<\|TtQ !}oO#kѸR;_q Ͼ]#؎-krBe$*eHossjf} 7'^)}GzddSnur)IgLD.{R95́Cd˂t tbk~#zy_աFAH \\Ѕ%p?ѹr: EPZ= uqj: mJBOzK=wGfC/|JGbd܉E*д=R?eA02=^I;q\<XRkJm?.^> ruJ]b1ru*Oѽ#'7v]L9r+ڍ}nh62Sj|*FڽYt؇kW57_m#\OedtԠGYʬHWBj AFoOS7j ͙+^ٕW1] =Ϟ gguP~DIE7^ 9,S cZN{/ٮ֠2t33/-S3_50A/L~wt'^ nJEs6oþk-%zC;T%ƑGfrCO=CsZ Rێ1~L>2H/["zFrʶzy]3{Sb_36[u >t׿V ľ c{]E;).r!A-'T&UmAOв4w3/)yؠ)>99iBSBD:w݁ET(֛MYռ{9wb3 G?5ff#[}ۿ%zAFWoV"f;@{Lrc {eY(;^԰ LXз^IIbOڠ'>s #k~ҡޮ->Ԟ܁).M |KK|9r|$ӿ_rfIfa_)jmc?y=%9凊},k5) }ސQ5{]}/ɞz[vT`n1r3%K|/$"yo@>|c?%Oe?PQh} #* I@ES>tlI^LuH>#-q]Gf _M?>)V/ks=5p&CAc] P< =&760M7]i)DЊ.kOR菷K4z*tJ$7T56&eo42Cuϝ=~F^bF K~KWٶ.{z{ԑ'=>ڡ[yy ߡ$[߱[Jcr#HG#׽9Tɐ oR/|CbٱŮ?|}ڳ㹞2\&p }f$⥌þrT^}& 443vgiAϗ4O[|٪BwւajMjGyvA.l/vKь :1olBӬ_Aӑ1qk)VIv=p zퟑݫcހ>ܠRM=Osrv5հPL?wT"۝x3y5ybX7l{V@D@Ͼ5#V~s-QTbѷ pң׿}ny{C`y|Ц$܇֡z?w'R!G Uп/GOlp_|6.R p^xN q]fj{ ><ү|q׽; ױN+rʻbЕ-:%DGݠ#KkzOa01haЖgnqˍ^y(Bdvg> 5<(>s:-nPI_'|߁kaQ){ڼ#n$~!/KD"|81}%|kn5:E^ZhVCm޹?/rR?qN X Q;b1yv{9RIW,F'ϏKmg EG7 ͊h؞AcQ{2SK>;a _l Ž{Ñp]ǩШ5__~ΡC킾Iw.zGNz!utS ZYaMVrs{E~"Yb˖y4k'rguD8_2^b{|e#@N9HZx #$VnI`2i'r:p#ߩc7W g:,ݠ;CTrē),ȣ7~V;# i8F\BoS;'F2f{avAe#O#ZOk۟\thqPI+eS)@zsYrVb]%4SYIVn;=W ]DF^oFdB缚[Cםt2 k%o6 r-!D / DmD <rT- =Df@צxkV` 2px48( Mxoe| M˯K<}l!Wh#o H\C4t7Ȧ:uj}Oɔ35 `q;HX*t@psKB/ 69{ cfrA>;7̆y z vD2*JMݡol%?)Q %'~"u>f~\ld3^Fnnn4nkeX0#]NjUډH5"UDN,DsDЉ\M9otX~:[_+Dt/`( /듑C+ҼR;SՃ_7Z=?u%#5G&6 y:NvK&ˍv#7~dF :ẹdUx^X o'ǜflIH}lTU}ơ0RNpް]ĕUmEb ZԤ !`w9S P A_ChI9LEJGN扒C+=á4YSg% |R"a6:G{* Vfafō+7xz̊ΰsZ?a^qj\V5sD7r p}"vcRu蠁<|`n{UT [ZƳ }@J3#WvwEVԡro[g(l'1? 1_+*vuz;VрT ~bkQY$OKBME}O@Jm˴ ъݖ@Uli",~[TǼ ^~݁s'gWbk+5.χ R+X c8?MHttYejޖ,~tFȿU*ߌL2B'<;{l'Qr׮3LLw[(N*_bțgkLex@/o·P^j ["w{6 &u'zr f5m?6r߄^Mǣx/K%a4N5Fg6ub}R"rg%)>2]~2(̋f 4쳡4}jTГɳc5GDGGlUg[>kMS*F@ZA=/km{eM(dx Vje| (OAL=O\)m?ڮG^+#m}`ń_}``B Zguxh.iFph_:cJطBޗs h9;ogw)j{q/q`l&!zq2vt^Y%UErYq;Cy|'e /8:c${qdg 7 ]2%p|Ș*ЎS5Q\>)3쫘!wzbW\E{'Tvv.n$1=TWs:4ڲ~@`7"sǦ`k޶NX. }ڬ~K섭AIņ/<$okOLSd@K4z@STqSRцݠ^@OJRh].oӽjkK>"כ":}%͵AM~n}m95}@]98_,)Z9Y[@Oo1yZ6+%W@BL'T;~ŰNKk' ؁T*]3^C 2}nbȳj>:L%W;rb瘁DCnkV%Ztݭ/]9 ;GUy)XuMM\w 9 z 7bfJȺC?)HIȩ>2aSXV&ЊE}@%pއK^Ӷt|% ZZ{ViudTNINnf^f]~KؕN6oM' u ]+3S\=&+Y4]Rv[¤!q`O6UrE>>\j}MʀV N RĠ=ň2o12mCΰK,c@ف1ltNt]pLBMw5lMBL`_2s#}|+*təcq7l"BO`$-5tk;33.>v 9Emмc1 f1ӠW^F%Ao9Ծ+>::I?K o؊9 esإLKװC?awb!?!hS%^ zULb}VC t!)'5,%` |rݖ9DUh̭1nGo+"Qr7@u/{/N -Ω^WA M$Zj',} ԙށ㾐D[%7??yq\za.Q哰s&w{c7/;ܣaQǁիHovOy"5l׋gA˲_W1R7kڥF1*ul=bzĜBR|r<*z6v9{9'^4E \xĉۑ $oy2Qi;x˩B'ǥ-~y'NNBqDhwMnc@KP9BBݷ~K E h"WzfJ7lֺj9g#]w9Պ[tl7(mOL>c>bn ,av;UrӤ吴:e"s#oːX}\xMVhE.*mQ3# q$pŅn9ԂwXB^= ?}[.yOo ΉƉDlC{T%\a z2 3hS߸i\sD q Tk\ N<xI/GY{54}"hܖ.Kg[ϻ 8#=9s܆$KkJ7& 5k"J3~ Ȱ~ F9[iͲC)HGDn@|w[ˀc〮!4:-YV+R\7ΪLo| J^ yBzG)ٍx{֐#^3ƫ{!^L}'UXs7p "B%ADf?dG6lڀ>\mPR 9ǝc!W6,J bdmJHȯ r[,r~R%O&lR삭P,ݐb#(ge Hm=S# xI1.m5+y^I(F$cUh|sbn[FCSmz-_򡍮^P-/m a/dRdd:-,I䧟!'r[2 [t*(pA?暳 jͪ}sSz5t_%J=B[}Mj.خ!$oDq51lX7|=z5D_ ZI%%8o*SqSG~Z3S>݊7g):{!E~AS3Q*lۆGF)Mͫ-iotk5_l6xlh swr>Kַ1/1 EyK(96Mx>S|o)r3x+CSZ!_Ve6 mjMͪ=72ˇ /mmB)G[* 9q*>bNdhC߶ɫ9J84j_:Xс)r7=K$Yۅ d|XK9;8jq5*Ckiv'J i D4쎂R!Bz8Uh5^7xǍgq~5=Dx}tγg9nizp#2& ܥ4R)J$׶~IJzsSZevq}1 zC𥉉0pW;G8e{7&QqJ^ >TH+#i'ܧ7[gU~ "Sn =i[PR*%~ea m^)%*Ldn` \ \%h;r e h6')n}I.#ePgd ^ֱ̘4^)pE*Ǔ%땅;x&`p] R:Tz"#R%oȭBo[KȤn5yf~'$݄.A0Q}VHLl1+]$l]3.r_(;ry>,3g0sؿ{coeL>5D3Uyqdt_M *}"u膂G9raݧevr&DVْCjM_Ob|QSE0*^o3z6ojƭ?M3p=~$ʾg9k`` 7p[ !Л,Έ[eyvc 9هA;n!N+biL=sjSd 8Sˀ6q|V6p܍P y3A:@Nt/r /W_d!pe) Sܶ6 6hN‰79N-F5.mYLˌ)EThv%f"Cv%٢,+\T-3g38kv\JYY2ѹ&r#o!/:= /$uUkT`!qu[}Vf)bo$Xrp:Bf͸7|&KǮY4C^m(@b$v[<ߌ-1+\z#witd2lK{go)ɧحh[\\SlKXOuj=_ iܒo[l`{ Y7p[n\ԜmYbd缁o;)8[D5Y3!\l]Gu@+u "X|:E7W/p]N/4&Պ HxSJ0zkI*L=Vp{i r9}<_DJINF^mfG\y_ r[D;R>'ʬ͡&4jD^tBn4b? 蜉z:#Gkn]h$9C>b84;"!3 :j ;S{#mܒK'd-37C7w O/ړOiT"ϳ!?^5}>Å x^8WRSfoym8.N=|mȭBȅAB<bf[8w9?C|cӶ) u֜n]Oy)йB~B> lYpwN튭O"<=bmsO47mcN!Мa%ԷgPBE)RyCx>t|w.W<-!Osݼqv9 nVF-۔%Sȵ'̕ ^Τ|iJ@_G@P~$ˬ[s{cOs, |~Bzsk~+e'`CM>-%Hz"ߖA 59/b#"Ώ ;Xuhei:߽x,) =fjсAKހT'ԣ˪4o#'fhkD8 }IMpCNΖ0.?5lϷlnX'pitő'KLz8B ApoLIZʼnȡlgu Qϵ#Ԗ6E*sĵ[$Bsn%n7/Ԏ-i1/qL"Ol?ے|+u {EfG8?~L-f-\k?7ymq%0y#u:+vuh #XV} ڒ㸍k <ҥ-!5h잍k,3N,ހ",s^+ۺ*\jQm zkx1u2mu ,zj jpl%*Ns˼GrK 2_qp>pAݸIa2,ܪ#DLZM[@S(wfY">~=~, xz* fdx 2pEćOe[`DY֖Ć**i>&f+'HRk_:sز_6U(Cr\olw9'n.>N_~|'o--=%O=Wo7V ԇڼ.J/mM M(r<"9gOdCR~W@{l~\S051oKmV-:4SuSLy4hu+?OgŖ/ }1@V-)Z Q.iIl"7P Y\"gs8xQ7%.Xr/vc_J{HB^I89Se7_i Olo{=;ް gn(s7͑BXɒNIFe#D [a 17|YVS>[]G̖F 77Ź刅\_ܩiOE^R-U{Na 86) yS$..ODjG~ ɥl^9b^\:ҵ0 ;]Õ'rYF^c*{%(ax6EH-߈䈹ԖKngeVW SZΣ(oKr?r}#o_ÿ睸ȕ ;@+ϢyaE^; 9nKyugQ">,jk>t!F}-^<%Yvt='/x\]:![" o>s 8hk#Xag+2oƋxWYpsgwC QY5pB.iОpl>cy>N-ӡ7C )yTb.| .MoN&Xi&h@[ͰmQp GogW@ %|W6 -Pr[o'ȡ鷔 \)geVڠ/b뤯FuK M pFLר @ۅԇ&e3!rQncE_~Sj*U7䱀ݐJ›țAAp L''F^cPkDP -x3ۛ,/H|vbay <6n BEqqsj&m,ub/^b'FЃQN>'}ëb)I#(V,y" Sr߈d2ԩs%$s]*\3npА@,{YGAqUsd B/("g̳VcgoU>Z\xVJ-8JVCW%xC"'*7ny#w+ܠO1.:,+2r+iᘫkƾ(+Ķ)9#+:r7/ۯsŰM] dü;%~A$Uu4uSڔVwj H!6"m﬑oWYWe@~=gbY |~B B[pa3hBGpߏẲJ/š @/ FqSȖZ}}f ݸSdwi*g~'߅{qqK_l+{ se -ȻJ<=xyu^+ݞu>rb9 ݤ3'# ,Uʬ %oc%mۀ99xgǒ#|oA/QGu-o{Z#NG8zٶ]dU7FA/.\r+))S 8o6YƁՂ$h?`` -bS薢V;#oJ?[|Ly4ƙ{a7 b{#3/:ms!8զȉГpu|xǿU(٢qU?bCNO_BIWeɢeCh`4ܪ}ŜC0[\s`d|u n*_DM>}P)dtlRE(XGQň+wvaha{׭F.kmF@GՅpC^ KLU$^Uv#_O:^Blo}t5<ָ|=5Zfq G:7(TmMǟY4ioZ 9j-8-R% R^Kt=5jqG@[ni2d@E}o_{гVCa͡d/TִCS/5Rq]S>lG|+зdkfN]H 5sXc@$NX_YtO[Nsiȧu` q )-1֢k%7' H!ʐ-g+Qhwd{%#ruZy99rl7p*PO b1B Tz}#7'!7VZ2R]xoEڦaxn> ]܊kP ͇|D4ڡV3IC,!3ǟƫ p _y#OLr"G$/1 >?g>dVo~,] EQNw!>ktN~fg2TkRhIchB祂ԁ_NQvD=6f/p?fd5vnY@gj!L ]P'}Ĕ 6'D'r_ x9m%{`V^+'M BlNW:6Kw[.OZvÞfLz lv&{Y@ 9xNR/3c*cD ,@KiLgKbR`eubmuxi+W~Cˠ\е fńw{ .'v CYpv扽-O"Bfg]V)97}eDUz&W!jڢPشhTk$*|wKeqAIK;wvwYq}TJ葵{36Z|PuIK~$_}0(}kf̘F6lvoE>MwH YdtG|E.߂7\h2rO lݼWA/9Fi'Y(ZPۉܶ7,T=ܨQ>9RB{ۥ. \ !1_gzi⾍u7rZsNuDpUiٱ`mQ䢗sރlB.E P?=<u5zDNv[F-zXMI7}e{+1ФEv.L,ytoqK'tq\E^>Von~fF17-#] }9Tv}EJЯz3[i04V(^8.s@2_W:̐]ډ]c 7Kbϔ5˯g$3\>9VC7yFʨISrs$v]U/ hd?WW2wd }5ϰg K+ܤ+mMG( X==_:z5=b zAnu{Ʈ JؓHd'twlu {B%]JUKT[,%pv:_dA~fJ͸@Vۑ*X~t`D ht*͊@')r@@|\=z{ `#'K?_J&nH#gh'l.@5+gNƎ.pKͣ"rbX{B.^xDvR+f[w^iB/]GGk̆#74m@] {e@HиW%#`%ȇ#]ɤ8A1}̬)VyYҍ}6ƀNNZ;B,/!+ϔ6 pT `,Ϸ /%pɨk:'ȃ0i'r[%?|' {[3]f#^ O#Dm[_y ]9|ݹɬ~ Du@'LcE>׵ yх=7hz: z=@=E~b y.hOTmt}10^Gב+ky_ Z+[ E3 |ѹK"F 9|ҟLɰT3jwGw`E?R>w:XLUZ"w\y̏REkQtt\P& ;stE3˝ jnIyr%=ͅ \75h}`1:c_K?3=eɀIt5c|_t]~Y\9* q0_iOJ$E7+z C,A#AjOaEIwC,/宵)FmЗGת}tYF>B8Sf u',Ϭ^Ϡ#mK,Ҡg#*Չ3F[xZV$W\;;Csuܘu%#=R i痔UנY[noArM7hiRzHKdKŶc#I拒ؚKt@PӤy*0cI|%oӈ@NL;+wu3m]~ `dr .Ё<]u1htDiWmr`5M%:C 9sf)N-')v`>}J$<`ONNm<2Z3f1oSxEJa1ݡĮƮ@&|ԙ`8n|`[S.~? ӆ_?hf-kΌL'vElEΪq*l@MV{c@?5nM*l"US>+gRܨy7,Keuﲜa_%>.ߧ+ߵd5A4-[1/)oy[݆|U6yHy  ^#IoB~(Iy}fϾ/g@Qu_ 4;'Omڿ^"@}UNUָ5Xn&p29{K2[Fj<8=/] 牤uUO2B?6ⲦPv=,Odž,saG%GMCj~U?ׂL'$W+2ֿ/Z-4m?T݄ :;sdmBNri1lmV_F| yZ`CިxnȮ[}lv2Ȕb[%^C_՜>o4>i}XU9NKFv{ 9fdsvُd *rJ>P45JXSCq<@hdWI?^yp}\Z/c'vz5CJ@PiMEnA 8%qXХCWU:$^/|*6'- f% ݹr_.#츄POoufCFG}<q]VuɤӺcv"@o t DdMɹ0uBؕ I{>ĺd`N(h% S~݂a>o yӿ).\Z9bg?3㤂 XJ/_[m)4,O-\X?O3JГUwT֪cM?Үy׮;W.&xoȟ'F^c8I}r/:19@ιKxbdbYqdmOz 5[IrYS?y)fz])Eӝd?ZzE~${϶58ފ}Kp\"Ȱ?T|<~Bí_'#kSXǸEwliK'4MU/ܜ=|bP`𛿊]%ji~m3ԕ =H]QF6B~GqǽŸ_Ijo}S'v`)r7kQ45m1%3-Ѣom z;>wZ2__3k~` ĺX~@k=︯]PZ{Ƚo#_趚j+K^~U]Fj?z- 3UICxdÅpxbzYB#bNP_%> d-v ֧KC+]S'.˦|{VQ)5Y]q8rxBW?x79frdSb^GO F?m:[.tXm9 {A8B(f[3z"[( qĕ貤ʥ@ި]B]XjAQ3`st9 l>"ߠ C՚N1alC01y2Ђh+]2EG hhyHЋ:Ľ~^As9IR"Aq\37أCbS޶Ao5ҍghya%;fݑㆾFF~/KS˭9$L`isZNr[:ENoL`9{BOм9Q*F3_֖z+MnC/5"G$t&M3C-ȵ-TNC1n&3ƪr on7!\%x銛dϟf ^ ㆞oPI&/*CRtug%EVUѽ}]I^m yF|7FAg])[66zBwJ]D]D&ȷ̲HOP{!DkԌc dp;,Z#!k]ߢπ PMJz ' Yu5"]zLB2Od.{C17䀾dկdTzbW4T]]Y^cIچ 7v}u*ԑ 5dJMґsekpgB,r*_f'x@v uW.Gn O47=ȩ[NW;u1ʦ}ןA;p)}5h+z"uP}r#ώ7GJt>$]v0}6zȍp)1JspӼ/ "+jIDT`ݮ)AxsDܲ5qžnQ.q#.-l! VhϵD*t~*Rt$KF~@S|u|/EؑD*躡痨C[$dtQ;rPYz_+JL_?tYgh 燴BEΠPtBVhNWAJ#6lYG-Ougo nt.ajd}?ʬt?E퀮k =sQ>W9=-ϠXϩA7AnB-2(-z\^NTͩUz7H#5ӭtY[ۉ;Wse@okhjz*&qDWF\i= A{nC[xaϊ|qm-1뵭e, lZ89h/_ނ8(NIF?RAz/ɉr 4 hn_|4ϴTwt&3]@n/Z;N:hDJ*ӚhFg ЇQ't[fA_F`et E5%dH]C|fIɋ̠.z#Wd@uGOhG.,r%FU u+'Y@/z;ןՋ@DN3[ ^.%Zt1A_n]|~7zEGeK Ȁ2|ΗԦoП |#O^t*ume[y!P҈'Ͱ'Dqy?ko”(ӋbX\5uf:E.jo'ڑEJ{\GHsU\,=\ȝPb{z ۮMvJ]NY~)J* ㆾ}j3K:/iݨ| pbO7/p :e> -Fe#^m}3\8:ZE: &/L{(+V]ƁM_ȷ 69r|A%CM4NDRt=eD[V<˯1AGهZ2b"jƼֻ8NG湶uVܡF\Ƚbȉ~˺pcNn%+嘔ykuAS y~/ן4y1A'=V/|1t.gci4s/Q։6@3I̽e¸.0_k(ˏ;u93+ț.-ЊC@^K+Z{]X7 X.]cП˃|DC+SxE"1{!nz F|-EY]qr>浴t}mt$]]#<'m xg г bEz @hz_ᾋË]ULvډ^ h+Ѱ2cN/"Q0J| eONHitFҀ}q_=o=?@ y[g s|q#߈7toQ4viT}; 4Q(F'chg믎q!Lk|"'U}6Kc4yQcA%B^J3p}cWOUCtП1Oo ̫,7tJӮx®\udng/ ;cDjc 2^(05vM).v3[uJmhǧ=EE `ǯinh u(R]mXjCV4 -6JJlh, 2Mc4:s@~-G1OYy׍OT~zAȽ4,R]$Ic#LtjRV-utBzB2ۺM-S;IuҁR[#ZF2;R}_8{Qq-noGuŮF^C-g`SbNi:R'T~uMfP<KUdȚuÖ*r;r(}#wI\aUǓ 4Kr 쪣 *qk1v"RϛWȥO3>12rTc'ЭD ]ۋ ?[s:F^APgh)l!;*NAFn{FN瀑ru#e%w-p@+b9cPufg$ 5A?//W=\@. XI4g3]88R+-3,Rкy Y 'kzbo?JLfwb%#^D9gàOxqt/s4wtt~'Zâݗ ̈́NA.0 )qЯwk4F/B}o 1{L&Y[T* /v)atK]wƆ.9']m+r3GsX.6 ,KZ􅼇 u ȉet%*}nh~nI2*(ho_QB_Qe%Mspq#+jzMt']:{S9x:ŕޡdt[4Me.sϏ)ADnatqy^p]::?P/޹DM71Qz2ܤ`[xJ;xD^YCC*W t%U^Ƞt yzL }}qwBs]r7zc=%gtwv%cT[WWEx,t͍э|*C/^Cs:<]荼,_:5=G.B/[ϘD6IS8_(4'ü\/,vkt@@E?K`EnHU@>u (_Q'l5n쏘/q_vטL=w9^5f9E+ЖiT~.-E׍|ֹA릂vU9Ne3Y]tt>}eD {]wA(EA""?/5.izF+r@na0kas:A^b@T!] &uiie2b/m!2]'F LfiyPWZ$t7t"hbW8riFкz(ݯYm5te!' IY3HR]c\Zz zȕK0mQH`G~ g ==[xEs݊bpËZ)tu>/)`GvBo˥^\ zT$x92n*c7:z[LcP?E_;)עʛ2ZBZ`D57F7v~DyetC+H>G֤i h^#Q-H♹V;[X̨݂}o& q`1\{X Z_ j#~cjwI|'E`ww*jnU$%5=Ķ /*Ib^YEY?kf-)mI튌JN;G8R?cWSO\ 8噾)/a[FѲw2C4q+ɲa'NMJ^T^$BEK@;=|jZ:6h=GɐcN+\d\>ON~ࢿ͜O62*B_5| p7jQjWgM >4r}YB't/HT)`æ|Bf1A{-STvr}0"S'GbhpwZcx*ȷd"Uc0}OJ M@,MX 7f'veyI^f(q6WZ8 VXeI1AKZzxS׼~,ؔ[I~jVLc?:ƨ**-H-AS,oA[Ԝpϴ{RV[C}Ϟ t* >%{f9܀Ce˭:R ܒ}̚qh,_y5y.v[3zq<e6oy_kj9;'oqޠ]j]*Az/ٝž=#\sO)t=wkHAKKU̓sn%3v\13'-%DPW{A7XAە/tBrFƆ%3^rȅ\vgޛ[uI -E퍑|KSm=̇%R{5$܄ z(YyW.rb:Ͳ"vąNrB9C|(3[?K:|M5xD9Xm Vǚg>̛`kK@p_ <K80_.%].'Fi.֡guSnBw(->AҤe9FW iȷ=8Azyy.ܝ]7vV:U;6>nq'wuQ=LcGtnĞ*2)i_̒B{Xv!^AZt2Iߟh錽aBΡKb;l|0Zl,.;\6#2pYwhM)z$_0#g\uh PY 8BU껜K=lz4W:KYzX@׋na%EdgcA^/E^GrK򙏖-]Wa@y37Dނe,3\7\՛ .#Hir a+r. R%psZ:b[TY{ˬH!'Sp^dIyCqmڹ4nבyɻZA^ȷy1AFNv ]bE C'cX>f,-*t]#\=?)ud!L_Ӫpf{3r]m3'^tv^! -1`.Щy賰;`nCzv>&௴f;>bH}]5kk%nt|hQ䖝DVk/J04奍,Qдz*zͿ-i0^;2I>Yٍ]̽ii21Fo/Ō\P˥iT7z{S;3?\]y14ؗ{Los45$Ug4sσT*2pb5/ M 9t [$^n:NVu)H%-F:% #{^>_~`q.6 FCJjIՠ?%HɣT =5(Bi~USꁜl~&1-/b;OM#zJi=]HhHEvba9@ezqUٍ\ 'v^$OEsݺZ3ykh~v|G]|~=/f5祧핽FV"?7x Hj;Q7a{ Z:;Rh=upw/M %yTu-,k m<\@T/.N/ C6e t".9V$)'s^5ߡl`*>JIÞMžWB J.P\2y[cc{eap>^Wd|*5& [.7߃#0a _}_r$m@k=MC.[>=mJ"'£f_Zv']9_ћT^]e?m ,U LEk|J)l]%p3k{q`OYr;13i\v.A'皴 _]ctO⠦ k8_:uw.cjw:nēeӒR3*_]ư/W3u56AޛЉ֒{o> ꯯+Ӭ VduTlI#׷=Hcl"hMñ+ZW NK?B17f3K>wɾi -7LBW9i湗ӻd{7r(tK>XyID߃ϏULӳ~+rGNЙu`GFI 6\e/Ojb|yGBomCDlM#԰&"ʬCTڦR6s07I sAv8'lG̏ز*|_IƲ.to4hR=_O( 9yģGpjo[/7n&ugOcjL-v M#ݚf~u"`k&bؖ:QA$C /۹(>*#/lUoe 6ȫ)װk |ܐF)| /^%4ia+JVQ& #@_,fq_7%{{_='R )lif[7)DMI=-45kM>/x7 $n6,=F ?N^ZҌ7;nȹd택0cc[O+r`o'\#ܨ3;2cnA3식$L3^6oM5brېe tNp!sA Ǝ?]si[|>Ӛ,0]љj׀/yttzNQB~q=\7t^؋ożol 䓷=- a8x\- _/e\诓{u)_.'{`il d Y}%7M) C>y_y`jhMkЗOíCk/;G^3WpQ,~&JoW 7L{r;q(JM 5yaEd%>iY_k{SK] |㼱׫F[EN /Jse'=l 945(V]kՕK\8 ! hqæ3o :G-++yW2rfЗ̆5$ orEc2yf_C𓃊 ~}Sk~/nuSA֓ln:9# >-zZ;Uk/-e027~g¹-{سle ?#o7U5E'vEը]v᧙ Z*zmgO#F ɂ^9=wJ0nIxc, e`4ڱ&%w >B:.Ɯ /yDћbg5 ]/XyE8y _ /\)0}yH7ȣbӭhQbLxc7r(rr#䍝^PmԵ 䈙!`Kf֢-|Mrdo=nYtJF{d+Whv|st\ ;q\6o] yH?Ӏ/&CǨ??/Kl*Dkϵ܃dXĩrdD wp#`3G $9zw?oO`mQDZh|S2OQ 85e5!?ʧ8f(v?%{_z84BGZ-n勝46c:hOc|,h\Kk&}̀B6?7ƞ뇖"_𴸇B3 ~EgR.\VըAAʐ::3`/h >O $Fk8uw{!:>r{d[®c{L/"lRhD$$ߓO8"즰~>zLG zpd _MzC}ZYn"Tݿ8rfB5V/wk7t2 ]-/cpLYyQ Nh7Zb(n"C =K ad79h߂ȽahN.o|pQ tT)>vUbou@\`_Uadhgnje"9-M:&tLD'5P<:9Ujw i|*S U&9Z$zyeTb"-*-=^ 2r[D篐w=.Ɓ|湡ZEn@Qh3vMGx&7"sQ_:=u+A{{q"xE2QދQEF4A,3nT9kY엕uAx]Lb~Hdj&3^,o'>c8m rW J48Rs9oh'd;bEZ9/9Tμ,uv[vCزLrg^зq@ѹjA;y,Sm^wƮ H }1g`ߦOؼCAEޙ.mePGWK 䴋JJ?yIhB7Ez;רI]k,P^RyZ=i;%@nlkӵB]uy)Zj)t^MilJ)ma;ݔ5NB_k^r 3錗hp3UMLghXlɱ4?sƔ) @ut4rqviϕNW"`˸O 3 Ԗ~2hUS"v,-W#pODS_Оk2 ; 9g\+T^{\]|J( XYʃ,uf_F>=޵ۣMe^ü1B]i}z5G@'.!J]JRAp+5CdA}y{_bLyB8ō^ [ra^f[0Lw_nb^r?]ߢAn%&;kޗq J@.1pl=[4;ڗF8ttzJP% { 42#*r>)'h]Ny ; GСS]9DqUCdo9 $:G3sWaطkNxeN6b p ϹkH2r] ߍ plW?K\Z9ovW8#˝C>YQ=w2}_sK.=*C rK^GNecˎD'y?nb@ish &,t~$;nn- hj''Az =}? MvLJNA[ 4b;mДUxdoɁ]Bxrf2e/5hl{ߪ,#'l2|>1D2EC}|R_Ev^c&|#l)9 ԰a[`ա=V⮹y5ܱ'bwZ ߛ|≱IcJ7hg*/xI/e}CY%+)!?V:uU`\i #:Yn"$3}k3 |]˰{&5op !?O'xG7vH> ߐ)-YuEQ$h$5^v$T( / CR{B̄ݱ{?Aca^߳%_6oR?=I W{b؝.`^|#*I6xﴠE2)fGUk̗ nѦݦ!gZMAa$f`jtGW7}nzOE>JA+P_@'#7vپ9 j4pF|򁊧k6ղ#h)9xv ͝sb -%ҥ}KhffYdq!3ݭe{8I)-]uG$3"=&@oorl9lF>k(AgMz_yeRzlޣ<6iU3m]F{h5Qh%ȷ>~c+L2e!=-mgJs_V gsvR&I}7:CH>9աƾx_^s WD,w7u쁱%v_Aؓ5zE.]gx\C~bP{coqL}J~3jj@% xvC- ]qo5oJl^+s׫JBN~]GЭ.\)bMk`ߔ֥6}?4'i'zVR=OuގmDe~ yٍ+c@lxmm} .VN{m! ~LPjC}co!}!}D[+Jy//yڣ7jfꘝwRKvY!lV3s}-?j^Twycoa.Nʆ~4)o{c3$~ntfC[RiB}{g(m(jn>ߓψ7.j odWAn=I^zcP4rN*?^׮Y**`Oо+hMQ ֠{RGYqk&-4{._)[;Si s@r: {ﱷݯ [^,>SegWeD-,s^=]_5 [GQݩ@DCWRY_i*l+2d=^+Йz&3O ˁسgg3 SU0uwbBR}^05vGq`Ղ)zWA,t/XNU4Nwh46 tߚ?Щ CaD =V΀iQމ9d{RBozB#ͯhyU/45lcE`Hn/;Ա}kG_HrpۍK-\[isȭƙ[0]Z1^A*trj拥.ag]j|{.Ze }`:5TrKA>5hՓKz_/vKv[eJ[W9k6"6]@<>N-ZԆʺmZfJxl3>-Ҿ+%-0q"5de]WC=cS5^mѥ`ycA/'`Z̽A7B}bQ1nk AKhIJ虝SzʌH5WJ-֑_$*8 BtDK]֠IR6g΂ [L+ٻ\}56t[{y#z))c|)E{v,cOz„r1rv ޒ*@2?:yR+v]/ B*ع lm9^#*4+Wݝ k;5lGBEI[9q%x;z5l*J܍i:lǖrN8^RAksF\btf^-!ty[z^݌fFq,RM˞՘Uji70EjJo}MEGviz tv!G}"O=bw--HaO5qph9~[.8 VEM!$Kᅼ7v@tUtyߵ bE xJ>\> mz0P'-&taj-EjzXSiӛB2‘N׆qЭ].[36hot@[b7i#ZkԨk^jR.ȗ^BZ]ƾ]ĠJA{"йKτX`lV!kc.MUrc_;9Z 5EZT;E<@n@xFK UgDu|g-z %t:P>gުҰIkQC|.35zRh'UXS].׋@+]:J>H (%_#Zh{F)3X9 ȼ?Co+˪ޕ2RBOǎ:QlV/wzBK ՠ 2 M;4yڮo_rgZܵey ˷k& q 'Giu#&!F,@O:2?^Ck\\ 9^$QCh\R=#RH y ^>ȓ* m(57[2n5跷,GAb0v 6>bH*4}(z`)4vFK]:^(%p|mAn뢖*./L+*rolmtE~ϛQfKw}ѱ]+Z]Si=|ĥlޅpx+mlwJWh;sTt.C:k92t:"hl lSD:3E`Ð.g.?3h_{iMe ?D:ǡOt`]OJi%]طˋ`+Ug]WzfpD뀤YӸ!Skhgkl2t뚞6z{Rꁼ-o{ oy9+У:3/NZN[ nEȋA߿F[FB7^X.Hwy-qvH;;jD>|@0M -mѢ+WÖ&VEb9O}OuCiZ߉6- Ѳ @߾ͻ1NNR^HF41eBiWЗ-|} R|ȑ~k oVunrS( }k(LgbiLϞt  Gi쎐abЁ^8oey@gRItBoh gKZx_+EҢp Ct |9.pj->b\.׫whaQA2:1S4 hFyyaЉ\45A lמ>íUס?зt DY|{ 8^4<iAzf O 65jгz99H0>F3 zfd9}kHZd8ei5<]hAv w1hJ&uU9e\jًNx\f FRO:4ޒc":4y~mW_iGVJ{l<'}6B_Tm3uALٷfMz)^5|YשeW辴 ,(ډ=m=4@dv] ;-^3\bw}?sd0AԉRNCo.zo r"nT 3z}u%^<7WHw45~Crl#=5cFN٫)4 {CS @|ϡ/E#p1/vQԦz*=KrL 9*@nW ZF$ b\}/?yUE~I ɼjlID;]@bkĠ\'Ff:.tA>)@4K?9:z sH tGAfKi3b:ҁ og~\ح&JE;>9{]V[X켬j r2>nA%ehҼ}rN E{b&"e(ۤmu8B^jyo=@ot䲮w9ECbo/Þiv=Ƞv@55#'_%1m]ݚiy{2̩A{J/r Le/ -MD^cnGh|dӀyR ^6H5[n3-!V9v!ڑj84D7uUv=`ϜNź@z:EeBzja{ dGi݋2ƊI{yb<$հ)ŲP۶񾷽zRB6ٰSnh 3Zec]x0Kcr%?%ֽdNo~͛i\M~~"'}[ŇָKF"=]FNe#-7 =%~{yC$N-Vay#ߍݗgwǖN^˻*THo3/i Foq3ȱ`9i̍jkGס!A69KXJk`6y ci?{hb=Yft[Bu@/C7:r؋ȷ[p5@_ 2}%NUh ͗.NЎ$s(W9k$M&OJt[lϛ2t # B{vb hQ⌗7\. ] o[̳A\yJJ 5Bcq;{ r9rz,Xc0nF؁s.^jX\@r9nk~4yNm ̀>O}ےptۣtɬ!?#ӗ {Mr nͨ9ЋoTaw9E_s4grxy_ dtzzxU7۠tByR׹B˾9QZ^bs0% }T|k*KKV}0I }(CԀ#3d$Gn lh ҥڐ[0Tm@xQ%SϥA`>+u@UY#N; 6]dA^cRs<r[ur q`a@So>C"7Qzb{6 ~yHg& -S1jC1Tclv"' z͢6w^9^͕vfm.Дߨ %؛\c:w鞣OF,@)B󼉇->Q (t^K @;gʥG=uz-? m-*}]TZpG?5Ľ>){{ U`H$ߊ΋>^n~< m\ d|NE[\$:uŵjFv X"דB6O{J;oZ7o@Ob41et M7$f% r[d|X܋GysJ-'v(l>0rrw_[BMA[ ޾|xPB.餲:Iy=ȓk|.R\n#-t %r"&SEƖ*q/R"qN0owށ~GהA^l*`6/gRa& :ek -*Kw 8d Ƶ8tДmDѼ@E{#hPi;sk`kŦC2+Cnx>E t E~E侩e@ |MF+gk%KmW#˙n 4pwŻg?O񋼆 t*M~=R5uh},y] !>@k_<F]MPžG۫'6eBф9N=ݙ. }Ċ<zU q &X^ wZZ8޻Ys\[:j Ss兜:@W R?}srLw܀!nv@wū;߭ Kw0il/D] J\qBGsıPgCw;^J5%uޑY4硏5 5"-F]rREuNǺb3hкkbv)_4]֫H=sGJ.>ȗ҈ 6:"R~kxoqtFr)>}ޗawv9_5ݹ9 =t/uL u(kjmsk/qdA{xi6H~.0p*}rG򝉼Uiٮd7Uw`e[A3\yi }mlcH1M'=uZ֯Gb3u^R^v1x5f_h9˺mp|ђ=Q rY0%8/[y*QJ74h֑Fyvug7ANtt5uއעue*sM[ h$XO=L$G6wTְ"yy[d.Tr񁮱v1.,wKm"#\SԴ<-]hHj'GC!rhtWO%6ϸBK^& ?ȷkWY.7行t ڂ"$ry\vC1إO]좫`GB14'w ]:*kTț6O5Gq&_͐h{]a[I[/YRSl[ v mwr-c3b7rf)jO7Hġ5&v1 0|"P2UҼ{^}֪2/Ύ?T'ȷ0Mkv hI3\nfօ.z?S/,4ڈhLG)tBo5>Q'C7}R,FdΈW-[Cjt&d[ 5;/rBABjH5zz;ήC.6hyư}8UՕ ͐R~o.d]*zB.bhMZ H}Ku@bІ#z|j$ eOa7YYpTˈ"C.u n|H@cfn<}.o/QUhFQN0-NYOFBd7h͗Q}tIupNbOΘZoBt" lq Cc_/R@utA_9zyx矰u.xgn߮4F醜-ro hȉ\c~|1K޸9{pIK?ٮ;$~ܡR@?Itc|K&. []7?,6r|~u1zCWLOĐqf=3k%+4'm^$qY̺sd4ͪ{FrizJBT;^$MjU2{yiz|3Ɂ<eNƍ$10љ @}g822e2>ϑY~I=D@$*~UPh|q5j 廹3"q3^"dB]h1_0 9E3R5F.>u1A$>y.3hUW,mVvp*[>ug!#rO_r= gآ5I^IDeoh5r؛-nڃ}AJm[T[*ٲT7 jT ǒ #aokndlm1" ڐS*-" n 9%M]qq*Scf^z/t&٭&A?ȷE93,m̺spt.郼ha{Q7gӡk 9Tݽ>b:ܰ&ąLl\ zd>K{dNdЊ)CUos"&nSF-v9יܧ^'([ۮuZ)fGfj*4E[uzF-3 z)P9s<\4.X!E>"_&ȥm<ϼt䢎D"sq?\M$\ݷ{:prbiۀ~; 6n<?A뼍<D z`׵=Z:(5$z;tQDgt"#s#,}_qM!Z #GU zthzKgElDWȟEFֽb:6`U69qՋ%kϡshUv-:i =r5Fu7^cBfT䧈fir{;Sn ƙpau@O&Z1 :K6AG͹A URAmPӒn1o尷)/G͠Tch'B[쑮soA%;7\jЊ'tZN}Qz%ZXk]Y7cm׋oHCu˅г^i3 ^ odq@'YXݛ\tpieғY;A.}^C]g~k5rD3K4ȶ3a{|$)?kJеE2|"iW ZTcEGykqk&BqtMŴ˻gNExᖪ3ö4KjV+ȼu\/Oi1h4iq\Su?U`u49};]1͐S{W9#.3r`ߖ Š]vFޒ3Kl]o2^(LFn7zQ1ϓGV:4 .ʙpK=Xo}-nVh!}4o }]ˁ2^D5Bdmm4pæn.Q>QdBW]IM' yc[tTؖĻ{.LZAz5 C$,׷V&ǽ੔ǚՓo @TLљCco~^jEC7@ϋ1H]s- )1k`;8?b>U.:5)%WMmxwoS?̙!)?|C&ےV*pURy<7] Ck ]={%,N}z1)qm[{olO% 菘e:Jˆ>&<זwѓNɷḿhX'`k*9`#8aǕmقt+}NI֫V%I3;t6Y|{kJ`3j/;ڻ| p7v]\R$9f^yR{cKv:ےb都 d17vmfr Yl{w_Є ;d5:Wvr {N+?6 SH6{]EnԐ/xǍv)ЌϙPFnn!IQu0'VZ:tmvӗZm7{L8]Y>Apg6|hvCYzCN)+fwræ-fӱM>)!̕[5 Eꔕ% mmI7z9rufZ9YĔLfaE/ %rȭ}y; T[SvvmdX~?1S lQBE W- o=C 0VDk@l1_&2pDm߰ul0(BZ+(< N]>v@ a`F6+Xਹe/s/{WPo ^%1Nvc$ q@sHO /%#'6D׼ #Sx ~S:)5F.?Z{髫=?'7+tn]/|uKl`%4 Ā85o$QyEE[KPT>J'q’8~3!cy~j.z.ѡ#U3vbЂV } l l ?R@~`ǟsGI-~#>Y jHO+|wgrc1^%_VOs:/Lwߣ9zn4*O2.oFr`9r M,r:C_˦z WSBnuIv.Mr5?<|ΕYJSl_i;8Y5F/7ha3X;iȺm.@.}Q9fok\!Œsvkˆ>h=/4-`+T wtԚwn ;?%X#t' G`%hbhFWvY֞=.e9#co͉c{T>?VABUh ΞZ@ 4sFhƱ;[FN;o֚>SXkWC/BȺ2;$J*z@uB tpvwk>hĪ>b@]z/e~Vor*г2jWukI eS4SGDDH+thvF=:u!B$u31W:>VeWС|AB/3gW5ͱYWfu}gAkM3t]WD.̼*h/b0z侱zV?RΆail@A(!0zwv 1Zlxm,{S3](rڠgQ~ץ\4]ruhzUq"pDK$&3͞qz2@ML-I6]T{%;5Уn-ں\Txk4ґ~y˻U\{J[ Ţ5 }= -2F.9fK.L|@וsu,Ie7]TU/A^`ui3ТF.F^Z~sɨ7c܅G?[~z\."!'6N#^^tYxM.[.6'6`DI ]s^TggHt2z#1RY#<J^[]kb 4k]ޝ.WzS^E!@r))V' /5R}WZ.Vx#0Z[#kR_yɧBwӗ>!2bDw7$`ȉ{vd/% \4tyĮ7pnLOwXdUI=;NE^x˚P%]]=^D|Bh'+9{~{D[ f.uU2pI&yKםO+-ȭsn^sH7B\]Y[e#߃c+ϔwwm$>t;1 ݗ0S\Qo5#{]N=ry4j=~FГ/*7=7hi >Yצx9 fubqYW>M_(/-ȳ[FޯwF*.[1NϯOkάf)!׭-7ved&NjxE/TyLb!\M: 1k@`f_;4C_E3Z__%Ni)r}JĠn ꫚OnzCNgEtTȠSay;31ffun ;~]ְ}]e"@E7c}.}O<=rhi%}>G{=Ŕ>-3wha{^!艫fVkjO\/1l27w m^O ѧgP/_ki|\yzEm4iKB$5Yɖy|skCǰ(v!HOg~5&3k%'elm/'j˧_=+ƾ z{pjКTw'%#D&_gD|[qk{!ɐsI*I }V"OTinwvPI;u \6?YNjK3~_ȄUX4}pP[YJ' p#f+̐ /cW!drIQCl狧jɉZ,ܰg!#UdH(p?gv5R>fz-J\0wiԑ)upm;?SJz)gVoyk^*o#T]CS(K`̈ Es`FW*ojNE-?|Nz7u 蓞6/N ]@ʱ7yp$57Zfdd2QZ_y6g򍽮MyM{5c!A+_yѢGYZAr]t.߰#}s(DIf5odBQD~폺NЍ&#{[SbVM@._/le*c 'e#se幑7<n#ɤ-_iUߑFFD| 8A}O?BQ2io貖B@ ؀lk-Vmɤ~sxY7p'&8 \}f|ҥ -vt4(ٳ{cok Y͵vOBv5 U+B Kx} OV쏕. SE,펦os@K녽^=F~)dD#ic}U:C1+׬G^z |x>JnƆKLA/ԻD\YtANW7+bߙd8\waV^ډSk}8/;X ~}EVL vpͅ7 Dr V8[m>M%'eS 7fi3tLW7tΔЭW=3䷉_:֐DL@nҡvL.1 e'D!?ё7XZ--,?sxV[ :!ɠEx.sLUY@{kmE6;{iwyNx~v@_j#r`&d9z|]^zD싖JdZ-Vj:;Щ\֡}]n7Lu>%jfWY>9dݩ{Wr!`k!g]By>)#{.wh7*j۬;"!cg*Il%L= ؇v Ϸ;٭|?:^VWdrKN 73D͝}u `wmw})t{mέ@kG }IԢ4Vp o~coWgǕ_6V섌{{%s5q$6^ ѫ>b?3i#n*/v^3!yp<&Wf9D,-!Olq)<^{'93*T>= ֯G;}F?\|ܗF}[X0!fjC^cMW BvbVKks- k%(. Cۣ!O|ñ dػgB_ h:|[}J@b-տ/3!}xj7C7vV_Bзx| ˌ5yjk0U3{dږYwəi3@˷H 7 j~ OѭQ]\^ QGs9*wDA^㐻4y3m> ul4Yךbk{?jH]'v C4yh{O\ȏӠnkzڝk^g2V%fgjYnw se5Om~.(v[.jrU_{7h[ƿv_nn6bF:k;ŵ󂑛o>t:xd.+ڝ޶Ʈ{diz:oeh{{j +]]b/3[$ C\@ܿd]@MJ>3glg\}٤HSf o{Ogt=iwd%kjD/fomv M2Ai5 j}OEk#4ozokӳ[HHmB^m_[l*ё 2v R'OI(dX)6sVA^{drQY`qru2GW#v;#:07.]G߿:Z!cuf])t*u}Ȓs򍽆TLkfRJj`PCSsGb-UрV o%z|T+˶A-?tx\{ǿ[d|I!]dNqoLc i7Iu*BC6=>{SόGc9 Vo-8 0{bF.q,ډТ$F%S{+вt3\ !Q\\DΩɋMjyqBHqk@z@H+с|B؂: Dm~^6d U_-x=.1QY1hd]/ WLK >.kwd4'Bӕ(M:BZE%#ZF1Zo[qTlqdҗ(C-y Nߺv E Gܑ:RrS 37D-R^bйrhCRpʮF0e4eAN-v xQ~XnזQY s~ %Wpտ;F]LEiyAU !Q}̺έ"WD9ys$DIّ^aƦ'l>yM옱OjԅfJ ꕡSY}\Icy%uiJD] e"kd7\JN4Y9RtQ ~@Pmhiѡ:_r+_HHI" pTEzK)i; V 7tޑs;[*P{K$;)2|_KҠ݅4:Q]j5jgmm!/10^!a@ߗ^=*D9|AGcǐPk`ܱROs lT}W\ aiˠ d[]>ȳ0KS#&KscܠύI=glqtG*ɀ%=͸w8VCf/c{^&'rΏC%&%rFo8B޼虽x^Nr Fֵm X xWZ[GOQ.kܸJ[DdugΞVul't_i54d}Q7֊R#WEޮW!hq :t)~b/KMT賑 8mzH`jX$2_0xើrs\ NȮcW]f NrP˺8`6rt%2Z MQ94ҖCF13-Im xP>֏ѫѡ&5r۳'hw|ͫrhD9pk 0{,ᅤ؉=a ܐNCبᔏ.]Zb#FmF~Z<0B>wB*.Sf])Kj4Rrd:턾cCmyB3hr[c#96FGERYOi2K @S{IWv.y'YOtvwu`Kv]DMP'ˉk{hIkf:Y׃|:3ܵQ 430C ja.fQlL<ts@Wz[ =[1.zjރTJ 1Qʆ u, qWW>iF桻UN!I V#8 SAt@o9owzDs~ K0rIi1}|lޢ+|f׷pzKnJv0*κ8fv ) nM)4٘4 Rt U\+8FowY׎ n݃Եyݵ [S~#PgjBϾXOh 7T"? ;bB%:u^b)&i_,5yDM[v{Kr뢫|N!4f.{A7DYEp\o;[L-j:&nq#.-9FKL;A?w }Ńr XsB-IQetKKJ}FPd4\cD`$hn7.^Be+8*ȑq|] 6Q:"k5MHRQ #Nytas.qJ{װ9_bй.ޢuKUG 4rufOX"gdBd4zֻ7q])%FFOrXEC\Mg׬0_#{s@:t,({Q_jr3*ܟ.]6tY]!l l_tWl&DhQ+~S5*Vkq:4 ]#؋͠3B ,tmt#UNGh,>B}TpOp.YLt#dnz@;"{m>wh-HKQ*Ď /KZ;!/]WϢ!e:ew+6iLatqwkasGG vZt@Hj -2XT5 25eG IW=/@>k1OAyy4N"KsE9}+2Nw.x]W5-؋i: ܐ[.w}싘#l|]M[pJ?%Ļ|K]͗ti_"/G~;rl=-،nLk0;;E)mAW wEյ'UJE>"WQ |f)(ߕA>b nЋ^4v1Af]|cpw`^^JF)5B¬ľFYE }ȵޠâ;"WUOwp=c`EZA\uM7ݨtvuL\2AА z9P[p0.a{앵 {h nI*}RhY/:o_u7i34s;cL 0-]ڱuȩ\Y1m餉`+=K5% }Yu)F?oX'0O=/JC78jE`=@-V?V+@M1ij]\/9Y(K _Եݭ=kL]RZw4iok$/ݔsX7#;yo2b(tF돤TM+CJ\O^N%Ŵy5  wZ/N 30 u|%VԠ{lkdjj.FLvkGPN3QwZgޒ==Uc13\A=k ; }lq |:{!yi_S@Ń|Z1zi :߫N]]N#X(ѺB~q& 9ELuR"D>yᐱ[F*Thkz:zŧkxΑ{C9/Lz ::4ptq`= =-tj-&e=9{2_h+`lf׃<҉aQjղBX֣^:wбӮ?[\hAO^z63M` L?ǂAE_vkb?OQmeuүL@S/%0 so3s)<@Q 2{䭠ߤ49(ݿQCT22UBP@Kh<zeAkydLd3:P)t(FpZ^}0V~N"t(&@i sb. L6h LGAΫ0~&u} ^J7azEo^NwiGg=Q/vGTt+}&[a#I}] 6oЍLhk^ yKdlّ~+}h^ZF@k_sŻ.(yk;3gT@\-RlB}zsX|qM zrZk}ȺAȹ IJ?GA.dr-WZKҒ7Z]bҺ6_ ]y]A =u` #G1:i$^~Z228K1?K*Hՠ7_X<݅ W)'}vQ;sJr=,L~HA-@.Uﹴa/xoHcH2OHi*/eYdШ_LF󟃋]!=kqȷZ.;aFw0vY_WpSU{1þ@\xL@:_ℝ:?YO10qT֫T_yM*i:]cm|)4yBic{ %\H ߴ%3)ENFf]ɮe dT|!Oyya*5UY@ #Էh}Oɰ{ RuՉ}sk]< bޝcJ;/-wEg>ط6l*s'd>ko iҐSS tNC_lk? M>{pJC(cQ%{Ú@>+h2#઀ԮL z?ȟT{7_DK1TpZށCOw]$S(_-be=\fxB'.2H6izM|qk][to 0 xn /jtho\kW";l }Y'vJ]zU=}^/Kn,}H ZLɌNk=G$y(ޯ77Zmϭ}{S5,?=y*stQ.[guM.B^]u=2Ά܊s, sh}LmӀie)1m]x()#Ob{[4%) ~3,_/@b t]as=> n5?x6U蝳*ؚkysZbϗҠop֮\ݐst!b Ů r=R?ے "3>Iŗ C/yr'R^[,-%6+>{u?}Ykx[+8{7xzEN}SE ί|M$koKjzgӳPAS([r~/ +2YBeۀt,B7Wr.l=R([ Rr]MqBOy 7bdeUc"֠ՙ|^y[ lȿk,Ώ5c%*TogN =b_)!a.Eݞ,ky 16ޭy|b瘅yA"A}pNЗ&߉1rbOĹ󃞂#?)?Sܒͅ. /vZT8*+~Do@ ҕ?k,R J>٬dCiy kfW{F= , ] >d.gȁr v@ oc[LJC^ˢk`wrj 4#skEI 亍?gv ::_Cﹺί,9y?=>kB#.r9L rͣ[pgH/Hg1~|k7#G1z }3v ׸[=!o >ir]gޒT72Lu3oq>aJ]ȳ]"W=ooY\91{N"t$jwdlȅfK;tBcT3ag"O^~VBTؗJtB~KGnr lҴ&.[[-Zr6c+~혆b})fOd}k f{!G /wYn׆M{q$EaR-u跈9ZtMF݋\,+4՘isYr F( c[ 56/q[/*[ɜ㖐Ȑg6Z!dONncwǨ-ُfCҫ{o^>}VwRc,0dGj+2TˡObުmMAKݏrFE~99')vM֦T,0^Y9HWq/|*l3Q]q#r|ѷK x6ЉV=?kZxJRc =1JҁͨKYx"FMrԾH+bVzqa]C9iRK5RNaw+݃@Şz]<;҆!IHn"ݝ.n*| MǾL>56OQEpyCzj*ynw ~(55&!y?sxh1P|@g~5n̊ՠoL<%a@珀fiͨ|NHS;PZ Pr}7E ׺70rUȹ0_W=-n=Id ^AsY-M2l)ׯs=-.5?9v K pװ3B7Ɉ;YCvUUWG܆Km@;|:'8櫜I(}uz줱ZV,i/A1t+Լ oV?j!^ddƞz`%q^ ah=Ӊ}[#;8OpuLC_w2iV'Ob7j֓gv]+Ɔͥ{3Ҙ ?uŗ2u10#s 7q0ꬾ4b|QA=>?ubIo*azP_ WP c{=o'g1Egp􇿗L"@%7{g =L,/> 92ldQ_=N#2dɟq$W?IJa/={rbo.=HP:fƗݘ)i Ȟ-_PAZ|kȁLJOWOs/o12g}8Zr?Ӻ[h NdMV 5AYJ%w%{y!IMbQ{`[}зy-7~x:dzmV[.JVӭ33`P}HЛ,=p731\UػK#KߖjV*e>tϹ9t / fPjfycY| 1@÷Nz!ṍv9 24#]~]r*l?>sX:GC{&5[Z|Ky69~j~QeЂ+ oi:1XBdo}άV )IxC;|.%3z75N|h'IsCSHF/I%4ō{N&}[PUL%=\G`6s˳#L6O+!{Wq@<+hjy {+N}/;doB WAb &v$~2l3:-:r@S }&% nVq2-4G/| \Xo)y8EJJiJsN?#F 6P fO{PPQx@ NJcq oh;&oRoY7;{cs.&'ly+HZ({]^oCs5>RJM7.V^pF4#mSQeq̰BoBw(o3ߦɱ2wX:J-F8Vb/Ħ+KO֞0<%/p_oc) > RNIu_=N$_i+o=TʄḱYޣo/حtdï_5*Cc' ?ӚԮK՟OРqL__-=;eŋ\u*ЯicyW&A>Ϛݱ\o|QZUG~7JTڷκ_nϐx#9?rJ9S=;/B#ddpf}]1k{Iw4"fx@jmub` usqI ءd4I%^ͬ񅮦ОNN~(3c&V>|K59Hf, 63*"]Wqr+&/z@oi;aQ~yr"-͵p]eR/ ڀ^9:R=mZ < 9pz_ۥGcszZrPfr=\dr"Iī!{j/\~8`2".trF.=2}[zzC2KMn-Q?5* HvB6Vꉽ- v߳j1Vs, 5Bzr9"Q/Lʖ mAӜu6l=x[O'\/IV 5~y\Q[-9s rK.钲#Ր"x[|R.SEs x+]VOꊇ V׭v." e6͂{[ ggFx@O[2:@ {]r Ee 06t 2}0TŸ+rlr`3"E_fMW" eTD^dZNJ N% O}\rۥv;'in,j 4NwάW+i"mtxm bЌC[q N}9QVPrD&aj?d1^!FDKo&Cݗ~M[z {FwU*P=Fq&k1"WH\cۋFAŶ(MR 9MDN!& лޚ |6YeƉQ ωr_9ejibHf]I_YBɁ,z49蛭# zSjmhfQ@G7m0rD>_#O.j<[]#7f/KNr ztAk9m#' /p czH^N/A wv}FL^:/#{%Yג{ EkQ?򋼮n-9Vgv|%".ߒƍ\c;/"KKz#_]Qg_@wG ;g]DL+ttE]TK\t-2Wy6LW-jekt\e|?|kuzZyHhj4 u"bW"ӱ{5- u@\6w1 m˱:^I!}5$$<7*rA)/wąŅ|;˸Π2Z=n?Ebu7CU='593]CYo>m@Fklav3M5^YQ>)vG@_u=I ~``qxeH\ _IBϮq~ SyE`O9[sGԱVTBu6U'˷uD[z.Ij"dWboA}pebѸxHYa/-Z@>m @wVېPO\d.kyHk@)+G$l{Ѥ mL}<_[=J*NS Z?um~^cfVȡbFʱKZv؟*vx(2'vu<[8|-&+ķ ̂Z|${I-kY3jeWŴKхPӓ@{lny*b?XPP{N<00heyc_:q4ok'ax 5&_×Jv?.Do%eV Q>\5з9G~/4c3V^ 4ՏLO,X" nqݵvh-=lk[.9E){M)8..:>7G Z %s^[A;Yƙ7vCsW!ľ6{v-V͔ۡo<ha륍L8|%{\ GUm .Ň_(b؏w\1}d2z j /% ۪> =23^ 0hÏ?<#i@I*1F|oz3}Z=eI2vWxYb?ȴ6^!;MȁhIFgD*e@5{ج &}ֽ1:JySaaA'dDX;4hihjh߫Fq{|~|gf6 %Eb3mMsHq-_zcoq}<p _s\ y`e#ƙBk}Cjf:SrVX<±zcoxah!M[;#!u8ϼ @vT_םF9o)0YvO%#)$ o*7c%\6R:ݮZnCwRTsK2o >[ ¾ovCkm7Y-Zd \s ~|b2YoK~ ߐ/x~G˧.ZcIG8#oW\{-i5oyE.pME%ob4Q!{Kɋ"Wk =42 {dYE>e1V.a=7xV0y`w=7ɠ=oF%=7vưS%i !ڿ^]a(5ji'n2F$͚N[h7pa` a3{It E2Ȁ_4)#z#~i9/͋ح~"׸~/%WnQ1 ZfDq@A S7-H~R8k;]%A.uNװ NRήؼӍ\] 97}וt)ǝ tU6>`w3y&9ˀv"/t.8mu¾2_2<%R\;vu̺FN]|20uW>uj:4:mbb8 xZХ܂(th@mp ?8-rch$Q_]W\gF=EC*zgڥ3sS5V=A> 褋zJHFtWd zwP薞 ' .,g|^U|h#'"QZ`JKEIqȢT2UBP읙5zc]FG&.sQKm@NIjwg}BDi:<&&:.:.g0Y /T2?)i itI5(^Wuk^4 =k]FN{wwݭrv*-ߨs#&c@v~@k~* [#ȳ]/"6 E=Z\: .=^!1B.PoEh0:| ܾhAƍ/νxɒ'@KJ &N:. 9uv[헆=!|'KWZy]Ε@>BN/3E~nч@/aU:Sniv\of9Qo@usBΟ)D]iwnThu|@߇Z%eB3sƖsy]GE^R^$w| ez+0nJBl?~/z1H]3?h\R1*2~VN[$.[}Vؼbf޳Y{9r*}ss^S{ۓ]\,J|+ǿp(0MLNρ|._:r\CtKWHq@O 5:K(Co5ԙyuah])'t"`|[4|kSy\c@ӥK\]63r/p55-9 ]4ܶF9Hﲦ=//:{dD_ [18?z@BKNmz%"{]&:[f{{1FƿIbХWmؽ~ +wqâ%;ޅE{fxCz-U*R|Eo968%A /s[ a tE,34-r s`t1ast c.Ɩ6]#M^b4'~yCW !b z -$r ;[XK,EOc&iၾE3DJF%R~yѿ+x d7]ZӤ!k Do(![8sE@@.<ٖ[K}}Z)e\T YR& o?Ƕ / M@#mVs-3J!fxs}QD[5Tڟ}>C Ve [ *=ow -5~o%Dp} {WFEGo$ъ$ z"F]8fu->Du@ܼ2R6/ (2g4}<*l,.Pop)2w(; 8hYגE%h&i;>Z3OҌ^Rz< W+%f/Vk6+f |t>ٽdѢ=7'ǚ B/ܖq"ߪ;]3~.CVhխB7\ {>?,t'^/ GFۡD/tgqE`-Q \Bkx d%: &޲Y%]n͵IQisEˮ ONV[(5W?]^9,q5H[.TطZ),ILB:]Qp_#: ټ_]#p3&ȟK}u[muB6hu~׭򃝖2L~rL7zfzo%Jt -2EG}c%JqAOH? 4j3ْ!*Ɓܴزy@Og9O`Y.uZC'ZF:E\}@J)a:R>_dT+#'_ (CoI?.ԝAK[}]h=Y'@}J[Ӹc }:?%ҞA˺i]q5cOtFyz@zHC/c}vAZ2 ȷ [[[:bЇ6պ&6J͙_䮿FIF'e>u 4ؓ~#WN=o$zRlТ]@OFFG#صƐO/b}( Dz]=r[yzkЏdY O'i {epy5悍J?}sHAg]$|Z׭ dgDkw-nW`lHR;bj3y@Ozv0<!%55ղ{s{!.1#FS[m$)$uGy{ }lΫRRNk42Zixzߙz O5c'r0BKY-EC⴫'F)ő::']KXrנ//tHC8lP/fF{z_'u64z60\OJQ;?Ƀ[&$`,d~W>iY0.7/t+r Fnw?*ȑ1U$% ^ tglij/t ̳]Ɯqzcdy_+S{tm<i*6^" u xmײzJIl)iIWK=m/G 0Mo|!A2{tq1褱6sjM7<"#z/̂d zLmV@N"G6eyGk#guo?ϻ]rX$MCyE ip9 S+c,ҙTyz EN{e雱'칪S9;|`O\}`2&ag`u~UL@.ZQB[jHy.JFr? >:R(kYE˺qKJ癀xץGLӯ9eynaUt[5m^C57ԙy=enatM5K 0AIٽc$+ѳ$7"jv@L k/QͪT;E_d-jhQtTۺJᅤ9(yPHcטV-gLzWBw,6!#h[r QG=ϔ+yuFTO)Uot?E~_N3F儾Ű5%+:15 cxƴz.ZƁnǭ&5GIb^"Нk c|fXoR-]t80]{A.mOp e_B zy f+Iap_E{Ԣ:rSHB }`[uWώʁ\Bx ݔ))#qN^طNpХfk᧕24r2mLMrPSQ~%5"INO ZY c$` 0%ߗ=]yRe ߄A"'iZ]ו9%mz@z:Ǩج^o#=ǔu]Ǥ:֋:axcon#@+JpoL@°=TO̷$)xKwЋ |qIݺɪ"/aHL6jNe%M^%ВuJ@5M;c^_WГUC(^N!8tGa줵G|%KXn캞Gx#<#e~4+V?F$Q/~ҥ/cLzvωZ|C[,4g?-N¦k תr k^B֠a:6uoQ9S# 5}U[QrE`K(}^_jEv!m#^uhF*9x˚}a_"$Ac7t[l#;E޳|=plF:t\tj?Myِ˨'rr ;\w1PWsT\=f,LKĨk/ta@NOtn<۬}Y  UZruUF5Eߺ7r]3#h|bz/T%jn]k|[ԐK|\\^Fph(AXyt M؁SwW="r`Z/wy S4¾B]&/ozbB3/4kylDQ{#-{508:W'=bh}@%c!ph=S*rIi5ukhaY }x:+e~j*!C̗5>?z}_^K5M.W8B'l .I)#FiyhPw6c][t hjAXOzin3 i&}t=DBwAn7CZڡh׬#+ܢ?Seߠꤝ*7&/?PO &zlp× u=:d-&XW z1}/~AI^KogDs,x|ܡ}?QPбUjnZ`F7ey{_y{_g^~~]lO̳f[ohfQwqmZR|Hq :۝`5Ļh>H.j8m$Z_t3Qtrh9n#м:D]sm7a_|Sdv9J]w 3]Xec7Dz9r'lM?fڡwG.s|D zW\p$r1pcNJ@3n#rx7G{CtڕOHk4)!#2dfl[ub% CZv_t4{6gԷQgJ?BzA?A-( T . ^A#G#=8bry|ڀfjvscOH/n~u`w[Lst9R`aY*VɉEfttd{IZkұRk\ uh׶s]Ю$Ft c 0#{eN%<: J`\t=R/I,tސ'noܹ A}P } |lnI#$%] c)E$cޣhȵר#WnBG1N>Š&ub3ܤޑwz='whslR{jvZw4;2v =Pz 3zr"gGm }\FJϴ:.=u};<}1-'ؒW~ȷK3uh:1!CZ/x9躼Jz+\ߚRsZ]UK;poi'Ђ%Ow!9zy= }oTKRk1dTI$KCtL\DQt ƈWPWm].K z03άǎyޑŶ/ pnܽ5!f7@w):aCO=e`u7-j*D5}" :,Z`vgiVl[,OuV\ϴH-KkϺa?0Q[4aKS tPE GSy7yZ  t"Hv [~'/=x̄oT1 _ Lh@M`Kbv,0pOг;j 1(e# Gmw +]D^c)Wy8y3B^EC:,XMϋ:/L]L=oFL~aA.I̗er)L蝴/tYЉ>;odR 8_ԙF[5t##YBρaSMKPhQ.kԷ-9쁼Q_C^z@1 议ӉHck6~sspU C: ,f¶-]-^]7=lN4h5EyF ^:}'x63k/\Wwp>7b9uv{A  ko䭔bAK'e9*= vi\Qv*r?!9 ޸3Y%zoG5u |A.q}A17^ m]U O㗉F׽ `#6(!}ToiZ~=eKPFj9Yn?Owb5.cu5ti\ODIykvmݐkEۛye:k]utѦ/lus n"?ȗ!2gEt^:zm]+jsvdxANW_(鼃5q$z5H1H%Wt HEɑ;[2ҰҬDG?(uU y_Dz[.^kgy1 FLِ織y*-zy7=ɂ]/6^^h"ӋFK5) zߓ @N>@.]فܻAB7vЋ/i T2*r'tΚ9q窮p{-z/—=Eo:rHgfqG*9{V;G bFt_>-}/חȣVkv(/t[$:AZ ~y\3]"[ ى|G؄}f\貔k`"^w^~A Fз{q:B;ް҈jKk}z\LC7k#PZ@t ҸGrlH; #YvoyT񁾦]VWاbXFK;S#̡_[^Tw/~}:JϠ =ɖ*m ^fxv3t2@/R7{:K5M[ts8@T>;oKL`&rx!;Әz[ơtKWL'!OPG /vChc*=k(cG Ӂ|L9r_rŰ3[--7Au>B/RNv {H~ZЙ0o:=oРΟoU[7A@oX63F<0n/kJ[I\M=q]BBB-|iݢN7(=|lMbW*R5gCy(kXIV;rKDB[W.) 9[vR4"5'n*QG]T#)[ANlE@^CBrB|)e$/]"O^d3=?1d$p7;b7q~LH~|j>&F-o:mI b3_i]+56k)}S7 JR'ԑi 18'ǻwcE>?`?NvGÏIAbp2Z5>,ܮ7aHnKۤ#k3gjuyC1S}NɗQkFc=4o,'1//t Y2_tҵ(旔Ghv]GJ#Tŋimz@!:fe]KO U''; 7x 9 GwG]/UF.R.&m: ]UIna0+_j,\p;v픕W-.TXy4 AK.kDʅӅ8K t 3'_zL$J^kd~rboKT4t,Ww&ճ}K4_PP daxMC56{s=9- n֞q7^xxŘA;;ŏ\MxYxׄy:xaOM_{4~V5%|T^SvtNcm{6~WY EQWn}{cp>wM" ݍ:dңٜ)~ >mkDݖj7lY~ &\T$po;;nbhZ?/ґG؍}ٚ7r37v`uߨ@+h x~wT{>6A!usá_IIU/kGR>m-@g?&a_h}yWlo3{>49/ܚ)A[b~:^ z@>]^Y[oR*UdG<4ڂ;grV$G3m@ߒݴU:}dϿƓIҡל=^ &KeXߴ:=?/r2SB˄xu茼jf3i?k̷Ơwqu|Ч)Sh,x͛d3I&y=X+t(}sLo.k2\mWnK j4N$#j;(* ~>64 d[/5{m?J}mvzu|SYڰXIF/6SEt(FMX-Z7"Dg;c'=%qm,(B<Ű.61>mݳT6WmW^Rn硌fv[`WEZ5pW䭾^#;}ӆ8YmycR/] BY9O5iLg^A:/v[&{U9*vƾz6M胝[gM YVޔt5OsBFM{OjQy! ךUbP~#Wc%<тb|{qU_8߸E>\u|kOpoԠ[6IE\s6nRY _ӎޡWs7vX&lKX]0_Rr~X]B;eYCw?'ks {Z*_} KGJ؞epd@!GD|c *9jNkaW֐/7ĮstƗ|([7&Eg=ߚKUh3'g%^ gmQUe8gvGUPzF涍bځv/rt7iWP\ʶM"?-j2tE] n=m+m>G">yy?R}Y}Us.K)]MM7܈ITPpu:{咂غ@5c뚬[z-|H't*ۅR"Ӊl \hyRyCXr 42r c7_0CF}<-mfEZ TόKk,s;ZK).atCk4ښbG݂/@W'ʁ<)`{8.aA)"U;M@'-M}U^ L7:QPpg=-T[܎ϣD>XI|~ӭ)2Ɓ\Ƒ%>GQ boyE5.K.X>7Z@b8RhZr ®އ<1>q/_cs%3*r7=cu'eO7RltW@~&3q'Q Zx5ݨۉ/Teh1OҫtEP"Ez ]$iǺ .uE}0~ Klb"BΗْ5JrT=bWxmN b^fnn_v k<mH.ItWk;䆚r@5W_ PMϠxȑ?E\^՗wwvطG oR<7"4ra ]C&A7==~f# Z/Ǐ:Ag t[f"{y:_PCwԚjWhF&^:6qB}aoN', PoT)}=ʁ\OLĐŗ`֥]xQX[E[iF Aw-FOG@ P(G)I zq OJ _I4d91zoig)욭*r׾eSt}kJ` ;E_[G|Kj sYaDݐ鯖o9$qoeT|@l#5$.v u[B]?ܷ@Ikm#jk4h~s%! o|Zfbc$XxnW_6eq#X0i? BlJ|ST <?z04:ƾ}l0穪~s!+vпwM.MME_3 y Vп5T2FՐ :sǩbKx ٻK#\x N }aG>y_SFާdL۠GS[胾Šf_Y>6ڿ؉٦* ~3zyosL !Wz)aKAnkUM/t 4#DV+r1܅>k* O0zq`b1![?]DYnܨVI]vSUlyQ ϏA&0CZ]6vY֠ܿq%<T}}dca Ϗ5$oP`c7x p?ȆڝUa_aDe]dlDO{ܩ6`+VSlyYּRRydC3b+eݝrة>?}Jwp2i 3~o!2FJ-Lr Y~Xicum?zlp6v֠MYP }YSc6 Jk*tF^I5Tjc9&Y`vK܀;Ή}szaO CdO9%s.)iUwpidriYfhBJ?Q \x^꜍ojf<;'3 gL/tуpAϸEXz~=LzӚϻ@#6_]q"ܡr.^m!pҬz'pҿwh^Z?oNCTRf=$zΙ޵"Wey@3Ểo!~݊Fl-:.v+_.Hsfl>9k lci@5:{L}y=doƗU,i>"l#u ݟn/,: _~SlK /,)W7im;5}T>9^ȃW%NC_G_)ihq>зgo 9ꤩ{bh,*WozT/=NSLWqRkx.<Ǵ|iǞ/3n_q U+R~9fq;rM\W߄>ւ\J5d#϶A_콱tI~AT?VRx>{؉~/;i?MfMF 248L#J2=[P9[nj ⮦{]2K#?9(LKMarb ~YRA~&9ooJJ݃hNj~((ܟI`o::=lĈ{;1Z4ans'Ʈ&{xVwCZ<Z}洀Tl,M7BRr6cw+Y(fBp_zQ\&!'*4X{mm64p Њ/nyX#ocdzfl};<ΐWxMF^7b®dϡw7ȏQp6q"ة !lFŅ>oT[;v?_q?nwr-6nORwC>득/G4J܍1aGpxAOj|}/R~KԌ7*w7t32&\]2貾TiiBe}M7C'kzZ % y?F:CY2ΠI@gԷkM$i']C>ڣLMAt?S?Emu!>k91FlS0]RZ;h v ߞMa;,yulqZM %4Lvtw{|™?gqݽYs]XB uhe$~\#kv=iJ"F uz@XٹFx4 Z̖FЗV(ә/OD-hm%/[f2p?;Co(pO/lYŃ|3j^LtȉM>rK2tiV{`J|IJv@XQH=Ms\n֋ ދ{aU C¹(}oޱ`HIrquWJQ4@.z1&%~x-sۑϴ!?Hnp]{/Gv-yʗ?tiNǦy9J |IkvbJߢBYjg/M֠ml(:蹑eܮ6tU<ۚxYK~ h<5rg_=F~ D[Qgǿj](7l䎼 $=mvI$RWV^O#єVy0ҬאrBDEyf_mM&1rS~ѩOwpԩ}f>>2@[)mM^jnX|&MC#h-WUp8KcΘh2YB%cD+XڡE0ȷp^TluvzS.W !M~+|3S,FK4z}Y/S ȾNF V Iّz}U4G?y)kRLUv"wb(u/iu~#dFܟ,R3/s_m ]*zds> zkU@VZԞ CF9ʼn+uiY:8(\%x6,t5;~kcr":"׏c WЯAOt9_)H1ƭ]tYoȯK}BOg^9D5fT]쑚Hj]_س5J^e~rZ&8/3E?EGGDޖAQk<~}3l5}6ZVyN@&_H 2],{ 9䪗ȃvAY"B~Z"[ھѹ\rBZXB];WhVr^K7tBF-b.uY/֡VځmeIB1'95vN[ή֠k&2xA_y3? M궏].J.'"c@ߋ1so8%/9BcU6Z7`Oyb 3SqTg:} ?'= 7-9]=:DouqZ芑ol[Yǜtm+/Yb[53=tb'KpHͮown?![_? p f[cu;K΅>!3[Ym4nNNȤQہ|_CE:GZ񈑴.5G [rmlcz~Z|Ycp.u<"9~y253\Ǎ|r]Dc܊Hy!t}x@ϋv杫07>?޺dѡ4Kn*u1i{H]'5F:ڽ/o#F=#S9dmb% 2U3tm15E//%( -@5mcumg´ǵN-@>BWw>j / `Gz#W/CJNuNJc2JAnR ̦+kG!-r^]dCbLb^[t1[\:\[6<jȾ& 檆Kc,s׋#AkLQB7yBM:B Ggr KZ-Эe]e@ @U z_~P/ j//cQg4CT:ՎDzC' 6h'w닁 ]yoLV0nF8K2kfJ/p zNs.IŭQ?xAG8oO.ЅWmhC/*ё>F)9z (*#L?.ICgQ'F}W߄Ic`\#CV&HvkcIXՐ=GL1fTh ļF%l(3i*|N;ӂnL!7uzݠYkY 7{P̐D9k|PFxĽ6ha9S 7]Ө5Re/n Y络z_nW;oL-؃#w9"ŹUN+ov4fG\WLo]*rAl=Lz#]v߉ zRNJNIih*I@ނwR! FNh#IC;A;_IƜ?UDW;;F^jAVsј4Rݔrv4A|q>t '4hL'/-c 9~u3(@|%֡EbK|"3_Ty9V'^!>o:55 =I"PQgeh:%Ю)D?E1.~߻Y"F5gr۶) mlXQ>_`t;IghoC>ef LD7Vm3cUo97U=`'[>1EWS0%R<t]lCɐy*b]2?~sq ~Q=E% 襮}CNA_]<*+[q~v@G{[sDn{@G .#M"?ru/\A"wquE?~iz ׫%iD COsF}+`Snw )z TԡIC>Ag^^j)Wu[2{bkI$0#hl "E,=`06AGn ~Lr~е_fh1k) [n \i7Z _ Y; ^s Uk43fKOԌ^>SN2~S۬'Ͼ٢4c}~kۡP}[8|l%SV:eq*\㾓|c' 72ɄZgcf'<;kƴ4Cv;_BOn|4&Z} ϵ_t=lfana?)UoefV7&cԦȏKN4}_jirӠw ױsm{'k# ?;ee~ME -WR C~klgMY3u>0kkchVe{ \ҠLO})Ґo) xYZ}{؟Eak#@?b-GFEƜA>М wg=5Z6и9"A?38ԋAj.]ѠuV175亀9&Ԑ(I%L7 5 }YhAbw&Y]Y]?5ܓj2yʁ!pv/A A2!&ْc T"%7~\_^;/9WD_U%kboydWyܹbkpnp[ qϳ1N5]#'=#j=Dqoš 7/Iu3S:r\yѴ^koQ`_~v-CEG.z|9YCE*X&;ELM'Jv+"7 9 7R;kZ፝W (Qg{}@Z}~jމ'’G-ڷ몀M+`B#qa:W&߹≙~"^p4id?%9@$2vr{8#e/tc=e7)/ۺ=_^{;=_"fdLXM]c1nu$ol/Qh1#o᭽nˢfJoݠY+OQFI5hR|ʽYi+n=I{ߗTJǖ䌥Hc@&+i; h[IC{+!zV5M3^^cN5RK!"jR Ϟj zYi/% 9gq'o6ͷԂ^GjŤ A?qKķר5jXlTy}8 M՜vWϯ:t]в~p؇OV h&ʐg.NЇ-c ۵K=ŅaoLnKSj|lQҤ"g;2^P*D~wBPve< F;A%"7,[_x@F9wku7'1 @+G\hrK1_֥r(v9H (fI2fQ?.ztܠLfm^A$] /Qo }~u=I!-ZEzn =%v@??QC8u[0% \fSF+YjT4Ov 7KZ;k|WmĻH淧|b P Nɾ[ܘ 1Q'M$9 |®}n-)q{ī.j%lb]V/t]W?@oˇheӺWЃ1id? q(w}E~;wMזt+T7nčA" ѬdLD75cChSr5ƆwW5xSvUGE$]z#/Vh*"a>)^9[1oKuhu.st,!5(u}B%]FH=el @@nq+5mж̤Mzk~!.9;h|^N8S8XV{"ߗu:B"mB(yMzqّ_7; 2u괵5 AWAaF[֋3}rK7MU:mZPEQ˥#']<_KotRw#{p"dONtUy!xNʬt z"1k/^wdK[yAnNi]3[8JЍqW#5<׀Q)΅ z5BeG ZHvA =h?ǀsґD){;zS/*nj[quI΅D<6Y%uNb1]$[s-\[-,[57]Ȓ@w/c&-!7u^Ĉ+V*E;_܍9/$ JB 2͕Q]!& wF>:ݭo̓ #!FNY4h[$zZ}:ƨ Cx\@?.=E*I]n^ڀ _Q:vޱF8؝h?507ґ]DUzҡDA^':*X%pQ9_`+`}0+DޢD4DXM(3q}@Pr@_tTG.{0>~L]^t°|sBfvqtd}/R\k~ݕU =)A|ҥŕqaQW35u۽7Ey$[o\VɈ ڑ*#Re!ZM8>R_'i.rvSu̇)֏gu]e=Rz~k:v})G`:et=Lx#ŭډ耾iFBˤr•/ `)yE%g&d9bFF%Gz\# !Hwf]|q&uU'nn4i:ۙ/-/2;j(| ]LFN's =3ҪsFE@ͼg-(Nw1.yF 9iI trb6#OzN;tb#+!wu'rH59}7`0]f =M]b;J5Bnԩ[ve-;#JRH_ ѡ'*@A3ˬNBۏOc׵MK{KB;׀/xUosp|yCQsz.~30uobl/1ovoFR~-%^gu 1'Ш(`_67{[bJH 7_f.|RtFze".~?ST2z!!8\i C.1\PEEۅᶏzG|~\2?F*̅u'Lޓ@ՖͶNZ%ۊߨu&ll.gX̰KE^]ؙ/F^B0rQ5EL.,t wQr?',x^GL!NF|/+uHJ/4# Hk좽&uʼn:UaSj a_rK:!tDN%-f/m^G-Ȝ^ :}FB;q"nu}\zn ͼkr7]+p}#OQAtIS@wcrJ7l5=IWѠO jdPߗ{nـs^r઀RV3,;hmg,ڡWTrm͠qShJڰ]Z|I2p"л-nb1t`ͻ][uW_-[@bH sX_"]5H5e`k/ehYW`zD]. BG7zmTdE}}:j12nc5Ȼ6l;7-qZ/H^>GzYA'lUɋwHJ1 D^I6@/Ŧjސp.c݌2P?QqF>kvz>6)3ɾ(.ҡ;:^bU]zNں3_"tۮw%t<P޼']Zdzq\1jn2$9tZֆItcjμS35m ?.֨I r돜A 1z"`;ahRI~ԓ %ΆKyAޜu/b74EZ v0~x mW{B߶)Cߧ5D};x V䮔ZDZ}_~ZGJ7} % nM[^y;E{kθЉ]bnw|:L5#\5^\ lyj20 UEh?XQ%fq7@!C.h߃N+x$*<#)r5f0?^ޠP~Ћ4_'(Ue9%ydS)LҰJ`l]*?ׅG%}I?k8yġ/G>ߙ]94Niyx|G=?WLK}>5BťYwK 0loQzgRbci}RF~s(μ,[=ɔ}g83g J;'g2i >F 3dM?;ښ~{]3A:l~VJFڨ"Q24ۓ(WoeA;?Yo-{ULޢ2"h )Fo>5n.s> {V෨ŘX`$9?#G=Ik|\$v{%5?Sh!4tl}s4=Kّ$coQF_$^J?2MouSW]B.jHOrQkfLbtA 2-zXv 34Co7#W6!Oe)`:˙- 7y|t#𮖪zǓ^<']'ϠxZJ|JbyF5t[0 "ȕYOr/<hv¦7yi Y7yr}/}#B߸]D~'%%S>b2<>y5#o첔C3O))!w!TrϋdN$9xcƌRMx}LY#h5*4AJo5,m2ȥA/,*]7E zNtMž) J|Ӧ/}Uͭj&Wu Rɭ|ݻJJ fԁ|MVoQ>N0i6"on 7ptelEWYGo YY"^IS`{Dz~- G!YMޮtq{]'EW3#i-Fc׆?ר剠薔^A .)s\n)nr֭ -5?gM- ^ȻTb/k׬lI`O<;t{Wx/N쿵<;9 $jdTeC@Ol4 ~hg$;pXǗ؟Am'>)Q5d'+%+)z6L="'^ tkJ6oۚ@59GU<.Ul/_􃝮l ޿GL3i3+U Z"/vOO>8'u|K2 dځ] BHF#k#&~͟>I϶/NGV׭oEV.x y 蹰ӂ?SBK7,揭`3"k/9cIδy(g}>Oec5J/ ^b<9_'u kջ$(5#K 4ɠֱC>oI"J~oBsizc~Z'oȢ B[yc ;ߟ'onQW~Tc]3ڠIІPU]Ïv%v|wb Z'Ιjص#"v9`ÏB ^⡡`9&lޖ%mѲ/jѢȷZ]=ηF7} c#.G^Y)мj ɳ9`L]Huq9NAx W$5NJJxiT9<9̽Dp#?$c=ix͗FX^Gβp=g4mrvzwAx]d֡?OZsXLR2¨Љr7a ֠#Gcgss2KD 6Pno>ߙx$KxY?ȓoqЇ7~qR.,З5; >F קv}({;ڭI-xcHuGCЖ d9AoaвQZ }my?iԽ,ؤH[TG|_v#pa?gM~6n;}-c{7ON cQM7ZNְu] K*r1Z],|T 5}$|-;ooReGV5(6yZG)?_/eПWG9r ΟMTJaȟ|tvFVGMٝ6b~8| aKq.miwf9ycp׫5Ȭ呿|}jq[ gӸd8-G(;dqv 8iZ4)OG.2r% ;DR*ѣ]}p&;x_iThA2IS8Ґ-q{%tU޽îaK?N~FC퀩q9:䙿^!lP6tJɶu6BN)oXK.C؇s`׮= 5ĥfj6 ['}齰BF (}`B'^:p?1"0OS⍝dw 2 X ߪ-A7z70CSurRނ;dY۫9G^h<޲)D:%&siYŗf"~Ƃ'Sin1WCL7DЙ C}G|<6C}bZnXrgRy^ETfcOzu]2bdɉ}h c;\_}5p/z^b6ґMl&m63K9ݳ pB|s  FK6A]yGn R)v<`pLOXNU_Sh w:39dG>s/{M.&hʤ>ﵳV ԋ{lm# -6Hs !vX*i9-W,PEAPU I&| fcۃg`RŠ7.#:Ugt(U"Cڑ8S `ׂncϩ˥HT#I67Zӳ r߮Ͽm9BeB 耞E h 'rY/14J'c^9%oBuE7:;i zӝ}%Aؿ-:/3S/оwR d}WnK2q^RDN9GeT׈i Ǐd\.,Q[R7T=qS9A~Cy зA B^w3CQ@#ydDaȏ(t%<4]~zP֍KC_f`SZ^!jWuA]`^GФ>} Z:!YUk0%7 : 1}ݍ\*6t4Z2ES}<uhir q3 z[f= :$7JR?Sf@s8U lR}X>Guxܔ1p`Kg[૑Q+C1`-l#Ҍr^6ؖL?gIX7m),R6b-z@xGUӖiQv[_Yֵ@G"Kw\j tp;? Lmb@^6, hxAm~>rˊnJv#oAn.{ע_hB;bЮ /t[ Vm$~g"} =)J(tV{;~vLuj@^|zN[&0y5Gehnq,@ތMA>؝R{:N-1#GKy g@^4|Vp3ޡ{{ߏboi06Cr pVdwv ܂K8YɋVB.JɴC ztfo7c07`ƢB-Ft._LyV|\[vOs!+ !=~ lDqeDoYyd&W9s ? YRR|m#V((l` fՙ@˽H^w.1} dk(7om1,G&rȬ+{/] ޳F_KL@+eO1T.#tiTI՝,i+BrQ|ѳNHie.gqC_:.h4|@ңm>ȫsnҺӺ!Ў|,MG9^3o4o{{2/ދV Xi_Yp8/r76Dנr` #T1>@U게31O}{D~`p% Ey~vDF}z- a޿س `WҐ.!A#[zQ42'%u}=Gag_u|zJ*9LX *`1^rĭk36aKSM9G.iEGPpW'~@` xz!K|@2}+z(@vAAlt Nj\8"9QO C'-Vٕߐt.'r]Exp,rq}ҾӠgUzbkuB~z.9Ȥi*5/G52Z;w1]@YLӻ!'jX(5Yi>S\ԠG D Z?K2pmgzHZM8 AƄkR%@{Cn#2jcx3GFDAW&AN-FvM8'Po@#Z֠/%kס/V~7:hW%hpj8vU2Otu/R,,c*1zŞ9n@nz0<Xutlz’3 wKlixEKK[Ϲ`UJ{ /&=Üvd3okKV M^R瑩-QJ?7mz~'l}#3A~61`ljxUc $=ʺY m;.¬߽s_(A{b$w=%!84ᢱ+iZ# bmGkEv2xF/b@wGO-85]xI]JnK/l?r9э6B;v@O|>Z^cc1{c'0kB4^|GNyl)(@]nh0tQ1l56Gn)t$ڲjtemȱBEmu֑FtNZgFܶhYB?[<2YrzVLq :=#О/0=Iw7r9颺fؠB.}0tU~%[9\ҕ#莨HɍQrm7kM|w kˬmaNMᄌVQ}~[]7 ϑSb[9}$P䣞aB[NhKŸ@3rI1, P[FI"ھW^^,=5}-nezA>-ܰ ZCoSZ#^g>dd3r_?Kdc~EcoM"n.m97\_l꼇˭r o)ՠe t&(5]/ z#3Zr#z=W\ui"c]gny=KҐ\UѢ+qjB{cksŠ)8Cr9 ׉|bzb|,3{aKQen#8gvx[E5+]ZJMv }Kq#*y<5^Y_`uy7\Rb 5p'rrŷ,o.mUWdr!eȝPl|"(fmנwsTpI9|+e)fEMY3^J+4U8;՝j\#iABFW:eov wˈ2.3ۥOp ra׳u,zV/.WB3K-9tɔC-h"Oh.e/%x3ibߌ/Wb]컢I֨朏^.=pF.#-@>#_~2B< ݣ-B[V:ұc|~acѢ>KDHs- rz E_,Х%|z¨tFVrp7 }ĦKh^w|VJ}v/"6 "Q@.т=_zq7OԒy@wHm0˼ysٖL&vvץ ]d؊=r܀Y-mdȟ)зOG-#{D:lj^<9EJ3-mѣ1:~:u/r]<]Q0b禯,=r z"ySu>"OB>:=$'nqN{ }@EݮYk/G^\zFK0|K?䆭 0wsAۦ{;, oN+i,@>+/\ ztն4.ILޮ ]2|qT[3йå.3oKُ6^$]/ LTQ@MtہꅸkD'rY3#ehfWvcH;Ҙp瞱Eiv% $JiW #.yH,FGcDt /L?ΡQhU@.MUK,^#(*̭e:[H$X/мt[2H `G}Y7&^F@.rΫs:J٨ͦ!}=D]s0D]mͥaF b*e/FZ/HXuy[KuUz@Au\M+Q8GSHlj\fg&&`d:ZΑT۬J^詎.qm)P_ݱuiI>tch[Z^zK=StKz׃jDW1h9$Em }pO@OgR:.1?SѕR;G]gHrnCw輘A;v:e/rzt^ =ft?zG z=swE׼o~7B`<<Ō:ݼ֑D/5Ѡ tk}Kj,ѼwŜ]=5$K53Q!xZqΗ}-PK\ z$(_qm6h'l#$II^H}4!d.EsN{8E=:,r@u˼s]RtM9B~~{R̐FVqQQnѸ_ꮍ4jjb^bl$0$y<7Ath.gE|-U/t]ђ#eD`twT 'ݴzYv.ȵ8p)eO@FNzL{x.wulrGϴ|b3av0ca2zWKE2v~":Kd9)ѲoƦЇ~1N}b/r5-Lhj0>M7ybㄮz'/NcIvPʍ"{Zoнg/SFhNq>* cRS'TZs:lnqGX78y^#r_EQ9O+URCݭx];H2ȓ.a]XXɤڢR]9I>)+Sj$;]2G'ynOF#PҢ@oe |^Th Z-"%_ujۈhyKTtRPN ݡԱxYs nťC{~KF0\?=ԣ kp٥ Zsۤ,eS H Fނ]3.p;|3] CW>u0H:Q.^=ՠ7A;wr{?2vagII_Tx?4e -W]0ouivthƸ5hE7eVFऑϪXz=kTFnsv k@*D.a>9[LN38/ ut.9rJE%$k֌)rG0!w] =_E*@~WB/r[VcܠpIEYFu!"E+ M^p;2^l5LL3*6}Inȯ)I*vuP%n|-#:^W;ޙ30 ) (\[XMwƹ.t[1FY^t9m@/;6ѹ#Ceo֝vr(>Dn:\O}wƍNv#ֱŚ"+r{'$zqϜtGnЙU;>j򙻅/:'BR8wWcRS]L%9=2HsC?2`ʌ2۞?>Rvo5ny=b^^TA²KЉ,¥tj4oCzBD]BY׃a{ˉ umP?+kb/bawHxQȁ|D-)4Y4hzF6Ev2p;\xR1Eft9 ŸSʨj8Åb!Su|g1Z&ceHQ:b}szձl=*rx l,J[J}.$M*UDz& dгed.0J F]AFg!ma& ;˃|>~z)ӱt\=t=y輜RHZ.l9ʕ@Njt@Oü{Gu4+U;IH-Ʒ>mi؞ƒ}1.rס߷zJ/D|6y7#3t;}z``5j#/tGNѧb~I+-џA]މڜ?n.5b_穷zޏ(0Mh#]Բ6 @g}]lbߏݪݩOkyUSPڛV@>HGȱA ,l@u%.Ye}] Xn1-իx/ K}@Dہ| :SNq@߽*ЕYtÎ-@"i23.h&v {=GZ?b.,/D^g`&KTB:ӭ>b_8zG)ޖs5hC$w]RzFл.$yތ]Tu.*RVe͠dћ*r'f6aqȚ9? ];kv.=Q v('ΗiG^  q/6eJ[8/ShyJuMsV{RȐu-t{_[,=3[! t[q.K^//faq>/s8_l.Q ^rj]Dؕ+:;?#tn¡t@zUYڣ5 =4R;e%p碫v;#^`0Fޖr>J[1{+zGKE*3>ȿSIW.pu_zu#d+~[d3Ђ!_Et5/q%ܠQNruOĿui]}5m +/2Z*/(gnEv͋-Di_,_zBNkC=Eރ"f^oZ׍c{|ܦ7/SO/J@xL׬%~K%R]\\>k>Ex!).+.!N&!׊gҡ^h7oѤmw-j \O趖 Cu]yꢸ)ME钿7ЉMb &xhڑ%\‘ݺif Gxv !/@hQwKt+rTjmb܊! P'фtaذ:@Nz *t=4Fn4:P\uG* -Em~AnYm5&ާZQ[]2wq"oDH 0MNuŚ}FzП 55bH>gm.ݖ½{.SXxث-D6t ptc'Lz&`:bDRaвt| 7VT3%]u 4n1ǰQsܭ6NψjVryVWj?oڠ%g[9=*ceˊзݑM QO{tUN@%:S4}-_דhT+nr@?GHn*:/Z}"E:n:fŖ9h9zߞ :7*t'-팖vYRjAЫGZFߋkRs.*-ryҨ-]6,K3{]tCC2"QV3`Rafw"E_cB/./ݤ./T-7X@Z}-M:Ztxa  IRr2~@ MfPgˆLxDz*vvyc=VV'@ c4J=V}m Bף\S'ڽєqwU"~^9#H}\$GZ_oHo7ƹDLTDtvUt-S`֫wB-Zi/(tJzBT;\"_9 X}4` 15P-ם2gAG/^mqF[|CN_ZVzk8xrQu7 A^OBW>ohn}^wĴ ףY?6{4zAH@'逮cС>}4#rsFZFN( _;\9n,U*y1ެ{{v9%:RJVN| h1It@@ハ%t[WN+arK9L^G(|^{+7#) ok7uҿEW:]s=d$F^W)tysա%hm<з8 Ȯy7}^T)Iծ@_Ny+4^f1؅םv*kvcھoks7I90| Р R [-.UehĝQ~HZ~Ă̬H叓}ˀSGW1vc`컾nLY~ޖ9ym R7=|[*B ][>U//gC/$k>-Wt 谑?.J'/G/c!MV {|}eaXD<﮻>3T4KBoPBg右ߤ0N6wAO^>pR*E [菓Cy']^c ;)&s5mWJwH57Nמߡ&sOyBNDߠrG\6c ==5.Ob;x`O!d d>B(7x a-CƬ=kzf\ F߭9x`Zm b521C_[-}H䯘A96Uqc5kx|o+4vr+|[``<4 ~d21Oش1Z/c5 @l4ݢ~y W/tpN& -/x B٬#~?mV!?&C["ou "3kzxIfw}PK:!F "3'~{+_̢#̮ۊ|Y[A'>;_ðoI&fڳd􍚇C١m}ei%0ڿ9I'`_%OiyhZjwrJ'_-8>Y|➔R#cSY}N}YqI&nq̬2̀V*gTo7l^aAv4<tHU{л-7rpAn?u-Gؑ{!oYtGo ռnjyY`w!A7zH&9ykDG tG{X..(2:/xA:A}k\ݖ6as?Ν|2n] +='@;DsUu\7%\J9ll|ޮ48[K`0kpGmޡػݯSi*y1uu~VyWͻne{}w'K.A>wj^3f7.bO-n9(Q/}ۗ@`P">ME&Xr̤t/tڡ{$cQ ˴~};4En72B'r5iLTRn^/ ꛺ .tnWE[vg9&Isڟ&6?<|Up[h>5zi)AUhߞ/jwgԤ:coWe̿ѷ.e O%-m/O{! _{ԝڐU&%oț_;J(rG!7V@hѻN=A!Yc}یy[O<,qO'SF 9<_菤Q"oҠt~հCә>5Y|+kt pw! ב˼C,貀x֡Ekg~F+Ak/Jx|y#i6]Ԡw$[?uyJQNt@E]qT1KQ0vG<2+Ps.0ȕ4<,I2[9;&g C8sgS*=wq3^,F}!9|yob^y ']@^CS)z@WxF;6\4d!&'LcQrw°h4Vhl'6G#GOG Z0Zi{yǰnK9%ԋҘ0t'@h"Wcк7 B QY/۞whɑ9V"uK}JDyz/{DK/wdSf]N`F~eڶ>g C/ϙ^[>ztFo忮G/UI]Oe4bsꎠ}9x SO:K VbkHjNh\%ZfpxZ{WO>h]|Z8 gc7ԩʶoj)#OF>3"7J΃;A3dgdić@[5=ۇk{M}y"/xzm&e-xmi#[{f5x̀:yTr&Q?"sՔVh,Gtv54n8C\&Qe6jqɷ 5C&qT xY:m0?A_]>Cޢ!v`A̫YC{]nc`7ݫkz/>ё(ZB7c w^~V} zfg=B z)([{ " .>AV:IaSW.ViRA~VsQ}i+AR7j$v*f{ W$&ނr}]yŋBV8V׾7_;|=9ыE?`ݭk -eV<\hW#bnzJrgel$nR {繿k8fc'//PG*] w.F$gPo]}]_-'z->4^ ɌfX,7| V:w!G؝\) C}0Bu5]7^>!t$ VW^M|\4\[ܒ\7m-\ewxo<!9j q%H`Su+EV7x)5T`]/q>ρ8>(=JzN"p̯vjPR^}ce>Bݚk17_bvd{E~c6Yrg% q3Ǧk} @k^5bo4{p97l# sǧv3ANv;ۚU]:!kɓc х̃W^usl*| Z9/~cw!rg4֡Y=UG\4M7Ea}2oDRcøw68[0Sd,>W8ָii#-·S|:]=e[SwUg8wߖYR ]&q2|_+<,&}O-٠łj6Ǎv؉8y sffj˒pNy=UkGN=;6oB^0&IA7x fu|$VBA7<8οAc4(e{Ry x#Ҫ%? ]b; 5dfߓDZ%J`M|eOQfc|cFm Mk jVe>7or!c3k;GRf s=EStoFV;΄=Vouc%[xν@w;f_N=\.qM:gٽ?jvMWeC<%ߒeNe;nܐ]S!;کao{ /yYʙBfh̵hDz0b-_ڡEdI[+d[if {daW<3'\͗{cY͔Yf_S7)txG&j?l)fxB׵Xl} -|^ڦ?ՙ9g= R{B tHXo3؞E;Jp):L^Ls޴uSӤȟk= tz!{=Jw&Ր[`Usɢ5;oȪI;G6GSdA^%\9vZfO׷*C,Z-Egj@<wȮDdG}Qs&SYB59whvfV\GP&Y :%rZĪ7zΗr6T7vh~YtIv6(pG̕F o*1ہ]"kKhֽ+Z̻oL҉CB#3m&1%Qw`)Qi5B՘m݋͗pq~y@Ǒȇp¾ ]V"Z:v`a dy g_dKOk_MGD6#G_->,mWj Üׁ\E>2vqϘ,0|U -=Q?С8ϗ3-DUCo~z]E F5'&}C^^Ttr:[T[T\A #Krg-glWz:"\L2p8ZtJ_$2.r5*>ʀ\0Y/qr"X)>4Bѵ^]2vaNV2.'ޡm-{3rUރ Z$GGŅ]輢e`;r&]?腠ݖ b2;*.r@߯hhoҝ>m X#1N}"[qWW\"܀ak'Dkad r a'pA]Ў=`W0 xVFwԪd8&=oG.Bg KxA/0/왩ՔCgk}m NZ"oush?G;ۥ+eg ;eLϬ.]Ajr]Ri yJ6螨f4i_tk?oERJ7b6'+I^=:maC0(s:Z`NRSpO= 39m xtBxAkpfo5T !F^nիdunҫ02DRR=c\'JF|0t,٫)$f2xoF^z}{]\}Ё^umFI?'JScns/4jlsJ^!ɎȓXKE.r$= P~d]#]l Zms?K`Tыȷ7 6 2<kQ!->bhq7:]jڠ52VqCQ\ QR/t &ovuf 4uI䶋*fr_{pkޫ'#)u 谕<] )QY26q+> oQb̻ܠwC5t ƛL!kq%iJ 1o}zc5xz͐Qa&FI ߸'N+Vwi;AשhC-лQROd-2'JES/e.pܽsD r}|tgtd¬3q1<}ϩn:~aBrL_3őgN75 QgjnG=q~MNWf5Nj^|s܊w3Y }Wu[^/#wN53"E$٣{%$Bȵ(OT1y_y]~ڡYJv 𢡄cЁ|\-6G;5"[s9 Y`tcs43_Hn#=Mƙ=b)g\7ňy Jz)]p߁(ƺ北tl&ʯtciX#M.XˊNܩ{[}{4wk#i@n|yZ`AWIcQWZ쀞v@< 6t]F{[lYb=if>oAB࡞zl[gPtAwd0%0d˚C9ْfpy}zz/A mT:t;Q;k18qfz/F[ȹ.v>?{_>n(D|_3?rE.Z&%=\cˍ uz/bIUC^ZS鍼Fޠjj>mwZ^'p XH)4EZ2ߧNAiN>EL{% Z ج4Dμy[웑2U7^Yc:Jϋ:N4*94OZ[;⼐`[`ڮI3[ {@Љcj{:/J/S/Ե)t~47@=9ѻs-մP9}BX t2!CvLK Gvv~DHZS'ˎ=G~jr^$ i41[ܡ#J oww AJ5}kյ lD䤱3Em#ZGPOFRUHwT?]*t,K5TOz$"C b^A)⎤x/Ȃum/TnzkE@G=:[GxvXnEy "z54exʐ6ԫBr[\z CqkтR/xɺuj},f1j 98c9ЅDWGRR}ղ~{WW/ž=v^*x9/vrkIgt5l1]V y#|F.>rYj+K%ҾTl>f E^s5q;ܷѯ؂k A^Bޭ<;ЍtnAbبЙN`.-_kv5JQ"/YD4.at9GQ{ҝŻО/3o ~뾁JFZtMԷjD/ h4;k8XsZU]ϙ]Mz0όޏ47*-¥wnQ67yLэ%Z{!!w("'n=tB?ޗ+ /=Q&曫 ])o33[.f<@!.zmXc7Jrr]km$K=[+v8EymF-Z4╶x =<Z)G JG^ˉ<]2#?>KZ2n?Kb?NH~'Wd#KmH|Yq3:PJ]zFǞ-q{+}Յ^ }Dtb>kj5"']ËZaֱPwZҙ3HNAuQɩ c7dX2X])`a]ۖq īNvh4b/8ƺY;cԱBۦ͘8/)U!s ] r#u&вt/̻+"L,_we:Eڭ19b,3^3GuotH -GDiR a#=o^2x{fi'tgt*qߘ]E])%ƞdpM7ƾ`L och[C*yW[/h5y9z Nbal ^=y/@tUhTgSG<2l/Rca*sfv\F(, C`}vc~[pܐW ۋF5wEvd60W{AQm&h X\D2RLj?Ne "$in /]G[?}}kzqM±Ť$=F`[j(٘wk?[l3@r mE¹ ;"{sg#Nr OM]k?ڢݖibOVv";E.NA+w_: {TA7ERvlD rE]>lOtn VqrQo]\pSf%&z{<2ݙ.̡?;t!䩾 1C'+zM&ZHp*cpkB@OE. }az˭RE=\w-{BTF^5u\e20%B7EI mCkrzr ~;r!iF~錯t"N--hx!M]-Q+ը%A Fm5fn/5[Y#q-$]F4G\+ }(]zHvZ*R5G5/tr2(̱/H`7jqQWZkx ]s΋XZiD=z=F %@K>{Dv:Gt9ie1Wp:ҖFt}T9{7c63q1U)$qZ7F,*\i^z؉m}(C 6saS{\6nؕBs92r``<<&U1Μ/ior B !7I@B2}Zjr_ uz@4ױn)9ڠڲ7l{^/{^M@W:as$G]s涍g-xaO.c>cU1=]F;#y􃜦k8M [seJ,Q4pI3+С9z8 8"Y}.*vaWF'rpYzS䡗gOb;BP Jw;hN%hiy[q@/xE MO'(F*7$䤱15$wi첒t-Щ8o$ TG]kM^6t !y3B8xѤ_ܛȧ#w kt(]0K16|e6Z7z*^}1Z16tG#=shH^T=ÅRIG.cp=]kQCy Ղ0R=yl;,q4h]z(7xImMl0n4 Es;✢}!ݾ9ђu] 99a|GTRi@kыHsn[AI^  bߩI/ݕ&׸8ޛcQ}rIsuǿ)4_.0 &ѝ"޿mTw =1[;-Z/noЁp͔ݭȔ̑W>%-'k@P\ }b[-nDZ dUOwc׿ޓ[J{LԣT.v/Q\ZL yA_T5fD rMdRz+?{nL#rBf|Ǯ߁[ݢ7%I+9Ts (C:vB\?UOu`j-6`}ط& 4׍x]ji0.x3=n“DU_ôʹ nΞghYqC/KXv_8B=sɟs/ۛ MKSaܓ"%=&9z V$ [4Loy5;ei m2Te5jC}b'ӠJ,+na\$~Rb-؞֐=Uf6nto1:+tħ/t6IfOZ|.Q$ ~\2IO|\Bf[n}5?1}:-ċit[nO:}9oW7}=n0y.xj^ &v*OR BߓKRi"n4;e1o۰Hi^aPɫfD bIsk|V dQz #F͌ﳼYez0H_U`o Z;*)~=@Oc_jA y<2mR8.yH.\K{ ,ڝĠSzI*U*C{d~e* UC{8B n؈gR:"e>8W݂WI& 7G{v왫Efܓ%?-ܾSԠNvhilMu#j)l_ Mǩ#ߐZluh=q'[AreϦ++JBo9.0xI:s."h_mT^_rŦ;~P7ε7lKUI_IehM޾94 5{dD@ւ 'nwO_KdDi$\OQÿ$& rDUn^cx @?ND~B{W>>aTT6u[MhdS>[.6l=bWzxh}0;/FQdK;Z먝~3:CjNoyMRPq{ӱd}͂hZ{{dKWuZ=5SxWhIX˃c!v}j̭"ʪ|g7~k;]s9 < G?۪؞k*) :u ;,'TT5LdF^cFy~A܀ ^2^5hS=h{*)_Wf],9(Γ]j ']zu,z~-H_G(7)~4|])[9tgxvbHFb#(Ns\BSj{+xVIآ۴^p3 E_gޠGP%ǖD>9~/[$|1~f/Kn{c@WKe]":5jԿ<G**:Ihw|Mi7G1^i-طjW7h$JɟY{lCƮ=wkrToM]ٜACi!/cYz5/v]oV% *VL]^d@tdnGM7Lн_E`4nϤ-,+!XH+6I}SЁF"9?}wE%}\b^[BK#[zY^[m Nz{l:Ԋ/ ;I/5"΂VvY]u/~' )t?D*NsϙE?~5|-w h}x e3|ї{F9@7b@~M6c-0rlG7xU˔]I.=yI-AR{i-8b]?Pp[ 2[CL^uO&_@\⪦\`*;-B,wpz .#7\..wjaןqRG? M-d褆{; +b-t r-=d-*j tLv~{g+lk/x$c#rq{1@n&P 9ᲭUsRd<%zy%Ngj\DN3X)c6*?G qEzbNksk7=(34wD0CxoӛVhE":]bQu:B8)bSu4#]#Vo,0Se!gt)Y̒<{%>o8EssJ)nKbjFCqO3C~h̫Ӎ4A8vk]m{oi%0 vBTL@qr;3^HF dqrz>v5tеH.r[$dBTEa<ZRr(*.B+d3NЋ^7֕&mROrtA;U;iJrtV䛪^A#7*st UܔwM'g [Vo)#W\#=tMZlё G Q^Q#w; ⥷)v?}Y#z'r45ImE`vy J\CM|-zCdT_(CJ;[x(Uw!ɏ~.6z09Ŗ uEjCݮnWnb^k-e0QKjȍ.Vp^u69hĖLs{d.^1{#sxn0NC_)EM0.苑tq]79<ȷU#{y.!bCW5塏t)dZ־v 'zB<b|AXyI#Kuk:7@.?wM#օӁ| 1|O-MeiȒ0O!D 2Zs9Z~w;o{H YDel"9cي~UаՁ:zy|u# E+M}'].CU&Z & \|m.Ɉeg) -d) 4Ҡ_T_%HQeFojA~\SmA>O6-ZV Ey߮.7$JnD{Gwg Тѵv%9W+Mf!gs.WԨ:)r='ĿȷHБ.)0* 0ZۦX~ tHz#:ҡ⍼Mjʋ=GNqJY T;|[`7re;sʭox~rzNN~4m 9?_mB-rJt4sf 5-'癓.kuGT[=()C7w҂y_*NV_dжؓ rms A~3ҡ퍅ʁ\b m^;ѵgJhb/X+*&҃\BAwVdK8yckv @ݸ-ި#S!שs]dN7nA̵ !sG/䴉h= +r(iЧ^s O:]p e\ ]^1DҢ'AANqO!gJ@ tupB ]Cs!7pW"5[*،U>ɖǘ4]t|엄U\~.90^Tz͢I/žS^?9c yP7}50*cʛyQ|Kh H }KxҠk JW zSx:[Ex~LrD.:↡Ix{FʪIEyפ =g4'}NF[#2>[@zg8t[9Uetp5 v)@4i#jebW3NvEL:n/R"?^B1z)^7.oAwӁA.aM;tq."rYA)ո|y|iTr1 gTzxJUhe'SBf#‘Ѹ!z_W#AK9Bڗ9tiGкۜ}WBF|QuhwZNn!62͎Nq-zb^Q^cq}]t`zu'+5-Yv4VwS7^d ω@@_.7B?[ jӵ:N]Ք$C۲x[(s 5~:/K A^"xۢilI1pϭa_.%0A- A'&. 2.9򧳂m~y3>,Hz{Lf);9sˑi/S9G 0 S5#Er0qtiv@ 03`|9@f倾uzk{B״q}ˢb0{x/Tҷ/t *Asi۾]H='tI0c)rC6ޭcxۃwh4v +œft]=dSF!FgR81v3PI׋uEݐ/t p2RaTaDFz*Xo}@b3ݐhlD>ݰƋ*i~/%F^zb%44%e\Ka0x7HK z9z ~7 FКRTG5ȅ]?pan8'xF9MƦ̩فe\miz4n[^2_x7k$ȹ9wǵi>GҰsBgpN4v,|l(ئNoZ7EH-y Zb7^k$ɮ9UFwfHg녂A/JҌ6:wE,+#߲c2.dNx^c]gTܠ/n#GOY1hC e7‹ t _F]M)F*{EAF^Mё+tZ E.wJTZzڧBNaT.cl=Qќ/"6׉<5j[EL3m)pV*@ݡcF"]zǨ+ o蒫5蝑˞>]B&p~mgטC_dQBkdO=ݰcwӉ|Xg;}5v9@z\+q+ {.x9soN,;Y VTKJ'05 $R`~+̤ٸK4ݿ_aHZm[ۆrO1ݺ{Έ /tȻ>K=n9"MaLzm=׺-T0L`]С˩@\;rw>F4tӨ|A;R]YHVC-n:mJ풻ڡ{,@X\_#ҵ:^ՓָVRзk}`zG ;^B1+Uc\q /svah?{,ȼ!]SQ kQE>u;pG$$b)ZR.a%A;h@+^&V|μi&^h`bwK:Z8EG6R 0Mיkv#1Pkk!0[zM} /m `;!nUZ8]YVJ`ŶD=/ 'Cؚ#i')1ouh_*bvi8twYvo[ht٠G&]Wݰ$J/|n)}@ssu#@>/ݨ,۔8xH#nylSjOB׼\S!j9?͐PT-=*cQ[Rs`k2U /X@Et"' V]B\ݵ@`6z.E/ %ʚл=Gu"}־n1r9[XvӅdtEd2q 5i#}ђz-qVE}Xt|E?=٭ڠu]M@^tw`{Y* ^֐V:%. CKet#砌%KKޡђ*YWJ|F5|P%l.(Ti74u/^,Qzv`"Kv}s` (?ȉC{2=kpjF%-VXQ%;n8b"or,q71z˘*RK7)#iT'mz6{æPo詑{ixFG2VR4?:k~Ft5sAkrB̅ 3+J@˦U. sCF8uot%.]͌G_b4xRGGzɈ;Г>P)] hJGCdd)Xҧ#ztztZW?=v/gC]V|.2ADb9QfZ#}|qXKLFHC;TH7a|Ti?G q*xMyoeǃ$YGR+'rYn۴3m/—nr-}ZFA-9Q:A_:"i Ury{QyE^@c_gZa_.1-WC#%KS tY bH%9F8ώ7l{5fF@k:l;yO m*`ˣp;bcYw*=]f7un K0)Ʉ%N[LE:Ji4 Oa(]c*+v"\(QK)V.Iő!HS/rU,|Rڨ7I䄾3ƪgFq%>tȇ|@ϒNڠ .)d.䋑}Kӷ}3>/|?_@r/J)FF6_p7h?Ř/i E@)K'dq93* -I%mm?΀RO- c-l- e1ϥڐR- |2C6%Uwm/M;rk1]6pձ.T t&2h[=RN4yD8whBK"ku/tըqGyxFV䫥eAnŰCsU}\Lv|aK[~T=Пnn$1 [BωlLԶ2ի K7:cKV{e/+6JhC/itm.r QvwtLE^/ww R?n[k g˜cudA>L{[\Wh+q=cozv֌]wZm)_M2T2~yvF!~Fd'J6hKȑ{F)B $b 끞vA]5ӽS;/T7"ɠ7^)tGwh߮~ יZE.ԡICfܽiiPߌ |30 phKG{sx5`\]@s;1t+Dԭ9v -2YK,@[ 6i紨-԰5.[5/K_m]xpacMf9q=k|ӈ zKRA>ϐ/[Y4nt 6ǰ7E# e90E੧[{Еݴ {uh% Q+rӚsOB{ݼ u^IW~#]>sp1Q)-22yI!F &:*A90x]Iݡc$^7SG[e=yN-|kғ$Jw7r'r@tuxܽ[Tv#' =jCBW0y}d :Y_]oi饟2r7=6dM?h_=3\(:%MazF G]*m%pvGnb<ĮUc.nrK,)AI[@wciz;\)t' D]LcJ vqԥ՞ͮ5d@AvtGFD0~6$Z:a7tI(ըzQG/2]=pμ6"Jqϴݟ)ck&> hrܠ:K z[zu2Gxz/Bkuvf qgS]&YZ|\7BM])[Th];u_KM>;D p6s6_1bR>kl!ϺZbc S6 y _ͧkݠ'y$1"]|xg の7]Z ^=BWLXȤ~.PԣRz{\DNP2gZ[:k_Y=hݰy:~fGZ4l/o>. `Y<5 %}P):K->^Y:g=ȡިG^bagT# ⶉ@=a9iu/ y\wD O6ՁHgtZӏC6b|^ ܯM//_h%eP_,a]\tax8su |]lŧ5h-Mh)HvvK'js%#:􂤞+Z}5T3ڡZ9+r7t]zyK`LThϙ?f >+յl 2pCwЧ.Ӵ7Cqs:  @G+"w XV;3 ϚϜ9tQdw-~ ` "N^txA˥t>^ҒRȴ4># iB_'QuoJ {혱ErY"Wl)`N:aFnu isnYGNHCY: с.Q&o_\@4I]q0/WΩ0tʤ =ESہ<dw:{DL," !70hBƩzFEId=)*ئ$'঍ziE5)yiشz:&$Zsu75u]( /T6;>Ŕ4".eSv5xg'7Wb詯+WКcSjy Y VRȇ>p:.F| ztl`G Jww6Q>ev];o4ꈱ]QM[2bXҽc`O)vyq3 tq:LܲǙŜ"UbtJZہWgNf_)ݱǕe4p:?zI|R1\bf1@S8+#sɩ8"r"Vq&V[[ /R i^4ڼSkC.'c]sAnA$F.])YG>/Ԑ//| Ω13j'}IҸu]>㑹 k\[{pt$]dDJgƆ:eJk;JE "b[pu*tڕkr2ť.I:v;w9@ރ )*ސeq6p|B}͌䱪wlFǸaN4t\"t e;uz }] tBs}d.Q\0ux썺=Zja@b녋!H%Ŵw-"-Q@^{)ߍ ]ܾ]ZwKn1Vvm];Tf) NOuوfAnk%:16^H,'t!6OyN#(N.lB'rȤ˹VCktsss]B]c:}>ưMmYtzʻuŶCI"[>+ZP]% C-qЋR3=')]sBW\Ź\p+4v oQ\R^Bl@ȓj{ђ-]TTv(#ݾ81_DE>}~ϼ.f쁋N[y׵5E]!!s=駩1~u]%VtrBpp4.0 g쥭Rzw|(%hEnK@GZ3]~bZH FhQOSCF$"},}Qb= jm K{.RִKp^ݡFn'r%7p/kĨzUw~rF\xedF݃/jF{6́)Š.-/y}Tw.$ w<4)y/޺b74 ;u$ |RGtg =N49/60:/KJyWo'r^4dLɴ덼Emq/0"d]L3"y)o *4TNLv%*r[.xrf ˃|K^+By"yQ^Z0ĞL]o']GmQPo-5+ o]T%QG3 `GWk!^s./MoPtC z <:R.un:'ܜ*y{\ M:$`90zS$9\&.)6iwNtiOk4CϣU# =*?[Ef}HҠr3Rr=`g,y+C=dE=Jk~t{@PB.'Gݏȟ1tokdr얅~]ϩق6=]Kѭ5{9sjnCW=S.kOkF A\XNKmv]˃{"3E/rQTC V{bnvAETž#'1m%`Z ؖᆞ9V\2~:Y rKJKil4zG'` 6h 4>N!7jӖ!լLuM(k-N{2Uj&,tŐjCԥ!_K<] ZǖH5]"5V5uPBeݚzM/ZP^+/~}q^k;denry/<&8Q^8sث DܮGfG.,\~bE.rt.5zgZ}g裡tFt-¥՜ 4t+~C7}'ѱDlJQaqr8k_u&7Em\Cv MU];.NAեz([;Z oDku u˥ Abdwrr"Ckwp8"L]g^C@ۍ@Z/]jػi_..3oݘ9rxs~\3wp?Q5{roTZټ9>"N%RzUŮJF%=$:xT"r#zs( zϻvzN akN9 hTj?.B@^x4;tIAEN#:it&ȧo62#ș<7uy'nݗkk:Q S "J4)e1C{=@^BUO;t_!U>[wN7l>yu\Vˁ|{4~tIVxEol v7:KIB-)/(v '9#.wyѢS9]>=uu 1jޙ.g:.LOE,N#3/ "T[E 0^r ]$sBt59KbA+GJS ƽ>¤v we~@KOT-:L L 2߅ĬN;To~@uVY8/wKiF aOX⎝0m݌C?G==hЬpw,.z_p#:>|UGJ~boU_/G&I{ }2oςtڸFpӢY'fz"cnxS 1JLxq\<:0vr^`egS4HUa{چ3ioxG=Uz_-lBWr\,;4`hd[dx1\t{*fͶ:M!Q vX@˗*l}_(:_QA~G⦠#FG<=V;/ ]c~A9G uZyA-MCywhw)'9iHi$wyץ ,]JXO @g%wyhFC*>tU9ZpJzF r=߇aj^Lo >E6~#ϕck5K{h*u#tUS @ u!."#z50 +SK|5HbpF#Yx=e -&rgkZH(ej~Hw53/'=K_c_S|4t |]N '^tw\ ;M]H$ = /EN }J*i^ w_),ˁ܃m,8vrEiģ"]F%tip;{q,Ѝi)u+V:ࣺ F"IjvHS."9?<+('ZݤH`D{ =ujW:9tGgky qR^{MJO[uӫå-|+j&H뺭HFC˼Q.*[SAsrUNs[:ս3/CHRI[lI\PGiJmϖa/`utZר2!ao(7Lq/eդQm+6E*?uD8Cm{'9NTH-K)*r)mN%{z!N^w[Ww9sHN4tQ Q9@>nrr $reydT[߀Erۘ&p\/AsG۴N_vJz?^h/>;C\͑ی :^W;ibT}S#(F.Lo,NDZGk׺ "Uϔxuf iCjZǦ@3NqŔ{rW [UjE2>`eyv~/tB˽^cd L$s)Bְ;:җQEM ۽R;c5+LA8WW2Hr@ߵ#ʟCIMmFh]3$GwʵuСop eJ m!Z7O%/JKvTŠ$gcGWGzKpInRJKבH@^`$.5t胜4ltn0CggTxm_+C/It@|+ Cq^/3hn6СN?ޗ vA~H8?7t鄑_ˁ$6aL_Z89^*ru<kS=.|kk0mOOdD6 |Liװws-pہt-mO [ܐ ٔO/)oWlt| 2ԧGdvaz4I p|JOg&-6p_zumFOnAԙ|#_D"Y,PFoR#E~oZkQΕ~cܖZ}Wh#_skyG^KR5¼Ub?g? 9I:W9s~ER 9I2;j /=FXGS ^M uj[OR-jċQ/#SCg.,]euw>]o#6ѸȵA/KѵEmG.clT퀞Ź]ڌ@P%ܶ505ʹҡyQ rGyUTʃ|+2bTo9W۩_~4)!)F$!C+zzӌCGv/r[L^hIj+@^9MynLth$?eiwz^l<ȷ1󽬃|{]K^^5E}{f.r[L:=!Ӌ="d& MGK 6iOgFC^^7Lz;}#zUdN#^4,ӮKFwHTR9.NT k/6H#krESr9qt]ݭ`]lҽ^A/5t+й.i_FG|)/--0r뢦k&ymv8{_ E_'ˢlIKXy cu";=v[za޹0fȅbߍ:osT'`Rx&r?j㯈iQ[PSυq,r*Kl|Ck8ouwT[$oVKZ`L?LcXI֞Ųt6e)VN v;SYuKF:y-# І0ƹ E;r>җbYf4r&:ٲn]]in6%]zȏ-`GsuhNiwiZK ;$쵖=ݺDQOj/dxQ%:efLcRzq, 9yr'}cW2厝L#%8u2:/,ǸU׽^_(E\Ћ.\֍зh΋|U:̛gNҽ($5kC\BT;ȈȘg˖MiLU>"AxGIq"y궈o_ڥ׸]ۻ| ]0Z(j3rH@(CkTx#mO ȣmi0.&IyF4KVAN*ŧ'.r5;"z=NF\@M^*C+qUZo@.-"2Uar$UԅoT#g#kFYk+] 2wDxJӴ *c&١'X$2vK iWbk 7-:*aQKCn&Yݠw^®{ fcN{ Cܠ~5߂%\lWˮ Qm FUFf;_Wif h.zjG7h?Ee>-,}mdh@Ν:[K8~-V n%F$B]ƕ|0^ȝF~ 2ɋ7Q$@̺g^#m{ =sR\ \Z^z&v$:=~k6ڑ.v ~zg/u;/TbPi:?>/;Z)Qu.HGLNvIĠӳͨКTNN/#SF@ϭ$Ou),Й/rWFGI3v4a^9 =^5h RއNfEFEFsېYF/~yt[{*JJ_-ƑԪ}DU rRCA>>л 0{FRy˴gNt"˂&={]r 1RkpFbr mQôb|!ݧ1.=iv\~Ku3]ZJi^n콂coIz":zZA /{]7,])_ܐ Fj`֌ރ5Fzv-6꧕4 `K''md@}X6ESSd],zy0;GQIkvzލa}BI/iNW+ߩfS<0rEDn3]4ӗ9 eE1RagM@ޣ0 ]Zݮ/4M>5~'qrҰWLNiOz/9ƁV٬m5Hݡ[F[Wm_T٣r{^i1` T=<靡٢$Q-@7b/)iM: p݂2Wǿ0KG~09w _z=xH˥ݑk0lrmAKTϙ46s2"z]w/v@xKGءKЃ7j[Wh.#Wʹ$@|& O{KQGϕchˤ@r bUݓFޒ=-F9:^zS^uD [}9QkP;xQW]h򂜻,V%ǖ`zBƻ.[[r)coi\o_I2*|f@gzd9{@.-ш,'rn$Dg+NSӍ%=G mӻ/v&pJ0=x>h)Mh|ѶXH"IhQ־&J*ȗ -|E Sqȧ7hmƮ2]/ޡs7܈^ e誮ݖؓ=^$&]ϼ߃8m%bvцw 1-W'h`NL1h fq7ֺoni}b5h +?}yCJR;㫹Ac{)][-P/ ؅{׉)H-?UG*iz_cF u*&{/2u0@Ru#n ~NsZ#+Vo2R߮MsgCc -NEyZ$4}Rz׸$o} Lo]2CP!${Dh$2#'Cwj[ˎznM=7 jvMMd7dx BShD}wi.WAdҁ rd]yXղ7{a`p z*L=SS94!r-=@XM6vH:r̾7bŦ >k>)bHί߃qǃPkf5ѕT<ȳUU7(H:K3gV`|6+Cˀn=nu1ʹ;}4NךvL ~w|T a%k_cVQv^BT8o{ec}֡sxWt*+{`, vim2+_[jU5h7?@zEneObvkӏ1{&|qLCo{X<iC?N"R#f0QYL{ϝJB9|t]OZ2%xXktiK:&ِSZ) } BYڠ}$,[E&҈>w2;!cWb EqK:4#;ok}'4d㎜qX}m |oq^{SVj!^k_@1`^5{+rɘ cD8RNId/B+g9r2r>kWl5L3 B}]DW1hV#]գ؀sI틽Gg87 _C_4ߠ7ʼn7u6Gw4k+_ -Aב#ߒ=h.SV^tٛZOֆm5BbET_ } (22ST.՞kңT!.v_z/}{{WehO#*Y?"1RĽw`DO37v)r]K2l:3ZӹitY&EeVbIͱJ8x!h!3bԸgA/TzndO֡czcBNtx[|㸿VrVyW<PEŮyÿp \󙵙R9.Qm;c7:^{ة# O/v*V%N^ Ϳ}MC7;]ȯq-*%pCD(#u|[~S)an1_Ħ=~F}!k{4;T``%<'x#E/9S݉]"sT{@1hfB}zw-&48$svt56ktGV гPߌ8fvEOu.'bTQ#`z~c5lS_ ;e ߞB0mncUӺnM_[*ߠډ!2t*AC=+ fh<*^ryÖg6>q:z_c=.oK*zKU}Aτm+9ab2*Zd(5o#! 6JֈH CKٮ}'BП ~sS$^F XwXFum{]a^>-AF'_UhAN-%&cb`Ac˚ر=E7~f]>{^\U>=B~8A4{]Ҡ#ߨٳ*Зk$d\*rZqzs j/7\ }Sx()߭\QC\|un UK>QsO1܀V?7Z}߭UiwT^K&S-b59w7ƒFy`ϽQyM=x^guJG gK-|$uI!7k]8{ +kc ӸGخ7*Ӿz (|o1A8Snւ3^iޣi _~Yj9"ܳ۽a:zd<]_z^5oԥHYyoLvKcoq8@~*_f_zj# W&*:lr=4Fhx.L,x/xH&#ӂf!=>__D8Uz>B3 Hk6 ^<~ S ^/Z*|BpF<95KWB.B:G[nЖzn>f /xdV6?{Hxq@W{] l$3JK 9 A*ެ0M cq#:4YoɃ2Sgu{=L6hMxe{{JVEݡ)=yo K I7x[֡Æ[cZ ?طhUId2%S{_BK3I%Nj<Р_)VHu" yŝ*psHá'" PN*(7VB}4hR/>_DҐ}d-JלKҸ+R~۲wno'ͺxzhòӤx?P^o\KN=5v!OBfBGP:lHS䓂XҴ7v1$O}Qb{oؤjC ɷ`J;%&[~{9:cJץ6 |5lhKL1v$-_%z)jj6^ӭ-X}o:YiS\%}-.wvxpb'2ڳtpv`vhL4`vƮj`4\%#[M1估b%i%}~>Y#o;)o[>h~+ nD%;)ZɍR=Z8=৚vr'vorjwD47h8H| mmB\X?g嚬ґ#8~B?OK݃7թMGDZ.1줦,|b yG y2\^$>&=7V8r$ xޡ:z%{xwOyl##OȹZՑco+rFo>̡5c˃5꬟pϝ>x.ض>b` @_5NDMzi 8IɌ 9jߒjb [9ublV6wo:}-9@t{0 :iЭf/WڣIE~orBe1rIta?m v]\.rrj[#t) HUz/ %GAkYŨlj@h:̞)c8ȃZ?&n&H]ukB l'e4~@s̫ր^u?GTԵcK' vB͏hulgg|KG~Dk7:ojy;tO7_mVJo9@~%2UK{ [A-z[= ޞ.Sڰxt"HF[g1Wh%@wI,>R=9Cx;3I=why=yGjؿkc)#58 ?k~ zyv+t{?жf?.1 mcy`j"otK7"Bс: C¤\|9G^!߉4)?u)Y>QqCUv:$w!ԙs:nA,֙'ibޫ?) Fӡu%o 苑ޗ)tKZˉ|{B6IS #]T:зOO6%əs@"ӍPJ94[&ڌЬі{r Mqc,O_gN=PoER@nО}Vp{;ϼ- Sh<,/*Wsk|퀮QJN6\EnWy::;zlI4*ȇ?u7p˽6j:ȻGjz{VĘ;]F/ |rݺ*rb~hxC+2/W>KFiwADK\NB-6 {%5dIm'Kʨr o-9!y AcХt֭Hie=s|WlE?$#gezZIc`q4G?LOk ZJ=0J!/-zi*CwI{;GM!c˱'Gvѕt =WFK th΄~Ju U8rHvǛdJT8uًb<<{HF2FfS|ϋTE$@﫣[qV]|&Y\oFA# gT2}vlЌ4Z;uttAOK* b@_w@ރץ TON+}B<9]Up'Y1M׎L3&ͮ]bn!gUz} A8 /ﯴǎhQoKeêIb7\Núq3*|d-K9~\( ̵rE*jE"8b9ʦ: j/c;DTz;a/W"݅?)\ˆaoo RV;4r!U)RRS붓|P2>2=ےi|KIIrStcg-˃ܖ4~g yK6h,hdArWk2~((\~{HzR8qBc?Ca'Wa%{Ѧ &CKD2$uSoQkg;ƹ{;e-jfrhra9Oݖwf ݧ=/RB.GIJ-NoQ٭ }?ȷ1a۽P.}ԵASӹƥ޶Nm[]Mr򘏅wG:ߤR |20 T䬋5F. H\.Q_%6?[馵!IVu>UyD t,kzZL 3;?тe?KcPmћ5Q.p ,!~#/)Т@nԥZE4Pa2R%ҵҳF#F=J :ZugSz I64DILs:" 5ՑeI?t14Qgϡ*vo{zI(teTF&|~"e(-[sKoTj7@_}i?eBJ4ͮr}a{VF{t鼽ЏMwM2`h;=hiSxE^eE\7y//kꎽb`<Η`{֡SE3\tm; Z-ºZXw:]"o7dptVA/ Ei8~I\F$8F,oY{s"M} |@;32&A֪D*--<5:g;(U Kf-hmD. Cb7.rU$ i^R3t<CJo:fm1~?Hzkvs1ݗ^^zlqծވW{ n$ވ 1q=S^Q论cxIo%##ݨK~#h{Հâ{ؚ]>^A^rdC 0'ʑheB)*D}Q/zPFK%#'-vQG!Z0JEN#6GT 4Ej$vb\.Pr5`WJ_Zw0@E^#ޑ{܍šogHCkqr~=FЛ-z3hQKg^lKzĻuu]͠W0>ޣ 0.Sϩ۶e. 9e_FUN侒Fg̋&Tw,r2F0/] 8]gץߨgWANvFv C+єs)<- #0Cn}82M]ÉVGNzew&!'q`o#XEuܓ6\mܢ{-  kM?}5lE)+A5w_m94컏uA$Bvاe2u/ êa/zf 61vm}[XuE,=?F*rI okݑ#~~'v^;qhRomt캤 y5j7ybfQ ӭtj=7) 6UUJ&5o4i*Go+fcLZc(t21xc~3XRahTS\|]=t?z\i51S"2rb% W,lQ<56|L UE.ZnAnC&ZH&SLɃc`֦)¿kluo)mn%.Ɂ8o6'4?yEMah70i폃Wlx\oWWe{z6jgʚڡ$q#%%prp-<VI¸*4H/v?6 j-.vlV M=ӂe{E7ffĮJBȷ;QHձ{4'h8&{3w^b?=_X4ovA+.[` *4hɅ6L rD$|D\&?瞝l!`u%eql>g=/z[~ku |H ۷ݱ{o7LE>} -=>Kj,oIϧߑo|,7@6Z?U]ːcwwVOa; o+>+oT daWv #FM_OV6\SC7/up{/؞}6~[H5d_8qd=ͅw{ Z,O{{F8ɀ/]rII7:“ȳ_g{{eem !|Ͻ`hm)Ӻ2!A"i !KH/eaZ7`Zܠj65qO-MK}3#3a&Ի^^wdzס;zǪ1kjjgټ`Ľ(rgI{]+=Ρ/0tNߠI%Ҡsh󆾻ޠ5{MXWzfƻZ[3UDMW#T̾m~ozesh4T=w!cN$ZwMf#M}"Kx_Lφ`BK=w+G:rĩdҞPy tlfYG{K*r֒y:)N^%6|-6%[753 ƶ}T}DKO#qPkoǸqj"1}I3=xt 5dr%oTwa(7xUq]V!Ny7Yo-X$e)BO|zy Eɐ'nKx ޲GO9A߈Eߔˁ ckW$8"|&Y+dI9o4L=-B\[{1K b(tuطNC^b :ӈ{/ɺ78#3U=wV'ɳ6NS8Fb&N 8B/(/ 5I{fakXgS7_b y b+*Ro6d%=⍝e0r_Luml}ٸ56ٔѫkƮ=N+&4h\68lƌmտAcRʺ%KSB+A /Fth{4<.zhKIr;[hL֊\r\ך[Jט?M_↌;XIF?KzWHp7[~ ]*e=`Z#|l-#iЪF9.~WtjFmD9yS(Amy?{2*¯u; ФKZE@!wjjo_Ԡ'8EԦSt $|k ^#_)FcxtWP^ PMޖ~o[5"cѫMq%Bi@[-݈-_|QũS{L<M\QtBo/7x -υ?RjDi.[o$F$E}w O^ M.SBP ( o|Y4iAc& ո8;/2%qcf\4Y $8A*xJ}1G{%acR~z-9,];4$_\^ƾ5p2 iX}Ù zc:Aްֵ6wnEO!_SQޡVNSJ [g ^dt;ngZ\v^-5ic`׫4>*zjq6+פ%0$C~3[շ)}jO2~fH :%/N'7dWh{c?SB֡d< 1t'd)W '|cl{öWwžӗLے䨑d[c{ӪAzvh\{/dޢb/u*"s/_T2Wdd}r5+2cKRc;WѺm3؊Uː"o𶈫mj ➼js-ʐlQx(6EDټEԫɛ:ȳKz̈́kghL1H ȩM{M x˯U1O#O[v"M麬BeEG{6ԁ^Z;ϔGZIuGÅ}Dߛ,/r!FzH1̠ejyYu`[s -H /:cT-}e_:BZY}O=MC/6N FmW<W#<7FGMo裾&ޝ (}=CۀP倮] [#PZPvh2Wί4M|*>6Vgv6tk`] /p ɒr"_T*1Kzaf*M =KX/ٺr֤S(oƒDq!/&zbWvk@NJ *1/EF3h:'`R)}$kȹTJSsT4ʿg>oFh꺍FkznKɮr;Qbz `z%=P;ŗـ\y=g3*ؑ.!}jxU63 IV6zbUגB A+4}9:*q~ z7X5褫QHA38! !.c7*o\D^Q+ϙgRkI}SG˸١ۻVp+vJТX$Z?^q4 |Ӏ~Oqkj<-cV?ϼŚڸVI|{GW:iT5;?T)QMmv]# KghY)]y&9 #5_⩎]}3nye=.G&F~TN䝠?@߮ 2t)2]oл/A~!_跺tvڔ8DFI/.x xwC7?ȍ\nUp"~}:8}Z"t̼Inqnu[#Wu$8^SA^=wh!O[FK3vKךk D3פ!9އ.tn@Q^RRځu8&.O侤|X6rOQ){hd]?Q$>mmˬpTOm ұ e! 1\){!B/JQɶ}nbF YDžziձ,khEHI*c9St%W;4$Rir HR,bo"o-v"jm]׵V, n u +٫SE.be\4[y3!+oKhuG.>ӨqH -u>Ƕ%_ ^н 04otxTJ}wCIekJPҼW"F! -Z4~ 9\c?ػt*z؂F,ˆըf]k@㮊mZ/e x[7)ur e ۻV: 5v&+\2뒫wh9iy[->j)@3}ih*)U@oa p{FA^p!5z)6 iGufGqr LwE/y@K .iWg^ǒ֒6>E߫@-6sw Z?-]S K[ZE\8 8%mڧF+G1Bfm/'A/L_OXH33w`X?o',qlgNN)$-Hs1mŴƻLv~z[ɡWR utyDLp,JK/Dcέ~A7k4^ or ]`hMC%M<~_W}%==8JalkiK?:~LB͢_Ol``;o4Qt4ooӺ*9CZsZڃ|3C2,2D>؟n욮mu).')!tE'g1m9 oEbA \z)6#}/w#=O܂2[#y%qϼʷXttI˃|z9|A.QheM1EIQ?庠-b+%ľF---C.BΫ/^ r?cĠv ̶f(3]̥eBbܯK5EUsO32A_DcO XP:cXw열OgΞ'^Л"3֒rԱ]thw*ɼx!@Iry!\\xE1|++ҫbKk9cW̅(Qm%i[Sx#1qQНϑGe6:Ut%Y5E+Rԅ4F.@O' z"hreexnm v)*\[c - b&:…յ6p=:cxxDKf.Jk:,glal'{qȮ sQYLz]ݦs!t@>ʢx:2GK rF鷸RݘYǽ]G%%d[Dua[9w nϙsG߂nt#W以I/Gݙ3"CӢ=)zI:|Nũ ]'`rȮ6K#܌Q➤Eܠ"]ܐ錏S9#J @s5ŋ"i~*oM7)r\ 互ݑ}A^,"?:~t_ޟq-o/9*7njLIZ蚮x\] y x%"~vEV+b+7r t`y=m_SI9hV}SLFe*ɢЧ' wlk4Nzь셒/ĨC-.Xi/TнtZC7+Ei8*W * 3{zTIHOraGځ};G Ak36dD9sȼ=5"NV`h;(H/a u֦ϴԑ ;>ϖWڠ-RkZGٔ4pqzi uA% h#Qt ]<2ؑFv]i#{FN~ը T_- aw2`q?ҋ })֔1 uf/! ' rPI:Ruw"tB'txSy@0݃|蘠i3`,@G-OV!mtG(ruzVJ( Tu֥ vM|@oW ~5h͏vS/Я(,.$Sa:"A]sS(:UtBӲyA/Ki.)#yˣ=[A~x)Ӽwh.঍cLHERAEN -{y^O\b|ȍZ胼 5tj*k.+4'Rڠţ%gq.Er_ۺ9hJ~z[^3Z~]Dzҧ&.OJB8u~FINƾ].rzӗ4;Rk}ɐ{{yۻNH%QRcOꁽG8*-ޒvv ^^yEy{A/AqEbSql˫X"ɒ|@dЋu3Y<={/]i>躑3Cwn>>Җ: rƋӛ\+-nԜu.Kح׍|~R 5$8hݤN飓"AJzնd&Qw}Z>e6KN]p#hle(4v^,E`űROwdbg@`kZr/B3h)PqZГtKX<]}:yKwlƤv?[(`jYm{AW v}/ԛ68t?Q]*v04ɨfWoi]ĝ. #׋s^GZs({HHڡӓl r r--W%Ak@Jb}sꁡR}¥w]m$ewgSi7l#Ƞ9R5Ky[>Owk[B˲Cz+I4zﺮL=p9a|#Km [DrIy% S%h_cI 7Rݣ2$TזF-$7"1t`&HX[]28{1&uW2c|o?n}ahI_ oQ*^vwЊdR>%4JJѼKY:i<2"ޠm[SK;ƾ, .vEo؀B.Er'>=m5Zc|Db.Zjjv%tlثRT}^ץ*%R+cM|Qv|Y 9 MFkd/cd_]ϵwYj =mޮ:"yxˈN%HSe#!dȗl=-ZnN{#ߚJ3<ջ+6)w8vԱ]ei&i_Qt} iY^XθZVw;U? -J 2qY#%2]Tdi`ͽfa?k^ʱVF.9ݛ@<^&H_&^r>r4$Eh Ma}H3Hsg8(X@-7rP\/ۅҘɰŤߪc=avo;.t[Aם= ._fF)jN3YkFBˉj/hmgR)؁NU/!%"WE9mm ݡrPrPnv6ætN=t_zt ”4*t=H}1E늽W@q4QϵְgrȽ]IWEड5uvIe|Wzuu[Cd?۲%Ǚwl=۲nL=G?4e4nHZ/oT HӃ4r |A=d/J-S7JRD^ccK%H#tcu> 5B.nz Er}-.ۉX=Uڶ6/h-`"_7H'nyt@>5iZưΫi5Uh.R?cT6m ԑ\If L]IHA:vv9#]tУ&Ȗi-pYWVW"Qy~ؽY9WyI [{G_jrEywQd³8pDFVH3gA"ZR&vz"7jiWh)Ŝ cnw3vo[HoqUY^Gӥحڐ#`.n3ZQ"'/^K,cIF580:twWvSp|S#e^0`@)iLCܥ\zC701z"&>ST>2|G7trE1V:WJ(rgE׍ =\6uFnZ\V@]Z` HCup7rJݱ-.! ]b˗̈[ۻJ`S2DHm{uYV #] nχ~"ʶ*Hӡ턞]:C;` #{zbfN1lz?ud"mjrjUVsx-=vyO]6GIf^:GouIG` )IIz9%0br@էئFt "v"R,>DTyH{?،:/>$CH]H=e;HO:i 9^#kܑ\wm=RL z?]ہ(GXS.H.T<#o`Xmk3%#Mi1y%Iz.jL\i[b0 bE}l5;AлW 8ҕ8̘vM.elw{0 zkJCEkPȗ#3^,|]&x@ҞP$ WD!?nS 0{tR <fs,V 9B}#'IlR*N#NE_M7tK|BklJX5rZ}e/I ,|UwuhہÜiB7vqG} PZءݺГ0 jbRDV'Rr $ ?tF˨oz ;sĚ٪,nse9ܹ-PK"F&q~o )#gT{|\.?iluA6@C`B׿Г5M_\%(h͕̻9?݊MZס2MhbȱNmQɺ{LKcxkhrAE޼"h-R3}y#OC)&쵝61y( ްƬv@q3b*s^Hj_t!/=*yq߲# 7fςn2f|}C?ZN- Y/SJK;ЌՔ~ X0HVeקQ1g/tˆwѠ- ݟ:@Ju7J=Q@ރ]XU)t֨t"׵"]@N(3'^4{1 kwcB}!OKq[CP2c&7vYzДZ֪In?dicǽxuW/jYu W>s@/z& 0t)_Ri6s ݬ=rєH2YXgt g==.]JJ.i<m:kj9 xzN rB[W^ ~}FXS*I{A/~qpu]GЗaW>@>k#͞уE=:/*@NZԜ^85hr_/ޭ)s(G$]%giD~F[-}֣^ t yک"|K_6"w=nmF7*ڑœ ođ i3'.E<eyފ]dmx!8bM Gg-p-*1$%mZ%{ YWq |"2XsRrY^B^)Ugt􁌜:%ѨNЧ^*FY7|@5ő*cYa4lB՗[\_v _C}Ais&\W.Ex_k"׀.0R %l }IJ5sJ+'v]z:]YKLG"w_~ܹVǐ5]nwL^ WKŰtg^M>wQi,GmF%т.kmҏٓ*}ff2=Ev]vq.NQx\:e/a}~o0rW< ; ݫ"O%g^r!H ӈw5}eCƾwknm׼Wp4In4zF 5ѿ{4PThi_Cmڅl*rkt=HCH5-cN9A5$3IFT%kRQENshFe/.А-/iV'bOߤHgzcAxӮ:;W ~xAkhb7V_'*>@GiOp_+q۹p֪:|+(ꬊo";H|GiGdͻUyEFz`~o.NS+^t犽"1|f{| 1!+hkww٠_74E0i/I|>@|7L C'QRjZB){겳@˱TlC$57BHC6ƦujX ]GG8ةk@3kW|=)AWO~_=C;ݹ?& goǾ69rҟhe4[֡gt_<׵L,mMj?}KC ]%,sk+pv8'5D mU軹D~gĕx~OH?~gbw"͉f5Ȩagj Am5^auj8#;Z^ õ˵mM2\k!Z՜L+#go{|%7w*"ߧQpo!.X5 hoBeCM*4K7}<~ľ߭[> 5o-T]}߯#?O$'Z !E=?qo#'CN'0*nNF qv7? ZP} HAkҢ S$b$g촀4-NJEÏeyCτ;]Lвi5oN`/kϱ*2#(隁-T#I5d~D=?] 5w?-ew4ݥ!ҽ/r([q ~/zLǗ>ی1 5 0.xS9phVom !Bj]}Dq=/RvL% ާK<aV(5Ȩ8M@΄{;X4 m+͖ӧ7vߘcBVR}OMvWpݦ~Y9S< D;µ|\l4Ԑnށ2x]7p}k\G*ڜ";ou Adq^bgtܪTĚCjoRyJ&%SJMk94M{5<؟S'vōt͵7tiJA_5 ́|Zܽ\`ou?U{8M^Ɨ>3f HӶWMuom|˭ՐiB_˚p&b/=sq"^%e͒؞MzUWy*IA =}MB=ꉑ_LovLj7y)M+Y(C.x]׽{rl ڃV{0z lTNwW/=cow"n$仡s@/W3-u\.c5ֆ -muI[uLdܘ }P=%зPy/:*1#q@ਫHE~*kʳXs=rj}Xȵˁ|/_c[i@YcQ(ÿVW^ϲn6DW:vN-E zZFs9y]'n]\Fz o1zw+hM@:L_B`w~72bqZ/ѢY>4`ʪ z݂?~/!b<m^>Wr02dnNdv@UdoWeڡqzʪPs9"-5޲F V"M"F1UGgݰ5M(D_[(qЖ@p F^@t"j:CDctu05[/fBj]NӕRTl'rˇ2]}|8f[v=]ЬIȬȷ&awG磿h .:,(6'y_d}'dD}@VhUA.H)zXw+MO=^" .uBWgTh c[)g(H*E|@Ou ț B3~RR ]}YZwFt\fUGO`dJݥjPdo鋊r @> VKF5tgNwy2ZxyzPںa>k\KZ9~)O:c$^Kfr w!8its3]*\0}$X^v ^U:KitjGGf*Зtt_4*wd|UmÍ퐥NOgK~(*557*JH9z7:Hd0i:1{2:&1P?^t93F Ouݡay\ؼAE>m^VϨvBt``¨ڑ^s>j{^h }{׵ggF[rӌqH?ubrŌ}:L((뉭AWtkYeUjZu4/'!KGguy#FGםIk]-'E{zke, `J^C}?[,)9e{Ve7CHne4m_TR#*K OZ7{w͋fX~i錽19sQ->Q%h #D'r_ENZ ]S5ENkË,/^}l ^Ɖ|t.%z@_tE/ik͌Nɼk~ȡtwRǠWi9]1434k{n 4A%tD;ri/rVК:N }YJ#GZ#,v*#z[)cu7kƨUJv#D"}&lSy[' fpAFN+zK^2ݨ+1t 0zߢ>bHp*7@KoԪ4r=sDзHm!/ra_o6YӍLw!B?^"u-мo}{Bx N|`oc!~sp^[)]XC݉z` 07Iz }1 T" >` 0S^2o/6µx-Xt(1Ow7^k'v*ݞ>klOeI7Z_{`ZqtVv%a/{5hXY0;A=#CK[tI}ez]ſe(4eH;m^B;=_R*9 F/HHwIGԃ2TmckZ]t~8# YҏWiKП~kӌ"$cdU0H LdFg|_O56#I`&Uh6U ٫мQNGhwT/ԮcvӄEn1]7b:ɻ\ BxޠU0htc?ASݢy"Ajd.Mu(][y܅ WJtח̨1}q.֕@;F:.Pkr afs/C _5e0:,wq!:|y]e`h }QOK Vd$&݃]n[G_ǝك=.$747%t tяedd#_w:d a鶻 2"xFQ0 U{2։3?n`ܦ#!2C/mZnw~"X4 /}FeG7Lc޲g `]Qi'r2@yM6|A!NyT:%V kn.A_l=~@kDB zZwg>~7_|h䚗 oO8*.C<17NG0nUw c@KJw=5NNu[6u]"%좎$_8m%mrFZQ㱵j~;txt"ϋt Ckawlc_ROGGЃ]:=y@bH"ÏNqy ˾DmSu@NۏL¬}{¶99}ԣKNϼ ZxR큞+Bz*`_]T|'-!ύ$syFhˈZΡt褋()yǣYChdI]^9r1!3xu7r/tƘ]C /+>Gkv}z.b֡B'[ "pW/@3oҀzT|P˔ #*#)6!3h"QƁ͎nNnqbW /Ф[4?YgoƜN Iι#۸jsv{2E>fr"}6bKh/|6hӋ}M թ_U\dz~bBȹ؎}P_on춮Tf{'Im\T|Τfnf0Z7[-O/-q<;v}B5y R5`oE-U;2WTFYh؝=߳fȕԬ; 3;[lDNϏ8{0Sg$#kV1rgA4>G̉g I/Tv_[ 49kC?DV| r,^Z]eآ&Ggmt?gbϜj!WCbs 47@fQ0zUfГiyp)Y5bnM } WdYZc?*.DƢnm35㧢9,A[) ~u7 vE({wW >SZ4 o[(ArǾ ؑYYe5OAk*+}U+B"m_z32UN5IP|VbJM %e0,xμ ^RE?r:6 ߱EL`'ya_Sw u |d5CBVG8<&x\Y/kx j\%י33xcKCI'xLzGvo<>uꍜs{~,D:/?gOiW*зF<ǒiݑ>j 笞A ~ťG?O2>g.50|-BA7dSgN\kM3Uifȇ< ^Avhё)>_O*xn>b ݟ5jӥBWP؟i$7.I𻰸v 4o;yڝxMߎY rxޡGށ}ͬiksI7| v>ֳTOsE/dOu7}Y|4p!ʯ|{'R.-Apiyx\5}Fyx}S vv z0ꪮxuڏdɛޗk)Fy5jJ [5\/}o%i~ONC;#F2bH'UA#p,iy.㧞"ԍ;HP |Z! %u`Kw[P~&~%TaZːz[nV0}DVڐ{Dp_]{4wꚛq5.~5=%誕gN2RLҪ24V-DGJgv%.v/oTW#PPQCnž_?):k[2ڍ\~=@68ΨϴO`iڞZ= OpGf E&!twO5:=7_Cݽn4jŗ0|VFnjrY@& rx| ~ax*B'T5FNƚJNZ"VyiO.\ he._cͯO˟d{hCJ:r:^^j z)R*7 [8d?UFe?^3DOǪ_MK.oB v}߈{M?^}?}Vq}{N{8~/*Cs$f!YG<'#@ΆI"N'Va@`n!{(y}>O=.ҧ2tV;ʹOE{$3c,à -F^clf^#X2rF͉^OFWrG_˧Ni 3*xokb! Dm=&fs EMdx3:ɩ!- @h>C4G {^/5^Uk/lұ`k[Nf09kU$1{[(d?ty:DB9a"{h|_r\E PK` AqmkY|:Ě !M *xj~OJZA^~X9F ,[Q8]3G߶ s[ŞJ3v>Su ~.g򟢛UE}\5wǮk&>b#O-ѾVaun.to'\UrJ+_×_*<[lm|]>g3:*#(c3=&ESn4/zi>Pz >mAMfl`3C#ا縷zvE1|oI[}cߛD$g >w5zcS0$i}dl t]M?g|Rӂ_) r'oEo4F5;M?rJE$ >ɼ}*oCB,E2L;1{d\}| lwvul}ޣz'.C*ߛge5cd+9INp:80}ztF|qT} 1>r]-@#rwXs̒/zXc#!o.b{n+f&IO+zIXbJ>r|Ӭ=;s_ ]'W~ ƹƞ:/[8Gp><~Tf'()I1p3 n%2[,lku򣳎+f,ح@KUspRC/x]3E}_|{Uo(fu:wyYkwAujOV a9VWoӌ_zǘU #~.u4K< ŞΌWF/E{) -N+M? nqc[73v󙱔xK)B8>9͂ɡ׋J7&6Vh3wu^69n?y}9:͵G< 'C}|G+vǭ[g'h;C7{^ ދ)݂R;ʰv;wtq ZrΆܩħdʈW J;uXjRouoS螝_nKup^EPteA)mlvZ}F؋ C/op.ڣ q#K`ww Z)Nc<2_U@:vE32ÈE~&&oTj /񍊏pϚR~!kexdGJ}¦( iNCf'VߥbW/y~ I]d.ޚr!9 yZE~Gpfi+= E,U];[*54K \#k~Gz.\ˀ%$Hϲ)vQD)aXN :\2+RGIV@=\7]ӀRW:ՠґF562}g)$ANmieSTNe]%fq_=Gr5"ڕ-(e\G=Stw _Q@΁|-bY)t3f }+r寢3"U;﹑T:b@ki+B>M.g~V}@eF#eH;v3`nu-Ҡ9z2ۀ`?)%G ZUE q{ynUhG`xZ}iݠQo+x4GowiQCޔȳ,uh%QW'k a|CfЊ|""څdqm>>𛨥ej\rzZ5 8/!.ЗG2*Z4asy;yiӹ-]) 8]u>;Ft`ϕ@`X֣õcRc8M) t-vHîё9/C `WFSm#Ҝ=>\ֵ:2YHI#dx;e(\ꁛR:D. '7VD[Ȓ`oWګ z KsA*/r[Ѯ zˋh_<id]e 4"ߢ#O׌[JV$-Z^|@u:Nn l>y+Ѯ-xgiu>.țqf}]νW*㥀/*a1ǣ`rcckt[$zWv5')_R*rÈG\@%Bґ{is* H-{3FNj'tg_"g]M}oЪT?v1${3`ڣ 0XIVC \=;:>o&:Ӄ-p!l즿NFk$|KBIs!`4m+#Goz Vlqna>) ky_ךjG _qʎ=}f%RTڢĞh]VjAWԔr  A11yR AWsmO|Wg;8/ ZނϘ \59h.F&* b3K}ŗ#tt 6@Lq\ZN_y rKK!)=Or"Q`ZiSU;\v5yKdJoݨ] )%:s^_:|K}A/dzsu9הy [g`\} 27h|y9LL 3 w8*6aU輮ukƅ.It )դv/tۅ8\ \AM9_x#ؒ+K<{UQOo݋-[{ qGk[yuV򫔂l&qzIJuu " V РzwKAȅclVh{z e\M}tA׀cu-Nz9Ug1G*(Sglq?[I{W >@'/DYF.U^ 9͘V_Rn@{ SoRbK>otmbAj9c$M-þVC&_PP[GrIYjMM_wӃ+ػ#r4RƉ-)cL?eZCFy>K 0譗 }y,f\_h<͑-\B`z˨h^zRHݒ"5i15F_w\ӓ w%-Ͱii${y!]03/V5}=^>:ļhz"pWM{K5"zCFF}^.>Nů"gу|/v_whg"Jۀa | [>Bƶ&^n]Vi@Ϗ$yسyy 2s.`-6v}l'cokG<)Kg`FR7dܒzM&wyX{&/#r5|M9[Fr71]j^CiD- .85% =Ь}Tyǩf2dfu` H79؀Z?zʃK&u "cμh,I%@2vH%@o뒔wZ}&ZsAm{i;rmd4Kvuq>Nwՙ^z:g%0ZTtJȎD.WoQatN}ݩ^[?Һ~:;RGQV k =]Bw@|swWHB܋إth.آI@wBo=]4p[mVϦ"^zP"t2KRt-U:&ڑֺ7uh[95@uvC%[BaB~G;WRf $6َCWEˁM_Xo=2..AqeyԈSⴥaO5w?ے0p!9/N:tLXG(O_>g= ƪB{ lBzGݏ&;Sr'-ڙr[ef1Ȟ^%}COֈBk7bFЬ탼&ݠ.K~C~QY4 \t9ȭ ʉs9Z^H3 #u0be]Z'S_jZKrtKW(j+{O;LS5.nA^- ]4@1@CXW/؎2 oGܠ#6tEuoQ:L`N]_w1J3eC%'Sf9Ƹ$4/3 D="L^59!}[F9<`[F؅NO  '|)5N7^rsj;ʫ\֠/aFjt=z}sjyN."hm݉.FF^cxJI{P06_k[ ,O|^xm4ږ3̓=X'$bsm|)NSW[+}!o4յMeP݆뜤`+1>r'P :0&ۨlٱ^QM t.Щ.VxQJ?].:6k4=],ˀkt^+c@.] -[a.ÞzmmrF5lg}?VW@KEH} .Vߓ;TLѮa>t䒔.1UuF\]wa4h#>}e@{6yh:WW:mIKd6Ps-Skt鸵`L4h1Քcҗ67h]#J}_"hڱNlwilZ}.uн'CisUey*kڒLG <\qqM׭E؊L yR7vGE>^"SʧB'Sz(xVWǀy)֔vakx4}nqYj"=#_O5ʬ()YҠݼhڰ2-}-T.R~eE҂$wXi54j5`Se0#-}5u\9/ED/؇$S%I#I:,/|K."~}.t< FctJJjq ABv ѻ`r F e*yօO4u93SGnumZ}Ӣt`uFŸ!/d}\9Kn׈:t*$^/҆\BS~L]F RA M\z\K12p=幾q7yԁ-zǽ\/bԃ|X pzRq݅RraS.s)T*ץpkj="z]z3u5:ZjËyI-iEcwօDt]TܱftzvLGF_7/3P ܸRC7`d =逮5E[cJc;/G4/YK #WVLQs5{b켋(/yܕ:-2s(vt#bo.9/{#ۢ$-TCھTvt);1=/wŮ 4m@5E#䞧QЉ9}_vڑT]r_6yhHBZyz1hBz{4:3O`d'An5izͦc1'dyF.Cg=-b8ĸ^ɮ/@'k 8@W+摑wi"AnWK=I^m_~ELWlir@%iIu^d|@XRkk1}V 6K F%IF-.Q=NzYpkVI GZŀ~;ZSYѦky [6%{]I^/4,tɫWt]d*Q>ҙJ"Gہ\F(rmV@3e^#;ȹ"o-:oQ:/^RqC׭>)FN_{4@fe#_RZxGmO tfzwTrnǡt=Y?F404t\K[=vHT?tV]Ӷ.=.twIL{Ai`wVqq_$^7<|GGn /-%dk5a3$k^v[}-ډ,´R}VJ5 ݋J\fсgIyS 9a'nOYf^3$[F߬E]oOJ{-h !XӮdpӮ.1mB]w\6b39ϼI1S%o>ROi6oY=eحlݱٶ6pb4HSyܒQGjz@'w/2#$K5H!)\[ꩰgw0{["t rg^#4rq]},>٣>t}Do` /[ƺ(Se 7rS'_= ⑁5<ɠ~8_ҟ53( 9>F }鴹DAˈX i;f 17_q?Q_'U*&iIyҡ72 :W|+2ꑴ0,/5ݵKW{.xlrl\:-m>\F64]g^ݠz9H mTmU~!ɣ h3;ѿ1fd:?tg9s5hʮg5z]3[ }FxG*X*"tMs{gyJȥv"6cϻzD}9<)õyv ܋bЄz]|ލ1E[{ K,ثRn =ȟf`w@<}F|׸.w;Jhݷz B8m^.+w];T. Ы_bǔi=:C$Wnבj?ows \OcxT]V/MOWK-;.@A6r> |i#}?җE}5*=FGk%h^FMƅj/5K}:wRdW]:g$9 Фa )Aw]6!CoCΏt/z+63Ylzj. h=j'Tܠ/4:Ő3"}ô }SvTڠr Mir R=>Cs3g_JНF =/4:P:zWTp/6ÃYpUx\lu Z_V7lnku,8J;!hI'/络A]f޻;mȽ%ԗ^k>HK#2.Y=Pߡ%%WѺUUEہݢ4c/z WA#a?cdP 1^lX%lNWk?~Nn؜l]j, ط-捭BGM>ʣ9ݚtJ:@^ZC/Ց{:t|9[t?ݱsXBFgCy+38tPɖz`}{xvG[A^IG^&E8"I=jAȝ:nϏYO|7FX^/=:/t˞QE ס"D:wD*/tJBϼ8;t Ʊ">Bf9Q}I#RU藔Z;L#R+psv Z&J#_;/~Fl([uҴ4uDDbQ=iIב=ReEq g1+6t^`g^<7"R>+^}"2+cH]6>Md_<ꦫAQm+_|^$3Ao΄q[7.-us{O'rVyy%;/կKIu ]"eKD?Ң'T%-:Zy*:2aI-Tjjp[:A] huGyiJ[tCmkԌ `|ͧ :܍_ eDejthGW:Sh֡tD>/(:Et(؁q+/]ZPX*|A|DG1C Eނ=+\w~"O7?ȅWt>V]4h)"K.BK rhͿ$? ݏbGHC#R: Yoܐ~/e G % -?G;M.oyFA]/t8 \א)27_ƮP#8UR ȓ-]DD.naL6nm_- ֈӡnD#e@F)3}Q@otHb-x92za/-u]j~}FЃѾ^3!U tN05ncJo. 34LαQlQ)RTnmt|:Xb͟-+鷟i֬{׭~U"gTJ!OE-{t À ݒ7 ﱭ6"'Z(60ځbĭc܈N%I/3yoy&@wɵq݅$;/}^c[|s^A7[z^]d"];w3] Kzzz^ENR/~ig@4NRdzmx@}Ibx)kd3#uZ".]HIYi#s:iyFF4ꔠWȥhݲNo"\@u)ݪc?%zޓV]~Z]^5͙wll9?{2B_c-t끽/t3j-nOCu^8Ԡ]=2ͪZ)dQ}9Ԁj2f=ґBzkYO?ȓU1pH;?PeLx2ti= =RrAnKftwd[a C{u72pxx)Ut3nhTqWmvѬA}bZI[73Dn5b?\Noɘǰ ǚm#s6d-iHϨQ4Lj3Z ʁ\Qv oKsEvm ItݎfAF>ȳSgz39ΐBZi *(׃,(;^#%hb"K@yn"~/@e1LGVԸuHf_) ^IOOؓK vd$;?gyk`rjI̯[p9G5+SNXtHG=Tx] w(CuE.k( -&ץ!0,5 U^i.cmлֿk\|*z@.c~g1-ZtՔncdh˦i@~N}of=`>N\[UbKme]F30ٯE>KdKA`jb~>iKp6TeKխ\4dsvgeT{]H C w)5mлNT'^)M=>V]mq.jkbHz}A%y+r|uo5uwE'߯5%==>L(;!OS ,|f}"M|;JN`z厤Gam%4i^z Yie*rA$;=eY^lyo!M+H,7R?_3NL30Q-8`5*e[@g2yd'7i&'2LdoIo/Se؃J} C_arPFН^CS9Є4gR5)i(=}ƘQrr>KlRZ=iv_'ȳ3'Dp24__Ѓp*n0?x~qj /\қBq,}_0.[bh_c}g*N5Xz)n.5tћ|ڒ~|%}|S+4>Ϧ|Ŧ*H^kffȑ`hD[OWN;_7 OڠŇH/iѯiڡɒ=x&=C  @UhF6ִ-adL'[3Wj^W[+ܓxbI e'ɥصFt0h:|onl~fyUJE^^LbO%ޡoo/glYǏkIV ^#vd XS9{v v M:7r>C - 7X! +x]G Ab v.(c:3g$>͏,>T5ݭm`KNZ7fyjRu`+f]ַ VKUNmŘp=|\uSm֙i"wzvdEȡFqeo]_ogR:t:;btb;AGV)s,r?J&ar>R t V=q:m NxcE ZJwohIzgyc_jr)CNYo-VϱTfE~['5ͧT75oꆖlt^;ZJT355YR^Y%ޤnc]9͜vh)A I6ͭ8M^͘) 0E9|cwo0L&{/[y̩+.֯cQMŲd>Ke+[C)mVo>o;OWh^/56,9 @\ˈ oUѡ/i :Yo[ k~41)3lȭa`7'0i||\WJ:9HZГτ  Aqb(î⌜z2vtV㗢Q >ז ^2kم}R.{ mGtfmֆf}'[YЃ0^{.G^4Lg \r{~`2o6ǭAEK ?SK MwnAoSVor{ Ku_ei/as4i)kurȥk"}Anwhe㽚{ŨyT|eTĚ^|o캽 =PrB:dai/EX}c"# ,3J(S=ȉ @4:oV>Pg7o_*#20Ɍ7t Jʴz޽Z>sŒj.`oa..!FzzNU-Lw ZG-K([ W#g_Qd$IRL-vY.wheZB.!{IVtЋm5n?%ȞstiB?7k -Gf[E^hUkB;lF7KM]V`qV࿢lўy;Í9H> 7K_\/d,Ʈ7vkG2A(y4qH$JC_4q|:m%;7}qf́.Ax3;$r!:hSL8;5GؠI{"✩׷k6U- RF 楒W=T\M/裀QeaZLLXhMĮSϨhU6vYy_w ț룃|˳ʘ^Q.6ʝ.@zBozRc+Ȱ|QT F>y\X5@'](l:d8D&t1&c=ޑ5N t ѕIvo7j= ;]꒲6VA *N*?prh *IǶg/-_kQ(;׈s(}EsFa8>-J%Q[Ǟi2 央 2hsQW;N {^zMO:r'L6GS> CkK]^ }|kߣ- Jul7iʕF;/QK]$8ʠr y[6)nXkB'5(<F~[>4lK +]dIKs |^>MaWQ{>9"hG+l@.LEnYlP$Hב6B7;$'yao1E A M*Jl= 5((-ˁe0'Q@@߅zA<5ԨH^u #F9H@>1Oϣظ1z$4=zn4v^f }oKJN-I\imջ-]W/j 2rݻ=)tڿl8%=-49q7cQ&o= W0NwB icB})/ c|Ҿcꘔb>Nm(EϲNu *rOVfwY\͡k6~ϻ0rblL>ܐ(<)~oE*o˚{6-W7dkiWFv~!5r%;]}]Ȭ4ZW\<;?ȷ]z}tE؝z]\MŎ s)+y|SvC)46u ]dt]WG3 t.w9NF>2=9@u%HVg|Cuͨ׌.Rq^̚ 8 =S}H3дѼ]XzeDYi6G/KYO7P?=x] 8GCk/4$h}s0FwLɝ/sMy@τv?TG|/bQ:n i[:4Z23: 5;DJzX"ȏ~Ҝ4 ?Rht!@|E;Aoz$VѬ\=)_tc˻h1p) ODe;Vk&O+URD}Ի4biv z)+/ F vtn7"}e:=`#-vt:ztдd aO}[th_K)1`_bZuph˅yvkBGա_R傞ԴQ+SLI2\<ȅ:i㟿oSi-侮 F~VBoԫB/@^Fla3[*wغyCyA)vμVԌn5JFq^gX&=FumL2w |Hsd.dCY/fXl撗 juM0%~wEG %c9o{p>]ݷ\JA 9`|xШq#UrIō9ivWBuyY|F-ݨꞻ:8]T{q^e_@Kiӂ598m-H+rG7tY x4/_ӬFǗ{tVvo]5tTкc<]giH@.w СaH~6W2].aƐ$>9a.sCiRrI2~̭='AC&(] =.bDH.ޤp'OKf(nMꢔ1.z FUz^lT"hJN/G|u}u'I%aW ^zYZIAnJ.wt x]`Dݦ.pD ̡Qpy"HYo elZCo|] wY^Dq>v! .8Ij$5`V5'ЯPd ](\p]HQI"#ɖ\KS:hKzNG,E;*ɱ\FdJ=7rY?yL]h}2}w=AZ.JO+2`vϋN&a"{lG(Q/6J^Zw|*A]C=:׉n+az39.NuNmb O嫃~@uKZx[CW^B)g0;2<6=uQOb*(Oj1mا-j^֫׾Fȕ xq&9z y*1d#DqR7Rl&౑L@sFf.OAޖS"owbEh}ɢﳴ5Fʯxae#uҏ #x"M|Y;#]]MeanY8# t7xGhz_) 5Bݣ5e4cOطS0)ӵGrN#e\ k.u bChz#haokFނ{4٤=9`ObЄ@Ns<~D(4˱m~vavR/"SLsDIӧ|7R ہG8*.: f} |_u_Gj -x-t-Yd*d.mʉs N![~r L[BDy0V#k f:h{OGhx˓4EW֔, R>5ZY)ʱ,\#7v_ܫ{/6Ą}%X?Ujy"^/ƈF eZoXWE%w'ˉc=$'C5ꂪwy*JZjkUcɩ{8Ux1\r6l7?'^):ĭG_9kƄs3v V԰{,yj[0o䴡R2ʡU٢kTR>%7M\ܜ'yk3zXlh|@q.]ט6ʞ kL&o5'dFdyHud 9ƥ}Z<y@R2^Z=&Mfݻr޼b2 }ui-~}it>-ZHLMlpON?55n̎Ǫ {KxÎ锆km]4:n޷fA+۾^NN?N9]Ϥ35~AKI~^#+Q;ëA[>2}mY5lFSfbl ~=ܡIO9IB}ӆW -'u7mj]P,M䇒8{7}:6@ei.SY~]HڿKMeh[IoA?Z,X戻rcߢ=KB3ƞir&jb7|3ߠkaG}u NG9EG&ڒR|̱$HZ{ <bz%]A+_>eCZ|*U5{ްuƮq :VYԷ rV3\줖]w73O 1+yF }D׵"6\+jdf k3/:韡O{VX5Cɴ.vI\ciJZR8AOM ރ1^=\{c›e̔ Źvhɑ5]-Ki?Ǟ OۍbV~N<:>qR3joX\O!O<|A&Y oA4J}O'|E6)p2;I?͵'v*G^(&|# RiK5G oj|Tپ 7/\(5Tkl\ץ#s=TU57`O**vn߸P CV]^GGoq/BW4WhH '+卝J((e=NZsT:rJé?G ž#pk@oT^wZd_;oCopI_vgy+j-&N|o\p *n)\> C^b2Y T??"_4jokϔoU_뛒 !OH|o1߫' qYK?R:ʼnh4a]f!<*L%Lu4Yȿ֞ 7}>Wm(~c{78D&b_LB >GLB?=Ԋk5AK2pt=n}!s;it g]vT N,\c/$+-_@M=K=*$Y=9Ї/^*R4c N΅SŏgTѨZ`&_5G„M.yTYN::y_'8]iFv5+e?Dk>4mj]Aޗ xnsy]"$qlOXMHD-T۝.y&T~^y59'riW:vS?[d˄%/teXlx'i9Tb5*Bn1 _ ..}B_)=j!?$Y3jQy2wA>4x6E]VވQtAP2 ({oCqȵ򃜩.:a !s.t_b7t_Js/t!ܞl'zMx|ҿȉ~ޟw HR;_F6X:#rh/bg>覫r7zao_.őkDŽʖ^_.>)~t x*,&T.%6tdT~!WyUl.#Yv rR僮GSA^rJw2ԡk.v!kJ;M 덜[ W.ڠ`]|.4[$]AO],GG j3"=8*rS (+tV2N~gKjQ9Idˣaْ o9CO^%6ғ G?qbZg 1|L&\Z/m!/)]mL'r*<@YsF;g\8bM!a]H.rd,ϫC/X녜8CmlRkSȽ^V5tY?Ræu-r^FS/·Ps}]:ٌi[ܣvc7F{"G=J :Tzp!}ڡkF9##k]*rQ,nНo2) Z 0 i|r`Qs 2o&c.d͘*2kh_bdSEdl{Bv b;Jl>cM3o %ȋ d1my:H 8 ,ǣ>f7jZC]1!8 W梵 /Ta@NT/ͨ Wut֡$77^+:vq}2J ]׵+څJ6/ KjB8`"h1 =鳖 eD[HR@>hb.!MS:kD6 0׺ڠn۪]"WKF^hffwqhq.lEi(fKKy 5j~.b؂:ӄy[tW r9Ay/ίWT 閶WH.՛woM˾tL!:n;م|+(ot01Pb#C݃|4#&hCjk} iХG zƨy7r{Q'O In1iwur~7Xb*B+{]Ғe Ո& =tƯؕy蜩w䒑ʺ3(.>=.#IOM09ad=nvk)GW{k)~!j@'j)۹Jq&0#ym$RCj.k-C : ߎD䨥~ki#{K?Qwl)Gȉr -n[D{!\$ɑ]vMK -QWOOh:?ܠo-Ń|E!R7Nt!e١ Zse̸Ҧt|$i {i9H_tz`Ez#O\։Aݢvf#ɖ<*mvg(j!.)Lv1A;ϮtўoR=Ec:fh閇]9CIC],/^Afh>}EQ]-'FzGɴLG.|hGŋ.KZ{.]oD/TB>򚎔]xFmIs#c94B.K4Rw!G}6Z"|g̔;c^4~(t˨k]hqļkn -;k@Z rѫh2C/r~:ru;Y5>: ب;]Z)#بW3i^sll^vvOzE$~Ay.M[}v 4QR E^+撼tާSɁ;S z(t?/t OČ]&3ZWWVo[Ӆ|ҪCGoiWZE6 h1aAnr!GL"I)!A x/tBn^-fҠS]?a#=)R" yLۑN@<ǡT>A(^:M]͛7r zzF.C?jy^>{Х0zosAΑ/7J}.ucRRnLZ"i9xL#t =#bh*=rD=UyQ>1ץ8* z yCFO*ݠ/HۅS4Ypl^!&F2rFR{ns0C>i/"2MMJ@`сֽ6'MT/貮KW>:rxU?%E:\ËӢcO]څ|K/#ooh0}4; c>׺خ06/2>#rrhKdKH)t[|G6﨤RQz/t]vOХU:rNy`mFL-/-QqZ@Rt|4!wi pˏbdGFo-t M3|y7ΗHa..まuL=SKtjHz*kto)\B1+΄lœNg$2^.cg*tKr#<п5=-*9 0:YF p/r]vL͡uH{Ƙ v/{܀(-Z[zF[]Z8[}k(AHS>u"UZ؍o2QCs^SnN GF-3ƞ!?t5+3Ʃ,.+׈?~}nt4nO |)y;-d0Bߞ .5f3Oݘ fo5Z.]}oôؖ bk4t&vCߗУn7`]Lܘ/w[ '"_Qjc{2 -{wzJvWF6 ;#ÑFM\ze'}"=szQIf1Rw´p{5yi9Ku\O샜FB =(yuJ= h-t^2lΥİ'~R0Sy|$,`T7/-Mv˴N\.}2BϻZD=ـZQ oWƎ,e =8"#U+x'L|K`Y\Zk/Y2!z͑)݁-RK}+зޚ֯9ȘcNUi%:سɘWc;c*JB~'j WMֱyt3Y0It #sVfr|]ۢUF^7-.B#,`tsRhJc9] rЗ{A>*]7*m6zai99fӲM'JfIGݲA<oBIㅛ1RESӔ 5Fu7r =Г#ļ;jвLt!']Jݠ t[N$G[u<\ O7Eۍc>W_# _Д-r7.2^Ѓ2gё`S y{5ϱ_nkC $*tsA7&$Ka-VknW "@'B.醞QQ_~z }iF6Hu`OOtCO.cf%qD7c'==[Liots|DWfDj%u+OcN zOlKZ'h`M zOz䶮%AoUz0.=2:-v%w)(wi-^P %e%lзދVWImT種WmMd7!R̼j:Kb{/)mTۆLP =@-^"B)ܗ( KaLWLAލ6&c;֬݋r݊o-G.]Zˊ8)#iYΆ9]$T:U#\.G{c?"1+]KD Qyn܉/]uG}mxyR}޾@F&/-|ڡYLD{1jp.]|]C+qrn}<%r:5\i ʂd2zu! TƟG%= udǜv]X\_Q>cY%K/oȹsb=z.`ߗF'a0y}oo2#!ȥ]4sm/siܖEsЖ{վpK#]5?>8g ĽdfpRz5EeU4[P詑~Au)r u9BAEOkynoq Zx}RthUhF)ƺDМbG`7֣mєŅq6!֙T#-\L*O\MB~TȬC#cM~\勼,+t[GbzA94i./ӳNHS%%[&|$׸C7ns;];Vn{ndH\).Mbn+t؀-J\nA\K AoAUh<,Іkqc -;A@WhrW-YvU7nY`4r8Ґ.ɽ}[o2ҝem伤wTHoBnF+I^ꅜr?k]AZvs`;2|k!-eޒf\t{69*4cܧ^yǸ~c^b(օZ>[,56]A‘>JExe|G/$9*~BvrEW.~&M'IܠOsѿRB0O[\âu%Ԑх@u0@hfb~$y&# o?Z 4hGyR}']h"ibx센Z922Fj=WƩ;vhr!n?ϣу`_xZz3;ty F ]FEu %1O%Lܐe#[8h Ny"7]Z2]o}r֗܃֠ݣ jeS\w'䯐E΋TS'h9Ug07-o~]VM1\=9~ yH962< e[*:ǥ{N؏9=9Qt#mp3r5W-QtRdIa/1SlZ0_ar3Q4 Ex1\AEDkSdQpr̫!KeD9umϑAS9hF7Y #?.H= SyApu@+ur-.k{Sίn[K5z[sIaсnYL}hTEyE=Q&5#J.ۺd֤nu 8oASC8:"'@_%/.rtA7l+Mw:_v˯L_.qF~^rXKMbdlcoQZT>Ku<94;}GM0 zI7之|2]9l"']GMOꍠTrPw[XGOOJojBA?## ]X!QvA-W*{F^%;4C-ovCw,qva$v K#UW^{E]qSq:.Ofacמu-8Φ4:+sWo,?*ϫ㓊>ɐm&:> yfii<+)5Zy*oi yMH)MuCzty0 I/ }{h\ #C Zѐ|͑2]J}CwWӤ Cql:`in5]<;z,8mʯU 6Ȗ]``,Y/p\/wz-Bu<:=$ `<}t+U$Bצ8t2ڟ >møtUž/RQO%.1%t{/&#:grs]l~2}ǼXko.c祧q'9%F0jt9CBΖ#u Wdt ŕ׈rBB5א zuZlBأbh/M }k%hO˔|b/%連bbȖ=fA.q@;O Gs8 yVyF[$ AV s;5 _z2EJS StwlLHb)uBzR,ԁ:Q\M7tƴکS@^\xiz5GǗԠ59/w1o2pMAϨFB=dEʌ 5c~ӭ]bj4y>JVS='#v狭«ٮ˱.ESC)dr<τs+?z7w$o^&ezǜ }6|Yu uWGY~>0ڌ|2& }5pDžLPԫr_ t7Mk9j]=Gsk\)ͨ} TCA5 :ќ4|9F9ǻ@ =v[סKǥεE$M$mA:eS~)N`B6pE==ƫ^vc3J ܣ` izox(^g h#2H1z6ˀMWr0t:piy4{cEjZhj.VQQ-lѠJ 4//"\lxJu|.1H%Erݺ>Z<;lf;Ou\Dxz!‧j<:b 2[|4g\a/KPU Y{9^;B ڐt<$rA y4dxۏ!wudx`jOWy#=>Qo1RGV >; r/}_i3mx*asu._5t,޵ZpO,%I-ș_pq;Uzvm9oQ# 1FS'BI>&w3d:io$Qt yw#Ǽw_VRk^Cu ~c/zi6 z[~׵|Ӟ45j*떎F'I×}di}c׊.ۢޠ%=U;tJ2EГS+h| ܱ:/"S^}U% ;]<^+bT˸6]0i ytM=fD'w}-@|@{Ώ3]r˓,M.-W^X1:؂~1kQ3|CKnSn4c"g"o IrhwɃh1ܐEI7rًv;9h4iJG^9evono7#OzU36鹁uro:CmՆ}.9;5t;fC2r~m!_Z(K=' ZpT]g)\~ПF~I=[̤' ^b+.ܧ[ ^{Q Aα_i"y|C;4RtQ:Ϣۼpm亚::S .kq7Qz,jh=h+G9QԅԅJ+[c(uAAy~ǵ.OOavEQ墎?d6hz_ mJЖFlEąil޶Tv>`?ÿȓE7 d"]D Ez}Eou;H<ܲt~]q9ȧHRϻn첎͠umaPF=VьMnK8ʰ"mKȸl+ 7=.ސ-}/ }q˅{ߢ5^l^ln4lZI-t!AinslQ礟 g 4Xk-A%mvt[F7TyӑTZ@ߍQ.t o)yQ|kR jΗW_pÖ1.2yzE=V(G#8|^>ȋAk^$%{r: ;ɣèӟΐ)E]p@/FkFϳՑRqIb/:O.;rG!pxГ.eN ]wQ3+ iT2S|_#"qQ4($tcZnFF'R^/kSQ)t )FۚU';:юBOSHEB%z *pbםvb:9QFm:H7/͠#^ǓXrev'_Er#_$Y񑎗Q9?F9#}^n=颾w/sV.侴 Xד9#lRnu4F.hz],MuT^ic4Ɓ1ٕ3\;_4h&䍗LvK %FvוiixAO^M:|bbob@V{Tc` (T b_Jf/4ul"KR4Ոt _Ҩp?WԽLG~ꅜnG\9ޜ Q#it{4#ȕ:u_5>^#c"*ozϘo:CDםwf#OГwc_x^[p_dN70iE@ uf.[兹!H/# è60>-Ӭ[g#Iu%ء9N1fS aJAO>q79Ŋw Yt$`ڥ]k0x+^yW%-xp"u:]ЗzBs̆HE_LMӚhIdlix^tM_$VӯӅ{aA`䅝9@wv(E~Д~)O[.a }^uA=:Za؈\.I6hVEݥ?2eҡn1rt\bXsFBQcwT(|7ts3?Fnw9nȥ IG6?> ;jSN0*rO.u0ZUڅ/6>C1tqEf;WG)){e/Grhl#Wj-7r.虴;]$ 7udסzcԩ .CόNf.傾u̱O1deN=2mӮ֠]7r('!ڰ'c@E];9 k1^Dm=fs+ }xA~lv##< oK~;A3J&+ Zf1HK+ӡ0u[ʌ@gJNvø wherBZݘ&)vG K23腦_@:iU X2l5B-ÐI%Y[xTfxo*ܐ_[dz:/sӢ#ot|$8ސQ zu6 F=#~ty3bIrR{ql^u.}6*_T٫VNmHo #ܨԑ8/j|F $ktA!8+2]N1 Ex/#-Xl@ߺi rS/N q>w [a5I;,"4q+vOhשw[h2=r|\مLAD9+ݍF8s.u |&wFfғZHzaO:谻 =6ӛ @'NJαF XTF'\SpA߻hf9DŽ*TtmU^jvdzBotal,&vҺ1LWR( R:A!=toȼ˾T_hH컀c~'ZFw=-4;;wY.OPxUdŐ =rayA 8%uG mVGǗ:ݗ5/@IzŅnrװ5$^F]~jmMb7t =ߣsOE2Hq/ }kHkNuizR0PFi$1opv# #"=;8_=Ƒ6nRR2i= KR\ a$;Q׸46 I"q3>r'VJ^t|JCb[:58M#E)W#MGƮa1rBI3Ƴ -:ꊭ{N}zعOޫb+1%-XֶF?] Yqw_eotoQz;]C_ʪk7*ufٸțuase 9?)6h :,LTTRm+ >6s/ՍX3ngOOb ^zMi!cp7\rc]:ꗪ;TB`4 RC}*t˫uɍt~]@O;i- m9b 9h4qZ ߚc_tmwLwy~=-E*cC'][oI}H:GU~]]c ϰ麩skC3zn$3@5]^WUs=h.?m B<:-${wx +Q=%bw𜛀 2A>vD/ozIi>i^o H3$SHv+Id}EW)^k`t˨R{ks2zPz*% t!Ƕ*z3S-繱֥R/ @?QheunVoA ':i5.?kˋ,\r 2y 1c/ޭ8n;5 5)>h 4B9ilSZψDj_;я<)FrykhRΤ~>kIވD9BEE!*6+E(SC ן.Wetyth-rOE#mМ2jQd_o.&F+Jb|AB"2/;r9Ist^/u}Gɡh[쿠KG g/-l~izz+T.13R ED?Q荼@St8=#'yAH|D5[]?K/͡/t΋Pz$mw҉؏(<n8 k :)-+tғNNi2)^aOG1G4dWZ=by$?y4pS$R~,G3GU9N΋ 1̤j]CO9/뜡5AЅc /6&-4?=]S]uI|Ŝ"G Htg g(Т_u$TdfpJ>A.c`.#ۡ?vGu)@I-H?jtMBT{qTrN w1h%L!'zM>A^CfCI.:!W쉗&+mɫ' ixVϤLKDx,?2Vb>iӔJcJ$˝q]ۺԓ;}S`oR*I|%^ڒ.Љ˳;'`g84Hy}>ߤ^YV _ :# %Fh9zgdFKڝ-[/{Rl3ghn뺺52/%KK ɔ޸O9g6` mS gCZzF.azDKeCtG1tvxJoo,atqz3E^aPI^vݒGn,#&n`:-,;Pqm=u)4֪@1x{;KE09Ĝ 苀4h8^E{jȤsmEQ*~]rTuuۯғְo_o裃ȣ/P)ȣ.5/uEGbO6p ;*1o:K{].hZ/SD67O)7@mFdq7r(:AW[٢'J"~A!4 Bu*C$47]>Aob uoW x]*˶h- h拧A^W."1"!]lOtyjR2.U2Hb\FS@4ֳ5hY뺚 rt`h6T[ZFk܁e" iܡQϙсQN#izMyᮄBSvAOؙ ސrB׼f eK}]~sxLVkҏ.Q z4q{>h1q&n/.0&izN/pG79构TVS>p?G버S@uи1c:؟hȽb3n䲌kQw%I:Bqp}Ѥd?討RIK@@G[ozZ<5w7p ZRyp1 HNN_ /!f[b##/IW!h)MXa3u{ oϬKrҺ<\]KR܋*B.yiI.,z$2SvT.S _3 [Hgf+8DR`=]6Rc5_@o~"ŧ+ @>mƎ-0ڌtHh6*}XK-cxx_/Cʣّ_$[U=7]]t-\H3O9Uإ+_COwзKSh*thK2;^ɰrƋ9;Վ݌Wgq9viC\x7H9RF%f:1ҝ\WoIF-^X?%A~hw<r: rs.zKcxx?޵cg/b=%[%胼GC/M3q,Y$R9yx?Ɲ"-Ii s0jz X؎4"Uj ^0U " 3qLf}#f3+{|N}:;ՁlRSeI_oQh=ÞKzH*8:BEn dk`kH6~#֡Ejz<ȷQ#hݱ?ȷ-0:ϊ.E-mxzqtJ jc`K܋agj7zVrgJc7('Gt [jVC4r)$acra=ݥ~w|" ` ץfe Kwt`$tn)*)#Wt,v4ڹ^W~}_:y7 P-yP}#υЙn3\H"kx:q{}3Rԋ_s]RxY 3O˼dѵD Q(2ꦋ\g^ܷ0"(z %=@d5ʨyz;;ȗG]1?QFhZ$y{z/9+w Gϫ}]/sMl-d-EvR tRA޷$A\ڭ9ذ9 3 yzG59r9-7:n 9-4}CEuHHkCF*yVt|rN t5J趍5 _Uy @-]M1Oq ҭ =RZ`O.5q C=-G^G73%Q.1zCyK<$paGS 1.%C.12a=u YW#45 ͞ J.2"il?f-kF)F$]^ ğHO'_* @/" uuG]a>F+\_(܏yx C xLsZeEZGCE},E+npѥOM\}w,z} ILO5ND)>45ry7Y9טe&79^z==S;.֬Zd:q82֫8i7Q'tZ]EvZ`^u4@._tTh#̛ܖq{]FF}ytC6m't O?I_)4^!עGqFV49zF.k}ˆxQ ?jS^|=u*n|όʼe/'t(o@ߌWC纴QwXQi hz1_#w$|@C,Uwtz ߜ.ydT7-1 -- ^2vY,0(.YWKc7,R.|םy3sv>VPhGy1Ũ>.E~H]&.Yl#g/F1nd y7Iv1C*€ ]5fv1n~݃9 ;kKI =@9ki=-i2AE.y<)g}FpiD>6ȰM$nY1"߂ {͛m/tn7:p^-4ʀni?,.ۥaw-m1L+?VP .<1y|<YD#>JENQy₽7zsJΎDo{۞fcD;eiKzcQW 1eFZ3^F,RdBE>HLjRin42܅=ңAs؁|^/`Zv_p#^̢IǞ6hQ yC,JGQ [ڳ ﱣ6l }.KO|IV|=ÅWV.qz $K~?C+x|})|N]%EW}BQ'hN`jS 6rY#[{u"9'?gM/@Nwkhu5G.T輒fu=kpgs SSNj@Gf}Vqynn{攻o\ڿQl֋&9]Ad^$F=sTG^$Al=u9̋m%^jB{i2AnPw`5]Ek^G5'ڣ&Нҕy$~ŷ^t Mmy)yl5zt<纜G)%ei=^]46ۨ B pM5'WjsT5#r,\PMl:3ߊbn hIs#z%RoEZl]zvDǢUpm>b b%~ZAA")sɹVZ%*Yu!LέVzhiuq؊:f\@&\i1<ݯeI ~}Ş˼Z$|>Q]f;FIB k]=`穏8["0*μp4=bx3^ (8uG1%g .O }NЊݼZoM1|+wԌv:wlQa:Sh}F@x mmğCk/"W -dH4/fZӅmC5^^;&z ̽!!MW%hbs?s S'Uh]]}Sf(bEtRJ;^&ސÅD>͗"iޯ:)+-2_S3x";}ޑZ7o-Ҍ vtN84t3וu7ˈ*?8 LqK Z~mr~˻W +5ȣN.dMJKv|\l2:2QFN1-BzKHuZDkRŐLW})&GZ ^Lj #%/N.r}QsMQ Lx`i&;Wb@m QSu'\z5h"{"o,6n-+t o􅑟QUݰIKUrnyS.QC{˃gӌDwޔ"% W% M%F%=k}KQ .p^N F9tS' x]MG 8w/Xi(aRϐ4{Ak kdd?mj#"*]y ?CBC+Z˺Z%TN=vu$Fz-1 ch^^J?tTdOFi@_RYuIw>BtT@|Bo1}-92e&#]YvD۠ǁ|zR/9q豿Դ@/RIKF |m %\Kw^4|f.kUp/E.R'О@"C~B[v:`wt^.J9 v`5@u - j5+us+e]('xzhW7"d6m0QkWm@n)M H^mΜwD.9U@NшYnHsmS۵.sVd+/9/:r΢L"Bס] u n"mpM[tnJ,Fv]&zYt%+Sy4ˀ-L-r 2d-BІTθRCt*nn /Twy)-1蜧.._|ę5#O/M>Z޽Y5y*^2o:t/^tƁ\^5豋+;s/yWe#dט]~9Nΰ#^)Aボ8ץp#}ۥg,1aԲ/Cȝ+2ޗa_š륒 _ɑ~{eD̈G{uǢ7͗m@eF72d5Ejqy|g0sfiMT ]/r[{ r ̻<)V&^yi`5~f׼zK}]uˍ%vKUh9J?9u-DNLGR\$]葻 n#׫;Λ@/j=ռv陹N\C$9 ܂s13.ߨ+'^(5he-E+TdhYѐt'{-Jc }/@?C݂^C(}Q/B}ޏ#"(r*@oz\ޢ* uMdpㅊ_l>S Kv!6@nDBb.Qh%fbuQG%3oY=i"V ˙fO0F^c%M.[K.9>r(.rAޯ;r,יMf]@*yJ]9 zXL;/F{LW@~II>"c)t1 μzV׌̈CsN[N5.mFHozFK_q'IvH C_LJ]ط#nTaH:墧ʮKrNK C'z-6b-h%#^?%ykD+zkgװ3sF׌:\`Bg.9vڮA`QNuvUhDZ]bkTh=FG4 uz^l7*!3_eliG$r`ߝVr JGi6R}|BT)̝YW'6' Qо̮| 2/$Wċyu1@9ߛh%Z 3 (@\N#Vg.rrn/u̳et}= >?5 mf=q b?Qq.Q[ܨ\F'xycy]>ͩs!_=vf{ʎ{q̴L $  ɣljKi@̹䶞29v9E?QOKb kis#,Q)З >&Ҧq@O]plXd-zzj̗C0#f2pHJ1ݩWF݃+;[m aE^c`hheh$4 )(BAC.E/Zڙm`UlZ?jwdTy:hM@9zTQ"z|C|@KZ!ƾ[R[_GxFVUj;+_veY.#VƶU\,WzyC c*I/~AZ'*ˇ)nrιY[ϼ&b(M8K(pԼ]5b}{:Cl;):Et3Wȩ &tO˝]3͝k]7a􅝢>3 ݦvi(؀tK%.p E鄌l%MZWT:tg4]54# %ɍ~pdq%|(n{CB^[.r.7EEHMHkt OZօκt۸ϼV/~bMWJ7ZA>{3xDt-'@.!h_^[Y\t2_hbt+.e 8cD syM`tϡ w#55՝lz`M6@ w_c>!m#b.c͵fjdbYJҾ[^]Qv@%aԚ@sȷ{pEFyn^`+^ydRSf@Ov+{*w$y?S0q}r@OAڑ[ܿ4iڼ{%-*&WDohMNU :9{G &3uE!FDSi hw:}ˣhйvvh1c?3fwkLA?F9z:g+#U9QPG*|ϸзB%ne@gA/Y9&gzĩ?.$7 nb;el^B.+*خW{+QW4t %Ce虗'`(Fefb4+.ؒ&Dsd4 >:4r<]~1q$lq@_h{j՛?A{z?Sɠ nvBwKC*tYwKbѬzZG칄)s\Ke[ꁝ)-3 ҁ܂g<RzzK_ʎ\7r$rxK ڞ^ H AoyKFz %R\,h@ ]/ 7ҡYެ;C=o}Nѓm#:}>RHi:Zh `C#y ġnKno 9)H]. HW I_G޲EHGN$'<k_# ۠X7pv3] ;?i?sш/V@ޯ&wE-v F 2v׎_meKHv1˜>G'h &yyRՙ/tdI U+/tRFUp٫==.{ۡ˹_=^<~ Ks.`9tؓq/=&D%/i1 TWr34$ꈹoƈhlE^viC*8OcS!CEiĥpLx-#WY2-KЄ4m \bBW֐|z& g$yMyM?y<"ZGmR3k;`H3eiY-#lJNk^f\]/reVvTǽ\sΞ~4E.ۉ.Cہ -nU.EF:Fo4z"'V].7jEʚ\\_ӮG4v @s>@>֮R{L] *~ Om}Bo]t=|{KVjI_mHǙ}.W/fm) .N'Ejfdȇ|Vѩ-H2@]\]e]bǨ AwѷXǫ]QR^:CEƁ F:["o}0dcYOu ѡS]M~/BLNd1{ITWŠ}Giu[˧:}/vc+I?e{l2>94}:Q7m>Ӻ2Qhl6Ƚtkq#b.)zvowqÅ\z]i:3^]Fl67^J ˰3\4ܷPsm=FҘxU+5y F郼F4"ÍCt˫~ _^r nL+8ZH_*U={EpQkKqC'kkTW12 y}Guu2.߀|d XK/T쀞J@|zme/i~ oSSȑ<ur1BkRůݚΑ;]aeD?KPu]Da5'k1ͰFF _-YbxGt:2AC nRG˳BK/rjo.LȫԸyiv"2f=-]:6"?C-p]+bu2&Ş`_3Q/fGQ(G{"'^BZ-r;_zO 08J-|٢dUԣuzA1pH˴G>~ouwex+ zZTU]2 %gmOS:2z#3&}>Ga@Nr\-h]Dp^Ђ J}GB&Qm;ZrRUD*mm4EЛΜcR>F*t6 05hIZ7E.s{@`'~=v/cykq Zϥ8WCZzk- Μf?b[FS[W^N̥r黌:/[ѠwguH}.Q28\cP ]YGM3w .*rAM:"hk7=tץ.I$(DEWeC>t|˅<w,MRN>5VIɋ u"g;ϜeT*B]59r]Rш脞tMq%z@0Hq"صe!Ru@Fn]L|=5$gD{.tw⇎/.KȫwI#Է,MF#]nkc3#sue͢_z06j#i#EsVgM3xIr]"Q'WIG>tbzSߨO>Tth^\(5]m7 |{/̀1襮r{ʤՋ@L7:oɋM^ )THTZ4wG4Jwʿ{XT䫑%C!5]B'Znco) fxic){, +e|D ZDg=7y5O403cw%w}yQ;Oݖ@t>~GJЇ%FOnNT{Ky<ˉ\3~,.(3}H=riުj#OKݗa_x7r AOڃ,Ei]=]=G=7BS`jH1vI`v?|cQK-;}ZXJ/guGޅyN^N|pjG\zwOt5tQ*\=W/v~c5jȉ^u4kqwT:w7ukm.6]9 33v7ȗi}t^RR6՗IRo2Ћv聽-L)[e[Pb/աjB0f!Hb^};y&>ygNw֔ >(KBhY.yD%3LB:qSmZIFNT諦3Vn|Sou:a!7Qy2ِUR! BNk;"%s6;!ߒc ĪFپ b׫& U3,֙{sxN;1=S7>"d7 ]b4z\d'TDق Rx*У[ib7~w  FR3QwlR|9#> (2xZ^ҧҿGDMhک0t'3&ctuheW){Þ).Ms\7Y|>rB \ w5 *R^nbr>H4:UX<1`tTcFƞW2s➻u'{yD%1jeS;W9WmЅm~נ\ؠ,|#J4w7jkA2 d#j򅒆,_{\:tz+B>4QMg\\;e* }~c[,R zR)r,ƭЫ-#d~: b:$v|Ҙ̛RS;ʦ7jܟ+aAt 1OsICG_Ԑ{~Cl Ox?k][K^o+/f? [WS>tK5O?y gU>qS/;tu= K}}0}awzɥ\1^M[Lyo[K5I'n#h=&q {} bA/Q/ck؊om94T Ɍxco"L~II>Mdzˡ֠m`F|w'vw G U?طLԊl{XsBs:F.;N)r+].MHoe7/x^VlmW?~d3k}k 䤆r"pI`M)IfuƁozʞ'6aA~_7n4n朆4zB񽱧Lq>vj߃+7/wH76oԎ?P 3Gyϻz@'e鍾EK^.\[ ~PRk+qN^O>`;Fz\{#;Je)?o":S4Dw L 7[R+kČ?;rIޯ{]s+SHtkq^݋.K ZeG]/Sg`65Ethu)Ak !q 9% Py2mgr0UTAɲ\N2 v}~{ tsQ2̵'zZ$5|Int:K!עCoQ]mx{A3F3R .:d83{[6:67ȸk^!<+ƍOVrkG@k@CwZWsp O^=-s/sWȅ9Ϫze5*!8 ?*ܪA>t u}# hsX3orFmo% =úOTa,w'@oqhnչn/DE:W@{7^p#j>]d-[:u5z%颤?%ŦFDA^{.<몥wpk癗0 ک^9Fu2 X}E;{\1%Zu~@+w/>Dn}ְ Hf?"w L`IdxoQj`$UwuHND]{ ݂Ӝ ]-nNTW`d3{'9Bu9k|@ˤpq>?QΞГ'/Iq9h:/L}0B659vh|"iDgN"'t &c[፸q>݊ߨw/k끮48]ȝnwX#[ʲ͸v 0QKu/w壠tm )}-~ʖT^m4NBbZg^J]R@^R `/@nCWk4\OȪ-?ҚZI.kҍ游0Gmɤ}x֢-fr2W_q㥥mһK|i]a&kAE՗Ӏ?R/WPKA${t#a`{pGr|mhE?sX!wfzuF ]EjĥH_1紑G]ہ-Ђm< nW3݁[ly%C#t^f6cZk(aNnW]kحQ_N kKVz. *r. uJ]3b GLՇAK<ȳc4]% =23=WBG?K|{斃yո*ɉ1,utn5&.g`[@k 9Xd\׼~[H6au_}tb^ ȚAN}zQ&?b@'N=t"ξK=sNHCz;]/Ӄ*q3ȗz~@kM]ksH:6Wzi=B#AGWx"gB״6x?s%xCGK}{] Վl@f{ vSZR .k$1#u`l ⱋI ϩooQ zv6ЕSQu\#F# ԰'<ꁜUt/\c Y7n_b9E*m 5k,:ke.|*%I5V0:r-I|[C_.na\Cإ־;%.x}A3?Gb?c[n ghDK-wq`S,''sŒҢ=}7EN%kR6zB/Kg_kCmAf4*!Wt$~'`ȟincw5Dȉ+D82f$`+лGI?Q:]6J iT@.Jouq/G5-իjr @ %.?`۾$P"[孹2&.rRz[M5*jF!<>;C`C7Tځ\pk3I# -^bn+R<_hz רj+ŠiUVcDȢFnEg%r. =yޖLJw.s/҂ +xxfe@>h7y]Ԡ9Y.V"b et#-/_頧YJFy2 mts3|>ܳ;#x>I/@šk.3ȩDW/+]tm;43y$}֢~~~-'jE~Gntut\[R╠ۢD9[} RG~qjF^\p:z teeJA.2m]7Kͦ(mNl+Ck\^=uS݊V+ˌ{A|i7h&Hۂt5-`̹>#U%+L-l;C!#'t@ked詮+Ƚ fŎ~?nF\/@ h䁴q )W^)ōn癯Qz޽|BPԟ7#5dn|g8Pu Cff=2b`p=f^i(I=;U'VMAgbX.RwK2_eդFv#t亨,\9o,uĠv{C[߅39U:jTX詓jöbߌ-km)Nt(J%Z0+y,GaAֶl7]j  u!E2rU*ͮޡFjEQ.b8XtzvnJw}k/認;u=FRߢ=zk~ pKBȭ6ZUfv(;uA?G0t%t_Н;7cГƞ/oΖ ڗ [$wB;[ԴܨZ>]IQ{5'-MF3>S({a@KHw0'ZޮcKA>˜ig$_qtkF{mf2v _EA 7\>"0.q?]U^pZiCgh(@6{/ܑeF.I) -t^ T7um t0k4UFTyk|A7h]H W_qC֩omKs`Po3z .iWS}1{QrkCP&6F~io##x󫇗Q'q%]X 4(ЃKQC[L^JES oc p]M,$]G%|MZy9]VlY1b0bqQrboq3C-hcK ]ը %J a(F/k5rjJo5^ =JɒzԡSu'遮{ޭ^wy-[u4ҡOyr\^ǐ܍;{᎖ @K`HБi/t4>^b}D+4S^JGwIvkj>D3h%d7r@d-y=3) y*w|N/wi=9Q;ۖ3voeu~ob Yw|mp|mWlW˺-p4Yh KBw/rv%-gC1AQ74#=Ɩr 5|ˎ7jKc\à+#ob*>0.WsMW7 _3^6axoQ:Y]|\u;-AKxS;tcwȉ|͠_[fmrϑt>k$Ŏm^ewƜ]A/IBg_G/5J;Iėj@^/M2w-|D 3suHȫ}MehfDi캎cQ^WۣBוwѻȷZ=Q83U qBWJ+ˁ +^Jz)tB%<=nY/5n^Eb:go^S/l qYnK5hA{CewDox|z[[$ڡ]#RR֡#_aз'vf(&t]M;#'}wl@H5>R=;B:r!@vM<󿱣b/o-:q䊔xy:4Et~SwYR#Y"ہ\ó9uFqل\7 wk]u9ke*t؉⋸:j;%%Sq|yNohiQ[,2HUkȉ "נ}$$grь4R^c2ݗ?OZkityp?%RE Vbjur]ԠxY]]Q rl@bE>_#zk{N_yc0vLUC}|B]#X=I)n9ezմ{ċF]43T>2 }x}'s}u ^t f*x1Fv o2y^w[z!mih?ihOd#Vv |i.[R0rZ=ӈz)ud"Furq oQ+؅gv5nYtO}s=Tq9]:o[g|2b[v<iZnfE{;29 bšW.ȇ^ $i| # ΪdI=N/ X񢙹`/3&@s-xw@ʁ:Qgk~#ENqj:t英\ۿ+ƀ6m6ԨǶ69|"O(197j%/EF@ҩC _]=*tn3ϼ[JxDxCzѤ^)F\I}ji\y]dIrb 7T. ]ւaO^ 0=b/H;};C\[.A2&תNt-yoգB~}{´$1.YSшUqҐx#/RDh\,]w(;Ѹik>ʣ1Lmp y/ 6lxw6npt}"]bioGuGF:}S:pq`^(iZ2+˵u(XOY%^ p.CeH::uwuۗ.7REˣjYV %R.N PV@CNt 9z3:/=1E%JQi 6$R~d$J>]Ndu@ }Kf#t s=wг?*47/wSZ~o4{u練˻}/8ҥ2k,)U[uF.!U|,y$Shq/my;7Z=S롏Z/A}&*tJ[KjԱ5Vf3BK]}ѻEv{V@>3EOڗV>tXoeW 9ŕG>Љ⊁g3/5RǏ;`$TS:_;`5h;r^V(cOZ$1"eq%XG[<;Ӯxzkx S/Wq5.Ktg&S;r،,n"ݢ;k܊ Eh> M4xFy"_|}ZRnw\Z;)-إqmIJ v#BoK؀E'1zG:iT;^41_I)hbc)wM]ȼ~s)]@[;>RN#umugթ̫|W'ukj]R)Ebףu\Gb6@km_m1AϽF[q@h4G#J-z '~/z\C*}[LgMylCŒL-%F_-W}"xof*rCr0j" ӄ'.y5繵ưHM`LU s)yT-#ypL]y\i ("Skt]m5I{$4tK[LD*ryC/z/Ǭ&+#Vhv1)ޣw q, (1@yg[C>sR {E^NzGU=FmS =\Rϑ4]E$z <{t7rhqA߲̣WǨ} 3rq?DG̋{6v-ď\\z-hVeQ4X+F~o^5]yjϡm .59]eu%6^]?;]kx+Cvb7rN2 =Knt] '/d'0zenrhYMcwu%)#R==Fez^Ay6IW8^&?41n ! 8zx9u:cwsAlJ N?k- zݥfvc԰_UMtudM{%=@'Yb@/;兣K3Rkr]$&h]Awb==UKu@^|]\QvE$-IFKz2&klAX^/9xat&X^y8FGdݟ0/yNm?Q*^l#g9jXzC^C.- N"q?KqÅr oO[̮N7ryKehF({J3μ-ͫ[/\o0[$-X+!w-f#} cԫ ӎ,C$C/$tOEi 0r˕|YoTK(i`|[[啩.:ْKzYZ^/1 3\/*];X=Ⱦ^%b hbpi}}wH-XȅCD]SP0S}g8^4GF>z`r%/ȅ x{OyF?||ϡCQ n:9t}jĹn7zZ- ޑ:.>ݰ1)`?i|rCQSd1#a ^F tEZ>uYdHo|>5Ҁw7^FQdZwL5[f 9g5F` _WhA ,zc̷vW*Y}[45/?q^2Z 4DK2BОXQc`ҍ<H (_JlGLDTl\пboЫ.k vK=GsK ^Q S_ C3S۔yĵ^EV/>A6$uyOg#5c9|Q/iC兊j+JulhpNUȃiKWdh*.\ %"vAeW[45y :,~E`*As̩zxUbr3ʙtI\A?>wͧzK4˸ $y5* :FM/QG>pUn.$1e6Ѕ+]iZ Ҷd]*$]Au/!QXg^B4ό[toGut@ 1^e]V2p]?e&{.w~>R 7ƶ57ҕghn`BX-Qr#prݦ&k(S v`3@E_5B].Hw?$ذtl ؄4GA^1/r;4j'Y 1-JK;_9Z[QW\sb0j3m\E "/„"p#ԑE;^SWN]S腗^>"yE>C=Kn5Vz;yQ I], | _+ɢG0@Փr-mLC.c^{%M -"t t[{q(xf1tIM{K\N|9e|{q_-HƮ M3zŮ*3p&l,yR}u5,]M_%#@%uz!^b#_BLy]2&|gco_ʢBIF/L}xא. (z=_u1Vs]nݾX\HOϡL^:1ˍKlmJbnAn n ~A߼*iZ"\lؚ3xq QW\]+uwT9F؝w!]i 2^z|DGXCw5i G T轵 : KڝVANn4yD W:K-nh<>%:/93r}k#5C.BkRӶR3mU=_?OUm'5"rwu7mEX.gqTſ/Hoz!(G^Zm 0 ŅBǹ, G:B\; =v/Q{ٲAGE,@7THkqCvAwe ?NfY zKhnKd>@NFNinh ﮭ#wkrMYύ\5>RoBS5GiHQ^MeQt׊,|lz` IrJwKWHǍݿػ@ 0cؗЪ]TƸ5)vAa~ȥ/*ămM H}&5vZjW'cQzH|FFV+P,$n߮QIKCgz ^\eY2A z#B2Yե~`sz d'\zH P\oi1xF"oL]^Hot`VH=i:jLΙN-K]R{ ~:|/p Ɏ2kQQ x yrohyk_rh:ýF}zl77rDRrY,DW״t,.rj7ny3Cn])7yȑN{_iW^hkݨcN)7^Á7ʻ}5RVI1& tc\K kdW<Fw ȼ6CϝM[f2з|K f+a ] _:颜g vRe, kEQ5֤=ߑ :I%ׯ+]9Tzi_^oad yghB:k?G:~wI?F+"w͏E_~twfZZowc<2$~ *9^ecCU;ޖ v Jcq9r[t{v=* zu1촫q!5׭&IϳpT1ZԹ姥:Ь4*~Љ' |H@ߊo7_SӴ/ ?2 [ 2C /rd$a0}'k.]֍zCW|pO|wįĭ»]H2:e@FB^fC.. VzAþxonPq/V㽟^C̛r.%ҡQ>x[3X׌xIBС*1_^0 r[WsJy8Lm,Wt@$YHBoIv}5 YtީơCe 9 < .yLo"b.)ÔKuгatXrNRo>FG}5km^/:_cӊ-"+oR3hQMSw:zpj;\l& 9wb;J*RZt%=J7# s {8tݳt[ce`0_myIly `@[?<)sZ9ə_uu祎0<ǐQ3hf;ҷ-i=hg-RB7_8;vɸpiQ*u遾zx"N^$Cʅ3򍰩]z[.[ I/=# 4]LTD-iuuWc0*39q][SFk_JA;QO$6r!FޢKv4\J_\c$Ң´3㺐^`ODD 1c+h}zgFXi.}G4}97A+|zsJk]:bS.j:ol#cF9*.+m|pr=M?k(Gb W]rq]Г0&fE p6ԫՠ3.G?E䈩:w:3zl4)Cz]=M_kDpٴК]5 #|iK4ԉ2]jorE-ϩKd0;~t%))rU]`*{ $ſL&)L.#c:-tiHoqx?}@G{Lufs/ө#KwJ4c{ =ie/148m 9^8:ڮl)l3i]>:Lyt爫])Yim @GD:)6ukoQo^/#}Ȼ^ݍ]xQy^8 V?Zϑ^$׉tJj)4.Y.e1ڴ@gpezk~"OKC./Ά->vz/{A v[EIE?3"x3ehw*vCa6}Eh+SqqBdٍE}ȇ;weMIvy{gV_5|ø!!L;'PV`r!YuA.ȇpG#-U:6ߢN:⑳t-MȝKJV#vy Cytmy]~T E-v1˺?Sua;/_.9!hIwVn-Ҟ1 gZi@ޒ'݀ r}ގ#xwԓݶQG/(#K׉˯]g^jzީ+n井F#HxfyM>ȷi*vNt_w`.v!Or rҵvr{Q潐RȺafz?#tL^3 yKꖾHQf&7ڴ=m8Y y=|bv3uieӵB_2?)؇-S[ /d%^W3hL{S䥆y,=&#L|fgH:`t qHBvf 3m;^UWyWgt@f&8f-KJuiт-J)^~#M@g_3q^$WBok FGGF{ݖ |2n{=BT.6ۤ234BԼFtTctZg( ]mIay((nTh:5-{ #^_mczG'tF;ȗ 9J>5>}Cz9Y6[$n1^//#F}{b7r߀ R9!`b^MOOm'E?wc{>e5wH>qނ=<cJ&" 0#*6pE0|bޢ4r%#$ʟ/qҠkn`䇚!} ꜢH;?Nb yQ,FEVwTlv{ ]_j[t?Mph<# d@']}@}4.m=RJݗ1Tic]ڦ]g;67Ԯn#u')=1/]nkN2&_y e_N&ȸ_!nHi< ݣ#:-T-=ݖ싃bz1Q.-i Fm@VO!5*tC?./]B4@EndDY|M;vWd@AbdH#vD)k)68m8йJv54.#AT]kv3va7ӗ=/==gڶBNTI#AuA[PI: q؟- ]5%"s"|zCJ$&B1] =my҃|oJAjz i-}45F*Heq4YRz&m/ΆAN3^` gE=Ư+v$_V/c-zV\9K'?oc5^L/FYs{ Y0G\ S< jm NO#XJWnf{0S1Ҁ@ϔɝzެ Pb h>㦑==󂶕`m[|c]oāB;qvIr9OW*ITqcI@o]M[γ[e[T«6Fݱ9O[}"O!^2`T&P|!oqn}i>Z.)} Ǹȩg<\:.5;x2"]S 1W7ZFGqk>y:`m #]3IiؖFmQ6N'˛`ߚFF@SWo?5&л m;Sw qu\Eф^BMOt!P\g+KI0k^\`9>u8Z3owDi y7礮lb7tSF;]oνk{9sdz9+$ tد;ES,yIJ 2/oȈ/B{FԱk#93Q tÞy}F Zr{D] cI쒴%vP0Z =g:gQzګ rLM48[í#}]Gǟ_Ҷ8UcFUjmm)]q,gGNup89VL!>t2afq:0ѵCZP_ЭFzCT:49`-rs=%/K%94nꛟ#RV4w!pO{ whϙD|[KO9:/-:]9V5]!L̅yci+3jt3 n\d [iތSwl3(xi5 u0E/@|/ΚS.Օq3FSbBpP T[C<u9/r5rJ'o߇^#ҋ4Cg dWf<طk蛱 (z鬃2{{H׽ r 9{z8XD.m5^Ct$ ӡ̺hKycC~HW~ǣ"tڕ~1])(poq&AϨ25*_SL }ףScH%f9{qrջckznL=z{>pǮ9=m`o4Cg)ٖ^::$w*]g9m&a٬;Ѓ]?^[btct%m<D [P^q]2"ƞxu!_lwG}L P1[:?# 6F$lW1 ܠ]kT>+XeV >ڟ)bdJv!Q|D@-ٳmi%ޙÀ)Gy7h#{㥭uuVf}JAxxKOxT]J zeBϩn1Gwťz@DB AL׫Q͝2m{6B9=kHS Zjt9sMW)URlyDz\(n3xhx)\ʟH?+0Fke׻ μt`.ԁ^`oc@Fg`PIۺ_8J1#1'M_{K|4ϋX0֓T96Y@y t׈JzeEFG絁Sp8KEM|!踠ztOZe#]-BwAvE-t0 =]PyI!C#OU|,-oJ{=+ڸ y3ϩ41t3ιnZ:3 ܖ#`hՌ^9uXS7Ӗ\Ĕ2V_]7Tz]rJ /Y6$K vw޹⿲ͨt#:/Gs[e֡RQϗ z> 9AYCc˾sV=E3l7}۝d_@$`ӴaƾMzԩ]i>z1BNNbHv[NY3R6nXͦ .{wE]dzO xC^#,q3z)tSڐ]$>+{[6 y)V RfTB%B$b^f}4Sױ-=懙# teN?e`Qu}/*R{'\QdHՙ{yķX7V4CJJkg^?Ok}o MrX ȋs HI%_d";C˅U#Ŏ׾w{T J_6A-AЂ[if;-iMaÃ{8yՈWGz#Uɀ(ad5"U]/µB7\Z*J[[ d TC"zv/~3BC Z*Ŗ70RgO#n zbF,ki #2Aԧ=XC82Fw"^&dKt^tMQ|*mAdJspPM|-'DF>)Љi LtpiݫŕOSzK͎|B.oQץ!}ԯ@mȝ7y/=kO1W}ѳ>:E0&J ȕ9IZ@YGwl{~_f43 ?cXvZȼ9\FKfhq]*I|4jsݨ6`)>iDž``S^AF~ZgHk|֠=_>Қ 9tzk"`蛀 4rbv3]Zn6ZXgd]7^-܂"=!+*LuWι R3Q8䏔naSf-,Zjx!Wei`2Spkl "^Њ)u#aKSHd1IAH]Bcg/i+iʺ|u$PSInꞀ)r1M%{u:{T&tQIn-F}꫚>5j4}t-RJ_n==:{a %'⣸B%>[Uf5UӍpѠzI mg.ݗF n7Ҭ7#ջ8~'-O, Ft&ts݈j?VXcl©5~S|{|n5/nm*I[GLit$!A5^uFtg>C47?:6.[}T auyamvAmw!o5(Ř^ё´RksqvGLrTdnDzNv#Ωo抗BaugO7I+|/w}c*34{ vWo Jc:- ]͍nr7A7t_닼lA$Y5EFޟ<@/JftA%j㦊=tZ]4sB*u3ʒb>WST\̥ z To!?%\~\eϩQq@cJ|"_$nD} z7!n oѮ⫣u-9\dh!)NjtCO4m78{Ooɧ5EzE!Ľܑ)5_%SnDWrDk؜.n=̍`<7|tנyA -8Fe 60n|+ҫgt.h~KzO[G2.ץc,;r-MTxiKwWtI9^f tzH:`֤N6^F;akcAz:v7T ' "]rJBo!=+P"5hyn9d?9.rQEp~M{uok {(GyFz$AD a* =Og.?\ )k5R}a/;۟3'YCߋ>vA~7^-QK7YEedKQ/  h lxU-I󂅾أг6-Jrg2U@zy4U*tZ|:t^Z7h@Fz/,|9m^7]M7lb =4 >2tBݴM׆1 koSu@?Db͠sw}I34k8{?񒔀4".zGB*4QB:OyGL}= zaje2vbV}-voGNW&Z aF/zza!_Էs h::(w zEM.EDлkF5D\ )Z܂9:!3Uly t!~wߺ4G4(C:ՙ{4=uo& dI3fgn{ :GC<}4&8:jؿ^7{mqEEN_ ?n;,WNGeQbqAߡ.C-|%e FhFya'^>ŲNFs2b+F*J_Bɨz)htGJ-O5{-ܰf!sjYKGݔ&Zrz{b .æF;)gH?cNUEn=ӭd w0^Ӟ 9\(y<:C"^JCܨ<]}o.˲Dž>R x|y:қȩDH 0]eI^r[Ag﨓wWX`쌱dY7?}`G5rev7p76pa"onLmegB|$t@/3С9udk׫kKOlUý^8jr o5 tB.Y ?FK,zՎ)N;SOb x4}#;=~Y܂muNqI + 2 sYJ.z 7rsǸgnYՉl]3uC= >g:EwX%:.ehٹcTuZS.zM툃ܢbl4Bfi 1Zz:' bG nfX /ʕ6iJ5/m f}{F%dufXhBNVY<~,yxD>H/]R.M1cCB5ԑV1^劽 #aȝ% usȤ̇upVufyz")yK58LQB 絮Ӑ_Rϭ^]qnɤeQt .Įu#E~xxgD/$ /3o|ɤPBT^R8Qdcya%^Wx0C 4׌\7ZAVlrWjEȵ ̈́uӰӚ5b7IkB_#C]~$k@,6JEޯsp^NĂ^GK~9nyAsvGNOy#^?m^*{ d=#sLt,0_&suw+;}m١g zr;;\(&h״qxkjUT5"Kv5tUW\ݖSCf^e{.|N1*|g7.r!IB#wogtbJvot@"o:qw ]=F"gt?KgM/{x^Ƒlk}FIx8^fy$N$s(R=vB1t^.^,ґI#Tg.gM.Ş|5BɏrGL^8ЊL"idus^}9:-o T3O :'Z7#ecjpEFINbN?% g)] ]='~ X ]&I֝7:4O zqY0rP.6.#Ӝ( pDDb5sߊ A£04-V:~Z AiܛqCOw m9ב4\K0AVxKJVgtα|ѹ ]<3Э8A\g'Z>`ĥ' 0ΠПhu%J=/9hoBnGw_&hQ;X$Μoe{Ig5ފ]rҳf$J+ H=uFۅ|']؃ѼMo]`^E/Rou >yQG3m>&Ltzݼd8Z)-Sh_g҅|֠ͽXF^:*r⚏Q̓w=rp ȼХ vט;bh nQ+ȱBbWXt}z钤]'Q[C?D-tky8hgbIFޣ=AC%x}$6^p}~`1ΓAEmʋBO a"uŭ׼N:'7> »rA."WЍOdWh-7ꯨ_3Åk(D_.4HN "ɚE؎n+uy[*rYKiYdi("-5xhngNizN gɹly2ӘN]ԕ٢Ѕ|#i);/aut;(iYMi<nԉAЗ#>zjct-qԳe z"=ĸ`܃4C]bߵjG޼%ֱ#ΜhVlb#ZGR'IdAs%#a.6hӌr2Ҭ3l2cZHeGl7B+_T #@Rn^Bթmț:.rJaͪMtd^8K~s"9%ǵE}$؂})Y 6|rҗ@.9@_O#?P`j/䔞!^E{b+\nh2ڌnBʟ3O:]Eu>s|>Du B^QvG^ 핗f1pb+ͤC_ay [h)׀N  ѬCEhR;:Gb]؞ݫuq?j&;u|˞-RWc"ux]c),.m/3"䂞zc^cP*-4" azK TEeQv+/j&쒗Tޮk9˒hBO3Y+ZLS+y#83Lgݙ" >ʺq |??Ӈ 3L vE/B=~I}[fFEim7tg;FԡU d_`ץN[b^mJ5{VN-TAtr:E<:З^ OK# \ ݖ0Ԇu٤thwm푀 סyL3 z(^0vdy@ozJgrōa{hY]<vaٌR^L冮Kvhx }Yv6b y:oRCG%Z]Nw^׭4=ZC?[hCnP nEUl%gs2DC>Lm;y]PAnse^@[s6/3|$:Itu:^)>rF/p>xG@]/{ aDבKv.aIK(K1&.tZvCilG Jۍ*G2tkuvu=i ٵt[k](gfcO4oFctM:+p?=]r N 9ݿxvO{7ԣ=q7Qmt].%S]9Һ6*`u{ψ++rA*KR_5Tf}b+5F&vs1lW:%[%U]2t^KoF/T#3/x)#LzLʣX3A;J2ݻ{7Jn&xiF:ci(@ґ{17RfEGQE^jc/nV ZF#Y)6m4Q؇qT+蚌V_t#)fjN- jy]QENq[huQt7[FouU RkbEQy(J_#J^0"Eo$[֠hkԾ 7ZԲ=\=\7Do輴.zP.-'!7tAЩˆ[Y9vs b9u[o_5,naW]Mm[߲.=3_zԆ>\f!$9u}K7BϲCxF9E>3GTG2R%4{޾ԅcI:6etvE6}|`t+J39yY4?m4u){]zc.sc]x!,̮~nOˆA /pk>J%c`ђ]O ROHu{Gf$Π%^qNL'Zȓ滀LJͣ)?xdkc6hamFAG/.:]3 @>\}l.w<-V9ܽ>JjF5J 'Llf_Q\:Z]6vAqI^=umw$q՗ X郼]%trG˞PW:if1,/tw4Fm{ v-9x9[Lҽ M?nњcDz9/Cbhf(lfB IK:.mU"^^n Z%O Sn gޖBs"ۅr# fO/]4nރ>#}K][4hH5(;alq#dH- ,2mGãO6'WGKx֮#w#s푁=+E,P>ɖ8sE]֤_j}_%;Yu5-W#D𸠧<O;--J c/ig=Xe GŘ2rL:-Qj19YOLjȿirzA2URF =;rj D pɑ*F2!.dI@9^I{1Z/t^B_Ǭ ~|wꆍ?-/Fƾ#ԕvt֤/t*eK]b%3xa?%Fǻs^5;zAOBܡUGG@'ݰ(:vX/&ȍ/ta! }JM}Gw#=u[2_jƺ3WzϼMD|RcT|Vxd(9"vFhD#}Cw:M.._1)Ҹ_S,<5LQ_ȷK-i \yJq'kWId%M]~^%u5pHvtgC/۴[J8zzeȉ"i6~, nvqcxGݝz"YU二;:v;kqK)?[f]#ed/}GK 9m<^-tuyH"vyyatn,&:-j)Q+2٥>сnK 8ɍ.-^DLﳂ_s{-wN}H ^KiZ7_3bt [Y5l9ln'i 6uL\W,(SǕ}vKY]JЂR"Au6}4ٗ 1xp!xiT.蹰5m|Kf =#Qx#m/VqiW*+؄.=Lv Mw8gu>kv8Xq[_q)Ŵj_-Hns+]"K8y,,}Wjj@9r9EnsQIO]=|t :yU4uhv]F'>Cz2t s.{مG ]@\>~!u.CQ9 m!&DSڥ ?^ck׋-¹*bgg145[-9zjVȦ#!cM7y"ANc_ilv .vZl>GC9A^CMAO| wkZ.Gݵڍ  KO&%>NGfh"UvF廨t z8ѫ 'K5pK'r]LڠKO䩼]b47r^tBk9ͅQ>1hA;{znn%be : [gkt hoqn{uM:b/^Juzrwlzn%nl.zHyoMw.wXp~DB;vQitț.>Ȍ֋f+tkvnx1~IO5RF>S<*S~U:4\x (TQ3>G">r[ZIDK[0!?TH'ߍBzF.t3Ƃ<4^؛..=#OB Cz0#$ kM8wlYgfBKOv@Ka7duW):\纑*٫Eܘk7r*>V@_n`0o(,y:^ÒkR J7ӭ':<Ϯ. Wn"kz[w TrTW9n]D^.%.T.57r[5 htT0j۠^ґwzFNz^etck0jLr@% [x9E/ S]a't|dTEnwNF\K{ 94KOMZ;En~t5DO{iduqCh2ߥgu zk~"OzSH;rэ3~pՂKh/%w=ջբR`+@Λ, }r\ ]'X .?uuQžKtmmJ=]byQ*tDzO N~l7_Oe2x/Un_c _S$yQK {Ⱦ-o]یB7H33և3qҤh|:y^@~Q/x.񿁁7E:ok! M"SVwCZpUrF.ufQA$W_o4XiB?[#g"G=5+>u$̓pK/,.!Geݱ=_lU*r^2_b=v/\ߴ\ooء'ͩ =IX:T >WuɂlL_Ph,+/xK X̾;v}S/탮G/**ـ kL.ȧ g$Ql[2nEy'}{y6D#w<3 Џ&E/IҠi:s O> .e2 Ođ칾[rׁݿ!#nG}AIVT{SFRVꣂg ƠަV}]o/\^$_'[kc-IK 7-^}C98,2ʵ?uhFK]q@SE]1J'r G6*t ˁ]nV*vofOg9Y.8YavHgOT3]zj l֨;^&o'z-Ȭb?Yp"wȉ*%IQ"ѵ.=vBoqʯb\41.־St0tЉ/܅l!UwjQ/RWZmU+4o{wqq9N6ZЯkz_rVatː~p|-hhpq|f%$3n'c8o`3]DΚ:MyGwerfwXm ~Үӥ7l'tq>Ş9ӏ|¥宮tCibծKבi^Pvؗy农=˗q^NEN-^^$]z%*]J-i[VkſְL@ $팹t^ *m,P P2o$|]?j=kU/5HEnQɷtLt}0t@E^xmy%ɮb3_s.#tX^i7ѱK]ͨu C4n_#hՖϘ'a^=*Ǒ.m"Gǖ v"r+3[qV!֜L[2DCOsx\$z`Oa_ =s|B~C?:UoNaCtu<4kzjqײB&L]ہ5@}Q 9C_0zbNd#_&JȨ-Ҕ7ޮ^z[~RѴ4w]]/naL=L} }5uy/1_4S^xoQDNs]} ݓ(u#߃6ȉ~?u- b=8t TQ*%L zI@e5H[JN';]ЇSD|J }sTR_8Yz,8Y]ϪϣjU\ƨVBCw-J/{H'""~D; UWEJkё#)=t3Zj[%YWKos;EN]waWMބE,VQR^3ݛNi4h }#93C گ" hO9YoDpOu!9{Q .y~4ɖT$9:z , DY1VE.+'r"v sG=Ө\HZ :[2oJoACc=QOOQ:,.[rG?C2ڽؼyC~ӵ%e=X)]+ϷzTem m-Zt.d. 2kA {#oaj?u ܐyB\e/Kբ8r 'Go%& : ;Jssq`ù:q,ze)гg!ڠ;ğk0 7-V;ϹNtT#} D yn}A.%k }:Q@Лn} L.zU8AkhE7r]"-X([Lo,y1ݴ|Ih%Ȗ $n!kQ^bt@ \ȧ}K.pˢMZ/"b.v}idȳg14-ˍ|j^F̀&m-t-.1^i76kt(荜r\6ԙVK$.MϑS ZrQnMe+}FKD9:4r ߏֱe|%2'*`.H*+lEr_w`Bwqȓ޿CF}7r4hI.wζKZK56SNA^Пvh)'tQޓsy#?|2J߬|2A\Dޖ'0 H:v{Fgs/¿2)nomgZݑF}d@O)xŅ9b //ivF luCϺ ͏0xՉ>ʉ|ֺ%8ҽ~c y;RQ@ZEˁ|>S*0 Lwj %6]h_E]9Qѓ>zQ.s:*"ГcLkzNn)_-*U( Q<'COtҜг{:TnZש@7u5 9QU]z@IG/ (Y9\=Jy#TLoQZkuoO*:ooJ؃ƒOƃaw(gwn,>iD>d{^:o47pox fhCYbR$eKђ=iB~jlF1Z&CH#n;h_&n2mqGm-\\:Hb7p_Bq^Cȅ"ild$ؾn t)\z_ l!c~$m@u : E3hk'F%FȉC@Ce\zUT=y]Yl=FO׹s̤]R;RjGL캟LZFu-A5'7r0GH:Ny7 fh1#Ncy{>#w$wGnMyl F@b GiJv ͨDnF(]rDkc_GJ)3EIjN6XSF>˗1ꀖJW恜yyii\b|[NT֋sr/0bg/ح9~'tMyx17OrKnHіˣO.àRjvGa|c^Sdke-jD}̀>e:GkHue,Fk>ҹ'i|9y\ }D@fZҵ,䔔&ȉVW#с2|%]事?^ 5(3]|[W4?:ƌ/{(Rq |BN:K˾.x1o1ys55?Ζ:m,vO[W4hC+.㡫ӳ Mrt2!= #aTt28N#Q^$ z]Ά5qnC{(}@]3FJ|{69? 4 ׹>߫ 3? ĮTׂR;Iόcy"2E:~z8ƍ<;R6}>J#浍}cFFꍼܠk@@Qr^ VN%c/*gxP:tT}^Rԡw_ҐoyA/@>/zƙ.j\nEn4.plzɢ|^#nfy~H'b.zQu)6x>=y[p1 ÷\7tB[H"O/y̚ 9ZPK'XuҞ1O ]$qcd=E^N+vBgK^7noцM{d(0 =Mެty"I\\'r NKݷȆ.@=_eo"\@ޢk!kq{#՟32bt܆Ekޡ:݊h- A/5֐^[ r< },BMa4&}˒4dvσX o ]Bfy!)@1bBl?gh`wBЍhA9zEq\bҝܖk[+MFVGhЕbXsȍ:[f~BǛBwt-&MmR+}~ܑt'칔#ͣ-\M$=3[lh4+\/} N=ymKmK`&#b9cjt%_FbZN#s39!*.ωu0Qןb֪m%vNsrC[W8aJ+!١Eq\URݵk8F򼠷ͽ(g#YɻtMϩ ̄juoUGP{i%V{7.'vF++ӉYHzCw?)^.vͅzn+-B\E~ ag"*ѻn6#̍\izK"|"wN.3#L\|_<]R Tc)_TQ/cuSsyq K W:l@/L {*. nϨS\D3AGNe=2n%f88'=|W7ETxt5lQC퀮m* }/c4n3]l plcVX]F C\$ucQЍ0Vaa:3&Ghޥ]|eMt6f49|B=X#A~!|f8{/-B~e'iWK/7m5ɼF [S|!q&зhVݍZ5 P<#`t?l\!32;t[$%0o=^<<4:-gT 9 y,VtSq#_BŐ:儾yHU(2.^"D/YqYGNt92+\\0:C1i$ yM=p2z=^@ێUK-7b!S?=ԥ2t 05hѪsxu .uC/k Fg!S'>/f'ar[g.t@.=@H[="9jZVGƁcHi*k2:@;F{F>~%UDӅD 5B\thN=oK =_7`H_td; ˕Ws@N]ԟ}ҍ=]$S҂B>{ƾe_:*9wvw)}#\#85;nu^S.,γH [md'Wvzڍ|9yT/97)َ暇)r{w1u6p NJ7.@|39˴c^F|-<3z'di:SuFO]zl$׫XyF.V_oT<נ1tpK yyΟ\d0hSIޣ}-IbVu4i:b#"4@N%\~sJ M|]\ui.wRSfh;gŲ8VtD_zU[tv]ZИdƾ%FffF.mO/!.jLհLŐFK*ɰgLFaZ-r]MufunBI66Qmci>AMN-/\b,_uϽk/7PҠAz2He@ԫP] H]@8NdQ :EyB;^\ 9W7m?)djD:Θ;GUN췄_#vB@*4obyM%2Kz @Ar/%W˽Րceh1O~]G|A*^&z;ee$udGb=b.zĨ&'1WA.`1܁Fjj0f8rh~M! Y',sS;K|13_]]*Rota/1MNKЄcl{H|7honp*UE"e5u3li@ $)iґ|+akfax=|n\49$'tAbޣ(?ؼ:>u2ʯ)OӨA7º]iGA؏u0n-ܗN%:C餽u3+$gk*BWzgb ~iM[Vh.Q=)?!DOñC3]]ǿ/0Ltq<]tio#. ZJ nx nkR` L7yt8-H/N:6Abu2=o2Ԋ\r7hФ@i=EHOB:>"P{\׳m[sPbȉsC/RО&p*!=6~~b Ů\c5vW}͗CHuKbϺ{Q+{qmrYG:9_7[n_rFũȿZe 9b&<5MHUy>˕8ARƚޒsLVT|3*ryN>`h*ѨS(I |T:m2nV<7;ZVBHjED':l-8@KT@.H*\K4ibC]?4ߦף\Чy=e \IyܢAGIJBS|kBLO4|~zC>QO`" HΠ:A/l3%혱#tJ޷N*KNjc-;mo*zBQ3Kȼir[E#Ufbbo&fd *rgo -&UD.K%vȉ5U&3r^ėV hlD d$N!l=)thߨ#2CՂ?;[32v̵%t|-:ØG{^T#-&eB&3ylI ŞckIQ|z`A^#A <竎*Rrr4.$^d%g-+Mnq:tSɗ֑Fc)#'F>[;-&ɫWZR[E;GKy稯c`릨ҁW(*mt]Ch7Ԡݼj:~ 쌑.v <כ!d?v\n~^7r]# |"wf/j#5b]iJs 5?VwrC:carF+t;7Z&gF\,M3[!'tKR{7t]N2tݻ;t!έv[PW4%F^<h&Fkb6z`_DiН&g߾5C4 au/^:[RGn ZR({wD"a݆nkްw{@Fi ^d{(gwKp}^Frh]?QI_UvF3k`>37Y/AE.xoQ Ѣ.Ҥvн63vcF?yZ=k :h^:tNy|n9LjHmIl%h1rE7t T JGy?]ﹳ_s[ؐd"nT5ӹ{ɠC; ~v\+6Py:M7]Ff8ՙrˈ }7T876|K9Hҧ3\kB[l^鋋(+\Ю:W 4tXڠ['LaVXR>3ICu' 4 j!^S.Srn FFslzShm斔_lʯ{7Zl,y^_zNy9 ^@OIknW rK ƠH {o5Bka'o݁5ak$:yȁT׭\BCmerF|uI7r^Ll"e5%ްKnchqixCLoI}d<UΧBBEb"v"O/#ݲGz#gL1pcNv@KcȖF zLDE k{#_#ދ\ BV^_ >W7֋^)61ʼ;* zRF 7JXǶvBw+_jtr/53pY0Omwcr!Rl!O_L|9#9Gyγ}#8HPOw:#K#O#3Ec2ӕˮUC|A"VHl1<.tycBe>/{.i nzDhSyP\}>і p w-wC|lf}|]e`L.rsDn7zA>jI?Aox{ZO¿:^w 8#*cY+M|{WO|ZWzt>*kǾGQl~q Be${t9cKṋ)u.pjsaT=RR74fM#'!wW W r ]Pt9RϿFt$v<]Hpm zpi GSIY}|-r tS鉠'_ Z1y)Q$!v@/a3->] HikK6+6T0"ЛarsG^29y[ "tY֢ MO Fos]oƽj-YC̉+<ڊnO5/nI+}s gc7{XR䏕H%\ 猸{#oTۀ~b%BCSg͞RO-Typ +!+*Bo,7ByuYe1'ŇVF 3- b͈Ⱦ X6pߋEgWzܹOC[SgeZX6`/K} ; ~gM7^op.&7kZyqq0_QOxZ{v~-i%ت~oPw3k@.M,BI$~~ms V[@+dL䭱-ޥ*o| ߢ2;3ei"b'k|# "?C]|;pUl`d@O 0W'},J( l,2"@esAAEN~g[fR%>h+Ʀ /@(u=`*=NmQQN*GޣsNNRKK-$vq,r^p7y&[&xs} q|۞Wn qD%{=)%ZwD F&y>k8\ 2]z CƟ|IyO5h-|)#}3[Rl=yF jӵ$\N5]Їw2C}}Lr#e:t.Nsy!oVȢ/5X -3[\$>Kq.\ldrY,ޠEl|'+Ő~co4"zFct} }"2 6;4o }ľ>uV[=sJ \iuЫ@mBך-d.1\J4!ˢA[H*з[S+|'3=q"K]1 Z]qrU-A\IQDK}b*v+k"輐qƶLMl=f yT\uyN7+zm-|@w[S97 yn1( ,BGsذe&yDǼɁ.r'rY2B~ύ.3ѡ\?ْ5*E/9WMřޡ: nR҉TE޸7'@IKtЌn"7 :Q{4_FWGh+\y]ۋgi9M(T_g_FȓEOT_rK3AOLz@~kE6rΘ?ػ" ].C&^ȷ RuC$zn\hYTt!l*{H8}um$طQ?GTŜLQj^7\bee~gu kBo-QwhZTg̷uq1iD'*.g.%:g@tL зHShO=NLuC?[18,H7 UGݨNZnI/з8oы1#teA8Fz?J؆dNY,^χ5/8@΋$ݵ ?K"kt$>%Ey#9_/6 ݬ:B6IJ=9 }kz#Szי6.wh.$5otYw((L ])MvzW9żҾDFR/̰WK.]hnz뉜.F*vzQ x @2 ifF^C Ֆ7rY4|5+=L]5Lc뚥 ,8tКU Ė;AoIW=c.o =imƼӿf9o^OԩUO[(\[>i$Im&eN{^ 6L;x1_#Z%\ȽꐫW/+hB JDaCn^2h&|" cm=8q4. ^2bR & ~Uw>뙾]p\hBMf[{ǣ[.q8_3ZڟyÙ7 o.?nFȝ6wYW0.p2_yAZ%ЮY&Gг9$dOAа{ٗt0<QMHv9ǺK8@3ǁ|St@y!0dq<{|(F@.wm|kz S}bZOs@?uh gT_n/Eo=VB>B܁R |_C֞+29dh>_<#?f ")tH=>Yb$"C=oGҡb|z@S^B&\Z_A\C Zza CƓ %n3.+, l bi\(o<̥as"'c z`gM"aYH[<1|Ycf":p Du/ȧx$pw/xxl_V-c+"OZpݖp mdh+\ϫ }IY_m4nGڤeкT|5I >prA?g#U3술sf\*Y7 S%rކmie.&U!W#\EZ<ɕAΘ'tcz"=.b 'q p x C˲iVX aTD {Uu`!h'YۢvpzƜ\2ѡ'c5h%yp-kX 9zyb֟1DA/3# }R[˅O[r(xnSc(\54/Ь@˚ԁ[1^Y^3/,rr7$O sZk6HyޣV:[0=^;%/Pが&.sc:s"v|o'fۉ܂_:ڑos>%w5{汏{~]*s-KIbw6\+UFNA.'̟Š5Gw/o =R9yI΋VNJ'tYJUANG|YFaJJ@o2V-<_4"nؽ\z}9FhYSeOLAAsо Cdx`\ \2.q\a F}ki!55Jg5+=?oSfl&= ?oMAZ _Oa>sSk`j]; |,O6C[n9 >y 3oY+ĝ&.x78Oe CSq祶ݱIGW[c?K&ȧRx6 g^^mB_5/,+Dy޼KtiR7y×@߾Q F|u*OBw4?[LjwT-ш}ˢ^\'gumD% c2m/G2/=;O@@&f`M'<+UEF3ߗ];oHuSɔc yY^i3sȫ,{S섾,CI|L2Ih=)ȷk.tt],yl"]{;r Ekv6k8t&eF=l<{Sz9LHy`h 2*1hg>݁D>딱C:~Y~~ ae]YUwQ%eO䔺Z58qLtu*y1R^X\A/b\eIpBjyr oy&3O䴤٫p Flyn"Zdiq >L zkХky#ӥ۟h:EprNF-Q6C>ҥB`kM <eǨ/R&=_~#$C_GiC[~ S(VnOe%6 iY\;4EZ Y\rK `p2r>ȓ֮iKt5֨z z"OaV]y"`gtE%*|F1ru[sD v6/7rY5W#K{!h/7th?`ԹФ!y7̡lF'tYE+mra4k٥cTm ~Ƽߋ1MEZG:=D#%|Q|zq' :p w0; 7. w"nТގfW=mTOݥ0o>Ů !SSʔB5GW;[A^ ~?S b[!.+}h r@L.hj2׺?\ڑ[ =f$^^b'uWb5&~7ӻ7~KސM'lf/g9_ ^T6G3or OI_}hf Foj9A6pўThR}Ao뛤0ܔI/<-d p m-p-gkR",fThf;ͼo{ܤD,7|#nACt4 z>!oW,r" ۨߧfP\2@"e^1O|nj͖*Qk* `%KMjfg :tlɽ/ ~.MJ;c%yPFήk %[*?>/u2C_Nmq7hңDz%>WS.Z2 I༑oL6Eާ6[;H!׊4Θo M;O%7-6zksrHEN] r>A:9cn˃!j>h9屈mGbWپ编{y 0ʅ z[Y;UΠۖD_= tȺ^Ѻws/i(t/ȼS0]"\}r;Uk;Zh^x`Zj˲~U}ti%>[Fo1EL.x*L%B*Ğr"\˲Pž`_>q,( M\)=&g@p/v[.]owntoyFa*伮̜* ~kHS <*uqvLJ>QҠߡ=]=& ~fC,#ڟSЋBOq(6`8,8I=TV­Ƚ5?-ԟ]BِdQ aaux|HW|^ ۦ4r?)ƠT%Y%_%:j8<yp|1$N$ѱ7}gVHX^4 4 nW}^c͐";5NI}Z37lPطJ>(vI@?_'t{eܡ5}F~ZEN' ]mrI|lht ]ZEHZi"'KK31x})W*&Ngs7z,:U( &GOP7Fx!*tKYR":&. v=7ȵC]p'{ MBmuB稻 4ƻMiVޖ :r@A_9ږK[|gbW5x!縌\zl4>oǏΘKcK[=xݨ^gU7nФ_T/uE=`/B« H~p`o.tb'KF6ҡOF]pbtbuDqׅˮY^G/+L'Qg!s3}.R ²"{;{u&.N# B)<kh,oRkT,+2K z_[M@|L͏rW7X#֡՞fAeݣ9!ۉ^N,'$tAF-7r}*W<32|{EsQ;/Xl}uA\5=% Ɔ="g¸aOֺCr]O_Aƅw]Jܘ7Eb\4bOרjd Kٓ4}T#+Hȵ1%z]prXNڣ@x x_}A i;4BcW-|UO6*E¿n>{KOAD=3;UN\\m0kފb:$/`r"ƠbգB.1kNЉ.D0CSH%|XO +y~%Dg^{mET_<-X+n@+UWyg:[ޭșfXD >+|RtWܴ) sq..[4Bޭܝ6O|'cr: t]|D#촟g[kӑ>B9E2k^5g[,r0e9ޓK,]w)gh*f'vW=y%r]v) ,%Ҝ|J}5gx {,s얂'EzOӉ|Z 򫨏q ߌݠseAC"[і +Ȁrln P荜~c vR"ˁ|Ǽ6g 6yzB!#ד|˹S֡u39.ڑ{D)EvuR'uf%'6 T7tnu>:,,Ң/=Q\m+ェkptoY#GkOfУ_KK9Ӆ6) @[K[c;z73#{}\'56>Bn9̭0TdW$;O7m|_ Deu|YaȑoTwl`w)|Glp zklK$7" < .5v꟠b*RKat z9C.BNa݄ǙnB:3}|A%&`ؙ>rƶBN|M>yNq;ddײ?rx#yq([.Sudn^_vv/N!W7 ֐/Pbt5NKzעyDi!حb gd۫bCr \G\HKN zeV8E%~!oVzƜ-%"3"wh 2S%ZC59[W!ͥJf>E|Mu/GZw7?'4^.|#T)L//k(]^Z['"=L.F7 QoI_xo了G%ن3%*ump}|9og.o(zW 7+_lș8%8-C?V4h>zPeY^ľ ̍%;Z+ n" ?wykl B>Fl-+t 'v蚲&+^BO ؁ܖYQv1VĜ#9F`Uwp:M3Ks(rEڐvѿx" -d~RT~Fϔd:#.r33`>ܕQ iܗ¯Dtݢ/V*x.tB߯V 2H-K=%}aS>]..H\YVۖeޗLsj^ϖT"]8*bELgbGa[<ڀY'7.JSޡDξ!/-NZR)5Jf |s7(M^Gn?FVp?e}"8[j; y2;eBΫ=zE%m5L-\ZoG|9/c^>tɟ/e\,vyڐT,}>2 zjlPdž~ؾo[. S09ҡO~ ,y#E}]|K()6eto+Q "?讞 vTבW%:Ѓ`Dފƍ9K("W#W: 3]fSz t7{ҭWQ諈. Ai4cS&F-Y?ؾAohRybs\I@VQ3T/'yHl YծDB=2%}w#LhTk̼v dctkV zKͻ BsvOZm-1 ٵiT\֛4y .?iEnz5"Wwkۀz&,‹0rj ںA^F_y3v@u9.jIuRcQq0ݹ;NK@fлoBWLW|׼1Oste^5U^iU/7v1BSGс^,V=o蹘F?5>7fya"'å.ЮT7Txr8[10qc!9ݵSBna斉s z֋xNRISh~7ywg yZ_ .T'p^Fʃ*B^F<\)+Zg;7/Rcx%Bbn4Hus @Ɇ|])JȑP8G"u!+T6GJ!djB^@(^Ow-uFy8oqbenyKT~#.tkn/r{AwbQ;Q,Ё3_8H-﹮@.rѥQ;w?m& |/|wT5-Ti}wZյ\6/S~LnJF-/XBNpCɁ|zf,r7OKLЎ$mx!8b @鉪^؎^8 妢 qa_AMrQN VTi54qw4zYX;w)t:Y.kzkF IFչy'e0pq~'P8uK1kȝw-[y\C.MZ)= F-F]n5r d]d=.r[;jMtm娴q@'7JkFNiT}Ai ۛ־ӪSu DЗK]߽,/c\+cv1{ͭB.x? .98 yd r):|^B.8DaT[:_.o=tʷ7\vc+ohvkA~C-io^xWEC*(="Bb\P7zqJ]bd+@>3^z"Zub c~9/ZF`΋VOIn$/ -_}}cDWh3ƷUL to3ō3Z}[NqU o跇A>V]zk):Vsalv9<]Ų\)C_C+@Tb#IПڢbE e̅%ϝ:0o|iDsS%Eِ<$pV(B63}:5O]jqXED=Q .O펖"3b\|Ce Y]iȩC;F~"h-Ho-6:'H9[gĕ@)bv1쵨:\ZJo:nn.bo䙢Ww^^FSE0vu(R0Dlenс2x nA]XFE7ҙgqѴhـH9 Dtۂ|nAIUt(A.a$ F7>g.ۼSQ "c}x.ӹbw hE ' ~z u-.)w-Ct#dQr:E:o@ J"t9ޢ'nBNWϑ.1rF9A+ ]usi4lS| ׈YuhBw]/goB+J;%Ѳ]M6.nlЭˁ\nнEr y.6l^4?n @+gtR%(./EM!( ̋r|9! /zi] ^5uhexoߕK ;'9\ۨ+FgL,HGx:?y鏃MqCǞ^M:>iעwdd|׸S5F_mܴ?sїKK_}ߦ]mFE9tN {SJƦi廓/a#vc_&\/}-2X|٦mAKsrVC_p.?(t@T2 '[[[{.K7Go߁|D.|}Wnڐ')!՝3a,3teԳM: u}j^1"'i=ɓunG|a bKiMM 4nX%nc"5zf_'k"|&S<qSBD]xTZ> ^=N5 Ӱ_X{zl ݬ|kln6ttxbܔe6\BĬei䓐σ/{ZKH}Hd؝ ECB`%Q2h9ꦐO$Fr箕_'#NhpOu5a So9s -,F*C)ȐM5liho#;\?g)tg#M,[F"o]Fîy _q ս*[:c;S9kwkzvVnB:qt f[B+q:rſP 9Y'FԽb rȭj]p֝!z@}ŗDK < K/'Uځ1핑 >9vw7o=3x3_(J}~R1FZc7fh޲Ҳ<+hg}\[>N;kmdO)C'Z-FDIH(B.V!]>ȓk:?QoBOg4:w.R[f rR<%}ؠWǃw@ODgFނ ƗPGFNnŠm1g-߭~h2r7tSRQnQ O&O`ӜX@%V0D&N[1ZEz KfA]\,h3zٵ(5ZY=d+: H-Ч^Wu{ÇteS/tёuܯk!wR]1j yJ& Y-۵"Ϋ{/R祟)t`7ˈ ܨ9/ŀ0BE`.4$.~{Kv̓\`B鉼_,Dn+%.ȩnyۻ0 'rЛ=7@|^eTVGo+eJsjD몶vv;N|sf:.xmȠPz|Wm|אIuGJ]{&ٓȓ02o>.Y__ƠBO|Z|KPiopa8aXx+ Ct|[̀]w<Y{ݡƉ`Ql!9?^g MW ~"wGF}s]'[r3K*ʾU+Í/Igo=1n4C` W/Ӊ_R,'fyx#_ 7huO"VkghƎ[|z蔹 r7Nź INz|u}&=ΞI`!v}fl%H2/2F?1Prd?X:0'Kf6OofhnȪ=:Y^b.k1h^5>t[}`zC6FD.ە*4WTgZOcvQm`hG*<>oZK"FoQl+'Z8x3}9f^|椵/f =*rP{=3KX9Y ZI|~_:,Q>ǮApɧ,=yV]jp5K<=̿lkCufϡoimt6y Mц]S'{A~=Ew|=#ȵ9_:8љh՝d5E}G]ܸz;[.t^E-Ёk2ߨ*tR2S[WZgq ̔.v0rf&m.˾|t=#VPЂ۴o0֑[;;ݴd %tgKK(ȝґ 8'SE١6{^CK|X.i;-IQ7E$=BV5$I}}s${hFc[ Y|GI;%wsC.G6#e L#<&q"1#71ف_5"]D7ܢaBYOtyOTR*`O 0aJ2!ueLϻiG 6.,.q2i/Gg%=UJLuK {wJ+ {[[FKHB[9'UA!EWW[q)"NHpI ׽7+[iq"\\bU} ̬1 J;E< wGu~}KiJ6^؃:>gb9Q+t M#@ߓ%Xgnr4ϻW> `ȏ'CAN[V Iit4FuLC#}45ŖV7 {_̐vq.5ՁhB3M6c{ /@ȐM/izJj?N@^zwrݪQ ꉜw_w;S}i煼_j =uq3쇴/)hȁŅZ9[g ΜbU>^N>h- LXI ;e&7 N~BoDZG^g<67]}{K:]v'i%b,tٵ`ר ]Z/&pjȩ.\/쮄Q#g]!F^6+R5 rKӠkN%oO{AOܻ>:[ą<W{q;K,ա%G,(//yVZP!6Ye1XaH=zˬ=|h'ʥ=Sסr sv ny"_|vYedK^֮0}\č|DxۥF 6Ӂo>_i4SJXbzOt@g]K;}ZP^2޿bnw@ 3s;0gU@tO5L gtS7tؓvB_룎|성_[ti҉luK]7Q5h3t #yj *^Їsz!mܨ#kKrٿbMFY tWH}anT+2&'rb{yX|L^n[ ~ ^uGKæd'` 0_#yť;Oo+2rr  hh=p7dyM [Hs* 'Է:T`oQͰiءN9SFӿsJ[fl#'b@ksKЍ}C9 A*  WT/R3 ,;S`';Sgf3㋲z 5e[_v{ϸނi7.ZtrSH%vgѡϼnhy.r,ǖ!3?79^܅8p9mWi_%ޱU{xr[|Tz|ARO褱X[ 6.3/s[),U9۶ ,N#E%nF[5=%aKym;!-][R 7Ghm ߉jomS.k[쌫ӥ*#wFI }:#9Q.˥ykQ;s۫ OD@>"O63q]9n%܅ G] _hwJ)tz;v^@틨FAOieU''ئ/3߈,R$>?RHg5HJ6=+rҹ9"COM$4ȸ=]ew? tE^ם9c;SHr@oqN2r ͩ7 SL]"ez.ӭt յπ2L^Ӟ_<};TftUbU 9wA]#A%Nz 1b'Ma+E5gOS+tITFS')g[^ȱr[^.L8 5ȝ>GڸtZxe;+vzo]%ʣ"LԱ BИ/5&EZH%0ޚտFrZtkosҞy{Q9=QpY7jzOn6~r~nhY۳>| IJcdd{cQPuIpӺIoC}]CJ˱N0]P~L93wW*7ӻ/#outv#Jy#^#3.Q>߱ԸgNjz@[7aIm- ?/`~A"v-'ԝK}oe`OsO\TO))Ug_.r.g3^-vW{?~lg`Mm9+ o{;4q.&%6^v$8|rg磭ЪAG_6=?e[T7w$̛|:r%dԿoxlPb/YJx_&52c9=!lGQk[r~g6Wߚ0$1tp ^q{\%|u5z6|ZV"kS}?*NA[׬{r3`5 > |C7/}k[_J67ط\}T,r?˒)nմ o}K}mNh% 'n,CJGfg/;qU"8?+u/@?:!] 4ųh[ e=%?X }F7=uݧT[ ,zY !w{ |RV' h|gTCCkt1mbOYBdIK%<Zn-tyAnr9HF\Κmn̍٦O_uEt…Lq^!Ef {(4m: pG͂^%Vťz+v&1 OZ%_ %xF{%T~?Ey_( nH^k7YuE.&![RGO KIK%w1ScݿG~HvSخĶ)SYEOU }kt7;az + ज़}[CfG~/}Yci/80@~o5!k.[gϱ 3+B?þDoDP΢$ق(PPGpGO6wy^RV*$y,FGN7aȉcʪc=v ᛙ8e7e2%{#H-n .vɥ_aV7;_-vr6`LŐŕ9_|Y((TZZYf@KRִ|_t*#Յ/M:N~"6p *E/{/BdF@c2ː\վ9z AUY۞7դ^by7*k%W+4W ?!I;_c,beSh)W, _oewz3C|Gܴ?yG8TUr_q#aYGo* }AV}7:KXk nkjk# 4|"O{_{hOZO /-V-SQ3q#E|D]V^mVzߢ49SxWǡ pW6QSLr\?{fQ(2?SrELWF-țg.(](U6ۈTDN + 9q@V,L@_ƑwMR[; J- z{iRm=`s,!R=Eu5gn,fA/tA;j_QǙٱޙnbVhE~fײD󀾵/[~Dk%rw\?P.JGλ6c[(ؠ]nuq lkz@n^ E3\\7UN2G\֪\BsO%f nvU<]R0_g9붕 -V-/BG =SXKtIc\]kv}]Ffquo4JGN@;G-/pYd54*rݷsm!.R>o亗G*N%7h\fM^YL?92菔Nw*tψn1Ҁ,: c:0n5Ɖ|TY!yiyr$dۊ &8꧟ݬzo>z@O<m{|-wF'r4,,r#WzN+r! ]=E+|/83]+Avt gT9_ \ ')ry>n.ٽx[Lf7ot$^'G3=CcĴo(cey/KuEnPǹIwh >S\nLfi#oo[S 2d4)YX裝9%z£}/j_"A G7(+aH-iu~|9،p@<tYge hg]_+MDn׈6A^~˨ tABܰi/@"=NPK$rd+r0>\=M c9rꀡKBe=/*v= z"O;yܐeSz2dlmҰU@XF3/C/ԩwLLr /;ʴ7^$f:t0ً"v#6t#%t>`no{hTͺ9ijRBAy3f+Cu[=VT8#yHxR0F^3 =fl%,6@OHww=9KDaLw[;eϻ ڲGn嬵<ϑG\c'lv>)M'Xg yKRS4ʉ_E#c)! WW`Xet%|Dat5kC,./t^'- Щ~$a2rGk3&KۤW_qI%ƞ6,Д~B_ O0,BgмH89EG }$FλNP,WP#=wȕa3ƂLaہ~#g/E=\x)"'r:)=n =Nz ElN;SAt9*@h_,)o{8,[GnQ.c =÷Jk9eƺ킱o]1J6nv@mUMx-iڑM:5;^"P.8[Fgth.]sF L9t4 B/)klϔ@/Hޮu:C]|b;Q'm0!O;ڲ8vd.Jr# jvuOڊZIy׻٥\xy,o|]5Rj4%5 V>pd c7h6>QN\\!5Ef*GWƽbM |d8L2VJ؎>;hʥ] ]2YIG2s!('`,xN {Q"Oˮ$ځ(trJ}+"OD'{ЀrkTzi 1%~ow59mqY#AϻLxɮg ;K@Q k ;/Zi-.IKuu{{ 7UZG?b!n~F#M&ƟXIel =Sՠ# Ruiq_JJZǰen;ιb˻jť5^/cle®q'gc2nE阞^ C2ĺ[siu:Zv9?J=t2O3W%=på-+_-2]V1:bX'2p*ߩ wl=v>"ЫVncEФYGкE-n!IfKѡhk@_]Y|qDM(&ӓڅ\DЮ]|DWb@2K5^Y:!4_z*44t4c|I9/uBFk>ZuI9֡ Z`m7PRp[0]Dv w0pϼe}@3 %^B"-uqc;ڡϽ&W)):Obe EOy/|lThYI_3^{:}#OZ9һ5x'0-^-Ӽx#'fz"ydO}щ ]ePɛ.i<f#ggLe 9r万ޓ( uYhLkC>t@F|Qoج~Ƌ_W@t.[;wI-ݮ.F+~:6ΐȹW=s$3pf7vzI 52 .sw 4eq7E'j/a{ntݝ1S@j}IREni =pC;=EѰi$R=su#݊ =l",LBE>:߄~5Dn):i6IW:DߴAjmrۊ<Q)" n^#'0T;[xDw!ϒݒ2cTs A^ڱC>B0a؁jaŦ Oshؑz@;Cv6Lc:)^K:3A~ Xm/jzΦ\Kk?V&vt hB;зT>s}#m%l=ЩlZn.Q ɴ.Qxk^t_f%͐nǙ_=.V.@n&s7/.p7Yb{+2hZR,e^W0;b-Ǭ-"Is{D|E+!T4fӞvCfw-C)-u-a;vꉞ(8WO(9|ߪ{D]{^.bpbӘ. k ~ee>,x_FM.eQ==]ha/42b[@/9,Wf_/;df+{pJȠ_*8D'MS4 "/^/t1"_,Ea%tsV߻Eo&_cr=<Зxi :ek18'<Ig3Y^W7 moþ[8?H-DqSۋ8,قz-Vv5^o1fЁSȾȬLd޻@ #I a_o'GUzoVҬ"W+9'\8[ 'p{@Z߸46aT'ewn@ѧ/۟h$0+GH>\m|TUB"D$;n|ę#q_s:sQqӲ;7An,vKsޓgxZ.5E=w[ط^bl?Th xd^wnɩ;PV'mUWĦ_)6YyaXʨ[@{| B ud-{Wk4pz" n"KnY\96rw ‰6O^aNx8FC%$Q?6Eu C/ɪOvDr9?Yi6uWO(d85 ,0xc׽lG^ƍHmD}߿XK􊻻!9.*p^{}9}KkrghF wF\@O&rE,QwRsCf=QxkۄE> ݻ{ I^C-ȁ3ϑ]lOmZ'6}Ư_-AfB6=*o:3{0csKLf{mlj71@}-z[d:_߸-m#qQ]c˓sq\M֕2 '?ѷwr:W#n(dU"7sdٻDB,BC6M6=ŤGf_9,ҳ=M5dQ+^_lEIvp~Ϥ~m>5\M*{2~kx+ϵC[+^(gv3ay7*4eq)Џ׭Dݼgnɜ~Ir? VJ0+I |z2L-88m~=8y 9K I} esF=^u~&#vebAǽj%4!G/]||c[PqF zZչ\14YkwS-hȞ"K ;K @H{T| W>w"G}Ԃ-cOSC>u>O]rK S*r%.0;܇^DۃtUTtB':t۝~3jne?Vlmz#X[ #JɋQݦuqWKuKr(5hz OV+;-9cE#%y2ݯ\:rJk$]ZmyKC- 9QԵ? nvA֧fLjX p6_ytk N;gBt9[*H{@Ԍ\OnG:".{9jc;K[*G/=@ۣ,:M@,{{w+\Y~@k&[;S O[AONzٲ[ZtƸV ^NХtҫλz]rA]2ߨoBkQqB%gc#.9lNll#ҥ SvH@9C8srF[v !ңRȹ L^~<4(Gˍ1 d@t}[g`_oAϺFR;J;4R/sR櫓$e%λb ~iHJ1C$<-F*ہXf$J=g8"e,{6N*Sϡs0\[FT4"\!`ˢVW-5F@N-R ga|7J#-rtKП>U u_CK>#a8չ#Nз˼>(jgHye˖V蔑$wwJ2jF>(nwgn{h<>a~ڠ:Nx(rrτw XVW^3DN&Ay-تFˆ;C2v\CװUrz~B6˦M4^9K<-%]  Up^{;!f 42FH.ا.>uۮ3ׅ_07SW8DWl:sAoVy,l(Tm@ʀf`|L}[,}܏T(}}*!W5CDmZ7Z|k8uFQ˗G^)Ya85!Q >Gނf,!& پ` #ǞwikWSɢ0v@C^Fz^~tt7t%HZ"y1|g$NKP1m+mLT=G ۵fU}zr/F\T ݨ7cxI+,z@\O]j;f0ߛK]m'S2bGWs3n͠Gk."G]Kpue9{ @ueuy9(ޔfH՜'{^u7Б8/m_@G>f=rzV F^4)}93K:m]T W%)V:~yҹI]b.uyknrBg^ .>>ԂofW;SfdnjݝzX$?>oM#\e@OO\ɨAޯ.* O_XAKIi.zM. N b/v]_%] Ko~I?'aк5i RG~h  move9Z!wuPv#sEu%^20>K܊/BoXN%RBЇ^)I/n4Bo+Bv@X|qZh ,Aq7l/rLҭўB@~9u7rvՋ;4C+o{r2u}@-=6Shrٽ}p~F\*(1<hC]2ÏqzTa C$GK΍*! 논nN7 ]ԡiԑZUR:t()or-Ǭ[?KE8p?ŐCERn'R^)$f]W[t حf԰jsAޮ|F=ghl\7[_`9B'.˭=c[沱(2Uۍ_aJr=oW$\VZ.ytB3jtN]z-q`>t6EG -4"-q>y]f$d2`&H =._dd?GRs5<ҽ]^+[Fr逦(oSuhkp{&u}h)W:yݸh t>ǑHyh.K!gtXw_hv.87KZt.Iq]!rK 1yVDž^팗tq]{ܐ ˾mf .6{Sy6]J^P;۞U0'qX{;z.z5î-s\.Ӌ^N=h-%ǡU/$s߈0RH_W/mwڀvr#5lE19E-:{ID,]*ߥlFbA 7JLgf錁3Co1S<y)׺B*ϙH7yco׎z '{L#-R #/=t):|Rz3hЍ6~AW N늜з8C]|GJҜ}2SupKߛ?O=^bZ}^nn$I%m@:cǞtccKx3l-'rG2$Ǣ7*:r`iK9"4*@N=2:ǎeo7vk1v'ZpGOQhpA>s/rKwvdZL)S?X hde g^登xD$1m̴}iZ$G;m/ pNߥSؙcB"ӍhwZRiuIM횮 12(R>9^zFˠ jF;7i*r[GIψ("i&ߎ:]^߰yŽ;qϛ3Ul7{!쁑ζ6r"^&d"xrziˬ'vQluҹẀg$ұ]Y~[B:[|9\Ůb(Wks.L4%客k:~4J[ :^<57rKl)cTz n r i-4W;tm4#=)mݒ't#F^|@k/mmc CvBA )Em7rb>Wѥ#{3OBwWi:nԎmd$=5 ]/j^roTCϩo/;fX;4x6ܳi c'/rɗl޶F]wL,$ Ӭ6xYią-Q7Ft~)Běc}WFy>\ւMJ_];C_a_f 8 >*tOE_Q?MtVt.~ʊ3A߭}zlVXƜY}:_)QK:xEIFO(fo տfML6g #ErP /Gѡ8YO)b[ZsM"  w5T5F}y6o rM‚o,/m6e/W>K'vل?ƶm?bFP 4vN 8v=|&ekOR?Jkf`fDƗ9$kVܓiCn ~~A+9,(N ~9-^Ίgv0K_SޗCGS#7/ ؗ}/%XO\[}r\9Vs/C^Z˼WW/%i{]nV_{fTI[1S2μun/䯕7j Z|\QŠ{I}-)@ZΏ8!nh+_)D|MHB[?Pgo Kfu"ʖ ~uNrZCvG:\<| YAfҖyOՐNGc Ί=מMk %%oa$^xu&mf I،hR>5W<Zp]=w@8[L*55 =IBIё&wS 􌡲|ѷB/_+#b%ͣppw \P-/6wJA]c}5މY?o'кR@-:޸1C~ͷz%O6Q,#^~-d} :wBYEn[GL>3h>+l48ㅃW.Ґ7*yyD_f!'lIKq0eG8yVYӇ{<|"M-DZ1]'9N7Z)*Ps95ϜgTh8䪟7UNJ;O^N9^>쇊15"t'"/ԞiЦDbdOs`]0#dA@СETL =LFD rnȩn`'iDZ0ck,YOlbin/"n|Q!KZKjfv'E⚨TՂ"Э^rR{{ KP_e&/Fn r f`1F>Gp-* $~KJ5)F?lN|a95t:$"hE/r /+tUEayao[P|uނW3EЉn}]2Y=ȝ&؄=N]wF0)Ņ &]?7t+D^wҠ)nJ+Z[./.r}y挋m!+z%VZ΀/{Щ~@QC)>o ;[y~ `8^FB/m*vXxPs]gޕ7_w>dKN1jqm-"''\R{u-G0FߥyѲ"ӋhA~UGeRI6JmdлKijm->E~}e3 G.]9\G^.z cЁ|ÌvR Moܺ[]7[Kk Hǖr%Eg&A~S/AHb.OO7}^Ë^ǁou~(C_#u1Di(f M76a1^hOd$/sSܐ">jTNW(1dш+#3fD>I5R/blJzmR%xLS#\ޞPPoWDžId !|!4͵#_xNKd@v$9Re%F27-}5Bȓ!3 lg0 >$pyBg^6NwθFAw4d(mw0h7Zγ6l>GdyrTsA.qWuzr,}"Mdzj] %Q蹯ВY**mR<[tM7POc`vcow]j"QN~`_a#32I}?D_%+@=ӏ+nl>}~j óp3o6rlu. qҰ=Ѥ<':@I5CSEYLDz^^vt |s蹌}Ow's.j2obRˇ<%8gL;v3(C_Xf|T~r=~`w.U;KL:Azq k_Š$/QA܏-K\D c&5 ZbPp\Ӡs_as2M{~ǛLa}rdE2JU$g[C#^'QL!\^dg>sw=| *\t}K4~8+ks8Nr]R}X_!O.J3~zgB_QZz*2K+ \wt gH7i:KrACkf:Lx oSm?"rv5h1 Vۿ;"4S,֖bk,Nc kZԾy)2N+?ԙ<$1t#AcJ1/K|րkzJ_ FBKkC/0V?f`3GRvȑ! rIcO*&_37ُd↜$|?Kz u s޶o>\*/kmq 7-ie ( ZޠV_Wm%>#QIrb7LLZ^k 5-J> VTw av˷`[G>#0.Ίܰ+ZbwG2 >K6!H{nV*^7[(9Cn2u2:)g} }}f{L/c2!ΚdC gnk{tWq4-[9.I/~҄Ζ71!e^?")l59ˁPؾи8 d)kܾ0BЛW9U9A \l^x}ѷ%rZS?^ڧkzǙ |_Zf !aO2}k,7!5o26Ե P5~ #png$HNŻ ~߸"x^ {*Dyb]zN1`h2|s^3;8}M1h3?ɜ6>ؓAT8i>-g45| "D+Rwq-?k tUS\HYYZoD8א8$]Ų޼\Q>zGvzj(k8璑G.ЛT~R>k}Ux 4*x*IW9+dH!OuG[It}o_5m_5yT|Ic[HRⱚ5~(T],[ȡX )J|c{0dˏ츾/5c. "xB/\WZ$KOF+ cksS+x-}eh R*򛅞 R O0 ^rm.Ƣ04mnu3Zvkp8hnC%eN_s ؂,E4/SΊʧo{yPZ% 3hr"nq}*kG[f/$> gpћ.PV^35tPyaoE4q,=祉ÄP!]jb]NH+t|dّ/.d29/o@ .ƾ<7َB>-%ټ!VDnK)vC|KK`˞Jݭbrg* ^OtYr``,wʃ6)䚂LޑSI# y*4rߑJoIia.^V%(pݣ%Fr?5gjő/imУ4uvAtYlahQn;ʺS]-m>kX#?uRK#[Gut7]3m3v qo|IsAz7ސsd30V._c:T4vK({D".ZgEڸޢr];MBHK۠_#ɠu&վF_Ϩ@oVݮI].Fɢ"ן՗qmjeflmsAoʨVnb {_ ́P,^v}y[7߇ATlw]""'o,;ʢWLO%&"֬)RWQ.GƞE @N z&^|P'|t`H,2uᙲ1pX_n`\VTg읰sdClFi60n:.D'[{ݽС58j^ICkv MB}xw8k:E`,3/5/'"o-8]&ZP(˺2fa]b&7]|hʆ<9tԁ]JKt)G"}lЩ:Z#fh2&u#=f,BEHTS-^Њ%Ҭ%kb[P_!]VK]Im,-)ZIs~mP&R.H_#c`+'&vBJ w;&omy_vp[uY rYxxtBf1n!"ؐBs>Kvo~/ [tB]#z[,9%%pҠ.CۅDuQ{]|.=3 ݏFϓY""AoTC^֩Z c4ltރ:CJ5?:̈́3R^ԊO_j 7K%tΘ@yZKiAFN<u.ث5ԭ?F!7zRV7~mt>hd57v@UBf2{(kۑhg=ksǗ(JL"dG@iu#vm 9%~`g^"adquW j.c1=_Oqa&^ .*M^.]iW"6%lU7gGg҅]J{1ZgY8R 04ۣP\Eg )1Nf(zCQ h仿ԛ[?Rj~Zj=GafCX&6fɕFGGVuZ[{Jʹ+u1U.19u| .Дvb bFh<&vz5X?mFd)"GsN5|u\D޹țܢBlv-f M3faxAWF_o)=4PiN] k7h2`b rŅ"9zns駨.p_NDc\;CEB\U79} CEv-(k:v˅~<=g2e^/Hv rڴлE QkлF.}n12t*kQ2\H$/ZJeiH;/!мF_٣#v mdz:>~):vwYn]H9>R؇U3[K^W!Q+!xJ1 ZpTڐ_:v.טb`VލnK8"^j,% *ck91b"@:yi#PKCv;*!Q8#b +-RJЇ+};3_יB0^IMCG͓uwi47*NoApvom]e2ۜb1E\S_ȯX .Qw3FTh6h~Nd;\t1\bڐ_8rCaѠw^Uys]P_F? zwl[`i5ZobuIWlfD_zK`U Sݐ TFnt렋Q1ۍ~ 3N'ZN=zq^~@IFV+{.9SFgx{tnҖ OstYkLQDodklcIaՅ}Qt֩]߫-7rngg<l=lj"Tvbaui^ȯ{Z1\FGgg4]ܰx%EZ X:Ji& I7[.xEɧHdLs;2-q .=B G`.*ڎJLFEҹ;m4:CmNкQ-.]H}qsRύ.ȉb8nE[9[uЉ^#':xn/H-[IW 1*Cƺ4ܡޠtΙZy؂hݍft Mt#5H"nW֑##q/n*v-nM'9=rT:ʆ\O:'wऑ0a{XZ>.ґDRg`k/KI)qsY:67Ckd"lAI?ZcZp/J~SO%7ȯ=Gѿe JI3*q:_'Zdzus R|O]nX^\:Cg8Tzvz-)^t}cy@2'1_7ۂȦE3>VQZUב p$_wyBo-gzFrt~T%خ/v%OY'1yGc\ sĂ* |v7ȏ,9zB9Fva%c6OFK?>'{@2qةw̃,BvrUNr]<m _SATg DY;з̮ =mR͠;8'<.6t=.rOa5RvaRa/)@lP~mȦ' ?77 ƟVs>,}jS9eh]NQ;Ր#}k*xSۙXUb[-?KlD5d2gQhJ ~DrIG'[E+[蛋 sF9'8Mb 6<+VIz_b0FNp5A'͡զ9/(rgf2%9&ZW=DŽ~O?7DzaBxlnky3Z.oмZK\_rn;_,_D􅡉OEa% 6IKxMM \˳~ =FBOԡYb"pvMSQ/aujx@_*Ius-يYT/xkm2f6Aے2>MH-A prvA^R%ANq4%p,|.4Hl>d)bC:/;x_m>OeI>UFGu>:O??SuAU;N] 3,mߢ˸l=/ҋ^BՁ| 91g_GFsq{vco$q=UZzH(cmt!H&Af聼\F/6coy; =f~St n&GRQfm}Ǘ%,=G Yjqib2p$^,E֠џ|j)ܾPA&*_-| .z~,eY9YvN82|[r dQl Btd{f 2C3C#^ڙ@^P_O" [Eepkt#ܷU޵#h VŮ]ANrȬDdtn9!q2K+ɰu@ vwhYmz:J ŻGj1 ~pʌWC,kSMͽRߜ [ RŞxВd|ZS}}`OTà:t&GL% yb! Z-sP;񢭠 RAkPdՀz3+eJCD1}{UΟ|_:UUPKl[PzEse4d֓HNq(t=B^B{y8ӷ}jS6˾_,$Z7#I3݂)#s-V{1JX~RG)YiL KKr+0Ut6!*/#58a;;KC"wGfhѱN~8=Q]Bym?[s}3>MSV+VY^Z>7eEOF_J;eQ~wrha4l_4gZܠi־kU'/={j6B_SK^b~Q?,_{5W[TjM_)EgrifboKǤL7.3mٟ5/SljŠ{sa,A'=W4Oފ_+}EgfJeɮ ]!K(v6s/ 6}SXeGs# oۘ)4A[O~G5BLe迒HJEꭏt*[\:+Ial N=oP~3|Ėy#\1/OĄn3,g ؤJc^O풇}7p[+i t+[)p>F]'Ka rW&yX TO/5,BșzGH|*b5A_~_{Ch LoՓTB~56:Y٠rsen"o*bE x>]nB >nݝby2;rWu`!v@:u翤EU!bBHxC~S2dxCzGSİlo貄Rk/FK~SvF[+(N8ɠN!8!7d J_Be&:٪F|tN%.raK؆=e2|%: Va_ӵAS3 y+J,FVPO4H݀_NuC\g'YsB iuTJcC>]4 `SL{.n鑩ˍR¾\v5[f|1`,ȣVwDx!nJgrCGC O1ZZboEs^xC>V`l |5nWӨ5#,gr%,g7~>)~*9t6mq.3UL #dxmQuN-Z\ Fׄf?#ydw1r#.B~dYL(3һVUJHBF .7r]|qK#*ޓޅ: Ab(-`]䇷D4F& TWC"?EȺ7kCpdgo͎[ťHitIY#F.K/vm~S<$/-4譴uCV~J!~$:6yU3:_u%/)h~]G1 T\mGȵ^{v|e١_쮳"L xiCbHDQS&cu |(7H{5z0M郼F;[UP9ed7duwCo~n*gK@24{%^gc;s#װ9/\$VB~` ml]LFУИ?Z$H_Яc9GH/Gؼzհ_JyY 2Whf˲Wo#祮*wZR0n c;f؆"-ǰo-xF7o"o/m2Jd; >stٰ_ Rw_h5IfϽcuqNĴc؁U6,nzZ䌆}q# r.-̂޳}vSo4Wh=zCFQ^i]iJ1d0<ȫ;DSëZ.t*r>uIx"v_@@ g/WYwHu;CJBW> %2QsOM]̰DHn6SِרM;O*CKiQR@G6v(E3F~wkă5^y)aA%F~C?jBO KA{K,'Z{2'%zYC汌SV{IMsL߂@Įό rO\ ;7|7Qޫq=t#oC%~p0A Jhqٚ7h tߘfzְZ& C!x5!"8 <5&ŪG !e1bJ^ U1%Щf5Ư+I;VqK:rQ諱?gU55 ~V } ">_k%O>(e9xokL?>ڙ(Pfha?Z9f_AYf'XiNE%DŽ.#U[tr|mZE&xZnӎIBo*2Dg촔*B%}h\8p'vIJM}f~_]0 tr.vÞP?wJir^33{LvLU蓉S*l}ѷX)) rD@߅$?Z-8EFJ)rH+Rz8M.P ctoEL F{o ^凮4[/\\{ikɂ:j |XCŹ0}jѻ@&HoPmYTqT%`nX<#T-w~}gj]NnzF;=J,{~[lSMcK٠ڣElIL}U t~,'z . uKg AAZ]_qf̄Nq4)-Um/k'G=}Jz }Υ;t>{/.0kdjqד\m/bQ?8=dVV[0o ߫`)0*#zoay_Շ^=$v~e(R⫭sOqoWkAODZsCE}Edz~r'?9$甥G7.z[kj^r4/wJF>&xQ<ʚpp{ؒ8TObq\!^w3F>&އ.B`e?xy&~;`f1~\.30ra9}5p(/\;1 Z|KF]u?_>~9;ډ/V싽/ˆ;ޙ>ו1d47;z]nZ^S߉u>_+G>O*{.U&H[G m!RvHR6\/z~!Gz:oMMc4)U#6ݳu#} ޻ѷܾ{- =їֿg jeq1/W?}ʂH+bi5<)/{oSU"kvX-Šߨ僝*Et҇6d1֬G't0=G{suyb_u*X٣gF "o|K,_C7/xAgi>[vZXB.61ϗVSXÙ$.FrfqI[H`sDL7vՁ/51Ln#A7Υw.He}@w[bw-'Xl:L+ku A 0A_u"RqxУMe{o2z_~gvT;T/:M|]a_?lm *u蕐DtX}t-Ou;GOcFzLsN޸vuI p1œ' ;Msx>Z$y |?~~-ei:W?[AzYDR{ucs]bU9e~зS3/m en|JBuS"B$l1R`͐ӡs>~aosn3-\rS&h3Z z?y"~!㓵YR1r0]NϗgrVIL_bȄyo1ANE  GJv%k.?ГE58}s󆯋D44WdMƥMYW3E~ku/x[O%qCIi]CoYKL e/xZԹOqeytDgvlgvĝ?06=0xTOgfϰʏŌHhBՆz\ _׎*v1~^Pq]'BmS~$+7~ܱ4c9#D|IĹB]8SΔ4<L{&uib1|B@$țJ}Yh}2|G7#xI,f{gHsX^ "JQ6.k::/U >)frFO]ߚ"^kS%}S $th ~yCX芪f>I^@Fzt 42c*ByGu*m@_<(?`_-8 :i| qS/z[grR`s?yYN#5Ygm6W^6\K=?OKډd5{:n)FeVЌ)hT%7YP+/ٛb ݦ7qP=V6uFST Y rWlso|AtGJI߶ZCBr2s+W s@:HQfde/yvOE7k*UyC^㼶dJ o|X]#X]rQ W&3vYA=|zH^Ds7K߀|L0%f1_5)r5J^=;+:gŠ^QSf\ xuϠMNAON7My0CZIUM"'„=vE.# B)!{:!Exm#纭IcKt躎~#ka@2C4r ~|=~א$ N2Zx 7l2gi[/\ Oؠ=;K&1;"q/hȪD+[t&LGF] ;:Ab2^"xTw#X.Lҡ <[v q^5 :ѶkZ"ڪ{d3G˒qA 4ZcY}V"' EhA|-]2zj_Tlv$/jЧeC>kge:.I4~)B7vę c-n-.T=#o7?EF%{ODu-+<==(}k @U.F#ך |j^[F/C?`Y 2ZU A}zj0!IzS! Zq+uZ3 x9D$`CoEKXJtGS{J,0tnr[VXJvȉAMFc\T;v js}t`F.[+4!r2K5G7K 얺z[Hubu^MMcFSehqK^D3I9߰:} 8((J|5]i;rxf/C73B|kT/G5@K_=3)FgoTdc1[L~ُv<$6?>Z[$ K;x/3\&`l~㋾G5ߐ7ɇȧWx?[zV?]=U<\o. @2~dIAs'GQV6}#J*T {Zc8A6#Jo뼻*z Q4W1\cQfgEVt]B&ՠorCg#+Gυ=S@c?YCnw_J%mzY2ߐǑEm,cz}0ay qVvj3r-ߑ5{h^j~$'h栱Z~ڞdU?:,*4|TN?@_-֞yIA3%#;E>\с7%_vtӜ\D^l} r:hf|F}L}?(j@cB~ly/9YZG29@S2o1qcN*б{RI~=n2lV?);E鑣p=; }{`;6Wfͨ4|{\@_#`0._S[A.`̼tQ#jZ?_-~|hgĦ[0 ^2E }*sQ,+xpk ®?Jud~Zn{d YD߾V4Iw >2׃~R'~.?1oQt j۔E?eU.E~uO;tǯSܟ #XS9J, %0Z{ޗ:gjZ,_3=Mj_!ALڣ,jڊk (8zx̄42ɻC[h9uCB+{Uy6C"'$ɢߚP46 oIHF_'n :h\g֍/K|ǔG 3IץV:rUEܲo2bbxfJ#q>W3гG34ak?2*1C$9[/= YG'5/֎B34]B4|Fn z_jfUZ3VZ9aWl1<>6rr#](!!O~f:P@v7!@Oa|]vJz!d}Kc!/v 7gM+-milˈ>JYӆ;gU)ͪ+eeN> 2ҧka(`5KAϤBWTc&)~xs' tc\ևH-k{ޢʾx5HBd̬BS-OmKؽF7/zpz Qm]$i /t1&l@_3 A${L%ȹ.wu}E<ܻu&g ZŬ@nqJ tTD!}Zm_gI^兟4Gk̔.{A%XB.>x]tx3Ы.H_7۩i\Y/d{(5lqhGC {6,?咡4$J 3ʤͳ({bajU7=eoO]w!. ]wqBmb1FHI7Ψ94רXt ^wWgB| $6##zSH6[hߠ:ذuy~+ 䙋!v+K3sk͘hl. ]}ZfqeE o?}-;kH*rX!.%]% /h#z^W[].z#&au g>5;#~S.&;} _)4I4Ǣ7cgwI */$.=9M rEg@κ,O1Z 9Eȧ;Gǵ`֥ zΕ XW~ނ;M4nclm\(3x9ϙNF>dGCrLi {Y=/ Uʆb15rt*^Kdx9E' hcN*hХQ¯qgH^4ļh$CW$^n9cLxuG#1>JuC^C:e@_+E1m^%Ywm^>Vʛ:$o詢;^(4:tۋe'Ե,4et&iz>چ|IFA7TdKoo\?6.'Ѱ)ӣ% ]3Q )I@?h2{?m%ܩ]񎎎L5^GD%GNtIygI.cޠˡ]JC.Iz*QvФ]> r#ː|5)S! Τ"F,Ў- hO ᐱ!z)GiRyר]zGm ]+}0:m`E:_+S;&ei'tڡNYz ^rcx;1ZK -z'"r^:D>bB oϨK Cyӈlȩľp9|jtRYe4tKѝhǾs^t:;0k=TbOؐst0oHCSGtnxduB>žLC;L~&ƻ'lNl gнGwy/Ђ#ۣ7{%rK3ݠ`N{Ɩmߨ W eø[(v")IJn;g 72:z$ЪzN;?kR9Nβx`!=^:4.rEXZ#žknt8G0mε9G.uiIὪ-ځN3 D#U$ˆjafoF^>̬_S*u˭U45z鍥* /JېKȷӐ/7 l~j_R~=Ͻ\dP./4*2g7bI/ !e݈tQLW~cϋ)S=%ڛ!7HsxBAcds.-4T8rFn[|=s~Ȏ;!}g@?[6:cz]4hͮ:tCރlae KS*([lFNޚ@3\ !\͢r!Ju_yy"Pbk뺁Oܷ [S :N]R ey0]e\T4z tb:.rҤ?/3ql{)Nǭ^L# ZE\B>FaFx wf뚶 y2j&.Bzf.G2IV=Z;wF}1l>6oaC﫾(0ƪι .FȯR;fbd r3zA[c䌑af[R7Zcp =%M {JwwDrjmcZێ:Ua"K?s  ȃ%]5S0z (g7z  UQwm֣'rH2%$膜$VgY/3S)rf{m>3+i n}( Bϕ֡7]7ţ2s0諒>w1ŌQO_?q0N.+ o-v|Qܙ;.CvƦL={B Wޠ_k'CLB% }_H\]G |̠4zU'y%tQm#L>"AgLn^lN{(Kͩy[*d+#j # }T ,5Ϡ}>q} t |Ցr'0b|!ט6φfm~*Bf Yώt uhE"kT&֬g |B(JEaP[sr@3㺑sADL*&.rIˈ#6$5+H ˾ Ze>=AO9{6ތTmлwuVq%Q?5w^=yh8\A]z/-S3Ël["3 }1.Lׂh@o04p]_wBKzhnl22>{=6z!O]i>x4dy#CR SWjߑ_Fd:*kLֽ(9O@jW5]E&ȉeMz#ݣb'$U6Q:S zR 8 -FzպCoArB%$c*Â^Zv{C>swTefFs4ybB0>,^CE!GS .ҨCai1=s: c 7Sc;^R+I0dO|#kVMbo$Y:dg!D.kb4j[^E.PQWGިg݅ve}%,&؊r[(UhkϺF^gYP iaB>GNK' =tڱuސ{U| C F_'i6[^<_qt{KYBw*|E]F@.o&Z]aCvYkJ9w1ݍNKx[zEat-ku @q=Ɔ`zkzH*t[WDnAVߗM #!tFUW:4t]a2jR}"0 FEuC:r9zI#F]7+УFG; k5'.vQr2]K:;rWj أj;tb7)o xnndY-3(*C7˩/ġ缡 G:"IWCX6X/:+*uu|Z98˵ؠ5=ӭ#U`F۸N26爳P _5Ⱥ z|Ae .f2 s*/WW?tnW07i/ G/c3-E_+t y_ lB[Ӻuf%ۆZz\&{zZyHLk~֑wt ~|"WC:s)G+#Z6u]eX[u[]{!\/<mcG> ciз?rCѭ׻ OknЂ]IVs7礵a7mȓ4:!΍:^s97ސ;;Z\g6T|N*;+tM mVx~@v]{O*|#_裤{2A+ڝ/tEZAr3Gk_S@-PMIctw7}= Y>yy"q1h4yx!09q4\cD\j׾? At[>9 N(~#r "g/es>W'l%ERMh7Ib$Я LR'+ G=]!K^9i>~DP<c^kG-Д4*~CWMzu ]4MBӆ(vID;r'E :\| :K_ tH';v]a6he*C733{ċN\ס5s0[XC7V^CNgM';3ܑk0`kş7?Kt^>$mFguЙ:28],Vz;8"iC`zžcy TzkQ۵*3 yB)3 ͥme]3/:Az#鬎"I6΋/5St f4d֑֑2ҮFSݳBť%z^4{m>uFak^a`=F4 ٰ+z5С~ڠftl꫿t"KE\w1LFvfېR`4@?Sn+Ѡ3ԣBgvcԱcwBvFz]Sf=u> fD.1 m n=\"?l[ 0c(|>H5c@K&yYFМ1ꥷkBr~ A˦q7 (GN7c~ae7v(ޠ5ey.30"2#z!)[_;@~Ak}浌j leom]C%ga xYu#ɗ:K s˾%oċ;mT>:)Fγ:\ 9GmmMECϋ NZ E0~SKKؐO=<ǶVj^/-ƺ*tBM~gf ȳs5l6]lu+8|S/_,/Q3R$`06,6>[wJGNbO@? A~(2~Hcr]EِF9Sw9sbՆ\ݬ_5  %{E723L{%7(ːxL\Q c`7岁K[`@o*ovhϞ܂ AUy)ٳ((&ͼJyz\bAC@Wޔh{r"/@?t9ځ**yy[m&3K_KϪT藨SEþCEZ]pxT xŞFB/Zf]E,\yK" lz]v)ZhBf|Ɍ!/r 0&dhSB1i;gN5ܗWJSjѬ-řtK-~t]+П ݹ;Cr]뉜ޤɄVizh@ޯh֑]pnoC0~C5-!|=;]MϽZdIt+.r^{=3rǖuŖjI|G':[/,%"b览jn)vNu؛Ee\ ZwaQtT辠| ͧ{$5BwѰbah F(ПKlN:sxS2A42Rވ$E?Щ] 3B[H С?QZ y(t>>|wGsڷktf@E3Ab.tpo7;E|\|>׃Gк"V^GEUrbtYKJ+Y k܉4h?cނ2tlQt:_|ѝmv+z4S 6 CuAnQ/BxzjwDi**zEK.H>34'Cˉin\t:G ݰE(/u}iHKyYT[?g 2_n;E3A*/ Ƹ@'T@uńsm1. [cBy-sIg>3,Yڡ"D+^ 鎎 {G3R|B=蕡# K+#w|UYe溦-^ӽCwtI\wB6¦Wx"Rnxy<ȓ[4EkȒ &| 7R 9wl=ȉUhk_ˤ붋3uyKhWT{,]{AF~ۈo"Y%tt]Rxyy9t 65E4Qh]"zًSkKċ1:!tM^-eȂQ"@֋ޏ_r@uѬ3W҉#خ:Sv@ץө9 ߉zB;mIZ5VG=jTwTk~ !B6BN0r z Whg:gtVEM ү:t]fC_*i]3y%/b1`uTNtd" 95}~ZH ГR[.T9ݎ2$!9q71 9OG3wFNESK;B `ɪbZC @:Ѩe1 p.=]bdmB|dzFz]8hxA'X Qb?6`Э]glQЁ@;addBM\7zנ1 zevQgp`3䧨s=&CKPEA5Nzːw%jw˃\e|PZsu5r.kQb# 0/ΫwMm/Cy,`4^=?Cw|ѷɀV}̙۸B2dCfL!wzh撸GϮ\.'{36Gy'*,eܸ.IzOQrTdc'NDj\yb!/ugoaCAp ~PùeڿӼܼy2JBu ͫnF_ٶ5m8*]Nx gMU ,I^uSb,Id;=W=En =n_3y7.n"_3pҧ} % _"4#Yk- 2x?f|ŊY} oGL0ݠ)٨˔wJGݳ>2'V5;Y{7ӔZNۯ2Y Y6v)Cw"cw{_ZGb ywJxz'Y8KHRrU7b 4#M_6un\\ !_} `pE P?thd ><O7+bW$D9QAt\ #>~Ӈ22 q !OhҺC&>Cd Kb|'xIHY݉~ lkRi}XR~dI2>E^_]jܕ:^Y|a`D/z`:W t-|׏}$ CZv|pj!^0GyŋBoF߶@bfGwQU)\ Ywb>sRk+j7;،ϳkݮ%͚ bstmP70qC%;8?-\j~5~ϻ>=l]>'̌>SR f[8,-c,fҾ2aJvϻ]CVbf#eY)m؛3,Bss :@T DPKnM I~d }iàog/vԔ5Zf&| Wn/ {=|ݸ|^3.15[c\7rq!hkɼ} ޓ;&Uֿ/aSk/z ) cKZKǂUf[A仲a`W\nn>˚j7D{74b0Rd=L~mU*rKӷ0 4zkzӈ-T]Dn\+5| -Hֿd]DcL G^4e 3 =þɘ/&ޟ#?-]c}@4p;h^+~6T#n Gpܗ8r8;9fѰz~sђ.!SY Z?zlvõuey_uj{*WM[%?m<)i]׷YpFU"7ayP4In2>T7qwhh$ oErkOķX }lRbQvV ].P2Y>nn~nFGFljt]à/vs3V7.2Rp)Kэי8s(tY@~{ ⛌-Joz߃mD GE{Pp}1АP =N ͖x0G(@ƖkA?FC0WqQUOC5'Ж\>bcwyCCOǷ(.#)AA>rR[YL_Y}05AN2˧q"ҡy=Bsk) RW:x|P {!Ak@'#y36䇴g@I\9vzRwwQf>g=/3DVe\%/˂TƉ-)2e=ufˇ4Vkd*3iPu(dn rlnYog}G"\$7+MnIv#fO;3Kw Wd*>#ЫEN`<^r@oAFF\/`cY%0s97jP-|7*VAi 4~؉|UlV@= 䤋r@5v.=z5$/ѼIyez,Ӎՙu 2"N]Y=yԹ4CϡU]#t\W=5߁=t3;Z ڑoo͠Z},q>sq@E@!{F/Vr.QDMH57L9Iy6*ؽ/u]R##ƌ;r}&[B HN{;v(zTG94r}u깊! ]īأ6* ~HO{TG 7x9 } x@z(t[**C'Yh9\ftYb`vK?󒛽oC 1K[GnH;ϜJۅvtBQ\ib}& 0s1b`gFcv8:_ n+-kF>r4&) =U*rhB?OǼK"CW;Qq%?t|/d֟%Q@uӄw"?,'tpiLyOŔʼ k"FC=s*$.6r7l 鈓f, w~o q_.f=нE.*gUUhNH/p3\9cn0R߼`lI49c4&1A$߇g#߮]J;MQIęx=5T]czMȃ/coФ3g^M׋B"I?ЗK,/tYΖR%V-:tN]I֞} 4[HQ, bl7 3)rD.!C'1l$ m64/ AJ^t/+.R3N(j*<[p^/2;獎'e= pDL$ͣzy;]lw$nH{d *4#'zCz~$ sJ f[-\Rcn(t9ؘ3g4ԫ3\\)FFyUcJ n+.]H¤bz ֈ7À@n gE{w=.u)SͺB>s\ bQBb|?F5VԥبFޖ v=|D5Q?E8i2ZkؼRҮjCSΘ"'r]t vVXT]'7*M{}6N6<$~kACNwh'FUG]~E-#:5Rk|fЈLЛuuRB-3[G/+J&r_Lx::q6/H~#AcRi]h s fn 4{Q.~%,;6f<_udo~N"W#gDwK?3IouB§lag @܎l8v:AGcS*:ҏ)vzx *tH?%F 46]qBw(IgY=G_)GrD=jp.EGcmtf = :H_X?k`e-=ˁ</u:,d Ւ~%Vg_ ҿ-V^fąn] 1"v-@i5 ";iLZFbh$Ez}x'y@ҮGYrROs<%^&!Pǐq&]MV׆7ԃEK|::ѯבWPK[tFϮPP`gĝtZ=PYzy-xct偮鋢e<#tg :1 n,N:+#?G.uVD/?VϹxENmv[+/Fv}ٱ[sNVvBk6"4,e,=:4iӏD=٘4_ @մ=#.u $yIF׃cXWc\Ցz 0za U%%LrQ7)L^T/^%ƌNS}AJ't[[ $Д6@>4F0^7+tZ|TacXI;Skc/xE"/IOon@1)y(zQB3E;!]OTh9&NɃ|=u7r]:ĽG `tګXstԡ0 }`(i-Qa"\U}=m ˈ]-z.rxzC&R9u@/Zy =g4"l,$2,rt; y`4tI7z?69&-@hOo2zo"ݼ"r[cT3WlcFn;gGnĤ"';]la8f2~֭qS# 7\Qx}N+hqoV䧗pS+ba#< /CgU?VyJNċ~t/a[e-d[8ﻚ+ w̸ˋ,)E>v7h赅t'{ˏb"@3<%.^+F2NKءSƙ{KEI) Mٸx?:.Ϻ@ g(УI{AhI5]BՑȦ>4+ZEv@Z :|kv Z7i9/HуW 4!`來F.W$C.RʋE8#;mFުfjeF?~O3P8-:u\ËE9g@2RG{֋Fv5<$ cvh_o|^g)6G7r]:Ҡr@ߔJ،cX^^$[K?Gj`lrU6("V5td~}w6_ Mju=%Q5,]y }-v5_iƖ^e_Ɇ\u MڴKHx1 F?_9DAgZ"RA-n =eF[+ ZvDNfTN2Y_c{z6F r +'IrF^ !,-ק* 1FnȾeCȃCF3JtJǍvrFسyfХEҌzLO _k2* yUCN^32>Cjm7A3nW SdQ쥋UzZ /z/34:-jinz"}ʐ*?K={+/Q-2)Ȟ>c`xKH2KyR{xM%聾G{uT7pOm5X>"䯔92FMzw.`hڼ9\"D@=y8w^x\S:GW\{pyk|"נ:*\bj8N@ߎl }Ӎ9,&Tenz,Jڡ/Ie}cZzN&z@^\`G<]?]va[dU`O6T"tXuiBWu-^9FIzl6F[y:ٝ1tt^9cmy zQf3(=GG3=#7;@Na`ؼDy% ;Qv@u` ]$3^} v0u9D{^o_3ASכV1V@|fT^_謤%n~ 6hz_x ¶.r[ }@JO5ikBtMW^p7}=Ҍ-P7>-MQ;mRa(g> ډ^=.sW\.;*mϻzdȵy_R/\j@N8 #lΫ@_J#vJ7"oDĕ+1B3^-.gTlЋ]V@ޣ-6Ngiȓ7зtlv|Em]f\h -7p6%8bM7g)<E۪vX,4^=zFt"X?lFNe/-]{钯(m:eӪ:zWn ]f[ڱFoT6 s !('!24;? lJ%݃<Ɍeeoͨ)8It*1ncg{{*p tpֈ.&3ը0b-@j S3}OwDoT4z_;fmF//Ҁh9łqlr%V}*[;t7pzWo&oDq ( F0pN>\80*i(:F=OGћ3.>Cyd. 0_򪞩祝Ԩzꂋ\ՔwRGMnj[,15([t#9ϞU天}wBp;_d-i4(>Rrӥs1&kct@oq%^"]7kBo._5/^tedUw@ .kKB \` ׿|5f=D# ̒Zk!W j/W{'w3hzN7Iؤyyѱ7 D/QՠPePߑ@>FB SNω|#&/\$y0[ͬgհA)g!?`d>ri~?E/yIU׆<?;E߸^cӃڬ Yz~@^Z1?j-.vl&Hqzw+ .i]M(j&X?#i\&8Pu&ܾZ0} ]SZ9'7@3oo&,#r]#R{%Ei^mB|я=+L>1kiȇOf !RvX*9'yY+K$/},"'}6oI%P/3)\wl/=`S o:?^5ת>fM7Kԃ~>E\5[Tľ34gB?"AuaVi"~Lqk*R/z=4Jؿ8o?p{T/0DZy :w]skDz}A@|(P+Cw? ]w@țK5hO_*/Խ:i/^$ljxV7!/-Q16~/a(">Fy4O ͐Z/3_%8z/8?]nj5%C@5ofuJ^٪!g8?Kxs=F·51"^3-3v|~8 :t;ۏs)t}Va^ڤEaw,/{U A\.Zx;Cv~.^rc~7Ze[y@O1N1)űH?znVLϏkfoV_&qTiv+NZO8-񲆁Vn/v[\IXȷ[Lv|!7/k~3҃o DR#- ǂ- \o } z8_=j ^zhN)~k|~۠)8?6;*r}VJ cbf^c w#Ǎ Ѝ.MOOzL?S4c/`ΥyR 5Bn%::AKyޡYq [Hi] ^}s`+1OS{I/7p8}Y}~ ]^XP41נ5F(lE2.dqRp ϊZJL_|>ݥ.V2y p݅x(̠)o!}GCJ9缔yr{Dw5ckA͏]R@hгxb>1@nSڜWKE8p+B!nR*X̟rNl)f ũx9ht#{]@c D7rZg{ȵla4ZKtVQ;Ѐn]$s W3RU/웊>di= ȦQXuh;fEo2+\2-ҠWsA׎`g^Onw.ѹNY!A~bK\:A*tSQ|fȂ}:՝{ d~K[$;})t#mc\z!ϻ|.t:zJx^FLtu[@ޗ&h3FRF.WNZe (f:t륜_迢"ۉ\ fq3KԞu[^GDU􀮱4BS\V*t4e_Еj_ȫсX.`܌Mrmdnm]*}3 KYy]#F4.qhTQ4.ryHmNqѽ-&!h r*+l^vaQV%`΍Fbp +Wv5BW=7wHbve@']  r *;@NQ"+,Nѹk֧rW^V:e,w\5%*/Bmv%w /`y eY@vqrŞt=Id,`:Θܲ4zљ-$ٷ/+zm ޖfoe-S} MkzqNV|^*U C/mݯ>F)N|23ckV/x[*.x*{d3G: $i/z I$\+?X)4*TlxCo蟦/kY z١e}e2bd$]S%׷| y]5LϞ?%.ko?)N}}^/=3_nXޢ tM*J+ud='9Pךٙ|JrvF4}]ޱȾ-b9>n,O/Tm' }KKbW'NQ^*IZo9ْ֡I~+!sT_{fqrN"~ۮ#]8^}]sΧ :M޾ypZaSy(꒻6}o! 7̏\dг6 >WpfЫ~}xJ_u 0uZrL. ~Cyrg[ޚY;-[^ݿ&*wy_ =nlN?}l] IǤ^Ņm|2(:UK~~ ^OΘ-ds5r=шq;!U.O-v A3w3?Ч&ΰ#z >&Zay2:zR='yc>YgM7nVװ,] 7^["^0rx5^bMtY^6 3tb]_o^)U=96_cYc**9#|Ў0_5OȄ%Oƛ n?s͐=ixjjm|#(ɓ8?MŦ}!^˸~C.4A)T ?T_+8l]H=HWa~YWu|)޲P?F/ XZ^oFө@W$/dþ Е1sޥXRJx*Ǐ}MfoVI/}WV1xNe>ˀ~ȥ-PY]"o{ H3#7{dz1xsv_M ͷ5 d*v7 hPozL:v"tUhNq 2//ho,8>o>*OtOE !$U=䩱Ɨ0thlzڼ;3@[҆Rz 1#w7rG^/[Jf/\<:2tHD.~`}{eoT`Fذ{F{\\5Zًt/I PAKԺf`bPm_ځs;21.i# ]cL"X>^h֡y:Z--oz,ӗUL _Ŵ`wDm/gqhBnahխmxUd+<+M!d.Nk"\+)nzȸ;-]aXl[# ]J9] g!zgHc^ݯk踨-Qw( JN^ ]/KVr Mk^A_fJ j/dנ)FFrA4AGt*3:/Jw@Ek*dA}`:%r]gˊ~KVHGFNzr+s{%\Зyp$t5>tdx^_},*Rtr謹k A:cT"I(4k!v辚-W9ml}ȝ%x5.\(3H YX*=U,!zى#A+j"~ h0ZCE5RNr`}4BOiʲR\><%wh**EЋkCCz _KSi%3F7r\w7ov\F9tht#jLa^G/vBf 5{&~_-M T]9R0LM9E8$adrYGw_\7w7z iv'A v<)^lI6|s(!_ [GNgX tF F/dY@'Z5ɀS̞ `[Ukѕr.E\$hW')vRs^˪A>>ЛWF#cw p\M?2₧Z>_*Rsd{Kks'rM _gTz{=T]5doYJ|a;6` y{ `~4zfhDN_謖ͳry 1`B76/t˱t,{BW9Lwy wKwseBS:?B52Eiիh{!X5_"3[a@^zOJxAHko8Wi~۴)by߁ݮ9 =p.t.H|PEN]F%QD,N9'ZH?^@/iQPt"*Ǻt| [Dnܠ[,| )ցլe[4=/o]]9,}Vǫ}ТIoaؔo5Z+N>U eEF W7!7tkc_t}7t: /rX_"])f.#;扜<eM'R?6_do '^ /L6P >%i޿yU#nwZ5ʺ IeG[?~Tghv o荡k9GUޠg5-əZmN_(h@FvN$92;Zú5MQΐ<댡ʁܹ}TkiMON^b,nA 724A0kBZ7|-0Qw- dINsR!zFi=2jð\^ӈ+I#u]\]6`Gs"9tr__@\r З7sz_؍kiu| :%AιO@Q]Yn=гMG.`˙]Wh;!\HG Lt]DJQ zX uDl\zBۀmuz ,By+{nl^ m>=[^]D%@]Dc{O{H[f-)Чiv~4Au;㙸͋$`Ö0_зoRSK$hn,,nk\d@7X,BeWh2ʁEdtktqdto14wto@Ŵ^Sf%)3ud䶝_8do6Ldjhe_Wuꍰew-}k|F ri3Zx}9HgRyC\iDE̱9ނ i_H؇cmN0#su+z\1h7e9s0·C7yボR.ТXD@"򇻬m F)S jmRav]}׭ ?-~/]LR#ͽ : 4vmF p']E,L(Е4iVF-LSd;/.r-H4|dND>.0WX*)QCN<?%0*rH+G.]'_uhՖyZ+[Kd{\1#K?@VO:Ai$~3 4 Z_XK"'z@bilрV{OOz}5UP*}=1f7MqNȨZy?SrRt"fڱ7E -(M}|7ۀVߩߤo_n%=/ϐS7r)} $UvH/rY}葋|<}3J&1VWerߋkh8 qvB'jܡt$7:ЬqIboND;TD>H#ڋz@ߎ=kW*lMy= -Dz]4sSQ.贊 7g~I^ {+z3i=L1.ٻ1:,fezK,BR'Bw_O4=}[Γs=.)jtU莋9q"Oc'd]y*]\8"*A_ oKk+t/?`lt矹=]NhWFgt@ +t;Z+eUaSԕ[]>͍^/|Qѥbs]Zh椎Zɣf69Щh= ?p{[o6i1D1_r/DbevR/$u,2ǹ|(ÀX=Q2ta#h> 9P(~DK@gA }1rvhI) ce-wB`Û\dP2ږ };ƍˁ|~)CV:6רj=82:sTG~ ]L^~|v2R%ЖMf/@kx1;5Nit'H}Ӽ-D%+N*&.?zf[ #$%GִN<:߾*}:rl4:4 XD#wxaW`s$JSč/R2(oUL"m%E .-{mgJCF×g;vtJE~H%SƟWh 3$@L5;fyQ+K#6ϐOoOsOq Zk@;Rx@_._#2W['t+/'}]FK*SE~I|=ħR{}2Po1n-CDeHVfWJ#<\& Ff%ɋ,NsR\Kx0:\r[s/AJh乂QZ)M1/I;;h^:cPց@nÜt7OGzёEW륝&%j4*36φHCҩz@G}AcsJNgRywT/ ysjȚˁC\]zAto6ut,r@]T12rwp a/nXlrڼcN 9./uiz:ʞnU%i8*N=IBs$1NKH5xl$U GyPGNG t׷~)(+C@nF T%[ENt0v1}kdC)Sqc:tT|kI(#r}luD=g$'-*:V簺MKcEF{IMGidXW_J;K=3u]X%Љ/ķqT. &c)9G~.΁nt2@I/.ɀ<~"h4.-d}d1~1A.i9kG^ySGv">b8zI it]"^ǣt܎U|Mv^*ñfЌ٦{sDud[Rꅼ"4lM>[`ua UņN##uj7v B/p9XVF"y(Z{pcn,(gUG\l/)4i%^*Bn'?n}Qk_5\; s-yǖ;^DȻ:䢩7zkJ`,l}W_  ]bs~[/=%׌{zl(GXiNGns4/5 ,MV^}7ZIG 0Ը[$a};*jQ6zBf n/t YIWn=GUmtM\9x4;:,.}[ A7@{B.o,t~/r ThtK44::/D,2t=Wm@__Nix^$9I\Dxr&\u/k){}{k hN?7RfyMjR?Kإ t*Už?~C>MoГ&}RO4{b}6ã[35/b# !>;ޡyfd߻'6O, x bd!bo(f{ s5Z,!Z&ԡ ĮV 2z[(K/B^(yokeFO~D'ɇ r^k͖~da{[t]'/'/n!ӛF6ڧ]xAgsU,Hk>+1#1f_uMLM_m^qs5)9r[%ƅ\EEսso2/ح|^)%7Aׄ|~~Ύk'O[ZVI-D+s6?leu+49~q7tw{=bP|׹ *[|vYk39L;;Q|f,MޅȠtd/ ;̠+!N齍4=^/ՠWǟ6}(EoL%S{+o܈OI|$M=UiƞivC^EAܐۯ#w_u %u:{Zb p-/ٵ X>T/}ɕv],_SJt oq$tT@@F8eG2X_#^Gk4!%VgC{Β? 腐q z|2`ٻTY]r+!|K*r-KUWٽVjv%p ~T+t}JU}#@Z/"rj<,Lok&*ElE5"+1?-Q9iI0[pђb¯Ux_߾%)"+CBg~O=%Gud.[0?k!o:+y\F?Љq]'=/Rb'}&gƊ; Gϸ]?a'q_l3?6`^C /ׁ>SRE83^P=Ux} $ɪYBo]Ҡ/x2 #~փw1- ?)jo3bOiK}侟d5X &T0Po{ $Eҩ3fbs?<p V@ߢ^ T{^qC#<[C L{V.uil\5O/ M2*^ d#I*B"hߠ%CĿTS)?k:A^`gV/94EŐ' }o6dyxKc?ғ63Q7l,/p}J(ԢnG-J~gS˯2y>hU).,#Fe h7Mg\fjˏL- iT Níe ]=&z hw+v iN8&fr-C,5ֱN4i{ksfLةo 4-||*!;:8? 3GI{@bH}vu\nWtT69@_kc2 gC3Bk@tON rqWycENjb\fD:* ]r'OYN" XWR-rgHO{ltxA' h@SX]ciCp"'ᯫ4tIݺ^+rPoOLF-]7 y'% ܢ+ypS%K'I7#Co%mAAs83߲Myh'ڑ|QҤ (rtz]Awf2_|NgXzS]$h.ЬzoTA7LQoS{ϱFv]]#`w't v^4bvN]zMV5w˶MCK]t҈ LWC8͉B'RuC e#/hfv c11WV5.tZ]_tC7[n̯5+#!@q%_\轶KnҊ.䔜e.m$}:+eb].tJ% Q|}|\:',o@t컌1Y)txON^FN'K8Mgȓ.άe7&g_]t.yyCӴkN4tk"^Hi~#Eg=J=z%fG"1 ^i œYA WP5N ~"oaYg:ѹ=3eAtN}6Jb%o*4`:s\<[vu沮h6zB߂&2~W^9#r. u(CLs'/MLSoЉ&azunT쫲*;oCWv5όQ@ܙo̻;W }dh|'kT6ۺ|M6*8GGkz]@o 8#muXu1aJ7;%R +28)"ğ#\\M{\Z:{KL_:t@=G7Wj?1Z|)a%݈"}|l6Rl$A΁|Z?ktv'"N'sn}B"ȋ f7qՐjԑMO3 *U覴lPrJ[c4i=# ]InJnt>`{#"4ҭk7ڭ!tG|4}KOom<}ј6GO/ōk?u}>DyZNrqvZDG|7 ޢpUREݵ u@RUޮ]+Hr ϥ:ܼ.}9 mi2Be@'* MpOF.#/]2haѮy׃bۘ/6.y~{hPS<h~|bO`B4ޞ4BnJ:cHZV&N_7 ]hEnŽQ#R֡Frzu+4[}6hA9:LViy>Bu32qTH๺-۾;&Pu㹭7_57v)/M@޶kyӿޒz{6'Jd}HGڂ/p`ёmU,M*Ny^荜cH7ȹ[9 *r _Q?A!xVRۣ~sHzTgI"h3",\}"54rgex{hG~>Ӗr| p܏DQd zTo[ `&-u(ˉ-*֡AA>f lvQ%z]tǚUiH_-̆2^lIc>sH /!-lu=ew1srH6)0ۗ̎*TasA] 6t4@wհu0D|{0Z}^ܡ䏨7g%X|3v~z?#]`F'ͮ'vdI?÷LȩdL0laɇT6!@( 8JZ>UFw?6~!Ns g~ nFhk1&] {1zA6nGOMxh/*6!Иm`AϹnr2$褫 ;˚-v\#LoދTQ"7_乺0Q+'rYEaHlKS@ r"r(C~ao %U^;Wr&^\E%8.i0so p^]TLZQEc\%_--=#ǵ|5]g!=fy*kbWyB'AL:jK"@팠^9TǙgg,?K![byB\ ןqޜQE&-[ZU49'v^ȩ,2ڠ%i[jcC%~3#'ru=9-fTv>cT7Niuѽ]y燥+W$tha3#?J?w=ܰu }ZDC8g@H`n5s Wv3ݕ(Yota[&[^DF4}cE/{HG^rʧ\)-B>]N.bC5B󢤕}]d#}6N""*| gVlpjE.Rk Om"9I_[r*ԍ $v^{4( ST(Ly_t/*!Ҏf;I46U襑u-.l|Vș.1bK~(tcȇt_mt衺4;"tsG"cTrkس}  sgsB*Wcy~..}G6C,9q[TK%9]c.DqC917r(>.G~ q[|kvONMեi X9oIl;]bo붏)\*R}DŮ"(>[,%zuAD; SY] ]XdƖ&ȯ\Bqܸ%e^J}(MF.4 (4gttt`݊' 03KGnt~-QCH{/Z#֡ѱ.7r%{a/@ׁ6Kt)Dיiɣz ^ghX݊.5z^5Qweɖ*pC1iƞ0H><F I28kYgȢE903]FgC_d-.0 "g/nrWJ$; hb:?#ˌl4&~ϻ_\yyRQyWKr^#{|,79e22`O?Qg⺌нk'sąB'rN}qlщ\KJ5`n:K-hsy#!P-#?r| vbKG4GQc]6'X埐Jr,ǣc{} :iK%( :2@]`g]ΡӏSE`"r"'ޘAv hH7.04WG5}X^WSEP Q^ԠD])56J|{-[ ]EFлd3ٹsx~Z[#HgCD%-UR.%hy!\t4-GdCwrknYVz~A/nW- 4r-I1NsKus*:4/-Ne?GO׼X*AN/Wbo9BG2~NȣQ rl$(hqh+jENv[-Z{G.E 4uplyZtɀvo[, rKt#ɐ@32hiq\Bg\no.@1rߦ L /워.Mt"cTAӢ/y/#hw9BWX]Բ ߷R[_"CW9h'd;9Ł7XV}7;.:ݥ.mԂ͊"/#.f -2 t!{Bϻr[t7y4J :i4풎]%z2׻@~H=(ra8/3 ktwޅlHWZ'e #I-Qd d玮.uiA: [dwi4/e~8s|>No{4bғ&;rhnq[^^i>S<0"͔Cva`uRP[4X# 62cvFu"5{ֻ+ޱ/if`+~wy,zIX_ |[Sd.[Lwu$]{*4ndA@7K6^x-`dKq@j?Z3j D#䛪{Uuu뎋9٥FFoE Z4?^hn t`)7td$"t; lΒrˋ zua, K78sD%# Q76 B􄔥ПY&bt6yė;Ls01[8gWcJO#U 2i0>1[i^y /%*`\i }y z V{eo߁'] zb7'FأB/킟bf\~~S"%+> ~?@IF_cDWJ9؛7%:\YT߬^b _)}T|dؒ-bmb֗5n=Yvuؙ v%.6G.6C;/ۂJ5"7>}gZ<6R(a_3g2t_]àgj5kYhѾeI>vŮeY" ʻf ͖ ?/ii|VN&JUɁVD}}wqetdZkĜJ_s2ɢ2!͠}8,К~K@Sܗj? D2tY/*9/QWiL:qϬ=r>k`ou=Cʃ-W'y*v^_V}]=(ВӷRQI>LL|%7Jة$5wr]ȀvK*E"bT0V3 (t+ vǣ|3䃞J`d r"R6yz2y1~Qrpz=X>e Z&Tb "aA~m/)*jMU25H|B48F}F~/h:;ױ1]傋^k$69v]:7&:wŀx$WJ^6-2DtKYYi|j5b`n3都- r `O.]կfb'*~(J-h?^j>;H\g42=ilqQ?jfqz[Ziٞӝv?exlYw%I6/#AA_9ŠLvBN5Kz$fӛY9Z-)_)-_SEatL +[?=‹KOŞdU)YRiPKVy/us6 p7ݠuHrcS姍99;[xXoWJ+e)l`^B5&."g2=z`'9%w_9A|i+v$CX+}K(=E[7ؠ9;/-@ : /}_PTey-u{=_bC&6/nF7/mZ 剖c/6|U #oV-ep \5=E#_ϱszNI̾y:rՖ%^l~f^ofܲ$/רCWTmI` [UT6 :kj>3-=3Z[o%3jY^󈣟- |'uܠ݃y% .0  ~*up_hɽPdr9s坠U>mn8hR -gRV$"`wVS܆a$vbuЗ|q%sFe3f|lܐ꫻'t. r+\亮gk)"r:K.!O׫0)\~Fޣš ;hq-+y5t|=1uG$/3xɑsFq ZD3zKb.Lu[y5]Z }f.0jr P@9>$uihYƃ\;3)ސVeuvzǖ 5)a~>vh R2fE{/%[3iT}[=x_1~@M rq e0IZ8XP? Խ5FޮUF-;*DKĖgF~G"} o)W+ВC@i)#_/5䥯 vQjw\n|:՘7$#W1EVXqMZ(CcKb`n4jցB v݃Fȗ839ъ?F|Z([)<@x5J>Mhqnl,̽tGVCU<$*ᴩKDaJ#B=u2="+Q\zA_<ִ:tQ]bKv@߷.J~I;Gz_~C#W>5z@oWH=*tY/I1FGZU&ԕS9F yVЂžHFzxƉ97"uD-ݩ yR;E^]@o׈͗]8=.{!{:8e 3>uֱo<KEci͓ :^G˃_#Gұϙ/ rB : wA@ԅ~L샼ŽB_m|Dű^6_ͽ= =~7~1_Kq݅8 г<2%)Mʹ+%0*/Q#0B/!uQ@G\=${iIXjcmǞL,넞2;u}^*K$tsnݍ&@^# Rh2]3>nॴaRKj`W&:a=WYo y[C=X$)=->F(}q69SYg#&#Q`ek#-TBT3>N1 SƮ"1EfL"ENea>_׃|KapmNe|ܥhov]W),ih]Cg5kNۺt;Dxɯ$v  Y..u^1]ܡe%5٣dn]cJgehC}n テy/yu:ˏ%zՔ-R}EMg4lfr`Px)sTs%AKB "'VPVɘG2_ "H?SK/зJ;EOA7>@W~<=%Ew_:k\F7FF\hG>m]%{/Eh1dG<]'wxV @1z[ZXàE%9K;Ƿ-ʄ=QrZ}`7E \5Իsc]P EWkRsFHt.4tn'LϥKDmf`.Ҁ}GxW_p+:Pcb2\n6Q~^{1cڽ2kJ]w`-B!t|%NThQ>s~ @eGH`֗LMI P5v P^qj ]CI} K3|]=^A;wY y+DIC[y|KoST2HЍ*@7[e/;v#)فlrq_E޲5 /wavzҢ,a͓ڢ)Fȇ[\zջJ'^ʀhQ kO'zV"=t7躶o!I`Goђ.Bڲ; n Z{F=1y8|QelN_lyI*6'~qD취}Z{#'Ywfr\>3-_ǺY }yl(hot&: K2WlV!bJ[|:Y2 Cs倞G%evaA^bhu=+;U2r't1-̤@҂ki][x(#U^G;-.p 3$KX EH.#C{;V3Jne7էr M+7r6Q%޻-͈"TVOs[uq [3@3&v=);e$^jeE~ o 9ŰxkL^I"[\'Ȯ>N;4AӣN䊜5k@'<:$uAN(YrF2KGf$h6̠o^yـ k\EX@` Z",THUw0"cŖG0F^}.`U@mm$h#ߛ]-!E@+©7UZCr~ Nz>IC/n5.W zu=r#M f@R;z6䳔I[k6~mztRRSK/>"l_6|#EY\emq^;vLg=Q=}=ȉbTFn1[L}OӓS 7:@%y/+tDNe]{`u+r޵亖dnɊBASW3g=7k+#g.ۋ&!#~<(eВ \j@wzQnxkSӸK\PA׵He9ӒޗN+4y#Ⱦ3rP'>[|bozQ =uͻ@Ii$淊Ĺ\"s@M~ ]@Ne #Z&VCꇲpk=wz[uT躮֬leBwvX 7־/R]oВDxE }ă4FE/&=#_O/ hoq`0dt#g_fNS!;o+tc$KAWȝ}z_HQQ Ǿ7zC~TzX:Kvhf1j2 S$D/nsA>DnRfu* = / n[F.B7K1wku 9}wg}k`*4Oڸ^Ht/i)Gdz%ϧ4h ܹcZzǁrVCF5b/^hB3F9D\/4:͊4;M&%7ݸvrq6;ikRܔLxHa?GFNq+*!WRMu2^xŁCOCH+ՏGpAb5ϏA{i-LND7fvՔ@zFxDt /2V]W[ȹrUDΑ:Z[B\$q?f\m ]#Mt/oisЧARbS*#\3Wm;=oс|MoA^۽t6z]0"*.ځ|\%vK^ ^&LWNytUc0cPol\wH;kPGË:suwҖV'atH@)#8ӈL倮Ku{ik^(3vD8s[t^zŞ)9tȠI=}.|%FK L RƣjpKE_y45hfNF@w[;QLqZ=U,&2޾u wo:[I{ ʩ)e5 A2w)]O ^0e vm7={ڠ[1JF% ޶07Lg7L;2t1컍u ,{yw+tW}d= њ_GcQǻ'@=bP8/O%&%اFt? \bJ?-R@.~'zfnׅigykQVcexSY] [>ݲ$}CbħdK} Kc_shڋ#1s\i|o mt"Mgt5ѭف|a_PVBfQ{ Co]yF!44)0tuŹdURtudHQ^!'.#tHBߝ:B/14zY]#b('8kgH~"}J%'Woxnr]3u@ѳ~U=ȷXv;Owyr݆֥lGη9u}׵tT 6uԱ/wE~ [%[6- гPӈZN 6]Birsh)2,9x/7u(IvXEC Ҹ[;m+.Vq 28 ϡt%ěe˯v:pDZk%wI2͕Ff1Mu^TiYGV .khC}1D̼TY}0e9_ok}34IH2!R{asŦշ uhvhG_dfl1Ysvxl>V"+fy,Rb.t:Y7\BQYvbѽ^`BoFoa4Uh# L*# }͠WvIk@8at6 1Eb1I8]煼FН^ϗ4^dGx̉2Jayݽ썒o@FD+Q 2q"W!\o9͵@oII=;/ R)ݥy:])J'~@&| _ wb09Ʊ'K(2aGB:.t[gu'KJIuj[kt"k~qe)5G*&4,+Z+=6huVAuj:5q9D hQu2*#/@^%˺y)!g.O7_MwIŦI?nA^2>S]u Zcw7G%R5S5n\ȧkcL=]jn/k&pWmI}cؕ]71QSrpD$)o 9G^mh]F>"2&6u1Iua=VXS y1ە)X=}@یo[ш+t"t KkT?5;ucƑ1NrTŴ%nJOzEtCgFy:twH`.1ʹ^QԨ=Z=bn1 m t_\VЅ{CO#|ObCϤ}[-\ZMr A>Ku_SMGte,%qU2OI&zk4 ŽzrA7F9mNhNF@W[KRq xw,4V+r|q7]U[ ]BW.З;dD|B+iUNщ.6h%[vǺ"k+4M %zaD_5Yv|#gaQ:KO/5X"ȩ&ȭ9tY}iA)Dk%RdYZmuc-,"S_SJ=_y>5hKh 5G&q΋J}9QwF^x6^~)wEnt"oKCZu)nq~oY@T>y5wA_$IymTd72ZHXo.^AԜt\|]({>+d,="U迡׫eO`M/2 ?.{-2҂.c\6i%t?V{{LQoN3eM03oRLйM(NL|R/Ecln]O.6/|u 5.6oASЂ]pnt4?L>?вl.e@%u_: -wM٩-\nhQ -S4`Gv?lh LsK~C]yy@WsE. ZƀVk%N2|E3jf0zvi# ծY]#?R/f cdz!%ax|e@;K~{5"_;N>3,6\c ]}/7|FT+ڪ[/\b uH/ڐ%܅[1T6Ђ:Di<GnDߚдW2~ 8;(2H枠R/%ɉ}n,z5;A|ДANKFG΃~#PH+W3A>Th^20hkcKQ>r C)c2S.:u\o,GϽ;^VаiU/AGf@E"E=rȃQc Jȵ3 BN]h)j!Fuy] 9뒬.Յ?-j_owg?r1 {[HEb<.l>Q8:jKE'ʵյY:BE9ˋzREپ1F.%6/ˊsQ ]< 2|t[DeHq:'A%ס;:BqԄG-< |}DBC5ΤL^yXedTv[#2Ʀr FT/X"oRq=Vz! c b\3KKPz~$'m:=2KPzAOYN )a@^o^)t.V>6ϒ .`S J0:Y;Ѕy}304n*sԪmшn] QDt{5j}Wq^vGzB,c {/_[k>H=$j>|_E^> aK <70Kv˖ϐԫcKߦ}!߫]:=|_eސ^prl]rt׎lsѭ9\ `3_4rtu4ޛVh >K(ObF]/tZ5gDNѵn腷jd52ʀB ^cӡ_& S&2gۑXyҤ\2 MTMGf}BO X~bv"1K5hϗA>"5-Oӡ5$F^̼z+%it ߬R4٨|Nyun|ґcSl2@7ҁVY'J џ҄MN=\sYGiʈĘ[C E^T ZJ*:KUT ҢWU],[?QݰeX=6 ^RvԻB{̋$Iz%aJ{!꼶zMSW7h!-K{u|u LL>մCU|1µ$1M["ةT[ `$ 6Wm";`ztV$^C>=aԯh}Q= )WLR˃|~YeܮT5xXe4tNSp|txeC^#$Z.y"'~q2!+ymݫ z@} R@vF9Y9^2Ş (H˘Q[(v߅ۉ]F3Gs`҂,mGFyn9 .S{d&/[ WhxRڌDU{*ݝ꺘RZU{]:=Pe^xy8լ>݅8_fyXW?Lݠ_{E ]uЊؽeP?S}*6Ƅ'*Q@NȯZ#*kz^a*JCcf*ꠛ~,J :ݵ4OJB]y#l@ӆ9pCH[6MAQi.gYr[NAUE>sԫ-^R_)8leuFcD..4;|XяCZ/йF5*ENuH%Җu F-u9\lڀ^ }K@#CޗFؽbv@XvWV7r#m{o} xkZ76K PɝVh(79bP;!#-7r*A}E"%Q_ z_wɳCWu12.gk-@.Q\my}c{özY ]>#ѽwF͠D.yͻ3z,Dt]KRO賨Gg185 E͕c֕4 L\׆W6"/76KkoԯGb.'* zXN@ut.aF\TZZ=uh@I dasO^LSY@mF|BQ;oto /zr]go5fou38]8dc{']WvX] 7^\9fMX,3Vp&`?oAkkJm^k4T:? 1%n#׵zK{,J:rYQDEh[ #u 46:Бs70Wvi1BQoh/-V/f-8:3f [cFm!/ڠ߃.wާ20޾&P@ { @ ]SY׹.V)jZN4Z*..r*xAq 3Fh.Qݰ6:g(ǻ^ctL+H71W3#P$9#Þ:uFfk}W'uBw[ OPM_իt@f'v]~̾+@/Ϗ-b5ۭS6>9OTB1Hf/{{CvG`jT/83>RH v[. %8 e#W(5||]#h :o )kK':o6:e-fs6Mzmi׃zW=UX#`:n1zDoл/\Or)w伋b; }B_`4/k*c?.H{ZfD򔦙}Vz!JV934RF.tk}7^d=vh[6_\Ҡo%Zܥ:?j@,t9En@=_OWMcSma: d]h}[GY􎐭]R T'c|&B0 i9ٌwD\B.W:d}ڇ |!ڨ4\A'S&dlx=wT] с5lJTX $>+S6tIl/_f1|gw&g>H]$[4e$FTMO=؏"'Ij/t^RM>MZ0r ~_0;CROё5{wwzK@5-7w4jN@.K0]7͹;:?]l=Lzei@>]#Qmd y)*C{8{҄opVU_ {G@_Cw~~ x3/+`KQݞmi tiyJ:Em[}% 6@X?pSi)4q ]L>;{V̙䂪?S2ܡ5(bgwMm_o b_lC_ĞIoo;j.]V,_NOR/G5#=W&֬)2 E }o D* ~zΙ!\;ay jv5Ow c=W eF?oJ_ciF~ϩD n { ӿz "LqԷ]Do[[ʯ|:ki.ݴp&~ݽM@~fP:D`j6MT<㵙{8~ou@ς@ƚfC'DY>g@p  |~C)dDCuE@?f!uM㆜Է,/:BthЬU(?iU$kFOeg,^Vʊ"@_Cwo0r-H6l:kDh >6B,Co9 >XѴo^>Ɵ~zs^L1J% <) %ɯ ೕ#8)2exvrV-D9 =ԙ+W6>-=' ~<p:%6bPl:ʫ!tWxY^vt6kH#ts8N&iV~_oHsfڏrS!3Eq"Ӂ['5蛆߷f֧Jl"_y{QJDZ?g-{^c{_*4}5׶-Ǹ ]#*>Åq~gg.MK|\ߛO '3-%C& qYަbrP{k r"QhvL^gqВg$91QТʖmx.|Zi\qhE)^{$2Su Ӌ8K]N֡C_Z'䅞ezםJ>U~YIr d aV瞱x ;N?lCG.+ZRoe,1%|+lkEܩfw_f~V[ e /?[0u]b.;'"_} άV\<(Uz68`m4m{OV":͈Ml"YŏKyl:>/p\~'7@OW4z6|AN͸7Yt赘6}PeYEe|@\#kZ3M5-d_3V+o+nx ʙ+tBb (lz8p3>~Cd7{cKCXԑ?~K@f[,} >7gN/|*p֑=OXCf_Å]WF+!o)?U6d|sr.=4@߮"n:eOן_n~_F!g>nw6gZ~ϗ5,/m^ g$g:EOD^ʑ7|s]*}ÏlG"gęзX3ϵa-_{)iϾg2 -1]9'g۽f@B'=/+ h"͞ȋ@d@]";%ڡ{h湽,K` kPci=Vn$yA#VOXHv]GA%=KBO }Dc0U;td}1>L<Gn./S?wz tta ڔ3Zػd/t`NWlt_KIP@>jã~bGlY4?S^0Ⱦ-^RJKPlnz;r^eh<+of9}cKMUr9 y޻mizAn8q 'KHMAvVܱ:w, *r͐IЫStf7 -[{ځ']&TÅ.]m=R.z@אKkG*? V쀮{хo4IZv"tWѭw΅+8v󕨕}@QinArF $VAO7E> >ۙ4ɗKFȮNpA`N~=.#م[=w:2e@_Vn m32bv!erC-YUm}Ad4:l˃<ϦMk tQ:rABWۍa2Y{~S8򙿤L(|y[H9FLWFNײ BRr}D.FCK;9eFХ]O\==ZM겏q%~@HNKt=fr MU^)s徑rƛ; ^]IĶ/Z/Z%[+2ֈ&z)XꆝPtpKމÀ:ūzVJo/xZfc,_8OI´vh4_UuU쪺f^]Ը}gCa7@.>pJڠh$5~*|=NE;/T"4joK@^yrq/ jêٛʺ 衩z5_!w3P+ Ȓfx}h N#\ݥcuc!#-0=z(__$. ]iu41^з8C+kt)0^UxػwFi~Fu@>a{;ӖoA@wpm/PYhUoP-%OncL 5¾8>6;%#q/5FF6:=И7ߏÐ{Wtw\?e F 9o%DRX|SsF388u e =bU,k n5|QّJ^zB"7t!==[^mGzx=䭵z}#*۞d lO,g2H!cܕ,M zӁ]Cهv\zFw4}y]YۈtȚhxMjȹ艼-A2cmr3~)3kDk]V*}8xf(׈'vq =Cg^ѕEt 83ic$5~@<:^ۢQ*tBMjzR itЊ<>]u'UKWWv݃BƵaMu_?"K+0.zZybK(E/.l崹]~7"/tIi &U9݅c}ǯd@߲ 5߭'ϨEDW~q o!3t!dG_􃜗DiR_eTHᵡBCz~dkgWIcxԗ^ƣ /J2t/%] =:2EҠ7/~) 72RlN{`RIwe[W[Ұl>J7l5b>5B,,|fB:β󢲏esT"z6=ڽM:y(*w> 2Gto B7b[-XjV y C?miYNFɀc[#D+kx/-/ |J^7W?UHm>,Е|.5'dkBwQqg˰*L\\ kq#mN聜R]ZI]! `'B'5$%d#{>. ](Iϸ(:ns.GTY{?Mv:k}| C'/~[`E7^\ڬ-Mf7Qbo^QM A_ j|"QT3@C'r^?Q\oE! [RψڊK_D݂— h-Qh={Rv cH޻3(HE\B"  0~wp4N:aW%"#WZ^lDQ`:AJfW r$6Ċg g^KAnhyX;] s0eE!zBq5bZؓ87a+6'05M7Kl2x)@L^yb^e݂[b`E.Mco=O(|_ -c .VBng@3<[rhkki&c9ŨO@0.U }@Kya$;+k.K.eБeoOчйt1xz2 #ALi{ȌӣF>]nuv`-2h#Yr!ho <ʅAU?;Qn,} Řq F&=N!mz2h"4]6z/I 7v>~1t)0/0Me.ΡX19\e j9]=(u}@ӑ+r{7ߠ;O=JslaڼIzնe zzomd@^3A@X\ǁ],wa OGarؔv:#$yVW?e _2ܵ-_7o_NK bFA?NrGaQ@^2|]B/yѽi-yIꠅ9"jGṳbu, UUwm=t.e-g;HbovrZmu,_ 5ǤCi bS}\ϲ6^x"4~ h.W~B彝5rYh1'\FFgл/C_$_ ^ %'\Щ.]agi Kute("H'B =g~Ũ"F.atYH O}y ^=-ӕTiu yrl 1z= 'NkSKb{ch+bt)H#Qh G3pRql!倾/v+ɵǁJ+Ѥ<ȯhdz4!$n,]vaXO_ R0B.FnFi }A$tr w @*0c:a)|Ncu q/K;s3gvѡ:27ݠK軺Bu.>Щۥj \ Y uېH_ ` yur?\hG^}0VY5G⒀Yeankt[JUIgt3ɽ54 qTThw9ʉQMS:0z,meGNϥ O~NVף38ߔD@4%}/=NAf{Mw4pWZgizFǀe_xe=H7[h*B?E/F/H/K:рkt,.4vGB70J zb zdoWQ0}:EECa:KXapN&䫇A="jiY5Ay醭 Wkw0(=맗 zcC.A8SkN;KaG9L -S]m@m">3VذE$֐ F#Qxu͗Cl \9{NwnSZjفs 4mo#2tm^>EFߐ4 q.=i i[CZ[ 0\,2}"uAk"IyEҠϏb,3d?R5G`\ih ewS z4B'}n2bv\2%Il(Fޣ<.:量_&r~#iDpF^lG]MJg H7T"񡇺ouHRad҈+o_b#%"/I}{` R۠~9Mj/>s/l l>h25@~^ ]@|_YHdueJn)26#xI+1 :#3@7n×Y$t`gm4TD>kzcxgu(zAǖGQycjr(oy]n] q<$GWj.EI}'>>t*AS/ :7N! \ڐ HW1rk\7 E [ؽ,=ki응ZeE'ujЩ~n't.#z&](7JvW$0jCy !f>[sJxzI-cb`ԭA0dQw#ucZiߐ_ cU6ңf 9Y99cO~Is骥SS/{~d7Ш`GI뮸 );Ծ2T][9G.8PY:ElCޗnv_ -# Ҭp ]7G&봶FР6ӑ2og;3lc :QvNБTۡs>WN9GB#F&KȄ}H"Œ~r -oY :fȾэ<úbK"K\OZ,׹b/鹡>#A!ߝۀ֒qt# jȴN&?SX缝"Wҷof1I0@7_Lچ|V=V'Y-/Yu{ԠRxw/'kWz"ogeؑ'gg 69}Vԇī,B49'za("`O1rvt#4ze ͕d%R.8ٌOi1:7ko+|Ywo貎D,tɘu5)!w0Z.ȗx 7<#AsIєՓ~}\ˣK7hCM^v[cs.O]GʻͯsR$܄Q\a<,FC䁳u*Lok0AnȯݦhcԵC#Z>҃ }@^.o)yr˥m9ujnv;-q\Y5j5];ח1"ƀ`L ^^O5=#.p'xP 5/y7zF% qs 9!Kh;1ij,)D~ӇAjۑ߇0L#o1m^zs{!ѹ\?胰$Lo/G;X]ENd>΃R$t;t[刺~FF"7Q\6x#w^tE<Ϋ P=NOI{fui~mdz#wZQ0KNvAQ{_Wy-`c~#GsuZ<),r:u75NKjcV[*F[y.4<\=J_syĥG )%iT<8:rhOi۠sHykv/nQzV6!A'4ƆL_ Zvdcd6O։{TޠN0a4hcRgl񻒓Fϐ5D]#?K#ӕ& ,rZVt_\zS\/)Z<{ty;e`8~2u&k3R4 .цURhn{pA;LafxiofaґKhDRo~c(N:d1\n'{/`0wjgq!}^ؐb!r2ӞLx.# 9jYR%u /v-$ؘ#~\<9$6By{āIxAet&#W٠sљƨR#u~Ia6U b/ج07߼ݱv_;Rޠ{h䳤 -*^ygy$DA iNYF଑ml뺏- Q)v󘪋@s1$0R}6>1bכ[A?F "ϋǽ!O*2Eƹ6w٠: rM6nxuhWuC.Bo ݅:u&jb4*fM_9"Ȯ.:z"punLR#AÞ,Br:I_ t >sF;"Չ@9n!f)}\~l\by I2I}0WOqd{קluiq:tXלf-4/(3$t`f<Xfyנ?Ӭou&9ddhTip _IN#,β![y#n$C Pۀ$k/zMWANBV}jSm+_n~Ha8~Xaly jh *}J֔,*.a(`윥rL<']zc x?(cC{ n|דjyeiqkhBVTv例YNoQI_RR+r"O=B"B Ԥ=9 29ɂo LYg%Uf{멘Z`liRFn5hѥ!iu\tɵ=cbH0di ~5Jg hNDevPkiqpr'E.gjWr - -OطIzn /2&R y[ϭcInokszFDu`H=p3E ׮Qin>(6r *b;tQnE)RgQw#u|]]bz=*,BUh1]43S7s{5cK➮Y]^/5ɉƠgtFu.DK,V}6;y8CY*Ct9qLt!:y~"{kf^Oy4cC" CN~>ќ`tةF/u@ny>nf"Pyt>3aCGG u$:[ovZȄ|w=fV4^;+ؠkҨ^\~Ao!)>A 97Z!ؤhۀPtf-ԮiE\IqXdC_)XНpBQǻxLF0{;Lr 6a,N96:}K aq,DpVOn۰DFVy6h1?y,1UGI{@5hVXnMO6SCI| ސ0`FtydsJ-TڑP9 -شWAo!!ˮREUR]/` /*$r&z]1 >4eC.K3"wg.%,kS] 'wy®ݲ!ϊTač.ۆ%12#Ѩ;v:"cϨБeCg)kC3B 4Ḷ_2 p oK~_4/f‹1[˾0rE-݇nhҡvB!Z?QK< *![2]n"9nt¨u@KXF:4; ڠk[Qb`"?;4brY#zL%OK@$,&7j!P!9>:at4G˒L#641Eӽui8YWi7@+pqIܐ>KǪ+MOGUnK=& ncF^cN;87tv+wdGey?$j0ӓR瘡ɺH!ݩc2܍&8WOwÛ47H}O*!QSTL/,],#=DbM&WVQ)r~c&LEb3k~9/dX U~-x3GzFz DboNѾ/퓎q}SJڬje\ ?gMdCkY;Aٶ;awAX|Z}xp93-B\`_f. M%]{ܯ>ժra6%9ssg3yX'y)e9Z{t~}B\F'a{/Qxz}f-\; VhY?s_Kr ,f_uI   vhU 7xJyŎ7KPؖN_K:NCΦy%iCgUFu\ qݦ/vizwY?/K"t{b%%ּ]L \܈Z~$7P޿9~dMڡߩS(^T[F~F͞%:E?Uw7-6}%zR>R B n.=$i%ݑ'н<'v n/[) FkxaVvo>پ@ 4_֓/y۾F! g?j-M{Q(2m?RYJqd.>g_6=vsYC@hЉGE_8PF~^t?=Z'ʎs_.}nZbx/:f6_[Զm; kGƛmKscwNɷ ]P~\̠ -9vx;\h8,3n8{5yQ'a`/'|vycS3>\p];Cp^t>h|89sS|N3:RJz/!(3XbdNsG~Hy·¡5϶|h {p^|:!Z b/y+v2Ml Bid?˒=͏y(VhmAwd0yG&;|չF!iim|EϬGoWpW|7 ~4B?lKuX)ybK5lzX恽]MR"*cY]Z|?nEh6sUnwSLgEC/}'O~f5 )k섟 unx !oo54'\N:voєC*ݻ~o)}b`\#%[X5#aKR)cCOa/6BoQɾ"3" 9!c.jB>o̔^}7㜽V9Xif߂ $l1 ak]f, 8}|;4OvF5gCj,}qS Lp~(crCϔ 41`C(Ho8Yzȱrd ~fyY-ZTDnTx*AY@3} Y|~3M_ɴ+]rɈ39{K@GzY܏q>)w`_ U RŖ)ɟx>ԅ;Olз8 +$i\Se:`_·3tbYh޴&xhGiF/GxhwFYz]ǥB_#ฺ4eQ r%Dw= IzÇK_:^eTN?_"8@/jv4kFbgu5p= 8.z߶Oh }[U6hZ?"{T_@&Z?>oy`6 toAQW{;t˹nݡKoozhu $jtp>_cٹso+`BSve6)]% ~|k$t(C$&g~;%'8}I+2fVPxOݞmg/Awe_3iXKYj1Hy]*ؓN7:鋟NQѾG>S6#Ԅ·E]VlRΐϥ0ޫo͐hF3 *?jC~ ;Fy~,7\ 94)LЭpΏk1bV Uzș3{".6S X>*>`OV}c]]X9{PFMm*) mLs?LJ^QKF~d40>R*!sBZX֗"s]SƩ}7g@ARŐ>U ۈ[6| %flꂗ M>d#<[^D;%O.G^W^ڷ_s }p9mx;Z$k]#X~T3 y+ VyЋ؃ِ.Aސ$)Ւ<2TǩAO ԡZ~&4ūD\!A?K ~\Ϗa)0f]<%g/* !\ӋnAOu t!?< B#?Ap׊9=e%v |[!_ZZ -:-'Y'z?-@SQ*fqcG]Y=!\O-9\ 9i $"z${.!7Ї$P/5Jȅ XӟW8k^_%W_Þz m_ڇ^JjLJ\Z%X쑃FTyL5IzhuE|$q4fuJȟQ{][aj|o6ψ@9I!JqޠCZV=y}͆}_\ bC,5Wrc^QN6pK>%C~ {-ۜH娮p6~_>|wWh"_ BГM. (zГA7pynSp;-+8H/vE}>Xs$-,R kyξsA[|.ۡ3C9hn{_tRN- <(~jևc9}=xԸ¯, u r(4i8w^eTZj]Vזy>z,)/zύbг*/i](RbIT$ŔSEWY򞊗re 9$-?KP^]4~..Z/|]|RF z+~YR4E1,$35/ޥ(bcw [.}į~3^`h1pfzj`sF FueuE34}j&j\h3k. ]fEG~3ڃ~ inUr%2Nn&B X%FM8h NF[n1Lp 7Y!̒y CYcdC='#_E@+tDS~X:C )?LO@jʨ[,LiDZ~M]#o~ tKĭyZʕ@~,UqٮE?='xS {~yAt􎜞_<z$_SfhTm bJF.s̸-.DO,?GithNSk>SȂ_!$g|KhyV?]"> adϩ.b54hZ9羃O9_bd"Kx ZX}W~TV"TaJl)b?LQP}_7mE,a`k,qxҀ4b$t/LK6Frܢ__˒s0YB3K~(@ @?Mt ?Wx>AG=| [PᤐNЇh;Yт3s<*4ϻ| ,T|{Xg66`W~xM4A/W6׍A GayAO ;CsG Nׅ.Z/xB2=ͣd5!z_£7[Ho[fF%Yg|*Ua X *o߽~aV%Z='|]wi(cY KP}_ʺ`AxX>O!'2<5lE%˒ 9N4]d =קS@cGߖqelU"AF_ix}Ȗ} FKˮ ;zrBzk LK ~ق}ky[VDEw}ǛlкPv]WTH'> ]8lOx rA,+,7/xST~3`̈TQKht>eérmF#l7O?)>zp53 a輸Ef9Qc+(۵YyO7W/x}h޿ۉ'<^e|$Sx:xKp!t!HL-<0D.~K tNT|[4x#`B޸kr^T~s- #hl+;I}qX:}NO+.xI$ G/w9T9:&<&KA\[VSuЫZZ9Y dZH, W:o:MQK]e~OaN7qJeG~&׉霹~[N5Zv2o:wO?C3mSeK*CUCu@Kh~U V &D㛍^i }j~!gD \iE{vZnbVL<ܲ5d\~3 -M"Et7:NZ ^Џٔh3J hSEz";P tO.f{>N/!il)?'Ҁ8,jzG)" Db_DdA7okPU/,pk3Tzaf7~EBg ^mR`Y\g?-4F[xYC.z |*4Ga`ӠݒrFydF \TI5 q\/h#`+ 9dS-촸xJN=;rN<|g'H)GϜ:猖on+|3ƭS~5, }Z-\='zuG/mYl5!eY~ W$YqyA7}P +MoBJL-_imԆOR&,jP.IJ4HEkuwA7TR.ף ? 2vbG7&˷ 6r䌁?IB/s߂ge/K8I ?V?s ~f__^lr4-O`1iXXOu}Ws)|E:ѐe?zEn_0pYcxƞWmq}b C\w߃n&G#AHIrJNoHs_Wn.hoc/{tW,>***s]^_TbP9+_# Yw\oRl١0ؕ:25/1W$3AJ6-r U6%B'b/ytFGKқ@ ZgJPh {tCjH/auQ ̕g o5ţ^k!wmdӛ`Wٍ~eܠ5|D<=`dgg}dCnql% o2euK~c]Tx !;*drCHdY>==5<]_y#ұө?v.FVM7Ua^dv>Mw=>Դ#[eㇿ6ɕX%JuKfoȯ;dГm-,HE;O})rSd'jF>Ґ7kn(I{;t֣|Vֽ5AM:\qa{~.vd.bF~ݨ=۵""efЗ]MSzz:aoԪt%`O#w嶂z[ 4-d?$r{mZnZ6v+k*e~m?hGnLj]+)P G?o&E\]:% چE`-lr]o.o)22\"1!#̝*S]2 ې~O9:fI}!QHO=]\*6⬤OndmF0hԝ3@s%7t'cNit6=v}#GQz pC^9hŨ U[5ڠwIQ> ;m }t>t7nײ:u ےQ%2ґz,n;r JGs s#'*i-Uu>`;# Hྐ6xѲHb;_ɕ>pn6b: L8vdZ:]˻ONA"Z *kD6ԣ.8!'vY̝С1=^'@*ns9o9:1r2E藢"':[cKO1L_$B* E㫃r^%"L!䢴o0݂-'=x޳nicZHK .}^Vu6Jk_2TN=lC?VŘa_f<y>2j Tec|ATYDx[d[#{ :v;1%wFe(% 6 x]^>ֿٍ[k}[|5ٞ_9(МRⱧ뫪֣JEqljkW @!\6ЄR gKAEч^;Ot#QftG,=y/7/ݴmk:*Gdb _ф> m|\= {9 d>tĞQk0zX)BU3GX}f^S0Phj)8ֳ zj~J]u"\)\fѲehSOgvE>0hAz!fD-v"]\6t"nՕkj0Qi޺Xix ?ad?ݑ̊-=y2~?/ְUTVaTh,mл7m:hC~Q06KxG!.ެC{ڼ]L$3EN CS\DguC5twK 4qo-o@mgIWShٚr] 0'j[7V>3E[QoP!ڠC-:@~jJbU2B;t2G!T޼8-,+F ou_aEN\#0>RW<} xSkQU)|,ұA Jn=Z7`״2Jyk/}09l\)@ޮ>FȩduCfq y ߆6N1j6^FԪ'hݴۆ|F(޻5p!ԗD#j_\/%#JA!ϙȻ"T!u { +j/= nqC $t }nrԤc٧^{˙k/=BWuuoP5u\dė^KJ؝6lCN!lPf|Dp7v}$:i߱_{oBcGn8IqXbI6b$,i orl=hRYb0Ru9Vrl7tȯ}U?%6I#Bsț-ޡ{$^l2rL̨meJdYhg3jjz[u[LUZ vŰݥfyN7&ln-mT!F3ƼJG3−ku{vBE!1Svk:5R|{hIF0{1!Kh_%-1rE޲Dnq]R" CunrҮ_9c?-PaK,!%+iCBc_;r>KJ}Efet3kЎ\)P .6*5)u\?'f X C;Hwc".dN7*Rz^@3ҫ;"2d_W RHyJI_pSatK4]?Fσ^^AӔw䩂%q*I.xIpOGo͐bv׍\!lQ/|GɪxG9.:6=d]X4/NK \#;Fpe&ArHaGFy=\Zޭ MKvDf2la!G]؜RWqC]{tk<~N(!z1>*iGNN=}(IJ[J惊4 Y9$ng-- bO#\Ωk!׃٬Cӻ\x ,6aZ|=f^-mH.mPe|"U+Ce;Iƅ>mԂfϴc/@{P_)xuePdd`wbh ׋p*;K$26ry+A_>F6h]#㝟gkVܥY6hW[[zNl&__Z6nzӵFc 3H7ޮK? Yc6%m* h3:`"ys}s$1t1F`GGhxc!6zqc:#׸ww '. z({uG6qӳ.|qw8 { ִQzc􌗨}~~:w.JҎkKu^%R7]N܂Qh.VqDi~L5pɗ#M2Y4:^ODMr87dƲot#C%uWyGQOǨaŢ,4-ڌM^| WH"y!WMO$:tRhCNc< )O{ȐJbzZ7=6,(t5ڐlEFudJbe]ٱ _ndA-Y7ruvvW11 #`f/;k1b( ]%_'-R|0|Ho䔒/:;=nǮ0Hrau [cZ}d`tF\mZ#c^n#miy" C ̯!G8Ç G5;vnv״"̍.] :l^y7H yw]մ,.)bHnD3Tι5uC.exڒnr PR0n)VQ w\}Fѯ"}9#f:6#&Gr λua_XBAOo؄Qw!W=͑' ?;#UkjBAOyu3Եuư[^#;3h5y44rT<%B c(,KS^i^;vHjVFjb݊^mQ6E,;_gA+<͠Yctp:KX겹$ؠ7t9b_6GS4uW%3G͕_e}Z.O{ͽ*+j66>W i;0/C(6ŻF/=62]H]z2s<= jy9*d/3ߢ#"oHIyz=,/4Eψa9Gl]B^~˪1PYٝ{]3G N 0LԒ>Ӕ"gVO#t+6֘@ _i@n1H#'Nc СqdF.qӃ:4ˎ|^#H҅ GBWh -]u%U nx!mA/ؕing4%ޢĺz|i#b[7%O{qyQ: Q墳JwО!x͈ox""mm]9/~l4^l+B3-"cj:i~2'3v*gRMz]R*&//-G<ֱ-Fm ]-2LK %G=souCyO>zxR^Βy3P)lԱ+ m{Jz`v@Cz#Ѧ;/B/ȡ ZTEŤ5zz:g}H] K~jm.T7.HŞz) z^75]qPdK=ZQeBnhMkLx&|ENOY$%+T%rFкv/y}bjdFN-I .觡XU tRnH:)SS;t´!bGtw)QNW>A$+hL㝇Qp403PC>_饞:ΏU2o,5XhWt^˥LW~Je{A_"Q݀khM)p t||%Iޥtd$Izm{k̍AO/lM_;j@GM? (@N79r]X~CKhG[A5ϼEX~?<^{L}ynzHhI)"nF#3[Dt %\􉰋-=ɫs^7 C{v跌Dh)o^ݙ^qBdRCeC^ !=#ϔkeA}mn9^R4{PIVB3H/AVyĿ 7E.2N y rQkTOw4H{ zH 8U3܊u>҂I% 9%K 㸕t_Z!F١!w.TIP!UA|DJ\evWWzl5y) $c38tWE^&oq WN'gW/֜l'p {=\}#[{t~ov*!'er#$ Bޗ^%ۀ->7橇yˈb 9;7r8]>Iǵ_h9_P Lxx-4$[ǮBM7m-w^ NeȀn//Yʀ~7⍝c;c#6 tvyLZQ {Д=[RGڐBu4_eõЊFrBgٻ[У9upMN2ߣL+闑=:'V"Qt m<,0 y}Xd q&7Ɉ] .62>.mC~5蕗sWqIC.r]l=hxwߩ}%3C\&Aԗ"[N]E>|Ξ[Fˀ]w6"? | 3C;Gm n%^ ukIBX`Odl,1ґFMy[ή߉ksٍCNe^p;$V%N] %I }AˈW;zr^FP6ص4qcS:Ë+Zbo|.y-Ϡr32{bg{w`Hn}I&1|Fu GrC:i0Rrq2NծA3Qd9QSTEĿ랧TrF~)I2C"P a_O{f]a6mKj1Tی鋂7EʳRԡK;#f3 _tD4z>}CΑ3f m;(%kL,lE}l6c5.t<}?Ĝ5<@kP=X(tcVpɂ!NѺyB?|VQҸ"R/x>8_uwN&!/Б;hml 0b:ITBɩrn)аG ZĮq?+U՞bpӇt~gϕ,Us\ ~ޡ_GfT_z9YcAZ!<# ԛ8+k$uX{r62zO70*Z}N9~m*c甥} 0l ^SvBWk?oy{>ذ)4QkQdy%t)2J}wnf yG0C_o%7MwG pـ&47>`f3}*ur:~#5zyM~w* b 7TDR|u\NN5J.J7Г> iǵ}s k57,KAAiMmoۀ.\w¥yh=v1'+m.ٙTG=b+5 ?<.&+{rkzMQc9}Jr(x٢|<(Pjܴ|Sz+`eU ?voʎxe+0yjoqg'r74u츆D/bvppxk%E|h!f.M} 䤘Th|i 9b_=6y^=_Uxoa1}~ .xdRtU%@}_d6n>U>7}Qa3*d;c?~5|^?,W#1E:ogOm\e@eO0UZֵޏK$#zcB'/$O8 zݳxe34h 7:#M?[^[p[`ӻ/Y5zgn&힩]鍝? ގ)\M2X` DwyOaKpۀ;z߬M9=@2,? 65 :mT3d=>WL$`YNĴi1ngKߐ_"1[3oȯq+zrE7uB-z`L Cϓ 3,cC6Bn.rNV !p/g#;v_gD3EF>$M2}飓(j mg^B 4qϳV:ڭbz:,fL^3F"u+D$gޱԎlS\cfAPK.RCH/5tۨm\7Oܠ?_'OrX7rsww3jcT]]!K_(?ep3c2C6M]Cs1wY2_lBXDoi/uF +t 7oA5NB^6$}(~?InuX+yݖUw$K駿9ޡFtpݠXT._:4x_96&eUeϑnta.耾w@Qd&ݡOk.,~ݐg"ULAf]ŠO%Yu7rK؜ƍ5Zf7p<]<5հL0r!wQ>AUK =AT"򗑎n=|Q5EPGdlA괘Kqsۭ>06/?=4Ջ>нE~3g\\hY,{E;ȸ!dGyzt$o%NE*`eI}^y!.zi0lEFμXDj]'-ouشPxOz9+#ٝKޥUE ;JyLyTvW5Lm=!d1V;F\0z7Z=kd]Q6jw{&]?$Gv^' X&AT" ]OFovᾢT =[c@˩2.9]]JEV8u`#4r9|>Ҽo##G{F ?gT?t˺6},rz2C^E6䮪VBaeO^YЪD~15&]sd zZ9ߴW7{փ3؃Ȉ^7+(CΑ:=4v2p{6nmz+>YLx4|"<;,uV*eޠayVP۲~rhZf9}k0CowioF]+ЗD&?FtX$);t Zhμˠ~l.afЛiw%G؅452Z3}3|3ZNny}.+w T>KǙL^4ktUdž-V=B_6b۠{L/%0I^5F7̺| Ʈt~&( t֨lJaZޒԡvFv[ԣPב{})w1D):u)'1V-hbRώF'u@L*#Gأb:Ƒ] Y[t3!WH\w[ '}fءyY0Ơz' mqJHnYFU4uڐv4W]=yF@ 3iw@`̷4׼+]?EKK~Jd.A#J.R""/pLy1iIn= Q)cKɣb^=+N`n ɀ>#!ã~JMJmv{JrCWq̫p9%8l^r@3:ճx#q!Nk6Ov&Q~j7ȯaoah}6e.9oɝ-JEqbI놜Vv/y;jkuv}FUm)n!N3"H*\+梘& =F:.-E zv@f~'i;t[VW.$'7r z/yifh;UMg%/ ?|p5ҹ]dw \/_)XGT.3(AsMƆ\󒈡>iVg_B[*9UYE\o|kܒ' =CjatlS_.NLƗ^SSrT*ȩ ='L$ X' Y9UFџ3;3_ޑIm||GE;ҙr)Bɥz}?Z'qiը9=n_\s>ؾͅPǏp?ւ5cƩ)j-L4~qh6YU=EE[J _eӐ?zBF?;avr:X@x=/ 5:ٻ ȝy=v;N9朼;ez A,oj_zhj0#ơڼ'ȶ |MOF>fiвg}(l<5V=O gUfM~W%I](jOG#Ӟ"Rzٙ=Aˉih= 8tنҹM f~DI⒮W:6I*>/uB_㤕}؀wK|onUdM~Ke} 5 Aߟ0`&v%[Bـq5/"ofѠE ^OQ 7(b}w k, Ȭ$zO"Ih^IYB ~$}@l%șP1:^1lشF!g8Šwԥl$bQ}M^y6} Q2mе8KfȌ9BT /Ko:!#w)L,/jDd ;Nn@4KUkZabkg:H!oA0֮\*k*z8}]J͵ppGDc/vѡX x'Pw;x>mh3V(ЂmΙ֡DioKB/3g/w\MNŰ\P?!ʳu/}r~ߨk[ õ?*wp$0A}pJj,Q^梨zTy@}Bej_jd^bW@:򀪭1},[#g'脞P_r]pЂd׀ {F_[, 'h/f_LO`aSSh)?1 ֻ7)&M_ zUd:l)d.ҠSubG$A"3~/~WH3QF !sA+}=*S\Zb4%c~ŊJBȬn~y6輌w&{>fs^Zoa;Z~SgL,o"\:)A[gz[a&aΫ;1zgEvƇƺb&朹=DZIՆqM DWMn>AST0iG!9|g8Y_umzin]FhfnNn7k:x 㺎~,4Lp<&NgQI:9yo/Z 켡9.AG4a15_&~ʆ\I~-]'t^ӾY_#r-F0xmTO5}n Jklԥd㚠ZXCk:CޙdqԐݐܥ&J楔kJxFOʩ0vretu/nWb*tpuF+kPs/_^JV%9>Q .7rB}!bLyו.bs y#-UxNtDِtsِ'NVWgmar\z@Uws@n )r[Y !;r^JBG)Qj| Zu(w O2 oQ _o6zKNBR\?oku!0sFd=lizz)47(.ƞ%&ltQZ:4;V'F(GF7Ӌ Z& Ԑ]E{҆Z"fmZJ2(t~>6kiDB{gL_} -Z' %8{?Nw!kBr]ͺ65$lK#oQ7eto~-3e7Rߥ}K(0&N]"B* zr4ؐ{+OȐߢ.TW[9$5^ؑVg@F oӵۉוEk>Ǝ\"u:҆:ե#xEπh7k zyA{FWvL~CtՃϴ}b4C:}2O0mHg.`*=>Sr 0Գhg t^qc !zߐ y@xtu茱qԤ5kgˢ{S.B26跞Ӏ^uny,:iޣ34*}YcR[H4RΖ׋+}'5_a (h\)6zX_ׂi/!ZEqs2kGeHwIw):F^y&5Fk;CۆN$;G7Q?h$Yya{wL>}k%M?ӺwEس1G!䊺Q8LrK2(թzFd~_7vpn7KH8 8|xJf ِe]ѕ^-g}&ؑ5F~#ѩlGp`;>{y3sVvDk>E.-{/*c_ڑ= ͭ't՗}@2X6^4|+m~IawK+ t8.t.)ccS䔱g\$j 0*o[3t-u}m#'rˑ#;'{CXr OhB=@rn>;`ei՟nґ0m F_O1 me]v6CWodV  NӀh.7]Lo \7t|J}o]cxZ/pwKR4~]=8ё==G^O6sA[<}bVcɛE% M8ngʘm]ys76Gowՠ=_%:ruD?! \GR܈4>\Q^J!f/c^״<&޲Gz#oF+9 [Hy-*9wcU4 wBmQyG'`Zݠu03f x`o׬B3JAjkذҞw0t'q,oZG>uFA~ԥ2oghs,KSPۡilLߊLtt+1nO7zy*zw@mRE%bz`cyC~20žuC^cEfkBku GtCV%)vpS}~,vNBym0#Mc&5/]N_sՐ/{OhCCiz|v\U1pC#3ޫkMoz>q◷Kܒ|J}.kG~+LHy،΋ދ\Ww 5bCcsF{s»Ah`Tpk'tOf'긊u{ /}22iuC~ŠHGx,H|:{QېN]{ /qV3nFp6@K<`՛_^K;k;K;ctϜtn:lu"ޱW_5:wM4`Q_@Bm|t;W_7x~&/gFl/JҠc]/ڮg|yqydY+6ߎeۋ4׼|T/߇z#טK;dFU>&/tf@󧜼Rz6(!Uul4 :iȒLtNT",: pؑaE *rCU[Gi׍r~r׾݅H!cfSI\ "{1/ 7N&#~# tRd~ [ӆ( kRǎva ,:"sk.k,]Hqۀ'JCtBpe{'vӍDA׫"MG@2l)^dGW%_kt%ڐs 6EQ>MޓذI]B!7#l6r}J S3al˭ɡ\kʆGE ck"6UTڐs싺b"5vϚTņ~%l~~6'PF?]{13zAEgD ӲS. UN9WFn}y*rX/Űk/kM|˩DTyEF>"j tYG.pcߨ".7A_Dc@F{K)jC7v  9{ѦuG:#e.]t"iqB{9/]|:,J3>y"-#{zor"yY[# []p :u4bUwbzJzڑKeC~QHMO'r 9zn_z{/i;^xVK#m>ZֱY9$tlÓ2#{zkr]>ꆜtGA zSƛU -3jxOA#Wdސ_Di3 wo[Q4;-?E"׭3][,IOwCvztv2AW07өk<¤hJ8>S 3cܡpubԱ UcRu|1t1vSiO]yHJߐEExk}:ћDMŴ@c$rL:48Y6n༓.cf}C^qE StMGvfl;pJ }Q/nl]Cy"6%9q` :2|vqXfmrD0 t\뢔>zr {\νhDzoCjN6c18;Hmt].fWl+!okkhiC~uwE>l.1v+n*([+aRS=m}ً F[[}ĝ:rsۮh<3tQvB.FFIovcwk>GKz`4>n3YD 8Ikrr7twep#u穽ޣ_}+U'z+cROpNܰΙᆲc12!P;B GEEup#CR41qeJk{Cb!C ǗbgWׁ4v:xaG5{F)C+KQ&fŞTrA Ѝ铗eNݦ@/ ڡkW]}_!= 0}g`lL)e9qjtWZz3(1Tm9` V.yK}l/oȥ6U iQeՐ>^UC;^<6D$c 9EUB[F|4r*}y#Mfa/ EӦ'mj6$ Ui_(Lg?FOu7̈^65z^uhɚRեr]Yߐ;YX}-Bo"an4_}r# 2B@y:i 7}Cwv+< و7:xKՉG u"! gt/=ZNj EfR?ނ[\y{4 ]W_$FnS du,#o#6:4)lV%m]wC뮑th$>kBCO`F^擻L_C˕1H䃼yQh)$ Ȫis5S_@ 8z(R,T䵌 yy؜v䶺ŠY$AAK(Fw 0(}K|=RZFye#`q^篇~Ie~IcґTF{ kUU&\2 }>F޼;vB9>}islY/bL]fUi@AoImj[8hJ]/8)0r*k{яkA[#ӗ'qJHwjVQW;!uMvo.4 ?kwݻ#5]E;jyv|#_Ablum(kntZL u>FO&yrxG7}:\ BEt1|@T.fN%_95ʰ8 #`oZېcȒw7K+HP[yC *!Bb.JZZ_د),to":r-|KB'gܰ@G&5(؛鳪ۭ΋ AaI@ N@637vqw"YiAkʴAN_ߐ|U }'ɸR]#L{#̓-:$E# `Wrtoc.ʛKڹي4FAh6嘟(r`..Y.9KGn5gۀѥ(v6/#B.4b}^v4蹑Sa% 3vbx5 ->f y۠!ϔ)׌A2ؽ ®Ȅ/2l#ҼK;/Kz4Y>7}.mQyr s6xv @k,}C žF>*}|7:.||m?MMo{n?^t@r87v[FJp(ved퍜$]+U`<_k4+#܀.#Q?+],6[ߑKle+<  .7ϨҠ{^xyTuH8Mm/ҰU|:.vt }Zyܠ0 [ř34L=SO=cP8[&xf52yNQW_m>骊F2fNξC#P >]K*kх2^Ǘ.cQ9tHCaJ O`oؠר/7s_݌ =W9G*iF/%!']׶E ![QlCα҄D\Y}s(<޸}#Fء5 Xzd]FKtכ4h yRv^ ͛{tدum^QӠc|5!бŵ? ]3hwnqm|k'*ъ~ʋ$cxMQy.U2z`ֈJ}QiW$ۺÕGtˈJ6vo}Q ͥnȝ}!ЬcsN.&\lJ;g,G!E++_ctpr.}~M6]]݅M1ѓ5_}B z2j 6]京kـ{=.[3-Q9Aף5ta0YmmuGGާ6䤑2YM,,̻iZOn|;ỳꚛ#/9?Y#4Eƨr-U쨮ONRuhݡ[ @<Fvtno omⱳ]e\ ȬI>SAoz* 0aI/._za{$ɘN6)]Tl==/i $XgUb܂_o: 6>WwJ*2L tEs/Z;Τ^VwuبN,c cZ} I9/.J_vKªcMveC`/jևj"Z{.چ\i -t9\}EGF.r16y3zCхcnAzNDj u \K^1vqfF~5z#ِaz\vIܥ6]ؼXFV=7j':l+lяW%ng\r.nuKɱ {2oG|wi0Z]ea?;FV{H[NEo/o!WFѧ[Վ^tt]w =Q avĩy\HRLe_W}f3L֝&L^Oth^+#=ˋw\+a֙ri<unQBFKvwAϖ_B+Yّ;1M; "^O5ߌ"';t^/kf/Q= x..򡝠.j錆SKGkyQkkZ^h6&@gL_K]ĺbcl5kn#h42`ZȀd.sQ_„cّR<d^C^gBly#o7^p.%g.PZV5īy)_y޾ z1T-'͗ݒfh!Iʐ~#SYf(_^K:BHu\%xsBח3LG;ؙr9k`i %&5zCzNc<PGuo_̳C^ﶴz]HS_bWFnA~I{ϖWU05vrDhnV~}GNu@pmNe5FO9n瀜BAzU7t Ŕ zA%;/5.\cC]PJN+,L;,Z/L]q#A[I7ril#:rK&#`k]Xu4ޠ3A ͪGv5tjhZgDQݨzYyk+IWoQ60,^z,Ͳ#Qz~AEV}E6 @ݤmȓmԷ^izGKAuE7%) x]:Ag] DjzeGނH|{#-3=FέwN=i١[[]oYI;NFz9e18oS5}bnTb[BOt9zʑ= ȌW,eF!j ТiCN!X<\g[u :HI7Q66׈{dsƶE 1C;0r6$Wg"C9×P^'G:I\$+ՙfbfhrTu5؁SRgw5&E>/0slC6.?Fnؾ% ?kmے='#DcG/i݁HFZRīpc 60g|C1uJRf>AH໱\i-0NMI\衆D~a<y!ձR(7Gdޛ˯C+znzcHIې_toR;4rqX\53hFOt5w8hLЕ4!Ey8q2:7vu؎]l M1ahM/^SfD[xڅ膜Xfqʹ?zu!@+4Ӿ ґPsrZ#uN'n ⻹o3M/\wwrcF4mkr]|D_eP 9qQ+tr/]Ly,B.~iW}ݾnG^eZSaЃ!evqNdN%rm] X 78Y. =wQvwuC]]nfT\L\#. EkWԡ;mCWS@FNގw5uBHj&cE_jԑ|GCulMo=r9Z~< ܠ'{W]2ە}>WC~i2d_k*Q} F!Lż9 ]%Fy<TzBDm>ܨ#fNXSKV w b ՜>ŁQVu]xYL p!®O[<5vPEAک!V)5scwGO1#OW Zz\ҩήk1r-nTkGvu (lmz:;򶼄{- D1:ã *'3 *\zrIv41W4 h6u(rH&u>+3Haхi_ij_I?+A/݈Kf(wF;7䬥x.u E,FNzw/za3Z?҂ƨwlJt?w'}C$ovt}d# ȥ~6g]ؑ?ȘErҲC> 0KaaC 2l.\=u\Z]$ :YitY :pH.zt .?a0d2mt]ki\QKkd4+##;u7ŐrQBO-+^Iȃj!ۋȉwoCꀺ痮.Z˸Hzd_B7ly| $]7z)gK9輻t_E~^nE#o κE:\'DeLf> }.kQ;4թ~ۿSr7 -|_E=9vVXO_c K}ߥݱ)gY%8x7^uԾ{Q (6`m?,pUd|tIF9(v'؎TEx>YS!OW*!pھ4~}ɃTN0!ʠ~+tp! ښ@ gxD޿ &}_Ġ L?jAK?v.guhJ9դ I? [>=:r f"[d&z*.ɫ;4WH_kaS+*x?sth돛Y֦чϨ!8÷H|;P/(AKTs;1n- Ѳk7΀͒P\ іhR+Ё}_GN7\'w\)EqM$S}Z:5+B|i_)^1_63ZAmZ4 ]j.-n! n9o<_?EQA 8A?K*#Wp؏3*~}tB,SCsK :Aˏ7RUFiyQ-4|?KwPʏ-( |Tl>i3VB_ oGRvJrڰϻؙ#p0B^iz}-deG6+Fu`A%7bpI/ "h)wRY"0AL ~M4a _폦[f*8/bsH1ϐ_&O5tx-˽V[W)ȝ-a2y|"WDIOiyA%غ%:-æ5{+/Pлw D_㜷klZdMOɨ^Hމٮ$hV\47MZ H5ْ*t)8~`ʇ#2xVR!RX᚟@$xîXI?c@~4)&^#g߯W}|A_c0wvݑkyƵQ Dd2^+=6طpX_SdkA=E~uĩ\r9 %ZNeС_Y`A8ϸ7?}~$ xX=A+ 2οзwxZ4<?8t?Z3 <$eq~!j\ǵ)%<ؚWZ^B̂}۷l\2t$<; ԑflPK濐{9:虲 zWȹ)BRiefG3`)Z?̬E{B69Y|O $5М\Smf<e 'QZ/[飦eԏuB:;K)G O ]9yLt v$CjhW^-D.2DCW}+Ȋ/Cۆ̪0J݅J3cG:(/ۣ4J)؋da:/PWxAV$Ϲqap@;e4m>܍lKni0zb;:Ob5s ɨUwQc?G鯆r06r=4dTKR_}#*.!du]&&?C]5nc"Ϫ|dBN4 nyˀXt4JrBdiT5g6B*4c"\o͐ ƋdLg 9Y(pK 8[ST]h>5sfB&De5GOj1߱#S[J&"z^ggЯ(/rQ"gŖ C].Y~4b^q|7gE6z7kX 2aȎ1*>E6G׷!O 7-'dȟ(gN5[bs@9:VUaX[it 1:LY}w:OӳeTܐ2ÖRnT 3wX?˺Rdwam~ f 7ȝ !;uz ouQAxCN%F3Ȁ/q.?JG|~gﯔȠcz7љZrɾXRFM/Ԙ64hY^vX*6~kd:BХؐ*KGuҀ=) "/H8(h@>C^=شz#.#t|!fťR~8çc2i?\ 胣_Bc/% Ѱo3h4`١}A%8u&0KD򝿌Ƚx@곈 @F&ES:f$١ST%dq'Gs oQlBsr7(pNZ֤k #N.v^i\'qǍl! C>ѼkzD&M~8Wl)SD* !Eڑ;X1EIs"3n:nm-i:mTGE>ھN X.uC~ Wb)Y:Mԥ0Wy '.5$iJ> Z=d,-)b[zT0;!ÅF낧Gjh!k#*Q^\:uE^FE/5:l,.>/3*4.nGs*m3Պ2X[e~p7ly9#9/]ʎb)]ЩҢ8 @[ ]=I%hg[:r{14)N*Ǝg\'ٹPl~ʥL>3_!=GkrFt⥷ZьmV6n1dO騒[Kz~4~һ4d1rk : wvHzƈY;{6%yzWg^i-06FـuidT&Ȉc]U7 9o5ntY.Pkab9dC~mA w0V pvLzQyp<[]: 0ɯEo"Ǽc+]"{8 ]?]٥CEVh ;JÖRsDSC/C`l[FN܉Ѩt"~)ք ]27$< :x^~B`+5N.HV_mԋ$61Fr乡{ޥ`7 #Ȟ\65(+4'zF.!?:{E^/G> Lu!w,^cAwh: v5 9kq.dO'\GZKv25h" JG#-!?G ?T]wC/݅^U _87HqVҕ[/!]$t Mqt#!.erZFXm:q4JԿX\=Sx.!nmU'd4-l2(#\iVچy|.@&h->9OoAzLE;\֎.$cLkq(tF=,_.ۯ0n4Q>Gک+ZOZ٠'5Fu@^ 9ERk/)Z`zCu$ 1m^CQw-DȓaTSKfԁET׎"k`d4F^$;c)327K!G;dP0n/&%BV/pF'=JxN;nGowAF^ȯD+tk-J~]]WR2}8̡ѩɀ\nȩҿ%uz{+Ug\b`Kڹ;6'#ōΫUw^۠ R[|>:7_F*ЉKe _3]':boT .͙t=GYa2iߐQo }ȶ#%YF^Oެ+]B1uNͲ˨ȶ9N bK[ -KkI5L =/^&m}qvz7y9[bUS}\90]c~u#Ɖ|VT~C5mkLfذ ?ۺKwTctQ_cT:}B^A2Ϛslۂ.];]7n'B>!*ȟ)ymL Hf6)thѦ?ja}&mN`!qUF;)"I_F c!Gha I rd'Cy]\)$o:`^bp~Ky^}il#p :SKlЩDE-N6 24aÀq9zRa o-ZG)F/6跫oFu">m E]9ztKY3qe^gk mN"07{"׋bkK2^[tЎ/tȁQz$77.bw^֗ I~aw0n)4wz4d{)hU 5/bQMYZ -$V7#Q;Xd7m9ǝdzKQ׼qqp *Cɦp?R-!XIfilv18dw =تޔec݈{/ft+cy|N 9T@?0Q?;XQ;-~;#^/)[:.Z'byCvUwwށfM_*VY tQƎMZ1}ai/p*17rOn=BϤ j}늜ӝkQ/,p@ޗ[>ܱ*-zUE/}%cJJL]u ^W7Z1JzbT+N>#fc ]:>:i5虶 ֏%"gƞc'ߐ7lȯ*3͓c~4iWF~tThVwuxQ@yYniN:fP7:Kˆ " fr^@ho0sׅ+:.ް'a%)\諤gM_ET) |dIw#XCEҖZ7inцlГ`QK;]P3[Rޭõy_c 9rD'"eaQOuWKz9QN;"ޭn3:Fѕ :hw8è@qGOQSFN|>iG^pLC\˳G k | )1w썠s^s㻌clkt}KE}~V^8veYzjNM3˪>/P|ms~_ܤkzA;93wv{xdjO1ʙ4>p/? +辊`ߕ96 J{O{ rAȫm؏O6ee!N|)ԏ}$\+&}7舳RMip?٨nL}~/T-v+ѝonS|_+A˂x/T/`xQk`f0}~fEzfZRenwnֆiKM^cޔf_TbBG;3X^B_VxMߦh9]PDDOM~/qa.}a~uxo0K%n^ j֑ɠΏr?<֟= gwI%M 9zO"9F>9žh4h)@sW5KBϫ6xT8/$o6ɥwQ*'?L1/tl:Z"a{!]ыy*Zvi_N](1`/x.evpH.ЗE9ڑcKo9n{=*t6R_ H=,N7zw-ZcVG4(vSfG/k©{7gPuG z MqFnؿ ?U}WSc; !.GϡдG3ovN8ky7| LFB_f|o|?8^قR2DMwCı;i .xD?֮q_N̗=sα-]5W*8\t,N$6T鍚>ڮc*&Tf9Z^gԟ4*M9ER֭k:hxEDBk'~8V$@ڟ{O[V u,P1'Olv4m&M-;E?"O@R'ΚjA:t#$/!g& ~~ iq㘍 k\$IS\z.Xn<)Kkf+C au~diwX+^\'):cey5| ,ܢ B۾$ 8rJIEK,z^X˒ϵźY?Y/I =H}Fd!8jgc Hz`$Ы'vFb_Kї:$Jm ="*N';̐[GfݶYO~(9I* {kH;@4*g7i2ۮ5mx(Jtf B;)zԑgTuլ9Se:\=H-O_{,7зyOY)]h"wWz#G D_:7Fa%q"C0S\LUo=rV7;~M_M59߷_c۵ rIEZj8Cn_׽b [az 6"T'?y>e<>e[C<\Il,΂I-og#.4-nyS<u"$ $B^f-_xC£oX+!EwbD/%} _ ;RZ-d;cGճ|bKzחzÖg+9N |T]\-cOǘf=;}ayvO}p{Tas"B4~ g?.ƞkaaʅN窫$/mȓ52Z; `*l ]Ƕ*\&uQՐYaE/.6EIR+u<[tĠٟQնlZ}"N6@-zSyn>QPnȑ^3Exu zGx0^:# E4 +[,ߢ{[U 7K/z_AF_薉}E9$_홐=21is"0|2oӅv?,r\mXoH}CSz֩i#S;]bݨ@/-xёI]\Nws.yw?جs*<6 Co}DKhi#>GLlt}^|҅[Y5C'7v7Y&{mRmG6աmY|\!t|hxRSA꺜@gʟS"1,I}_z?]M g\do{ 4gi_e=*k ?Gݐm7viitCU 7I^)kΜ5v-d#ST_qQn3孑}5;`욂/7v ЀR}CnP|>C?%te4/56HdЭie]1Jм!LLclbOzH|V mCKa fB th]aüpYq˰pbýY'PY[tםȋf9r Ɩ<[`×?9bj! gRiLmbbK9;Cg$zgp{1}̢2+/6.O!ں"7p8c*'d)t~##)\Abʸ;-O|$y/zXIoֿ/7#Mk?Ni h#J&"^Dm~K|+:lV9s=.F!e蜁7ݧz-`y14k&>>S +;{_Y#EABWD#sfȀ' l֟?܏VbG)Wh[j7}%7!?U'SO5f w wpץł@p}qAt߬F/-`! R"wE^p ?h76]DzMM T%o#} %]C<~O4yKr*_gbvomX% %b5#Gȱ21!SDF?/6rr~ S ?N,"Ů׃>{>;5j^8NRI3F zdI}H;EF!~7opQl>KBT;S^j.üї3)=I/zXd &h$ΑB'8C} ]3nGsc(F4}@7*M˾'(ƭBKS/ t%~'ϿN^֢rme%v1O$4_艢=%ztvhܼۚ}l_53yI\G+G2qW8fh5(?'=w~ZL|u.`[7$~nd[DOk0X lX-'x;4B&,#no=Y͒d[pn1WhI JYmE|dV9n}w=} Ygވ8{h&i*~_~=\KѰ} Wbh z ;i] ޢ㩁 2S\73p|:\/{B2,?.msiE퇡'Uo o?/˖%txf9?&}Ŧȝ3xzK&BQ|ݻ4lKڸ3#p;{1S=|A@2˾aCځtpOQ7sWhWS酼͔1ޢ; OoO33Ki/Y?\\AM3txNl^mqU)aFU>CPvN]>. S/s6I7Bn 6k ]h ߏ3Uz .-e,gErQ-B>,r]BߦsAsO!'kZx-wDGrZ/'mhlt+TMB5+ԫk#"?&SFuCg+N/S%.SXy~&i YQ`J&^7t=tYsC{,tNʙ}lv=S!b_|= Lc?NO=]X'lH7J;ʑ4>ױ!lCFAL瓤3:ԭhlOcpSPxgȇN:~:!sX^lR~`s5ނ:ꛂL~ R vE7IϦ Qc(=9;~5Ǩ V:OޠZ=Wwp}]/N SQH<Ø LGKKm%dDe Bz͹"R/)S)/k:[ҡi$cCN=ףs-Kэ}[!71|Ȟ"7˅<Fׂ|Nϭ֡W]0ܥ_|C Ζ3ӽ|X6wgM7ne7eq{HE9K6>ga@Hj:SE Gsx#c24{7r )y LXڅR:}fU۰HݝgsGK\-߮DCz.%Qw!+|Z)7<{5ҟᒞ<3pl><-4i;rez0hJ<_[ ЊLRvJ΀n^HGoF5Wo;ڱ9s 1) th\:;9s溄OF.vcĴ QĿP䭴F\ c9t[L~}!Vl5uɡDЊO+ #Yںy;ߑř]cuY ntRu/W#O3Pm*ґӮҵ֕:RMQ>O-'p|!e*t@qW>g6M{t$yk@go/Bs>ގb'J KO*G 6Ah@l0ec $_:h: -V+B9F yWE.GPzz豮O VNz{#c۩/ZO^pRlxW֨ۉ6W7c^l/nЃr3y\Oi#FFXlg 4 z 2 %&qݠ%5Es2 h6wȗa-AVr?&m?HgG|(< f_.$H ſ8'r7j{h~n`8%zOcJ 2afm~?z[V,n-LW+\ ;*A_L~~ `ö7$07l/dSlb\n{ϢTw+i}~mbASZutQFFj"-]u})c?Aq)t(rJ/W5Pso8hݑ`&#NȘπI=Ɋ-f;UwO?N"^cVC(%v} +Йӌ׺|eI2 2]r~Cp8E[L<]BRc..4 ^pFNー$x1./2Y"ϙkP1l9) :Y|]d0-xj|(Ÿf7tK*rh^2/ZMz:cCn4r{#^/ĜR!*r"١E:GـK E .JȆ׀&Բ#pԠIoZ=t!G/oޢ3?Zk0fy5W۾r4lZc]zuCHO`_n6\R,IGn ]pBc[˅\Vtxi!|G%V 3\Fwp$Y!}%!˰8¶ ^[S7b=u>$_g{IړJW|~T:K 9 d|̰:]ޔDA=]wYvP8W=}!m:N̍CkL 5Ъ:ƆܢYl@<ӌyG&7ңCWG51@6crG@3[0&rl*^>ήcSt}B~\; ";48p9O)Fyߓ.BN]P =7h ]-\+3yw4VHf֗ I . HC_ 7r W\ 7HEsJ7pUIkT|ȀJ-ۍ>Hݪ.e#l*.F rcRQZ-ǡ/>@|~gek#:zdNQtwVv_-^ֻ }WCȊ{47Y9!DD~dj;-q}o؊-W5/o NKc KsJJ7tumreHtq1\u)\Mfa+.ߌ9"rxAgߨE˜iTCv䶤߬aZ7tv!O~)5ot˟xEa;r -Y!UE&1h/ʥ5v"_ݔ6+t @&`?N ۅ-W{.,oR-R e3nKʲz[d;/ӆ*Lp/Fo;opmuwwt˴a;=]gq z>N=ui{I}k|1.3%nU _Dnh+}xGsіEbѠiRWYwc:k.B߈9c&ΧTصBGL7R rYotAS0|B\{NK6Kـ a^kq W)̸tQJ$ޏaϥXKܫ쾴R:z6_:A.2#EIdCKS;47oAl\`Ei[ǫI2vDݜ^vt*3_ʌԡ -} kpFUDznaKi2ᒞ5lQKՕ2xRo\7#vawBNӇę.&C@nF~mqpQ[6on瑊"C/;8{R< \Bc={75˻g޾gT9sB v3]>(G4H~zT8)SǠA =uxE7.YS!ω3|FK3녳_K$#$4OwAk~`ч]` )Ld^\/V9'𢺟:H٥ΟS$BOu+t4nKFE-[~c rt#K@R'@k|..S][ 4F7/;G˵Kla\wzn밺{`>K :Q { GY(jҎR`fdr z2PkwcگCC;!!/9vXdR,@_=Ң Zgk*oD1MFۡϤ1_Boڐ iuo˲~vQ[ӱN >W_%8 ]\cŹ>])PBODLjNA PcZSn[LȕѺhzK응.V:~]F7]#w.McB (G۠m=?sShHE_[Z{;4 z؝2 ZU_4yOc2qCdyjˡY^Bw|A?'4gi7FϳhgE:ُ7 za_FN4ᅾWL zL~}=$|sd] ZqCeTc _՚Ã~r| iZll2>35>zN@*c$c˲(zuB~}V| yv&TlN \}ے&ȕ8:h[b83A.Hhf.#7jYp^ɢqSlEvɰ×`̏W 5;l/:7w* Tedz6oG,ݰ/kߓ:ѓo\}ϞB*T=7FNG\97&A=9J߽Ǐ BF"Qy.kܗ[Ϳ˦v/\Η7*/xw9b /kIؒDNA'hLQ77t-֑;xrURE틞-N.>KD3E8TZAuу"Z*:.zQlG=YywjkНWi |Psm1a$=Z$ )-.d%*-;P.8z$J'`_מ6+ ?TF^*5M߰U\[t]l߃9ɗK ӠUt>/m#.-y w*/QT7nxVwx%O07A?.]NY4`;zo˛sv_3G'蠗 Y;V1/eA>rUl& I)!|'rfܰ0~ z| Wt.d0t7dEu/1jW^;ѿ5)$jJM[)ڐׄMiN4~8SE[O$>uzGDq["%"er!S^)2p(; /-^Y9B[Z\]|Ӻ}SmT?[yz0fvtl}m#;L}խ4~_ޤΌv#6/x>&%4+#WyţMkV y%/I|f;tPs_A|ȠQ؃_= RM6ЛDϲ⊯ANڑڠE(N YF?FE.[{٣F3}?#`K$QiqfhWs \d݊ԏQ0._ݍ n~Ch5B#Wِo46Fe4;nƂ,#3euNpS]uh$=w35NO; d`IJw#ŨWoȬI ګTbeb&s>ǍB~GTxy[{9:g%a)'Zl1A7#zBw}OsG}gl/S]\ ݪپB fl] {lJaxX8[zXoGnɘ:r F6C{*ݑΛSx\K cBY@wL^Ru4 kzS*gr#1GmЬ33I:3o[(kA{No(([ېshy?i0.|O\eC^cz}fcNGs5.ưl%v&fn1eK.K?zތȕQ!ՠt5oA1*rN*Aah_)"a^~W+̍<8q#)v{2ҟ:uå n*|ea#Co9!]Rlm/&#EY`0BoezFSi.VK C.o)li~S4(|@Aڕ26i γ 9:MR@1%.@v'I|0b6 iGn1EApi1!C'=^o).,L՗pWq'N88͛qNQþneaC;PzLFC6]z{^vWaGzs\36{/hT7uh `<'{`[oͮr rxSKf}"ڃj]i^K67MS=w}z8x`w֠e ;G'TO+aL;%4}NBC;r1lO[kQ׎mׂ3^zn5M-o/:Rl=qf2r9roKB7ŭ#ood׷ykj2RTR lϡeT X\JV5꧴ʉyu9oz߬!9wǻ٥n!w*ӺAcy|?e?ÅGd.}q1r ՠ\et>#y{KKj?.FlBwNOo@~zgepzkγnE༡'g, n/A4J y]J5.eCNaT6c@/G#hۅJp}ErΜ߅wcϐy &)Q0fn($K@G;&lviB;9Rlcɞg6=P=^R].66V)[u%,U\$kxaΑCk3.K6k9b+/4hs{CΡWc֐Gy}LYhy^FJa^#/=p\ pC v۩-,~C#'^$id%=;wI_{8y!VnѢ-Zzu\yctqu/b]QBsBЊR*p w%ϙhx5ȣi! =H\kFl+sygu.gP破ձ.ƿӸ8^ !h+꾐(Ё7r$.a4^kP$ؒoa Fc0?EdLQyhf}4RrTWچ<'GGldV /ܠ[]$c|gkt0#^2ӝereR\kxULjBN%vpEWۑ"<#uohWYY zg-h#<$h#7rf]%5۠^1Ai4.q?SfyCn5khA/rϐ) k)\Ri7WeރQH}q^$95QH1Ul>R zϛ(Cn*7t &,}geXk 0ҀcRtA^;6XRð=n1Q@կ{Kl@wu?;`eF8c0_Cq5j^_(Yh;r>FO9m)Ri䋤Gq~#t5z"ON]# ء;r CB1Q񏭕|or;pLFOK͔d@CNy!ЃM)<H6u }fhiu?kd ͑:0^/%!):97ā xH{znz` dlW:.1tCSm{\-"]6#$f1JЦ{ĺNjߌ-t"W4r^r=@4dZw5.:w yA7?g>bz^֩{7sLI@ȡ>+X^ҡY;؆Os.y_:trrpCB ZvrbkԙƆE7}2~evq}㕨s^$+Rv6J_2{{6iӌ{yVhy~, ]֕=s}{H]/Z]WON %~Hr?lG>k^oеQk^C%}vTa>CcTG#/S:4~!'cݮ~eΠw논.ԡ])f.>͎׬M/T]#j^eC^}xkېSPv=]oȉߒ]WI$U y_ӮMT͌ nv2FH&eK.`aC:N ܏Tj|O]Oq[vCUhPSrĂ|P#T9v%<}˅ĩh1Na#pLn$Vy UW*:uso!a\^t_ԬȆJ^ԓtܛѴnmY4v6YI{H]CdY3]܋Q(v#?_xT䧐z Z9HE߬ϡ'7NO ]Mm#ߌ c_/tJnbR֑xC=醻C\ˬ)8*\TV1p :tz Gӥw!]NUuo@st^T:ʆ\%E>|AY}@DIJ\9zxyT82$h~ί.v#ѕy7b+\zҾ*#/)੮޽:Owmmu,@ ]љXUhQ-ker=!a"E r}k[Uy?J:킼NL&p_{˝#y3Ui2КG̤gҰ)}o+w~N)`D~Qu{hS[4e̞jjv Y{rP";t: ԥ 3P1.az)ZW[ SBr ;}W|CfyكsFݐ_EԺ#)Lʏ z-zgxm#у+ƘOێ>S)L.8JZ, 댦|m~myF)u HO1VhWoֺA8sG3dddFK:z}1C/׌ _%mqqcET7#( +\ rp1%f5[Ѻl/]{sZEd.@3^Hؠj}La_j ?u_ .0- uul#hDM4"(iHM9F7:4^lȯ🨥_7ji$y?/Њ?KVGo?R8;Mlb flu'PuefAEN{J:XʹxA3_tCN9әc[4rON4mC>lցl/ iuYa<>Q:z Bžt &w.Ӕ{ĐO,&{nvHǦ~L7jcx!/'ѡEZAc{їpϙ8 ]2tWyAhv- m,.І309}<\|T?2ͽ6&wi6uo33O7.E_B_o*J].kUuvzt-Gdhg)t/b9;'逸qU&מ)Z\{ r,Og/r,= \B~z~1}?%)y]ҮB4@_k}#eD=>M5b\ z_Yo#9Lс?s+=VRĒ0pC9@$3KG||DZǙ e g>ڎ|#9Eص[caӍ7Nҍb^ȉ[o5/V䧔ԯL}g 7^H3. |f 9ƞ1NڐoŇȟim9/؝]$66-3y8ժKYT9gJuK.2A[,GD?Rg ?Fft]ڱ;ud9u CnUb3mFEI Qj߰ f@kn9hF%x1Wu7ƑPݠ!/;ven#FdӴ~/؎t3{Z|XfИBIeLzHۺ^U4{AL/"fT7Zd ,3ch\Gj0A׵>v%gpE,9b2~ؕbȓA;r#{uw ۠Ktg `|*ѨP!lLGnљZ/TV.=S 짾$kNdop܌:Cm?Yb9BVޑJBO20_%#lC nw>t9/w–2ޡ#C=aP#W8lls1- ! HnOLFmtkM#+eSδK@Dk^.OÚ$Jv^~`hr{ɵ!ףȆ#y{2fCIؓ.ÐsRJԤ/Ob/5k-i ),j0xl}'0JtDRp+j]R;{K;HzT-EnM~Z 7|F̋ԥˆb)[ۑ_^C}pvߋqmmݗ!a/PRv@3\QtC^Oxm|"Nj-QEu*˵Utv5򗉹 rn{FrRENSCFeb?D|~T֑{4?ZRԭ!ϐ0fP Q!oB* [ODPw_8e"u?s : y\.3T6nދu=r^LBn @6䫘A6Ț >tDf=\Q#uڝ-cI&{Zuc@3^%"ZfnJ Ž=TA_-/B4h9)88Fۡ9m#ݢ0Y#'ODtagu&o^wUHb܏Ϩ?iG9Z{\]a*2Ii)P6c*/ƧA2B=f&1jnrweS"kUBrOyz/7:`:_0zBKf~ٮAO t.@ RY$6q ?c =p"& 7\Hdl].ߣܖ&zK@c菔Ch%%i-AJ/t;\*eSqe1 |M6rXy`!b2G 3Rb ( Jk&^ =W| q|u}cX'ǩ =\nVw"_Hi?\;H< -98u-|H%>SDT%Tj݀D-l[/m!ѧ+IzjY0e[=hzyuY^g !N)c:I噂v\}h܉P;T=К*+Xm58'ʴh4;nk%%3ڠձچE7=)G'Z.K'inY<)vcD#絒/T9t1c h=/+81ѵgL t{6pㅬlݫ!|:cKnok/8$pC/o&lgQn_+Vp>t|'*}PAC?Iuu_JG,Ǝ Mh<;xOQtڏ!Z^m@OtЅ^gkzZ#pPϬ@+!gb|oa9Pn2rݍ>SdƼ@5诓x գH'7㕿/rI*ǎڃ4Xi;BA 9Sv[ι,]3-{bt@+1 }N!䲥 "}N? !{P=>Ȑ4se>Gאz=, "zQzMt^#Aqм%4 ybwK3x-\qg8+_S&х5ÆWi 0,_/"0j|G#;~=^9̾i]~w_2h:5 7nTb "W|P;)|N7SΛ/$|¹\ ڏkz'/ŒLo\7kV{UyZf?& /YJZZ0 O53C@OJr Д~j[ vOY<үRV=/c ~V?=Y#sP?Ч*g=ZnIюC x;3NV3cfQpQٸ܎^ [Wˢ]]k)| Ps)]Ӑд\ɢЌݳ73lWcvch6d%0Sޘ5KSv1Z%:}ѷD=^@@3 {8+MgYe12>iEy1Ew:&:,oķHpʏwYHlN~Ϫ^G"d7\x`Ѭ:Kn h8"_}WX^$ȧj}aMZ @ ~16%p.i/1/U-֧%`+P/K;Q6_OG36~^VUuj>+I ]h:3c6Y؝ QW%`KȨ?_ܡK:\>&pˏȹpF XN]Vaà+B5'N42r@zYqfp졽=ڰE߃"AQa\_:ۼ 2=J"xɒVړ~jէU2_UU-U=CW㫦zJ*bGv#/[DlU i.G vmG-@.)ݻ !oA_q+3-ya-~Iv9ܨ#uuΓ,O:_?-ց&Kv;F2B7]KO0o4x;ϜY|H nOxGUE?v)ܬWq8uhE_=9GS 7_AߣqN8)hDf3B{pkļf|:5_8 Y֐?hxm z?sK %]Ǫvb{/3A2ŗ z8E!hIk :JaT^-[VzD? 6 ijjUiI NధEߣ] Йq ~VRr |8ɡ}_~ʊTdܷ|*ux;7Pt%KOm9kŞ&5x:u优D=P?SwW^u arr9TuY ȓc= t-ž 6Z'(*9KdS8*B>_G,>:u&x Q91Pv~Eߏ& 9)_νrtnԯN[zIWl}NT=)Ξfi/ [!_a/!m36\%iu<>JGϋxBBr/s=-ǚ >Kѐ3_#Y&b^CqW G=%}腾ǚ7 r~ukS7J.dq/zJz q/U 7eu g &R'b+diϙFo0!wߗtZU,tPރ'[ bWC/Z |Hξ\lVu'o:qd5xҶf)۠uOzyȧ^]z`$:<|{ ;E3k>s2Dz|LCԻV^)KOVT.ť?2^ `y] T#T`S}@_9:ڳ(܎BN7663c:}JVn-w4舕C;1Q]gl')n8]Nh?s{T.=^\+Dt/I2Yd26cŚ]cjta|_6@#4 }"X' q[[?r4nXqu/? ;Tm3cLzB.#O^>A[V,]&g2ȇNc؆;Hߡsd]. 1q^/Q`*Neސ3zTY| /H9j#4k隻GmNگbd$lqTK*WvNXߠkgUנ.l2г 0os^X+_ bӲqCzdž΋xA1w[C=\4љ.:|;r#np@-L=<{רG1Z*:z ega{Ϲ3M3"9]?eW2ebY:ێSiC~Kh";ը̔üIbbcc(FGE8{~\rH_kf5Bh`:ϡgv컸DVIxiBËچ\IBܐ=d=t]n;t]]MW0B]:4+n5]F*6M arn߅K̍4#PJ|3-Ъpm\E%{#0I7rJReFܯJnTp55u.K.Ű/j):/kL;͏t(D3ݽ0zGH]G?x#'ęyQqAB ,]+vY>g[[ܯ#Z>[Kjm4QV#u`^TOQUC_Ő_$]7#\J˩.=]ⵄ9Q7TĬ ANU[\|t%o2:㥒W5LGްy7{/3Y7諱~jTi*6 5}|r^jR%9ݖ*3k "7|nnB˚e\uهvs3eLGKeތ mR~N 9"Udcg//}xЊu$ykt&d6C͞ڐK{P ?n{ߨT=Lxcwk$ k$Y >@ߑ` yawꆝȫĮ.S{ ˣZ,z:@}^.%/Mr#$# E#*!ߋMtCNK[FA]fi2c~)p6˜ c jex:L 4Qåxq z Sۀ-vwf%=S^`涘oc"g/v=] *h'{KbA~G8/wp>dUwcOkrj\]1#9 }/df`KݱxIy&c62`.ߚqZƆ|f^.,v;gaWO{W4HnΟ؝://Xo {{:/ #RBJ*6993oĞЎݖ T~AQa.mOhE!4},[U<@j: ݖйȆ桄pY榤 ϡSGv@_5GϏņ X]Bz3tPۀyD%Ѓ/5岗KB+4-ڎPjйK-k 9vf.k@^8̈M!==}n`jyQz]BVn F.!f +ս.U n>6r zk;GM@n$J%ZNdhȩ s9]1hf@1kdFQӫA. gȇ_ z[odQa~W~qNԔzAO{:Zc䦑ZҷUdYAO65RF_ vՑSIV\&9\qxA4b-uMȦ14ű7vB׺'$r>uh`ِg~+R'u=*67䧨C7,T~A3ѵFOlF: n 3mvi0רB~z:8~|bXp5`S68o`{l]EA357QKUpY\(0:{tRf^ޝipA :sn}Hb2v7bXM1RjNyKF ƱA'd-[0@%Gtbfx4h7=nAWJ 4/jc#6RFnUeuf:0Ky_tKWh|t_cX\YW073q]@рIBCuTz^Ch~!ԙ8;BJrxNˁ3 9$`K}k6/mbiR^)36)"*>ҡЏi_R1ۗqexvvnIv!6/Gx1ljNXFR4ءG+R[d/P%qBuyYb}g׏TW IFvA?;i3kmLSd]zKk:|"Yd\ہN{ّ؄{Vr~ۄ ; yɡfcV@&"\l;DG,/֎[U q\۵n;*N!$eL_V?o+2(!'TsA\]iu%U wՀ ]BQ@wK+<лk$p@2#i~ݤ&,:0wL6ĺh9´$T}HI0JR@.Zv%*G^6E5.BPG,M[xvQq2} %`y0hR{R'=bbE2/_Dt xG!AT Rmox=J\ǩ~0nL\˓ ]/9~4~I8Z\ɷw=5opT$f{^f6@i~āSBKf8*$ pYC /30ThF_e nAeVۆ@DoJ~\ _+>Q dӓ_37#針UkT{x3d/? s%2x]=,M"{=I&'3pj̟l%- 6~pRͰSHhE/ױm/ou v~D-ȍ3V_[6\>JkmFD{&;ȶ8dR?,_cK|L;9e;֝QLWhQ7B+/n>Ygb:2k7v2~"44>zWuÏ%řԁLA~FIbҐJs}]#b35m^ _D#S$@_[}F[  *t!sN JO }"<ґ_@_NF&.I+ATT"-USF<DPzվl/q>NOal8`´jl[,*ͱguQ`owKzmN-J5~fՠ:IxV2௼\;3EV{z*q#I#Qݳ|DEi| W Rk8J#gBS }M nvB e~Dr9|Sd]%o\Vk*Jx"MZ`dhw)n]J.-Vhz)5Q=ܓ#іZ)3!׳M/ZCH2'mzeʗXxM!-\S/;>Դ+_5'ؚÖ8VTx}k7z%q+"_%I=з5wPyX]Nc`?~]}[|<&-phgs9CA޾ЧAlr_C,NnrΫ:jrwqUo++Y qι~$Ove]b_ Zݗ8!1n*ok7O5[z$IQ@^z6v%=4M?#;O݀Ҡ5OiFʜfBr !75[=cKpMt߯}|u$ܽike&%<[ۑܑI z\ݑkPᝏ'&&-I'KA;SM.G޹; ѯ.3ioёp pQ!X ZT2KTHtnTq&Qq-]Whh 䔋&=^!pHұ7JsRZ[ .r26=(|N'|o}A?7: ~cI[" 2Uzّˈ?PSɄ!5 0~xx`w!5ޠEW\ Nea0yLȍui[=RtE=C]u͐Z>N3d bz3Щ@oD r#C4B>SbDǭ#ѵܖj-U‹1 1I _|jO`9ߵg8bLfL>v.vvr ){u7 伛\ 1!_KQ`]7GII߸kvHgU4 86)j}@a㺫mmi+l>g +gɂȕDqNTwg-~aVn!3X^e=_VwUhuShYLjQehG^zz\T/J** p L>Æ=?Ӊ5~YwҎ.Єcv?0>ߑS0CZB~.f ,0.i>ov,7Ӫ2f%M<6~~'c 5v/'FþKӀ5h3A~nIAKN̕8-@z;]W^FAT#+R5(krFzzKs.oT%m~E7` ,n7)r^Htvϰ5n5.oth]mx9(vo9ą9Sv?C77٠Ϗ4 ;6Xwܐ'10\l_t*K-hlF'Ηv蹏 :̴6"vPK%3$5;#"3$>^J#\?l]ȉVX(zAOTI&5L _RO^Gbkǯ^NCӦ3zîKڀ*4\猍ܠI?H^9$[k(xEK|יzE.Y(Be6^ )ܦ`q?Ha~Tl&r4d}O"'6|mRhӇĆE z^oK2)X\le5 :A$E7UEL/Þ 9Љ;vqsy$KT=F~T% -_3?Dz4԰5C}4nqM/Oh.[|\hܾX  "q؜uv<s,A'82=}yd:8w&4*'z}Gn<=/#fs?ck4.91G:i]"v d0)tZOU/@ }[o\Sy׸=$1i/K#WkGY!:, ׃V=@_c\RW2otB{ ɨ_bƏ T3zhRm-cl&@ЍU>_둓%y\ ^X%3U7f(Dz((1Q[Yd3 7/3G98S@/oX*t5H%'z F{BsM gr#baw7 1U h߆|d˷ii# ?t//yLgN_Il®eۇEcc=[>П\ 9Z>y([MkNJe=YAoGGf ϛa;,k0ۑѯm]zoK\zg6oF2PF,m:37c'@I[Q6BIr!x&kOѠF ZڱeP_[d7~ Yl{hu/AW$TD7rػG@:rIbo#蓦4)tbZ7Om(rǍ$}|/-'FߢR>i~@hFOAET\pĺ6ƋiQB k}cw%dUr^_-#gNrYG4Yusk?)n3>dFqџ+sO0ubP!9ږr|`EL1*P9#RAtk -ARhOӂYF]^3Y,I>Sjwnw\ '^?*Y^l>Օ'qMo {m)nyqv "ͮZoᲭp9 qS~6̒r@OS Fy?fm{p6k4e:57p*$Ux7oػyEaŒ!c8uIRn6m5^b!?h6psg A73y7G='<őnTҏ〢u@["ܐ=SSͯoBjV3<'8@$_6X 'fJ t=7vմt|t߯2 43dcmo22oGKr?陠(kvqEΩi(o(4|Qѧi5lEf vi_ef~ITf_^ϹU- 0~=Kh^kG=]Mկs\|n xc<,{voܗ+lBN*I'jM?fdV`D^)k[frEB+={?ЛBR7xcISs \,eG߸"ǺdYO5lu\KO WsCkh]qbu:=rTzpf=h7.xNT9Eׯ+4{k4= w[Nؠ( 4@>h|&5).Ch.7fX)QXKso\Wi|x4<:C? #ͪUF.Q)4#iz}/Y$~ Bult?_O-hWw#+Z9kw݀؟Z+ 2Jjԡ_!xzJ ~S%הzBOA)'ThCQ9V}[k/)c3ޱ~_Ml+.JzФMv83>?;(TJo5 9sD,]}^Ҏ\ V^>q'r'jT6.u%[8*Qrn<t`Egu$0!3dˋ]56t;-/sl\W ;BAQ'WU%^QmvcNɺAZ: z5NVCw`noiieFِ* 䂺J aVYw#ӪО1 ;q 1f= {+7CDÕM^1pMG?K\6tܼ8%7.e4EۆZ0(VV5*t!YL_5ϵ!ȅt :oW.֎vhqOi[=o{-.f29 AEqTG.r8`7켨SF1P {O䧼r>D9;6(NGEuE] 9G's\*moi9M cOGN}1w\rU]_Jf|A 3JOSƶvϤXeCޗ@ˡ*k֓\MI R;F A3euA+ޡr|D a$"eH JLmnQO˅ }yvCF޵$r];:.9%[|7 S/s9 i;aRGvPM;.U+;ˣp%ޝ_ 5dueA>0֟Q&oOő@jO4Ƈ ,Z. sűW y2/rt;Mw!OhL0EFU&*r>A}2tTE tOtHs/-QqM]tw Y6NM תk3GpRq7yC>!Lsہ8tm1D_&Qw"Ildq:|I'  y v1_VڛE#zԠ{E}~ -w9:ZJȉx1Sq\%VIMUslq!%P:Q5;Ŕk酡_"݅,V7XL9.qfP>ER[ʆVpucFUޡ\t2V.=>2~\Xc;ibweG#L΢/PZdžܖ^ھE~_4XEL/9_! 2k B thͩ%>׵F?^tB5.9 (H\^f (ǁ_9y#MsbtbEeG#"p0Rݬk޻${=iFɮnHQB>G;/F 9VxY|ZI2#1K?# ΁ ,iKW6ـԤϒ@ߎU֕v16K Nr@z)eFoOn.kF5:O]y(m^Cʷ r.vsϒk'psԠy^]ۺ4Ns9{'.JmEˈKJǾ. ݻЇ(- WoؽpuxI6IB݋%2..Wȟx q(xB?AVrѧ#C`^ W_BC]8JpyM] z;4n.z2̠eE^VOQ:g|=ґG =]5ө Ʀ7 ;-FxJ/x`wJ Ezݢ0"a/ u 8V7tL/k  lT1~6I'q #O~29~0dH AmOKSnYdxҤ E2iXy`õy/!ENFD;a36vS. < m? :al}FiRIV-}!":GRc7y4r6\eTwgYdZ?O~}z-e<(,`_1r&`$`* D~ o~ALn9J虻_$:v9GrNB+HunIf٫F7׿RUv'̴a)u u\-)lc QVֵf%ʫ''2+ttQt~%5ڡ_]:X7н."T _؏ȜA:R{[[׷6K0{z(LГ/ۻF;TڣgZ;G}CgIMзuo#rgJF>u)ӧthZˉb[/m>j 27F`/z|k >op:<.~] ] zc)v+ lnW#,ZB~r1 !gawMЭRKV5\GGlO] 9q-uɓ-fyDr!q2S0K٠8A/y zX@ENRu]ڄbhױy^|0DCMʯϥhK]%:qf;ȓ";ttiy's @U;Tx#0i>~ŎHEǩfq=2[SW~a67ڐڙ"ϾQ)ؔ 5w lTŎ9y*y`Sb6CA?wHDN%Kzȵk<Ϣ[d\JAOԤw睗: 9Uu*Q<醭e/is\g>?ō r~2C!|,b;rKL6ϓc\e)}A`M 4q zGH`5X ^ӿCfg&e!w74WmZ,9fWXNBT7m% ⲴO#"qgL-ִ-ZFХ|"#[ M(/4Fh>|Hzy9)0p 0W4nv1YL 6 Vݑ ѽ(ӈdž\J͏`~t)c#\z1l*E]Y+ QF]w }«7z"?Gʀ.\go$Mi ;KBF9]lu/OuC-F\BJ[32BovCېi5Z1p7w觢$ͤ ]цbb"gp׺4shV~ܾ< YHo9q²nЗݎ$عP6hg)U75moq>k]iC$^m9 Zz Fb?Ч#=dEN/IW~.>݅Z4]c4룳GcOG6cz;B\:A_ELFToB/Of_ِ&!~@ow{ܾ l&gޕi Їn9>Qcaj ح2@~GNO[]u2r'RǯCoӯ.!BJg!^ui}/ :P3^2QbDD((˯:60A/! x}-s]RFf ћ{nE5伽lN[1침S ƥCA xV(tN9wfUv] cؑKlF##_b9.]Pl/͗芼5w*ؐ_$q]YH!F[qԶ!$O4Ek>K]7}r\Қ3B`M!~RD`aUvHWuV6sioYkvG,I%/CPz__iga4kT-C ~g^mTGru,Nk䝑nehcE-;r/G bȈb[r-b:BFJ[ߥ ېs|ȓ yV}t.p.?m~ SeK";C Ou2fC\x@׸2le PcА i*Y]r^dB<ݢ8KCTŊVAF `?`Fwຎrfख़cGj+w1MOTBWuD{=*/.ZzuGnktG :o8:_mD5ntˑ:o4͐iFkȡGC\W .).v:.Tc7"1}X/)::&Kh (ŠG W^q`:IO]mr7"Yl7yN zh1:t}t$@k™6$k c`2 't[ۺ@v@T]L('v{Rw6֜{x$ ^f .Zahq@ZdLb5hLޭ~ٕfъEE,5<ět2_)W)PkE1/>zw([C|nO2z~+JpGqHdkzޠ'$ Z7*IGZxWh/)I/HXx%+|?p $9ཁ}SiFJgLvї/ۏ_{*k#l^ ;`~^BO|.6f?<Rxsonӣ* 4>3x1_En>QؕcpWP^~rM[/6ha+o, &EU M_ɝ/-;@O+*^\O)^7$艢{ѷ8W-nM?XdQ[ pISBV|y~懔WѳUo$ov:v=$y`+мgTɂ~FŬ|oCe \^3[w*|?)`Yv.ώ-\śnraC,;s9 ,f󎛰U.I>Zk,> *녞Jϴ䮥eB]YȇקLk)kp${xo7#kAuɆ%Y"'37?s!Y >Пdkb7kCڛ!7OV] >|1Ο=Ctd)#BZf𧀙XCNoV~ܶ𤎅;s{6ӟi=?lץ5Yt|w%JY&0@O=FYcs}" MDd:8WvֶYRj(=^|io皇gA\R ס8tuhޢDɮ |ͰNɎȟ,M9i-j pa~~w-OnY0vq7 "^Bҏyz4nCq0 ql1Zv\;vǕ6lV8zjжOx]n;OV>'Ho 7}S_g.V>;833,e3NeZHgvh?ɯ^:MI@\X:#ҏiؙӊvyO.z:I l'/`r^ϊ_*\>L1ޙ䚄|_oI_lkv7 zGSwosVtn%mbi$DanlβyMx]sH}jQ dVG{ |eF,sXl;U !߯h[keU^V~r,УNo=-|$5h^77#^ O~A :ԣ@۲W辫);&Sl&+!Ў#Y>kP*trYK{E v@Z ԠM?>XS@{ԚsIOM/["]n9%`w8=p]j/=J5 e)d\)/7z:Mmz czK k`e6lG^fEneN 6?5z~[XzAؠ`es341~ u;NuT[Q1A/st̪N6K@{َ\h@>Z^s?B^Cu ȸt%]%44q&]w.Ncž!?ŁgVw!P:!E2ݥ樫@ɆBwjkRv:rz:zahGF3*ԠJQ-keo)`݁wϝ ם%r0,t!0-?5.Y5o<= tOt$ y,ICOu{rYƕE.W~EBϣ\W^LCGZ@ݠZ`\~1fJ/Wz(ߘw}f1}Wr^W/ z3IB>~A <=;;0Jq]/D[7Cnr_-FwhqIj+83=鰛^&\}֠i}yz]bRttLӏ.X;ۆ\nA|H`ʢbؾtaM&չ#eޡ0t_5*#KrEn6u,xhwgTUdw^98*MRwʑE |'KCc-R|(ȟ(ԻƶImH!۝w[L`t7moT>C3=gQh]7̇If/p)fU:8 wm>bf\+˸%OKa8>>XKW2VhFfT3q ++2#A~1s|g=کw@Huf֮pοfx06-ݦiZWi|XbĂ.C}r _Eo*jr|yk cKۭ{cݖ?"ˎ~+3lȎC 厾L =B 9O1QH3|tF WU5& ѵ,1]{znN >k <CKJa:ޔۖ}ڗm r5fā"ˈ^?7zJ>ȍo:N )+t)*^]g[/$BxՅk{+dgu3}ZcO3Gfч[Kա/5;645쫹y=*e.?bKgp3M_5f#DbnӚA+H`gn-{iزg__7A:JB\ }rg9]Ktzg 瑡eH2MR *س")֠w ݒ}%n %+-^J/|"Тe ~`M?5pfcB%ucwZbQti/韶k zas{l,Nǡ\JNK"7BS{3$\ӓF_#G$38BD_sx\!hׂ5.۽~vo,Je@w*7z3huc,%=,O 4 Sgfh @e/YrvIRՎhUpJ~?)A>v.S?{O~&8kfȖ'2}r 2*H.G.?Na=nmg+,:?؃A}'F|pW@o\ zןL4C^?b/V8y0!3}D|Ny1K[foz"7,zKypBDlY*Z4H߱r-RX;So\Jo˚A3WXTMF?}&)qr<2vbІk_W M~`u L[~Vm#*nOsl~nT^r G{gn7b2WD$o~2ȶ'戗&>X^%@w{'j:;t47{}-2=~:NJ;ф+D-t9%v˻6ɱ/OeT?t@]Gu|xj@e,EdjSxQ>( głLֳb >WO}>; -K~cr~H+oyGG!BG`}-~JT7}9L\"?m^#\ʟ~c$rx7z(t/=Xȡ^:?2/~ ђ٨%YV v}t@[ T~ :Z!zK`txs$EB@h[?[ Zg-@/WO@oe9@AO47zZNm%%/f7\/_YYPޡ)M3{G߃(o92 " 5{P2)Aw >)}Yj$'Cq?=')Bf&5DE[C\y;7G'|*Cة}a8ųc_-B{a"]7N+L@Cs8'&*~ߩuߔu.˃=]_yJ})e|> RoGdpExSnُ[A5Cs0r~`N]噥-2Aٌ`Oz(;C.CfG?k PڑOalл s KKR#k ,67x֟ekiKLB2M)2o.*†8JqV{̮ԲdCg%@oF9׈윴ȓYom {ms]T}i> Z<~9΢$~'9)PxTbV Ol33Zex?Iì@HBj T12F?ia>~w5vNF쐞r5NeۭkϘsh8or,Uη*f85#|sk?*&MxwAhBUhif֘y%~_bwlךġ$|FLwY?frg%iL02P%!!7\3WoQ~d˓m=I_ tvjRag~ZnKC}4}2~\ż=:9[qGuy軟d|^eBլ r?Oop-y)S?.Q#qZ#~[_O +/e!](\97wg5>*6:7lr%5#p"ID6>kЯ4q?qAUd9N}{93'd ~p{*~‚o-|\˯F&Okȍ齡/pEr:@2Dߌq -;Ɍ9.g} {Oȁ-:1p4rʇ$)/Yeo+5f&;.^򦩼I56exYӒZB' z,[ENG0}[2K:ٚ2 &+zC~F9;m߰T}6]z{&)>\Vp[;\4M?T[8kW^tffЦϳB3Jqx2[^"69ut䊊~|Fǀ.gvOe.GM3M6Ǫ7KzǞ( =GlĺS1doS=W]%wDq[jƛkplz 4.G|@tJ},.!2DBȋ2 <, :,oU/j' bV;>BTFVZxi_,1W9v@oSo50SkaEezM"٥xYܺ7 6um<_EwceQ F ^;kmXjf f lSaX0(Uώ}(*R>.ţc+ |[OP36z_y&LҿGVY~+r'̌d?,Лę=uh@"oݾa@p̲]Ko)^rۺUǗSYHf3}X܎n >T+wWbThbY$d=uj<7F:t\}r;p' e h}[2+֠/(X)Wޢ,$/Cn=e BRK_qx,>R; XCw#bѰ(QxB pxɽATJ!/X?K$߶\/ZTH!g3}͎wv7*IN'i|P(Z^~>V%c럶KV zn/ }K/qgMz9skn5q9t~7mTwWEȱS~ 7 ,Љ7thO}yw*+ȉP%ӕI)ٓ=tv=PU֘j/!fڑ?[~c?XDL!=g}z6R؃%xܬ' tzCZ+̯yNgE>ީwp||j:z-~ߎC +=-E$O/zYVvMBFA[ wKo:2 }vQ*c˻?~C =ݸOM3WN7]F'Y_['_*,ї铁}3q |҆i #NG[~ўzǛ,'~G 4'͛|8Сȝ g/k ~ǧVZ̏d DW잽~8'ELqOwtD=H+8Fw'.[Le'd&CYẌ.qpڌOv=xVGi]'!贪wEp;=bvd <&"h/s8OfD싏v*7tFD>S!@5ъb =w jFcC"I׃Ϛ:tU*ms^4 l4h~{hr'f4ָ03SְI\؍# zV/-Cӌ !jr*q5 ̀QҗbG ;豥穋 T~)O3H(tǦ 9Gu* OO*E+j t;rHۏ*~ {\) Q?T^y_5y- tJO/9 /S)ni]7kЏ []"2VM9M<gaϰo3pAo;Kaz -.F& >6ȽȒ93M)oȹCOm%FFI/k)J=?U耮hu1B>;'9㚰ЃVw:R9E{E꣗ z]%my݌LHH6蔚3ɵ\T^V?Ae7 :yz&zuSY&[m=*yzAu.45{]Cd6ڎ6LEz4֍T/k!~JF]B>^ |!K ϰ 9U'Y3;3WoqdE6* ƹldi^\mݎ Xِk\9jak(kRph<;\w6əN3ՅNfXܐ;N;rPB'Phoˏ& ̢a\GRmU,Ņ'AV^gig}qUsb@ڙe1Gy%\Z;N?@NgEn~:M #gr|q%[ׅ<#͒$B^HTa+{CިDhFC~ClC~3\~|i6?sBd}l]-qv{*xWBNYNh/;r~Fʺ|KB+V2 tY^2EE1yЎ {.nm0B/2ZM^]JFED~^-#Zrc ĺ[#~=F=FuM^h@ eSyY]̛4/P/_/!8?"Щt۰g])9SFYFzR~ދvYKzN"orIBkj'P7Zk6_ddY={u Ȁ~> l#z@ןKZ !C*p.D>~y@+PpU#X9):x4w#|!mA?]# ^mC>Rƴ!.Bw{AXfsʒmq؆R.qҰhRs/(ϙ?vN!>KG*kR@N8"3uیuM/FkR;k9͠_fuBQP}uiqyyz?]8w{[ C5GF'e4hORmc G䏭ijI:enWHϡ\䡶sKK 0>s;p!-#OԱUcTaz_ 2N1dХp@coՅXgDuqkkHU֪Y[Bb@^.*C_ _[#DZ^Oi_t@b|K*a'p[݆C&fmlw@:K)@^my/>{,cE9wiz0iX_9#Ŷܫ C1p1rh1}1m2ivRrnCK}TF Bw,3>CE!hv9W-Z{|Z狼^=uԠAv ߊLD~3:sv v1f -p_r &@jxVUcȪ@H6k_Z+tMN+j^e@^RGwBo4ܗ~f5zߑ8t XӋ/rWc8|KzWZRmȵ#o 05vດ^ZW(]đkC.C-i6ybW(usk#4pmI_y< IlKm\y 9AVbJ/]I.63*)\ˡV~xA[-wu5>﹨DrLWZX8y@smD 9L[fVZ`yuS.h)0>Gҹ"7䌗95y.r*S@o@*v^omi3\45q܏~RIA\K"] 8,LpϼGN:/T~]) 0%FuiHOgTC|fIC\{ot}c+rFL#Zd:'* EVɍz;tJ&#Ayv{EDI7Kߢ'-1/%|6axGGwd%:M;M?WndwUOqϼډvN&Lk},G)8<TAuhKv9 OvpT/UR#.añ\"u Anw;|Ď[VoTWeB=8:*I~: Zqz~dC.3\7r'0wghV>Ly/ȉз4tK64UċF*$q62=| P?RWFb@rui#>}1ieM ט}y~K5RUfl`4TV/XM GiƶeYM?[?"ݺiϡKi}Z<) }5AF<FzQ򋼯RvE>%?:uꡃW@obVAлT2}yEzߌ {Y݃\}d/MN9 7EBͣYK##X׊4Z4VlwWDeF<5ԲMmw>@C_=7/к$P:/Ew9pFlyC*X2dj\߹5^@— Ȳ>t1t8ˢumekr_#\dԕߏy")  k*4 S`=? %45_] [ɍFmmd4D{C']47Jg !~~{׫V-5](rCF'ݑ!jC'E] t#z3^ F>RƋe-nÚ2G@Nߨ#h{;+#~ւ q^{O}gq.ۣ/jcۧR?k,yM)c(vzc+2 z} Ϩrْ5~Dg.3Eqtd'rjzO"' sKn8e_B֑$ղ]'(ra7VkCXg\S$e=};PMPHcR bzz֒`h#Co㢨/*qye0ed?]֠,?SDvYo~͐=H9 9%['9^*ط@`4;2=6lGBq|%_u("=u馌Mhq&:;gNsYJ C O[Ov6e^j,Şh];@+iemg 5o^gM`eKWb(ro~]n b`zKmdYC8uB&W> 6uClkd~^BY[)9r(9x'Aޯ:)|$5Vj@^c j-{EŜЇgЫmixͫwBaX7: Lk.#fK -g`IxL+v ]5N|| x=D+]7{'=Ϭ+ Yځ|;j-ȵ(fԱBzvngfC:i6>PWy+0K^/Onc -i0NR(ϱS"B}>H@/4~"OFNՉs4 /Fy2@;iCx^Z20zn*.3Ռu-aܢqNm,Jla(avb^䍱;s3sν!Hݱ h>49S}t@3u^A'5]&vkx> |kKƻUݕ<QUdd_>4 E$X\9E.Ya<Z~# ӑr[WL^DrB eQv_ ~ǖ3Cӳ]jNvN\֑ERYau1Olt#0p 9ZECluh.Kw{p\.:nDѻQ$`=WW g?/`7::+cu伝R;r)*zn%_zMq0$Eo!f-2Bf[BĨTNȡ+ n-1;XgrF{$6xb\/xJ0c*Y-q.7[i$~`~zmh#UwKͻ8y)QPuhjTZ?m4ߩɷEVbD/=% Y82(Q3/W䌼e _c|>5I ʹ W|#e T~stfV_k)sx*asqB~eIZ_,(.#|K_Ӭf/: vrV{EZk09ΞG"'mVոs8{ ZZz{-S|c/$TP,JႧh i;ۗŠ%,~DG%%o}'DaR~kK,BOKrO>EYWaI_u| L8zҸ0q{ʸ??WA_8-7joEX+4kT o  U-h8|Ij*X*>Jj↳BЛklV`'߳YZ`xY8`ǬzYB3pj#|(݉`kJYi/|Hԝp[vnKttV%лw)/4vh'JNj5\i7*t3R/z[; 99WaQA =QD^4^Ԏmq=mP~zW}[r">),[fmʱ&/wiWПmb,ԹM;^Ϲ-~?N*CY.o~eVG zo㏓O?bԯ' Uz)vu~~Aka-0wJ4ϴz@H3s2?Ȟ|!>iN+GoK2 ]-mU[\m37_T#E.4\~oY3lQ@_CEfU j* gYL/+wԴ*#l̩dU}HP ~pK}ױj_R |’Aw}C/ ;S|x@?f߰iimvߍ͕(luS/${s]ll} Pn˫z>]4~X* ޒA/!;?֐c~)$aS㕚H(1AkXkE)t-7ū%YhmF:̊?7*#ׂu+rfgzUqƶ#Kw]=ɪhX=+Q# 6&=Z֏o2=_hu@VRACf*ҐKpˌv7fs| {?>l! 8_딘ϫO:8_q=sl@^SL@_)%l9NC7ny'mGyο)Y<ӽ'쮖9 whUu =ug]@z[^sgK\Ձ\4Gā<;hP3P#>A^nu| ]/BO9|Tn@Z܋ܔ;~øN욕2%=50:OBW~>t{xLSgalU8?RtQTlؗ:8BWK3һe}S8>UnO46mAkޡb;w5Eg)=~=C~]m zK79D3Mini%ܛ"4Hxa1 Z>݄J]F 9 t]yaWc~%0%Z&rRvw"i~'[xQ#.[|LE-1hB7;bgvB.IOK].+9tK yFMe]P;48ob/F[Fvvu?G]*tCkw!_.\@C#a]Z*r?ђّ3K874m Z.,Yt )ykEDWnX2l }^lVCI>+eh5o-S\3k_}ZGL+!70oD5 8;;9]it+dŴ70UzF˃g)-s@m&E..VTO]3۵ny O4;c{5u̼X Z0SxZnS9^@AܯT:+(I!+m>yP_Kui]pIE}+cfIQ+2eǭM{He 6 1Mn5F: Mz et}jQqzB/'vS}/ =K$0zdQ > MRho"~c  }#ux Q?CXzţh_+m;T-Pt%Ωр}pY =zobh[IGNdeffRۻe;PeuFF6iF*ۋ3&+ 3.Q7H `!1FL2z>֥-!ODSBؠK" /Xm ^ZvyB[: y1Ts^@NƬ C.q!Lx"_Zor_TCݗ-z\ZI@m96]BF)WCbTB>tN'YS@wF /zCbXz=[ trA;[=%}]/ -%a)V(2="nt@rߍ[^-sd`z[ y 5 Mv3'"yУ/S٥HsclK]z]~AFL )̱_sY74ޡޢ^Ϗbv>JZI@W}5P; (.*w:;֭ݱNBg>sz3枕?b%[HoM-N/ӾN-C%0oJ֡I=G(%=KZ_1N_n't^h^zL]\跻gKXb{ݦS5 t" Ws!U 8wJvQC yOcRN{>ҸWfB$̻%8jQ'qY j4\z?oBw:y@wFE֮"/w/n'S]v|w -h>YNڞc sHje5m\S'Hwz#@6=ғ uݑܡy^@|UMS&'vTG'CvTx\FrqbtJE rBHvo@SCw ޼VS !!(g"yBݱzUŲQk=Bve't1mݽ>5H;cTh9pᭌY^$@k^AWB'ttZ>}>$؝M\Lsʩ"KxM0N5y ڷ~-;F}YУ[UF՗"cuhα2c|,zӾqwEiD| W~v=+n˧q.!/^m@SDy|`?ʥbiV):~ũ܄)P8BqKf,:u)}6NpnK!u-. -^YrlXS3y疔E/MӵVrm@XPԽr6BάÑٻ`:甧,Tۺ-[nLpZ5{}dzb#xvJ H`6DfJΣgp?soU:]?=1=Qo_I)sG>,x~ho|ΔgcS/W 6A8J5lUO sFTQK!@ڟG$Waۼ~1ujՙ^ =οpþ&ueV=H>]*CM75Pž譍wv5BAn2N Ң=< +_7A Y('4s%hZ2+}+kDs9,|UFcqrPAߢk/Ksݠw7)W3>%\zgW$nIwYa!, [x~8UqfTK;t'<6*r3J_g? \_[dt4Y.׵U*éuo+̓2͠%o}cΰ?nw/vhA9>umo3r, ~VW*n|GH:~kjK|nIq(O&u i~)Պ|ѓd0߫WIiqwkg3䊜t?}< W95X]v4ho'kC7ywД`riA1a+:dH0i?5bU(?Q.&;2\"򋝣uTZO>S7D 7[2_).68gZYmb.,&.G48A&q԰:N>n~w̗Ufz3Ty=S?&wO"Z>gFܘۆ6>lZ5rMBe"^jߡ#0ZAK@K٪N^M:I4~? i[nBvu]{!cTd0TT& oIzVAtH-ry =+=񝮛W=J~^>oM>9 :@}W*|S@8i2Ѡ_=%ƴ]i,p>(YUYB!@wD23W=AoAUNҴ%S tzl۲p-GXZz_}b'm@Sʮg}\%dOpf/yo}X?n-ABVC᫞)gTuUrAI.Ɓ6euJ5hMkVoŻr>|\5y_m荜8&6{n<)w-t.Qx(E1o18ѽ"o-D:S znߢޡPNJz׈] 9AfYtw'Z3!Q>#<+mȯM(FNȁw7EK9^CL"^$,6pe>ba&`#G:m5չg]zn3/l6H tbk~C0{+W0K819EiK:it/toW$Ö.-t Ԭ\ډ| 4Yb -DWXDK:~ })wQR5AރI* 7I.@oarB-"^i Y;#anѷ ZAXK_)+GtՅ'qwݫs|3 T{'e NU5oδbJ.t]R{.봞Du i "Y]{:yŅnI{sZNZJ>kXw㥖F=wڱ72h5 "'J {Y)N`qBߢL\*':zCKKKE:ة7[Z^Cva4u獉܂ْ^ ٺtd\CUPM ? ~O+ls>t 7I7.tME ,]Z)>RRl qj~ITwx[Ў/ )kB-"'Zk7ע)mz]^`hI?WZo_yH{&'@Eqɱnѱ5t5y9ft#?SF:G5[Eh;'}OpOx_8>Г7ҰܙtյbW@N聜&Ftr/t)Zٻ>U.qaC7W@໰.t]O h®y$!Wn?ozVlЩx«"e'iՔ8smy^7z|2:mH~|뒦ScS%R+[ę>0wqy3 t8$?Gp{x S4Y],*.9 ]j9rU.'^m:JR|A/w1:1S[SCۉ|&K#=Gm%͠E5io5'Re $ )l!{ m\5D $m|BaV7kbȅU;g;RC%JKE~c$ -3+й@,#u&/4 ;Q E\r=kU]ljْ~_L 9`GmOF(_Ԭ[nܚ"?GXg.12f.W]o\xU]Rv5)imְ]|1hm>G龽ېd$t[VFImGI ZKe^-ELyt=MSѮ VG#IT gKA#ߕKnj$R˱ǡsPʎyJwc?M3Vi5k7]b5pfpFaэj=Uz*Sk6}0vH3 Xcv C.bv ;wA#:WڥK[yjftrBNa}[5c缮A` 1x)wdH>@XY"ur8 t'#tS^lbo%פc$ۥ.lsNw.V7ʦQ()10RoMfT'KnIuKf6c3KKyjV_X ҍ\ 5|[vDF&KKAb}DGt^-{_䮗ڪ.>OxɇxwJƬHz4<[jf2p*w<2Nl}oҠ+1;|ou;3"+%"Ю)[M J?O]nإ4t<=iUEǬȩ9mF +}~@`-_|z{Gu9Uy;8Y@=gTFI}ڣ8j_KڨuX佝Sӝӱ0J< t{2/zBԻ=*̴~y CKzbd0h`ɹkA&jukk"Yf@]?yR g>02C?%1b{m+짋; E Ћ!7lB.E?5^e@vOFg2ہ\"ǝeƀyD^ K5d#bٽxs kD:~oVdrd]^l싑2TBOdpw\W'HJ퀾t8v]{c/]#A.ʈmviG:xINE"{]nnF$ƖOmt&)Q^/]] Ѝ3ߵaIFe}GTt (v=pK,ɺqu%Ih&͠F*յ(m ]@' Pswv 4֑@oa#iw1ozw. pW-@L, (Nv~Hn{@E.z lԡVƁ-חЏ1e]JQd^X)VƑ_4"[pC=?Sp/{?ȭf"ߌ2u>k`zv0-#7 rwTxIo 5FAn`tiMii| WѯaЪЛ]ZTF2b9͔=F뚩{%ZtBkISLv#T<̮6V ۟t[s>Fy$/4ev@u=T_\-[uo!lZXImG+tרgNc&Y/r6bZӤIdxjwJrT6,o.zʏ76$Mezo@w1tI=u@?KAzie)1İ[u.T%JbWv@nZ'pK{G>ZZjk{#yu-:,bh2/@L< Ⱥ]pSҍh^P¢׺t E Y=uHg}橲/cm9Qʽ>ȗ/В'$ȰGπZ9S8]dmAw]jo-HD CoJ$=5/]:"uSq%\#Nc*Q7N ʁF8As57߇n5zK}c=s r@WU@7En]q8D.ȭ S_tlK뽹:e@d>kn 9wz/48ۘļYЄ%뢞WZĹspX2qiv_7#V/|zM]tWy@2(u2 hqd@狂Z [/׫ƆԬH?Q"3^@z-mp=|CtGwd=7nJם,D 2.OvZR`pf7 gJ᳇2.V]F c F-> ̹I$Gvt@ #]bM$iE0 v"o1OۃC2qBK;|F8icf-:bcZ֕2+m@O:\9Wv=aBύU~7μdVGt@?Ko-ڠ+$>[lU ΢0<%Q5\ڝZou>ņ{ᤴ,Jܮz,]gM]Z/5jؒT܅JyԾV:'rɽlvC'ZK.2e ZaS?*-^cci \RoU+x:ǥ^b|~PR%F'y}91`}_k^#)'tNTa>~ox0QRՕ1qяP{-Mi9;{f/u\aAr;O]h.|-^wq}`hK3Cjk~!k s`eǬ;`9#aH%3^lnW5bM!M;wڸ"ߎ;F'By/RձȠy{v^^9v QȤ1y:ڽ7+&U[rhyE8AFlkEJCf8l6T}嗢 /7/w`WhM*[4PT->$%+v@3oD^l  BO5m?g.k{ޯJ+my$+Rnݗի{#oi u7\g}u=/V9o>`530OszhdF+ȹ2eow0"һxEAOV) ro &=|"Ϸk.֑Edoqxـvf_13tHS$ ]5([boo^\Dz.tԲ q,iAna+MXI7p+8O}w{kb0Wvy p,?u (F CprKeO^4_T"tv ws`FQ)m="v@_#/jvއ^"59s vCbҨEkR~3bz`kĵN \_il?HY:Cmr[Ѱߣ=euMvKnߴ8åǡ $ta ]gf &tqr=(j9猊:3:]j)#q^|hâaO YN*a7t9**gJ { 5) ef}s0+Q7bF05,3ꉽLڍv;)c riJOy#J K)ȷОըgl_̪о6Ne>Gc^Kiimr0go6?;eym=$CHڎTrgy0SelՔ0co!&n\0=e }0*$EW9iw,zG^~N]bы.uia={$˘ cjGWZ²R[;ދ~PpR@N-xGe\xY6#l){9h {v !eR7KNJw}e`7H`Xع˚<]uV薗%N:6F%$]:Z^< TJ_u`bאv`i9~#ϱt֔>O|V1272=Zc)t v(.ס=.T0.QN0=m*Vog΅COtUp1l]h^ J' Tt X2Թԭck!h=w} r !ti|A뾏_O /r`oEKeB&MP_-7xI vސIϡSФH:ZtzZҥ e O'64;}U/Zt.Eiy<:AƝέm֙Зԃ\ \Cf=|}O-]Z]7GBZ >c+cFKnML3)@.qwi.=#>*r\3;-M wHn3tn Ut@o>9Rdqa?y:7-;]|hEnǍK{cEÐ[/I5~z. }I<'>r$_/:$i5Cw\fAnk{d܊{r aF/9mY3l5V}ߐA^nO"s[qN$9i/l7:q6_KR/}s0[/f[cpZPKڈ^{Lɷ5В }z}=|Ԓzԙ/M\䴆ua\f,@J9_}:0$<-V_~TSrޯM# :7Zs'p[Fdyy]7^r[Tǣ~k ]2 [63PSZy^cTU I{Ş/;zJV5…ܧ cD:uuF'yOƖJڡ'"ϵjAA5u3oܑ)q{~qcBn q9) MЍ\]- dx`O1y uWׁETb`r;K#"#$]7ed.y Δ9^~^]zmا~^NLw$+q0BޮP=m&9h$/M|!vj 8%y_,/ o/ڡMɴ)&0άk v@`_JE^9{Q /z[:Sl=#a'5WY-atl+{?[L2潈't^йn??Q R_5S A.ȷ0h n>voTpC:8r ̈́CV'5 >/`3]%`%Chآor셯~m3}zVuKdA@l- :[d)U9C_ab9 z_q>E)!@ʶ/e{K[N"w/r]BN|iWaO~<2ݾV*tBsQ7K2ƺΥ3rWW}kPw VwC_1ފo>1nc$ֈr_e$#'"\!KQ"9luu50UZh[@^g$~@&Ey-dmx!8bM Dg! }Fch uūtHl|II.rA6w[*)f@OL_"~%n/u'Cl_8M}E>' :M#IRo]Eg7}F7,ur[7uېy,:0v u qrx뤣[@rZ[V$I*]Ce ]ncn)z6ڿFOTs% dQHyhuȰ뉼Ui ];KfE :MϭX{O84( 0Eo) 8eܯwDk@s]@.6~Eo I`d.Ԙ|cߞ^S)й$Aꁮ!:\2aݍ ]Rig-V}5n,c^/Yf? dt[%K%_bȊZuxYgV$d'0vz7hZ_C#K]N&r%S I*K/wSBz8/-|HLwhG0Ǣyqn6$1@}z= [fҾR N*tk3WW(Seh|Q{}Soiwf=ziZ#Sy#Џhѽ"z u 2.KR`eޑ݅x)u)IM!o+z* zM|F`}#/=nWuՀQG]q+VG#oKp}FY iGf$dhQ1 rfM '^1Ƞ$@_ ;c$no4H;/Uz5tן CZ #W_5uRF֖8;t`Ko~G7w$ 30x+aquq |3 cKxSr虶8lbu^o3͵0G[gy[i@˦ߌ_}ej8"WD0ִ8󚺴AOFgdz\k9aO.JD]1$Ru'g0c^=tD%Őt:.P/=B+F:]Wbx]}N?S/KwWZ|b{DYRedZ7y_n"ˁ|K)2r ,/ܚ,"z'*w,qa=s\cvtx8=E#,nwJVE>eL~O.Lj uo)yI M<..w=oo _u6}it ZjortrӢxE{iO(sǸtߨ{ARZ&tS;'w\lb*Ut`Btn5&hSZ6t%xyߒ7t;di y!D.Km^ځ|D!g6ƨ?Bi{vn`lDn1(t]3q2eK3y9;RkOz2H)fs>͝#]~ZnB.G˥vH2}׈G&'t@ǀ5ӯc4-2F;B~~r\-$M*.Wڀv[:JA/^Qr}Z;Ce[AVPo_$5tX=i #wD1uoXxׁJE.N7Sf@dbpJ5Q'tѻBI&]eƸԯ \3 覑&(/\1BQ@K^9GΥiɏzF}.@?DJؽ@l@nGEN4 !Ϧ.$$\WZy](ܢQ5WBf1l>ȉ֕zisg􁞌zBw!_R<9ҌuYm`=|@:iT%@7:aVT}뢫`_&yK}.F6CPfTW#Qh1W{#)Sxz|[;e\vI^<T~lw5jHuv^# 15"t.9lTmvZhK_=ۣQ?̀|ԕ/-|Eg-;92~N ziu;LGűl)%Q袹o伶v tbImFJGSA^gAt{.r*ٽ2c]yxDڢt|zKk=) 3@${*=5_~B e]GE>#v%Ry_E bZ rwYBRsƜ Mx!nmlVW&]M%u-c˃VT4lQj-#5 hhEqsu׋Փk^ {ZV)4 ȟt>t)*[$N󨻷V-f8):c@57H]xנvѡ]O{GZ EF0s PN{av t+ub4*;F60ZC-DI]4CGz>GAߵ RCZ[vERltm]E hk9KiWo 2-/YLu!7dZhZ+U8/4tV:DރWmS}m]:&]uQn<':HrU鴺\#D/"5ݖF>ddq 58bwozńŶ Rk◍]ҨD}-.1@KzA x#sN}/vxCEW:t꼠e% tsIl$rh {T}}#EHkW+7tGyB>Pzzh">#ʔ1c.@oK[x ].ޢ+7KCGFz -W/q34~p+;t(zKt>cyqq^*`w| {[[`F*4{л[> fݰ3tq1 \wc Oh\}<&o ЭTϾ*Ⱦ.oei׽X#"l9F7q|@G@6z=Sܫ"zI;R_, ^?v_з1ay]@{HOq}cG u/٘tݐDibTvtJa_[׸xw="yNJ>8]`' /=PlL~8Yֱ,`c]Ll քξ o 'C"t]=z+yrWI/z亞ȩs-7KLA[6t:Gg*5Īv M&7dc;؎k>胼'EMG)^k8/NJuQ]-IF~ -ݒq~sL]s*QdPV6$cX=rsϿ :2HxƠz/*/i} MS'i>q71댵_͊5ȔWff1 6ottYbuB+fRyn 4rʶуC{u4*2s% GmQA>:lynAj+lmoy [Vd{H']dE|\CҨ6V(#ǖur Y_4~3F zGEGZcY;4[jzW?l% :wX\/3"Bat&J=oEҡH}mns\z[zC׸lH ^,DOPcp7h?0FN:nL' %D4FtFoEN zmW) 'iхveD Hi? ٩{TӴA'^)t Ѵ{\{E#ݠ7vHr%C Z^hwIvz~|S 2]cH4qޗ<Ш}ydh|jx=~A_UR1p 4+K+=9zߍ/d9É-xŰuのk;49F> Ag]BrYEFNo񈞻;l]̧Ȋ.5`p.._-u$cKvu?BOZi ¾NQKw᳗]4BK\77rur<*:*gE^~:?mBtwl`_yRЎ4M}E2ʉiZȭ ?\FNN/npa=bo 쀾.d/q6_"~"ߝ FkVF~QMbl\o -R#jqqF QeCW7/V|h^>Wj]r5n|(3IЫ#>832K:_yy#kZ8+_P08\W:qvuٓ C.RT>X۲cJѱ׌cQFWukxGE]eC5v):kl|J t[snZ_{Gہ< |.%Ee崹,:EpKŚ†ХЁB;n 7oK!αdjt^lFFUԩ56ֈ/Kz@*7Mo5ˌ}x2KK6B.ȫJ3`MLJ=1@> ]h]]o 뺐4tss8htIor^o]ޠ%i t+ߙ˄̌,e]#r.SBιj.v=ȷL*'o5\$`|SN|~[4QgdRHk:FtpVCgk;i}h&@k[ rc,NC:@cs[m5ueNP$'vM>un\)b}W-y 聾Q 8%Zw t +]Т|m6h&?g F:F; oҝ9 h/M;Xƥ7E.77/ȷlTs|GSְE:ƁbWJ"'^*#?ќ\Zc:i/ /;c\]"n0t4'L[^mƪe/_g;+Cw/ȧWJNVZНu/ߘi64`)v>Ss.!ItCz펪鹯ZK#9|>{1woMgg/rc\y [byd;!'7 4vf%)/ցPRu~N릱a4å]׺4r\)taWEm4]ݭyI {%spܟh)$RCzq#dTkWwUsi߸E>#Ic=CC.v%\6N@|5ȋts_г3J48Hkfg̋ !un. :e$'tl:nT)} KXmЫ h5H:Krgօ,zzq5…>$>!h5i޲8%u$0I?з p 9ӥRO?i@1PɕzD K%٠59Gdw SD^ _@Cb| 43"' )V0 }$/}t_G$Dx_F&V=ahڒzrq"OTĠicȉ0*Ɂs +b?QSE~GSSˁ<ώL7h7}>^֪4 ]=#k@H7JZ/? =PD|ʈ-2%/UR5{66G}N|QPzE@>BBBc*wIG4nm"Җ}t@GE"ژrd tg zdTZf~wlwi~E^漨*J8xC\X\ J95  O\w>%# -/~e&]胡yd_}hb_{`8Zn֥qvСq^=YƆ[ ^G<)vCLg==1e@f@7l-LEPUzs#՜ =L"0֊kԨ =ӥ|KwJ EO{xe i[{/ְv`j,2@oJȁD}+fȣ/U>k4# }XX:q5IoT¨MFYVmܥRޫt譀>Nn`.ƘiȒC@gG 6u'Ja?ZwVNOWMwr1}-H;6rE\ґC:'x#OIYI&H78hKo䲖H6tJ~c! 8"^LE5:a>#ٓ.D65/X—-|ٰI2}/ )u)oS(^9B4"}HhԢ.}qRĐ".ۅ;ZUuYzN]rd 'A}V꫎N !O^8=HE msrLƹ%F~_G,%#O՝aCN_#וHhz4hT dd$v &Uځ|<}V_Y;M׹ˋ7uFz 7Ũ:9S4vL:tT/_s1{* $Yc 6B.1+0h.[RRc㭚qc|@-x/MKj5d|F=R UG}f#u|V-)fD=u@Ǻ ѫE˼GD}4NH #e;/4ns9';EvAG0gevFNj#ঌ-h_S:5HtE蹶3s]bڤ-OW H5&{b1y3Kd =5zbB I6or>BZ#.'*] -B¯FW3l)e2"NtڳUWHNG vB59#Az[FNESm1{hdZF}dQ azyz 4Ft5-^׶]UOc/Vho{YUd$=ǥZ4| J꡷$e@WF@'yu:kD>ܬ#Feh4Eà^#r\u6'+Mcy"K?J[D-/k9.ݺx/,ʾG |ߧjz/Ͼtvv/bC%Q&?n.?1̅ȉ/ o#,-ꍶE5>- pQ@.kn[m."E=tj庵qErPkdI3䮨.ȟV4F*OA ?-t|5NHZ.+ jr IOOiгݾ7= "_$\}F5z{$S3U4hR}~@Tdy>H- h5sFK1jμj!HF{ g;wtwm6lwi<+H?'r"לOLȓ =RitRzH} z@c QQGYԣEF3ީ"[=A2N-8{4;KLb^Z'Wota Z]iW]AtE4w|Qtl:+޴"dYIBOoBǨ/wI7LlޗgM)VmZ_Z'1؛tJK'3L}Dډֽf$Ұݴ~%%ȫB+z 0: őؔutUZ^%$ K2 &Y7nС3_~CM'BHZk[ᴋSc@o!ɫkJ1=7 LKŔ250 %uAsu<+ F|hy A a^fd^8w/v߼:rB_!oiu,V R"G:yVu/ALv~spƀГoSGWmIHnH]%y*r>b2ʁ(Rf. />F\ra `Q/y9;u dEF|pqU qdv imGv &F{v~L_[l0^jjBt*@VHv03yl_F#8X3!OZw`12ci/Hȷ.4O7jirT6vQ7r > Pz. V} ǻ^[d=ΪFʼU./e}S5u=Z.zB?FGxFy_ uX|}̎ks*r cnXZ"*@N3z]tn{;%ŅxNG`IKb"'DQ'6.q?Klzz^rAj`ۀ9eg/[ȥ^GMckEvtGxtRՑΛXk@]h5YGxFkK;2urNOw;|5Qdڋ|>ùޮ. ?_K:y̘๸3#6Ո?e)vqꦼ4y+|h?^!]iv_~iOQ$ޣ1Ej 4[뗚&QK[m˩tWz1Btw̌} ;KavKQ/Kî쫷6p>J?swѠۣk@]L>j =69RD)@'YQn sgutCTr Y&i|m 2&I r]=¯NT . ڨ:mN.흗\I ?;fl}v mG4.`Cݙt*6>F ԙB'OwWQ]xZ#4CN躎3ͼ9Z)0W`{ͨt@%R-r@8v"ތe$YцΑ-uSZNz=:_߱Y JVt .rψt\ܐۣt1o)Ipp7tտH_fF1r+#et*c=ӒυLT}{LO#70li {w^G,J|׍/@_ס^9 KuSGv"ו3Vv""R/iewqKtՓEvqbBy(r#T5bl#/";*Q 4 i;EeA#EEN1z.n^Npw!с-yfgT*6ځ| S>$Z[@~~dYХӁ\Gr>Kܬc{u?`@N/:@\~"NgЧ<끽 c:;fͬAnR'Zb6ջ rYGahW.@otzhI{/{dEA 鼑"52qjzVO(1ѩt{NbZ9(DГ, Z9[ L:THiC&M -*wEu@aka<:j:yԑ1 m#_>>4H?]iz\ׇZ7ͫ*UEm5/ԥ}l^yslMdn{kѓҐ$zڱu{(¨@w](wԎ5FN]hwF jD 'e?ݦ_AkwnTsα! u_ I&:. 稤ge.\FEb9ɒ>,M%Ujt]$%=N%{=Ϙbޫ"|>n!G0h*;Kfktʛuz CY2^ZJ?J%tcT/j[]Fp[]C:5B ZMKttEPTN\$rӿq6c^HI 0\c$}hM] z5 #Mx՜=kʹ.Y=8)nEr^\#JQk޲S/]:4۵Ń\~f:iʥ>Н\=c6:CF%պH@adJRE.q8m~KRet6Ge=F:i鳾@^kq/)(ie挂*i癓6BT=[p^gq{Н Ϋ=Z^TŁœ\ ˉ|4ݱѢ;ni`w7q륝6OllF=FUG{0vk:z5d{_J/FTd\CHj;>q>YB&Eb24ȺAiaJ3ᣭt =F?.Uҽq?5[$)Z%^pW^X"_f>ؓ wmf<Ҹn0r7F֑-]>cF?-ZQ)hab[FMh+qCs_FA>_@#rmV#)ݶ4x7eNݔ]^ P't<] -//-fe]F/Ӹnrf<#L Lf׺_yhc$6aUɤB=WBj wUKYnj#;Xc>t,z+vFF\-nH4!ແ^? 22tIJ,XCBzI],1#ptn:K^OS.*-mN7 |A&g-ӅPr`!l$1~>DM讑mV>zKQ\KjwTh oʬEh6Ij`=r>B.gpcgE r{^! ƍ^nr^  T2MP/%Y]kyAN0a뎌9"_OZrMFr:>Fϫ :s.k󾔤6AYDWЫuD|BK.QݖkT {t?Vau}ȭ]y#y΅a4"Jj[KRݗ~Q)cD̗=fE14c<@M t"{ӫb'Ojwo"'v@%T7 oTBu& zE53-{(Sum,[ƥ;-r}8z91-.@fz.δѠ'nrtH*uahnyX<)YET\ =YA'24_Sh06ћW cͼw'rkcgS*T6*p=s`/ ,B-ksvD#mqE^JЊ){:FtB[ǫF {{;#\WD̀VO5߁e`[`@&{Jv ^Wܺ5j&ڰ/n>vc] ,k 7}_%L%0,)4=-Ҝ- +]$T%}F.moB zf/AXՑL%Ү6qFN9*RfhvlP `hT_JEK4u?MSoiģUYO}տx?E.uaJe|wHRf* ډC:,Z#*rA^("7^T-"A8%&qK2"?lK>t8NusrVݝr-d93zg_/ž񯽡kKҠE4/hv{Ux~!ĮJu2cy;7^С/h|A5}KdmZHReP4!$I|WÅ6w7\">݅ʥ6g>nQD@OFyVE76,4vC~ Wh| _\ EW ={@ݢ@+jyHj꭯ے=NKK?R"^|AK;@+,_S9kudr5䤱9B^suHՐݐgkhCHzlRPhz.[ =ww(2jP/}oy2h9[ }>=bسSFaPdðbr=Ϋ5p2 tiwx.ݴ!M۫'tUVK=g\rr`Ze,j~IHKO$4K"GRy۲{d"7n v96-/҄< bO_tӷJM3tW/;S}+q/##hʎ 9?v|>k"#Oz9ݥ_#/'.rڻ?fpGfJѢJ[\Fo~IO{:-K_r)M! 5%Q_6AF^9:.r؜BD|lOK"BE[(07l8I7 l) u{`g5+^N t'/ʁ|9:*vE{8ui\o}]f֯DSo"Y>FV@l<͓+YGsu-]!M†v@hK4>]T߽ey@ ~havNG[fj|-TC%zZ}\͆76_H }`i<#ߩxq>43 J-"|Onz#KnhU^}3'Cbc i/=h(z/gF/$KU 44go٥kDC/&mTDUhe W u~ ~Zn)B@R b'&;-˭~ 胾T/*@1vAxV}r:\ݙ"TLc x9 se-8f@_*_5N9Wz^YZm]/z:gN+IícT?:@gE4ńoMk_^YǮ7Y,/up$7YqUx-?3GC,6_uQBQI/O)xw,eSh"Oc:Kt[*T=VEɾk)+sa2-6AXL$6}@7@jfU~[)Yu?WN?2Ax4@*![ͨH=n־gޠo}^ | KТȁM_ڙȌMq|UcL_CU '8Toi^?)r яBX_Dn@?lOсҋl?gq~ܭJv޶_}a 8DdZj;off0 /yO'g2r`H{$Y7nŔ1a#! &A;mot۞@N/{k=w우P~S#×l?Kx,:o~sC )/\mp9%? \K#0}^BW?e S}Y_ z {C^}zo(-kyi!] ,ҵcVEZC7=u_ߺ>9jcoj,oNwN\F[P`(37{3h11!q]pt hnA͛N'LlbE@|X턾SK_#О+qAB :Hg+tYJZ?B ~Bu\utr zfحuv@:J'-@z4F6]d\/{ cS-NZy;F.KA~OSN&Y53YH]Is|[v>oAmUtn+qi&ȯ?;z]6Tznlu=[\ڠۋ$OOZq}`%Em=>t7}~v]ݰF|x_ ݥl0+@ ][ZzINz)t@o뺨-Oץґ]ЗJLx +a^Sna&EѶLvZ,=OaȌ$X?69GiW*$e sxQչȗ*4z-Odʋq %g{10&yϫZUD^x"#'.->WV4ve~@En^!.|zzzK+i@NHI/)q 01My5f|5k5Im4z7Ib^BwF]Ș]=/i.I-Fr[h 2t{8Wy]:}4:fu /\U^΋} ˺ܓRlm]j@d~М@T v-? M#>̒SR5Ev9Zn_ 4k'bisFF|]{aײc{Y]Yw GZir`NtΪl+yBzFK kh@Wkz"HLN!Vo-uBM/M8 J%>~l.}k}pW?[ a:r וECW/&ޒElQ8t:@Ӕԡ9-"Dm1C C'.Ltv!>yENUѣE,vAw\FoqL_ d`|-e EyKqb:cDZE]h:ϲzch-cqs<:!K-57,~w4EEF~> 1G7_5.]n](']o^tz9{uR]/ c&򬤧yUI?W)=+ M} ^; tψ34`.stH+R8/&wt ^6xQJiEnHWztAq~qqZ $I*{Us|2\:2=2lN ?dtyoJ04?jj[fc+ˁ?:Tb~?㮁F3͵qk\%Eq< Bbxܧ]~EԏWyJvfit(y#zm!hICt Pr7Ewm]͉S>B;KG6:L] FnH>5BB)@Z[[uKȪ['gU'ܾXG#/ҿA.R#zE >Bi&a^X~%C'm5i]؝tF|E ~ڢ/+ˣn{}׵n z Oi`A8eR~m,9q:Gdc҄{<廇Bύȥ-/Ћ_Nkl[IZsQAN,N~ANw_zH[d?ov[t?Xn.>CQioK5", ILƛ/MCu3?ϮuvfU'\g^zgiF.yqu<6> u]#}xR#z C>H_C/VNk'WŹ-oyACw)/0 @}mt In#\W7 Y6:eyCy3nE~fk%FB:YF_giװ2p=Q26*4ėl5dK֤"%@ot>9t@H/ h ɛ 3 yмZ֑YD%":j舫UV'8~A Fd`VԽힺ屚 VO4跊o`H: tF9;g'{gziؒPMoЇ_{|K[& S$c7kym[] #'0 >J/ ?ksf9YEt!AF@>١;)ItçGdƸ򂾇喙/~uY\gY=m-u*VAt]L}q_ٽ{^}iҏ[إ>]5Cf3HUC4JȑQL.<` <2/VB֍nrOk#h*C3󦊭kӺ!;߻yh |ˏZJl5ϙ$ /\SQbptUxJz.= ^?DvAP#^jXoj-I?cnhE-OnK ʴ0 lIzXW9ڄMiEF aa"o5c+Ku =zY>g~]= &˃\C Fz t.Bg:BD>31 qiB'zAS^y]/ʁ,b6͉tΧ1iV5"~B4&PYl2RrQ}6Pu nx!Y׆ޖ;Aնlw=9H}+:tYL ȷVbĵ99 ] S;oR+E|Sxb ư7kh؎z_whGz@ɏ`](y}F;ۊ译|<鋤iNExq]&趮0x#NDF\/ɬ Ǭ?~>#h%EMRj9K" m<}/4 vT$,7f05-|g";ӥuU<|_b-dz1zI;VN~EA/*.6Ekгz <g%EC:IHK^t聼}ڐ{Dу 5"r,aiF4)/;@u #lZ1FnK*#Fy.q#MصhہݬFZ1YAoRNWo9p?M +K?X1lw!^w-αݐ;osГ1> |1l.u\z4C:\`"1}ݓF~vWluDTNȟpt1 G겹As hT0|YFޠHt]y_j,ua|# L!Gt_s4%]DϲH7賤;k:#YI?a4rM7bY١߃1]/IvdutMv]5/0s_Zd8 _ȳUfM#✐^3DbkP9#QNm" =˷eMfح^j5bz1 &3 &1 f[!FN!ƂNC\>Aq?Zzݹ6(d\c"'_蹛V xC~Q"q o]hf/A_oG߭~H=V_iypf\ y\߮jF=9 n;j0C%w0oQg؇>#PHZؤGO b@vf\1[؃f]Z^x[,(6IݍD%=.ytjOqË&1s+}oCRP)oٵEG_2,#0%+:a~awE3{/4taݠYF B$32.?ޡ^ ES51zRad{>Sה2ٰ2EE>2r4~ h(_YQOey ;asJ{4]7Մwz rozm>bx`diq]|mzQґ7|3t'xԆ?BqfӅXy}㘁t"udк92Xs/ezOE.ok$c8mޠT~E9y>a LYSbIM|d9{EH+}GqC+nzVBUˀfD G󴔝Z{oo䈆\_93׸/Y>O }6b:\3Ǣ[^\s@?QO85Mw-&˴Ȧo쑱9n>%n 7ɜi 7,~/.=$I3;?I4 q%V&܊C=ɬbzjtZom@i} da{3h yQN{d'$Gb`&8ZxT.TPҶ)OE/K;1E $,?YWo?ٳsVfr #u|G97i;+ݠP\Vl@ա sA煞β_t9_r/g=H:/ESm1.;8Nb pZ_)Uѡ[&uC+wRaEg^sVNoFoݿ!e?'xOlAw> M4th:Y $Ÿ[| t/v;4J<פSdSziI3m{Gsu`Il8 _\W|XWRSzpA_Cюg> :%3&x`= 8߁ o5s4pCxpIP ouQ݇-Rhj'm_#䘟r#K-xym@ pYJw:@1ٍxѸB~>?2ܼ{jpRtp"{snK0U.QSYSOK(|K{^#q}e˳n%fhnk"HNo~_cuoĞZ[/IY<*r=EBE eY #/Oc碨b=#ws$=hrq\b_#urí@oƍ5.b $i(?blQ{>51gmŧ04ќ ƔǹЏh$G$xaAGy`"}WW8ן:z5yh<"~b ZqR.!u_<7~ YUM!咙xVuE y_4WIFky*?Lm[ez󽹓 o_ح!-W}.c\:N`SU 7a'et!w^eQRȓ/2 SdC[8ΌWH~u] e?M[+vf|7/S\=SdgdھBgf |_rb/_/^y[17­% [u/M>}?Kp>Ѵ?'Y؞Ru-b\DI8B/!7K폋,셞v`(z)t/sx}Wpӳo\ 36=i/<ƙ;*Um2|UOf5?R9BՏM>Dq}!?RD+ne{"N~g/ۧt n`iyr.2W&_az\Ag K+^RָqJ4}fρY6jƽCe{Ҏ-ŊMCckYWR-y"U 0$M~/A/(؇P׭rq-`ۗkR}h̠o|1-(諀u_r$󛥘Rr^"yi{{@,x[ BˑY |?,:LA/ٗ3IET5ETczlA\FKG$~p?oQU gWSϽ}뚲Վ] ^@4%{.98ASpdZCdIWEv֐G9gQsYZyxN.? x=+)Bs2`Aghܢ/msaHW*p0|2"/ד>_G)x5OJ^P :I>Mx˂g8/HCQYwO:!k/([a)6}lCI [$.ٱ&^OOlH('{-;vkpu]m6TEQ`?-ޣүl/Zk8KoRTE%͛ zI#{Ky_ PF١{D fpu`-}TJN|(ߢЊuCjFȣqvt{g[6c~7Z:!GWg.k^=taېX)fDQG+2t] yЮ1}-Zcڎj#w[>ˢ]R4]ײNW]]FK6y.z"vH(7#J ^7|4֑f^#Q-i7z m/?!Wӽ{"et) u.>Kr߈(wvn9N\B=/oҁki]5軻E}'5JėT0/cTh ˖ }"m]Q|G&ύ@z =6-tNusI]Mgnts d|5uM);rnWCk 鹿@:FcCND/q^`-( X70u%M:mS{dL=Tc%iCOqy.eWHV^acCނi|T2TҰFz]\#Ce}cF;E.ѹ_CRF-0SIߍ>JWւcs,U۽DC=-0K7xJr'!˹gqm~1\oZlVq3"vovU=,΋ z_ ^,JEtWE>6J^ Pݖ2`MDUKE}tnt C`ڿQ] &h5Fik{h9fFۆ< w7'E 3mnR#n.bu]༫=/D @Wq ՜f/F6{ϱэ| 1"|Oӗ&t=8]:^Zv%VcUiF_-\4;O'gi>.el) Ze$u|y_r/ %yҼ+veow(H` Ѝ#-(twJۡ}cѱ`cctۀC IѱޝO2_ӶX_v~m|bH$/bC>gh#vYGy;z9giUM栎\Q 4"Ӎ\HɠknT0\ #un>}zr }ZGvuq-)Y\OjfrZz^A*̣>n{JR+tR @McK}VSp:JmG?b 6יB9~^qkݡɽ ~Hxo ^~'T8veKlͰa/v&G9NB ,aw𶘳{N/mqW5F(?{Jv#=S@=-D/dsXGnyϖL.+ y^ObtX>5on>-{j>a4o.Cr? wuqFeJay>eU %FA%a/m$ l2db/z?Wȟ쩉"i~zHJsp*][Oqru^BMW\C|G: 8U =L[ RiE~GG45zjƳU'}Wgւ.kp[dOaJץnݐ^%^{;3?FCefd¨)=$clGxӵhARF(~/^[NNR/ ._ sƙ^w{r?B dZžUttbɐ/vCy Yw./7k~U#/𼈷g>ns/#  +_c_Ŧ3GD9Mh='ZV<_e2|o&_ Y r!Hr >} githc+سd)ѯOl~"x+X=W/vhf/zh. &E?л7t 37+79 4UȜ)GS'JqJ4GS3/Fbt|Đ-מ~m6KR:蝐 $k{řAn#HC/!d|h:p.ԿQb^!wl˾Mb߬`/,yfдIJ1|.=BΙ޼CBG"Oz_"5Be޸.[ABH[Oq^D/-(p!ׂya kȆ_sM?eM)B/q8?͙¤b?eH%q ]=f4Bn"1yp ,yf:޴?1J̐%ìL^$5*¾O3^|.qS\ǡy;NnG;+6ZRkby %:]pPVEhE_oI:nșej9?f`ۗ :gMhՃCI:C>5/,0 T~4E6o'/'Ga9C ~;DKlUPg&'qLY|߰ i>sz<ݾC6im2pάwo_sZUBf/9nԿG$.+_,)@<A\w -*-E$,e</3BI }$7 {ZRN ҡdZ87 6t1h2P;8k7j'~¿di y9]%yDzN2OCڏr^_WoCYWg9N [L @wxDO_euj^m^+E_nWWMB5 T.Ȓq[,VtѤ?6%K~;X-oneX-VLgANl|_"Ek/>?쬿| lҜTO.?LtT -M 2.Gдs fz9==)"R ,zg~q~g(mW/zuvTo#hJ6]&f6-}-gly- rOglf /-;Nl/u"+\9l]~&h f}/؊kmke4h*r}zE|뭩`/MאbȏU]OZd@lVp7&д$E_YI)ЅI]'x6 z6 ܁=t>Ȏ?Vn~kz ~~^zAf0MkO@2Ua{ZSqm ᑮ=R5*pfEc6;.D0 FzoQQ#5Bȩ|g#C8oKԳVML<@b?Ұ/sZoF]> BQBO4z}"YFmq {ѸhҞͿrӻcǛ z){(>cRQARE5.7Qf䍊d2ݞ]Wx.T/`\JEިh}Y>{=cȳw(eO?".Z}RdwB+7Ӑ ')62s 3b Ǜj/r5Q/n=#oL^[7p }ґϷY~Y2 Lrb_'O |u\D{['z!5"g\p3bi(4}zϕ'[fwX$sM U|ӳl@YLC[^ zaXޚ?A׃4_oc!f79^;7)|IЉꂼ["a!<;5?YP^BOQ!!??/q)k 7x/ڰ}Y;&l~q*N3CƮJ/TJG謨W,dYo%F?Wu@u#лO!Ou<`|d_91t$+^ˆe_j2ѧE7=gT/mqAYs [>[g'FV7ǡpz-VA"!_%e5Ҍ\v/_6hA7H3AL↪uhjI_UkW8LoMWuC^v"R -1%yy#CF2zAV~jehZNv\elE$R^'T$O^Zvtx F=l~{ ؃$/juC^nQG^ ϺW%ɷ1b KR}+D~q<䇪/h%T1ѓ~f 4|yPdkp %5^~+мmErQ`/ͿiDnV鵭f zGYV)=k?'㜷@A+}x=Y^0.ЛzMcáMI)֙ hR<,iϩXzO}1T'RP_eҒa;- 7y{R{ el[nl\>Im/oH&vAнNL)/o =s<f㉼G՗\\\nMB<6䷎5x{5ΓV4zl'דENbV3}b^}#?R%Jߐ';`We|^#}1lb* a>.au:9,ԙyXh>=EN< MmiseN9jB;FT7Ƶz׈+n"O-2hI/)tnqJz ]`acnnu2hThނ-BE^Qm :lC.ITk3B›T ;!1j,r&, z?g"W1m\FЩcsÍ7詻9#s;{]7/`{6zLVʆ/55h OfhfpS#bT螑FˈFIYeĘ7 ]rxn$b%7+Kz'@Λ[F\7&Q;k͔] y7V+F1]GVGo yHI˿Z,?|E7rtuD[[lV6o6WIG]X2/luu VKm*oe AruH_B.;Kq9t1M:`]]]Z9.¾]o/U3\[=\)z٠'+ͧ!u1zw.v3ӆt%͹EB.=t l6]ZGZ7ʉ04ۄ~-߸fbF YWlGNGqȥ}l~I3@l3$bceLWBexja{ ޥ6)cKA_aQi  O>ʙA_Jso BǓ6W= xnL'B~ LCi]72{nnc )e%n!;= -yРj:zv/GMWIWokeyr#kVg -R|8бZ6n56PyGGg) .NCzΌxfPL&KѠ2i)ڎt:4Ec +\͓Hou]1>s+R7tL {ti RW4…^mlЇT)|z:' i-Z׃®ȸ4u׈m/=.tXL;t SyLHg:lW/rdVM\.<6"_9ShNxe1z'<#hîPOJ%GGO9P'2Z~nV4hORڡ_ m@uݑ1tiNjE"!ٔMi~:>#ݰG֖xzrc9^:|]{]ͣrZ e}44/#IVc0 ̓!8o;CԐ)Y(!;ڬ99@n5.=@"zM_i 8=Aʽ:It(nhݙmGW!Wc:.nV7BRk/H2~@14In䗌Zeh=k>)C_dP-Wl~m-=to@oto7zg"EKJ[ M]kې[$ENC|Yqm G>k/r[Z\^l{=s_[]_yiւRɺ 7s/ Iq}%☨ul}iuC>R XwuVȟi-c:]*"dĜn-լKh.F]l >ڱόA.t}mCNKٻA.kN՟u%||H]WEJ_K_9 (3 dcY㍼SVk^ܛ=(EU>FpM5cz-C:rxy[7^6m~eB]=¨u!`l#'$t3czPvYoi16ZDF+5JYUEf!oKD :A#)m~4W@>r.%ƺC%Sr/p祌{=4`J_.b,vХo4]myސ·kv9R;Le;d ,JCz1 cX89"E]Xѥf6Ńz:'<74ЩdmmyX)x^c^}‘w7g +U١gkKy,t݁ktZ1[4g.9[/f~bZ$"7K¾ bns-I7h"{C<-5y?D3C7vUwwvQh:[(7r[@Y V 2g1 ً"Hz۠\Z<ƌyQGTdk ՠm1BF%ɁNAq!g/=i nƀt8W.rCuCjr3>eFv3%QKy͐o[ҳQIݍܰb?}@+a[,wͷho!Q`h6BXg@Ħ¶ˈ:LsKE(Ug~)4TbZg )4>S!:iI{$/bT, ~!Fް鍜C&_uOOi AmG~u =,FlU#ڍ~-D\"f'! σ Ñy RT3 z O/wrZ镰Eeރs^kFgTH4.rm;>+(HɐEKwEOGoȎ.#ϝ\ zʢzq,} Ltt!au[;tgtH]A@|HXڲk4m*BːJ y=z;m\TЀ.Z]**\>Г]Y"カ_Coo0 /60 %=0r$:b* |:}cZSa݅|/2Zo9ʺd:D!XGk y &EW89H~Ȇ<|bWsݱտU 9ʢcDвu_:d`ƻǸ_紆ݒM΂]Q@V+^¬U͙yֽQ+ten-n. {NёUezB7r .ai%>[YL`:C#_G7Nr&i@~5wkk`'}ֲ{7eQV<ݽk <{'Gk0}#1 ǵ9-`$[ukP6=4ߵkt!7WQ}a7tDۨ h?'N*4Ƒ4zFsB`Xg6WX}(Hȝ13=h.>b.eI)S"c,ԩD;P8Ji]`\88k l& ־[=_Rg+mǮuFFJD:i ôCoQsa"wjoΡ<tJTD9^n@6hR*yCH՝hv5h9R0\&vrXg!rkhuZAۿҾz@ob.^ƛ?ai>' $^z6=b`OCo-2{o&n-t1 7i7*!LmCΫȭ#165REnkYV跈4ekڃ([^vc7zґ'|zA'ek0:TGNO<'} ]E=M #:F< } &_C+G3h7ێfReHtՕ=8>xA (.z :Ąznae^h5tA)7o4+ 9h%Q}q$ cOH)G7v5@kbp y4L"kuZCN,2nHiWubLj sƎyGmXM llg56.AE5zię.rZӣ%zHS٠K 3T;b++aTu{Ao3LW>";Hj"N{ O#\5醜8 vgCӈrqa AIuQT## :ES4 ݵpm>2ч vo$&a/cgˎuqY [$2oY~ GJNC_ |&wo52>NF[\aǡ+,`B|u>饏ym4P',B"*Jm7zcY aK(*iæ8_o4`b,`)6U5 jEX7r+kmQCg Z7t^;}@K$ \Epm>Հ+iQOWWF΁HF6Ik}hcNyYVG.A2^[$F>_H;dGnKgz~,͉۪HŮO4 a}<ކDW caOB?הbK%s-6hmC~/jGnR; J ͘xBPYL5\:a\mY&B?GIqoq7|GF}KdrKc7/deǍZk$BҘRjGNnא1tƎ\Cmސ*y)2^\ y.K ڗimƮ/Lw~/{ \ݱ ."δ,;/faۢh M[;F^D]HR2`^+tLi^tm[Rr#8% ;htͲCddClk4o5& ȼ/ʻ} 43fdWY9vK5VwesТ0}J{ z[ VS#;tNl)AcS.Q6B:ץz̆x%Aϔ{ނ-D˯7v*cfҾ}DT~\O)ت-ټ-._຋ؐxԐËfșx37Zuݍr9wGOH 4G3Qv7t[$ͭAKLGN}?Ҟi-=y z&x7,>"I;:2u=Г^ wQ0:hE*GU!']V~J]NQ*F LBA'ZCF.AF\w䜝 =OYD;Ƶ@9򻪲AkϨ5|g;*rHXtG yɸ& ?ǣ>['tgo\sc!;+tիm!i};Zm5.ttN]S#ծ}v.S#/.CsföKQ-j,b%лP~E}2cy:3<r(( :ajnج@t>3VN=%Ȼn9];y˥K|.0ȣ|tmWEF+iq *#Ȍ?TB2n gFnLjjз#B.% 1-莼/o#m-t'}KNu;3rㅄtN^]e>zatuY<۠s^NzŌwnjҰjVtvMдrVpB9u4rߨjD}y>Miܭ4A yk_Үĭ®"g3ٱujܱ zoalj;/J^z><]@}طFLc{yoao Zľ9|XF);_PS@Mm$f*i6_zX.^]:e{|I7763GFּNdNZŹ}*3:gc^nt%hQ!o!\LJ-m>f`(:9E;fz -.S2 z0"¨E6|G,Fo3ʻ~-oh_t$ș%;p}m4w5(NvNc萮9_VL"(;fA  _F.A |:] Mk]-fԇ؋ZRGj3C@\ ҲUw#ޠ.K l.ʷޣpZ@h;xp-#'E3yt׌ӕ_#ca\ x0V5R9{oAgKF^Cj/moF/AjccT24^j]-^4R7侽pG͠H+ 9NJT9rv(|%:}aND7Ћ Hر;yP+sDB1=+҇/ڱ#g5onzcֲD"?S\3;ܐ_\NzogxD 1"jiq`=buĦ Cgݡ_@F.U0Fީ׼!9P/ДF96bIj$fɗz#􊼖޳x#|%wkCyvwh@˦y_z庮ocfЬ6^o.^t7򋌑 W:omQ1A/_XZ5Iv"Jso%ͽ6wK6E)Ð;(%&v!ƾ4CkR1ٱi+Uޏ]Fa-ok EX+4بIșIsn19Uu4ly+{FGMt3zN/ESLdۡCHW`r./vH CLI~C\ z詟jp L u;Zv輘'8Ƙ.`9hCD[?r#pFv&m[;1͘ID+4{O#C_|ꝗBKKs9gbjث:E ƫRBޕZBGiŸꋵ0V-Х"&]}$Б(onLhQZ竹 V 94 6w/Tou)ecQhjFZ+7t;jgT?oFD~ ئInuۑ CRT^4W,VE gǹbCXp!8>E;ef9Ʒ t/UoCgg~ͫ:H6'ˡMR y8&fOx\GӐ/3C3w~Cڔ& dþuv.v*ز9jb%!ޖBѐtEȡzC+I規pYB /x>~OQE?Vю}leIxKn͐LRç>9I0|_:^'1";6hFosfhSp?#Sh!$hWx`_R*!3ig6{Tz^ͥ e1+5xk d{>5,Xyy/zX;JQ=ߦ .,{!/薱z\+[n>qN^ D~3BIޙcI!/}DмV~8N҈Lc\ɂpwOeII~#CKE4_u]fZ)*йema\# B4{3[\S&~~Vrz;r~A?3^Y c\,Byꂋ.C@\$ҿu5q81Qѳ|y֠,7;g5+KKx w3ϗֿ5z'xLy7ll$EYn2] UB.IZZ+?OÞ%4e-׎`._0_4JF+H.v/RqwdPg$3ϋKGVAx5>g: `C3eV$$r]O^ 0Xe{[/#?9ؼm{g-k$>"̋|k|s w:t-R'v2Ufq_~N'驐|g5;S㎝$RWpUl$RNWh޿y]\Sn? [3య[⾲MQUn0kդMFȴ& >O2 }mӝ9s;ۚ _@_Ð^g¾kx3*:DrDry!>/&Q&Hʹ+'=d3#W&wETίpέ1 #}"䯖t/zZW=n ^LPK.>b痆 X4<(ijȍqȲO {& ܱө鋞Jz\2}{ :Xt &R|4ɷ {z0ЄyH |N}RTS=7Ssʇ\w ْ)AxU'oֲZkXe/YpM<|_A,SJئq䡾ُOxT@OzHVl t)NY }?4g+-7)_:zA橬_cQBV/\d)l@ϱ9W6;9~7DIMAJYΦ9*|)ľ䲄YIKQqYGw6O/쩘=/~=?Y` yD~Y}>ռy'>+ֿ!%X=1P=,u:t5o~v~F_zkyB(xlo3b6cx]FTm6}Z$?>/*37>3{W#rRCvB3ϡ9KZWpѯ}'O_ՠ2pƖ?U @ɛ|q 4 Zk11KtZKZ"(£?jŜu|$9j快 k}Z ,B׈8ڠ8鋾oN]oϢQYn`.Ϛ z}) CI_):A.< :kǎڠiY6\u>ߨ5'ͫ_u }g|ʝžA?P=}F[.% lȭfO5'H;?9n`԰gfAutbEV6-%3dGiOL'\Eq ]xšFo#jl'>GxgڠST)ˇkq.x2, c֜+@笲dΕcb;X`/Vςb&bouIkKO&˂n%!C+_XCF6ո!q<:478F}|G%{vw". s#mNꜵ#6vc.3ȱuޠp+n;i0mVS7VgujBCnlȯ%f! xJOސLzX4+ ]G MU7첔{c\⍼w6QcX![Ƈ />NwsTgt_ϼqƉw3@c}(xK lBAܥ\g66-^ΟBe鼑'D.i@HlPri{#T oCރOMN\wgy}iF]uWwGZBޖwtN hiI$q#if4]0zjL3Cobר7E&5Ϥ+ٿ79ݾd }E'Ud4s:iU1IinѓVz@oAUKy  YgXK=֍bgIt#+-.;{#׈Z͡er# /mbƎ݋ĕlzTO)t]62z )~#'.&gtCE>@_8wo56_nj^ʘ AsVAumi3_طKҼi` 6@طGCuAw@5ҙ4(?߽:nȹ#jl׸aȠWm/mrG ^/M]cb2D @_A벵4ld 02ŋ̳rK")unA'Yru#{ybk UxHOEkK>eE zr7\zҍKVG"3~}k,Z/vI4hN4Sl.*s 8s"@KrCO_F=Y-lh܋t1Lb5T{>%yuA"q6zyuv4q X9)W:Q_s'GtywKAn#Sh?~}- \E>unv@Jm^g9z"-ElB?֒CO/-|Sx^\HS8}ޏ.Q yƻ-,d$B@Qw*=v/ѺBk븮=N;\˨C^88H8a4\F#7~sd9ZU3V+Z#* hvQH'rS뜜Ԁ;/νk5ED6>Rr|N}&]7y`Odbl]T蒮v OQW^lsl/ή h⮂au9tےwIB'nž\kZ:EY@U3uv G3\tUH3}5nhr"׵ݭ"O9[Fr[{ֲ[ILjW7䌸C_+]!-0pop^h@*R(Z#1-6;XZ'`NIj-/`5v縊 TN(x7&Kt 4ԠGrKt}b~Eg2"h<ݑCNTC!]}EbYr4e޿Ǟۉ݂γ~X>ǾFU ɑW;d^IـcY$ʫY`QR{ z ʌ; : t'n׈n(#r,hrKl%䁮p4$-]k++\,[CځVcڈ ]s まӊ@ZDm(r)ek9:Ү[JKRo~"PכϜ('|JF S)bH9:>mr<tkw$ȁ.|F.`lJ\gGîRuMЛao3fAΡ \V)ǵҁP=5lZ)q\2!u+[wdY@;j^'roGzݻ(#_-9Gx7j{:1(v%EEWqQf\WD 2rKg^:􄔸|ͩc;4R.;V֛y1N/,^17Q@ \}[Eڱ`=p}wUjQcB1NvZDN%;na>N {qTʁ}3K Y $uW] GƺDX[7;Go\2_OIC/52pQU<;2oV-z}>uJw~ gFm퀞RoroZSz_;Нw'_[ح<0r(ES gB@BgI -$Iy;ts7򨦒dyEG%4vҶX%)v@k??]I/QFWK@BWk"E5mkz Лy(=KҤ;Q4kɴ] 6jq.q ]ڰJZ%RP{gčyނl<7zs82ktHY>Nc/n]v@A]?B/'gaRPvM3G\T ^=v% Ê]}:rlKK[ ^ഺ3\20lw~Oha4h7HW/w[D2r,jv g)lv"g@Py6B'4hrT>ҕǩQZy[cGv|\;o9 zFåQ^/xӹnb$pݴi$}873hz"̽ mH;=|VJн:ŭt~};C9qԐɲY!C,6miMSm#ONCO:BI+`o/ #4K:HS:EB~2ƪ-<)  t˨-&ԡK1eo+[uuߊ՟QFQDyRG|#,KGe1yHg֎U#8u{o9q9/*1P y 1]$|r6tnYN= ^.t˒{NY[zHi 4< $Aޗ [$xAwҽgcFsȭ)K:ip'ziw C}s/Oux˰ecqVrT<_*&ȴL{1eѐ D_`-%Â9؎.6ͦ_>;7.c%RsTh?oUpb{/n%L#3';Z^ms y_1-|zVqaj'n427`'McM_} ;KmmY"pQ~9̈aLCFb [_Ph9W3->eX%RfߘBE DOIs& : r'zjͼ~^Wov#җ~pZpHEI??f Ұq㲐w"#_qS֭Qq3sr)<G}贵 z%|ى3_-aE4.JT?Tv_7Fs6?kͲ@ke̿8KK# w,\yi[{q}ЏenQf^-GI\{d&dϨ0mY oGZt%#k}Y6螱"B@}SжL*t!+K\5mhyd.:/}=jJ]3|w`'usCz9B?h*{ "!hXF t5e1Tw(rEi>՘ ;g^g_/Q>/x]-AV $]!6ZEor1{ "ͦ"eOCDTK=OT}=Z6i|# ^^gu4L폳/4|}K4ui'?SMmq'ιmZWz{ Ggqz:Tf{5{$%gzIy õ ~D >CMI5ޠ'éx yu92gw?q!,;"|Ib{.x˽bsՀ,7h_w:9#Y{ ?a^{py@N'ማdKl+KHrjsY#%!@ |]lc2͞?Փ2gK^B,|=9-b܇Yuc{H)̀V%no|!_7[bA6KRw8}7ɖC o~3,O6ӛv*@if4JVRb:B6bd> Cor~ii' \"q[.xfS_˄UZ%Iv Ka(8WN#E.#pi>d |AZ.޷^bv"uwMO@ȷL~'R OO h3r7/z݁'ۼNbE>8 Y,P/*C~#1ԒE^OqaȒT{ w\@^2#T}=@:8 hxL^/sޡ%?/vwtfvQ2t~D>oÒ,)a̟0!Mi۟<{ɫБ.~Bו&Yhjk"= ;aԼ/pAvy$84 ygԝ9ɜC^^`nЕw+͋ z )l)GzorQwCqRHt/gnuJRՈP!cs[鍻E0M<6{Uwi^;P`FKEꠕޕ\? zݳ 8]Бw^xuP ghgQ o+o ۩tFag3סU%r*Dz ] hm> VЀX }k1{5GuYK Zyǁ\TnrANh}NLоZ:@na2?֐H.KTKCt[LkGCl XfH5X+3flЊ׋Co5Ht@𣏕'\@zƋSB\BGy^:RŘM9tn5$F?)FEe>J @N>R7h+R>?hˬϱp};q w -Xch*d߀ ݠ=yJ=#L֋'ׂ|끜c]Ea&Y}@]z}iv ^"wkPF[rQj2?μg~ Fg'. htO:C!+Ҟע=K3ݻ<7ҦrMf]ohtq{Oˑ)]kL299zX!/48?~YtAu߁\c^3uc,qf]]Ja̪.a+ΗFKNōu9.Z >N C~B!_쩒0@=s0Ž,Ca*gQj ձ1[y 6s-xt]뗷) n6d= +̓UV|E8ZkYgafȟi\F*HVhZyv4Ewk?ݭg@ M K*Aߋ 72셶xz٬{EW:]bH`1,0FE˵#3Kt>rv E9fnvB',`u^7y`ӤSu6|{{Cf]Ty99^zvv[ cCG˃\BfaGm#v@_?BE6!KI@ 4l];DҎqQ][Gn)}ȉ[0 +v%QWC^iKK$/3B?n-ĨV?^cPꎎxHe<=ɌY-2=4@P/'vY" )E繏3a5'9][SF-qT'+KvtͯNm)79u [Y tDĞj{3pSJ .ԫ֨?Z]3?&3GJN=ygg;`@`ԮpR*w&$'x԰w0 x kT;Z>bv= m{AF!aAU^蝵9cL9vB!WCSs٣K#/Pk <[׺҉|D^BnfXfM (jbO:q`L;IV}Cq 2rnzZzrb ٰ, UV[jB%3y6ͩVOrow9.9*k9ut5*CNco+b02t.Ti}ˣ |ۭIƨn |N՚#]J=t ,o߰G.wWJ?OvZ|lנ:%H5\ KG.9 -n~#knk#Ce _.u-&}ہ{!E4*wꁜWU 9Jt7?pޱcJ  H3C|ى8i 9ualEr}TpEb6hTe@5}okR=7>F\赭X^[,gEvI Ul ;zA\:]bq,ȀtFp5z[\0= `_]:ǨP}B= Va*":CG:i=/Jڵ.!m1RNƺ iz `zyD9\ۑ@aT۶L7Ҡm8Aα~9SF@UAFȷYCF>_H+oyK57r]^5ǨȉG;וCT>E¯y\#eZ<䁜:Џk`2RzssI6=;at&<.fȩjVeш`15ۼT`ƒc/ǂ<=x:Vz!gWe4:O 2r_LPTbf^c917RA;^ZHwyJk h a.ƞPr_nMY]TZIEƘ.ȗyt&`7d;Xe;VkC{1CAxͦ.% chL(Ҩo԰;Zw#_ߊ-vAg^E}7r]>2-pٔWcE^LkT?uIwmvC'{f:fir45lvзB zܑrg^䞑Q7/'Wd9^lZwb1 wu4ϩ,Q_^OTB]G\aɉ}D0dgʥX?8e-2N>\Y#`z_vD?SC. ]A>y̱:  _8j5:'Do) 8K @Y={t=Qr^,ohivW:C'"=kb+u7F`΀ 3)zu&T]z?t yO)%uM7nMvMj@_:I_v:};3v@81i#z!h,zB>lZY=%<MKwbL }oe6p@9o 2ur܈YLQw4~v `; D9xE #]"[ߞV4yn ܢ<{GXt*@Kޮb>;s^QO,Zh1ϱ0h-K`o@i'ڱEGSk#RBˁ 4z (>[T ]ך#o넥Cg{j lݮVp28Xteʹ[t){=hHsBOm4h5|E|o끼FI24ERD(`7kM"e[?Sd,Ѿtڶ 7n[.'vBǍzCsN |&26F&ЖK_,Y:a vɺ^6Meh7BQf=ZåmEg@WV]nF/ q7#׹oLC57hq}0fF:o3lVzёK#[h/JNn儮Z h)+t)9?nq.int wr'E.|@#FU薴q |j}Pm%}_輶ѥB;vԅ[o>ѧ.zobe/kը':2Zw߼ąޤ۪GUyn@sudDh]i4ߥ >"e_hwACF/9]$9.iwDVwhI<ǓrDS|CuMBM:z jSʈ:Jڐo'uD/"KLF֤ǀ^ M{YC--ANiq\k37=kGm.Ycv]ـ-ȷbGzG >/>"edh͗H*Wkgޗ%;K7Z,ANF|]`P?nǞ4}|b5jm GĶƖ. f`jurtj:`| }/hӀ+^1Z/ky9{5v\g>f]BrZ卲YDU9*2%;VU/ܩ>eG)aߋ|"h2wTgu^j$]y.qޔq"!4!WEhCgl~ޗS`U׸?zd {Z꾱mhqޢWw7;I2zM -Т#CZ!,OX]63ehFEjM0|z/[^cCZ{Erbt6]<%i2BoNu`@+l+ #Ҁ&. @I<-o4He<=\i|sT~^&Nzݢ jlЏSo9/`謱:lCzLjA.2N#zdQWK ca~L^$}z4ȱGٚ~ͳGμj=^*t?S)$߿G`A?dA ioЯi=z0t7J>)<j\RJtUv:v\ֲ#a/Nc: ['Z_0]Ҙm$x ]jzc2=@>F?׋#Rilu;|oP^q;4kSCFN|@v<=/\9} C|+1VHϩԍy379}LH؟iOL {f{cj|; 5/3rˮ'WANY%A[-z_fIy)X {k-{͗4VCj^e)'@n>|azA|&9hk BY^܂Ѡ>x Km7z0֬I 4^U+swQ%0 nz%6ԕP Jk -eYe}%%j R,ujkwkKY&זza}$ ^^%tAn\o[@:$e>[ WW=Kn52vsT{C9=ue]TT}=el'$=g(>@!S:X|c}"7W{od~bW;e +;y m~4hy{E"jDy76nۙ)r7 CN;ˁ|~"T z}@l:oA[i9%*V, H'[ ּ` 풁 oW 6`o $;SNgMmЊbʀègNW nJh5FAg'r /Y={䌑C ty)Fmw0Ok$jN0F%Do)v 'Yz (RFe~d\grJν26ϡ(GJ<zc[?S3kSJu/MtK*^@e Ҡ02=*$vQ}k#|Fk"3 dȨ@w(0x1ni{k ӺK y[c;k?K(2rJnڃܮL>}|Ei}<;Š;Z\H7H;ULQm%<뵟S ziȽ: ]Ja؀ |jiר0=uQ_6|{e3E}IE}[{h@#T _.^֎,IWbZՄ]]!+^|k06d_*c\8R^2d$خ*%\*}ˬ&6c7 6H8j'-a ; 7\zJ39t؋^"*eLG;ʤneQ9U&UplRmɍtX-vQ0k13϶z]3ZFB' )3j)=WSRb*80Q Z ˽ȉB.UFκH=ezL] e@or0Ȇ@􌗭::t `nm<~qQ=Ej|HBK<}(űA} g :vpsuIЖ$t ,`gk-9y|: sO p;ET-|5&qQMˀz5l=sWV͎^%`z-֡gA} W єtҸ# b فU.39|[.uV*&0ᒋ:reG=0R2.-+$`l4S=OݢЮ[' c)Irf>q7L'`dފg:\`WxeKQL/>,GK5 GGՠ(}ɂt2pR_ GАM*CJ[죸)top&} 3EoU.AΌ[_5 /a*_G/ yeC#(~¦bD]A䓐zT>vYtdA J9K%Oۚ tԛ~$ߓ2rMe6qs8Q_G/ +G'u^UUz6n9!=Q-_ˀQ7۠'s. h}"}+5 _goqۻn!G|kψ :T7N5FXqZl^w xP\JB;̸\]Yn ~k3CO[^7/uٱg(kiF=t=8zSBbzFNl [~d晴?g U) Ly,WOb3Oh ~-ڷ [o*lA?35@.H#BkL{%z&5 Lj*MWQq̷V<>=V) HmXavB[ (ZA-o~VUܒ!ヾnJ6A^n#T®] ^\.-.;.#@K [_,hД˚<&m}'9݇<|e煾AC3[l1V8P\ekBl#<}6.YmLDNZugbd%C%~8vI^A_v@ȐZ>Ij>?o,k\HԪgOh 9[VNEKi\%dQoWS{:@W',O:ڨ2+?M9 2*ҿ_-8zCS '&%B6ؤ3}$ɗzJ/{N["0y諧f1~ZZ.h87nRbݖwA\ _CK=a3XΕ]J6_5f̴杨Ek&QFr6T?<Ɏ( ;5.|e zsvwBitz7Oi@^ }Dʽ[k˪4?'-fU[TT|m]uޙYaR&EϘ~7J8x5 ]t86J <)/5AW:b/[UhW>>%h!3] 8pJEj-$hUwcl|oЎ=Ǜ/x:.x?VZ\+v9/Ty#K$~)`+b)R^|s|J7/M.]ク/r~KӀ^[ ItoJ::3`kܔ%s[7C~1^|lT/U.x4Gw%)r=}vƟ?RJD=NPʻ <_4$ MR,{ [sMUd}xMAOȽ7}u!/Fr'LR)`B}tSqӫ]$s+qE]^ZGx~KA qK`/?seң@N[ξkF'rxv:55q E4lkv <(rj9]9fwbl! [O2ZE߮^; _{WBםbYh?3]r-;S_רjbO%cS^Df]"3V3&Eعޑߌ$}~%K%='y_] һ} ]%BORJ4+KvwE#Q/K;B-۷tAuxT<ьWD~@{4r o-?.ŞL ouT[C~- ĝ~}fw!\m)pNӫ~@E/G#_mC7’,1bD͐2捼Ʀ ynDC ]$W9E^fx~Ѿ(]\y2 ʱ軎/*:st[2E]̩d!}[':b]|^GV _4"#.pzAiټ(Qս rt4;m|EqVt@4{Q 7`:{)^Vqm7veBK@>A# h䤟Cw{с=HZ:{CoFςW^ lt(K,\ɤ{y E7藬<] Ck7pX٭5h է ]ON.\ nHw C/v"Pr4tψ-arK<$_>q gKRw' [N}ΰi2xs|3OWAہ܂62sEfO4vUִk~Ae5{ }qE`ȷ=9i2sz$c>9sҐQWTt^17끞 . ر']\àwuX3oQ\xߑ3ܝl2qQQVzIcj'5_ԫE>t94%zzϺ?R*\|Em No}9*kyGrsy׍MKIi}u8Rb2zB-oN 0Hylb̙PwRz'YQW[75CKHRY| =y꒎yq^$ȔQ3\4n:[d<̨-.|z@WzI:Zq4]T/ ]"JFܷW&l=uIB5ϛ>b" 3^hUϔoڐG.j7 zMjJ:V텥!=Ί:2G~Bk[ZE>^-4[v ]NK8/q`ZGFYt ɺA_#w܅~He%Ck_,ݔVjmްZ=b^A\)cQXtOINGky~j2~c%W/"drbH%p#OBwFz$_u@7 jYC:cC//5i|7Z?Pb"l;5O/ƙ&6yZSU>Eů /5y+vhyG G oCPzXOcmHyLfbG[QiiS]\hҼ۲.N L\7\[%W{3[*\>s2x!՜'NНּbP|KuA3)2z 0>9IW9_GoЖ]z-"5;oO,yG,c]%sA-r뻿熑.q 8ˢ|@oa4 L#E7oEG6y\AB6jދnj'r[ ]u/>tT5hr KJO+ΨВ4DNdhpAv trutgEB+۠>J<ݠhU>o+{ z J9s_Z0]^sE^:rH]:zCo-16tunn?.q ߍ Ѝ -'rUDS6]F>ZKtO|sET"Ŝ+FBgYXs[zF(6TNsy؁xɢU ˖˃>a1zKJ*Uh_eџxѫW 9^>ŮG^XKօNB_|PWEQh/=ft{h^1y}-.{{6\6,l+vDWIFGk}n#ety'N~8=t_зo?$b;Ԣ*moGZtSTD>и".F"zIp-9ENZv-OsUG|OH-Q>bq։$=m+7r*F4YhEZvm}n-I>zC,ퟍ|{Trw.!-Z.|〞:trՂ͢\EURp#-V% >79u8^8TbL7?V'z.ܫ=k=h.Ǿ#~g};AmCW$4;OݖEؤ^̢ngwBZ}5z/zv"WsA*:CM= (Ret7VM%͎"vFKzr wH7vɶs\Mbz.( r)<֠¶鲖. :5l=zZ4?9?He=#/ƻQLִmMPDsj'.vtF5%aCLu{#9uVd |qf%ft1AOajG4꣪ӣ3=7YvSO;r3RA>ќO7hH=\۠x+RF\CȻ((u̻0{P [oT"s"7VL3qXni<{bK oe9ѕ\VZ;$`he\e|Gem crBJH[^/r "t"?fHpw\3sz18]F~;FncZ=.}#< ٝA}@{va4bEVh(hN$Udv@䅱E;V@߻=^%ƙ#cB ;xcIՇV~p)&;2s+a^Ȥ=\k1 N'riaмH>]-;1;&G2xEba|ނ3 Ӝ3?X4)= q@OYCrQr]޸nbD:НdF;UoEQWl{=1QB'-穗ӠS[>GVdwS|.qC]B>2Hg0ovK~!d. $3'"|5tbAƼfZ^dwrQMJ#;xqz8A.}QV|Aӷ,v=jO|p㑓= 9zoW*乻K27X8F:2EK ,̛2gBoK8Zݑ/nQD]F>` uyt|o+m`R`)#q);|٩VLuӚLY$GZӇNq-t'D9q_pk&t.LMHΙ {՘aXӢL:6 f|@k~ݙ 4u~9%޻IpҾ <^= j"G(ԫH3LZ쭍k:4,sEEӗ`@;IRzi4v̠V|!wK f"],Gѿȳ pa?0.q77nG{oaZ;ģ؆e. G[GAN_bxc@]k]гsz*cޜmvZS&ނ0 .,s*[ub)iwsS{r*1_+}h͏B n:ak%[#_ZO.G:5}ՙ&| w?}m-wmf_ϩl@#{_$g]Ww}Dc=mX,@nq}]T#IOͭ7],ﲗ%uDtqFA;Wm*g,n-Obw^Hu.6wFҥs;@>CɰK Ey|OW,c> #2a[VFztԅ.+8yTFA*3a:}/^#͗d4vhR| 0qn* -3gţq!nhĕ=/ƋcxG]vGyZ%5/ WA.aA!j3a<̺[5|^/JqpT9 t_F M_C?$Ir}!nZMʋsG&z.(5-q%V_]'{re4dEl\!YqE$Zupi.ҐFISi 힇ZϑA zĺq4 _1z޲1JԂG6_ԠA}+7{Ja1r 9u!y:W&TD),erjܐlB1f5ڂ־۲U. 诳yjֿ@Ka;+AM8uY/uaFnA}R/U |u^B"[zyw$w]mfVHxʽ7>Z,_>N{z n&m&}|/K*0SUN'K&}Sɰs%m\cSKWSƠ31fa_k4&Ʈf_WIZ„ZdGҡͤ Y"N4ux5 !λ )D0f#n-ZϸY =jexyXEnf@ w@/tMt;L b/zWg=GOJ.D >)?ΞLtf#hYܗU 29g.H-S|_ r\+?†weYP▁~P<8:38$ .R( -&.GQ"-͒r*4q{1ߩqʊw_ƽqZ_-CݚZ$k93}яf"\?^;PYP\v*yG 1C#π Я)Ϩb _W(w-CeI􎽘^B/1wklh:zx>Uȵ8Ѯ9_w?Ӡk@ =e|'^l&зH~`cH8#K\7=vz]T*9g{񏠗yKz;dTT9oV1~b3/IFNqlq.q -[+{}iͻ9װeVO#GO(iN..UQ_0Š ~~y7l9! i#7A$LI%22"9.5Wa|Y%)=k5V9pK*_yف'?s\5h b苂Rٜ//YI[ )ߌ{w3L``xs}d!߃EFlu bo9=?^צao*[ |199@S㦧&7C /ΡU{~|)ŝC3y6.x-KͩtRJjz-I{*lsBB/ˍ`q\jhH-xO q䬷Q)Dj[HA_{`m&DrgCeCB+,j>T!㴕[U$t70#`kT|Jqc%i\WO+wUXBWc4F;U {n۴b7~a1 E2ޅ}S.<~^7R®x kзj:ُб=ؿv7g愍sDB_h:q"K~t_]X 7r |_V A+/Q\ee?x@WI/)IG3lErA٘/nR#4oRi;YK5y;t;~ޒr&s [M9C|UEuhW"m1=WåBߌζy#fh h)#Sp#桟bIy=t.tE-#Me0q3\Uʆ< rCk7MFnaJGg><>^2h_0^wfT>Czx{NNۡgM= ;CNUZ~`T%Vl1$ɗ>y;7+}dzGeJc.=,eeWyP2dǮ!z!fT5Th$}](mȣLZtu7c,LwڱwlUڠˋtrþOUE*S?>VTlZqQͬA2ې[TQwzof l~uw'~Vʕ3&9cۏe3^` d9 #,FCiVvZ#eK} zTvmtuSBKN\傾Dd]ib+87467䌑L-W&'2tKt^ [ ޒ@WG W;$ӧ\zU]tDq "RqCe4oLdS5:GXjn`/io+^(:j8OBM+1/G1hNW~1ӝ"e<\ro)`\ 9\ ը4lk(1eD-WЗB oD:sD5:Cٯ9zyaomNI!,9E~[h 6rիu } yEf>; 9i$ufSd!O3^Fp닀_mH0+9/}s{1޾HqShw{IbT>ogu y :v)-陪 3Un{gWQ5hjd=qq1@y-5O֑3?k7ޠנ0,\73ҟ5}KTMFGOQEnI.=%m8 yrmDFv,_\#WYw#(0kN"s9{u3O #_...F5)!#gK/®i>pk'nТwuYvh3e#荜e[~L<= p %鋍!Ŵ!WҫQwMj4\ir.}G !](ܖyw[tQ^mxɺ4Fۆ|52,ybB"GAnȯm@V$Rݠ[O)9E"=u):GiR6b_6l K>[苑xIL!H='Rmk]ZۘJ.l݂}/~T浃\[ϳ;Cn{ 5sNduc<];TC 4ˈ4DW b" !i<|3Jvs]ŐGFђ(= [Ǡe9z#5QӡSEKtLc6-"tRV#ImAbL-ȳP]""}et-5-ms\.h㶶^Vhg!!OɎ04gqy)hT˒hvy+m#"A֞\:/ˊ DnrMx֑C\o}D7] ]JvG$͕q/S7UG"ilpC 0ѵ%[zXMkA֢ȮͼD$-L{zA_.EN@7t-2Asë{&z 1ȯy|eIBoBT%YMͥ cϜm[ wu@E.Hxvvi`If<==ƨy:Q2ioktv!žLOҰT_#]3h۠_C';}Fc;:eR _g0bwn nw9Wv9RrK;w9D #?F"mC*Cu~yGVrGKR܊"#\7uYa 3<>qޢ9*ۀ^Lct:j<#/9s[뀡 > X#`Ω)nk z q9:cd#~zHT/0侮nCwGkL\W*7FX4r-Lq 7r:Jķq/S ܖN4oZ1 K1Z=kQD7.ݗvqJ A7|7/ѐmmC:ŵ kkj^Ң v8TblYy/^/gľ>. c2Zwˎ<;/t̴^ X {ؐS t5 ?^SupQD:(+׭U=#osp#jC_v/yu̺$z]ڥYq;/klqR٠2ez:J̍Ů3}v˶C` /܍HsT|G*6 t;FvwE>~Wh*`6;.quoMy3n.9C##/Ȁ粟.zVTSrz2TpT߀j^<ꤿ[&.Z@w 0j0r 7r躘1A]TSy@d/=Gu7 QےEc;[Cdh9FۡC;#ƌ=;u"WLr^(+qULdžә`x9q Anmr y2 ; pRqS"CY.9+GSC~. نRT:me~1Jh=%0yqQot:_GU7c3q!z_'e?"E Mu^ ]&Ǩyn\+:3u`T,* u-h7t!#(;J b_0"sCdh]^s y;zxՔ֐g^3MX]^ѩ{=y_ޅrHZv藆o ]h*t]FbOI5iO=57m>tـ85GE#)cRrCe$xi@XfOI5|zLwJFmTfrVu =xm|#' [.087vuk@QhiҖF]n1^!WwAO7#Kd0ІM$-h?.ti;[c@ `V }@ȤQ.@z&J&N%>S6Ʈ82't[i6Fr7er,GeXԩ{*EzO č̓=2^^Ĭ>ȳK݁{dY v1QT{/;Z%lpE8^66ƀ^]c7KxZRFdp%;rCG?Nف#=:|8GHqjb4$6`KbZHkw: 利= 7r "o#¥[5=2rcZS8FccZЁ^>rC.3С#-[zne7=]>%&9kDaFU7uڱg>:h`sIΕ zu ;"z;vYhGF Hnŀd-b@FәmC~/z(WZ Ah$K^/SluD}Ds]J;t/+pSST7F. j}(нٽcg >Ҵ9j$2Kr.#=`(vۼaTF]/8yH Kߡu4躔JwIM HA,Bgcrٰ_MLsIT/AGvBZǂ&klerՁ$ul@ y6t]7M^ϼGm7ꋷ*ȝ8rFcM5*ފYij l6tI=b-Y#ݛuAS`G.d=Ϟ \l½sFVΗ1/SԑeI^z޾%i|azAo]> a%WUDq8 laϺf;` >[!>Qs\Wp.v,gC֜7NKGs[GOd?˒mz@5$>Y8J\❭fE@[&_Mn3?,Oeܣ'O>[,<,Rk_GY 6w(s'"i=y9 ) y uiLЧ/03USz?\ LA9z ֆฮ=u谗mi(g-pG?kd伾_qٱN>7v[fMjsN-O`j> F"ER57ORN۱ے_:q/,]怇W}_Z G2>)Ru#싞CȭOiHGZ=o(؄9%M'/гp?DK,v6+kР{>4;Nh!^=:L'ߑӃ-fj>2)ȼzGZkc%w.77}/x6qq^򏸹L{ ]vYAgl['y$wzK } ּi8^g )B/,;KZh|!h<-bMo}fZ Apk{z47^kW MeN Fa2Xpj?>YU{H&T$7v9;n|4 u9Zy/AUN~K>1/ R> MuI&h"ٺ[;yKqxG}clAb|WV >|J~j\v3S~hr^6}_Fhk7# {Nآj'^.C6zϢs2Ow_CSJ􋽇δ~ Ogs+` 3[qh Χ`q+]s9߆ 3kZv}-W;ڀ\Z:B+9J]T>6!5uqE7vЎlJM% gd₷,jo*G2_엯+F҇(%Svp ~_ ㊭7GzgAo*ʏTϬCkD2/x۲åq^G\=jϱ@3;$qҙ+ܧ*rīKs,Åǡ|/΅y )z `Z}.{ZZnQ0+!z.n L]׮Q+*ól>=t@_|x.sWaۀ 5Jr9^7הU Zlj Z8" kX˰A$=u\DSi߃ \~b'~ bM;z';Tx!wO0=_}%\w~Gn~W k`fr t zmO]q#kFAHO3[/gRb hb /{Zv伴?B *򶆏{ë7~y5c]Bpf=\,NZ.aoRu~jkRni =8b7}!ރA(J^eNB&c=bȢn?";s$"" e^rCEێ\au.@w^56-]i y_`5'}DzVu]bPJZ\+[K-"wYIsu/3(I~5I G<ѸB~>uƅ>{#C- ߳u#N\Duf4 3EHv0#HN[m<pI‘wG/ V2i^tYF^-ڣVs[CBN*͓ݒ;E"\r;o|#DPұCUHAv%oeՐ5U׸ӊs獠cJߐטϳlu^@/h~ tC}btA" rCh+ Ĉ֨yՕ+˥[;QZ:N]ݍ6t.eV.2CKOAf\:Dk}?qH.𱟸. 7a~Oу7#<-J#o*ܛZr[ uwn]~$hZ flB?JW|TgMd*-Rmm&׵Pw!OI7pŒ6%'Xr[j' ڟ+t2oI/'')n!9Iߡh:cE+-̡@nn^݉uCY)!%/__?O~I( ZyC^c} hg{^.*)7tz>q;#ܠa9z* zk穗^ J+/ v!I&+^ָzHt)lkwhFf놞3f)uސEmF/-k9~N\pҀnءx9 !IҚo4Gȍ,/: 8zM*= 2r5,Bz)M]r P2h1E:f~T z4XÐ;s#: {KgNon`d,#AWL2׽xnFТQm.NZ׈id.*j76YݐSH1B/uSf]U`Ct$<.>>{8ty$j4;]tjгQLn~F5fL+1926ε_iH6 }>yz x `K/Z׹t2yaFE;kz[ncscg(t]WWq4fhho P^jZ":ōnWwtG9;ueӻAg`Hͫݍ#NuWL(իgnB2| N݅|~#L *2]dٽ^:,MQ#%l]= u@ pU ]Cq~nF됋qkI\}wdhWIƵ bՠT)EK#oN#Ns\DQ͗rI:_Rٰk8HuY}FT=- ) ӿGX܀dѴBSIIPԸ [DRzېkqCD|K;ԋ('𕩊\ڑfO:RY@J |KKBv}H=Gi=S =9Aӈdc>mV$ бf]:Rit{{`+)ٱKQSuH mR'), iɷ|7B%ƒY9_I. -@b˂KJyֳ&^=GPtѱm1z5J&:t`󧜇wx {׾ WA7uc>ϸy @!hb|FΊ[Vx[6Y$¦- h~o}.>XC+9nzqbVgzN=Y?Y*?_iNK,B@H.mBE6h^~?<>{l) Fj9/{n1/z a:*M0QwFPl?CgDb,_V#ÐL< -\}#Fb m&?;=qGIUbH^'#&ɫ&H2tGgxoK%3ػpOS$v@<'x¥_A ,~{ `̇}C*T|[q-E'OeQwV^Cc5zG} ( ރD]*Y[Lx M7?#*Yg)9#mV_ۃj =[o=C~ٛ]GI"XoѹGNCH drᆼ8U^ӷN_s8t^Zlga^KōSc=;jn`/YUhY?_Tsl{-gs}[̔Aw8o |3 su<=_rRl:/ԸfsϰAKڃTr~fAG%UO%{8}2-64Fׂx1h eS y𲖿GM?mulGÖHU?ѻ9iHWyZJfO\j \ C]K웽п]'ƾuNM\ ^f6,ŒTUS$]Gv}'7n7z%Kh0ϡ_fa~dLjŖ11™"NY0\w|oȽnќP{MjN۠ԿΙ ߅;x:J6ҡ;TR}F3G/ZZa ^׌ h6?)AG^9$2hޓuOWwC΍q#qџ\X&1n ~[LcR#n,6x&sR{G,G@6(-A7!8xC Rwg?~ ]M|LZp߂~ֱxIl0'Zp/f8{> r~V6ח෡7OD W~)%3vRZ/rYq!L틾G{@xxN+)/&iMG "j>@Yr>i_d3h=|:?__M*>/̵ăM;B,o[O5XЛN')z-Ȯ0DilT!h}H2;҇|@K:7)ּ{IcOh7o88A> ZKBːQ4%&yۤG|o͈6beI:<[ixg_rN,!hmNEo%02DžFO fWK(2%/M@`/k>( -c&gbYQ?JQȒc&H$z O F +ϼX TBO8rsjo~[^Cِd,/'n{- [hSuɾߖ 9ppNJf5-u8U/)_n-?^bǥe8Wy^-D9g CN%7J6c}n~| =t!;vX}k3Rb\|5E)4\mt\a*p6B'Qh",wLz2уblZkx\?:I Θehزt@j ɼ-ސ&ޖII]ߩ,g\r_3G(鑁2_WZEd1$Zg g1+::n|%ʼ4 oyRrwmmJ8[%]22OZJkM0rR=aK9lųJoF`Dȗ~/qHs܌4C/3kw3z|;Y-|s2>}X<%eB[⬞ )Cwt|N^RE)҅EYd(GoK:{3)e[Yﰩ@ne;Wx/$hAQw\sD)Cokd7u-Fo>\.:-rbc7Vl(2 ݗy>y2fv{7º!wVFNz 9d^,..wU7lgt;m/ +5 ob-ze?W7*n _hQ*4hKFb7SҺDoyw聁axI\ۆ<#wF+Z{"֐'4DCe @pxRbL2Z,Y%hN.qn."Y=T dhC~t_7)M@}D%{gE1h)' |:/}bim^  7,F]f1:ƫ4HhVݐx@FJ;G%/ENŌv)YUiCN)-l0"C6 B>hluͣo݋=y 5>AE{h83zrL݉+7\n.If₞"g}qCK#K#wT9}WWFQ7X=|EԠ´AONG_ _!wy*# WŁU^I]75{^Z)reUuO䔆CgǽOo":ky@de⺟UH x=,X#(񍚍I]M fY պ#wqќwUhs#yEx<FҮSa9AF f~cFG~^Rܐ_u=E7\9N-Q7rWEiZ-I$vگ@?G9-;{tc!l.-VgA 9ZT5pEλHW ޵QjkbCU]yY8SΤ@7xCޣ NKG^ m]F6XqHN;SCoId"Fgbۙw :E6藟­1:bۥ`GZ,=#C /KpH[if1)!_c~L-im:BG #ZBaT}"I+twt͌ABOvmG!FCvQ-.'} z]QfhKaJtx8 ~~o,UWoFހ9LͳӸu\Ѣ5 92ۑs荕4e-1nד?j*$؆-( 44]vǾFNxU|b %)rnzC#s*];bDGEPI%"ͯC猭|{k.1I/B4z"Q2 9y^Ӏ;uMر؝!r=G,u^H۠5X/BzGtҤ[Mb8=]}>bޯQG3N6mmbXx=¥Ħf-rU*26, Hރ*M6Y4/hɴݵN۲e?zVl:Zspx'fQMa9#Q:GҨÀs:ɕƒZ|3xO#v9wQ9vj[#GAWkZ2G5 ]@}g^֪zŶV7cֶX=v1,E.J,_GI>p\K_F/;Ub?r#Ôu^+%Cv!mE#NatR[i-yLFzJd`-&G7[_y DS)y-ɷ y(Z|-5ȡy0@{qf}ќjB;u^Zcb 8z!e)M肼7t%Xr ]qBW<FWqz\.gLL#∗Ftq]k}#O`#׼/tПxTǝt2v}ip⣕[\b+y.%%/ukʏ;Bf|A12: F'Etq÷וNޜ% =_Xңշx#]K\/3źrJZK!i@[|{uz)i-lN/!uIי}1rqoN.꾝:(dY>dLMkAw%xI;tBRiϩv~ mpQ>;Ա3un{0HC1}6B50P-r S=՘v-ns|Lblg|X^D9 M.?@/\ xAeFd<!wwԫ+#?H=8%l1q0՗[`]k;oS[~\:{;/}H+"e~@.°)WtMJNV8?WO=N]_%#7۟ckrG ڏ_7zbi#2:mj. Ҏ*$`ziT~zoؓzcՕ؛1RRQw>.tU5sFBڎ}$mV:说[۠yc|!p< XTi _t#hL]rFޖWOTeG9J..͕s+='q#ݲotCXv1u7~Ԩqϼ=\.c–42K҈ y/htY,) 3wD'R5z]:}Nm`77藭t[\U5G*ֹzbؼƽGNo'*-RʅyZ4$6fe,:v5zB#b{%'1bQ "D>RUb/ yH;G[3BO ݥS8u{)rrHg.ЮSV2V ~qws讜рF)8\ ֫ xrF.rczbBCE:޴R;-lV'eκ2u@wOy#ipHj1G,-Ҡ]dKլ;7x;=S ~,zi S$F~U;}GSY!?KF~i4Eٺ\ʵyxG 4n-cC GuL.#nAo,ӝrM"]ێZ92ȹKcC~ yTّz/qϙ[t*2kJB 1TŵLХU̵hŖ&7kbՐۺ\.|<{H/)]:4~z1@Z 6V(mv6 / etv#8rBG.FЩpVb[6ݱאtCF_?^Г&,VqJݳ1Gk,WUTBeC~-ohC;:cY.t[ ZѲ%S~yuԻ+bWG|En)&C|BoX\ 86@;pzM?Ϝky.RpNh[|^-ic'"o^IPCƗrgz{Pw3QǍ:swg:>YZl4T"U h4 x:LU:٠R5(5-iV_`;o1owxu3@FƎA+K}FVhxsf7T[.n6o+7^{Ax]4ic`4 ]CtHE-#LQT4d@\8I7R|ENsJi.ЪdpC A/|F;vW*3cAԫv/9KfY `ia]]*A;{sۑ_=|; `^H"XU7*+P4U]"gԁ4-e>z%[H{-;^4㆑\r/wW).A;D_M{/צrkRv|AckЋǩ@rFe:e4Уa;؞o=.ֱ1i+ma^=mC1ދ؎Eˡ}5٠|q >ƍ܂l+rבF^=J/eC^v]3c&Ȥ: 3WeНv`.j4'z==GQ%x! fx LPvhtOr2ڞ):/wL#.rE ,L4)qہ@Ӥ,Ϝ gmjᑞ>/W}LznNoK>Em0NQ]o Z<%6T>zCNaT z#O5 t!k^ sDރ8Eo"t\}2rҹ_#!ݐK,zPQs\bcUّ2nԄ &׵+ t$h.\Vu4wIr]-!F-2 Sܘ*ر>D>%F;.U[Q((t@}b{)pm'v.h&ͻsKcWԚ:{߸"AÇO][Цdok\1B^orAk(`%בQ [2I B6AcT٠٩JWvjT^ZoٶL5Ȭ\͘\i{DR>Щk*ș~.Vgh;xKѩjzާ^"^[ЯG^\稃Zߐk/.z ]wF~B_]uC>ȱ)mgiwJ1=\(v4ϻpjBژ+BW ZV!N9FN@޻|%wpY 4f*4HhH[aVBEMcUFZE<67ذ]9kl:c4)GU}R"%) ]4;THBwk yʆ.ơ)),"w{ّPGnw6mqZeG|1&scM}~ԐR=enz-*‘.dkPg@، K=[րוkTCqo=rt i iӪݚXf+w'+>Dƙ@krK+2SeGa5ӸnC`̨WT7^+==ћ 3 9QT^#T#_teǴ.FsHJifOVA/VQC]>B`]euCU#zͱ6w};(bLfzյ$BByMzU,tiLȽtn.&20ۑVG0,_#TL-$?μ}.h:nw=J0n;<֕uEn/EdxM:m;ؠ7jߍ,F| 0HՑ.h_bދtCN&.F3oqtI1o3!}>Gfmam;t苼%Bh]x3l=KHhE)Tutuq"XUWؠk` @$U~es:-; >f{#x@պD.1hRRv趸[yn:*'jiU鮣S-JF g 1r`~ݵv!AJy?BiJ1YKle] FqML],׻+4WXwuj捞th`Ԇ0kD6.9G$?Ӓ9@e}#OzܫLc7g+ءS. 8 4 gA=f\DL'`hAf2ۡ_ >)Ѕv3k }W6]3VLN]ԗNT6@CN׮TB?]q QWJK 6l6q&\. iS]4.\bP\HW]]v96NA9;m 9'FC zKb[1K!OQ#GZxhk1)M9'3UhRCEdmI;/-/r0aS%5k3`hDkZ3 M\}4d=ZlYa6쭺ơgא2N,y[dƆR {D;F{-%n} o.{kgUD$ʺ,E%.Wʎ, '.D*v/|]ożڢ1ca|_&{}~^BMuKu'~dVvYq"'a٠S? 1Q,n\sKxvTA~f 3);Իr^.h4}BʈI z;FĠջ٧rijB;;*kv w=[/V O&g]ѤBs/:|z$0[Nv$<\Ǣ1ak!%Q3M_ LwKa0CSvC!" t륕t^$I#'OT71+-:F?N=[ui׎:f}Q N{'nj#Rkj4l]:i 7nu -]ѡu.-/:A~IV7aeY$7_z߰Kx 9ÀL_ӃwnjLx6V)ceJW`8!w[rZRK؎|U jFcuV($7i*pooT\Yc<_ugcGk bf{HEw0rp`w $HC<jDn~v~=FUZ_<_.f4ʮ6꯵|C۞"^A$!ȭ/ GoCQn4xշ\ ޠ{ȊdU圗̢i0G|^L} ߌ!&^cYCjOp$٢}|k8/{ks9"JNE-x/|yޱFG>yԐHM:͔HǮ_{ ݮ^ݦV_t꺞Z5GGNMZMv<"{W+]T8Bƌl-=K7F=~b!qʻj&DtDeg~A;5x F39.fF9٠Q3(ao^-%t#hE) q:Q+qmhh=8$ǘZ N=rǴ i=6%2{^Nt= Z݈#i`rϡvB#a޹ITN$?3?nJ89ՆռԩҝJ% V 1ځ*^==~F2C_K硗-Z@Hjw#'BF>n yC tR}/7^F,u9#.Yoadi]Ӕ8Iv))I=}>J$MG }| f|ÐY?kK~ryl\3ǔh}^ U r|kIu9 n|3ߕH!=XV,aoWekmѧ\3<䙯t~z3 힩K#.Gz^n.Ȍ;wʽ>QFuD(.tQj:TT>Kح{ԍαd@kǛ`S |]k39>ST-$﹮ISu\kĄ|qZ GQRtFЭC) luk2R9KVOھԯ͵ duy/@$tF\rvKۃ zm H`@enq3 U}z6WhI}z}C~KN>#_~i-)?R]ԣ~P'䏔tO!ݲǰݽ/Ѝ;T35҇qC2(OQ+vX$SLǀ~MI8{`nmcoopytp tm%)"mзz443 F%X{d6cjhFSэ!IN<*?}jr[ȩޑ '9*l]Um'իKe9q7z 'Þ'}D^٣S ZsҞQuAi6qSm1iO"Gv^kֱw dL8uPm>9 BG@|\3M@pĎ,݀J*EmWq]E>ݲ\%Hݾ#Sf^̗ðfz͚wˍc`&^Zv:ڛC-WeOB&MNq)h]73! a瑗ɍ4ZjX3t Anüm22d\cʋ}/J.ƷKQ 'R;B"Ui77zfG˯_ᢏ /!kIW :5DaOϩ+C%R-~zW[}F> p2/̂~Bw8_hvJuhU\55?FKSC;eFqM8y,$ ɞ\5aWk&nk`J:5Zޭ ݳ;rF t.==ѯ3tq_]sG.h@г& uh=ɩ.~I {!T@ЗnyinV.ıXã#[q?|K[_rfx_>I#zᢷ{eK16MƁ~ zrtD= ZPfxtر%i^52Doy;B7J0}-=VŴTuJ3&d~_w5E>j.r232gvè؂5fS\$ DiFG ҉^ |g0n`xsZC~=3أ/>>wZt-RҡUS0H:B$pYZ.?>#lԘl_T9vOWFzs]hSQ#~ۥn%R릮 B(}]Q7\ѯv&t^gNQ}q@EAySMS^ M^Cճ#R|1-EQ2 ]t4L#{!S녌{n1"^@xQ'5OG^ ̏JW~t]k݁K^_ @4.+Og.4lD(bGv9mdndTD. ҽK-Փ{"!ȧKHzG&r[ z{ZlX`VE~^ gٜƂ{Hz%.wkr}纝]w\]N Ǚ[LSv`.[M{{~kRRbk~P[qxS(fiƇ`R}mٱ;3*ǯDmh)Iv[7~]k;V ,FA7%:#()tf3ѪdFZvU<+ -PQFT:h9OQ2z^nz/| u_ivaw>'e ^e;ѱ?\Ckd|晣{gqAT:sFǖ$>/Q)0z $VRFu:y_WEU6Dz:Gʨ]A>#i+:b/=a#i-z|:O3{Օh}| N/ Anm %=/oiy+ d$wވv! Bi"=|v'Lj3jy^y H=Һ`n-.3gN0х0;.Tݧz|i. c9]Ka.ckH以1;EP/ޡ+/m ^TRBX~Dut)<г۵3kD+otS矑!jy:"gKN ~4su?G#O1!Ux=> ؽظiHtW^Y &OaOBkwҌ>[wWS`rQ rO-r 2AN00![7/u]S=9I.;o9s!3/ֲC_R֑s c!F~|pZ|/8|?[pE&ȱ?kJ]htӆly׎udGNCBv y{o 3/ryF/|?7~?-:]RrD>Bڹa+ϩqۼqOROOo/9 rEX*vQT8l??юb`k] 1Vݴt a<|:ẘ\:wHbѬiny1L{*i-#OwTT.(CW5n}KM^BjLgn'z֢Ⱥ,r]zjvFb2׽ANxU ՒEOoQӃ]aWGyNF6sM^ T\%"E1V 1d\x7SC!Aŕ\R0EtA4Zji\Ztt|%sEz0"s$卞^Wa\\Xe%E ]Z^nrߎ6̹zEF=W[9 >~ZJ{zеCgc}蔋Q\\i.K\}28^U,&j.JOR!q}}{8 8ArmE^'9 ]\3AȻTt何1J@I=9>`wE8˞Xd?ia-kspp[m-m28D|dN ŵ.FЩQ2KWWnMY&yg‹%@t] ]Ch|m@=ɣհ.yq)R]/oȥfJ =_]uj Gf09'M䃞D~%zE]x9zY׃4wu"9n1lz?Ϝb㵇;9>{ckڻ@?NyDSu^x_% c:k\͠]|I7as沛/İFJyoGI>7椵d5u^ap]-楎]8Z4QԍN/l]#Gbd >#R;oBIoD>v mOo 9R"_GA=&?ѧFu7;'|o8&dY oQsyF.NxJƦc͙k9I_а[ks7[CgAwf~Q*恜%W SS{)tw Y}]Z^bcOWxHE'I\=k$ž?-Mo_e>X1(x݆ӱ G >w=F_z/K{hp詍[T,17% ~/Зon%䕈]NK{y.y%:㒳W']TAMrt9B  7lm;F爚&B m@k E^B=+(_^/r'y6Ϊ*B#y91n7zCNAuo,|Q6d8招)['y]w'}Ɗ}\"gne|S16[@1< :e tIj*ḼR [t|uo/*|k D&~vП#Bл|IҠh#yfT|)z /q,!_䲝Ekv>l|KXKVZvQtu,?ёAйӥtS38^ >E=P%<-oK̡?Sb/"_|ֹaV/%tq :¨a&I5cy]_r>#u$_TRN|[.7k}|/ B)ϡ6s}ž,dD WޔBz t.cE塋>&vCb^z+`ɻ/]Od}::L|*yűB7FAO_W:|~5˅ [^MŒ[i}t!A.jqiy7v"~S4{hOw5G{8v%*ud nM:EvgE#SL^=nȮ|-Gܐ5Y"h0v2Bc7bz|vӌ#GG3/7[V韏|]w=.Ews.1By LxeENt&h]2y΋ =й}6ݶF`t1F%'Ő/_I&o^ёn]ntc:D>=FDvhBi-vOkpn1 `s(5^Pi%y~%E(ijF^\rh{d^ԓ^}]>V%5dsY+rz!GK=OWu/zq"Gk w]6B/ts5^F剾7 t+mތgӸx6pD*rLWiANv:μy伋Ý]37h~Wr:BĠ:YǮWҬ3z?ۏ#UBKm,Vh _Km% -`[wH.쬑'=ӡi+T:$⢫Ox)JupɉKXzO=Qѽzz6:6z4[.+]Ն||ucԡvV)A>-ZoQ8zˮBtW^},PZŰOْc]u4GJLݢs+BؕHMt4>cnS윴|߂Z,MZ@wJWwv_%t ASM^N'}y~EW \A~ 5V!8t tNzG{} i.1%rU.)ioqvZBc#\obrWՏX|-=m/a#mˌ)Fo*i#vz l/r s N{7Cb"F7וq䊝")z )/>oE.uֽA풑to}o\o(t@䗒ys:]"V;)O[E> o9=âk^Uݲ>t-kft¸|%bO1tg;! FҤTe^л-9d(:Ilכ0KZEScƾX4._k`_05wq ~MWA ZU%ɳN?<:n5q톸ڗ~zc ֠ qN F9vYlFJ{_vO{Khս//zɚ![tݾ^}.IjZrZMb y?OM+Θ/|M[ )V`ow8S2Ӄeb&g!\xѴy{Mƾ= ?4&d|YEcW%2xCg6~|e=Ź8Oxkx]8y&No5>g5DM?_ u~·V(+ᙵ@^Gڪ̬ ]E_#G@_>*Зb}FyOlM}E/JIiR{K44ELkIoh:qɦ􅿕6 .DNvܠ_eĮ:-峳6d_Bq6yOlЩyeWc+"0~ q]hs9<T7pi_r ;/r~$զ/ݐ?Qv 9k"uNׅӑ~cx*{ U Ar.wJE^*vz֧jAQ?4zYO/tvrNW%~< HԹl!Nr;fJayJW v;nSBI"ty-tyBʁ79m3nԈ_זjЕ`{!q%lkF/tr@;/V z<׶S)7v3FV{2o H.>R;2<>5xQyd8%V 7yUC~Iww9'>o\Q]J/r hGkҭ"珞Ãr%7DRƬ@t>EbwX=ִZcheENro w1~X:W'c]E?X,S|]ۍPEN$E%ȈyuiNYˮ)viw"gP}9R b&iM5 ({Pt`zkYrkVP7ͥAoq-7Fs'LN&?Kd/\IEͥK=yu@}dMN"*Boe-HOOt ) s kE~u2v|>a4Lg41VQ&Frr=%SA.kËR>:&jRY \g]b Y-vkG4aGtU۫{/r{kC&7Z %s.DNket=z-`XTk.`QmybD}:_] B7JsZH\r7sAoUxzme n>dlyyD/;bbNt%59/K} ދ\"k/Q +ڬ䗘:a.Bz.y zXƁ]:e979.2r b7zftdeWJa0cE<.rhFFkRwFpT6uXC:/EN1,Iȧ.t˕n/ yq]Pݣ9OWeg~S5"Ӗ_\$P %0zS4tlDV;Z]fq׈\U3uKK[/Z|U:fG^XWɫ׊ys7::k4(+qZ~z\s~9ƌOǕ>y3ȉn`^җ;:DDo9F9|zΧwy`Kw ^i4C 5o+Fcly].MR' -T֡Sՠ:x{$<tVTs蔻Tީ}ȳ^W;fs){dZ0Zz"’kmyPZ|96:\Rx_ew~ᚋɯYccCGk9ExNF's#@1x+y-uf\ret'zK-Ж޺NU??QdޘݷPuv]!fzC'O;i2/|c+1}gnz>OSMt#tw6F"6Y^[3|_a , z,}jrIZz:sC`zӐzAah<216tWM6ѫ+ o4u:jIk 6# &@ |1\gJC:K_oiKJho{zϋwPtr Co~׍^cpg87O-ry^h޺r3/?^0~s"hНzXǩHe\-y/#BХU׸9ݮh+7K>%~wn\mmOD`,t}Ge].sm|ɗ<{[%_mJOUx@tOr1e!?"a,. +Η ;9<ҡ=Tz h r~lG飫"'wLnH?wvM 謮{׫9g FWNH ݒ^l|g>b׎ܼ-yyLJƢزڮ%`iCO!EmMrJCO8 ].f >kɋSuL<$K6\yOs9`EKN*!{gn+?j\wNc,z / :6:ƠPU muXc~g6 =z<\|EB wiA7/\rqI.Inw(D-t& -@J]4bϵ fDC_.x:7Z;Z7:횏l魴d,-Ͽv<5ܺh5{_KTV[yϋ<4ֆrjqtzSLǿ@[9l``-NJLCZ-\K)"/|O={[6tKyو>N>nEovNt=/w{ދq:/v߻?Z{9V9zIԐc-=vI]3.zV\7.zs <]z%hKԢOn=6 Es mN\l\2vĮrA.A>-\s%Rx:$k7K!=˼W: EnF ]/t]QC/sa!K􌠒t}P::lS_?_z K#9睞;եOsG|dp }T>ȯpaEVW^p{kt+Oɯb/w!W~.Kol]?.QX rgm#lEzg$#Rswq2A]0u  %E~)3GJtӵ@A>ɧGԁܿ@K[tyi.+uA[}s؅] }_Kvdtzk,gUF\Co}%F|#~-t(\؅GXR@g/$#?8K]?9*^Iλ%c2UV跆Τ9nQT4}m"ٷKX (v?37ڰ}DM~ B:I s^ vB|{Ǔv`_Ӵvg ?[3tJoM^[MJViz3R{9]y]Q.9xqq[\G:5ha=5'՝"$tK3_m-+v2@8/͕: ]91t{+u_A4h>"g6ʈ5Q7ED@wD{m3;*6P-Z]Zb'mei0g$ߦ"##D8x݇]e/a{[FnVj!hHrЯ$t#{֙sWd *2=CY0Sqn#>k7FYHR?l9ΪG[w"o:X"s -?kf5s'd%7&"[ʼQ{I% Ƈ5kANKtҙܡ6FCY/zC<s@\r Їjε5n>En{E%CZ6l"3_RLNsa=G.⏪nKBk;煾[u". URw@\ ;m+T N%Fxԓ᳗185 ͠]OɖhY[.3'WHr/M!"r7z"_֑ Z- ;%Bb/b=gPEn#\r*i7msъRSvlݬt^沥I?}ZH|؂>|YjPzs~z.1)Ru>S| tڨ _~щݴޏ>k+q#y5lkcOW$ ^thํ/<]E2/=vG_fX7æxc9u>;2Z K4AYF;dr,xIK_p"wGꏣ ꂭ?y Jl'5,Pe@5do֠S2C0\k+pM&r뎣@7Pe-k_"~:Rt Iz\M3S\/r_.pþ]M{[ cK= zg|-G:. vK@H~Oy{kwko)[{;^Dٲi[5]<ž4a:EKjGF/ͣfН2:eޖa/Ud>$uiNk<5Зxiԑiߣ_Ǧ\ܣ~O}R{*$Ч7C΋{8r_ڠ{9X“=% * bv U{^cEB=Q/=Ny!ˎBDɮ2U~)Դʯurz8̶AϦH XV _   ~ 'J/u-[{CV6{ƎOkh \" Vd]^el^:utC뱶>>i j$]-kA#>ZۥSq5@N^Af \B-ЅZ1hK=bzsL7MkgUoz :ZOcuֆ=c6>ga;-{Av[]^ 'z/C&}<޶`wmD!IRPXxP~g4;lK9^4:rKh=Å=!M>sA( CHlG&耈5M3r@Dv/"Oi1rdg ||װ;37a"2r_BbБ(q9O}#sY쁼J"h5^'\ˌu|NnC_j6.է\b8k,ؚ V_x/t1# SzFliZkg`{it_zТs}BgGEn1\%>˾/lw9`@/?ye0t;/9TzC\_ή@A."u-PTK%9Q' ;7j^mݢcxh1J )`.?o>Cse%UywiЦ^X$3N.ܯ%]+@6U[O^Jqa.]y ێskT8[WhUZ ݾhwiP)Ѹ= m.U"Ui yz"IЗ E#]eu /|NE^=;ɟQNG h$i }Μv.aɩą.Tzxau|W$H^G]_8s C_gCrgϜϡSVQ\⸶UV2!WHN Zlnu>`k㢵C$CNSɴЃVSؗl9"r%:{5M/tl.%m/tޚ]={k\ .$AH2ًB׸^^.ᶨ*rzA^$~[QT?P2"S4;.3o{sDskq"\nqܰR~ӯ+j MN\@/;(_m<>"-,E!4$%4n!Xt~_}IP+5f[b]Sž:u7;8]u m--Rb7潺wx[M_5텤~W*4 Ƌ*Й KDzcS>R`C>n oχ<[@|pE^w#J&gdI~ =|EN,Ӹ>,?# zT˸N~7yάA{Nr]y@iM)di/.[ao^f8PA!1kB"ᣳk`!_#/rBbN?Q}e hIEau[dF/Y^^(\o-.^,:`#ZWS36贋kUb]@7GI~Ujmy4}ݭ(] L ,ShLϙ5ܕrE @ ޸#UzF{_W|}@_/q6::kA>/ 'o%g/٪z]B5#A\굋|ȞK~9yc#]|3%v7y[Gd58Ǣ|=}z.<"=> t\%~Fh; Nq ^-^x Az)4{ E[\|-;޷bDsm@ߊZ 2F%'/tgszxhD"k_ߛܢcHի"%gܷ@i-7yK rGse75vok+U!,<&1=Fo*R>R85stJŐX%捀e #Ƌ)K+tJC8z W .-S|Zs\7_MB2HOz)n d:N"^3e%S\:V_xjȎJW6Ǜ^KqA*~f?SЭ_" ?ϼ3_oэ<]0/I95JuO& {#9)B_'DdL?Y%L=OҽÏ6o^z:yC^v+`gɼ1hfӠf}vOЬe7#Jݨo.eZKl1/SiB84oyȖyaՓH]ZZ <5 <~]y[q\˺ Y(xۏ2Vb+-}=}ȳ!;3p$רt0>gnyv@?Ѣq16]wL|+ەH/yXC R/yh竛b; -CԎ#Q{ZڡF[^ ݭ$gؿ,a 욓5׮[s[_'z٪ή&Bz# R7z6v[:>\]X{Qhe vR8=g6b{-DЏ&R1F/vDװwz_㛜wZz(ܶJ,kV /GO|꧎z u)!҉WhdOoMKE~}W9(.E:;E9f@Oy$OaC6j/di+,|>q!a dUiǑ$+$i.-ܮ}S.wtq:o'-DwyW DiF8^OBo^ wdDrvPS鸇.~ =[+5zȕH^J_BrT9>\>=kr۫{8?Hy g~%Zu ;M3ɞ˂GENyy? T8]( ǡ2Đ2ןnr3Tz`>R]1A` _o#}9AI119]q2keM6C<^S~B/_Y0'5<],hP?S|^[=j}de@#+˼>chۻ?Siu W={kQ o1<XnutnZ+Iݻ^XNr˦qJQJR i,>)/pH5Ci!_[ Oɺ<~+6p- oRsmJ ZMEyY_#:"+ne#M5 h2W'? {gݺ 9 q%N~Z$_vy} [ϾRCtw~ox!0/{:;M zc脫C~}h>b/!Ped|iց%E(K|<ժ[+{q[I95($^ 3 ޼]z8 =m4mR_z5"G_9~w@}vOp!ԫNzgki25KЫ=G_|ӹxFMEk-AOҗN6/uWze8{-6m:`jkQB7R|>A ,9;]3R:M>IȞeg f^db_ ?csa,(|?)Y!jK3FFܣ}YFYvu[}xy#tJQhJG5hJz0@"Qk?=_+\ujil/|ϓᒷqw2k#RwECN=Z|ծ2s~-0i?3t)ɗZ~V#A l>ڱxɗw\SD/xBꪣG&7|ٳ> [\A_Kϡ>%#Jtna7*l-:Ddq ɕ6?Y|W8ERb_L3 H^w~ifO zV>7;VOWuEw*B /<Ņ3bjj_v_~l?ׁ,F*5K}W%/_k~tA_c"c]feƞAxۯd7B㒷zߑ+Jmr{}"7yU6;1ݗHeOt'Op%K"ፑ?S:5h1ޢ-(Ҽ+cKAOױts6:sIlevSܸ&~~/-e:J0x>Y`C 8I>nl ;^$ C'qxYz!P#opZվJz/9dSfO:OID\]"7|> *fn 'z\Sή6h@xC-'9B(h\/ .ȇNt׎S2vN]7}$o9۠}i.|HZ_Fm+ѩߵ!+`[0]ƜOt]}y}ޮ&mozt;|>T+ r>yѭ~բՐSTx3-<AJg($M6@Sq_ Bo E=#εO~QW쿸wٕ[fQх os/z-rsA~vtK} =7tn"H_]lJ=ۥ}Z3vP1G&x繮ft^m-z Cw z#_oRzD~{"^9'z<1Lv".:vY Q uSE!~-]okgQ*Aw~^cjWv_zk,r!*Dw(4k?B|[Pע5 @xU-J!P"XS~}C2h=OL\Lk1C&'(˦{\.y =?Q39z:-\n.$nA4:ѳsAbqM?vKN4tEdL.=1B@хB {"Eҡh.n򫣋t%_K-Z2rCv=]R{Q\RFX t"]|r뮩3AU9jm~/i)gN3p懿G9F8>QPqlP׼p}ukуvh }ڲ_RgTkR "2]c`1k~P^1(DW tiҠtط >GfdC';F7.=E!LR  oMu%o [€Xz^ 1 ;'mU˧˨[Dv>e9s;KorH鯕Ngr 2#ec0<DY4u`{0F0+3 {79OK8/:>a^$ܢv>.n`c4txk/ 19k/}1@°GVHZۡcJ#Nj&= 1{\juiyӛ@Jm~w}N0< l־#XpL诣/{@ș?K'%=C|5dKdҭu&z'&?n|.,pAk 8Ԡ%S2WteϬCw_&_:{µɛ<{Dv-_KVdq< @ҡzW]%C讙4o,q7#cɽ#{7]W7E.l>S`4F~sisgt;9RTARcԿG70Ү]8KsoP#SZ2N{y+vYߦFӦNu3މos@Vlviaf@c aaoKKu ?i l,U9s3ōO'vcA 3E>&[tϻ".$OGW|ވWygHzP;ًJ6o.FfGV:Mr͆\I^olϳx{^eĂh=2qWKõaos)!\{ B['g߬#;ɑ/ҿYԾ-:@O1rh|L]`ak&=ݚr]A^C_w p5(;e$ԉʆ F;]n1M;IW岗u7^@v3w=ю#*i~xt@w+!yz+_øw^q o_fOq]r#l*:;i ٯ t^0Qk{5τ|d젧Qx׽c*Q4W춱:= _5~\5s rD3 r=*FO$fA*3;'ɧӂUb(V~%ҏxk=_3j^ZD Q{?5YfhR8KKӹ<  |L2FT(юvSM~1 V;r/q w~]}Tx|1`D .@!h ]Ѫ)ty iU 䈾sН]/{|W] TX",eρEu/{?~E@~d@7FNt3Ԭ.,ŰFukzdetMbWt /@ȓFn/֌7nn:AKI]704avg4G\}=|UEx`+rq 4S3}zK׸G~Ry1ztScVWI{U?mZݖ[7G]As`_+Ƚ;W4"n)I-E\j}E^W^|rS"|ǽ9vE{qo'c Lz+"|.ʪK?}G 9.ӱQbzHѝ"z-'t4T;cDRώQn̯]c[ٕim{K3x<|$F[53w;4V;{袎t*;DDc\#=[#ʁcktjg]N2ݰ#-\ 9k%hBr@M:[(Rߣ?}DC$^MFv_lzuz@Grl4  :*vZt1ȻDajF}i>8m~{YH^8^s7}xC kt"4Gž ZM7^M0o5O޴CS^KՏ4# $:])G븆/c EoRWo>.@D2)ˬr7+9!^IrW+k7H@nVO/oę{}ۼ.v>@~)zkxD~-K>h=rZ6aW5ЂX5_jq]=1>"ѮG9<_D֠wG|T :PFzJVoM%UG=_հx\͂=@.@LO&i8@?48+O3" ^NEF@ /`uQ #a÷կǝ}#p Riͽň \.85r0&,Z9gl^7rń}2[Luޠ:Y ;,6h@.[Tk"SK#pFXK)I*ѯ[h WxM.FN\g8bML~X,ޑSŐF~ʀ.FP4'B|(tsfF{O-&^|Z0i"UIF] /w?#\;?)$"!hk;rBssB\9oit4@Iu3=^E\2ځ|/Fʢ8>WY{ȘO"gV*O)=ZtP4{N܅~~|_PH3_fKzw~5RFuzO"Je@k*Pд4r1:rZz}H|aBkAg_k@>RѠouNy1@y_ҀeY~:G"C_= Mc5S7 k:heDRGI.vZ0^S (o䱿Х!V'j0&-zb yFQȵtv@P)h j~pv;ty!mWD.:_Ȓ ~Z_J+rH{~Յ]cעmȷL,hO죍kROar ]"99^nG׉Fps^^i -:|D rCI^6U+2e󑯨@xq!odeICz"h/"?\eF^ZU]]R_> D/# PNrF;ؽн*_!bnV.K<gmAy/.(WZ__i(0JB_G M16uktnU2:[PHB*NZ1n.s:5\>#`OM >ԠFp%.ao=}ޞZN/]xHK};8v& 'R^2GXG&7{ݱjwB)xK`n}YXNcg/պu7vsCJ).%TQ_OD,gd 6F~@p.] }{_^pw`mw_~ӏ /+V(iL/azf8&y s(aOy$҄%!0NBf6o}7" m)#ZV&` 7zJ7%}Jb83Ȟ'cy s fash^"{ }g :/[.&GIs۞D?='z!yO~9p!?_+sk9}% 5d]gȩ ^_bЎax)vVF3hY>xe)zQ^Ӎmo45Z\UMw43V( Ӓ}xN[Qf,"H& ͗oKVL&i58<&dCz"2hY' A2t˃N9l $NCN񝺈3{ł>jK躛hFaKuV tF ZhB_:忍0k8mNђlPr@r-hqu@~i؎< G M@~564 T!b{ q@0cs%K~I+@1T+}Lsyi:;[ :#bF4J>.QdƆ\ NW}o\[^"}1vWY9K|ҡy$5]3"'.ȠcϮW{ !r.OJ/&A2zzK߃ә VZ;3 qQd#csyA']=7|!-6rޏ(4duq#A%CQг210'GwhvCizfqA+y߇(@rx'>.N),O\쒞޺L7B=i`CtbD~q,G.}+H+6%~KG׎P#ʽqV xG/Wcރ{Ngb~p1@.{F*uiދgל\ 6c3:G->DO`/su>W^(ER#͞ ]CUKٔ<ݒ{@t\`A8%z)!n\54͝!C:鲺/ڡGT_W/-vw9޻)E֡7|UjKfKTFZuJơUg^Ĭ.!ѝ%1I8X Zdݭ)oZ+_aٗI?YF}^PA>ofQc'mw}: IRۧ?B+%jZ~ߖOp-s-4^#XOo-+H&o7a3e)b.:|-66rkx|'3Z*rnn rN[''zV|t lj]]VKM6-ʩ(}tbQ_{#2x׸q)=8͡ J˥ؠ9i!3c`75CN+;;+Yr?Rͳ'd[@W%>y*y}AY«s?A-]<ՠ𦚍K+nW*4(7|Ј^+S.n_HǍo}|q$( _D[D.,',am-rvi^eY0}FR-Lf>$Niewyfiȟ/D,lze -Z<ǑE6 NѐMOmG,OؕT"_c_љ;rQH@T)uwlz=^>fff{ TGO_QuK/fyͣ6 >ũ3c?o h rvI$Z[U9lchܑ *KP_-=w^\H'S(v%~Z\JΑ/JhK.n[4A O5ZM63a͆|6ɽ{/$-i ѫ@>tOilmY1ݺBmq'nG9k :r6!\LNM떡*G'rP)q\Ǭt  uwWEUF+d^BOyyS&t,/_]1m/oI漽~Z|&v:@^:եuLvopehj]nNO~GU4ݽ9ȷ8R^1/5.[ jZ Λ~຋iJeuW.V;OψF lf `LVxh쥷`ԏ,8/,">W-jc.t1OJ7 W$H_n{ KtF*ЯQcC.SM7:E4]]VGBλ=*щZ}=J2CojzQ'dO'sq=Ge@?~nu8 mf~=Vt#꾴_Z3D@ #p5mqYπ }̗h] }D}Ndt 23FwW=y  ~K;Evh7 }@#r^]d9i kЁ,amq;J@j%bWEi~r4 յB) ꧁k/HrQ#COqfyQʐW[;m^ [4$Ҿ,] 5- G~v:КNډl!ti2Fw}a]ȧCdBFC>$!q"D HwgPK595UlI/Q'ƅnw>.- M'b-wTFVƋl4*'r<<=,{e |rOn~ٛZQs!Ts_hj/f`)KUEO+>3`$@,1d | TWOkz `b3-}m\R\JG^PKoE@N:4tX_kf#/Lk_}D]緤ЗG# ΅A?FxG09ķ) Mo("D}D~iB }^_VT%}ym1P@{ƈqD N]9] T^ޒ# Q۵js 4n_Ӡ.r_y"' 䓀%}Eu{FZ/A%Qbo70vo _IWFNN5ѥ!{ȢF~gAn՗9.*tBhlG R }֢0(}ĀNCQNuS}EE? + zI5t-˰B^B5i[/~)j"v@}]x"xP`H6R4siկQ TMbr%mu/Աo9,5;vw [:{إ/std o~\k;G;3uH=kHK M @d風m#kOv|(#]uT/QlmPW]}"3:rK,O=HvatQ/ш@~@zُTnIEjD Ns̎uЩT;kiz CsF.{_wpSG|$G(p޾R܊بà3ݖ:Vnv'3IsptC0Kj&a^NjANN-F+ ٩[܎ iUC[xWBnL磭Co:IMvK~vZ<}LBRwj;jl >/J+A7]Do4cNǧNK.2{{(f7X8)D$tf,3 =_3!|ҒC\󊔮uGU~47Ը:*'Q4IL)^@kDu#J ^B1h2mr[y G.xJ!h^>?Hw%b5}_JM3T>od!t|cܡ8 ^B_۹jY2_5lY 6q񂟁އ;-%(M;#f+c-܌Ɖc8`ǯ_3|޵ZڵvTmkzP gDq/Ǒ|@Ncy8`O}߃ 9P͒jOIZ\r틽_u`TR}Ne׳va<3]b7R~b=_{fC$D>@qz޶ E>fq4.,pCԑ hIz3@3.8[b7\z9dy.Z[ pos qƇ[tV }译>WN+M3Ο 9Ś+*8{{ǦHc Bhwon'/ǀalt=zzo<-RzQWk ǡ㨞61OK:Ny*}E.sue+E- gy q{!nz [^X' \S.+kt0$}Xbʾlѿc.CY[*ȫu;Z ʾ1thF&[&Eup=&""izO척Qy"3J^&-DtھԑZO#RYuM~*#xQcHkO/eĝ E~Ku]~G\W6^Ϙ.)`_M?ڠWF9^zf/ITq \SE3}\/rsժ+bR4dx=39@pPO%la]/辁 ?'}3բСE ;u Cs|zyKY:O/ը wj{!l#Euޜ3 fT]|im>EHjfa.лѴD֞wONkoѰ5+>2W4n.zߵ]bm4%S{k&AS{om|Ġ/h/5R N87H<ۢ͠D5VC6=s3 +n/ZOH :xi茋%6T4|2P_F^)M,fq#M^zMW.:$f/w1BoN ]]5*9S<|uKE~%|荎bEA_[,rD~"8QЇ_1S-sp#ђ/](^7e=nw<LATTkR_He/>xm3͵}G_ao-i) v~X4zGm=OcNm+6tj6|~b79`0v*AU5\h,^#!b Պ]^VMWSDXNVs^uOR"ߩ~^); b,7YP* 2?,V˾JFOo,Dzt"Gנɦ!.>~djINh$?,o[Ov K ^g06oB;Ʀ#mL72U7YȮy12dKTUC\}>}x;Z~'ؽR=.,ФeZJ- ]Sa E 󖹍'=C:=۾d߼Ƶ١n=$p+؎S+ľ ,"έUۖNkezpIPs>kտDv{eKbSPAǡpV7<Ϡmz7zy{ }n{ |>G{LKyUdo}yk]}ySF_DB)ٱ[P{L%:۬|J]:\gڊ?G쬴Y]mJt L0vV7."5he}×~&:Sɼ~X<~zg=B) (l5C<Eاu71k$!}oZڠMF^[8NFMu*OƾO](_ǧ&K=kw;W>ĬeLl$ }$6Ț{3ql_#X}mҐߩ=Zf,J*pմA0:JVM?F6M&^f M'g^>6i"K.)%K(7r h5/-=??Xb: 2%|#GR 9~ܗu%@ozG9]-vؐm>Z=gfpWt]&J:u)|1ƠS 8u ]# RAߡ5>E6:Avu{@ ԵRCЕ:Ȳn+il@@hM<]x+1 rH_'^Q+ѻЯ1*XȗBu+uvlw BbiVo{3zv{s ؅%UF]kzє)й.I9N^[dKYh3Q5#ˍ^y:LvK}_A_Я^ =j)6[7KEC৷oL>~E߯=TwQ:Z:tt$胮')N&hQZr?![с|&_Fޙ"B j`z"@~IEq}e|IW͸$c7ȍ*9l8oBaZO¨ J^T#c[IOs{#A \TDpkű;K57KzNME; 67Ho1CҼce=9uhLJ 3z"DgpqE?4}EZi S/>c t_w.g;ɵ7p;=2l '{ya/`зj y;WzmŨi%FcKIÖnԍBSkl_5tf]]OF8$1cūа7ZK47{X7e+~\ToIꁼ}:?}D']*ob>b'**1*rpq':z@έN\]U9s_ў[̺@?DzBoGz [RsfDd5lC&/0@o\nqd?0oq 561_soz^nQMs oφQQN@/{tq\sv7r*{h e=}C ujik؉EcB3toLfw-/Ȭ3lȫ7VۈrXj~QB3;S^ʴBw0\倞Sb7~R5"ʪFg4յ\b/>]7e .S I ,r>>d8^7*:IdRpVKE2 HU@Nti9 bpX7o*=2hwI}^y wyn2G}: =[Ë]nRѐwuF݅h;z.0& %j|@tH4QF ˣ·]3^x%5CN аGKsOv#kίӠb KVO# =.i32JWyZh茇yn<׻\\nNu/]jwi{B6:U"}ȼzmؙWtՑ!;nK9&yFw/ȞniAB)@2닠&5Tؠ%d1#]t%*pz9:Ĥ9b˜sPW;=׽>.IQ~Q1]HS'r.Px"Iӱ bl_F@3`úf4/cSw =8S/QA6="|;їXPߑ$p{{ ^&_O+v+P웵<%ʠ;x9p*vjc^`Shy&h5LA{";[@SF6g1+ 6w}c}&ްN4C5 ~xK|fy伥[#GRJ>o8nnriMR o[L\'.m~|$uCS Z.ӯvm灝ۈtX7VTui9}'=' kpe[p-E^G4fVZ=7[tS\iX;boi%t`&_F"' RoSz7N Q,!cS:k/_.JoL`Qv+?Cc6> UR#/ ?|g5j\(<Ҡ ^b͏>uTh 4RK_㚞[fM,YM^/A mWާ+T¾=&ud*7mo1G?켮1gdYKվbU@Hh7ѥ `>FCؒ$SKh p?vk"7f+S%F<27rPSm\Е AZޢKi7^ab~K*:%#'*>?uG5ڕk@_:a7kz{{ Vls'rgoWwYڧeWR 2p" 7/PJТTH?hr.|OOܨH.^wy/w_~юY_ir#o ?AShJC'="${z8wDŽt*|v68Qm4u6} [ZrrRNõD:g_V}/at2; CO]\5^ڱ~ۉݏ$;l6DԂ2w-A2tk:}d@ɳ(՘@>49`GcO| [;8E tEI-ؙ)7iUhv|#%F7tʓmA }[EDO9OTkOaN-BE\X3|awaZn3tl$.r@Oڙ2b9_Gը\Fejf7ocKQvoiu7DK3r= Rt!;:qV5Rs뼟}5{Zi7:9P:@W.jfH}8@ zH<;2tv4.yb'~0RE{ WڌT9[g>ømYMAj~UC3%rjquEYd`v̟g0İ9obK:.>@,}Ěw,UC%,ܵ%  -u /<_|Iհs_n x*ψ/<R~cY]`BE0l@IN23F^!|a/+3.=>ӪT AoJy"2i<aѐ+ +z o/f'r N$ML҈dnrTƷxJNj˜itЪ@~+ȗXNz:W:塷+%'v$&]}bd'afo8zxLNYܵ6vpL7j*S9^ҔjzjgzCX+3iu')(*>|iNC3Rz804,.x[t{>˔vZG0*pO`z N1.)?vяD| 1S zi G4[EdWڕވ/؍~@oOWM̚=,*WfWlJg〮QֱAFn't4 Gd3ǒk dwcO{5׈<ϻ.%o/>8;7V\]UoLO FgTiy}__:ᅵދbm-H%J'S(ou39Wf}7=x$e~lm]m=Ըo!ؤ|4ɠ/~53;ațz/u` ڨU9gt&x}|JȝIc;w`q^'}D\^[("g]=-|7[~|]>L禯%îI}8Pы˕{-)m-_sUOvZ/R5$+XOx16ϖQyoZ{QE>CpSqZ$9W7z7T o˞#8=n$g+fSKʱRXBj}'ݟlݿnL?3 ͰK~ }qIL}ƥJ㘘~XEz̟ػ8"^R&c/'f?KH}!TZ! ]3kr䓵 ^ĺ/b/B-} nulD=ǂWռjNiZ麻wȑ~f D>>%݁z!o!}Pי5g4eټtBfv ='(-2o}gc@/6{2$R`Y\W&:5&9k9+JCvw>_V9*:ѷdT:**7zqŀydR5-/F _Yt&oy`B'-1Jd?}[F&gp|k b搜Lni\|W7tx.#Ws߾_Aݗp]Dn46TqqsVD~]lـ =k|t ].}KVbڕp?5{| {[z!3?o}f| ptBT9[Vlq@ 81LБb||֏t^ P湉7m6By,_|fBZ$Nj*Ttf*^}Z(/Dħ`[_fT 0%ub?Hl.kAޱ*p Cg!̬ D۞H>rrc ym/k4g h`Ur ?!0 ^~nЧ6@{</ECs%u#Zԑ]boat"iF}1$aރ%/] @c5,n$AvȞNQu|!}79F5*2Q9@Nɵ8ENdhbÞ^@bڵEQ֬ks1#peI>3tZ~nB_7ꁸpw{$E^HcvHC[~-#u@>ctt٠]؁`IJ~B*cg]BWjF2G{I,K#|ꀾclT >}2KrĠɯ/ѱo^ѿ]%~P]4]{[c{qQrZ]3aˍ<){ ]b9g̝YMv9:3y,ЊF]>W3 ^4:EX쉴kN4mZ+7lw:ctޢ1c{!'_Mg2 4"x %YZ1 }+:}'e/=^>2V4TjN*/ 0|FAHN atlY>Z XXʆ|w}~8RT 2 ~ч݃ #C%s}:EwGj3.|۔}@/ ^?ą~Dٵ%/=K*~v\gYS==n=٭Z65 [d9=O3ٓE}D|y+'e&?<> 4Zl_3*mY5Oy%M2O%'l׎, A | Z#˶OceЫV*ColX`Q퀃}"?tfVlȎ3~y}$."EAvzY06s\d|7v*1 O˯ e1N ܠӓnyA %Z2S^gMcflx/RN~7X^?_ 9|q+ěDJ>>y $mȎt }mANiyBCzUCŽ$BmEXѿ8#~P+COv0FV|#ϼc'<~GѸ麵ĥ }&RF/y=5:|իjhs=ka:%`3.z.F;}D?=Ӯ&8xK.!A"w/p=}]<_D?`;C>.(2uG!Ф S}WL|,rFO rAmsNYݦ2 P@Fj|d'EDת3`| !0MKTZt\-&BO k tBE:m=uENZFe@SoּZ쀞 S.ЉT9r`~]ee@~j@uhO{#ϣj؋#˗XO#/.]p/ /qvQ\Dȓvthva#F6R3*.Jk!) s-2FuKDΩ{Y y "!7N6>k9%kyU4ΝftǎGGo=K,sͪ#Vo{?ktfRI{;L <{T}8ʉJ\hX.GE^2Q/_G/*:D.s\ZJg:YG !7|u.2UԸd}IR2V:}(aCF#\]#]w9*QT/\zAEȩF}4XwޥpoFyB+q@Fb#cBG:JdmNbhx}=[7yDAzo!Ouù<0#v`N>A?"Yd_l  .0g?qIkfOU>Oc%ؑ9H}y_F}=IGG zW\O=љ,XF6^F//fƙ6`75zG5CtXWpm^[zR32H|s{+Q 9׎]+} ;EvFnq|;3ub,īhxDϋ:2 QNAgUO\_f<=mW>pu3@ЯFtW]6a1WnF^v'Ԝ XNZ9[>h#^;:K~ `ĘiYcFoi?vBQmsFoC"|5kȹ9>Qn6;Os{'rʮ|z#} cuyDq o_̄Сոq W퀞[R _I<Lzny O/iaRUy6Hq_O{@oRm"'sC4Ki&yN.S/r (@ҾmD)k#N{)hT9YaFzBO ydƐqZ=L{ox}9|b_:UnE[mЊ2,nxQyH|=n~ey !^r.9:B*/o)3j6WT.~\B%  wA71Ead/Qp~#o[om(qZ='d"E.5 ~Kc@yLѿ Kޠ{B`O-.O^TʉOU]?+}o)9z*߬֍^׆!6%/%:^@{9Eƥ o.he+a@O!Z1ݾAgۿ-Ɨ%Nb/ko(]Ӓcbl%>8IySF0\/vYmcmV=geM?~ ln 5p>%_S5 zZ~+|s)5-3 }j''9 –ryN.4SFq7ݰףSzUOڹZz7o[ df|mf~/]> "AESX;]E0:, 0cP]`]6:!7?cC>{7%3~hkFrQ]|xC_!5vqyB.K Vϴ6>:4軿UEu*dKm6X-uy ˡ#O߮}UWp Dy;Y Q4?4|;huF-f_=8J7nV{vYtle1L9ocPԱ3Ƕs#_W.r^4B/QfO.}]JVN".Ҡ#:@.], :2)] 95ِzD{ގ>s5m9ùWމvO L9?s9^F,9;Ћ c؆"tH'u>JG m”S6_Ŭ0#ώY_)+7*~ɴ9I&(=4O\4f3s4XAﱖdМȆ|"WҤ~F0꙼PB/|+h_Xq& :5"j'^c.EXApл3].Jq-$/%EG2"g|r4_@w k\CdܐCcA8pbE^glct \;A3ЪDPwHsevWzc.9eEp=](ܹ3" ꆔ yN ]U < '}CohGvtg8?[/Zz4, ڠkvmԐSFU\ȳ(բx8U-.yFܡ[/!.qV:go*\wi6ryfgeTث8Lu`6dXtݽS"/Pm{\RD6~; uߝƥʩ!6n^ =C >~OrfDO@Nn4Gn{aYKԈ7c5#zҮ<ЗiF!}"gh|vUtv^]yy#QN:q'.rwfGK"J /.}fm7;$n8'͗肞B/t0|mG^"j<*r\@ujKllY nd^估paƆ\f54۠84㣃kxrߠHqG%}< ӡOZ[ΎvFQvsXh:oCg$#c?)ByD~ C#Rw'{aw :uRܭ.\hrzJg\ԍ|m C/'Sݡ %5mCα Xj䕫]ȣ>[/Nf~t|3wHtqmNd^:p`,;]r eCWvotB=ǭ/9{宔LmU6=Tr-~~K@ ZWosA:| 9YTD΢ Ly} h n:]# 2:)K*CQ׹ y_KB3S 8#'3i'g֘E)A^vr %"v\3j]ñbr0Įq0+O9:*v3]! ]E{c#E yqvK%>ߜƺnG9_}F4eSW UŷF&FnYٍnGiͻ5V&Ok.4{^}{15ٝa M7t;4U:#ɊnH TՏ}<9jAz vq%͠7x׻vxW>kR;0{x}F&/t|[ߐh54хw躖*c FMlTOޯ;T.E:.7jЗ^b~E.u9ᭃ7,R\Oȓ/" ֕sn~L-2Xv?uHe3tf{#kMO{B_i3rXLome0(r؍G=A_>_)ю.8p,i/Ww5+r 179]t'#0KE S{Naʚ bo)\W["+$8r`p˺T72  |(26|9 ELJ*c24e af^M)Tmuvd GVF/whr&"=s8g.tNƍ܂cW2vwͲ@n􋢹U^ۋm=Hጝ^XggUZ75NyK.Q^y)iPF& "1ٰ%4ƣ|純+4؍nσJۭNjX)rWKbW|z; |:zݠF_)2Ի\{fzo,K-.246Y>` ^>VE-ivޑKd.!"z_z4- %:;CJ/֠a!?ZZ۠FiT{ؿιءe-Hw{q;r[EC9Y5򀾞6sX]//40tΧD:<ѽfݭ}Cqpwx-O2RC>著n[`L1?F1ݦ<}|Go侉QyǜЩ®3o9FvMO_pfumoت~B6IS!ڱu!2ee ͡2Z frkjݠZ~9\1ĶAQ ޤQB w=,(T jfty"O~@kvn~a;;!--%u{]Э*t7ڝk}.rzFނSqDCùeuG>u{ `k7t @^RX=9EPMVgRZzߠQڡF. zJHྤ\?"!7DmGyA'0MƂݩ;E&rZ/#IA,C cj&XR4xL_C߰9%2/UK?_bpmrh$N_uINʻP\4L?74ªO䩫*N;#O䶜4ͻ2a1`4h$r˪awz`RCvty3R?*t< .7ZMM6IShwb zit)ؼRGVʦžbfn}N^9z.AnدNdȝ]iz]Gٙ[]Bѕ$j~pF#Y׻ӨBx=G;r$W|lquL\il%ƻN}A\v=h =w~I5c ;A7grBUd$qV y?$e[>!ϓilfjkM-)*ToQ>;C<}-j)v2bh;r:z,xRセ獗i[u/-vl{~-8#)ټi\oUobth70@Ǿe`ݐWgc<Ր /_rBn*^ B'' `OW yZ*v?824ө^ mнQ=!+ݗ(:vwG)Fk>^F!o۠ Нd-_\| blZ65C-lneliOѐU`0H<6)0YIF?]ެ6zdy)/e<폨F t%gI}Cutf.6#≜gp\3>lV \'mxVovOWf'F w8 >7RŠBݖ>cm:IOqv=읽ƚ1л.zgnИ z{'r 5lrh!_6^|[4odigTv.tP|m{ij̓~B_A\jeet72/ӯˀfȳu/>?'z֪0>b^>};(IFNkf#pp5¯`$9}vg;4/2=OoػH,5\ _gbq/hk3XZPi x֑'m^[Y2hprG=x*q"[ -rG*gZWj}O $}ZҼhM}q}ҋ|_ly2>Co ~,M0ђ/j@I&_sg`iw`w}pz:Cd9 M B_𶖁d&~C-<7;o'WYs^͏2**4u!\֨|S|%ѻOL+늗J?P\hqz3YJ2Cκ|sgY_U%se6r\<}_Y3U;I%( kʻ@%iK8֧5hb^"\`PӷBXC~dk/xM7?&6znHTԠ/x"FErvFb?.}Z;NY7ūBdF1lo6 f ^OZ 3~Y7%I#O&nd bVQ7$vc7\On'C2zB^"% }*vCRCģFԜ腼_:T }:)S7<ӗjл^ȣQS9j m %_Tyў[6; S] vפ-Ozc6>V诸@o&UD8S]eM5pݠCH*">q;@u!+{μ p1P< sse@_ z,:5`ACz/5~}y8jJgwUI dʆDϰ=FqA{ d/Vfb+:q5{tN?sn&O7r%EZk aSJV ,= oI9u>";A18kEgFnEކA lj-6˲FW $Fa4gzo{=v&ʣu=M ]l(5?W y{7B= ! /[:|.HU"*v[lh9a@!oGzcfuޣBH6n>-!ꋯB\B--'/).rep[\wqChBHMvI,nв2ʆ4tvtV6# i-.b#ܺZz6YWȏQ;r^ κB}˰]t.KɈ ou\˩AZU  .Ѕ]+ӍecOʹ7u Dq7%]9*gݡ?yE%Nq P\(>rčq=~J&;_u=h26-Df@W<׬nR3@fT4^c,C_ Dv3z^x)6m_tU]sFns n::axv=u tŤ}TF 9Yhz z@/_΅?{YxD FkUwD;I]K[_ z]scĹ uc+􅗕p+\`T=]+͹/p"G`,qPxA$aPvӟ{XzcrCc,t\_l>hv)\:=i>H7t[mteGm{_@?H   \lGN!TC P%zu2es1ϽF>CztV4^R;^'|apY9 ;ߤ#&gJmt/!}gD@b+ [s y ]K zH1Kft { _96]/C R|b1OO7#(O)i :!0v;ţ4]ƠS (Gٺ7/^f.˯ľ~w^E%A3hя/I<> u 8%d 9 vgO}F B[޳*Ŗ8u^чA/-h02:k:Ӑ'}lev:(+ζ=vϕ@\Fr+5JݐS0txANщ. ^@QAzF>]fB d\J53 =LN-g _|!^UI_ECf;r RVbgh9x*LLMFba G|KЪj,z3WL-8%.)tӈ,]toyz}9flu!JC7sL0QFb;{b;[SJې[LO/UN?sA]{o貮wݞ-'F^ ׍\jar.zE:ޑ#ړrMǶtZ9M 9-ޡ## ,Zƃ4Ho趖SJ:$y 5CyY}axLn Ry ݯГno0z+$g|Cו7j] O#\"ȩvt4納L)ss+3yIYkehU2ޱVCe h?]-ސTFK9%xD}C~MdCNŸ@Ϩ8\}[`w;g`<5\ Eo=mt9UYHN=6콴[ڐ Af)b&_~Y_4 _jA|>Ko{=hnx [?wb㸜R';v3mk2/jWEݻ0zdt :߄o}شqM7>;*^~gQu+4ѽc:cMDouܖϻ_You( >_ZR{&cT輒8+fwj:ok"C[WkGVMnSI"ص /Ytz[gV wX!"'VL(c/D{.ߴuYQ_n08|lO"{CtO|@7cSf4/zP:HH{?eTV^W~:_3̐#punGgh}HK臣rs,A ^7_7T$3M&dz0~+_rk1'i"+A4)^YvS{[WA|Y NXIBfќo~svfKBLjk">-(.ikJ{TrLZ!@4;N[oIڙwl b7hM+H$2=Ҿe6nu}ՠJYٍJ6_'C/~LQ[Msb/$`؞>#m<%: *Jqh2Ÿ:xT^UVWޢC+4 ?I) af9wt_1IՔf6pKO j#cC/&I IYl{{"}6'GDmMj?r9xc/ru@F^ײamet2F>yhj"%hexhͥz6Гv "zaUGg})٨8rA30H AkmЫ7NwnȎ/슭6l.#ܥeq 7ieyz9(vMF; 2UE{t\ӐFߑN9g`Kl5`'E7טn(ted}.'Q6O6U];Ե сDz+rxuv(Ɵ}SNr eʺō.Lez^Dc9:i2Fb\4_lh}33B?aJk{_YFR /qottNѐۆ|`~~tKmqv= F_19HWxG.ASF2:xR_ IjhxSNJGk9~)7ޖ!nuE3#ᲃZ"[OSW^=Ig m=4L_%agO_,/]i˰4:gXracj #"}Œv$lGΫ"] 4yvȬO/o3c4^#oݏyy ;@^:ؐ_\TμA#/%e@um_Vڈ5#lS2?{gL"z!֌̇_3 e%7pW>&2ݠ_7u,_ίu<&pV۵Ș3DB 0ͺto?|6`Dw0J8LoׅW^$p&¶a@Z@e+J5zu>71z gzGCbft^ 0kWf?/w^mecWԔ}*a{JAɓ9[1(t4 5(֐ӀfeC~bXn|\j!h5:5tm^W#c|/yU=7,w;/Eq\sWKtwJ :vK7>q͹N:Yv}0kg*i'C-R\AF^jݩw-6o1rЧ^wSKHchE>7m]ԭFNt49bQAU 8K91V5 450*eB.QUןE끝BƩyC&;v=>#'y YEކl烔g 'mJel4Ҝc<͗lT{8 zP2I7uMTx[%A2@>}xzbO$F}thW =XNUWL7Q]<=vGrF~T!tb[P;*tS˔60{Rߦ>8su| B[ϓ|..9 C'5ިzf%{ӲY:? K3WlVE^z&Ն~b٭U+@BH2޼k4o JM_3ҧ60EZOn_>O-\OWSy&gʌ7YX*o۬i/zYSC 7<_CYнގSFY3'?օ0ׅ*.|<)B[{.$o@_'R+ff -6S7֓ieK%iZF:/ ]^;C^ ǹpKD*|Giz٠/@P6/W 6kH9sn[xthsDϬ֐{ꇃؑ^X~_g~Z>uCwE|.g-e{8kٓhI(S o>+Ԡ;m+W?JV=H82IC.]' .x6 uS-?ܦtûA"~w="R8t-*p?S9&Ex /)}iЪ}fb1=9m6wi~ -)y.%PhR١ߚ؜j~1΁;Lܬܡ8=7v(m&|"ig!؜^gp|PeqFp L?_IoCKec?2ĪC[vQs/BO+͇]^=2] }\'ngi$'pjk0po{9֡9" *[$ozU]Fȟ*9J BuX}Vaun-+E\AOf܉3|1Xw`9at~4~UlF-4B}z :if'NywtX)QE!| j|"/Yʸ2sj%Ud\ȳpN#h.N9諲6gHӝ>˫Qwp錼@]ӂQiͳMr\7qȯ3&j\\qdY@sȕyEKhynDANy %v'r`v 6Z^躑V;ȉ 27<(y-ԏp#Ta/ ta7vѐx(, \Dߺ0ݼEtL'|+䲺DM'3Z}-㨟D;I7ʆ|E fi.F9f\CӖ+]jl.Nhݞǎg[t~-R>/fDs:N1 |Q2|db?R2SEZ}nÝ?^/O[{"x| t$xS e={׿Z94|[yyֲϫKNm7%A>suϢ#3KO^,{'Y~t|Kc\%|v`^`YȌ$P%33OpiŞ?6&cSʃ'*I:i?۪gܫdbHo%ƑMk)͐m琜 =E=UtzX` p/_vq7-eDՠVA"HF8B_=v~ƑEHj~ό\T>\K2{*z[{pw]tbBe.NkS~,^KXe@sK^;k5zixLr@_h. =Ǵ&jl5*y>j2r+m*y4=46 #T;3q58~zDMTW~6\6iФ$]{N2%:L،?${ Bv#6@: y?/H9[Hkȉ ;7q`[00LI+kHX>[߀4&*7˜n~Q1պ{H}$TC>%|=|rNhI ;O:kvn5N|K#O^0"E D;}'= Ak. ,r>7`6A^ J/#yyό4\3#dW;bq8*tBB㸸=yζ4"A]gӋ"܄tZs*NMǔŭh>͐+0>lNd431{s >i_/4w wi}tReKިGE_$32:)u\tl[]?"WM67(Q#ېl:C!Pg߰IsC~)uȝ _..z.?s .# t)8FuAӽ (΢iu;yΎ /m-2T]rY׮\.<N]mWMi(lZ W)tYTKߐKztŧo>Ӎhꮦ.FKuS"e٠%0>jn}#4z.*rbkm7.QoZ4!lFa765,<@Rhmh6l:cTƑ0>5P\B_O .fA]_Vy!mm;<]mv!zߐ퀌.7r]*EK:ˈ^Mi!ъ2 ڐDLz57 ]zoTAZp_7ƕ 9*>}fkTBZiނj!'],C;rHEm:Mrҵ7ayוV8nPgFvhB;YՕ܎וQb^ZȎas&-FTh )%RnuaT0EF7xzӷ1Q-!xuF@ *-6oTq7K˂~V?ђi룬4(0z1jB⽂_; ubڐ#M<]dGٽeb GoB;xG؋]H.Svdȩd{Cu; xg5J.ԩeW:mA_q 8Z{0{PqtXQ7)1gIw-n&dpJ"ut~AN-;/oOB:=Bufl^--rjwghg[kK]̑'+puːxCu0*ަ kbmE+Фg5[:UCOJz(ݲxZ8y\Zvj~KRB= d=fK]s LrҘx]etn6ڑkې[ yŵn[ʌ N& &hU6#6]$;nhqʈ7u]ЏQ7ڡE@d>c!{ { ,2tĺ}SB/ &niuդ)Վ\ؑSFׅӮ7;У{.痣B\ /Tx>Sh헚F~ H2AGUr'0 i0% =gMJ#Ptfx\iy;:}Π0.k3J9\[*}N먮 t.r\Μ1Ů/>=W:Ct{Lj ##OG/c@.jٓ~]KæaVGb #:g)CwZH4}+3m}>OݢnbG_o$A.Gs_Y !F.ץzEz&53 O,E~HNG/zHF =үnzw2K ^.@/5oꌡE<^B-76YL7|y6_zױ!xu$/A:G EȅHGAO1"Y쐻yϑu/3Ӎ4mЙ-mͩϓ\oGRcuKZ4xTS56ꌽGz# ysy`h(Rq깭SHz?,ؗ/t1cI˦ٹVnKUݮs{khOQ~kg!wSpH? 4n(?EKKiZ(HOS3IE n##>9ȝ8{\f9z"ר}P.N%FEzA)!Dnќs΂\(|wHTKAޥ`w6u,Cs^䶘:Bn[9CEˉV)͐G,-\UkD%T|y:?N;#siؤY;?5k/aQ6}q^S}l@3hmގ ]*at篷h REd%0֒ hFDblI:%.Ao*A3E~I>F :Ij\b[$^VnQ^K&OCK^8]]+]\ Sۆ*͠lrb7rE.#.=SZ\%u;i]i9zN87t]+ыOUdGu \_QɗGN.n|[٥ 9{$? QdKbѯnt&SڡSF6 Rbt|OF-VB- kuytS2>ӖݻGس:r.ÒqVd,#uQS\%.t*Uι,<ʆNWh(k!գ*v+Q7Yi溘QvI@&B y[ypA*t[m6Α 88l^GG|qEkDMgt]pH^:C:E)n~"Oԡu] ZWu ^G/ְ:-~9>!?Fmk:M-حNisTdoi"˜FZ :"͆ݍ[ QO 3sFAaD WY㍜x1^v!OO^8%*A}7v=mWnKZqFW!~QC)=w#uOȍJM _I zM)ޔ"cݠ_2u]);h>?S;4`1WkhFr7y =OVP61M "c^˘t]228¸ص#Lֽ@ٴkȟiv v7eMmR1/w ݘ0 .>C ֊ذzf%Է)$7)*C^ܥ9~~=GU1G2t*׃r =";t),+ɘ"Q w!v7rxAx9FORѰi;.4wG0Fo~|=FQ{żs,?%A~^DEr^cም :y{vHBFu5/[)g(YQHEm|١-=o-ч#y=kϔ]C-ۣIС:d\ n l?ЧV z+L MTz}]ȝ/K<ݱ}O&=g}gh%2~_tr؀?֌8;z;ةBŜL;K(?ޖ<#.x*| V蝘ў5Ef+C_om&v)bM;vGռK3Tb }?׾&|'|d+-f'EP_}-n:;h1çf2,z71d-! ~+`< _^ujaZF+7㶟N&qFLl: ^* m2K}|jߏNa\qdZs7#36e̢Q_yqԁ..^Y `9-&!O6eNkmrxY/|l/q呛 TLmDwfl_@G~g/ϮkѥѾǡy55/A݉}ΥUIc½]Lg=R❭ dUx zox+rRsڞe.414 CStA 4TEZ_\y;(SITo6I'my`2̏q3́ |czϸ 'g4fQجLd#jDmIAhzil-wCs &ksׄZG.IN: ;%9ye#Iky ܶIO9T:NJ#nK :6|Lw;Ym9[IazN<~3p/]}'zYXmI [7qԚE AV8+^p_70VrEʳ W_%FܡiAZ*SENA/*m+з=WvE>'|&{=Ko!*/vH rM~پDFEzk \?~ov& _׈8[GCP,LKLQ۵~ʲR!{N/4_ڊ{uX+U _50zx-rsmOɉgaZ;-dD ~`*ʁV%9g^B+yIVOu orNB_+e|]^βD*4?M^اāy4~_OU;hB?.y쑲Qv^k,fnOCEA3uT^K7a{lCjT'z4q8^Zr,л㧼m{aYƬGN-\}-5MHƗ1k;ͩZ}o|hP;ݱ ?B5puH/[x@? Gf ASs.㨤uF lϪCDi5_oV;ע?&KnAqa|=clKȟȾ , B"![EMxbOXٸrQ2C2O@lEv=s2C H/q>jXr=c}ef+1k#/2&_9-3/ A)L6=C򜤂d<]kM[._3Ř Oz:ag7[˨7a2l[_@^lCa %gJe''E(X ,F|#/}%?9Eus749AŜ\lؔ˙Z'8w+IxP t\QhXGb>9Aվ-**ga|L~ANt`kp^u?H\*ߤϿ[@W覫mOrp}HVPs/3Wk(>RSrYOfzz7 Mt]g9 {jG{+޸a/o"^Im^95Ro1\d>vE rv3(( ZX!db .7Zau-^q?s_ el˾ Q` oOZ" L{}ǎP4 y>gە>9ʳ'NWĵ<8 (ӕ޲Q hDž-swۃJ= h)5_-gE%= 텞>]3W^OAv-S0O-J) ~&1l,-I=#eu%ӱݣ} _lVZj鿛L*2 /xbe>3≺A3t` X?boR>zFf=mP9}oAo!=Q^g-}WHD)eWktX/ih mx=M3C]pz[T^{N-{b ~/[1tԵ9J#/Iw:W/.]⍝`jTI]h\6 ĕ '@b~W$c@5կx˦B-ua}{}9Xr^'y߬t"g*%d^95gQyU/7wx5C/k[%IJ =-\  }IZ*s5I#.تD-JQ[*v=g;M&)4{\FC .Z]ޥet!cD>عj"=Xp7r^l3#ϽdsBoLN7ؕ[]NjÝ&"׏[F' .%+3;ȻRn5X&@)ڊ!I6^w ~@oA2IV@O7Rkԯͳo-7}|˭1fa q;@W(Jnn1t⭣9udgv"_Mjѕey A`E[VsE~/M8cB_QOBgjr^8mP嬡r t7%\WyC";f[+.vENDK[=ߢZ-\r /MC ezv[tqB|}ժУ..݅0zLAh\(7[ޱ"AW/@n1cWN]؄;KBݗF#6!Fc譮'K3EП4As/|X\VrOR5\HTg\ ^-.s`V]8X v;>8*##I?ej|u;w$e[}07hn| P,\5mwT0oLz"uaߊ?lι"=i:MvH1ݵuU#K ȟhu 9h`~B!{1 dK|ԁ;r2lHtB+p : r P2tG96yƸAG4͸Ry-Ů/D{5K#jt`u|B+tǫɉaGC񌲖 /)*~? ݢ6g~Fkȝ:vm:ۑ gEkpc(rzA7Hq yqS||EhGAUs_o[ʠ>MR˒ȉub}GCټxa6ShHBtT2?ПQUh)h!PEvD^֘5x_kpGk -!\o͐ޡ_(f{}Ʀ(isE"02MJ+Aд6{:0qxE$&qА6KknkCr8EFcP%RGw=qi^ȓG'GܼuYTw }@Rn1Dt1k.ք-깍|%yiv5lQjIk5^OhiAq &fo ^gXT",3 $9?g[rlrFV"Ll49u[-B__>%Ƞ*HybWkе *s iZiu-7dQ^ Lk`d(uyJk[7|/K7!'Z#Ѫ%s$ I.r_RLAEd 7r"Ÿ9%lhZ4:EvQrr}eIOc8ʥ3RlET)\`)eqmbK/[xmMj$>WQF rhBMH\IxL_fpG:)|T uOmJm\Nd{ޓV['kҝ5GoqLN'opxC~q51T5gARc~X .fԆ"-z' W^MneBw/;dy :H/s <|ss͇>Cd//x#h^Yl34hll7秀!m6"ڗ;;}0^\JD hZ[Ukw_+X>zrʓ%yǭ ^/0P8pZfjϥ0hzO/<vz&l_[hz-% 4(J{˩)dR9#Ùc/kW bw ZUBOtFn˟VqVz_blص"-}j+4!N`W>b~2(?@5Ni1M5UQ/TɿXrnbG7_SM3 >b'Č^sA**Wd~A>+`b oI:\>zH0(tMnvy"CjЕ ʓڱ)LުEokI;,z?|o$X=WnỵVFl~y$پ_M%>ym:ёݙҿ#_LwW/A7'AFZ_cok|e5l`H4+/"3DRύW_;hEz"ZLEgA'8ew53a=G|:6az[9FT~:Mp}4;Y>'оzkuSF߲XAOa]?ЏЖ~.ω6:$Up[8+\V+ݬtnCN-J,'55\U>XP',`b'x!O +nbJ=Ni<`ӷdk! Jxbع>S;t=tz@S ޘFoq{b)}oΘ7ex-en3&imFw<K B/a[M eBͽJ2yYlf3~M*dtEpfњ7yO _xgoZ?Qm,5!אZO!;tnkkxҨr!NBѯKįA'#BM.,sJNiŢj?,Fc'<I.\v/z e1YɲG~ q1}R<M Y9:ɔ[r05xwzywN[a_YIQmF8zD}%L5c"V{"֠& >,Fbzl3L{7}]&9Ob_<ѿxT;5*~\5Z~A1P]'\r%Q5'r9XoO0rCi'$5fSÕ~`@D/ fkTo$S~_ꃑ ݕz{-?9rR_T+>3,CZʄrpjKL; g<:l0nmXъ=B@}ѻ^Tϑ$kR^I.=] Zǥ1lҐ6bK^'֏^L"#]QD#axF3]3Am:L6QGDoSeg1m6 /J6AaE?ij~bI68;8pDgzܯ'n~/fɷ_đ zrI,<;n*yR%uxƸ)\M0~' 6Ke RSsJ˂oQ64>Cϝ;x׏~&FQ?O/AFP.ϪT,t{%u?oBPi|_ku`?R#‰}YPФ!tcSʨ}[\]Kš /{Z}欨l6I!ؙ16ٰq-_Eq6%@dKF&Tysߢx3=>HuBN[wj-46бfz`iVW~/'m/sic]_cQWml:'N}z^`*YrQf`R7.5q%ת ;K/ P贽|}&Ђrgߪ Ao_8oyͧ@ovyK<\Džۨ=Йa9׊"}Yhs4l}^CW]G~KX2Jg_g@) :_!*rBW >}6%25-F ^.D]>֡1v5].\wQ9('~8@J3QD@fvQ#bݏ^t>k܅^ 4JiIɀVIne|e]tBJ,:gw.{%lpq M*qX"t]^Ԧޡ.NYfZ+!D7EF-r9αdAe9"0зp>a~nz%u뒝 kDyܵw^I+ԡVqVrY(`r"pWnH/ȯœ rH,Y D i}`wҨi4pe`辶'Ck[r^ia芴is HL!g4b>9} ޿(Ҁ~jJRm8O4(T)3zi0.tUب ׭Fr֐kAǍ3:n׈ V)_]?v&GSIhӫh`uΆi5H v;4VCܻxuʁM5y'rʹtj<5F^ eʢzu=nQ&^ԝ!݂RRi1i:u%^z_љ#gDz?OwF$NqutLtuӡw޲G\?LbZ6'~#kJG\pmN:Z]@@^nMSZA%.1l3yKAB8觻X~zF~;8>7cOktv^]4flT?/0y]GE>rkٻ)i]~s9HVNG$EY=utdJ?9΢R RLp[=du\Dt!km+CY: FiIâ59S~^@E$V-^m 16ǵyv/~M>vNGTW@~Z;Aג@~7.WQ#(r7X(QО.AŽ}gVnyio_@SGu?FO=#x dZ󮼰.zW+]AsKƗz;^ 18IͥGҩ}@p+x%9eF6_S}K5sk-[&Gȉ/;vBÙV+{U#k셠:zR=5\1FN Jee,;NutQJTNb,G^t"6FQ =ma]*-y=mt g6| pr|WNO߻М]_٭>I9׫>?[no[ uYwq@.Sl\\7d36n'(o-#oy [t<;KO 1rDj~uˠ"}^C7l|%C9q]5ݮFMMF>kt\?Q..$@0hFO苫+5r#Mw+2 6N?;ڰ bre m@os9oa@y;t^iFdv3Vou9t*2{c/ח,1~{]A25~]F T<[:ߥ^_Vo#3Ԥ[_Y=Ry]t=݇z*hٴ "g|cw(4=gռ˨"{ë\ŗZ?`oL;G\*rh^*=Ӻ|E@s鳖vP i} ˛a<\ ]iŭ3mfw~ Qd)*4mM9*<>Rf_T@]"(RW%ը.s"-dꮍ*M? E`iqٷ;Ys+J:~n@e`o$A. e$/ ?KAQJW) ߵ\J-Fݑ)z3B-Օ,ZpFj'|BuēSXQdhbwn ][~[-C/z#]tFtʝzA q~M./-3[Dԅ>۲MЊ@ރrLctA醭QC7r*C:EZ)zyʻ1\`p϶^7hB-#bL>kvχѧ]`sV*t@)ֈbbEY{8%}|.Q%g[u}2/L}EY.蹘6Suh%e*| }0:rd`z]:;̧9.3e#vzL]wnj?ЙN葺 j]Ez4`J,j֐3>ssď@ny]/~Y8R丨TSn&1zG^CGlqE{4!,\2@5ޤrES=yv0BMmE>zZQ|ܐ+}SYr{_id6/rNzlAĊuf\oY=czݦ K?Čmt:tTN(j}yIyk|pTvzFNڒ9r5l :%wD/v.vMICS \F~\49C*{(Y=wKw hQ]>|\NI.E'r1}nX,r^Ic^ҝu]=Z9 ے*G xz&r NLJI^;:2<\r"޼ҫIJ+t|T}gLlKIm>%ѱiT\2}F;L[LrB L+1WCR}e]< } ~LR3ݵ/rC_x.CwhYcI_vl!&]*/WY:/u=b￴LOu4wd`KI+#8=A/5%^Gk$w>>K^V/yB/v|:Ny%&@ol z8]q0%*CCO ctkL^k ?:C{tKNBszH9{νh,' >)Uf9ma03u2^儾oTө8oX"$zB$eà$e;kd0>5)Qt4_6dˈHB)7=y=ui~>ǨvZ}~QOcSٯ^ *FX;V_kd5|DSō ]/]z(Гi+%ocA3Y#QWW JYad.עhUp(Uʁ-ɑ&y }[ z^'Xhg>Vo3܍FiХQ%X }Q=.5*JU&_/A^/{RMNwŅ7X~?'IcUz E?).akV/i5{Yz͋L-2 tHWF#!7Z?ұ8fC/9pKd]~oO#zKDY A {]e@ivˆ5!@mM^6cǙ CwG{عn2zVFGeT@I2EKjة˲.qiFH? >@FVZKV_ߣIrz{|V<_Q3rq@B7dʎS@絈1!'$C2]ƼF:<93Ǝ@ޗ4 5Ҷƻ?6Oa9e5"\)\:>F|1=kP| gD>uA5Cp9H]{d%^7t6ܗv4&:wr;8z:+aصi='OjZс܂%OK}4y2 GH2? ,>ŧ-VvML\tKΠUrYnw B2p;: o)mW&vդ(H%X.tnq lvGK7_ rյVEґk=GUz>xz ۯI奔_zB^?GBgKI2f#c &=/"]LX eT1d1莉zQ1]k0D]끼FKUF Gsҏ}GQq6 J3H \39G{u"4^vv1=?D eqGOuA.&񑶞| ?gH]ɢ@{BsY@o!q$ݵ(4xKD>D7 vg+or5^ay_r=Wvj^eهsO4Fv:$NѴ }95;EzCNk@|ӑˁT72}񍎾G9hfLѠSl`9wꐻ2 47^ ORWw_$˺]y}SEF>rd~&IVb؊,ѧ#n>ByXA滎l"u zBr@riՏtԨil9kVȑђ{ ^甠I+m0Bitz}Aq{>0{00Aс|ZA}dA.04=6(ܟ{\7pz!ƀ0z.T.зecI}/E*w!5z @z[ݪ}}& RNRgД6'ٟh*049 L5}I z{D荼t؍6NF^zŊ}.U9v5xY<зZGcl蒙ƹ4/ e˨+*}g\,ȯ;ct@R.~nuG /[S5Q\`ȅzh/#B%i-ֆ|/_æLӱ9 ezhы-c1Ǻdz:jF"qs[V`/HLu+?ˀ) !]~<FB.pn1>m]L/_@;hsNZAO [eD9澲]˓@Jt-)䱮KYczHK tz v#7>g݋t;K2u02u%1r}IXK7V>ePV!stDKzKplk"/}D+ ~Dv:xCː̹|/g!_׌;rї]ˉ|_xi zo-] ]Ы/ /5}7uˀ>6¾-[i. 6=8:Qc߅ͅR$xaINs,#SbэxNзKfZ?7rJ0B4-04_n|:F/%-*zyNj ֔9e2rZ [ ` GKw ^ߍӗ(a@ rC~zL+3+?W t_)1K^R꾧u[b >p7hiq p}1Jq4X{^)CE'E+ku5紽3W3IP}!Jh kV -Hjk_[dm+?l ͡9}ѧz4 鋽^Yu02REin:G Y}FՎWw??q Uզxbֻ W-_dAō=h8|\28CPZ>T)^k}z-doQh!Tdj_^VV>}JR?&5CoTn?22z _BAc܀xQEx89Le!/Š n`o1W[l o.^<:-"0?`UއNTVǕ'T@N ˾iܯ 7=hⒾЦpHqf ?їpvak[%=eًȩ1:/+7C{?:Z%7}ѧ;CId/m3i#ѿCbܾ4YҤ~>/,fѫ|X9K*I~%@+ 8r5)?^|$nVw-г?4K"HVv/3G?ʳ7!2"I%g3c G|_l'.BBkOtWQg/ Hz7I~$qB%zw.J%^ղ4BNuՃޛr66`'M ke&Sj uٱm6(YѦ̨,˚- /9qCkQ|+a\?,?"}Tõ"H ax 9C> 6Y|FH5䬖f= HFnG6'iv[7Dz5qy"ycoɧx` h im!|,+Z8g1l2>,sO}u yHOψB/Y9m@y7IY#'t!?>5AQE?+5a䊪. |s3_+ /z*1cS?mw%7^GܚϕqX?,ba;3;Jy+.{g|"3F~{|!͵ep3ENލ|CQ(!#k=Nq|>e$f̜lݙwͦCpπ%=!v/TgK|.3|OWuvIoy(WP2|VVRRyc0Ѿ=J^ {DȻC{O#9e4CGQڈ^WbR}L=VK)~{!߉:<$/FmEޠJ7'qޛVع08]Br5`/1>\صqif=;l>Ră A2Qہ=Y:,k 5jBnKUb =jvr$vZݖ-BzBEN'uunK(;"k_]Cx肾sI7\K uWe1K2 ׷ԁ<iĕ2宝sào_pGDo]L|SZ Pf  K*tҿW)=H{=>ayfd;7J)G`Aµ:ѻYܥE葝v>Ϧs[pm><N05r1Cs_DNіzCnKW=R#C#٥=v^D>ӗXsSP{鎋Tݏr[ˉE 0Ќr "VizJ#5jѧ8CK|@$fu@Ne v-Nug9Y`4oQ.OpK^Ɓ|ף2K$>LɖX_N1dtz 9EU d9z`eZoJ3VsykQ]]ՅI])QeM[JV a1{x}CנF3/#QKȟ(By@KH)rH ץ5Z݋~*`#_.B5/^?M-N'z!'kR m)d[ܨOiahg1>łcdWJd}-ik,"IYkHe\\zECtuuJ.@nWZCQQ>6JM ֻ1.i$\VYQvj.rMyOhA&Ez_{ƅZOO(FRz3q[8 -\s⁾AEd{c##r Mt: i2h/N 6f|y/~{9{kyKf(lua wTgi *uGxb=󡢅w}+F8m zߴDFr_~D/Z_h;ݖd!UG[RW,Aֶ)DZ<%{ܑA_]:삔ϏEfeE2HEݮ,Hy>U.~I3/^GXwQ[d~}FVkj\/N5sMaG#2A|-΃8:DyEcթ~ ~ cŗ"=5ƻ~?:2N9Fh y&03Cz^a4hqZ<]m>#xfHe>e}zJ -LGNȭcGHЫo~ ]^LYn%Z^ś v;Ҏ#'dYh+j=z"϶ф\S6zשׂUe#_š6jгv@wŮ<=Zoa Zʭ!#wbYsd`kbr]WCoȩz]AO`Z\Vx?&A59Fxϧ$ #ˏhg0U refo&uyIvvѡv@תݾk* EHK5_S^~聞//P3~AjET}3H [\FEqH5{qpuNE,'e`_FCwN{ً+F/6͓EN5wi֕?Gg^t^4G"T:/2]*5[]vr굑c\J3,D0ltBԍ:YbOkpedkߠ75}ȯ&U~/X߰q..Y5"{8"+zE"\ꁼ^"YhvE-GOzqd$Rlv7-:rO>_F{9 ?Dl)z 'J2/Ie]edey]iIխ3<7z7VQ| qh"}ɹ R Zq>"ڐJT)@IӧoOn…^H 'Zt34zJҋ.d/Nwzvt)i;c4+Tz/uW/Tj4_O}ѰYɹx̫/ 4r+rMzAֹ~!.%ϡ0w _fNe5En@u-݈ ܂X +$LW_^\sAuiz,j]dEKY7]oyz輅@K%d2}p{.>Xy#кU4Bl<)HheUEiq>B )Tc l2wJFDTD<kbЫEw<:]%UDI:̤ӃVi\eio^]->S_Gþ!4 8#=rM]]ttpnuYyo^ӵP/ @卼O{256p]Z]I]t"5]m }FEgtQ4[t /n) .9bst (+\1W_iQKd_zAߧ;)ry-g*ؗRx]bp$:UzbQ7u"^,@"QJ]wGo}kGG#t|'wN:;t\\鄞%ig#]Bjz%fҳD0bt>q O;}A}+0)١]Y=79,N: ]hX!^J+EWc֮;wnbhH$=]ݮұG ;+5-YMt wz5l!Z$2l- z ?:VND|Z}+v7NMN;%hgg:ώB'4 gpc#qBouanٚ1:$[\R=Hx];ױ1ou=/$7y1Ɓ|*QQ?6cz 1n`7+ha'r*]t>%QJ]bQρ]hBM{!vtZ h=}vLr q=y%uY"w{vwt0tH[X9oAK1jv7ڣC_bf풇$Mgoo䶐ϟ"KHp/hNA}-ؚU>S@ZZTt8:Fv5'>TdgDK"b-5d'٨g0}Sm.zBkj}E i]Hsҍqψ/i:\.AdZVut^ :_Щ^j=iÔ&LVN[BbGEi|W/t/F?,%iZᕧ 3d_MSP'G-w$kn֧m\*xn4.;C2K]o'|is~}{!q~Gzz6CRHݥv;R|ڑv#R2#E 0rq"Sq݅{zܘN 4rAIwlNR_,r@o+=!#ޣ%X;iŀ{7 $ĩ˰Cdcm9T|dxm<2}Ex =Űz"C{2?Sh\uY #EOgO՗Jbw 3 aN5.uQK2~3Rtż>N܇(e =E[sM2Ri떥*]R*-xF -B*iuw?]"ua 4ewdxy ;GƧy)F\D'r[PVG9*fl;05ݥ@_"%Yi#KzA>#!RGo55(/ȋ,N[$^K&]|oPV{!oKܼE*з՛B7F9:z~!OAi=%Fu,c z87։޳ eȩ~@'$}& [v$3]F |bu?-__tńދ(w!=!F_JC/Fb+wHv/~: ݩoI{9).tq Oڙ8oY9OFbF|@KΠ ~=}CUkBYK?%wMD罡uԽIiRu%R򱺅T i.^}1S8{&^􏷤ƞu #9`: W}aww`[]@o8[Kk?Ow||]ޕr"߅\[o@27j9Űut\=JI~ntl7y}н].F^C[A,? |$/i`Y%ҮlvAWߪ#oXn#ne}jg1vֿzAƝѠy/5Vwpe~w_(rOC#W:]?ܞh^9@K#%q͓L^zyjTgC|Y }Mrz>-%3uҭbX@^#Ǩ dv4A>ԓBENf_wɓ }d1 ?8qDȹn)Hр4@`"C\wxժk htK r8>F\q~F2/8ExZ8yy8$^ nJ J&]xBsvG=^W Tb #/ rMk9o+a/8&ꡳ.i)lq[輪-%`Ph|*HWyuA頏2X~G!|ܥl@FzFð.(.!=A ;~fJS*ؕQ&/ \#7TWי}Kg:˚vA ,5IRg9x SdЇ,lT})6R9FV@s/jn2>ȳ""ta(%a04}= f :G<@vtD:b#>z!ߩ 6 !-{Ș;4$i}io| ]/Gʮj|h{247៣N,TV'&8 9I,\%4jk|Z]Rxf\EN`=*ˈT/14%v0+,:gTxBr˿R if^~u{tQh~GwWyiqh߳cӞAhv]-iL+2kH4rVT>6='AMzTÞHK;,ރ0"c4^ ƫ{Ʌ"_?m/5y~uZr;4T>E-ܨ!]bms݆g_g23[lUUn腡Gm' :WZc>7Gٗ'lͱpk:hvEUuzy_)r,'3zH6_5:ȮK++0$ ):RhsL\$hfoQ[oR--)z[hY 0fz<0v< Ͱo2ȣ5GET]tDԻm>Q+2rMGVaiܑfWJEj]41i+җ-" F>b vGǀv"-w xh"1⒫t~+Iu!q#.Ѝ]E鴹šg +p9xq%2ŁMo-rAK/[m٢T_~ZOF>"u hZ73LQwe4/[ {[rMAO-Q*кh= 9^Q9]z't^w]Fqq,B-ܰ5{C+.n0ف1Bs-kζ~[lp9lN%f%ЁQT{zbaLfmuO"[.oAz\k4.-iW_#3 *jY2W*1nߨȩܵ!Sj=w 7r z.(.r2/?&:zsTK*];.go[#9WE^S{~馷4~GN蔕]@Ȭط2u*5>Rv%`Q2.٢I=)=o0@K[]4f)R7eyjVkHg-RE?Bb3;0- GOFkȯ*iOҙTE KӚ:f[jBmz̪M%|Kd4-=&RܐzvvL٥^o7pSHo_-C9i76+ #w]4i&S}J l wteP&~İl~^QOOu$pmoZg6UEB/[\}YFhSCYXs<[ludd^oL_2dM_D)S4f m{kȶ `HMJ쮣4 M4ly1g3T؆אvtj\j SqSz|nԾ?j:_)@oV+vnqr揿 E5Rҁ~K2nXo_#d·Ʀ/L*T,Ͱ*T$/{+]W29lCàBX}~=S:*S 3Sj$k (5Zïpo!dҡ9yAa =1MUs?,n^($HyzTt(Xv6w}sf7D_n_IG]'{~ FQ)6Iq^$DNIȝX<_ Ie#A_y@ ۿ1g)HsziN5yq%/M} }͖B^s^܄msr ;/ZW-'y[lkLl2p ˧}YEHtQmQzxC5GЭuOY]6_f)W]?3R $/Ar/'12x- >Sr:=#WӞOiXkU+x¿ ^% r0ԑR],98P.KA9N[eC/cOl@BbR m`ckح;qlUiv܆b(kw|f -v>_?+Q0A"̎^b=c'hKS zC#f)m=Kq/K6?б#d-LAn4u FWB6t~O9duO>>AJӝx=ܧG|Nov.xa?Qr/QdFLOBD\|j`gl* {|aC+<(}=,IE3K&;x{4^)r6m$ |Б [~rp?VfYLs&TOSE G{^aS"γ#G[}v^jyDЋ$Y4B>P5N z̘qCߖ/Ѭ,9^Q|\3i .9Zz>vٸ>Q))kyx]p?W)_}QgR:\c>~ myn_WΙK8AOfɌL u&/٣Nt^$Bjަu-y Zlh!UAQ*(ͽǾTNή>h(Sz^VЗa0AȰ.D:Ub/[-YgdZ>U{DowbDiVS!'N@] S{B'x]:U1z^SnhA]FV5/vn3WHvr?%paFb- |_yj,A<4 %4,X3Nџ & !#wom \y sy"Q zG$tb&_mRY㛕C՝%苾$?m1Y+ {4[v?-oI|O7iOkzSqB?#=h!!9N,#ٵv~~x}V!Eo1Xcxp?OI)6DL_-4Kdf|"-Azix9AḝUf2C9{ݐSZWIjnC+L\M5s_נ -Iu gzVZ>([8/-"x0ƈZ1Fɩϩ>- GQk7=~yrO/>69`zu}NSC*b/a'r*eTkI 9^_#?U *Qk_{O(;?]Z^$/q92HJ*<n}D*ңn_b\M٢$I]z00t |lrx2u_kN-N8{4VxYχ*S`=UGZVT:}ewh.q+gVc=`9m {iI?{P% ϖvE }S#Lݱ[! E'gWZҬ?bkgeB- *IIiIȎӾ/}E-M6Gۘ>9[hL.zTSʜl='>Ysh"u_A"A.69OIe&<[h24/QNxr\e"XV!uܡ_$||NDb55wuarŖ%(68C5QIT:R7rJV2;QPismRL-֯(E^}zo=* Yȭ؆l62:c(*凧)Յv_E*rj ?,мrTl4}CG5T8+/)cWF.5/BIÛXлFޗych;r[=ޠ *^n1cޘn5ZߨGxagd|Bxjomx AZ"e{Fnrx;3J]a]4?VH6MlNэЯh9Coxȩľ|:;tR*WjK,BAo<3"+;hrB7z-wD(rN- ifW!'##D?_zH/WQw!:3h2ڹ CWnQQtӁ%Q]B#W;t?F!4#$zߐuT+@aݍs$GQuzis zT#hi2 1(_9'~n%J7hM:mH3ȟE")'.k]헳Io!h2X{#_s}͒u!oE$ 5^TZkX67Xi,s`{DUڱ7Hs,σyCoʈQӕ6kȋ\s[cJdi]zmGA_(uQl`7hkQ ]lȯ_}w;$6`{' 琴AK̗7\$!lx?qYhm%Z4 t4@/i~&OWKUK-E"\|BH1h&ù&HJWDT5V1ah =n^l} 5h_;=B,rh#4ްۥS# uF!똱U xAϕiM^:I@ 6>`_V) 4'K:4I$ R*R:'s9!7遝UF4m;z|կGP+riiՁ_ jOߚ@Xw*2]FkHCtЛewQWX-qwdWk\t$E/Qi3hp )+tPdȉc-pD#ۭ~3_猒{@j1ƅœ&ɒB* j%`/J6tnd 4?õz!O#Ѡ[oziQK$0Ory9e{=Dc"71x4a+9'ŅnЩ,rD`Ar눏<2NkԒK -7tY˘ڠ=[G7K FߩC5׎鱻s9Uߡ"'mz1:KdG~w*EU Kb/({lҡJМ'n9#2boEŇvIn Q#v]g>"QaV/˵6m2Ϳ' ąd&)B@&Uuz.:bBTSԓs#p<^װ}T2cU'T7ғMMU"йd{F-5B+Y*ƾx;4/*m^]wȯh.&E /xch>FΫn!3tϫ r6/OY˻})h8G406;.*1QTC:+2ٚ}a3@uTĭoЯ~I~,u%os!X_Jw_%>nG--.M[`y"83u̦~"G#yau%vxjiܖ5jzD^A!9Z!p󶄰tҨiݐeyBWuTݰo r] {cJv8ʇ4X{<âEΧިȅӎ1#u=;R? V/qϓd R2m%0騄Y_wa{˹D~-o)'rj;7 y K_F'}v<@;bU4ҏ%\iTVyq}긟i/;2cQ]!Gunik{HlIbZGY>f𣏕nzHdAD.u7/~1.4ӯ{4WRflNj_)wސSH :my?Z^jQSteUnEN0Fd;nx!E1qŚ(5{a!-G|B_ d!3N̬ڭ+\tEmR=@}y}Fe@y=ҵΡ^.Cu EBq:gaׅ/ƴ4#p#I ]M 뵳6ݐò4*x~F렧#?Gu|%' #.|%ng>[g:C8Y3b ']l^=G֬a׎-.j7r9vSp^QIQy;Jjw}l~5aE"4A钒> ;Gxy N|z# aЊv>7 \Ɛn~}5S,u:2@8Ǩ ϓ8v/[:BZ-R>X:rv'Eh? 3Oǘ_ :e)#rs#g!:.tK?s1Dz?+ݗG['*o]FҳU޳|aEki~/Ee;Fަ! Iz*gk]uC~.j 9[zN;hQU">A[1.D+:;rzlGy]=gSyⲚ(l;vW{FG4=ԘLz)#17ސ`)]dž9puٍ~c {t] 02TԬN⼎rؠse:wC2?Qn]b]6u:iZz${LQ_*vpC!@ 2r7hً.pJk;T+c&]%Iѣ5Oo2LNeݾd5]l^4EnґІ-~QʮͧH9[]j>GEQ #ym]wq7Ked-Jt]$Rk1 t{|Nd/b/k.f]}v5%1R. w)Ex팽0Ɔz#PB:'J3G]̋Hu9N v@ zjGF?Q5za,#JוWR Ȭ<huɠ##e=GѓxBWH9Eڑ[k̻ #wR=jؽE>926ȇݜ \Ov %$,#y_[_tLuI.Rkt9/ tTmwK67 X}S %<]B.]ֺn :TZߨQ\[&]7t. _K?_Ґ :kih% -7YɅ#IF*'j.}ezaw'ri}EL$]c /@ 9iF_ĄHM>3i1?T E+Q /9/ y 4ta/KoZct@Ik}|L]m50WӀKu)* nur=cZ3KDY V. Ց,o׶q \侳F>%z S*c;oARޓ^mU^K=!]/IUCkߐ'?}:{o3Z;z*=, $ޢ*E.e-^Q }Ĉw Л7r7+:ri7o[r@k2>ȳ-ͮ:ks V.Ei˅Xt7rc/4tB.65T ݖgalsY 9Џul e#]tXn%:nȏt}80o5N22ԫ/Z8r">MyjDA#]uktI9H]4z^VwxCԯ9EE׍bK%pr /E;ll14MZ~CGR zhd?1v?2p?'g-m݇)3kT+&tdj# /7rW7ry{ tWtFuttɭzbF%Q/C 9XvF!wx\bh& \4l~Kt`XK[FӁ$nu@/2ror> PE;t | 8K4)v]G.#?czǫ˵֠saXl]kA:Kݎl:0%n՘@/%%W`Dj-%jo}8qYiDZpf2Z׵׶Uzƛ 2Eӎc</=^7]\ܭT6ifO3WAneruʥc~$~#[<)ch7rEH?WY"?I6WîuLKhoUBtݐ_ rݑ|&Y!$Vx׋kݰFIґK0-c}:-0 caJ>G7uU 9=ƍVgZR4#5P?8 <% |8 +ӡw_dx+GؙKɖх-V3y?Z0OefOq!Qڥɪch-Vh@.ƺ!Ka+B#Iol\Et(v5:v-d$0VbR_tY1`ZꔮnӯD^g#oXMPS}Vrb>OzzސKC"寮;NwU:YN+01&`NWoN5d%F.kvau u-.7r^װBGFY5m@.WL+r]2_ >ߍ>x+t`E8IL]#IEveu+8vu~f-a¸bU'v"9{}#eHb`t\7_N 0m}GN r;67/I#{vki75įלk_!\imFұCP2ѥr!OQW6_7 z :-mcOVK&-h>ѯiЃ/ 6ED3u/A8Wkto/A=KA]\A}Jz9"nv'G@lṖtJT"\ k=JK՜l鸣'RV}s< -OB?fTL cʔiX$8ήЦ_՜gw;Ew >FyӴmE80xoA/:sKiKfbBxuSZs:|ѻßs~nswvOOIVw3B89zQ^ʌ} oZ~8<,~>"㋵ p>B14Ъ@|C)/#ܡf?߃,칷HB_y,}[gfI4PCjg:=c_Ye"`+k`klS\~8 /{O3U x3'ϿA7AzJ G)rMݳ5uq>ffЩ% pon~Y璘oc4; ˖˙3e왟5iۮrڏ$I %):ob_3GVyU'q>Bs' ;`bBHE*rc9MΣ==zVlW-?Y樤Uh5ڍG2)Pz0A?䗍P"7qj`o̸\%AS>#ι̸\Na˩=Q||&; /)x@3zfiz-'M^q־ٱč3vѺi{"KKs }L+As-kv?HݧϣczZX>q% <4 b_3ͱ@e:)Z4>MHp[]{T>#%<[mFZm#1o̠ϖX+Y䒩&~nj>͙5 ׭k ./kd}Bux\9zS}/ -ֽ8Nsރ]>hg7,>%lT Mi(I0{@n /אJu_-*3o`]K/Bj$/R(vmo1<z wz)pݶ>}Y"&ڨ~oF=d[#.&ʌ ]%瀕Ul)PKC*KJA`%܌~R3 iNuXMm{r~|b_[Ͻ.Ϥ~H|ʮ+jRV?0ڝWn:0=JfeNjG36q𳈒(gCZʣA_^Z5ɭ@p؈>Wuzu?]^'\^=/KнJk?ߒ]6[t}A7g2`O2C{_|Д}ĎYr\o'6ݰ`gͼR(6{RkOi;M ]ݰн: B y &12r׫q3]bq Vlu}F4wo黳#u5 n؜V%>wE^7אR9ȑ}k~dzڼk :"/#^Q9 +J2I۠[l}F= n]vȋzF@8ڑW˯G`i ]y^+ƌ/a!+(Խ=az! ~btN9WA8 |e'6KWz,ey='2C/#⤯WN^ oiESbf.d~C\^kju1ɿ{F=K;OZzrzNᗟޑ筿*\k*}{ԯ8ِ|Wqr=Φ@/6ޑ%lӳ3Zgpb >#dg=::jH/1ώlRw챶Ah z =4W5dWB~0ό7ڑ }y׫CwJ>H֡-бDd#y6!--uY8rv/V3kV_|#˘%VaD>FϕLЭ6vR̯N0E.Z.~] X y'JY Ɛ1cސ_jkpElGNy\ёm< Y`]Jro1t ZtzE4 dFN1T_(C ɀE"L?Ϥk:N~F9Iuޙ.]~ma/dBٰ_Fnv.tW[B3#b)FN:iSBu_vf|}g9Mɋm5PV؄E512[Nlhn(GL&& wqmnmGNq,̬hF^~^t׎Dɮ舰K*7r#..:h3مH%y03 Owxaky[s7,⏨C̺7}g];hls%p~yU_ے MUX -N~PY=S']mUm?_k؟l8Q]xK*)*& ʋ蝇Q/6<8%)Φ ReG ]͞~$G@u Fl"'s2pS2oGDJ8K*jYƞwU$ncѷt 4v/+M\:A+[X4{U[ =Q\g?C$~Y#2.?9 ~) e~ѐ/W?ctN+x]cl(7i>c_Ν1g>UEO2 яswSߦ#1և: .Oc_iJiR'^WTڀB_%qMUDzא6ˇtD%z}iK%Ix;㢌|;VߝF6}YKsR~](h൘Qkm*盭w^ѿ;'c8}[0Fg{^о> 6*rv6~!6T Y񆢉Sf]ې /!)A7r?ؾĔ#/ʿgFzZ VQYVuh-+teSX^[Ent5d3hŒXO~ hҢ%CFl7 ~R aV-MHսyu, s Lv^ \9Z̎ި}ߩ F/"7khr3C͈}ѻחo!e^E/~UPn"HV'+?En&"5#)/jY A/1oz2H|/hZ/_Rka늑z=e^k94'O: g"!QSVoxZ>'% 9?ϻO̱F7 o YAgG;Q..+k/3؜'@*.HBRQ9qXec+&Ȗ?u drP wj@BJgR 3ZG&ސx)o]a"1k^GXCb[]=|!>'=B @8{,j؜+vIl{lIyO!V鼢NIh lKTM/ |~\4_sM~;p*G)){K*"b}C}G_G&.pbr$Gi;e#N~#ϯ&h!^m>Y$^gTႽtI%~C7']M7hg;@ mdЃIpT[_?LscsKe@{K_G9dL뀦ZՕ_kqZO) ZD}Hcu !>چK9*9tIN !H&"x]GOAO}'K tq[l+EP%r 8\)ܭϵ`ĥzh,G1rh삮6Ulz9W;T䤅wżdc_mswo=uȯgFnb`Vg/㞫rې׸:ݥq)HkTM+4}c'"up#c&7p[tG٠_B!6/iCt 1jc^]ܿQyGɂtIWX#g$G~ l#/R2N(D] Bcw(8˳9Luzw6Wo&e&y9*K7p"~F| 67A[1`qAwgƈz9OL}Fy%(tOZߐ繩"ĠоrY]jЬ4]& 1MvmI] zq Qo;=Zm|tm .ѓ80"͍7#BjgfE/uH^n}._)t%ݓW<(凞䥻exZ; ,q  &Ƚ ;a|ITW?ZvZn2-$d_>vG 2yKdBP!Eܑzѥ+S2I6#X- .E69fâ#=!^8}LGu794C/NF.rEs+w ZGy'spn%.b/-&RqzU5:$ОN.v6v\:ib_Rڡf|9GXqTλzߑϚ(.bt^59}s Fg Iv:Q:aԾ#ptDX>݊(Wv4Ͽyr#_mpC/+T2eNz ç[b'trc<^" v1%ЗF.>nP\00޲NKyMD\ ɥ Ad}D7ܔË:hʹx 15vKS/KA~I 5ԅnKdHMO#!oಚҠNR`j#hzد5dwFqUah %&^1">N#PKX"22H!kR!9W?|B//wS^C|U˩ټ& DZCi#WIφ 50f Z٭^bw]fu!v;zLHg/)K_;gd|jIWh%7Ջ97:+7=Kj+g0 #osuMN)&\o!=&sƑ2VdlF#+q%],= ^ Qـ~IowWlێ&e/9 XNqi2ŗ1g]]hT_װE%gSF7k3Яq u|{/ZlC e0rkQEkpJ+jrEFiC~ @$l٭PG9hUQ 1Y\~^ptƍYy 9!C{˰%w\8_Щ,j$3J+Bw6 c"L)\;9{ J;"c~xulzq1d =VtϲnKV BѨSiܯe@5~P$1R0tN~ehLȟ)EeFu<ȾFprmB֑FK(t#`-1ݏ@s<~81Vc G ,/.rR.Zef__tVQOGęx:gMlCNyC]!.-sAwΔQ7-.thzuC5. HF_49">FO(xߨg]Gd}\CצBF~JOB9iݎ}GߠO)c֡=\ա G|K9*W,IufRE6຺]]"_c/R]_{t~Ncwt~UIdO'Z,^ֹc6i<5XI!ؠȼhƆNuw/Wo»X8ZPdGN~rJAFi_wYwZuD2hfE6^ȣ O"Vpwݑے:\ϔQ6 t(A_VwOw1p<:ڠ[]~< Koݷ]׍F)v:؍qp<@"/dcith2d]WzҠYu 7r Y:ZOe~#1>QЗv$_ϻU i!qk~RUG8bNɲ(.ז7v%mMv貄Gg: mvc؁u -$DʺA/:C x6=RukluaI@[1\˻Ɔ\k\cu) rq#?#Ȼ 9/%i r^a!G3k9 ܨgq4s5nb a.fhw)!aGk7*C<uAkx|x2ܾ~nU+WuYWzo8@-4wISGTmGA6ר.fl!l -AMףuh6ʹ%35@ z[+V% 3G_@ްI:{GD/=5c7mfZKvzڠ9Zo3z/r]1cKO?.0ѹ~D nܛtH%DoJG}Gήr\!#7}к!KLjn =6uzʹi|nR|iYvTwI* K]N'p2vbuD<yK=] Ϣ%M7=^m ۼ ؂J;k 5ESuBZ.\d쩨Z֕ Lz oᣊ"\[rl*;u2udˑhqC+:]n.QA5]CCl]Bz̢k_r^Co^xjxK-W()I؍.^傮Ai37~ﵟ! /1ze:89w3:aFOѻQ@g=Jz&]P 8*tHgⅽSuՠwzVnu: 7x8ƈRzrPϐ~+.\틧u ukeoTE25Gm$XCC6Z-mCGCTw$eDps9IzNƀ&/eQB#t=,w% ١/~lgGVt",FFV~"1_QpEыōOf]dB=_ NPzCh> C+醼jWd/vo!46`\gϥާ$Do䳎ΈN:t(d7'ia8WFr\=Q]<%Ϩ^13ltmC>.9QS3-Is ]cXQ١Ϸ?ZBKD2G_ytǞʗ}pL#4lnͣaZmwv"^#O/}>rb3`hI>if5I/Ym[(I%hyR(\뎼c\/2>6OWSw@`ݪ.YL|R6cJ"uy %5K$ p#BFƍEڡ:Fꌨ5ct޿9Y2nN85怾 `ɐz"wT˸ K/AF(u圉FlrU4tEnta `đŐ*}楕!o;Ke>GPճCeue]`ƾ:EEYiِsd[͏ݩ"H5ކܫe_yAuNů4nWj;NexA3tN!qi&[|5_ZQ{݈~m3$Kٌ~Kq1\ ӎ\Gޖ%.Xf8I4reg_5h:4"\ȝ7h6QRFޯk@gRmC>гЩFH\ 4uFO([T?~RLF@wEyn-C]B.tyZ :0(Q4zi;CD͌7wECZ \ȠnAN4Hʎ\A~IOe yiI4+t9u{Y]ݦ8`ӱ0V{czi >f]LZ7=B^lGZrг:*6ϧ44 9(HVNbtsK{0\{hfT5hrzZ>>>>C{^0ݿRe :PhV3rs0%kY^Ȇ]a~ !yn( diiŨ(_okHڰՕ>_)KJA/dh2?Rc]̗G*kb~JWqwI7=@:_^/hR\PeߛFi#i*О~޿N@(J}vӨ>S}dtpɷdNaNqF\Co_!Vv)c:ސm~R]Zܵ$ #q̍u5lS\AOھȥ|u<T}e/z괷 -W /ˎE놜J^yF ac4h5eMY麤Sb+J#$[6{]MJAC'c6_2ylЃ YdYcw[n4 C;LvHo5ʣFn*-(j34U/?n*IЎTw`jvx97rN9.M1h@WZQ |!FO4&dl$]2㒇~HK=BsA/m ԵFnc΋v.]wKœ7I3x`/qVcB/e]Fa4XSzFN(G%b:L٠; | vF9ƴrGbNYv]?V?#Ȭigeb|4)z‡^dj>"\y`vL5[PoM3wPt_'BK.|r<,4 #^jaq_ ߸bXY+{FNz 9ܾ9 ֑YذO+E欧tXߜ|r N(;Jǩ+Ma"_=Tf;m~|1Bdw{ HK87}Ok# { m.qZ2rbYS~-v vI |[ڠ9/Ib,@MzjK:\U^%t-BO6Fl&Ȧ~{I:.y{=ij2Nl)%[x`5дy(A#g_V{!kND*61ѽ yq?ҨA&t^t ѕ2O\6=M+lt |uWt)5ct ?QfN]h}C^Zz&A2}%ut}\ޣۥ"k"y $Ђ$-.mZr!o0" [,i6}ht_/h%YmJ2$u}NLکku*|f |-7)ft) 7zԥi0yA-?VQ5#Ule5zFnGoQJ8 9߷rI2c$$/=<2i :VA9E<$.ȇoؽͺmiXHa]aIݾSaU3 8/S4Ǵg{FsQaݢQ},p/rpN}VF G5"\Ƚ^NA獡btcC#^zi^I%AoIRcsqpsA}ʛ/jLֽ-S_RVh-pP=Z3TkoHv:tqdCƚ@mǎ̬owrڜJې?|Df).12UڐZM T yt<ZЯe]t#+Gl6wE1$/\14g_SƋ4zt>y=0tGnG |g zdMi}4Ǿ_c{Q)[xGu@/7@/ֶ#ÒA*y5űAWI-FŒQ9(eEet,m@o {UW{$_t/$}? Z>Bq) 0d4d{TVEWȠe'FB;\Зg8.03P:LȚ5Tz۠_K/ [ fktk+@΄ XmC~ Cowinm!WǿԬZzKUu3[ۀzh7\y}8\zi^X@k^4 y¿Uۆ|#;պ}BY![D}{e莨 Њ:!Y=<}̠[BQ7Z5#1O̵,nvϕ)^JrqkNo*3"Enp @o+@PHsv&}U_( ro.LLzHl֑`ORf#.j-ksњ}cdbZ)!CfÜsH c1EIDBMލ YRd{nB懋MEE?d?+R ܵ6صk?-Fe~ [ m+|]"/Mk7/@産}a }A^h{M2 3l\kx@N!`euT`%Rrry%%ﵗ{z"&*Gݫl^[h>58־t rL~L&OPS9,?&ȩ g~]Mv}]MA"Xeƅnֿ%`_.<,?z LTVe1{y䴌J&F:1}Ȉ )Tf˪ˀT?ݾ×0`Hq|L?Dž_`tp'\kO}, 9O# *9l`+inޞ3:+AN/;IKf?l1ğ_퀦</P}lAyS|E& bh;Ώ6/;Of<p_MW8cMhǑ_!g##'V58/3pZ Y6Q |_d3¾N+Wl1-E7SBWɿ"N>ڡ9E zгOzQX(Ȧg TB39䂽 =W991&zla O>{-obmvSJ`YrӢ14ՀnB?"ܨ@kB_cNep/zpk< zǗ>G51%_#4ieN |.~Ms; ;jl6HeFn%bܸgzYyDiz;^6-ŠL7kT~S}'+|SAֵJjK-=nV>kT98)qޗh,Q呚Q$AOŗ N_:/<[ݮzJWu0}+ѨPu!Ҳ >]DNO }4~_9*?\MO%O.W%۠k6^{\`O|:ї=M)}Vn-P%)x暹wapå(>׭SadH})FJ?Y=G-/}3hfVOEO-1kQ >!gI/m2#8<^VD$n` /'bP5&B*3623+G5߱=^ j`#h@n߰k|皵5h]?,_Cҵ-;ܸ%R3 %\o>)n9)SOk$[_mPѱTG w?/8qj:? uLkA#ˊ;xZ2Uh@/|z=aɊ}r\2#7'5zo3\8CǺoM }wgA#x؝vcW*!r˚L= !a}]qxddRmo~_ǫEO~Mx@R2<Ǟi9z֣5Ա0@/$_$ [SDO/HSԠƿ?ԧ nhw}.aTp1/z/ˉ, ,~ 1_ZO?,oY?ےe"x^Zvz&:sаn<:;Kگ0Sr|OwmֳgiYϾ׵^-Ψ?8.!Obg%a{ JDIzb!dzchjwyXfY}/}`qm|*&9JA`yd5L 9M Z)ʽK4q\# |5%-rb|Ug5GF/mDsNA; ͙l["#X9 q&n5A7Y/f%>q-)O -ZK6^.i^k:8U4@ U gKڟEԆ9B_:(m|_*!B&%X/x \c+0ɹrŐ=O :C8;CyH/' :h?/.Ź ~ސ-?S7[fgZoFhA$RlM o/t\U-g Z:Fr驜4l"δO=/R,wf"@_0}Jr)6ׁ-!纲iq\[D`/z(BefB%l4DZ_N4HgxGruy2>#@Cd΋نlԒyaoRMoݒś{4Ad@/rbOe 1r!>= ,nYB^5|Wdb>q9٦7y+ZC3E~#a߶_x55? rap9:x <m9ƨȺ!)O"EØ Za4/m-{.`.d5<}^7}UVqP+AX: |jѾSYg3.Yȶpo% YY~uUo=ԯ;+[)SÖ),G ϟ۴"_1 oؗzAz+o ,D)}ܨAӠ I9`gXn>UP=ۺ!IX~yKC5T~t3q& |[xeD`8z*I7[r*К7&^[,Oӓ!^%vpJ[tn\Z>9s~ "{<CNG_ך+_xΫiyM ;rjIL?❒C[~84^5nCq;iyjȭ3*YkěZ5-{{iɘ_.8 x'|BsV9BoGCOMx 0quqƥAϗ } ? zP}y߲(X,y6DoaYp|&鿒]\'z҆FvBocV%>ռ F]3"_>zAV:Wz^<[Sp\3D<te1]z fV%Ao_:̹2(|C UOO犍O7Zr 5o">69Hw!\Rꆜ,|O8>|C4=E73:W A.1)4ӺlO=kt~Kc$=tEg1SymݵaS Yz ِ*I/-K|~ER9 ]>%@䫭o/1l Ar ɌE뜙WtIj2|NksGZ,~x ҎM7Ӯѐ]In\̨h^&'r'❛~A?cM|2_l&o5ؠ]u|"fqz9d@ObmrIY4U䜅k㫮( z޲iq[*#4k,NrMԱo %!ch7g[Zm^֑sFnGmrR"fj >\tMO m.b6!i2nDK :׏{z8Kw ݭ>,ڡ :]]ѥ'"-vdYDD'tNuIj1m#KsEo(2{#_(R=2g1R3]rY#mmIC_2UhqEgu.F7.ycױ5TBBK2QY7v/>ЯdfuW7]C/Ff]33̈®1#n;rgEyUr_SFH[\ve`yNۆݖvv*KS#W}C~5+Qݍ~ Inj:N /J3m-Wim^y `JBreO) .v}>bYg~ZtTC0\zy@y|D7i]J7FfePQ ;@R>K]7"/jAf0e5 C_,K,*CNxF8~Ҧ鿐WW.Uo Rxգ(!GFc d>f~Lkv ].S,Vg]kԺ#F?7զ;4 8K<-wq3q}fq#wz^g`ov>o9 d>i\Imvu\]XK[rWZ3|_{2 +}Gn!).)=:z+:L ym7*;k!$Ͻid?'] 8z; 4Drq#OɗYh-Gص›^ .r*YPK3{EYP~`6-֠i 9IT3]Mg􁝢:c\Yh~*KҌFҮM-y_ ס7Wԣ127RL'nig!+稛cw3"+O?€Hs;Hk3nvh D- X׍@˧Լ<@2* ROqc*+ hBf/u,3waCؿZhFt$H5阌`!XR͍ۛ>Ol`n] *ЛcO S- w)C!$Z# "NK? JZ{<H9p3G5{"/A|ڐ+]jl|BWm5u:ظțҁOj #O% N{d$Ԑt$Y4{UYT=Z]:-w0yW(fҐ7`n]'*J-@W*7ES'nc <reT@H{9Wj, %hG:DI7ve{o *nTZ{Tv".sQ}͊ r#]L7cGy3pc>GŕDnec&]ƠHaWBoOء W'r*zi ,.ꂭ {hi`W/v@o҉x6Gݡx'rdzNqC_MCH.ؼr?Fy]tUFl6|2{\d ($T{th}婿}0gsV@zb'r 䪊AW-K^󁼇ÞFԣvEr|`T-Xd\9mzJ\Vx7&no=d=4l\3]r俭.rOd-7."hr=5n{yZεH"]!l=DҸйy]^ Zt5k=^lq7r_ձ%x/jZv⅋[8O!hzȕc"FޅIoQzѓNmY2 ]~|j\Bfu/*'jpɂWeDMG\Y|s01tj/>ПkԠ VOi}1tӅO: {,ذOޖޒa\[eCWs>qd-` Iڟow)>sE;8:-eUl:7?CD/&M|+2kz'Ďlḉ$thN4"M*g%s,/PNKRk/wl.>eENm9HzVE$LMבhڋV[(MhD?f/]*A_F=h? Z?)vs8Ei楟{L4{"j؏U%C;w^<ԥtz KKA߭tȥW+$O7~@ǑC+7FײբRb<ꉜ$t.EpV:;4Œf@PKJG& cJ7+ $|5t͐Zn04nu[]~j2z5Ͼ ]j+sHG}]^e+ӧ^ݳƑYݺbkoޱ'[Ng%$qԠ{v-dDާK墌̧v!~f؛U@Nqt1Qb"1Ek.g,S'c|XcEtK|u#s'/ 󢪌 ﺫOwܘ9j@O=(R %rtG\EH丗{Y=%pRFI 7)rW֬wn~nЛ9-Bl=}%zah|C'n{ūeDu*$Qz?ef$Jܣܡ/#t@%^;BB!}, fJ&zI*r>>aOְy T?ao& NI㱧Wt?21x4;zS"Oz`0M-h$Rgw[:M=wԳ\]9/jbHVj ŜfooO+!$?.> G:jd֒H_Ƅ>QRȸ/uYeKS8 ݢ5ȠGꁜ#_h X_s&uRCf{ı Q)y ɗ'Bq.e rh=SH:4e A`T0x16$]ݚ9FAtBS2â}[4I}#ywkꅴ}ԹaEzbl{UEہ$: ͋@;|U:ERUB'DqB*,wyOJa(hG)߭n ͭlY+_\>!X>\oQ2IV#ڥeEHރ 8亍1=n"yS+T M:3[TD1(80rkpswh@L~!nktT  ӽ7#oЕ%A.yQ-"g"RK/JWFwhUixؾ{N:oTn\J>FvIt@߂uC+]/>Ȼ2Aq (q(V$I7e/mz_2dВĦߨߺ u Txh^ҾV|z>@},QأBˁuYyuIcC6P"I4֔"KʚM>mB;ȓ0jgD'Yoг{NbB} HEpnȶǡY6xG=k82f^~Z11qݔN&%h=Jt rwdծS5UU"oaiTdrB3c.jyˁ\׳ړ<  ל4mvzK\+/FUx=/ [LNӔe58/|CQ865vϚWu*QZoH4>)t<ݗz_Ec+3'eUth9;rsW?nE>U:mD93MseM"z'sIA$xoM&ǖ"7׸7ݰvX; :qtzbeeXu:-MǠ.vkqAw:N{/yPtֲiu;;L']f8],Ҳ E욜]Wg31a[p`/k)Pڔl>sNz´c۩1nY$T$`wD[I-)/AŸk0}q3]L~ yq]E'g$ A~K.Ȓm=\S8U 4oCks7ڰm&i=9]nZ[b(5>D'ɽJuw$AA^/C`[D[n&*Y>=Gr쥀R23Ilt5ש.aM6%_-J={!w$1A'?:= rн]|E+ &C/7/M}T4R]8ΘzJhEMyOD-woKH#Ϥ1î(qH,װK+Az `ISK/5ޛVEԙ遼Hf-v";19ב_Bغ#e+^&5 <`#VWd-I?K}'Up^89/Fy^{c7nC4y@M'gLQ4`X!zWځ\MzYj1 ]C勍Z<2ݍQWJT"MY;!q6m)IgՃXvгk p. qq?!gd :[&y zv&W[u -VovC0h.jaPlYm(->NJ>J0zM4˨~q c;ݣy^wa|P[Ewh(d$Pk.] .>lM@lorIq~Xg[>=̑]5Jm.=-v"؍*趩5fGE%^?`$'FrCuh/W]\ZW&"2bЩmt$kͧLGLhN%/ Zrv@/p^v[QtƮ4Kv`2ra/|RG y~{ߵ#j 1.t~  #SD7ӥShz7uoK:{v!_yu/.rQ\U zպ~bIyC%y\sMZȕ`u9{p&۸!jרζtr`Uvd偮KNsu:Vp\E/Eܟ.a{+imz\"tF3AG%E[tȉ4BpjU \$WhEnCiH0%1/J4t:w`B+1yomIU -i!?|Ԩ#wfx-q{S_ѱ^6ex(tBxHK/l~O%NG(4*qlZ.uO~ oN7>cxK Ցdy¨oڋȑOȳ1yR$F>N{qDTzR~Q4Oݕ%[ pI7 X?'CD5 Ic 7t۬4f6v[NC+Sq B^tW]o)vK'd֍-6BKE@΋;\Y~kc|?E[n ՏP蒜Lْf|O|i ETTh =銳^C:fWFם>Z֦9Ҳ S8F]٠5map?QQ"uZ o=]m%S݊:"-mIu:n{c@-/6֎R ޗ.%tݢuF'#յ X K iA_ToVO[}x9}zٽxZǠgHyj^/"'N%rU㺺I<"A~( 鍜$:u&/ВC|Kwpf=וt݂wU͐ ާ6WQK,~!AYCSn\/ϐd.`>*M>o ^}o|EEf_^L-vyXZ#ܠd9E ZhthFG}6rB8U[-\k ].ABE\|h:Qmt@ہ;z/#oIT:.嗀F tct躮 L6oz:.clھEZ=趟~*!Ek| w"JN)f d'w#44 M[fҟy &a_^iz ڣ%$ .dkhhE/{EZH,K)5gM]\WwK ֠EOP}ۖL-".ͫ[ej=EEI>+A׺4j"a.H+s1$f #Ǣ򾷋 Zhis4͕Fqg.kO>cz4茡=}]<[ $)3Vr]<) rUWuNp0v+={ͣl-:`5,Z݈~8i7rx8!7hN*%Eo^`9}m~oߠuiL}{2o޺hȭ \[% hYJ\&]D ~'.Y>Dr(Ag"нJc)zZb}A?Fr@%:z_hyz\SiÌH^ǣ9@dhJv6䨮ڲ;SdbݜEe@/5tB^2;ju9?{\D1Bo=Ѻprׄζ7^@4..gu M0r'y!!dޅ}7FQIF#u&@_nN0h,7d@|DrK+]2d)r8'+ 6+g7͙(sGM>/Zͳe4\w96 tk9G+-qfͪ"Jumqw.[Iߑs{"-`WIft\ںDWFlкn?KM7аF ЏS:°+q"܋-'_h-؄LZZgё/Z `$=EIP QvMwKBS]-r߻H2]Բe@R:ЈJ滿[@o>l.kȸ{]J7}B;c7$r]:Ck0 y_ 9 ȝp9c}&^#[z 5 ]KhDb3^hd}Q#5$ZCHk't):)j5-~ |7< y-| t#5ic&bSAG66p[R}xaEx\V\:ɒ:<t[ bFuC~Sϐ\zKs/àW+WHW܅ƍ/j@>3مvt MHFk+tvB!!=`KH}I}vGvuIo씗Ri_Uadg%^@??_N4u<)atj#R}`*2?tv(7y7p]jE_gT%#;G/eM(Pv@F3̞ufث=XzRc&׃|^TrMua]:>ΒC^S{q>[?wn|%]bނ)]Tdtc:UG]e*W귥]rw, N.A-3:њO=5º̗@&*ى|T}?$[@NrZd02h] ;41zҽT*tȸSL3wס^.[뻼 Av qKJ@3V D/4$aEGi] 4sW"wQþ#9zgq#ɲ ٻ;\㍜,I+a'ҦK-'щ\`s@絁wTit]6#L:t\ m\C"T^LfE ̻ ZkT쀾<XqcܔnrzzJ@_̾P\zޓ oWIQ0|ӄ%Yu2'ؕF/\@N^yxiӺ1r,P?V ] XARWy@ YIֱ"3vaddt fAgM@u3w5Yw^RŭT#}uiIU=k:UnM~.dft ՉZAg|jQo~IexyWoF9C}=ۺb#k}YzEEz'P|D+ mnkּ=hݼJ!\ؙN ^W-֥ \xD-f|FNa p]#IiJK,3IB>+qb`=?ն\ӃIWz-1e kd]|͜>]زl|u+A֦@_:Na^f&a\C'CPWz~7{t)zA/WmFio} }Qb8\Cۋ9.REE]w:ͯthl,DNUWWx!o1?c H.[o$FȍQs#MMpVF.E|#uY$ lNY͔ѐ/oXkl1% ;S.4;LYWNl&`м&+{i^camUҬ7w.ބ5zr@wF>=<*^똄l?{1{zn 9NW0 OWntɂԷpQb.t {F'E&U-M_ QBf5ʹ..7z@i/Lw!ɮ}vi]44wc y)7ԳiTtTb8:_2y :$`$eZz#=_ӨjZ%>U}FkCU:G D9RYlN3 =#sV 0t? ^u% []uO/ xA1Z{u) sRgl1z] G*ЭؕrN^#M%]FP*v 0y]O~ ڤW tl ! 9z^o21=*M[G.z"F\>^n薺F#_O#v@٫{ Ae@9I(`@ߔlu|k}ے}e5$%n]hEFk#X7.~9~҆>X >#uK hjZ7nި^C/3ocGl(h4&[y硇5)մ[ ܖQGvdGKOaQN>3-l}Y9/Eh?b)KW'FܲKb]9r"If"K}G@V߫a焋 BNcWsGvuAnq@ :7Lu:=]^@`v"")oά95h&asqޏ%ɩ.{%J9m _FLriFz3]GgҞ4^eGCGOiCz_EzX]4~+J6'Z:櫣2:/T4A.]FЋDTWvC>NxRAzvm\ ^; }/ @} cƎ gXf}%0FGANZ?is|tf'ޖEmyQSoY= ?_h2I/wM7Kn7o34 3tn_[zVoWB{۫5\؇ FG>wȓtM/::.tЉs]-E[`^/tah#紸t[w^x4U4Hϝl1:mY*vBo&|lz gC3щ0jVQtW֡Hu=.}}nKllth6`e4l NH;Krktf')\16*SwbA^9;E3W]h@..)F!%6фCc*.3BNu6KCeP?SB‘~4@{Ր[Z@>ߣ[Ԑ]]NEWJ|5;ͯe\!:2SEz{6MjNbKpkK5);ZOr 4]4y/5e,pu=o\$>s_2v'$/);h_=޽Ov/]UG˟9Xc z [̀{,֋h)-B/}b^tYBLjqtu /ΥA絏\֡lBpNi@TJ'tuu>b `KWWA9A?G*LnG)YNX#νEK)JԠw0P9->#$2tr@K"2B@fF6'{]d.2u=y`d_$v@׋P+!X޿c-m/y+ԸktbcZ0*/Kf^FE2ůz|K## &"o\F}i,2~[w=(B+2r~%YUkCX -H @3Gy|K :J4zum|"R3eDh=Ţ0?TW%59 it^;>̠._{˫^ r[@ŏ}Ӹg5 \ !_=l;?K[7t\{%pev N}{?o7 .&{|jF C 7r1y-Y56~oYgXrqv!JO% _#t#Ẋ/s̗h@wiUFK@_ wbO/&ubJĞq.B.W M *w_{$ⲀȕEt.FK.н"rY; "џ?*z'r)f =t`䷽_5G).x):[̜w'].E]|ݿ䅊obsܕp)ihn-61gKЌm|nOvm&QP c/]HHbxw K_)IimE-j^ 8xY|W%.r^-~Ebg:|Y$Y_)r-TkT|5 ykSe͉xT7SS\G{o?O:}[.ɣ[Ơțp2~#P×M9~H]s ?Z y&=R;賎njHЏճ}i12EiAWAt|hH_1Eb#lЁ/}Ҏ|al 6~]5E4,6;e90V"- pGt-ЛmZW %Ii y$mry亣"{z@{G'3wysT%^ ck'EK_2R.WDAjz[HՈ\:mZ+O7ƸtQ3]to.#?Wl݅،zA [d.2za:E7xT9?R*= A_c}tWVXܨj,-6uع_iV {k aĮav>149c9|]"1]@ױ[-|d˂3 LG#k)i]{A* %/y_2(uFي9J@Q ^ i<ۍՉ { n=}jWtz ,]ƾW-K-#j8دKˠq@ߝݡMA'Z /ck#Z[isG FF@Hpk=Љ]K iӣkl^Sq :p1I|2r=.վxYi_p֓8:ޡtz7p sa!S^/%k7Whji8yv(rr^ЧуI7m*c M7m!_\}\#ř"?E}s!AGe ["́@vEFI_b4hmmvͼއ8ҥk؋T>ރlC.3~"[H\6cQy%VW}>ڑ|;ƺ[Dcz9 p,]%i~d0%螴dr(*ƏWWSޚ:z:P3ˁJbi]F#jl&$^=m% {zn-fNoE> R@ߊDR]:rƘK ![Ҿ=?-YL< gCQJpnƮ$/l:85 ;suYƍ^{eTr !HrH*ؘ4Z5}hVQԫ=a(C8Rt s9 q }xK=-*;BKzIDLWjQfwi@'OA7;" kv~c O&\;-#z$:Z;QI贺oDHYa'y /һ0plv/qfM3ܦ4oT 0r"oQ5)1W;a[9Ȍ]i)^@fzLNvɵ#j8;v&0-V?|aEc4~oޫ,~.̡bIѱ\Cw &$k oq% LzL`Jcd";rt`[ż;"'rM@#7La$>R$$_ے2rT8̷Vq8D>SH z:f,M__%j4M}PFZV]'8 ݚEF=sgd\@>:[Ɨ0B'NVPTb\DNqsuԑ0touykt^*RBvhR ]Rzރ5}v^_R(tƘAGT~yu}dex!^g1j$`hk 'KAj9KL`hȆܬcnyUNeIP\i&K[˃ _г E:rLD>%'G@sc#Q'mzقٲCWίt$۠uTG]xQ^c { ԊÍN.t{x6Q<'z/4[t[k zNiȮ׺ԃ|@H@CbPu=4)зt UhvyN[so4S[uɮΚ[:&v >KCAI}=u@˾p=s4054҃0!kEλ9vrksœzD%G(N6dށ-2^]/@w:uP VNw`d1!/4}pslb}nK9B0`> u!_:,tv~=47E>k\?<ܑ;!]%tvB(?y [>}ltb##";s /-,rk& }רKڠ-E/ץސДbx{T#crڼد rȺFOTlB1r[}Bo:/L1Ao][kt▪14X3I?P7K#K%V8Xnzkznmwa$㵟7"s[Si(yvb2-9]]k }6٥i}BM zp1"OHghUC[\,&9Z8}Bz24͘Bg31\&"߂U8wBPujn!'Cv"^0ȽW.lK|VqQ.$Q]4:EC#cۻis X6B Z#/ 4[F"z6!G 9S{iw5敚+y%=/"F3c:݅b!ЙQi uKB5sR:!{Jӱ+Q }Muhu1]mQf إ]@!C,톭̾JXv*~OW՛A7qeg;^8mХ]K vٮ p>z?;y7Q :I~3y3+jkn ta73t~9If^H.W'hz][+z_r{lV?K٩b<[;rPoCSCo|A7ӭ r@4?ivGzр>7}3#s`o ];(%{kwN8ܱ%_))ȓAGQg. \s/!Owg2!qݼHj=uh8pkH{~^t:V};\<#\.` '*~':ݑo QY-:ݺb}tq aa˦/ؿ^.*o#b$v.t]yb{j|RsF9: [p0E ft>͘ƝK%o½<3>3SGv_gN =oy{å tg:D]H uhϴ-gx|O_bs yF2Eر2yުs5̎29%ŤN(}ސmu s/:299%+vkɁ|wu䂈|\q=د{z IRgB~&]Ѫr 2r= 3;3b"tZ]#%4D~-{8ӋIʚÖK!U} jmQt c/p(%|{K_Aב!҈u!]FIKVk UڽGiZ;Ӿkm{GtBoT}m/ФzKZ_ҡc+WwzqǦջk܅Fuqޒ&t}#OwVh7IƗ\CѯB#oβ5wkKhjB֧CR1d -w|ҁ\W5GG^%IOV'|E)` tdMT7n$}7eJov)iv~su.Eeciud)6thO~zQ H7AM_w0 ͭˈ7$yԋGf'rYJi3`"'kTW/iR/^,vI$U0@^/Ӏ˾`6;MRzod.܀nr| k̊;d;Zno{=R-QHANx!gS B2\KN}6<#Ym9d 'S^m[džn|BhJY1rxE.ܠ[r`I 6 JR>[$Ӏ/{+N#9nQ<{vmy逮Ek]zg+ :skh`o/EGҹZL{tu9i&ɫGB"Ӥ@+Zs.NѠ7O䞤;0 8$(i^f(SWȥyq7:H|=./Rl=}Nu {TRPCn$%R ѻ:9V[nŐ0#͗2Ϗ_y!m,:7Hq݅D/M2GEH;. tWQ^u#\OB/0lsn+ְxt,ދ-W%hAA:u4tQx[j00C7Ȼ-/[۸qSN rY6pY1b_ >0#kgφ/|BsH6Ot">~ o.~ (r~Yȣ B&{d %;F'-Ñi(m)1T8;M5u\d4p;6 ;H#<_u*>VOq{<ޠ'Cr9.@q+dn7lmɮRt=./Ӡ5ҍ t":Ǵ87 <tYGA w/P8Jiz?/ I/R}_~ސI]$_~ehVe,aC2G.)俼΄އ_sig=HۺCʁW0+y_w+CH& cߨl1V_4K%Ak kr@hɦVUqxKU\z];.A3/+B1ftv~zOg{ o.Zᾘr7쌑t~FGxK&(t˨n7]NA 0gez\'I~K[P/حAnVO%~(V%[:sftܯҠ?*Q)ɓbE*=*jLÞ5}K M7Z&$a<޳Ө;tq%lMFݶVm i`rZߔJb݃ZI[4h$u'ptp[0sj Є0[#2ez(Ra(Efwt\)hf7}UGqhD( PBmhpB7ZZ>Izvn3uh -כq+[-W,ȕxf <,f?t*XV]CM/1lyr^B]ɯ+u"_za8t^wD\lMZ {|/K ]6_Xu7/ʃ E'"h^/C̬AoD|]jAiyPh~h#'ZUGofsd[lb/]rqdi$x?#X#LVߑ 9E>}?[z%ʡw\CʾS /İ{.RwwjB|kG2kYRO OO2"tM`.W#X%Ekݲobp+5⶧ CsWVB?m{-y_X>:E~v޺,U[[_0zi/57mKE߂3Y}>Vs]M@5I"ï93k<׷0h5M7?%!n_{cUH" ]# O~3 [D/榓H8krI9a{W4';?T{V3\6e%l1 oQlu|Ese~eI2e oV 6yx[PU+9O6Iޮ%^;.|)_y7KT&8]osv*_JbLuM$8yOC;5{z?}}jAѾ9~{2g>/\A]: 85b~f%zƵ< ׬I ZrkPMQz>aw|.U!W$T}֐8 FbNB^Nw }2)N@?TH%0#qM?t|˒*JЭ's:rrff؞q'鑫w7o`+/P|ŐY ޖiCͤ^ 2@wg?-h=%Io}ۀ7=|}If9Bb-*5֮ xJ+?bZ)r UtdY,Y3Cq|P nXJo5~3(扃Iѱ.򖊽$dž7(ȳ)Z/xdVsA_J3*ޅi{uSDsv_;KhxߙR^$ ݧ?`>ngu:^]P|zL|œsB{ ~?0t!n ^BϵbkeazhM~m1_AkwπY)>bîK}k[ux`_yc38c ~C_9҄2qId勞q\p;GnRNv{^x׫[Uޕ_ScUQ?Gָa}=XS`i_= ~Z嵐AFzmd?wqYgPwo{|(>N]I ݸ,~^fr@^K-VZ~bU eQ<<ŮiY-TM3[2OpgBBOwha7hȬ/wQM MNwE|6P'm?s\{[:ݗmQu/'S0HoT- B wnr51hSEC=N/喋z1}oy^oM)xR# M^7kڐ 4zݻQw&pW| | þ+[ti]GEϽ>\[cݳʯK7T3&Џ^fʏ/` ئb_YGni!۾7ogvMokJ{d}~?^?b!g- 5Xz?,ߢ/n') ~[Gp^u&wA8.~k 8 ]ZZ3(&ENhajcA(zOK_y,I~uFE~kub[| V}kkz܌48Ot%Z{w/ZEazf-Ijfj{w]o}~J|CYlf=gGɸېS |x PoW̲6|5i( F%EN@6vW Z\r?Sx]հ~KzGZ*-V߯Sen>4om~y}׬L1F$t/vyn {~-+rz*x\͠;q~PlL.0gy0W>k~޲,3tnYS.=6TɈSsv_k$g&ȏs<]/0#Kz_a;ڳokʀn VOR&HP_2}vAfG#.t{7 k'>lݢ&D_%ybA._QI~%SHF |Nܭܭ˥ yD:tnI%_*%!ڜ6nhu xǠTGPij̀$?BX/B$i {:KOk#p><-@u/x-ǨD tۘ"2  Aj-*Vm/W}e~pQd 8xa#]䍝B^Qfd;^tJCdA<1Ro(џA=S "9D^)MwD[O ڐGGiy#@n丑P"7 @fKh OnaJc󺶐 d zOt!/uO-*-dIbSA̫6.yINEyA1 #pcB[ zD{JաUIF'tayʺht4>b^/)Si}yՖ2;^=(m@Z~#$V]6_(ɹwdjԐ ͮ |.'16&/WS^='Y&2z@?ہE2E鲜:4"?CǖIkdwoҡ]=r[2XbД_=pEǾ%fJD[&ނuM[ȌKCG]J?1뾞 lNwiYЎ9^Qϓpt_!/<^cE7rfс1=Q\dSg\lEi\F7>[DW9K,f# 7.k,.n#z,<#mwaE e@z.d=}\6o'Hؓj"Z9*3}aѲK}#(8X2?ГpQ>7yкOBk );u't821{#i|ArDc?ELtc\iK#d|~16BK…^M1.wɶh7謅]R)4.kxr/󁼮Ѣ j=)ŲXȧ/S\ѹ\4#WsD@^ bn!DgDЭůpхɣӡkQsB v59{vqs?XΚэ,qEW>E]4$fcL^JgXrEa h+W*t5fOQZNjN}14O#g.,(~F#'[Fmt_].kХ.ztF %>QȕN^j-sttD- #ee-] ]L]Cu_.yDge906Mgm=Q'6 dr.ۨTl9Ck[I:wYM:toe؅)H.0R춋8>X rDl"YGkr~aD梴X]!M[.5hjF/K \v!t["stZ:dDr%)ĝ g`B3jңHf|Fg|yIRGUТQ{:6tztw:KR|C nkux8;{Iv /:ħpu5+J]PFAP0C/@I[GA6oځDNoi4uBOWdlZA/A# zo'i }c3v_ϐ^4=ݲ@80 -I^9t5EnIeK[G>|1ǐ^[\fڪ/-#];K,0HJ{[J fxr0%RpMNT }2PdEຈmKhYuQ]-Հ/%8/3soZ%(\ L*)R0MiFE^;h/uϒ:g31f06?a#Z?ѐq"'J;:ףis(<z0:>1JJwУ5(-smg-Z HBjgn5i 5[m4hn"]=n{@N8U?y|lWEMsMB:AwYߐkR#>}#{!]oȑЯFIt~.{KpuU/$VOGy..Mۡu%.e诔|yu4LHAkGΐAĞu҉ V_j#*z=פ3rЪ[4G`zCf;NIVP֑J]25]M3 Zfpii+Q9t`נIZ.dks'[M8KR9FFڠEwI6IJH\~h]} z]71 seA^FbtEE9^|:miK#Jan'^/tK%v_xMs)zö:.4c3#L._ywzz nkΑ ,{*_|o1uBi]e)J_l=Ry>%A_cneX~\uj ?[@DnBwJ=tSV\[YE֐&@R~d؁w":e\JGH`:zf 2T}~Q2b<(cղSj̹FAH[|CI5bX2iC/ iHG@~ˆ+tՆ`hFt#e`G2>Sj:rΏ1|̞z.twUG0^xG䶶+z]bKWsFxC`S` quz׶>ԑ~\ץPQTAR?U[f0tkAg@E>jzr9-}֐#d={ܪ}#CFg;^5ˣ1:]ɨB,[4GH/ %?.;KI-z][:/VhL_lD|Uyz[ޗF:a7* 4-Q݁&E^^Di.jvtg Bך~n,eQF.:\zE.^;ޣC3&@.e|AGjr ׵@ý\F~9:EYT.q nti=U6 `i_@n]pm- - /-/, rϟKE)IBiѓ^9ɑуPzffz?mгQY]+%ud6_[dU $r`,z=טu͏ԠŒtu~t[g5 r+‹ 4=i䘞I+_h&v"J~9N9rtbA ݥ7Ѱt聽_5!78'ŕiTRp#Tݢ y촹9Ù/6Hҗ͓K7:Ğ>%.5!z)_5Ȃ#TۀOr篫EМ\~C^|dĹ:JՓ7HJҌ[R9j}a٩{WnitH̏!WD782gV2@a ygWw4|Ck=}XC/\@nђvU hw!z״v4Lݑ4薗.TmF:lK?uI#:S_=`N{ QhlzYb>r;+ J7s zKi't#7` TB{|1 C_uL,"Lc)& /z.O 6[$LOkVG23@RlfYv 8AVςqRvb/fB7@uzCfs]A\lj ʗt1jBM&\dqsYmOҀ+Bȥ=?jeb/ 1}aSc|ZRM}׸+[ni:pPA ?x Ÿ7o3z}FHobHV0s'H"Ulw>d vl ij ǛFEV.~>15.a\1Z|hsiuL5{No @BmA**Y-oЙl;Y:s{Tvzc e,GqM?4ܾI_=v=_EOU j`AWS | &n_n2 |l](Tw,K?CVo!\&7d*>SIq6OmطO)q{iwDUp}Kz d^T%%C;8 AkPyo]#C2!3R7y,_^"*ǒ'K87K#z =Fri]Ң/)B ځ^ Uh^|*Cos/אָC'h-#i ZފtᲶxgu8eWl*Bhwfzm㺾W/  *%I2W.չ|]2G>GրޕVIcUJ]L ~p|? Nq5|wj5}R-]ZlG򑭿's~x(5}?oB=cꉫLwE>C3C3i_3+t7[_ܡ7G\__,9qq;e|Ot~_ _s'`4eMwMbu]S_9v|Ƀ=2Ø4'%/uMgi]$Re}SVz /Z2pI+0&U?ZwS_7Nk۟k1\/ۗN` xۮq,[[U>x_<>t:ti+._3<"-a‘z &η ]:lP/o㗈UGhs 𶟾Փk C\2'7cu?0wڭt0h1W?[w^1 cIP #7;}ڔbg\Poev2Kצc5W@f͉rti{OS.=[=˙d6j7}&яkh:4 `UMom60sE7:M|KzǨI?+l>,o;\{"֒˪Ko%4Gcf/J=: p5_s5R߿֍)ߦ͗ 5_taxccW:r:/yh\mnI]f_y.]O ?9f st4: 2rэ=eeѢ [ąɞ%=r.tr*GW^jtئ(V;G~[G0U~]qщQLn⾋z/it2i_Uۧ7ͮ/+o~8ezoRswXR[Nɖ Tr>,kQa/Gez(G.,|bS;:\d/)=^G<GYE&_c{~9zmc ]zq;F\N<ȥQ|4g'smy$yt!j]\k}[BMOdmtBowmEN}~3.dr>+.ң}.^S FlTWؾJG_/,Zr\-g~$Y {j=xkZ>\y`Ύtr"&40ZWlec0Eb~vi:eFG3ʞxEKK \? |M0a݃?ӈo6otq9=Ymù>گ@tP*5݈5yϘ:>s]R΃*t\5d;z5\fѵhm%֎:vi<}Ctk b8lk6]Oq]գGҤ^',{t= ceyb>&_`akrB_:/Zp_>rHousXKf/X |Ъ_}V:B'64 ld>N}u[.ؘiktL*cmGߖeq:T-(2q|^TF*~s 0ݜ|nZ|n"{hX;l`t uT}z6vvTv;:h_+9̓yHl@h'Gqv)hHeùy3tXoA:˪O6%,{qOw[v#G]?:7^#lK_`Q.ՕK?I91q\ ;ʮ3?ѩ_k$:2=~9R|GcPi|t_ŗeehik2cڸ\s.w_.1I8k/R-;zt_>Lt#g3oN;6r-Sgj'XeG~-il^4L_3 M_җ36`rd/p`~{W 汼>/>ymȱ^m}tz4~ 92{.rgIF4h۹oqùSm?:2ҁ`ۗrcvUـjoFrtz2_7k-t ZmGwbxuzi qٹOijiMhw)p;18f9Nz*noÂ1 K妑)v<9nq `a D2?J1/ j<W_[|5>zЂlMaSM|,HwvXLo[xxRjbkG}A oѦ%jD'R-W~J[í߿|v0\wzmm޿jMi8~Y~Uj[GEV.A<~G+㮶oQgGu1ݦsw`\_۟Ad>vAt xrbtK}U?[xcB^ثS:_ѝMnK`FxMpKB& `ح~Y^wc+zLk[vGٝ:? #>mĨ޸e@۟jeM@:@&l|4-|Esl70>L=Ѻ)hEnP<6,]{&䰋~Y޶TGҎ/2ˡ͸Nvyt.i7I$~q>9=Jmu]Ρ%]hQRO5A|so$GP>=ANͩ+dn~R~~'>-W zIŇd;e࿒_Q0Ӱ)k10=6nt=*hFt%Ƴcߖ/.`O-,Wwhvq\om|u=Y>mMm-"S,b[c+ZJQ+dž!,q@]GsʺZF~tcte=kO\~mtEtGvUu狹"-w՞;9V~#Eho(}Zn8[]DzQ?GKnNA"Q=:nN[2\h1S4E'gLr; xL}gs~[C+^U잫 X‹ _ev[h\HwCFKKU/[l5vMѥM즣YN-BwOo:`Uʷoz;^zo(Ѣ n0\"^/x--G\_0ɷh4mg\J4\/]%.:;ׅ-ql&!0ЯXqɥrtKeC5.!ڥ'gm|N%tQ?''sUD߿yEg\]F4}Jk@i섮ѵ{e|U>G5OE~Y޷=9́* ^7VX"F/܂cz TP͓A_(+ZF:n.#n\/Bqt1vu1 ] e:xJ-ӵގ|vϣ/Ftnv'u.r@|X~ˢ("}͢m5v?r*G0.yQu/cEgmSG#ʣ啌.ͱs:b}l8޿Lטe;xatku4͞θR!qv]t~cFeĔ+tfEfkz\W(z6Ch_Տ΢{Ş#:5nʃ\hA-ƘR*+zl[ɥ.^;/!T~ޢ5 ţ$D_kf:M^_]<ѳ v9ߢQu-f~j6 2LkF G[|50]O>spk.h-mԣ*߿:~o>~!~x{֎i}tth<]F:q6c.X:]`d\RxME Uk^EIROU =vqr;i8i1@g38'EQ9ʋuK&$h -L) ]ȣM>Z5@m:Q?KF!Xm|6ݪgCf\4,OB0γ++/z,MJzތsm:3gr1NNe\uq' @k0z1<*:]ԙOZO$]4]6dM] 3X.Hszrt=/MvT1y4UbG"/WyrZ8]uݼXtfԏ/ c_%gn뇨G Q#?: Wv54\[p]Jxt˦hEG~3_9$_k:9=ߢ^/:{χjPyR)Y?Zd1Z2oA˲]l)uUӪXSKT[kc:A=HZ`Q;w󾭯XU~"GOxF=L|6|SUz}Bp/4Ԏ.he> >mF;vpo6{ _ #FfT :o>GY>q/Klu? 6Vsztٯ/"M׈:ݕtrd+az; ՂW)_Ἤos2&芎 yԣaւ8<ĩWYiչ}덏 "BBG2oNQw[g-?㗿!Dhbem-\јYߣ#NZo-6GD@sUz>=-^Х: n8x;P?Wh LChߤ? oF=o7l7`{~4ܵ^\+a# Gg%}>Upcu5[ :=~w??<"9e|ˑS;Z/=g ŲWh٣\l[H/[ v^km/e;OmFRdH;oqW׹?dm<5#?Ca>oiXiZHG'%nGa ZGs um-+8XOvBesz6.bgBI0ޟר[6{g(a~[?zZ5i>ƲT'A%kfԦONJŅ> P#c O]ld>߯4U{oTM~rtD4@0g}oш׹?1\t4xx RA>Im=hRV1ʲJ _,rY4>~W^V{LͪK6^O==(V=v^+.~wu-'fy .a>hEg6u |A 'g[n<>O?sƏ࠳yc_/7ItP5;agdvcI~\7`܏NuM@h(|im3\ ?W*a|E#a=ǜgh _DV"(q":Ѡ 'Բ\;[͗+xo59k֏٥$+Эb95m| JhO/VɪGß6)ڍ  X6{gߪRzyt:>AqD ]9.ՌpTe]sݘ]s/x7q'^='բ3h)w>d>&YcC-ɏV/ol9[f`X{C`*Ěf8 dG@ &22~-,-d՜l"d(eJ\̖P@BS UlTo˥RIxK(P!<5E'q!+d->&owhTںڣC$>ւ u/ڟ#EG žKBKN =dpE5.`.q%PIT4-6SqN􏮊nSJ/G8gW#fČ%^Y"= ,C,jrU'>)˜)ԲY3m6FR -t#G6"Y[q7HXv!LzOQ,wa'TV돏NWYIhfآ* -z6 ACpa9{[7ɮVn@=W/]U̘Q.YW[/hsrbPI'!dZtcdԶ3Cr4lx^UI>b)"ڢyr~ ۚ*m,PiYƛKEZU̝sյ[o>l.muī[gHI<wՉ|h(Hl]p@a%h ҝg1 'R:\[g%{sK1cHymoڙl@TO1mO21Ъx0te2-*k j0׉ QvZx'=CEw#%WEAZS7\)_ӫ7W)]XxcVn"k5EB *&4m3ʪC8C1C'ANΑ32{'ǻ[pH5' ARxKgq.a.j#CƗ!.~6g5}30);=ؿmbG"k"~ڝμ[p-~⚂񚘟 BHo}яp -P 2R2v,;"SxgJf.95LJ ]~L-z6s*B:y.a9@BExܛIkQRZRA)A.T Y2P\(fHooA^*ݞ nf-lsGB Ӳ,xi*.H>t>E=rۈA ixh[<=Es.ZlBi]d\cةEvce*F <_/no U(~#+f j?U FxKx `R _Yq#M)ZYkV;~AU4U u޳{0 x"c# ŚR\NwTKqjkucvMA45ajPWxkQ⳸1% ifMd{9G,Vކ4Ķ@"a.ϐC*԰JɊBWS[Q7`yp :ΡDNQId 4'Fբd8qjsx0 \xd~ /$+Cx ]G PwNo.F&coYae؎UfAKı"Wu 兖bn_UYB f0T@,-kAUS 2? !3O'f5Qy| FL>8=ÝB$|Ү C1{}&‡oux,Bnz}Dǿ,h@L)AY 4HK+ kPi/PWPxcޖ֫o`9P^k_v0unn h:3u"K1HjN[_CRuPBըѠ/^i! S?>ƍ+NbT-m,RSK\F`;G޶z%!cL60UDNj#tɆJv|mU;ChUfHoҟRϘmyQOqEq{[B:`>oI!4E |䫖E 9`Pܾ NZ/^M+YוN;ќn1dƠ.$۸3!wkG $XiUp4HRp'Ĕ5GLa#sqM A'%9lF MS4ʐ]\2f.&b0ʏ!aSG+B>Ñd(2[v޲9 v34R(@dctJ\te(hlSSEM6;BtA)f(%ު`v|R(X<5؁R?Z@,&G NHPCc IA xE-P&ɐL٩ Zew2+q7JP߁bqP)ΰBz{[* Fߔb2<@"NGAΤ٦yM}\ 蚀9HY7wzUU%lr݌Re$9ڗ2Т#͖@} )\Ug &z+Fo ($C2bTf3 wTqa:E\D} \ ..E o--Ùm P(L~8Qe(LaVb8prF!o_}t\P^f)ZZ8éeįl̹`x0hua[[2x[cO1T&e8s(5K+~[j)\*kPpZ%c7QmMA, D YNڀX2<*)J8 &M.(NBcurXE^ݍLא `C$M3[7tL @ՙ Qꉀb $$oc(~.aEZhq^,)G}^ PH5L+c*"Ue JD>0^zӤ![.PP؀2HKPzm::fJ[Tsx,ʺzr msO)vg7% UBnABZ&}6R꾑';8"]Өk`tGFz"ȰtFlọ<{ۑڻSi B;sl} ή?ح{ӡ SA|hiL(' xR˻c`]ghkALp3wU\SжS [J^[e}2\l$_˩[SA#^`:xp{OM,B7rOR@H}2ࡒw3̋kҾ-AFAD%C*ť*o!>>aO;hlhq vT'@:Eoj dm؟DlWW Iu@aw'.+ ˛҂E)!j=Cx15άɥ mz{ MAfs} hŤz%" K2l@[#@/KKulcvxdh;G+"%q}:΢@_If r]xrRJgD_rZ]Rf e/\9~`K({^G7xd-ogT|2k afH]j[ds[8Yb{)ha-XG)UkaW= H:(tS߾朅bA0[ ob#zVn>g60@^ nO ]J*3`CDKL(vV/T7S-u-7,%fQFwJM,׽du9Ǩ) oo0/a@F?`uXj-޺bd mT٪<"jB[ ōz#D)f-.rD?[]Kcp=8H`B $\a)CLزה+XU\+u% dmnsa9AH1 $jXH?y]vDŽ1Bh+FY Lxr.tG[p8 ĥ9R}e-eR |¿(Y 5P 7SgMxe(Ռ>]O5xk _};vuh?@% =g]s^#X9hHQI/ˁ/0&.%RG&W[4N@ݱ8T?dX]CYqS "ke>' jܦg}zYR\T I] oRp]컯hlq)7} 3(j-.- ~5u1qx /Wg7(h6xw1<s>eni:>%6x  i\exr]u{%P7 ~y]ɘ!o0.bEI9snaZcҝb:&LUy ́LpK!Y-SsA\d^u|Qc)?@MjMQ?2.>xc} ^oO?|eg@z^2>HŨ з).JSyQJG'OluZS\N;¤F.v6WhcL`y-no6X41 )z@)X[cvb )Brldx;.n:Ko;)ףRAmz`6ŷHE<_`"@UЯv<:`&RCFKr[g\ œm> 8  I_7A/Utu Fk9}: R*W9hz&Y.-H+%= É ք:W8iIt& a6JŜq>W+cͻzVR ktVwHUp %P),l+mPA[\tB`uQ-mUhIYZW@\-*3RlʰނKʖ2ZpڒZ]`FT HmY)(YOpY(:w h0ގQsSוlIWN65V5m 4o/ntRT~?@;+ ez) ^r8 4i]\*) ]qi„게3]}-r-^? )4~P-(3/!cDA"붺 gJtCPzKA[-ڶo4[TDu7dtX\`-0B`utlؠ b\h+ tUM0޾:-ca{ENm+ϱERh`L)!U_:ɛ9Fc -eT!mSԤ%`vf&%݉xMBS =@qd0ts%u% "DsaǁPpluMdQRC-#-w-gxPe 2 ה8=Dp-[\=i6ocnoZnUbBɖ(A>h̭Z (RJ14E1Ʀ ~I-o8LW-^wwsdAby[;>(ؒj ,+Ȱo'@X&A>J])C{u=1vI-Mf(Xx8З8!i+MNkT/8;^K f69Fn+8Kd%gųwP'2nx(pN&a5'T(\  M_ ܂Ϣd Ŵpǝ X!Hjh5 ,B`{N@n->oirAJ.]ҨX`d&liv%# W':Bs9K +.0~}]8z40F 2(sHstCOR<`(EY {qW-HW-Ek>TB5f0S{NbT4۸k;j` ClX_l^S⩭nOc0 g +Bcd"P4nwwTzPq!Ƅ[ :wumo#lDs.18=Gبm,k8Wԕ 2gmգyv,]ݸ2RpfBmlPJ6Ĭ:x-,`[_A} ʩQۍf9nO nE)a k.[L=`uWARrPjwW[vDevZHmDëzd)P  z0leW2X%6'@Y2,/%ʗ fYvWxsa[!9\ܾJum] nڏhiUKi~b,0Yhb60@ʮ`UWOQ{zfn׀FO+ڴE9@(ƞ4۷m).PIA~9 o] Nld[^wq$jd 7fp &a[;u~t-%MK!i9x0VV7Ъ;}o;>b;tɄbpAiU@8ĘOEgZH,+U~Cʾ#w|bdzR)[^5&p{p^+[~y9ЅбSlLBbOw|uԎ-݁ 3*w2TAQF(J)'!ǩѽUDž0#v;OSvO #1e"b+O])[y{* ~1WVW`h1` ._-A݂ZRK8"t`b)_%IMmd@gTT>EI.l9[leFKܞ̶?Pc% ATT%yp}^X Q}@)4Afq6xL9㌩KNݥEg"zvͰԞcÑTwCt`T]sUR~.AO - " 1rƒ =細W."!r vji[F.!"Fv7^ uhdYנÚ ѓ>C!곓bQw_,NIS?;h(w&D `IqvS5Kp=E\jYjFu O}fxl1;J sgԧT,^;\ZSZq'Jq]jm-{p'SA }kk@Vm 8gy "STϡ B@}Y=Y?k!EZ-4_ §gcoT@yn#fz ְ8P*U|8?y@5(-)`V Y.eJQ@wydHd'[8EX')uE pOP,[&[UlflIlw?I@2U){z5},yiHtxlO :-o#i%%pf-ǝl +v6:_[b+@D(KwGKA `1. 鄊$p& "N1Du<9-4^C:AyN!r['͇2HA\*!̢ijz.)b.H0@U/QEqբC S?.f+ hPi@ K|${yjEF`/.Hɵ'5).tzT@wصf:~{joV.<5ogeCe2 GS1{ U*UsXS:@ 5EZթ&` 6sR3kmWx0^)hf%> d8BuL@9]Sϩ#kTWRF"i -hL,{Y,%(msT<T\ۏ.\̀3 (:)V vU-00ǹea85iFN1<mQ'!2(oWc"էc֧G >,^H3m2o_'QҜQQvdf=X*$"X=`۠Zۨ7H/AWL06~Ȓ!$fQkx%]6:2W{]HY%"DH W2t2=\s\Eɥm#.)}(]0" &))>jU)4?+4r5fN\XW H*TTS3S l9!S0&M߾ƙ5 >^H0\޾bBr\O79j#gYEU|\嘵Uy]]R`iGQ J o_-ų{(P Gu`هX"t7E4aUZX_"^ lue~ At^\{qMѰ,?lo[#s0=cj };9OJpHkL JYaB߈C:2.)JuyUrWVEPAd?9 ,M{gRbyZR$<35DZvxq =%pvB! ɯ.8h:P!52Nv)mԿ,Uy@Mgڛל&k!q]0qbcd YiYH8׋%=E]Rd|~y/i^v7vY-L.Hv68i ֬ H"g&%w{R`5 J8Bs`HNS޼plY)6ŠE6)Ý1 `%A{G.)X>7Tp=;!O0}!!~-lrPG_* oY!%TR[眼]QT)|i3Ȥ[@v)4gh[Ry/O4YҎ͌yk`SW)ҽ^k;&cm-rT,mE+}VgXܪ`9A]M6c#wh11SPpr2삘^)YZ{e.C`̢Lq?oe`Ax*#lhP&nչ 6StDsbCToNCAp_yCƓTjv=N*ӷhmq\Li).^\D/zF9%{ Ծk%EWSÁׯ 7CsHo;>‹~I L9Fޡr0h3m3HZ_-5h9niҨd}oo'bu(LisWP6s,3(e8Ğ]IH:q_1]nY N{$q{kΉ a? ܥBV|<. NxagRpԐ]tԣ[R?"rI[~{A86!XhCK͐3Zz[2]LW\c*MRDԜ`w*{LP@-CxA\}f,p*aXJX3dƠCjWiATSoFz>y-h@G=ǘǼǂ@sA3$ЧK$O.)oo09]ϊT,+9PTS"ϒa+bq7A>iJ[䈓şQ /ļ␑ṝ#uiqsȐ#S9o6&3Œb)C+{}*9zearP @.n <++IbPRٮFuK~:C 6(3 -r z`snq1w5\.?}>!p_20سV-x Fѽ1(ޗX$^j}&{=f 9v &{>T>2 )CL$F݋n (pINS3@f8 *mCy MRuJyy[}VX0$ZյSdpno[b9=ـ+S!7䞶k {b{fJI6_EC|ŭ]Cu%33h 2 l}= ۴RP:?4_%HkZKJ" j)깼Ǒ68"a46-8#pwRȴQᝓw3XInTjSTZkkKM51N.\J9a(c4& =|=w[JMD0dSJ@.E!v$p* "^|^-NN戨h<]O w#Sׯ%>v|ˡ3?q7€(5 ]e(g=oEP4ts^CmKj5־55wqrjcQ §SKeb@*v] )A a]&’g&19k,khR94dz@쌫2T%y>N|ޱ"L D#*Z>l5]C`s&f̰=YU%Shx,Tn)뙽->v~^rO췳wbEYR+^hY{GI!+병W߯2mm-(hCE2xKe\q$#bT1R b-oL e\zy =r}ƥ=Z2_dx!|[NQޖ"|LVRl?G3qz AcIȡ2RgC"l LL[ٙʮs9\b g[I T.j5\ K:;J :" @a N1,M-?<V[ -^4(?96S40.Gu%VZ8*C(Cl ޡ٫SssCPa,;bK!{#en*EQubk49<y(`3~7԰9.+u[v*l;.nHX6cp>G7k +ˑdj"EjfUv?m\bwG nɻQSQ+Rl'vzQ^늁kU쨢J3A: xDoZ^ʺON5B~]ըxY?`E&'xP!F6)iWN^Z.-D ^u&o ` -kMDTv=ǶST2ihٵX$_<.F>R!X<5hSfl(p3mhO@J0k0ZMp;vDiPbOlb1MQ ]DCO ,W16dRsKZbNFEew^3VH3 oP;L!#\bDmWT:6=%|]},bBE~qhDbȢ,]O:ľoШ^b$/=6'tj)HAPρ㺠] Q?ߧB{vBٓNdt >Mͦ`!bmNt14vqmd~YŌ@yQpN?:wMpMɘoYޞwR>4}Q mf~4]3.(K ͊ #K:wIъpN չs ]sRzI.{\7W,BSXϽi7ZdT-$R} 8?5TS`xͩhӫ,E8yX Ѳ}>o}&Icg&B|-fa2( ㈑kkuNFM5z 7 'lu$^^5Zܜi"kcZ\ktyma(b<& D+Ñ'ܤˋyn[ pk Gox"4npMXI!WZ z؊RB-yu?AZ:z@!Pw <gԸ:Olupɺ߷Ĭ9?%d\/3(Hrr4hJ`I"ʡ7uA`'+zI FOmhhST= ߵMqإIýxlG =2q'Kݱy& ` ZCaZA59ћ'5;'܍u `bVhSii!0NB\]^"Z ~Mx`G(&]!5dɎY] ͷN?,OW2Q?ˋR̂9 Ľ^Cu>9^@Ц!5C}@Dtf)7j7 &:E.chQ%㡕ϡD'dl>VKSOaQ%^B8Z:W['Sb_rJ H]#ڱP]8}(z65-t5d^j>w"E ~_$?@##u06(f.*36KP)#EJߚ\3j7Xdds's%nq#OچV^׆W,';X coĪ)T{?:KSJ: t8) .c8xPwvj)TKxcF 5S Z7ܨ@2Lh Fh"[+ x.S0DBV(O>0ś*gd5'N,Q&Usc^BطȄuxQckQ 2ږTX]d ACdK |2N CuZYaq#WrNI0{{0-p?pPLma8(0LBU(DՀԓl, +'G~9X  Ȇo1ay2qDKelOh9&t17v`tci٤9&\q&LߝLAvKz6ċmҜJ9YI\շB7y{b]!B ̡ǝb7 'BNA(ro WA3 =#5r~pe?ktJٺPH[Q9Nn F^R>KtDy[t\hNUKZėhs^wB t+7+ mI+ۍc{'" b~/-K~{6] \`rL31]} bf;ɢ 0-a԰G17q,7vtqnaʠaU%kb< (Cf}J/5 hx׆lѷ1Xl *Ӕʇ;ZX[|THq%8hsxoE"ж`9V؛Q?>(6=90}~)o e|loX>QЊQ lϮc0hRx~~6 m#B {cExhh^xjA 5xMz 1Z\|862eV8vq$(~ZX*l 5o'yYm/. "5QPB`bٜ9r5|oYOX2oX_3K/|SY﹟~6'5 e+yofΎ$6v E%wy'R8m@YchlBArwv <=ОpS mϼ1z~`Hd&$[Jv 9҈n|SM"q_5t߄j:PII-Hk)iSyqG{P#L Ī[b B9ViTo6,@=% #+qh{%[O0z!4bWxov|^zN`%O|(,G@{g$[hs5.EIԀ)9~O_A!+r(sUAAaf\R<7HgM`|qIE{YƵɇ9} " Ƃ\zMf`ThO-Q;$ep k`?si#-w|NY⼲71*lX =!Rdf8*3ޓ'm`' {Y`.#lG k d}Ql( e@3tn`~*r%kKӽ}U>6;h7) 06^5dWvrIj ߍ !ȡ)iKH/3khż1)J}'ڇt4*3J<زKn2orq-{*S[߭ ?\UOْ+DJ~3.d sEgQX s+$)τ.>j` )ʮdlYFDxAݬ'R!Frn-) Al‡9FhF/ю~bMۮ 1YٸY%jxQ;\ǰ:*dRR'ZL.Yw׶bs#)q7xp<߰b`ܨ"}6)FkXt-1x]ʔzVJ|0F!ĊfzN[3z$uޱEF0g "5Rpt'29m͸lfP}F:*`)a)~kQ-Os ۄZB:wO mQ~ՉV-o>$.{WF~m9+` h(q'$<>z?pl#w@Cܕxn7\g^qⱅl{\V6X-. 9?Jyh]w㭷Ԥ'yn:KmC"6@SLxx}dO1A5iLԻ[B/1#g qK.gp1KF oG֨{LtK>@`E@ӻZai-,Txh6z9۔uS2egK$>GN0UŽIюzq {a.mS׌i@d-2t=qha,؂sZҐw9R *:Gg…^)tƮcjr zl^#u=hI,XhW|Jw( |y1Gg;^ȏ45xDB"%zYZ#!Gh߉ܪV.75{r4άе %Tj~Dt%N,UȜp(ĿD)' Upٝה惉〭m8rʖCv`הjemD. (*ld{q,c|#anAjW}뺤Ƕ]3*XOS D+ڃO` Y9")%vF7k?b*@}=ّJQԸt:X:i$4paH TD72"Woc o*uH #֖.XXZ'Qm#NĬ+H*<04&T[IK4-?`X%ƹ݋qn>&'n~<^]i[[kq`N)y&%E[cqc˽ hv)탒4N!z e$qb= c+fg{tiG=OjϻG#^}t)mNXm - X5o7HNk?N "O.єJ~ َȡ]"M~^z J~-mB>"tiGU)pc_oe?kJfgVH-,nYvz//% ZQуqplڕXyE*5=5ZrɩU/qH牺`"wDqkץ:ۜȐ'HmJhw^wr{:CXd?x+Kąk;t!+idBl0djXL5`/q{OP~LA2bP&D3y_6u]4Qŕ7e^#q;w''>2Tʄz!xW^%PHIu(n\隯`Cs I(6`>@w x}nλ@G7G^ ɞTF+Hteam adnd;g!/B"i;0Q*2[ ka*w ǀ>8!: ge 2A`(t?~ޮe>sS"tYzެ"ֈ%K[JnT,h%|)"Ux6Iq.WD U/h=RB,%`vY_*+ ;Pɻe Tx"b$5؇8b7b; dpVX|%:껾LA -^`UF {H}͠U$xz"WD77*8g3~8vZ^p$x[ q}eiٱ *CLy?%dOί)ܨ|:ߢV(CpsfY,?~dZ\Yʨ?['fr"Ϩ0Ɣ8oh.t66pBX !z v%8FnסFQnh&@ZB`y"@. dd^dn?R^Z䔑D]JEƚ Q/Yjj*bT~|bj4OTsU-Rp~M xpNGBq~72\VtY @hJTׁW\slBk젏j%zX>,PD,GL"5&-qCdUg|1` Dy~*d2^<>ݷ&aA/!,khSHڇQa[M 9lBA,؉,~O.@#, (X>v~'aM=e5PCb׽mźF;hgnGm߰~GHʞXXoኙ̌JY%d~1p@&06BgUx}w`Lpu?.5&"&CJ8ƹQU&hV,]u !BD뺓FgSMY ȹdtboıUk٩n@#04k0?/;X Ty;<|R<¢XrWm܏/&u=X!X{[8M6:] T${7'YCP42vRزk1 uNeu©Pyhl>J,8% *<0Z8'9 J N,r~cmLꉞMR: 8iC[0dzd\оvj_OS $t[[J Us>?zqޭJ`xT87.!RVjw{}AZ4xtRNh6KLBE:6[W Y+(rkZ%_om8&MT=ӛrݸFj憌Lt}7TlxGP @h@齪HJ_pW(+DVֽI-'TFH 3e. 3J%%2 *~W,}u';W^EZХm8A90}~B (QM+7Ѣ۩QudR~V8`z>:*_ !+(f{>BCK9x7Uz/;Tj< #A' GHV:ϴҖ&r& ӔA#nA&Ҧix5,DY!zV/2#tFlNOr̗kSJ֏&m!J F&W-9b.(&4^b \g}XHw`_FyG6ƻ:8y ILj.0GX xH%ʅ,B92!AaXݭn9ٚ@;524i}P ovs k5l)KsngD*Q,%sx3ZSй =~+qzfyG;ݪTQW ,zQ+[?eR"ŇwR9^?f+Z"&ѝ3wa {iM7D Z0U &(J%[yǼ}e d7+^V9ȩ{C7%u.f 4O:IE+tpƼ{<:ݾI: @; șD -kouዔ*,,0,AzLDq4F;TD%+0 0))mY?Fg{,FH.WWn346 0,FQW8ɘCi/)q~WB*_xc~kE)ƪ}7a IV9?6;?kj?wޤ/GMOCh`c ċW_$W@M4;~als:࿺,vÀբ֩kypUPĻ :*D!'`a*%`U`"yjwOvV-X+FlQM-%v3L_`SNs(21(Z kj797QM5/\^N{x)}P ;Z|#N+ӸgO'w5[]1h wQ,s=I#ti$V7JH,+ #7^ QiGtγ,/3)FFI~7ZAz?H`-ɽQLA9R^Cn{G?o00dwJ8'o'7(Aq'GXAEP~B3Gt mR"zPPBQgmvlH=rK޺~}M.;aئZX|u57(#z :XY}S5f}a%t @y'{K }S9&מԹ0ekn'Q3nOƉKoD0д"i4aGG*ouFunS!^A @R9t@&%bVoXxUAG*aH]' M'(0ꮐSJ#lXUORʒmhO/=yj.F{t#WĢ!*l䟇r{zxfs (jn~g e L@ cWraN2!uVX\ w fj<굕&(q 2_!8v27އOMI7YK轾`(a)Q>~.vd4* '\J+z Q[3UCSoćN03 8gȗS.ф^9LŸj^=2`~Q\:2"RM*"-h 7E*78.[%M8`v (fPУ;g˻M m`(4w}ْQA1ӡ&e/#;~o⸎){Pv;9鴐EC㍘=~[BF] V -N;J4_W/[N # 1% G]xSWhb:4P 'o9۷el*@:*k@J*],58{ޘׄ^ d\Y#IkԵ6N:AC:֓|Tdυ| Xg)l†^t8 첥/y n t\Jtlbn8XHL2?=! afNazxpJ7IbZ߀ ۫-ƏG +.{C'N!vQĝM/хF|"W%]}]Qis-+ƖSBQF~N]TH<6&: bnxsK`ErPc+$H"Q*ZqY,б©w],oPchGů`)++\~f3BH Ά^Bwi10)kmݛyH2fμ%N(Q,dl$мNRB57\}A2 }牼y}SZ%WÆ`2ibzN6 ,I6vJ4 Ǯx7H EX?9nF]i&`T#FXuPޠ)9#!vSO?}=YΫPeϫ dϹYwUv7M2l( ߀s;OHEi64t*:RN(Cyv)۰hvO0?i2@x*"N,f(zR04$CEN 0'>C$}үo̟73j 2՟#+Pplyҵzjj&lW s1#XtW&F(m>ز`䌎:9%گxS qh>̲† STMt}R4H1(ݶoc% ];A ;I8)°1\tAN*EVQLATtb~_UQ'Lcٽ!D"Y#ꑢ%0fb:=ac;ݙ5vso2aEAE BZ_;EqG/I3+W@`WB@\eWF:U%+\Ϯw MOHq++5F_Ē LƲ Mv~W1?L'tn{K#{zs@Uqk #]>~+ƌnwԅ$ĿJT @ZjF 32K+ p=Nɑ0 ň l'[epLC+gb| 7YwI>r +m~M T:7 {D d^PbTO>?1xvxKhf{}ja`F]$UQ_jv|z; ]>KQDxӬl`tҙMM# /T]X4j}bsFRΝl0Z ޏ^8\~c]NyixWǾ} qX16[W(O Yx 0|Hs/04J1%%~_:.Յ,қhN}~=XBDx4 jͩVd+!5.Nf):[*Ȯ_z~ q6H+BR7z@Sh03~}n"?$DJxdܻ֟PlϽ \N]5nI<(5[ Ł7޴u% <Xc7r|o^ۻӟ42Ć~ޯ8뾚1V9tNsx jIݎxuEQ V!J0]ב`e%|`#wlm4Pͨz(+'sNʺÚ{0}8>_t`_׆wR|!\zQoy!7(k AG(B6U(Hisзz3߀$:-,[$FY (;8X3\ZMG('^F9ח^mp"V ^N%:9?A#g?cK;Np1#?giS$p)f*{ F B@rqE &~Q۶zI]l.xbq[h^|cMg/{W6nl /04ߢDwǹ5YhIUCCKtlg-贓%"9)hQf c_)! #9(ov[j%2 ᾂ[H+$hӲ9 8Wz1Y4rzG9,u&fCN }`z(GH :ݶ3Kh8_MEQ Wt0*.|df6󮰙]9Ic(p1nx{}gYdE'=7u#|c=t`PA]xF bxa ClUKv>ƛYUC1kFDꦆ5ql@ܾMPL&Uy$أH Mo'#b~myXL@P?>Kl(hhhg$jPP1#6q;i&@f iVE ~)Jz,A=̓~Y_Y_4%T[:l]Xo)CV\rZJ * d] h<q54ʉGx^E?-Qn/Q=y~/2nl`IY{==?4;Dm2J )+ tb0!79ВD@*-v.6|q]Y2荾7ZDYHإ%pn&dQauZg ,\Vg17;0/o+s3'>eH1҇|(Z?뛲3f,Exj%ೡ#w9-o`T])0  n(cTN Jk};Is /T'iY-v/ |>`JڍX_\K1>A,QH@bHL$>-,%٩Dp2r3oewf;5,3ruؽ>!;ʿ8,,YgRQn·jmI YҊ/`Dk Cp-iX 5-EIQn^ujh6FQgE+('̬zLc3Z I8ʗMPBk&߀ &to(Vkp.~Gñ4IDJ\Ϣ?iN IШn B'U21䔐<~V2\c7AIxk7u*"h>%7ظc3˪JGEKjY(ڜħth;Lx PYjQVau! {T(s -0.eZK;5E,X{%gVYX*G8Xeu/c7T"b3xkPĿ@WwφAd =ș Hц{ٕcCwtڪp!qDrF;FdJmC@7ZfZ ~}|zluU:b]Bi}E'ImPBS7k Sb/cT,}TͧiAɫSW齡ssm2}SzAJ(45yal> hd78 ˽/ŶV/Fw(ǍʚO`e%h0NiʚJZ3u \5C+ϩ:7U̠n-!{}z5P6AI4KݠwAVz,|)Q, #I'3  Y59=z^\F֧TG_Q # Y7/__G0*7%xj-g,NLDno=yTx;"^q=G.yOq;0ޖ(}YY"cch#ZF7{*^ݯx6$VBKÊF3|c@0loIT 㻯 ‰}uÇjDv7|@{}KZq- eay]fqv(_:LOwCIO \\QN@OHh:;O]%<1;mu@y?Eܢ?Y*{G# T/'I"־縤4nI4ۛCj(ލa<z`DjSu)!bPxZL4fI Ko3<M{šh2grbC1vSZ?%D ( 8>1Xep,ojj!+w!䏈T*ulҵfNT Ck?_0Zm1 tݰAfF-v&;=Aռ۝c? uT|s7nugo&nK .W$m-hh6y+ih BJOp*8&,;rod@x/h:h~ R|N~ks [EF) 5)u~kW JԅX EWd}ohӺCvwWơ%Ԏnv@}m/dttP1&*Jnv .5t+Ko>KGl볕#̂~*3D [? ym2 ƃ ORBsP5E.cGe$qlU8}7U Ŭ63z noYM(ϣx*^;vVX\=oiHhVh&>r0Ƙ/;hM E_/oLJ62iTNM!0*;3]:dp.;yGxr׎W!:ojY42&&ʆ)'¡Ye D^"{v =0ؗeEdMAXLlf khWbhX{@ѶM&M,gnHja/P-wx0cm<9r 7$Zt=Fx1.cK}`w ;2 ^̡jnfg8D MK&'cukXRC 8`]P>ѽBoSRu~J n!2ৈwvcD*4۫EqgڮaTvGegzbzUP*=*g $sg8 \+Q/KxS9SoqK}*L=+\נ뽍A37DWX_.HiI=%kўO1Ƞx{\%P{\KI)਄ r/cdL~s"A z dtrPrҚא ~.77% _P?'6~q#߈]  z>*Ļ⍢R@#(uhA6P[Bg;hCYG~isDs;C%H&mxo 3"̀jgYN~M 26"WY`փEqIKd6ȣpZk(<>yM]HKI;[9;:9;S˰ Eb;h5$j_Aۏ 7.{yZ@ ڨ1w9P7v=+Ȭ֥Ć>় #L܂M~N p]+ބ4._kWns(pISU71; v&1ViKaU׎т!T/mJ?$5+@D]VanMIQYI7pa J/O[D_C{sIRPV{uED$&e{_)=O&6{p`S-)g@#i6tJ\2t B8͕4뽛b>7_#DF/b}~KXeN~;V{:r7 6qNdUE&;"%sM5OVh+oEjIy*1˽!~hP;8V‹[bul)3FKK t J¡ͬt,cX)BKE^/Y`кQ% Z_$,vCi(S亙Va#2gT`to)̜A^;GJ̊xs ܡ3ʘ`7"+(MՉ{T I*.!c6^GG.`9KY b;}.oT~2B3cQ7ZU(0ӈ3A5 Ǘ'`lIh}&ԝEѤHMM 0]` oʱ'ȗX b4hsNG)޺ /9[E֢c%b)kQ"M w n]7`_8nӳcZƵi<b0*Ql@hK'Z?%'㋒?ޞ(]e1(K( 9H$3% +)GwG)=p|!!'"`n"nk hs]|NP:(#}amq+~BIr]ҿ8\+4a{oQLU$K_"mWa0JAwhuJz5 fldXP"p*„o++3хJl9=uQ\Np =%pVVsrk╮wM'="F=x!,QvoĩN4-=z;qMʑ ]H+X)BGx@$LS6m&pWe48R;⤻+s`8KЭ1`&ΨQ5dq{Q<(Ů">}W8*N/ӨP18"|+BPՅo5nP6e ș%¹W7Tm9bP-b5Xo%'xd®O w_VM&$UJR 88u~ŋ"0J>N6znjOQǻĆo%PcuR#`#BlxWyN 3L_ތcPgLdDr;?lf*ol÷߽KV7=A)CFH^S!7ШJ.SCUO -rkI 7> _.U"Ń#n9 ?l۽אZ+T7fm'j#T&xTogHqg;JS$N7rh[S,X#^;fy^g % Oe#R!Z>s<9&M0P1ƽX|"4U~B

K`p*p]'6s6p(u6'^䔔'\3+ aE߄D&K3Otר'̀AWN;kњ]d=RY`pR 4@J%zXөP֥D9kV$7|Q^MGMmw'8j<43H=RVz16(c|՞8YPr'`(eVF]]'Y^W8O7ˏqj5~*a7 2(*70!LQ© P׹inM  bKӇYp;7(͟M_ǶzԣtiB򻺩1.f'Û"ph& /Y(ffΝFm]!X|ȇІF3HhVwmzG;0jRaʳ(qWu߱߀ʤҡl&5$5/(daS}pJWp w`U#g{0$љm%Ix_#2rr9c Gx{G,{g̽F3VѾ 4b1̎]R[W<ФP-5)SMHD4PQ <5N/ 7 V'tv%L˻Ç74Cj-E^*i xy_(wZ:+ }k7(uI6B(iv ,iv=_?8A.kU5ҿ>_WNӋ_*26:nϮ!d}_iyqON@H+O9سDXH^=m "U]B RV;nϫ"ipͬ my0Сok"z$vΏlj V8R<"~j5PQ6fٽDqtT"WDc౧QN1\o/*uۤY <77W]nE*W^GFG B7{|xӁ-,g&縝D,> fSÆg~ o02xg=2~Mg;8tUJ$9U8)h;c&Yd /ogi?g QtNlp@D>ĂцEy/4ncs#O3hJL'ѱctӪ#[:aK>uJb(1aЈS8/C}T!ೃyװӆsog? tbc%&x QaHnp[AFyvTЭa3 xI|3G9^ 9 MHs;' *^oejf'nX`ѽڣDm$! xhG#Z~sч:+XJ0]ݴBA8ذgоlB*֘x{5KdQ!|GQ-&;nDB n_Z^*V7\c;3@W_YPF7?[X̂YuI{~a_wYڳ wF#l^뮀<+m/c 2Q{j%&^FgJJƴ@Z^j;Nw}Ei ؅ƻP >W~WH\EP!Z̨Ѧ`$('렓Sgp ۂ l|}=sPhuR}ᮀѶѰHkeu_H}YJј%WxyFKCM‹@bv_YLz5'[=vuhiMn!YFA ۅ/=pt dyFH/Zr gfJ}1(LD>Bp1˸}P9.;0*"%Gg+L@ҡU~}SB{+Z 3׿ vs17 SP-@?y:+gXdΧ}9^N/&a1MU!`{?:Zݨh25"v ĄѦ.hOtbc2K [ٱ ;~t@D_F` @5fUH~|@P+6OQ@ӽ;ofW)\(D]!}r.;(OPq;qǚ8+lQV@@8#1YP8w)ѤI9mgXE5]"< {GJXYA͠k[nbsޠB459En幯xiBlCXuĩ"0Pj羰n< xSO7%ٻ=.foJ$Ee"DDZ U$.>Xw[%Hrxi]ny 7QjlL&}!&f/~3 ưۋw3T~חF s%1p3ǽixo 7 _`5)doΣvnīY 5js5t_X}*Ӷk%+]GO p *,->P{E&JLPрxX>ctVx5 }̊rGvѠ\푾c`/NvEWr3H+e홻LA0`,38;ڰȿxݧW;X zz)4q{ud}Kgy< agϧGt.}E>% `K2)~[ 3 뾳B qN_,kIu?Me}cRQO`P-[veL6^U;X߀s>I] %潣F\stIwK{yIhǯ3F")1duǛM ݘ79# oe [="*73l4@U6'x&?τ8(:*~}牯86`;UBa,oZ9)? 6I:Bv g|24ǀGӟ-¢m&0KL=+~FHV;ړ -}ohƃ~Opi =U}/&^ ^IYR]4/ <l~w3I!È.Ѥ<(od4sdhJأE$T}}tz kKso rjIp)&JWd%~<)7;pøEEWQf^8f}Vw:;mhq1k֥B%;x* HE}ZngY wb q``)!VYCؚ\9#CyC8+*`mKt%VqDu8?Tȱo?Ѧb|2o;ʏ_6>.ݐX`%pfYPi:aRs%2~JwH ;k~;tv4OF4@p E"#mI3 6=ilh=l9qHA?j Rj}~OqoOiVghP y6C./zCL&h F'n( PE6GHJĪp~j{,Re~V^>b}&&R'so'D$gh(UBJAsGw4mQ" }En(l*EK/w',$[uQ>D(@0 hn+RF^(oC*D juЦ{;Qo"J"Z۫` n~Xc"SIG 7OHRY' 5ۧAT8@ƺs`fƟ.m19LiKlgwfFdu3P+q~iMx 1EǼ3jeaJ'Ěws͝^,Q;ܗfi)ȫ@{OOQvpx*awa:|ݳGאl)V}W{1˷B[7dV@pJx/L»K$k-fxӯIz q^V\vo 6w,%r*^]lY5% h^sOn&̾o;J?^=&7s=+X/4TK1"N/[PZ, jT[}M2UG̸89֯((ī{O;8B3?sJ94Z^wU|oc<ʷ7` s l!}nؼ1 z BK[9'͋?$0RX30l"O)h}  _blrvU->W&Iٟ!lЫ_jNu i^Wy (*~JC7+?P&-gqiĮlLk`PCTȝu{ً`ؽU jρe0U~BSIE=$3YX.7hI|]s$ȮKԀX|3A'};5βɗ^eTYѧkY`7Xa&5F1lg\-(;Ⱥ%*'X( _1}1AYtJD 7uݍ5=# %Yƻ~ZOHE ߈㋗;<0%o9Am41";Ip }xsp۶Lo!#肶pMS{E zTH AT!ݳR {C9ccѸ*c=hzh$zUnyM*o9=:Kܻ9U%U!D!I+a- I0\+fFGBES9%n2Àp`㤕p~;=-*Āk+ؾR2KϬvg;T/ W s㕑 HѲ)w˼ifOCJ0oƀ{ѐ۞'Zr jM?1EE+DU<zR멑q YCDeRM-Ѷ:i% u'wb"*|H;[ [r>|3H!ī㶂/VUxJ& t8gUz5>(#J$CtvN?R3 mǷ((!07+^zP TG(=@ΫwKX^@X b=%lB1F ?m?zF븢M7j haxJ䐭k0x]GHTؽ_G{ҿ_HѾx1<UZ%FHͥ<{G|^F\XW g$?:Oɮjxz/Q^ zUɟ7' :K" 'i D0yWD1~!wݚu?Zb6 cJs` UhDG㻲;slPҎW{m='FV3OtB?lA\†DMIDPa]-0-sS~5Fډ2[ר :.;dLpVz4 <^NgYJ彼Jx9 pkClgنd% #i0+& 5zN:xzdZbVct#H@.c;JWXM+q D.gy

E'<GKT~8yb7R!ɕ@ǰ,ITC#IѦ*Y^:9fF6kLJ_}}.k8_)FgwfL6f nXS`g,l}CMW vdta94 8Cѷ^^QXzh4p cQR|pFSr`j%I^!~ws0 .w(lH ~85 $:q*Qߗ7-~ēH 袉:J(1P5ޢhJԉ^sEa4 8'F( Ȕ JE~͙g?J5oգ(]6Ri^a}3m.pUSnాO H"~ů׉"xs  x=LBHS,)9{7gyyQR(Z `G/!3Z?WH]'(m.9FDKnY= M7qJ|oB&iR9dQEoO,G1(A OBwpb+'ڹŮO_a^^S7T YUC#H]}[x~mܷULB 3漼Þ%^{7߳1(D0=`+循^oXηT`x:3ة"EX~x=:+k P>HmÝ_*|sK;͗g[<߹GJ7\hd&Op_rm%t'D׹sfh䫇z_;x7UQp.p&Rb&(f?g): ٨uzt+-o0΁՚<V``?&souVaͳ7v*dkd{{x U:\)ξ| dlh-ZL~pU(@h( B+fN9u͍>j_oMzw5C=w[e g돗DȞŦPHyUk%gm"Ζ1!q馄mXwp{R^ /w+}1P%0ʃQ&& xSog{|hN -oPt+.0xt7pשʹn=kE #PiOlW8%WË{n:9LH SBt9V"v^ >BK ] @ŸH``۩vVn~>|^oW=#;`-I2%am8%Ќj= v1>+/QG߹B^ 'N+{XO˼f—6iT_\&cx Y{:ft?& cow y.wd{q#z?]#J6 wOuIu+*+,/57 Ȣ) (/;Qy4!O$CaI*GFclĆOaLa= _]Wi)ONHdUi-|9C,L!WiĞ֘sojsGT[ iWoQ H6+ CyƇ1H2<%*hf /([BnW݃Fi)W.A[1"P^ChŞBP:^!Qg= ̈́^^: WgFwoRF)g3?Y̫\1\M7-avξy[!AM[I WʈIydyɂF~7Dm'Yf?gd>L$sd+\q h+ HZI}YlXEEn ƼMBvä$7@տ\:MUA4U0IJ+sU~}nqY`i+4aǼWp5I%> Jb 6yUg ៀ ZBIs}No=jgؿ:%껛&h@a8=Wgu &UƓ5sW +9)Ԇ7U&v"Rr~~Pazp"{5(r8pA5dgxO%}+ɇi^e"50*5evWAҴOS"?tfXh plZڱ5ZHh{CJ86X 1Cm}zc*;aPQ /:f=f\## 9z3-ƨ]OJԅw}Kֱ+HBJXgLƜG5v1*ZB`/t**ϱ:Ϩ!;Ͻdm1yk%^"i8j JRRq 1[R.ПJհ[*;L ;ZQP`J9~V'+鬽RWJ(+:ywu,j#dK &gzJy~}rlZ]/4LA!hp|Uٟo4=ưj]u^ +ݫOonBqOo8uaT"Z˿ў{(u:Wul+HiF+1BY7'(f?K`9C+V+ޤtOGZ z;K`_ şѱdW$ЫP.Y!F<<lngVX\}skNqHxGwvP(g7C#}R mgy {j+_rHoz+ñ`sš=C=HS#YD2Usp_?'~{ #6NgAOdE},1%Ov!^l9ޗ?}Sbݚ"8s B QPD[D6tKe+WFhG&XJ#% B? .$g_i\,.絟崹Y`<o }8#UO1{;t2^59\nzBUS9tIbMG6z% 7/@$ ~‹Kp}7-/^l|~uaᖹvz[ _гvxӹSji GxTוHQ8ytY4diuȮ8'߈},9ZX&J xI1bD7ϡk&m$}g.,5C\|g@Uh9[teQm%k|÷2 /;Ľ--e>o#dUʢBW-+?3K~2/-𜛖v<$%𗸙@x?oO"BNTՍg`d&oxxuU`;AviFWmȵ+B  ,G +Jo© 4^*tu=;ú15r/q_{}_ ޞa0p^1oH$i6[Y~]Hf4ci--'^ ЃfIdh;ؿj91uRCy,|>[[J8+ zy`]-&;<%Q+OYŔt(^Y\j S>;wbϰK S_2\4c@)'o(@y9 `lPxDb4>~*#jGF&!"7ވֵ{h?oRR# p7džO?mET(!бV 5l{?'/ix - Kv_XPEcխF@m8bUdб9HSZEJ88S-|bMÆP6e~P#'U>Xj`X~W]b9b>vhsUWڹW8@%ml禽^뾭1ŋ()VjpocgaʇKLB#5(,U}]ب{Р{Ը=: (6BP`8- 8= g. WX Ql3Ϟci%TE hзtch4Q7A<h.&4ڔ:^DMFx] -fCKxdtbʝSB*׊3J !s Y;7^u{Kgn~3п{KCXA! 3J~Ŏ^aK=Vb C 8ILC%r'! W$F//`BC˭nCLϷ~GѝWȮO9개dʈ9Y!إw)Ƅ -Ɩ*SguSa?A';lYaJ 7aH^x!r EJ\U7`^Fm67* `&uv;ifD ټsu&5< tk?W2 OeJ>)̿=]ݫse4 ޷^ M:B!Q1FD7P+Vk+v`{K -GV^Q۹S심g_"W酿:N]ghw6It@T oaS!E7DnhHڎJVR7ip{aiԂ`ϱU}[␧5u-IZSbOl   ߢG;^&I T9'ԭ-on{w9oz$L(&/;7%Bkpү9h$Wأo52g:TwKRKfw%~^m5*`'܅Efh>gX Wˋ\ֱ~&-F H}}7V{`tz؍xч1:sF^Au_W%k-%v^n wlX(z1KY5]?E#0B=@=K\VIҘ#uqFm]up=u/$vXYj7hIfL\S"9qWr5$H}0}?7S$ #gfnIQÏ|hgZbZiHp_QZwoLLd! U ^~+L#g+(NiO?Ԃ4[V=~nt1Vua!W `tN* 5tc0^ZA=/b`e.؍8韗Ľ5MO Y?97Ɇofx~#i%{xh~crFa8R">`_Ŝn]%|h|KB`)fتW{Ąr}"רUh|vBCVĆ?߀ӧ }iX~**|xS J"Rp>:}V{?W!q,&ڟ^}ǛoḌ?A<ê3_ł/}k 뼿({LԂBf?7^$ #VxtdLtJ̼E.qTp 9 iH9+6 :ˇ FvG)LBA(~_p;#@Cg\gz/*$g}+M[oR9Vd*U@S `Ѫ&j~P;dScl,{ȯ<ʝ*A#o=+ja>k@'~I8S :V;H{m7]T,䁥j]Nve %5 d䃆NHո%Wy홊C  _RP 9 zX/pXo_XH%t(B#,3a67a17bmYĀ@B$͜y蹢+%%c4$tPB]}Z^yiĨgu91/Y#JXD7~([65!٣D!CgZ>#JI¥'1}j&]JC~8<bk7Uj"†ƻKc UY_ɬ8#'D'ޜR# S, }s~w|3NPf%rgQ() ،mFk<H&RГ=Ygy*&AJ`yajDy<; {['~ļEKU}o K7)vh;z+Gk@ ^_5VX+-y,|2Zl7` m]} 9ֺM'̍a^20,dzf58)Qª:‘D *,IyH 7OFQB&S}c>whO%CN  8gFk&h?bVa7vof1F{a?NM|llzu* 2cP VG7+QF::{ 5¿Y?2qX%N h΢7'f@QI?5Lf s>=Hi@ǀI()'͑O4TF t DDgoP rp)9i}܆Ҧ2nv_!x}wp#AY^'Hb\Zr?/6+b%إׁ|Yʭ5I1>KټD &mp1 w^=ovg?:w7 8S5#Hh҈I Q|)-E* lSGcY#onϔj`d= 8yN3]W) A^Ƙ*bڏo (Җ-/O/u,trv0%?9|܊(}-/ǪUa2z?h~e+4X]3++FHp4N08 -Z#L^Wx 8V}ZK4ê(pR5p0SўT>s0GUv圡x1ӢND#gw?L3UO51r99A sw0 =RlwWyftwo% 67_d f"6,x 8&hvx )ZM+^z6 6H_rnDj,nJK: WJH,|%S@tbIE8JzvGpG, J[ ?1Is[ >?7s8|# 6gU3 ׋"{ at5%;7 {~]VK8 + {] gXPb~RDQ}1 ΚTYBZ6ʧ>NJ~3^4lP?v w19}5lQ>EF g3+,wx-y* ov^]o4=7NgW"k'> Wװ?8Hlxm"9nmWxsPR*!r,L*̌?XZ!s$(TZOۭ2<%F(L (h /dfSd8+$p[~`!'P! Y TJ8'7tjM0{Uz%n^Lmi]l%8>z0ΐ{( j3J "%$L>:J]E}6yǎwOe^HR qvpO Ο+:m'ZgԽP(l|΅8` w0 6>P<,:^›Z!|~a˯p3ۃ<{3o;x]9;tNp o2"-HvJ#DYB 7d*XG5vRϽ8g}Z~. h Ʉ~!?ו/+;K03LEjwXpWRg7:J k!SC$xsݷW~-)2UܪB8?@7_ #T/!*pe4!^` ] I*t?"j%l^N^٘ܣ`-1l=bZιDگ Fn:uƀv{5 ^yJF/{H =M_qa|:Pizw H Y,D8j$xSzjfzwZ~oϨ bscTe\\1G5pp'9:O m4&81- '4o01ق=sZ1 8$XB*a%$r%71gDSְ? o ӓ@QBfwHD!CtJD+k;w>ϟyfcYᲲ}%mw`d p*2o(2qO2U%%⅏ uJEKlQC,[9 c,  uoL6ƶT~DWUO ^GP1̟+:f5*Lr$ܪw iQm#\Yůa:x1z #wHSd YBu=El~d@Go4D>jȶWzTa$^ƄagʫP?f%t6O wZ_yp'<z)ݜpўS4PXG}tEBp{tOC~8ѩn#MξmjHI|f>Q>{eGW->ϪdDk3}^5j QHCeG ymLDT-bj]e`ԟacLk!-R/㯕&0͋ z.*5潴GDd}ӯQ'͢ Iʌm %îϐF$ ‘=8VhVewnA)_n":%}o(I~kySCfo2B~&fS+r᠝sޛU\k۸wCvr]4*] 7᧷6ŀT9>|Q!"-ϲCwg[͋$ j/ gg}5fș˪Тϟx-m/⃛4ں K;꒞oI I2Ƽɵ}vjv9%#vN[\IXbqMݜdgwBg ̤aٌC#_jo{]W)f%QB9ôٙ>#(K+R_[U:%ߨ~?Ѿ+Xi;aLϨ[ #4~;!yV scz'^d`VVM6>&Uz Dh+Q6?e7And8R/>юJ{'0?˳H_H[(~ fgU ؠG523'g+9-aäZ͇=̖@?!!o 20 sS"=M{,rJRBk29|V+h,A)2 G}]ԅA`Ÿ!X%JoN Kvuy^ !N / AM̺~tan wv@ Kr螐zlO0;xo |hgc/ qP,jucm?<0YPVw+ks?'5rHj(k=Q~ Jc*%}m2aN): ]zeS(m#+$^fǒȅ.WيB3؜k9e[n[q{d5T9`[PM=Elh-h~F/p|~z4b- w_e- oO6B;#8"5B{S@# p!#zdTsŅpsG*fE؎u;{)\V a Fz@,T@l'3=}7ʀEUoPWXtP&5<_N 3!٩Mv!1q}KV Gy[f1!z0Iv{->h )`.جMPŜ.*eP}sOkCr (+ܬ5L;ɁQ`WƑnQ픐V5:ۋymD0+GQh0_o<RF[BS&~1*Lz u m9)}ҀL1KU^hQ{1,pgD0Wl& ك8R*l.)Xos v sCT7W@u5رYH 'Gz̤'k vw9O𴁜XkћN%*!Xuۛ=#o2ȏbRk6=E4#Blymh{cVkϢk" fllO`o>KĖ:_pd J~P-KеͼH!3aV8ͤ_߳ "!zf GֆLn=!$:5+1VQ yj?F TIcTH5p ID'i Iπ3@DY'h:0-UACKDJ-Bwp % ^g` 6zhwaP/>'@_Z"l@֩r4T<$ q2OJۍ=APhu[ Plﯷ(:-z?yaK\]zOh {,N"g 0[GYA4~9UE q51؛,ǘgd^ji1ӿ:D}q% !7DnD%xt?И1 ;*\@8@Гrd lOe{xA(YlȊΐ^b#c'%z B<+Sz%BJ?mo Hԃ"b{ADp Z?(7[79 > /5-5=>yFp?{` -C{ V<|ErtwW)*hC^gR 戟/{9!} J[#pC6"Pm ԻU 7z7oS:`,A(s(p!F;e.كqCV ):Mjډ_1 U2Q@:LJ2 Yl<Ã,~TWAfM%%1A567sOfɽ%6sA*oOD 21T֑J"IB+if?ʁ}}ڿ?z6'nnY]VB&gvV<Ѭ]͘sf`Y45t`؏%Â8ȮЃD뷿ތ$'2 }J^|a/Ѹє 8їo>wfa1`P :]E^ÛD( .l@6$xWjTo&%aqUըAA Fm] U`uqO/4ʬ݅Jcϳk= 2}O ,A`G;PMEA#>IR]eH@_?B!2QIF UԆG!KP|EZ!G?leDpd>D"飻9]Kh6g6M(EfWfhĨajz1pUX UԩciҪV"R@nkSp~ 8 e5} QpG }_S"3UHT:(M+s ^ L )VBU"^ڱڈP.̬c6>@s8޷yP(&`X8o<OXcpj =l 65 k4y7VԠ MIt*+jqY;`=HU"i ۭ /:+xFj^H NLyopo'@<_mJ"YVS?|MSQe0 uM/ 6kL:d;QUìz(x! -vSm$32 b0r.a-Fl6k#Db  B(bVj]!ۏ9CFQ%PcMmZh: Km'juՅ ps!>E 91b1n12k˷% hc3E=*lĖǐ6 \7b,.̏ -}1_(]'ۉP,%0 F6bD mb'ݣ 05718e(#"In)Qi7ٷ7YE y~}MM?sfBI| OLj!'`%6TumP ePȯ,l+Q^Wa'dUVxѿЛwA(Q:l386Jr ]S%.c?8$#  h)n{ÀGZB~D13v[ ֧v$`eHQ L)s:2zm?:{K=3VAqT0D^#}Uae// H){+̀nR|Nʘo1.5s{9fOu!Z +m+x|&) Xb&kFfR:UdS/.AFU| H5O`D?yRXcf.2\-P!$!E.ec33"o P?%"ɴ_|j~]HV)UHgԜex3C@ cDxޙi\C%on P![Q5(?}{tG~u ;niA f~25F@y 681IŸ{ kC9^FWlGzo h BV`RCtDG7: K)pGs͎*U3Č',IN{1P &ySVA;AG: R{fRhr~L(^C8pf?}栓M` ZJ< H51_~ 9!R!U8#<؈ ԷԘh|Ь2q SbGh7gB w!~{ ۉ>3tn)qPQa)iơiUm PT\|PAmo06":SWLH*(8p*F0x9I^~d/ۨ!ysuJZ'=Bt? G=21 /Pٟ`B'/++  %0 nC)0J:*e}w1;ftO@ Ġ r7]0[C"x6c3;sZmTx}{G«LEs-/`!|7>ύ %wpzF mG΄f QlBk !(Jb$5|<9Y#hwx_pjX?^9SŷFcӕ+D㵽 _,7P~&U@& BXQ?FYP,'`ҭ#qaUCGY^{K9~?֜12B"ӭ'y]GsSr0qV$ŠOALuDvGb*(!;#HGLm%b*@7'>)xMRQɛk "A?}L$m pŨsA2Шp~c|̵)"a +?[1?hZ%McVAmC0S4^`v0؊vG۫hFK4| !#|ћYVk14ׁJa FzԕxE^ORb0/>[(YXHs|E YݭK| NA 6RP"|}#a9-D}eV8yN0k{W# r{H5F&:&*W0(8ވMwR3Rhؾ=ڎ>UBS":J<j%+?GFQlpjl9JF`K UQ}GB_%|,X%U"z}{` :DU={Ta=dPO󛴸q.a!I58~g 7ux$oHF : NՃR9>`bX5v{ŽUL6G8ԫ@3+&Jю"stJPAS9vdEP=Wӏ1,Kn>Y-Py)=h6!@^])uK<^@Gt|{lбN95#L3W|gq7 uyQA{ +F8 p Y6jNmoN@OF-vھeodHot$oP$Q/S~c:#)ũ "UgÄ̯dnQ! dBC? źvcC|v%HPa/Pv[F)v,R+1o P;8(ٛpz>ٛū鐤‘0`PkRЍc{\3 $Pw-s~3hrHt<u'H ʼn:<%a<!(n´**EГnfp(ؕ k`   ':,?F~!KP2xR 1X% :w{ȡQHSЉB]Ju" ΢:H vgYKh 4,Vߎq!@$Z=jm`ώycBt mpo,3 9H(R?&RaQ#NEĬ־'( -c"ߴ|V ?~1F S~s c?CKJ,wB~D#*U?I)VO`2+#h@*UO3Z ;lQڏ)jlQ@f>s wnGȃ$QF I[ ߬? P9ihv~8Z_ן $F78l? f-FL!5wz*[J8CEcח(_i tPcNhs,Ak67}A O,O[{V!d^(lM%ILgErx U n#G#Z/cs hBn& ՟ GٳW1pД0zGYewCHn1rYxV8ΆNmn恞>(ڽn7]1_ޅ:ΘcR lZ%uySz'F'r ? %1Gl h.@~9>RF r1**xιMjC1멓d%jhJ Ntʢ&*R:;lw 2(wvS?چ8vz\Xr %J$z64=5 p4;3sO4ߤKVI1N?$0?ϞG$b PFjsOg|B5q$_z$CjP׵ Ⱦ?YЕDG%8-{hf%)Y/1&;{0n6,Z! S!0ȌA_/Tb$1M)]&}*" #dp: PFQzOcf䡲'~Yۛ9&J8_9#Qʙ%V||uyKV=`a`1D39xxyj=9 %X2M>P 8? %(P^} zPj% Ict"IhfAC3 {Ñ}S0I Oج2Pb=/. BcdFsNؘ"9my.|;nY,`d#=vs=ڡb^M ]KLPu#*| lH>YE/@ gp{Li{,v_w;phCNk0^07KHerl%ׅvc'+G_0u*W|| bb*TPTdBǬL06ѨeMY4*==BEIa^B͊PxMiǘ-4B 18ޤS8j@!_G_%@d!6BGQωl`coNCLQBg"|U0m8]e]$"D/~Y5j ^»Jz̃^NFQj m|F[@@Zbz7%D:*7L9mFx;E\ Jp,%ޓ5`>syl@ fPfaSJѤ}jTObR,f"ŴxbK{o#ILbBc5Hi7VG*xS Nd kI=& }2v p΂ J}R#p^%JC@4GMH.x ӻ4]vPtQh}FDzV!З{ƿ@=J`V2f \L0@F#H:%sꞧ(P9 D*#'T9=8h+Q e č2nWSf ĩt8gHT8o bpKd mon/S9ڊ~a4(@f i'ˑ^a)=[HZ a3>6k!DAn3]2 L[D*`QMK OTΈzYܥ/7_+X1_-1J(lnçNj$OYg5r0X_7ݯA`- BB8z 9 5op*0 M?Ai>.Ky<- I@Y yBQBG! @Gfpڝ),\eP! wHn Uq(Sm__|>&A ψDYu{؄$LLL17/-eۦU(&wAᣍχ܀ kwB|oWdRIA3|s҈kz`1RaNU/ P9$*%ߎy\ 34␶א(1[""5(Jz\Z(!͇:={KTb l υh+G]G rT[AŬT5Bz `@T Uנ^drT:Qk' .BKwP{UHB[73@I!t /d@3tcy38$WSiM c@,T+$uiȎO͎ }]=dD"<#r&% Wmھ1@\a~XXAf7s3ѷВS~Bd~,p3(8P:K9qYݼ8 ͮ ~J 1-68*5v\)mWLb @+8h}7̩+]^P= NϗJd֞z`P f H=P 9ZJC~vXIQ NM~/j+`A r?cT F73<4vVVƈFfM]h)Ce K*`'̘hYFzճE<{` i:@2#2H SʄAf +M +-9=!2hh*)`cH W1f{ ǵ }LO $!?m6^#@M6D[@+HM8Sd&3$hTFA|3Dda-QanH& Z5WݽR5~y%BC>M#~y~-F4ôB > &Z$wOF"b(7` {uyVd<3m~1KA Ps\^j8]Bzg @0sɴwptAuիsd?&n DA 1KUuA~_ieB;oc@Uviτ6J}{OB=a&8f!ik`j & KdcOtPƠr(o{W|@l`OQ#Q0W =V_o*mK2'V[ T.{aizp^^&oFۻ_Z $]4yav &3ͅ l(gA\+d.$p 6coqǍ,cΩ:&q EPN]6V+#i}38g@ @X ?ӑοo4BWa" R> T0XéD&ҁxItK 2L+_#W%XI~!}kfFgַ$H`hP Ƭ>Fms聂!,a!K?C@Q(Ikj9oy4a _ٚ21DF d16W U6j0NN(w@9 ?BJNso{O |v+#͞g94*Tqr{=a|1OA%F&: O5f˽i\C[D?Imu!a-5a% f" X7Wn/^9 HP@i{ z(ٚ<3Phvn#tw2]h4Ct׍_nKNKP:bB4p+JB%5XhpQ?ߣc;7f K‚mB5GKlS/QQk=zp|Ph vjFH87X N:ݽ*m0ڞ(#v|j[A*SӼoo D]|ZBW̖⑥h/7'##`\+̴, `qw1#a 94J!~M<^1\sE{ANAĠI헹 @O~&KswA):R6_f1Wfc#+Sb27 a-Pt%Zin w=L&K-JiTHT@1ƌ~K(UL!s?՚  SJ@&Ufʜ+.Rm")`̊1k DY|x)*ŸUE%",%-Ědj2F ^byFUýTe@XsP" !Kf74]B5!/FIMr7Dx%h3yVh1* ^I\.Cetsa1U?(!bLd$GՙPu@nxN+F?PjpW ,o0U, |ݑ{/%`7SZq/j aR?`5CH#7BokÜ=*kn%WCV4˾&nX {zT[$; }_(+%T}] 9BTa5{mpv p WX,RDǘƳ ABS!̐kt9+D'.V11b>SM |ד{F?]`? ~s`,pxA#p a6} 2z l*XKh<*rV^B;D_okS_:xqUa{5R߻njbܕmtF8tTo{A$P3RHpۛF#)Q0̷q*P\"7,d*}f|edFΐGct4` U 8 A檂Ԋ`"UgNJ\j'a*0**>cC*46kMe<1:)3A\Iq_rfs͘FY% \HZA`Lvr ՠW1` g730Y!A ?%(!XK1P"FvT^Ϸ dQHpA|֜2  ֔gbFA=-N78F8v-#Z<30G_S@>s>H|^ c.`5 O#Ȑ-@ :ޭBH~3gF1 7; B^GjKDWaI#'nkG< 'pIq4)1=7[gLu1j= =XDA'f_`^12!(U>D7Q|AʂA.AٛT@)¨|cDU7P @ƫφ*d9V n& q~p(YJ9|SE)71ێ&%γ s)ͺ !y(f>&$p Lw-G`!bבn0$؁0PjFrԑ-$k[eflgҒK>Cj7٭Fnp҂%'oߡNpDOS6{5ѡ+ .@R*1)MaԟRɤ%78F 1 @BbϷ|rYze9jL6*2W' 3xTdIH{{T c)Y ?|]_PDPro̐lF9K`0iO{q=QDZv[5و\rJ[ o,. >{`|kb<8KX%0L 8qR>M+~SƝsGHh{;oby`0SH@z;>HDbNKHp1#yҔ`z9$/ʒ`%꓃wkpV1 noE@%]Ql0G^-wWCs$u[D!'+d$sD޸GLkkdB_Ά^|opPĢE"B-oEBs"pE:9XOg63 焰T(o,{SKGV-h cZ=~3;R$?KBU8ҡF~ۛqXG#şPX̳Sq;h~w wmotXc0&Fpo )4<:XB!e%J>:j@7t682OAƿHD~_ GԎS+Ľ˾'"o*gVdhOA[0PhQ.<uryHPpV'혦IRO%Ǜ&tBg1xg[y WB'HKTd& U<oT0H FRt|1tOQj%Gg)qqX(Yƀ gά㵵燓_P䰯D9,>5#b|XfgRۣ }#HqI׳ ! Oc\W-Q63 &`c%968% Y\=J6#-7g -IJxh9 e fyƼ@x YAz*]2W^}d+hr[Ark/<_U"ū*Xi?~58Fub{ Z%&Ϙ ]I Hlފup}W:*]h`1 @Zqy1qJ_6{Du%X"mM  Lhpۛd\DQChҭBL=B]v9$=둠A G m}%AJm!Q8㓊~W-5R)X7SuKBzbZ.n>yܩ 47l0ԃ yArFB:OGCA7iNDa3788HFJ{v!Xd ]}Ffz~C>IY*͂1O?E *1n4l^|vWAwPZDOo08zylq*"n]^puu W@KIJRS6(VBGA-$MC:q-ڸgឪw=zżEƳN(vB1E -hEY.cZ?!;SlP8rw51^ c9AcHq9$f IwŲߢC o[1 y}̭O! aZ"z .%{{ytm+mH@S\" cpAw@;dr@Bv UЉ_kSIcAt0[i6_#A9羿F 5>:Si;OClQ cP.Z L ^MP(86lCU΀s(m { sAYp3鏱9h0>8 {5FAk vwGGQ4*<蹻ȸq EOq iYt3n[  tSCH!A JT1@'<&`[SrZ: kyc0ݽqN2 (1P5JhfIg e2RwWw>>zXR<@C\'W2= }֌<{@%_GS| )! Pv?ω$[|w5xh A"fnFs>Z\ӌfĩ=nBw:mvv# %KV&2nk E_^*AJuN|[J N`~dy}Ux/oh*9Hsc=goPHÍ4ՅDf k1 $1{c(`= !xۛh)`P)O  (&ls`l-4 iC0c0(M, g^Wy{d^=!+C2=h#<:.BOPo7&@TWZnQ;e%bVU 6R0>7*ΤP:xrX*Ea ЮTc>n9bK jTa{=Gي= =Nk5Fi8 ,$ABaP=F/k6hAr mAr@=*stTa;Ʈ֟߱jx:(t%($03q F[l'0R)hb6CUg4{DuǹY0J67k?ϧ0<ЯJ+y/Fcr}40zΟ7XP W?:hCLb =%Qk23iGŮD 0 B|H 0$*dZ )\h 穕H!JKKfv=9\lEʲS"0H 1>*鎺B"8en f('2q`]+cT~\1ϻD~EbDcH >f^ȲX|-*a n/'g蜁R7P5Q!-‡m`@?nPpM beoa 5,sVٛg{HՍc" (ާ Y ӆg۲7}Mr 8HbDDGDƛ/uOZfSd28h#W(V &i3 si#A2Y)~OՍXNT;B3x:~]\#HiLyȕ WXAc1K<,1~!$ 9: m`l%cci|ʌ K44F\e@Qg.!m9:xk? ^[D7[sXQ` AhwkƏ9ЁAQ'I&68Tno#CULi>_IcTYkw+do7=U$@B/| s=u}k&d~, :kt4(%"93RoF{D8.l>Y,j~Q<3A|Z4:۠QjL( 5\*~C^9u$ f` (=ܳ'Y9V<ҰU"$聼 4dޞ6KX=ALb]Q¼ZKYv-?."J0*u 'l+t '+8,R cs  W^ NޜsDXxY7gY5+1bhh$` `JEM+$dJ+~; )ȭA0V{&iȲLjJJe@d92x\P1EϤP Oۡ>٠D dcTA|||E"ސzm1?5%5ȃ^1 `ϳH\X;#"*I% 0l5M4TJ d:(JQĚcě|QCH)(ixD$ OL焳Ae`_"6+\bC)gܠm63(b bmnrӳLjA{Je9k4L=/MJ]f%nnt`n*=0Hs@ T h'.;UC'`PP[-ZI`pu}Gct:Z7iyJiHD쌉މϓ|>S*BA>6|PЙ}4<(rhk t\!/"i+Cx3e^Wn*%p\{ rP7躧ʱύ m2-Kc42?(h]}njz,[cs`6ubݘ{t*;8B恾0KpujaT Uk$/LB0:g)f1n.م{ ɟ;;L2Z-K?3|{HL0 q߭P%hWFϚ@vՕ2Bd5Ī_{ DF&/ OrA%G70  ~QEs{aPi0B o%½=zJ )|@_L1xrj&'ٓ /.qjrk A92G*p"lvfyȯSLKg `/ ηI("͂v 1QRޓ 5p~q WW_Y`K1ΰ6Q`d [,!9@4*l0!R| Nyjh0`"]<u7˴,CDI|=S11,h$ZՏW4v PzH|;&6rp;+١D_?;#Cr^>],8o _^~Uo_~@>|ks'~skTXt|ȀZ>Z8`jq_RB+d>|Pm.'OIA2cɿ1g|x]  ejkׯg(I}ݾsͿ>绵'LZH=ٞ\7*z|ͨ7n_Z-k] .7O*6и%Id\&Z?i3C~t8~뷷׏a*,5$C+qo{ZOaQ|P<X>֯4&jCin矧z6/߮Ry#|ޥW $*Zb|W,uOq_ף~i'+ov?zBԏ/4|?5-?] j@"K^^>>C'k~ 9 qq}iqI*cCg{Kl)YЇUw;tqcOK5ux\U{nzW ]~GWZ?! KۛFezj^F,^L\Iu d,dR C-)F7T^Yt~Q½߳]1:qzLYZѿ?eONd&~ps-$ .cYjý[t o*Ư?v&čÏ_fs Ӟ*OYlAHb4ojϿ~/& {ը}E9lzҎbHz9=9B9 ~ə^Ymu>.d!vXmoY,}g1/,gz&$Ҷ 9۱̾>\1i:?x1=? M^=Վ9k&qh# :t^w܏W3/g741\7L&\i>y/#^O&Sz֯ {,Y>{ *4IǏ=؄qes`|3yɢ??FOxW5&n\k} 0U5|Jzz伮^z~m}Ǯ^II>ߩ&?|Q|y7vv уڷz-Z|\g`w/l*͊}ɯY+/_/ߗZ0{zY@/?7)~yYm$6WVQ*V'(>/Z!2~/?|˿}ܗ?2[_޾~|m3ug/|=˿tSk*j_|G\grdt{nds:mS{OuI"Ͽ9zC|jc>rEg<> o]v5ѳjkj~}wx|7۟s@|d;RyGcx?>PeX<ϻhB+v3l2"vh}YjWԿ',|8\|OS[ڒyO梘;]:DC7|٧_Ir0g#gH~C{3Qb(?媸%]//]C{4nωv|GL{֯K:XY}2@_t] |Bg盄^~4g+ږk|/yg&QrzxǍʓ?r>ʣ\óxF@)Wٴgg:N|Y_k_)T2~ݭK~}_J}@g*_韬}?1U7,KG~oZ%"(} @՞)nC{gX_F?oiϖ7;Om|4c5WOkDysSoj1ZL$=xO]8fg]&/ kH8[h̊BEWwE4kom}oY^y\V|w]o)۶>#2\ᡔhqb zbhi. Y◀QÜ|ϸN/owv޸ݽkOzoLk~J-q݆^8N7V)>r" G؀<FK|7҇[яHikKg'kQU^z vLzEc͎iA(^Pz ,c,3Odgo@9FLۇb>OHl)/5/QH倯N՟)rsnS?vT/OH>&,h {MO2,KF41 J[ o'>[ n'MyOB4'^=_5_/5B/Qz~s=vO%^Ӏdr͎rй;3l~ ϯgׂ|Ulj~ӵAAߝ\_@4Z;0|W;Ͼ{[m= jj 3qf /4~pw.'֧}u^<˧)g:Z94=Zʆr05jïo}n׆Z~- m5:;_Ոnٷ`f*F,4gȹz T38ʂiom Yγ' qaru{6Ips319@1|+~3}'E'JiмnE/-^?3 ş`B>73l0wqȝ4 )6>/O Wѳ*|ق;ݭBp+;{މkG#[l$8 _#8>QoȖ47nM\|5$抾k*UycpߵS.F?ѷH\!DIAvB& ͍6@.qҁ_I$[+ =<#k@{_5/=x^? xk6-^l  й~ySdf[w{8O>-o t q7d53ӧ|c/!R x ez'ɽ do>E|uY?u)÷y0( ՝ѝx!_PȼȚ$b<o{i9g^S Dw{mo?k~ +O|sl U\J#}|y>fMl'ѓyY'=+5g7wL }nzOώjZAw w'Z[o }i~_Z5^pmU I^'ikGލ_}H$wJ~;r_}ͩʫ:_?4 " }E)dEg[6k~C?_>_oUUV;:C) ~Es'ѧBQZ/GtG* oV[;[yk~hL]-,w2Z*}1 vp b}E΂~tlSn)~ݎލ]?K'[cg;ݗN<{qDc | y/z-f/MY[;*|֙TY/VN *oE86~~ݎ l~ᳯR\[c!&ߖUط&eW;"Ᏻª3Ov/GO"pB|8?Z-_KE4[|휡[+3cPt Q=xUy%)/\fk?;L\&#zj(Vc}s6Ǝ-g[ ~H½~N\/[)aWf>Ž7V\/76W&ßNۉ22|Ј(k=/Vѫ[An {1Gypv!b\=O|??1c:N?'frg0|P¹N>y떭mo'O@_]T.^j'D7"=5*Aq|_94+ݏ1:|\s#u[s.dm߽'NW/- ˞X/%8|}iV\vҸoD?+D襽r7\=tK;qbjnuo>/oE<VIvv;J5 x(o~kQ-tY<ɫ9휉3zzllqAjNxo)J9{K9{k>Y럳OTŗp7z!_L%16j }jڠFoQ>L[8_gzY|_sGm3 ,Lw>IsU;"-&xa;g']mp)/#|^̬Yߊgjgoyy +vw("77|R^<ƇOr:|f)s,%kE-}onZ*vXooXc:3۾᯵+U<5:ޮoVxd&TA4>~C&'|7 3fѡFUxE iJ'kG0;ϊ{N~۲Oy[74qegen<%K8go4D1{N5\1qo.S hU9zo<>&7mwuXҫvh;'vۙ+Xf=ۺLs*<@c3,xrH3,OfG6>]l_L sq/mDJ+SYVzoW ~dHBjOXxG/Շ{C*?ѯlp\o>~[@olЏKg)) 7;-/_БVLK7ڑ5 ~u{ 裹]?O z_9SN);c'R[;CO{P|y* -X\;/S\90R~E<'A/{9 jI;#SPn Z*M5]:|h1COWw75zQ|~r|t } |tܣ/ :wcdUzm]O 1!P\m"?%;suߝoi?|y]}^`tǎ ~i.@Y#]H\Z7||*Y L@o*лjs-ֆ zlѓK֞{ᗜ45:L=y?9wN· ?W=r`Y-'J͂tNvɀ}Q-?{f 3Оc S>X@b E5~vjoG(/Bo] .74f7':V|Oښk۵qF_6ݎ>Dww_ X"txWuT=1]ķFOYsTIsnO3vRtӾSb;o,~~^ިޔ:9xK/%oz57g"g:-TjG2ܲEb )g_Wx'杝-O@G~zlZ?M  v[n-햱學[{(Qon< ~~n7}]]l\@?}᫡>21xBG/q^wR|F-_Bz?Kl,>{gO-Rgj.:~Is}!-;m$yffR?Џ0|Xxoޘ߂95t?c򼹃rS|Z/-z;|'O#~qCl@2#z@g+jG4 ((%nS\Tp]Hܷ(oNqDO_>5HR?C-8(FKeijU@֚(vH2?'/ZF47ۮe-ZuQqNJe"!~,BKFA|'g{$#ئ^XFG'ZS&òS2=Ď18ziϮP O>"펄O #]2L}]A=Po8RtT:c aN:%M)~0gi-W]@,|Ww(::Y;wWB~,Aߊ^H6x^L}}ė,(6s-zHtiGe9DVT.6BO5{G:M;ٷm'Y.\4K3Δ4=vcJlx\At^IwEvvI_mPyK Dʚ5b+//[~ډ>-ֆw5%^跩&xEg'ѯ2ŧ< <5bAFA8M}MQ8-虲/< to.0 hsF^Z-79Ou>|7^TwN+QscŧrFr20z␬IxA :' qD⩇ ){Ke}9f/'r_û/ek Õ߭eÉ%g| +ϐ@okhK؏NĽ³IB:R[ rHeϽ]Msh֔ |G}`ïI3 B#ORn$IAg;Nv·ǽSMpzp[$NGj,ˉ>i]=5~j#>Sq S ׇ\ap?tYCTytA<3M2eu2xqjB掶̝)zB=?Bim|DCPWq]~Wrg^ෂ$V)__MU"IL~B}AɢCBC̺EЃb)7W凎Y/|Q7%9n7_M6TOi/3tG=bW_çLZb{*Gx\@_B:kDdY{/ikEm@kK1P8 /W#iYc==Aˍ^*|O65"GIK%#^# 5B:~cĬoϷ%eIFc}QA,zx׋hg||pM?[téEG9|/PN TO- ݪDٙZQx慄ic=E&dg珐8bҵ÷Co0G[տڥ-ӡaʦ{M ^OS8ЏB |N ;_K./įY 龴dr['; Gt-SW]1o^}Wo˨Ə~7Fwo)ptnsť^g}h>W9z:kc/?;Fם*"e :' .[ V?o*NA{AѓZB@k,"֊OSLMɋЀtKl4ٶ0N A~|~Ty~T&v''ZsCdDŽ撶å[`Z7~/ߛ5eJ`K|sdgOw_` _u6Ygw_D{S|6P~w:7g%lMq鮷BO^BW;>5њпM#6 8Rc ^^_nC/<}Fi\kۈ̬{ߗ Кe|mBv;k6zj %e*1E/7~{2|p𿔾>SG?Y oYgW'`[$cUy`=gO~_O\j{f*O>"9˚#{b wr7|f\*+W 藦,6zڮ/q##cqsD|%躚i'Yt:Ou9߱#{e끞C{7m6j tA /'q:RQb_g)3x׭,xg{9_M/K*e_*|u }{{q詰T;yX[!~SہX54'7 +XMvvcmzNv\tex*}l F^,-ҴC%/uBN=)KCCt=py(+:OM=Gs3ziAK6 [H[a.qٰV~}W v ;ѧ&-Vf =UsZ+~ѳeS-eY);ۑ~Oxv*.k2lt7/>rQZs->ElE>zEҒ#Hç>M %/p$  Fr~W苃}tonپF^r\)QN9WWL_8'tw:X;~i&"f >=Y{dZV|4t5rakN45^E qo!3;; >ˏ< y&wq"`[(N^sdՁZ PBXjbb|m1}=p3% 9[/͕.G%kɺ4հ|.|Xfn1M[|{~o5J\ #4tG.i,Y_D5Bߌhv`-˯;rj%ˈu>з /?#\]>ۺu7s/h; bѨ7w&e_Lc ;9_bZ ҳ[Zzh/[}3:UٍEpb <+E?!%/kq=U 4~ vL>WhD4yV(xDe犳s_g4bmWNOަYGxmdVO 5\F-CWɕCt~~x4| y9Us46W;~kj ~ 4m['_i8z N7D\%4WhB/>{{'/˥&^G?S29oE.%'jZ𹝱%{"藦:KLqˌ'ٽLU?3q/'~:!8"o|lSGƉ$XWc"m>{_IN^d)=@ { or1퍞ceg?<_dexŔY~7gk}7gTvR^ؾhf"W@?sK ɳ<7wM>@d#m?֟^K _~kvboo^?R'%B@28+_/]>wT%8iU-|xbgܡ?𣋵(~@sYSdUJV'!;XYܠمN,bHP6`tulKj5"Go*$ݎ0DBqFn=/>@|hݛNT6 {FOU ӚSCoOFpbЎ:Qɟ,5/ۗ_hSgˣWc[*{ _|V~qeï@=aO[Moqw;ȝ5.I'_]N'e>7mxw['D_*KOG9~^OCsۙ܇bC?f5&+OV8"?ּ|צMƁj)񋝱Q$o#Fˋ(=5J?s$vF_K 1ƺHjG[E \j_~Û/k"ڼ-o l9Jߖ{ {NS< -p+c/olNz< ~XUB_]K8msه8{v'Z/uvo-C'l\fG]?諣bc [/cc=9Ћ-Xz_;O ?;R/|DrFVv䌶~Juٺ\'|:L@M ]>ܿ괛7kzW_JY OE& gk!AT\lt4 YJrAFONY17 $i l;c;Ec+}啕u1 G0RD?\~Wi(WAW^rϦT=,5w7zɇ ek'z}4>geg[Z\/ Wk#{ c=i]YjzsRtTγWOQlz"8_6:' ʉ>Mڔ7Z#ק,Icb9H}[} VYBS8Ub4Z bV! ? 1BpE^|wE 칞N_,CvXj!V*}N@b;o+rOV|6h\|3/1F + ߹K+ w|s5_7ŮugѺۻW&($R=+&0sDcY0w>t^2z:qy DYI=[XmE/o{>yi@?\e:MޚoWM 6&tAӡ ৗ.S}e/*y9Bp%$1% I>{^ɎFgu(wjIÃo[A*^YvDRI?^Zc*o}h~W';k ^>Ӝ:p;K6KtDk$ CY(c*~uݝ1zw5˒qD?S$>mo+oqL>bX}A'tTDq2?Ov܅(w=Yuֈ5'ꌩ$_f:&]ܨI{ݏzql]g?ñϞ, 6:J푄a )|:ѫ F,*K:S M6?A,@ כ/5ҋ)Sɢ@'_& O뚠;=!)c!Z"ЩUsuH  jӷ(+}b_| dA,CK GZ߬? NJ-u$FOೳy`l?.6[>|Oe"H,&X#AaDwGljj$>7ĥ-R=bgL6~kS;5÷D?b9*~^b*񊝭.> ]cY|/!7X 5WUL΀ɰoo71en0~It3xO_<}6Q ?FܰC'$] MOyd?|fwmhtOd}d'|gs~zG>rSI0Tܧ/Y?{o1ѭ"ǎ^OlB#G¼)~ʼ~ޢzS7t0⏴bE:*Wn;\Sܡ# ZA%Wl;S^cCkGbn`~2NZ/wK~Y>߯݅Z$s[S\f_H>#QXGY!1U B=$5xI1$%T8{_4)}:s' T\IQCĿ$C+1wp烋?D;=fGG)SA|=;mf?;h } W__,?n/)x#)k>"pW|wP]&>5}#-S^m '|F-4}~ύ<.k;-<;Ggi^ ]^>=b}uH4}1kfY՘?/wZ_ ]脿sr瓔/|Iq2F9Jfa_Aϧ*c^?_1Mc0ЯOֶFFOt7ZbM2'JsG_Z=*qeutT%ƈvTsSKI@?|NBWӳ5fޚ*yG/g4|OWf U?6Z't4=~C\r^}ZgR~W(pt=fFs2^j$OoόuϾպD:fJ$vs/fm{~R཮?J<62.q?C?CRľȵ+[caD탿G_xn:57[A_Tj׫0/^Gx;z ?OW o_I翓m#]gfEЯObmG;Ư_}N ~`o·1ϽVMk!`oc/ԸA3 ޿? %>CpPkBOCzU~oW \ ռ~wrEjLf_Gwn>*e͟:Sԧ-{#c/c7j{6x' x٢w~qq7rtBV@g?| n /GGdmC6uAN'~;hb/ mS~-^~=~'qM~ j߯ Zi藏dK?^Q~iY=ZX< 韅k0 Ϡe @"W(/ܠZwQ߶:W1xX?7( L_B&{ ++xA^oU&\r7S? |z?S\# lDxx{9 >_bPw~3&6|(~Ƿ]M6+uWO,+P/O^>dneޮ"?k7ϋCRGk_CzFm1{3˷3g _]xff 6hSa-1s¿}"bӯqo<}}'˱#io4_y3rUJ< yi Ϛ'p7Gxi) 'f/2{iIaXzo.'lhw*}~i(_5睓n M̥'%s-2 .7׸҈'Թ{lrձBxF@ kɼ р{ؿ`-LC'`5lO R_Юx\|Wc{5DӇ5ok-_}l3 Iq|9PMhF?|_4@ /z3hZ00,#g U7 H8_0BAm0~- 4+Xդ?`.nT[E%G0 -ik`}gB⥶]Ig|30;ۢb]N94G+X8l}HpGPgжKӼ_̯?݃?`~xh ?+%_orP߉d:WSj7~gZC$vr|1),2aʼS&p ^Ӭ_L) "xV/C#E3xS݄HKj^xJSo:7WclTcmm4o@"}?vaZ/b%$8 =GRܖcI 0r 6 6:20>V{gjJ0!_PMSu5-L_XL/-Y#ϧ{}Ց[Bf2I/~vٟ`TڝCrY}+o¹)}VZ(@? @v[9}ePѭ; x}~Fo)߯v;{O"܋ ~/2~j=ɽ9ߡ"KVO@&愇.K~7z"?|:/m5-1L ~_1_tvzn{Ϸ~)m/͓)f}4y~!ыmgx~Hd;vȌvh=&w >Er'@p_ݯ6AKcj縉9NMwt߼No% BB'_**t2~xw?.Qf&$NOs^+n/gcK^6;?c>~|mgu_wc8r._iV~t'Dz/UBm5O1GegO"PaLxz0{5XjtnK?Wנ'pR ҩ?럱V-?8KGK]oAVIon2|mxl}2Ƶ 4zU}k.ﻝI;IV}\F7;;ZCj໫u2b'= YGl7MZ's{K FE/tT|u1\djbt~8q zqE jj4J;rnS_[l=Q~^}@_gt7k4tig|Cn%s_W:u#9 KsqK.s-1JO`z_,Tء3A,LFoxowCȧ`&8~DW"ީ1O#|ƧR LiJ3r}WAzEK)}~ 0>߈gO.WlF? drԙ)z@c<|^o ҷobꜢ,7FHϞ*W|Ǝ]pZ}?[k% }n2Ӳ  xߡ ^% _םbrq퀿vjd'DO43թ҄/^e5a;Чcy|!OO nfjOb;[·"t?|aA'᷐˒ _O5^\1NZe哖v'{.WrDcb R>zCZ$\^?ZZ<臻I%K;tZp}j 4{;rn/Cn3~jgzgB;ˇ'h<=s^>3>Q+/?#Qkc>)]e 3j zuYER='_N)/M4W iN@yp{#c'l>KD[ςb|NѕZ,l5]5&v*q9[jZO?w){L*n}RЉvTFuGfm ځ=]:@ܭ}XMDX v$:(E(tFϞ#'iޖl54}u15o!1"LZ; wF?^f~49'cDYr·pB⥭rVj ?h%?qqҠ:lW{qb>2z2;# 7ժ= Z6ǟ#kh3>ыX[SSűۋP:+U}[FO%Zq៙g{u.~l G+K6o߶b^Zz%?9 Oog1SKiks;v)^ૼplg' w/x*Vty G7μ=cGޘˎ^tA8*lkxQ=@^$.'5|m'| ?|#hw]u׊>='ϱ$ӱ~H‹;)k R)qN_}PCgs~֢)˕ICGc+Bl3Yw| l^k]yG kKnz*:mDG'/[Lg)xKjtUeHyOEu(x3]l[}s/c~_hu/e ~R@߼)rw }K_-Q*eװ@p6v6,MD߽,kOsꎾS5q5HAo[^/'We:Б㷥z~5V} #> k|e?8bMщߚ·AHp艣`]"vBuI$ T~ ~pgr{ѝF/ s"'| ~/7vf#?GEWcsdN=\'M}!|b_B舜_c&%Wnt5ovl b.,qi4 $aHJSȪ /ܣ tAWX m-m#`rM.~Ds$/*N"k~Dld@>+7jE+[/~I5 jTf΀jժNݙE'kXxLgssCz.6䑙 s }s硾߳> jj=*NV+=pyTa;&\n+KH-vS-@굢ǎfK-Ч~Af.T*|+VPhJ퐅D_}/ !tz`j~;eVN-Es?f?1sMПbt(~LD_ oE}Yݯ֨#L-w*ب{5o}xc58W tg$IjSN)^ VF}MQ償M&s肾Ыng)+t_:ʗD?V9#]DUkk(P_•g~Sic'z*ny8cB  Dy4FߔBO~Lj3)U}%6)?U='vL@\tM[9W%̇~c ˥}>[딫Wxu2~)oN_HۅGÚ6ZPu{sKN W}d|Pm 퉞oz痒$Y(hΕ".Nu N+ u)Zb2_b*wI<X^X/uЙuؚ)V`~2L~SF;OV~?_͹ɴѵLɇ?蛗B^Q%׎ = cI>JEC=W+>]b%j VԂ ԰ҁGJE2fum=R9 |-S:>P *7gy~/aoeA4>=C5 5~c@f ~J@?5Bsh6LVAHٍ/j=MW<-sԆ#5[?,Iʁ;aaiz2":$^\?O󥟇.jsuN[iEن䀿%sHsmnWez ?Nsᾔְ7וjB_0}gSjGio}_(^e}? K2 蓮k>n ]Aq&<);k]^TxH_W_._k; Y?/h_.GY_x;hOP3v*/ F{fkR9w_poí[07F̃œ:R^/Hٲr|V-8cr yV@"oZ_#_2(x苝 |c\藥Z3j*6?ܫek :ǚUFLC_臏 (@?#f)/e݈g{Jy;3CTFOL/Z:0g_6F\hgVWۺvׂnBm2|7Β0/T=C#咁πo\C[}Oh ]嗥Z7 ^q9 ~Zʎ~cZ kRwvFO$&~ia Džl;zцNhZDoƇjw56eY1`Ï-WsoST33}g}g2|CVbㅾm> 2I}eQCOuVsß[T[fxʚ4KMR]sZ} ?)7t3t4ڱ*!qi$_|T ~-K2 =#執 }g ;%'vs懷b>c H:N߮[R9^-{Jk!:wuȫ$A0MQ#6|]m;XGߢ ?zA1G ߂*K);o[fGj[|YA Iebv샽yJh'&ͭ7@풙pGƋe6)eq 8qA/^]~[<ɚ.s; |yN2 {_\EgbO7L/h|%YnU'IͯxZN ?ן53?ǎq("-: ~!McP1Ie_ }e`hm}ieO䰍x {/_H:y UD..s9Wj.#|ң͹֟ϸK97vHmxo~KBP3o~A1}Nh_2?'v8 ֤g} W QW|W= hK͗WѰV^W|N_\o-u͠I;ӗpk"d{77~5ٲ %_~{io5I5vtA*Crַ/V>G?>o?>a_l }5HuJpBpBA$ |c<}m9~W*i~TRQw-ɒ8Beak!2xT[bL_cKo-pRFy֦'şHJ^lOlTtjx7x魙XoDىdgG#70zx7=+zة~UW WiE7x ;9%Icҟ=zg~ ^960gЙЂZwW>U=?/Gˤ[ -u:UKA׷َue{>$8e{Nߤov#lۓSjJ:<][n.19zKë) gV/(~?>?{HkKh`۽mo+㛅wOfQ+c1]jV)mWYB|i=ϛ]ka.m`= -N+`Ö9gY[v( Z[ܮ?2$~c Dy:3?ˑѺy봾Wt$6\OR릢~cύ~r{ z?#r_t:`UO~/3׎^ ۙoNҸ2VUk#~  ԣrFqY/>~e:mTfx%_=,+Xi\S- TsoWqXə -O|KYt<tQ{_h(ew!zPXviFÏ2FP, |`}d/<~d l -ف54yG/dwsK/ ^Ny֗OF˾F?Q*~33^:)sr¿Z&{%ZNӂc] H}_*ۤGҫ3 :F߂ wZ72SȔ ~rG>j%ꔎ`@Y?v7ѵ'lrS znw2h&)YdԼk\83ju@}S_? 7z˽aI_Mvno(׋^:6oowzא\5l`|TuZ6z :Ѵ'h,Sh}K~=/];' ;ypfw1ReA;7~ﱊ-k˙;W L'dr ڕo!Jj㙾Qn'z@tue_6^. Zux,7ez(R n1;kc5^,~;+-kQi3vHD_Cn?/ nqEo)wOA[h4T;|ɠS˔3RN%.O;p'7BxT =˔^R|lkvlk.u2oW2A|UqU9sFN>igv]{+!޽~m+c+}c8;7=p%GVƎ89.8p^֟O{#bt ~D%kr:Rͭ|Vp|uo{grOwMS|Χs߾Ub7/} r5Ws_# |d߶_"ׇ?\)W{a6z+IzǪtΓA4K6)tgVxr|?k~#g5s J˺.sk 8|mA5F_N?Ju,*cf$Ns4|}~ .KdN.&_t^# bR.xrS:;R^ro4EƒGen)Prd~SQ;'8hE0앚^R2aeZ/9yUX2,_MQĚ|ۦ-wDOEcF/sϳULF?b:YW;0al ) ]|~nQU[Ef7vx 8<ˎo0mm\yE]:jpo/&t0>]nvup8)"(2%=+}29]&t#B"i$K9=d9si)V**\ >\穛m{Ky}U.3=uϦ?LΒM >fR\5DXVWzһGԉ>cqΆ;%zBU׭l=|iE)pᝇ4?٠s0_sI|JzGjj}G?-n}q>-;|Mje@Ϳ:ɺ{+eI݌:]|?%솯q&Dk?@s"6>m[W Hyywb)].>oCtHַP woGSi}<{)k9^וּ{K~`*>T}}$<-"}rK<[k2|KgW7K;5I<> ;ry 9FJwt?!ekָïR;Q9[ވk)NkS{=S$_8/[焿#1r^=OMk+86|َRG.)0W*|άᏬ5LYǔUcKq w^jpZ;V7z4BU[BBr#ewM)e46oD͆.Բ >M- rPs >kIo[n$B%:qv$+o IgyB~蛩&On/W fm.ᦻK+ ICO`y_ےCfsn >앾3}} xг"ZbCỿ?zs =kr_$k_r5|&|Im{S99¶=e4H* S^1 -g.K_&Idw9m4Ҥ n-DZ5Hض,7z<,^'.%.i*>E:C_<43N(;iXB_uu_e~MǟJ+LyȔGHv8{e'Tlʡ4-`l{tI#t v=/]9:7l*^^C/k$ V9\jp9S2Ě៫,9S9S}2Wh͠oD:ͻxLTZat  Hxҗ-jtᧉ$ӷ tYͥ܏5BEv|ZS,-ޓF{IG[ 6eK#7{G2Nj:7ueYƣkl}\H ?ZSt߽f#\z^u~`O%q2sxT5; n?GL67HsMv"t>P-#nePugyCwq01Zb+}qUlGH?[$e}y|ye95VeM0_l-O=^ۥ _d5zM"j\~GEu g W? 2G6oyN ^iO+1tJb5Ln'~3ʬA7Qqbv$kнGn'~ѳ5&`nIkqhV_} ~ɕtǿY9xrc A3H_'>М|÷vzsy&}| t =e1~,D 9l~x)}EW~UHg->Z#>G?2ONk6-+^ JwtT@qLb=ӟp75W?!q =Ч]:Wh< Z[቞4[ o=D T9Oo%R;Y׏3NYM_XKiFQ:s$tgmeA|1SPܟ5Vg?>m}gsTKHЂ_=M5/D:bt6{$Ŧ[3/>SAtϋIZ(tu⌚U1?%WDtt-iO_(ƅ@/31ޫ#4|s!d-Iܚؙ2Ik//Ǘ DrWuUtzvQ?zCֳ |WS1E/9O<“wo|WeESt)'||g2}&Y>>uV**IqRetI״^bO1Wk\T_+ՓVArz,nuy&`<{_E"l{ lsuGdt -|UN[TtYCd_>t[=.|XOvKX%L}/qw1D9{ȟK\v2+}˷M>6|" s_g'8ۼ=y*5oJ@C\Źtnfr!v`'{XE.OҁFy>j~Wm_KH_ߣ*E[VUfo=s} rd'cw}w쾮oN֎qCy/FDrD2)행橕.y5lsʗzF//gGyw_%(Q~-+l!u,na{u-py'jSE\Cf}&k }CO45~~&am/סǧdFy$$>iDrԯ4⟅\bje? .-6W;.pNSm u_Ư襍\k9Clvy8>W={r\Fgj{j2Wiٓz(oSt0 |/YN=^ۑ(ҵ]M-|/wMi'X *Bٮ_b5լT+#~zv{SeъhT&5z)o@_H?*op5h/%'h*Oww5-n|yݔfj zIK^LE+)sCot( 4|>^+7Aw{Or 't=338eELxi%4*֧Mgrj  %ܬAFߩאlr3=\uYz[_? 5#ɢI;{;s7q9gn2~~i4If-O\YLJ5=yiç|rU,|s?UP~A}Ri];h2}_F!m>15lF!<'=ɦS֋ed-yGy|XvEэ?2=E\]kϓD_D ߳ٹ7TʁR<2|N^C6Batח[BD>\-!\S= 'w:FbA,4v֊>з=b Ψ1FbAwNO,:>#Wwol_槨;Kڂf?ر߬*i}Ius KQt+=ST)v_X'^ +_ׇ@tCCMp,+Vem5%'5N5_?%)ydV8[}AgAW "ͭ mm#=֧Å5%Po߰3egAYvߺR.YCFUlhoO"m:B'*r|"E^oMfJn]Y'k2ʓ u:s:4i;-xHu}hq? |S ^>S yY/SPFa{C_zdm@/593y_2~g.~$d~:]g| |~Y>Sl/3-y%~F>q~Hwլ2>z7o%D|59>~z)fU5iyF_[5SMўu$<_G%<5bql' ^Y{;ϗ3ܼӁCct/5~oωϑsv4_OY2퉫?^/r§N @+:-~fW=,w왅wC ~z!y& \NsxZ_K( PU4@ {sϸ@,*}|=_*S[9)| 9V ݁?sc>.~eŗʟg +/z/D .w%ۆ/rTtWD@rѓs!`¿$/,6|aؾ:8^zcD?*u"c!}GߗK_ ~xz4|"[7]Fb2~ RAP/WWΥ6b~]íC>I]Ʒ^MIRn]3//vw[Gz=Y J"W{ѣCQ`t=]fcTqւ7^!e^,x_B o'z BT_B}SXx-V̗OcjR=𜎯v@/f#Ud'z_uR.Uj = ..-= Z=KS EHN=†O8WL :^s_ɬ9Ѥa7B>¯7i^Jhu4;}%ԁFD|sAv?◸MD辳N续1F/ ^X<ř2y 7ZnUrGcS(;jSxw? V\gu3ëC[\' ќ}D-3;sVy z AK7^Q/)⧖9r֗RuSŝ@O1_wʾRuL)':/ǗK1a^y%JDߢHE/PV9$/OSVqWu`?Ktdvx,2;WWMt7ޭu*g:rO9u b'u بl+w$B#~߾r|)(ӽ .pNe|2u.LIOknjOq:s)R!y:Gő5 ×mw[mn%w ҅j;ke&iw{YgKn5ncg2]g _F[CO=-Vo!OR#mxq?ﹿ '%KB /qDxno+s$;-$BG6I`؞{3߄J+UY{}l'2mO'| ~mu8٥7]W]vy sVF.'>l;T|ͦek@)~pZ% ^߬Da5Sbt7"HXYFޯjd4 ym}>?jSCV:]g5SuF~;MDWm|,N |inV+9%.c~kOm?}g#=Ҧ+[X{Zi$GLyClWNvp,:>z6*ߥe\ ö~o!=(zcae: xY>E-3i~˜dAhIBy +/jPGۦE4Ǐ^^_z^Ÿ]:Oׁ3|v· |i^\`JT*r{]+k\M@oi.44ru\D9(?^/W;2*z~{^m4͑:Vj n}g;k(/P6|?FO!\s#.)|ta>GDf=Vj79Io55:zOq/ҷzU%6zMw"jhp Fϱ4GYysDї-OOns#^,CpZXr?@O&v?T92ձ\,:חOq7~ًYjOU6?yNmqI;3$*_U+:_K#i*_~mwy(cG\pï7;C÷T Ǘ{_K˧6@Rq5z$vFߊl=g/;u S @/)!^;, =Q峋Sli}4|Gۂ4~JT7Uli#$=.`'vA-$Sn4L׏ƿG7? 8 I/[;q;/Q kz=$Ojo RsMeKgw|v62ˣ-k9}xWx!3(5APit8@oAx7)ѯ6Yoݝ'WGjOU/"y7G(G`{f_Lu;Yx~BM&7Wf}{ 8UVϩq$GYZ,ԬObQ ~ߪi D7?Io)ZW3SBQ.DjRv_J%&ADQY(3&b|ZA#shMvEiD/ۗ\ q u/-p/R4juߩ '$y*>Y2nO_; w=wnr)!V{Ƀo>[i9Ekk[Ư/k UøQ@᧮]=jww#wJ-p瑂D?vv1 ۚhƷ֤7eU@^c%x"z~ƈ1_)#M%y?\՚Hw6|<*5}@!{˔o@1ȚS99ŧzI|#fݾŽwn鞤55TF?\cÿ_ q2zC\_%rnjбW03l>w}LJ+9o|# j}A+B/qOGgKJdUt5>g+#/Rg $|¯a9[v6 =PjQRhIqCp< *_ͽ f>x,-Rhr[o@KzÇVON~5ksoRy^gZM|Ma)Y4Jvo1i֙5"_9F2r׼:W9mo0zL*G:ejBi_bdۙ1~#y:הir =֎a`?N hicrX zύ:O}`٪ Rr:_,+$.p7z e)oY>i9]ǓC 9}Kʩ}2NGR;w_+nFi2(zlb{-|IڣkEw}LJ`Rs,oU>˽kiMWN^ЗO->ԁy.|<"Ľ_CyZ/z^rv$^T*'{ ߂>ޫ-}N{juIF3%z+}1 _@=$kroS.nȒ"[\XvZ__n C,;܈[ zF%;OOOqc~~-5i/"rrR^YCPuCr%w}ϋdzus|pw|u?Kl S `_"?H 㟖<_|Ujr/͌M-s&Zt?klN& Zл zYtZ{`<<qG:)wwGJ1wFSw2)o#߹ՔV+|[Rd+>ID?WG-c[HAO2EslUcr{2H8OAlOUO1߹o/$xI]Y{s:KvϠE⣕D5r>29 ytCߥ$3, ߘA{ iK;?D?][B!^Eb"OV?gkXf銯Wb mPy |&+: R!~ 󴾲'֕-r 1z_ 7*?\_Dz )n` eؾa_[@"[Av80 :zEsj0ZBSHF\ >U$ѡ7Uu:kU.Il?OWUWT^CsckMn|Y)?9VA%.-sgD?U׹#&;/#]‹UzRH$YgwDګdR/_.i>J\YxU#Do*iꭅ,aP!xQQb>n* Oi.y9%q@O:vul5ۇ=y_fm6= M ;uU結eɚ;5C3ܵIRĽU ?<,ש) V=EE=/T{ܽ.׶GK4zO!{/%*rLV6~ˆF_c 59];wXYx3/bר5hwt?˫ I˭u ϝҁ>s*5=796޾_b'h$?pȚ酟BT𽝮+i5qˁa{Ɣ2<߅3<$2̓eʫ ;ұoœ? ~{/~lJf7 =VȭvW:Q _W@Im,G]Ѯ|i ?br{;Os %>;K眂߉v\gVr͸CbEvF/.%VQ~9_N'_CB% ~y¶1JxQn|Y?^Fk@?\?v:7yٙ!;S]Aך$㫗َ=t)e '}!Q V=mm_&>]g{Z^aͪD_Ѽ၍J,=s'sGF/~ <98<֋d|JW}lv8٭mJ,ǥvfEuFJQ9CoEG{NrmIU9s<;n~Ng+z_%Ɵ³clՆmG_! ΍숟[]EjOIi=uLi{'HIT|g/07խ?5JZ :VS64Rǚ<۱|y輅f`kHwT2 +@ϔҼm{bg5%[j^.6zm|߼QK^[1\ls~h |C692l4*ۻP+1B&H.— "s6wpL7zu#AF]A!q4lㅸKA[;}nO)~8Լy2_WiI0u+4F[p.D^jM:ǃ;7~lx6ۚd@?=| 59G S^'7oA>I.'z^sPH81HQ\$F'GR~u1V-~o#g<9-e2X;w\{(Nxn'ۋ3O9Dͅ%~( ;;$"/뷜@wlN7ugǡgkV,H"hǂR3˜mg&t+nWK :O4~aQM͇x mklJy)蓸H#j 4J EP"T4|i_nÃA9g:e/I9?,o+g<?p42ʗ-u$<~lSfU_@onwMSN[~rZf[ВgcSQ;Tw)ӷ@w|ts29&4o*:k_uH7w-֩fZ4RjW 2~ܒ/IKt ~=/+Q>Rj2(fw>K?לo-;s_$O|_ Kbj_w;!`qo>oMS5z-9mO5K{i~OTſ'z̬>a;k(L!eI_O2BuF/8Z->忰Z79KU5xyW~|۾_X}r@#S: 5XiFJh y|w[mm>ĽזF]r!ųEI5mGjO#YX#U/`M~o15.I ;|WڱBKF'|O[-w{ i^My9쌠Y-6jFFE̟W~ a=qcbF7́]uX}5dץrOrjc ?azZC,jg3,]3r{|q84sçzu.^m2\^XPT+Yb|U?}b|r{O@Waղj.kFU*sU27d8>'cSkHԢ#^l } ވ~)${[x;#9s𥔍O|^.)<~nZ_Vsw6a /Yj54MMSk ]ϒA_gKc,_T Mec#|EO7s Xrٖagϳ2;֗R{Jps A_{-ւd ~ư,[5[{ۜ:;Y/1fʆ$YRo~u~T7|tF>or NpMJJ 4E~fRӅ_)|GF'|U| g;wnzY>EV;]ǃh*#ѷzzG ?ޖZ;~/rc$;[WjudD_3 \k={k/OE_K bi||%eIk (o HH^^(]/)ptn[e!FY8^ER,S҆+RRKg%loO͉dZ|knw>KuILO!4j6zҼ^iyZ*5&|Hj'-i5^>Et .KTAP+y)%FAb_s;ŨLR Wi)N!6K')24_؃3˨zhE^um0~kRfßhߗ]d%}MP VSq<H,G'3Mt˞[\P@z}Ipė GN1H ,^?@yqu=௨9>d>bDN2A iggϓ ]}aUrV=Ϳ $koS'|[;="nJ(v!b)Y YWL?j+L,܆!CKx9EԱ;U)f:v"}ݜShQ(\-'z*1@ z߲u/ߙhpv^7={OJ~[;ptLǢ!E{>"5O:/yg)d[?=:%Wlhy~Sύ{Q `yq(U=gX yÒ4g='O|KVGT[,ĿZUtN[^FE ;KJVL?9%zQw_"j* ہ~u tnjaueku;br[#6m{Y-;SK/? G/ ?oFODdDdC kgĝy)_ e5I4|7P-{r.a \e^ŪI}$pJşÎW9{VGAɺ-^;ˁciZTAq=kHFe3MYaGRJy]'G9^by6e]蝺| +9wuD/-/5ҙ^Ev4tFÎ?A,Fmn+W~G:oרTF?o;ROSo$@?|]k^G>* mm#0r} FO*遞։Q:d[pSLoZMU^y .魤7| z:YI?{̓'(߷o9zzNR-PEDκU >Ws:+? ;>'%bߥkL,67iroI$nag&SF'ie|Ñ'[j%|L_u&D)k :|#[V|vͅH1:}Z;u3qsvGvׁJ&{vW{|I㎕,{ s-qkHoK\/*N,Y߭|]|kU~;P=nɚ"zWWP~AZ- So%a]lu;N@?c}:K\Zn'+NTOƪW8Tqyު {ۛr5/|vTϭRG#8R=4t׶9}x?:}]"xȖU{!-NUc[ko 'TP2~KM2l~op \W2U[%.'_!zh|nIHi9~YOt~~QNAGq~A|6닯k7e;=2RymDi Z ͅ~7=p?[dgNcq44-%;/GvWw҆}óp%1e 圥a6_$ I ( GnE_7[p_j"xmuy}WTS/~ ?~zCgt_p>ErN]~킟(MV#DYʉޣ6 vs!sH=}jQsGtߗɖ1,ED_{1 ? )^ LnϩWwCH"y=9izDtwhK=K э/'x hO#sC;!i'| h,RƧNΘyR1W'Up݄#'Џxot::z,Wy ضosi:)~&[dZ}dAAti)yaԤ7z+I儁Q&jy΢42Cޫ\΋ʊ1Y om}g:8+;d'-PRzE HΗ;sčO~pNo~ jو:1Oi2BQZL/iM /D׾| y{9k(>6|q>bN5 s[9qgs<Һ"p4yߚ aF)K<|oYS[%A&8zS=nA zEEFNk}58o򩘾N_F^[_SH?,08w4eMxb;%)M%kMSĞJTx ?v,h*տV=|9 vFG֞8-{[uޑ2w@I\}dk|Y+zx9?3]GF _jǷTJq2MmaFi?"ePU6(K(5BPt~緝iH[b=JplTpZ=Qׅt܈Fi[xɞHQZ9׾%g&=v%&#b/2i$V#Ɯ/.8I֒7H)zl:%偬4U@ہ"ϵ7ތ7~:忪EaFPBOF, ^'ӨĢĪ#|{z7+3/k^A:FRkDǖ(/ $&QTвmE/C)<5 㽢b }C[C-_#c9KX4Kѳ#5O~,)epg,F~[bY~Ѳdz}tEMko'?^X_WS~~(w>|K/TSc+|rW[lYcs6qsz$?.~N#KFOѐ(㎾uε!52m}nkk[xy39zJ7AI+ft'ŷ>Yjr2݆/{N9$>܋ /JfKvvJyh^FdFz ΡV_r6Gpwہ~$(ːk4Gk^}7. VO~hؤ7JM^, >·n*^۪h.>^v T᥷;<\|ޱx 䫉͔pGi>^0᎚/~Ma2xf|=ЯhUF_z 5ÅBVY2+dI^:=wZ_:-/D󙽳 bQZ.ܳF]G ˁ^"h觖9˒ZlBBՄo66Fㆿ[gV:]] /-L7zy:暯F{$,UOkvB_ύ^x"#|FOsJ])E-qEɲWj,+%+`dAp'k$) euui䶥{Wh=ӊ_IuObxڲ aAtOwsbj&խ$%Z F|:6'Ur-̺NBy4vƧ^ZX?B,}OV1~`m:4sX;zo{//1"NVh٭@M'|ή?ǎ3d,uW2rG>-?2;Fk B}G ʨ7+'e#?VʽqjUn|иj bk= 4e*mW|R3y~I y_?Ꮫb».hfX'ʭ?b5X͕sKX9DMWtj$?m@ Y ̀ kH+ISRLo%P~g#<, ߳)Hi3@/ɵ=U6nR:|/Y%?YY7I."Y\58?q%+<_Mr콳M)#qcw)|a, xaaǭk=f(2|$_BMSGFM[=, [jj_֑Щ^=-1W(})qsE|?9j}s׳+;߂XZ.qِ}B\cdۆ,+~g'kdb[8oB4jR2z'XGzujr,~IM,;4CLMZpL'18`W2pQ^L [~[9=ޓ/ցK>*bvHsD6xD X 1C i>X~,ev'[s_;rGσKNS/@菓?[ֲjee)5ĥXk#ne:v'98AǖyeTa5<;ٚ9֓yҩB$`C3|n[cOݓKi_=1_9[ey'p=%/ '~!2~&\ۧ.\PI/1V.Mڣ õ}fcb9⏘ ~u'Z¼BYmEon3krڏ#3/w![ǃ+}Iw:8\_ Â_^>G?9far5ރ(Ɲ_ÝO<~]9"2<ɷe+FK$vE)9BN&l=ƻњMe liֆ?ҫuc|j\.ʳ& w:zGys_O 'ߛLI_'Nt?pIሺ#|IT_E)k{d۴IsعF<^۞;%*R}TH-Lr`klyJ(twD'<neG=HOV(0,[kG) RbA?ɢxȒP./tl^rh2ZjS>eYу͞'5`c5dNt:sW 2\n2*wò kPeMFOB>6 vms/kJ6, >"erWxϝ&/̷7Ue#ܛxǟhyI :ãoi>\SϺq) &s| q'TGsנ'EB?/aJ#9 ^It|n^[%)KzGq_#=o3_OVݓľ+Fa f=V ܅'UiJ=OM!34[p~ Ŧ{>g؋]4 Sn i yNqPXZO/h=ec}T}ozk- ^gI ÿ'Zro1:7em *K*~xsmnZ}ޣSYo'z_-*Ok tzC ,dS/2߬ߙ܂iG 2 _RXyq6DddU"AH<5hޚe)𷅄+|5-/}5l~Sk;>ki?dIժѮwW 'vnϟk͝On~Dߊ^ JfwU\?e=}Dg񻎭mi爼) 1ttލD) ڼ=QG9+k-_f5#.ocQ9> w؛'f;[VGj`hJoeQi\}~K%wdES}c76=T`^&9X5xN^b.N=x]l1AS]ksro^}OeEVScb[t?+˶'%b;U J IMP./wQ:%`3-2#`(04t |O >b;gw[)P!^kLM Y2ɭy_qu6 j)8ᷫGׂL6^x1삣?~!*)fm2'7jgf{is@X|p%@O6۵ͯ$Y=E0{p*{|&ɮVSvj7zMd'[jTZ=+R z+HRkl,lJ4|J7;яVx⮯_Vx₤FJSrvb'j)ς 1%:~ncKF좪Uͦ%i?XsY2Z%)hT5KK)S'%׈tf=w!;ZSZ]^=JӾы]ԍl'>m @}..j*뽢drE8<3-;d?`Q_s߯>6"fP˿XvE?G׃Uѯt.xa3 ga\ SO&5)ǀ0tYm5=roz_j!FmO zU>D |_-3{N<}mҡ迕k蕅&籥?)uw9WQil$g~%Xb?XT -L)X_gDzI-9ױj1zmJdkk&E|ˣ98z~ů𥫷چ?%])wm-q4?)5V Q7!V'=J$ֹUvFk̅osylIʍB|\ȳWUD:eǍ_- eY| ނD=g?wKkD!4WjL.zRJL6ͷh/N3a5[x_sZ ,IЋϵ6+ -(EV0@ONW?|Yg/!U.ukI1JӦPsϒ2m{נի5=)>cóM8ۑxvrz|p Ce1O]rЏF_k46xGƛz~hso0@ u<}+8Myc탮F ^`ij_ԷhK[塚f'(o i ]*))2,?;^1 D>K;G ]߄Akϖq\ qŧ]=G5nro#Jѷ />ٹcXTx*7oxy)7>'Moa;q?~0jgK2bql~K׺i\3Q?'#:s\6iF%qXGG{F.(KW &L=I։̺&K6eS6becWamj{OJ[gipwƗv;GY ͋62]A\_~6:A䂾wZ}:61%qqN2UӟYx~'~xYo {8պ×7_@B}__` ){He@)E;P?jo"!~ ?E\]5ˈ 7xZ]뿈stq‹ky}@b x7AB0TU_sWk7U"'@5u<^C|!Ra"{hV"\JE?/ :9:6~қ9wPwP{{Cl~Fi;7u'-6MgXt/! !kѻB𽀪ص5xV=R>;B ^F(x O?@ᜪOeHWI3W'L6~{_1dAK{0$Zd3XmǏ _b _D|cbx" RK%u\ %?Ig WGl LWatil0tM(J~3`5@?bC1 =`OvW}}@Kh:@SRabY- G/[+v·Pssꃿf5?nk=KHVqT"7~~@$0vD&]M _ڴ4y}jQ~?͹ ŷ*kI{蕱~&i_@3YNXi-VtC{] + d~a&1UZ$H>@ wDAwДsꯄq!/!4~W^"|׷傞_PSh OF> E>$A ?u-bu(b;ҥ CIy%6^'=RsF b6O0I|iv|@ZD?Dw<iKnPk`[hgb}WQ >O;[q'2=m2MЧlm+}[3n||g"Oh8XG5!IJ?EW ߉dlbWF ϗEFn􂎟(}W_+Ћ VWt͆X)}`b5x}\re; {8t9z!h<I~DXƊ|G/7f}Jv.po7vxj[gJ-45 Ы!+o_u|f!W?ӿvF?ֿ^6~I/7{/оSwghV!4KT/ifw{%Xz2C5qVGod5=[O8Ss%'nOphD/@UKCO Z\޿h8dAP>amĄJMW7^A)2~$}}@ P /@FvCM-~&?~ )+蕠ZZ,;ڞ&TGRnb7Iҋ(p%!IO TPo(UG) pH_u\ f@&ʮF>@ ŋ~ZbF2V $j%ݏ|~@ 9K~k %f [Lۓd.fAD<>SJdnĠ_`JVF?vxړW)U >Ӭ?>b։O B ςz7#ۑsL-l߾Ll Њ?g7X!zoJeq<'4gjhm`OL Czw>Kqg+M@YxD;US)v#ֱ .Ot.V\miUͣo)<{ 'unjO~30g’$|8߰+ga bAE+.MVkd#,d?BTG/4{8 |3zV )?A_?LY{OaMK q!h8+au=m{v*H->KDAd6h@\ko-9!wPϩsTX%6۾?Ҁ(FSDVT@#`<`>7:|-E >ZPahɆ <|jGwb,<Un؜:>f4=? me4>`R[4=`fy^[>d=>.f xzTY[5j#%Bop>Q!|}7P7jLXp,{6׆>Fi OSW@}L |GSB'kAy0LLRDV6nwB)z$/˖d=Ex)OO$襕=~ߦוgefN|s} x%=[F !rB_E _=ͦ/>D-5aD;V~߫~fY3x |߂Ɨ@{HrܸS~ˁ]3գs\zbW6fMU˲֝ӧGS61;S>oΩ[9 A M]z߼NT)" :+{C/3֋qV . h;rdDr;0E'=Q2mv5Yaյ5ABOOHwȮK=[:X/ gSBkYy@?R ߙ#"^ ֭5TWl{ @^LO75cpi?`NLn<Ɏ|b:7V_D^Ȑd(Ϫ<0hIMygg^ci\OʹutUx qd8}&~{ٹ #Gx@/==Bfi SO)o~x\5G_wIv֋~2l:gl=邅=I_>o8ͣO |+ْmCk-,!'#  k>Oo}7˖ݸD/)R ?T6r"\lJV֎ju9KӫzPN6m=IisH{gMrk?BgWc/޲'[N6c^E9_iYU׃%=Tb%%DxI[3Ƈ\}JO5=L}F>G#m`3EkI+l|Ÿam?W3^ydݹ֔Ɵy>-ǾiS7d9 VFo9"A;Z,iBswIa/~81~gs}V_GT şњN>j6z= {Yw&-Ko3ύxRP6|Mt:r^L"|NBeuHl{FHku>яv|<w6ksj)|*??Ó׌XwJtN'㷅],6z]z?//.nMcDH$\}  v*ZNt_խK<[Wz&l >W*zp.#xKK Х\cH\~@3;_#>EՆa0۠ܞ#Zk_#&Sa>׸W O.PoF KdK=8D_d=>V ?GѣU~[$˃#~*-`]įi] c/qHpxY^_eYG3\MgTݥ9AKM$Y!h>4|͢򆿼<i|SkMhSc Æ/14ώh'0Ye6PEwz7/+fYCkk8OA;e+X2>:M-/"j5i} &_ Z?O +¯"ݸD/#Gl}̱,x-{D4qlIpGhO:SBѯLLjMQ^v}oNwdя<тH$((3%[-w-'|YMJ;1h3KE/\@??N&>_GWb8c+n>I _—(H;άI>-պx ?}͂'ɉ×E ߣ;'$n|6R|yH>R^f_sUױ(&eu!LǾ@eOܑG b.b~Om< VU _|5%|Jc=v;Uڹcc”7&I5z1[끿z*Iz.Zii r[?o䓛~ UIVa8=KT?`K?{[BHtuSki^eC>ۼ\|+ᖵ#}+|G̞S9dMo,;kZ"WɎ> եItafGGwwq~JFcw]Ʀh~t;ڦL7ߒ𚲖5Y^͂`Ic@/tz V[__>ZwiCLщ~s{{mPSƹm['bHSﭳkGIb~3vq%J=zF"MW|2t'+/WWxo՞沱XDO1=vNwӒnXRkY8ZDwXsG87߂7% if>DWYk ޫ#)״IQ3e.+>sJ\vGnPw+(K\@+Ưԅ-4yF\?2Dj5%ek+u;K'~ĀM >Iv6|>MziV5&e5EK; eiFNmZ1L#ϱ+I\-sF߂,8"67jxJg-'^1 .Oɖl]&L@~J@R&:p%n}x/bv=_C-/j4tW5BAFhlqN 툄/))]k$[n?䲝{/Y&GlFOkޢ5/.Q;hSGˇ{Vvngqa QoG)@YYixqWզ6.~GMS o_xUٖ} +KFH_RFe6W;Dqdfط&)ȱ,T%s5Yʥ5g9K`ZTw Ëq7G %&/pPS,>-=R~Ħ6mWc>M.rȒ#D/Wʄo9vr;v(;=}젥Q>#nǡ8.W#[DIyd?^<ߗzsx;KW{GŌ;㏱R2eG6N+T^y#qD5)"vz}>8֜kRvChgy+LqY_55AX%v6zZFe:xqZ4 ;lqj nK1ES~bs#uőF +(eqpB VowZ=/5\xp5äVD/ԬK=Y\(ǖ,?4_KG/VSmgPՑS %MȆ9=ߦm~nF(R_|JIl iq~M鵃}r~-Okl[`j~$/V˲>_r,̠w;ﳫ@B)#btYݑ\|T> >/WcB_|;UvZ[Tv q+KeC{E%A\VdU)~ps#[NzV,rkǚ[vĥBY_.H6մnՉ#,1 ߮ZqfϕȉE/Sg뤿]g/h;7x 쀿L%q^LZEͷڥkO-)3&U5X 9{(*iP2L1>D\ @r1^nP_oiGiPgKm¿G~]_cz{U&FDWes+x!yqnB$!Wti&jTm'`Q1-WZ1S/)Yú(?ݶ½) NSƒ O?mLQatE:~?^jYT Ae3=_oWZ_5][E);3s`[`~}H3 W/~H=9z+woaRujzK)؟z7!@_ fCO,oZuxR{-6)r>Eߢsh6~&3Mb5.^Qa=k_YL4xc{ɥ/PcM;`lMfhi9`M'4#{0J~'VS _ԕ|q'N?ļO(#o 5MxUgH0sr)(}7u5kRe߉HKc{ U) >IRjh3gl0?cu*=ЛWb?@&(hyI;vQRzm赔3 c4B^Oj@˺w|F(k d>ݱ%4ñ7%Y~|ҡeg|b{SSxF;8Z+r(N3\h~.eX>A9e7-w-NhE<𗸃iEISV?={1*.M5- 59Re#m9cuz5jqo#_ϗgd/y7~k(=0~#zT+sh {ISekFD:#q3[#~؇Wv)njzrr5e$L3?@∲;+A'Gx"47^ ~zI^}~÷Yo@O,O~8M_Y̒1B_3S[OCSZm鑾ВgA%+/詳> D-/u{ר@}J"Z??`\Kf+DU/NN_ (Y+;nŗ?>`Ɋ[jyJ9j`۪ߡ9eK -9]Ҍ?Aĭ9k;~-B`)O}7lK<>`+]TIz=kp"0lFsY 1_JV Ҕe}W Z;DiHv6 P*SBI,:Vhqg8_P?.m~Eo E$ZeGr%[Nܒ=Ԙ}m/@Ը=/Xe|ɼ%5B;=l{ Ő :`@|@NSE?Ü>x^[=(l75\•߀{}#\M[Kl$cݤ=kH ~ȖWMZ=l؞}א=#?'#-EV&mS 6~G!>`DLqP TR&7aF_Rrǝ31isX8Hoܖ-{S+Լ~@<4F2lNQ7!T-vP7~LYwDȷ|?qXȸbӤ'A Bf!ֈ-hAR[iP-3 _ѵ(~hF>ո$ xh 傞^ˉ~`̊F-.ݩql?nhsׁ[6fG)|0~{})k(R lԲ*C|>EG~U?@iAޥe%Y&3 ~iТ6|ВGj~[$/v;&j}+ K =O ?@%P3#ђ#PV)w80ۇ@R}hy׬3vy}q]A}pj)[ ?lk9k/AQ̦NM$Nö4@< !z}97xxP'H<DGT=4x-r*G`*LF4/ƼOgZU}==X#u0%,!ZCvid?>!:0vG^Z;hxeҷD*6r OM|@DRU'lphpAv,by_'Y:')ƞLj-J}Z%O9/$|uפ !]#[~@ZBw"Jwym~V$Ƌ\S cʎFP( :#{L{-?-;AKcI.Ѫf[s5x3/| 42ل< fatkO/H3 ^~$WEw$I")&3!lrxL=nN Co[}|h#:z;1#8Z߯bFksuDC:k7rbC9fKK?4?D|*Y}/@'1Z+<;(=@ NSNl_ 'kY\?Ц1;6)ܟ=:Uᩕ)L3cUǝ!¿;nAkgY H FA?>@>-@x Iy}_F<Džmp0Uf'לRx^]|V(S{{o %肃uK]<6g98:Iu x&d~SeVFv*b$򁿅$>׏ز#EF߂7ax6S;݃ ^P`nw#L|Su\G( ?] /_w;lBД>$2oOW+oNb'M;pN'Kf xՁ \9}_@x'25r Ɉhx~@&Tr!+!RM@Mi럖)9fU?y$:d%Qʇ?L÷S{R*_OKS/2B>uG MOBPW-Sy7 Ayw`_A{йmN`_T/%)7~ ڋ3 5n75J{ڑՕZ:S{U$7PoVy])iuM4wE񧠍O5 KrK:=0=qY毵XM,i"lEDbc9R#\5,ji7u&z1 6b-6{w?=L+ǃS CIz>NpVvf9Rs15J =Ez;u;=ʧx/wu9KHoӥ/ 5Wk^-L*¹vY Sy{[c+f>o^O )^,Xɓ' ۺL爔L ]*w ^T9Kf^^ ~eĚ𑾼V2^@[=n^)V΍?'M_'eߣ?wƏw2ɒH$j?Wθ8@{)[HosHΣȒ[ίZcKv=vKޙ8:SmI]] OK`4+LoINP ƆOZ}YÏE_幥*h\%?8Dkk,e/Η^jJ#OVUx >_';|Soa*<@YG䀿.&G"Z|MAAxEc7E>Vc9 Cl[} 83҈E:~jB)3T[3FRSMc0П+?kɭ6_sN~.o^_/ O$/Wx޲R󺔋=!Gf8EXe[lv3nv:[GVV='9VpO6v=#\V1u:-3Sn[~+W~ _s㻪+_Wz[=X9Kh[Yj=;*՗(_w=~ۙxN@QSԈۂ?2Ѹz nxpTF_Yrsz'=p<2YR^KP}IzѨ\VW=\_MѳkmNN&EzAƫ bSqgoA@LL6e'|ۢ:|ϭ 7,Htx{Ks "$k^;o4^s{S^Hߢ}{7D9wĝ?6T9΍Cr.<^"(;Fr5Ijww=} zǷq=Km,i?SR7ٰ׾o̯r`:tj2G|:Fšϕr[oϝ?QB6|"=)h.*ڽ =X@"xoM7k_jjSIE'| ?'M WV-R:ֹfUj9) TfakWf)t᫢}ly=P+IpkGmjS||42/ωZ/<"06Ӫ>sr LL ~*w2%tT0~u) 4ᛳd3ÓH萈35Sr¯~O02xB[M৯1J\Mg}QJ4$ ֶR|OTE+zē#N[W+,N\}8`^<~NdO0)*>/tê1~~ymgd}׈x Hx/_D;%߲]e[5t ]X9R'1HN˜ܞuf#oonRhSn!7z );)La䥚rkMgECTP7ӸC| j/̎hi=ИŎ^d1uo{Go7V ^/8| pgm>FO!< lu?*,6񷚂8H/}ܗ% 6efg?߉W]eI$" ?l /YdCWBpH>W>? жGNZ|"qxX% Dlĵ!]O֌?=x{QeB'ZY=UMvHi2>>:GoV9tG>﹎{⌻*E7<~IjB?hVchqIXQQ|,c}fc;gf9̧ن^BTZj?zҫ^PV7}ڶ_]B_ˈ57r>N^xֵ ԋIC9pcCy =Q~O^1ze_#rRIgKxRxCC2 o~h+,;|o5aw{oL7AxglCw =ykU/c8|y~;ݽo{Xd|j肿 ^ux<۹G2o(C4b)#4C'^au<%7X~$Sy4oNыa>IWw4JSiS[Hk2~_|3Ay*~y ;$G̎~U06Fz5_?>'ma# go|R?N_o~0z||%)[ 3,E*фHL Vǡv⣕w=?G ݝ''rOWn=>^){̹ͬ}~sΣ4;ɗ?__2cl褞~.Ai<\|/]+9G#>a o~˄_HgI. Kgo~~@}]{|S#|KBi?ߺ;ڠGbsu'@^(?`qczbpVϿHyWnMoq7i^92wR缋7Weω$n>dZv<d?YkNqe_|s%oÞ~ۉ_C IR {ឹ:㟴;gJ=eEg-FOr=ri{"Ϥ[rSx4l>aOqC‰~\@Am-ގ2@dqFC`Qw=Ϩ[5)Z$>73jKH *;z5 :Ӂ?*6Cǥm*;tlqߤ=rzkH2?~aJ Ĕ?jM/MZhq4iJ zungHX~~@uh*۟]mL}f]C<Ec;߮w >q;(uMdfP_O?_@@lYY*oԞj[2ۇ?_SOլĔho72Tþ|yRt 5Da:Z>qR71{MS X*4o9w8I|-or^ ߔ84Bg֔wyuOၿ<s{Q5; |ϡLUo,ϝފ?aSV 25Mn|7S~<|JXH";YZli2t5/n_#)}%qrOm-ZLe:Kب&- r&/z1z#LWJz|ޚ**%(- v!_Q\)*O V߂J}  Yyb/V }SAT73A-DG_bHT R =!߄ O l~ҥC>YV4 d Ziǿ`i_cu)z mx7W϶ѭBsd Jf]# hB7q{*)VՂABOiM~M"?`_V:T>ß=:M/\3<`>wMF j^!6څ=u(%oXe P>kNQ+e9/-~ֳ\g/3vB>Il!X~;hO۽]xg>>_L9HvI8}eұwV,ۛmAl\HNO4dгNrAligLw'mm cv>K ,7O%+zupXMsc$nwe&ēMOyh𹡏v%ë^veyeL/[N)ßi؋_gltj<2~2O1/)z>sຣ/WJWO?fu[aovj5Pbwj]s5rv 2:&Au8φaM˛*xi5/EoX׼n_-6|@*G,QDE#vS{$zT ɤKVz+>x5|vm{S9M{a'#zKQ&Cϛ:-UDgMG{ɷpY¾|K0( >5}!~>?kXOS;_4f(LҪwlRortU =5|@'g *|F* =We_tD?XЄUI:[/%௭$cXy.u^xzHOsO<4«L/j7􀟝0x,JCH}О HU23Ĉ;V)d?%v!_/sxȚwc*tf-7$|cNQd+Ö["=톡-Y/,A? mlz6 '!lW[``/+f_=)ӫ_6z>rNOړa1w;5@暾b<„oFeIx?}5?#7C>9á37UKr Zޱ>:|h|ľtkI225|~:}J*)G?1*> ?GpbGd4q:|%ph) e"`ecD$υˇ#|lJ )5)OXyc?iLӂn)CP'DAӐ$Is)Pϑ:?kx4xٚ.-O,G4: #zshx>Wv#^B︑nSP}Uax)J|~? _z-5E(zӓC󁯾[A'^zq-;|qɘT^Dliwe򵏊؂TĒd1_}nHTڎӛ=^rKUXikvD'i&.̂r"q;}wC5%B5=#jl, ۚΘSO9%boC]_7|A-~s=i`xq7?ZN)KF[%| qWqjk=೓#3z?0) Oaui+bf~miX;8~G<VП]EX?fġSڌ 0xsj왦9[9gi%éR?4znsLZ\?~vI!,8 +H~U KXh9}~K]Ka_s"8r;VHL(̩[9{ z+ugf_>'Y -S5'n¯#3H[>$*;&0uWy7Noe HSU--&;^q?)3rcg$~/`:Y{so:q?b;⣊aw9fzU& ?gҙݙ0 \Ʀ|Ws,~+a*X皫'UXyol-W>{ç˼[GΏ qG-6aѣoMyNRjQWSBO.i=?wWgd/̺t>_ʇFK<ZÃ_CKcB#/WIǚsPJWOQХ,)K/ojx ̭7Nkhc>s;‡}z*vh;nGՈ>\7 dQ37m<\Y'y]aiY+kKq&4r=wzVYO]Q~ ! Vg.~u_XjLZ,🪽Wi>JWxѺ<i @M*:'S|e,sh(4oteޝ/5-?2R+j D:*:~^#>+;q"P?PZL ~ͷS^n(3|Z7e8t6~IKC?D;3\vUfz>}>.dv/6,[_O~?$vTnu4 aqqA5qD4jRoXC;7Րtq댱R= kFeshŻY ɆyKVRfSmR2)g} ؕjyo^0anqc7*ѯ\rJ|D1FaC{ n>q1vc"koNvV웳G_\cd=ce_i}ex6Q;_a0?WZG3|7?X @n!SDj <3x&?xs=7FRO5ZE9ccd8 R{#>Qn"*,*'E/h-:9sW,(&t%(O&FR(J&t[o҈RSdocOPBbC[ρ̱)nmd~{ 9J= !Nu6_wjOc~(Zc<|c~'% ϢJH sc>RAgK&q[iJ@XRr/wklW17ŗ@T+ev>oYg%G'?5ϊcO%Y5ńٜGCշZ 7D+&4Яf4'҆<Є4_̴9\ MRy߂ ! Fm/xCc6/N: 5)X~}QxnXͩ(R_!)'7A$xxv\_Ne#(Idؿ\wU5hdo9铬Od &01?vmStrL56/P<\~>R`'f \J]eѡsT\Π|hn?9}Ck>š}>%u=Q:yn$>{TO5>;D > `: rHF_sy@u+ފ]zQ33]0:{K:_C6'iC?59>Ut)Oi A W{k Yv r2Z/ᐂ_yhz,>Qo=#osjg`=v:$9g'^7Ze׫L |tK>rOӣ75v?%To3?*W3ޙp=b5xk¯ DD>i_Ȃ?"o=握*BOi&[ vfWz(/}?©,o%4唗?谔E XվH vU[Lqx1y%ްw_9dYz8 Z6_.K_&L":(S AABڥկ$xE#LgLU}F^,\^֛42ת800d;7'zX?/iRf=k6swa5zԻ*;1˧~_R |Cb'*Z*0*3'n?73OS~q]_ly^ ѭxU~' v^v=еG̦c,Ri9Jnћ  X|Fݭ ~t|Pr%4NV}۟YKkr:6F)Y\gVیsOWn_K׈ ~͟ z=咇{8)eSa,Q1k co=jVxI;_.C s9Dڴ{a52/o0Z 1Y3D%H/G»IS^ ZBB\럍зO?/D^pGfz%TiUBDck-|%ۓ񔛯\ 륑Yi/,AC4o"hUʋ|WI^} qH~dyۿT[ ⤭#Eyu(&tϢ[ֳcG~p(Tgwt`k7O9[|B#Q{dHQ }f|gY7 ^򘟽S4BA#9J>S[Qp[39m -or J{s&AXKQJAA؟C(HJ7]Av/$Q;0>4QPhFE+~&uQn'L÷mY:E6CygKLTby~9M> aI>{kY't`Q 'Ъ;ib7Qs*r`X/^Hk4oYc3߯)tT@v ^Ӄ1vnH=hESkTD@lvŰ(u`%1ט>0>*t.k:]hїaşE_w$ LJi`RMzˑ=Yu8Mn"+׃ՠQe" y=/CZʉ[HqLM>nߢˁ2 Ϣtsܟ(T:P|&MT*e݁|c 43z^@aX+Pv 7س%`dN4x rR Fs=dSO(^!+zvO(?fZ؞IfNZL?U5-+-'p@O1Տ-W̲[U/@Z6cjJ7Y}ᗏ(76SPTWb! Ac [:S t_6K@FӁeR3*,K!>s'PO؜gyTO(3NԵ,C=hNR' >nx΄LگNzW][+Ԇ}jt:-,NtGv%8гN $9R߶r"i]7|y^۾&MTDW'r1wMgxfu v8WJvMU-c|o*]נ{8]~n*^dUF{H?5?J땇, `ʍЛ~O)9끡7opFt+zz-_MLЯR>Pȉ܈jnߞLD}w@Fe 8&.` X>P\}ӻW7I_ {D]JujG(ʘ/x҈H[[g`R%P,uw'@}U%vkt:b `|U4t#-@ɻ3/%`>@=E(ٟJ'eЯyv; Ƈ8xT">[fcPfErB1n}FS {-D^܁Jtn.3NrOz2<1DǃgE:Z`N D 2ҿC?.%4M&At0H=IS Z=zz֯%b@sD ?\y oZJ豵Ӽ?AQ:3-/d?b,e+YTKQꎽr DS) Yۻ YNu!2_ߵL<bSc >=c.:ZzY)Q<7c=_/m=T3>_x~wHM#@wV8s1=ȹv8:cRGg\??As<<"5e&-P@q)-lJtVP!ihh)Q@?;h|'{hAvW3C=TJy>}lfŠ)#y݃깙x]BV ]zr!lj4R=`h}'ɭ)zǃ/}/e:臡+OpJFg E$|%!/^X6N9u6||evaOHQŔ:.|)*^rUB"BV%~x1mfcY23e Ͽb1à%MB?xޡeW5ږX:eBo$ tGX߲ɵ*R?$uKӁ|rQ'DSF/:݁ٻ=iL"?LJ)v^tPP7Ѩ2*: *he oЀz.+I+̷wˈ]{0 x}kb畍>@'&[.]oJ11m'L16ax↶{y ozae={h5ѻe+[} H7^T&Nd.y2o;S}mPS1tJ gy@O!O)?N!|zP VrT&~>d鲆_Z`"hS8}9 F./srK B148&*ô =45G7ɂIʂ^>ȯk9'H#"}_TzDnB=<Ԃ18wϢѫ[o |&'uV_>İkA=k`T&|3b#jDJ$d%jKZJL0Zo1*o.VJތx<m~@q-AW?Z,;`= /ߧ֫&k9Kee) .!nv% v5+*Um&T?0WNf<7fHƫ\bZS<G5n`ƱWv'dFǒ  'mJ| Cā@`"[^_ ;/8_k nI8 Ʈ^FuzG~͊4tww0§9x~|ʷ̓ : gG6y0`=hAtwkA^?dk }&5;@kW%~䲥 .6؟0bYO?c:#]u:'4; aLFbDdیFALgɃٮ?0w3<`OA]e\̷i\e?zw':j{yϣ) 7%Oyv3? g_c,- m~04ȅQԝ b~~v`>vcswu1<_AsRv+O]UOĝ;R"~;(NeR.?%62MoJ.%,lc~4u2\2@EOȈh9Uu,˿yaOrn=tuA0?3v?߯)ʗz&&zYcmܜÃ1w>cI7c`,xVZuuk~W};v xsϡ|OD_NM6 T|Q.?:trIuCѢaD5q3$U}_\_i@#:_31ͣw5+_(sGI;ޯϖ?,Y@azrלяa~)5Vg_}Sċ=u}(zjoF+u>z`No<կSSW{2~c xr#c,QIb#10EDgǚP G`Q4|_\"\"MNJCg!s_ws^>;nY?l:Jʈ0:R/AAӒ&6ƻ[ ~rC} Bk:M~X|mpm>j̨S.?ж6ckAJFjpB軟^0@x>e(>nojvnv;:nn^<^#Qj/󗪇6COt*XgNXlMsaYvggo2X2|b0pTgr9W__ޒ,T ^&ƭ)T2hc>D Nkݗb}vdc%A21sZNá fopz܉+jw?ۤO[Oor\:I}oDzl Neޖ_tsojgJyշ9"τOFY^r?\)n?3*|[Tt 4ۧaC//^zIzqd Kˁ1|Ȇ-w٩o^50zCq>^>[VJoasSE|+lбgNU?'.8Nw}0i \3`Ft7R BNc?M ^wifn7$'#Y\VZ+<%B8.[n(ɉOht`ic>Kt|΁y`RR>No{C7vPI݅DI⳨B/sɵ?V"vzмk4$ 8[Ou~^^)*޻@A}tWMO4=N kЩGq#LSdNb+P^MQobvz O"u˃ҟ`G >`]pO&+|!ci/UTj`.."y>{țI/&IU<h\3zUT[CheJ~K|݁K9nbڦ- *4eAKaG!5tK 8 RAΑEmh`A$A{ *52Iէ:Tx+ЉOkn%r_,^DOB0YB&xMGi>dե;bFMgѪ'|h)5ϋB1c#쯐>Yd)W Ez`T#`Au ?-yЫ <嚋ٿ=3ciF$_.T-+N~ε{PBc|n&hH%U:M’n"s&ÏuX *tdDFFu?A_ٍ/Ѻ,ir UD֏MC"(:_`ˆJgcͨuZ?A P 7p"{ zHדcW30-'J\e;Rύ P6:PJl/`v 8ƻ 룣?A,hffQo>'XȒDHGU7<jwAC\ZÁC6ݏ\kDST7Y3+1h̻}7Cs˔)Pl_@aW2*DKf'a/";(v1dhk, J*1;ң saçXiA%H^mK|͞t4v(ĨdQTFe2PC :pCbyH_uMHC |:`Wfv%_ic_=猞ZgF6BǺQOYطDN{{n~JC UFsx Ox"\Hwةы, dH5wZt?>SB!nI%o&>rzP L[jO0IKծUq 9O[ZF & GҴخ?iEс"H( {1X܌zӮdw遆([\Pwƫ_ffHsgO(1e %t@X$%&m-T˲Pzz^v$42|w&] 0O* |n!cdn`֌^h3{[<$ZC,% YA6 uHOAuF%dYŸM4e O[-(^ AHIcl@#$n!;@SLnV80]?.\ᡙ*hJLR|LQ.?>|hdu`Eo=Pݾǥ wfeJbzz+jEhw^$p )1ww9T,dRYdCMf-@j}MQEQSnЬ,4c_O 8|nuDqv,7Aeh b{PoA+I&{oL÷.+x.Iw\0yJ$̌{P'OJ&ADroP-z;HZwL}2oz4P\c?ʼnI~ W:=3~F.w6Crv9iЫNr@Eԣ `bS5m\ا /<={:DW@vm't r:`ky 7Of%/@bsPxt{`Gw 4jz3tVR;P$W+laK oxuwسAZ@\ݾZpK6|- xP%51w;Mx6hbt@/AN_ǣd_{HU=:|b!xw _OXd~"[<:>R~kv+T\POq`~=Ć78݃I3Y"A]v`Av,""f~Y|Ȭا^y-5O@b=1Ӂh޾yY-_9f X;<%62Lx~ԙZU/`i&}Lt񁘴ջL]>&yS_ !|x#H*s~#?Bh̚<((s]֌md D=AC<۔ oJc#\N.\\&Nc :p>!c {|Ecwy~JDZ2~΢a`W#\ =7+$42_zݳPZ9͒3q @v&'_a@? Jԫ$`Ƽ+w=rZPp%|%!rDB/Jf`Ez\}kq׋sb{WnSc"Hwl) U?gDQg99(LCtVmƁ+icohN/ t(߻k<)EIJz:Ro݁RAl ;aË}u8 E.x]@~ H?NJ-E e85ju i 0zfqL6 _fÁ0|y;#׼)e _dbtًg`w 0y#Ʃh+_4_a!˃INZ8(X*}yP*DJ5=1ST~0yhtEf?:clsߧ4p E>qs ;m 0 u9|?hoȹlփ"O#7(.N8F$ z󵇥`͍=_hSn~G%.Y2cJR#|64_:9ځ§Cvԉ8<<ܢNy.6yw~<Q8`SdȚ֘D|^i .I=W{@σCl{,'7T/E݁PDu1oL9!u ?d`GU;g2Z ؇ Bfn ksUgU?@B3-(O,v\,p~>{#XYn?h>: { /iHTDJȯ4]9o𶐍D1; ~`|E! DT>]6T6.S .U82G׌^]sud  ڛ#=ڊJIy٘6œHVяq u!BRJl=4[a\H假D:cVׁɉSUс,&R่Bh.,RnE &s2U_$\즓jВ_E6SoYL.d/K  {eZA(:p߳9gpc!c}J`J@OmHt7 ~/>?X[3[M#2xmҜoXJ| _Yc~gJo/I=ȕ/\@ljve7~ɱe{z/ITkE8:7'P(? f{I}ml f/^]D}6$tt6y߳ 3RX\$ ѭf9(g|]+1LmWr 87CN/ ?!?y] .њrL7> ?ɀA v-6{OB a>f*Si?_%5y'ۘޜ//0}-}_?}(W  ?S—wg>{xN44p󵿳7FSaq AR77 ɺspt3qqtiUbR'1k{/%(~+ҢVC? h`CQ H@tA8OjEָ9O:Rk Ft!*1,qTG1P8ZmIsH֕ϗ <0OKZm~! aNu2 aWkqW}ж˓$\m-󉂗|a/l..W?ʇ^<2?oWxUmvrA=Ojrn&}.rn6 eZyT '6u/ttՂeg*Vŏ<-]Y-Y_i|U"tvWG~"Yuȁ,,c~1_#iW~pzoA=W w' *}C q3ߤ8S?1;u3 j=5b|RN^~'_\Zї4fg ?O73ۯB_BB0l} Leϗ ^..ڞe~ Fexcz:21UC۹I qҾ!S>ru4bޭ=32~ʛYP~:y)O)X4(Z0%@_PJ˱svs_3Q\ѸF~OȟKqW+Ui搮R U1:PF |3:uyLj\X|9E" —O? hv#ͯ1_yÇ=t.ynx)9c;hGu!5x'go_\]Hf ~q]YmLljjqCjc~ZO D1ߢh=ҹ<)ɋH#oW;aZ'Gm7ߜ~+ ?'pc?P|,ilg Lm5Va9Ox<,CتSQ<ܑߡ蛟y^3Y1Je.j=(ٿHk}/pgRSG:wВ?>$Ϋbu FVom77qiіt_}4৪cM[hE9&IAw >ځq`U+-m(:~ҘĆSYb ,ݔJ/-}setN"ȀYʒ|ý2@_"|' [ W>@=&As7+\$;WǙkW)@acRlj[N~Y8ۧ: < oE{$rߜ ?AA&ȓ'67uilyߜ&؛_B1_c(ߥOl~ nT򂯾Dg'sk!gZHxfN}:'f~FC':~xJI;᫄9 za=}T+<҇-. u=U,f-t(8P6?b"#gD&LoޝV@@om!-Im6RL0xQ dn$Oݹy7S `cq`?4:r[K$S({ڣfK9xKsʕй_mfoOL| >wO%S# z,u6+icfC})=2:.ŀV^`Bӧټ, "C䱿nշ)|ŊDvȭÂ$KnfO?OѪƳY ^&j}ۿhbM^4Ic\:KןȂʄL7l /!gB"n+'goW$KEɱ*^ZI-*ʺ|7کeNj5.mg]'TC ObR/SLKv@HJ R|l `PpַC8hk~ F%~|u^ ꧠh" oV^o_֫ܡUshYXׯ3gzo+>{A.Vx~ B|Tf>N3}KƼ5-Zm"d2J]+Ql˴^TP?G2 O Yjt+ݏ 겛A'O)ԏ};|((9mƟ'5UJiri$x"v?iѬ{/KጁKmjY|spi<+獙|CW{Gy#{ؿH siV9k,Z@SX.ʗLb#I?6F҆ul}lsx-]03iF|iRP5/ k V_hy_ Ig+Eo} Vgax zط,ڼ+>SY7e>o+SQ9xA2ۧ9^, }Q|Ϲ \~b?\2nď%x~-+'E zulagW'  ߫'׌[,c_R pc9/ozgSFBj~vũ(Gnb6|*j#STW8lMk/K7c2+K!T &]H'qgCղ~}6YL8_K ~q 1rG˜w1<2>sw>=tO&<͢\rq'q c~ xLEWZiDqLus?VQ~.|. ~ =o5/̟?b0 p41OoY(e Pgg2}O Ly0_c"D2|8媳hӤ%myO[Ts7Ah5㞩D8pND$5CHn>9@2UG80*?9!01Ik4\'-|Ƹ} G?毙(t|,-x؟ ?Xl܊Qn>>ZWљn]v:)ZChkt[d0~ַ%h|ĶE"?)zo!G^42=iG ~\EBH4c,mNtͲeէD_~4ҹ< *3|R]$ "كIłNq@_LB|W3Мxҟc:i6ǚͷP} ?UXSۃRþoL=%x{ E;}9P} aE~ƗS? ƊܓӃÙUgO}_p}ךOZQGjK{HgMm!(^[0A(-d/˒WrpxR`7yoC4/0LKK=$|yr. 1 +2X(O&p <~F' VNV'}mRTq=eci$dJ>g'+eIc : t}|WxĊ^`<@3A/zv 0= @{|„3Yc!b`GHՏ]4G||v`G3-KȞ(h>ʥnJYr:0/y>>N,έdʘKE|}*O^)}Z2űd%ҖyH=^"8PJJZNڕŚgTt`Qߌjc9{7:>Osdv[>_xG"ӅR ̮鴿GDeMwf; "rs\I1q=kd*zHGTk54_ㄞ[jI~ M"1]XsKhU #R*}l"c`>?>AQ' }8@89?ݴ/s6"M \tӁT7>>HMO\Y @s9lTpl}x?4VS(@|)OP{-tEF$<És)ˁ9*|Fߒfm!Nk,J޿A$JĤQ{l 4 x~=L0/sP*jFOÃ҆?rڟT]|pL"8rDrkܓOؤJްTN,x _|=|z!g!􆽅,PP/D( Wv!5M4B] ř15Cvabu(ɿ .(I,ߖdA _ѹĄG̰pÁ)<-רtQg;f`Nix:OP;=QՖY'n؋T@yt>J-ːD݁zI{b~0Bxzw}bHbDž?s"q~rEH<e\J=kYO2Qv,8EU'+O~&Ԍ><}thƑQwP|s(RC Á~ &e6[DO Ȗl]?Zni|dw.GI\Ѩg5>ǥ"}}OA_zghÁE+D%Af@&;H#Ha+ f7 iRh\$q6]'gf!1uWK+CB{HT7GGa}bտI-"w^Ĕn> VXBS 2~ J7f-DH'vGCo(q:Pҿ zOr9ph 3E#=+JPDZ*'>B_dp҇:XhCp+#9&<;0R{&.4 .U G0E%8*gQt~W+|Z`9#hx SS1' \OKPF>>]ybI҇SE-9x b >$& vK#3T|IBDFߠy[n9:N;9G>dӁO)X -PO r 5j"t"; %*WYEfz @[fB*؆ŃR5_"i2w*!_qP>GzpDJI$CPps8T|;)1%;МMz_flc |c_@?p0*3|5"c£9C\}دK$(ġ${ksTp`bzGP/]YͯG +|0_⸄l<߁Z[ {P\* xI!,ZSB\A8UQ9 5?tڿb!|5U=HQB pC*E 3>I=h T;qj=tnLmO-݃_WN,$_q)U^[ [ !$`fOs>Ol72;)S@ApA#*ȑޫߤ}+3Jp!J#| "V?=TCqARN]7 т_4ЎطJm~ulMS)ρ(ۏGZ"֏c5$cR~ i)t*ɋ+:"{Ja;']iI)%W LZA<$3uf=\Uo;En;n܀cj >>@ό4W94+5QqzLJ.,_+DlP#b#g[-pp=c?{@Ȯ*%{0DgFKl9ch~` o^#Z89^0yM^%׸&e?'_@3dB Rßm齥u`cهTg=]Ζ,c\]}aMz#;f]:ہ~gnvcLK^q&do=>m}h7~rSBlٿT~$7-G<5=A{|G\J޶H\G_!-z.:'5x #r_ygE 꼅n֎7,Wӏ3]-RTm%D@Bkv /Dۍ@?$ٖGn[hr'ʲ凫5.tĉgs\ӫP[uâhj| ;p_ /%ůNN$g5]QM/ ^7PX vl缮>iZ EVg53п|_Ew(e; 7iL6i!՞ס:SO슟mF=u|}CFo-𚟔f[ X XUct-/Ǵhg \"iZ5얋w;9x8&Yۦ,J&lҺ6)5is L'Կ]_ ki&I'YcT/iUa\/_(m/mK.14QZs:۫9 2#v n["1X@ǯq m3b V>2;]"?=uv3O ."xbwW1'ȍGO?/'zȣu*Æ/y_Im2VuH'S铄t'g_/]ľk~7ʳd @Qqmrg2[B+/|N'_V)#]M=u?>)OM҈Ϛ/ܰ |1+E;~?0VO4`gXJ族%ҧԊmx{?Ur/Ő)Cb0d:t9;nw l?Ov88gHil{VH/x%(;8ĸh4E.gВ-^UkߚW]z~N6 vLrJn?bqUc\ZfxΚ׆  Pg5q)gqe6$7yΜ/gO* ĴzΔߝvgsMSoO7iХ@HdZC'sX~O߶UO [~ƿ$):AEs=gS[TX'/z}!\@HP"|%"]=I^=+X*[Cj1pC;iy$?,cZ?M}uc~TCEl7&n]=F?\R@_lÕBaW)*b)jly[ZdA&x- Jk_fV2|b|qHgFgt:Eb>E=Sʄ~ޮnO % =QH_E-WȞyϤ #?by-dmg'N5mn?M,2|/sv+9iѧ:wLLꉿzA;>B>2H|—` lo٬ ~DGnL\~XzA-htG Yh|_R7ku !:baл~f#}yp?JIs;T-b͖6.EgNOҞ"l>ä<|)'c+~$|Ih~r6=%h ~ {j2x+JwLO~| O.9z't^C J?exF_}C{ - NRSkS:EBOg-y-%8>E2zÇ-tWsB59ؑ~/vdm0_c!nQ*_E6-7"f-o'odW< 1x  ~U&P|/rH'|gawd[t\V\i;Nj^CFv!|YЃ?F\hIr A#IoI~:_3|oZgK .t*+)kwJ~ "7ҩ 8F>}vBsx`~]7KO؇O#lj*})3[|{URVp{}M/iB#3ڲļ8-b YSKܗ:=?ep=QS?3vq!=T=3^akvz}$0EL?a+Fr_r>]7?MsV*3׫:ϒ':~ I,֨ ?z[F9)ZK=/l]JzϞt OjrfEVe4nTq|6%rr 2~PY;>u K%īzt-&/<|a?)?zP;/iZJy" |3z>ѣ,'U`Enm>m(~̹y( ޡTi>]=l_]L+)c I\]Bf8>}3oꐣFo?t_=sf#Jp/Rn# _m듽S~"\i rW^%p?@3zvgQJOexv?i_%KgWn?zR9܇x^ǿ eˉV~@COzЏԡ ?̨T;{<_4wf7z?;_#$!R'J2/I0%ť6~v_#S$粩z-O#^|5S˻GO< sj]u! 7[GޡR5h0'O-$ى?{|S,f^wAXorGOrlru%V3SטmUc ?O5§Xd Bҍ? 4]l㧐ђ?w+b?z_t¯X/Qs"t=>lk572~E借r&7U%>_h=q/ ɒN4}Ec߮ o_O9FqLh9lCE~\Q+K2V$2>(Xӆf{ l$9,©` oQu#Qo%E8>Y uڴLIH79'se$Ӵ_N[9ų?_I?](}wz^zE7|$,p+xW}Vm_S¿Z/O*_c;x>"8یUˇTNcRǼfL&Ɂ|Dߜ4dY*zZ=[<*6}Lا.'xj,Z{ТO0!z1GιK; % <sӡ'tj2 2 K%|?ϔ3%X 8ys6xzl9ep;u#?ߘT?_g8>?VKJ =\ //cd'|(y⇿.zطc~4llIu`f xU ~[pd|'_ >ϡ vvMn6=<^V9]9΍xz~-f6M(|W36W,~K_ jq'7:H&E _I z{5t ӏġߠ~\RTc)*6D }ZB _oCOPj.x Q:x<~:|~u~h\Z9U}3v{5DZe#[mzFfً#i:, =c iQ-&ʫOf|o 9V&W7z~io,]_\5X\;|:?x?\z{_%f$'' ~^c?# fe&'|]mBwYucĘOw'ZZ?>R< j2:R9|zҲ{T RxXMhYpc&22?57\_J;gowO\? $|EOzɅ_7J)&JR"J0r^`Ֆ݉Z؅{e/gXf(EO]~x^4%^l/I_]Zx&tKI' /ѫƭcCZ?yhQ|XjF?}k[|` C~/tiӟ6i4)5)˅jFt,B^Ô lu'{zٿ K;XKGLr˳> _yKخOg% l-~ޚ>Zg <[&9Vb“Mx$tho^$WD'ۥ1B2_aq+J k׎F! ={uu6T룳Y!Qo,s6˥gD[$J/6|E_K8J/aOZ>e|EN͡_G._UG7Oj켓Cl3 ~?цoML !L5GյW-=~|_cRg;{ EmRBO7{)@/9n,S\MI ~]P_ %=ӫw'>kK 5IՊѵKt=knܓ4:%C#Ϥ[+;7W+e=KB#?pn%OWӉ]je9J$Rɓﵺ6|2=ǒ ~HM(+R'D\V[|n/oBC=Wi_/$lg㗘Xp%{ 3YX\èJퟞ,Æoa^aI>t6s~'=mqƔǣugVB|uzD~]o{){ ph?P+ynˉ_]7<6%ePo ޵Qs:'Mt B}륞{UA'k7)_ߝ/Ҝ]m*KV{7pXZ?IXQ)5\g7e3q;^ _SgoC-QfkR=SPW' -|ϐ4JP-(Y=x{NOAaiM&™ #9~q3Ţ6Y0Ĩ^b\sUoF<:-4skP$ ygĆzxGQ?N/0H/~iEпݖ#;_=Uჟ? ? oujM|Olg~/#I/_ aW؛ 8:MRNΒ (ɉ_lџWgG>A {ja럯_?^E#I_(0bxME˽ZYϫNvỎ&*NSż_ ;-xJO>rѻ٦tən0rh=hS|hPB}[>wA|xp-'z }`DAw[#X/}3_#q~ľisn']ɧܗ6=+X]W zKރ#kgϝ«zE;=I<-.|=~gr~v4vD?3?e!&ܧ,䠛ϯw=o& QÞ:3;proKM;/¿fbdÆ rwlr7yU=B:~ ]oOV:ز() k^Ӿ+ m37[_]K3,]>3} :|?)j'M_]ѹf!g=7xU܉(NroOuUF?~iW+sS ےXʓ&w?^?=R*z(GSj[eϖ|O=2z:Z3oÆ_5 G m4ږ/o(|E%2ϼr<]#z`_,ibjVtV,O/*7j)YC4TX0,Zq\k4S֑Y>ȣ )kzK=_3neJOc= ~$a5Bdm)tTstk ۜec10g974'T`9oA#>~ A ?{aHb~IboT>1).9O8ьxpBKSX]z_dKy_KR_x??'{~g' +\Fi ^g_V9't矞?p}Fo׌4 _~(1z~/nh?ej'ℍjjif#/l(z Us9aiodr 7t3M/m7F56|qmQ`c{3a#|a~nfT D @1)\= |>xrhpVC{ gW,] r+oη$` ^_vɚ~UgD¹7DnW1]װH)%}n2CQqmE5ƘC<ܳfw2=d=r )U1Q=! Oг8/2.I۰þz^}raaKՐot6V֐.5{zBi&'*ṅ>uhb/R3u Y#NZi_x 4~a"^q>,l_Bÿݕr2~K)XmwE,!F]FߢMkɌ||TY¬>i<tnIc~srpː:ww2ÚSI_3~O 4GDyT\L~qrH_o{%xߨv>Tm||>?r?Bē@ϛ-U?+tJP`Z"M`g'1i۟sK ^Dc돡gv=2?0KKr7gBԮo\GEz_F@e:=bwD C:~w؄Zi M|Arŭ=ݜ^);kPY/*Y\ؙ4fT4A|[]Os1xvO#ۇQr'< ka/^kIҍ-/xb##qI[R>Џ ܡ?6L'|ִDkt wB.wI6ؒOΊFZ4@PJ塖zFjE5i=)Krt79l^j+p }5SS32d>e97oZ_/7`:_)?]/Bk8$FP6ު_A~73-~wѐz'耟} zy;2+O¤ߝ|}v~ܱ\{.^iU(:;xb˅?=<&F{}*' ,=5g߼U^} RF> ~z_[)W"~q*(gDO+-'=y8>Џ;DC. RO.>de= ~{fU-+W'>i]Ci?*z&'Bm =E) ۭr˪GhS!)S3sh $?ϗ])R܆q<^ndaoQwmǯuWL_ڼK3I7~׷k=w'n1StUV;ᷨz«~tt)<7k ؙ x+|8p P?J?[&&ZeȘX`?S:KQ׉4=᳓[ H}6$V&e-pd{~/#ԟWpNj%˧_0mCh<zٟ';/@1xQ-xH.>4^/t%m ̾_??੪,CAq՟WD;Mg)z9[<ѯZ/BĤaZ/׻ 5gzȧQ>~hn-s~ Rl,lSCc䝊w#x;EQ×)ma8a'ŸBgbDuL6~Լ´Ň\&_4M]>/=>}~*k|R͓&6JV!W4gZ!OwwfQ-~[0_=2S!YCGǎ =9$I}s~''Uoi9O= w qGD#eJZ5ⵞwo>_}DJb-a/ȓ >]_J"=_vҸuzmUWK ~FdoΫZ߆N ~FI;.CA i&Bο:5PnF̤FT|96H JS/K?\.Q[Y= eK_\uZzCzgEonVQ?_>u _\+請~C~(>S}ᯢ"Ïә*וrfy-tĝ< l^eEֳQn+.i6~ק$x2F[ 퓶yK{?/V2~ty1&//Aqm- b:oQc㯭%\ zXA;miVC6,г6)=w\<fZd@+v[AmrfR \BS_}0Sx̤u.A/B6l' _n~}ȓiR0 ?oÞemʖ[} kCfjEc_.tQS/~ň_3_SHVtU\IP_>R ![/-6xy_J}eا ]axN~'h?햘Tqi>oZ(-ͪ#E.t'z.g/>`&}Oi>iӔHu rA+\R͂Ɗ߄7\k hl+ O?R)\6y.Tx ?Ӝ=3]S'PONj^6uyzv1o1ԒI_>%tLP?l*>Hn il5H0 ҆/C re#@a z'8^DҢsrgWLP]Fz\ ! %xyWiw5 c _ƨkT/?7Jֱנ9}':RpҶd!`)\;hu{jz7ʅ~tU U=L_/Zѯ~1os/eS9(y }m[۰hkG\/v˼Cyٿ̿'I&v9-*T#x7RO (:G4;{nRI^iCug(SI˛O^zޥٳ6\ӫ"\*zMyѯ~`wt?w:{UN.$>G37|]li]Y234jOs`fԁ*?ͻ8/prrV^-U9"O_Z|)D6ёqz^~@ h+[ _LE޹Oa$8A| CObZD>?bFWC蚺<|R`8F/<~le>}ojk`O~-d? oXlNhM]OW $K'~ ÷id:ᛏ,/:B|ONZDTi҈%m+>S n>7U3C?AJև; GI.?4-W'jwkЫs ,8&?){7|7 o~\Nr-ϊE~3DDﯗ%#_XO I,q$~*'7js^w cR߰/Zk 4'$Zk*|8厞ik3d>c+Q'3<ō_?@  kg(Ir??9K{ዯGS٦?}ip(_Ӭs|z/9\O?mYzuH_{{)2g9t*žyMB ӵ ~Y?ˡ׍utym-5Ƭ0Q/K:*>3U?Ni?`6o~ ~_Ex_Ib\ 2٩0L3Ӻ)^v='[1s\aMH͒1O[(>EOoB|2:Q$U|r RJI1*𩇿2UܖOi`rυƱGdXMU鄿i`/> a%@Ͼ67$:mowk`x^! xt䰼U~C ^γo~0>V8C=EqX eCQ_=i.ԏ9]ᷠ~C2/,C?5.:/N|K3QMx>oo8?q̷( o苼F|{CfEFgAzs"oon~'M^R;DO^'~6k xN)I>3Y$u0/RSE|}^ã YIYMʋ\BQ- |S䞳]vR^ Ta%-ݭ] O;)Z&2$i¶89c2t.Ρahh}?6 >+2O*<'xmnk~lnRf)QNnR EΠm3Uw0!CB ᖛK%VgϏgmz+W/TPV#>"10z{n$\~ݓc& ̖misE ?G> _|.`~ze|rLmő4۪3K)9e9=邯HO&M(2h_N"'w lrC^[ z"<(?^{TEȶ;>N)>lwemA5Z.擮6|[Yht§qoCsjOO|ɕzkr,/-}1Gkhg,2z9)]&S[2 }DD+k>9\UOZՃ_bS8\[ǿW_1@/|:7 n 3zNBZA?%fiS?|ɲ D1\lFfAnx(;i =?2}GNs~ysx[~# H)Z-==iC4* 1߆ ٜ0 _ɉ](gŐD6m%' '_x9F=y%Co\2`+~ iu:ǃG᥇(9=Ņ,c˕xE bo.Zg>j:{ojEډ|sTM'|j?YY_ ⣊ ߜ% 8~RjDINjkO~΂/8;w|lD{2oa.3 l"$4~~;&fx*|y;z(a'YE$WÐ F5t'=,~(,tjw?oz*_6 }:겯22\?<Ȁ/;!sz)jruNߟ|R~:v@/m&-&9 }f lt^ӢkLG]r;'?{UРCweȴRU|Q:pnbOHڏ?רԆ*;l9r ]v:oVp\?sڝfӐԟa)Z'~݊!^ROQϝ%aܳd7˶f*bZm_1UPنȓa]Ҋ:E- d–;kf+rç//4r\;Ҝ,|Á"Ɯ7ߚ.řmsPdTnOrdFlݙ3E|?s_ldy!7ZpdTVx_ |_Nh_ޜEXTa)͟54ĭzdqH%;K9Pľ3OUqr|D+Gͻ iϊHְh!bY£N+A`ľJf[Dɝ a1{{aQc?\JhoC_{EobfÐ~J2υXZDK_'{=[&| IQ=+FfxEr{u^jN\n+v}6+ n z}sHoJľԺUn/'% _B)bgL+Wz2~ӵ\9f2jEUdjþb<=&7'6UO9>r?"=mhr' O&Wopmu^>Iw6x;?xg8yk7|n!=.^/ t=ίmv=v_.r>O#R>DU\eFކOpXovx rosW]$;t*}rz  }S^xh5o[񗵋OT! ]?OAO}ūF~7<)H/2|˓c8kde^/`!?vRܨ׎omb[א~эnv AG>P^ 8ڞ)ԋu?&!l|7?R]>ߟi[H`Y7Gvb9/CjWd3[cƏ}q[-l704x n[~۱"/_cCR҄>)m$Wlc>~Kd|cҠK36C^r†,X-d艏D|Ϗ{N|?{? T x^lovcKi };i Ɯ*vB ~{7M+~P‘ѹoz9'xXYn ~/}"Sٿ?\37;᧟=zLJcF[X^omlġe񯴳S7;eΐ _]9+~_fNڅ~vEae?N- /; 5=ПHb7wYp )Haz .F7?>elICP+:K~ڑWr+)#:EI;/yzћ=rN5Sp˱?/iw.2)D*:'u)~o91 _Jӆ!#/O`t&xe*߆[FT%L,O :J;۲s:뉾\4pj%xX/'=zZOW2|Ż6|{.3c,YmkSCμu}CXsNO0ůwW? g^wR"v^O FJvm5ϴDѭE˝q /C|g)]n/Gɵh7|\(Fɵѫ7 0L~T7ϧи]*^d-_??U[S'u??jmńuۚOsތz艟a>#zoS7xem0 cud6/[ƶ_9x6\l?{X†/kһgç~ϟK4O^-lj 2ӇǬ$7~|xָ9W^>KF>ۘI^o7.Vz"|v~j[A<}ˀ%hm`X:zZy)NG >*_jT:秹Vր_ݒ ret771#ųsLtzC+ ^ ?1g?DoZQǟ$@ ߳)jdN^9)'k> ЁNOyޣOJWŀyg?w)[ISM삗җT1EFsBoVZH!>^tb''~sP.O"'7'8  F6dfWx_Upvǯ-u1by_B9;K >MoF{‡]v4;ϒ?^W,~LQ{*axB>֮SN}H'So[1֋w+ZG|4Ĵ{S3 1&Goז-g˶>I n2|&'~qw7z<͕/͇uC>I#j$/j8E~rBz钤ye~Kvgo:7#ۋh* i?C<)S$чyJgS"~lltYu2>i}~q!e, lչe+.bo->_o3~^'AЮm^9rg8M')O5YZ' mL'݇_Cyp|K:6/[,> ߼OV!s8_qVByoQ[S]kQK6|K0RtR]2|z=ex>Y| ,&'CD̠k)˿nK6 M៣ic\O%(n=kC?~rkR^ZWNwg/Z9j7X_O2J6L-:D';4=0tBsygz:$_}S|WzZ¿<7)zft5RO{\qR߫g j9ŎM2]L39bO-~##w3vuKDId=, ZuX_2D~]&OoP_릚=٩F#+zV.|i⧱88=>KQ;Z赬 ͔l'%$.נ"B׷+ 5|)zԞxm1'✣W8Y47~F[=}NW|HNۼͯOi!g 4T28~[ˡNZy/qd}7E;f@k6#RgG|rZZ9oh'5(Oe/5߆jk>sH0v֪g:Z.YW?ϖ\ɋ~ڰyי_}aHIcq.Ym[m{6x 7Y]rZ_/|磪_dw»DmLN\ tä2- _B{{sj_.ѧpI zlV>} ^GOs~|oMGm:2|ĥK&o"+er=@^ ]|yu''zj#ePf{FI|#¯| ?w}:yޠ7K=|7 XIV\#^',fGASIG~'?QDCQsm yZ?Ed$睒&9Oe=èA+b[:`oTf4sX-u;S"czg$JC'-tOy?Ƽ~g̫Oͼ/;p,l%XZ%^nٰ|_8£S>1=Q?O%|)We -/K)%7~y*yP zaW*YYm+!$ 6|r!cʍ\8L&>5_S'>~&mܳ.~rQM?Zk2_K?j0z_]>W^O,/H%p $MjdrH}f~ܮAtK 87 o3vφ_CUxZ]X)ǏՌ4IkN/>YPsO_6I;K <~-t4)X33:MK;zu^ρ8:ѡ __q%2-)g|AWCl9:?c?t?0HC?../=_kO2O_j]oů~_Aw+zqꉾb?1ʏПb.6|+xB?ݹU$̌n$xE:Cuzm\%Zpq6+|,#ԔԮϷ;se5WY2 )Dгoǎ}IiX#2<7焂|;t\:l~hܚЩ>~׺oY +ؑvbiI-<5x$|ʝ6'|59yobl::?]-l"tS MLa"c^6DnyS2f` J$mX$|p2+h7|YByTfoC]?\t/q}/p}he#)"o1b2[7Ho\j4vyPRu7|^C ~2=KyV:؜C?z{?~y3tŴ-8Ós7nA~@ņO.z2Ls6=.FOE O8 :c$ |-deI6A} =CC>}R{CZ~^n"XT` 3+|V*7xy*"|sOn_#/ o/I.伤h%6'x?^i'V]\oBGƿ24v.1[5|gH7-[Rr?S]V |5=ϑU*%0g'-rɃ %)qX@ *ïpF_V3M7Jk:ʥ͆CGo;?b;~w~ēk~?ip3jppOZ'|yu Q4~'d[ ~Լ~%_\{Ë}HZП觯|ZBHY6O?'OOk y(Yr=᯽[x{{ZޒfV(~u82Ҏ%G!_\WY$MOk=᫶nsmg;;9'dImًOMbտ/g^+?^>Co}SΆ:働ʉ\$>=9 ;T&^4Z]E7zdpᥓZD_cJF;zZSrcjSO ە?@uv||φ:J=49uے/e*ˁCWv'3dWY*2B V ?GP~HO"8st* JB.x_KirG?g9] TsyS/2RLd%=U$p6~} 1%5&hC5ߑ; hlsTNqۓӛO^O?c9~LJTǯOM*$|ǧ'= _8tj+ <ÿrϞ _#qP C!EK9-7 Ӏԥ6edtuꍟRDk=*"*zj9͡fx%c:V$2G}VOV|)?D.~%oOV?Hbe1_ޡ.}}[-PlmX5g<wtlz9|>$j۽p{Q^b 맖|7g?z87=_>rosυ-=M4<}7.=$1H<7Gr!'CS)yk^S7|_Cj_~kzG-T:pi.v _5]ct\7 Rhy.~ur\+Qbs:H,j}}Fz!YCjW7\T?_+idshR&bõ7 WYny_vK5 {vVkTsIz~v9:)sݑ37UXk9f' 2{VC i}O=DtWjK\C?Z '|㏅b >|خvpYK-_)?X_IE/!g"w=iUާ͉S~ۉo S ި_nxJ^I'Rx %:C>cIa/o_L g[gnܿ=5W@۪˼\~ko&zϏLi|oXi,muG|bȸ[f!~2;{%fI-_11X`n2D-|ͅd|R.fu!뮆"Nk#ұ8qo& ݧ0vLىǭ=|(r'š ^B?|?^r* D@qr!?U/}4fӫtmY~෹_jV9>u,:WtXމgS }-7Hdi /B!T"׬Z~A{7X[ETᇽ"b_gkw?-4f|KGb5mdW,dx!%z]>Sq gcKjа] 3zٛoCgtH%`'./9٣gW_F"uWgOl4nc?+ Z*ReJ>薷(!kث')XK\RR~.#SԮ|P̓&ϱZ i%G/4OZW!H?ǵV]AsO>q?\N}?Ϟwr㧮"Ug0TeUJ?޼?j_纔@ts~մ0O?ϭdWYOO}3 0/$ +uWncRjiK@zY4P9 rπƯ'~垼4jI7~sv3J5;~;qVZ8)EoS{t=.TgqX Іd[7ͮ 7ӂφ!wFz){| ݳ?JX́Ϛ)]_\kfz!T,!OLud<:jhaX/;m>gmlaçNzr&:l2B٬}Oʱ?ې}}_(ZI. ~;:ӟ*iT8|\lfyY2?2:n-Gt៣~=RYi$8#iM2O#pzKO9vHΦv_{fo=EK+xZXУIS'Waw' _/¿կ_P7UV"4|+xxxN9\K,z )ϳ[%ݵt'cLoJ=6 -v_¯-u;3̃;e'dSV' y3bC꛼_=nԡY_=W|/w+~s;ዳ36|O?jە5N_~5/Kv~M|P|×Wp*ރ8\fiYU>mOrA?}"wէM-鄯ަ}7{%/SɮIѫ}/Y%x6#rdZN6W x/f|INI3 +VjzBv]cNJm@}TޤYf*8~ijz&ye/9?m+@|TME(~ &_>Qdo)%Y$cBZ_@l?dv+nͦőACE|c;,aX'>?Ew˂2Wn!L^}J~ uDZ[.?,Xk?h $ٷ9ۚH8}xI4x|_h$1 Et :[Cw53p 5:Ȗ_L l7V>, %02,5J.TZF)[@_+9_~ٳ iA)><,x+nV>MRJc9Gu -tLz)~\=O@~p`>ęESt tlT>;zV`ZnN`o$yTܮwieG_Tx\O3Nqlc >.}LS4,{:ˢu ?64RZK7x}y"_%>n͑_?^vR; l) y!cC'v[LU- yIιRU].e,q٩2LY?;h/=ϡsEe<_/oOO4z*Jϯw6w)ۓ[M/OD75xxgoTtxbk|?9o]%t.8&7'`u| ϚRG96{x~s}vhWVyV8\?v]`5ueǝѠX=ϡ( zzMCZ{÷KCrxOO_,6n^?WwIsBoS49N0~k/י/t6٫%7K*I‹MwkD56tlWK3|rT ?p'49~?ی2׻~/f3~O.S9Vy1"6b3|&?^7ElQ.)l=CMmdDTtQس wK >\ZN(8g6οVuQPme~="ͳC|jFS+|)E-ǂzSe3(}X@Iۆl־LSݝnaz} pIc_G=YA"ڼ)J,Wib~O<,^ys[Dr050AwQ%}0i;CrcB)q wǂUNRc\ 𰢣q~yQOioTпb$fjz< )dtNxPi@Avp^~,Xl$HaBKu4: Àr5Ӛm8cyuL z͢Fm69H(;Gآ;; X(DQ1` 5|6֯ИNk|di}G ~H˗ k4\k0AK( ω=BXfk&ˍ̇mDeЧŔK;R|3hel1Vvs]8|B[N,Je@q)Qg2Dlz !h ~Y93箽ӄWׯeQc촒<˾=%i S`脩]1a,H׏}|ͅdg T\c^4E]H8iQjNubZǂ_G`E&Y[)_GTu&)-Qѯ_aǀ_ş_ZD#C܏LZ}"H ?&:]O! +_g<Ю *ї#ItSwCak.A\ ;߈,RQ)x-l5a5 M ,H+o@?,h/_CAqM1 O',![݋bDŽ/ߛ_vo+3ɗ "ejB/"NX~,P xl b*" Z»ߏyNVpjg tR6n6R~B-ͬÂ# )*l dyӂrtrxlkӂdnƊ}q+pwLDQkJ# _տZj?&X2?ӄ/؄F$!cˏ_E%UbǂQ@j"F/?&P [{2xMEQoԠ4~3&tKɚx zI_B/4'kR6s!|9Ä}UÏ{5 S DŽKU ";h3_K0k>ȞL'EC̈́f1RWgMxLΖd>mϟzu]⭎,>Ui^ye/ZC3c?ە}GmﮒoMP,Z >u79OEo_Ϩ Z}o=Mx=IDY/b3f*AgуZ&þxqzIlħT}mEt͉+t>#m\c~wqq~Fme3.=U'~jx-zm-zSMSE 4 @F;M;OUCI+ ބ=i?T`\t7bÀ5"﹗f V,s>%M?ʄa'n~% 9*CV#,O>{PyJn~g*r{0}( }|]wvꈙX!dBn'qWEÁfS,ѭ1_7_>c)o lmQ-` }8(L\ƈ?f9o#c jƟ}H~4֢Uچ0t)$!h[j1&i]}pIodk/>PBs_ݝd8 O^fC#_u-7ZoD93N~U:N  ~Kcxj m|W8 u6c卿Gx@_i5~sg|zte?`5&JK BҢL.n? s ^ md/ݿfl[k_B\T=յ,|UAC|!ҡc?ٓ6@"b?vOnmo )邯mEw ߭-=o"/ ~4toǯ2S_Ec_,:oq4<}]Ӯ'?@+'cQPqsn Eχ,iMO m@q D?n\ݬH?}v ldޏw]3GP:οzD~/ 7󡿠:ň~/1r,wˠzn!_rݱ)_-/ɒïÓc(dHz˙ dKp6f%n!p:S}nhmo-D.Qo=pfr}݇_oݦ*l>-ԏ-77KqM ^8}y\Ӗ8} [Oïsz>K| s3B%o hejoSzzb~zؽ';yYd26@j\2b/O*z"zsXPчH@)blJq{)Juς[}qqCw fS=t>Y:G~$Sr]w%ElF?QtIRxI~K*1Pa~r_H|+?q>|_^4b/F3x~9OMo΂G6W~^&&#YbOZ {'A6yl3sK߼QG4YүS?^lx} N|-PXOO"W_9 \AilF|Z&z+JzBL6xsϵW G%L$RFd7Se9w)4 riEzrԩ?oN3AO89I|U- ?Q$=/ \?oOq|agj@EV/"OWu?Fysp5&|[8(#/K4~J +s#!|_6A`~N/>HWFoKC./!w~$< 1zU m-rQ?@]ܤVO5 ᳏$=ehRtѣ+ %-wM ^R|hdk.0dx%@@~Pq=Tx%c~,/>Jc%ֱ%v}Mؚ"b :?ƿ2<'6|KΓX=2 Mtʷ⭊`}ϜMF_ ܴ(:8_g]lHu/&D~Kn9UR8Q-gءިυ%a;;^=:{; ՐKigv=zPh8ԙhL")ksd4"ϱ=^>Ⳝs7i|R~f sL$>H~PlUr\<~ T)z`c)Sg咞ΧWGlj2*ߩ󡜞*qnVۂ%ܻE_!/Y/xñ[`Yes{w( 45OAi˄+s^~ڰn)}3)nMWz V6{y4 Mk(C-7F\enDMzQӓun݊!|%GJ&x⎐Ҏ/jĩO+ m>BG(zB+1~L龇H٬S&)\~q~9,ZT~ EJos)WP~.+$N)c~~ᵓ!Uw$7")+.񵥘ÄU.'aFh6L7؇J%Z>,(!RO<-k!IZp\?>D.mC=>٦si)«;e\s?&<*U#I5`N4,{fiu.!j] ȏ#5-LO ;DŶʇ ^w4>rK&dߧbMWi➨iAe:&ѩSuȱyDsi·_VlKWB,U2*#dofۂH_NC9 \']_E fLH~ppw(u?ÄՋUS}[ՄY bm>Ӓ7x5.2`IWŗ&NӀd,/ެ聑GY,U|~E'i䴱3 6Ei/0o#0zշ@ V 0`>-X"leToWH}|씺_i5_PX\\:1͂B],ޣWiO, `=q2p냣WWj}KKX=OZlB Wzǥ[m˜pBgC#msU'Q6{t ?E/ KcCK[Lr~Re/aL0 4DL+6aAm*HI7 vMZy H3> σ1a>l'pG.](aAnb6~~ a]"S1o׏Pc)o]CO SD%}  F5=ٍL<$&DNHU.Bg7:" jJ!VfKrTtJqPL?P [t Sz-ǂ5B$@F&XJn{4tc(?^zp$9s5"Fo0E{Pi._M=@o,O `K16qo9ӎ,MhQ6˂)Oi,a*I;,9D4C-7q\lQ`H: Gkǂi'0/߻:|mMl h&>DZ{bcb̅W̏ eD&F9uِvliylMtRKÔm@ 1ه @Tꉦ5Ю'Bz<ԋ?d2 zU/[|%!`j=5 Sԏ-TgJU|7Zǧ kw'kՅPAwy߬7P7fQaRvThXn 5-ϡ)_9SxVWy"hrٌChٵ! rDwoYF?|=,!B17NGˏ _&y!Ƿ~AE_Li{z 6Zfv,)%*[kw$82QVykё@\.5LO5!c o2x&_MMyA/l ;U[uV+7A٤|Y F1 >1~|}կ! _xo4A%J7jEh)et &Ş G~A[|~% x& EZX0|\Ȉ=` i)Y1"2=ա_ߠyl $E-OR ,jU zw2[@$ݫXM`jRftў\UFqlx7Zd, ')pK ԏ v)*|l(ɗnL-/xՈO X)rOrLĮ[t,uZ .s ߥ~\nK0%9>-N| aw[vUWcurܞɳJЯ"#)|>63Sw!xƵq;}Gw q-^^&._B2:Iəͫ=s`OPV7!8N /uM`}*"Vr>b ^6I`2;'qAǯtݳ4@Jqu?fy?>Hl-a'^:Ɵ'kz/W񾼦EQ5?z {rko1v;~Qnk3r>N_2z3a{ý'~_ )iXll?y5^ >\'V=t'/<~-ʷ6oнe3<J󻕃^sHO ?c:P^5YsWtb{&Okih4y,{_P(h߰NqS5 ^p64/xk?]~/YÏszPXH S%#W6&DB{x߮NTqMOΑ?Dl ÷H"x{?;3bP.cxY9)$rĨϳ/1rsytqzٔdN~ :\_5jዔᢍߢ.L\Nj&ך/$J7| !4fs.Px={CcJg'm۝s$%ҬѬY/~w_7i%sa:Ws-jXlCKO.َ=D1RSQ-բ#i;?EqQOR<\;ևkm_R(6/npϊ4it5MB4~CIw;ltO>E;(aݽuSFtU07j.a(1竕-<~;_/nSFWNE|2??^ųV hTX&O׼{>Ɂ8kHy\ϡ` >?%'?F-a(F`_~9X)s-5𫿺o}rygdtn]s&y8yUn5|ƿlqEiOG56C:=]c6s:Oy^eBhWFZ#ĭ}T݋u,c |sDi=wfm+دybk7X?\оw#~aXvO+yd2OSa_|', K̐y)~U7crJV$b3cm %:9<OߖnނOtcX%D4U~;1 _ |wBg'iw*^b~_0_<ꡱc E7$֟cҭt,yc8)'B[z}|m@uWGJORDĹD%{o9H1yȦ%$_KL):~9NmKc~>/ٿѪn`xEÁr<׫iz%7|u+<]Y~×`,荊MШ>?tO/~EK1[d5Ưd~Of:?5xvKՈ}cl\e.>[z;V[\$|zE\ѵd« P;OOGMyTP:)G=gu5?X8!@24'(}{mke/%Hؐo|z|xP fWb_X1٣ Ǵ,kyYZļ?w1|b`0Ϭ%9=@(ך;Ɵ]7~ao}>=?dd7kGv'|اO=4v=   CW}< g-f8h'}OPГ~_y^Pc"?^"!]8vQYwճTxu'|e"wS|,{C._5K?ޟ]Bfh0ۢ[ᯍN$c>MC|D-N?E,L{iDo8BzHZGg¿ksxU ?;E?]j"!C6OF|h|gطO |X!?¯^pw) ^:Ҫ?)Jlx @%'|u- ]A|^[mN&PEw7?<~/Wx%^p]{E DG]~":;K.?3̥yT_WEkdu-h{9|ib:p>+ 1p9[--XR"K=. i[~uCgxj,d9=Kг7~weysyca:G~|lz2ԎwmIk9զn6>G\G|:{ }"]="EO[Pi5B`mטL!'܈Y +_O[um̂y*syeqXt]qV)I-_ʮb>v.+g:&W`pEHw>^98oL%LSn˳?a ϑ$&z/zP>M!'REjlaܼKVUux8:ㇴ66)=:-_ib/c?|hr l=%|Jg . U*.z_2zX9V-OPk{0Vy]TfN6kVyVl ~Th͚ lԀ}W<)z7: 1VW _-5 Fw~tOtBO%ޮ ?_m K_cU׆9{7{'5W { =N3xN{0=q|"}L!{ )J>ۀ[~~=UA6j:")c7sïriLz +{Q?.0KtoαS6=X1 nԯ xv'IggOr#7| Fb|N9߆=T$ u OQ8R-Ëg>/u14(o1eg/^kt YZ9~5u_!s@NJP| u-]3uInabƧ񓀟^XԂ/kv 4ނ^/r8OkïQlDqOFa4}"&5k"m_ b_d)o3?qo 7%C!T'~N7~m}: f胜 6a\m ߮2L*O2Kk7ܦȼ*|rKm@!rzIC(0fTߕِ×LJϤ*>QY/wF$W o/;VYWln$(%B27o^?9>\ =g=t٠`{Ϛ x\>NGO,ϏW~֛J{ϡI\XRl+ ?F借?IZb >FrF4xzl\G1@͈%t)MjV) ஌ /55v*' F|LnLf| {51|wS53B3?gÇm=irWRW=Soq׫*\ %ɫ6hQimֳ"3.?Q6۵s0Z},"OC8~:y?_Ҋ^\$^1sÕ~Wp᯾_OF \eNOEЏ8 e5x~o/`6@|F}HCa/WZOI^BC85x kQ/J.On+[oާ+7g\\4ȅS3NG` rbWG}WЛ=Y;x-0l_dQ41ťh/[v--abHcFxP|:3p|,;G^ҢQ͉rTO_/o1 |XKddvOW">)ƧzL8dyYyr5W!7pK=  yrp61V12|kQzk4>ƿ2Zmz|z/zrH QuW߼'d%TZ2i2_O;$5=:օ~T|B |m,Z x?[=d=pim f.ƿkN_+"+ 6~OYZE\ v.,RȈm/3njH=6zag÷4Ii䕇;uϞ9~rG zw]~KѺ;v~kq|-v.;w ~ Ռ~v9}=L>w9HWT$x|96|􆿘ZeײO~ ˕)A7ߓ/iM=]DTe6GD鍿:5Ҝ7oWƈ77)Hc9m9=\ufNo5Vh_a>?4vTn+s5T[7YyW@(CQp.{l>^_Z=EA-~ߤWsL&Q"|>GY/>~s>M)򁂿~vzOAnv]CEV|'?wrg5Xǫ~Tˇ4>s2?V-3#^Gw}'rY `b4|vL+^E*"l _U~Go ~=).V{/+df9NͥPƾ9kL69L>]_Nz:5_#HmS?MCd(a_>?9YIUfeWSI"jVה}c]Ucѧ̧>L]79Wȇ&G/ʮӲ_?jAX5EtՊknOTKv.o换P_=q9J &iN1bh5y$*39ǿS ?#D U)^J~i?=)ݿz;'ft"x:8 ߼UڃAn>9'KD޷j72{Y2:JA:n AԒ .WoTx Lۿ 0}OЃ%>"fWϔ2Iy~S/|,y5xJJC: ᆸe^eTG z?R;Z*/6V_U!' >I$SbNv 0`ϼ_`H ZOHm/G_R ΀0]_/^['\Y=?{6^`}q%C^ӭv?a/Hdz",}56[~O ,E^;ӥFl/W;1X H|SO||9l5p?)I~wfoQ/ :~jv񘳿 C4'y0LxbK+zTX qX[g/Up]-F31r5tRItWW䫎W [ pf? ?83i/|o1O?T+!=r*sI%3L?lP[7g?}K n6b2r:4wm /cX}j}¨-+zC|gBb4s`ŎO1ZL'C0=ls*zK;[~ng *jO1xxК VV,䍖 i U𗶔]Dz\O ZV#ՋVcc9mWu#n+ 'f\sIdor=-~|L},W}mYͫ>kJ7ԣ67 ~I/y%G2W1Tzm)~[O~/ %xbmG/^QRj 4O"ç{ÿzy%ϱ~죜}$u^rz0}!z>('x1.z,:ްo\WZ൸H7~:\7|{(G 1 j_/f_|*.I;Ͱl!4O35%xcҞn*k>' ` `0xj$oޞ Ӄ0/B&^݊gOW ?̟V)o4@{UC]QRxa'`XR-oSPF_p`zï@:aE*gT(_$R):E;筞"4g4J +;V콹b ~Z5*dFP%6:'O$y~cd_/sEgZCzfx$ᯩ̖'5{>2Տ;R/?^0lQjR¯lTy3/Z2"kï3o kŶ,fXJeU᯽-/$^X*<ɓ|ǀ\2;NL_9z|ŧ ̪g}Yyb/W<-oz?^@7OeWN4z(?@0OŹհj(S_|AUW殾|`06]߂i/99yaѲhbK\UgK`t PmWOMsg6}ڨYaoՇ*@{ZK93gx=r ?SMyrDMн47|ICyS&e%-_*fr c3Eܿ&rP8,cb:Wyp\9sw Y]VLg)V7~颱/YlЬOQYDywDF njO |_}$1*7z2` $T(zD%I Մ?>dQKc ~0Y"2 3.3x^TN#o'O1Ogܢ"\| \ͮV*C~:ЬV Vrta"7~uH[ZÍ?gCtˆ[ |_fWn(PV|wf&O&o DߜY`oT2"ڃ=Q-'JKWmߜ?^xr(5%_DQ7;j-^X'.Azϳc{'s-?&#S 7 z>9 >sEcܝecSoС@|(lJ*nV[Bs`>GCw`o*~[]o:;-J^E/O7|G>:J5ZƮ =B2{9SB;[G>:`*z rBhTxORj:3?I| ؓܽ^eIK7~x.: xn\=KzU7PǢIq.z۲L'3 j~wcOu/KkHZ p bR2%8Azį-ɦ{bw#yggWEGD4ol_>B#%',Y2NnKܐ}fDF܃qwGڃt23#h9[l5A~o\]2*paGOh\쑃&Ƨv~iW>NbKl,lin,fj+OOO_/c5@}(ιHU+FO31nOee4w$?@+\}._=BE֦oͷL[~(?>:e({}v=WO9poxz~H{7~KF9O !|qK:HAxy6ޟ/ܷ%x4W@d=^&GJOQ s'󁿺]E >sToq51 ?גK̵dSl7|5+Vr>ln\B\SAihc_7/>Xѝ%_/ט+s7\$]yndE?~ k *ZNZi"m ,ªzU yJF I?NMPjx 2m5/{fUf`8f+[a7=i*OUx+|=,TV.>G:a~˴Aەfi9T~;|͜w"-3>6Ö޷C]B#`IDQn{ ?љ٤z|DA! 6€1Yb}/A1A/7x Dj58/vRFOSuhOuQTm홙yK_Ԙ;P<7z.Po+"-_9zK dؙ?BS :o`H8!C4߮ϟgrYpݺR~_[8%tm{=7;JoԞ6ì_~>.&kqS|4x!'9rOW2ȡ{ 5&f)Qjo蛖eo[ ߆f =?^=vw jƿ$IwƟ^5nJ;V__KIp1#3zˋ0-߀OT2;sh$^yJ)d7U\ 륱m9Q.<2l'){?8!d)i/~ģЏ;75/CA5dH'؟/Uʫp["wߓ싧=ozqgp.5V4ZO42/zFm* gBٵw`_=~q 'AAɞqMvK ?_;.Epi|veE{8nnsj8JO^堚,)r$'W{_ogr ^?inC9~dC!Io^ipD$g!gS_/oNR}'uu5vv.۟Tп_y—X ̱\ߜAWv㿿^Y;IOpl,/O=4F_u@vm7}qI?u~O0^gB*fB|MP?m^oK^DNqd^_1"Yv0|*?j{/^)MNUCRig=)*xVz%-Y&H}M롿kEpZ[|Iz/0g3:EEaß!Z'd1V78)2G5:]ɲ- 41J>n{ LuRv<6|tϱe\NCkohśOmWO,ٿ_zR* /^Y^3K-_?@C gM??>.x+ca~o^Ŵ}7OǸrjq9vD/b7_a_?)?vgtaÿ2s :;׼KHn_:MW-W_oἇ~'kζx@}/9=nrz.rBOM-_5N(Z~iKOaUU|z3g܁4_oJnaE/`Z{&zOvF~ZwM^i>YF޽ _(ŕ/Oyц|3vX)\U{^4T53h:A_-%ivsz_Hc^)80Xƾ}_BFcѳ2&Yѕx7Wo/Q3 坥ߝygly*>e E_uXB86""럃$}E~ 52&ǿ _]畂E_y·aV1[s)?3N=oԭ4IΓ/l }-7څ_J~bm;S~}幕g~@*vp~2zH>7| TІߝ-Eؗ'i~LUg~Ü3<L|C|TzEQxWק /!d.Ib4j7M(f:%žW${\߁CKϿX/~QY8GQ7ZU/O-Em{Z], :rn4OYͥ: db|[jt~-|}Ͻ{OX=3sZ)9 c2Hc\f՟0|Œ[8,?j >KOO )Cw7|漈 &酟}Aa,gf㾴$U|]rx, ts|_AI" |H'Wao&<&Q ˠ_5G0fw?QqR?v7~̯ۧ:Q/=`C랓G擞ƨw _L4H_e+?ekt̥*c+Ӷ)N4ܶخj/`vԜ7~KyQl_JzE y. 4ɦ9%i.{\sm[I}\~q]7IϔCN?:K~l36|Ƹ琴R46|{9~p?M-/6-]+ZP[i¯)}aIY^֤>sꍓ'|WW^ҮP Osk a' 9,O& 6ּk;|K <3M1x}3vx5ؽݵO z5KgnP/5Dq;o#z6-.o|_9S'>p;+`;|h7G Rª֣%~L|@SlL+yzMċ'|h?'x*组)rIyWY2snb1sH<m c-Xeon[dcX/+:&L^9zV _ukJ@$z{ ICůc'aO& >~HBZc㟕гW.cqjUFϝ%o˸M]d8?] _-S ?TL[R'7]x /_]TLVxuw=7^4U?7Bg&t%Jϱ އ`YOrۊnM^U ]e;pvIZ=@; ~bDY$2F-D?Çl/[&UFmFǯ; hG9n~Q8?G'O}_BjQwa`C*Xhcq׆Ϗq5/[iϷB&@XPb:qgB$ќS犵sl'e]mu O4EM۽eyU5xa|4*]MQfߜ4O|$?e;:I<>4 PMX&|U_/j,]sL%xӞ^4TҰZ?`U?[߶Ʒ/~wc'>%+'t&o==9&&j^ՉMC^ \hβwh.CJv8&DK;xY}tX0<Ѫ %Jԙ}W5苯&AZo>=z$}o1ØucH] ,2,'5k ?ҮIzl n7'gʨ΂1匮|>ok.YQ"ڒ lml×r}ۘoNgZn[ܝD ?5IN֙L;U!wW|XfiErFw6K\m]l;`o۵?˓oV _9# +8?M'F1o˥4eqK!k2ef2,b ){6J'|.s=m]? 2(J#Yq_attG ^?N7Zk3:|_.6Ex)QߏO:;v3EQrmf~@D2jt~qvېORA&* :RHnm]?C8*H٫38Bo¿r2x)~'ϺƬ^Hr"h = _O52[B/OmX}@ޥ¯̒O)So|BZ>߄N^xӥR--C 2%I5(8%Zzݥ7X+zHJ8OC}btW@ou^c/d_cTGƱVbʿ풜O*d%ߝ7  6y g77M HPmQexCi|3+3ϕ2}k?;ցÏ~/OaWqȬyrCs /|gPCv9y~/*539щ??vΉ lwc?vO $M:)ݙ t.9>$9}m&xUÀ^ l~3cTQO\os \Je 'C)1K,z$mU!]YNFOTBBE9tuV+L冟rg§f O.D-wgVxR^ܼ|KQ~~.1/$ϔd[^4 ~t7",‹5t/7xUi*~'5n6;Gg s|oؐ1f4X=Kr(-Aq?F2.p_i "D(M=*9邿^n6zzרf-%>cR?Վ}fճ/2z5&~X~΂_WP.s,Qw!Kʠ{äL+;/+E0L v2ݰV}J]Q2|ZRh/`i{3e:y>Ck1am\vY/aVD FIˤt/%G{:2㳃n'wT =vŸWo/Q ~ƿ!6y4ʼ{s=AO~$9 |ߡ~z0V]/ 9ͤPv-/iٴwE5_h$;W'C bvE{0n?2Y9E'^+FeC:VρàTj%/% ,s6:$~fϳ'>{Vjc [VşEg*Mgݕ`jl0ೇ]Vգ @s+;A/V' ^ͤ.Lݒͻnݹb1x+yy.w50\SO/.o :=?.C>w# U+tT \~Zis8RKnv,6G6~vKmP_wי i|?+W7|l% 1K?Ͳ9OLg,R2߆^{FOa??#Ol17h çDWJm䌟^oH7{xieGfIaDB'r}c|] IϴV>}ZzԱUدf'|<Oo.=ϋ-e^W&vp;Oqy{ՐeO'>sǿ|a{=+E7[k./?#]CnWtOޖyCյ?w'\?]i?01! &i([ЯoVO>gk3zϰ/q$l=v:mU=w<ЏL/y=T}KWd7?^'qKuR<]Q/%CƜ~3_4*ZYgAXo|uC/~d3S!R7O:K!|7jʉՠoWl|oqUxsb8ç^J:GְggۂruۭaSmbݳfVC'(r\~[oeFrD 9d?<ύNSE޽ν z=w."59Te;&zo$WH$.h+Z'\2>2S-]Z~#ٝ*Ov~L'u|ǿ[>qo. A"e'Q6g =VgNPͣ|Go/K%*/J|yJb\?@{'ۤ]9z˗|7-JNHOށ?U}s֡0>Nƿc5wKA Y j]* _T>dϝ}ݾh]i[J.Bϳ t/mV8'iW!6W{-(zHdvGW_ʯ- ͼNMOXo.O>.zg,|sRy$?/ ?tn}Ɵ!H=9푩ӥS!t.!)l/D8y(!iu?@*=)%hL[3y| U+(I}ѫo% /%ikhlZpY?`mkZL.m{ū^ex%g-杭XT]~vg 2t' DkՔŊKmK-oWRk:PR*3~Z%EF(*o9G񷇼_}v|'Zzß. @=S>|ٓj&.U7>h@Cܢp&G[9̭yߤ%E*/9ߜ&Ϗ${RU7U-]qx{wss#a{g⶝W?wؽNoBQwmc:K2:d 1oWi{͊~%N/CԌ^tb?^%+ A>w?D\mo/r%~v}~C'ئ|>g/"i>_Z xr=/O|H O]4`!oI Hԋ%.jri=bz)t5E׻9s!jb1(k)3|VvU+'zגatѱ[Ji\\(-cZ0AO(r,$}f>gg(\/(I #vw]ߜ%]Mw*Olb]8PH9#EtP SnКrH/2?jWX<]57_WLŷel'qy %|Y тoc,' #m߁G[I)D9彑9 ?ǤbßJ&cᙅs+P2_ _\LJGosʅةT|vǭteɅ g7WLϟNy?7gц>^REF)|*]B2<+͞9?$6 "~DݻM+x%>L uK)W ]c^H>Ze )בI=W=WoyUIoz/4 !A ߴz{5Yxj܄ XQ:}j~ܞ\)Ee!8:xj^BG^JFBJ[O?~z{[ZC{ E/0,2T\o3o^heo2c,K)<ǜ5 [hn^h! "O1*P/ǼS?ɔuô ~`dkcI>/?`/̟?@ER)LT"Oπ'|GyۍOt>5b|o P{E ANLFOX l{o:Ūş?'B'o ~K|e) _~Y A~n}nJ? ^G_*cKnoz?^t gt)W'i'~usXWQT{4 s7~r5;k TzcПtyJ47=R凝*T{,YKΟ  vDAZ?W<> ʛ h1> _,y RJ 5P[U5ïkϗo[òoP]v/mZ>Bzr8K9/\m}v{v`iuɳ6Lse~:$?i?vHw[՜O+vxǙ?WhI,Mmoi(͕}a7.]+Q 2~JN+o͚ _|kxj9S|]N^˜(W旘4_WPףP9ћ{~; [l7|"K¾~Ku~R]2ORFT??$gf݀f+^ES?D?ny7zL zH/E]Err[F \y= ~v4yxX`_Æos[Y 7˖ҍ?M F$+'x&OLRCU j;]K[NG4n(} /,A펜\/?nn4fYS]_z=DL'rd|~nT]م{NbDja|IYDsO<(=/o?@R~ܦ*xn/! ^ [4&+~3۬+ZP Lj?@px'Y)%x6F_nO Ɇ>,%gg4* r/0+z/h BU\7:˧9O`Bdߜ+O<&اFT$>JOI sW7 a/z)AKXZ}y_m'7J94x>oѾ?kUA;|2of'Nc+ 2x_~@8HnJZ]?i2CsӟV߸yK7_+~4:95-M1*y7 kNb{aS Ji~/T|!= K*aEzAOx/}ߓςwf?Ws9kn3FMy>9 _CPB}CNלkT*~Bð _ov/.A3.de\!S+Q95fI?v\b/do OB!؇ot_⣪:b%ZU SBvW'9zv!ه yiN^vSxpHG;xHb=w?{ʓS?I(9,*Kfo_ /G)zmM[ IJ&3Rvsjsf@?Z_?@xCg_Ng%٦ϋ)n6moS{_.d;dE[#Sp*8yinfxbI൥R_H|l%Ϗ99 ~bnZNbH^§u$͛=IN u ?ݺiG$a\rZe%ύoy BZ1u OqNK3b9 C B_˓}RΫYC m28H"u¯S;]JDuU-tXF|PB(#7? Eʦ߯pbxU*vϏn| N-dp(3|s|Yd 4|BqX> ~bb6{;5kpM9= ]zd roKM 6|)W:Naxkj87svP҉?(bNZLI7~og]>W VyLi}8|s4|Ƭ/{zAF߼2,>_hyn>k&]_'(^?{C^žݒAmPAm=$MS`n.{2IOgnb?YguÏys{SW3f֌Z<`ӕ~vk`Ӊ~KoH쫰i==I=ӣ%6ʑZגlY-,_ܹ],rTv_}RCg.ڣDžO /ꚩ]埝v \ӷnS]jV~ 43 ,~H8U?Ԧ'5N~w{E7ȜZ2zxbB=W7/[FߛTOOCn7~_ٵZ_?uޞmؘQb z3<'Q4Uis%Je|FٵWOvEjRꃺ/|~g^iUCSWְ*.+iJ72Ӈ;$r_ eʣ׌c_A]&x~:{e@|PӘV=gOe,! L9?ꖑT;>U 9gm4W)aO+|9k DkV'fHRfAEp+f+& ~i'zr7o!ɿ?) )J ;S$x v§j?vukTx]_YݧdN?Tj7x|qWa4)S#Ũz[+QTH#!|ױP7nO:.Q=$'(?/%E3wa,tH?U }4݄ᛶD᯲>|gUFuN⻜%:ossd(م>Š^Ƙ?TxDᓧi=gI2ѯzPWϥ/T"bxog+'o2Gh^}ߝ9͇{Yo؆(bH:[Y'RijvNo;GyS1j2Qnékޜ^?1D;%_="߿]{7 ?=|FރufZi\/բY᯲NU:;u%4;FcSg=cnٚ׼/ MNN+~qV{?|~aQ4>-?qk/'`ѬW?gv[I)g>Yc-mdP z0kŸ[_ب? ? PXѓr!V_71)uk)sdƱ[rhg%\D*B~ Y(z컧pR#%o}~ ӻ6%| ~֖o¿n)]m&,;$9-א9U y͹:~DwBDڵcŸozH-2g ; b{!p/ / EZWpROH˿iц;v-ޟXwђX9)3Quz矫@|lg?a2 ]fo< _Ct-.l(4%sze^>24\1CGҿ^wm15>o[tï.hs8;k֥ u F_¾B*vND29?ߥhө9DǨ\? J]uy`ml˰=x2?cu}"dA>|O)K[|6"qj9|%ߴu˚E xR[cQ|F ԘXl%|KyCa~.W6o ħ'ntGɁ ǂi [52ƿoo8sM K2|)?nDt+^Ϝkk}^W Ҿ=6O|;;&}O|u9~_7<,>O Ģz7ww'ppQdӔ%wg˧/M&| AҜyJZM5k}5nd|zQiG#ף\Ӱ8G_K#L:ի_D³JN7"n /AOibg ѿ]"Г|çUAFky֜Z'OХƧzEh^0/pgޞ\^'sO |Ys=gg H"m-vj~Wۭ (G|C _XWg%MzŸ)hO߂oVOb YO:34W0U̿ Ucڲמ,_nxIFi ~58f K.עBiЗ~>MX:*'zr-~e;x섿L{VۆOٞINOO>r&_x%ݯS|ޢ^W˅?{gb_^3>37h)?{Rf>'zg*uX/AOdHELOai=~!=]ɮ]_4} rW,6)cݧ_B <ƿ.e{>ryȁ̛ZJ^pA?Bq! CAljbWg/9(M q/j26w']ǿ4Ӆ>ӣZ)OY?ɑ_ݹB5|ryr1/GR~N'/^=79ᯧW?Qnw7 _˧if3χˊpʹ?Hu^=4fO=W/.C'C}f<:؊g%Y섿E ~TQٶak$mݳ^ef\ۆ.3>gt5=b)NSVxUkZY69\ ap!F߅ &_hicl̓#P*<ňzW/{փp(/l_n+r4!I2E4>=Te_v>᫾|-3RŤ ?(=gNID*7)O~4BM3EwQ[hti|/jp'xm$&;T&T/=Ԕg 7VJ'|vA.$tR|]E~1'>zxOCEּ74A:K)'r_=]}&"3xo8/{wO[b%MޒIO4~VouSsY U5;Jv2ߞZS/oIC}ΐ*|;YtPbc+F|ճ1W^1 y5=IO]ǀIIu~-w*?a57 %;k۲O߳7jEϘlw1`wH5# MQ^ag+5 z?r[tO7/ؙ_RbS_"&7)ݠ(z~\}P tc+_Sj5/Spx }zUؗ1Ɔ_^nINȿ\2"M!6[Oa>s>cѼ]bQz\= ۑ6Q+zSDdF>b9E=^05lͮ׵2wxWWWC:ꉃ7_t7A ?&|77|W D~eμaʗ^4˗hT|7dz—7v'g<|G*.'s+?ߤk _kuM?pKHj>'3|Hs?Yw5i|}/qSC_Nc}t̴&"nk o6eŞ|G%e|[ <ȇ?Liޝ<ɓ*dTa+Þ *eX4@RHlhY-5xͥk&廊W /xI"vҮY#ц> L¿o&J|_vԔW~F?) &6?G欻kQ%,|Ǽp!xC'.pI}Uns%ͭ/%c-ssϡc^;<<k2,Td $Z [Ugrͮ~T?a'Є>oJ ^^sTB艃gX'rFK-TgC)៿͏XJ?0-v'HR/)+!8ߞ Q _gx!x]DǪ 8~i[GXT]tϛ@J{,s'~Xil\Ÿ "?&-3Hu'o .Z~k*9,=zN)/%O!Mϕj*}I'11ҷm%= .'|Ƭ=KǛOtvX|q{Ӣ/lhiYu3zL(zeN'~[U?]46%4Gc_i/C^6Xx7~IRI*/;d:}?i?+r0o a&9O|֒ ;շGOfkEu/L\J&=pp{?)+קv[H=}Oл]kާb4Ny[CSa%K8̍i$?`$q/MOjӨ]B>kL'COWۼl#P'nwS`|$qC|O/iӁgn:K-lvOT?;VpSg{5<ζ5YWM_17v/XfZ>bcC?Q{(&x~A„j*WgrcF5>Rgr86? %gm?G]#&xH/4o7z~)/|+wf'8"Ƥts/.0zC)ՓKyՌ?#! b"IKOoY 6ꪥ|"q͢=`t¯^h~(]?ˋTE׍N~[J|P%Ix-33_=7;lWO8h8l=ɿZظns2v-Q>r[z?"H=wPŨ;SG,i~u3)0Y4ϗ>e/0=ى>iDߡ3$W;Uz &VQhD5_w ~ )͋ _:}!X[%2(kgh|3(ڥחoOcoOW:)ZWO͛ 2ݮg mCo9w0kIsf#\y$'-ţ_)m7B6 0i'O9kWb! ЏB|'r~}Ut +|(/%, o_sR&~K02E3N o~ __yl4jR3==%I?8|~Wpv !| %3F>Wlʵ-I'|u +=`'p+IH <ꛌL Sŕ0+/jj ~cv'cwzĉb,mOlK0˦\6;)~i"ٿo+fSI{>/s/ONBv犯!s~ {+9;ib6KV1Sb%^pynMyt_x7"y- /OZJHɳ7dcʗ뉿jFO88ow2N4|J>2~_NK 6xzNm哒I[~`5kAGf-Hz?W*O*u[[ w{U2=!KOI2gvE-ܿ^,(Z! aloye>l dB8D>I}bаy,g"_ƿǪĥ/{WQBKߜglX`ǏZ%`;tLmٶck ->',O=Y9sݖg݆<$W͖&)J"'z񒷟=>Mc\9ЄւK7i !ќW4xUn[s I_f.HO~d=Od*'^ܫF'x'phG[c/-b~I/pl~Aݰ^_Ot)g/miT/wK~ec/|7? 7o+, ~3ӧsHgz/!VhV_{1G~̥NBʉ~m%tkBo8O5y, R_&ّoC?I6x~Or's0fB7w`X%7?4/-:ns+m38C,n>2blO=S0F—m]L6쇴_bˏX|ѷ!O}{!OZ"Ȱ79Yįa|ݜT, Mw_u{=8>oW̻VLs!ɝ?<jo )%[iROӦq$CON'0u$nKV?74MŖ_ooO|~/lF?/մ>\ɯU4Jk9zILx,a)zo$>V9񯆭xkډd+2?kRTO%4+o#|R oEt./%h_낯yP[E~jfZ&%zùvY۫FΟ|X='b&_3ET3|ϰ7nIxz9\WsZ]iq}l'-.e㓜&2j'~ğZǂfCm7gϛK7dI7\HG/={ggi *Zpпsr:G}&xd'zuרmeޙZec,W /O4D˱c}=4yY>ʉ_YNƭ ~,v$Nռ9DH7e/Lo1 /N/>5$>7z_Vi{7wιWeG])t]k~ bjq?[t⯱bz/ɞGOV997Y]j܎>>Qzj)gЂԥ5͵/@N4 'ڨXWc:s |[z3 lO /|a|Ҿ7;' %ݶW'ëg&uE3l^ Va_9-TkENl ) x_?~8kS:fc=6dYWg|sgpLn*<ѫԩ2=vCy/φlVJiT;]CE7z#7|֘ѻ t*j^ <I{G 6mt} *ߚuiTUZyJ+MOkӇJFn.:_/y^6 ?:_3q`pR zc~@v.2lT?Ñ :"I|h; G_eǾxޓA.)ߟ`7 x*c }'p)()9E9)c^[,`|UQxIi\2[4׍q gß"w%ߧ?^ اK}ߖ rەָ6;wzDoWZclfS 2<҅Rin9q)? :EQF[ZՆoA:W:/ -WO/{ȃ? ^N w*yetg_;>cߌ+<$7Q5Vity"2_aB5GbXg?~ۇb[٢g᷐^#G÷cRg^ѳ:e8Ey ym'mVMjn㣹Ĉ(NӋ'W@~/Tvax`1o1Z&6goCs565*^wb=eڊ%|D?٭5:~jUKcW ?giiAՊTNYi~979h0O7y^KIg>Ty$:'Wf 'r'vs>rw|o/=z_"2NKV~^/N΄:ihH܋nKoIi^*=K>- hϚg~V:׫sWW5\PIǴnO-ٵM??PJCHX&+ZiƯ@C;~^_Vm|s+N7s໶%Y񾷏 ޴ ~rUMO㗭޸a^L66/,eGQOyJUky}u,U)59W-p_cX=}lLWLX`jl3X%;ϧ<1@zU#KM!Ϛ m?Gs;רz/M+Zoߜ ĩoCv$n5oj_tQl-..:QoCOg2/-u: hۛǸz_G+}%[XԬ[lGm^~7̙2~ppe~FygUHѸzծp_ |]Q;|k'g^MߔO_7~7C%UHGY Zr\Ưٙza< vɰ΁'jdo?.WQc~k^!xyWmxb_bVZ. mD߫-oF/ɭϊXO56g8{<5jUvZr5\f (_~ofǸh! z]EO#v2Z˶!}/c؏NXo:ƑlAoO+:녟}P4eO!Z8!.Zo wT9e%As>$JnF'~ܭQweɖ:pC41c,>tut}t#Tʿ^xzW=7k?? %CBvq46bPCS_Ϲ!nOc'9Rܫ\f| ahdx6i Yc+7JkmFÑVi.)*|E=~/C_pvꊆb@ A~?ozQ6}_f65*~[f$k$=gNGEClA3,Cs:юv|2δӶ;.dEqh,?Z߼S }*I: p@^FႿϦjk}g^i\O_ mQ!ұ{~&/B_Wb\+O[_sVѫ~^Kw!=dr4|";.+aa{~dyZ|YD(c7~V[WuՂ"=ݺ_H,_W)K ~CKhP/\X8}'~1?T h.>j&3/| VgDoWӥOׇy5t6~{*(f?Hy7R:W<ֲ1>s-:Jad~_ ϱyrﯾܡO0*z?K*҂Nt :xeC_:ECoRۀbO{^tm<Ӕzxzm7n 2H hcX; o0- ~i8%;/1(]l/~)%O'oCI_t+w##pjߏkSla]05*mi3ė85kT7~v<d^MK6g_Y:7]t)hW?O?M)T; |mD$o3|ŗK!6d߾T.7Xl裱=o7\D@(*+l7Ubɤ|2/Zxm? g!8En@IDŽt\"k=`cCu7ɒ;Ϯȁ|$g~[WTS4ѷK|!i竌uخ_m(1H}foruS-Q_ kp[g=+.=)#q%wM][+xOz'KM,9ba t>V7ÿQ$3˱%oLt|^4lwixz8 EBl|M ,-R`َK+K9žO4 i~y=I>j,o1ݧ&K!+<;W{W }6_!z=pkR&~^;?ջC~yo_`j(K\Wgv~{EUcZ#Y2>ҎӟQmﰍ̿~G>Օ =nPo{?G|58PTB?_9B_SdޜZӿ=/:WAq;KtI*:7Ls~÷F~$8~ Iax56~Ynm&-ڵ->KW"bj)5~o+-:t'Wo;{s_!JdEtv!BBwjhE)K؎1 ^HR%Qs"\HПmL)1&>ϒH+|ҁb=D1$M%I)w4Dھ 9 Uo e'W_%c):%tsW iJ˪K jl&XH)O% m!^$e޸Ąbj=^?1O>O_> ܸΨ3[] _p΂OC!=u~{h@ٜZu =?==so,,Z zO ؆JK/7GZ%,r _]AVFgNj~l$oJ,_tԕN]BOصŅw7a53'7E}o"~su4O+~Z)94/"nH-1V<~{Cm?[XcCRЫ[Gi D?g|ŇY\Vz4_ԓAĆO)?9v2x{Pqk{?5>/ ́Tkbtϡ+ii z֋NN/W)—Ҡ\NL_9+xr>|yȢйS˓ <<#hCnvjQ?@ۀ筿"]59?0<5tÀJagkmEu2n as;4^//A]9 Uk{WW`*jm=;s=')<-o1Kz/ v~TOne /E _(}-NYƿ֛u9_v%dGCwn|!_wH}کKr`t`PyݲSMZ+_o{ }8vNT?0f vŖY_2[\>{ˆ붭~nWN`NBJ2|?x5d~Ç !Z'UϹ'྿vlGyS<;+БƎɍ_WQ2)rF :p(oU9?Si~K`$\} +z@F ?8~|#;0M$vo;~^ۂ?v/̐[[A<} 3yԫ ޞ6<#=x[|W/k7ӏE~[-/cwAi/ ǟeGFC!vZkŔ3*Gn3-aT~jv$_Ku~(,k<*PĻbˀ|_~s*GVE9e7z(Ɉ (%&I=&g3Q|~,`n.U-Â}nHHkkq Ww",POio4 &z<>?A)_>$N &h}܂5Ue@KZ[zP߂ۀsJ9-0/ӂغs$fcTfE-m OQ>,0^kJ,ƜsEY%}P*:(mcr﯐\dAzdl `4NfbWLއ_;+6?tϽ([1Kw"rۄAv1 ,(j#o?26T2MV~w]4'S?, <OHXewɨDŽoGa^/js?zlT5=SFòmj1oN *O]qq>k- ٔ =D"詎Ek6pgtm(0ïH7ހ>T C(yGa;L@,Gh#CuTOv{M[ULHNTo`?G~CjЧst(Tk;K EW g5$v/} vU &ߖˏvn. /j }GPYS-ruEW00[Z>,PͣlNk1cAB\T ٫ c\)#aF/l;85J&HB7TO_mH! SNh ?"UblR?|(V#X= a+`ְSMGǂO"O"-;ۏ+t Hc|DŽ|}OpDP~7,>!K[(7"Su| f]-U:Eǂ M_1>,-ztR)4&H0aHQOӄXtb>W_ќwdŗ?&4I-eׯ\F] ۑxIp =3h~0Uǂ!%]r*O?p2?wݏ,\~,Xċ%T'߀wE]&?Aۄ\gxEmPI&" ?{j32ֳ DDŽ%0:KDŽrT+//?AO+#̗V2^JC1,?PO\T }zVBǂL>%k?B=.BɌjhBXH;IAݫNh'/'ZEs A?ժuznZ[ccCE(WyXJL\ӟ_Rr¾ kO3Mj߄/ĕF݋j0o@dO+g`YA%?M> F}Æ"T)r H/ A@D SS{Rj_:@kx築O G\ы:B? C;G+}܂Pb 봡<7'or?^TZZ&U4? ^RjEQ 4lYk?6_5F7^ ?TKľOzv$%/8MqHR\¯٬1Ӳܩ6B!*qp6 5xW/$fI`jkXSfe{ksc+z٢}X*x Rt^?̬ދX~16>b3Sd<_a-z5҃)m X`^m/t`2=F*i^xwP{R+|cҗ9_eo 0hˤ7቟WA_1?_~٪$Om_/7I=&@-3;?}o>k ~VU9o1W~,Q|ot(ac{b/7ȭT΋>Զ‡C@[xh&/SH]_|AJը4 }mcFp:WU.2En k"#Kt¿+ ا_-/)sx;9%{S딓'pN2?~) _.[E:l nErCMW8oO_]a~ Ai![*t~48~; $x<%du2~RY˳g,DASzHw%V =ݕbה++V47|ڈ!ѱ,3y2 [RI,h>47~=r'? #Nɢ;WZA3[L?jO1hX)sV?=ӑR5x'X2<_KJ 0~qMroVx{6|FD~=O+Z5/qY]]Op_3W!(Jo5†=C2v6~#k2z}1K~_z6ogX{EɎ'W|Ewo>s.noiC^ }/J_F.1Oɢ޶zgR#ۀ-J?9XBr2G = z}+LJ8l7 JjJTr+{C=6,%G?ݥb>"L&rzOCL ;zfȼP<3߬a5CI F“)`^rvVX(daßN^cgIhXlk6$gEk(%xġ\ _ cW1t@NnV}(땻_^,OS ~,V] l~'rgU$k ?kpު /#C$gΔ6;s{SeOqhW{k:Bz4OOU*$W綱kG6-oC w+Y*WС4[d HhUk _`%34t{S~dr_Suuj7|vjj/~/,Tyï;߆쑴-S+:/m<OEq&DώpOWv/0B?5y>bPyP 99p%JUEV5%r' jHyw}CJCHځPVX4#6˴ix?#>1;.wgͤ_.^_exZWJWVW_}Y¸uZrf"&%9Lm%9[=Ws)PӧVM}W:y *]7=wd ye MN)4qRl>ڼᗡ}kY1~7Rigg܌TlU!'=mYw{$}=e1Z|y7柮ќ!/8<nhp: u|V+JOgۀK^8DƯLB}JzŭGtzo#线ȵ~K y[QvKf>4 7g Er|watzy6ʼn/_{_yoacu[yGm; 緕**5YL~\?8T5Vk7zꀽ`$qy_Ue4O}L H~𦙯s:g~ \?>r1]JNO?5ߨCNO@<^rC tʁYΎ<7nzŤr>GXv]d?mcVO]E"TVɧק^<go$>RczMkl&Dr-SF>[.=>Kѯ%9wJ$7|;*|'ScΟ4eй~J>?^-8lԷyv{~K6vlKD)$ J٧T]ʄƖtrg+z`c;aΚ FP wpA G?ES{r,m r XV&5;e S,4~_^_#llySS|j;NG>?zR"˂{".9/v8ju/y+\%~gI%8~ᄱm# _\ιNɬt⣭rf!~ŧsFlu&.&eki *|ŊK}㟽tOM]?*r7IW~W!q{gE`^|9*ϢP{?kەrlq~uH,OzX$ xy6|^09ξj~"[W՘/_ &KM}\|?4n H5%Zį/6lȕ?i^m{ȼc O|K"\?A,ص|z8$?3e˥|Z,O'|~؞Cf?9~3/c=ם]u |{:sgBedhW}WW("7'у2̝=iD!/Sߔ _F+/, !gP zĦ*dvw>=]eIxN=dy{hⴶ4xg7~"/U퍟GLR }hI;=y\v DPF%n~G:׫,j|OC'4NC lze$M"mY\"WJ:=eTOS>)tי<58| vނ/ְ'}Fz<<Ճ<<·[=zߺNAS9O'WTqH~yGW :|&xjDTu:%Rᷫq#_ӿ\G̾NgٳϢkd\~V ^)BqU=*m7IxK3bwZY[~dj~4^?,&r{Kyc==_yY*L<Ԇ_c6X& nUY~N-3nWVC?() s|5WAP;rfj9˚J\v_(o.57REԃ?^*^7|- g Iu?P]f؉/$c-SG>-zEmOJB ~ۂU=?;M o/hm -]yhT`)T4Lx⋀pHf"nޣ> _mhiȊu%~m\> ~_G?݋ fG;6*lqSF?{"zgb+>ӘCt>Xp%噴=>%s!'zxs?Х}o~WHͧBz\wjL_D*gj_? =j8QA]PpH<ݧ~&;&ȭw[8Ibdxyk HY4Svǯ!<ڼ ~ 0UÃVp>9n8~?_<~8{^rK%Voǟ(?ukٽG+k&ydt!3"̬,5CK?ա+@~mWz $2mÀ9`CSf?` pq9F=ECF]\il )c7/7~o.3foяa|g7r=%vt#~._.!7~&Bz?w݇L&~NIe>7~ fD?HJzd~ *~j;;~.6>]C ^IU<}y͒//`|siF6]/*cS{6\ѷ4,EF_l[6:|6]%0%}YgX>y{q(!CqMo%lu|p*B+A|ܩ>6_Cuwnf6ͭjo *x^Fs˄~yB>=N^>"|@ڬoF.+8X構GFTs"7j%6d1Շ:<~ x~ߌ|F<۔Ͼ%/omϱ-|a|w_Ņ +Ac#4%C)B3/9RӧT]:Uɶ&g YcAǐ~nki'~Ϝ6t'Ӧu'Ҏۻ1=kDj02l,|H3_+;~hЧEd0H*yE4gK ңygplfCx<;g楳fE Zyb#@J|'oFg_l)(mZX#&& *|3WD0WD aO8 G>SlD{rz^6f >q=ݧ9~6ǟnJ7Oaφ&UЄ/.3|żWW71ěgnn__Z#+bgE , K~ GPC pYmo1nU7|} 7? k= ǿ2!Vمc _8Z$ S=/%d ?>EⒽY{- _|q(uM£dQ9oO=/Kye}?jE?cZW!6 /OSSLn-gQ>jA9?}K~A*T趗 ZT_G>do& O1]㡉ȧS&EsY>kd[l_`s>O-7:'UqYpu +=dƼtxĊOYo ȱ*;<~UvH7 -%m iƺoq+>Ul%7EW-5|FKdI%2H)#5͖vJS[|}yo 1̂?!{julkB>Y?5w}oY CCxξs:'᯸!!cLaO^nB6 &ɢgKO l"l$?Z ?c>Ù^`%=OE{Y Zt%ϵj҅&%϶ X,r9ٹ|~' gvyixb÷8zEcE2lﳯoN잨.؎KI#ρ~;+1orc3$uG^ҩ?g=S)Top a^y ?{<ˮ__3iyXC}yaA-W>tkq{'3l΍8'-IHeƐuy7|!q2g^C yg%% D;&S=Nuib6Ze;c-S8m0I$!?!e%zn+)6%|ο~jXNmֶ&v\r!$(B8Z'Ы zyX 7q?'>L-އ}c/_|bOn9&MJs}j??IZ]τ[O- :t_ƣ=?CƂvIүk]ޏOa!O.-EՄ^#'#}'g /C~s.ax@[bF;뭒@*PۀE[j_ٲk zo/;\K§}R|r:m1Ɵ?_XW/yHwvx FrL(AÆ?˿Z~MN;wП R6jnn , khOe NwϧL*t%W|z0DZK;s>pKFyeDٚ%>`+U̫Օ\8U.F)Il} >d6z_KMxj<s7|z-|7RO?+|VAL^kbSlԆ6H2D,R7EuG\h0W5qޓ/,J@C7}䕷*_𲠄O͂R P7%hq Xz)~c{ÂuOZ`[ N?(%|s^hld5:ǷMIÀA2>-Ӏ}wTxҿWvUx!m˸/bE;\Z 7hz+zB3>ԿƓe}://AÇ"Fvd5'eZXW81};)m N 77!s6.Iq OPCˇ !7t sӀyaiZ瞚%COzbn(>D> Bـ>b=Y[>?htebw/AK0i-`M% _._?1֊CY> {=V2zD,N~\3?R辙߂*ӑ^FD7;~=BgiOȜ#?@T #"Sϑ ^f4c9Qa [i@V*F&fL˗MiʗhF|܂;Q4 %.fB'j= .W #F' iX83'6dض \t/bɧ篸'8s>5x&qry< 옎us4BGl˫Хg4|_lgK,طBIhj0OԴ/@6q>ZؒGh\d/l^d"tZ@1ٔE߆Uc:0,>$z}s$ۛ/r1=!/U$-hNgT-(À#+Ekwv DV?,PgVߩ>:F%g}i~ Ʒ; FR~үȇQ}<5_p|̸fBW_a=7կ{7nAk";KAjIj_MT?-r1Dyk/]OViMQ6/QiAiJFxS: z>N%ӇSŕnRBpEiyj?[PՃ#{\uj2(JÄʯ=6xW_"E֘}Z`dGH`U|xI1~Tc|` 79%=\R,C@^(͞iMC"Jj׬?gό~D!HT^d3}YnA4PV/<,h^ѳ]k1jT(C3R&/ ӂ U^W =DsNUA O%? @{^0K` y()|ˠ[PX ?|ئ Zˇ&B.!Q O&{_'&xCj[0u?E~52CL-L)En4AuGH7H4Y[Cӄ\3aF^'+?A.M~9rpcOejC5eƥ>X+\=wC/ e+㖪vU(ʲ~)K sYy}מb&=uՉ*}ӒM\Ä-K-4}{<=+spM ߃c6NGX ?/s Oʧs+ z`;J{@Qiɚ>~)t5%(+}ΈTCN!NzN5^Z؇ 2 W%4 YAdA"ԋ9մz_\, Cb)9R8C^ ~y @5B_r6i=tp}db9E1ɇcB+Xe|Z,/xZ0U|*KM\zlM8}O[~)$VWz ?GDGނ%?Tzk >Ѭs{LusN_Lh! 4 9k\oUuF[6u%"8Ts)x f’OS? ~?皮y`.=ƿ)b!] ^e _ Z{~H}8')ќ9IHH!wV[\RbEjcۂY.~J bl`_lAӂ˹I{`Ww8wfkR=-Οҽ~_bR?Ki@{AI)N(Z(XTEOlHD,>&WaP~ H.]"vZ`ѷdg(W3]ͩ|!mژ`u_"x^r?~36ch)%ާk 5IF|juş|H'dA?xZ`ɬ{6q)q[ĥbU^4xD1d3Ux-"SlZcwUulbq8+SJX8V, ~`{S>Urb(yS4k~ OZ\x^'S\1g2~sAz$IN س^\ X<ުPE}H; Ym?HH lcE= ݾ3WP( 7֮ DJ4` T+["b/gFgb+7W$rtx&]gr? s"_i-@N1M@3krUhӀr1 K= 3u$~HeM-T!Gz|a8G%"cK̏8t!?Ӏ8\%ZO }_cMo%d{~Ed{^?_u_c-%l~gxGPU/?'c>7IzH7.1yoK#iOy3]YKzOAKd~r<24JWom1\:gRJco9R=&$s~^ _0oZ_侷|wB' ` Mq7r(YпvgIx-qSco/zcŎB%5'|8[M9~spݼ_+AEHk/9 ~_9zY r G3s}_6*t:O|<jwMzm7|nN ~]я ^)|ͤ=7"KPI1zq-׎?_ ?F-TJft$ıSJ/=Y },7߈ 5~8 >y2ዼ}gҠ9?5`c%6z~fI:p.}gSWJUC?8lijv3a?<J#+/NIxN `N`,^蛾mH(%%j3Uc7@"ԗ?Pjcӷeǻ Zv{zRkw!=J~nKz^}c|P}}խ N/)4< ?;; ׂ^gSls XBM.~׵V|?wxOwiǯixx?<;:Qt. CJE/./Ok ę^f(G=#W_t@jn/=tZUSgCqf$r_XŞǏݢXnK5z<^wmQmK+0?gB9GпӠXw9 ~ j|Ǣ {3ao_kO m{U-D1^$9ۦ!0՞^G&Ɓ'7c3k:ѷ R8} O!7/JتVk'zrCE Fނo!XY]2wjQ/Y_ك_}KqC]F[k;Wg7T gfM5*#>ky÷ ~ %<{ G ~/Jfpyˆ=ϥ%:tM1\9Ofs~O)~}@]wATkӬW#?;-lHt^x|Dllv! B|f/W|e61/lϾ,}Pe8~9(]\/HZIZӔg/qO)OJ ctxϘq^aw-I)xc--/|c\B9N ɰ'"B/:~͆5Ec4FYce$2fN}sW \9^`÷,w%=m4RH@l>2ơg[u~qBb9B4c55c5~k#I ueF|MVX 7>߆Jyr[H, B0H鿍/mE1'&RC..=/ K- ew=~IWep_g!|}I?6=udsd?K[t'laO;W^ߘnлK~~(xOi~_#Ri\)-VJ3sco'UJz٨a%֨na KJln /v?OPWF l K,˜?{>9#ཇ7?yVȡ| :kp&ft7SR?Ҿ ȣrz`4KZ)m_7YE/;Ԉ=7|ğOm_rmDo ٪+eꁟ߃h7zU臌O"_$lWN|6f蟯Z%v3_k Sjɢfn>~1bu8v%ougP)8S=W̉_f%q.Va~06! Oi̵Gμhُ1y}zņwLw.$$Chyٝ7 ?Т{O!ۀ4= }r74Zlov·,h6~E_o-v9o/yŸ\\OY ~TO^u2 dkEw /MTYO|-?}4'-zRNJ|xR`1|Bګf^~Qa'[F<5C6|JJ|6J7)/1Q'7~>}6zE?6r>ka&ote. J+u _eANhLo:62d |gR h7*|hïh<us zܿn]*6۬v[5nDkыאn{w-ԽMrZf^ ߚ/5U=⬗ֽ7AsH>)6~w(j Qp疁26Aq$ە+;? /ʞ,=SsC cUKKMy`l|%ƿpjSoM=Oj޳mk^5' z/MB-o?@H,cO/#8ϧ.t -5vPK1uzOS6jWϸȵO_byͩ7,I:XIKORQ=NPjf']Nhk78AC3V;l.ɗ^XAP APb'% >,G!ZTcSOS9g3!b_EGO&o @ H|gذ/ [~֏;7@w~5'\Үu: ymG[%hwJ3q~.%0hԞV.$Ε2q]_GI_ہ;+ǫn-!(=ۿ~We݇_1.uz1?@2/%XnY4 Hkj:Q=üIGo~|~\<%h,8}C1:/ߟ*>Brc YE!LDt߰COsY#㫿_a8V.<9/\ =Of[$_]#2~< no[xjï`7I1Lc, Wszyz|}eTσMO-co_'_[|A -Mw( _Z&6*9j&CK솟G?WV-&]=q9kStK+ +X_$n鍿g݇ ?k[z 1H9" N ]x|U1 GFr{ϫ+dwi|^y7%F|H}8?G޵no΂ҮVpz}r׶4b'6n')I{/N詯w<"nTQ / _Q[_k 7VNi^ok _to$Ux {`!p}f:bV % }R)۟ z!lFߜc"ᯗ}˻#Ey,~݈~f]~XR#dön_=$Sc~Q9M9}r3f6ݾjo%&)j O䮳ozwl#çs\n*Vc?LFufH%rZkr颇m6bCS n_%"YlfAXnT.柯4?춠>~kUU`az\?hK`a>G]\)2֟C@*|O*ddٱ=P&R0Tx'-j+x[=p[qsKx`H`a/,a?~v1/=ݡEne!8;~AШ:Tj\'h4g >F]<-ïh$}'V=g$/1[~NϮZ>13]?bxO櫛m͏{x(9V\)]⮓Jw1θgu)xt^Z :;EjYQez%_S'SKko"cC$xee9O3_"|=]YԤQp(f>*;|;^:?]iЉR|'NcaG,t{Ē߂[zͫ0/6LѿFfVto>t9?$G=9Q̄lޙ[/UIc5|4–{<5x@d]I#PEya=o[H?N x% ^nE3N a,~clJ< ?{wh!ZQ\4k5Ǟ"_\FK=F\joyc8>q==OLF[dD蹤+:?fz÷/z%NOu\Q2s,1mKjeC >-~Ư}4K ^]+'M)%%>/~0M30zUvxwUU|$uyB%/5X[goZ-*vOz6N.>gl,3[;GVЭOs"ŸUR[ jx1yw.߮8F)z*DjKNGimj؂a߼L5 7> 񤍾㭳Hxy/<@tY*)tt V䱗>dvN zg"u gkK8E_ѳ-R_x{:Z=21ÛKX)r\F[ ?ݲ3?7z^]=5[Ceբg{!k!oXU9Ƙg?5Tqƿö`D)VP9JRћk'݆_B7ex} 9mKb?\НO^gV"gĖ| [<]ϜC(ѳ132WF_}X ~G(/{Yu^ ]5 <9'`la7tOBLyiϯkϮ#_i+} 7Q/F:e"xyڞ?GjLP<>w |} ֎w/ul!Z,H6|ʮW?_ZmK%?{l9m?E&g;׈6E'Oܤ8 +οk>+; ⠓/R |}ÇLbiz~ *vid̼!s1͕ؗVϫ51W"l$XlUNƌu 7)NRX-Vŭg PkeV:*QtwIe*Sho9:-l.|+H*c)"O8?/Y[~8?\|s$E47"B?WkH4OҾ }z/KI:p7Z> '"ᦄ^"K|ӁzSF}7@{~ڤ>@qJ(#q ё zG@9 ߥ_:#'[~Zs_JiVrP^J64"?{ &Ev~.Qy+?sK<)o{E?iסkS*57E;P:bVmR7}iSYx"kɔ.a7~ ពᙩci=#nr]{|Q[{a/v|OK6/)[}j;Q#·KoGѴ`oi4N*{,Gɤ0(y Q"7kN|Us{-Bb ?e)=g+ab']1_yKu%nT]mvxɿ{mbZ85nl'oŋ"ia9SyX/1 /-,ˁ~ܾNxXۗVC7~+1l?R?*<ӊHB9,e>i햆tqR{iI_𔞷_ApJ|6~v3)q'd JoIdU퟉6ѐ7MBDr"J>/dnYҍ͇k (MOb-\E2V9h (t#7ݢ#[m@wfFJK_i1pkli{QBoITMT^sFJV˹6r wWoP]!a=Íc|]=㟎/Os9B&辧w}'k[nz2[:/?OάcD05?_vsE:7|vF.04|h4_ %E|\ɵ=l3mԮOn5 ; @@';=OR;?ݹTzЙpBx5͌+ݮǿݒ]7 [O#Qo},\>غ"c~Kژ>1{L3e3oZz3.-;mMo>B~gNva/ՆiYQT}q.'~1IhV~b'j=jl LՄ/i]'_+CR6 ? 7#j~6z7iյzo }YO?ތ})}4zƓ[P#Չ gƘ53nRoȏ>bkC')?;g%19 oEqIA&@>A3"V`_rBD92o>\n< O6aFR zfLސyAbtA x!~5WWH.kSx>н}s{: Jz#AV1Ć9M"4ќ13حOc:&oӳ h(Txb:*y%_}3 *NJ!mɘ ޷) 0zL54<zݔYf迁M'x?\7i:c'@z3̏#4>R80}N_' >jnh+~N|(z w0g&G=3'd8E۲Sku-SLǣ6ES|@O=fz`A#^}yO |mF_#-kj o}PF쮴e Nh|RBcy_L%tru9 Z'A5.2U;o_+~q^ᗱ lk+%{N}_8+lMx@ͤrY|O+T.yר*A4jfL]cfaEQ$eŗ2.K |'f~L ~O ΍Zyy Vƾr .—Uc1wbn.f׹Ƨ[tfMz+B'~_5SSJm'9T I>A8){n÷6G?ͧA{̆qr:dЙns1۩GH_]e<z ~P{phM?|]Nf_jm9ALL/&-)}"+Uw@/?7$8s(U8B.(OrrMet$  qH_K`֏lK_B揠.yȿ%P'ɜ&BuqdM i#L3kd"GQNKSp r Z>枩 C+:؆Tc9 WlSqhXtw_v|+v LG o& x)ӎ(5{h?4b;)_MP1§$yR|2~SJ O]}c-£*9G%2~nET %Ü}  z?NvR[?iAqMCO9e`Έ}z='vyAq|I,Em.F7kI'he6?A:M=9|n+:p=0G3sRNYyF15RPD'Ρp˔ B/AVrm>|ڢ u ٴ#xN&ԧU2gɓw)l?Gh>v'Wވ=֠6|TJ_vTjLѳK2>s2IOǴ? \IHbV|{H]?۴ N+wl2w }elQ̈́hI,W)/ˊA(C.5#o/8OOtEkEr0g p,&?{ӑ4+FHӛ[:૳yT*Ѓ:q,UF[/ Dї*|4Qy^b!^ٕetNE6[3JԛO2J+~+CB|eO-2zÕ=t_b'_2oR7'<ыoYFCק,o^E/l)y㟒2|_r*=Fߙnz񉞲/뙋xx߼^"'o ?O(rr/WNgG=z_oF glt^Ovs{KӅ_%FI~vn*w4ͷr*o7?b_Kb;$ȧq)dgr\fs ^!k>g*tZ j08J>2@Yyy=^C49z0M9B(;O~uM5zގ^/s'@iha_:ﰭQ}׹|$F?VCo ^pmaß1Ou΄NzS,2>s&^//Yaۃim4c=B;1|9m(<܏|HbOua_ihDŽ0|ڲOѩR\s2x6q3I'~vgR:"D |r9M ĥsMZ=GyhLg z|>TG^4Qr32XeQh06Ѝǂ'?uPӨׂ߾zF=o)OfѪ;eꒃf9G FG +)I'Is{ϑvma7g5g-W|/T,,5TƔ#6QS~P|}W_0{[E9|9ozѯlzWqss =ߡO8)ˌ$zr:Fˊ(4X7F :aqoWi3_SQ5~ߊB Q{nCZ N=xBIN@fQuk|oō8yEQ{`]?LYIdF5[}"sW$h^'0>/ |qZK.1F/r%WK9ANF]~fe>n ||ߚ+I=2zX֭i#o7. 2x`W#ϲ]e 14ꆞX+ew1=@ ;38@  _`fw-,o@xMHŹ>MN+ l_?)L, ~{"X#tQ wGC^gq8s~H~{=}g3V>+ݭ/n݅\ߙ^-< rUC ?5<831|j3zhln>qto #+{_ka |A_ivy×ʑٓ?I#XQQmZ>NcoO4o;J ~=J)8A ^~e_\Hil [W8%Oh =v=̶_Wі~)EWUByFːf2Fm~$G}ෞ*{5g o'RgG2|1j<LN m#L1_S#Aۊ=ih,$Cb,,P~o#1^ :e~%;zrɣ9O^n}I_zi, tcuCmǢ5B9f]oTH=micoZ~/ _xu'ʽ.zm?]h?&†_nw^-KOxÆV ?qzjKO3' a:i:yYyY $oDŽ >)ɂ}Ef _U~|/.b-~lNCdo(kOsɉC< s-0|N .Z/Exg97];CL%+Epm=WQ-G -?l:tw|eW[5/Z GJ?WO`۾F5:vGx 9zoQ*oN>S'i`en<>{-]Wtl1ӫn;şV]O'M[}mkaOG"%_0SO5T}1St -?sɑ|?:r|pun>;J ?0Rz*"t[?U+,*i\#隑gbgNCY1Yy:Ĵ?O (IMܯۥ>E ^HBޓr{_buƯe̱/K ( @47|UO>T/g"PwgF3OZ^v-kU`O4ۤoK-*=5 )7|z';? tӜBy{a߾+"v951`o+mb{3y|gZ =խF/ߥ2<ǵ&)૎QvabVO>]=l8ҙC|u="Azwzl譢'\ƞ;]?п:+y\%|gXK 3!s7\=l A: =|&x|C-?ADxtYDz|*uͧƿd 3u2e+6x5bxI[2^x2}o8~3l {ogl83U/[Ty)> S57mn:>RZO!1Qo*I_x!~SoӳvtQ6y/W;)]+o>._Vn{/؉Z<g->W!zz'~So\v{%.'08T|hqoZ_{jza=X1L5wzS卞_9p=֒ЂkhlW*=]cci"6~N3h%񪕻TQ,2;}?9M~k'7rԯkn܆(:|J' e,{|9C^ՂU.F~|G^4;xȓ~g˘Pi1:禖h1S0xmL7|k+W$e{][3(O2z倯7w/x7K~s;} C┼|LAeZAi%1KL7!|n4 X>ͧm>jU> Ox7|)o98mK-Tj AOaCr ,oAq żQns7 ?ûu_ڣ,?t! ƈxR | |oЫ4j < 9 ]='I2mI xO=fOYZn=?3% f8c~_НO۬ZY)X~݃kQ|B-{_d𾟓jɫ>?/j}5J|^zu,^R|3R{{DA5ss%}zbk7,- _XmjcA5+6? _g~>m;JiP\jy_=ւUHXث=;>pQt4KgY~ ޢ7~ZM|Z؂1Ne ~ۗv)GmNT 8nWγq"?`' 1OOZ}Jw%R7ɉCWxKJÆz5;r_Y%ךIB~*V}g }a(QCZނϡEߡymw|-TlWXI$/-*m:>Hys:'4v[>OjWij`uޭlƿN. գe/fڤ_S/:-c)Q Jr_2P4'*lo.|KtXlނ5B$&oL{zy2|;_ R =#{g9Nn|ܾМSxF[u'z*tXϔH&|Jxj 288@ Źͧz!e-x׬clƿF`\swwU3NϧK{x!URA7~";7˓Ƃ?JT4"9[Hr%%Ab/rI߃YgNL(K})_z%="/x\7:ِ͇:Ë >ꄪQ'Ty qaRTVɤXet<'o<[aN|W]^<?[ <'24do\^w:pۡEijjwS.= x Oos>R$|Y|#DIO{k"C{^O! O׆߯? zԩ1"=J |6bK l ^`%]4*ڎ_|N͉f9.OK)ggCÇ |Z9/6Tx':D?}JЁ%/2IJQs[J1B}.қf)𷟣Xd<>v|b$TR|ĉ |7ӕ'J?zY1*ݾ?[o>E@e9H$ zZ7[ekC/D?^Q4ike- >Sa!4 n:] 2|b1׉r>svz-2=ʟاDƿdt ^dblrQ1`73sD>\ٓ`'n卿's~ȓ828k?'b2<= 6~ު =p _=Uh<~ b65\Ŏ9\Ty-UJ#/ p#:S}ïNrb|~Mݭ?>9I5x eRUi[d_'k9*AZG/>Oۭw˗e& :\̪\ L*2$!\Yk=kɆ֛w ><]J7(l܍~Jᗄ%n %lkq4r~ޢ\L^;!-vWjEj W۴w;|ٻ`rfFzT^ e)ct^W vr}vZὓ ݜ~^W9WK& φW{[ȳvTkhfg>я{\˞<Ы GoxnO9$Չ%o&7HDR\PշK aiTW~pDanZyf{)KsH- p [c@۲iE?[: u*Lsj;d ?q7x|fI"t*-bT*;;+Ofv^%li0b2zZ?LWnD*LYTݫXٽ|Ʃo e_{@OZ4n_ЧvfCbxƿ^r7~ pǏT9OJ'^vAc7_<=A rM#7{/O 7> ]6V:У6gBo Jqj+譬sun5ޯ| N1[ :/[+~2 |ŇQ$j@jWWq`5|-7Xis"e[>  cA%Ɣh>._Agɴ"'VmmDj֣ |yoFA.K)B  S):$ |{7xr7St=t2z?*ejAiJI*[:˘FO\C8r<%vJ$!OrBNBN_R,3\n~/+ʉ7ir0N QE4 ~.O|R* ʇK52 qpM oQ)0ﱥ} ZE7Q驴)bt17ѧHwDs}j})+gK±ۚM)s6Qj2װ͟Cw}o.=!toNiNrkѼ,'f 9?N&|}ВNc$FLڪsZ{3|L*?G@_hkS#)]2-)EZ]üw*/Ue> ɤ?v7ֽ¾z_UfaFHlR;I144K1XhmR >k|(TZسa 9ֳx"JiGbÏJ9q0G,&*?F-V}YUQ̼q*(c_zx%UO1V%O߳Ѐ궏~|C-%(ᯊmس|)7rF $-Yx9X6|QF@/YI=g6~v,aخ?H#c6OѬ=zṬkܰ6F>0&^p͓.re끿^~m _9oß /TϏ^}t>O(E(j4[;[nz-tZ zG _U(,JHSC𛝶OAx]4gKjJz_ V=h+E-Zz~R5!LqgW""klOTܴfେ ߢB N~Ưۗ(W֤%6WYd~oP"c,cE55[qk2z[}_8ޚ/{%skA3q=Gh9˽^FwS_'}jB,j[~HTji/ύj /me~IOj2n=U}4 nRr /ʁFY;/IĒ1R%?<3~3i'7Lz$% p;ݨ G3 yQ\|h箙nZ艣O&/g ƊjLh+&o;On }@O׾>o=EsER9JΏׯ|7Y-כ=풞_:%iWf=7|5Fm<`I XBɶaեkw9hJZ=!Ÿc-~ji"EQEI- |~ {K u2+&eƸOʮ)7~q ]Z[~KGMWo:l/ ;7նvD;gQ ^ /¿6Wo'ia}iƿEOަ“T]t㯢K~V/ YᛓW?`ooꎿ$oC4;+_Vۃ~am;}'m)lw Ȃޣ_sj* i$OiBOY(Al7W7/Jk-#ъ֟[OC>K;ۯ0zL݆?i1CD>'%T4  {w׃OMvXO[nq<ͧ΅Vп޻umZ ez?]xjK^eѧU]x~M94$Z7:'_{ Ym ,՘)~(?1.S.<bgN>pr#/P8>¾HJ(O['=(J ڗc|o 7|&98|J7zuD#֎]НcLF=uN"+I2@exR=uL1x(>.߂lb ەFŰ)gp~+}W_wp _).j~u̓Brp}.u[o^UطӨ- n&xN k:9I~.#6 |k)P;N o".@C3†Ol7 oK&-X 23x _{N^(>oL}쌍>A%1d -v2UD%)p_lHNWW֢?{jPoO@wD''|6]sCWNiv¿Km 1|kf[\s )-amlOÆ_[,e7JHN0{Sn|U'\ _`7~-fJ`oP3zT$gk&ߜq+@DΆv疐 5Dqsy4߱SjksפQg^b[ yԀ?J7?c-f^;B'?^pĢ_Rzܽ9 >!)իC=Vn2?ᇞ n ɟVs%ژn_3j]ihjC% 0Kgj} U7osrG;OŋS݌FwRܣ?@qģ=gII?z?J)+}邯Q)JF#AϷ)=3GBzܿz'v! ܞ森 5pO:C5ki Z-f;OJrߪ%?_C;ozU_)&&m|r=$Q{!8o u&\FA;_32#t231(zs_|h:]a/P"ռ[lI7 pa?t7ZtHIbǞl~՘F i~/|S IӪY W~4Juv̽JFw+OdϗytؒrOQ*~5!90V ]M2~sPX_I(?\,IXRPίxF=d'`g<ޝb=A̶?Ʌ73z}IKGns=?땸[O]SiJ;ς?5H/h|=Ε~x<<6n>)ݍݚxOws2눍~$,/T^<ʊ؜%(Ns2(Fe"*tR՜1# )(Cvb>\恃 >c~V>]%'j{4ZV{^s[k=c'bzx!_젍sT|Dg bےSr)\r3lC'mkY tǀˆߢ\ˣچ ʬ 3l8OÓMKxaGYL(U{_m4RZ=?yd,GxWUxؐ/7?sSkT_g74ԵVNssň fƹuzҵy2 7D4V]<EW4$ }¥edW߲;7| ["|/RļPzCϸ Qr _0Ѫc^wNFÆOsMX ض3E̼ Ѹ)J͖XOv?D-m@̆(0}W0|Mq;6x-MEOSL4׈~?:g5ڭ=3)4T_o xq=n ME\荟^'Ka>2kM#-㝲b/e+ͮxJ%S<<-io;4z|ro>*EtK=Z %f9խx(+ 7zCe˂7CռⵠׂWg:r?zuHWy 7xO1 Rr[m-£>-Q{]Գ Kch'ZC|`pKrgWmN=rtz^~ ωi05=2| ?G'NPK L2edGJ1 FoodMartCreateData.sqlPKDGJmondrian-3.11.0.1-R/demo/FoodMartLoader.bat000066400000000000000000000016371261646570300202400ustar00rootroot00000000000000 rem example script for MondrianFoodMartLoader @echo off set CP=../lib/commons-dbcp.jar;../lib/commons-collections.jar;../lib/commons-pool.jar set CP=%CP%;../lib/eigenbase-properties.jar;../lib/eigenbase-resgen.jar;../lib/eigenbase-xom.jar set CP=%CP%;../lib/javacup.jar;../lib/mondrian.jar set CP=%CP%;../lib/log4j-1.2.9.jar set CP=%CP%;../testlib/mysql-connector-java-3.1.11-bin.jar set CP=%CP%;../testlib/postgresql-driver-jdbc3-74-214.jar set CP=%CP%;../testlib/jtds-1.2.jar java -Xms100m -Xmx500m -cp "%CP%" -Dlog4j.configuration=file:///C:/Temp/runnerLog4j.xml mondrian.test.loader.MondrianFoodMartLoader -tables -data -indexes -inputFile="C:/Documents and Settings/swood/My Documents/perforce/mondrian/demo/FoodMartCreateData.sql" -jdbcDrivers=net.sourceforge.jtds.jdbc.Driver -outputJdbcURL="jdbc:jtds:sqlserver://localhost:1433/FoodMart;tds=8.0;lastupdatecount=true" -outputJdbcUser=sa -outputJdbcPassword=passwordmondrian-3.11.0.1-R/demo/SteelWheels.mondrian.xml000066400000000000000000000061421261646570300214560ustar00rootroot00000000000000

mondrian-3.11.0.1-R/demo/cmdRunner.bat000066400000000000000000000010331261646570300173210ustar00rootroot00000000000000@echo off set CP=../lib/commons-dbcp.jar;../lib/commons-collections.jar;../lib/commons-pool.jar set CP=%CP%;../lib/eigenbase-properties.jar;../lib/eigenbase-resgen.jar;../lib/eigenbase-xom.jar set CP=%CP%;../lib/javacup.jar;../lib/log4j-1.2.9.jar;../lib/mondrian.jar set CP=%CP%;../testlib/mysql-connector-java-3.1.16-ga-bin.jar set CP=%CP%;../testlib/postgresql-driver-jdbc3-74-214.jar java -Xms100m -Xmx500m -cp "%CP%" -Dlog4j.configuration=file:///C:/Temp/wip/log4j.xml mondrian.tui.CmdRunner -p CmdRunner.properties -f CmdRunner.cmdr mondrian-3.11.0.1-R/demo/mysql/000077500000000000000000000000001261646570300160445ustar00rootroot00000000000000mondrian-3.11.0.1-R/demo/mysql/SteelWheels.sql000066400000000000000000030110401261646570300210100ustar00rootroot00000000000000-- This software is subject to the terms of the Eclipse Public License v1.0 -- Agreement, available at the following URL: -- http://www.eclipse.org/legal/epl-v10.html. -- You must accept the terms of that agreement to use this software. -- -- Copyright (C) 2009-2009 Pentaho -- All Rights Reserved. -- MySQL Administrator dump 1.4 -- -- ------------------------------------------------------ -- Server version 5.0.45-community-nt /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; /*!40101 SET NAMES utf8 */; /*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; /*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; /*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; -- -- Create schema steelwheels -- CREATE DATABASE IF NOT EXISTS steelwheels; USE steelwheels; -- -- Definition of table `customer_w_ter` -- DROP TABLE IF EXISTS `customer_w_ter`; CREATE TABLE `customer_w_ter` ( `CUSTOMERNUMBER` int(11) default NULL, `CUSTOMERNAME` varchar(50) collate latin1_general_cs default NULL, `CONTACTLASTNAME` varchar(50) collate latin1_general_cs default NULL, `CONTACTFIRSTNAME` varchar(50) collate latin1_general_cs default NULL, `PHONE` varchar(50) collate latin1_general_cs default NULL, `ADDRESSLINE1` varchar(50) collate latin1_general_cs default NULL, `ADDRESSLINE2` varchar(50) collate latin1_general_cs default NULL, `CITY` varchar(50) collate latin1_general_cs default NULL, `STATE` varchar(50) collate latin1_general_cs default NULL, `POSTALCODE` varchar(15) collate latin1_general_cs default NULL, `COUNTRY` varchar(50) collate latin1_general_cs default NULL, `EMPLOYEENUMBER` int(11) default NULL, `CREDITLIMIT` decimal(31,10) default NULL, `TERRITORY` varchar(10) collate latin1_general_cs default NULL, UNIQUE KEY `index1` (`CUSTOMERNUMBER`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_general_cs; -- -- Dumping data for table `customer_w_ter` -- /*!40000 ALTER TABLE `customer_w_ter` DISABLE KEYS */; INSERT INTO `customer_w_ter` (`CUSTOMERNUMBER`,`CUSTOMERNAME`,`CONTACTLASTNAME`,`CONTACTFIRSTNAME`,`PHONE`,`ADDRESSLINE1`,`ADDRESSLINE2`,`CITY`,`STATE`,`POSTALCODE`,`COUNTRY`,`EMPLOYEENUMBER`,`CREDITLIMIT`,`TERRITORY`) VALUES (103,'Atelier graphique','Schmitt','Carine','40.32.2555','54, rue Royale',NULL,'Nantes',NULL,'44000','France',1370,'100.0000000000','EMEA'), (112,'Signal Gift Stores','King','Sue','7025551838','8489 Strong St.',NULL,'Las Vegas','NV','83030','USA',1166,'100.0000000000','NA'), (114,'Australian Collectors, Co.','Ferguson','Peter','03 9520 4555','636 St Kilda Road','Level 3','Melbourne','Victoria','3004','Australia',1611,'100.0000000000','APAC'), (119,'La Rochelle Gifts','Labrune','Janine','40.67.8555','67, rue des Cinquante Otages',NULL,'Nantes',NULL,'44000','France',1370,'100.0000000000','EMEA'), (121,'Baane Mini Imports','Bergulfsen','Jonas','07-98 9555','Erling Skakkes gate 78',NULL,'Stavern',NULL,'4110','Norway',1504,'100.0000000000','EMEA'), (124,'Mini Gifts Distributors Ltd.','Nelson','Valarie','4155551450','5677 Strong St.',NULL,'San Rafael','CA','97562','USA',1165,'100.0000000000','NA'), (125,'Havel & Zbyszek Co','Piestrzeniewicz','Zbyszek','(26) 642-7555','ul. Filtrowa 68',NULL,'Warszawa',NULL,'01-012','Poland',NULL,'0.0000000000',NULL), (128,'Blauer See Auto, Co.','Keitel','Roland','+49 69 66 90 2555','Lyonerstr. 34',NULL,'Frankfurt',NULL,'60528','Germany',1504,'100.0000000000','EMEA'), (129,'Mini Wheels Co.','Murphy','Julie','6505555787','5557 North Pendale Street',NULL,'San Francisco','CA','94217','USA',1165,'100.0000000000','NA'), (131,'Land of Toys Inc.','Yu','Kwai','2125557818','897 Long Airport Avenue',NULL,'NYC','NY','10022','USA',1323,'100.0000000000','NA'), (141,'Euro+ Shopping Channel','Freyre','Diego','(91) 555 94 44','C/ Moralzarzal, 86',NULL,'Madrid',NULL,'28034','Spain',1370,'100.0000000000','EMEA'), (144,'Volvo Model Replicas, Co','Berglund','Christina','0921-12 3555','Berguvsvu00e4gen 8',NULL,'Luleu00e5',NULL,'S-958 22','Sweden',1504,'100.0000000000','EMEA'), (145,'Danish Wholesale Imports','Petersen','Jytte','31 12 3555','Vinbu00e6ltet 34',NULL,'Kobenhavn',NULL,'1734','Denmark',1401,'100.0000000000','EMEA'), (146,'Saveley & Henriot, Co.','Saveley','Mary','78.32.5555','2, rue du Commerce',NULL,'Lyon',NULL,'69004','France',1337,'100.0000000000','EMEA'), (148,'Dragon Souveniers, Ltd.','Natividad','Eric','+65 221 7555','Bronz Sok., Bronz Apt. 3/6 Tesvikiye',NULL,'Singapore',NULL,'079903','Singapore',1621,'100.0000000000','Japan'), (151,'Muscle Machine Inc','Young','Jeff','2125557413','4092 Furth Circle','Suite 400','NYC','NY','10022','USA',1286,'100.0000000000','NA'), (157,'Diecast Classics Inc.','Yu','Kyung','2155551555','7586 Pompton St.',NULL,'Allentown','PA','70267','USA',1216,'100.0000000000','NA'), (161,'Technics Stores Inc.','Hirano','Juri','6505556809','9408 Furth Circle',NULL,'Burlingame','CA','94217','USA',1165,'100.0000000000','NA'), (166,'Handji Gifts& Co','Victorino','Wendy','+65 224 1555','Village Close - 106 Linden Road Sandown','2nd Floor','Singapore',NULL,'069045','Singapore',1612,'100.0000000000','APAC'), (167,'Herkku Gifts','Oeztan','Veysel','+47 2267 3215','Drammen 121, PR 744 Sentrum',NULL,'Bergen',NULL,'N 5804','Norway',1504,'100.0000000000','EMEA'), (168,'American Souvenirs Inc','Franco','Sue','2035557845','149 Spinnaker Dr.','Suite 101','New Haven','CT','97823','USA',1286,'0.0000000000','NA'), (169,'Porto Imports Co.','de Castro','Isabel','(1) 356-5555','Estrada da sau00fade n. 58',NULL,'Lisboa',NULL,'1756','Portugal',NULL,'0.0000000000',NULL), (171,'Daedalus Designs Imports','Rancu00e9','Martine','20.16.1555','184, chaussu00e9e de Tournai',NULL,'Lille',NULL,'59000','France',1370,'100.0000000000','EMEA'), (172,'La Corne D\'abondance, Co.','Bertrand','Marie','(1) 42.34.2555','265, boulevard Charonne',NULL,'Paris',NULL,'75012','France',1337,'100.0000000000','EMEA'), (173,'Cambridge Collectables Co.','Tseng','Kyung','6175555555','4658 Baden Av.',NULL,'Cambridge','MA','51247','USA',1188,'100.0000000000','NA'), (175,'Gift Depot Inc.','King','Julie','2035552570','25593 South Bay Ln.',NULL,'Bridgewater','CT','97562','USA',1323,'100.0000000000','NA'), (177,'Osaka Souveniers Co.','Kentary','Mory','+81 06 6342 5555','Dojima Avanza 4F, 1-6-20 Dojima, Kita-ku',NULL,'Osaka','Osaka',' 530-0003','Japan',1621,'100.0000000000','Japan'), (181,'Vitachrome Inc.','Frick','Michael','2125551500','2678 Kingston Rd.','Suite 101','NYC','NY','10022','USA',1286,'100.0000000000','NA'), (186,'Toys of Finland, Co.','Karttunen','Matti','90-224 8555','Keskuskatu 45',NULL,'Helsinki',NULL,'21240','Finland',1501,'100.0000000000','EMEA'), (187,'AV Stores, Co.','Ashworth','Victoria','(171) 555-1555','Fauntleroy Circus',NULL,'Manchester',NULL,'EC2 5NT','UK',1501,'100.0000000000','EMEA'), (189,'Clover Collections, Co.','Cassidy','Dean','+353 1862 1555','25 Maiden Lane','Floor No. 4','Dublin',NULL,'2','Ireland',1504,'100.0000000000','EMEA'), (198,'Auto-Moto Classics Inc.','Taylor','Leslie','6175558428','16780 Pompton St.',NULL,'Brickhaven','MA','58339','USA',1216,'100.0000000000','NA'), (201,'UK Collectables, Ltd.','Devon','Elizabeth','(171) 555-2282','Berkeley Gardens 12 Brewery',NULL,'Liverpool',NULL,'WX1 6LT','UK',1501,'100.0000000000','EMEA'), (202,'Canadian Gift Exchange Network','Tannamuri','Yoshi','(604) 555-3392','1900 Oak St.',NULL,'Vancouver','BC','V3F 2K1','Canada',1323,'100.0000000000','NA'), (204,'Online Mini Collectables','Barajas','Miguel','6175557555','7635 Spinnaker Dr.',NULL,'Brickhaven','MA','58339','USA',1188,'100.0000000000','NA'), (205,'Toys4GrownUps.com','Young','Julie','6265557265','78934 Hillside Dr.',NULL,'Pasadena','CA','90003','USA',1166,'100.0000000000','NA'), (206,'Asian Shopping Network, Co','Walker','Brydey','+612 9411 1555','Penthouse Level, Suntec Tower Three, 8 Temasek',NULL,'Singapore',NULL,'038988','Singapore',NULL,'0.0000000000',NULL), (209,'Mini Caravy','Citeaux','Fru00e9du00e9rique','88.60.1555','24, place Klu00e9ber',NULL,'Strasbourg',NULL,'67000','France',1370,'100.0000000000','EMEA'), (211,'King Kong Collectables, Co.','Sunwoo','Michael','+852 2251 1555','Bank of China Tower, 1 Garden Road','Level 25','Central Hong Kong',NULL,'','Hong Kong',1621,'100.0000000000','Japan'), (216,'Enaco Distributors','Saavedra','Eduardo','(93) 203 4555','Rambla de Cataluu00f1a, 23',NULL,'Barcelona',NULL,'08022','Spain',1702,'100.0000000000','EMEA'), (219,'Boards & Toys Co.','Young','Leslie','3105552373','4097 Douglas Av.',NULL,'Glendale','CA','92561','USA',1166,'100.0000000000','NA'), (223,'Natu00fcrlich Autos','Kloss','Horst','0372-555188','Taucherstrau00dfe 10',NULL,'Cunewalde',NULL,'01307','Germany',NULL,'0.0000000000',NULL), (227,'Heintze Collectables','Ibsen','Palle','86 21 3555','Smagsloget 45',NULL,'u00c5rhus',NULL,'8200','Denmark',1401,'100.0000000000','EMEA'), (233,'Quu00e9bec Home Shopping Network','Fresniu00e8re','Jean','(514) 555-8054','43 rue St. Laurent',NULL,'Montru00e9al','Quu00e9bec','H1J 1C3','Canada',1286,'100.0000000000','NA'), (237,'ANG Resellers','Camino','Alejandra','(91) 745 6555','Gran Vu00eda, 1',NULL,'Madrid',NULL,'28001','Spain',NULL,'0.0000000000',NULL), (239,'Collectable Mini Designs Co.','Thompson','Valarie','7605558146','361 Furth Circle',NULL,'San Diego','CA','91217','USA',1166,'100.0000000000','NA'), (240,'giftsbymail.co.uk','Bennett','Helen','(198) 555-8888','Garden House Crowther Way',NULL,'Cowes','Isle of Wight','PO31 7PJ','UK',1501,'100.0000000000','EMEA'), (242,'Alpha Cognac','Roulet','Annette','61.77.6555','1 rue Alsace-Lorraine',NULL,'Toulouse',NULL,'31000','France',1370,'100.0000000000','EMEA'), (247,'Messner Shopping Network','Messner','Renate','069-0555984','Magazinweg 7',NULL,'Frankfurt',NULL,'60528','Germany',NULL,'0.0000000000',NULL), (249,'Amica Models & Co.','Accorti','Paolo','011-4988555','Via Monte Bianco 34',NULL,'Torino',NULL,'10100','Italy',1401,'100.0000000000','EMEA'), (250,'Lyon Souveniers','Da Cunha','Daniel','+33 1 46 62 7555','27 rue du Colonel Pierre Avia',NULL,'Paris',NULL,'75508','France',1337,'100.0000000000','EMEA'), (256,'Auto Associu00e9s & Cie.','Tonini','Daniel','30.59.8555','67, avenue de l\'Europe',NULL,'Versailles',NULL,'78000','France',1370,'100.0000000000','EMEA'), (259,'Toms Spezialitu00e4ten, Ltd','Pfalzheim','Henriette','0221-5554327','Mehrheimerstr. 369',NULL,'Ku00f6ln',NULL,'50739','Germany',1504,'100.0000000000','EMEA'), (260,'Royal Canadian Collectables, Ltd.','Lincoln','Elizabeth','(604) 555-4555','23 Tsawassen Blvd.',NULL,'Tsawassen','BC','T2F 8M4','Canada',1323,'100.0000000000','NA'), (273,'Franken Gifts, Co','Franken','Peter','089-0877555','Berliner Platz 43',NULL,'Mu00fcnchen',NULL,'80805','Germany',NULL,'0.0000000000',NULL), (276,'Anna\'s Decorations, Ltd','O\'Hara','Anna','02 9936 8555','201 Miller Street','Level 15','North Sydney','NSW','2060','Australia',1611,'100.0000000000','APAC'), (278,'Rovelli Gifts','Rovelli','Giovanni','035-640555','Via Ludovico il Moro 22',NULL,'Bergamo',NULL,'24100','Italy',1401,'100.0000000000','EMEA'), (282,'Souveniers And Things Co.','Huxley','Adrian','+61 2 9495 8555','Monitor Money Building, 815 Pacific Hwy','Level 6','Chatswood','NSW','2067','Australia',1611,'100.0000000000','APAC'), (286,'Marta\'s Replicas Co.','Hernandez','Marta','6175558555','39323 Spinnaker Dr.',NULL,'Cambridge','MA','51247','USA',1216,'100.0000000000','NA'), (293,'BG&E Collectables','Pon','Ed','+41 26 425 50 01','Rte des Arsenaux 41',NULL,'Fribourg',NULL,'1700','Switzerland',NULL,'0.0000000000',NULL), (298,'Vida Sport, Ltd','Holz','Michael','0897-034555','Grenzacherweg 237',NULL,'Genu00e8ve',NULL,'1203','Switzerland',1702,'100.0000000000','EMEA'), (299,'Norway Gifts By Mail, Co.','Klaeboe','Jan','+47 2212 1555','Drammensveien 126 A, PB 744 Sentrum',NULL,'Oslo',NULL,'N 0106','Norway',1504,'100.0000000000','EMEA'), (303,'Schuyler Imports','Schuyler','Bradley','+31 20 491 9555','Kingsfordweg 151',NULL,'Amsterdam',NULL,'1043 GR','Netherlands',NULL,'0.0000000000',NULL), (307,'Der Hund Imports','Anders','Maria','030-0074555','Obere Str. 57',NULL,'Berlin',NULL,'12209','Germany',NULL,'0.0000000000',NULL), (311,'Oulu Toy Supplies, Inc.','Koskitalo','Pirkko','981-443655','Torikatu 38',NULL,'Oulu',NULL,'90110','Finland',1501,'100.0000000000','EMEA'), (314,'Petit Auto','Dewey','Catherine','(02) 5554 67','Rue Joseph-Bens 532',NULL,'Bruxelles',NULL,'B-1180','Belgium',1401,'100.0000000000','EMEA'), (319,'Mini Classics','Frick','Steve','9145554562','3758 North Pendale Street',NULL,'White Plains','NY','24067','USA',1323,'100.0000000000','NA'), (320,'Mini Creations Ltd.','Tam','Wing C','5085559555','4575 Hillside Dr.',NULL,'New Bedford','MA','50553','USA',1188,'100.0000000000','NA'), (321,'Corporate Gift Ideas Co.','Brown','Julie','6505551386','7734 Strong St.',NULL,'San Francisco','CA','94217','USA',1165,'100.0000000000','NA'), (323,'Down Under Souveniers, Inc','Graham','Mike','+64 9 312 5555','162-164 Grafton Road','Level 2','Auckland',NULL,'','New Zealand',1612,'100.0000000000','APAC'), (324,'Stylish Desk Decors, Co.','Brown','Ann','(171) 555-0297','35 King George',NULL,'London',NULL,'WX3 6FW','UK',1501,'100.0000000000','EMEA'), (328,'Tekni Collectables Inc.','Brown','William','2015559350','7476 Moss Rd.',NULL,'Newark','NJ','94019','USA',1323,'100.0000000000','NA'), (333,'Australian Gift Network, Co','Calaghan','Tony','61-7-3844-6555','31 Duncan St. West End',NULL,'South Brisbane','Queensland','4101','Australia',1611,'100.0000000000','APAC'), (334,'Suominen Souveniers','Suominen','Kalle','+358 9 8045 555','Software Engineering Center, SEC Oy',NULL,'Espoo',NULL,'FIN-02271','Finland',1501,'100.0000000000','EMEA'), (335,'Cramer Spezialitu00e4ten, Ltd','Cramer','Philip','0555-09555','Maubelstr. 90',NULL,'Brandenburg',NULL,'14776','Germany',NULL,'0.0000000000',NULL), (339,'Classic Gift Ideas, Inc','Cervantes','Francisca','2155554695','782 First Street',NULL,'Philadelphia','PA','71270','USA',1188,'100.0000000000','NA'), (344,'CAF Imports','Fernandez','Jesus','+34 913 728 555','Merchants House, 27-30 Merchant\'s Quay',NULL,'Madrid',NULL,'28023','Spain',1702,'100.0000000000','EMEA'), (347,'Men \'R\' US Retailers, Ltd.','Chandler','Michael','2155554369','6047 Douglas Av.',NULL,'Los Angeles','CA','91003','USA',1166,'100.0000000000','NA'), (348,'Asian Treasures, Inc.','McKenna','Patricia','2967 555','8 Johnstown Road',NULL,'Cork','Co. Cork',NULL,'Ireland',NULL,'0.0000000000',NULL), (350,'Marseille Mini Autos','Lebihan','Laurence','91.24.4555','12, rue des Bouchers',NULL,'Marseille',NULL,'13008','France',1337,'100.0000000000','EMEA'), (353,'Reims Collectables','Henriot','Paul','26.47.1555','59 rue de l\'Abbaye',NULL,'Reims',NULL,'51100','France',1337,'100.0000000000','EMEA'), (356,'SAR Distributors, Co','Kuger','Armand','+27 21 550 3555','Century City-Montague Gardens PO Box 37177',NULL,'Chempet',NULL,' 7442','South Africa',NULL,'0.0000000000',NULL), (357,'GiftsForHim.com','MacKinlay','Wales','64-9-3763555','199 Great North Road',NULL,'Auckland',NULL,'','New Zealand',1612,'100.0000000000','APAC'), (361,'Kommission Auto','Josephs','Karin','0251-555259','Luisenstr. 48',NULL,'Mu00fcnster',NULL,'44087','Germany',NULL,'0.0000000000',NULL), (362,'Gifts4AllAges.com','Yoshido','Juri','6175559555','8616 Spinnaker Dr.',NULL,'Boston','MA','51003','USA',1216,'100.0000000000','NA'), (363,'Online Diecast Creations Co.','Young','Valarie','6035558647','2304 Long Airport Avenue',NULL,'Nashua','NH','62005','USA',1216,'100.0000000000','NA'), (369,'Lisboa Souveniers, Inc','Rodriguez','Lino','(1) 354-2555','Jardim das rosas n. 32',NULL,'Lisboa',NULL,'1675','Portugal',NULL,'0.0000000000',NULL), (376,'Precious Collectables','Wang','Yang','0452-076555','Hauptstr. 29',NULL,'Bern',NULL,'3012','Switzerland',1702,'0.0000000000','EMEA'), (379,'Collectables For Less Inc.','Nelson','Allen','6175558555','7825 Douglas Av.',NULL,'Brickhaven','MA','58339','USA',1188,'100.0000000000','NA'), (381,'Royale Belge','Cartrain','Pascale','(071) 23 67 2555','Boulevard Tirou, 255',NULL,'Charleroi',NULL,'B-6000','Belgium',1401,'100.0000000000','EMEA'), (382,'Salzburg Collectables','Pipps','Georg','6562-9555','Geislweg 14',NULL,'Salzburg',NULL,'5020','Austria',1401,'100.0000000000','EMEA'), (385,'Cruz & Sons Co.','Cruz','Arnold','+63 2 555 3587','15 McCallum Street - NatWest Center #13-03',NULL,'Makati City',NULL,'1227 MM','Philippines',1621,'100.0000000000','Japan'), (386,'L\'ordine Souveniers','Moroni','Maurizio','0522-556555','Strada Provinciale 124',NULL,'Reggio Emilia',NULL,'42100','Italy',1401,'100.0000000000','EMEA'), (398,'Tokyo Collectables, Ltd','Shimamura','Akiko','+81 3 3584 0555','2-2-8 Roppongi',NULL,'Minato-ku','Tokyo','106-0032','Japan',1621,'100.0000000000','Japan'), (406,'Auto Canal+ Petit','Perrier','Dominique','(1) 47.55.6555','25, rue Lauriston',NULL,'Paris',NULL,'75016','France',1337,'100.0000000000','EMEA'), (409,'Stuttgart Collectable Exchange','Mu00fcller','Rita','0711-555361','Adenauerallee 900',NULL,'Stuttgart',NULL,'70563','Germany',NULL,'0.0000000000',NULL), (412,'Extreme Desk Decorations, Ltd','McRoy','Sarah','04 499 9555','101 Lambton Quay','Level 11','Wellington',NULL,'','New Zealand',1612,'100.0000000000','APAC'), (415,'Bavarian Collectables Imports, Co.','Donnermeyer','Michael',' +49 89 61 08 9555','Hansastr. 15',NULL,'Munich',NULL,'80686','Germany',1504,'100.0000000000','EMEA'), (424,'Classic Legends Inc.','Hernandez','Maria','2125558493','5905 Pompton St.','Suite 750','NYC','NY','10022','USA',1286,'100.0000000000','NA'), (443,'Feuer Online Stores, Inc','Feuer','Alexander','0342-555176','Heerstr. 22',NULL,'Leipzig',NULL,'04179','Germany',NULL,'0.0000000000',NULL), (447,'Gift Ideas Corp.','Lewis','Dan','2035554407','2440 Pompton St.',NULL,'Glendale','CT','97561','USA',1323,'100.0000000000','NA'), (448,'Scandinavian Gift Ideas','Larsson','Maria','0695-34 6555','u00c5kergatan 24',NULL,'Bru00e4cke',NULL,'S-844 67','Sweden',1504,'100.0000000000','EMEA'), (450,'The Sharp Gifts Warehouse','Frick','Sue','4085553659','3086 Ingle Ln.',NULL,'San Jose','CA','94217','USA',1165,'100.0000000000','NA'), (452,'Mini Auto Werke','Mendel','Roland','7675-3555','Kirchgasse 6',NULL,'Graz',NULL,'8010','Austria',1401,'100.0000000000','EMEA'), (455,'Super Scale Inc.','Murphy','Leslie','2035559545','567 North Pendale Street',NULL,'New Haven','CT','97823','USA',1286,'100.0000000000','NA'), (456,'Microscale Inc.','Kuo','Kee','2125551957','5290 North Pendale Street','Suite 200','NYC','NY','10022','USA',1286,'100.0000000000','NA'), (458,'Corrida Auto Replicas, Ltd','Sommer','Martu00edn','(91) 555 22 82','C/ Araquil, 67',NULL,'Madrid',NULL,'28023','Spain',1702,'100.0000000000','EMEA'), (459,'Warburg Exchange','Ottlieb','Sven','0241-039123','Walserweg 21',NULL,'Aachen',NULL,'52066','Germany',NULL,'0.0000000000',NULL), (462,'FunGiftIdeas.com','Benitez','Violeta','5085552555','1785 First Street',NULL,'New Bedford','MA','50553','USA',1216,'100.0000000000','NA'), (465,'Anton Designs, Ltd.','Anton','Carmen','+34 913 728555','c/ Gobelas, 19-1 Urb. La Florida',NULL,'Madrid',NULL,'28023','Spain',NULL,'0.0000000000',NULL), (471,'Australian Collectables, Ltd','Connery','Sean','61-9-3844-6555','7 Allen Street',NULL,'Glen Waverly','Victoria','3150','Australia',1611,'100.0000000000','APAC'), (473,'Frau da Collezione','Ricotti','Franco','+39 022515555','20093 Cologno Monzese, via Alessandro Volta 16',NULL,'Milan',NULL,'','Italy',1401,'100.0000000000','EMEA'), (475,'West Coast Collectables Co.','Thompson','Steve','3105553722','3675 Furth Circle',NULL,'Burbank','CA','94019','USA',1166,'100.0000000000','NA'), (477,'Mit Vergnu00fcgen & Co.','Moos','Hanna','0621-08555','Forsterstr. 57',NULL,'Mannheim',NULL,'68306','Germany',NULL,'0.0000000000',NULL), (480,'Kremlin Collectables, Co.','Semenov','Alexander','+7 812 293 0521','2 Pobedy Square',NULL,'Saint Petersburg',NULL,'196143','Russia',NULL,'0.0000000000',NULL), (481,'Raanan Stores, Inc','Altagar,G M','Raanan','+ 972 9 959 8555','3 Hagalim Blv.,',NULL,'Herzlia',NULL,'47625','Israel',NULL,'0.0000000000',NULL), (484,'Iberia Gift Imports, Corp.','Roel','Josu00e9 Pedro','(95) 555 82 82','C/ Romero, 33',NULL,'Sevilla',NULL,'41101','Spain',1702,'100.0000000000','EMEA'), (486,'Motor Mint Distributors Inc.','Hernandez','Rosa','2155559857','11328 Douglas Av.',NULL,'Philadelphia','PA','71270','USA',1323,'100.0000000000','NA'), (487,'Signal Collectibles Ltd.','Taylor','Sue','4155554312','2793 Furth Circle',NULL,'Brisbane','CA','94217','USA',1165,'100.0000000000','NA'), (489,'Double Decker Gift Stores, Ltd','Hardy','Thomas','(171) 555-7555','120 Hanover Sq.',NULL,'London',NULL,'WA1 1DP','UK',1501,'100.0000000000','EMEA'), (495,'Diecast Collectables','Franco','Valarie','6175552555','6251 Ingle Ln.',NULL,'Boston','MA','51003','USA',1188,'100.0000000000','NA'), (496,'Kelly\'s Gift Shop','Snowden','Tony','+64 9 5555500','Arenales 1938 3\'A\'',NULL,'Auckland',NULL,'','New Zealand',1612,'100.0000000000','APAC'), (497,'Mike Tarallo Shop','Tarallo','Mike','+64 9 5555500','Arenales 1938 3','','Auckland','','','New Zealand',1612,'100.0000000000','APAC'), (498,'Madison Tarallo Shop','Tarallo','Mike','+64 9 5555500','Arenales 1938 3','','Auckland','','','New Zealand',1612,'100.0000000000','APAC'), (499,'Jane Tarallo Shop','Tarallo','Jane','+64 9 5555500','Arenales 1938 3','','Auckland','','','New Zealand',1612,'100.0000000000','APAC'), (500,'Sam Tarallo Shop','Tarallo','Sam','+64 9 5555500','Arenales 1938 3','','Auckland','','','New Zealand',1612,'100.0000000000','APAC'); /*!40000 ALTER TABLE `customer_w_ter` ENABLE KEYS */; -- -- Definition of table `customers` -- DROP TABLE IF EXISTS `customers`; CREATE TABLE `customers` ( `CUSTOMERNUMBER` int(11) NOT NULL default '0', `CUSTOMERNAME` varchar(50) collate latin1_general_cs NOT NULL default '', `CONTACTLASTNAME` varchar(50) collate latin1_general_cs NOT NULL default '', `CONTACTFIRSTNAME` varchar(50) collate latin1_general_cs NOT NULL default '', `PHONE` varchar(50) collate latin1_general_cs NOT NULL default '', `ADDRESSLINE1` varchar(50) collate latin1_general_cs NOT NULL default '', `ADDRESSLINE2` varchar(50) collate latin1_general_cs default NULL, `CITY` varchar(50) collate latin1_general_cs NOT NULL default '', `STATE` varchar(50) collate latin1_general_cs default NULL, `POSTALCODE` varchar(15) collate latin1_general_cs default NULL, `COUNTRY` varchar(50) collate latin1_general_cs NOT NULL default '', `SALESREPEMPLOYEENUMBER` int(11) default NULL, `CREDITLIMIT` decimal(17,0) default NULL, PRIMARY KEY (`CUSTOMERNUMBER`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_general_cs; -- -- Dumping data for table `customers` -- /*!40000 ALTER TABLE `customers` DISABLE KEYS */; INSERT INTO `customers` (`CUSTOMERNUMBER`,`CUSTOMERNAME`,`CONTACTLASTNAME`,`CONTACTFIRSTNAME`,`PHONE`,`ADDRESSLINE1`,`ADDRESSLINE2`,`CITY`,`STATE`,`POSTALCODE`,`COUNTRY`,`SALESREPEMPLOYEENUMBER`,`CREDITLIMIT`) VALUES (97,'Madison Inc','Madison','Tarallo','407-328-7511','1302 PONCE DE LEON BLVD',NULL,'ST AUGUSTINE','FL','32084','USA',1286,'210500'), (98,'Johnson Inc','Johnson','Wayne','123-456-7896','123 Sesame Street',NULL,'ST Cloud','FL','34769','USA',1286,'510500'), (99,'Tarallo Inc','Michael','Tarallo','407-328-7511','6338 Bordeaux Circle',NULL,'Sanford','FL','32771','USA',1286,'210500'), (100,'Audio Video \'R\' Us','Michael','Tarallo','328-123-7511','5950 Hazeltine National Dr',NULL,'Orlando','FL','32822','USA',1286,'200000'), (103,'Atelier graphique','Schmitt','Carine','40.32.2555','54, rue Royale',NULL,'Nantes',NULL,'44000','France',1370,'21000'), (112,'Signal Gift Stores','King','Sue','7025551838','8489 Strong St.',NULL,'Las Vegas','NV','83030','USA',1166,'71800'), (114,'Australian Collectors, Co.','Ferguson','Peter','03 9520 4555','636 St Kilda Road','Level 3','Melbourne','Victoria','3004','Australia',1611,'117300'), (119,'La Rochelle Gifts','Labrune','Janine','40.67.8555','67, rue des Cinquante Otages',NULL,'Nantes',NULL,'44000','France',1370,'118200'), (121,'Baane Mini Imports','Bergulfsen','Jonas','07-98 9555','Erling Skakkes gate 78',NULL,'Stavern',NULL,'4110','Norway',1504,'81700'), (124,'Mini Gifts Distributors Ltd.','Nelson','Valarie','4155551450','5677 Strong St.',NULL,'San Rafael','CA','97562','USA',1165,'210500'), (125,'Havel & Zbyszek Co','Piestrzeniewicz','Zbyszek','(26) 642-7555','ul. Filtrowa 68',NULL,'Warszawa',NULL,'01-012','Poland',NULL,'0'), (128,'Blauer See Auto, Co.','Keitel','Roland','+49 69 66 90 2555','Lyonerstr. 34',NULL,'Frankfurt',NULL,'60528','Germany',1504,'59700'), (129,'Mini Wheels Co.','Murphy','Julie','6505555787','5557 North Pendale Street',NULL,'San Francisco','CA','94217','USA',1165,'64600'), (131,'Land of Toys Inc.','Yu','Kwai','2125557818','897 Long Airport Avenue',NULL,'NYC','NY','10022','USA',1323,'114900'), (141,'Euro+ Shopping Channel','Freyre','Diego','(91) 555 94 44','C/ Moralzarzal, 86',NULL,'Madrid',NULL,'28034','Spain',1370,'227600'), (144,'Volvo Model Replicas, Co','Berglund','Christina','0921-12 3555','Berguvsvu00e4gen 8',NULL,'Luleu00e5',NULL,'S-958 22','Sweden',1504,'53100'), (145,'Danish Wholesale Imports','Petersen','Jytte','31 12 3555','Vinbu00e6ltet 34',NULL,'Kobenhavn',NULL,'1734','Denmark',1401,'83400'), (146,'Saveley & Henriot, Co.','Saveley','Mary','78.32.5555','2, rue du Commerce',NULL,'Lyon',NULL,'69004','France',1337,'123900'), (148,'Dragon Souveniers, Ltd.','Natividad','Eric','+65 221 7555','Bronz Sok., Bronz Apt. 3/6 Tesvikiye',NULL,'Singapore',NULL,'079903','Singapore',1621,'103800'), (151,'Muscle Machine Inc','Young','Jeff','2125557413','4092 Furth Circle','Suite 400','NYC','NY','10022','USA',1286,'138500'), (157,'Diecast Classics Inc.','Yu','Kyung','2155551555','7586 Pompton St.',NULL,'Allentown','PA','70267','USA',1216,'100600'), (161,'Technics Stores Inc.','Hirano','Juri','6505556809','9408 Furth Circle',NULL,'Burlingame','CA','94217','USA',1165,'84600'), (166,'Handji Gifts& Co','Victorino','Wendy','+65 224 1555','Village Close - 106 Linden Road Sandown','2nd Floor','Singapore',NULL,'069045','Singapore',1612,'97900'), (167,'Herkku Gifts','Oeztan','Veysel','+47 2267 3215','Drammen 121, PR 744 Sentrum',NULL,'Bergen',NULL,'N 5804','Norway',1504,'96800'), (168,'American Souvenirs Inc','Franco','Sue','2035557845','149 Spinnaker Dr.','Suite 101','New Haven','CT','97823','USA',1286,'0'), (169,'Porto Imports Co.','de Castro','Isabel','(1) 356-5555','Estrada da sau00fade n. 58',NULL,'Lisboa',NULL,'1756','Portugal',NULL,'0'), (171,'Daedalus Designs Imports','Rancu00e9','Martine','20.16.1555','184, chaussu00e9e de Tournai',NULL,'Lille',NULL,'59000','France',1370,'82900'), (172,'La Corne D\'abondance, Co.','Bertrand','Marie','(1) 42.34.2555','265, boulevard Charonne',NULL,'Paris',NULL,'75012','France',1337,'84300'), (173,'Cambridge Collectables Co.','Tseng','Kyung','6175555555','4658 Baden Av.',NULL,'Cambridge','MA','51247','USA',1188,'43400'), (175,'Gift Depot Inc.','King','Julie','2035552570','25593 South Bay Ln.',NULL,'Bridgewater','CT','97562','USA',1323,'84300'), (177,'Osaka Souveniers Co.','Kentary','Mory','+81 06 6342 5555','Dojima Avanza 4F, 1-6-20 Dojima, Kita-ku',NULL,'Osaka','Osaka',' 530-0003','Japan',1621,'81200'), (181,'Vitachrome Inc.','Frick','Michael','2125551500','2678 Kingston Rd.','Suite 101','NYC','NY','10022','USA',1286,'76400'), (186,'Toys of Finland, Co.','Karttunen','Matti','90-224 8555','Keskuskatu 45',NULL,'Helsinki',NULL,'21240','Finland',1501,'96500'), (187,'AV Stores, Co.','Ashworth','Victoria','(171) 555-1555','Fauntleroy Circus',NULL,'Manchester',NULL,'EC2 5NT','UK',1501,'136800'), (189,'Clover Collections, Co.','Cassidy','Dean','+353 1862 1555','25 Maiden Lane','Floor No. 4','Dublin',NULL,'2','Ireland',1504,'69400'), (198,'Auto-Moto Classics Inc.','Taylor','Leslie','6175558428','16780 Pompton St.',NULL,'Brickhaven','MA','58339','USA',1216,'23000'), (201,'UK Collectables, Ltd.','Devon','Elizabeth','(171) 555-2282','Berkeley Gardens 12 Brewery',NULL,'Liverpool',NULL,'WX1 6LT','UK',1501,'92700'), (202,'Canadian Gift Exchange Network','Tannamuri','Yoshi','(604) 555-3392','1900 Oak St.',NULL,'Vancouver','BC','V3F 2K1','Canada',1323,'90300'), (204,'Online Mini Collectables','Barajas','Miguel','6175557555','7635 Spinnaker Dr.',NULL,'Brickhaven','MA','58339','USA',1188,'68700'), (205,'Toys4GrownUps.com','Young','Julie','6265557265','78934 Hillside Dr.',NULL,'Pasadena','CA','90003','USA',1166,'90700'), (206,'Asian Shopping Network, Co','Walker','Brydey','+612 9411 1555','Penthouse Level, Suntec Tower Three, 8 Temasek',NULL,'Singapore',NULL,'038988','Singapore',NULL,'0'), (209,'Mini Caravy','Citeaux','Fru00e9du00e9rique','88.60.1555','24, place Klu00e9ber',NULL,'Strasbourg',NULL,'67000','France',1370,'53800'), (211,'King Kong Collectables, Co.','Sunwoo','Michael','+852 2251 1555','Bank of China Tower, 1 Garden Road','Level 25','Central Hong Kong',NULL,'','Hong Kong',1621,'58600'), (216,'Enaco Distributors','Saavedra','Eduardo','(93) 203 4555','Rambla de Cataluu00f1a, 23',NULL,'Barcelona',NULL,'08022','Spain',1702,'60300'), (219,'Boards & Toys Co.','Young','Leslie','3105552373','4097 Douglas Av.',NULL,'Glendale','CA','92561','USA',1166,'11000'), (223,'Natu00fcrlich Autos','Kloss','Horst','0372-555188','Taucherstrau00dfe 10',NULL,'Cunewalde',NULL,'01307','Germany',NULL,'0'), (227,'Heintze Collectables','Ibsen','Palle','86 21 3555','Smagsloget 45',NULL,'u00c5rhus',NULL,'8200','Denmark',1401,'120800'), (233,'Quu00e9bec Home Shopping Network','Fresniu00e8re','Jean','(514) 555-8054','43 rue St. Laurent',NULL,'Montru00e9al','Quu00e9bec','H1J 1C3','Canada',1286,'48700'), (237,'ANG Resellers','Camino','Alejandra','(91) 745 6555','Gran Vu00eda, 1',NULL,'Madrid',NULL,'28001','Spain',NULL,'0'), (239,'Collectable Mini Designs Co.','Thompson','Valarie','7605558146','361 Furth Circle',NULL,'San Diego','CA','91217','USA',1166,'105000'), (240,'giftsbymail.co.uk','Bennett','Helen','(198) 555-8888','Garden House Crowther Way',NULL,'Cowes','Isle of Wight','PO31 7PJ','UK',1501,'93900'), (242,'Alpha Cognac','Roulet','Annette','61.77.6555','1 rue Alsace-Lorraine',NULL,'Toulouse',NULL,'31000','France',1370,'61100'), (247,'Messner Shopping Network','Messner','Renate','069-0555984','Magazinweg 7',NULL,'Frankfurt',NULL,'60528','Germany',NULL,'0'), (249,'Amica Models & Co.','Accorti','Paolo','011-4988555','Via Monte Bianco 34',NULL,'Torino',NULL,'10100','Italy',1401,'113000'), (250,'Lyon Souveniers','Da Cunha','Daniel','+33 1 46 62 7555','27 rue du Colonel Pierre Avia',NULL,'Paris',NULL,'75508','France',1337,'68100'), (256,'Auto Associu00e9s & Cie.','Tonini','Daniel','30.59.8555','67, avenue de l\'Europe',NULL,'Versailles',NULL,'78000','France',1370,'77900'), (259,'Toms Spezialitu00e4ten, Ltd','Pfalzheim','Henriette','0221-5554327','Mehrheimerstr. 369',NULL,'Ku00f6ln',NULL,'50739','Germany',1504,'120400'), (260,'Royal Canadian Collectables, Ltd.','Lincoln','Elizabeth','(604) 555-4555','23 Tsawassen Blvd.',NULL,'Tsawassen','BC','T2F 8M4','Canada',1323,'89600'), (273,'Franken Gifts, Co','Franken','Peter','089-0877555','Berliner Platz 43',NULL,'Mu00fcnchen',NULL,'80805','Germany',NULL,'0'), (276,'Anna\'s Decorations, Ltd','O\'Hara','Anna','02 9936 8555','201 Miller Street','Level 15','North Sydney','NSW','2060','Australia',1611,'107800'), (278,'Rovelli Gifts','Rovelli','Giovanni','035-640555','Via Ludovico il Moro 22',NULL,'Bergamo',NULL,'24100','Italy',1401,'119600'), (282,'Souveniers And Things Co.','Huxley','Adrian','+61 2 9495 8555','Monitor Money Building, 815 Pacific Hwy','Level 6','Chatswood','NSW','2067','Australia',1611,'93300'), (286,'Marta\'s Replicas Co.','Hernandez','Marta','6175558555','39323 Spinnaker Dr.',NULL,'Cambridge','MA','51247','USA',1216,'123700'), (293,'BG&E Collectables','Pon','Ed','+41 26 425 50 01','Rte des Arsenaux 41',NULL,'Fribourg',NULL,'1700','Switzerland',NULL,'0'), (298,'Vida Sport, Ltd','Holz','Michael','0897-034555','Grenzacherweg 237',NULL,'Genu00e8ve',NULL,'1203','Switzerland',1702,'141300'), (299,'Norway Gifts By Mail, Co.','Klaeboe','Jan','+47 2212 1555','Drammensveien 126 A, PB 744 Sentrum',NULL,'Oslo',NULL,'N 0106','Norway',1504,'95100'), (303,'Schuyler Imports','Schuyler','Bradley','+31 20 491 9555','Kingsfordweg 151',NULL,'Amsterdam',NULL,'1043 GR','Netherlands',NULL,'0'), (307,'Der Hund Imports','Anders','Maria','030-0074555','Obere Str. 57',NULL,'Berlin',NULL,'12209','Germany',NULL,'0'), (311,'Oulu Toy Supplies, Inc.','Koskitalo','Pirkko','981-443655','Torikatu 38',NULL,'Oulu',NULL,'90110','Finland',1501,'90500'), (314,'Petit Auto','Dewey','Catherine','(02) 5554 67','Rue Joseph-Bens 532',NULL,'Bruxelles',NULL,'B-1180','Belgium',1401,'79900'), (319,'Mini Classics','Frick','Steve','9145554562','3758 North Pendale Street',NULL,'White Plains','NY','24067','USA',1323,'102700'), (320,'Mini Creations Ltd.','Tam','Wing C','5085559555','4575 Hillside Dr.',NULL,'New Bedford','MA','50553','USA',1188,'94500'), (321,'Corporate Gift Ideas Co.','Brown','Julie','6505551386','7734 Strong St.',NULL,'San Francisco','CA','94217','USA',1165,'105000'), (323,'Down Under Souveniers, Inc','Graham','Mike','+64 9 312 5555','162-164 Grafton Road','Level 2','Auckland',NULL,'','New Zealand',1612,'88000'), (324,'Stylish Desk Decors, Co.','Brown','Ann','(171) 555-0297','35 King George',NULL,'London',NULL,'WX3 6FW','UK',1501,'77000'), (328,'Tekni Collectables Inc.','Brown','William','2015559350','7476 Moss Rd.',NULL,'Newark','NJ','94019','USA',1323,'44100'), (333,'Australian Gift Network, Co','Calaghan','Tony','61-7-3844-6555','31 Duncan St. West End',NULL,'South Brisbane','Queensland','4101','Australia',1611,'51600'), (334,'Suominen Souveniers','Suominen','Kalle','+358 9 8045 555','Software Engineering Center, SEC Oy',NULL,'Espoo',NULL,'FIN-02271','Finland',1501,'98800'), (335,'Cramer Spezialitu00e4ten, Ltd','Cramer','Philip','0555-09555','Maubelstr. 90',NULL,'Brandenburg',NULL,'14776','Germany',NULL,'0'), (339,'Classic Gift Ideas, Inc','Cervantes','Francisca','2155554695','782 First Street',NULL,'Philadelphia','PA','71270','USA',1188,'81100'), (344,'CAF Imports','Fernandez','Jesus','+34 913 728 555','Merchants House, 27-30 Merchant\'s Quay',NULL,'Madrid',NULL,'28023','Spain',1702,'59600'), (347,'Men \'R\' US Retailers, Ltd.','Chandler','Michael','2155554369','6047 Douglas Av.',NULL,'Los Angeles','CA','91003','USA',1166,'57700'), (348,'Asian Treasures, Inc.','McKenna','Patricia','2967 555','8 Johnstown Road',NULL,'Cork','Co. Cork',NULL,'Ireland',NULL,'0'), (350,'Marseille Mini Autos','Lebihan','Laurence','91.24.4555','12, rue des Bouchers',NULL,'Marseille',NULL,'13008','France',1337,'65000'), (353,'Reims Collectables','Henriot','Paul','26.47.1555','59 rue de l\'Abbaye',NULL,'Reims',NULL,'51100','France',1337,'81100'), (356,'SAR Distributors, Co','Kuger','Armand','+27 21 550 3555','Century City-Montague Gardens PO Box 37177',NULL,'Chempet',NULL,' 7442','South Africa',NULL,'0'), (357,'GiftsForHim.com','MacKinlay','Wales','64-9-3763555','199 Great North Road',NULL,'Auckland',NULL,'','New Zealand',1612,'77700'), (361,'Kommission Auto','Josephs','Karin','0251-555259','Luisenstr. 48',NULL,'Mu00fcnster',NULL,'44087','Germany',NULL,'0'), (362,'Gifts4AllAges.com','Yoshido','Juri','6175559555','8616 Spinnaker Dr.',NULL,'Boston','MA','51003','USA',1216,'41900'), (363,'Online Diecast Creations Co.','Young','Valarie','6035558647','2304 Long Airport Avenue',NULL,'Nashua','NH','62005','USA',1216,'114200'), (369,'Lisboa Souveniers, Inc','Rodriguez','Lino','(1) 354-2555','Jardim das rosas n. 32',NULL,'Lisboa',NULL,'1675','Portugal',NULL,'0'), (376,'Precious Collectables','Wang','Yang','0452-076555','Hauptstr. 29',NULL,'Bern',NULL,'3012','Switzerland',1702,'0'), (379,'Collectables For Less Inc.','Nelson','Allen','6175558555','7825 Douglas Av.',NULL,'Brickhaven','MA','58339','USA',1188,'70700'), (381,'Royale Belge','Cartrain','Pascale','(071) 23 67 2555','Boulevard Tirou, 255',NULL,'Charleroi',NULL,'B-6000','Belgium',1401,'23500'), (382,'Salzburg Collectables','Pipps','Georg','6562-9555','Geislweg 14',NULL,'Salzburg',NULL,'5020','Austria',1401,'71700'), (385,'Cruz & Sons Co.','Cruz','Arnold','+63 2 555 3587','15 McCallum Street - NatWest Center #13-03',NULL,'Makati City',NULL,'1227 MM','Philippines',1621,'81500'), (386,'L\'ordine Souveniers','Moroni','Maurizio','0522-556555','Strada Provinciale 124',NULL,'Reggio Emilia',NULL,'42100','Italy',1401,'121400'), (398,'Tokyo Collectables, Ltd','Shimamura','Akiko','+81 3 3584 0555','2-2-8 Roppongi',NULL,'Minato-ku','Tokyo','106-0032','Japan',1621,'94400'), (406,'Auto Canal+ Petit','Perrier','Dominique','(1) 47.55.6555','25, rue Lauriston',NULL,'Paris',NULL,'75016','France',1337,'95000'), (409,'Stuttgart Collectable Exchange','Mu00fcller','Rita','0711-555361','Adenauerallee 900',NULL,'Stuttgart',NULL,'70563','Germany',NULL,'0'), (412,'Extreme Desk Decorations, Ltd','McRoy','Sarah','04 499 9555','101 Lambton Quay','Level 11','Wellington',NULL,'','New Zealand',1612,'86800'), (415,'Bavarian Collectables Imports, Co.','Donnermeyer','Michael',' +49 89 61 08 9555','Hansastr. 15',NULL,'Munich',NULL,'80686','Germany',1504,'77000'), (424,'Classic Legends Inc.','Hernandez','Maria','2125558493','5905 Pompton St.','Suite 750','NYC','NY','10022','USA',1286,'67500'), (443,'Feuer Online Stores, Inc','Feuer','Alexander','0342-555176','Heerstr. 22',NULL,'Leipzig',NULL,'04179','Germany',NULL,'0'), (447,'Gift Ideas Corp.','Lewis','Dan','2035554407','2440 Pompton St.',NULL,'Glendale','CT','97561','USA',1323,'49700'), (448,'Scandinavian Gift Ideas','Larsson','Maria','0695-34 6555','u00c5kergatan 24',NULL,'Bru00e4cke',NULL,'S-844 67','Sweden',1504,'116400'), (450,'The Sharp Gifts Warehouse','Frick','Sue','4085553659','3086 Ingle Ln.',NULL,'San Jose','CA','94217','USA',1165,'77600'), (452,'Mini Auto Werke','Mendel','Roland','7675-3555','Kirchgasse 6',NULL,'Graz',NULL,'8010','Austria',1401,'45300'), (455,'Super Scale Inc.','Murphy','Leslie','2035559545','567 North Pendale Street',NULL,'New Haven','CT','97823','USA',1286,'95400'), (456,'Microscale Inc.','Kuo','Kee','2125551957','5290 North Pendale Street','Suite 200','NYC','NY','10022','USA',1286,'39800'), (458,'Corrida Auto Replicas, Ltd','Sommer','Martu00edn','(91) 555 22 82','C/ Araquil, 67',NULL,'Madrid',NULL,'28023','Spain',1702,'104600'), (459,'Warburg Exchange','Ottlieb','Sven','0241-039123','Walserweg 21',NULL,'Aachen',NULL,'52066','Germany',NULL,'0'), (462,'FunGiftIdeas.com','Benitez','Violeta','5085552555','1785 First Street',NULL,'New Bedford','MA','50553','USA',1216,'85800'), (465,'Anton Designs, Ltd.','Anton','Carmen','+34 913 728555','c/ Gobelas, 19-1 Urb. La Florida',NULL,'Madrid',NULL,'28023','Spain',NULL,'0'), (471,'Australian Collectables, Ltd','Connery','Sean','61-9-3844-6555','7 Allen Street',NULL,'Glen Waverly','Victoria','3150','Australia',1611,'60300'), (473,'Frau da Collezione','Ricotti','Franco','+39 022515555','20093 Cologno Monzese, via Alessandro Volta 16',NULL,'Milan',NULL,'','Italy',1401,'34800'), (475,'West Coast Collectables Co.','Thompson','Steve','3105553722','3675 Furth Circle',NULL,'Burbank','CA','94019','USA',1166,'55400'), (477,'Mit Vergnu00fcgen & Co.','Moos','Hanna','0621-08555','Forsterstr. 57',NULL,'Mannheim',NULL,'68306','Germany',NULL,'0'), (480,'Kremlin Collectables, Co.','Semenov','Alexander','+7 812 293 0521','2 Pobedy Square',NULL,'Saint Petersburg',NULL,'196143','Russia',NULL,'0'), (481,'Raanan Stores, Inc','Altagar,G M','Raanan','+ 972 9 959 8555','3 Hagalim Blv.,',NULL,'Herzlia',NULL,'47625','Israel',NULL,'0'), (484,'Iberia Gift Imports, Corp.','Roel','Josu00e9 Pedro','(95) 555 82 82','C/ Romero, 33',NULL,'Sevilla',NULL,'41101','Spain',1702,'65700'), (486,'Motor Mint Distributors Inc.','Hernandez','Rosa','2155559857','11328 Douglas Av.',NULL,'Philadelphia','PA','71270','USA',1323,'72600'), (487,'Signal Collectibles Ltd.','Taylor','Sue','4155554312','2793 Furth Circle',NULL,'Brisbane','CA','94217','USA',1165,'60300'), (489,'Double Decker Gift Stores, Ltd','Hardy','Thomas','(171) 555-7555','120 Hanover Sq.',NULL,'London',NULL,'WA1 1DP','UK',1501,'43300'), (495,'Diecast Collectables','Franco','Valarie','6175552555','6251 Ingle Ln.',NULL,'Boston','MA','51003','USA',1188,'85100'), (496,'Kelly\'s Gift Shop','Snowden','Tony','+64 9 5555500','Arenales 1938 3\'A\'',NULL,'Auckland',NULL,'','New Zealand',1612,'110000'); /*!40000 ALTER TABLE `customers` ENABLE KEYS */; -- -- Definition of table `department_managers` -- DROP TABLE IF EXISTS `department_managers`; CREATE TABLE `department_managers` ( `REGION` varchar(50) collate latin1_general_cs NOT NULL default '', `MANAGER_NAME` varchar(50) collate latin1_general_cs NOT NULL default '', `EMAIL` varchar(50) collate latin1_general_cs default NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_general_cs; -- -- Dumping data for table `department_managers` -- /*!40000 ALTER TABLE `department_managers` DISABLE KEYS */; INSERT INTO `department_managers` (`REGION`,`MANAGER_NAME`,`EMAIL`) VALUES ('Central','Joe Pentaho','mtarallo@localhost'), ('Eastern','Suzy Pentaho','email2@localhost'), ('Western','Pat Pentaho','mtarallo@localhost'), ('Southern','Tiffany Pentaho','email2@localhost'); /*!40000 ALTER TABLE `department_managers` ENABLE KEYS */; -- -- Definition of table `employees` -- DROP TABLE IF EXISTS `employees`; CREATE TABLE `employees` ( `EMPLOYEENUMBER` int(11) NOT NULL default '0', `LASTNAME` varchar(50) collate latin1_general_cs NOT NULL default '', `FIRSTNAME` varchar(50) collate latin1_general_cs NOT NULL default '', `EXTENSION` varchar(10) collate latin1_general_cs NOT NULL default '', `EMAIL` varchar(100) collate latin1_general_cs NOT NULL default '', `OFFICECODE` varchar(20) collate latin1_general_cs NOT NULL default '', `REPORTSTO` int(11) default NULL, `JOBTITLE` varchar(50) collate latin1_general_cs NOT NULL default '', PRIMARY KEY (`EMPLOYEENUMBER`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_general_cs; -- -- Dumping data for table `employees` -- /*!40000 ALTER TABLE `employees` DISABLE KEYS */; INSERT INTO `employees` (`EMPLOYEENUMBER`,`LASTNAME`,`FIRSTNAME`,`EXTENSION`,`EMAIL`,`OFFICECODE`,`REPORTSTO`,`JOBTITLE`) VALUES (1002,'Murphy','Diane','x5800','dmurphy@classicmodelcars.com','1',NULL,'President'), (1056,'Patterson','Mary','x4611','mpatterso@classicmodelcars.com','1',1002,'VP Sales'), (1076,'Firrelli','Jeff','x9273','jfirrelli@classicmodelcars.com','1',1002,'VP Marketing'), (1088,'Patterson','William','x4871','wpatterson@classicmodelcars.com','6',1056,'Sales Manager (JAPAN, APAC)'), (1102,'Bondur','Gerard','x5408','athompson@classicmodelcars.com','4',1056,'Sale Manager (EMEA)'), (1143,'Bow','Anthony','x5428','bhoward@classicmodelcars.com','1',1056,'Sales Manager (NA)'), (1165,'Jennings','Leslie','x3291','ljennings@classicmodelcars.com','1',1143,'Sales Rep'), (1166,'Thompson','Leslie','x4065','lthompson@classicmodelcars.com','1',1143,'Sales Rep'), (1188,'Firrelli','Julie','x2173','jfirrelli@classicmodelcars.com','2',1143,'Sales Rep'), (1216,'Patterson','Steve','x4334','spatterso@classicmodelcars.com','2',1143,'Sales Rep'), (1286,'Tseng','Foon Yue','x2248','ftseng@classicmodelcars.com','3',1143,'Sales Rep'), (1323,'Vanauf','George','x4102','gvanauf@classicmodelcars.com','3',1143,'Sales Rep'), (1337,'Bondur','Loui','x6493','lbondur@classicmodelcars.com','4',1102,'Sales Rep'), (1370,'Hernandez','Gerard','x2028','ghernande@classicmodelcars.com','4',1102,'Sales Rep'), (1401,'Castillo','Pamela','x2759','pcastillo@classicmodelcars.com','4',1102,'Sales Rep'), (1501,'Bott','Larry','x2311','lbott@classicmodelcars.com','7',1102,'Sales Rep'), (1504,'Jones','Barry','x102','bjones@classicmodelcars.com','7',1102,'Sales Rep'), (1611,'Fixter','Andy','x101','afixter@classicmodelcars.com','6',1088,'Sales Rep'), (1612,'Marsh','Peter','x102','pmarsh@classicmodelcars.com','6',1088,'Sales Rep'), (1619,'King','Tom','x103','tking@classicmodelcars.com','6',1088,'Sales Rep'), (1621,'Nishi','Mami','x101','mnishi@classicmodelcars.com','5',1088,'Sales Rep'), (1625,'Kato','Yoshimi','x102','ekato@classicmodelcars.com','5',1088,'Sales Rep'), (1702,'Gerard','Martin','x2312','gmartin@classicmodelcars.com','4',1102,'Sales Rep'); /*!40000 ALTER TABLE `employees` ENABLE KEYS */; -- -- Definition of table `offices` -- DROP TABLE IF EXISTS `offices`; CREATE TABLE `offices` ( `OFFICECODE` varchar(50) collate latin1_general_cs NOT NULL default '', `CITY` varchar(50) collate latin1_general_cs NOT NULL default '', `PHONE` varchar(50) collate latin1_general_cs NOT NULL default '', `ADDRESSLINE1` varchar(50) collate latin1_general_cs NOT NULL default '', `ADDRESSLINE2` varchar(50) collate latin1_general_cs default NULL, `STATE` varchar(50) collate latin1_general_cs default NULL, `COUNTRY` varchar(50) collate latin1_general_cs NOT NULL default '', `POSTALCODE` varchar(10) collate latin1_general_cs NOT NULL default '', `TERRITORY` varchar(10) collate latin1_general_cs NOT NULL default '', PRIMARY KEY (`OFFICECODE`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_general_cs; -- -- Dumping data for table `offices` -- /*!40000 ALTER TABLE `offices` DISABLE KEYS */; INSERT INTO `offices` (`OFFICECODE`,`CITY`,`PHONE`,`ADDRESSLINE1`,`ADDRESSLINE2`,`STATE`,`COUNTRY`,`POSTALCODE`,`TERRITORY`) VALUES ('1','San Francisco','+1 650 219 4782','100 Market Street','Suite 300','CA','USA','94080','NA'), ('2','Boston','+1 215 837 0825','1550 Court Place','Suite 102','MA','USA','02107','NA'), ('3','NYC','+1 212 555 3000','523 East 53rd Street','apt. 5A','NY','USA','10022','NA'), ('4','Paris','+33 14 723 4404','43 Rue Jouffroy D\'abbans',NULL,'','France','75017','EMEA'), ('5','Tokyo','+81 33 224 5000','4-1 Kioicho',NULL,'Chiyoda-Ku','Japan','102-8578','Japan'), ('6','Sydney','+61 2 9264 2451','5-11 Wentworth Avenue','Floor #2',NULL,'Australia','NSW 2010','APAC'), ('7','London','+44 20 7877 2041','25 Old Broad Street','Level 7',NULL,'UK','EC2N 1HN','EMEA'); /*!40000 ALTER TABLE `offices` ENABLE KEYS */; -- -- Definition of table `orderdetails` -- DROP TABLE IF EXISTS `orderdetails`; CREATE TABLE `orderdetails` ( `ORDERNUMBER` int(11) NOT NULL default '0', `PRODUCTCODE` varchar(50) collate latin1_general_cs NOT NULL default '', `QUANTITYORDERED` int(11) NOT NULL default '0', `PRICEEACH` decimal(17,0) NOT NULL default '0', `ORDERLINENUMBER` smallint(6) NOT NULL default '0', PRIMARY KEY (`ORDERNUMBER`,`PRODUCTCODE`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_general_cs; -- -- Dumping data for table `orderdetails` -- /*!40000 ALTER TABLE `orderdetails` DISABLE KEYS */; INSERT INTO `orderdetails` (`ORDERNUMBER`,`PRODUCTCODE`,`QUANTITYORDERED`,`PRICEEACH`,`ORDERLINENUMBER`) VALUES (10100,'S18_1749',30,'172',3), (10100,'S18_2248',50,'68',2), (10100,'S18_4409',22,'87',4), (10100,'S24_3969',49,'34',1), (10101,'S18_2325',25,'151',4), (10101,'S18_2795',26,'145',1), (10101,'S24_1937',45,'31',3), (10101,'S24_2022',46,'54',2), (10102,'S18_1342',39,'123',2), (10102,'S18_1367',41,'50',1), (10103,'S10_1949',26,'208',11), (10103,'S10_4962',42,'129',4), (10103,'S12_1666',27,'126',8), (10103,'S18_1097',35,'112',10), (10103,'S18_2432',22,'54',2), (10103,'S18_2949',27,'83',12), (10103,'S18_2957',35,'57',14), (10103,'S18_3136',25,'102',13), (10103,'S18_3320',46,'104',16), (10103,'S18_4600',36,'117',5), (10103,'S18_4668',41,'47',9), (10103,'S24_2300',36,'102',1), (10103,'S24_4258',25,'115',15), (10103,'S32_1268',31,'104',3), (10103,'S32_3522',45,'76',7), (10103,'S700_2824',42,'106',6), (10104,'S12_3148',34,'175',1), (10104,'S12_4473',41,'113',9), (10104,'S18_2238',24,'144',8), (10104,'S18_2319',29,'130',12), (10104,'S18_3232',23,'198',13), (10104,'S18_4027',38,'141',3), (10104,'S24_1444',35,'55',6), (10104,'S24_2840',44,'40',10), (10104,'S24_4048',26,'112',5), (10104,'S32_2509',35,'48',11), (10104,'S32_3207',49,'66',4), (10104,'S50_1392',33,'112',7), (10104,'S50_1514',32,'53',2), (10105,'S10_4757',50,'144',2), (10105,'S12_1108',41,'212',15), (10105,'S12_3891',29,'157',14), (10105,'S18_3140',22,'139',11), (10105,'S18_3259',38,'114',13), (10105,'S18_4522',41,'83',10), (10105,'S24_2011',43,'147',9), (10105,'S24_3151',44,'73',4), (10105,'S24_3816',50,'80',1), (10105,'S700_1138',41,'71',5), (10105,'S700_1938',29,'70',12), (10105,'S700_2610',31,'66',3), (10105,'S700_3505',39,'81',6), (10105,'S700_3962',22,'116',7), (10105,'S72_3212',25,'57',8), (10106,'S18_1662',36,'147',12), (10106,'S18_2581',34,'90',2), (10106,'S18_3029',41,'83',18), (10106,'S18_3856',41,'116',17), (10106,'S24_1785',28,'89',4), (10106,'S24_2841',49,'75',13), (10106,'S24_3420',31,'53',14), (10106,'S24_3949',50,'65',11), (10106,'S24_4278',26,'64',3), (10106,'S32_4289',33,'73',5), (10106,'S50_1341',39,'40',6), (10106,'S700_1691',31,'107',7), (10106,'S700_2047',30,'106',16), (10106,'S700_2466',34,'111',9), (10106,'S700_2834',32,'125',1), (10106,'S700_3167',44,'74',8), (10106,'S700_4002',48,'61',10), (10106,'S72_1253',48,'53',15), (10107,'S10_1678',30,'96',2), (10107,'S10_2016',39,'100',5), (10107,'S10_4698',27,'225',4), (10107,'S12_2823',21,'145',1), (10107,'S18_2625',29,'71',6), (10107,'S24_1578',25,'114',3), (10107,'S24_2000',38,'83',7), (10107,'S32_1374',20,'93',8), (10108,'S12_1099',33,'160',6), (10108,'S12_3380',45,'136',4), (10108,'S12_3990',39,'89',7), (10108,'S12_4675',36,'104',3), (10108,'S18_1889',38,'82',2), (10108,'S18_3278',26,'68',9), (10108,'S18_3482',29,'140',8), (10108,'S18_3782',43,'68',12), (10108,'S18_4721',44,'126',11), (10108,'S24_2360',35,'59',15), (10108,'S24_3371',30,'63',5), (10108,'S24_3856',40,'136',1), (10108,'S24_4620',31,'69',10), (10108,'S32_2206',27,'43',13), (10108,'S32_4485',31,'118',16), (10108,'S50_4713',34,'83',14), (10109,'S18_1129',26,'168',4), (10109,'S18_1984',38,'117',3), (10109,'S18_2870',26,'121',1), (10109,'S18_3232',46,'180',5), (10109,'S18_3685',47,'133',2), (10109,'S24_2972',29,'32',6), (10110,'S18_1589',37,'147',16), (10110,'S18_1749',42,'145',7), (10110,'S18_2248',32,'50',6), (10110,'S18_2325',33,'117',4), (10110,'S18_2795',31,'164',1), (10110,'S18_4409',28,'89',8), (10110,'S18_4933',42,'61',9), (10110,'S24_1046',36,'85',13), (10110,'S24_1628',29,'59',15), (10110,'S24_1937',20,'36',3), (10110,'S24_2022',39,'44',2), (10110,'S24_2766',43,'78',11), (10110,'S24_2887',46,'129',10), (10110,'S24_3191',27,'74',12), (10110,'S24_3432',37,'101',14), (10110,'S24_3969',48,'34',5), (10111,'S18_1342',33,'100',6), (10111,'S18_1367',48,'49',5), (10111,'S18_2957',28,'64',2), (10111,'S18_3136',43,'112',1), (10111,'S18_3320',39,'107',4), (10111,'S24_4258',26,'87',3), (10112,'S10_1949',29,'249',1), (10112,'S18_2949',23,'110',2), (10113,'S12_1666',21,'163',2), (10113,'S18_1097',49,'100',4), (10113,'S18_4668',50,'50',3), (10113,'S32_3522',23,'69',1), (10114,'S10_4962',31,'139',8), (10114,'S18_2319',39,'107',3), (10114,'S18_2432',45,'69',6), (10114,'S18_3232',48,'171',4), (10114,'S18_4600',41,'117',9), (10114,'S24_2300',21,'139',5), (10114,'S24_2840',24,'30',1), (10114,'S32_1268',32,'115',7), (10114,'S32_2509',28,'56',2), (10114,'S700_2824',42,'113',10), (10115,'S12_4473',46,'124',5), (10115,'S18_2238',46,'160',4), (10115,'S24_1444',47,'69',2), (10115,'S24_4048',44,'127',1), (10115,'S50_1392',27,'105',3), (10116,'S32_3207',27,'63',1), (10117,'S12_1108',33,'183',9), (10117,'S12_3148',43,'137',10), (10117,'S12_3891',39,'152',8), (10117,'S18_3140',26,'137',5), (10117,'S18_3259',21,'96',7), (10117,'S18_4027',22,'126',12), (10117,'S18_4522',23,'97',4), (10117,'S24_2011',41,'127',3), (10117,'S50_1514',21,'49',11), (10117,'S700_1938',38,'80',6), (10117,'S700_3962',45,'83',1), (10117,'S72_3212',50,'44',2), (10118,'S700_3505',36,'117',1), (10119,'S10_4757',46,'109',11), (10119,'S18_1662',43,'161',3), (10119,'S18_3029',21,'89',9), (10119,'S18_3856',27,'100',8), (10119,'S24_2841',41,'60',4), (10119,'S24_3151',35,'88',13), (10119,'S24_3420',20,'73',5), (10119,'S24_3816',35,'91',10), (10119,'S24_3949',28,'70',2), (10119,'S700_1138',25,'77',14), (10119,'S700_2047',29,'94',7), (10119,'S700_2610',38,'66',12), (10119,'S700_4002',26,'59',1), (10119,'S72_1253',28,'48',6), (10120,'S10_2016',29,'96',3), (10120,'S10_4698',46,'201',2), (10120,'S18_2581',29,'72',8), (10120,'S18_2625',46,'58',4), (10120,'S24_1578',35,'98',1), (10120,'S24_1785',39,'119',10), (10120,'S24_2000',34,'84',5), (10120,'S24_4278',29,'85',9), (10120,'S32_1374',22,'112',6), (10120,'S32_4289',29,'72',11), (10120,'S50_1341',49,'51',12), (10120,'S700_1691',47,'82',13), (10120,'S700_2466',24,'108',15), (10120,'S700_2834',24,'142',7), (10120,'S700_3167',43,'76',14), (10121,'S10_1678',34,'81',5), (10121,'S12_2823',50,'166',4), (10121,'S24_2360',32,'77',2), (10121,'S32_4485',25,'87',3), (10121,'S50_4713',44,'75',1), (10122,'S12_1099',42,'181',10), (10122,'S12_3380',37,'100',8), (10122,'S12_3990',32,'64',11), (10122,'S12_4675',20,'107',7), (10122,'S18_1129',34,'147',2), (10122,'S18_1889',43,'72',6), (10122,'S18_1984',31,'132',1), (10122,'S18_3232',25,'144',3), (10122,'S18_3278',21,'73',13), (10122,'S18_3482',21,'118',12), (10122,'S18_3782',35,'50',16), (10122,'S18_4721',28,'128',15), (10122,'S24_2972',39,'31',4), (10122,'S24_3371',34,'50',9), (10122,'S24_3856',43,'128',5), (10122,'S24_4620',29,'71',14), (10122,'S32_2206',31,'45',17), (10123,'S18_1589',26,'118',2), (10123,'S18_2870',46,'112',3), (10123,'S18_3685',34,'157',4), (10123,'S24_1628',50,'60',1), (10124,'S18_1749',21,'136',6), (10124,'S18_2248',42,'54',5), (10124,'S18_2325',42,'106',3), (10124,'S18_4409',36,'86',7), (10124,'S18_4933',23,'58',8), (10124,'S24_1046',22,'78',12), (10124,'S24_1937',45,'38',2), (10124,'S24_2022',22,'45',1), (10124,'S24_2766',32,'73',10), (10124,'S24_2887',25,'94',9), (10124,'S24_3191',49,'83',11), (10124,'S24_3432',43,'121',13), (10124,'S24_3969',46,'33',4), (10125,'S18_1342',32,'102',1), (10125,'S18_2795',34,'191',2), (10126,'S10_1949',38,'193',11), (10126,'S10_4962',22,'152',4), (10126,'S12_1666',21,'116',8), (10126,'S18_1097',38,'102',10), (10126,'S18_1367',42,'55',17), (10126,'S18_2432',43,'65',2), (10126,'S18_2949',31,'90',12), (10126,'S18_2957',46,'74',14), (10126,'S18_3136',30,'97',13), (10126,'S18_3320',38,'82',16), (10126,'S18_4600',50,'142',5), (10126,'S18_4668',43,'54',9), (10126,'S24_2300',27,'127',1), (10126,'S24_4258',34,'105',15), (10126,'S32_1268',43,'96',3), (10126,'S32_3522',26,'63',7), (10126,'S700_2824',45,'102',6), (10127,'S12_1108',46,'245',2), (10127,'S12_3148',46,'160',3), (10127,'S12_3891',42,'194',1), (10127,'S12_4473',24,'107',11), (10127,'S18_2238',45,'159',10), (10127,'S18_2319',45,'140',14), (10127,'S18_3232',22,'174',15), (10127,'S18_4027',25,'138',5), (10127,'S24_1444',20,'61',8), (10127,'S24_2840',39,'38',12), (10127,'S24_4048',20,'97',7), (10127,'S32_2509',45,'52',13), (10127,'S32_3207',29,'71',6), (10127,'S50_1392',46,'134',9), (10127,'S50_1514',46,'69',4), (10128,'S18_3140',41,'135',2), (10128,'S18_3259',41,'118',4), (10128,'S18_4522',43,'92',1), (10128,'S700_1938',32,'97',3), (10129,'S10_4757',33,'133',2), (10129,'S24_2011',45,'134',9), (10129,'S24_3151',41,'95',4), (10129,'S24_3816',50,'78',1), (10129,'S700_1138',31,'60',5), (10129,'S700_2610',45,'85',3), (10129,'S700_3505',42,'91',6), (10129,'S700_3962',30,'85',7), (10129,'S72_3212',32,'65',8), (10130,'S18_3029',40,'96',2), (10130,'S18_3856',33,'104',1), (10131,'S18_1662',21,'132',4), (10131,'S24_2841',35,'67',5), (10131,'S24_3420',29,'59',6), (10131,'S24_3949',50,'82',3), (10131,'S700_2047',22,'86',8), (10131,'S700_2466',40,'111',1), (10131,'S700_4002',26,'85',2), (10131,'S72_1253',21,'42',7), (10132,'S700_3167',36,'69',1), (10133,'S18_2581',49,'69',3), (10133,'S24_1785',41,'94',5), (10133,'S24_4278',46,'78',4), (10133,'S32_1374',23,'115',1), (10133,'S32_4289',49,'57',6), (10133,'S50_1341',27,'50',7), (10133,'S700_1691',24,'78',8), (10133,'S700_2834',27,'100',2), (10134,'S10_1678',41,'95',2), (10134,'S10_2016',27,'123',5), (10134,'S10_4698',31,'227',4), (10134,'S12_2823',20,'136',1), (10134,'S18_2625',30,'62',6), (10134,'S24_1578',35,'94',3), (10134,'S24_2000',43,'83',7), (10135,'S12_1099',42,'191',7), (10135,'S12_3380',48,'126',5), (10135,'S12_3990',24,'75',8), (10135,'S12_4675',29,'98',4), (10135,'S18_1889',48,'79',3), (10135,'S18_3278',45,'78',10), (10135,'S18_3482',42,'129',9), (10135,'S18_3782',45,'50',13), (10135,'S18_4721',31,'152',12), (10135,'S24_2360',29,'62',16), (10135,'S24_2972',20,'36',1), (10135,'S24_3371',27,'66',6), (10135,'S24_3856',47,'135',2), (10135,'S24_4620',23,'87',11), (10135,'S32_2206',33,'40',14), (10135,'S32_4485',30,'90',17), (10135,'S50_4713',44,'96',15), (10136,'S18_1129',25,'146',2), (10136,'S18_1984',36,'147',1), (10136,'S18_3232',41,'203',3), (10137,'S18_1589',44,'100',2), (10137,'S18_2870',37,'117',3), (10137,'S18_3685',31,'165',4), (10137,'S24_1628',26,'50',1), (10138,'S18_1749',33,'162',6), (10138,'S18_2248',22,'48',5), (10138,'S18_2325',38,'108',3), (10138,'S18_4409',47,'100',7), (10138,'S18_4933',23,'67',8), (10138,'S24_1046',45,'85',12), (10138,'S24_1937',22,'29',2), (10138,'S24_2022',33,'43',1), (10138,'S24_2766',28,'105',10), (10138,'S24_2887',30,'139',9), (10138,'S24_3191',49,'91',11), (10138,'S24_3432',21,'119',13), (10138,'S24_3969',29,'38',4), (10139,'S18_1342',31,'103',7), (10139,'S18_1367',49,'43',6), (10139,'S18_2795',41,'194',8), (10139,'S18_2949',46,'121',1), (10139,'S18_2957',20,'71',3), (10139,'S18_3136',20,'90',2), (10139,'S18_3320',30,'103',5), (10139,'S24_4258',29,'113',4), (10140,'S10_1949',37,'199',11), (10140,'S10_4962',26,'123',4), (10140,'S12_1666',38,'127',8), (10140,'S18_1097',32,'131',10), (10140,'S18_2432',46,'62',2), (10140,'S18_4600',40,'115',5), (10140,'S18_4668',29,'43',9), (10140,'S24_2300',47,'109',1), (10140,'S32_1268',26,'109',3), (10140,'S32_3522',28,'61',7), (10140,'S700_2824',36,'114',6), (10141,'S12_4473',21,'102',5), (10141,'S18_2238',39,'152',4), (10141,'S18_2319',47,'134',8), (10141,'S18_3232',34,'142',9), (10141,'S24_1444',20,'54',2), (10141,'S24_2840',21,'42',6), (10141,'S24_4048',40,'95',1), (10141,'S32_2509',24,'46',7), (10141,'S50_1392',44,'125',3), (10142,'S12_1108',33,'243',12), (10142,'S12_3148',33,'151',13), (10142,'S12_3891',46,'206',11), (10142,'S18_3140',47,'128',8), (10142,'S18_3259',22,'98',10), (10142,'S18_4027',24,'158',15), (10142,'S18_4522',24,'70',7), (10142,'S24_2011',33,'102',6), (10142,'S24_3151',49,'98',1), (10142,'S32_3207',42,'75',16), (10142,'S50_1514',42,'50',14), (10142,'S700_1138',41,'64',2), (10142,'S700_1938',43,'84',9), (10142,'S700_3505',21,'111',3), (10142,'S700_3962',38,'85',4), (10142,'S72_3212',39,'44',5), (10143,'S10_4757',49,'114',15), (10143,'S18_1662',32,'164',7), (10143,'S18_3029',46,'75',13), (10143,'S18_3856',34,'102',12), (10143,'S24_2841',27,'61',8), (10143,'S24_3420',33,'78',9), (10143,'S24_3816',23,'81',14), (10143,'S24_3949',28,'66',6), (10143,'S50_1341',34,'37',1), (10143,'S700_1691',36,'110',2), (10143,'S700_2047',26,'100',11), (10143,'S700_2466',26,'83',4), (10143,'S700_2610',31,'85',16), (10143,'S700_3167',28,'96',3), (10143,'S700_4002',34,'86',5), (10143,'S72_1253',37,'51',10), (10144,'S32_4289',20,'82',1), (10145,'S10_1678',45,'83',6), (10145,'S10_2016',37,'140',9), (10145,'S10_4698',33,'157',8), (10145,'S12_2823',49,'170',5), (10145,'S18_2581',30,'85',14), (10145,'S18_2625',30,'50',10), (10145,'S24_1578',43,'96',7), (10145,'S24_1785',40,'88',16), (10145,'S24_2000',47,'83',11), (10145,'S24_2360',27,'61',3), (10145,'S24_4278',33,'85',15), (10145,'S32_1374',33,'94',12), (10145,'S32_2206',31,'36',1), (10145,'S32_4485',27,'120',4), (10145,'S50_4713',38,'81',2), (10145,'S700_2834',20,'138',13), (10146,'S18_3782',47,'67',2), (10146,'S18_4721',29,'153',1), (10147,'S12_1099',48,'193',7), (10147,'S12_3380',31,'113',5), (10147,'S12_3990',21,'64',8), (10147,'S12_4675',33,'98',4), (10147,'S18_1889',26,'82',3), (10147,'S18_3278',36,'86',10), (10147,'S18_3482',37,'119',9), (10147,'S24_2972',25,'43',1), (10147,'S24_3371',30,'69',6), (10147,'S24_3856',23,'126',2), (10147,'S24_4620',31,'65',11), (10148,'S18_1129',23,'117',13), (10148,'S18_1589',47,'124',9), (10148,'S18_1984',25,'169',12), (10148,'S18_2870',27,'131',10), (10148,'S18_3232',32,'169',14), (10148,'S18_3685',28,'130',11), (10148,'S18_4409',34,'106',1), (10148,'S18_4933',29,'81',2), (10148,'S24_1046',25,'60',6), (10148,'S24_1628',47,'57',8), (10148,'S24_2766',21,'74',4), (10148,'S24_2887',34,'129',3), (10148,'S24_3191',31,'74',5), (10148,'S24_3432',27,'129',7), (10149,'S18_1342',50,'118',4), (10149,'S18_1367',30,'58',3), (10149,'S18_1749',34,'158',11), (10149,'S18_2248',24,'62',10), (10149,'S18_2325',33,'150',8), (10149,'S18_2795',23,'184',5), (10149,'S18_3320',42,'94',2), (10149,'S24_1937',36,'33',7), (10149,'S24_2022',49,'49',6), (10149,'S24_3969',26,'39',9), (10149,'S24_4258',20,'91',1), (10150,'S10_1949',45,'244',8), (10150,'S10_4962',20,'160',1), (10150,'S12_1666',30,'137',5), (10150,'S18_1097',34,'137',7), (10150,'S18_2949',47,'91',9), (10150,'S18_2957',30,'50',11), (10150,'S18_3136',26,'108',10), (10150,'S18_4600',49,'132',2), (10150,'S18_4668',30,'43',6), (10150,'S32_3522',49,'58',4), (10150,'S700_2824',20,'105',3), (10151,'S12_4473',24,'139',3), (10151,'S18_2238',43,'165',2), (10151,'S18_2319',49,'110',6), (10151,'S18_2432',39,'69',9), (10151,'S18_3232',21,'178',7), (10151,'S24_2300',42,'121',8), (10151,'S24_2840',30,'40',4), (10151,'S32_1268',27,'114',10), (10151,'S32_2509',41,'64',5), (10151,'S50_1392',26,'124',1), (10152,'S18_4027',35,'129',1), (10152,'S24_1444',25,'65',4), (10152,'S24_4048',23,'122',3), (10152,'S32_3207',33,'51',2), (10153,'S12_1108',20,'245',11), (10153,'S12_3148',42,'128',12), (10153,'S12_3891',49,'144',10), (10153,'S18_3140',31,'117',7), (10153,'S18_3259',29,'89',9), (10153,'S18_4522',22,'83',6), (10153,'S24_2011',40,'136',5), (10153,'S50_1514',31,'57',13), (10153,'S700_1138',43,'65',1), (10153,'S700_1938',31,'87',8), (10153,'S700_3505',50,'88',2), (10153,'S700_3962',20,'110',3), (10153,'S72_3212',50,'60',4), (10154,'S24_3151',31,'91',2), (10154,'S700_2610',36,'64',1), (10155,'S10_4757',32,'141',13), (10155,'S18_1662',38,'172',5), (10155,'S18_3029',44,'79',11), (10155,'S18_3856',29,'125',10), (10155,'S24_2841',23,'73',6), (10155,'S24_3420',34,'56',7), (10155,'S24_3816',37,'68',12), (10155,'S24_3949',44,'77',4), (10155,'S700_2047',32,'91',9), (10155,'S700_2466',20,'118',2), (10155,'S700_3167',43,'86',1), (10155,'S700_4002',44,'86',3), (10155,'S72_1253',34,'49',8), (10156,'S50_1341',20,'41',1), (10156,'S700_1691',48,'103',2), (10157,'S18_2581',33,'79',3), (10157,'S24_1785',40,'103',5), (10157,'S24_4278',33,'86',4), (10157,'S32_1374',34,'119',1), (10157,'S32_4289',28,'75',6), (10157,'S700_2834',48,'125',2), (10158,'S24_2000',22,'67',1), (10159,'S10_1678',49,'106',14), (10159,'S10_2016',37,'136',17), (10159,'S10_4698',22,'188',16), (10159,'S12_1099',41,'202',2), (10159,'S12_2823',38,'164',13), (10159,'S12_3990',24,'73',3), (10159,'S18_2625',42,'51',18), (10159,'S18_3278',21,'81',5), (10159,'S18_3482',25,'146',4), (10159,'S18_3782',21,'65',8), (10159,'S18_4721',32,'144',7), (10159,'S24_1578',44,'122',15), (10159,'S24_2360',27,'80',11), (10159,'S24_3371',50,'70',1), (10159,'S24_4620',23,'67',6), (10159,'S32_2206',35,'35',9), (10159,'S32_4485',23,'102',12), (10159,'S50_4713',31,'72',10), (10160,'S12_3380',46,'115',6), (10160,'S12_4675',50,'104',5), (10160,'S18_1889',38,'89',4), (10160,'S18_3232',20,'200',1), (10160,'S24_2972',42,'37',2), (10160,'S24_3856',35,'136',3), (10161,'S18_1129',28,'134',12), (10161,'S18_1589',43,'143',8), (10161,'S18_1984',48,'128',11), (10161,'S18_2870',23,'139',9), (10161,'S18_3685',36,'154',10), (10161,'S18_4933',25,'81',1), (10161,'S24_1046',37,'73',5), (10161,'S24_1628',23,'53',7), (10161,'S24_2766',20,'107',3), (10161,'S24_2887',25,'110',2), (10161,'S24_3191',20,'77',4), (10161,'S24_3432',30,'105',6), (10162,'S18_1342',48,'91',2), (10162,'S18_1367',45,'51',1), (10162,'S18_1749',29,'179',9), (10162,'S18_2248',27,'70',8), (10162,'S18_2325',38,'113',6), (10162,'S18_2795',48,'150',3), (10162,'S18_4409',39,'100',10), (10162,'S24_1937',37,'27',5), (10162,'S24_2022',43,'36',4), (10162,'S24_3969',37,'39',7), (10163,'S10_1949',21,'231',1), (10163,'S18_2949',31,'107',2), (10163,'S18_2957',48,'70',4), (10163,'S18_3136',40,'123',3), (10163,'S18_3320',43,'116',6), (10163,'S24_4258',42,'92',5), (10164,'S10_4962',21,'168',2), (10164,'S12_1666',49,'134',6), (10164,'S18_1097',36,'99',8), (10164,'S18_4600',45,'111',3), (10164,'S18_4668',25,'54',7), (10164,'S32_1268',24,'110',1), (10164,'S32_3522',49,'55',5), (10164,'S700_2824',39,'82',4), (10165,'S12_1108',44,'195',3), (10165,'S12_3148',34,'144',4), (10165,'S12_3891',27,'206',2), (10165,'S12_4473',48,'142',12), (10165,'S18_2238',29,'174',11), (10165,'S18_2319',46,'130',15), (10165,'S18_2432',31,'71',18), (10165,'S18_3232',47,'186',16), (10165,'S18_3259',50,'107',1), (10165,'S18_4027',28,'119',6), (10165,'S24_1444',25,'69',9), (10165,'S24_2300',32,'146',17), (10165,'S24_2840',27,'32',13), (10165,'S24_4048',24,'99',8), (10165,'S32_2509',48,'46',14), (10165,'S32_3207',44,'53',7), (10165,'S50_1392',48,'95',10), (10165,'S50_1514',38,'67',5), (10166,'S18_3140',43,'161',2), (10166,'S18_4522',26,'74',1), (10166,'S700_1938',29,'104',3), (10167,'S10_4757',44,'135',9), (10167,'S18_1662',43,'134',1), (10167,'S18_3029',46,'73',7), (10167,'S18_3856',34,'106',6), (10167,'S24_2011',33,'116',16), (10167,'S24_2841',21,'70',2), (10167,'S24_3151',20,'80',11), (10167,'S24_3420',32,'63',3), (10167,'S24_3816',29,'84',8), (10167,'S700_1138',43,'75',12), (10167,'S700_2047',29,'101',5), (10167,'S700_2610',46,'70',10), (10167,'S700_3505',24,'117',13), (10167,'S700_3962',28,'107',14), (10167,'S72_1253',40,'42',4), (10167,'S72_3212',38,'49',15), (10168,'S10_1678',36,'97',1), (10168,'S10_2016',27,'136',4), (10168,'S10_4698',20,'209',3), (10168,'S18_2581',21,'71',9), (10168,'S18_2625',46,'61',5), (10168,'S24_1578',50,'115',2), (10168,'S24_1785',49,'131',11), (10168,'S24_2000',29,'75',6), (10168,'S24_3949',27,'73',18), (10168,'S24_4278',48,'78',10), (10168,'S32_1374',28,'116',7), (10168,'S32_4289',31,'74',12), (10168,'S50_1341',48,'52',13), (10168,'S700_1691',28,'99',14), (10168,'S700_2466',31,'111',16), (10168,'S700_2834',36,'126',8), (10168,'S700_3167',48,'96',15), (10168,'S700_4002',39,'83',17), (10169,'S12_1099',30,'167',2), (10169,'S12_2823',35,'133',13), (10169,'S12_3990',36,'64',3), (10169,'S18_3278',32,'71',5), (10169,'S18_3482',36,'123',4), (10169,'S18_3782',38,'68',8), (10169,'S18_4721',33,'149',7), (10169,'S24_2360',38,'74',11), (10169,'S24_3371',34,'50',1), (10169,'S24_4620',24,'95',6), (10169,'S32_2206',26,'40',9), (10169,'S32_4485',34,'115',12), (10169,'S50_4713',48,'81',10), (10170,'S12_3380',47,'116',4), (10170,'S12_4675',41,'107',3), (10170,'S18_1889',20,'63',2), (10170,'S24_3856',34,'112',1), (10171,'S18_1129',35,'129',2), (10171,'S18_1984',35,'134',1), (10171,'S18_3232',39,'141',3), (10171,'S24_2972',36,'35',4), (10172,'S18_1589',42,'118',6), (10172,'S18_2870',39,'154',7), (10172,'S18_3685',48,'114',8), (10172,'S24_1046',32,'76',3), (10172,'S24_1628',34,'43',5), (10172,'S24_2766',22,'75',1), (10172,'S24_3191',24,'81',2), (10172,'S24_3432',22,'99',4), (10173,'S18_1342',43,'117',6), (10173,'S18_1367',48,'44',5), (10173,'S18_1749',24,'146',13), (10173,'S18_2248',26,'58',12), (10173,'S18_2325',31,'145',10), (10173,'S18_2795',22,'157',7), (10173,'S18_2957',28,'54',2), (10173,'S18_3136',31,'89',1), (10173,'S18_3320',29,'95',4), (10173,'S18_4409',21,'75',14), (10173,'S18_4933',39,'72',15), (10173,'S24_1937',31,'32',9), (10173,'S24_2022',27,'41',8), (10173,'S24_2887',23,'119',16), (10173,'S24_3969',35,'33',11), (10173,'S24_4258',22,'117',3), (10174,'S10_1949',34,'236',4), (10174,'S12_1666',43,'159',1), (10174,'S18_1097',48,'93',3), (10174,'S18_2949',46,'122',5), (10174,'S18_4668',49,'45',2), (10175,'S10_4962',33,'163',9), (10175,'S12_4473',26,'136',1), (10175,'S18_2319',48,'123',4), (10175,'S18_2432',41,'69',7), (10175,'S18_3232',29,'152',5), (10175,'S18_4600',47,'109',10), (10175,'S24_2300',28,'106',6), (10175,'S24_2840',37,'31',2), (10175,'S32_1268',22,'111',8), (10175,'S32_2509',50,'63',3), (10175,'S32_3522',29,'75',12), (10175,'S700_2824',42,'86',11), (10176,'S12_1108',33,'227',2), (10176,'S12_3148',47,'178',3), (10176,'S12_3891',50,'157',1), (10176,'S18_2238',20,'183',10), (10176,'S18_4027',36,'154',5), (10176,'S24_1444',27,'69',8), (10176,'S24_4048',29,'101',7), (10176,'S32_3207',22,'64',6), (10176,'S50_1392',23,'135',9), (10176,'S50_1514',38,'64',4), (10177,'S18_3140',23,'160',9), (10177,'S18_3259',29,'106',11), (10177,'S18_4522',35,'75',8), (10177,'S24_2011',50,'122',7), (10177,'S24_3151',45,'73',2), (10177,'S700_1138',24,'76',3), (10177,'S700_1938',31,'88',10), (10177,'S700_2610',32,'77',1), (10177,'S700_3505',44,'92',4), (10177,'S700_3962',24,'105',5), (10177,'S72_3212',40,'50',6), (10178,'S10_4757',24,'146',12), (10178,'S18_1662',42,'155',4), (10178,'S18_3029',41,'82',10), (10178,'S18_3856',48,'112',9), (10178,'S24_2841',34,'81',5), (10178,'S24_3420',27,'74',6), (10178,'S24_3816',21,'72',11), (10178,'S24_3949',30,'72',3), (10178,'S700_2047',34,'97',8), (10178,'S700_2466',22,'88',1), (10178,'S700_4002',45,'76',2), (10178,'S72_1253',45,'51',7), (10179,'S18_2581',24,'79',3), (10179,'S24_1785',47,'125',5), (10179,'S24_4278',27,'85',4), (10179,'S32_1374',45,'120',1), (10179,'S32_4289',24,'72',6), (10179,'S50_1341',34,'43',7), (10179,'S700_1691',23,'108',8), (10179,'S700_2834',25,'106',2), (10179,'S700_3167',39,'69',9), (10180,'S10_1678',29,'86',9), (10180,'S10_2016',42,'112',12), (10180,'S10_4698',41,'217',11), (10180,'S12_2823',40,'169',8), (10180,'S18_2625',25,'64',13), (10180,'S18_3782',21,'50',3), (10180,'S18_4721',44,'126',2), (10180,'S24_1578',48,'112',10), (10180,'S24_2000',28,'69',14), (10180,'S24_2360',35,'72',6), (10180,'S24_4620',28,'71',1), (10180,'S32_2206',34,'45',4), (10180,'S32_4485',22,'114',7), (10180,'S50_4713',21,'94',5), (10181,'S12_1099',27,'200',14), (10181,'S12_3380',28,'102',12), (10181,'S12_3990',20,'81',15), (10181,'S12_4675',36,'124',11), (10181,'S18_1129',44,'123',6), (10181,'S18_1589',42,'129',2), (10181,'S18_1889',22,'74',10), (10181,'S18_1984',21,'156',5), (10181,'S18_2870',27,'144',3), (10181,'S18_3232',45,'141',7), (10181,'S18_3278',30,'83',17), (10181,'S18_3482',22,'154',16), (10181,'S18_3685',39,'148',4), (10181,'S24_1628',34,'54',1), (10181,'S24_2972',37,'43',8), (10181,'S24_3371',23,'66',13), (10181,'S24_3856',25,'154',9), (10182,'S18_1342',25,'87',3), (10182,'S18_1367',32,'54',2), (10182,'S18_1749',44,'172',10), (10182,'S18_2248',38,'61',9), (10182,'S18_2325',20,'111',7), (10182,'S18_2795',21,'145',4), (10182,'S18_3320',33,'86',1), (10182,'S18_4409',36,'110',11), (10182,'S18_4933',44,'70',12), (10182,'S24_1046',47,'74',16), (10182,'S24_1937',39,'37',6), (10182,'S24_2022',31,'37',5), (10182,'S24_2766',36,'74',14), (10182,'S24_2887',20,'120',13), (10182,'S24_3191',33,'94',15), (10182,'S24_3432',49,'127',17), (10182,'S24_3969',23,'42',8), (10183,'S10_1949',23,'234',8), (10183,'S10_4962',28,'123',1), (10183,'S12_1666',41,'150',5), (10183,'S18_1097',21,'97',7), (10183,'S18_2949',37,'89',9), (10183,'S18_2957',39,'68',11), (10183,'S18_3136',22,'113',10), (10183,'S18_4600',21,'116',2), (10183,'S18_4668',40,'49',6), (10183,'S24_4258',47,'107',12), (10183,'S32_3522',49,'65',4), (10183,'S700_2824',23,'87',3), (10184,'S12_4473',37,'122',6), (10184,'S18_2238',46,'160',5), (10184,'S18_2319',46,'130',9), (10184,'S18_2432',44,'60',12), (10184,'S18_3232',28,'157',10), (10184,'S24_1444',31,'60',3), (10184,'S24_2300',24,'146',11), (10184,'S24_2840',42,'32',7), (10184,'S24_4048',49,'118',2), (10184,'S32_1268',46,'100',13), (10184,'S32_2509',33,'63',8), (10184,'S32_3207',48,'51',1), (10184,'S50_1392',45,'110',4), (10185,'S12_1108',21,'185',13), (10185,'S12_3148',33,'122',14), (10185,'S12_3891',43,'183',12), (10185,'S18_3140',28,'123',9), (10185,'S18_3259',49,'81',11), (10185,'S18_4027',39,'131',16), (10185,'S18_4522',47,'77',8), (10185,'S24_2011',30,'106',7), (10185,'S24_3151',33,'74',2), (10185,'S50_1514',20,'49',15), (10185,'S700_1138',21,'54',3), (10185,'S700_1938',30,'94',10), (10185,'S700_2610',39,'58',1), (10185,'S700_3505',37,'105',4), (10185,'S700_3962',22,'79',5), (10185,'S72_3212',28,'64',6), (10186,'S10_4757',26,'148',9), (10186,'S18_1662',32,'188',1), (10186,'S18_3029',32,'89',7), (10186,'S18_3856',46,'107',6), (10186,'S24_2841',22,'69',2), (10186,'S24_3420',21,'69',3), (10186,'S24_3816',36,'86',8), (10186,'S700_2047',24,'100',5), (10186,'S72_1253',28,'52',4), (10187,'S18_2581',45,'94',1), (10187,'S24_1785',46,'95',3), (10187,'S24_3949',43,'58',10), (10187,'S24_4278',33,'59',2), (10187,'S32_4289',31,'61',4), (10187,'S50_1341',41,'39',5), (10187,'S700_1691',34,'92',6), (10187,'S700_2466',44,'106',8), (10187,'S700_3167',34,'88',7), (10187,'S700_4002',44,'72',9), (10188,'S10_1678',48,'115',1), (10188,'S10_2016',38,'96',4), (10188,'S10_4698',45,'194',3), (10188,'S18_2625',32,'65',5), (10188,'S24_1578',25,'101',2), (10188,'S24_2000',40,'91',6), (10188,'S32_1374',44,'99',7), (10188,'S700_2834',29,'136',8), (10189,'S12_2823',28,'161',1), (10190,'S24_2360',42,'76',3), (10190,'S32_2206',46,'33',1), (10190,'S32_4485',42,'86',4), (10190,'S50_4713',40,'67',2), (10191,'S12_1099',21,'183',3), (10191,'S12_3380',40,'140',1), (10191,'S12_3990',30,'65',4), (10191,'S18_3278',36,'95',6), (10191,'S18_3482',23,'148',5), (10191,'S18_3782',43,'73',9), (10191,'S18_4721',32,'132',8), (10191,'S24_3371',48,'60',2), (10191,'S24_4620',44,'66',7), (10192,'S12_4675',27,'131',16), (10192,'S18_1129',22,'150',11), (10192,'S18_1589',29,'147',7), (10192,'S18_1889',45,'91',15), (10192,'S18_1984',47,'158',10), (10192,'S18_2870',38,'131',8), (10192,'S18_3232',26,'151',12), (10192,'S18_3685',45,'119',9), (10192,'S24_1046',37,'70',4), (10192,'S24_1628',47,'54',6), (10192,'S24_2766',46,'84',2), (10192,'S24_2887',23,'133',1), (10192,'S24_2972',30,'31',13), (10192,'S24_3191',32,'73',3), (10192,'S24_3432',46,'121',5), (10192,'S24_3856',45,'140',14), (10193,'S18_1342',28,'111',7), (10193,'S18_1367',46,'53',6), (10193,'S18_1749',21,'150',14), (10193,'S18_2248',42,'59',13), (10193,'S18_2325',44,'106',11), (10193,'S18_2795',22,'167',8), (10193,'S18_2949',28,'93',1), (10193,'S18_2957',24,'52',3), (10193,'S18_3136',23,'120',2), (10193,'S18_3320',32,'79',5), (10193,'S18_4409',24,'98',15), (10193,'S18_4933',25,'76',16), (10193,'S24_1937',26,'29',10), (10193,'S24_2022',20,'51',9), (10193,'S24_3969',22,'41',12), (10193,'S24_4258',20,'114',4), (10194,'S10_1949',42,'174',11), (10194,'S10_4962',26,'164',4), (10194,'S12_1666',38,'130',8), (10194,'S18_1097',21,'93',10), (10194,'S18_2432',45,'70',2), (10194,'S18_4600',32,'133',5), (10194,'S18_4668',41,'45',9), (10194,'S24_2300',49,'118',1), (10194,'S32_1268',37,'97',3), (10194,'S32_3522',39,'55',7), (10194,'S700_2824',26,'89',6), (10195,'S12_4473',49,'132',6), (10195,'S18_2238',27,'190',5), (10195,'S18_2319',35,'103',9), (10195,'S18_3232',50,'152',10), (10195,'S24_1444',44,'66',3), (10195,'S24_2840',32,'28',7), (10195,'S24_4048',34,'109',2), (10195,'S32_2509',32,'43',8), (10195,'S32_3207',33,'55',1), (10195,'S50_1392',49,'105',4), (10196,'S12_1108',47,'189',5), (10196,'S12_3148',24,'159',6), (10196,'S12_3891',38,'190',4), (10196,'S18_3140',49,'141',1), (10196,'S18_3259',35,'102',3), (10196,'S18_4027',27,'168',8), (10196,'S50_1514',46,'62',7), (10196,'S700_1938',50,'94',2), (10197,'S10_4757',45,'118',6), (10197,'S18_3029',46,'88',4), (10197,'S18_3856',22,'115',3), (10197,'S18_4522',50,'102',14), (10197,'S24_2011',41,'111',13), (10197,'S24_3151',47,'83',8), (10197,'S24_3816',22,'86',5), (10197,'S700_1138',23,'65',9), (10197,'S700_2047',24,'91',2), (10197,'S700_2610',50,'79',7), (10197,'S700_3505',27,'92',10), (10197,'S700_3962',35,'93',11), (10197,'S72_1253',29,'42',1), (10197,'S72_3212',42,'50',12), (10198,'S18_1662',42,'178',4), (10198,'S24_2841',48,'68',5), (10198,'S24_3420',27,'72',6), (10198,'S24_3949',43,'66',3), (10198,'S700_2466',42,'114',1), (10198,'S700_4002',40,'64',2), (10199,'S50_1341',29,'38',1), (10199,'S700_1691',48,'83',2), (10199,'S700_3167',38,'82',3), (10200,'S18_2581',28,'93',3), (10200,'S24_1785',33,'98',5), (10200,'S24_4278',39,'72',4), (10200,'S32_1374',35,'110',1), (10200,'S32_4289',27,'67',6), (10200,'S700_2834',39,'102',2), (10201,'S10_1678',22,'99',2), (10201,'S10_2016',24,'126',5), (10201,'S10_4698',49,'165',4), (10201,'S12_2823',25,'161',1), (10201,'S18_2625',30,'65',6), (10201,'S24_1578',39,'112',3), (10201,'S24_2000',25,'74',7), (10202,'S18_3782',30,'55',3), (10202,'S18_4721',43,'137',2), (10202,'S24_2360',50,'69',6), (10202,'S24_4620',50,'87',1), (10202,'S32_2206',27,'44',4), (10202,'S32_4485',31,'102',7), (10202,'S50_4713',40,'90',5), (10203,'S12_1099',20,'197',8), (10203,'S12_3380',20,'113',6), (10203,'S12_3990',44,'83',9), (10203,'S12_4675',47,'111',5), (10203,'S18_1889',45,'85',4), (10203,'S18_3232',48,'173',1), (10203,'S18_3278',33,'86',11), (10203,'S18_3482',32,'160',10), (10203,'S24_2972',21,'37',2), (10203,'S24_3371',34,'65',7), (10203,'S24_3856',47,'149',3), (10204,'S18_1129',42,'147',17), (10204,'S18_1589',40,'101',13), (10204,'S18_1749',33,'179',4), (10204,'S18_1984',38,'169',16), (10204,'S18_2248',23,'71',3), (10204,'S18_2325',26,'123',1), (10204,'S18_2870',27,'154',14), (10204,'S18_3685',35,'164',15), (10204,'S18_4409',29,'86',5), (10204,'S18_4933',45,'76',6), (10204,'S24_1046',20,'62',10), (10204,'S24_1628',45,'50',12), (10204,'S24_2766',47,'96',8), (10204,'S24_2887',42,'101',7), (10204,'S24_3191',40,'80',9), (10204,'S24_3432',48,'91',11), (10204,'S24_3969',39,'33',2), (10205,'S18_1342',36,'104',2), (10205,'S18_1367',48,'64',1), (10205,'S18_2795',40,'187',3), (10205,'S24_1937',32,'37',5), (10205,'S24_2022',24,'38',4), (10206,'S10_1949',47,'193',6), (10206,'S12_1666',28,'145',3), (10206,'S18_1097',34,'117',5), (10206,'S18_2949',37,'90',7), (10206,'S18_2957',28,'67',9), (10206,'S18_3136',30,'119',8), (10206,'S18_3320',28,'87',11), (10206,'S18_4668',21,'53',4), (10206,'S24_4258',33,'97',10), (10206,'S32_3522',36,'59',2), (10206,'S700_2824',33,'117',1), (10207,'S10_4962',31,'131',15), (10207,'S12_4473',34,'100',7), (10207,'S18_2238',44,'160',6), (10207,'S18_2319',43,'134',10), (10207,'S18_2432',37,'70',13), (10207,'S18_3232',25,'157',11), (10207,'S18_4027',40,'154',1), (10207,'S18_4600',47,'142',16), (10207,'S24_1444',49,'47',4), (10207,'S24_2300',46,'148',12), (10207,'S24_2840',42,'30',8), (10207,'S24_4048',28,'106',3), (10207,'S32_1268',49,'81',14), (10207,'S32_2509',27,'60',9), (10207,'S32_3207',45,'57',2), (10207,'S50_1392',28,'95',5), (10208,'S12_1108',46,'187',13), (10208,'S12_3148',26,'121',14), (10208,'S12_3891',20,'156',12), (10208,'S18_3140',24,'109',9), (10208,'S18_3259',48,'117',11), (10208,'S18_4522',45,'88',8), (10208,'S24_2011',35,'123',7), (10208,'S24_3151',20,'89',2), (10208,'S50_1514',30,'66',15), (10208,'S700_1138',38,'75',3), (10208,'S700_1938',40,'81',10), (10208,'S700_2610',46,'74',1), (10208,'S700_3505',37,'120',4), (10208,'S700_3962',33,'85',5), (10208,'S72_3212',42,'64',6), (10209,'S10_4757',39,'133',8), (10209,'S18_3029',28,'101',6), (10209,'S18_3856',20,'125',5), (10209,'S24_2841',43,'82',1), (10209,'S24_3420',36,'78',2), (10209,'S24_3816',22,'90',7), (10209,'S700_2047',33,'89',4), (10209,'S72_1253',48,'45',3), (10210,'S10_2016',23,'131',2), (10210,'S10_4698',34,'180',1), (10210,'S18_1662',31,'185',17), (10210,'S18_2581',50,'77',7), (10210,'S18_2625',40,'50',3), (10210,'S24_1785',27,'98',9), (10210,'S24_2000',30,'62',4), (10210,'S24_3949',29,'70',16), (10210,'S24_4278',40,'71',8), (10210,'S32_1374',46,'80',5), (10210,'S32_4289',39,'59',10), (10210,'S50_1341',43,'41',11), (10210,'S700_1691',21,'79',12), (10210,'S700_2466',26,'100',14), (10210,'S700_2834',25,'113',6), (10210,'S700_3167',31,'86',13), (10210,'S700_4002',42,'70',15), (10211,'S10_1678',41,'115',14), (10211,'S12_1099',41,'183',2), (10211,'S12_2823',36,'133',13), (10211,'S12_3990',28,'93',3), (10211,'S18_3278',35,'78',5), (10211,'S18_3482',28,'134',4), (10211,'S18_3782',46,'54',8), (10211,'S18_4721',41,'138',7), (10211,'S24_1578',25,'90',15), (10211,'S24_2360',21,'64',11), (10211,'S24_3371',48,'49',1), (10211,'S24_4620',22,'92',6), (10211,'S32_2206',41,'42',9), (10211,'S32_4485',37,'109',12), (10211,'S50_4713',40,'81',10), (10212,'S12_3380',39,'127',16), (10212,'S12_4675',33,'127',15), (10212,'S18_1129',29,'144',10), (10212,'S18_1589',38,'118',6), (10212,'S18_1889',20,'67',14), (10212,'S18_1984',41,'118',9), (10212,'S18_2870',40,'123',7), (10212,'S18_3232',40,'139',11), (10212,'S18_3685',45,'141',8), (10212,'S24_1046',41,'82',3), (10212,'S24_1628',45,'53',5), (10212,'S24_2766',45,'88',1), (10212,'S24_2972',34,'43',12), (10212,'S24_3191',27,'80',2), (10212,'S24_3432',46,'88',4), (10212,'S24_3856',49,'142',13), (10213,'S18_4409',38,'95',1), (10213,'S18_4933',25,'83',2), (10213,'S24_2887',27,'103',3), (10214,'S18_1749',30,'199',7), (10214,'S18_2248',21,'63',6), (10214,'S18_2325',27,'133',4), (10214,'S18_2795',50,'191',1), (10214,'S24_1937',20,'34',3), (10214,'S24_2022',49,'48',2), (10214,'S24_3969',44,'35',5), (10215,'S10_1949',35,'174',3), (10215,'S18_1097',46,'112',2), (10215,'S18_1342',27,'89',10), (10215,'S18_1367',33,'43',9), (10215,'S18_2949',49,'112',4), (10215,'S18_2957',31,'59',6), (10215,'S18_3136',49,'108',5), (10215,'S18_3320',41,'111',8), (10215,'S18_4668',46,'45',1), (10215,'S24_4258',39,'91',7), (10216,'S12_1666',43,'134',1), (10217,'S10_4962',48,'146',4), (10217,'S18_2432',35,'61',2), (10217,'S18_4600',38,'119',5), (10217,'S24_2300',28,'112',1), (10217,'S32_1268',21,'107',3), (10217,'S32_3522',39,'62',7), (10217,'S700_2824',31,'88',6), (10218,'S18_2319',22,'122',1), (10218,'S18_3232',34,'135',2), (10219,'S12_4473',48,'102',2), (10219,'S18_2238',43,'196',1), (10219,'S24_2840',21,'40',3), (10219,'S32_2509',35,'55',4), (10220,'S12_1108',32,'224',2), (10220,'S12_3148',30,'157',3), (10220,'S12_3891',27,'187',1), (10220,'S18_4027',50,'165',5), (10220,'S24_1444',26,'56',8), (10220,'S24_4048',37,'136',7), (10220,'S32_3207',20,'53',6), (10220,'S50_1392',37,'108',9), (10220,'S50_1514',30,'69',4), (10221,'S18_3140',33,'134',3), (10221,'S18_3259',23,'81',5), (10221,'S18_4522',39,'90',2), (10221,'S24_2011',49,'139',1), (10221,'S700_1938',23,'97',4), (10222,'S10_4757',49,'122',12), (10222,'S18_1662',49,'142',4), (10222,'S18_3029',49,'95',10), (10222,'S18_3856',45,'86',9), (10222,'S24_2841',32,'82',5), (10222,'S24_3151',47,'71',14), (10222,'S24_3420',43,'70',6), (10222,'S24_3816',46,'81',11), (10222,'S24_3949',48,'57',3), (10222,'S700_1138',31,'63',15), (10222,'S700_2047',26,'102',8), (10222,'S700_2466',37,'88',1), (10222,'S700_2610',36,'81',13), (10222,'S700_3505',38,'110',16), (10222,'S700_3962',31,'95',17), (10222,'S700_4002',43,'74',2), (10222,'S72_1253',31,'46',7), (10222,'S72_3212',36,'63',18), (10223,'S10_1678',37,'107',1), (10223,'S10_2016',47,'115',4), (10223,'S10_4698',49,'199',3), (10223,'S18_2581',47,'101',9), (10223,'S18_2625',28,'61',5), (10223,'S24_1578',32,'91',2), (10223,'S24_1785',34,'106',11), (10223,'S24_2000',38,'69',6), (10223,'S24_4278',23,'75',10), (10223,'S32_1374',21,'118',7), (10223,'S32_4289',20,'66',12), (10223,'S50_1341',41,'46',13), (10223,'S700_1691',25,'101',14), (10223,'S700_2834',29,'110',8), (10223,'S700_3167',26,'67',15), (10224,'S12_2823',43,'142',6), (10224,'S18_3782',38,'58',1), (10224,'S24_2360',37,'80',4), (10224,'S32_2206',43,'39',2), (10224,'S32_4485',30,'111',5), (10224,'S50_4713',50,'77',3), (10225,'S12_1099',27,'167',9), (10225,'S12_3380',25,'100',7), (10225,'S12_3990',37,'77',10), (10225,'S12_4675',21,'128',6), (10225,'S18_1129',32,'142',1), (10225,'S18_1889',47,'65',5), (10225,'S18_3232',43,'149',2), (10225,'S18_3278',37,'96',12), (10225,'S18_3482',27,'169',11), (10225,'S18_4721',35,'150',14), (10225,'S24_2972',42,'37',3), (10225,'S24_3371',24,'50',8), (10225,'S24_3856',40,'114',4), (10225,'S24_4620',46,'70',13), (10226,'S18_1589',38,'110',4), (10226,'S18_1984',24,'162',7), (10226,'S18_2870',24,'135',5), (10226,'S18_3685',46,'160',6), (10226,'S24_1046',21,'60',1), (10226,'S24_1628',36,'43',3), (10226,'S24_3432',48,'92',2), (10227,'S18_1342',25,'118',3), (10227,'S18_1367',31,'49',2), (10227,'S18_1749',26,'143',10), (10227,'S18_2248',28,'51',9), (10227,'S18_2325',46,'153',7), (10227,'S18_2795',29,'192',4), (10227,'S18_3320',33,'111',1), (10227,'S18_4409',34,'105',11), (10227,'S18_4933',37,'58',12), (10227,'S24_1937',42,'29',6), (10227,'S24_2022',24,'48',5), (10227,'S24_2766',47,'88',14), (10227,'S24_2887',33,'132',13), (10227,'S24_3191',40,'80',15), (10227,'S24_3969',27,'44',8), (10228,'S10_1949',29,'223',2), (10228,'S18_1097',32,'105',1), (10228,'S18_2949',24,'104',3), (10228,'S18_2957',45,'64',5), (10228,'S18_3136',31,'103',4), (10228,'S24_4258',33,'103',6), (10229,'S10_4962',50,'129',9), (10229,'S12_1666',25,'138',13), (10229,'S12_4473',36,'126',1), (10229,'S18_2319',26,'145',4), (10229,'S18_2432',28,'60',7), (10229,'S18_3232',22,'190',5), (10229,'S18_4600',41,'115',10), (10229,'S18_4668',39,'40',14), (10229,'S24_2300',48,'119',6), (10229,'S24_2840',33,'33',2), (10229,'S32_1268',25,'112',8), (10229,'S32_2509',23,'54',3), (10229,'S32_3522',30,'73',12), (10229,'S700_2824',50,'112',11), (10230,'S12_3148',43,'163',1), (10230,'S18_2238',49,'149',8), (10230,'S18_4027',42,'172',3), (10230,'S24_1444',36,'54',6), (10230,'S24_4048',45,'105',5), (10230,'S32_3207',46,'61',4), (10230,'S50_1392',34,'117',7), (10230,'S50_1514',43,'52',2), (10231,'S12_1108',42,'199',2), (10231,'S12_3891',49,'142',1), (10232,'S18_3140',22,'164',6), (10232,'S18_3259',48,'96',8), (10232,'S18_4522',23,'90',5), (10232,'S24_2011',46,'123',4), (10232,'S700_1938',26,'88',7), (10232,'S700_3505',48,'96',1), (10232,'S700_3962',35,'82',2), (10232,'S72_3212',24,'50',3), (10233,'S24_3151',40,'95',2), (10233,'S700_1138',36,'71',3), (10233,'S700_2610',29,'82',1), (10234,'S10_4757',48,'151',9), (10234,'S18_1662',50,'189',1), (10234,'S18_3029',48,'75',7), (10234,'S18_3856',39,'126',6), (10234,'S24_2841',44,'62',2), (10234,'S24_3420',25,'57',3), (10234,'S24_3816',31,'73',8), (10234,'S700_2047',29,'88',5), (10234,'S72_1253',40,'56',4), (10235,'S18_2581',24,'76',3), (10235,'S24_1785',23,'96',5), (10235,'S24_3949',33,'60',12), (10235,'S24_4278',40,'81',4), (10235,'S32_1374',41,'102',1), (10235,'S32_4289',34,'78',6), (10235,'S50_1341',41,'35',7), (10235,'S700_1691',25,'103',8), (10235,'S700_2466',38,'89',10), (10235,'S700_2834',25,'96',2), (10235,'S700_3167',32,'92',9), (10235,'S700_4002',34,'73',11), (10236,'S10_2016',22,'130',1), (10236,'S18_2625',23,'56',2), (10236,'S24_2000',36,'88',3), (10237,'S10_1678',23,'101',7), (10237,'S10_4698',39,'180',9), (10237,'S12_2823',32,'131',6), (10237,'S18_3782',26,'52',1), (10237,'S24_1578',20,'115',8), (10237,'S24_2360',26,'80',4), (10237,'S32_2206',26,'40',2), (10237,'S32_4485',27,'115',5), (10237,'S50_4713',20,'68',3), (10238,'S12_1099',28,'206',3), (10238,'S12_3380',29,'109',1), (10238,'S12_3990',20,'74',4), (10238,'S18_3278',41,'73',6), (10238,'S18_3482',49,'134',5), (10238,'S18_4721',44,'144',8), (10238,'S24_3371',47,'62',2), (10238,'S24_4620',22,'94',7), (10239,'S12_4675',21,'93',5), (10239,'S18_1889',46,'74',4), (10239,'S18_3232',47,'151',1), (10239,'S24_2972',20,'45',2), (10239,'S24_3856',29,'154',3), (10240,'S18_1129',41,'137',3), (10240,'S18_1984',37,'149',2), (10240,'S18_3685',37,'161',1), (10241,'S18_1589',21,'119',11), (10241,'S18_1749',41,'185',2), (10241,'S18_2248',33,'73',1), (10241,'S18_2870',44,'156',12), (10241,'S18_4409',42,'90',3), (10241,'S18_4933',30,'67',4), (10241,'S24_1046',22,'76',8), (10241,'S24_1628',21,'40',10), (10241,'S24_2766',47,'95',6), (10241,'S24_2887',28,'99',5), (10241,'S24_3191',26,'81',7), (10241,'S24_3432',27,'87',9), (10242,'S24_3969',46,'37',1), (10243,'S18_2325',47,'131',2), (10243,'S24_1937',33,'30',1), (10244,'S18_1342',40,'117',7), (10244,'S18_1367',20,'58',6), (10244,'S18_2795',43,'138',8), (10244,'S18_2949',30,'118',1), (10244,'S18_2957',24,'58',3), (10244,'S18_3136',29,'115',2), (10244,'S18_3320',36,'84',5), (10244,'S24_2022',39,'45',9), (10244,'S24_4258',40,'87',4), (10245,'S10_1949',34,'180',9), (10245,'S10_4962',28,'164',2), (10245,'S12_1666',38,'156',6), (10245,'S18_1097',29,'119',8), (10245,'S18_4600',21,'114',3), (10245,'S18_4668',45,'60',7), (10245,'S32_1268',37,'112',1), (10245,'S32_3522',44,'69',5), (10245,'S700_2824',44,'105',4), (10246,'S12_4473',46,'110',5), (10246,'S18_2238',40,'164',4), (10246,'S18_2319',22,'98',8), (10246,'S18_2432',30,'62',11), (10246,'S18_3232',36,'198',9), (10246,'S24_1444',44,'53',2), (10246,'S24_2300',29,'121',10), (10246,'S24_2840',49,'36',6), (10246,'S24_4048',46,'137',1), (10246,'S32_2509',35,'49',7), (10246,'S50_1392',22,'133',3), (10247,'S12_1108',44,'241',2), (10247,'S12_3148',25,'175',3), (10247,'S12_3891',27,'154',1), (10247,'S18_4027',48,'141',5), (10247,'S32_3207',40,'50',6), (10247,'S50_1514',49,'64',4), (10248,'S10_4757',20,'146',3), (10248,'S18_3029',21,'74',1), (10248,'S18_3140',32,'119',12), (10248,'S18_3259',42,'121',14), (10248,'S18_4522',42,'75',11), (10248,'S24_2011',48,'145',10), (10248,'S24_3151',30,'102',5), (10248,'S24_3816',23,'76',2), (10248,'S700_1138',36,'71',6), (10248,'S700_1938',40,'104',13), (10248,'S700_2610',32,'76',4), (10248,'S700_3505',30,'108',7), (10248,'S700_3962',35,'90',8), (10248,'S72_3212',23,'66',9), (10249,'S18_3856',46,'122',5), (10249,'S24_2841',20,'68',1), (10249,'S24_3420',25,'70',2), (10249,'S700_2047',40,'96',4), (10249,'S72_1253',32,'58',3), (10250,'S18_1662',45,'181',14), (10250,'S18_2581',27,'99',4), (10250,'S24_1785',31,'89',6), (10250,'S24_2000',32,'88',1), (10250,'S24_3949',40,'75',13), (10250,'S24_4278',37,'75',5), (10250,'S32_1374',31,'106',2), (10250,'S32_4289',50,'61',7), (10250,'S50_1341',36,'52',8), (10250,'S700_1691',31,'91',9), (10250,'S700_2466',35,'112',11), (10250,'S700_2834',44,'138',3), (10250,'S700_3167',44,'67',10), (10250,'S700_4002',38,'62',12), (10251,'S10_1678',28,'114',2), (10251,'S10_2016',44,'131',5), (10251,'S10_4698',43,'165',4), (10251,'S12_2823',46,'164',1), (10251,'S18_2625',29,'61',6), (10251,'S24_1578',26,'101',3), (10252,'S18_3278',20,'76',2), (10252,'S18_3482',41,'165',1), (10252,'S18_3782',31,'53',5), (10252,'S18_4721',26,'137',4), (10252,'S24_2360',47,'66',8), (10252,'S24_4620',38,'87',3), (10252,'S32_2206',36,'48',6), (10252,'S32_4485',25,'113',9), (10252,'S50_4713',48,'72',7), (10253,'S12_1099',24,'163',13), (10253,'S12_3380',22,'109',11), (10253,'S12_3990',25,'90',14), (10253,'S12_4675',41,'120',10), (10253,'S18_1129',26,'117',5), (10253,'S18_1589',24,'141',1), (10253,'S18_1889',23,'84',9), (10253,'S18_1984',33,'135',4), (10253,'S18_2870',37,'140',2), (10253,'S18_3232',40,'169',6), (10253,'S18_3685',31,'130',3), (10253,'S24_2972',40,'43',7), (10253,'S24_3371',24,'53',12), (10253,'S24_3856',39,'132',8), (10254,'S18_1749',49,'143',5), (10254,'S18_2248',36,'64',4), (10254,'S18_2325',41,'111',2), (10254,'S18_4409',34,'93',6), (10254,'S18_4933',30,'58',7), (10254,'S24_1046',34,'65',11), (10254,'S24_1628',32,'60',13), (10254,'S24_1937',38,'27',1), (10254,'S24_2766',31,'101',9), (10254,'S24_2887',33,'96',8), (10254,'S24_3191',42,'97',10), (10254,'S24_3432',49,'101',12), (10254,'S24_3969',20,'43',3), (10255,'S18_2795',24,'155',1), (10255,'S24_2022',37,'46',2), (10256,'S18_1342',34,'96',2), (10256,'S18_1367',29,'52',1), (10257,'S18_2949',50,'88',1), (10257,'S18_2957',49,'54',3), (10257,'S18_3136',37,'85',2), (10257,'S18_3320',26,'89',5), (10257,'S24_4258',46,'79',4), (10258,'S10_1949',32,'240',6), (10258,'S12_1666',41,'163',3), (10258,'S18_1097',41,'133',5), (10258,'S18_4668',21,'60',4), (10258,'S32_3522',20,'61',2), (10258,'S700_2824',45,'81',1), (10259,'S10_4962',26,'155',12), (10259,'S12_4473',46,'142',4), (10259,'S18_2238',30,'190',3), (10259,'S18_2319',34,'99',7), (10259,'S18_2432',30,'49',10), (10259,'S18_3232',27,'135',8), (10259,'S18_4600',41,'114',13), (10259,'S24_1444',28,'47',1), (10259,'S24_2300',47,'112',9), (10259,'S24_2840',31,'33',5), (10259,'S32_1268',45,'87',11), (10259,'S32_2509',40,'44',6), (10259,'S50_1392',29,'105',2), (10260,'S12_1108',46,'229',5), (10260,'S12_3148',30,'171',6), (10260,'S12_3891',44,'171',4), (10260,'S18_3140',32,'131',1), (10260,'S18_3259',29,'89',3), (10260,'S18_4027',23,'155',8), (10260,'S24_4048',23,'103',10), (10260,'S32_3207',27,'57',9), (10260,'S50_1514',21,'56',7), (10260,'S700_1938',33,'86',2), (10261,'S10_4757',27,'125',1), (10261,'S18_4522',20,'90',9), (10261,'S24_2011',36,'125',8), (10261,'S24_3151',22,'91',3), (10261,'S700_1138',34,'62',4), (10261,'S700_2610',44,'69',2), (10261,'S700_3505',25,'88',5), (10261,'S700_3962',50,'81',6), (10261,'S72_3212',29,'51',7), (10262,'S18_1662',49,'134',9), (10262,'S18_3029',32,'84',15), (10262,'S18_3856',34,'121',14), (10262,'S24_1785',34,'97',1), (10262,'S24_2841',24,'67',10), (10262,'S24_3420',46,'70',11), (10262,'S24_3816',49,'87',16), (10262,'S24_3949',48,'61',8), (10262,'S32_4289',40,'79',2), (10262,'S50_1341',49,'38',3), (10262,'S700_1691',40,'84',4), (10262,'S700_2047',44,'94',13), (10262,'S700_2466',33,'91',6), (10262,'S700_3167',27,'76',5), (10262,'S700_4002',35,'71',7), (10262,'S72_1253',21,'57',12), (10263,'S10_1678',34,'108',2), (10263,'S10_2016',40,'112',5), (10263,'S10_4698',41,'203',4), (10263,'S12_2823',48,'134',1), (10263,'S18_2581',33,'86',10), (10263,'S18_2625',34,'59',6), (10263,'S24_1578',42,'103',3), (10263,'S24_2000',37,'62',7), (10263,'S24_4278',24,'75',11), (10263,'S32_1374',31,'80',8), (10263,'S700_2834',47,'116',9), (10264,'S18_3782',48,'55',3), (10264,'S18_4721',20,'121',2), (10264,'S24_2360',37,'65',6), (10264,'S24_4620',47,'83',1), (10264,'S32_2206',20,'33',4), (10264,'S32_4485',34,'98',7), (10264,'S50_4713',47,'90',5), (10265,'S18_3278',45,'87',2), (10265,'S18_3482',49,'172',1), (10266,'S12_1099',44,'208',14), (10266,'S12_3380',22,'112',12), (10266,'S12_3990',35,'77',15), (10266,'S12_4675',40,'112',11), (10266,'S18_1129',21,'120',6), (10266,'S18_1589',36,'144',2), (10266,'S18_1889',33,'75',10), (10266,'S18_1984',49,'127',5), (10266,'S18_2870',20,'141',3), (10266,'S18_3232',29,'166',7), (10266,'S18_3685',33,'153',4), (10266,'S24_1628',28,'48',1), (10266,'S24_2972',34,'40',8), (10266,'S24_3371',47,'62',13), (10266,'S24_3856',24,'122',9), (10267,'S18_4933',36,'76',1), (10267,'S24_1046',40,'80',5), (10267,'S24_2766',38,'87',3), (10267,'S24_2887',43,'108',2), (10267,'S24_3191',44,'97',4), (10267,'S24_3432',43,'119',6), (10268,'S18_1342',49,'117',3), (10268,'S18_1367',26,'65',2), (10268,'S18_1749',34,'162',10), (10268,'S18_2248',31,'49',9), (10268,'S18_2325',50,'106',7), (10268,'S18_2795',35,'152',4), (10268,'S18_3320',39,'89',1), (10268,'S18_4409',35,'87',11), (10268,'S24_1937',33,'39',6), (10268,'S24_2022',40,'46',5), (10268,'S24_3969',30,'41',8), (10269,'S18_2957',32,'63',1), (10269,'S24_4258',48,'97',2), (10270,'S10_1949',21,'234',9), (10270,'S10_4962',32,'134',2), (10270,'S12_1666',28,'146',6), (10270,'S18_1097',43,'97',8), (10270,'S18_2949',31,'96',10), (10270,'S18_3136',38,'126',11), (10270,'S18_4600',38,'142',3), (10270,'S18_4668',44,'58',7), (10270,'S32_1268',32,'86',1), (10270,'S32_3522',21,'63',5), (10270,'S700_2824',46,'88',4), (10271,'S12_4473',31,'97',5), (10271,'S18_2238',50,'183',4), (10271,'S18_2319',50,'102',8), (10271,'S18_2432',25,'69',11), (10271,'S18_3232',20,'196',9), (10271,'S24_1444',45,'65',2), (10271,'S24_2300',43,'130',10), (10271,'S24_2840',38,'42',6), (10271,'S24_4048',22,'140',1), (10271,'S32_2509',35,'48',7), (10271,'S50_1392',34,'98',3), (10272,'S12_1108',35,'166',2), (10272,'S12_3148',27,'159',3), (10272,'S12_3891',39,'204',1), (10272,'S18_4027',25,'149',5), (10272,'S32_3207',45,'65',6), (10272,'S50_1514',43,'57',4), (10273,'S10_4757',30,'117',4), (10273,'S18_3029',34,'98',2), (10273,'S18_3140',40,'126',13), (10273,'S18_3259',47,'116',15), (10273,'S18_3856',50,'86',1), (10273,'S18_4522',33,'71',12), (10273,'S24_2011',22,'127',11), (10273,'S24_3151',27,'104',6), (10273,'S24_3816',48,'83',3), (10273,'S700_1138',21,'65',7), (10273,'S700_1938',21,'102',14), (10273,'S700_2610',42,'62',5), (10273,'S700_3505',40,'86',8), (10273,'S700_3962',26,'114',9), (10273,'S72_3212',37,'46',10), (10274,'S18_1662',41,'164',1), (10274,'S24_2841',40,'65',2), (10274,'S24_3420',24,'72',3), (10274,'S700_2047',24,'91',5), (10274,'S72_1253',32,'59',4), (10275,'S10_1678',45,'93',1), (10275,'S10_2016',22,'132',4), (10275,'S10_4698',36,'192',3), (10275,'S18_2581',35,'90',9), (10275,'S18_2625',37,'64',5), (10275,'S24_1578',21,'103',2), (10275,'S24_1785',25,'95',11), (10275,'S24_2000',30,'80',6), (10275,'S24_3949',41,'82',18), (10275,'S24_4278',27,'62',10), (10275,'S32_1374',23,'82',7), (10275,'S32_4289',28,'64',12), (10275,'S50_1341',38,'45',13), (10275,'S700_1691',32,'90',14), (10275,'S700_2466',39,'115',16), (10275,'S700_2834',48,'133',8), (10275,'S700_3167',43,'74',15), (10275,'S700_4002',31,'73',17), (10276,'S12_1099',50,'193',3), (10276,'S12_2823',43,'121',14), (10276,'S12_3380',47,'116',1), (10276,'S12_3990',38,'84',4), (10276,'S18_3278',38,'70',6), (10276,'S18_3482',30,'131',5), (10276,'S18_3782',33,'50',9), (10276,'S18_4721',48,'119',8), (10276,'S24_2360',46,'75',12), (10276,'S24_3371',20,'61',2), (10276,'S24_4620',48,'75',7), (10276,'S32_2206',27,'37',10), (10276,'S32_4485',38,'113',13), (10276,'S50_4713',21,'71',11), (10277,'S12_4675',28,'112',1), (10278,'S18_1129',34,'137',6), (10278,'S18_1589',23,'113',2), (10278,'S18_1889',29,'91',10), (10278,'S18_1984',29,'129',5), (10278,'S18_2870',39,'111',3), (10278,'S18_3232',42,'152',7), (10278,'S18_3685',31,'133',4), (10278,'S24_1628',35,'45',1), (10278,'S24_2972',31,'39',8), (10278,'S24_3856',25,'126',9), (10279,'S18_4933',26,'61',1), (10279,'S24_1046',32,'75',5), (10279,'S24_2766',49,'80',3), (10279,'S24_2887',48,'116',2), (10279,'S24_3191',33,'71',4), (10279,'S24_3432',48,'129',6), (10280,'S10_1949',34,'236',2), (10280,'S18_1097',24,'117',1), (10280,'S18_1342',50,'105',9), (10280,'S18_1367',27,'58',8), (10280,'S18_1749',26,'141',16), (10280,'S18_2248',25,'63',15), (10280,'S18_2325',37,'128',13), (10280,'S18_2795',22,'203',10), (10280,'S18_2949',46,'111',3), (10280,'S18_2957',43,'69',5), (10280,'S18_3136',29,'104',4), (10280,'S18_3320',34,'102',7), (10280,'S18_4409',35,'106',17), (10280,'S24_1937',20,'29',12), (10280,'S24_2022',45,'47',11), (10280,'S24_3969',33,'42',14), (10280,'S24_4258',21,'79',6), (10281,'S10_4962',44,'160',9), (10281,'S12_1666',25,'118',13), (10281,'S12_4473',41,'128',1), (10281,'S18_2319',48,'120',4), (10281,'S18_2432',29,'58',7), (10281,'S18_3232',25,'168',5), (10281,'S18_4600',25,'99',10), (10281,'S18_4668',44,'60',14), (10281,'S24_2300',25,'111',6), (10281,'S24_2840',20,'41',2), (10281,'S32_1268',29,'83',8), (10281,'S32_2509',31,'55',3), (10281,'S32_3522',36,'78',12), (10281,'S700_2824',27,'86',11), (10282,'S12_1108',41,'172',5), (10282,'S12_3148',27,'162',6), (10282,'S12_3891',24,'157',4), (10282,'S18_2238',23,'141',13), (10282,'S18_3140',43,'156',1), (10282,'S18_3259',36,'116',3), (10282,'S18_4027',31,'151',8), (10282,'S24_1444',29,'47',11), (10282,'S24_4048',39,'123',10), (10282,'S32_3207',36,'60',9), (10282,'S50_1392',38,'113',12), (10282,'S50_1514',37,'67',7), (10282,'S700_1938',43,'87',2), (10283,'S10_4757',25,'120',6), (10283,'S18_3029',21,'98',4), (10283,'S18_3856',46,'126',3), (10283,'S18_4522',34,'105',14), (10283,'S24_2011',42,'127',13), (10283,'S24_3151',34,'93',8), (10283,'S24_3816',33,'73',5), (10283,'S700_1138',45,'79',9), (10283,'S700_2047',20,'94',2), (10283,'S700_2610',47,'66',7), (10283,'S700_3505',22,'88',10), (10283,'S700_3962',38,'89',11), (10283,'S72_1253',43,'58',1), (10283,'S72_3212',33,'51',12), (10284,'S18_1662',45,'128',11), (10284,'S18_2581',31,'72',1), (10284,'S24_1785',22,'105',3), (10284,'S24_2841',30,'74',12), (10284,'S24_3420',39,'72',13), (10284,'S24_3949',21,'56',10), (10284,'S24_4278',21,'71',2), (10284,'S32_4289',50,'82',4), (10284,'S50_1341',33,'52',5), (10284,'S700_1691',24,'83',6), (10284,'S700_2466',45,'102',8), (10284,'S700_3167',25,'70',7), (10284,'S700_4002',32,'64',9), (10285,'S10_1678',36,'114',6), (10285,'S10_2016',47,'138',9), (10285,'S10_4698',27,'201',8), (10285,'S12_2823',49,'140',5), (10285,'S18_2625',20,'49',10), (10285,'S24_1578',34,'109',7), (10285,'S24_2000',39,'70',11), (10285,'S24_2360',38,'60',3), (10285,'S32_1374',37,'99',12), (10285,'S32_2206',37,'41',1), (10285,'S32_4485',26,'100',4), (10285,'S50_4713',39,'79',2), (10285,'S700_2834',45,'120',13), (10286,'S18_3782',38,'57',1), (10287,'S12_1099',21,'163',12), (10287,'S12_3380',45,'106',10), (10287,'S12_3990',41,'69',13), (10287,'S12_4675',23,'116',9), (10287,'S18_1129',41,'159',4), (10287,'S18_1889',44,'82',8), (10287,'S18_1984',24,'147',3), (10287,'S18_2870',44,'115',1), (10287,'S18_3232',36,'163',5), (10287,'S18_3278',43,'71',15), (10287,'S18_3482',40,'169',14), (10287,'S18_3685',27,'160',2), (10287,'S18_4721',34,'126',17), (10287,'S24_2972',36,'40',6), (10287,'S24_3371',20,'68',11), (10287,'S24_3856',36,'119',7), (10287,'S24_4620',40,'88',16), (10288,'S18_1589',20,'147',14), (10288,'S18_1749',32,'184',5), (10288,'S18_2248',28,'62',4), (10288,'S18_2325',31,'123',2), (10288,'S18_4409',35,'81',6), (10288,'S18_4933',23,'73',7), (10288,'S24_1046',36,'66',11), (10288,'S24_1628',50,'52',13), (10288,'S24_1937',29,'38',1), (10288,'S24_2766',35,'81',9), (10288,'S24_2887',48,'136',8), (10288,'S24_3191',34,'68',10), (10288,'S24_3432',41,'119',12), (10288,'S24_3969',33,'41',3), (10289,'S18_1342',38,'120',2), (10289,'S18_1367',24,'56',1), (10289,'S18_2795',43,'192',3), (10289,'S24_2022',45,'48',4), (10290,'S18_3320',26,'96',2), (10290,'S24_4258',45,'115',1), (10291,'S10_1949',37,'193',11), (10291,'S10_4962',30,'129',4), (10291,'S12_1666',41,'156',8), (10291,'S18_1097',41,'114',10), (10291,'S18_2432',26,'58',2), (10291,'S18_2949',47,'122',12), (10291,'S18_2957',37,'51',14), (10291,'S18_3136',23,'125',13), (10291,'S18_4600',48,'110',5), (10291,'S18_4668',29,'52',9), (10291,'S24_2300',48,'112',1), (10291,'S32_1268',26,'84',3), (10291,'S32_3522',32,'72',7), (10291,'S700_2824',28,'116',6), (10292,'S12_4473',21,'105',8), (10292,'S18_2238',26,'175',7), (10292,'S18_2319',41,'110',11), (10292,'S18_3232',21,'135',12), (10292,'S18_4027',44,'162',2), (10292,'S24_1444',40,'54',5), (10292,'S24_2840',39,'30',9), (10292,'S24_4048',27,'142',4), (10292,'S32_2509',50,'47',10), (10292,'S32_3207',31,'68',3), (10292,'S50_1392',41,'122',6), (10292,'S50_1514',35,'55',1), (10293,'S12_1108',46,'183',8), (10293,'S12_3148',24,'177',9), (10293,'S12_3891',45,'183',7), (10293,'S18_3140',24,'117',4), (10293,'S18_3259',22,'110',6), (10293,'S18_4522',49,'101',3), (10293,'S24_2011',21,'140',2), (10293,'S700_1938',29,'72',5), (10293,'S72_3212',32,'60',1), (10294,'S700_3962',45,'104',1), (10295,'S10_4757',24,'143',1), (10295,'S24_3151',46,'85',3), (10295,'S700_1138',26,'75',4), (10295,'S700_2610',44,'59',2), (10295,'S700_3505',34,'102',5), (10296,'S18_1662',36,'158',7), (10296,'S18_3029',21,'96',13), (10296,'S18_3856',22,'85',12), (10296,'S24_2841',21,'71',8), (10296,'S24_3420',31,'54',9), (10296,'S24_3816',22,'77',14), (10296,'S24_3949',32,'72',6), (10296,'S50_1341',26,'48',1), (10296,'S700_1691',42,'102',2), (10296,'S700_2047',34,'102',11), (10296,'S700_2466',24,'102',4), (10296,'S700_3167',22,'81',3), (10296,'S700_4002',47,'87',5), (10296,'S72_1253',21,'45',10), (10297,'S18_2581',25,'83',4), (10297,'S24_1785',32,'127',6), (10297,'S24_2000',32,'66',1), (10297,'S24_4278',23,'72',5), (10297,'S32_1374',26,'110',2), (10297,'S32_4289',28,'80',7), (10297,'S700_2834',35,'114',3), (10298,'S10_2016',39,'96',1), (10298,'S18_2625',32,'48',2), (10299,'S10_1678',23,'113',9), (10299,'S10_4698',29,'230',11), (10299,'S12_2823',24,'173',8), (10299,'S18_3782',39,'56',3), (10299,'S18_4721',49,'162',2), (10299,'S24_1578',47,'116',10), (10299,'S24_2360',33,'66',6), (10299,'S24_4620',32,'81',1), (10299,'S32_2206',24,'42',4), (10299,'S32_4485',38,'115',7), (10299,'S50_4713',44,'81',5), (10300,'S12_1099',33,'167',5), (10300,'S12_3380',29,'137',3), (10300,'S12_3990',22,'77',6), (10300,'S12_4675',23,'122',2), (10300,'S18_1889',41,'92',1), (10300,'S18_3278',49,'79',8), (10300,'S18_3482',23,'165',7), (10300,'S24_3371',31,'59',4), (10301,'S18_1129',37,'160',8), (10301,'S18_1589',32,'107',4), (10301,'S18_1984',47,'159',7), (10301,'S18_2870',22,'147',5), (10301,'S18_3232',23,'174',9), (10301,'S18_3685',39,'165',6), (10301,'S24_1046',27,'72',1), (10301,'S24_1628',22,'51',3), (10301,'S24_2972',48,'34',10), (10301,'S24_3432',22,'96',2), (10301,'S24_3856',50,'154',11), (10302,'S18_1749',43,'170',1), (10302,'S18_4409',38,'89',2), (10302,'S18_4933',23,'73',3), (10302,'S24_2766',49,'108',5), (10302,'S24_2887',45,'123',4), (10302,'S24_3191',48,'74',6), (10303,'S18_2248',46,'49',2), (10303,'S24_3969',24,'40',1), (10304,'S10_1949',47,'216',6), (10304,'S12_1666',39,'164',3), (10304,'S18_1097',46,'98',5), (10304,'S18_1342',37,'96',13), (10304,'S18_1367',37,'49',12), (10304,'S18_2325',24,'102',17), (10304,'S18_2795',20,'179',14), (10304,'S18_2949',46,'100',7), (10304,'S18_2957',24,'65',9), (10304,'S18_3136',26,'86',8), (10304,'S18_3320',38,'104',11), (10304,'S18_4668',34,'49',4), (10304,'S24_1937',23,'30',16), (10304,'S24_2022',44,'39',15), (10304,'S24_4258',33,'101',10), (10304,'S32_3522',36,'73',2), (10304,'S700_2824',40,'105',1), (10305,'S10_4962',38,'176',13), (10305,'S12_4473',38,'126',5), (10305,'S18_2238',27,'146',4), (10305,'S18_2319',36,'134',8), (10305,'S18_2432',41,'53',11), (10305,'S18_3232',37,'202',9), (10305,'S18_4600',22,'99',14), (10305,'S24_1444',45,'62',2), (10305,'S24_2300',24,'133',10), (10305,'S24_2840',48,'31',6), (10305,'S24_4048',36,'129',1), (10305,'S32_1268',28,'113',12), (10305,'S32_2509',40,'58',7), (10305,'S50_1392',42,'110',3), (10306,'S12_1108',31,'212',13), (10306,'S12_3148',34,'147',14), (10306,'S12_3891',20,'182',12), (10306,'S18_3140',32,'117',9), (10306,'S18_3259',40,'92',11), (10306,'S18_4027',23,'157',16), (10306,'S18_4522',39,'90',8), (10306,'S24_2011',29,'111',7), (10306,'S24_3151',31,'84',2), (10306,'S32_3207',46,'50',17), (10306,'S50_1514',34,'60',15), (10306,'S700_1138',50,'54',3), (10306,'S700_1938',38,'92',10), (10306,'S700_2610',43,'75',1), (10306,'S700_3505',32,'90',4), (10306,'S700_3962',30,'117',5), (10306,'S72_3212',35,'60',6), (10307,'S10_4757',22,'122',9), (10307,'S18_1662',39,'189',1), (10307,'S18_3029',31,'83',7), (10307,'S18_3856',48,'87',6), (10307,'S24_2841',25,'75',2), (10307,'S24_3420',22,'72',3), (10307,'S24_3816',22,'91',8), (10307,'S700_2047',34,'98',5), (10307,'S72_1253',34,'54',4), (10308,'S10_2016',34,'119',2), (10308,'S10_4698',20,'229',1), (10308,'S18_2581',27,'83',7), (10308,'S18_2625',34,'52',3), (10308,'S24_1785',31,'113',9), (10308,'S24_2000',47,'63',4), (10308,'S24_3949',43,'76',16), (10308,'S24_4278',44,'83',8), (10308,'S32_1374',24,'80',5), (10308,'S32_4289',46,'66',10), (10308,'S50_1341',47,'44',11), (10308,'S700_1691',21,'106',12), (10308,'S700_2466',35,'89',14), (10308,'S700_2834',31,'129',6), (10308,'S700_3167',21,'87',13), (10308,'S700_4002',39,'68',15), (10309,'S10_1678',41,'107',5), (10309,'S12_2823',26,'179',4), (10309,'S24_1578',21,'126',6), (10309,'S24_2360',24,'56',2), (10309,'S32_4485',50,'85',3), (10309,'S50_4713',28,'89',1), (10310,'S12_1099',33,'210',10), (10310,'S12_3380',24,'129',8), (10310,'S12_3990',49,'81',11), (10310,'S12_4675',25,'100',7), (10310,'S18_1129',37,'168',2), (10310,'S18_1889',20,'92',6), (10310,'S18_1984',24,'144',1), (10310,'S18_3232',48,'186',3), (10310,'S18_3278',27,'80',13), (10310,'S18_3482',49,'128',12), (10310,'S18_3782',42,'67',16), (10310,'S18_4721',40,'134',15), (10310,'S24_2972',33,'42',4), (10310,'S24_3371',38,'57',9), (10310,'S24_3856',45,'122',5), (10310,'S24_4620',49,'97',14), (10310,'S32_2206',36,'43',17), (10311,'S18_1589',29,'101',9), (10311,'S18_2870',43,'123',10), (10311,'S18_3685',32,'113',11), (10311,'S18_4409',41,'82',1), (10311,'S18_4933',25,'67',2), (10311,'S24_1046',26,'87',6), (10311,'S24_1628',45,'49',8), (10311,'S24_2766',28,'94',4), (10311,'S24_2887',43,'107',3), (10311,'S24_3191',25,'83',5), (10311,'S24_3432',46,'92',7), (10312,'S10_1949',48,'242',3), (10312,'S18_1097',32,'131',2), (10312,'S18_1342',43,'89',10), (10312,'S18_1367',25,'44',9), (10312,'S18_1749',48,'168',17), (10312,'S18_2248',30,'61',16), (10312,'S18_2325',31,'153',14), (10312,'S18_2795',25,'155',11), (10312,'S18_2949',37,'100',4), (10312,'S18_2957',35,'54',6), (10312,'S18_3136',38,'117',5), (10312,'S18_3320',33,'107',8), (10312,'S18_4668',39,'57',1), (10312,'S24_1937',39,'30',13), (10312,'S24_2022',23,'38',12), (10312,'S24_3969',31,'35',15), (10312,'S24_4258',44,'111',7), (10313,'S10_4962',40,'167',7), (10313,'S12_1666',21,'127',11), (10313,'S18_2319',29,'118',2), (10313,'S18_2432',34,'53',5), (10313,'S18_3232',25,'183',3), (10313,'S18_4600',28,'103',8), (10313,'S24_2300',42,'133',4), (10313,'S32_1268',27,'88',6), (10313,'S32_2509',38,'45',1), (10313,'S32_3522',34,'56',10), (10313,'S700_2824',30,'99',9); INSERT INTO `orderdetails` (`ORDERNUMBER`,`PRODUCTCODE`,`QUANTITYORDERED`,`PRICEEACH`,`ORDERLINENUMBER`) VALUES (10314,'S12_1108',38,'210',5), (10314,'S12_3148',46,'139',6), (10314,'S12_3891',36,'192',4), (10314,'S12_4473',45,'137',14), (10314,'S18_2238',42,'138',13), (10314,'S18_3140',20,'137',1), (10314,'S18_3259',23,'108',3), (10314,'S18_4027',29,'145',8), (10314,'S24_1444',44,'53',11), (10314,'S24_2840',39,'37',15), (10314,'S24_4048',38,'105',10), (10314,'S32_3207',35,'66',9), (10314,'S50_1392',28,'122',12), (10314,'S50_1514',38,'62',7), (10314,'S700_1938',23,'76',2), (10315,'S18_4522',36,'100',7), (10315,'S24_2011',35,'120',6), (10315,'S24_3151',24,'87',1), (10315,'S700_1138',41,'62',2), (10315,'S700_3505',31,'86',3), (10315,'S700_3962',37,'91',4), (10315,'S72_3212',40,'56',5), (10316,'S10_4757',33,'125',17), (10316,'S18_1662',27,'137',9), (10316,'S18_3029',21,'95',15), (10316,'S18_3856',47,'87',14), (10316,'S24_1785',25,'115',1), (10316,'S24_2841',34,'64',10), (10316,'S24_3420',47,'77',11), (10316,'S24_3816',25,'92',16), (10316,'S24_3949',30,'78',8), (10316,'S32_4289',24,'59',2), (10316,'S50_1341',34,'48',3), (10316,'S700_1691',34,'82',4), (10316,'S700_2047',45,'93',13), (10316,'S700_2466',23,'118',6), (10316,'S700_2610',48,'74',18), (10316,'S700_3167',48,'75',5), (10316,'S700_4002',44,'62',7), (10316,'S72_1253',34,'44',12), (10317,'S24_4278',35,'83',1), (10318,'S10_1678',46,'95',1), (10318,'S10_2016',45,'124',4), (10318,'S10_4698',37,'207',3), (10318,'S18_2581',31,'101',9), (10318,'S18_2625',42,'53',5), (10318,'S24_1578',48,'134',2), (10318,'S24_2000',26,'87',6), (10318,'S32_1374',47,'113',7), (10318,'S700_2834',50,'142',8), (10319,'S12_2823',30,'137',9), (10319,'S18_3278',46,'74',1), (10319,'S18_3782',44,'59',4), (10319,'S18_4721',45,'176',3), (10319,'S24_2360',31,'82',7), (10319,'S24_4620',43,'86',2), (10319,'S32_2206',29,'38',5), (10319,'S32_4485',22,'119',8), (10319,'S50_4713',45,'77',6), (10320,'S12_1099',31,'222',3), (10320,'S12_3380',35,'139',1), (10320,'S12_3990',38,'73',4), (10320,'S18_3482',25,'140',5), (10320,'S24_3371',26,'61',2), (10321,'S12_4675',24,'124',15), (10321,'S18_1129',41,'142',10), (10321,'S18_1589',44,'102',6), (10321,'S18_1889',37,'79',14), (10321,'S18_1984',25,'149',9), (10321,'S18_2870',27,'106',7), (10321,'S18_3232',33,'173',11), (10321,'S18_3685',28,'151',8), (10321,'S24_1046',30,'71',3), (10321,'S24_1628',48,'42',5), (10321,'S24_2766',30,'73',1), (10321,'S24_2972',37,'33',12), (10321,'S24_3191',39,'85',2), (10321,'S24_3432',21,'90',4), (10321,'S24_3856',26,'156',13), (10322,'S10_1949',40,'150',1), (10322,'S10_4962',46,'62',8), (10322,'S12_1666',27,'177',9), (10322,'S18_1097',22,'102',10), (10322,'S18_1342',43,'86',14), (10322,'S18_1367',41,'58',5), (10322,'S18_2325',50,'251',6), (10322,'S18_2432',35,'61',11), (10322,'S18_2795',36,'161',2), (10322,'S18_2949',33,'107',12), (10322,'S18_2957',41,'30',13), (10322,'S18_3136',48,'47',7), (10322,'S24_1937',20,'131',3), (10322,'S24_2022',30,'117',4), (10323,'S18_3320',33,'91',2), (10323,'S18_4600',47,'132',1), (10324,'S12_3148',27,'54',1), (10324,'S12_4473',26,'58',7), (10324,'S18_2238',47,'153',8), (10324,'S18_2319',33,'37',10), (10324,'S18_3232',27,'117',12), (10324,'S18_4027',49,'110',13), (10324,'S18_4668',38,'180',6), (10324,'S24_1444',25,'69',14), (10324,'S24_2300',31,'123',2), (10324,'S24_2840',30,'111',9), (10324,'S24_4258',33,'190',3), (10324,'S32_1268',20,'98',11), (10324,'S32_3522',48,'171',4), (10324,'S700_2824',34,'125',5), (10325,'S10_4757',47,'65',6), (10325,'S12_1108',42,'64',8), (10325,'S12_3891',24,'108',1), (10325,'S18_3140',24,'69',9), (10325,'S24_4048',44,'121',5), (10325,'S32_2509',38,'233',3), (10325,'S32_3207',28,'192',2), (10325,'S50_1392',38,'137',4), (10325,'S50_1514',44,'135',7), (10326,'S18_3259',32,'119',6), (10326,'S18_4522',50,'86',5), (10326,'S24_2011',41,'106',4), (10326,'S24_3151',41,'86',3), (10326,'S24_3816',20,'92',2), (10326,'S700_1138',39,'60',1), (10327,'S18_1662',25,'112',6), (10327,'S18_2581',45,'106',8), (10327,'S18_3029',25,'46',5), (10327,'S700_1938',20,'173',7), (10327,'S700_2610',21,'96',1), (10327,'S700_3505',43,'80',2), (10327,'S700_3962',37,'87',3), (10327,'S72_3212',37,'87',4), (10328,'S18_3856',34,'112',6), (10328,'S24_1785',47,'88',14), (10328,'S24_2841',48,'59',1), (10328,'S24_3420',20,'73',2), (10328,'S24_3949',35,'76',3), (10328,'S24_4278',43,'61',4), (10328,'S32_4289',24,'81',5), (10328,'S50_1341',34,'52',7), (10328,'S700_1691',27,'102',8), (10328,'S700_2047',41,'101',9), (10328,'S700_2466',37,'109',10), (10328,'S700_2834',33,'123',11), (10328,'S700_3167',33,'64',13), (10328,'S700_4002',39,'86',12), (10329,'S10_1678',42,'105',1), (10329,'S10_2016',20,'159',2), (10329,'S10_4698',26,'226',3), (10329,'S12_1099',41,'71',5), (10329,'S12_2823',24,'148',6), (10329,'S12_3380',46,'84',13), (10329,'S12_3990',33,'109',14), (10329,'S12_4675',39,'65',15), (10329,'S18_1889',29,'102',9), (10329,'S18_2625',38,'139',12), (10329,'S18_3278',38,'59',10), (10329,'S24_1578',30,'88',7), (10329,'S24_2000',37,'94',4), (10329,'S32_1374',45,'64',11), (10329,'S72_1253',44,'86',8), (10330,'S18_3482',37,'119',3), (10330,'S18_3782',29,'70',2), (10330,'S18_4721',50,'122',4), (10330,'S24_2360',42,'81',1), (10331,'S18_1129',46,'140',6), (10331,'S18_1589',44,'110',14), (10331,'S18_1749',44,'74',7), (10331,'S18_1984',30,'32',8), (10331,'S18_2870',26,'65',10), (10331,'S18_3232',27,'154',11), (10331,'S18_3685',26,'68',12), (10331,'S24_2972',27,'42',13), (10331,'S24_3371',25,'123',9), (10331,'S24_3856',21,'149',1), (10331,'S24_4620',41,'139',2), (10331,'S32_2206',28,'147',3), (10331,'S32_4485',32,'157',4), (10331,'S50_4713',20,'183',5), (10332,'S18_1342',46,'95',15), (10332,'S18_1367',27,'90',16), (10332,'S18_2248',38,'84',9), (10332,'S18_2325',35,'65',8), (10332,'S18_2795',24,'53',1), (10332,'S18_2957',26,'115',17), (10332,'S18_3136',40,'40',18), (10332,'S18_4409',50,'146',2), (10332,'S18_4933',21,'165',3), (10332,'S24_1046',23,'57',4), (10332,'S24_1628',20,'88',5), (10332,'S24_1937',45,'82',6), (10332,'S24_2022',26,'86',10), (10332,'S24_2766',39,'87',7), (10332,'S24_2887',44,'42',11), (10332,'S24_3191',45,'34',12), (10332,'S24_3432',31,'37',13), (10332,'S24_3969',41,'77',14), (10333,'S10_1949',26,'116',3), (10333,'S12_1666',33,'99',6), (10333,'S18_1097',29,'40',7), (10333,'S18_2949',31,'90',5), (10333,'S18_3320',46,'246',2), (10333,'S18_4668',24,'80',8), (10333,'S24_4258',39,'113',1), (10333,'S32_3522',33,'74',4), (10334,'S10_4962',26,'123',2), (10334,'S18_2319',46,'126',6), (10334,'S18_2432',34,'61',1), (10334,'S18_3232',20,'144',3), (10334,'S18_4600',49,'138',4), (10334,'S24_2300',42,'132',5), (10335,'S24_2840',33,'37',2), (10335,'S32_1268',44,'108',1), (10335,'S32_2509',40,'61',3), (10336,'S12_1108',33,'57',10), (10336,'S12_3148',33,'123',11), (10336,'S12_3891',49,'63',1), (10336,'S12_4473',38,'168',3), (10336,'S18_2238',49,'152',6), (10336,'S18_3140',48,'120',12), (10336,'S18_3259',21,'106',7), (10336,'S24_1444',45,'133',4), (10336,'S24_4048',31,'149',5), (10336,'S32_3207',31,'85',9), (10336,'S50_1392',23,'137',8), (10336,'S700_2824',46,'208',2), (10337,'S10_4757',25,'48',8), (10337,'S18_4027',36,'158',3), (10337,'S18_4522',29,'155',2), (10337,'S24_2011',29,'72',4), (10337,'S50_1514',21,'109',6), (10337,'S700_1938',36,'70',9), (10337,'S700_3505',31,'89',1), (10337,'S700_3962',36,'72',7), (10337,'S72_3212',42,'97',5), (10338,'S18_1662',41,'137',1), (10338,'S18_3029',28,'83',3), (10338,'S18_3856',45,'123',2), (10339,'S10_2016',40,'69',4), (10339,'S10_4698',39,'77',3), (10339,'S18_2581',27,'104',2), (10339,'S18_2625',30,'62',1), (10339,'S24_1578',27,'84',10), (10339,'S24_1785',21,'51',7), (10339,'S24_2841',55,'113',12), (10339,'S24_3151',55,'196',13), (10339,'S24_3420',29,'100',14), (10339,'S24_3816',42,'59',16), (10339,'S24_3949',45,'97',11), (10339,'S700_1138',22,'128',5), (10339,'S700_2047',55,'71',15), (10339,'S700_2610',50,'74',9), (10339,'S700_4002',50,'58',8), (10339,'S72_1253',27,'76',6), (10340,'S24_2000',55,'80',8), (10340,'S24_4278',40,'85',1), (10340,'S32_1374',55,'118',2), (10340,'S32_4289',39,'59',3), (10340,'S50_1341',40,'51',4), (10340,'S700_1691',30,'89',5), (10340,'S700_2466',55,'88',7), (10340,'S700_2834',29,'141',6), (10341,'S10_1678',41,'189',9), (10341,'S12_1099',45,'80',2), (10341,'S12_2823',55,'148',8), (10341,'S12_3380',44,'96',1), (10341,'S12_3990',36,'94',10), (10341,'S12_4675',55,'75',7), (10341,'S24_2360',32,'103',6), (10341,'S32_4485',31,'71',4), (10341,'S50_4713',38,'123',3), (10341,'S700_3167',34,'107',5), (10342,'S18_1129',40,'161',2), (10342,'S18_1889',55,'65',1), (10342,'S18_1984',22,'144',3), (10342,'S18_3232',30,'168',4), (10342,'S18_3278',25,'67',5), (10342,'S18_3482',55,'119',7), (10342,'S18_3782',26,'56',8), (10342,'S18_4721',38,'165',11), (10342,'S24_2972',39,'40',9), (10342,'S24_3371',48,'62',10), (10342,'S24_3856',42,'119',6), (10343,'S18_1589',36,'162',4), (10343,'S18_2870',25,'52',3), (10343,'S18_3685',44,'85',2), (10343,'S24_1628',27,'36',6), (10343,'S24_4620',30,'103',1), (10343,'S32_2206',29,'128',5), (10344,'S18_1749',45,'170',1), (10344,'S18_2248',40,'57',2), (10344,'S18_2325',30,'131',3), (10344,'S18_4409',21,'105',4), (10344,'S18_4933',26,'63',5), (10344,'S24_1046',29,'60',7), (10344,'S24_1937',20,'35',6), (10345,'S24_2022',43,'54',1), (10346,'S18_1342',42,'36',3), (10346,'S24_2766',25,'115',1), (10346,'S24_2887',24,'87',5), (10346,'S24_3191',24,'139',2), (10346,'S24_3432',26,'96',6), (10346,'S24_3969',22,'97',4), (10347,'S10_1949',30,'131',1), (10347,'S10_4962',27,'164',2), (10347,'S12_1666',29,'124',3), (10347,'S18_1097',42,'50',5), (10347,'S18_1367',21,'59',7), (10347,'S18_2432',50,'137',8), (10347,'S18_2795',21,'229',6), (10347,'S18_2949',48,'100',9), (10347,'S18_2957',34,'65',10), (10347,'S18_3136',45,'110',11), (10347,'S18_3320',26,'102',12), (10347,'S18_4600',45,'131',4), (10348,'S12_1108',48,'52',8), (10348,'S12_3148',47,'102',4), (10348,'S18_4668',29,'245',6), (10348,'S24_2300',37,'162',1), (10348,'S24_4258',39,'50',2), (10348,'S32_1268',42,'152',3), (10348,'S32_3522',31,'101',5), (10348,'S700_2824',32,'83',7), (10349,'S12_3891',26,'170',10), (10349,'S12_4473',48,'109',9), (10349,'S18_2238',38,'177',8), (10349,'S18_2319',38,'137',7), (10349,'S18_3232',48,'154',6), (10349,'S18_4027',34,'129',5), (10349,'S24_1444',48,'47',4), (10349,'S24_2840',36,'37',3), (10349,'S24_4048',23,'138',2), (10349,'S32_2509',33,'47',1), (10350,'S10_4757',26,'75',5), (10350,'S18_3029',43,'65',6), (10350,'S18_3140',44,'118',1), (10350,'S18_3259',41,'93',2), (10350,'S18_4522',30,'101',3), (10350,'S24_2011',34,'50',7), (10350,'S24_3151',30,'101',9), (10350,'S24_3816',25,'60',10), (10350,'S32_3207',27,'163',14), (10350,'S50_1392',31,'71',8), (10350,'S50_1514',44,'148',17), (10350,'S700_1138',46,'77',11), (10350,'S700_1938',28,'104',4), (10350,'S700_2610',29,'75',12), (10350,'S700_3505',31,'77',13), (10350,'S700_3962',25,'114',16), (10350,'S72_3212',20,'112',15), (10351,'S18_1662',39,'100',1), (10351,'S18_3856',20,'169',2), (10351,'S24_2841',25,'75',5), (10351,'S24_3420',38,'68',4), (10351,'S24_3949',34,'59',3), (10352,'S700_2047',23,'102',3), (10352,'S700_2466',49,'101',2), (10352,'S700_4002',22,'76',1), (10352,'S72_1253',49,'53',4), (10353,'S18_2581',27,'130',1), (10353,'S24_1785',28,'72',2), (10353,'S24_4278',35,'90',3), (10353,'S32_1374',46,'81',5), (10353,'S32_4289',40,'45',7), (10353,'S50_1341',40,'82',8), (10353,'S700_1691',39,'129',9), (10353,'S700_2834',48,'69',4), (10353,'S700_3167',43,'82',6), (10354,'S10_1678',42,'86',6), (10354,'S10_2016',20,'105',2), (10354,'S10_4698',42,'213',3), (10354,'S12_1099',31,'93',9), (10354,'S12_2823',35,'183',4), (10354,'S12_3380',29,'73',11), (10354,'S12_3990',23,'51',12), (10354,'S12_4675',28,'87',13), (10354,'S18_1889',21,'110',8), (10354,'S18_2625',28,'166',10), (10354,'S18_3278',36,'82',7), (10354,'S24_1578',21,'114',5), (10354,'S24_2000',28,'69',1), (10355,'S18_3482',23,'138',7), (10355,'S18_3782',31,'53',1), (10355,'S18_4721',25,'168',2), (10355,'S24_2360',41,'71',3), (10355,'S24_2972',36,'39',4), (10355,'S24_3371',44,'62',6), (10355,'S24_3856',32,'166',8), (10355,'S24_4620',28,'95',9), (10355,'S32_2206',38,'40',10), (10355,'S32_4485',40,'108',5), (10356,'S18_1129',43,'98',8), (10356,'S18_1342',50,'50',9), (10356,'S18_1367',22,'72',6), (10356,'S18_1984',27,'65',2), (10356,'S18_2325',29,'125',3), (10356,'S18_2795',30,'149',1), (10356,'S24_1937',48,'203',5), (10356,'S24_2022',26,'32',7), (10356,'S50_4713',26,'151',4), (10357,'S10_1949',32,'178',10), (10357,'S10_4962',43,'134',9), (10357,'S12_1666',49,'122',8), (10357,'S18_1097',39,'98',1), (10357,'S18_2432',41,'62',7), (10357,'S18_2949',41,'87',6), (10357,'S18_2957',49,'71',5), (10357,'S18_3136',44,'117',4), (10357,'S18_3320',25,'104',3), (10357,'S18_4600',28,'127',2), (10358,'S12_3148',49,'55',5), (10358,'S12_4473',42,'64',9), (10358,'S18_2238',20,'121',10), (10358,'S18_2319',20,'36',11), (10358,'S18_3232',32,'93',12), (10358,'S18_4027',25,'101',13), (10358,'S18_4668',30,'177',8), (10358,'S24_1444',44,'61',14), (10358,'S24_2300',41,'139',7), (10358,'S24_2840',36,'83',4), (10358,'S24_4258',41,'167',6), (10358,'S32_1268',41,'108',1), (10358,'S32_3522',36,'157',2), (10358,'S700_2824',27,'139',3), (10359,'S10_4757',48,'55',6), (10359,'S12_1108',42,'113',8), (10359,'S12_3891',49,'62',5), (10359,'S24_4048',22,'118',7), (10359,'S32_2509',36,'177',3), (10359,'S32_3207',22,'196',1), (10359,'S50_1392',46,'106',2), (10359,'S50_1514',25,'65',4), (10360,'S18_1662',50,'59',12), (10360,'S18_2581',41,'87',13), (10360,'S18_3029',46,'77',14), (10360,'S18_3140',29,'175',8), (10360,'S18_3259',29,'101',18), (10360,'S18_3856',40,'87',15), (10360,'S18_4522',40,'86',1), (10360,'S24_1785',22,'115',17), (10360,'S24_2011',31,'119',2), (10360,'S24_2841',49,'57',16), (10360,'S24_3151',36,'114',3), (10360,'S24_3816',22,'111',4), (10360,'S700_1138',32,'101',5), (10360,'S700_1938',26,'97',6), (10360,'S700_2610',30,'125',7), (10360,'S700_3505',35,'66',9), (10360,'S700_3962',31,'104',10), (10360,'S72_3212',31,'96',11), (10361,'S10_1678',20,'73',13), (10361,'S10_2016',26,'51',8), (10361,'S24_3420',34,'114',6), (10361,'S24_3949',26,'143',7), (10361,'S24_4278',25,'62',1), (10361,'S32_4289',49,'72',2), (10361,'S50_1341',33,'83',3), (10361,'S700_1691',20,'61',4), (10361,'S700_2047',24,'45',14), (10361,'S700_2466',26,'106',9), (10361,'S700_2834',44,'72',5), (10361,'S700_3167',44,'114',10), (10361,'S700_4002',35,'122',11), (10361,'S72_1253',23,'95',12), (10362,'S10_4698',22,'167',4), (10362,'S12_2823',22,'176',1), (10362,'S18_2625',23,'50',3), (10362,'S24_1578',50,'97',2), (10363,'S12_1099',33,'85',3), (10363,'S12_3380',34,'97',4), (10363,'S12_3990',34,'82',5), (10363,'S12_4675',46,'88',6), (10363,'S18_1889',22,'168',7), (10363,'S18_3278',46,'60',10), (10363,'S18_3482',24,'173',11), (10363,'S18_3782',32,'89',12), (10363,'S18_4721',28,'58',13), (10363,'S24_2000',21,'171',8), (10363,'S24_2360',43,'61',14), (10363,'S24_3371',21,'117',15), (10363,'S24_3856',31,'95',1), (10363,'S24_4620',43,'120',9), (10363,'S32_1374',50,'132',2), (10364,'S32_2206',48,'48',1), (10365,'S18_1129',30,'87',1), (10365,'S32_4485',22,'156',3), (10365,'S50_4713',44,'113',2), (10366,'S18_1984',34,'124',3), (10366,'S18_2870',49,'125',2), (10366,'S18_3232',34,'185',1), (10367,'S18_1589',49,'56',1), (10367,'S18_1749',37,'127',3), (10367,'S18_2248',45,'197',4), (10367,'S18_2325',27,'155',5), (10367,'S18_2795',32,'95',7), (10367,'S18_3685',46,'105',6), (10367,'S18_4409',43,'63',8), (10367,'S18_4933',44,'85',9), (10367,'S24_1046',21,'60',10), (10367,'S24_1628',38,'39',11), (10367,'S24_1937',23,'36',13), (10367,'S24_2022',28,'31',12), (10367,'S24_2972',36,'139',2), (10368,'S24_2766',40,'103',2), (10368,'S24_2887',31,'136',5), (10368,'S24_3191',46,'80',1), (10368,'S24_3432',20,'100',4), (10368,'S24_3969',46,'37',3), (10369,'S10_1949',41,'110',2), (10369,'S18_1342',44,'210',8), (10369,'S18_1367',32,'99',7), (10369,'S18_2949',42,'109',1), (10369,'S18_2957',28,'44',6), (10369,'S18_3136',21,'94',5), (10369,'S18_3320',45,'73',4), (10369,'S24_4258',40,'87',3), (10370,'S10_4962',35,'66',4), (10370,'S12_1666',49,'173',8), (10370,'S18_1097',27,'145',1), (10370,'S18_2319',22,'180',5), (10370,'S18_2432',22,'97',7), (10370,'S18_3232',27,'57',9), (10370,'S18_4600',29,'58',6), (10370,'S18_4668',20,'137',2), (10370,'S32_3522',25,'126',3), (10371,'S12_1108',32,'111',6), (10371,'S12_4473',49,'36',4), (10371,'S18_2238',25,'104',7), (10371,'S24_1444',25,'97',12), (10371,'S24_2300',20,'172',5), (10371,'S24_2840',45,'123',8), (10371,'S24_4048',28,'50',9), (10371,'S32_1268',26,'156',1), (10371,'S32_2509',20,'66',2), (10371,'S32_3207',30,'100',11), (10371,'S50_1392',48,'57',10), (10371,'S700_2824',34,'127',3), (10372,'S12_3148',40,'147',4), (10372,'S12_3891',34,'175',1), (10372,'S18_3140',28,'138',3), (10372,'S18_3259',25,'85',5), (10372,'S18_4027',48,'146',6), (10372,'S18_4522',41,'87',7), (10372,'S24_2011',37,'106',8), (10372,'S50_1514',24,'59',9), (10372,'S700_1938',44,'102',2), (10373,'S10_4757',39,'104',3), (10373,'S18_1662',28,'58',4), (10373,'S18_3029',22,'87',5), (10373,'S18_3856',50,'60',6), (10373,'S24_2841',38,'70',7), (10373,'S24_3151',33,'57',12), (10373,'S24_3420',46,'66',11), (10373,'S24_3816',23,'104',10), (10373,'S24_3949',39,'73',13), (10373,'S700_1138',44,'105',14), (10373,'S700_2047',32,'84',15), (10373,'S700_2610',41,'70',16), (10373,'S700_3505',34,'96',2), (10373,'S700_3962',37,'109',8), (10373,'S700_4002',45,'56',17), (10373,'S72_1253',25,'65',9), (10373,'S72_3212',29,'137',1), (10374,'S10_2016',39,'136',5), (10374,'S10_4698',22,'174',1), (10374,'S18_2581',42,'69',2), (10374,'S18_2625',22,'53',4), (10374,'S24_1578',38,'110',6), (10374,'S24_1785',46,'94',3), (10375,'S10_1678',21,'35',12), (10375,'S12_1099',45,'76',7), (10375,'S12_2823',49,'79',13), (10375,'S24_2000',23,'106',9), (10375,'S24_2360',20,'102',14), (10375,'S24_4278',43,'233',2), (10375,'S32_1374',37,'172',3), (10375,'S32_4289',44,'82',4), (10375,'S32_4485',41,'115',15), (10375,'S50_1341',49,'66',5), (10375,'S50_4713',49,'110',8), (10375,'S700_1691',37,'82',6), (10375,'S700_2466',33,'117',1), (10375,'S700_2834',25,'67',10), (10375,'S700_3167',44,'118',11), (10376,'S12_3380',35,'114',1), (10377,'S12_3990',24,'68',5), (10377,'S12_4675',50,'104',1), (10377,'S18_1129',35,'168',2), (10377,'S18_1889',31,'68',4), (10377,'S18_1984',36,'121',6), (10377,'S18_3232',39,'186',3), (10378,'S18_1589',34,'43',5), (10378,'S18_3278',22,'112',4), (10378,'S18_3482',43,'96',10), (10378,'S18_3782',28,'165',9), (10378,'S18_4721',49,'67',8), (10378,'S24_2972',41,'143',7), (10378,'S24_3371',46,'42',6), (10378,'S24_3856',33,'53',3), (10378,'S24_4620',41,'119',2), (10378,'S32_2206',40,'82',1), (10379,'S18_1749',39,'138',2), (10379,'S18_2248',27,'49',1), (10379,'S18_2870',29,'177',5), (10379,'S18_3685',32,'71',4), (10379,'S24_1628',32,'124',3), (10380,'S18_1342',27,'93',13), (10380,'S18_2325',40,'123',10), (10380,'S18_2795',21,'47',8), (10380,'S18_4409',32,'106',1), (10380,'S18_4933',24,'189',2), (10380,'S24_1046',34,'101',3), (10380,'S24_1937',32,'71',4), (10380,'S24_2022',27,'68',5), (10380,'S24_2766',36,'38',6), (10380,'S24_2887',44,'36',7), (10380,'S24_3191',44,'79',9), (10380,'S24_3432',34,'116',11), (10380,'S24_3969',43,'95',12), (10381,'S10_1949',36,'229',3), (10381,'S10_4962',37,'168',6), (10381,'S12_1666',20,'148',1), (10381,'S18_1097',48,'98',2), (10381,'S18_1367',25,'53',9), (10381,'S18_2432',35,'49',7), (10381,'S18_2949',41,'105',8), (10381,'S18_2957',40,'68',4), (10381,'S18_3136',35,'123',5), (10382,'S12_1108',34,'112',10), (10382,'S12_3148',37,'110',11), (10382,'S12_3891',34,'95',12), (10382,'S12_4473',32,'67',13), (10382,'S18_2238',25,'88',5), (10382,'S18_3320',50,'179',7), (10382,'S18_4600',39,'125',1), (10382,'S18_4668',39,'201',2), (10382,'S24_2300',20,'133',3), (10382,'S24_4258',33,'139',4), (10382,'S32_1268',26,'104',6), (10382,'S32_3522',48,'142',8), (10382,'S700_2824',34,'55',9), (10383,'S18_2319',27,'142',11), (10383,'S18_3140',24,'62',9), (10383,'S18_3232',47,'146',6), (10383,'S18_3259',26,'128',12), (10383,'S18_4027',38,'141',1), (10383,'S18_4522',28,'59',7), (10383,'S24_1444',22,'92',2), (10383,'S24_2840',40,'152',3), (10383,'S24_4048',21,'94',4), (10383,'S32_2509',32,'53',5), (10383,'S32_3207',44,'36',8), (10383,'S50_1392',29,'106',13), (10383,'S50_1514',38,'60',10), (10384,'S10_4757',34,'143',4), (10384,'S24_2011',28,'81',3), (10384,'S24_3151',43,'98',2), (10384,'S700_1938',49,'131',1), (10385,'S24_3816',37,'86',2), (10385,'S700_1138',25,'77',1), (10386,'S18_1662',25,'55',7), (10386,'S18_2581',21,'75',18), (10386,'S18_3029',37,'93',5), (10386,'S18_3856',22,'58',6), (10386,'S24_1785',33,'42',11), (10386,'S24_2841',39,'56',1), (10386,'S24_3420',35,'64',9), (10386,'S24_3949',41,'73',12), (10386,'S24_4278',50,'63',8), (10386,'S700_2047',29,'86',13), (10386,'S700_2466',37,'84',14), (10386,'S700_2610',37,'136',10), (10386,'S700_3167',32,'94',17), (10386,'S700_3505',45,'92',2), (10386,'S700_3962',30,'95',3), (10386,'S700_4002',44,'86',15), (10386,'S72_1253',50,'87',16), (10386,'S72_3212',43,'126',4), (10387,'S32_1374',44,'95',1), (10388,'S10_1678',42,'76',4), (10388,'S10_2016',50,'45',5), (10388,'S10_4698',21,'87',7), (10388,'S12_2823',44,'135',6), (10388,'S32_4289',35,'112',8), (10388,'S50_1341',27,'119',1), (10388,'S700_1691',46,'219',2), (10388,'S700_2834',50,'143',3), (10389,'S12_1099',26,'99',4), (10389,'S12_3380',25,'72',6), (10389,'S12_3990',36,'70',7), (10389,'S12_4675',47,'112',8), (10389,'S18_1889',49,'79',3), (10389,'S18_2625',39,'179',5), (10389,'S24_1578',45,'102',1), (10389,'S24_2000',49,'81',2), (10390,'S18_1129',36,'94',14), (10390,'S18_1984',34,'43',15), (10390,'S18_2325',31,'99',16), (10390,'S18_2795',26,'78',7), (10390,'S18_3278',40,'137',9), (10390,'S18_3482',50,'148',1), (10390,'S18_3782',36,'141',2), (10390,'S18_4721',49,'140',3), (10390,'S24_2360',35,'65',4), (10390,'S24_2972',37,'132',5), (10390,'S24_3371',46,'53',6), (10390,'S24_3856',45,'150',8), (10390,'S24_4620',30,'82',10), (10390,'S32_2206',41,'45',11), (10390,'S32_4485',45,'49',12), (10390,'S50_4713',22,'159',13), (10391,'S10_1949',24,'101',4), (10391,'S10_4962',37,'47',7), (10391,'S12_1666',39,'63',9), (10391,'S18_1097',29,'85',10), (10391,'S18_1342',35,'159',2), (10391,'S18_1367',42,'119',3), (10391,'S18_2432',44,'39',5), (10391,'S18_2949',32,'45',6), (10391,'S24_1937',33,'253',8), (10391,'S24_2022',24,'168',1), (10392,'S18_2957',37,'60',3), (10392,'S18_3136',29,'87',2), (10392,'S18_3320',36,'112',1), (10393,'S12_3148',35,'109',8), (10393,'S12_4473',32,'101',10), (10393,'S18_2238',20,'70',11), (10393,'S18_2319',38,'100',7), (10393,'S18_4600',30,'121',9), (10393,'S18_4668',44,'110',1), (10393,'S24_2300',33,'177',2), (10393,'S24_4258',33,'98',3), (10393,'S32_1268',38,'145',4), (10393,'S32_3522',31,'58',5), (10393,'S700_2824',21,'102',6), (10394,'S18_3232',22,'152',5), (10394,'S18_4027',37,'172',1), (10394,'S24_1444',31,'50',2), (10394,'S24_2840',46,'39',6), (10394,'S24_4048',37,'141',7), (10394,'S32_2509',36,'63',3), (10394,'S32_3207',30,'60',4), (10395,'S10_4757',32,'105',2), (10395,'S12_1108',33,'69',1), (10395,'S50_1392',46,'124',4), (10395,'S50_1514',45,'199',3), (10396,'S12_3891',33,'185',3), (10396,'S18_3140',33,'160',2), (10396,'S18_3259',24,'90',4), (10396,'S18_4522',45,'105',5), (10396,'S24_2011',49,'117',6), (10396,'S24_3151',27,'83',7), (10396,'S24_3816',37,'91',8), (10396,'S700_1138',39,'67',1), (10397,'S700_1938',32,'81',5), (10397,'S700_2610',22,'67',4), (10397,'S700_3505',48,'108',3), (10397,'S700_3962',36,'105',2), (10397,'S72_3212',34,'62',1), (10398,'S18_1662',33,'128',11), (10398,'S18_2581',34,'77',15), (10398,'S18_3029',28,'72',18), (10398,'S18_3856',45,'107',17), (10398,'S24_1785',43,'129',16), (10398,'S24_2841',28,'58',3), (10398,'S24_3420',34,'72',13), (10398,'S24_3949',41,'68',2), (10398,'S24_4278',45,'78',14), (10398,'S32_4289',22,'67',4), (10398,'S50_1341',49,'37',5), (10398,'S700_1691',47,'88',6), (10398,'S700_2047',36,'109',7), (10398,'S700_2466',22,'87',8), (10398,'S700_2834',23,'122',9), (10398,'S700_3167',29,'66',10), (10398,'S700_4002',36,'87',12), (10398,'S72_1253',34,'40',1), (10399,'S10_1678',40,'114',8), (10399,'S10_2016',51,'124',7), (10399,'S10_4698',22,'159',6), (10399,'S12_2823',29,'164',5), (10399,'S18_2625',30,'68',4), (10399,'S24_1578',57,'106',3), (10399,'S24_2000',58,'89',2), (10399,'S32_1374',32,'100',1), (10400,'S10_4757',64,'151',9), (10400,'S18_1662',34,'189',1), (10400,'S18_3029',30,'75',7), (10400,'S18_3856',58,'126',6), (10400,'S24_2841',24,'62',2), (10400,'S24_3420',38,'57',3), (10400,'S24_3816',42,'73',8), (10400,'S700_2047',46,'88',5), (10400,'S72_1253',20,'56',4), (10401,'S18_2581',42,'76',3), (10401,'S24_1785',38,'96',5), (10401,'S24_3949',64,'60',12), (10401,'S24_4278',52,'81',4), (10401,'S32_1374',49,'102',1), (10401,'S32_4289',62,'78',6), (10401,'S50_1341',56,'35',7), (10401,'S700_1691',11,'103',8), (10401,'S700_2466',85,'89',10), (10401,'S700_2834',21,'96',2), (10401,'S700_3167',77,'92',9), (10401,'S700_4002',28,'73',11), (10402,'S10_2016',45,'130',1), (10402,'S18_2625',55,'56',2), (10402,'S24_2000',59,'88',3), (10403,'S10_1678',24,'101',7), (10403,'S10_4698',66,'180',9), (10403,'S12_2823',66,'131',6), (10403,'S18_3782',36,'52',1), (10403,'S24_1578',46,'115',8), (10403,'S24_2360',27,'80',4), (10403,'S32_2206',30,'40',2), (10403,'S32_4485',45,'115',5), (10403,'S50_4713',31,'68',3), (10404,'S12_1099',64,'206',3), (10404,'S12_3380',43,'109',1), (10404,'S12_3990',77,'74',4), (10404,'S18_3278',90,'73',6), (10404,'S18_3482',28,'134',5), (10404,'S18_4721',48,'144',8), (10404,'S24_3371',49,'62',2), (10404,'S24_4620',48,'94',7), (10405,'S12_4675',97,'93',5), (10405,'S18_1889',61,'74',4), (10405,'S18_3232',55,'151',1), (10405,'S24_2972',47,'45',2), (10405,'S24_3856',76,'154',3), (10406,'S18_1129',61,'137',3), (10406,'S18_1984',48,'149',2), (10406,'S18_3685',65,'161',1), (10407,'S18_1589',59,'119',11), (10407,'S18_1749',76,'185',2), (10407,'S18_2248',42,'73',1), (10407,'S18_2870',41,'156',12), (10407,'S18_4409',6,'90',3), (10407,'S18_4933',66,'67',4), (10407,'S24_1046',26,'76',8), (10407,'S24_1628',64,'40',10), (10407,'S24_2766',76,'95',6), (10407,'S24_2887',59,'99',5), (10407,'S24_3191',13,'81',7), (10407,'S24_3432',43,'87',9), (10408,'S24_3969',15,'37',1), (10409,'S18_2325',6,'131',2), (10409,'S24_1937',61,'30',1), (10410,'S18_1342',65,'117',7), (10410,'S18_1367',44,'58',6), (10410,'S18_2795',56,'138',8), (10410,'S18_2949',47,'118',1), (10410,'S18_2957',53,'58',3), (10410,'S18_3136',34,'115',2), (10410,'S18_3320',44,'84',5), (10410,'S24_2022',31,'45',9), (10410,'S24_4258',50,'87',4), (10411,'S10_1949',23,'180',9), (10411,'S10_4962',27,'164',2), (10411,'S12_1666',40,'156',6), (10411,'S18_1097',27,'119',8), (10411,'S18_4600',46,'114',3), (10411,'S18_4668',35,'60',7), (10411,'S32_1268',26,'112',1), (10411,'S32_3522',27,'69',5), (10411,'S700_2824',34,'105',4), (10412,'S12_4473',54,'110',5), (10412,'S18_2238',41,'164',4), (10412,'S18_2319',56,'98',8), (10412,'S18_2432',47,'62',11), (10412,'S18_3232',60,'198',9), (10412,'S24_1444',21,'53',2), (10412,'S24_2300',70,'121',10), (10412,'S24_2840',30,'36',6), (10412,'S24_4048',31,'137',1), (10412,'S32_2509',19,'49',7), (10412,'S50_1392',26,'133',3), (10413,'S12_1108',36,'241',2), (10413,'S12_3148',47,'175',3), (10413,'S12_3891',22,'154',1), (10413,'S18_4027',49,'141',5), (10413,'S32_3207',24,'50',6), (10413,'S50_1514',51,'64',4), (10414,'S10_4757',19,'146',3), (10414,'S18_3029',44,'74',1), (10414,'S18_3140',41,'119',12), (10414,'S18_3259',48,'121',14), (10414,'S18_4522',16,'75',11), (10414,'S24_2011',23,'145',10), (10414,'S24_3151',60,'102',5), (10414,'S24_3816',51,'76',2), (10414,'S700_1138',37,'71',6), (10414,'S700_1938',34,'104',13), (10414,'S700_2610',31,'76',4), (10414,'S700_3505',28,'108',7), (10414,'S700_3962',27,'90',8), (10414,'S72_3212',47,'66',9), (10415,'S18_3856',51,'122',5), (10415,'S24_2841',21,'68',1), (10415,'S24_3420',18,'70',2), (10415,'S700_2047',32,'96',4), (10415,'S72_1253',42,'58',3), (10416,'S18_1662',24,'181',14), (10416,'S18_2581',15,'99',4), (10416,'S24_1785',47,'89',6), (10416,'S24_2000',32,'88',1), (10416,'S24_3949',18,'75',13), (10416,'S24_4278',48,'75',5), (10416,'S32_1374',45,'106',2), (10416,'S32_4289',26,'61',7), (10416,'S50_1341',37,'52',8), (10416,'S700_1691',23,'91',9), (10416,'S700_2466',22,'112',11), (10416,'S700_2834',41,'138',3), (10416,'S700_3167',39,'67',10), (10416,'S700_4002',43,'62',12), (10417,'S10_1678',66,'114',2), (10417,'S10_2016',45,'131',5), (10417,'S10_4698',56,'165',4), (10417,'S12_2823',21,'164',1), (10417,'S18_2625',36,'61',6), (10417,'S24_1578',35,'101',3), (10418,'S18_3278',16,'76',2), (10418,'S18_3482',27,'165',1), (10418,'S18_3782',33,'53',5), (10418,'S18_4721',28,'137',4), (10418,'S24_2360',52,'66',8), (10418,'S24_4620',10,'87',3), (10418,'S32_2206',43,'48',6), (10418,'S32_4485',50,'113',9), (10418,'S50_4713',40,'72',7), (10419,'S12_1099',12,'163',13), (10419,'S12_3380',10,'109',11), (10419,'S12_3990',34,'90',14), (10419,'S12_4675',32,'120',10), (10419,'S18_1129',38,'117',5), (10419,'S18_1589',37,'141',1), (10419,'S18_1889',39,'84',9), (10419,'S18_1984',34,'135',4), (10419,'S18_2870',55,'140',2), (10419,'S18_3232',35,'169',6), (10419,'S18_3685',43,'130',3), (10419,'S24_2972',15,'43',7), (10419,'S24_3371',55,'53',12), (10419,'S24_3856',70,'132',8), (10420,'S18_1749',37,'143',5), (10420,'S18_2248',36,'64',4), (10420,'S18_2325',45,'111',2), (10420,'S18_4409',66,'93',6), (10420,'S18_4933',36,'58',7), (10420,'S24_1046',60,'65',11), (10420,'S24_1628',37,'60',13), (10420,'S24_1937',45,'27',1), (10420,'S24_2766',39,'101',9), (10420,'S24_2887',55,'96',8), (10420,'S24_3191',35,'97',10), (10420,'S24_3432',26,'101',12), (10420,'S24_3969',15,'43',3), (10421,'S18_2795',35,'155',1), (10421,'S24_2022',40,'46',2), (10422,'S18_1342',51,'96',2), (10422,'S18_1367',25,'52',1), (10423,'S18_2949',10,'88',1), (10423,'S18_2957',31,'54',3), (10423,'S18_3136',21,'85',2), (10423,'S18_3320',21,'89',5), (10423,'S24_4258',28,'79',4), (10424,'S10_1949',50,'240',6), (10424,'S12_1666',49,'163',3), (10424,'S18_1097',54,'133',5), (10424,'S18_4668',26,'60',4), (10424,'S32_3522',44,'61',2), (10424,'S700_2824',46,'81',1), (10425,'S10_4962',38,'155',12), (10425,'S12_4473',33,'142',4), (10425,'S18_2238',28,'190',3), (10425,'S18_2319',38,'99',7), (10425,'S18_2432',19,'49',10), (10425,'S18_3232',28,'135',8), (10425,'S18_4600',38,'114',13), (10425,'S24_1444',55,'47',1), (10425,'S24_2300',49,'112',9), (10425,'S24_2840',31,'33',5), (10425,'S32_1268',41,'87',11), (10425,'S32_2509',11,'44',6), (10425,'S50_1392',18,'105',2), (11000,'S18_1749',30,'172',3), (11120,'S18_1749',60,'500',3), (11130,'S18_1749',1000,'300',3), (11140,'S18_1749',1000,'300',3), (11150,'S18_1749',1000,'300',3); /*!40000 ALTER TABLE `orderdetails` ENABLE KEYS */; -- -- Definition of table `orderfact` -- DROP TABLE IF EXISTS `orderfact`; CREATE TABLE `orderfact` ( `ORDERNUMBER` int(11) default NULL, `PRODUCTCODE` varchar(50) collate latin1_general_cs default NULL, `QUANTITYORDERED` int(11) default NULL, `PRICEEACH` decimal(31,7) default NULL, `ORDERLINENUMBER` int(11) default NULL, `TOTALPRICE` double default NULL, `ORDERDATE` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP, `REQUIREDDATE` timestamp NOT NULL default '0000-00-00 00:00:00', `SHIPPEDDATE` timestamp NOT NULL default '0000-00-00 00:00:00', `STATUS` varchar(15) collate latin1_general_cs default NULL, `COMMENTS` mediumtext collate latin1_general_cs, `CUSTOMERNUMBER` int(11) default NULL, `TIME_ID` varchar(10) collate latin1_general_cs default NULL, `QTR_ID` bigint(20) default NULL, `MONTH_ID` bigint(20) default NULL, `YEAR_ID` bigint(20) default NULL, KEY `SYS_FK_1` (`PRODUCTCODE`), CONSTRAINT `SYS_FK_1` FOREIGN KEY (`PRODUCTCODE`) REFERENCES `products` (`PRODUCTCODE`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_general_cs; -- -- Dumping data for table `orderfact` -- /*!40000 ALTER TABLE `orderfact` DISABLE KEYS */; INSERT INTO `orderfact` (`ORDERNUMBER`,`PRODUCTCODE`,`QUANTITYORDERED`,`PRICEEACH`,`ORDERLINENUMBER`,`TOTALPRICE`,`ORDERDATE`,`REQUIREDDATE`,`SHIPPEDDATE`,`STATUS`,`COMMENTS`,`CUSTOMERNUMBER`,`TIME_ID`,`QTR_ID`,`MONTH_ID`,`YEAR_ID`) VALUES (10100,'S18_1749',30,'100.0000000',3,5151,'2008-07-31 14:24:30','2003-01-13 00:00:00','2003-01-10 00:00:00','Disputed',NULL,363,'2003-01-06',1,1,2003), (10100,'S18_2248',50,'67.8000000',2,3390,'2008-07-31 14:24:30','2003-01-13 00:00:00','2003-01-10 00:00:00','Disputed',NULL,363,'2003-01-06',1,1,2003), (10100,'S18_4409',22,'86.5100000',4,1903.22,'2008-07-31 14:24:30','2003-01-13 00:00:00','2003-01-10 00:00:00','Disputed',NULL,363,'2003-01-06',1,1,2003), (10100,'S24_3969',49,'34.4700000',1,1689.03,'2008-07-31 14:24:30','2003-01-13 00:00:00','2003-01-10 00:00:00','Disputed',NULL,363,'2003-01-06',1,1,2003), (10101,'S18_2325',25,'100.0000000',4,3782,'2003-01-09 00:00:00','2003-01-18 00:00:00','2003-01-11 00:00:00','Shipped','Check on availability.',128,'2003-01-09',1,1,2003), (10101,'S18_2795',26,'100.0000000',1,3773.38,'2003-01-09 00:00:00','2003-01-18 00:00:00','2003-01-11 00:00:00','Shipped','Check on availability.',128,'2003-01-09',1,1,2003), (10101,'S24_1937',45,'31.2000000',3,1404,'2003-01-09 00:00:00','2003-01-18 00:00:00','2003-01-11 00:00:00','Shipped','Check on availability.',128,'2003-01-09',1,1,2003), (10101,'S24_2022',46,'53.7600000',2,2472.96,'2003-01-09 00:00:00','2003-01-18 00:00:00','2003-01-11 00:00:00','Shipped','Check on availability.',128,'2003-01-09',1,1,2003), (10102,'S18_1342',39,'100.0000000',2,4808.31,'2003-01-10 00:00:00','2003-01-18 00:00:00','2003-01-14 00:00:00','Shipped',NULL,181,'2003-01-10',1,1,2003), (10102,'S18_1367',41,'50.1400000',1,2055.74,'2003-01-10 00:00:00','2003-01-18 00:00:00','2003-01-14 00:00:00','Shipped',NULL,181,'2003-01-10',1,1,2003), (10103,'S10_1949',26,'100.0000000',11,5404.62,'2003-01-29 00:00:00','2003-02-07 00:00:00','2003-02-02 00:00:00','Shipped',NULL,121,'2003-01-29',1,1,2003), (10103,'S10_4962',42,'100.0000000',4,5398.26,'2003-01-29 00:00:00','2003-02-07 00:00:00','2003-02-02 00:00:00','Shipped',NULL,121,'2003-01-29',1,1,2003), (10103,'S12_1666',27,'100.0000000',8,3394.98,'2003-01-29 00:00:00','2003-02-07 00:00:00','2003-02-02 00:00:00','Shipped',NULL,121,'2003-01-29',1,1,2003), (10103,'S18_1097',35,'100.0000000',10,3920,'2003-01-29 00:00:00','2003-02-07 00:00:00','2003-02-02 00:00:00','Shipped',NULL,121,'2003-01-29',1,1,2003), (10103,'S18_2432',22,'54.0900000',2,1189.98,'2003-01-29 00:00:00','2003-02-07 00:00:00','2003-02-02 00:00:00','Shipped',NULL,121,'2003-01-29',1,1,2003), (10103,'S18_2949',27,'83.0700000',12,2242.89,'2003-01-29 00:00:00','2003-02-07 00:00:00','2003-02-02 00:00:00','Shipped',NULL,121,'2003-01-29',1,1,2003), (10103,'S18_2957',35,'57.4600000',14,2011.1,'2003-01-29 00:00:00','2003-02-07 00:00:00','2003-02-02 00:00:00','Shipped',NULL,121,'2003-01-29',1,1,2003), (10103,'S18_3136',25,'100.0000000',13,2539.5,'2003-01-29 00:00:00','2003-02-07 00:00:00','2003-02-02 00:00:00','Shipped',NULL,121,'2003-01-29',1,1,2003), (10103,'S18_3320',46,'100.0000000',16,4791.82,'2003-01-29 00:00:00','2003-02-07 00:00:00','2003-02-02 00:00:00','Shipped',NULL,121,'2003-01-29',1,1,2003), (10103,'S18_4600',36,'100.0000000',5,4228.2,'2003-01-29 00:00:00','2003-02-07 00:00:00','2003-02-02 00:00:00','Shipped',NULL,121,'2003-01-29',1,1,2003), (10103,'S18_4668',41,'47.2900000',9,1938.89,'2003-01-29 00:00:00','2003-02-07 00:00:00','2003-02-02 00:00:00','Shipped',NULL,121,'2003-01-29',1,1,2003), (10103,'S24_2300',36,'100.0000000',1,3680.28,'2003-01-29 00:00:00','2003-02-07 00:00:00','2003-02-02 00:00:00','Shipped',NULL,121,'2003-01-29',1,1,2003), (10103,'S24_4258',25,'100.0000000',15,2873,'2003-01-29 00:00:00','2003-02-07 00:00:00','2003-02-02 00:00:00','Shipped',NULL,121,'2003-01-29',1,1,2003), (10103,'S32_1268',31,'100.0000000',3,3224.31,'2003-01-29 00:00:00','2003-02-07 00:00:00','2003-02-02 00:00:00','Shipped',NULL,121,'2003-01-29',1,1,2003), (10103,'S32_3522',45,'75.6300000',7,3403.35,'2003-01-29 00:00:00','2003-02-07 00:00:00','2003-02-02 00:00:00','Shipped',NULL,121,'2003-01-29',1,1,2003), (10103,'S700_2824',42,'100.0000000',6,4460.82,'2003-01-29 00:00:00','2003-02-07 00:00:00','2003-02-02 00:00:00','Shipped',NULL,121,'2003-01-29',1,1,2003), (10104,'S12_3148',34,'100.0000000',1,5958.5,'2008-07-30 15:53:21','2003-02-09 00:00:00','2003-02-01 00:00:00','Disputed',NULL,141,'2003-01-31',1,1,2003), (10104,'S12_4473',41,'100.0000000',9,4615.78,'2008-07-30 15:53:21','2003-02-09 00:00:00','2003-02-01 00:00:00','Disputed',NULL,141,'2003-01-31',1,1,2003), (10104,'S18_2238',24,'100.0000000',8,3457.92,'2008-07-30 15:53:21','2003-02-09 00:00:00','2003-02-01 00:00:00','Disputed',NULL,141,'2003-01-31',1,1,2003), (10104,'S18_2319',29,'100.0000000',12,3772.61,'2008-07-30 15:53:21','2003-02-09 00:00:00','2003-02-01 00:00:00','Disputed',NULL,141,'2003-01-31',1,1,2003), (10104,'S18_3232',23,'100.0000000',13,4556.99,'2008-07-30 15:53:21','2003-02-09 00:00:00','2003-02-01 00:00:00','Disputed',NULL,141,'2003-01-31',1,1,2003), (10104,'S18_4027',38,'100.0000000',3,5348.5,'2008-07-30 15:53:21','2003-02-09 00:00:00','2003-02-01 00:00:00','Disputed',NULL,141,'2003-01-31',1,1,2003), (10104,'S24_1444',35,'55.4900000',6,1942.15,'2008-07-30 15:53:21','2003-02-09 00:00:00','2003-02-01 00:00:00','Disputed',NULL,141,'2003-01-31',1,1,2003), (10104,'S24_2840',44,'39.6000000',10,1742.4,'2008-07-30 15:53:21','2003-02-09 00:00:00','2003-02-01 00:00:00','Disputed',NULL,141,'2003-01-31',1,1,2003), (10104,'S24_4048',26,'100.0000000',5,2921.62,'2008-07-30 15:53:21','2003-02-09 00:00:00','2003-02-01 00:00:00','Disputed',NULL,141,'2003-01-31',1,1,2003), (10104,'S32_2509',35,'47.6200000',11,1666.7,'2008-07-30 15:53:21','2003-02-09 00:00:00','2003-02-01 00:00:00','Disputed',NULL,141,'2003-01-31',1,1,2003), (10104,'S32_3207',49,'65.8700000',4,3227.63,'2008-07-30 15:53:21','2003-02-09 00:00:00','2003-02-01 00:00:00','Disputed',NULL,141,'2003-01-31',1,1,2003), (10104,'S50_1392',33,'100.0000000',7,3705.24,'2008-07-30 15:53:21','2003-02-09 00:00:00','2003-02-01 00:00:00','Disputed',NULL,141,'2003-01-31',1,1,2003), (10104,'S50_1514',32,'53.3100000',2,1705.92,'2008-07-30 15:53:21','2003-02-09 00:00:00','2003-02-01 00:00:00','Disputed',NULL,141,'2003-01-31',1,1,2003), (10105,'S10_4757',50,'100.0000000',2,7208,'2003-02-11 00:00:00','2003-02-21 00:00:00','2003-02-12 00:00:00','Shipped',NULL,145,'2003-02-11',1,2,2003), (10105,'S12_1108',41,'100.0000000',15,8690.36,'2003-02-11 00:00:00','2003-02-21 00:00:00','2003-02-12 00:00:00','Shipped',NULL,145,'2003-02-11',1,2,2003), (10105,'S12_3891',29,'100.0000000',14,4566.05,'2003-02-11 00:00:00','2003-02-21 00:00:00','2003-02-12 00:00:00','Shipped',NULL,145,'2003-02-11',1,2,2003), (10105,'S18_3140',22,'100.0000000',11,3065.04,'2003-02-11 00:00:00','2003-02-21 00:00:00','2003-02-12 00:00:00','Shipped',NULL,145,'2003-02-11',1,2,2003), (10105,'S18_3259',38,'100.0000000',13,4330.1,'2003-02-11 00:00:00','2003-02-21 00:00:00','2003-02-12 00:00:00','Shipped',NULL,145,'2003-02-11',1,2,2003), (10105,'S18_4522',41,'82.5000000',10,3382.5,'2003-02-11 00:00:00','2003-02-21 00:00:00','2003-02-12 00:00:00','Shipped',NULL,145,'2003-02-11',1,2,2003), (10105,'S24_2011',43,'100.0000000',9,6341.21,'2003-02-11 00:00:00','2003-02-21 00:00:00','2003-02-12 00:00:00','Shipped',NULL,145,'2003-02-11',1,2,2003), (10105,'S24_3151',44,'72.5800000',4,3193.52,'2003-02-11 00:00:00','2003-02-21 00:00:00','2003-02-12 00:00:00','Shipped',NULL,145,'2003-02-11',1,2,2003), (10105,'S24_3816',50,'79.6700000',1,3983.5,'2003-02-11 00:00:00','2003-02-21 00:00:00','2003-02-12 00:00:00','Shipped',NULL,145,'2003-02-11',1,2,2003), (10105,'S700_1138',41,'70.6700000',5,2897.47,'2003-02-11 00:00:00','2003-02-21 00:00:00','2003-02-12 00:00:00','Shipped',NULL,145,'2003-02-11',1,2,2003), (10105,'S700_1938',29,'70.1500000',12,2034.35,'2003-02-11 00:00:00','2003-02-21 00:00:00','2003-02-12 00:00:00','Shipped',NULL,145,'2003-02-11',1,2,2003), (10105,'S700_2610',31,'65.7700000',3,2038.87,'2003-02-11 00:00:00','2003-02-21 00:00:00','2003-02-12 00:00:00','Shipped',NULL,145,'2003-02-11',1,2,2003), (10105,'S700_3505',39,'81.1400000',6,3164.46,'2003-02-11 00:00:00','2003-02-21 00:00:00','2003-02-12 00:00:00','Shipped',NULL,145,'2003-02-11',1,2,2003), (10105,'S700_3962',22,'100.0000000',7,2556.18,'2003-02-11 00:00:00','2003-02-21 00:00:00','2003-02-12 00:00:00','Shipped',NULL,145,'2003-02-11',1,2,2003), (10105,'S72_3212',25,'56.7800000',8,1419.5,'2003-02-11 00:00:00','2003-02-21 00:00:00','2003-02-12 00:00:00','Shipped',NULL,145,'2003-02-11',1,2,2003), (10106,'S18_1662',36,'100.0000000',12,5279.4,'2003-02-17 00:00:00','2003-02-24 00:00:00','2003-02-21 00:00:00','Shipped',NULL,278,'2003-02-17',1,2,2003), (10106,'S18_2581',34,'90.3900000',2,3073.26,'2003-02-17 00:00:00','2003-02-24 00:00:00','2003-02-21 00:00:00','Shipped',NULL,278,'2003-02-17',1,2,2003), (10106,'S18_3029',41,'83.4400000',18,3421.04,'2003-02-17 00:00:00','2003-02-24 00:00:00','2003-02-21 00:00:00','Shipped',NULL,278,'2003-02-17',1,2,2003), (10106,'S18_3856',41,'100.0000000',17,4774.86,'2003-02-17 00:00:00','2003-02-24 00:00:00','2003-02-21 00:00:00','Shipped',NULL,278,'2003-02-17',1,2,2003), (10106,'S24_1785',28,'88.6300000',4,2481.64,'2003-02-17 00:00:00','2003-02-24 00:00:00','2003-02-21 00:00:00','Shipped',NULL,278,'2003-02-17',1,2,2003), (10106,'S24_2841',49,'74.6800000',13,3659.32,'2003-02-17 00:00:00','2003-02-24 00:00:00','2003-02-21 00:00:00','Shipped',NULL,278,'2003-02-17',1,2,2003), (10106,'S24_3420',31,'52.6000000',14,1630.6,'2003-02-17 00:00:00','2003-02-24 00:00:00','2003-02-21 00:00:00','Shipped',NULL,278,'2003-02-17',1,2,2003), (10106,'S24_3949',50,'64.8300000',11,3241.5,'2003-02-17 00:00:00','2003-02-24 00:00:00','2003-02-21 00:00:00','Shipped',NULL,278,'2003-02-17',1,2,2003), (10106,'S24_4278',26,'63.7600000',3,1657.76,'2003-02-17 00:00:00','2003-02-24 00:00:00','2003-02-21 00:00:00','Shipped',NULL,278,'2003-02-17',1,2,2003), (10106,'S32_4289',33,'72.9200000',5,2406.36,'2003-02-17 00:00:00','2003-02-24 00:00:00','2003-02-21 00:00:00','Shipped',NULL,278,'2003-02-17',1,2,2003), (10106,'S50_1341',39,'40.1500000',6,1565.85,'2003-02-17 00:00:00','2003-02-24 00:00:00','2003-02-21 00:00:00','Shipped',NULL,278,'2003-02-17',1,2,2003), (10106,'S700_1691',31,'100.0000000',7,3312.97,'2003-02-17 00:00:00','2003-02-24 00:00:00','2003-02-21 00:00:00','Shipped',NULL,278,'2003-02-17',1,2,2003), (10106,'S700_2047',30,'100.0000000',16,3177.3,'2003-02-17 00:00:00','2003-02-24 00:00:00','2003-02-21 00:00:00','Shipped',NULL,278,'2003-02-17',1,2,2003), (10106,'S700_2466',34,'100.0000000',9,3763.46,'2003-02-17 00:00:00','2003-02-24 00:00:00','2003-02-21 00:00:00','Shipped',NULL,278,'2003-02-17',1,2,2003), (10106,'S700_2834',32,'100.0000000',1,3986.56,'2003-02-17 00:00:00','2003-02-24 00:00:00','2003-02-21 00:00:00','Shipped',NULL,278,'2003-02-17',1,2,2003), (10106,'S700_3167',44,'74.4000000',8,3273.6,'2003-02-17 00:00:00','2003-02-24 00:00:00','2003-02-21 00:00:00','Shipped',NULL,278,'2003-02-17',1,2,2003), (10106,'S700_4002',48,'61.4400000',10,2949.12,'2003-02-17 00:00:00','2003-02-24 00:00:00','2003-02-21 00:00:00','Shipped',NULL,278,'2003-02-17',1,2,2003), (10106,'S72_1253',48,'52.6400000',15,2526.72,'2003-02-17 00:00:00','2003-02-24 00:00:00','2003-02-21 00:00:00','Shipped',NULL,278,'2003-02-17',1,2,2003), (10107,'S10_1678',30,'95.7000000',2,2871,'2003-02-24 00:00:00','2003-03-03 00:00:00','2003-02-26 00:00:00','Shipped','Difficult to negotiate with customer. We need more marketing materials',131,'2003-02-24',1,2,2003), (10107,'S10_2016',39,'99.9100000',5,3896.49,'2003-02-24 00:00:00','2003-03-03 00:00:00','2003-02-26 00:00:00','Shipped','Difficult to negotiate with customer. We need more marketing materials',131,'2003-02-24',1,2,2003), (10107,'S10_4698',27,'100.0000000',4,6065.55,'2003-02-24 00:00:00','2003-03-03 00:00:00','2003-02-26 00:00:00','Shipped','Difficult to negotiate with customer. We need more marketing materials',131,'2003-02-24',1,2,2003), (10107,'S12_2823',21,'100.0000000',1,3036.6,'2003-02-24 00:00:00','2003-03-03 00:00:00','2003-02-26 00:00:00','Shipped','Difficult to negotiate with customer. We need more marketing materials',131,'2003-02-24',1,2,2003), (10107,'S18_2625',29,'70.8700000',6,2055.23,'2003-02-24 00:00:00','2003-03-03 00:00:00','2003-02-26 00:00:00','Shipped','Difficult to negotiate with customer. We need more marketing materials',131,'2003-02-24',1,2,2003), (10107,'S24_1578',25,'100.0000000',3,2845.75,'2003-02-24 00:00:00','2003-03-03 00:00:00','2003-02-26 00:00:00','Shipped','Difficult to negotiate with customer. We need more marketing materials',131,'2003-02-24',1,2,2003), (10107,'S24_2000',38,'83.0300000',7,3155.14,'2003-02-24 00:00:00','2003-03-03 00:00:00','2003-02-26 00:00:00','Shipped','Difficult to negotiate with customer. We need more marketing materials',131,'2003-02-24',1,2,2003), (10107,'S32_1374',20,'92.9000000',8,1858,'2003-02-24 00:00:00','2003-03-03 00:00:00','2003-02-26 00:00:00','Shipped','Difficult to negotiate with customer. We need more marketing materials',131,'2003-02-24',1,2,2003), (10108,'S12_1099',33,'100.0000000',6,5265.15,'2003-03-03 00:00:00','2003-03-12 00:00:00','2003-03-08 00:00:00','Shipped',NULL,385,'2003-03-03',1,3,2003), (10108,'S12_3380',45,'100.0000000',4,6130.35,'2003-03-03 00:00:00','2003-03-12 00:00:00','2003-03-08 00:00:00','Shipped',NULL,385,'2003-03-03',1,3,2003), (10108,'S12_3990',39,'89.3800000',7,3485.82,'2003-03-03 00:00:00','2003-03-12 00:00:00','2003-03-08 00:00:00','Shipped',NULL,385,'2003-03-03',1,3,2003), (10108,'S12_4675',36,'100.0000000',3,3731.04,'2003-03-03 00:00:00','2003-03-12 00:00:00','2003-03-08 00:00:00','Shipped',NULL,385,'2003-03-03',1,3,2003), (10108,'S18_1889',38,'82.3900000',2,3130.82,'2003-03-03 00:00:00','2003-03-12 00:00:00','2003-03-08 00:00:00','Shipped',NULL,385,'2003-03-03',1,3,2003), (10108,'S18_3278',26,'68.3500000',9,1777.1,'2003-03-03 00:00:00','2003-03-12 00:00:00','2003-03-08 00:00:00','Shipped',NULL,385,'2003-03-03',1,3,2003), (10108,'S18_3482',29,'100.0000000',8,4049.56,'2003-03-03 00:00:00','2003-03-12 00:00:00','2003-03-08 00:00:00','Shipped',NULL,385,'2003-03-03',1,3,2003), (10108,'S18_3782',43,'67.7700000',12,2914.11,'2003-03-03 00:00:00','2003-03-12 00:00:00','2003-03-08 00:00:00','Shipped',NULL,385,'2003-03-03',1,3,2003), (10108,'S18_4721',44,'100.0000000',11,5565.12,'2003-03-03 00:00:00','2003-03-12 00:00:00','2003-03-08 00:00:00','Shipped',NULL,385,'2003-03-03',1,3,2003), (10108,'S24_2360',35,'58.8700000',15,2060.45,'2003-03-03 00:00:00','2003-03-12 00:00:00','2003-03-08 00:00:00','Shipped',NULL,385,'2003-03-03',1,3,2003), (10108,'S24_3371',30,'63.0700000',5,1892.1,'2003-03-03 00:00:00','2003-03-12 00:00:00','2003-03-08 00:00:00','Shipped',NULL,385,'2003-03-03',1,3,2003), (10108,'S24_3856',40,'100.0000000',1,5448.8,'2003-03-03 00:00:00','2003-03-12 00:00:00','2003-03-08 00:00:00','Shipped',NULL,385,'2003-03-03',1,3,2003), (10108,'S24_4620',31,'68.7100000',10,2130.01,'2003-03-03 00:00:00','2003-03-12 00:00:00','2003-03-08 00:00:00','Shipped',NULL,385,'2003-03-03',1,3,2003), (10108,'S32_2206',27,'43.4500000',13,1173.15,'2003-03-03 00:00:00','2003-03-12 00:00:00','2003-03-08 00:00:00','Shipped',NULL,385,'2003-03-03',1,3,2003), (10108,'S32_4485',31,'100.0000000',16,3669.78,'2003-03-03 00:00:00','2003-03-12 00:00:00','2003-03-08 00:00:00','Shipped',NULL,385,'2003-03-03',1,3,2003), (10108,'S50_4713',34,'82.9900000',14,2821.66,'2003-03-03 00:00:00','2003-03-12 00:00:00','2003-03-08 00:00:00','Shipped',NULL,385,'2003-03-03',1,3,2003), (10109,'S18_1129',26,'100.0000000',4,4379.18,'2008-07-31 14:30:29','2003-03-19 00:00:00','2003-03-11 00:00:00','Disputed','Customer requested that FedEx Ground is used for this shipping',486,'2003-03-10',1,3,2003), (10109,'S18_1984',38,'100.0000000',3,4432.7,'2008-07-31 14:30:29','2003-03-19 00:00:00','2003-03-11 00:00:00','Disputed','Customer requested that FedEx Ground is used for this shipping',486,'2003-03-10',1,3,2003), (10109,'S18_2870',26,'100.0000000',1,3157.44,'2008-07-31 14:30:29','2003-03-19 00:00:00','2003-03-11 00:00:00','Disputed','Customer requested that FedEx Ground is used for this shipping',486,'2003-03-10',1,3,2003), (10109,'S18_3232',46,'100.0000000',5,8257,'2008-07-31 14:30:29','2003-03-19 00:00:00','2003-03-11 00:00:00','Disputed','Customer requested that FedEx Ground is used for this shipping',486,'2003-03-10',1,3,2003), (10109,'S18_3685',47,'100.0000000',2,6241.6,'2008-07-31 14:30:29','2003-03-19 00:00:00','2003-03-11 00:00:00','Disputed','Customer requested that FedEx Ground is used for this shipping',486,'2003-03-10',1,3,2003), (10109,'S24_2972',29,'32.1000000',6,930.9,'2008-07-31 14:30:29','2003-03-19 00:00:00','2003-03-11 00:00:00','Disputed','Customer requested that FedEx Ground is used for this shipping',486,'2003-03-10',1,3,2003), (10110,'S18_1589',37,'100.0000000',16,5433.08,'2003-03-18 00:00:00','2003-03-24 00:00:00','2003-03-20 00:00:00','Shipped',NULL,187,'2003-03-18',1,3,2003), (10110,'S18_1749',42,'100.0000000',7,6069,'2003-03-18 00:00:00','2003-03-24 00:00:00','2003-03-20 00:00:00','Shipped',NULL,187,'2003-03-18',1,3,2003), (10110,'S18_2248',32,'50.2500000',6,1608,'2003-03-18 00:00:00','2003-03-24 00:00:00','2003-03-20 00:00:00','Shipped',NULL,187,'2003-03-18',1,3,2003), (10110,'S18_2325',33,'100.0000000',4,3859.68,'2003-03-18 00:00:00','2003-03-24 00:00:00','2003-03-20 00:00:00','Shipped',NULL,187,'2003-03-18',1,3,2003), (10110,'S18_2795',31,'100.0000000',1,5074.39,'2003-03-18 00:00:00','2003-03-24 00:00:00','2003-03-20 00:00:00','Shipped',NULL,187,'2003-03-18',1,3,2003), (10110,'S18_4409',28,'89.2700000',8,2499.56,'2003-03-18 00:00:00','2003-03-24 00:00:00','2003-03-20 00:00:00','Shipped',NULL,187,'2003-03-18',1,3,2003), (10110,'S18_4933',42,'61.2900000',9,2574.18,'2003-03-18 00:00:00','2003-03-24 00:00:00','2003-03-20 00:00:00','Shipped',NULL,187,'2003-03-18',1,3,2003), (10110,'S24_1046',36,'85.2500000',13,3069,'2003-03-18 00:00:00','2003-03-24 00:00:00','2003-03-20 00:00:00','Shipped',NULL,187,'2003-03-18',1,3,2003), (10110,'S24_1628',29,'59.3700000',15,1721.73,'2003-03-18 00:00:00','2003-03-24 00:00:00','2003-03-20 00:00:00','Shipped',NULL,187,'2003-03-18',1,3,2003), (10110,'S24_1937',20,'35.5100000',3,710.2,'2003-03-18 00:00:00','2003-03-24 00:00:00','2003-03-20 00:00:00','Shipped',NULL,187,'2003-03-18',1,3,2003), (10110,'S24_2022',39,'44.3500000',2,1729.65,'2003-03-18 00:00:00','2003-03-24 00:00:00','2003-03-20 00:00:00','Shipped',NULL,187,'2003-03-18',1,3,2003), (10110,'S24_2766',43,'78.1500000',11,3360.45,'2003-03-18 00:00:00','2003-03-24 00:00:00','2003-03-20 00:00:00','Shipped',NULL,187,'2003-03-18',1,3,2003), (10110,'S24_2887',46,'100.0000000',10,5942.28,'2003-03-18 00:00:00','2003-03-24 00:00:00','2003-03-20 00:00:00','Shipped',NULL,187,'2003-03-18',1,3,2003), (10110,'S24_3191',27,'73.6200000',12,1987.74,'2003-03-18 00:00:00','2003-03-24 00:00:00','2003-03-20 00:00:00','Shipped',NULL,187,'2003-03-18',1,3,2003), (10110,'S24_3432',37,'100.0000000',14,3724.42,'2003-03-18 00:00:00','2003-03-24 00:00:00','2003-03-20 00:00:00','Shipped',NULL,187,'2003-03-18',1,3,2003), (10110,'S24_3969',48,'34.4700000',5,1654.56,'2003-03-18 00:00:00','2003-03-24 00:00:00','2003-03-20 00:00:00','Shipped',NULL,187,'2003-03-18',1,3,2003), (10111,'S18_1342',33,'99.6600000',6,3288.78,'2003-03-25 00:00:00','2003-03-31 00:00:00','2003-03-30 00:00:00','Shipped',NULL,129,'2003-03-25',1,3,2003), (10111,'S18_1367',48,'49.0600000',5,2354.88,'2003-03-25 00:00:00','2003-03-31 00:00:00','2003-03-30 00:00:00','Shipped',NULL,129,'2003-03-25',1,3,2003), (10111,'S18_2957',28,'64.3300000',2,1801.24,'2003-03-25 00:00:00','2003-03-31 00:00:00','2003-03-30 00:00:00','Shipped',NULL,129,'2003-03-25',1,3,2003), (10111,'S18_3136',43,'100.0000000',1,4818.15,'2003-03-25 00:00:00','2003-03-31 00:00:00','2003-03-30 00:00:00','Shipped',NULL,129,'2003-03-25',1,3,2003), (10111,'S18_3320',39,'100.0000000',4,4178.85,'2003-03-25 00:00:00','2003-03-31 00:00:00','2003-03-30 00:00:00','Shipped',NULL,129,'2003-03-25',1,3,2003), (10111,'S24_4258',26,'86.6800000',3,2253.68,'2003-03-25 00:00:00','2003-03-31 00:00:00','2003-03-30 00:00:00','Shipped',NULL,129,'2003-03-25',1,3,2003), (10112,'S10_1949',29,'100.0000000',1,7209.11,'2003-03-24 00:00:00','2003-04-03 00:00:00','2003-03-29 00:00:00','Shipped','Customer requested that ad materials (such as posters, pamphlets) be included in the shippment',144,'2003-03-24',1,3,2003), (10112,'S18_2949',23,'100.0000000',2,2539.89,'2003-03-24 00:00:00','2003-04-03 00:00:00','2003-03-29 00:00:00','Shipped','Customer requested that ad materials (such as posters, pamphlets) be included in the shippment',144,'2003-03-24',1,3,2003), (10113,'S12_1666',21,'100.0000000',2,3415.44,'2003-03-26 00:00:00','2003-04-02 00:00:00','2003-03-27 00:00:00','Shipped',NULL,124,'2003-03-26',1,3,2003), (10113,'S18_1097',49,'100.0000000',4,4916.66,'2003-03-26 00:00:00','2003-04-02 00:00:00','2003-03-27 00:00:00','Shipped',NULL,124,'2003-03-26',1,3,2003), (10113,'S18_4668',50,'49.8100000',3,2490.5,'2003-03-26 00:00:00','2003-04-02 00:00:00','2003-03-27 00:00:00','Shipped',NULL,124,'2003-03-26',1,3,2003), (10113,'S32_3522',23,'68.5200000',1,1575.96,'2003-03-26 00:00:00','2003-04-02 00:00:00','2003-03-27 00:00:00','Shipped',NULL,124,'2003-03-26',1,3,2003), (10114,'S10_4962',31,'100.0000000',8,4305.28,'2008-07-31 14:41:41','2003-04-07 00:00:00','2003-04-02 00:00:00','Disputed',NULL,172,'2003-04-01',2,4,2003), (10114,'S18_2319',39,'100.0000000',3,4164.42,'2008-07-31 14:41:41','2003-04-07 00:00:00','2003-04-02 00:00:00','Disputed',NULL,172,'2003-04-01',2,4,2003), (10114,'S18_2432',45,'68.6700000',6,3090.15,'2008-07-31 14:41:41','2003-04-07 00:00:00','2003-04-02 00:00:00','Disputed',NULL,172,'2003-04-01',2,4,2003), (10114,'S18_3232',48,'100.0000000',4,8209.44,'2008-07-31 14:41:41','2003-04-07 00:00:00','2003-04-02 00:00:00','Disputed',NULL,172,'2003-04-01',2,4,2003), (10114,'S18_4600',41,'100.0000000',9,4815.45,'2008-07-31 14:41:41','2003-04-07 00:00:00','2003-04-02 00:00:00','Disputed',NULL,172,'2003-04-01',2,4,2003), (10114,'S24_2300',21,'100.0000000',5,2925.09,'2008-07-31 14:41:41','2003-04-07 00:00:00','2003-04-02 00:00:00','Disputed',NULL,172,'2003-04-01',2,4,2003), (10114,'S24_2840',24,'30.0600000',1,721.44,'2008-07-31 14:41:41','2003-04-07 00:00:00','2003-04-02 00:00:00','Disputed',NULL,172,'2003-04-01',2,4,2003), (10114,'S32_1268',32,'100.0000000',7,3667.52,'2008-07-31 14:41:41','2003-04-07 00:00:00','2003-04-02 00:00:00','Disputed',NULL,172,'2003-04-01',2,4,2003), (10114,'S32_2509',28,'55.7300000',2,1560.44,'2008-07-31 14:41:41','2003-04-07 00:00:00','2003-04-02 00:00:00','Disputed',NULL,172,'2003-04-01',2,4,2003), (10114,'S700_2824',42,'100.0000000',10,4758.18,'2008-07-31 14:41:41','2003-04-07 00:00:00','2003-04-02 00:00:00','Disputed',NULL,172,'2003-04-01',2,4,2003), (10115,'S12_4473',46,'100.0000000',5,5723.78,'2003-04-04 00:00:00','2003-04-12 00:00:00','2003-04-07 00:00:00','Shipped',NULL,424,'2003-04-04',2,4,2003), (10115,'S18_2238',46,'100.0000000',4,7381.16,'2003-04-04 00:00:00','2003-04-12 00:00:00','2003-04-07 00:00:00','Shipped',NULL,424,'2003-04-04',2,4,2003), (10115,'S24_1444',47,'69.3600000',2,3259.92,'2003-04-04 00:00:00','2003-04-12 00:00:00','2003-04-07 00:00:00','Shipped',NULL,424,'2003-04-04',2,4,2003), (10115,'S24_4048',44,'100.0000000',1,5568.64,'2003-04-04 00:00:00','2003-04-12 00:00:00','2003-04-07 00:00:00','Shipped',NULL,424,'2003-04-04',2,4,2003), (10115,'S50_1392',27,'100.0000000',3,2843.91,'2003-04-04 00:00:00','2003-04-12 00:00:00','2003-04-07 00:00:00','Shipped',NULL,424,'2003-04-04',2,4,2003), (10116,'S32_3207',27,'63.3800000',1,1711.26,'2003-04-11 00:00:00','2003-04-19 00:00:00','2003-04-13 00:00:00','Shipped',NULL,381,'2003-04-11',2,4,2003), (10117,'S12_1108',33,'100.0000000',9,6034.38,'2003-04-16 00:00:00','2003-04-24 00:00:00','2003-04-17 00:00:00','Shipped',NULL,148,'2003-04-16',2,4,2003), (10117,'S12_3148',43,'100.0000000',10,5911.64,'2003-04-16 00:00:00','2003-04-24 00:00:00','2003-04-17 00:00:00','Shipped',NULL,148,'2003-04-16',2,4,2003), (10117,'S12_3891',39,'100.0000000',8,5938.14,'2003-04-16 00:00:00','2003-04-24 00:00:00','2003-04-17 00:00:00','Shipped',NULL,148,'2003-04-16',2,4,2003), (10117,'S18_3140',26,'100.0000000',5,3551.34,'2003-04-16 00:00:00','2003-04-24 00:00:00','2003-04-17 00:00:00','Shipped',NULL,148,'2003-04-16',2,4,2003), (10117,'S18_3259',21,'95.8000000',7,2011.8,'2003-04-16 00:00:00','2003-04-24 00:00:00','2003-04-17 00:00:00','Shipped',NULL,148,'2003-04-16',2,4,2003), (10117,'S18_4027',22,'100.0000000',12,2780.58,'2003-04-16 00:00:00','2003-04-24 00:00:00','2003-04-17 00:00:00','Shipped',NULL,148,'2003-04-16',2,4,2003), (10117,'S18_4522',23,'97.4200000',4,2240.66,'2003-04-16 00:00:00','2003-04-24 00:00:00','2003-04-17 00:00:00','Shipped',NULL,148,'2003-04-16',2,4,2003), (10117,'S24_2011',41,'100.0000000',3,5189.78,'2003-04-16 00:00:00','2003-04-24 00:00:00','2003-04-17 00:00:00','Shipped',NULL,148,'2003-04-16',2,4,2003), (10117,'S50_1514',21,'49.2100000',11,1033.41,'2003-04-16 00:00:00','2003-04-24 00:00:00','2003-04-17 00:00:00','Shipped',NULL,148,'2003-04-16',2,4,2003), (10117,'S700_1938',38,'79.6800000',6,3027.84,'2003-04-16 00:00:00','2003-04-24 00:00:00','2003-04-17 00:00:00','Shipped',NULL,148,'2003-04-16',2,4,2003), (10117,'S700_3962',45,'83.4200000',1,3753.9,'2003-04-16 00:00:00','2003-04-24 00:00:00','2003-04-17 00:00:00','Shipped',NULL,148,'2003-04-16',2,4,2003), (10117,'S72_3212',50,'43.6800000',2,2184,'2003-04-16 00:00:00','2003-04-24 00:00:00','2003-04-17 00:00:00','Shipped',NULL,148,'2003-04-16',2,4,2003), (10118,'S700_3505',36,'100.0000000',1,4219.2,'2003-04-21 00:00:00','2003-04-29 00:00:00','2003-04-26 00:00:00','Shipped','Customer has worked with some of our vendors in the past and is aware of their MSRP',216,'2003-04-21',2,4,2003), (10119,'S10_4757',46,'100.0000000',11,5004.8,'2003-04-28 00:00:00','2003-05-05 00:00:00','2003-05-02 00:00:00','Shipped',NULL,382,'2003-04-28',2,4,2003), (10119,'S18_1662',43,'100.0000000',3,6916.12,'2003-04-28 00:00:00','2003-05-05 00:00:00','2003-05-02 00:00:00','Shipped',NULL,382,'2003-04-28',2,4,2003), (10119,'S18_3029',21,'89.4600000',9,1878.66,'2003-04-28 00:00:00','2003-05-05 00:00:00','2003-05-02 00:00:00','Shipped',NULL,382,'2003-04-28',2,4,2003), (10119,'S18_3856',27,'99.5200000',8,2687.04,'2003-04-28 00:00:00','2003-05-05 00:00:00','2003-05-02 00:00:00','Shipped',NULL,382,'2003-04-28',2,4,2003), (10119,'S24_2841',41,'59.6000000',4,2443.6,'2003-04-28 00:00:00','2003-05-05 00:00:00','2003-05-02 00:00:00','Shipped',NULL,382,'2003-04-28',2,4,2003), (10119,'S24_3151',35,'87.6200000',13,3066.7,'2003-04-28 00:00:00','2003-05-05 00:00:00','2003-05-02 00:00:00','Shipped',NULL,382,'2003-04-28',2,4,2003), (10119,'S24_3420',20,'72.9800000',5,1459.6,'2003-04-28 00:00:00','2003-05-05 00:00:00','2003-05-02 00:00:00','Shipped',NULL,382,'2003-04-28',2,4,2003), (10119,'S24_3816',35,'90.5700000',10,3169.95,'2003-04-28 00:00:00','2003-05-05 00:00:00','2003-05-02 00:00:00','Shipped',NULL,382,'2003-04-28',2,4,2003), (10119,'S24_3949',28,'70.2900000',2,1968.12,'2003-04-28 00:00:00','2003-05-05 00:00:00','2003-05-02 00:00:00','Shipped',NULL,382,'2003-04-28',2,4,2003), (10119,'S700_1138',25,'76.6700000',14,1916.75,'2003-04-28 00:00:00','2003-05-05 00:00:00','2003-05-02 00:00:00','Shipped',NULL,382,'2003-04-28',2,4,2003), (10119,'S700_2047',29,'94.1400000',7,2730.06,'2003-04-28 00:00:00','2003-05-05 00:00:00','2003-05-02 00:00:00','Shipped',NULL,382,'2003-04-28',2,4,2003), (10119,'S700_2610',38,'65.7700000',12,2499.26,'2003-04-28 00:00:00','2003-05-05 00:00:00','2003-05-02 00:00:00','Shipped',NULL,382,'2003-04-28',2,4,2003), (10119,'S700_4002',26,'59.2200000',1,1539.72,'2003-04-28 00:00:00','2003-05-05 00:00:00','2003-05-02 00:00:00','Shipped',NULL,382,'2003-04-28',2,4,2003), (10119,'S72_1253',28,'48.1700000',6,1348.76,'2003-04-28 00:00:00','2003-05-05 00:00:00','2003-05-02 00:00:00','Shipped',NULL,382,'2003-04-28',2,4,2003), (10120,'S10_2016',29,'96.3400000',3,2793.86,'2003-04-29 00:00:00','2003-05-08 00:00:00','2003-05-01 00:00:00','Shipped',NULL,114,'2003-04-29',2,4,2003), (10120,'S10_4698',46,'100.0000000',2,9264.86,'2003-04-29 00:00:00','2003-05-08 00:00:00','2003-05-01 00:00:00','Shipped',NULL,114,'2003-04-29',2,4,2003), (10120,'S18_2581',29,'71.8100000',8,2082.49,'2003-04-29 00:00:00','2003-05-08 00:00:00','2003-05-01 00:00:00','Shipped',NULL,114,'2003-04-29',2,4,2003), (10120,'S18_2625',46,'58.1500000',4,2674.9,'2003-04-29 00:00:00','2003-05-08 00:00:00','2003-05-01 00:00:00','Shipped',NULL,114,'2003-04-29',2,4,2003), (10120,'S24_1578',35,'98.0500000',1,3431.75,'2003-04-29 00:00:00','2003-05-08 00:00:00','2003-05-01 00:00:00','Shipped',NULL,114,'2003-04-29',2,4,2003), (10120,'S24_1785',39,'100.0000000',10,4651.53,'2003-04-29 00:00:00','2003-05-08 00:00:00','2003-05-01 00:00:00','Shipped',NULL,114,'2003-04-29',2,4,2003), (10120,'S24_2000',34,'83.7900000',5,2848.86,'2003-04-29 00:00:00','2003-05-08 00:00:00','2003-05-01 00:00:00','Shipped',NULL,114,'2003-04-29',2,4,2003), (10120,'S24_4278',29,'85.4900000',9,2479.21,'2003-04-29 00:00:00','2003-05-08 00:00:00','2003-05-01 00:00:00','Shipped',NULL,114,'2003-04-29',2,4,2003), (10120,'S32_1374',22,'100.0000000',6,2461.36,'2003-04-29 00:00:00','2003-05-08 00:00:00','2003-05-01 00:00:00','Shipped',NULL,114,'2003-04-29',2,4,2003), (10120,'S32_4289',29,'72.2300000',11,2094.67,'2003-04-29 00:00:00','2003-05-08 00:00:00','2003-05-01 00:00:00','Shipped',NULL,114,'2003-04-29',2,4,2003), (10120,'S50_1341',49,'50.6200000',12,2480.38,'2003-04-29 00:00:00','2003-05-08 00:00:00','2003-05-01 00:00:00','Shipped',NULL,114,'2003-04-29',2,4,2003), (10120,'S700_1691',47,'82.2100000',13,3863.87,'2003-04-29 00:00:00','2003-05-08 00:00:00','2003-05-01 00:00:00','Shipped',NULL,114,'2003-04-29',2,4,2003), (10120,'S700_2466',24,'100.0000000',15,2584.8,'2003-04-29 00:00:00','2003-05-08 00:00:00','2003-05-01 00:00:00','Shipped',NULL,114,'2003-04-29',2,4,2003), (10120,'S700_2834',24,'100.0000000',7,3417.12,'2003-04-29 00:00:00','2003-05-08 00:00:00','2003-05-01 00:00:00','Shipped',NULL,114,'2003-04-29',2,4,2003), (10120,'S700_3167',43,'76.0000000',14,3268,'2003-04-29 00:00:00','2003-05-08 00:00:00','2003-05-01 00:00:00','Shipped',NULL,114,'2003-04-29',2,4,2003), (10121,'S10_1678',34,'81.3500000',5,2765.9,'2003-05-07 00:00:00','2003-05-13 00:00:00','2003-05-13 00:00:00','Shipped',NULL,353,'2003-05-07',2,5,2003), (10121,'S12_2823',50,'100.0000000',4,8284,'2003-05-07 00:00:00','2003-05-13 00:00:00','2003-05-13 00:00:00','Shipped',NULL,353,'2003-05-07',2,5,2003), (10121,'S24_2360',32,'76.8800000',2,2460.16,'2003-05-07 00:00:00','2003-05-13 00:00:00','2003-05-13 00:00:00','Shipped',NULL,353,'2003-05-07',2,5,2003), (10121,'S32_4485',25,'86.7400000',3,2168.5,'2003-05-07 00:00:00','2003-05-13 00:00:00','2003-05-13 00:00:00','Shipped',NULL,353,'2003-05-07',2,5,2003), (10121,'S50_4713',44,'74.8500000',1,3293.4,'2003-05-07 00:00:00','2003-05-13 00:00:00','2003-05-13 00:00:00','Shipped',NULL,353,'2003-05-07',2,5,2003), (10122,'S12_1099',42,'100.0000000',10,7599.9,'2003-05-08 00:00:00','2003-05-16 00:00:00','2003-05-13 00:00:00','Shipped',NULL,350,'2003-05-08',2,5,2003), (10122,'S12_3380',37,'99.8200000',8,3693.34,'2003-05-08 00:00:00','2003-05-16 00:00:00','2003-05-13 00:00:00','Shipped',NULL,350,'2003-05-08',2,5,2003), (10122,'S12_3990',32,'63.8400000',11,2042.88,'2003-05-08 00:00:00','2003-05-16 00:00:00','2003-05-13 00:00:00','Shipped',NULL,350,'2003-05-08',2,5,2003), (10122,'S12_4675',20,'100.0000000',7,2142,'2003-05-08 00:00:00','2003-05-16 00:00:00','2003-05-13 00:00:00','Shipped',NULL,350,'2003-05-08',2,5,2003), (10122,'S18_1129',34,'100.0000000',2,5004.8,'2003-05-08 00:00:00','2003-05-16 00:00:00','2003-05-13 00:00:00','Shipped',NULL,350,'2003-05-08',2,5,2003), (10122,'S18_1889',43,'72.3800000',6,3112.34,'2003-05-08 00:00:00','2003-05-16 00:00:00','2003-05-13 00:00:00','Shipped',NULL,350,'2003-05-08',2,5,2003), (10122,'S18_1984',31,'100.0000000',1,4100.99,'2003-05-08 00:00:00','2003-05-16 00:00:00','2003-05-13 00:00:00','Shipped',NULL,350,'2003-05-08',2,5,2003), (10122,'S18_3232',25,'100.0000000',3,3598.5,'2003-05-08 00:00:00','2003-05-16 00:00:00','2003-05-13 00:00:00','Shipped',NULL,350,'2003-05-08',2,5,2003), (10122,'S18_3278',21,'73.1700000',13,1536.57,'2003-05-08 00:00:00','2003-05-16 00:00:00','2003-05-13 00:00:00','Shipped',NULL,350,'2003-05-08',2,5,2003), (10122,'S18_3482',21,'100.0000000',12,2469.39,'2003-05-08 00:00:00','2003-05-16 00:00:00','2003-05-13 00:00:00','Shipped',NULL,350,'2003-05-08',2,5,2003), (10122,'S18_3782',35,'49.7400000',16,1740.9,'2003-05-08 00:00:00','2003-05-16 00:00:00','2003-05-13 00:00:00','Shipped',NULL,350,'2003-05-08',2,5,2003), (10122,'S18_4721',28,'100.0000000',15,3583.16,'2003-05-08 00:00:00','2003-05-16 00:00:00','2003-05-13 00:00:00','Shipped',NULL,350,'2003-05-08',2,5,2003), (10122,'S24_2972',39,'30.9600000',4,1207.44,'2003-05-08 00:00:00','2003-05-16 00:00:00','2003-05-13 00:00:00','Shipped',NULL,350,'2003-05-08',2,5,2003), (10122,'S24_3371',34,'50.2100000',9,1707.14,'2003-05-08 00:00:00','2003-05-16 00:00:00','2003-05-13 00:00:00','Shipped',NULL,350,'2003-05-08',2,5,2003), (10122,'S24_3856',43,'100.0000000',5,5494.97,'2003-05-08 00:00:00','2003-05-16 00:00:00','2003-05-13 00:00:00','Shipped',NULL,350,'2003-05-08',2,5,2003), (10122,'S24_4620',29,'71.1400000',14,2063.06,'2003-05-08 00:00:00','2003-05-16 00:00:00','2003-05-13 00:00:00','Shipped',NULL,350,'2003-05-08',2,5,2003), (10122,'S32_2206',31,'44.6600000',17,1384.46,'2003-05-08 00:00:00','2003-05-16 00:00:00','2003-05-13 00:00:00','Shipped',NULL,350,'2003-05-08',2,5,2003), (10123,'S18_1589',26,'100.0000000',2,3073.72,'2003-05-20 00:00:00','2003-05-29 00:00:00','2003-05-22 00:00:00','Shipped',NULL,103,'2003-05-20',2,5,2003), (10123,'S18_2870',46,'100.0000000',3,5161.2,'2003-05-20 00:00:00','2003-05-29 00:00:00','2003-05-22 00:00:00','Shipped',NULL,103,'2003-05-20',2,5,2003), (10123,'S18_3685',34,'100.0000000',4,5331.88,'2003-05-20 00:00:00','2003-05-29 00:00:00','2003-05-22 00:00:00','Shipped',NULL,103,'2003-05-20',2,5,2003), (10123,'S24_1628',50,'59.8700000',1,2993.5,'2003-05-20 00:00:00','2003-05-29 00:00:00','2003-05-22 00:00:00','Shipped',NULL,103,'2003-05-20',2,5,2003), (10124,'S18_1749',21,'100.0000000',6,2856,'2003-05-21 00:00:00','2003-05-29 00:00:00','2003-05-25 00:00:00','Shipped','Customer very concerned about the exact color of the models. There is high risk that he may dispute the order because there is a slight color mismatch',112,'2003-05-21',2,5,2003), (10124,'S18_2248',42,'53.8800000',5,2262.96,'2003-05-21 00:00:00','2003-05-29 00:00:00','2003-05-25 00:00:00','Shipped','Customer very concerned about the exact color of the models. There is high risk that he may dispute the order because there is a slight color mismatch',112,'2003-05-21',2,5,2003), (10124,'S18_2325',42,'100.0000000',3,4431.84,'2003-05-21 00:00:00','2003-05-29 00:00:00','2003-05-25 00:00:00','Shipped','Customer very concerned about the exact color of the models. There is high risk that he may dispute the order because there is a slight color mismatch',112,'2003-05-21',2,5,2003), (10124,'S18_4409',36,'85.5900000',7,3081.24,'2003-05-21 00:00:00','2003-05-29 00:00:00','2003-05-25 00:00:00','Shipped','Customer very concerned about the exact color of the models. There is high risk that he may dispute the order because there is a slight color mismatch',112,'2003-05-21',2,5,2003), (10124,'S18_4933',23,'57.7300000',8,1327.79,'2003-05-21 00:00:00','2003-05-29 00:00:00','2003-05-25 00:00:00','Shipped','Customer very concerned about the exact color of the models. There is high risk that he may dispute the order because there is a slight color mismatch',112,'2003-05-21',2,5,2003), (10124,'S24_1046',22,'77.9000000',12,1713.8,'2003-05-21 00:00:00','2003-05-29 00:00:00','2003-05-25 00:00:00','Shipped','Customer very concerned about the exact color of the models. There is high risk that he may dispute the order because there is a slight color mismatch',112,'2003-05-21',2,5,2003), (10124,'S24_1937',45,'37.8400000',2,1702.8,'2003-05-21 00:00:00','2003-05-29 00:00:00','2003-05-25 00:00:00','Shipped','Customer very concerned about the exact color of the models. There is high risk that he may dispute the order because there is a slight color mismatch',112,'2003-05-21',2,5,2003), (10124,'S24_2022',22,'45.2500000',1,995.5,'2003-05-21 00:00:00','2003-05-29 00:00:00','2003-05-25 00:00:00','Shipped','Customer very concerned about the exact color of the models. There is high risk that he may dispute the order because there is a slight color mismatch',112,'2003-05-21',2,5,2003), (10124,'S24_2766',32,'72.7000000',10,2326.4,'2003-05-21 00:00:00','2003-05-29 00:00:00','2003-05-25 00:00:00','Shipped','Customer very concerned about the exact color of the models. There is high risk that he may dispute the order because there is a slight color mismatch',112,'2003-05-21',2,5,2003), (10124,'S24_2887',25,'93.9500000',9,2348.75,'2003-05-21 00:00:00','2003-05-29 00:00:00','2003-05-25 00:00:00','Shipped','Customer very concerned about the exact color of the models. There is high risk that he may dispute the order because there is a slight color mismatch',112,'2003-05-21',2,5,2003), (10124,'S24_3191',49,'83.0400000',11,4068.96,'2003-05-21 00:00:00','2003-05-29 00:00:00','2003-05-25 00:00:00','Shipped','Customer very concerned about the exact color of the models. There is high risk that he may dispute the order because there is a slight color mismatch',112,'2003-05-21',2,5,2003), (10124,'S24_3432',43,'100.0000000',13,5203,'2003-05-21 00:00:00','2003-05-29 00:00:00','2003-05-25 00:00:00','Shipped','Customer very concerned about the exact color of the models. There is high risk that he may dispute the order because there is a slight color mismatch',112,'2003-05-21',2,5,2003), (10124,'S24_3969',46,'33.2300000',4,1528.58,'2003-05-21 00:00:00','2003-05-29 00:00:00','2003-05-25 00:00:00','Shipped','Customer very concerned about the exact color of the models. There is high risk that he may dispute the order because there is a slight color mismatch',112,'2003-05-21',2,5,2003), (10125,'S18_1342',32,'100.0000000',1,3254.72,'2003-05-21 00:00:00','2003-05-27 00:00:00','2003-05-24 00:00:00','Shipped',NULL,114,'2003-05-21',2,5,2003), (10125,'S18_2795',34,'100.0000000',2,6483.46,'2003-05-21 00:00:00','2003-05-27 00:00:00','2003-05-24 00:00:00','Shipped',NULL,114,'2003-05-21',2,5,2003), (10126,'S10_1949',38,'100.0000000',11,7329.06,'2003-05-28 00:00:00','2003-06-07 00:00:00','2003-06-02 00:00:00','Shipped',NULL,458,'2003-05-28',2,5,2003), (10126,'S10_4962',22,'100.0000000',4,3347.74,'2003-05-28 00:00:00','2003-06-07 00:00:00','2003-06-02 00:00:00','Shipped',NULL,458,'2003-05-28',2,5,2003), (10126,'S12_1666',21,'100.0000000',8,2439.57,'2003-05-28 00:00:00','2003-06-07 00:00:00','2003-06-02 00:00:00','Shipped',NULL,458,'2003-05-28',2,5,2003), (10126,'S18_1097',38,'100.0000000',10,3857,'2003-05-28 00:00:00','2003-06-07 00:00:00','2003-06-02 00:00:00','Shipped',NULL,458,'2003-05-28',2,5,2003), (10126,'S18_1367',42,'54.9900000',17,2309.58,'2003-05-28 00:00:00','2003-06-07 00:00:00','2003-06-02 00:00:00','Shipped',NULL,458,'2003-05-28',2,5,2003), (10126,'S18_2432',43,'65.0200000',2,2795.86,'2003-05-28 00:00:00','2003-06-07 00:00:00','2003-06-02 00:00:00','Shipped',NULL,458,'2003-05-28',2,5,2003), (10126,'S18_2949',31,'90.1700000',12,2795.27,'2003-05-28 00:00:00','2003-06-07 00:00:00','2003-06-02 00:00:00','Shipped',NULL,458,'2003-05-28',2,5,2003), (10126,'S18_2957',46,'73.7000000',14,3390.2,'2003-05-28 00:00:00','2003-06-07 00:00:00','2003-06-02 00:00:00','Shipped',NULL,458,'2003-05-28',2,5,2003), (10126,'S18_3136',30,'97.3900000',13,2921.7,'2003-05-28 00:00:00','2003-06-07 00:00:00','2003-06-02 00:00:00','Shipped',NULL,458,'2003-05-28',2,5,2003), (10126,'S18_3320',38,'82.3400000',16,3128.92,'2003-05-28 00:00:00','2003-06-07 00:00:00','2003-06-02 00:00:00','Shipped',NULL,458,'2003-05-28',2,5,2003), (10126,'S18_4600',50,'100.0000000',5,7083,'2003-05-28 00:00:00','2003-06-07 00:00:00','2003-06-02 00:00:00','Shipped',NULL,458,'2003-05-28',2,5,2003), (10126,'S18_4668',43,'53.8300000',9,2314.69,'2003-05-28 00:00:00','2003-06-07 00:00:00','2003-06-02 00:00:00','Shipped',NULL,458,'2003-05-28',2,5,2003), (10126,'S24_2300',27,'100.0000000',1,3415.77,'2003-05-28 00:00:00','2003-06-07 00:00:00','2003-06-02 00:00:00','Shipped',NULL,458,'2003-05-28',2,5,2003), (10126,'S24_4258',34,'100.0000000',15,3576.12,'2003-05-28 00:00:00','2003-06-07 00:00:00','2003-06-02 00:00:00','Shipped',NULL,458,'2003-05-28',2,5,2003), (10126,'S32_1268',43,'96.3100000',3,4141.33,'2003-05-28 00:00:00','2003-06-07 00:00:00','2003-06-02 00:00:00','Shipped',NULL,458,'2003-05-28',2,5,2003), (10126,'S32_3522',26,'62.7000000',7,1630.2,'2003-05-28 00:00:00','2003-06-07 00:00:00','2003-06-02 00:00:00','Shipped',NULL,458,'2003-05-28',2,5,2003), (10126,'S700_2824',45,'100.0000000',6,4597.2,'2003-05-28 00:00:00','2003-06-07 00:00:00','2003-06-02 00:00:00','Shipped',NULL,458,'2003-05-28',2,5,2003), (10127,'S12_1108',46,'100.0000000',2,11279.2,'2003-06-03 00:00:00','2003-06-09 00:00:00','2003-06-06 00:00:00','Shipped','Customer requested special shippment. The instructions were passed along to the warehouse',151,'2003-06-03',2,6,2003), (10127,'S12_3148',46,'100.0000000',3,7366.44,'2003-06-03 00:00:00','2003-06-09 00:00:00','2003-06-06 00:00:00','Shipped','Customer requested special shippment. The instructions were passed along to the warehouse',151,'2003-06-03',2,6,2003), (10127,'S12_3891',42,'100.0000000',1,8138.76,'2003-06-03 00:00:00','2003-06-09 00:00:00','2003-06-06 00:00:00','Shipped','Customer requested special shippment. The instructions were passed along to the warehouse',151,'2003-06-03',2,6,2003), (10127,'S12_4473',24,'100.0000000',11,2559.6,'2003-06-03 00:00:00','2003-06-09 00:00:00','2003-06-06 00:00:00','Shipped','Customer requested special shippment. The instructions were passed along to the warehouse',151,'2003-06-03',2,6,2003), (10127,'S18_2238',45,'100.0000000',10,7146.9,'2003-06-03 00:00:00','2003-06-09 00:00:00','2003-06-06 00:00:00','Shipped','Customer requested special shippment. The instructions were passed along to the warehouse',151,'2003-06-03',2,6,2003), (10127,'S18_2319',45,'100.0000000',14,6295.95,'2003-06-03 00:00:00','2003-06-09 00:00:00','2003-06-06 00:00:00','Shipped','Customer requested special shippment. The instructions were passed along to the warehouse',151,'2003-06-03',2,6,2003), (10127,'S18_3232',22,'100.0000000',15,3837.24,'2003-06-03 00:00:00','2003-06-09 00:00:00','2003-06-06 00:00:00','Shipped','Customer requested special shippment. The instructions were passed along to the warehouse',151,'2003-06-03',2,6,2003), (10127,'S18_4027',25,'100.0000000',5,3447,'2003-06-03 00:00:00','2003-06-09 00:00:00','2003-06-06 00:00:00','Shipped','Customer requested special shippment. The instructions were passed along to the warehouse',151,'2003-06-03',2,6,2003), (10127,'S24_1444',20,'60.6900000',8,1213.8,'2003-06-03 00:00:00','2003-06-09 00:00:00','2003-06-06 00:00:00','Shipped','Customer requested special shippment. The instructions were passed along to the warehouse',151,'2003-06-03',2,6,2003), (10127,'S24_2840',39,'38.1900000',12,1489.41,'2003-06-03 00:00:00','2003-06-09 00:00:00','2003-06-06 00:00:00','Shipped','Customer requested special shippment. The instructions were passed along to the warehouse',151,'2003-06-03',2,6,2003), (10127,'S24_4048',20,'96.9900000',7,1939.8,'2003-06-03 00:00:00','2003-06-09 00:00:00','2003-06-06 00:00:00','Shipped','Customer requested special shippment. The instructions were passed along to the warehouse',151,'2003-06-03',2,6,2003), (10127,'S32_2509',45,'51.9500000',13,2337.75,'2003-06-03 00:00:00','2003-06-09 00:00:00','2003-06-06 00:00:00','Shipped','Customer requested special shippment. The instructions were passed along to the warehouse',151,'2003-06-03',2,6,2003), (10127,'S32_3207',29,'70.8400000',6,2054.36,'2003-06-03 00:00:00','2003-06-09 00:00:00','2003-06-06 00:00:00','Shipped','Customer requested special shippment. The instructions were passed along to the warehouse',151,'2003-06-03',2,6,2003), (10127,'S50_1392',46,'100.0000000',9,6176.42,'2003-06-03 00:00:00','2003-06-09 00:00:00','2003-06-06 00:00:00','Shipped','Customer requested special shippment. The instructions were passed along to the warehouse',151,'2003-06-03',2,6,2003), (10127,'S50_1514',46,'69.1200000',4,3179.52,'2003-06-03 00:00:00','2003-06-09 00:00:00','2003-06-06 00:00:00','Shipped','Customer requested special shippment. The instructions were passed along to the warehouse',151,'2003-06-03',2,6,2003), (10128,'S18_3140',41,'100.0000000',2,5544.02,'2003-06-06 00:00:00','2003-06-12 00:00:00','2003-06-11 00:00:00','Shipped',NULL,141,'2003-06-06',2,6,2003), (10128,'S18_3259',41,'100.0000000',4,4837.18,'2003-06-06 00:00:00','2003-06-12 00:00:00','2003-06-11 00:00:00','Shipped',NULL,141,'2003-06-06',2,6,2003), (10128,'S18_4522',43,'92.1600000',1,3962.88,'2003-06-06 00:00:00','2003-06-12 00:00:00','2003-06-11 00:00:00','Shipped',NULL,141,'2003-06-06',2,6,2003), (10128,'S700_1938',32,'97.0000000',3,3104,'2003-06-06 00:00:00','2003-06-12 00:00:00','2003-06-11 00:00:00','Shipped',NULL,141,'2003-06-06',2,6,2003), (10129,'S10_4757',33,'100.0000000',2,4398.24,'2003-06-12 00:00:00','2003-06-18 00:00:00','2003-06-14 00:00:00','Shipped',NULL,324,'2003-06-12',2,6,2003), (10129,'S24_2011',45,'100.0000000',9,6027.75,'2003-06-12 00:00:00','2003-06-18 00:00:00','2003-06-14 00:00:00','Shipped',NULL,324,'2003-06-12',2,6,2003), (10129,'S24_3151',41,'94.7100000',4,3883.11,'2003-06-12 00:00:00','2003-06-18 00:00:00','2003-06-14 00:00:00','Shipped',NULL,324,'2003-06-12',2,6,2003), (10129,'S24_3816',50,'77.9900000',1,3899.5,'2003-06-12 00:00:00','2003-06-18 00:00:00','2003-06-14 00:00:00','Shipped',NULL,324,'2003-06-12',2,6,2003), (10129,'S700_1138',31,'60.0000000',5,1860,'2003-06-12 00:00:00','2003-06-18 00:00:00','2003-06-14 00:00:00','Shipped',NULL,324,'2003-06-12',2,6,2003), (10129,'S700_2610',45,'85.2900000',3,3838.05,'2003-06-12 00:00:00','2003-06-18 00:00:00','2003-06-14 00:00:00','Shipped',NULL,324,'2003-06-12',2,6,2003), (10129,'S700_3505',42,'91.1500000',6,3828.3,'2003-06-12 00:00:00','2003-06-18 00:00:00','2003-06-14 00:00:00','Shipped',NULL,324,'2003-06-12',2,6,2003), (10129,'S700_3962',30,'85.4100000',7,2562.3,'2003-06-12 00:00:00','2003-06-18 00:00:00','2003-06-14 00:00:00','Shipped',NULL,324,'2003-06-12',2,6,2003), (10129,'S72_3212',32,'64.9700000',8,2079.04,'2003-06-12 00:00:00','2003-06-18 00:00:00','2003-06-14 00:00:00','Shipped',NULL,324,'2003-06-12',2,6,2003), (10130,'S18_3029',40,'96.3400000',2,3853.6,'2003-06-16 00:00:00','2003-06-24 00:00:00','2003-06-21 00:00:00','Shipped',NULL,198,'2003-06-16',2,6,2003), (10130,'S18_3856',33,'100.0000000',1,3423.75,'2003-06-16 00:00:00','2003-06-24 00:00:00','2003-06-21 00:00:00','Shipped',NULL,198,'2003-06-16',2,6,2003), (10131,'S18_1662',21,'100.0000000',4,2781.66,'2003-06-16 00:00:00','2003-06-25 00:00:00','2003-06-21 00:00:00','Shipped',NULL,447,'2003-06-16',2,6,2003), (10131,'S24_2841',35,'67.1400000',5,2349.9,'2003-06-16 00:00:00','2003-06-25 00:00:00','2003-06-21 00:00:00','Shipped',NULL,447,'2003-06-16',2,6,2003), (10131,'S24_3420',29,'59.1800000',6,1716.22,'2003-06-16 00:00:00','2003-06-25 00:00:00','2003-06-21 00:00:00','Shipped',NULL,447,'2003-06-16',2,6,2003), (10131,'S24_3949',50,'81.8900000',3,4094.5,'2003-06-16 00:00:00','2003-06-25 00:00:00','2003-06-21 00:00:00','Shipped',NULL,447,'2003-06-16',2,6,2003), (10131,'S700_2047',22,'85.9900000',8,1891.78,'2003-06-16 00:00:00','2003-06-25 00:00:00','2003-06-21 00:00:00','Shipped',NULL,447,'2003-06-16',2,6,2003), (10131,'S700_2466',40,'100.0000000',1,4427.6,'2003-06-16 00:00:00','2003-06-25 00:00:00','2003-06-21 00:00:00','Shipped',NULL,447,'2003-06-16',2,6,2003), (10131,'S700_4002',26,'85.1300000',2,2213.38,'2003-06-16 00:00:00','2003-06-25 00:00:00','2003-06-21 00:00:00','Shipped',NULL,447,'2003-06-16',2,6,2003), (10131,'S72_1253',21,'41.7100000',7,875.91,'2003-06-16 00:00:00','2003-06-25 00:00:00','2003-06-21 00:00:00','Shipped',NULL,447,'2003-06-16',2,6,2003), (10132,'S700_3167',36,'68.8000000',1,2476.8,'2003-06-25 00:00:00','2003-07-01 00:00:00','2003-06-28 00:00:00','Shipped',NULL,323,'2003-06-25',2,6,2003), (10133,'S18_2581',49,'69.2700000',3,3394.23,'2003-06-27 00:00:00','2003-07-04 00:00:00','2003-07-03 00:00:00','Shipped',NULL,141,'2003-06-27',2,6,2003), (10133,'S24_1785',41,'94.1000000',5,3858.1,'2003-06-27 00:00:00','2003-07-04 00:00:00','2003-07-03 00:00:00','Shipped',NULL,141,'2003-06-27',2,6,2003), (10133,'S24_4278',46,'77.5200000',4,3565.92,'2003-06-27 00:00:00','2003-07-04 00:00:00','2003-07-03 00:00:00','Shipped',NULL,141,'2003-06-27',2,6,2003), (10133,'S32_1374',23,'100.0000000',1,2642.01,'2003-06-27 00:00:00','2003-07-04 00:00:00','2003-07-03 00:00:00','Shipped',NULL,141,'2003-06-27',2,6,2003), (10133,'S32_4289',49,'57.1000000',6,2797.9,'2003-06-27 00:00:00','2003-07-04 00:00:00','2003-07-03 00:00:00','Shipped',NULL,141,'2003-06-27',2,6,2003), (10133,'S50_1341',27,'50.1900000',7,1355.13,'2003-06-27 00:00:00','2003-07-04 00:00:00','2003-07-03 00:00:00','Shipped',NULL,141,'2003-06-27',2,6,2003), (10133,'S700_1691',24,'77.6400000',8,1863.36,'2003-06-27 00:00:00','2003-07-04 00:00:00','2003-07-03 00:00:00','Shipped',NULL,141,'2003-06-27',2,6,2003), (10133,'S700_2834',27,'99.6700000',2,2691.09,'2003-06-27 00:00:00','2003-07-04 00:00:00','2003-07-03 00:00:00','Shipped',NULL,141,'2003-06-27',2,6,2003), (10134,'S10_1678',41,'94.7400000',2,3884.34,'2003-07-01 00:00:00','2003-07-10 00:00:00','2003-07-05 00:00:00','Shipped',NULL,250,'2003-07-01',3,7,2003), (10134,'S10_2016',27,'100.0000000',5,3307.77,'2003-07-01 00:00:00','2003-07-10 00:00:00','2003-07-05 00:00:00','Shipped',NULL,250,'2003-07-01',3,7,2003), (10134,'S10_4698',31,'100.0000000',4,7023.98,'2003-07-01 00:00:00','2003-07-10 00:00:00','2003-07-05 00:00:00','Shipped',NULL,250,'2003-07-01',3,7,2003), (10134,'S12_2823',20,'100.0000000',1,2711.2,'2003-07-01 00:00:00','2003-07-10 00:00:00','2003-07-05 00:00:00','Shipped',NULL,250,'2003-07-01',3,7,2003), (10134,'S18_2625',30,'61.7800000',6,1853.4,'2003-07-01 00:00:00','2003-07-10 00:00:00','2003-07-05 00:00:00','Shipped',NULL,250,'2003-07-01',3,7,2003), (10134,'S24_1578',35,'93.5400000',3,3273.9,'2003-07-01 00:00:00','2003-07-10 00:00:00','2003-07-05 00:00:00','Shipped',NULL,250,'2003-07-01',3,7,2003), (10134,'S24_2000',43,'83.0300000',7,3570.29,'2003-07-01 00:00:00','2003-07-10 00:00:00','2003-07-05 00:00:00','Shipped',NULL,250,'2003-07-01',3,7,2003), (10135,'S12_1099',42,'100.0000000',7,8008.56,'2003-07-02 00:00:00','2003-07-12 00:00:00','2003-07-03 00:00:00','Shipped',NULL,124,'2003-07-02',3,7,2003), (10135,'S12_3380',48,'100.0000000',5,6031.68,'2003-07-02 00:00:00','2003-07-12 00:00:00','2003-07-03 00:00:00','Shipped',NULL,124,'2003-07-02',3,7,2003), (10135,'S12_3990',24,'75.0100000',8,1800.24,'2003-07-02 00:00:00','2003-07-12 00:00:00','2003-07-03 00:00:00','Shipped',NULL,124,'2003-07-02',3,7,2003), (10135,'S12_4675',29,'97.8900000',4,2838.81,'2003-07-02 00:00:00','2003-07-12 00:00:00','2003-07-03 00:00:00','Shipped',NULL,124,'2003-07-02',3,7,2003), (10135,'S18_1889',48,'79.3100000',3,3806.88,'2003-07-02 00:00:00','2003-07-12 00:00:00','2003-07-03 00:00:00','Shipped',NULL,124,'2003-07-02',3,7,2003), (10135,'S18_3278',45,'78.0000000',10,3510,'2003-07-02 00:00:00','2003-07-12 00:00:00','2003-07-03 00:00:00','Shipped',NULL,124,'2003-07-02',3,7,2003), (10135,'S18_3482',42,'100.0000000',9,5432.7,'2003-07-02 00:00:00','2003-07-12 00:00:00','2003-07-03 00:00:00','Shipped',NULL,124,'2003-07-02',3,7,2003), (10135,'S18_3782',45,'50.3600000',13,2266.2,'2003-07-02 00:00:00','2003-07-12 00:00:00','2003-07-03 00:00:00','Shipped',NULL,124,'2003-07-02',3,7,2003), (10135,'S18_4721',31,'100.0000000',12,4705.18,'2003-07-02 00:00:00','2003-07-12 00:00:00','2003-07-03 00:00:00','Shipped',NULL,124,'2003-07-02',3,7,2003), (10135,'S24_2360',29,'61.6400000',16,1787.56,'2003-07-02 00:00:00','2003-07-12 00:00:00','2003-07-03 00:00:00','Shipped',NULL,124,'2003-07-02',3,7,2003), (10135,'S24_2972',20,'35.8700000',1,717.4,'2003-07-02 00:00:00','2003-07-12 00:00:00','2003-07-03 00:00:00','Shipped',NULL,124,'2003-07-02',3,7,2003), (10135,'S24_3371',27,'66.1300000',6,1785.51,'2003-07-02 00:00:00','2003-07-12 00:00:00','2003-07-03 00:00:00','Shipped',NULL,124,'2003-07-02',3,7,2003), (10135,'S24_3856',47,'100.0000000',2,6336.07,'2003-07-02 00:00:00','2003-07-12 00:00:00','2003-07-03 00:00:00','Shipped',NULL,124,'2003-07-02',3,7,2003), (10135,'S24_4620',23,'87.3100000',11,2008.13,'2003-07-02 00:00:00','2003-07-12 00:00:00','2003-07-03 00:00:00','Shipped',NULL,124,'2003-07-02',3,7,2003), (10135,'S32_2206',33,'40.2300000',14,1327.59,'2003-07-02 00:00:00','2003-07-12 00:00:00','2003-07-03 00:00:00','Shipped',NULL,124,'2003-07-02',3,7,2003), (10135,'S32_4485',30,'89.8000000',17,2694,'2003-07-02 00:00:00','2003-07-12 00:00:00','2003-07-03 00:00:00','Shipped',NULL,124,'2003-07-02',3,7,2003), (10135,'S50_4713',44,'96.0000000',15,4224,'2003-07-02 00:00:00','2003-07-12 00:00:00','2003-07-03 00:00:00','Shipped',NULL,124,'2003-07-02',3,7,2003), (10136,'S18_1129',25,'100.0000000',2,3644.75,'2003-07-04 00:00:00','2003-07-14 00:00:00','2003-07-06 00:00:00','Shipped','Customer is interested in buying more Ferrari models',242,'2003-07-04',3,7,2003), (10136,'S18_1984',36,'100.0000000',1,5274.72,'2003-07-04 00:00:00','2003-07-14 00:00:00','2003-07-06 00:00:00','Shipped','Customer is interested in buying more Ferrari models',242,'2003-07-04',3,7,2003), (10136,'S18_3232',41,'100.0000000',3,8331.61,'2003-07-04 00:00:00','2003-07-14 00:00:00','2003-07-06 00:00:00','Shipped','Customer is interested in buying more Ferrari models',242,'2003-07-04',3,7,2003), (10137,'S18_1589',44,'99.5500000',2,4380.2,'2003-07-10 00:00:00','2003-07-20 00:00:00','2003-07-14 00:00:00','Shipped',NULL,353,'2003-07-10',3,7,2003), (10137,'S18_2870',37,'100.0000000',3,4346.76,'2003-07-10 00:00:00','2003-07-20 00:00:00','2003-07-14 00:00:00','Shipped',NULL,353,'2003-07-10',3,7,2003), (10137,'S18_3685',31,'100.0000000',4,5124.3,'2003-07-10 00:00:00','2003-07-20 00:00:00','2003-07-14 00:00:00','Shipped',NULL,353,'2003-07-10',3,7,2003), (10137,'S24_1628',26,'49.8100000',1,1295.06,'2003-07-10 00:00:00','2003-07-20 00:00:00','2003-07-14 00:00:00','Shipped',NULL,353,'2003-07-10',3,7,2003), (10138,'S18_1749',33,'100.0000000',6,5329.5,'2003-07-07 00:00:00','2003-07-16 00:00:00','2003-07-13 00:00:00','Shipped',NULL,496,'2003-07-07',3,7,2003), (10138,'S18_2248',22,'48.4300000',5,1065.46,'2003-07-07 00:00:00','2003-07-16 00:00:00','2003-07-13 00:00:00','Shipped',NULL,496,'2003-07-07',3,7,2003), (10138,'S18_2325',38,'100.0000000',3,4106.28,'2003-07-07 00:00:00','2003-07-16 00:00:00','2003-07-13 00:00:00','Shipped',NULL,496,'2003-07-07',3,7,2003), (10138,'S18_4409',47,'100.0000000',7,4714.57,'2003-07-07 00:00:00','2003-07-16 00:00:00','2003-07-13 00:00:00','Shipped',NULL,496,'2003-07-07',3,7,2003), (10138,'S18_4933',23,'66.9900000',8,1540.77,'2003-07-07 00:00:00','2003-07-16 00:00:00','2003-07-13 00:00:00','Shipped',NULL,496,'2003-07-07',3,7,2003), (10138,'S24_1046',45,'84.5100000',12,3802.95,'2003-07-07 00:00:00','2003-07-16 00:00:00','2003-07-13 00:00:00','Shipped',NULL,496,'2003-07-07',3,7,2003), (10138,'S24_1937',22,'29.2100000',2,642.62,'2003-07-07 00:00:00','2003-07-16 00:00:00','2003-07-13 00:00:00','Shipped',NULL,496,'2003-07-07',3,7,2003), (10138,'S24_2022',33,'43.0100000',1,1419.33,'2003-07-07 00:00:00','2003-07-16 00:00:00','2003-07-13 00:00:00','Shipped',NULL,496,'2003-07-07',3,7,2003), (10138,'S24_2766',28,'100.0000000',10,2926,'2003-07-07 00:00:00','2003-07-16 00:00:00','2003-07-13 00:00:00','Shipped',NULL,496,'2003-07-07',3,7,2003), (10138,'S24_2887',30,'100.0000000',9,4157.4,'2003-07-07 00:00:00','2003-07-16 00:00:00','2003-07-13 00:00:00','Shipped',NULL,496,'2003-07-07',3,7,2003), (10138,'S24_3191',49,'90.7500000',11,4446.75,'2003-07-07 00:00:00','2003-07-16 00:00:00','2003-07-13 00:00:00','Shipped',NULL,496,'2003-07-07',3,7,2003), (10138,'S24_3432',21,'100.0000000',13,2496.06,'2003-07-07 00:00:00','2003-07-16 00:00:00','2003-07-13 00:00:00','Shipped',NULL,496,'2003-07-07',3,7,2003), (10138,'S24_3969',29,'38.1600000',4,1106.64,'2003-07-07 00:00:00','2003-07-16 00:00:00','2003-07-13 00:00:00','Shipped',NULL,496,'2003-07-07',3,7,2003), (10139,'S18_1342',31,'100.0000000',7,3184.94,'2003-07-16 00:00:00','2003-07-23 00:00:00','2003-07-21 00:00:00','Shipped',NULL,282,'2003-07-16',3,7,2003), (10139,'S18_1367',49,'43.1300000',6,2113.37,'2003-07-16 00:00:00','2003-07-23 00:00:00','2003-07-21 00:00:00','Shipped',NULL,282,'2003-07-16',3,7,2003), (10139,'S18_2795',41,'100.0000000',8,7956.46,'2003-07-16 00:00:00','2003-07-23 00:00:00','2003-07-21 00:00:00','Shipped',NULL,282,'2003-07-16',3,7,2003), (10139,'S18_2949',46,'100.0000000',1,5545.76,'2003-07-16 00:00:00','2003-07-23 00:00:00','2003-07-21 00:00:00','Shipped',NULL,282,'2003-07-16',3,7,2003), (10139,'S18_2957',20,'71.2000000',3,1424,'2003-07-16 00:00:00','2003-07-23 00:00:00','2003-07-21 00:00:00','Shipped',NULL,282,'2003-07-16',3,7,2003), (10139,'S18_3136',20,'90.0600000',2,1801.2,'2003-07-16 00:00:00','2003-07-23 00:00:00','2003-07-21 00:00:00','Shipped',NULL,282,'2003-07-16',3,7,2003), (10139,'S18_3320',30,'100.0000000',5,3095.4,'2003-07-16 00:00:00','2003-07-23 00:00:00','2003-07-21 00:00:00','Shipped',NULL,282,'2003-07-16',3,7,2003), (10139,'S24_4258',29,'100.0000000',4,3276.13,'2003-07-16 00:00:00','2003-07-23 00:00:00','2003-07-21 00:00:00','Shipped',NULL,282,'2003-07-16',3,7,2003), (10140,'S10_1949',37,'100.0000000',11,7374.1,'2003-07-24 00:00:00','2003-08-02 00:00:00','2003-07-30 00:00:00','Shipped',NULL,161,'2003-07-24',3,7,2003), (10140,'S10_4962',26,'100.0000000',4,3188.12,'2003-07-24 00:00:00','2003-08-02 00:00:00','2003-07-30 00:00:00','Shipped',NULL,161,'2003-07-24',3,7,2003), (10140,'S12_1666',38,'100.0000000',8,4829.8,'2003-07-24 00:00:00','2003-08-02 00:00:00','2003-07-30 00:00:00','Shipped',NULL,161,'2003-07-24',3,7,2003), (10140,'S18_1097',32,'100.0000000',10,4181.44,'2003-07-24 00:00:00','2003-08-02 00:00:00','2003-07-30 00:00:00','Shipped',NULL,161,'2003-07-24',3,7,2003), (10140,'S18_2432',46,'61.9900000',2,2851.54,'2003-07-24 00:00:00','2003-08-02 00:00:00','2003-07-30 00:00:00','Shipped',NULL,161,'2003-07-24',3,7,2003), (10140,'S18_4600',40,'100.0000000',5,4601.2,'2003-07-24 00:00:00','2003-08-02 00:00:00','2003-07-30 00:00:00','Shipped',NULL,161,'2003-07-24',3,7,2003), (10140,'S18_4668',29,'43.2700000',9,1254.83,'2003-07-24 00:00:00','2003-08-02 00:00:00','2003-07-30 00:00:00','Shipped',NULL,161,'2003-07-24',3,7,2003), (10140,'S24_2300',47,'100.0000000',1,5105.14,'2003-07-24 00:00:00','2003-08-02 00:00:00','2003-07-30 00:00:00','Shipped',NULL,161,'2003-07-24',3,7,2003), (10140,'S32_1268',26,'100.0000000',3,2829.58,'2003-07-24 00:00:00','2003-08-02 00:00:00','2003-07-30 00:00:00','Shipped',NULL,161,'2003-07-24',3,7,2003), (10140,'S32_3522',28,'60.7600000',7,1701.28,'2003-07-24 00:00:00','2003-08-02 00:00:00','2003-07-30 00:00:00','Shipped',NULL,161,'2003-07-24',3,7,2003), (10140,'S700_2824',36,'100.0000000',6,4114.8,'2003-07-24 00:00:00','2003-08-02 00:00:00','2003-07-30 00:00:00','Shipped',NULL,161,'2003-07-24',3,7,2003), (10141,'S12_4473',21,'100.0000000',5,2140.11,'2003-08-01 00:00:00','2003-08-09 00:00:00','2003-08-04 00:00:00','Shipped',NULL,334,'2003-08-01',3,8,2003), (10141,'S18_2238',39,'100.0000000',4,5938.53,'2003-08-01 00:00:00','2003-08-09 00:00:00','2003-08-04 00:00:00','Shipped',NULL,334,'2003-08-01',3,8,2003), (10141,'S18_2319',47,'100.0000000',8,6287.66,'2003-08-01 00:00:00','2003-08-09 00:00:00','2003-08-04 00:00:00','Shipped',NULL,334,'2003-08-01',3,8,2003), (10141,'S18_3232',34,'100.0000000',9,4836.5,'2003-08-01 00:00:00','2003-08-09 00:00:00','2003-08-04 00:00:00','Shipped',NULL,334,'2003-08-01',3,8,2003), (10141,'S24_1444',20,'54.3300000',2,1086.6,'2003-08-01 00:00:00','2003-08-09 00:00:00','2003-08-04 00:00:00','Shipped',NULL,334,'2003-08-01',3,8,2003), (10141,'S24_2840',21,'42.4300000',6,891.03,'2003-08-01 00:00:00','2003-08-09 00:00:00','2003-08-04 00:00:00','Shipped',NULL,334,'2003-08-01',3,8,2003), (10141,'S24_4048',40,'94.6200000',1,3784.8,'2003-08-01 00:00:00','2003-08-09 00:00:00','2003-08-04 00:00:00','Shipped',NULL,334,'2003-08-01',3,8,2003), (10141,'S32_2509',24,'45.9900000',7,1103.76,'2003-08-01 00:00:00','2003-08-09 00:00:00','2003-08-04 00:00:00','Shipped',NULL,334,'2003-08-01',3,8,2003), (10141,'S50_1392',44,'100.0000000',3,5500.44,'2003-08-01 00:00:00','2003-08-09 00:00:00','2003-08-04 00:00:00','Shipped',NULL,334,'2003-08-01',3,8,2003), (10142,'S12_1108',33,'100.0000000',12,8023.29,'2003-08-08 00:00:00','2003-08-16 00:00:00','2003-08-13 00:00:00','Shipped',NULL,124,'2003-08-08',3,8,2003), (10142,'S12_3148',33,'100.0000000',13,4985.64,'2003-08-08 00:00:00','2003-08-16 00:00:00','2003-08-13 00:00:00','Shipped',NULL,124,'2003-08-08',3,8,2003), (10142,'S12_3891',46,'100.0000000',11,9470.94,'2003-08-08 00:00:00','2003-08-16 00:00:00','2003-08-13 00:00:00','Shipped',NULL,124,'2003-08-08',3,8,2003), (10142,'S18_3140',47,'100.0000000',8,6034.33,'2003-08-08 00:00:00','2003-08-16 00:00:00','2003-08-13 00:00:00','Shipped',NULL,124,'2003-08-08',3,8,2003), (10142,'S18_3259',22,'97.8100000',10,2151.82,'2003-08-08 00:00:00','2003-08-16 00:00:00','2003-08-13 00:00:00','Shipped',NULL,124,'2003-08-08',3,8,2003), (10142,'S18_4027',24,'100.0000000',15,3791.52,'2003-08-08 00:00:00','2003-08-16 00:00:00','2003-08-13 00:00:00','Shipped',NULL,124,'2003-08-08',3,8,2003), (10142,'S18_4522',24,'70.2200000',7,1685.28,'2003-08-08 00:00:00','2003-08-16 00:00:00','2003-08-13 00:00:00','Shipped',NULL,124,'2003-08-08',3,8,2003), (10142,'S24_2011',33,'100.0000000',6,3366,'2003-08-08 00:00:00','2003-08-16 00:00:00','2003-08-13 00:00:00','Shipped',NULL,124,'2003-08-08',3,8,2003), (10142,'S24_3151',49,'98.2500000',1,4814.25,'2003-08-08 00:00:00','2003-08-16 00:00:00','2003-08-13 00:00:00','Shipped',NULL,124,'2003-08-08',3,8,2003), (10142,'S32_3207',42,'74.5700000',16,3131.94,'2003-08-08 00:00:00','2003-08-16 00:00:00','2003-08-13 00:00:00','Shipped',NULL,124,'2003-08-08',3,8,2003), (10142,'S50_1514',42,'49.7900000',14,2091.18,'2003-08-08 00:00:00','2003-08-16 00:00:00','2003-08-13 00:00:00','Shipped',NULL,124,'2003-08-08',3,8,2003), (10142,'S700_1138',41,'64.0000000',2,2624,'2003-08-08 00:00:00','2003-08-16 00:00:00','2003-08-13 00:00:00','Shipped',NULL,124,'2003-08-08',3,8,2003), (10142,'S700_1938',43,'84.0100000',9,3612.43,'2003-08-08 00:00:00','2003-08-16 00:00:00','2003-08-13 00:00:00','Shipped',NULL,124,'2003-08-08',3,8,2003), (10142,'S700_3505',21,'100.0000000',3,2334.99,'2003-08-08 00:00:00','2003-08-16 00:00:00','2003-08-13 00:00:00','Shipped',NULL,124,'2003-08-08',3,8,2003), (10142,'S700_3962',38,'85.4100000',4,3245.58,'2003-08-08 00:00:00','2003-08-16 00:00:00','2003-08-13 00:00:00','Shipped',NULL,124,'2003-08-08',3,8,2003), (10142,'S72_3212',39,'44.2300000',5,1724.97,'2003-08-08 00:00:00','2003-08-16 00:00:00','2003-08-13 00:00:00','Shipped',NULL,124,'2003-08-08',3,8,2003), (10143,'S10_4757',49,'100.0000000',15,5597.76,'2003-08-10 00:00:00','2003-08-18 00:00:00','2003-08-12 00:00:00','Shipped','Can we deliver the new Ford Mustang models by end-of-quarter?',320,'2003-08-10',3,8,2003), (10143,'S18_1662',32,'100.0000000',7,5248,'2003-08-10 00:00:00','2003-08-18 00:00:00','2003-08-12 00:00:00','Shipped','Can we deliver the new Ford Mustang models by end-of-quarter?',320,'2003-08-10',3,8,2003), (10143,'S18_3029',46,'74.8400000',13,3442.64,'2003-08-10 00:00:00','2003-08-18 00:00:00','2003-08-12 00:00:00','Shipped','Can we deliver the new Ford Mustang models by end-of-quarter?',320,'2003-08-10',3,8,2003); INSERT INTO `orderfact` (`ORDERNUMBER`,`PRODUCTCODE`,`QUANTITYORDERED`,`PRICEEACH`,`ORDERLINENUMBER`,`TOTALPRICE`,`ORDERDATE`,`REQUIREDDATE`,`SHIPPEDDATE`,`STATUS`,`COMMENTS`,`CUSTOMERNUMBER`,`TIME_ID`,`QTR_ID`,`MONTH_ID`,`YEAR_ID`) VALUES (10143,'S18_3856',34,'100.0000000',12,3455.76,'2003-08-10 00:00:00','2003-08-18 00:00:00','2003-08-12 00:00:00','Shipped','Can we deliver the new Ford Mustang models by end-of-quarter?',320,'2003-08-10',3,8,2003), (10143,'S24_2841',27,'60.9700000',8,1646.19,'2003-08-10 00:00:00','2003-08-18 00:00:00','2003-08-12 00:00:00','Shipped','Can we deliver the new Ford Mustang models by end-of-quarter?',320,'2003-08-10',3,8,2003), (10143,'S24_3420',33,'77.5900000',9,2560.47,'2003-08-10 00:00:00','2003-08-18 00:00:00','2003-08-12 00:00:00','Shipped','Can we deliver the new Ford Mustang models by end-of-quarter?',320,'2003-08-10',3,8,2003), (10143,'S24_3816',23,'80.5100000',14,1851.73,'2003-08-10 00:00:00','2003-08-18 00:00:00','2003-08-12 00:00:00','Shipped','Can we deliver the new Ford Mustang models by end-of-quarter?',320,'2003-08-10',3,8,2003), (10143,'S24_3949',28,'66.1900000',6,1853.32,'2003-08-10 00:00:00','2003-08-18 00:00:00','2003-08-12 00:00:00','Shipped','Can we deliver the new Ford Mustang models by end-of-quarter?',320,'2003-08-10',3,8,2003), (10143,'S50_1341',34,'36.6600000',1,1246.44,'2003-08-10 00:00:00','2003-08-18 00:00:00','2003-08-12 00:00:00','Shipped','Can we deliver the new Ford Mustang models by end-of-quarter?',320,'2003-08-10',3,8,2003), (10143,'S700_1691',36,'100.0000000',2,3945.96,'2003-08-10 00:00:00','2003-08-18 00:00:00','2003-08-12 00:00:00','Shipped','Can we deliver the new Ford Mustang models by end-of-quarter?',320,'2003-08-10',3,8,2003), (10143,'S700_2047',26,'100.0000000',11,2612.48,'2003-08-10 00:00:00','2003-08-18 00:00:00','2003-08-12 00:00:00','Shipped','Can we deliver the new Ford Mustang models by end-of-quarter?',320,'2003-08-10',3,8,2003), (10143,'S700_2466',26,'82.7700000',4,2152.02,'2003-08-10 00:00:00','2003-08-18 00:00:00','2003-08-12 00:00:00','Shipped','Can we deliver the new Ford Mustang models by end-of-quarter?',320,'2003-08-10',3,8,2003), (10143,'S700_2610',31,'85.2900000',16,2643.99,'2003-08-10 00:00:00','2003-08-18 00:00:00','2003-08-12 00:00:00','Shipped','Can we deliver the new Ford Mustang models by end-of-quarter?',320,'2003-08-10',3,8,2003), (10143,'S700_3167',28,'96.0000000',3,2688,'2003-08-10 00:00:00','2003-08-18 00:00:00','2003-08-12 00:00:00','Shipped','Can we deliver the new Ford Mustang models by end-of-quarter?',320,'2003-08-10',3,8,2003), (10143,'S700_4002',34,'85.8700000',5,2919.58,'2003-08-10 00:00:00','2003-08-18 00:00:00','2003-08-12 00:00:00','Shipped','Can we deliver the new Ford Mustang models by end-of-quarter?',320,'2003-08-10',3,8,2003), (10143,'S72_1253',37,'50.6500000',10,1874.05,'2003-08-10 00:00:00','2003-08-18 00:00:00','2003-08-12 00:00:00','Shipped','Can we deliver the new Ford Mustang models by end-of-quarter?',320,'2003-08-10',3,8,2003), (10144,'S32_4289',20,'81.8600000',1,1637.2,'2003-08-13 00:00:00','2003-08-21 00:00:00','2003-08-14 00:00:00','Shipped',NULL,381,'2003-08-13',3,8,2003), (10145,'S10_1678',45,'83.2600000',6,3746.7,'2003-08-25 00:00:00','2003-09-02 00:00:00','2003-08-31 00:00:00','Shipped',NULL,205,'2003-08-25',3,8,2003), (10145,'S10_2016',37,'100.0000000',9,5192.95,'2003-08-25 00:00:00','2003-09-02 00:00:00','2003-08-31 00:00:00','Shipped',NULL,205,'2003-08-25',3,8,2003), (10145,'S10_4698',33,'100.0000000',8,5176.38,'2003-08-25 00:00:00','2003-09-02 00:00:00','2003-08-31 00:00:00','Shipped',NULL,205,'2003-08-25',3,8,2003), (10145,'S12_2823',49,'100.0000000',5,8339.8,'2003-08-25 00:00:00','2003-09-02 00:00:00','2003-08-31 00:00:00','Shipped',NULL,205,'2003-08-25',3,8,2003), (10145,'S18_2581',30,'85.3200000',14,2559.6,'2003-08-25 00:00:00','2003-09-02 00:00:00','2003-08-31 00:00:00','Shipped',NULL,205,'2003-08-25',3,8,2003), (10145,'S18_2625',30,'49.6700000',10,1490.1,'2003-08-25 00:00:00','2003-09-02 00:00:00','2003-08-31 00:00:00','Shipped',NULL,205,'2003-08-25',3,8,2003), (10145,'S24_1578',43,'95.8000000',7,4119.4,'2003-08-25 00:00:00','2003-09-02 00:00:00','2003-08-31 00:00:00','Shipped',NULL,205,'2003-08-25',3,8,2003), (10145,'S24_1785',40,'87.5400000',16,3501.6,'2003-08-25 00:00:00','2003-09-02 00:00:00','2003-08-31 00:00:00','Shipped',NULL,205,'2003-08-25',3,8,2003), (10145,'S24_2000',47,'83.0300000',11,3902.41,'2003-08-25 00:00:00','2003-09-02 00:00:00','2003-08-31 00:00:00','Shipped',NULL,205,'2003-08-25',3,8,2003), (10145,'S24_2360',27,'60.9500000',3,1645.65,'2003-08-25 00:00:00','2003-09-02 00:00:00','2003-08-31 00:00:00','Shipped',NULL,205,'2003-08-25',3,8,2003), (10145,'S24_4278',33,'84.7700000',15,2797.41,'2003-08-25 00:00:00','2003-09-02 00:00:00','2003-08-31 00:00:00','Shipped',NULL,205,'2003-08-25',3,8,2003), (10145,'S32_1374',33,'93.9000000',12,3098.7,'2003-08-25 00:00:00','2003-09-02 00:00:00','2003-08-31 00:00:00','Shipped',NULL,205,'2003-08-25',3,8,2003), (10145,'S32_2206',31,'35.8000000',1,1109.8,'2003-08-25 00:00:00','2003-09-02 00:00:00','2003-08-31 00:00:00','Shipped',NULL,205,'2003-08-25',3,8,2003), (10145,'S32_4485',27,'100.0000000',4,3251.34,'2003-08-25 00:00:00','2003-09-02 00:00:00','2003-08-31 00:00:00','Shipped',NULL,205,'2003-08-25',3,8,2003), (10145,'S50_4713',38,'81.3600000',2,3091.68,'2003-08-25 00:00:00','2003-09-02 00:00:00','2003-08-31 00:00:00','Shipped',NULL,205,'2003-08-25',3,8,2003), (10145,'S700_2834',20,'100.0000000',13,2752.6,'2003-08-25 00:00:00','2003-09-02 00:00:00','2003-08-31 00:00:00','Shipped',NULL,205,'2003-08-25',3,8,2003), (10146,'S18_3782',47,'67.1400000',2,3155.58,'2003-09-03 00:00:00','2003-09-13 00:00:00','2003-09-06 00:00:00','Shipped',NULL,447,'2003-09-03',3,9,2003), (10146,'S18_4721',29,'100.0000000',1,4444.54,'2003-09-03 00:00:00','2003-09-13 00:00:00','2003-09-06 00:00:00','Shipped',NULL,447,'2003-09-03',3,9,2003), (10147,'S12_1099',48,'100.0000000',7,9245.76,'2003-09-05 00:00:00','2003-09-12 00:00:00','2003-09-09 00:00:00','Shipped',NULL,379,'2003-09-05',3,9,2003), (10147,'S12_3380',31,'100.0000000',5,3494.94,'2003-09-05 00:00:00','2003-09-12 00:00:00','2003-09-09 00:00:00','Shipped',NULL,379,'2003-09-05',3,9,2003), (10147,'S12_3990',21,'63.8400000',8,1340.64,'2003-09-05 00:00:00','2003-09-12 00:00:00','2003-09-09 00:00:00','Shipped',NULL,379,'2003-09-05',3,9,2003), (10147,'S12_4675',33,'97.8900000',4,3230.37,'2003-09-05 00:00:00','2003-09-12 00:00:00','2003-09-09 00:00:00','Shipped',NULL,379,'2003-09-05',3,9,2003), (10147,'S18_1889',26,'82.3900000',3,2142.14,'2003-09-05 00:00:00','2003-09-12 00:00:00','2003-09-09 00:00:00','Shipped',NULL,379,'2003-09-05',3,9,2003), (10147,'S18_3278',36,'86.0400000',10,3097.44,'2003-09-05 00:00:00','2003-09-12 00:00:00','2003-09-09 00:00:00','Shipped',NULL,379,'2003-09-05',3,9,2003), (10147,'S18_3482',37,'100.0000000',9,4405.22,'2003-09-05 00:00:00','2003-09-12 00:00:00','2003-09-09 00:00:00','Shipped',NULL,379,'2003-09-05',3,9,2003), (10147,'S24_2972',25,'42.6700000',1,1066.75,'2003-09-05 00:00:00','2003-09-12 00:00:00','2003-09-09 00:00:00','Shipped',NULL,379,'2003-09-05',3,9,2003), (10147,'S24_3371',30,'68.5800000',6,2057.4,'2003-09-05 00:00:00','2003-09-12 00:00:00','2003-09-09 00:00:00','Shipped',NULL,379,'2003-09-05',3,9,2003), (10147,'S24_3856',23,'100.0000000',2,2906.97,'2003-09-05 00:00:00','2003-09-12 00:00:00','2003-09-09 00:00:00','Shipped',NULL,379,'2003-09-05',3,9,2003), (10147,'S24_4620',31,'64.6700000',11,2004.77,'2003-09-05 00:00:00','2003-09-12 00:00:00','2003-09-09 00:00:00','Shipped',NULL,379,'2003-09-05',3,9,2003), (10148,'S18_1129',23,'100.0000000',13,2702.04,'2003-09-11 00:00:00','2003-09-21 00:00:00','2003-09-15 00:00:00','Shipped','They want to reevaluate their terms agreement with Finance.',276,'2003-09-11',3,9,2003), (10148,'S18_1589',47,'100.0000000',9,5848.68,'2003-09-11 00:00:00','2003-09-21 00:00:00','2003-09-15 00:00:00','Shipped','They want to reevaluate their terms agreement with Finance.',276,'2003-09-11',3,9,2003), (10148,'S18_1984',25,'100.0000000',12,4232,'2003-09-11 00:00:00','2003-09-21 00:00:00','2003-09-15 00:00:00','Shipped','They want to reevaluate their terms agreement with Finance.',276,'2003-09-11',3,9,2003), (10148,'S18_2870',27,'100.0000000',10,3528.36,'2003-09-11 00:00:00','2003-09-21 00:00:00','2003-09-15 00:00:00','Shipped','They want to reevaluate their terms agreement with Finance.',276,'2003-09-11',3,9,2003), (10148,'S18_3232',32,'100.0000000',14,5418.88,'2003-09-11 00:00:00','2003-09-21 00:00:00','2003-09-15 00:00:00','Shipped','They want to reevaluate their terms agreement with Finance.',276,'2003-09-11',3,9,2003), (10148,'S18_3685',28,'100.0000000',11,3639.44,'2003-09-11 00:00:00','2003-09-21 00:00:00','2003-09-15 00:00:00','Shipped','They want to reevaluate their terms agreement with Finance.',276,'2003-09-11',3,9,2003), (10148,'S18_4409',34,'100.0000000',1,3598.22,'2003-09-11 00:00:00','2003-09-21 00:00:00','2003-09-15 00:00:00','Shipped','They want to reevaluate their terms agreement with Finance.',276,'2003-09-11',3,9,2003), (10148,'S18_4933',29,'81.2500000',2,2356.25,'2003-09-11 00:00:00','2003-09-21 00:00:00','2003-09-15 00:00:00','Shipped','They want to reevaluate their terms agreement with Finance.',276,'2003-09-11',3,9,2003), (10148,'S24_1046',25,'60.2600000',6,1506.5,'2003-09-11 00:00:00','2003-09-21 00:00:00','2003-09-15 00:00:00','Shipped','They want to reevaluate their terms agreement with Finance.',276,'2003-09-11',3,9,2003), (10148,'S24_1628',47,'56.8500000',8,2671.95,'2003-09-11 00:00:00','2003-09-21 00:00:00','2003-09-15 00:00:00','Shipped','They want to reevaluate their terms agreement with Finance.',276,'2003-09-11',3,9,2003), (10148,'S24_2766',21,'73.6000000',4,1545.6,'2003-09-11 00:00:00','2003-09-21 00:00:00','2003-09-15 00:00:00','Shipped','They want to reevaluate their terms agreement with Finance.',276,'2003-09-11',3,9,2003), (10148,'S24_2887',34,'100.0000000',3,4392.12,'2003-09-11 00:00:00','2003-09-21 00:00:00','2003-09-15 00:00:00','Shipped','They want to reevaluate their terms agreement with Finance.',276,'2003-09-11',3,9,2003), (10148,'S24_3191',31,'73.6200000',5,2282.22,'2003-09-11 00:00:00','2003-09-21 00:00:00','2003-09-15 00:00:00','Shipped','They want to reevaluate their terms agreement with Finance.',276,'2003-09-11',3,9,2003), (10148,'S24_3432',27,'100.0000000',7,3469.5,'2003-09-11 00:00:00','2003-09-21 00:00:00','2003-09-15 00:00:00','Shipped','They want to reevaluate their terms agreement with Finance.',276,'2003-09-11',3,9,2003), (10149,'S18_1342',50,'100.0000000',4,5907.5,'2003-09-12 00:00:00','2003-09-18 00:00:00','2003-09-17 00:00:00','Shipped',NULL,487,'2003-09-12',3,9,2003), (10149,'S18_1367',30,'58.2200000',3,1746.6,'2003-09-12 00:00:00','2003-09-18 00:00:00','2003-09-17 00:00:00','Shipped',NULL,487,'2003-09-12',3,9,2003), (10149,'S18_1749',34,'100.0000000',11,5375.4,'2003-09-12 00:00:00','2003-09-18 00:00:00','2003-09-17 00:00:00','Shipped',NULL,487,'2003-09-12',3,9,2003), (10149,'S18_2248',24,'62.3600000',10,1496.64,'2003-09-12 00:00:00','2003-09-18 00:00:00','2003-09-17 00:00:00','Shipped',NULL,487,'2003-09-12',3,9,2003), (10149,'S18_2325',33,'100.0000000',8,4950.33,'2003-09-12 00:00:00','2003-09-18 00:00:00','2003-09-17 00:00:00','Shipped',NULL,487,'2003-09-12',3,9,2003), (10149,'S18_2795',23,'100.0000000',5,4230.62,'2003-09-12 00:00:00','2003-09-18 00:00:00','2003-09-17 00:00:00','Shipped',NULL,487,'2003-09-12',3,9,2003), (10149,'S18_3320',42,'94.2500000',2,3958.5,'2003-09-12 00:00:00','2003-09-18 00:00:00','2003-09-17 00:00:00','Shipped',NULL,487,'2003-09-12',3,9,2003), (10149,'S24_1937',36,'33.1900000',7,1194.84,'2003-09-12 00:00:00','2003-09-18 00:00:00','2003-09-17 00:00:00','Shipped',NULL,487,'2003-09-12',3,9,2003), (10149,'S24_2022',49,'49.2800000',6,2414.72,'2003-09-12 00:00:00','2003-09-18 00:00:00','2003-09-17 00:00:00','Shipped',NULL,487,'2003-09-12',3,9,2003), (10149,'S24_3969',26,'38.9800000',9,1013.48,'2003-09-12 00:00:00','2003-09-18 00:00:00','2003-09-17 00:00:00','Shipped',NULL,487,'2003-09-12',3,9,2003), (10149,'S24_4258',20,'90.5700000',1,1811.4,'2003-09-12 00:00:00','2003-09-18 00:00:00','2003-09-17 00:00:00','Shipped',NULL,487,'2003-09-12',3,9,2003), (10150,'S10_1949',45,'100.0000000',8,10993.5,'2003-09-19 00:00:00','2003-09-27 00:00:00','2003-09-21 00:00:00','Shipped','They want to reevaluate their terms agreement with Finance.',148,'2003-09-19',3,9,2003), (10150,'S10_4962',20,'100.0000000',1,3191.2,'2003-09-19 00:00:00','2003-09-27 00:00:00','2003-09-21 00:00:00','Shipped','They want to reevaluate their terms agreement with Finance.',148,'2003-09-19',3,9,2003), (10150,'S12_1666',30,'100.0000000',5,4100.1,'2003-09-19 00:00:00','2003-09-27 00:00:00','2003-09-21 00:00:00','Shipped','They want to reevaluate their terms agreement with Finance.',148,'2003-09-19',3,9,2003), (10150,'S18_1097',34,'100.0000000',7,4641,'2003-09-19 00:00:00','2003-09-27 00:00:00','2003-09-21 00:00:00','Shipped','They want to reevaluate their terms agreement with Finance.',148,'2003-09-19',3,9,2003), (10150,'S18_2949',47,'91.1800000',9,4285.46,'2003-09-19 00:00:00','2003-09-27 00:00:00','2003-09-21 00:00:00','Shipped','They want to reevaluate their terms agreement with Finance.',148,'2003-09-19',3,9,2003), (10150,'S18_2957',30,'49.9700000',11,1499.1,'2003-09-19 00:00:00','2003-09-27 00:00:00','2003-09-21 00:00:00','Shipped','They want to reevaluate their terms agreement with Finance.',148,'2003-09-19',3,9,2003), (10150,'S18_3136',26,'100.0000000',10,2804.36,'2003-09-19 00:00:00','2003-09-27 00:00:00','2003-09-21 00:00:00','Shipped','They want to reevaluate their terms agreement with Finance.',148,'2003-09-19',3,9,2003), (10150,'S18_4600',49,'100.0000000',2,6467.02,'2003-09-19 00:00:00','2003-09-27 00:00:00','2003-09-21 00:00:00','Shipped','They want to reevaluate their terms agreement with Finance.',148,'2003-09-19',3,9,2003), (10150,'S18_4668',30,'42.7600000',6,1282.8,'2003-09-19 00:00:00','2003-09-27 00:00:00','2003-09-21 00:00:00','Shipped','They want to reevaluate their terms agreement with Finance.',148,'2003-09-19',3,9,2003), (10150,'S32_3522',49,'58.1800000',4,2850.82,'2003-09-19 00:00:00','2003-09-27 00:00:00','2003-09-21 00:00:00','Shipped','They want to reevaluate their terms agreement with Finance.',148,'2003-09-19',3,9,2003), (10150,'S700_2824',20,'100.0000000',3,2104,'2003-09-19 00:00:00','2003-09-27 00:00:00','2003-09-21 00:00:00','Shipped','They want to reevaluate their terms agreement with Finance.',148,'2003-09-19',3,9,2003), (10151,'S12_4473',24,'100.0000000',3,3327.6,'2003-09-21 00:00:00','2003-09-30 00:00:00','2003-09-24 00:00:00','Shipped',NULL,311,'2003-09-21',3,9,2003), (10151,'S18_2238',43,'100.0000000',2,7110.91,'2003-09-21 00:00:00','2003-09-30 00:00:00','2003-09-24 00:00:00','Shipped',NULL,311,'2003-09-21',3,9,2003), (10151,'S18_2319',49,'100.0000000',6,5412.54,'2003-09-21 00:00:00','2003-09-30 00:00:00','2003-09-24 00:00:00','Shipped',NULL,311,'2003-09-21',3,9,2003), (10151,'S18_2432',39,'69.2800000',9,2701.92,'2003-09-21 00:00:00','2003-09-30 00:00:00','2003-09-24 00:00:00','Shipped',NULL,311,'2003-09-21',3,9,2003), (10151,'S18_3232',21,'100.0000000',7,3734.01,'2003-09-21 00:00:00','2003-09-30 00:00:00','2003-09-24 00:00:00','Shipped',NULL,311,'2003-09-21',3,9,2003), (10151,'S24_2300',42,'100.0000000',8,5098.8,'2003-09-21 00:00:00','2003-09-30 00:00:00','2003-09-24 00:00:00','Shipped',NULL,311,'2003-09-21',3,9,2003), (10151,'S24_2840',30,'40.3100000',4,1209.3,'2003-09-21 00:00:00','2003-09-30 00:00:00','2003-09-24 00:00:00','Shipped',NULL,311,'2003-09-21',3,9,2003), (10151,'S32_1268',27,'100.0000000',10,3068.55,'2003-09-21 00:00:00','2003-09-30 00:00:00','2003-09-24 00:00:00','Shipped',NULL,311,'2003-09-21',3,9,2003), (10151,'S32_2509',41,'63.8500000',5,2617.85,'2003-09-21 00:00:00','2003-09-30 00:00:00','2003-09-24 00:00:00','Shipped',NULL,311,'2003-09-21',3,9,2003), (10151,'S50_1392',26,'100.0000000',1,3220.1,'2003-09-21 00:00:00','2003-09-30 00:00:00','2003-09-24 00:00:00','Shipped',NULL,311,'2003-09-21',3,9,2003), (10152,'S18_4027',35,'100.0000000',1,4524.1,'2003-09-25 00:00:00','2003-10-03 00:00:00','2003-10-01 00:00:00','Shipped',NULL,333,'2003-09-25',3,9,2003), (10152,'S24_1444',25,'65.3100000',4,1632.75,'2003-09-25 00:00:00','2003-10-03 00:00:00','2003-10-01 00:00:00','Shipped',NULL,333,'2003-09-25',3,9,2003), (10152,'S24_4048',23,'100.0000000',3,2802.09,'2003-09-25 00:00:00','2003-10-03 00:00:00','2003-10-01 00:00:00','Shipped',NULL,333,'2003-09-25',3,9,2003), (10152,'S32_3207',33,'50.9500000',2,1681.35,'2003-09-25 00:00:00','2003-10-03 00:00:00','2003-10-01 00:00:00','Shipped',NULL,333,'2003-09-25',3,9,2003), (10153,'S12_1108',20,'100.0000000',11,4904,'2003-09-28 00:00:00','2003-10-05 00:00:00','2003-10-03 00:00:00','Shipped',NULL,141,'2003-09-28',3,9,2003), (10153,'S12_3148',42,'100.0000000',12,5393.64,'2003-09-28 00:00:00','2003-10-05 00:00:00','2003-10-03 00:00:00','Shipped',NULL,141,'2003-09-28',3,9,2003), (10153,'S12_3891',49,'100.0000000',10,7036.89,'2003-09-28 00:00:00','2003-10-05 00:00:00','2003-10-03 00:00:00','Shipped',NULL,141,'2003-09-28',3,9,2003), (10153,'S18_3140',31,'100.0000000',7,3641.57,'2003-09-28 00:00:00','2003-10-05 00:00:00','2003-10-03 00:00:00','Shipped',NULL,141,'2003-09-28',3,9,2003), (10153,'S18_3259',29,'88.7400000',9,2573.46,'2003-09-28 00:00:00','2003-10-05 00:00:00','2003-10-03 00:00:00','Shipped',NULL,141,'2003-09-28',3,9,2003), (10153,'S18_4522',22,'83.3800000',6,1834.36,'2003-09-28 00:00:00','2003-10-05 00:00:00','2003-10-03 00:00:00','Shipped',NULL,141,'2003-09-28',3,9,2003), (10153,'S24_2011',40,'100.0000000',5,5456.4,'2003-09-28 00:00:00','2003-10-05 00:00:00','2003-10-03 00:00:00','Shipped',NULL,141,'2003-09-28',3,9,2003), (10153,'S50_1514',31,'57.4100000',13,1779.71,'2003-09-28 00:00:00','2003-10-05 00:00:00','2003-10-03 00:00:00','Shipped',NULL,141,'2003-09-28',3,9,2003), (10153,'S700_1138',43,'64.6700000',1,2780.81,'2003-09-28 00:00:00','2003-10-05 00:00:00','2003-10-03 00:00:00','Shipped',NULL,141,'2003-09-28',3,9,2003), (10153,'S700_1938',31,'87.4800000',8,2711.88,'2003-09-28 00:00:00','2003-10-05 00:00:00','2003-10-03 00:00:00','Shipped',NULL,141,'2003-09-28',3,9,2003), (10153,'S700_3505',50,'88.1500000',2,4407.5,'2003-09-28 00:00:00','2003-10-05 00:00:00','2003-10-03 00:00:00','Shipped',NULL,141,'2003-09-28',3,9,2003), (10153,'S700_3962',20,'100.0000000',3,2204.6,'2003-09-28 00:00:00','2003-10-05 00:00:00','2003-10-03 00:00:00','Shipped',NULL,141,'2003-09-28',3,9,2003), (10153,'S72_3212',50,'60.0600000',4,3003,'2003-09-28 00:00:00','2003-10-05 00:00:00','2003-10-03 00:00:00','Shipped',NULL,141,'2003-09-28',3,9,2003), (10154,'S24_3151',31,'91.1700000',2,2826.27,'2003-10-02 00:00:00','2003-10-12 00:00:00','2003-10-08 00:00:00','Shipped',NULL,219,'2003-10-02',4,10,2003), (10154,'S700_2610',36,'64.3300000',1,2315.88,'2003-10-02 00:00:00','2003-10-12 00:00:00','2003-10-08 00:00:00','Shipped',NULL,219,'2003-10-02',4,10,2003), (10155,'S10_4757',32,'100.0000000',13,4526.08,'2003-10-06 00:00:00','2003-10-13 00:00:00','2003-10-07 00:00:00','Shipped',NULL,186,'2003-10-06',4,10,2003), (10155,'S18_1662',38,'100.0000000',5,6531.44,'2003-10-06 00:00:00','2003-10-13 00:00:00','2003-10-07 00:00:00','Shipped',NULL,186,'2003-10-06',4,10,2003), (10155,'S18_3029',44,'79.1400000',11,3482.16,'2003-10-06 00:00:00','2003-10-13 00:00:00','2003-10-07 00:00:00','Shipped',NULL,186,'2003-10-06',4,10,2003), (10155,'S18_3856',29,'100.0000000',10,3622.97,'2003-10-06 00:00:00','2003-10-13 00:00:00','2003-10-07 00:00:00','Shipped',NULL,186,'2003-10-06',4,10,2003), (10155,'S24_2841',23,'72.6200000',6,1670.26,'2003-10-06 00:00:00','2003-10-13 00:00:00','2003-10-07 00:00:00','Shipped',NULL,186,'2003-10-06',4,10,2003), (10155,'S24_3420',34,'55.8900000',7,1900.26,'2003-10-06 00:00:00','2003-10-13 00:00:00','2003-10-07 00:00:00','Shipped',NULL,186,'2003-10-06',4,10,2003), (10155,'S24_3816',37,'67.9300000',12,2513.41,'2003-10-06 00:00:00','2003-10-13 00:00:00','2003-10-07 00:00:00','Shipped',NULL,186,'2003-10-06',4,10,2003), (10155,'S24_3949',44,'77.1100000',4,3392.84,'2003-10-06 00:00:00','2003-10-13 00:00:00','2003-10-07 00:00:00','Shipped',NULL,186,'2003-10-06',4,10,2003), (10155,'S700_2047',32,'91.4300000',9,2925.76,'2003-10-06 00:00:00','2003-10-13 00:00:00','2003-10-07 00:00:00','Shipped',NULL,186,'2003-10-06',4,10,2003), (10155,'S700_2466',20,'100.0000000',2,2353.4,'2003-10-06 00:00:00','2003-10-13 00:00:00','2003-10-07 00:00:00','Shipped',NULL,186,'2003-10-06',4,10,2003), (10155,'S700_3167',43,'86.4000000',1,3715.2,'2003-10-06 00:00:00','2003-10-13 00:00:00','2003-10-07 00:00:00','Shipped',NULL,186,'2003-10-06',4,10,2003), (10155,'S700_4002',44,'85.8700000',3,3778.28,'2003-10-06 00:00:00','2003-10-13 00:00:00','2003-10-07 00:00:00','Shipped',NULL,186,'2003-10-06',4,10,2003), (10155,'S72_1253',34,'49.1600000',8,1671.44,'2003-10-06 00:00:00','2003-10-13 00:00:00','2003-10-07 00:00:00','Shipped',NULL,186,'2003-10-06',4,10,2003), (10156,'S50_1341',20,'41.0200000',1,820.4,'2003-10-08 00:00:00','2003-10-17 00:00:00','2003-10-11 00:00:00','Shipped',NULL,141,'2003-10-08',4,10,2003), (10156,'S700_1691',48,'100.0000000',2,4954.08,'2003-10-08 00:00:00','2003-10-17 00:00:00','2003-10-11 00:00:00','Shipped',NULL,141,'2003-10-08',4,10,2003), (10157,'S18_2581',33,'78.5700000',3,2592.81,'2003-10-09 00:00:00','2003-10-15 00:00:00','2003-10-14 00:00:00','Shipped',NULL,473,'2003-10-09',4,10,2003), (10157,'S24_1785',40,'100.0000000',5,4114,'2003-10-09 00:00:00','2003-10-15 00:00:00','2003-10-14 00:00:00','Shipped',NULL,473,'2003-10-09',4,10,2003), (10157,'S24_4278',33,'86.2200000',4,2845.26,'2003-10-09 00:00:00','2003-10-15 00:00:00','2003-10-14 00:00:00','Shipped',NULL,473,'2003-10-09',4,10,2003), (10157,'S32_1374',34,'100.0000000',1,4041.58,'2003-10-09 00:00:00','2003-10-15 00:00:00','2003-10-14 00:00:00','Shipped',NULL,473,'2003-10-09',4,10,2003), (10157,'S32_4289',28,'74.9800000',6,2099.44,'2003-10-09 00:00:00','2003-10-15 00:00:00','2003-10-14 00:00:00','Shipped',NULL,473,'2003-10-09',4,10,2003), (10157,'S700_2834',48,'100.0000000',2,5979.84,'2003-10-09 00:00:00','2003-10-15 00:00:00','2003-10-14 00:00:00','Shipped',NULL,473,'2003-10-09',4,10,2003), (10158,'S24_2000',22,'67.0300000',1,1474.66,'2003-10-10 00:00:00','2003-10-18 00:00:00','2003-10-15 00:00:00','Shipped',NULL,121,'2003-10-10',4,10,2003), (10159,'S10_1678',49,'100.0000000',14,5205.27,'2003-10-10 00:00:00','2003-10-19 00:00:00','2003-10-16 00:00:00','Shipped',NULL,321,'2003-10-10',4,10,2003), (10159,'S10_2016',37,'100.0000000',17,5016.83,'2003-10-10 00:00:00','2003-10-19 00:00:00','2003-10-16 00:00:00','Shipped',NULL,321,'2003-10-10',4,10,2003), (10159,'S10_4698',22,'100.0000000',16,4132.7,'2003-10-10 00:00:00','2003-10-19 00:00:00','2003-10-16 00:00:00','Shipped',NULL,321,'2003-10-10',4,10,2003), (10159,'S12_1099',41,'100.0000000',2,8296.35,'2003-10-10 00:00:00','2003-10-19 00:00:00','2003-10-16 00:00:00','Shipped',NULL,321,'2003-10-10',4,10,2003), (10159,'S12_2823',38,'100.0000000',13,6238.84,'2003-10-10 00:00:00','2003-10-19 00:00:00','2003-10-16 00:00:00','Shipped',NULL,321,'2003-10-10',4,10,2003), (10159,'S12_3990',24,'73.4200000',3,1762.08,'2003-10-10 00:00:00','2003-10-19 00:00:00','2003-10-16 00:00:00','Shipped',NULL,321,'2003-10-10',4,10,2003), (10159,'S18_2625',42,'51.4800000',18,2162.16,'2003-10-10 00:00:00','2003-10-19 00:00:00','2003-10-16 00:00:00','Shipped',NULL,321,'2003-10-10',4,10,2003), (10159,'S18_3278',21,'81.2100000',5,1705.41,'2003-10-10 00:00:00','2003-10-19 00:00:00','2003-10-16 00:00:00','Shipped',NULL,321,'2003-10-10',4,10,2003), (10159,'S18_3482',25,'100.0000000',4,3638,'2003-10-10 00:00:00','2003-10-19 00:00:00','2003-10-16 00:00:00','Shipped',NULL,321,'2003-10-10',4,10,2003), (10159,'S18_3782',21,'64.6600000',8,1357.86,'2003-10-10 00:00:00','2003-10-19 00:00:00','2003-10-16 00:00:00','Shipped',NULL,321,'2003-10-10',4,10,2003), (10159,'S18_4721',32,'100.0000000',7,4618.88,'2003-10-10 00:00:00','2003-10-19 00:00:00','2003-10-16 00:00:00','Shipped',NULL,321,'2003-10-10',4,10,2003), (10159,'S24_1578',44,'100.0000000',15,5355.68,'2003-10-10 00:00:00','2003-10-19 00:00:00','2003-10-16 00:00:00','Shipped',NULL,321,'2003-10-10',4,10,2003), (10159,'S24_2360',27,'80.3400000',11,2169.18,'2003-10-10 00:00:00','2003-10-19 00:00:00','2003-10-16 00:00:00','Shipped',NULL,321,'2003-10-10',4,10,2003), (10159,'S24_3371',50,'69.8000000',1,3490,'2003-10-10 00:00:00','2003-10-19 00:00:00','2003-10-16 00:00:00','Shipped',NULL,321,'2003-10-10',4,10,2003), (10159,'S24_4620',23,'67.1000000',6,1543.3,'2003-10-10 00:00:00','2003-10-19 00:00:00','2003-10-16 00:00:00','Shipped',NULL,321,'2003-10-10',4,10,2003), (10159,'S32_2206',35,'35.4000000',9,1239,'2003-10-10 00:00:00','2003-10-19 00:00:00','2003-10-16 00:00:00','Shipped',NULL,321,'2003-10-10',4,10,2003), (10159,'S32_4485',23,'100.0000000',12,2347.15,'2003-10-10 00:00:00','2003-10-19 00:00:00','2003-10-16 00:00:00','Shipped',NULL,321,'2003-10-10',4,10,2003), (10159,'S50_4713',31,'71.6000000',10,2219.6,'2003-10-10 00:00:00','2003-10-19 00:00:00','2003-10-16 00:00:00','Shipped',NULL,321,'2003-10-10',4,10,2003), (10160,'S12_3380',46,'100.0000000',6,5294.14,'2003-10-11 00:00:00','2003-10-17 00:00:00','2003-10-17 00:00:00','Shipped',NULL,347,'2003-10-11',4,10,2003), (10160,'S12_4675',50,'100.0000000',5,5182,'2003-10-11 00:00:00','2003-10-17 00:00:00','2003-10-17 00:00:00','Shipped',NULL,347,'2003-10-11',4,10,2003), (10160,'S18_1889',38,'88.5500000',4,3364.9,'2003-10-11 00:00:00','2003-10-17 00:00:00','2003-10-17 00:00:00','Shipped',NULL,347,'2003-10-11',4,10,2003), (10160,'S18_3232',20,'100.0000000',1,3996.4,'2003-10-11 00:00:00','2003-10-17 00:00:00','2003-10-17 00:00:00','Shipped',NULL,347,'2003-10-11',4,10,2003), (10160,'S24_2972',42,'37.0000000',2,1554,'2003-10-11 00:00:00','2003-10-17 00:00:00','2003-10-17 00:00:00','Shipped',NULL,347,'2003-10-11',4,10,2003), (10160,'S24_3856',35,'100.0000000',3,4767.7,'2003-10-11 00:00:00','2003-10-17 00:00:00','2003-10-17 00:00:00','Shipped',NULL,347,'2003-10-11',4,10,2003), (10161,'S18_1129',28,'100.0000000',12,3764.88,'2003-10-17 00:00:00','2003-10-25 00:00:00','2003-10-20 00:00:00','Shipped',NULL,227,'2003-10-17',4,10,2003), (10161,'S18_1589',43,'100.0000000',8,6153.73,'2003-10-17 00:00:00','2003-10-25 00:00:00','2003-10-20 00:00:00','Shipped',NULL,227,'2003-10-17',4,10,2003), (10161,'S18_1984',48,'100.0000000',11,6145.44,'2003-10-17 00:00:00','2003-10-25 00:00:00','2003-10-20 00:00:00','Shipped',NULL,227,'2003-10-17',4,10,2003), (10161,'S18_2870',23,'100.0000000',9,3187.8,'2003-10-17 00:00:00','2003-10-25 00:00:00','2003-10-20 00:00:00','Shipped',NULL,227,'2003-10-17',4,10,2003), (10161,'S18_3685',36,'100.0000000',10,5544,'2003-10-17 00:00:00','2003-10-25 00:00:00','2003-10-20 00:00:00','Shipped',NULL,227,'2003-10-17',4,10,2003), (10161,'S18_4933',25,'80.5400000',1,2013.5,'2003-10-17 00:00:00','2003-10-25 00:00:00','2003-10-20 00:00:00','Shipped',NULL,227,'2003-10-17',4,10,2003), (10161,'S24_1046',37,'72.7600000',5,2692.12,'2003-10-17 00:00:00','2003-10-25 00:00:00','2003-10-20 00:00:00','Shipped',NULL,227,'2003-10-17',4,10,2003), (10161,'S24_1628',23,'53.3300000',7,1226.59,'2003-10-17 00:00:00','2003-10-25 00:00:00','2003-10-20 00:00:00','Shipped',NULL,227,'2003-10-17',4,10,2003), (10161,'S24_2766',20,'100.0000000',3,2144.6,'2003-10-17 00:00:00','2003-10-25 00:00:00','2003-10-20 00:00:00','Shipped',NULL,227,'2003-10-17',4,10,2003), (10161,'S24_2887',25,'100.0000000',2,2759.75,'2003-10-17 00:00:00','2003-10-25 00:00:00','2003-10-20 00:00:00','Shipped',NULL,227,'2003-10-17',4,10,2003), (10161,'S24_3191',20,'77.0500000',4,1541,'2003-10-17 00:00:00','2003-10-25 00:00:00','2003-10-20 00:00:00','Shipped',NULL,227,'2003-10-17',4,10,2003), (10161,'S24_3432',30,'100.0000000',6,3148.2,'2003-10-17 00:00:00','2003-10-25 00:00:00','2003-10-20 00:00:00','Shipped',NULL,227,'2003-10-17',4,10,2003), (10162,'S18_1342',48,'91.4400000',2,4389.12,'2003-10-18 00:00:00','2003-10-26 00:00:00','2003-10-19 00:00:00','Shipped',NULL,321,'2003-10-18',4,10,2003), (10162,'S18_1367',45,'51.2100000',1,2304.45,'2003-10-18 00:00:00','2003-10-26 00:00:00','2003-10-19 00:00:00','Shipped',NULL,321,'2003-10-18',4,10,2003), (10162,'S18_1749',29,'100.0000000',9,5176.5,'2003-10-18 00:00:00','2003-10-26 00:00:00','2003-10-19 00:00:00','Shipped',NULL,321,'2003-10-18',4,10,2003), (10162,'S18_2248',27,'69.6200000',8,1879.74,'2003-10-18 00:00:00','2003-10-26 00:00:00','2003-10-19 00:00:00','Shipped',NULL,321,'2003-10-18',4,10,2003), (10162,'S18_2325',38,'100.0000000',6,4299.7,'2003-10-18 00:00:00','2003-10-26 00:00:00','2003-10-19 00:00:00','Shipped',NULL,321,'2003-10-18',4,10,2003), (10162,'S18_2795',48,'100.0000000',3,7209.12,'2003-10-18 00:00:00','2003-10-26 00:00:00','2003-10-19 00:00:00','Shipped',NULL,321,'2003-10-18',4,10,2003), (10162,'S18_4409',39,'100.0000000',10,3912.09,'2003-10-18 00:00:00','2003-10-26 00:00:00','2003-10-19 00:00:00','Shipped',NULL,321,'2003-10-18',4,10,2003), (10162,'S24_1937',37,'27.2200000',5,1007.14,'2003-10-18 00:00:00','2003-10-26 00:00:00','2003-10-19 00:00:00','Shipped',NULL,321,'2003-10-18',4,10,2003), (10162,'S24_2022',43,'36.2900000',4,1560.47,'2003-10-18 00:00:00','2003-10-26 00:00:00','2003-10-19 00:00:00','Shipped',NULL,321,'2003-10-18',4,10,2003), (10162,'S24_3969',37,'38.9800000',7,1442.26,'2003-10-18 00:00:00','2003-10-26 00:00:00','2003-10-19 00:00:00','Shipped',NULL,321,'2003-10-18',4,10,2003), (10163,'S10_1949',21,'100.0000000',1,4860.24,'2003-10-20 00:00:00','2003-10-27 00:00:00','2003-10-24 00:00:00','Shipped',NULL,424,'2003-10-20',4,10,2003), (10163,'S18_2949',31,'100.0000000',2,3329.09,'2003-10-20 00:00:00','2003-10-27 00:00:00','2003-10-24 00:00:00','Shipped',NULL,424,'2003-10-20',4,10,2003), (10163,'S18_2957',48,'69.9600000',4,3358.08,'2003-10-20 00:00:00','2003-10-27 00:00:00','2003-10-24 00:00:00','Shipped',NULL,424,'2003-10-20',4,10,2003), (10163,'S18_3136',40,'100.0000000',3,4900.8,'2003-10-20 00:00:00','2003-10-27 00:00:00','2003-10-24 00:00:00','Shipped',NULL,424,'2003-10-20',4,10,2003), (10163,'S18_3320',43,'100.0000000',6,4991.44,'2003-10-20 00:00:00','2003-10-27 00:00:00','2003-10-24 00:00:00','Shipped',NULL,424,'2003-10-20',4,10,2003), (10163,'S24_4258',42,'91.5500000',5,3845.1,'2003-10-20 00:00:00','2003-10-27 00:00:00','2003-10-24 00:00:00','Shipped',NULL,424,'2003-10-20',4,10,2003), (10164,'S10_4962',21,'100.0000000',2,3536.82,'2003-10-21 00:00:00','2003-10-30 00:00:00','2003-10-23 00:00:00','Resolved','This order was disputed, but resolved on 11/1/2003; Customer doesn\'t like the colors and precision of the models.',452,'2003-10-21',4,10,2003), (10164,'S12_1666',49,'100.0000000',6,6563.06,'2003-10-21 00:00:00','2003-10-30 00:00:00','2003-10-23 00:00:00','Resolved','This order was disputed, but resolved on 11/1/2003; Customer doesn\'t like the colors and precision of the models.',452,'2003-10-21',4,10,2003), (10164,'S18_1097',36,'99.1700000',8,3570.12,'2003-10-21 00:00:00','2003-10-30 00:00:00','2003-10-23 00:00:00','Resolved','This order was disputed, but resolved on 11/1/2003; Customer doesn\'t like the colors and precision of the models.',452,'2003-10-21',4,10,2003), (10164,'S18_4600',45,'100.0000000',3,5012.55,'2003-10-21 00:00:00','2003-10-30 00:00:00','2003-10-23 00:00:00','Resolved','This order was disputed, but resolved on 11/1/2003; Customer doesn\'t like the colors and precision of the models.',452,'2003-10-21',4,10,2003), (10164,'S18_4668',25,'53.8300000',7,1345.75,'2003-10-21 00:00:00','2003-10-30 00:00:00','2003-10-23 00:00:00','Resolved','This order was disputed, but resolved on 11/1/2003; Customer doesn\'t like the colors and precision of the models.',452,'2003-10-21',4,10,2003), (10164,'S32_1268',24,'100.0000000',1,2634.96,'2003-10-21 00:00:00','2003-10-30 00:00:00','2003-10-23 00:00:00','Resolved','This order was disputed, but resolved on 11/1/2003; Customer doesn\'t like the colors and precision of the models.',452,'2003-10-21',4,10,2003), (10164,'S32_3522',49,'54.9400000',5,2692.06,'2003-10-21 00:00:00','2003-10-30 00:00:00','2003-10-23 00:00:00','Resolved','This order was disputed, but resolved on 11/1/2003; Customer doesn\'t like the colors and precision of the models.',452,'2003-10-21',4,10,2003), (10164,'S700_2824',39,'81.9300000',4,3195.27,'2003-10-21 00:00:00','2003-10-30 00:00:00','2003-10-23 00:00:00','Resolved','This order was disputed, but resolved on 11/1/2003; Customer doesn\'t like the colors and precision of the models.',452,'2003-10-21',4,10,2003), (10165,'S12_1108',44,'100.0000000',3,8594.52,'2003-10-22 00:00:00','2003-10-31 00:00:00','2003-12-26 00:00:00','Shipped','This order was on hold because customers\'s credit limit had been exceeded. Order will ship when payment is received',148,'2003-10-22',4,10,2003), (10165,'S12_3148',34,'100.0000000',4,4880.02,'2003-10-22 00:00:00','2003-10-31 00:00:00','2003-12-26 00:00:00','Shipped','This order was on hold because customers\'s credit limit had been exceeded. Order will ship when payment is received',148,'2003-10-22',4,10,2003), (10165,'S12_3891',27,'100.0000000',2,5559.03,'2003-10-22 00:00:00','2003-10-31 00:00:00','2003-12-26 00:00:00','Shipped','This order was on hold because customers\'s credit limit had been exceeded. Order will ship when payment is received',148,'2003-10-22',4,10,2003), (10165,'S12_4473',48,'100.0000000',12,6825.6,'2003-10-22 00:00:00','2003-10-31 00:00:00','2003-12-26 00:00:00','Shipped','This order was on hold because customers\'s credit limit had been exceeded. Order will ship when payment is received',148,'2003-10-22',4,10,2003), (10165,'S18_2238',29,'100.0000000',11,5032.95,'2003-10-22 00:00:00','2003-10-31 00:00:00','2003-12-26 00:00:00','Shipped','This order was on hold because customers\'s credit limit had been exceeded. Order will ship when payment is received',148,'2003-10-22',4,10,2003), (10165,'S18_2319',46,'100.0000000',15,5984.14,'2003-10-22 00:00:00','2003-10-31 00:00:00','2003-12-26 00:00:00','Shipped','This order was on hold because customers\'s credit limit had been exceeded. Order will ship when payment is received',148,'2003-10-22',4,10,2003), (10165,'S18_2432',31,'71.1000000',18,2204.1,'2003-10-22 00:00:00','2003-10-31 00:00:00','2003-12-26 00:00:00','Shipped','This order was on hold because customers\'s credit limit had been exceeded. Order will ship when payment is received',148,'2003-10-22',4,10,2003), (10165,'S18_3232',47,'100.0000000',16,8754.69,'2003-10-22 00:00:00','2003-10-31 00:00:00','2003-12-26 00:00:00','Shipped','This order was on hold because customers\'s credit limit had been exceeded. Order will ship when payment is received',148,'2003-10-22',4,10,2003), (10165,'S18_3259',50,'100.0000000',1,5344.5,'2003-10-22 00:00:00','2003-10-31 00:00:00','2003-12-26 00:00:00','Shipped','This order was on hold because customers\'s credit limit had been exceeded. Order will ship when payment is received',148,'2003-10-22',4,10,2003), (10165,'S18_4027',28,'100.0000000',6,3337.6,'2003-10-22 00:00:00','2003-10-31 00:00:00','2003-12-26 00:00:00','Shipped','This order was on hold because customers\'s credit limit had been exceeded. Order will ship when payment is received',148,'2003-10-22',4,10,2003), (10165,'S24_1444',25,'69.3600000',9,1734,'2003-10-22 00:00:00','2003-10-31 00:00:00','2003-12-26 00:00:00','Shipped','This order was on hold because customers\'s credit limit had been exceeded. Order will ship when payment is received',148,'2003-10-22',4,10,2003), (10165,'S24_2300',32,'100.0000000',17,4661.76,'2003-10-22 00:00:00','2003-10-31 00:00:00','2003-12-26 00:00:00','Shipped','This order was on hold because customers\'s credit limit had been exceeded. Order will ship when payment is received',148,'2003-10-22',4,10,2003), (10165,'S24_2840',27,'31.8200000',13,859.14,'2003-10-22 00:00:00','2003-10-31 00:00:00','2003-12-26 00:00:00','Shipped','This order was on hold because customers\'s credit limit had been exceeded. Order will ship when payment is received',148,'2003-10-22',4,10,2003), (10165,'S24_4048',24,'99.3600000',8,2384.64,'2003-10-22 00:00:00','2003-10-31 00:00:00','2003-12-26 00:00:00','Shipped','This order was on hold because customers\'s credit limit had been exceeded. Order will ship when payment is received',148,'2003-10-22',4,10,2003), (10165,'S32_2509',48,'45.9900000',14,2207.52,'2003-10-22 00:00:00','2003-10-31 00:00:00','2003-12-26 00:00:00','Shipped','This order was on hold because customers\'s credit limit had been exceeded. Order will ship when payment is received',148,'2003-10-22',4,10,2003), (10165,'S32_3207',44,'53.4400000',7,2351.36,'2003-10-22 00:00:00','2003-10-31 00:00:00','2003-12-26 00:00:00','Shipped','This order was on hold because customers\'s credit limit had been exceeded. Order will ship when payment is received',148,'2003-10-22',4,10,2003), (10165,'S50_1392',48,'94.9200000',10,4556.16,'2003-10-22 00:00:00','2003-10-31 00:00:00','2003-12-26 00:00:00','Shipped','This order was on hold because customers\'s credit limit had been exceeded. Order will ship when payment is received',148,'2003-10-22',4,10,2003), (10165,'S50_1514',38,'66.7800000',5,2537.64,'2003-10-22 00:00:00','2003-10-31 00:00:00','2003-12-26 00:00:00','Shipped','This order was on hold because customers\'s credit limit had been exceeded. Order will ship when payment is received',148,'2003-10-22',4,10,2003), (10166,'S18_3140',43,'100.0000000',2,6930.74,'2003-10-21 00:00:00','2003-10-30 00:00:00','2003-10-27 00:00:00','Shipped',NULL,462,'2003-10-21',4,10,2003), (10166,'S18_4522',26,'73.7300000',1,1916.98,'2003-10-21 00:00:00','2003-10-30 00:00:00','2003-10-27 00:00:00','Shipped',NULL,462,'2003-10-21',4,10,2003), (10166,'S700_1938',29,'100.0000000',3,3013.97,'2003-10-21 00:00:00','2003-10-30 00:00:00','2003-10-27 00:00:00','Shipped',NULL,462,'2003-10-21',4,10,2003), (10167,'S10_4757',44,'100.0000000',9,5924.16,'2003-10-23 00:00:00','2003-10-30 00:00:00','2006-08-23 11:51:02','Cancelled','Customer called to cancel. The warehouse was notified in time and the order didn\'t ship. They have a new VP of Sales and are shifting their sales model. Our VP of Sales should contact them.',448,'2003-10-23',4,10,2003), (10167,'S18_1662',43,'100.0000000',1,5763.72,'2003-10-23 00:00:00','2003-10-30 00:00:00','2006-08-23 11:51:02','Cancelled','Customer called to cancel. The warehouse was notified in time and the order didn\'t ship. They have a new VP of Sales and are shifting their sales model. Our VP of Sales should contact them.',448,'2003-10-23',4,10,2003), (10167,'S18_3029',46,'73.1200000',7,3363.52,'2003-10-23 00:00:00','2003-10-30 00:00:00','2006-08-23 11:51:02','Cancelled','Customer called to cancel. The warehouse was notified in time and the order didn\'t ship. They have a new VP of Sales and are shifting their sales model. Our VP of Sales should contact them.',448,'2003-10-23',4,10,2003), (10167,'S18_3856',34,'100.0000000',6,3599.58,'2003-10-23 00:00:00','2003-10-30 00:00:00','2006-08-23 11:51:02','Cancelled','Customer called to cancel. The warehouse was notified in time and the order didn\'t ship. They have a new VP of Sales and are shifting their sales model. Our VP of Sales should contact them.',448,'2003-10-23',4,10,2003), (10167,'S24_2011',33,'100.0000000',16,3812.16,'2003-10-23 00:00:00','2003-10-30 00:00:00','2006-08-23 11:51:02','Cancelled','Customer called to cancel. The warehouse was notified in time and the order didn\'t ship. They have a new VP of Sales and are shifting their sales model. Our VP of Sales should contact them.',448,'2003-10-23',4,10,2003), (10167,'S24_2841',21,'69.8800000',2,1467.48,'2003-10-23 00:00:00','2003-10-30 00:00:00','2006-08-23 11:51:02','Cancelled','Customer called to cancel. The warehouse was notified in time and the order didn\'t ship. They have a new VP of Sales and are shifting their sales model. Our VP of Sales should contact them.',448,'2003-10-23',4,10,2003), (10167,'S24_3151',20,'79.6600000',11,1593.2,'2003-10-23 00:00:00','2003-10-30 00:00:00','2006-08-23 11:51:02','Cancelled','Customer called to cancel. The warehouse was notified in time and the order didn\'t ship. They have a new VP of Sales and are shifting their sales model. Our VP of Sales should contact them.',448,'2003-10-23',4,10,2003), (10167,'S24_3420',32,'63.1200000',3,2019.84,'2003-10-23 00:00:00','2003-10-30 00:00:00','2006-08-23 11:51:02','Cancelled','Customer called to cancel. The warehouse was notified in time and the order didn\'t ship. They have a new VP of Sales and are shifting their sales model. Our VP of Sales should contact them.',448,'2003-10-23',4,10,2003), (10167,'S24_3816',29,'83.8600000',8,2431.94,'2003-10-23 00:00:00','2003-10-30 00:00:00','2006-08-23 11:51:02','Cancelled','Customer called to cancel. The warehouse was notified in time and the order didn\'t ship. They have a new VP of Sales and are shifting their sales model. Our VP of Sales should contact them.',448,'2003-10-23',4,10,2003), (10167,'S700_1138',43,'75.3400000',12,3239.62,'2003-10-23 00:00:00','2003-10-30 00:00:00','2006-08-23 11:51:02','Cancelled','Customer called to cancel. The warehouse was notified in time and the order didn\'t ship. They have a new VP of Sales and are shifting their sales model. Our VP of Sales should contact them.',448,'2003-10-23',4,10,2003), (10167,'S700_2047',29,'100.0000000',5,2940.02,'2003-10-23 00:00:00','2003-10-30 00:00:00','2006-08-23 11:51:02','Cancelled','Customer called to cancel. The warehouse was notified in time and the order didn\'t ship. They have a new VP of Sales and are shifting their sales model. Our VP of Sales should contact them.',448,'2003-10-23',4,10,2003), (10167,'S700_2610',46,'70.1100000',10,3225.06,'2003-10-23 00:00:00','2003-10-30 00:00:00','2006-08-23 11:51:02','Cancelled','Customer called to cancel. The warehouse was notified in time and the order didn\'t ship. They have a new VP of Sales and are shifting their sales model. Our VP of Sales should contact them.',448,'2003-10-23',4,10,2003), (10167,'S700_3505',24,'100.0000000',13,2812.8,'2003-10-23 00:00:00','2003-10-30 00:00:00','2006-08-23 11:51:02','Cancelled','Customer called to cancel. The warehouse was notified in time and the order didn\'t ship. They have a new VP of Sales and are shifting their sales model. Our VP of Sales should contact them.',448,'2003-10-23',4,10,2003), (10167,'S700_3962',28,'100.0000000',14,3003,'2003-10-23 00:00:00','2003-10-30 00:00:00','2006-08-23 11:51:02','Cancelled','Customer called to cancel. The warehouse was notified in time and the order didn\'t ship. They have a new VP of Sales and are shifting their sales model. Our VP of Sales should contact them.',448,'2003-10-23',4,10,2003), (10167,'S72_1253',40,'41.7100000',4,1668.4,'2003-10-23 00:00:00','2003-10-30 00:00:00','2006-08-23 11:51:02','Cancelled','Customer called to cancel. The warehouse was notified in time and the order didn\'t ship. They have a new VP of Sales and are shifting their sales model. Our VP of Sales should contact them.',448,'2003-10-23',4,10,2003), (10167,'S72_3212',38,'48.5900000',15,1846.42,'2003-10-23 00:00:00','2003-10-30 00:00:00','2006-08-23 11:51:02','Cancelled','Customer called to cancel. The warehouse was notified in time and the order didn\'t ship. They have a new VP of Sales and are shifting their sales model. Our VP of Sales should contact them.',448,'2003-10-23',4,10,2003), (10168,'S10_1678',36,'96.6600000',1,3479.76,'2003-10-28 00:00:00','2003-11-03 00:00:00','2003-11-01 00:00:00','Shipped',NULL,161,'2003-10-28',4,10,2003), (10168,'S10_2016',27,'100.0000000',4,3660.93,'2003-10-28 00:00:00','2003-11-03 00:00:00','2003-11-01 00:00:00','Shipped',NULL,161,'2003-10-28',4,10,2003), (10168,'S10_4698',20,'100.0000000',3,4183,'2003-10-28 00:00:00','2003-11-03 00:00:00','2003-11-01 00:00:00','Shipped',NULL,161,'2003-10-28',4,10,2003), (10168,'S18_2581',21,'70.9600000',9,1490.16,'2003-10-28 00:00:00','2003-11-03 00:00:00','2003-11-01 00:00:00','Shipped',NULL,161,'2003-10-28',4,10,2003), (10168,'S18_2625',46,'61.1800000',5,2814.28,'2003-10-28 00:00:00','2003-11-03 00:00:00','2003-11-01 00:00:00','Shipped',NULL,161,'2003-10-28',4,10,2003), (10168,'S24_1578',50,'100.0000000',2,5747.5,'2003-10-28 00:00:00','2003-11-03 00:00:00','2003-11-01 00:00:00','Shipped',NULL,161,'2003-10-28',4,10,2003), (10168,'S24_1785',49,'100.0000000',11,6433.7,'2003-10-28 00:00:00','2003-11-03 00:00:00','2003-11-01 00:00:00','Shipped',NULL,161,'2003-10-28',4,10,2003), (10168,'S24_2000',29,'75.4100000',6,2186.89,'2003-10-28 00:00:00','2003-11-03 00:00:00','2003-11-01 00:00:00','Shipped',NULL,161,'2003-10-28',4,10,2003), (10168,'S24_3949',27,'73.0200000',18,1971.54,'2003-10-28 00:00:00','2003-11-03 00:00:00','2003-11-01 00:00:00','Shipped',NULL,161,'2003-10-28',4,10,2003), (10168,'S24_4278',48,'78.2500000',10,3756,'2003-10-28 00:00:00','2003-11-03 00:00:00','2003-11-01 00:00:00','Shipped',NULL,161,'2003-10-28',4,10,2003), (10168,'S32_1374',28,'100.0000000',7,3244.36,'2003-10-28 00:00:00','2003-11-03 00:00:00','2003-11-01 00:00:00','Shipped',NULL,161,'2003-10-28',4,10,2003), (10168,'S32_4289',31,'73.6100000',12,2281.91,'2003-10-28 00:00:00','2003-11-03 00:00:00','2003-11-01 00:00:00','Shipped',NULL,161,'2003-10-28',4,10,2003), (10168,'S50_1341',48,'51.9300000',13,2492.64,'2003-10-28 00:00:00','2003-11-03 00:00:00','2003-11-01 00:00:00','Shipped',NULL,161,'2003-10-28',4,10,2003), (10168,'S700_1691',28,'98.6500000',14,2762.2,'2003-10-28 00:00:00','2003-11-03 00:00:00','2003-11-01 00:00:00','Shipped',NULL,161,'2003-10-28',4,10,2003), (10168,'S700_2466',31,'100.0000000',16,3431.39,'2003-10-28 00:00:00','2003-11-03 00:00:00','2003-11-01 00:00:00','Shipped',NULL,161,'2003-10-28',4,10,2003), (10168,'S700_2834',36,'100.0000000',8,4527.72,'2003-10-28 00:00:00','2003-11-03 00:00:00','2003-11-01 00:00:00','Shipped',NULL,161,'2003-10-28',4,10,2003), (10168,'S700_3167',48,'96.0000000',15,4608,'2003-10-28 00:00:00','2003-11-03 00:00:00','2003-11-01 00:00:00','Shipped',NULL,161,'2003-10-28',4,10,2003), (10168,'S700_4002',39,'82.9100000',17,3233.49,'2003-10-28 00:00:00','2003-11-03 00:00:00','2003-11-01 00:00:00','Shipped',NULL,161,'2003-10-28',4,10,2003), (10169,'S12_1099',30,'100.0000000',2,5019.9,'2003-11-04 00:00:00','2003-11-14 00:00:00','2003-11-09 00:00:00','Shipped',NULL,276,'2003-11-04',4,11,2003), (10169,'S12_2823',35,'100.0000000',13,4639.25,'2003-11-04 00:00:00','2003-11-14 00:00:00','2003-11-09 00:00:00','Shipped',NULL,276,'2003-11-04',4,11,2003), (10169,'S12_3990',36,'63.8400000',3,2298.24,'2003-11-04 00:00:00','2003-11-14 00:00:00','2003-11-09 00:00:00','Shipped',NULL,276,'2003-11-04',4,11,2003), (10169,'S18_3278',32,'70.7600000',5,2264.32,'2003-11-04 00:00:00','2003-11-14 00:00:00','2003-11-09 00:00:00','Shipped',NULL,276,'2003-11-04',4,11,2003), (10169,'S18_3482',36,'100.0000000',4,4444.92,'2003-11-04 00:00:00','2003-11-14 00:00:00','2003-11-09 00:00:00','Shipped',NULL,276,'2003-11-04',4,11,2003), (10169,'S18_3782',38,'68.3900000',8,2598.82,'2003-11-04 00:00:00','2003-11-14 00:00:00','2003-11-09 00:00:00','Shipped',NULL,276,'2003-11-04',4,11,2003), (10169,'S18_4721',33,'100.0000000',7,4910.4,'2003-11-04 00:00:00','2003-11-14 00:00:00','2003-11-09 00:00:00','Shipped',NULL,276,'2003-11-04',4,11,2003), (10169,'S24_2360',38,'74.1100000',11,2816.18,'2003-11-04 00:00:00','2003-11-14 00:00:00','2003-11-09 00:00:00','Shipped',NULL,276,'2003-11-04',4,11,2003), (10169,'S24_3371',34,'50.2100000',1,1707.14,'2003-11-04 00:00:00','2003-11-14 00:00:00','2003-11-09 00:00:00','Shipped',NULL,276,'2003-11-04',4,11,2003), (10169,'S24_4620',24,'94.5800000',6,2269.92,'2003-11-04 00:00:00','2003-11-14 00:00:00','2003-11-09 00:00:00','Shipped',NULL,276,'2003-11-04',4,11,2003), (10169,'S32_2206',26,'39.8300000',9,1035.58,'2003-11-04 00:00:00','2003-11-14 00:00:00','2003-11-09 00:00:00','Shipped',NULL,276,'2003-11-04',4,11,2003), (10169,'S32_4485',34,'100.0000000',12,3920.88,'2003-11-04 00:00:00','2003-11-14 00:00:00','2003-11-09 00:00:00','Shipped',NULL,276,'2003-11-04',4,11,2003), (10169,'S50_4713',48,'80.5500000',10,3866.4,'2003-11-04 00:00:00','2003-11-14 00:00:00','2003-11-09 00:00:00','Shipped',NULL,276,'2003-11-04',4,11,2003), (10170,'S12_3380',47,'100.0000000',4,5464.69,'2003-11-04 00:00:00','2003-11-12 00:00:00','2003-11-07 00:00:00','Shipped',NULL,452,'2003-11-04',4,11,2003), (10170,'S12_4675',41,'100.0000000',3,4391.1,'2003-11-04 00:00:00','2003-11-12 00:00:00','2003-11-07 00:00:00','Shipped',NULL,452,'2003-11-04',4,11,2003), (10170,'S18_1889',20,'63.1400000',2,1262.8,'2003-11-04 00:00:00','2003-11-12 00:00:00','2003-11-07 00:00:00','Shipped',NULL,452,'2003-11-04',4,11,2003), (10170,'S24_3856',34,'100.0000000',1,3819.56,'2003-11-04 00:00:00','2003-11-12 00:00:00','2003-11-07 00:00:00','Shipped',NULL,452,'2003-11-04',4,11,2003), (10171,'S18_1129',35,'100.0000000',2,4508,'2003-11-05 00:00:00','2003-11-13 00:00:00','2003-11-07 00:00:00','Shipped',NULL,233,'2003-11-05',4,11,2003), (10171,'S18_1984',35,'100.0000000',1,4680.2,'2003-11-05 00:00:00','2003-11-13 00:00:00','2003-11-07 00:00:00','Shipped',NULL,233,'2003-11-05',4,11,2003), (10171,'S18_3232',39,'100.0000000',3,5481.45,'2003-11-05 00:00:00','2003-11-13 00:00:00','2003-11-07 00:00:00','Shipped',NULL,233,'2003-11-05',4,11,2003), (10171,'S24_2972',36,'35.4900000',4,1277.64,'2003-11-05 00:00:00','2003-11-13 00:00:00','2003-11-07 00:00:00','Shipped',NULL,233,'2003-11-05',4,11,2003), (10172,'S18_1589',42,'100.0000000',6,4965.24,'2003-11-05 00:00:00','2003-11-14 00:00:00','2003-11-11 00:00:00','Shipped',NULL,175,'2003-11-05',4,11,2003), (10172,'S18_2870',39,'100.0000000',7,6023.16,'2003-11-05 00:00:00','2003-11-14 00:00:00','2003-11-11 00:00:00','Shipped',NULL,175,'2003-11-05',4,11,2003), (10172,'S18_3685',48,'100.0000000',8,5493.12,'2003-11-05 00:00:00','2003-11-14 00:00:00','2003-11-11 00:00:00','Shipped',NULL,175,'2003-11-05',4,11,2003), (10172,'S24_1046',32,'75.6900000',3,2422.08,'2003-11-05 00:00:00','2003-11-14 00:00:00','2003-11-11 00:00:00','Shipped',NULL,175,'2003-11-05',4,11,2003), (10172,'S24_1628',34,'42.7600000',5,1453.84,'2003-11-05 00:00:00','2003-11-14 00:00:00','2003-11-11 00:00:00','Shipped',NULL,175,'2003-11-05',4,11,2003), (10172,'S24_2766',22,'74.5100000',1,1639.22,'2003-11-05 00:00:00','2003-11-14 00:00:00','2003-11-11 00:00:00','Shipped',NULL,175,'2003-11-05',4,11,2003), (10172,'S24_3191',24,'81.3300000',2,1951.92,'2003-11-05 00:00:00','2003-11-14 00:00:00','2003-11-11 00:00:00','Shipped',NULL,175,'2003-11-05',4,11,2003), (10172,'S24_3432',22,'98.5100000',4,2167.22,'2003-11-05 00:00:00','2003-11-14 00:00:00','2003-11-11 00:00:00','Shipped',NULL,175,'2003-11-05',4,11,2003), (10173,'S18_1342',43,'100.0000000',6,5036.16,'2003-11-05 00:00:00','2003-11-15 00:00:00','2003-11-09 00:00:00','Shipped','Cautious optimism. We have happy customers here, if we can keep them well stocked. I need all the information I can get on the planned shippments of Porches',278,'2003-11-05',4,11,2003), (10173,'S18_1367',48,'44.2100000',5,2122.08,'2003-11-05 00:00:00','2003-11-15 00:00:00','2003-11-09 00:00:00','Shipped','Cautious optimism. We have happy customers here, if we can keep them well stocked. I need all the information I can get on the planned shippments of Porches',278,'2003-11-05',4,11,2003), (10173,'S18_1749',24,'100.0000000',13,3508.8,'2003-11-05 00:00:00','2003-11-15 00:00:00','2003-11-09 00:00:00','Shipped','Cautious optimism. We have happy customers here, if we can keep them well stocked. I need all the information I can get on the planned shippments of Porches',278,'2003-11-05',4,11,2003), (10173,'S18_2248',26,'57.5100000',12,1495.26,'2003-11-05 00:00:00','2003-11-15 00:00:00','2003-11-09 00:00:00','Shipped','Cautious optimism. We have happy customers here, if we can keep them well stocked. I need all the information I can get on the planned shippments of Porches',278,'2003-11-05',4,11,2003), (10173,'S18_2325',31,'100.0000000',10,4492.83,'2003-11-05 00:00:00','2003-11-15 00:00:00','2003-11-09 00:00:00','Shipped','Cautious optimism. We have happy customers here, if we can keep them well stocked. I need all the information I can get on the planned shippments of Porches',278,'2003-11-05',4,11,2003), (10173,'S18_2795',22,'100.0000000',7,3452.68,'2003-11-05 00:00:00','2003-11-15 00:00:00','2003-11-09 00:00:00','Shipped','Cautious optimism. We have happy customers here, if we can keep them well stocked. I need all the information I can get on the planned shippments of Porches',278,'2003-11-05',4,11,2003), (10173,'S18_2957',28,'53.7200000',2,1504.16,'2003-11-05 00:00:00','2003-11-15 00:00:00','2003-11-09 00:00:00','Shipped','Cautious optimism. We have happy customers here, if we can keep them well stocked. I need all the information I can get on the planned shippments of Porches',278,'2003-11-05',4,11,2003), (10173,'S18_3136',31,'89.0100000',1,2759.31,'2003-11-05 00:00:00','2003-11-15 00:00:00','2003-11-09 00:00:00','Shipped','Cautious optimism. We have happy customers here, if we can keep them well stocked. I need all the information I can get on the planned shippments of Porches',278,'2003-11-05',4,11,2003), (10173,'S18_3320',29,'95.2400000',4,2761.96,'2003-11-05 00:00:00','2003-11-15 00:00:00','2003-11-09 00:00:00','Shipped','Cautious optimism. We have happy customers here, if we can keep them well stocked. I need all the information I can get on the planned shippments of Porches',278,'2003-11-05',4,11,2003), (10173,'S18_4409',21,'75.4600000',14,1584.66,'2003-11-05 00:00:00','2003-11-15 00:00:00','2003-11-09 00:00:00','Shipped','Cautious optimism. We have happy customers here, if we can keep them well stocked. I need all the information I can get on the planned shippments of Porches',278,'2003-11-05',4,11,2003), (10173,'S18_4933',39,'71.9800000',15,2807.22,'2003-11-05 00:00:00','2003-11-15 00:00:00','2003-11-09 00:00:00','Shipped','Cautious optimism. We have happy customers here, if we can keep them well stocked. I need all the information I can get on the planned shippments of Porches',278,'2003-11-05',4,11,2003), (10173,'S24_1937',31,'31.5300000',9,977.43,'2003-11-05 00:00:00','2003-11-15 00:00:00','2003-11-09 00:00:00','Shipped','Cautious optimism. We have happy customers here, if we can keep them well stocked. I need all the information I can get on the planned shippments of Porches',278,'2003-11-05',4,11,2003), (10173,'S24_2022',27,'41.2200000',8,1112.94,'2003-11-05 00:00:00','2003-11-15 00:00:00','2003-11-09 00:00:00','Shipped','Cautious optimism. We have happy customers here, if we can keep them well stocked. I need all the information I can get on the planned shippments of Porches',278,'2003-11-05',4,11,2003), (10173,'S24_2887',23,'100.0000000',16,2728.03,'2003-11-05 00:00:00','2003-11-15 00:00:00','2003-11-09 00:00:00','Shipped','Cautious optimism. We have happy customers here, if we can keep them well stocked. I need all the information I can get on the planned shippments of Porches',278,'2003-11-05',4,11,2003), (10173,'S24_3969',35,'33.2300000',11,1163.05,'2003-11-05 00:00:00','2003-11-15 00:00:00','2003-11-09 00:00:00','Shipped','Cautious optimism. We have happy customers here, if we can keep them well stocked. I need all the information I can get on the planned shippments of Porches',278,'2003-11-05',4,11,2003), (10173,'S24_4258',22,'100.0000000',3,2571.14,'2003-11-05 00:00:00','2003-11-15 00:00:00','2003-11-09 00:00:00','Shipped','Cautious optimism. We have happy customers here, if we can keep them well stocked. I need all the information I can get on the planned shippments of Porches',278,'2003-11-05',4,11,2003), (10174,'S10_1949',34,'100.0000000',4,8014.82,'2003-11-06 00:00:00','2003-11-15 00:00:00','2003-11-10 00:00:00','Shipped',NULL,333,'2003-11-06',4,11,2003), (10174,'S12_1666',43,'100.0000000',1,6817.22,'2003-11-06 00:00:00','2003-11-15 00:00:00','2003-11-10 00:00:00','Shipped',NULL,333,'2003-11-06',4,11,2003), (10174,'S18_1097',48,'93.3400000',3,4480.32,'2003-11-06 00:00:00','2003-11-15 00:00:00','2003-11-10 00:00:00','Shipped',NULL,333,'2003-11-06',4,11,2003), (10174,'S18_2949',46,'100.0000000',5,5592.22,'2003-11-06 00:00:00','2003-11-15 00:00:00','2003-11-10 00:00:00','Shipped',NULL,333,'2003-11-06',4,11,2003), (10174,'S18_4668',49,'44.7800000',2,2194.22,'2003-11-06 00:00:00','2003-11-15 00:00:00','2003-11-10 00:00:00','Shipped',NULL,333,'2003-11-06',4,11,2003), (10175,'S10_4962',33,'100.0000000',9,5362.83,'2003-11-06 00:00:00','2003-11-14 00:00:00','2003-11-09 00:00:00','Shipped',NULL,324,'2003-11-06',4,11,2003), (10175,'S12_4473',26,'100.0000000',1,3543.28,'2003-11-06 00:00:00','2003-11-14 00:00:00','2003-11-09 00:00:00','Shipped',NULL,324,'2003-11-06',4,11,2003), (10175,'S18_2319',48,'100.0000000',4,5891.04,'2003-11-06 00:00:00','2003-11-14 00:00:00','2003-11-09 00:00:00','Shipped',NULL,324,'2003-11-06',4,11,2003), (10175,'S18_2432',41,'69.2800000',7,2840.48,'2003-11-06 00:00:00','2003-11-14 00:00:00','2003-11-09 00:00:00','Shipped',NULL,324,'2003-11-06',4,11,2003), (10175,'S18_3232',29,'100.0000000',5,4419.89,'2003-11-06 00:00:00','2003-11-14 00:00:00','2003-11-09 00:00:00','Shipped',NULL,324,'2003-11-06',4,11,2003), (10175,'S18_4600',47,'100.0000000',10,5121.59,'2003-11-06 00:00:00','2003-11-14 00:00:00','2003-11-09 00:00:00','Shipped',NULL,324,'2003-11-06',4,11,2003), (10175,'S24_2300',28,'100.0000000',6,2969.96,'2003-11-06 00:00:00','2003-11-14 00:00:00','2003-11-09 00:00:00','Shipped',NULL,324,'2003-11-06',4,11,2003), (10175,'S24_2840',37,'31.1200000',2,1151.44,'2003-11-06 00:00:00','2003-11-14 00:00:00','2003-11-09 00:00:00','Shipped',NULL,324,'2003-11-06',4,11,2003), (10175,'S32_1268',22,'100.0000000',8,2436.72,'2003-11-06 00:00:00','2003-11-14 00:00:00','2003-11-09 00:00:00','Shipped',NULL,324,'2003-11-06',4,11,2003), (10175,'S32_2509',50,'63.3100000',3,3165.5,'2003-11-06 00:00:00','2003-11-14 00:00:00','2003-11-09 00:00:00','Shipped',NULL,324,'2003-11-06',4,11,2003), (10175,'S32_3522',29,'74.9800000',12,2174.42,'2003-11-06 00:00:00','2003-11-14 00:00:00','2003-11-09 00:00:00','Shipped',NULL,324,'2003-11-06',4,11,2003), (10175,'S700_2824',42,'85.9800000',11,3611.16,'2003-11-06 00:00:00','2003-11-14 00:00:00','2003-11-09 00:00:00','Shipped',NULL,324,'2003-11-06',4,11,2003), (10176,'S12_1108',33,'100.0000000',2,7474.5,'2003-11-06 00:00:00','2003-11-15 00:00:00','2003-11-12 00:00:00','Shipped',NULL,386,'2003-11-06',4,11,2003), (10176,'S12_3148',47,'100.0000000',3,8378.69,'2003-11-06 00:00:00','2003-11-15 00:00:00','2003-11-12 00:00:00','Shipped',NULL,386,'2003-11-06',4,11,2003), (10176,'S12_3891',50,'100.0000000',1,7872.5,'2003-11-06 00:00:00','2003-11-15 00:00:00','2003-11-12 00:00:00','Shipped',NULL,386,'2003-11-06',4,11,2003), (10176,'S18_2238',20,'100.0000000',10,3667.6,'2003-11-06 00:00:00','2003-11-15 00:00:00','2003-11-12 00:00:00','Shipped',NULL,386,'2003-11-06',4,11,2003), (10176,'S18_4027',36,'100.0000000',5,5532.12,'2003-11-06 00:00:00','2003-11-15 00:00:00','2003-11-12 00:00:00','Shipped',NULL,386,'2003-11-06',4,11,2003), (10176,'S24_1444',27,'68.7800000',8,1857.06,'2003-11-06 00:00:00','2003-11-15 00:00:00','2003-11-12 00:00:00','Shipped',NULL,386,'2003-11-06',4,11,2003), (10176,'S24_4048',29,'100.0000000',7,2915.66,'2003-11-06 00:00:00','2003-11-15 00:00:00','2003-11-12 00:00:00','Shipped',NULL,386,'2003-11-06',4,11,2003), (10176,'S32_3207',22,'64.0000000',6,1408,'2003-11-06 00:00:00','2003-11-15 00:00:00','2003-11-12 00:00:00','Shipped',NULL,386,'2003-11-06',4,11,2003), (10176,'S50_1392',23,'100.0000000',9,3114.89,'2003-11-06 00:00:00','2003-11-15 00:00:00','2003-11-12 00:00:00','Shipped',NULL,386,'2003-11-06',4,11,2003), (10176,'S50_1514',38,'64.4400000',4,2448.72,'2003-11-06 00:00:00','2003-11-15 00:00:00','2003-11-12 00:00:00','Shipped',NULL,386,'2003-11-06',4,11,2003), (10177,'S18_3140',23,'100.0000000',9,3675.63,'2003-11-07 00:00:00','2003-11-17 00:00:00','2003-11-12 00:00:00','Shipped',NULL,344,'2003-11-07',4,11,2003), (10177,'S18_3259',29,'100.0000000',11,3070.52,'2003-11-07 00:00:00','2003-11-17 00:00:00','2003-11-12 00:00:00','Shipped',NULL,344,'2003-11-07',4,11,2003), (10177,'S18_4522',35,'74.6000000',8,2611,'2003-11-07 00:00:00','2003-11-17 00:00:00','2003-11-12 00:00:00','Shipped',NULL,344,'2003-11-07',4,11,2003), (10177,'S24_2011',50,'100.0000000',7,6083,'2003-11-07 00:00:00','2003-11-17 00:00:00','2003-11-12 00:00:00','Shipped',NULL,344,'2003-11-07',4,11,2003), (10177,'S24_3151',45,'72.5800000',2,3266.1,'2003-11-07 00:00:00','2003-11-17 00:00:00','2003-11-12 00:00:00','Shipped',NULL,344,'2003-11-07',4,11,2003), (10177,'S700_1138',24,'76.0000000',3,1824,'2003-11-07 00:00:00','2003-11-17 00:00:00','2003-11-12 00:00:00','Shipped',NULL,344,'2003-11-07',4,11,2003), (10177,'S700_1938',31,'88.3400000',10,2738.54,'2003-11-07 00:00:00','2003-11-17 00:00:00','2003-11-12 00:00:00','Shipped',NULL,344,'2003-11-07',4,11,2003), (10177,'S700_2610',32,'76.6200000',1,2451.84,'2003-11-07 00:00:00','2003-11-17 00:00:00','2003-11-12 00:00:00','Shipped',NULL,344,'2003-11-07',4,11,2003), (10177,'S700_3505',44,'92.1600000',4,4055.04,'2003-11-07 00:00:00','2003-11-17 00:00:00','2003-11-12 00:00:00','Shipped',NULL,344,'2003-11-07',4,11,2003), (10177,'S700_3962',24,'100.0000000',5,2526.48,'2003-11-07 00:00:00','2003-11-17 00:00:00','2003-11-12 00:00:00','Shipped',NULL,344,'2003-11-07',4,11,2003), (10177,'S72_3212',40,'50.2300000',6,2009.2,'2003-11-07 00:00:00','2003-11-17 00:00:00','2003-11-12 00:00:00','Shipped',NULL,344,'2003-11-07',4,11,2003), (10178,'S10_4757',24,'100.0000000',12,3492.48,'2003-11-08 00:00:00','2003-11-16 00:00:00','2003-11-10 00:00:00','Shipped','Custom shipping instructions sent to warehouse',242,'2003-11-08',4,11,2003), (10178,'S18_1662',42,'100.0000000',4,6490.68,'2003-11-08 00:00:00','2003-11-16 00:00:00','2003-11-10 00:00:00','Shipped','Custom shipping instructions sent to warehouse',242,'2003-11-08',4,11,2003), (10178,'S18_3029',41,'81.7200000',10,3350.52,'2003-11-08 00:00:00','2003-11-16 00:00:00','2003-11-10 00:00:00','Shipped','Custom shipping instructions sent to warehouse',242,'2003-11-08',4,11,2003), (10178,'S18_3856',48,'100.0000000',9,5386.56,'2003-11-08 00:00:00','2003-11-16 00:00:00','2003-11-10 00:00:00','Shipped','Custom shipping instructions sent to warehouse',242,'2003-11-08',4,11,2003), (10178,'S24_2841',34,'80.8400000',5,2748.56,'2003-11-08 00:00:00','2003-11-16 00:00:00','2003-11-10 00:00:00','Shipped','Custom shipping instructions sent to warehouse',242,'2003-11-08',4,11,2003), (10178,'S24_3420',27,'73.6400000',6,1988.28,'2003-11-08 00:00:00','2003-11-16 00:00:00','2003-11-10 00:00:00','Shipped','Custom shipping instructions sent to warehouse',242,'2003-11-08',4,11,2003), (10178,'S24_3816',21,'72.1200000',11,1514.52,'2003-11-08 00:00:00','2003-11-16 00:00:00','2003-11-10 00:00:00','Shipped','Custom shipping instructions sent to warehouse',242,'2003-11-08',4,11,2003), (10178,'S24_3949',30,'72.3300000',3,2169.9,'2003-11-08 00:00:00','2003-11-16 00:00:00','2003-11-10 00:00:00','Shipped','Custom shipping instructions sent to warehouse',242,'2003-11-08',4,11,2003), (10178,'S700_2047',34,'96.8600000',8,3293.24,'2003-11-08 00:00:00','2003-11-16 00:00:00','2003-11-10 00:00:00','Shipped','Custom shipping instructions sent to warehouse',242,'2003-11-08',4,11,2003), (10178,'S700_2466',22,'87.7500000',1,1930.5,'2003-11-08 00:00:00','2003-11-16 00:00:00','2003-11-10 00:00:00','Shipped','Custom shipping instructions sent to warehouse',242,'2003-11-08',4,11,2003), (10178,'S700_4002',45,'76.2500000',2,3431.25,'2003-11-08 00:00:00','2003-11-16 00:00:00','2003-11-10 00:00:00','Shipped','Custom shipping instructions sent to warehouse',242,'2003-11-08',4,11,2003), (10178,'S72_1253',45,'51.1500000',7,2301.75,'2003-11-08 00:00:00','2003-11-16 00:00:00','2003-11-10 00:00:00','Shipped','Custom shipping instructions sent to warehouse',242,'2003-11-08',4,11,2003), (10179,'S18_2581',24,'78.5700000',3,1885.68,'2003-11-11 00:00:00','2003-11-17 00:00:00','2003-11-13 00:00:00','Cancelled','Customer cancelled due to urgent budgeting issues. Must be cautious when dealing with them in the future. Since order shipped already we must discuss who would cover the shipping charges.',496,'2003-11-11',4,11,2003); INSERT INTO `orderfact` (`ORDERNUMBER`,`PRODUCTCODE`,`QUANTITYORDERED`,`PRICEEACH`,`ORDERLINENUMBER`,`TOTALPRICE`,`ORDERDATE`,`REQUIREDDATE`,`SHIPPEDDATE`,`STATUS`,`COMMENTS`,`CUSTOMERNUMBER`,`TIME_ID`,`QTR_ID`,`MONTH_ID`,`YEAR_ID`) VALUES (10179,'S24_1785',47,'100.0000000',5,5862.78,'2003-11-11 00:00:00','2003-11-17 00:00:00','2003-11-13 00:00:00','Cancelled','Customer cancelled due to urgent budgeting issues. Must be cautious when dealing with them in the future. Since order shipped already we must discuss who would cover the shipping charges.',496,'2003-11-11',4,11,2003), (10179,'S24_4278',27,'84.7700000',4,2288.79,'2003-11-11 00:00:00','2003-11-17 00:00:00','2003-11-13 00:00:00','Cancelled','Customer cancelled due to urgent budgeting issues. Must be cautious when dealing with them in the future. Since order shipped already we must discuss who would cover the shipping charges.',496,'2003-11-11',4,11,2003), (10179,'S32_1374',45,'100.0000000',1,5394.15,'2003-11-11 00:00:00','2003-11-17 00:00:00','2003-11-13 00:00:00','Cancelled','Customer cancelled due to urgent budgeting issues. Must be cautious when dealing with them in the future. Since order shipped already we must discuss who would cover the shipping charges.',496,'2003-11-11',4,11,2003), (10179,'S32_4289',24,'72.2300000',6,1733.52,'2003-11-11 00:00:00','2003-11-17 00:00:00','2003-11-13 00:00:00','Cancelled','Customer cancelled due to urgent budgeting issues. Must be cautious when dealing with them in the future. Since order shipped already we must discuss who would cover the shipping charges.',496,'2003-11-11',4,11,2003), (10179,'S50_1341',34,'42.7700000',7,1454.18,'2003-11-11 00:00:00','2003-11-17 00:00:00','2003-11-13 00:00:00','Cancelled','Customer cancelled due to urgent budgeting issues. Must be cautious when dealing with them in the future. Since order shipped already we must discuss who would cover the shipping charges.',496,'2003-11-11',4,11,2003), (10179,'S700_1691',23,'100.0000000',8,2478.94,'2003-11-11 00:00:00','2003-11-17 00:00:00','2003-11-13 00:00:00','Cancelled','Customer cancelled due to urgent budgeting issues. Must be cautious when dealing with them in the future. Since order shipped already we must discuss who would cover the shipping charges.',496,'2003-11-11',4,11,2003), (10179,'S700_2834',25,'100.0000000',2,2640,'2003-11-11 00:00:00','2003-11-17 00:00:00','2003-11-13 00:00:00','Cancelled','Customer cancelled due to urgent budgeting issues. Must be cautious when dealing with them in the future. Since order shipped already we must discuss who would cover the shipping charges.',496,'2003-11-11',4,11,2003), (10179,'S700_3167',39,'68.8000000',9,2683.2,'2003-11-11 00:00:00','2003-11-17 00:00:00','2003-11-13 00:00:00','Cancelled','Customer cancelled due to urgent budgeting issues. Must be cautious when dealing with them in the future. Since order shipped already we must discuss who would cover the shipping charges.',496,'2003-11-11',4,11,2003), (10180,'S10_1678',29,'86.1300000',9,2497.77,'2003-11-11 00:00:00','2003-11-19 00:00:00','2003-11-14 00:00:00','Shipped',NULL,171,'2003-11-11',4,11,2003), (10180,'S10_2016',42,'100.0000000',12,4695.6,'2003-11-11 00:00:00','2003-11-19 00:00:00','2003-11-14 00:00:00','Shipped',NULL,171,'2003-11-11',4,11,2003), (10180,'S10_4698',41,'100.0000000',11,8892.9,'2003-11-11 00:00:00','2003-11-19 00:00:00','2003-11-14 00:00:00','Shipped',NULL,171,'2003-11-11',4,11,2003), (10180,'S12_2823',40,'100.0000000',8,6747.6,'2003-11-11 00:00:00','2003-11-19 00:00:00','2003-11-14 00:00:00','Shipped',NULL,171,'2003-11-11',4,11,2003), (10180,'S18_2625',25,'64.2000000',13,1605,'2003-11-11 00:00:00','2003-11-19 00:00:00','2003-11-14 00:00:00','Shipped',NULL,171,'2003-11-11',4,11,2003), (10180,'S18_3782',21,'50.3600000',3,1057.56,'2003-11-11 00:00:00','2003-11-19 00:00:00','2003-11-14 00:00:00','Shipped',NULL,171,'2003-11-11',4,11,2003), (10180,'S18_4721',44,'100.0000000',2,5565.12,'2003-11-11 00:00:00','2003-11-19 00:00:00','2003-11-14 00:00:00','Shipped',NULL,171,'2003-11-11',4,11,2003), (10180,'S24_1578',48,'100.0000000',10,5355.36,'2003-11-11 00:00:00','2003-11-19 00:00:00','2003-11-14 00:00:00','Shipped',NULL,171,'2003-11-11',4,11,2003), (10180,'S24_2000',28,'68.5500000',14,1919.4,'2003-11-11 00:00:00','2003-11-19 00:00:00','2003-11-14 00:00:00','Shipped',NULL,171,'2003-11-11',4,11,2003), (10180,'S24_2360',35,'72.0300000',6,2521.05,'2003-11-11 00:00:00','2003-11-19 00:00:00','2003-11-14 00:00:00','Shipped',NULL,171,'2003-11-11',4,11,2003), (10180,'S24_4620',28,'71.1400000',1,1991.92,'2003-11-11 00:00:00','2003-11-19 00:00:00','2003-11-14 00:00:00','Shipped',NULL,171,'2003-11-11',4,11,2003), (10180,'S32_2206',34,'45.4600000',4,1545.64,'2003-11-11 00:00:00','2003-11-19 00:00:00','2003-11-14 00:00:00','Shipped',NULL,171,'2003-11-11',4,11,2003), (10180,'S32_4485',22,'100.0000000',7,2514.6,'2003-11-11 00:00:00','2003-11-19 00:00:00','2003-11-14 00:00:00','Shipped',NULL,171,'2003-11-11',4,11,2003), (10180,'S50_4713',21,'93.5600000',5,1964.76,'2003-11-11 00:00:00','2003-11-19 00:00:00','2003-11-14 00:00:00','Shipped',NULL,171,'2003-11-11',4,11,2003), (10181,'S12_1099',27,'100.0000000',14,5411.07,'2003-11-12 00:00:00','2003-11-19 00:00:00','2003-11-15 00:00:00','Shipped',NULL,167,'2003-11-12',4,11,2003), (10181,'S12_3380',28,'100.0000000',12,2860.76,'2003-11-12 00:00:00','2003-11-19 00:00:00','2003-11-15 00:00:00','Shipped',NULL,167,'2003-11-12',4,11,2003), (10181,'S12_3990',20,'81.4000000',15,1628,'2003-11-12 00:00:00','2003-11-19 00:00:00','2003-11-15 00:00:00','Shipped',NULL,167,'2003-11-12',4,11,2003), (10181,'S12_4675',36,'100.0000000',11,4477.32,'2003-11-12 00:00:00','2003-11-19 00:00:00','2003-11-15 00:00:00','Shipped',NULL,167,'2003-11-12',4,11,2003), (10181,'S18_1129',44,'100.0000000',6,5418.16,'2003-11-12 00:00:00','2003-11-19 00:00:00','2003-11-15 00:00:00','Shipped',NULL,167,'2003-11-12',4,11,2003), (10181,'S18_1589',42,'100.0000000',2,5435.64,'2003-11-12 00:00:00','2003-11-19 00:00:00','2003-11-15 00:00:00','Shipped',NULL,167,'2003-11-12',4,11,2003), (10181,'S18_1889',22,'73.9200000',10,1626.24,'2003-11-12 00:00:00','2003-11-19 00:00:00','2003-11-15 00:00:00','Shipped',NULL,167,'2003-11-12',4,11,2003), (10181,'S18_1984',21,'100.0000000',5,3286.08,'2003-11-12 00:00:00','2003-11-19 00:00:00','2003-11-15 00:00:00','Shipped',NULL,167,'2003-11-12',4,11,2003), (10181,'S18_2870',27,'100.0000000',3,3884.76,'2003-11-12 00:00:00','2003-11-19 00:00:00','2003-11-15 00:00:00','Shipped',NULL,167,'2003-11-12',4,11,2003), (10181,'S18_3232',45,'100.0000000',7,6324.75,'2003-11-12 00:00:00','2003-11-19 00:00:00','2003-11-15 00:00:00','Shipped',NULL,167,'2003-11-12',4,11,2003), (10181,'S18_3278',30,'82.8200000',17,2484.6,'2003-11-12 00:00:00','2003-11-19 00:00:00','2003-11-15 00:00:00','Shipped',NULL,167,'2003-11-12',4,11,2003), (10181,'S18_3482',22,'100.0000000',16,3395.48,'2003-11-12 00:00:00','2003-11-19 00:00:00','2003-11-15 00:00:00','Shipped',NULL,167,'2003-11-12',4,11,2003), (10181,'S18_3685',39,'100.0000000',4,5785.26,'2003-11-12 00:00:00','2003-11-19 00:00:00','2003-11-15 00:00:00','Shipped',NULL,167,'2003-11-12',4,11,2003), (10181,'S24_1628',34,'53.8300000',1,1830.22,'2003-11-12 00:00:00','2003-11-19 00:00:00','2003-11-15 00:00:00','Shipped',NULL,167,'2003-11-12',4,11,2003), (10181,'S24_2972',37,'42.6700000',8,1578.79,'2003-11-12 00:00:00','2003-11-19 00:00:00','2003-11-15 00:00:00','Shipped',NULL,167,'2003-11-12',4,11,2003), (10181,'S24_3371',23,'65.5200000',13,1506.96,'2003-11-12 00:00:00','2003-11-19 00:00:00','2003-11-15 00:00:00','Shipped',NULL,167,'2003-11-12',4,11,2003), (10181,'S24_3856',25,'100.0000000',9,3861.75,'2003-11-12 00:00:00','2003-11-19 00:00:00','2003-11-15 00:00:00','Shipped',NULL,167,'2003-11-12',4,11,2003), (10182,'S18_1342',25,'87.3300000',3,2183.25,'2003-11-12 00:00:00','2003-11-21 00:00:00','2003-11-18 00:00:00','Shipped',NULL,124,'2003-11-12',4,11,2003), (10182,'S18_1367',32,'54.4500000',2,1742.4,'2003-11-12 00:00:00','2003-11-21 00:00:00','2003-11-18 00:00:00','Shipped',NULL,124,'2003-11-12',4,11,2003), (10182,'S18_1749',44,'100.0000000',10,7554.8,'2003-11-12 00:00:00','2003-11-21 00:00:00','2003-11-18 00:00:00','Shipped',NULL,124,'2003-11-12',4,11,2003), (10182,'S18_2248',38,'61.1500000',9,2323.7,'2003-11-12 00:00:00','2003-11-21 00:00:00','2003-11-18 00:00:00','Shipped',NULL,124,'2003-11-12',4,11,2003), (10182,'S18_2325',20,'100.0000000',7,2212,'2003-11-12 00:00:00','2003-11-21 00:00:00','2003-11-18 00:00:00','Shipped',NULL,124,'2003-11-12',4,11,2003), (10182,'S18_2795',21,'100.0000000',4,3047.73,'2003-11-12 00:00:00','2003-11-21 00:00:00','2003-11-18 00:00:00','Shipped',NULL,124,'2003-11-12',4,11,2003), (10182,'S18_3320',33,'86.3100000',1,2848.23,'2003-11-12 00:00:00','2003-11-21 00:00:00','2003-11-18 00:00:00','Shipped',NULL,124,'2003-11-12',4,11,2003), (10182,'S18_4409',36,'100.0000000',11,3942.72,'2003-11-12 00:00:00','2003-11-21 00:00:00','2003-11-18 00:00:00','Shipped',NULL,124,'2003-11-12',4,11,2003), (10182,'S18_4933',44,'69.8400000',12,3072.96,'2003-11-12 00:00:00','2003-11-21 00:00:00','2003-11-18 00:00:00','Shipped',NULL,124,'2003-11-12',4,11,2003), (10182,'S24_1046',47,'74.2200000',16,3488.34,'2003-11-12 00:00:00','2003-11-21 00:00:00','2003-11-18 00:00:00','Shipped',NULL,124,'2003-11-12',4,11,2003), (10182,'S24_1937',39,'36.8400000',6,1436.76,'2003-11-12 00:00:00','2003-11-21 00:00:00','2003-11-18 00:00:00','Shipped',NULL,124,'2003-11-12',4,11,2003), (10182,'S24_2022',31,'36.7400000',5,1138.94,'2003-11-12 00:00:00','2003-11-21 00:00:00','2003-11-18 00:00:00','Shipped',NULL,124,'2003-11-12',4,11,2003), (10182,'S24_2766',36,'73.6000000',14,2649.6,'2003-11-12 00:00:00','2003-11-21 00:00:00','2003-11-18 00:00:00','Shipped',NULL,124,'2003-11-12',4,11,2003), (10182,'S24_2887',20,'100.0000000',13,2395.8,'2003-11-12 00:00:00','2003-11-21 00:00:00','2003-11-18 00:00:00','Shipped',NULL,124,'2003-11-12',4,11,2003), (10182,'S24_3191',33,'94.1700000',15,3107.61,'2003-11-12 00:00:00','2003-11-21 00:00:00','2003-11-18 00:00:00','Shipped',NULL,124,'2003-11-12',4,11,2003), (10182,'S24_3432',49,'100.0000000',17,6244.07,'2003-11-12 00:00:00','2003-11-21 00:00:00','2003-11-18 00:00:00','Shipped',NULL,124,'2003-11-12',4,11,2003), (10182,'S24_3969',23,'42.2600000',8,971.98,'2003-11-12 00:00:00','2003-11-21 00:00:00','2003-11-18 00:00:00','Shipped',NULL,124,'2003-11-12',4,11,2003), (10183,'S10_1949',23,'100.0000000',8,5372.57,'2003-11-13 00:00:00','2003-11-22 00:00:00','2003-11-15 00:00:00','Shipped','We need to keep in close contact with their Marketing VP. He is the decision maker for all their purchases.',339,'2003-11-13',4,11,2003), (10183,'S10_4962',28,'100.0000000',1,3433.36,'2003-11-13 00:00:00','2003-11-22 00:00:00','2003-11-15 00:00:00','Shipped','We need to keep in close contact with their Marketing VP. He is the decision maker for all their purchases.',339,'2003-11-13',4,11,2003), (10183,'S12_1666',41,'100.0000000',5,6163.94,'2003-11-13 00:00:00','2003-11-22 00:00:00','2003-11-15 00:00:00','Shipped','We need to keep in close contact with their Marketing VP. He is the decision maker for all their purchases.',339,'2003-11-13',4,11,2003), (10183,'S18_1097',21,'96.8400000',7,2033.64,'2003-11-13 00:00:00','2003-11-22 00:00:00','2003-11-15 00:00:00','Shipped','We need to keep in close contact with their Marketing VP. He is the decision maker for all their purchases.',339,'2003-11-13',4,11,2003), (10183,'S18_2949',37,'89.1500000',9,3298.55,'2003-11-13 00:00:00','2003-11-22 00:00:00','2003-11-15 00:00:00','Shipped','We need to keep in close contact with their Marketing VP. He is the decision maker for all their purchases.',339,'2003-11-13',4,11,2003), (10183,'S18_2957',39,'68.0800000',11,2655.12,'2003-11-13 00:00:00','2003-11-22 00:00:00','2003-11-15 00:00:00','Shipped','We need to keep in close contact with their Marketing VP. He is the decision maker for all their purchases.',339,'2003-11-13',4,11,2003), (10183,'S18_3136',22,'100.0000000',10,2488.2,'2003-11-13 00:00:00','2003-11-22 00:00:00','2003-11-15 00:00:00','Shipped','We need to keep in close contact with their Marketing VP. He is the decision maker for all their purchases.',339,'2003-11-13',4,11,2003), (10183,'S18_4600',21,'100.0000000',2,2441.04,'2003-11-13 00:00:00','2003-11-22 00:00:00','2003-11-15 00:00:00','Shipped','We need to keep in close contact with their Marketing VP. He is the decision maker for all their purchases.',339,'2003-11-13',4,11,2003), (10183,'S18_4668',40,'49.3000000',6,1972,'2003-11-13 00:00:00','2003-11-22 00:00:00','2003-11-15 00:00:00','Shipped','We need to keep in close contact with their Marketing VP. He is the decision maker for all their purchases.',339,'2003-11-13',4,11,2003), (10183,'S24_4258',47,'100.0000000',12,5035.11,'2003-11-13 00:00:00','2003-11-22 00:00:00','2003-11-15 00:00:00','Shipped','We need to keep in close contact with their Marketing VP. He is the decision maker for all their purchases.',339,'2003-11-13',4,11,2003), (10183,'S32_3522',49,'64.6400000',4,3167.36,'2003-11-13 00:00:00','2003-11-22 00:00:00','2003-11-15 00:00:00','Shipped','We need to keep in close contact with their Marketing VP. He is the decision maker for all their purchases.',339,'2003-11-13',4,11,2003), (10183,'S700_2824',23,'86.9900000',3,2000.77,'2003-11-13 00:00:00','2003-11-22 00:00:00','2003-11-15 00:00:00','Shipped','We need to keep in close contact with their Marketing VP. He is the decision maker for all their purchases.',339,'2003-11-13',4,11,2003), (10184,'S12_4473',37,'100.0000000',6,4516.22,'2003-11-14 00:00:00','2003-11-22 00:00:00','2003-11-20 00:00:00','Shipped',NULL,484,'2003-11-14',4,11,2003), (10184,'S18_2238',46,'100.0000000',5,7381.16,'2003-11-14 00:00:00','2003-11-22 00:00:00','2003-11-20 00:00:00','Shipped',NULL,484,'2003-11-14',4,11,2003), (10184,'S18_2319',46,'100.0000000',9,5984.14,'2003-11-14 00:00:00','2003-11-22 00:00:00','2003-11-20 00:00:00','Shipped',NULL,484,'2003-11-14',4,11,2003), (10184,'S18_2432',44,'60.1600000',12,2647.04,'2003-11-14 00:00:00','2003-11-22 00:00:00','2003-11-20 00:00:00','Shipped',NULL,484,'2003-11-14',4,11,2003), (10184,'S18_3232',28,'100.0000000',10,4409.72,'2003-11-14 00:00:00','2003-11-22 00:00:00','2003-11-20 00:00:00','Shipped',NULL,484,'2003-11-14',4,11,2003), (10184,'S24_1444',31,'60.1100000',3,1863.41,'2003-11-14 00:00:00','2003-11-22 00:00:00','2003-11-20 00:00:00','Shipped',NULL,484,'2003-11-14',4,11,2003), (10184,'S24_2300',24,'100.0000000',11,3496.32,'2003-11-14 00:00:00','2003-11-22 00:00:00','2003-11-20 00:00:00','Shipped',NULL,484,'2003-11-14',4,11,2003), (10184,'S24_2840',42,'31.8200000',7,1336.44,'2003-11-14 00:00:00','2003-11-22 00:00:00','2003-11-20 00:00:00','Shipped',NULL,484,'2003-11-14',4,11,2003), (10184,'S24_4048',49,'100.0000000',2,5795.72,'2003-11-14 00:00:00','2003-11-22 00:00:00','2003-11-20 00:00:00','Shipped',NULL,484,'2003-11-14',4,11,2003), (10184,'S32_1268',46,'100.0000000',13,4607.36,'2003-11-14 00:00:00','2003-11-22 00:00:00','2003-11-20 00:00:00','Shipped',NULL,484,'2003-11-14',4,11,2003), (10184,'S32_2509',33,'62.7700000',8,2071.41,'2003-11-14 00:00:00','2003-11-22 00:00:00','2003-11-20 00:00:00','Shipped',NULL,484,'2003-11-14',4,11,2003), (10184,'S32_3207',48,'50.9500000',1,2445.6,'2003-11-14 00:00:00','2003-11-22 00:00:00','2003-11-20 00:00:00','Shipped',NULL,484,'2003-11-14',4,11,2003), (10184,'S50_1392',45,'100.0000000',4,4948.2,'2003-11-14 00:00:00','2003-11-22 00:00:00','2003-11-20 00:00:00','Shipped',NULL,484,'2003-11-14',4,11,2003), (10185,'S12_1108',21,'100.0000000',13,3883.74,'2003-11-14 00:00:00','2003-11-21 00:00:00','2003-11-20 00:00:00','Shipped',NULL,320,'2003-11-14',4,11,2003), (10185,'S12_3148',33,'100.0000000',14,4038.21,'2003-11-14 00:00:00','2003-11-21 00:00:00','2003-11-20 00:00:00','Shipped',NULL,320,'2003-11-14',4,11,2003), (10185,'S12_3891',43,'100.0000000',12,7886.2,'2003-11-14 00:00:00','2003-11-21 00:00:00','2003-11-20 00:00:00','Shipped',NULL,320,'2003-11-14',4,11,2003), (10185,'S18_3140',28,'100.0000000',9,3442.04,'2003-11-14 00:00:00','2003-11-21 00:00:00','2003-11-20 00:00:00','Shipped',NULL,320,'2003-11-14',4,11,2003), (10185,'S18_3259',49,'80.6700000',11,3952.83,'2003-11-14 00:00:00','2003-11-21 00:00:00','2003-11-20 00:00:00','Shipped',NULL,320,'2003-11-14',4,11,2003), (10185,'S18_4027',39,'100.0000000',16,5096.91,'2003-11-14 00:00:00','2003-11-21 00:00:00','2003-11-20 00:00:00','Shipped',NULL,320,'2003-11-14',4,11,2003), (10185,'S18_4522',47,'77.2400000',8,3630.28,'2003-11-14 00:00:00','2003-11-21 00:00:00','2003-11-20 00:00:00','Shipped',NULL,320,'2003-11-14',4,11,2003), (10185,'S24_2011',30,'100.0000000',7,3170.7,'2003-11-14 00:00:00','2003-11-21 00:00:00','2003-11-20 00:00:00','Shipped',NULL,320,'2003-11-14',4,11,2003), (10185,'S24_3151',33,'74.3500000',2,2453.55,'2003-11-14 00:00:00','2003-11-21 00:00:00','2003-11-20 00:00:00','Shipped',NULL,320,'2003-11-14',4,11,2003), (10185,'S50_1514',20,'48.6200000',15,972.4,'2003-11-14 00:00:00','2003-11-21 00:00:00','2003-11-20 00:00:00','Shipped',NULL,320,'2003-11-14',4,11,2003), (10185,'S700_1138',21,'54.0000000',3,1134,'2003-11-14 00:00:00','2003-11-21 00:00:00','2003-11-20 00:00:00','Shipped',NULL,320,'2003-11-14',4,11,2003), (10185,'S700_1938',30,'94.4000000',10,2832,'2003-11-14 00:00:00','2003-11-21 00:00:00','2003-11-20 00:00:00','Shipped',NULL,320,'2003-11-14',4,11,2003), (10185,'S700_2610',39,'57.8200000',1,2254.98,'2003-11-14 00:00:00','2003-11-21 00:00:00','2003-11-20 00:00:00','Shipped',NULL,320,'2003-11-14',4,11,2003), (10185,'S700_3505',37,'100.0000000',4,3891.66,'2003-11-14 00:00:00','2003-11-21 00:00:00','2003-11-20 00:00:00','Shipped',NULL,320,'2003-11-14',4,11,2003), (10185,'S700_3962',22,'79.4500000',5,1747.9,'2003-11-14 00:00:00','2003-11-21 00:00:00','2003-11-20 00:00:00','Shipped',NULL,320,'2003-11-14',4,11,2003), (10185,'S72_3212',28,'64.4300000',6,1804.04,'2003-11-14 00:00:00','2003-11-21 00:00:00','2003-11-20 00:00:00','Shipped',NULL,320,'2003-11-14',4,11,2003), (10186,'S10_4757',26,'100.0000000',9,3854.24,'2003-11-14 00:00:00','2003-11-20 00:00:00','2003-11-18 00:00:00','Shipped','They want to reevaluate their terms agreement with the VP of Sales',489,'2003-11-14',4,11,2003), (10186,'S18_1662',32,'100.0000000',1,6004.8,'2003-11-14 00:00:00','2003-11-20 00:00:00','2003-11-18 00:00:00','Shipped','They want to reevaluate their terms agreement with the VP of Sales',489,'2003-11-14',4,11,2003), (10186,'S18_3029',32,'89.4600000',7,2862.72,'2003-11-14 00:00:00','2003-11-20 00:00:00','2003-11-18 00:00:00','Shipped','They want to reevaluate their terms agreement with the VP of Sales',489,'2003-11-14',4,11,2003), (10186,'S18_3856',46,'100.0000000',6,4918.78,'2003-11-14 00:00:00','2003-11-20 00:00:00','2003-11-18 00:00:00','Shipped','They want to reevaluate their terms agreement with the VP of Sales',489,'2003-11-14',4,11,2003), (10186,'S24_2841',22,'69.2000000',2,1522.4,'2003-11-14 00:00:00','2003-11-20 00:00:00','2003-11-18 00:00:00','Shipped','They want to reevaluate their terms agreement with the VP of Sales',489,'2003-11-14',4,11,2003), (10186,'S24_3420',21,'69.0400000',3,1449.84,'2003-11-14 00:00:00','2003-11-20 00:00:00','2003-11-18 00:00:00','Shipped','They want to reevaluate their terms agreement with the VP of Sales',489,'2003-11-14',4,11,2003), (10186,'S24_3816',36,'85.5400000',8,3079.44,'2003-11-14 00:00:00','2003-11-20 00:00:00','2003-11-18 00:00:00','Shipped','They want to reevaluate their terms agreement with the VP of Sales',489,'2003-11-14',4,11,2003), (10186,'S700_2047',24,'99.5700000',5,2389.68,'2003-11-14 00:00:00','2003-11-20 00:00:00','2003-11-18 00:00:00','Shipped','They want to reevaluate their terms agreement with the VP of Sales',489,'2003-11-14',4,11,2003), (10186,'S72_1253',28,'52.1400000',4,1459.92,'2003-11-14 00:00:00','2003-11-20 00:00:00','2003-11-18 00:00:00','Shipped','They want to reevaluate their terms agreement with the VP of Sales',489,'2003-11-14',4,11,2003), (10187,'S18_2581',45,'93.7700000',1,4219.65,'2003-11-15 00:00:00','2003-11-24 00:00:00','2003-11-16 00:00:00','Shipped',NULL,211,'2003-11-15',4,11,2003), (10187,'S24_1785',46,'95.2000000',3,4379.2,'2003-11-15 00:00:00','2003-11-24 00:00:00','2003-11-16 00:00:00','Shipped',NULL,211,'2003-11-15',4,11,2003), (10187,'S24_3949',43,'58.0000000',10,2494,'2003-11-15 00:00:00','2003-11-24 00:00:00','2003-11-16 00:00:00','Shipped',NULL,211,'2003-11-15',4,11,2003), (10187,'S24_4278',33,'59.4100000',2,1960.53,'2003-11-15 00:00:00','2003-11-24 00:00:00','2003-11-16 00:00:00','Shipped',NULL,211,'2003-11-15',4,11,2003), (10187,'S32_4289',31,'60.5400000',4,1876.74,'2003-11-15 00:00:00','2003-11-24 00:00:00','2003-11-16 00:00:00','Shipped',NULL,211,'2003-11-15',4,11,2003), (10187,'S50_1341',41,'38.8400000',5,1592.44,'2003-11-15 00:00:00','2003-11-24 00:00:00','2003-11-16 00:00:00','Shipped',NULL,211,'2003-11-15',4,11,2003), (10187,'S700_1691',34,'92.2500000',6,3136.5,'2003-11-15 00:00:00','2003-11-24 00:00:00','2003-11-16 00:00:00','Shipped',NULL,211,'2003-11-15',4,11,2003), (10187,'S700_2466',44,'100.0000000',8,4650.8,'2003-11-15 00:00:00','2003-11-24 00:00:00','2003-11-16 00:00:00','Shipped',NULL,211,'2003-11-15',4,11,2003), (10187,'S700_3167',34,'88.0000000',7,2992,'2003-11-15 00:00:00','2003-11-24 00:00:00','2003-11-16 00:00:00','Shipped',NULL,211,'2003-11-15',4,11,2003), (10187,'S700_4002',44,'71.8100000',9,3159.64,'2003-11-15 00:00:00','2003-11-24 00:00:00','2003-11-16 00:00:00','Shipped',NULL,211,'2003-11-15',4,11,2003), (10188,'S10_1678',48,'100.0000000',1,5512.32,'2003-11-18 00:00:00','2003-11-26 00:00:00','2003-11-24 00:00:00','Shipped',NULL,167,'2003-11-18',4,11,2003), (10188,'S10_2016',38,'96.3400000',4,3660.92,'2003-11-18 00:00:00','2003-11-26 00:00:00','2003-11-24 00:00:00','Shipped',NULL,167,'2003-11-18',4,11,2003), (10188,'S10_4698',45,'100.0000000',3,8714.7,'2003-11-18 00:00:00','2003-11-26 00:00:00','2003-11-24 00:00:00','Shipped',NULL,167,'2003-11-18',4,11,2003), (10188,'S18_2625',32,'65.4200000',5,2093.44,'2003-11-18 00:00:00','2003-11-26 00:00:00','2003-11-24 00:00:00','Shipped',NULL,167,'2003-11-18',4,11,2003), (10188,'S24_1578',25,'100.0000000',2,2535.75,'2003-11-18 00:00:00','2003-11-26 00:00:00','2003-11-24 00:00:00','Shipped',NULL,167,'2003-11-18',4,11,2003), (10188,'S24_2000',40,'91.4000000',6,3656,'2003-11-18 00:00:00','2003-11-26 00:00:00','2003-11-24 00:00:00','Shipped',NULL,167,'2003-11-18',4,11,2003), (10188,'S32_1374',44,'98.8900000',7,4351.16,'2003-11-18 00:00:00','2003-11-26 00:00:00','2003-11-24 00:00:00','Shipped',NULL,167,'2003-11-18',4,11,2003), (10188,'S700_2834',29,'100.0000000',8,3957.05,'2003-11-18 00:00:00','2003-11-26 00:00:00','2003-11-24 00:00:00','Shipped',NULL,167,'2003-11-18',4,11,2003), (10189,'S12_2823',28,'100.0000000',1,4512.48,'2003-11-18 00:00:00','2003-11-25 00:00:00','2003-11-24 00:00:00','Shipped','They want to reevaluate their terms agreement with Finance.',205,'2003-11-18',4,11,2003), (10190,'S24_2360',42,'76.1900000',3,3199.98,'2003-11-19 00:00:00','2003-11-29 00:00:00','2003-11-20 00:00:00','Shipped',NULL,141,'2003-11-19',4,11,2003), (10190,'S32_2206',46,'32.9900000',1,1517.54,'2003-11-19 00:00:00','2003-11-29 00:00:00','2003-11-20 00:00:00','Shipped',NULL,141,'2003-11-19',4,11,2003), (10190,'S32_4485',42,'85.7200000',4,3600.24,'2003-11-19 00:00:00','2003-11-29 00:00:00','2003-11-20 00:00:00','Shipped',NULL,141,'2003-11-19',4,11,2003), (10190,'S50_4713',40,'66.7200000',2,2668.8,'2003-11-19 00:00:00','2003-11-29 00:00:00','2003-11-20 00:00:00','Shipped',NULL,141,'2003-11-19',4,11,2003), (10191,'S12_1099',21,'100.0000000',3,3840.9,'2003-11-20 00:00:00','2003-11-30 00:00:00','2003-11-24 00:00:00','Shipped','We must be cautions with this customer. Their VP of Sales resigned. Company may be heading down.',259,'2003-11-20',4,11,2003), (10191,'S12_3380',40,'100.0000000',1,5590,'2003-11-20 00:00:00','2003-11-30 00:00:00','2003-11-24 00:00:00','Shipped','We must be cautions with this customer. Their VP of Sales resigned. Company may be heading down.',259,'2003-11-20',4,11,2003), (10191,'S12_3990',30,'64.6400000',4,1939.2,'2003-11-20 00:00:00','2003-11-30 00:00:00','2003-11-24 00:00:00','Shipped','We must be cautions with this customer. Their VP of Sales resigned. Company may be heading down.',259,'2003-11-20',4,11,2003), (10191,'S18_3278',36,'94.8800000',6,3415.68,'2003-11-20 00:00:00','2003-11-30 00:00:00','2003-11-24 00:00:00','Shipped','We must be cautions with this customer. Their VP of Sales resigned. Company may be heading down.',259,'2003-11-20',4,11,2003), (10191,'S18_3482',23,'100.0000000',5,3414.58,'2003-11-20 00:00:00','2003-11-30 00:00:00','2003-11-24 00:00:00','Shipped','We must be cautions with this customer. Their VP of Sales resigned. Company may be heading down.',259,'2003-11-20',4,11,2003), (10191,'S18_3782',43,'72.7400000',9,3127.82,'2003-11-20 00:00:00','2003-11-30 00:00:00','2003-11-24 00:00:00','Shipped','We must be cautions with this customer. Their VP of Sales resigned. Company may be heading down.',259,'2003-11-20',4,11,2003), (10191,'S18_4721',32,'100.0000000',8,4237.76,'2003-11-20 00:00:00','2003-11-30 00:00:00','2003-11-24 00:00:00','Shipped','We must be cautions with this customer. Their VP of Sales resigned. Company may be heading down.',259,'2003-11-20',4,11,2003), (10191,'S24_3371',48,'60.0100000',2,2880.48,'2003-11-20 00:00:00','2003-11-30 00:00:00','2003-11-24 00:00:00','Shipped','We must be cautions with this customer. Their VP of Sales resigned. Company may be heading down.',259,'2003-11-20',4,11,2003), (10191,'S24_4620',44,'66.2900000',7,2916.76,'2003-11-20 00:00:00','2003-11-30 00:00:00','2003-11-24 00:00:00','Shipped','We must be cautions with this customer. Their VP of Sales resigned. Company may be heading down.',259,'2003-11-20',4,11,2003), (10192,'S12_4675',27,'100.0000000',16,3544.56,'2003-11-20 00:00:00','2003-11-29 00:00:00','2003-11-25 00:00:00','Shipped',NULL,363,'2003-11-20',4,11,2003), (10192,'S18_1129',22,'100.0000000',11,3300.66,'2003-11-20 00:00:00','2003-11-29 00:00:00','2003-11-25 00:00:00','Shipped',NULL,363,'2003-11-20',4,11,2003), (10192,'S18_1589',29,'100.0000000',7,4258.36,'2003-11-20 00:00:00','2003-11-29 00:00:00','2003-11-25 00:00:00','Shipped',NULL,363,'2003-11-20',4,11,2003), (10192,'S18_1889',45,'90.8600000',15,4088.7,'2003-11-20 00:00:00','2003-11-29 00:00:00','2003-11-25 00:00:00','Shipped',NULL,363,'2003-11-20',4,11,2003), (10192,'S18_1984',47,'100.0000000',10,7421.3,'2003-11-20 00:00:00','2003-11-29 00:00:00','2003-11-25 00:00:00','Shipped',NULL,363,'2003-11-20',4,11,2003), (10192,'S18_2870',38,'100.0000000',8,4965.84,'2003-11-20 00:00:00','2003-11-29 00:00:00','2003-11-25 00:00:00','Shipped',NULL,363,'2003-11-20',4,11,2003), (10192,'S18_3232',26,'100.0000000',12,3918.46,'2003-11-20 00:00:00','2003-11-29 00:00:00','2003-11-25 00:00:00','Shipped',NULL,363,'2003-11-20',4,11,2003), (10192,'S18_3685',45,'100.0000000',9,5340.6,'2003-11-20 00:00:00','2003-11-29 00:00:00','2003-11-25 00:00:00','Shipped',NULL,363,'2003-11-20',4,11,2003), (10192,'S24_1046',37,'69.8200000',4,2583.34,'2003-11-20 00:00:00','2003-11-29 00:00:00','2003-11-25 00:00:00','Shipped',NULL,363,'2003-11-20',4,11,2003), (10192,'S24_1628',47,'53.8300000',6,2530.01,'2003-11-20 00:00:00','2003-11-29 00:00:00','2003-11-25 00:00:00','Shipped',NULL,363,'2003-11-20',4,11,2003), (10192,'S24_2766',46,'83.6000000',2,3845.6,'2003-11-20 00:00:00','2003-11-29 00:00:00','2003-11-25 00:00:00','Shipped',NULL,363,'2003-11-20',4,11,2003), (10192,'S24_2887',23,'100.0000000',1,3052.33,'2003-11-20 00:00:00','2003-11-29 00:00:00','2003-11-25 00:00:00','Shipped',NULL,363,'2003-11-20',4,11,2003), (10192,'S24_2972',30,'30.5900000',13,917.7,'2003-11-20 00:00:00','2003-11-29 00:00:00','2003-11-25 00:00:00','Shipped',NULL,363,'2003-11-20',4,11,2003), (10192,'S24_3191',32,'72.7700000',3,2328.64,'2003-11-20 00:00:00','2003-11-29 00:00:00','2003-11-25 00:00:00','Shipped',NULL,363,'2003-11-20',4,11,2003), (10192,'S24_3432',46,'100.0000000',5,5566,'2003-11-20 00:00:00','2003-11-29 00:00:00','2003-11-25 00:00:00','Shipped',NULL,363,'2003-11-20',4,11,2003), (10192,'S24_3856',45,'100.0000000',14,6319.35,'2003-11-20 00:00:00','2003-11-29 00:00:00','2003-11-25 00:00:00','Shipped',NULL,363,'2003-11-20',4,11,2003), (10193,'S18_1342',28,'100.0000000',7,3106.88,'2003-11-21 00:00:00','2003-11-28 00:00:00','2003-11-27 00:00:00','Shipped',NULL,471,'2003-11-21',4,11,2003), (10193,'S18_1367',46,'53.3700000',6,2455.02,'2003-11-21 00:00:00','2003-11-28 00:00:00','2003-11-27 00:00:00','Shipped',NULL,471,'2003-11-21',4,11,2003), (10193,'S18_1749',21,'100.0000000',14,3141.6,'2003-11-21 00:00:00','2003-11-28 00:00:00','2003-11-27 00:00:00','Shipped',NULL,471,'2003-11-21',4,11,2003), (10193,'S18_2248',42,'59.3300000',13,2491.86,'2003-11-21 00:00:00','2003-11-28 00:00:00','2003-11-27 00:00:00','Shipped',NULL,471,'2003-11-21',4,11,2003), (10193,'S18_2325',44,'100.0000000',11,4642.88,'2003-11-21 00:00:00','2003-11-28 00:00:00','2003-11-27 00:00:00','Shipped',NULL,471,'2003-11-21',4,11,2003), (10193,'S18_2795',22,'100.0000000',8,3675.32,'2003-11-21 00:00:00','2003-11-28 00:00:00','2003-11-27 00:00:00','Shipped',NULL,471,'2003-11-21',4,11,2003), (10193,'S18_2949',28,'93.2100000',1,2609.88,'2003-11-21 00:00:00','2003-11-28 00:00:00','2003-11-27 00:00:00','Shipped',NULL,471,'2003-11-21',4,11,2003), (10193,'S18_2957',24,'51.8400000',3,1244.16,'2003-11-21 00:00:00','2003-11-28 00:00:00','2003-11-27 00:00:00','Shipped',NULL,471,'2003-11-21',4,11,2003), (10193,'S18_3136',23,'100.0000000',2,2769.89,'2003-11-21 00:00:00','2003-11-28 00:00:00','2003-11-27 00:00:00','Shipped',NULL,471,'2003-11-21',4,11,2003), (10193,'S18_3320',32,'79.3700000',5,2539.84,'2003-11-21 00:00:00','2003-11-28 00:00:00','2003-11-27 00:00:00','Shipped',NULL,471,'2003-11-21',4,11,2003), (10193,'S18_4409',24,'97.5500000',15,2341.2,'2003-11-21 00:00:00','2003-11-28 00:00:00','2003-11-27 00:00:00','Shipped',NULL,471,'2003-11-21',4,11,2003), (10193,'S18_4933',25,'76.2600000',16,1906.5,'2003-11-21 00:00:00','2003-11-28 00:00:00','2003-11-27 00:00:00','Shipped',NULL,471,'2003-11-21',4,11,2003), (10193,'S24_1937',26,'29.2100000',10,759.46,'2003-11-21 00:00:00','2003-11-28 00:00:00','2003-11-27 00:00:00','Shipped',NULL,471,'2003-11-21',4,11,2003), (10193,'S24_2022',20,'50.6200000',9,1012.4,'2003-11-21 00:00:00','2003-11-28 00:00:00','2003-11-27 00:00:00','Shipped',NULL,471,'2003-11-21',4,11,2003), (10193,'S24_3969',22,'41.0300000',12,902.66,'2003-11-21 00:00:00','2003-11-28 00:00:00','2003-11-27 00:00:00','Shipped',NULL,471,'2003-11-21',4,11,2003), (10193,'S24_4258',20,'100.0000000',4,2279,'2003-11-21 00:00:00','2003-11-28 00:00:00','2003-11-27 00:00:00','Shipped',NULL,471,'2003-11-21',4,11,2003), (10194,'S10_1949',42,'100.0000000',11,7290.36,'2003-11-25 00:00:00','2003-12-02 00:00:00','2003-11-26 00:00:00','Shipped',NULL,146,'2003-11-25',4,11,2003), (10194,'S10_4962',26,'100.0000000',4,4263.74,'2003-11-25 00:00:00','2003-12-02 00:00:00','2003-11-26 00:00:00','Shipped',NULL,146,'2003-11-25',4,11,2003), (10194,'S12_1666',38,'100.0000000',8,4933.92,'2003-11-25 00:00:00','2003-12-02 00:00:00','2003-11-26 00:00:00','Shipped',NULL,146,'2003-11-25',4,11,2003), (10194,'S18_1097',21,'93.3400000',10,1960.14,'2003-11-25 00:00:00','2003-12-02 00:00:00','2003-11-26 00:00:00','Shipped',NULL,146,'2003-11-25',4,11,2003), (10194,'S18_2432',45,'70.4900000',2,3172.05,'2003-11-25 00:00:00','2003-12-02 00:00:00','2003-11-26 00:00:00','Shipped',NULL,146,'2003-11-25',4,11,2003), (10194,'S18_4600',32,'100.0000000',5,4262.08,'2003-11-25 00:00:00','2003-12-02 00:00:00','2003-11-26 00:00:00','Shipped',NULL,146,'2003-11-25',4,11,2003), (10194,'S18_4668',41,'44.7800000',9,1835.98,'2003-11-25 00:00:00','2003-12-02 00:00:00','2003-11-26 00:00:00','Shipped',NULL,146,'2003-11-25',4,11,2003), (10194,'S24_2300',49,'100.0000000',1,5760.93,'2003-11-25 00:00:00','2003-12-02 00:00:00','2003-11-26 00:00:00','Shipped',NULL,146,'2003-11-25',4,11,2003), (10194,'S32_1268',37,'97.2700000',3,3598.99,'2003-11-25 00:00:00','2003-12-02 00:00:00','2003-11-26 00:00:00','Shipped',NULL,146,'2003-11-25',4,11,2003), (10194,'S32_3522',39,'54.9400000',7,2142.66,'2003-11-25 00:00:00','2003-12-02 00:00:00','2003-11-26 00:00:00','Shipped',NULL,146,'2003-11-25',4,11,2003), (10194,'S700_2824',26,'89.0100000',6,2314.26,'2003-11-25 00:00:00','2003-12-02 00:00:00','2003-11-26 00:00:00','Shipped',NULL,146,'2003-11-25',4,11,2003), (10195,'S12_4473',49,'100.0000000',6,6445.46,'2003-11-25 00:00:00','2003-12-01 00:00:00','2003-11-28 00:00:00','Shipped',NULL,319,'2003-11-25',4,11,2003), (10195,'S18_2238',27,'100.0000000',5,5128.11,'2003-11-25 00:00:00','2003-12-01 00:00:00','2003-11-28 00:00:00','Shipped',NULL,319,'2003-11-25',4,11,2003), (10195,'S18_2319',35,'100.0000000',9,3608.15,'2003-11-25 00:00:00','2003-12-01 00:00:00','2003-11-28 00:00:00','Shipped',NULL,319,'2003-11-25',4,11,2003), (10195,'S18_3232',50,'100.0000000',10,7620.5,'2003-11-25 00:00:00','2003-12-01 00:00:00','2003-11-28 00:00:00','Shipped',NULL,319,'2003-11-25',4,11,2003), (10195,'S24_1444',44,'66.4700000',3,2924.68,'2003-11-25 00:00:00','2003-12-01 00:00:00','2003-11-28 00:00:00','Shipped',NULL,319,'2003-11-25',4,11,2003), (10195,'S24_2840',32,'28.2900000',7,905.28,'2003-11-25 00:00:00','2003-12-01 00:00:00','2003-11-28 00:00:00','Shipped',NULL,319,'2003-11-25',4,11,2003), (10195,'S24_4048',34,'100.0000000',2,3699.88,'2003-11-25 00:00:00','2003-12-01 00:00:00','2003-11-28 00:00:00','Shipped',NULL,319,'2003-11-25',4,11,2003), (10195,'S32_2509',32,'43.2900000',8,1385.28,'2003-11-25 00:00:00','2003-12-01 00:00:00','2003-11-28 00:00:00','Shipped',NULL,319,'2003-11-25',4,11,2003), (10195,'S32_3207',33,'54.6800000',1,1804.44,'2003-11-25 00:00:00','2003-12-01 00:00:00','2003-11-28 00:00:00','Shipped',NULL,319,'2003-11-25',4,11,2003), (10195,'S50_1392',49,'100.0000000',4,5161.17,'2003-11-25 00:00:00','2003-12-01 00:00:00','2003-11-28 00:00:00','Shipped',NULL,319,'2003-11-25',4,11,2003), (10196,'S12_1108',47,'100.0000000',5,8887.7,'2003-11-26 00:00:00','2003-12-03 00:00:00','2003-12-01 00:00:00','Shipped',NULL,455,'2003-11-26',4,11,2003), (10196,'S12_3148',24,'100.0000000',6,3807.12,'2003-11-26 00:00:00','2003-12-03 00:00:00','2003-12-01 00:00:00','Shipped',NULL,455,'2003-11-26',4,11,2003), (10196,'S12_3891',38,'100.0000000',4,7232.16,'2003-11-26 00:00:00','2003-12-03 00:00:00','2003-12-01 00:00:00','Shipped',NULL,455,'2003-11-26',4,11,2003), (10196,'S18_3140',49,'100.0000000',1,6893.81,'2003-11-26 00:00:00','2003-12-03 00:00:00','2003-12-01 00:00:00','Shipped',NULL,455,'2003-11-26',4,11,2003), (10196,'S18_3259',35,'100.0000000',3,3564.75,'2003-11-26 00:00:00','2003-12-03 00:00:00','2003-12-01 00:00:00','Shipped',NULL,455,'2003-11-26',4,11,2003), (10196,'S18_4027',27,'100.0000000',8,4537.08,'2003-11-26 00:00:00','2003-12-03 00:00:00','2003-12-01 00:00:00','Shipped',NULL,455,'2003-11-26',4,11,2003), (10196,'S50_1514',46,'62.0900000',7,2856.14,'2003-11-26 00:00:00','2003-12-03 00:00:00','2003-12-01 00:00:00','Shipped',NULL,455,'2003-11-26',4,11,2003), (10196,'S700_1938',50,'94.4000000',2,4720,'2003-11-26 00:00:00','2003-12-03 00:00:00','2003-12-01 00:00:00','Shipped',NULL,455,'2003-11-26',4,11,2003), (10197,'S10_4757',45,'100.0000000',6,5324.4,'2003-11-26 00:00:00','2003-12-02 00:00:00','2003-12-01 00:00:00','Shipped','Customer inquired about remote controlled models and gold models.',216,'2003-11-26',4,11,2003), (10197,'S18_3029',46,'87.7400000',4,4036.04,'2003-11-26 00:00:00','2003-12-02 00:00:00','2003-12-01 00:00:00','Shipped','Customer inquired about remote controlled models and gold models.',216,'2003-11-26',4,11,2003), (10197,'S18_3856',22,'100.0000000',3,2538.8,'2003-11-26 00:00:00','2003-12-02 00:00:00','2003-12-01 00:00:00','Shipped','Customer inquired about remote controlled models and gold models.',216,'2003-11-26',4,11,2003), (10197,'S18_4522',50,'100.0000000',14,5090.5,'2003-11-26 00:00:00','2003-12-02 00:00:00','2003-12-01 00:00:00','Shipped','Customer inquired about remote controlled models and gold models.',216,'2003-11-26',4,11,2003), (10197,'S24_2011',41,'100.0000000',13,4534.6,'2003-11-26 00:00:00','2003-12-02 00:00:00','2003-12-01 00:00:00','Shipped','Customer inquired about remote controlled models and gold models.',216,'2003-11-26',4,11,2003), (10197,'S24_3151',47,'83.2000000',8,3910.4,'2003-11-26 00:00:00','2003-12-02 00:00:00','2003-12-01 00:00:00','Shipped','Customer inquired about remote controlled models and gold models.',216,'2003-11-26',4,11,2003), (10197,'S24_3816',22,'86.3800000',5,1900.36,'2003-11-26 00:00:00','2003-12-02 00:00:00','2003-12-01 00:00:00','Shipped','Customer inquired about remote controlled models and gold models.',216,'2003-11-26',4,11,2003), (10197,'S700_1138',23,'64.6700000',9,1487.41,'2003-11-26 00:00:00','2003-12-02 00:00:00','2003-12-01 00:00:00','Shipped','Customer inquired about remote controlled models and gold models.',216,'2003-11-26',4,11,2003), (10197,'S700_2047',24,'90.5200000',2,2172.48,'2003-11-26 00:00:00','2003-12-02 00:00:00','2003-12-01 00:00:00','Shipped','Customer inquired about remote controlled models and gold models.',216,'2003-11-26',4,11,2003), (10197,'S700_2610',50,'78.7900000',7,3939.5,'2003-11-26 00:00:00','2003-12-02 00:00:00','2003-12-01 00:00:00','Shipped','Customer inquired about remote controlled models and gold models.',216,'2003-11-26',4,11,2003), (10197,'S700_3505',27,'92.1600000',10,2488.32,'2003-11-26 00:00:00','2003-12-02 00:00:00','2003-12-01 00:00:00','Shipped','Customer inquired about remote controlled models and gold models.',216,'2003-11-26',4,11,2003), (10197,'S700_3962',35,'93.3500000',11,3267.25,'2003-11-26 00:00:00','2003-12-02 00:00:00','2003-12-01 00:00:00','Shipped','Customer inquired about remote controlled models and gold models.',216,'2003-11-26',4,11,2003), (10197,'S72_1253',29,'41.7100000',1,1209.59,'2003-11-26 00:00:00','2003-12-02 00:00:00','2003-12-01 00:00:00','Shipped','Customer inquired about remote controlled models and gold models.',216,'2003-11-26',4,11,2003), (10197,'S72_3212',42,'50.2300000',12,2109.66,'2003-11-26 00:00:00','2003-12-02 00:00:00','2003-12-01 00:00:00','Shipped','Customer inquired about remote controlled models and gold models.',216,'2003-11-26',4,11,2003), (10198,'S18_1662',42,'100.0000000',4,7483.98,'2003-11-27 00:00:00','2003-12-06 00:00:00','2003-12-03 00:00:00','Shipped',NULL,385,'2003-11-27',4,11,2003), (10198,'S24_2841',48,'67.8200000',5,3255.36,'2003-11-27 00:00:00','2003-12-06 00:00:00','2003-12-03 00:00:00','Shipped',NULL,385,'2003-11-27',4,11,2003), (10198,'S24_3420',27,'71.6700000',6,1935.09,'2003-11-27 00:00:00','2003-12-06 00:00:00','2003-12-03 00:00:00','Shipped',NULL,385,'2003-11-27',4,11,2003), (10198,'S24_3949',43,'66.1900000',3,2846.17,'2003-11-27 00:00:00','2003-12-06 00:00:00','2003-12-03 00:00:00','Shipped',NULL,385,'2003-11-27',4,11,2003), (10198,'S700_2466',42,'100.0000000',1,4774.56,'2003-11-27 00:00:00','2003-12-06 00:00:00','2003-12-03 00:00:00','Shipped',NULL,385,'2003-11-27',4,11,2003), (10198,'S700_4002',40,'63.6700000',2,2546.8,'2003-11-27 00:00:00','2003-12-06 00:00:00','2003-12-03 00:00:00','Shipped',NULL,385,'2003-11-27',4,11,2003), (10199,'S50_1341',29,'38.4000000',1,1113.6,'2003-12-01 00:00:00','2003-12-10 00:00:00','2003-12-06 00:00:00','Shipped',NULL,475,'2003-12-01',4,12,2003), (10199,'S700_1691',48,'83.1200000',2,3989.76,'2003-12-01 00:00:00','2003-12-10 00:00:00','2003-12-06 00:00:00','Shipped',NULL,475,'2003-12-01',4,12,2003), (10199,'S700_3167',38,'82.4000000',3,3131.2,'2003-12-01 00:00:00','2003-12-10 00:00:00','2003-12-06 00:00:00','Shipped',NULL,475,'2003-12-01',4,12,2003), (10200,'S18_2581',28,'92.9300000',3,2602.04,'2003-12-01 00:00:00','2003-12-09 00:00:00','2003-12-06 00:00:00','Shipped',NULL,211,'2003-12-01',4,12,2003), (10200,'S24_1785',33,'98.4800000',5,3249.84,'2003-12-01 00:00:00','2003-12-09 00:00:00','2003-12-06 00:00:00','Shipped',NULL,211,'2003-12-01',4,12,2003), (10200,'S24_4278',39,'72.4500000',4,2825.55,'2003-12-01 00:00:00','2003-12-09 00:00:00','2003-12-06 00:00:00','Shipped',NULL,211,'2003-12-01',4,12,2003), (10200,'S32_1374',35,'100.0000000',1,3845.8,'2003-12-01 00:00:00','2003-12-09 00:00:00','2003-12-06 00:00:00','Shipped',NULL,211,'2003-12-01',4,12,2003), (10200,'S32_4289',27,'67.4100000',6,1820.07,'2003-12-01 00:00:00','2003-12-09 00:00:00','2003-12-06 00:00:00','Shipped',NULL,211,'2003-12-01',4,12,2003), (10200,'S700_2834',39,'100.0000000',2,3979.56,'2003-12-01 00:00:00','2003-12-09 00:00:00','2003-12-06 00:00:00','Shipped',NULL,211,'2003-12-01',4,12,2003), (10201,'S10_1678',22,'98.5700000',2,2168.54,'2003-12-01 00:00:00','2003-12-11 00:00:00','2003-12-02 00:00:00','Shipped',NULL,129,'2003-12-01',4,12,2003), (10201,'S10_2016',24,'100.0000000',5,3025.92,'2003-12-01 00:00:00','2003-12-11 00:00:00','2003-12-02 00:00:00','Shipped',NULL,129,'2003-12-01',4,12,2003), (10201,'S10_4698',49,'100.0000000',4,8065.89,'2003-12-01 00:00:00','2003-12-11 00:00:00','2003-12-02 00:00:00','Shipped',NULL,129,'2003-12-01',4,12,2003), (10201,'S12_2823',25,'100.0000000',1,4029,'2003-12-01 00:00:00','2003-12-11 00:00:00','2003-12-02 00:00:00','Shipped',NULL,129,'2003-12-01',4,12,2003), (10201,'S18_2625',30,'64.8100000',6,1944.3,'2003-12-01 00:00:00','2003-12-11 00:00:00','2003-12-02 00:00:00','Shipped',NULL,129,'2003-12-01',4,12,2003), (10201,'S24_1578',39,'100.0000000',3,4351.23,'2003-12-01 00:00:00','2003-12-11 00:00:00','2003-12-02 00:00:00','Shipped',NULL,129,'2003-12-01',4,12,2003), (10201,'S24_2000',25,'73.8800000',7,1847,'2003-12-01 00:00:00','2003-12-11 00:00:00','2003-12-02 00:00:00','Shipped',NULL,129,'2003-12-01',4,12,2003), (10202,'S18_3782',30,'54.7100000',3,1641.3,'2003-12-02 00:00:00','2003-12-09 00:00:00','2003-12-06 00:00:00','Shipped',NULL,357,'2003-12-02',4,12,2003), (10202,'S18_4721',43,'100.0000000',2,5886.7,'2003-12-02 00:00:00','2003-12-09 00:00:00','2003-12-06 00:00:00','Shipped',NULL,357,'2003-12-02',4,12,2003), (10202,'S24_2360',50,'69.2600000',6,3463,'2003-12-02 00:00:00','2003-12-09 00:00:00','2003-12-06 00:00:00','Shipped',NULL,357,'2003-12-02',4,12,2003), (10202,'S24_4620',50,'87.3100000',1,4365.5,'2003-12-02 00:00:00','2003-12-09 00:00:00','2003-12-06 00:00:00','Shipped',NULL,357,'2003-12-02',4,12,2003), (10202,'S32_2206',27,'44.2500000',4,1194.75,'2003-12-02 00:00:00','2003-12-09 00:00:00','2003-12-06 00:00:00','Shipped',NULL,357,'2003-12-02',4,12,2003), (10202,'S32_4485',31,'100.0000000',7,3163.55,'2003-12-02 00:00:00','2003-12-09 00:00:00','2003-12-06 00:00:00','Shipped',NULL,357,'2003-12-02',4,12,2003), (10202,'S50_4713',40,'89.5000000',5,3580,'2003-12-02 00:00:00','2003-12-09 00:00:00','2003-12-06 00:00:00','Shipped',NULL,357,'2003-12-02',4,12,2003), (10203,'S12_1099',20,'100.0000000',8,3930.4,'2003-12-02 00:00:00','2003-12-11 00:00:00','2003-12-07 00:00:00','Shipped',NULL,141,'2003-12-02',4,12,2003), (10203,'S12_3380',20,'100.0000000',6,2254.8,'2003-12-02 00:00:00','2003-12-11 00:00:00','2003-12-07 00:00:00','Shipped',NULL,141,'2003-12-02',4,12,2003), (10203,'S12_3990',44,'82.9900000',9,3651.56,'2003-12-02 00:00:00','2003-12-11 00:00:00','2003-12-07 00:00:00','Shipped',NULL,141,'2003-12-02',4,12,2003), (10203,'S12_4675',47,'100.0000000',5,5195.85,'2003-12-02 00:00:00','2003-12-11 00:00:00','2003-12-07 00:00:00','Shipped',NULL,141,'2003-12-02',4,12,2003), (10203,'S18_1889',45,'85.4700000',4,3846.15,'2003-12-02 00:00:00','2003-12-11 00:00:00','2003-12-07 00:00:00','Shipped',NULL,141,'2003-12-02',4,12,2003), (10203,'S18_3232',48,'100.0000000',1,8291.04,'2003-12-02 00:00:00','2003-12-11 00:00:00','2003-12-07 00:00:00','Shipped',NULL,141,'2003-12-02',4,12,2003), (10203,'S18_3278',33,'86.0400000',11,2839.32,'2003-12-02 00:00:00','2003-12-11 00:00:00','2003-12-07 00:00:00','Shipped',NULL,141,'2003-12-02',4,12,2003), (10203,'S18_3482',32,'100.0000000',10,5127.04,'2003-12-02 00:00:00','2003-12-11 00:00:00','2003-12-07 00:00:00','Shipped',NULL,141,'2003-12-02',4,12,2003), (10203,'S24_2972',21,'37.0000000',2,777,'2003-12-02 00:00:00','2003-12-11 00:00:00','2003-12-07 00:00:00','Shipped',NULL,141,'2003-12-02',4,12,2003), (10203,'S24_3371',34,'64.9000000',7,2206.6,'2003-12-02 00:00:00','2003-12-11 00:00:00','2003-12-07 00:00:00','Shipped',NULL,141,'2003-12-02',4,12,2003), (10203,'S24_3856',47,'100.0000000',3,6996.42,'2003-12-02 00:00:00','2003-12-11 00:00:00','2003-12-07 00:00:00','Shipped',NULL,141,'2003-12-02',4,12,2003), (10204,'S18_1129',42,'100.0000000',17,6182.4,'2003-12-02 00:00:00','2003-12-10 00:00:00','2003-12-04 00:00:00','Shipped',NULL,151,'2003-12-02',4,12,2003), (10204,'S18_1589',40,'100.0000000',13,4032,'2003-12-02 00:00:00','2003-12-10 00:00:00','2003-12-04 00:00:00','Shipped',NULL,151,'2003-12-02',4,12,2003), (10204,'S18_1749',33,'100.0000000',4,5890.5,'2003-12-02 00:00:00','2003-12-10 00:00:00','2003-12-04 00:00:00','Shipped',NULL,151,'2003-12-02',4,12,2003), (10204,'S18_1984',38,'100.0000000',16,6432.64,'2003-12-02 00:00:00','2003-12-10 00:00:00','2003-12-04 00:00:00','Shipped',NULL,151,'2003-12-02',4,12,2003), (10204,'S18_2248',23,'71.4400000',3,1643.12,'2003-12-02 00:00:00','2003-12-10 00:00:00','2003-12-04 00:00:00','Shipped',NULL,151,'2003-12-02',4,12,2003), (10204,'S18_2325',26,'100.0000000',1,3206.32,'2003-12-02 00:00:00','2003-12-10 00:00:00','2003-12-04 00:00:00','Shipped',NULL,151,'2003-12-02',4,12,2003), (10204,'S18_2870',27,'100.0000000',14,4169.88,'2003-12-02 00:00:00','2003-12-10 00:00:00','2003-12-04 00:00:00','Shipped',NULL,151,'2003-12-02',4,12,2003), (10204,'S18_3685',35,'100.0000000',15,5735.8,'2003-12-02 00:00:00','2003-12-10 00:00:00','2003-12-04 00:00:00','Shipped',NULL,151,'2003-12-02',4,12,2003), (10204,'S18_4409',29,'85.5900000',5,2482.11,'2003-12-02 00:00:00','2003-12-10 00:00:00','2003-12-04 00:00:00','Shipped',NULL,151,'2003-12-02',4,12,2003), (10204,'S18_4933',45,'76.2600000',6,3431.7,'2003-12-02 00:00:00','2003-12-10 00:00:00','2003-12-04 00:00:00','Shipped',NULL,151,'2003-12-02',4,12,2003), (10204,'S24_1046',20,'62.4700000',10,1249.4,'2003-12-02 00:00:00','2003-12-10 00:00:00','2003-12-04 00:00:00','Shipped',NULL,151,'2003-12-02',4,12,2003), (10204,'S24_1628',45,'49.8100000',12,2241.45,'2003-12-02 00:00:00','2003-12-10 00:00:00','2003-12-04 00:00:00','Shipped',NULL,151,'2003-12-02',4,12,2003), (10204,'S24_2766',47,'96.3200000',8,4527.04,'2003-12-02 00:00:00','2003-12-10 00:00:00','2003-12-04 00:00:00','Shipped',NULL,151,'2003-12-02',4,12,2003), (10204,'S24_2887',42,'100.0000000',7,4242,'2003-12-02 00:00:00','2003-12-10 00:00:00','2003-12-04 00:00:00','Shipped',NULL,151,'2003-12-02',4,12,2003), (10204,'S24_3191',40,'79.6200000',9,3184.8,'2003-12-02 00:00:00','2003-12-10 00:00:00','2003-12-04 00:00:00','Shipped',NULL,151,'2003-12-02',4,12,2003), (10204,'S24_3432',48,'91.0200000',11,4368.96,'2003-12-02 00:00:00','2003-12-10 00:00:00','2003-12-04 00:00:00','Shipped',NULL,151,'2003-12-02',4,12,2003), (10204,'S24_3969',39,'33.2300000',2,1295.97,'2003-12-02 00:00:00','2003-12-10 00:00:00','2003-12-04 00:00:00','Shipped',NULL,151,'2003-12-02',4,12,2003), (10205,'S18_1342',36,'100.0000000',2,3735.72,'2003-12-03 00:00:00','2003-12-09 00:00:00','2003-12-07 00:00:00','Shipped',' I need all the information I can get on our competitors.',141,'2003-12-03',4,12,2003), (10205,'S18_1367',48,'63.6100000',1,3053.28,'2003-12-03 00:00:00','2003-12-09 00:00:00','2003-12-07 00:00:00','Shipped',' I need all the information I can get on our competitors.',141,'2003-12-03',4,12,2003), (10205,'S18_2795',40,'100.0000000',3,7492.4,'2003-12-03 00:00:00','2003-12-09 00:00:00','2003-12-07 00:00:00','Shipped',' I need all the information I can get on our competitors.',141,'2003-12-03',4,12,2003), (10205,'S24_1937',32,'37.1700000',5,1189.44,'2003-12-03 00:00:00','2003-12-09 00:00:00','2003-12-07 00:00:00','Shipped',' I need all the information I can get on our competitors.',141,'2003-12-03',4,12,2003), (10205,'S24_2022',24,'38.0800000',4,913.92,'2003-12-03 00:00:00','2003-12-09 00:00:00','2003-12-07 00:00:00','Shipped',' I need all the information I can get on our competitors.',141,'2003-12-03',4,12,2003), (10206,'S10_1949',47,'100.0000000',6,9064.89,'2003-12-05 00:00:00','2003-12-13 00:00:00','2003-12-08 00:00:00','Shipped','Can we renegotiate this one?',202,'2003-12-05',4,12,2003), (10206,'S12_1666',28,'100.0000000',3,4056.36,'2003-12-05 00:00:00','2003-12-13 00:00:00','2003-12-08 00:00:00','Shipped','Can we renegotiate this one?',202,'2003-12-05',4,12,2003), (10206,'S18_1097',34,'100.0000000',5,3966.78,'2003-12-05 00:00:00','2003-12-13 00:00:00','2003-12-08 00:00:00','Shipped','Can we renegotiate this one?',202,'2003-12-05',4,12,2003), (10206,'S18_2949',37,'90.1700000',7,3336.29,'2003-12-05 00:00:00','2003-12-13 00:00:00','2003-12-08 00:00:00','Shipped','Can we renegotiate this one?',202,'2003-12-05',4,12,2003), (10206,'S18_2957',28,'67.4600000',9,1888.88,'2003-12-05 00:00:00','2003-12-13 00:00:00','2003-12-08 00:00:00','Shipped','Can we renegotiate this one?',202,'2003-12-05',4,12,2003), (10206,'S18_3136',30,'100.0000000',8,3581.4,'2003-12-05 00:00:00','2003-12-13 00:00:00','2003-12-08 00:00:00','Shipped','Can we renegotiate this one?',202,'2003-12-05',4,12,2003), (10206,'S18_3320',28,'87.3000000',11,2444.4,'2003-12-05 00:00:00','2003-12-13 00:00:00','2003-12-08 00:00:00','Shipped','Can we renegotiate this one?',202,'2003-12-05',4,12,2003), (10206,'S18_4668',21,'53.3300000',4,1119.93,'2003-12-05 00:00:00','2003-12-13 00:00:00','2003-12-08 00:00:00','Shipped','Can we renegotiate this one?',202,'2003-12-05',4,12,2003), (10206,'S24_4258',33,'97.3900000',10,3213.87,'2003-12-05 00:00:00','2003-12-13 00:00:00','2003-12-08 00:00:00','Shipped','Can we renegotiate this one?',202,'2003-12-05',4,12,2003), (10206,'S32_3522',36,'58.8200000',2,2117.52,'2003-12-05 00:00:00','2003-12-13 00:00:00','2003-12-08 00:00:00','Shipped','Can we renegotiate this one?',202,'2003-12-05',4,12,2003), (10206,'S700_2824',33,'100.0000000',1,3871.89,'2003-12-05 00:00:00','2003-12-13 00:00:00','2003-12-08 00:00:00','Shipped','Can we renegotiate this one?',202,'2003-12-05',4,12,2003), (10207,'S10_4962',31,'100.0000000',15,4076.19,'2003-12-09 00:00:00','2003-12-17 00:00:00','2003-12-11 00:00:00','Shipped','Check on availability.',495,'2003-12-09',4,12,2003), (10207,'S12_4473',34,'99.5400000',7,3384.36,'2003-12-09 00:00:00','2003-12-17 00:00:00','2003-12-11 00:00:00','Shipped','Check on availability.',495,'2003-12-09',4,12,2003), (10207,'S18_2238',44,'100.0000000',6,7060.24,'2003-12-09 00:00:00','2003-12-17 00:00:00','2003-12-11 00:00:00','Shipped','Check on availability.',495,'2003-12-09',4,12,2003), (10207,'S18_2319',43,'100.0000000',10,5752.54,'2003-12-09 00:00:00','2003-12-17 00:00:00','2003-12-11 00:00:00','Shipped','Check on availability.',495,'2003-12-09',4,12,2003), (10207,'S18_2432',37,'69.8900000',13,2585.93,'2003-12-09 00:00:00','2003-12-17 00:00:00','2003-12-11 00:00:00','Shipped','Check on availability.',495,'2003-12-09',4,12,2003), (10207,'S18_3232',25,'100.0000000',11,3937.25,'2003-12-09 00:00:00','2003-12-17 00:00:00','2003-12-11 00:00:00','Shipped','Check on availability.',495,'2003-12-09',4,12,2003), (10207,'S18_4027',40,'100.0000000',1,6146.8,'2003-12-09 00:00:00','2003-12-17 00:00:00','2003-12-11 00:00:00','Shipped','Check on availability.',495,'2003-12-09',4,12,2003), (10207,'S18_4600',47,'100.0000000',16,6658.02,'2003-12-09 00:00:00','2003-12-17 00:00:00','2003-12-11 00:00:00','Shipped','Check on availability.',495,'2003-12-09',4,12,2003), (10207,'S24_1444',49,'46.8200000',4,2294.18,'2003-12-09 00:00:00','2003-12-17 00:00:00','2003-12-11 00:00:00','Shipped','Check on availability.',495,'2003-12-09',4,12,2003), (10207,'S24_2300',46,'100.0000000',12,6819.04,'2003-12-09 00:00:00','2003-12-17 00:00:00','2003-12-11 00:00:00','Shipped','Check on availability.',495,'2003-12-09',4,12,2003), (10207,'S24_2840',42,'29.7000000',8,1247.4,'2003-12-09 00:00:00','2003-12-17 00:00:00','2003-12-11 00:00:00','Shipped','Check on availability.',495,'2003-12-09',4,12,2003), (10207,'S24_4048',28,'100.0000000',3,2980.6,'2003-12-09 00:00:00','2003-12-17 00:00:00','2003-12-11 00:00:00','Shipped','Check on availability.',495,'2003-12-09',4,12,2003), (10207,'S32_1268',49,'80.9000000',14,3964.1,'2003-12-09 00:00:00','2003-12-17 00:00:00','2003-12-11 00:00:00','Shipped','Check on availability.',495,'2003-12-09',4,12,2003), (10207,'S32_2509',27,'60.0600000',9,1621.62,'2003-12-09 00:00:00','2003-12-17 00:00:00','2003-12-11 00:00:00','Shipped','Check on availability.',495,'2003-12-09',4,12,2003), (10207,'S32_3207',45,'56.5500000',2,2544.75,'2003-12-09 00:00:00','2003-12-17 00:00:00','2003-12-11 00:00:00','Shipped','Check on availability.',495,'2003-12-09',4,12,2003), (10207,'S50_1392',28,'94.9200000',5,2657.76,'2003-12-09 00:00:00','2003-12-17 00:00:00','2003-12-11 00:00:00','Shipped','Check on availability.',495,'2003-12-09',4,12,2003), (10208,'S12_1108',46,'100.0000000',13,8602.92,'2004-01-02 00:00:00','2004-01-11 00:00:00','2004-01-04 00:00:00','Shipped',NULL,146,'2004-01-02',1,1,2004), (10208,'S12_3148',26,'100.0000000',14,3142.36,'2004-01-02 00:00:00','2004-01-11 00:00:00','2004-01-04 00:00:00','Shipped',NULL,146,'2004-01-02',1,1,2004), (10208,'S12_3891',20,'100.0000000',12,3114.4,'2004-01-02 00:00:00','2004-01-11 00:00:00','2004-01-04 00:00:00','Shipped',NULL,146,'2004-01-02',1,1,2004), (10208,'S18_3140',24,'100.0000000',9,2622.48,'2004-01-02 00:00:00','2004-01-11 00:00:00','2004-01-04 00:00:00','Shipped',NULL,146,'2004-01-02',1,1,2004), (10208,'S18_3259',48,'100.0000000',11,5614.56,'2004-01-02 00:00:00','2004-01-11 00:00:00','2004-01-04 00:00:00','Shipped',NULL,146,'2004-01-02',1,1,2004), (10208,'S18_4522',45,'87.7700000',8,3949.65,'2004-01-02 00:00:00','2004-01-11 00:00:00','2004-01-04 00:00:00','Shipped',NULL,146,'2004-01-02',1,1,2004), (10208,'S24_2011',35,'100.0000000',7,4301.15,'2004-01-02 00:00:00','2004-01-11 00:00:00','2004-01-04 00:00:00','Shipped',NULL,146,'2004-01-02',1,1,2004), (10208,'S24_3151',20,'89.4000000',2,1788,'2004-01-02 00:00:00','2004-01-11 00:00:00','2004-01-04 00:00:00','Shipped',NULL,146,'2004-01-02',1,1,2004), (10208,'S50_1514',30,'65.6100000',15,1968.3,'2004-01-02 00:00:00','2004-01-11 00:00:00','2004-01-04 00:00:00','Shipped',NULL,146,'2004-01-02',1,1,2004), (10208,'S700_1138',38,'74.6700000',3,2837.46,'2004-01-02 00:00:00','2004-01-11 00:00:00','2004-01-04 00:00:00','Shipped',NULL,146,'2004-01-02',1,1,2004), (10208,'S700_1938',40,'80.5500000',10,3222,'2004-01-02 00:00:00','2004-01-11 00:00:00','2004-01-04 00:00:00','Shipped',NULL,146,'2004-01-02',1,1,2004), (10208,'S700_2610',46,'74.4500000',1,3424.7,'2004-01-02 00:00:00','2004-01-11 00:00:00','2004-01-04 00:00:00','Shipped',NULL,146,'2004-01-02',1,1,2004), (10208,'S700_3505',37,'100.0000000',4,4447.4,'2004-01-02 00:00:00','2004-01-11 00:00:00','2004-01-04 00:00:00','Shipped',NULL,146,'2004-01-02',1,1,2004), (10208,'S700_3962',33,'85.4100000',5,2818.53,'2004-01-02 00:00:00','2004-01-11 00:00:00','2004-01-04 00:00:00','Shipped',NULL,146,'2004-01-02',1,1,2004), (10208,'S72_3212',42,'63.8800000',6,2682.96,'2004-01-02 00:00:00','2004-01-11 00:00:00','2004-01-04 00:00:00','Shipped',NULL,146,'2004-01-02',1,1,2004), (10209,'S10_4757',39,'100.0000000',8,5197.92,'2004-01-09 00:00:00','2004-01-15 00:00:00','2004-01-12 00:00:00','Shipped',NULL,347,'2004-01-09',1,1,2004), (10209,'S18_3029',28,'100.0000000',6,2817.92,'2004-01-09 00:00:00','2004-01-15 00:00:00','2004-01-12 00:00:00','Shipped',NULL,347,'2004-01-09',1,1,2004), (10209,'S18_3856',20,'100.0000000',5,2498.6,'2004-01-09 00:00:00','2004-01-15 00:00:00','2004-01-12 00:00:00','Shipped',NULL,347,'2004-01-09',1,1,2004), (10209,'S24_2841',43,'82.2100000',1,3535.03,'2004-01-09 00:00:00','2004-01-15 00:00:00','2004-01-12 00:00:00','Shipped',NULL,347,'2004-01-09',1,1,2004), (10209,'S24_3420',36,'77.5900000',2,2793.24,'2004-01-09 00:00:00','2004-01-15 00:00:00','2004-01-12 00:00:00','Shipped',NULL,347,'2004-01-09',1,1,2004), (10209,'S24_3816',22,'89.7300000',7,1974.06,'2004-01-09 00:00:00','2004-01-15 00:00:00','2004-01-12 00:00:00','Shipped',NULL,347,'2004-01-09',1,1,2004), (10209,'S700_2047',33,'88.7100000',4,2927.43,'2004-01-09 00:00:00','2004-01-15 00:00:00','2004-01-12 00:00:00','Shipped',NULL,347,'2004-01-09',1,1,2004), (10209,'S72_1253',48,'44.6900000',3,2145.12,'2004-01-09 00:00:00','2004-01-15 00:00:00','2004-01-12 00:00:00','Shipped',NULL,347,'2004-01-09',1,1,2004), (10210,'S10_2016',23,'100.0000000',2,3009.09,'2004-01-12 00:00:00','2004-01-22 00:00:00','2004-01-20 00:00:00','Shipped',NULL,177,'2004-01-12',1,1,2004), (10210,'S10_4698',34,'100.0000000',1,6123.4,'2004-01-12 00:00:00','2004-01-22 00:00:00','2004-01-20 00:00:00','Shipped',NULL,177,'2004-01-12',1,1,2004), (10210,'S18_1662',31,'100.0000000',17,5719.5,'2004-01-12 00:00:00','2004-01-22 00:00:00','2004-01-20 00:00:00','Shipped',NULL,177,'2004-01-12',1,1,2004), (10210,'S18_2581',50,'76.8800000',7,3844,'2004-01-12 00:00:00','2004-01-22 00:00:00','2004-01-20 00:00:00','Shipped',NULL,177,'2004-01-12',1,1,2004), (10210,'S18_2625',40,'49.6700000',3,1986.8,'2004-01-12 00:00:00','2004-01-22 00:00:00','2004-01-20 00:00:00','Shipped',NULL,177,'2004-01-12',1,1,2004), (10210,'S24_1785',27,'98.4800000',9,2658.96,'2004-01-12 00:00:00','2004-01-22 00:00:00','2004-01-20 00:00:00','Shipped',NULL,177,'2004-01-12',1,1,2004), (10210,'S24_2000',30,'61.7000000',4,1851,'2004-01-12 00:00:00','2004-01-22 00:00:00','2004-01-20 00:00:00','Shipped',NULL,177,'2004-01-12',1,1,2004), (10210,'S24_3949',29,'69.6000000',16,2018.4,'2004-01-12 00:00:00','2004-01-22 00:00:00','2004-01-20 00:00:00','Shipped',NULL,177,'2004-01-12',1,1,2004), (10210,'S24_4278',40,'71.0000000',8,2840,'2004-01-12 00:00:00','2004-01-22 00:00:00','2004-01-20 00:00:00','Shipped',NULL,177,'2004-01-12',1,1,2004), (10210,'S32_1374',46,'79.9100000',5,3675.86,'2004-01-12 00:00:00','2004-01-22 00:00:00','2004-01-20 00:00:00','Shipped',NULL,177,'2004-01-12',1,1,2004), (10210,'S32_4289',39,'59.1600000',10,2307.24,'2004-01-12 00:00:00','2004-01-22 00:00:00','2004-01-20 00:00:00','Shipped',NULL,177,'2004-01-12',1,1,2004), (10210,'S50_1341',43,'41.0200000',11,1763.86,'2004-01-12 00:00:00','2004-01-22 00:00:00','2004-01-20 00:00:00','Shipped',NULL,177,'2004-01-12',1,1,2004), (10210,'S700_1691',21,'78.5500000',12,1649.55,'2004-01-12 00:00:00','2004-01-22 00:00:00','2004-01-20 00:00:00','Shipped',NULL,177,'2004-01-12',1,1,2004), (10210,'S700_2466',26,'99.7200000',14,2592.72,'2004-01-12 00:00:00','2004-01-22 00:00:00','2004-01-20 00:00:00','Shipped',NULL,177,'2004-01-12',1,1,2004), (10210,'S700_2834',25,'100.0000000',6,2818,'2004-01-12 00:00:00','2004-01-22 00:00:00','2004-01-20 00:00:00','Shipped',NULL,177,'2004-01-12',1,1,2004), (10210,'S700_3167',31,'86.4000000',13,2678.4,'2004-01-12 00:00:00','2004-01-22 00:00:00','2004-01-20 00:00:00','Shipped',NULL,177,'2004-01-12',1,1,2004), (10210,'S700_4002',42,'70.3300000',15,2953.86,'2004-01-12 00:00:00','2004-01-22 00:00:00','2004-01-20 00:00:00','Shipped',NULL,177,'2004-01-12',1,1,2004), (10211,'S10_1678',41,'100.0000000',14,4708.44,'2004-01-15 00:00:00','2004-01-25 00:00:00','2004-01-18 00:00:00','Shipped',NULL,406,'2004-01-15',1,1,2004), (10211,'S12_1099',41,'100.0000000',2,7498.9,'2004-01-15 00:00:00','2004-01-25 00:00:00','2004-01-18 00:00:00','Shipped',NULL,406,'2004-01-15',1,1,2004), (10211,'S12_2823',36,'100.0000000',13,4771.8,'2004-01-15 00:00:00','2004-01-25 00:00:00','2004-01-18 00:00:00','Shipped',NULL,406,'2004-01-15',1,1,2004), (10211,'S12_3990',28,'92.5700000',3,2591.96,'2004-01-15 00:00:00','2004-01-25 00:00:00','2004-01-18 00:00:00','Shipped',NULL,406,'2004-01-15',1,1,2004), (10211,'S18_3278',35,'78.0000000',5,2730,'2004-01-15 00:00:00','2004-01-25 00:00:00','2004-01-18 00:00:00','Shipped',NULL,406,'2004-01-15',1,1,2004), (10211,'S18_3482',28,'100.0000000',4,3745.28,'2004-01-15 00:00:00','2004-01-25 00:00:00','2004-01-18 00:00:00','Shipped',NULL,406,'2004-01-15',1,1,2004), (10211,'S18_3782',46,'54.0900000',8,2488.14,'2004-01-15 00:00:00','2004-01-25 00:00:00','2004-01-18 00:00:00','Shipped',NULL,406,'2004-01-15',1,1,2004), (10211,'S18_4721',41,'100.0000000',7,5673.58,'2004-01-15 00:00:00','2004-01-25 00:00:00','2004-01-18 00:00:00','Shipped',NULL,406,'2004-01-15',1,1,2004), (10211,'S24_1578',25,'90.1600000',15,2254,'2004-01-15 00:00:00','2004-01-25 00:00:00','2004-01-18 00:00:00','Shipped',NULL,406,'2004-01-15',1,1,2004), (10211,'S24_2360',21,'63.7200000',11,1338.12,'2004-01-15 00:00:00','2004-01-25 00:00:00','2004-01-18 00:00:00','Shipped',NULL,406,'2004-01-15',1,1,2004), (10211,'S24_3371',48,'48.9800000',1,2351.04,'2004-01-15 00:00:00','2004-01-25 00:00:00','2004-01-18 00:00:00','Shipped',NULL,406,'2004-01-15',1,1,2004), (10211,'S24_4620',22,'92.1600000',6,2027.52,'2004-01-15 00:00:00','2004-01-25 00:00:00','2004-01-18 00:00:00','Shipped',NULL,406,'2004-01-15',1,1,2004), (10211,'S32_2206',41,'42.2400000',9,1731.84,'2004-01-15 00:00:00','2004-01-25 00:00:00','2004-01-18 00:00:00','Shipped',NULL,406,'2004-01-15',1,1,2004), (10211,'S32_4485',37,'100.0000000',12,4040.03,'2004-01-15 00:00:00','2004-01-25 00:00:00','2004-01-18 00:00:00','Shipped',NULL,406,'2004-01-15',1,1,2004), (10211,'S50_4713',40,'80.5500000',10,3222,'2004-01-15 00:00:00','2004-01-25 00:00:00','2004-01-18 00:00:00','Shipped',NULL,406,'2004-01-15',1,1,2004), (10212,'S12_3380',39,'100.0000000',16,4946.76,'2004-01-16 00:00:00','2004-01-24 00:00:00','2004-01-18 00:00:00','Shipped',NULL,141,'2004-01-16',1,1,2004), (10212,'S12_4675',33,'100.0000000',15,4180.44,'2004-01-16 00:00:00','2004-01-24 00:00:00','2004-01-18 00:00:00','Shipped',NULL,141,'2004-01-16',1,1,2004), (10212,'S18_1129',29,'100.0000000',10,4186.73,'2004-01-16 00:00:00','2004-01-24 00:00:00','2004-01-18 00:00:00','Shipped',NULL,141,'2004-01-16',1,1,2004), (10212,'S18_1589',38,'100.0000000',6,4492.36,'2004-01-16 00:00:00','2004-01-24 00:00:00','2004-01-18 00:00:00','Shipped',NULL,141,'2004-01-16',1,1,2004), (10212,'S18_1889',20,'66.9900000',14,1339.8,'2004-01-16 00:00:00','2004-01-24 00:00:00','2004-01-18 00:00:00','Shipped',NULL,141,'2004-01-16',1,1,2004), (10212,'S18_1984',41,'100.0000000',9,4840.87,'2004-01-16 00:00:00','2004-01-24 00:00:00','2004-01-18 00:00:00','Shipped',NULL,141,'2004-01-16',1,1,2004), (10212,'S18_2870',40,'100.0000000',7,4910.4,'2004-01-16 00:00:00','2004-01-24 00:00:00','2004-01-18 00:00:00','Shipped',NULL,141,'2004-01-16',1,1,2004), (10212,'S18_3232',40,'100.0000000',11,5554.4,'2004-01-16 00:00:00','2004-01-24 00:00:00','2004-01-18 00:00:00','Shipped',NULL,141,'2004-01-16',1,1,2004), (10212,'S18_3685',45,'100.0000000',8,6357.6,'2004-01-16 00:00:00','2004-01-24 00:00:00','2004-01-18 00:00:00','Shipped',NULL,141,'2004-01-16',1,1,2004), (10212,'S24_1046',41,'82.3100000',3,3374.71,'2004-01-16 00:00:00','2004-01-24 00:00:00','2004-01-18 00:00:00','Shipped',NULL,141,'2004-01-16',1,1,2004), (10212,'S24_1628',45,'53.3300000',5,2399.85,'2004-01-16 00:00:00','2004-01-24 00:00:00','2004-01-18 00:00:00','Shipped',NULL,141,'2004-01-16',1,1,2004), (10212,'S24_2766',45,'88.1400000',1,3966.3,'2004-01-16 00:00:00','2004-01-24 00:00:00','2004-01-18 00:00:00','Shipped',NULL,141,'2004-01-16',1,1,2004), (10212,'S24_2972',34,'43.4200000',12,1476.28,'2004-01-16 00:00:00','2004-01-24 00:00:00','2004-01-18 00:00:00','Shipped',NULL,141,'2004-01-16',1,1,2004), (10212,'S24_3191',27,'79.6200000',2,2149.74,'2004-01-16 00:00:00','2004-01-24 00:00:00','2004-01-18 00:00:00','Shipped',NULL,141,'2004-01-16',1,1,2004), (10212,'S24_3432',46,'87.8100000',4,4039.26,'2004-01-16 00:00:00','2004-01-24 00:00:00','2004-01-18 00:00:00','Shipped',NULL,141,'2004-01-16',1,1,2004), (10212,'S24_3856',49,'100.0000000',13,6949.67,'2004-01-16 00:00:00','2004-01-24 00:00:00','2004-01-18 00:00:00','Shipped',NULL,141,'2004-01-16',1,1,2004), (10213,'S18_4409',38,'94.7900000',1,3602.02,'2004-01-22 00:00:00','2004-01-28 00:00:00','2004-01-27 00:00:00','Shipped','Difficult to negotiate with customer. We need more marketing materials',489,'2004-01-22',1,1,2004); INSERT INTO `orderfact` (`ORDERNUMBER`,`PRODUCTCODE`,`QUANTITYORDERED`,`PRICEEACH`,`ORDERLINENUMBER`,`TOTALPRICE`,`ORDERDATE`,`REQUIREDDATE`,`SHIPPEDDATE`,`STATUS`,`COMMENTS`,`CUSTOMERNUMBER`,`TIME_ID`,`QTR_ID`,`MONTH_ID`,`YEAR_ID`) VALUES (10213,'S18_4933',25,'83.3900000',2,2084.75,'2004-01-22 00:00:00','2004-01-28 00:00:00','2004-01-27 00:00:00','Shipped','Difficult to negotiate with customer. We need more marketing materials',489,'2004-01-22',1,1,2004), (10213,'S24_2887',27,'100.0000000',3,2790.45,'2004-01-22 00:00:00','2004-01-28 00:00:00','2004-01-27 00:00:00','Shipped','Difficult to negotiate with customer. We need more marketing materials',489,'2004-01-22',1,1,2004), (10214,'S18_1749',30,'100.0000000',7,5967,'2004-01-26 00:00:00','2004-02-04 00:00:00','2004-01-29 00:00:00','Shipped',NULL,458,'2004-01-26',1,1,2004), (10214,'S18_2248',21,'62.9600000',6,1322.16,'2004-01-26 00:00:00','2004-02-04 00:00:00','2004-01-29 00:00:00','Shipped',NULL,458,'2004-01-26',1,1,2004), (10214,'S18_2325',27,'100.0000000',4,3604.23,'2004-01-26 00:00:00','2004-02-04 00:00:00','2004-01-29 00:00:00','Shipped',NULL,458,'2004-01-26',1,1,2004), (10214,'S18_2795',50,'100.0000000',1,9534.5,'2004-01-26 00:00:00','2004-02-04 00:00:00','2004-01-29 00:00:00','Shipped',NULL,458,'2004-01-26',1,1,2004), (10214,'S24_1937',20,'34.1900000',3,683.8,'2004-01-26 00:00:00','2004-02-04 00:00:00','2004-01-29 00:00:00','Shipped',NULL,458,'2004-01-26',1,1,2004), (10214,'S24_2022',49,'47.9400000',2,2349.06,'2004-01-26 00:00:00','2004-02-04 00:00:00','2004-01-29 00:00:00','Shipped',NULL,458,'2004-01-26',1,1,2004), (10214,'S24_3969',44,'34.8800000',5,1534.72,'2004-01-26 00:00:00','2004-02-04 00:00:00','2004-01-29 00:00:00','Shipped',NULL,458,'2004-01-26',1,1,2004), (10215,'S10_1949',35,'100.0000000',3,6075.3,'2004-01-29 00:00:00','2004-02-08 00:00:00','2004-02-01 00:00:00','Shipped','Customer requested that FedEx Ground is used for this shipping',475,'2004-01-29',1,1,2004), (10215,'S18_1097',46,'100.0000000',2,5152,'2004-01-29 00:00:00','2004-02-08 00:00:00','2004-02-01 00:00:00','Shipped','Customer requested that FedEx Ground is used for this shipping',475,'2004-01-29',1,1,2004), (10215,'S18_1342',27,'89.3800000',10,2413.26,'2004-01-29 00:00:00','2004-02-08 00:00:00','2004-02-01 00:00:00','Shipped','Customer requested that FedEx Ground is used for this shipping',475,'2004-01-29',1,1,2004), (10215,'S18_1367',33,'43.1300000',9,1423.29,'2004-01-29 00:00:00','2004-02-08 00:00:00','2004-02-01 00:00:00','Shipped','Customer requested that FedEx Ground is used for this shipping',475,'2004-01-29',1,1,2004), (10215,'S18_2949',49,'100.0000000',4,5510.05,'2004-01-29 00:00:00','2004-02-08 00:00:00','2004-02-01 00:00:00','Shipped','Customer requested that FedEx Ground is used for this shipping',475,'2004-01-29',1,1,2004), (10215,'S18_2957',31,'58.7100000',6,1820.01,'2004-01-29 00:00:00','2004-02-08 00:00:00','2004-02-01 00:00:00','Shipped','Customer requested that FedEx Ground is used for this shipping',475,'2004-01-29',1,1,2004), (10215,'S18_3136',49,'100.0000000',5,5285.14,'2004-01-29 00:00:00','2004-02-08 00:00:00','2004-02-01 00:00:00','Shipped','Customer requested that FedEx Ground is used for this shipping',475,'2004-01-29',1,1,2004), (10215,'S18_3320',41,'100.0000000',8,4555.92,'2004-01-29 00:00:00','2004-02-08 00:00:00','2004-02-01 00:00:00','Shipped','Customer requested that FedEx Ground is used for this shipping',475,'2004-01-29',1,1,2004), (10215,'S18_4668',46,'45.2800000',1,2082.88,'2004-01-29 00:00:00','2004-02-08 00:00:00','2004-02-01 00:00:00','Shipped','Customer requested that FedEx Ground is used for this shipping',475,'2004-01-29',1,1,2004), (10215,'S24_4258',39,'90.5700000',7,3532.23,'2004-01-29 00:00:00','2004-02-08 00:00:00','2004-02-01 00:00:00','Shipped','Customer requested that FedEx Ground is used for this shipping',475,'2004-01-29',1,1,2004), (10216,'S12_1666',43,'100.0000000',1,5759.42,'2004-02-02 00:00:00','2004-02-10 00:00:00','2004-02-04 00:00:00','Shipped',NULL,256,'2004-02-02',1,2,2004), (10217,'S10_4962',48,'100.0000000',4,7020.48,'2004-02-04 00:00:00','2004-02-14 00:00:00','2004-02-06 00:00:00','Shipped',NULL,166,'2004-02-04',1,2,2004), (10217,'S18_2432',35,'61.3800000',2,2148.3,'2004-02-04 00:00:00','2004-02-14 00:00:00','2004-02-06 00:00:00','Shipped',NULL,166,'2004-02-04',1,2,2004), (10217,'S18_4600',38,'100.0000000',5,4509.08,'2004-02-04 00:00:00','2004-02-14 00:00:00','2004-02-06 00:00:00','Shipped',NULL,166,'2004-02-04',1,2,2004), (10217,'S24_2300',28,'100.0000000',1,3148.88,'2004-02-04 00:00:00','2004-02-14 00:00:00','2004-02-06 00:00:00','Shipped',NULL,166,'2004-02-04',1,2,2004), (10217,'S32_1268',21,'100.0000000',3,2244.9,'2004-02-04 00:00:00','2004-02-14 00:00:00','2004-02-06 00:00:00','Shipped',NULL,166,'2004-02-04',1,2,2004), (10217,'S32_3522',39,'62.0500000',7,2419.95,'2004-02-04 00:00:00','2004-02-14 00:00:00','2004-02-06 00:00:00','Shipped',NULL,166,'2004-02-04',1,2,2004), (10217,'S700_2824',31,'88.0000000',6,2728,'2004-02-04 00:00:00','2004-02-14 00:00:00','2004-02-06 00:00:00','Shipped',NULL,166,'2004-02-04',1,2,2004), (10218,'S18_2319',22,'100.0000000',1,2673,'2004-02-09 00:00:00','2004-02-16 00:00:00','2004-02-11 00:00:00','Shipped','Customer requested that ad materials (such as posters, pamphlets) be included in the shippment',473,'2004-02-09',1,2,2004), (10218,'S18_3232',34,'100.0000000',2,4605.98,'2004-02-09 00:00:00','2004-02-16 00:00:00','2004-02-11 00:00:00','Shipped','Customer requested that ad materials (such as posters, pamphlets) be included in the shippment',473,'2004-02-09',1,2,2004), (10219,'S12_4473',48,'100.0000000',2,4891.68,'2004-02-10 00:00:00','2004-02-17 00:00:00','2004-02-12 00:00:00','Shipped',NULL,487,'2004-02-10',1,2,2004), (10219,'S18_2238',43,'100.0000000',1,8448.64,'2004-02-10 00:00:00','2004-02-17 00:00:00','2004-02-12 00:00:00','Shipped',NULL,487,'2004-02-10',1,2,2004), (10219,'S24_2840',21,'40.3100000',3,846.51,'2004-02-10 00:00:00','2004-02-17 00:00:00','2004-02-12 00:00:00','Shipped',NULL,487,'2004-02-10',1,2,2004), (10219,'S32_2509',35,'55.1900000',4,1931.65,'2004-02-10 00:00:00','2004-02-17 00:00:00','2004-02-12 00:00:00','Shipped',NULL,487,'2004-02-10',1,2,2004), (10220,'S12_1108',32,'100.0000000',2,7181.44,'2004-02-12 00:00:00','2004-02-19 00:00:00','2004-02-16 00:00:00','Shipped',NULL,189,'2004-02-12',1,2,2004), (10220,'S12_3148',30,'100.0000000',3,4713.6,'2004-02-12 00:00:00','2004-02-19 00:00:00','2004-02-16 00:00:00','Shipped',NULL,189,'2004-02-12',1,2,2004), (10220,'S12_3891',27,'100.0000000',1,5045.22,'2004-02-12 00:00:00','2004-02-19 00:00:00','2004-02-16 00:00:00','Shipped',NULL,189,'2004-02-12',1,2,2004), (10220,'S18_4027',50,'100.0000000',5,8258,'2004-02-12 00:00:00','2004-02-19 00:00:00','2004-02-16 00:00:00','Shipped',NULL,189,'2004-02-12',1,2,2004), (10220,'S24_1444',26,'56.0700000',8,1457.82,'2004-02-12 00:00:00','2004-02-19 00:00:00','2004-02-16 00:00:00','Shipped',NULL,189,'2004-02-12',1,2,2004), (10220,'S24_4048',37,'100.0000000',7,5032.74,'2004-02-12 00:00:00','2004-02-19 00:00:00','2004-02-16 00:00:00','Shipped',NULL,189,'2004-02-12',1,2,2004), (10220,'S32_3207',20,'52.8200000',6,1056.4,'2004-02-12 00:00:00','2004-02-19 00:00:00','2004-02-16 00:00:00','Shipped',NULL,189,'2004-02-12',1,2,2004), (10220,'S50_1392',37,'100.0000000',9,3983.05,'2004-02-12 00:00:00','2004-02-19 00:00:00','2004-02-16 00:00:00','Shipped',NULL,189,'2004-02-12',1,2,2004), (10220,'S50_1514',30,'68.5400000',4,2056.2,'2004-02-12 00:00:00','2004-02-19 00:00:00','2004-02-16 00:00:00','Shipped',NULL,189,'2004-02-12',1,2,2004), (10221,'S18_3140',33,'100.0000000',3,4417.38,'2004-02-18 00:00:00','2004-02-26 00:00:00','2004-02-19 00:00:00','Shipped',NULL,314,'2004-02-18',1,2,2004), (10221,'S18_3259',23,'80.6700000',5,1855.41,'2004-02-18 00:00:00','2004-02-26 00:00:00','2004-02-19 00:00:00','Shipped',NULL,314,'2004-02-18',1,2,2004), (10221,'S18_4522',39,'89.5300000',2,3491.67,'2004-02-18 00:00:00','2004-02-26 00:00:00','2004-02-19 00:00:00','Shipped',NULL,314,'2004-02-18',1,2,2004), (10221,'S24_2011',49,'100.0000000',1,6804.63,'2004-02-18 00:00:00','2004-02-26 00:00:00','2004-02-19 00:00:00','Shipped',NULL,314,'2004-02-18',1,2,2004), (10221,'S700_1938',23,'97.0000000',4,2231,'2004-02-18 00:00:00','2004-02-26 00:00:00','2004-02-19 00:00:00','Shipped',NULL,314,'2004-02-18',1,2,2004), (10222,'S10_4757',49,'100.0000000',12,5997.6,'2004-02-19 00:00:00','2004-02-27 00:00:00','2004-02-20 00:00:00','Shipped',NULL,239,'2004-02-19',1,2,2004), (10222,'S18_1662',49,'100.0000000',4,6954.08,'2004-02-19 00:00:00','2004-02-27 00:00:00','2004-02-20 00:00:00','Shipped',NULL,239,'2004-02-19',1,2,2004), (10222,'S18_3029',49,'94.6200000',10,4636.38,'2004-02-19 00:00:00','2004-02-27 00:00:00','2004-02-20 00:00:00','Shipped',NULL,239,'2004-02-19',1,2,2004), (10222,'S18_3856',45,'85.7500000',9,3858.75,'2004-02-19 00:00:00','2004-02-27 00:00:00','2004-02-20 00:00:00','Shipped',NULL,239,'2004-02-19',1,2,2004), (10222,'S24_2841',32,'81.5300000',5,2608.96,'2004-02-19 00:00:00','2004-02-27 00:00:00','2004-02-20 00:00:00','Shipped',NULL,239,'2004-02-19',1,2,2004), (10222,'S24_3151',47,'70.8100000',14,3328.07,'2004-02-19 00:00:00','2004-02-27 00:00:00','2004-02-20 00:00:00','Shipped',NULL,239,'2004-02-19',1,2,2004), (10222,'S24_3420',43,'70.3500000',6,3025.05,'2004-02-19 00:00:00','2004-02-27 00:00:00','2004-02-20 00:00:00','Shipped',NULL,239,'2004-02-19',1,2,2004), (10222,'S24_3816',46,'80.5100000',11,3703.46,'2004-02-19 00:00:00','2004-02-27 00:00:00','2004-02-20 00:00:00','Shipped',NULL,239,'2004-02-19',1,2,2004), (10222,'S24_3949',48,'56.6400000',3,2718.72,'2004-02-19 00:00:00','2004-02-27 00:00:00','2004-02-20 00:00:00','Shipped',NULL,239,'2004-02-19',1,2,2004), (10222,'S700_1138',31,'62.6700000',15,1942.77,'2004-02-19 00:00:00','2004-02-27 00:00:00','2004-02-20 00:00:00','Shipped',NULL,239,'2004-02-19',1,2,2004), (10222,'S700_2047',26,'100.0000000',8,2659.54,'2004-02-19 00:00:00','2004-02-27 00:00:00','2004-02-20 00:00:00','Shipped',NULL,239,'2004-02-19',1,2,2004), (10222,'S700_2466',37,'87.7500000',1,3246.75,'2004-02-19 00:00:00','2004-02-27 00:00:00','2004-02-20 00:00:00','Shipped',NULL,239,'2004-02-19',1,2,2004), (10222,'S700_2610',36,'80.9500000',13,2914.2,'2004-02-19 00:00:00','2004-02-27 00:00:00','2004-02-20 00:00:00','Shipped',NULL,239,'2004-02-19',1,2,2004), (10222,'S700_3505',38,'100.0000000',16,4187.22,'2004-02-19 00:00:00','2004-02-27 00:00:00','2004-02-20 00:00:00','Shipped',NULL,239,'2004-02-19',1,2,2004), (10222,'S700_3962',31,'95.3400000',17,2955.54,'2004-02-19 00:00:00','2004-02-27 00:00:00','2004-02-20 00:00:00','Shipped',NULL,239,'2004-02-19',1,2,2004), (10222,'S700_4002',43,'74.0300000',2,3183.29,'2004-02-19 00:00:00','2004-02-27 00:00:00','2004-02-20 00:00:00','Shipped',NULL,239,'2004-02-19',1,2,2004), (10222,'S72_1253',31,'45.6900000',7,1416.39,'2004-02-19 00:00:00','2004-02-27 00:00:00','2004-02-20 00:00:00','Shipped',NULL,239,'2004-02-19',1,2,2004), (10222,'S72_3212',36,'63.3400000',18,2280.24,'2004-02-19 00:00:00','2004-02-27 00:00:00','2004-02-20 00:00:00','Shipped',NULL,239,'2004-02-19',1,2,2004), (10223,'S10_1678',37,'100.0000000',1,3965.66,'2004-02-20 00:00:00','2004-02-29 00:00:00','2004-02-24 00:00:00','Shipped',NULL,114,'2004-02-20',1,2,2004), (10223,'S10_2016',47,'100.0000000',4,5422.39,'2004-02-20 00:00:00','2004-02-29 00:00:00','2004-02-24 00:00:00','Shipped',NULL,114,'2004-02-20',1,2,2004), (10223,'S10_4698',49,'100.0000000',3,9774.03,'2004-02-20 00:00:00','2004-02-29 00:00:00','2004-02-24 00:00:00','Shipped',NULL,114,'2004-02-20',1,2,2004), (10223,'S18_2581',47,'100.0000000',9,4724.91,'2004-02-20 00:00:00','2004-02-29 00:00:00','2004-02-24 00:00:00','Shipped',NULL,114,'2004-02-20',1,2,2004), (10223,'S18_2625',28,'60.5700000',5,1695.96,'2004-02-20 00:00:00','2004-02-29 00:00:00','2004-02-24 00:00:00','Shipped',NULL,114,'2004-02-20',1,2,2004), (10223,'S24_1578',32,'91.2900000',2,2921.28,'2004-02-20 00:00:00','2004-02-29 00:00:00','2004-02-24 00:00:00','Shipped',NULL,114,'2004-02-20',1,2,2004), (10223,'S24_1785',34,'100.0000000',11,3608.76,'2004-02-20 00:00:00','2004-02-29 00:00:00','2004-02-24 00:00:00','Shipped',NULL,114,'2004-02-20',1,2,2004), (10223,'S24_2000',38,'69.3100000',6,2633.78,'2004-02-20 00:00:00','2004-02-29 00:00:00','2004-02-24 00:00:00','Shipped',NULL,114,'2004-02-20',1,2,2004), (10223,'S24_4278',23,'74.6200000',10,1716.26,'2004-02-20 00:00:00','2004-02-29 00:00:00','2004-02-24 00:00:00','Shipped',NULL,114,'2004-02-20',1,2,2004), (10223,'S32_1374',21,'100.0000000',7,2475.27,'2004-02-20 00:00:00','2004-02-29 00:00:00','2004-02-24 00:00:00','Shipped',NULL,114,'2004-02-20',1,2,2004), (10223,'S32_4289',20,'66.0400000',12,1320.8,'2004-02-20 00:00:00','2004-02-29 00:00:00','2004-02-24 00:00:00','Shipped',NULL,114,'2004-02-20',1,2,2004), (10223,'S50_1341',41,'46.2600000',13,1896.66,'2004-02-20 00:00:00','2004-02-29 00:00:00','2004-02-24 00:00:00','Shipped',NULL,114,'2004-02-20',1,2,2004), (10223,'S700_1691',25,'100.0000000',14,2534.75,'2004-02-20 00:00:00','2004-02-29 00:00:00','2004-02-24 00:00:00','Shipped',NULL,114,'2004-02-20',1,2,2004), (10223,'S700_2834',29,'100.0000000',8,3199.86,'2004-02-20 00:00:00','2004-02-29 00:00:00','2004-02-24 00:00:00','Shipped',NULL,114,'2004-02-20',1,2,2004), (10223,'S700_3167',26,'67.2000000',15,1747.2,'2004-02-20 00:00:00','2004-02-29 00:00:00','2004-02-24 00:00:00','Shipped',NULL,114,'2004-02-20',1,2,2004), (10224,'S12_2823',43,'100.0000000',6,6087.94,'2004-02-21 00:00:00','2004-03-02 00:00:00','2004-02-26 00:00:00','Shipped','Customer has worked with some of our vendors in the past and is aware of their MSRP',171,'2004-02-21',1,2,2004), (10224,'S18_3782',38,'58.4400000',1,2220.72,'2004-02-21 00:00:00','2004-03-02 00:00:00','2004-02-26 00:00:00','Shipped','Customer has worked with some of our vendors in the past and is aware of their MSRP',171,'2004-02-21',1,2,2004), (10224,'S24_2360',37,'80.3400000',4,2972.58,'2004-02-21 00:00:00','2004-03-02 00:00:00','2004-02-26 00:00:00','Shipped','Customer has worked with some of our vendors in the past and is aware of their MSRP',171,'2004-02-21',1,2,2004), (10224,'S32_2206',43,'39.4300000',2,1695.49,'2004-02-21 00:00:00','2004-03-02 00:00:00','2004-02-26 00:00:00','Shipped','Customer has worked with some of our vendors in the past and is aware of their MSRP',171,'2004-02-21',1,2,2004), (10224,'S32_4485',30,'100.0000000',5,3336.9,'2004-02-21 00:00:00','2004-03-02 00:00:00','2004-02-26 00:00:00','Shipped','Customer has worked with some of our vendors in the past and is aware of their MSRP',171,'2004-02-21',1,2,2004), (10224,'S50_4713',50,'77.2900000',3,3864.5,'2004-02-21 00:00:00','2004-03-02 00:00:00','2004-02-26 00:00:00','Shipped','Customer has worked with some of our vendors in the past and is aware of their MSRP',171,'2004-02-21',1,2,2004), (10225,'S12_1099',27,'100.0000000',9,4517.91,'2004-02-22 00:00:00','2004-03-01 00:00:00','2004-02-24 00:00:00','Shipped',NULL,298,'2004-02-22',1,2,2004), (10225,'S12_3380',25,'99.8200000',7,2495.5,'2004-02-22 00:00:00','2004-03-01 00:00:00','2004-02-24 00:00:00','Shipped',NULL,298,'2004-02-22',1,2,2004), (10225,'S12_3990',37,'77.4100000',10,2864.17,'2004-02-22 00:00:00','2004-03-01 00:00:00','2004-02-24 00:00:00','Shipped',NULL,298,'2004-02-22',1,2,2004), (10225,'S12_4675',21,'100.0000000',6,2684.43,'2004-02-22 00:00:00','2004-03-01 00:00:00','2004-02-24 00:00:00','Shipped',NULL,298,'2004-02-22',1,2,2004), (10225,'S18_1129',32,'100.0000000',1,4529.28,'2004-02-22 00:00:00','2004-03-01 00:00:00','2004-02-24 00:00:00','Shipped',NULL,298,'2004-02-22',1,2,2004), (10225,'S18_1889',47,'64.6800000',5,3039.96,'2004-02-22 00:00:00','2004-03-01 00:00:00','2004-02-24 00:00:00','Shipped',NULL,298,'2004-02-22',1,2,2004), (10225,'S18_3232',43,'100.0000000',2,6407.86,'2004-02-22 00:00:00','2004-03-01 00:00:00','2004-02-24 00:00:00','Shipped',NULL,298,'2004-02-22',1,2,2004), (10225,'S18_3278',37,'95.6900000',12,3540.53,'2004-02-22 00:00:00','2004-03-01 00:00:00','2004-02-24 00:00:00','Shipped',NULL,298,'2004-02-22',1,2,2004), (10225,'S18_3482',27,'100.0000000',11,4564.08,'2004-02-22 00:00:00','2004-03-01 00:00:00','2004-02-24 00:00:00','Shipped',NULL,298,'2004-02-22',1,2,2004), (10225,'S18_4721',35,'100.0000000',14,5260.15,'2004-02-22 00:00:00','2004-03-01 00:00:00','2004-02-24 00:00:00','Shipped',NULL,298,'2004-02-22',1,2,2004), (10225,'S24_2972',42,'36.6300000',3,1538.46,'2004-02-22 00:00:00','2004-03-01 00:00:00','2004-02-24 00:00:00','Shipped',NULL,298,'2004-02-22',1,2,2004), (10225,'S24_3371',24,'50.2100000',8,1205.04,'2004-02-22 00:00:00','2004-03-01 00:00:00','2004-02-24 00:00:00','Shipped',NULL,298,'2004-02-22',1,2,2004), (10225,'S24_3856',40,'100.0000000',4,4550,'2004-02-22 00:00:00','2004-03-01 00:00:00','2004-02-24 00:00:00','Shipped',NULL,298,'2004-02-22',1,2,2004), (10225,'S24_4620',46,'70.3300000',13,3235.18,'2004-02-22 00:00:00','2004-03-01 00:00:00','2004-02-24 00:00:00','Shipped',NULL,298,'2004-02-22',1,2,2004), (10226,'S18_1589',38,'100.0000000',4,4161.38,'2004-02-26 00:00:00','2004-03-06 00:00:00','2004-03-02 00:00:00','Shipped',NULL,239,'2004-02-26',1,2,2004), (10226,'S18_1984',24,'100.0000000',7,3892.08,'2004-02-26 00:00:00','2004-03-06 00:00:00','2004-03-02 00:00:00','Shipped',NULL,239,'2004-02-26',1,2,2004), (10226,'S18_2870',24,'100.0000000',5,3231.36,'2004-02-26 00:00:00','2004-03-06 00:00:00','2004-03-02 00:00:00','Shipped',NULL,239,'2004-02-26',1,2,2004), (10226,'S18_3685',46,'100.0000000',6,7343.9,'2004-02-26 00:00:00','2004-03-06 00:00:00','2004-03-02 00:00:00','Shipped',NULL,239,'2004-02-26',1,2,2004), (10226,'S24_1046',21,'60.2600000',1,1265.46,'2004-02-26 00:00:00','2004-03-06 00:00:00','2004-03-02 00:00:00','Shipped',NULL,239,'2004-02-26',1,2,2004), (10226,'S24_1628',36,'43.2700000',3,1557.72,'2004-02-26 00:00:00','2004-03-06 00:00:00','2004-03-02 00:00:00','Shipped',NULL,239,'2004-02-26',1,2,2004), (10226,'S24_3432',48,'92.0900000',2,4420.32,'2004-02-26 00:00:00','2004-03-06 00:00:00','2004-03-02 00:00:00','Shipped',NULL,239,'2004-02-26',1,2,2004), (10227,'S18_1342',25,'100.0000000',3,2953.75,'2004-03-02 00:00:00','2004-03-12 00:00:00','2004-03-08 00:00:00','Shipped',NULL,146,'2004-03-02',1,3,2004), (10227,'S18_1367',31,'48.5200000',2,1504.12,'2004-03-02 00:00:00','2004-03-12 00:00:00','2004-03-08 00:00:00','Shipped',NULL,146,'2004-03-02',1,3,2004), (10227,'S18_1749',26,'100.0000000',10,3712.8,'2004-03-02 00:00:00','2004-03-12 00:00:00','2004-03-08 00:00:00','Shipped',NULL,146,'2004-03-02',1,3,2004), (10227,'S18_2248',28,'50.8500000',9,1423.8,'2004-03-02 00:00:00','2004-03-12 00:00:00','2004-03-08 00:00:00','Shipped',NULL,146,'2004-03-02',1,3,2004), (10227,'S18_2325',46,'100.0000000',7,7017.76,'2004-03-02 00:00:00','2004-03-12 00:00:00','2004-03-08 00:00:00','Shipped',NULL,146,'2004-03-02',1,3,2004), (10227,'S18_2795',29,'100.0000000',4,5579.02,'2004-03-02 00:00:00','2004-03-12 00:00:00','2004-03-08 00:00:00','Shipped',NULL,146,'2004-03-02',1,3,2004), (10227,'S18_3320',33,'100.0000000',1,3666.96,'2004-03-02 00:00:00','2004-03-12 00:00:00','2004-03-08 00:00:00','Shipped',NULL,146,'2004-03-02',1,3,2004), (10227,'S18_4409',34,'100.0000000',11,3566.94,'2004-03-02 00:00:00','2004-03-12 00:00:00','2004-03-08 00:00:00','Shipped',NULL,146,'2004-03-02',1,3,2004), (10227,'S18_4933',37,'57.7300000',12,2136.01,'2004-03-02 00:00:00','2004-03-12 00:00:00','2004-03-08 00:00:00','Shipped',NULL,146,'2004-03-02',1,3,2004), (10227,'S24_1937',42,'29.2100000',6,1226.82,'2004-03-02 00:00:00','2004-03-12 00:00:00','2004-03-08 00:00:00','Shipped',NULL,146,'2004-03-02',1,3,2004), (10227,'S24_2022',24,'48.3800000',5,1161.12,'2004-03-02 00:00:00','2004-03-12 00:00:00','2004-03-08 00:00:00','Shipped',NULL,146,'2004-03-02',1,3,2004), (10227,'S24_2766',47,'88.1400000',14,4142.58,'2004-03-02 00:00:00','2004-03-12 00:00:00','2004-03-08 00:00:00','Shipped',NULL,146,'2004-03-02',1,3,2004), (10227,'S24_2887',33,'100.0000000',13,4340.49,'2004-03-02 00:00:00','2004-03-12 00:00:00','2004-03-08 00:00:00','Shipped',NULL,146,'2004-03-02',1,3,2004), (10227,'S24_3191',40,'79.6200000',15,3184.8,'2004-03-02 00:00:00','2004-03-12 00:00:00','2004-03-08 00:00:00','Shipped',NULL,146,'2004-03-02',1,3,2004), (10227,'S24_3969',27,'43.9000000',8,1185.3,'2004-03-02 00:00:00','2004-03-12 00:00:00','2004-03-08 00:00:00','Shipped',NULL,146,'2004-03-02',1,3,2004), (10228,'S10_1949',29,'100.0000000',2,6463.23,'2004-03-10 00:00:00','2004-03-18 00:00:00','2004-03-13 00:00:00','Shipped',NULL,173,'2004-03-10',1,3,2004), (10228,'S18_1097',32,'100.0000000',1,3360,'2004-03-10 00:00:00','2004-03-18 00:00:00','2004-03-13 00:00:00','Shipped',NULL,173,'2004-03-10',1,3,2004), (10228,'S18_2949',24,'100.0000000',3,2504.4,'2004-03-10 00:00:00','2004-03-18 00:00:00','2004-03-13 00:00:00','Shipped',NULL,173,'2004-03-10',1,3,2004), (10228,'S18_2957',45,'63.7100000',5,2866.95,'2004-03-10 00:00:00','2004-03-18 00:00:00','2004-03-13 00:00:00','Shipped',NULL,173,'2004-03-10',1,3,2004), (10228,'S18_3136',31,'100.0000000',4,3181.53,'2004-03-10 00:00:00','2004-03-18 00:00:00','2004-03-13 00:00:00','Shipped',NULL,173,'2004-03-10',1,3,2004), (10228,'S24_4258',33,'100.0000000',6,3406.59,'2004-03-10 00:00:00','2004-03-18 00:00:00','2004-03-13 00:00:00','Shipped',NULL,173,'2004-03-10',1,3,2004), (10229,'S10_4962',50,'100.0000000',9,6426.5,'2004-03-11 00:00:00','2004-03-20 00:00:00','2004-03-12 00:00:00','Shipped',NULL,124,'2004-03-11',1,3,2004), (10229,'S12_1666',25,'100.0000000',13,3451,'2004-03-11 00:00:00','2004-03-20 00:00:00','2004-03-12 00:00:00','Shipped',NULL,124,'2004-03-11',1,3,2004), (10229,'S12_4473',36,'100.0000000',1,4521.96,'2004-03-11 00:00:00','2004-03-20 00:00:00','2004-03-12 00:00:00','Shipped',NULL,124,'2004-03-11',1,3,2004), (10229,'S18_2319',26,'100.0000000',4,3765.32,'2004-03-11 00:00:00','2004-03-20 00:00:00','2004-03-12 00:00:00','Shipped',NULL,124,'2004-03-11',1,3,2004), (10229,'S18_2432',28,'59.5500000',7,1667.4,'2004-03-11 00:00:00','2004-03-20 00:00:00','2004-03-12 00:00:00','Shipped',NULL,124,'2004-03-11',1,3,2004), (10229,'S18_3232',22,'100.0000000',5,4172.52,'2004-03-11 00:00:00','2004-03-20 00:00:00','2004-03-12 00:00:00','Shipped',NULL,124,'2004-03-11',1,3,2004), (10229,'S18_4600',41,'100.0000000',10,4716.23,'2004-03-11 00:00:00','2004-03-20 00:00:00','2004-03-12 00:00:00','Shipped',NULL,124,'2004-03-11',1,3,2004), (10229,'S18_4668',39,'40.2500000',14,1569.75,'2004-03-11 00:00:00','2004-03-20 00:00:00','2004-03-12 00:00:00','Shipped',NULL,124,'2004-03-11',1,3,2004), (10229,'S24_2300',48,'100.0000000',6,5704.32,'2004-03-11 00:00:00','2004-03-20 00:00:00','2004-03-12 00:00:00','Shipped',NULL,124,'2004-03-11',1,3,2004), (10229,'S24_2840',33,'32.8800000',2,1085.04,'2004-03-11 00:00:00','2004-03-20 00:00:00','2004-03-12 00:00:00','Shipped',NULL,124,'2004-03-11',1,3,2004), (10229,'S32_1268',25,'100.0000000',8,2793,'2004-03-11 00:00:00','2004-03-20 00:00:00','2004-03-12 00:00:00','Shipped',NULL,124,'2004-03-11',1,3,2004), (10229,'S32_2509',23,'54.1100000',3,1244.53,'2004-03-11 00:00:00','2004-03-20 00:00:00','2004-03-12 00:00:00','Shipped',NULL,124,'2004-03-11',1,3,2004), (10229,'S32_3522',30,'73.0400000',12,2191.2,'2004-03-11 00:00:00','2004-03-20 00:00:00','2004-03-12 00:00:00','Shipped',NULL,124,'2004-03-11',1,3,2004), (10229,'S700_2824',50,'100.0000000',11,5614,'2004-03-11 00:00:00','2004-03-20 00:00:00','2004-03-12 00:00:00','Shipped',NULL,124,'2004-03-11',1,3,2004), (10230,'S12_3148',43,'100.0000000',1,7016.31,'2004-03-15 00:00:00','2004-03-24 00:00:00','2004-03-20 00:00:00','Shipped','Customer very concerned about the exact color of the models. There is high risk that he may dispute the order because there is a slight color mismatch',128,'2004-03-15',1,3,2004), (10230,'S18_2238',49,'100.0000000',8,7300.51,'2004-03-15 00:00:00','2004-03-24 00:00:00','2004-03-20 00:00:00','Shipped','Customer very concerned about the exact color of the models. There is high risk that he may dispute the order because there is a slight color mismatch',128,'2004-03-15',1,3,2004), (10230,'S18_4027',42,'100.0000000',3,7238.28,'2004-03-15 00:00:00','2004-03-24 00:00:00','2004-03-20 00:00:00','Shipped','Customer very concerned about the exact color of the models. There is high risk that he may dispute the order because there is a slight color mismatch',128,'2004-03-15',1,3,2004), (10230,'S24_1444',36,'54.3300000',6,1955.88,'2004-03-15 00:00:00','2004-03-24 00:00:00','2004-03-20 00:00:00','Shipped','Customer very concerned about the exact color of the models. There is high risk that he may dispute the order because there is a slight color mismatch',128,'2004-03-15',1,3,2004), (10230,'S24_4048',45,'100.0000000',5,4737.15,'2004-03-15 00:00:00','2004-03-24 00:00:00','2004-03-20 00:00:00','Shipped','Customer very concerned about the exact color of the models. There is high risk that he may dispute the order because there is a slight color mismatch',128,'2004-03-15',1,3,2004), (10230,'S32_3207',46,'60.9000000',4,2801.4,'2004-03-15 00:00:00','2004-03-24 00:00:00','2004-03-20 00:00:00','Shipped','Customer very concerned about the exact color of the models. There is high risk that he may dispute the order because there is a slight color mismatch',128,'2004-03-15',1,3,2004), (10230,'S50_1392',34,'100.0000000',7,3974.94,'2004-03-15 00:00:00','2004-03-24 00:00:00','2004-03-20 00:00:00','Shipped','Customer very concerned about the exact color of the models. There is high risk that he may dispute the order because there is a slight color mismatch',128,'2004-03-15',1,3,2004), (10230,'S50_1514',43,'52.1400000',2,2242.02,'2004-03-15 00:00:00','2004-03-24 00:00:00','2004-03-20 00:00:00','Shipped','Customer very concerned about the exact color of the models. There is high risk that he may dispute the order because there is a slight color mismatch',128,'2004-03-15',1,3,2004), (10231,'S12_1108',42,'100.0000000',2,8378.58,'2004-03-19 00:00:00','2004-03-26 00:00:00','2004-03-25 00:00:00','Shipped',NULL,344,'2004-03-19',1,3,2004), (10231,'S12_3891',49,'100.0000000',1,6952.12,'2004-03-19 00:00:00','2004-03-26 00:00:00','2004-03-25 00:00:00','Shipped',NULL,344,'2004-03-19',1,3,2004), (10232,'S18_3140',22,'100.0000000',6,3606.02,'2004-03-20 00:00:00','2004-03-30 00:00:00','2004-03-25 00:00:00','Shipped',NULL,240,'2004-03-20',1,3,2004), (10232,'S18_3259',48,'95.8000000',8,4598.4,'2004-03-20 00:00:00','2004-03-30 00:00:00','2004-03-25 00:00:00','Shipped',NULL,240,'2004-03-20',1,3,2004), (10232,'S18_4522',23,'89.5300000',5,2059.19,'2004-03-20 00:00:00','2004-03-30 00:00:00','2004-03-25 00:00:00','Shipped',NULL,240,'2004-03-20',1,3,2004), (10232,'S24_2011',46,'100.0000000',4,5652.94,'2004-03-20 00:00:00','2004-03-30 00:00:00','2004-03-25 00:00:00','Shipped',NULL,240,'2004-03-20',1,3,2004), (10232,'S700_1938',26,'88.3400000',7,2296.84,'2004-03-20 00:00:00','2004-03-30 00:00:00','2004-03-25 00:00:00','Shipped',NULL,240,'2004-03-20',1,3,2004), (10232,'S700_3505',48,'96.1600000',1,4615.68,'2004-03-20 00:00:00','2004-03-30 00:00:00','2004-03-25 00:00:00','Shipped',NULL,240,'2004-03-20',1,3,2004), (10232,'S700_3962',35,'82.4300000',2,2885.05,'2004-03-20 00:00:00','2004-03-30 00:00:00','2004-03-25 00:00:00','Shipped',NULL,240,'2004-03-20',1,3,2004), (10232,'S72_3212',24,'49.6900000',3,1192.56,'2004-03-20 00:00:00','2004-03-30 00:00:00','2004-03-25 00:00:00','Shipped',NULL,240,'2004-03-20',1,3,2004), (10233,'S24_3151',40,'94.7100000',2,3788.4,'2004-03-29 00:00:00','2004-04-04 00:00:00','2004-04-02 00:00:00','Shipped','Customer requested special shippment. The instructions were passed along to the warehouse',328,'2004-03-29',1,3,2004), (10233,'S700_1138',36,'70.6700000',3,2544.12,'2004-03-29 00:00:00','2004-04-04 00:00:00','2004-04-02 00:00:00','Shipped','Customer requested special shippment. The instructions were passed along to the warehouse',328,'2004-03-29',1,3,2004), (10233,'S700_2610',29,'82.4000000',1,2389.6,'2004-03-29 00:00:00','2004-04-04 00:00:00','2004-04-02 00:00:00','Shipped','Customer requested special shippment. The instructions were passed along to the warehouse',328,'2004-03-29',1,3,2004), (10234,'S10_4757',48,'100.0000000',9,7246.08,'2004-03-30 00:00:00','2004-04-05 00:00:00','2004-04-02 00:00:00','Shipped',NULL,412,'2004-03-30',1,3,2004), (10234,'S18_1662',50,'100.0000000',1,9461.5,'2004-03-30 00:00:00','2004-04-05 00:00:00','2004-04-02 00:00:00','Shipped',NULL,412,'2004-03-30',1,3,2004), (10234,'S18_3029',48,'74.8400000',7,3592.32,'2004-03-30 00:00:00','2004-04-05 00:00:00','2004-04-02 00:00:00','Shipped',NULL,412,'2004-03-30',1,3,2004), (10234,'S18_3856',39,'100.0000000',6,4913.61,'2004-03-30 00:00:00','2004-04-05 00:00:00','2004-04-02 00:00:00','Shipped',NULL,412,'2004-03-30',1,3,2004), (10234,'S24_2841',44,'61.6600000',2,2713.04,'2004-03-30 00:00:00','2004-04-05 00:00:00','2004-04-02 00:00:00','Shipped',NULL,412,'2004-03-30',1,3,2004), (10234,'S24_3420',25,'57.2000000',3,1430,'2004-03-30 00:00:00','2004-04-05 00:00:00','2004-04-02 00:00:00','Shipped',NULL,412,'2004-03-30',1,3,2004), (10234,'S24_3816',31,'72.9600000',8,2261.76,'2004-03-30 00:00:00','2004-04-05 00:00:00','2004-04-02 00:00:00','Shipped',NULL,412,'2004-03-30',1,3,2004), (10234,'S700_2047',29,'87.8000000',5,2546.2,'2004-03-30 00:00:00','2004-04-05 00:00:00','2004-04-02 00:00:00','Shipped',NULL,412,'2004-03-30',1,3,2004), (10234,'S72_1253',40,'56.1200000',4,2244.8,'2004-03-30 00:00:00','2004-04-05 00:00:00','2004-04-02 00:00:00','Shipped',NULL,412,'2004-03-30',1,3,2004), (10235,'S18_2581',24,'76.0300000',3,1824.72,'2004-04-02 00:00:00','2004-04-12 00:00:00','2004-04-06 00:00:00','Shipped',NULL,260,'2004-04-02',2,4,2004), (10235,'S24_1785',23,'96.2900000',5,2214.67,'2004-04-02 00:00:00','2004-04-12 00:00:00','2004-04-06 00:00:00','Shipped',NULL,260,'2004-04-02',2,4,2004), (10235,'S24_3949',33,'60.0500000',12,1981.65,'2004-04-02 00:00:00','2004-04-12 00:00:00','2004-04-06 00:00:00','Shipped',NULL,260,'2004-04-02',2,4,2004), (10235,'S24_4278',40,'81.1400000',4,3245.6,'2004-04-02 00:00:00','2004-04-12 00:00:00','2004-04-06 00:00:00','Shipped',NULL,260,'2004-04-02',2,4,2004), (10235,'S32_1374',41,'100.0000000',1,4177.49,'2004-04-02 00:00:00','2004-04-12 00:00:00','2004-04-06 00:00:00','Shipped',NULL,260,'2004-04-02',2,4,2004), (10235,'S32_4289',34,'77.7300000',6,2642.82,'2004-04-02 00:00:00','2004-04-12 00:00:00','2004-04-06 00:00:00','Shipped',NULL,260,'2004-04-02',2,4,2004), (10235,'S50_1341',41,'35.3500000',7,1449.35,'2004-04-02 00:00:00','2004-04-12 00:00:00','2004-04-06 00:00:00','Shipped',NULL,260,'2004-04-02',2,4,2004), (10235,'S700_1691',25,'100.0000000',8,2580.25,'2004-04-02 00:00:00','2004-04-12 00:00:00','2004-04-06 00:00:00','Shipped',NULL,260,'2004-04-02',2,4,2004), (10235,'S700_2466',38,'88.7500000',10,3372.5,'2004-04-02 00:00:00','2004-04-12 00:00:00','2004-04-06 00:00:00','Shipped',NULL,260,'2004-04-02',2,4,2004), (10235,'S700_2834',25,'96.1100000',2,2402.75,'2004-04-02 00:00:00','2004-04-12 00:00:00','2004-04-06 00:00:00','Shipped',NULL,260,'2004-04-02',2,4,2004), (10235,'S700_3167',32,'92.0000000',9,2944,'2004-04-02 00:00:00','2004-04-12 00:00:00','2004-04-06 00:00:00','Shipped',NULL,260,'2004-04-02',2,4,2004), (10235,'S700_4002',34,'72.5500000',11,2466.7,'2004-04-02 00:00:00','2004-04-12 00:00:00','2004-04-06 00:00:00','Shipped',NULL,260,'2004-04-02',2,4,2004), (10236,'S10_2016',22,'100.0000000',1,2852.08,'2004-04-03 00:00:00','2004-04-11 00:00:00','2004-04-08 00:00:00','Shipped',NULL,486,'2004-04-03',2,4,2004), (10236,'S18_2625',23,'55.7200000',2,1281.56,'2004-04-03 00:00:00','2004-04-11 00:00:00','2004-04-08 00:00:00','Shipped',NULL,486,'2004-04-03',2,4,2004), (10236,'S24_2000',36,'87.6000000',3,3153.6,'2004-04-03 00:00:00','2004-04-11 00:00:00','2004-04-08 00:00:00','Shipped',NULL,486,'2004-04-03',2,4,2004), (10237,'S10_1678',23,'100.0000000',7,2333.12,'2004-04-05 00:00:00','2004-04-12 00:00:00','2004-04-10 00:00:00','Shipped',NULL,181,'2004-04-05',2,4,2004), (10237,'S10_4698',39,'100.0000000',9,7023.9,'2004-04-05 00:00:00','2004-04-12 00:00:00','2004-04-10 00:00:00','Shipped',NULL,181,'2004-04-05',2,4,2004), (10237,'S12_2823',32,'100.0000000',6,4193.28,'2004-04-05 00:00:00','2004-04-12 00:00:00','2004-04-10 00:00:00','Shipped',NULL,181,'2004-04-05',2,4,2004), (10237,'S18_3782',26,'52.2200000',1,1357.72,'2004-04-05 00:00:00','2004-04-12 00:00:00','2004-04-10 00:00:00','Shipped',NULL,181,'2004-04-05',2,4,2004), (10237,'S24_1578',20,'100.0000000',8,2299,'2004-04-05 00:00:00','2004-04-12 00:00:00','2004-04-10 00:00:00','Shipped',NULL,181,'2004-04-05',2,4,2004), (10237,'S24_2360',26,'79.6500000',4,2070.9,'2004-04-05 00:00:00','2004-04-12 00:00:00','2004-04-10 00:00:00','Shipped',NULL,181,'2004-04-05',2,4,2004), (10237,'S32_2206',26,'40.2300000',2,1045.98,'2004-04-05 00:00:00','2004-04-12 00:00:00','2004-04-10 00:00:00','Shipped',NULL,181,'2004-04-05',2,4,2004), (10237,'S32_4485',27,'100.0000000',5,3113.64,'2004-04-05 00:00:00','2004-04-12 00:00:00','2004-04-10 00:00:00','Shipped',NULL,181,'2004-04-05',2,4,2004), (10237,'S50_4713',20,'68.3400000',3,1366.8,'2004-04-05 00:00:00','2004-04-12 00:00:00','2004-04-10 00:00:00','Shipped',NULL,181,'2004-04-05',2,4,2004), (10238,'S12_1099',28,'100.0000000',3,5774.72,'2004-04-09 00:00:00','2004-04-16 00:00:00','2004-04-10 00:00:00','Shipped',NULL,145,'2004-04-09',2,4,2004), (10238,'S12_3380',29,'100.0000000',1,3167.38,'2004-04-09 00:00:00','2004-04-16 00:00:00','2004-04-10 00:00:00','Shipped',NULL,145,'2004-04-09',2,4,2004), (10238,'S12_3990',20,'74.2100000',4,1484.2,'2004-04-09 00:00:00','2004-04-16 00:00:00','2004-04-10 00:00:00','Shipped',NULL,145,'2004-04-09',2,4,2004), (10238,'S18_3278',41,'73.1700000',6,2999.97,'2004-04-09 00:00:00','2004-04-16 00:00:00','2004-04-10 00:00:00','Shipped',NULL,145,'2004-04-09',2,4,2004), (10238,'S18_3482',49,'100.0000000',5,6554.24,'2004-04-09 00:00:00','2004-04-16 00:00:00','2004-04-10 00:00:00','Shipped',NULL,145,'2004-04-09',2,4,2004), (10238,'S18_4721',44,'100.0000000',8,6350.96,'2004-04-09 00:00:00','2004-04-16 00:00:00','2004-04-10 00:00:00','Shipped',NULL,145,'2004-04-09',2,4,2004), (10238,'S24_3371',47,'62.4500000',2,2935.15,'2004-04-09 00:00:00','2004-04-16 00:00:00','2004-04-10 00:00:00','Shipped',NULL,145,'2004-04-09',2,4,2004), (10238,'S24_4620',22,'93.7700000',7,2062.94,'2004-04-09 00:00:00','2004-04-16 00:00:00','2004-04-10 00:00:00','Shipped',NULL,145,'2004-04-09',2,4,2004), (10239,'S12_4675',21,'93.2800000',5,1958.88,'2004-04-12 00:00:00','2004-04-21 00:00:00','2004-04-17 00:00:00','Shipped',NULL,311,'2004-04-12',2,4,2004), (10239,'S18_1889',46,'73.9200000',4,3400.32,'2004-04-12 00:00:00','2004-04-21 00:00:00','2004-04-17 00:00:00','Shipped',NULL,311,'2004-04-12',2,4,2004), (10239,'S18_3232',47,'100.0000000',1,7083.37,'2004-04-12 00:00:00','2004-04-21 00:00:00','2004-04-17 00:00:00','Shipped',NULL,311,'2004-04-12',2,4,2004), (10239,'S24_2972',20,'44.5600000',2,891.2,'2004-04-12 00:00:00','2004-04-21 00:00:00','2004-04-17 00:00:00','Shipped',NULL,311,'2004-04-12',2,4,2004), (10239,'S24_3856',29,'100.0000000',3,4479.63,'2004-04-12 00:00:00','2004-04-21 00:00:00','2004-04-17 00:00:00','Shipped',NULL,311,'2004-04-12',2,4,2004), (10240,'S18_1129',41,'100.0000000',3,5628.89,'2004-04-13 00:00:00','2004-04-20 00:00:00','2004-04-20 00:00:00','Shipped',NULL,177,'2004-04-13',2,4,2004), (10240,'S18_1984',37,'100.0000000',2,5526.32,'2004-04-13 00:00:00','2004-04-20 00:00:00','2004-04-20 00:00:00','Shipped',NULL,177,'2004-04-13',2,4,2004), (10240,'S18_3685',37,'100.0000000',1,5959.22,'2004-04-13 00:00:00','2004-04-20 00:00:00','2004-04-20 00:00:00','Shipped',NULL,177,'2004-04-13',2,4,2004), (10241,'S18_1589',21,'100.0000000',11,2508.66,'2004-04-13 00:00:00','2004-04-20 00:00:00','2004-04-19 00:00:00','Shipped',NULL,209,'2004-04-13',2,4,2004), (10241,'S18_1749',41,'100.0000000',2,7597.3,'2004-04-13 00:00:00','2004-04-20 00:00:00','2004-04-19 00:00:00','Shipped',NULL,209,'2004-04-13',2,4,2004), (10241,'S18_2248',33,'72.6500000',1,2397.45,'2004-04-13 00:00:00','2004-04-20 00:00:00','2004-04-19 00:00:00','Shipped',NULL,209,'2004-04-13',2,4,2004), (10241,'S18_2870',44,'100.0000000',12,6853.44,'2004-04-13 00:00:00','2004-04-20 00:00:00','2004-04-19 00:00:00','Shipped',NULL,209,'2004-04-13',2,4,2004), (10241,'S18_4409',42,'90.1900000',3,3787.98,'2004-04-13 00:00:00','2004-04-20 00:00:00','2004-04-19 00:00:00','Shipped',NULL,209,'2004-04-13',2,4,2004), (10241,'S18_4933',30,'66.9900000',4,2009.7,'2004-04-13 00:00:00','2004-04-20 00:00:00','2004-04-19 00:00:00','Shipped',NULL,209,'2004-04-13',2,4,2004), (10241,'S24_1046',22,'76.4300000',8,1681.46,'2004-04-13 00:00:00','2004-04-20 00:00:00','2004-04-19 00:00:00','Shipped',NULL,209,'2004-04-13',2,4,2004), (10241,'S24_1628',21,'40.2500000',10,845.25,'2004-04-13 00:00:00','2004-04-20 00:00:00','2004-04-19 00:00:00','Shipped',NULL,209,'2004-04-13',2,4,2004), (10241,'S24_2766',47,'94.5000000',6,4441.5,'2004-04-13 00:00:00','2004-04-20 00:00:00','2004-04-19 00:00:00','Shipped',NULL,209,'2004-04-13',2,4,2004), (10241,'S24_2887',28,'98.6500000',5,2762.2,'2004-04-13 00:00:00','2004-04-20 00:00:00','2004-04-19 00:00:00','Shipped',NULL,209,'2004-04-13',2,4,2004), (10241,'S24_3191',26,'81.3300000',7,2114.58,'2004-04-13 00:00:00','2004-04-20 00:00:00','2004-04-19 00:00:00','Shipped',NULL,209,'2004-04-13',2,4,2004), (10241,'S24_3432',27,'86.7300000',9,2341.71,'2004-04-13 00:00:00','2004-04-20 00:00:00','2004-04-19 00:00:00','Shipped',NULL,209,'2004-04-13',2,4,2004), (10242,'S24_3969',46,'36.9300000',1,1698.78,'2004-04-20 00:00:00','2004-04-28 00:00:00','2004-04-25 00:00:00','Shipped','Customer is interested in buying more Ferrari models',456,'2004-04-20',2,4,2004), (10243,'S18_2325',47,'100.0000000',2,6154.18,'2004-04-26 00:00:00','2004-05-03 00:00:00','2004-04-28 00:00:00','Shipped',NULL,495,'2004-04-26',2,4,2004), (10243,'S24_1937',33,'29.5400000',1,974.82,'2004-04-26 00:00:00','2004-05-03 00:00:00','2004-04-28 00:00:00','Shipped',NULL,495,'2004-04-26',2,4,2004), (10244,'S18_1342',40,'100.0000000',7,4684.8,'2004-04-29 00:00:00','2004-05-09 00:00:00','2004-05-04 00:00:00','Shipped',NULL,141,'2004-04-29',2,4,2004), (10244,'S18_1367',20,'58.2200000',6,1164.4,'2004-04-29 00:00:00','2004-05-09 00:00:00','2004-05-04 00:00:00','Shipped',NULL,141,'2004-04-29',2,4,2004), (10244,'S18_2795',43,'100.0000000',8,5950.34,'2004-04-29 00:00:00','2004-05-09 00:00:00','2004-05-04 00:00:00','Shipped',NULL,141,'2004-04-29',2,4,2004), (10244,'S18_2949',30,'100.0000000',1,3525.6,'2004-04-29 00:00:00','2004-05-09 00:00:00','2004-05-04 00:00:00','Shipped',NULL,141,'2004-04-29',2,4,2004), (10244,'S18_2957',24,'58.0900000',3,1394.16,'2004-04-29 00:00:00','2004-05-09 00:00:00','2004-05-04 00:00:00','Shipped',NULL,141,'2004-04-29',2,4,2004), (10244,'S18_3136',29,'100.0000000',2,3340.51,'2004-04-29 00:00:00','2004-05-09 00:00:00','2004-05-04 00:00:00','Shipped',NULL,141,'2004-04-29',2,4,2004), (10244,'S18_3320',36,'84.3300000',5,3035.88,'2004-04-29 00:00:00','2004-05-09 00:00:00','2004-05-04 00:00:00','Shipped',NULL,141,'2004-04-29',2,4,2004), (10244,'S24_2022',39,'45.2500000',9,1764.75,'2004-04-29 00:00:00','2004-05-09 00:00:00','2004-05-04 00:00:00','Shipped',NULL,141,'2004-04-29',2,4,2004), (10244,'S24_4258',40,'86.6800000',4,3467.2,'2004-04-29 00:00:00','2004-05-09 00:00:00','2004-05-04 00:00:00','Shipped',NULL,141,'2004-04-29',2,4,2004), (10245,'S10_1949',34,'100.0000000',9,6120.34,'2004-05-04 00:00:00','2004-05-12 00:00:00','2004-05-09 00:00:00','Shipped',NULL,455,'2004-05-04',2,5,2004), (10245,'S10_4962',28,'100.0000000',2,4591.72,'2004-05-04 00:00:00','2004-05-12 00:00:00','2004-05-09 00:00:00','Shipped',NULL,455,'2004-05-04',2,5,2004), (10245,'S12_1666',38,'100.0000000',6,5920.4,'2004-05-04 00:00:00','2004-05-12 00:00:00','2004-05-09 00:00:00','Shipped',NULL,455,'2004-05-04',2,5,2004), (10245,'S18_1097',29,'100.0000000',8,3451,'2004-05-04 00:00:00','2004-05-12 00:00:00','2004-05-09 00:00:00','Shipped',NULL,455,'2004-05-04',2,5,2004), (10245,'S18_4600',21,'100.0000000',3,2390.22,'2004-05-04 00:00:00','2004-05-12 00:00:00','2004-05-09 00:00:00','Shipped',NULL,455,'2004-05-04',2,5,2004), (10245,'S18_4668',45,'59.8700000',7,2694.15,'2004-05-04 00:00:00','2004-05-12 00:00:00','2004-05-09 00:00:00','Shipped',NULL,455,'2004-05-04',2,5,2004), (10245,'S32_1268',37,'100.0000000',1,4133.64,'2004-05-04 00:00:00','2004-05-12 00:00:00','2004-05-09 00:00:00','Shipped',NULL,455,'2004-05-04',2,5,2004), (10245,'S32_3522',44,'69.1600000',5,3043.04,'2004-05-04 00:00:00','2004-05-12 00:00:00','2004-05-09 00:00:00','Shipped',NULL,455,'2004-05-04',2,5,2004), (10245,'S700_2824',44,'100.0000000',4,4628.8,'2004-05-04 00:00:00','2004-05-12 00:00:00','2004-05-09 00:00:00','Shipped',NULL,455,'2004-05-04',2,5,2004), (10246,'S12_4473',46,'100.0000000',5,5069.66,'2004-05-05 00:00:00','2004-05-13 00:00:00','2004-05-06 00:00:00','Shipped',NULL,141,'2004-05-05',2,5,2004), (10246,'S18_2238',40,'100.0000000',4,6549.2,'2004-05-05 00:00:00','2004-05-13 00:00:00','2004-05-06 00:00:00','Shipped',NULL,141,'2004-05-05',2,5,2004), (10246,'S18_2319',22,'98.1800000',8,2159.96,'2004-05-05 00:00:00','2004-05-13 00:00:00','2004-05-06 00:00:00','Shipped',NULL,141,'2004-05-05',2,5,2004), (10246,'S18_2432',30,'61.9900000',11,1859.7,'2004-05-05 00:00:00','2004-05-13 00:00:00','2004-05-06 00:00:00','Shipped',NULL,141,'2004-05-05',2,5,2004), (10246,'S18_3232',36,'100.0000000',9,7132.68,'2004-05-05 00:00:00','2004-05-13 00:00:00','2004-05-06 00:00:00','Shipped',NULL,141,'2004-05-05',2,5,2004), (10246,'S24_1444',44,'52.6000000',2,2314.4,'2004-05-05 00:00:00','2004-05-13 00:00:00','2004-05-06 00:00:00','Shipped',NULL,141,'2004-05-05',2,5,2004), (10246,'S24_2300',29,'100.0000000',10,3520.6,'2004-05-05 00:00:00','2004-05-13 00:00:00','2004-05-06 00:00:00','Shipped',NULL,141,'2004-05-05',2,5,2004), (10246,'S24_2840',49,'36.0700000',6,1767.43,'2004-05-05 00:00:00','2004-05-13 00:00:00','2004-05-06 00:00:00','Shipped',NULL,141,'2004-05-05',2,5,2004), (10246,'S24_4048',46,'100.0000000',1,6311.2,'2004-05-05 00:00:00','2004-05-13 00:00:00','2004-05-06 00:00:00','Shipped',NULL,141,'2004-05-05',2,5,2004), (10246,'S32_2509',35,'48.7000000',7,1704.5,'2004-05-05 00:00:00','2004-05-13 00:00:00','2004-05-06 00:00:00','Shipped',NULL,141,'2004-05-05',2,5,2004), (10246,'S50_1392',22,'100.0000000',3,2928.42,'2004-05-05 00:00:00','2004-05-13 00:00:00','2004-05-06 00:00:00','Shipped',NULL,141,'2004-05-05',2,5,2004), (10247,'S12_1108',44,'100.0000000',2,10606.2,'2004-05-05 00:00:00','2004-05-11 00:00:00','2004-05-08 00:00:00','Shipped',NULL,334,'2004-05-05',2,5,2004), (10247,'S12_3148',25,'100.0000000',3,4381.25,'2004-05-05 00:00:00','2004-05-11 00:00:00','2004-05-08 00:00:00','Shipped',NULL,334,'2004-05-05',2,5,2004), (10247,'S12_3891',27,'100.0000000',1,4157.73,'2004-05-05 00:00:00','2004-05-11 00:00:00','2004-05-08 00:00:00','Shipped',NULL,334,'2004-05-05',2,5,2004), (10247,'S18_4027',48,'100.0000000',5,6756,'2004-05-05 00:00:00','2004-05-11 00:00:00','2004-05-08 00:00:00','Shipped',NULL,334,'2004-05-05',2,5,2004), (10247,'S32_3207',40,'49.7100000',6,1988.4,'2004-05-05 00:00:00','2004-05-11 00:00:00','2004-05-08 00:00:00','Shipped',NULL,334,'2004-05-05',2,5,2004), (10247,'S50_1514',49,'63.8500000',4,3128.65,'2004-05-05 00:00:00','2004-05-11 00:00:00','2004-05-08 00:00:00','Shipped',NULL,334,'2004-05-05',2,5,2004), (10248,'S10_4757',20,'100.0000000',3,2910.4,'2004-05-07 00:00:00','2004-05-14 00:00:00','2006-08-23 11:51:26','Cancelled','Order was mistakenly placed. The warehouse noticed the lack of documentation.',131,'2004-05-07',2,5,2004), (10248,'S18_3029',21,'73.9800000',1,1553.58,'2004-05-07 00:00:00','2004-05-14 00:00:00','2006-08-23 11:51:26','Cancelled','Order was mistakenly placed. The warehouse noticed the lack of documentation.',131,'2004-05-07',2,5,2004), (10248,'S18_3140',32,'100.0000000',12,3802.56,'2004-05-07 00:00:00','2004-05-14 00:00:00','2006-08-23 11:51:26','Cancelled','Order was mistakenly placed. The warehouse noticed the lack of documentation.',131,'2004-05-07',2,5,2004), (10248,'S18_3259',42,'100.0000000',14,5082.42,'2004-05-07 00:00:00','2004-05-14 00:00:00','2006-08-23 11:51:26','Cancelled','Order was mistakenly placed. The warehouse noticed the lack of documentation.',131,'2004-05-07',2,5,2004), (10248,'S18_4522',42,'75.4800000',11,3170.16,'2004-05-07 00:00:00','2004-05-14 00:00:00','2006-08-23 11:51:26','Cancelled','Order was mistakenly placed. The warehouse noticed the lack of documentation.',131,'2004-05-07',2,5,2004), (10248,'S24_2011',48,'100.0000000',10,6960.48,'2004-05-07 00:00:00','2004-05-14 00:00:00','2006-08-23 11:51:26','Cancelled','Order was mistakenly placed. The warehouse noticed the lack of documentation.',131,'2004-05-07',2,5,2004), (10248,'S24_3151',30,'100.0000000',5,3053.7,'2004-05-07 00:00:00','2004-05-14 00:00:00','2006-08-23 11:51:26','Cancelled','Order was mistakenly placed. The warehouse noticed the lack of documentation.',131,'2004-05-07',2,5,2004), (10248,'S24_3816',23,'76.3100000',2,1755.13,'2004-05-07 00:00:00','2004-05-14 00:00:00','2006-08-23 11:51:26','Cancelled','Order was mistakenly placed. The warehouse noticed the lack of documentation.',131,'2004-05-07',2,5,2004), (10248,'S700_1138',36,'71.3400000',6,2568.24,'2004-05-07 00:00:00','2004-05-14 00:00:00','2006-08-23 11:51:26','Cancelled','Order was mistakenly placed. The warehouse noticed the lack of documentation.',131,'2004-05-07',2,5,2004), (10248,'S700_1938',40,'100.0000000',13,4157.2,'2004-05-07 00:00:00','2004-05-14 00:00:00','2006-08-23 11:51:26','Cancelled','Order was mistakenly placed. The warehouse noticed the lack of documentation.',131,'2004-05-07',2,5,2004), (10248,'S700_2610',32,'75.8900000',4,2428.48,'2004-05-07 00:00:00','2004-05-14 00:00:00','2006-08-23 11:51:26','Cancelled','Order was mistakenly placed. The warehouse noticed the lack of documentation.',131,'2004-05-07',2,5,2004), (10248,'S700_3505',30,'100.0000000',7,3245.4,'2004-05-07 00:00:00','2004-05-14 00:00:00','2006-08-23 11:51:26','Cancelled','Order was mistakenly placed. The warehouse noticed the lack of documentation.',131,'2004-05-07',2,5,2004), (10248,'S700_3962',35,'90.3700000',8,3162.95,'2004-05-07 00:00:00','2004-05-14 00:00:00','2006-08-23 11:51:26','Cancelled','Order was mistakenly placed. The warehouse noticed the lack of documentation.',131,'2004-05-07',2,5,2004), (10248,'S72_3212',23,'65.5200000',9,1506.96,'2004-05-07 00:00:00','2004-05-14 00:00:00','2006-08-23 11:51:26','Cancelled','Order was mistakenly placed. The warehouse noticed the lack of documentation.',131,'2004-05-07',2,5,2004), (10249,'S18_3856',46,'100.0000000',5,5600.5,'2004-05-08 00:00:00','2004-05-17 00:00:00','2004-05-11 00:00:00','Shipped','Can we deliver the new Ford Mustang models by end-of-quarter?',173,'2004-05-08',2,5,2004), (10249,'S24_2841',20,'67.8200000',1,1356.4,'2004-05-08 00:00:00','2004-05-17 00:00:00','2004-05-11 00:00:00','Shipped','Can we deliver the new Ford Mustang models by end-of-quarter?',173,'2004-05-08',2,5,2004), (10249,'S24_3420',25,'69.7000000',2,1742.5,'2004-05-08 00:00:00','2004-05-17 00:00:00','2004-05-11 00:00:00','Shipped','Can we deliver the new Ford Mustang models by end-of-quarter?',173,'2004-05-08',2,5,2004), (10249,'S700_2047',40,'95.9500000',4,3838,'2004-05-08 00:00:00','2004-05-17 00:00:00','2004-05-11 00:00:00','Shipped','Can we deliver the new Ford Mustang models by end-of-quarter?',173,'2004-05-08',2,5,2004), (10249,'S72_1253',32,'57.6100000',3,1843.52,'2004-05-08 00:00:00','2004-05-17 00:00:00','2004-05-11 00:00:00','Shipped','Can we deliver the new Ford Mustang models by end-of-quarter?',173,'2004-05-08',2,5,2004), (10250,'S18_1662',45,'100.0000000',14,8160.3,'2004-05-11 00:00:00','2004-05-19 00:00:00','2004-05-15 00:00:00','Shipped',NULL,450,'2004-05-11',2,5,2004), (10250,'S18_2581',27,'98.8400000',4,2668.68,'2004-05-11 00:00:00','2004-05-19 00:00:00','2004-05-15 00:00:00','Shipped',NULL,450,'2004-05-11',2,5,2004), (10250,'S24_1785',31,'88.6300000',6,2747.53,'2004-05-11 00:00:00','2004-05-19 00:00:00','2004-05-15 00:00:00','Shipped',NULL,450,'2004-05-11',2,5,2004), (10250,'S24_2000',32,'87.6000000',1,2803.2,'2004-05-11 00:00:00','2004-05-19 00:00:00','2004-05-15 00:00:00','Shipped',NULL,450,'2004-05-11',2,5,2004), (10250,'S24_3949',40,'75.0600000',13,3002.4,'2004-05-11 00:00:00','2004-05-19 00:00:00','2004-05-15 00:00:00','Shipped',NULL,450,'2004-05-11',2,5,2004), (10250,'S24_4278',37,'74.6200000',5,2760.94,'2004-05-11 00:00:00','2004-05-19 00:00:00','2004-05-15 00:00:00','Shipped',NULL,450,'2004-05-11',2,5,2004), (10250,'S32_1374',31,'100.0000000',2,3282.28,'2004-05-11 00:00:00','2004-05-19 00:00:00','2004-05-15 00:00:00','Shipped',NULL,450,'2004-05-11',2,5,2004), (10250,'S32_4289',50,'61.2200000',7,3061,'2004-05-11 00:00:00','2004-05-19 00:00:00','2004-05-15 00:00:00','Shipped',NULL,450,'2004-05-11',2,5,2004), (10250,'S50_1341',36,'51.9300000',8,1869.48,'2004-05-11 00:00:00','2004-05-19 00:00:00','2004-05-15 00:00:00','Shipped',NULL,450,'2004-05-11',2,5,2004), (10250,'S700_1691',31,'91.3400000',9,2831.54,'2004-05-11 00:00:00','2004-05-19 00:00:00','2004-05-15 00:00:00','Shipped',NULL,450,'2004-05-11',2,5,2004), (10250,'S700_2466',35,'100.0000000',11,3909.15,'2004-05-11 00:00:00','2004-05-19 00:00:00','2004-05-15 00:00:00','Shipped',NULL,450,'2004-05-11',2,5,2004), (10250,'S700_2834',44,'100.0000000',3,6055.72,'2004-05-11 00:00:00','2004-05-19 00:00:00','2004-05-15 00:00:00','Shipped',NULL,450,'2004-05-11',2,5,2004), (10250,'S700_3167',44,'67.2000000',10,2956.8,'2004-05-11 00:00:00','2004-05-19 00:00:00','2004-05-15 00:00:00','Shipped',NULL,450,'2004-05-11',2,5,2004), (10250,'S700_4002',38,'62.1900000',12,2363.22,'2004-05-11 00:00:00','2004-05-19 00:00:00','2004-05-15 00:00:00','Shipped',NULL,450,'2004-05-11',2,5,2004), (10251,'S10_1678',28,'100.0000000',2,3188.64,'2004-05-18 00:00:00','2004-05-24 00:00:00','2004-05-24 00:00:00','Shipped',NULL,328,'2004-05-18',2,5,2004), (10251,'S10_2016',44,'100.0000000',5,5756.52,'2004-05-18 00:00:00','2004-05-24 00:00:00','2004-05-24 00:00:00','Shipped',NULL,328,'2004-05-18',2,5,2004), (10251,'S10_4698',43,'100.0000000',4,7078.23,'2004-05-18 00:00:00','2004-05-24 00:00:00','2004-05-24 00:00:00','Shipped',NULL,328,'2004-05-18',2,5,2004), (10251,'S12_2823',46,'100.0000000',1,7552.28,'2004-05-18 00:00:00','2004-05-24 00:00:00','2004-05-24 00:00:00','Shipped',NULL,328,'2004-05-18',2,5,2004), (10251,'S18_2625',29,'61.1800000',6,1774.22,'2004-05-18 00:00:00','2004-05-24 00:00:00','2004-05-24 00:00:00','Shipped',NULL,328,'2004-05-18',2,5,2004), (10251,'S24_1578',26,'100.0000000',3,2637.18,'2004-05-18 00:00:00','2004-05-24 00:00:00','2004-05-24 00:00:00','Shipped',NULL,328,'2004-05-18',2,5,2004), (10252,'S18_3278',20,'76.3900000',2,1527.8,'2004-05-26 00:00:00','2004-06-04 00:00:00','2004-05-29 00:00:00','Shipped',NULL,406,'2004-05-26',2,5,2004), (10252,'S18_3482',41,'100.0000000',1,6749.83,'2004-05-26 00:00:00','2004-06-04 00:00:00','2004-05-29 00:00:00','Shipped',NULL,406,'2004-05-26',2,5,2004), (10252,'S18_3782',31,'52.8400000',5,1638.04,'2004-05-26 00:00:00','2004-06-04 00:00:00','2004-05-29 00:00:00','Shipped',NULL,406,'2004-05-26',2,5,2004), (10252,'S18_4721',26,'100.0000000',4,3559.4,'2004-05-26 00:00:00','2004-06-04 00:00:00','2004-05-29 00:00:00','Shipped',NULL,406,'2004-05-26',2,5,2004), (10252,'S24_2360',47,'65.8000000',8,3092.6,'2004-05-26 00:00:00','2004-06-04 00:00:00','2004-05-29 00:00:00','Shipped',NULL,406,'2004-05-26',2,5,2004), (10252,'S24_4620',38,'87.3100000',3,3317.78,'2004-05-26 00:00:00','2004-06-04 00:00:00','2004-05-29 00:00:00','Shipped',NULL,406,'2004-05-26',2,5,2004), (10252,'S32_2206',36,'48.2800000',6,1738.08,'2004-05-26 00:00:00','2004-06-04 00:00:00','2004-05-29 00:00:00','Shipped',NULL,406,'2004-05-26',2,5,2004), (10252,'S32_4485',25,'100.0000000',9,2832,'2004-05-26 00:00:00','2004-06-04 00:00:00','2004-05-29 00:00:00','Shipped',NULL,406,'2004-05-26',2,5,2004), (10252,'S50_4713',48,'72.4100000',7,3475.68,'2004-05-26 00:00:00','2004-06-04 00:00:00','2004-05-29 00:00:00','Shipped',NULL,406,'2004-05-26',2,5,2004), (10253,'S12_1099',24,'100.0000000',13,3922.56,'2004-06-01 00:00:00','2004-06-09 00:00:00','2004-06-02 00:00:00','Cancelled','Customer disputed the order and we agreed to cancel it. We must be more cautions with this customer going forward, since they are very hard to please. We must cover the shipping fees.',201,'2004-06-01',2,6,2004), (10253,'S12_3380',22,'100.0000000',11,2402.84,'2004-06-01 00:00:00','2004-06-09 00:00:00','2004-06-02 00:00:00','Cancelled','Customer disputed the order and we agreed to cancel it. We must be more cautions with this customer going forward, since they are very hard to please. We must cover the shipping fees.',201,'2004-06-01',2,6,2004), (10253,'S12_3990',25,'90.1700000',14,2254.25,'2004-06-01 00:00:00','2004-06-09 00:00:00','2004-06-02 00:00:00','Cancelled','Customer disputed the order and we agreed to cancel it. We must be more cautions with this customer going forward, since they are very hard to please. We must cover the shipping fees.',201,'2004-06-01',2,6,2004), (10253,'S12_4675',41,'100.0000000',10,4910.57,'2004-06-01 00:00:00','2004-06-09 00:00:00','2004-06-02 00:00:00','Cancelled','Customer disputed the order and we agreed to cancel it. We must be more cautions with this customer going forward, since they are very hard to please. We must cover the shipping fees.',201,'2004-06-01',2,6,2004), (10253,'S18_1129',26,'100.0000000',5,3054.48,'2004-06-01 00:00:00','2004-06-09 00:00:00','2004-06-02 00:00:00','Cancelled','Customer disputed the order and we agreed to cancel it. We must be more cautions with this customer going forward, since they are very hard to please. We must cover the shipping fees.',201,'2004-06-01',2,6,2004), (10253,'S18_1589',24,'100.0000000',1,3374.88,'2004-06-01 00:00:00','2004-06-09 00:00:00','2004-06-02 00:00:00','Cancelled','Customer disputed the order and we agreed to cancel it. We must be more cautions with this customer going forward, since they are very hard to please. We must cover the shipping fees.',201,'2004-06-01',2,6,2004), (10253,'S18_1889',23,'83.9300000',9,1930.39,'2004-06-01 00:00:00','2004-06-09 00:00:00','2004-06-02 00:00:00','Cancelled','Customer disputed the order and we agreed to cancel it. We must be more cautions with this customer going forward, since they are very hard to please. We must cover the shipping fees.',201,'2004-06-01',2,6,2004), (10253,'S18_1984',33,'100.0000000',4,4459.62,'2004-06-01 00:00:00','2004-06-09 00:00:00','2004-06-02 00:00:00','Cancelled','Customer disputed the order and we agreed to cancel it. We must be more cautions with this customer going forward, since they are very hard to please. We must cover the shipping fees.',201,'2004-06-01',2,6,2004), (10253,'S18_2870',37,'100.0000000',2,5177.04,'2004-06-01 00:00:00','2004-06-09 00:00:00','2004-06-02 00:00:00','Cancelled','Customer disputed the order and we agreed to cancel it. We must be more cautions with this customer going forward, since they are very hard to please. We must cover the shipping fees.',201,'2004-06-01',2,6,2004), (10253,'S18_3232',40,'100.0000000',6,6773.6,'2004-06-01 00:00:00','2004-06-09 00:00:00','2004-06-02 00:00:00','Cancelled','Customer disputed the order and we agreed to cancel it. We must be more cautions with this customer going forward, since they are very hard to please. We must cover the shipping fees.',201,'2004-06-01',2,6,2004), (10253,'S18_3685',31,'100.0000000',3,4029.38,'2004-06-01 00:00:00','2004-06-09 00:00:00','2004-06-02 00:00:00','Cancelled','Customer disputed the order and we agreed to cancel it. We must be more cautions with this customer going forward, since they are very hard to please. We must cover the shipping fees.',201,'2004-06-01',2,6,2004), (10253,'S24_2972',40,'42.6700000',7,1706.8,'2004-06-01 00:00:00','2004-06-09 00:00:00','2004-06-02 00:00:00','Cancelled','Customer disputed the order and we agreed to cancel it. We must be more cautions with this customer going forward, since they are very hard to please. We must cover the shipping fees.',201,'2004-06-01',2,6,2004), (10253,'S24_3371',24,'52.6600000',12,1263.84,'2004-06-01 00:00:00','2004-06-09 00:00:00','2004-06-02 00:00:00','Cancelled','Customer disputed the order and we agreed to cancel it. We must be more cautions with this customer going forward, since they are very hard to please. We must cover the shipping fees.',201,'2004-06-01',2,6,2004), (10253,'S24_3856',39,'100.0000000',8,5148,'2004-06-01 00:00:00','2004-06-09 00:00:00','2004-06-02 00:00:00','Cancelled','Customer disputed the order and we agreed to cancel it. We must be more cautions with this customer going forward, since they are very hard to please. We must cover the shipping fees.',201,'2004-06-01',2,6,2004), (10254,'S18_1749',49,'100.0000000',5,6997.2,'2004-06-03 00:00:00','2004-06-13 00:00:00','2004-06-04 00:00:00','Shipped','Customer requested that DHL is used for this shipping',323,'2004-06-03',2,6,2004), (10254,'S18_2248',36,'63.5700000',4,2288.52,'2004-06-03 00:00:00','2004-06-13 00:00:00','2004-06-04 00:00:00','Shipped','Customer requested that DHL is used for this shipping',323,'2004-06-03',2,6,2004), (10254,'S18_2325',41,'100.0000000',2,4534.6,'2004-06-03 00:00:00','2004-06-13 00:00:00','2004-06-04 00:00:00','Shipped','Customer requested that DHL is used for this shipping',323,'2004-06-03',2,6,2004), (10254,'S18_4409',34,'92.9500000',6,3160.3,'2004-06-03 00:00:00','2004-06-13 00:00:00','2004-06-04 00:00:00','Shipped','Customer requested that DHL is used for this shipping',323,'2004-06-03',2,6,2004), (10254,'S18_4933',30,'57.7300000',7,1731.9,'2004-06-03 00:00:00','2004-06-13 00:00:00','2004-06-04 00:00:00','Shipped','Customer requested that DHL is used for this shipping',323,'2004-06-03',2,6,2004), (10254,'S24_1046',34,'64.6700000',11,2198.78,'2004-06-03 00:00:00','2004-06-13 00:00:00','2004-06-04 00:00:00','Shipped','Customer requested that DHL is used for this shipping',323,'2004-06-03',2,6,2004), (10254,'S24_1628',32,'60.3700000',13,1931.84,'2004-06-03 00:00:00','2004-06-13 00:00:00','2004-06-04 00:00:00','Shipped','Customer requested that DHL is used for this shipping',323,'2004-06-03',2,6,2004), (10254,'S24_1937',38,'26.8800000',1,1021.44,'2004-06-03 00:00:00','2004-06-13 00:00:00','2004-06-04 00:00:00','Shipped','Customer requested that DHL is used for this shipping',323,'2004-06-03',2,6,2004), (10254,'S24_2766',31,'100.0000000',9,3126.97,'2004-06-03 00:00:00','2004-06-13 00:00:00','2004-06-04 00:00:00','Shipped','Customer requested that DHL is used for this shipping',323,'2004-06-03',2,6,2004), (10254,'S24_2887',33,'96.3000000',8,3177.9,'2004-06-03 00:00:00','2004-06-13 00:00:00','2004-06-04 00:00:00','Shipped','Customer requested that DHL is used for this shipping',323,'2004-06-03',2,6,2004), (10254,'S24_3191',42,'96.7400000',10,4063.08,'2004-06-03 00:00:00','2004-06-13 00:00:00','2004-06-04 00:00:00','Shipped','Customer requested that DHL is used for this shipping',323,'2004-06-03',2,6,2004), (10254,'S24_3432',49,'100.0000000',12,4932.34,'2004-06-03 00:00:00','2004-06-13 00:00:00','2004-06-04 00:00:00','Shipped','Customer requested that DHL is used for this shipping',323,'2004-06-03',2,6,2004), (10254,'S24_3969',20,'43.4900000',3,869.8,'2004-06-03 00:00:00','2004-06-13 00:00:00','2004-06-04 00:00:00','Shipped','Customer requested that DHL is used for this shipping',323,'2004-06-03',2,6,2004), (10255,'S18_2795',24,'100.0000000',1,3726,'2004-06-04 00:00:00','2004-06-12 00:00:00','2004-06-09 00:00:00','Shipped',NULL,209,'2004-06-04',2,6,2004), (10255,'S24_2022',37,'45.7000000',2,1690.9,'2004-06-04 00:00:00','2004-06-12 00:00:00','2004-06-09 00:00:00','Shipped',NULL,209,'2004-06-04',2,6,2004), (10256,'S18_1342',34,'95.5500000',2,3248.7,'2004-06-08 00:00:00','2004-06-16 00:00:00','2004-06-10 00:00:00','Shipped',NULL,145,'2004-06-08',2,6,2004), (10256,'S18_1367',29,'51.7500000',1,1500.75,'2004-06-08 00:00:00','2004-06-16 00:00:00','2004-06-10 00:00:00','Shipped',NULL,145,'2004-06-08',2,6,2004), (10257,'S18_2949',50,'88.1400000',1,4407,'2004-06-14 00:00:00','2004-06-24 00:00:00','2004-06-15 00:00:00','Shipped',NULL,450,'2004-06-14',2,6,2004), (10257,'S18_2957',49,'53.7200000',3,2632.28,'2004-06-14 00:00:00','2004-06-24 00:00:00','2004-06-15 00:00:00','Shipped',NULL,450,'2004-06-14',2,6,2004), (10257,'S18_3136',37,'84.8200000',2,3138.34,'2004-06-14 00:00:00','2004-06-24 00:00:00','2004-06-15 00:00:00','Shipped',NULL,450,'2004-06-14',2,6,2004), (10257,'S18_3320',26,'89.2900000',5,2321.54,'2004-06-14 00:00:00','2004-06-24 00:00:00','2004-06-15 00:00:00','Shipped',NULL,450,'2004-06-14',2,6,2004), (10257,'S24_4258',46,'78.8900000',4,3628.94,'2004-06-14 00:00:00','2004-06-24 00:00:00','2004-06-15 00:00:00','Shipped',NULL,450,'2004-06-14',2,6,2004), (10258,'S10_1949',32,'100.0000000',6,7680.64,'2004-06-15 00:00:00','2004-06-25 00:00:00','2004-06-23 00:00:00','Shipped',NULL,398,'2004-06-15',2,6,2004), (10258,'S12_1666',41,'100.0000000',3,6668.24,'2004-06-15 00:00:00','2004-06-25 00:00:00','2004-06-23 00:00:00','Shipped',NULL,398,'2004-06-15',2,6,2004), (10258,'S18_1097',41,'100.0000000',5,5453,'2004-06-15 00:00:00','2004-06-25 00:00:00','2004-06-23 00:00:00','Shipped',NULL,398,'2004-06-15',2,6,2004), (10258,'S18_4668',21,'59.8700000',4,1257.27,'2004-06-15 00:00:00','2004-06-25 00:00:00','2004-06-23 00:00:00','Shipped',NULL,398,'2004-06-15',2,6,2004), (10258,'S32_3522',20,'61.4100000',2,1228.2,'2004-06-15 00:00:00','2004-06-25 00:00:00','2004-06-23 00:00:00','Shipped',NULL,398,'2004-06-15',2,6,2004), (10258,'S700_2824',45,'80.9200000',1,3641.4,'2004-06-15 00:00:00','2004-06-25 00:00:00','2004-06-23 00:00:00','Shipped',NULL,398,'2004-06-15',2,6,2004), (10259,'S10_4962',26,'100.0000000',12,4033.38,'2004-06-15 00:00:00','2004-06-22 00:00:00','2004-06-17 00:00:00','Shipped',NULL,166,'2004-06-15',2,6,2004), (10259,'S12_4473',46,'100.0000000',4,6541.2,'2004-06-15 00:00:00','2004-06-22 00:00:00','2004-06-17 00:00:00','Shipped',NULL,166,'2004-06-15',2,6,2004), (10259,'S18_2238',30,'100.0000000',3,5697.9,'2004-06-15 00:00:00','2004-06-22 00:00:00','2004-06-17 00:00:00','Shipped',NULL,166,'2004-06-15',2,6,2004), (10259,'S18_2319',34,'99.4100000',7,3379.94,'2004-06-15 00:00:00','2004-06-22 00:00:00','2004-06-17 00:00:00','Shipped',NULL,166,'2004-06-15',2,6,2004), (10259,'S18_2432',30,'49.2200000',10,1476.6,'2004-06-15 00:00:00','2004-06-22 00:00:00','2004-06-17 00:00:00','Shipped',NULL,166,'2004-06-15',2,6,2004), (10259,'S18_3232',27,'100.0000000',8,3657.69,'2004-06-15 00:00:00','2004-06-22 00:00:00','2004-06-17 00:00:00','Shipped',NULL,166,'2004-06-15',2,6,2004), (10259,'S18_4600',41,'100.0000000',13,4666.62,'2004-06-15 00:00:00','2004-06-22 00:00:00','2004-06-17 00:00:00','Shipped',NULL,166,'2004-06-15',2,6,2004), (10259,'S24_1444',28,'46.8200000',1,1310.96,'2004-06-15 00:00:00','2004-06-22 00:00:00','2004-06-17 00:00:00','Shipped',NULL,166,'2004-06-15',2,6,2004), (10259,'S24_2300',47,'100.0000000',9,5285.62,'2004-06-15 00:00:00','2004-06-22 00:00:00','2004-06-17 00:00:00','Shipped',NULL,166,'2004-06-15',2,6,2004), (10259,'S24_2840',31,'33.2400000',5,1030.44,'2004-06-15 00:00:00','2004-06-22 00:00:00','2004-06-17 00:00:00','Shipped',NULL,166,'2004-06-15',2,6,2004), (10259,'S32_1268',45,'86.6800000',11,3900.6,'2004-06-15 00:00:00','2004-06-22 00:00:00','2004-06-17 00:00:00','Shipped',NULL,166,'2004-06-15',2,6,2004), (10259,'S32_2509',40,'43.8300000',6,1753.2,'2004-06-15 00:00:00','2004-06-22 00:00:00','2004-06-17 00:00:00','Shipped',NULL,166,'2004-06-15',2,6,2004), (10259,'S50_1392',29,'100.0000000',2,3054.57,'2004-06-15 00:00:00','2004-06-22 00:00:00','2004-06-17 00:00:00','Shipped',NULL,166,'2004-06-15',2,6,2004), (10260,'S12_1108',46,'100.0000000',5,10514.7,'2004-06-16 00:00:00','2004-06-22 00:00:00','2006-08-23 11:51:29','Cancelled','Customer heard complaints from their customers and called to cancel this order. Will notify the Sales Manager.',357,'2004-06-16',2,6,2004); INSERT INTO `orderfact` (`ORDERNUMBER`,`PRODUCTCODE`,`QUANTITYORDERED`,`PRICEEACH`,`ORDERLINENUMBER`,`TOTALPRICE`,`ORDERDATE`,`REQUIREDDATE`,`SHIPPEDDATE`,`STATUS`,`COMMENTS`,`CUSTOMERNUMBER`,`TIME_ID`,`QTR_ID`,`MONTH_ID`,`YEAR_ID`) VALUES (10260,'S12_3148',30,'100.0000000',6,5121.6,'2004-06-16 00:00:00','2004-06-22 00:00:00','2006-08-23 11:51:29','Cancelled','Customer heard complaints from their customers and called to cancel this order. Will notify the Sales Manager.',357,'2004-06-16',2,6,2004), (10260,'S12_3891',44,'100.0000000',4,7536.76,'2004-06-16 00:00:00','2004-06-22 00:00:00','2006-08-23 11:51:29','Cancelled','Customer heard complaints from their customers and called to cancel this order. Will notify the Sales Manager.',357,'2004-06-16',2,6,2004), (10260,'S18_3140',32,'100.0000000',1,4196.16,'2004-06-16 00:00:00','2004-06-22 00:00:00','2006-08-23 11:51:29','Cancelled','Customer heard complaints from their customers and called to cancel this order. Will notify the Sales Manager.',357,'2004-06-16',2,6,2004), (10260,'S18_3259',29,'88.7400000',3,2573.46,'2004-06-16 00:00:00','2004-06-22 00:00:00','2006-08-23 11:51:29','Cancelled','Customer heard complaints from their customers and called to cancel this order. Will notify the Sales Manager.',357,'2004-06-16',2,6,2004), (10260,'S18_4027',23,'100.0000000',8,3567.53,'2004-06-16 00:00:00','2004-06-22 00:00:00','2006-08-23 11:51:29','Cancelled','Customer heard complaints from their customers and called to cancel this order. Will notify the Sales Manager.',357,'2004-06-16',2,6,2004), (10260,'S24_4048',23,'100.0000000',10,2366.7,'2004-06-16 00:00:00','2004-06-22 00:00:00','2006-08-23 11:51:29','Cancelled','Customer heard complaints from their customers and called to cancel this order. Will notify the Sales Manager.',357,'2004-06-16',2,6,2004), (10260,'S32_3207',27,'57.1700000',9,1543.59,'2004-06-16 00:00:00','2004-06-22 00:00:00','2006-08-23 11:51:29','Cancelled','Customer heard complaints from their customers and called to cancel this order. Will notify the Sales Manager.',357,'2004-06-16',2,6,2004), (10260,'S50_1514',21,'55.6500000',7,1168.65,'2004-06-16 00:00:00','2004-06-22 00:00:00','2006-08-23 11:51:29','Cancelled','Customer heard complaints from their customers and called to cancel this order. Will notify the Sales Manager.',357,'2004-06-16',2,6,2004), (10260,'S700_1938',33,'85.7400000',2,2829.42,'2004-06-16 00:00:00','2004-06-22 00:00:00','2006-08-23 11:51:29','Cancelled','Customer heard complaints from their customers and called to cancel this order. Will notify the Sales Manager.',357,'2004-06-16',2,6,2004), (10261,'S10_4757',27,'100.0000000',1,3378.24,'2004-06-17 00:00:00','2004-06-25 00:00:00','2004-06-22 00:00:00','Shipped',NULL,233,'2004-06-17',2,6,2004), (10261,'S18_4522',20,'89.5300000',9,1790.6,'2004-06-17 00:00:00','2004-06-25 00:00:00','2004-06-22 00:00:00','Shipped',NULL,233,'2004-06-17',2,6,2004), (10261,'S24_2011',36,'100.0000000',8,4512.6,'2004-06-17 00:00:00','2004-06-25 00:00:00','2004-06-22 00:00:00','Shipped',NULL,233,'2004-06-17',2,6,2004), (10261,'S24_3151',22,'91.1700000',3,2005.74,'2004-06-17 00:00:00','2004-06-25 00:00:00','2004-06-22 00:00:00','Shipped',NULL,233,'2004-06-17',2,6,2004), (10261,'S700_1138',34,'62.0000000',4,2108,'2004-06-17 00:00:00','2004-06-25 00:00:00','2004-06-22 00:00:00','Shipped',NULL,233,'2004-06-17',2,6,2004), (10261,'S700_2610',44,'68.6700000',2,3021.48,'2004-06-17 00:00:00','2004-06-25 00:00:00','2004-06-22 00:00:00','Shipped',NULL,233,'2004-06-17',2,6,2004), (10261,'S700_3505',25,'88.1500000',5,2203.75,'2004-06-17 00:00:00','2004-06-25 00:00:00','2004-06-22 00:00:00','Shipped',NULL,233,'2004-06-17',2,6,2004), (10261,'S700_3962',50,'81.4300000',6,4071.5,'2004-06-17 00:00:00','2004-06-25 00:00:00','2004-06-22 00:00:00','Shipped',NULL,233,'2004-06-17',2,6,2004), (10261,'S72_3212',29,'50.7800000',7,1472.62,'2004-06-17 00:00:00','2004-06-25 00:00:00','2004-06-22 00:00:00','Shipped',NULL,233,'2004-06-17',2,6,2004), (10262,'S18_1662',49,'100.0000000',9,6567.96,'2004-06-24 00:00:00','2004-07-01 00:00:00','2006-08-23 11:51:29','Cancelled','This customer found a better offer from one of our competitors. Will call back to renegotiate.',141,'2004-06-24',2,6,2004), (10262,'S18_3029',32,'84.3000000',15,2697.6,'2004-06-24 00:00:00','2004-07-01 00:00:00','2006-08-23 11:51:29','Cancelled','This customer found a better offer from one of our competitors. Will call back to renegotiate.',141,'2004-06-24',2,6,2004), (10262,'S18_3856',34,'100.0000000',14,4103.46,'2004-06-24 00:00:00','2004-07-01 00:00:00','2006-08-23 11:51:29','Cancelled','This customer found a better offer from one of our competitors. Will call back to renegotiate.',141,'2004-06-24',2,6,2004), (10262,'S24_1785',34,'97.3800000',1,3310.92,'2004-06-24 00:00:00','2004-07-01 00:00:00','2006-08-23 11:51:30','Cancelled','This customer found a better offer from one of our competitors. Will call back to renegotiate.',141,'2004-06-24',2,6,2004), (10262,'S24_2841',24,'67.1400000',10,1611.36,'2004-06-24 00:00:00','2004-07-01 00:00:00','2006-08-23 11:51:30','Cancelled','This customer found a better offer from one of our competitors. Will call back to renegotiate.',141,'2004-06-24',2,6,2004), (10262,'S24_3420',46,'70.3500000',11,3236.1,'2004-06-24 00:00:00','2004-07-01 00:00:00','2006-08-23 11:51:30','Cancelled','This customer found a better offer from one of our competitors. Will call back to renegotiate.',141,'2004-06-24',2,6,2004), (10262,'S24_3816',49,'87.2100000',16,4273.29,'2004-06-24 00:00:00','2004-07-01 00:00:00','2006-08-23 11:51:30','Cancelled','This customer found a better offer from one of our competitors. Will call back to renegotiate.',141,'2004-06-24',2,6,2004), (10262,'S24_3949',48,'61.4200000',8,2948.16,'2004-06-24 00:00:00','2004-07-01 00:00:00','2006-08-23 11:51:30','Cancelled','This customer found a better offer from one of our competitors. Will call back to renegotiate.',141,'2004-06-24',2,6,2004), (10262,'S32_4289',40,'79.1100000',2,3164.4,'2004-06-24 00:00:00','2004-07-01 00:00:00','2006-08-23 11:51:30','Cancelled','This customer found a better offer from one of our competitors. Will call back to renegotiate.',141,'2004-06-24',2,6,2004), (10262,'S50_1341',49,'37.9700000',3,1860.53,'2004-06-24 00:00:00','2004-07-01 00:00:00','2006-08-23 11:51:30','Cancelled','This customer found a better offer from one of our competitors. Will call back to renegotiate.',141,'2004-06-24',2,6,2004), (10262,'S700_1691',40,'84.0300000',4,3361.2,'2004-06-24 00:00:00','2004-07-01 00:00:00','2006-08-23 11:51:30','Cancelled','This customer found a better offer from one of our competitors. Will call back to renegotiate.',141,'2004-06-24',2,6,2004), (10262,'S700_2047',44,'94.1400000',13,4142.16,'2004-06-24 00:00:00','2004-07-01 00:00:00','2006-08-23 11:51:30','Cancelled','This customer found a better offer from one of our competitors. Will call back to renegotiate.',141,'2004-06-24',2,6,2004), (10262,'S700_2466',33,'90.7500000',6,2994.75,'2004-06-24 00:00:00','2004-07-01 00:00:00','2006-08-23 11:51:30','Cancelled','This customer found a better offer from one of our competitors. Will call back to renegotiate.',141,'2004-06-24',2,6,2004), (10262,'S700_3167',27,'76.0000000',5,2052,'2004-06-24 00:00:00','2004-07-01 00:00:00','2006-08-23 11:51:30','Cancelled','This customer found a better offer from one of our competitors. Will call back to renegotiate.',141,'2004-06-24',2,6,2004), (10262,'S700_4002',35,'71.0700000',7,2487.45,'2004-06-24 00:00:00','2004-07-01 00:00:00','2006-08-23 11:51:30','Cancelled','This customer found a better offer from one of our competitors. Will call back to renegotiate.',141,'2004-06-24',2,6,2004), (10262,'S72_1253',21,'57.1100000',12,1199.31,'2004-06-24 00:00:00','2004-07-01 00:00:00','2006-08-23 11:51:30','Cancelled','This customer found a better offer from one of our competitors. Will call back to renegotiate.',141,'2004-06-24',2,6,2004), (10263,'S10_1678',34,'100.0000000',2,3676.76,'2004-06-28 00:00:00','2004-07-04 00:00:00','2004-07-02 00:00:00','Shipped',NULL,175,'2004-06-28',2,6,2004), (10263,'S10_2016',40,'100.0000000',5,4472,'2004-06-28 00:00:00','2004-07-04 00:00:00','2004-07-02 00:00:00','Shipped',NULL,175,'2004-06-28',2,6,2004), (10263,'S10_4698',41,'100.0000000',4,8336.94,'2004-06-28 00:00:00','2004-07-04 00:00:00','2004-07-02 00:00:00','Shipped',NULL,175,'2004-06-28',2,6,2004), (10263,'S12_2823',48,'100.0000000',1,6434.4,'2004-06-28 00:00:00','2004-07-04 00:00:00','2004-07-02 00:00:00','Shipped',NULL,175,'2004-06-28',2,6,2004), (10263,'S18_2581',33,'86.1700000',10,2843.61,'2004-06-28 00:00:00','2004-07-04 00:00:00','2004-07-02 00:00:00','Shipped',NULL,175,'2004-06-28',2,6,2004), (10263,'S18_2625',34,'58.7500000',6,1997.5,'2004-06-28 00:00:00','2004-07-04 00:00:00','2004-07-02 00:00:00','Shipped',NULL,175,'2004-06-28',2,6,2004), (10263,'S24_1578',42,'100.0000000',3,4307.52,'2004-06-28 00:00:00','2004-07-04 00:00:00','2004-07-02 00:00:00','Shipped',NULL,175,'2004-06-28',2,6,2004), (10263,'S24_2000',37,'62.4600000',7,2311.02,'2004-06-28 00:00:00','2004-07-04 00:00:00','2004-07-02 00:00:00','Shipped',NULL,175,'2004-06-28',2,6,2004), (10263,'S24_4278',24,'75.3500000',11,1808.4,'2004-06-28 00:00:00','2004-07-04 00:00:00','2004-07-02 00:00:00','Shipped',NULL,175,'2004-06-28',2,6,2004), (10263,'S32_1374',31,'79.9100000',8,2477.21,'2004-06-28 00:00:00','2004-07-04 00:00:00','2004-07-02 00:00:00','Shipped',NULL,175,'2004-06-28',2,6,2004), (10263,'S700_2834',47,'100.0000000',9,5465.16,'2004-06-28 00:00:00','2004-07-04 00:00:00','2004-07-02 00:00:00','Shipped',NULL,175,'2004-06-28',2,6,2004), (10264,'S18_3782',48,'54.7100000',3,2626.08,'2004-06-30 00:00:00','2004-07-06 00:00:00','2004-07-01 00:00:00','Shipped','Customer will send a truck to our local warehouse on 7/1/2004',362,'2004-06-30',2,6,2004), (10264,'S18_4721',20,'100.0000000',2,2410.6,'2004-06-30 00:00:00','2004-07-06 00:00:00','2004-07-01 00:00:00','Shipped','Customer will send a truck to our local warehouse on 7/1/2004',362,'2004-06-30',2,6,2004), (10264,'S24_2360',37,'65.1000000',6,2408.7,'2004-06-30 00:00:00','2004-07-06 00:00:00','2004-07-01 00:00:00','Shipped','Customer will send a truck to our local warehouse on 7/1/2004',362,'2004-06-30',2,6,2004), (10264,'S24_4620',47,'83.2700000',1,3913.69,'2004-06-30 00:00:00','2004-07-06 00:00:00','2004-07-01 00:00:00','Shipped','Customer will send a truck to our local warehouse on 7/1/2004',362,'2004-06-30',2,6,2004), (10264,'S32_2206',20,'32.5900000',4,651.8,'2004-06-30 00:00:00','2004-07-06 00:00:00','2004-07-01 00:00:00','Shipped','Customer will send a truck to our local warehouse on 7/1/2004',362,'2004-06-30',2,6,2004), (10264,'S32_4485',34,'97.9700000',7,3330.98,'2004-06-30 00:00:00','2004-07-06 00:00:00','2004-07-01 00:00:00','Shipped','Customer will send a truck to our local warehouse on 7/1/2004',362,'2004-06-30',2,6,2004), (10264,'S50_4713',47,'89.5000000',5,4206.5,'2004-06-30 00:00:00','2004-07-06 00:00:00','2004-07-01 00:00:00','Shipped','Customer will send a truck to our local warehouse on 7/1/2004',362,'2004-06-30',2,6,2004), (10265,'S18_3278',45,'86.8400000',2,3907.8,'2004-07-02 00:00:00','2004-07-09 00:00:00','2004-07-07 00:00:00','Shipped',NULL,471,'2004-07-02',3,7,2004), (10265,'S18_3482',49,'100.0000000',1,8427.02,'2004-07-02 00:00:00','2004-07-09 00:00:00','2004-07-07 00:00:00','Shipped',NULL,471,'2004-07-02',3,7,2004), (10266,'S12_1099',44,'100.0000000',14,9160.36,'2004-07-06 00:00:00','2004-07-14 00:00:00','2004-07-10 00:00:00','Shipped',NULL,386,'2004-07-06',3,7,2004), (10266,'S12_3380',22,'100.0000000',12,2454.54,'2004-07-06 00:00:00','2004-07-14 00:00:00','2004-07-10 00:00:00','Shipped',NULL,386,'2004-07-06',3,7,2004), (10266,'S12_3990',35,'76.6100000',15,2681.35,'2004-07-06 00:00:00','2004-07-14 00:00:00','2004-07-10 00:00:00','Shipped',NULL,386,'2004-07-06',3,7,2004), (10266,'S12_4675',40,'100.0000000',11,4468.4,'2004-07-06 00:00:00','2004-07-14 00:00:00','2004-07-10 00:00:00','Shipped',NULL,386,'2004-07-06',3,7,2004), (10266,'S18_1129',21,'100.0000000',6,2526.51,'2004-07-06 00:00:00','2004-07-14 00:00:00','2004-07-10 00:00:00','Shipped',NULL,386,'2004-07-06',3,7,2004), (10266,'S18_1589',36,'100.0000000',2,5196.6,'2004-07-06 00:00:00','2004-07-14 00:00:00','2004-07-10 00:00:00','Shipped',NULL,386,'2004-07-06',3,7,2004), (10266,'S18_1889',33,'74.6900000',10,2464.77,'2004-07-06 00:00:00','2004-07-14 00:00:00','2004-07-10 00:00:00','Shipped',NULL,386,'2004-07-06',3,7,2004), (10266,'S18_1984',49,'100.0000000',5,6203.4,'2004-07-06 00:00:00','2004-07-14 00:00:00','2004-07-10 00:00:00','Shipped',NULL,386,'2004-07-06',3,7,2004), (10266,'S18_2870',20,'100.0000000',3,2824.8,'2004-07-06 00:00:00','2004-07-14 00:00:00','2004-07-10 00:00:00','Shipped',NULL,386,'2004-07-06',3,7,2004), (10266,'S18_3232',29,'100.0000000',7,4812.55,'2004-07-06 00:00:00','2004-07-14 00:00:00','2004-07-10 00:00:00','Shipped',NULL,386,'2004-07-06',3,7,2004), (10266,'S18_3685',33,'100.0000000',4,5035.14,'2004-07-06 00:00:00','2004-07-14 00:00:00','2004-07-10 00:00:00','Shipped',NULL,386,'2004-07-06',3,7,2004), (10266,'S24_1628',28,'48.3000000',1,1352.4,'2004-07-06 00:00:00','2004-07-14 00:00:00','2004-07-10 00:00:00','Shipped',NULL,386,'2004-07-06',3,7,2004), (10266,'S24_2972',34,'40.4000000',8,1373.6,'2004-07-06 00:00:00','2004-07-14 00:00:00','2004-07-10 00:00:00','Shipped',NULL,386,'2004-07-06',3,7,2004), (10266,'S24_3371',47,'62.4500000',13,2935.15,'2004-07-06 00:00:00','2004-07-14 00:00:00','2004-07-10 00:00:00','Shipped',NULL,386,'2004-07-06',3,7,2004), (10266,'S24_3856',24,'100.0000000',9,2932.08,'2004-07-06 00:00:00','2004-07-14 00:00:00','2004-07-10 00:00:00','Shipped',NULL,386,'2004-07-06',3,7,2004), (10267,'S18_4933',36,'75.5500000',1,2719.8,'2004-07-07 00:00:00','2004-07-17 00:00:00','2004-07-09 00:00:00','Shipped',NULL,151,'2004-07-07',3,7,2004), (10267,'S24_1046',40,'80.1000000',5,3204,'2004-07-07 00:00:00','2004-07-17 00:00:00','2004-07-09 00:00:00','Shipped',NULL,151,'2004-07-07',3,7,2004), (10267,'S24_2766',38,'87.2400000',3,3315.12,'2004-07-07 00:00:00','2004-07-17 00:00:00','2004-07-09 00:00:00','Shipped',NULL,151,'2004-07-07',3,7,2004), (10267,'S24_2887',43,'100.0000000',2,4645.72,'2004-07-07 00:00:00','2004-07-17 00:00:00','2004-07-09 00:00:00','Shipped',NULL,151,'2004-07-07',3,7,2004), (10267,'S24_3191',44,'96.7400000',4,4256.56,'2004-07-07 00:00:00','2004-07-17 00:00:00','2004-07-09 00:00:00','Shipped',NULL,151,'2004-07-07',3,7,2004), (10267,'S24_3432',43,'100.0000000',6,5110.98,'2004-07-07 00:00:00','2004-07-17 00:00:00','2004-07-09 00:00:00','Shipped',NULL,151,'2004-07-07',3,7,2004), (10268,'S18_1342',49,'100.0000000',3,5738.88,'2004-07-12 00:00:00','2004-07-18 00:00:00','2004-07-14 00:00:00','Shipped',NULL,412,'2004-07-12',3,7,2004), (10268,'S18_1367',26,'64.6900000',2,1681.94,'2004-07-12 00:00:00','2004-07-18 00:00:00','2004-07-14 00:00:00','Shipped',NULL,412,'2004-07-12',3,7,2004), (10268,'S18_1749',34,'100.0000000',10,5491,'2004-07-12 00:00:00','2004-07-18 00:00:00','2004-07-14 00:00:00','Shipped',NULL,412,'2004-07-12',3,7,2004), (10268,'S18_2248',31,'49.0400000',9,1520.24,'2004-07-12 00:00:00','2004-07-18 00:00:00','2004-07-14 00:00:00','Shipped',NULL,412,'2004-07-12',3,7,2004), (10268,'S18_2325',50,'100.0000000',7,5276,'2004-07-12 00:00:00','2004-07-18 00:00:00','2004-07-14 00:00:00','Shipped',NULL,412,'2004-07-12',3,7,2004), (10268,'S18_2795',35,'100.0000000',4,5315.8,'2004-07-12 00:00:00','2004-07-18 00:00:00','2004-07-14 00:00:00','Shipped',NULL,412,'2004-07-12',3,7,2004), (10268,'S18_3320',39,'89.2900000',1,3482.31,'2004-07-12 00:00:00','2004-07-18 00:00:00','2004-07-14 00:00:00','Shipped',NULL,412,'2004-07-12',3,7,2004), (10268,'S18_4409',35,'87.4300000',11,3060.05,'2004-07-12 00:00:00','2004-07-18 00:00:00','2004-07-14 00:00:00','Shipped',NULL,412,'2004-07-12',3,7,2004), (10268,'S24_1937',33,'38.8300000',6,1281.39,'2004-07-12 00:00:00','2004-07-18 00:00:00','2004-07-14 00:00:00','Shipped',NULL,412,'2004-07-12',3,7,2004), (10268,'S24_2022',40,'46.1400000',5,1845.6,'2004-07-12 00:00:00','2004-07-18 00:00:00','2004-07-14 00:00:00','Shipped',NULL,412,'2004-07-12',3,7,2004), (10268,'S24_3969',30,'40.6200000',8,1218.6,'2004-07-12 00:00:00','2004-07-18 00:00:00','2004-07-14 00:00:00','Shipped',NULL,412,'2004-07-12',3,7,2004), (10269,'S18_2957',32,'63.0800000',1,2018.56,'2004-07-16 00:00:00','2004-07-22 00:00:00','2004-07-18 00:00:00','Shipped',NULL,382,'2004-07-16',3,7,2004), (10269,'S24_4258',48,'97.3900000',2,4674.72,'2004-07-16 00:00:00','2004-07-22 00:00:00','2004-07-18 00:00:00','Shipped',NULL,382,'2004-07-16',3,7,2004), (10270,'S10_1949',21,'100.0000000',9,4905.39,'2004-07-19 00:00:00','2004-07-27 00:00:00','2004-07-24 00:00:00','Shipped','Can we renegotiate this one?',282,'2004-07-19',3,7,2004), (10270,'S10_4962',32,'100.0000000',2,4302.08,'2004-07-19 00:00:00','2004-07-27 00:00:00','2004-07-24 00:00:00','Shipped','Can we renegotiate this one?',282,'2004-07-19',3,7,2004), (10270,'S12_1666',28,'100.0000000',6,4094.72,'2004-07-19 00:00:00','2004-07-27 00:00:00','2004-07-24 00:00:00','Shipped','Can we renegotiate this one?',282,'2004-07-19',3,7,2004), (10270,'S18_1097',43,'96.8400000',8,4164.12,'2004-07-19 00:00:00','2004-07-27 00:00:00','2004-07-24 00:00:00','Shipped','Can we renegotiate this one?',282,'2004-07-19',3,7,2004), (10270,'S18_2949',31,'96.2400000',10,2983.44,'2004-07-19 00:00:00','2004-07-27 00:00:00','2004-07-24 00:00:00','Shipped','Can we renegotiate this one?',282,'2004-07-19',3,7,2004), (10270,'S18_3136',38,'100.0000000',11,4775.08,'2004-07-19 00:00:00','2004-07-27 00:00:00','2004-07-24 00:00:00','Shipped','Can we renegotiate this one?',282,'2004-07-19',3,7,2004), (10270,'S18_4600',38,'100.0000000',3,5383.08,'2004-07-19 00:00:00','2004-07-27 00:00:00','2004-07-24 00:00:00','Shipped','Can we renegotiate this one?',282,'2004-07-19',3,7,2004), (10270,'S18_4668',44,'58.3600000',7,2567.84,'2004-07-19 00:00:00','2004-07-27 00:00:00','2004-07-24 00:00:00','Shipped','Can we renegotiate this one?',282,'2004-07-19',3,7,2004), (10270,'S32_1268',32,'85.7200000',1,2743.04,'2004-07-19 00:00:00','2004-07-27 00:00:00','2004-07-24 00:00:00','Shipped','Can we renegotiate this one?',282,'2004-07-19',3,7,2004), (10270,'S32_3522',21,'63.3500000',5,1330.35,'2004-07-19 00:00:00','2004-07-27 00:00:00','2004-07-24 00:00:00','Shipped','Can we renegotiate this one?',282,'2004-07-19',3,7,2004), (10270,'S700_2824',46,'88.0000000',4,4048,'2004-07-19 00:00:00','2004-07-27 00:00:00','2004-07-24 00:00:00','Shipped','Can we renegotiate this one?',282,'2004-07-19',3,7,2004), (10271,'S12_4473',31,'97.1700000',5,3012.27,'2004-07-20 00:00:00','2004-07-29 00:00:00','2004-07-23 00:00:00','Shipped',NULL,124,'2004-07-20',3,7,2004), (10271,'S18_2238',50,'100.0000000',4,9169,'2004-07-20 00:00:00','2004-07-29 00:00:00','2004-07-23 00:00:00','Shipped',NULL,124,'2004-07-20',3,7,2004), (10271,'S18_2319',50,'100.0000000',8,5093.5,'2004-07-20 00:00:00','2004-07-29 00:00:00','2004-07-23 00:00:00','Shipped',NULL,124,'2004-07-20',3,7,2004), (10271,'S18_2432',25,'69.2800000',11,1732,'2004-07-20 00:00:00','2004-07-29 00:00:00','2004-07-23 00:00:00','Shipped',NULL,124,'2004-07-20',3,7,2004), (10271,'S18_3232',20,'100.0000000',9,3928.6,'2004-07-20 00:00:00','2004-07-29 00:00:00','2004-07-23 00:00:00','Shipped',NULL,124,'2004-07-20',3,7,2004), (10271,'S24_1444',45,'64.7400000',2,2913.3,'2004-07-20 00:00:00','2004-07-29 00:00:00','2004-07-23 00:00:00','Shipped',NULL,124,'2004-07-20',3,7,2004), (10271,'S24_2300',43,'100.0000000',10,5605.05,'2004-07-20 00:00:00','2004-07-29 00:00:00','2004-07-23 00:00:00','Shipped',NULL,124,'2004-07-20',3,7,2004), (10271,'S24_2840',38,'41.7200000',6,1585.36,'2004-07-20 00:00:00','2004-07-29 00:00:00','2004-07-23 00:00:00','Shipped',NULL,124,'2004-07-20',3,7,2004), (10271,'S24_4048',22,'100.0000000',1,3070.54,'2004-07-20 00:00:00','2004-07-29 00:00:00','2004-07-23 00:00:00','Shipped',NULL,124,'2004-07-20',3,7,2004), (10271,'S32_2509',35,'47.6200000',7,1666.7,'2004-07-20 00:00:00','2004-07-29 00:00:00','2004-07-23 00:00:00','Shipped',NULL,124,'2004-07-20',3,7,2004), (10271,'S50_1392',34,'98.3900000',3,3345.26,'2004-07-20 00:00:00','2004-07-29 00:00:00','2004-07-23 00:00:00','Shipped',NULL,124,'2004-07-20',3,7,2004), (10272,'S12_1108',35,'100.0000000',2,5818.4,'2004-07-20 00:00:00','2004-07-26 00:00:00','2004-07-22 00:00:00','Shipped',NULL,157,'2004-07-20',3,7,2004), (10272,'S12_3148',27,'100.0000000',3,4283.01,'2004-07-20 00:00:00','2004-07-26 00:00:00','2004-07-22 00:00:00','Shipped',NULL,157,'2004-07-20',3,7,2004), (10272,'S12_3891',39,'100.0000000',1,7962.24,'2004-07-20 00:00:00','2004-07-26 00:00:00','2004-07-22 00:00:00','Shipped',NULL,157,'2004-07-20',3,7,2004), (10272,'S18_4027',25,'100.0000000',5,3734,'2004-07-20 00:00:00','2004-07-26 00:00:00','2004-07-22 00:00:00','Shipped',NULL,157,'2004-07-20',3,7,2004), (10272,'S32_3207',45,'64.6300000',6,2908.35,'2004-07-20 00:00:00','2004-07-26 00:00:00','2004-07-22 00:00:00','Shipped',NULL,157,'2004-07-20',3,7,2004), (10272,'S50_1514',43,'56.8200000',4,2443.26,'2004-07-20 00:00:00','2004-07-26 00:00:00','2004-07-22 00:00:00','Shipped',NULL,157,'2004-07-20',3,7,2004), (10273,'S10_4757',30,'100.0000000',4,3508.8,'2004-07-21 00:00:00','2004-07-28 00:00:00','2004-07-22 00:00:00','Shipped',NULL,314,'2004-07-21',3,7,2004), (10273,'S18_3029',34,'98.0600000',2,3334.04,'2004-07-21 00:00:00','2004-07-28 00:00:00','2004-07-22 00:00:00','Shipped',NULL,314,'2004-07-21',3,7,2004), (10273,'S18_3140',40,'100.0000000',13,5026.4,'2004-07-21 00:00:00','2004-07-28 00:00:00','2004-07-22 00:00:00','Shipped',NULL,314,'2004-07-21',3,7,2004), (10273,'S18_3259',47,'100.0000000',15,5450.59,'2004-07-21 00:00:00','2004-07-28 00:00:00','2004-07-22 00:00:00','Shipped',NULL,314,'2004-07-21',3,7,2004), (10273,'S18_3856',50,'85.7500000',1,4287.5,'2004-07-21 00:00:00','2004-07-28 00:00:00','2004-07-22 00:00:00','Shipped',NULL,314,'2004-07-21',3,7,2004), (10273,'S18_4522',33,'71.0900000',12,2345.97,'2004-07-21 00:00:00','2004-07-28 00:00:00','2004-07-22 00:00:00','Shipped',NULL,314,'2004-07-21',3,7,2004), (10273,'S24_2011',22,'100.0000000',11,2784.76,'2004-07-21 00:00:00','2004-07-28 00:00:00','2004-07-22 00:00:00','Shipped',NULL,314,'2004-07-21',3,7,2004), (10273,'S24_3151',27,'100.0000000',6,2796.12,'2004-07-21 00:00:00','2004-07-28 00:00:00','2004-07-22 00:00:00','Shipped',NULL,314,'2004-07-21',3,7,2004), (10273,'S24_3816',48,'83.0200000',3,3984.96,'2004-07-21 00:00:00','2004-07-28 00:00:00','2004-07-22 00:00:00','Shipped',NULL,314,'2004-07-21',3,7,2004), (10273,'S700_1138',21,'65.3400000',7,1372.14,'2004-07-21 00:00:00','2004-07-28 00:00:00','2004-07-22 00:00:00','Shipped',NULL,314,'2004-07-21',3,7,2004), (10273,'S700_1938',21,'100.0000000',14,2146.2,'2004-07-21 00:00:00','2004-07-28 00:00:00','2004-07-22 00:00:00','Shipped',NULL,314,'2004-07-21',3,7,2004), (10273,'S700_2610',42,'62.1600000',5,2610.72,'2004-07-21 00:00:00','2004-07-28 00:00:00','2004-07-22 00:00:00','Shipped',NULL,314,'2004-07-21',3,7,2004), (10273,'S700_3505',40,'86.1500000',8,3446,'2004-07-21 00:00:00','2004-07-28 00:00:00','2004-07-22 00:00:00','Shipped',NULL,314,'2004-07-21',3,7,2004), (10273,'S700_3962',26,'100.0000000',9,2969.46,'2004-07-21 00:00:00','2004-07-28 00:00:00','2004-07-22 00:00:00','Shipped',NULL,314,'2004-07-21',3,7,2004), (10273,'S72_3212',37,'45.8600000',10,1696.82,'2004-07-21 00:00:00','2004-07-28 00:00:00','2004-07-22 00:00:00','Shipped',NULL,314,'2004-07-21',3,7,2004), (10274,'S18_1662',41,'100.0000000',1,6724,'2004-07-21 00:00:00','2004-07-29 00:00:00','2004-07-22 00:00:00','Shipped',NULL,379,'2004-07-21',3,7,2004), (10274,'S24_2841',40,'65.0800000',2,2603.2,'2004-07-21 00:00:00','2004-07-29 00:00:00','2004-07-22 00:00:00','Shipped',NULL,379,'2004-07-21',3,7,2004), (10274,'S24_3420',24,'72.3300000',3,1735.92,'2004-07-21 00:00:00','2004-07-29 00:00:00','2004-07-22 00:00:00','Shipped',NULL,379,'2004-07-21',3,7,2004), (10274,'S700_2047',24,'90.5200000',5,2172.48,'2004-07-21 00:00:00','2004-07-29 00:00:00','2004-07-22 00:00:00','Shipped',NULL,379,'2004-07-21',3,7,2004), (10274,'S72_1253',32,'58.6000000',4,1875.2,'2004-07-21 00:00:00','2004-07-29 00:00:00','2004-07-22 00:00:00','Shipped',NULL,379,'2004-07-21',3,7,2004), (10275,'S10_1678',45,'92.8300000',1,4177.35,'2004-07-23 00:00:00','2004-08-02 00:00:00','2004-07-29 00:00:00','Shipped',NULL,119,'2004-07-23',3,7,2004), (10275,'S10_2016',22,'100.0000000',4,2904.44,'2004-07-23 00:00:00','2004-08-02 00:00:00','2004-07-29 00:00:00','Shipped',NULL,119,'2004-07-23',3,7,2004), (10275,'S10_4698',36,'100.0000000',3,6901.92,'2004-07-23 00:00:00','2004-08-02 00:00:00','2004-07-29 00:00:00','Shipped',NULL,119,'2004-07-23',3,7,2004), (10275,'S18_2581',35,'90.3900000',9,3163.65,'2004-07-23 00:00:00','2004-08-02 00:00:00','2004-07-29 00:00:00','Shipped',NULL,119,'2004-07-23',3,7,2004), (10275,'S18_2625',37,'63.6000000',5,2353.2,'2004-07-23 00:00:00','2004-08-02 00:00:00','2004-07-29 00:00:00','Shipped',NULL,119,'2004-07-23',3,7,2004), (10275,'S24_1578',21,'100.0000000',2,2153.76,'2004-07-23 00:00:00','2004-08-02 00:00:00','2004-07-29 00:00:00','Shipped',NULL,119,'2004-07-23',3,7,2004), (10275,'S24_1785',25,'95.2000000',11,2380,'2004-07-23 00:00:00','2004-08-02 00:00:00','2004-07-29 00:00:00','Shipped',NULL,119,'2004-07-23',3,7,2004), (10275,'S24_2000',30,'79.9800000',6,2399.4,'2004-07-23 00:00:00','2004-08-02 00:00:00','2004-07-29 00:00:00','Shipped',NULL,119,'2004-07-23',3,7,2004), (10275,'S24_3949',41,'81.8900000',18,3357.49,'2004-07-23 00:00:00','2004-08-02 00:00:00','2004-07-29 00:00:00','Shipped',NULL,119,'2004-07-23',3,7,2004), (10275,'S24_4278',27,'62.3100000',10,1682.37,'2004-07-23 00:00:00','2004-08-02 00:00:00','2004-07-29 00:00:00','Shipped',NULL,119,'2004-07-23',3,7,2004), (10275,'S32_1374',23,'81.9100000',7,1883.93,'2004-07-23 00:00:00','2004-08-02 00:00:00','2004-07-29 00:00:00','Shipped',NULL,119,'2004-07-23',3,7,2004), (10275,'S32_4289',28,'63.9700000',12,1791.16,'2004-07-23 00:00:00','2004-08-02 00:00:00','2004-07-29 00:00:00','Shipped',NULL,119,'2004-07-23',3,7,2004), (10275,'S50_1341',38,'45.3900000',13,1724.82,'2004-07-23 00:00:00','2004-08-02 00:00:00','2004-07-29 00:00:00','Shipped',NULL,119,'2004-07-23',3,7,2004), (10275,'S700_1691',32,'89.5100000',14,2864.32,'2004-07-23 00:00:00','2004-08-02 00:00:00','2004-07-29 00:00:00','Shipped',NULL,119,'2004-07-23',3,7,2004), (10275,'S700_2466',39,'100.0000000',16,4472.52,'2004-07-23 00:00:00','2004-08-02 00:00:00','2004-07-29 00:00:00','Shipped',NULL,119,'2004-07-23',3,7,2004), (10275,'S700_2834',48,'100.0000000',8,6378.72,'2004-07-23 00:00:00','2004-08-02 00:00:00','2004-07-29 00:00:00','Shipped',NULL,119,'2004-07-23',3,7,2004), (10275,'S700_3167',43,'73.6000000',15,3164.8,'2004-07-23 00:00:00','2004-08-02 00:00:00','2004-07-29 00:00:00','Shipped',NULL,119,'2004-07-23',3,7,2004), (10275,'S700_4002',31,'72.5500000',17,2249.05,'2004-07-23 00:00:00','2004-08-02 00:00:00','2004-07-29 00:00:00','Shipped',NULL,119,'2004-07-23',3,7,2004), (10276,'S12_1099',50,'100.0000000',3,9631,'2004-08-02 00:00:00','2004-08-11 00:00:00','2004-08-08 00:00:00','Shipped',NULL,204,'2004-08-02',3,8,2004), (10276,'S12_2823',43,'100.0000000',14,5181.5,'2004-08-02 00:00:00','2004-08-11 00:00:00','2004-08-08 00:00:00','Shipped',NULL,204,'2004-08-02',3,8,2004), (10276,'S12_3380',47,'100.0000000',1,5464.69,'2004-08-02 00:00:00','2004-08-11 00:00:00','2004-08-08 00:00:00','Shipped',NULL,204,'2004-08-02',3,8,2004), (10276,'S12_3990',38,'83.7900000',4,3184.02,'2004-08-02 00:00:00','2004-08-11 00:00:00','2004-08-08 00:00:00','Shipped',NULL,204,'2004-08-02',3,8,2004), (10276,'S18_3278',38,'69.9600000',6,2658.48,'2004-08-02 00:00:00','2004-08-11 00:00:00','2004-08-08 00:00:00','Shipped',NULL,204,'2004-08-02',3,8,2004), (10276,'S18_3482',30,'100.0000000',5,3924.6,'2004-08-02 00:00:00','2004-08-11 00:00:00','2004-08-08 00:00:00','Shipped',NULL,204,'2004-08-02',3,8,2004), (10276,'S18_3782',33,'50.3600000',9,1661.88,'2004-08-02 00:00:00','2004-08-11 00:00:00','2004-08-08 00:00:00','Shipped',NULL,204,'2004-08-02',3,8,2004), (10276,'S18_4721',48,'100.0000000',8,5713.92,'2004-08-02 00:00:00','2004-08-11 00:00:00','2004-08-08 00:00:00','Shipped',NULL,204,'2004-08-02',3,8,2004), (10276,'S24_2360',46,'75.4900000',12,3472.54,'2004-08-02 00:00:00','2004-08-11 00:00:00','2004-08-08 00:00:00','Shipped',NULL,204,'2004-08-02',3,8,2004), (10276,'S24_3371',20,'61.2300000',2,1224.6,'2004-08-02 00:00:00','2004-08-11 00:00:00','2004-08-08 00:00:00','Shipped',NULL,204,'2004-08-02',3,8,2004), (10276,'S24_4620',48,'75.1800000',7,3608.64,'2004-08-02 00:00:00','2004-08-11 00:00:00','2004-08-08 00:00:00','Shipped',NULL,204,'2004-08-02',3,8,2004), (10276,'S32_2206',27,'36.6100000',10,988.47,'2004-08-02 00:00:00','2004-08-11 00:00:00','2004-08-08 00:00:00','Shipped',NULL,204,'2004-08-02',3,8,2004), (10276,'S32_4485',38,'100.0000000',13,4304.64,'2004-08-02 00:00:00','2004-08-11 00:00:00','2004-08-08 00:00:00','Shipped',NULL,204,'2004-08-02',3,8,2004), (10276,'S50_4713',21,'70.7800000',11,1486.38,'2004-08-02 00:00:00','2004-08-11 00:00:00','2004-08-08 00:00:00','Shipped',NULL,204,'2004-08-02',3,8,2004), (10277,'S12_4675',28,'100.0000000',1,3127.88,'2004-08-04 00:00:00','2004-08-12 00:00:00','2004-08-05 00:00:00','Shipped',NULL,148,'2004-08-04',3,8,2004), (10278,'S18_1129',34,'100.0000000',6,4667.86,'2004-08-06 00:00:00','2004-08-16 00:00:00','2004-08-09 00:00:00','Shipped',NULL,112,'2004-08-06',3,8,2004), (10278,'S18_1589',23,'100.0000000',2,2604.52,'2004-08-06 00:00:00','2004-08-16 00:00:00','2004-08-09 00:00:00','Shipped',NULL,112,'2004-08-06',3,8,2004), (10278,'S18_1889',29,'90.8600000',10,2634.94,'2004-08-06 00:00:00','2004-08-16 00:00:00','2004-08-09 00:00:00','Shipped',NULL,112,'2004-08-06',3,8,2004), (10278,'S18_1984',29,'100.0000000',5,3754.05,'2004-08-06 00:00:00','2004-08-16 00:00:00','2004-08-09 00:00:00','Shipped',NULL,112,'2004-08-06',3,8,2004), (10278,'S18_2870',39,'100.0000000',3,4324.32,'2004-08-06 00:00:00','2004-08-16 00:00:00','2004-08-09 00:00:00','Shipped',NULL,112,'2004-08-06',3,8,2004), (10278,'S18_3232',42,'100.0000000',7,6401.22,'2004-08-06 00:00:00','2004-08-16 00:00:00','2004-08-09 00:00:00','Shipped',NULL,112,'2004-08-06',3,8,2004), (10278,'S18_3685',31,'100.0000000',4,4116.8,'2004-08-06 00:00:00','2004-08-16 00:00:00','2004-08-09 00:00:00','Shipped',NULL,112,'2004-08-06',3,8,2004), (10278,'S24_1628',35,'45.2800000',1,1584.8,'2004-08-06 00:00:00','2004-08-16 00:00:00','2004-08-09 00:00:00','Shipped',NULL,112,'2004-08-06',3,8,2004), (10278,'S24_2972',31,'38.8900000',8,1205.59,'2004-08-06 00:00:00','2004-08-16 00:00:00','2004-08-09 00:00:00','Shipped',NULL,112,'2004-08-06',3,8,2004), (10278,'S24_3856',25,'100.0000000',9,3159.75,'2004-08-06 00:00:00','2004-08-16 00:00:00','2004-08-09 00:00:00','Shipped',NULL,112,'2004-08-06',3,8,2004), (10279,'S18_4933',26,'60.5800000',1,1575.08,'2004-08-09 00:00:00','2004-08-19 00:00:00','2004-08-15 00:00:00','Shipped','Cautious optimism. We have happy customers here, if we can keep them well stocked. I need all the information I can get on the planned shippments of Porches',141,'2004-08-09',3,8,2004), (10279,'S24_1046',32,'74.9600000',5,2398.72,'2004-08-09 00:00:00','2004-08-19 00:00:00','2004-08-15 00:00:00','Shipped','Cautious optimism. We have happy customers here, if we can keep them well stocked. I need all the information I can get on the planned shippments of Porches',141,'2004-08-09',3,8,2004), (10279,'S24_2766',49,'79.9700000',3,3918.53,'2004-08-09 00:00:00','2004-08-19 00:00:00','2004-08-15 00:00:00','Shipped','Cautious optimism. We have happy customers here, if we can keep them well stocked. I need all the information I can get on the planned shippments of Porches',141,'2004-08-09',3,8,2004), (10279,'S24_2887',48,'100.0000000',2,5580.96,'2004-08-09 00:00:00','2004-08-19 00:00:00','2004-08-15 00:00:00','Shipped','Cautious optimism. We have happy customers here, if we can keep them well stocked. I need all the information I can get on the planned shippments of Porches',141,'2004-08-09',3,8,2004), (10279,'S24_3191',33,'71.0600000',4,2344.98,'2004-08-09 00:00:00','2004-08-19 00:00:00','2004-08-15 00:00:00','Shipped','Cautious optimism. We have happy customers here, if we can keep them well stocked. I need all the information I can get on the planned shippments of Porches',141,'2004-08-09',3,8,2004), (10279,'S24_3432',48,'100.0000000',6,6168,'2004-08-09 00:00:00','2004-08-19 00:00:00','2004-08-15 00:00:00','Shipped','Cautious optimism. We have happy customers here, if we can keep them well stocked. I need all the information I can get on the planned shippments of Porches',141,'2004-08-09',3,8,2004), (10280,'S10_1949',34,'100.0000000',2,8014.82,'2004-08-17 00:00:00','2004-08-27 00:00:00','2004-08-19 00:00:00','Shipped',NULL,249,'2004-08-17',3,8,2004), (10280,'S18_1097',24,'100.0000000',1,2800.08,'2004-08-17 00:00:00','2004-08-27 00:00:00','2004-08-19 00:00:00','Shipped',NULL,249,'2004-08-17',3,8,2004), (10280,'S18_1342',50,'100.0000000',9,5239.5,'2004-08-17 00:00:00','2004-08-27 00:00:00','2004-08-19 00:00:00','Shipped',NULL,249,'2004-08-17',3,8,2004), (10280,'S18_1367',27,'57.6800000',8,1557.36,'2004-08-17 00:00:00','2004-08-27 00:00:00','2004-08-19 00:00:00','Shipped',NULL,249,'2004-08-17',3,8,2004), (10280,'S18_1749',26,'100.0000000',16,3668.6,'2004-08-17 00:00:00','2004-08-27 00:00:00','2004-08-19 00:00:00','Shipped',NULL,249,'2004-08-17',3,8,2004), (10280,'S18_2248',25,'62.9600000',15,1574,'2004-08-17 00:00:00','2004-08-27 00:00:00','2004-08-19 00:00:00','Shipped',NULL,249,'2004-08-17',3,8,2004), (10280,'S18_2325',37,'100.0000000',13,4750.8,'2004-08-17 00:00:00','2004-08-27 00:00:00','2004-08-19 00:00:00','Shipped',NULL,249,'2004-08-17',3,8,2004), (10280,'S18_2795',22,'100.0000000',10,4455,'2004-08-17 00:00:00','2004-08-27 00:00:00','2004-08-19 00:00:00','Shipped',NULL,249,'2004-08-17',3,8,2004), (10280,'S18_2949',46,'100.0000000',3,5126.24,'2004-08-17 00:00:00','2004-08-27 00:00:00','2004-08-19 00:00:00','Shipped',NULL,249,'2004-08-17',3,8,2004), (10280,'S18_2957',43,'68.7100000',5,2954.53,'2004-08-17 00:00:00','2004-08-27 00:00:00','2004-08-19 00:00:00','Shipped',NULL,249,'2004-08-17',3,8,2004), (10280,'S18_3136',29,'100.0000000',4,3006.43,'2004-08-17 00:00:00','2004-08-27 00:00:00','2004-08-19 00:00:00','Shipped',NULL,249,'2004-08-17',3,8,2004), (10280,'S18_3320',34,'100.0000000',7,3474.46,'2004-08-17 00:00:00','2004-08-27 00:00:00','2004-08-19 00:00:00','Shipped',NULL,249,'2004-08-17',3,8,2004), (10280,'S18_4409',35,'100.0000000',17,3704.05,'2004-08-17 00:00:00','2004-08-27 00:00:00','2004-08-19 00:00:00','Shipped',NULL,249,'2004-08-17',3,8,2004), (10280,'S24_1937',20,'28.8800000',12,577.6,'2004-08-17 00:00:00','2004-08-27 00:00:00','2004-08-19 00:00:00','Shipped',NULL,249,'2004-08-17',3,8,2004), (10280,'S24_2022',45,'47.4900000',11,2137.05,'2004-08-17 00:00:00','2004-08-27 00:00:00','2004-08-19 00:00:00','Shipped',NULL,249,'2004-08-17',3,8,2004), (10280,'S24_3969',33,'41.8500000',14,1381.05,'2004-08-17 00:00:00','2004-08-27 00:00:00','2004-08-19 00:00:00','Shipped',NULL,249,'2004-08-17',3,8,2004), (10280,'S24_4258',21,'78.8900000',6,1656.69,'2004-08-17 00:00:00','2004-08-27 00:00:00','2004-08-19 00:00:00','Shipped',NULL,249,'2004-08-17',3,8,2004), (10281,'S10_4962',44,'100.0000000',9,7020.64,'2004-08-19 00:00:00','2004-08-28 00:00:00','2004-08-23 00:00:00','Shipped',NULL,157,'2004-08-19',3,8,2004), (10281,'S12_1666',25,'100.0000000',13,2938.5,'2004-08-19 00:00:00','2004-08-28 00:00:00','2004-08-23 00:00:00','Shipped',NULL,157,'2004-08-19',3,8,2004), (10281,'S12_4473',41,'100.0000000',1,5247.18,'2004-08-19 00:00:00','2004-08-28 00:00:00','2004-08-23 00:00:00','Shipped',NULL,157,'2004-08-19',3,8,2004), (10281,'S18_2319',48,'100.0000000',4,5773.44,'2004-08-19 00:00:00','2004-08-28 00:00:00','2004-08-23 00:00:00','Shipped',NULL,157,'2004-08-19',3,8,2004), (10281,'S18_2432',29,'57.7300000',7,1674.17,'2004-08-19 00:00:00','2004-08-28 00:00:00','2004-08-23 00:00:00','Shipped',NULL,157,'2004-08-19',3,8,2004), (10281,'S18_3232',25,'100.0000000',5,4191.25,'2004-08-19 00:00:00','2004-08-28 00:00:00','2004-08-23 00:00:00','Shipped',NULL,157,'2004-08-19',3,8,2004), (10281,'S18_4600',25,'99.2900000',10,2482.25,'2004-08-19 00:00:00','2004-08-28 00:00:00','2004-08-23 00:00:00','Shipped',NULL,157,'2004-08-19',3,8,2004), (10281,'S18_4668',44,'59.8700000',14,2634.28,'2004-08-19 00:00:00','2004-08-28 00:00:00','2004-08-23 00:00:00','Shipped',NULL,157,'2004-08-19',3,8,2004), (10281,'S24_2300',25,'100.0000000',6,2779.5,'2004-08-19 00:00:00','2004-08-28 00:00:00','2004-08-23 00:00:00','Shipped',NULL,157,'2004-08-19',3,8,2004), (10281,'S24_2840',20,'40.6600000',2,813.2,'2004-08-19 00:00:00','2004-08-28 00:00:00','2004-08-23 00:00:00','Shipped',NULL,157,'2004-08-19',3,8,2004), (10281,'S32_1268',29,'82.8300000',8,2402.07,'2004-08-19 00:00:00','2004-08-28 00:00:00','2004-08-23 00:00:00','Shipped',NULL,157,'2004-08-19',3,8,2004), (10281,'S32_2509',31,'55.1900000',3,1710.89,'2004-08-19 00:00:00','2004-08-28 00:00:00','2004-08-23 00:00:00','Shipped',NULL,157,'2004-08-19',3,8,2004), (10281,'S32_3522',36,'77.5700000',12,2792.52,'2004-08-19 00:00:00','2004-08-28 00:00:00','2004-08-23 00:00:00','Shipped',NULL,157,'2004-08-19',3,8,2004), (10281,'S700_2824',27,'85.9800000',11,2321.46,'2004-08-19 00:00:00','2004-08-28 00:00:00','2004-08-23 00:00:00','Shipped',NULL,157,'2004-08-19',3,8,2004), (10282,'S12_1108',41,'100.0000000',5,7071.27,'2004-08-20 00:00:00','2004-08-26 00:00:00','2004-08-22 00:00:00','Shipped',NULL,124,'2004-08-20',3,8,2004), (10282,'S12_3148',27,'100.0000000',6,4364.82,'2004-08-20 00:00:00','2004-08-26 00:00:00','2004-08-22 00:00:00','Shipped',NULL,124,'2004-08-20',3,8,2004), (10282,'S12_3891',24,'100.0000000',4,3778.8,'2004-08-20 00:00:00','2004-08-26 00:00:00','2004-08-22 00:00:00','Shipped',NULL,124,'2004-08-20',3,8,2004), (10282,'S18_2238',23,'100.0000000',13,3238.63,'2004-08-20 00:00:00','2004-08-26 00:00:00','2004-08-22 00:00:00','Shipped',NULL,124,'2004-08-20',3,8,2004), (10282,'S18_3140',43,'100.0000000',1,6695.53,'2004-08-20 00:00:00','2004-08-26 00:00:00','2004-08-22 00:00:00','Shipped',NULL,124,'2004-08-20',3,8,2004), (10282,'S18_3259',36,'100.0000000',3,4174.92,'2004-08-20 00:00:00','2004-08-26 00:00:00','2004-08-22 00:00:00','Shipped',NULL,124,'2004-08-20',3,8,2004), (10282,'S18_4027',31,'100.0000000',8,4674.8,'2004-08-20 00:00:00','2004-08-26 00:00:00','2004-08-22 00:00:00','Shipped',NULL,124,'2004-08-20',3,8,2004), (10282,'S24_1444',29,'46.8200000',11,1357.78,'2004-08-20 00:00:00','2004-08-26 00:00:00','2004-08-22 00:00:00','Shipped',NULL,124,'2004-08-20',3,8,2004), (10282,'S24_4048',39,'100.0000000',10,4797.39,'2004-08-20 00:00:00','2004-08-26 00:00:00','2004-08-22 00:00:00','Shipped',NULL,124,'2004-08-20',3,8,2004), (10282,'S32_3207',36,'59.6500000',9,2147.4,'2004-08-20 00:00:00','2004-08-26 00:00:00','2004-08-22 00:00:00','Shipped',NULL,124,'2004-08-20',3,8,2004), (10282,'S50_1392',38,'100.0000000',12,4310.72,'2004-08-20 00:00:00','2004-08-26 00:00:00','2004-08-22 00:00:00','Shipped',NULL,124,'2004-08-20',3,8,2004), (10282,'S50_1514',37,'66.7800000',7,2470.86,'2004-08-20 00:00:00','2004-08-26 00:00:00','2004-08-22 00:00:00','Shipped',NULL,124,'2004-08-20',3,8,2004), (10282,'S700_1938',43,'86.6100000',2,3724.23,'2004-08-20 00:00:00','2004-08-26 00:00:00','2004-08-22 00:00:00','Shipped',NULL,124,'2004-08-20',3,8,2004), (10283,'S10_4757',25,'100.0000000',6,2992,'2004-08-20 00:00:00','2004-08-30 00:00:00','2004-08-23 00:00:00','Shipped',NULL,260,'2004-08-20',3,8,2004), (10283,'S18_3029',21,'98.0600000',4,2059.26,'2004-08-20 00:00:00','2004-08-30 00:00:00','2004-08-23 00:00:00','Shipped',NULL,260,'2004-08-20',3,8,2004), (10283,'S18_3856',46,'100.0000000',3,5795.54,'2004-08-20 00:00:00','2004-08-30 00:00:00','2004-08-23 00:00:00','Shipped',NULL,260,'2004-08-20',3,8,2004), (10283,'S18_4522',34,'100.0000000',14,3580.88,'2004-08-20 00:00:00','2004-08-30 00:00:00','2004-08-23 00:00:00','Shipped',NULL,260,'2004-08-20',3,8,2004), (10283,'S24_2011',42,'100.0000000',13,5316.36,'2004-08-20 00:00:00','2004-08-30 00:00:00','2004-08-23 00:00:00','Shipped',NULL,260,'2004-08-20',3,8,2004), (10283,'S24_3151',34,'92.9400000',8,3159.96,'2004-08-20 00:00:00','2004-08-30 00:00:00','2004-08-23 00:00:00','Shipped',NULL,260,'2004-08-20',3,8,2004), (10283,'S24_3816',33,'72.9600000',5,2407.68,'2004-08-20 00:00:00','2004-08-30 00:00:00','2004-08-23 00:00:00','Shipped',NULL,260,'2004-08-20',3,8,2004), (10283,'S700_1138',45,'78.6700000',9,3540.15,'2004-08-20 00:00:00','2004-08-30 00:00:00','2004-08-23 00:00:00','Shipped',NULL,260,'2004-08-20',3,8,2004), (10283,'S700_2047',20,'94.1400000',2,1882.8,'2004-08-20 00:00:00','2004-08-30 00:00:00','2004-08-23 00:00:00','Shipped',NULL,260,'2004-08-20',3,8,2004), (10283,'S700_2610',47,'65.7700000',7,3091.19,'2004-08-20 00:00:00','2004-08-30 00:00:00','2004-08-23 00:00:00','Shipped',NULL,260,'2004-08-20',3,8,2004), (10283,'S700_3505',22,'88.1500000',10,1939.3,'2004-08-20 00:00:00','2004-08-30 00:00:00','2004-08-23 00:00:00','Shipped',NULL,260,'2004-08-20',3,8,2004), (10283,'S700_3962',38,'89.3800000',11,3396.44,'2004-08-20 00:00:00','2004-08-30 00:00:00','2004-08-23 00:00:00','Shipped',NULL,260,'2004-08-20',3,8,2004), (10283,'S72_1253',43,'57.6100000',1,2477.23,'2004-08-20 00:00:00','2004-08-30 00:00:00','2004-08-23 00:00:00','Shipped',NULL,260,'2004-08-20',3,8,2004), (10283,'S72_3212',33,'51.3200000',12,1693.56,'2004-08-20 00:00:00','2004-08-30 00:00:00','2004-08-23 00:00:00','Shipped',NULL,260,'2004-08-20',3,8,2004), (10284,'S18_1662',45,'100.0000000',11,5747.85,'2004-08-21 00:00:00','2004-08-29 00:00:00','2004-08-26 00:00:00','Shipped','Custom shipping instructions sent to warehouse',299,'2004-08-21',3,8,2004), (10284,'S18_2581',31,'71.8100000',1,2226.11,'2004-08-21 00:00:00','2004-08-29 00:00:00','2004-08-26 00:00:00','Shipped','Custom shipping instructions sent to warehouse',299,'2004-08-21',3,8,2004), (10284,'S24_1785',22,'100.0000000',3,2310.88,'2004-08-21 00:00:00','2004-08-29 00:00:00','2004-08-26 00:00:00','Shipped','Custom shipping instructions sent to warehouse',299,'2004-08-21',3,8,2004), (10284,'S24_2841',30,'73.9900000',12,2219.7,'2004-08-21 00:00:00','2004-08-29 00:00:00','2004-08-26 00:00:00','Shipped','Custom shipping instructions sent to warehouse',299,'2004-08-21',3,8,2004), (10284,'S24_3420',39,'71.6700000',13,2795.13,'2004-08-21 00:00:00','2004-08-29 00:00:00','2004-08-26 00:00:00','Shipped','Custom shipping instructions sent to warehouse',299,'2004-08-21',3,8,2004), (10284,'S24_3949',21,'55.9600000',10,1175.16,'2004-08-21 00:00:00','2004-08-29 00:00:00','2004-08-26 00:00:00','Shipped','Custom shipping instructions sent to warehouse',299,'2004-08-21',3,8,2004), (10284,'S24_4278',21,'71.0000000',2,1491,'2004-08-21 00:00:00','2004-08-29 00:00:00','2004-08-26 00:00:00','Shipped','Custom shipping instructions sent to warehouse',299,'2004-08-21',3,8,2004), (10284,'S32_4289',50,'81.8600000',4,4093,'2004-08-21 00:00:00','2004-08-29 00:00:00','2004-08-26 00:00:00','Shipped','Custom shipping instructions sent to warehouse',299,'2004-08-21',3,8,2004), (10284,'S50_1341',33,'51.9300000',5,1713.69,'2004-08-21 00:00:00','2004-08-29 00:00:00','2004-08-26 00:00:00','Shipped','Custom shipping instructions sent to warehouse',299,'2004-08-21',3,8,2004), (10284,'S700_1691',24,'83.1200000',6,1994.88,'2004-08-21 00:00:00','2004-08-29 00:00:00','2004-08-26 00:00:00','Shipped','Custom shipping instructions sent to warehouse',299,'2004-08-21',3,8,2004), (10284,'S700_2466',45,'100.0000000',8,4576.95,'2004-08-21 00:00:00','2004-08-29 00:00:00','2004-08-26 00:00:00','Shipped','Custom shipping instructions sent to warehouse',299,'2004-08-21',3,8,2004), (10284,'S700_3167',25,'69.6000000',7,1740,'2004-08-21 00:00:00','2004-08-29 00:00:00','2004-08-26 00:00:00','Shipped','Custom shipping instructions sent to warehouse',299,'2004-08-21',3,8,2004), (10284,'S700_4002',32,'64.4100000',9,2061.12,'2004-08-21 00:00:00','2004-08-29 00:00:00','2004-08-26 00:00:00','Shipped','Custom shipping instructions sent to warehouse',299,'2004-08-21',3,8,2004), (10285,'S10_1678',36,'100.0000000',6,4099.68,'2004-08-27 00:00:00','2004-09-04 00:00:00','2004-08-31 00:00:00','Shipped',NULL,286,'2004-08-27',3,8,2004), (10285,'S10_2016',47,'100.0000000',9,6484.59,'2004-08-27 00:00:00','2004-09-04 00:00:00','2004-08-31 00:00:00','Shipped',NULL,286,'2004-08-27',3,8,2004), (10285,'S10_4698',27,'100.0000000',8,5438.07,'2004-08-27 00:00:00','2004-09-04 00:00:00','2004-08-31 00:00:00','Shipped',NULL,286,'2004-08-27',3,8,2004), (10285,'S12_2823',49,'100.0000000',5,6863.92,'2004-08-27 00:00:00','2004-09-04 00:00:00','2004-08-31 00:00:00','Shipped',NULL,286,'2004-08-27',3,8,2004), (10285,'S18_2625',20,'49.0600000',10,981.2,'2004-08-27 00:00:00','2004-09-04 00:00:00','2004-08-31 00:00:00','Shipped',NULL,286,'2004-08-27',3,8,2004), (10285,'S24_1578',34,'100.0000000',7,3716.88,'2004-08-27 00:00:00','2004-09-04 00:00:00','2004-08-31 00:00:00','Shipped',NULL,286,'2004-08-27',3,8,2004), (10285,'S24_2000',39,'70.0800000',11,2733.12,'2004-08-27 00:00:00','2004-09-04 00:00:00','2004-08-31 00:00:00','Shipped',NULL,286,'2004-08-27',3,8,2004), (10285,'S24_2360',38,'59.5600000',3,2263.28,'2004-08-27 00:00:00','2004-09-04 00:00:00','2004-08-31 00:00:00','Shipped',NULL,286,'2004-08-27',3,8,2004), (10285,'S32_1374',37,'98.8900000',12,3658.93,'2004-08-27 00:00:00','2004-09-04 00:00:00','2004-08-31 00:00:00','Shipped',NULL,286,'2004-08-27',3,8,2004), (10285,'S32_2206',37,'41.0300000',1,1518.11,'2004-08-27 00:00:00','2004-09-04 00:00:00','2004-08-31 00:00:00','Shipped',NULL,286,'2004-08-27',3,8,2004), (10285,'S32_4485',26,'100.0000000',4,2600.26,'2004-08-27 00:00:00','2004-09-04 00:00:00','2004-08-31 00:00:00','Shipped',NULL,286,'2004-08-27',3,8,2004), (10285,'S50_4713',39,'78.9200000',2,3077.88,'2004-08-27 00:00:00','2004-09-04 00:00:00','2004-08-31 00:00:00','Shipped',NULL,286,'2004-08-27',3,8,2004), (10285,'S700_2834',45,'100.0000000',13,5392.8,'2004-08-27 00:00:00','2004-09-04 00:00:00','2004-08-31 00:00:00','Shipped',NULL,286,'2004-08-27',3,8,2004), (10286,'S18_3782',38,'57.2000000',1,2173.6,'2004-08-28 00:00:00','2004-09-06 00:00:00','2004-09-01 00:00:00','Shipped',NULL,172,'2004-08-28',3,8,2004), (10287,'S12_1099',21,'100.0000000',12,3432.24,'2004-08-30 00:00:00','2004-09-06 00:00:00','2004-09-01 00:00:00','Shipped',NULL,298,'2004-08-30',3,8,2004), (10287,'S12_3380',45,'100.0000000',10,4756.5,'2004-08-30 00:00:00','2004-09-06 00:00:00','2004-09-01 00:00:00','Shipped',NULL,298,'2004-08-30',3,8,2004), (10287,'S12_3990',41,'69.4300000',13,2846.63,'2004-08-30 00:00:00','2004-09-06 00:00:00','2004-09-01 00:00:00','Shipped',NULL,298,'2004-08-30',3,8,2004), (10287,'S12_4675',23,'100.0000000',9,2675.13,'2004-08-30 00:00:00','2004-09-06 00:00:00','2004-09-01 00:00:00','Shipped',NULL,298,'2004-08-30',3,8,2004), (10287,'S18_1129',41,'100.0000000',4,6499.32,'2004-08-30 00:00:00','2004-09-06 00:00:00','2004-09-01 00:00:00','Shipped',NULL,298,'2004-08-30',3,8,2004), (10287,'S18_1889',44,'82.3900000',8,3625.16,'2004-08-30 00:00:00','2004-09-06 00:00:00','2004-09-01 00:00:00','Shipped',NULL,298,'2004-08-30',3,8,2004), (10287,'S18_1984',24,'100.0000000',3,3516.48,'2004-08-30 00:00:00','2004-09-06 00:00:00','2004-09-01 00:00:00','Shipped',NULL,298,'2004-08-30',3,8,2004), (10287,'S18_2870',44,'100.0000000',1,5052.96,'2004-08-30 00:00:00','2004-09-06 00:00:00','2004-09-01 00:00:00','Shipped',NULL,298,'2004-08-30',3,8,2004), (10287,'S18_3232',36,'100.0000000',5,5852.52,'2004-08-30 00:00:00','2004-09-06 00:00:00','2004-09-01 00:00:00','Shipped',NULL,298,'2004-08-30',3,8,2004), (10287,'S18_3278',43,'70.7600000',15,3042.68,'2004-08-30 00:00:00','2004-09-06 00:00:00','2004-09-01 00:00:00','Shipped',NULL,298,'2004-08-30',3,8,2004), (10287,'S18_3482',40,'100.0000000',14,6761.6,'2004-08-30 00:00:00','2004-09-06 00:00:00','2004-09-01 00:00:00','Shipped',NULL,298,'2004-08-30',3,8,2004), (10287,'S18_3685',27,'100.0000000',2,4310.55,'2004-08-30 00:00:00','2004-09-06 00:00:00','2004-09-01 00:00:00','Shipped',NULL,298,'2004-08-30',3,8,2004), (10287,'S18_4721',34,'100.0000000',17,4300.32,'2004-08-30 00:00:00','2004-09-06 00:00:00','2004-09-01 00:00:00','Shipped',NULL,298,'2004-08-30',3,8,2004), (10287,'S24_2972',36,'39.6500000',6,1427.4,'2004-08-30 00:00:00','2004-09-06 00:00:00','2004-09-01 00:00:00','Shipped',NULL,298,'2004-08-30',3,8,2004), (10287,'S24_3371',20,'67.9700000',11,1359.4,'2004-08-30 00:00:00','2004-09-06 00:00:00','2004-09-01 00:00:00','Shipped',NULL,298,'2004-08-30',3,8,2004), (10287,'S24_3856',36,'100.0000000',7,4297.32,'2004-08-30 00:00:00','2004-09-06 00:00:00','2004-09-01 00:00:00','Shipped',NULL,298,'2004-08-30',3,8,2004), (10287,'S24_4620',40,'88.1200000',16,3524.8,'2004-08-30 00:00:00','2004-09-06 00:00:00','2004-09-01 00:00:00','Shipped',NULL,298,'2004-08-30',3,8,2004), (10288,'S18_1589',20,'100.0000000',14,2936.8,'2004-09-01 00:00:00','2004-09-11 00:00:00','2004-09-05 00:00:00','Shipped',NULL,166,'2004-09-01',3,9,2004), (10288,'S18_1749',32,'100.0000000',5,5875.2,'2004-09-01 00:00:00','2004-09-11 00:00:00','2004-09-05 00:00:00','Shipped',NULL,166,'2004-09-01',3,9,2004), (10288,'S18_2248',28,'61.7500000',4,1729,'2004-09-01 00:00:00','2004-09-11 00:00:00','2004-09-05 00:00:00','Shipped',NULL,166,'2004-09-01',3,9,2004), (10288,'S18_2325',31,'100.0000000',2,3822.92,'2004-09-01 00:00:00','2004-09-11 00:00:00','2004-09-05 00:00:00','Shipped',NULL,166,'2004-09-01',3,9,2004), (10288,'S18_4409',35,'80.9900000',6,2834.65,'2004-09-01 00:00:00','2004-09-11 00:00:00','2004-09-05 00:00:00','Shipped',NULL,166,'2004-09-01',3,9,2004), (10288,'S18_4933',23,'73.4100000',7,1688.43,'2004-09-01 00:00:00','2004-09-11 00:00:00','2004-09-05 00:00:00','Shipped',NULL,166,'2004-09-01',3,9,2004), (10288,'S24_1046',36,'66.1400000',11,2381.04,'2004-09-01 00:00:00','2004-09-11 00:00:00','2004-09-05 00:00:00','Shipped',NULL,166,'2004-09-01',3,9,2004), (10288,'S24_1628',50,'52.3200000',13,2616,'2004-09-01 00:00:00','2004-09-11 00:00:00','2004-09-05 00:00:00','Shipped',NULL,166,'2004-09-01',3,9,2004), (10288,'S24_1937',29,'38.1700000',1,1106.93,'2004-09-01 00:00:00','2004-09-11 00:00:00','2004-09-05 00:00:00','Shipped',NULL,166,'2004-09-01',3,9,2004), (10288,'S24_2766',35,'80.8700000',9,2830.45,'2004-09-01 00:00:00','2004-09-11 00:00:00','2004-09-05 00:00:00','Shipped',NULL,166,'2004-09-01',3,9,2004), (10288,'S24_2887',48,'100.0000000',8,6539.04,'2004-09-01 00:00:00','2004-09-11 00:00:00','2004-09-05 00:00:00','Shipped',NULL,166,'2004-09-01',3,9,2004), (10288,'S24_3191',34,'68.4900000',10,2328.66,'2004-09-01 00:00:00','2004-09-11 00:00:00','2004-09-05 00:00:00','Shipped',NULL,166,'2004-09-01',3,9,2004), (10288,'S24_3432',41,'100.0000000',12,4873.26,'2004-09-01 00:00:00','2004-09-11 00:00:00','2004-09-05 00:00:00','Shipped',NULL,166,'2004-09-01',3,9,2004), (10288,'S24_3969',33,'40.6200000',3,1340.46,'2004-09-01 00:00:00','2004-09-11 00:00:00','2004-09-05 00:00:00','Shipped',NULL,166,'2004-09-01',3,9,2004), (10289,'S18_1342',38,'100.0000000',2,4567.98,'2004-09-03 00:00:00','2004-09-13 00:00:00','2004-09-04 00:00:00','Shipped','We need to keep in close contact with their Marketing VP. He is the decision maker for all their purchases.',167,'2004-09-03',3,9,2004), (10289,'S18_1367',24,'56.0700000',1,1345.68,'2004-09-03 00:00:00','2004-09-13 00:00:00','2004-09-04 00:00:00','Shipped','We need to keep in close contact with their Marketing VP. He is the decision maker for all their purchases.',167,'2004-09-03',3,9,2004), (10289,'S18_2795',43,'100.0000000',3,8272.34,'2004-09-03 00:00:00','2004-09-13 00:00:00','2004-09-04 00:00:00','Shipped','We need to keep in close contact with their Marketing VP. He is the decision maker for all their purchases.',167,'2004-09-03',3,9,2004), (10289,'S24_2022',45,'48.3800000',4,2177.1,'2004-09-03 00:00:00','2004-09-13 00:00:00','2004-09-04 00:00:00','Shipped','We need to keep in close contact with their Marketing VP. He is the decision maker for all their purchases.',167,'2004-09-03',3,9,2004), (10290,'S18_3320',26,'96.2300000',2,2501.98,'2004-09-07 00:00:00','2004-09-15 00:00:00','2004-09-13 00:00:00','Shipped',NULL,198,'2004-09-07',3,9,2004), (10290,'S24_4258',45,'100.0000000',1,5171.4,'2004-09-07 00:00:00','2004-09-15 00:00:00','2004-09-13 00:00:00','Shipped',NULL,198,'2004-09-07',3,9,2004), (10291,'S10_1949',37,'100.0000000',11,7136.19,'2004-09-08 00:00:00','2004-09-17 00:00:00','2004-09-14 00:00:00','Shipped',NULL,448,'2004-09-08',3,9,2004), (10291,'S10_4962',30,'100.0000000',4,3855.9,'2004-09-08 00:00:00','2004-09-17 00:00:00','2004-09-14 00:00:00','Shipped',NULL,448,'2004-09-08',3,9,2004), (10291,'S12_1666',41,'100.0000000',8,6387.8,'2004-09-08 00:00:00','2004-09-17 00:00:00','2004-09-14 00:00:00','Shipped',NULL,448,'2004-09-08',3,9,2004), (10291,'S18_1097',41,'100.0000000',10,4687.94,'2004-09-08 00:00:00','2004-09-17 00:00:00','2004-09-14 00:00:00','Shipped',NULL,448,'2004-09-08',3,9,2004), (10291,'S18_2432',26,'57.7300000',2,1500.98,'2004-09-08 00:00:00','2004-09-17 00:00:00','2004-09-14 00:00:00','Shipped',NULL,448,'2004-09-08',3,9,2004), (10291,'S18_2949',47,'100.0000000',12,5713.79,'2004-09-08 00:00:00','2004-09-17 00:00:00','2004-09-14 00:00:00','Shipped',NULL,448,'2004-09-08',3,9,2004), (10291,'S18_2957',37,'50.5900000',14,1871.83,'2004-09-08 00:00:00','2004-09-17 00:00:00','2004-09-14 00:00:00','Shipped',NULL,448,'2004-09-08',3,9,2004), (10291,'S18_3136',23,'100.0000000',13,2866.26,'2004-09-08 00:00:00','2004-09-17 00:00:00','2004-09-14 00:00:00','Shipped',NULL,448,'2004-09-08',3,9,2004), (10291,'S18_4600',48,'100.0000000',5,5288.64,'2004-09-08 00:00:00','2004-09-17 00:00:00','2004-09-14 00:00:00','Shipped',NULL,448,'2004-09-08',3,9,2004), (10291,'S18_4668',29,'51.8200000',9,1502.78,'2004-09-08 00:00:00','2004-09-17 00:00:00','2004-09-14 00:00:00','Shipped',NULL,448,'2004-09-08',3,9,2004), (10291,'S24_2300',48,'100.0000000',1,5398.08,'2004-09-08 00:00:00','2004-09-17 00:00:00','2004-09-14 00:00:00','Shipped',NULL,448,'2004-09-08',3,9,2004), (10291,'S32_1268',26,'83.7900000',3,2178.54,'2004-09-08 00:00:00','2004-09-17 00:00:00','2004-09-14 00:00:00','Shipped',NULL,448,'2004-09-08',3,9,2004), (10291,'S32_3522',32,'71.7500000',7,2296,'2004-09-08 00:00:00','2004-09-17 00:00:00','2004-09-14 00:00:00','Shipped',NULL,448,'2004-09-08',3,9,2004), (10291,'S700_2824',28,'100.0000000',6,3256.96,'2004-09-08 00:00:00','2004-09-17 00:00:00','2004-09-14 00:00:00','Shipped',NULL,448,'2004-09-08',3,9,2004), (10292,'S12_4473',21,'100.0000000',8,2214.87,'2004-09-08 00:00:00','2004-09-18 00:00:00','2004-09-11 00:00:00','Shipped','They want to reevaluate their terms agreement with Finance.',131,'2004-09-08',3,9,2004), (10292,'S18_2238',26,'100.0000000',7,4554.94,'2004-09-08 00:00:00','2004-09-18 00:00:00','2004-09-11 00:00:00','Shipped','They want to reevaluate their terms agreement with Finance.',131,'2004-09-08',3,9,2004), (10292,'S18_2319',41,'100.0000000',11,4528.86,'2004-09-08 00:00:00','2004-09-18 00:00:00','2004-09-11 00:00:00','Shipped','They want to reevaluate their terms agreement with Finance.',131,'2004-09-08',3,9,2004), (10292,'S18_3232',21,'100.0000000',12,2844.87,'2004-09-08 00:00:00','2004-09-18 00:00:00','2004-09-11 00:00:00','Shipped','They want to reevaluate their terms agreement with Finance.',131,'2004-09-08',3,9,2004), (10292,'S18_4027',44,'100.0000000',2,7140.76,'2004-09-08 00:00:00','2004-09-18 00:00:00','2004-09-11 00:00:00','Shipped','They want to reevaluate their terms agreement with Finance.',131,'2004-09-08',3,9,2004), (10292,'S24_1444',40,'53.7500000',5,2150,'2004-09-08 00:00:00','2004-09-18 00:00:00','2004-09-11 00:00:00','Shipped','They want to reevaluate their terms agreement with Finance.',131,'2004-09-08',3,9,2004), (10292,'S24_2840',39,'30.0600000',9,1172.34,'2004-09-08 00:00:00','2004-09-18 00:00:00','2004-09-11 00:00:00','Shipped','They want to reevaluate their terms agreement with Finance.',131,'2004-09-08',3,9,2004), (10292,'S24_4048',27,'100.0000000',4,3832.38,'2004-09-08 00:00:00','2004-09-18 00:00:00','2004-09-11 00:00:00','Shipped','They want to reevaluate their terms agreement with Finance.',131,'2004-09-08',3,9,2004), (10292,'S32_2509',50,'46.5300000',10,2326.5,'2004-09-08 00:00:00','2004-09-18 00:00:00','2004-09-11 00:00:00','Shipped','They want to reevaluate their terms agreement with Finance.',131,'2004-09-08',3,9,2004), (10292,'S32_3207',31,'67.7300000',3,2099.63,'2004-09-08 00:00:00','2004-09-18 00:00:00','2004-09-11 00:00:00','Shipped','They want to reevaluate their terms agreement with Finance.',131,'2004-09-08',3,9,2004), (10292,'S50_1392',41,'100.0000000',6,4983.14,'2004-09-08 00:00:00','2004-09-18 00:00:00','2004-09-11 00:00:00','Shipped','They want to reevaluate their terms agreement with Finance.',131,'2004-09-08',3,9,2004), (10292,'S50_1514',35,'55.0700000',1,1927.45,'2004-09-08 00:00:00','2004-09-18 00:00:00','2004-09-11 00:00:00','Shipped','They want to reevaluate their terms agreement with Finance.',131,'2004-09-08',3,9,2004), (10293,'S12_1108',46,'100.0000000',8,8411.56,'2004-09-09 00:00:00','2004-09-18 00:00:00','2004-09-14 00:00:00','Shipped',NULL,249,'2004-09-09',3,9,2004), (10293,'S12_3148',24,'100.0000000',9,4242.24,'2004-09-09 00:00:00','2004-09-18 00:00:00','2004-09-14 00:00:00','Shipped',NULL,249,'2004-09-09',3,9,2004), (10293,'S12_3891',45,'100.0000000',7,8253,'2004-09-09 00:00:00','2004-09-18 00:00:00','2004-09-14 00:00:00','Shipped',NULL,249,'2004-09-09',3,9,2004), (10293,'S18_3140',24,'100.0000000',4,2819.28,'2004-09-09 00:00:00','2004-09-18 00:00:00','2004-09-14 00:00:00','Shipped',NULL,249,'2004-09-09',3,9,2004), (10293,'S18_3259',22,'100.0000000',6,2418.24,'2004-09-09 00:00:00','2004-09-18 00:00:00','2004-09-14 00:00:00','Shipped',NULL,249,'2004-09-09',3,9,2004), (10293,'S18_4522',49,'100.0000000',3,4946.06,'2004-09-09 00:00:00','2004-09-18 00:00:00','2004-09-14 00:00:00','Shipped',NULL,249,'2004-09-09',3,9,2004), (10293,'S24_2011',21,'100.0000000',2,2941.89,'2004-09-09 00:00:00','2004-09-18 00:00:00','2004-09-14 00:00:00','Shipped',NULL,249,'2004-09-09',3,9,2004), (10293,'S700_1938',29,'71.8900000',5,2084.81,'2004-09-09 00:00:00','2004-09-18 00:00:00','2004-09-14 00:00:00','Shipped',NULL,249,'2004-09-09',3,9,2004), (10293,'S72_3212',32,'60.0600000',1,1921.92,'2004-09-09 00:00:00','2004-09-18 00:00:00','2004-09-14 00:00:00','Shipped',NULL,249,'2004-09-09',3,9,2004), (10294,'S700_3962',45,'100.0000000',1,4692.6,'2004-09-10 00:00:00','2004-09-17 00:00:00','2004-09-14 00:00:00','Shipped',NULL,204,'2004-09-10',3,9,2004), (10295,'S10_4757',24,'100.0000000',1,3427.2,'2004-09-10 00:00:00','2004-09-17 00:00:00','2004-09-14 00:00:00','Shipped','They want to reevaluate their terms agreement with Finance.',362,'2004-09-10',3,9,2004), (10295,'S24_3151',46,'84.9700000',3,3908.62,'2004-09-10 00:00:00','2004-09-17 00:00:00','2004-09-14 00:00:00','Shipped','They want to reevaluate their terms agreement with Finance.',362,'2004-09-10',3,9,2004), (10295,'S700_1138',26,'75.3400000',4,1958.84,'2004-09-10 00:00:00','2004-09-17 00:00:00','2004-09-14 00:00:00','Shipped','They want to reevaluate their terms agreement with Finance.',362,'2004-09-10',3,9,2004), (10295,'S700_2610',44,'58.5500000',2,2576.2,'2004-09-10 00:00:00','2004-09-17 00:00:00','2004-09-14 00:00:00','Shipped','They want to reevaluate their terms agreement with Finance.',362,'2004-09-10',3,9,2004), (10295,'S700_3505',34,'100.0000000',5,3473.78,'2004-09-10 00:00:00','2004-09-17 00:00:00','2004-09-14 00:00:00','Shipped','They want to reevaluate their terms agreement with Finance.',362,'2004-09-10',3,9,2004), (10296,'S18_1662',36,'100.0000000',7,5676.84,'2004-09-15 00:00:00','2004-09-22 00:00:00','2004-09-16 00:00:00','Shipped',NULL,415,'2004-09-15',3,9,2004), (10296,'S18_3029',21,'96.3400000',13,2023.14,'2004-09-15 00:00:00','2004-09-22 00:00:00','2004-09-16 00:00:00','Shipped',NULL,415,'2004-09-15',3,9,2004), (10296,'S18_3856',22,'84.7000000',12,1863.4,'2004-09-15 00:00:00','2004-09-22 00:00:00','2004-09-16 00:00:00','Shipped',NULL,415,'2004-09-15',3,9,2004), (10296,'S24_2841',21,'71.2500000',8,1496.25,'2004-09-15 00:00:00','2004-09-22 00:00:00','2004-09-16 00:00:00','Shipped',NULL,415,'2004-09-15',3,9,2004), (10296,'S24_3420',31,'53.9200000',9,1671.52,'2004-09-15 00:00:00','2004-09-22 00:00:00','2004-09-16 00:00:00','Shipped',NULL,415,'2004-09-15',3,9,2004), (10296,'S24_3816',22,'77.1500000',14,1697.3,'2004-09-15 00:00:00','2004-09-22 00:00:00','2004-09-16 00:00:00','Shipped',NULL,415,'2004-09-15',3,9,2004), (10296,'S24_3949',32,'71.6500000',6,2292.8,'2004-09-15 00:00:00','2004-09-22 00:00:00','2004-09-16 00:00:00','Shipped',NULL,415,'2004-09-15',3,9,2004), (10296,'S50_1341',26,'48.4400000',1,1259.44,'2004-09-15 00:00:00','2004-09-22 00:00:00','2004-09-16 00:00:00','Shipped',NULL,415,'2004-09-15',3,9,2004), (10296,'S700_1691',42,'100.0000000',2,4296.6,'2004-09-15 00:00:00','2004-09-22 00:00:00','2004-09-16 00:00:00','Shipped',NULL,415,'2004-09-15',3,9,2004), (10296,'S700_2047',34,'100.0000000',11,3477.86,'2004-09-15 00:00:00','2004-09-22 00:00:00','2004-09-16 00:00:00','Shipped',NULL,415,'2004-09-15',3,9,2004), (10296,'S700_2466',24,'100.0000000',4,2441.04,'2004-09-15 00:00:00','2004-09-22 00:00:00','2004-09-16 00:00:00','Shipped',NULL,415,'2004-09-15',3,9,2004), (10296,'S700_3167',22,'80.8000000',3,1777.6,'2004-09-15 00:00:00','2004-09-22 00:00:00','2004-09-16 00:00:00','Shipped',NULL,415,'2004-09-15',3,9,2004), (10296,'S700_4002',47,'86.6200000',5,4071.14,'2004-09-15 00:00:00','2004-09-22 00:00:00','2004-09-16 00:00:00','Shipped',NULL,415,'2004-09-15',3,9,2004), (10296,'S72_1253',21,'45.1900000',10,948.99,'2004-09-15 00:00:00','2004-09-22 00:00:00','2004-09-16 00:00:00','Shipped',NULL,415,'2004-09-15',3,9,2004), (10297,'S18_2581',25,'82.7900000',4,2069.75,'2004-09-16 00:00:00','2004-09-22 00:00:00','2004-09-21 00:00:00','Shipped','We must be cautions with this customer. Their VP of Sales resigned. Company may be heading down.',189,'2004-09-16',3,9,2004), (10297,'S24_1785',32,'100.0000000',6,4061.76,'2004-09-16 00:00:00','2004-09-22 00:00:00','2004-09-21 00:00:00','Shipped','We must be cautions with this customer. Their VP of Sales resigned. Company may be heading down.',189,'2004-09-16',3,9,2004), (10297,'S24_2000',32,'65.5100000',1,2096.32,'2004-09-16 00:00:00','2004-09-22 00:00:00','2004-09-21 00:00:00','Shipped','We must be cautions with this customer. Their VP of Sales resigned. Company may be heading down.',189,'2004-09-16',3,9,2004), (10297,'S24_4278',23,'72.4500000',5,1666.35,'2004-09-16 00:00:00','2004-09-22 00:00:00','2004-09-21 00:00:00','Shipped','We must be cautions with this customer. Their VP of Sales resigned. Company may be heading down.',189,'2004-09-16',3,9,2004), (10297,'S32_1374',26,'100.0000000',2,2856.88,'2004-09-16 00:00:00','2004-09-22 00:00:00','2004-09-21 00:00:00','Shipped','We must be cautions with this customer. Their VP of Sales resigned. Company may be heading down.',189,'2004-09-16',3,9,2004), (10297,'S32_4289',28,'79.8000000',7,2234.4,'2004-09-16 00:00:00','2004-09-22 00:00:00','2004-09-21 00:00:00','Shipped','We must be cautions with this customer. Their VP of Sales resigned. Company may be heading down.',189,'2004-09-16',3,9,2004), (10297,'S700_2834',35,'100.0000000',3,3986.5,'2004-09-16 00:00:00','2004-09-22 00:00:00','2004-09-21 00:00:00','Shipped','We must be cautions with this customer. Their VP of Sales resigned. Company may be heading down.',189,'2004-09-16',3,9,2004), (10298,'S10_2016',39,'96.3400000',1,3757.26,'2004-09-27 00:00:00','2004-10-05 00:00:00','2004-10-01 00:00:00','Shipped',NULL,103,'2004-09-27',3,9,2004), (10298,'S18_2625',32,'48.4600000',2,1550.72,'2004-09-27 00:00:00','2004-10-05 00:00:00','2004-10-01 00:00:00','Shipped',NULL,103,'2004-09-27',3,9,2004); INSERT INTO `orderfact` (`ORDERNUMBER`,`PRODUCTCODE`,`QUANTITYORDERED`,`PRICEEACH`,`ORDERLINENUMBER`,`TOTALPRICE`,`ORDERDATE`,`REQUIREDDATE`,`SHIPPEDDATE`,`STATUS`,`COMMENTS`,`CUSTOMERNUMBER`,`TIME_ID`,`QTR_ID`,`MONTH_ID`,`YEAR_ID`) VALUES (10299,'S10_1678',23,'100.0000000',9,2597.39,'2004-09-30 00:00:00','2004-10-10 00:00:00','2004-10-01 00:00:00','Shipped',NULL,186,'2004-09-30',3,9,2004), (10299,'S10_4698',29,'100.0000000',11,6683.34,'2004-09-30 00:00:00','2004-10-10 00:00:00','2004-10-01 00:00:00','Shipped',NULL,186,'2004-09-30',3,9,2004), (10299,'S12_2823',24,'100.0000000',8,4157.04,'2004-09-30 00:00:00','2004-10-10 00:00:00','2004-10-01 00:00:00','Shipped',NULL,186,'2004-09-30',3,9,2004), (10299,'S18_3782',39,'55.9500000',3,2182.05,'2004-09-30 00:00:00','2004-10-10 00:00:00','2004-10-01 00:00:00','Shipped',NULL,186,'2004-09-30',3,9,2004), (10299,'S18_4721',49,'100.0000000',2,7947.31,'2004-09-30 00:00:00','2004-10-10 00:00:00','2004-10-01 00:00:00','Shipped',NULL,186,'2004-09-30',3,9,2004), (10299,'S24_1578',47,'100.0000000',10,5455.76,'2004-09-30 00:00:00','2004-10-10 00:00:00','2004-10-01 00:00:00','Shipped',NULL,186,'2004-09-30',3,9,2004), (10299,'S24_2360',33,'66.4900000',6,2194.17,'2004-09-30 00:00:00','2004-10-10 00:00:00','2004-10-01 00:00:00','Shipped',NULL,186,'2004-09-30',3,9,2004), (10299,'S24_4620',32,'80.8400000',1,2586.88,'2004-09-30 00:00:00','2004-10-10 00:00:00','2004-10-01 00:00:00','Shipped',NULL,186,'2004-09-30',3,9,2004), (10299,'S32_2206',24,'42.2400000',4,1013.76,'2004-09-30 00:00:00','2004-10-10 00:00:00','2004-10-01 00:00:00','Shipped',NULL,186,'2004-09-30',3,9,2004), (10299,'S32_4485',38,'100.0000000',7,4382.16,'2004-09-30 00:00:00','2004-10-10 00:00:00','2004-10-01 00:00:00','Shipped',NULL,186,'2004-09-30',3,9,2004), (10299,'S50_4713',44,'80.5500000',5,3544.2,'2004-09-30 00:00:00','2004-10-10 00:00:00','2004-10-01 00:00:00','Shipped',NULL,186,'2004-09-30',3,9,2004), (10300,'S12_1099',33,'100.0000000',5,5521.89,'2003-10-04 00:00:00','2003-10-13 00:00:00','2003-10-09 00:00:00','Shipped',NULL,128,'2003-10-04',4,10,2003), (10300,'S12_3380',29,'100.0000000',3,3984.6,'2003-10-04 00:00:00','2003-10-13 00:00:00','2003-10-09 00:00:00','Shipped',NULL,128,'2003-10-04',4,10,2003), (10300,'S12_3990',22,'76.6100000',6,1685.42,'2003-10-04 00:00:00','2003-10-13 00:00:00','2003-10-09 00:00:00','Shipped',NULL,128,'2003-10-04',4,10,2003), (10300,'S12_4675',23,'100.0000000',2,2807.61,'2003-10-04 00:00:00','2003-10-13 00:00:00','2003-10-09 00:00:00','Shipped',NULL,128,'2003-10-04',4,10,2003), (10300,'S18_1889',41,'92.4000000',1,3788.4,'2003-10-04 00:00:00','2003-10-13 00:00:00','2003-10-09 00:00:00','Shipped',NULL,128,'2003-10-04',4,10,2003), (10300,'S18_3278',49,'78.8000000',8,3861.2,'2003-10-04 00:00:00','2003-10-13 00:00:00','2003-10-09 00:00:00','Shipped',NULL,128,'2003-10-04',4,10,2003), (10300,'S18_3482',23,'100.0000000',7,3786.49,'2003-10-04 00:00:00','2003-10-13 00:00:00','2003-10-09 00:00:00','Shipped',NULL,128,'2003-10-04',4,10,2003), (10300,'S24_3371',31,'58.7800000',4,1822.18,'2003-10-04 00:00:00','2003-10-13 00:00:00','2003-10-09 00:00:00','Shipped',NULL,128,'2003-10-04',4,10,2003), (10301,'S18_1129',37,'100.0000000',8,5917.78,'2003-10-05 00:00:00','2003-10-15 00:00:00','2003-10-08 00:00:00','Shipped',NULL,299,'2003-10-05',4,10,2003), (10301,'S18_1589',32,'100.0000000',4,3424.64,'2003-10-05 00:00:00','2003-10-15 00:00:00','2003-10-08 00:00:00','Shipped',NULL,299,'2003-10-05',4,10,2003), (10301,'S18_1984',47,'100.0000000',7,7488.04,'2003-10-05 00:00:00','2003-10-15 00:00:00','2003-10-08 00:00:00','Shipped',NULL,299,'2003-10-05',4,10,2003), (10301,'S18_2870',22,'100.0000000',5,3223.44,'2003-10-05 00:00:00','2003-10-15 00:00:00','2003-10-08 00:00:00','Shipped',NULL,299,'2003-10-05',4,10,2003), (10301,'S18_3232',23,'100.0000000',9,4011.66,'2003-10-05 00:00:00','2003-10-15 00:00:00','2003-10-08 00:00:00','Shipped',NULL,299,'2003-10-05',4,10,2003), (10301,'S18_3685',39,'100.0000000',6,6446.7,'2003-10-05 00:00:00','2003-10-15 00:00:00','2003-10-08 00:00:00','Shipped',NULL,299,'2003-10-05',4,10,2003), (10301,'S24_1046',27,'72.0200000',1,1944.54,'2003-10-05 00:00:00','2003-10-15 00:00:00','2003-10-08 00:00:00','Shipped',NULL,299,'2003-10-05',4,10,2003), (10301,'S24_1628',22,'51.3200000',3,1129.04,'2003-10-05 00:00:00','2003-10-15 00:00:00','2003-10-08 00:00:00','Shipped',NULL,299,'2003-10-05',4,10,2003), (10301,'S24_2972',48,'34.3600000',10,1649.28,'2003-10-05 00:00:00','2003-10-15 00:00:00','2003-10-08 00:00:00','Shipped',NULL,299,'2003-10-05',4,10,2003), (10301,'S24_3432',22,'96.3700000',2,2120.14,'2003-10-05 00:00:00','2003-10-15 00:00:00','2003-10-08 00:00:00','Shipped',NULL,299,'2003-10-05',4,10,2003), (10301,'S24_3856',50,'100.0000000',11,7723.5,'2003-10-05 00:00:00','2003-10-15 00:00:00','2003-10-08 00:00:00','Shipped',NULL,299,'2003-10-05',4,10,2003), (10302,'S18_1749',43,'100.0000000',1,7310,'2003-10-06 00:00:00','2003-10-16 00:00:00','2003-10-07 00:00:00','Shipped',NULL,201,'2003-10-06',4,10,2003), (10302,'S18_4409',38,'89.2700000',2,3392.26,'2003-10-06 00:00:00','2003-10-16 00:00:00','2003-10-07 00:00:00','Shipped',NULL,201,'2003-10-06',4,10,2003), (10302,'S18_4933',23,'72.7000000',3,1672.1,'2003-10-06 00:00:00','2003-10-16 00:00:00','2003-10-07 00:00:00','Shipped',NULL,201,'2003-10-06',4,10,2003), (10302,'S24_2766',49,'100.0000000',5,5298.86,'2003-10-06 00:00:00','2003-10-16 00:00:00','2003-10-07 00:00:00','Shipped',NULL,201,'2003-10-06',4,10,2003), (10302,'S24_2887',45,'100.0000000',4,5548.95,'2003-10-06 00:00:00','2003-10-16 00:00:00','2003-10-07 00:00:00','Shipped',NULL,201,'2003-10-06',4,10,2003), (10302,'S24_3191',48,'74.4800000',6,3575.04,'2003-10-06 00:00:00','2003-10-16 00:00:00','2003-10-07 00:00:00','Shipped',NULL,201,'2003-10-06',4,10,2003), (10303,'S18_2248',46,'49.0400000',2,2255.84,'2004-10-06 00:00:00','2004-10-14 00:00:00','2004-10-09 00:00:00','Shipped','Customer inquired about remote controlled models and gold models.',484,'2004-10-06',4,10,2004), (10303,'S24_3969',24,'40.2100000',1,965.04,'2004-10-06 00:00:00','2004-10-14 00:00:00','2004-10-09 00:00:00','Shipped','Customer inquired about remote controlled models and gold models.',484,'2004-10-06',4,10,2004), (10304,'S10_1949',47,'100.0000000',6,10172.7,'2004-10-11 00:00:00','2004-10-20 00:00:00','2004-10-17 00:00:00','Shipped',NULL,256,'2004-10-11',4,10,2004), (10304,'S12_1666',39,'100.0000000',3,6396,'2004-10-11 00:00:00','2004-10-20 00:00:00','2004-10-17 00:00:00','Shipped',NULL,256,'2004-10-11',4,10,2004), (10304,'S18_1097',46,'98.0000000',5,4508,'2004-10-11 00:00:00','2004-10-20 00:00:00','2004-10-17 00:00:00','Shipped',NULL,256,'2004-10-11',4,10,2004), (10304,'S18_1342',37,'95.5500000',13,3535.35,'2004-10-11 00:00:00','2004-10-20 00:00:00','2004-10-17 00:00:00','Shipped',NULL,256,'2004-10-11',4,10,2004), (10304,'S18_1367',37,'48.5200000',12,1795.24,'2004-10-11 00:00:00','2004-10-20 00:00:00','2004-10-17 00:00:00','Shipped',NULL,256,'2004-10-11',4,10,2004), (10304,'S18_2325',24,'100.0000000',17,2440.8,'2004-10-11 00:00:00','2004-10-20 00:00:00','2004-10-17 00:00:00','Shipped',NULL,256,'2004-10-11',4,10,2004), (10304,'S18_2795',20,'100.0000000',14,3577.6,'2004-10-11 00:00:00','2004-10-20 00:00:00','2004-10-17 00:00:00','Shipped',NULL,256,'2004-10-11',4,10,2004), (10304,'S18_2949',46,'100.0000000',7,4613.8,'2004-10-11 00:00:00','2004-10-20 00:00:00','2004-10-17 00:00:00','Shipped',NULL,256,'2004-10-11',4,10,2004), (10304,'S18_2957',24,'64.9600000',9,1559.04,'2004-10-11 00:00:00','2004-10-20 00:00:00','2004-10-17 00:00:00','Shipped',NULL,256,'2004-10-11',4,10,2004), (10304,'S18_3136',26,'85.8700000',8,2232.62,'2004-10-11 00:00:00','2004-10-20 00:00:00','2004-10-17 00:00:00','Shipped',NULL,256,'2004-10-11',4,10,2004), (10304,'S18_3320',38,'100.0000000',11,3958.46,'2004-10-11 00:00:00','2004-10-20 00:00:00','2004-10-17 00:00:00','Shipped',NULL,256,'2004-10-11',4,10,2004), (10304,'S18_4668',34,'49.3000000',4,1676.2,'2004-10-11 00:00:00','2004-10-20 00:00:00','2004-10-17 00:00:00','Shipped',NULL,256,'2004-10-11',4,10,2004), (10304,'S24_1937',23,'30.2000000',16,694.6,'2004-10-11 00:00:00','2004-10-20 00:00:00','2004-10-17 00:00:00','Shipped',NULL,256,'2004-10-11',4,10,2004), (10304,'S24_2022',44,'39.4200000',15,1734.48,'2004-10-11 00:00:00','2004-10-20 00:00:00','2004-10-17 00:00:00','Shipped',NULL,256,'2004-10-11',4,10,2004), (10304,'S24_4258',33,'100.0000000',10,3342.57,'2004-10-11 00:00:00','2004-10-20 00:00:00','2004-10-17 00:00:00','Shipped',NULL,256,'2004-10-11',4,10,2004), (10304,'S32_3522',36,'73.0400000',2,2629.44,'2004-10-11 00:00:00','2004-10-20 00:00:00','2004-10-17 00:00:00','Shipped',NULL,256,'2004-10-11',4,10,2004), (10304,'S700_2824',40,'100.0000000',1,4208,'2004-10-11 00:00:00','2004-10-20 00:00:00','2004-10-17 00:00:00','Shipped',NULL,256,'2004-10-11',4,10,2004), (10305,'S10_4962',38,'100.0000000',13,6680.78,'2004-10-13 00:00:00','2004-10-22 00:00:00','2004-10-15 00:00:00','Shipped','Check on availability.',286,'2004-10-13',4,10,2004), (10305,'S12_4473',38,'100.0000000',5,4773.18,'2004-10-13 00:00:00','2004-10-22 00:00:00','2004-10-15 00:00:00','Shipped','Check on availability.',286,'2004-10-13',4,10,2004), (10305,'S18_2238',27,'100.0000000',4,3934.44,'2004-10-13 00:00:00','2004-10-22 00:00:00','2004-10-15 00:00:00','Shipped','Check on availability.',286,'2004-10-13',4,10,2004), (10305,'S18_2319',36,'100.0000000',8,4816.08,'2004-10-13 00:00:00','2004-10-22 00:00:00','2004-10-15 00:00:00','Shipped','Check on availability.',286,'2004-10-13',4,10,2004), (10305,'S18_2432',41,'53.4800000',11,2192.68,'2004-10-13 00:00:00','2004-10-22 00:00:00','2004-10-15 00:00:00','Shipped','Check on availability.',286,'2004-10-13',4,10,2004), (10305,'S18_3232',37,'100.0000000',9,7455.87,'2004-10-13 00:00:00','2004-10-22 00:00:00','2004-10-15 00:00:00','Shipped','Check on availability.',286,'2004-10-13',4,10,2004), (10305,'S18_4600',22,'99.2900000',14,2184.38,'2004-10-13 00:00:00','2004-10-22 00:00:00','2004-10-15 00:00:00','Shipped','Check on availability.',286,'2004-10-13',4,10,2004), (10305,'S24_1444',45,'61.8500000',2,2783.25,'2004-10-13 00:00:00','2004-10-22 00:00:00','2004-10-15 00:00:00','Shipped','Check on availability.',286,'2004-10-13',4,10,2004), (10305,'S24_2300',24,'100.0000000',10,3189.6,'2004-10-13 00:00:00','2004-10-22 00:00:00','2004-10-15 00:00:00','Shipped','Check on availability.',286,'2004-10-13',4,10,2004), (10305,'S24_2840',48,'31.4700000',6,1510.56,'2004-10-13 00:00:00','2004-10-22 00:00:00','2004-10-15 00:00:00','Shipped','Check on availability.',286,'2004-10-13',4,10,2004), (10305,'S24_4048',36,'100.0000000',1,4641.48,'2004-10-13 00:00:00','2004-10-22 00:00:00','2004-10-15 00:00:00','Shipped','Check on availability.',286,'2004-10-13',4,10,2004), (10305,'S32_1268',28,'100.0000000',12,3155.04,'2004-10-13 00:00:00','2004-10-22 00:00:00','2004-10-15 00:00:00','Shipped','Check on availability.',286,'2004-10-13',4,10,2004), (10305,'S32_2509',40,'57.9000000',7,2316,'2004-10-13 00:00:00','2004-10-22 00:00:00','2004-10-15 00:00:00','Shipped','Check on availability.',286,'2004-10-13',4,10,2004), (10305,'S50_1392',42,'100.0000000',3,4618.32,'2004-10-13 00:00:00','2004-10-22 00:00:00','2004-10-15 00:00:00','Shipped','Check on availability.',286,'2004-10-13',4,10,2004), (10306,'S12_1108',31,'100.0000000',13,6570.76,'2004-10-14 00:00:00','2004-10-21 00:00:00','2004-10-17 00:00:00','Shipped',NULL,187,'2004-10-14',4,10,2004), (10306,'S12_3148',34,'100.0000000',14,4982.7,'2004-10-14 00:00:00','2004-10-21 00:00:00','2004-10-17 00:00:00','Shipped',NULL,187,'2004-10-14',4,10,2004), (10306,'S12_3891',20,'100.0000000',12,3633.4,'2004-10-14 00:00:00','2004-10-21 00:00:00','2004-10-17 00:00:00','Shipped',NULL,187,'2004-10-14',4,10,2004), (10306,'S18_3140',32,'100.0000000',9,3759.04,'2004-10-14 00:00:00','2004-10-21 00:00:00','2004-10-17 00:00:00','Shipped',NULL,187,'2004-10-14',4,10,2004), (10306,'S18_3259',40,'91.7600000',11,3670.4,'2004-10-14 00:00:00','2004-10-21 00:00:00','2004-10-17 00:00:00','Shipped',NULL,187,'2004-10-14',4,10,2004), (10306,'S18_4027',23,'100.0000000',16,3600.65,'2004-10-14 00:00:00','2004-10-21 00:00:00','2004-10-17 00:00:00','Shipped',NULL,187,'2004-10-14',4,10,2004), (10306,'S18_4522',39,'90.4000000',8,3525.6,'2004-10-14 00:00:00','2004-10-21 00:00:00','2004-10-17 00:00:00','Shipped',NULL,187,'2004-10-14',4,10,2004), (10306,'S24_2011',29,'100.0000000',7,3207.4,'2004-10-14 00:00:00','2004-10-21 00:00:00','2004-10-17 00:00:00','Shipped',NULL,187,'2004-10-14',4,10,2004), (10306,'S24_3151',31,'84.0800000',2,2606.48,'2004-10-14 00:00:00','2004-10-21 00:00:00','2004-10-17 00:00:00','Shipped',NULL,187,'2004-10-14',4,10,2004), (10306,'S32_3207',46,'50.3300000',17,2315.18,'2004-10-14 00:00:00','2004-10-21 00:00:00','2004-10-17 00:00:00','Shipped',NULL,187,'2004-10-14',4,10,2004), (10306,'S50_1514',34,'60.3400000',15,2051.56,'2004-10-14 00:00:00','2004-10-21 00:00:00','2004-10-17 00:00:00','Shipped',NULL,187,'2004-10-14',4,10,2004), (10306,'S700_1138',50,'54.0000000',3,2700,'2004-10-14 00:00:00','2004-10-21 00:00:00','2004-10-17 00:00:00','Shipped',NULL,187,'2004-10-14',4,10,2004), (10306,'S700_1938',38,'91.8100000',10,3488.78,'2004-10-14 00:00:00','2004-10-21 00:00:00','2004-10-17 00:00:00','Shipped',NULL,187,'2004-10-14',4,10,2004), (10306,'S700_2610',43,'75.1700000',1,3232.31,'2004-10-14 00:00:00','2004-10-21 00:00:00','2004-10-17 00:00:00','Shipped',NULL,187,'2004-10-14',4,10,2004), (10306,'S700_3505',32,'90.1500000',4,2884.8,'2004-10-14 00:00:00','2004-10-21 00:00:00','2004-10-17 00:00:00','Shipped',NULL,187,'2004-10-14',4,10,2004), (10306,'S700_3962',30,'100.0000000',5,3515.7,'2004-10-14 00:00:00','2004-10-21 00:00:00','2004-10-17 00:00:00','Shipped',NULL,187,'2004-10-14',4,10,2004), (10306,'S72_3212',35,'59.5100000',6,2082.85,'2004-10-14 00:00:00','2004-10-21 00:00:00','2004-10-17 00:00:00','Shipped',NULL,187,'2004-10-14',4,10,2004), (10307,'S10_4757',22,'100.0000000',9,2692.8,'2004-10-14 00:00:00','2004-10-23 00:00:00','2004-10-20 00:00:00','Shipped',NULL,339,'2004-10-14',4,10,2004), (10307,'S18_1662',39,'100.0000000',1,7379.97,'2004-10-14 00:00:00','2004-10-23 00:00:00','2004-10-20 00:00:00','Shipped',NULL,339,'2004-10-14',4,10,2004), (10307,'S18_3029',31,'83.4400000',7,2586.64,'2004-10-14 00:00:00','2004-10-23 00:00:00','2004-10-20 00:00:00','Shipped',NULL,339,'2004-10-14',4,10,2004), (10307,'S18_3856',48,'86.8100000',6,4166.88,'2004-10-14 00:00:00','2004-10-23 00:00:00','2004-10-20 00:00:00','Shipped',NULL,339,'2004-10-14',4,10,2004), (10307,'S24_2841',25,'75.3600000',2,1884,'2004-10-14 00:00:00','2004-10-23 00:00:00','2004-10-20 00:00:00','Shipped',NULL,339,'2004-10-14',4,10,2004), (10307,'S24_3420',22,'71.6700000',3,1576.74,'2004-10-14 00:00:00','2004-10-23 00:00:00','2004-10-20 00:00:00','Shipped',NULL,339,'2004-10-14',4,10,2004), (10307,'S24_3816',22,'91.4100000',8,2011.02,'2004-10-14 00:00:00','2004-10-23 00:00:00','2004-10-20 00:00:00','Shipped',NULL,339,'2004-10-14',4,10,2004), (10307,'S700_2047',34,'97.7600000',5,3323.84,'2004-10-14 00:00:00','2004-10-23 00:00:00','2004-10-20 00:00:00','Shipped',NULL,339,'2004-10-14',4,10,2004), (10307,'S72_1253',34,'53.6300000',4,1823.42,'2004-10-14 00:00:00','2004-10-23 00:00:00','2004-10-20 00:00:00','Shipped',NULL,339,'2004-10-14',4,10,2004), (10308,'S10_2016',34,'100.0000000',2,4043.96,'2004-10-15 00:00:00','2004-10-24 00:00:00','2004-10-20 00:00:00','Shipped','Customer requested that FedEx Ground is used for this shipping',319,'2004-10-15',4,10,2004), (10308,'S10_4698',20,'100.0000000',1,4570.4,'2004-10-15 00:00:00','2004-10-24 00:00:00','2004-10-20 00:00:00','Shipped','Customer requested that FedEx Ground is used for this shipping',319,'2004-10-15',4,10,2004), (10308,'S18_2581',27,'82.7900000',7,2235.33,'2004-10-15 00:00:00','2004-10-24 00:00:00','2004-10-20 00:00:00','Shipped','Customer requested that FedEx Ground is used for this shipping',319,'2004-10-15',4,10,2004), (10308,'S18_2625',34,'52.0900000',3,1771.06,'2004-10-15 00:00:00','2004-10-24 00:00:00','2004-10-20 00:00:00','Shipped','Customer requested that FedEx Ground is used for this shipping',319,'2004-10-15',4,10,2004), (10308,'S24_1785',31,'100.0000000',9,3493.7,'2004-10-15 00:00:00','2004-10-24 00:00:00','2004-10-20 00:00:00','Shipped','Customer requested that FedEx Ground is used for this shipping',319,'2004-10-15',4,10,2004), (10308,'S24_2000',47,'63.2200000',4,2971.34,'2004-10-15 00:00:00','2004-10-24 00:00:00','2004-10-20 00:00:00','Shipped','Customer requested that FedEx Ground is used for this shipping',319,'2004-10-15',4,10,2004), (10308,'S24_3949',43,'76.4300000',16,3286.49,'2004-10-15 00:00:00','2004-10-24 00:00:00','2004-10-20 00:00:00','Shipped','Customer requested that FedEx Ground is used for this shipping',319,'2004-10-15',4,10,2004), (10308,'S24_4278',44,'83.3200000',8,3666.08,'2004-10-15 00:00:00','2004-10-24 00:00:00','2004-10-20 00:00:00','Shipped','Customer requested that FedEx Ground is used for this shipping',319,'2004-10-15',4,10,2004), (10308,'S32_1374',24,'79.9100000',5,1917.84,'2004-10-15 00:00:00','2004-10-24 00:00:00','2004-10-20 00:00:00','Shipped','Customer requested that FedEx Ground is used for this shipping',319,'2004-10-15',4,10,2004), (10308,'S32_4289',46,'66.0400000',10,3037.84,'2004-10-15 00:00:00','2004-10-24 00:00:00','2004-10-20 00:00:00','Shipped','Customer requested that FedEx Ground is used for this shipping',319,'2004-10-15',4,10,2004), (10308,'S50_1341',47,'43.6400000',11,2051.08,'2004-10-15 00:00:00','2004-10-24 00:00:00','2004-10-20 00:00:00','Shipped','Customer requested that FedEx Ground is used for this shipping',319,'2004-10-15',4,10,2004), (10308,'S700_1691',21,'100.0000000',12,2224.95,'2004-10-15 00:00:00','2004-10-24 00:00:00','2004-10-20 00:00:00','Shipped','Customer requested that FedEx Ground is used for this shipping',319,'2004-10-15',4,10,2004), (10308,'S700_2466',35,'88.7500000',14,3106.25,'2004-10-15 00:00:00','2004-10-24 00:00:00','2004-10-20 00:00:00','Shipped','Customer requested that FedEx Ground is used for this shipping',319,'2004-10-15',4,10,2004), (10308,'S700_2834',31,'100.0000000',6,4009.23,'2004-10-15 00:00:00','2004-10-24 00:00:00','2004-10-20 00:00:00','Shipped','Customer requested that FedEx Ground is used for this shipping',319,'2004-10-15',4,10,2004), (10308,'S700_3167',21,'87.2000000',13,1831.2,'2004-10-15 00:00:00','2004-10-24 00:00:00','2004-10-20 00:00:00','Shipped','Customer requested that FedEx Ground is used for this shipping',319,'2004-10-15',4,10,2004), (10308,'S700_4002',39,'68.1100000',15,2656.29,'2004-10-15 00:00:00','2004-10-24 00:00:00','2004-10-20 00:00:00','Shipped','Customer requested that FedEx Ground is used for this shipping',319,'2004-10-15',4,10,2004), (10309,'S10_1678',41,'100.0000000',5,4394.38,'2004-10-15 00:00:00','2004-10-24 00:00:00','2004-10-18 00:00:00','Shipped',NULL,121,'2004-10-15',4,10,2004), (10309,'S12_2823',26,'100.0000000',4,4660.24,'2004-10-15 00:00:00','2004-10-24 00:00:00','2004-10-18 00:00:00','Shipped',NULL,121,'2004-10-15',4,10,2004), (10309,'S24_1578',21,'100.0000000',6,2650.62,'2004-10-15 00:00:00','2004-10-24 00:00:00','2004-10-18 00:00:00','Shipped',NULL,121,'2004-10-15',4,10,2004), (10309,'S24_2360',24,'56.1000000',2,1346.4,'2004-10-15 00:00:00','2004-10-24 00:00:00','2004-10-18 00:00:00','Shipped',NULL,121,'2004-10-15',4,10,2004), (10309,'S32_4485',50,'84.7000000',3,4235,'2004-10-15 00:00:00','2004-10-24 00:00:00','2004-10-18 00:00:00','Shipped',NULL,121,'2004-10-15',4,10,2004), (10309,'S50_4713',28,'88.6800000',1,2483.04,'2004-10-15 00:00:00','2004-10-24 00:00:00','2004-10-18 00:00:00','Shipped',NULL,121,'2004-10-15',4,10,2004), (10310,'S12_1099',33,'100.0000000',10,6934.62,'2004-10-16 00:00:00','2004-10-24 00:00:00','2004-10-18 00:00:00','Shipped',NULL,259,'2004-10-16',4,10,2004), (10310,'S12_3380',24,'100.0000000',8,3100.32,'2004-10-16 00:00:00','2004-10-24 00:00:00','2004-10-18 00:00:00','Shipped',NULL,259,'2004-10-16',4,10,2004), (10310,'S12_3990',49,'81.4000000',11,3988.6,'2004-10-16 00:00:00','2004-10-24 00:00:00','2004-10-18 00:00:00','Shipped',NULL,259,'2004-10-16',4,10,2004), (10310,'S12_4675',25,'100.0000000',7,2504.75,'2004-10-16 00:00:00','2004-10-24 00:00:00','2004-10-18 00:00:00','Shipped',NULL,259,'2004-10-16',4,10,2004), (10310,'S18_1129',37,'100.0000000',2,6231.91,'2004-10-16 00:00:00','2004-10-24 00:00:00','2004-10-18 00:00:00','Shipped',NULL,259,'2004-10-16',4,10,2004), (10310,'S18_1889',20,'91.6300000',6,1832.6,'2004-10-16 00:00:00','2004-10-24 00:00:00','2004-10-18 00:00:00','Shipped',NULL,259,'2004-10-16',4,10,2004), (10310,'S18_1984',24,'100.0000000',1,3448.08,'2004-10-16 00:00:00','2004-10-24 00:00:00','2004-10-18 00:00:00','Shipped',NULL,259,'2004-10-16',4,10,2004), (10310,'S18_3232',48,'100.0000000',3,8940.96,'2008-07-31 15:13:44','2004-10-24 00:00:00','2004-10-18 00:00:00','Disputed',NULL,259,'2004-10-16',4,10,2004), (10310,'S18_3278',27,'80.4100000',13,2171.07,'2004-10-16 00:00:00','2004-10-24 00:00:00','2004-10-18 00:00:00','Shipped',NULL,259,'2004-10-16',4,10,2004), (10310,'S18_3482',49,'100.0000000',12,6266.12,'2004-10-16 00:00:00','2004-10-24 00:00:00','2004-10-18 00:00:00','Shipped',NULL,259,'2004-10-16',4,10,2004), (10310,'S18_3782',42,'67.1400000',16,2819.88,'2004-10-16 00:00:00','2004-10-24 00:00:00','2004-10-18 00:00:00','Shipped',NULL,259,'2004-10-16',4,10,2004), (10310,'S18_4721',40,'100.0000000',15,5356.8,'2004-10-16 00:00:00','2004-10-24 00:00:00','2004-10-18 00:00:00','Shipped',NULL,259,'2004-10-16',4,10,2004), (10310,'S24_2972',33,'41.9100000',4,1383.03,'2004-10-16 00:00:00','2004-10-24 00:00:00','2004-10-18 00:00:00','Shipped',NULL,259,'2004-10-16',4,10,2004), (10310,'S24_3371',38,'56.9400000',9,2163.72,'2004-10-16 00:00:00','2004-10-24 00:00:00','2004-10-18 00:00:00','Shipped',NULL,259,'2004-10-16',4,10,2004), (10310,'S24_3856',45,'100.0000000',5,5497.65,'2004-10-16 00:00:00','2004-10-24 00:00:00','2004-10-18 00:00:00','Shipped',NULL,259,'2004-10-16',4,10,2004), (10310,'S24_4620',49,'97.0100000',14,4753.49,'2004-10-16 00:00:00','2004-10-24 00:00:00','2004-10-18 00:00:00','Shipped',NULL,259,'2004-10-16',4,10,2004), (10310,'S32_2206',36,'43.0500000',17,1549.8,'2004-10-16 00:00:00','2004-10-24 00:00:00','2004-10-18 00:00:00','Shipped',NULL,259,'2004-10-16',4,10,2004), (10311,'S18_1589',29,'100.0000000',9,2923.2,'2004-10-16 00:00:00','2004-10-23 00:00:00','2004-10-20 00:00:00','Shipped','Difficult to negotiate with customer. We need more marketing materials',141,'2004-10-16',4,10,2004), (10311,'S18_2870',43,'100.0000000',10,5278.68,'2004-10-16 00:00:00','2004-10-23 00:00:00','2004-10-20 00:00:00','Shipped','Difficult to negotiate with customer. We need more marketing materials',141,'2004-10-16',4,10,2004), (10311,'S18_3685',32,'100.0000000',11,3616.64,'2004-10-16 00:00:00','2004-10-23 00:00:00','2004-10-20 00:00:00','Shipped','Difficult to negotiate with customer. We need more marketing materials',141,'2004-10-16',4,10,2004), (10311,'S18_4409',41,'81.9100000',1,3358.31,'2004-10-16 00:00:00','2004-10-23 00:00:00','2004-10-20 00:00:00','Shipped','Difficult to negotiate with customer. We need more marketing materials',141,'2004-10-16',4,10,2004), (10311,'S18_4933',25,'66.9900000',2,1674.75,'2004-10-16 00:00:00','2004-10-23 00:00:00','2004-10-20 00:00:00','Shipped','Difficult to negotiate with customer. We need more marketing materials',141,'2004-10-16',4,10,2004), (10311,'S24_1046',26,'87.4500000',6,2273.7,'2004-10-16 00:00:00','2004-10-23 00:00:00','2004-10-20 00:00:00','Shipped','Difficult to negotiate with customer. We need more marketing materials',141,'2004-10-16',4,10,2004), (10311,'S24_1628',45,'49.3000000',8,2218.5,'2004-10-16 00:00:00','2004-10-23 00:00:00','2004-10-20 00:00:00','Shipped','Difficult to negotiate with customer. We need more marketing materials',141,'2004-10-16',4,10,2004), (10311,'S24_2766',28,'93.6000000',4,2620.8,'2004-10-16 00:00:00','2004-10-23 00:00:00','2004-10-20 00:00:00','Shipped','Difficult to negotiate with customer. We need more marketing materials',141,'2004-10-16',4,10,2004), (10311,'S24_2887',43,'100.0000000',3,4595.41,'2004-10-16 00:00:00','2004-10-23 00:00:00','2004-10-20 00:00:00','Shipped','Difficult to negotiate with customer. We need more marketing materials',141,'2004-10-16',4,10,2004), (10311,'S24_3191',25,'83.0400000',5,2076,'2004-10-16 00:00:00','2004-10-23 00:00:00','2004-10-20 00:00:00','Shipped','Difficult to negotiate with customer. We need more marketing materials',141,'2004-10-16',4,10,2004), (10311,'S24_3432',46,'92.0900000',7,4236.14,'2004-10-16 00:00:00','2004-10-23 00:00:00','2004-10-20 00:00:00','Shipped','Difficult to negotiate with customer. We need more marketing materials',141,'2004-10-16',4,10,2004), (10312,'S10_1949',48,'100.0000000',3,11623.7,'2004-10-21 00:00:00','2004-10-27 00:00:00','2004-10-23 00:00:00','Shipped',NULL,124,'2004-10-21',4,10,2004), (10312,'S18_1097',32,'100.0000000',2,4181.44,'2004-10-21 00:00:00','2004-10-27 00:00:00','2004-10-23 00:00:00','Shipped',NULL,124,'2004-10-21',4,10,2004), (10312,'S18_1342',43,'89.3800000',10,3843.34,'2004-10-21 00:00:00','2004-10-27 00:00:00','2004-10-23 00:00:00','Shipped',NULL,124,'2004-10-21',4,10,2004), (10312,'S18_1367',25,'44.2100000',9,1105.25,'2004-10-21 00:00:00','2004-10-27 00:00:00','2004-10-23 00:00:00','Shipped',NULL,124,'2004-10-21',4,10,2004), (10312,'S18_1749',48,'100.0000000',17,8078.4,'2004-10-21 00:00:00','2004-10-27 00:00:00','2004-10-23 00:00:00','Shipped',NULL,124,'2004-10-21',4,10,2004), (10312,'S18_2248',30,'61.1500000',16,1834.5,'2004-10-21 00:00:00','2004-10-27 00:00:00','2004-10-23 00:00:00','Shipped',NULL,124,'2004-10-21',4,10,2004), (10312,'S18_2325',31,'100.0000000',14,4729.36,'2004-10-21 00:00:00','2004-10-27 00:00:00','2004-10-23 00:00:00','Shipped',NULL,124,'2004-10-21',4,10,2004), (10312,'S18_2795',25,'100.0000000',11,3881.25,'2004-10-21 00:00:00','2004-10-27 00:00:00','2004-10-23 00:00:00','Shipped',NULL,124,'2004-10-21',4,10,2004), (10312,'S18_2949',37,'100.0000000',4,3711.1,'2004-10-21 00:00:00','2004-10-27 00:00:00','2004-10-23 00:00:00','Shipped',NULL,124,'2004-10-21',4,10,2004), (10312,'S18_2957',35,'53.7200000',6,1880.2,'2004-10-21 00:00:00','2004-10-27 00:00:00','2004-10-23 00:00:00','Shipped',NULL,124,'2004-10-21',4,10,2004), (10312,'S18_3136',38,'100.0000000',5,4457.02,'2004-10-21 00:00:00','2004-10-27 00:00:00','2004-10-23 00:00:00','Shipped',NULL,124,'2004-10-21',4,10,2004), (10312,'S18_3320',33,'100.0000000',8,3535.95,'2004-10-21 00:00:00','2004-10-27 00:00:00','2004-10-23 00:00:00','Shipped',NULL,124,'2004-10-21',4,10,2004), (10312,'S18_4668',39,'56.8500000',1,2217.15,'2004-10-21 00:00:00','2004-10-27 00:00:00','2004-10-23 00:00:00','Shipped',NULL,124,'2004-10-21',4,10,2004), (10312,'S24_1937',39,'29.5400000',13,1152.06,'2004-10-21 00:00:00','2004-10-27 00:00:00','2004-10-23 00:00:00','Shipped',NULL,124,'2004-10-21',4,10,2004), (10312,'S24_2022',23,'37.6300000',12,865.49,'2004-10-21 00:00:00','2004-10-27 00:00:00','2004-10-23 00:00:00','Shipped',NULL,124,'2004-10-21',4,10,2004), (10312,'S24_3969',31,'35.2900000',15,1093.99,'2004-10-21 00:00:00','2004-10-27 00:00:00','2004-10-23 00:00:00','Shipped',NULL,124,'2004-10-21',4,10,2004), (10312,'S24_4258',44,'100.0000000',7,4884.88,'2004-10-21 00:00:00','2004-10-27 00:00:00','2004-10-23 00:00:00','Shipped',NULL,124,'2004-10-21',4,10,2004), (10313,'S10_4962',40,'100.0000000',7,6678,'2004-10-22 00:00:00','2004-10-28 00:00:00','2004-10-25 00:00:00','Shipped','Customer requested that FedEx Ground is used for this shipping',202,'2004-10-22',4,10,2004), (10313,'S12_1666',21,'100.0000000',11,2669.1,'2004-10-22 00:00:00','2004-10-28 00:00:00','2004-10-25 00:00:00','Shipped','Customer requested that FedEx Ground is used for this shipping',202,'2004-10-22',4,10,2004), (10313,'S18_2319',29,'100.0000000',2,3416.78,'2004-10-22 00:00:00','2004-10-28 00:00:00','2004-10-25 00:00:00','Shipped','Customer requested that FedEx Ground is used for this shipping',202,'2004-10-22',4,10,2004), (10313,'S18_2432',34,'52.8700000',5,1797.58,'2004-10-22 00:00:00','2004-10-28 00:00:00','2004-10-25 00:00:00','Shipped','Customer requested that FedEx Ground is used for this shipping',202,'2004-10-22',4,10,2004), (10313,'S18_3232',25,'100.0000000',3,4572.25,'2004-10-22 00:00:00','2004-10-28 00:00:00','2004-10-25 00:00:00','Shipped','Customer requested that FedEx Ground is used for this shipping',202,'2004-10-22',4,10,2004), (10313,'S18_4600',28,'100.0000000',8,2881.76,'2004-10-22 00:00:00','2004-10-28 00:00:00','2004-10-25 00:00:00','Shipped','Customer requested that FedEx Ground is used for this shipping',202,'2004-10-22',4,10,2004), (10313,'S24_2300',42,'100.0000000',4,5581.8,'2004-10-22 00:00:00','2004-10-28 00:00:00','2004-10-25 00:00:00','Shipped','Customer requested that FedEx Ground is used for this shipping',202,'2004-10-22',4,10,2004), (10313,'S32_1268',27,'87.6400000',6,2366.28,'2004-10-22 00:00:00','2004-10-28 00:00:00','2004-10-25 00:00:00','Shipped','Customer requested that FedEx Ground is used for this shipping',202,'2004-10-22',4,10,2004), (10313,'S32_2509',38,'45.4500000',1,1727.1,'2004-10-22 00:00:00','2004-10-28 00:00:00','2004-10-25 00:00:00','Shipped','Customer requested that FedEx Ground is used for this shipping',202,'2004-10-22',4,10,2004), (10313,'S32_3522',34,'56.2400000',10,1912.16,'2004-10-22 00:00:00','2004-10-28 00:00:00','2004-10-25 00:00:00','Shipped','Customer requested that FedEx Ground is used for this shipping',202,'2004-10-22',4,10,2004), (10313,'S700_2824',30,'99.1300000',9,2973.9,'2004-10-22 00:00:00','2004-10-28 00:00:00','2004-10-25 00:00:00','Shipped','Customer requested that FedEx Ground is used for this shipping',202,'2004-10-22',4,10,2004), (10314,'S12_1108',38,'100.0000000',5,7975.44,'2004-10-22 00:00:00','2004-11-01 00:00:00','2004-10-23 00:00:00','Shipped',NULL,227,'2004-10-22',4,10,2004), (10314,'S12_3148',46,'100.0000000',6,6393.54,'2004-10-22 00:00:00','2004-11-01 00:00:00','2004-10-23 00:00:00','Shipped',NULL,227,'2004-10-22',4,10,2004), (10314,'S12_3891',36,'100.0000000',4,6913.8,'2004-10-22 00:00:00','2004-11-01 00:00:00','2004-10-23 00:00:00','Shipped',NULL,227,'2004-10-22',4,10,2004), (10314,'S12_4473',45,'100.0000000',14,6185.7,'2004-10-22 00:00:00','2004-11-01 00:00:00','2004-10-23 00:00:00','Shipped',NULL,227,'2004-10-22',4,10,2004), (10314,'S18_2238',42,'100.0000000',13,5776.26,'2004-10-22 00:00:00','2004-11-01 00:00:00','2004-10-23 00:00:00','Shipped',NULL,227,'2004-10-22',4,10,2004), (10314,'S18_3140',20,'100.0000000',1,2731.8,'2004-10-22 00:00:00','2004-11-01 00:00:00','2004-10-23 00:00:00','Shipped',NULL,227,'2004-10-22',4,10,2004), (10314,'S18_3259',23,'100.0000000',3,2481.7,'2004-10-22 00:00:00','2004-11-01 00:00:00','2004-10-23 00:00:00','Shipped',NULL,227,'2004-10-22',4,10,2004), (10314,'S18_4027',29,'100.0000000',8,4206.74,'2004-10-22 00:00:00','2004-11-01 00:00:00','2004-10-23 00:00:00','Shipped',NULL,227,'2004-10-22',4,10,2004), (10314,'S24_1444',44,'53.1800000',11,2339.92,'2004-10-22 00:00:00','2004-11-01 00:00:00','2004-10-23 00:00:00','Shipped',NULL,227,'2004-10-22',4,10,2004), (10314,'S24_2840',39,'37.1300000',15,1448.07,'2004-10-22 00:00:00','2004-11-01 00:00:00','2004-10-23 00:00:00','Shipped',NULL,227,'2004-10-22',4,10,2004), (10314,'S24_4048',38,'100.0000000',10,4000.26,'2004-10-22 00:00:00','2004-11-01 00:00:00','2004-10-23 00:00:00','Shipped',NULL,227,'2004-10-22',4,10,2004), (10314,'S32_3207',35,'66.4900000',9,2327.15,'2004-10-22 00:00:00','2004-11-01 00:00:00','2004-10-23 00:00:00','Shipped',NULL,227,'2004-10-22',4,10,2004), (10314,'S50_1392',28,'100.0000000',12,3403.12,'2004-10-22 00:00:00','2004-11-01 00:00:00','2004-10-23 00:00:00','Shipped',NULL,227,'2004-10-22',4,10,2004), (10314,'S50_1514',38,'61.5100000',7,2337.38,'2004-10-22 00:00:00','2004-11-01 00:00:00','2004-10-23 00:00:00','Shipped',NULL,227,'2004-10-22',4,10,2004), (10314,'S700_1938',23,'76.2200000',2,1753.06,'2004-10-22 00:00:00','2004-11-01 00:00:00','2004-10-23 00:00:00','Shipped',NULL,227,'2004-10-22',4,10,2004), (10315,'S18_4522',36,'100.0000000',7,3602.16,'2004-10-29 00:00:00','2004-11-08 00:00:00','2004-10-30 00:00:00','Shipped',NULL,119,'2004-10-29',4,10,2004), (10315,'S24_2011',35,'100.0000000',6,4215.05,'2004-10-29 00:00:00','2004-11-08 00:00:00','2004-10-30 00:00:00','Shipped',NULL,119,'2004-10-29',4,10,2004), (10315,'S24_3151',24,'86.7400000',1,2081.76,'2004-10-29 00:00:00','2004-11-08 00:00:00','2004-10-30 00:00:00','Shipped',NULL,119,'2004-10-29',4,10,2004), (10315,'S700_1138',41,'62.0000000',2,2542,'2004-10-29 00:00:00','2004-11-08 00:00:00','2004-10-30 00:00:00','Shipped',NULL,119,'2004-10-29',4,10,2004), (10315,'S700_3505',31,'86.1500000',3,2670.65,'2004-10-29 00:00:00','2004-11-08 00:00:00','2004-10-30 00:00:00','Shipped',NULL,119,'2004-10-29',4,10,2004), (10315,'S700_3962',37,'91.3700000',4,3380.69,'2004-10-29 00:00:00','2004-11-08 00:00:00','2004-10-30 00:00:00','Shipped',NULL,119,'2004-10-29',4,10,2004), (10315,'S72_3212',40,'55.6900000',5,2227.6,'2004-10-29 00:00:00','2004-11-08 00:00:00','2004-10-30 00:00:00','Shipped',NULL,119,'2004-10-29',4,10,2004), (10316,'S10_4757',33,'100.0000000',17,4128.96,'2004-11-01 00:00:00','2004-11-09 00:00:00','2004-11-07 00:00:00','Shipped','Customer requested that ad materials (such as posters, pamphlets) be included in the shippment',240,'2004-11-01',4,11,2004), (10316,'S18_1662',27,'100.0000000',9,3704.13,'2004-11-01 00:00:00','2004-11-09 00:00:00','2004-11-07 00:00:00','Shipped','Customer requested that ad materials (such as posters, pamphlets) be included in the shippment',240,'2004-11-01',4,11,2004), (10316,'S18_3029',21,'94.6200000',15,1987.02,'2004-11-01 00:00:00','2004-11-09 00:00:00','2004-11-07 00:00:00','Shipped','Customer requested that ad materials (such as posters, pamphlets) be included in the shippment',240,'2004-11-01',4,11,2004), (10316,'S18_3856',47,'86.8100000',14,4080.07,'2004-11-01 00:00:00','2004-11-09 00:00:00','2004-11-07 00:00:00','Shipped','Customer requested that ad materials (such as posters, pamphlets) be included in the shippment',240,'2004-11-01',4,11,2004), (10316,'S24_1785',25,'100.0000000',1,2872.25,'2004-11-01 00:00:00','2004-11-09 00:00:00','2004-11-07 00:00:00','Shipped','Customer requested that ad materials (such as posters, pamphlets) be included in the shippment',240,'2004-11-01',4,11,2004), (10316,'S24_2841',34,'63.7100000',10,2166.14,'2004-11-01 00:00:00','2004-11-09 00:00:00','2004-11-07 00:00:00','Shipped','Customer requested that ad materials (such as posters, pamphlets) be included in the shippment',240,'2004-11-01',4,11,2004), (10316,'S24_3420',47,'76.9300000',11,3615.71,'2004-11-01 00:00:00','2004-11-09 00:00:00','2004-11-07 00:00:00','Shipped','Customer requested that ad materials (such as posters, pamphlets) be included in the shippment',240,'2004-11-01',4,11,2004), (10316,'S24_3816',25,'92.2500000',16,2306.25,'2004-11-01 00:00:00','2004-11-09 00:00:00','2004-11-07 00:00:00','Shipped','Customer requested that ad materials (such as posters, pamphlets) be included in the shippment',240,'2004-11-01',4,11,2004), (10316,'S24_3949',30,'77.7900000',8,2333.7,'2004-11-01 00:00:00','2004-11-09 00:00:00','2004-11-07 00:00:00','Shipped','Customer requested that ad materials (such as posters, pamphlets) be included in the shippment',240,'2004-11-01',4,11,2004), (10316,'S32_4289',24,'59.1600000',2,1419.84,'2004-11-01 00:00:00','2004-11-09 00:00:00','2004-11-07 00:00:00','Shipped','Customer requested that ad materials (such as posters, pamphlets) be included in the shippment',240,'2004-11-01',4,11,2004), (10316,'S50_1341',34,'47.5700000',3,1617.38,'2004-11-01 00:00:00','2004-11-09 00:00:00','2004-11-07 00:00:00','Shipped','Customer requested that ad materials (such as posters, pamphlets) be included in the shippment',240,'2004-11-01',4,11,2004), (10316,'S700_1691',34,'82.2100000',4,2795.14,'2004-11-01 00:00:00','2004-11-09 00:00:00','2004-11-07 00:00:00','Shipped','Customer requested that ad materials (such as posters, pamphlets) be included in the shippment',240,'2004-11-01',4,11,2004), (10316,'S700_2047',45,'93.2400000',13,4195.8,'2004-11-01 00:00:00','2004-11-09 00:00:00','2004-11-07 00:00:00','Shipped','Customer requested that ad materials (such as posters, pamphlets) be included in the shippment',240,'2004-11-01',4,11,2004), (10316,'S700_2466',23,'100.0000000',6,2706.41,'2004-11-01 00:00:00','2004-11-09 00:00:00','2004-11-07 00:00:00','Shipped','Customer requested that ad materials (such as posters, pamphlets) be included in the shippment',240,'2004-11-01',4,11,2004), (10316,'S700_2610',48,'74.4500000',18,3573.6,'2004-11-01 00:00:00','2004-11-09 00:00:00','2004-11-07 00:00:00','Shipped','Customer requested that ad materials (such as posters, pamphlets) be included in the shippment',240,'2004-11-01',4,11,2004), (10316,'S700_3167',48,'75.2000000',5,3609.6,'2004-11-01 00:00:00','2004-11-09 00:00:00','2004-11-07 00:00:00','Shipped','Customer requested that ad materials (such as posters, pamphlets) be included in the shippment',240,'2004-11-01',4,11,2004), (10316,'S700_4002',44,'62.1900000',7,2736.36,'2004-11-01 00:00:00','2004-11-09 00:00:00','2004-11-07 00:00:00','Shipped','Customer requested that ad materials (such as posters, pamphlets) be included in the shippment',240,'2004-11-01',4,11,2004), (10316,'S72_1253',34,'43.7000000',12,1485.8,'2004-11-01 00:00:00','2004-11-09 00:00:00','2004-11-07 00:00:00','Shipped','Customer requested that ad materials (such as posters, pamphlets) be included in the shippment',240,'2004-11-01',4,11,2004), (10317,'S24_4278',35,'83.3200000',1,2916.2,'2004-11-02 00:00:00','2004-11-12 00:00:00','2004-11-08 00:00:00','Shipped',NULL,161,'2004-11-02',4,11,2004), (10318,'S10_1678',46,'94.7400000',1,4358.04,'2004-11-02 00:00:00','2004-11-09 00:00:00','2004-11-07 00:00:00','Shipped',NULL,157,'2004-11-02',4,11,2004), (10318,'S10_2016',45,'100.0000000',4,5566.5,'2004-11-02 00:00:00','2004-11-09 00:00:00','2004-11-07 00:00:00','Shipped',NULL,157,'2004-11-02',4,11,2004), (10318,'S10_4698',37,'100.0000000',3,7667.14,'2004-11-02 00:00:00','2004-11-09 00:00:00','2004-11-07 00:00:00','Shipped',NULL,157,'2004-11-02',4,11,2004), (10318,'S18_2581',31,'100.0000000',9,3116.43,'2004-11-02 00:00:00','2004-11-09 00:00:00','2004-11-07 00:00:00','Shipped',NULL,157,'2004-11-02',4,11,2004), (10318,'S18_2625',42,'52.7000000',5,2213.4,'2004-11-02 00:00:00','2004-11-09 00:00:00','2004-11-07 00:00:00','Shipped',NULL,157,'2004-11-02',4,11,2004), (10318,'S24_1578',48,'100.0000000',2,6437.28,'2004-11-02 00:00:00','2004-11-09 00:00:00','2004-11-07 00:00:00','Shipped',NULL,157,'2004-11-02',4,11,2004), (10318,'S24_2000',26,'86.8300000',6,2257.58,'2004-11-02 00:00:00','2004-11-09 00:00:00','2004-11-07 00:00:00','Shipped',NULL,157,'2004-11-02',4,11,2004), (10318,'S32_1374',47,'100.0000000',7,5305.36,'2004-11-02 00:00:00','2004-11-09 00:00:00','2004-11-07 00:00:00','Shipped',NULL,157,'2004-11-02',4,11,2004), (10318,'S700_2834',50,'100.0000000',8,7119,'2004-11-02 00:00:00','2004-11-09 00:00:00','2004-11-07 00:00:00','Shipped',NULL,157,'2004-11-02',4,11,2004), (10319,'S12_2823',30,'100.0000000',9,4111.8,'2004-11-03 00:00:00','2004-11-11 00:00:00','2004-11-06 00:00:00','Shipped','Customer requested that DHL is used for this shipping',456,'2004-11-03',4,11,2004), (10319,'S18_3278',46,'73.9800000',1,3403.08,'2004-11-03 00:00:00','2004-11-11 00:00:00','2004-11-06 00:00:00','Shipped','Customer requested that DHL is used for this shipping',456,'2004-11-03',4,11,2004), (10319,'S18_3782',44,'59.0600000',4,2598.64,'2004-11-03 00:00:00','2004-11-11 00:00:00','2004-11-06 00:00:00','Shipped','Customer requested that DHL is used for this shipping',456,'2004-11-03',4,11,2004), (10319,'S18_4721',45,'100.0000000',3,7901.1,'2004-11-03 00:00:00','2004-11-11 00:00:00','2004-11-06 00:00:00','Shipped','Customer requested that DHL is used for this shipping',456,'2004-11-03',4,11,2004), (10319,'S24_2360',31,'81.7300000',7,2533.63,'2004-11-03 00:00:00','2004-11-11 00:00:00','2004-11-06 00:00:00','Shipped','Customer requested that DHL is used for this shipping',456,'2004-11-03',4,11,2004), (10319,'S24_4620',43,'85.6900000',2,3684.67,'2004-11-03 00:00:00','2004-11-11 00:00:00','2004-11-06 00:00:00','Shipped','Customer requested that DHL is used for this shipping',456,'2004-11-03',4,11,2004), (10319,'S32_2206',29,'38.2200000',5,1108.38,'2004-11-03 00:00:00','2004-11-11 00:00:00','2004-11-06 00:00:00','Shipped','Customer requested that DHL is used for this shipping',456,'2004-11-03',4,11,2004), (10319,'S32_4485',22,'100.0000000',8,2626.8,'2004-11-03 00:00:00','2004-11-11 00:00:00','2004-11-06 00:00:00','Shipped','Customer requested that DHL is used for this shipping',456,'2004-11-03',4,11,2004), (10319,'S50_4713',45,'77.2900000',6,3478.05,'2004-11-03 00:00:00','2004-11-11 00:00:00','2004-11-06 00:00:00','Shipped','Customer requested that DHL is used for this shipping',456,'2004-11-03',4,11,2004), (10320,'S12_1099',31,'100.0000000',3,6876.11,'2004-11-03 00:00:00','2004-11-13 00:00:00','2004-11-07 00:00:00','Shipped',NULL,144,'2004-11-03',4,11,2004), (10320,'S12_3380',35,'100.0000000',1,4850.3,'2004-11-03 00:00:00','2004-11-13 00:00:00','2004-11-07 00:00:00','Shipped',NULL,144,'2004-11-03',4,11,2004), (10320,'S12_3990',38,'73.4200000',4,2789.96,'2004-11-03 00:00:00','2004-11-13 00:00:00','2004-11-07 00:00:00','Shipped',NULL,144,'2004-11-03',4,11,2004), (10320,'S18_3482',25,'100.0000000',5,3491,'2004-11-03 00:00:00','2004-11-13 00:00:00','2004-11-07 00:00:00','Shipped',NULL,144,'2004-11-03',4,11,2004), (10320,'S24_3371',26,'61.2300000',2,1591.98,'2004-11-03 00:00:00','2004-11-13 00:00:00','2004-11-07 00:00:00','Shipped',NULL,144,'2004-11-03',4,11,2004), (10321,'S12_4675',24,'100.0000000',15,2984.88,'2004-11-04 00:00:00','2004-11-12 00:00:00','2004-11-07 00:00:00','Shipped',NULL,462,'2004-11-04',4,11,2004), (10321,'S18_1129',41,'100.0000000',10,5803.14,'2004-11-04 00:00:00','2004-11-12 00:00:00','2004-11-07 00:00:00','Shipped',NULL,462,'2004-11-04',4,11,2004), (10321,'S18_1589',44,'100.0000000',6,4489.76,'2004-11-04 00:00:00','2004-11-12 00:00:00','2004-11-07 00:00:00','Shipped',NULL,462,'2004-11-04',4,11,2004), (10321,'S18_1889',37,'78.5400000',14,2905.98,'2004-11-04 00:00:00','2004-11-12 00:00:00','2004-11-07 00:00:00','Shipped',NULL,462,'2004-11-04',4,11,2004), (10321,'S18_1984',25,'100.0000000',9,3734,'2004-11-04 00:00:00','2004-11-12 00:00:00','2004-11-07 00:00:00','Shipped',NULL,462,'2004-11-04',4,11,2004), (10321,'S18_2870',27,'100.0000000',7,2851.2,'2004-11-04 00:00:00','2004-11-12 00:00:00','2004-11-07 00:00:00','Shipped',NULL,462,'2004-11-04',4,11,2004), (10321,'S18_3232',33,'100.0000000',11,5700.09,'2004-11-04 00:00:00','2004-11-12 00:00:00','2004-11-07 00:00:00','Shipped',NULL,462,'2004-11-04',4,11,2004), (10321,'S18_3685',28,'100.0000000',8,4232.76,'2004-11-04 00:00:00','2004-11-12 00:00:00','2004-11-07 00:00:00','Shipped',NULL,462,'2004-11-04',4,11,2004), (10321,'S24_1046',30,'70.5500000',3,2116.5,'2004-11-04 00:00:00','2004-11-12 00:00:00','2004-11-07 00:00:00','Shipped',NULL,462,'2004-11-04',4,11,2004), (10321,'S24_1628',48,'42.2600000',5,2028.48,'2004-11-04 00:00:00','2004-11-12 00:00:00','2004-11-07 00:00:00','Shipped',NULL,462,'2004-11-04',4,11,2004), (10321,'S24_2766',30,'72.7000000',1,2181,'2004-11-04 00:00:00','2004-11-12 00:00:00','2004-11-07 00:00:00','Shipped',NULL,462,'2004-11-04',4,11,2004), (10321,'S24_2972',37,'33.2300000',12,1229.51,'2004-11-04 00:00:00','2004-11-12 00:00:00','2004-11-07 00:00:00','Shipped',NULL,462,'2004-11-04',4,11,2004), (10321,'S24_3191',39,'84.7500000',2,3305.25,'2004-11-04 00:00:00','2004-11-12 00:00:00','2004-11-07 00:00:00','Shipped',NULL,462,'2004-11-04',4,11,2004), (10321,'S24_3432',21,'89.9500000',4,1888.95,'2004-11-04 00:00:00','2004-11-12 00:00:00','2004-11-07 00:00:00','Shipped',NULL,462,'2004-11-04',4,11,2004), (10321,'S24_3856',26,'100.0000000',13,4052.88,'2004-11-04 00:00:00','2004-11-12 00:00:00','2004-11-07 00:00:00','Shipped',NULL,462,'2004-11-04',4,11,2004), (10322,'S10_1949',40,'100.0000000',1,6000.4,'2004-11-04 00:00:00','2004-11-12 00:00:00','2004-11-10 00:00:00','Shipped','Customer has worked with some of our vendors in the past and is aware of their MSRP',363,'2004-11-04',4,11,2004), (10322,'S10_4962',46,'61.9900000',8,2851.54,'2004-11-04 00:00:00','2004-11-12 00:00:00','2004-11-10 00:00:00','Shipped','Customer has worked with some of our vendors in the past and is aware of their MSRP',363,'2004-11-04',4,11,2004), (10322,'S12_1666',27,'100.0000000',9,4784.13,'2004-11-04 00:00:00','2004-11-12 00:00:00','2004-11-10 00:00:00','Shipped','Customer has worked with some of our vendors in the past and is aware of their MSRP',363,'2004-11-04',4,11,2004), (10322,'S18_1097',22,'100.0000000',10,2251.04,'2004-11-04 00:00:00','2004-11-12 00:00:00','2004-11-10 00:00:00','Shipped','Customer has worked with some of our vendors in the past and is aware of their MSRP',363,'2004-11-04',4,11,2004), (10322,'S18_1342',43,'86.3000000',14,3710.9,'2004-11-04 00:00:00','2004-11-12 00:00:00','2004-11-10 00:00:00','Shipped','Customer has worked with some of our vendors in the past and is aware of their MSRP',363,'2004-11-04',4,11,2004), (10322,'S18_1367',41,'57.6800000',5,2364.88,'2004-11-04 00:00:00','2004-11-12 00:00:00','2004-11-10 00:00:00','Shipped','Customer has worked with some of our vendors in the past and is aware of their MSRP',363,'2004-11-04',4,11,2004), (10322,'S18_2325',50,'100.0000000',6,12536.5,'2004-11-04 00:00:00','2004-11-12 00:00:00','2004-11-10 00:00:00','Shipped','Customer has worked with some of our vendors in the past and is aware of their MSRP',363,'2004-11-04',4,11,2004), (10322,'S18_2432',35,'61.2100000',11,2142.35,'2004-11-04 00:00:00','2004-11-12 00:00:00','2004-11-10 00:00:00','Shipped','Customer has worked with some of our vendors in the past and is aware of their MSRP',363,'2004-11-04',4,11,2004), (10322,'S18_2795',36,'100.0000000',2,5797.44,'2004-11-04 00:00:00','2004-11-12 00:00:00','2004-11-10 00:00:00','Shipped','Customer has worked with some of our vendors in the past and is aware of their MSRP',363,'2004-11-04',4,11,2004), (10322,'S18_2949',33,'100.0000000',12,3524.73,'2004-11-04 00:00:00','2004-11-12 00:00:00','2004-11-10 00:00:00','Shipped','Customer has worked with some of our vendors in the past and is aware of their MSRP',363,'2004-11-04',4,11,2004), (10322,'S18_2957',41,'29.8700000',13,1224.67,'2004-11-04 00:00:00','2004-11-12 00:00:00','2004-11-10 00:00:00','Shipped','Customer has worked with some of our vendors in the past and is aware of their MSRP',363,'2004-11-04',4,11,2004), (10322,'S18_3136',48,'47.0400000',7,2257.92,'2004-11-04 00:00:00','2004-11-12 00:00:00','2004-11-10 00:00:00','Shipped','Customer has worked with some of our vendors in the past and is aware of their MSRP',363,'2004-11-04',4,11,2004), (10322,'S24_1937',20,'100.0000000',3,2624,'2004-11-04 00:00:00','2004-11-12 00:00:00','2004-11-10 00:00:00','Shipped','Customer has worked with some of our vendors in the past and is aware of their MSRP',363,'2004-11-04',4,11,2004), (10322,'S24_2022',30,'100.0000000',4,3500.1,'2004-11-04 00:00:00','2004-11-12 00:00:00','2004-11-10 00:00:00','Shipped','Customer has worked with some of our vendors in the past and is aware of their MSRP',363,'2004-11-04',4,11,2004), (10323,'S18_3320',33,'91.2700000',2,3011.91,'2004-11-05 00:00:00','2004-11-12 00:00:00','2004-11-09 00:00:00','Shipped',NULL,128,'2004-11-05',4,11,2004), (10323,'S18_4600',47,'100.0000000',1,6203.06,'2004-11-05 00:00:00','2004-11-12 00:00:00','2004-11-09 00:00:00','Shipped',NULL,128,'2004-11-05',4,11,2004), (10324,'S12_3148',27,'54.3300000',1,1466.91,'2004-11-05 00:00:00','2004-11-11 00:00:00','2004-11-08 00:00:00','Shipped',NULL,181,'2004-11-05',4,11,2004), (10324,'S12_4473',26,'58.3800000',7,1517.88,'2004-11-05 00:00:00','2004-11-11 00:00:00','2004-11-08 00:00:00','Shipped',NULL,181,'2004-11-05',4,11,2004), (10324,'S18_2238',47,'100.0000000',8,7207.45,'2004-11-05 00:00:00','2004-11-11 00:00:00','2004-11-08 00:00:00','Shipped',NULL,181,'2004-11-05',4,11,2004), (10324,'S18_2319',33,'37.4800000',10,1236.84,'2004-11-05 00:00:00','2004-11-11 00:00:00','2004-11-08 00:00:00','Shipped',NULL,181,'2004-11-05',4,11,2004), (10324,'S18_3232',27,'100.0000000',12,3155.49,'2004-11-05 00:00:00','2004-11-11 00:00:00','2004-11-08 00:00:00','Shipped',NULL,181,'2004-11-05',4,11,2004), (10324,'S18_4027',49,'100.0000000',13,5379.71,'2004-11-05 00:00:00','2004-11-11 00:00:00','2004-11-08 00:00:00','Shipped',NULL,181,'2004-11-05',4,11,2004), (10324,'S18_4668',38,'100.0000000',6,6832.02,'2004-11-05 00:00:00','2004-11-11 00:00:00','2004-11-08 00:00:00','Shipped',NULL,181,'2004-11-05',4,11,2004), (10324,'S24_1444',25,'69.1600000',14,1729,'2004-11-05 00:00:00','2004-11-11 00:00:00','2004-11-08 00:00:00','Shipped',NULL,181,'2004-11-05',4,11,2004), (10324,'S24_2300',31,'100.0000000',2,3820.44,'2004-11-05 00:00:00','2004-11-11 00:00:00','2004-11-08 00:00:00','Shipped',NULL,181,'2004-11-05',4,11,2004), (10324,'S24_2840',30,'100.0000000',9,3338.1,'2004-11-05 00:00:00','2004-11-11 00:00:00','2004-11-08 00:00:00','Shipped',NULL,181,'2004-11-05',4,11,2004), (10324,'S24_4258',33,'100.0000000',3,6267.69,'2004-11-05 00:00:00','2004-11-11 00:00:00','2004-11-08 00:00:00','Shipped',NULL,181,'2004-11-05',4,11,2004), (10324,'S32_1268',20,'98.1800000',11,1963.6,'2004-11-05 00:00:00','2004-11-11 00:00:00','2004-11-08 00:00:00','Shipped',NULL,181,'2004-11-05',4,11,2004), (10324,'S32_3522',48,'100.0000000',4,8209.44,'2004-11-05 00:00:00','2004-11-11 00:00:00','2004-11-08 00:00:00','Shipped',NULL,181,'2004-11-05',4,11,2004), (10324,'S700_2824',34,'100.0000000',5,4248.3,'2004-11-05 00:00:00','2004-11-11 00:00:00','2004-11-08 00:00:00','Shipped',NULL,181,'2004-11-05',4,11,2004), (10325,'S10_4757',47,'64.9300000',6,3051.71,'2004-11-05 00:00:00','2004-11-13 00:00:00','2004-11-08 00:00:00','Shipped',NULL,121,'2004-11-05',4,11,2004), (10325,'S12_1108',42,'64.0000000',8,2688,'2004-11-05 00:00:00','2004-11-13 00:00:00','2004-11-08 00:00:00','Shipped',NULL,121,'2004-11-05',4,11,2004), (10325,'S12_3891',24,'100.0000000',1,2583.6,'2004-11-05 00:00:00','2004-11-13 00:00:00','2004-11-08 00:00:00','Shipped',NULL,121,'2004-11-05',4,11,2004), (10325,'S18_3140',24,'69.1200000',9,1658.88,'2004-11-05 00:00:00','2004-11-13 00:00:00','2004-11-08 00:00:00','Shipped',NULL,121,'2004-11-05',4,11,2004), (10325,'S24_4048',44,'100.0000000',5,5325.76,'2004-11-05 00:00:00','2004-11-13 00:00:00','2004-11-08 00:00:00','Shipped',NULL,121,'2004-11-05',4,11,2004), (10325,'S32_2509',38,'100.0000000',3,8844.12,'2004-11-05 00:00:00','2004-11-13 00:00:00','2004-11-08 00:00:00','Shipped',NULL,121,'2004-11-05',4,11,2004), (10325,'S32_3207',28,'100.0000000',2,5377.4,'2004-11-05 00:00:00','2004-11-13 00:00:00','2004-11-08 00:00:00','Shipped',NULL,121,'2004-11-05',4,11,2004), (10325,'S50_1392',38,'100.0000000',4,5190.42,'2004-11-05 00:00:00','2004-11-13 00:00:00','2004-11-08 00:00:00','Shipped',NULL,121,'2004-11-05',4,11,2004), (10325,'S50_1514',44,'100.0000000',7,5932.96,'2004-11-05 00:00:00','2004-11-13 00:00:00','2004-11-08 00:00:00','Shipped',NULL,121,'2004-11-05',4,11,2004), (10326,'S18_3259',32,'100.0000000',6,3807.68,'2004-11-09 00:00:00','2004-11-16 00:00:00','2004-11-10 00:00:00','Shipped',NULL,144,'2004-11-09',4,11,2004), (10326,'S18_4522',50,'86.0100000',5,4300.5,'2004-11-09 00:00:00','2004-11-16 00:00:00','2004-11-10 00:00:00','Shipped',NULL,144,'2004-11-09',4,11,2004), (10326,'S24_2011',41,'100.0000000',4,4333.29,'2004-11-09 00:00:00','2004-11-16 00:00:00','2004-11-10 00:00:00','Shipped',NULL,144,'2004-11-09',4,11,2004), (10326,'S24_3151',41,'85.8500000',3,3519.85,'2004-11-09 00:00:00','2004-11-16 00:00:00','2004-11-10 00:00:00','Shipped',NULL,144,'2004-11-09',4,11,2004), (10326,'S24_3816',20,'92.2500000',2,1845,'2004-11-09 00:00:00','2004-11-16 00:00:00','2004-11-10 00:00:00','Shipped',NULL,144,'2004-11-09',4,11,2004), (10326,'S700_1138',39,'60.0000000',1,2340,'2004-11-09 00:00:00','2004-11-16 00:00:00','2004-11-10 00:00:00','Shipped',NULL,144,'2004-11-09',4,11,2004), (10327,'S18_1662',25,'100.0000000',6,2804.75,'2004-11-10 00:00:00','2004-11-19 00:00:00','2004-11-13 00:00:00','Resolved','Order was disputed and resolved on 12/1/04. The Sales Manager was involved. Customer claims the scales of the models don\'t match what was discussed.',145,'2004-11-10',4,11,2004), (10327,'S18_2581',45,'100.0000000',8,4781.7,'2004-11-10 00:00:00','2004-11-19 00:00:00','2004-11-13 00:00:00','Resolved','Order was disputed and resolved on 12/1/04. The Sales Manager was involved. Customer claims the scales of the models don\'t match what was discussed.',145,'2004-11-10',4,11,2004), (10327,'S18_3029',25,'45.8600000',5,1146.5,'2004-11-10 00:00:00','2004-11-19 00:00:00','2004-11-13 00:00:00','Resolved','Order was disputed and resolved on 12/1/04. The Sales Manager was involved. Customer claims the scales of the models don\'t match what was discussed.',145,'2004-11-10',4,11,2004), (10327,'S700_1938',20,'100.0000000',7,3469.2,'2004-11-10 00:00:00','2004-11-19 00:00:00','2004-11-13 00:00:00','Resolved','Order was disputed and resolved on 12/1/04. The Sales Manager was involved. Customer claims the scales of the models don\'t match what was discussed.',145,'2004-11-10',4,11,2004), (10327,'S700_2610',21,'96.3100000',1,2022.51,'2004-11-10 00:00:00','2004-11-19 00:00:00','2004-11-13 00:00:00','Resolved','Order was disputed and resolved on 12/1/04. The Sales Manager was involved. Customer claims the scales of the models don\'t match what was discussed.',145,'2004-11-10',4,11,2004), (10327,'S700_3505',43,'80.0000000',2,3440,'2004-11-10 00:00:00','2004-11-19 00:00:00','2004-11-13 00:00:00','Resolved','Order was disputed and resolved on 12/1/04. The Sales Manager was involved. Customer claims the scales of the models don\'t match what was discussed.',145,'2004-11-10',4,11,2004), (10327,'S700_3962',37,'86.6100000',3,3204.57,'2004-11-10 00:00:00','2004-11-19 00:00:00','2004-11-13 00:00:00','Resolved','Order was disputed and resolved on 12/1/04. The Sales Manager was involved. Customer claims the scales of the models don\'t match what was discussed.',145,'2004-11-10',4,11,2004), (10327,'S72_3212',37,'86.7400000',4,3209.38,'2004-11-10 00:00:00','2004-11-19 00:00:00','2004-11-13 00:00:00','Resolved','Order was disputed and resolved on 12/1/04. The Sales Manager was involved. Customer claims the scales of the models don\'t match what was discussed.',145,'2004-11-10',4,11,2004), (10328,'S18_3856',34,'100.0000000',6,3815.48,'2004-11-12 00:00:00','2004-11-21 00:00:00','2004-11-18 00:00:00','Shipped','Customer very concerned about the exact color of the models. There is high risk that he may dispute the order because there is a slight color mismatch',278,'2004-11-12',4,11,2004), (10328,'S24_1785',47,'87.5400000',14,4114.38,'2004-11-12 00:00:00','2004-11-21 00:00:00','2004-11-18 00:00:00','Shipped','Customer very concerned about the exact color of the models. There is high risk that he may dispute the order because there is a slight color mismatch',278,'2004-11-12',4,11,2004), (10328,'S24_2841',48,'58.9200000',1,2828.16,'2004-11-12 00:00:00','2004-11-21 00:00:00','2004-11-18 00:00:00','Shipped','Customer very concerned about the exact color of the models. There is high risk that he may dispute the order because there is a slight color mismatch',278,'2004-11-12',4,11,2004), (10328,'S24_3420',20,'72.9800000',2,1459.6,'2004-11-12 00:00:00','2004-11-21 00:00:00','2004-11-18 00:00:00','Shipped','Customer very concerned about the exact color of the models. There is high risk that he may dispute the order because there is a slight color mismatch',278,'2004-11-12',4,11,2004), (10328,'S24_3949',35,'76.4300000',3,2675.05,'2004-11-12 00:00:00','2004-11-21 00:00:00','2004-11-18 00:00:00','Shipped','Customer very concerned about the exact color of the models. There is high risk that he may dispute the order because there is a slight color mismatch',278,'2004-11-12',4,11,2004), (10328,'S24_4278',43,'60.8600000',4,2616.98,'2004-11-12 00:00:00','2004-11-21 00:00:00','2004-11-18 00:00:00','Shipped','Customer very concerned about the exact color of the models. There is high risk that he may dispute the order because there is a slight color mismatch',278,'2004-11-12',4,11,2004), (10328,'S32_4289',24,'81.1700000',5,1948.08,'2004-11-12 00:00:00','2004-11-21 00:00:00','2004-11-18 00:00:00','Shipped','Customer very concerned about the exact color of the models. There is high risk that he may dispute the order because there is a slight color mismatch',278,'2004-11-12',4,11,2004), (10328,'S50_1341',34,'51.9300000',7,1765.62,'2004-11-12 00:00:00','2004-11-21 00:00:00','2004-11-18 00:00:00','Shipped','Customer very concerned about the exact color of the models. There is high risk that he may dispute the order because there is a slight color mismatch',278,'2004-11-12',4,11,2004), (10328,'S700_1691',27,'100.0000000',8,2762.1,'2004-11-12 00:00:00','2004-11-21 00:00:00','2004-11-18 00:00:00','Shipped','Customer very concerned about the exact color of the models. There is high risk that he may dispute the order because there is a slight color mismatch',278,'2004-11-12',4,11,2004), (10328,'S700_2047',41,'100.0000000',9,4156.58,'2004-11-12 00:00:00','2004-11-21 00:00:00','2004-11-18 00:00:00','Shipped','Customer very concerned about the exact color of the models. There is high risk that he may dispute the order because there is a slight color mismatch',278,'2004-11-12',4,11,2004), (10328,'S700_2466',37,'100.0000000',10,4021.53,'2004-11-12 00:00:00','2004-11-21 00:00:00','2004-11-18 00:00:00','Shipped','Customer very concerned about the exact color of the models. There is high risk that he may dispute the order because there is a slight color mismatch',278,'2004-11-12',4,11,2004), (10328,'S700_2834',33,'100.0000000',11,4072.2,'2004-11-12 00:00:00','2004-11-21 00:00:00','2004-11-18 00:00:00','Shipped','Customer very concerned about the exact color of the models. There is high risk that he may dispute the order because there is a slight color mismatch',278,'2004-11-12',4,11,2004), (10328,'S700_3167',33,'64.0000000',13,2112,'2004-11-12 00:00:00','2004-11-21 00:00:00','2004-11-18 00:00:00','Shipped','Customer very concerned about the exact color of the models. There is high risk that he may dispute the order because there is a slight color mismatch',278,'2004-11-12',4,11,2004), (10328,'S700_4002',39,'85.8700000',12,3348.93,'2004-11-12 00:00:00','2004-11-21 00:00:00','2004-11-18 00:00:00','Shipped','Customer very concerned about the exact color of the models. There is high risk that he may dispute the order because there is a slight color mismatch',278,'2004-11-12',4,11,2004), (10329,'S10_1678',42,'100.0000000',1,4396.14,'2004-11-15 00:00:00','2004-11-24 00:00:00','2004-11-16 00:00:00','Shipped',NULL,131,'2004-11-15',4,11,2004), (10329,'S10_2016',20,'100.0000000',2,3176,'2004-11-15 00:00:00','2004-11-24 00:00:00','2004-11-16 00:00:00','Shipped',NULL,131,'2004-11-15',4,11,2004), (10329,'S10_4698',26,'100.0000000',3,5868.2,'2004-11-15 00:00:00','2004-11-24 00:00:00','2004-11-16 00:00:00','Shipped',NULL,131,'2004-11-15',4,11,2004), (10329,'S12_1099',41,'71.4700000',5,2930.27,'2004-11-15 00:00:00','2004-11-24 00:00:00','2004-11-16 00:00:00','Shipped',NULL,131,'2004-11-15',4,11,2004), (10329,'S12_2823',24,'100.0000000',6,3542.64,'2004-11-15 00:00:00','2004-11-24 00:00:00','2004-11-16 00:00:00','Shipped',NULL,131,'2004-11-15',4,11,2004), (10329,'S12_3380',46,'83.6300000',13,3846.98,'2004-11-15 00:00:00','2004-11-24 00:00:00','2004-11-16 00:00:00','Shipped',NULL,131,'2004-11-15',4,11,2004), (10329,'S12_3990',33,'100.0000000',14,3607.56,'2004-11-15 00:00:00','2004-11-24 00:00:00','2004-11-16 00:00:00','Shipped',NULL,131,'2004-11-15',4,11,2004), (10329,'S12_4675',39,'64.7400000',15,2524.86,'2004-11-15 00:00:00','2004-11-24 00:00:00','2004-11-16 00:00:00','Shipped',NULL,131,'2004-11-15',4,11,2004), (10329,'S18_1889',29,'100.0000000',9,2954.81,'2004-11-15 00:00:00','2004-11-24 00:00:00','2004-11-16 00:00:00','Shipped',NULL,131,'2004-11-15',4,11,2004), (10329,'S18_2625',38,'100.0000000',12,5266.04,'2004-11-15 00:00:00','2004-11-24 00:00:00','2004-11-16 00:00:00','Shipped',NULL,131,'2004-11-15',4,11,2004), (10329,'S18_3278',38,'59.1000000',10,2245.8,'2004-11-15 00:00:00','2004-11-24 00:00:00','2004-11-16 00:00:00','Shipped',NULL,131,'2004-11-15',4,11,2004), (10329,'S24_1578',30,'87.7800000',7,2633.4,'2004-11-15 00:00:00','2004-11-24 00:00:00','2004-11-16 00:00:00','Shipped',NULL,131,'2004-11-15',4,11,2004), (10329,'S24_2000',37,'94.4300000',4,3493.91,'2004-11-15 00:00:00','2004-11-24 00:00:00','2004-11-16 00:00:00','Shipped',NULL,131,'2004-11-15',4,11,2004), (10329,'S32_1374',45,'63.9100000',11,2875.95,'2004-11-15 00:00:00','2004-11-24 00:00:00','2004-11-16 00:00:00','Shipped',NULL,131,'2004-11-15',4,11,2004), (10329,'S72_1253',44,'86.1300000',8,3789.72,'2004-11-15 00:00:00','2004-11-24 00:00:00','2004-11-16 00:00:00','Shipped',NULL,131,'2004-11-15',4,11,2004), (10330,'S18_3482',37,'100.0000000',3,4405.22,'2004-11-16 00:00:00','2004-11-25 00:00:00','2004-11-21 00:00:00','Shipped',NULL,385,'2004-11-16',4,11,2004), (10330,'S18_3782',29,'69.6300000',2,2019.27,'2004-11-16 00:00:00','2004-11-25 00:00:00','2004-11-21 00:00:00','Shipped',NULL,385,'2004-11-16',4,11,2004), (10330,'S18_4721',50,'100.0000000',4,6101,'2004-11-16 00:00:00','2004-11-25 00:00:00','2004-11-21 00:00:00','Shipped',NULL,385,'2004-11-16',4,11,2004), (10330,'S24_2360',42,'81.0300000',1,3403.26,'2004-11-16 00:00:00','2004-11-25 00:00:00','2004-11-21 00:00:00','Shipped',NULL,385,'2004-11-16',4,11,2004), (10331,'S18_1129',46,'100.0000000',6,6434.02,'2004-11-17 00:00:00','2004-11-23 00:00:00','2004-11-23 00:00:00','Shipped','Customer requested special shippment. The instructions were passed along to the warehouse',486,'2004-11-17',4,11,2004), (10331,'S18_1589',44,'100.0000000',14,4849.24,'2004-11-17 00:00:00','2004-11-23 00:00:00','2004-11-23 00:00:00','Shipped','Customer requested special shippment. The instructions were passed along to the warehouse',486,'2004-11-17',4,11,2004), (10331,'S18_1749',44,'74.0400000',7,3257.76,'2004-11-17 00:00:00','2004-11-23 00:00:00','2004-11-23 00:00:00','Shipped','Customer requested special shippment. The instructions were passed along to the warehouse',486,'2004-11-17',4,11,2004), (10331,'S18_1984',30,'32.4700000',8,974.1,'2004-11-17 00:00:00','2004-11-23 00:00:00','2004-11-23 00:00:00','Shipped','Customer requested special shippment. The instructions were passed along to the warehouse',486,'2004-11-17',4,11,2004), (10331,'S18_2870',26,'64.9000000',10,1687.4,'2004-11-17 00:00:00','2004-11-23 00:00:00','2004-11-23 00:00:00','Shipped','Customer requested special shippment. The instructions were passed along to the warehouse',486,'2004-11-17',4,11,2004), (10331,'S18_3232',27,'100.0000000',11,4170.69,'2004-11-17 00:00:00','2004-11-23 00:00:00','2004-11-23 00:00:00','Shipped','Customer requested special shippment. The instructions were passed along to the warehouse',486,'2004-11-17',4,11,2004), (10331,'S18_3685',26,'67.9100000',12,1765.66,'2004-11-17 00:00:00','2004-11-23 00:00:00','2004-11-23 00:00:00','Shipped','Customer requested special shippment. The instructions were passed along to the warehouse',486,'2004-11-17',4,11,2004), (10331,'S24_2972',27,'42.2400000',13,1140.48,'2004-11-17 00:00:00','2004-11-23 00:00:00','2004-11-23 00:00:00','Shipped','Customer requested special shippment. The instructions were passed along to the warehouse',486,'2004-11-17',4,11,2004), (10331,'S24_3371',25,'100.0000000',9,3078.5,'2004-11-17 00:00:00','2004-11-23 00:00:00','2004-11-23 00:00:00','Shipped','Customer requested special shippment. The instructions were passed along to the warehouse',486,'2004-11-17',4,11,2004), (10331,'S24_3856',21,'100.0000000',1,3135.93,'2004-11-17 00:00:00','2004-11-23 00:00:00','2004-11-23 00:00:00','Shipped','Customer requested special shippment. The instructions were passed along to the warehouse',486,'2004-11-17',4,11,2004); INSERT INTO `orderfact` (`ORDERNUMBER`,`PRODUCTCODE`,`QUANTITYORDERED`,`PRICEEACH`,`ORDERLINENUMBER`,`TOTALPRICE`,`ORDERDATE`,`REQUIREDDATE`,`SHIPPEDDATE`,`STATUS`,`COMMENTS`,`CUSTOMERNUMBER`,`TIME_ID`,`QTR_ID`,`MONTH_ID`,`YEAR_ID`) VALUES (10331,'S24_4620',41,'100.0000000',2,5715.4,'2004-11-17 00:00:00','2004-11-23 00:00:00','2004-11-23 00:00:00','Shipped','Customer requested special shippment. The instructions were passed along to the warehouse',486,'2004-11-17',4,11,2004), (10331,'S32_2206',28,'100.0000000',3,4102.56,'2004-11-17 00:00:00','2004-11-23 00:00:00','2004-11-23 00:00:00','Shipped','Customer requested special shippment. The instructions were passed along to the warehouse',486,'2004-11-17',4,11,2004), (10331,'S32_4485',32,'100.0000000',4,5026.56,'2004-11-17 00:00:00','2004-11-23 00:00:00','2004-11-23 00:00:00','Shipped','Customer requested special shippment. The instructions were passed along to the warehouse',486,'2004-11-17',4,11,2004), (10331,'S50_4713',20,'100.0000000',5,3657.8,'2004-11-17 00:00:00','2004-11-23 00:00:00','2004-11-23 00:00:00','Shipped','Customer requested special shippment. The instructions were passed along to the warehouse',486,'2004-11-17',4,11,2004), (10332,'S18_1342',46,'95.1300000',15,4375.98,'2004-11-17 00:00:00','2004-11-25 00:00:00','2004-11-18 00:00:00','Shipped',NULL,187,'2004-11-17',4,11,2004), (10332,'S18_1367',27,'89.8900000',16,2427.03,'2004-11-17 00:00:00','2004-11-25 00:00:00','2004-11-18 00:00:00','Shipped',NULL,187,'2004-11-17',4,11,2004), (10332,'S18_2248',38,'84.2500000',9,3201.5,'2004-11-17 00:00:00','2004-11-25 00:00:00','2004-11-18 00:00:00','Shipped',NULL,187,'2004-11-17',4,11,2004), (10332,'S18_2325',35,'64.6900000',8,2264.15,'2004-11-17 00:00:00','2004-11-25 00:00:00','2004-11-18 00:00:00','Shipped',NULL,187,'2004-11-17',4,11,2004), (10332,'S18_2795',24,'52.6700000',1,1264.08,'2004-11-17 00:00:00','2004-11-25 00:00:00','2004-11-18 00:00:00','Shipped',NULL,187,'2004-11-17',4,11,2004), (10332,'S18_2957',26,'100.0000000',17,2979.08,'2004-11-17 00:00:00','2004-11-25 00:00:00','2004-11-18 00:00:00','Shipped',NULL,187,'2004-11-17',4,11,2004), (10332,'S18_3136',40,'39.8000000',18,1592,'2004-11-17 00:00:00','2004-11-25 00:00:00','2004-11-18 00:00:00','Shipped',NULL,187,'2004-11-17',4,11,2004), (10332,'S18_4409',50,'100.0000000',2,7310,'2004-11-17 00:00:00','2004-11-25 00:00:00','2004-11-18 00:00:00','Shipped',NULL,187,'2004-11-17',4,11,2004), (10332,'S18_4933',21,'100.0000000',3,3472.98,'2004-11-17 00:00:00','2004-11-25 00:00:00','2004-11-18 00:00:00','Shipped',NULL,187,'2004-11-17',4,11,2004), (10332,'S24_1046',23,'56.8400000',4,1307.32,'2004-11-17 00:00:00','2004-11-25 00:00:00','2004-11-18 00:00:00','Shipped',NULL,187,'2004-11-17',4,11,2004), (10332,'S24_1628',20,'87.9600000',5,1759.2,'2004-11-17 00:00:00','2004-11-25 00:00:00','2004-11-18 00:00:00','Shipped',NULL,187,'2004-11-17',4,11,2004), (10332,'S24_1937',45,'81.9100000',6,3685.95,'2004-11-17 00:00:00','2004-11-25 00:00:00','2004-11-18 00:00:00','Shipped',NULL,187,'2004-11-17',4,11,2004), (10332,'S24_2022',26,'85.5200000',10,2223.52,'2004-11-17 00:00:00','2004-11-25 00:00:00','2004-11-18 00:00:00','Shipped',NULL,187,'2004-11-17',4,11,2004), (10332,'S24_2766',39,'86.7200000',7,3382.08,'2004-11-17 00:00:00','2004-11-25 00:00:00','2004-11-18 00:00:00','Shipped',NULL,187,'2004-11-17',4,11,2004), (10332,'S24_2887',44,'42.2600000',11,1859.44,'2004-11-17 00:00:00','2004-11-25 00:00:00','2004-11-18 00:00:00','Shipped',NULL,187,'2004-11-17',4,11,2004), (10332,'S24_3191',45,'34.1900000',12,1538.55,'2004-11-17 00:00:00','2004-11-25 00:00:00','2004-11-18 00:00:00','Shipped',NULL,187,'2004-11-17',4,11,2004), (10332,'S24_3432',31,'37.1800000',13,1152.58,'2004-11-17 00:00:00','2004-11-25 00:00:00','2004-11-18 00:00:00','Shipped',NULL,187,'2004-11-17',4,11,2004), (10332,'S24_3969',41,'77.2400000',14,3166.84,'2004-11-17 00:00:00','2004-11-25 00:00:00','2004-11-18 00:00:00','Shipped',NULL,187,'2004-11-17',4,11,2004), (10333,'S10_1949',26,'100.0000000',3,3003,'2004-11-18 00:00:00','2004-11-27 00:00:00','2004-11-20 00:00:00','Shipped',NULL,129,'2004-11-18',4,11,2004), (10333,'S12_1666',33,'99.2100000',6,3273.93,'2004-11-18 00:00:00','2004-11-27 00:00:00','2004-11-20 00:00:00','Shipped',NULL,129,'2004-11-18',4,11,2004), (10333,'S18_1097',29,'40.2500000',7,1167.25,'2004-11-18 00:00:00','2004-11-27 00:00:00','2004-11-20 00:00:00','Shipped',NULL,129,'2004-11-18',4,11,2004), (10333,'S18_2949',31,'90.1700000',5,2795.27,'2004-11-18 00:00:00','2004-11-27 00:00:00','2004-11-20 00:00:00','Shipped',NULL,129,'2004-11-18',4,11,2004), (10333,'S18_3320',46,'100.0000000',2,11336.7,'2004-11-18 00:00:00','2004-11-27 00:00:00','2004-11-20 00:00:00','Shipped',NULL,129,'2004-11-18',4,11,2004), (10333,'S18_4668',24,'79.8600000',8,1916.64,'2004-11-18 00:00:00','2004-11-27 00:00:00','2004-11-20 00:00:00','Shipped',NULL,129,'2004-11-18',4,11,2004), (10333,'S24_4258',39,'100.0000000',1,4424.16,'2004-11-18 00:00:00','2004-11-27 00:00:00','2004-11-20 00:00:00','Shipped',NULL,129,'2004-11-18',4,11,2004), (10333,'S32_3522',33,'73.6900000',4,2431.77,'2004-11-18 00:00:00','2004-11-27 00:00:00','2004-11-20 00:00:00','Shipped',NULL,129,'2004-11-18',4,11,2004), (10334,'S10_4962',26,'100.0000000',2,3188.12,'2004-11-19 00:00:00','2004-11-28 00:00:00','2006-08-23 11:51:49','On Hold','The outstaniding balance for this customer exceeds their credit limit. Order will be shipped when a payment is received.',144,'2004-11-19',4,11,2004), (10334,'S18_2319',46,'100.0000000',6,5814.86,'2004-11-19 00:00:00','2004-11-28 00:00:00','2006-08-23 11:51:49','On Hold','The outstaniding balance for this customer exceeds their credit limit. Order will be shipped when a payment is received.',144,'2004-11-19',4,11,2004), (10334,'S18_2432',34,'61.3800000',1,2086.92,'2004-11-19 00:00:00','2004-11-28 00:00:00','2006-08-23 11:51:49','On Hold','The outstaniding balance for this customer exceeds their credit limit. Order will be shipped when a payment is received.',144,'2004-11-19',4,11,2004), (10334,'S18_3232',20,'100.0000000',3,2878.8,'2004-11-19 00:00:00','2004-11-28 00:00:00','2006-08-23 11:51:49','On Hold','The outstaniding balance for this customer exceeds their credit limit. Order will be shipped when a payment is received.',144,'2004-11-19',4,11,2004), (10334,'S18_4600',49,'100.0000000',4,6763.47,'2004-11-19 00:00:00','2004-11-28 00:00:00','2006-08-23 11:51:49','On Hold','The outstaniding balance for this customer exceeds their credit limit. Order will be shipped when a payment is received.',144,'2004-11-19',4,11,2004), (10334,'S24_2300',42,'100.0000000',5,5528.04,'2004-11-19 00:00:00','2004-11-28 00:00:00','2006-08-23 11:51:49','On Hold','The outstaniding balance for this customer exceeds their credit limit. Order will be shipped when a payment is received.',144,'2004-11-19',4,11,2004), (10335,'S24_2840',33,'37.1300000',2,1225.29,'2004-11-19 00:00:00','2004-11-29 00:00:00','2004-11-23 00:00:00','Shipped',NULL,124,'2004-11-19',4,11,2004), (10335,'S32_1268',44,'100.0000000',1,4746.28,'2004-11-19 00:00:00','2004-11-29 00:00:00','2004-11-23 00:00:00','Shipped',NULL,124,'2004-11-19',4,11,2004), (10335,'S32_2509',40,'60.6000000',3,2424,'2004-11-19 00:00:00','2004-11-29 00:00:00','2004-11-23 00:00:00','Shipped',NULL,124,'2004-11-19',4,11,2004), (10336,'S12_1108',33,'57.2200000',10,1888.26,'2004-11-20 00:00:00','2004-11-26 00:00:00','2004-11-24 00:00:00','Shipped','Customer requested that DHL is used for this shipping',172,'2004-11-20',4,11,2004), (10336,'S12_3148',33,'100.0000000',11,4059.33,'2004-11-20 00:00:00','2004-11-26 00:00:00','2004-11-24 00:00:00','Shipped','Customer requested that DHL is used for this shipping',172,'2004-11-20',4,11,2004), (10336,'S12_3891',49,'63.3800000',1,3105.62,'2004-11-20 00:00:00','2004-11-26 00:00:00','2004-11-24 00:00:00','Shipped','Customer requested that DHL is used for this shipping',172,'2004-11-20',4,11,2004), (10336,'S12_4473',38,'100.0000000',3,6372.6,'2004-11-20 00:00:00','2004-11-26 00:00:00','2004-11-24 00:00:00','Shipped','Customer requested that DHL is used for this shipping',172,'2004-11-20',4,11,2004), (10336,'S18_2238',49,'100.0000000',6,7460.74,'2004-11-20 00:00:00','2004-11-26 00:00:00','2004-11-24 00:00:00','Shipped','Customer requested that DHL is used for this shipping',172,'2004-11-20',4,11,2004), (10336,'S18_3140',48,'100.0000000',12,5778.24,'2004-11-20 00:00:00','2004-11-26 00:00:00','2004-11-24 00:00:00','Shipped','Customer requested that DHL is used for this shipping',172,'2004-11-20',4,11,2004), (10336,'S18_3259',21,'100.0000000',7,2230.41,'2004-11-20 00:00:00','2004-11-26 00:00:00','2004-11-24 00:00:00','Shipped','Customer requested that DHL is used for this shipping',172,'2004-11-20',4,11,2004), (10336,'S24_1444',45,'100.0000000',4,5972.4,'2004-11-20 00:00:00','2004-11-26 00:00:00','2004-11-24 00:00:00','Shipped','Customer requested that DHL is used for this shipping',172,'2004-11-20',4,11,2004), (10336,'S24_4048',31,'100.0000000',5,4618.69,'2004-11-20 00:00:00','2004-11-26 00:00:00','2004-11-24 00:00:00','Shipped','Customer requested that DHL is used for this shipping',172,'2004-11-20',4,11,2004), (10336,'S32_3207',31,'84.7100000',9,2626.01,'2004-11-20 00:00:00','2004-11-26 00:00:00','2004-11-24 00:00:00','Shipped','Customer requested that DHL is used for this shipping',172,'2004-11-20',4,11,2004), (10336,'S50_1392',23,'100.0000000',8,3141.57,'2004-11-20 00:00:00','2004-11-26 00:00:00','2004-11-24 00:00:00','Shipped','Customer requested that DHL is used for this shipping',172,'2004-11-20',4,11,2004), (10336,'S700_2824',46,'100.0000000',2,9558.8,'2004-11-20 00:00:00','2004-11-26 00:00:00','2004-11-24 00:00:00','Shipped','Customer requested that DHL is used for this shipping',172,'2004-11-20',4,11,2004), (10337,'S10_4757',25,'48.0500000',8,1201.25,'2004-11-21 00:00:00','2004-11-30 00:00:00','2004-11-26 00:00:00','Shipped',NULL,424,'2004-11-21',4,11,2004), (10337,'S18_4027',36,'100.0000000',3,5679.36,'2004-11-21 00:00:00','2004-11-30 00:00:00','2004-11-26 00:00:00','Shipped',NULL,424,'2004-11-21',4,11,2004), (10337,'S18_4522',29,'100.0000000',2,4498.19,'2004-11-21 00:00:00','2004-11-30 00:00:00','2004-11-26 00:00:00','Shipped',NULL,424,'2004-11-21',4,11,2004), (10337,'S24_2011',29,'71.9700000',4,2087.13,'2004-11-21 00:00:00','2004-11-30 00:00:00','2004-11-26 00:00:00','Shipped',NULL,424,'2004-11-21',4,11,2004), (10337,'S50_1514',21,'100.0000000',6,2296.77,'2004-11-21 00:00:00','2004-11-30 00:00:00','2004-11-26 00:00:00','Shipped',NULL,424,'2004-11-21',4,11,2004), (10337,'S700_1938',36,'70.3000000',9,2530.8,'2004-11-21 00:00:00','2004-11-30 00:00:00','2004-11-26 00:00:00','Shipped',NULL,424,'2004-11-21',4,11,2004), (10337,'S700_3505',31,'89.3800000',1,2770.78,'2004-11-21 00:00:00','2004-11-30 00:00:00','2004-11-26 00:00:00','Shipped',NULL,424,'2004-11-21',4,11,2004), (10337,'S700_3962',36,'71.8900000',7,2588.04,'2004-11-21 00:00:00','2004-11-30 00:00:00','2004-11-26 00:00:00','Shipped',NULL,424,'2004-11-21',4,11,2004), (10337,'S72_3212',42,'97.1600000',5,4080.72,'2004-11-21 00:00:00','2004-11-30 00:00:00','2004-11-26 00:00:00','Shipped',NULL,424,'2004-11-21',4,11,2004), (10338,'S18_1662',41,'100.0000000',1,5624.79,'2004-11-22 00:00:00','2004-12-02 00:00:00','2004-11-27 00:00:00','Shipped',NULL,381,'2004-11-22',4,11,2004), (10338,'S18_3029',28,'82.5800000',3,2312.24,'2004-11-22 00:00:00','2004-12-02 00:00:00','2004-11-27 00:00:00','Shipped',NULL,381,'2004-11-22',4,11,2004), (10338,'S18_3856',45,'100.0000000',2,5526.45,'2004-11-22 00:00:00','2004-12-02 00:00:00','2004-11-27 00:00:00','Shipped',NULL,381,'2004-11-22',4,11,2004), (10339,'S10_2016',40,'68.9200000',4,2756.8,'2004-11-23 00:00:00','2004-11-30 00:00:00','2004-11-30 00:00:00','Shipped',NULL,398,'2004-11-23',4,11,2004), (10339,'S10_4698',39,'76.6700000',3,2990.13,'2004-11-23 00:00:00','2004-11-30 00:00:00','2004-11-30 00:00:00','Shipped',NULL,398,'2004-11-23',4,11,2004), (10339,'S18_2581',27,'100.0000000',2,2810.7,'2004-11-23 00:00:00','2004-11-30 00:00:00','2004-11-30 00:00:00','Shipped',NULL,398,'2004-11-23',4,11,2004), (10339,'S18_2625',30,'62.1600000',1,1864.8,'2004-11-23 00:00:00','2004-11-30 00:00:00','2004-11-30 00:00:00','Shipped',NULL,398,'2004-11-23',4,11,2004), (10339,'S24_1578',27,'84.3900000',10,2278.53,'2004-11-23 00:00:00','2004-11-30 00:00:00','2004-11-30 00:00:00','Shipped',NULL,398,'2004-11-23',4,11,2004), (10339,'S24_1785',21,'50.6500000',7,1063.65,'2004-11-23 00:00:00','2004-11-30 00:00:00','2004-11-30 00:00:00','Shipped',NULL,398,'2004-11-23',4,11,2004), (10339,'S24_2841',55,'100.0000000',12,6214.45,'2004-11-23 00:00:00','2004-11-30 00:00:00','2004-11-30 00:00:00','Shipped',NULL,398,'2004-11-23',4,11,2004), (10339,'S24_3151',55,'100.0000000',13,10758,'2004-11-23 00:00:00','2004-11-30 00:00:00','2004-11-30 00:00:00','Shipped',NULL,398,'2004-11-23',4,11,2004), (10339,'S24_3420',29,'99.6900000',14,2891.01,'2004-11-23 00:00:00','2004-11-30 00:00:00','2004-11-30 00:00:00','Shipped',NULL,398,'2004-11-23',4,11,2004), (10339,'S24_3816',42,'59.3600000',16,2493.12,'2004-11-23 00:00:00','2004-11-30 00:00:00','2004-11-30 00:00:00','Shipped',NULL,398,'2004-11-23',4,11,2004), (10339,'S24_3949',45,'96.9200000',11,4361.4,'2004-11-23 00:00:00','2004-11-30 00:00:00','2004-11-30 00:00:00','Shipped',NULL,398,'2004-11-23',4,11,2004), (10339,'S700_1138',22,'100.0000000',5,2816.44,'2004-11-23 00:00:00','2004-11-30 00:00:00','2004-11-30 00:00:00','Shipped',NULL,398,'2004-11-23',4,11,2004), (10339,'S700_2047',55,'71.2500000',15,3918.75,'2004-11-23 00:00:00','2004-11-30 00:00:00','2004-11-30 00:00:00','Shipped',NULL,398,'2004-11-23',4,11,2004), (10339,'S700_2610',50,'74.3500000',9,3717.5,'2004-11-23 00:00:00','2004-11-30 00:00:00','2004-11-30 00:00:00','Shipped',NULL,398,'2004-11-23',4,11,2004), (10339,'S700_4002',50,'57.8600000',8,2893,'2004-11-23 00:00:00','2004-11-30 00:00:00','2004-11-30 00:00:00','Shipped',NULL,398,'2004-11-23',4,11,2004), (10339,'S72_1253',27,'76.3100000',6,2060.37,'2004-11-23 00:00:00','2004-11-30 00:00:00','2004-11-30 00:00:00','Shipped',NULL,398,'2004-11-23',4,11,2004), (10340,'S24_2000',55,'79.9800000',8,4398.9,'2004-11-24 00:00:00','2004-12-01 00:00:00','2004-11-25 00:00:00','Shipped','Customer is interested in buying more Ferrari models',216,'2004-11-24',4,11,2004), (10340,'S24_4278',40,'84.7700000',1,3390.8,'2004-11-24 00:00:00','2004-12-01 00:00:00','2004-11-25 00:00:00','Shipped','Customer is interested in buying more Ferrari models',216,'2004-11-24',4,11,2004), (10340,'S32_1374',55,'100.0000000',2,6482.85,'2004-11-24 00:00:00','2004-12-01 00:00:00','2004-11-25 00:00:00','Shipped','Customer is interested in buying more Ferrari models',216,'2004-11-24',4,11,2004), (10340,'S32_4289',39,'59.1600000',3,2307.24,'2004-11-24 00:00:00','2004-12-01 00:00:00','2004-11-25 00:00:00','Shipped','Customer is interested in buying more Ferrari models',216,'2004-11-24',4,11,2004), (10340,'S50_1341',40,'50.6200000',4,2024.8,'2004-11-24 00:00:00','2004-12-01 00:00:00','2004-11-25 00:00:00','Shipped','Customer is interested in buying more Ferrari models',216,'2004-11-24',4,11,2004), (10340,'S700_1691',30,'88.6000000',5,2658,'2004-11-24 00:00:00','2004-12-01 00:00:00','2004-11-25 00:00:00','Shipped','Customer is interested in buying more Ferrari models',216,'2004-11-24',4,11,2004), (10340,'S700_2466',55,'87.7500000',7,4826.25,'2004-11-24 00:00:00','2004-12-01 00:00:00','2004-11-25 00:00:00','Shipped','Customer is interested in buying more Ferrari models',216,'2004-11-24',4,11,2004), (10340,'S700_2834',29,'100.0000000',6,4094.51,'2004-11-24 00:00:00','2004-12-01 00:00:00','2004-11-25 00:00:00','Shipped','Customer is interested in buying more Ferrari models',216,'2004-11-24',4,11,2004), (10341,'S10_1678',41,'100.0000000',9,7737.93,'2004-11-24 00:00:00','2004-12-01 00:00:00','2004-11-29 00:00:00','Shipped',NULL,382,'2004-11-24',4,11,2004), (10341,'S12_1099',45,'79.6500000',2,3584.25,'2004-11-24 00:00:00','2004-12-01 00:00:00','2004-11-29 00:00:00','Shipped',NULL,382,'2004-11-24',4,11,2004), (10341,'S12_2823',55,'100.0000000',8,8118.55,'2004-11-24 00:00:00','2004-12-01 00:00:00','2004-11-29 00:00:00','Shipped',NULL,382,'2004-11-24',4,11,2004), (10341,'S12_3380',44,'95.9300000',1,4220.92,'2004-11-24 00:00:00','2004-12-01 00:00:00','2004-11-29 00:00:00','Shipped',NULL,382,'2004-11-24',4,11,2004), (10341,'S12_3990',36,'93.5600000',10,3368.16,'2004-11-24 00:00:00','2004-12-01 00:00:00','2004-11-29 00:00:00','Shipped',NULL,382,'2004-11-24',4,11,2004), (10341,'S12_4675',55,'75.2000000',7,4136,'2004-11-24 00:00:00','2004-12-01 00:00:00','2004-11-29 00:00:00','Shipped',NULL,382,'2004-11-24',4,11,2004), (10341,'S24_2360',32,'100.0000000',6,3307.2,'2004-11-24 00:00:00','2004-12-01 00:00:00','2004-11-29 00:00:00','Shipped',NULL,382,'2004-11-24',4,11,2004), (10341,'S32_4485',31,'71.0200000',4,2201.62,'2004-11-24 00:00:00','2004-12-01 00:00:00','2004-11-29 00:00:00','Shipped',NULL,382,'2004-11-24',4,11,2004), (10341,'S50_4713',38,'100.0000000',3,4682.36,'2004-11-24 00:00:00','2004-12-01 00:00:00','2004-11-29 00:00:00','Shipped',NULL,382,'2004-11-24',4,11,2004), (10341,'S700_3167',34,'100.0000000',5,3644.12,'2004-11-24 00:00:00','2004-12-01 00:00:00','2004-11-29 00:00:00','Shipped',NULL,382,'2004-11-24',4,11,2004), (10342,'S18_1129',40,'100.0000000',2,6454.4,'2004-11-24 00:00:00','2004-12-01 00:00:00','2004-11-29 00:00:00','Shipped',NULL,114,'2004-11-24',4,11,2004), (10342,'S18_1889',55,'65.4500000',1,3599.75,'2004-11-24 00:00:00','2004-12-01 00:00:00','2004-11-29 00:00:00','Shipped',NULL,114,'2004-11-24',4,11,2004), (10342,'S18_1984',22,'100.0000000',3,3160.74,'2004-11-24 00:00:00','2004-12-01 00:00:00','2004-11-29 00:00:00','Shipped',NULL,114,'2004-11-24',4,11,2004), (10342,'S18_3232',30,'100.0000000',4,5029.5,'2004-11-24 00:00:00','2004-12-01 00:00:00','2004-11-29 00:00:00','Shipped',NULL,114,'2004-11-24',4,11,2004), (10342,'S18_3278',25,'66.7400000',5,1668.5,'2004-11-24 00:00:00','2004-12-01 00:00:00','2004-11-29 00:00:00','Shipped',NULL,114,'2004-11-24',4,11,2004), (10342,'S18_3482',55,'100.0000000',7,6548.3,'2004-11-24 00:00:00','2004-12-01 00:00:00','2004-11-29 00:00:00','Shipped',NULL,114,'2004-11-24',4,11,2004), (10342,'S18_3782',26,'55.9500000',8,1454.7,'2004-11-24 00:00:00','2004-12-01 00:00:00','2004-11-29 00:00:00','Shipped',NULL,114,'2004-11-24',4,11,2004), (10342,'S18_4721',38,'100.0000000',11,6276.46,'2004-11-24 00:00:00','2004-12-01 00:00:00','2004-11-29 00:00:00','Shipped',NULL,114,'2004-11-24',4,11,2004), (10342,'S24_2972',39,'40.4000000',9,1575.6,'2004-11-24 00:00:00','2004-12-01 00:00:00','2004-11-29 00:00:00','Shipped',NULL,114,'2004-11-24',4,11,2004), (10342,'S24_3371',48,'62.4500000',10,2997.6,'2004-11-24 00:00:00','2004-12-01 00:00:00','2004-11-29 00:00:00','Shipped',NULL,114,'2004-11-24',4,11,2004), (10342,'S24_3856',42,'100.0000000',6,5013.54,'2004-11-24 00:00:00','2004-12-01 00:00:00','2004-11-29 00:00:00','Shipped',NULL,114,'2004-11-24',4,11,2004), (10343,'S18_1589',36,'100.0000000',4,5848.92,'2004-11-24 00:00:00','2004-12-01 00:00:00','2004-11-26 00:00:00','Shipped',NULL,353,'2004-11-24',4,11,2004), (10343,'S18_2870',25,'52.3200000',3,1308,'2004-11-24 00:00:00','2004-12-01 00:00:00','2004-11-26 00:00:00','Shipped',NULL,353,'2004-11-24',4,11,2004), (10343,'S18_3685',44,'84.8800000',2,3734.72,'2004-11-24 00:00:00','2004-12-01 00:00:00','2004-11-26 00:00:00','Shipped',NULL,353,'2004-11-24',4,11,2004), (10343,'S24_1628',27,'36.2100000',6,977.67,'2004-11-24 00:00:00','2004-12-01 00:00:00','2004-11-26 00:00:00','Shipped',NULL,353,'2004-11-24',4,11,2004), (10343,'S24_4620',30,'100.0000000',1,3098.7,'2004-11-24 00:00:00','2004-12-01 00:00:00','2004-11-26 00:00:00','Shipped',NULL,353,'2004-11-24',4,11,2004), (10343,'S32_2206',29,'100.0000000',5,3713.16,'2004-11-24 00:00:00','2004-12-01 00:00:00','2004-11-26 00:00:00','Shipped',NULL,353,'2004-11-24',4,11,2004), (10344,'S18_1749',45,'100.0000000',1,7650,'2004-11-25 00:00:00','2004-12-02 00:00:00','2004-11-29 00:00:00','Shipped',NULL,350,'2004-11-25',4,11,2004), (10344,'S18_2248',40,'56.9100000',2,2276.4,'2004-11-25 00:00:00','2004-12-02 00:00:00','2004-11-29 00:00:00','Shipped',NULL,350,'2004-11-25',4,11,2004), (10344,'S18_2325',30,'100.0000000',3,3928.2,'2004-11-25 00:00:00','2004-12-02 00:00:00','2004-11-29 00:00:00','Shipped',NULL,350,'2004-11-25',4,11,2004), (10344,'S18_4409',21,'100.0000000',4,2203.11,'2004-11-25 00:00:00','2004-12-02 00:00:00','2004-11-29 00:00:00','Shipped',NULL,350,'2004-11-25',4,11,2004), (10344,'S18_4933',26,'63.4300000',5,1649.18,'2004-11-25 00:00:00','2004-12-02 00:00:00','2004-11-29 00:00:00','Shipped',NULL,350,'2004-11-25',4,11,2004), (10344,'S24_1046',29,'59.5300000',7,1726.37,'2004-11-25 00:00:00','2004-12-02 00:00:00','2004-11-29 00:00:00','Shipped',NULL,350,'2004-11-25',4,11,2004), (10344,'S24_1937',20,'35.1800000',6,703.6,'2004-11-25 00:00:00','2004-12-02 00:00:00','2004-11-29 00:00:00','Shipped',NULL,350,'2004-11-25',4,11,2004), (10345,'S24_2022',43,'53.7600000',1,2311.68,'2004-11-25 00:00:00','2004-12-01 00:00:00','2004-11-26 00:00:00','Shipped',NULL,103,'2004-11-25',4,11,2004), (10346,'S18_1342',42,'36.1100000',3,1516.62,'2004-11-29 00:00:00','2004-12-05 00:00:00','2004-11-30 00:00:00','Shipped',NULL,112,'2004-11-29',4,11,2004), (10346,'S24_2766',25,'100.0000000',1,2876.75,'2004-11-29 00:00:00','2004-12-05 00:00:00','2004-11-30 00:00:00','Shipped',NULL,112,'2004-11-29',4,11,2004), (10346,'S24_2887',24,'87.2400000',5,2093.76,'2004-11-29 00:00:00','2004-12-05 00:00:00','2004-11-30 00:00:00','Shipped',NULL,112,'2004-11-29',4,11,2004), (10346,'S24_3191',24,'100.0000000',2,3325.92,'2004-11-29 00:00:00','2004-12-05 00:00:00','2004-11-30 00:00:00','Shipped',NULL,112,'2004-11-29',4,11,2004), (10346,'S24_3432',26,'95.8800000',6,2492.88,'2004-11-29 00:00:00','2004-12-05 00:00:00','2004-11-30 00:00:00','Shipped',NULL,112,'2004-11-29',4,11,2004), (10346,'S24_3969',22,'97.4400000',4,2143.68,'2004-11-29 00:00:00','2004-12-05 00:00:00','2004-11-30 00:00:00','Shipped',NULL,112,'2004-11-29',4,11,2004), (10347,'S10_1949',30,'100.0000000',1,3944.7,'2004-11-29 00:00:00','2004-12-07 00:00:00','2004-11-30 00:00:00','Shipped','Can we deliver the new Ford Mustang models by end-of-quarter?',114,'2004-11-29',4,11,2004), (10347,'S10_4962',27,'100.0000000',2,4428,'2004-11-29 00:00:00','2004-12-07 00:00:00','2004-11-30 00:00:00','Shipped','Can we deliver the new Ford Mustang models by end-of-quarter?',114,'2004-11-29',4,11,2004), (10347,'S12_1666',29,'100.0000000',3,3586.43,'2004-11-29 00:00:00','2004-12-07 00:00:00','2004-11-30 00:00:00','Shipped','Can we deliver the new Ford Mustang models by end-of-quarter?',114,'2004-11-29',4,11,2004), (10347,'S18_1097',42,'49.6000000',5,2083.2,'2004-11-29 00:00:00','2004-12-07 00:00:00','2004-11-30 00:00:00','Shipped','Can we deliver the new Ford Mustang models by end-of-quarter?',114,'2004-11-29',4,11,2004), (10347,'S18_1367',21,'58.9500000',7,1237.95,'2004-11-29 00:00:00','2004-12-07 00:00:00','2004-11-30 00:00:00','Shipped','Can we deliver the new Ford Mustang models by end-of-quarter?',114,'2004-11-29',4,11,2004), (10347,'S18_2432',50,'100.0000000',8,6834.5,'2004-11-29 00:00:00','2004-12-07 00:00:00','2004-11-30 00:00:00','Shipped','Can we deliver the new Ford Mustang models by end-of-quarter?',114,'2004-11-29',4,11,2004), (10347,'S18_2795',21,'100.0000000',6,4815.3,'2004-11-29 00:00:00','2004-12-07 00:00:00','2004-11-30 00:00:00','Shipped','Can we deliver the new Ford Mustang models by end-of-quarter?',114,'2004-11-29',4,11,2004), (10347,'S18_2949',48,'100.0000000',9,4814.4,'2004-11-29 00:00:00','2004-12-07 00:00:00','2004-11-30 00:00:00','Shipped','Can we deliver the new Ford Mustang models by end-of-quarter?',114,'2004-11-29',4,11,2004), (10347,'S18_2957',34,'64.9600000',10,2208.64,'2004-11-29 00:00:00','2004-12-07 00:00:00','2004-11-30 00:00:00','Shipped','Can we deliver the new Ford Mustang models by end-of-quarter?',114,'2004-11-29',4,11,2004), (10347,'S18_3136',45,'100.0000000',11,4948.2,'2004-11-29 00:00:00','2004-12-07 00:00:00','2004-11-30 00:00:00','Shipped','Can we deliver the new Ford Mustang models by end-of-quarter?',114,'2004-11-29',4,11,2004), (10347,'S18_3320',26,'100.0000000',12,2656.94,'2004-11-29 00:00:00','2004-12-07 00:00:00','2004-11-30 00:00:00','Shipped','Can we deliver the new Ford Mustang models by end-of-quarter?',114,'2004-11-29',4,11,2004), (10347,'S18_4600',45,'100.0000000',4,5884.65,'2004-11-29 00:00:00','2004-12-07 00:00:00','2004-11-30 00:00:00','Shipped','Can we deliver the new Ford Mustang models by end-of-quarter?',114,'2004-11-29',4,11,2004), (10348,'S12_1108',48,'52.3600000',8,2513.28,'2004-11-01 00:00:00','2004-11-08 00:00:00','2004-11-05 00:00:00','Shipped',NULL,458,'2004-11-01',4,11,2004), (10348,'S12_3148',47,'100.0000000',4,4801.52,'2004-11-01 00:00:00','2004-11-08 00:00:00','2004-11-05 00:00:00','Shipped',NULL,458,'2004-11-01',4,11,2004), (10348,'S18_4668',29,'100.0000000',6,7110.8,'2004-11-01 00:00:00','2004-11-08 00:00:00','2004-11-05 00:00:00','Shipped',NULL,458,'2004-11-01',4,11,2004), (10348,'S24_2300',37,'100.0000000',1,5981.42,'2004-11-01 00:00:00','2004-11-08 00:00:00','2004-11-05 00:00:00','Shipped',NULL,458,'2004-11-01',4,11,2004), (10348,'S24_4258',39,'50.3100000',2,1962.09,'2004-11-01 00:00:00','2004-11-08 00:00:00','2004-11-05 00:00:00','Shipped',NULL,458,'2004-11-01',4,11,2004), (10348,'S32_1268',42,'100.0000000',3,6386.94,'2004-11-01 00:00:00','2004-11-08 00:00:00','2004-11-05 00:00:00','Shipped',NULL,458,'2004-11-01',4,11,2004), (10348,'S32_3522',31,'100.0000000',5,3139.99,'2004-11-01 00:00:00','2004-11-08 00:00:00','2004-11-05 00:00:00','Shipped',NULL,458,'2004-11-01',4,11,2004), (10348,'S700_2824',32,'82.8300000',7,2650.56,'2004-11-01 00:00:00','2004-11-08 00:00:00','2004-11-05 00:00:00','Shipped',NULL,458,'2004-11-01',4,11,2004), (10349,'S12_3891',26,'100.0000000',10,4408.56,'2004-12-01 00:00:00','2004-12-07 00:00:00','2004-12-03 00:00:00','Shipped',NULL,151,'2004-12-01',4,12,2004), (10349,'S12_4473',48,'100.0000000',9,5232.96,'2004-12-01 00:00:00','2004-12-07 00:00:00','2004-12-03 00:00:00','Shipped',NULL,151,'2004-12-01',4,12,2004), (10349,'S18_2238',38,'100.0000000',8,6719.54,'2004-12-01 00:00:00','2004-12-07 00:00:00','2004-12-03 00:00:00','Shipped',NULL,151,'2004-12-01',4,12,2004), (10349,'S18_2319',38,'100.0000000',7,5223.48,'2004-12-01 00:00:00','2004-12-07 00:00:00','2004-12-03 00:00:00','Shipped',NULL,151,'2004-12-01',4,12,2004), (10349,'S18_3232',48,'100.0000000',6,7396.8,'2004-12-01 00:00:00','2004-12-07 00:00:00','2004-12-03 00:00:00','Shipped',NULL,151,'2004-12-01',4,12,2004), (10349,'S18_4027',34,'100.0000000',5,4394.84,'2004-12-01 00:00:00','2004-12-07 00:00:00','2004-12-03 00:00:00','Shipped',NULL,151,'2004-12-01',4,12,2004), (10349,'S24_1444',48,'47.4000000',4,2275.2,'2004-12-01 00:00:00','2004-12-07 00:00:00','2004-12-03 00:00:00','Shipped',NULL,151,'2004-12-01',4,12,2004), (10349,'S24_2840',36,'37.1300000',3,1336.68,'2004-12-01 00:00:00','2004-12-07 00:00:00','2004-12-03 00:00:00','Shipped',NULL,151,'2004-12-01',4,12,2004), (10349,'S24_4048',23,'100.0000000',2,3182.97,'2004-12-01 00:00:00','2004-12-07 00:00:00','2004-12-03 00:00:00','Shipped',NULL,151,'2004-12-01',4,12,2004), (10349,'S32_2509',33,'46.5300000',1,1535.49,'2004-12-01 00:00:00','2004-12-07 00:00:00','2004-12-03 00:00:00','Shipped',NULL,151,'2004-12-01',4,12,2004), (10350,'S10_4757',26,'75.4700000',5,1962.22,'2004-12-02 00:00:00','2004-12-08 00:00:00','2004-12-05 00:00:00','Shipped',NULL,141,'2004-12-02',4,12,2004), (10350,'S18_3029',43,'64.9700000',6,2793.71,'2004-12-02 00:00:00','2004-12-08 00:00:00','2004-12-05 00:00:00','Shipped',NULL,141,'2004-12-02',4,12,2004), (10350,'S18_3140',44,'100.0000000',1,5191.12,'2004-12-02 00:00:00','2004-12-08 00:00:00','2004-12-05 00:00:00','Shipped',NULL,141,'2004-12-02',4,12,2004), (10350,'S18_3259',41,'93.0400000',2,3814.64,'2004-12-02 00:00:00','2004-12-08 00:00:00','2004-12-05 00:00:00','Shipped',NULL,141,'2004-12-02',4,12,2004), (10350,'S18_4522',30,'100.0000000',3,3023.1,'2004-12-02 00:00:00','2004-12-08 00:00:00','2004-12-05 00:00:00','Shipped',NULL,141,'2004-12-02',4,12,2004), (10350,'S24_2011',34,'50.3300000',7,1711.22,'2004-12-02 00:00:00','2004-12-08 00:00:00','2004-12-05 00:00:00','Shipped',NULL,141,'2004-12-02',4,12,2004), (10350,'S24_3151',30,'100.0000000',9,3021,'2004-12-02 00:00:00','2004-12-08 00:00:00','2004-12-05 00:00:00','Shipped',NULL,141,'2004-12-02',4,12,2004), (10350,'S24_3816',25,'60.3400000',10,1508.5,'2004-12-02 00:00:00','2004-12-08 00:00:00','2004-12-05 00:00:00','Shipped',NULL,141,'2004-12-02',4,12,2004), (10350,'S32_3207',27,'100.0000000',14,4406.4,'2004-12-02 00:00:00','2004-12-08 00:00:00','2004-12-05 00:00:00','Shipped',NULL,141,'2004-12-02',4,12,2004), (10350,'S50_1392',31,'71.4000000',8,2213.4,'2004-12-02 00:00:00','2004-12-08 00:00:00','2004-12-05 00:00:00','Shipped',NULL,141,'2004-12-02',4,12,2004), (10350,'S50_1514',44,'100.0000000',17,6490.88,'2004-12-02 00:00:00','2004-12-08 00:00:00','2004-12-05 00:00:00','Shipped',NULL,141,'2004-12-02',4,12,2004), (10350,'S700_1138',46,'76.6700000',11,3526.82,'2004-12-02 00:00:00','2004-12-08 00:00:00','2004-12-05 00:00:00','Shipped',NULL,141,'2004-12-02',4,12,2004), (10350,'S700_1938',28,'100.0000000',4,2924.32,'2004-12-02 00:00:00','2004-12-08 00:00:00','2004-12-05 00:00:00','Shipped',NULL,141,'2004-12-02',4,12,2004), (10350,'S700_2610',29,'75.3500000',12,2185.15,'2004-12-02 00:00:00','2004-12-08 00:00:00','2004-12-05 00:00:00','Shipped',NULL,141,'2004-12-02',4,12,2004), (10350,'S700_3505',31,'77.3400000',13,2397.54,'2004-12-02 00:00:00','2004-12-08 00:00:00','2004-12-05 00:00:00','Shipped',NULL,141,'2004-12-02',4,12,2004), (10350,'S700_3962',25,'100.0000000',16,2854.75,'2004-12-02 00:00:00','2004-12-08 00:00:00','2004-12-05 00:00:00','Shipped',NULL,141,'2004-12-02',4,12,2004), (10350,'S72_3212',20,'100.0000000',15,2244.4,'2004-12-02 00:00:00','2004-12-08 00:00:00','2004-12-05 00:00:00','Shipped',NULL,141,'2004-12-02',4,12,2004), (10351,'S18_1662',39,'99.5200000',1,3881.28,'2004-12-03 00:00:00','2004-12-11 00:00:00','2004-12-07 00:00:00','Shipped',NULL,324,'2004-12-03',4,12,2004), (10351,'S18_3856',20,'100.0000000',2,3374.6,'2004-12-03 00:00:00','2004-12-11 00:00:00','2004-12-07 00:00:00','Shipped',NULL,324,'2004-12-03',4,12,2004), (10351,'S24_2841',25,'74.6800000',5,1867,'2004-12-03 00:00:00','2004-12-11 00:00:00','2004-12-07 00:00:00','Shipped',NULL,324,'2004-12-03',4,12,2004), (10351,'S24_3420',38,'68.3800000',4,2598.44,'2004-12-03 00:00:00','2004-12-11 00:00:00','2004-12-07 00:00:00','Shipped',NULL,324,'2004-12-03',4,12,2004), (10351,'S24_3949',34,'59.3700000',3,2018.58,'2004-12-03 00:00:00','2004-12-11 00:00:00','2004-12-07 00:00:00','Shipped',NULL,324,'2004-12-03',4,12,2004), (10352,'S700_2047',23,'100.0000000',3,2352.67,'2004-12-03 00:00:00','2004-12-12 00:00:00','2004-12-09 00:00:00','Shipped',NULL,198,'2004-12-03',4,12,2004), (10352,'S700_2466',49,'100.0000000',2,4935.28,'2004-12-03 00:00:00','2004-12-12 00:00:00','2004-12-09 00:00:00','Shipped',NULL,198,'2004-12-03',4,12,2004), (10352,'S700_4002',22,'75.5100000',1,1661.22,'2004-12-03 00:00:00','2004-12-12 00:00:00','2004-12-09 00:00:00','Shipped',NULL,198,'2004-12-03',4,12,2004), (10352,'S72_1253',49,'52.6400000',4,2579.36,'2004-12-03 00:00:00','2004-12-12 00:00:00','2004-12-09 00:00:00','Shipped',NULL,198,'2004-12-03',4,12,2004), (10353,'S18_2581',27,'100.0000000',1,3515.67,'2004-12-04 00:00:00','2004-12-11 00:00:00','2004-12-05 00:00:00','Shipped',NULL,447,'2004-12-04',4,12,2004), (10353,'S24_1785',28,'71.7300000',2,2008.44,'2004-12-04 00:00:00','2004-12-11 00:00:00','2004-12-05 00:00:00','Shipped',NULL,447,'2004-12-04',4,12,2004), (10353,'S24_4278',35,'89.9000000',3,3146.5,'2004-12-04 00:00:00','2004-12-11 00:00:00','2004-12-05 00:00:00','Shipped',NULL,447,'2004-12-04',4,12,2004), (10353,'S32_1374',46,'81.1700000',5,3733.82,'2004-12-04 00:00:00','2004-12-11 00:00:00','2004-12-05 00:00:00','Shipped',NULL,447,'2004-12-04',4,12,2004), (10353,'S32_4289',40,'44.5100000',7,1780.4,'2004-12-04 00:00:00','2004-12-11 00:00:00','2004-12-05 00:00:00','Shipped',NULL,447,'2004-12-04',4,12,2004), (10353,'S50_1341',40,'82.2100000',8,3288.4,'2004-12-04 00:00:00','2004-12-11 00:00:00','2004-12-05 00:00:00','Shipped',NULL,447,'2004-12-04',4,12,2004), (10353,'S700_1691',39,'100.0000000',9,5043.87,'2004-12-04 00:00:00','2004-12-11 00:00:00','2004-12-05 00:00:00','Shipped',NULL,447,'2004-12-04',4,12,2004), (10353,'S700_2834',48,'68.8000000',4,3302.4,'2004-12-04 00:00:00','2004-12-11 00:00:00','2004-12-05 00:00:00','Shipped',NULL,447,'2004-12-04',4,12,2004), (10353,'S700_3167',43,'81.9500000',6,3523.85,'2004-12-04 00:00:00','2004-12-11 00:00:00','2004-12-05 00:00:00','Shipped',NULL,447,'2004-12-04',4,12,2004), (10354,'S10_1678',42,'86.1300000',6,3617.46,'2004-12-04 00:00:00','2004-12-10 00:00:00','2004-12-05 00:00:00','Shipped',NULL,323,'2004-12-04',4,12,2004), (10354,'S10_2016',20,'100.0000000',2,2093.4,'2004-12-04 00:00:00','2004-12-10 00:00:00','2004-12-05 00:00:00','Shipped',NULL,323,'2004-12-04',4,12,2004), (10354,'S10_4698',42,'100.0000000',3,8947.26,'2004-12-04 00:00:00','2004-12-10 00:00:00','2004-12-05 00:00:00','Shipped',NULL,323,'2004-12-04',4,12,2004), (10354,'S12_1099',31,'93.2800000',9,2891.68,'2004-12-04 00:00:00','2004-12-10 00:00:00','2004-12-05 00:00:00','Shipped',NULL,323,'2004-12-04',4,12,2004), (10354,'S12_2823',35,'100.0000000',4,6401.5,'2004-12-04 00:00:00','2004-12-10 00:00:00','2004-12-05 00:00:00','Shipped',NULL,323,'2004-12-04',4,12,2004), (10354,'S12_3380',29,'73.1500000',11,2121.35,'2004-12-04 00:00:00','2004-12-10 00:00:00','2004-12-05 00:00:00','Shipped',NULL,323,'2004-12-04',4,12,2004), (10354,'S12_3990',23,'50.8800000',12,1170.24,'2004-12-04 00:00:00','2004-12-10 00:00:00','2004-12-05 00:00:00','Shipped',NULL,323,'2004-12-04',4,12,2004), (10354,'S12_4675',28,'86.8400000',13,2431.52,'2004-12-04 00:00:00','2004-12-10 00:00:00','2004-12-05 00:00:00','Shipped',NULL,323,'2004-12-04',4,12,2004), (10354,'S18_1889',21,'100.0000000',8,2319.45,'2004-12-04 00:00:00','2004-12-10 00:00:00','2004-12-05 00:00:00','Shipped',NULL,323,'2004-12-04',4,12,2004), (10354,'S18_2625',28,'100.0000000',10,4639.04,'2004-12-04 00:00:00','2004-12-10 00:00:00','2004-12-05 00:00:00','Shipped',NULL,323,'2004-12-04',4,12,2004), (10354,'S18_3278',36,'82.2600000',7,2961.36,'2004-12-04 00:00:00','2004-12-10 00:00:00','2004-12-05 00:00:00','Shipped',NULL,323,'2004-12-04',4,12,2004), (10354,'S24_1578',21,'100.0000000',5,2392.32,'2004-12-04 00:00:00','2004-12-10 00:00:00','2004-12-05 00:00:00','Shipped',NULL,323,'2004-12-04',4,12,2004), (10354,'S24_2000',28,'69.4300000',1,1944.04,'2004-12-04 00:00:00','2004-12-10 00:00:00','2004-12-05 00:00:00','Shipped',NULL,323,'2004-12-04',4,12,2004), (10355,'S18_3482',23,'100.0000000',7,3177.91,'2004-12-07 00:00:00','2004-12-14 00:00:00','2004-12-13 00:00:00','Shipped',NULL,141,'2004-12-07',4,12,2004), (10355,'S18_3782',31,'53.4700000',1,1657.57,'2004-12-07 00:00:00','2004-12-14 00:00:00','2004-12-13 00:00:00','Shipped',NULL,141,'2004-12-07',4,12,2004), (10355,'S18_4721',25,'100.0000000',2,4203.5,'2004-12-07 00:00:00','2004-12-14 00:00:00','2004-12-13 00:00:00','Shipped',NULL,141,'2004-12-07',4,12,2004), (10355,'S24_2360',41,'70.6500000',3,2896.65,'2004-12-07 00:00:00','2004-12-14 00:00:00','2004-12-13 00:00:00','Shipped',NULL,141,'2004-12-07',4,12,2004), (10355,'S24_2972',36,'38.5200000',4,1386.72,'2004-12-07 00:00:00','2004-12-14 00:00:00','2004-12-13 00:00:00','Shipped',NULL,141,'2004-12-07',4,12,2004), (10355,'S24_3371',44,'62.4500000',6,2747.8,'2004-12-07 00:00:00','2004-12-14 00:00:00','2004-12-13 00:00:00','Shipped',NULL,141,'2004-12-07',4,12,2004), (10355,'S24_3856',32,'100.0000000',8,5302.72,'2004-12-07 00:00:00','2004-12-14 00:00:00','2004-12-13 00:00:00','Shipped',NULL,141,'2004-12-07',4,12,2004), (10355,'S24_4620',28,'95.3900000',9,2670.92,'2004-12-07 00:00:00','2004-12-14 00:00:00','2004-12-13 00:00:00','Shipped',NULL,141,'2004-12-07',4,12,2004), (10355,'S32_2206',38,'39.8300000',10,1513.54,'2004-12-07 00:00:00','2004-12-14 00:00:00','2004-12-13 00:00:00','Shipped',NULL,141,'2004-12-07',4,12,2004), (10355,'S32_4485',40,'100.0000000',5,4326.8,'2004-12-07 00:00:00','2004-12-14 00:00:00','2004-12-13 00:00:00','Shipped',NULL,141,'2004-12-07',4,12,2004), (10356,'S18_1129',43,'97.6000000',8,4196.8,'2004-12-09 00:00:00','2004-12-15 00:00:00','2004-12-12 00:00:00','Shipped',NULL,250,'2004-12-09',4,12,2004), (10356,'S18_1342',50,'50.1800000',9,2509,'2004-12-09 00:00:00','2004-12-15 00:00:00','2004-12-12 00:00:00','Shipped',NULL,250,'2004-12-09',4,12,2004), (10356,'S18_1367',22,'72.4100000',6,1593.02,'2004-12-09 00:00:00','2004-12-15 00:00:00','2004-12-12 00:00:00','Shipped',NULL,250,'2004-12-09',4,12,2004), (10356,'S18_1984',27,'64.6900000',2,1746.63,'2004-12-09 00:00:00','2004-12-15 00:00:00','2004-12-12 00:00:00','Shipped',NULL,250,'2004-12-09',4,12,2004), (10356,'S18_2325',29,'100.0000000',3,3630.22,'2004-12-09 00:00:00','2004-12-15 00:00:00','2004-12-12 00:00:00','Shipped',NULL,250,'2004-12-09',4,12,2004), (10356,'S18_2795',30,'100.0000000',1,4462.2,'2004-12-09 00:00:00','2004-12-15 00:00:00','2004-12-12 00:00:00','Shipped',NULL,250,'2004-12-09',4,12,2004), (10356,'S24_1937',48,'100.0000000',5,9720,'2004-12-09 00:00:00','2004-12-15 00:00:00','2004-12-12 00:00:00','Shipped',NULL,250,'2004-12-09',4,12,2004), (10356,'S24_2022',26,'31.8600000',7,828.36,'2004-12-09 00:00:00','2004-12-15 00:00:00','2004-12-12 00:00:00','Shipped',NULL,250,'2004-12-09',4,12,2004), (10356,'S50_4713',26,'100.0000000',4,3937.7,'2004-12-09 00:00:00','2004-12-15 00:00:00','2004-12-12 00:00:00','Shipped',NULL,250,'2004-12-09',4,12,2004), (10357,'S10_1949',32,'100.0000000',10,5691.84,'2004-12-10 00:00:00','2004-12-16 00:00:00','2004-12-14 00:00:00','Shipped',NULL,124,'2004-12-10',4,12,2004), (10357,'S10_4962',43,'100.0000000',9,5780.92,'2004-12-10 00:00:00','2004-12-16 00:00:00','2004-12-14 00:00:00','Shipped',NULL,124,'2004-12-10',4,12,2004), (10357,'S12_1666',49,'100.0000000',8,5960.36,'2004-12-10 00:00:00','2004-12-16 00:00:00','2004-12-14 00:00:00','Shipped',NULL,124,'2004-12-10',4,12,2004), (10357,'S18_1097',39,'98.0000000',1,3822,'2004-12-10 00:00:00','2004-12-16 00:00:00','2004-12-14 00:00:00','Shipped',NULL,124,'2004-12-10',4,12,2004), (10357,'S18_2432',41,'61.9900000',7,2541.59,'2004-12-10 00:00:00','2004-12-16 00:00:00','2004-12-14 00:00:00','Shipped',NULL,124,'2004-12-10',4,12,2004), (10357,'S18_2949',41,'87.1300000',6,3572.33,'2004-12-10 00:00:00','2004-12-16 00:00:00','2004-12-14 00:00:00','Shipped',NULL,124,'2004-12-10',4,12,2004), (10357,'S18_2957',49,'70.5800000',5,3458.42,'2004-12-10 00:00:00','2004-12-16 00:00:00','2004-12-14 00:00:00','Shipped',NULL,124,'2004-12-10',4,12,2004), (10357,'S18_3136',44,'100.0000000',4,5160.76,'2004-12-10 00:00:00','2004-12-16 00:00:00','2004-12-14 00:00:00','Shipped',NULL,124,'2004-12-10',4,12,2004), (10357,'S18_3320',25,'100.0000000',3,2604.25,'2004-12-10 00:00:00','2004-12-16 00:00:00','2004-12-14 00:00:00','Shipped',NULL,124,'2004-12-10',4,12,2004), (10357,'S18_4600',28,'100.0000000',2,3559.64,'2004-12-10 00:00:00','2004-12-16 00:00:00','2004-12-14 00:00:00','Shipped',NULL,124,'2004-12-10',4,12,2004), (10358,'S12_3148',49,'55.3400000',5,2711.66,'2004-12-10 00:00:00','2004-12-16 00:00:00','2004-12-16 00:00:00','Shipped','Customer requested that DHL is used for this shipping',141,'2004-12-10',4,12,2004), (10358,'S12_4473',42,'64.1600000',9,2694.72,'2004-12-10 00:00:00','2004-12-16 00:00:00','2004-12-16 00:00:00','Shipped','Customer requested that DHL is used for this shipping',141,'2004-12-10',4,12,2004), (10358,'S18_2238',20,'100.0000000',10,2428,'2004-12-10 00:00:00','2004-12-16 00:00:00','2004-12-16 00:00:00','Shipped','Customer requested that DHL is used for this shipping',141,'2004-12-10',4,12,2004), (10358,'S18_2319',20,'36.4200000',11,728.4,'2004-12-10 00:00:00','2004-12-16 00:00:00','2004-12-16 00:00:00','Shipped','Customer requested that DHL is used for this shipping',141,'2004-12-10',4,12,2004), (10358,'S18_3232',32,'93.4900000',12,2991.68,'2004-12-10 00:00:00','2004-12-16 00:00:00','2004-12-16 00:00:00','Shipped','Customer requested that DHL is used for this shipping',141,'2004-12-10',4,12,2004), (10358,'S18_4027',25,'100.0000000',13,2528.25,'2004-12-10 00:00:00','2004-12-16 00:00:00','2004-12-16 00:00:00','Shipped','Customer requested that DHL is used for this shipping',141,'2004-12-10',4,12,2004), (10358,'S18_4668',30,'100.0000000',8,5302.8,'2004-12-10 00:00:00','2004-12-16 00:00:00','2004-12-16 00:00:00','Shipped','Customer requested that DHL is used for this shipping',141,'2004-12-10',4,12,2004), (10358,'S24_1444',44,'60.7600000',14,2673.44,'2004-12-10 00:00:00','2004-12-16 00:00:00','2004-12-16 00:00:00','Shipped','Customer requested that DHL is used for this shipping',141,'2004-12-10',4,12,2004), (10358,'S24_2300',41,'100.0000000',7,5684.65,'2004-12-10 00:00:00','2004-12-16 00:00:00','2004-12-16 00:00:00','Shipped','Customer requested that DHL is used for this shipping',141,'2004-12-10',4,12,2004), (10358,'S24_2840',36,'82.9400000',4,2985.84,'2004-12-10 00:00:00','2004-12-16 00:00:00','2004-12-16 00:00:00','Shipped','Customer requested that DHL is used for this shipping',141,'2004-12-10',4,12,2004), (10358,'S24_4258',41,'100.0000000',6,6847,'2004-12-10 00:00:00','2004-12-16 00:00:00','2004-12-16 00:00:00','Shipped','Customer requested that DHL is used for this shipping',141,'2004-12-10',4,12,2004), (10358,'S32_1268',41,'100.0000000',1,4428,'2004-12-10 00:00:00','2004-12-16 00:00:00','2004-12-16 00:00:00','Shipped','Customer requested that DHL is used for this shipping',141,'2004-12-10',4,12,2004), (10358,'S32_3522',36,'100.0000000',2,5669.64,'2004-12-10 00:00:00','2004-12-16 00:00:00','2004-12-16 00:00:00','Shipped','Customer requested that DHL is used for this shipping',141,'2004-12-10',4,12,2004), (10358,'S700_2824',27,'100.0000000',3,3761.37,'2004-12-10 00:00:00','2004-12-16 00:00:00','2004-12-16 00:00:00','Shipped','Customer requested that DHL is used for this shipping',141,'2004-12-10',4,12,2004), (10359,'S10_4757',48,'54.6800000',6,2624.64,'2004-12-15 00:00:00','2004-12-23 00:00:00','2004-12-18 00:00:00','Shipped',NULL,353,'2004-12-15',4,12,2004), (10359,'S12_1108',42,'100.0000000',8,4764.48,'2004-12-15 00:00:00','2004-12-23 00:00:00','2004-12-18 00:00:00','Shipped',NULL,353,'2004-12-15',4,12,2004), (10359,'S12_3891',49,'62.0900000',5,3042.41,'2004-12-15 00:00:00','2004-12-23 00:00:00','2004-12-18 00:00:00','Shipped',NULL,353,'2004-12-15',4,12,2004), (10359,'S24_4048',22,'100.0000000',7,2603.04,'2004-12-15 00:00:00','2004-12-23 00:00:00','2004-12-18 00:00:00','Shipped',NULL,353,'2004-12-15',4,12,2004), (10359,'S32_2509',36,'100.0000000',3,6358.68,'2004-12-15 00:00:00','2004-12-23 00:00:00','2004-12-18 00:00:00','Shipped',NULL,353,'2004-12-15',4,12,2004), (10359,'S32_3207',22,'100.0000000',1,4301.22,'2004-12-15 00:00:00','2004-12-23 00:00:00','2004-12-18 00:00:00','Shipped',NULL,353,'2004-12-15',4,12,2004), (10359,'S50_1392',46,'100.0000000',2,4896.7,'2004-12-15 00:00:00','2004-12-23 00:00:00','2004-12-18 00:00:00','Shipped',NULL,353,'2004-12-15',4,12,2004), (10359,'S50_1514',25,'64.9300000',4,1623.25,'2004-12-15 00:00:00','2004-12-23 00:00:00','2004-12-18 00:00:00','Shipped',NULL,353,'2004-12-15',4,12,2004), (10360,'S18_1662',50,'58.6700000',12,2933.5,'2004-12-16 00:00:00','2004-12-22 00:00:00','2004-12-18 00:00:00','Shipped',NULL,496,'2004-12-16',4,12,2004), (10360,'S18_2581',41,'87.4800000',13,3586.68,'2004-12-16 00:00:00','2004-12-22 00:00:00','2004-12-18 00:00:00','Shipped',NULL,496,'2004-12-16',4,12,2004), (10360,'S18_3029',46,'77.3400000',14,3557.64,'2004-12-16 00:00:00','2004-12-22 00:00:00','2004-12-18 00:00:00','Shipped',NULL,496,'2004-12-16',4,12,2004), (10360,'S18_3140',29,'100.0000000',8,5076.16,'2004-12-16 00:00:00','2004-12-22 00:00:00','2004-12-18 00:00:00','Shipped',NULL,496,'2004-12-16',4,12,2004), (10360,'S18_3259',29,'100.0000000',18,2940.02,'2004-12-16 00:00:00','2004-12-22 00:00:00','2004-12-18 00:00:00','Shipped',NULL,496,'2004-12-16',4,12,2004), (10360,'S18_3856',40,'87.1500000',15,3486,'2004-12-16 00:00:00','2004-12-22 00:00:00','2004-12-18 00:00:00','Shipped',NULL,496,'2004-12-16',4,12,2004), (10360,'S18_4522',40,'86.0200000',1,3440.8,'2004-12-16 00:00:00','2004-12-22 00:00:00','2004-12-18 00:00:00','Shipped',NULL,496,'2004-12-16',4,12,2004), (10360,'S24_1785',22,'100.0000000',17,2534.4,'2004-12-16 00:00:00','2004-12-22 00:00:00','2004-12-18 00:00:00','Shipped',NULL,496,'2004-12-16',4,12,2004), (10360,'S24_2011',31,'100.0000000',2,3683.73,'2004-12-16 00:00:00','2004-12-22 00:00:00','2004-12-18 00:00:00','Shipped',NULL,496,'2004-12-16',4,12,2004), (10360,'S24_2841',49,'56.7800000',16,2782.22,'2004-12-16 00:00:00','2004-12-22 00:00:00','2004-12-18 00:00:00','Shipped',NULL,496,'2004-12-16',4,12,2004), (10360,'S24_3151',36,'100.0000000',3,4102.2,'2004-12-16 00:00:00','2004-12-22 00:00:00','2004-12-18 00:00:00','Shipped',NULL,496,'2004-12-16',4,12,2004), (10360,'S24_3816',22,'100.0000000',4,2445.52,'2004-12-16 00:00:00','2004-12-22 00:00:00','2004-12-18 00:00:00','Shipped',NULL,496,'2004-12-16',4,12,2004), (10360,'S700_1138',32,'100.0000000',5,3230.08,'2004-12-16 00:00:00','2004-12-22 00:00:00','2004-12-18 00:00:00','Shipped',NULL,496,'2004-12-16',4,12,2004), (10360,'S700_1938',26,'97.3800000',6,2531.88,'2004-12-16 00:00:00','2004-12-22 00:00:00','2004-12-18 00:00:00','Shipped',NULL,496,'2004-12-16',4,12,2004), (10360,'S700_2610',30,'100.0000000',7,3760.5,'2004-12-16 00:00:00','2004-12-22 00:00:00','2004-12-18 00:00:00','Shipped',NULL,496,'2004-12-16',4,12,2004), (10360,'S700_3505',35,'65.7700000',9,2301.95,'2004-12-16 00:00:00','2004-12-22 00:00:00','2004-12-18 00:00:00','Shipped',NULL,496,'2004-12-16',4,12,2004), (10360,'S700_3962',31,'100.0000000',10,3210.36,'2004-12-16 00:00:00','2004-12-22 00:00:00','2004-12-18 00:00:00','Shipped',NULL,496,'2004-12-16',4,12,2004), (10360,'S72_3212',31,'96.4400000',11,2989.64,'2004-12-16 00:00:00','2004-12-22 00:00:00','2004-12-18 00:00:00','Shipped',NULL,496,'2004-12-16',4,12,2004), (10361,'S10_1678',20,'72.5500000',13,1451,'2004-12-17 00:00:00','2004-12-24 00:00:00','2004-12-20 00:00:00','Shipped',NULL,282,'2004-12-17',4,12,2004), (10361,'S10_2016',26,'51.1500000',8,1329.9,'2004-12-17 00:00:00','2004-12-24 00:00:00','2004-12-20 00:00:00','Shipped',NULL,282,'2004-12-17',4,12,2004), (10361,'S24_3420',34,'100.0000000',6,3871.92,'2004-12-17 00:00:00','2004-12-24 00:00:00','2004-12-20 00:00:00','Shipped',NULL,282,'2004-12-17',4,12,2004), (10361,'S24_3949',26,'100.0000000',7,3710.98,'2004-12-17 00:00:00','2004-12-24 00:00:00','2004-12-20 00:00:00','Shipped',NULL,282,'2004-12-17',4,12,2004), (10361,'S24_4278',25,'62.4600000',1,1561.5,'2004-12-17 00:00:00','2004-12-24 00:00:00','2004-12-20 00:00:00','Shipped',NULL,282,'2004-12-17',4,12,2004), (10361,'S32_4289',49,'72.3300000',2,3544.17,'2004-12-17 00:00:00','2004-12-24 00:00:00','2004-12-20 00:00:00','Shipped',NULL,282,'2004-12-17',4,12,2004), (10361,'S50_1341',33,'82.5900000',3,2725.47,'2004-12-17 00:00:00','2004-12-24 00:00:00','2004-12-20 00:00:00','Shipped',NULL,282,'2004-12-17',4,12,2004), (10361,'S700_1691',20,'60.5400000',4,1210.8,'2004-12-17 00:00:00','2004-12-24 00:00:00','2004-12-20 00:00:00','Shipped',NULL,282,'2004-12-17',4,12,2004), (10361,'S700_2047',24,'45.3900000',14,1089.36,'2004-12-17 00:00:00','2004-12-24 00:00:00','2004-12-20 00:00:00','Shipped',NULL,282,'2004-12-17',4,12,2004), (10361,'S700_2466',26,'100.0000000',9,2754.7,'2004-12-17 00:00:00','2004-12-24 00:00:00','2004-12-20 00:00:00','Shipped',NULL,282,'2004-12-17',4,12,2004), (10361,'S700_2834',44,'72.4200000',5,3186.48,'2004-12-17 00:00:00','2004-12-24 00:00:00','2004-12-20 00:00:00','Shipped',NULL,282,'2004-12-17',4,12,2004), (10361,'S700_3167',44,'100.0000000',10,5001.92,'2004-12-17 00:00:00','2004-12-24 00:00:00','2004-12-20 00:00:00','Shipped',NULL,282,'2004-12-17',4,12,2004), (10361,'S700_4002',35,'100.0000000',11,4277.35,'2004-12-17 00:00:00','2004-12-24 00:00:00','2004-12-20 00:00:00','Shipped',NULL,282,'2004-12-17',4,12,2004), (10361,'S72_1253',23,'95.2000000',12,2189.6,'2004-12-17 00:00:00','2004-12-24 00:00:00','2004-12-20 00:00:00','Shipped',NULL,282,'2004-12-17',4,12,2004), (10362,'S10_4698',22,'100.0000000',4,3664.1,'2005-01-05 00:00:00','2005-01-16 00:00:00','2005-01-10 00:00:00','Shipped',NULL,161,'2005-01-05',1,1,2005), (10362,'S12_2823',22,'100.0000000',1,3877.06,'2005-01-05 00:00:00','2005-01-16 00:00:00','2005-01-10 00:00:00','Shipped',NULL,161,'2005-01-05',1,1,2005), (10362,'S18_2625',23,'49.6700000',3,1142.41,'2005-01-05 00:00:00','2005-01-16 00:00:00','2005-01-10 00:00:00','Shipped',NULL,161,'2005-01-05',1,1,2005), (10362,'S24_1578',50,'96.9200000',2,4846,'2005-01-05 00:00:00','2005-01-16 00:00:00','2005-01-10 00:00:00','Shipped',NULL,161,'2005-01-05',1,1,2005), (10363,'S12_1099',33,'85.3900000',3,2817.87,'2005-01-06 00:00:00','2005-01-12 00:00:00','2005-01-10 00:00:00','Shipped',NULL,334,'2005-01-06',1,1,2005), (10363,'S12_3380',34,'96.7300000',4,3288.82,'2005-01-06 00:00:00','2005-01-12 00:00:00','2005-01-10 00:00:00','Shipped',NULL,334,'2005-01-06',1,1,2005), (10363,'S12_3990',34,'81.6200000',5,2775.08,'2005-01-06 00:00:00','2005-01-12 00:00:00','2005-01-10 00:00:00','Shipped',NULL,334,'2005-01-06',1,1,2005), (10363,'S12_4675',46,'88.4500000',6,4068.7,'2005-01-06 00:00:00','2005-01-12 00:00:00','2005-01-10 00:00:00','Shipped',NULL,334,'2005-01-06',1,1,2005), (10363,'S18_1889',22,'100.0000000',7,3686.54,'2005-01-06 00:00:00','2005-01-12 00:00:00','2005-01-10 00:00:00','Shipped',NULL,334,'2005-01-06',1,1,2005), (10363,'S18_3278',46,'60.3000000',10,2773.8,'2005-01-06 00:00:00','2005-01-12 00:00:00','2005-01-10 00:00:00','Shipped',NULL,334,'2005-01-06',1,1,2005), (10363,'S18_3482',24,'100.0000000',11,4142.64,'2005-01-06 00:00:00','2005-01-12 00:00:00','2005-01-10 00:00:00','Shipped',NULL,334,'2005-01-06',1,1,2005), (10363,'S18_3782',32,'89.1200000',12,2851.84,'2005-01-06 00:00:00','2005-01-12 00:00:00','2005-01-10 00:00:00','Shipped',NULL,334,'2005-01-06',1,1,2005), (10363,'S18_4721',28,'58.1800000',13,1629.04,'2005-01-06 00:00:00','2005-01-12 00:00:00','2005-01-10 00:00:00','Shipped',NULL,334,'2005-01-06',1,1,2005), (10363,'S24_2000',21,'100.0000000',8,3595.62,'2005-01-06 00:00:00','2005-01-12 00:00:00','2005-01-10 00:00:00','Shipped',NULL,334,'2005-01-06',1,1,2005), (10363,'S24_2360',43,'61.2300000',14,2632.89,'2005-01-06 00:00:00','2005-01-12 00:00:00','2005-01-10 00:00:00','Shipped',NULL,334,'2005-01-06',1,1,2005), (10363,'S24_3371',21,'100.0000000',15,2447.76,'2005-01-06 00:00:00','2005-01-12 00:00:00','2005-01-10 00:00:00','Shipped',NULL,334,'2005-01-06',1,1,2005), (10363,'S24_3856',31,'94.5800000',1,2931.98,'2005-01-06 00:00:00','2005-01-12 00:00:00','2005-01-10 00:00:00','Shipped',NULL,334,'2005-01-06',1,1,2005), (10363,'S24_4620',43,'100.0000000',9,5154.41,'2005-01-06 00:00:00','2005-01-12 00:00:00','2005-01-10 00:00:00','Shipped',NULL,334,'2005-01-06',1,1,2005), (10363,'S32_1374',50,'100.0000000',2,6576.5,'2005-01-06 00:00:00','2005-01-12 00:00:00','2005-01-10 00:00:00','Shipped',NULL,334,'2005-01-06',1,1,2005), (10364,'S32_2206',48,'48.2800000',1,2317.44,'2005-01-06 00:00:00','2005-01-17 00:00:00','2005-01-09 00:00:00','Shipped',NULL,350,'2005-01-06',1,1,2005), (10365,'S18_1129',30,'87.0600000',1,2611.8,'2005-01-07 00:00:00','2005-01-18 00:00:00','2005-01-11 00:00:00','Shipped',NULL,320,'2005-01-07',1,1,2005), (10365,'S32_4485',22,'100.0000000',3,3425.18,'2005-01-07 00:00:00','2005-01-18 00:00:00','2005-01-11 00:00:00','Shipped',NULL,320,'2005-01-07',1,1,2005), (10365,'S50_4713',44,'100.0000000',2,4984.32,'2005-01-07 00:00:00','2005-01-18 00:00:00','2005-01-11 00:00:00','Shipped',NULL,320,'2005-01-07',1,1,2005), (10366,'S18_1984',34,'100.0000000',3,4207.84,'2005-01-10 00:00:00','2005-01-19 00:00:00','2005-01-12 00:00:00','Shipped',NULL,381,'2005-01-10',1,1,2005), (10366,'S18_2870',49,'100.0000000',2,6144.6,'2005-01-10 00:00:00','2005-01-19 00:00:00','2005-01-12 00:00:00','Shipped',NULL,381,'2005-01-10',1,1,2005), (10366,'S18_3232',34,'100.0000000',1,6275.72,'2005-01-10 00:00:00','2005-01-19 00:00:00','2005-01-12 00:00:00','Shipped',NULL,381,'2005-01-10',1,1,2005), (10367,'S18_1589',49,'56.3000000',1,2758.7,'2005-01-12 00:00:00','2005-01-21 00:00:00','2005-01-16 00:00:00','Resolved','This order was disputed and resolved on 2/1/2005. Customer claimed that container with shipment was damaged. FedEx\'s investigation proved this wrong.',205,'2005-01-12',1,1,2005), (10367,'S18_1749',37,'100.0000000',3,4703.81,'2005-01-12 00:00:00','2005-01-21 00:00:00','2005-01-16 00:00:00','Resolved','This order was disputed and resolved on 2/1/2005. Customer claimed that container with shipment was damaged. FedEx\'s investigation proved this wrong.',205,'2005-01-12',1,1,2005), (10367,'S18_2248',45,'100.0000000',4,8884.8,'2005-01-12 00:00:00','2005-01-21 00:00:00','2005-01-16 00:00:00','Resolved','This order was disputed and resolved on 2/1/2005. Customer claimed that container with shipment was damaged. FedEx\'s investigation proved this wrong.',205,'2005-01-12',1,1,2005), (10367,'S18_2325',27,'100.0000000',5,4196.07,'2005-01-12 00:00:00','2005-01-21 00:00:00','2005-01-16 00:00:00','Resolved','This order was disputed and resolved on 2/1/2005. Customer claimed that container with shipment was damaged. FedEx\'s investigation proved this wrong.',205,'2005-01-12',1,1,2005), (10367,'S18_2795',32,'94.7900000',7,3033.28,'2005-01-12 00:00:00','2005-01-21 00:00:00','2005-01-16 00:00:00','Resolved','This order was disputed and resolved on 2/1/2005. Customer claimed that container with shipment was damaged. FedEx\'s investigation proved this wrong.',205,'2005-01-12',1,1,2005), (10367,'S18_3685',46,'100.0000000',6,4808.38,'2005-01-12 00:00:00','2005-01-21 00:00:00','2005-01-16 00:00:00','Resolved','This order was disputed and resolved on 2/1/2005. Customer claimed that container with shipment was damaged. FedEx\'s investigation proved this wrong.',205,'2005-01-12',1,1,2005), (10367,'S18_4409',43,'62.7200000',8,2696.96,'2005-01-12 00:00:00','2005-01-21 00:00:00','2005-01-16 00:00:00','Resolved','This order was disputed and resolved on 2/1/2005. Customer claimed that container with shipment was damaged. FedEx\'s investigation proved this wrong.',205,'2005-01-12',1,1,2005), (10367,'S18_4933',44,'85.2500000',9,3751,'2005-01-12 00:00:00','2005-01-21 00:00:00','2005-01-16 00:00:00','Resolved','This order was disputed and resolved on 2/1/2005. Customer claimed that container with shipment was damaged. FedEx\'s investigation proved this wrong.',205,'2005-01-12',1,1,2005), (10367,'S24_1046',21,'60.3700000',10,1267.77,'2005-01-12 00:00:00','2005-01-21 00:00:00','2005-01-16 00:00:00','Resolved','This order was disputed and resolved on 2/1/2005. Customer claimed that container with shipment was damaged. FedEx\'s investigation proved this wrong.',205,'2005-01-12',1,1,2005), (10367,'S24_1628',38,'38.5000000',11,1463,'2005-01-12 00:00:00','2005-01-21 00:00:00','2005-01-16 00:00:00','Resolved','This order was disputed and resolved on 2/1/2005. Customer claimed that container with shipment was damaged. FedEx\'s investigation proved this wrong.',205,'2005-01-12',1,1,2005), (10367,'S24_1937',23,'36.2900000',13,834.67,'2005-01-12 00:00:00','2005-01-21 00:00:00','2005-01-16 00:00:00','Resolved','This order was disputed and resolved on 2/1/2005. Customer claimed that container with shipment was damaged. FedEx\'s investigation proved this wrong.',205,'2005-01-12',1,1,2005), (10367,'S24_2022',28,'30.5900000',12,856.52,'2005-01-12 00:00:00','2005-01-21 00:00:00','2005-01-16 00:00:00','Resolved','This order was disputed and resolved on 2/1/2005. Customer claimed that container with shipment was damaged. FedEx\'s investigation proved this wrong.',205,'2005-01-12',1,1,2005), (10367,'S24_2972',36,'100.0000000',2,5018.4,'2005-01-12 00:00:00','2005-01-21 00:00:00','2005-01-16 00:00:00','Resolved','This order was disputed and resolved on 2/1/2005. Customer claimed that container with shipment was damaged. FedEx\'s investigation proved this wrong.',205,'2005-01-12',1,1,2005), (10368,'S24_2766',40,'100.0000000',2,4107.2,'2005-01-19 00:00:00','2005-01-27 00:00:00','2005-01-24 00:00:00','Shipped','Can we renegotiate this one?',124,'2005-01-19',1,1,2005), (10368,'S24_2887',31,'100.0000000',5,4223.13,'2005-01-19 00:00:00','2005-01-27 00:00:00','2005-01-24 00:00:00','Shipped','Can we renegotiate this one?',124,'2005-01-19',1,1,2005), (10368,'S24_3191',46,'79.6200000',1,3662.52,'2005-01-19 00:00:00','2005-01-27 00:00:00','2005-01-24 00:00:00','Shipped','Can we renegotiate this one?',124,'2005-01-19',1,1,2005), (10368,'S24_3432',20,'99.5800000',4,1991.6,'2005-01-19 00:00:00','2005-01-27 00:00:00','2005-01-24 00:00:00','Shipped','Can we renegotiate this one?',124,'2005-01-19',1,1,2005), (10368,'S24_3969',46,'37.3400000',3,1717.64,'2005-01-19 00:00:00','2005-01-27 00:00:00','2005-01-24 00:00:00','Shipped','Can we renegotiate this one?',124,'2005-01-19',1,1,2005), (10369,'S10_1949',41,'100.0000000',2,4514.92,'2005-01-20 00:00:00','2005-01-28 00:00:00','2005-01-24 00:00:00','Shipped',NULL,379,'2005-01-20',1,1,2005), (10369,'S18_1342',44,'100.0000000',8,9240.44,'2005-01-20 00:00:00','2005-01-28 00:00:00','2005-01-24 00:00:00','Shipped',NULL,379,'2005-01-20',1,1,2005), (10369,'S18_1367',32,'98.6300000',7,3156.16,'2005-01-20 00:00:00','2005-01-28 00:00:00','2005-01-24 00:00:00','Shipped',NULL,379,'2005-01-20',1,1,2005), (10369,'S18_2949',42,'100.0000000',1,4581.36,'2005-01-20 00:00:00','2005-01-28 00:00:00','2005-01-24 00:00:00','Shipped',NULL,379,'2005-01-20',1,1,2005), (10369,'S18_2957',28,'44.2100000',6,1237.88,'2005-01-20 00:00:00','2005-01-28 00:00:00','2005-01-24 00:00:00','Shipped',NULL,379,'2005-01-20',1,1,2005), (10369,'S18_3136',21,'94.2200000',5,1978.62,'2005-01-20 00:00:00','2005-01-28 00:00:00','2005-01-24 00:00:00','Shipped',NULL,379,'2005-01-20',1,1,2005), (10369,'S18_3320',45,'73.0800000',4,3288.6,'2005-01-20 00:00:00','2005-01-28 00:00:00','2005-01-24 00:00:00','Shipped',NULL,379,'2005-01-20',1,1,2005), (10369,'S24_4258',40,'86.9200000',3,3476.8,'2005-01-20 00:00:00','2005-01-28 00:00:00','2005-01-24 00:00:00','Shipped',NULL,379,'2005-01-20',1,1,2005), (10370,'S10_4962',35,'65.6300000',4,2297.05,'2005-01-20 00:00:00','2005-02-01 00:00:00','2005-01-25 00:00:00','Shipped',NULL,276,'2005-01-20',1,1,2005), (10370,'S12_1666',49,'100.0000000',8,8470.14,'2005-01-20 00:00:00','2005-02-01 00:00:00','2005-01-25 00:00:00','Shipped',NULL,276,'2005-01-20',1,1,2005), (10370,'S18_1097',27,'100.0000000',1,3911.49,'2005-01-20 00:00:00','2005-02-01 00:00:00','2005-01-25 00:00:00','Shipped',NULL,276,'2005-01-20',1,1,2005), (10370,'S18_2319',22,'100.0000000',5,3949,'2005-01-20 00:00:00','2005-02-01 00:00:00','2005-01-25 00:00:00','Shipped',NULL,276,'2005-01-20',1,1,2005), (10370,'S18_2432',22,'96.8600000',7,2130.92,'2005-01-20 00:00:00','2005-02-01 00:00:00','2005-01-25 00:00:00','Shipped',NULL,276,'2005-01-20',1,1,2005), (10370,'S18_3232',27,'56.8500000',9,1534.95,'2005-01-20 00:00:00','2005-02-01 00:00:00','2005-01-25 00:00:00','Shipped',NULL,276,'2005-01-20',1,1,2005), (10370,'S18_4600',29,'57.5300000',6,1668.37,'2005-01-20 00:00:00','2005-02-01 00:00:00','2005-01-25 00:00:00','Shipped',NULL,276,'2005-01-20',1,1,2005), (10370,'S18_4668',20,'100.0000000',2,2730,'2005-01-20 00:00:00','2005-02-01 00:00:00','2005-01-25 00:00:00','Shipped',NULL,276,'2005-01-20',1,1,2005), (10370,'S32_3522',25,'100.0000000',3,3160.25,'2005-01-20 00:00:00','2005-02-01 00:00:00','2005-01-25 00:00:00','Shipped',NULL,276,'2005-01-20',1,1,2005), (10371,'S12_1108',32,'100.0000000',6,3560.64,'2005-01-23 00:00:00','2005-02-03 00:00:00','2005-01-25 00:00:00','Shipped',NULL,124,'2005-01-23',1,1,2005), (10371,'S12_4473',49,'35.7100000',4,1749.79,'2005-01-23 00:00:00','2005-02-03 00:00:00','2005-01-25 00:00:00','Shipped',NULL,124,'2005-01-23',1,1,2005), (10371,'S18_2238',25,'100.0000000',7,2602.25,'2005-01-23 00:00:00','2005-02-03 00:00:00','2005-01-25 00:00:00','Shipped',NULL,124,'2005-01-23',1,1,2005), (10371,'S24_1444',25,'97.2700000',12,2431.75,'2005-01-23 00:00:00','2005-02-03 00:00:00','2005-01-25 00:00:00','Shipped',NULL,124,'2005-01-23',1,1,2005), (10371,'S24_2300',20,'100.0000000',5,3449.4,'2005-01-23 00:00:00','2005-02-03 00:00:00','2005-01-25 00:00:00','Shipped',NULL,124,'2005-01-23',1,1,2005), (10371,'S24_2840',45,'100.0000000',8,5545.8,'2005-01-23 00:00:00','2005-02-03 00:00:00','2005-01-25 00:00:00','Shipped',NULL,124,'2005-01-23',1,1,2005), (10371,'S24_4048',28,'50.3200000',9,1408.96,'2005-01-23 00:00:00','2005-02-03 00:00:00','2005-01-25 00:00:00','Shipped',NULL,124,'2005-01-23',1,1,2005), (10371,'S32_1268',26,'100.0000000',1,4044.04,'2005-01-23 00:00:00','2005-02-03 00:00:00','2005-01-25 00:00:00','Shipped',NULL,124,'2005-01-23',1,1,2005), (10371,'S32_2509',20,'66.4700000',2,1329.4,'2005-01-23 00:00:00','2005-02-03 00:00:00','2005-01-25 00:00:00','Shipped',NULL,124,'2005-01-23',1,1,2005), (10371,'S32_3207',30,'99.5500000',11,2986.5,'2005-01-23 00:00:00','2005-02-03 00:00:00','2005-01-25 00:00:00','Shipped',NULL,124,'2005-01-23',1,1,2005), (10371,'S50_1392',48,'56.5500000',10,2714.4,'2005-01-23 00:00:00','2005-02-03 00:00:00','2005-01-25 00:00:00','Shipped',NULL,124,'2005-01-23',1,1,2005), (10371,'S700_2824',34,'100.0000000',3,4301.34,'2005-01-23 00:00:00','2005-02-03 00:00:00','2005-01-25 00:00:00','Shipped',NULL,124,'2005-01-23',1,1,2005), (10372,'S12_3148',40,'100.0000000',4,5862,'2005-01-26 00:00:00','2005-02-05 00:00:00','2005-01-28 00:00:00','Shipped',NULL,398,'2005-01-26',1,1,2005), (10372,'S12_3891',34,'100.0000000',1,5941.5,'2005-01-26 00:00:00','2005-02-05 00:00:00','2005-01-28 00:00:00','Shipped',NULL,398,'2005-01-26',1,1,2005), (10372,'S18_3140',28,'100.0000000',3,3862.88,'2005-01-26 00:00:00','2005-02-05 00:00:00','2005-01-28 00:00:00','Shipped',NULL,398,'2005-01-26',1,1,2005), (10372,'S18_3259',25,'84.7100000',5,2117.75,'2005-01-26 00:00:00','2005-02-05 00:00:00','2005-01-28 00:00:00','Shipped',NULL,398,'2005-01-26',1,1,2005), (10372,'S18_4027',48,'100.0000000',6,7031.52,'2005-01-26 00:00:00','2005-02-05 00:00:00','2005-01-28 00:00:00','Shipped',NULL,398,'2005-01-26',1,1,2005), (10372,'S18_4522',41,'86.8900000',7,3562.49,'2005-01-26 00:00:00','2005-02-05 00:00:00','2005-01-28 00:00:00','Shipped',NULL,398,'2005-01-26',1,1,2005), (10372,'S24_2011',37,'100.0000000',8,3910.53,'2005-01-26 00:00:00','2005-02-05 00:00:00','2005-01-28 00:00:00','Shipped',NULL,398,'2005-01-26',1,1,2005), (10372,'S50_1514',24,'58.5800000',9,1405.92,'2005-01-26 00:00:00','2005-02-05 00:00:00','2005-01-28 00:00:00','Shipped',NULL,398,'2005-01-26',1,1,2005), (10372,'S700_1938',44,'100.0000000',2,4496.8,'2005-01-26 00:00:00','2005-02-05 00:00:00','2005-01-28 00:00:00','Shipped',NULL,398,'2005-01-26',1,1,2005), (10373,'S10_4757',39,'100.0000000',3,4046.25,'2005-01-31 00:00:00','2005-02-08 00:00:00','2005-02-06 00:00:00','Shipped',NULL,311,'2005-01-31',1,1,2005), (10373,'S18_1662',28,'57.5500000',4,1611.4,'2005-01-31 00:00:00','2005-02-08 00:00:00','2005-02-06 00:00:00','Shipped',NULL,311,'2005-01-31',1,1,2005), (10373,'S18_3029',22,'86.7400000',5,1908.28,'2005-01-31 00:00:00','2005-02-08 00:00:00','2005-02-06 00:00:00','Shipped',NULL,311,'2005-01-31',1,1,2005), (10373,'S18_3856',50,'60.4900000',6,3024.5,'2005-01-31 00:00:00','2005-02-08 00:00:00','2005-02-06 00:00:00','Shipped',NULL,311,'2005-01-31',1,1,2005), (10373,'S24_2841',38,'70.4400000',7,2676.72,'2005-01-31 00:00:00','2005-02-08 00:00:00','2005-02-06 00:00:00','Shipped',NULL,311,'2005-01-31',1,1,2005), (10373,'S24_3151',33,'57.3200000',12,1891.56,'2005-01-31 00:00:00','2005-02-08 00:00:00','2005-02-06 00:00:00','Shipped',NULL,311,'2005-01-31',1,1,2005); INSERT INTO `orderfact` (`ORDERNUMBER`,`PRODUCTCODE`,`QUANTITYORDERED`,`PRICEEACH`,`ORDERLINENUMBER`,`TOTALPRICE`,`ORDERDATE`,`REQUIREDDATE`,`SHIPPEDDATE`,`STATUS`,`COMMENTS`,`CUSTOMERNUMBER`,`TIME_ID`,`QTR_ID`,`MONTH_ID`,`YEAR_ID`) VALUES (10373,'S24_3420',46,'66.0000000',11,3036,'2005-01-31 00:00:00','2005-02-08 00:00:00','2005-02-06 00:00:00','Shipped',NULL,311,'2005-01-31',1,1,2005), (10373,'S24_3816',23,'100.0000000',10,2394.3,'2005-01-31 00:00:00','2005-02-08 00:00:00','2005-02-06 00:00:00','Shipped',NULL,311,'2005-01-31',1,1,2005), (10373,'S24_3949',39,'73.0000000',13,2847,'2005-01-31 00:00:00','2005-02-08 00:00:00','2005-02-06 00:00:00','Shipped',NULL,311,'2005-01-31',1,1,2005), (10373,'S700_1138',44,'100.0000000',14,4627.92,'2005-01-31 00:00:00','2005-02-08 00:00:00','2005-02-06 00:00:00','Shipped',NULL,311,'2005-01-31',1,1,2005), (10373,'S700_2047',32,'84.4100000',15,2701.12,'2005-01-31 00:00:00','2005-02-08 00:00:00','2005-02-06 00:00:00','Shipped',NULL,311,'2005-01-31',1,1,2005), (10373,'S700_2610',41,'70.3300000',16,2883.53,'2005-01-31 00:00:00','2005-02-08 00:00:00','2005-02-06 00:00:00','Shipped',NULL,311,'2005-01-31',1,1,2005), (10373,'S700_3505',34,'96.3400000',2,3275.56,'2005-01-31 00:00:00','2005-02-08 00:00:00','2005-02-06 00:00:00','Shipped',NULL,311,'2005-01-31',1,1,2005), (10373,'S700_3962',37,'100.0000000',8,4025.6,'2005-01-31 00:00:00','2005-02-08 00:00:00','2005-02-06 00:00:00','Shipped',NULL,311,'2005-01-31',1,1,2005), (10373,'S700_4002',45,'55.6200000',17,2502.9,'2005-01-31 00:00:00','2005-02-08 00:00:00','2005-02-06 00:00:00','Shipped',NULL,311,'2005-01-31',1,1,2005), (10373,'S72_1253',25,'64.9700000',9,1624.25,'2005-01-31 00:00:00','2005-02-08 00:00:00','2005-02-06 00:00:00','Shipped',NULL,311,'2005-01-31',1,1,2005), (10373,'S72_3212',29,'100.0000000',1,3978.51,'2005-01-31 00:00:00','2005-02-08 00:00:00','2005-02-06 00:00:00','Shipped',NULL,311,'2005-01-31',1,1,2005), (10374,'S10_2016',39,'100.0000000',5,5288.01,'2005-02-02 00:00:00','2005-02-09 00:00:00','2005-02-03 00:00:00','Shipped',NULL,333,'2005-02-02',1,2,2005), (10374,'S10_4698',22,'100.0000000',1,3834.38,'2005-02-02 00:00:00','2005-02-09 00:00:00','2005-02-03 00:00:00','Shipped',NULL,333,'2005-02-02',1,2,2005), (10374,'S18_2581',42,'69.2700000',2,2909.34,'2005-02-02 00:00:00','2005-02-09 00:00:00','2005-02-03 00:00:00','Shipped',NULL,333,'2005-02-02',1,2,2005), (10374,'S18_2625',22,'53.3000000',4,1172.6,'2005-02-02 00:00:00','2005-02-09 00:00:00','2005-02-03 00:00:00','Shipped',NULL,333,'2005-02-02',1,2,2005), (10374,'S24_1578',38,'100.0000000',6,4197.1,'2005-02-02 00:00:00','2005-02-09 00:00:00','2005-02-03 00:00:00','Shipped',NULL,333,'2005-02-02',1,2,2005), (10374,'S24_1785',46,'94.1000000',3,4328.6,'2005-02-02 00:00:00','2005-02-09 00:00:00','2005-02-03 00:00:00','Shipped',NULL,333,'2005-02-02',1,2,2005), (10375,'S10_1678',21,'34.9100000',12,733.11,'2005-02-03 00:00:00','2005-02-10 00:00:00','2005-02-06 00:00:00','Shipped',NULL,119,'2005-02-03',1,2,2005), (10375,'S12_1099',45,'76.0000000',7,3420,'2005-02-03 00:00:00','2005-02-10 00:00:00','2005-02-06 00:00:00','Shipped',NULL,119,'2005-02-03',1,2,2005), (10375,'S12_2823',49,'78.9200000',13,3867.08,'2005-02-03 00:00:00','2005-02-10 00:00:00','2005-02-06 00:00:00','Shipped',NULL,119,'2005-02-03',1,2,2005), (10375,'S24_2000',23,'100.0000000',9,2443.29,'2005-02-03 00:00:00','2005-02-10 00:00:00','2005-02-06 00:00:00','Shipped',NULL,119,'2005-02-03',1,2,2005), (10375,'S24_2360',20,'100.0000000',14,2046,'2005-02-03 00:00:00','2005-02-10 00:00:00','2005-02-06 00:00:00','Shipped',NULL,119,'2005-02-03',1,2,2005), (10375,'S24_4278',43,'100.0000000',2,10039.6,'2005-02-03 00:00:00','2005-02-10 00:00:00','2005-02-06 00:00:00','Shipped',NULL,119,'2005-02-03',1,2,2005), (10375,'S32_1374',37,'100.0000000',3,6353.27,'2005-02-03 00:00:00','2005-02-10 00:00:00','2005-02-06 00:00:00','Shipped',NULL,119,'2005-02-03',1,2,2005), (10375,'S32_4289',44,'82.2600000',4,3619.44,'2005-02-03 00:00:00','2005-02-10 00:00:00','2005-02-06 00:00:00','Shipped',NULL,119,'2005-02-03',1,2,2005), (10375,'S32_4485',41,'100.0000000',15,4701.88,'2005-02-03 00:00:00','2005-02-10 00:00:00','2005-02-06 00:00:00','Shipped',NULL,119,'2005-02-03',1,2,2005), (10375,'S50_1341',49,'65.8000000',5,3224.2,'2005-02-03 00:00:00','2005-02-10 00:00:00','2005-02-06 00:00:00','Shipped',NULL,119,'2005-02-03',1,2,2005), (10375,'S50_4713',49,'100.0000000',8,5406.66,'2005-02-03 00:00:00','2005-02-10 00:00:00','2005-02-06 00:00:00','Shipped',NULL,119,'2005-02-03',1,2,2005), (10375,'S700_1691',37,'81.8700000',6,3029.19,'2005-02-03 00:00:00','2005-02-10 00:00:00','2005-02-06 00:00:00','Shipped',NULL,119,'2005-02-03',1,2,2005), (10375,'S700_2466',33,'100.0000000',1,3856.71,'2005-02-03 00:00:00','2005-02-10 00:00:00','2005-02-06 00:00:00','Shipped',NULL,119,'2005-02-03',1,2,2005), (10375,'S700_2834',25,'66.7300000',10,1668.25,'2005-02-03 00:00:00','2005-02-10 00:00:00','2005-02-06 00:00:00','Shipped',NULL,119,'2005-02-03',1,2,2005), (10375,'S700_3167',44,'100.0000000',11,5208.72,'2005-02-03 00:00:00','2005-02-10 00:00:00','2005-02-06 00:00:00','Shipped',NULL,119,'2005-02-03',1,2,2005), (10376,'S12_3380',35,'100.0000000',1,3987.2,'2005-02-08 00:00:00','2005-02-18 00:00:00','2005-02-13 00:00:00','Shipped',NULL,219,'2005-02-08',1,2,2005), (10377,'S12_3990',24,'67.8300000',5,1627.92,'2005-02-09 00:00:00','2005-02-21 00:00:00','2005-02-12 00:00:00','Shipped','Cautious optimism. We have happy customers here, if we can keep them well stocked. I need all the information I can get on the planned shippments of Porches',186,'2005-02-09',1,2,2005), (10377,'S12_4675',50,'100.0000000',1,5182,'2005-02-09 00:00:00','2005-02-21 00:00:00','2005-02-12 00:00:00','Shipped','Cautious optimism. We have happy customers here, if we can keep them well stocked. I need all the information I can get on the planned shippments of Porches',186,'2005-02-09',1,2,2005), (10377,'S18_1129',35,'100.0000000',2,5895.05,'2005-02-09 00:00:00','2005-02-21 00:00:00','2005-02-12 00:00:00','Shipped','Cautious optimism. We have happy customers here, if we can keep them well stocked. I need all the information I can get on the planned shippments of Porches',186,'2005-02-09',1,2,2005), (10377,'S18_1889',31,'67.7600000',4,2100.56,'2005-02-09 00:00:00','2005-02-21 00:00:00','2005-02-12 00:00:00','Shipped','Cautious optimism. We have happy customers here, if we can keep them well stocked. I need all the information I can get on the planned shippments of Porches',186,'2005-02-09',1,2,2005), (10377,'S18_1984',36,'100.0000000',6,4352.76,'2005-02-09 00:00:00','2005-02-21 00:00:00','2005-02-12 00:00:00','Shipped','Cautious optimism. We have happy customers here, if we can keep them well stocked. I need all the information I can get on the planned shippments of Porches',186,'2005-02-09',1,2,2005), (10377,'S18_3232',39,'100.0000000',3,7264.53,'2005-02-09 00:00:00','2005-02-21 00:00:00','2005-02-12 00:00:00','Shipped','Cautious optimism. We have happy customers here, if we can keep them well stocked. I need all the information I can get on the planned shippments of Porches',186,'2005-02-09',1,2,2005), (10378,'S18_1589',34,'42.6400000',5,1449.76,'2005-02-10 00:00:00','2005-02-18 00:00:00','2005-02-11 00:00:00','Shipped',NULL,141,'2005-02-10',1,2,2005), (10378,'S18_3278',22,'100.0000000',4,2464,'2005-02-10 00:00:00','2005-02-18 00:00:00','2005-02-11 00:00:00','Shipped',NULL,141,'2005-02-10',1,2,2005), (10378,'S18_3482',43,'96.4900000',10,4149.07,'2005-02-10 00:00:00','2005-02-18 00:00:00','2005-02-11 00:00:00','Shipped',NULL,141,'2005-02-10',1,2,2005), (10378,'S18_3782',28,'100.0000000',9,4609.64,'2005-02-10 00:00:00','2005-02-18 00:00:00','2005-02-11 00:00:00','Shipped',NULL,141,'2005-02-10',1,2,2005), (10378,'S18_4721',49,'67.1400000',8,3289.86,'2005-02-10 00:00:00','2005-02-18 00:00:00','2005-02-11 00:00:00','Shipped',NULL,141,'2005-02-10',1,2,2005), (10378,'S24_2972',41,'100.0000000',7,5856.85,'2005-02-10 00:00:00','2005-02-18 00:00:00','2005-02-11 00:00:00','Shipped',NULL,141,'2005-02-10',1,2,2005), (10378,'S24_3371',46,'41.5400000',6,1910.84,'2005-02-10 00:00:00','2005-02-18 00:00:00','2005-02-11 00:00:00','Shipped',NULL,141,'2005-02-10',1,2,2005), (10378,'S24_3856',33,'53.2700000',3,1757.91,'2005-02-10 00:00:00','2005-02-18 00:00:00','2005-02-11 00:00:00','Shipped',NULL,141,'2005-02-10',1,2,2005), (10378,'S24_4620',41,'100.0000000',2,4894.17,'2005-02-10 00:00:00','2005-02-18 00:00:00','2005-02-11 00:00:00','Shipped',NULL,141,'2005-02-10',1,2,2005), (10378,'S32_2206',40,'82.4600000',1,3298.4,'2005-02-10 00:00:00','2005-02-18 00:00:00','2005-02-11 00:00:00','Shipped',NULL,141,'2005-02-10',1,2,2005), (10379,'S18_1749',39,'100.0000000',2,5399.55,'2005-02-10 00:00:00','2005-02-18 00:00:00','2005-02-11 00:00:00','Shipped',NULL,141,'2005-02-10',1,2,2005), (10379,'S18_2248',27,'49.3000000',1,1331.1,'2005-02-10 00:00:00','2005-02-18 00:00:00','2005-02-11 00:00:00','Shipped',NULL,141,'2005-02-10',1,2,2005), (10379,'S18_2870',29,'100.0000000',5,5127.2,'2005-02-10 00:00:00','2005-02-18 00:00:00','2005-02-11 00:00:00','Shipped',NULL,141,'2005-02-10',1,2,2005), (10379,'S18_3685',32,'70.8300000',4,2266.56,'2005-02-10 00:00:00','2005-02-18 00:00:00','2005-02-11 00:00:00','Shipped',NULL,141,'2005-02-10',1,2,2005), (10379,'S24_1628',32,'100.0000000',3,3970.56,'2005-02-10 00:00:00','2005-02-18 00:00:00','2005-02-11 00:00:00','Shipped',NULL,141,'2005-02-10',1,2,2005), (10380,'S18_1342',27,'93.1600000',13,2515.32,'2005-02-16 00:00:00','2005-02-24 00:00:00','2005-02-18 00:00:00','Shipped',NULL,141,'2005-02-16',1,2,2005), (10380,'S18_2325',40,'100.0000000',10,4931.6,'2005-02-16 00:00:00','2005-02-24 00:00:00','2005-02-18 00:00:00','Shipped',NULL,141,'2005-02-16',1,2,2005), (10380,'S18_2795',21,'47.1800000',8,990.78,'2005-02-16 00:00:00','2005-02-24 00:00:00','2005-02-18 00:00:00','Shipped',NULL,141,'2005-02-16',1,2,2005), (10380,'S18_4409',32,'100.0000000',1,3376.64,'2005-02-16 00:00:00','2005-02-24 00:00:00','2005-02-18 00:00:00','Shipped',NULL,141,'2005-02-16',1,2,2005), (10380,'S18_4933',24,'100.0000000',2,4536,'2005-02-16 00:00:00','2005-02-24 00:00:00','2005-02-18 00:00:00','Shipped',NULL,141,'2005-02-16',1,2,2005), (10380,'S24_1046',34,'100.0000000',3,3441.82,'2005-02-16 00:00:00','2005-02-24 00:00:00','2005-02-18 00:00:00','Shipped',NULL,141,'2005-02-16',1,2,2005), (10380,'S24_1937',32,'70.5600000',4,2257.92,'2005-02-16 00:00:00','2005-02-24 00:00:00','2005-02-18 00:00:00','Shipped',NULL,141,'2005-02-16',1,2,2005), (10380,'S24_2022',27,'68.3500000',5,1845.45,'2005-02-16 00:00:00','2005-02-24 00:00:00','2005-02-18 00:00:00','Shipped',NULL,141,'2005-02-16',1,2,2005), (10380,'S24_2766',36,'37.5000000',6,1350,'2005-02-16 00:00:00','2005-02-24 00:00:00','2005-02-18 00:00:00','Shipped',NULL,141,'2005-02-16',1,2,2005), (10380,'S24_2887',44,'36.2900000',7,1596.76,'2005-02-16 00:00:00','2005-02-24 00:00:00','2005-02-18 00:00:00','Shipped',NULL,141,'2005-02-16',1,2,2005), (10380,'S24_3191',44,'79.0600000',9,3478.64,'2005-02-16 00:00:00','2005-02-24 00:00:00','2005-02-18 00:00:00','Shipped',NULL,141,'2005-02-16',1,2,2005), (10380,'S24_3432',34,'100.0000000',11,3953.18,'2005-02-16 00:00:00','2005-02-24 00:00:00','2005-02-18 00:00:00','Shipped',NULL,141,'2005-02-16',1,2,2005), (10380,'S24_3969',43,'95.0300000',12,4086.29,'2005-02-16 00:00:00','2005-02-24 00:00:00','2005-02-18 00:00:00','Shipped',NULL,141,'2005-02-16',1,2,2005), (10381,'S10_1949',36,'100.0000000',3,8254.8,'2005-02-17 00:00:00','2005-02-25 00:00:00','2005-02-18 00:00:00','Shipped',NULL,321,'2005-02-17',1,2,2005), (10381,'S10_4962',37,'100.0000000',6,6231.54,'2005-02-17 00:00:00','2005-02-25 00:00:00','2005-02-18 00:00:00','Shipped',NULL,321,'2005-02-17',1,2,2005), (10381,'S12_1666',20,'100.0000000',1,2952,'2005-02-17 00:00:00','2005-02-25 00:00:00','2005-02-18 00:00:00','Shipped',NULL,321,'2005-02-17',1,2,2005), (10381,'S18_1097',48,'98.0000000',2,4704,'2005-02-17 00:00:00','2005-02-25 00:00:00','2005-02-18 00:00:00','Shipped',NULL,321,'2005-02-17',1,2,2005), (10381,'S18_1367',25,'52.8300000',9,1320.75,'2005-02-17 00:00:00','2005-02-25 00:00:00','2005-02-18 00:00:00','Shipped',NULL,321,'2005-02-17',1,2,2005), (10381,'S18_2432',35,'48.6200000',7,1701.7,'2005-02-17 00:00:00','2005-02-25 00:00:00','2005-02-18 00:00:00','Shipped',NULL,321,'2005-02-17',1,2,2005), (10381,'S18_2949',41,'100.0000000',8,4319.76,'2005-02-17 00:00:00','2005-02-25 00:00:00','2005-02-18 00:00:00','Shipped',NULL,321,'2005-02-17',1,2,2005), (10381,'S18_2957',40,'68.0800000',4,2723.2,'2005-02-17 00:00:00','2005-02-25 00:00:00','2005-02-18 00:00:00','Shipped',NULL,321,'2005-02-17',1,2,2005), (10381,'S18_3136',35,'100.0000000',5,4288.2,'2005-02-17 00:00:00','2005-02-25 00:00:00','2005-02-18 00:00:00','Shipped',NULL,321,'2005-02-17',1,2,2005), (10382,'S12_1108',34,'100.0000000',10,3823.64,'2005-02-17 00:00:00','2005-02-23 00:00:00','2005-02-18 00:00:00','Shipped','Custom shipping instructions sent to warehouse',124,'2005-02-17',1,2,2005), (10382,'S12_3148',37,'100.0000000',11,4071.85,'2005-02-17 00:00:00','2005-02-23 00:00:00','2005-02-18 00:00:00','Shipped','Custom shipping instructions sent to warehouse',124,'2005-02-17',1,2,2005), (10382,'S12_3891',34,'95.3500000',12,3241.9,'2005-02-17 00:00:00','2005-02-23 00:00:00','2005-02-18 00:00:00','Shipped','Custom shipping instructions sent to warehouse',124,'2005-02-17',1,2,2005), (10382,'S12_4473',32,'66.5800000',13,2130.56,'2005-02-17 00:00:00','2005-02-23 00:00:00','2005-02-18 00:00:00','Shipped','Custom shipping instructions sent to warehouse',124,'2005-02-17',1,2,2005), (10382,'S18_2238',25,'88.0000000',5,2200,'2005-02-17 00:00:00','2005-02-23 00:00:00','2005-02-18 00:00:00','Shipped','Custom shipping instructions sent to warehouse',124,'2005-02-17',1,2,2005), (10382,'S18_3320',50,'100.0000000',7,8935.5,'2005-02-17 00:00:00','2005-02-23 00:00:00','2005-02-18 00:00:00','Shipped','Custom shipping instructions sent to warehouse',124,'2005-02-17',1,2,2005), (10382,'S18_4600',39,'100.0000000',1,4890.6,'2005-02-17 00:00:00','2005-02-23 00:00:00','2005-02-18 00:00:00','Shipped','Custom shipping instructions sent to warehouse',124,'2005-02-17',1,2,2005), (10382,'S18_4668',39,'100.0000000',2,7827.3,'2005-02-17 00:00:00','2005-02-23 00:00:00','2005-02-18 00:00:00','Shipped','Custom shipping instructions sent to warehouse',124,'2005-02-17',1,2,2005), (10382,'S24_2300',20,'100.0000000',3,2654.4,'2005-02-17 00:00:00','2005-02-23 00:00:00','2005-02-18 00:00:00','Shipped','Custom shipping instructions sent to warehouse',124,'2005-02-17',1,2,2005), (10382,'S24_4258',33,'100.0000000',4,4592.61,'2005-02-17 00:00:00','2005-02-23 00:00:00','2005-02-18 00:00:00','Shipped','Custom shipping instructions sent to warehouse',124,'2005-02-17',1,2,2005), (10382,'S32_1268',26,'100.0000000',6,2708.42,'2005-02-17 00:00:00','2005-02-23 00:00:00','2005-02-18 00:00:00','Shipped','Custom shipping instructions sent to warehouse',124,'2005-02-17',1,2,2005), (10382,'S32_3522',48,'100.0000000',8,6799.68,'2005-02-17 00:00:00','2005-02-23 00:00:00','2005-02-18 00:00:00','Shipped','Custom shipping instructions sent to warehouse',124,'2005-02-17',1,2,2005), (10382,'S700_2824',34,'54.8400000',9,1864.56,'2005-02-17 00:00:00','2005-02-23 00:00:00','2005-02-18 00:00:00','Shipped','Custom shipping instructions sent to warehouse',124,'2005-02-17',1,2,2005), (10383,'S18_2319',27,'100.0000000',11,3843.99,'2005-02-22 00:00:00','2005-03-02 00:00:00','2005-02-25 00:00:00','Shipped',NULL,141,'2005-02-22',1,2,2005), (10383,'S18_3140',24,'61.5200000',9,1476.48,'2005-02-22 00:00:00','2005-03-02 00:00:00','2005-02-25 00:00:00','Shipped',NULL,141,'2005-02-22',1,2,2005), (10383,'S18_3232',47,'100.0000000',6,6869.05,'2005-02-22 00:00:00','2005-03-02 00:00:00','2005-02-25 00:00:00','Shipped',NULL,141,'2005-02-22',1,2,2005), (10383,'S18_3259',26,'100.0000000',12,3340.48,'2005-02-22 00:00:00','2005-03-02 00:00:00','2005-02-25 00:00:00','Shipped',NULL,141,'2005-02-22',1,2,2005), (10383,'S18_4027',38,'100.0000000',1,5340.9,'2005-02-22 00:00:00','2005-03-02 00:00:00','2005-02-25 00:00:00','Shipped',NULL,141,'2005-02-22',1,2,2005), (10383,'S18_4522',28,'58.5800000',7,1640.24,'2005-02-22 00:00:00','2005-03-02 00:00:00','2005-02-25 00:00:00','Shipped',NULL,141,'2005-02-22',1,2,2005), (10383,'S24_1444',22,'91.7600000',2,2018.72,'2005-02-22 00:00:00','2005-03-02 00:00:00','2005-02-25 00:00:00','Shipped',NULL,141,'2005-02-22',1,2,2005), (10383,'S24_2840',40,'100.0000000',3,6089.6,'2005-02-22 00:00:00','2005-03-02 00:00:00','2005-02-25 00:00:00','Shipped',NULL,141,'2005-02-22',1,2,2005), (10383,'S24_4048',21,'93.9100000',4,1972.11,'2005-02-22 00:00:00','2005-03-02 00:00:00','2005-02-25 00:00:00','Shipped',NULL,141,'2005-02-22',1,2,2005), (10383,'S32_2509',32,'53.1800000',5,1701.76,'2005-02-22 00:00:00','2005-03-02 00:00:00','2005-02-25 00:00:00','Shipped',NULL,141,'2005-02-22',1,2,2005), (10383,'S32_3207',44,'36.0700000',8,1587.08,'2005-02-22 00:00:00','2005-03-02 00:00:00','2005-02-25 00:00:00','Shipped',NULL,141,'2005-02-22',1,2,2005), (10383,'S50_1392',29,'100.0000000',13,3087.05,'2005-02-22 00:00:00','2005-03-02 00:00:00','2005-02-25 00:00:00','Shipped',NULL,141,'2005-02-22',1,2,2005), (10383,'S50_1514',38,'60.0600000',10,2282.28,'2005-02-22 00:00:00','2005-03-02 00:00:00','2005-02-25 00:00:00','Shipped',NULL,141,'2005-02-22',1,2,2005), (10384,'S10_4757',34,'100.0000000',4,4846.7,'2005-02-23 00:00:00','2005-03-06 00:00:00','2005-02-27 00:00:00','Shipped',NULL,321,'2005-02-23',1,2,2005), (10384,'S24_2011',28,'80.5400000',3,2255.12,'2005-02-23 00:00:00','2005-03-06 00:00:00','2005-02-27 00:00:00','Shipped',NULL,321,'2005-02-23',1,2,2005), (10384,'S24_3151',43,'97.8700000',2,4208.41,'2005-02-23 00:00:00','2005-03-06 00:00:00','2005-02-27 00:00:00','Shipped',NULL,321,'2005-02-23',1,2,2005), (10384,'S700_1938',49,'100.0000000',1,6397.44,'2005-02-23 00:00:00','2005-03-06 00:00:00','2005-02-27 00:00:00','Shipped',NULL,321,'2005-02-23',1,2,2005), (10385,'S24_3816',37,'85.5400000',2,3164.98,'2005-02-28 00:00:00','2005-03-09 00:00:00','2005-03-01 00:00:00','Shipped',NULL,124,'2005-02-28',1,2,2005), (10385,'S700_1138',25,'77.3400000',1,1933.5,'2005-02-28 00:00:00','2005-03-09 00:00:00','2005-03-01 00:00:00','Shipped',NULL,124,'2005-02-28',1,2,2005), (10386,'S18_1662',25,'54.5700000',7,1364.25,'2005-03-01 00:00:00','2005-03-09 00:00:00','2005-03-06 00:00:00','Resolved','Disputed then Resolved on 3/15/2005. Customer doesn\'t like the craftsmaship of the models.',141,'2005-03-01',1,3,2005), (10386,'S18_2581',21,'74.7700000',18,1570.17,'2005-03-01 00:00:00','2005-03-09 00:00:00','2005-03-06 00:00:00','Resolved','Disputed then Resolved on 3/15/2005. Customer doesn\'t like the craftsmaship of the models.',141,'2005-03-01',1,3,2005), (10386,'S18_3029',37,'93.0100000',5,3441.37,'2005-03-01 00:00:00','2005-03-09 00:00:00','2005-03-06 00:00:00','Resolved','Disputed then Resolved on 3/15/2005. Customer doesn\'t like the craftsmaship of the models.',141,'2005-03-01',1,3,2005), (10386,'S18_3856',22,'57.5500000',6,1266.1,'2005-03-01 00:00:00','2005-03-09 00:00:00','2005-03-06 00:00:00','Resolved','Disputed then Resolved on 3/15/2005. Customer doesn\'t like the craftsmaship of the models.',141,'2005-03-01',1,3,2005), (10386,'S24_1785',33,'41.7100000',11,1376.43,'2005-03-01 00:00:00','2005-03-09 00:00:00','2005-03-06 00:00:00','Resolved','Disputed then Resolved on 3/15/2005. Customer doesn\'t like the craftsmaship of the models.',141,'2005-03-01',1,3,2005), (10386,'S24_2841',39,'55.9600000',1,2182.44,'2005-03-01 00:00:00','2005-03-09 00:00:00','2005-03-06 00:00:00','Resolved','Disputed then Resolved on 3/15/2005. Customer doesn\'t like the craftsmaship of the models.',141,'2005-03-01',1,3,2005), (10386,'S24_3420',35,'63.7600000',9,2231.6,'2005-03-01 00:00:00','2005-03-09 00:00:00','2005-03-06 00:00:00','Resolved','Disputed then Resolved on 3/15/2005. Customer doesn\'t like the craftsmaship of the models.',141,'2005-03-01',1,3,2005), (10386,'S24_3949',41,'73.3200000',12,3006.12,'2005-03-01 00:00:00','2005-03-09 00:00:00','2005-03-06 00:00:00','Resolved','Disputed then Resolved on 3/15/2005. Customer doesn\'t like the craftsmaship of the models.',141,'2005-03-01',1,3,2005), (10386,'S24_4278',50,'63.3400000',8,3167,'2005-03-01 00:00:00','2005-03-09 00:00:00','2005-03-06 00:00:00','Resolved','Disputed then Resolved on 3/15/2005. Customer doesn\'t like the craftsmaship of the models.',141,'2005-03-01',1,3,2005), (10386,'S700_2047',29,'85.7600000',13,2487.04,'2005-03-01 00:00:00','2005-03-09 00:00:00','2005-03-06 00:00:00','Resolved','Disputed then Resolved on 3/15/2005. Customer doesn\'t like the craftsmaship of the models.',141,'2005-03-01',1,3,2005), (10386,'S700_2466',37,'83.8400000',14,3102.08,'2005-03-01 00:00:00','2005-03-09 00:00:00','2005-03-06 00:00:00','Resolved','Disputed then Resolved on 3/15/2005. Customer doesn\'t like the craftsmaship of the models.',141,'2005-03-01',1,3,2005), (10386,'S700_2610',37,'100.0000000',10,5017.57,'2005-03-01 00:00:00','2005-03-09 00:00:00','2005-03-06 00:00:00','Resolved','Disputed then Resolved on 3/15/2005. Customer doesn\'t like the craftsmaship of the models.',141,'2005-03-01',1,3,2005), (10386,'S700_3167',32,'94.3400000',17,3018.88,'2005-03-01 00:00:00','2005-03-09 00:00:00','2005-03-06 00:00:00','Resolved','Disputed then Resolved on 3/15/2005. Customer doesn\'t like the craftsmaship of the models.',141,'2005-03-01',1,3,2005), (10386,'S700_3505',45,'92.0800000',2,4143.6,'2005-03-01 00:00:00','2005-03-09 00:00:00','2005-03-06 00:00:00','Resolved','Disputed then Resolved on 3/15/2005. Customer doesn\'t like the craftsmaship of the models.',141,'2005-03-01',1,3,2005), (10386,'S700_3962',30,'95.4800000',3,2864.4,'2005-03-01 00:00:00','2005-03-09 00:00:00','2005-03-06 00:00:00','Resolved','Disputed then Resolved on 3/15/2005. Customer doesn\'t like the craftsmaship of the models.',141,'2005-03-01',1,3,2005), (10386,'S700_4002',44,'86.4000000',15,3801.6,'2005-03-01 00:00:00','2005-03-09 00:00:00','2005-03-06 00:00:00','Resolved','Disputed then Resolved on 3/15/2005. Customer doesn\'t like the craftsmaship of the models.',141,'2005-03-01',1,3,2005), (10386,'S72_1253',50,'87.1500000',16,4357.5,'2005-03-01 00:00:00','2005-03-09 00:00:00','2005-03-06 00:00:00','Resolved','Disputed then Resolved on 3/15/2005. Customer doesn\'t like the craftsmaship of the models.',141,'2005-03-01',1,3,2005), (10386,'S72_3212',43,'100.0000000',4,5417.57,'2005-03-01 00:00:00','2005-03-09 00:00:00','2005-03-06 00:00:00','Resolved','Disputed then Resolved on 3/15/2005. Customer doesn\'t like the craftsmaship of the models.',141,'2005-03-01',1,3,2005), (10387,'S32_1374',44,'94.9000000',1,4175.6,'2005-03-02 00:00:00','2005-03-09 00:00:00','2005-03-06 00:00:00','Shipped','We need to keep in close contact with their Marketing VP. He is the decision maker for all their purchases.',148,'2005-03-02',1,3,2005), (10388,'S10_1678',42,'76.3600000',4,3207.12,'2005-03-03 00:00:00','2005-03-11 00:00:00','2005-03-09 00:00:00','Shipped',NULL,462,'2005-03-03',1,3,2005), (10388,'S10_2016',50,'44.5100000',5,2225.5,'2005-03-03 00:00:00','2005-03-11 00:00:00','2005-03-09 00:00:00','Shipped',NULL,462,'2005-03-03',1,3,2005), (10388,'S10_4698',21,'86.7700000',7,1822.17,'2005-03-03 00:00:00','2005-03-11 00:00:00','2005-03-09 00:00:00','Shipped',NULL,462,'2005-03-03',1,3,2005), (10388,'S12_2823',44,'100.0000000',6,5951.44,'2005-03-03 00:00:00','2005-03-11 00:00:00','2005-03-09 00:00:00','Shipped',NULL,462,'2005-03-03',1,3,2005), (10388,'S32_4289',35,'100.0000000',8,3918.95,'2005-03-03 00:00:00','2005-03-11 00:00:00','2005-03-09 00:00:00','Shipped',NULL,462,'2005-03-03',1,3,2005), (10388,'S50_1341',27,'100.0000000',1,3211.38,'2005-03-03 00:00:00','2005-03-11 00:00:00','2005-03-09 00:00:00','Shipped',NULL,462,'2005-03-03',1,3,2005), (10388,'S700_1691',46,'100.0000000',2,10066.6,'2005-03-03 00:00:00','2005-03-11 00:00:00','2005-03-09 00:00:00','Shipped',NULL,462,'2005-03-03',1,3,2005), (10388,'S700_2834',50,'100.0000000',3,7154.5,'2005-03-03 00:00:00','2005-03-11 00:00:00','2005-03-09 00:00:00','Shipped',NULL,462,'2005-03-03',1,3,2005), (10389,'S12_1099',26,'99.0400000',4,2575.04,'2005-03-03 00:00:00','2005-03-09 00:00:00','2005-03-08 00:00:00','Shipped',NULL,448,'2005-03-03',1,3,2005), (10389,'S12_3380',25,'72.3800000',6,1809.5,'2005-03-03 00:00:00','2005-03-09 00:00:00','2005-03-08 00:00:00','Shipped',NULL,448,'2005-03-03',1,3,2005), (10389,'S12_3990',36,'70.2600000',7,2529.36,'2005-03-03 00:00:00','2005-03-09 00:00:00','2005-03-08 00:00:00','Shipped',NULL,448,'2005-03-03',1,3,2005), (10389,'S12_4675',47,'100.0000000',8,5243.79,'2005-03-03 00:00:00','2005-03-09 00:00:00','2005-03-08 00:00:00','Shipped',NULL,448,'2005-03-03',1,3,2005), (10389,'S18_1889',49,'79.2200000',3,3881.78,'2005-03-03 00:00:00','2005-03-09 00:00:00','2005-03-08 00:00:00','Shipped',NULL,448,'2005-03-03',1,3,2005), (10389,'S18_2625',39,'100.0000000',5,6981,'2005-03-03 00:00:00','2005-03-09 00:00:00','2005-03-08 00:00:00','Shipped',NULL,448,'2005-03-03',1,3,2005), (10389,'S24_1578',45,'100.0000000',1,4597.65,'2005-03-03 00:00:00','2005-03-09 00:00:00','2005-03-08 00:00:00','Shipped',NULL,448,'2005-03-03',1,3,2005), (10389,'S24_2000',49,'81.4000000',2,3988.6,'2005-03-03 00:00:00','2005-03-09 00:00:00','2005-03-08 00:00:00','Shipped',NULL,448,'2005-03-03',1,3,2005), (10390,'S18_1129',36,'93.7700000',14,3375.72,'2005-03-04 00:00:00','2005-03-11 00:00:00','2005-03-07 00:00:00','Shipped','They want to reevaluate their terms agreement with Finance.',124,'2005-03-04',1,3,2005), (10390,'S18_1984',34,'43.0500000',15,1463.7,'2005-03-04 00:00:00','2005-03-11 00:00:00','2005-03-07 00:00:00','Shipped','They want to reevaluate their terms agreement with Finance.',124,'2005-03-04',1,3,2005), (10390,'S18_2325',31,'98.9900000',16,3068.69,'2005-03-04 00:00:00','2005-03-11 00:00:00','2005-03-07 00:00:00','Shipped','They want to reevaluate their terms agreement with Finance.',124,'2005-03-04',1,3,2005), (10390,'S18_2795',26,'78.1100000',7,2030.86,'2005-03-04 00:00:00','2005-03-11 00:00:00','2005-03-07 00:00:00','Shipped','They want to reevaluate their terms agreement with Finance.',124,'2005-03-04',1,3,2005), (10390,'S18_3278',40,'100.0000000',9,5491.6,'2005-03-04 00:00:00','2005-03-11 00:00:00','2005-03-07 00:00:00','Shipped','They want to reevaluate their terms agreement with Finance.',124,'2005-03-04',1,3,2005), (10390,'S18_3482',50,'100.0000000',1,7397,'2005-03-04 00:00:00','2005-03-11 00:00:00','2005-03-07 00:00:00','Shipped','They want to reevaluate their terms agreement with Finance.',124,'2005-03-04',1,3,2005), (10390,'S18_3782',36,'100.0000000',2,5079.96,'2005-03-04 00:00:00','2005-03-11 00:00:00','2005-03-07 00:00:00','Shipped','They want to reevaluate their terms agreement with Finance.',124,'2005-03-04',1,3,2005), (10390,'S18_4721',49,'100.0000000',3,6862.94,'2005-03-04 00:00:00','2005-03-11 00:00:00','2005-03-07 00:00:00','Shipped','They want to reevaluate their terms agreement with Finance.',124,'2005-03-04',1,3,2005), (10390,'S24_2360',35,'65.1300000',4,2279.55,'2005-03-04 00:00:00','2005-03-11 00:00:00','2005-03-07 00:00:00','Shipped','They want to reevaluate their terms agreement with Finance.',124,'2005-03-04',1,3,2005), (10390,'S24_2972',37,'100.0000000',5,4894.73,'2005-03-04 00:00:00','2005-03-11 00:00:00','2005-03-07 00:00:00','Shipped','They want to reevaluate their terms agreement with Finance.',124,'2005-03-04',1,3,2005), (10390,'S24_3371',46,'52.8400000',6,2430.64,'2005-03-04 00:00:00','2005-03-11 00:00:00','2005-03-07 00:00:00','Shipped','They want to reevaluate their terms agreement with Finance.',124,'2005-03-04',1,3,2005), (10390,'S24_3856',45,'100.0000000',8,6763.05,'2005-03-04 00:00:00','2005-03-11 00:00:00','2005-03-07 00:00:00','Shipped','They want to reevaluate their terms agreement with Finance.',124,'2005-03-04',1,3,2005), (10390,'S24_4620',30,'82.4200000',10,2472.6,'2005-03-04 00:00:00','2005-03-11 00:00:00','2005-03-07 00:00:00','Shipped','They want to reevaluate their terms agreement with Finance.',124,'2005-03-04',1,3,2005), (10390,'S32_2206',41,'44.5600000',11,1826.96,'2005-03-04 00:00:00','2005-03-11 00:00:00','2005-03-07 00:00:00','Shipped','They want to reevaluate their terms agreement with Finance.',124,'2005-03-04',1,3,2005), (10390,'S32_4485',45,'48.9800000',12,2204.1,'2005-03-04 00:00:00','2005-03-11 00:00:00','2005-03-07 00:00:00','Shipped','They want to reevaluate their terms agreement with Finance.',124,'2005-03-04',1,3,2005), (10390,'S50_4713',22,'100.0000000',13,3491.18,'2005-03-04 00:00:00','2005-03-11 00:00:00','2005-03-07 00:00:00','Shipped','They want to reevaluate their terms agreement with Finance.',124,'2005-03-04',1,3,2005), (10391,'S10_1949',24,'100.0000000',4,2416.56,'2005-03-09 00:00:00','2005-03-20 00:00:00','2005-03-15 00:00:00','Shipped',NULL,276,'2005-03-09',1,3,2005), (10391,'S10_4962',37,'46.9000000',7,1735.3,'2005-03-09 00:00:00','2005-03-20 00:00:00','2005-03-15 00:00:00','Shipped',NULL,276,'2005-03-09',1,3,2005), (10391,'S12_1666',39,'63.2000000',9,2464.8,'2005-03-09 00:00:00','2005-03-20 00:00:00','2005-03-15 00:00:00','Shipped',NULL,276,'2005-03-09',1,3,2005), (10391,'S18_1097',29,'85.1000000',10,2467.9,'2005-03-09 00:00:00','2005-03-20 00:00:00','2005-03-15 00:00:00','Shipped',NULL,276,'2005-03-09',1,3,2005), (10391,'S18_1342',35,'100.0000000',2,5548.9,'2005-03-09 00:00:00','2005-03-20 00:00:00','2005-03-15 00:00:00','Shipped',NULL,276,'2005-03-09',1,3,2005), (10391,'S18_1367',42,'100.0000000',3,4998,'2005-03-09 00:00:00','2005-03-20 00:00:00','2005-03-15 00:00:00','Shipped',NULL,276,'2005-03-09',1,3,2005), (10391,'S18_2432',44,'38.5000000',5,1694,'2005-03-09 00:00:00','2005-03-20 00:00:00','2005-03-15 00:00:00','Shipped',NULL,276,'2005-03-09',1,3,2005), (10391,'S18_2949',32,'45.2500000',6,1448,'2005-03-09 00:00:00','2005-03-20 00:00:00','2005-03-15 00:00:00','Shipped',NULL,276,'2005-03-09',1,3,2005), (10391,'S24_1937',33,'100.0000000',8,8344.71,'2005-03-09 00:00:00','2005-03-20 00:00:00','2005-03-15 00:00:00','Shipped',NULL,276,'2005-03-09',1,3,2005), (10391,'S24_2022',24,'100.0000000',1,4042.08,'2005-03-09 00:00:00','2005-03-20 00:00:00','2005-03-15 00:00:00','Shipped',NULL,276,'2005-03-09',1,3,2005), (10392,'S18_2957',37,'59.9600000',3,2218.52,'2005-03-10 00:00:00','2005-03-18 00:00:00','2005-03-12 00:00:00','Shipped',NULL,452,'2005-03-10',1,3,2005), (10392,'S18_3136',29,'86.9200000',2,2520.68,'2005-03-10 00:00:00','2005-03-18 00:00:00','2005-03-12 00:00:00','Shipped',NULL,452,'2005-03-10',1,3,2005), (10392,'S18_3320',36,'100.0000000',1,4035.96,'2005-03-10 00:00:00','2005-03-18 00:00:00','2005-03-12 00:00:00','Shipped',NULL,452,'2005-03-10',1,3,2005), (10393,'S12_3148',35,'100.0000000',8,3817.8,'2005-03-11 00:00:00','2005-03-22 00:00:00','2005-03-14 00:00:00','Shipped','They want to reevaluate their terms agreement with Finance.',323,'2005-03-11',1,3,2005), (10393,'S12_4473',32,'100.0000000',10,3236.16,'2005-03-11 00:00:00','2005-03-22 00:00:00','2005-03-14 00:00:00','Shipped','They want to reevaluate their terms agreement with Finance.',323,'2005-03-11',1,3,2005), (10393,'S18_2238',20,'69.8100000',11,1396.2,'2005-03-11 00:00:00','2005-03-22 00:00:00','2005-03-14 00:00:00','Shipped','They want to reevaluate their terms agreement with Finance.',323,'2005-03-11',1,3,2005), (10393,'S18_2319',38,'100.0000000',7,3805.32,'2005-03-11 00:00:00','2005-03-22 00:00:00','2005-03-14 00:00:00','Shipped','They want to reevaluate their terms agreement with Finance.',323,'2005-03-11',1,3,2005), (10393,'S18_4600',30,'100.0000000',9,3625.8,'2005-03-11 00:00:00','2005-03-22 00:00:00','2005-03-14 00:00:00','Shipped','They want to reevaluate their terms agreement with Finance.',323,'2005-03-11',1,3,2005), (10393,'S18_4668',44,'100.0000000',1,4849.24,'2005-03-11 00:00:00','2005-03-22 00:00:00','2005-03-14 00:00:00','Shipped','They want to reevaluate their terms agreement with Finance.',323,'2005-03-11',1,3,2005), (10393,'S24_2300',33,'100.0000000',2,5835.39,'2005-03-11 00:00:00','2005-03-22 00:00:00','2005-03-14 00:00:00','Shipped','They want to reevaluate their terms agreement with Finance.',323,'2005-03-11',1,3,2005), (10393,'S24_4258',33,'98.1800000',3,3239.94,'2005-03-11 00:00:00','2005-03-22 00:00:00','2005-03-14 00:00:00','Shipped','They want to reevaluate their terms agreement with Finance.',323,'2005-03-11',1,3,2005), (10393,'S32_1268',38,'100.0000000',4,5521.4,'2005-03-11 00:00:00','2005-03-22 00:00:00','2005-03-14 00:00:00','Shipped','They want to reevaluate their terms agreement with Finance.',323,'2005-03-11',1,3,2005), (10393,'S32_3522',31,'57.8600000',5,1793.66,'2005-03-11 00:00:00','2005-03-22 00:00:00','2005-03-14 00:00:00','Shipped','They want to reevaluate their terms agreement with Finance.',323,'2005-03-11',1,3,2005), (10393,'S700_2824',21,'100.0000000',6,2146.83,'2005-03-11 00:00:00','2005-03-22 00:00:00','2005-03-14 00:00:00','Shipped','They want to reevaluate their terms agreement with Finance.',323,'2005-03-11',1,3,2005), (10394,'S18_3232',22,'100.0000000',5,3353.02,'2005-03-15 00:00:00','2005-03-25 00:00:00','2005-03-19 00:00:00','Shipped',NULL,141,'2005-03-15',1,3,2005), (10394,'S18_4027',37,'100.0000000',1,6376.58,'2005-03-15 00:00:00','2005-03-25 00:00:00','2005-03-19 00:00:00','Shipped',NULL,141,'2005-03-15',1,3,2005), (10394,'S24_1444',31,'50.2900000',2,1558.99,'2005-03-15 00:00:00','2005-03-25 00:00:00','2005-03-19 00:00:00','Shipped',NULL,141,'2005-03-15',1,3,2005), (10394,'S24_2840',46,'38.9000000',6,1789.4,'2005-03-15 00:00:00','2005-03-25 00:00:00','2005-03-19 00:00:00','Shipped',NULL,141,'2005-03-15',1,3,2005), (10394,'S24_4048',37,'100.0000000',7,5207.75,'2005-03-15 00:00:00','2005-03-25 00:00:00','2005-03-19 00:00:00','Shipped',NULL,141,'2005-03-15',1,3,2005), (10394,'S32_2509',36,'62.7700000',3,2259.72,'2005-03-15 00:00:00','2005-03-25 00:00:00','2005-03-19 00:00:00','Shipped',NULL,141,'2005-03-15',1,3,2005), (10394,'S32_3207',30,'60.2800000',4,1808.4,'2005-03-15 00:00:00','2005-03-25 00:00:00','2005-03-19 00:00:00','Shipped',NULL,141,'2005-03-15',1,3,2005), (10395,'S10_4757',32,'100.0000000',2,3370.56,'2005-03-17 00:00:00','2005-03-24 00:00:00','2005-03-23 00:00:00','Shipped','We must be cautions with this customer. Their VP of Sales resigned. Company may be heading down.',250,'2005-03-17',1,3,2005), (10395,'S12_1108',33,'69.1200000',1,2280.96,'2005-03-17 00:00:00','2005-03-24 00:00:00','2005-03-23 00:00:00','Shipped','We must be cautions with this customer. Their VP of Sales resigned. Company may be heading down.',250,'2005-03-17',1,3,2005), (10395,'S50_1392',46,'100.0000000',4,5692.96,'2005-03-17 00:00:00','2005-03-24 00:00:00','2005-03-23 00:00:00','Shipped','We must be cautions with this customer. Their VP of Sales resigned. Company may be heading down.',250,'2005-03-17',1,3,2005), (10395,'S50_1514',45,'100.0000000',3,8977.05,'2005-03-17 00:00:00','2005-03-24 00:00:00','2005-03-23 00:00:00','Shipped','We must be cautions with this customer. Their VP of Sales resigned. Company may be heading down.',250,'2005-03-17',1,3,2005), (10396,'S12_3891',33,'100.0000000',3,6109.29,'2005-03-23 00:00:00','2005-04-02 00:00:00','2005-03-28 00:00:00','Shipped',NULL,124,'2005-03-23',1,3,2005), (10396,'S18_3140',33,'100.0000000',2,5273.73,'2005-03-23 00:00:00','2005-04-02 00:00:00','2005-03-28 00:00:00','Shipped',NULL,124,'2005-03-23',1,3,2005), (10396,'S18_3259',24,'89.7500000',4,2154,'2005-03-23 00:00:00','2005-04-02 00:00:00','2005-03-28 00:00:00','Shipped',NULL,124,'2005-03-23',1,3,2005), (10396,'S18_4522',45,'100.0000000',5,4739.4,'2005-03-23 00:00:00','2005-04-02 00:00:00','2005-03-28 00:00:00','Shipped',NULL,124,'2005-03-23',1,3,2005), (10396,'S24_2011',49,'100.0000000',6,5720.75,'2005-03-23 00:00:00','2005-04-02 00:00:00','2005-03-28 00:00:00','Shipped',NULL,124,'2005-03-23',1,3,2005), (10396,'S24_3151',27,'83.2000000',7,2246.4,'2005-03-23 00:00:00','2005-04-02 00:00:00','2005-03-28 00:00:00','Shipped',NULL,124,'2005-03-23',1,3,2005), (10396,'S24_3816',37,'90.5700000',8,3351.09,'2005-03-23 00:00:00','2005-04-02 00:00:00','2005-03-28 00:00:00','Shipped',NULL,124,'2005-03-23',1,3,2005), (10396,'S700_1138',39,'66.6700000',1,2600.13,'2005-03-23 00:00:00','2005-04-02 00:00:00','2005-03-28 00:00:00','Shipped',NULL,124,'2005-03-23',1,3,2005), (10397,'S700_1938',32,'80.5500000',5,2577.6,'2005-03-28 00:00:00','2005-04-09 00:00:00','2005-04-01 00:00:00','Shipped',NULL,242,'2005-03-28',1,3,2005), (10397,'S700_2610',22,'66.5000000',4,1463,'2005-03-28 00:00:00','2005-04-09 00:00:00','2005-04-01 00:00:00','Shipped',NULL,242,'2005-03-28',1,3,2005), (10397,'S700_3505',48,'100.0000000',3,5192.64,'2005-03-28 00:00:00','2005-04-09 00:00:00','2005-04-01 00:00:00','Shipped',NULL,242,'2005-03-28',1,3,2005), (10397,'S700_3962',36,'100.0000000',2,3789.72,'2005-03-28 00:00:00','2005-04-09 00:00:00','2005-04-01 00:00:00','Shipped',NULL,242,'2005-03-28',1,3,2005), (10397,'S72_3212',34,'62.2400000',1,2116.16,'2005-03-28 00:00:00','2005-04-09 00:00:00','2005-04-01 00:00:00','Shipped',NULL,242,'2005-03-28',1,3,2005), (10398,'S18_1662',33,'100.0000000',11,4215.09,'2005-03-30 00:00:00','2005-04-09 00:00:00','2005-03-31 00:00:00','Shipped',NULL,353,'2005-03-30',1,3,2005), (10398,'S18_2581',34,'76.8800000',15,2613.92,'2005-03-30 00:00:00','2005-04-09 00:00:00','2005-03-31 00:00:00','Shipped',NULL,353,'2005-03-30',1,3,2005), (10398,'S18_3029',28,'72.2600000',18,2023.28,'2005-03-30 00:00:00','2005-04-09 00:00:00','2005-03-31 00:00:00','Shipped',NULL,353,'2005-03-30',1,3,2005), (10398,'S18_3856',45,'100.0000000',17,4811.85,'2005-03-30 00:00:00','2005-04-09 00:00:00','2005-03-31 00:00:00','Shipped',NULL,353,'2005-03-30',1,3,2005), (10398,'S24_1785',43,'100.0000000',16,5552.16,'2005-03-30 00:00:00','2005-04-09 00:00:00','2005-03-31 00:00:00','Shipped',NULL,353,'2005-03-30',1,3,2005), (10398,'S24_2841',28,'57.5500000',3,1611.4,'2005-03-30 00:00:00','2005-04-09 00:00:00','2005-03-31 00:00:00','Shipped',NULL,353,'2005-03-30',1,3,2005), (10398,'S24_3420',34,'71.6700000',13,2436.78,'2005-03-30 00:00:00','2005-04-09 00:00:00','2005-03-31 00:00:00','Shipped',NULL,353,'2005-03-30',1,3,2005), (10398,'S24_3949',41,'68.2400000',2,2797.84,'2005-03-30 00:00:00','2005-04-09 00:00:00','2005-03-31 00:00:00','Shipped',NULL,353,'2005-03-30',1,3,2005), (10398,'S24_4278',45,'78.2500000',14,3521.25,'2005-03-30 00:00:00','2005-04-09 00:00:00','2005-03-31 00:00:00','Shipped',NULL,353,'2005-03-30',1,3,2005), (10398,'S32_4289',22,'67.4100000',4,1483.02,'2005-03-30 00:00:00','2005-04-09 00:00:00','2005-03-31 00:00:00','Shipped',NULL,353,'2005-03-30',1,3,2005), (10398,'S50_1341',49,'36.6600000',5,1796.34,'2005-03-30 00:00:00','2005-04-09 00:00:00','2005-03-31 00:00:00','Shipped',NULL,353,'2005-03-30',1,3,2005), (10398,'S700_1691',47,'87.6900000',6,4121.43,'2005-03-30 00:00:00','2005-04-09 00:00:00','2005-03-31 00:00:00','Shipped',NULL,353,'2005-03-30',1,3,2005), (10398,'S700_2047',36,'100.0000000',7,3910.32,'2005-03-30 00:00:00','2005-04-09 00:00:00','2005-03-31 00:00:00','Shipped',NULL,353,'2005-03-30',1,3,2005), (10398,'S700_2466',22,'86.7600000',8,1908.72,'2005-03-30 00:00:00','2005-04-09 00:00:00','2005-03-31 00:00:00','Shipped',NULL,353,'2005-03-30',1,3,2005), (10398,'S700_2834',23,'100.0000000',9,2810.83,'2005-03-30 00:00:00','2005-04-09 00:00:00','2005-03-31 00:00:00','Shipped',NULL,353,'2005-03-30',1,3,2005), (10398,'S700_3167',29,'65.6000000',10,1902.4,'2005-03-30 00:00:00','2005-04-09 00:00:00','2005-03-31 00:00:00','Shipped',NULL,353,'2005-03-30',1,3,2005), (10398,'S700_4002',36,'87.3600000',12,3144.96,'2005-03-30 00:00:00','2005-04-09 00:00:00','2005-03-31 00:00:00','Shipped',NULL,353,'2005-03-30',1,3,2005), (10398,'S72_1253',34,'40.2200000',1,1367.48,'2005-03-30 00:00:00','2005-04-09 00:00:00','2005-03-31 00:00:00','Shipped',NULL,353,'2005-03-30',1,3,2005), (10399,'S10_1678',40,'100.0000000',8,4555.2,'2005-04-01 00:00:00','2005-04-12 00:00:00','2005-04-03 00:00:00','Shipped',NULL,496,'2005-04-01',2,4,2005), (10399,'S10_2016',51,'100.0000000',7,6308.7,'2005-04-01 00:00:00','2005-04-12 00:00:00','2005-04-03 00:00:00','Shipped',NULL,496,'2005-04-01',2,4,2005), (10399,'S10_4698',22,'100.0000000',6,3493.6,'2005-04-01 00:00:00','2005-04-12 00:00:00','2005-04-03 00:00:00','Shipped',NULL,496,'2005-04-01',2,4,2005), (10399,'S12_2823',29,'100.0000000',5,4761.22,'2005-04-01 00:00:00','2005-04-12 00:00:00','2005-04-03 00:00:00','Shipped',NULL,496,'2005-04-01',2,4,2005), (10399,'S18_2625',30,'68.4400000',4,2053.2,'2005-04-01 00:00:00','2005-04-12 00:00:00','2005-04-03 00:00:00','Shipped',NULL,496,'2005-04-01',2,4,2005), (10399,'S24_1578',57,'100.0000000',3,6038.58,'2005-04-01 00:00:00','2005-04-12 00:00:00','2005-04-03 00:00:00','Shipped',NULL,496,'2005-04-01',2,4,2005), (10399,'S24_2000',58,'89.1200000',2,5168.96,'2005-04-01 00:00:00','2005-04-12 00:00:00','2005-04-03 00:00:00','Shipped',NULL,496,'2005-04-01',2,4,2005), (10399,'S32_1374',32,'99.8900000',1,3196.48,'2005-04-01 00:00:00','2005-04-12 00:00:00','2005-04-03 00:00:00','Shipped',NULL,496,'2005-04-01',2,4,2005), (10400,'S10_4757',64,'100.0000000',9,9661.44,'2005-04-01 00:00:00','2005-04-11 00:00:00','2005-04-04 00:00:00','Shipped','Customer requested that DHL is used for this shipping',450,'2005-04-01',2,4,2005), (10400,'S18_1662',34,'100.0000000',1,6433.82,'2005-04-01 00:00:00','2005-04-11 00:00:00','2005-04-04 00:00:00','Shipped','Customer requested that DHL is used for this shipping',450,'2005-04-01',2,4,2005), (10400,'S18_3029',30,'74.8400000',7,2245.2,'2005-04-01 00:00:00','2005-04-11 00:00:00','2005-04-04 00:00:00','Shipped','Customer requested that DHL is used for this shipping',450,'2005-04-01',2,4,2005), (10400,'S18_3856',58,'100.0000000',6,7307.42,'2005-04-01 00:00:00','2005-04-11 00:00:00','2005-04-04 00:00:00','Shipped','Customer requested that DHL is used for this shipping',450,'2005-04-01',2,4,2005), (10400,'S24_2841',24,'61.6600000',2,1479.84,'2005-04-01 00:00:00','2005-04-11 00:00:00','2005-04-04 00:00:00','Shipped','Customer requested that DHL is used for this shipping',450,'2005-04-01',2,4,2005), (10400,'S24_3420',38,'57.2000000',3,2173.6,'2005-04-01 00:00:00','2005-04-11 00:00:00','2005-04-04 00:00:00','Shipped','Customer requested that DHL is used for this shipping',450,'2005-04-01',2,4,2005), (10400,'S24_3816',42,'72.9600000',8,3064.32,'2005-04-01 00:00:00','2005-04-11 00:00:00','2005-04-04 00:00:00','Shipped','Customer requested that DHL is used for this shipping',450,'2005-04-01',2,4,2005), (10400,'S700_2047',46,'87.8000000',5,4038.8,'2005-04-01 00:00:00','2005-04-11 00:00:00','2005-04-04 00:00:00','Shipped','Customer requested that DHL is used for this shipping',450,'2005-04-01',2,4,2005), (10400,'S72_1253',20,'56.1200000',4,1122.4,'2005-04-01 00:00:00','2005-04-11 00:00:00','2005-04-04 00:00:00','Shipped','Customer requested that DHL is used for this shipping',450,'2005-04-01',2,4,2005), (10401,'S18_2581',42,'76.0300000',3,3193.26,'2005-04-03 00:00:00','2005-04-14 00:00:00','2006-08-23 11:52:07','On Hold','Customer credit limit exceeded. Will ship when a payment is received.',328,'2005-04-03',2,4,2005), (10401,'S24_1785',38,'96.2900000',5,3659.02,'2005-04-03 00:00:00','2005-04-14 00:00:00','2006-08-23 11:52:07','On Hold','Customer credit limit exceeded. Will ship when a payment is received.',328,'2005-04-03',2,4,2005), (10401,'S24_3949',64,'60.0500000',12,3843.2,'2005-04-03 00:00:00','2005-04-14 00:00:00','2006-08-23 11:52:07','On Hold','Customer credit limit exceeded. Will ship when a payment is received.',328,'2005-04-03',2,4,2005), (10401,'S24_4278',52,'81.1400000',4,4219.28,'2005-04-03 00:00:00','2005-04-14 00:00:00','2006-08-23 11:52:07','On Hold','Customer credit limit exceeded. Will ship when a payment is received.',328,'2005-04-03',2,4,2005), (10401,'S32_1374',49,'100.0000000',1,4992.61,'2005-04-03 00:00:00','2005-04-14 00:00:00','2006-08-23 11:52:07','On Hold','Customer credit limit exceeded. Will ship when a payment is received.',328,'2005-04-03',2,4,2005), (10401,'S32_4289',62,'77.7300000',6,4819.26,'2005-04-03 00:00:00','2005-04-14 00:00:00','2006-08-23 11:52:07','On Hold','Customer credit limit exceeded. Will ship when a payment is received.',328,'2005-04-03',2,4,2005), (10401,'S50_1341',56,'35.3500000',7,1979.6,'2005-04-03 00:00:00','2005-04-14 00:00:00','2006-08-23 11:52:07','On Hold','Customer credit limit exceeded. Will ship when a payment is received.',328,'2005-04-03',2,4,2005), (10401,'S700_1691',11,'100.0000000',8,1135.31,'2005-04-03 00:00:00','2005-04-14 00:00:00','2006-08-23 11:52:07','On Hold','Customer credit limit exceeded. Will ship when a payment is received.',328,'2005-04-03',2,4,2005), (10401,'S700_2466',85,'88.7500000',10,7543.75,'2005-04-03 00:00:00','2005-04-14 00:00:00','2006-08-23 11:52:07','On Hold','Customer credit limit exceeded. Will ship when a payment is received.',328,'2005-04-03',2,4,2005), (10401,'S700_2834',21,'96.1100000',2,2018.31,'2005-04-03 00:00:00','2005-04-14 00:00:00','2006-08-23 11:52:08','On Hold','Customer credit limit exceeded. Will ship when a payment is received.',328,'2005-04-03',2,4,2005), (10401,'S700_3167',77,'92.0000000',9,7084,'2005-04-03 00:00:00','2005-04-14 00:00:00','2006-08-23 11:52:08','On Hold','Customer credit limit exceeded. Will ship when a payment is received.',328,'2005-04-03',2,4,2005), (10401,'S700_4002',28,'72.5500000',11,2031.4,'2005-04-03 00:00:00','2005-04-14 00:00:00','2006-08-23 11:52:08','On Hold','Customer credit limit exceeded. Will ship when a payment is received.',328,'2005-04-03',2,4,2005), (10402,'S10_2016',45,'100.0000000',1,5833.8,'2005-04-07 00:00:00','2005-04-14 00:00:00','2005-04-12 00:00:00','Shipped',NULL,406,'2005-04-07',2,4,2005), (10402,'S18_2625',55,'55.7200000',2,3064.6,'2005-04-07 00:00:00','2005-04-14 00:00:00','2005-04-12 00:00:00','Shipped',NULL,406,'2005-04-07',2,4,2005), (10402,'S24_2000',59,'87.6000000',3,5168.4,'2005-04-07 00:00:00','2005-04-14 00:00:00','2005-04-12 00:00:00','Shipped',NULL,406,'2005-04-07',2,4,2005), (10403,'S10_1678',24,'100.0000000',7,2434.56,'2005-04-08 00:00:00','2005-04-18 00:00:00','2005-04-11 00:00:00','Shipped',NULL,201,'2005-04-08',2,4,2005), (10403,'S10_4698',66,'100.0000000',9,11886.6,'2005-04-08 00:00:00','2005-04-18 00:00:00','2005-04-11 00:00:00','Shipped',NULL,201,'2005-04-08',2,4,2005), (10403,'S12_2823',66,'100.0000000',6,8648.64,'2005-04-08 00:00:00','2005-04-18 00:00:00','2005-04-11 00:00:00','Shipped',NULL,201,'2005-04-08',2,4,2005), (10403,'S18_3782',36,'52.2200000',1,1879.92,'2005-04-08 00:00:00','2005-04-18 00:00:00','2005-04-11 00:00:00','Shipped',NULL,201,'2005-04-08',2,4,2005), (10403,'S24_1578',46,'100.0000000',8,5287.7,'2005-04-08 00:00:00','2005-04-18 00:00:00','2005-04-11 00:00:00','Shipped',NULL,201,'2005-04-08',2,4,2005), (10403,'S24_2360',27,'79.6500000',4,2150.55,'2005-04-08 00:00:00','2005-04-18 00:00:00','2005-04-11 00:00:00','Shipped',NULL,201,'2005-04-08',2,4,2005), (10403,'S32_2206',30,'40.2300000',2,1206.9,'2005-04-08 00:00:00','2005-04-18 00:00:00','2005-04-11 00:00:00','Shipped',NULL,201,'2005-04-08',2,4,2005), (10403,'S32_4485',45,'100.0000000',5,5189.4,'2005-04-08 00:00:00','2005-04-18 00:00:00','2005-04-11 00:00:00','Shipped',NULL,201,'2005-04-08',2,4,2005), (10403,'S50_4713',31,'68.3400000',3,2118.54,'2005-04-08 00:00:00','2005-04-18 00:00:00','2005-04-11 00:00:00','Shipped',NULL,201,'2005-04-08',2,4,2005), (10404,'S12_1099',64,'100.0000000',3,13199.4,'2005-04-08 00:00:00','2005-04-14 00:00:00','2005-04-11 00:00:00','Shipped',NULL,323,'2005-04-08',2,4,2005), (10404,'S12_3380',43,'100.0000000',1,4696.46,'2005-04-08 00:00:00','2005-04-14 00:00:00','2005-04-11 00:00:00','Shipped',NULL,323,'2005-04-08',2,4,2005), (10404,'S12_3990',77,'74.2100000',4,5714.17,'2005-04-08 00:00:00','2005-04-14 00:00:00','2005-04-11 00:00:00','Shipped',NULL,323,'2005-04-08',2,4,2005), (10404,'S18_3278',90,'73.1700000',6,6585.3,'2005-04-08 00:00:00','2005-04-14 00:00:00','2005-04-11 00:00:00','Shipped',NULL,323,'2005-04-08',2,4,2005), (10404,'S18_3482',28,'100.0000000',5,3745.28,'2005-04-08 00:00:00','2005-04-14 00:00:00','2005-04-11 00:00:00','Shipped',NULL,323,'2005-04-08',2,4,2005), (10404,'S18_4721',48,'100.0000000',8,6928.32,'2005-04-08 00:00:00','2005-04-14 00:00:00','2005-04-11 00:00:00','Shipped',NULL,323,'2005-04-08',2,4,2005), (10404,'S24_3371',49,'62.4500000',2,3060.05,'2005-04-08 00:00:00','2005-04-14 00:00:00','2005-04-11 00:00:00','Shipped',NULL,323,'2005-04-08',2,4,2005), (10404,'S24_4620',48,'93.7700000',7,4500.96,'2005-04-08 00:00:00','2005-04-14 00:00:00','2005-04-11 00:00:00','Shipped',NULL,323,'2005-04-08',2,4,2005), (10405,'S12_4675',97,'93.2800000',5,9048.16,'2005-04-14 00:00:00','2005-04-24 00:00:00','2005-04-20 00:00:00','Shipped',NULL,209,'2005-04-14',2,4,2005), (10405,'S18_1889',61,'73.9200000',4,4509.12,'2005-04-14 00:00:00','2005-04-24 00:00:00','2005-04-20 00:00:00','Shipped',NULL,209,'2005-04-14',2,4,2005), (10405,'S18_3232',55,'100.0000000',1,8289.05,'2005-04-14 00:00:00','2005-04-24 00:00:00','2005-04-20 00:00:00','Shipped',NULL,209,'2005-04-14',2,4,2005), (10405,'S24_2972',47,'44.5600000',2,2094.32,'2005-04-14 00:00:00','2005-04-24 00:00:00','2005-04-20 00:00:00','Shipped',NULL,209,'2005-04-14',2,4,2005), (10405,'S24_3856',76,'100.0000000',3,11739.7,'2005-04-14 00:00:00','2005-04-24 00:00:00','2005-04-20 00:00:00','Shipped',NULL,209,'2005-04-14',2,4,2005), (10406,'S18_1129',61,'100.0000000',3,8374.69,'2005-04-15 00:00:00','2005-04-25 00:00:00','2005-04-21 00:00:00','Disputed','Customer claims container with shipment was damaged during shipping and some items were missing. I am talking to FedEx about this.',145,'2005-04-15',2,4,2005), (10406,'S18_1984',48,'100.0000000',2,7169.28,'2005-04-15 00:00:00','2005-04-25 00:00:00','2005-04-21 00:00:00','Disputed','Customer claims container with shipment was damaged during shipping and some items were missing. I am talking to FedEx about this.',145,'2005-04-15',2,4,2005), (10406,'S18_3685',65,'100.0000000',1,10468.9,'2005-04-15 00:00:00','2005-04-25 00:00:00','2005-04-21 00:00:00','Disputed','Customer claims container with shipment was damaged during shipping and some items were missing. I am talking to FedEx about this.',145,'2005-04-15',2,4,2005), (10407,'S18_1589',59,'100.0000000',11,7048.14,'2005-04-22 00:00:00','2005-05-04 00:00:00','2006-08-23 11:52:08','On Hold','Customer credit limit exceeded. Will ship when a payment is received.',450,'2005-04-22',2,4,2005), (10407,'S18_1749',76,'100.0000000',2,14082.8,'2005-04-22 00:00:00','2005-05-04 00:00:00','2006-08-23 11:52:08','On Hold','Customer credit limit exceeded. Will ship when a payment is received.',450,'2005-04-22',2,4,2005), (10407,'S18_2248',42,'72.6500000',1,3051.3,'2005-04-22 00:00:00','2005-05-04 00:00:00','2006-08-23 11:52:08','On Hold','Customer credit limit exceeded. Will ship when a payment is received.',450,'2005-04-22',2,4,2005), (10407,'S18_2870',41,'100.0000000',12,6386.16,'2005-04-22 00:00:00','2005-05-04 00:00:00','2006-08-23 11:52:09','On Hold','Customer credit limit exceeded. Will ship when a payment is received.',450,'2005-04-22',2,4,2005), (10407,'S18_4409',6,'90.1900000',3,541.14,'2005-04-22 00:00:00','2005-05-04 00:00:00','2006-08-23 11:52:09','On Hold','Customer credit limit exceeded. Will ship when a payment is received.',450,'2005-04-22',2,4,2005), (10407,'S18_4933',66,'66.9900000',4,4421.34,'2005-04-22 00:00:00','2005-05-04 00:00:00','2006-08-23 11:52:09','On Hold','Customer credit limit exceeded. Will ship when a payment is received.',450,'2005-04-22',2,4,2005), (10407,'S24_1046',26,'76.4300000',8,1987.18,'2005-04-22 00:00:00','2005-05-04 00:00:00','2006-08-23 11:52:09','On Hold','Customer credit limit exceeded. Will ship when a payment is received.',450,'2005-04-22',2,4,2005), (10407,'S24_1628',64,'40.2500000',10,2576,'2005-04-22 00:00:00','2005-05-04 00:00:00','2006-08-23 11:52:09','On Hold','Customer credit limit exceeded. Will ship when a payment is received.',450,'2005-04-22',2,4,2005), (10407,'S24_2766',76,'94.5000000',6,7182,'2005-04-22 00:00:00','2005-05-04 00:00:00','2006-08-23 11:52:09','On Hold','Customer credit limit exceeded. Will ship when a payment is received.',450,'2005-04-22',2,4,2005), (10407,'S24_2887',59,'98.6500000',5,5820.35,'2005-04-22 00:00:00','2005-05-04 00:00:00','2006-08-23 11:52:09','On Hold','Customer credit limit exceeded. Will ship when a payment is received.',450,'2005-04-22',2,4,2005), (10407,'S24_3191',13,'81.3300000',7,1057.29,'2005-04-22 00:00:00','2005-05-04 00:00:00','2006-08-23 11:52:09','On Hold','Customer credit limit exceeded. Will ship when a payment is received.',450,'2005-04-22',2,4,2005), (10407,'S24_3432',43,'86.7300000',9,3729.39,'2005-04-22 00:00:00','2005-05-04 00:00:00','2006-08-23 11:52:09','On Hold','Customer credit limit exceeded. Will ship when a payment is received.',450,'2005-04-22',2,4,2005), (10408,'S24_3969',15,'36.9300000',1,553.95,'2005-04-22 00:00:00','2005-04-29 00:00:00','2005-04-27 00:00:00','Shipped',NULL,398,'2005-04-22',2,4,2005), (10409,'S18_2325',6,'100.0000000',2,785.64,'2005-04-23 00:00:00','2005-05-05 00:00:00','2005-04-24 00:00:00','Shipped',NULL,166,'2005-04-23',2,4,2005), (10409,'S24_1937',61,'29.5400000',1,1801.94,'2005-04-23 00:00:00','2005-05-05 00:00:00','2005-04-24 00:00:00','Shipped',NULL,166,'2005-04-23',2,4,2005), (10410,'S18_1342',65,'100.0000000',7,7612.8,'2005-04-29 00:00:00','2005-05-10 00:00:00','2005-04-30 00:00:00','Shipped',NULL,357,'2005-04-29',2,4,2005), (10410,'S18_1367',44,'58.2200000',6,2561.68,'2005-04-29 00:00:00','2005-05-10 00:00:00','2005-04-30 00:00:00','Shipped',NULL,357,'2005-04-29',2,4,2005), (10410,'S18_2795',56,'100.0000000',8,7749.28,'2005-04-29 00:00:00','2005-05-10 00:00:00','2005-04-30 00:00:00','Shipped',NULL,357,'2005-04-29',2,4,2005), (10410,'S18_2949',47,'100.0000000',1,5523.44,'2005-04-29 00:00:00','2005-05-10 00:00:00','2005-04-30 00:00:00','Shipped',NULL,357,'2005-04-29',2,4,2005), (10410,'S18_2957',53,'58.0900000',3,3078.77,'2005-04-29 00:00:00','2005-05-10 00:00:00','2005-04-30 00:00:00','Shipped',NULL,357,'2005-04-29',2,4,2005), (10410,'S18_3136',34,'100.0000000',2,3916.46,'2005-04-29 00:00:00','2005-05-10 00:00:00','2005-04-30 00:00:00','Shipped',NULL,357,'2005-04-29',2,4,2005), (10410,'S18_3320',44,'84.3300000',5,3710.52,'2005-04-29 00:00:00','2005-05-10 00:00:00','2005-04-30 00:00:00','Shipped',NULL,357,'2005-04-29',2,4,2005), (10410,'S24_2022',31,'45.2500000',9,1402.75,'2005-04-29 00:00:00','2005-05-10 00:00:00','2005-04-30 00:00:00','Shipped',NULL,357,'2005-04-29',2,4,2005), (10410,'S24_4258',50,'86.6800000',4,4334,'2005-04-29 00:00:00','2005-05-10 00:00:00','2005-04-30 00:00:00','Shipped',NULL,357,'2005-04-29',2,4,2005), (10411,'S10_1949',23,'100.0000000',9,4140.23,'2005-05-01 00:00:00','2005-05-08 00:00:00','2005-05-06 00:00:00','Shipped',NULL,233,'2005-05-01',2,5,2005), (10411,'S10_4962',27,'100.0000000',2,4427.73,'2005-05-01 00:00:00','2005-05-08 00:00:00','2005-05-06 00:00:00','Shipped',NULL,233,'2005-05-01',2,5,2005), (10411,'S12_1666',40,'100.0000000',6,6232,'2005-05-01 00:00:00','2005-05-08 00:00:00','2005-05-06 00:00:00','Shipped',NULL,233,'2005-05-01',2,5,2005), (10411,'S18_1097',27,'100.0000000',8,3213,'2005-05-01 00:00:00','2005-05-08 00:00:00','2005-05-06 00:00:00','Shipped',NULL,233,'2005-05-01',2,5,2005), (10411,'S18_4600',46,'100.0000000',3,5235.72,'2005-05-01 00:00:00','2005-05-08 00:00:00','2005-05-06 00:00:00','Shipped',NULL,233,'2005-05-01',2,5,2005), (10411,'S18_4668',35,'59.8700000',7,2095.45,'2005-05-01 00:00:00','2005-05-08 00:00:00','2005-05-06 00:00:00','Shipped',NULL,233,'2005-05-01',2,5,2005), (10411,'S32_1268',26,'100.0000000',1,2904.72,'2005-05-01 00:00:00','2005-05-08 00:00:00','2005-05-06 00:00:00','Shipped',NULL,233,'2005-05-01',2,5,2005), (10411,'S32_3522',27,'69.1600000',5,1867.32,'2005-05-01 00:00:00','2005-05-08 00:00:00','2005-05-06 00:00:00','Shipped',NULL,233,'2005-05-01',2,5,2005), (10411,'S700_2824',34,'100.0000000',4,3576.8,'2005-05-01 00:00:00','2005-05-08 00:00:00','2005-05-06 00:00:00','Shipped',NULL,233,'2005-05-01',2,5,2005), (10412,'S12_4473',54,'100.0000000',5,5951.34,'2008-07-31 13:49:59','2005-05-13 00:00:00','2005-05-05 00:00:00','Disputed',NULL,141,'2005-05-03',2,5,2005), (10412,'S18_2238',41,'100.0000000',4,6712.93,'2008-07-31 13:49:59','2005-05-13 00:00:00','2005-05-05 00:00:00','Disputed',NULL,141,'2005-05-03',2,5,2005), (10412,'S18_2319',56,'98.1800000',8,5498.08,'2008-07-31 13:49:59','2005-05-13 00:00:00','2005-05-05 00:00:00','Disputed',NULL,141,'2005-05-03',2,5,2005), (10412,'S18_2432',47,'61.9900000',11,2913.53,'2008-07-31 13:49:59','2005-05-13 00:00:00','2005-05-05 00:00:00','Disputed',NULL,141,'2005-05-03',2,5,2005), (10412,'S18_3232',60,'100.0000000',9,11887.8,'2008-07-31 13:49:59','2005-05-13 00:00:00','2005-05-05 00:00:00','Disputed',NULL,141,'2005-05-03',2,5,2005), (10412,'S24_1444',21,'52.6000000',2,1104.6,'2008-07-31 13:49:59','2005-05-13 00:00:00','2005-05-05 00:00:00','Disputed',NULL,141,'2005-05-03',2,5,2005), (10412,'S24_2300',70,'100.0000000',10,8498,'2008-07-31 13:49:59','2005-05-13 00:00:00','2005-05-05 00:00:00','Disputed',NULL,141,'2005-05-03',2,5,2005), (10412,'S24_2840',30,'36.0700000',6,1082.1,'2008-07-31 13:49:59','2005-05-13 00:00:00','2005-05-05 00:00:00','Disputed',NULL,141,'2005-05-03',2,5,2005), (10412,'S24_4048',31,'100.0000000',1,4253.2,'2008-07-31 13:49:59','2005-05-13 00:00:00','2005-05-05 00:00:00','Disputed',NULL,141,'2005-05-03',2,5,2005), (10412,'S32_2509',19,'48.7000000',7,925.3,'2008-07-31 13:49:59','2005-05-13 00:00:00','2005-05-05 00:00:00','Disputed',NULL,141,'2005-05-03',2,5,2005), (10412,'S50_1392',26,'100.0000000',3,3460.86,'2008-07-31 13:49:59','2005-05-13 00:00:00','2005-05-05 00:00:00','Disputed',NULL,141,'2005-05-03',2,5,2005), (10413,'S12_1108',36,'100.0000000',2,8677.8,'2005-05-05 00:00:00','2005-05-14 00:00:00','2005-05-09 00:00:00','Shipped','Customer requested that DHL is used for this shipping',175,'2005-05-05',2,5,2005), (10413,'S12_3148',47,'100.0000000',3,8236.75,'2005-05-05 00:00:00','2005-05-14 00:00:00','2005-05-09 00:00:00','Shipped','Customer requested that DHL is used for this shipping',175,'2005-05-05',2,5,2005), (10413,'S12_3891',22,'100.0000000',1,3387.78,'2005-05-05 00:00:00','2005-05-14 00:00:00','2005-05-09 00:00:00','Shipped','Customer requested that DHL is used for this shipping',175,'2005-05-05',2,5,2005), (10413,'S18_4027',49,'100.0000000',5,6896.75,'2005-05-05 00:00:00','2005-05-14 00:00:00','2005-05-09 00:00:00','Shipped','Customer requested that DHL is used for this shipping',175,'2005-05-05',2,5,2005), (10413,'S32_3207',24,'49.7100000',6,1193.04,'2005-05-05 00:00:00','2005-05-14 00:00:00','2005-05-09 00:00:00','Shipped','Customer requested that DHL is used for this shipping',175,'2005-05-05',2,5,2005), (10413,'S50_1514',51,'63.8500000',4,3256.35,'2005-05-05 00:00:00','2005-05-14 00:00:00','2005-05-09 00:00:00','Shipped','Customer requested that DHL is used for this shipping',175,'2005-05-05',2,5,2005), (10414,'S10_4757',19,'100.0000000',3,2764.88,'2005-05-06 00:00:00','2005-05-13 00:00:00','2006-08-23 11:52:10','On Hold','Customer credit limit exceeded. Will ship when a payment is received.',362,'2005-05-06',2,5,2005), (10414,'S18_3029',44,'73.9800000',1,3255.12,'2005-05-06 00:00:00','2005-05-13 00:00:00','2006-08-23 11:52:10','On Hold','Customer credit limit exceeded. Will ship when a payment is received.',362,'2005-05-06',2,5,2005), (10414,'S18_3140',41,'100.0000000',12,4872.03,'2005-05-06 00:00:00','2005-05-13 00:00:00','2006-08-23 11:52:10','On Hold','Customer credit limit exceeded. Will ship when a payment is received.',362,'2005-05-06',2,5,2005), (10414,'S18_3259',48,'100.0000000',14,5808.48,'2005-05-06 00:00:00','2005-05-13 00:00:00','2006-08-23 11:52:10','On Hold','Customer credit limit exceeded. Will ship when a payment is received.',362,'2005-05-06',2,5,2005), (10414,'S18_4522',16,'75.4800000',11,1207.68,'2005-05-06 00:00:00','2005-05-13 00:00:00','2006-08-23 11:52:10','On Hold','Customer credit limit exceeded. Will ship when a payment is received.',362,'2005-05-06',2,5,2005), (10414,'S24_2011',23,'100.0000000',10,3335.23,'2005-05-06 00:00:00','2005-05-13 00:00:00','2006-08-23 11:52:10','On Hold','Customer credit limit exceeded. Will ship when a payment is received.',362,'2005-05-06',2,5,2005), (10414,'S24_3151',60,'100.0000000',5,6107.4,'2005-05-06 00:00:00','2005-05-13 00:00:00','2006-08-23 11:52:10','On Hold','Customer credit limit exceeded. Will ship when a payment is received.',362,'2005-05-06',2,5,2005), (10414,'S24_3816',51,'76.3100000',2,3891.81,'2005-05-06 00:00:00','2005-05-13 00:00:00','2006-08-23 11:52:10','On Hold','Customer credit limit exceeded. Will ship when a payment is received.',362,'2005-05-06',2,5,2005), (10414,'S700_1138',37,'71.3400000',6,2639.58,'2005-05-06 00:00:00','2005-05-13 00:00:00','2006-08-23 11:52:10','On Hold','Customer credit limit exceeded. Will ship when a payment is received.',362,'2005-05-06',2,5,2005), (10414,'S700_1938',34,'100.0000000',13,3533.62,'2005-05-06 00:00:00','2005-05-13 00:00:00','2006-08-23 11:52:10','On Hold','Customer credit limit exceeded. Will ship when a payment is received.',362,'2005-05-06',2,5,2005), (10414,'S700_2610',31,'75.8900000',4,2352.59,'2005-05-06 00:00:00','2005-05-13 00:00:00','2006-08-23 11:52:10','On Hold','Customer credit limit exceeded. Will ship when a payment is received.',362,'2005-05-06',2,5,2005), (10414,'S700_3505',28,'100.0000000',7,3029.04,'2005-05-06 00:00:00','2005-05-13 00:00:00','2006-08-23 11:52:10','On Hold','Customer credit limit exceeded. Will ship when a payment is received.',362,'2005-05-06',2,5,2005), (10414,'S700_3962',27,'90.3700000',8,2439.99,'2005-05-06 00:00:00','2005-05-13 00:00:00','2006-08-23 11:52:10','On Hold','Customer credit limit exceeded. Will ship when a payment is received.',362,'2005-05-06',2,5,2005), (10414,'S72_3212',47,'65.5200000',9,3079.44,'2005-05-06 00:00:00','2005-05-13 00:00:00','2006-08-23 11:52:10','On Hold','Customer credit limit exceeded. Will ship when a payment is received.',362,'2005-05-06',2,5,2005), (10415,'S18_3856',51,'100.0000000',5,6209.25,'2005-05-09 00:00:00','2005-05-20 00:00:00','2005-05-12 00:00:00','Disputed','Customer claims the scales of the models don\'t match what was discussed. I keep all the paperwork though to prove otherwise',471,'2005-05-09',2,5,2005), (10415,'S24_2841',21,'67.8200000',1,1424.22,'2005-05-09 00:00:00','2005-05-20 00:00:00','2005-05-12 00:00:00','Disputed','Customer claims the scales of the models don\'t match what was discussed. I keep all the paperwork though to prove otherwise',471,'2005-05-09',2,5,2005), (10415,'S24_3420',18,'69.7000000',2,1254.6,'2005-05-09 00:00:00','2005-05-20 00:00:00','2005-05-12 00:00:00','Disputed','Customer claims the scales of the models don\'t match what was discussed. I keep all the paperwork though to prove otherwise',471,'2005-05-09',2,5,2005), (10415,'S700_2047',32,'95.9500000',4,3070.4,'2005-05-09 00:00:00','2005-05-20 00:00:00','2005-05-12 00:00:00','Disputed','Customer claims the scales of the models don\'t match what was discussed. I keep all the paperwork though to prove otherwise',471,'2005-05-09',2,5,2005), (10415,'S72_1253',42,'57.6100000',3,2419.62,'2005-05-09 00:00:00','2005-05-20 00:00:00','2005-05-12 00:00:00','Disputed','Customer claims the scales of the models don\'t match what was discussed. I keep all the paperwork though to prove otherwise',471,'2005-05-09',2,5,2005), (10416,'S18_1662',24,'100.0000000',14,4352.16,'2005-05-10 00:00:00','2005-05-16 00:00:00','2005-05-14 00:00:00','Shipped',NULL,386,'2005-05-10',2,5,2005), (10416,'S18_2581',15,'98.8400000',4,1482.6,'2005-05-10 00:00:00','2005-05-16 00:00:00','2005-05-14 00:00:00','Shipped',NULL,386,'2005-05-10',2,5,2005); INSERT INTO `orderfact` (`ORDERNUMBER`,`PRODUCTCODE`,`QUANTITYORDERED`,`PRICEEACH`,`ORDERLINENUMBER`,`TOTALPRICE`,`ORDERDATE`,`REQUIREDDATE`,`SHIPPEDDATE`,`STATUS`,`COMMENTS`,`CUSTOMERNUMBER`,`TIME_ID`,`QTR_ID`,`MONTH_ID`,`YEAR_ID`) VALUES (10416,'S24_1785',47,'88.6300000',6,4165.61,'2005-05-10 00:00:00','2005-05-16 00:00:00','2005-05-14 00:00:00','Shipped',NULL,386,'2005-05-10',2,5,2005), (10416,'S24_2000',32,'87.6000000',1,2803.2,'2005-05-10 00:00:00','2005-05-16 00:00:00','2005-05-14 00:00:00','Shipped',NULL,386,'2005-05-10',2,5,2005), (10416,'S24_3949',18,'75.0600000',13,1351.08,'2005-05-10 00:00:00','2005-05-16 00:00:00','2005-05-14 00:00:00','Shipped',NULL,386,'2005-05-10',2,5,2005), (10416,'S24_4278',48,'74.6200000',5,3581.76,'2005-05-10 00:00:00','2005-05-16 00:00:00','2005-05-14 00:00:00','Shipped',NULL,386,'2005-05-10',2,5,2005), (10416,'S32_1374',45,'100.0000000',2,4764.6,'2005-05-10 00:00:00','2005-05-16 00:00:00','2005-05-14 00:00:00','Shipped',NULL,386,'2005-05-10',2,5,2005), (10416,'S32_4289',26,'61.2200000',7,1591.72,'2005-05-10 00:00:00','2005-05-16 00:00:00','2005-05-14 00:00:00','Shipped',NULL,386,'2005-05-10',2,5,2005), (10416,'S50_1341',37,'51.9300000',8,1921.41,'2005-05-10 00:00:00','2005-05-16 00:00:00','2005-05-14 00:00:00','Shipped',NULL,386,'2005-05-10',2,5,2005), (10416,'S700_1691',23,'91.3400000',9,2100.82,'2005-05-10 00:00:00','2005-05-16 00:00:00','2005-05-14 00:00:00','Shipped',NULL,386,'2005-05-10',2,5,2005), (10416,'S700_2466',22,'100.0000000',11,2457.18,'2005-05-10 00:00:00','2005-05-16 00:00:00','2005-05-14 00:00:00','Shipped',NULL,386,'2005-05-10',2,5,2005), (10416,'S700_2834',41,'100.0000000',3,5642.83,'2005-05-10 00:00:00','2005-05-16 00:00:00','2005-05-14 00:00:00','Shipped',NULL,386,'2005-05-10',2,5,2005), (10416,'S700_3167',39,'67.2000000',10,2620.8,'2005-05-10 00:00:00','2005-05-16 00:00:00','2005-05-14 00:00:00','Shipped',NULL,386,'2005-05-10',2,5,2005), (10416,'S700_4002',43,'62.1900000',12,2674.17,'2005-05-10 00:00:00','2005-05-16 00:00:00','2005-05-14 00:00:00','Shipped',NULL,386,'2005-05-10',2,5,2005), (10417,'S10_1678',66,'100.0000000',2,7516.08,'2005-05-13 00:00:00','2005-05-19 00:00:00','2005-05-19 00:00:00','Disputed','Customer doesn\'t like the colors and precision of the models.',141,'2005-05-13',2,5,2005), (10417,'S10_2016',45,'100.0000000',5,5887.35,'2005-05-13 00:00:00','2005-05-19 00:00:00','2005-05-19 00:00:00','Disputed','Customer doesn\'t like the colors and precision of the models.',141,'2005-05-13',2,5,2005), (10417,'S10_4698',56,'100.0000000',4,9218.16,'2005-05-13 00:00:00','2005-05-19 00:00:00','2005-05-19 00:00:00','Disputed','Customer doesn\'t like the colors and precision of the models.',141,'2005-05-13',2,5,2005), (10417,'S12_2823',21,'100.0000000',1,3447.78,'2005-05-13 00:00:00','2005-05-19 00:00:00','2005-05-19 00:00:00','Disputed','Customer doesn\'t like the colors and precision of the models.',141,'2005-05-13',2,5,2005), (10417,'S18_2625',36,'61.1800000',6,2202.48,'2005-05-13 00:00:00','2005-05-19 00:00:00','2005-05-19 00:00:00','Disputed','Customer doesn\'t like the colors and precision of the models.',141,'2005-05-13',2,5,2005), (10417,'S24_1578',35,'100.0000000',3,3550.05,'2005-05-13 00:00:00','2005-05-19 00:00:00','2005-05-19 00:00:00','Disputed','Customer doesn\'t like the colors and precision of the models.',141,'2005-05-13',2,5,2005), (10418,'S18_3278',16,'76.3900000',2,1222.24,'2005-05-16 00:00:00','2005-05-24 00:00:00','2005-05-20 00:00:00','Shipped',NULL,412,'2005-05-16',2,5,2005), (10418,'S18_3482',27,'100.0000000',1,4445.01,'2005-05-16 00:00:00','2005-05-24 00:00:00','2005-05-20 00:00:00','Shipped',NULL,412,'2005-05-16',2,5,2005), (10418,'S18_3782',33,'52.8400000',5,1743.72,'2005-05-16 00:00:00','2005-05-24 00:00:00','2005-05-20 00:00:00','Shipped',NULL,412,'2005-05-16',2,5,2005), (10418,'S18_4721',28,'100.0000000',4,3833.2,'2005-05-16 00:00:00','2005-05-24 00:00:00','2005-05-20 00:00:00','Shipped',NULL,412,'2005-05-16',2,5,2005), (10418,'S24_2360',52,'65.8000000',8,3421.6,'2005-05-16 00:00:00','2005-05-24 00:00:00','2005-05-20 00:00:00','Shipped',NULL,412,'2005-05-16',2,5,2005), (10418,'S24_4620',10,'87.3100000',3,873.1,'2005-05-16 00:00:00','2005-05-24 00:00:00','2005-05-20 00:00:00','Shipped',NULL,412,'2005-05-16',2,5,2005), (10418,'S32_2206',43,'48.2800000',6,2076.04,'2005-05-16 00:00:00','2005-05-24 00:00:00','2005-05-20 00:00:00','Shipped',NULL,412,'2005-05-16',2,5,2005), (10418,'S32_4485',50,'100.0000000',9,5664,'2005-05-16 00:00:00','2005-05-24 00:00:00','2005-05-20 00:00:00','Shipped',NULL,412,'2005-05-16',2,5,2005), (10418,'S50_4713',40,'72.4100000',7,2896.4,'2005-05-16 00:00:00','2005-05-24 00:00:00','2005-05-20 00:00:00','Shipped',NULL,412,'2005-05-16',2,5,2005), (10419,'S12_1099',12,'100.0000000',13,1961.28,'2005-05-17 00:00:00','2005-05-28 00:00:00','2005-05-19 00:00:00','Shipped',NULL,382,'2005-05-17',2,5,2005), (10419,'S12_3380',10,'100.0000000',11,1092.2,'2005-05-17 00:00:00','2005-05-28 00:00:00','2005-05-19 00:00:00','Shipped',NULL,382,'2005-05-17',2,5,2005), (10419,'S12_3990',34,'90.1700000',14,3065.78,'2005-05-17 00:00:00','2005-05-28 00:00:00','2005-05-19 00:00:00','Shipped',NULL,382,'2005-05-17',2,5,2005), (10419,'S12_4675',32,'100.0000000',10,3832.64,'2005-05-17 00:00:00','2005-05-28 00:00:00','2005-05-19 00:00:00','Shipped',NULL,382,'2005-05-17',2,5,2005), (10419,'S18_1129',38,'100.0000000',5,4464.24,'2005-05-17 00:00:00','2005-05-28 00:00:00','2005-05-19 00:00:00','Shipped',NULL,382,'2005-05-17',2,5,2005), (10419,'S18_1589',37,'100.0000000',1,5202.94,'2005-05-17 00:00:00','2005-05-28 00:00:00','2005-05-19 00:00:00','Shipped',NULL,382,'2005-05-17',2,5,2005), (10419,'S18_1889',39,'83.9300000',9,3273.27,'2005-05-17 00:00:00','2005-05-28 00:00:00','2005-05-19 00:00:00','Shipped',NULL,382,'2005-05-17',2,5,2005), (10419,'S18_1984',34,'100.0000000',4,4594.76,'2005-05-17 00:00:00','2005-05-28 00:00:00','2005-05-19 00:00:00','Shipped',NULL,382,'2005-05-17',2,5,2005), (10419,'S18_2870',55,'100.0000000',2,7695.6,'2005-05-17 00:00:00','2005-05-28 00:00:00','2005-05-19 00:00:00','Shipped',NULL,382,'2005-05-17',2,5,2005), (10419,'S18_3232',35,'100.0000000',6,5926.9,'2005-05-17 00:00:00','2005-05-28 00:00:00','2005-05-19 00:00:00','Shipped',NULL,382,'2005-05-17',2,5,2005), (10419,'S18_3685',43,'100.0000000',3,5589.14,'2005-05-17 00:00:00','2005-05-28 00:00:00','2005-05-19 00:00:00','Shipped',NULL,382,'2005-05-17',2,5,2005), (10419,'S24_2972',15,'42.6700000',7,640.05,'2005-05-17 00:00:00','2005-05-28 00:00:00','2005-05-19 00:00:00','Shipped',NULL,382,'2005-05-17',2,5,2005), (10419,'S24_3371',55,'52.6600000',12,2896.3,'2005-05-17 00:00:00','2005-05-28 00:00:00','2005-05-19 00:00:00','Shipped',NULL,382,'2005-05-17',2,5,2005), (10419,'S24_3856',70,'100.0000000',8,9240,'2005-05-17 00:00:00','2005-05-28 00:00:00','2005-05-19 00:00:00','Shipped',NULL,382,'2005-05-17',2,5,2005), (10420,'S18_1749',37,'100.0000000',5,5283.6,'2005-05-29 00:00:00','2005-06-07 00:00:00','2006-08-23 11:52:11','In Process',NULL,282,'2005-05-29',2,5,2005), (10420,'S18_2248',36,'63.5700000',4,2288.52,'2005-05-29 00:00:00','2005-06-07 00:00:00','2006-08-23 11:52:11','In Process',NULL,282,'2005-05-29',2,5,2005), (10420,'S18_2325',45,'100.0000000',2,4977,'2005-05-29 00:00:00','2005-06-07 00:00:00','2006-08-23 11:52:12','In Process',NULL,282,'2005-05-29',2,5,2005), (10420,'S18_4409',66,'92.9500000',6,6134.7,'2005-05-29 00:00:00','2005-06-07 00:00:00','2006-08-23 11:52:12','In Process',NULL,282,'2005-05-29',2,5,2005), (10420,'S18_4933',36,'57.7300000',7,2078.28,'2005-05-29 00:00:00','2005-06-07 00:00:00','2006-08-23 11:52:12','In Process',NULL,282,'2005-05-29',2,5,2005), (10420,'S24_1046',60,'64.6700000',11,3880.2,'2005-05-29 00:00:00','2005-06-07 00:00:00','2006-08-23 11:52:12','In Process',NULL,282,'2005-05-29',2,5,2005), (10420,'S24_1628',37,'60.3700000',13,2233.69,'2005-05-29 00:00:00','2005-06-07 00:00:00','2006-08-23 11:52:12','In Process',NULL,282,'2005-05-29',2,5,2005), (10420,'S24_1937',45,'26.8800000',1,1209.6,'2005-05-29 00:00:00','2005-06-07 00:00:00','2006-08-23 11:52:12','In Process',NULL,282,'2005-05-29',2,5,2005), (10420,'S24_2766',39,'100.0000000',9,3933.93,'2005-05-29 00:00:00','2005-06-07 00:00:00','2006-08-23 11:52:12','In Process',NULL,282,'2005-05-29',2,5,2005), (10420,'S24_2887',55,'96.3000000',8,5296.5,'2005-05-29 00:00:00','2005-06-07 00:00:00','2006-08-23 11:52:12','In Process',NULL,282,'2005-05-29',2,5,2005), (10420,'S24_3191',35,'96.7400000',10,3385.9,'2005-05-29 00:00:00','2005-06-07 00:00:00','2006-08-23 11:52:12','In Process',NULL,282,'2005-05-29',2,5,2005), (10420,'S24_3432',26,'100.0000000',12,2617.16,'2005-05-29 00:00:00','2005-06-07 00:00:00','2006-08-23 11:52:12','In Process',NULL,282,'2005-05-29',2,5,2005), (10420,'S24_3969',15,'43.4900000',3,652.35,'2005-05-29 00:00:00','2005-06-07 00:00:00','2006-08-23 11:52:12','In Process',NULL,282,'2005-05-29',2,5,2005), (10421,'S18_2795',35,'100.0000000',1,5433.75,'2005-05-29 00:00:00','2005-06-06 00:00:00','2006-08-23 11:52:12','In Process','Custom shipping instructions were sent to warehouse',124,'2005-05-29',2,5,2005), (10421,'S24_2022',40,'45.7000000',2,1828,'2005-05-29 00:00:00','2005-06-06 00:00:00','2006-08-23 11:52:12','In Process','Custom shipping instructions were sent to warehouse',124,'2005-05-29',2,5,2005), (10422,'S18_1342',51,'95.5500000',2,4873.05,'2005-05-30 00:00:00','2005-06-11 00:00:00','2006-08-23 11:52:12','In Process',NULL,157,'2005-05-30',2,5,2005), (10422,'S18_1367',25,'51.7500000',1,1293.75,'2005-05-30 00:00:00','2005-06-11 00:00:00','2006-08-23 11:52:12','In Process',NULL,157,'2005-05-30',2,5,2005), (10423,'S18_2949',10,'88.1400000',1,881.4,'2005-05-30 00:00:00','2005-06-05 00:00:00','2006-08-23 11:52:12','In Process',NULL,314,'2005-05-30',2,5,2005), (10423,'S18_2957',31,'53.7200000',3,1665.32,'2005-05-30 00:00:00','2005-06-05 00:00:00','2006-08-23 11:52:12','In Process',NULL,314,'2005-05-30',2,5,2005), (10423,'S18_3136',21,'84.8200000',2,1781.22,'2005-05-30 00:00:00','2005-06-05 00:00:00','2006-08-23 11:52:12','In Process',NULL,314,'2005-05-30',2,5,2005), (10423,'S18_3320',21,'89.2900000',5,1875.09,'2005-05-30 00:00:00','2005-06-05 00:00:00','2006-08-23 11:52:12','In Process',NULL,314,'2005-05-30',2,5,2005), (10423,'S24_4258',28,'78.8900000',4,2208.92,'2005-05-30 00:00:00','2005-06-05 00:00:00','2006-08-23 11:52:12','In Process',NULL,314,'2005-05-30',2,5,2005), (10424,'S10_1949',50,'100.0000000',6,12001,'2005-05-31 00:00:00','2005-06-08 00:00:00','2006-08-23 11:52:12','In Process',NULL,141,'2005-05-31',2,5,2005), (10424,'S12_1666',49,'100.0000000',3,7969.36,'2005-05-31 00:00:00','2005-06-08 00:00:00','2006-08-23 11:52:12','In Process',NULL,141,'2005-05-31',2,5,2005), (10424,'S18_1097',54,'100.0000000',5,7182,'2005-05-31 00:00:00','2005-06-08 00:00:00','2006-08-23 11:52:12','In Process',NULL,141,'2005-05-31',2,5,2005), (10424,'S18_4668',26,'59.8700000',4,1556.62,'2005-05-31 00:00:00','2005-06-08 00:00:00','2006-08-23 11:52:12','In Process',NULL,141,'2005-05-31',2,5,2005), (10424,'S32_3522',44,'61.4100000',2,2702.04,'2005-05-31 00:00:00','2005-06-08 00:00:00','2006-08-23 11:52:12','In Process',NULL,141,'2005-05-31',2,5,2005), (10424,'S700_2824',46,'80.9200000',1,3722.32,'2005-05-31 00:00:00','2005-06-08 00:00:00','2006-08-23 11:52:12','In Process',NULL,141,'2005-05-31',2,5,2005), (10425,'S10_4962',38,'100.0000000',12,5894.94,'2008-07-31 15:04:46','2005-06-07 00:00:00','2006-08-23 11:52:12','Disputed',NULL,119,'2005-05-31',2,5,2005), (10425,'S12_4473',33,'100.0000000',4,4692.6,'2008-07-31 15:04:46','2005-06-07 00:00:00','2006-08-23 11:52:12','Disputed',NULL,119,'2005-05-31',2,5,2005), (10425,'S18_2238',28,'100.0000000',3,5318.04,'2008-07-31 15:04:46','2005-06-07 00:00:00','2006-08-23 11:52:12','Disputed',NULL,119,'2005-05-31',2,5,2005), (10425,'S18_2319',38,'99.4100000',7,3777.58,'2008-07-31 15:04:46','2005-06-07 00:00:00','2006-08-23 11:52:12','Disputed',NULL,119,'2005-05-31',2,5,2005), (10425,'S18_2432',19,'49.2200000',10,935.18,'2008-07-31 15:04:46','2005-06-07 00:00:00','2006-08-23 11:52:12','Disputed',NULL,119,'2005-05-31',2,5,2005), (10425,'S18_3232',28,'100.0000000',8,3793.16,'2008-07-31 15:04:46','2005-06-07 00:00:00','2006-08-23 11:52:12','Disputed',NULL,119,'2005-05-31',2,5,2005), (10425,'S18_4600',38,'100.0000000',13,4325.16,'2008-07-31 15:04:46','2005-06-07 00:00:00','2006-08-23 11:52:12','Disputed',NULL,119,'2005-05-31',2,5,2005), (10425,'S24_1444',55,'46.8200000',1,2575.1,'2008-07-31 15:04:46','2005-06-07 00:00:00','2006-08-23 11:52:12','Disputed',NULL,119,'2005-05-31',2,5,2005), (10425,'S24_2300',49,'100.0000000',9,5510.54,'2008-07-31 15:04:46','2005-06-07 00:00:00','2006-08-23 11:52:12','Disputed',NULL,119,'2005-05-31',2,5,2005), (10425,'S24_2840',31,'33.2400000',5,1030.44,'2008-07-31 15:04:46','2005-06-07 00:00:00','2006-08-23 11:52:12','Disputed',NULL,119,'2005-05-31',2,5,2005), (10425,'S32_1268',41,'86.6800000',11,3553.88,'2008-07-31 15:04:46','2005-06-07 00:00:00','2006-08-23 11:52:13','Disputed',NULL,119,'2005-05-31',2,5,2005), (10425,'S32_2509',11,'43.8300000',6,482.13,'2008-07-31 15:04:46','2005-06-07 00:00:00','2006-08-23 11:52:13','Disputed',NULL,119,'2005-05-31',2,5,2005), (10425,'S50_1392',18,'100.0000000',2,1895.94,'2008-07-31 15:04:46','2005-06-07 00:00:00','2006-08-23 11:52:13','Disputed',NULL,119,'2005-05-31',2,5,2005); /*!40000 ALTER TABLE `orderfact` ENABLE KEYS */; -- -- Definition of table `orders` -- DROP TABLE IF EXISTS `orders`; CREATE TABLE `orders` ( `ORDERNUMBER` int(11) NOT NULL default '0', `ORDERDATE` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP, `REQUIREDDATE` timestamp NOT NULL default '0000-00-00 00:00:00', `SHIPPEDDATE` timestamp NOT NULL default '0000-00-00 00:00:00', `STATUS` varchar(15) collate latin1_general_cs NOT NULL default '', `COMMENTS` mediumtext collate latin1_general_cs, `CUSTOMERNUMBER` int(11) NOT NULL default '0', PRIMARY KEY (`ORDERNUMBER`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_general_cs; -- -- Dumping data for table `orders` -- /*!40000 ALTER TABLE `orders` DISABLE KEYS */; INSERT INTO `orders` (`ORDERNUMBER`,`ORDERDATE`,`REQUIREDDATE`,`SHIPPEDDATE`,`STATUS`,`COMMENTS`,`CUSTOMERNUMBER`) VALUES (10100,'2003-01-06 00:00:00','2003-01-13 00:00:00','2003-01-10 00:00:00','Shipped',NULL,363), (10101,'2003-01-09 00:00:00','2003-01-18 00:00:00','2003-01-11 00:00:00','Shipped','Check on availability.',128), (10102,'2003-01-10 00:00:00','2003-01-18 00:00:00','2003-01-14 00:00:00','Shipped',NULL,181), (10103,'2003-01-29 00:00:00','2003-02-07 00:00:00','2003-02-02 00:00:00','Shipped',NULL,121), (10104,'2003-01-31 00:00:00','2003-02-09 00:00:00','2003-02-01 00:00:00','Shipped',NULL,141), (10105,'2003-02-11 00:00:00','2003-02-21 00:00:00','2003-02-12 00:00:00','Shipped',NULL,145), (10106,'2003-02-17 00:00:00','2003-02-24 00:00:00','2003-02-21 00:00:00','Shipped',NULL,278), (10107,'2003-02-24 00:00:00','2003-03-03 00:00:00','2003-02-26 00:00:00','Shipped','Difficult to negotiate with customer. We need more marketing materials',131), (10108,'2003-03-03 00:00:00','2003-03-12 00:00:00','2003-03-08 00:00:00','Shipped',NULL,385), (10109,'2003-03-10 00:00:00','2003-03-19 00:00:00','2003-03-11 00:00:00','Shipped','Customer requested that FedEx Ground is used for this shipping',486), (10110,'2003-03-18 00:00:00','2003-03-24 00:00:00','2003-03-20 00:00:00','Shipped',NULL,187), (10111,'2003-03-25 00:00:00','2003-03-31 00:00:00','2003-03-30 00:00:00','Shipped',NULL,129), (10112,'2003-03-24 00:00:00','2003-04-03 00:00:00','2003-03-29 00:00:00','Shipped','Customer requested that ad materials (such as posters, pamphlets) be included in the shippment',144), (10113,'2003-03-26 00:00:00','2003-04-02 00:00:00','2003-03-27 00:00:00','Shipped',NULL,124), (10114,'2003-04-01 00:00:00','2003-04-07 00:00:00','2003-04-02 00:00:00','Shipped',NULL,172), (10115,'2003-04-04 00:00:00','2003-04-12 00:00:00','2003-04-07 00:00:00','Shipped',NULL,424), (10116,'2003-04-11 00:00:00','2003-04-19 00:00:00','2003-04-13 00:00:00','Shipped',NULL,381), (10117,'2003-04-16 00:00:00','2003-04-24 00:00:00','2003-04-17 00:00:00','Shipped',NULL,148), (10118,'2003-04-21 00:00:00','2003-04-29 00:00:00','2003-04-26 00:00:00','Shipped','Customer has worked with some of our vendors in the past and is aware of their MSRP',216), (10119,'2003-04-28 00:00:00','2003-05-05 00:00:00','2003-05-02 00:00:00','Shipped',NULL,382), (10120,'2003-04-29 00:00:00','2003-05-08 00:00:00','2003-05-01 00:00:00','Shipped',NULL,114), (10121,'2003-05-07 00:00:00','2003-05-13 00:00:00','2003-05-13 00:00:00','Shipped',NULL,353), (10122,'2003-05-08 00:00:00','2003-05-16 00:00:00','2003-05-13 00:00:00','Shipped',NULL,350), (10123,'2003-05-20 00:00:00','2003-05-29 00:00:00','2003-05-22 00:00:00','Shipped',NULL,103), (10124,'2003-05-21 00:00:00','2003-05-29 00:00:00','2003-05-25 00:00:00','Shipped','Customer very concerned about the exact color of the models. There is high risk that he may dispute the order because there is a slight color mismatch',112), (10125,'2003-05-21 00:00:00','2003-05-27 00:00:00','2003-05-24 00:00:00','Shipped',NULL,114), (10126,'2003-05-28 00:00:00','2003-06-07 00:00:00','2003-06-02 00:00:00','Shipped',NULL,458), (10127,'2003-06-03 00:00:00','2003-06-09 00:00:00','2003-06-06 00:00:00','Shipped','Customer requested special shippment. The instructions were passed along to the warehouse',151), (10128,'2003-06-06 00:00:00','2003-06-12 00:00:00','2003-06-11 00:00:00','Shipped',NULL,141), (10129,'2003-06-12 00:00:00','2003-06-18 00:00:00','2003-06-14 00:00:00','Shipped',NULL,324), (10130,'2003-06-16 00:00:00','2003-06-24 00:00:00','2003-06-21 00:00:00','Shipped',NULL,198), (10131,'2003-06-16 00:00:00','2003-06-25 00:00:00','2003-06-21 00:00:00','Shipped',NULL,447), (10132,'2003-06-25 00:00:00','2003-07-01 00:00:00','2003-06-28 00:00:00','Shipped',NULL,323), (10133,'2003-06-27 00:00:00','2003-07-04 00:00:00','2003-07-03 00:00:00','Shipped',NULL,141), (10134,'2003-07-01 00:00:00','2003-07-10 00:00:00','2003-07-05 00:00:00','Shipped',NULL,250), (10135,'2003-07-02 00:00:00','2003-07-12 00:00:00','2003-07-03 00:00:00','Shipped',NULL,124), (10136,'2003-07-04 00:00:00','2003-07-14 00:00:00','2003-07-06 00:00:00','Shipped','Customer is interested in buying more Ferrari models',242), (10137,'2003-07-10 00:00:00','2003-07-20 00:00:00','2003-07-14 00:00:00','Shipped',NULL,353), (10138,'2003-07-07 00:00:00','2003-07-16 00:00:00','2003-07-13 00:00:00','Shipped',NULL,496), (10139,'2003-07-16 00:00:00','2003-07-23 00:00:00','2003-07-21 00:00:00','Shipped',NULL,282), (10140,'2003-07-24 00:00:00','2003-08-02 00:00:00','2003-07-30 00:00:00','Shipped',NULL,161), (10141,'2003-08-01 00:00:00','2003-08-09 00:00:00','2003-08-04 00:00:00','Shipped',NULL,334), (10142,'2003-08-08 00:00:00','2003-08-16 00:00:00','2003-08-13 00:00:00','Shipped',NULL,124), (10143,'2003-08-10 00:00:00','2003-08-18 00:00:00','2003-08-12 00:00:00','Shipped','Can we deliver the new Ford Mustang models by end-of-quarter?',320), (10144,'2003-08-13 00:00:00','2003-08-21 00:00:00','2003-08-14 00:00:00','Shipped',NULL,381), (10145,'2003-08-25 00:00:00','2003-09-02 00:00:00','2003-08-31 00:00:00','Shipped',NULL,205), (10146,'2003-09-03 00:00:00','2003-09-13 00:00:00','2003-09-06 00:00:00','Shipped',NULL,447), (10147,'2003-09-05 00:00:00','2003-09-12 00:00:00','2003-09-09 00:00:00','Shipped',NULL,379), (10148,'2003-09-11 00:00:00','2003-09-21 00:00:00','2003-09-15 00:00:00','Shipped','They want to reevaluate their terms agreement with Finance.',276), (10149,'2003-09-12 00:00:00','2003-09-18 00:00:00','2003-09-17 00:00:00','Shipped',NULL,487), (10150,'2003-09-19 00:00:00','2003-09-27 00:00:00','2003-09-21 00:00:00','Shipped','They want to reevaluate their terms agreement with Finance.',148), (10151,'2003-09-21 00:00:00','2003-09-30 00:00:00','2003-09-24 00:00:00','Shipped',NULL,311), (10152,'2003-09-25 00:00:00','2003-10-03 00:00:00','2003-10-01 00:00:00','Shipped',NULL,333), (10153,'2003-09-28 00:00:00','2003-10-05 00:00:00','2003-10-03 00:00:00','Shipped',NULL,141), (10154,'2003-10-02 00:00:00','2003-10-12 00:00:00','2003-10-08 00:00:00','Shipped',NULL,219), (10155,'2003-10-06 00:00:00','2003-10-13 00:00:00','2003-10-07 00:00:00','Shipped',NULL,186), (10156,'2003-10-08 00:00:00','2003-10-17 00:00:00','2003-10-11 00:00:00','Shipped',NULL,141), (10157,'2003-10-09 00:00:00','2003-10-15 00:00:00','2003-10-14 00:00:00','Shipped',NULL,473), (10158,'2003-10-10 00:00:00','2003-10-18 00:00:00','2003-10-15 00:00:00','Shipped',NULL,121), (10159,'2003-10-10 00:00:00','2003-10-19 00:00:00','2003-10-16 00:00:00','Shipped',NULL,321), (10160,'2003-10-11 00:00:00','2003-10-17 00:00:00','2003-10-17 00:00:00','Shipped',NULL,347), (10161,'2003-10-17 00:00:00','2003-10-25 00:00:00','2003-10-20 00:00:00','Shipped',NULL,227), (10162,'2003-10-18 00:00:00','2003-10-26 00:00:00','2003-10-19 00:00:00','Shipped',NULL,321), (10163,'2003-10-20 00:00:00','2003-10-27 00:00:00','2003-10-24 00:00:00','Shipped',NULL,424), (10164,'2003-10-21 00:00:00','2003-10-30 00:00:00','2003-10-23 00:00:00','Resolved','This order was disputed, but resolved on 11/1/2003; Customer doesn\'t like the colors and precision of the models.',452), (10165,'2003-10-22 00:00:00','2003-10-31 00:00:00','2003-12-26 00:00:00','Shipped','This order was on hold because customers\'s credit limit had been exceeded. Order will ship when payment is received',148), (10166,'2003-10-21 00:00:00','2003-10-30 00:00:00','2003-10-27 00:00:00','Shipped',NULL,462), (10167,'2003-10-23 00:00:00','2003-10-30 00:00:00','2006-08-23 11:49:12','Cancelled','Customer called to cancel. The warehouse was notified in time and the order didn\'t ship. They have a new VP of Sales and are shifting their sales model. Our VP of Sales should contact them.',448), (10168,'2003-10-28 00:00:00','2003-11-03 00:00:00','2003-11-01 00:00:00','Shipped',NULL,161), (10169,'2003-11-04 00:00:00','2003-11-14 00:00:00','2003-11-09 00:00:00','Shipped',NULL,276), (10170,'2003-11-04 00:00:00','2003-11-12 00:00:00','2003-11-07 00:00:00','Shipped',NULL,452), (10171,'2003-11-05 00:00:00','2003-11-13 00:00:00','2003-11-07 00:00:00','Shipped',NULL,233), (10172,'2003-11-05 00:00:00','2003-11-14 00:00:00','2003-11-11 00:00:00','Shipped',NULL,175), (10173,'2003-11-05 00:00:00','2003-11-15 00:00:00','2003-11-09 00:00:00','Shipped','Cautious optimism. We have happy customers here, if we can keep them well stocked. I need all the information I can get on the planned shippments of Porches',278), (10174,'2003-11-06 00:00:00','2003-11-15 00:00:00','2003-11-10 00:00:00','Shipped',NULL,333), (10175,'2003-11-06 00:00:00','2003-11-14 00:00:00','2003-11-09 00:00:00','Shipped',NULL,324), (10176,'2003-11-06 00:00:00','2003-11-15 00:00:00','2003-11-12 00:00:00','Shipped',NULL,386), (10177,'2003-11-07 00:00:00','2003-11-17 00:00:00','2003-11-12 00:00:00','Shipped',NULL,344), (10178,'2003-11-08 00:00:00','2003-11-16 00:00:00','2003-11-10 00:00:00','Shipped','Custom shipping instructions sent to warehouse',242), (10179,'2003-11-11 00:00:00','2003-11-17 00:00:00','2003-11-13 00:00:00','Cancelled','Customer cancelled due to urgent budgeting issues. Must be cautious when dealing with them in the future. Since order shipped already we must discuss who would cover the shipping charges.',496), (10180,'2003-11-11 00:00:00','2003-11-19 00:00:00','2003-11-14 00:00:00','Shipped',NULL,171), (10181,'2003-11-12 00:00:00','2003-11-19 00:00:00','2003-11-15 00:00:00','Shipped',NULL,167), (10182,'2003-11-12 00:00:00','2003-11-21 00:00:00','2003-11-18 00:00:00','Shipped',NULL,124), (10183,'2003-11-13 00:00:00','2003-11-22 00:00:00','2003-11-15 00:00:00','Shipped','We need to keep in close contact with their Marketing VP. He is the decision maker for all their purchases.',339), (10184,'2003-11-14 00:00:00','2003-11-22 00:00:00','2003-11-20 00:00:00','Shipped',NULL,484), (10185,'2003-11-14 00:00:00','2003-11-21 00:00:00','2003-11-20 00:00:00','Shipped',NULL,320), (10186,'2003-11-14 00:00:00','2003-11-20 00:00:00','2003-11-18 00:00:00','Shipped','They want to reevaluate their terms agreement with the VP of Sales',489), (10187,'2003-11-15 00:00:00','2003-11-24 00:00:00','2003-11-16 00:00:00','Shipped',NULL,211), (10188,'2003-11-18 00:00:00','2003-11-26 00:00:00','2003-11-24 00:00:00','Shipped',NULL,167), (10189,'2003-11-18 00:00:00','2003-11-25 00:00:00','2003-11-24 00:00:00','Shipped','They want to reevaluate their terms agreement with Finance.',205), (10190,'2003-11-19 00:00:00','2003-11-29 00:00:00','2003-11-20 00:00:00','Shipped',NULL,141), (10191,'2003-11-20 00:00:00','2003-11-30 00:00:00','2003-11-24 00:00:00','Shipped','We must be cautions with this customer. Their VP of Sales resigned. Company may be heading down.',259), (10192,'2003-11-20 00:00:00','2003-11-29 00:00:00','2003-11-25 00:00:00','Shipped',NULL,363), (10193,'2003-11-21 00:00:00','2003-11-28 00:00:00','2003-11-27 00:00:00','Shipped',NULL,471), (10194,'2003-11-25 00:00:00','2003-12-02 00:00:00','2003-11-26 00:00:00','Shipped',NULL,146), (10195,'2003-11-25 00:00:00','2003-12-01 00:00:00','2003-11-28 00:00:00','Shipped',NULL,319), (10196,'2003-11-26 00:00:00','2003-12-03 00:00:00','2003-12-01 00:00:00','Shipped',NULL,455), (10197,'2003-11-26 00:00:00','2003-12-02 00:00:00','2003-12-01 00:00:00','Shipped','Customer inquired about remote controlled models and gold models.',216), (10198,'2003-11-27 00:00:00','2003-12-06 00:00:00','2003-12-03 00:00:00','Shipped',NULL,385), (10199,'2003-12-01 00:00:00','2003-12-10 00:00:00','2003-12-06 00:00:00','Shipped',NULL,475), (10200,'2003-12-01 00:00:00','2003-12-09 00:00:00','2003-12-06 00:00:00','Shipped',NULL,211), (10201,'2003-12-01 00:00:00','2003-12-11 00:00:00','2003-12-02 00:00:00','Shipped',NULL,129), (10202,'2003-12-02 00:00:00','2003-12-09 00:00:00','2003-12-06 00:00:00','Shipped',NULL,357), (10203,'2003-12-02 00:00:00','2003-12-11 00:00:00','2003-12-07 00:00:00','Shipped',NULL,141), (10204,'2003-12-02 00:00:00','2003-12-10 00:00:00','2003-12-04 00:00:00','Shipped',NULL,151), (10205,'2003-12-03 00:00:00','2003-12-09 00:00:00','2003-12-07 00:00:00','Shipped',' I need all the information I can get on our competitors.',141), (10206,'2003-12-05 00:00:00','2003-12-13 00:00:00','2003-12-08 00:00:00','Shipped','Can we renegotiate this one?',202), (10207,'2003-12-09 00:00:00','2003-12-17 00:00:00','2003-12-11 00:00:00','Shipped','Check on availability.',495), (10208,'2004-01-02 00:00:00','2004-01-11 00:00:00','2004-01-04 00:00:00','Shipped',NULL,146), (10209,'2004-01-09 00:00:00','2004-01-15 00:00:00','2004-01-12 00:00:00','Shipped',NULL,347), (10210,'2004-01-12 00:00:00','2004-01-22 00:00:00','2004-01-20 00:00:00','Shipped',NULL,177), (10211,'2004-01-15 00:00:00','2004-01-25 00:00:00','2004-01-18 00:00:00','Shipped',NULL,406), (10212,'2004-01-16 00:00:00','2004-01-24 00:00:00','2004-01-18 00:00:00','Shipped',NULL,141), (10213,'2004-01-22 00:00:00','2004-01-28 00:00:00','2004-01-27 00:00:00','Shipped','Difficult to negotiate with customer. We need more marketing materials',489), (10214,'2004-01-26 00:00:00','2004-02-04 00:00:00','2004-01-29 00:00:00','Shipped',NULL,458), (10215,'2004-01-29 00:00:00','2004-02-08 00:00:00','2004-02-01 00:00:00','Shipped','Customer requested that FedEx Ground is used for this shipping',475), (10216,'2004-02-02 00:00:00','2004-02-10 00:00:00','2004-02-04 00:00:00','Shipped',NULL,256), (10217,'2004-02-04 00:00:00','2004-02-14 00:00:00','2004-02-06 00:00:00','Shipped',NULL,166), (10218,'2004-02-09 00:00:00','2004-02-16 00:00:00','2004-02-11 00:00:00','Shipped','Customer requested that ad materials (such as posters, pamphlets) be included in the shippment',473), (10219,'2004-02-10 00:00:00','2004-02-17 00:00:00','2004-02-12 00:00:00','Shipped',NULL,487), (10220,'2004-02-12 00:00:00','2004-02-19 00:00:00','2004-02-16 00:00:00','Shipped',NULL,189), (10221,'2004-02-18 00:00:00','2004-02-26 00:00:00','2004-02-19 00:00:00','Shipped',NULL,314), (10222,'2004-02-19 00:00:00','2004-02-27 00:00:00','2004-02-20 00:00:00','Shipped',NULL,239), (10223,'2004-02-20 00:00:00','2004-02-29 00:00:00','2004-02-24 00:00:00','Shipped',NULL,114), (10224,'2004-02-21 00:00:00','2004-03-02 00:00:00','2004-02-26 00:00:00','Shipped','Customer has worked with some of our vendors in the past and is aware of their MSRP',171), (10225,'2004-02-22 00:00:00','2004-03-01 00:00:00','2004-02-24 00:00:00','Shipped',NULL,298), (10226,'2004-02-26 00:00:00','2004-03-06 00:00:00','2004-03-02 00:00:00','Shipped',NULL,239), (10227,'2004-03-02 00:00:00','2004-03-12 00:00:00','2004-03-08 00:00:00','Shipped',NULL,146), (10228,'2004-03-10 00:00:00','2004-03-18 00:00:00','2004-03-13 00:00:00','Shipped',NULL,173), (10229,'2004-03-11 00:00:00','2004-03-20 00:00:00','2004-03-12 00:00:00','Shipped',NULL,124), (10230,'2004-03-15 00:00:00','2004-03-24 00:00:00','2004-03-20 00:00:00','Shipped','Customer very concerned about the exact color of the models. There is high risk that he may dispute the order because there is a slight color mismatch',128), (10231,'2004-03-19 00:00:00','2004-03-26 00:00:00','2004-03-25 00:00:00','Shipped',NULL,344), (10232,'2004-03-20 00:00:00','2004-03-30 00:00:00','2004-03-25 00:00:00','Shipped',NULL,240), (10233,'2004-03-29 00:00:00','2004-04-04 00:00:00','2004-04-02 00:00:00','Shipped','Customer requested special shippment. The instructions were passed along to the warehouse',328), (10234,'2004-03-30 00:00:00','2004-04-05 00:00:00','2004-04-02 00:00:00','Shipped',NULL,412), (10235,'2004-04-02 00:00:00','2004-04-12 00:00:00','2004-04-06 00:00:00','Shipped',NULL,260), (10236,'2004-04-03 00:00:00','2004-04-11 00:00:00','2004-04-08 00:00:00','Shipped',NULL,486), (10237,'2004-04-05 00:00:00','2004-04-12 00:00:00','2004-04-10 00:00:00','Shipped',NULL,181), (10238,'2004-04-09 00:00:00','2004-04-16 00:00:00','2004-04-10 00:00:00','Shipped',NULL,145), (10239,'2004-04-12 00:00:00','2004-04-21 00:00:00','2004-04-17 00:00:00','Shipped',NULL,311), (10240,'2004-04-13 00:00:00','2004-04-20 00:00:00','2004-04-20 00:00:00','Shipped',NULL,177), (10241,'2004-04-13 00:00:00','2004-04-20 00:00:00','2004-04-19 00:00:00','Shipped',NULL,209), (10242,'2004-04-20 00:00:00','2004-04-28 00:00:00','2004-04-25 00:00:00','Shipped','Customer is interested in buying more Ferrari models',456), (10243,'2004-04-26 00:00:00','2004-05-03 00:00:00','2004-04-28 00:00:00','Shipped',NULL,495), (10244,'2004-04-29 00:00:00','2004-05-09 00:00:00','2004-05-04 00:00:00','Shipped',NULL,141), (10245,'2004-05-04 00:00:00','2004-05-12 00:00:00','2004-05-09 00:00:00','Shipped',NULL,455), (10246,'2004-05-05 00:00:00','2004-05-13 00:00:00','2004-05-06 00:00:00','Shipped',NULL,141), (10247,'2004-05-05 00:00:00','2004-05-11 00:00:00','2004-05-08 00:00:00','Shipped',NULL,334), (10248,'2004-05-07 00:00:00','2004-05-14 00:00:00','2006-08-23 11:49:15','Cancelled','Order was mistakenly placed. The warehouse noticed the lack of documentation.',131), (10249,'2004-05-08 00:00:00','2004-05-17 00:00:00','2004-05-11 00:00:00','Shipped','Can we deliver the new Ford Mustang models by end-of-quarter?',173), (10250,'2004-05-11 00:00:00','2004-05-19 00:00:00','2004-05-15 00:00:00','Shipped',NULL,450), (10251,'2004-05-18 00:00:00','2004-05-24 00:00:00','2004-05-24 00:00:00','Shipped',NULL,328), (10252,'2004-05-26 00:00:00','2004-06-04 00:00:00','2004-05-29 00:00:00','Shipped',NULL,406), (10253,'2004-06-01 00:00:00','2004-06-09 00:00:00','2004-06-02 00:00:00','Cancelled','Customer disputed the order and we agreed to cancel it. We must be more cautions with this customer going forward, since they are very hard to please. We must cover the shipping fees.',201), (10254,'2004-06-03 00:00:00','2004-06-13 00:00:00','2004-06-04 00:00:00','Shipped','Customer requested that DHL is used for this shipping',323), (10255,'2004-06-04 00:00:00','2004-06-12 00:00:00','2004-06-09 00:00:00','Shipped',NULL,209), (10256,'2004-06-08 00:00:00','2004-06-16 00:00:00','2004-06-10 00:00:00','Shipped',NULL,145), (10257,'2004-06-14 00:00:00','2004-06-24 00:00:00','2004-06-15 00:00:00','Shipped',NULL,450), (10258,'2004-06-15 00:00:00','2004-06-25 00:00:00','2004-06-23 00:00:00','Shipped',NULL,398), (10259,'2004-06-15 00:00:00','2004-06-22 00:00:00','2004-06-17 00:00:00','Shipped',NULL,166), (10260,'2004-06-16 00:00:00','2004-06-22 00:00:00','2006-08-23 11:49:15','Cancelled','Customer heard complaints from their customers and called to cancel this order. Will notify the Sales Manager.',357), (10261,'2004-06-17 00:00:00','2004-06-25 00:00:00','2004-06-22 00:00:00','Shipped',NULL,233), (10262,'2004-06-24 00:00:00','2004-07-01 00:00:00','2006-08-23 11:49:15','Cancelled','This customer found a better offer from one of our competitors. Will call back to renegotiate.',141), (10263,'2004-06-28 00:00:00','2004-07-04 00:00:00','2004-07-02 00:00:00','Shipped',NULL,175), (10264,'2004-06-30 00:00:00','2004-07-06 00:00:00','2004-07-01 00:00:00','Shipped','Customer will send a truck to our local warehouse on 7/1/2004',362), (10265,'2004-07-02 00:00:00','2004-07-09 00:00:00','2004-07-07 00:00:00','Shipped',NULL,471), (10266,'2004-07-06 00:00:00','2004-07-14 00:00:00','2004-07-10 00:00:00','Shipped',NULL,386), (10267,'2004-07-07 00:00:00','2004-07-17 00:00:00','2004-07-09 00:00:00','Shipped',NULL,151), (10268,'2004-07-12 00:00:00','2004-07-18 00:00:00','2004-07-14 00:00:00','Shipped',NULL,412), (10269,'2004-07-16 00:00:00','2004-07-22 00:00:00','2004-07-18 00:00:00','Shipped',NULL,382), (10270,'2004-07-19 00:00:00','2004-07-27 00:00:00','2004-07-24 00:00:00','Shipped','Can we renegotiate this one?',282), (10271,'2004-07-20 00:00:00','2004-07-29 00:00:00','2004-07-23 00:00:00','Shipped',NULL,124), (10272,'2004-07-20 00:00:00','2004-07-26 00:00:00','2004-07-22 00:00:00','Shipped',NULL,157), (10273,'2004-07-21 00:00:00','2004-07-28 00:00:00','2004-07-22 00:00:00','Shipped',NULL,314), (10274,'2004-07-21 00:00:00','2004-07-29 00:00:00','2004-07-22 00:00:00','Shipped',NULL,379), (10275,'2004-07-23 00:00:00','2004-08-02 00:00:00','2004-07-29 00:00:00','Shipped',NULL,119), (10276,'2004-08-02 00:00:00','2004-08-11 00:00:00','2004-08-08 00:00:00','Shipped',NULL,204), (10277,'2004-08-04 00:00:00','2004-08-12 00:00:00','2004-08-05 00:00:00','Shipped',NULL,148), (10278,'2004-08-06 00:00:00','2004-08-16 00:00:00','2004-08-09 00:00:00','Shipped',NULL,112), (10279,'2004-08-09 00:00:00','2004-08-19 00:00:00','2004-08-15 00:00:00','Shipped','Cautious optimism. We have happy customers here, if we can keep them well stocked. I need all the information I can get on the planned shippments of Porches',141), (10280,'2004-08-17 00:00:00','2004-08-27 00:00:00','2004-08-19 00:00:00','Shipped',NULL,249), (10281,'2004-08-19 00:00:00','2004-08-28 00:00:00','2004-08-23 00:00:00','Shipped',NULL,157), (10282,'2004-08-20 00:00:00','2004-08-26 00:00:00','2004-08-22 00:00:00','Shipped',NULL,124), (10283,'2004-08-20 00:00:00','2004-08-30 00:00:00','2004-08-23 00:00:00','Shipped',NULL,260), (10284,'2004-08-21 00:00:00','2004-08-29 00:00:00','2004-08-26 00:00:00','Shipped','Custom shipping instructions sent to warehouse',299), (10285,'2004-08-27 00:00:00','2004-09-04 00:00:00','2004-08-31 00:00:00','Shipped',NULL,286), (10286,'2004-08-28 00:00:00','2004-09-06 00:00:00','2004-09-01 00:00:00','Shipped',NULL,172), (10287,'2004-08-30 00:00:00','2004-09-06 00:00:00','2004-09-01 00:00:00','Shipped',NULL,298), (10288,'2004-09-01 00:00:00','2004-09-11 00:00:00','2004-09-05 00:00:00','Shipped',NULL,166), (10289,'2004-09-03 00:00:00','2004-09-13 00:00:00','2004-09-04 00:00:00','Shipped','We need to keep in close contact with their Marketing VP. He is the decision maker for all their purchases.',167), (10290,'2004-09-07 00:00:00','2004-09-15 00:00:00','2004-09-13 00:00:00','Shipped',NULL,198), (10291,'2004-09-08 00:00:00','2004-09-17 00:00:00','2004-09-14 00:00:00','Shipped',NULL,448), (10292,'2004-09-08 00:00:00','2004-09-18 00:00:00','2004-09-11 00:00:00','Shipped','They want to reevaluate their terms agreement with Finance.',131), (10293,'2004-09-09 00:00:00','2004-09-18 00:00:00','2004-09-14 00:00:00','Shipped',NULL,249), (10294,'2004-09-10 00:00:00','2004-09-17 00:00:00','2004-09-14 00:00:00','Shipped',NULL,204), (10295,'2004-09-10 00:00:00','2004-09-17 00:00:00','2004-09-14 00:00:00','Shipped','They want to reevaluate their terms agreement with Finance.',362), (10296,'2004-09-15 00:00:00','2004-09-22 00:00:00','2004-09-16 00:00:00','Shipped',NULL,415), (10297,'2004-09-16 00:00:00','2004-09-22 00:00:00','2004-09-21 00:00:00','Shipped','We must be cautions with this customer. Their VP of Sales resigned. Company may be heading down.',189), (10298,'2004-09-27 00:00:00','2004-10-05 00:00:00','2004-10-01 00:00:00','Shipped',NULL,103), (10299,'2004-09-30 00:00:00','2004-10-10 00:00:00','2004-10-01 00:00:00','Shipped',NULL,186), (10300,'2003-10-04 00:00:00','2003-10-13 00:00:00','2003-10-09 00:00:00','Shipped',NULL,128), (10301,'2003-10-05 00:00:00','2003-10-15 00:00:00','2003-10-08 00:00:00','Shipped',NULL,299), (10302,'2003-10-06 00:00:00','2003-10-16 00:00:00','2003-10-07 00:00:00','Shipped',NULL,201), (10303,'2004-10-06 00:00:00','2004-10-14 00:00:00','2004-10-09 00:00:00','Shipped','Customer inquired about remote controlled models and gold models.',484), (10304,'2004-10-11 00:00:00','2004-10-20 00:00:00','2004-10-17 00:00:00','Shipped',NULL,256), (10305,'2004-10-13 00:00:00','2004-10-22 00:00:00','2004-10-15 00:00:00','Shipped','Check on availability.',286), (10306,'2004-10-14 00:00:00','2004-10-21 00:00:00','2004-10-17 00:00:00','Shipped',NULL,187), (10307,'2004-10-14 00:00:00','2004-10-23 00:00:00','2004-10-20 00:00:00','Shipped',NULL,339), (10308,'2004-10-15 00:00:00','2004-10-24 00:00:00','2004-10-20 00:00:00','Shipped','Customer requested that FedEx Ground is used for this shipping',319), (10309,'2004-10-15 00:00:00','2004-10-24 00:00:00','2004-10-18 00:00:00','Shipped',NULL,121), (10310,'2004-10-16 00:00:00','2004-10-24 00:00:00','2004-10-18 00:00:00','Shipped',NULL,259), (10311,'2004-10-16 00:00:00','2004-10-23 00:00:00','2004-10-20 00:00:00','Shipped','Difficult to negotiate with customer. We need more marketing materials',141), (10312,'2004-10-21 00:00:00','2004-10-27 00:00:00','2004-10-23 00:00:00','Shipped',NULL,124), (10313,'2004-10-22 00:00:00','2004-10-28 00:00:00','2004-10-25 00:00:00','Shipped','Customer requested that FedEx Ground is used for this shipping',202), (10314,'2004-10-22 00:00:00','2004-11-01 00:00:00','2004-10-23 00:00:00','Shipped',NULL,227), (10315,'2004-10-29 00:00:00','2004-11-08 00:00:00','2004-10-30 00:00:00','Shipped',NULL,119), (10316,'2004-11-01 00:00:00','2004-11-09 00:00:00','2004-11-07 00:00:00','Shipped','Customer requested that ad materials (such as posters, pamphlets) be included in the shippment',240), (10317,'2004-11-02 00:00:00','2004-11-12 00:00:00','2004-11-08 00:00:00','Shipped',NULL,161), (10318,'2004-11-02 00:00:00','2004-11-09 00:00:00','2004-11-07 00:00:00','Shipped',NULL,157), (10319,'2004-11-03 00:00:00','2004-11-11 00:00:00','2004-11-06 00:00:00','Shipped','Customer requested that DHL is used for this shipping',456), (10320,'2004-11-03 00:00:00','2004-11-13 00:00:00','2004-11-07 00:00:00','Shipped',NULL,144), (10321,'2004-11-04 00:00:00','2004-11-12 00:00:00','2004-11-07 00:00:00','Shipped',NULL,462), (10322,'2004-11-04 00:00:00','2004-11-12 00:00:00','2004-11-10 00:00:00','Shipped','Customer has worked with some of our vendors in the past and is aware of their MSRP',363), (10323,'2004-11-05 00:00:00','2004-11-12 00:00:00','2004-11-09 00:00:00','Shipped',NULL,128), (10324,'2004-11-05 00:00:00','2004-11-11 00:00:00','2004-11-08 00:00:00','Shipped',NULL,181), (10325,'2004-11-05 00:00:00','2004-11-13 00:00:00','2004-11-08 00:00:00','Shipped',NULL,121), (10326,'2004-11-09 00:00:00','2004-11-16 00:00:00','2004-11-10 00:00:00','Shipped',NULL,144), (10327,'2004-11-10 00:00:00','2004-11-19 00:00:00','2004-11-13 00:00:00','Resolved','Order was disputed and resolved on 12/1/04. The Sales Manager was involved. Customer claims the scales of the models don\'t match what was discussed.',145), (10328,'2004-11-12 00:00:00','2004-11-21 00:00:00','2004-11-18 00:00:00','Shipped','Customer very concerned about the exact color of the models. There is high risk that he may dispute the order because there is a slight color mismatch',278), (10329,'2004-11-15 00:00:00','2004-11-24 00:00:00','2004-11-16 00:00:00','Shipped',NULL,131), (10330,'2004-11-16 00:00:00','2004-11-25 00:00:00','2004-11-21 00:00:00','Shipped',NULL,385), (10331,'2004-11-17 00:00:00','2004-11-23 00:00:00','2004-11-23 00:00:00','Shipped','Customer requested special shippment. The instructions were passed along to the warehouse',486), (10332,'2004-11-17 00:00:00','2004-11-25 00:00:00','2004-11-18 00:00:00','Shipped',NULL,187), (10333,'2004-11-18 00:00:00','2004-11-27 00:00:00','2004-11-20 00:00:00','Shipped',NULL,129), (10334,'2004-11-19 00:00:00','2004-11-28 00:00:00','2006-08-23 11:49:17','On Hold','The outstaniding balance for this customer exceeds their credit limit. Order will be shipped when a payment is received.',144), (10335,'2004-11-19 00:00:00','2004-11-29 00:00:00','2004-11-23 00:00:00','Shipped',NULL,124), (10336,'2004-11-20 00:00:00','2004-11-26 00:00:00','2004-11-24 00:00:00','Shipped','Customer requested that DHL is used for this shipping',172), (10337,'2004-11-21 00:00:00','2004-11-30 00:00:00','2004-11-26 00:00:00','Shipped',NULL,424), (10338,'2004-11-22 00:00:00','2004-12-02 00:00:00','2004-11-27 00:00:00','Shipped',NULL,381), (10339,'2004-11-23 00:00:00','2004-11-30 00:00:00','2004-11-30 00:00:00','Shipped',NULL,398), (10340,'2004-11-24 00:00:00','2004-12-01 00:00:00','2004-11-25 00:00:00','Shipped','Customer is interested in buying more Ferrari models',216), (10341,'2004-11-24 00:00:00','2004-12-01 00:00:00','2004-11-29 00:00:00','Shipped',NULL,382), (10342,'2004-11-24 00:00:00','2004-12-01 00:00:00','2004-11-29 00:00:00','Shipped',NULL,114), (10343,'2004-11-24 00:00:00','2004-12-01 00:00:00','2004-11-26 00:00:00','Shipped',NULL,353), (10344,'2004-11-25 00:00:00','2004-12-02 00:00:00','2004-11-29 00:00:00','Shipped',NULL,350), (10345,'2004-11-25 00:00:00','2004-12-01 00:00:00','2004-11-26 00:00:00','Shipped',NULL,103), (10346,'2004-11-29 00:00:00','2004-12-05 00:00:00','2004-11-30 00:00:00','Shipped',NULL,112), (10347,'2004-11-29 00:00:00','2004-12-07 00:00:00','2004-11-30 00:00:00','Shipped','Can we deliver the new Ford Mustang models by end-of-quarter?',114), (10348,'2004-11-01 00:00:00','2004-11-08 00:00:00','2004-11-05 00:00:00','Shipped',NULL,458), (10349,'2004-12-01 00:00:00','2004-12-07 00:00:00','2004-12-03 00:00:00','Shipped',NULL,151), (10350,'2004-12-02 00:00:00','2004-12-08 00:00:00','2004-12-05 00:00:00','Shipped',NULL,141), (10351,'2004-12-03 00:00:00','2004-12-11 00:00:00','2004-12-07 00:00:00','Shipped',NULL,324), (10352,'2004-12-03 00:00:00','2004-12-12 00:00:00','2004-12-09 00:00:00','Shipped',NULL,198), (10353,'2004-12-04 00:00:00','2004-12-11 00:00:00','2004-12-05 00:00:00','Shipped',NULL,447), (10354,'2004-12-04 00:00:00','2004-12-10 00:00:00','2004-12-05 00:00:00','Shipped',NULL,323), (10355,'2004-12-07 00:00:00','2004-12-14 00:00:00','2004-12-13 00:00:00','Shipped',NULL,141), (10356,'2004-12-09 00:00:00','2004-12-15 00:00:00','2004-12-12 00:00:00','Shipped',NULL,250), (10357,'2004-12-10 00:00:00','2004-12-16 00:00:00','2004-12-14 00:00:00','Shipped',NULL,124), (10358,'2004-12-10 00:00:00','2004-12-16 00:00:00','2004-12-16 00:00:00','Shipped','Customer requested that DHL is used for this shipping',141), (10359,'2004-12-15 00:00:00','2004-12-23 00:00:00','2004-12-18 00:00:00','Shipped',NULL,353), (10360,'2004-12-16 00:00:00','2004-12-22 00:00:00','2004-12-18 00:00:00','Shipped',NULL,496), (10361,'2004-12-17 00:00:00','2004-12-24 00:00:00','2004-12-20 00:00:00','Shipped',NULL,282), (10362,'2005-01-05 00:00:00','2005-01-16 00:00:00','2005-01-10 00:00:00','Shipped',NULL,161), (10363,'2005-01-06 00:00:00','2005-01-12 00:00:00','2005-01-10 00:00:00','Shipped',NULL,334), (10364,'2005-01-06 00:00:00','2005-01-17 00:00:00','2005-01-09 00:00:00','Shipped',NULL,350), (10365,'2005-01-07 00:00:00','2005-01-18 00:00:00','2005-01-11 00:00:00','Shipped',NULL,320), (10366,'2005-01-10 00:00:00','2005-01-19 00:00:00','2005-01-12 00:00:00','Shipped',NULL,381), (10367,'2005-01-12 00:00:00','2005-01-21 00:00:00','2005-01-16 00:00:00','Resolved','This order was disputed and resolved on 2/1/2005. Customer claimed that container with shipment was damaged. FedEx\'s investigation proved this wrong.',205), (10368,'2005-01-19 00:00:00','2005-01-27 00:00:00','2005-01-24 00:00:00','Shipped','Can we renegotiate this one?',124), (10369,'2005-01-20 00:00:00','2005-01-28 00:00:00','2005-01-24 00:00:00','Shipped',NULL,379), (10370,'2005-01-20 00:00:00','2005-02-01 00:00:00','2005-01-25 00:00:00','Shipped',NULL,276), (10371,'2005-01-23 00:00:00','2005-02-03 00:00:00','2005-01-25 00:00:00','Shipped',NULL,124), (10372,'2005-01-26 00:00:00','2005-02-05 00:00:00','2005-01-28 00:00:00','Shipped',NULL,398), (10373,'2005-01-31 00:00:00','2005-02-08 00:00:00','2005-02-06 00:00:00','Shipped',NULL,311), (10374,'2005-02-02 00:00:00','2005-02-09 00:00:00','2005-02-03 00:00:00','Shipped',NULL,333), (10375,'2005-02-03 00:00:00','2005-02-10 00:00:00','2005-02-06 00:00:00','Shipped',NULL,119), (10376,'2005-02-08 00:00:00','2005-02-18 00:00:00','2005-02-13 00:00:00','Shipped',NULL,219), (10377,'2005-02-09 00:00:00','2005-02-21 00:00:00','2005-02-12 00:00:00','Shipped','Cautious optimism. We have happy customers here, if we can keep them well stocked. I need all the information I can get on the planned shippments of Porches',186), (10378,'2005-02-10 00:00:00','2005-02-18 00:00:00','2005-02-11 00:00:00','Shipped',NULL,141), (10379,'2005-02-10 00:00:00','2005-02-18 00:00:00','2005-02-11 00:00:00','Shipped',NULL,141), (10380,'2005-02-16 00:00:00','2005-02-24 00:00:00','2005-02-18 00:00:00','Shipped',NULL,141), (10381,'2005-02-17 00:00:00','2005-02-25 00:00:00','2005-02-18 00:00:00','Shipped',NULL,321), (10382,'2005-02-17 00:00:00','2005-02-23 00:00:00','2005-02-18 00:00:00','Shipped','Custom shipping instructions sent to warehouse',124), (10383,'2005-02-22 00:00:00','2005-03-02 00:00:00','2005-02-25 00:00:00','Shipped',NULL,141), (10384,'2005-02-23 00:00:00','2005-03-06 00:00:00','2005-02-27 00:00:00','Shipped',NULL,321), (10385,'2005-02-28 00:00:00','2005-03-09 00:00:00','2005-03-01 00:00:00','Shipped',NULL,124), (10386,'2005-03-01 00:00:00','2005-03-09 00:00:00','2005-03-06 00:00:00','Resolved','Disputed then Resolved on 3/15/2005. Customer doesn\'t like the craftsmaship of the models.',141), (10387,'2005-03-02 00:00:00','2005-03-09 00:00:00','2005-03-06 00:00:00','Shipped','We need to keep in close contact with their Marketing VP. He is the decision maker for all their purchases.',148), (10388,'2005-03-03 00:00:00','2005-03-11 00:00:00','2005-03-09 00:00:00','Shipped',NULL,462), (10389,'2005-03-03 00:00:00','2005-03-09 00:00:00','2005-03-08 00:00:00','Shipped',NULL,448), (10390,'2005-03-04 00:00:00','2005-03-11 00:00:00','2005-03-07 00:00:00','Shipped','They want to reevaluate their terms agreement with Finance.',124), (10391,'2005-03-09 00:00:00','2005-03-20 00:00:00','2005-03-15 00:00:00','Shipped',NULL,276), (10392,'2005-03-10 00:00:00','2005-03-18 00:00:00','2005-03-12 00:00:00','Shipped',NULL,452), (10393,'2005-03-11 00:00:00','2005-03-22 00:00:00','2005-03-14 00:00:00','Shipped','They want to reevaluate their terms agreement with Finance.',323), (10394,'2005-03-15 00:00:00','2005-03-25 00:00:00','2005-03-19 00:00:00','Shipped',NULL,141), (10395,'2005-03-17 00:00:00','2005-03-24 00:00:00','2005-03-23 00:00:00','Shipped','We must be cautions with this customer. Their VP of Sales resigned. Company may be heading down.',250), (10396,'2005-03-23 00:00:00','2005-04-02 00:00:00','2005-03-28 00:00:00','Shipped',NULL,124), (10397,'2005-03-28 00:00:00','2005-04-09 00:00:00','2005-04-01 00:00:00','Shipped',NULL,242), (10398,'2005-03-30 00:00:00','2005-04-09 00:00:00','2005-03-31 00:00:00','Shipped',NULL,353), (10399,'2005-04-01 00:00:00','2005-04-12 00:00:00','2005-04-03 00:00:00','Shipped',NULL,496), (10400,'2005-04-01 00:00:00','2005-04-11 00:00:00','2005-04-04 00:00:00','Shipped','Customer requested that DHL is used for this shipping',450), (10401,'2005-04-03 00:00:00','2005-04-14 00:00:00','2006-08-23 11:49:20','On Hold','Customer credit limit exceeded. Will ship when a payment is received.',328), (10402,'2005-04-07 00:00:00','2005-04-14 00:00:00','2005-04-12 00:00:00','Shipped',NULL,406), (10403,'2005-04-08 00:00:00','2005-04-18 00:00:00','2005-04-11 00:00:00','Shipped',NULL,201), (10404,'2005-04-08 00:00:00','2005-04-14 00:00:00','2005-04-11 00:00:00','Shipped',NULL,323), (10405,'2005-04-14 00:00:00','2005-04-24 00:00:00','2005-04-20 00:00:00','Shipped',NULL,209), (10406,'2005-04-15 00:00:00','2005-04-25 00:00:00','2005-04-21 00:00:00','Disputed','Customer claims container with shipment was damaged during shipping and some items were missing. I am talking to FedEx about this.',145), (10407,'2005-04-22 00:00:00','2005-05-04 00:00:00','2006-08-23 11:49:20','On Hold','Customer credit limit exceeded. Will ship when a payment is received.',450), (10408,'2005-04-22 00:00:00','2005-04-29 00:00:00','2005-04-27 00:00:00','Shipped',NULL,398), (10409,'2005-04-23 00:00:00','2005-05-05 00:00:00','2005-04-24 00:00:00','Shipped',NULL,166), (10410,'2005-04-29 00:00:00','2005-05-10 00:00:00','2005-04-30 00:00:00','Shipped',NULL,357), (10411,'2005-05-01 00:00:00','2005-05-08 00:00:00','2005-05-06 00:00:00','Shipped',NULL,233), (10412,'2005-05-03 00:00:00','2005-05-13 00:00:00','2005-05-05 00:00:00','Shipped',NULL,141), (10413,'2005-05-05 00:00:00','2005-05-14 00:00:00','2005-05-09 00:00:00','Shipped','Customer requested that DHL is used for this shipping',175), (10414,'2005-05-06 00:00:00','2005-05-13 00:00:00','2006-08-23 11:49:20','On Hold','Customer credit limit exceeded. Will ship when a payment is received.',362), (10415,'2005-05-09 00:00:00','2005-05-20 00:00:00','2005-05-12 00:00:00','Disputed','Customer claims the scales of the models don\'t match what was discussed. I keep all the paperwork though to prove otherwise',471), (10416,'2005-05-10 00:00:00','2005-05-16 00:00:00','2005-05-14 00:00:00','Shipped',NULL,386), (10417,'2005-05-13 00:00:00','2005-05-19 00:00:00','2005-05-19 00:00:00','Disputed','Customer doesn\'t like the colors and precision of the models.',141), (10418,'2005-05-16 00:00:00','2005-05-24 00:00:00','2005-05-20 00:00:00','Shipped',NULL,412), (10419,'2005-05-17 00:00:00','2005-05-28 00:00:00','2005-05-19 00:00:00','Shipped',NULL,382), (10420,'2005-05-29 00:00:00','2005-06-07 00:00:00','2006-08-23 11:49:20','In Process',NULL,282), (10421,'2005-05-29 00:00:00','2005-06-06 00:00:00','2006-08-23 11:49:20','In Process','Custom shipping instructions were sent to warehouse',124), (10422,'2005-05-30 00:00:00','2005-06-11 00:00:00','2006-08-23 11:49:20','In Process',NULL,157), (10423,'2005-05-30 00:00:00','2005-06-05 00:00:00','2006-08-23 11:49:20','In Process',NULL,314), (10424,'2005-05-31 00:00:00','2005-06-08 00:00:00','2006-08-23 11:49:20','In Process',NULL,141), (10425,'2005-05-31 00:00:00','2005-06-07 00:00:00','2006-08-23 11:49:20','In Process',NULL,119), (11000,'2003-01-06 12:00:00','2003-01-13 12:00:00','2003-01-10 12:00:00','Shipped',NULL,100), (11120,'2003-01-06 12:00:00','2003-01-13 12:00:00','2003-01-10 12:00:00','Shipped',NULL,99), (11130,'2003-01-06 12:00:00','2003-01-13 12:00:00','2003-01-10 12:00:00','Shipped',NULL,98), (11140,'2003-01-06 12:00:00','2003-01-13 12:00:00','2003-01-10 12:00:00','Shipped',NULL,97); /*!40000 ALTER TABLE `orders` ENABLE KEYS */; -- -- Definition of table `payments` -- DROP TABLE IF EXISTS `payments`; CREATE TABLE `payments` ( `CUSTOMERNUMBER` int(11) NOT NULL default '0', `CHECKNUMBER` varchar(50) collate latin1_general_cs NOT NULL default '', `PAYMENTDATE` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP, `AMOUNT` decimal(17,0) NOT NULL default '0', PRIMARY KEY (`CUSTOMERNUMBER`,`CHECKNUMBER`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_general_cs; -- -- Dumping data for table `payments` -- /*!40000 ALTER TABLE `payments` DISABLE KEYS */; INSERT INTO `payments` (`CUSTOMERNUMBER`,`CHECKNUMBER`,`PAYMENTDATE`,`AMOUNT`) VALUES (103,'HQ336336','2004-10-19 00:00:00','5308'), (103,'JM555205','2003-06-05 00:00:00','16560'), (103,'OM314933','2004-12-18 00:00:00','2312'), (112,'BO864823','2004-12-17 00:00:00','14450'), (112,'HQ55022','2003-06-06 00:00:00','33848'), (112,'ND748579','2004-08-20 00:00:00','34454'), (114,'GG31455','2003-05-20 00:00:00','50398'), (114,'MA765515','2004-12-15 00:00:00','85591'), (114,'NP603840','2003-05-31 00:00:00','9738'), (114,'NR27552','2004-03-10 00:00:00','49638'), (119,'DB933704','2004-11-14 00:00:00','20720'), (119,'LN373447','2004-08-08 00:00:00','56003'), (119,'NG94694','2005-02-22 00:00:00','59617'), (121,'DB889831','2003-02-16 00:00:00','54702'), (121,'FD317790','2003-10-28 00:00:00','1475'), (121,'KI831359','2004-11-04 00:00:00','19770'), (121,'MA302151','2004-11-28 00:00:00','40653'), (124,'AE215433','2005-02-18 00:00:00','51826'), (124,'AQ50522','2005-06-03 00:00:00','32195'), (124,'BG255406','2004-08-28 00:00:00','93929'), (124,'CQ287967','2003-04-11 00:00:00','12399'), (124,'ET64396','2005-04-16 00:00:00','121973'), (124,'HI366474','2004-12-27 00:00:00','50548'), (124,'HR86578','2004-11-02 00:00:00','63075'), (124,'KI131716','2003-08-15 00:00:00','122369'), (124,'LF217299','2004-03-26 00:00:00','48923'), (124,'NT141748','2003-11-25 00:00:00','50361'), (128,'DI925118','2003-01-28 00:00:00','11432'), (128,'FA465482','2003-10-18 00:00:00','27258'), (128,'FH668230','2004-03-24 00:00:00','37266'), (128,'IP383901','2004-11-18 00:00:00','9215'), (129,'DM826140','2004-12-08 00:00:00','30349'), (129,'ID449593','2003-12-11 00:00:00','25432'), (129,'PI42991','2003-04-09 00:00:00','18696'), (131,'CL442705','2003-03-12 00:00:00','25784'), (131,'KG113538','2004-05-22 00:00:00','45358'), (131,'MA724562','2004-12-02 00:00:00','53152'), (131,'NB445135','2004-09-11 00:00:00','39776'), (141,'AU364101','2003-07-19 00:00:00','39616'), (141,'DB583216','2004-11-01 00:00:00','34872'), (141,'DL460618','2005-05-19 00:00:00','22354'), (141,'HJ32686','2004-01-30 00:00:00','65165'), (141,'ID10962','2004-12-31 00:00:00','133589'), (141,'IN446258','2005-03-25 00:00:00','95065'), (141,'JE105477','2005-03-18 00:00:00','90136'), (141,'JN355280','2003-10-26 00:00:00','53502'), (141,'JN722010','2003-02-25 00:00:00','44622'), (141,'KT52578','2003-12-09 00:00:00','72488'), (141,'MC46946','2004-07-09 00:00:00','91328'), (141,'MF629602','2004-08-16 00:00:00','21986'), (141,'NU627706','2004-05-17 00:00:00','28328'), (144,'IR846303','2004-12-12 00:00:00','66006'), (144,'LA685678','2003-04-09 00:00:00','9749'), (145,'CN328545','2004-07-03 00:00:00','4749'), (145,'ED39322','2004-04-26 00:00:00','31330'), (145,'HR182688','2004-12-01 00:00:00','24079'), (145,'JJ246391','2003-02-20 00:00:00','58871'), (146,'FP549817','2004-03-18 00:00:00','46802'), (146,'FU793410','2004-01-16 00:00:00','54537'), (146,'LJ160635','2003-12-10 00:00:00','41535'), (148,'BI507030','2003-04-22 00:00:00','43657'), (148,'DD635282','2004-08-11 00:00:00','3128'), (148,'KM172879','2003-12-26 00:00:00','122029'), (148,'ME497970','2005-03-27 00:00:00','4176'), (151,'BF686658','2003-12-22 00:00:00','64316'), (151,'GB852215','2004-07-26 00:00:00','23252'), (151,'IP568906','2003-06-18 00:00:00','68462'), (151,'KI884577','2004-12-14 00:00:00','41707'), (157,'HI618861','2004-11-19 00:00:00','44041'), (157,'NN711988','2004-09-07 00:00:00','71931'), (161,'BR352384','2004-11-14 00:00:00','2916'), (161,'BR478494','2003-11-18 00:00:00','62305'), (161,'KG644125','2005-02-02 00:00:00','13530'), (161,'NI908214','2003-08-05 00:00:00','42032'), (166,'BQ327613','2004-09-16 00:00:00','42903'), (166,'DC979307','2004-07-07 00:00:00','45789'), (166,'LA318629','2004-02-28 00:00:00','24220'), (167,'ED743615','2004-09-19 00:00:00','16363'), (167,'GN228846','2003-12-03 00:00:00','95277'), (171,'GB878038','2004-03-15 00:00:00','20178'), (171,'IL104425','2003-11-22 00:00:00','48874'), (172,'AD832091','2004-09-09 00:00:00','2174'), (172,'CE51751','2004-12-04 00:00:00','56813'), (172,'EH208589','2003-04-20 00:00:00','38217'), (173,'GP545698','2004-05-13 00:00:00','14381'), (173,'IG462397','2004-03-29 00:00:00','21783'), (175,'IO448913','2003-11-19 00:00:00','26116'), (175,'PI15215','2004-07-10 00:00:00','44131'), (177,'AU750837','2004-04-17 00:00:00','17114'), (177,'CI381435','2004-01-19 00:00:00','50491'), (181,'CM564612','2004-04-25 00:00:00','24804'), (181,'GQ132144','2003-01-30 00:00:00','6864'), (181,'OH367219','2004-11-16 00:00:00','56373'), (186,'AE192287','2005-03-10 00:00:00','26423'), (186,'AK412714','2003-10-27 00:00:00','42084'), (186,'KA602407','2004-10-21 00:00:00','42744'), (187,'AM968797','2004-11-03 00:00:00','57828'), (187,'BQ39062','2004-12-08 00:00:00','48962'), (187,'KL124726','2003-03-27 00:00:00','51018'), (189,'BO711618','2004-10-03 00:00:00','18972'), (189,'NM916675','2004-03-01 00:00:00','38784'), (198,'FI192930','2004-12-06 00:00:00','11529'), (198,'HQ920205','2003-07-06 00:00:00','7277'), (198,'IS946883','2004-09-21 00:00:00','7673'), (201,'DP677013','2003-10-20 00:00:00','26797'), (201,'OO846801','2004-06-15 00:00:00','50408'), (202,'HI358554','2003-12-18 00:00:00','38662'), (202,'IQ627690','2004-11-08 00:00:00','36577'), (204,'GC697638','2004-08-13 00:00:00','52505'), (204,'IS150005','2004-09-24 00:00:00','4693'), (205,'GL756480','2003-12-04 00:00:00','4512'), (205,'LL562733','2003-09-05 00:00:00','55776'), (205,'NM739638','2005-02-06 00:00:00','44273'), (209,'ED520529','2004-06-21 00:00:00','5417'), (209,'PH785937','2004-05-04 00:00:00','39341'), (211,'BJ535230','2003-12-09 00:00:00','48784'), (216,'BG407567','2003-05-09 00:00:00','4219'), (216,'ML780814','2004-12-06 00:00:00','21250'), (216,'MM342086','2003-12-14 00:00:00','44009'), (219,'BN17870','2005-03-02 00:00:00','3987'), (219,'BR941480','2003-10-18 00:00:00','5142'), (227,'MQ413968','2003-10-31 00:00:00','40322'), (227,'NU21326','2004-11-02 00:00:00','60274'), (233,'II180006','2004-07-01 00:00:00','24565'), (233,'JG981190','2003-11-18 00:00:00','15947'), (239,'NQ865547','2004-03-15 00:00:00','87489'), (240,'IF245157','2004-11-16 00:00:00','51334'), (240,'JO719695','2004-03-28 00:00:00','26907'), (242,'AF40894','2003-11-22 00:00:00','38098'), (242,'HR224331','2005-06-03 00:00:00','15139'), (242,'KI744716','2003-07-21 00:00:00','17251'), (249,'IJ399820','2004-09-19 00:00:00','38039'), (249,'NE404084','2004-09-04 00:00:00','56078'), (250,'EQ12267','2005-05-17 00:00:00','20322'), (250,'HD284647','2004-12-30 00:00:00','32624'), (250,'HN114306','2003-07-18 00:00:00','25625'), (256,'EP227123','2004-02-10 00:00:00','5759'), (256,'HE84936','2004-10-22 00:00:00','59075'), (259,'EU280955','2004-11-06 00:00:00','68943'), (259,'GB361972','2003-12-07 00:00:00','31363'), (260,'IO164641','2004-08-30 00:00:00','43332'), (260,'NH776924','2004-04-24 00:00:00','31303'), (276,'EM979878','2005-02-09 00:00:00','29852'), (276,'KM841847','2003-11-13 00:00:00','41792'), (276,'LE432182','2003-09-28 00:00:00','47192'), (276,'OJ819725','2005-04-30 00:00:00','35160'), (278,'BJ483870','2004-12-05 00:00:00','41697'), (278,'GP636783','2003-03-02 00:00:00','56181'), (278,'NI983021','2003-11-24 00:00:00','40078'), (282,'IA793562','2003-08-03 00:00:00','28397'), (282,'JT819493','2004-08-02 00:00:00','41297'), (282,'OD327378','2005-01-03 00:00:00','37905'), (286,'DR578578','2004-10-28 00:00:00','54252'), (286,'KH910279','2004-09-05 00:00:00','48829'), (298,'AJ574927','2004-03-13 00:00:00','50433'), (298,'LF501133','2004-09-18 00:00:00','67281'), (299,'AD304085','2003-10-24 00:00:00','45079'), (299,'NR157385','2004-09-05 00:00:00','34145'), (311,'DG336041','2005-02-15 00:00:00','49055'), (311,'FA728475','2003-10-06 00:00:00','37502'), (311,'NQ966143','2004-04-25 00:00:00','17813'), (314,'LQ244073','2004-08-09 00:00:00','47760'), (314,'MD809704','2004-03-03 00:00:00','18800'), (319,'HL685576','2004-11-06 00:00:00','46873'), (319,'OM548174','2003-12-07 00:00:00','38683'), (320,'GJ597719','2005-01-18 00:00:00','11021'), (320,'HO576374','2003-08-20 00:00:00','45738'), (320,'MU817160','2003-11-24 00:00:00','52191'), (321,'DJ15149','2003-11-03 00:00:00','95679'), (321,'LA556321','2005-03-15 00:00:00','54204'), (323,'AL493079','2005-05-23 00:00:00','39268'), (323,'ES347491','2004-06-24 00:00:00','40035'), (323,'HG738664','2003-07-05 00:00:00','2477'), (323,'PQ803830','2004-12-24 00:00:00','43931'), (324,'DQ409197','2004-12-13 00:00:00','13740'), (324,'FP443161','2003-07-07 00:00:00','32376'), (324,'HB150714','2003-11-23 00:00:00','42688'), (328,'EN930356','2004-04-16 00:00:00','8722'), (328,'NR631421','2004-05-30 00:00:00','27987'), (333,'HL209210','2003-11-15 00:00:00','27099'), (333,'JK479662','2003-10-17 00:00:00','10640'), (333,'NF959653','2005-03-01 00:00:00','21730'), (334,'CS435306','2005-01-27 00:00:00','51373'), (334,'HH517378','2003-08-16 00:00:00','31569'), (334,'LF737277','2004-05-22 00:00:00','31018'), (339,'AP286625','2004-10-24 00:00:00','27445'), (339,'DA98827','2003-11-28 00:00:00','40062'), (344,'AF246722','2003-11-24 00:00:00','34311'), (344,'NJ906924','2004-04-02 00:00:00','15331'), (347,'DG700707','2004-01-18 00:00:00','23889'), (347,'LG808674','2003-10-24 00:00:00','24159'), (350,'BQ602907','2004-12-11 00:00:00','20137'), (350,'CI471510','2003-05-25 00:00:00','52482'), (350,'OB648482','2005-01-29 00:00:00','2317'), (353,'CO351193','2005-01-10 00:00:00','48896'), (353,'ED878227','2003-07-21 00:00:00','15146'), (353,'GT878649','2003-05-21 00:00:00','18972'), (353,'HJ618252','2005-06-09 00:00:00','52029'), (357,'AG240323','2003-12-16 00:00:00','23295'), (357,'NB291497','2004-07-01 00:00:00','41419'), (362,'FP170292','2004-07-11 00:00:00','19548'), (362,'OG208861','2004-09-21 00:00:00','15345'), (363,'HL575273','2004-11-17 00:00:00','55571'), (363,'IS232033','2003-01-16 00:00:00','12133'), (363,'PN238558','2003-12-05 00:00:00','63981'), (379,'CA762595','2005-02-12 00:00:00','31475'), (379,'FR499138','2003-09-16 00:00:00','34992'), (379,'GB890854','2004-08-02 00:00:00','15111'), (381,'BC726082','2004-12-03 00:00:00','13463'), (381,'CC475233','2003-04-19 00:00:00','1711'), (381,'GB117430','2005-02-03 00:00:00','16628'), (381,'MS154481','2003-08-22 00:00:00','1637'), (382,'CC871084','2003-05-12 00:00:00','38629'), (382,'CT821147','2004-08-01 00:00:00','6693'), (382,'PH29054','2004-11-27 00:00:00','37353'), (385,'BN347084','2003-12-02 00:00:00','22842'), (385,'CP804873','2004-11-19 00:00:00','15929'), (385,'EK785462','2003-03-09 00:00:00','55245'), (386,'DO106109','2003-11-18 00:00:00','44670'), (386,'HG438769','2004-07-18 00:00:00','56422'), (398,'AJ478695','2005-02-14 00:00:00','38191'), (398,'DO787644','2004-06-21 00:00:00','25929'), (398,'KB54275','2004-11-29 00:00:00','44802'), (406,'HJ217687','2004-01-28 00:00:00','51173'), (406,'NA197101','2004-06-17 00:00:00','27931'), (412,'GH197075','2004-07-25 00:00:00','35912'), (412,'PJ434867','2004-04-14 00:00:00','36409'), (415,'ER54537','2004-09-28 00:00:00','34994'), (424,'KF480160','2004-12-07 00:00:00','27733'), (424,'LM271923','2003-04-16 00:00:00','24777'), (424,'OA595449','2003-10-31 00:00:00','25285'), (447,'AO757239','2003-09-15 00:00:00','7600'), (447,'ER615123','2003-06-25 00:00:00','20351'), (447,'OU516561','2004-12-17 00:00:00','29343'), (448,'EQ620556','2003-11-06 00:00:00','48711'), (448,'FS299615','2005-04-18 00:00:00','31607'), (448,'KR822727','2004-09-30 00:00:00','53942'), (450,'EF485824','2004-06-21 00:00:00','64600'), (452,'ED473873','2003-11-15 00:00:00','28551'), (452,'FN640986','2003-11-20 00:00:00','14938'), (452,'HG635467','2005-05-03 00:00:00','8775'), (455,'HA777606','2003-12-05 00:00:00','42499'), (455,'IR662429','2004-05-12 00:00:00','36973'), (456,'GJ715659','2004-11-13 00:00:00','31446'), (456,'MO743231','2004-04-30 00:00:00','1699'), (458,'DD995006','2004-11-15 00:00:00','34547'), (458,'NA377824','2004-02-06 00:00:00','24995'), (458,'OO606861','2003-06-13 00:00:00','61073'), (462,'ED203908','2005-04-15 00:00:00','37558'), (462,'GC60330','2003-11-08 00:00:00','11862'), (462,'PE176846','2004-11-27 00:00:00','49504'), (471,'AB661578','2004-07-28 00:00:00','12335'), (471,'CO645196','2003-12-10 00:00:00','37879'), (473,'LL427009','2004-02-17 00:00:00','7279'), (473,'PC688499','2003-10-27 00:00:00','21673'), (475,'JP113227','2003-12-09 00:00:00','8235'), (475,'PB951268','2004-02-13 00:00:00','37850'), (484,'GK294076','2004-10-26 00:00:00','3221'), (484,'JH546765','2003-11-29 00:00:00','51503'), (486,'BL66528','2004-04-14 00:00:00','7287'), (486,'HS86661','2004-11-23 00:00:00','48996'), (486,'JB117768','2003-03-20 00:00:00','27399'), (487,'AH612904','2003-09-28 00:00:00','34100'), (487,'PT550181','2004-02-29 00:00:00','16118'), (489,'OC773849','2003-12-04 00:00:00','27542'), (489,'PO860906','2004-01-31 00:00:00','8477'), (495,'BH167026','2003-12-26 00:00:00','63731'), (495,'FN155234','2004-05-14 00:00:00','7129'), (496,'EU531600','2005-06-25 00:00:00','34332'), (496,'MB342426','2003-07-16 00:00:00','37754'), (496,'MN89921','2004-12-31 00:00:00','58593'), (496,'PL783960','2003-11-29 00:00:00','26421'); /*!40000 ALTER TABLE `payments` ENABLE KEYS */; -- -- Definition of table `products` -- DROP TABLE IF EXISTS `products`; CREATE TABLE `products` ( `PRODUCTCODE` varchar(50) collate latin1_general_cs NOT NULL default '', `PRODUCTNAME` varchar(70) collate latin1_general_cs NOT NULL default '', `PRODUCTLINE` varchar(50) collate latin1_general_cs NOT NULL default '', `PRODUCTSCALE` varchar(10) collate latin1_general_cs NOT NULL default '', `PRODUCTVENDOR` varchar(50) collate latin1_general_cs NOT NULL default '', `PRODUCTDESCRIPTION` mediumtext collate latin1_general_cs NOT NULL, `QUANTITYINSTOCK` smallint(6) NOT NULL default '0', `BUYPRICE` decimal(17,0) NOT NULL default '0', `MSRP` decimal(17,0) NOT NULL default '0', PRIMARY KEY (`PRODUCTCODE`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_general_cs; -- -- Dumping data for table `products` -- /*!40000 ALTER TABLE `products` DISABLE KEYS */; INSERT INTO `products` (`PRODUCTCODE`,`PRODUCTNAME`,`PRODUCTLINE`,`PRODUCTSCALE`,`PRODUCTVENDOR`,`PRODUCTDESCRIPTION`,`QUANTITYINSTOCK`,`BUYPRICE`,`MSRP`) VALUES ('S10_1678','1969 Harley Davidson Ultimate Chopper','Motorcycles','1:10','Min Lin Diecast','This replica features working kickstand, front suspension, gear-shift lever, footbrake lever, drive chain, wheels and steering. All parts are particularly delicate due to their precise scale and require special care and attention.',7933,'49','96'), ('S10_1949','1952 Alpine Renault 1300','Classic Cars','1:10','Classic Metal Creations','Turnable front wheels; steering function; detailed interior; detailed engine; opening hood; opening trunk; opening doors; and detailed chassis.',7305,'99','214'), ('S10_2016','1996 Moto Guzzi 1100i','Motorcycles','1:10','Highway 66 Mini Classics','Official Moto Guzzi logos and insignias, saddle bags located on side of motorcycle, detailed engine, working steering, working suspension, two leather seats, luggage rack, dual exhaust pipes, small saddle bag located on handle bars, two-tone paint with chrome accents, superior die-cast detail , rotating wheels , working kick stand, diecast metal with plastic parts and baked enamel finish.',6625,'69','119'), ('S10_4698','2003 Harley-Davidson Eagle Drag Bike','Motorcycles','1:10','Red Start Diecast','Model features, official Harley Davidson logos and insignias, detachable rear wheelie bar, heavy diecast metal with resin parts, authentic multi-color tampo-printed graphics, separate engine drive belts, free-turning front fork, rotating tires and rear racing slick, certificate of authenticity, detailed engine, display standu000du000a, precision diecast replica, baked enamel finish, 1:10 scale model, removable fender, seat and tank cover piece for displaying the superior detail of the v-twin engine',5582,'91','194'), ('S10_4757','1972 Alfa Romeo GTA','Classic Cars','1:10','Motor City Art Classics','Features include: Turnable front wheels; steering function; detailed interior; detailed engine; opening hood; opening trunk; opening doors; and detailed chassis.',3252,'86','136'), ('S10_4962','1962 LanciaA Delta 16V','Classic Cars','1:10','Second Gear Diecast','Features include: Turnable front wheels; steering function; detailed interior; detailed engine; opening hood; opening trunk; opening doors; and detailed chassis.',6791,'103','148'), ('S12_1099','1968 Ford Mustang','Classic Cars','1:12','Autoart Studio Design','Hood, doors and trunk all open to reveal highly detailed interior features. Steering wheel actually turns the front wheels. Color dark green.',68,'95','195'), ('S12_1108','2001 Ferrari Enzo','Classic Cars','1:12','Second Gear Diecast','Turnable front wheels; steering function; detailed interior; detailed engine; opening hood; opening trunk; opening doors; and detailed chassis.',3619,'96','208'), ('S12_1666','1958 Setra Bus','Trucks and Buses','1:12','Welly Diecast Productions','Model features 30 windows, skylights & glare resistant glass, working steering system, original logos',1579,'78','137'), ('S12_2823','2002 Suzuki XREO','Motorcycles','1:12','Unimax Art Galleries','Official logos and insignias, saddle bags located on side of motorcycle, detailed engine, working steering, working suspension, two leather seats, luggage rack, dual exhaust pipes, small saddle bag located on handle bars, two-tone paint with chrome accents, superior die-cast detail , rotating wheels , working kick stand, diecast metal with plastic parts and baked enamel finish.',9997,'66','151'), ('S12_3148','1969 Corvair Monza','Classic Cars','1:18','Welly Diecast Productions','1:18 scale die-cast about 10 long doors open, hood opens, trunk opens and wheels roll',6906,'89','151'), ('S12_3380','1968 Dodge Charger','Classic Cars','1:12','Welly Diecast Productions','1:12 scale model of a 1968 Dodge Charger. Hood, doors and trunk all open to reveal highly detailed interior features. Steering wheel actually turns the front wheels. Color black',9123,'75','117'), ('S12_3891','1969 Ford Falcon','Classic Cars','1:12','Second Gear Diecast','Turnable front wheels; steering function; detailed interior; detailed engine; opening hood; opening trunk; opening doors; and detailed chassis.',1049,'83','173'), ('S12_3990','1970 Plymouth Hemi Cuda','Classic Cars','1:12','Studio M Art Models','Very detailed 1970 Plymouth Cuda model in 1:12 scale. The Cuda is generally accepted as one of the fastest original muscle cars from the 1970s. This model is a reproduction of one of the orginal 652 cars built in 1970. Red color.',5663,'32','80'), ('S12_4473','1957 Chevy Pickup','Trucks and Buses','1:12','Exoto Designs','1:12 scale die-cast about 20 long Hood opens, Rubber wheels',6125,'56','119'), ('S12_4675','1969 Dodge Charger','Classic Cars','1:12','Welly Diecast Productions','Detailed model of the 1969 Dodge Charger. This model includes finely detailed interior and exterior features. Painted in red and white.',7323,'59','115'), ('S18_1097','1940 Ford Pickup Truck','Trucks and Buses','1:18','Studio M Art Models','This model features soft rubber tires, working steering, rubber mud guards, authentic Ford logos, detailed undercarriage, opening doors and hood, removable split rear gate, full size spare mounted in bed, detailed interior with opening glove box',2613,'58','117'), ('S18_1129','1993 Mazda RX-7','Classic Cars','1:18','Highway 66 Mini Classics','This model features, opening hood, opening doors, detailed engine, rear spoiler, opening trunk, working steering, tinted windows, baked enamel finish. Color red.',3975,'84','142'), ('S18_1342','1937 Lincoln Berline','Vintage Cars','1:18','Motor City Art Classics','Features opening engine cover, doors, trunk, and fuel filler cap. Color black',8693,'61','103'), ('S18_1367','1936 Mercedes-Benz 500K Special Roadster','Vintage Cars','1:18','Studio M Art Models','This 1:18 scale replica is constructed of heavy die-cast metal and has all the features of the original: working doors and rumble seat, independent spring suspension, detailed interior, working steering system, and a bifold hood that reveals an engine so accurate that it even includes the wiring. All this is topped off with a baked enamel finish. Color white.',8635,'24','54'), ('S18_1589','1965 Aston Martin DB5','Classic Cars','1:18','Classic Metal Creations','Die-cast model of the silver 1965 Aston Martin DB5 in silver. This model includes full wire wheels and doors that open with fully detailed passenger compartment. In 1:18 scale, this model measures approximately 10 inches/20 cm long.',9042,'66','124'), ('S18_1662','1980s Black Hawk Helicopter','Planes','1:18','Red Start Diecast','1:18 scale replica of actual Army\'s UH-60L BLACK HAWK Helicopter. 100% hand-assembled. Features rotating rotor blades, propeller blades and rubber wheels.',5330,'77','158'), ('S18_1749','1917 Grand Touring Sedan','Vintage Cars','1:18','Welly Diecast Productions','This 1:18 scale replica of the 1917 Grand Touring car has all the features you would expect from museum quality reproductions: all four doors and bi-fold hood opening, detailed engine and instrument panel, chrome-look trim, and tufted upholstery, all topped off with a factory baked-enamel finish.',2724,'87','170'), ('S18_1889','1948 Porsche 356-A Roadster','Classic Cars','1:18','Gearbox Collectibles','This precision die-cast replica features opening doors, superb detail and craftsmanship, working steering system, opening forward compartment, opening rear trunk with removable spare, 4 wheel independent spring suspension as well as factory baked enamel finish.',8826,'54','77'), ('S18_1984','1995 Honda Civic','Classic Cars','1:18','Min Lin Diecast','This model features, opening hood, opening doors, detailed engine, rear spoiler, opening trunk, working steering, tinted windows, baked enamel finish. Color yellow.',9772,'94','142'), ('S18_2238','1998 Chrysler Plymouth Prowler','Classic Cars','1:18','Gearbox Collectibles','Turnable front wheels; steering function; detailed interior; detailed engine; opening hood; opening trunk; opening doors; and detailed chassis.',4724,'102','164'), ('S18_2248','1911 Ford Town Car','Vintage Cars','1:18','Motor City Art Classics','Features opening hood, opening doors, opening trunk, wide white wall tires, front door arm rests, working steering system',540,'33','61'), ('S18_2319','1964 Mercedec Tour Bus','Trucks and Buses','1:18','Unimax Art Galleries','Exact replica. 100+ parts. working steering system, original logos',8258,'75','123'), ('S18_2325','1932 Model A Ford J-Coupe','Vintage Cars','1:18','Autoart Studio Design','This model features grille-mounted chrome horn, lift-up louvered hood, fold-down rumble seat, working steering system, chrome-covered spare, opening doors, detailed and wired engine',9354,'58','127'), ('S18_2432','1926 Ford Fire Engine','Trucks and Buses','1:18','Carousel DieCast Legends','Gleaming red handsome appearance. Everything is here the fire hoses, ladder, axes, bells, lanterns, ready to fight any inferno.',2018,'25','61'), ('S18_2581','P-51-D Mustang','Planes','1:72','Gearbox Collectibles','Has retractable wheels and comes with a stand',992,'49','84'), ('S18_2625','1936 Harley Davidson El Knucklehead','Motorcycles','1:18','Welly Diecast Productions','Intricately detailed with chrome accents and trim, official die-struck logos and baked enamel finish.',4357,'24','61'), ('S18_2795','1928 Mercedes-Benz SSK','Vintage Cars','1:18','Gearbox Collectibles','This 1:18 replica features grille-mounted chrome horn, lift-up louvered hood, fold-down rumble seat, working steering system, chrome-covered spare, opening doors, detailed and wired engine. Color black.',548,'73','169'), ('S18_2870','1999 Indy 500 Monte Carlo SS','Classic Cars','1:18','Red Start Diecast','Features include opening and closing doors. Color: Red',8164,'57','132'), ('S18_2949','1913 Ford Model T Speedster','Vintage Cars','1:18','Carousel DieCast Legends','This 250 part reproduction includes moving handbrakes, clutch, throttle and foot pedals, squeezable horn, detailed wired engine, removable water, gas, and oil cans, pivoting monocle windshield, all topped with a baked enamel red finish. Each replica comes with an Owners Title and Certificate of Authenticity. Color red.',4189,'61','101'), ('S18_2957','1934 Ford V8 Coupe','Vintage Cars','1:18','Min Lin Diecast','Chrome Trim, Chrome Grille, Opening Hood, Opening Doors, Opening Trunk, Detailed Engine, Working Steering System',5649,'34','62'), ('S18_3029','1999 Yamaha Speed Boat','Ships','1:18','Min Lin Diecast','Exact replica. Wood and Metal. Many extras including rigging, long boats, pilot house, anchors, etc. Comes with three masts, all square-rigged.',4259,'52','86'), ('S18_3136','18th Century Vintage Horse Carriage','Vintage Cars','1:18','Red Start Diecast','Hand crafted diecast-like metal horse carriage is re-created in about 1:18 scale of antique horse carriage. This antique style metal Stagecoach is all hand-assembled with many different parts.u000du000au000du000aThis collectible metal horse carriage is painted in classic Red, and features turning steering wheel and is entirely hand-finished.',5992,'61','105'), ('S18_3140','1903 Ford Model A','Vintage Cars','1:18','Unimax Art Galleries','Features opening trunk, working steering system',3913,'68','137'), ('S18_3232','1992 Ferrari 360 Spider red','Classic Cars','1:18','Unimax Art Galleries','his replica features opening doors, superb detail and craftsmanship, working steering system, opening forward compartment, opening rear trunk with removable spare, 4 wheel independent spring suspension as well as factory baked enamel finish.',8347,'78','169'), ('S18_3233','1985 Toyota Supra','Classic Cars','1:18','Highway 66 Mini Classics','This model features soft rubber tires, working steering, rubber mud guards, authentic Ford logos, detailed undercarriage, opening doors and hood, removable split rear gate, full size spare mounted in bed, detailed interior with opening glove box',7733,'57','108'), ('S18_3259','Collectable Wooden Train','Trains','1:18','Carousel DieCast Legends','Hand crafted wooden toy train set is in about 1:18 scale, 25 inches in total length including 2 additional carts, of actual vintage train. This antique style wooden toy train model set is all hand-assembled with 100% wood.',6450,'68','101'), ('S18_3278','1969 Dodge Super Bee','Classic Cars','1:18','Min Lin Diecast','This replica features opening doors, superb detail and craftsmanship, working steering system, opening forward compartment, opening rear trunk with removable spare, 4 wheel independent spring suspension as well as factory baked enamel finish.',1917,'49','80'), ('S18_3320','1917 Maxwell Touring Car','Vintage Cars','1:18','Exoto Designs','Features Gold Trim, Full Size Spare Tire, Chrome Trim, Chrome Grille, Opening Hood, Opening Doors, Opening Trunk, Detailed Engine, Working Steering System',7913,'58','99'), ('S18_3482','1976 Ford Gran Torino','Classic Cars','1:18','Gearbox Collectibles','Highly detailed 1976 Ford Gran Torino Starsky and Hutch diecast model. Very well constructed and painted in red and white patterns.',9127,'73','147'), ('S18_3685','1948 Porsche Type 356 Roadster','Classic Cars','1:18','Gearbox Collectibles','This model features working front and rear suspension on accurately replicated and actuating shock absorbers as well as opening engine cover, rear stabilizer flap, and 4 opening doors.',8990,'62','141'), ('S18_3782','1957 Vespa GS150','Motorcycles','1:18','Studio M Art Models','Features rotating wheels , working kick stand. Comes with stand.',7689,'33','62'), ('S18_3856','1941 Chevrolet Special Deluxe Cabriolet','Vintage Cars','1:18','Exoto Designs','Features opening hood, opening doors, opening trunk, wide white wall tires, front door arm rests, working steering system, leather upholstery. Color black.',2378,'65','106'), ('S18_4027','1970 Triumph Spitfire','Classic Cars','1:18','Min Lin Diecast','Features include opening and closing doors. Color: White.',5545,'92','144'), ('S18_4409','1932 Alfa Romeo 8C2300 Spider Sport','Vintage Cars','1:18','Exoto Designs','This 1:18 scale precision die cast replica features the 6 front headlights of the original, plus a detailed version of the 142 horsepower straight 8 engine, dual spares and their famous comprehensive dashboard. Color black.',6553,'43','92'), ('S18_4522','1904 Buick Runabout','Vintage Cars','1:18','Exoto Designs','Features opening trunk, working steering system',8290,'53','88'), ('S18_4600','1940s Ford truck','Trucks and Buses','1:18','Motor City Art Classics','This 1940s Ford Pick-Up truck is re-created in 1:18 scale of original 1940s Ford truck. This antique style metal 1940s Ford Flatbed truck is all hand-assembled. This collectible 1940\'s Pick-Up truck is painted in classic dark green color, and features rotating wheels.',3128,'85','121'), ('S18_4668','1939 Cadillac Limousine','Vintage Cars','1:18','Studio M Art Models','Features completely detailed interior including Velvet flocked drapes,deluxe wood grain floor, and a wood grain casket with seperate chrome handles',6645,'23','50'), ('S18_4721','1957 Corvette Convertible','Classic Cars','1:18','Classic Metal Creations','1957 die cast Corvette Convertible in Roman Red with white sides and whitewall tires. 1:18 scale quality die-cast with detailed engine and underbvody. Now you can own The Classic Corvette.',1249,'70','149'), ('S18_4933','1957 Ford Thunderbird','Classic Cars','1:18','Studio M Art Models','This 1:18 scale precision die-cast replica, with its optional porthole hardtop and factory baked-enamel Thunderbird Bronze finish, is a 100% accurate rendition of this American classic.',3209,'34','71'), ('S24_1046','1970 Chevy Chevelle SS 454','Classic Cars','1:24','Unimax Art Galleries','This model features rotating wheels, working streering system and opening doors. All parts are particularly delicate due to their precise scale and require special care and attention. It should not be picked up by the doors, roof, hood or trunk.',1005,'49','73'), ('S24_1444','1970 Dodge Coronet','Classic Cars','1:24','Highway 66 Mini Classics','1:24 scale die-cast about 18 long doors open, hood opens and rubber wheels',4074,'32','58'), ('S24_1578','1997 BMW R 1100 S','Motorcycles','1:24','Autoart Studio Design','Detailed scale replica with working suspension and constructed from over 70 parts',7003,'61','113'), ('S24_1628','1966 Shelby Cobra 427 S/C','Classic Cars','1:24','Carousel DieCast Legends','This diecast model of the 1966 Shelby Cobra 427 S/C includes many authentic details and operating parts. The 1:24 scale model of this iconic lighweight sports car from the 1960s comes in silver and it\'s own display case.',8197,'29','50'), ('S24_1785','1928 British Royal Navy Airplane','Planes','1:24','Classic Metal Creations','Official logos and insignias',3627,'67','109'), ('S24_1937','1939 Chevrolet Deluxe Coupe','Vintage Cars','1:24','Motor City Art Classics','This 1:24 scale die-cast replica of the 1939 Chevrolet Deluxe Coupe has the same classy look as the original. Features opening trunk, hood and doors and a showroom quality baked enamel finish.',7332,'23','33'), ('S24_2000','1960 BSA Gold Star DBD34 1960','Motorcycles','1:24','Highway 66 Mini Classics','Detailed scale replica with working suspension and constructed from over 70 parts',15,'37','76'), ('S24_2011','18th century schooner','Ships','1:24','Carousel DieCast Legends','All wood with canvas sails. Many extras including rigging, long boats, pilot house, anchors, etc. Comes with 4 masts, all square-rigged.',1898,'82','123'), ('S24_2022','1938 Cadillac V-16 Presidential Limousine','Vintage Cars','1:24','Classic Metal Creations','This 1:24 scale precision die cast replica of the 1938 Cadillac V-16 Presidential Limousine has all the details of the original, from the flags on the front to an opening back seat compartment complete with telephone and rifle. Features factory baked-enamel black finish, hood goddess ornament, working jump seats.',2847,'21','45'), ('S24_2300','1962 Volkswagen Microbus','Trucks and Buses','1:24','Autoart Studio Design','This 1:18 scale die cast replica of the 1962 Microbus is loaded with features: A working steering system, opening front doors and tailgate, and famous two-tone factory baked enamel finish, are all topped of by the sliding, real fabric, sunroof.',2327,'61','128'), ('S24_2360','1982 Ducati 900 Monster','Motorcycles','1:24','Highway 66 Mini Classics','Features two-tone paint with chrome accents, superior die-cast detail , rotating wheels , working kick stand',6840,'47','69'), ('S24_2766','1949 Jaguar XK 120','Classic Cars','1:24','Classic Metal Creations','Precision-engineered from original Jaguar specification in perfect scale ratio. Features opening doors, superb detail and craftsmanship, working steering system, opening forward compartment, opening rear trunk with removable spare, 4 wheel independent spring suspension as well as factory baked enamel finish.',2350,'47','91'), ('S24_2840','1958 Chevy Corvette Limited Edition','Classic Cars','1:24','Carousel DieCast Legends','The operating parts of this 1958 Chevy Corvette Limited Edition are particularly delicate due to their precise scale and require special care and attention. Features rotating wheels, working streering, opening doors and trunk. Color dark green.',2542,'16','35'), ('S24_2841','1900s Vintage Bi-Plane','Planes','1:24','Autoart Studio Design','Hand crafted diecast-like metal bi-plane is re-created in about 1:24 scale of antique pioneer airplane. All hand-assembled with many different parts. Hand-painted in classic yellow and features correct markings of original airplane.',5942,'34','69'), ('S24_2887','1952 Citroen-15CV','Classic Cars','1:24','Exoto Designs','Precision crafted hand-assembled 1:18 scale reproduction of the 1952 15CV, with its independent spring suspension, working steering system, opening doors and hood, detailed engine and instrument panel, all topped of with a factory fresh baked enamel finish.',1452,'73','117'), ('S24_2972','1982 Lamborghini Diablo','Classic Cars','1:24','Second Gear Diecast','This replica features opening doors, superb detail and craftsmanship, working steering system, opening forward compartment, opening rear trunk with removable spare, 4 wheel independent spring suspension as well as factory baked enamel finish.',7723,'16','38'), ('S24_3151','1912 Ford Model T Delivery Wagon','Vintage Cars','1:24','Min Lin Diecast','This model features chrome trim and grille, opening hood, opening doors, opening trunk, detailed engine, working steering system. Color white.',9173,'47','89'), ('S24_3191','1969 Chevrolet Camaro Z28','Classic Cars','1:24','Exoto Designs','1969 Z/28 Chevy Camaro 1:24 scale replica. The operating parts of this limited edition 1:24 scale diecast model car 1969 Chevy Camaro Z28- hood, trunk, wheels, streering, suspension and doors- are particularly delicate due to their precise scale and require special care and attention.',4695,'51','86'), ('S24_3371','1971 Alpine Renault 1600s','Classic Cars','1:24','Welly Diecast Productions','This 1971 Alpine Renault 1600s replica Features opening doors, superb detail and craftsmanship, working steering system, opening forward compartment, opening rear trunk with removable spare, 4 wheel independent spring suspension as well as factory baked enamel finish.',7995,'39','61'), ('S24_3420','1937 Horch 930V Limousine','Vintage Cars','1:24','Autoart Studio Design','Features opening hood, opening doors, opening trunk, wide white wall tires, front door arm rests, working steering system',2902,'26','66'), ('S24_3432','2002 Chevy Corvette','Classic Cars','1:24','Gearbox Collectibles','The operating parts of this limited edition Diecast 2002 Chevy Corvette 50th Anniversary Pace car Limited Edition are particularly delicate due to their precise scale and require special care and attention. Features rotating wheels, poseable streering, opening doors and trunk.',9446,'62','107'), ('S24_3816','1940 Ford Delivery Sedan','Vintage Cars','1:24','Carousel DieCast Legends','Chrome Trim, Chrome Grille, Opening Hood, Opening Doors, Opening Trunk, Detailed Engine, Working Steering System. Color black.',6621,'49','84'), ('S24_3856','1956 Porsche 356A Coupe','Classic Cars','1:18','Classic Metal Creations','Features include: Turnable front wheels; steering function; detailed interior; detailed engine; opening hood; opening trunk; opening doors; and detailed chassis.',6600,'98','140'), ('S24_3949','Corsair F4U ( Bird Cage)','Planes','1:24','Second Gear Diecast','Has retractable wheels and comes with a stand. Official logos and insignias.',6812,'29','68'), ('S24_3969','1936 Mercedes Benz 500k Roadster','Vintage Cars','1:24','Red Start Diecast','This model features grille-mounted chrome horn, lift-up louvered hood, fold-down rumble seat, working steering system and rubber wheels. Color black.',2081,'22','41'), ('S24_4048','1992 Porsche Cayenne Turbo Silver','Classic Cars','1:24','Exoto Designs','This replica features opening doors, superb detail and craftsmanship, working steering system, opening forward compartment, opening rear trunk with removable spare, 4 wheel independent spring suspension as well as factory baked enamel finish.',6582,'70','118'), ('S24_4258','1936 Chrysler Airflow','Vintage Cars','1:24','Second Gear Diecast','Features opening trunk, working steering system. Color dark green.',4710,'57','97'), ('S24_4278','1900s Vintage Tri-Plane','Planes','1:24','Unimax Art Galleries','Hand crafted diecast-like metal Triplane is Re-created in about 1:24 scale of antique pioneer airplane. This antique style metal triplane is all hand-assembled with many different parts.',2756,'36','72'), ('S24_4620','1961 Chevrolet Impala','Classic Cars','1:18','Classic Metal Creations','This 1:18 scale precision die-cast reproduction of the 1961 Chevrolet Impala has all the features-doors, hood and trunk that open; detailed 409 cubic-inch engine; chrome dashboard and stick shift, two-tone interior; working steering system; all topped of with a factory baked-enamel finish.',7869,'32','81'), ('S32_1268','1980u0092s GM Manhattan Express','Trucks and Buses','1:32','Motor City Art Classics','This 1980u0092s era new look Manhattan express is still active, running from the Bronx to mid-town Manhattan. Has 35 opeining windows and working lights. Needs a battery.',5099,'54','96'), ('S32_1374','1997 BMW F650 ST','Motorcycles','1:32','Exoto Designs','Features official die-struck logos and baked enamel finish. Comes with stand.',178,'67','100'), ('S32_2206','1982 Ducati 996 R','Motorcycles','1:32','Gearbox Collectibles','Features rotating wheels , working kick stand. Comes with stand.',9241,'24','40'), ('S32_2509','1954 Greyhound Scenicruiser','Trucks and Buses','1:32','Classic Metal Creations','Model features bi-level seating, 50 windows, skylights & glare resistant glass, working steering system, original logos',2874,'26','54'), ('S32_3207','1950\'s Chicago Surface Lines Streetcar','Trains','1:32','Gearbox Collectibles','This streetcar is a joy to see. It has 80 separate windows, electric wire guides, detailed interiors with seats, poles and drivers controls, rolling and turning wheel assemblies, plus authentic factory baked-enamel finishes (Green Hornet for Chicago and Cream and Crimson for Boston).',8601,'27','62'), ('S32_3522','1996 Peterbilt 379 Stake Bed with Outrigger','Trucks and Buses','1:32','Red Start Diecast','This model features, opening doors, detailed engine, working steering, tinted windows, detailed interior, die-struck logos, removable stakes operating outriggers, detachable second trailer, functioning 360-degree self loader, precision molded resin trailer and trim, baked enamel finish on cab',814,'34','65'), ('S32_4289','1928 Ford Phaeton Deluxe','Vintage Cars','1:32','Highway 66 Mini Classics','This model features grille-mounted chrome horn, lift-up louvered hood, fold-down rumble seat, working steering system',136,'33','69'), ('S32_4485','1974 Ducati 350 Mk3 Desmo','Motorcycles','1:32','Second Gear Diecast','This model features two-tone paint with chrome accents, superior die-cast detail , rotating wheels , working kick stand',3341,'56','102'), ('S50_1341','1930 Buick Marquette Phaeton','Vintage Cars','1:50','Studio M Art Models','Features opening trunk, working steering system',7062,'27','44'), ('S50_1392','Diamond T620 Semi-Skirted Tanker','Trucks and Buses','1:50','Highway 66 Mini Classics','This limited edition model is licensed and perfectly scaled for Lionel Trains. The Diamond T620 has been produced in solid precision diecast and painted with a fire baked enamel finish. It comes with a removable tanker and is a perfect model to add authenticity to your static train or car layout or to just have on display.',1016,'68','116'), ('S50_1514','1962 City of Detroit Streetcar','Trains','1:50','Classic Metal Creations','This streetcar is a joy to see. It has 99 separate windows, electric wire guides, detailed interiors with seats, poles and drivers controls, rolling and turning wheel assemblies, plus authentic factory baked-enamel finishes (Green Hornet for Chicago and Cream and Crimson for Boston).',1645,'37','59'), ('S50_4713','2002 Yamaha YZR M1','Motorcycles','1:50','Autoart Studio Design','Features rotating wheels , working kick stand. Comes with stand.',600,'34','81'), ('S700_1138','The Schooner Bluenose','Ships','1:700','Autoart Studio Design','All wood with canvas sails. Measures 31 1/2 inches in Length, 22 inches High and 4 3/4 inches Wide. Many extras.u000du000aThe schooner Bluenose was built in Nova Scotia in 1921 to fish the rough waters off the coast of Newfoundland. Because of the Bluenose racing prowess she became the pride of all Canadians. Still featured on stamps and the Canadian dime, the Bluenose was lost off Haiti in 1946.',1897,'34','67'), ('S700_1691','American Airlines: B767-300','Planes','1:700','Min Lin Diecast','Exact replia with official logos and insignias and retractable wheels',5841,'51','91'), ('S700_1938','The Mayflower','Ships','1:700','Studio M Art Models','Measures 31 1/2 inches Long x 25 1/2 inches High x 10 5/8 inches Wideu000du000aAll wood with canvas sail. Extras include long boats, rigging, ladders, railing, anchors, side cannons, hand painted, etc.u000du000au000du000aThe Mayfower was already old in 1620, when the pilgrims charted her to bring their band of 103 to North America.',737,'43','87'), ('S700_2047','HMS Bounty','Ships','1:700','Unimax Art Galleries','Measures 30 inches Long x 27 1/2 inches High x 4 3/4 inches Wide. u000du000aMany extras including rigging, long boats, pilot house, anchors, etc. Comes with three masts, all square-rigged.',3501,'40','91'), ('S700_2466','America West Airlines B757-200','Planes','1:700','Motor City Art Classics','Official logos and insignias. Working steering system. Rotating jet engines',9653,'69','100'), ('S700_2610','The USS Constitution Ship','Ships','1:700','Red Start Diecast','All wood with canvas sails. Measures 31 1/2 Length x 22 3/8 High x 8 1/4 Width. Extras include 4 boats on deck, sea sprite on bow, anchors, copper railing, pilot houses, etc.u000du000au000du000aThis was one of six warships commissioned by George Washington and launched in 1797. The nickname Old Ironsides was given the ship when British cannonballs bounced off the 21-inch oak planking of the American frigate\'s hull. The Constitution has been restored and now resides in Boston Harbor.',7083,'34','72'), ('S700_2824','1982 Camaro Z28','Classic Cars','1:18','Carousel DieCast Legends','Features include opening and closing doors. Color: White. u000du000aMeasures approximately 9 1/2 Long.',6934,'47','101'), ('S700_2834','ATA: B757-300','Planes','1:700','Highway 66 Mini Classics','Exact replia with official logos and insignias and retractable wheels',7106,'59','119'), ('S700_3167','F/A 18 Hornet 1/72','Planes','1:72','Motor City Art Classics','10 Wingspan with retractable landing gears.Comes with pilot',551,'54','80'), ('S700_3505','The Titanic','Ships','1:700','Carousel DieCast Legends','Completed model measures 19 1/2 inches long, 9 inches high, 3inches wide and is in barn red/black. All wood and metal.',1956,'51','100'), ('S700_3962','The Queen Mary','Ships','1:700','Welly Diecast Productions','Exact replica. Wood and Metal. Many extras including rigging, long boats, pilot house, anchors, etc. Comes with three masts, all square-rigged.',5088,'54','99'), ('S700_4002','American Airlines: MD-11S','Planes','1:700','Second Gear Diecast','Polished finish. Exact replia with official logos and insignias and retractable wheels',8820,'36','74'), ('S72_1253','Boeing X-32A JSF','Planes','1:72','Motor City Art Classics','10 Wingspan with retractable landing gears.Comes with pilot',4857,'33','50'), ('S72_3212','Pont Yacht','Ships','1:72','Unimax Art Galleries','Measures 38 inches Long x 33 3/4 inches High. Includes a stand.u000du000aMany extras including rigging, long boats, pilot house, anchors, etc. Comes with 2 masts, all square-rigged',414,'33','55'); /*!40000 ALTER TABLE `products` ENABLE KEYS */; -- -- Definition of table `quadrant_actuals` -- DROP TABLE IF EXISTS `quadrant_actuals`; CREATE TABLE `quadrant_actuals` ( `REGION` varchar(50) collate latin1_general_cs NOT NULL default '', `DEPARTMENT` varchar(50) collate latin1_general_cs NOT NULL default '', `POSITIONTITLE` varchar(50) collate latin1_general_cs NOT NULL default '', `ACTUAL` decimal(18,4) default NULL, `BUDGET` decimal(18,4) default NULL, `VARIANCE` decimal(18,4) default NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_general_cs; -- -- Dumping data for table `quadrant_actuals` -- /*!40000 ALTER TABLE `quadrant_actuals` DISABLE KEYS */; INSERT INTO `quadrant_actuals` (`REGION`,`DEPARTMENT`,`POSITIONTITLE`,`ACTUAL`,`BUDGET`,`VARIANCE`) VALUES ('Central','Sales','District Manager','682625.0000','617250.0000','-65375.0000'), ('Central','Sales','Senior Sales Rep','497223.0000','484820.0000','-12403.0000'), ('Central','Sales','Sales Rep','675975.0000','612500.0000','-63475.0000'), ('Central','Sales','Account Executive','409975.0000','422500.0000','12525.0000'), ('Central','Sales','Pre-Sales','649375.0000','593500.0000','-55875.0000'), ('Central','Executive Management','CEO','549625.0000','522250.0000','-27375.0000'), ('Central','Executive Management','SVP WW Operations','476000.0000','725887.0000','249887.0000'), ('Central','Executive Management','SVP Strategic Development','383242.0000','403405.0000','20163.0000'), ('Central','Executive Management','SVP Partnerships','367415.0000','392100.0000','24685.0000'), ('Central','Finance','CFO','770272.0000','719855.0000','-50417.0000'), ('Central','Finance','Administrative Assisitant','827861.0000','760990.0000','-66871.0000'), ('Central','Finance','IS','570759.0000','577346.0000','6587.0000'), ('Central','Finance','Controller','570373.0000','577070.0000','6697.0000'), ('Central','Finance','Payroll','367415.0000','432100.0000','64685.0000'), ('Central','Human Resource','Administration','549625.0000','552250.0000','2625.0000'), ('Central','Human Resource','SVP HR','574895.0000','570300.0000','-4595.0000'), ('Central','Human Resource','HR Generalists','856190.0000','771225.0000','-84965.0000'), ('Central','Human Resource','HR Training','397473.0000','443570.0000','46097.0000'), ('Central','Human Resource','Sexual Harassment','530473.0000','538570.0000','8097.0000'), ('Central','Human Resource','EOE','530207.0000','538380.0000','8173.0000'), ('Central','Marketing & Communication','CMO','827861.0000','760990.0000','-66871.0000'), ('Central','Marketing & Communication','Product Marketing Mgr','693531.0000','665040.0000','-28491.0000'), ('Central','Marketing & Communication','Analyst Relations','383375.0000','443500.0000','60125.0000'), ('Central','Marketing & Communication','Press Relations','497296.0000','524872.0000','27576.0000'), ('Central','Marketing & Communication','Graphics','782375.0000','728500.0000','-53875.0000'), ('Central','Marketing & Communication','Writer','405985.0000','459650.0000','53665.0000'), ('Central','Product Development','CTO','405985.0000','459650.0000','53665.0000'), ('Central','Product Development','VP Engineering','383242.0000','443405.0000','60163.0000'), ('Central','Product Development','Senior Engineer','770272.0000','719855.0000','-50417.0000'), ('Central','Product Development','Engineer','695925.0000','666750.0000','-29175.0000'), ('Central','Product Development','QA Manager','374863.0000','437420.0000','62557.0000'), ('Central','Product Development','QA Engineer','367415.0000','432100.0000','64685.0000'), ('Central','Professional Services','SVP Services','4042220.0000','4180000.0000','137780.0000'), ('Central','Professional Services','Services Mgr','4401586.0000','4680000.0000','278414.0000'), ('Central','Professional Services','Senior Consultant','3994859.0000','3980000.0000','-14859.0000'), ('Central','Professional Services','Staff Consultant','3824426.0000','4180000.0000','355574.0000'), ('Central','Professional Services','Trainer','3804948.0000','3380000.0000','-424948.0000'), ('Eastern','Sales','District Manager','700000.0000','700250.0000','250.0000'), ('Eastern','Sales','Senior Sales Rep','421200.0000','433299.0000','12099.0000'), ('Eastern','Sales','Sales Rep','690000.0000','690675.0000','675.0000'), ('Eastern','Sales','Account Executive','290000.0000','307675.0000','17675.0000'), ('Eastern','Sales','Pre-Sales','650000.0000','652375.0000','2375.0000'), ('Eastern','Executive Management','CEO','500000.0000','488750.0000','-11250.0000'), ('Eastern','Executive Management','SVP WW Operations','249800.0000','249184.0000','-616.0000'), ('Eastern','Executive Management','SVP Strategic Development','226000.0000','226395.0000','395.0000'), ('Eastern','Executive Management','SVP Partnerships','531780.0000','519179.0000','-12601.0000'), ('Eastern','Finance','CFO','831800.0000','816449.0000','-15351.0000'), ('Eastern','Finance','Administrative Assisitant','918400.0000','899368.0000','-19032.0000'), ('Eastern','Finance','IS','531780.0000','529179.0000','-2601.0000'), ('Eastern','Finance','Controller','531200.0000','528624.0000','-2576.0000'), ('Eastern','Finance','Payroll','226000.0000','236395.0000','10395.0000'), ('Eastern','Human Resource','Administration','500000.0000','498750.0000','-1250.0000'), ('Eastern','Human Resource','SVP HR','538000.0000','535135.0000','-2865.0000'), ('Eastern','Human Resource','HR Generalists','961000.0000','940158.0000','-20842.0000'), ('Eastern','Human Resource','HR Training','271200.0000','279674.0000','8474.0000'), ('Eastern','Human Resource','Sexual Harassment','471200.0000','471174.0000','-26.0000'), ('Eastern','Human Resource','EOE','470800.0000','470791.0000','-9.0000'), ('Eastern','Marketing & Communication','CMO','918400.0000','894368.0000','-24032.0000'), ('Eastern','Marketing & Communication','Product Marketing Mgr','716400.0000','700953.0000','-15447.0000'), ('Eastern','Marketing & Communication','Analyst Relations','250000.0000','254375.0000','4375.0000'), ('Eastern','Marketing & Communication','Press Relations','421310.0000','418404.0000','-2906.0000'), ('Eastern','Marketing & Communication','Graphics','850000.0000','828875.0000','-21125.0000'), ('Eastern','Marketing & Communication','Writer','284000.0000','286930.0000','2930.0000'), ('Eastern','Product Development','CTO','284000.0000','286930.0000','2930.0000'), ('Eastern','Product Development','VP Engineering','249800.0000','254184.0000','4384.0000'), ('Eastern','Product Development','Senior Engineer','831800.0000','811449.0000','-20351.0000'), ('Eastern','Product Development','Engineer','720000.0000','704400.0000','-15600.0000'), ('Eastern','Product Development','QA Manager','237200.0000','242119.0000','4919.0000'), ('Eastern','Product Development','QA Engineer','226000.0000','231395.0000','5395.0000'), ('Eastern','Professional Services','SVP Services','3793000.0000','3900000.0000','107000.0000'), ('Eastern','Professional Services','Services Mgr','4333400.0000','4500000.0000','166600.0000'), ('Eastern','Professional Services','Senior Consultant','3721780.0000','3900000.0000','178220.0000'), ('Eastern','Professional Services','Staff Consultant','3465490.0000','3500000.0000','34510.0000'), ('Eastern','Professional Services','Trainer','3436200.0000','3300000.0000','-136200.0000'), ('Southern','Sales','District Manager','700000.0000','690250.0000','-9750.0000'), ('Southern','Sales','Senior Sales Rep','421200.0000','423299.0000','2099.0000'), ('Southern','Sales','Sales Rep','690000.0000','680675.0000','-9325.0000'), ('Southern','Sales','Account Executive','290000.0000','297675.0000','7675.0000'), ('Southern','Sales','Pre-Sales','650000.0000','642375.0000','-7625.0000'), ('Southern','Executive Management','CEO','500000.0000','498750.0000','-1250.0000'), ('Southern','Executive Management','SVP WW Operations','249800.0000','259184.0000','9384.0000'), ('Southern','Executive Management','SVP Strategic Development','226000.0000','236395.0000','10395.0000'), ('Southern','Executive Management','SVP Partnerships','531780.0000','529179.0000','-2601.0000'), ('Southern','Finance','CFO','831800.0000','816449.0000','-15351.0000'), ('Southern','Finance','Administrative Assisitant','918400.0000','899368.0000','-19032.0000'), ('Southern','Finance','IS','531780.0000','529179.0000','-2601.0000'), ('Southern','Finance','Controller','531200.0000','528624.0000','-2576.0000'), ('Southern','Finance','Payroll','226000.0000','236395.0000','10395.0000'), ('Southern','Human Resource','Administration','500000.0000','498750.0000','-1250.0000'), ('Southern','Human Resource','SVP HR','538000.0000','535135.0000','-2865.0000'), ('Southern','Human Resource','HR Generalists','961000.0000','940158.0000','-20842.0000'), ('Southern','Human Resource','HR Training','271200.0000','279674.0000','8474.0000'), ('Southern','Human Resource','Sexual Harassment','471200.0000','471174.0000','-26.0000'), ('Southern','Human Resource','EOE','470800.0000','470791.0000','-9.0000'), ('Southern','Marketing & Communication','CMO','918400.0000','897368.0000','-21032.0000'), ('Southern','Marketing & Communication','Product Marketing Mgr','716400.0000','703953.0000','-12447.0000'), ('Southern','Marketing & Communication','Analyst Relations','250000.0000','257375.0000','7375.0000'), ('Southern','Marketing & Communication','Press Relations','421310.0000','421404.0000','94.0000'), ('Southern','Marketing & Communication','Graphics','850000.0000','831875.0000','-18125.0000'), ('Southern','Marketing & Communication','Writer','284000.0000','289930.0000','5930.0000'), ('Southern','Product Development','CTO','284000.0000','289930.0000','5930.0000'), ('Southern','Product Development','VP Engineering','249800.0000','257184.0000','7384.0000'), ('Southern','Product Development','Senior Engineer','831800.0000','814449.0000','-17351.0000'), ('Southern','Product Development','Engineer','720000.0000','707400.0000','-12600.0000'), ('Southern','Product Development','QA Manager','237200.0000','245119.0000','7919.0000'), ('Southern','Product Development','QA Engineer','226000.0000','234395.0000','8395.0000'), ('Southern','Professional Services','SVP Services','3793000.0000','3818000.0000','25000.0000'), ('Southern','Professional Services','Services Mgr','4333400.0000','4318000.0000','-15400.0000'), ('Southern','Professional Services','Senior Consultant','3721780.0000','3718000.0000','-3780.0000'), ('Southern','Professional Services','Staff Consultant','3465490.0000','3618000.0000','152510.0000'), ('Southern','Professional Services','Trainer','3436200.0000','2918000.0000','-518200.0000'), ('Western','Sales','District Manager','700000.0000','688250.0000','-11750.0000'), ('Western','Sales','Senior Sales Rep','421200.0000','421299.0000','99.0000'), ('Western','Sales','Sales Rep','690000.0000','678675.0000','-11325.0000'), ('Western','Sales','Account Executive','290000.0000','295675.0000','5675.0000'), ('Western','Sales','Pre-Sales','650000.0000','640375.0000','-9625.0000'), ('Western','Executive Management','CEO','500000.0000','478750.0000','-21250.0000'), ('Western','Executive Management','SVP WW Operations','249800.0000','239184.0000','-10616.0000'), ('Western','Executive Management','SVP Strategic Development','226000.0000','216395.0000','-9605.0000'), ('Western','Executive Management','SVP Partnerships','531780.0000','509179.0000','-22601.0000'), ('Western','Finance','CFO','831800.0000','814449.0000','-17351.0000'), ('Western','Finance','Administrative Assisitant','918400.0000','897368.0000','-21032.0000'), ('Western','Finance','IS','531780.0000','527179.0000','-4601.0000'), ('Western','Finance','Controller','531200.0000','526624.0000','-4576.0000'), ('Western','Finance','Payroll','226000.0000','234395.0000','8395.0000'), ('Western','Human Resource','Administration','500000.0000','496750.0000','-3250.0000'), ('Western','Human Resource','SVP HR','538000.0000','533135.0000','-4865.0000'), ('Western','Human Resource','HR Generalists','961000.0000','938158.0000','-22842.0000'), ('Western','Human Resource','HR Training','271200.0000','277674.0000','6474.0000'), ('Western','Human Resource','Sexual Harassment','471200.0000','469174.0000','-2026.0000'), ('Western','Human Resource','EOE','470800.0000','468791.0000','-2009.0000'), ('Western','Marketing & Communication','CMO','918400.0000','897368.0000','-21032.0000'), ('Western','Marketing & Communication','Product Marketing Mgr','716400.0000','703953.0000','-12447.0000'), ('Western','Marketing & Communication','Analyst Relations','250000.0000','257375.0000','7375.0000'), ('Western','Marketing & Communication','Press Relations','421310.0000','421404.0000','94.0000'), ('Western','Marketing & Communication','Graphics','850000.0000','831875.0000','-18125.0000'), ('Western','Marketing & Communication','Writer','284000.0000','289930.0000','5930.0000'), ('Western','Product Development','CTO','284000.0000','289930.0000','5930.0000'), ('Western','Product Development','VP Engineering','249800.0000','257184.0000','7384.0000'), ('Western','Product Development','Senior Engineer','831800.0000','814449.0000','-17351.0000'), ('Western','Product Development','Engineer','720000.0000','707400.0000','-12600.0000'), ('Western','Product Development','QA Manager','237200.0000','245119.0000','7919.0000'), ('Western','Product Development','QA Engineer','226000.0000','234395.0000','8395.0000'), ('Western','Professional Services','SVP Services','3793000.0000','3818000.0000','25000.0000'), ('Western','Professional Services','Services Mgr','4333400.0000','4418000.0000','84600.0000'), ('Western','Professional Services','Senior Consultant','3721780.0000','3718000.0000','-3780.0000'), ('Western','Professional Services','Staff Consultant','3465490.0000','3336206.0000','-129284.0000'), ('Western','Professional Services','Trainer','3436200.0000','2918000.0000','-518200.0000'); /*!40000 ALTER TABLE `quadrant_actuals` ENABLE KEYS */; -- -- Definition of table `time` -- DROP TABLE IF EXISTS `time`; CREATE TABLE `time` ( `TIME_ID` varchar(10) collate latin1_general_cs default NULL, `MONTH_ID` int(11) default NULL, `QTR_ID` int(11) default NULL, `YEAR_ID` int(11) default NULL, `MONTH_NAME` char(3) collate latin1_general_cs default NULL, `MONTH_DESC` varchar(9) collate latin1_general_cs default NULL, `QTR_NAME` varchar(4) collate latin1_general_cs default NULL, `QTR_DESC` varchar(9) collate latin1_general_cs default NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_general_cs; -- -- Dumping data for table `time` -- /*!40000 ALTER TABLE `time` DISABLE KEYS */; INSERT INTO `time` (`TIME_ID`,`MONTH_ID`,`QTR_ID`,`YEAR_ID`,`MONTH_NAME`,`MONTH_DESC`,`QTR_NAME`,`QTR_DESC`) VALUES ('2003-01-06',1,1,2003,'Jan','January','QTR1','Quarter 1'), ('2003-01-09',1,1,2003,'Jan','January','QTR1','Quarter 1'), ('2003-01-10',1,1,2003,'Jan','January','QTR1','Quarter 1'), ('2003-01-29',1,1,2003,'Jan','January','QTR1','Quarter 1'), ('2003-01-31',1,1,2003,'Jan','January','QTR1','Quarter 1'), ('2003-02-11',2,1,2003,'Feb','February','QTR1','Quarter 1'), ('2003-02-17',2,1,2003,'Feb','February','QTR1','Quarter 1'), ('2003-02-24',2,1,2003,'Feb','February','QTR1','Quarter 1'), ('2003-03-03',3,1,2003,'Mar','March','QTR1','Quarter 1'), ('2003-03-10',3,1,2003,'Mar','March','QTR1','Quarter 1'), ('2003-03-18',3,1,2003,'Mar','March','QTR1','Quarter 1'), ('2003-03-24',3,1,2003,'Mar','March','QTR1','Quarter 1'), ('2003-03-25',3,1,2003,'Mar','March','QTR1','Quarter 1'), ('2003-03-26',3,1,2003,'Mar','March','QTR1','Quarter 1'), ('2003-04-01',4,2,2003,'Apr','April','QTR2','Quarter 2'), ('2003-04-04',4,2,2003,'Apr','April','QTR2','Quarter 2'), ('2003-04-11',4,2,2003,'Apr','April','QTR2','Quarter 2'), ('2003-04-16',4,2,2003,'Apr','April','QTR2','Quarter 2'), ('2003-04-21',4,2,2003,'Apr','April','QTR2','Quarter 2'), ('2003-04-28',4,2,2003,'Apr','April','QTR2','Quarter 2'), ('2003-04-29',4,2,2003,'Apr','April','QTR2','Quarter 2'), ('2003-05-07',5,2,2003,'May','May','QTR2','Quarter 2'), ('2003-05-08',5,2,2003,'May','May','QTR2','Quarter 2'), ('2003-05-20',5,2,2003,'May','May','QTR2','Quarter 2'), ('2003-05-21',5,2,2003,'May','May','QTR2','Quarter 2'), ('2003-05-28',5,2,2003,'May','May','QTR2','Quarter 2'), ('2003-06-03',6,2,2003,'Jun','June','QTR2','Quarter 2'), ('2003-06-06',6,2,2003,'Jun','June','QTR2','Quarter 2'), ('2003-06-12',6,2,2003,'Jun','June','QTR2','Quarter 2'), ('2003-06-16',6,2,2003,'Jun','June','QTR2','Quarter 2'), ('2003-06-25',6,2,2003,'Jun','June','QTR2','Quarter 2'), ('2003-06-27',6,2,2003,'Jun','June','QTR2','Quarter 2'), ('2003-07-01',7,3,2003,'Jul','July','QTR3','Quarter 3'), ('2003-07-02',7,3,2003,'Jul','July','QTR3','Quarter 3'), ('2003-07-04',7,3,2003,'Jul','July','QTR3','Quarter 3'), ('2003-07-07',7,3,2003,'Jul','July','QTR3','Quarter 3'), ('2003-07-10',7,3,2003,'Jul','July','QTR3','Quarter 3'), ('2003-07-16',7,3,2003,'Jul','July','QTR3','Quarter 3'), ('2003-07-24',7,3,2003,'Jul','July','QTR3','Quarter 3'), ('2003-08-01',8,3,2003,'Aug','August','QTR3','Quarter 3'), ('2003-08-08',8,3,2003,'Aug','August','QTR3','Quarter 3'), ('2003-08-10',8,3,2003,'Aug','August','QTR3','Quarter 3'), ('2003-08-13',8,3,2003,'Aug','August','QTR3','Quarter 3'), ('2003-08-25',8,3,2003,'Aug','August','QTR3','Quarter 3'), ('2003-09-03',9,3,2003,'Sep','September','QTR3','Quarter 3'), ('2003-09-05',9,3,2003,'Sep','September','QTR3','Quarter 3'), ('2003-09-11',9,3,2003,'Sep','September','QTR3','Quarter 3'), ('2003-09-12',9,3,2003,'Sep','September','QTR3','Quarter 3'), ('2003-09-19',9,3,2003,'Sep','September','QTR3','Quarter 3'), ('2003-09-21',9,3,2003,'Sep','September','QTR3','Quarter 3'), ('2003-09-25',9,3,2003,'Sep','September','QTR3','Quarter 3'), ('2003-09-28',9,3,2003,'Sep','September','QTR3','Quarter 3'), ('2003-10-02',10,4,2003,'Oct','October','QTR4','Quarter 4'), ('2003-10-04',10,4,2003,'Oct','October','QTR4','Quarter 4'), ('2003-10-05',10,4,2003,'Oct','October','QTR4','Quarter 4'), ('2003-10-06',10,4,2003,'Oct','October','QTR4','Quarter 4'), ('2003-10-08',10,4,2003,'Oct','October','QTR4','Quarter 4'), ('2003-10-09',10,4,2003,'Oct','October','QTR4','Quarter 4'), ('2003-10-10',10,4,2003,'Oct','October','QTR4','Quarter 4'), ('2003-10-11',10,4,2003,'Oct','October','QTR4','Quarter 4'), ('2003-10-17',10,4,2003,'Oct','October','QTR4','Quarter 4'), ('2003-10-18',10,4,2003,'Oct','October','QTR4','Quarter 4'), ('2003-10-20',10,4,2003,'Oct','October','QTR4','Quarter 4'), ('2003-10-21',10,4,2003,'Oct','October','QTR4','Quarter 4'), ('2003-10-22',10,4,2003,'Oct','October','QTR4','Quarter 4'), ('2003-10-23',10,4,2003,'Oct','October','QTR4','Quarter 4'), ('2003-10-28',10,4,2003,'Oct','October','QTR4','Quarter 4'), ('2003-11-04',11,4,2003,'Nov','November','QTR4','Quarter 4'), ('2003-11-05',11,4,2003,'Nov','November','QTR4','Quarter 4'), ('2003-11-06',11,4,2003,'Nov','November','QTR4','Quarter 4'), ('2003-11-07',11,4,2003,'Nov','November','QTR4','Quarter 4'), ('2003-11-08',11,4,2003,'Nov','November','QTR4','Quarter 4'), ('2003-11-11',11,4,2003,'Nov','November','QTR4','Quarter 4'), ('2003-11-12',11,4,2003,'Nov','November','QTR4','Quarter 4'), ('2003-11-13',11,4,2003,'Nov','November','QTR4','Quarter 4'), ('2003-11-14',11,4,2003,'Nov','November','QTR4','Quarter 4'), ('2003-11-15',11,4,2003,'Nov','November','QTR4','Quarter 4'), ('2003-11-18',11,4,2003,'Nov','November','QTR4','Quarter 4'), ('2003-11-19',11,4,2003,'Nov','November','QTR4','Quarter 4'), ('2003-11-20',11,4,2003,'Nov','November','QTR4','Quarter 4'), ('2003-11-21',11,4,2003,'Nov','November','QTR4','Quarter 4'), ('2003-11-25',11,4,2003,'Nov','November','QTR4','Quarter 4'), ('2003-11-26',11,4,2003,'Nov','November','QTR4','Quarter 4'), ('2003-11-27',11,4,2003,'Nov','November','QTR4','Quarter 4'), ('2003-12-01',12,4,2003,'Dec','December','QTR4','Quarter 4'), ('2003-12-02',12,4,2003,'Dec','December','QTR4','Quarter 4'), ('2003-12-03',12,4,2003,'Dec','December','QTR4','Quarter 4'), ('2003-12-05',12,4,2003,'Dec','December','QTR4','Quarter 4'), ('2003-12-09',12,4,2003,'Dec','December','QTR4','Quarter 4'), ('2004-01-02',1,1,2004,'Jan','January','QTR1','Quarter 1'), ('2004-01-09',1,1,2004,'Jan','January','QTR1','Quarter 1'), ('2004-01-12',1,1,2004,'Jan','January','QTR1','Quarter 1'), ('2004-01-15',1,1,2004,'Jan','January','QTR1','Quarter 1'), ('2004-01-16',1,1,2004,'Jan','January','QTR1','Quarter 1'), ('2004-01-22',1,1,2004,'Jan','January','QTR1','Quarter 1'), ('2004-01-26',1,1,2004,'Jan','January','QTR1','Quarter 1'), ('2004-01-29',1,1,2004,'Jan','January','QTR1','Quarter 1'), ('2004-02-02',2,1,2004,'Feb','February','QTR1','Quarter 1'), ('2004-02-04',2,1,2004,'Feb','February','QTR1','Quarter 1'), ('2004-02-09',2,1,2004,'Feb','February','QTR1','Quarter 1'), ('2004-02-10',2,1,2004,'Feb','February','QTR1','Quarter 1'), ('2004-02-12',2,1,2004,'Feb','February','QTR1','Quarter 1'), ('2004-02-18',2,1,2004,'Feb','February','QTR1','Quarter 1'), ('2004-02-19',2,1,2004,'Feb','February','QTR1','Quarter 1'), ('2004-02-20',2,1,2004,'Feb','February','QTR1','Quarter 1'), ('2004-02-21',2,1,2004,'Feb','February','QTR1','Quarter 1'), ('2004-02-22',2,1,2004,'Feb','February','QTR1','Quarter 1'), ('2004-02-26',2,1,2004,'Feb','February','QTR1','Quarter 1'), ('2004-03-02',3,1,2004,'Mar','March','QTR1','Quarter 1'), ('2004-03-10',3,1,2004,'Mar','March','QTR1','Quarter 1'), ('2004-03-11',3,1,2004,'Mar','March','QTR1','Quarter 1'), ('2004-03-15',3,1,2004,'Mar','March','QTR1','Quarter 1'), ('2004-03-19',3,1,2004,'Mar','March','QTR1','Quarter 1'), ('2004-03-20',3,1,2004,'Mar','March','QTR1','Quarter 1'), ('2004-03-29',3,1,2004,'Mar','March','QTR1','Quarter 1'), ('2004-03-30',3,1,2004,'Mar','March','QTR1','Quarter 1'), ('2004-04-02',4,2,2004,'Apr','April','QTR2','Quarter 2'), ('2004-04-03',4,2,2004,'Apr','April','QTR2','Quarter 2'), ('2004-04-05',4,2,2004,'Apr','April','QTR2','Quarter 2'), ('2004-04-09',4,2,2004,'Apr','April','QTR2','Quarter 2'), ('2004-04-12',4,2,2004,'Apr','April','QTR2','Quarter 2'), ('2004-04-13',4,2,2004,'Apr','April','QTR2','Quarter 2'), ('2004-04-20',4,2,2004,'Apr','April','QTR2','Quarter 2'), ('2004-04-26',4,2,2004,'Apr','April','QTR2','Quarter 2'), ('2004-04-29',4,2,2004,'Apr','April','QTR2','Quarter 2'), ('2004-05-04',5,2,2004,'May','May','QTR2','Quarter 2'), ('2004-05-05',5,2,2004,'May','May','QTR2','Quarter 2'), ('2004-05-07',5,2,2004,'May','May','QTR2','Quarter 2'), ('2004-05-08',5,2,2004,'May','May','QTR2','Quarter 2'), ('2004-05-11',5,2,2004,'May','May','QTR2','Quarter 2'), ('2004-05-18',5,2,2004,'May','May','QTR2','Quarter 2'), ('2004-05-26',5,2,2004,'May','May','QTR2','Quarter 2'), ('2004-06-01',6,2,2004,'Jun','June','QTR2','Quarter 2'), ('2004-06-03',6,2,2004,'Jun','June','QTR2','Quarter 2'), ('2004-06-04',6,2,2004,'Jun','June','QTR2','Quarter 2'), ('2004-06-08',6,2,2004,'Jun','June','QTR2','Quarter 2'), ('2004-06-14',6,2,2004,'Jun','June','QTR2','Quarter 2'), ('2004-06-15',6,2,2004,'Jun','June','QTR2','Quarter 2'), ('2004-06-16',6,2,2004,'Jun','June','QTR2','Quarter 2'), ('2004-06-17',6,2,2004,'Jun','June','QTR2','Quarter 2'), ('2004-06-24',6,2,2004,'Jun','June','QTR2','Quarter 2'), ('2004-06-28',6,2,2004,'Jun','June','QTR2','Quarter 2'), ('2004-06-30',6,2,2004,'Jun','June','QTR2','Quarter 2'), ('2004-07-02',7,3,2004,'Jul','July','QTR3','Quarter 3'), ('2004-07-06',7,3,2004,'Jul','July','QTR3','Quarter 3'), ('2004-07-07',7,3,2004,'Jul','July','QTR3','Quarter 3'), ('2004-07-12',7,3,2004,'Jul','July','QTR3','Quarter 3'), ('2004-07-16',7,3,2004,'Jul','July','QTR3','Quarter 3'), ('2004-07-19',7,3,2004,'Jul','July','QTR3','Quarter 3'), ('2004-07-20',7,3,2004,'Jul','July','QTR3','Quarter 3'), ('2004-07-21',7,3,2004,'Jul','July','QTR3','Quarter 3'), ('2004-07-23',7,3,2004,'Jul','July','QTR3','Quarter 3'), ('2004-08-02',8,3,2004,'Aug','August','QTR3','Quarter 3'), ('2004-08-04',8,3,2004,'Aug','August','QTR3','Quarter 3'), ('2004-08-06',8,3,2004,'Aug','August','QTR3','Quarter 3'), ('2004-08-09',8,3,2004,'Aug','August','QTR3','Quarter 3'), ('2004-08-17',8,3,2004,'Aug','August','QTR3','Quarter 3'), ('2004-08-19',8,3,2004,'Aug','August','QTR3','Quarter 3'), ('2004-08-20',8,3,2004,'Aug','August','QTR3','Quarter 3'), ('2004-08-21',8,3,2004,'Aug','August','QTR3','Quarter 3'), ('2004-08-27',8,3,2004,'Aug','August','QTR3','Quarter 3'), ('2004-08-28',8,3,2004,'Aug','August','QTR3','Quarter 3'), ('2004-08-30',8,3,2004,'Aug','August','QTR3','Quarter 3'), ('2004-09-01',9,3,2004,'Sep','September','QTR3','Quarter 3'), ('2004-09-03',9,3,2004,'Sep','September','QTR3','Quarter 3'), ('2004-09-07',9,3,2004,'Sep','September','QTR3','Quarter 3'), ('2004-09-08',9,3,2004,'Sep','September','QTR3','Quarter 3'), ('2004-09-09',9,3,2004,'Sep','September','QTR3','Quarter 3'), ('2004-09-10',9,3,2004,'Sep','September','QTR3','Quarter 3'), ('2004-09-15',9,3,2004,'Sep','September','QTR3','Quarter 3'), ('2004-09-16',9,3,2004,'Sep','September','QTR3','Quarter 3'), ('2004-09-27',9,3,2004,'Sep','September','QTR3','Quarter 3'), ('2004-09-30',9,3,2004,'Sep','September','QTR3','Quarter 3'), ('2004-10-06',10,4,2004,'Oct','October','QTR4','Quarter 4'), ('2004-10-11',10,4,2004,'Oct','October','QTR4','Quarter 4'), ('2004-10-13',10,4,2004,'Oct','October','QTR4','Quarter 4'), ('2004-10-14',10,4,2004,'Oct','October','QTR4','Quarter 4'), ('2004-10-15',10,4,2004,'Oct','October','QTR4','Quarter 4'), ('2004-10-16',10,4,2004,'Oct','October','QTR4','Quarter 4'), ('2004-10-21',10,4,2004,'Oct','October','QTR4','Quarter 4'), ('2004-10-22',10,4,2004,'Oct','October','QTR4','Quarter 4'), ('2004-10-29',10,4,2004,'Oct','October','QTR4','Quarter 4'), ('2004-11-01',11,4,2004,'Nov','November','QTR4','Quarter 4'), ('2004-11-02',11,4,2004,'Nov','November','QTR4','Quarter 4'), ('2004-11-03',11,4,2004,'Nov','November','QTR4','Quarter 4'), ('2004-11-04',11,4,2004,'Nov','November','QTR4','Quarter 4'), ('2004-11-05',11,4,2004,'Nov','November','QTR4','Quarter 4'), ('2004-11-09',11,4,2004,'Nov','November','QTR4','Quarter 4'), ('2004-11-10',11,4,2004,'Nov','November','QTR4','Quarter 4'), ('2004-11-12',11,4,2004,'Nov','November','QTR4','Quarter 4'), ('2004-11-15',11,4,2004,'Nov','November','QTR4','Quarter 4'), ('2004-11-16',11,4,2004,'Nov','November','QTR4','Quarter 4'), ('2004-11-17',11,4,2004,'Nov','November','QTR4','Quarter 4'), ('2004-11-18',11,4,2004,'Nov','November','QTR4','Quarter 4'), ('2004-11-19',11,4,2004,'Nov','November','QTR4','Quarter 4'), ('2004-11-20',11,4,2004,'Nov','November','QTR4','Quarter 4'), ('2004-11-21',11,4,2004,'Nov','November','QTR4','Quarter 4'), ('2004-11-22',11,4,2004,'Nov','November','QTR4','Quarter 4'), ('2004-11-23',11,4,2004,'Nov','November','QTR4','Quarter 4'), ('2004-11-24',11,4,2004,'Nov','November','QTR4','Quarter 4'), ('2004-11-25',11,4,2004,'Nov','November','QTR4','Quarter 4'), ('2004-11-29',11,4,2004,'Nov','November','QTR4','Quarter 4'), ('2004-12-01',12,4,2004,'Dec','December','QTR4','Quarter 4'), ('2004-12-02',12,4,2004,'Dec','December','QTR4','Quarter 4'), ('2004-12-03',12,4,2004,'Dec','December','QTR4','Quarter 4'), ('2004-12-04',12,4,2004,'Dec','December','QTR4','Quarter 4'), ('2004-12-07',12,4,2004,'Dec','December','QTR4','Quarter 4'), ('2004-12-09',12,4,2004,'Dec','December','QTR4','Quarter 4'), ('2004-12-10',12,4,2004,'Dec','December','QTR4','Quarter 4'), ('2004-12-15',12,4,2004,'Dec','December','QTR4','Quarter 4'), ('2004-12-16',12,4,2004,'Dec','December','QTR4','Quarter 4'), ('2004-12-17',12,4,2004,'Dec','December','QTR4','Quarter 4'), ('2005-01-05',1,1,2005,'Jan','January','QTR1','Quarter 1'), ('2005-01-06',1,1,2005,'Jan','January','QTR1','Quarter 1'), ('2005-01-07',1,1,2005,'Jan','January','QTR1','Quarter 1'), ('2005-01-10',1,1,2005,'Jan','January','QTR1','Quarter 1'), ('2005-01-12',1,1,2005,'Jan','January','QTR1','Quarter 1'), ('2005-01-19',1,1,2005,'Jan','January','QTR1','Quarter 1'), ('2005-01-20',1,1,2005,'Jan','January','QTR1','Quarter 1'), ('2005-01-23',1,1,2005,'Jan','January','QTR1','Quarter 1'), ('2005-01-26',1,1,2005,'Jan','January','QTR1','Quarter 1'), ('2005-01-31',1,1,2005,'Jan','January','QTR1','Quarter 1'), ('2005-02-02',2,1,2005,'Feb','February','QTR1','Quarter 1'), ('2005-02-03',2,1,2005,'Feb','February','QTR1','Quarter 1'), ('2005-02-08',2,1,2005,'Feb','February','QTR1','Quarter 1'), ('2005-02-09',2,1,2005,'Feb','February','QTR1','Quarter 1'), ('2005-02-10',2,1,2005,'Feb','February','QTR1','Quarter 1'), ('2005-02-16',2,1,2005,'Feb','February','QTR1','Quarter 1'), ('2005-02-17',2,1,2005,'Feb','February','QTR1','Quarter 1'), ('2005-02-22',2,1,2005,'Feb','February','QTR1','Quarter 1'), ('2005-02-23',2,1,2005,'Feb','February','QTR1','Quarter 1'), ('2005-02-28',2,1,2005,'Feb','February','QTR1','Quarter 1'), ('2005-03-01',3,1,2005,'Mar','March','QTR1','Quarter 1'), ('2005-03-02',3,1,2005,'Mar','March','QTR1','Quarter 1'), ('2005-03-03',3,1,2005,'Mar','March','QTR1','Quarter 1'), ('2005-03-04',3,1,2005,'Mar','March','QTR1','Quarter 1'), ('2005-03-09',3,1,2005,'Mar','March','QTR1','Quarter 1'), ('2005-03-10',3,1,2005,'Mar','March','QTR1','Quarter 1'), ('2005-03-11',3,1,2005,'Mar','March','QTR1','Quarter 1'), ('2005-03-15',3,1,2005,'Mar','March','QTR1','Quarter 1'), ('2005-03-17',3,1,2005,'Mar','March','QTR1','Quarter 1'), ('2005-03-23',3,1,2005,'Mar','March','QTR1','Quarter 1'), ('2005-03-28',3,1,2005,'Mar','March','QTR1','Quarter 1'), ('2005-03-30',3,1,2005,'Mar','March','QTR1','Quarter 1'), ('2005-04-01',4,2,2005,'Apr','April','QTR2','Quarter 2'), ('2005-04-03',4,2,2005,'Apr','April','QTR2','Quarter 2'), ('2005-04-07',4,2,2005,'Apr','April','QTR2','Quarter 2'), ('2005-04-08',4,2,2005,'Apr','April','QTR2','Quarter 2'), ('2005-04-14',4,2,2005,'Apr','April','QTR2','Quarter 2'), ('2005-04-15',4,2,2005,'Apr','April','QTR2','Quarter 2'), ('2005-04-22',4,2,2005,'Apr','April','QTR2','Quarter 2'), ('2005-04-23',4,2,2005,'Apr','April','QTR2','Quarter 2'), ('2005-04-29',4,2,2005,'Apr','April','QTR2','Quarter 2'), ('2005-05-01',5,2,2005,'May','May','QTR2','Quarter 2'), ('2005-05-03',5,2,2005,'May','May','QTR2','Quarter 2'), ('2005-05-05',5,2,2005,'May','May','QTR2','Quarter 2'), ('2005-05-06',5,2,2005,'May','May','QTR2','Quarter 2'), ('2005-05-09',5,2,2005,'May','May','QTR2','Quarter 2'), ('2005-05-10',5,2,2005,'May','May','QTR2','Quarter 2'), ('2005-05-13',5,2,2005,'May','May','QTR2','Quarter 2'), ('2005-05-16',5,2,2005,'May','May','QTR2','Quarter 2'), ('2005-05-17',5,2,2005,'May','May','QTR2','Quarter 2'), ('2005-05-29',5,2,2005,'May','May','QTR2','Quarter 2'), ('2005-05-30',5,2,2005,'May','May','QTR2','Quarter 2'), ('2005-05-31',5,2,2005,'May','May','QTR2','Quarter 2'); /*!40000 ALTER TABLE `time` ENABLE KEYS */; -- -- Definition of table `trial_balance` -- DROP TABLE IF EXISTS `trial_balance`; CREATE TABLE `trial_balance` ( `Type` char(1) collate latin1_general_cs default NULL, `Account_Num` int(11) default NULL, `Category` varchar(57) collate latin1_general_cs default NULL, `Category2` varchar(57) collate latin1_general_cs default NULL, `Detail` varchar(57) collate latin1_general_cs default NULL, `Amount` int(11) default NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_general_cs; -- -- Dumping data for table `trial_balance` -- /*!40000 ALTER TABLE `trial_balance` DISABLE KEYS */; INSERT INTO `trial_balance` (`Type`,`Account_Num`,`Category`,`Category2`,`Detail`,`Amount`) VALUES ('I',4100,'Revenue','Direct Sales','Direct Sales',400000), ('I',4200,'Revenue','Channel Sales','Channel Sales',150000), ('I',5010,'Cost of goods','Cost of goods available for sale','Beginning inventory',-40000), ('I',5020,'Cost of goods','Cost of goods available for sale','Net purchases',-325000), ('I',5040,'Cost of goods','Ending inventory','Ending inventory',35000), ('E',5110,'Expenses','Selling expenses','Sales salaries',-48000), ('E',5120,'Expenses','Selling expenses','Nonrecurring item',-12000), ('E',5130,'Expenses','Selling expenses','Other',-13000), ('E',5310,'Expenses','General and administrative expenses','Office salaries',-27100), ('E',5320,'Expenses','General and administrative expenses','Depreciation',-5500), ('E',5330,'Expenses','General and administrative expenses','Amortization',-3200), ('E',5340,'Expenses','General and administrative expenses','Bad debt',-4500), ('E',5350,'Expenses','General and administrative expenses','Other',-24200), ('I',6110,'Other revenues','Interest','Interest',5200), ('I',6120,'Other revenues','Dividends','Dividends',7200), ('I',6130,'Other revenues','Gain on sale of equipment','Gain on sale of equipment',8600), ('E',7110,'Other expenses','Interest','Interest',-9400), ('E',7120,'Other expenses','Writeoff - goodwill','Writeoff - goodwill',-5000), ('E',7130,'Other expenses','Unusual item - loss on sale of long-term investment','Unusual item - loss on sale of long-term investment',-5100), ('E',7200,'Income tax expense','Income tax expense','Income tax expense',-33600), ('I',9100,'Extraordinary item - gain on disposal of business segment','Extraordinary item - gain on disposal of business segment','Extraordinary item - gain on disposal of business segment',24000), ('I',9200,'Other Comprehensive Income','Other Comprehensive Income','Other Comprehensive Income',12000); /*!40000 ALTER TABLE `trial_balance` ENABLE KEYS */; /*!40101 SET SQL_MODE=@OLD_SQL_MODE */; /*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; /*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; /*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; -- End Steelwheels.sql mondrian-3.11.0.1-R/demo/workbench.bat000066400000000000000000000026111261646570300173510ustar00rootroot00000000000000rem @echo off rem Schema Workbench launch script rem base Mondrian JARs need to be included set CP=lib/commons-dbcp.jar;lib/commons-collections.jar;lib/commons-pool.jar set CP=%CP%;lib/eigenbase-properties.jar;lib/eigenbase-resgen.jar;lib/eigenbase-xom.jar set CP=%CP%;lib/javacup.jar;lib/log4j-1.2.12.jar;lib/mondrian.jar set CP=%CP%;lib/jlfgr-1_0.jar;lib/jmi.jar;lib/mof.jar;lib/commons-math-1.0.jar set CP=%CP%;lib/commons-vfs.jar;lib/commons-logging.jar rem Workbench GUI code and resources set CP=%CP%;lib/workbench.jar rem Have a .schemaWorkbench directory for local for /F "delims=/" %%i in ('echo %USERPROFILE%') do set ROOT=%%~si if not exist %ROOT%\.schemaWorkbench mkdir %ROOT%\.schemaWorkbench if not exist %ROOT%\.schemaWorkbench\log4j.xml copy log4j.xml %ROOT%\.schemaWorkbench if not exist %ROOT%\.schemaWorkbench\mondrian.properties copy ..\mondrian.properties %ROOT%\.schemaWorkbench rem put mondrian.properties on the classpath for it to be picked up set CP=%ROOT%/.schemaWorkbench;%CP% rem or rem set the log4j.properties system property rem "-Dlog4j.properties=path to <.properties or .xml file>" rem in the java command below to adjust workbench logging rem add all needed JDBC drivers to the classpath for %%i in ("drivers\*.jar") do call "cpappend.bat" %%i java -Xms100m -Xmx500m -cp "%CP%" -Dlog4j.configuration=file:///%ROOT%\.schemaWorkbench\log4j.xml mondrian.gui.Workbenchmondrian-3.11.0.1-R/doc/000077500000000000000000000000001261646570300145205ustar00rootroot00000000000000mondrian-3.11.0.1-R/doc/aggregate_tables.html000066400000000000000000002702361261646570300207000ustar00rootroot00000000000000 Pentaho Analysis Services: Aggregate Tables
Aggregate Tables

Contents

  1. Introduction
  2. What are aggregate tables?
    1. A simple aggregate table
    2. Another aggregate table
    3. Non Collapsed Aggregate Levels
  3. Defining aggregate tables
  4. Building aggregate tables
  5. How Mondrian recognizes aggregate tables
    1. Rules
    2. Explicit aggregates
  6. Aggregate tables and parent-child hierarchies
    1. Aggregate tables at the leaf level of a parent-child hierarchy
    2. Combined closure and aggregate tables
  7. How Mondrian uses aggregate tables
    1. Choosing between aggregate tables
    2. Distinct count
  8. Tools for designing and maintaining aggregate tables
    1. AggGen (aggregate generator)
    2. Aggregate table populater
    3. Script generator
    4. Recommender
    5. Online/offline control
  9. Properties that affect aggregates
  10. References

1. Introduction 

Unlike many OLAP servers, Mondrian does not store data on disk: it just works on the data in the RDBMS, and once it has read a piece of data once, it stores that data in its cache. This greatly simplifies the process of installing Mondrian, but it puts limits on Mondrian's performance when Mondrian is applied to a huge dataset.

Consider what happens when the CEO runs her Sales Report first thing on a Monday morning. This report contains a single number: the total sales of all products, in all regions, this year. In order to get this number, Mondrian generates a query something like this:

SELECT sum(store_sales)
FROM sales_fact,
    time
WHERE sales_fact.time_id = time.time_id
AND time.year = 2005

and sends it to the DBMS. The DBMS takes several minutes to execute it: which is understandable because the DBMS has to read all of this year's records in the fact table (a few million sales, say) and aggregate them into a single total. Clearly, what is needed in this case, and in others like it, is a pre-computed summary of the data: an aggregate table.

An aggregate table coexists with the base fact table, and contains pre-aggregated measures built from the fact table. It is registered in Mondrian's schema, so that Mondrian can choose whether to use the aggregate table rather than the fact table, if it is applicable for a particular query.

Designing aggregate tables is a fine art. There is extensive research, both empirical and theoretical, available on the web concerning different ways to structure aggregate tables and we will not attempt to duplicate any of it here.

2. What are aggregate tables? 

To explain what aggregate tables are, let's consider a simple star schema.

The star schema has a single fact table Sales, two measure columns (units and dollars) and four dimension tables (Product, Mfr, Customer, Time, and Customer).

On top of this star schema, we create the following multidimensional model:

  • Cube [Sales] has two measures [Unit sales] and [Dollar sales]
  • Dimension [Product] has levels [All Products], [Manufacturer], [Brand], [Prodid]
  • Dimension [Time] has levels [All Time], [Year], [Quarter], [Month], [Day]
  • Dimension [Customer] has levels [All Customers], [State], [City], [Custid]
  • Dimension [Payment Method] has levels [All Payment Methods], [Payment Method]

Most of the dimensions have a corresponding dimension table, but there are two exceptions. The [Product] dimension is a snowflake dimension, which means that it is spread across more than one table (in this case Product and Mfr). The [Payment Method] dimension is a degenerate dimension; its sole attribute is the payment column in the fact table, and so it does not need a dimension table.

2.1 A simple aggregate table 

Now let's create an aggregate table, Agg_1:

See how the original star schema columns have been combined into the table:

  • The Time dimension has been "collapsed" into the aggregate table, omitting the month and day columns.
  • The two tables of the Product dimension has been "collapsed" into the aggregate table.
  • The Customer dimension has been "lost".
  • For each measure column in the fact table (units, dollars), there are one or more measure columns in the aggregate table (sum units, min units, max units, sum dollars).
  • There is also a measure column, row count, representing the "count" measure.

Agg_1 would be declared like this:

<Cube name="Sales">
  <Table name="sales">
    <AggName name="agg_1">
      <AggFactCount column="row count"/>
      <AggMeasure name="[Measures].[Unit Sales]" column="sum units"/>
      <AggMeasure name="[Measures].[Min Units]" column="min units"/>
      <AggMeasure name="[Measures].[Max Units]" column="max units"/>
      <AggMeasure name="[Measures].[Dollar Sales]" column="sum dollars"/>
      <AggLevel name="[Time].[Year]" column="year"/>
      <AggLevel name="[Time].[Quarter]" column="quarter"/>
      <AggLevel name="[Product].[Mfrid]" column="mfrid"/>
      <AggLevel name="[Product].[Brand]" column="brand"/>
      <AggLevel name="[Product].[Prodid]" column="prodid"/>
    </AggName>
  </Table>
 
  <!-- Rest of the cube definition -->
</Cube>

2.2 Another aggregate table 

Another aggregate table, Agg_2:

and the corresponding XML:

<Cube name="Sales">
  <Table name="sales">
    <AggName name="agg_1" ... />
    <AggName name="agg_2">
      <AggFactCount column="row count"/>
      <AggForeignKey factColumn="prodid" aggColumn="prodid"/>
      <AggMeasure name="[Measures].[Unit Sales]" column="sum units"/>
      <AggMeasure name="[Measures].[Min Units]" column="min units"/>
      <AggMeasure name="[Measures].[Max Units]" column="max units"/>
      <AggMeasure name="[Measures].[Dollar Sales]" column="sum dollars"/>
      <AggLevel name="[Time].[Year]" column="year"/>
      <AggLevel name="[Time].[Quarter]" column="quarter"/>
      <AggLevel name="[Time].[Month]" column="month"/>
      <AggLevel name="[Payment Method].[Payment Method]" column="payment"/>
      <AggLevel name="[Customer].[State]" column="state"/>
    </AggName>
  </Table>

  <Dimension name="Product">
    <Hierarchy hasAll="true" primaryKey="prodid" primaryKeyTable="Product">
      <Join leftKey="mfrid" rightKey="mfrid">
        <Table name="Product"/>
        <Table name="Mfr"/>
      </Join>
      <Level name="Manufacturer" table="Mfr" column="mfrid"/>
      <Level name="Brand" table="Product" column="brand"/>
      <Level name="Name" table="Product" column="prodid"/>
    </Hierarchy>
  </Dimension>

  <!-- Rest of the cube definition -->
</Cube>

Several dimensions have been collapsed: [Time] at the [Quarter] level; [Customer] at the [State] level; and [Payment Method] at the [Payment Method] level. But the [Product] dimension has been retained in its original snowflake form.

The <AggForeignKey> element is used to  declare that the column prodid links to the dimension table, but all other columns remain in the Product and Mfr dimension tables.

2.3 Non Collapsed Aggregate Levels 

Another design option for aggregate tables is to use non collapsed levels. Consider the following table structure:

and the corresponding XML:

<Cube name="Sales">
  <Table name="sales">
    <AggName name="agg_3">
      <AggFactCount column="cnt"/>
      <AggMeasure name="[Measures].[Unit Sales]" column="sls"/>
      <AggLevel name="[Time].[Year]" column="yer"/>
      <AggLevel name="[Time].[Quarter]" column="qtr"/>
      <AggLevel name="[Time].[Month]" column="mth"/>
      <AggLevel name="[Channel.Network].[Brand]" column="brn" collapsed="false"/>
    </AggName>
    <AggName name="agg_3">
      <AggFactCount column="cnt"/>
      <AggMeasure name="[Measures].[Unit Sales]" column="sls"/>
      <AggLevel name="[Time].[Year]" column="yer"/>
      <AggLevel name="[Time].[Quarter]" column="qtr"/>
      <AggLevel name="[Time].[Month]" column="mth"/>
      <AggLevel name="[Channel.Distributor].[Brand]" column="brn" collapsed="false"/>
    </AggName>
  </Table>

  <Dimension name="Channel">
    <Hierarchy hasAll="true" name="Network" primaryKey="prod" primaryKeyTable="prod">
      <Join leftKey="brn" rightKey="brn" rightAlias="brn_mfr">
        <Table name="prod"/>
        <Join leftKey="brn" rightKey="brn" rightAlias="brn_mfr">
          <Table name="brn_mfr"/>
          <Join leftKey="mfr" rightKey="mfr">
            <Table name="brn_mfr"/>
            <Table name="mfr_net"/>
          </Join>
        </Join>
      </Join>
      <Level name="Network" table="mrf_net" column="net"/>
      <Level name="Manufacturer" table="mfr_brn" column="brn"/>
      <Level name="Brand" table="brn_mfr" column="brn"/>
      <Level name="Product" table="prd" column="brd"/>
    </Hierarchy>
    <Hierarchy hasAll="true" name="Distributor" primaryKey="prod" primaryKeyTable="prod">
      <Join leftKey="brn" rightKey="brn" rightAlias="brn_mfr">
        <Table name="prod"/>
        <Join leftKey="brn" rightKey="brn" rightAlias="brn_mfr">
          <Table name="brn_mfr"/>
          <Join leftKey="mfr" rightKey="mfr">
            <Table name="brn_mfr"/>
            <Table name="mfr_dist"/>
          </Join>
        </Join>
      </Join>
      <Level name="Distributor" table="mrf_dist" column="dist"/>
      <Level name="Manufacturer" table="mfr_brn" column="brn"/>
      <Level name="Brand" table="brn_mfr" column="brn"/>
      <Level name="Product" table="prd" column="brd"/>
    </Hierarchy>
  </Dimension>

  <!-- Rest of the cube definition -->
</Cube>

The cube described above uses snoflaked tables for the [Channel] dimension. That dimension has two separate hierarchies and they both share the table brn_mfr. Because both hierarchies have a level sharing the same table and column, we can take advantage of the collapsed option for AggLevel elements, and create an aggregate table that can be used for both hierarchies simultaneously.

By setting collapsed to false, Mondrian knows that the keys of the top two levels of the hierarchies are not part of the aggregate table. They have to be joined when resolving queries which use that particular aggregate table.

This also works with implicit aggregate rules. Let's assume that the AggName elements are removed from the schema. If Mondrian scans this table in search of a suitable aggregate tables to use, it will notice that the top levels are missing, and that it is therefore dealing with a non-collapsed hierarchy. Mondrian will automatically create an inner join to the other tables so it can effectively take advantage of the aggregate table.

As with regular AggLevel elements, it is not necessary to include the bottom levels of the hierarchies. In the example above, we have ommitted the last level, [Product]

3. Defining aggregate tables 

A fact table can have zero or more aggregate tables. Every aggregate table is associated with just one fact table. It aggregates the fact table measures over one or more of the dimensions. As an example, if a particular column in the fact table represents the number of sales of some product on a given day by a given store, then an aggregate table might be created that sums the information so that applies at a month level rather than by day. Such an aggregate might reasonably be 1/30th the size of the fact table (assuming comparable sales for every day of a month). Now, if one were to execute a MDX query that needed sales information at a month (or quarter or year) level, running the query against the aggregate table is faster but yields the same answer as if it were run against the base fact table.

Further, one might create an aggregate that not only aggregates at the month level but also, rather than at the individual store level, aggregates at the state level. If there were, say, 20 stores per state, then this aggregate table would be 1/600th the size of the original fact table. MDX queries interested only at the month or above and state or above levels would use this table.

When a MDX query runs, what aggregate should be used? This comes down to what measures are needed and with which dimension levels. The base fact table always has the correct measures and dimension levels. But, it might also be true that there is one or more aggregate tables that also have the measures and levels. Of these, the aggregate table with the lowest cost to read, the smallest number of rows, should be the table used to fulfill the query.

Mondrian supports two aggregation techniques which are called "lost" dimension and "collapsed" dimension. For the creation of any given aggregate table these can be applied independently to any number of different dimensions.

A "lost" dimension is one which is completely missing from the aggregate table. The measures that appear in the table have been aggregated across all values of the lost dimension. As an example, in a fact table with dimensions of time, location, and product and measure sales, for an aggregate table that did not have the location dimension that dimension would be "lost". Here, the sales measure would be the aggregation over all locations. An aggregate table where all of the dimensions are lost is possible - it would have a single row with the measure aggregated over everything - sales for all time, all locations and all products.

fact table
    time_id
    product_id
    location_id
    measure
 
lost (time_id) dimension table
    product_id
    location_id
    measure (aggregated over time)
    fact_count
 
fully lost dimension table
    measure (aggregated over everything)
    fact_count

Note the "fact_count" column in the aggregate table. This additional column is a general feature of aggregate tables. It is a count of how many fact table columns were aggregated into the one aggregate table row. As an example, if for a particular choice of product_id and location_id, the time_id occurred 5 times in the fact table, then in the aggregate table the fact_count column would contain 5 for that product_id/location_id pair (a given product was sold at a given location at 5 different times).

The second supported aggregation technique provides a finer level of control, the "collapsed" dimension technique. Recall that the dimension key in the fact table refers (more or less) to the lowest level in the dimension hierarchy. For a collapsed dimension, the dimension key in the aggregate table is replaced with a set of dimension levels; the dimension key column is replaced with a set of columns; a fully denormalized summary table for that dimension. As an example, if the time dimension with base fact table foreign key time_id had the levels: day, month, quarter and year, and in an aggregate it was collapsed to the month level, then the aggregate table would not have a time_id column but rather columns for month, quarter and year. The SQL generated for a MDX query for which this aggregate table can be used, would no longer refer to the time dimension's table but rather all time related information would be gotten from the aggregate table.

time dimension table
    time_id
    day
    month
    quarter
    year
 
fact table
    time_id
    measure
 
collapsed dimension table
    month
    quarter
    year
    measure (aggregated to month level)
    fact_count

In the literature, there are other ways of creating aggregate tables but they are not supported by Mondrian at this time.

4. Building aggregate tables 

Aggregate tables must be built. Generally, they not real-time; they are rebuilt, for example, every night for use the following day by the analysts. Considering the lost and collapsed dimension technique for aggregate table definition, one can estimate that for a dimension with N levels, there are N+1 possible aggregate tables (N collapsed and 1 lost). Also, dimensions (with different dimension tables) can be aggregated independently. For the FoodMart Sales cube there are 1400 different possible aggregate tables.

Clearly, one does not want to create all possible aggregate tables. Which ones to create depends upon two considerations. The first consideration is application dependent: the nature of the MDX queries that will be executed. If many of the queries deal with per month and per state questions, then an aggregate at those levels might be created. The second consideration is application independent: per dimension aggregating from the lowest level to the next lowest generally gives greater bang for the buck than aggregating from the N to the N+1 (N>1) level. This is because 1) a first level aggregation can be used for all queries at that level and above and 2) dimension fan-out tends to increase for the lower levels. Of course, your mileage may vary.

In a sense, picking which aggregate tables to build is analogous to picking which indexes to build on a table; it is application dependent and experience helps.

The hardest part about the actually creation and population of aggregate tables is figuring out how to create the first couple; what the SQL looks like. After that they are pretty much all the same.

Four examples will be given. They all concern building aggregate tables for the sales_fact_1997 fact table. As a reminder, the sales_fact_1997 fact table looks like:

sales_fact_1997
    product_id
    time_id
    customer_id
    promotion_id
    store_id
    store_sales
    store_cost
    unit_sales

The first example is a lost time dimension aggregate table, the time_id foreign key is missing.

CREATE TABLE agg_l_05_sales_fact_1997 (
    product_id INTEGER NOT NULL,
    customer_id INTEGER NOT NULL,
    promotion_id INTEGER NOT NULL,
    store_id INTEGER NOT NULL,
    store_sales DECIMAL(10,4) NOT NULL,
    store_cost DECIMAL(10,4) NOT NULL,
    unit_sales DECIMAL(10,4) NOT NULL,
    fact_count INTEGER NOT NULL);
 
CREATE INDEX i_sls_97_cust_id ON agg_l_05_sales_fact_1997 (customer_id);
CREATE INDEX i_sls_97_prod_id ON agg_l_05_sales_fact_1997 (product_id);
CREATE INDEX i_sls_97_promo_id ON agg_l_05_sales_fact_1997 (promotion_id);
CREATE INDEX i_sls_97_store_id ON agg_l_05_sales_fact_1997 (store_id);
 
INSERT INTO agg_l_05_sales_fact_1997 (
    product_id,
    customer_id,
    promotion_id,
    store_id,
    store_sales,
    store_cost,
    unit_sales,
    fact_count)
SELECT
    product_id,
    customer_id,
    promotion_id,
    store_id,
    SUM(store_sales) AS store_sales,
    SUM(store_cost) AS store_cost,
    SUM(unit_sales) AS unit_sales,
    COUNT(*) AS fact_count
FROM
    sales_fact_1997
GROUP BY
    product_id,
    customer_id,
    promotion_id,
    store_id;

A couple of things to note here.

The above is in MySQL's dialect of SQL, and may not work for your database - but I hope the general idea is clear. The aggregate table "looks like" the base fact table except the time_id column is missing and there is a new fact_count column. The insert statement populates the aggregate table from the base fact table summing the measure columns and counting to populate the fact_count column. This done while grouping by the remaining foreign keys to the remaining dimension tables.

Next, some databases recognize star joins - Oracle for instance. For such database one should not create indexes, not on the fact table and not on the aggregate tables. On the other hand, databases that do not recognize star joins will require indexes on both the fact table and the aggregate tables.

For our purposes here, the exact name of the aggregate table is not important; the "agg_l_05_" preceding the base fact table's name sales_fact_1997. First, the aggregate table name must be different from the base fact table name. Next, the aggregate table name ought to be related to the base fact table name both for human eyeballing of what aggregate is associated with which fact table, but also, as described below, Mondrian employs mechanism to automagically recognize which tables are aggregates of others.

The following example is a collapsed dimension aggregate table where the time dimension has been rolled up to the month level.

CREATE TABLE agg_c_14_sales_fact_1997 (
    product_id INTEGER NOT NULL,
    customer_id INTEGER NOT NULL,
    promotion_id INTEGER NOT NULL,
    store_id INTEGER NOT NULL,
    month_of_year SMALLINT(6) NOT NULL,
    quarter VARCHAR(30) NOT NULL,
    the_year SMALLINT(6) NOT NULL,
    store_sales DECIMAL(10,4) NOT NULL,
    store_cost DECIMAL(10,4) NOT NULL,
    unit_sales DECIMAL(10,4) NOT NULL,
    fact_count INTEGER NOT NULL);
 
CREATE INDEX i_sls_97_cust_id ON agg_c_14_sales_fact_1997 (customer_id);
CREATE INDEX i_sls_97_prod_id ON agg_c_14_sales_fact_1997 (product_id);
CREATE INDEX i_sls_97_promo_id ON agg_c_14_sales_fact_1997 (promotion_id);
CREATE INDEX i_sls_97_store_id ON agg_c_14_sales_fact_1997 (store_id);
 
INSERT INTO agg_c_14_sales_fact_1997 (
    product_id,
    customer_id,
    promotion_id,
    store_id,
    month_of_year,
    quarter,
    the_year,
    store_sales,
    store_cost,
    unit_sales,
    fact_count)
SELECT
    BASE.product_id,
    BASE.customer_id,
    BASE.promotion_id,
    BASE.store_id,
    DIM.month_of_year,
    DIM.quarter,
    DIM.the_year,
    SUM(BASE.store_sales) AS store_sales,
    SUM(BASE.store_cost) AS store_cost,
    SUM(BASE.unit_sales) AS unit_sales,
    COUNT(*) AS fact_count
FROM
    sales_fact_1997 AS BASE, time_by_day AS DIM
WHERE
    BASE.time_id = DIM.time_id
GROUP BY
    BASE.product_id,
    BASE.customer_id,
    BASE.promotion_id,
    BASE.store_id,
    DIM.month_of_year,
    DIM.quarter,
    DIM.the_year;

In this case, one can see that the time_id foreign key in the base fact table has been replaced with the columns: month_of_year, quarter, and the_year in the aggregate table. There is, as always, the fact_count column. The measures are inserted as sums. And, the group by clause is over the remaining foreign keys as well as the imported time dimension levels.

When creating a collapsed dimension aggregate one might consider creating indexes for the columns imported from the dimension that was collapsed.

Below is another aggregate table. This one has two lost dimensions (store_id and promotion_id) as well as collapsed dimension on time to the quarter level. This shows how aggregate techniques can be mixed.

CREATE TABLE agg_lc_100_sales_fact_1997 (
    product_id INTEGER NOT NULL,
    customer_id INTEGER NOT NULL,
    quarter VARCHAR(30) NOT NULL,
    the_year SMALLINT(6) NOT NULL,
    store_sales DECIMAL(10,4) NOT NULL,
    store_cost DECIMAL(10,4) NOT NULL,
    unit_sales DECIMAL(10,4) NOT NULL,
    fact_count INTEGER NOT NULL);
 
CREATE INDEX i_sls_97_cust_id ON agg_lc_100_sales_fact_1997 (customer_id);
CREATE INDEX i_sls_97_prod_id ON agg_lc_100_sales_fact_1997 (product_id);
 
INSERT INTO agg_lc_100_sales_fact_1997 (
    product_id,
    customer_id,
    quarter,
    the_year,
    store_sales,
    store_cost,
    unit_sales,
    fact_count)
SELECT
    BASE.product_id,
    BASE.customer_id,
    DIM.quarter,
    DIM.the_year,
    SUM(BASE.store_sales) AS store_sales,
    SUM(BASE.store_cost) AS store_cost,
    SUM(BASE.unit_sales) AS unit_sales,
    COUNT(*) AS fact_count
FROM sales_fact_1997 AS BASE,
    time_by_day AS DIM
WHERE
    BASE.time_id = DIM.time_id
GROUP BY
    BASE.product_id,
    BASE.customer_id,
    DIM.quarter,
    DIM.the_year;

In the above three examples, for the most part the column names in the aggregate are the same column names that appear in the fact table and dimension tables. These tables would all be recognized by the Mondrian default aggregate recognizer. It is possible to create an aggregate table and name the columns arbitrarily. For such an aggregate, an explicit Mondrian recognizer must be specified.

CREATE TABLE agg_c_special_sales_fact_1997 (
    PRODUCT_ID INTEGER NOT NULL,
    CUSTOMER_ID INTEGER NOT NULL,
    PROMOTION_ID INTEGER NOT NULL,
    STORE_ID INTEGER NOT NULL,
    TIME_MONTH SMALLINT(6) NOT NULL,
    TIME_QUARTER VARCHAR(30) NOT NULL,
    TIME_YEAR SMALLINT(6) NOT NULL,
    STORE_SALES_SUM DECIMAL(10,4) NOT NULL,
    STORE_COST_SUM DECIMAL(10,4) NOT NULL,
    UNIT_SALES_SUM DECIMAL(10,4) NOT NULL,
    FACT_COUNT INTEGER NOT NULL);
 
CREATE INDEX i_sls_97_cust_id ON agg_c_special_sales_fact_1997 (CUSTOMER_ID);
CREATE INDEX i_sls_97_prod_id ON agg_c_special_sales_fact_1997 (PRODUCT_ID);
CREATE INDEX i_sls_97_promo_id ON agg_c_special_sales_fact_1997 (PROMOTION_ID);
CREATE INDEX i_sls_97_store_id ON agg_c_special_sales_fact_1997 (STORE_ID);
 
INSERT INTO agg_c_special_sales_fact_1997 (
    PRODUCT_ID,
    CUSTOMER_ID,
    PROMOTION_ID,
    STORE_ID,
    TIME_MONTH,
    TIME_QUARTER,
    TIME_YEAR,
    STORE_SALES_SUM,
    STORE_COST_SUM,
    UNIT_SALES_SUM,
    FACT_COUNT)
SELECT
    BASE.product_id,
    BASE.customer_id,
    BASE.promotion_id,
    BASE.store_id,
    DIM.month_of_year,
    DIM.quarter,
    DIM.the_year,
    SUM(BASE.store_sales) AS STORE_SALES_SUM,
    SUM(BASE.store_cost) AS STORE_COST_SUM,
    SUM(BASE.unit_sales) AS UNIT_SALES_SUM,
    COUNT(*) AS FACT_COUNT
FROM
    sales_fact_1997 BASE, time_by_day DIM
WHERE
    BASE.time_id = DIM.time_id
GROUP BY
    BASE.product_id,
    BASE.customer_id,
    BASE.promotion_id,
    BASE.store_id,
    DIM.month_of_year,
    DIM.quarter,
    DIM.the_year;

This aggregate table has column names that are not identical to those found in the base fact table and dimension table. It is still a valid aggregate but Mondrian has to be told how to map its columns into those of the base fact table.

Sometimes with multiple aggregate tables, one aggregate table is an aggregate of not only the base fact table but also another aggregate table; an aggregate table with lost time and product dimensions (no time_id and product_id foreign keys) is an aggregate of the base fact table and an aggregate which only has a lost time dimension (no time_id foreign key). In this case, one might first build the aggregate with only the lost time dimension and then build the aggregate with both lost time and product dimensions from that first aggregate - it will be faster (in some cases, much faster) to populate the second aggregate from the first rather than from the base fact table.

One last note, when creating aggregate tables from the base fact table pay attention to the size of the numeric columns - what might be big enough in the base fact table might not be big enough in an aggregate.

5. How Mondrian recognizes Aggregate Tables 

Mondrian has to know about the aggregate tables in order to use them. You can either define an aggregate explicitly, or set up rules to recognize several aggregate tables at the same time.

How Mondrian recognizes aggregate table names and columns pretty much dictates how one must name those table names and columns when creating them in the first place!

5.1 Rules 

Rules are templates, designed to work for all fact table names and their column names. These rules are templates of regular expressions that are instantiated with the names of a fact table and its columns. In order to describe the rule templates, a name that instantiate a rule are represented in a rule by have the name bracketed by "${" and "}". As an example, "abc_${name}_xyz" is a rule parameterized by "name". When name is "john" the template becomes "abc_john_xyz".

The regular expression engine used here and a definition of the allowed regular expression grammar is found in the Java regular expression Pattern class: java.util.regex.Pattern.

In order that a table be recognized as an aggregate table, Mondrian must be able to map from the fact table foreign key columns and measure columns and those in the aggregate table. In addition, Mondrian must identify the fact count column in the aggregate and possible level columns (which would appear in an aggregate table if it had a "collapsed" dimension). What follows is a description of the steps taken in the identification of aggregate tables by the default recognizer. If at any step, a match fails, the table is rejected as an aggregate table.

Starting off, the candidate aggregate table's name must comply with the aggregate table name rule. Represented as a template regular expression the rule is:

agg_.+_${fact_table_name}

which is parameterized with the fact table's name. (In addition, this rule is applied in "ignore case" mode.) This means that an aggregate table's name must start with "agg_" (ignoring character case), followed by at least one character, then the '_' character and, lastly, the name of the fact table. The ".+" in the template has special meaning in a regular expression - it matches one or more characters.

As an example of applying the aggregate table name rule, let the fact table be called sales_fact_1997, the Sales cube's fact table from the FoodMart schema. Applying the specific fact table name to the regular expression template creates the following regular expression:

agg_.+_sales_fact_1997

This will match the following table names:

  • agg_l_05_sales_fact_1997
  • agg_c_14_sales_fact_1997
  • agg_lc_100_sales_fact_1997
  • agg_c_special_sales_fact_1997
  • AGG_45_SALES_FACT_1997
  • AGG_drop_time_id_sales_fact_1997

The aggregate table name recognition mechanism has one additional programatic feature, one can specify that only a portion of the base fact table name be used as the basis of template name. For instance, if the DBA demanded that all fact tables begin with the string "fact_", e.g., "fact_sales_fact_1997", one would certainly not want that string to have to be part of each aggregate table's name. The aggregate table name recognition mechanism allows one to specify a regular expression with one and only one group clause (a group clause is a pattern bracketed by '(' and ')'). Whatever is matched by the contents of the group clause is taken to be the part of the fact table name to be used in the matching template. This regular expression containing the group clause is specified as the "basename" attribute. The default Mondrian aggregate table recognizer does not use this feature. For more information see the associated developer's note link.

After the default recognizer determines that a table's name matches the aggregate table template regular expression for a given fact table, it then attempts to match columns. The first column tested for is the "fact count" column. Here the candidate aggregate table must have a column called "fact_count" (ignoring case) and this column's type must be numeric. The following examples would match as "fact count" columns.

fact_count
FACT_COUNT
fact_COUNT

Following matching the "fact count" column, the candidate aggregate table's columns are examined for possible foreign key matches. For each of the foreign key column names in the fact table it is determined if there are any character case independent matches of the aggregate table's columns. Those columns that match are noted. It is alright if no columns match; the aggregate might be a "collapsed" dimension aggregate with no fact table foreign keys remaining. If the fact table had foreign key columns "store_id" and "time_id", then the following aggregate table columns (for example) would match:

  • time_id
  • store_id
  • TIME_ID
  • STORE_ID
  • time_ID
  • STORE_id

At this point, matches are looked for the level and measure columns. Both of these matching rules are multi-part - has sub rules; each rule has more than one possible regular expression that might match where a match on any one is a match.

There are three sub rules for matching level columns. Each is a template which is parameterized with 1) the fact table's cube's dimension hierarchy's name, "hierarchy_name", 2) the fact table's cube's dimension hierarchy's level name, "level_name", 3) the dimension table's level column name, "level_column_name", and 4) a usage prefix, "usage_prefix", which in most cases is null":

  • ${hierarchy_name}_${level_name}
  • ${hierarchy_name}_${level_column_name}
  • ${usage_prefix}${level_column_name}
  • ${level_column_name}

The "usage_prefix" is the value of the DimensionUsage's or private Dimension's optional usagePrefix attribute. It can be the case that a "level_column_name", the name of a dimension's level column, is the same for more than one dimension. During aggregate recognition for collapsed dimension aggregates where the base fact table has two or more dimensions with common column names, the attempted recognition will fail unless in the schema catalog the usagePrefix attribute is used to disambiguate those column names. Of course, one must also remember to prefix the the column in the aggregate table with the same prefix.

As an example of usagePrefix, consider a fact table named ORDERS which has two DimensionUsages, one for the CUSTOMER dimension and the other for the WHOLESALER dimension where each dimension has a level column named CUST_NM. In this case, a collapsed aggregate table could not include a column named CUST_NM because there would be no way to tell which dimension to associate it with. But if in the CUSTOMER' DimensionUsage the usagePrefix had the value "CU_", while the WHOLESALER's usagePrefix had the value "WS_", and the aggregate table column was named WS_CUST_NM, then the recognizer could associate the column with the WHOLESALER dimension.

In the case of a private Dimension, a usagePrefix need only be used if there is a public, shared Dimension that has the same name and has a "level_column_name" that is also the same. Without the usagePrefix there would be no way of disambiguating collapsed dimension aggregate tables.

If any of these parameters have space characters, ' ', these are mapped to underscore characters, '_', and, similarly, dot characters, '.', are also mapped to underscores. So, if the hierarchy_name is "Time", level_name is "Month" and level_column_name is month_of_year, the possible aggregate table column names are:

  • time_month
  • time_month_of_year
  • month_of_year

For this rule, the "hierarchy_name" and "level_name" are converted to lower case while the "level_column_name" must match exactly.

Lastly, there is the rule for measures. There are three parameters to matching aggregate columns to measures: 1) the fact table's cube's measure name, "measure_name", 2) the fact table's cube's measure column name, "measure_column_name", and 3) the fact table's cube's measure's aggregator (sum, avg, max, etc.), "aggregate_name".

  • ${measure_name}
  • ${measure_column_name}
  • ${measure_column_name}_${aggregate_name}

where the measure name is converted to lower case and both the measure column name and aggregate name are matched as they appear. If the fact table's cube's measure name was, "Avg Unit Sales", the fact table's measure column name is "unit_sales", and, lastly, the fact table's cube's measure's aggregate name is "avg", then possible aggregate table column names that would match are:

  • avg_unit_sales
  • unit_sales
  • unit_sales_avg

For Mondrian developers there are additional notes describing the default rule recognition schema.

5.2 Explicit aggregates 

On a per cube basis, in a schema file a user can both include and exclude aggregate tables. A table that would have been include as an aggregate by the default rules can be explicitly excluded. A table that would not be include by the default rules can be explicitly included. A table that would have only been partially recognized by the default rules and, therefore, resulted in a warning or error message, can be explicitly include in rules specified in the cube's definition.

Below is an example for the FoodMart Sales cube with fact table sales_fact_1997. There are child elements of the Table element that deal with aggregate table recognition.

<Cube name="Sales">
  <Table name="sales_fact_1997">
    <AggExclude name="agg_c_14_sales_fact_1997" />
    <AggExclude name="agg_lc_10_sales_fact_1997" />
    <AggExclude name="agg_pc_10_sales_fact_1997" />
 
    <AggName name="agg_c_special_sales_fact_1997">
        <AggFactCount column="FACT_COUNT"/>
        <AggIgnoreColumn column="admin_one"/>
        <AggIgnoreColumn column="admin_two"/>
        <AggForeignKey factColumn="product_id" aggColumn="PRODUCT_ID" />
        <AggForeignKey factColumn="customer_id" aggColumn="CUSTOMER_ID" />
 
        <AggForeignKey factColumn="promotion_id" aggColumn="PROMOTION_ID" />
        <AggForeignKey factColumn="store_id" aggColumn="STORE_ID" />
        <AggMeasure name="[Measures].[Unit Sales]" column="UNIT_SALES_SUM" />
        <AggMeasure name="[Measures].[Store Cost]" column="STORE_COST_SUM" />
        <AggMeasure name="[Measures].[Store Sales]" column="STORE_SALES_SUM" />
        <AggLevel name="[Time].[Year]" column="TIME_YEAR" />
 
        <AggLevel name="[Time].[Quarter]" column="TIME_QUARTER" />
        <AggLevel name="[Time].[Month]" column="TIME_MONTH" />
    </AggName>
    <AggPattern pattern="agg_sales_fact_1997_.*">
    ....
    <AggExclude name="agg_sales_fact_1997_olddata" />
    <AggExclude pattern="agg_sales_fact_1997_test.*" />

     </AggPattern>

  </Table>
....
</Cube>

The AggExclude elements define tables that should not be considered aggregates of the fact table. In this case Mondrian is instructed to ignore the tables agg_c_14_sales_fact_1997, agg_lc_10_sales_fact_1997 and agg_pc_10_sales_fact_1997. Following the excludes is the AggName element which identifies the name of an aggregate table table, agg_c_special_sales_fact_1997, and rules for mapping names from the fact table and cube to it. The two AggIgnoreColumn elements are used to specifically state to Mondrian that the columns admin_one and admin_two are known and should be ignored. If these columns were not so identified, Mondrian at the end of determining the fitness of the agg_c_special_sales_fact_1997 table to be an aggregate of the sales_fact_1997 fact table would complain that there were extra unidentified columns and that the mapping was incomplete. The AggForeignKey elements define mappings from the sales_fact_1997 fact table foreign key column names into the agg_c_special_sales_fact_1997 aggregate table column names.

Both the AggMeasure and AggLevel elements map "logical" name, names defined in the cube's schema, to the aggregate table's column names. An aggregate table does not have to have all of the measures that are found in the base fact table, so it is not a requirement that all of the fact table measures appear as AggMeasure mappings, though it will certainly be the most common case. The most notable exception are distinct-count measures; such a measure can be aggregated, but one can not in general aggregate further on the measure - the "distinctness" of the measure has been lost during the first aggregation.

The AggLevel entries correspond to collapsed dimensions. For each collapsed dimension there is a hierarchy of levels spanning from the top level down to some intermediate level (with no gaps).

The AggName element is followed by an AggPattern element. This matches candidate aggregate table names using a regular expression. Included as child elements of the AggPattern element are two AggExclude elements. These specifically state what table names should not be considered by this AggPattern element.

In a given Table element, all of the AggExclude are applied first, followed by the AggName element rules and then the AggPattern rules. In the case where the same fact table is used by multiple cubes, the above still applies, but its across all of the aggregation rules in all of the multiple cube's Table elements. The first "Agg" element, name or pattern, that matches per candidate aggregate table name has its associated rules applied.

Most of the time, the scope of these include/exclude statements apply only to the cube in question, but not always. A cube has a fact table and it is the characteristics of the fact table (like column names) against which some of the aggregate table rules are applied. But, a fact table can actually be the basis of more than one cube. In the FoodMart schema the sales_fact_1997 fact table applies to both the Sales and the Sales Ragged cubes. What this means is that any explicit rules defined in the Sales cube also applies to the Sales Ragged cube and visa versa.

One feature of the explicit recognizer is very useful. With a single line in the cubes definition in the schema file, one can force Mondrian not to recognize any aggregate tables for the cube's fact table. As an example, for the FoodMart Sales cube the following excludes all aggregate tables because the regular expression pattern ".*" matches all candidate aggregate table names.

<Table name="sales_fact_1997" >     <AggExclude pattern=".*" /> </Table>

During aggregate table recognition, rather than fail silently, Mondrian is rather noisy about things it can not figure out.

6. Aggregate tables and parent-child hierarchies 

A parent-child hierarchy is a special kind of hierarchy where members can have arbitrary depth. The classic example of a parent-child hierarchy is an employee org-chart.

When dealing with parent-child hierarchies, the challenge is to roll up measures of child members into parent members. For example, when considering an employee Bill who is head of a department, we want to report not Bill's salary, but Bill's salary plus the sum of his direct and indirect reports (Eric, Mark and Carla). It is difficult to generate efficient SQL to do this rollup, so Mondrian provides a special structure called a closure table, which contains the expanded contents of the hierarchy.

A closure table serves a similar purpose to an aggregate table: it contains a redundant copy of the data in the database, organized in such a way that Mondrian can access the data efficiently. An aggregate table speeds up aggregation, whereas a closure table makes it more efficient to compute hierarchical rollups.

Supposing that a schema contains a large fact table, and one of the hierarchies is a parent-child hierarchy. Is is possible to make aggregate tables and closure tables work together, to get better performance? Let's consider a concrete example.

Cube:
    [Salary]

Dimensions:
    [Employee], with level [Employee]
    [Time], with levels [Year], [Quarter], [Month], [Day]

Fact table:
    salary (employee_id, time_id, dollars)

Parent-child dimension table:
    employee (employee_id, supervisor_id, name)
 
employee
supervisor_id employee_id name
null 1 Frank
1 2 Bill
2 3 Eric
1 4 Jane
3 5 Mark
2 6 Carla
Closure table:
    employee_closure (employee_id, supervisor_id, depth)
employee_closure
supervisor_id employee_id distance
1 1 0
1 2 1
1 3 2
1 4 1
1 5 3
1 6 2
2 2 0
2 3 1
2 5 2
2 6 1
3 3 0
3 5 1
4 4 0
5 5 0
6 6 0

Regular dimension table:
    time (year, month, quarter, time_id)

6.1 Aggregate tables at the leaf level of a parent-child hierarchy 

The simplest option is to create an aggregate table which joins at the leaf level of the parent-child hierarchy. The following aggregate table is for leaf members of the [Employee] hierarchy, and the [Year] level of the [Time] hierarchy.

Aggregate table:
    agg_salary_Employee_Time_Year (employee_id, time_year, sum_dollars)

INSERT INTO agg_salary_Employee_Time_Year
SELECT
    salary.employee_id,
    time.year AS time_year,
    sum(salary.dollars) AS sum_dollars
FROM salary,
    time
WHERE time.time_id = salary.time_id
GROUP BY salary.employee_id, time.year

Mondrian can use the aggregate table to retrieve salaries of leaf employees (without rolling up salaries of child employees). But because the aggregate table has the same foreign key as the salary fact table, Mondrian is able to automatically join salary.employee_id to either agg_salary_Employee_Time_Year.employee_id  or agg_salary_Employee_Time_Year.supervisor_id  to rollup employees efficiently.

6.2 Combined closure and aggregate tables 

A more advanced option is to combine the closure table and aggregate table into one:

Aggregate table:
    agg_salary_Employee$Closure_Time_Year (supervisor_id, time_year, sum_dollars)

INSERT INTO agg_salary_Employee$Closure_Time_Year
SELECT
    ec.supervisor_id,
    time.year AS time_year,
    sum(salary.dollars) AS sum_dollars
FROM employee_closure AS ec,
    salary,
    time
WHERE ec.supervisor_id = salary.employee_id
AND ec.supervisor_id <> ec.employee_id
AND time.time_id = salary.time_id
GROUP BY ec.employee_id, ec.supervisor_id, time.year

The agg_salary_Employee$Closure_Time_Year aggregate table contains the salary of every employee, rolled up to include their direct and indirect reports, aggregated to the [Year] level of the [Time] dimension.

6.2.1 The trick: How combined closure and aggregate tables work

Incidentally, this works based upon a 'trick' in Mondrian's internals. Whenever Mondrian sees a closure table, it creates a auxilliary dimension behind the scenes. In the case of the [Employee] hierarchy and its employee_closure table, the auxilliary dimension is called [Employee$Closure].

Dimension [Employee$Closure], levels [supervisor_id], [employee_id] 

When an MDX query evaluates a cell which uses a rolled up salary measure, Mondrian translates the coordinates of that cell in the [Employee] dimension into a corresponding coordinate in the [Employee$Closure] dimension. This translation happens before Mondrian starts to search for a suitable aggregate table, so if your aggregate table contains the name of the auxiliary hierarchy (as agg_salary_Employee$Closure_Time_Year contains the name of the [Employee$Closure] hierarchy) it find and use the aggregate table in the ordinary way.

7. How Mondrian uses aggregate tables 

7.1 Choosing between aggregate tables 

If more than one aggregate table matches a particular query, Mondrian needs to choose between them.

If there is an aggregate table of the same granularity as the query, Mondrian will use it. If there is no aggregate table at the desired granularity, Mondrian will pick an aggregate table of lower granularity and roll up from it. In general, Mondrian chooses the aggregate table with the fewest rows, which is typically the aggregate table with the fewest extra dimensions. See property mondrian.rolap.aggregates.ChooseByVolume.

7.2 Distinct count 

There is an important exception for distinct-count measures: they cannot in be rolled up over arbitrary dimensions. To see why, consider the case of a supermarket chain which has two stores in the same city. Suppose that Store A has 1000 visits from 800 distinct customers in the month of July, while Store B has 1500 visits from 900 distinct customers. Clearly the two stores had a total of 2500 customer visits between them, but how many distinct customers? We can say that there were at least 900, and maybe as many as 1700, but assuming that some customers visit both stores, and the real total will be somewhere in between. "Distinct customers" is an example of a distinct-count measure, and cannot be deduced by rolling up subtotals. You have to go back to the raw data in the fact table.

There is a special case where it is acceptable to roll up distinct count measures. Suppose that we know that in July, this city's stores (Store A and B combined) have visits from 600 distinct female customers and 700 distinct male customers. Can we say that the number of distinct customers in July is 1300? Yes we can, because we know that the sets of male and female customers cannot possibly overlap. In technical terms, gender is functionally dependent on customer id.

The rule for rolling up distinct measures can be stated as follows:

A distinct count measure over key k can be computed by rolling up more granular subtotals only if the attributes which are being rolled up are functionally dependent  on k.

Even with this special case, it is difficult to create enough aggregate tables to satisfy every possible query. When evaluating a distinct-count measure, Mondrian can only use an aggregate table if it has the same logical/level granularity as the cell being requested, or can be rolled up to that granularity only by dropping functionally dependent attributes. If there is no aggregate table of the desired granularity, Mondrian goes instead against the fact table.

This has implications for aggregate design. If your application makes extensive use of distinct-count measures, you will need to create an aggregate table for each granularity where it is used. That could be a lot of aggregate tables! (We hope to have a better solution for this problem in future releases.)

That said, Mondrian will rollup measures in an aggregate table that contains one or more distinct-count measures if none of the distinct-count measures are requested. In that respect an aggregate table containing distinct-count measures are just like any other aggregate table as long as the distinct-count measures are not needed. And once in memory, distinct-count measures are cached like other measures, and can be used for future queries.

When building an aggregate table that will contain a distinct-count measure, the measure must be rolled up to a logical dimension level, which is to say that the aggregate table must be a collapsed dimension aggregate. If it is rolled up only to the dimension's foreign key, there is no guarantee that the foreign key is at the same granularity as the lowest logical level, which is what is used by MDX requests. So for an aggregate table that only rolls the distinct-count measure to the foreign key granularity, a request of that distinct-count measure may result in further rollup and, therefore, an error.

Consider the following aggregate table that has lost dimensions customer_id, product_id, promotion_id and store_id.

INSERT INTO "agg_l_04_sales_fact_1997" (
    "time_id",
    "store_sales",
    "store_cost",
    "unit_sales",
    "customer_count",
    "fact_count"
) SELECT
    "time_id",
    SUM("store_sales") AS "store_sales",
    SUM("store_cost") AS "store_cost",
    SUM("unit_sales") AS "unit_sales",
    COUNT(DISTINCT "customer_id") AS "customer_count",
    COUNT(*) AS "fact_count"
FROM "sales_fact_1997"
GROUP BY "time_id";

This aggregate table is useless for computing the "customer_count" measure. Why? The distinct-count measure is rolled up to the time_id granularity, the lowest level granularity of the physical database table time_by_day. Even a query against the lowest level in the Time dimension would require a rollup from time_id to month_of_year, and this is impossible to perform.

Now consider this collapsed Time dimension aggregate table that has the same lost dimensions customer_id, product_id, promotion_id and store_id. The time_id foreign key is no longer present, rather it has been replaced with the logical levels the_year, quarter and month_of_year.

INSERT INTO "agg_c_10_sales_fact_1997" (
    "month_of_year",
    "quarter",
    "the_year",
    "store_sales",
    "store_cost",
    "unit_sales",
    "customer_count",
    "fact_count"
) SELECT
    "D"."month_of_year",
    "D"."quarter",
    "D"."the_year",
    SUM("B"."store_sales") AS "store_sales",
    SUM("B"."store_cost") AS "store_cost",
    SUM("B"."unit_sales") AS "unit_sales",
    COUNT(DISTINCT "customer_id") AS "customer_count",
    COUNT(*) AS fact_count
FROM
    "sales_fact_1997" "B",
    "time_by_day" "D"
WHERE
    "B"."time_id" = "D"."time_id"
GROUP BY
    "D"."month_of_year",
    "D"."quarter",
    "D"."the_year";

This aggregate table of the distinct-count measure can be used to fulfill a query as long as the query specifies the Time dimension down to the month_of_year level.

The general rule when building aggregate tables involving distinct-count measures is that there can be NO foreign keys remaining in the aggregate table - for each base table foreign key, it must either be dropped, a lost dimension aggregate, or it must be replaces with levels, a collapsed dimension aggregate. In fact, this rule, though not required, is useful to follow when creating any aggregate table; there is no value in maintaining foreign keys in aggregate tables. They should be replaced by collapsing to levels unless the larger memory used by such aggregate tables is too much for one's database system.

A better design for the aggregate table would include a few attributes which are functionally dependent on customer_id, the key for the distinct-count measure:

INSERT INTO "agg_c_12_sales_fact_1997" (
    "country",
    "gender",
    "marital_status",
    "month_of_year",
    "quarter",
    "the_year",
    "store_sales",
    "store_cost",
    "unit_sales",
    "customer_count",
    "fact_count"
) SELECT
    "D"."month_of_year",
    "D"."quarter",
    "D"."the_year",
    SUM("B"."store_sales") AS "store_sales",
    SUM("B"."store_cost") AS "store_cost",
    SUM("B"."unit_sales") AS "unit_sales",
    COUNT(DISTINCT "customer_id") AS "customer_count",
    COUNT(*) AS fact_count
FROM
    "sales_fact_1997" "B",
    "time_by_day" "D",
    "customer" "C"
WHERE
    "B"."time_id" = "D"."time_id"
AND "B".customer_id" = "C"."customer_id"
GROUP BY
    "C"."country",
    "C"."gender",
    "C"."marital_status",
    "D"."month_of_year",
    "D"."quarter",
    "D"."the_year";

The added attributes are "country", "gender" and "marital_status". This table has only appoximately 12x the number of rows of the previous aggregate table (3 values of country x 2 values of gender x 2 values of marital_status) but can answer many more potential queries.

8. Tools for designing and maintaining aggregate tables 

Aggregate tables are difficult to design and maintain. We make no bones about it. But this is the first release in which aggregate tables have been available, and we decided to get the internals right rather than building a toolset to make them easy to use.

Unless your dataset is very large, Mondrian's performance will be just fine without aggregate tables. If Mondrian isn't performing well, you should first check that your DBMS is well-tuned: see our guide to optimizing performance). If decide to build aggregate tables anyway, we don't offer any tools to help administrators design them, so unless you are blessed with superhuman patience and intuition, using them won't be smooth sailing.

Here are some ideas for tools we'd like to build in the future. I'm thinking of these being utilities, not part of the core runtime engine. There's plenty of room to wrap these utilities in nice graphical interfaces, make them smarter.

8.1 AggGen (aggregate generator) 

AggGen is a tool that generates SQL to support the creation and maintenance of aggregate tables, and would give a template for the creation of materialized views for databases that support those. Given an MDX query, the generated create/insert SQL is optimal for the given query. The generated SQL covers both the "lost" and "collapsed" dimensions. For usage, see the documentation for CmdRunner.

8.2 Aggregate table populater 

This utility populates (or generates INSERT statements to populate) the agg tables.

For extra credit: populate the tables in topological order, so that higher level aggregations can be built from lower level aggregations. (See [AAD+96]).

8.3 Script generator 

This utility generates a script containing CREATE TABLE and CREATE INDEX statements all possible aggregate tables (including indexes), XML for these tables, and comments indicating the estimated number of rows in these tables. Clearly this will be a huge script, and it would be ridiculous to create all of these tables. The person designing the schema could copy/paste from this file to create their own schema.

8.4 Recommender 

This utility (maybe graphical, maybe text-based) recommends a set of aggregate tables. This is essentially an optimization algorithm, and it is described in the academic literature [AAD+96]. Constraints on the optimization process are the amount of storage required, the estimated time to populate the agg tables.

The algorithm could also take into account usage information. A set of sample queries could be an input to the utility, or the utility could run as a background task, consuming the query log and dynamically making recommendations.

8.5 Online/offline control 

This utility would allow agg tables to be taken offline/online while Mondrian is still running.

9. Properties that affect aggregates 

Mondrian has properties that control the behavior of its aggregate table sub-system. (You can find the full set of properties in the Configuration Guide.)

Property Type Default Value Description
mondrian. rolap. aggregates. Use boolean false If set to true, then Mondrian uses any aggregate tables that have been read. These tables are then candidates for use in fulfilling MDX queries. If set to false, then no aggregate table related activity takes place in Mondrian.
mondrian. rolap. aggregates. Read boolean false If set to true, then Mondrian reads the database schema and recognizes aggregate tables. These tables are then candidates for use in fulfilling MDX queries. If set to false, then aggregate table will not be read from the database. Of course, after aggregate tables have been read, they are read, so setting this property false after starting with the property being true, has no effect. Mondrian will not actually use the aggregate tables unless the mondrian.rolap. aggregates.Use property is set to true.
mondrian. rolap. aggregates. ChooseByVolume boolean false Currently, Mondrian support to algorithms for selecting which aggregate table to use: the aggregate with smallest row count or the aggregate with smallest volume (row count * row size). If set to false, then row count is used. If true, then volume is used.
mondrian. rolap. aggregates. rules resource or url /Default Rules.xml This is a developer property, not a user property. Setting this to a url (e.g., file://c:/myrules.xml) allows one to use their own "default" Mondrian aggregate table recognition rules. In general use this should never be changed from the default value.
mondrian. rolap. aggregates. rule. tag string default This is also a developer property. It allows one to pick which named rule in the default rule file to use. In general use this should never be changed from the default value.

10. References 

[AAD+96]  S. Agarwal, R. Agrawal, P. M. Deshpande, A. Gupta, J. F. Naughton, R. Ramakrishnan, and S. Sarawagi. On the computation of multidimensional aggregates. In Proc. 22nd VLDB, pages 506-521, Mumbai, Sept. 1996. [pdf]
[ABDGHLS99]  J. Albrecht, A. Bauer, O. Deyerling, H. Gunze, W. Hummer, W. Lehner, L. Schlesinger. Management of Multidimensional Aggregates for Efficient Online Analytical Processing. Proceedings of International Database Engineering and Applications Symposium, 1999, pp. 156164. [pdf]
[GBLP96]  J. Gray, A. Bosworth, A. Layman, and H. Pirahesh. Data cube: A relational aggregation operator generalizing group-by, cross-tab, and sub-totals. In Proc. 12th ICDE, pages 152-159, New Orleans, March 1996. [pdf]
[HNSS95]  P.J. Haas, J.F. Naughton, S. Seshadri, and L. Stokes. Sampling-based estimation of the number of distinct values of an attribute. Proceedings of the Eighth International Conference on Very Large Databases (VLDB), pages 311322, Zurich, Switzerland, September 1995. [pdf]
[Rittman05]  M. Rittman. Compressed Composites (Oracle 10g Compression) Explained. Online article. [html]
[SDNR96]  Amit Shukla, Prasad Deshpande, Jeffrey F. Naughton, Karthikeyan Ramasamy. Storage Estimation for Multidimensional Aggregates in the Presence of Hierarchies. VLDB 1996, pp. 522531. [pdf]


Author: Richard Emberson; last modified by Julian Hyde, March 2008.
Version: $Id$ (log)
Copyright (C) 2005-2009 Pentaho and others


mondrian-3.11.0.1-R/doc/aggregate_tables.vsd000066400000000000000000007520001261646570300205220ustar00rootroot00000000000000ࡱ> 345Root EntryRoot EntryFV~VisioDocument6weSummaryInformation( \SDocumentSummaryInformation8   !"#$%&'()*+,-./012789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~VisioInformation" ՜.+,D՜.+,X `ht   &Page-1Vanishing pointShallow blocktTitle block corporate 1Border technical 1tStatus bar divider line Status bardText box (single-line)5 ruled columne RectangleluRectangle.12neReference rectangleRectangle.14tanCurved arrowtanCurved arrowan Fancy arrowHollow connect 2leHollow connect 3leHollow connect 1leVariable arrow1Universal connector Side - side Arc: 3pt.e Arc radiusArc radius.26ecArc - graphicalLine-arc connector Arced arrowLine-curve connector)Line-curve connector.31Line-curve connector.32Line-curve connector.33FrameurNote box classictorNote box decoicNote box neonicBlock - top labelorSquare PagesMasters%0|_PID_LINKBASE_VPID_ALTERNATENAMES _TemplateIDATC010497471033Oh+'0,S `ht ( Julian Hyde<C:\Program Files\Microsoft Office\Visio11\1033\BLOCKP_U.VST Julian HydeMicrosoft Visio@`u~GQH]! EMFQlJ $VISIODrawingLTQH]I^ ??d(P(I^P߿???/.->=<>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<>=蹲??>??>诩     ľ蹲??>??>`\Z((Assssss--K((AssssssVVsLsLsLV9 sLsLsLW; sLsLsLsLLLLLLLLLCLLLu&&& &+UkLLL&蹲??>??>`\Z67X;;c66XssfffsL fffuN  ffffffffffffYfff 'Ü333 3*9sfff*3蹲??>??>`\Z67X;;c66XssfffsL fffuN  ffffffffffffYfff 'Ü333 3*9sfff*3蹲??>??>`\Z67X;;c66XssfffsL fffuN  ffffffffffffYfff 'Ü333 3*9sfff*3蹲??>??>`\Z67X;;c66XssfffsL fffuN  ffffffffffffYfff 'Ü333 3*9sfff*3蹲??>??>`\Z67X;;c66XssfffsL fffuN  ffffffffffffYfff 'Ü333 3*9sfff*3蹲??>??>`\Z67X;;c66XssfffsL fffuN  fp3ffffffffYfff 'Ü333 3*9sfff*3蹲??>??>`\Z67X;;c66XssfffsL fffuN  fyfffffffffYfff 'Ü333 3*9sfff*3蹲??>??>`\Z67X;;c66XssfffsL fffuN  fyfffffffffYfff 'Ü333 3*9sfff*3蹲??>??>`\Z67X;;c66XssfffsL fffuN  ffffffffffffYfff 'Ü333 3*9sfff*3蹲??>??>`\Z67X;;c66XssfffsL fffuN  ffffffffffffYfff 'Ü333 3*9sfff*3蹲??>??>`\Z67X;;c66XssfffsL fffuN  ffffffffffffYfff 'Ü333 3*9sfff*3蹲??>??>`\Z()Bssssss,,J&&=ssssssVV sLsLsLV9  sLsLsLX: sLsLsLsLLLLLLLLL CLLLt&&& $+VkLLL!(蹲??>??>?<;&&@&&@&&@ &&@&&@&&@&@&@&@ &@&@&@'&@&@&@&@@@@@@@@@@@@@@@@@,,@@@@@@' @3 @3 @3 3@3@3@lhe蹲??>??><98!' @@kff@k+fY;fffffffDffw3ff hda蹲??>??><98!'f@k+ffffffffffDffw33 @Pff hda蹲??>??>CA@                             |wt蹲??>??>TQO ""!:87kge蹲??>??>蹲??>??>蹲??>??>]ZW{wt{wt{wt{wt{wt{wt{wt{wt{wt{wt{wt{wt{wt{wt{wt{wt{wt{wt{wt{wt{wt{wt{wt{wt{wt{wt{wt{wt{wt{wt{wt{wt{wt{wt{wt{wt{wt{wt{wt{wt{wt{wt{wt{wt{wt{wt{wt{wt{wt{wt{wt{wt{wt{wt{wt]ZW??>>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<754    VVVVVVVVVVVVVVVVVV蔏 sssssssssLsLsLsLLLLLu&&& dsss&_RJ:3.`\Z}zpli ffffffff 'Ü333 ߆3 *ocŰŰŰOE>`\Zvqo^[X ffffffff 'Ü333 ߆3 *ocŰŰŰOE>`\Zvqo^[X ffffffff 'Ü333 ߆3 *ocŰŰŰOE>`\Zvqo^[X ffffffff 'Ü333 ߆3 *ocŰŰŰOE>`\Z&&@vqo^[X ffffffff 'Ü333 ߆3 *ocŰŰŰOE>`\Zvqo^[X ffffffff 'Ü333 ߆3 *ocŰŰŰOE>`\Zvqo^[X ffffffff 'Ü333 ߆3 *ocŰŰŰOE>`\Z&&@vqo^[X ffffffff 'Ü333 ߆3 *ocŰŰŰOE>`\Zkfcvqo^[X ffffffff 'Ü333 ߆3 *ocŰŰŰOE>`\Z葌#!&" fXOŰŰŰŰŰŰ ocŰŰŰ vqo^[X ffffffff 'Ü333 ߆3 *ocŰŰŰOE>`\ZvŰŰŰŰŰŰ ocŰŰŰ ojh^[X ffffffff 'Ü333 ߆3 *ocŰŰŰOE>`\ZŰŰŰŰŰŰ ocŰŰŰ gca^[X ffffffff 'Ü333 ߆3 *ocŰŰŰOE>`\ZŰŰŰŰŰŰ ocŰŰŰ gca^[X ffffffff 'Ü333 ߆3 *ocŰŰŰOE>`\ZŰŰŰŰŰŰ ocŰŰŰ gca^[X ffffffff 'Ü333 ߆3 *ocŰŰŰOE>`\ZŰŰŰŰŰŰ ocŰŰŰ |^[X ffffffff 'Ü333 ߆3 *ocŰŰŰOE>`\ZŰŰŰŰŰŰ ocŰŰŰ ^[X fffffffgOWZ83 ߆3 *ocŰŰŰOE>`\ZŰŰŰŰŰŰ ocŰŰŰ ><:^[X ffffffffff:3 ߆3 *ocŰŰŰOE>`\ZŰŰŰŰŰŰ ocŰŰŰ {wt{wt^[X fffffffgOWZ83 ߆3 *ocŰŰŰOE>`\ZŰŰŰŰŰŰ ocŰŰŰ 643^[X ffffffff 'Ü333 ߆3 *ocŰŰŰOE>`\ZŰŰŰŰŰŰ ocŰŰŰ ^[X ffffffff 'Ü333 ߆3 *ocŰŰŰOE>`\ZŰŰŰtdYɮŰŰŰyi]ŰŰŰ MKI^[X ffffffff 'Ü333 ߆3 *ocŰŰŰOE>`\ZŰŰŰŰŰŰŰŰŰŰ 苅lif^[X ffffffff 'Ü333 ߆3 *ocŰŰŰOE>`\ZŰŰŰŰŰŰŰŰŰŰ .-,^[X ffffffff 'Ü333 ߆3 *ocŰŰŰOE>`\ZŰŰŰŰŰŰ ocŰŰŰ ^[X ffffffff 'Ü333 ߆3 *ocŰŰŰOE>`\ZŰŰŰŰŰŰ ocŰŰŰ ]ZW^[X ffffffff 'Ü333 ߆3 *ocŰŰŰOE>`\ZŰŰŰŰŰŰ ocŰŰŰ 豫FCB^[X ffffffff 'Ü333 ߆3 *ocŰŰŰOE>`\ZŰŰŰŰŰŰ ocŰŰŰ ^[X ffffffff 'Ü333 ߆3 *ocŰŰŰOE>`\ZŰŰŰŰŰŰ ocŰŰŰ -.)]ZW^[X ffffffff 'Ü333 ߆3 *ocŰŰŰOE>`\ZŰŰŰŰŰŰ ocŰŰŰ  333& 333, FCB^[X ffffffff 'Ü333 ߆3 *ocŰŰŰOE>`\ZŰŰŰŰŰŰ ocŰŰŰ &@fffsL fffY ^[X ffffffff 'Ü333 ߆3 *ocŰŰŰOE>`\ZŰŰŰŰŰŰ ocŰŰŰ &@fffsL fffY ]ZW[XU&&@&&@&&@&&@&@&@&@&@@@@@@@@@ /& @3 @3 @38"-@&3@&3@&3 91,91,91,TPOplj&@fffsL fffY .-,RPMsssssssssLsLsLsLLLLLpY&&&Xusss 5.)<98vŰŰŰsgŰŰŰG>7ŰŰŰhda&@fffsL fffY .-,RPMffffw3  G>7Ű<98 G?9wg\vŰsgŰŰG>7Űhda&@fffsL fffY 誣MKIwsoVVQQSSVVV9Q5S7V99999TCsssmAXVsVsVs("ocsdZoc <98ٚQNKhdaBp-fff|S3U"fffY  xtqhdahdahdahdaVTQhdahdahdahdaVTQhda)(&532hdahdaffffffY 豫FCB誣MKI豫FCB蹲><:fffffffY 蚔]ZW'%$.-,{wt{wtURPBp-fff|S3U"fffY 苅]ZW~{tpm><:.-,&@fffsL fffY .-,><:0sLsLsLV9  sLsLsLdC MKI誣MKI誣MKI&@&@&@$&@&@&@1誣MKI蚔FCB><: ffV9fuN.-,蹲><:><: fV9ff.-,643><:MKIFCB]ZWea_643'%$URP{wtҚMKIFCB><:><:.-,{wt豫lif.-,{wt.-,FCB??>??>??>??>??>??>??>??>??>??>??>??>??>??>??>??>??>??>??>??>??>??>??>??>??>??>??>??>??>??>??>??>??>??>??>??>??>??>??>??>??>??>??>??>??>??>??>??>??>??>??>??>??>??>??>??>??>??>??>??>??>??>??>??>??>??>??>??>??>??>??>??>??>      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~Visio (TM) Drawing weOd_Rwf %7u,o7v0%757v0%77*hY ߳!fffMMM333IyFwͩ|woݡHxǵŲ{33f3ff33fPP_|I^qb~iv[[zzf=[QzUPT/ L. GU0J:DT5I[1hXT@. /UbW##_b0zGz? L\&B1r&b%U& !oM $d ) P?;H$,Q, & #&J , 5& ?D#/8/?M84? U0CA  ~,,,'q/%P6$Y6 (}k?l)?"U   U%A3# o >S@#B:_a_ReUUeUeUeUeUeUePONODN`_ReUUeUeUeUeUUeUeUU/b SR%;5OM%>Qiq;RRRRgg Rqh>Qj /A^F' %p3:|bFpT#| | | vi?=Os<3T5x,,A,/R QmeY Bq]U@QvovL__q____OO_OOY*A`X,X?ЖYبsUΡ̦xΟ@$"Jʼ& ͥ*@d2A??ϟJ[D!e:ѵ5ѵ5ѵ5ѵ 0 0D$#    Q##bChh  ,A00J DNrqN㊐NN(NNN&"&NDuc7XXKvvFN KD"#KD#-D#KHGHDHBNzIDK%iz4}1T,Eu9fdhT,W'0f΢Uܮ50 fI$[OmOC%ߑE##HZ * E,3Y&4Y&5&6<s9FaajP+h8 ,8?&!3"DE=T;ܯ?w???8&t,'5UAR^LY  Y7akKt//BJhuipsĝa.1DTcAcpvOp M KKuhdX(GNiX I[EEh.yw##QE,ah-50zGzpvbaBHGmc/P K{\Hʲ_ hj? pA?%?7?I?[;<t5j! OO*FQ///F/K]SEn%cOOOlE$g\Ey[EO_!_3_E_W_i_{_____VB506,HM.`e^MIa,>PbQaƒ27q? 0a%oXIofd oooSEX_O-OF6ED@i66Oҟm2HŚi;pbӏ_ ,7R[,<b Ӥ69sc Rba"2T^"<C=C(oordpѮ'~ Zg񁒂0$!"#rq%$"3=`\bqCVm'&7Ao4e'7AyAA}NU)7A[*7Ah*yu,7A}k/SE;Z`Яܯu[osx\"jq&Iy@$6HqUNAbzbbtb}$m8~{Fwƿ ub{(ߴ@XEU" 5GPH]ѴF6;T=OOO-FXuzjMR W )O贁Nk;/ѼF^lmO+7Aϊ)&Lmu!`j/|///5 /'n///jRVv+?=??Qs? 2??h?#|/OAO $)["jb//$/OS'd/K_]_o_///__?<oo,o>oPobotoooooooh?*B2b@b=H~qb]oׅ0)_p&8J\1@ҏ,>Pbh !Ebۻ????OO'O9OKO]OoOOOOOvOOO_ _2_D_V_h_z____]'(í___ bdAMsb2oDoVohozoooooooo .Oas'7qt)XSew0bީԏ .@RdvkƟ؟ 2DVhz]*|+ɯۯ#kbjbܩ'9K]oɿ ۿ2DVhzόϞϰ K=,-5GYߞqbkubߞ߰ .@RdvR+'9K]oK=.Qj#5GYk}  2DVhz -/0#/5/G/TB-b@bk3bDbz//58,1ٺ/61$d=b;bXP//?>m&94:?L?^?p?EV#2bXJq??????OO,O>OPObOtO(2SOOOa1B kO _^31_CX@IbU_g_y________s$o6oHoZolo~oooooooo -4=p"'9Kn9z2B~##s,>Pbtf+ÏՏ /ASew -56ߴƟ؟'wbpNP /AS$wѯ+ASewѿ43qyFwGBTfZ${Đϱ^EV '9"?@4?o߁ߓ|?%7I[m7HxS.|"4]/EW߱ߒ4$I Y$s)/ //:<AU$655 !!I /4=;;99)2]?@s? 93TO贁Nk\Y!BF ‡ntq@?O8F\? PMA=9& CF*BN\N\NW0?B?2/D'MU g/y//VBV ¡j__bhbh{XWS\03b g f"MfZ4\okNo`o+|/xWq////?!?$6COq`G59~Ntr!rI?Y UgWsȉϏM?{8%43> 5G`#'9261A(U?g?^oFAD ULRIAw???E_0btS?ofC$?|@ A/[Kkcf*llg<??rr/T9b ?Q///a//o&%76OHOmlIq(}G]ډUa@Ooo/caE|dXeooooeXeex1esSoeo8!a[ӔF+/=/O&lL.яd*'!3r__i?_q?_o$\/ϒ,>@btXO'O hOzOOOOO&oU- [U bG)"EWX{ß$5iQ [ _+XGb 6_~jL z? Gbv  ߩD(M߃˿ݿ*4F5_____zGz¦ߡb%#5GYk}6X,0U2Ÿ:IQ+fIA$xI?f/x//=V///EG42\?n????-,/"/Y1mT/OOO/OO __/__\;9= RRX?^_p\??????OO%Oݰ__" A$4o,o>oPobotoooooooo>=BRBRt%7CsK6R]3{ ?ൈ(E"4߷‹7!0gf?dv߈ z|!>汃AS;ݳ(ݯc44&8 -? Zl4 ϰPb2퓵}Ϗϡϳ;UFDfP h,TPYYBĉUIj@A??P?? |U293Y'2YtO @{D ȍ2H ?/*&?%T"B~  0 {Q`#Va_nisPi ]g\po"t"er !c iv ,Po iKz n!g@da?'Tx{T!T!x/=3?!2 `Y3Ea1m; |;??|oA^E p$!!2֋%)`Ҭ/ ( `D!\B bOtNe(?O Y!S8 *σ=?> ",FXϯXqXUXW WwwXU`_qtDrag onut heqp adniialv%isipNtBc&es}c3v ofN0v1du;Ja}s.b)\(Goz@@333пUH P D  # BT|liOk6hjJ U@?pO>Iu` W?39CMMuAW?bA!A)  LV  #U0zGz? L #0#J$?a&$?񠎲'D$=k!}$rK" #xJ%I #?[149>?$C"16r](d2:6s7i7MU2h2}XW- #;%  C~#;%J+2 #=AA G1`Vis_S\l.chm! 4587@@`?Copyrd@gv@t (t@)@2U0@3@Md@c@of@ofBArT@Aa@i@nr@ @An@l@GsBef@e@vPdr@@7G[ \C0Ud% %|I V1497htS8UBRtTUd:r??%Rprc!b~d ngwcbAfwcbQ7Oo22q>K_]_oxESSbTrBi+MX'"f'@<4!|$2 vns9'ɊTu顃EAXBEEIMP&j%[ڗ!,`CoUw@&en@eFz(@/`PBhd@bd@A*`At@Esr@v0@ bq"gi/%+A! !QQ;")C9׆,S3P QTtRTssS);%:/Pb2`7hߒ8ߒKx!PX? Mӥb Azq2Qbӥ"-C>&@,RlJAUE9 % A9 ".Bq\y14LsXGs`rǣ 2!d1d1+8(xY|TS@Ŀ]Nݽ9- BQJ\n14qvܲu?Ms<'ϐU@/d?vψ@ҦɁ5B :Q˝# P"п(:6UEEh 3g24 S՞%3 96ð(8'XoCoscH}c#Vj2Vr@qA  qjU1X0H'+ʅ AfFCDcFTO#[ j@h Ax DtlTnUpqUrsUtxUz|U~t.8ER*_to t|!tT"#񕷠$)'UU&'()t4!@& fK&C-gWB57 AU6U)*+U,-./01t4 !%@& D~&.C-,kh 7"AU'()2t4!@& l&C-Z' AU()45t4!@& T7LP'C-Za7 AU)678qt4!@& l'C-dZ7 AU)79qt4!@& >L (C-Z7 AU)78:;qt4!@& Dlj(C-Z7 AU()<t4!@& 'Lͯ(C-DZ7 A)>t4!E@& Z*) A-dot)47A)@%t4K!@& Zq) A-Z {7U()ABt4!@& |6L)C-Z7 A)D%t4K!@& TZ* A-Z $7U)/lt4!%@& 'Lf*C-@Sw7"AU)/0not4!@& Dl*C-Z7 A)pt4!E@& Z+ A-@)#7AU'()qt4!@& m`+C-WZq7 AU'()rt4!%@& m+C-܄@7"A)st4!E@& ԰Z, A-@)7AU)tuvwt4!@& lU,C-dZl7 AU)/0xt4!@& Dl,C-Z7 AU)/U01z{t4!@& %m -C-WZ27 AU)/0|t4!@& l}-C-Z7 AUj()U/01~UUUUt4!%@& S-XC-̴@5. AUj()U/01UUUUt4!%@& Su.XC-@S7"A)t4!@& m /A-/Z7 ;U'()/t4!@& Dle/C-Z|7 AU'(U)/0t4!%@& T(m /C-쿧@7"AU'()/t4!@& l#0C-$fd:7 AU)/t4!@& l0C-Z7 AU'()/t4!@& $l0C-įZ7 AU'()/t4!@& dlI1C-Z`7 AU()/t4!%@& E 1C-@7"AU'()t4!@& ąE 2C-hB7 AU'()t4!@& E d2C-d^d{7 AU'()t4!@& DE ǯ2C-ԯMd7 AU()Ut4!%@& %m *3C-ܧ@D7"A)%t4K!@& Nd3U A-37p(@O?&AR@duY&?R@H\ 'CR@TH\k'BR@H\'BR@, ((BR@ ̈ (BR@ES(BR@JS6);R@r)8R@܉r)BR@R@\r.=R@r$/AR@,r/BR@r/?R@rD0BR@r0BR@r1BR@rj1BR@Ԯr1?R@tr"2BR@ܳr2BR@Lr2BR@\rF3?R@r37RH<(H<(H<(H<(H<(H<(H<(H<(H<(H<(H<(H<(H<(H<(H<(H<(H<(H<(H<(H<(H<(H<(H<(H<(H<(H<(H<(H<(H<(H<(H<(H<(H<(H<(H<(H<(H<(p(EO6 REd^6 RE4I\6 REG\6 RElI\6 RE1 7 REFS7 REKS7 REBS(7 REDr57 REtrB7 RErO7 REr\7 REri7 RE$rv7 REDr7 REr7 REr7 RE RY*>Y:O@f + SY X"H4H ?,/>&?TL(h"Bf  0 H9`SPal ow\b"ck\re t ng e!gda ?T'TxHMr"T@!2uS`bS ' ,]1$i?{8T?? ^E uBb!!2[%`3 ep Q `!lB rO$!OO YG6u D+,4=OVp`fxJ N eDrag onut he]pe,d s l cnvnUihOnpVt(Ip)cLo*i1ttO*fa!lRAa fc .mb?P贁N??j;; UG D BTMv+h^U <^$P||xUxU@@@A??Q x ^7, ,x]]]1^  uv` -77OY"c"m"w.&V'1u]7uqU0O贁Nk?H#+#"V""t"3@""137#";?L@"'HO"#  ! 4#9P?t bP0s4*!,2u7=%#=ABDX;1`Vi_s_SPl0.chm!#45860`?Co_pyrd@gv@_t (t@)@]2@03@Md@uc@of@ofBRAr@Aa@i@Unr@ @An@l@GsBef@e@v"Pdr@@eR4;)AU<%@_9xH/k1b?SR(f+;_L;u'u`Qps-8Rsd@`q1-,V_IC IG6%@%SSoG7 Tx"(TIT0Ev__=A@azrp q0zq1tr8z~Y jq;`RPl@cBe@V@ndBhd@n@ 0o" tA7| 3'L(dX+_^#Iď_Q++Ej|USr3r+UR2rQt3V" t"Z'! Z%0EtгɿϏ3`Ӓ.(R晓1/QA[A3! E#"p;p'~` 8^g opByEsE1"+'@2AA2aa.BAQAQ|R(s8mr]0 FQHmup`z @r*p0zq0k𓆶 Xȿ]t3"#^I5ӓT 3s?mrKG\5k9̫vzr@a"ճ2ܾӑ4 C`Y.EkŬz G^0|U2p&@{moo}QQ""(p=Av|0x  ]j2`DPp@t`1 >Z@0%;Dn3k4k5kAn7k8k9kjl @\Ch@ %p(]%uuV#W}?&&ex_VSb7%Gbi{0I5V_RSb_75@3EW hzn@V!U8s%u)v@2AA2[A[A.B(`TAIdEO^8_@ YSPA&S.@2b eqI5%!]aN`_Au@ox@Cc@Sv@a PowA!brv26~q1V1FQ *`05/&/8&hb`&@u@Aa/s/峋/洤/*.EP///8&3\CA%&rr 2uAex@q#?5?L?Cd?( ed]$.]]'ְ )PaGuDKcŞDG7 Qa LaUHLuD >h4JT3 _aM MUA?Q @f+M >uA`]  Mu(>_b@Y9`+t% L)xtK>]~bJS>U0O贁Nk?9 4|`3Z(t4T#Nw >`0:%Bt8&Iy)P?MZh`4 *lp'c$O'U!4 \#!`?CopyrigXt(c)20X03MD0c.B0os<0fJ2;1r>0w1aw i<0n. Al0 B8s2ej0eJB0v0d0;$ 20LFWx~W@%4  )0Kc!Ull731#Ur $ N >$BJ3  " FN)OJIUE~'Z?I pD$"=CN"y"\B$FH  2 SR R V%h4JT3 _aM MUA?Q @M>uA`#-+  u>b@rY`+t tK>~bHJS>U0O贁Nk?9 |5"tZ(t#N >`0:%Bt9$ͩIy)P?MZ` ,vlp'IcO'rU!4 \#!`?CopyrigXt(c)20X03MD0cB0os<0fJ2;1r>0w1aw i<0n. Al0 B8s2ej0eB0v0d0;$2p0LFxu~@%4 0Kc!Ull731|UN"r ` "0% J#  & "FNOKE QE^I[LQJVM$"\CN"dW'$F A (1 S%VD\AKS ZEpBC"=B)B BRV]4_^|oo9o Lk`HD: U=h4>T3 []9 QB  AUAU?Q6 @B >u` ub@rKR+t jt=upbJ#5 LW"#Iy?4(&P?ALRBt!y$5 ``?CopyrigTtx(wc)x20 3xM c o%s f"!r !ua i n.x_ Al (Us2e e v0d 2=0@M=jpSW7480O贁Nk(#LH6W'l>0>Uhhu7P!JT661R$<F  BFMa~MMEEOD&OGA.5[uF4]MTYhw564nOM#rA KS1%gAT_FHu+] ϭ _G YY;#P=k? \FP]a@>DUT7z?GyZYɁP]YBwP_Y2Jyd`YMUFDfP h(TPYYBUA&@!@??6I?P n FhF'g`@ЫؽsU/%BH?/н?t"Ѝ~  0`Dcorp"ate, i l"b ock"ext !o ,f"m,)c p"on l b l92eg nd$!e^| (( FG&u ( .7;?;;Okwwwpp|ww_wp04Drag thuesapWonodwipeS. ai%l?n! a8I DsNcGB VNr5s)z7bfvP?@GznM?@xUGDF P# h8T YY#BzU@@@@A@@f_vP??P֍u`h?u# v& 6BFb@[YJ[ [ C U C C^ )Y))))!)) +2$B>#^$b$$$$$$$$&$ܒ-!r23U!| ]A=43?F !E#30zGzC5𣔕Է3{AD:`?Copy_rigPtg(c)g2U0@3gM@c@os@fBArԤ@Aa@i@n}.g Al@U HsBe@e@vPd@-`V@s_SE@cPm!9@49@9(@P3K<L2"SeTP2C G%F`hBdc\5UeYkg\# HQa5]dhk5]dahk3]dhklE]dhk]dhkU]dhkE(]d!hgdglEjY5I3@mo?ff2t,2t_bq"3*Bt?r(3 @13@"2V!&@ a d[JTX8߃@IiEMJQ1#SRRi&z*P @o`f@AtPx@Pf2vx2"V` SBdA8Q.@B~Zyb2Ag:hU΍+߃#'(##2)B 89߃d?tYQtR|vH#N5_qKr+'d? |ʥb #eq!b!ʥQ{3 3R2&c&@nBXq `t顐A( MTCHD:  ;h ,>T@  AB^AUA@@fvP?Q6 u`b@6u`b[t t  %?(!Am$>n .U DJ8U0zGz?<lLt`*)"#w!|$5 t`?CopyrigTtI(c)I20 3IM c oKs f"!r !a i n.I l (s"e e v 0d^ `1"B@0L~M`S ; =:4&E4#0#9P?Ml:>$UhJ119  V!!(BJ c6qBJ?"e(9WLAAXnODr"ŌBTWDEdh0 DGhECG5EfpRJ#vCEh/^EZWJ@FXOAL@_R[VK_COI(EVO;oHzO_odAbP59 K6M~3þ?6+6 gC? tQ(-D_T!?kq@V r#Bs  prrrX1rwsHD:  ;h ,>T  9 BUbJ3U0zGz?<@LVM =#G P$#Zd)P?MB%#!$5 t`?CopyrigTtI(c])I20 3IuM c os If"!r 1a i n.I WAl!0 (s%2Ue e v70d0/ `G1M!m0L:`S ;l>8>UhJ11 /!!+J:# 9)![Qt6>(60J9 KGYOkJ35LAb4ɇSˉ IsrQ1f!Rdh OCGOo?hECnG90D-Q? @SQ_cR U/!Z0LF2XJMOPh_z[/OAOSOLd0%b9 r<]~3þґ?6o6 nf S?ʐ tQ(-DT!?6q;$ BB B os/! B skrrpHD: # ;ih(>TA9 3}oAUAU?@fvP?A?IP-DT!>2u `u bu  @A' Gh ]u` ?qu#l>b ( Jj9>t bbt``#x!_Qjt ["a/s//@C "&$72?05\7(=f?005BU145 j`?CopyrigTt (c) 2003 M0c0oKs0f21r0Aa0i0n. Al3@ 8s7Be @e0vI@d+@!`YA!1!@LM3&S l>#1Uh#3 A 1TI|BJ*3xAP'N0"B-U=_?\SHD:  3Aih(>T9 BoAUAU@@fvP?A?IP-DT!>2u `u bu  @Ae' QG ]uv` ?ul V> bS Q Jj(9>t bt``#x!_(jt Đ["a/s//@! "&$B72?05\7(=f?004U145 j`?CopyrigTt (c) 2003 M0c0oKs0f21r0Aa0i0n. Al3@ 8s7Be @e0vI@d+@!`YAB!1!@LM3&S l>1Uh3 1TI|BJ*3xAP'N0"8-U=_?\S8d HD # #=hj4>T!]] R#p#UA@@d> Y?@moۿfvP??Q6 u` ?@u *uL^#bdp (_-&<N. Wt  St" > jObEJ7U5 7g<#!$5 `?CopyrigTt(wc)20 3M c o%s f"!r !ua i n._ Al 0 (Us2e e v#0d0 `D31Y0L:SW.B\<#2q0??64? *l2配#<#0z_Gz4@J]7=S4Н-#4sHP?R3l>0>UhhOE=!?!J3A3F3F(/R!AQ~(U%_#?C_U[k^__W[UE^_7__[U@_}_=o_~(Q"b!m a0UyN m#0 #leE9 ^<ŔX<'E#' uF!DA; v/!uHD # #=ih4>TE>4#UA@@ )?AU?@*_I?Qu` ?@iu :t~ buL##-A3X×? Ibd.g< #t"?_b8 >feڙbS"&\!*J7UMu 7J@'s"="#*#?&-P?M%#-124+`?CopyrigTt(c])20p03uM\0cZ0osT0Ifb2S1rV01ab0iT0n. WAl0 Z8s2Ue0eZ0v0d0w`14!0L:l !<SgH .\#X/WO*? I*7U0z/Gz`D@7l>0>UhhE=?EK1!EpJAGxR!Q(]Un_#?_[5^__2gU7]^o_@oU?E ]__o_(!e \07he9fM&je7;<'( !@fȐO?"b\"z3E,#b 9S~!T{}jfx{'`O!XAɆ 94! 4iJLT P3 AUA@AU?@f_vP?IQ6 t` b@Mt t`*.FIR""JBL:L6SW!T$5 ` `?CopyrigTt (c])Z 20f 3Z uMR cP osJ IfX"I!rL !aX ]iJ n.Z Ul P(s"ex eP v d  ?4>Uh!!  BA!t rJ: uu  Mubu0]3 A1_0x2g3Kr+BT5dh_0LP 4x9t1h537!991M5 IOfOx?35G?`O4b2Cm4?3dA!eEE9 =~3þ?m6_m6p51 0Q(-DT!?b.a@ak l kRAWHD:  ;h$>T P3 A(AUA@@AVU?@fvP?Q6 t` b@tT5t` E- >AuV\A)uAJL:YS"TRB!G$5 ` `?CopyrigTt (c) 20 3 M| cz oKst f"s!rv !a0it n. l z(s"e ez v d h l>4 >Uh11  -k!t .J:l Uq>923238539r4#5"AA3=r:5ɌTr4AuA?Adh09159Eh9E9C7 1gI8M?3C5q?O?4 ?3dA1eX[E9 TtE@~3þ?6_6pC5A Q(-DT!?ba@Ma\ bR [(bV$g_H4+E O8oh7H: F vYQ#MR? ODSxa\@oDYToC?GGotxYXNyY[5{zH_}{aL|Yd}Y6gYj@\jm=UFDfP h(TPYYBU?!@&?I?3P hZgF$Ffef`}^f}~񐤥@,sU!&1/BH m/Ы?އJ" G 0a`+borde ,0dg0,m rN 0in0!u0Ud2y0f a01t0cPn0c l!eA^| H( FG6&S Ev'9K]gzd{{ < Drag onut heqp ad -siz "breR.hnl src6. cYt bP$UUU:@@? t@ p= @?f4j3;UGD # h0Td(YY U{@f@@}$@@VU??PART!?n^u{` ?u Y.: BZ;zs$k%[C^Vz    "d! "#`* F*:6sZ4ZSz4zS19 !9!9*!9:!9J!98j!9z!9!OP!9!_P!90VS9PVS!9pVSd9VS!9VS 19VS1IVS<*1I fS:19J19ToPj19fS4S4 hZ65iJ1iJ!ij!iiz!i1iz1i!i1t}pEz4vsvHyv4vsvSJ1yHy0HyPHypHy41y4z1yІ4ay:1xy=*1tTbr5tS(b3/ 1&ZbC 3 D9:0!zK9ӓ c`?CopyrigPtp(c)p2\03pM8c6os0f>/r2ka>i0n.p Al 6se^e6vd~w-`V8s_SE~cPm!#w49J78ZUX*!  v|&8~@OSCkO2`׳` UEn>DZp,׳*! LyܢBd5ɕRez1^`u:!YZz1 !!*! j!z!!!!!!d! 11a:1J1j1B !YHʕ*Z5*j15*Ԋ!5ۘ*Ժ15E* !5|*!5Z&*!5ە*:!5ۀu*J!5 !&5!&j!5(z!5:!&z50u*Ԛ!5 u*Ԫ!5@u*Ժ!5ۊ!&5pu*!5۪!&d5ۺ!&!5& 15!&15h*a5!&*15 1&:151&J15e*5e*z15u*Ԋ15)՚ 5j1&ت5gSyTɃ+BT33D()<´ǘ/]A? єRr7a3 [70|QctRcn03ggww w0w@wPw`wpwwwwwwwww 0@P`pЇ<ŰA&'&@DBCT|e?O ?k6HD: "# ;ih(>T9 zDAU@@@c?UUU?@TToUU?$@Q(-DT!>u` ?A@iut^  rM.t bE#O0l[>{b * J#U0zGz?<CLB#D!I$5 `?CopyrigTtp(c)p20 3pMs cq osk fy"j!rm !ay ik n.p Al q(s"e eq v d `!  0'';YOS *l>0>Uhh b! 2AJ! 9 0214Y2  kFMBE ???3.E>OWOiOG.EET  A_AU@wy?@gVUU?@ETUU?IP-DT!>2u `u bu  A'E! EKau` ?Mu[>{b$*$J 4 ?]"_(>t  :aox?O"tZ"f%U/g$o'eS6>$'!"/%7-? B#U0zGWz?<@ LSX3Ҙ145 n`?Copy_rigTtw (c)w 2U003w M0c0os0f21r01a0i0n}.w Al@U 8sBe0e0uv+@d @`;A%Aa@{7;O"&KS!"l!Uh5= 1I^BJ*X3m6m6R["BU_!HD: "# ;ih(>T9 nU@MbX?@VU?@W@ZQ u`b_Au`bt  5?t b$N@5C>[   E ,!FAh=m4&8UMj;)=( &"&J#U0zGz?<LB.3n1s45 v`?CopyrigTt,(c),2003,M0c.0os0f21r01a0i0n., Al0 8s2e0e0v@d0N`A7@Q7; *![$ST.l>0>UhhAA 1JBJA9!- RXl  &k>VMB0G_W? _SXUh^__WXUh[___E2O;"rA#cCUHD "# hz4TAYY ^C)U@MbX?@VU?@?&?@0??@Qmu`bAu`b uLҔ- t ?6 t` EF B[  D 6 'd-#0zGz?TBu!z$u`?Copy_rigPtN(c)N2U0 3NM c os f"!rԞ !adi n}.N Al U (s"e e v0d `1 >0&t  S7@醅=*|+?Iy#C$Z8P?Y$(2Ix5???6C$+?O71*3`{%D?p (2qo@?FByUOgOFBOOpKEO(OuA^TI'PLE haC<TWK'46!40*N TVC6FBOOpBTHD: "# ;ih(>T9 ~AU@MbX?@VU?@ַQ u`bAutbt)t(=  й?l >kLl#H#F&"J0zGz?<LB>#~!$5 f`?CopyrigTts(wc)s20 3sM c o%s f"!r !uaUi n.s_ Al (Us"e e v0d `D!1G00a';$ Se.l*>0>Uhh11 !pZ2J8+1tB'Hi  kNFMBGO$G?0O,ChExNOOGhExKO$O_hE52O;rA#S.3HD: "# ;ih(>T9 RAU@x&1?@VU?@ַQ u`bAutbt)t(=  ? f>kQkJ#U0zGz?<LJB#R!W$5 l`?CopyrigTty(c)y20 3yM c osy f"x!r{ !aUiy n.y Al (s"e e v d `D!005';$ Skl*>0>Uhhh1h1 p!p.2J8!z28)  "FMB7?7?OCT9 "AU@MbX?@|?@VUݷQ u`bAutbt)t(= l >~"QJ#U0zGz?<LB"!'$5 f`?CopyrwigTt `wc)Y 20e 3Y MQ cO o%sI fW"H!rK !uaUiI n.Y _ Al O(Us"ew eO v d `D! '; $ MSl>0>Uhh8181 @!8"J! 28~i  k6MB7?7??3 EN5OGOG EKO?O Ew52?;KrA BS#HD: "# ;ih(>T9 2AU@x&1?@|?@VUݷQ u`bAutbt)t(E=  >k-J#U0z?Gz?<ZLBI2!7$5 l`?CopyrigTwt `c)i W20u 3i Ma ]c_ osY fg"RX!r[ !aUiY n.i AUl _(s"e e_ v d K `! ';$ Sl>0>UhhH1H1 P!2J! "28 % FMB07?7??3E,NEOWOGE,KO?OE52?;rA  RS#UHD "# hz4T!YY_ /U@MbX?@8TUU?@d?@1 0 ?@Qmu`bkAu`b uL- Vt 7 @ tJ:F  &? B֍"  6( '-#0zGz#?B{!$u`?CopyrigPtN(wc)N20 3NM c o%s f"!r !uadi n.N_ Al (Us"e e v0d `D1 D00&t CS7@2Ix5??7q08I$?O=1*!3`{4?p (22?A2yOO=*|+Iy#I$HPF?_$$^D TENORIG@N L haX)I<NW'6!D0> VI621OCOUJUHD "# hz4T!YY_ /U@MbX?@TUU?@d??@1 0 ?@Qmu`bkAu`b uL- Vt 7 @ tJ:F  M.? BV#  6( '-#0zGz#?B{!$u`?CopyrigPtN(wc)N20 3NM c o%s f"!r !uadi n.N_ Al (Us"e e v0d `D1 D00&t CS7@2Ix5??7q08I$?O=1*!3`{4?p (22?A2yOO=*|+Iy#I$HP?_$HAaL TES@ R@VI@ION ha)I<W'6!D0> VI621OCOUJUHD "# hz4T!YY_ /U@x&1?@8TUU?@?&oJ?@1 0 ?@Qmu`bkAu`b uL- Vt @ t` :F  [&? BY D 6 'd-#0zGz?TB{!$u`?Copy_rigPtN(c)N2U0 3NM c os f"!rԤ !adi n}.N Al U (s"e e uv0d j'`1 D0&t S7@2Ix5??7q08I$?O=1*!3`{4?p (22?2yOO=*|+Iy#I$HP?_$^S ALE ha)I<G'6!D0> FI621OCOUJUHD "# hz4TAYY ^C/U@x&1?@TUU?@?&O?@1 0 ?@Qmu`bkAu`b uL- Vt @ t` :F  [M.? B[ D 6 'd-#0zGz?TB{!$u`?Copy_rigPtN(c)N2U0 3NM c os f"!rԤ !adi n}.N Al U (s"e e uv0d j'`1 D0&t S7@=*|+Iy#I$8P?_$2Ixߺ5??7aq@HI$?O=1*!3`{+D?p (2B?LBy[OmOdaJOuBNN@. ha)I<G'6!400N FI6LBOOJHD: "# ;ih(>T9 2U@tV @@VU?@W@@88Q u`bAun`btit^ bQt($-9~> !h3$ &,&-&-&L0#"D&J#U0zGz?<VLB#21745 l`?CopyrigTt `c)i02U0u03i0Ma0c_0osY0fg2X1r[01aQiY0n}.i0 Al0U _8s2e0e_0v0d0 `107; h!,$ SL.l>0>UhhHAHA P1BJ19@!BHl  &kVMB0GOG?OCU,^E_W_WU,[_O_E2XO;"rA 0 "Rc3UHD "# hz4TAYY ^C)U@tV @@VU?@dG?@0??@Qmu`bAu`b uL- t`i t Bnt t[K ?  6( '-lt#0zGz#?{Bu!z$V`?CopyrigPt(wc)20 3M c o%s f"!r !uaEi n._ Al (Us"e e v0d `D1 >00&t CS7=*|+Iy#C$8P?Y$(2Ix5?ì??6C$?J71*3A\%D?p (2qo@?FBZUOgOFBOOpKOOuAhaREVIS6PON8P `"TdC<\W'46!40*N \VC6FBOOpBTHD: "# ;ih(>T9 VAU@^I @@?@@88nQ u` ?A@u`bt t b  #t`*]bJ ?l>.ڑ(u  JRU0zGz?<LB#V![$5 v`?CopyrigTt(c)20 3M c. os} f"|!r !aWi} n. Al (s"e e v d % `! B09';,* S ul>0>Uhhl1l1 t!22J1Q 28  k &FMB7 ??OC@EPNiO{OG@EPK@ O?O@E52?,;rA vS3HD: "# ;ih(>T9 8AU@^I @@88?]@W@@Q u` ?A@u`b-t t b  #t`*]b ? seUlA"  JRU0zGz?<LJB8!=$5 v`?CopyrigTt `c)o 20{ 3o Mg ce os_ fm"^!ra !aWi_ n.o Al e(s"e ee v d^ `!" 0';* S ul> 0>UhhN1N1 V!2J! E28  kFMB7???3"E2NKO]OG"E2K O?O"E52?;rRA XS#HD: "# ;ih(>T9 8AU@^I @@qq?@W@@88mQ u` ?A@uޔ`bt t b  #t`*]_b ]? nl>-  JRU0zGz?<LB8!=$5 v`?CopyrigTt `c)o 20{ 3o Mg c.e os_ fm"^!ra !aWi_ n.o Al e(s"e ee v d % `! B0';,* S ul>0>UhhN1N1 V!2J! 282  k FMB7 ???3"E2NKO]OG"E2K@ O?O"E52?,;rA XS#HD: "# ;ih(>T9 8AU@^I @@VU?@W@@88úQ mu` ?A@u`b[t t bW  #t`*]b+ ? nl>-  JRU0zGz?<LB8!=$5 v`?CopyrigTt(c)20{ 3Mg c.e os_ fm"^!ra !aWi_ n. Al e(s"e ee v d % `! B0';,* S ul>0>UhhN1N1 V!2J!Q 28  k FMB7 ???3"E2NKO]OG"E2K@ O?O"E52?,;rA XS#HD: "# ;ih(>T9 8AU@^I @@Tqq?@W@@88mQ u` ?A@uޔ`bt t b  #t`*]_b ]? 窆flhA-  JRU0zGz?<LB8!=$5 v`?CopyrigTt `c)o 20{ 3o Mg c.e os_ fm"^!ra !aWi_ n.o Al e(s"e ee v d % `! B0';,* S ul>0>UhhN1N1 V!2J!Q 28\2  kFMB7???3"E2NKO]OG"E2K  O?O"E52?;rA XS#HD: "# ;ih(>T9 8AU@^I @@o8?@WW@@Q u` ?A@{u`bKt t b j #t`|*]b u? Ul9AH  JRU0zGz?<LB8!=$5 v`?CopyrigTt `c)o 20{ 3o Mg ce os_ fm"^!ra !aWi_ n.o Al e(s"e ee v d `! 0';* S ul>0>UhhN1N1 V!2J!G 289  &kFMB07???3"E2NKO]OG"E2K O?O"E52?;rA  XS#HD: "# ;ih(>T9 8AU@^I @@VU?@W@@88úQ mu` ?A@u`b[t t bW  #t`*]b+ ?l>H  JRU0zGz?<LB8!=$5 v`?CopyrigTt(c)20{ 3Mg ce os_ fm"^!ra !aWi_ n. Al e(s"e ee v d `! 0';f* S Qul>0>UhhN1N1 V!2J! 282  &kFMB07???3"E2NKO]OG"E2K O?O"E52?;rA  XS#HD: "# ;ih(>T9 yAU@rcBx6 @@rq?@ȼq?IP-DT!>2u `u bu  A', *G ]u` n?ȕlAZb  J6 nq?VU\!_?$tK`tp!t".Mjt ~&be"1k/})&7?"'B"/5@27-e!Uh`= 1IRBJe*3@FN.'"BU_ UHD "# hz4TYYBN^MU@tV @@?@ZB?@8o8?Qmu`bCAMuWuL- t t`LF ? 8rh[j  6 " '-L#2Ix5??2qi f/? #??y 3Vq$?p(2j"?"#1 4+k`?CopyrigPtx(c)x20H03xM40c.20os,0f:2+1r.0g1aZi,0n.x l0 28s2eZ0e20vz0dz0 `1'#D0B##0zG#z$醅=#*|+?Iy3$[HP?*D! %aNOz0 40c)=r'G'_&Z!xD0. FD6"//*j(da_k__THD: "# ;ih(>T9 _AU@(RUmb{ @@rq?@ȼq?IP-DT!>2u `u bu  A', *G ]u` n?u܏l>ڻbS Q J" q?VUB!?t`t_!t k&b_K"Q/#k&?C$'"/%7-? BUI^1c45 j`?CopyrigT}t (c) W2003 M0]c0os0f2R1r01aP i0n. AUl0 8s2e0e0v0d0I`A!'@L:K"YZ" S "l>!Uh= |1I$BJ*X3@FN "BEO UHD "# hz4TYYBN^MU@rcBx6 @@?@uSQ'?@8o8?Qmu`bCAMuWuL- t ҍtht`OF ? .[U֝"  6 " '-@e#2Ix5??2qi f/? #?? -3V{$?p(2j"/?"%#1 4+u`?CopyrigPt(c])20H03uM40c20os,0If:2+1r.0g1ac]i,0n. Ul0 28s2eZ0e20v0dz0K `1!0 &&[S7UB##0zGz$I=#*|+Iy3$uHP?@DD! %iaD TE 40ha)<'G'_&!D0. F6"//*j(da_k__ dUHD "# hz4TYYBN^9U@(RUmb{ @@?@dk?@8o8?Qmu`bCAMuWuL- t )Zt`tJhd iF ? e~-  񁄑6 '-重#2Ix5??K'q^ [(?? !3V$?p(2_"?"//R#$1)4+`?Copy_rigPt(c)2U0g03MS0cQ0osK0fY2J1rM01aZiK0nU. l0 Q8Us2ey0eQ0v0d0 `D1!0&dS7~B##0zGzu$=#*|+Iy13u$H-P?cD|aDES0RI@T@ON S0ha, )<' W'K&!DE0. V6"//:j8da_k_$o6dHD: "# ;ih(>T9 LAU@tV @@|?@VU? Q u`bAiutbt  ?7t`($a=lFAZ#-J0zGz?<LB #L!Q$5 v`?CopyrigTtE(c)E20 3EM{ c.y oss f"r!ru !a[is n.E Al y(s"e ey v d % `!0/';Y$ S7Tl>0>Uhhb1b1 j!(2J!F28F  k FMB7 ?7??36EFN_OqOG6EFK@O?O6E52?,;rA lS#HD: "# ;ih(>T9 \AU@^I @@|?@VU? Q u`bAiutbt  ?%t`$a=!>U#ڞl"QJ#U0zGz?<LB#\!a$5 |`?CopyrigTtE(wc)E20 3EM c o%s f"!r !ua[i n.E_ Al (Us"e e v d `D!%00?';$ S7l*>0>Uhhr1r1 z!p82J8 1F2H4  k,FMB7?G?O CFEVNoOOGFEVKOOOFE52?;rA 0|S 3UHD "# hz4TAYY ^C%U@^I @@VU?@?& ?@1 ?0 ?@Qmu`bAu`b uLҔ- t @6 t`! )FjB#k  6 '-L#0zGz?JBq!v$u`?CopyrigPtN(c)N20 3NM c os f"!r !adi n.N Al (s"e e v0d^ `1" :0&t !S7@=*|+IyG~#?$8PK?U$2Ix5??7q08V?$?O31Z*!3` !D?p (}22?BByMO_OqA^DR WN haX?<G'6j10&N F?6BB{OOJUHD "# hz4T!YY_ %U@tV @@VU?@?&?@1 ?0 ?@Qmu`bAu`b uLҐ- t @ t`O FjB#H  6J '-0zGz?HB%q!v$u`?CopyrigPtN(c])N20 3NuM c os If"!r !adi n.N WAl (s"Ue e v0d / `1 :0̩&t S7@2Ix5?;?7q08?$?O31*!3p` 4?p (22?@2y? OA=*|+Iy~#?$HP?U$daCE K@D ha?<G'6!D0"> F?62'O9OKJHD: "# =h ,>TB  >_AU@!rhm@@-4UUU?@ETUU?IP-DT!>2u `u bu  A'E! EKau` ?MuB[$>{b$*$JF 9A_>.tM`GtZ!^"  ~jtx?ntܫm"Uw?O"U/g/y&'F(qk7>'B"/5@,7-6?0#U0z_Gz?<@ LB3145 n`?CopyrigTt (c)020@30M0c0os0f21r0"AaT i0nN 0Al=@ 8sABe@e*0vS@dN"`cA%@7;}"&%S!"l>UhE=w51IBJ*8366R["t87UG_) t8bHD: "# =h ,>TB  >_AU@zG#@@ETUwU??IP-DT!>2u `u bu  -A'! Kau` ?uB%>bT$$J29$t U& ~jtx?/ntc"bM.?O"U/g.y't"#'"/%7-"? #U0z?<D&LBl3145 n`?CopyrigTt (c) 2003 M0c.0os0f21r0Aa0i0n. Al)@ 8s-Be@e0v?@d!@$`OA%%!u@7;s"&S!"l>O!UhE=c51IrBJ*l3D&D'!R!`8#UH3&4_ `8b_HD'7{ };&dQ@C?)&Fr\;q~#[r_? TSspa,@o+4fToFGlos\oPt\Xzfdu\߾||v\Q»\w\ػtx\Ty\_e4z\ĉJ{\P1^ }\6ܻ$~\<\ߖ^^[޻l^9zL^r,^%uK^^{q^o^Ż^ߦs^Z<^ď^޽i5'^Gp^~^}D)^B^!UFDfP h$T PYYBUAzG?Aףp= ?Aj?| P? V[ V1]7K ^U\K]ȈH? ?JB G 0`Bdialogsw,8),b? uxE X,W9 ]nG owC"UC WerE Ig tw"f; cw r!IE s* a uC"b; z!8!v9 dw" e^% oGu <'̂wGwL^pKxDrag onut heqp ad iv+d* rl+nuSausbr.bp= ףp?q`Wg?qxGz~/$ UGDF # h z<T$ Vx ~U@{Gz?@ ףp= ?A` d?Aq=?A?P"u `u`uY`u`@Y[ b^7u bu#` ?-C "br78 YVR'd#`2"&IL"N#AQ?2'`")?ed''btR tQ4"b)0?"ܜ$@nE@ @(6*P_p S`o@X_l7IQ2('YdcN#A.y1c0@$4ro#+6C.4B2"#OHhO@e"HBoR%E#vqS3X'dudQ(##N#QqQyWZ%3`?CopyrigPtP(c)P20`3PM`c.`osPf bQr`:aa `iPn.P AlU` hsYbe-`eJ`vk`dM`oP1'w`V`s_1`1M`cPm!#54`5n""N$T5UePRa E aa]S@H#qU/t :wgdda]gW*+'T# `"r)t<"eXus$?qQ5g%?667BKC RrqBu4su6s2<@2Cu<"s&d&@r`"qE!^y\%}1!ji s06oU]Ser2P@R%[bpa`q|yy|BTۅ"Ut&aQY3 ?{v1?Tk[QsC`Rk`lPcCbePST `DauebBC`rPD`vbHcoPe"&  e'2"B<"iߏXN'ׁ'2qKV!40. vDH&^ddob HD: )# #h(>T4 W9 JUAAL= ףp?A{Gz?A(\?RQw?P t` bt# ?{r7@&b(b07>7u\bu ?H>:ǵ;Ų<? ?bbbz20!b )04#0zI@iJ!! `?CopyrigTt `c) 20 3 M c oKs f"!r !a i n. Al0 (s2e e vZ&0d0gn&heT?H' TA))ŴF3!$JbapH )lJb0>UhQ=bb `!#3!K` 9rBx2  6F@G(h!|OOEMNO _`WEEJ_On_E=E2lO;3"rRA 703"c83iAe =JXRDq'2q`)!A% p:H `d j4,o>o_AodFv!3Yrgf`fjf3"9*HD: )# #h(>T4 W9 JzAUAAL= ףp?A{Gz?A(\ARQ?P t` bu~b@7At# ?r7&4Nbk$$ku5 ?nI>#'U0z@I+[;?#( ?ARD"Jy!y!/`?CopyrigTt `c) 20 3 M c os f"!r !a i n. Al (s"e e v 0d ghe:?BTAOOFh3y!PD(#p TOlJ0>Uh7=11 `!#D! `94D  6FbOEOEMNOOFWEE0_tOT_E#E2RO;D#rRA 0D"S3 iAb =JX8Dq'2qj`)&!9$1% p HPd j4o$oEAUd/,v!3?rgf`#fqjfD"Y*_Hu |&G_IZUfF`wn#tQE?P=[a@oD+$|To6?G `o9P` CL`N)UFDfP h$T PYYBUAZ(\@A? ?43P? .vV V2u<]-7_ ^iEY_qȅ2H? ?; JB G 0`:dialogsw,L),bS uxY X,WM ]n[ owW"UW WerY I{ t"fO c !IY s a uW"bO r$ !e^ % Gu <'̄NjwEW]ȋ]}vDrag onut heqp ad 3- sau1 KbrbUtmf#iUefc fr_.b\(\p= ףp??Q??Gz UG D" # Q h <T$PYU ^U@VU?@?@\(\@Aq= ףp?APr7bV++5+YY`"'+1;OYYu`uY`bu`u J- #o@u{` ?7wu#`be"(($!d 靅с#@贁N[Y%X@ hwO!"/ .bl+?"@N3? # n#'&7x(3!XLl%重#AQ?2A{Gz7?4%3 'b tRtQRDJ>B X@QOo"&B$O K@(".-("D"3$J!(".)EY&Q2]($h0/]("u3 YB$r>! S"S'3$)؁#aQW%1`Vis_124`.cPm!#540X` `?Copyr>`gPtP(N`)P2\`03PM>`cu`o@`of}bnarq`aa}`io`nL` PAl` uhsbe*@`eu`v`dL`Pe#ha| ##)%H6qBtM{%BtMwg#da{T  )t"s4?Q0)   [h5?ZFvGC%s3$&@qI5^S;)m1x?D?@HFS]#r3`@"AHpVA0%}v2T!2Q ݟQnaN"u0`I@  N: 3AHYC^`R`lo`cbePS}`aubB`rPD>`vH>bcP&!b7riPŏ׏X''2ǥqBV! T0"N jP{',V޿!3bc@UYI*L\Hqab HD )# H#h(>CT4 W9 JU@\(\?Aq= ףp?@A{GzP t` ?t#b hr7bA@7>FuTZ7u>fUh&=ZZE!#-!`HO;djCdRH7 3yF(=!=Ol8]OYAEMNOO2EE4F _OO/_EEz32O@"KrA 0"S% 3jAb = AA6=i!3Sb1([f 0!2@f!w*]=!"*HD )# H#h(>CT4 W9 JU@\(\?A)?@A{?GzP t` ?t#br7W h!bA@7>Qu]c7u>f=;?? >Abb?bzYWbW񅴍#0z@j*Jq!q!`?Copy_rigTt(c)2U0 3M c os f"!rԚ !a i n}. Al U (s"e e v0d gL&he2?&'TA""ʫ<`3?Zq!ccp"l*J0>Uh/=11E!#!` X;msCmeH]2E 62B%(F!POuApOlAEMNOO;EEGF_bOB_EE2@O;"rA T0"S3jAb =`3A)APi!3fb1nf0!;Sf*mF!"*HD )# H#h(>CT4 W9 JU@\(\?A@AzG?P t` ?t#bC &r7b@7>ub:h7u>>?<? 5Abb?bz\bbb )#b"*(\#0z@oJ !!`?CopyrigTt(wc)20 3M c o%s f"!r 1ua i n._ Al0 (Us 2e e v20d0gz&Ahe`?T'TAPP23A{g$!6hpPlJ0>Uh]=11`E!#0!`Erxr(H7 3FS(t!tOz8OAMNO_2EEkFB_Of_EE3iO@0"rRA C00"cD3jAe =WAMAti! 3b1fC0J!2wf*4mt!0"E*_H ӆ n,$Dx8F|`/w^#lQ@? dQ]qaܻ@>D}+t\kB>?G`̀KPD```UFDfP h$T PYYBUI@I]??-?3P  V*7*1] 1UV\mH$ийG?le B  0m`ACom on,c!"wtr ls% WWi# d w5"uX,se/ ,I+"T!faJ' eM"I% ^!x- W,b x% s;")g3 j!l;"e!^ %% 1Gu (_ύ12<W<N>61.tDrag on}otheqp ad 3- di bxnie*fc .b?@zGz*\(?@)(3=3??UG DF P# h=0TdPYY#6ވU@@@?@A͚??P} u`bu#` ?dr7bAB!Y@X@ JPZ;6<FFZZ}/ar8& }Ô%_IT2bUH} /!4$*`?CopyrigPt (c)f 2\03f M^ c\ o%sV fd"U!rX !uad iV n.f _ Al \(Us"e e\ v d 1`V^ s_1p 1 cPm!#54\2Hp | -l} L2FG?;# ;'?DR:ea %9: YH@AD Gn8PdaZO;TC3)7%;-+#E& ab ef T xd"BV x!BvS;&r'T[~2.UgYPOksOs3@%%'Q'Q"3)TaCA{Gz?A$̉VtQt-R d!%nU %=CaRg@'Svf?2Q34C@UQTjTuf0`0i4!g"QARMT&@jc,<8!^q)i^?5 -7q'2Kqp6!4]>% ]v9N".Ua K" abbb7z@@0y^E t"W jN`{76!3Ȃwv5wz v _q _q⃏A٣p= ?AR?Q5<5$2 HD: )# Hh ,> T  9 Q#MU@A?Aۚ?@ҼP Ut`  o?t#lb*;uTu7>>q;?? A4r;a "۠ 8bbb[zh6#0z/Gz@JB!!?+`?CopyrigT}t(c)W20 3M ]c os f"R!r 1a i n. AUl%0 (s)2e e v;0d0'"g&6#ei?.'TA*23a!p (l ?Uhf=!##>U@o?A?K@P W>tA`  ?t#pbK.?>cu Xu 7R{gA? >b{bbWz>l6#0zGz@9 T!!$+`?CopyrigXt (c) 20 3 M c. os f"!r !a i n.  Al 0 (s2e ej v 0d0 "gAliN?'U>T74b0A{U$.!>p 1o/1 7A3# *lJ0fUlK=QQ!<3UWf66^Ar$5BF72  B23B(sA٣p/= ~I>^$?EE37FD%NRQȇG3Rt[2BAA2pM`^3F3 "A^N\'U5!EOO*O$/T 6D UoUA@ ?I?3P?x +1 bJb::e(*:R!HU? ?Z"F  0$`5,fivek to tls,b} ockk bo l} ,wmaw ero ua"c lu nu"a"t!lo sw !!e&m eT !rs d"ns"qn !v!ex"c pw"o"~!gJ"dk"o2?, em"ny""5hs a$ !g>!e!^ 5K#Uo??I!I!2I%$!` A @3!"3s>! <`>!KbS[KbSFFZK%F AJB PObFu F(6QXRɃga V  Drag ont hep adndaoT rbtmhl a>jusReihqnmmEeAoflyn s.til*o,ec cks ci C*rlQcSscs2yz mb?贁N?DUHXD  # *>h @JT(mmM aU@?q?UAP r|k;BuQ` ?FluUx ]mb .RE Y VBR ""LU˝ Ua&O/ ntxr##R+,uy$]針I#2-q20?16?16C4?yDa$2 @"B16+"SLo 3 &V"=@% b2JZI#[A`D|;-`?Copyrigdt {c)@20@3@M@c@os@fBAr@Aa@i@n.@ W l@ HsBe*@e@v@d@3`V@s_PE@cdm!#45"!P9@*Q0O贁#NkC31?#FV2UG[ S0+UL<U@%ea? gG)C6@"4u{o`:U)b2f2l8QUxxYyA"J0@2=(H3N.a/'#&遊am@%a"r"A r +r8C1a-actk-r6B 3U_q5kZ$-rrs.s;r@"_qE2o|6Curp[u]fB2{BCOae$\gU5ioSfn^a#*@'@@o wwa BO 7b&r MOaą͏ߏ'p9Kb cuEr YƟ؟ 2}(Xjd @fr A /AS'yd@ɿῘrMdayuUV["OƂyI@14Մa+Ӝb(#p tlü@Q@@ -C6?h=xoתb#]"KV2v's K *K K'2FXj 7s 2$#"&Lx7"`@%sִ1zCS@LR@n@HG@oBc _a@eg/a@axurJDATa(YY@"=(tԓ pYS5A@nӊyЁ'Km*|"}#1`A@ju@Ax!X.t%JAl@cBa@d@t@pJt@x@AUBI @AtBAh8/?o6 lsJ.9@jTa.E~i,GfD4C6ƞQw"#&@hC!$C6u?8Der$M:A+qZXa)$BUSTu?RqtQr#tR%48@2vA6v 0!Es 5&@2i|4\xW7']>&D#&T& 6sQ7#~eU1j+@- ,a.ӒAa/EǘQ3T!Huȁ "ERq@)K;F}#TB]]9 Ue@M@?u?P6 u`m u8]A\A<<$*4@>uLuVMJ\?Mk?A4t L֭R!W$5 /`Vis_SM.cTm!#52069`?Copyry gTt (r ) !03 My c o{ oIf"!r !a i n AUl (s2e{ e v0d e-/^# ^'l>0>Uhhx1x1@!!MŊJ`6" [ A| ,Bu6BM (7?OCLEC%\OuOOGLEK6OOOR~2 _;rA |RS&3 (Pd y A'hHe_q(b ,AU?rh]kG^f_"A%_7_5e eowo@_6d%Ek\ooOiC%oj]M_oLj}_"Bk8YBcel-pGM}{gH nTA)C"@(|ST&@q3H 1MƜJCA%xFLF# Q L? M za̯@oD+TE=AU@??@?@K?P6 Iu` ?uJm byU L A  >$ A C  "A "Y+7'&8'V"8'JE/Հ>*!u`@Q(-D?T!? \F-@@"/ G\#@F\@D?VKJau`u1" h b 02-U\5 @Q3e >J3-A2D5 `?CopyrigTt (c)d@20p@3d@M\@cZ@oKsT@fbBSArV@Aab@iT@n.d@ Al@ ZHsBe@eZ@v@d@y3`V\@s_PE@cTm!#`56@a20;M?| t0237Mal? 9G?:R2{ `: PHAV2l>0>UhhSYpKA20 baCJ`{S$ 9&?;?bV" E  "bM8!'&{o#oceEo$oYwe U@2ullIom@W2; r,Tr7TidAle U9 "WU44'2q})V!$QE2 4"V| 2q(bB4iQ6_ A_J: "MM*&WK]4?kg"51@՟ ,#2E0,YNxvBXe V{LB4)KEghe5r2ATAI)jBHsTK&@]eS,A@bU^1cU<@od@m@sb@A>H'0ڗ  G@1A_L RzF`#XG? CIX]a @qND+JkuN@|?`NUFDfP h>$/T 6D UoUA@ ?I?3P?x *+1: bjb:t:5(*!HUq? ?"t  0$É`\rectanglk ,q"noo"ti n{ j!fk j!nm z!cq lw ouuo ,w abk l"om !! j!dw is z!#z!!x"!p(x!g"d{ s rvk y>!e^ -5kUo1?C? I!I!2MI%$!G` A/0| <`>!kbs\{kbs:FQ0Fzk:F :A2 ? F D)7OXj ;{ykQDrag thuesapWonodwipe.ncrJv)s)s%ad6nlntV :bȿ@5??k@)p:mȿx96??s9m3` (H D  # =h 8>T P  ;UAU@?@W?Ak@)?PR6 kr(#*u`l?Tu`*OTUi[ b ABT5J-U5 %L@ʯ >,MKAbS!񣔑x!}$5 `Vis_PE.cTm!#45 13`?Copyr gTtk( )k20 3kM c o of"!r 1a i n kAl"0 (s&2e e v80d !0ONk?<!Lc6`"r' #0H5$UQ57Ma 'k3J4R{ W`:FBG1OF`"l>1Uhh9!VD$0JR 0#rh !V"I4#(4BHr6B^i%1kX"\_LTT5@.$[YKU52OUBrI$Kb$Qc^$jDAbT59 9'OS&F6o!fb1V<$!D&FH2 4f`"i(uoogGaw'2qpAzbefv av9&Kbr`"8!e1L qEPhe8K+BT44M&"))2JMfl?2tQ^tR$V&%Ifv*SsV 3vS5Kc&@ೂxeq bA;$K4 CD,.! Ab!T<0okm0s =1>Hu0!ہ }oTq_MS[F|}#I]? UM&sa@oD+,WkoR? }o?UFDfP h(TPYYBUAm@ ?I?| P? tO@HZZwÒȉHq??6U!B^:  01`box,rectanglI ,;bO siK  e^ q%* iu//X|'|'0U)2!0|7u P(:{W_qDrag thuesapWonodwipe. cuTm)zdbyg*aTXslci n!z:mb?贁No?k?4 HD" %# B=h50>ThP]]9 jEUAS?w?Q6 u` uBLAD@@A@U(.8BPZdMJ5 L@񣔍ֱ5 `?CopyrigTt (c). 2`03. M& c.$ os f,"!r Y!a, i n.. Alt $(sx"eL e$ v dl /`V& s__Sbb .2 hm!#4578  h:-/# '?9 B& ?L7 l>]Uhz!XJT r :y1*bCBF)D x2;BBM! NOUA%aOzO!IAQE5KFMMIE2O;2rA ]RcSRq4,b(7E?7VJ(\11"SOSM[?UViM&CU_^D0oo&]Q%kFZgg noWoi5\oVj_o i(y1e=J0Hg1e*7U2TA)_"(]ST&@qd2H0˄ nZU"J_LM%Fo\A#4X J? MU]za@]D}+,~T]3?I\ PUFDfP h(TPYYBUAm@ ?I?| PY? 鷅O@HZZwBHq??6U!V:  07)`arA ow,.@'heK d! e^ i% Y#u 8!"*)FpF aod`m_F:Drag thuesapWonodwipe.r)ablarwa! Eoct):av:s]ikG| n7HD # =h4>TB]]9 EsAUA? ?Q6 u` 6u e`A" @1/AT1; X>1|2<<TThp1r  ]||KxEJh7 M?-K|L@  /P6 $&"7?|h  (u`Qps-8Rw?4@,#?#145 02`?CopyrigTt (c)@20@3@M0c0os0fB1r02Aa@i0n.@ AlM@ 8sQBe%@e0vc@dE@T`V0s_SBM@. @hm!;#`59Bt@:-n/3 7?x*B&OG8 !l"> @Uha@3Q3Q ]A y1TB!Jr?#y@?#bPQ fQP@02rgQQ | bw bJb(T?#Q!U2SRP^"S(1Gޝ9?A67>?A=tPA4ne>Srd`a34bkak`"0"c`dc`Ȑ"9aVFd?A 1`fWb]frdh`bs|aYvExFdg j?A& 3P8rRrafq7ssy`q!hc" M9aE2FjPR%r@UYv~u$L`y6t+h~QDU~Qfy03/+?qtw#u"5p5eQyl?Aywlqooyc3cC@Go?Ao;kpS c#9PPwgA3gQ_P074RUUf_خT"pcXheq' cRTfQ<MTTwCJTm-?1p7&.?A#2D24rA cуv qBc^p3cQ`Rc@6As0>EJAUr!BwTe;@dEñe%Lm/A8?41hCȐgr+M0%d0f0.AuiBG BfSkEp2~#С(љ%$*LE+Еk|*`8rC=΅k }80@S<*,7Qd2Kf'38C=Кy2+Ic=XNgtLgFbQ)4҆T&@Dzmb?п贁N࿔τNb?gB'Sw 4 H')/ dS~lH?FL_F ##TQ$? $M`%za_]to}D^F oP+gk-8?UFDfP h$T PYYBUA@ m?I?i3P?< +1: b^jb::!H? k?B  0$`>curved,}aM rowU vW lO"V!sq embg yU fg uiS"p]"eM ,w ecPan ce",Q ng nQ !!g$!e^ %kU"3u ? #   ?U`ddm$[u~ ul0gb\vlDrag onut hepe.Ruih-ci%kca ro}wadsmb?6i@ tu?A0UH PD  &# >h ^T,PeeM EzMU@?@JIWt?M?H>Y.> MMXNHaR{XQ Nu`u`bue`u J-No@NuQ`bAN" ?M#uA)"Nba#h& h!JLNU K?& MNh #NU0O_贁Nk#O#b$~#R# @Z>6d2Is3P6s3z7!$>X7W2W?5X7=a?%t!%KGJL 3#1b" #5)֑#AD/N`Vis_TF.c\m!#50647`?Copyr@Ug\t`@(@)`@]2@03`@M@uc@o@ofBRAr@Qa@i@unu `@Al:PU Hs>Re@e@%vPPdu" +$7"M"{ #|#2WqP?V#$+? tQJS2S" ITneϒUnfJBu `M@b9@Q e@##auQHd#rpc c%a/pyQD `u`@ @!u`^rGIW"qrЀw s#lU%B$APG&lJt UpEA)HC (Pj~*roh Tdq#0h "U(j84_K"#҃'%P0)ps4f 6 Df "(`843FS?RSS' /gQ):lUKˑ?ɖAʓʓA):T ]]9 dAUA? ?P-DT!{ @A-u `u bu  /@" - Rc֍u`l?Mu $A YB  XJ@De'o/% 'y-/ $74#5 Lr-, *66h:\M%B/ ?Q(>6l"OlF2`Qps-8R? sIW@ -QZ6@J4#AD5 k`?CopyrigTtk(c)k20 P3kM@c@os@fBAr@,Qa@i@n.k AlGP HsKRePe@v]Pd?P/`V@s_Sb5P.Phm_!#5P6 I2mQW5gMC G?9 tNs-R \&?]9:ll> Uh,WaWa] A 1SJJ4#1 OF""rM(m4$h8?#k?b--(-Cdbg-qF5a:zQplrlbu@lvx]wEi:zQp8@u OE"A #wE34*6Lyr3rkrB-qUd=͏n(vЛQ9߅뉀9$xs)paA|?{Wxze`oyAe%!e[BZ^ghheȹC.1%TA) C8{Tl&@Sb??贁N8i6??Hӽ $ ]k?_LS}@BFlr9,#;P:? 4Pi;a_LLto}D$/T 6D UUA@ ?I?43P?] '*1dH?b\t ?Rء  0S`PHolow,ar he d cn' eJ# t!.o "-i%"*!s_ o# i T'N$#ju' R)ji' eP^ % [o//f2 ;` C5.e0`h2 n?2] Ol?zg?)?)5GY uy$ Drag onut he]pe,nqddsblu x < ;hRp <(e#w i7icUtecn c]i). inrHD  '$=h8>T ]]9 #UBeAU@U? P6 u `u bwu   @&!Bu#`l?_ujL2A@AX#AMJڹ @D-?A ##] @p///$~&,"&/3/3"/3/3 # "??@,?>?P?b?0U5 -@Q3  @`f}6Abr /CGb G.J}JI# ^Ozl1YSRCQT5 -`Vis_SE.cTm!#4957``?Cowpy@igTtk(P)k2U0P3kMPc@oPofRQrTPaaPiPnP] kAl4` XUs8bePe@vJ`dPPhD AMLfcBjSU R W?9AT'Q0Zel(&E>Uh(q`q] Q>qqSJnCAqu7rBr Bs Q !s{`@x;btr Az}w}}@up SR*s8ɓ|vrx[ rr#G#v0^&3}1Ez?Fxpst яr3ń$b&22H2x4qɡÏՏt tyfeRC ?.P pB ?yEp s#N8Jwbyr E&8Jt0H""{nq3,iq2xVu"P}vr#,AV'>P[i7tAAe9 gA D/'0Uf!daU Bd;xqeSQ5. |# LlAx}{C dsaz  ! [;q,''&#s;'›7З<՗<`?9Em7B&q'DDbqp!є!rR9=C2T?aItQ$atBh5$jEt{O`KsGA<92T? 'QE_b >qљasE8nAfeQG&@Bbfex.L硾5bܿ?Qp= ף?5H'r / YMO=6F4dBAp#d[_B? PrC}actoDLdD:+dkJ7,?UFDfP h>$/T 6D UUA@ ?I?43P?] '*1dH?b\t ?Rء  0S`PHolow,ar he d cn' eJ# t!.o "-i%"*!s_ o# i T'N$#ju' R)ji' eP^ % [o//f2 ;` C5.e0`h2 n?2D 6V?- /= σX P |Yf$?Drag onut he]pe,nqddsblu x < ;hRp <(e#w i7icUtecn c]i). inrHD '$=h 8>T  ;#BeAU@? P6 u `u bu   @&!B֍u#`l?M_ujLA@A#APMJ C.?~f'A  &###@## # "a"p////// 0&7&3/2#l?~??$U5 @# A{TA?Af\BQEZE @"`f}>3AA3B? (hBrAA<%AM}RD?"F# ^Oz l!YACRLCIzQT5 -`Vis_SE.cTm!#4957PI `?CopyrPgTtk(P)k20P3kMPc:PoPofRQrP aaPiPnP kAl$` Xs(bePePv":`dPI h AMLVcBSU R W?9ftW'Q0Jel6E>UhAaa !Q.qaSJCD?dP B  rb`@frus) |u! x| {rxpuws(CR7M8Cvx!p sxF?x78`' ?$/T 6D UUA@ ?I?43P? ȅH?BT ?2~҉ء  03`PHolow,ar\hedUcn e t.Io-i"s? o i4'#j)u 2)ji e^ %* 8o//fС2~ ` C.E0`H2 N?`2O Aa????/AOU#Drag onut he]pe,nqddsblu x < ;hRp <(e#w i7icUtecn ci).b0&d2[ɿ??xzPQ??R :HD  '$=h8>T ]]9 #UBdAU@? ?@0&d2?P-DT!>u `u bu  - &!B@֍u#`l?M^ui"YH8[.A@h`EJ@$e'`"o/%'y-/ $4#5 'L[a/ ;?Q( A_e|*_9r{6u?yl9F`q4? f K #0@Qq6_@"!"2U !BP39@h1MGrCB4#AAG;zC`Vis_SE.cTm!#49577P`?CopyUrPgTtk('P])k20dP3kMPcNPoPoIfVRGQrJPQaVPiHPn%P kAUlP NXsRePeNPvPd%P]Uhz ?Q5a7 J=4*[W3_?r #'&#  M(R4$t6fU5`y7cd"A e5a  d,5#mGb rb#2arEQ7'T6`23IB4eAo\0K|23ICwEz\.Ҍwsb3eICg0u{fHecXsd2dAbPrE9 G4$E6e6 d h+82b)B @|03bV\@JGZG (& #8BoH!eXm`@!(:g@:d aeZ0`TA)$,2)8KsT d&@AH . A] 4gsDx&FdU\#o_&W? _\ S]~aetkXD+jko;?dVUFDfP h$T PYYBUA@ m?I?i3P?< +1: b^jb::!H? k?B  0$`:variK ble},K"rowY"]si emS"yY UfU uO dY pa"ueM ,o ecPWanO cK lY e gO nW !!Ig!e^ %kU3u * U=JK]g_jfnDra_g ot] hepwe.Ri}h-clckca<lYb>wlv?\6t޿x6H?1?TKֿ3?UH LD  &# >hT,EI  MU@o?@X sv?@?@\q디?P(-DT!?J J$Ju IMDTm^>u`u`bu`u J->o@>rNA>uvA` ?Su)0>rw|bV#%]& ]!JU0O贇Nk K?)|#W$s#N K#)P?M>] #7U|Z36Y2Ih3E6h3o7Db7]C?:^7=m?5p!}%@GL #!W" %+{$7ItmR3ֆ#ADK/>`Vis_wTF .cXm!#5064P^ `?CopyrPgXtU@(P)U@2P03U@MPc7PoNPof?R0Qr3PlQa?Pi1PnP U@AlP 7XsRePe7PvPdPr$|#2WqP?XV}#$? |AJS!2C"@Ie`T?ddUueJBu`M@b7PA @buhPd 3rXc ca/pyQ+ `u`"*A 1u`SrGEGfruws#E}%$A@G&lJpUltE@(Q`TNN}": :QI!I!$2)(B z(uTsD9Qps-8R?(މbx$2T ɴY3frN$5oQssH"QDRFߑ݊#GE 3Tt&@q}"nA8Q_rPM}"z(mpItO(%C SP@Q&{@n;PlP.b 54ѤϨ ݔ}"z(qɀCF@WIAB`W"b-߈I#O`BQdP!gRQV#t"!Xi 3P تz(*T[o(Ap$ry3$VKBju44"52llV? ҌYq] bEp ep) mkW'X`RPpQstPxU Pex?PQ$g*H9gtBit1Jq<1EAGdh'_'U&!4'! kBcFJzu<msRF(J;H'5) wFv쁶JxWo<F,d]Z#M^j? _^_QaLtuoD+fkotd` PUFDfP h>$/T 6D UUA@ ?I?43P? ȅH?BT ?2~҉  03lj`^Universal,conctrRl,rWowPed*, "u!iT!soiTP'j+ nM*jH!e^ % 8o//Bf2 ` Ca0O`d2 j?|2 ^   -}|5 p`I`V?}`xaj?Ou ~( CxpxZ7Drag onut he]pe,nqddsblu x < ;hRp <(e#w i7icUtecn c]i).aE rugt-nrluembп?8i6п贁N7?? H D   =hj8>T ]]9 zAU@[? ࿿P6 @u `u A@u   b&!B֍u`l?M_ujObeLA0 @ */0$TJ @?`''2-""""////&VD7?)8>3N?`?r?>+/M !Cw#9  3tN s/B 5Lj /87@7'?(?"YB _O qOOOO;QU5 .@>^BkR aR5Rɜ 2rq?@IP?T6U? *`A-b}rj@_Ru ˀ.Xb7cb \?f fr#+`@qbr2#pc0c7oX`}NiKapnd_'akliaRXR hAQML%>S}qAG;J`?Copy`igTtk(c)k203kMpc`oKspfrqrpqapipn.k Alp xsrepe`vdp @``Vps_SEpcTm!#495C @ww$"'Pl> 4>Uh 3 lwq J9'r 'rM89W2hE` ieNiefb {jrA oi^dE`n>j}di!25U_Y_đe$je@fy ieR)[{ bxajdEvoo b xaΛ<#k |i2Wmj`z}}֯͘ i7!A2U_VU[Re>d=hWeãLDd͕o,ϙ!\2UDZ1ii ~wbAÂoϺVboe3nu,TSJfUR|PiAeU9 XwCR'2&Rq!F! u bWphed +TM25RJTnZh@>dfneCd#gCSKf?8-|duf \`T@d]g HPd k Uidd2#%W-")`Rqspu B"n @aRF5g G@ "d(@CbC Y@B"Y C3B&H2crGC"X92G4qicP(5Ull8/$t"/&uBCKC/U/v 2/.w/C$&Bcr=ǫBGR&Mj?GPd@d@m?a?C"BaBn{ _o{SL xUBBS:4 K'VmC+]4bcbb"b"bbBbBbbCqhHL<x bgoooos\hr>{oo'GGb vlw@8o~oYASy;O-"NPTZ~Q1ֈ{ |قb)C3`Cag Ar&weːd RꑧYQ!3P"#$OY `PVh6Hd2~8ToT &@قHu5 "_E .5F$dgv#4o3iw0OF \dcj?f gtkD+bk3|?$/T 6D UUA@ ?I?43P? ȅH?BT ?2~҉ԡ  03`Nside,arowha,cn etoi"s; oi0'#jSu .)ji $e^ T}% 8Bo//f2 ` C.A0'`D2 J?\2u ???,_?B_?/[  n7Drag onut he]pe,nqddsblu xW <cn 9csi# ofrhp  v aor.b?sߛt? UH PD  E(##hxT,EQM> EMU@? J@u`u`bu`u '#O@AYE:5Vu`5 }uA~Xb\h \$>LM *3MJ񱶝@8-?Z' d/v% "'B/ 7)#" L^&""&A>;32rqǿ?@If0[5d5K@ur{ rs#r0(B60/112 z4 5R0b:?1 2>12d@*G0`M-Ybr=G|\B]u6@`.^A*BuC2(8&A"p! $&Ef@U2S U)#jQ2Q:WGS`Vis_SE.c\m!#4958"0`?Copyl@ig\t (P)P20P3PMPc:l@oPofRQrPQaPiPnP PAl` XsbePel@v"*`dP0PN#)#0O贁Nk?Fw1j&R=)#3Q3QoIybEVEV9N#;AgTP0:e\)#2^2q? v3QET?J]yZlJAUp5 ;5I%Q9 *a"(G)*Y  3"3(3)$K%(BTfl`_0H5b8 VP3R~_BF\p Fdt]#du?:\Xv{atht_wD+Tak""?d DPTo>~ Q?UFDfP h$T PYYBmUA@ ?I?3P?x *+1: bjb:$:!H? ?BB G 0$`Arc,3pt$!e^ c%kU#4 &#:. BJJY?Y m qi`pv}tDrag oadnrcdefi eby3ptsE.r!>e=l<]b?贁N? 4 DHD   $=ih8>T E=AU@?MM]?P6 :֍u`l?MSu^ Sb1 eLA* /0  >"""U6"<,<'jJUn 0?9 ]b&!4{@`:".):&-w#5 @e > w#W1!';E`?CopyrigTtk(c)k203kM0c0os~0f2}1r01a0i~0n.k Al0 8s2e0e0v0d01 3`V0s_PE0cTm!#4/56050 " =M?I !{O TZgpFZFp6"T _ajl^"u`u`;@@fh ݓ u `:"\w#&X_+U?lKA2 }!U7Ml8>+UhH5 u1rdabac`J2w#GEZrbc "8/A@tt!`R01Is05 @1i@Qe019o0n01G&K"E,5s%Kk} E<Ć#ӉXbcc,H5?@̟DE[Ć#Ӊ2V&iqchKcgVoho5No]?oműMѵOpz~v5ѵb$Rf,b 1ap%7I 3M3EWi5T\p<0okm0s>iAq ey=LGU4w'2UqJN!$"[ vLFI"BXe$2/4DK"g :1pA)H2iE8Tl&@6cH'˃ }(N_E3CFmF ?#DIoNF `&Ya_\toU+mko1?NF oPUFDfP h$T PYYUA@ ?-I?3P? +1: މbjbK::[ER!HU? ?Z"  0$`=arc,k adiuso v!ameKt r}$!n{ Wio ,"gw n !!go !aJ{ uk e.#t>!e^ %2kUgda]?;U+TY4$44|j)3 @-14b}D1Q1/;3+F817|OO913o$/?I!I!2I%$` D.s>! <`\>!kbs{kbs;V(1Vzk;V ;QB OT`1 ??87!!!j!!!:߽BB?ߋwxTww׌VlwxzwvmDrag toad imensoaco 1i/l.PCa1elnStT+Rne,%ylCow a..b?mG ѿZ X?h n,?UHPD  ))# J>h @JT( eeMN7U MU@X%?7@xw?igHue`u Nu`Ag+uQ 4'<NY`Ob=&e YKJN?@`,Œ_?KZYYY&.MT'$Y"'s,h"c/u%>"-N6xKb6 1R7LP2? 3(5%4+$ "Hm"'U>]39*?@~:g3?vrM C-L*M-?D=AuO @X[2 VBJCu @?y"8'G)AW1W7GF@P`Vis_E.c\m!#45 P81f!`?CopyrPg\t sc)EP20QP3EPMPc;Po PofCR4Qr7PpQaCPi5PnP EPAlP ;XsRe* Pe;PvPdPgG,JQ0U\2_fP1b4?@$4JaBU% pPK7tUpZ77K,Q%&ar+2u:Cc?b%a}"Q AksM# qr(x %B L~Q vUabHp&I 3@eQoooooooS &+$@A "ww%3ɏs'Dgs8H $K 2EWi{cd'a}Qm?EuQ`?vbAB[g A`m"m"~,}clE;f_ƿA =u} @+ )&<g4,pmyi5TqœȴU~1~6ⴸBRQVĴ#Ĉ,Q,Q's qCJQrqIdEqВ~* QXKPKANNT)O1@tr7 EP5F6%xC,Q`.0;QPwFTEP0IBN.ONZfMYДNXQMC֊KYPKQ&XU{'ԸSarGBHp i}`\'AO!rq!Z`q; `~17>*EH@$O!2 rtGУӳr˱GЀ|gC3KHЁ?p@*\xPE'7SJCQGLb^mwQ׭O-S"LPnPa;P QcR~S pQmyR|Qn?P ǀt;RŽUsTD@Sp@GбC5I9ЅA@mt @C/^1Zeb1*%g| t. $&3 q;Sm&xs Q-S#0=pw*P,EP1A;PQ2t3*0  5PtPQ)P=@:FĴC5g .zsU M3 gbT Mx" o´N.)#Е/9} qB^(@ Q.5`#P'PA8r)EH uő`0#3`\"<@`#)O;FP~e˱*?Z?G q=6bWFW@@6sH')JĢO톟EՇVG4AIpCXEsO&ţA[0f[y] 'Ű$l[&frdsO*eG?H?P-DT!e?a4}H_0@*t.>tRd4`up`?AuU`u9`u`u`6@rѵ>sEr@R'u   l~t suts"Aa%1#2 r rrs6s!}a9c⃖O[m!ò` Ld ¾zCos0hi:)` AU-clr`ׁg慎W`Rips]7^r`DaCaU 0 i 𰅺/Q"oXn6MNkrs&"!RP:A]raTA` Pa6HHHR Pn q喽8ó11'2qq಩TO?&?~;` &UisaХDo .uL.Ynvb P~b @+Ab=ȩVkl3+StAQa6futza`TZ!s\` v` ΍cV`}ǛC `ϡSo "ǀpvL'2QJ'qfϬ%7Iǣߵ߫9&RvNTXj'&SA f+rvkIPjπ@hOSY1q`_ %<&H4J󐤢q9aPNmi>NP @LETc!!'f59lj>š;TuX05ȩNz#cRj1$cr,q-Taaĭ0U'1N!<0e(1>bTH1tg81! <000/2N1/2vQ-1h/25i'(93_3rwR)'U›;*eKU-˲cg p10-"'##' 2%?!fڀ1M!J3lmK•!Ceك`;Ma:KK2o_:Ue2///O???8Q7T"y'Q Dk' ٦pK-#%/SO`eOwL'rT P!'aNRi _0Cï$կT9bT5ITT&;B4bMp@!bjЃ  `0S0#:<ȮMFWXFHF ,#o"?} WX]a_twD+U/_k-?ߴaF PUFDfP h$T PYYUA@ ?-I?3P? +1: މbjbK::[ER!HU? ?Z"  0$`Garc,k adiuUso oy t{ iu eo v!am tR r$!n"o I,s l!hw !c %uq"lo !a{ !H!+#t>!eB^ 5FkUgdaq?;+JTY4$4R4|53 @&B1/!&1<=10OK|;?=1LOGo4??BI!I!2I%$` UD.s>! <`>!.kbs{kWbsgV]VzkgV gQ#R )_;Tt1 ??87!!!j!!!:߽BB?ߋwxTww׌VlwxzwvmDrag toad imensoaco 1i/l.PCa1elnStT+Rne,%ylCow a..b?mG ѿZ X?h n?UHPD  ))# J>h T, eeMN7U MU@K~?@xw?5@Hu`vue`Nu`A/u 8+@N]d bdA ]$JN?@%X?^$]]]M&.MX'$]"'w,l"g/y%!>"-N6KWb6 1 Rk g ? *314Nu{`:A2S!6/24;$ "q"J'  ^Ba39*Q?@~:7C? ]rM fC1L M-CHAu: S @_6 BCuq @?}@"8'G )Q[1[7G@P`Vis_E.c\m!#45hP29j%`?CopyrPPg\t (\P)P20P3PMPPcPoRPofR|QrPQaPi}PnZP PAlP XsReRPePvPdZPk4#WNJQK0U\12>oPf\1f4+?@D8ZBGUU#0O贁 Nkf3yfa0G5)lJ7(JUpB@77KtQ%&t1a[r/2uJaC~sb"%e"Q AsM Br(xx%fB ~Q UPawo91g33RǢqB(@ "a2E`#B6`'6`GQ8rYtEʦ G'`0"arѴ?`\"@]*ѓ`#OZF8a= `$OZOGq=):F b}F>P@:FHw'`_!EW8G(3DTQp eSEOt&3%H>Q0y@]}'32&mdlėxPѬnў)6ɥ?ʤ?JҗP-DT!N u?a4f/ ʤ0@*,ttRrftq`um`Au`u`u `un`@SrrӁsr+ @( <tnEsRAМn1!mDr  A' *x~߈ac͏ߊ!E` L.dG" @zG L * C8o@s_@h0iN` AZW-@c0lr`IgX`URiypsK!7rW`DC _@ E i  ",/Ò#,2nϠ G6b6Ҹ`W;{r45IWXb`raA` Pma E#m ʳ'ʳXb{PynnW8D%)#9Ma2DDb©8ؚDK!p;Œ`7 &UZiVsL ^rvn{P~2b F|@~rЯӿ3SJG tA@5a T(!fRumtK!q%Ž;&s U@H!.L6VV9%"'` ܄5XBg4`SE Ao h"IN$[Ramf!߀Sewݧ߹ߏ[9RG vG"TD&Ù0B1 ؾ+L0rrJ!~A@;v@{{P Y*A:`_H ,&/jq.a("iP{cT+:sf@tjqTMʅ5Z"Tzc8I1crm#83,QJq+Jq6U`AP4IrVwj' ~^rTD#O|!000~:s"25:`A"/_B^P,zq`AB10eR(`ADۑ;Ue-I0nנh۠U(M'_@0@)(##'2%! ?! fL1MY!P3Elm!CTKf;Mg:KQ2oe:~e//}T"~jAa ~P!O&Opj)1u4B~1ҏ#~-/?&UQ <ߠmVsi4>&;E:q+R۠ e0dC#5GYbuuᧂRT"򶭈-[emmRc G@:a'B 񿉐`0 #e$i.kTB ]]9 AU@>?@M?@P<>u`u bu *  - &!Bu`l?^e"H8[bl L2A A _y'"+" #''!"T''JU 6@_K?^&^&T^+'"/ 5"@57=":?5,|#L7@Kb 1/2rq?@2?45?>*3b}ru`A2@ [o)Bu Q.[7$u`0oMAzouly4 `u]`V@h'0"0u`1"+"b+"!"@'G46 *"@C"+"GC 4Z "|#vQ5 `?Cowpy@igT}tk(c)kW20P3kMP]c@osPfRRQrPQaPiPn.k AUlP XsRePe@v `dPl2`VPs_PEPcTm!#45#6Pa2|#Re7Ma_ WI?:B{]`:!baf2l>+Uh+!5 Q[d;AaOraWs^pJ0|/;)Ru+Gdr}8{tB}_e Z1IA?4ٝYg9C 8+=)+2i8;Tl&@jucH'΃ Y n@W,[F4eF ~#$o? Pta,\tD+mk9|?TkF Q=:UFDfP h>$/T 6D UUA@ ?I?43P? *'*1ȅH?bt ?RO  0S`HLine,arcco\ct rr u +-iT "sO o iTD'#j nA*j He^( % 1[o//Bf2 ` C .U0O`X2 ^?p2s ef|~}?)1|Cu qdd? qv 'wo Drag onut he]pe,nqddsblu x < ;hRp <(e#w i7icUtecn c]i).gaG GvebL&d2ٿH?c>ڿi?E$H DB D# ?h8>T P]]9 3AU@6?Ԩ/?@} P!3|@u `u bwu  - &!Bu`nl?^ui"H8[#  ! W A[.A/+",'JލU@3,B|?@d2Lf mbm6f?@'="//F"'/%'H/:WY#ML`3?9-!g tN zs[J2 62hL7&0Q46 !"L[Z  F F"""$""2!AJ4?2rqǮIu@jEѦsE??rBC3*3 @`A2@brG]B u ]AjdlY(#`u]{`@b=P_@u` C7H&"_WJBY#Q`1h7;2`Vis_SE.cTm!#495P1]1`?Copy@WigTtk(P])k20`3kMPc@oPoIfRQrP aaPiPnP kAUl;` Xs?bePe@vQ`dP^05W'QK0ael>$>Uh"!5 l3J:Y$9_e!|B8|Y$ZNPl?0r-}BKFB8 d 1`ghekTPME2J{5Ul U]I3VSCTa1`gQ`8arb&wTe)`^aρ^0sb)#5YE55\5t:tJe _Eb E1q`{Q7`QeR&D9`LaSP(aWLPnQ`?p0@vy`WPUdPh21~cՒ2pE5$A8TA?J5Tf|bpp-rE,s3w+`MPdPfPau0Wb*a补F& -GA /bFr(Q2iA b59 7U4'2mBq)s6!l4aU +E2,Abj"2@8{g U$ТT'M(Q(R)7JBJ95vt0otRqԾ#CE5 jT`KC ћl? ObI `a=PAՐشCCJEC&Y&@cMB}!eCyEk)$/T 6D UUA@ ?I?43P? *'*1ȅH?bt ?R"¡  0S`Earced,}rowUc n et .Io -i"!sI oi >'#j)u <)j i e^ % 1[o//fС2~ ` C.O0`R2 X?j2u ????~ ??oSXjbMIRfz`XmmbbbaQ f Drag onut he]pe,nqddsblu x < ;hRp <(e#w i7icUtecn ci).:Ua7l c_n<arwaqsuz bH&d2?]\.??贁Nk UH PD  # UhZ N#MU@? ?@H&d2H-vu`u bu @"&E9!E^+&o[u` cuAOt>QMQPPMP \' V>2"2""F"'">$UJl @t!"/%F"7-2''?R$W#e$2U tNQs92 <>p :#e=$Lr9.&8 7F+ .  x'P'""N\#27q@?OF14?A4IR  V[?%ZV%B PY(>U`Qps-8R?T @A`9"!"2"Q"Ԥ#!a17Gw`?Copyrig\t (wc)X`20d`3X`MP`cN`o%sH`fVbGarJ`auaV`iH`n.X`_ Al` NhUsbev`eN`v @d``VP`s_SE`c\m!#4958b``fg'a0eqlJAtUp5 5 ?a9 3(A u?Aw?1ArM uMbo0Bsze8sUA^GwX_SV0=s r Q/Ct ur@!LTq%BcS2dQm!E E{߇[]SVT@)`"T?l6DNP& Q% PS/lqokr" WȆ%D@%uBG*b0o{p#lk9riC:!_Wr bF+m#KBnFΣ  WɅh5|.4(X?P+/?P46eIV#57YT _R<~u@#"ͶZ#rVw}qלXG1BAgӬF" ›"́5*9\s? s!rLt+@&@q<;ÁǕq>@M!m; Z3fySqnpm*+T@"{`q2(!>%e1+)e-mFvS{b0~9=`&UBH`t\ ibYcf0r} 2o{ᨠ`; PH`i&`cL @{a5+=Oa%c RSc6vq3t AE Q%fycUN 6J] _qK2ypu3'g2s38*mGXgg `9cG4T|6 "e8v֒u6?A7;qY pvLv$+<S+ ֓x&$54ϟǗqC)"E`NA2#7-/14(C)2arywX2uwz ur)uWuf;Kاfc]O֞bXA1 E1 4IFGrY)DW74IqDIRH%E<?(4IFGG5=!OW9Cf9Wrpd^u-ퟰ'qHT父J rx.rrGmP| dǝ=W`RszW ArwO'eart1 Mi3_>_;'Tt@2 9֓scL3tQ; tRt$  jpKaWqo0,0o 0t2bas0c$!e^ f5 Yp!Boj?|?f!!2~% ` C2> *@`!-B 3OEBi??X'E'0""U0.!0E[. \?o  _# ?..:? ?j n`Uyek_k|f`Drag onut he]pe,nqddsblu x < ;hRp <(e#w i7icUtecn c]i).gaG Gveb]ٿXRx??L&d2?Pq߿X){Dv? i?% H DH D # =Uh <>T $]]9 J#yAU@;?@} [P!3|@u `u`bu  -*%Fu` ?u`b"L<U_# % A_.LA j/y++,'JލU@dx-E?@d2L?@?Ȣ?@m6f?~'D1"//'/%'/*TWM#M[T3?9 3tNzs_u2 {< pL702Q46 &""2"^ F L5-?2rqIi@Ϛ^EgE??ZrBC*71@`|A6@br]a-BuaAncunm4l#`u`@ +b&;Pu`2H&"M#QT1\7;`Vis_Sba.cTm!#45_801Q1 `?Copy@igTtW (P)P2PW03PMPc@oPofRQrTP"aaPiPnP] PAl=` XUsAbePe@vS`dPR0fW7QP0ce&?9:n=`?(>U y5 Q+3JM$9268^M$NLg6?<Eiuwbv2A8anw9*B i2n e(T7TeMSJ{VUeP5_G3SCT&PnPe9brbwTeP`aR0Bb)G5z95 !TItJvc cE E1`{Q7V@Q`QeRAMbqSP*aW&LPnS`jr` Qno=`sPXR`WPdjPh2~ҟ.Y瓋b2p"v95EA(YedJ MO~bcn) VFrapCuF5`A_`juPcuYd Pbi-fR0y'"$ '""R"\Fiabi=mU4g'2VaBq~!`4a U Ľc(92!j;H:kXsτqǿnyFx_y񌑨d ,ZA?qe?qC6YgpԠUEA+Vac'P92)]JgYn?aKCSn? # AU@?;?@} P!3|@׈u`u`bu`u J!-%q61Ru` ?mu`b"YXHk# 1 Ak8A ڧ/"J"(,('JޙU@dx-E?@d2L?@?Ȣ?@m6f?.'G"!"//'@/%'/ :Wc#Mdj3?9u tN&zsk2 < L700NQ46 &,"," B"j ,F ^L5-]{eE?AJ4?2rwqI@5tE}E??rBC*CG@`AB@br>ZmBu 0mAzouzy4#`u`֕@ 7bQPu` BH(&',"c#Qj1r7;B`Vis_SE.cTm!#;5k23Ph0,`?Cowpy@igT_t (P) `u2k0P MPuc@oPof bRQrP6aa `iPunP `AlQ`U hsUbePe@Evg`dPh0\c#2wBq?̒ofk1}4?JzZU0O贁Nk??Fw7=c#zk1k1Iy hs3}6}6P?MiWMQRPl2&?@9:zQ`?(>U 5=QagLPng``U QnĢoQ`sPX1WPdj `h 2~.Yr2p71O5Z0A(nuyJkcOro QƆ]+`MPdP fP2aumb@aۡC$&," (@1G"E" #,lFrÀ2iBvb=}U4'dJ!v4lf 6",O2jQHOm!kX\ߤqHӅ&ࡡee ,TeTXB !nïէgZlM))92J9kz? Bt\0tRs#CE5C[&@eMBeig`B?;;THu:DP8 ) RnOCpFU U#?LG :UFDfP h(TPYYBUAm@ ?I?| P? g'.5O c @hzzȉH?+?V!"E|  0W_`"Line,curve$oc d!ct*w rg rw u r/$5 e^ % 5Bo//f?!?!2?% ` Cw.5 s0'`4!v2 |?2/ !W|~~?)))9k | j fߏ fd<k l?le _Drag onut he]pe,nqddsblu x < ;hRp <(e#w i7icUtecn c]i).gaG GvebW"-ٿP&d2?H2k~i? E H D # =Uh <>T $]]9 J#AU@d2L?@} O?@P!3|@u `u`bu  -*%Fu` ?u`b"L<U_# % A_8A/ğ Vy"V",'Jލ@d ?.';""//D"'@/% '/:WW#Md[^3?9:+! tNzs_2 < L7$0'Q46 ^DL_&.^ F BD" " "2-]{eE?AJ4?2rq]Is@hEMqE??rBCg*7@`A6@br]aBu aALncunm4#`u`@ +b&EPuF` C5H&' "HBW#Q^1f7;`Vis_SBl.cTm!#459P&Q `?Copy@i}gTt (P])`20 `3`MPc@oPoIfRQrP,aaPUiPnP `APl`WsKbePe@v]`dP\04WAQP+0me&?9:nP?(>U y5 QX3JW$92@8^W$<_Eq6?G<Eibv28a9%Bi2n Pe27TuMSJ{`UeZ5_G3SCT&5`nPeCbrbwTe5`ja\0Bb)5C5A`ItJƻv cE VE1`Q7JQ`QeRAJWbSP&3bWLP=n]`0@v`UWPdPh23~ܝc2p,v&C5OPAcenJ%aTWObc Qvvv+`MP%dPfP(aucb6a БF&0&'@+GA(:kU J`Frap2ik!by=mU4w'2kBq~!j4aBU ֽc(C2jEH4kX!qǿٿw>qy񖑨De ,ZAIqeIqM6acʗPB,OT'WMHas)qHBJ9`n? At0tRx#}C5yKCZᶰn? zb P@VA吼`C}HEC&@MBIQaenT  ]]9 J3AU@2k~?@i?@} ?@P!3|@u `u`bwu  - &!Bu`l?mu`b"YH8[#  ! A[aA ڛ/u"J",'JލU@ŭE?@HKM?@$)?@OL贁Nk?.'7"!"//'@/%'/*WS#MdZ3?9u tN &zs[{2 < L7 0NQ46 &""2"Z F ^L5-]{eE?AJ4?2rwqIo@5dEmE??rBC*37@`A2@br Z[Bu  0]Aj_uli4#`u]`օ@ 'b"AP;u`2 H"&'"S#QZ1b7;1`Vis_120.cTm!#5397PX0`?Copy@igTtk(P)kQ0P MPc@oPoIfRQrP*aaPiPnP kAUlE` XsIbePe@v[`dPX05W=QPK0kel>(>U u5 Q3BJS$92<8^S$<[Em6?<Eebpv 28aJ90Be2n e7TeM?2%J{!Ul `U]IQPCTa;`g[`Barb& wTe3`haX0~Bb)5E?5 Tldv2ItJ|v _E E1`Q7FQ`_SS[`QAUbSPR2aiULPn[`5r` QnxoE`sPXR`WPdPh2~.Ybɒ2pf?5 A$e /J!SOb_s Qkr|v+W`MPdPfP&auab4aԡ$&" G""\FrRayp2i,bi=7U4g'2gBqJM~!f4aU! f6,?2jAH#kXZqTfw `usW d ,C@ qe q2!$gygԠIU T'MasR)J9!l?`#?1t0[tRF ?5KpCCl? ;b LThPE=#[AUA6? @ P6 u#`bo@utYSuO tT. ?[g Vb e.AE/ DMՄJ7U5 'L L##Iw!|$5 -`Vis__PEcTm!#45! 1 `?Copyr gTt ( ) 2`03 M c oN of"!r 1a i n Al!0 (s%2e e v70dJ@##b0Ab*661$($ # M'?9g!\4haUhz!T\5y8 aD@JJf##п_?RBr BCE##  F"D DBe(BJHFv2@SWS5(_1TFBG_TRMQ52O\v3FkR@U_Mv4Q[I3pRH-AevoQ7*RBT#PMh"J`!T*o[1V6#w!Avd0,dr(/aHV.% (rM@xL^xfwGv3GYS=`R72iz70 Po t mL70#MBq i0H4ah%ljX{v#rM@sD_w0Ϗ܍:#8xSUXy ca9sT"/R(, loofyqyqRM) JWcg?rF![tQItRI`{&5C<&@FMQeBMFOgpHuX B _F7BF4 W#`PO? CU)a_h oD+Lko? + o2֜UFDfP h(TPYYBUI&@!@???E EP] g'%.5O @hq?qz BHн?^!"  0Wm`1clase ic,notem Ubq xm ti ta v!cc p"oo ,c no$a(cq mJW eo t4!e^| W 5Gm _h'9KYDOq rDNO ~  "Dw FDODrag thuesapWonodwipe.umt)clOyiKzdf)tex:T 8mb?PQ?#V;;UGDF *P# h>4/T6D U@@[@A??Pu` ?uƕ:BO ?nW ^^n \.>:)$&$^$n$)r"#RU" "L@R"Գ#!$+-`Vis_SE.cPm!#\92,05`?Copyr0gPt ( 0)Q02U0]03Q0M0cG0o0ofO2@1rTC0|1aO0iA0n0] Q0Al0 G8Us2e0eG0v0d050f#^8􁤙 3$!50" M'?'d,%0E(00zG7z?!I5e,^=E% HA%D[%D^[5Dn[DWp@FCCa_'T"0(QP?F = !_b@#r C`MA01 O0oTQ0!1a0gZbf01u2 0izĭ02 b4fr-(b"d@ha)%FC1E4_tb}rcSrt^h#gRK0_8_1Paa"aa"'2)% J(\)a.cDc" $&k$&2DB^^nn~d&B#=E∪"5%tSPKX`? |$b h }q:$f^ !s559 TiWpQRcc1lEW& @Q"n___X(A)?vD/01 3R2i&b]ef0P1t0xf΅"vp%R` Si21!1.X~ ۭY"BiHaauaL;:l HD: +# ;h0>T@h]]9 B >AUA?JQ6 t`  ?@Ft]b3!Iu lSu" ]AbJ#U0z_Gz?<@=#'(IyC#Z)P+?MB#5 [ ;L LMES%#&1+45 `?CopyrigTt (cu) 2`03 uMU0cS0osM0If[2L1rO01a[0]iM0n.  Ul0 S8s2e{0eS0v0d0K `1l>]UhzD1,!J1#<BrlB~A\  %FM4(!hOz#O|CEEOOOFWE+%[ _F6_zOZ_2w_;rA 0 S3i4(1e o2kHD: *# ;ih ,>T!  9 B1AUA?ֻQ6 bp @t` b[h "u2`#gu#m>-#gJ#U0O贁Nk?=I@-3 A#?9 By L]&_}tn6 S!A!I';F`?CopyrigTt (c)02U0030M0c os f2!r 31a0i nU.0 lN0 (UsR2e&0e vd0)dF0? `>!Ul>$>Uh E !9v"J#9Im t#(f;?OH?CiAe9 ]&X/'}G'_2q@T&Z!M$0% }FHD: *# ;ih ,>T!  9 B;AUA? Q6 &t` bp ݀@t [h 15=u-gu%-> Z-$gJ#U0N贁Nk?=@- K#9 B Lg&MS!K!S';P`?CopyrigTt (wc)020030M 0c0o%s0f21r0=1ua0i0n.0U lX0 8s\2Ue00e0vn0dP0JI `H!l>$>Uh E !9"`J#9m t-(;Y? OH?)Ci-(heOKHD: *# ;ih ,>T!  9 BJAUA?ֻQ6 1֍t` bp @t[#& "h #u8u08 >8##J#U0O迴Nk? I@-# LZ#?9 Bij Lv&gS%S#A!Z!b';i`?CopyrigTt (c])!020-03!0uM0c0os0If21r0L1a0]i0n.!0 Ulg0 8sk2e?0e0v}0d_0X R`W!l>$>Uh E (19"J#%9 dt<( K?O+H?8CiAb9 v&XH'G'2ǥq@m&!f$0% FHD: *# =h8>T ]]9 B z^AUA?Q6 vr o@ hpZ "Kt` Dmu`bru]b$ > > Z$xJ#U0O贁Nk?' @I-.#B@ z#9 z\.#2q ì?/&$?Jl$J:I@۪H?@M4(?%6@6 ^#uLdCM(Jg @"p2~.6W8ul4( xA%6rO /"+h/2T.#ГAz!';W`?Copy_rigTtk(c)k2U0@3kM@c@os@fBArԼ@Aa@i@nU.k lP HUsRe@e@v&P)dPx `w!B\P';1t !S1 0l>Uh% AYYREJ91)~"\(0 lC%m4"\(VbD@ubJPef cPAkkUh*RekaPdkUt@pb Po@'Q.`ejAb59 a\{KG&;!3WrXEa@fs*!&/}C%ioXKGw'$zRr{u_v& vk"k+dhz- ?,C&l@l!j7?b2`4n0 0`> ? \= U2asP75Q` <R_FHG cD/bEBi d5 úU#k? $S]qast D+Fk2?G43 @d. ? + } J' |( RL& . UFDfP h(TPYYBUI&@!@???E EP] g'%.5O @hq?qz BHн?^!"  0Wg`.dec_o,ne ta ,be xg tim lo"caUp{"oi , ni$a(d!m ei t$4!e^| (W 5G* P  / W f  ;3 33;of3_3;^ 3v |~e  ^  oûi]Drag thuesapWonodwipe.umt)clOyiKzdf)tex:T 8mb?P[Q?#;;UGD # h0Td  {U@@[@A??P} mu` u @.:>;^~j~V*:6Vܪ~r"#RU6" "L@R-"?#y!~$E+-`Vis_SE.cPm!#492 8`?Co_pyr gP_t ( ) ]2\03 M uc o of"R!r 1a i un Al#0U (s'2e e Ev90d ?#j!#D$V! 6  '?dB,5%5e$^3U5 3 H7A6%CDNKj%CDjNGgdaOrC !TID6"(Dj"'DRU2) T 3(tC?}Kr  6RW) AD>Ze2>Sj%(T7TK?SQ{? Ub 1 b:~UNVES jV!RSU59_;PNVAaStQ$RRld-"0Q|>SU&@8R6"daf=j%8б?c@u v_?SuSb_"t(jKr ^ @p8ur}>cq Vd CA`K]ozw=^ y "!trj8urtuTb)AG2QXfXTTTbw6"a6%3Ώ\4su+]2sTgNTb OnOC6"3(A,Yv^ XF y!=SE@%ER+ CO`M B1 o !a0g f901u72 iz90H2TguS-ER]3/Vr^c-"n@I[m3(C})׆4/]1#R92i&5 f !t90xv'Rf "vN` S"1!'.X ~^ ZkY-"ByTaa{hpGБpUHTuD" # >h40JTtEI MUAU?ZQ NtQ`  @tU$Nb?4-UNuxu.\MRuNOb!EN!#NU0z_Gz?@QNh#" GL%R=# !?Iy*$(P?@$V $%oS#J#<1A4\+(`?Copyrig`t(c)2l03Mk0ci0osc0fq2b1re01aq0ic0n. l0 i8s2e0ei0v0d0 N`1liUtZ1XUY!(1#$DN~BAD M F"J(1!~OOCE%O%O _]VEY@5[uFL_Op_2_#ErM#c7Q? OO0OlBOTOWZP"rw)^?Bf$VM%oo(ook$^V{qF.@RZqfoo'%e1U(o:o@Lo^opooJc@uo":L^cПy|9+=tA*1AˏݏۯG |ǿٿKo3†K]oay|Ʊϸί7#5GgQMPqK'NTM"(lT?+Np ԙ=]?Q#G@2MCM tBQ}BU}BA}F}B M t F- t EUEiE}FE"HD # =hj8>T ]]9 S AUA?A+Q?@۪1?@Q#)Q6 <t`]u p b @(@ul`:"P  :3t[uzl]?l{u bb:. A >$j)]#:2"8&:J#U0O?贁Nk?< -$v#+##J\xv#&&2q 0c?&#$?l%$:BI@9*a5v6 uLd( 9A19$3;:"" ' v6Uh% AYRRJ*v#7ld"(Ee^o!tc(R1eT@tKPe jAbE9 \{G/&!3Pr0Xv$!$&>?mHDB *# =hj8>T ]]9 RMAUA?A+Q?@۪1?@!拷?Q6 U"t`p}@tA`t u 5ulE&u b uԔg.ELA]] >$ڡb$3& J#U0zGz?=@L\#2q^ ?]/o&$?l4 B=#Iy'(P;?7#5 L "BI{6r? #?<0`bd(-D" M1c4;x5RA2&6WNOJ#AD5 '`?CopyrigTtk(c)k20@3kM@c@os@fBAr@Qa@i@n.k AlP HsRe@e@v1Pd^P `AQBgP@';A1 !S1Bl>0>Uhh A!1XRJ2!2&2&ccl0< 2Q!<}bw=t33!?d֮GBG=625BSJDBɧlb5G@񥌦5=΋A2HǑǑ2'B)* 80"@DK͢@Sx~7X&(''H'5(*!K_<ː!? b &Ր1G E/A- QRu@Ǔ|&&@Ҧ2ByX#TݭauJRc<zHD:  # ;h0>T@h]]9  >A[UA?Q Ut`  @tbK3!Icu lu" ]AڢbSQJ#U0zGzK?@B=#$ͩ ?Iy$[(P?*$d#5 ; L LMS#&1+45 `?CopyrigTt (c) 2`03 MU0c.S0osM0f[2L1rO01a[0iM0n.  l0 S8s2e{0eS0vz0d0 I`1l>]UhzD1!J1#<QrlB~A\  FMB!hOO|CE%Oy%OOGVE+%[_F6_zOZ_2w_;rRA 0S3HD: # ;h0>T@h]]9  QA[UA??QV t`  ?@tubU" p u u"?> 9 #b(J#U0O_Nk?@RB#z5 L%醑=#'(?Iyt'$(P? LMS#91>45 `?CopyrigTt (c) 2`03 Mh0c.f0os`0fn2_1rb01an0i`0n.  l0 f8s2e0ef0vz0d0 I`1l>]UhzW1V!J1#<QqBdH  RBBMB.!{OOCE~%OO_YWE%2[rFI_Om_2_;rA 0c3HD: # ;h0>T@h]]9  AUA?Aڊ-?Q Ut`  o?@[tA` t%b" p u iu+I>.R#$#bI" &J#U0O贁Nk?@BK#5 ;L6%=K#'(IyY$(P?0LMgSQ.K#Ik1p45 `?CopyrigT}t (c) ]2`03 M0]c0os0f2R1r01a0i0Wn.  0l0U 8s2e0e0uv0d0&'`Al>]Uhz1!JAD 3<{BH  %FMB`!O#OCE% _&_8_WE5d[ F{_O_2_;"rA @"3cCHD: # ;h0>T@h]]9  AUAA\m?Aq_ ?ܾ?Q t@)[tA` g?t -Kt`  Y@p  ?3" f, uAb u*I v >$m  u.&#)' 9"D?& J#U0O/Nk?@)B}#5 !Lh%=}#'(Iy$:8P?E0LM@MS D/k"%}#145 `?CopyrigTt(cu)2`03uM0c0os0If21r01a0]i0n. Ul@ 8sBe0e0v0@d@`@Al>]Uhz1X!JJA 9 EBA  VMB! O%3OC/U%?_X_j_W/U65U _O_2X_;9"rA A@ 9"ecMCHD: # ;h0>T@h]]9  sAUA?A\mŖ?Aq ?ݰ?Q t` @)tA` : ?t+ K Yp  ?3" f ubu*I m >u#b  J#U0O贁Nk?@Bl;#5 ;L&%醑=;#'(?IytI$(P? 0L~MS /)"J;#[1`45 `?CopyrigTt(c)2`03M0c0os0f21r01a0i0n. l0 8s2e0e0v0d0;`1 l>]Uhzy1x! JA#< BAY  FMBP! O#OCE%O_(_{WE%TULk_O_b2_;rA##c CHD:  # =h8>T ]]9 RB AUA??@9*?@*_IQ6 t` l?@,tp u*u` ul`u Ub`B d@   >#VB"@]$B)/;)!b"&J#U0zGz%?@􉄍7#5 Lf"EB\#$a[?m6M$?le4=#$ͩ Iyj?P?$$"O P%0`bd_-eonD.$e[Ou*297E*2R/*$#]QbT5 $`?CopyrigTtk(c)k20P3kMPcPoKsPfRQrPQaPiPn.k AlP XsRePePvPdP "&`7; *1 Se.l>0>Uhh {Q 1bJ!AN&NbCx(e5FoG?!{E7~>EPbw'u%n'uoI m%bTPtPe HD: ,# ;h0>T@h]]9  yAUAA~bK?Aq? ?@Q n@BtAK` t /?b -Kt` )W?Y _p ݶ)5 b SuZ u!b  >R J#U0zGz?OFwLKBA#5 /L,%=A#P"wIy#?Z&P?M 0Le&gYSS//"A#Ia1f45 `?CopyrigT}t((c)(]2`03(M0]c0os0f2R1r01a0i0Wn.( l0U 8s2e0e0uv0d0q'`Al>]Uhz1~!9JA )BA" K FMBO!OCE%__'_JQE%@ZUOt_O^2_,;rA @)cCHD: ,# ;h0>T@h]]9  yAUA?A~bK?Aq ?@Q t` @BtA` t ?bW K)? _p )k b ub u!b m > J#U0zGz?Fw LBlA#5 TL,%I=A#P"Iy#?&P?"MA# 0L>e&MS //"%A#a1f45 `?CopyrigTt((cu)(2`03(uM0c0os0If21r01a0]i0n.( 0Ul0 8s2e0e0v0d0q`Al>]Uhz1h~!9J8AT()BAY  FMBO!OCE%__'_JQE%ZUOt_O^b2_;rA) @)cCHD: ,# ;h0>T@h]]9  yAUAAx $(?Aq? ?@Q n@BtAK`t /? b -Kt` )W?Y _p ݶ)5 b SuZ u!b >R J#U0zGz?OFwLBA#5 TL,%=A#P"I;y#?&-P?M 0Le&YS//"A#a1f45 `?CopyrigTt((c)(2`03(M0c.0os0f21r01a0i0n.( l0 8s2e0e0v0d0q`Al>]Uhz1~! JA )"BA K FMBO!OCE%__'_JQE%@ZUOt_O^2_,;rA @)cCHD: ,# ;h0>T@h]]9  yAUA?Ax $(?Aq ?@Q t` @BtA`t ? bW K)? _p )k b ub u!b eA J#U0zGz?Fw LBlA#5 TL,%I=A#P"Iy#?&P?"MA# 0L>e&MS //"%A#a1f45 `?CopyrigTt((cu)(2`03(uM0c0os0If21r01a0]i0n.( 0Ul0 8s2e0e0v0d0q`Al>]Uhz1X~!J8AT()BAY  FMBO!OCE%__'_JQE%ZUOt_O^b2_;rA) @)cCHD: # ;h0>T@h]]9  7A;UA?@?[Q u{` ?@#bt b"p: iui`>k%|QJ#U0O贁N#k?eB5 'KL='(Iy $(P;? LM,S1$45 `?CopyrigTt (c)V02`03V0MN0cL0osF0fT2E1rH01aT0iF0n.V0 l0 L8s2et0eL0v0d0 `1l>]Uhz=1XTB ]]9 zDAU@Aڊ-?@۪j?@~Xk[?Q6 }bA[tA`]t 5u`,ul<u` Nu#ba.E2Ae2 >$UI  T J#U0zGz?hL7#5 L\#2q ?/&V"$?lF4 =#$ͩIy'*8PV?MB' 6 *3l `bdp(O#@ D1Z~4TZoT9_Jtq"'q"R$#IAD5 `?CopyrigT}tk(c)kW20@3kM@]c@os@fBRAr@ Qa@i@n.k AUl$P Hs(Re@e@v:PdPK `JQ#pP7';q!gt1S1Hl>0>Uhh AQ!aRJf:97l!Eb CPhB(*e|6;oMg?Yokk%n5oogqe5*noMo qeE*ooSoB(b@Uu l:P-@lBkkt@y@ekn@t:R. Sr=QqcB"pi@q"EQ<hQ> jAb59 u\{N',?ˆ! 3ނQKP &3!G4ˆ/ixX\N'T'$ ق& T"_HuH" I}Ta@ѿJҳF4l L-N# k.? $S//qaܯVh oD+{ko2?GUa oP 5r8^D: K=~t @ Bsو 3F H K$Block, abe ,t x b x fi"d"op,T tR e ~'s d"Wum n a %i nR!e!^ 5k UGu ,{56 -~DYD NPA ~Dz~CDrag onut heqp adex ubxwiW lb l*pn!f=LT"Jo;.SKec/`tyD e>f .lFb??RQ迤p= ???Gz44UGDF .P# h>0Td9 E UkU@?@?AKP} r('u`m ?HuhT b 8v   Bʍ *SU&"LK@/#Ii!n$5+-`Vis}_E.cPm!#4572\ `?Copyr gPt/ ( ) !W03 M c o of"!rT !a i n ] Al0 (Us2e e v)0d UZ%} f2,%% 񤰕#4*u# u'?<)0UaU9&%UH#A&%/D :Ggea{OkCrT A1A1&"DZ"((R")DE#(Cai! aE#0 = t"-b t!Rm, 1Ts d)0-AV#!\WA1uSEZ%#TU?Rbb[X"AE5CjZTtQR6tRTQ[SVEZ&@R&"nqO>OC  &"#(*T5Qk4q/;(2` U+4.B x`yt 1ruSN 3~N uWn1!g`H)0%frA,#r*:Lx#r\ԉ(vMn1&7q &KL0b)01A)R21T '_r}!L\)0!Q",h^qo!U@ypa IO]/m8HDJ  . #/=ih,>TE=AUA??IQ~Q6 @rb (t` uLA-v@Te < aru3tRtet012Q|3buu}T&  $ >Q ,%*"U+&Y5&JlU2q{ ?z/&M?? d 4wM(b"+t#I"+&>(h%M: 񕣕t#n1hs45 d`?CopyrigTt (c])020030uM0c0os0If21r01a0]i0n.0 Ulr 8s2e0e0v @d0" o%*A0>Uhh,A,AE1$" JaD@JA9t#<6wFB(4t#FHBGOD050A Y_+!FaC{RCz_B5]@9YSGghe0o.7TMUU"JP^cavp  #R9']#+% R Ma%ST@#K5 ;?v1C$#@/Rhb"-8leLBEOp 0&oytHDJ  .# =hj$>T ]]9 zAUA?XCCͳQ6 Erb -Vt`   l[@ ]R)(R./y baQzu LzuR  e >%"&EJhH : D#y!~$5 ``?CopyrigTt (c) 20 3 M c os f"!r !a i n. l0 (s2e e v0d  l*>0>Uhh7171 ]E!D$ " a40J>D#@e6;0@*2B4<6?27E;1 %Hl ?OD,aL8 {I{B3FE:O52CThE=jUA@ ? Qn6 u{` ?SuB&A@@A@*(.8B@PZdMJPhI 99 +L%ֱ&!+$5 `?CopyrigTt (c)] 2`03] MU cS oKsM f["L!rO !a[ iM n.] Al S(s"e{ eS vz d /`VU s_Sb .a hm!#457 1!-2# 2'?9 & ?? ?aUhzD!MJT :VbBIF x2Q;BM4  MO"UA%aOzO!IAQE5KFMMI2O;z2rA ]R-cS"q4,b7E?7\ @T113" S&CUMPOxo@:?RjOOQIkH@D}fa?@Eoo_o(Io@f@ ]a4rooIQ5ܰo)uFu4q?@0=o%^(5e/jCCjg1eT72TAI)G"(]ST&@a3H'?„ VK(EdCFFD! ec#,kgb? Qx]saIhk ]C+_I ]%?. h7P_8(D%Oz$ݝWĽoF?|O3TD\O8P",YY_JPS!uY>pwr\|Sz`ww\`t }Mwd}w `>w}.w?`#-`F -wI6 QV3UQ]6U]6W]6V]6%X]6\J`3.:`3U$]6e]6f]6g]6T`3i]6j]6k]6n]6v_x]6y]6aI6QV3|]6}]6]6]6]6]6]6]6]6V_o]6}oaL3aV3@aL3@aV3cU2mq?mhw mu ` r4(r.ru8y?c2)evЛ~ح~x sUqve@e{uHEr  C\1DCS1CgAC{.AC RCQCbCˆ@aC߆Q pw3PPuh  TfQe-`Co&lr ScemPscP‘\1`CP@ irQ &R;u`#rp1p5`"a"a+b,arh_*f@i ?Qcuȥ 'ˏݏ ru?ʯܯs(>P\n3TeUDPfPut敀qb9ue2?b& AɆxCơ0'9K]߮o \1<bceeqߐ13x xepHޓR Xe~+=ߐAVVPnPsiPgpm ruSB1 APn*tPtPoPl` fxS>B e"tj SB DPzvǑb hQQAe3QQ6LKdQ 8PAp1ߑ1q1A.qVA1@11b9q"xQ1#ЩѺ!1E+61LA⵩z134;D QBж1!+B!+F!+J!+!+!N!+j!+!+b!~!+!h+"!!+&!:+*!!+.!!+2!!+6!8+n!!+:!!+f!!+>!+B!|+F!#+J!!+!+N!!+R! +V!y.Z!"z.{.v!"|.~!}.!".!.!  !.!".!.!".!.!".!.!".!.!".!.!.%*:l80P!1D1!331D11D1**AȡDȡ5A VAбDбwAAϕ"AccQTT"=Quu^Q22"QSSatt"$aEa"faססa"aa::"Q[[ q||"qq"q߱߱q"!!4BB"Uف";q<"]~"JJqkk"Dьeѭ"ѧllFȡ:PA+qq :PA*1:PA:PAб:PA:PA":PA31:PAT:PA2:PQS:PQt:P Qc -Q :Qס GQ1 TQ aQ: nQ[ {Q| Qc Q Q߱ Q1 Q! QB Qc Q Qc Q a a>!>!J 1akc >a Ka Xa1 ea ra a1 aR asc a a a1 a a a9 a!! q{c q q (q1 5q Bq  OqA \qb iqqc vq q q1 q q( qI qj qc q q q1 ! 0!!!3E5%g$`T*g$b B!Nd]!2]!{1T1U!N]!}A5%H@}f@$@@$@@2$?+?&4?;}ʂ!N$dN 5%Ag{eaez0tJbԵ#0 1U.z0CsoUe{ iܒnUinz0i UO|T 2ΒPJEyt 3ΒQT /SR0NtE #@ r dc`r]!j!0Z"U11Nj!}]!tB%5%r15% =Ƀ(6Q+G2,Ow]>@B%6NB!,ԇ@1NB!B%ɃN͡DhLXgGzſqϿD;rͿςſg߭Xΰx5&:Awd1@ׄ;$5%nTd111B%eA׀%?d]!!!pˁ![#w%tɃϏR5%1A@Hz?G?Z{1)? p=ڿ@73&hÿ2xGAdw$!%@섵U@h3@}@@@$ ?@O}r1r+3z y A:wWRWq@߿@% Yd1p͡w y @z@syw1! $0FX Yߖi?/c+o/s&//wT,1111 -4իc28;159/*za ,X?.RD񚘇a1,OH6OT$(/D͡X1DGQ9!U#UOA _W$._@_[_m__[aqqE ul,g>dwIk >d,Ig tA);ez i;dd}唰hXE'K2UXrŤg!֣騅 $UeLm~o&iDž/uR Z`A逜ɯۯo#A,UQzО4hڼů-?Qbek)]vQ @ Ψjal -?QFϙϏWi{Xӯ孵3U^9$6Hc~ߐߢ5ܟߢya,ja}aȽ&i5_ oT.@Rdv52f-KUϳ:L^p_[(:Kț(n8;\At2bAe%atAH?  '{@$@@To?@0?$ %?[ 1l~!Æg ?IyS_vx_vtFe)bbbz2`@2bObɒ7##0O贁ONk?ubAsECustomPr`a,$6HZl~(/x'v]U'L_ȝ.;^_E_@4 QA,DoEKh3TA)QdȒa U<)CIoHoeAqDa,)G@|ia UO!Ù|hAjW ^`˺a{&uUvX4~&!}yWu\ewuYE`{'_ ! /$ !*/N/`/r//// %@$(;/ ??0?B5EfN?`?r?7f?????9\8Sa'e @O,O>OPObOtOOOOOOO__(__w_^]22___ϙoo~:oLo^o~ώo !oooooC9W8e`b6dc'჏ˏݏ P"?$//TfxC4L˟ݚ;P%7;TnAmǯٯ!3DWi{9ʿ^_p_տQ/Sewωϭle?>='9K oߝ9/W(#5GOk?QQ8_;5*%/.kl/\/.ĔD+payment21:L^p3,?5=DsPbϴ߆Ϫh ߫(>'O]?ޯ w? FGN O _` ON_ޕ_{wu4$oʯOOxO{ @@;?QcuEf3Eurf#5G`?r????fOxO??OaJ8OC\O:yߝ߽߯_ _S-?T_u_Oz)////Z ?1?3a _g_o7oIo[omooojooooo#}If7I[ mwfur~ ޏVhzɏԏ .@RdײַП*& -6V-\Ɂ?^qσ=(ϼi*g/jtV//k X؍//Ԁ+do/la'rsN0#0?GYk?=0'8JߜnߒPo_:Q9NOICOmʿܿ?FN_q__Ln_@_ogkao#5G(Yk9 H+Ro//,/>//t/P//p/&dA(unt?~9?K?]?o?ka@?cka???? OO0OGoTOfOxOOOOOnO__,_>_P_b_Io_5__2ro`rq_G!3o0oBorbСooСoooooo v@@/ASe5zR I ""w -Ccuy&Up0o 0i 0͏t'ЭM_Сyӟ0 - Qcucϯ2;M_¿Կ`+ /@\̙!yϋUɺ|"3@@v&r "3@QDmqUhRL}bb1zrKх.#0O贁N%kM#&k%z/5.?RNO OUAaA,A:aAaEMO //O G45U,/X-:(0]#o/\gIlo%?o k_FaE6KqyH}Kq\\̟qj/[E/////@r?@f}!@K@520؆0?<:=O?a?s=?PIf????5f432bbb??0[ DDEtuc!tUAQAwD(U3yKє~xXvGD_'2U'E!e&AJoe D~xnYA"O4OEXOjO|O:_OMMOM3_я;M_q"όEͶqb_t__l_o_o*oύYo%}opקoo> <*- # D1r$`ĩDT/ 2v 8YP? H8E5ɏޢ|CA98`w1E=E:B ǑEjk: |0daygڿ$mv 5  Ahyϯӯ"OO-UX.!3MD.ϱߋd]/(9 228?4/ /{߷_Ο?Ghqtdd2Dh% { 8EzG?@HD5gA_OGEQ?@ ףp= ?O_jXhm/*ɖͳU@⹗?@ bZ bK?T쨏 +22E F l^_0o%RL$~~+3>@`pHuNP %{@@@Ru^V1XpH w.@-z@r~]%`D_///*oNd??ηV?K.߽;If?/Ǐُdo~Th*QQgg!-XQ>S[[&ǑӕTzz&m ed .^AnU-?HTu4v/Ƥ-3p1ex`|sQ`FJF a-"?G?G a~rNg@NaNስa`LG{I{ϿL'p@_R_d_v_&o8oJo_ F yr Y`rF DWXum|g$ͩxo!X);_qUR1(00N/2 Q//(:!Ѽ:mm=l~kg0<N`rτϖϨϺ&8J\<ے&|ߎ߲(:L^ d-de///+/=/c/////??5kj1kDr1΁kw '˕[? .S˕%s_h5xho8i#oorA?S?e?w?I/[.?=ow?Ow-=o/z`a{LdczpBaOObgOOOgo_(V<鷿@;R@TT?@M[Td\˒y__eTK|__jh|bՀ.hh#30O贁Nkijavtae9oKo]ooooooco9SԟoOÞ*R$͟pq,w XZ7ewz ١XS@PŴVWLC s>gtetRϺ[UȏT)ċqҕP$6l~O(LOʯܯK/(/6H)o~*/gƿؿroo28J\nϞɁ!}!!/'q/ ////? ?tH?Bb_:ǃr????????OO&O8OJO\OnOOOOt_O_O_5iDž6_H^k_>______)oCoogoXdžoɿooƿo@R0dvTqAqq[3EWi{ 2:ﳏŏ׏15$,A$Ƌ-?Qcuϟ3)fM_q/˯C%7I[mϑUds ρ!H?TcxϽ߀[/1=[c `  1$1 ߄Ԡs5ߞ)n v3Ɂ?Z= i~/O!jOOkxO)_|mont q"w/_///73v 1_/] 1P{1Xjp k54noio@o~/#=ۿ;^cDTcGS|폁{GUfx?@@@!@@@6;MFba.O@Ker!s`IfEbAgOyOf b?bb /8I܁U5SXMfrz0AOaKa[.IGeYGaXXpgI'2%U$e!H ajFb IXPSao.oJRodovo4ommoJ-o/y_֟__/,_Bݻu Z/ۑF_*lf / #/;߮!?37 A?OPObO%OϥO_:_Lwuatej__T 2 oȿڿo"ϝ/oX|/FX4F}v?&?B?nOTCO A+OOasp%7I[maAo/owoeoo!s3yQLVo_Q1Ab}A//&/8/J/\/n/O///6///?4?F?X?j?|???O?dO?L Op0OTOxOܟQG9QWOQOOO __YG/Y/aQv////////??$?6?H?/!&i?{????????K_]_o__Ve___O_eO(m oJo._;M_qXoOˏݏ*oOI+Bd[.ommoo Q,>PbtkӜuΈqERIf#Фzbfbbzy5ϟ]W߽M^Z DNuf%&8\nhfֿ@f!@w@03?@t$Ӛ媼ѿuu" 2DVh?~cU0O贁Nk #ֺuϑϣϵwӓMc p:q,3[aȠ8;qj%+桰 $DXu+EE+ C QKJg+H6/ɛ(T!)$B2<3/B?T&: 01 41"85Ygo4?@t"nA٣C?yuEt_  2Bi/OB:jO_kPO9_3Jprod@d0!a////,G3&01_?m01⡜E,>PkExnoQ1. @RoA"~:*/g M @;@)1Cp'́l~h?jt@đBOxOO3EWi{1oCo_goyooIooooD z?ѯk/j*22Ϥ!/3/όUy/____/(́o ́Ձ<яȤPbt¿(eL^  ۿb#5GukZ*Ϯϱd9( t#}}+$'+=-ߧ߹X?=G4*a܁F*a3r_q7CN' Q9 r?88tzG?@}AzĿ%jAOGEp= пO_fzLnU@2C@2b"@@8b?@2BQ?T`S,Dӑ+M"E F ^_olpH]?xNP?:򒪙3$@@o!f1p;`v z[@r~knG_Y_odX/.VNB/+f`/ԅʏ܏K;ro~Tv*SaSa{{2-5pQ0W=[)ʑ֕XQz)msY?k?$g=.aAn”H0BHTu/ɤ;p1erDndt IJW`{B0BMBdMq hp1?ҽ1ұ{ұ Bp#O5O RE@ f_|_3?@7Pn^rj9Д3Yo= oj2i}jskW [Œpbrapd@Q1uAy?<4¿퉑/A7ImO+iHsl! g̞?nSaϜSa!EWi{ύϟϔfxfV!ֿ'q5u !JR5&""*<N`rT?B??@?&f?iE?i{SazOMSa*< )AA4IAAAOOoO_d_UAivkA_l_UzG?;@}zĿ_$_˛AM_qe˟K]bUcJ1CU '9K]oSW=[&ⴏƏ؏ 2D̯ __-GY!]Xyߘ߼ߣ(:L^u: .~V4E0BT)nwωϭϿϛ#4ELC/MKU]O)RIf#);bfbbz6PLҀ_jPP/v]@@-/_I/ / 117!7C_q^f1@\R3"@WWv3 4B KUm}L҅8#�O贗Nk#&!`y? /////S/ve_>/ T^_/^_0qT&Qq4aO&Q&U_{gUOa5p~5eqch+vn6mo5ve\gY1 5koVgv4QA4Kx CT Q⵰2}1&U<~310>EA?1 A uDմ ,4CRa@3?E?4W6U"QOddOh~79RepݞZC8!@&PbtAfF_a-Aǒ חPcn#T 5pqQQ$+ջ+Q'.pP}1Ӧ&RIX ExwAށOO _A_=POWԘ_NHd3jios|;JJ\n;BF@Xj|11?!7/?JS?e?w??h??:,2?@>?O5OGOYOkO}OOOOOOߚߩoQϤ__@v?ԟ?vp$LOZPbK,!w(xuT0!* V"@&&і5151-3%UWTQivP\RmԯO R.V"9%Q=Ѥȿyh T/jĖ3He(!$k +D#\1& BE#5V%6$7j 7nqP[_sݎq ss,iUܔUXE''2U5%28k\ U 3 >KQ__w ;* f@˔r nr @z*<=E#_^c1CBj-(k( TKtn%mfrPnaeAQ,>_'\>>TK c/K/'/9/K/ ?//// /!/?&4Q@fxqJ%ɞi(&/?O/H?zH ?A4L^1lOv,(2@!3E8]YCJaV QYRu=___);o_qf!~id o"1om1EWi{?///A/S/w///////??u!d ?2?z!W!X+R]V???? CL 7MMGqao+MIOEKqPbKuIoOU@ްB?@ưB?Z@Qzoէx`s^P Qiv&^p .@dF FϘߪr}G 1Egym97I<GAM+OquOIbA qtAquc_JQZ>:YR #ܫz[IbbbzpI#5GYp O}@MOOZ$8 D],FC_Q3a!bA//DG///IO/ 65@@#`v!/58cFooo 0Tfx//Rdv/gy쟔?*BON`XaOޟ!O2DVh\n_];a6o'9Kdvs//'/9/K/]/o//////??/?#?HOG?0k?}?;????_ O;_1OCOUOgOyOUOOOOO _-_{Q_c____a_Ba a oӎ)o;o1`3cmݱwdio\n`?nyxݕ({>tXI[mi0j.0Akxe0%a0tcvctyЮׯsVQ28Qq,"qXj|)*ُ}ooozKJ=U]1 ܟ)Q ]o a>q`r>q}'ſ׿ 4`1CUgyϋϝϯϯߏ/ }//?߳//uk*sae/ /ߜ>q?(=>qN`rO&8J\O4_X_|_o*oFG=P>khAc,A,7cZSdx 6WC19s`?88 TzG?@(\?7eaB\(wVE:uNpؿ@ ףp=' ?erX A`r Tc@@jf-?@VC@@c3.>?QUYB+/VBEAe f VBG4[,ApxK? ~n?:PUVBSH3@5@Ax7a @pCYT܃Ь@z@%U(E5_G_Y_k_ބko6o^Gbor_OنЀ¯Hn-@?1#8 T0AA*VBwwb,ĴB-Ѵ'5ҴSH e08M9{m-DG?Y?}=.VBEC1n0AF0Em:sT#[/b1S1"'~H93 EսwE,2>Pas&ߠ߲e@4(A;L)AP{R!_VEq=|eqBy9[! a?a=߂ds!P A 'EeAXEG''2UR&E!d$1B 'R!(ALC1biC14YX4ď֏J,U~HEC !B`%t,{AR3 A?ON0'O9O'ROUA,zOO UB~O.?QmEO1s@RdvKOX/M U7r= p@>/%/7/I//8=! *<N`r?yO&8////-O?]:?L5/f=K??_l/!_3_E_W_i_{_?_____h?//oo1Ő4ac1a?=aqڔJq4 7uea鱡bM}a2?@@UX:{堰u`  ]?jG,ՑM} 9xj?OkѸO._C RdvUωQPyS>l%@ (E !౿!TsY0'i9o??$O+'tPGG&4?BIFXmqfh?"@@v^ R(I:?2DOmq]o $R?@]2R#@@s(A!-uφΏ@_Q!  3EWilrҡ;?@2.=)m9"/4/F/X/j"s._Q///// /??*?????n?o"O&O8HZfOxBw!ۏOEqOO͊qO%_[F_X_j_|___V_]#/ AooSI>oPobotooRaoob"*<N`zJnw Tef@1q dO{ %u񅏗,x`g@0Ƅp9N6ɃNI5H[mŸԟK`?K@N&?AEWi{9¯ԯ1?.@Rƿؿ????&?J?<N`,&Q6$Ϡ pϾŕ]6OM_8;__n߀ߒߤ߶T3% 2DqfxzfooJO.@RdvKbP qWqQCrA$+w?9YYK `f@@r@@nr?Ӑ?PYr5gCQjh=̃?Iy# VX VrG2ijh*XT*_M`_˟qesumd}oPlar renMeJuG2}qx%ĽqQ6 T?qQCT&]rAv_х_ oFx2CG5]K2v2nW@%__Yoo ~Du囌j|֗ˏgDG5oߋLd&8J\n>i3@@ɏۏ#5k5#kןgu0it]yDVhDd'J dѽϯ)@M_q˿U%7I[B/5/Y/}/3ߡ/WMew19?߻n=~b @@(:L^pOOOHO_~@p oi_O 1_:]1`r/o8J\no/"//F/j// //>WND<C,?>?nwE(Ej9I[m?̾c?@hfl50ׄ8׃?Q@? A(EO'KR_LIANO`OrJbb*zp:H#0O_贁NkfQ oo7?oQoco!oooosoQ:tA,`WYAE~ewwDIt𿇏 }&Ϳ~[sj$2e,FSQ.[_m___\E _ݤ1O?7(?CL?^?p???GY???O%O7OIOOo߬OO!_}7[yeaFPQ_ )ߩ߫_ı _ϯᯟ)o_oA/wϛ;"//+/ ?D?.Q.Sŏ?p+.U?U/g/=|@@(rLÖ?B%ΝY@Efdv!)f0"bbGb0BT;f8E4pDAXg_1k1A·8I@E @AXG8G'2Ub V!m$1?B5U 8FB 9OASe#/Vn=/o`hOò\5C!Ͽod?v?E/~HkN??Oa?_|.:AA?/x2 OO1OCOUO@@@+cfšxH֣K OIRVO__?(W3WR_d[x](Lmoooooo(!̯ECΪzM@$(SeD۟я_Ѩ%ޭܠJnט߼݅I@-PA17 7G!"4?n\$׽!ɋ|"@@"3@-?g!c5=yCHZlc2Qc5>j<>kM+sЉX5TmPn uit s !7-/@P-7aaֿ: 0fxϊ?.B?/Hhz/1Yb>tdG EO%O7 OiO .k}ްOSk} Q?_x 3@@.@RdvoooNomaxs/. Q@/} Qf/x//////O/??>?P?b?t???????OO(OOLOpOޟOO&OJZ_#T._R_d_v____{jfk?@___oo+o=oOoaosookKϻo9ρooϷ'AuLprXpe]ȿX؟ -?QcuC;M_q˟kY}7[ Ѹ 0qկz@QIhk7@@kfVq(?Qzл*!eD/3 bbb3z'h#b0O贁Nk9)2oVh./ /91,A1t9195S/)"hx52?(=)O<G)rOEOK?*??#A,+A^#A#E=?@ >_[?&#EO&M_LG9\_/_KOG&8#E9iolm9\:LaZo~Kc@@KbfnqzŸ0c zs?,/>/P/b/sEf~/// ')f//// ??1?C?U?g?%O7O???~v?S#OGOYOkOOOO_OCs_9%_|pI_m_vl__e._oo%o7oIoKaֿ|oa a] oGoo?!K‚NE`tGڿ@4\O(?,A %l5.\U@q urf@@ȕY% b%϶7U+TB!  BA%m.Z//P~p9/7I ,  0L@@J%m.N@Zps-06@zװ@2?>VYc$H<}5Um,0Cm&O-uK& OO}E_&_ ;?PbtEߟ(:L^ ݱ,߶`r:όs߰߹I[m!H7W !Áԁ1!eIPb@dhr3ņk >Aϭd_c ?DjfK_Z ?HI1I3Haq/G7 -(q8$_sU9g/C)` @@43*Q)@@0*R?@қ%2S9U,Pb//{(RC Iy$㸖 8?`"bb_bz@ 8#C0O/NkFF?0?B?T?f?x??HO?C2VoD2^On7Oo[` q$za,5'w 9zazefos 8?agJP\~t+q{8V ʕh~;V}ϧ|Lpӿ l$ďH9ܨrߖ˶ڏ`!3EWi{Tϑ寧"ϑבӟʴn&8J\nr*`"?'DV/̯ޯ[L&8J\nȿڿ4FXϬ%OOυ9LBpfߞ/5ߪ(? +#?G8>j/T1lOM1D@7]Oe%7I[m!3EWi'/9/ //oA/S/e/w////??//??Q=?O?a?s?????0?OO'O9OKO U ݟO QAiOOOHO__$_6_8H_R@o_[____Vf_oo$jbf5oGoYoko}oooooo 1^\ϓf#QGk Uﳏŏ׏Cgy FijG7[mԵZZhhRۯ?@ƃ^\+=UD3[m.`3ƿؿ 2DzϞ[0/$6H߇l~ߐ /x,\&^?JS+j[?>? /TOYMk)A"_ "ǪD5J5vLva"4FXj|p// /`8/6~m/@///o///+O!?E??i?/????Ə?OAOSOeOwOOOA OCAAa O f _$_/aGQ L_$y~Y_Z3 eB?@+Qn3?{2Ɂ?ZiXYuoku=.6a;oMo_jrCu1u/1EPbnQ1Veyear؟t:a39aaoo-o#rYk}2+t~[_m_{LKgW:8ݏ*R!^pAm^p~(Ưد_%7I[mǿٿϕEϹ/{wut Q#/)-Oas߅ߗߩ߻?'9K]?5OYO}@O _/_n43Q-_G5eY :OLO^O.nR@@r3)qnc?Qo%5o"eEfbI 5R.If8=Oa2bfb_bzq08#.0O/NksoV1`(dU/ ?(o0?B?T?Ox????do?~fO +D"q,Q')quoOV_h_OV$x_Od"nf;eroMJ_9x!yAvD!bM/_/q//+u ԕQ /@Qo Z;M_q48o @$6!lϢ)P_/)(s; a;"B/Vr/Z08Z/,>?t??C2Oo ohO#Os_PkO#_G@_k/Zp[m{'ÿտ Te/ASewωϭϿϯߏ/}/@/=߳//s!WprYdr d/ /O2?(=N`rO&8J\O4_X_|_o,o +Q+U,>@Pbt-`?@g//%/7/I/[/m/M?-/c/Q?*mYnh>?t???+QM?p+Q??O!O3OEOWOno{OOO!OOOO{_/_A_S_e_w__po_Mo_7_[o=oaoǿ rl-oo e Ry8U@thr@hr/@@@@2m???Qrq:AJۀg40eۀ ҹb~#2` 1.Cusoπe40 T82niт ]sOLApUSCpD`2PEyt߽3!T453uc=RCpTmINԆğ֟蟦7&Ij|ä,RfhҿVF6Q 俞5 W܁,倨4-`"--as8qda:#qRϠd;幅duq(8ZA!@$&%?$?@Vrf @4ta;/樧UTtO.O?6zIqҎS8߹BaԢf65 6 Q}f"Fo  5`3CY%~OGo/RCUg "bb_bz{ b#lu(#30O贁Nk?9$;%|yAMg_2KzWiXT'g'2U rf%!!t5 f7!//._6/H/Z/?////{/~2?TDVhzuğA@*A81qq,w quy?`OrO!DO?o\æOO%u VOTRD%𛷟w$AS@ewB___);_oqϧxPq ,sUm?d;la9sK ɏۏVhz /@/d*?W=[PTXQzPm .$h"An:4E/W/i/T&^/$"S1 4xei4Ɂ$' ,,!Gp~dW7%i4q>"i4 q:  : &?=&11p115$p1ɁLg%C?mWyQ9#ߪߌOzw%y=+"$ͩ3E/ ` 1KJ!P!!)Ώx UA/4YgZfCnnkhZoWa__ oo.oodo"No @oooo@x11+O=OIqZOfOxOOOOOOOO__,_"&M___q_______/ASew~5ouo .1CUg>o(2Y̎ªό ߑ@߶R63f*w@@0f?@$rw~܏"hĕ(:L咅##0O贁Nk3ĕcuQwmwG T/|q $,Oٿ3؄'.41 ;}4l1)=?9'5v,m7')??h;/?gc$ H|OHT !)D<Oq1$? QF_"4FNڂ#l~q254 $gFDfDa +=Oas_//@/'/9/K/]/?////>/?#?QO G?k? O;d,O?2?ErDoeWbHm?? O1@OǏdOvOOOOOQQOQQZ _ ١aa9_K_zݡs]>aT,\yY_M:fefZ+XnX?ih&o8i,\b,}=~aQooj&ix7yjyAk1xy5Q#|P'umfrz d3+0]TfxF١߯١ q4#uGYk)뮵~"pFaa__攏ɯӟ[`.Z?oGd4#Q T0a\4e >Kѽchߞ8Th?@zG?[7drv(\?7@=\?6 q9KhqUT TP8R7?@?t$P ~#kfarri#JJ\ϭom۹+re  rҜU.t/i?,pOSEv߈XrҪ[AЦ@Ts%(\[ pypsa$UGa`@z5P@OBUOgN-0/&/asc?4rގ&_K6y0Y_k_U__%A?N?T8*Sdr 1 1UU-zdBy$Ҵ[!W=[[aeXQz[mOa$4o..trn!oHoTEF/tэ1tBeH0HCOPޤwiu!!@۱|ߟ۱!X$0LK Kџsy_P_b_t________oo(o:oK^opoo@oooo0ɓg7 [mW3$]߁ˡŏK 0BTfTڹ ڱT‘ ܟ@+.l$*z޹HX4 UeZ+Xn-X?$̯ޫ=)iKȅjȱk0ۑ*mfr nad ey~>q -񓿥ɿۿ<#5G+o./Ϡ/H%7M/6>1!^ ???$O(:kO‘!+=!HOl~og!56H7Q$zVQ5APbtooo:LB1Zidtoo2!}!!/3/E/W/i/{//O///{/ ??/?ՏS?e?w?????O?-d?OVWXb]2OzOOO\CALV!OONb(K+UA4-|NKN:q>#UnY|Aw@̏JPR叇PO{ %發J7>J{]:׿@ʏrpJN@@z3.uptJo[ρnπUK_C._h}ζէK< u`:œ7tKR?@Nr2rqǿ?@Imbkտ?PUxW<̰TFb bgBu tN`tz s; Fb X#<0{oGzAa?'HnBE^e!zsGH/REJ9zsb [[PU8pNcUi{vJTQQxUuu` p?,K } Ifo\soasN(r7IbY/UatIuPÒYIfSmU59:u50 ayc/`6q#QRd$v+zs'$arP,,x' zs&?bAtLs!qu+Y,i_6 U*@XU?Qr9!SauyseU6q?If.a3oEoWjbfbbzFbbboD壅O负Nk?6q5qau]1xM+r ib],](Xď nrooA$P/Tt/xxUt!Gj}! QQ,S7aLyQU_|6/bu{6Ee`+/x-44//'͏ߏ/-W/o'9x?"M3E@DEUFGHIUJKLMUNOPQURSTUUVWXYUZ[\]U^_`aUbcdeUfghiUjkUUUUUUUUUUUUUUUUUt4!@& h&C-tZ A;X@؈ ERH<(EȈ ^ R\@Sr3LLD?DES,.TD$FSk.TU1( UO"D&aUAUNj )h- *T-- U z ;v -,,,,,*,,,,/&,*,+,,,0,3,4,9,<,=,H3K,L,M,53R,S,T,V,Y,Z,],k,l,m,o,p,q,t,u,w,z,{,g,,,,,,*,,,,OOO`OO__Z -ɉQ -)-H*=(XSY~^EQ0_1oCoUoX!B3#IyKg?fP?)*b3bbz0@WafGArial UncodeMS{ (  R$fSymbol$67fWingds*7 fEArial"z@D/ R$fSwimunS$fPMingELUw.6UfMS PGothich@ $fDotum"|i0@ S$fESylaen  $fEstrangeloU dsa@`9$fEVrind1a8MR$fEShrut1i$&<fEM_angl$$%>fETungaH"@&>fGSendya{ (  R$fERavi"&5<fGDhenu|"{a (  R$fELath#&<fEGautmi &<fGCordia New{ (  R$fGMS Farsi{{ ( _ R$fGulim"|i0@ S$fETimes NwRoanz@D$fDTahomz (  $ fGj ( / R$ {ThLBh( .B|TV %BlT{ 5B\T 2BLT 3B<T!GB,T\!:BT!7B T!=BT "-BT7"'B T^""B T"#B T"9B T""B T"9BT7#&B|T]#'BlT#CB\T#>BLT$:B<T?$GB,T$:BT$,BGuideTheDocPage-1"Gestur Fom aRow_1VPXLocalRw0VPY ShwalowbckSchemN aViso 90Co}nectrVi}so 0Viso 01Viso 02Viso 03Viso 10Vi}so 1Viso 12Viso 13Viso 20Viso 21Vi}so 2Viso 23Viso 50Viso 51Viso 52Viso 53Viso 70Viso 803D-LineBlock }Nrma3D-Text3D-Front3D}-arkBlock Shadw3D-Light$Block Hight$Vanishng pot ScaleAntiScale&visVerionShadowClr&ShadowPercntg"HighltwCoor,HighltPerc naeDepthRow_2 Row_3Row_44Title }bock]crpa1(Borde Anota in*Borde tchn]ial1Pa_geMrin4Staus brdi]v del nPixelTextWidhStaus br2Text bo (singl9- e)Enabled"5 ruledcoumn*Marketing WNoml1Rectan7glHairlneRectangl.12,Reufrnc} cta7glTextSi zBasicRectangl.14Rectanwgl.9Rectangl.13Rectangl.16Rectangl.17Rectanwgl.6Rectangl.19&Shalow bck.20Rectangl.24Rectangl.25Rectangl.26Rectangl.27Rectangl.28Rectangl.29Rectanwgl.7Rectangl.31Rectangl.32&Shalow bck7.3Rectangl.37Rectangl.38Rectangl.39Rectangl.40Rectanwgl.8Rectangl.42Rectangl.43Rectangl.18&Shalow bck.41Rectangl.47Rectangl.30Rectangl.49&Shalow bck.62Rectangl.51Rectangl.52&Shalow bck.50Rectangl.56Rectangl.57Rectangl.58Rectangl.59Rectangl.60Rectangl.61Curved arowFluid power Curved arowArrowFancy row&Holow Ucnet2&Holow Ucnet3&Holow Ucnet1"Varible rowHghtFactorAngle,Universal conct r$Co}nect_r ArwSide - sTextPosArc: 3pt.Dimens oArc adiusLPrecLUnitsShowUnitsLUnitsFacorFormatSringLength5TxLengthLPFStringLPrecIndLPrecValLUnitsIdLUnitsValShowUnitsIdShowUnitsValuFetInchFeetInchInchPr eExtens7io Arcradius.26$Ar_c -gaphial*Line-a_rc o.ct rArced }arow.Line-c_urv oct r4Line-c_urv oct r?.31ScaleFctor4Line-c_urv oct r?.324Line-c_urv oct ro.34Line-c_urv oct r?.654Line-c_urv oct r?.734Line-c_urv oct r.7Rectangl.95Rectangl.68Rectangl.69Rectangl.70Rectangl.71Rectangl.76Rectanwgl.7 Rectangl.78Rectangl.79Rectangl.80Rectangl.81Rectangl.82Rectangl.83Rectangl.84Rectangl.85Rectangl.86Rectangl.87Rectanwgl.8 Rectangl.89Rectangl.90Frame*Borde Pag Numb&Borde Ugautd&Note bxcla5s iMargin NoWtebx5dcBordeBorde Txt NoWtebx5noBlock&Block abeeft(Block -tplabeBoxTypeSizeFactorTextHi7ghRectangl.96Rectangl.91Rectangl.92Rectangl.93Square&Shalow bck.97 Rectangl.1 0 Rectangl.102 Rectangl.103 Rectangl.104 Rectangl.105 Rectangl.106 Rectangl.107 Rectangl.108 Rectangl.109 Rectanwgl.1 0 Rectanwgl.1  Rectanwgl.1 2 Rectanwgl.1 3 Rectanwgl.1 4,Vanishng p}ot.15 Rectanwgl.1 6 Rectanwgl.1 7 Rectanwgl.1 8 Rectanwgl.1 9 Rectangl.120 Rectangl.1 2 Rectangl.1 2 Rectangl.123 Rectangl.124(Shalow bck.125 Rectangl.129 Rectangl.130 Rectangl.1 3 (Shalow bck.132 Rectangl.136 Rectangl.137 Rectangl.138 Rectangl.1396Line-c_urv oct r.140 Rectangl.1 4 Rectangl.142 Rectangl.143 Rectangl.1 4 Rectangl.1456Line-c_urv oct r?.14 Rectangl.147`3|L-E3L-G3L-G3gK-%G3 L.E3DiB%. E3$R1.G3diBL. E3ZX.G3dRw.G3R.G3R.G3$R.G3dR.G3R.G3R/G3$R)/G3dRB/G3R[/G3Rt/G3$R/G3dR/G3R/G3R/G3$R/G3dR 0G3R#0G3R<0G3$RU0G3dRn0G3<L0G3hK0"G3lL0G3R0G3L0G3ThK 1"G3R+1G3hKE1$G3hKi1%G3L1E3$R1G3dR1G3dY1G3tT1)G3tZ2 G3T>2)G3tLg2E3"Lw2E3"L2E3"L2E34B\21G3T"\2)G3=\3+G3^,3G3`H32G349Lz3E3d*`3G3d3j3G3}33G3?L3G3Z 4%G3`14-G3w^4G3~z4G3T2Z4"G3`4*G3u4G3 (L4E3)Z 5"G3\v+5G3 /ZJ5"G3LZl5"G3<,Z5"G3$m5G3Z5"G3$`5'G3\/Z6"G3*Z:6"G33Z\6"G3T7Z~6"G3Z6"G3+Z6"G3$w6G3?Z7"G3t5Z%7"G3T`G7'G3d"Zn7"G3Z7"G3*Z7"G3 Z7"G3w7G3 Z8"G3)Z78"G3@cY8"G3ԋ`{8'G3Z8"G3Dsc8"G3LZ8"G3d6} 9'G3$0Z/9"G3,7ZQ9"G3`s9'G3BK 9"G3OK 9"G3DUK 9"G3DPK :"G3EK ":"G3tK D:"G3xK f:"G3dX :!G3LK :#G3m:E3do:G3dH :&G3$H ;&G3H F;&G3GK l;#G3m;E3m;G34m;E3$H ;/G3\GK ;%G3Of<G3$m1<G3$eI<G3dyae<G3Db<G3 m<E3, m<G3Db<G3mK <"G3eK ="G3Fb"=G3D m?=G3FbT=G3Gbp=G3$Hb=G3DHb=G3dHb=G3dvK ="G3$kK =#G3Ib >G3\ m9>E3t mG>E3JbU>G3Jbo>G3QK >$G3|cK >&G3H >*G3a>G3rF ?.G3U L?4G3\d ?G3$U ?4G3c ?4G3L-k @4G3=k ;@4G3, k o@2G32Z@"G3xc@"G3dc@"G3dDcA"G3jc)A"G3ucKA"G3\cmA"G3xcA"G3vcA"G3CcA"G3ocA"G3LWcB"G3,(Z9B"G3Z[B"G3Zc}B"G3<"m B"G3t:m B"G34 m B"G3m C"G3m 'C"G36mICE3`YC,G3`C&G3`C(G3t8mCG3m C G3ĉjDG3nDG3m ;D G3j[DE34?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~U U UUUU U!"#$U%3=?UCmoyU}t4+!@& S`C-iBa A%t4 iB_`a A-DJh j7AJ@JSaCR@ la6RH<(H<(JEdKSb RE҈ b R{ * g"4FX,h(@( ! ޴i ]iK}tphfFLWO T  O`.,WO;6dGu֔v<OkJV$51nS!5Q)@S`rV'h1FS dHS$24ISKT?1 aw*TD?JSbH%a!mondrian-3.11.0.1-R/doc/architecture.html000066400000000000000000000413671261646570300201030ustar00rootroot00000000000000 Pentaho Analysis Services: Mondrian Architecture
Architecture

Layers of a Mondrian system

A Mondrian OLAP System consists of four layers; working from the eyes of the end-user to the bowels of the data center, these are as follows: the presentation layer, the dimensional layer, the star layer, and the storage layer. (See figure 1.)

The presentation layer determines what the end-user sees on his or her monitor, and how he or she can interact to ask new questions. There are many ways to present multidimensional datasets, including pivot tables (an interactive version of the table shown above), pie, line and bar charts, and advanced visualization tools such as clickable maps and dynamic graphics. These might be written in Swing or JSP, charts rendered in JPEG or GIF format, or transmitted to a remote application via XML. What all of these forms of presentation have in common is the multidimensional 'grammar' of dimensions, measures and cells in which the presentation layer asks the question, and the OLAP server returns the answer.

The second layer is the dimensional layer. The dimensional layer parses, validates and executes MDX queries. A query is evaluted in multiple phases. The axes are computed first, then the values of the cells within the axes. For efficiency, the dimensional layer sends cell-requests to the aggregation layer in batches. A query transformer allows the application to manipulate existing queries, rather than building an MDX statement from scratch for each request. And metadata describes the the dimensional model, and how it maps onto the relational model.

The third layer is the star layer, and is responsible for maintaining an aggregate cache. An aggregation is a set of measure values ('cells') in memory, qualified by a set of dimension column values. The dimensional layer sends requests for sets of cells. If the requested cells are not in the cache, or derivable by rolling up an aggregation in the cache, the aggregation manager sends a request to the storage layer.

The storage layer is an RDBMS. It is responsible for providing aggregated cell data, and members from dimension tables. I describe below why I decided to use the features of the RDBMS rather than developing a storage system optimized for multidimensional data.

These components can all exist on the same machine, or can be distributed between machines. Layers 2 and 3, which comprise the Mondrian server, must be on the same machine. The storage layer could be on another machine, accessed via remote JDBC connection. In a multi-user system, the presentation layer would exist on each end-user's machine (except in the case of JSP pages generated on the server).

 
Mondrian architecture
Zoom Zoom
Mondrian architecture (hand-drawn)
Zoom Zoom

Storage and aggregation strategies 

OLAP Servers are generally categorized according to how they store their data:

  • A MOLAP (multidimensional OLAP) server stores all of its data on disk in structures optimized for multidimensional access. Typically, data is stored in dense arrays, requiring only 4 or 8 bytes per cell value.
  • A ROLAP (relational OLAP) server stores its data in a relational database. Each row in a fact table has a column for each dimension and measure.

Three kinds of data need to be stored: fact table data (the transactional records), aggregates, and dimensions.

MOLAP databases store fact data in multidimensional format, but if there are more than a few dimensions, this data will be sparse, and the multidimensional format does not perform well. A HOLAP (hybrid OLAP) system solves this problem by leaving the most granular data in the relational database, but stores aggregates in multidimensional format.

Pre-computed aggregates are necessary for large data sets, otherwise certain queries could not be answered without reading the entire contents of the fact table. MOLAP aggregates are often an image of the in-memory data structure, broken up into pages and stored on disk. ROLAP aggregates are stored in tables. In some ROLAP systems these are explicitly managed by the OLAP server; in other systems, the tables are declared as materialized views, and they are implicitly used when the OLAP server issues a query with the right combination of columns in the group by clause.

The final component of the aggregation strategy is the cache. The cache holds pre-computed aggregations in memory so subsequent queries can access cell values without going to disk. If the cache holds the required data set at a lower level of aggregation, it can compute the required data set by rolling up.

The cache is arguably the most important part of the aggregation strategy because it is adaptive. It is difficult to choose a set of aggregations to pre-compute which speed up the system without using huge amounts of disk, particularly those with a high dimensionality or if the users are submitting unpredictable queries. And in a system where data is changing in real-time, it is impractical to maintain pre-computed aggregates. A reasonably sized cache can allow a system to perform adequately in the face of unpredictable queries, with few or no pre-computed aggregates.

Mondrian's aggregation strategy is as follows:

  • Fact data is stored in the RDBMS. Why develop a storage manager when the RDBMS already has one?
  • Read aggregate data into the cache by submitting group by queries. Again, why develop an aggregator when the RDBMS has one?
  • If the RDBMS supports materialized views, and the database administrator chooses to create materialized views for particular aggregations, then Mondrian will use them implicitly. Ideally, Mondrian's aggregation manager should be aware that these materialized views exist and that those particular aggregations are cheap to compute. It should even offer tuning suggestings to the database administrator.

The general idea is to delegate unto the database what is the database's. This places additional burden on the database, but once those features are added to the database, all clients of the database will benefit from them. Multidimensional storage would reduce I/O and result in faster operation in some circumstances, but I don't think it warrants the complexity at this stage.

A wonderful side-effect is that because Mondrian requires no storage of its own, it can be installed by adding a JAR file to the class path and be up and running immediately. Because there are no redundant data sets to manage, the data-loading process is easier, and Mondrian is ideally suited to do OLAP on data sets which change in real time.

API

Mondrian provides an API for client applications to execute queries.

Since there is no widely universally accepted API for executing OLAP queries, Mondrian's primary API is proprietary; however, anyone who has used JDBC should find it familiar. The main difference is the query language: Mondrian uses a language called MDX ('Multi-Dimensional eXpressions') to specify queries, where JDBC would use SQL. MDX is described in more detail below.

The following Java fragment connects to Mondrian, executes a query, and prints the results:

import mondrian.olap.*;
import java.io.PrintWriter;

Connection connection = DriverManager.getConnection(
    "Provider=mondrian;" +
    "Jdbc=jdbc:odbc:MondrianFoodMart;" +
    "Catalog=/WEB-INF/FoodMart.xml;",
    null,
    false);
Query query = connection.parseQuery(
    "SELECT {[Measures].[Unit Sales], [Measures].[Store Sales]} on columns," +
    " {[Product].children} on rows " +
    "FROM [Sales] " +
    "WHERE ([Time].[1997].[Q1], [Store].[CA].[San Francisco])");
Result result = connection.execute(query);
result.print(new PrintWriter(System.out));

A Connection is created via a DriverManager, in a similar way to JDBC. A Query is analogous to a JDBC Statement, and is created by parsing an MDX string. A Result is analogous to a JDBC ResultSet; since we are dealing with multi-dimensional data, it consists of axes and cells, rather than rows and columns. Since OLAP is intended for data exploration, you can modify the parse tree contained in a query by operations such as drillDown and sort, then re-execute the query.

The API also presents the database schema as a set of objects: Schema, Cube, Dimension, Hierarchy, Level, Member. For more information about the Mondrian API, see the javadoc.

XML for Analysis is a standard for accessing OLAP servers via SOAP (Simple Object Access Protocol). This allows non-Java components like Microsoft Excel to run queries against Mondrian.

Mondrian included support for the JSR-069 ('JOLAP') proposed standard, but this support was removed in mondrian-2.3 when it became clear that the standard would never be ratified.

MDX 

MDX is a language for querying multidimensional databases, in the same way that SQL is used to query relational databases. It was originally defined as part of the OLE DB for OLAP specification, and a similar language, mdXML, is part of the XML for Analysis specification.

Since you can read the specification online and there are some great books on MDX available, I won't describe the full MDX language. Mondrian's extensions to MDX are parameters and modified builtin functions.

Parameters

A parameter is a named variable embedded in an MDX query. Every parameter has a default value, but you can supply a different value when you run the query.

Parameters are declared and used by using a special function, Parameter:

Parameter(<name>, <type>, <defaultValue>[, <description>])

The arguments of Parameter are as follows:

  • name is a string constant. It must be unique within the query.
  • type is either NUMERIC, STRING, or the name of a hierarchy.
  • defaultValue is an expression. The expression's type must be consistent with the type parameter; if type was a hierarchy, the expression must be a member of that hierarchy.
  • description is an optional string constant.

If you want to use a parameter more than once in a query, use the ParamRef function:

ParamRef(<name>)

The name argument must be the name of a parameter declared elsewhere in the query by calling the Parameter function.

The following query shows the top 10 brands in California, but you could change the Count parameter to show the top 5, or the Region parameter to show sales in Seattle:

SELECT {[Measures].[Unit Sales]} on columns,
   TopCount([Product].[Brand].members,
     Parameter("Count", NUMERIC, 10, "Number of products to show"),
     (Parameter("Region", [Store], [Store].[USA].[CA]),
     [Measures].[Unit Sales])) on rows
FROM Sales

You can list a query's parameters by calling Query.getParameters(), and change a parameter's value by calling Query.setParameter(String name, String value).

Builtin Functions

The StrToSet() and StrToTuple() functions take an optional parameter not present in the standard MDX versions of these functions, describing the hierarchy the result will belong to:

StrToSet(<String Expression>[, <Hierarchy>])
StrToTuple(<String Expression>[, <Hierarchy>])




Author: Julian Hyde; last modified, August 2006.
Version: $Id$ (log)
Copyright (C) 2001-2005 Julian Hyde
Copyright (C) 2005-2007 Pentaho


mondrian-3.11.0.1-R/doc/architecture.jpg000066400000000000000000001737061261646570300177220ustar00rootroot00000000000000JFIF``C    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222,!" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?  ZZ.yqڤ?_Ԛ~k@Jڭ3 Я/&B<'Bޢ'^U,l"-eni"`d䁁u?so_9x3zσsk˩Gel>_sI/۽-;}+RX.w\ZブEi tҴ :grCk01{׍Z>7 twoˢM;?=^.Wی6q,?څ͍I% 犯-84ȵ)l<.2;#0@8!txƺ@ygutىu{U; 9䶼ŷwɜbdt/3G@-{Xnzgψ)[L [>+'IV|-UkGq_=?~]8i7V1y6azswcܵ;/-е=)< Mg>˻uyddg{q3':ՏWψt ey4ݱz0;ƩsxrUarlm;r1:oeq&;W$8SI%X~մ{;+Y"Jȩ悛z?٧Oox[ 6wl zW GW_G!_E|_MoQT# Я/&B<'Bޢ0 / i ՄVeާ1]Y[$r!Skr:I}r;PYϢ䟠 :NnW0^5/O2voˏ-<瓜Y'8&E,g̎-XgpS9ϽyO *o[XCejɈNϦMi|ec;m6影T/ zelͧ.  m՘VzWV6cHۧ1=Gw*;GӼ1hu0ͫvȉ݂>k[i>q<)ѝ0nx;EǦ#Ga9ɉ:p'ͥɹIvDeV(r9`{ _x+ >>jt +QɠPm'A6٥S 399N2[I'~p\O^+oA'29,u'T$]_ĹQ8E L[[ݡ{iAh0*:[0UԬ' ןּ_5wNæC&3sgJ=s\M h]D..qr'`p:g DQE[5dY~wjsik BB&@,P pv%̖PCvUlon]CnNv#0|_qu pouYlnb-K 9rH9/d^,7Vgc˹ S̑o,<%nK:y:02>lv|8sjc 8"sǚ#ߗ `{ ntQEIAEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP'aI?*Iק]FȖb's!A10[XwqBxq`&  *ԑ-76]m:dhrFTⳗ:2xsi; }'n yz֙ ,nqpz㚃rD1Ը)eg$0_J9YWDԭu{v|%"6:j)mBjD1Nz;GS #kƑA"g֑tCqRAq4s I] ^ NEҥ9{mr\ {sa5^.- '9I峑g=PLe%8m( _pdߠ&dd]#qsq}zj5kDebb'*y9YkѼO06)w,^5geHx"Mҡ 2Y@2!?,6p.6 ,$/Lڛ :WE,%hFrvphAfA>𮇩GiXSWt-B׻EÇ6y,#ӭbnILhP13ǘ4x[`W3*npbqN֥ZR>=G K%؎l?5&6y6'<zNc kC0I:ahFpVfhZii a8P4o&^OxSX}3MT$"+Ɵ"?)FP.deBI&쿵o+we;6vyT[V;th $^{r1#&B3731TO(!<:;PKʖ0V7 QEwupײܴ3.A /[4QEQEQEQEQEQEQEQEQEQEQEQEQEQE7vs ͳ6<ˣ 2#9ozɟwkqu,4}T(X<'989&z(-!E9[}HgmEEu6d\|c`y-YXķ pϸ.Xn$d8ڊ|stm }O 1;^+nO 4vH.x]cF|d8= Aazcw ;!Fb>^]@9K[m䋸΋ɺ"6c"Xr'=A;h]*ImB_C哴?1L;Gh",f 3qwl@0xP[:\K4 yDžqO6 vU) \9qL/-%q})>h",f9+-pھb-4`}(}ܨo~[[Dv8ȫ$n;wl$HAeًq 1\/Ҁ&mK|v3Swl$HAeMEB/-%q})>h",f'7vDD*[=0;/-%q}(j*j'h0c>7vDD*[=0;T"ًq 1\/҅eV[mR`A@QEQE@ª Yq@Q}?z}){hѼu D .zd cIdluJno%" P/?^_\W1Qssz7r󮁯m4A\=`:?;ygҚȷPLna Ojm4A\t~w7tOKE@ȷPLna OjG%X;]u sşHko@va;0yG<3@P-F-%H0چXF#kp{T_iVsh[F[J&70as' {huG2 6: 訾yx=>սhEcs =2{PT {huG2 6:}?z}(Z*hEcs =2{P׶HP|c czy]shQ P-oM#IŽhEcs =2{PT {huG2 6:}?z}(Z*hEcs =2{P׶HP|c cz0yG<3M[F[J&70as'OX~4? MZ{huG2 6:_\g`.wnTǧҀ7`xʤ׶fPD]$\ϥH׶HP|c cz0yG<3M[F[J&70as'OE@׶HP|c cz2 J-Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@6cH7 XneyRSL6YdqЌ6;^{Oz<;o3dمҒ76dw0(̤y}jx sI͖եUrUB3_,!xS6³JLA An\mFcr}H?m%llk(z98K!chd yy};;GL'8-KZ#)۬C q!N-^<5 OOюX]c<{S<3cr#0]`Ƽ2sShvh'%'@#)~FSSF[ 1V E d pN}SU% 6GٛfL~`n):Wšz[$@n*tFC)cu3D~Ӣ0$E@ڗj>M_Dy!A͜ĕ۸Nqz(-0 T92s֨DG $:/ʄUSUۏr>am«2F0d',=N1Ewao?0FӍ$6@L5E"d9>o'ح B/僸'1\TP&Ȓx[`j"d9>oMEA+C` gȒx[`jY)r-@C-V K}&Blb4ea]9zIf<,Feye ǹ=ѣHc\TfԴ5 Fu;Gr ʧwX9*z5;9Rnyq-:zH}"..29*+j6Rhەh?K 9sgY']lgY']ljξ+uw ZM9YE6>wIh{d;wH"#Cv6?stCv6?skSCD_gwX?! 񳊹eu7lZ)}N3Ͻ8-B;o9@8G#Vcx#ltCYZ4iZQ3Lc ; ,yӌj@YњDwHR1qTvﴐ$EG##efH[o1̒cec˷dvgpu4}_GtH`C)Ι#$wAok6Y[NBR;6 ]t?]$?͏\?]$?͏\ZMSC$Q۾@Ojhr '|!<6qUzIf:IfٳOXl<8#FAehkkG6:dwKDKxc6)8V]OnyncY'i AE#YZ4iZQ3Lc 1Z8wLuҧ mbkGltC[XiAnQ3J.=p;V}kUACMJ;Zu/]FBz h,"Đ[,l*pq>Bkk#h-&vEjwi!(Ellm3JVFְLSjеlN3)tt g(Ш~ŶX5#r\6:dw_?U*kk#h-&vEj>%X3^T IW#(܏~m9!Z{"KAF#OB޶ţH rQpڳ /*CL 1H[4ު2+:u4RW&2utѵF%;T0ګ,+F7c#JPF>ZbC*O KGU[7 /l ^]((((((((((((((((ju?VDڮ6wy*QEQEQEQEQEQEQEQEGYH_Jgۗ 0W3IFI^(oڿ>Jy?mq=8UGDHt΅mbTi]azds\"oo&$~m~mrV<5h̓sON3Ͽ1ik+6Ƈ#:_1UvXܞq< n`>I!F-(ԟQQ#p Ia'6`5fO K峵``Ps,Qz3^α (/)ep9Am ti,$@r@n-Qq$P*"@T(\$*kZG'x .ֈe@ [N3Ͻ;5d Jy<؜3VUXcJ FpK'NY%(4.[@Kh$msЃN3ϸ%ٴ嵶;Hy<:o_#Ҋ n&''cVr7-'DUJ4Ra?闸ޮǫ ϝ2IPFW8GSvV/,PA{Ö7,KQgc`<{/)~e\<cp*m3X]|E5C%$hQUy"c+'n܏k7^6+aHg`q $`㻋FKK%Ls|uJ\0, {kfGyJ(|V (JIWWUPE W}\ W}@*]TUf|VLC5сp!@#COmo,4)D/k¬ʙK~@NrquιrEpM}d`f kIu+mڋgwF?vNJ4m(i0̀d [D(TLy$-0j0_NE$SȪX9P !C0Uɐ{w>bs`ր:m @jka82H3"J;FMC>acvi 0kzEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPu]=7Ml|?ھkǿt}V7no}P f#g-VQFPGErٚ:z?5ue\fC~,ckY=uW!ߋ/G3XZ_@}fk8_ꞡ%SP]\GowEPEaxKKKq2*"ql@`W;\ ofC~,:+?qֿŗ#ߋ/G?5uefk8_Md`qٮ{jPxM 3aڀ/QEUAӤ&-Ŷ)QjU~iShӎZJGf[yc~6?^K67Gk<Ń$9\|zd^v.uٟ}Οv.uٟ}魜Rœb!̖?s-Rœb!̖?ss˷dvgs˷dvgzkg:8Ԯ21X_s%\g:8Ԯ21X_s%\\gY']lޞm^ؐVyv16EZjWXSD/9} }<gG)1bI 7xloxy; s +꺔I <KȱL-ĀdƝwܗvm;j-ʓ^˷dvgs˷dvgzki:8Ԯ21X\c>Ύ-m5+)̌V"c>:Ifa<ՂI*&0$g{UeZjWXSD/9}ųZjWXSD/9},Az,I ̣ǠjY%(Ύ-m5+)̌V"c> ]N[[c̓6w<=(`2r5`[#KOyrz;Om J(3 @7?5\ֹ-l{Z >.Tw\Dyrj4m]?:*+ڻWG3h_]pyݫڿR}k wJj\k$|#;ƹ??訮wj4m]?:*+ڻWuQm]?\IxȠB-_ "?çQ_t3S[ @љP6 nrhQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@W okRcuu,Oe9,W&;+*h.OЩ&: +*h.OЩ&4&tyȾf+=X,*GsP3VP˿ ,`gU5FuO 6XX4 D\ ;ghhz*9̱rrs@QX%3.!`w98A].{Aqu; z nFGކ5ѯM8oc.[`$:Tg3j9Ix#<rCڀ,V/ga];K!?l+d4Es6(5 qsc魙G/ ]1|8v/ Y Z'>'5smgqwg$,oi%$5PSTGwAŰ`H8l'- 9lL"HRȡd6OE֮virȾTI%v_֐y^I);l k{O {;Ƭ.OꅕZi%6%J'3Ԟv#Ѳ3IFIa>.-tMd`q٠ TQEGDHt΅mbTi]azdsT_Eҥ(,8s#@&NN8 #IhP 2ٶm7bY?N*44,pdm+F0q@eZ;}A∓yJglz PQl!\sWEҤ(d,(s#@&NNю2}*O߱[}]}gq>Tz"W?\q>Tz"W?\4,pdm+F0qCT e|h1OQA*=M}D+}iVANs9Zٶm7bY?N*44,pdm+F0q@*[ o95xFȪ/RC2io9R''h>kclnXyK1P'Й7%[BI"5[i=pMGq>Tz"W?\zz~}.[ VkK4+~ퟎIBvt!47H) cJq>Tz"W?\q>Tz"W?\֗mMحz.>3ӊ4M*8%4%\#[u 鑌PBք.#MIpzB=T e|h1OIa{+oK񏽌*h"h̉;J$ ێիTSDңXLXe5PRC2io9R''h>nX&T0{8f85<)I}G6Vk=gy{F&e. |t(z PQl!\sDz PQl!\sWEҤ(d,(s#@&NNю2}*O߱[}]}gq>Tz"W?\q>Tz"W?\4,pdm+F0qCT e|h1OgJm@L0GiiZxI PɦYPFHLdPElG"?_/߱[}]}ghTpKiK 2F#8 ?[ElWEҤ(d,(s#@&NNю2}*O߱[}]}gFvv̒NY0 lU4,pdm+F0qCT e|h1O^Y\<ťB$!gٶm7bY?N*44,pdm+F0q@[¯>I PɦYPFHLdV?(Zbt!47H) cJƊU@,pOEQEQEQET7w1YOw1"(#i'jSUe= Py!HZ"Hӕ@d67m!d&>lckÍ> O7T9oW#hY(T<ig yPb+2Kr=9=sh^/! |S!ioA !7qcbr12&%68$^&"|Dž6׉ĝ2sO.n5aƟv`'Y 7E$!v;?ERkÍ> O7S]Gt%&*j1o7}hQ@Q@֫v͵--RFkc!2o|T[iPiҪyx&UNXu=\H ldAQ>cǹMWNk¼ʌN23?S@tQEQEU_nz|}+ş_Hkb"mWOwlli; x[¯w4v4Bx$%F8#}>-$[ȵ baYʌC@96G^\xGNH̹4|1)>kv1Dڼk%<$>`}`Qj> iUP[[`B<|O$1׋A&AI&ȞD°“";5L6kygyͷyp;AQ$k ܬȮj2q=Q88#5(OX>/ !wMOOe2~QӒX'mt,4!?L?$Tŕ †/2L8%I5Es8v/ Y Z9`S'LmCb –ׁn \\\K:(2${ܱ6m0y5ZRJʪXlie'9tm֟EVM\G6LE@Am@}O6=eAO >i?P@to5yLqpՁ<1H%Xk-os4mdzP( ( ( ( ( ( (9~'4#\A?"+Zi" E/.^_)9&#$ y$gtuun>-'faΑٱ%TbcAfԵXUmViUud,(@R> P12}x$$C̎18(f# S:M&}6MwDKcv~F}p3CzTO#ӆ;`H9xQ)@!Svv8~;R{J F DPQJe@;7+(t0 6DCPT̢MJ&jE!s 1ϩsQL(]r)uD[yaHϩ\@cuI@1|iilor?\w2>n^|G*s#zӻVaJݎNO=pG*s#zw2>n^|+\3rʆ\y^?-ȍۗ/E@?-ȍۗ/E[~ i!I<&S$] @IhzX GڼٖL9L6n J}F8 QEQE+E[o?z+d{5wUi'Td8uQ?L!I<\#,1Ms<߶2}?1}}뙛SnY/&Cp|̪Б_Al䴋fdfH4dlR.0@ˠt qy!YA\0ʇQRvϘ9vW6&-Q$2R<CNc\PGsZ mz'Lps#)9m5-̟hJ&Y\y<qIRm]ΕDp)N{'{OGq_;<wos mMm-[ά !SYIS@2<צqMPA7ld-e巚mm) Ε.5#o#5+(#b vP"8JXB'=JGQ!+n~Q|A6푔s+ n@+9EF2{OGq_;<woS.& }T 0;`浫ce2M|s(.$;aO7O\WjLrH8ݏl[^m>I|ݾjC;xy%,!glnpo?^*ld$g%cviqy!YA\0ʯQ@^}DG KY>bRyld$g%cvժ(\jFFkVPF9 ;Dp)N{ztQƤmfelAsþN?*EQy%,!glnpo?ItV )qy!YA\0ʇQRvϘ9vU({OGq_;<woFC;xEDp)N{'{OGq_;<woZ(ƤmfelAsþN?*}DG KY>bW m>I|ݾ\jFFkVPF9 ;PQRvϘ9vTm>I|ݾjC;xy%,!glnpo?^*ld$g%cv[h-oajq(I.p:㿵jQ@eZYg48-#1frvY1ɭ6팟d㤾wx_zEQKHa ؂!|~T<|78 cүQ@|߶2}?1}}4ԍ.rwW />#,1Ms<߶2}?1}}E.5#o#5+(#b vP"8JXB'=JEUo~H:K|Ǐe[$_0s ~Uf$+MiPȥqk`4z(.ZBG6GJsv[urz (EaERs].ahE4 >k8uŞ%> t}>vzխg,n\swX N=70 ˽zɮb_I We`N[_gAorV&e@NW $ԷZ5ciW76ބc\6H@7 Kcw-@:6>)7 \$<"?b|yC2J2+W#s0!yL)Z^v4Q(YTᑉ-Cx#Qt佁O>&fX. nju#"f{p6$@ʄ `('L7,6,JYDŊ1!Ix'4xwKqgkX&L"~|Zd15HHʐS9t$(n7Ek<-\u;vFikgMp~':,\iK3evžט\8\o||? ;ojŀ}͙dÔnڼa}@袊(+д<3g-&!G#3wfJ"uG=3AЮ4$B6$$=?B|/y%֘n6lk)igHބc sY?o]Ekm 6QcrNs*Z( 7Ij{d_3d{Iߕإ;YK}J I0V]Ei[ca]B DTIE\w/G/@aMAoaMAo\w/G/@jU՞}u5,6HRGoj4^}2it 3RT@hW2둴Z^6c;;:s0aQ^_H_HS,G}kAaϽo(U(mX-`WQki kYDUvwW t}>ߌ}MQԒ9d`JR'9Wv=o<$wE шEydxT*-N=ONP>RŠhi<O߉W.SOn+o>&c]hѼ.]:M"<ȊJc}Nc]ho>&c]ho>&hpFCjvãѤڀ=7FAsqQx@v/s^`Xqpaqq{ր.EQEW?m9렮_*Ys?vf Gn,A@Q@gWۭ|/_JTn&tyȾf+=W(((żwm.(n" I)8#Pu_XG'^W?xO²xWWZlZNmai+Q`,6zކ=대zulsXK ׅ=aEtWPԬo_\$1(%Uc \#BYVL,%q4bcT4s֗?nAe,T@|h[G]84=.5;XS|2:l뺝!$0DZ]Eui4sʡ6ʰ=äz\$"es$gR>bzx՝FOjY`"ӭ9`8ǧU4Tk{G@`qm">qBr^ [%]E{x.B>&::*lnud$5C2|UVRȎq '+uc(% U+$p<$V9 p71$ȫ`4u)@cn!#PUEqi'6d4k6T`WK%2ќ+cC"Ϋ^s4j (h!@>OEix?j9\ ~ ۭ0/ͼtV3=ń>78OȻ,!oe/19I]k񍿍%ޜ2ًL ـv{1EvQ\tuhI"N@(=uIR-Q0Eeݰ2`0 G<0‘ϲE dd r݂H;4Q\YD#yK|ʸI s?x@e>\vė/tH+8@7'w>a>~%;isM"zmUnI'ҵtOhPNuHI@{r "74d֮"/cd W9k<ARjBZF WWj!e@ϓ QEWSAүb@;O5ͬS\ʺʪ̠NdK{}W\ܿ$:'Y{O>.%g3OS`ڸFwp55`ӛ;a.eM:gkxW\Ң:̗v%O[#*H_ޠ( 7Oz<;o3dمV}TQEQEQEWW?&*++? kEQEQEQEGv-Z%a rknMd_4c3k9"Rz# ?tF5=8HZO,9*T2 Y+)l(rK#ֵ^jk#l<[{o^VZd2d$t5v2*\SZFa}}gO\%01@4=ZKmIm6vyȨ\Q:_Wh'S,@&~=k 7Ij{d_3d{IߕثF]WOGtlq05z ( ( (  ‡D]q?|GaCb z( ( ( (<ß/@?#I@2H^;6)h>&;{W> ӯ|3zVt#{f:ڥt6 'T Ϙ`򞃾:ګyhn)R&uܠ'q@-dU;1R;fAɧ# _7mo@#Q _\OʻTmdZb~̊BpsF*G`>4cj?'G6>~U٘# _7moMH@&yfIū |߆(OʏmG}$h_"퐜1ъ2M<Ǩ}]Z o'~?QI?*R-P YGjak7FU2* m_3 zZG2pp~U zڑկ۶{~G۝b=8\hxEfU2Pȷ-Eཟq:M0>O:= [| }A p:+oNyḤʂ~\׈<-K[2=9b뾀:eE,@$XrAYZ/pb{ЈcS7Kr Eerʴ^zax-u!$T,vl=Ǚb354*zKܬ#7ho#Xtu]kI~̊BpsF*G`>4aukp6mhkK%z]]3O0I!,>RH@&yfIū |߆)-Wȫ{d' w9bv|̃@=CH my=?#R-P YGjak7EQh_"퐜1ъ2M<Ǩ}]Z o'~ERH@&yfIū |߆)-Wȫ{d' w9bv|̃@=CH my=?#R-P YGjak7EQh_"퐜1ъ2M<Ǩ}]Z o'~EdMG3Ɨn?tc ̿7v񍤖zc4ٮՇ`N>?3^WHt!pʄo7V= k| uAߙ&  ǽXƕerf^K3>ˁV-P YGjak7FU2* m_3 *PR08zvO|64ԋTmdZb.?56} T ?68jYYhv7ɨ\+5vy1ՉtLjM̒?uV_ VFk>Uc=sm-L>hdaz ITlPUa*|-NGgssȁ^w=1Vm!kEFN}sf(F;P5a.>W7VQ<Фe`"$̟7\ kQY5Gʿ2Ql3=Ch 9o@)Pe~6C; PjolmfGhIަol mi=L,K2$Z }ǙqEPhSnBp{F*G`?Lzхͷـ;oo+H^xRG96N(lФR,~wrΎIݜȽss:uc .p@skus-R,c$ed# $g@x{MH1f"}>=OK~L0PBۏ@3s:@Tbx ± k~U%ybMDXXʬ'wϤZSF$ !?#Ϫy"M'B ǧ5 QMdOrGClo~I A24{{_Of }6?O5u[Go#U;'/w*Q?{ퟳM/րFGȽ>ky1}bw-]oW<'ô9OE-4h?xv g%q@g%Y4O cxѥK>^@GCu{ȏ7P?wC4G_AU\[ϗ $'נ7Eem/G6S:yVPr_+_*]nAc֏Dm_~MqYleϮ+5G&Z_"4_~HBAIȷD=g]kKTMZ/\TMtW? d-F&?(Oa@3(Inx[\'lj 'u>YNO@lxVUBHhSpӔuV PAEso$- !J<I1p\{\J(3ĖfR74?Iڹ݊+TItW?Oι7L,t? t7\M9 mS}Bޑֲg-˗:Z<օsDͳZldִ[&xc?bi=q7@h_η?h~>lLWAEs>'G楴8?L4y>/fP%~8Һ (էjA ģ7ڝFvSȴ𯇬̴dj&謭CĚ.7w[nfFc բH54^H-#C(tfn;(-o]S@w0Z@1 I#Q&?.F q~V2>OKok?ܩ_2)S!;8@Gd:<'alQO9ꢮMwiEQۜcQ^iR[ޣWHDG>4 EB Z0aurZ`Tܱ g>M:}0˰M1=Egko+E 9`QO$4eIq'ڮzXgg#:Q`/QYP[\^F..BDM!Sݜx˙e;ܒNQk( nG,cg랴ӣYgd̬!sџc\i,L$s;]0=q o-^[ F(͐0,R(tt9VA)6uO%戡v/>͵$'ѓ9=pIjܢfU$ q.b'yǡ{+Bugu{KiKp~eq!лsOl>F׍Qq12 c(GA+>5Ed_0>$|{*Gmc6z W_?#_m=a%`dj`@TmѤ\vy>^? utSϲ :uHH5Ty< ..nG3Wd䌓\<o[0f)B?&F@9 4ëygK&tw+!rh ]&m-Zλf(s0PK M .( =[tQ@q?עY}V?0Y@>zfß/@!)"9pPAEPEPEPEPEPEPEPEPEPEP7"Y[C= BVl=ӽgjx/KƪOWDWh;Sş2_5G?djh O;Eڞ,vѢ3t2=1ާJҐo TC]):GIq jV6֑wKx[ ( (({|sXvL+F0N6Ğ)z7$o6|ܞ?ZL/$ie}U'U; XI|S)9}J;~O.Ր H@c&@{ާYG:hZ]dRH.-Ԣۉ\&/#W_PpxS6M3[4VLj7?K߿'57'?ֿG{ƨG:Ēx~Y4 3O7 D<:ʬ>TFW3Xn. &}#2sgbARHrAڞ,v?0Nx O;Eڞ,vKXdwDEY(g@i!@1 @OY]؋;L=v]Hλ뮮s[m2rzc8[x'p'U(P j`v^* bx+6=oP( ( ſȗ`$|=+j5}In%i+(RsҮsQm>ѝ=فdz|'+x#!$Lr0#'l0\+d3 #::;P4O<8\ 5U=,$IEVC($Mm|͑'~W{bUu]=7Ml|(((++? v5袊(((ȿgfH $"e#??y?_t3^eXgIܢ((((((((((ULK[kkXQ]:Hw!>ڹpWN@j{«eSu=ȶM۩W`¬L-(a!zqCd~n~i XcX}H.cq 8a?.$'ԜԚ凋YvnTqt+0$ <=9#7w% `~ r1[Pm_ծK(`]]QEQEQEQEQEUI_#}}zVOA il{|sY:@41  .AX#.5(gum7>McZzL&7T]# 9MqwH"̲]c qdzssپ 74wlȏpYc!QK;QԓKX %O gv\o #8crimP""$DQ uuMiepc沬}rPY#364!Q~A}7?xwmŪX*lp=jp:7-߮(`~c;g8KKbD qF((klTK,F0J$}*<*{C[|>Q(={EO% dhӿ/Vֳ͡D{iUFI%N?K ew(?RYɮe8TأpOZ螚 .螚 .F)ʖ$ii.DXd-!+vXzxu$J%²b%-szj(Tszj(Tsj0G 3FY Y#h=+D?QwƨD?Qwƨ7U-:B6?xZPyE23NBd΀δ,?#k]JV4`AE͗3unBkWo&GSNv((xcXuICԔP 4k $y $Hqt<r>tP`ږmQH ־W{wOO߯Z7Ij{d_3d{IߕثQEQEQEWW?&*++? kEQEQEQE~z) =VyLq˅ݏҼß/@?#I@2H@FWɸMf6l.qp*hﭦf ( *!`9 Ti*) [{yy#2m;,Pw mv+??ΈKysp@@"T JUѕl;8((((OWvhWW[Ǫ!yfpʔrO*&E'_ Ϣ|_US}⫶8M|)C>TkO_mSGO++'_ Ϣ|_US}⫶8Wu&^e)zz(((((( ;wg7>nOMwfD>ַOww#ҥ[[h&C]HwP]N[YtB1D=+kDe@Ey#Z'-??m|PQ^o։@oFO[xw&KqXh *[m JK{ xLuNW !_뾮FůPM4JdM2t2<ϰ*QˎwyqW((;qU0É'3m9N=0sU4 - F JEP}'h4Oף@qi猟ɣ?^Ey٧2&O"c?)\Ɨ*CHR}@?ľTc#~fϬ_Ȯ_K%ԵԑC,:0GTg$ƀ4m=e%Oʏ[>m=e%Oʏ[>m=e%Oʏ[>m=e%Oʐ۟bp-3D" moz!Cv?q::-J#),ǩk en'>SLq>:~%վgG۷F1ULP?f8DM*}J6-rcL ((J1F]Y# kʱd*}9oh=J ,?\)6J}6_;f@Ю*}J翲)l |fB7MN< 9p (ʱd UI-dgRH9R;}jbVmFr! 'oeXϲQc>@ŶjP{Aʴ>pzq*ծb6O=$O#`@J?(V_(ҲMʱd*}e?QB+/J?(V_(ҲMʱd*}e?QB+/J?(V_(ҲMʱdcϲghO+/iY_Ш?34cϲghS>2\ŁN%oiY_ЮwSҬt뵢+{}?@iY_Ч}~ǰea> g?pG*{_쿙}~ǰea> g?pG*{_쿙}~ǰea> g?pG*{_쿙}~ǰea>~cG1gڮ}~cOGqZǰe{dU*F?k}?G=/ƀ*Aoף:;Z:6G6b?7N}ƀ+Aoף:;XӿoN}ƀ+Aoף:;XӿoN}ƀ#FUnA^]E}Ͽ>G&>7Lo&K1>oaZ77$wgN}ƀ-}~"kU4hӿo $rcup;: @yjjk<*{C[|>Q*cc*&]q$m'= 5ܝSSVmZCi,HoU1#KWldox8&x{M2qY#{ m3Qi|O> Pt[ k8 ܶI>*@_jܗOWھ)S<_o}iNI H|QrϺ}k:GJHh$x+W4]f;m5b24ιJ26c:Y6[XlBJfyqxY-_Z= D,' rU@#ztcM>{&RR_.e(x$}t-j-/Gb}]xRvvV+ a8R1A8 9kkX"иPT7zuR֮ L+ 9h.eb $ tb?$ /QK<̛@7(Q@Q@Q@Q@Q@n&tyȾf+=Wĺ&6ayjQEQEQE  ‡D@QEQEQEQEyLJ?_t3^~F2dڼß/DId`$|nQEQEQEQEQEQEQEQEQEQLhiX$qwc2MW]J[Oe @m?9 tU[5N"جe0l.̑RnNcqg)_] Fq$. bme qpsL[4+݊H6Sϲf:x])]p ׇfLg/rAޡם놣[68m?9 tU[5N"جe0l.̑RnNcqg)_] Fq$. bme qpsL[4+݊H6Sϲ^6nNcqg)_8j0 u0Kk(SFۃEQ[4+݊H6Sϲ[T7lpnR?}Q@Q@Q@s}w_^j{|sW((((( ?>n\sm߆sjT/dK@:aW$n]((n9#'q"` 2 L_nCFT[o,}>/U? ;ojhP j`v.EQEQEQEQEV}UF"mWOwlli;z ( ( (  ‡D]q?|GaCb z($ЬB QmIb/8 pFxx;p033:Xp>p䞧<QEyLJ?_t3^ BUSDrwc?k tB&P93PAEPEPEPEPEPEPEPEPEP-\ĺ-Ny ӐұMWЍ@f{峕Lލ gf]ٷA$Ќm%f<#X݊2Bo:ndҍ|;*ʿNc<'{gW*;e'[oimw-܅hV(ʠ|>طcJdL%%ibLpǶ;~4 %4m}g ڥw`pOA,>52 0Έowܭ HP+##QZ(_LJ;IRܐ33殮n]67Ȉdmm@ t(h(^xV8Rx@tp2G'5ek-􆸂)[S x`?< M.H-,H02p>'D$FӭJɂ0O,g~P<=Drtq-ʇ۲8V'b7[+:03nj3-Jkc+˹ 2BAo4ܐ3[BҕfQu%‡ "zTV($Gp>`F ('2Sp}6Jw|r8#tlI瞕j'Wѭ5]D$lV\U[ h6BPƤ乓b@1ZApA JFLPQESKl'fF7H1zTtaѬűv 1z((( ;wg7>nOMw^?ڹ>}܏J@Q@Q@Q@Q@Q@4*ّ4+۸>uGH vs7.99ǵ^((|lpqWӄK$Bcʹd5a+1YAkkxDqK@r98 **U31P]RƕǓ77L6w~8wdyC5i猟ɮIE61ف{ٙp 튕-l~4}'h4Otcghr}S$Skj n.[s]ǽpfx|>?5܉u_3+!>+[>iZ]Ly;,@sta7~?4}'kj?hM帹m{ev`~g.fced'b}KyyG&nXn hNx&B]d1Jcghr}S2N,*f8ݒ usy-EQEQEQEQEF]WOGtlq05zZ_=>_~j ( ( (  ‡D]q?|GaCb z7S̒y/M^2}պ(uKp5{,[ PuScVSMeҋTRw`9-pHzߊo4u7قTy8l +U2[7/4EnK$hNG\~(ԵFMm[s'>v~zP vP#&r<8ȶR 3b28t'(8k,|+,I =}^w?נBg](((((((((({3C[<>S~j}<jb]FxEESWiVZ(Q\׎PK@ńsjS22;h/|M(I-6yu?z;j+Σ0дrYYdVV%pGp(g3۩R( |r}Ez-H,~s "<5Z Ko2w bw#*hDt??O*iO-aG)˖<`eO#s~f;z( }&՚1*';UکWK̳J#V[(((.tb:H=U4*ّ4+۸>tQEQEQEQEQEQEQEQEQEQEQEQEQEQEF"mWOwlli;zzf7(((((((((vmI8#!i~jgb烎j{3C[<>S~j}<hAV?]%s~5U,r᭤B<#( "x<֧=CERK[4fL 2 +44VaИe^aP2NQ2 l1ocmol36쎊>g>5m3o{6H~n=fMURInx#*rvaq}m(됄@#-`fFsyq+qd52LyVI'$kn8v$Rfy ÒzK_XJ4k ="d ") B?-G =Zo,d11$: =\$eIs;{Xڼ"ݎ|A"mI! Rhy!N@P0gN\c]0~VQfRsmlYiߨ4Mv-Os+STӵ=:[6xM00AwZXT`H-ZCYpO'~\5}K^y>FC8c#}Y4ٵ噾PPK iSK؂+*-7tJ4I,l7Pø= rp$io-e?gmnV iQY۶տGoa=[4nV iQY۶տGoa=[4nV iQY۶տGot[N ] [Lyk{rٴpӘFp{f]vḩ84Yzu5mVdI9UmdpÃץ;vzhݰ|4mz[. |{>#wڞ{e-7n5aA6s4u? ?ƏI5aA6s4gXMbOO>#mgXMo?@iSjo>D I e] Q9qmY۶տGoa=[4nV iQY۶տGowg7>nOMw^OyN6?w^gvzhJݰ|?l?4vzhJݰ|?l?4vzhJݰ|?l?'DfD,K+nl lb%Z[YpetvnݹڬnV iQY۶տGo7Ppr1O@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@n%txwHf7 Wju?V(eV`=#!Q""*J(?"+6UtL\λ ‡D@\_ʏ.?/NT(\_ʏ.?/NT(μ=#hT䓓i xͲY,Ä;p:H$R*\!Q""+H537RywnH#q=v4w0H2Kd$X!Q""+\F#xd\"IjCp`1_y<Vțk6>/˞H]ϑy(XKq,2[#2YW w+ 3m5hĻ.(x<{]AC<ED??V]M+47?(U 1nե,o-- ݑIבy(UItXMF:]%X|cD??QC<EU]"-&܂ٸ}:B&# |s"(!Q"\ۥms Rty(RQ@ TTE =)Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@n&tyȾf+=Wĺ&6ayjQEQEQE  ‡D@QEQEQEQEyLJ?_t3^~F2dڼß/DId`$|^AfY&J=j-$\Os<@89b=v'FhB0LyNSڻMIO6YRi ,cۆѷg ]N[hcv#D܌$c X0 n*WmPA+ܢUO o֦&4r ̖Wg2JꅟpP (@#MMq>5ICV;HIVbpFF57 Q7 S+}=-eS"6Hyglcb 0\\ʕ(0:atG/G/Gp=f6Bf\$g'RI'օqS[S[Kmxx]ZxO}FX27b)ǢiQERJeXlo]^pqVꎢ 3iqpy{GV}үPEPmD4nI/ N;V;<sU5U!BA枉V/9s@(7wn{1%]X8/=jOI_/*U/ ȻvG=j]Ahjc? >B[?'T9W ?*_U}WK z:e /P")OЩVri%oⶈn {ɭJ{?֊(Yb6b=RXjL`pQ@Q@Q@s}w_^j{|sWxRյMa_ԭ 8B{ckPaEq4k_?j{55@cѭP?hֿvWCF}CƩi:Dn\sm߆sjT/dK@:aW$n](((((((((((((( ־W{wOO߯Z7Ij{d_3d{IߕثQEQEQEWW?&*++? kEW oRS4}25ż7c\Qِ8<:ve9X Ob?ZŃY#S RNۤK&|l'sdpwq tmFSI&Ĉ g`rxkmw_KeXWkU+l߿,lk`94)ne>U_5@8یqEPxsE?O5/Y1G.v>JȿgfH $"e#??j%ֵ+2"wǻS>n ܳ,l|s~5z9熿+ڥz@rv~%,g)Ke1t~`5U(4}.ٙlg!H;8Ay &"u i9@9@Tك lqg9Ymb)b&2W sӜƒhThȚe   _}/X~^9<{EPtHuyl#^Y}jh4d[Or>YR6/-t>wC !dk9Khmەyqh$0zj&A[)ʙcv=yǵ[C !dk9]Oƾ}&di#08dXӐ*xû825vmI8#!i~jgb烎hC !dk8ʓ^Xr$!"XRK 3ϙbp]n(^m<Dd );YT灸wȊN.7|fLnRlJt+mF%mRy%raeP>k$@46B7}MnVMvQESKl'fF7H1zTtaѬűv 1z(*;|iev!lzf$M.źeF"% :2(`?Z@5ioOݞHl=7}~z3D|1=}z~c+j?_V`xc~f'ros;yKI'ْFIl7s+zzUo>XeT#<,13FqW/`ӞlKu c,_\K%*|X1m;p9;s(Bat 6oy!m!߂0^jΑAc|d(b;,8lysUhln#$aϦ6^9~_<2rx2 uz֨y??ʤy??ʀ"x{)kr"'m(%[2&e:_[wc`g`{cn`~c;g8QEQEQEQEQEQEQEQEQEQEQEQEQEQEF]WOGtlq05zZ_=>_~j ( ( (  ‡D]q?|GaCb z( ( ( (<ß/DId`$|y߇?_t3^ BUSDrwc 9b|`avJ%ֵ+2"wǻS>n0Kiۥŕ@ Q"??cjz}\?+@{kTu{)/&UrA84oxxoxx(VzMo~rQo~rV"o[o}7P玑G玑[[Eo筿@ FZR~ʬ%aY'wxS?_Si5ƛs$nOMw^?D’ ZZN#hO|-Qcڬl_Я0inkw[ˤ'*A1T&ᄗ7L!ww3H`G*_;G  gzk[Gjܵ{JD̥C W994km)XB€27N:U/ϨYwkjH$G gV?/WֿksǼY+_?v&Xkx/DO2E-nVW,'Y]'qocRA28+V)il^Ȗ`>tb:H=U4*ّ4+۸>tQEQEQEQEQEQEQEQEQEQEQEQEQEQEF"mWOwlli;zaVت~o0q@u7Փ#S& Sjp.m)S)?^9?/?r?/?rDz?/c(/c+JO_ף)?^9?/?r?/?rDz?,- ap_n7\vH $"e#??WJO_׭Cise}Pn|,٠ nYg>Rv}?T`ybڬwOb@?!N>m{z_jEQDm{z_j_Z]^jVp<.gXrN ='~C?U_WD@DbFW0=+F9NC^?; z a⫠9ɼo `1 K)PM,G~S=쪃^ɓ`3uP(|k m?\ύ|@tM[Z++,sFwlqWƞ 1oxt!'7[WH(Zȟ_f m?\ύ|P1 ?Ji`^nɓ`3uP(|k0m6Ddڌ98WQEs?0Tw?WAEs?0U|" * 5NU@?ElQEUI_#}}zUiˏ/owu׵^(ha{@(?ٟ^7g)ͧxc`Kq{*mi>t|iLQ1ڛ`u/~~qҀ/QTO7.ǔvl64k>ha{@(?ٟ^7g)ͧxc`Kq{*mi>t|iLQ1ڛ`u/~~qҀ/QTO7.ǔvl64k>ha{@(?ٟ^7g)ͧxc`Kq{*mi>t|iLQ1ڛ`u/~~qҀ/Ue!}*uSGn\.|õ9}y@ x|wn9zkiqI$4G/Xd(9JEPEPEPEPEPEPEPEPEPEPYh?/aW6^OTr߀5K:ivVQm%VKp+y9#*-SAEkԿtA?.6 TC?|iL I 3T1ee߭Q$a\y=x7(<_[}{O-dc+ooRGYmJ\|WAEgiR̐ T5-O*D}QO"gR{,M_5x̸7m8T 7h(((wb&aX  ktfơ(D <Ąu$#>ثP5NQ4={+ϲ&7|}mǿL(#UM*ɵ hxR$&v;U}EiVd eAy{Ld"?IG>@l tGWejMoQۏ~5њ(tԓbQ@I;FVW"d#qoد>"ԛ߻1q3W mktfơ(D <Ąu$#>ءm.eepB)?vOB8P=%ė &I1ێ (( W*?.-uSU\6Zi?롣M(c0(Nzߝ*G3s"RLus/v?]\וҭ}\eٽltGGmʨ8<SC4WH"GF B+'\dt[-g')& NiïvzXK\E1L"'fV'xחŭ, @$zZ䇆u3[ $WJJ[S- w<<^B I_}$pI%Ic)0Q$֫=X%^)[8+<3$FI!9211ܪH!t_8bIt QSr%@@y!F99#Xn Ζ'~ٛ|͓meTb|;ݓDn,#80:\k}ʸ^W_7΂(((((((((((((((((((((((sŐEs?450V =E?V? tԔ̪=@C  5^5 ܶ:˧1GM4T7 AEa? Nb&:c>9s{G'`u4I":@O{G'Ie{v7cc>g$տ6?Vᶂv q/bi?{Kuz{}yQRqGuƟIo3 (ֵ/ ,4?mQmmE Zj@WK\9 VQEQEQEQEQEV&s>vt}>V}3wr\S72i;rOnջ+i։mlc\I%f'y$%$qU*Z(((((('\im4o84hUݎCåuZTRw5J8vEDR?`?=W[aMA?Jž?z1P5):0n w.b֏[ֿX7=,Pĉ#1ٿ'$?.~j-k[Byɴ0\BIILqNQ^ 麚K&b8̞ah;rB`&N6czTMjW72°>DAKpBф?=-.(5e\k}[+/ԉQEzgAEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP?oWD]s&ULP\M]T]êBVl N 2H@zwڸ 6ºM@mW?X|UA;Un5 M^s u!Bҳ.ڀ5 JJEpEUXd76 Y+gnOTlP+WOeiouo.4p@rP^kShin.-D{JCqT43֦i:}-ifyȈvNp sXY$Ou{mJqK*syΕ6V}AiF;u vpIDѠ={}"4(BMѰ$xd'(|f-66̰ 3f ( ( ( ( ( ERҢF&c]k=عLxʼnOIiq+v:%W"BvJ.#)=Դo3F2US5-_*=QS;.I''qz ѷ5O5-_*ӣιyQmXqu)?p:7J4C'/,a+ﳩ ghH yQ5W? ©VE͂\駰Vؚ?⫧O ]5]aض*OG-?|~puQ@Gyc#CyOG"ss_j./]Pck*iU+{Hz QEQEQEQEQEQEQEQEQEA?JE_70͚s M{8]L幷ߌ}M?~!P lh>0͚s Mu]mG}YhqƳ˃&19M-'+BԥaT*s$3Iw;%eCqܸOx +E{2PeV09}O`yWq$1 = qݻ_vFֲĭf~)Y FO@dօOg :3lB~l2}<<a4OݘIBDmH~^\0ttS' r 'GڪM[FWO( \ VRf,$ƤmƷ?Z쫍o~o3z(\((((((((((((((nay$ĝXFJӕV c`űzJТEYNmW 1z1Ru“H.163RnPw Ƕyr|ÞG4Sw=9PEPEPEPEPEPEPmB NnTb2209VS؂ڲ<i?,ɭ۲rH#ptP? >mG EkZjV:\g0ʯ-ج]W܁rO` s3.癩?:F ]̠v>:tTںjWW3Y{TM@8ڨXUŬ?@-BːF߯F"Q4 }[}!{I[Q+@I"<)*Ln-/eh6[ng-  ^q4rK\ݎ ';p㖸T`}qUύ49 [+5'܌ U;K_KӐ\KaǑ$U[O ͬS۰hd@@AjN-nW_4hYfƄ>];NL!bI!1O`*((((((((((((>YxÜk'WOxJwRvfI"n]8#4n]8#5u!󣠢˯Ə˯ƏAΎ.??.??:: +ܺpGhܺpGhί(ryry:s˯Ə˯ƏAΎ.??.??:: [in]8#5y9ty؉4(N(((((((+"Oi%R@[Ҁ5"?? ("?? ("?? ("?? ("??—& O} =Ri[q,ą8 XVou=Ŭg1?Qs}e} Ɨ),M(7IVayx| X9;IA=MWOf'\jDՠ$O ;rs&S6{B'ى??Z@hZx1K,%ܪ8A]%`f'\j?~.oQX?ى??Z@W95/y(_y(_y(_y(_y(_?\.m.bAP*62G"e2J3+H A$ k3y/?W?[064,g.vd!zª'Զ DUd8\AT<Gs)˸5h /O~3׏>OiҾI"V!Y,OA%Q\~]ƂkLCcJ*Μ1,Ij(QRy5y/?W?%T7%S%DLJ@u4W!o7M?3@}n~g_Ert?4\h7 uW!o7M?3@}ȉnCK\4\s??\4\s??\4\s??\4\s??\4\OrHgioފ>y?sG?hF^FM\/>y?s@C? ?~;>;bNIT?![P#PBFnQ@C? ?~Ea5?(jV?![P#PBFnQ@C? ?~EQOߕzmondrian-3.11.0.1-R/doc/architecture.vsd000066400000000000000000010620001261646570300177170ustar00rootroot00000000000000ࡱ> 3456Root EntryRoot EntryF03q5fVisioDocument7SummaryInformation( SDocumentSummaryInformation8@  !"#$%&'()*+,-./01289:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~VisioInformation" ՜.+,D՜.+,H `ht  Unisys Brasil Page-1sObject modelasiProcess boundary Boundaryoun COM objectnDocument/ fileyEmbedded documentDynamic connector Data storenSquareo 8pt. textnTitle block compass Rectanglek 3-D boxShadowed boxompNote box filempNote box neonmpTitle block corporate 1Title block corporate 2Title block contemp. 2Border technical 1.Border graphic 11.Title block jagged.Note box decoggNote box triangles.Title block retro.Border technical 2. Yellow noteTag PagesMasters0|_PID_LINKBASE_VPID_ALTERNATENAMES _TemplateIDATC010498311033Oh+'0XS `ht ,Cesar Cardoso<C:\Program Files\Microsoft Office\Visio11\1033\COMOLE_M.VST Julian HydeMicrosoft Visio@5fG$RaEqJ EMFRlJ $VISIODrawingL|QaEbF ??d(P(bFPxxx@@@@@@@@@@@@@@@ppphhhHHHPPPhhhHoo*==(;;*==+>>o ~~~ fff=__ ___777 @@@@@@@@@888PPPrrr=^^ ___HHHssssss @@@PPP 5;;5;;5;; $$Emm  HHHޙ PPP PPP @@@=__000000000000kkkЙ000``````(((888lllFFFЙ@@@000@@@@@@888@@@ԛFFFFFF񍍍lllCLLuuuttt=__+>>+>>+>>+>>\fffOOO000000000000000000000///sssق---@@@@@@444...@@@555#########@@@555#########...@@@@@@@@@@@@ߠ׿HHHwwwyyyfff)))}}}ճ777777777>>><<<777 ߷;;;;;;222''';;;;;;fff777oooPPP___llllll___;;;777___}}}###hhhYYYYYYYYYYYY///}}}描___[[[@@@:::<<<;;;yyy777___拋%%%nnnYYYYYY222描___---yyy777sss___HHHsssssssssssssssHHH______>>>>>>>>>>>>>>>>>>GGGyyyfff777sss3333ٙ3333첲yyyfff777}}}ōōfff```{{{߹777YYYYYYYYYYYYYYYYYYYYY첲yyy777eeesssssssssssssss첲yyy777777첲yyyfff777eeesssssssssyyyfff777fff777yyy٠ppp777첲yyyqqqYYYYYYYYYYYYYYYYYY|||fff777===첲yyy###lllsssssssssssseeefff777```yyyٟRRRfff```{{{ߋTTT߰ܜAAAfff777```ԴFFF>>>===;;;===>>>>>>fff777///777777777777777000$$$гfff33777;;;疖VVVyyy~~~pppfff777;;;{{{AAAyyy___sssYYYfffϿ33777111```>>>>>>>>>>>>>>>>>>>>>wwwyyy___sssYYY⍍ """fff777???ß``` (((hhhř33333333yyy '''~~~888fff%%% @@@@@@@@@@@@@@@@@@@@@@@@@@@000@@@@@@חPPP000~~~XXXPPP```߲444fff---111222@@@@@@@@@@@@PPPHHH@@@(((@@@```'''"""lll---hhh333333fff...AAALLLƍHHH333000---IIIffffffffffffVVVLLL@@@@@@666111???<<< !!!333VVVfff)))ccc<<<***fffffffffffffffffffffߏFFF777ײYYYZZZYYYYYYYYYYYY___cccGGG$$$<<<lllYYYYYYKKK:::*** SSSCCC::: HHH777eeesssssssssssssss:::sssssssssssssssTTT+++hhh ???sssssssssssssss::::::sssssssssssssssHHHFFF+++<<>>___HHHsssssssssssssss::::::sssssssssssssssHHHRRR>>>WWWsssssssssssssss:::WWW444777777777777000׿ lll,,,߇&&&hhh疖RRR;;;;;;;;;;;;;;;;;; pppݲ33333333HHH000LLL000sss___888yyyffffffffffff\\\ fffffffffffffffffffffffffffffffffffffffffffffffffffffffffVVV@@@fffsss___>>>WWWsssOOOsss:::vvvyyy(((((({{{,,,sssssslll[[[llleeeЍfff]]]@@@444sssvvvyyy000ٍ@@@@@@@@@@@@ssssssHHHsssxxx⍍ۍ⍍⍍⍍⍍___>>>⍍3333ٍϿsss>>>sssٷÈנݍ⍍///ooo݀ʲyyy⩩ߛӈ澾Ӏfffyyyٍߛ摑怀fffyyyٍߘ敕̇怀fff33ٙ33ݙ3333񛛛كȄEEEEEE򧧧mmm555֠ύ񍍍񍍍222 pppppp񍍍}}}Ջ񍍍444񍍍 ```??>??>??>??>??>??>??>??>??>??>??>??>poo ``` __^ (((hhh  蒍ccc ~{///754>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<>=?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0Visio (TM) Drawing -aGLRwf %7k,o7k0%757k0%77*| !fffMMM333IykMU&J:DT5I[1hXT@. /UbW##_b0zGz? L\&B1r&b%U& !oM $d ) P?;H$,Q, & #&J , 5& ?D#//?M?\.? CA  ~,,,'q/%P6$Y6 (}k?l)?"U   U%A3# o >S@#B:_a_ReUUeUeUeUeUeUePONODN`_ReUUeUeUeUeUUeUeUU/b SR%;5OM%>Qiq;RRRRgg Rqh>Qj /A^F' %p3:|bFpT#| | | vi?=Os<34x,,,/RQmeY q]U@QvovL__q____OO_OOTYA`,X@L&/d2?ɖQ3YҨsUΡ̦xΟ@$"Jʼ& ͥ*@d2A??ϟJ[D! f:45ŧ5ŷ5@ 0 0D$#    Q#b ; Ce߿P. ,,~2i fT,W7'0΢Uܮ50 f[OmOC%ߑE#HTZ  A泴,345&6&9FaajKas b8,W8?Y!3l =Tܯw???8kt5UR^L-akA uiRHe\NDETcp /p :-Nhd,A(6,A5Ryw##E,ah-50zGzDpvNba?(!GmcYP <(F?8456 pL\8 !I[mOOEe7_/-/kLN%:$PG\:_Y///////?!?3?OW?i?R&_obeic_F-N0RE3/A*___\|152qp?v?o?v4UoF_X_;/M&SDVA )BTfxmUd2m('ovbCoUogoyoor?pub6ӘC(B @E UC+ĕ, eayKK3Y,Z9B[F]S^`_DmqAAc)"#pԉQҟ%UoGdpo 0쏸ABh<óR鹟˟ݛb 2DVhz: t&8J\n:MMM KRdv~____ n"aO贁 Nk cZ5g&w6${u/<k 5"5202DVhԵ#&ɿs6VZ>Px:+=O/'lgO%O7OIO[OmOOOOOxOO:__$_/'lO_a_fqm_/@_'/9/K/d.v/䝖7oIo[omo=zs__oo -?Qe+%/// =Pb.@as(:L߂0B !Zc9uȭKYE%7IaEtG[m3Wu /ASϯᅬ =HI[O UWEW)O!-UDV ,PIu1f! ׊/:/^&D7QowO:c/u/pDS//MY 4_Y?K/OO//??NzO__TYe=!ߚ߬߾'oSj_Q2_D_v}s_/?A?S?____X>O1P??qoo+o=oOoaosonoo!lfoo/?2DVhz?cGO 933EWJEvvOOOOOO_h@Tfxҟ,>Pbt9p&bB 0BTfx<ɿۿ#5GYk}Ϗϡϳ9-߹K]o߁ߓߥ߷ o , ?Qcu#8J\]X(!X h$-   r? 23EN贁NkSvu6%V#V/%"?4?F?X? !G/*/MXjWle͙/// ? ['ׯoDG,>P%%iPzDϡϳ -0Ow?9ve:˿'2q SB jyܕ]ʡ FO03@A@8'J)6UFDfP h(TPYYBUF~?x<F BP(?| P? g*/5> bnb>$>% @o b w!O^J#,#,#'owPd /> w, #,) #'BH?/&?Z2锥  0(g`.Object,moda0lg0COMg0OLE{2O3Ag0oria0ne0em0,a0aq0y+s0s%e!^ 5 # UGu F(21PXj| WwqhDra_g tesaponodwipe.COMi4m9bL&d2ٿ~??;ٿBj?xX1T?4)W㿿,b߱~4ۿ X<UG D Ph=0TdYY+I+U@~?@,b?@M&d2?@]~?Q} u+` ?7uhB bqz z2t! +YBY#'!(#8&!(#L& %&`&t(#t&t*U@&"U""8&t&t"񄔅U2 ~L@) 3G1L4;/`Vis_21.cPm!#48\50q `?Copyrn0gPt (|0)02\0U30Mn0c0op0'of21r01Ua0i0nz0 0WAl0 8s2Uep0e0v @dz0$q7 93m  S7?:.t bC 3J#1 d? @ ,^qGYtUYHQ5%T!0[85%T!0[%E%T`!0[sE%Tt0Wp+da_67r!T,tt%85`@@t:N?,o`G1>zLTGzKrccq:9Uz ae A ^btg@sz`!aus#` R Biz @1e2sTp1'@"#8&"''d+CaM+Y51&bU?Fx<;?C@aC8E_`b|vsb9ee v:A*v'6~,0+0~/ 3CUf`!aaxr&r"82q5CH}xv0rU=ac+t@~0Q`U9>rV=NaF׃L&R%Bq$`!<^$@`!`!O #zw^-fl6̓fSF@C tU!tJ/2?5cVj?Fr\.cu8`c (\K 2r "!J85?p8دꯀ"<%ERdv"!JV/IY>y|jL_zu`h Ca-s2?! 3f%7I[`-s}քE7b!Ǧ߸[k2B a8Iۻ?Eg_%E_f82ٴ58bTC&@@A2HD: );h3$>TB 33 A +AU@Vj?@t:N?@ `0UQ t`  Q?(\ku3`bAo@t+b3Vu RR*][ b #A5~+J,U M$A H !B0!T5$5 `%`?CopyrigTt (c])r 20~ 3r uMj ch osb Ifp"a!rd !ap ib n.r WAl h(s"Ue eh v d l>#0>Uhh## 3 Y!] aK2Q5Q0JT@,~X|)I}"  22MB4w=?&153Nw4Fx<;1G?37=-Mp8<197r3 'F-52w?5r#RS"HD *=h3$>T 33 A+tAU@M&d2?@t:Nו?QZ6 t+`  ?j #t3bu+bA@hp  AAu_65R3U VZ  #1A#RTEJ"U5 |= b񕣍0#o!Tt$5 `%`?CopyrigT}t(c)W20 3M ]c os f"R!r !a i n. AUl (s"e e v 0d )l>0>Uhh 3!0$ a+250J40#@Ee37 0>9?71535O5+O3EKN?nO;?O$O6iA bE9 MU3$7W'2ǭqP?!11~% 7VKV VW"}_eO2j 0c HD =h$>T ]]9gAU@p8?Fx<??Q Bt`  Q? Bu]`bA;@hp Ag4$u !*]B Bb VZA ]>#]  B f~J,BU AM b TG!B##Rl!q$5 B`%`?CopyrigTt (wc) 20 3 M c o%s f"!r !ua i n. _ Al (Us"e e v 0d lB0>Uhh## ]!#$]a50J:##@7&d2$X I$I{)G  T"B448~3?55`0?F9m۶m<*A5"HI1O3i5???3LHD: U H=h$> T E=+AU@Vj?@l6f?@ `0?@к?Q6 t+`  Q?(\tA` AM@#t.+u NSu@Y]/b z3Ae J,U6 MA Kb %"!'$5 `%`?CopyrigTt (c)d W20p 3d M\ ]cZ osT fb"RS!rV !ab iT n.d AUl Z(s"e eZ v d Ul>0>Uhh!! hK!3U =2C5C0*JT@o6zTxj6<2  2)6MEi4Fx<;0%@#A27E==4F??80r+ C "14i=@?91552i?j;rB-C "/ e HD * =h(>TB7 +fAU@M&d2?@l6f??@ `k?Q6 t+`  ? "yp # u`bA@#t; bP4Dubm:l]#b . 3A#lTEJJU59"9 c.P (*+MA Yu"#!@!@'; `)`?CopyrigTt(c)2003M0c os f2!r 31a0i n. AlN0 (sR2e&0e vd0dF0l>0>Uhh11!$3<025T0J4#@Fks:3A{( EO<Z6OHDWNpOI~AGEE NO/O@K OiO_BFjAb =Mb'K&_!3R1VA#!K&*_$ 1ed!O1e 0?5 _FH'+ -ש $Nx|Q m#UP0TB  ZMa|n@Vd\aG,Yj1P[j\j]j*!}k~oT }o"&_p  %''4)A*1N6[U9h @u B DFWU\aUbdUfhUikUln+Yo8qEvRUFDfP h(TPYYBUF~?x<F BP(?| P? g*/5> bnb>$>% @o b w!O^J#,#,#'owPd /> w, #,) #'BH?/&?Z2骥  0(}`9Procwese0,b_0unda]0}yi0COMi0_OLE2O3Ai0ok0jc0ct2ric0n0es0,u0nu0l*y0s0s%e!^ 5 #U$*Cu e?'9KUl~ϷDrag thuesapWonodwipe+.es=yu C/OMiUm9dtrm*D(db BP(L&d2??NVqܿޱNP?o?) ?4 HD * =h8>T E=+AU@~\~?@M&d2?F _BP(?P-DT!>u `u bu#`u - &!B@ڍu+`l?n)uy"H8[ b $2AY .""_J-"3,3'J}|U2qu ?t/&M?\.?l6A-"*#'ɝn#bX?Aɗ _^6^3<"6r7|?5"@7='?Z$+FƞT$_?@؂-0@ȅ%U.E?>*3L A2@br+3@n_Bu @rCC2 `u`]@Amu`'BnAzlI7""7"-"$W#" ,n#LVW@.b tQ)n#QT5 /`Vis_21.cTm!#4`05P`?Copyo@WigTtk(Pu)k2P03kMPco@oPoIfRQrP*aaPiPnP kAUlE` XsIbePeo@v[`dP񁄝!SQ6 6" `@@"7"\'2kS WRA[[l>0>UhhweHWQPV33`trzuzpJT4F9-3u<4v^#'M(44q0~uEq#bDGUUvfuWB?DjSFjR@!%e Phe\[(GU_~T+!!M##BJa܁l@B`Ju P`2ll/V? A}bx EC&Mp+I%pZPjU,J,yTOQA-3uEL4s_+pE r#šE7|sau)`R[`.asP6e pexPR7"Rg"#iAAeh=XUd.h'$f!dq+\Z-,B"dꆱlI3 3AYAv~[3aǑ_e~jF- bnb%>>% @\ob w!PO^#,#,#'owd /> Jw, #, #'BIHм/н?2  0(m`1Boundary,COMk0OLEs2O|3Ak0object2ri0n0ec0,e0ne0l*i0s0s%e!^ 5 #U$Cu R1  / 1Xφa``r WXDrag thuesapWonodwipe.m9bM&d2L?hHKM?i~35EHD"  B=h50>Th ]]9 #E*U@~?@M&d2UQ6 J j "u#` ?;uF Vbu~ ~fAEJG2N贁Nk?fff @r#Lxb wb%5 J@""%.M@x b#Kֱ!$5 `?CopyrigTt (c) 2`03 M c oKs f"!r !a i n. Al0 (s2e e v+0d 0u/`V s_21 0cTm!_#48`6`0uB-%/# -'?b.l>]Uhz!4 2aJB!E!@JTB~fXlFD "BM(i1WOiAnO"AP%NOqIAE%@ENF _iO1[E2GOj;2rs#R-S"n3Pe_'2QTs%xMJcМ/7AoG7@3S\+0!&B u 0ud0r S Ey0e 0au~~Rb)łD%BM(eQdLݑg@_P%of Bt"(STG&@j"H+1 Bb|DFm3#\QD5PB UQ]CalWn]@q];aNj6'PUFDfP h$T PYYBU?N&d2??~??I?3P _ ȅHиI\?2~B  03[`(COM,object_OLEOArineda alys s$e^ T1% G! A CDDODbτćmȈmlvj rv33l bߋȏ s\Drag thuesapWonodwipe.m9bM&d2ٿ~?N?\.8@mQ??',fl6?@ ?UGD # Qh,TPYY}U@N&d2?@~?@MҷQ} ǑT  U   P7qYv|YY""*">"R""f",z"X####&#%####"#,#6#@#J##7#h#r# *' XW6W6dZ3W6W6W6W6W6W6O": 0BHTf_r 2eBGeBeB"eB,"eB,*"eB*,>"eB>,R"eBR,f"eBf,z"eBz,FS"FS"FS"7VS"sVS"VS2eB2eB2eB$2eB.2eB82eBB2eBL2V eB`2eBj2eBt2eB~2eB2eB2eB2eB2eB2eB2n`1u` o?buybA@%s,vtV `2j2t2~2222222DrV2`2j2t2~222222214AL1q񤤉S=4  ?p&dVSv&)=胁/`Vis_21.cPm!#48O05$`?CopyrgPt()2$03Mc=oN ofE6r9raEi7n Al =se e=vd~1Y18e A[`4 A A'<#111A!11HV4b1mhb1m҅b1mb1m|b1m1^Am1^ AmЕbAm1^m1^7m1^4AmNbrmg9Uq4aTrr hhh+11|1Jt?JEqqq!"’Uqr]\h:Gh7Ȓ1,pʀ@҅҅1=0|&r&@4mWTh64AJ41ቈ ' @=6ă$gH5hy CO[ ot;lPN<` 9W` ;oduT/a)AN0Bٔ ?@B_fw?aa4t? 消 AmЕŵNA^a*A4AfO'xHOGNL, \,(\/,F\C,d\W,\ k,\,S3B*hR#kHheOwD1HH"Cv&'"&'t\GrV3J/]r`;]РU^`#)]Г%,p0@r0@wUo#B %r%[ +=&/P#r,"//,)3/?T=46f߹\.?@lryN8?>FM&d2>t>OwDB$>NB*)YG@#YG+FY%bf'~v)c%D/.B6?DO?%CO??.0OOU?g1%_7_\"B}G‰h!>f?]b Y" #4b*)lg$i_d_%_d_"Le.0RϚQ"4ψϽ4 h mb1E$ ~*)@#[Y%!Hv)&ߦ1f#L^/QUg2< d!Vmbd "x$V*)@#jY%Knv)&$dP$V/^P/b/Q// .@qqZ<1h2BE6mb<>B2HD62]I7sC76K3 )*BFKD-/2/D/CO?/^OO/QOO%?5D?V?h?4<5HcqhR2*AiVmb\RVb@i"gÃ"gVS )]b ~d`OROd_PcoL_O@oo_oX_Vw___4 KVhr2]aivz|vJUÃU1 ) or2K僃@Q!3ţh02"0D"}'=Z_: )âƏ0e~"K@.0TfpeL@T@ ȓgTVV2\iĻ!@ّёѣFF3T*A<2]a]cAVááWڐ/K@ ?@Bfw?@M&d2~?e@wz yZ! cñ@zv?l@?]/u`;u1`* l ڐbVb߿3~`Reositon I trfaAcdTgڐ.W+_;sZ}Vړ.Gl6icrT}~\ߕ}ߺt0BT ڻ!^l;ٸ,);Mu ځ^};2Dq\n)ս#13;B"L"&8J\L"w#~//&/#טS1;ه22k/}///2//3// ??KG?Y?k?#KS;BB????BOO@S+O=OOOaOeOOO#2as;bbO__+_bF_X_cp_______ ~rn‚Vr:oLo^opoöooµoooo%7 wn;ٱ 0Օ[m#דlqâ趣ď֏ɱäA _Vhzq U|2g5ApqVŪ\l}VdU@\.?@ϳЋW )?LqԆ"⌱ŘͿ+!&8GOpÓ?ϝտL8r]o߁߹(8?5 7 !bE&Ē>PbtbU|>׫tuĔ+=bSmz^Cttb?/e?w?? \ N ?@Bfw?dHǠSB YC`I7OGOr^HBnH }OOONI^H$RnHOO_NI^HRnHG_Y_k_NI `F nHp___NIXSbnHo#o5oNIXbnHxvoooNIXrnH|oooNIeXrnHq@RdNI`FoGRE`FoCn=} ɀqq( u遲`!慀0uXTCTI&u` COM&Syl 1u#3E2u^C!O)uvQ`rX&~/J/r\Ҁρjۄ Y ١:^0_HdFUCtǠoD =a^nAEsL7\Q;ShwEWp5tP@В,AQ\wED-raWG.<`j`? ňdUHLuD R # Thz#4T^M h?U@߹\.?@lryN8?@.Gl6?Q(-DT! >rA )r 737uA`b$*JZ fynM >uM` ?z> p9 o #Q77t??8JЄ7"3YyDB& M!>1U36AKNEF%& [>F!/P#2%2GZ@<2*-u_`bA-X&U2#@Tp)8ulA3Tys.20Wu`& u` l~%"(B2N贁Nk?#Fx`A`?Copy igXt0(c)020P30M Pc osPfRQrP>QaPiPn.0 AlYP Xs]Re*1Pe voPdQP@d[MtiMr%%"ĹaWC?.?}RD^g7" K'c"^Hg.gU'B^7DHf f g"A(cbg!_&@(p AUbgdPcE#cgdbGS#fhUEAQ Y^v)#g<t_"g3ETw=+tk  :?Q]-h0@oxJ11? Sl M3ǎS !؃Mer3' ؄e-'!3|ً@ce]' i2ĉbq]ĉ%$@ UUD 5bt`t!8Y VKwbggقУ1bO o2j>3piQ)L{'FZ!3v0~HDy"!FJ &*4JlXSU__YAFPUBJ0CL%`S87 Xl djqϹQQ(7ULr%>URdgt%/5w(" Lxϰ?&&Pwϼ۫BEB3 r%q07B(3 `B3 pdv3oH"fIJ'Py=nPtQfGP coP UHLuD R # Thz#4T^M h?U@߹\.?@lryN8?@.Gl6?Q(-DT! >rA )r 737uA`b$*JZ fynM >uM` ?z> p9 o #Q77t??8JЄ7"3YyDB& M!>1U36AKNEF%& [>F!/P#2%2GZ@<2*-u_`bA-X&U2#@Tp)8ulA3Tys.20Wu`& u` l~%"(B2N贁Nk?#Fx`A`?Copy igXt0(c)020P30M Pc osPfRQrP>QaPiPn.0 AlYP Xs]Re*1Pe voPdQP@d[MtiMr%%"ĹaWC?.?}R^g7" K'c"^Hg.gU'B^7Hf f g"A(cbg!_&@(]p  UbgdPcE#cgdbGS#fhUEAQ Y^v)#g<t_"g3oETw=+tk  :?Q]-h0@oxJ11? Sl M3ǎS !؃Mer3' ؄e-'!3|ً@ce]' i2ĉbq]ĉ%$@ UUD 5bt`t!8Y VKwbggقУ1bWao2j>3piQ)L{'FZ!3v0~HDy"!FJ &*4JlXSU__YAFPUBJ0CL%`S87 Xl djqϹQQ(7ULr%>URdgt%/5w(" Lxϰ?&&Pwϼ۫BEB3 r%q07B(3 `B3 pdv3oH"fIJ'Py=nPtQfGP coP UHLuD R # Thz#4T^M h?U@߹\.?@lryN8?@.Gl6?Q(-DT! >rA )r 737uA`b$*JZ fynM >uM` ?z> p9 o #Q77t??8JЄ7"3YyDB& M!>1U36AKNEF%& [>F!/P#2%2GZ@<2*-u_`bA-X&U2#@Tp)8ulA3Tys.20Wu`& u` l~%"(B2N贁Nk?#Fx`A`?Copy igXt0(c)020P30M Pc osPfRQrP>QaPiPn.0 AlYP Xs]Re*1Pe voPdQP@d[MtiMr%%"ĹaWC?.?}R^g7" K'c"^Hg.gU'B^7Hf f g"A(cbg!_&@(p #UbgdPcE#cgdbGS#fhUEAQ Y^v)#g<t_"g3Tw=+tk  :?Q]-h0@oxJ11? Sl M3ǎS !؃Mer3' ؄e-'!3|ً@ce]' i2ĉbq]ĉ%$@ UUD 5bt`t!8Y VKwbggقУ1bO o2j>3piQ)L{'FZ!3v0~HDy"!FJ &*4JlXSU__YAFPUBJ0CL%`S87 Xl djqϹQQ(7ULr%>URdgt%/5w(" Lxϰ?&&Pwϼ۫BEB3 r%q07B(3 `B3 pdv3oH"fIJ'Py=nPtQfGP coP UHLuD R # Thz#4T^M h?U@߹\.?@lryN8?@.Gl6?Q(-DT! >rA )r 7#37uA`b$*JZ# fynM >uM` ?z> p9 o #Q77t??8JЄ7"3YyDB& M!>1U36AKNEF%& [>F!/P#2%2GZ@<2*-u_`bA-X&U2#@Tp)8ulA3Tys.20Wu`& u` l~%"(B2N贁Nk?#Fx`A`?Copy igXt0(c)020P30M Pc osPfRQrP>QaPiPn.0 AlYP Xs]Re*1Pe voPdQP@d[MtiMr%%"ĹaWC?.?}R`^g7" K'c"^Hg.gU'B^7`Hf f g"A(cbg!_&@(p UbgdPcE#cgdbGS#fhUEAQ Y^v)#g<t_"g3Tw=+tk  :?Q]-h0@oxJ11? Sl M3ǎS !؃Mer3' ؄e-'!3|ً@ce]' i2ĉbq]ĉ%$@ UUD 5bt`t!8Y VKwbggقУ1bO o2j>3piQ)L{'FZ!3v0~HDy"!FJ &*4JlXSU__YAFPUBJ0CL%`S87 Xl djqϹQQ(7ULr%>URdgt%/5w(" Lxϰ?&&Pwϼ۫BEB3 r%q07B(3 `B3 pdv3oH"fIJ'Py=nPtQfGP coP UHLuD R # Thz#4T^M h?U@߹\.?@lryN8?@.Gl6?Q(-DT! >rA )r 7 fg7uA`b$*JZZ fynM >uM` ?z> p9 o #Q77t??8JЄ7"3YyDB& M!>1U36AKNEF%& [>F!/P#2%2GZ@<2*-u_`bA-X&U2#@Tp)8ulA3Tys.20Wu`& u` l~%"(B2N贁Nk?#Fx`A`?Copy igXt0(c)020P30M Pc osPfRQrP>QaPiPn.0 AlYP Xs]Re*1Pe voPdQP@d[MtiMr%%"ĹaWC?n?}RZg7" K'c"^Hg.gU'B^7bHf f g"A(cbg!_&@(p UbgdPcE#cgdbGS#fhUEAQ Y^v)#g<t_"g3/eTw=+tk  :?Q]-h0@oxJ11? Sl M3ǎS !؃Mer3' ؄e-'!3|ً@ce]' i2ĉbq]ĉ%$@ UUD 5bt`t!8Y VKwbggقУ1bWZo2j>3piQ)L{'FZ!3v0~HDy"!FJ &*4JlXSU__YAFPUBJ0CL%`S87 Xl djqϹQQ(7ULr%>URdgt%/5w(" Lxϰ?&&Pwϼ۫BEB3 r%q07B(3 `B3 pdv3oH"fIJ'Py=nPtQfGP coP UHLuD R # Thz#4T^M h?U@߹\.?@lryN8?@.Gl6?Q(-DT! >rA )r 7 fg7uA`b$*JZZ fynM >uM` ?z> p9 o #Q77t??8JЄ7"3YyDB& M!>1U36AKNEF%& [>F!/P#2%2GZ@<2*-u_`bA-X&U2#@Tp)8ulA3Tys.20Wu`& u` l~%"(B2N贁Nk?#FxQaPiPn.0 WAlYP Xs]RUe1Pe voPdQP@d[Mti@Mr%%"aWC]??}RB^g7" K'c"^Hg.gU'B^7(BHf f g"PAcbg!_&:@(pUbgdPcE#cgdbGS#fhUEAQ Y^v)#g<t_"g3/eTw=+tk  :?Q]-h0@oxJ11? Sl M3ǎS !؃Mer3' ؄e-'!3|ً@ce]' i2ĉbq]ĉ%$@ UUD 5bt`t!8Y VKwbggقУ1bO o2j>3piQ)L{'FZ!3v0~HDy"!FJ &*4JlXSU__YAFPUBJ0CL%`S87 Xl djqϹQQ(7ULr%>URdgt%/5w(" Lxϰ?&&Pwϼ۫BEB3 r%q07B(3 `B3 pdv3oH"fIJ'Py=nPtQfGP coP UHLuD R # Thz#4T^M h?U@߹\.?@lryN8?@.Gl6?Q(-DT! >rA )r 7 fg7uA`b$ JZZZyM >uM`} ?> pq9 o #UQ77t??W8Jh7"3YyB& M!>U36ANEFb%& [>F/P#2%2G@<2*-u`/bA-&U2#@hTZp)8ulA3TyZ.20+u`&א u`l~%"ă(B2N贁Nk?#Fx<]?A}"<{#_C#*10AU2{#PAAG% >`A`?Cowpy igX}t0(c)0W20P30M P]c osPfRRQrP>QaPiPn.0 AUlYP Xs]Re1Pe voPdQP@d[MtiZMPr%%"baWC??}RfZ7" K'c"^Hg.gU'B^7Z Hf f g"Acbg!_&@(p *bgdcE#cgdbGS#fhUEAQ Y^v#g<t_"g̑3UTw=k+tk  :?Q]h0@oJ1<1? S M3ǎ !؃Mer3' ؄e-'!3|E@ce]' i2ĉbq@]ĉ%$ UUD 5bt`t!킜Y VKw3gقУ1b o2j>3piQ)Lŕ{'FZ!3Nv0~D$y"!FJ G&*4%lXSU__YAFPBJ0CL%`S87XldjqϹQQ(7Ur%&>URdgt%`/5w(" xϰ?&&Pwϼ۫BEBB3 r%qߘ7B(3 `B3 pdv3oJH"fI'Py=nPtQfGPcoP UHLuD R # Thz#4T^M h?U@߹\.?@lryN8?@.Gl6?Q(-DT! >rA )r 7 fg7uA`b$*JZZ fynM >uM` ?z> p9 o #Q77t??8JЄ7"3YyDB& M!>1U36AKNEF%& [>F!/P#2%2GZ@<2*-u_`bA-X&U2#@Tp)8ulA3Tys.20Wu`v&Zu`l~%"(B2N贁Nk?#Fxw`A`?Copy igXt0(c])020P30uM Pc osPIfRQrP>QaPiPn.0 WAlYP Xs]RUe1Pe voPdQP@d[Mti@Mr%%"aWC]??}R\g7" K'c"^Hg.gU'B^7(bHf f g"PAcbg!_&:@(p QbgdcE#cg"dbGS#fhUEAQ Y^Rv#g<t0_"g3/eTSw=+tk  +:?QZ]h0@oJ11? S M3ǎ !؃Mer3' ؄e-'!3|@ce]' i2ĉbq]ĉ%$ UUD 5bt`t!pY VKwbg4قУZb o2j>3piQ)L{'FZ;!3v0~Dy"!FJ &*4쨕lXSU__YAFPBJ0C L%`S87XldjqϹQQ(7Ur%>URdgt%/5w(" xϰ?&&Pwϼ۫B EB3 r%aq7B"(3 `B3 pd(v3oH"fI'Py=nPtQfGPcoP UHLuD R # Thz#4T^M h?U@߹\.?@lryN8?@.Gl6?Q(-DT! >rA )r 7fg7uA`b$*JZZ fynM >uM` ?z> p9 o #Q77t??8JЄ7"3YyDB& M!>1U36AKNEF%& [>F!/P#2%2GZ@<2*-u_`bA-X&U2#@Tp)8ulA3Tys.20Wu`& u` l~%"(B2N贁Nk?#Fx`A`?Copy igXt0(c)020P30M Pc osPfRQrP>QaPiPn.0 AlYP Xs]Re*1Pe voPdQP@d[MtiMr%%"ĹaWC?n?}RZg7" K'c"^Hg.gU'B^7bHf f g"A(cbg!_&@(p MUbgdPcE#cgdbGS#fhUEAQ Y^v)#g<t_"g3/eTw=+tk  :?Q]-h0@oxJ11? Sl M3ǎS !؃Mer3' ؄e-'!3|ً@ce]' i2ĉbq]ĉ%$@ UUD 5bt`t!8Y VKwbggقУ1bO o2j>3piQ)L{'FZ!3v0~HDy"!FJ &*4JlXSU__YAFPUBJ0CL%`S87 Xl djqϹQQ(7ULr%>URdgt%/5w(" Lxϰ?&&Pwϼ۫BEB3 r%q07B(3 `B3 pdv3oZE"fIJ'Py=nPtQfGP coP UHLuD R # Thz#4T^M h?U@M&/d2??Q(-DT{! >}rA r 7fg7muA`b$JZZ fyM >uM`} ?> pq9 o #UQ77t??W8Jh7"3YyB& M!>U36ANE Fb%& [>F/P#2%2G@<2*-u`/bA-&U2#@hTp)8ulA3Ty.20Zu`& u`l~%"(B2N贁Nk?#Fx`A`?Copy igXt0(c)020P30M Pc. osPfRQrP>QaPiPn.0 AlYP Xs]Re1Pe voPdQP@d[MtiMr%(%"a_C??}RB^g7" K'c"^Hg.gU'B^7BHf f g"Acbg!_&@(p Ab gdcE#*cgdbGBS#fhUEA Q _Xv#g<t_"g3/e3Tw=+Ztk  :?Q]hZ@oJ11? S mM3ǎ !j؃Mer3' ؄e-'!3|@ce]' i2ĉbq]ĉ%$ U@UD_~Fd|6Ruc!Y 9VKwAgقУ|1b  o2j>3piXQ)L{'FZ!3v0D~Dy"!FrJ &T*4lXSU__YAFO0I0C L%`S87XldjqϹQQ(7Ur%>URdgt%/5w(" xϰ?&&Pwϼ۫B EB3 r%aq7c"2 `B3 pd(v3oH"fI'Py=nPtQfGPcoP UHLuD R # =h#4^T^Q h?U@߹\.?@lryN8?@.Gl6?Q(-DT! >rA )r 7737uA`b$*NZ7 fynQ >uQ` ?z> p9 o #Q77t??8NP7"3Yyc3 Q!>U36AIEF%& [>F!/P#2%2GZ@<2*-u_`bA-X&U2#@Tp)8ulA3Tys.20Wu`& u` l~%"(B2N贁Nk?#Fx`A`?Copy igXt0(c)020P30M Pc osPfRQrP>QaPiPn.0 AlYP Xs]Re*1Pe voPdQP@d[QtiQQ%"ĹaWC?.?}R6^g7" K'c"^Hg.gU'B^76Hf f g"A(cbg!_&@(p 3*bgdcE#cgdbGS#fhUEAQ Y^v#chY8tcg3"77"uc3w=+Ztk  :?Q]h0@oJ11? S mQ3ǎ !j؃Qer3' ؄e-'!3|@ce]' i2ĉbq]ĉ%$ UUD 5bt`t!Yg VKwF#gقУ1b o2lJSU__YAFPBJHC L%`S87XlcjqƵ(7(YQ&KU_qg%`/5w(" ?&&Pw˫BEBB3 QqϘ,DB(3 `B3 pdv3oj3piJɉ%L{'F;!30ADy"QҝFJH&*4*H"fI'Py=nPtQfGPcoP UHLuD R # Thz#4T^M h?U@ ?@Bfw?@_?@?Q(-DT!f>rA r 7fgn7uA`b$JZZ fyM >uM` ?> p9 o #Q7 @7t?|Z?8J7"3Y&yB& M!>U36YANE*F&H$([>F/P#2h%2G@<2*-}u`bAa-&U2#@ETp)8ulA3Ty.2]0u`& u.` l~%"(B2N贁Nk!gFx`A`?Copy igXt0(c)020P30M Pc osPfRQrP>QaPiPn.0 AlYP Xs]Re*1Pe voPdQP@d[MtiMr%%"Ĺa_? }RZg7" K'c"^Hg.gU'B^7bHf f g"Acbg!_&@(SpEbgdcE#cgdg@T!#fhUEAQ YC_hTg<t_"g3/e3Tw=+Ztk  :?Q]h0@oJ11? S mM3ǎ !j؃Mer3' ؄e-'!3|@ce]' i2ĉbq]ĉ%$ U@UD fbtRucZY VK|giقУ>1b o2j>3piQ,)LxGFvZ!3v0"~Dy"!F9J &*4*lXSU__YAFPWBJ0CL`S8$7Xl(djqQQ(7Ur%>UTfgt%/5w(" xϰ'PlϼBEB3 r%q7DB(3 `B3 pdv3oHiI nkOPowOP HDJ # h0>Th] U@M&d2?@~?ҿQt`z  ?tF7n>u djtuH A#L@JhH #2N贁Nk?<@ *B=d$2#x)P?U#R!$ ``?CopyrigTt (c) 2`03 M c os f"!r %1a i n.  Al@0 (sD2e0e vV0d80 ghe?C+T0  B!!4I"4"53  p jb y,` UL nV0P.2tZ2n@~M2 J 6O/NeAD IA@ IAz18?OO` F A1F$2e nb0=@AOSOOXOOJ%aO@Os_FR uRkAn1Fx@UjV0c N.0mV0 _H'" H;ED_MH;Fm9w&#hs;ݣB UQ]Bd$n]@}+,q]\aG|o?I<Pyo]P $woiV  votto߀b roh pon |ooߣt moz $Tr Qr߆Pr?tNr ] LDnPUFDfP h(TPYYBUF~?x<F BP(?| P? g*/5> bnb>$>% @o b w!O^J#,#,#'owPd /> w, #,) #'BH?/&?Z21  0(w`6Document,file0,COMk0_OLE}2O3Ak0obj:e0ci2oro0f3Wedk0ag0aq0Wyso0s%eB^ 5 #U$$C+ X?C)32IIIIagy ww5ϼ;̉lDrag thuesapWonodwipe.rCOKMim9bL&d2ٿ~?P?iٿa?m?ۿ3޿EUHLD H# >h,JTaaMUwMU@~?@߹M&d2??Q >  >uvA` ?;uF >bu~ ~aMBa J`MAMJ>U?|>O#IO%P <BUOXOBtXOu/V \{& P2N?#-"@?#14U;/>`Vis_21.cXm!#4?8060u `?Co_pyr0gX_t (0)0]20030M0uc0o0of2R1r0Aa0i0un0 0Al5@U 8s9Be0e0EvK@d0ui7O96#2 7s?Y:x b]ClJaUl~i1O4#U#@RUP3(Z?$K /1C#$ sUeQe#@f)` RJ-"N:?*^(@"yR/!Uz5@>]@WX_jQ_Y2>_PU>rM 5qbwcFA8G$EO_B O__+_T?$MXY_m_Va Xpr^4,}gFXwRq]u^y___;oF_o#o\T *^oi_xPeVe3pi }k dAjAixq^(fm V&EM}Nܕ6%$. ޓQYK9ޓz5Y ᯄBɈid#!-ANcO/gdnz5>TGQiNqcT$&@A6"Hud. jOaFmY#ksB Z]Ran]@}+q]KadKr4/UFDfP h(TPYYBUF~?x<F BP(?| P? g*/5> bnb>$>% @o b w!O^J#,#,#'owPd /> w, #,) #'BH?/&?Z2鬥  0(`:Embedc0b1,c0ocu]0entk0COMk0O/LE2O3UAk0o_0ja0c{2oriw4h3ay0alysJ0s%e^ 5 #UG_ QX?C)32IIIIagwpz DDO ~ ww̳f$l7g̉xDrag thuesapWonodwipe.rCOKMim91m:bL&d2ٿ~?P?qܿa??4<@B9޿EUG D # h4T  U@~?@޹M&d2?t?P} )  u` ?F;uF[ bu~ ~~ x  &*"#"-"-"-"Ri'&&AU" L@$-"D!""J֣#14+/`Vis_21.cPm!#\80620u `?Copyr(0}gPt (60u)g02D003g0M(0c]0o*0oIfe2V1rY01ae0iW0n40 g0AUl0 ]8s2e*0e]0v0d40uI7)#   7?*x Kb3$Y!9 2vB2q@tE?~DtF @*Zu `- b]0Ԍ@;BuD0@rjCC#@'#<AG&@"#(RGF|# F_ K?\.?JG!2#R(eGa%7gxUHOa%[d fg!5xaSggdaCi-EBT!!" tʑ"(acG@N1BKu]`u5Nq2llV? M ~xb Su5C(u&1s"p@l;iicPxc(MyTlO1Gh ,JT  TMBOMU@M&d2?@_~?P >tA`  ?t?JF>3uYu?> >Ub $[J JLJf>U2q ?//&?\.? A"N#?|>#!% djLa)d a/~ s2"#i-I b#B#14h+ >`K`?CopyrigXt (c) 201@3 M@c@oKs@f#BAr@PAa#@i@n.  Alk@ HsoBeC@e@v@dc@$lJaUl~ A4 >aJBUP (A3 1CU*ULR/0s2 s2vR"N@*(>[<*31U5U-V_H__UE2&_8U*>r4ebkc4AA8G  OC OO__%U5_(_#og\a {Xpr_ }g:Lu_\_:m_o)otE_Vozt3_QXeJe'di@si$p"jMfE(i67@$֟!303! a/w$%UH tuD0   * U % >hY-(JTYPYM 'MU@O&d2?@r\.~ϫ?P NtQ`  M? tU*ڒ7&8@6fNu[}uA}q+b eML J"NU H bNj#)R$?i&?MA@"+7 ##!$t`;`?CopyrigtH(c)H203HM 0c 0oKs0f21r0@1ai0n.H Al[0 8s_2e30e 0v"q0dS0lJaUa@aW!$UlI025)0(@#AF4[FA@(E*OOOaDpNOOG`ENO6\KZUlaO XhMCOS,Soaroh1U___oo&o8oJhx<\onoI܈oo{o5Yo$6HZFl ~lŏ5 &8J\nFl?vnѨIԏǟ 럅5a:L^pFlz^ΟI 05e`r躯̯4Mb?@t:N6\&Ua "D,Ihiο]W֕ue[E&iJߍτ6mϾߝi7TPkLp߄6q,>7Mb]Xo5u???4?Xjp9\Of _"C]@L'} V6lX-1u. Bj2u2Z2j2#u9r#ULH/MB#AD5 60`Vis_SE.cTm!#20AD%`;Copy<0igTt ?D1f@M)@c<0o+@ofdBUArX@Aad@iV@n3@ f@Al@ \HsBe*+@e<0v@d3@J@=#x# A G{?9#n"E&0444 M70#AHB 53_lj#PSV6U8l>(UhnE qJ$&9"(Fn_g5Fe#pheo'T !! Jcxo)vR2'"U75a%O3W_74b5-6R `F2 5au\@|Q:0b)`R@As)@E T@xd@Di ei=G]U6Tg'0"qV!DHAn 6SWaH'w* O`EW )FLmɵ#ms7B $IedI@VjPUFDfP h$T PYYBUF~?x<F BP(?i3P?< +1: b^jb::!H? k?B  0$`:DatK ,sM or]eQ"ouY c["COMQ OLEs"O|#AQ obj[ c\M !ri[ nM edQ a alyS iS | e^ %9kU3 n 2DR ω̃|σw|| ww ?wx  2Dzg9Dψ9̅ vDrag thuesapWonodwipe+.MiUm9eem)Qe0Xs c7iv7bL&d2ٿP?qܿi??~~+WB5޿8VUH LD  # >h0JTlaaTM+AU@~?@~+WB?@M&d2Q &>uvA` ??uJ >by ʂM| @ M A " #"& !& "4#D""l#Y""]m"]m"m"& Y""Y"LD"JM2؂-0_2q05k?46?P >rB2^H3*!u`M-@brA#@?f2u-H.62KX0`36$ JY"2U&2"|#N|>U4 58O?#?\.?06A Cm"ClA".1@3m"H2`Vis_21.cXm!#w48d63x`?Cowpyv0igX_t (QP)Pu2d0cP MCPucv0oEPofRRqQrtPQaPirPunOP PAlPU xXsReEPev0EvPdOPyi7I#)R (Ws?J| bS)lJ(JUl  U iQrD1@abe`(c+C@FoxT@F0\w2C"H""Ndf 27 U^VUU@Cco{@F0\<`{"WG uR:qEoY|Fq~ppB4M N7K]0Rrs uDaAaVbpk1c|Hf|md oc syD"HD""N=CͿږZx~G}Ε0֛qbw3 UJX qm6uC*|bx9ŵEB3O&X"pE||"@@.TH#ĝ?Ir3T>\?J6B0@7؜Q v`1vd'f~q0g0_p dQva'z#Z&'+&("~%2#<("2##&qʐIj[omoiHVϬhe魛ث8%G+1L?)6%{%ŕ/V?,a? 9 8:ߥ?_?pA2eŕ ^ }<^B 07Hu0 qcdE92_;F#mm#\os&B L1E]ganZ@+q^Ua_juPUFDfP h>$/T 6D UUF~@xThE=cAUF~?M&d2UQ6 * "u` ?;uhF bu~ ~B2AAV*MJ"UI 9 xbd+'9 _L@R"J+#!$5 `?CopyrigTt (c) 2`03 M c oKs f"!r 1a i n. Al0 (s2e e v10d0u/`V s_Sb 0. hm!#457 9t-d/# ')?9 &?4.$l>aUhz!{"/ U 1BaQ#JT+# F~FB~fIXF QBMX(4xDOAOR"A%NOI QE|5E F>_Ob[2xO;n#rE#R-SR"q5D,bE(Oz7\J@pd1"{ <SGCGGeMPOsd{ir@? kYjH__Ka[%e^@l?@!Cmo_%n@D x`b<0^ bWKa|51~v" ]~Qp}ʹl[|5e*B+fntg@ Ae'1BTA Ȅ["X(STG&@a2H򒗄 ѺTոMWsFDmW#drsbB , Q~]saDn]@}+q];aJr0PUFDfP h>$/T 6D UUF~@x abe ~!om ek !r* d ik e} n#!!x"!pu(l* g"d} fo p!/,8", eT !iu(h a !g>!e^ A5kUoE?W? I!I!2MI%$!` Ak/s>! r<`>!kbs{kbsNFDFzkNF NAB O Fu 6 !?)1<@<}SXyADrag onut hep adn"y aex. li s)l/mk brReJubTh]]9 #9AU@H$D"?@|^?F\.?FM&d2?F;P7Ar;r:.$$]A] >Tu#` RQļU.JTT2<$hurY{ b bWJGU5 WLK@#." ]>I#v%l(@hn?h '#n#-#IXh+."bX=R#a1f45 -`Vis_PE.cTm!#4522 `?Copyr0gTt (0)02`0U30M0c0o0'of21r01Ua0i0n0 0WAl @ 8sBUe0e0v!@d0G4[7 3aal/ m7? *4{V `;BH~Fl>]Uhz1" + RaJB`V A:1S(ab'?iX6S#_SR5,\["#V=ET`VXt]@oY_k_}_E6iTAb=E9 MU$g'2qpF!RDa2 ffv:HTbT!@x0 0@]Ae[8RT;;M# #V"R2 eJ9s?i1c\NRtYQptROV%QpV1dARu `A0@r +?= `R5/ro%8' b^&&S@MAMBSxeb$q2CξetQ@QAbwi1GT<@oJ0m0s0&A>H'0򺃁 VOAgF\mMw#$TYOݙB 4M]ka\nS@+qWTaTHWrE֜UFDfP h,TPYYBU?Y,b'@?#H$ @Fx!H$4B"= UGD # h>4T6D U@|>@@!H$@FjZ?Fvݯn?ۻ?P} u` ?Mum b5U> > `l p]h^  8 8v\`86)l h;$ -3t8rAby & .@MԉU!$-`Vis_SE.cPm!#\92\]`?Copyr0gPt u(0)@020L0U3@0M0c60o0'of>2/1r20k1Ua>0i00n 0 @0WAl0 68s2Ue0e60v0d 0$5#+ "L "#415  M'?#u88@L&d2?xMɉH\.ϗқHyNsUAF3O6 d<%#Ee ,^ r%Y8UH}Q%T[5T[5T[0ET8Wgda8o*+T!$!":zd2 d (~fcFxQ]v~%mK`@8>"n.o5Umfc8R% (fc)D/81#R2i&z0 >0oR@0f0?1t0x>05fo` SX2u11.XPNoY7%>>B(ag^BUqcNHD: !# =h8>T E=J AUFjZ?@?Fa,x?FQ t` l?A@b b9tQ ul`p b_䁐 u FuR))#)_ )a 2>A # " $&"֔J-U0zGz?HL7e#M^!L""5"N'fe#s$/6 :?loM%4Ge#<1 ?7P?A$#<@ܸ=?@a4ê?? 3u `Gbd|d #Bf.#EC2PGOHu_Ie" "1&"7e#AD+$`?CopyrigTtk(c)k202P3kMPcPosPf$RQrPQQa$PiPn.k nllP XspReDPeJPvPddP I`Q2e#P@M=6! S@"l>0>Uhh  Q$a+SbYeY`AJQ9VGlbkChB  B"bM`(K9o?oce%n swe7e]oe&%To#rPA_"#(:D#T PA1e7;Y0U$7'R]<!4Q@; 7=P"j^pb'?k!3~և׆Aˉ:E<)%vTC}?SV! *W '(Q@Iv= ȱ??b"zUk %P,Ab Ğd!T{<0T>}HD: # ;ih ,>T!  9 B?AUFjZ?Fa,x?FNOt?FQ6 &t` bp A@t[1$$ 1mub/u%J--u -->J7U0zGz? @irH c#"#J B<# @#;# RSa># #!c!k';b`?CopyrigTt (c)/020;03/0M'0c%0oKs0f-21r!0Z1a-0i0n./0 lu0 %8sy2eM0e%0v0dm0 ``!l*>$>Uh E 1% aBaC@J:8#& t&?"`E(2EBOTH?aOiAb9 &UT$G/'0U(Rv&!o$05 M"P4"BBHD: # ;ih ,>T!  9 B)AU@F"Zy?FQ(-DT!?>&t`p Ab @[t` )b[-FR7u%-u-LURR  ->RJ7U0zGz ir$M#JR B<a @#;m#? b$[S&%!M!U';\`?CopyrigTt (wc)020%030M0c0o%s 0f21r 0D1ua0i 0n.0U l_0 8sc2Ue70e0vu0dW0J `J!l>$>Uh EЈ 1% a2aR3@J:p Lt)"/(0E,O>H?KO iAb9 &U>$G'0UR`&!VY$0% M P"BBHD: # ;h0>Th]] AQB|AU@Fa,x?Fx<Q6 bA@t`]hp j&u` ?Ju[   8 >I (@""JU5 !IL=D(qL"?Z&P?MB(>Uh=C1vD$a%E@J1rFTVBq@A1B?BMŐl(D ?&[!O@OAgRV|SqyQ@AFlWqrXUEO;].D\XrA@c __E__YiAaeTI=&UG$TG'K0Urŕ&!$)a45 m>C SbbHDB # =hj8>T ]]9 RkAUFxARE *MJ-U0zGz?L$L;#<:#I$(PA?Ai!f;#//$\.?l%G%j%7(F ~ @""B258 2~ `bd): @C1Y. KYl ?aBn;OU8VOjIqM}52EJ;#AT5 `?CopyrigTtk(c)k20?P3kM+Pc)Pos#Pf1R"Qr%P^Qa1Pi#Pn.k lyP )Xs}Re*QPe)PvPdqP% `Q2;#P@M=1tZ'SH A8#l>0>Uhh Q$ a`bfef`J19 1NCbPJas(e6oG?ok%no `weV5nJoneEoos(TbT+PtyPe iAbV59 YU$p'2U<%!$a+; pVm"jas.!$/n!3هچ#ц:0<,c#j%_FHu0 IFzhE%% tm8#TysB \[DExano@+|qoYaG6UFDfP h>$/T 6D UUF~@xTE=cAUF~?M&d2?F\.?QR6  iu` ?7uB bq*z zBAD`AMJڍU5 L/@%'#a!f$5 `?CopyrigTt (wc) 20 3 M c o%s f"!r !ua i n. _ Al (Us"e e v d q/`V s_Sb . hm!#457+02p-l'/m# m'?9 &H?LUl>0>Uhh11E!4 a+!B'E'@JT3FSF>zbTrF{ BMBO(4MD]OoAtOI"A?5NOwIAEETF_oO7[Ep21PO>#rA RSI"q]o? EVJ@=l l1n"> 8mSY`L aM,k?NeEfWi]8|CCeR%,nEn0Yoko|] a?5,eU\gwonWoi\jLo8EPiC;'gQT=7* bTA R"iO(STC&@ 2H0򪠄 ~L)u_E/>FTm_#lzsHwJB _M]zan @+ėqMaodj]XPUFDfP h>$/T 6D U8UF~@x8/T 6D UUňUFU*JR@F~?FM&d2?F\.?QU[u`h7?u* bZ bY zzA u#tvz /'"M"M"M"%\lU" /L@"!"/%\ b)#1 4+`?Copy_rigPtg(c)g2U0G03gM30c10os+0f92*1r-0f1a90i+0n}.g Al0U 18s2eY0e10v0dy0Y/`V30s_Sbo0.?0hm!#45K704X$!) Iy3i?8FP?#lA%-/3 78F& ~O&~ e$^=%%,\U H5Q%ATL[%ATLWpda_'T%\"(TF?x<gf1\bUZ;flut `rE2tV[dcgSjk&Cw"`A0juTY0:1D0p90hgUaw0dgP2s-0!e?0r11}$d^ MCohmh]Cr\ ^BVsRbtF rv/"c)q,^PE%Y\Ut@YA2 &$1<0%0t`CWYk|b%Z`rCl%ÎXޏy 9@ M_qg_$yYSda$da" "(b[Th?'rXW`]btR[dts"á%sե&@ߢ"Ba|!ml'M7HD # ;hj4>T]]9 B%AUFM&d2?F\.?TQ6 t` ?t .b2 Cu\u!#bAW@  AeJ#U0O_Nk?=@ZLBI1!6$5 `?CopyrigT}t(c)W20t 3M` ]c^ osX ff"RW!rZ !af iX n. AUl ^(s"e e^ v d  `2 @&>S$5LIy>#?6P&?AŤ-=# "='6A42l>0>Uhh= d5O!4 alBRrEr@JTYFFb$xFE BBMBaOADME%^_IDE45UF^_O[d5$O3rA c"HD # ;hj4>T]]9 TB_AUFM&d2?F_x<[??Q6 t` ?;rb t  A[@u`AE#b_ ӀEOuu.x(O  2 (AMJ#U0O贁Nk?<@L<+#k @p#; dZSyQ*B+#!$5 `?CopyrigTt(c)2003M c oKs f"!r 1a i n. Al;0 (s?2e0e vRQ0d30 `ii L~+#!LM29#9P?Ab-+## '6Ax2l>0>Uhh=Д 5!D] aBE@JZ+#FF1 " R &RY(/DRrA "@QEIDt:N?FhW BGR M$@Qx52DX SrU~Y5UO ezRgzYdAlex59 O&]U5o?px5awP$V)wR#bRHD # ;hj4>T]]9 TB_AUFx0>Uhh=Д 5!D] aBE@J]+#F\FZ:\ \ B%VMY(@!9 G\ASE/P]3r BjR"CQx58MA W$AQW UV52OElTbPdAlex59 O&*P[F50Io?px5 wP$V)wR4RR4RlcbN&d2鿸\.?L?jHKMD?XiB?Ƚ7U*JR~{T5=_H'0ׄ 5AY_@  FmUw#\VRB t{s)a_no@Gfjokjhj9bjj`+qaUFDfP h>$/T 6D UUF~@xM߄SYk} hDra_g tesaponodwipe.dw9DHD" # B=h50>ThP]]9 E)AU@~?FM&d2?F\.?]P6 u` ?u& WbGNN N8AvVpvMJGU?Iy@a?& ?AHbd5 _L@="J!$5 `?CopyrigTt _(c) 2`W03 M c os f"!rԲ !a i n}. Al0U (s 2e e v0d O/`V s_Sb . hm!#45K7S03,1g-O/# 'Q&A B&p?L7 l>]Uhz!f"S W Ba<#JTFiF"N 8F BMBC(4cDsOAO="Az%NOIAEEjF)_OM[Eq2cO;#rA RS="qD,bEO\DJ@[d1"f S'C'2eMFi[mboth'b"FN2eF%RCon0okf"Cfz%dfRm4wGyHA0dg9g{wf ?CbvBw(eP[@nT[g1Pex'B%TA F"C(S-T'&@oa2bL&d2鿸\.?P?hHKMD?\iB?Ƚ7~645DHu6 Dp=#4_GJˣFm%nVP wOB  Z]d|n* @Xr.P+Dq Va t4Y,b'@"H$ @ 3cA-q7 ;U t4Y,b'@"H$ @ 2cC-q$*7 A t4Y,b'@"H$ @ 2c|A>-dn7"AUR UUUU !"t4Y,b'@"H$ @ kEC-q/AZ %t4Y,b'@"H$ @ Ԁq_p A-|nz7AU 't4Y,b'@"H$ @ \5cC-4q*7 A)*t4Y,b'@"H$ @ $q- AJ-377U 1t4Y,b'@"H$ @ DsC-q*7 A 6t4Y,b'@"H$ @ dq AJ-t37U 9:;<t4Y,b'@"H$ @ dsFC-qZ*7 AU :@At4Y,b'@"H$ @ $sC-q*7 A Bt4Y,b'@"H$ @ q AJ-3(7U DEt4Y,b'@"H$ @ 7cvzC-q7 A Ft4Y,b'@"H$ @ dq AJ-t37U :AWXt4Y,b'@"H$ @ t6C-qM*7 AU :AX\t4Y,b'@"H$ @ tC-tq*7 AU :Xat4Y,b'@"H$ @ $uC-tq(*7 AU :Xbt4Y,b'@"H$ @ uC-4q*7 AU :UAXdet4Y,b'@"H$ @ ,jC-q AU :fgt4Y,b'@"H$ @ w`C-qq*7 AU :AXght4Y,b'@"H$ @ YxC-4q*7 AU :AXit4Y,b'@"H$ @ Ey8zC-qO7 AU :AXkt4Y,b'@"H$ @ dWyC-īq*7 AU :AXlt4Y,b'@"H$ @ yyC-$q,*7 AU :UAXent4Y,b'@"H$ @ wC-4q*7 AU :got4Y,b'@"H$ @ wC-q A qt4Y,b'@"H$ @ Ļqa AJ-3k7U :Xvt4Y,b'@"H$ @ ${C-q*7 A@̾hMR@th.NR@@jIR@t@j PR@@j|HR@TAjNR@AjADR@4BjNR@BjDR@CjdNR@CjNR@Cj2DR@dDjMR@DjDR@DEjWNR@EjNR@$Fj2NR@FjNR@GjPR@tGj{NR@GjNR@THjYMR@HjNR@4Ij6NR@IjNR@JjPR@JjuDR@JjNRH<(H<(H<(H<(H<(H<(H<(H<(H<(H<(H<(H<(H<(H<(H<(H<(H<(H<(H<(H<(H<(H<(H<(H<(H<(H<(H<(H<(E/P&K/""ȍHq?/&?o "  0 g`.fil}e\not;2UbA0x\t70t94_capQ2o?0U,_0n?4ac8cA0m0e?0t 1e^ % YG &u P'9 ]owwpww pwwxDrag thuesapWonodwipe.umt)clOyiKzdf)tex:N 8b|>0"Si??P?4x???Y,b"H$4D< UGD # h <^T$YY^J{U@Y,b@@"H$@F|>@F."Si??{?Pu` ?u&& :FJf_J_YJj_ G G^ Y  6FBbu$f$u$$u$$u$pu$F-r2"3KU8􆄍=K40B34? 6 K!5#K30zGz3@r5RK3ADY:`?CopyrigPt (c])F@20R@3F@uM>@c<@os6@IfDB5Ar8@qAaD@i6@n.F@ WAl@ @s_SE@cPm!049P@6P@@K3K 2L@92CD Q@  G6`BH@L&d2?{]ɌX\.ҞX|^sUQV3_7AdLA5VUe0^dU5EHaB5dkr5dk5dYkEdkEdgnda`:T ?8ЎsI5VhOAa1CRB_i&z@ D@oF@f>@EAt@xD@@f,2v2E"Z` S^B{AA.Lz@A~P(9SbrR92d@aS=T@h]]9  6AUF|>@Fٿ`?Q܁ #u`b~A@u   t b it  ? "EKEde]A- RJ#U0zGzK?@LB^>#<?! $S(P?]u$5 [ FL%!$5 `?CopyrigTtl(cu)l2`03luM0c0os0If2 1r0I1a0i0n.l WAld0 8sh2Ue<0e0vz0d\0JB `128$0@"&>gKS I^l>]Uh@z 51$w aKB%QEQ@J1>#mBH\  z(BMB!zA OG?OCE%N__kWEEU_Oy_E<}OrA;c3HD: # ;ih ,>T!  9 AUF|>?F."Si-?@?Q u` ?A@u`b    bt t D `MGf8> PC '"-&J#U0zGz?@B=V#L"id$(P?M)V#!$5 `?CopyrigTtn(c)n20-03nM0c0oKs0f21r0L1a0i0n.n Alg0 8sk2e?0e0vR}0d_0D `1*2V#0@9Uh11 H1V#@ WaVB\E\@Jk!F [BHBEO?OK%N?zM O],3mQPD<Rߘ@F"?@LT9 AUF|>?F."Si?Fp@Fr4??Q Ao@u` ?u  b7t  fYIt+Ty`HOInL> ""-HE]"c&J#U0zG/z?<@B#!$5 `?CopyrigTt(c)2003M c. os f2!r .1a0i n. AlI0 (sM2e!0eJ v_0dA0F `o12#0@M=,%OSIy#Ul>0>Uhh11 !5 a0Ba8C?@J!t?F9ӳ_u/?vB*@z"Bt ui*ɠp?F3~"?P- U& }|g?tK 񓨉L!EKWE*ÿzY @:  I@K\.? qI3@; ?* 4B%O_a_sWr/#5l4([E)hg@FtK?pgk3_TEEw5@FyrZ?FT bJ`VZ6?PN5%S@cdnTMd_DLf"T>8qaf8T~HUΒd__{\ooW#^ #UE[EMetKodHD # =h ,>T  9 TAUFIBB??F]',?Fo~?F>8u?Q6 mu` ?A@Mu   b7t  >_z MtXa_}A_dS mdr򚲦)  >HI JU5 NL%#R!W$5 `?CopyrigTt (c) 20 3 M c osy f"x!r{ !a iy n. Al (s"e* e v d J `!2#0@M=SSM#B\#2qe0?d?v6M?\.?a*.0l>0>Uhh11 p!$U )B/E/@J@#F[F [EoBA@(bTE8eO?OKNOO)WEETN_wO7_ETOPO}_O@("bTx!m{ a y N m heFoXkHD: !# =h ,>T  >4^AUF|>@FkyrZ?@U?@vK?QAu`bA@u  b*uLdp :K- &GY.b#t t  =@~?7AZ=J7RUM BrbJ"#v!{$(+`?CopyrigTt (c) 20 3 M c oKs f"!r !a i n. Al (s"e e vR 0d > `1\"#2q@0???Q6M?\._? * 42"#0@M3Sb#l>0>Uhh119 @!"$w aMBSES@J@"#xAsF<r0WBH`d(xEOG?OK05NOOMWE7xN7_O[_ExOO__d(9!eN bP7;9X"'7'0rI2?!MT1; 7fFoXo%'(ųQ@tȁ??~b .9"z %j}hekHa>lel I xagT{<$>}HD: # =h ,>TB  9 EpAUF|>?F`?@mo:@@K%H(?[?Q6 t`  ?A@*{uLbdp }:)-&/k.8uguqt#n >bJ&U:!?$5 `?CopyrigTt(c])20} 3uMi cg osa Ifo"`!rc !ao ia n. WAl g(s"Ue eg v d w`!+4#QEB24#aE0@M=2S8!#\4#2Ǎq0??6M?\.?JI*TX0l>0>Uhh11 X!13BJ@4#cA^F<m[~BA(cEtO?OKENOO8WE5cN"_OF_EcOO_O(tbDa ub e6c !ktTa =ayc e oo !#S(b!-aUco"""mc a UyN`N m "4T6D )U@Y,b@@#H$@FjZ?F\.??P} rzu` ?Mu$ P\`|uQ]u m ]Tu ] m ] &um`<&u]\&u <")))))) !),!))\!)},+fL$\Xxk4k4<=\!+b56 1)U2L@R23+A0D;-`Vis_SE.cPm!#\9_2611`?CopyrR@gPt (^@)@20@3@MR@c:@oT@ofB~Ar@Aa@i@n\@ @Al@ HsBeT@e@v@d\@4IC40  7GI?%308@L&d2?]dXҶX^sUQAV3_6d<5>UeH^oUS 2U Yag5dkEdkUdkKUdk{UdkdUegEd !kh,!khk\Ud\!ked,1gndadaVGr,1Ta,8䄃/I%V3O8qAM@RBi&z@ J@o@fR@At@x@0L1vy5p` SBA_A.Xl@Ӏ~@/YC365p@dHZl~8ړFxO@0 a !0bs=y t7ֲ76%?zͲ쾭K@BKQ6@2)5+c`RT))SR) 2ٽpv5@ h@͙8ړ@ǡǡ2ݡݡBXPR 8-d@aZW@˝|7\&,''L'@Eݐ%Ku%? b rh?/,1U9C#)Q"RVݣ0՜&@2B\#TN~AO\obfkՕHD: # ;h0>T@h]]9  AUFjZ?F\.+?UQ t`  ?A7@tb3!I#u lu" b  e]AJ-U0zGz%?@LBG#/Z" <h$o(P?AJ9$ A##65 ;L)<# @#;8# IYS*##?1D45 `?CopyrigTt (c) 2`03 Mn0cl0oKsf0ft2e1rh01at0if0n.  Al0 l8s2e0el0vR0d0 `1l>]Uhz]1$ aZB`E`@J1FGrBA\  FMB%!O?OCE%N_'_zWE%EFd_O_E2O;rA"c 0HD: # ;h0>T@h]]9  [AUFjZ?F\.??F?x<Q t`  ?A@tb" p u uH"?b  >M  J=U0O/Nk?@L)&B##5 LG##u"?h1$(P?AJ\$d#<##a0@3;# ?S###b1g45 `?CopyrigTt (c) 2`03 M0c0os0f21r01a0i0n.  \l0 8s2e0eJ0v0d0 I`Al>]Uhz1w$ a}BE@JAFqEBH  K"FMB8!Os?OCU%^8_J_WU5UF_O_U2O;rAEc.0HD: # ;h0>T@h]]9  AUFjZ?F6*??F?x<Q t`  ?Ao@tAK` t%ub" p u4 u+IҐb  >.Z*#&$/)J=U0O贁Nk?@L[&BlU#5 ;LGU#"?c$(P)?A$#]Uhz1$ aJBE@JpAAF{BXi  }"'VMBj!O}? _SAU%Q^j_|_WAU25QUF_O_AU2O;#rAwc`0HD: # ;h0>T@h]]9  AUFFU23Z?F R|?F?x[&$&[ % ?&.>/Y&B#J=U0O贁Nk?)@L&R #!B#z5 X!L G#"?$48P)?A$#<#}0@3;][3 b#R S 5J#145 `?CopyrigTt(c)2`03M0c0os0fB1r02Aa@i0n. jlM@ 8sQBe*%@e0vc@dE@ N`sAl>]Uhz1$!;@JBE@J}A 9 "1RCQ!B M "cVMB`!'_?E_AS}U5^__ g}Un5U _?_o12_;rA c0HD: # ;h0>T@h]]9  }AUFjZ?FU23Z?F R|?Fx<?Q t` A@)tA` ?t K yp   _?3" f ubu*I Vb -  !AK"&J=U0O/Nk?@L!K& #!BE#5 M ;L GE#"?4S$(P?A~$#]Uhz1$ aBE@J1AF BA"2  &m"VMBZ!0O?OC1U%A^Z_l_W1U"5AUF_O_1U12O;rA gcP0HD: # =h8>T ]]9 RB UFjZ?F}>?@9*?@*IɪQ6 t` l?A@,tp uZ*u` Zul`N#u ]UbZb  `B d@T# ! >#! #VBQ"@]"&&'&$Bf/x)J-U0zGz?@$L񉄍7#5 "L"&""EB\#$o?6M?\._?l@4G#2.!?~?P?A4 3$A@O P90`bd_ goD.$e[Ou>2' M7>2&OR"#{QT5 $`?CopyrigTtk(wc)k20P3kMPcPo%sPfRQrPQuaPiPn.kU ?lP XsRUePePv`dPL! 2 2#D`@6>>1 )Se@ 2l>0>Uhh Q4\cabe `J!=AN&N%rC0x8 uSFG?9K{Ea~\EzwQu5 ~-Qu s38!5bTPtPe HD: # ;h0>T@h]]9  AUFFJ]rc?F R?|?@Q u`mbAB[tA` tz ?bk Kt\ )?Y _yp  )W  uH!b  m > &K &J#U0zGOz? LKBU#5 !OL  =(:#c$Z(P?M ]Uhz1$*0BE@JA ()BA(4""  3#VMBO!OCU%-_?_Q_JQU5UO_O^12_;rA Sc<0HD: # ;h0>T@h]]9  AUFjZ?FJ]rc?F R|?@Q t` A@B-tA` t ?b K)+? _p  ) b ub Fu!bR m  >K" &J#U0zGz?LBK#5 M TL  =(:#Y$Z(P?M ]Uhz1$0JBE@JpA()BA" !  "FMBO!OCU%#_5_G_JQU5zUO_Oĸ^2_;rA Ic20HD: # ;h0>T@h]]9  AUFFT?F R?|?@Q u`mbAB[tA`tz ? bk Kt\ )?Y _yp  )W  uH!b  m> &K &J#U0zGOz? LBU#5 &TL =(:#c$(-P?M]Uhz1Z$90BE@pJA )BA4") !  3#VMBO!OCU%-_?_Q_JQU5UO_O^12_;rA Sc<0HD: # ;h0>T@h]]9  AUFjZ?FT?F R|?@Q t` A@B-tA`t ? b K)+? _p  ) b ub Fu!bR - AK" &J#U0zGz?LBK#5 M TL  =(:#Y$Z(P?M ]Uhz1$90JBE@JpA()BA"  "FMBO!OCU%#_5_G_JQU5zUO_Oĸ^2_;rA Ic20HD: # ;h0>T@h]]9  ;AUFjZ?@?Fx]Uhz`1W$ a]BcEc@J19QkBЮH+"  +"FMBOm?OCE%N_*_}WE%E g_O_E2O;rA%c0HDB  #=h8>TB ]]9 zNAU@Fw5?@۪1?@!拮?Q6 bAtA`]tԔ u`,ul<Vu` N[u#ba    Z .E2A2 >$RMJ-U0zGz#?LI7#5 LBzf#2q ?/&?\.?l24 JM%G#A5 43,$H8PS?AG+B' 6 *3 `bdp:O @ 3G1Z4TZoW9_J t"'"E#AD5 `?CopyrigTtk(c)k20P3kM@c.@os@fRAr@1QaPi@n.k AlLP HsPRe$PeJ@vbPdDP I`rQ2-4P@M 3!3t"AS1@P"l>0>Uhh tAb$ Wa3b9e9`BJ:9Glyb5Ch`V(^e6oog?ok%n5oo3we$5^noAeE^oPooV(bD@u lbP-* PlRkkt@8Uy@ek BPoPDcQESS#eQ(cR%"iP("F :mQt8hE=Qv.NF jAb$59 Y!e$lJ?!3QP43!e4(/E$M%iUe$ '$B:& VޖP"_H'" 8iM%*JF!mB<#Wt,>wB _LVY]qaDn2?@+4Wq6UaGCoar*PtcrETdrRH̻4erK޻frMP grShr`WirZtjr\$Tkr_lrGbmrd UFDfP h,TPYYBU?Y,b'@?"H$ @Fx/P&K/""ȍHq?/&?o "  0 `Dcor}p72ate\WtiC0lE2bO0ockG2exC0T1oe0,fR?2mET@  ArAUF~@@f_vP?Q6 u`bA@6u`b[  t t  I?AG@`8>\ V$" &J#U0zGz?=L)6#v!{$5 `?CopyrigTth(c)h20 3hM c oKs f"!r !a i n.h Al (s"e e vR 0d > `1*26#?0@Uhi1@19  !#@ a+6BT!  9 BPAUF~@@fvPk? ?Q6 u`bA@&u  bt #t  ?$AG `m>$Z =J#U0N贁Nk?<@L=#LY""#h)P?*MB#!$5 `?CopyrigTth(c)h20 3hM c oKs f"!r 1a i n.h Al%0 (s)2e e vR;0d0> `K1*2#q0@8&>S ##l*>8>Uhi@11 H!#@ WaBE@*J:#F)&[(6"B(?E@POiO{JE9LFi:nЍ Mr"U1{^ 6 _CW޻O?hUS~GEL&d2? Si_{R!U1Z@LFJXZM _P_[?OOcOL dAb9 y9jdMU~3þ?66 f Aq?7@Q(-DT!?zNq@B 1sr2X s vr}HD: # ;ih(>TA9 3yAUF<?@fvP?FN?IP-DT!>2u `u b_u  @A' EEG ]u` ?u# bl[>eQ Q Jj(9>t bb t`k"_jt e"k/}//@"&$72(?:5f72=p?:0jBU145 j`?Copy_rigTt (c) 2U0@3 M0c0os0f21r0"Aa0i0n}. Al=@U 8sABe@e0vS@d5@`cAU@@M=&S &#l8>#1Uh@#3 A 1E aRKa S'PJ%:3FZ(NL0Z&'"B0CUS_?r_HD:  3Aih(>T9 ByAUFBjt@@fvP?F?IP-DT!>2u `u bu  @-A' G ]u` ?u bl >   JjP9>t bt`k"_Qjt e"k/}//@C"&$B72(?:5f72=p?:0iU145 j`?Copy_rigTt (c) 2U0@3 M0c0os0f21r0"Aa0i0n}. Al=@U 8sABe@e0vS@d5@`cABU@@M=&S &#l>1Uh@3 1E2aRKa S'PJ%:3FZ(NL0Z&'"80CUS_?r_a8e HD J !H=h4> TET A4AUF~?@ )?FG=uԃ?@*I?QAu`+?A7@u   bJt  ioT?F BP(?uLJ#A-n &wbdp :.[ ft"`8KA#&'& &EQK"Q&@/%/!J7UM V.y@ &@'Җ"=#Iy?6P?RM#P1U4+`?Copy_rigTt(c)2U003M0c}0osw0f2v1ry01a0iw0n}. Al0U }8s2e0e}0v0d0R `T142#@@M=!M[S@B酉##0z_Gz4@J G\#?OM?\.?+_: Gl0>UhhE= SEn1#!w#*0aRgUgPJqAqFQR!Q(U_#?_[A5^_oagU7^Ko_ooUSE__oop(!e 0 ?7hehfp&j e7;!I'(ųQ@O?K"b"z GE,b8!I;!T{]<4>}jH^HD # #=hj8>TA ]] >C#UF~?@d> Y?@mo@@fvP??Q6 ֙u`l?A@Su  b*uL'bdp :K-&Y_q.zat  t& > > h" &UC"I&J7U5 ]@L'r#I!$5 `?CopyrigT}tk(c)kW20 03kM ]c os f"R!r (1a i n.k AUlC0 (sG2e0e vY0d;0V'`i1? : b 4%7I %#O&l);_#B2r#@@3 m!Sz_##r#0zGz?R@G=D-#TNXP?3\r#2qP?_VST\.W?l"*@l>0>Uhh*U= %!r$ aRbXeX`JQ1V>bJa(}e6 owG?ok5n5ooRweE}n<o`e %}oo ("b!m a90ykN10m"Y0 #bE\9 3 Xr'LE#'BPVJ!kTQ[ pe!HD #!=ih ,>T!  9 CUF@F<?@fvWP?IQ6 t` b[Att`$6NZ*$$$ J#0zGz?=4L=Iy'?&-P?M2V @>gSB!$5 ``?CopyrigTt (c) 20 3 M c oKs f"!r 1a i n. Al'0 (s+2e e v=0d0'0?J4 >UhJJ !i J: u t5ub03 FM&d2; 23vSrŌD(T0E6; T 0RD91hPEPC GEa19:I AMEN7OOA5???O\ b I0A@l1eE9 ^)jM~3þ?V,oVp5UA @Q(-DT!?b$i|`  aR bbQgHD #!=ih ,>T!  9 C$AUF~@FF<?@fOvP?Q6 kt`A@b[t` ctuLlubm >-J#U0zGz?=4L=Iy'??&-P?M2| @ &>[ SR &BI!$5 ``?CopyrigTt (c)020030M c. os f2!r 21a4i n.0 AlM0 (sQ2e%0e vc0dE0 l>4>Uh11 @! Jq:2u t`{(>9%BCAB*CH5Em%94rl'ǖurS$JEBT4FM&d2?F6Ca `I1AEhEC3G1IH ]%O7C5? OFpO?J3C( b o0A1eE9 )TE@~?3þ?Fdo.Fp5%QzQ(-DT!?b$ ` b fh_H4ue =EF"m2j#MlwB _$\D]xa_n]@+q_mTaGdnrTPorYrqrvbrrsy4sr|Ltr߼~/P&K/""ȍHq?/&?o "  0 `Dcor}p72ate\WtiC0lE2bO0ockG2exC0T1oe0,fR?2mE@&d2??P|14v?P??Z,b"H$n4D< UGD # h <^T$YY^JU@Z,b@F"H$@F|>@FL&d2??{?Pu` ?u& :FJf_N_YJD_ _ _ ) G^ :) :):):) 7,Y:)&!:)  6?$FBb$f$$$$E=$$$&&$!)-:!r "23tUJ8=403!D?8F !8E#30zGz8C!@E%3AD:`?CopyrigPt (c)@2U0@3@M@c@os@fBAr@Qa@i@n}.@ Al,PU Hs0RePe@vBPd$P-`V@s_SE$PcPm!m@49@5@SP3K&!L@2VS0T&!SP  GYF`BX@?m,h\.>hnsUdabf3o'GAd\5UeAa9 fEH,q58tC{E8tC{fE8t&!C{E8tYC{U8tC{%8tC{E8t!CwndaJJ+T28xIiEM01WS}RBRi&zBP @o@f@AtRBPx@SPf2v0B<"Z` sBQnlQ.bڂ~P#P82d^EYh3 @@J4?@/@ffqP3Y@T32t!~&!b2t &! 3b?"3l5 #l>!Yl%@@w@%g+xX2:B 89x?RtQ tROj %E5KrU? b Ց!b:!QRZ&&fB%U26&@A2BXlapQ~QHy5ЕHD: # ;ih(>T9 BRAUFbX?FL&d2?FBP(@?FQ6 u`bA@u` &?  Yt  3St bCIChl>+J3U0zGz? @LM#b!g$5 `?CopyrigTt(wc)20 3M c o%s f"!r !ua i n._ Al (Us"e e v )d @ `1B2#+0@Mn=IKSCl>8>Uhi1i1 A!!#@ a+250J:# ?x6q"P(>9O&M&A:EE94\.@ZH4jCrzO}Z4NqB?Fh#Lm Pu?jEhEFC8G ?Mx _T/CGEEFWOL6A4_F[5? OnO/LdB%b =39$dE@~3Ǿ?x6ox6m,|a?b9@#B 2 (s  TB  9 B`AUFFL&d2?FbX??jQ6 u`b[A@u` &?  Yt  3W t bDfMGl$> rJ8U0zGz? @Lt&`4=$#<L~"i?&P?MB$#!$5 `?CopyrigTt(wc)2003M c o%s f2!r /1ua0i n._ AlJ0 (UsN2e"0e v`0)dB0D `p12$#0@M=MSR G#l> $Uh11 X!!s$ aJ9B?E?@J9!  d֬$BuX@g(9eD\.CsI OFBz1Bnl>Fx?Fh#|L">'CEh ECGEVE-_?SFEZM8nh>$XOFAE}nBPZ_l[X!`OU}OOgEdOvOgoOaAAb9 9ݼL@~3G?6E6`n |q?b=@uQ(-D_T!?q@Bs s xrpHD: E#;h ,>T  9 #yAUFKRT*?FL&d2?FBP(@I?P 2u `u bu  @[A!'! Kamu` 7?u# bm>E$E$J#U0zGz?@LB,bX|>]@t  3"Ü"t"&bK)/$72(?:5f72=p?:0)=#145 n`?CopyrigTt (c) 20@3 M0c0oKs0f21r0"Aa0i0n. Al=@ 8sABe@e0vBS@d5@`cArU@x@C; F&S! *#l>#1Uh#3 A 1+B aRa S'PJ:r=#FR&RH[Q'+"B0CUS_?r_HDJ #=h8>T ]] TAAUF|>@FL&d2?FW/~?@*I?QAu`bA@֕u`l?  b@t   ioɿT?uL A-A3{?K lu .#Yt ^,a,@ >bI($#""OB"H&J7UMwm@1#'%q#!$w+`?CopyrigTtk(c])k2003kuM c os If"!r '1a i n.k WAlB0 (sF2Ue0e vX0d:0JP `h1 2q#0@M=!YQS^#4\q#??6M?\.?l*7#q#0zGz4SU7B=q('D?P?MOV$ (\ %# &l#5*^#l>0>UhhE=;E!3t!a+ObUeU`JSYFHWlbaZa(zeFoW?ok5nEooOwe7zn9o]e;EzooA(#T AAb7;9Xq'7'0URśF!DQK 7kf &J\Qt'(ųQ@΄O?~B"b."z\%,Ab9vT{<4>}HD: E#;h(>T9 3yAUF~?FL&d2Ɏ?IP-DT!>2u `u bu  @A' G ]u` ?u# blA  ( J`99t bk&k" jt e"k/}/,!"&$72?05\7(=f?00BU145 j`?CopyrigTt (wc) 2003 M0c0o%s0f21r0Aua0i0n. _ Al3@ 8Us7Be @e0vI@!d+@`YA9U@@#1Uh#@3 A 1+|B!aRaSPJ:3Z&@GN0&IV'"B9UI_?h_HD:  ;hj0>T@h]]9 BiAUFNt?FL&d;2ٿ?IP-DT!>2u `u bu  @-A%'% Oeu` ?u b@((J#U0q8 ? y@ &9t  Q_r9t b"/)'($ 72?(5T7 =^?(0*B1#145 r`?CopyrigTt (c)02`030M0c.0os0f21r0Aa0i0n.0 Al+@ 8s/Be@e0vA@d#@`QAUw@@M=3&S% #=qD6MRD?FPE9l>1Uh3 Ab%1vqE aZRabSiPJ:1#&F&0VF&"_(U_?__(he1oCkHD #=h4>T]] R>tAUFJRT*?F\.?@i n\?@J4?Q6 u`bA@u` ?  b*u]Ldp :_-&Ug.pt  f2(tj( > ZK"&J7U5 Ā@#!$5 `?CopyrigTt(wc)20 3M c o%s f"!r !ua i n._ Al0 (Us2e e v'0)d 0L `712@#]0@Mn=Sp-#B\B@#??6M?J *d7#@#0zGz4@d7=@('XD?P?Ml>0>UhhDE=!3C!] aBE @J(A(F(F E?RQQ(0$U5_?S_e[{^__WkUE$^_G_okU$__(Mo_("b!m a0yN m'0 AleE9 e9X@'EA'U2ДjF!DA; v3!uHD: # =h(>TB9 B$AUFbX?FFFh?FL&ɧd2ٷQ6 t`A@t` bt` dtAs`l >uuuP\J2U@M=Xg S"K@I3!8$5 ` `?CopyrigTt `c)u 20 3u Mm ck oKse fs"d!rg !as ie n.u Al k(s"e ek v d Y B#0zGz?=@l>0>Uhh+1+1 \!pJW!Z 2l8V\  k 6M!( 1 ?7??35EN(O:OG5EwO?O5j5?{rA-z5S#!(-e _H4n ]f[zAFt#m:#CWP B \D]xa n@+qWaGToyrlPzrc{r }rv8$~r(<rv?vʫl=UFDfP h,TYYBU?Y,b'@?#H$ @FxAeg0ndb%e^E UYG]5hah Mu 1 ??EwwEUbqpgTUDrag thuesapWonodwipeS. ai%l?n! a8I DsNcGB VNr5s)z7b@ jZ??Y08!O?h|*?HF1Q׿|>"H$47D< UG D # h8.T  YTYUiU@|>@@"H$@Fxd@ j@񓺑F=d@ ѐ0t!K]o u7 373,55:T83>b솟~`@m22bXj 2҂%PW&8J\,2)8sIh (EMSF1CZW&z?P @ogf@A&x@ f2v`# SBQA.p~Ӏ~d@Y*#&!Bh!auJ-Zpr`9UHPuD " # %>h-(JTEQMU:MUFxJi tifNt b ftDJNU! $`?Copyrig\t hc)? 2U0K 3? M7 c5 os/ f=".!r1 j!a= i/ n}.? Al U 5(s"e] e5 v d} ` N`!N##0zGz?jH@ R2# 0L&JcSV l$JUp5 UI &! 1 Na2a#;#F `0۸# 1?t勿(:4 8??=5QM?@_?q????04yO?@C2{"+?>MUA1zE_OqOOOOPO_$]I*J )O<@UHXuD "# U>ih]0JT x]]I >UUMUFx2-#0LQ&JS%lJmUx U1K$ Na*YB_@6;p Jy1qJ 7!(1#G[V<B`H"   F$"[(B!O$OCU%(^A_S_WU(U_O_Uh-(JTPE=M0MUFxtJNu `fpu p1f U N iJNUr$`?Copyrig\wt hc)5 W20A 35 M- ]c+ os% f3"R$!r' `!a3 i% n.5 AUl{ +(s"eS e+ v ds  RN`!2 LISR#0zGz?H)@Q'lJA$JUp5 UI h!1% Na2a/p eU= '<p22F_>9::Nv ??35QC?U?g?y????:DNt?SG<NMU71ErOOOOOOO:E_WZI*: T]]9  tAUFxuju&zbU  J^0zGz?I@L%"+%+@#G@# 9 N$( ?Ai+4@#/3?M?\._?3*RN <62<<7%"b4+%@#d14* `?CopyrigT}t(c)W204@3M @]c@os@f&BRAr@SAa&@i@n. AUln@ HsrBeF@e@v@df@, `12`$@@M="S_@R."l>0>UhhE A] $ a-#AJaU&U&44R x(nU_p_V%^_YQU7n^o_9kn__soVi[&,eEV+[@# 7/'2U=r<6AP{r6 7@ALe~Rb ;A bAzpv%!$#+!45!%3??;,i?8%"1BFk0B!$h#+%heT @tn@eh  J@w^I JQ*(ųQ@eɟ??bKS zE,ZAeܞ?!1vT{<2B1>}8H?'5_  y(KH FT$m=#D_DWB `D]xana@+qe]aG,v6P vOv˄;vJn v^'UFDfP h,TPYYBUF"H$ @FY,b'@Fx 3F^5?~w7?8*?9?:?R_>!^wS_&w^~;<=>@ABCEFHIJKLMNOPQ!6<.V.>:'(bWMD~}MWAHIMDMDMD1HI!OT!HI!_T!HIDVWHIdVW1HIVW.1HIVWHIVWN1HIVW^1bMDfW~1i$fW1HI1HI1XoT1HIfW1HImW&MD&WMDn1HIn1Yj5 C1y1(y1y1(yAyAh}(rMDvwv Xy!(yvMDvwvW!y!(y$MD!y!(yTMD!y!(yMD!y!(yMD1y1(yHy1(yMD!HI!HI!HI!HIMtTbrg%t bhƒ 3MMMUKJ7mrEǒ`?CopyrigPtԐ(wc)Ԑ203ԐMco%sfrϡuain.Ԑ_ Al Use evd-`Vs_SEcPm!+#\94ZUY y y$R;vp~@ϾIBķ;` EnDp֐;^U0@@BR@L&d2?ȹ\.ϗȹsU3!ߤ󠠙d-e" ^zр a Y? %t^ *L6Ƒe*Ҕ!>N1#.5^@I5!@덵5A@E5@5@|5@?5@1!@1!@(q1!@^3!@1~@1!@1!@1!@11@11@1.1@1>1@1N1@1^1@1n1@61~1@Ƒ11@11@ 11@넑11@11@11@\4a@1a@IGт_/EMɎ+[TIAA^(q(q´+1 F_~?"52&rA$FG%^8@ \$d8@#w$w4wDwTwdwtwwwwwwwww$4DTdtćԇ$Hɲt`ɲ@0!17&@"4Qт9fO[E˙HD:1 # ;ih(>T9 DAUF[Vj@F_VbX?oF ?%@Q(-DT!>mu` ?A@Mut  rM.jt. b#O0l2>ڠbS Q J#U0zGzK?<@L+B#D!I$5 `?CopyrigTtp(c)p20 3pMs cq oKsk fy"j!rm !ay ik n.p Al q(s"e eq vz d `! 0@(&>,OS *Ul>0>Uh@hK1K1@b! 0Jp!6 021421 kFMB!???3E/NHOZOGE/E6O?OE54?rA US#HD:1 # ;h,>T]]A_AUFcqeQ?FLcX bOX?IP-DT!>2u `u bu  @-A!'! Kau` ?u3>bT$$J s/8'>t  :ax?O"t(Z"f%U/g$o'eS6>$'B"/%@7-? B#U0zGz?<@ LX3145 n`?CopyrigTtw (c)w 2003w M0c.0os0f21r01a0i0n.w Al@ 8sBe0e0v+@d @$`;AUa@@|6>ZM$&S!%9l!Uh5= 1I^B+J*X3Fm6R["BU_!HD:1 # ;ih(>T9 UFwcG?FbX?F[Vj@?FQ u`bA@u`b5t m ?t)5$N@5tC(A5>789:@BC&&E0&D&GX&l&3N&O&PV<6;/(/'C'W'k'''/@H26J#U0zGz?<LJB3AD5 |`?CopyrigTt,(c),20W@3,MC@cA@os;@fIB:Ar=@vAaI@i;@n., Al@ AHsBei@eA@v@d^@ `A*23@@<6> $KS3l>0>UhhQQ2A@JA9-bRXlZQ kVMB_W?_SU^o*o}gUUoo_oZUD_4rA @2%sCUHD1 # hz4TYY^B)UFwcG?FbX?@tR/?FL&d2?@Qu`bA@vu`b ]uLi-  t ? Mt`5 F B6֍"  6( '-#0zGz#?Bu!z$u`?CopyrigPtN(wc)N20 3NM c o%s f"!r !uadi n.N_ Al (Us"e e v0d `T12>0&t S7@金(2?(\??6?\.+?O *3`{?p :2b/b?2y?O2O.O K ETOfOA=Ђ'DC$HP?Y$^T}IPLE haF9EW'6!D0> EVF62OOJHD:1 # ;ih(>T9 nAUFwcG?FbX?F[VjhQ u`bA@iut5bt)$  N@?DP=[gL7>;V=<>dPlDJ#U0zG/z?<@LB.#n!s$5 p`?CopyrigTt}(c)}20 3}M c. os f"!r !a i n.} Al (s"e e v0d `12.#70@R&> VSTP#l>0>Uhhu1u1!J0J1P~2H1 k /FMBC! ?G?O CIEYNrOOGIEYEOOOIE504?[rA 0 S3HD:1 # ;ih(>T9 PAUFq4m=J#U0zGz?<@LB#P!U$5 ~`?CopyrigTt(wc)20 3M c} o%sw f"v!ry !ua iw n._ Al }(Us"e e} v d `T!2#0x@4&> VS}l*>0>Uhh W1W1n! ,0J! 281 kFMB%!?7??3+E;NTOfOG+E;EO?O`+E54?rA) aS3HD:1 # ;ih(>T9 ,AUFwcG?FF[Vj?FbXܷQ u`bA@utz5bt)$  N@?= l[9>DJ#U0zG/z?<@LB,!1$5 p`?CopyrigTt `c)c 20o 3c M[ c.Y osS fa"R!rU !aa iS n.c Al Y(s"e eY v d `!2 @&> VSTPl>0>Uhh3131J!0J! 2H8r1 k6MB!?7??3EN0OBOGEEO?OEr5$?rA  =S#HD:1 # ;ih(>T9 JAUFq4>J#U0z_Gz?<@ZLB #IJ!O$5 ~`?CopyrigTwt `c) W20 3 My ]cw osq f"Rp!rs !a iq n. AUl w(s"e ew v d K `!2 #0@.&>g VSl>0>UhhQ1Q1h!&0J!i 2A81 k FMB!?7??3%E5NNO`OG%E5EO?O%E5 4,?rA [S#UHD1 # hz4TYYR^C/UFwcG?FbX?@m?F t2?@Qu`b~A@u`b uL-  t7 @ Mt`5:F O? B;E " P6 '-2#0zGGz?*B{!$u`?CopyrigPtN(c)N20 3NM c oKs f"!r !adi n.N Al (s"e e vz0d `12pD0&3t S7@='4I$8-P?_$2ef1?7q08?\.?JO *!3`{FL&d2?p :2>>?=ByLO^O$^D TENORIG@N L ha()L9G'6!4E0!N FL6=BvOOJUHD1 # hz4TYYR^C/UFwcG?FbX?@ᨭ?F t2?@Qu`b~A@u`b uL-  t7 @ Mt`5:F O? B<E " P6 '-2#0zGGz?*B{!$u`?CopyrigPtN(c)N20 3NM c oKs f"!r !adi n.N Al (s"e e vz0d `12pD0&3t S7@='4I$8-P?_$2ef1?7q08?\.?JO *!3`{FL&d2?p :2>>?=ByLO^O(^L TES@ R@VI@I?ON ha)L9rG'6Z!40!N FL6=BvOOJUHD1 # hz4TYYR^C/UFq4>?=ByLO^O^S ALE ha)L9G'i6!40!N FL6=BvOOJUHD1 # hz4TYY^B/UFq4 D 6 'd-#0zGz?TB{!$u`?Copy_rigPtN(c)N2U0 3NM c os f"!rԤ !adi n}.N Al U (s"e e v0d R`12D0f&t S7@2ef1?7q08?\._?Oi *!3`{FL&ɟd2?p j2>>?A2y? O='kDI${HP?_$daJOBNN@. ha()L9G'6!DE0> FL62"O4OFJHD:1 # ;ih(>T9 AUFo! @FbX?F[Vj@F\.?FQ u`bA@vu`bKt5t bt($-9$@n>R6dVIfKJ.""(&J#U0z?Gz?<LBf#!$5 l`?CopyrigTt `c) 20 3 M c os f"!r 1aQi n. l#0 (s'2e e v90d0 `I12f#o0@&>c $ SLS#l>0>Uhh11!0JS19 5B@Hl1 "kz"kBMB0+O=G?IOECENOOWEE_EO%_5h4!O""rA J0""SV3UHD1 # hz4TYY^B)UFo! @FbX?@tRg?FL&d2?@Qu`bA@vu`b ]uLi-  t ? QtJ F B H  6J '-#0zGz?HB%u!z$u`?CopyrigPtN(c])N20 3NuM c os If"!r !adi n.N WAl (s"Ue e v0d / `12>0n&tF S7@(2(\??6?\.?JO*3`{?p :2b/b?2y?O2O.O KETOHfOA=?'DC$HP?Y$haREVIS'PON)P TdPF9NMW'6!D0> MVF62OOJHD:1 # ;ih(>T9 LAUFo! @FP( B?F[Vj@F\.?FQ u`bA@fu ti5t^ b Qt($F9 ?l]B>.[JLMEJ#U0zGz?<@VLB #L!Q$5 l`?Copy_rigTty(c)y2U0 3yM{ cy oss f"r!ru !aQis n}.y Al U y(s"e ey v d R`!2 #0@0&> $ STLl>0>UhhS1S1j!(0J!Pz281 k  FMB!! ?7??3'E7NPObOG'E7EO?O'E54?[rA ]S#HD:1 # ;ih(>T9 ,AUFo! @F\.?F[VjN?FQ u`bA@u t5t b t($9bDlC>Z$J#U0zGz?<i@LB%,!1$5 l`?CopyrigTt `c])c 20o 3c uM[ cY osS Ifa"R!rU !aQiS n.c WAl Y(s"Ue eY v d / `!2 @&> $ KSLl>0>Uhh3131J!0J!N 28 p3 k6MB!?7??3EN0OBOGEEO?OEr5$?rA =S#HD:1 # ;ih(>T9 ,AUFo! @F"H$?F[Vj@F\.?FQ u`bA@fu ti5t^ b Qt($9BlYADJ#U0zG/z?<@LB,!1$5 l`?CopyrigTt `c)c 20o 3c M[ c.Y osS fa"R!rU !aQiS n.c Al Y(s"e eY v d `!2 @&>c $ SLl>0>Uhh3131J!0J!i 2A8r1 k6MB!?7??3EN0OBOGEEO?OEr5$?rA  =S#HD:1 # ;ih(>T9 (AUFo! @FbX?F[Vj@F\.?FQ u`bA@fu ti5t^ b Qt($-9DlE>HJ#U0zGz?<@LJB(!-$5 l`?CopyrigTt `c)_ 20k 3_ MW cU osO f]"N!rQ !aQiO n._ Al U(s"e} eU v d^ `!*2 @< &> $ SLl*>0>Uhh /1/1F! 0J! 28in1 k6MB?7??3EN,O>OGEE{O?OEn5$?rA 9S#HD:1 # ;ih(>T9 ,AUFo! @F|>?F[Vj@F\.?FQ u`bA@fu ti5t^ b Qt($9BlYADJ#U0zG/z?<@LB,!1$5 l`?CopyrigTt `c)c 20o 3c M[ c.Y osS fa"R!rU !aQiS n.c Al Y(s"e eY v d `!2 @&>c $ SLl>0>Uhh3131J!0J!i 2A8r1 k6MB!?7??3EN0OBOGEEO?OEr5$?rA  =S#HD:1 # ;ih(>T9 (AUFo! @F\.?F[VjN?FQ u`bA@u t5t b t($-r9DlG>kJ#U0zGz?<@LB(!-$5 l`?CopyrwigTt `wc)_ 20k 3_ MW cU o%sO f]"N!rQ !uaQiO n._ _ Al U(Us"e} eU v d `T!2 x@ &> ,$ SLUl>0>Uh@h/1/1@F!0J8!- 28҄n1 k6MB?7??3EN,O>OGEE{O?OEn5$?-rA 9S#HD:1 # ;ih(>T9 (AUFo! @FbX?F[Vj@F\.?FQ u`bA@fu ti5t^ b Qt($-9DlAHJ#U0zGz?<@LJB(!-$5 l`?CopyrigTt `c)_ 20k 3_ MW cU osO f]"N!rQ !aQiO n._ Al U(s"e} eU v d^ `!*2 @< &> $ SLl*>0>Uhh /1/1F! 0J! 284n1 k6MB?7??3EN,O>OGEE{O?`OEn5$?KrA 9S#HD:1 # ;ih(>T9 _AUF 3 @FVj?F"H$?IP-DT!>2u `u bu  @A' G ]u` ?ulA=b  J& |>?bX?Zt`@tuJht bbK"Q/|#|k&?.X'L&$/ "7-? BUIb1g45 j`?CopyrigT}t (c) W2003 M0]c0os0f2R1r01aP i0n. AUl0 8s2e0e0v0d0I`AU+@@M=eI$Z" S %l>!Uh= 1XI(BJ*\31FV!<N "BEO UHD1 # hz4TYY= N^MUFo! @FP( B?@~ N%?F\.«?@FQu`bCA@u+uL-  tB tR` FZ  ? 8JIKZ$  6 " '-@L#2efa!?2qi f/? #?V?y 3VqFL&d2?p :2>>?R"#1 4+k`?Copy_rigPtx(c)x2U0H03xM40c20os,0f:2+1r.0g1aZi,0n}.x Al0U 28s2eZ0e20v0dz0 R`12#0 %f&t S7j#B##0zGz?$=#7VDDfHP?5D! %aNOz0 40ha()9'G'_&!DE0. F6"//*j(da_k__THD:1 # ;ih(>T9 oAUFڐUK@FVj?F"H$?IP-DT!>2u `u bu  @A' G ]u` ?ulK>Mb  J0 |>?bX_?$t+`@tJj"uLht bbK["a/s) "܅&?"'"/%"7-,? 5BU|145 j`?CopyrigTt (c) 2003 M0c0oKs0f21r01a` i0n. Al0 8s2e0e0v:@d0`AUE@@M="" S%l>[!Uh= 1IBBJ*v3F!<N "BEO UHD1 # hz4TYY= N^9UF 3 @FP( B?@Q?h:?F\.«?@FQu`bCA@u+uL-  tB tU ILFZ  ? $-KE " P6 '-@t#2efM!??2qU R/k???ye 3VqFL&d2?p :2>/>?%#!$+k`?CopyrigPtx(c])x20403xuM 0c0os0If&21r0S1a&0i0n.x WAln0 8sr2UeF0e0v0df0/ `12#0n&tF S7jB##0zGGz?=#'BD DRHP?!D!^Dl0TE 0ha )9'G'iK&!oD0. F6"//*Aj(da_k__TUHD1 # hz4TYYJB%UFUK@FP( B?@B?F\.«?@FQu`bCA@u+uL-  tB tV`KLFZ  ? [M D 6 'd-2ef9!?2qA >/???y 3VqFL&d2?p :2>>?!$k`?CopyrigPtx(c)x20 03xM 0c 0os0f21r0?1aZi0n.x AlZ0 8s^2e20e 0vp0dR0 `1 207&t S7jB=~'4?FP?#0zGzD!y|aDES<0RI@T@ON 0haP9NG'7&!!D0w. F6"//*j(da_k__THD:1 # ;ih(>T9 ,AUFo! @FF[Vj?FbX?Q u`bA@ut5bft b/Et($q=lN>kJ#U0zGz?<@LB,!1$5 p`?CopyrwigTt `wc)c 20o 3c M[ cY o%sS fa"R!rU !uaUiS n.c _ Al Y(Us"e eY v d `T!2 x@&> ,$ SPUl>0>Uh@h3131@J!0J8!- 28҈r1 k6MB!?7??3EN0OBOGEEO?OEr5$?-rA =S#HD:1 # ;ih(>T9 6AUFp?@FF[Vj?FbX?Q u`bA@ut5bft b/E)t($ /?=nlO>-J#U0zGz?<@LB6!;$5 z`?CopyrigTtg(c)g20y 3gMe cc os] fk"\!r_ !aUi] n.g Al c(s"e ec v d `! 2 @&> $ Sl> 0>Uhh=1=1T!0J!h"28|1M k6MB` !?7??3E!N:OLOGE!EO?OE|5$?rRA GS#UHD1 # hz4TYYR^CCUFp?@FbX?@:Qk*?F t2?@Qu`b~A@u`b uL-  t7 @ )Zt`5tjO?:XF O? B[P D 6" 'd-# #0zGz?TB #ҏ!$+`?Copy_rigPtN(c)N2U0 3NM c os f"!rԸ !adi n}.N Al 0U (s2e e v"0d0 R`212 #X0%2&n S7@= #'4]$8,?s$ #2ef1?7q@H#?\.?JO *"!3`FL&d2?p :2>>?QB`OrO^DR 0WN ha)`9 'G'i6!405N F`6QBOOJUHD1 # hz4TYYR^C9UFo! @FbX?@:Q[?F t2?@Qu`b~A@u`b uL-  t7 @:-t`5tj:F O? BZ$  6% '-##0zGz?B#!$+`?CopyrigPtN(c)N20 3NM c os f"!r !adi n.N Al0 (s2e e v0d `(1 2#N0&n S7@=~#'h4S$8P?i$重#2efv1?7q08?\.W?O Z*!3`FL&d2?p :2>>? GBVOhOdTaCE K@D haP )V9'NG'6!40+N FV6GBOOJHD:1 # =h,>T]]>_AUFees@FUbX?F N?IP-DT!>2u `u bu  @-A!'! Kau` ?uBR>bT$$JF MQQ>.t`@tZ!^"  ~jtx?ntm"Uw?O"U/g/y&'F(qk>$B'B"/5@,7-6?0#U0zGz?<!LB3145 n`?CopyrigTt (c)020@30M0c0os0f21r0"AaT i0nN 0Al=@ 8sABe@e*0vS@dN"`cAU@@6>Z}"&S!%9l>!UhE=w51IBVJ*3F6R["At8(U8_ t8bHD:1 # =h,>T]]>_AUF"2J%@F bX??IP-DTo!>2u `u bu  o@A!'Y!T Kau` ?uBS>b$$JP9t  tM$&@%l>!UhE=O51XI^BJ*X3D&m6R!L8U_f L8b_H8u5 ]1c>Hr_TFl%mX#|v-B tXY|]paTn]@+ q ]Na+=Oas//'/9/K/]/o/////////?#?5?G?Y?k?}???G v>Pv,q3v2?v06D/v6vw6v`l6|v\6\v(e6<v6Tvj6lvK6v?6v?Gv}6vXs6tvcuGv.h64v}YvW3PaOHԿ vX!v 6"v 6$v 6%v6d'vY$)ovJY*Za6P~Y+vZ)W-v2o 6,.&@"FUFDfP h,TPYYBUF"H$ @FY,b'@Fx@@kR @@"H$Y,bD4 ;UGD # h4^T(YYUUF"H$@FY,b@Fz^@F|>% @P} u` 7?u MB^J2Y2 oa g _Q>R~RRR..Wn:H)~]- M$}$tM$-tSbrg"t)T/ &"&")22HV!*U>~8Do3}:'v%b/!߀~@=/6=7OI"72M` Eventroop!w!>dasETAf2:2!! X)E|c8Rph0F5S?bKr, U? bk h !R1#~BT&v2x%DEVsFUn3r (RQ݃b7'BE9yچ>4-Q4tR4BFL|R&@f2BHaa;Og1I4 tHD: "# ;ih ,>T!  9 rAUFL&d2?F[Vj%@FH$D"@F8 đO?FQ A@u`b[u`b  #t p APt)hdOP m$>znR.z7n"" &J#U0zGz?@LB=6#<D$Z(P?MJ6#!$5 `?CopyrigTt (c)020 030M c oKs f"!r ,1a i n 0AlG0 (sK2e0e v]0d `m1 26#0@3; #GS !%l>z8 >Uh z [!6#@aZz3HD: # ;ih ,>T!  9 B:AUFz^@FTirj#@Fܪ?FL&ɯd2?Q6 u`bA@u  bl;rhp Lt -t [>H=JU5 BL=8L="?O&P?MB!$5 `?CopyrigTt (c) 20 3 M c os f"!r !a i n. Al 0 (s 2e e v0d0> `/1 2U0@Z3;O sS Kl>0>Uhhh!\U 250J91"FS t6BAH  hFM&(@0D,O>G?JOFCEENOOWEE#FO>O_ElN4"OrAT7S<3dAb9 `6eLAfV4ofVsp aH)"HD "# =h4>TBE=]4AUFdu@FTirj#@@۪?Fo6]??FQ u`bA@6u`b  *uLdp :-7LOa.Wg] !r+it p 8rA! >& ]&&u&  ^"d&JsUM!;z@"L,(LJ"26Z ?I9d[?s?O3u0>1&"2""I*y$#IA D+`?Copyiht (c)?@W20K@3?@M7@]cos/@f=BR.Ar1@jAa=@i/@n.?@ AUl@ 5HsBe]@ev@d}@F R`A42#@@M=ΰ!t SHj0z#\#o2qP?_,VM?\.W?0"J@=#':C?V]P?7l0>Uhh~U@= U&A$s@3bR9e9`J@#8^aQ>!ybp:a(^e&oo7?ok5n%oo3we7^noAe U^ooo(D#T 7@Ale7(;IX'7A'0UŐVQQ][ 7Tf,>1'(ųQ@v= \_?]#b"z%x%,Ab}I1T{}d֏#Fz^?@F$vd'vF4pT'3I"2'HD: # ;ih ,>T!  9 B0AUFF|>%@Fz^O@Q6 A@u`b[u`bj  t -At)LGA` >HJ#U0zG/z?@ML=0<L9"$I(P?MB!$5 `?CopyrigTt (c) 20 3 M c os f"!r !a i n. Al0 (s 2e e v0d > `+1 2Q0@V3; #GS l>< >Uh$T T!.$2 250JL&d2?F?x<$@ 22(DE.DC1 M"($J?F[Vjh#ƿ#hBGaE RLt@aEDCjD1/1B!E) f%OAU !)Z>_PSRRCKXU{U_Y_Z1_9__ReU19$M9>LZoli5J4*OT!  9 Bu`b[A@u`b  t  =?,t(7C2jQ"AEJ#U0zGz?&L=#<LE"$U(PV?MB#I!$5 `?CopyrigT}tY(c)YW20 3YM ]c os f"R!r !a i n.Y AUl0 (s2e e v'0d 0) R`712#]0@b3; Y2S ,Jl> >Uh$11 !:$2 BR E @Ju#FL&d2?F[Vj @ 22PEPC71" 1 |B1 RFM.(0DK8B?FD"H$@F ?FԘJ @i&DZx 0dFhwrA PCSrB0 VTOFmEu1CPBCB90DEF1UyQZ_SR^CXuUU_Yoj1(o9GoYoeuU1Y7F9JDToj5HV46OlURD3 dAb9 $&+}\.?F?h#?f'1p1[st@!SnD p5UAwBB"S `W52{CSNC2S[RGeSUHD "# hz4TYYJBUFL&d2?Fu:N$@FZ[&<@@~Xk[s?F?Q} u`bCAmu` ? &uLdp:3.&t{p b  d` 5 3t]absqH  ^V$, "& )-UP"3@0i ?T/  "'ru5?@|"|"%3/E$%Y#14_+`?CopyrigPt (wc)@20 @3@M0c0o%s0f21r0,Aua0i0n.@_ AlG@ 8UsKBe@e0v]@d?@`mA2Y#@P%XSIO0F#zB\Y#2q@?OFP#?\.? :@醉=Y#?3?fVP?BM(AaT0]tG@e/)Bm0Ua=@y@N5@m]@BA jhaP I{Y'f_0f!3Cb0PKfn@3!T0f _]@d__OY#FS?e@o }yG"iooŔXY''0Uroj>bgeKf$V ZvL!u_\H5 gJ DXC@ FL&m'#v)wB ,YY>*}pano@+|WqoSaG0v+%t1v*/T2v12L3v4Wd5vP9ɻ|6v=ӻ7v?@zUFDfP h,TPYYBUF~@x4T6D UF~?$D"?Fx<޻?P} }r      1AQaq\A+)G&@$ +)g&@$10$1@$A0$A@$a0$q0$ /u` ?2u9Ab@5I6 I1Ux2aLK@o2ԁ3I14;-`Vis_SE.}cPm!#\W92\6?1`?Copyr0gPt (0)@20+@3@M0c:@o0ofBAr@JAa@i@n0 @Ale@ HsiBe0e@v"{@d0@0M3 :834a@0  7?48@L&d2?#]4X\.,FX$^sUlQjV3_6d0I0 0A={t$1qQaϟϱ!h3Ao&!,,r7bo23x5Sj8cb]ƳÅZ;#%B31a=tFbF;UH puD, " "# U   >h /T  M MUF$D"?Fxp/"/\`//  //0/(:L^p BP(?Fz^<AA}/pN/?r/ O?/Q,ovHGOYO/F5OA OO/??_lKQ1P?b?t?? ????|O'?OO oODovODQ,{~ooOoo2oo$_ozo:o _______o)a0 GSooWo{oQ,l6f뵏ǏEi)[HqՏ @'9캟̟󏎯Q,x<Q;,<@`诨 HD: "# ;ih ,>T!  9 DAUFxJ#U0zGz?@LBg#<$](P?Ajt"jtI*#I!$5 `?Copyri@ h}t((c)(W20 03(M ]c os f"R!r (1a i Wn.( lC0U (sG2e0e vY0d;0 `Ti12#0x@,&>Ytq S#l> <>Uh$11 !!#@1106BT!  9 1AU@FxKJ#U0zGz?LB]A<$J(P?Aq#x&M!$5 `?CopyrigTt(c)20 3M c os f"!r 1a i n. 0l&0 (s*2e eJ v<0d0 `L12r0@&>mt^ S@Z2l> < >Uh$11 x!!@10JBE@J(V1 n ][_Br?2 q$FMBHJ9_OqOEE%EO}KOI[\O@_TE^_=_V1_wPjZ__Xx!o0o_GE(5k4KOrA cY3HD: "# ;ih ,>T!  9 MAUFJRT?Fx<:?FqQ9Aat` p A ?n @t?h*bk<uib[u+3t+a  - >J#U0zGz?@LBg#<$f(P?Attnt*#!$5 %`?CopyriI ht2(c)220032M c. os f2!r 11a0i n.2 lL0 (sP2e$0e vRb0dD0 `r1*2#08%S $#l><>Uh$ !#@*:0?BEEE@J|1 Pz[B?2!A FMB&!nJ9OO UE%E@OK_$Y8[ ΂Of_TE8^_c_4'VA_PjZ__XA9oVooGE!E4qOrA s3HD: "# ;ih ,>T!  9 6AUF$D"?Fx<:?FQ9At` A@t s?hp ^b%ub[uah  hAJ#U0zGz?@LB]?<h$O(P?AV v#}&RMҮ!$5 `?Copy_rigTt(c)2U0 3M c os f"!r 1a i nU. 6l+0 (Us/2e0e vA0)d#0 `Q12w08OsS  @_2l>}!< >Uh$}!}!T D!@}!0B$E$@PJ[1 s c[dBxK?A v$FMB!MJ9dOvOEE%EOKPOY[aOE_TE^_B_V1_|P?jZ__X1o5o_`GEEp4POrAc^3UHD # hz4TYYBJUF$D"?@@9*?@#K5G?Q} u`ۀAbku`u eu`8?*t^b T $E  ^V  i\U?/2q4 ? #?\.+?8[R+#/"( W]T?"8?8bL$d%-Q22C.6"'"B ԕ7/ "C!& "U B#dA"A*G`?Copy_rigPt(c)2U0@3M@c@os@fBArԍ@Aa@i@n}. Al@U HsBe@e@v@d@`A/"#-P %"xS13(!aSuUbBt@eB@jy(da_ihaE 5Yz|GW'0U'bi!&!.D0X.i V5V"p bjkH_odUHD D# h>4TE 4 dUF$D"?Fx}pUHDF # h,TP  B`UF$D"?Fx `bdp :- 32.N;?*"B #14&+`?CopyrigPt(c)20@3M@c@oKs0f B1r06Aa @i0n. AlQ@ HsUBe)@e@vRg@dI@ `wA*2 #@%C!F4SN13i^^ Ir 'G'0U3R?!05 FIC"{AAkSb(haTz@tQ@e _H4' I@S aN~F,'mTE#vFGB aDHxa\no@+TqoKaGo9voP:vN=vT>vdW?v;Zy0]y`ycAyRf=UFDfP h,TPYYBU?Y,b'@?#H$ @Fx4T6D U@?j6@@Çjl@FNt?Fxh40JTtEI RMUFNt?FxT ]]9 S AUF$D"?FP?@i ni?@Q#)Q6 <tZ`]u p Ab{ @(݀@u*l`::"  :3&tpul;?Q{u bKb:T  . ,A >'&$&&&]O#JU0O?贁Nk?<L_!&7#$+##J" !t#&26q10?&#?\._?l$.b"063'6"BI@9*ȡ56 uLd(-7HAA 9(CL6:OLQ="&"+"H_"J'2+/@BT"+"G2#Q!';`?CopyrigTtk(c])k20_P3kuMKPcIPosCPIfQRBQrEP~QaQP]iCPn.k UlP IXsReqPeIPvPdP `5#5P@M=BMlS7@"ql>;!Uh+!5 :QqU,atba|c`J:#D9Gl4"(@eo!o(bTKPtPe jAbE9 Ys!$&;!3r0v0#!$&b?t$1HDB # =hj8>T ]]9 RWAUF$D"?FP?@i ni?@w<V?Q6 "t`pAw@KtA` gu 5ulE&u bM ugZ b  .fEA]j] >$MJ-U0zGz?@$L)v'#?q&o2q ?q&t$\.?l4O##&Y"G'#Iyhw)6P?AP+7'#.L"PBAI6? *<t0`bd: & @ 6!P1"cD&65xW:OuS#y2'"E'#AD5 '`?CopyrigTtk(wc)k20P3kMPcPo%s@f RAr@8Qua Pi@n.kU lSP XsWRUe+PePviPdKPJ `yQ"'#P@M=y1 SAB@Y"l>0>Uhh МAV4] a:b@e @`J%& V"Y"_Hua! sЯ9;N5[ F (mi#vkwB T[Yl}qaԟno@+WqoUaGyMmSPtyrʄ4 yjwL y{-UFDfP h,TPYYB)U?Y,b'@?#H$ @FxCaaHc?@m@e@t%e^ (A>#UYGT6 qp'9K]Dz~@OOOOD3 8 'HyDDrag thuesapWonodwipe.umt)clOyiKzdf)tex:T 8b@ @\.Gz?TW~@Y?j6ks4 ;UGD # h>4T6D U@?j6@@ks@F@ @F\.?FP} ru֌` u|$?v P\`|uE ] ]`]]    ƕL\Xx$|$ !)$uz`Q\!0bq]o=I t77R̿۹}KBK&}Ǹ25!S0"Tû#Rٍp}%Y@rX@?Q22AXBT!  9 AUF@ ?F\.?@QZ t` bA@t ?#9>uX5nxu9 Ub  UJU5 L BG # "?i?]&P?A.b< # @#;5# KS *-#% #!$5 J`?CopyrigTt8(c])820:038uM&0c$0os0If,21r 0Y1a,0i0n.8 WAlt0 $8sx2UeL0e$0v0dl0J `1l> n0>Uhhn@n1 $w aB%E@J18DF~ [XBjAh2  hFMB@>DNO? lOhCE%NOO2WEEEF_`O@_E2>O;rAS HD: # ;ih(>T9 ZAUF@ ?F\.?oF@v??Q "t` p A6@t ?2Gl>uf|)uGb  JU5 LTB<#T @Y#; bS8;##!$5 X`?CopyrigTtF(c)F20 3FM c os f"!r 1a i n.F l$0 (s(2e eJ v:0d0 `J1l>0>Uhhe1e1 !$ a250JT160EBAv|  k:FMB@4??OCTEdN}OOGTEdE6OOOTE52?;rASs HD: # ;ih(>T9 JAUFx?"Q hp A[@u`b" ?2$u`kb1,tb ?Ql>R$/  /JGU`H??'&Ps?Ab(B< #n @s#;L# f\t+ S #!$5 q`?CopyrigTt~(c)~2003~M c. os f"!r #1a i n.~ l>0 (sB2e0e vRT0d60 `d1l> pUh  ~! #@ a250Jn1*0Bva ?i kPFJMB@Dq(OF!2KG@jEzE9O0MGjEb2OErAIS HD #=h4>T3 []9 P AUF@ ?@9*?@*IjQ6 u`bAo@"t p t ?u7`PuF`. d>Axi~ uH>Fb *&  J-U0zGz%?@L2"%8%7M#5 'LGM#5 #[$(MP?Av+B&C? #Z> `bdL I@2x9]?n ""M#AD5 `?CopyrigTtE(wc)E20@3EM@c@o%s@fBAr@Aua@i@n.EU (l@ HsRUe@e@vPd@J9 `#Q2$IP@M=m"=S17#l>0>Uhh:U AR$@R%UPJb!8@1b&>!*b35h(eV6 o7?>oPk%fn_5oogVeEno2ooVeoxo8oi(he(bT@t@eu HDB  #=h4>T3 []9 REAUF@ ?Fv5?FTn?@!拮jQ6 u` ?A_@t4 7pb u`@ *@ uj `buo`btAM`gtu.E > >$қb.*<& < J=U0O贁Nk? @LT"b u&]"重fo#2Ǎq ?/&?\.? E(4 6!T"Z%@۪1&>nquLd@:Fb-h$2< "P<&-A1B ' "E"+o#1B@G*72Bo#AD5 `?CopyrigTt)(c))20P3)M@c@oKs@fBAr@ Qa@i@n.) Dl;P Hs?RePe@vQPd3P[ `aQ2o#P@M3B!STh@]"l>,>UhE mEAUfa]ba&c-`J6o#F?7 C4]"勷(9JdY>7@yo48n$g9od"&fmEa9#3(bD@u+b;Pe0c;P Qk)t@qy@e) 1Po@RQ4SSrTQqcB"pi@q"s\Qqqhr,Qs. jA3emE9 Yb!yD$lw!30h[ C!w( ?4$Z%i$6UyD  '$"6 V"R]"HD: # ;ih(>T9 JAUFx$T/  /JGU`??'&P?Ab(*B< #n @s#;L# fe\t+ SS #I!$5 q`?CopyrigT}t>(c)>W2003>M ]c os f"R!r #1a i Wn.> l>0U (sB2e0e vT0d60`d1l> p Uh  H~! #@ Wa250BJn1*?0Ba ? k)PFMB@DqOF!2KG@jEzE9O0MGjE2OErAIS HD: # ;ih(>T9 JAUFxJ$/  /JGU!`??'&P?AbU(B< #n X@s#;L# f\t+ S #!$5 q`?CopyrigTt>(c)>2003>M c os f"!r #1a i n.> l>0 (sB2e0eJ vT0d60 `d1l> p Uh  H~! #@ Wa250BJn1*?0Ba ? k)PFMB@DqOF!2KG@jEzE9O0MGjE2OErAIS HD: # ;ih(>T9 JAUFxJ$/  /JGU!`??'&P?AbU(B< #n X@s#;L# f\t+ S #!$5 q`?CopyrigTt>(c)>2003>M c os f"!r #1a i n.> l>0 (sB2e0eJ vT0d60 `d1l> p Uh  H~! #@ Wa250BJn1*?0Ba ? k)PFMB@DqOF!2KG@jEzE9O0MGjE2OErAIS HD: # ;ih(>T9 JAUFxJ$/  /JGU!`??'&P?AbU(B< #n X@s#;L# f\t+ S #!$5 q`?CopyrigTt>(c)>2003>M c os f"!r #1a i n.> l>0 (sB2e0eJ vT0d60 `d1l> p Uh  H~! #@ Wa250BJn1*?0Ba ? k)PFMB@DqOF!2KG@jEzE9O0MGjE2OErAIS HD: # ;ih(>T9 AUF"H$@Fx$  /JGU!`??%&P?AbU(B<#l X@q#;J# pf?S#!$5 {`?CopyrigTtG(c)G2003GM c. os f"!r !1a i n.G l<0 (s@2e0e vRR0d40 `b1l> 9Uh  ~!#@ a250Jl1*0Bvk ?i kNFJMB@Dq(OD!0KE@hExE9O.MGhE2OErAARGS HD: # ;ih(>T9 AUF"H$@FjZ?Fx<Q9@hp A@u`b,t+  ?]u`b1"HPallAR$  /JGU`??%&P?Ab(*B<#l @q#;J# pf?ST#ҿ!$5 {`?Copy_rigTtG(c)G2U003GM c os f"!r !1a i nU.G l<0 (Us@2e0e vR0)d40 `b1ql> 9Uh  ~!#@ aJ250Jl1P*H0Bk; ?k kNFMRB@DqOC"0KE@hExE9O.MGhE)2OErAARGS HD: # ;ih(>T9 AUF"H$@F\.?Fx<Q9@hp A@u`b,t+  ?]u`b1"MH@Qal[>$  /JGU!`??%&P?AbU(B<#l X@q#;J# pf?S#!$5 {`?CopyrigTtG(c)G2003GM c. os f"!r !1a i n.G l<0 (s@2e0e vRR0d40 `b1l> 9Uh  ~!#@ a250Jl1*H0Bvk ?i kNFJMB@DqQOC"0KE@hExE9O.MGhE2OErAARGS _HH lҮ 9_E!'F(mw#?F BP(?FPn} Q^&BJ&J6JB2 kv6HRfv/ r""#u`h9#uD%?bJs%|& |!UԱ?/ :"@)c :"V)6H@)b!:"V/:$)H2 P$hb=j)#"/L@"%ԥ#14;-`Vis_SE.cPm!#492,@]2`?Copyr@UgPtg("@)gW20_@3gM@ucI@o@ofQBRBArE@~AaQ@iC@un @ gAl@U IHsBe@eI@%v@d @$` C4s  7?h#| ]8@L&d2?W]hX\.,zXX^sUQV3_6d<%Uef!$^Cf!Y ,v"UHTa|`dkkLe`d&kggYdaoz ETae@$s2:t2X)tB) 6t(]chk@1B"Arsfr4bhra]s5dFq5Qc?bsalsJVmr?rqbv5Szt]D"q"##TfvKs,qh? b Q ^b vE9/crjtp`tRG3"Bu"Wv&@炜"mo5mcz (c1E9 `@cHa`ғݓ @R@tmBs `TPe&@a_,"`*C@a@siB;{BnQ@ErG@;@l@g@9;)NC@;p@d2v""dha ]l%:`Аh7@h9"fsN hsvM2r8XtA!&rs>0| 0񓴀n[=0rCt91`r䝵H7##n72#ťB%*HҘlH2vAbs 022b"nVI[m"(c9h (5=61C-W&z@ Q@ogf@RA;xQ@s f,"vr`# SkBA#A.+pӀ~0Yu#|&%B[s^B{ňM~4TB]]9 ;UFwa?F BP(?Fk?Q t` b~[A@t>00 /HDCLfWfCLWC]LWu V-@ #p   b 9W9Rd9p99u .k$}? R%) (U&  J-U0zGz?@L"%BG#?<h 4^8P?AJ(4##I145 `?CopyrigTt (c])020030uM0c0os0If21r0 Aa0]i0n.0 Ul$@ 8s(Be0e0v:@d@ R`JA2#ap@@M=R2S T l>0>UhhAAH11#@ a RPe GJ1xk #Vu`?+dR)wPBAܧ H?F Fͺ?FZ-?FȌ?P_9@ (&Ū'@b[ҔSBw\ڱFwU#TvըwU%qwP:|" W,I? Gb@ }|\@ 4CޫY?"4 B(B"=oOoagr#5EQ5U}I>?F}c{R?FRS1_\w\(=lRyl'4ooojnzo|n/#lUbS WPO!?F$qήx?FQoߕ?PfQ %ow\0 M0w\`z^l\ߢlRWgw\Fߑ? ?ʢuHrftgM#lUR]F >*CWPG'0\]q_Z~ i0 W&d4 jn⟥nk#hHD: # ;h,>TB]]9 ;UF>?F BP(?Fwa?F`K?UQ t` bA@t>0$0 /HDCLfWfCLWC]LWu V-@ #p  _b 9W9Rd9p99u #գIJ? J% b*&  J-U0zGz%?@L"%BG#A< 4^8PS?A(4#J#145 `?CopyrigTt (c)020030M0c0oKs0f21r0 Aa0i0n.0 l$@ 8s(Be0e0v:@d@ `JA 2#p@@M=R2S 0@"l> 0>UhhA@A11#@ a RPe GJ1F4ɂ0 #tdRkq+?"BAמVm^?FRk?F}XyI?FRw Z?PfQ >ow@b[|PzY, %8U#Ѯ2rU\VTP:|" \Fߑ? ʢuH@ }|\@ 0CޫY?"4 B(B"=oOoagr#5EQ5UXyX#PQV߱IPPލ5_\v'W]p\d?s=V&djTE,4ooojnzo|n/#lUW^}?F d?F yk ?P_9@ 6&Ū'\u ?C\Mqߘ\larl`ߴCgwW,I? rftgM#lUQ^F`u?F_'0\p_[ ix7êm&d8N~Wmk⟥nk#hHD: ! # T=h4> T]]9 UtAUF>?F BP(?@i n?@߾3?P* t` #?A@t *uL'bdp :K-&YDV._hA uu&b  J#U0zGz%?@􉄍+@#o|&:#N$( &?A4\@#/.?M?\.?J#%T%@#14p: `?CopyrigTt(c)2003M0c.0os0f21r01a0i0n. Al@ 8sBe0eJ0v+@d @, I`;A2@#aa@@M="S_ 3)l>0>UhhRE 1 z$ a-#JaU&U&X0R;Rn(U&_p=_OV%`^y_YQPU7^_8_[_r_oKVi[&,ePEV+K@#|'2Ub)76!$Ah; 7v@@ALeRb ;KA b:A0z>pBv%!Dkb'MaM@#j0cnv yX*<N`rx r7jAle7;iIz'7?†!3Ղwv1ijm<iԅ?>CEFkoq &MheT0t@e 0XjQz*(8Nӯ@?%,Cz 5,ZAOeO^gT{<21>}_HZ'% 2cb Ld'F)mw#,cDuB Y7}xano@+qo[a+=OasG|/m P//'/9/K/<1m_T2mԹk"//////-mC}&UFDfP h,TPYYBUF"H$ @FY,b'@Fx?F_~%w@P} u` ?u & : /T^W o o _DW _WoUooo//*a0o1o2//a~_b_o_&WA_&W&Wo_>6W_^6W&Wodb6WA_6W&Wohb6G--.666&^&W"PYIL'LU(L,L-L.L!I>!IN!I^!I^I~IIIII!I!I!I!I.1I>1I^1II1IdI1I!I1IhII!II.+.D>: t.Q8y&t>&tN&t^&t1YA^~1!1h!*!"$q!&~HUNaAl˒a!l}aYlːala^lEa~l|aĎlˡaĞl^]Ⱦl~]lˎ]Alc_Al˾]l]!l!]Ql!]Ql!].Ql˞!]>!l.1]N!l>1]^!l˾1]!l˾!]!l1]!lhaĞ!l].1l]>1l!]^1l`l-]Ȏ1l1]dl˹]Ⱦ1l9]Ⱦ!lq]1lA]lǷqA3eRɮ+BT}qqN:0KFxT  A_AUFF~@%@I|`<P2u `u bu  @A!'! Khau` ?iu>kOb$E$J9t ltZ"O"U/n&[!$'"/%'-? B#U00b/?J<@ (0JP3145 n`?CopyrigTt (c) 2003 M0c0os0f21r01a0i0n. Al @ 8sBe0e0v#@dN@`3ArUY@@M="V&S!%l!Uh5= 1IVBJ*P3e6R!BE _?'SUHD # hz4TYYR^CFUFX-l ?F @@V?@. u??Qou` ?Ao@uuLbd-Z8.F#-t`/ts_b%Kt`OfW?Yn Ys E O0U U1 A#2 dh\!b"&7U2!69@>!\327qc0?b?t63?\.+?#"hU0zGz?@T3AD;`?CopyrigPt (c)F@W20R@3F@M>@]c<@os6@fDBR5Ar8@qAami6@n.F@ AUl@ !wSF%=~3Gh&T46XP?4 %#TN6@. >@#c9IX7W/'2rl28V!ST !; Vj8#cEok;oodUHD # hz4TYYR^CVUF%h Z?F @@Vg?@. u??Qou` ?Ao@uuLbd-Z8.F#t`tb%t`Of?bT7U" 39@bz\#2qs ?r/&#?\.?2hU0zGz?I@%#1$4$+`?CopyrigPt (wc)V020b03V0MN0cL0o%sF0fT2E1rH01uamiF0n.V0_ Al0 L8Us2et0eL0v0d0 `T1B2#0ؓ%#wSF %=#C,76D$FHPK?4(rCTBJ0 N0ha(()9X'G_'2r|"HFZ!cD0. F j(daS_kI__THD: # =h0>Th]]P> ZAUFr\.?Ffp @F@5EMQ?@. ? ?Q6 u`bA@mu` ? t t  UR$AGjq$%tA`/f?k B >WBIb9T J-Uz 4#&?9#"#0zG[zG#@ LKB")G BK %"#!4!<';`?CopyrigTtQ (c)Q 2`03Q M 0c.0os0f21r0<1a0i0n.Q AlW0 8s[2e/0eJ0vm0dO02 I`1!2"#0@&>GS TA#l>$>Uh!E=]%!92J*"#F{&d"Z(BESO?qCZ( b HD: # =h0>Th]]P> dAUF??Ffp @FV-l ?@. ?F?Q6 u`bmAu` ? t t  fRj$)t`/Gz? %tAjf? vB >B D J-Ug >#?9#,#0zGzQ#@ LB,)G BK% ,#!>!F';`?CopyrigTt[ (c)[ 2`03[ M0c0os 0f2 1r 0F1aei 0n.[ Ala0 8se2e90e0vw0dY0< `;!2,#0@&n>GKSA#l>$>Uh!E=g%1I2bJ*,#9"d(LE]O?{Cg%T HD: # =h0>Th]]P> nAUF{?Ffp @Fr\.?@. ?F?Q6 u`bmAu` ? t t  R*$3t`aGzaG? m%tA`/zf? B >B  JJ-U H#?9#6#0zGz[#k@ LBi6)G BK!%6#!H!P';`?CopyrigTte (c)e 2`03e M0c0o%s0f#21r0P1uaei0n.e _ Alk0 8Uso2eC0e0v0qdc0F `E!R26#0@&>-GSA##l>$>Uh!E=q% 1 I2J*6#9A$"n(bVEgO?Cen( b HD: # =h0>Th]]P> zAUF+?Ffp @FTs?@. ?F?Q6 u`bmAu` ? et tZ u` 3EtQ1GgG ? %tA`/tMf?UB >*BZ$ & *J-U= T#?9#B#0zGzg#@ LńBB)GK-%B#!T!\';`?CopyrigTtq (c)q 2`03q M)0c.'0os!0f/2 1r#0\1aai!0n.q Alw0 '8s{2eO0eJ'0v0do0R I`Q!2B#0@&>GSU-%l>$>UhE=}%1I,2J*B#90"z(bEsO?ʑCz( b HD: # =h0>Th]]P> ZAUFr\.?FD(C@F@5EMQ?@. ? ?Q6 u`bA@mu` ? t t  UR$AGjq$%tA`f?k B >WBIb9T J-Uz 4#&?9#"#0zG[zG#@ LKB")G BK %"#!4!<';`?CopyrigTtQ (c)Q 2`03Q M 0c.0os0f21r0<1a0i0n.Q AlW0 8s[2e/0eJ0vm0dO02 I`1!2"#0@&>GS TA#l>$>Uh!E=]%!92J*"#F{&d"Z(BESO?qCZ( b HD: # =h0>Th]]P> dAUF??FZ4 @FV-l ?@. ?F?Q6 u`bmAu` ? t t  fRj$)t`/Gz? %tA` f? B>UB+  J-U >#I?9#,#0zGzQ#@ LB,)G BK*%,#!>!F';`?CopyrigTt[ (c)[ 2`03[ M0c0oKs 0f2 1r 0F1aei 0n.[ Ala0 8se2e90e0vRw0dY0< `;!R2,#0@&>-GSA#l>$>Uh!E=g%1I2J*,#9A"d(bLE]O?{C`g%e HD: # =h0>Th]]P> nAUF{?FZ4 @Fr\.?@. ?F?Q6 u`bmAu` ? t t  R*$3t`aGzaG? m%tA` zf? B>B  JJ-U H#?9#6#0zGz[#k@ LBi6)G BK!%6#!H!P';`?CopyrigTte (c)e 2`03e M0c0o%s0f#21r0P1uaei0n.e _ Alk0 8Uso2eC0e0v0qdc0F `E!R26#0@&>-GSA##l>$>Uh!E=q% 1 I2J*6#9A$"n(bVEgO?Cen( b HD: # =h0>Th]]P> zAUF+?FZ4 @FTs?@. ?F?Q6 u`bmAu` ? et tZ u` 3EtQ1GgG ? %tA` tMf?UBABH &T J-Uz T#&?9#B#0zG[zg#@ LBB)GWK-%B#A!T!\';`?CopyrigT}tq (c)q ]2`03q M)0]c'0os!0f/2R 1r#0\1aai!0n.q AUlw0 '8s{2eO0e'0v0do0R `Q!2B#0@&>mGS-%l>$>UhE=}%1XI2J*B# 90"z(bEsO?Cz( b HD: # =h0>Th]]P> ZAUFr\.?FZ4 @F@5EMQ?@. ? ?Q6 u`bA@mu` ? t t  UR$AGjq$%tA` f?k B>WB Ib9T J-Uz 4#&?9#"#0zG[zG#@ LKB")G BK %"#!4!<';`?CopyrigTtQ (c)Q 2`03Q M 0c.0os0f21r0<1a0i0n.Q AlW0 8s[2e/0eJ0vm0dO02 I`1!2"#0@&>GS TA#l>$>Uh!E=]%!92J*"#F{&d"Z(BESO?qCZ( b HD: # =h0>Th]]P> dAUF??FD(C@FV-l ?@. ?F?Q6 u`bmAu` ? t t  fRj$)t`/Gz? %tA`f? B>UB+  J-U >#I?9#,#0zGzQ#@ LB,)G BK*%,#!>!F';`?CopyrigTt[ (c)[ 2`03[ M0c0oKs 0f2 1r 0F1aei 0n.[ Ala0 8se2e90e0vRw0dY0< `;!R2,#0@&>-GSA#l>$>Uh!E=g%1I2J*,#9"d(LE]O?{Cg% b HD: # =h0>Th]]P> nAUF{?FD(C@Fr\.?@. ?F?Q6 u`bmAu` ? t t  R*$3t`aGzaG? m%tA`zf? B>B#  JJ-U H#?9#6#0zGz[#k@ LBi6)G BK!%6#!H!P';`?CopyrigTte (c)e 2`03e M0c0o%s0f#21r0P1uaei0n.e _ Alk0 8Uso2eC0e0v0)dc0F `E!)26#0@ܞ&>GSA##l >$>Uh!E=q% 1 I2ŊJ*6#9 $"n(VEgO?C2n( b HD: # =h0>Th]]P> zAUF+?FD(C@FTs?@. ?F?Q6 u`bmAu` ? et tZ u` 3EtQ1GgG ? %tA`tMf?U>BhH &T J-Uz T#&?9#B#0zG[zg#@ LKBB)G BK-%B#!T!\';`?CopyrigTtq (c)q 2`03q M)0c.'0os!0f/2 1r#0\1aai!0n.q Alw0 '8s{2eO0eJ'0v0do0R I`Q!2B#0@&>GSU-%l>$>Uh!E=}%1I,2J*B#90"z(bEsO?ʑCz( b HD: # =h0>Th]]P> ZAUFr\.?F/`y@F@5EMQ?@. ? ?Q6 u`bA@mu` ? t t  UR$AGjq$%tA` f? BAB֤b$9 *J-U= 4#?9#"#0zGzG#@ LB")G BUK %"#!4!<';`?Copy_rigTtQ _(c)Q 2`W03Q M 0c0os0f21r0<1a0i0n}.Q AlW0U 8s[2e/0e0vm0dO02 `1!2"#p0@&>[GS A*#l>$>Uh!E=]%!92VJ*"#F{&2"Z(BESOV?qCZ( b HD: # =h0>Th]]P> dAUF??F/`y@FV-l ?@. ?F?Q6 u`bmAu` ? t t  fRj$)t`/Gz? %tA`f? B>UB)  J-U >#I?9#,#0zGzQ#@ LB,)G BK*%,#!>!F';`?CopyrigTt[ (c)[ 2`03[ M0c0oKs 0f2 1r 0F1aei 0n.[ Ala0 8se2e90e0vRw0dY0< `;!R2,#0@&>-GSA#l>$>Uh!E=g%1I2 J*,#9C"d(bLE]O?{Ced( b HD: # =h0>Th]]P> nAUF{?F/`y@Fr\.?@. ?F?Q6 u`bmAu` ? t t  R*$3t`aGzaG? m%tA`zf? B#AB  JJ-U H#?9#6#0zGz[#k@ LBi6)G BK!%6#!H!P';`?CopyrigTte (c)e 2`03e M0c0o%s0f#21r0P1uaei0n.e _ Alk0 8Uso2eC0e0v0)dc0F `E!)26#0@ܞ&>GSA##l >$>Uh!E=q% 1 I2ŊJ*6#9 $"n(VEgO?C2n( b HD: # =h0>Th]]P> zAUF+?F/`y@FTs?@. ?F?Q6 u`bmAu` ? et tZ u` 3EtQ1GgG ? %tA`tMf?UBhABkH &T J-Uz T#&?9#B#0zG[zg#@ LKBB)G BK-%B#!T!\';`?CopyrigTtq (c)q 2`03q M)0c.'0os!0f/2 1r#0\1aai!0n.q Alw0 '8s{2eO0eJ'0v0do0R I`Q!2B#0@&>GSU-%l>$>Uh!E=}%1I,2J*B#90"z(bEsO?ʑCz( b HD: # =h0>Th]]P> AUFr\.?FN@F@5EMQ?@. ? ?Q6 u`bA@mu` ? t t  UR$AGjq$%tA`f? .B>,-UB7'($BIb9>"D& J*!= #?9##0zGz#@ LB)G BUKm%#:1!';`?Copy_rigTt _(c) 2`W03 Mi0cg0osa0fo2`1rTc01ao0ia0n] Al0 g8Us2e0eg0v0-d `!)2#@@&>G%S Ao#l>!Uh1E=%X1XIB>!J*#F&Ap"(ƢEO?C( b HD: # =h0>Th]]P> nAUF??FN@FV-l ?@. ?F?Q6 u`bmAu` ? t t  fRj$)t`/Gz? %tA`f? BAU'SB$  *J-U= H#?9#6#0zGz[#@ LB6)G BUK!%6#!H!P';`?Copy_rigTte _(c)e 2`W03e M0c0os0f#21r0P1aei0n}.e Alk0U 8so2eC0e0v0dc0F `E!26#з0@&>GSA##l >$>Uh!E=q% 1 I2EJ*6#9C$"n(bVEgO?Cen( b HD: # =h0>Th]]P> xAUF{?FN@Fr\.?@. ?F?Q6 u`bmAu` ? t t  R*$3t`aGzaG? -%tA`#f? rBAB & JJ-U R#?9#@#0zGze#k@ LBi@)G BK+%@#!R!Z';`?CopyrigTto (c)o 2`03o M'0c%0o%s0f-21r!0Z1uaei0n.o _ Alu0 %8Usy2eM0e%0v0)dm0P `O!)2@#0@&>GSA-#l>$>Uh!E=`{%1I2J1*@#9H."x(`EqO?Cx( b HD: # =h0>Th]]P> ~AUF+?FN@FTs?@. ?F?Q6 u`bmAu` ? et tZ u` 3EtQ1GgG ?Z %tA`hf?UvB>(UY$ "& *J-U= X#?9#F#0zGzk#@ LBF)G BUK1%F#!X!`';`?Copy_rigTtu _(c)u 2`W03u M-0c+0os%0f32$1r'0`1aai%0n}.u Al{0U +8s2eS0e+0v0ds0V `U!2F#0@&>GS1%l >$>Uh!E=%1I2!ŊJ*F#9 4"~(fEXwO?C~( b HD: # =h0>Th]]P> ZAUFd?F/2?F#vh?@. ?F?Q6 u`bmAu[` ? B[>,2%t o?u` t, 3Btf|R|R{Gz?ktA{,-2  J-U 4#I?9#"#S0z<@ LCB2%&G MK %"#!4!<';`?CopyrigTtZ(c)Z2`03ZM 0c.0os0f21r0<1ai0n.Z AlW0 8s[2e/0eJ0vm0dO02 I`1!2"#0@&>RS* %l>$>Uh!E=]%!92J*"#9"`Z(BESO?qCeZ( b HD: # =h0>Th]]P> dAUFd?FM&d2?F#vX?@. ?F?Q6 u`bmAu[` ? %t ?u` tR. 3tF\2\2{Gz? eW7$B>E  J-U3 >#?9i#,#0zj<@ LBi,)G -K%,#!>!F';`?CopyrigTt:(c):2`03:M0c0o%s 0f2 1r 0F1uaki 0n.:_ Ala0 8Use2e90e0vw0)dY0< `;!)2,#0@<&>2KS#l>$>Uh!E=g%1I2bJ*,#9"d(LE]O?{Cd( b HD: # =h0>Th]]P> ZAUFdD?FVSID?F#v82?@. ?F?Q6 u`bmAu[` ? %t ?u` tR- 3tF\2\2{Gz?KtA[BV>-  AJ\ 4#?9#"#0z<@ LB")G -UK %"#!4!<';`?Copy_rigTt:_(c):2`W03:M 0c0os0f21r0<1aki0n}.: AlW0U 8s[2e/0e0vm0dO02 `1!2"#0@&>,2S#l>$>Uh!E=]%!92J*"#9A"Z(BESO?qC2Z( b UHD # hz4TYYR^CVUF5S??F @@hFCg?@. u??Qou` ?Ao@uuLbd-Z8.F#-t`ts_b%Kt`Of?m'sbH7U" 39@\#2qs ?r/&#?\.?ehU0zGz?@J#1$4$+`?CopyrigPt (c)V020b03V0MN0cL0oKsF0fT2E1rH01amiF0n.V0 Al0 L8s2et0eL0vz0d0 `1B2#0%#sYwSF %醉=#,76D$FHPV?4(^:D2e N0@ha()9X'G'2r|"HF!cD0Z. Fj(daW_kM__TUHD # hz4TYYR^CVUFte]YW?F @@hF#?@. u??Qou` ?Ao@uuLbd-Z8.F#t`hthb%t`Of?(bT7U" 39@bz\#2qs ?r/&#?\.?2hU0zGz?I@%#1$4$+`?CopyrigPt (wc)V020b03V0MN0cL0o%sF0fT2E1rH01uamiF0n.V0_ Al0 L8Us2et0eL0v0d0 `T1B2#0ؓ%#wSF %=#C,76D$FHP ?4(aUR0vN0s4 N0ha()9X'G'2r|"HF!cD0. Fj (da__kU__TUHD # hz4TYY= N^UF`{?F/2?@hFC ?@. s?@?Qou`bCAu` u? uLd- Z2.@t`ItIZ %t`?̗? ,Y,$5, " & )7U?"% -3\H#27q ?/&?#?\.+? #"%H#14N+`?CopyrigPt (wc)F020R03F0M>0c<0o%s60fD251r80q1uagi60n.F0_ Al0 <8Us2ed0e<0v0d0 `T12H#0ؓ?%#qS@b5#B#H#0zGz?=H#7`D)DZpHP??D<(HhaD2?1n2: >0Dd(R)9XH'G_'2r"rFZ!D0. F j(da_k__TUHD # hz4TYY= N^UF`{?FVSID?@hF?@. s?@?Qou`bCAu` u? uLd- Z2.@t`ItIZ %t`X̗? ?Yb$,H "& 7UI" -3\R#2q ?/&I#?\.?, !)R#14X+`?CopyrigPt (c)P020\03P0MH0c.F0os@0fN2?1rB0{1agi@0n.P0 Al0 F8s2en0eF0v0d0 `12R#0I%#fqS@b?#B#R#0zGz?$=R#&7jD3DzHP?BIDF(haD2w0 BD0: H0Dd\)9XR'G'2r"|F!֗D0. Fj8da_k__TUHD # hz4TYY= N^pUF`{?FM&d2?@Ud?@. s?@?Qou`bCAu` u? uLd- Z2.@t`ItI\t $X?*  )7U/"% -3\8#27q ?/&/#?\.+? KJ8#!4>+`?CopyrigPt (c)6020B0360M.0c,0oKs&0f42%1r(0a1agi&0n.60 Al|0 ,8s2eT0e,0vz0dt0 `128#`0/%#qFS@b%#B#8#0zGGz?=8# 7PDD`HP?/D,(0^Dj2e60W1 Submr.0sT0o3: .0haB)9X8'G'2r"bF!}DA+ Fj (da_k__THD: # =h0>Th]]P> AUFr\.?F,J @F@5EMQ?@. ? ?Q6 u`bA@mu` ? t 6B/>7KkBGst  U|i$kqɂ2vZd;O$.B H   LBa? RRRAUQMb9B"H& J-U3 #?9酉##0z߮Gz#@Z LB)GKq% #>1!';`?CopyrigTt (c) 2`03 Mm0ck0ose0fs2d1rg01as0ie0n. Al0 k8s2e0ek0v0d80 `!)2#@@&>,#qS ks#l>$>UhE=`%\1\IBB!Je*#F&$!Ct"(ƦEO?C!%T HD: # =h0>Th]]P> AUF??F,J @FV-l ?@. ?F?Q6 u`bmAu` ? t LBla? HRAR#UU1RBGt  fݮj$)t`/? 2Zd/;O$BB0Qcu! F"L& J-U #I?9##0zGz֯#@ LB)G K*u%#B1!';`?CopyrigTt (c) 2`03 Mq0co0oKsi0fw2h1rk01aii0n. Al0 o8s2e0eo0v0d0 !`!2# @@&>,Sw#l>$>Uh1E=%`1`IB!J*#9Ax"(bEO?Ce( b HD: # =h0>Th]]P> AUF{?F,J @Fr\.?@. ?F?Q6 u`bmAu` ? t LB1>2H RRRhU\Gt  *$3t`aza? 2Zd;O$BBQcu# P"V& JJ-U #?9##0zGz#k@ LB)G!K*%#L1!';`?CopyrigTt (c) 2`03 M{0cy0oKss0f2r1ru01ais0n. Al0 y8s2e0ey0vR0d0 `!B!@x@&>S#l >$>Uh!E=%j1jIBP!ŊJ*#9 "(EO?C2( b HD: # =h0>Th]]P> ZAUF+?F,J @FTs?@. ?F?Q6 u`bmAu` ? t B2>AG3t`1tlp  ^? 2Zd;SO$AGUzuh IT J-Uz 4#&?9#"#0zG[zG#@ LKB")G K %"#!4!<';`?CopyrigTtQ (c)Q 2`03Q M 0c.0os0f21r0<1afi0n.Q AlW0 8s[2e/0eJ0vm0dO02  `1!G0@&>YzS*#l>$>Uh!E=]%!92J*"#9"`Z(BESO?qCeZ( b _Hbue /loY^G yC3F*m#D{ߥ[B |]Ypanypo@+CqtoUaGyoEPyzy"y'ykp|(yx\)ySڸ <*y|+yIq}1{,y5 -y~.y- /yH\0y1yU$2 ~ 3yH4ys}5y6yy7yy8ym2):ye'9yK n9c V%///////Ty]y}/0?B?&yD!y5"yb'$y??90K%y\!(&y?#o6UFDfP h$T PYYB: UF~?x<F BP(?3P?x +1A@JZ b^tb::!HU? ?JBԺ G 0$`NyelW ow,n[ tU ,se i?cky_ f!Uxe ,q aW$u"qbY"r!!om Qea !b'dU fo no n!oa ,Pe* d"g_ f[ d!@b%!^ %uUL3T Fp,>PZ}kt3;?`"w3Drag onut hep adn"y aWex.npB ,> R siz N5ft? HD $*T=h0>Th]]A+3 5AUF~?L&d2P6 :FM "u+` ?;u3F bgnn n.X3+MJQU~:@?& ?Ahbpb5 LK@S"I!$5 `?CopyrigTt (cu) 2`03 uM c os If"!r 1a i n AUl0 (s 2e e v20d-`V s_SEcTm!#49" 2g0o\2q0??6M?\._?GA*F3j*# '&M0?]Uhz "|"i  aR#JJ4FFBn XB Y(EOAOF3N_"YQENS_Ow[O __JFY(NbS20Ul20c"n t20U 0n>0 y *Fay u _031Us 0g20!? qjH(baMqG?@"A< IB"fneMRlIVoo}|"'S!v\%d fM]yhn<wYCa32{@]yCBviAbi=%Fng%'0U*!5$a;% fMhF!Be$L~C<gZAAeLkTA 3(1}G&@_qbL&d2?NP?WlK#~3 5CH SwS _G F+m~(#\{*wdB _Pj]ja_,n]}@ Lj]P+q?.;aUFDfP h$T PYYB"UF~?x<F BP(?3P? T+1}A@JZ btb:t:5X*!HUq? ?"Bt  0$`?tag,tex{ ,cu l ou"b"ck"om. en"n |!w,d} fi Ui{ i ny h} a !x!f !% !^ d%uUN3  @?!7wCCZfkrrrp8 zًRcZl3RDrag onut he]pe,ndy l9ow!imdpu9u oEer.x S7Weci aMscr`sEz o1f~b~߿\.??a߿,h?m?[3CUHXD  %# UUh8J T mm>YM ]=#IyCi3`!FPK?$V\#o2q@?OLF#?| k:ZC':h3 h7FeFlJ(JUx8EI z1BTU %aTPj(i#F?FX,@NrM {%b-Q#cRAQ @U \b "8nd6"gFM&d2?Ax#Z#b 8m5rQ bGc\bQ qfM5Jon9b"cĶ`8i E`9bc D2yQQ____JWV__tNbi!3Za+fV`Rpz(g!LccNe Wf CBcfAsNfo gf(cqnxtc~o'aoc;fcZm~ˈ+x(`8mIx`WvUmnr| M ]yAVr0^Tt,&,7LV$PLc] ahs "8"!2Kb@I#p{%3M5`!$p*u|$92" h 8E5B iU #/t92c8eQ E`E+A,7Y]2/Ǖ+xz8i͵dMauyT[GtLb @ϭr:*qp{#\c @0edF$cHy"f gfwqF "R4rT0g2US0l0c2a0Udt0p0.yQYUg!lt U M5I 韱u ^u "Hk AE;ZObXM 7p=gOuWv]ߠ%7]oZz?^baGhHb("~8v#Vspjёu]d7K!ɽTc "(\1͐$А3`a_Ha/ȥFQ B?#b7uAE`iёxc]1`Ro01eӱt2n0-Dqk}ϏΙxN`UR͑+xF>cUjPxx{BWlOF!3"+A(ܶȔh4!D *\g,VEa S/e/w/rxXBWw'D! .&&V vʀ=SEz +Ցb1b10r(11rBx9?"!LctYQ%tRtD$:ArtGOKcb1|? Eb Ցa p-QE~7:A+sLE&@VB0`As2(3t5N 1J֫4;H': = ~ GuWDFl,m/#{1B eP]a4nm2@+|qqBllj P_N(T_XjS=dӺ)$B!aj2/"Mj=9Spj(ߜ1T/sO@$s?/s?@)/Uo`,?r\.@kZV+@ LFDNTyB@ uhn(TD  UFY,b'@F"H$ @FxA2ACBTvx!jGV*IJK!MNOt/AQSTVWk$YZ[ \!'Qw5!t ,{hE!t,{!tZQ,{!ta,{QxQ,{!tawZU!tQ,{QxQ,{Qxt!{!x~!{ax!{t!x a{Qxa{Qx)a,{Qx,{!t5a,{Qx,{Qx,{QxAa,{QxEa,{xIa,{~!xMa,{QxQ,{xQ,{axqa,{!xua,{axya,{Qx}a,{Qxa,{QxA,{Qx2,{/E!ta,{ axQ,{ ax/A,{axma,{!xewaxQ,{axa,{!axa,{xa,{)ax!,{!tQa,{5axUa,{!tYa,{!taa,{Aaxea,{Eax,{Iaxa,{Maxa,{Qaxa,{Uaxw,{Yaxa,{aax,{eaxa,{!ta,{U!t,{maxa,{qaxa,{uax,{yaxq,{}axq,{ax q,{E!t q,{2 !trQ,{ax^)~ax_)~ax,{"!ta)~x!b)~m"!tc)~u!td)~,u!tjQ,{a,{a,{aQ,{!Q,{aQ,{a !,{af)~E!tg)~aa,{!ta,{a,{ax!,{vCva,{a"h)~ai)~a"j)~qk)~q"l)~ qm)~ u$n)zeHwRP0aQQDAu*`61&At~QTaa"aQ)a)aQ!a!aRaa]aQaaQaaQaa/A aEaEaaMaMa=aaaIaaaQaaaUaaaeamaQQqaQQuaiaiayaaaaDayaaaaDa!!aaDaaa!!aq*`A!1r*`Aqs*`ArQv*`A!o TIqazT!uIq5^TxW0BQ]SePBQ#R`Q` ConnPecF0oBacR i_{R+U'U1?_Q_ agP A*RoF0aF0iRAYR _Va'QjuTqs'Q|qQQeoT"Vu|u>!eOZ|uUx$ `0@@n@@KRT*@@ZVe?t@#RXxR0 Y'R!1A'Q1dyp%W5eJT'Q!!'R!aq1U1v}ae#UeNHgha$X$:X3QgDe3nLZ;3 Zxk}}X1RAOA`)eM&d2?ho'Q=aA9odAe1Zolo~o'Ued߁ YoebX?@ޙwy@@8?@Y%?܇؁? 2r'UC5uvaqX1X0S8+i?hQ00O贁Nk?Q#RTe1RT z@Rh1Ʀ'SR ijIW1t5e?%'Koρ^׏h@DA)Mh1ǘ̷ֱ̄p 'UOϠտ̷1p5މݿgטoſtB۠BfhA`eStPUhrPmP #@oPdrPr "4FXTYx\.PA=aaAh3aK1џ# 1!W0Ŭe4glK1YK1aJۍH$D"@@Fh}`qj?[@L?ӹ?>'PQue0`u `AD!$X rpwx@@;μ3@m2pguK0mX0@z@@EgmpK1 1a'Q "b#p5P!03ıɿ"W tJa@`Az@ u"HK1~#Whe?@Vb7@Ivv "F%|v "w+/=/O/a/s$'(/)f.?‹"̿//// ??.?@?R?d?v>Fq 3q?????OE EOWMfeoOOwQOOOOOO_-_ #X_f:͔nW_-_Կ_o!o3oEoWofl6@@Nt@@p~o /@BmsdTse9D ֟1ߺGr^q ")'9Ks$Ih})άЏ*s99ғɟ۟c/WM]o?gA$`䣺ԯ# R~ͿDZ9gKm rXɑb@@~@?@"ΪƀVϲ um`{?js &"ug@ ) lLō x  W V")"B),1 %?') 0?B9gEV>o??7o.?"??o/h?(O?&ScemazM@n@g@r iPuQmc'33 '2R! ʈ QUb{3Qzšj:OO{Xc'_!3 b_W`XWVF^HoT媱, #,lǿk+%gw򤯶H[@@;μ3ЅBP(?@' 1Ce0DrJu?QiU*Sc/Bruvra qry=dz _?S0Ou-y!$/////&òaO0Du;LC~Cw1*dmo oz6RdV[pcNᘇh}<cpne<ǫ[vRqgQL0ާdy6Qu٫lARSrX@L@]P@rsDgXqNqqP_M.ooaoaoUue Ӑ4IǪQoaU1oa `0@pNt@@Vulij{"u``u >A2 aהnv/r)pGg;@z3 agy{"p#RA"mN5W5G} N3p'R tN0zs oxa8)u@rq?@I*ϻՄ7C2NL]kbfԈa5B `ǡQ&FQ|b.r pHωdk}*Z!W(/êP5Ćaua$‡aUi#"6/֞էI%U,U ߆//߀ASew߉ߛ5*?JRCEC'9 $9H$D"U6??㮁$FO#O!uG%7I[m~%yB>(:L^p!VVtB_B>?Q)me! //|0Iyı{ 0Be yDŽ"Ϛϓuh< qWT^uTぞW/Ш/ɳqߕܿTFcXgjf(@r!,_ooCų@1ѽ%BȰI?'W??p_0,NP//$W[M___q]O7Gue]YWXOQ 7No|2{ݚѐR7OAN$ 9YN6RsqAg tGѾR]g|*Q9% %7bɠ~H$D(īc%'9K]oՐy&c&/.l.|/?O(ǁҐ7IQ /Q+@{žF־/KX=o5//?"?4?F?{?@Pa?s? Koa??????T31Ot>KoNO`OrOOOOT3@ OOs[oѐ__%_7_I_[_T3r\.z__&koq_____v{?@L&-o`f&cygoyooooȸ1noov,>Pb|369(y=Oj/o4Nf.|6vR5-vWuȏ/  CѸ?f嫵bᵱ.JE UUU?\ ũ4- Ⴉq sp8?@T*J%@@ @|>k׿9mu`u|`A# 0uu`u?Œѝ?~@@t @?@kZ/@)1p?@z3CϳL"%גѧ" e%`)7]„+ 'ֲ‰.⤚yB3e ёZ tN8?z\ÜX (a`yd2ɿ@rq?@b4ɓK?R#8͸#2N贁Nk&|rpB ɗT*䢡ɨ/ ^ +(<"n ?TU"FE}-;gw}8^į/]c"Uc++o H+TzPj0@^P{hv!37x% *k!V*rk#EVc% _կ閩8%عƪ <@@X,@@( Bo@@J?$ #%?^Zmڮn ||53EiqQ'[?7 .Ԯ?DR?xgՃ/////-59ԡnM?E!ԡ*YJy兵pU@q?j?@R SUUX?**3ɨ=Iy??R^{0Ogr 5! u//V_?)?;??_?9V ^?Ԯb?ypGypɴ1.sE}O]y"_4_PF_X_j_粫Q" ? __XK(gөQ___@ oR)o;oMged sp0*ٗ딝a'OKO/TF !X¦BaJ\nxcEHq2k, Mkeoca}_QبȻ߶# Ⱦ꿵ȵ|&5ytudɿp!ߗ- qqOCU} q4a^ dܓOt(eUrC{in AApOspqya__);M_q϶__2DohzGoYokgrnooooodޅoU§u?#4F?¦j##5 u* o*>F?D"ؔ?;;4pO-?Qcuώ_-)/;/M/_/q//fo/////??I?Boq O?1no;ot5t52!fOxO_O{T*JOOӏC<, __0_B_cf_x_$ϟ&&5诎 }ůׯ~01CUgyOӿs-?@cϙϫϽ,3WM_5j|3y5j(I"Swn(?pQy;FO[mO//uT__/_____oo?PoTfxmooT I/Sewߛ ߪO+=Oas'9?oZ?so/o??Z/fO O?2`VdVO5#LYB/R"-#\!&M_nhULWWx/Sgoo0^VA_n@CESaemnA4 zDG@!bܱP12q1i{GeE0ż!DD|7301Aw@@~@@ D"?@"%؈9.G$qQ m"+[/m"RܵoeDo$G7O15Q@"IF5X1c%Xcp4!6>PzQQm"ȃT1Wl am 1uzo`4?dU[$6H58D?Fx-Ϗ$Ϩߺz q-ߟQcx"@!@u ?""q_1L_!Lry1'm!d1 Ur@Yy󧚏r???y???OO+&?xM.$/gJaU2kXM}LqforqApaR ys9i01PI p#!3}l$C=OuԃǍDɧN?/Q/c/u/////@ $4/'[_/?F_l=S_,Rq%waLopJ\@@  v$/6/aϏpNv(%OLU &`'ᥟɟ#5GY~oooׯ _CUg _ӿ )-H϶AMofܯ{ύ3C ANd~ߐߢʿu?Fj2V?tr7e~aqqEq? a7iDUo)O;OMO_OqOoOOO__%_7_t_Y?m_/_l_!Nq]ߦ /A//o+=Oa ?_V?_?X'JO01 :EO%I[mOOOO!3E__{___?)V41A?o/7|5yeϏኸy5/U@H$`t:N9`@@t\TdU} u5-61n4J\Q1Y?k?}??>>5?;Q\Woi]^5Oefoo ___);]eA\n?uO A*ZdW 5#YKc]e-ˏݏv6Z8tA @@oЙL&cPjZ߭?@)?˄Ӆ?QѨ1nJa#au0`0?)u8q"*0]bQet_J2 #aL`M?$o6oHoZo:S i>q;ǐ$m̆-lNՅgy̧mگ'}` !,W#6&SesioP MaPa.erH i//|m733\'U2!̤J 1b3zBzjWx{7@!3YZCQ@B߲Z+OŗiѶO߀OOO"_4_V`0 !@@l6@@<ƀ?@]`P /8__^_bt_oß?{oUoj1pm1o ~/iSi iq,j- JCPo( /@w@@@h)+?=;|ew6HZ+ioO sj/m ~5?/' //1/oI-M-oyRECRrAO;!$HE=%AG5zfV\. ? ]U~_eg1.;zOK55VbD82)VY"/2qP-U?TܾV(ٱŤ϶ -S@RlȈ%{5!??3!528a0y"0p$1oNojL*(n08/3(VFy"~Axr%t_(_z1%GA Oy_GAAG1k"*r)G1i)//t?AF,9Rg4(8U W Fw45'Q4Y!Ra/s//׏ /Fږn-j蕡=?/v]qiMb0kId{4\2?z{2y˲ӿ0uő'@y%ł62ς5p0uŹ_@SP% oommj?a*mқq"ƒVSLFDat:bseK qQqRiO0BofO~1jZV%@@t:N@@B% `?9_]_X?|@/R/ğ֟p |?/T=O>,r??(??@qQWO$qQqߖs(:L^pvQB"H$@@}`p?+7#pgA7I[msA &E? .4F?i>?s///qMqF!B$! `r'H1,1)15/}@ !@@D@@vn?S@*TۈUϹ:#uII/r'1DFVVZBAAT8=3?@ffffxd?18#30O贁Nk?qCR6Q58SVsBs Bw2EQ9t!//@_?:U(??L?]vVo ^?^~?h>Q_*_NZuP2_峽VrϺ~uxN͓\P&|y_Ɵt5B $yFmerLo da ?O"O4O@FOXOaqOCOaFׁF  _UV@@%_;M_X\6VpV@@Fh4?@')?@և?@?@0ͳP>au@`u `bu 2Ƞ9[@@0ȀSb50;xE@‰&Kׁ3ׁ@! »auv@ ` @#?R3Ru` }_Ǽ1ߴoVbX?@l6f@@T ̬JbtNjPւ߼)bp6 Ƞ@z3S8-+__x\ 2qf?A[??@A毵djb5wezGzsifis51X|KD'2rIAf! D!$uKbb>4 SRyHæQ g1T8A 6di?@09?Sf 6/ϷY?[ @#ë?|v xt9  1,2OGRO@O_*sѡ=1D yW_BAP( @@,=~___\q_.c5w&Nw&Vro)o;oMo_oqoomoo CUy?1O-cu/υ_ 1Ugy4O^B/υo6<%/o{%wթ!ߕک)ӕ9Edѳ@@L@@P@j?: ?QyZp{nn[oϤz0Y!\֚R2C%] Ke22֚ft0T<Ϙo<7'9K]oߩ߷@"H$9l6?"4髱DYG}̟ޟ{Ug%Q+ esSQLJGnoмooomi33E+=b3(z!՗@//'/K/](8a>ʿ/>RX BپZ=J#4}| @@Fh@@h4?@xѱ?PE\k?}??????R 3  ""' CS&&"/;I~|>@@>yL@tC&'&DV?h>'?F?9U>o?2oDo7OhnMoog)assߩ@C%x jPv_w\S+U߸1:" $V YU R1#47!®(B_togr#5!9=RT|aasp, ޡBpp\߰+bNt@@vn?@,2+?OtWu&o`ߚDpv@Ox=a{WVSOeCO贁ONk?tM7RO!vY Rw T);M_O)MPv*P~֯#=q܄ooЏzHhpK+(dpms]T ƒ´}+_;YvUfG;S*R[EMRCunkcsi g < d qTfqq#{߁EEfEMcA> T@px9(d Gfc/;#NpRTQ0i{~Q˅su ˗FU!3EWi{@ա|>`Ŀֻ. Z4FXj|ώϠϲ2DVh߇B߫S/xw/ߛ//G/?,&//O?tg(k*`tr"4FOj|OO  -Q2DVhz"?H$eDUg~K)bpa3a@z3adQ5\2q?D/V&ؑ?\.?^?/T+ϲZ##0z?GzJ\nπ V$Ͽ,Ka K;J S*T1GLOT B|QB,GYk}Vj,>Pbt.cokAi}f7X/VABG3}f|gKon}f!wmg+aa%kvj/./@/d/v///-A#W//??)?;?M?_?ϕ??????OO%O7OO[OmOOO ACOOOO_#_5_G_Y_k_T*J_______o#o5oGoYoko6i붖o/A$!%Iƀzo@pdqσDŽawIϦA$6,6e֎oɏۏ#5GYk}ş:BE:L^pʯܯWwn@@<l .@RdvпtfY_ f{>pgYXdYh/@Ǐ2qG&F/%7߮/[m/Ge -?Qcu)@|M_qO'E#54G몀 m!3EQf@r]Vt%q(%v^R3fgM_~fw`}g%/////[??QA3X?j?|???????? OO0OBOTOfOxOOOOOOOOaFT\1_QS_Um]Q,\QؕU]Hp8@@Swrx=`?5,7) M/CO1 YO;?WHo5MDD arse|P AgS1_l8Tw1))ؒ(h8<^M&d2?C?񈡈*$goF?PX?j?Yk@5F5F$hr vq$6HZl~/ /oD/V/h/&?/////O ?l@?ooo???B_?J?OP-EGO_kO}OOrO~Lrx/L@a _֯/_8$c_uQVzPliXato______T=a_ o1eI6oHgVozoo`ӟokr!o"4O8Z F#5GYk}ŏ׏ 1Ugyh1C QcuI-E ¯ .CEK訿̾޻EvuϏ/3EWπZzό =J0UԾ̊ ?XR=_ $A!$ J A\e `Jip8@@x<@@L?@5Xm?4%'P Ruwu`u`bu /Ap6D] @"Q=H-HPAR2B-B8AuCBB=BDe.%1i%1bT BBGQuT`? CFFBOPuXE8\z^0L"@@fl@@<0x@ݱHGFܲ$2s_ZG_iR_Y!\2qf`?o"f]?y?D0A/7!UtU0zGzaiVR&E9(e)ᔴ8X׳7_'2rbJ梷5!nK 68TݳB?=[DfBI(QB_!46eE5\kjxCFBye:B DBag 5 5Br4PA1HBRÏ:ՇrS5PAK -???^ilf?\Հ=TBbK h/dّ3MQ@@F_h@@P"% BP(?>Hq OZA?C"k]_L3ooooo(:L} 0Ա!\ܵ\Ϯ3L^ϱܿ EpiE,1X(MD FnGѭ^]^Ӕ_????9E" @@@ @t:ϝN?'?Q9˲#ca@=ﳳFxfect//////251/ ?(51=1hq±=<(±okŷU????јܐqVj@@],5,LFFP-DT! a-u`u bu LS@"ZJPJU_Zqr iYdBˢEio0AZBp87 $«ƧǦI9rTf}Jgrm)p2wT߸w@z3m"ڲEp51ܑ32DάUGO.xdG9wgyp0Azx\2q?r??^aAӗ^ieAЙe0AјXЗ'2rFԕ!u. ЖјQJ/TV1zSҟj_r4CY*Ao֔ѢשdP}³Y^wA =1OcT=or_Uv?]JATAO/+S6_nq_aqjZV@@x<?@x4 3FA,.XVHW_i^[ W15(Bls%fr.@P.ewbX,?@H9//,/>/P/b/t ov~/0-o/Oq/@ ??.?@?R?d?4?k8e?e5FJQeDJhAۃCO$۟l{qr@@Hџ= H?݁oMPvJsjvֆ=ea‰6l?1#0O贁NGk?2 s3,MC XO.s31E>eXk?ɤ'3u1E YA{1A,M Y1A1E̯ ÙȍS@m>nadg v40˳Ð%I]50ζJϳ50H3ωPYMTakg0e4F|2L1E$tЙMR?t&݁1R?g@Qu(N8{A MߎP( B%@@8ᡐMt@E")uFtMu{`e@?TuP^SZ{q1BxLUϯRtTZ/@ipz)M"^\gU+"M p0MvԈ5F_ormt e i|w$Sks٥1m33$'2 of!(ōQY kMyfb3!zUj//A/b{5of!3P2'(dd&.?1Sޏ1?"FXj|jd2,P@@vn4OF`CۊEIϟ+frb!Z&fF8b U));MZl~CO) ]Fo\N}^eooֿ_πwŕFAoe {F/߳ϔM@ϓTFdoz{&FOB2@ߴ~~v@~ߒVU! D f" n d)߼%A1011?D?Ο? OO.O@OROdJP$@@_oCP?@PEZ!rj~puƥO1OO _U;?5_G_Y_k_}_______o ool޿Lmlmo;4Ϣo׿oooL~1Ur}{b߮RL"h~ߛ<($6HT&ew! J۟$$ E>gGD"H$w@B ?@pl6?@?R_$b) E8 # LB,X`rϖQbsLmQ!F+ X&A\%#5  V/a"RYR@Ya}eFoW'PoinE)|wnfoo44;RрpрڃDa݀EWee׀ꁤW OO/OAOSOeOwOOOO@ni~?S@`ahOQ_ ]9_K_]_o_________o#o5oGoYoko}oo!3o3aGxkEj$Y8СaſE,;No MdUraCdt^㸏ȏڏZ 2Hf@@p8?@x25&:#Fuci*Tb 1Cm_33t"s~b3zj E,{wZ/!3 "st;4km?]/vY䡌!??߶#{ݔ1(V3Epr\.@A@@vP?@t:N?R4Z5?Q9i3|kц=3!F5\`kх#30O贁ONk?r*pCp^ES6ON\5G셴N_EOqԆAÕ`QAErOSJ*(Gk0wTZ<$X[Y6yHo^\6]HoU=\4gIodo/k_VBitq- gѓԂɫX3TBÑ t!E OrZl~;EzEOD㪏ObRo*c@g~fĵ(?@*IY~?6̔0!ӑ(Oo[ صE过 B McuχϙϫϽ);M=q߈ߕ9\ U@(;*:pʖ?-]!/a^;M?e6jZyD5]D7eS=_~ 2DVJՄ!@@z^{n}X@_|?T sR~~VW CӑVV b_H$ D bPVWVqon gooin3q/"/4/F/X/j/|//////// ??0?T?Dax>"V䆴'UU1 !J?AcI^t~:R O@} q~L? U4oQAXB6bП⟐r%c)5~LA]oIOb\cA^Ou(wE,ww|ЇOGXE݄Fh@@wR@@vbw?@Q~?19?Q˂ uQrgfnPbP~8=u00~sO贁Nk?}q]HFQxs1Za*tsJqxyb꧶zЉءƋ~82 ߓu&;@]bxzq~4Pɯۯd' J-siuT⥲ uJUR?6i 5JA7uܯ5 ]= TCerl~Rqust Agut{Ta2ijATObEV&ߥ{7yhvOo^6F# @XYS¬̰sP6B >l1PV_ A::D9AAIQi ^HX,b@@z^^ס@@ LX?@ r@@ 49*oP3n/8"Oa#Oa$#avnoP4)SF!QrWvavrozs$6zM1 /?Sb p)Jb @@J3%WvWvNbQCۏɄVw:0y5U?P??> OO(O:OLO^OpOOOOOOOO__$_6_H_Z__~_Y u#@@ĿuM̾X\0O/Z~]`_ o` Aժm'o9aq Dh`PobotoooooooJH*JR@@Ȩ < ]@@LJ˛?PJ9 [Iu=O$." # $#@֛3*F!ցҪp'8nU@{r@@Vjp8&֑$Wiׄ*67Im:ǟٟ!3EWi{ïկ AHƭſWע]s?@¿XiG:5" @F ]iڭ?1gS48чBo"1gr5fa'F"'1T)N&hwȱ@wwXmp8 @@??@P?BWP(%%V0yy'!S6X*SLf@"4 &AL1AWAWAϕl2|2Z@tE'ODO T`_$4_F_W U9EO_O_ TE_-__Q_L`YYд1DBC ."b(/:/L/^/p//////@Fh2%D"/??%?7?I7aW9vl?~???????6 OO0OBOTOfOxOOOOo.o@oRo_q_B_fb_t__o__Zo9Pb^opoocoooooo%7@d2L&@@"H$@@ `o?@H??ȴе~}M3ӎI6x"4FXj|ď֏ ¯xɶϟҵ s.]߁} -ת'SQLoMode;d&8J\n@P( Bt:N @@\.?o@h4Kp??G뿼qxx0BTfxϊϜ,>Pbt߆*(@&/oJ/<n,I//4/8////@?/ת},RtarShmm0fey @\Vj4fl@@N]ujZ?DtpCbq1|F%7I[mk?}???W/hFo/o/lE W??t[o@a?o+ת:R9D|PmmnsJ|Posa&`?fkdLZCDnaOǃXgneebE $4WQYViyAbiMqt]h@@`0ʰ@@ճP*JRkowѿW~SnRoAuQnQu mpu mp)ZaXWBV@]bX @ )Rsp]Ð'@z3uQ #RCcZa:WHWspZCǀ`quJg tNmp;zsuQB ǢУZaFEt@rRO[I?FShX#s2N贁NkS!vPlZas-BP`HQDVyE5V_R$^%~Q a粂RpHQTϋK\ShݱTQ*FQX/?iXna{(F@@T/@"#ҳ\Ӳ. Za\XS?u,?n@We}_____S__oo@.&8ߒokxT#جuoux qpД47 ?T/wv #"x|A/eOڸjxp "/ Iy7tbA.OneZOlO~OOO@x<kSwr@@xqNxUI^џ5G$6HZl~Ə=VjP&d2t0 '9K*Iwϸ+=Oas);M_0:m^  Ŀֿ+@ s3fϩK{XML/oTOpPπ'/$w//$ki{ߍߟ߱ @T*JR!%7I[m#@!*I6+=Oas_qK]Z_~_ _Dor_2oYQ_hozoJB}K{Jav p8OJO //bC/U/g/%A////,SE ??1?C?݈A f0fl@@BP(  ???QAb?OOD,AOOO_"_4_oooo_ٔo _0GYoDo֤oٟBfꓓ,D'@mens'@o aagrp(A-TOmpI33EЏOOOFb3=iz EϿI[]lDtQQtqӏ\qd _ {Ƒ1CQ$Aɐf%E4?@Vj@F\.?@( ꭀ'0?Q(-DT!)A,5;趜zIFH$D')L$p[1RpɎkT,A .貪/':Fi|Aa8F>@Օ (M<%)~?d2Ϛj84FLs2o @FMs2?Y3YGQr w{Q˙tQߴ?F*r:8:F?`0 *$%g O+'oAU_:2ѨƑ*yAew贾UFN,+8a.,A~^rN ]^h,/"]>?p8p%yQ*1v7Qų5a#?5)? Nn?/5]?Pt{93?A/.O?9=~Rz^p%b OOOOO _ h_^[3qh\Ȟ_V[y{a14RυONRA` `RCpI`EJ`TpR໳__ oUohW8 p$3'Pȅbqn -&GYk}bX,?@"@@1@@"0#?+@΍ [qޏ[A*mNeooom+=OW&,AZd,A,E?)t_UэZ3EWi\# -=O,hzmۯ=@a!ԜuBskwCoyr`Ugtpp2w05pJu\WiaZp bpye`|E ߕ02U U U$')*U./17U8:BDUEGHIUJKLMUNOPQURSTUUVXmqUrstuvU8t4,Y,b'@"H$ @ QY C-d'c7 ;@}oLRH<(E}o> R\daAc@?\pj .PDpjK.PU1( UO"D&aUAUNj )h"T} uW)U- |) ' RB- IY([HXHUHHCHHOEH&& !ɉ&Q- "-H*-A Q$-8&9!Q4? F?X?i!$?;fGArial UncodeMS{ (  R$fSymbol$67fWingds*7 fEArial"z@D/ R$fSwimunS$fPMingELUw.6UfMS PGothich@ $fDotum"|i0@ S$fESylaen  $fEstrangeloU dsa@`9$fEVrind1a8MR$fEShrut1i$&<fEM_angl$$%>fETungaH"@&>fGSendya{ (  R$fERavi"&5<fGDhenu|"{a (  R$fELath#&<fEGautmi &<fGCordia New{ (  R$fGMS Farsi{{ ( _ R$fGulim"|i0@ S$fETimes NwRoanz@D$fVerdaan  $9PbLBlPbL.BObz%B|Ob5BOb2BNb3BNb9GBMb:B$Mb7BLb=B4Lb.-BKb['BDKb"BJb#BTJb9BIb"BdIb"9BHb[&BtHb'BGbCBGb>B Gb):BFbcGBFb5BGuideTheDocPage-1"Gestur Fom a 30%Gra}yfil  10%Gra}yfil  70%Gra}yfil OLE Normal 50%Gra}yfil Object modlRow_1visVerionGray f7il&Proces bundayCHBoundaryOLE PBoundryCOM objectbundlesubtype0subtype1COMStyleRow_2Row_3Row_4Row_5Row_6Row_7Row_8Row_9Row_10Row_1ChangeLieChangeFil"ChangeRoud iCa}loutRectangl.83"Document/ filuSY Normal(Embed ocuentCo}nectr(Dynamic onetrTextPoWsiin*Notepa_d Fr}g ounViso 20(Borde Anota in$Object modl.3$Object modl.37Viso 21Dat soreBorwde Txtra_nspren C>Borde TxtranspUrn Lf BasicVi}so 0Square,Proces bunday.60,Proces bunday.598pt. e xAntiScaleAutoWidh"WidthIncre5mnViso 02BordeViso 70,Title }bockcmpa s MarginRectan7glBasic Shdow3-D boxScaleFctorShadow]e bx3-D box.23-D box.26Rectangl.30Rectangl.31Rectangl.32Rectangl.57Rectangl.71Rectangl.72Rectangl.73Rectangl.76Rectangl.48Rectangl.50Rectangl.51Boundary.54Rectanwgl.7 Rectangl.81 NoWtebxfil ScaleVi}so 1Viso 13Viso 10 NoWtebx5no*Borde Pag Numb0Title }BockHght&Title }Bock5TxBorde Txt4Title }bock]crpa14Title }bock]crpa2&Borde Ugautd.Title }bockcnempTheme*Borde tchn]ial1Pa_geMrin&Borde gaphic1*Title }bockjagedViso 03 NoWtebx5dc*Note bxtrianglsRectangl.84(Title }bockrt o*Borde tchn]ial2Yelow 7fiYelow 5ntRectangl.89Rectangl.93Rectanwgl.7Rectanwgl.2Tag ww3cE3cG3c*G33[?%G3 4[d#G344[#G3\4[#G3cG34[#G34["G3,c0E3c@G3c]G3$Mcy(G3W E3$cG34[#G3DcG3DcG3dcG3c5G3cOG3\ciE3tcyE3cE3cE3cE3cE3cE3cE3cG34cG3cG3c0G34[N$G3LcrG3$5["G3L5['G3cG3TMc(G3$cG3Mc0)G3t5[Y G3Mcy-G3DcG3Mc)G35[(G35[(G3dc8G3cQG3,>em6G3t>e:G3dcE3cG3|cG3Nc/G3DNcJ/G3cyG3cG3cG35[&G3$cG3c G3DcG3tNc8/G3cgG3dc|G36["G3cG3cG3<6[ G3cG3c/G3d6[M"G36[o"G36["G36["G37["G3,7["G3T7["G3|7[;"G37[]"G37["G37["G3c!G38["G3D8["G3l8[(!G3cIE3cYG3$crG3DcG38[ G3Nc,G3$d.G3Nc(G3dcFG3\dd1G3d1G3Oc&G3̢d.G3cE34Oc*+G3cUG3dOcq(G3Oc-G3cG38[ G3Oc-G38[,"G3OcN)G3$Pcw+G3cG3cG3 9["G349["G3c!G3$c@G3ĻW_ E  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvUU U#&(+U,-02U345=U>?CYUZ[]^U_`cjpt4!Y,b'@"H$ @ IlC-q5 A%t4 vf_ A-n7AJ@;y?PR@<o6RH<(H<(JE;y REto  R{ * g"4FX ,,h(V?@(ųQԬ8N|ج x`WЫ0[PhB+  |d`>a0SYBvY;R$>=x!&)dKj@vR'ܞd}P1^dd5"P25kZ T?@o*PDoH%a!mondrian-3.11.0.1-R/doc/cache_control.html000066400000000000000000000571251261646570300202230ustar00rootroot00000000000000 Pentaho Analysis Services: Cache Control
Cache Control

Contents

  1. Introduction
  2. How mondrian's cache works
  3. CacheControl API
    1. A simple example
    2. More about cell regions
    3. Merging and truncating segments
    4. Accessing the CacheControl API through olap4j
  4. Other cache control topics
    1. Flushing the dimension cache
    2. Cache consistency
    3. Metadata cache control

1. Introduction 

One of the strengths of mondrian's design is that you don't need to do any processing to populate special data structures before you start running OLAP queries. More than a few people have observed that this makes mondrian an excellent choice for 'real-time OLAP' -- running multi-dimensional queries on a database which is constantly changing.

The problem is that mondrian's cache gets in the way. Usually the cache is a great help, because it ensures that mondrian only goes to the DBMS once for a given piece of data, but the cache becomes out of date if the underlying database is changing.

This is solved with a set of APIs for cache control. Before I explain the API, let's understand how mondrian caches data.

2. How mondrian's cache works 

Mondrian's cache ensures that once a multidimensional cell -- say the Unit Sales of Beer in Texas in Q1, 1997 -- has been retrieved from the DBMS using an SQL query, it is retained in memory for subsequent MDX calculations. That cell may be used later during the execution of the same MDX query, and by future queries in the same session and in other sessions. The cache is a major factor ensuring that Mondrian is responsive for speed-of-thought analysis.

The cache operates at a lower level of abstraction than access control. If the current role is only permitted to see only sales of Dairy products, and the query asks for all sales in 1997, then the request sent to Mondrian's cache will be for Dairy sales in 1997. This ensures that the cache can safely be shared among users which have different permissions.

If the contents of the DBMS change while Mondrian is running, Mondrian's implementation must overcome some challenges. The end-user expects a speed-of-thought query response time yielding a more or less up-to-date view of the database. Response time necessitates a cache, but this cache will tend to become out of date as the database is modified.

Mondrian cannot deduce when the database is being modified, so we introduce an API so that the container can tell Mondrian which parts of the cache are out of date. Mondrian's implementation must ensure that the changing database state does not yield inconsistent query results.

Until now, control of the cache has been very crude: applications would typically call

mondrian.rolap.RolapSchema.clearCache();

to flush the cache which maps connect string URLs to in-memory datasets. The effect of this call is that a future connection will have to re-load metadata by parsing the schema XML file, and then load the data afresh.

There are a few problems with this approach. Flushing all data and metadata is all appropriate if the contents of a schema XML file has changed, but we have thrown out the proverbial baby with the bath-water. If only the data has changed, we would like to use a cheaper operation.

The final problem with the clearCache() method is that it affects only new connections. Existing connections will continue to use the same metadata and stale data, and will compete for scarce memory with new connections.

3. CacheControl API 

The CacheControl API solves all of the problems described above. It provides fine-grained control over data in the cache, and the changes take place as soon as possible while retaining a consistent view of the data.

When a connection uses the API to notify Mondrian that the database has changed, subsequent queries will see the new state of the database. Queries in other connections which are in progress when the notification is received will see the database state either before or after the notification, but in any case, will see a consistent view of the world.

The cache control API uses the new concept of a cache region, an area of multidimensional space defined by one or more members. To flush the cache, you first define a cache region, then tell Mondrian to flush all cell values which relate to that region. To ensure consistency, Mondrian automatically flushes all rollups of those cells.

3.1. A simple example 

Suppose that a connection has executed a query:

import mondrian.olap.*;

Connection connection;
Query query = connection.parseQuery(
    "SELECT" +
    " {[Time].[1997]," +
    " [Time].[1997].Children} ON COLUMNS," +
    " {[Customer].[USA]," +
    " [Customer].[USA].[OR]," +
    " [Customer].[USA].[WA]} ON ROWS" +
    "FROM [Sales]");
Result result = connection.execute(query);

and that this has populated the cache with the following segments:

Segment YN#1
Year Nation Unit Sales
1997 USA    xxx

Predicates: Year=1997, Nation=USA
Segment YNS#1
Year Nation State Unit Sales
1997 USA    OR    xxx
1997 USA    WA    xxx

Predicates: Year=1997, Nation=USA, State={OR, WA}
Segment YQN#1
Year Quarter Nation Unit Sales
1997 Q1      USA    xxx
1997 Q2      USA    xxx

Predicates: Year=1997, Quarter=any, Nation=USA
Segment YQNS#1
Year Quarter Nation State Unit Sales
1997 Q1      USA    OR    xxx
1997 Q1      USA    WA    xxx
1997 Q2      USA    OR    xxx
1997 Q2      USA    WA    xxx

Predicates: Year=1997, Quarter=any, Nation=USA, State={OR, WA}

Now suppose that the application knows that batch of rows from Oregon, Q2 have been updated in the fact table. The application notifies Mondrian of the fact by defining a cache region:

// Lookup members
Cube salesCube =
    connection.getSchema().lookupCube(
        "Sales", true);
SchemaReader schemaReader =
    salesCube.getSchemaReader(null);
Member memberTimeQ2 =
    schemaReader.getMemberByUniqueName(
        Id.Segment.toList("Time", "1997", "Q2"),
        true);
Member memberCustomerOR =
    schemaReader.getMemberByUniqueName(
        Id.Segment.toList("Customer", "USA", "OR"),
        true);

// Create an object for managing the cache
CacheControl cacheControl =
    connection.getCacheControl(null);

// Create a cache region defined by
// [Time].[1997].[Q2] cross join
// [Customer].[USA].[OR].
CacheControl.CellRegion measuresRegion =
    cacheControl.createMeasuresRegion(
        salesCube);
CacheControl.CellRegion regionTimeQ2 =
    cacheControl.createMemberRegion(
        memberTimeQ2, true);
CacheControl.CellRegion regionCustomerOR =
    cacheControl.createMemberRegion(
        memberCustomerOR, true);
CacheControl.CellRegion regionOregonQ2 =
    cacheControl.createCrossjoinRegion(
        measuresRegion,
        regionCustomerOR,
        regionTimeQ2);

and flushing that region:

cacheControl.flush(regionOregonQ2);

Now let's look at what segments are left in memory after the flush.

Segment YNS#1
Year Nation State Unit Sales
1997 USA    OR    xxx
1997 USA    WA    xxx

Predicates: Year=1997, Nation=USA, State={WA}
Segment YQN#1
Year Quarter Nation Unit Sales
1997 Q1      USA    xxx
1997 Q2      USA    xxx

Predicates: Year=1997, Quarter={any except Q2}, Nation=USA
Segment YQNS#1
Year Quarter Nation State Unit Sales
1997 Q1      USA    OR    xxx
1997 Q1      USA    WA    xxx
1997 Q2      USA    OR    xxx
1997 Q2      USA    WA    xxx

Predicates: Year=1997, Quarter=any, Nation=USA, State={OR, WA}

The effects are:

  • Segment YN#1 has been deleted. All cells in the segment could contain values in Oregon/1997/Q2.
  • The constraints in YNS#1 have been strengthened. The constraint on the State column is modified from State={OR, WA} to State={WA} so that future requests for (1997, Q2, USA, OR) will not consider this segment.
  • The constraints in YQN#1 have been strengthened. The constraint on the Quarter column is modified from Quarter=any to Quarter={any except Q2}.
  • The constraints in YQNS#1 have been strengthened, similar to YNS#1.

3.2. More about cell regions 

The previous example showed how to make a cell region consisting of a single member, and how to combine these regions into a two-dimensional region using a crossjoin. The CacheControl API supports several methods of creating regions:

  • createMemberRegion(Member, boolean) creates a region containing a single member, optionally including its descendants.
  • createMemberRegion(boolean lowerInclusive, Member lowerMember, boolean upperInclusive, Member upperMember, boolean descendants) creates a region containing a range of members, optionally including their descendants, and optionally including each endpoint. A range may be either closed, or open at one end.
  • createCrossjoinRegion(CellRegion...) combines several regions into a higher dimensionality region. The constituent regions must not have any dimensions in common.
  • createUnionRegion(CellRegion...) unions several regions of the same dimensionality.
  • createMeasuresRegion(Cube) creates a region containing all of the measures of a given cube.

The second overloading of createMemberRegion() is interesting because it allows a range of members to be flushed. Probably the most common use case for cache flush -- flushing all cells since a given point in time -- is expressed as a member range. For example, to flush all cells since February 15th, 2006, you would use the following code:

// Lookup members
Cube salesCube =
    connection.getSchema().lookupCube(
        "Sales", true);
SchemaReader schemaReader =
    salesCube.getSchemaReader(null);
Member memberTimeOct15 =
    schemaReader.getMemberByUniqueName(
        Id.Segment.toList("Time", "2006", "Q1", "2" ,"15"),
        true);

// Create a cache region defined by
// [Time].[1997].[Q1].[2].[15] to +infinity.
CacheControl.CellRegion measuresRegion =
    cacheControl.createMeasuresRegion(
        salesCube);
CacheControl.CellRegion regionTimeFeb15 =
    cacheControl.createMemberRegion(
        true, memberTimeFeb15, false, null, true);

Recall that the cell cache is organized in terms of columns, not members. This makes member ranges difficult for mondrian to implement. A range such as "February 15th 2007 onwards" becomes

year > 2007
|| (year = 2007
    && (quarter > 'Q1'
        || (quarter = 'Q1'
            && (month > 2
                || (month = 2
                    && day >= 15)))))

The region returned by createMeasuresRegion(Cube) effectively encompasses the whole cube. To flush all cubes in the schema, use a loop:

Connection connection;
CacheControl cacheControl = connection.getCacheControl(null);
for (Cube cube : connection.getSchema().getCubes()) {
    cacheControl.flush(
        cacheControl.createMeasuresRegion(cube));

3.3. Merging and truncating segments 

The current implementation does not actually remove the cells from memory. For instance, in segment YNS#1 in the example above, the cell (1997, USA, OR) is still in the segment, even though it will never be accessed. It doesn't seem worth the effort to rebuild the segment to save a little memory, but we may revisit this decision.

In future, one possible strategy would be to remove a segment if more than a given percentage of its cells are unreachable.

It might also be useful to be able to merge segments which have the same dimensionality, to reduce fragmentation if the cache is flushed repeatedly over slightly different bounds. There are some limitations on when this can be done, since predicates can only constrain one column: it would not be possible to merge the segments {(State=TX, Quarter=Q2)} and {(State=WA, Quarter=Q3)} into a single segment, for example. An alternative solution to fragmentation would be to simply remove all segments of a particular dimensionality if fragmentation is detected.

3.4. Accessing the CacheControl API through olap4j 

The CacheControl API is specific to Mondrian and is part of its private APIs. If your application was written at a higher abstraction level, say using olap4j, you will need to 'unwrap' the connection first and gain access to its private functions. With an olap4j connection, this can be done like so:

OlapConnection olapConnection;
Connection privateConnection = olapConnection.unwrap(RolapConnection.class);
CacheControl cacheControl = privateConnection.getCacheControl(null);

4. Other cache control topics 

4.1. Flushing the dimension cache 

The Cache Control API allows Mondrian integrators to modify the cache of dimension members. The main way that Mondrian caches dimensions in memory is via a cache of member children. That is to say, for a given member, the cache holds the list of all children of that member. If a dimension table row was inserted or deleted, or if its key attributes are updated, its parent's child list would need to be modified, and perhaps other ancestors too. For example, if a customer Zachary William is added in city Oakland, the children list of Oakland will need to be flushed. If Zachary is the first customer in Oakland, California's children list will need to be flushed to accommodate the new member Oakland.

To enable control of the dimensions cache via the Cache Control API, one must first set mondrian.rolap.EnableRolapCubeMemberCache to false.

The methods of the Cache Control API related to the dimensions cache are the following:

  • createMemberSet(Member, boolean)
  • createMemberSet(boolean, Member, boolean, Member, boolean)
  • createAddCommand(Member)
  • createDeleteCommand(Member)
  • createDeleteCommand(mondrian.olap.CacheControl.MemberSet)
  • createCompoundCommand(java.util.List)
  • createCompoundCommand(mondrian.olap.CacheControl.MemberEditCommand[])
  • createSetPropertyCommand(Member, String, Object)
  • createSetPropertyCommand(mondrian.olap.CacheControl.MemberSet,java.util.Map)
  • flush(mondrian.olap.CacheControl.MemberSet)
  • execute(mondrian.olap.CacheControl.MemberEditCommand)

It is important to note that modifying the dimension cache will, as a side effect, also flush the corresponding regions within the cell cache.

4.2. Cache consistency 

Mondrian's cache implementation must solve several challenges in order to prevent inconsistent query results. Suppose, for example, a connection executes the query

SELECT {[Measures].[Unit Sales]} ON COLUMNS,
    {[Gender].Members} ON ROWS
FROM [Sales]

It would be unacceptable if, due to updates to the underlying database, the query yielded a result where the total for [All gender] did not equal the sum of [Female] and [Male], such as

 Unit Sales
All gender100,000
Female60,000
Male55,000

We cannot guarantee that the query result is absolutely up to date, but the query must represent the state of the database at some point in time. To do this, the implementation must ensure that both cache flush and cache population are atomic operations.

First, Mondrian's implementation must provide atomic cache flush so that from the perspective of any clients of the cache. Suppose that while the above query is being executed, another connection issues a cache flush request. Since the flush request and query are simultaneous, it is acceptable for the query to return the state of the database before the flush request or after, but not a mixture of the two.

The query needs to use two aggregates: one containing total sales, and another containing sales sliced by gender. To see a consistent view of the two aggregates, the implementation must ensure that from the perspective of the query, both aggregates are flushed simultaneously. The query evaluator will therefore either see both aggregates, or see none.

Second, Mondrian must provide atomic cache population, so that the database is read consistently. Consider an example.

  1. The end user runs a query asking for the total sales:
     Unit Sales
    All gender100,000
    After that query has completed, the cache contains the total sales but not the sales for each gender.
  2. New sales are added to the fact table.
  3. The end user runs a query which shows total sales and sales for male and female customers. The query uses the cached value for total sales, but issues a query to the fact table to find the totals for male and female, and sees different data than when the cache was last populated. As result, the query is inconsistent:
     Unit Sales
    All gender100,000
    Female60,000
    Male55,000

Atomic cache population is difficult to ensure if the database is being modified without Mondrian's knowledge. One solution, not currently implemented, would be for Mondrian to leverage the DBMS' support for read-consistent views of the data. Read-consistent views are expensive for the DBMS to implement (for example, in Oracle they yield the infamous 'Snapshot too old' error), so we would not want Mondrian to use these by default, on a database which is known not to be changing.

Another solution might be to extend the Cache Control API so that the application can say 'this part of the database is currently undergoing modification'.

This scenario has not even considered aggregate tables. We have assumed that aggregate tables do not exist, or if they do, they are updated in sync with the fact table. How to deal with aggregate tables which are maintained asynchronously is still an open question.

4.3. Metadata cache control 

The CacheControl API tidies up a raft of (mostly equivalent) methods which had grown up for controlling metadata (schema XML files loaded into memory). The methods

  • mondrian.rolap.RolapSchema.clearCache()
  • mondrian.olap.MondrianServer.flushSchemaCache()
  • mondrian.rolap.cache.CachePool.flush()
  • mondrian.rolap.RolapSchema.flushRolapStarCaches(boolean)
  • mondrian.rolap.RolapSchema.flushAllRolapStarCachedAggregations()
  • mondrian.rolap.RolapSchema.flushSchema(String,String,String,String)
  • mondrian.rolap.RolapSchema.flushSchema(DataSource,String)
are all deprecated and are superseded by the CacheControl methods
  • void flushSchemaCache();
  • void flushSchema(String catalogUrl, String connectionKey, String jdbcUser, String dataSourceStr);
  • void flushSchema(String catalogUrl, DataSource dataSource);

Author: Julian Hyde; last modified by Luc Boudreau, August 2011.
Version: $Id$ (log)
Copyright (C) 2006-2011 Pentaho and others


mondrian-3.11.0.1-R/doc/cmdrunner.html000066400000000000000000000642411261646570300174120ustar00rootroot00000000000000 Pentaho Analysis Services: How to Design a Mondrian Schema
Mondrian CmdRunner

Contents

What is CmdRunner? 

CmdRunner is a command line interpreter for Mondrian. From within the command interpreter or in a command file: properties can be set and values displayed, logging levels changed, built-in function usages displayed, parameter values displayed and set, per-cube attributes displayed and set, results and errors from the previous MDX command displayed and, of course, MDX queries evaluated.

For Mondrian developers new features can be quickly tested with CmdRunner. As an example, to test a new user-defined function all one need to is add it to the schema, add the location of the function's java class to the class path, point CmdRunner at the schema and execute a MDX query that uses the new function.

For MDX developers, CmdRunner lets one test a new MDX query or Mondrian schema without having to run Mondrian in a Webserver using JPivot. Rather, one can have the new MDX query in a file and point CmdRunner at it. Granted, the output is a list, possibly long, of row and column entries; but sometimes all one needs from CmdRunner is to know that the query runs and other times one can always post process the output into excel or gnuplot, etc.

Building 

There are two ways to run the command interpreter. The first is to have a script create a class path with all of the needed mondrian and support jars in it and then have java execute the CmdRunner main method. The second is to build a jar that contains all of the needed classes and simply have java reference the jar using the -jar argument.

To build the CmdRunner combined jar from the shell command line execute the following build command:

mondrian> ./build.sh cmdrunner

This will create the jar cmdrunner.jar in the MONDRIAN_HOME/lib directory. For this build to create a jar that can actually be used it is important that the JDBC jar for your database be placed in the MONDRIAN_HOME/testlib directory prior to executing the build command.

What is useful about the cmdrunner.jar is that it can be executed without having to have the MONDRIAN_HOME directory around since it bundles up everything that is needed (other than the properties and schema files).

Usage 

There are two ways to invoke CmdRunner: using the cmdrunner.jar or using a script that builds a class path of the required jars and then executes java with that class path. The former is an easy "canned" solution but requires building the cmdrunner.jar while the later is quicker if you are in a code, compile and test cycle.

To run CmdRunner using the cmdrunner.jar from the shell prompt execute:

somedir> java -jar cmdrunner.jar -p foodmart.properties

In the MONDRIAN_HOME/bin directory there are the shell scripts cmdrunner.sh and cmdrunner.cmd that can be used duplicating the above command:

mondrian> ./bin/cmdrunner.sh -p foodmart.properties

To run CmdRunner without first building the cmdrunner.jar there is the run.sh in the MONDRIAN_HOME/bin directory. This script creates a class path and includes all jars in the MONDRIAN_HOME/testlib directory where the jdbc jars are located.

mondrian> ./bin/run.sh -p foodmart.properties

Properties File 

Below is an example properties file:

##############################################################################
#
# Example properties file
#
##############################################################################
# Environment
mondrian.catalogURL=file:///home/madonna/mondrian/FoodMartSchema.xml

# mysql
mondrian.test.jdbcURL=jdbc:mysql://localhost/foodmart?user=foodmart&password=foodmart
# to specify the jdbc username and password:
# mondrian.test.jdbcUser=foodmart
# mondrian.test.jdbcPassword=foodmart
mondrian.jdbcDrivers=com.mysql.jdbc.Driver

# Use MD5 based caching for the RolapSchema instance
mondrian.catalog.content.cache.enabled=true

# both read and use aggregate tables
mondrian.rolap.aggregates.Use=true
mondrian.rolap.aggregates.Read=true

# generate aggregate sql (for every mdx query)
#mondrian.rolap.aggregates.generateSql=true

# pretty print sql (if log level for mondrian.rolap.RolapUtil is DEBUG)
mondrian.rolap.generate.formatted.sql=true

# by default the aggregate table with the smallest number of rows
# (rather than rows times size of each row) is used
#mondrian.rolap.aggregates.ChooseByVolume=true

Command line arguments 

CmdRunner has the following command line options:

Option
Description
-h Print help, the list of command line options.
-d Enable CmdRunner debugging. This does not change this log level.
-t Time each mdx query's execution.
-nocache Regardless of the settings in the Schema file, set each Cube to no in-memory aggregate caching (caching is turned off so each query goes to the database).
-rc Do not reload the connection after each query (the default is to reload the connection. Its safe to just ignore this.
-p property-file Specify the Mondrian property file. This argument is basically required for any but the most trivial command interpreter commands. To execute a MDX query or request information about a function, the property file must be supplied. On the other hand, to have the CmdRunner print out its internal help, then the property file is not needed.
-f filename+ Specify the name of one or more files that contains CmdRunner commands. If this argument is not supplied, then the interpreter starting in the command entry mode. After the -f is seen, all subsequent arguments are interpreted as filenames.
-x xmla_filename+ Specify the name of one or more files that contains XMAL request that has no SOAP wrapper. After the -x is seen, all subsequent arguments are interpreted as XMLA filenames.
-xs soap_xmla_filename+ Specify the name of one or more files that contains XMAL request with a SOAP wrapper. After the -xs is seen, all subsequent arguments are interpreted as SOAP XMLA filenames.
-vt Validate the XMLA response using XSLT transform. This can only be used with the -x or -xs flags.
-vx Validate the XMLA response using XPaths. This can only be used with the -x or -xs flags.
mdx_command A string representing one or more CmdRunner commands.

CmdRunner Commands 

The command interpreter has a fixed set of built in commands. When a line is read, if the first word of the line matches one of the commands, then the rest of the line is assumed to be arguments to that command. On the other hand, if the first word does not match a built in command, then all text until a ';' is seen or until a '=' is entered by itself on a command continuation line is seen will be passed to the Mondrian query engine.

help 

> help <cr>

Prints help for all commands.

set 

> set [ property[=value ] ] <cr>

With no args, prints all mondrian properties and values.

With "property" prints property's value.

With "property=value" set property to that value.

log 

> log [ classname[=level ] ] <cr>

With no args, prints the current log level of all classes.

With "classname" prints the current log level of the class.

With "classname=level" set log level to new value.

file 

> file [ filename | '=' ] <cr>

With no args, prints the last filename executed.

With "filename", read and execute filename.

With "=" character, re-read and re-execute previous filename.

list 

> list [ cmd | result ] <cr>

With no arguments, list previous cmd and result

With "cmd" argument, list the last mdx query cmd.

With "result" argument, list the last mdx query result.

func 

> func [ name ] <cr>

With no arguments, list all defined function names.

With "name" argument, display the functions: name, description, and syntax.

param 

> param [ name[=value ] ] <cr>

With no arguments, all param name/value pairs are printed.

With "name" argument, the value of the param is printed.

With "name=value" sets the parameter with name to value. If name is null, then unsets all parameters. If value is null, then unsets the parameter associated with value.

cube 

> cube [ cubename [ name [=value | command] ] ] <cr>

With no arguments, all cubes are listed by name.

With "cubename" argument, cube attribute name/values for: fact table (readonly) aggregate caching (readwrite) are printed.

With "cubename name=value", sets the readwrite attribute with name to value.

With "cubename command", executes the commands: clearCache.

error 

> error [ msg | stack ] <cr>

With no arguments, both message and stack are printed.

With "msg" argument, the Error message is printed.

With "stack" argument, the Error stack trace is printed.

echo 

> echo text <cr>

Prints text to standard out.

expr 

> expr cubename expression <cr>

Evaluates an expression against a cube

= 

> = <cr>

Re-executes previous MDX query.

~ 

> ~ <cr>

Clears any text entered so far for the current command.

exit 

> exit <cr>

Exits the MDX command interpreter.

run an MDX query 

> <mdx query> ( [ ';' ] <cr> | <cr> ( '=' | '~' ) <cr> )

Executes or cancels an MDX query.

An MDX query may span one or more lines. The continuation prompt is a '?'.

After the last line of the query has been entered, on the next line a single execute character, '=', may be entered followed by a carriage return. The lone '=' informs the interpreter that the query has has been entered and is ready to execute.

At anytime during the entry of a query the cancel character, '~', may be entered alone on a line. This removes all of the query text from the the command interpreter.

Queries can also be ended by using a semicolon ';' at the end of a line.

During general operation, Mondrian Property triggers are disabled. If you enable Mondrian Property triggers for a CmdRunner session, either in the property file read on starup or by explicitly using the set property command

> set mondrian.olap.triggers.enable=true <cr>

then one can force a re-scanning of the database for aggregate tables by disabling and then re-enabling the use of aggregates:

> set mondrian.olap.aggregates.Read=false <cr>
> set mondrian.olap.aggregates.Read=true <cr>

In fact, as long as one does not use the -rc command line argument so that a new connection is gotten every time a query is executed, one can edit the Mondrian schema file between MDX query execute. This allows one to not only change what aggregates tables are in seen by Mondrian but also the definitions of the cubes within a given CmdRunner session.

Similarly, one can change between aggregate table partial ordering algorithm by changing the value of the associated property, mondrian.olap.aggregates.ChooseByVolume thus triggering internal code to reorder the aggregate table lookup order.

Within the command interpreter there is no ability to edit a previously entered MDX query. If you wish to iteratively edit and run a MDX query, put the query in a file, tell the CmdRunner to execute the file using the file command, re-execute the file using the = command, and in separate window edit/save MDX in the file.

There is also no support for a command history (other than the '=' command).

AggGen: Aggregate SQL Generator 

Mondrian release 1.2 introduces Aggregate Tables  as a means of improving performance, but aggregate tables are difficult to use without tools to support them.

CmdRunner includes a utility called AggGen, the Aggregate Table Generator. With it, you can issue an MDX query, and generate a script to create and populate the appropriate aggregate tables to support that MDX query. (The query does not actually return a result.)

In the property file provided to the CmdRunner at startup add the line:

mondrian.rolap.aggregates.generateSql=true

or from the CmdRunner command line enter:

> set mondrian.rolap.aggregates.generateSql=true <cr>

This instructs Mondrian whenever an MDX query is executed (and the cube associated with the query is not virtual) to output to standard out the Sql associated with the creation and population of both the "lost" dimension aggregate table and the "collapsed" dimension aggregate table which would be best suited to optimize the given MDX query. This Sql has to be edited to change the "l_XXX" in the "lost" dimension statements or "c_XXX" in the "collapsed" dimension statements to more appropriate table names (remembering to make sure that the new names can still be recognized by Mondrian as aggregates of the particular fact table).

As an example, if the following MDX is run against a MySql system:

WITH MEMBER
    [Store].[Nat'l Avg] AS
   'AVG(  { [Store].[Store Country].Members}, [Measures].[Units Shipped])'
SELECT
    { [Store].[Store Country].Members, [Store].[Nat'l Avg] } ON COLUMNS,
    { [Product].[Product Family].[Non-Consumable].Children } ON ROWS
FROM
   [Warehouse]
WHERE 
    [Measures].[Units Shipped];

Then the following is written to standard output:

WARN  [main] AggGen For RolapStar: "inventory_fact_1997" measure with
name, "warehouse_sales"-"inventory_fact_1997"."warehouse_cost", is not a column
name. The measure's column name may be an expression and currently AggGen does
not handle expressions. You will have to add this measure to the aggregate table
definition by hand.

CREATE TABLE agg_l_XXX_inventory_fact_1997 (
    time_id INT,
    product_id INT NOT NULL,
    store_id INT,
    store_invoice DECIMAL(10,4),
    supply_time SMALLINT,
    warehouse_cost DECIMAL(10,4),
    warehouse_sales DECIMAL(10,4),
    units_shipped INT,
    units_ordered INT,
    fact_count INTEGER NOT NULL);

INSERT INTO agg_l_XXX_inventory_fact_1997 (
    time_id,
    product_id,
    store_id,
    store_invoice,
    supply_time,
    warehouse_cost,
    warehouse_sales,
    units_shipped,
    units_ordered,
    fact_count)
SELECT
    `inventory_fact_1997`.`time_id` AS `time_id`,
    `inventory_fact_1997`.`product_id` AS `product_id`,
    `inventory_fact_1997`.`store_id` AS `store_id`,
    SUM(`inventory_fact_1997`.`store_invoice`) AS `store_invoice`,
    SUM(`inventory_fact_1997`.`supply_time`) AS `supply_time`,
    SUM(`inventory_fact_1997`.`warehouse_cost`) AS `warehouse_cost`,
    SUM(`inventory_fact_1997`.`warehouse_sales`) AS `warehouse_sales`,
    SUM(`inventory_fact_1997`.`units_shipped`) AS `units_shipped`,
    SUM(`inventory_fact_1997`.`units_ordered`) AS `units_ordered`,
    COUNT(*) AS `fact_count`
FROM 
    `inventory_fact_1997` AS `inventory_fact_1997`
GROUP BY 
    `inventory_fact_1997`.`time_id`,
    `inventory_fact_1997`.`product_id`,
    `inventory_fact_1997`.`store_id`;

CREATE TABLE agg_c_XXX_inventory_fact_1997 (
    product_family VARCHAR(30),
    product_department VARCHAR(30),
    store_country VARCHAR(30),
    the_year SMALLINT,
    store_invoice DECIMAL(10,4),
    supply_time SMALLINT,
    warehouse_cost DECIMAL(10,4),
    warehouse_sales DECIMAL(10,4),
    units_shipped INT,
    units_ordered INT,
    fact_count INTEGER NOT NULL);

INSERT INTO agg_c_XXX_inventory_fact_1997 (
    product_family,
    product_department,
    store_country,
    the_year,
    store_invoice,
    supply_time,
    warehouse_cost,
    warehouse_sales,
    units_shipped,
    units_ordered,
    fact_count)
SELECT
    `product_class`.`product_family` AS `product_family`,
    `product_class`.`product_department` AS `product_department`,
    `store`.`store_country` AS `store_country`,
    `time_by_day`.`the_year` AS `the_year`,
    SUM(`inventory_fact_1997`.`store_invoice`) AS `store_invoice`,
    SUM(`inventory_fact_1997`.`supply_time`) AS `supply_time`,
    SUM(`inventory_fact_1997`.`warehouse_cost`) AS `warehouse_cost`,
    SUM(`inventory_fact_1997`.`warehouse_sales`) AS `warehouse_sales`,
    SUM(`inventory_fact_1997`.`units_shipped`) AS `units_shipped`,
    SUM(`inventory_fact_1997`.`units_ordered`) AS `units_ordered`,
    COUNT(*) AS `fact_count`
FROM 
    `inventory_fact_1997` AS `inventory_fact_1997`,
    `product_class` AS `product_class`,
    `product` AS `product`,
    `store` AS `store`,
    `time_by_day` AS `time_by_day`
WHERE 
    `product`.`product_class_id` = `product_class`.`product_class_id` and
    `inventory_fact_1997`.`product_id` = `product`.`product_id` and
    `inventory_fact_1997`.`store_id` = `store`.`store_id` and
    `inventory_fact_1997`.`time_id` = `time_by_day`.`time_id`
GROUP BY 
    `product_class`.`product_family`,
    `product_class`.`product_department`,
    `store`.`store_country`,
    `time_by_day`.`the_year`;

There are a couple of things to notice about the output.

First, is the WARN log message. This appears because the inventory_fact_1997 table has a measure with a column attribute "warehouse_sales"-"inventory_fact_1997"."warehouse_cost" that is not a column name, its an expression. The AggGen code does not currently know what to do with such an expression, so it issues a warning. A user would have to take the generated aggregate table Sql scripts and alter them to accommodate this measure.

There are two aggregate tables, agg_l_XXX_inventory_fact_1997 the "lost" dimension case and agg_c_XXX_inventory_fact_1997 the "collapsed" dimension case. The "lost" dimension table, keeps the foreign keys for those dimension used by the MDX query and discards the other foreign keys, while the "collapsed" dimension table also discards the foreign keys that are not needed but, in addition, rolls up or collapses the remaining dimensions to just those levels needed by the query.

There are no indexes creation Sql statements for the aggregate tables. This is because not all databases require indexes to achive good performance against star schemas - your mileage may vary so do some testing. (With MySql indexes are a good idea).

If one is creating a set of aggregate tables, there are cases where it is more efficient to create the set of aggregates that are just above the fact tables and then create each subsequent level of aggregates from one of the preceeding aggregate tables rather than always going back to the fact table.

There are many possible aggregate tables for a given set of fact tables. AggGen just provides example Sql scripts based upon the MDX query run. Judgement has to be used when creating aggregate tables. There are tradeoffs such as which are the MDX queries that are run the most often? How much space does each aggregate table take? How long does it take to create the aggregate tables? How often does the set of MDX queries change? etc.

During normal Mondrian operation, for instance, with JPivot, it is recommended that the above AggGen property not be set to true as it will slow down Mondrian and generate a lot of text in the log file.


Author: Richard Emberson; last updated July, 2005.
Version: $Id$ (log )
Copyright (C) 2005-2007 Pentaho and others


mondrian-3.11.0.1-R/doc/components.html000066400000000000000000000176201261646570300176010ustar00rootroot00000000000000 Pentaho Analysis Services: Mondrian Components
Mondrian Components

Introduction

See OLAP and architecture.

Components

to be written...

Caching 

The various subsystems of mondrian have different memory requirements. Some of them require a fixed amount of memory to do their work, whereas others can exploit extra memory to increase their performance. This is an overview of how the various subsystems use memory.

Caching is a scheme whereby a component uses extra memory when it is available in order to boost its performance, and when times are hard, it releases memory with loss of performance but with no loss of correctness. A cache  is the use of extra memory when times are good, use varying amounts of memory.

Garbage collection is carried out by the Java VM to reclaim objects which are unreachable from 'live' objects. A special construct called a soft reference allows objects to be garbage-collected in hard times.

The garbage collector is not very discriminating in what it chooses to throw out, so mondrian has its own caching strategy. There are several caches in the system (described below), but they all of the objects in these caches are registered in the singleton instance of class mondrian.rolap.CachePool (currently there is just a single instance). The cache pool doesn't actually store the objects, but handles all of the events related to their life cycle in a cache. It weighs objects' cost (some function involving their size in bytes and their usefulness, which is based upon how recently they were used) and their benefit (the effort it would take to re-compute them).

The cache pool is not infallible — in particular, it can not adapt to conditions where memory is in short supply — so uses soft references, so that the garbage collector can overrule its wisdom.

Cached objects must obey the following contract:

  1. They must implement interface mondrian.rolap.CachePool.Cacheable, which includes methods to measure objects' cost, benefit, record each time they are used, and tell them to remove themselves from their cache.

  2. They must call CachePool.register(Cacheable) either in their constructor or, in any case, before they are made visible in their cache.
  3. They they must call CachePool.unregister(Cacheable) when they are removed from their cache and in their finalize() method.
  4. They must be despensable: if they disappear, their subsystem will continue to work correctly, albeit slower. A subsystem can declare an object to be temporarily indispensable by calling CachePool.pin(Cacheable, Collection) and then unpin it a short time later.
  5. Their cache must reference them via soft references, so that they are available for garbage collection.

  6. Thread safety. Their cache must be thread-safe.

If a cached object takes a significant time to initialize, it may not be possible to construct it, register it, and initialize it within the same synchronized section without unnacceptably reducing concurrency. If this is the case, you should use phased construction. First construct and register the object, but mark it 'under construction'. Then release the lock on the CachePool and the object's cache, and continue initializing the object. Other threads will be able to see the object, and should be able to wait until the object is constructed. The method Segment.waitUntilLoaded() is an example of this.

The following objects are cached.

1. Segment 

A Segment (class mondrian.rolap.agg.Segment) is a collection of cell values parameterized by a measure, and a set of (column, value) pairs. An example of a segment is

(Unit sales, Gender = 'F', State in {'CA','OR'}, Marital Status = anything)

All segments over the same set of columns belong to an Aggregation, in this case

('Sales' Star, Gender, State, Marital Status)

Note that different measures (in the same Star) occupy the same Aggregation. Aggregations belong to the AggregationManager, a singleton.

Segments are pinned during the evaluation of a single MDX query. The query evaluates the expressions twice. The first pass, it finds which cell values it needs, pins the segments containing the ones which are already present (one pin-count for each cell value used), and builds a cell request (class mondrian.rolap.agg.CellRequest) for those which are not present. It executes the cell request to bring the required cell values into the cache, again, pinned. Then it evalutes the query a second time, knowing that all cell values are available. Finally, it releases the pins.

2. Member set 

A member set (class mondrian.rolap.SmartMemberReader.ChildrenList) is a set of children of a particular member. It belongs to a member reader (class mondrian.rolap.SmartMemberReader).

3. Schema 

Schemas (class mondrian.rolap.RolapSchema) are cached in class mondrian.rolap.RolapSchema.Pool, which is a singleton (todo: use soft references). The cache key is the URL which the schema was loaded from.

4. Star schemas 

Star schemas (class mondrian.rolap.RolapStar) are stored in the static member RolapStar.stars (todo: use soft references), and accessed via RolapStar.getOrCreateStar(RolapSchema, MondrianDef.Relation).




Author: Julian Hyde; last modified August 2006.
Version: $Id$ (log)
Copyright (C) 2002-2005 Julian Hyde
Copyright (C) 2005-2006 Pentaho


mondrian-3.11.0.1-R/doc/configuration.html000066400000000000000000000520701261646570300202610ustar00rootroot00000000000000 Pentaho Analysis Services: Configuration Guide
Configuration Guide

Contents

  1. Properties
    1. Property list
  2. Connect strings
    1. Syntax
    2. Connect string properties
  3. Cache management
    1. Schema cache
  4. Memory management
    1. Out of memory
  5. Logging
    1. Configuring log4j within Mondrian's test environment
    2. MDX and SQL Statement Logging

1. Properties 

Mondrian has a properties file to allow you to configure how it executes. The mondrian.properties file is loaded when the executing Mondrian JAR detects it needs properties, but can also be done explicitly in your code. It looks in several places, in the following order:

  1. In the directory where you started your JVM (Current working directory for JVM process, java.exe on Win32, java on UNIX/Linux).
  2. If there isn't mondrian.properties under current working directory of JVM process, Class MondrianProperties's classloader will try to locate mondrian.properties in all of its classpaths. So you may put mondrian.properties under /WEB-INF/classes when you pack Mondrian into a Java web application. The demonstration web applications have this configuration.

These properties are stored as system properties, so they can be set during JVM startup via -D<property>=<value>.

1.1 Property list 

The following properties in mondrian.properties effect the operations of Mondrian.

Not all of the properties in this table are of interest to the end-user. For example, those in the 'Testing' are only applicable if are running Mondrian's suite of regression tests.

Limit properties 

Properties mondrian.result.limit, mondrian.rolap.iterationLimit and mondrian.rolap.queryTimeout enforce runtime limits on the time or space required to execute a query. If any of these limits are exceeded, mondrian throws an exception which extends mondrian.olap.ResultLimitExceededException.

Connect strings 

Connect string syntax 

Mondrian connect strings are a connection of property/value pairs, of the form 'property=value;property=value;...'.

Values can be enclosed in single-quotes, which allows them to contain spaces and punctuation. See the the OLE DB connect string syntax specification.

The supported properties are described below.

Connect string properties 

Name Required? Description
Provider Yes

Must have the value "Mondrian".

Jdbc Exactly one

The URL of the JDBC database where the data is stored. You must specify either DataSource or Jdbc.

DataSource

The name of a data source loaded via JNDI. The name must be a valid JNDI name, and the object referenced must implement the javax.sql.DataSource interface. You must specify either DataSource or Jdbc.

JdbcDrivers Yes

Comma-separated list of JDBC driver classes, for example,

JdbcDrivers=sun.jdbc.odbc.JdbcOdbcDriver,oracle.jdbc.OracleDriver
JdbcUser No

The name of the user to log on to the JDBC database. (If your JDBC driver allows you to specify the user name in the JDBC URL, you don't need to set this property.)

JdbcPassword No

The name of the password to log on to the JDBC database. (If your JDBC driver allows you to specify the password in the JDBC URL, you don't need to set this property.)

Catalog Exactly one

The URL of the catalog, an XML file which describes the schema: cubes, hierarchies, and so forth. For example,

Catalog=file:demo/FoodMart.xml

Catalogs are described in the Schema Guide. See also CatalogContent.

CatalogContent

An XML string representing the schema: cubes, hierarchies, and so forth. For example,

CatalogContent=<Schema name="MySchema"><Cube name="Cube1"> ... </Schema>

Catalogs are described in the Schema Guide. See also Catalog.

CatalogName No

Not used. If, in future, Mondrian supports multiple catalogs, this property will specify which catalog to use. See also Catalog.

PoolNeeded No

Tells Mondrian whether to add a layer of connection pooling.

If the value "true" is specified, or no value is specified, Mondrian assumes that:

  • connections created via the Jdbc property are not pooled, and therefore need to be pooled;
  • connections created via the DataSource are already pooled.

If the value "false" is specified, Mondrian does not apply connection-pooling to any connection.

Role No

The name of the role to adopt for access-control purposes. If not specified, the connection uses a role which has access to every object in the schema.

This property can contain multiple role names separated by commas. If so, queries in the connection execute with the sum of the privileges of all of the rules; the effect is the same as running under a union role, defined using the <Union> element in the schema file.

If a role name contains a comma, escape the comma using an extra comma. For example, a connection created with

Role='Pacific region manager,Europe,, Middle East and Africa manager'

will execute with the combined privileges of the roles "Pacific region manager", and "Europe, Middle East and Africa manager".

jdbc.* No

Any property whose name begins with "jdbc." will be added to the JDBC connection properties, after removing this prefix. This allows you to specify connection properties without a URL.

For example, given the properties

jdbc.Timeout=50; jdbc.CacheSize=1m

Mondrian will create a JDBC connection using the properties {Timeout="50", CacheSize="1m"}.

UseContentChecksum No

Allows mondrian to work with dynamically changing schema. If this property is set to true and schema content has changed (previous checksum doesn't equal with current), schema would be reloaded. The default is false.

Could be used in combination with DynamicSchemaProcessor property.

UseSchemaPool No

Controls whether a new connection use a schema from the schema cache. If true, the default, a connection shares a schema definition (and hence also a cache of aggregate data retrieved by previous queries) with other connections which have a textually identical schema definition.

If false, the connection has a private schema definition and cache.

DynamicSchemaProcessor No

The name of a class which is called at runtime in order to modify the schema content. The class must implement the mondrian.spi.DynamicSchemaProcessor interface. For example,

DynamicSchemaProcessor = mondrian.i18n.LocalizingDynamicSchemaProcessor

uses the builtin schema processor class mondrian.i18n.LocalizingDynamicSchemaProcessor to replace variables in the schema file, according to resource files and the current locale (see the Locale property).

Locale No

The requested Locale for the current session. The locale determines the formatting of numbers and date/time values, and Mondrian's error messages.

Example values are "en" (English), "en_US" (United States English), "hu" (Hungarian). If Locale is not specified, then the name of system's default will be used, as per java.util.Locale#getDefault().

JdbcConnectionUuid No

A unique identifier for the connection. If this is set, Mondrian will look at this property and no other to determine whether two data sources should be considered the same. You must ensure that connections will only share a JdbcConnectionUuid if they point to the same database.

Connect string properties are also documented in the RolapConnectionProperties class.

Cache management

Schema cache

To flush all schema definitions, use the mondrian.olap.CacheControl.flushSchemaCache() method:

import mondrian.olap.*;

Connection connection;
CacheControl cacheControl = connection.getCacheControl(null);
cacheControl.flushSchemaCache();

The cache is only used when creating new connections; existing connections retain their schemas.

There are four connect string properties that control the use of the Schema cache: UseSchemaPool, UseContentChecksum, CatalogContent and DynamicSchemaProcessor.

The UseSchemaPool property controls whether or not the cache is used regardless of the values of any of the other properties. If UseSchemaPool is "false", then the cache is not used; each request for a new schema object creates a new one (entailing the re-parsing of the schema definition and re-scanning of the database for meta data and aggregate tables - very slow, and, in addition, there is no reuse of the in-memory aggregate cache).

Next, if UseContentChecksum is "true", then a check sum (MD5) is created from the schema definition content (not URL) and it is this check sum that is used as the key to lookup previously cached versions of the schema definition. If two schema definitions produce different check sums, then one can safely assume that they are different schemas (of course, it is possible that only a comment or some whitespace in the schema definition changed in which case the two schemas would actually be the same, but because their check sums are different, different schema objects are used). If UseContentChecksum is "false", then no check sum is created and used as the lookup key, rather, a combination of the connection attributes "catalogUrl", "connectionKey", "jdbcUser", "dataSourceStr" or "catalogUrl", "dataSource" are used to create the key.

If the CatalogContent is specified, then it is used as the schema definition content. If, in fact, it is specified, then the value of DynamicSchemaProcessor, if any, is ignored.

Finally, the DynamicSchemaProcessor connection string property is the class name of a class that implements the DynamicSchemaProcessor interface. If set, an instance of the class is created for each schema request and its "processSchema" method is called which returns the schema definition content.

Memory management

Out Of Memory

Java OutOfMemoryError errors have always been an issue with applications. When the JVM throws an Error as opposed to an Exception it is telling the application that its world has ended and it has no recourse but to die. Prior to Java5 there was not much one could do other than buy 64-bit machines with lots of RAM and hope for the best. For a multi-user, Mondrian environment with potentially very large data-sets and clients that can generate queries requesting arbitrarily large amounts of that data, this can be an issue. This is especially the case when Mondrian is being hosted on some corporate web-server; applications that kill web-servers are not looked upon favorably by IT.

With Java5 (and Java6, etc.) there is alternative. An application cay take advantage of a new feature in Java5 allowing the application to be notified when memory starts running low. This allows the application to take preemptive action prior to an OutOfMemoryError being generated by the Java runtime.

Mondrian takes advantage of this new feature. Rather than passing an OutOfMemoryError to its client, it will now stop processing the present query, free up data structures associated with the present query and return a MemoryLimitExceededException to the client. The MemoryLimitExceededException is one of Mondrian's ResultLimitExceededException which are used to communicate with clients that a limit has been exceeded, in this case, memory usage.

By default, for Mondrian running under Java5, this feature is enabled and the "safety limit" is set at 90 percent, when memory usage gets to with 90 percent of the maximum possible, the the processing of the current query is stopped and a MemoryLimitExceededException is return to the client. See the Memory monitoring properties above on this page for additional information.

Lastly, the gorilla in the closet. Java5 in its wisdom only allows for one memory threshold notification level to be registered with the JVM. What this means is if within the same JVM, some code registers one level, say, at 80% (here I use percentages for ease of presentation rather than number of bytes which is what the Java5 API actually supports) and some other code later on registers a level of 90%, then it is the 90% that the JVM knows about - it knows nothing of the previously registered 80%. What this means is that the code expecting to be notified when the memory level crosses 80%, won't be notified!

For many applications that don't share their JVM with other applications, this is not a problem, but for Mondrian is it potentially an issue. Mondrian can be running in a Webserver and Webservers can have more than one independent applications. Each such application can register a different memory threshold notification level. In general, application-containing applications such as web-servers or application-servers are a problem with the current Java5 memory threshold notification approach. At the current time, I do not know a way around this problem.

Logging

Mondrian uses log4j for all information and debug logging. When running within an application server, Mondrian's log4j configuration is determined by the server's or web application's log4j configuration. Please see log4j's documentation for a additional details.

Configuring log4j within Mondrian's test environment

When running outside an application server, log4j determines the location of the log4j.xml file via the log4j.configuration java system property. log4j treats this string as a URL, so to have it detect the log4j file on the file system, you must use the syntax "file:DIR/log4j.xml". Relative paths are acceptible, so if you have your log4j.xml file in the root directory of mondrian, "file:log4j.xml" will load the correct file. You may specify the log4j.configuration property in mondrian.properties, because Mondrian's ant build file explicitly sets the property as a JVM system property when running JUnit tests.

MDX and SQL Statement Logging

The default log4j.xml file is configured so that a separate log file is created for both MDX and SQL statement logging. In the code, the MDX and SQL strings are logged at the debug level, so to disable them you can set the log level to INFO or any other level above debug. Statement logging occurs within the log4j categories "mondrian.mdx" and "mondrian.sql". These categories log the statements and how long they took to execute. The SQL log also records the number of results returned in the result set.

For example, to trace both MDX and SQL statements, create a file log4j.properties in the directory where you started mondrian with the following contents:

# Set root logger level to DEBUG and its only appender to MONDRIAN.
log4j.rootLogger=WARN, MONDRIAN

# MONDRIAN is set to be a ConsoleAppender.
log4j.appender.MONDRIAN=org.apache.log4j.ConsoleAppender

# MONDRIAN uses PatternLayout.
log4j.appender.MONDRIAN.layout=org.apache.log4j.PatternLayout
log4j.appender.MONDRIAN.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n

# Trace MDX and SQL statements
log4j.category.mondrian.mdx=DEBUG, MONDRIAN
log4j.category.mondrian.sql=DEBUG, MONDRIAN

Then mondrian with the argument -Dlog4j.configuration=file:log4j.properties on the Java command line.

Consider setting the property mondrian.rolap.generate.formatted.sql=true in mondrian.properties to make the format more readable.


Author: Julian Hyde; last modified April, 2011.
Version: $Id$ (log)
Copyright (C) 2006-2011 Pentaho


mondrian-3.11.0.1-R/doc/deployDoc.sh000077500000000000000000000021741261646570300170050ustar00rootroot00000000000000#!/bin/sh # # This software is subject to the terms of the Eclipse Public License v1.0 # Agreement, available at the following URL: # http://www.eclipse.org/legal/epl-v10.html. # You must accept the terms of that agreement to use this software. # # Copyright (C) 2005-2009 Pentaho # All Rights Reserved. # # This is a script to deploy Mondrian's website. # Only the release manager (jhyde) should run this script. set -e set -v generate=true if [ "$1" == --nogen ]; then shift generate= fi # Prefix is usually "release" or "head" prefix="$1" # Directory at sf.net docdir= case "$prefix" in 3.0|release) export docdir=htdocs;; head) export docdir=head;; *) echo "Bad prefix '$prefix'"; exit 1;; esac cd $(dirname $0)/.. if [ "$generate" ]; then ant doczip else echo Skipping generation... fi scp dist/doc.tar.gz jhyde@shell.sf.net: GROUP_DIR=/home/groups/m/mo/mondrian ssh -T jhyde@shell.sf.net < Pentaho Analysis Services: Mondrian Components
Mondrian Components

Contents

  1. Introduction
  2. Components
  3. Design issues
    1.  

Introduction 

See architecture.oi

Components 

to be written...

Design issues 

Caching


Author: Julian Hyde; last updated August, 2006.
Version: $Id$ (log)

mondrian-3.11.0.1-R/doc/developer.html000077500000000000000000001121621261646570300174010ustar00rootroot00000000000000 Pentaho Analysis Services: Developer's guide
Developer's Guide

There are several ways to get Mondrian running. The easiest is to download a binary release, as described in the installation guide. But you can also build Mondrian from its source code. This document describes how to do that, how to learn about Mondrian's inner workings, and the guidelines you'll need to follow if you want to contribute to the Mondrian project.

Getting the source code 

First, you need to get a copy of the source code. You can get the source code from SourceForge or from the project's Github repository.

Download the latest release 

Download the latest mondrian-version.zip from SourceForge, and unzip. Now find the mondrian-version-src.zip inside this distribution, and unzip it. The directory you unzip this source code to — typically something like C:\open\mondrian or /usr/local/mondrian-x.y.z — will be denoted ${project.location} later in this document.

Clone the Github repository 

Download the Git client from Git.

Clone the Git repository.

$ git clone https://github.com/pentaho/mondrian.git
    Cloning into 'mondrian'...
    remote: Counting objects: 51661, done.
    remote: Compressing objects: 100% (9979/9979), done.
    remote: Total 51661 (delta 37833), reused 51512 (delta 37691)
    Receiving objects: 100% (51661/51661), 294.25 MiB | 604 KiB/s, done.
    Resolving deltas: 100% (37833/37833), done.

Building the code

Setting up your environment

  • Download and install a JDK for Java 1.5, 1.6 and 1.7. You can download the releases from Oracle

    Mondrian requires all three versions to build correctly. When Mondrian creates JDBC connections, it creates JDBC version 3 connections with Java 1.5, version 4 connections with Java 1.6 and version 4.1 connections with Java 1.7. The factory classes that create JDBC connections(FactoryJdbc3Impl, FactoryJdbc4Impl and FactoryJdbc41Impl) need to be compiled with the matching JDK version.

  • Download and install Ant version 1.6 or later. You can download Ant from Apache
  • Setup environment variables JAVA_HOME_15, JAVA_HOME_16, JAVA_HOME_17 and ANT_HOME to point at the locations where you installed them. Set JAVA_HOME to your Java 1.5 JDK.

Now build the code, as follows:


    C:\mondrian> ant

    Buildfile: C:\mondrian\build.xml

    version:

    antcontrib.download-check:

    antcontrib.download:

    install-antcontrib:

    ivy.download-check:

    ivy.download:

    install-ivy:
    [echo] Installing IVY...

    resolve:
    [echo] symlink=${symlink}
    [ivy:resolve] :: Ivy 2.1.0 - 20090925235825 :: http://ant.apache.org/ivy/ ::
    [ivy:resolve] :: loading settings :: url = file:C:/mondrian/ivysettings.xml
    [ivy:resolve] :: resolving dependencies :: pentaho#mondrian-workbench;TRUNK-SNAPSHOT
    [ivy:resolve] 	confs: [default]
    [ivy:resolve] 	found commons-codec#commons-codec;1.2 in public

    ....more ivy messages

    prepare:
    [mkdir] Created dir: C:\mondrian\build

    define-tasks:

    parser:
    [javacup] Opening files...
    [javacup] Parsing specification from C:\mondrian\src\main\mondrian\olap\Parser.cup...
    [javacup] Checking specification...
    [javacup] Warning: Terminal "UNKNOWN" was declared but never used
    [javacup] Building parse tables...
    [javacup]   Computing non-terminal nullability...
    [javacup]   Computing first sets...
    [javacup]   Building state machine...
    [javacup]   Filling in tables...
    [javacup] *** Reduce/Reduce conflict found in state #98
    [javacup]   between value_expression_primary ::= NULL (*)
    [javacup]   and     term3 ::= term3 IS NULL (*)
    [javacup]   under symbols: {EOF, AND, AS, CELL, DIMENSION, ELSE, END, IN, IS, MATCHES, MEMBER, NOT, ON, OR, PROPERTIES, RETURN, SELECT, SET, THEN, WHEN, XOR, COLON, COMMA, EQ, GE, GT, LE, LT, NE, RBRACE, RPAREN}
    [javacup]   Resolved in favor of the second production.
    [javacup]
    [javacup] *** Shift/Reduce conflict found in state #98
    [javacup]   between value_expression_primary ::= NULL (*)
    [javacup]   under symbol EOF
    [javacup]   Resolved in favor of shifting.

    ....more javacup messages

    [javacup]   Checking for non-reduced productions...
    [javacup] Writing parser...
    [javacup] Closing files...
    [javacup] ------- CUP v0.10k Parser Generation Summary -------
    [javacup]   0 errors and 64 warnings
    [javacup]   69 terminals, 67 non-terminals, and 147 productions declared,
    [javacup]   producing 224 unique parse states.
    [javacup]   1 terminal declared but not used.
    [javacup]   0 non-terminal declared but not used.
    [javacup]   0 productions never reduced.
    [javacup]   63 conflicts detected (63 expected).
    [javacup]   Code written to "Parser.java", and "ParserSym.java".
    [javacup] ---------------------------------------------------- (v0.10k)
    [javacc] Java Compiler Compiler Version 5.0 (Parser Generator)
    [javacc] (type "javacc" with no arguments for help)
    [javacc] Reading from file C:\mondrian\src\main\mondrian\parser\MdxParser.jj . . .
    [javacc] Note: UNICODE_INPUT option is specified. Please make sure you create the parser/lexer using a Reader with the correct character encoding.
    [javacc] File "TokenMgrError.java" does not exist.  Will create one.
    [javacc] File "ParseException.java" does not exist.  Will create one.
    [javacc] File "Token.java" does not exist.  Will create one.
    [javacc] File "SimpleCharStream.java" does not exist.  Will create one.
    [javacc] Parser generated successfully.

    generate.resources:
    [javac] Compiling 7 source files to C:\mondrian\classes
    [resgen] Generating C:\mondrian\src\main\mondrian\resource\MondrianResource.java
    [resgen] Generating C:\mondrian\classes\mondrian\resource\MondrianResource.properties
    [resgen] Generating C:\mondrian\src\main\mondrian\resource\MondrianResource_en_US.java
    [resgen] Generating C:\mondrian\classes\mondrian\resource\MondrianResource_en_US.properties
    [resgen] Generating C:\mondrian\src\main\mondrian\resource\MondrianResource_de_DE.java
    [resgen] Generating C:\mondrian\classes\mondrian\resource\MondrianResource_de_DE.properties
    [resgen] Generating C:\mondrian\src\main\mondrian\resource\MondrianResource_de.java
    [resgen] Generating C:\mondrian\classes\mondrian\resource\MondrianResource_de.properties
    [resgen] Generating C:\mondrian\src\main\mondrian\resource\MondrianResource_es_ES.java
    [resgen] Generating C:\mondrian\classes\mondrian\resource\MondrianResource_es_ES.properties

    generate.properties:
    [javac] Compiling 1 source file to C:\mondrian\classes
    [java] Generating src\main\mondrian\olap\MondrianProperties.java
    [java] Generating doc\properties.html
    [java] Generating mondrian.properties.template

    def:
    [xomgen] Writing C:\mondrian\src\main\mondrian\olap\mondrian.dtd
    [xomgen] Writing C:\mondrian\src\main\mondrian\olap\MondrianDef.java
    [xomgen] Done
    [copy] Copying 1 file to C:\mondrian\lib
    [xomgen] Writing C:\mondrian\src\main\mondrian\gui\mondrian_SW.dtd
    [xomgen] Writing C:\mondrian\src\main\mondrian\gui\MondrianGuiDef.java
    [xomgen] Done
    [copy] Copying 1 file to C:\mondrian\lib
    [xomgen] Writing C:\mondrian\src\main\mondrian\xmla\datasourcesconfig.dtd
    [xomgen] Writing C:\mondrian\src\main\mondrian\xmla\DataSourcesConfig.java
    [xomgen] Done
    [copy] Copying 1 file to C:\mondrian\lib

    compileJdk15:
    [exec] Using ANT_HOME: C:/Java/apache-ant-1.8.4
    [exec] Using JAVA_HOME: C:/Java/jdk1.5.0_22
    [exec] Using JAVACMD: C:/Java/jdk1.5.0_22\bin\java.exe
    [exec] Using Ant arguments: -Drequested.java.version=jdk1.5 compile.java
    [exec] Buildfile: C:\mondrian\build.xml
    [exec]
    [exec] apologise:
    [exec]
    [exec] compile.java:
    [exec]      [echo] Compiling on JVM Version: 1.5.0_22-b03
    [exec]     [javac] Compiling 722 source files to C:\mondrian\classes
    [exec]     [javac] Note: Some input files use or override a deprecated API.
    [exec]     [javac] Note: Recompile with -Xlint:deprecation for details.
    [exec]     [javac] Note: Some input files use unchecked or unsafe operations.
    [exec]     [javac] Note: Recompile with -Xlint:unchecked for details.
    [exec]      [copy] Copying 1 file to C:\mondrian\classes
    [exec]
    [exec] BUILD SUCCESSFUL
    [exec] Total time: 9 seconds

    compileJdk16:
    [exec] Using ANT_HOME: C:/Java/apache-ant-1.8.4
    [exec] Using JAVA_HOME: c:/Java/jdk1.6.0_35
    [exec] Using JAVACMD: c:/Java/jdk1.6.0_35\bin\java.exe
    [exec] Using Ant arguments: -Drequested.java.version=jdk1.6 compile.java
    [exec] Buildfile: C:\mondrian\build.xml
    [exec]
    [exec] apologise:
    [exec]
    [exec] compile.java:
    [exec]      [echo] Compiling on JVM Version: 1.6.0_35-b10
    [exec]     [javac] Compiling 3 source files to C:\mondrian\classes
    [exec]     [javac] Note: C:\mondrian\src\main\mondrian\util\UtilCompatibleJdk16.java uses unchecked or unsafe operations.
    [exec]     [javac] Note: Recompile with -Xlint:unchecked for details.
    [exec]
    [exec] BUILD SUCCESSFUL
    [exec] Total time: 2 seconds

    compileJdk17:
    [exec] Using ANT_HOME: C:/Java/apache-ant-1.8.4
    [exec] Using JAVA_HOME: c:/Java/jdk1.7.0_07
    [exec] Using JAVACMD: c:/Java/jdk1.7.0_07\bin\java.exe
    [exec] Using Ant arguments: -Drequested.java.version=jdk1.7 compile.java
    [exec] Buildfile: C:\mondrian\build.xml
    [exec]
    [exec] apologise:
    [exec]
    [exec] compile.java:
    [exec]      [echo] Compiling on JVM Version: 1.7.0_07-b11
    [exec]     [javac] Compiling 1 source file to C:\mondrian\classes
    [exec]
    [exec] BUILD SUCCESSFUL
    [exec] Total time: 1 second

    compile:

    info:
    [echo] ==============================================================
    [echo] | Mondrian configuration info                                |
    [echo] ==============================================================
    [echo] project.location             = C:\mondrian
    [echo] jdk.home                     = C:/Java/jdk1.5.0_22
    [echo] log4j.configuration          = log4j.properties
    [echo] mondrian.foodmart.catalogURL = file:C:\mondrian/demo/FoodMart.xml
    [echo] mondrian.foodmart.jdbcURL    = jdbc:mysql://localhost/foodmart?user=foodmart&password=foodmart
    [echo] mondrian.jdbcDrivers         = com.mysql.jdbc.Driver
    [echo] driver.classpath (additions) = C:/Java/jdbc/mysql-connector-java-5.1.22-bin.jar
    [echo] ==============================================================

    compile.tests:
    [echo] Test Classpath: C:\mondrian\lib\ant-launcher.jar
    [echo]  C:\mondrian\lib\ant.jar

    ...more classpath messages

    [javac] Compiling 174 source files to C:\mondrian\testclasses
    [javac] Note: Some input files use or override a deprecated API.
    [javac] Note: Recompile with -Xlint:deprecation for details.
    [javac] Note: Some input files use unchecked or unsafe operations.
    [javac] Note: Recompile with -Xlint:unchecked for details.

    check-FoodMartCreateData-uptodate:

    unzip-FoodMartCreateData:
    [unzip] Expanding: C:\mondrian\demo\FoodMartCreateData.zip into C:\mondrian\demo

    check-FoodMartAccessDB-uptodate:

    unzip-FoodMartAccessDB:
    [unzip] Expanding: C:\mondrian\demo\access\MondrianFoodMart-Access.zip into C:\mondrian\demo\access

    check-FoodMartDerbyDB-uptodate:

    unzip-FoodMartDerbyDB:
    [unzip] Expanding: C:\mondrian\demo\derby\derby-foodmart.zip into C:\mondrian\demo\derby

    unzip-databases:

    all:

    BUILD SUCCESSFUL
    Total time: 32 seconds

Pay close attention to the Ant targets named compileJdk1.5, compileJdk1.6 and compileJdk1.7, and ensure that each JVM compilation phase has compiled the files it needed to. The JDK 1.5 should compile about 700+ files. The JDK 1.6 must compile the JDBC 4.0 classes (3 files) and JDK 1.7 should compile the JDBC 4.1 driver (1 file). In each compileJdk1.x target, the first target is called "apologise:", and must produce no output.

Installing the database

Before you run the regression test suite or the web application, you must install the standard FoodMart dataset. This is described in the installation guide.

 If you got your files from GitHub, you can skip the step where you download the data sets: you should already have the files demo/access/MondrianFoodMart.mdb and demo/FoodMartCreateData.zip.

You will need to update your mondrian.properties in order to connect to the FoodMart database during the test. The important properties are:

PropertyDescriptionExample (MySQL)
mondrian.foodmart.jdbcURL JDBC URL to connect to your database. Required jdbc:mysql://localhost:3307/foodmart
mondrian.foodmart.jdbcUser User name for database connection. Required root
mondrian.foodmart.jdbcPassword Password for database connection. Required password
mondrian.jdbcDrivers List of paths to JDBC driver JARs as a valid classpath. The paths can be relative to the root of the installation. Required testlib/mysql-connector-java-3.1.11-bin.jar

There is a target in the build script, load-foodmart, that will load the Foodmart data into an empty database configured through your mondrian.properties settings. For this target, you can set an additional property in mondrian.properties, mondrian.foodmart.jdbcSchema=<your schema> if you are using a database that supports schemas and you want to load Foodmart into a particular schema.

Running the test suite 

At the command line:

cd ${project.location}
ant test

Running the test via the Mondrian Ant build in Eclipse works, too.

Example output:

Buildfile: build.xml
Overriding previous definition of reference to jdk

prepare:
[mkdir] Created dir: C:\open\mondrian\build

parser:
[javacup] Opening files...
[javacup] Parsing specification from C:\open\mondrian\src\main\mondrian\olap\Parser.cup...
[javacup] Checking specification...
[javacup] Warning: Terminal "UNKNOWN" was declared but never used
[javacup] Warning: Non terminal "unsigned_integer" was declared but never used
[javacup] Building parse tables...
[javacup] Computing non-terminal nullability...
[javacup] Computing first sets...
[javacup] Building state machine...
[javacup] Filling in tables...
[javacup] *** Reduce/Reduce conflict found in state #99
[javacup] between value_expression_primary ::= NULL (*)
[javacup] and term3 ::= term3 IS NULL (*)
[javacup] under symbols: {EOF, AND, AS, CELL, DIMENSION, ELSE, END, IN, IS, MATCHES, MEMBER, NOT, ON, OR, PROPERTIES, SELECT, SE
T, THEN, WHEN, XOR, COLON, COMMA, EQ, GE, GT, LE, LT, NE, RBRACE, RPAREN}
[javacup] Resolved in favor of the second production.

[javacup] *** Shift/Reduce conflict found in state #99
[javacup] between value_expression_primary ::= NULL (*)
[javacup] under symbol EOF
[javacup] Resolved in favor of shifting.

...

[javacup] *** Shift/Reduce conflict found in state #99
[javacup] between term3 ::= term3 IS NULL (*)
[javacup] under symbol RPAREN
[javacup] Resolved in favor of shifting.

[javacup] Checking for non-reduced productions...
[javacup] Writing parser...
[javacup] Closing files...
[javacup] ------- CUP v0.10k Parser Generation Summary -------
[javacup] 0 errors and 63 warnings
[javacup] 56 terminals, 60 non-terminals, and 125 productions declared,
[javacup] producing 194 unique parse states.
[javacup] 2 terminals declared but not used.
[javacup] 0 non-terminals declared but not used.
[javacup] 0 productions never reduced.
[javacup] 61 conflicts detected (61 expected).
[javacup] Code written to "Parser.java", and "ParserSym.java".
[javacup] ---------------------------------------------------- (v0.10k)

generate.resources:
[javac] Compiling 3 source files to C:\open\mondrian\classes
[resgen] Generating C:\open\mondrian\src\main\mondrian\resource\MondrianResource.java
[resgen] Generating C:\open\mondrian\classes\mondrian\resource\MondrianResource.properties
[resgen] Generating C:\open\mondrian\src\main\mondrian\resource\MondrianResource_en_US.java
[resgen] Generating C:\open\mondrian\classes\mondrian\resource\MondrianResource_en_US.properties
[resgen] Generating C:\open\mondrian\src\main\mondrian\resource\MondrianResource_de_DE.java
[resgen] Generating C:\open\mondrian\classes\mondrian\resource\MondrianResource_de_DE.properties
[resgen] Generating C:\open\mondrian\src\main\mondrian\resource\MondrianResource_de.java
[resgen] Generating C:\open\mondrian\classes\mondrian\resource\MondrianResource_de.properties
[resgen] Generating C:\open\mondrian\src\main\mondrian\resource\MondrianResource_es_ES.java
[resgen] Generating C:\open\mondrian\classes\mondrian\resource\MondrianResource_es_ES.properties

def:
[xomgen] Writing src\main\mondrian\olap\mondrian.dtd
[xomgen] Writing src\main\mondrian\olap\MondrianDef.java
[xomgen] Done
[copy] Copying 1 file to C:\open\mondrian\lib
[copy] Copying 1 file to C:\open\mondrian\lib
[xomgen] Writing src\main\mondrian\xmla\datasourcesconfig.dtd
[xomgen] Writing src\main\mondrian\xmla\DataSourcesConfig.java
[xomgen] Done
[copy] Copying 1 file to C:\open\mondrian\lib

compile.java:
[javac] Compiling 987 source files to C:\open\mondrian\classes
[javac] Note: Some input files use or override a deprecated API.
[javac] Note: Recompile with -Xlint:deprecation for details.
[javac] Note: Some input files use unchecked or unsafe operations.
[javac] Note: Recompile with -Xlint:unchecked for details.

check-FoodMartCreateData-uptodate:

unzip-FoodMartCreateData:
[unzip] Expanding: C:\open\mondrian\demo\FoodMartCreateData.zip into C:\open\mondrian\demo

check-FoodMartAccessDB-uptodate:

unzip-FoodMartAccessDB:
[unzip] Expanding: C:\open\mondrian\demo\access\MondrianFoodMart-Access.zip into C:\open\mondrian\demo\access

check-FoodMartDerbyDB-uptodate:

unzip-FoodMartDerbyDB:
[unzip] Expanding: C:\open\mondrian\demo\derby\derby-foodmart.zip into C:\open\mondrian\demo\derby

compile:

compile.tests:
    [javac] Compiling 69 source files to C:\open\mondrian\testclasses
    [javac] Note: C:\open\mondrian\testsrc\main\mondrian\test\ParameterTest.java uses or overrides a deprecated API.
    [javac] Note: Recompile with -deprecation for details.

test-dbms:
     [echo] Connecting to jdbc:postgresql://localhost/FM3
     [java] Mondrian: properties loaded from 'file:/C:/open/mondrian/mondrian.properties'
     [java] Mondrian: properties loaded from 'file:/C:/open/mondrian/build.properties'
     [java] Mondrian: loaded 4 system properties
     [java] testName: null
     [java] testClass: null
     [java] All 1 thread(s) started.
     [java] Mondrian: JDBC driver org.postgresql.Driver loaded successfully
     [java] Mondrian: JDBC driver sun.jdbc.odbc.JdbcOdbcDriver loaded successfully
     [java] Mondrian: JDBC driver com.mysql.jdbc.Driver loaded successfully
     [java] Mondrian: JDBC driver oracle.jdbc.OracleDriver loaded successfully
     [java] [0] ........................................
     [java] [40] ........................................
     [java] [80] ........................................
     [java] [120] ........................................
     [java] [160] ........................................
     [java] [200] ........................................
     [java] [240] ........................................
     [java] [280] ........................................
     [java] [320] ........................................
     [java] [360] ........................................
     [java] [400] ........................................
     [java] [440] ........................................
     [java] [480] ........................................
     [java] [520] ........................................
     [java] [560] ........................................
     [java] [600] ..................
     [java] OK (618 tests)
     [java] Time: 711.63
     [java] Normal termination.
BUILD SUCCESSFUL
Total time: 12 minutes 13 seconds

Create, deploy and start the web application

At the command prompt, type

ant war

This will create lib/mondrian.war. Copy mondrian.war to the TOMCAT_HOME/webapps directory.

Now, start Tomcat and hit http://localhost:8080/mondrian.

Checking in code 

Create a GitHub account

If you don't have one already, you can create a free GitHub account here.

Forking to your account

The first thing you need to do is fork the Pentaho repository into your GitHub account. This creates an exact copy of the Pentaho repo as it exists at the time of the fork in your personal GitHub space. This copy is not updated as the Pentaho repository gets updated, but we'll cover how to keep it updated later.

From the Mondrian repository page click the Fork button near the top right. Once you have done this, GitHub will redirect you to your newly forked repository.

Cloning a specific branch

Mondrian works on a single repository with multiple branches containing the different versions – past, released and in development. You should never be working against the master branch without permission from the Mondrian development team. Always work against the repository specific to the version you are developing for. Cloning the repository moves all the data and metadata from all branches to your local working folder, and you then checkout a specific branch locally to setup the file structure for that version.

First, clone the repository:

$ git clone https://github.com/[username]/mondrian.git
    Cloning into 'mondrian'...
    remote: Counting objects: 51661, done.
    remote: Compressing objects: 100% (9979/9979), done.
    remote: Total 51661 (delta 37833), reused 51512 (delta 37691)
    Receiving objects: 100% (51661/51661), 294.25 MiB | 604 KiB/s, done.
    Resolving deltas: 100% (37833/37833), done.

Now change into the newly created 'mondrian' folder and list the available branches:

$ git branch -a
    master
    remotes/origin/3.0
    remotes/origin/3.1
    remotes/origin/3.2
    remotes/origin/3.2.2
    remotes/origin/3.3.1
    remotes/origin/3.4
    remotes/origin/HEAD -> origin/master
    remotes/origin/lagunitas
    remotes/origin/master
    remotes/origin/pacino

And finally checkout the branch you want to work on:

$ git checkout 3.4
    Branch 3.4 set up to track remote branch 3.4 from origin.
    Switched to a new branch '3.4'

Adding upstream and local settings

In order to be able to keep your repository up-to-date with the Pentaho Mondrian repository, and to be able to merge your changes with changes made while you were developing your feature, we will add a new remote called 'upstream' that will point to the Pentaho repository directly.

$ git remote add upstream git://github.com/pentaho/mondrian.git

You also want to disable fast-forward during merges to preserve the entire commit history and properly track file changes.

$ git config --add merge.ff false

Note: If you have a git version prior to 1.7.6, this option will do nothing.

Your repository is now ready to develop against your selected branch.

Merging upstream changes

It is important during development that you keep your repository updated with any changes made to the Pentaho Mondrian repository. This not only ensures that you are always working with the most recent code available for your working branch, but also ensures that your changes do not break any new or updated tests.

To update and merge changes from the upstream repository, do the following:

$ git fetch upstream [branch]
$ git merge upstream/[branch]

Where [branch] is the current branch you're working on.

If you are using a version of git prior to 1.7.6, you need to add the ––no–ff flag in order to disable fast–forward merges:

$ git merge --no-ff upstream/[branch]

If there are any merge conflicts, git will let you know. Otherwise, your local repository is now up-to-date without losing any of your working changes.

This should always be the 2nd last step performed before issuing a pull request. The last step being, of course, running the tests again after the merge to ensure nothing is broken.

Preparing for a Pull Request

Before starting a pull request, please make sure the following criteria are met or your request may not be accepted and merged, or may take much longer to be merged into the Pentaho Mondrian repository.

  1. Make sure your change adheres to the coding guidelines. To verify that your contribution conforms to those standards, you can use the checkFile utility.
  2. Write a unit test for your change. (Or unit tests: the number of unit tests you write should be appropriate for the scale of your change.) The test should fail before you make the change, and succeed after it. We recommend a test-driven development process, where you write the test before you change the code. Unit tests are particularly important if you are fixing a bug.
  3. Run the regression suite, and make sure all tests pass. We don't expect you to run the suite in all configurations (DBMSes, operating systems, JDK versions, and parameter settings) but if your change affects something configuration-specific, be smart and test more than one configuration. For example, SQL generation is DBMS-specific, and file handling is OS-specific, but MDX function implementations are typically generic.
  4. If the change affects mondrian's user-visible behavior, update the documentation. For example, if you make a schema change, update schema.html.
  5. If your change affects a public API, discuss the change with mondrian developers first. We want to preserve backwards compatibility if possible, or at least clearly document the change in the release notes.
  6. Use JIRA case numbers in your commit messages. If your change fixes a bug, reference the bug number in your commit message, and reference the commit hash value and expected release number in the bug comments when closing the bug.

Generating a Pull Request

A pull request is the way GitHub manages the process of merging changes between forked repositories. Generating a pull request starts a conversation with the Pentaho Mondrian development team asking them to review the changes you've made, comment on them, and optionally choose to merge the changes into the main repository or return them to you for additional changes.

When you are ready to start a pull request, go to your personal Mondrian fork on GitHub and select the branch you want to be merged. Then click the Pull Request button near the top of the page.
pull request

You can then fill in a title and notes related to the pull request, and click the Send pull request button. The Mondrian development team will be notified of the pull request and will continue the process from there.

For a more detailed description of the entire pull request and commenting process, see Help.GitHub – Send pull requests

Coding guidelines 

If you are contributing code, please follow the same guidelines used for the rest of the code. ("When in Rome, do as the Romans do.")

Code content:

  • Declare variables as near to their first use as possible.
  • Don't initialize variables with 'dummy' values just to shut up the compiler.
  • One declaration per line is recommended.
  • Only one top-level class should be defined per java file.

Documentation and comments:

  • Source files must contain copyright and license notices.
  • Classes and public methods must have javadoc.
  • Write Javadoc comments on methods in the present active ('Collects garbage.'), not the imperative ('Collect garbage.'), passive ('Garbage is collected.'), or future active ('Will collect garbage.').
  • When editing HTML documents, please don't use an editor which reformats the HTML source (such as Microsoft Word).

Spacing and indentation:

  • Use spaces, not tabs.
  • Indentation 4.
  • Open braces on the same line as the preceding 'if', 'else', 'while' statement, or method or 'class' declaration.
  • Use braces even for single-line blocks.
  • Try to keep lines shorter than 80 characters.

The following images show my code style settings in IntelliJ. If you use IntelliJ, plug in these settings; if not, they should give you an idea of the code formatting policy.

Code formatting: General

Code formatting: Alignment and Braces

Code formatting: Wrapping

Code formatting: Spaces

The checkFile utility 

If the files you are submitting do not pass the checkFile utility, your pull request may be delayed or denied. It is recommended that you run checkFile locally before initiating a pull request. The utility is located in your git repository under the bin directory. https://github.com/pentaho/mondrian/tree/master/bin/checkFile The script requires cygwin to run on Windows.

Usage:


checkFile  [ <options> ] <file>...
    Checks a list of files.
checkFile  [ <options> ] --opened
    Checks all files that are opened in git. Implies --strict.
checkFile  [ <options> ] --under <dir>
    Recursively checks all files under a given directory.
checkFile --help
    Prints this help.

Options:
--lenient
    Does not apply rules to components which are not known to
    be in compliance.
--strict
    Stricter than usual; the opposite of lenient.

Learning more about Mondrian 

How Mondrian generates SQL 

If you're feeling mystified where the various SQL statements come from, here's a good way to learn more. Give it a try, and if you have more questions I'll be glad to answer them.

In a debugger, put a break point in the RolapUtil.executeQuery() method, and run a simple query. The easiest way to run a query is to run a junit testcase such as BasicQueryTest.testSample0(). The debugger will stop every time a SQL statement is executed, and you should be able to loop up the call stack to which component is executing the query.

I expect that you will see the following phases in the execution:

  • One or two SQL queries will be executed as the schema.xml file is read (validating calculated members and named sets, resolving default members of hierarchies, and such)
  • A few SQL queries will be executed to resolve members as the query is parsed. (For example, if a query uses [Store].[USA].[CA], it will look all members of the [Store Nation] level, then look up all children of the [USA] member.)
  • When the query is executed, the axes (slicer, columns, rows) are executed first. Expect to see more queries on dimension tables when expressions like [Product].children are evaluated.
  • Once the axes are populated, the cells are evaluated. Rather than executing a SQL query per cell, Mondrian makes a pass over all cells building a list of cells which are not in the cache. Then it builds and executes a SQL query to fetch all of those cells. If it didn't manage to fetch all cell values, it will repeat this step until it does.

Remember that the purpose of these queries is to populate cache. There are two caches. The dimension cache which maps a member to its children, e.g.

[Store].[All Stores] → { [Store].[USA], [Store].[Canada], [Store].[Mexico]}

The aggregation cache maps a tuple a measure value, e.g.

([Store].[USA], [Gender].[F], [Measures].[Unit Sales])123,456

Once the cache has been populated, the query won't be executed again. That's why I recommend that you restart the process each time you run this in the debugger.


Author: Julian Hyde; last updated August, 2011.
Version: $Id$ (log )
Copyright (C) 2005-2011 Pentaho


mondrian-3.11.0.1-R/doc/developer_notes.html000066400000000000000000001054301261646570300206060ustar00rootroot00000000000000 Pentaho Analysis Services: Developer Notes
Mondrian Developer Notes

Contents

  1. Logging Levels and Information
  2. Default aggregate table recognition rules
  3. Snowflakes and the DimensionUsage level attribute
  4. Memory Monitoring
  5. Implementing Roles
  6. Implementing Database Dialects

Logging Levels and Information 

Some of the Mondrian classes are instrumented with Apache Log4J Loggers. For some of these classes there are certain logging setting that provide information for not just the code developer but also for someone setting up a Mondrian installation. The following is a list of some of those log setting and the associated information.

Category
Level
Description
mondrian.rolap.aggmatcher.AggTableManager INFO A list of the RolapStar fact table names (aliases) and for each fact table, a list of all of its associated aggregate tables.
mondrian.rolap.aggmatcher.AggTableManager DEBUG A verbose output of all RolapStar fact tables, their measures columns, and dimension tables and columnns, along with all of each fact table's aggregate tables, columns and dimension tables.
mondrian.rolap.aggmatcher.DefaultDef DEBUG For each candidate aggregate table, the Matcher regular expressions for matching: table name and the fact count, foreign key, level and measure columns. Helpful in finding out why an aggregate table was not recognized.
mondrian.rolap.agg.AggregationManager DEBUG For each aggregate Sql query, if an aggregate table can be used to fulfill the query, which aggregate it was along with bitKeys and column names.
mondrian.rolap.RolapUtil DEBUG Prints out all Sql statements and their execution time. If one set the Mondrian property, mondrian.rolap.generate.formatted.sql to true, then the Sql is pretty printed (very nice).
mondrian.rolap.RolapConnection DEBUG Prints out each MDX query prior to its execution. (No pretty printing, sigh.)
mondrian.rolap.RolapSchema DEBUG Prints out each Rolap Schema as it is being loaded.

There are more classes with logging, but their logging is at a lower, more detailed level of more use to code developers.

Log levels can be set in either a log4j.properties file or log4j.xml file. You have to make sure you tell Mondrian which one to use. For the log4j.properties, entries might look like:

log4j.category.mondrian.rolap.RolapConnection=DEBUG
log4j.category.mondrian.rolap.RolapUtil=DEBUG

while for the log4.xml:

<category name="mondrian.rolap.RolapConnection">
   <priority value="DEBUG"/>
</category>
<category name="mondrian.rolap.RolapUtil">
   <priority value="DEBUG"/>
</category>

Default aggregate table recognition rules 

The default Mondrian rules for recognizing aggregate tables are specified by creating an instance of the rule schema found in the file: MONDRIAN_HOME/src/main/rolap/aggmatcher/DefaultRulesSchema.xml. The instance of this schema that is built into the mondrian.jar after a build is in the same directory, MONDRIAN_HOME/src/main/rolap/aggmatcher/DefaultRules.xml.

There are six different default rules that are used to match and map a candidate aggregate table: table name, ignore column, fact count column, foreign key column, level column and measure column. All of these rules are defined by creating an instance of the DefaultRulesSchema.xml grammar. The DefaultRulesSchema.xml instance, the DefaultRules.xml file mentioned above, that by default is built as part of the mondrian.jar does not contain an ignore column rule. This grammar has base/supporting classes that are common to the above rules. In XOM terms, these are classes and super classes of the rule elements.

The first XOM class dealing with matching is the CaseMatcher class. This has an attribute "charcase" that takes the legal values of

"ignore" (default)
"exact"
"upper"
"lower"

When the value of the attribute is "ignore", then the regular expression formed by an element extending the CaseMatcher class will be case independent for both any parameters used to instantiate the regular expression template as well as for the text in the post-instantiated regular expression. On the other hand, when the "charcase" attribute take any of the other three values, it is only the parameter values themselves that are "exact", unchanged, "lower", converted to lower case, or "upper", converted to upper case.

The class NameMatcher extends the CaseMatcher class. This class has pre-template and post-template attributes whose default values is the empty string. These attributes are prepended/appended to a parameter to generate a regular expression. As an example, the TableMatcher element extends NameMatcher class. The parameter in this case is the fact table name and the regular expression would be:

pre-template-attribute${fact_table_name}post-template-attribute

For Mondrian, the builtin rule has the pre template value "agg_.+_" and the post template attribute value is the default so the regular expression becomes:

agg_.+_${fact_table_name}

Also, the NameMatcher has an attribute called basename which is optional. If set, then its value must be a regular expression with a single capture group. A capture group is an regular expression component surrounded by "(" and ")". As an example, "(.*)" is a capture group and if this was the total regular expression, then it would match anything and the single capture would match the same. On the other hand if the total regular expression was "RF_(.*)_TBL", then a name such as "RF_SHIPPMENTS_TBL" would match the regular expression while the capture group would be "SHIPPMENTS". Now, if the basename attribute is defined, then it is applied to each fact table name allowing one to strip away information and get to the "base" name. This might be needed because a DBA might prepend or append a tag to all of your fact table names and the DBA might wish to have a different tag prepend or append to all of your aggregate table names (RF_SHIPPMENTS_TBL as the fact table and RA_SHIPPMENTS_AGG_14 as an example aggregate name (the DBA prepended the "RA_" and you appended the "_AGG_14")).

Both the FactCountMatch and ForeignKeyMatch elements also extend the NameMatcher class. In these cases, the builtin Mondrian rule has no pre or post template attribute values, no regular expression, The FactCountMatch takes no other parameter from the fact table (the fact table does not have a fact count column) rather it takes a fact count attribute with default value "fact_count", and this is used to create the regular expression. For the ForeignKeyMatch matcher, its the fact table's foreign key that is used as the regular expression.

The ignore, asdf level and measure column matching elements have one or more Regex child elements. These allow for specifying multiple possible matches (if any match, then its a match). The IgnoreMap, LevelMap and MeasureMap elements extend the RegexMapper which holds an array of Regex elements. The Regex element extends CaseMatcher It has two attributes, space with default value '_' which says how space characters should be mapped, and dot with default value '_' which says how '.' characters should be mapped. If a name were the string "Unit Sales.Case" then (with the default values for the space and dot attributes and with CaseMatcher mapping to lower case ) this would become "unit_sales_case".

The IgnoreMap element has NO template parameter names. Each Regex value is simply a regular expression. As an example (Mondrian by default does not include an IgnoreMap by default), a regular expression that matches all aggregate table columns then end with '_DO_NOT_USE' would be:

.*_DO_NOT_USE

One might want to use an IgnoreMap element to filter out aggregate columns if, for example, the aggregate table is a materialized view, since with each "normal" column of such a materialized view there is an associated support column used by the database which has no significance to Mondrian. In the process of recognizing aggregate tables, Mondrian logs a warning message for each column whose use can not be determined. Materialized views have so many of these support columns that if, in fact, there was a column whose use was desired but was not recognized (for instance, the column name is misspelt) all of the materialized view column warning message mask the one warning message that one really needs to see.

The IgnoreMap regular expressions are applied before any of the other column matching actions. If one sets the IgnoreMap regular expression to, for example,

.*

then all columns are marked as "ignore" and there are no other columns left to match anything else. One must be very careful when choosing IgnoreMap regular expressions not just for your current columns but for columns that might be created in the future. Its best to document this usage in your organization.

The following is what the element might look like in a DefaultRules.xml file:

    <IgnoreMap id="ixx" >
      <Regex id="physical" charcase="ignore">
          .*_DO_NOT_USE
      </Regex>
    </IgnoreMap>

The LevelMap element has the four template parameter names (hardcoded):

hierarchy_name
level_name
level_column_name
usage_prefix

These are names that can be used in creating template regular expressions. The builtin Mondrian default rules for level matching defines three Regex child elements for the LevelMap element. These define the template regular expressions:

${hierarchy_name}_${level_name}
${hierarchy_name}_${level_column_name}
${usage_prefix}${level_column_name}
${level_column_name}

Mondrian while attempting to match a candidate aggregate table against a particular fact table, iterates through the fact table's cube's hierarchy name, level name and level colum names looking for matches.

The MeasureMap element has the three template parameter names (hardcoded):

measure_name
measure_column_name
aggregate_name

which can appear in template regular expressions. The builtin Mondrian default rules for measure matching defines three Regex child elements for the MeasureMap element. These are

${measure_name}
${measure_column_name}
${measure_column_name}_${aggregate_name}

and Mondrian attempts to match a candidate aggregate table's column names against these as it iterators over a fact table's measures.

A grouping of FactCountMatch , ForeignKeyMatch , TableMatcher , LevelMap , and MeasureMap make up a AggRule element, a rule set. Each AggRule has a tag attribute which is a unique identifier for the rule. There can be multiple AggRule elements in the outer AggRules element. Each AggRule having its own tag attribute. When Mondrian runs, it selects (via the mondrian.rolap.aggregates.rule.tag property) which rule set to use.

One last wrinkle, within a AggRule the FactCountMatch , ForeignKeyMatch , TableMatcher , LevelMap , and MeasureMap child elements can be either defined explicitly within the AggRule element or by reference FactCountMatchRef , ForeignKeyMatchRef , TableMatcherRef , LevelMapRef , and MeasureMapRef The references are defined as child elements of the top level AggRules element. With references the same rule element can be used by more than one AggRule (code reuse).

Below is an example of a default rule set with rather different matching rules.

<AggRules tag="your_mamas_dot_com">
  <AggRule tag="default" >
    <FactCountMatch id="fca" factCountName="FACT_TABLE_COUNT"
      charcase="exact" />
    <ForeignKeyMatch id="fka" pretemplate="agg_" />
    <TableMatch id="ta" pretemplate="agg_" posttemplate="_.+"/>
    <LevelMap id="lxx" >
      <Regex id="logical" charcase="ignore" space="_" dot="_">
          ${hierarchy_name}_${level_name}
      </Regex>
      <Regex id="mixed" charcase="ignore" >
          ${hierarchy_name}_${level_name}_${level_column_name}
      </Regex>
      <Regex id="mixed" charcase="ignore" >
          ${hierarchy_name}_${level_column_name}
      </Regex>
      <Regex id="usage" charcase="exact" >
          ${usage_prefix}${level_column_name}
      </Regex>
      <Regex id="physical" charcase="exact" >
          ${level_column_name}_.+
      </Regex>
    </LevelMap>
    <MeasureMap id="mxx" >
      <Regex id="one" charcase="lower" >
          ${measure_name}(_${measure_column_name}(_${aggregate_name})?)?
      </Regex>
      <Regex id="two" charcase="exact" >
        ${measure_column_name}(_${aggregate_name})?
      </Regex>
    </MeasureMap>
  </AggRule>
</AggRules>

First, all fact count columns must be called FACT_TABLE_COUNT exactly, no ignoring case. Next, foreign key columns match the regular expression

agg_${foreign_key_name}

that is, the fact table foreign key column name with "agg_" prepened such as agg_time_id . The aggregate table names match the regular expression

agg_${fact_table_name}_.+

For the FoodMart sales_fact_1997 fact table, an aggregate could be named,

agg_sales_fact_1997_01
agg_sales_fact_1997_lost_time_id
agg_sales_fact_1997_top

If the hierarchy, level and level column names were:

hierarchy_name="Sales Location"
level_name="State"
level_column_name="state_location"
usage_prefix=null

then the following aggregate table column names would be recognizing as level column names:

SALES_LOCATION_STATE
Sales_Location_State_state_location
state_location_level.

If in the schema file the DimensionUsage for the hierarchy had a usagePrefix attribute,

usage_prefix="foo_"

then with the above level and level column names and usage_prefix the following aggregate table column names would be recognizing as level column names:

SALES_LOCATION_STATE
Sales_Location_State_state_location
state_location_level.
foo_state_location.

In the case of matching measure columns, if the measure template parameters have the following values:

measure_name="Unit Sales"
measure_column_name="m1"
aggregate_name="Avg"

then possible aggregate columns that could match are:

unit_sales_m1
unit_sales_m1_avg
m1
m1_avg

The intent of the above example default rule set is not that they are necessarily realistic or usable, rather, it just shows what is possible.

Snowflakes and the DimensionUsage level attribute 

Mondrian supports dimensions with all of their levels lumped into a single table (with all the duplication of data that that entails), but also snowflakes. A snowflake dimension is one where the fact table joins to one table (generally the lowest) and that table then joins to a table representing the next highest level, and so on until the top level's table is reached. For each level there is a separate table.

As an example snowflake, below is a set of Time levels and four possible join element blocks, relationships between the tables making up the Time dimension. (In a schema file, the levels must appear after the joins.)

<Level name="Calendar Year" table="TimeYear" column="YEAR_SID"
  nameColumn="YEAR_NAME" levelType="TimeYears" uniqueMembers="true"/>
<Level name="Quarter" table="TimeQtr" column="QTR_SID"
  nameColumn="QTR_NAME" levelType="TimeQuarters" uniqueMembers="true"/>
<Level name="Month" table="TimeMonth" column="MONTH_SID"
  nameColumn="MONTH_ONLY_NAME" levelType="TimeMonths" uniqueMembers="false"/>
<Level name="Day" table="TimeDay" column="DAY_SID" nameColumn="DAY_NAME"
  levelType="TimeDays" uniqueMembers="true"/>


  <Join leftAlias="TimeYear" leftKey="YEAR_SID"
        rightAlias="TimeQtr" rightKey="YEAR_SID" >
    <Table name="RD_PERIOD_YEAR" alias="TimeYear" />
    <Join leftAlias="TimeQtr" leftKey="QTR_SID"
        rightAlias="TimeMonth" rightKey="QTR_SID" >
        <Table name="RD_PERIOD_QTR" alias="TimeQtr" />
        <Join leftAlias="TimeMonth" leftKey="MONTH_SID"
            rightAlias="TimeDay" rightKey="MONTH_SID" >
            <Table name="RD_PERIOD_MONTH" alias="TimeMonth" />
            <Table name="RD_PERIOD_DAY" alias="TimeDay" />
        </Join>
    </Join>
  </Join>

  <Join leftAlias="TimeQtr" leftKey="YEAR_SID"
        rightAlias="TimeYear" rightKey="YEAR_SID" >
    <Join leftAlias="TimeMonth" leftKey="QTR_SID"
        rightAlias="TimeQtr" rightKey="QTR_SID" >
        <Join leftAlias="TimeDay" leftKey="MONTH_SID"
            rightAlias="TimeMonth" rightKey="MONTH_SID" >
            <Table name="RD_PERIOD_DAY" alias="TimeDay" />
            <Table name="RD_PERIOD_MONTH" alias="TimeMonth" />
        </Join>
        <Table name="RD_PERIOD_QTR" alias="TimeQtr" />
    </Join>
    <Table name="RD_PERIOD_YEAR" alias="TimeYear" />
  </Join>

  <Join leftAlias="TimeMonth" leftKey="MONTH_SID"
        rightAlias="TimeDay" rightKey="MONTH_SID" >
    <Join leftAlias="TimeQtr" leftKey="QTR_SID"
        rightAlias="TimeMonth" rightKey="QTR_SID" >
        <Join leftAlias="TimeYear" leftKey="YEAR_SID"
            rightAlias="TimeQtr" rightKey="YEAR_SID" >
            <Table name="RD_PERIOD_YEAR" alias="TimeYear" />
            <Table name="RD_PERIOD_QTR" alias="TimeQtr" />
        </Join>
        <Table name="RD_PERIOD_MONTH" alias="TimeMonth" />
    </Join>
    <Table name="RD_PERIOD_DAY" alias="TimeDay" />
  </Join>

  <Join leftAlias="TimeDay" leftKey="MONTH_SID"
        rightAlias="TimeMonth" rightKey="MONTH_SID" >
    <Table name="RD_PERIOD_DAY" alias="TimeDay" />
    <Join leftAlias="TimeMonth" leftKey="QTR_SID"
        rightAlias="TimeQtr" rightKey="QTR_SID" >
        <Table name="RD_PERIOD_MONTH" alias="TimeMonth" />
        <Join leftAlias="TimeQtr" leftKey="YEAR_SID"
            rightAlias="TimeYear" rightKey="YEAR_SID" >
            <Table name="RD_PERIOD_QTR" alias="TimeQtr" />
            <Table name="RD_PERIOD_YEAR" alias="TimeYear" />
        </Join>
    </Join>
  </Join>

Viewed as trees these can be represented as follows:

            |
    ---------------
    |             |
   Year     --------------
            |            |
         Quarter     ---------
                     |       |
                   Month    Day

                  |
           ----------------
           |              |
        --------------   Year
        |            |
    ---------     Quarter
    |       |
   Day     Month

                  |
           ----------------
           |              |
        --------------   Day
        |            |
    ---------      Month
    |       |
   Year   Quarter

            |
    ---------------
    |             |
   Day      --------------
            |            |
          Month      ---------
                     |       |
                   Quarter  Year

It turns out that these join block are equivalent; what table joins to what other table using what keys. In addition, they are all (now) treated the same by Mondrian. The last join block is the canonical representation; left side components are levels of greater depth than right side components, and components of greater depth are higher in the join tree than those of lower depth:

            |
    ---------------
    |             |
   Day      --------------
            |            |
          Month      ---------
                     |       |
                   Quarter  Year

Mondrian reorders these join blocks into the canonical form and uses that to build subtables in the RolapStar.

In addition, if a cube had a DimensionUsage of this Time dimension with, for example, its level attribute set to Month, then the above tree is pruned

              |
        --------------
        |            |
      Month      ---------
                 |       |
               Quarter  Year

and the pruned tree is what is used to create the subtables in the RolapStar. Of course, the fact table must, in this case, have a MONTH_SID foreign key.

Note that the Level element's table attribute MUST use the table alias and NOT the table name.

Memory monitoring, Java5 and memory usage 

With Java5, developers using its memory monitoring capabilities need to make sure the code they create will best use this new feature. In particular, if a given algorithm which uses significant memory is surrounded by block in which a MemoryMonitor.Listener has been registered with the MemoryMonitor, then the code must periodically check if a memory notification has occurred. If the algorithm has long stretches of allocating memory for data structures that will exist throughout the life-time of the algorithm's execution during which it does not check for memory notifications, then it is possible that an OutOfMemoryError could still occur. You can see for the ResultSet object where, basically, all memory is created in its constructor, throughout the Member determination and value evaluation code, the Query object's checkCancelOrTimeout method is called repeatedly.

The Java5 memory management mechanism is not fool proof, so to speak. If one, as an example, attempts to allocate a very big array, an OutOfMemoryError will occur. This technique works best when memory is allocated incrementally between checks for memory notifications allowing the developer to take steps before a possible OOME gotterdammerung.

One last issue, if a developer needs to embed Mondrian in a Web or Application server and the server has its own way of dealing with Java5 memory notification system, then it is important that Mondrian be a good application citizen in the server. It is much like the use of JAAS in an application. A JVM allows for a single JAAS instance and most servers register their mechanism with the JVM. It is bad for the application in the server to use its own JAAS rather than register with the server's. So, if Mondrian is in a Web or Application server that has its own dealings with the Java5 memory notification system and the server expects applications to use its mechanism, then the developer must create an instance of the MemoryManager interface that communicates the Webserver/Appserver mechanism and uses a System property to instruct the MemoryManagerFactory to create that specialized version.

Implementing Roles 

The developer can create their own Roles by implementing the Role interface or by taking an existing Role instance and wrapping it in an object derived from and overriding some of the methods of the DelegatingRole and DelegatingRole.HierarchyAccess classes. In both cases, some care must be taken not to stray too far from the semantics of the default Mondrian Role implementation, the RoleImpl class.

When implementing one's own Role the Role interface has methods that return an Access object for Schema, Cube, Dimension, Hierarchy, Level, Member and NamedSet all of which must have implementations. One reason one might wish to create one's own Role implementations is to avoid defining Roles in the Schema definition. This allows the Mondrian container to dynamically generate new Roles while using the same Schema definitio nand, therefore, the same in-memory caches associated with that Schema object. Such Roles do not need to be registered with the Schema object; they are associated with the Connection. Another reason one might wish to implement one's own Roles is that there might be an existing permission system and, rather than have duplicate information: in the permission system and the Schema definition, one simply creates Roles based upon permission system information.

If one wishes simply to alter or extend the semantics of the existing Role implementation, the RoleImpl class, then using the DelegatingRole class is a reasonably utilitarian approach. This requires that one create a Role implementation derived from the DelegatingRole class, in the Mondrian container call the Schema.lookupRole(String) method to get the Role whose semantics are to be modified, create an instance of the Role derived from the DelegatingRole that wraps the underlying Role, and, finally, set the Connection's Role by calling Connection.setRole(Role) with this wrapping Role.

The following code is an example where the underlying Role is wrapped in a class that extends the DelegatingRole class. Here, the user has no access to the store where "Joe Bob" is the manager.

public class RoleExample extends DelegatingRole {
  .....
  public static class HierarchyAccessExample
    extends DelegatingRole.HierarchyAccess {
    .....
    public Access getAccess(Member member) {
      Access access = hierarchyAccess.getAccess(member);
      return getAccess(member, access);
    }
  .....
  }
  .....
  public Access getAccess(Member member) {
    Access access = role.getAccess(member);
    return getAccess(member, access);
  }
  .....
  // no one see's information about the store where "Joe Bob" is manager.
  protected Access getAccess(Member member, Access access) {
    final String storeNamelevel =
      "[Store].[Store Country].[Store State].[Store City].[Store Name]";
    if (member.getLevel().getUniqueName().equals(storeNamelevel)) {
      Object o = member.getProperty("Store Manager");
      return (o != null && o.equals("Joe Bob")) ? Access.NONE : access;
    } else {
      return access;
    }
  }
}

In this case, special care must be taken if one over rides one of the methods that yield a Member's Access. This is because there are two such methods. The first is in the Role itself Role.getAccess(Member) and the second is Role.HierarchyAccess.getAccess(Member). Internally, Mondrian is certain code paths calls one of the methods while in other code paths it calls the other, thus they should be overridden in a consistent manner.

Implementing support for new databases 

Mondrian supports many different databases - see Install instructions.

Mondrian can work on almost any JDBC data source, so even if your database doesn't appear in the above list, give it a try. Mondrian can generally figure out the capabilities of the database from the JDBC driver, and generate SQL accordingly. If your database's SQL has a syntax that Mondrian does not generate correctly, you will need to add a Dialect for it.

To add a dialect, you will need to do the following:

  • Implement a class that implements mondrian.spi.Dialect. It is suggested that you subclass mondrian.spi.impl.JdbcDialectImpl. There are existing dialect implementations you can refer to in the mondrian.spi.impl package. Check out the Javadoc for mondrian.spi.Dialect and mondrian.spi.impl.JdbcDialectImpl.
  • Create a JAR containing:
    • your dialect implementation class(es)
    • a text file META-INF/services/mondrian.spi.Dialect. This file must contain the names of the Dialect class(es), one per line.
  • Put this JAR on the classpath.

If the database dialect has been named to the Mondrian schema DTD, you can add custom SQL in your schema for the dialect. Otherwise, your dialect will be classiifed as UNKNOWN, so if you have custom SQL for your database, you would insert the SQL into as an "unknown" dialect, like:

<NameExpression>
    <SQL dialect="unknown">
"fname" || ' ' || "lname"
    </SQL>
</NameExpression>

If you want your database to be a "known" database in the Mondrian schema, you will need to:

  • Add to the DatabaseProduct enum in the mondrian.spi.Dialect interface.
  • Update the static method mondrian.spi.impl.JdbcDialectImpl.getProduct to detect the DatabaseProduct for your Dialect.
  • Update src/main/META-INF/services/mondrian.spi.Dialect with the dialect class name.
  • Update the documentation in the src/main/mondrian/olap/Mondrian.xml with the new dialect name to appear in the schema. This has to match the entry (in lower case) you added to the DatabaseProduct enum above.
  • Add a section in testsrc/main/mondrian/test/DialectTest.testDialectVsDatabaseProduct() to check the detection of the DatabaseProduct.

Author: Julian Hyde, Richard Emberson, Sherman Wood; last updated April, 2009.
Version: $Id$ (log)
Copyright (C) 2005-2009 Pentaho and others


mondrian-3.11.0.1-R/doc/doc2web.sh000077500000000000000000000123201261646570300164020ustar00rootroot00000000000000#!/bin/bash # # This software is subject to the terms of the Eclipse Public License v1.0 # Agreement, available at the following URL: # http://www.eclipse.org/legal/epl-v10.html. # You must accept the terms of that agreement to use this software. # # Copyright (C) 2005-2011 Pentaho # All Rights Reserved. # # Converts documentation from Mondrian's source format to Pentaho's web site. # # The file structure looks like this: # content/ # en/ # documentation/ # install_doc.htm (copy of install.html) # es/ # documentation/ # install_doc.htm (copy of install_es.html) # images/ # arch_mondrian_v1_tn.png # (etc.) # api/ # index.html # overview.html # mondrian/ # olap/ # Connection.html (javadoc for mondrian.olap.Connection) # (etc.) pause() { xmessage Continue... } beep() { echo x | tr x \\007 } doHtml() { # LOCALE="en" LOCALE="$1" # SRCFILE="aggregate_tables.html" SRCFILE="$2" # DSTFILE="content/en/documentation/aggregate_tables_doc.htm" DSTFILE=content/${LOCALE}/documentation/$(echo $SRCFILE|sed -e s/.html$/_doc.htm/) if [ "$LOCALE" != "en" ]; then SRCFILE=$(echo $SRCFILE | sed -e "s/\.html/_${LOCALE}.html/") fi mkdir -p content/${LOCALE}/documentation echo :: copy $SRCFILE to $DSTFILE case "$SRCFILE" in xml_schema.html) cp "$SRCFILE" "$DSTFILE";; *) cat "$SRCFILE" | awk ' /doc2web start/ {++x;next;} /doc2web end/ {++x;next;} {if (x == 1) print;} ' >"$DSTFILE";; esac n=$(awk '/doc2web include/ {print FNR; exit}' $DSTFILE) if [ "$n" ]; then mv $DSTFILE /tmp/$$ ( head --lines=$(expr $n - 1) /tmp/$$ cat properties.html tail --lines=+$(expr $n + 1) /tmp/$$ rm /tmp/$$ ) > $DSTFILE fi } doImg() { test -f "$1" || echo "Image '$1' not found" } ROOT=$(cd $(dirname $0); pwd -P) cd $ROOT site=changeme@mondrian.pentaho.com javadoc=true scp=true deploy=true headJavadoc=false # Remove output from previous run. rm -rf content # Build javadoc. if $javadoc; then ( cd $ROOT/.. rm -rf doc/api mkdir -p doc/api ant javadoc-with-ydoc xml_schema ) fi # Create, copy and deploy javadoc for the head revision. if $headJavadoc; then if $javadoc; then rm -f headJavadoc.tar.gz rm -rf headapi mv api headapi tar -cvz -f headJavadoc.tar.gz headapi fi if $scp; then pause rsync -aPr -e 'ssh -oConnectTimeout=300' headJavadoc.tar.gz ${site}:httpdocs fi if $deploy; then pause ssh -oConnectTimeout=300 ${site} < Pentaho Analysis Services: Embedding Mondrian
Embedding Mondrian in a Java Application

By Will Gorman; last updated April, 2007.


This document shows a simple example of embedding mondrian in a java application. The steps include downloading Mondrian, installing a database, writing a simple application, compiling the application, and running the application.

Setting up the Environment 

First, you need to download mondrian. You can get the latest release from SourceForge.

Download the Latest Release 

Download the latest mondrian-version.zip from SourceForge, and unzip. Now find the mondrian-version-src.zip inside this distribution, and unzip it within the mondrian binary distribution under the "src" directory.

Installing the Database 

Before you run this simple example, you must install the standard FoodMart dataset. This is described in the installation guide.

The Source Code 

Here is a simple example of embedding mondrian in a java class. A connection is retrieved, a query is generated and finally the query is executed. Open the file SimpleEmbeddedExample.java in the main Mondrian directory and paste the contents below.

import mondrian.olap.*;
import java.io.*;

public class SimpleEmbeddedExample {

  public static void main(String args[]) {

    // First, set up a valid connection string
    String connStr = "Provider=mondrian;" +
                     "Catalog=demo/FoodMart.xml;" +
                     "JdbcDrivers=com.mysql.jdbc.Driver;" +
                     "Jdbc=jdbc:mysql://localhost/foodmart?user=foodmart&password=foodmart;" +
                     "jdbcUser=foodmart;" +
                     "jdbcPassword=foodmart";

    // Second, set up a valid query string
    String queryStr = "select " +
                      "{[Measures].[Unit Sales]} on columns, " +
                      "{[Store].[All Stores]} on rows " +
                      "from [Sales]";

    // Third, retrieve a connection from the DriveManager
    Connection connection = DriverManager.getConnection(connStr, null, true);

    // Fourth, generate a MDX Query object
    Query query = connection.parseQuery(queryStr);

    // Fifth, execute the query
    Result result = connection.execute(query);

    // Finally, print out the result
    StringWriter sw = new StringWriter();
    PrintWriter pw = new PrintWriter(sw);
    result.print(pw);
    pw.flush();
    System.out.println(sw.toString());
  }

}

Note that you should replace the specific jdbc information with your own JDBC connection properties.

Compiling the Example  

To compile this example via the command line:

javac -cp "lib/mondrian.jar" SimpleEmbeddedExample.java

Running the Example  

Below is the java command line that will execute the SimpleEmbeddedExample class. Note that you must replace $JDBC_DRIVER_JAR_LOCATION with the correct path to your specific JDBC driver.

java -cp ".:src/lib/log4j-1.2.9.jar:src/lib/commons-dbcp.jar:src/lib/commons-pool.jar:src/lib/commons-collections.jar
:src/lib/commons-vfs.jar:src/lib/commons-logging.jar:src/lib/commons-math-1.0.jar:src/lib/javacup.jar
:src/lib/eigenbase-resgen.jar:src/lib/eigenbase-properties.jar:src/lib/eigenbase-xom.jar:lib/mondrian.jar
:$JDBC_DRIVER_JAR_LOCATION" SimpleEmbeddedExample

You should see this output:

log4j:WARN No appenders could be found for logger (mondrian.olap.MondrianProperties).
log4j:WARN Please initialize the log4j system properly.
Axis #0:
{}
Axis #1:
{[Measures].[Unit Sales]}
Axis #2:
{[Store].[All Stores]}
Row #0: 266,773

View Mondrian's API for more details on traversing the Result object.


Author: Will Gorman; last updated April, 2007.
Version: $Id$ (log )
Copyright (C) 2005-2007 Pentaho


mondrian-3.11.0.1-R/doc/embedding_mondrian_olap4j.html000066400000000000000000000214341261646570300224700ustar00rootroot00000000000000 Pentaho Analysis Services: Embedding Mondrian
Embedding Mondrian in a Java Application

By Will Gorman; last updated January, 2008.


This document shows a simple example of embedding mondrian in a java application. The steps include downloading Mondrian, installing a database, writing a simple application, compiling the application, and running the application.

Starting with Mondrian 3.0, we now use the olap4j standard APIs. Please visit http://www.olap4j.org for more documentation.

Setting up the Environment 

First, you need to download mondrian. You can get the latest release from SourceForge.

Download the Latest Release 

Download the latest mondrian-version.zip from SourceForge, and unzip. Now find the mondrian-version-src.zip inside this distribution, and unzip it within the mondrian binary distribution under the "src" directory.

Installing the Database 

Before you run this simple example, you must install the standard FoodMart dataset. This is described in the installation guide.

The Source Code 

Here is a simple example of embedding mondrian in a java class. A connection is retrieved, and a query is executed. Open the file SimpleEmbeddedExample.java in the main Mondrian directory and paste the contents below.

import java.util.*;
import java.sql.*;
import org.olap4j.*;
import org.olap4j.metadata.*;

public class SimpleEmbeddedExample {

  public static void main(String args[]) throws Exception {

    // First, set up a valid connection string
    String connStr = "jdbc:mondrian:" +
                     "Catalog=demo/FoodMart.xml;" +
                     "JdbcDrivers=com.mysql.jdbc.Driver;" +
                     "Jdbc=jdbc:mysql://localhost/foodmart?user=foodmart&password=foodmart";

    // Second, set up a valid query string
    String queryStr = "select " +
                      "{[Measures].[Unit Sales]} on columns, " +
                      "{[Store].[All Stores]} on rows " +
                      "from [Sales]";

    // Third, retrieve a connection from the DriverManager
    Class.forName("mondrian.olap4j.MondrianOlap4jDriver");
    Connection jdbcConn =
       DriverManager.getConnection(connStr, new Properties());
    OlapConnection connection =
       ((OlapWrapper) jdbcConn).unwrap(OlapConnection.class);

    // Fourth, execute the MDX Query
    OlapStatement olapStatement = connection.createStatement();
    CellSet cellSet = olapStatement.executeOlapQuery(queryStr);

    // Fifth, display the Axes
    for (CellSetAxis axis : cellSet.getAxes()) {
        System.out.print(axis.getAxisOrdinal() + ": ");
        boolean firstPos = true;
        for (Position position : axis.getPositions()) {
            if (!firstPos) {
                System.out.print(", ");
            }
            System.out.print("{");
            boolean first = true;
            for (Member member : position.getMembers()) {
                if (!first) {
                    System.out.print(", ");
                }
                System.out.print(member.getUniqueName());
                first = false;
            }
            System.out.print("}");
            firstPos = false;
        }
        System.out.println("");
    }

    // Finally, display the Cells
    CellSetAxis cols = cellSet.getAxes().get(0);
    CellSetAxis rows = cellSet.getAxes().get(1);
    for (int row = 0; row < rows.getPositions().size(); row++) {
        System.out.println("Row #" + (row + 1) + ":");
        for (int col = 0; col < cols.getPositions().size(); col++) {
            List positions = new ArrayList(2);
            positions.add(col);
            positions.add(row);
            Cell cell = cellSet.getCell(positions);
            System.out.println(cell.getFormattedValue());
        }
    }
  }

}

Note that you should replace the specific jdbc information with your own JDBC connection properties.

Compiling the Example  

To compile this example via the command line:

javac -cp "src/lib/olap4j.jar" SimpleEmbeddedExample.java

Running the Example  

Below is the java command line that will execute the SimpleEmbeddedExample class. Note that you must replace $JDBC_DRIVER_JAR_LOCATION with the correct path to your specific JDBC driver.

java -cp ".:src/lib/olap4j.jar:src/lib/log4j-1.2.9.jar:src/lib/commons-dbcp.jar:src/lib/commons-pool.jar:src/lib/commons-collections.jar
:src/lib/commons-vfs.jar:src/lib/commons-logging.jar:src/lib/commons-math-1.0.jar:src/lib/javacup.jar
:src/lib/eigenbase-resgen.jar:src/lib/eigenbase-properties.jar:src/lib/eigenbase-xom.jar:lib/mondrian.jar
:$JDBC_DRIVER_JAR_LOCATION" SimpleEmbeddedExample

You should see this output:

log4j:WARN No appenders could be found for logger (mondrian.olap.MondrianProperties).
log4j:WARN Please initialize the log4j system properly.
COLUMNS: {[Measures].[Unit Sales]}
ROWS: {[Store].[All Stores]}
Row #1:
266,773

Author: Will Gorman; last updated April, 2007.
Version: $Id$ (log )
Copyright (C) 2005-2009 Pentaho


mondrian-3.11.0.1-R/doc/faq.html000066400000000000000000000551621261646570300161660ustar00rootroot00000000000000 Pentaho Analysis Services: Mondrian FAQs
Mondrian FAQs
  1. How do I use Mondrian in my application?
  2. What API does Mondrian use?
  3. How does Mondrian's dialect of MDX differ from Microsoft Analysis Services?
  4. How can Mondrian be extended?
  5. Can Mondrian handle large datasets?
  6. How do I enable tracing?
  7. What is the syntax of a Mondrian connect string?
  8. Where is Mondrian going in the future?
  9. Where can I find out more? (Further reading)
  10. Mondrian is wonderful! How can I possibly thank you?
  11. Modeling
    1. Measures not in the fact table
    2. How can I define my fact table based on an arbitrary SQL statement?
    3. Why can't Mondrian find my tables?
  12. Build/install
    1. I get compilation errors? Why is this?
  13. Performance
    1. When I change the data in the RDBMS, the result doesn't change even if i refresh the browser. Why is this?
    2. Tuning the Aggregate function
  14. Perforce
  15. Development environment
  16. More information, documentation, ...
  17. Becoming a developer

1. How do I use Mondrian in my application? 

There are several ways. If you have a fixed set of queries which you'd like to display as HTML tables, use the tab library. webapp/taglib.jsp is an example of this.

The JPivot project (http://jpivot.sourceforge.net) is a JSP-based pivot table, and will allow you to dynamically explore a dataset over the web. It replaces the prototype pivot table webapp/morph.jsp.

Pentaho Analysis Tool is an AJAX-based client.

You could also build a pivot table in a client technology such as Swing.

2. What API does Mondrian use? 

Mondrian's main API is olap4j., an extension to JDBC for OLAP applications.

Mondrian also has a provider for XML for Analysis.

Historically, Mondrian had its own API, consisting of classes in the mondrian.olap package. That API has been deprecated since mondrian-3.0, and may change or be removed without warning in future versions. JPivot still uses it.

3. How does Mondrian's dialect of MDX differ from Microsoft Analysis Services? 

See MDX language specification.

Not very much.

  1. The StrToSet() and StrToTuple() functions take an extra parameter.
  2. Parsing is case-sensitive.
  3. Pseudo-functions Param() and ParamRef() allow you to create parameterized MDX statements.

4. How can Mondrian be extended? 

todo: User-defined functions

todo: Cell readers

todo: Member readers

5. Can Mondrian handle large datasets? 

Yes, if your RDBMS can. We delegate the aggregation to the RDBMS, and if your RDBMS happens to have materialized group by views created, your query will fly. And the next time you run the same or a similar query, that will really fly, because the results will be in the aggregation cache.

6. How do I enable tracing? 

See Configuring log4j within Mondrian's environment.

7. What is the syntax of a Mondrian connect string? 

The syntax of the connect string is described in the Configuration guide.

8. Where is Mondrian going in the future? 

We have a roadmap of planned and not-yet-planned features.

9. Where can I find out more? 

Recommended books:

Microsoft Analysis Services has excellent online documentation of MDX, including a list of MDX functions.

10. Mondrian is wonderful! How can I possibly thank you? 

We'd love to hear what you liked and didn't like about it. Post questions and comments to the forum. If you can think of ways that Mondrian can be improved, roll up your sleeves and help make it better!

If you modify Mondrian's source code, you are required by the terms of the Eclipse Public License to release your changes under that license (though not necessarily to the Mondrian project). Applications built on top of Mondrian, or plug-ins into Mondrian such as user-defined functions, do not need to be released open-source. But we'd appreciate any contributions, and of course, contributing your changes will make it easier for you to maintain your application when we release new versions of Mondrian.

11. Modeling 

11.1. Measures not stored in the fact table 

I am trying to build a cube with measures from 2 different tables. I have tried a virtual cube, but it does not seem to work - it only relates measures and dimensions from the same table. Is there a way to specify that a measure is not coming from the fact table? Say using SQL select?

Virtual cubes sound like the right approach. The way to do it is to first create a dummy cube on your lookup table, with dimensions for as many columns as are applicable. (A classic example of this kind of cube is an 'ExchangeRate' cube, whose only dimensions are time and currency.)

Then create a virtual cube of the dummy cube and the real cube (onto your fact table).

Note that you will need to use shared dimensions for the cubes to join implicitly.

11.2. How can I define my fact table based on an arbitrary SQL statement? 

Use the <View> element INSTEAD OF the <Table> element. You need to specify the 'alias' attribute, which Mondrian uses as a table alias.

The XML 'CDATA' construct is useful in case there are strange characters in your SQL, but isn't essential.

<View alias="DFACD_filtered"> <SQL dialect="generic"> <![CDATA[select * from DFACD where CSOC = '09']]> </SQL> </View>

11.3. Why can't Mondrian find my tables? 

Consider this scenario. I have created some tables in Oracle, like this:

CREATE TABLE sales ( prodid INTEGER, day INTEGER, amount NUMBER);

and referenced it in my schema.xml like this:

<Cube name="Sales"> <Table name="sales"/> ... <Measure name="Sales" column="amount" aggregator="sum"/> <Measure name="Sales count" column="prodid" aggregator="count"/> </Cube>

Now I start up Mondrian and get an error ORA-00942: Table or view "sales" does not exist while executing the SQL statement SELECT "prodid", count(*) FROM "sales" GROUP BY "prodid". The query looks valid, and the table exists, so why is Oracle giving an error?

The problem is that table and column names are case-sensitive. You told Mondrian to look for a table called "sales", not "SALES" or "Sales".

Oracle's table and column names are case-sensitive too, provided that you enclose them in double-quotes, like this:

CREATE TABLE "sales" ( "prodid" INTEGER, "day" INTEGER, "amount" NUMBER);

If you omit the double-quotes, Oracle automatically converts the identifiers to upper-case, so the first CREATE TABLE command actually created a table called "SALES". When the query gets run, Mondrian is looking for a table called "sales" (because that's what you called it in your schema.xml), yet Oracle only has a table called "SALES".

There are two possible solutions. The simplest is to change the objects to upper-case in your schema.xml file:

<Cube name="Sales"> <Table name="SALES"/> ... <Measure name="Sales" column="AMOUNT" aggregator="sum"/> <Measure name="Sales count" column="PRODID" aggregator="count"/> </Cube>

Alternatively, if you decide you would like your table and column names to be in lower or mixed case (or even, for that matter, to contain spaces), then you must double-quote object names when you issue CREATE TABLE statements to Oracle.

12. Build/install 

12.1. I get compilation errors? Why is this? 

For example:

"SchemaTreeModel.java": Error #: 302 : cannot access class MondrianDef.Schema; java.io.IOException: class not found: class MondrianDef.Schema at line 29, column 14

You can't just compile the source code using your IDE; you must build using ant, as described in the build instructions. This is because several Java classes, such as mondrian.olap.MondrianDef (as in this case), mondrian.olap.MondrianResource and mondrian.olap.Parser are generated from other files. I recommend that you do ant clean before trying to build again.

Another example:

"NamedObject.java": Error #: 704 : cannot access directory javax\jmi\reflect at line 4, column 1

You don't have the correct JAR files (in this case, lib/jmi.jar) on your classpath. Again, you should have followed the build instructions. This problem often happens when people try to build using an IDE. You must use ant for the first ever build, but you may be able to setup your IDE to do incremental builds.

13. Performance 

13.1. When I change the data in the RDBMS, the result doesn't change even if I refresh the browser. Why is this? 

Mondrian uses a cache to improve performance. The first time you run a query, Mondrian will execute various SQL statements to load the data (you can see these statements by turning on tracing). The next time, it will use the information in the cache. See caching design for more information.

If the data in the RDBMS is modified, Mondrian does not know unless you tell it using the cache control API, and will continue to answer queries using stale data in its cache.

By the way, if you are using the JPivot web UI and refresh the browser, that does not help; it will simply regenerate the web page, not flush the cache.

13.2. Tuning the Aggregate function 

Question:

I am using an MDX query with a calculated "aggregate" member. It aggregates the values between Node A and Node B.  The dimension that it is aggregating on is a Time dimension. This Time dimension has a granularity of one minute. When executing this MDX query, the performance seems to be fairly bad.

Here is the query:

WITH MEMBER [Time].[AggregateValues] AS
  'Aggregate([Time].[2004].[October].[1].[12].[10]
            : [Time].[2004].[October].[20].[12].[10])'
SELECT [Measures].[Volume] ON COLUMNS,
  NON EMPTY {[Service].[Name].Members} ON ROWS
WHERE ([Time].[AggregateValues])

Is this normal behavior? Is there any way I can speed this up?

Answer:

The performance is bad because you are pulling 19 days * 1440 minutes per day = 27360 cells from the database into memory per cell that you actually display. Mondrian is a lot less efficient at crunching numbers than the database is, and uses a lot of memory.

The best way to improve performance is to push as much of the processing to the database as possible. If you were asking for a whole month, it would be easy:

WITH MEMBER [Time].[AggregateValues]
    AS 'Aggregate({[Time].[2004].[October]})'
SELECT [Measures].[Volume] ON COLUMNS,
    NON EMPTY {[Service].[Name].Members} ON ROWS
WHERE ([Time].[AggregateValues])

But since you're working with time periods which are not aligned with the dimensional structure, you'll have to chop up the interval:

WITH MEMBER [Time].[AggregateValues]
  AS 'Aggregate({
    [Time].[2004].[October].[1].[12].[10]
     : [Time].[2004].[October].[1].[23].[59],
    [Time].[2004].[October].[2]
     : [Time].[2004].[October].[19],
    [Time].[2004].[October].[20].[0].[00]
     : [Time].[2004].[October].[20].[12].[10]})'
SELECT [Measures].[Volume] ON ROWS,
NON EMPTY {[Service].[Name]}
WHERE ([Time].[AggregateValues])

This will retrieve a much smaller number of cells from the database — 18 days + no more than 1440 minutes — and therefore do more of the heavy lifting using SQL's GROUP BY operator. If you want to improve it still further, introduce hourly aggregates.

14. Perforce 

Q. I saw the perforce files, but a I couldn't find where to register and get new user, or the instructions that you have mentioned above.

A. Ask the project administrators (Julian) to register you. I would suggest that you start with guest level access and let's see if you need update access later. For more information, see the developer's guide.

15. Development environment 

Q. Do you have some model for development environment (e.g. eclipse 3.4 + ant 1.7 + jboss x.x + .....)?

A. Using Eclipse for Mondrian development works fine. There is an Eclipse Perforce plug-in, too, but you can use the Perforce client outside of Eclipse. Some people use IntelliJ IDEA (which is free for open-source use).

As a test web-server, most people use Tomcat 5.5.

16. More information, documentation, ... 

Q. Are all the updated documentation in the perforce server? How could I get more materials, howtos, etc. to reduce my learning curve?

A. As with any open source project, the documentation is the web site (which is source-controlled in Perforce too), the forums and mailing lists, the test suite and the code.

Also, use Google, and learn How To Ask Questions The Smart Way.

17. Becoming a developer 

Q. How could I enroll myself into Mondrian project?

A. First, join the community. Sign up as a user in the Pentaho developer community. Subscribe to the Mondrian mailing list, read the Mondrian forum regularly, and start answering questions.

Also, there are a lot of Mondrian related questions from the JPivot and Pentaho Analysis Tool projects. Consider joining those projects too.

We don't give people committer rights (privilege to check directly into the perforce source code system) until they have made a few contributions. So, fix a few bugs, and post them to the developer list mondrian@pentaho.org. If you're thinking of implementing a major feature, discuss it with the developers before you start work, so you do it consistent with the architecture.

Author: Julian Hyde; last modified July 2010.
Version: $Id$ (log)
Copyright (C) 2002-2005 Julian Hyde
Copyright (C) 2005-2010 Pentaho


mondrian-3.11.0.1-R/doc/help.html000066400000000000000000000027201261646570300163370ustar00rootroot00000000000000 Pentaho Analysis Services: Help!
Mondrian Help

There are mailing lists for developers (mondrian-devel@lists.sourceforge.net) and general users (mondrian-users@lists.sourceforge.net). There are forums for help and general discussion.

If you haven't found them yet, the install guide and the FAQ are really useful.


Author: Julian Hyde; last updated August, 2006.
Version: $Id$ (log)
Copyright (C) 2002-2005 Julian Hyde
Copyright (C) 2005-2006 Pentaho


mondrian-3.11.0.1-R/doc/images/000077500000000000000000000000001261646570300157655ustar00rootroot00000000000000mondrian-3.11.0.1-R/doc/images/aggregate_tables_1.png000066400000000000000000002636541261646570300222130ustar00rootroot00000000000000PNG  IHDR,vsBIT|d pHYs  ~tEXtSoftwareMacromedia Fireworks 8hx prVWxYv޲MЕhBM%w}^>=Kߠtfa+s<`IF3Hgaq:O);|eAc{:3tN-tUˎ ބ!c[=P%Y @8";n3 v{>npݞ=B'ٖwRr)9ֿ qe z_vԃerh&fXc+ߴIUcC=8?h'JƆ؟ +^087'YMM?^AbmvBfkA9a9ݤMÂxٿ{xء7QAgŸn |XF1k+y"`fpGzac Zfz4',z ;.;inZ0ZX hkぉU;``yhO= C+`Xۊ.2vf=Cm(C÷o9in$?MLP\e[/揬6Gf v SD8?zub|q"RQ%I.S){V;*S~L' ew<wZ|7F-K`S3)\șBr¨?JpgVOq<+0;wkt%|JRԎCE|ٓm10]>ُxq5st+QJP3S3.fJ`"D4*/2=lrUe a;\]E_Amc qC-AX_gvlGRyERb)bCC ²S(aX JhPTO=/Xd43?BA0&!=;!qv{/7)mYϹW_@~M>A!kթ.cE ĿI~-& AJ$YVdͶw-Lpop2h:,1/ui+|-IAގbA=>A6ؿ/mai{ a( TŸxB4&i`*~uI3vUGEZ2T*O#;'KmkػI|̳W?S3DvJɺ@(\*p5`ÈV:$y@XqIz{"{f77(͋4ףU53`bê^=bzI p[r^q7c>bܝ%/ O˂lPpڨ\]U ^.ەJVխ.\)y}S<ғ$&'qnOVi{ֿ0j"(d!o |1d+du Jě(461k6qJ& H?$AW[m¢> 7 1(]!Z$/-h? i~2`:A8Ĝ_ ]{4<;Y_~vORz9lw;⬰OJJߙ TLO_w?&!&bRujp|-/H8W3[ :=wdZX& 9@0y*> F΁O ,Ϧ̪Z`OZ叿?/|_yY /'Q6'_E=+HwB ?P&h?|?c]Zc( W*U*ZqTFzT$RJ1h o^,JZan ` /d3d/讀&Ը^FhC޹Ua`6*n']w_z` 㗦v[jZjZjZjZjZjZjZjW *3jHmkBF)3pmkTSx][sƒı%˷d+/ڧNQEI. Ir^\ Hr$+߷gp @Ea&e{zf㗭i;jޯ'gGTaׇmjpOuǘz ڇ{o=:gwgp=U6)o2V.ao\OdJ.DS~҉q1Ox˝N25ά>jIߣ*ЦuD[/i{oסiѷN6'`;6Yk >{1`-OV}MltMԠMͬ2!CFVv | .`*P2Z%f1Ӗcپreɰ`J6j6ð1h&e 0xYr}A@g[MA4]u-m>!}!m=N0}m{hJ|svkx-kYmq^.nKبY ;ς=JYXemٶJo:I7+I~OH[8Jϥ(ֆ /R8;h|ICbYwغʭod,j1,`rLH @&] Xm8}v 17̊MeШ A2hTfCq޽?!HGb E6@T> v1Fwt2B&Cd>kLJ͠ (aozJu`>ZC:"ϕԛ|̻0YZTQfuM5ۭ2$I?\)~JcoЍrj^XW$bUW ȴ@PЭ 2#\i7$hU FR80A~8E8Babzqjh͗Rk1OoOSTl0Fƙ1MQ2N 0u)vz1V x4}Dݣ"; wdXq~'M͚X[2!ϹOrH0v\Eu,fa]e r=>*/vp1 C2vCTU,}TeD:WCeks-C%>'ߙ2ZU)VjqC|jhO\H!^l`;@yp$4[젃!:4g}eb,)8 Sϑ&{6ybi~9 ֊xwrG FF"|b(,"LK@$UO<;x%yw ,p*go|Ѕ fڇҩvB).Ya{V=9UɌdg%9O 9(`h5]&.%ڦ^?)ٱcBdSҩT;q-a<(sA"$͎EN2/)\ Ү0f(29HHƜIۭHRW,h*f>ŝ#&iIz|m,NJ! C4|*6jT+>hv Ho[wye}yн W6+*и$XZԕvo+8C#| s鈲6V-€"|/97 2@Cw|L K=ty_5¬ ON]\HeyXO1u6,'IH}<[gLL$t|OcEYmJƐ檕XhmT~&/ 8! y ,#@ Əb> t:Gi'>g睦1loTq3d8ˬ0U0^NXBf?  b{7\vI:; P8٥~_a;Q,VEe(XԻGx$%ҁh=qORAYNY5əLrf-2{ [sVj5D5i>"" P&BC e%D2 m )X>xp,ZtV%V2J8 %FyziUZnՌߥ{E}e&-I˪UEZ]b9/Yjj0i5jiUVxRe&-I˩UFZO?='\>3QMM&f-2|e٢pW]V'&'ɫTFNA#[a#ƨDj21jUji8բgǫIk̤5U%֍U3eg9e$3mj4VJDF}@m9*TnZ N[O|3ķu6ۧvjZ 1>Y=F٤&CZxԟymzȺ~!68Q%YP,lW¼ j,pnh--;QtRӊJxwi#RM(_ץ1Y6͆ik Gg% fK2GCozn_GhJӄgj%Wrmlh,%ƦoZJncOղ<}cMQ!_Rlr( (4ٶ,$QE>mtI ~F+V>9_3}ͳ4!]΋ TϬ,YC&-B Ȳ`SO12,ضYh)NQOt.5x|B\|_V|=^ºw&^3b}T+> 唿|7UjfXix Ң|-/ZsE^};5!d~L NqqUnf{^)>-F9_(iツ|qcz ϡ2UTj+|TEW~}/9p%*},:5(oS76*3$)jؙi)̍ (q+i(pl^@KeaK#uzB9uK:H\E"V~<_|B6K3DA k;ZTx~Q+dWj.` ,%FII eVί}ŌuZ$>iMfC325Vr#Rk$~wH crW\ ]bX?qqcK]{4]5;/kvٹ;o6W3tfhf蚡k.}7_^3tKghkkfhCfh~>m*gkή9{ٜל]sv8{sod{3ށ]s9ڬ9蚣Kd>b]3tKghf蚡kZ_;f{̻tvsu̼>s=f皝7f̻k._̻C3jC3jξ]ϼ9"5μ9>pt=蚣d>w5Cg ]3tm8 ?&𽉌x8Kd̈́N̛w?66SY2hg3 ` q2} TL~B|M  e^O ]){"UkNi]Cږm0Nm{ʵ-wh7dǢbXw$Z2;F`u$[CоC㯠O/k,D|r9YB.K_A3?'yw=Jğc]l%]߸k.wnV弶k<ç0vx Ϻ"@>߄C/P۷oW`oI{ j@i>GUВ:T-"xSqH>&X{CQȍ0>%w)Y+lm{e%u#)!W!{U\5?"dz2Yx9\&[ #0>Q{c6Ŋuo t5#st GD?bB({t!HP&sbX/Gڱ,UN ,roBO=LJ>$3LHtQI{ L[no;eJ^WknDvSIOb#x`Ǚ=GWo}Z'[<ׂWYWT¼'>"Qih#f 3ډ8F5L^' O{*b6HHPIv%oUE~R64ydT,G$U";7獨*&eFET&E^~wp;=?ş{6nY(R"YB8Ӆu]]|JCXQ4GЏHGZdK?SL4W)f /qN9$~(-eطMoO{֥+/B̟lb4dj~4H=21}"W>\nyۂ+.0*|a]?Hvv^R{KjsS{uO זC^~#`68QѻK[P mXCY,a_T6|͙+})<|BݧQhN%I`}RUm8˰W[2x c [sbx#gS3ʢce]OAd;Uޟ:6`f1bt'{+/1 d2l]͘^ϵ-74aZk0ߧaC'l2$,2B [| xg E%X9Rñ73X߂KH-ke{`^9[ɣw~qN[|ܬIVHy`~ߺn$ yIOXv8K* &{#=kbo)+vMO_Ƹ?\vI>C^o;*oc)Nu=w_V$׎ccLju?t[xNpV1i ߊ V=2Pa3ăwP]>~ sV";upż[.5k JYkڷfp~?U3qza5y\\|5*TfqwE#`qX޷O#J,c36+V7׻;C={Ch!AޥA9*4 ,XmRQAIRitF >"u{񙷕 &Ό c’;I9d,/tTu2pg_O٦wqKqaǾv[Q=Q 7m9vxnsߎ`p79 ׾I-MwTAnW漽C7 ɱy;?=6ۨ<ǚzd#z\5=+ 'pI6;z?yrzc8)-`'! rK!{w}AZ6ժho2MӴ!S5'ioBؾcsF5}i پާTEjp|8>;:W+C s\2Nj;6ގVA^vz"?}C9.$n4lՀoW[7mgHӦp}~~E÷4+|iHC*s+PmkBSx]N0Æ WM- 2*5X|DZ=fLc(F? hҶ BLrGpodgd/e>f 9]WA\\Lf[xilϣTs1H QlHاEt(SAZ_Y XmkBT~&x AQaWzݚ(q ;E W3dڋK/eӿl-y>"{4,/ G5k_GUSSQSwmkBT?AxTUךǝf&o&ZM|bI4QAҤWذ XPQ#֘ĨyE1cGcv^,r.\=p=o}[ HJNFrr"c'daպ|՗dAغs(Hn"7DQp=E2_R[ yK/o)-R>޾PkZ7Kp>pp(ǒm׊4y8҉ͻOp!p_oچe+aFP׬;>rtX"g(?.zi Mdf|ylٹW_aw!QXf*/ӞVXĉl;qO8,Zym] y%O?t%lƞ!)e(Rs!T4u<ϋ^e>wnSˍ|TPo D)98}:~_[Deth0n4vAc\ċuB-M+Vac^[oQ"M[~`{Q3M#*$o ۷|4~'@mHL?= gf [O~5N?}K"?sh>D9Mpet'߯A>9|uWʟ]K bqp.*<' 9'd |a8{ћ:\T~@xd,~;qۡ E_n؂8qVŝ% OsM!ɍ?իmۍcS"Muј ȝYpݽ0RҦ~xuB6):.5 ȅ?OK"ߔ|81D&MFΜ,?Ok0TWE41v,TW]cnպ1|ۥcQw?xwi ߿ӰX%EDcÒsz-?ёyUSW+)׉?w N4s|%Ҧ[c%wMo|Wğx}嫾OGBrNq J!"uwߋ6a.^+*/sW`na7,lx_*ŮI H~},)?°5k D(~@QB#;/xğ|ew07xNX+}e 2%?MQ{YњJ LNJ_.Ӝovm?שKg=g~ tk}_h wGȏ۶}/GC*n"~]&ĚX)Nhfil'҉>+gAz/ DV" iPtԇt~s~yhdE4TNh夏s=rH%h g߲l+"=h$zU8] ,FR/ _96pؚ~c mq+W18ϟe?031 j|>h5kϿzͭZm:ʼ==~x$ 8Mr>׺<Ҝݛ'sCFXTo,XQ~9 {!:5gkt^~}S\p|9s`x8r\lDQ3f~d' kzBSS|*6Ćtty8Jf^ Uq7t/:Ƙ5~9c͟HOnI݋#Nu1/|Mdtӽ)H͟4?gL\&)e3s~۟{3^=ϟT2|̷ xhb}v`؊eyPX@H jϚ 1ص>E+tQ߿ن=!9T9W0PStQy9\H͟DZy'y٧'nT'۲щ|m(Љ4wE~Ɠ]WMw1ȟ󀯸otmai{8ğL0ُ&3^'NJ57H«jgU9(>_ʆQګ]l;e=$]DWQ>,c3NVCDaO3y{+t}{clܸd6t>IM)^ [ u}#9s_D4w2E'߸yGp.~Sz[pi(N챣 @yqͭw ]O>QHG O6ƲRɽ.9,q>0F8vmp! ¦gs<<(SCl!S Bav0 ?*5?E-'w6f69~̧C ]4;wx6=\Y&]0)kTuS⩏oAVnm ڇ&}OX|7]P_~q^UsgVj}v #ֺUs6{Y<קpL~aM=]KuscՖO±15M֟gQۮ@' D=m/ջ+¸KafKUqoMʷL [:vFUOi{>m@ȣ\no"xR] Ӟ@߳o+|NmyoZ6]b `l ¯ϫU}V~g?ppXբ+sR=J 0Eym\ =hn*+}]sUcdwK}r'cTgmȟoPn~Sl+mZXG3_;Ttk24v0 qæDoqX.i~ 7 ߝۢZ]`O3zܴ-K;]>azdh$T؜}ԉG8{{zc$s ESd3,_g6T|Gk.X۷ED\#q;G7xN};xfSې";)}D ;gT ̬/6]np=sW_քZU5hnB(j}vR|=.]=Goxys;F='vl}[;_^ V\??9)!`$ձZW)G^]aȱpqChS-qdRkhn.aMWX|ƒ1H)_#=n~Jlo߾)*/N\ϱov[iZ_ձaJΝ/:6O- 92b?Tlk%?_21B sY5>:>c=1Ow y^- ڶ,XzusM#גU]>H_yYv!ۉ_mi Rus]Xm_g)YY)m]y,m z1aaaxEߓGקo/Y\k6xjgH|yu.\aæM&wk#ϐ$?]Mo\Ⱦ,/ڥQ@~6s?)}, l gX #vQg Bٙ^uのuhm?}{].~}v_J;xogJY]޳@.)oqC?}>@Xߘ'-(W? źvƔOʙRv[K?[A}?-wmՑ}g\=c}M ggg DŽ-B^k_g?F? v0||؎=ǧHPgs/hؑI t~{n^}ZyD5XWvO)"c0vY Z|~_%/,p\ɹyΰZ/;/xs_9?Pܯ5ݻ\[y|č8gʱL{? 0 0 _k3>z_\S |<)b|7aaaxn.ta?l^Cvkؽ#~e)3<3^kdlc&jK+o"e<.ʞ`^(3zu l+6v<ï k7]/lc[`On}򚄫 G뎱zt^v2)?;Wmr5ocIz?Ozx{&!ez."ѯ 1Gg{+ҏlw<=}GݽFƨ^)zIpG K֜{{e G12ۭqiumf>.}~a? 0 0 [u+7Svq֭y΅ ?ނ}XwŶv?ߩDZۓ-q/?߳=<~#>Fk"qzrQo 9r,nY[;o:)@-`ק-7({߯S@µK9֠ɸ>:n3 _[_*mtcmC>qSL=<6;ǫsaaa{xˌ\ފpx?0׋#5zяc]x^l򼠕(f:~٣^lin59W~\;?vn6erUbS~v^U O7O(|;+SG4|?f*?rW~2oNٟS9~daևmH6mX[J~s.ym4ٶO|Bd/b5ɿyU? 0 0 0 0 0 0 0.P~*1@G\⟿KrKXs2(ߥ纎J8'>X@▼QQbqwx b)_K|v 1M6kee-2Ǜ59?K^E~9ϱQﱮYF8N?~;:=J<-tĒyNAgC \NXKs)'^Kg\~2}6}Գ)n]Or^j~"{p29w6/.z-v:+M{WJYZ굢`% Ҥl9ힶկ#OUz+U?;sd~vND7*.Y+v:ye;8}~|+ÑޅN9}{Bƞ#txխsXɿkSV/uJ=o G<ջL'L:D]6jfgLz/+ؽ[{rCMYq~[{yy czA;w9zszWHVax3 %mkBT[-xypTWv]cRTj*Of&J$qqZ0n+Y=n=JV' wO_R-_R-_R-_R-_R-_R-_R-_R-_R-_R-_R-_R-_R-_R-_ߚ ;z?Gg#,,~_Y?>'{ؙyKh]1 w?dž踾!]h$kܙG^4/(GʖLDM_`0ܰ>Adlٺy{PYwGC#Ѻ-Aʟ9 ~Ic*jq] W8yaeh7oCqEϡEUǶ|ĭO/g8n͖n#|~=ۂ{,uUg`ܽ[}Qp 7? qA"~~9ALJEQyBVc[DǮShc9^wiDy֮!y&ъp.wFpX$={%/pM8l\>s6f^>؜7s=Z7Ҷecɲ oba\OdAEeG"@C!5Οo{ n~]CMF>?6sٮ8~]ѸtEbTZ>}r$8zAǸNCܦedء望9qS,eOjxR@/4uI[)s~dn<湌.ٻagl=1žҁp'_uGfZg I2LdFjvSžQDt=ϊKL1bX-Zk+B_X!s_dN^r?%]G=yAlysޣu-Mm2kG<)6X#Z_7%4 2$7}8/*r-{`p8r ,v]@78/>O N_nyo^q#a8uOy}̢ Mr*X^?\#M4Z:))kqNu{ R xN IQC@aij]'r>vrOAmU}O_O8v]q)MmĹ`^A<:_?2>m,TU-h㿵k4i.k+~PAI5|58{g[2'TK̜8幆(ڋ|p;m}f2Aqg1k<O]y9J?O /{I3'T-C<2=wfȺ?Y/20<?3_C3xgm^,›C[1_˔p]88q*M=ƍLi7N^dk{G mrN^k1mLj\kӔ㦓gx_/3f.]o+󆾡4s0nQ1Xޙg0 >`µ5oggR0ݨ=A&}o[(Tƌ?ŞPv,4\BfI_rwhΟTޱn'ؘE4_5s8c5QCHʪGDo 7PvJܝp՞A*Z vfrJ;xwʛRNؼ៷grr7۰3P~m#k=C﫱xQ'c>nk(^ʿ[>n粿fZu+}ͷZ{t2o;sb/<6*4&qF_xs_r~c DNET6wlqمn=m[Auւ?3Y2gR6gc#~}C>$k` ϯOvj_>*j{ XVyS+RpKnG򯤾9-1ˊ\ Ԟ̲>(?FJp6?so)Ol랡MT&ؘVxTvNEi;),1[т?QTį^Ac.fi'P1]Q]TGzQ^6 (>瀵HEvy|CW"2\VϹWm>5a ;E7aNN-^Ǧ]%o8n>Ff4l-i1¶R(^N~H+h[,G^XR qmh~';o϶zZq6xdC;|#Y=_$\"w]`K@}-(y%pS?3Z|Ws-[DsR-4G s'#$njiş}R6NAظ k `T\7{|G|V%݇%dKl ,rAJn˫aֻcmZ3QyF;bHƊWh3q$V%y6=N|Wi,U_y{o?]t}wb 6\bS C>8r%$>a{志{Br~x!qnGp"__DTHr[C!ZGxXal<}u`t}"6m(?f:rbUu ȇJʅK@o: |7ރ{{c*c`5dx Wi f̛#$C5lȖ1_ev!qq7Ǒ[{ kUv'[yIl1[圳[4:ƘJ%snضB9÷N*"2䜜;pbJؗ9܏7}3控9w >!e2Rŧ}|Pnܵb=e1S>gr]z?z?␿k1i)S)RWϒƸF6j4,9_^>2K9DZ ]%5K9?)9_oNs#zD+0* ?WDzmK?59#fs[5^W\ { 3ͫ ?1wr?,>kRϷPRQ/{9n`}ؔ?{\Y1CY3֒&=O’sWxy~5⼂)˄?sc'9D󿴢cx~1e3S;3{ו _W_W_W_W_W_W_W_W/ҤGmkBTx]XUWv囗M2Id^dRLb{(`å7銢X5jboذHG៽I+^8|]}^{6&M򂌶Uk7h(zmwKeȐ!C 2dȐ!C 2dȐ!C 2dȐ!C]y!p xPB|^{[eH3A)&/gC?cm_ԍaǗV(qi!qwrKc̉\'WOL4n0g2g/ްsp lN Dz8s: 7 Q7h>| d=Ć-;W'7̙aǞ8z<.\Df#tΕ8E9p6nra93Bg p9EOPRyxAМNl?⹝q\PRc$s\q @ 7Cwr蜖2Jܰym%{9\u]T wX_s+[/Y)F6 ~rsasxG|/i53X&|QO[Y5,OrXW9?+x ֎"-*]K[?Wwo}!G߷cndn#,#d@}Gx{%Qo!&Cpp@Tb J(^ruUSlRrRl*uCI1Yq9K7]Gvr~=>=떾ZUno Vg%z~?<6 Wo|Ti>JsO[HY^ _HFݼSp-E^SymPTY?~o}'X9KY_eknzA.fl.r*0+" sbYT g ,"~>s̬p-߼AܖlScVM-}_/Hg9ͷB`: iW3!>Z 1>x˹ddUu2Jy~'ڵk_yYh hH5pm\m,JLB?cI(\9.#I@sAm"0ȦْRՁG;fkbtL\eQ77TqӂÐDih`hd"-U0癎O?y >gF1FP8!vQo)u%K#{{6oyÆkhy|xDz#Wq 4g.sރ[ğ%+azc&!g͆x/uW18tLϵ9m,O/_xn߶"IA_w@P؋RAp2?-K(pMd)>[wrS!\ԼM矮³"zO}>SZTj.T~t'?7ۀMyl+ο8i}Y?YG1}eP~_Kih1y?l*8=t6W<5#vK0L ~-0.c&L mw™# 79uV٩?> t T'A7Oq?="Ǡ ˪/etۓ^Ըƀ9pv~vDoAh܏u2}Y/}%HO|f;}^1}ʿVqgy{۝b.7tf>t 7©dK{H7^~u|oީ>gցbYj鬰Eqtzms6Y;yY)@= ]ᛙ#y,F1u3&BX|6 /~`@k sns>CMG+b'Z0='| qEbI/])B*u؈i|=[OxGEYv< w4==L0h= zŘ\pn'ƻ_wԉ|yى=?˔kl5Hk'U1?௺orۃ5Y  E@]q4vBַHG#pz{ OxM?Eb1?X>]|Q_o)ܓ V 01ge΂]ytz?`-.{7Q,i0J 7>}o6.[@ .^˄+9ېRW+Y:[Ur_>Wֶ#P<9^u\3]e{P}W#w|dVDZC-͛ ]`}Wp3P>ijfo8F|[SM_17n:IS(,NZvHN[@ߝbxzc톭R'VHq#ۚ7.%o@z%mO~"~|MqC8IrۼU6#wgkᅤ=Z=af!bz-rJ#_6$u;<  ] ;{'8zO2 ݸ |M1\<@1TvIG$v'kst4.V@_Q;$i5LGnFd59EݸQ>q+7?.:G$ xf76,z@=n>\<} gcL ۆD_(zABCmlӁ]?BdzQTچU5ꋉW $*kO[3<}xs+;iE1&ц3?+tbHR(ϼMJM8vsm'=OuL腋Ǽ3_*q\?6MȿR޻8<Eyd=zcWGF][|{/n۹V@CI{k_A1'LN;u*ݼnse }8~AZcϺ'+xTI-QK +~v_z ̶zwk12Cfs~WنĬ]R/$[saHc}TGL7yO5_}C=$}*y X4EM#^ωBļ5 ݞGE#Al:6k$Ǡ [ 0b't|m̏Ot2ROh.ML \k5?ԑMkO_UTuH|3nG(}2֖rzES.5/S87x.hM>ҭт)9_uڇwrךE~yZU1Q.H#m\s8|![9wgv(QvYkKTtB8|&gtnuOCb>=w$5GHܾWkBZ;6%>ny[wT5(9Uzy{U)֮2/׾*/T5j?Dyx^~f*O*$,KsJSWOd>!򯊹NX A!g%%G4G_L-PP)Mx~HSr=3WR仏ZztߴW3Zj j*4'^4T:t4'^sKݪc.Ռt6X'^?~>sm(g/6^S^z=D >1@ڵ۰wtj߁דU=Z.}$,jC.<:qKbfX;9UX9J!}(ȨyO5Wښ*^ZSOЗ~IKy;Kmt/0`` u`t?:a#ѷ0;!077F:uqt-_HV@̢%wXkn ( qq(nZ<`U:1I,cdjmZFN3z%lqtVՃ+`,72u˄.u5ƯYmurEԃeIAgޖG; +[^'7AI9rt_Bŋe_y\R9mSt~ZE$.6οb/?_dZ^i|F6,8yj>o7gᅬ ų'22VV(}#!A)@%~ͺկ\ KM7Gz?[w@r*_pZ&B6u9GcⰏ*ı[%3Adoj\M5:q=NA\_[ch\c&U!)ޛOI]];K2AzzH6 ӧ[;;,qp:Hˆn2Mү?kvw 췗5h_{qߴz?WN!iLGc:Ip MM^0:,10b1t wyܟ9(0^r>S9rr󟘈}9|{mmkWDE)uz(OccDU(Ww$ŚE?by?Gz=?j\6ѱ4պ_UO>3<&&G?h UWl/\o'*k])s[#dqC5Vnhr\̿fO/c+eMF-}:ݢ:=XN VBsXFcG7Lwl?k?M֝"Ff!ne?OyB٧Zn~٭J#m>72 ^4PL/SQTڍ2/.h^fVWqA1 _~ח[M&Y_+XiPtAmkBTx흍) q ĉ8D^>׻gI@XjjgiЃ`0 `0 ?ϟ|:seQ3|ӧO|:2|.};7eGFO6_Qv]T]^ˮg{>pjzkuo{yye?{-x/ D:3D&򈼹e^Hyi#/OGzϪ߯_~ :sMe#M3Y#=2 QЙ[\s=E8}E>GȩT ڲTg-}VfoSVwzV}./>~!?U1<#}=F[ ~QڋBN..+푹^edLo+[\-k dW(}6q$#?z6Bөi?L7!3O_Q}Пuo[=tkȋM!'}/Ƈdr2_Cﲨ: `0 :8o=+8-4}۞cĥXdq{bUq©ήm!ƶg*ΪU\z[GA=^+ru{LV U?)V>ғ)x|Yҁgi\yi^cUo*= !TY?rfgWsʽVn*VX#=Fϫ+[F~yH\L~[O҇h5ݵTow|Sfӟ+);F;:x )/OS yUo2e)Ve3'wgGg=J^`0  ľu kU,Ksؑ5nY,bXw{ w&3QהNQev ]ƷgcH˞i{A3I8hwduwUIWq8I>+@pQşGcZ\ƪUߝ]/:3d;ɫ:gB9R|GW~w2;fzt|+i5nΟgZY|<1NyŬ|E7k?z/k><=Α}N΅>uWydʬdz `0 *\?W8GY:Dgcg< 2+'W6qn؟{ru"wU쏘~c#T?+y{Q,,^qF/Xv8.֩g3}ȸOP ~n%hUG4(_sn|W}Tg&x^c,Fѭ+ <#+}/Uw8BRh_|33!mr\7U9m({ѝpvew[xG]߱?g;,nҽow8]וb?OV=Z_#ve?vN_WrYLo;1g9pV^G~>[_vNOS3 `0Q[ veO\k^8֔v<Zbz\Opbn$~}oz3ј mK vU]^iNWA#x딫jt q :E= z%օq)CcYEqyRG-+u (K\hP'*^ء^q=m=y|Kvūe\rȊ4={W1;=ݷxp;o@>ȘT\Ԏ+C=*ɫ|GJOCW]x1.ﵠ9_Eб Vq)v(ʑ}[GwǺ{-oSdו_˞׃2;iT&w*w:g׭SOsj%Z[~_˯d֮+w]7 `0]kIu+eL]ւoA^;=GR?v쯱;<y o$N1紈=:ߥPVu< <&3KyC/4r)i=*/|Ύ^]QNН1qGw>ù{ ?Kv:A}E:_n+{u=rq͓̳]>>d}+|L01`0 leg:׺񶊝`W,3O?]\9P~[kOWiGc~)-<w.3q}'vuw$Vnv(r52S;Wk_Kϔ8B/hEՠ'9w?K;x:x<|@cϽVyc@ۖSw8Bq]=2lBe6V}eR( VeZT4ade2ޒ+nYBTqSߔ<[&=f[|szP)G}{Zׅ3n7jpWwftEw[ǽ;`l? `0 `0 `{~i`oLy>uoi\qK|}7Svu9G쯿c¾#>,jow{ՆݲL=mW2u_8دjo?kD߱mw>#}E:OۡO;y`$jw0mkBTxiLg~l[S#MiML1G x(( ԃKrZT[J=OkW4 |x223y $_ }݇#yErK1?"(@`wQ;ε{J_5xue iǶ[E/ܰq {+6ݮVRF/W™&XÞЖ?Oӟ?Oӟ?Oӟ?Oӟ?O_O濺Z!ҿSÚ0-~ammy?'}- =2};6e62RAOE+s`#J\jy,>B/Vc<{1Hw5kutU/Mv/Jw/߿Z"7jM_qroVfbJmp FlYkˏaXWy\CFbzu>ͻX]Kv\ [紕ez`'߆ߟiK6;`]We,5Z,-ZY1}ccʜ dakT?> Y[v1.㧧 㛭Ϣ\ߺjŒEJ,A^AXRE3J+y)$"ELT@"Wu SC<_Y7јAL?#@.2ȉHv`(GMԾ&!s.NW#%HubФX:n\U yȸ_yZBc)$5~Ș#ۊ{ӿ Q Լ)j~"cCTJw Cw0vjn#$"Fwz6leԸ']I.rNe2N8k|vP :]Ꮃz=ٿٟ%EuM)R/aO|po>w?HzMޗ߻Awx9=uzogCe[Wym_Au?.{.gtc}9fCEW˯a^V>?ߏ>o'П?Oӟ?Oӟ?Oӟ?Oӟ?Oӟ?Oӟ?Oӟ?Oӟ?Oӟ?Oӟ?Oӟ?Oӿ3K[<|!Ϲg"\Э{LZ9y7l|[6PLOBʱ@ m_h˿?u (rT"!9 W;6S#iM?Ow 8W-.~/ eK҉E/wRz1\Ҭ'6!Fg_Oň$gڑ_2.)oXo'j/z;R9,~Džj,Q @;z\UcZd4|gFa<$.݌{uhc߯X^oM=vӐvJ7gU'P~7Cک:r+iN߲/ȸ }AjǓg/D\>>~sm+vuՑνYu8uN?WP>1JsWiV_uKEϸ/rˆ_gKW]ױEYcl,[TYHT}xL#}A GV7^}>iҞ-i;}LJX&TP3T#ߨgJl e'=?͘ona|7>?ǐU%;/mN/IfQփz{G}?v✽3X~j{zTAO^ʰ>?sy|G)P)$D{cn߃hϧ{|qɰu؈ͨoj":{Dܟ-(.]fO^O5WN}'/Q #4"M/!ւ~.k}42.X |g"=NdœkzU?54Z5L-W"@w?5={-wƁCGE5gA./( ۽|A>94[ڡA ŗkn.{d}>NHJs{׻t}u/ǴcxxwO8+[G.{=JJEܫhm5wP}wn5(Ľܼۄ3t~ЌVSqqQ nݯOwt*vmyνUAW52s PB}ؤ;>C0r$֞S1jd|տ?45a8Na1PWI3c:bЁ0j:fOYɝp19 Zi3Z 픙Ps(yΰ#֊7@0ZbUk 5x/VCn'zL 2zBR:z1(D)|4VH)| qM$ABև?u 9w:HC٫ UcU?Osq'`՘6Q(s#q ( U>€R)0c|"q)*!k[G!Da$~cu4=]Sz!**"Kٔ2y2[Vƣ*( Q>}1ߏXG({bZ$Q6:RZ(;*ɿD_(cJ~å캌?q1Vt\}?XQ WښA55ꕡf4#pv Ft04GNӯ]]=r.[;1-K9,Ǥc߱{ O^wĿ,ᘓe9g1?A0C4tncZְsؾK:J7 qԬw 樿#r06Z+gj1KH#x?YNw\YyrJ˯ϴ% xw=xQyq~xi#v$o)f" .JV;S3i;_2 J0r<;dZB"Wa&@0oj5ΞU(-]#<\c-$ʚoW,ž}S3UUKޚ; *U0k +ϱ`_Ѐ}`o~ĸ]@oC!<=3[͗9z}ՀM~SeF)󜺃mב=bpֿ8*"_x:p?ZjS|7bN \kÜo H c;,5Gҋu6K*\1kf3"1Qẘm;D44!=}&bcn**=K9 QQ6̓P80EE ?<[4 7$^cvF[>G5X}lwd\8>k{ TS+|*g_ab yC[h9aY vK&.z^Kvab/lҋDu6f0&29 9[:nx}&kYct&34뜼k Xm ĬpF`5|bQp#Z1hFah3^/&E:@Q3DlMdcdc 2{Nfsa^Q_#PHM,ޝCz/ZxuolQ}Po}) "&i2:SrF YE%Hv{`uM-NbAC2κairVY^'|[/I"Ρ2M?Uф㗰Rb/tC7`q7\~fΰsc-qX +ؽJH0tsLQ[bY[LݿNX`Bt1fDEӅ_'pT;6#ZpwЄwj7TQ:ֻU|էu,{%|%A8;+EUwTU8yb㧂mሯ]GUK|y0 [X;] o@s)'cB6nA82xmz{,3i␶_Vl&?WQHlY` S9VĹg$VGpF̝|}zpBZ {W-{qF?Qj_$C_֮@fl-B].]!ƪs=1ĥKllgasw?^y.v?h|T:BjPdlpd=VGЩ[:P\?V^vEP._ +lK!e뵷:n X FDy}_|5^Bulgk@&MǶ3"`\wG܉Jʺ@ؑVW!!:1tĤW:)"E}vuX6~+%B?ռ^`{7~~AߌN{ǯ],_ oޭX6Ç5[}c/?=T{s׉^{ה_<ļgxz{#5y'ʆ k9ZMhٞI{FS ^ ~}=)?3xeo) ^KbU7?ek ׁo42. ^T'[8(B2&?ǿav_HDol8 _W8mұTa}e/|ſch8 c;Ơ#0c}VclƎn>ppڬ_}Q2/l-"!;ϧlbi< 6~ bGٸk􆑖<>>Vı>fb Ka_;ⷃsE4 X/zҲI?;.]C?'O?'O?'O?'O?'?jPMimkBTxYlTUǟ(!P $(ЖMPHJwZ֝R .a1F4V(;iZbf~g99g K/<>usĉ8p!֏#GEpn'&bqL{o̙6h;:wO ˱b( fXn.9@>{uJlOIAkfF!X&۩˿7+]>grF?x1yy(>ܥFG7 9·M qw 7r(w} P5v,dd8ϧmINv},- y\/ZFELd=}HOv#S~_ƫImaV/ nqX7773+eƱ#Il7'%a˖~[~{$G }_pcuÓMqqnL~^oWo{D=?O}Gr# _-}ԡeDurϗ:>~R!jWV_$h;ʜbv.,]sr~*y4UƱdwDžүgvWj<^U_ڪUr=I Kk?K;6y2.K:%X]NJ6|vff*;7==J6os[]ΩJvLc9:W^;';r}o~awPF;M_6˦/eӿl?o=x!v-<}\ΙsK)ˑ$wu* u mkBT[xgTUǍIL^JlY&K3vMT v"XPEQQ b!5.>{ĖXbXX(=r YAr9Μ=̀9+>0,9w5O/.pxz )%[ɓի8m&nۡ `5F"d4]i'ӯco?=bOZ{򊅿[;%XZ=PVa\T }Q*( sm?.ǜyQ[g{!N#YO]0\!_"?W'cp^//!~c#ev&_ux4ğm;0zl sw0w~4EƀLyv~ .]φ(~}b~qԓjw+쁾_+-[s"9En?wEkS`Ҕ}Oq7\*(\;; {}޸RoWˑ~ƌhccߟQ+[pi/oq̗}e,u7^wG/^5` 탿u_6liO/\ƉoSsnV_'+2f)BgGQ_'nWo!`$l|5АḜg /,rl#SA #Xp7 ={8GҐv13yo۸x=[׻`K}\L+?w E^@zP~}Ey /qu|~PƎ7Tj+6yxٛo*,ͱbQjw'z>ڴlbZ>g°O?U4nT*s3gx߹P.-¿z8Qؔ)H AʕXǣ{Ӧcҥȏhܡ<ޏ}4ܨ(UO {  2OP~X%'?K6@BbųOgr8嗅m~Gcfy\VԟSeAy<˖a=י?~Cŋ#=.>/]u@׍5eU\Udq]]g+'&ٳ h̾|0 )Ṻ麥Cʜ9Mm/ptDVd$[zȟ[@A嗈qt}$s QTz]kGhپ=Ç Y}bP˖TnE aHUuK?n%T^W׭Cyګ~<{w耽qp@(8;Kf<ˆy:jgĤ/3 l׏O CH޸DwǵsC@q;PzlQ~Og+`sblwHW_79dX,ʇ̤o~6ݷ{^o /#?lKG [.u_a{g+/9}'d# Uj-tr.??CbB{ĉ\ul_3{C9QQ٬z/𗾅7ԸO'&F}MH'ӽ9h,PJ+؁ٲٓMN?Gcidc-ck?ͫ^g=o^8k?G}2:ftQm_>QO+ZunWڇ mu/u ۞hl\\y? U..XI91U+$ѸZ-~m{ a}o&*?jgWRukN-[*FoBku*WWMD ѴAiw7ݻnG QYXڵgPeLݥ3Wğ`Tv*[۶U< N_ /_ /_ /@.tt_udHZǥޡ ϲSNo>Z6ßgUI6^l_>^y{Ň7F|y>ݹ3"h k!IͥG@ 6{3nFD`\׮8}Ÿޏlgg̨@}XHtC{#;*n>@K^^1[TH61 Y[oY[ڲ__uowh|vƿb|{ZQ?Qy/_ /_ /_ /i[ *mkBTx}+(H,"H$"#X$,QԈZs>U{ ..T}6ڳ-F`p]k߅~b  О$wݓٱ|sCoA+q3lOx@(0a+? T,_7s\Ϙ^Bl1)C+k(FyN"8dPC_9>O0&l4Im+nwGrŰ)/tihf ѸX>E)<,6s45zb?J\<OM%O#(76:= ӋYAƒH Ls6MXBcX&ǘJte. 3.je(??Lj=%wZizFTx$kP8Em jAOހ>~؆B9 ֤8UKCvjbL Cy ;mj P. DkwUE€3ܨ8xUJs\ɟ+;}sFQ(KIXݛƨ 1 +KdX];Jģcx$D׷X`i @l̏rnm$^9΄zBGϞQ=nfkDe; <a>,⢞jk0B[p($Ǡp4 nq`XƓ vϵ.xHnorJ5Hu뇗 f a[Z:>36[g RL؍?( &w.7C#~B{] UW 71jk~ecGrD.=K@WDZM0倐0\xvqNZ ># BE )&yA}t?B Ym(WIpɱ |2+\2 )l8tl@Z.Be񅋍RSƃm>dIl'N adĢG3%#)?$s _5=YBR#-k"qGP-e"f%֩-ϓ378M9ϊ,_*n;HEBƱcl~ ˝[/sagIE2,z1t:kLș壋G){7ond{@rP>kwk׽ #kXfyEAB9uM4P=_lgW؇N#_nGpp ,ZUu6ȓVӰ0EK7*|]{75F\ԶzQz! uH>upT٣o3P)[^6` -d&*=%fY<^ط`_6|h3ء>2 Pq7ώ ,NsjF=B` 큳CiU)R鐏@LҮǧmb<2FHRqùFXi䎲OmGA}:*u f:@ʫRH.66jcGOpO- 6HKJU:Jǃv,3DZEƮqq7p?ȌK%ȧ$;?Qr6pP7`a^=R_)m>D3#£ _' Iɭu͋C-Rne㯄ssL<ȭ/R)|Lt_1Lk=rr 4/gEr~PnB[\g[{gYvRW' {Fem1{ wL;7&$xc0 n&u@5sCCձm8Heft x{q(aтa?Q%l4ςxmWI׆GC1kQ3iJh,KRO`ʲ4)%b6B8\pe;u)ko)#WSncRx{[sXv195_0Kՙ7>Tp5ٴl3S"؝LX睫[5m Q="u}pϘ*xbՉ#iM+@Z! Ϯ~jYݬ$?5mtu] %@݅:4h8ۃtu3; ΑO1A/r R*5i&j#Y2:$Z(ad@>'z L뇶6Z8|`6"X1_z' F-я?X^ A:?1;h/KVB' vOnFS ƤQ{=kh7MwXQp\v͓O/. N3HKRlK"q^Wh1wt h@3e6N|I;y?8t[[! $,ήLe"z%IކAkRl!3u8ځy?_W)AbCO!rza5Sn֗#<43y6"R߃CQ&>[# BHǽ{vekOTlq(UH͵h ݔ8,@tՂL{p/*L"d_y k,4 G̖bD>,.ok"D;|7[.DCA#ilϟI֬Dq]+eE _-- ڰc^Lq1~CCC9gNH8BkhJ#Z-`VoMa 9r$պZ-hkh ?C$ ^tď9d(8P݅]ڶw[wl;dn׆oKd Hބ(DInI M_(5)6H/Y1 QRk,nXHʉ?>df&6^EJmt{CCc`0ʅv5x<\9Yc}106"״!֏9dl:' 1H"z'7QqɌ#KR./CVgQȬ\ `?d1yuM6Ƶ8ZX]8^pwQE &1frRKi$GݜЕh3'{;;~FK37ku<pdʎ+C RMzƏ7)nҀ lEGyl:̑IoBS%|ЕsTulebA}Aʹ10A{KʘӺtjdLI=r PRg_LbR Şl?␔)![Fo wi&k^CV(t@pW2{hxHGRn͉eCbxԉ6GQd27\ثdS=\Ff*0ۣOP5(rZߙxQZ>~GAeN-jY7Ҿn;n?ӹ"Px}/NW:݊&׾:x" ꭥу;R펔 c䛅љElmG§a= h¨BG_uYnZ쫭FYs U"zM&:Gnu.DX5Xn;}ԫ%XO?~2&Frjj8 yA*W I9/ub)Zl: s 85J>~iI3Yԕ;:#hELם[ROd^GA˩f~Y!En0~/A Km>^WYq"<цF*c:xw|͞w%ehRgd9̕v3v Dgh>>?3hYDkgC(ʹƒԕSԜ| 2Q94(?OGQ34 fccPopTYaW(>@tX4`LGٞpɄaŰl\[9c26U M6f,'C4i?W~psϠ?kAKrŵk@I|>^xs?\`,D̒5W^w DMXf_8<%|8_왉pP1Wlm߃f?4:́_Ԕv M;k:p_sj؎qw]$F}y ,b'N=o0, ~M YR46+!}@~ujctCP.Y(x׎z?70WXFܣo3z0c8RGg0 TU򄽻w"/4֏CQ`[{Ocn]+{{ N!33+5]qpj' r9FDȬ)~: 9Gmx2-?sraG"yvUpa;Ră A\& ?#n 0eed~oq嶭!!DzP^H)>oȑ.ļԶ=Hy7S-M ?8ycߧq|#5"2Б lm#UeΤVbM͘jAc7Z ]> 4gb s 2WRsKg6 's8qzTT[R[w)I95xWj #!nN+zPڔ KgTE,?{^RDݥ=Ru^zîc&D'i74SJߔ&HUG[crͦ<׿~4}څh;lpAZ%XZ;tQ?yk1+Ƴu6[ Dc4Ɯ*dB#!}e>samhG3c^8u9󼵕⸈߂UyB;f "Yi=D =4&|C3g]~WgjhSIXU"1A5Fr4{AljwTt6</N \Rta| i>T.Wo>>xϯY{緷m,J{gg}v~)]s!?wXGFl!7U|Cnfﳅ:.@mq%臔Ru?.:aBֺE#Gg'yXDuSWNJD)21ѵVagWPqȒ s?¶@g")s\T{f3go^w:^"{d#!φt},nyWFKv„X4|VB~,˘_&fjp/WԍwaO H 3I`u1ͤ+_W|+_W|+_W|+_W|+_W|+_W|+_W|+_W|+_W|+_W|+_W|+_W|+_W|+_W|+_W|+_Wݚw)mkBTxKKaD!Bjƒder4s)E*԰)dPf̴t* ;kQii>@N?sߋ}U*"i}?%jeJ*7Jci{yRԥ{fZ֡=]zY'uy³W3=,߃w?|`m.ёj>+ӟ?Oӟ?OӟoXT˫EKњe4vDAYmyJ&^-VDNe:uv_zI5{^lwn8v^7_}U]}<'UqPeĶYU:Mɺ|!]## lgYF U>S$Bݵ٪. (xR2d;U!-z 5ӅolWѣ\֡Õ::~y9iih8$rЖ-N%&Nղ g(;f(ՙ[wxv|<-HIӪ5:~yJ\doc tSrC[jl$+fO5-Zb3 U߸/9n?߈6fαc?c}=>Zcc+߹Io[u9{@GmkBT xoLUuq|lsF073l6[Ѵf9C\&#Qi4@Q+͵\L,bQm. 1 ŧ߹Cs]vwy{SFddfVMGKv:iˌӧ= SSێYv%mؠ˥RS}ǶۤeT=jR?/+N+ڝOo/2WrL:lor׉:{Rʕ}NLjY?bε9zReʈҴbrgZ;rWR+2;_z|||MNLIz~FGN_L.^Ԭ5KsZ**?%E|?͞sxlFOf),0@?}_ȵsߘ6[)؜w;^4]5c82qG:Pewnl6goӰ0:9u}ʃVԉ^;kWBY癙iˌfX^/2yG?_ hmɉTZEG+>^U6iVbqmylfeyf2ag"#TRZ%s J{yGTp(~ESoDM-QNK_ɓzafQ_FO+a\ 0{@L;fXaaZ!9fzJt'(=*JڗhnPV?^'*:gt~GGrm̌.Ym^4~gәO9uٞsNI P\-ow͍*-ݦ~'r@p1IwCBٿ;Yd ~:KWf>*JMk[iZ~irY^hyf Qq؏ IDATxwuU=y`9#AE(Q@]sFwnw{wwv6E""9 Hq+~DOp'QOCOOԧ^wK.u7n܈(IxxxxxxxLӤk. ,wA4z<<<<<<<$JD"aVS3fƎF$ԻQWdBUށ #zSGeH$8M3O=<<<<}D=6cmDt#,#I Kb-,۶$F'_"ͽ@4!ksH]wō7`wx.] {.FEdYAdLϿHaAE$%Ю}{2i׮=) ia66xxxx|- "c],^0G)plʆ[۶ lSRxgٺy+f?-zM8zC 2O:̞Ovqg>uʊ TMEOz=*sԹ CoFvvGdY"5q/ã :x ,^.?i3gsÍ7 ǧܲ,1c4?g1pž~@bJEE-ֳaGA=3&III!))dD"Q*+*(//b 9~(~H=9z %1Q#z xxx4O{A$ X0.;1CѸZ]%2dP$Ib7q4x0H|nm0 .^-EIcM$Aqkr"( Fz۶b,\ץWdтYFML bYe5{xxx|u-(( VR 2D8f^Y[QqXCV,_Fjjq7#GE"(eb_=Arݘs8׶MMM'۷^>nj lG8M<<<Ґ!Co`:v̹,A*˗-ԉUUD¼?q`>NfңgwL~@uF-TUw^0|]t;YjY[=<<Q1 [6^ *+̷G o1%ѳ3fW_]vdgw",Ƚ민HΝy#IajZ$ןC{Y[;z3fJ<<-Z(myopϔ}ϽDFu4cO>3X]^y% #jw<<<J~{K9!r:5?2:x-6M[M(JȊ’EXn > G 'U~5,"2r(~SUQ/8th?M<<<FeYoLW64MRR=a/[̹|M[M Tw~>.ݺ6}us&_ak{xx4ׅ5zͨѣ M[W%8xƌc/cZfMEm<ވ_ F0eپm3˗-Wyxx4>ׅ*>XAyYS$5柍sޝJם|ncO>K0a4ɘ뺄B:;ssy-TUA'cKtU8yk׬f֜ @ub3Ows`ATʅ,^g&+;Y%0^ ]IIM'bn.o* zq ( {_a­ջ'pD4%C&#GcaYVkD"^}/=ls ÈS|r|eD#n*A2 $`wE[zdwRYQΎ[ Ԗ1箸YQ$7^},^"P_LmFe-&4(2{ü;-^}/Q(,,?J8BEEE0[&L"%5,Oܡ (5(,bKkvޝC(r]7٫bE|[QEj76A^럘+<䳈x7#ց(J S']lۺdJǜNiӖ4ڴI狭^lY`1O߾H"&WSQQ#֯]C~=v<=z$%%H$bc-2Y&A4| >+[q4 d*nV~ss":MR.$S,܇WO9xBm' oMR<0m?1o\ jZ*gy?蝷lti1UQ]>dŷ{bp8J(׽ Jffs:0n^`ӆu_INNWL62 {BC"<9b_+hekV#R4e՗uG%**X~ njS箄!bu<{;{!| yyyJEiYSEQ8r0зL.P<6|8|{>K^^.o  :Wmdt慟V*1|(&q;yhǫ*X=nHz0cѡc&F.UE$QBU%ضOv'܊(Hnx 2j~o\?AW | ]Bt4+f_n_~455@}*oO7%*ʗv GD:U ^I]yѣFRUx7`Pc]L9n$⢩eDzůw/IB/O!@$s8Vz<5@:;?OƲ;I)cIJJb蘓'ʗ z]m#80 sQ b>ו z~"YX\#Hh_!GuaSw`Y.O (<]^G~pL aq,\\˦],Fp/)mfLdon ~5he|=O\FnR32p4Nǖ,$;t]s.L1EMrR ]uo;NrV Lā_)`"_=NC `DmґF/奥yQDQ0/pXqZǰuuK5b8`GM\ǽxqD\ƈF9v0h1P!W?xԴm>p]Mp]ֳ⽥՛mְ֤8DuI\ og0s\g%c ^/"R~f29i}r7pqaSh73""$ Ҡ"_iD9~hDGӴۿיS'8Վq{uޗ/m5ncՖ:| @8e6l8/zR \ $&ϻ|j>O>,)f!mS]ӯ_?^$!䷿7lS[uc?2IM"9$`&",Tڏ뎖K%I bʗjt IUm_5e޵l4U#;_43Xi[)n 5 |a=ƪ`Vd I5(bO%/f.>@Vv^{%\m7Ȳ$,]WtJ #yXa^ D|2]Edڎ?ѓ$$4K5{.CƇJg8V쐁F*Δ "@BgC+ CCaTX3{s~JS >Abƽt *" ec>6Jghi! \PA5 &aߡ(ÈLRq˱1kip|T" UUl_?}Y I<+a6jaÇsyP|J07xc q= Nv I=ۣ$tu#jZ`ND Qq)"FusίЎ|Ka]8]{wwrtV\:#}:F"n|ݍu\W͐凿>/4lnsnC)~Ĝ4Y$Z"cTwa}<^C{ f? 2vSy5-xp]PF'h? Y=T疓=7' _('떞؆MѮXAHLG{)48."W% `) ^\ GI2B586ŕhiK났gЩsfVz]- UUݿm93~,ᐗ$4hFii "IG?E-;IJJ'̂o1}l #$.w@$@] J@%1;#C V)DϕrqQ$M+PTN.MT}h(;tkr^\ 1j`9݁?ٰf=xMP\Xw%A%o&VUc v;;j`_eQ"D\,埁 zI5e!Mǩ8V m8G)9p@$+- )܊8EűB\xn8S.l>L(I*FEp~8N5mlݼ,"k>jN>|k6ҦMϚò% ɻ-$ϟ=99O!Jʯa5?= y[|Jr2ȱk1zq7v~@M=qt II윎m"mGt%{lo䀏gIޞͰlì.8MzNPO,||,7iɱmt@sg$?,DC* g$A$vI'_A8|׾ǎeLaԑHAGoBp IUpL'dOCʼn"򷞠.t9@F'.BR~Dzx{?J~YteJ񷶓?>l3րt 探Q=;.T*1̹ ;-(ddԚXTAEDy=k⦱8'qW)ֿ1mY6,Iu\ӎppLٔ̎T+DzGZ&mvn?>/oEY1K=N]۹ti#6Z$Ӌ$q,$) qqJ] G;$%pqQ\u1uchY.9^BјU(=ڢIu\;Sz"g Z&箁z;>D!$"dIZ [N`E.;.$)Ϗ5k1g#jrϽc[˗-&PZɱy4gDQDTm[^gL4h4j?1MǞ ?j .`GMN硗H?1yT/#_jjg `v*UgJH֖4*r :]Lai`8;!2ZZSȹ{ rP]GuťEIҨ-~h CLҘL^1~6"J"FtEM1;.KI:#HjZٯJݹ(j;]K,m}) )}2Ⱥe.u06Ǩ=/$ Om}IESrx+).d:mX$daV˧ԡꀒR[Lք$uihm9t/J^_.N88vPܚ-D4v8ߥ]뜃M0;q=h#(rMK}Ȯ"><;~&d}]dM $ b,2w#S A,e==yʅ yߧ}FFZbwGI{mxhe%]7v8M] #3 -1f݈}f)"W' ѫk\WFkJy\8SΥ}Uo"ȒѸWG1~8>^߾ڱ<_W 떞$umI^-Ktp\7 ]ґH1ѽGOH1G IDAT2,xG@dD啗BqI1|yڶmO8i];Ï>Xj+6w&.Țk9HDڣ#OFv5 ("Z6J%#C WΛx7ֺ!|R,g£~aXL9b֬Zv "_$IHk( wޞG8fC!2śHDWLt;o2P0DKIeۘ$whOrv= "882{@!khMMٴSc*,"bY&iI$Q@*_dT$UF>'(~%v[ʜ\nD Asչ :,8l68NVQ$FU3KKB$ʳE%!έOiBѾغU[:z'sqz)t,uz!ի83y$&&֬?KWu]laܹΪ[Nb`%6Kj˙RHHUm`GLJ^c701"IcX(JGթbJ\CT$a?e/,\`"JDEl)zIu|GVd_8J<8~;qHͣ^*[6oaT(} A? 0?-9!.H(@B< 5!qdPv"eu'r,Y}C4Q'ݻv<ēdfezb~ GԹw3^G/`0 lʸlݸ`{YP<hq'qpG\ǩqx8י9z2|(;h|4+yWtBf?v%;_36tѓ7^}QlUM׼5N3P7V5 f8 Zݬ͘ɡo^Yf8'o2uLzM+.i3d%  0b;Y"HMQتiowuCoJ8yٯe(̜b8q UmMg X3_BQnx;@/'=,TWWnGv M4=Eナ۬]v,؉@F -{Gce3f}fN8u((̼7^S۷͛ȣOJ5!BQn>.]xixYئE6\DVV1zMKTO=<.ǶdnjYs(TUѡctKfÔfp`^<䚅K(\Xs?^ґP8N-yJ̪( '_aD׿❷@Vjx\O㺼_cƍAףM[0蘓&h*KT)! ,נpD3R}<¾?pɸ,^ђq]ô2u*yٶek <⋦*,Y# zM7VQF9FBeRhA$umKc3Ҽwϧh(/irXt1HR[5vlx' 8Ȋ3d(/+GQgIퟅ &o2O"Lք^th]m4lz QDU54Ξ9EUUe 5;GCN,Y.|n6CUU.% 6}۷m["eAՇE Ƨ&l>eNu%!)D *q-ײqr25ׅh84CE4MvG?@0NNN'f}8-k {?߀~D^"2ᕗ0x|ǑLɯ/ٳA4BmL'(s{䠏H%A%դ׃I1ǷŖNʼnKE0;?W8YA#uFÐn$55<8u83ml ]aŨcYd!zF$ P|6v5aі '޲QοY &A. cR b?,+W,аDZQU)Sgń#f݃ڣ|>Ν=NJKxp$'`Y^kqEab{ؖ䟱f D@Ď__ÁSv""2"%Ѯ>72* _OyU Haŭ"nZ֬^칏0``+ZIt֍.֬h~_Q 4V` [6|$hY ira(¦3je""R|JO4E{PӃHmd>JئIũ2*(|ǎy}[0 86=Æӿ?^k&udY掻ccZ4ڬ]Dѳ&[&ﻷpwӄA.> YS@-%_A03ׁU QcT+9cDs@"*3dZcy 8>@8|eBh.]:1fx@[Цi>=c<+EXBj:pk0 aG ۶l$D*Z=%Qn8Q(aL(55Dnű7aTDх3KIEcgۇYN[Eϑ1;]Pu^Xѣشq=s$}2!]7ud**ٶu3``7 ['Fuu[6o"44DžsϚSqσpok>$֛$~mA;$9 "!׌#!^-E9~qqR=RM"]IAE[~ y,Rfsؒdqimzuj $I"T]ͻw)ptmԴD ʶ-3vt7,6rm|z%EiXQ^E DZy{k qikϣ#&nǺumn8pqפdee8kP(T(`i$|)?Hm?_~˽ܚߪiB17(,]oG FO،;ot #ڰ7p[neǶlX{WX4tܰmD?'Nfú5=Y#ͣz 8~ʼ_aO$g{͇ 11lAt} ><4P\mtDҔK[B6q I(**b|/BZЦiұc6;we-ٻ]8S/1bhRRҰ,9p>䱧DM7@8e̸Xj} cƏetU.tQygػ}]'vcd(]In/6 oxBMx5N3%zS~Bl{GQф8( Q5Nci2˗-O~tޝh[nsSa09Yt1O?4U7WDQDD~5nq}Ӣ>uEdLɢٻS֮Y_^z(a::Yܓń'q9VM7qxǭL>1t'' 6c؊"?mCGջzsC4MfUzMö:]Ox.FFeXz3`wȻˠ!7(=9,ՉFAR$#Ocʆ 8'"ط   cX $䤑F|J\Pmu"KQi D*.9L#B\NH'荍 2~KSBB ?w۶mw;&OSgNYʙ)JvJ#c[$IĉsXHږcUIJHB6ErEցԆIy%g&\r3Aur~i^}Way:}Zg·a[~?0x qK͢^\>6hm[TUZHn]ޅ)`߾OYC>>#uN!gKV{s1-DU"}HGRfRY.[ORv8vTwƣ""˗.fQdeg+~)el۲fdر|߉(XYP瑿 :{bqB(9)ND"RfW' (w߳i? 0n\*8Hnp{{=nIOOǑby? M-ߊ,+񵗂 O¾=!$] H爫 HȮ(pӹ ~HLLDQb}lD&eɛSK\ ǹ)C ca+d]ݾ+QVIkrߚ{Tc%r9m#Zhf̞Q?$L 0YU"hjh~Տ&kXh#uH:(Għ7O׌~8 +J4*XqIvߏih]eN}uADE~?ܸ5EAKSTPO?aTWU"ƻJy['K[ ee=r&L-hU1&9%/ۯoMyl݈Yw]]uHk׆;'˚u9~ kT"DHyD@$2cWG\bqHgW C{OSō%깎KR)g0\rwkc r. Vqqj;G#AJh$AQPU Q ط9¡Ǹpt~v'OE)8qxs}>Y ns&ƈCI Ú7>:M2 E$pƑ|V.x~Cpugs)fwēO=CM"B8bUzAU}OJZiٴj5Mʛ88 *e<1o}fczMffzgk~[7AZZ:nfBIMUu5yZ\5=.=0:`TFKD$lŠx*22H QPBB 疀BIO@](ľd BMuZteA(-.@Ep]]`[`B\_e~Q"N8#Gx..^#)=Զtߏ62IHH48e8 8V\] %>QH8 a۶ GBqtױꑚ1-Gsz "EEܿ[QZ.oզm;| [=C65x_z2'x":4H_l[͔h<0ͩg9w<ɖ=Oϖs9;Wg<ݟ,ܱ$g'yS%LX\bn.?6Xt?%k_gĐZ IDATQhU6?֋e[T14K"5ͪ. I>ɵ+yWӟ2koC#Ō1CG6{t:SϽ/j7?}ۤSY<4 &'&裫|CC#(Hlz`(8I#[: Ӈc[:PjN%))u3a #%5I4}7 hcC K_cm{*}o;T2<ʣQ^>|/=燇1t߸;}Q(WPGg6rkع MW>YK{\x=c|n~|"W GQg71zm{twOYP .L񕯬{9wn+W:?^XÇGyJfgo}äfR G\>_W'w& ks15jSZmr,:CbڡsGٸ͉} $sC7g:ȁo0>=Dg.4\&Nz.kS.ghw~ljw. gdgCLyǞ%J0<`֬c#;uƶ-beUʘ 9`x?ٓps0 fqx}-)mkv)*&yeJ&=M0}UJ8~Z)FSp4Oc󚹩 on8M7~{.2>2HUd)4]M=Y _e&+J嶁>?ma>4MǶ-]>aؼqа.qMILqtd2)6n{|ܺ]OoDټ}?u E-㽷^! csqaN5vl<^xYnfldtjuUu/w؁}i[;8q]V^d'?5ђ>>T*AEeZk̅MӘM9p`lI4myL&0H06;Kq)*"kMZ ;o*4\eKt E필jq6eLI\h~ό71&41v+<Ƞa߯8ϧ.>a(LS:H&pѨIMM$η.5A"E:?8Ҽ6|sKSlS`5tS1p%KQN(`?QgfJi\腷)/\gF.mdU*lצn%!hh!7,A3D<9I$TBU 5MEM x(ucc(%-|ql⃷Dxc52:4@YESc8MҲJ^ypā\>T6z& M=npiΟ>iHƩkjBgXն~O=/kAiڂ4} p{Y8WLiyk7sq]9ų'4|waLpfUz\ \Kg:gc PSD]c+C=tߡc#L}s 3 6 ۦ_yqNr\ʽ)'>ydlV (CRnÊgruˋ"݌ƚ8eu3zrg4+#T[Lr` sCSj)6o.>L&A⋍٬C,槡!BI~V=4>e=db#@סY~1F[G Wl$붇()7u?hY rb|Jc΍HL{X߼P p}πצQ*JʰۏZJN\CCq k=tu1 O|?uP8B-*qjftg?%|.D1 gNu*XNY YҰ+ݧꧡHrLJsSCaNs\Wףmf\׹^f[ /R//r'džmha|l g8uq= C8$SB0űU48p6596}>j1L?HkxS_o-k7+d61͝JιCYe5Sx5&Lj3>:ȁw_crb,12K dffxo{mkE] ;Ry~'lni ,hxܰꂆsU"u1:Ȓ\c+TFN>ۏtn_n97 fٛ7mO'kx@I4Űnr<*эxUq?27mܴvٷW^>r!UMLNRQY˦{cblX9CWYn ̈́Btwѹ1.=繴p}B8E'~KOf6k&2{p{{M<8HON tO6b/ju'Nu]֬ߊZVo ZRJ l})J+-GG$ЅG4j>W lA:$_ ݭ^b׽_܂뺄Qv<7mӲkjhn];W<6xuؾY@ñmjns]ǡmofVꚰ݅;MEU=UMs׵ٲI w=W_cˎ'<DZYն՝y׷I q_t]gr" <3A&4q.\ #^_;)/*>,{4P<Мcqoi[Ƕ?48Tҡum1;q]=X)wC]x>ɩ'H(yu=Js'-2 z)rdsښluAGs{Õ]ТButݸ^m1)k y4&.VpˉcGhk_C[ \?`"Av49?"p.-4씅O'diTʡo~9˕]'-ol_{GgjhlvϑWJ`lx.] !IM)ErvǏRÝ;-գ2AY )ZȡvC5M aJJ|dCWJ+UԆ EmcF^])Rj[JA%  5J˖ļR ?se({~[s'Y}݌I79t`?HV`n)=p<`la5 * sOA^;w6޺oG&;y~oxa wd_cyY5~wEv2M#CV!J4?y |OeUy-+ tc.N&@w8=-mX4.|8Ӥ\%N-Z);E,3Bp\$> /iɤUͤs\#m+K">,&0H&()-#p@b|\oDB,"۱(*)3?krt$G^<6 J.z;=s]ys%eyr\āiE]X>ơPRRJ62&PX<ϻk\/__{>R/+D^NoyiI s!&.V$9{YXq~IB@]8J)x'pY 'X$Ŋ8y8`U8΅˟,[BR榃 d|@ss 1IY.X$З@70ǙO4 ݧN a0:ϕ !D@OuFG'%G ! (xq (*.qeuH>;w=+{J]44#9;Kkj3C[j9ES<2K}O]0F<>Æ ɤe]Bg[J˿Myu(H Z~B,WQQYLa? !D9E83t ۲PJ-z;硔bǞfRxK顋e/WlԒbEt4Möu5up, 0 ۶pϏyy޿wC˞i\rP(LyyŒB,MdҼEttn'~R <#>3E6a6ܩäft7Op~.>͢iWt$.t1=9?">3ɹ#IՋ\ru2?.=@  w! ?H%ggCW}GxSG Ebv6Nn328}|?w"k7cۉǧ))-#Jgg8\<{wOPYӀRƒX֔Rx.\8wU-KLR$q`u0Ll0QJaI-QZVIǸx$ -o/ }|WH9mvܶޫvmk70hXL<ϣyU #a.Df2ٰt*c?"V6b͆mT5sa'fҘqGfӘ>?`p]ߏ?Dc8HeӸpaмj%υ(t]Oٓy/SUȆSTR}o86ULO151B˚ tt>B <׿D*A)Z.ulm݅秼Z{in9tl)pk=WԔ?)E&s5ͤSI*k{#B4Zp#вfibeUxGv:~K<x259FIiaPQU]z+A],cJӘ?<3&d҄#ED%8繘 u8>8ϷIeK4`-d2KsL?]-;[T.lo \o"y{cG+vWCTd],cq<:KMȦ[NXzNc| 24p ϟvRxw/H%gѴKQ qJid6==Wi_{,0OO֏1 SKwN6FKQ q>3]D"Qk:+yhrȐ-P:q %Ѕ+XvRd-kz#B,ubu1fgX Xv CghpD5k:dBHr^cXǕBd.BTR)N,+J),˦<6m%+U)t V4] Qh$Ų;Rw7KضΗ~#R0z Ӈb@ˊ \^Y, ћn!ᬑ%sk Q$ŲN*q87Lӧ'0=Y@bIDATpaOo ݓȌ7H],>ٳ0 f,K-O.UU!V.?Dsseb"ѣc9qbHo %ۋujkÄ>.2bpE|~? ض'~~#U\G?!ϒ8F*`$7ϧ[\g۶ d) '.M_/ͫZ0 M-[.Mq 7cz:ϧ1>&)*2 Hd QW&qhlr(33wN%CbY4L>~?O:-a|tt}{%|󫘙8~|]W47Gxcc#GX*ƍe}}R3>.DX4McjrqVYepo Mub>\b6T nn:@"G], q9BXrZ[|fN#.Pt:κu2"^)NʽL],YQJ\^"`45l齋LuMd.ΙӔWT)ؼ T8yN#ˌ'Y367E,p`BIR IfI7[p$cGxkh4J˪6FGG$Fa(h$RJٳSDhE1+"t]0}:pi:@.2(MlJuy?<4Mk&lڒ;RA)i6|yr22똺&-ĂH/M| H7:¾ȾwalX*AGe%%'P0K9USé\ [m[m?}_M9PSQ$#Hz8ř3]tCTI MTiR aS< BX)j:ө44uUh&B'~/_7_©\$N/mJ G) dy7`xG&uyN~<]Q0h.-g1uD_9{ D8+KO.iٟax+9K[M-5?+O/",B4n9_|my 0Mav&145 x>)l&Ci$_>۾}8+燇F)q=]# ! ]RJa6~̯oXAG"|7Ž>Kok3p= !kuCut.d@pm_=0 BC>?Ef?iH @$ P wz4h|C!?B&|dbE@G p=/~ @\0=vCzs!J";W]~uB,zS ۲r|<!kYL'J1H`۶B,b40f2L34Mri7~?~m{_K5BLcǘdr~Tj75n`+cc| z''#G ݘ7b`zF{7'a/bu^,/nΜ!cY|nf|]]'ܶm LO< sw0Id2{"Ν6ny ]_څ9?DiS)歷J&**"RM#G6>ΎUػv-yZ&u>O#==;Tʞ=hw!P 4:ę!z{-p}/u67408=v{ !2"=EVp}}a*$m|!z'&|3 q*6Z[J)R1ijb}M &&g2$NsadT ]Ӱcuy9ϭ]#MM\ӧ**sg7o(N) 8ϯ_^in(`;g{{9C"vbx*zPnH8'zzn ܊qed}}ԗmfiz&&6>ΥQpߟA!X$VQzmv.R4ZQ^<#`.QOttPrŷy$-X֊\͝ +uzj`mS.p TD~%8B!:kkTT S?*<++Y[]M磮a005E]I k*+m,B~?\^ڦ&h<~qMcrv\]M}I #8GFhJQ]\3ZZ[G! yuSSjiի) Udmp @q0H| -xilkn]]|1R,PuuC xGi$B"!H yD~6.EE40\0uו?Z'ƞvs72HP mS =ͶP_i[oqitH&) 5iVYT*_I/DRdi]scBwD{;B!"~?( J) M#o!x[CӔE"B|aes*Q>aazWv$`$׬apjUIuQ.s'% b]M .c}ri379ɧ7n֊ I57]۾fBH/2'GssK}y_:`VW\ULGB4;-UU73P>_7])BnnLϻ^9.  u+FnL(>mu&-{,!R|jF>Ǯ9BJ}1yAOnޜ 4zsOgy`YGs?{r;G?7wM ֭7^[!I|I|^\]Ba(.xk+Kzsyu|O]BHqrc4 usum;?5XV8N\;^*w!H !@]!(B¹R ݪX_N!V8/ŶmS"odB`͚y鳟?y n]\Wv,iBYE$wNԩ9Sf*DmYxr’#.+R uJg'nzMu9G*m-u-cgq]W}@Bm6J)"b<%>}8~srשmhu= j=O t!y^$&0xf<q%8i&euT7QSD0s`= t!.DeTUWȎ]|5ӷ>̩PRVu[EhJp?b-w>?@0/ q]MOY(>1$ЅB,yXVͽO>瞦ouGT6}+ӈ6e5u@{PYU?bpp0XBK]$ E<=%2(--ell uswBG )Hg+ -$΢$Ѕy&. RD"9-m$I4 t!DI8%%A\o6ͫI̒LJ] 9Cee5p}K4+k= Xq$EAr‘pnQy k~x!Ċ!. 블UT E<:vb> t!D`:f#/ 蚆i6T C0o'oQ󨨬$I?!oXݱ@ z#tM)Xl tQ0@>kkB7ŦP t׏t01WJ&V0 {6RyiCLggdHf"'`3;*`j64}C]mldjA"|x=p8B1i>]Z$3S f38ⷣ"$3LOI$fqTtxTFY4+C&b*'c-HRLd"Dl۶ $~tMTW~e< jJgtCCбΏ/^Ӝ4r7/_6_b!t{K879|a_?a"v7]M]&#|Sv>#G7q\>~'/["qWʼn}oyU8.cרKe1x$XW~Wcݒy(M)Xym硔[zsmJ־DF5ȶmQ~, xz}sWp<-/җ;00pW?S@ |'_I<YRbRwޙ_Z\zkGJ=):_r}w74 F&&fx{ _٤+hTo^ХONMi`<@;ܺuKݳ세wv"?###Lݻwo߾sU֗:z{rݕݸ={TWIRNІ|Pef}+V?P5E}뫦/"ׯzUPV^*ȺXѷoՔ뫮{IVU34h\jړSz\fƝow] > Wӗz ˗ݽVA}td]Zu'O޽{rغuvNO\z;=k{yrjV?¹j[q0.pa\Kʜ=tqIEt\.u_1Nia%˝;g2V7mܾ}DIgz;|Xޑ]C9ԗZf}֋_CQ?krⶹgLN{VקzuU{{$L;?:0aNNXҎ0Qp[zv=SSb ЫcJge;%g-ثۆ+akԬ*vG-Aƍֵ^U/!x ^-;։\*:~zg7e;%7s~ԎѳG_.QoAUdpXq0ӷzvvSKhD"ßWZ ¸CS#W4tWRg.oV6(C^˻+aZ2΄`gJKE7w%Y&k:H7֤ʦ/U_bjx^VJg=A׌363ŝF4]׌LqvkSO=e';կx'"r*wkvP$^ NE[Gz[D"ctz[nc8姬J\.);/Mtd1#:n6D3N6:K644u 7Ο P7_@K=8iU$$츾# 7N=q֠׫R :]o#z!>W*viATEއZ1㺠gSX\$\>c`'D]osuy]3!vK7%Ew-cU\xqCG]`Y8#$ǕL4 p2kT͈itڼNԫ8u8kz1zR/\XZϔWG:LkRu2-qEcNef|It0ΖjrFJ/lL/ٴd/ i@XB'%bll˘qgG6XvƝih b;ҎOc k:U WuDc}ZŪq R}jqheQ_jǸ~֯:گj{Nu͌ӧ x z-ڰdy3TR$i4E3IРy!xbwf̷p٦T`ń-qi:),߲ڎ%|Oo\5^.U)_V"1|az=:bi-9oZq*%鈖鈎8e(O}ҒqRaZg;Umպ_[ g䲊Yګ yj{Zrq],kqݑ+~Vqпak@^Bp.Ul0j;XUA;gD3p7<}|R8aKxYAˀG:N͟;^;(Z2ЦMZ;U8U@X¸8V-s_Lq ;ξœX8hAGƉDB,F;];|^pV`o"/`{ZZm>tJq]YB#͌3AqsU#ű6S%%sfIs9Jvo[2Nbdj*6!#MXqBە[=-2N4v:Rl ?M;[T%x2qͪ"!ne)3ۢoRvZ@' v㬝fy&N}ٞY}1dm Etd5#jr8!_2%8Ť8kag[UHq %qq5c\pDGf#3eHݱi(q0.:vK>`Uf>$:s袵)踎63ߧ;?_<z/$CѤA\'ƒ1f.NOj-H~gAңPO޶Sq-q~oMI`۶j-Nw=31K%#㯜. fEp`^5IK+h` LIK&ڂDžV0.  ",i`c**j踠LK-hCDžE֎v$X;$fҌyդ F.W+fĪP4iFJJʜs[^xRBX5 UhF5B :@X2\qA%`#V ˕IЀ#C>. 8q҃( U0iFK6#BrX5tUhҌXX52xB.:,Q;s`ZX0踤@ q8s`΁9 EX5W ʴ:&Wmnq /e'C>|8q#MM؈`qwcE;5`\2%V%V/b` /b|j.v$ : M2RH1CNL_t(LKCb^5t\^At:s֎." Gdڑ-q0.9sQ\a^5 q0ysĪĪĪ!qəs$9ʆy\a^5 q0.rXXX5b\a!84c΁91qɈXX5't$0"88qB!VqD[Ѐ|CѤ*jN萏%`\^A`\r|8q!qt[Ҍ|CѤ*jN萏%`\^A`\r|8q!qD[Ѐ|CѤ*jN萏%`\^A`\r|8q!qt[Ҍ|CѤ*jN萏%`\^A`\r|8q!qD[Ѐ|CѤ*jN萏%`\^A`\r|8q!qt[Ҍ|CѤ*jN萏%`\^A`\r|8q!qD[Ѐ|CѤ*jN萏%`\^A`\r|8q!qt[M_PMc5k&PYA#bpȎT֝t57ML/uo館;yD5ۣc6]M9g+'O'eZ೛8ԩ~No22RMxdh@_e/#bƁnh-)뇇nx̓ M =hI2Oy`5dcq@o ]^L}8I$Qh1gWc"@'JL%$Hs PAe?|U/?(e%-eӿ]>|{@w]ah)u_S4UUSD@)L sV0j1'၆Fu(h9j>xGU5;{ث|dT+BfmA)ϩˬNg4ѠJ( YkD_S9r[+w]V*\چbŕ 4Щ CL+mW+scdM/>EQ|M7$)8/ y3NetA6BZ Obgl|~EgGxqr8t}l# c2[Ãy` -:9cC(Ĕͷ4[}k0Xftt@2OˀUx:Qh‡4̅}komǘ:elo2ׅ2 a;XBC?WGS7qv$?e]7[jۃygt4խsx>- y<~QzEm.fvZ6sԕN5Swœw@5eM?Z}Co%9T^ӕsVU?D|WUgxtܫ[^!z!%? pBU85xg:8#_\v}M_e%T$4q  ޹3/^a]qF ?jI ?N;Lwul;;uRnoϭɐ]@R8ɿ}^3M%cg]D}|c_o<$ߔ+!p!8ײkZ~_؝# Rm_h u7E17w~gמV>kqGWEi^ok$W6Jq`tBeq%ؿ/^)`f_>5~?֮}la#z_vt6 zxo` M1[/g_l,i m:|6#hj:1=5Ocf;,{u8F' O,"+,̩ݿ$ 򻴚o^5>94A>yōVsMg,dUoC:d>\s \s%$$nd>Cse>me>\BBA:d>\s35ЂHmkBF)3`mkTSx][sƒı%˷d+/ڧNQEI. Ir^\ r$+߷g@(6DCbp랞ev'ڴxbXpz~LV>lKU`δ& }럍>#Յ_;뉲 Oyt_Ocbzxr 5Ps 5Ԏi}:[Нw;V:>'AiG';T?uD[/=7ހN[G ;'M{rNJl JOāB۴O *:pPBgŴ2!CFVv | >]@*P3Z%f1Ӗcپrd9بRl-=E-`rL.Ii5 7nV4Yѳ A2hTʠQlqhv@1'ṬHc&9.莑B&CdlbM4\e0 P@>_>RRkr(aY2zO9py> VJ>T>'hjF`]Svk I"D2='-Ww ci8|mhtcĠs/26KhP1c]ĐuG)4()вZ6Cf? J0V\9d(RCQ+&CFD-HIx6<3 䙧l^Ɗ ieYd訇 ?r0d!a'[=CBh`N%V'_*e,HJF -(zSS0#>cw@a{J:N~SM;.)sLȉKŮ8Tav(([Q'MX9Y$S!^oo=S%| 'LYGTL#ĕ1qN%KZ47ynՉwy0F8 !N_@ЇGi;C?!FʇK`?XҠk./bb\ 4Y|J! x?' T(d#i6Auaz|ǁ1CzQ/ܽ^852Q<+_Df3"JG&TT E)`RSnFP u?a?\SR1,1̊|j9f9pC $ @}>S iIbۨȿ04 5e)A-> erj=hǩG@JO8Я}ޠ :a/:3cd01ʝRҥQm6XH>;)ʰVǸSw#-pi#8ː;ilr0 YέA[E*d1k!( ōԳ<+i7$>Riluvq_#]zqֲCi (MZ;"ʯE'DY!!YeDk@! "<.XOQv҉ɇN@HW<RIvYs: SS^ 49Q{_ݽm#>򸉽:COObw(McUZX_uoN}_L\,A,U֝U$g֒+# *KE9gΩ&QITj#.>!2e":!>PVSMd*hoBk2k5IgMk%*D#^Y;oDVx͝ߨV]zlrSդe1iYHK,|0?8^MZ &F-*"P*gǫIarji.=/ 쌳gTeɲY˲,rYh2:b ]aWՉGcrj9SVwĈqV#Fj21jUjijgǫIgkiUɴug*QE񺳜j Dö"5&QYpz7TlN}Fj<e[!ioF⛙6N4_M+<'8G?[41ɐC=6gk{pe=d]A˂Y#YPlW¼ jpnh-o-;;Z65vޥK5E~_BlC[f350ei6L[ `8r<+YD-(-4aݾfV?-ڧp<UK-ڰІYJf`ZJnjYJ&K)6R^uslv"͐mtI AF+V=9_3}ͳ4]΋; Tl,YC&-B Ȳ`Sǟ, ZCceXmaf# k8E=ѽnqmr}QZxeg ݜ[4L9(sDZv@(#V3JC;g] Y(6˯wbnU1]>HuڷNl^'i%3cZp΋vWuzI:iI^nBI{-' صKx6濕ҠZ[GUt'F8ր~,:5oS7f}Tg$HSę3_V=?lQ'ÕWl ]P,=+"8BI3mzBkYsׅ. #qZ=| M\Z!쪨 К Jes,v1cLMx&\v$tzfלs?yhV0J]׫C ,T~;<;\pj?vpev+c- ,%FII eVί}ŌuZ$>iMf7C325Vr#Rk$~wH >9+.Sx.{1ɏdWp,lgp ۇȟ8Ƹ1%=Zf皝V5;\7"vDCfe3]3t5C`>ܛvf3ȵ5C ]3O34?6gkή9{ٜל]sv8{sod{3ށ]s9ڬ9蚣Kd>b]3tKghf蚡kZ_;f{ʻtvi"XyW}`z]5;ao]w5C ]w5CW ]3tW՜}?8^yWsvE8k\yWs}z]5G||=+j ]fC,<&2DLļusKogf ?7KLs!#Xq ?#_oB`YvBW^{%SZ;뵶j-S۞rm1} 7uƆ`!ٱwFb?֫&vf֌Och߁񯠏 /k,Tr_/}]$r}ΘW?)ΞϻCɨP$wMwq|O\ult#8,=ނ[x1ɟ&jzw}}}O#eTpTj9,l%9j㌀" CceiH1ѡ& ¸n9%kv-Uto3qnNRq@Z`s$%*d+قGd|vX&/S+B$5p Xa'v Pfxgbź7 t5#sit G8bB(=Ȍe:r(9F,^՗LXe*' r]9 B7>&z kF\z&g$(Hߤ罆{gX-2y%yGxɫR 7"F)'?e[V~H;>IYwJׂWYWT¼'>"Qih#f g@q0y}O$h?OL !>#C%ypVegxuHQOinSTi$7\;aQSy=hVLgtbG4uO.,[3Z}zлKSu+j\WC]kԑ}GxU*lAE;)D%Wƶi w/rպtr@Oc}X" ң=_;Y-{[pO=9KC'؎َZUugq /ݘ$4Z]c*\߈1Cg8Ϸ |IHlb4M!kWوkfDMxUh9 ɑ̌{g{pv\W4=z~G?d=Z ,BJb Zd(׀`DI:̽^ϗoGzOڿJ2W JWa+f?GsKM7M}X40};qؐ ք JD !FЂ^/_9eBzeQ?+֮hMe1y=pMJ36`cZ^*WV蝢_\7k6R6\߷.{>IiJkuH E;տk}z.ULZ?HKqg*larxj/|arJdPc+Źz!A~9{ Aֻی]rwBG_|&N;/f[Ş,.P~"2hFe:ҟɥ+#h옰sRyn,mZ}d4f߱ѱլ Hw22y&̛oZٻ6~dq~E6SseܚUZ/8VFz80~..GmKM$Ҡo|E*d$2=Hݝ{4lϟv7sd7iI׼S'DA*/pYk'3hP?Ot6OiצSz=Vws,=̌d.;/o'pNx9S!bpO hapY̍{Ix]=a=twlz&Hhӝ+靝]Ӧ6^7UtO,,)+x~_x :oG]B?cG3,ڬ8vxn;sߎ`p79 ׾RIj1УXws2=96o'k$8v@n/1~tCSYܭJ&Ӵ4͉+jMۙrst?MK ?C?|/hG }=0>ߥ4WKN0]:SK@C2!={{Vԃd?}CEϺ: a_MP>@m9mz~%V*Іگ}iݑ$DxmkBSx]N0Æ WM- 2*5X|DZ=fLc(F? hҶ BLrGpodgd/e>f 9]WA\\Lf[xilϣTs1H QlHاEt(SAZ_Y XmkBT}xұ `Q HH&La))lJ;4O gVN/|UoMlg?Ϧ6Mlg?Ϧ6韭oC[gj\6eovmkBT~/3xKTa)GÜ'3GGA,D( P0MB7 LcU$ED¤84-( Buʈx9#uthUghh63ߣlתF:îJ X1a^/5Wܐu;zkԽE|]++YEӟ?Oӟ?1~/]ҁjlz{LWm.GuJ7U.úW6Li^[1eޛ>ʏahItQ&u?$/jUeTZL77kN>|X3-gf&E[[UbS\3-E koIu]7F:电HJS]ylۃk.+Qp"(ùҾYJNܢZ3|.mMRRNEٲ{fZ.%Sw XEe6M/i?wfbZ[mkBT;WxgXTIg3:A,(ĈJH3. 1!J qc#oi@qY|[ֽ{9uA/Asotjo|p<+\8r^>ӷ\W(||׭36酉SzvO <} 䟓C˗q%aصs'NT*ETa"0)&w՛ ^;,z^O\+2Ŋs7|wJ?̧gVP|/o- `w>PZ֝zW ok[ffZV[XYu[ۺdg'\66Ѳ?ŕו}e,-kX3J_vԵk]|7o3j%ez{3Z :E}ؚ-%;DټtqB6۹+[ur1b#; &&Z{םՃdj ,C\8@\A*Ĝ7oظ\q,=rPY(~ H&09W+\*mrJ?/maݯ:6N~ y<~k6*9v/)y?km087E3g26?]eB{ctsLf-[e>,q;Ƶő#w##-WRIĘbdS;axc6oo\9s,0{~76l7ڲԹԻyk/. g3,m[g5|}ڭEmfD&Qs1e]cNC[#ݫSߵXL@dF1=vh1NKz#}#(:ውl:Prf!_?-Mڵ߽ @\\;llKƚanoe:bҎ9=ΞhcLXfa _}*nyڐya!c;uÏ 1$4Ô1z~Ox[n |jd=.t CZr*ժNu]dC\ kvS}/o8{1cƴţG^ jP}C<%K:{~ʕZl`c0vQC'jc&pRb*9ژG.cLEvi3!R]VRtY07^7#<|8;wRƞq??兿x6Olgu~g;.n6&{^c_R+hU6u_gϡ,՜B=ԟS>q M=c9^澁sMWpg ⯰SY9]*Y\(xw>Uy0иQ:%Su>?#n#~W]ʲ8S;fb/ m%~n~Jlo߾)*/N\ϱov[iZ_ձaJΝ/:6O- 92b?Tlk%?_21B sY5>:>c=1Ow y^- ڶ,XzusM#גU]>H_yYv!ۉ_mi Rus]Xm_g)YY)m]y,m z1aaaxEߓGקo/Y\k6xjgH|yu.\aæM&wk#ϐ$?]Mo\Ⱦ,/ڥQ@~6s?)}, l gX #vQg Bٙ^uのuhm?}{].~}v_J;xogJY]޳@.)oqC?}>@Xߘ'-(W? źvƔOʙRv[K?[A}?-wmՑ}g\=c}M ggg DŽ-B^k_g?F? v0||؎=ǧHPgs/hؑI t~{n^}ZyD5XWvO)"c0vY Z|~_%/,p\ɹyΰZ/;/xs_9?Pܯ5ݻ\[y|č8gʱL{? 0 0 _k3>z_\S |<)b|7aaaxn.ta?l^Cvkؽ#~e)3<3^kdlc&jK+o"e<.ʞ`^(3zu l+6v<ï k7]/lc[`On}򚄫 G뎱zt^v2)?;Wmr5ocIz?Ozx{&!ez."ѯ 1Gg{+ҏlw<=}GݽFƨ^)zIpG K֜{{e G12ۭqiumf>.}~a? 0 0 [u+7Svq֭y΅ ?ނ}XwŶv?ߩDZۓ-q/?߳=<~#>Fk"qzrQo 9r,nY[;o:)@-`ק-7({߯S@µK9֠ɸ>:n3 _[_*mtcmC>qSL=<6;ǫsaaa{xˌ\ފpx?0׋#5zяc]x^l򼠕(f:~٣^lin59W~\;?vn6erUbS~v^U O7O(|;+SG4|?f*?rW~2oNٟS9~daևmH6mX[J~s.ym4ٶO|Bd/b5ɿyU? 0 0 0 0 0 0 0.P~*1@G\⟿KrKXs2(ߥ纎J8'>X@▼QQbqwx b)_K|v 1M6kee-2Ǜ59?K^E~9ϱQﱮYF8N?~;:=J<-tĒyNAgC \NXKs)'^Kg\~2}6}Գ)n]Or^j~"{p29w6/.z-v:+M{WJYZ굢`% Ҥl9ힶկ#OUz+U?;sd~vND7*.Y+v:ye;8}~|+ÑޅN9}{Bƞ#txխsXɿkSV/uJ=o G<ջL'L:D]6jfgLz/+ؽ[{rCMYq~[{yy czA;w9zszWHVax3 %mkBTx;OaqwW1&Zڂ "gJȀ2ED ;XP(%BA4ߧEF~y,Wߤ ۧIF5;[=0&v4hkjju.E-6swlU54旂 7fG.kjNz3Y?һ_{5f&EOӟ?OӟFߦ UV&ii[ kjaV{593w ;Zg]CwVLM++ۏ;AWݴjsn_9WGg{L'v(tLH3boW_qi KTSEI}QtN]ެ-9{|VRE:Es4=oooC'J˕#!Z.AY-n؜=z@%ir-ISaIPi!(pnݹg/ZBP(S``"qC%NvP̘E|~p<-ğc޾_㻿3?|]vI^^Q_|迱cƶX?ck[_:WUS'_e\Ş7zgmkBT^xw\T׶ɽ7/ngMFERJ^.)VT("bbc4h,Kb `M4 }Μ9s8߽kAJcA)=՛Xޖ]*].+7*3B* \ FqU*4ǩ8:U]K>/x_/vX`mXbހ9b\Z&ƧOJ)9X<+nw{~ƁSx5_krP_8&DgyPz 58|v%1vD] ߀ a"n 6)3:I-<:9  Cl G?r'""&n[ k`ρ8kh4C^w_f\x6lَڸp#<3ܭv|_%e>ɳW˭89[>qwFbB4۴M Woz~κ&~l|{.F([/ >3b-v~?sY ~!Ž7l)חJnrWv~Ogx覈=7o#ЈjSV/E'7>~dz=} 7>t3Eq۰&zb߹̓ǧu(ωon}Rʈ %Ș:a}LTʻI=6s_w_+xDo7)zc"r+UwMJy ss~g1ndFauK4y{{Дbl]|Ōh\ѯ_eǔ_mXۿ'b|q8z͋ Vxۂ?&:wVmvvhwڝ>A 3t^4ff.pT+9u!883g͢?~ǎáCtN ΔT#U{45BC45Pm|-{렁k[Q#xI ÿv&hi/:rT0VL*ϾǟJAxؠ ?{__x?zXY(m[>:ӵuZCkwj-+?\˾ϿVh Z 3XUşՖh)zi+tkJ2So,7efK ,<ޙ7QƼ?qlDU.sxǢ}tY0Y/[մ4`<`LeEu<L`Fbb.~&#+B,rrٿ? Iz:0cbuzp~(+MWy8u>~_LG`469YmWʊ 'fw/Q)?Aӄ^O|o"v-0呴}檍|˅(=7Pi6B|?W\샅"﹩/\(w=$bXkaß7߳&_α|\>K9+p:X-ש_N;S V"my()'\.u.VCp=<g/A0|?縜0| i"1 .HM9K7"s8&LObj*8P0*LJYl ر(0+1woc#Gb&dm1oįq|t͟׳ ~W'Bu6ݨN񉿉?qX.|Fpc;L|XO<{8>ڨ(&)ߢI, U^3KI0FىX@ۚAX't[vI0%4O0Jw9/} \C#WG9ٿ:]'x" b6RDh:vM2܅>F\F0͛cMD%\\gfvLv9cҐ<|;7h~eؗF}fO6SeT/Dž33, D`cl74)r~=qr3St/ nGFhxM ۂXys{akx]H𿙁;`CZ 1]) { _~%"t_w-]Ԙ152y{9}8cFa#qLqcqPdP&?C/VS[)qe{|< * mؿ/QVtQߩSo1SS͟݌RZiipmS*z A7k *dCwC7&w$8C ^C%_%_%_%_%0⁦&b/4pQ GbWZγ|X>UC^Mtǖ6JE5ddž/Zkx<A=S ء"*Rg>ΏahٯJĚ:6-zĜ;WM6ocfA&K5?x}΁#kOrC'oՉd8M6,K-'bgʿxwje+zq^wST!b]֝)"GfW̩]s}ϳY)_iiۃ䯟wԿݦ|uxw/Kǩѕ!!,wn+~?FOr/K/K/K/K/K/K/K/KUO {WW\*/F G \" ͧ{d "•劰ut/xi"\ uy7:LsESc IPZv_QnW~3zaBTQ{p7፶i`bܹ( \Q8w_sY-Z:bAr2|_3VI+V[w|7Z ꊮ*{| AoU^^ ۠4 .AaU6{k+!G䠑WG&R~5xȳ=깴Fcyb ( &k?֯o~s(ٿ ?0SVР.+j %kh*,^F|V~Ңr&+.^_ q*}߽tI-_%$ߒ[~KoI-_%$ߒ[~KoI-_%j85L?omkBTx흍) q ĉ8D^>׻gI@XjjgiЃ`0 `0 ?ϟ|:seQ3|ӧO|:2|.};7eGFO6_Qv]T]^ˮg{>pjzkuo{yye?{-x/ D:3D&򈼹e^Hyi#/OGzϪ߯_~ :sMe#M3Y#=2 QЙ[\s=E8}E>GȩT ڲTg-}VfoSVwzV}./>~!?U1<#}=F[ ~QڋBN..+푹^edLo+[\-k dW(}6q$#?z6Bөi?L7!3O_Q}Пuo[=tkȋM!'}/Ƈdr2_Cﲨ: `0 :8o=+8-4}۞cĥXdq{bUq©ήm!ƶg*ΪU\z[GA=^+ru{LV U?)V>ғ)x|Yҁgi\yi^cUo*= !TY?rfgWsʽVn*VX#=Fϫ+[F~yH\L~[O҇h5ݵTow|Sfӟ+);F;:x )/OS yUo2e)Ve3'wgGg=J^`0  ľu kU,Ksؑ5nY,bXw{ w&3QהNQev ]ƷgcH˞i{A3I8hwduwUIWq8I>+@pQşGcZ\ƪUߝ]/:3d;ɫ:gB9R|GW~w2;fzt|+i5nΟgZY|<1NyŬ|E7k?z/k><=Α}N΅>uWydʬdz `0 *\?W8GY:Dgcg< 2+'W6qn؟{ru"wU쏘~c#T?+y{Q,,^qF/Xv8.֩g3}ȸOP ~n%hUG4(_sn|W}Tg&x^c,Fѭ+ <#+}/Uw8BRh_|33!mr\7U9m({ѝpvew[xG]߱?g;,nҽow8]וb?OV=Z_#ve?vN_WrYLo;1g9pV^G~>[_vNOS3 `0Q[ veO\k^8֔v<Zbz\Opbn$~}oz3ј mK vU]^iNWA#x딫jt q :E= z%օq)CcYEqyRG-+u (K\hP'*^ء^q=m=y|Kvūe\rȊ4={W1;=ݷxp;o@>ȘT\Ԏ+C=*ɫ|GJOCW]x1.ﵠ9_Eб Vq)v(ʑ}[GwǺ{-oSdו_˞׃2;iT&w*w:g׭SOsj%Z[~_˯d֮+w]7 `0]kIu+eL]ւoA^;=GR?v쯱;<y o$N1紈=:ߥPVu< <&3KyC/4r)i=*/|Ύ^]QNН1qGw>ù{ ?Kv:A}E:_n+{u=rq͓̳]>>d}+|L01`0 leg:׺񶊝`W,3O?]\9P~[kOWiGc~)-<w.3q}'vuw$Vnv(r52S;Wk_Kϔ8B/hEՠ'9w?K;x:x<|@cϽVyc@ۖSw8Bq]=2lBe6V}eR( VeZT4ade2ޒ+nYBTqSߔ<[&=f[|szP)G}{Zׅ3n7jpWwftEw[ǽ;`l? `0 `0 `{~i`oLy>uoi\qK|}7Svu9G쯿c¾#>,jow{ՆݲL=mW2u_8دjo?kD߱mw>#}E:OۡO;y`$jwymkBT6x횉m0]HI!)$FR?6c>>~sm+vuՑνYu8uN?WP>1JsWiV_uKEϸ/rˆ_gKW]ױEYcl,[TYHT}xL#}A GV7^}>iҞ-i;}LJX&TP3T#ߨgJl e'=?͘ona|7>?ǐU%;/mN/IfQփz{G}?v✽3X~j{zTAO^ʰ>?sy|G)PU{ ..T}6ڳ-F`p]k߅~b  О$wݓٱ|sCoA+q3lOx@(0a+? T,_7s\Ϙ^Bl1)C+k(FyN"8dPC_9>O0&l4Im+nwGrŰ)/tihf ѸX>E)<,6s45zb?J\<OM%O#(76:= ӋYAƒH Ls6MXBcX&ǘJte. 3.je(??Lj=%wZizFTx$kP8Em jAOހ>~؆B9 ֤8UKCvjbL Cy ;mj P. DkwUE€3ܨ8xUJs\ɟ+;}sFQ(KIXݛƨ 1 +KdX];Jģcx$D׷X`i @l̏rnm$^9΄zBGϞQ=nfkDe; <a>,⢞jk0B[p($Ǡp4 nq`XƓ vϵ.xHnorJ5Hu뇗 f a[Z:>36[g RL؍?( &w.7C#~B{] UW 71jk~ecGrD.=K@WDZM0倐0\xvqNZ ># BE )&yA}t?B Ym(WIpɱ |2+\2 )l8tl@Z.Be񅋍RSƃm>dIl'N adĢG3%#)?$s _5=YBR#-k"qGP-e"f%֩-ϓ378M9ϊ,_*n;HEBƱcl~ ˝[/sagIE2,z1t:kLș壋G){7ond{@rP>kwk׽ #kXfyEAB9uM4P=_lgW؇N#_nGpp ,ZUu6ȓVӰ0EK7*|]{75F\ԶzQz! uH>upT٣o3P)[^6` -d&*=%fY<^ط`_6|h3ء>2 Pq7ώ ,NsjF=B` 큳CiU)R鐏@LҮǧmb<2FHRqùFXi䎲OmGA}:*u f:@ʫRH.66jcGOpO- 6HKJU:Jǃv,3DZEƮqq7p?ȌK%ȧ$;?Qr6pP7`a^=R_)m>D3#£ _' Iɭu͋C-Rne㯄ssL<ȭ/R)|Lt_1Lk=rr 4/gEr~PnB[\g[{gYvRW' {Fem1{ wL;7&$xc0 n&u@5sCCձm8Heft x{q(aтa?Q%l4ςxmWI׆GC1kQ3iJh,KRO`ʲ4)%b6B8\pe;u)ko)#WSncRx{[sXv195_0Kՙ7>Tp5ٴl3S"؝LX睫[5m Q="u}pϘ*xbՉ#iM+@Z! Ϯ~jYݬ$?5mtu] %@݅:4h8ۃtu3; ΑO1A/r R*5i&j#Y2:$Z(ad@>'z L뇶6Z8|`6"X1_z' F-я?X^ A:?1;h/KVB' vOnFS ƤQ{=kh7MwXQp\v͓O/. N3HKRlK"q^Wh1wt h@3e6N|I;y?8t[[! $,ήLe"z%IކAkRl!3u8ځy?_W)AbCO!rza5Sn֗#<43y6"R߃CQ&>[# BHǽ{vekOTlq(UH͵h ݔ8,@tՂL{p/*L"d_y k,4 G̖bD>,.ok"D;|7[.DCA#ilϟI֬Dq]+eE _-- ڰc^Lq1~CCC9gNH8BkhJ#Z-`VoMa 9r$պZ-hkh ?C$ ^tď9d(8P݅]ڶw[wl;dn׆oKd Hބ(DInI M_(5)6H/Y1 QRk,nXHʉ?>df&6^EJmt{CCc`0ʅv5x<\9Yc}106"״!֏9dl:' 1H"z'7QqɌ#KR./CVgQȬ\ `?d1yuM6Ƶ8ZX]8^pwQE &1frRKi$GݜЕh3'{;;~FK37ku<pdʎ+C RMzƏ7)nҀ lEGyl:̑IoBS%|ЕsTulebA}Aʹ10A{KʘӺtjdLI=r PRg_LbR Şl?␔)![Fo wi&k^CV(t@pW2{hxHGRn͉eCbxԉ6GQd27\ثdS=\Ff*0ۣOP5(rZߙxQZ>~GAeN-jY7Ҿn;n?ӹ"Px}/NW:݊&׾:x" ꭥу;R펔 c䛅љElmG§a= h¨BG_uYnZ쫭FYs U"zM&:Gnu.DX5Xn;}ԫ%XO?~2&Frjj8 yA*W I9/ub)Zl: s 85J>~iI3Yԕ;:#hELם[ROd^GA˩f~Y!En0~/A Km>^WYq"<цF*c:xw|͞w%ehRgd9̕v3v Dgh>>?3hYDkgC(ʹƒԕSԜ| 2Q94(?OGQ34 fccPopTYaW(>@tX4`LGٞpɄaŰl\[9c26U M6f,'C4i?W~psϠ?kAKrŵk@I|>^xs?\`,D̒5W^w DMXf_8<%|8_왉pP1Wlm߃f?4:́_Ԕv M;k:p_sj؎qw]$F}y ,b'N=o0, ~M YR46+!}@~ujctCP.Y(x׎z?70WXFܣo3z0c8RGg0 TU򄽻w"/4֏CQ`[{Ocn]+{{ N!33+5]qpj' r9FDȬ)~: 9Gmx2-?sraG"yvUpa;Ră A\& ?#n 0eed~oq嶭!!DzP^H)>oȑ.ļԶ=Hy7S-M ?8ycߧq|#5"2Б lm#UeΤVbM͘jAc7Z ]> 4gb s 2WRsKg6 's8qzTT[R[w)I95xWj #!nN+zPڔ KgTE,?{^RDݥ=Ru^zîc&D'i74SJߔ&HUG[crͦ<׿~4}څh;lpAZ%XZ;tQ?yk1+Ƴu6[ Dc4Ɯ*dB#!}e>samhG3c^8u9󼵕⸈߂UyB;f "Yi=D =4&|C3g]~WgjhSIXU"1A5Fr4{AljwTt6</N \Rta| i>T.Wo>>xϯY{緷m,J{gg}v~)]s!?wXGFl!7U|Cnfﳅ:.@mq%臔Ru?.:aBֺE#Gg'yXDuSWNJD)21ѵVagWPqȒ s?¶@g")s\T{f3go^w:^"{d#!φt},nyWFKv„X4|VB~,˘_&fjp/WԍwaO H 3I`u1ͤ+_W|+_W|+_W|+_W|+_W|+_W|+_W|+_W|+_W|+_W|+_W|+_W|+_W|+_W|+_W|+_Wݚw)mkBTx1KaK ej-BڢݬMEB EЭhH , fXrk}p^ެ^\?۝%33tYYlLNڝ_oכ_oAGU=d~>+ka!_'&r+;SSEozvYNw2:##EP.8Eozvcg?o}Ncr.NBu@OoNwtd|o}nzn>U,_4 [r3o?|rVow4fck$ۇovPc7nݦU-ڜh+mkBTQxwTUW罵[+o%Zɬ3ghL3vMQ.p).U((ҋ" E"vc X\EBt]眽9g34!jwXo*{BBBBBBBZ<ն=B=}uGrW}\GJ [p.xL{'zx-ƗՑz,\5SV#^B@p$Lͭxi~(» 4}K-—8Ս,f\;! (o^1_'fv=.P8n^YU-=&}SbY}`]A1;(BoN5YGmI;}ں(T'/i捿;*C#IIjnէ`С˯0md0軽+*++QUTcǎ())ŋOOOn݊;wmV]]]PCC=b8::B&!''566:|pɓ'q سg;6ԴC$s?H5= Fo -䘭} L=XI]ߝ,0ԐddHR2&Jbl ahhK_?ǘ/ا x2B->q_7֯{Mϧ}ɸ/gR_ߡ\`5 zVs?1p4l 9Gɓ?ZgX9!9Y4FF?F;;`͚'s;#7e:~ɵaT|p~FCu>b؉(j–m\ӬRе9H$y'v:vsmQU 0#؀9U*#cay *5VID/fqT$ 3:ذJUR w<~lNI2~|Hm4>6c׮'롭 wĩS(,Bl:c9xp)4et̽3w2);/K ϨWNdFގ(ۄ]~y oG`:믝58; oFxl>/K-6ߠVs~KUϟS xX=ZeosKdώk^B\ccYz)_ƟK~݌s./ ;m~ґf,-m({zBs)<E8z \c}%L``5eG1?8+QrEW^s QPGg;gR,PŋƸ{לǂ,q. VTI&Nc烃E c`&!ǔ)34s!::Xcemm&BW+hmi%f{3/X 'daB;3-1:Xl 1CS 1Q=a9sj"yAjC,(</^_(z9S8/t("{{ 3?'9dU^^8닥gs1p x`eszZ5u*'l0ŇNY7y tj}ȇbl)mqn ւ6bZw=|ZbOkIÔ"{L/SJߗo kŠye 51Jk!b OF@kˆ:_|nw?9D[yqr[n)x&e@o{P,L.=kbң?_+XlfOO]%oXqgrw{4>A~l,Ϟq9l9Bx<0mķNYa:XCu`?MLʑAm-j{u%N]_:t#`lz_Bs!Qs#^{m $VDl >PZCt5_uXdy+ܗTD$ -I_T&=m3{g.s^ x6s"[_H{ .K DoܦMaoyV.k6پudG鼕bC #ZqoRm^- 4ή|USGߚ5q>皝=#/Y~2x-`nM@];rDM~QEםA'3ܺй~N>eǩSQHȰEW=ر9t:=' gri055Z]+uJ |[[u̩RYpb"N,`OWNgS'YͿ&[i{@bB2guCǓo~Ɣk  tt{~P:l9U*R QƬ"%cpq0O$A ȄpS|u?݃ GJ)Z'_9g +4=ou P-kd:W!ظcNZab_~ǘX ~*ga ]]?FZ`LݐѰq u9@bc-c' AU6YYG?g4)C9J孇˄IXyX5U:>S᭿gMShKlQx 7M~gUaxUN?h=^0W&U' Wf[/*T}aIИ9[ߗ/ / / / / / / / ;_ckX隃^ EM($*G,Q//`3J/JU"򶟅%=4U={֭?SفB^wY)8ւ/ϘosS7p穎Sv()Z=%{9fwc\o&m;B 6=R뼊(qhuװ"R{AX {QQ,NWlW=aK>g$@jm#%`NךYR61%p]llCc1OpfDm+Sf@6w!1s;o{^'`QA{?+ ֊۹\@Ob}47/n??cI/b~v/}6,)Xyn'(9vWn>U5q>ՇNEn]ϾiXq25=漏S`Y[y+~:y?eW4{~$ϧK71wE12y #f8rW g_zAm=Փ*p{BbR*bc嚍|hĿaQOZȘxI;pI0ĚxK7ĕ^m?m?|Ik~\>Ŀl2OČ,|w̛|]+|e1uZ 7%OlB_e/?`~]SM .~IWeWr{M ~ՅrPH`IuPO W#GlfAZd=yOx2<~_"?Ș< yORoWr+|˝넺MOvC3bIJˢPg:83SӰ}ΟaҼy H ՁC?(Qv}?KU˞e,& hw9#S8I/(^v3+De)]T WIY\GT]{+ڼe>w~K'eN}ˋT:Vɾv~T|Tξ-:q"R8&(W?iiؙR qE]HHLƉ_x|B&1<&gD^uijH旳/V;JM4?q[Qi&q]Nӳ$__tɩv'Jk"_'&ؙ֓_Sڿ"bqz?8γJ~>COqyFc98zbG`$t#څ*p˩9+(]cH-R6pE|lذ ,g#.510 `:emS}Q3` 0ziBa*$sbY߳uUz=е6튶¤i3ϋbB\)E( oaWPz3fX )V2IoqHTO?ĥ-;{†[1=gbE?@ǸW ;0ͦ(8#7c`</m Oλd }+ &q,EHStbmߎxݨ#޶.Fa7ܺaDnS~4))iغ}7v}H"c!Ћx;s*'U>G饼R}|(ŁGs>l\&S'[$G$7[0 &`QD=Y;sxʬSgCϑWx ?ںя;6eaȞ1p(B ct;=tbzǀ0 q~$?v)ݫzVYW^Q'/`C.%Dz0I#Mpb/X`y(p>*&ݭ[>En o@JF:Sap  // OX ;ϟ2s| Oe#t~ _UY8wӅmQ$|=>~?Oס ح;=BMVv^=M{gz2/!^ 2,{oA0=^5gۑs.I~¶`0ݣL{ OOϱ)\O~~j Jsٵ;Xb 6No8j6ݛ6Km^Ÿ&>GB7zí/A){1[i c|}8"su?g_X>z( 脛C۳}۴ޱ.#3A{am"0hUP>RCixFf6y{o᥿xָ|E>{o]\vWB{94bk__7y'[>F̠>rN"ZNaG}tr2Nu!v7Fgϫ,㮂%óys /X0d565ğ>`6 ߰*O]aHoUߋvzU_b fCcS)|=}$$aFñBh%F`5EB`/1Z?QdGs{ދDD_NĜwAX7?fòzvڟ>%θ+db(s:T{ov`c(X(Ky{섿dͼ?\? ~T,>}o _SDQ:fOl]<.bZا>~~ EʫIOC3_3>J%*׆:e< a`46x(c]c?ͱO|u9dD_+Fp~0t8D/d_qۅ'eyw1E@rq@1su21bp xxɾӖDBi+F n?Z4zL,]?K|lKw<0n等q#E,AP˗?}J:3=S'(KŠz+Q?FyL&Ŧ¾]˾U?ed4>WﭻWMO媐O^'0w7F?}dC3 G٥9_h$ R'VA-xu+އ2tDW.af3k zq}Sߛ/EOdOD}?{c&Fjy)W怓=2z\;1 !@kݧ.W6Sj:}:bEy(ÕQ+Uy1N~.}ӜZS)DC<}s 9˸%;)w!iqկ?loDUmh0J-rNL1ͯ$XfmgJM?>j寬˧?#䯹LWiʇx|WB\nel߻$fiUjn$DZz(/\U=~WT=Ƶ/t#y+~h}ak& 1DeʟbO6`T'YĢ*uAhk}zyVD-&ǾS 7^ޞ 4exCV'Q mq0rlq7@TF ]ek?9!JGIkOɟ쨸#^lЇӢ2 ANhgxS~QX[WRz'C$ sـ⿣O٬(;TndzCf>̓&^,T̩,Q:VbȪ%O+_cF96SVk#Ԅ/LzVCyiLƒhNG9e%-c5c˵F%ynS1XIi斚VFʟA 5EY<cW5h9I[2ZW7%}~3 F~/zĿ%:8h~m4~Oh֎&?׹xDn|ֺqiErzq67<1.n] \-Q?r~EJ-? q&bS 6+08 8 ~Z"Ki^ñ<fy0kjUk6G_W+zm-퀲E'[7Y싞S#3c"PXP~8^|fZwky<t \9u@y։PޏI+? k(GyF޻}şX{8nð/Z룽hjK, ^MBgp Su|>z|i3ˬV_'Tq6+e?:clo&6NHuj)Vÿ9~~ܾ`!l``t^{v;QʶNi/}.V}_!+>xDO_sZbhߓӐ*X[o@GaDo oSXal|{?Ξ{ Nx|o$%` {(EJMqښvF,WXG7d* Ûx㫰 Q~6P~*z6zX ٲz/A2£U"UQqp5~<|휞GyT<5gyoQz?2] Twҋ?oYOc?'N˟9zj[o.4, Fܙb%?ES߃HiZe$$$$$$$$$$$$$$$$$$tI5[͖_%lI5[͖_%l*SL*nA&3%/_jtLz!""b*A--(/8.o~ݸSmwC!|L+Jd ]~Zc|\2Dl>\ 6ߦ|m֯ߊu %-CğY)'T{?yfKْk$-fKْk$-fKْk$-fKْk$-fKْk$+o1v IDATxwt]}9vwMDI(YE%Kr8cE8yē8䍗3o;q"*LU*Ta][O} ukۿ[~hQUr!rCA Jͷ⮻5k2Kr!raeY?DE[ȤKr!rae8>Y ]G@ӴKA@EDQD$D$  t0 l۾ĹჄ K ؀$؀(8D؀imiZضigGC]Xiض|3a$IH 4 &Lj&'֥)--CEg ,t]aq|b'! 0a۶0G4AdltD"(g㌌ #$mUMqq ^hYU.3gp mXuVƟC9n#rIbtugݍ?z\nSO>m466L۲TTIqÇ 2"( SS1b }C011 @^0$`C /m M^^ô33=gFU QnEŸT7aJ ÄnM3D96r }EWel,ƫ/=ώ2;3 (=TTUEeR,##oka㵛OzH39ICAe YP4L1=5(dRp0#H ]nR]Hd5A,4eɤ1M]H&J ɰon&HSDED"PS[G}C#e躍a\!-9*a_#)o`5Pe^Π*B E,]Y:x_oqǝwjZ,Fs DQDUU,F2t}]팍"2. 0eu46PQY,KXL߶ >r|]^`Ic]^wlcct8r%J!M-47R߰@^$( m:s!;/+7^C&?~/͍ؖ7eq%=7ګ/S;ラrҹ,( ^D3MUM-RPX@QQ EŅ(*haL$ ե`0<<Ca QS]Km]=u x<"i9a,v (xw< +WS݅d2I3$r)bSXo/|OQLF!YS k֭ȑCOB% #'As1=W_g;dW*R΄q,r \+Ws{Yo_lx-W_1*+KT9#<^?{vx>2%;un.˯}[9 AP].>W^~]׸펻Xfn$9沘H&ӈȪkXl%7~w+tmC+W~mUUU;۷[BaaL&^)LÒ&CTUWaY(TUEev͵]}~Gbb.dmDE\()-g=<į`8,I9{9\H&m|$tEQ_{>%+J/uߙNQq;GUF/-< ƛnʫ!H,N۶痿-]ֶetvݷYj-j2*>.>Rg7,7B2qyaRY]dm5k$#-qJǭsN~D?mRA$pDr];!cY~M-ݽ{>* XraQpbyA~?=a\vi۲iimChDUD"/3^z~+]qȒ]XsgL ??^Meu:;ǰL^G/b#rSM;a]ٵ_SUPlFc~{JBG*J(|*vF~A?BIiE ˛aN%K_wq^r9TnrX |XsY NtQ%$=NkMظTy7 ]7X\d24ܺsg`fz$١ay.nȯa{p-40( (,pJ:_,\2X( ,[B[3˟{qgbNÇ`e}N5CYe YYLf$qRYTU3\M< S[QK׾< (K?C70 P@e-mX'>y?OveOs$ Uu6M4ޑζmDQ-lF%dDۿN}GUu-wc$dDIDt>/`1-%}mGlJB0> ^غ/},ilBtg>ܰ-եRTTL(F!1>0s%e &Hq=62J_/?= ij *3ñ)*)F*QRk6biG%A9S$fX%d9_1=}~~MӨ.gÕWԖijjEUUGd&hO xcYr ضЮn5yY-8hqgQ"KA )ngd2:}qm(** {vr@ ^T\*a|[LƦhllT*OrBa.¢JJ+hnie)EAt ݜp1LC?LL@uLà~uI2ɘ<ͬ$xC> a\~"b8B)~LaldP)U!y~ m٘Kw#:Ff,6BJ#Vyqw29>xcܶ3oxmZ;{t!$/$||z\ &}EJkTR!LuW- b, : 2S)_"1Hi "eEeUFOmy*+ʹ;z}9,DQ@$;w"?}׋`9|H "DC}p{A b구X\.`ʐ!( ]e$YFAQfzjIo315rad jċ%*aigYT! Qydmc@r(i YAb ~#(>wKW؇w]HQɘ:$-~Z].Edftxb$I??@" Z܃07< ˰us]z^y U,ϛ}*FJG8cmYB0RLfC(~m"xiůIbIzu)&FGXbܸҲ2 X90՟e͚<3<#l޼e˖! hhhmG<2 3[~磹e)KB?qAAv!gS%ehpczbtx-N_b8cW_z H$ImYؖ =/U  9 k+WQYlF`|1fL!?O#(G[$w5AD'_dNDQ(H|;q#S=Trl-DM@m$EF,r&;2Lu 3=UT҆V WAHOѳS92V.)"WЃ `eX)}ѝl$O <l ذ5Ŷmt]wJ&e@}}=۷o瞣oH$rVZh@?w Oa! ʊ).`N\CE2yg!H 6c25tz58O~_QLc^8L;Zs_aжe  èAjk9l?')FBGTԠWKdE<\aGN2lv:o!";w3;3 C3#yn*"U0Of`CT$G~.ਥ-8ⷄ rv@UJCzlQ[alNHK٭fH O!H0UZ, eTċ4QY<GϏ ۼkΤȢh nYF,̋DGdA@ֳavl_Ѐ_Bt~f" QȆ^dmhڂ? بa dY8$(\̕ 6.(d4 ^|- 薉e YBeA杗Aahp^BJhh/\*]_1F+0tĐ\qEs!)j,-1;0AztN҂ 2@M<T_Dz,((/ N?HJdth6ŨV+WWxhS4e30ܹ W؋Q K3>%avoZ (*+mߎeY3Ƌ"xAôR;K%,lc@$0hdEA^ofc;S Ns|ƪ6.F,?hjeNN(11>!6\ƕهsK@t V*Q8SF=RӳdRg1V(?ϖ ۶ .m`Z{sV_ ;TBd޿}V̆{$k>a쑲٧ fy™?{o,__jSH"6HY.07!| WOsl]$J$f+"%Sz7)<7jKr`_uW>:L=Upf@?&2d\[8}$ ![6o Ssls H+.V[ ec0("")]'kNEp䍴a6"= tӄQ]̚BL LCllE(FFrvӵ ¢3tQ0LlA8vLf۶Av!HAPHGGG"Ow~}7gL¶37l1, 3V "o5 'ټ8-4DǺ,hk k7QVe˖>lV*`h(Ɇ El>':I@{)h4ņ?f,x'[' N"6 s2Y9surlKYQal,M:mr `6W_]OqUJkk 33y6^L[[4d *^|! \(qEDbwҿ>DAf n|`án~Vg _O *yZ2*nT<ٳ{" .| ֥Fәk3 7*^$dD<13 Lu 3}p/^BnT0d"[Q.x 3mIqIrhq{(<''[œrځMw.hDD\xQSs=GA/`^N6.1kl" (2 [͆?R]n|<<cؿ Ix}yHˍ p+c[25+UvK6xo5P'$ Ȳ+vKIJlOUU@6=g)hWѨ|7Xo~s]]StwO ["!3  o=7C$ QtUG ߃ “Ol^_A_Am"$SEE_qQGG 5dS#JM-KqXApIApm8~DUF zL&ECQ{zJՕe&;sռs cڙSHhHoF>3Wlf!|Ql"ͦ 5wc&ʙ71(XOX#B^671N/߳ǥ?TFZfR`e% 3oWLt\EvuI"PmD)z'&XW_Oױcn28=uuxT7!pu}=aa4 \.ۋWUY]YL:MKi)==TD"gpjƢ"QߵYmocl=}}4T\̳K$/Ҥ;0GUUn7l%<ىOU `-Wt2,A[Z[qUdw{gӔonFT%<&|$T0(eyai67d>U=^dƧg8 EqHx7nՋahG~^@c@~^fӊ[ēOY MWqc7G'Z\FL&]+>,+T71 ek&)Ti ش;'hl #biV V To n>\sM Ѩu 1M_{4%I2w/y 瓾C5L*e {oyy m|244ihHpp U]CMrZ&/,JS&$0un Ɨ'qMyfcyx~^գ൝C|rc+Z (w5=`,f"3tŭcmKOy-˨nًO#)28y m;ϐW>b,҈Ll,HjQE\d?y[~t'5M>là]nb {Fcn l5L!K2}pK7Wa}A[K1;IC =_ϡnؖ~"CtˈL'#%?0bAVݵ|ڷx&*|opMCCNL֝({*NLݻ*(`kGLD2઺:ǙNG7MK{.(Kki)pƍ'U802Be$1TU^*%vz'&\dtY.^EaX 6=Wiժ#"1Q 7pѝ ~ʰQm{#-CI 1#388}w0ucS=b˖ql 3LT&N*cn׋Ԗ* w _eb㣼ғ\nm 12#L% ^m/l!&e;,\o/6yTTpUWrܓQB`B!ee4j{OH1` i46(/BǢ><{!qDoCt,J$*\s'}:7sG8}srC ?XIQO6#VBq_۩x 3{faap~66jE_Mt]5B67 y^Z2B=k)\]hM~z5f7Q|YXxJT|H[)k,""vѰs-x_ܡa- |Ք\]=_ۯ ̌蒱4(m @ۧ7Q|MCVmtz]XyY_T;V'4ohx;Wu">$؎>aVue74c;X\BX +**xd\0xQg2f2HaYI\Cmq=]̾A<7+V ^U wvk֔4tDEnjm営6-ccxnLb:֥KY܌"I[ϬZUTG"|~z:Nk5kׇ[Q+L_,FMAe|+Y[]́8%BQ}%?qSIϬ$PA {Y_VMM,F-%$MafLZ﹆["*IZ"0Mn]LӠo'/z 4FܪI)~G8uVeljK#U12M<> eԷH4SXTJiE CǎNxLɤSYou2_s߅9~\u/q||aDZ'ҸO-#{rv탆E&ˍd\hΓY0lb3Ϛ 8KqOxݚgɻEo( ݱ90v}M #aNK31S|33DUsk r0C ٠[̌0S:fFG2#"^=$3yN1{W %=NWGrx afҸy@ǖWzy15:WE mj*bN<FZ:>Kj|[3)\Y1:ػ:6irmCOGu~>XAi(D}4JsI ]ݔBĒIRiY3?u4u>K969G0]LR$0LbYm3m\RBE$2д1 fL%Twxhv߽|n7i `Z M}pӲ dvکpdߣ/.ct|e!Ct~ZWDzlUl}X|Ӣ(OMȫ?`:lDQ&/h|W)iBeTŅGU}\vDA<@_K*ncDOA$N#I2KZV2<0S&6U$㳤 &Ɔ),.hQ+/pm sZ㿏9ztÇؽ{$+h.6 G>HG022{Ls!])vgOÍ8MF@EOCG>At\mQUsNX3}cIJ5CCضM8|xGHM1}p@u>0MtJk]`U%\?u6,H.O4UjwRZJ~+g Ac%EW9=cS5&=Rq?[] C֑HPvC %Ed&H7>FjxJ$$R(Q@޾Pc1'e#KaWBdJK3gn-<^S'EJMdy$ Uk-_lhIQ^W74xDY6֢2cc^n7g&& [G$mww:pʕ494KaAϯ_O4c0 EE zuTUQA rQ|啔B项u4Li#wETeDO~[Grhk(Z[+]Iۗ-"d WU2wM(?DzMBBJX߲3<ǒ6B" J.n"ZEZ3)n y3^#=!BjKZyl\v+Lu,/@1V_h}GM".0cд eU  03e 1M@5B8bϞ ^|q~ b$ ,  L2ɯeR 'in(['4MSWG(0/DBCD\.dRDzlzzfuB"}Ocg{a:=}iko c6=L LOȲ, elpJˠk6% 3KTոBL`d4Aw,B!7MbY6m bi 2i'e2c?(C痱zi, ]D_Ý#5c籱PУjy5QDyu厂XXDWba\D#@y`SzU#b6¢m,<,, *1 $yoaZR/VO0Mj hbS m?V@YJ?6v<-el\D(b}CFFmacWLb*KKmXSCcI&lY#t<eyLB&4\^lB[ }U6?DMm:n$%if|!j\E*z~a,"3br9Uv2gLg'?c(9glsw| uV6 dsԥS6(D?mNmfS6׭S졁/Kd'.W]cpq|!N24WֲR)9s]wIs NҚKo\:ygNvdL4, #T_<Nnͬ>rb_u~ۘg۶E8t Ӊ@ b0ofѝu*m;iiYm[Ic:m9M2h$ Jn2ELE`*la0,YVi& ^08`p0AI<6l("06>1(n&__0=GDBTT).18@׭3/@h_̆~=NYʷQI0_f 'y|Jk]N9e3X jnPA_?#396u$5=GHQ_ǚEx(6t3m`F8~DErvJo6b$5̴cD~7$ȫ+H)82ssn:腤9}?i^}|+S셤y޵{~LsΜ, lr<öO3sQ A{'xab `:񸎦YȲȱc p$^}xTtݢk;lj2Y @&c2<"6E ==TUPA|*r4>ıc dY4-24cci$I 28rdPo΃g xoR<%QEIE-J,Y%XJc5q<;iugfii;L8;eK$J"L \{I[@bx}q(gYg~zb2Lt\6gxiNұal'?kp5<[bKͦR )M$ӊR1$լ\%O,=XL\z癞arY^e/Fh&Hl^90¾CcK>Z)*Uc' /@|Mt熮] umjj1-Lncv:ݷn$L~sMxECXյ gt+#Q>p/fv]g]۹8}?k;wvЋmkoo5I>dZCtҒ3= Ů]/ZFWrH_gǎVʐNۤ<˗gh dlD.cǎvWٲ%ƍ9R$4qc tq݀B;W˝j[ma+Ivݕ)Д׼חϋ;\uC!,VoL2[ z]TFkH8r)YVuz]M캦>dž59|>Bcxu.Oy6PZck(fm }EBϤ]["X:||ڷsaךn<6{#>jꎨ h6)z&sX7=o;24={X;&QOtUʪK҂Yit̯Okً]~ӪjmhҺl9zvu(Xoq4(|- ˊJ˲QJޔz~Gml\ Z[lAmna% DfPٵkO_Fǃ?3+_2NZ,=7^֖2]gsvoxgQ9GEFW]wEŰ]jg޺j= wۊ"$jfOJ(wjѣO^m @)nܵ:p+^GmFB]Ym_8peԾ~;sW䫧87{}AKF c4ouH9TFgmFrl2:áTG.唥f&8qjͱ+4Zcxğ?3:xūϞzTu-5c33UaR|t)oWc^mM[Hu?O|/({XH;Y?#'Nopz^ԩ"lp۝>wȑccCtv>׶S2l[34TbxOa͚h֜7ۗ7O o4( IDATj6p>\|J֩_oI:/%DwmX)L0xa'4/Y ϷԞ'zh(/Z"ьNX%7hJb~>(;ڱ/̽&f[ގ1u0$L,}ʵoqaYavI SJa|Ohiyv*n/5,-ϵaBT/FFL6D ~ ϋ#hJڄ.qơ5J& p[=*S!^Jaz_<M8n/nܚ6;Y [>v 7m:k8&gKқBѲ>} _C l=8cf߸5kc_s6di*\` W\٦*mƆ3{`u)2>ξ>ٽnq6q$k_((KCtd(:F> _M# hR9${SyO}Z`+͟C gϖwHiw(>z%+WFӻ+`+TxuQ)4#eޕY q@"%}~~[6MB2Sť\@bn;ה1*@_2dOTp)'MHֱpr&m%l+ P8u)0[L G+ SLT*y.ř& t%TE|/ \,+:xx^H֞IS(x^ \a`pݐJ)dRV %ô 3u8 ]T~aAATJe F(gk~mx}]7߂L0 ,5LNR&K=>a) tn_г C_Rb'8}^FY +:Z2QeyIgc , XܖDX}{esfƧ q[=\u5b%AKHB xz݃K; yV2Av}!&7m*Z^AWH"?~Q|. GGxH5˚=~o_Muk{oF ..1J)C{7'Ǟ=VZ\biYx4N>C'CX$S8dXn_QDρ  jwpw}noD<*]=t("'ڶ„ON)|,Nlx,I'Ŧ/{stݼI(}nNL}YN{۰. @5'Nyi>_rzO3xQBw`(g2shm}7ܲ6fBaߘrF h B|m >.L '~>l'!$r_ٶN0=kQ*$J"(La RrzxˍWyqAcg>ko?~$ЅbWnL1[~a@T亝aۉsXr':v\I]!.R^Z)S|LqB9 t!@R)٨ΦfttSڨHI !*˸~ oCҌ3:<Żqѐd*"!@npiJoD]!hB!D@B!B$ЅB .B4 t!H ! @]!h}YRш$ESJa0Tikkq,YkZpdqД:d|o/m'04JBqI7>?m'?O{w;RR4!hHT*S? [Y2ٴaImrDM}chǦ\RB%.53S?;g}$0J !hڱ:5Aw/>9)W\P: !hڱ!u }ܽ!.6PI{ov陪5B\V$Œ$rMqq'#(PJ@KFih U2,lNFqҊ@=p^􌄹$HA[uq*F6.[ŭV҄ЄAԣu]\J{w}O\?9[2\qY@_1tby'H$2U=6;mw+P?ƫ_|9]aR;̇G * s!M}Txn I,m_R&$ThqV]> Vz,mdqnV 9 Edm듁Uwo[Fmժۤ/K"afc!LCB!B$ЅB .B4 t!H ! @]!hB!D@B!B$ЅB .B4 t!H ! @]!hB!D@B!B$ЅB .B4 t!H ! @]!hB!D@B!B$ЅB .B4R!:XZN$q -I%u/#=[FҶ2qF'ml &V1)R$,+I&SaH$$$,rI&-,KN۳eĻI2R~Ph`ۊHcBc '!e[+eEۿB,R@2<1ǏӔbb[e2:5ɾ'hijKSSNMɓZN381ī 6C7(g`=Rv(hJ[ eЁ1a1c3>VZ;Z80 /8D6ľJi *3?LmU9 ,r,9ΡŸ_Ў1n9kG>jG}T+_,r8rS!JaL]009ʖVڊf NӑєLƼ mq|l+C9 Aa$fiwP/ SL[{:5(ERafz5[>cc%V,o²4qJA tueɤmbZP` H-6Ut#t| ?wB>~wyVoݶmS(k 5k )RߜhPJ7 +Wʰ&0 0B{u) *a0 SƠFiυ#J+lKӼVR oxO [Q~}_ˆ ~cz 99sw߻\N$I$I$I$I$)UǤ qZ~T??`N$ch;4?.͏2?Ϗ]SJ$ gs+[7 )ݐgR5$IjA)"ީ8w[~,Ϗ91 8+ )Xcj$I.΂՞1[bjr|ԁ];ȯJ$Ymhz q|,voݿ88g:Iԅ3mw)b)M-7ƣd{.?UJTm{=erl\<\$IYoAp+s{ty^,B] $IRIwC\fZI@L&WITȁ\à{2ITb-՜c\a۬IT*6HY`u4\'`duH.~c)Nn:՜\,ђ$S+'\~`-\V$I§;ajYZ$3IUVfomܗN$?HȪVfwso*$IRG6̶hRn8Z$#B.bì\+|jJB$uD^*ڤOpD$Ij"6Ja`UV$IjUaJp:EVE=3(IکI`pB$G3s5A*VIA cI~N}KvҲŃFe1?q$IwhƝ~\n.:OQI/!#G> Wef<8A護 /rMSsk3s$s'qm[m;-A>Gwr$I0s0'I$I0s0s$$I0s0s$Is0s$ `$I99$ ``N$9$I0s0'I$I0s0s$$I0s0s$Is0s$ `$Iv{~d&0w)KC=BE^3W]s0'IR\?Y\\iIs冹Z$Ix;sN:= 5:t-_׽g|.lУg0l˱SϪuţ0o#'/qGEE6f3 >a-]#ϞFg$IS ^vMGO;+A7OuKBAНv‘0 6<ߋJvf.+é^aa g|;.k_o\x$IHֽ{M߮z]w }jI|3;ZҘ_Sof>ͬ0'IRbuw7׺_5Xʘ\qf;ITR{Y]M:%[p׿Skj9@$IeC:`N$KnJă③շӭIT <$9EGlŗ'G~蠈~1\>uŗa`NR\qnr\<-ɾd=aU',9OQI:s6: k$I99I``$I99$ `$I99$ ``N$99I``N$99I``$I99Is0s$Is0s0'IIs0s0'I$I0s0'Ik]i9I``$I*lf$I99$ ``N$9$ ``N$99I``N$$I0s0s$Is0s$Is0s0'I$I0s0'I$I0s0s$$I99I``$I99$ `$I99$ ``N$99I``N$99I``$I99Is0s$Is0s0'IIs0s0'I$I0s0'I6 sg($I0W޻d̟? 7gΜIsuٳg+᭷*9 s0'I5%$I\9NXdIg8Я_0hРpG^{mos=aСaO/7;.aÆt0a„ЫWV[:+ Ǹ0s$es/<_}9s&ϛ7YyCnj]kذa… 7ٳg'}a$I}Œ3O?r]pqM,^avlsW>NUUUrY9,TO~># UV s$es?ϫ/p*\TNf?\ak/~l;|w;$I\=zlX޽ˋXms9p?k]޽{ZIaMq@9I20Ww߲`#W46,$I0W2eJu뜚$IrܙgY}Dܿ.^~T%=3^a_x0$I0W"EL:ͫq~8ވ#/7n\׿s0'Iu6b$ƧrJ?~|C c=V}իW'&>jԨs0s$=s0'II,c.CrmQ[0s$Is6œ$I99I`N0s$`$I99I``$I9Is0s$ `$IR\UWpw[Vڻ9$m0Wcm%c2\0'I``N$99I``$I99I``$I99$ ``N$9$ ``N$99I``N$$I0s0s$Is0s$Is0s0'II$9$ ``N$99I``N$99I``$I99$ `$I99$ ``N$9$I0s0'I$I0s0s$$I0s0s$Is0s0'IIs0s0'I$I0s0'I``N$99I``$I99I``$I99$ `$IIs0s0'I$I0s0'I 3r$Ȉ,Ǖ0'I$$II$ $I`N$I0'I$$I9I$$I`N$I0'I??ȏcE~ΏRQ`p~ܖ`K s$I E)ڞɵF$?6~~oI$m~T+R|ϏY)7=4?NʏKSRx=?ǜ9EϵƎxLj{[ zU~<o1k66Eުz~!q.̩VV|/HJqܞkdfׅ oh^ݧyezOKcn\3W.IۮP)z11qf36ypg&XnL`E;5g' cZ⭱saKrǓT&ȹ,ey]1=%2(nB3_5nH;ɪTj+;]dGo.SYJS=m7c5Ѵmgb6,9VԵ쀻hQ!xGkq#!MI"3fϓ?㜉R줢/-oef7ObԼųuy"gwKPT/#\Mg6aǞ  ==˽<}nUͭano*;Z5RwQXSu7RO¬ܮVG*. qU7/+zEř9b/;4o~];j6sf瞀xnϙ:G&6H0I6ٹW`vjN>ùGIfS2KpIv]م1G!!TNҪh$w5}J[+ޟNY*ȁm_4%/u?WsC\<)~rVTL+.UڳqN} _q\KVWwZ~e^̯]*\g"JŏZg~?'Nǝ__{&ױDuƙΏs7vn~__2Rxܼeυ72l/)/tz^W6tkY{]V_SZ}g ܪwfFAU7gkA)*^;خ-8ջg܏o۰۴me)ZΪ|\# O1mܸݳgfkQ6el1>>fS֣wF ?lI@s9"8|-[`. ؉O,}[8Cm}-Wwxe[oudž__s0s0s0s0s0s0s0s0s0s0s0s0s0s0s0s0s0s0s0s0s0s0s0s0s0s0s0s0s0s0s0s0s0s0s0s0s0s0s0s0s0s0s0s0s0s0s0s0s0s0s0s0s0s0s0s0s0s0s0s0s0s0s0s0s0s0s0s0s0s0s0s0s0s0s0s0s0s0s0s0s0s0s0s0s0s0s0s0s0s0s0s0snran3ZT֘|Э{н[3c`+O =B^{)Yہ9kŋ33x?Js| u*e-?cN\KGKWjf`DE}\{M)ae9+u%沉M999ˏFJfzffxy^ a[<:sv&dx3g֣[m?EB!_nי3CE߈]sv}԰cCEϊ0npWxR;aLѣG8Sꂤ֋g]&N_2̹DŽc'˶ʹɲ5uqyǼg&s] s/_{m8Ð~Dѽ{U< ?TV\>0eЫ"\5*9c F ݻu jٸe+\c [)0|{=s߹ꃡgE6c?A5uRܕ cG ýfnjAm͗m&󿫊ůx5޻`d="lwĈd÷Ho!6Cc$0*řx;FJ9Աa^+L_S> ߮o~yLYWێWỏsva=Ɔ˗} ?\(暺~anؐ~gV6ꮁ͋unf26տG~sųV9~B̕w՛\#殓CVw1\p&`z03}֧5R<UšNga{K^Js{pØ}{{6_j0׋׶A ϥ k su0?$N̕;._ V/~1x* 0 zZ+H6:EI\Rk33̕.{gs慫UGwRܠ}2}߰Ck\[d`T0wʓk]vE{~k%0>.ճj>p=XȲ8ѶO{bO~2 Dj|ҷw'5Ua{0W=zt n3z Er4k!ݢg2dhЈnj ;}j4\Ya.I\|>˿|Vrt۪_ sO fN{.k!Csufe}慑%qb~Qqsl07op_UUxs=߳N̮?9bݧsM]0 ;l;6<Ѭa1-ܐA}S? {?ܴFc6g.n?\qJz.:O[=8ُ.;\9a [nwj'߼ sMVÇ':ģU7EqnUպ,#0זx)'ᇇP-5|aCʊK5\S/}èC^aݧg;E0e~{f :st'@芟gMo ̕ytu-"fS}Ϯ:3#.Oaݞ|ZmҤ-6F%o@pOgjleO'Y3O8 xљ^2l/m΋!?6:OsϜ}```0s0s펹>́gv`0n9v\`4iRrgu,؛oX>loUUUeq65kOy f̘~g]pq w9\0מs=zToJk;[>(̵swqGSLW/~򗿴j?ATay~d-^Qս0s0'La=O^3gNw&Uq.^^QQuZ<~Oqݻw*s9\t'V/_qey0sʡ1̵ϩ{m6իW'3 u ?&'eq\f0kTY6z&ͽ-a'9kC(8S?pvm\ث:yQA|¾3AaN0s0⩟ 6l>EQ,[qtEx[<^7p:kzsn~\|9v\k)No$|r 5}z#Fa9k,s9 n)GK/T}xxYܽzs_{TʸN4[M<~\O s0s0s9r?k^}xS6z^%E [<0s6 s0s0WT? & #W^g-뵤ׇE%\msp9999/~VjQmqR ``1ws e5>a W]\v=Gp?\\`k&9MTT3T?%׃99uy̕(p>[6c.3} ~_7z6\0g.$}MN7{^h``N0s0s0'9 ``````````s|Ųúu~/s0s0s9k̕nވdTTvr ````s0s0s0s0s0s0s0s0s0L̽򵯅WoagLJ;w?]999\9'ONm}-99999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999)}$de Pn=ejRi/#KcVљ[R>o +#.Oa6iR-²M1"s6bdzײ8L=vYfo23;h6ܓE/FyC;MyGldžNO0f'[b;-"?N͏~cuyB~\dtfv"f%>n9ݝeki.i9I$I$I$I$I$I$I$ScYcIENDB`mondrian-3.11.0.1-R/doc/images/arch_mondrian_sketch_tn.png000066400000000000000000000447231261646570300233530ustar00rootroot00000000000000PNG  IHDRxgAMA7tEXtSoftwareAdobe ImageReadyqe<PLTE菏闖輺弼ٿۨ嫩b_¿yvʭܷƳפͩ׸ũ⺷ᨨ燇ꮮ汱󞞝ಮFYIDATx}\SW/$DL G 16Bv(`z`IA$F\LbQbH6"sD :2(:j+uZF/vVKL YNBb~,He=ϳJo$H0Oa__M9jjE6CmOErHʇ-Ő29ݲaL[$^" ٓ񠠠 c|ZDx`6So?%yDT_xq+;a W[)B ._ԩmGm5c;|} %#<۪~*k)$J5# $Q$mWA+ӢSbM px1x|D={ۼ^x#?^~mV;vP#":T.BA*&hMkDFv3濙暀e Bp( H~Lm j/Ϛ5kFDLc~$* 2r߾=WN^3c؉H4|xdڼ^@}2v^p~]wȻZ,55uWX`]L[ AhA]]le@0!ق2 a<ÃcшF 5Q [?mIW-|dPԅug[[/(شs啭k\T^uQZ]c9فbq1q[;gfC (ָ4H)A)$H\@`D. {.I8red%d!xȽ +̉`*t\ S*'/<3f#gLGγ{F ^"jR!P`R6B,$DKKHԹu`Wn*J-+[Z!=B]]'$ Noۿ oNjrǼ漝a'l^9j-<8g5^>ZNG`/AL5>45uJPf=r-?XK!21PGlGfsB5~9 .@BpםvBkׄݗyVװW?RS$ `eC67 >e͢ۥ JBLͤ7[r vG1ȏ?D,+p)ʬY" DHaտfNc: -$ `eZK報f8 5 \"V(]a5\AIIHse }ҿf 'rDˆ[F&OTk}vӦZ7F? A$m5k90X&  η%=rs-٫"_ƢW͆$m|$:,l\^[HGyj>Jy)øhAyCjTbxޮ]+WGӑdwltwJ Al;*BQiOr;BVL!l1uZiqŷ42m6u?2Ey\,FFnu h Gq ݯ{+r I6H^XH&Q\,8PR\T:e_Y6hVv>) *!x[|}lEwEQVv co1 bN|ǘ@?<}H)ߋIm/~QuSS%hqBqJzR+G*i)Jvf@/E*X~+V-mw2hi!6Jب/5ЦUNjI==O䚣wO|b#)*B2HV8mۺ \9{U+m'01PwNg zCau9^_ldR-& >xll ZKN='e+4 Pmћ,%|n/XpU7\7Q57a 4A|ӑd,}qۼN__rOkR%U%)AaAzRu>3Qāk^|fX7K nU$=7HeI‹DhlЏnl =uR6?sW|&lk!Ղkwm `Кe5g 7DjF@@KbH70ǒ%%ݐv cKKE&쮊nҭH5b{?vLإ!6H7è}p03uO(G{OA# ھ ]GJD9\*7H#4jFz@bRMw^*.vwfuԬ1p7ڿaagJKsvi @ͶXF}]krz}i;yt둜¸NfndD$e2Uq-)w2KЪbe5:JSiGhƙK'_YZp }Bjd`Wȕ|j-2c +K^G <,! G-9szl}ŧ2v%gGEJLuJNx{ʸo`}k䖉m7X]F]/}4h6Ԗ>2u N7>,:ܢgFC$2~0/%R: ~3b9`V0cؙ 00@4`|-,ap / _2 TxIk)! r>4a8vUV do(t*3pj[ar}'U|jAYE"1l]úD:N累?uR wC^ ۈbQ/a1ZLs)_Jζ#Dt dr\ɔd'T\*lN6>xU H?',aBQԢ1#7՘='VYg Q֞1jϮ]U*"W%<6sQ%(rdn&'{]3 >ܔ`Q: VݾsM8Q0+ Vg%0jkZ* ή&r0"_ /|??mpU/gHi%{g2U=2W͕ @*A7dP |j> ~xvB[Ӥ:]\1<!6\qc28] C]UU] Oj̿'qk=K Wve6DZ^O^5Q. Yܭj!%c4]Sd;]RXP]J>AHMÏj xK7[f) >~j5hd<ʂeT<KCbnJSoVewvk)$m"dŊv.V|PP!'ip'} Kp9tiԊ-`<Ǥ}SyB՗~y0/33S 2BΕ('Br~۪u'gݞ\gl^-cQ ឝ%f |\hkMC˹ ;ЉmP}Bw<)]0 lol5|[3W1eSBE#*_hZH2+3|sˢd}=$n@ ^XwX≴fQlljN4&)5?\<ǭl쓗Ģ[Z:0۴'0jjj+''Mj d:$yM` ~9dmyu:ɘa;Ik@%i$SAV딣G CAމ&߯ S@2q/}Zяef諨в5F4jrU97L?+KЇ` U0,GpmQtn3Uw/kTA;K(X,48,81(>VȮx]xXևce.j'dH=l4/$һ+-BQnR\❙W-Lʯ NZeGQk%]PRw:E=[{T; $sY}6b7]kP!"08$}૴iNoxas'tȴQsw,pӛ9!d Y< [JVs1]L"IRn*z\e$J-q5ǰdKp)+s4$S"@CHg$*"qP{zLz2t@ E.g [\.`6DpC9ZAXꍃDu/r= DozgjbAC[i|?˫_kkR ?(1/FH=Z\2'{dM fK98KXjR}{NMnH= 7Eg+ 6׶w5s:8"Ip<+I*O!Hs#!PEl$ac ޴DAE8y1̑k[xp":R4)e/ tb s⾲~ Hgx QAGdܕr!h^},O&SIP }@$JqdJ{ۅMaT=0I`$r.$= BB죐H" 4lRt;pŲ#R>=  (blYFՁn\IZl(KUUw a|NJHQ3̆|(|x)g7B⒮DRFFM)qqEp$EMl0l}s7-h% 0is]fk0'Q)=K4i Y&`ioY!rb ^uKM&A3K G3 w4!ו4G{9Pֳ@L!r[mHmfRوu7CGf&cFp#Ԅsh#›̃KVc`聖۬Rb>NDlfP1cyvʖ8&MiZD"AJYek I5vh#*eRL C5nS/0v gffMb[6JY0CF)01nRe2F'TRTh:Re PJNAiF>Ddzj1D2*5"n;SVNc Ge:%Lm-}t -nI~{]QV@y'e=p2YqYH֬WN!ONMc7N(GQ gC5 * >3"Ce"KF5Y'`Yr2OT*mP)Za2 Bq݈H (BR3HB<$T7-Z85eV{{7-I:b5Vyn҈$dEv4ŦV y<,ؚt3W <+wV+T 2k3 ۅ02jWMEt8XF;rWWR;j8 h`*Xop)&X'f Ԣx6)]d8KͶ bw`X 'U\)'7 AMHdʨ謸QqTW~C,rޚܖE-b;>kh=f;*+;V`|(ъb(]Uf1g c3Z P$iDC${h VCӕUE@Pf \36Z c,p>':c!c5teX惥VVEVPYE+U kR'`8P"IZIX5c, ǾL|u7~MaĶL0f+3H łvLC &^bNÖq%0)){EdHH+ҾUgV]W]X}t ȅ+-n1p㔔k3!!z;Ĩ* NF`ʐW+oH"LJPr;7# [0-f] GF$Zި *F.ڀ舰 `[X9@,_`8@s{Z~VSW?999aR09mVQ#RҨɍ7b 2wĺrnd{T**aA`q.V[7䧘ka'J,Vk Zɖ_K޷+it+& UL0f.N/ݨd6[+[*Xd#X t V[#H,BQulưLLRHVыƫr-;ˏͦur Oh J'{FN ז/ٳL?Zee"r9iC/QI}burnb šMlYGq9j072n߼Q

Aqb.mzs Gm>x{&^j>A㔫_`qX_4nqkz· SS3l>t=p $'QPQH$H]c ' P$OI{Mz{ ^iv s5 q5|UiP oדC tjӕ{=1f/ %=GBx*!Sx@7Eɐj~9ȈP/|y4wNw"J'd[CBw9|+{~@bw^:ܸ'ut= #emǧ᠘O<@y넜FS'ՠ)),2ݤޢ>{/޸t4"$3ЎDe_(S a1c-RP+ϩ빘>ɪjO< /IU"zEr8G-O" >wR (AK۱ޮWW̊.J[͆6[j -Z")* ZsH<0dIQh| > 8IՒP%囯`CffiVbORx4mhat{-#ҴH&&̞f߾E eiJSty#]⊋GncFI#z"!QX;0jeu3w冩Akn9%m:$ k.8hNrDpxL #Pp)(긽sq-5]@oaI1dOfV+LS_񆆂!Uxkf,!XE4wK"CC>zA,)'p G D-MPK =q0IKL^/$/Eg?`݂pA1#{Bݭ?ZI(~8B{xEk+W[o T߶2qWɸ /fYH$1<}a[tvw׭ˋ-=Qsb8jnGu^͛/.܅0j,+N1%Jp%ItoZZ"qP3}Ey|*DbLd=kEٯ}H.#2mM{*^V9= z=YuJLiM v}O0⸍ޞ?grKB;,$c:$wE%/ @6mB;"p<ٓO,'oUC=`M Ow5%ReH^HNxws宲o3Dž6z:$1闱2|`{(j(?aoDD`56`(<47y %rğ9D?$E а<@WyZƥnEQ̩/-\w__kǎdq9xb2ZRxrga(?='tg} 5~w24рC5U9Y]9"#W94sH׌%}~Hz@ŗ1MIw%P`4w=%? s aGG1TڠWEsh^d H%3WʘSmt=6w(D(oz:)MHHH)F?+T*B  'W2!%=zh?8F׾,B)$> 0{ d)B|2v'DÞ'NrpS)J+}(NM\:E6|0,M%a?`E[%)O~tjلٯ'l$l0˓;]uA޸*7-H EF$ N{!-D#ቢ$Ӗ{%]SBE&LhҔmgU/[˿&v>7,$]ռiA$[,XwW|s!rRNۏY|tmˋ˵]}$d%.눫nMݦv05sHVV?S5";“Һir3$ݕ*J,]ׂ1~}& {w9?W=NkbΩsX%/1Vjپr= ku{=v|:y/|Ю+23T1]~J2nd!$ 3kckj`ҕD>y885S JS<9I =XpdWC-쎞,}s|̰7y?<>h]{ݣ>Jjr{8=YJ-T2oS i8=b*7.IOxgBjڕu .k~$!asdr[mzkYzjAYʱSJ9t^TMH+/WEGD:*OY oa/G.Pv~__F팎V)4~rbՁ3Zk˖$el⪅+gj9PFtzFWݡ1P k9@QїERp_S"JD9H{r4[O}߯"!O6=xa,=0-7w9ci_]޿Uh1j!h1hW}`f؉ʛߤ=(4c/KĕM>N.0#S4 T1wzFsP))  $Km͚7-^`y,]rMY,ƬӘ%h'Rl6dAN|o@zàݞT>)kRQ))s RoA; w*2hes1$]8lh}V֞ko:g/Aco/>'==l_hƕ;Z1 4 yTtA 3G Y"<$4mhfh& ̽7żI<o Fe!TdbɆ]sE}#h?Nb9>crtΡC_6ɪG^fGO^~ogLJNBKO޶W&T fcHqR;Fh@;;1Cy  *Iںtf-шʬ'OQ-lAA;>Km0R^/ض`;w.u*/wvi =Ruz=NpDzPS 7t:G` Er8\z~p!==4H 壛71)ca1d< ᥗۖ}TДtA$~y m߹}cll[Bh("=z'Pw<u6R?.s$Mٽ7fx r4ZB ϡ4/X?񍫞{9[lY?5(pSx`R>-BƣCJHoe u-QQk Ԋ$:45kݷo_?7`]97/1cժU/o{ٻzySɳOq3hktPd%eeS`Fg} 1~.-{HIZ':GhK7yxl([f#Zc$nۼſ˿a/w#_>?_{2&0 B@@ =[`'z ҁ}|5o: j6u vtxRaAp F H=o>cƩ1AOV"C;`[$=|ykWyz_L=ԩg32b'Ȥ8y"׸렭 X~t$uyy(uҕwCg]mwm~;(ѤymޕgOUpu4Wy5 | Xٓ)ͧINJgQisIgagd֧7F5/@'G7HqFv"YlH=||B4y׉tSӑo\gMNF{A! p^~SS?':6h9SFd,: wйsS st>ߣ\7'x!Q[Sk`츇rRj~wRg'MR}:d+sL1%Mu?F0!~$wFHkrȦIENDB`mondrian-3.11.0.1-R/doc/images/arch_mondrian_v1_lrg.png000066400000000000000000001472371261646570300225670ustar00rootroot00000000000000PNG  IHDRU-ikgAMA7tEXtSoftwareAdobe ImageReadyqe<PLTE?tơ?YWY,?>wyz?1 ̔j012>=NX#=>gt,{=*0>?x2ڶї>bei岼?>ƛ`DEF>>i*~=%Ϧj=|=Ր>*>?>>d֪Ze'kw!?ɒଭ.kǻ ׯ ┧>پpty5CL䅃=ԈԴ7?𸺼>>0ËbO >~Oٌ]I; >GKN~2ƈ689=@ʌC׵0%;7?';˽#87Z\^V~#%';;!;_``=n~16 1䬫Сt07-O)xmno;PPSi DPNO0# 1;9(Ht>ïą>Ǿѫ?=Р<娧;ㅞ@x8kmO[aNԿ@@@CEI?V!%IDATxkl[יkBXTA@J ڒHJ Bl-5Ȣg, ࣄ2IAu11N~#u6K4P&lE W\CyGg}㾬}!E"_tO9ǁrS*8pTL8p`S80UpL8p UIןLC,TD{!%+g|G!!w$Zlj ;%$ b T d9B/I{>L*ᷦrP%9GIp;Jfٚv^qIFH}VFReT1 0I$[s:d*0_*<)?Yy;֥wXف0pdCFF:t}hg/Oƺy8vv1q@t)BtdJ➻QIk[hp#<)RLs_ĩ @}b$ YL|洜*ҁ N!!z;2derԓY/`G_ yD%GMrBx9N.Z G%谅Z#yJ+KVBWTw2lxȈUmr:mSŹ5I8Eၢ$"(=b+|31<3֡qU$ǜL(nlVz4xX>jDR~0 egaW*>(Y GFBĈ*vG:i;f4UD ޖ|>K& #>c:_H;$K 8 P &"U8a]|,8HtAYBOo @8 :9#=3#JRCf9UpyaʚLg-J7E}),(~v`IPj㿼n/C^x!u U }K!3y* |/}]9O UR;YTZRKry^q(=ٓ➔ALSH>)-`LsCUVLv񣱬8 ZՎ8PpbXpc>nGgVr喠  l@~[P%ﳃWnͷ.|Ʈ*# GTqx G+x[OUd2d⴦ eQ٩ltN2b%d/1=ek0Zet@D}Y\͎xJŽ]ܹ`Yzkd=yT>OMgt[p!GCaEID`FX&TT?uy!6dPR%J}TNOjIC 5U)3ORٙz)#AVeUSMwGQDPA$GթrUF uDPbT=LEwta@%o++*ٴ#_UA7kH UdCQES?qɟBy6F3\GH[r֧JVE8gU=G@`+ġP%+W*0Z6g> >a5;**!6o|W~LtJS;bSܒݑ:U؂&(, @Z #<})f*c䁧T Hg-NEtT$a Tt!u!/Tv8} y'§*j>UTghT'Dh,S"PF/%D^ErTB x8RJJ12yLqW*]ip,/v6?@,U@Qܩ땦 2p/#^^eB#|Cx}ET3d6QGy\>$Uy$UE#IߒTөbd@M?#|'RS[n;gpDF"g}õ#ȧuTVI 6?ڗPEZ KNQTqC*$-XUX6$ 7*\D$XWf9=gTKih2S1~V;Ȳu;!"Ep҄073ԉ1UUN2" @+fY(-x9b@zT7(/}UTI@nZ|i;,_J&dܔtqBrgTe놫iLJX]&SYRLLLlt&p|']YF* zI aJH̲k"fĜr ջȈ T(Cc姭W G9 LL}NfgȾ4I. wwܑ]7r(ɐxy Ao&6M ?'`g*Ti24qRRӪ:T'ѧ KNRS᷾)^ygEU%3 $P`]07P8yRRQUba,=o X0U;YZg?~aU $:$x tWj+5KI5 _԰1gUN1.ZJR%Y>G+5Z%WN .h:T7y}YBIm^'d.Bd}X=LabW%|^Y|V ^h]_V/TIfR# ]=rg lJ$ Zp< {t'mݸY1&.)y;6O*+UI앞NVj ޔzJw8jήSv"Rs[0q{Ed2#(UT2wU6giV{ձګ@_Jr1{&.:+qԱW)5W%+hZ^i|F㫞uI""a]ؘUT 7>.Ĺǩz'/V-/,+qG}iIpsGCyhadG8>#93U6UJJ[Nd%^MJW]Qm+@cXikao\R f[>u1EUYCl^mt<=(ؼb: rU{񕛈W _+/qZ*,"hGt#GhJM UvR䇒*fC^3|6$&iuL^\^|b3U?R-_uEns?/JVqXKUB,TRQCAڍ?YOs9 L(O HbxW_ث/nZeS!!Bu TIq{X p>-Y/Uج3j*ϢbzzkoZl6-B`\=~3+hlf2 o;,U WJp:m[|"y@ Dk)qVyk5r+Uȼ*ӥzϽ%,bcd# Uv;\]9ar!ɱ FQ;:TM!3}|"D|&AR"!3L~)B]]KRd2,0rt?O`|>g8p F\xhb_mhD %IiPoh\XլW֦"P%w+o(.V)wI h*Ur-u$R+2C%P1)BDg:P4{` wi+p6-qGG/bj*] lYҵ{YJe[R@@H]rC4搙*LBF7lطncg=?"NH/%R: -+U QeČ*SKEw(*Ȓ*EPQ1Ey/^d̩"dgTًO*}zM6REաa]J⨢u5TRW(WVƗ$L'Tyʑ $ﳬG>>U#"%2qUZMMd J3J*5B-SzUqBg%ϴ̄tC[KQOgdZ 2A%T9%ez͠2'I]9.b%j?¦j*TyFuAvhrؐ*[ knB-v&T1H]z,S:d12 SC;ہʯԞbf;`&]<yIPE3!7Z):!Sh񅆊^40UpT*W %H"/Nx\GE C-T7R-U,է _O2W*2w$L QE ֋xY"Jt:TA[PunFba"SRőfwtq*<@3KPT1ȤҺHe"-|eLKZGH!t#ZddznNXiţJp kn{uBFZ7P/]K̩4j!bdU4B+6MSE/hɀ^L$'"uAR==|ɵ>2Eq)U!ZTAkQ_kAQ"%e[V4߂R6 ZUޓILF”*)I 4UZWP᥮չUvLuKui8 vv!@2ܑ'š>A0U%u RĔ!>{(z * 3DTe%AiDֿ`@]^$WYNwj㤮eH1TiPDJ 24Ы8%a}vTmQTI[7M*WR'{}E1QJ]5Q[!UdN _:1t>>>H8*\% MQGBȒLojf TBbz0i7e4n'.({;WOlE]@蔫X2e~~^*X$Tԉ*z$#I-U;.>EPEՕpPQP*LR?uu4U 'Ur*Iלq{x&TNbd#AI1E~wTQ$UcNH*fUT=Uv0U,RE#Z?:KTyUH.fflv֞J;Jʎ!Sb?QI0KTY/L6H@[A&¨o?Rexb}pL3^6F4Ò+zKTy^H[p5};c*##&exB PTQ.vSNf:L1x75 2YOhfj&<&LtK܅TZ#W9V=ROl9 R I40PwvXeycY2|FHVKxy'OTśJrXf"kɖLZ?GSET?(ZQT1(I_U{AITAMvPE'*QLH\^HK=Ĺ LEW.C ĹӤIxr L&Z6&lV -^1ߣ8iO/@A`C,g8hcmd8iHU^E)*&VdDDI*U ̪(R!^DU ňQ(M9I"DАuQUL*LaI lRJ[\rnD: *?J O?)9EP%U6c'TyS s^%8έE^'Cu?ҫAhPŠ$!ӌ|APEmU.ޖȠruDgT+25 ^ҋ(u. Cl 赍&ޫ%UBdB!^~6MsS ;N֤$Mw/C6NxLʔ;)zҜ*N&OpR^f;k'W ʎ"_S$Fe:PZ7ʩS*´dj<,*JcPFմJȬ%Dt]g%YYw ɓ w*@+zE\[@aHe1SMIa~%N )\&L5Y*d֪RE)nTY$HdWSJ3.>CϜY!"3 P嚶&l/H d {YxbxRlm"]')@5b=JC W^:?QUbSM(R `$ QW|gUt"Drzz4/pa&82dvۺ̄IubPHk-Bv&ZWT2VŔ*&>y7~*KQf[^}bΩ G UŒ*:TU?Tx0UpTΫ(fʸ1T/PeZiNfә`&<>@LB`>+;C./V;"geM-i1CƽLm 4̅2`T*$j4v^ RA![=\N#\Td  u2^啿#zd @j"@Eb ziY "y=ȴKL|"iJ0$ːZPeɰ %Qb~ nour54S`UPyKʄr# JׁjREu= ji"BExh݄*ŔJ=qZ!> bx H>"VVK SGŨ2q8V.UЙlP9\2;ҡII6k%U%D;KZrP9g8|/rzaUƥ!n@Q:TyI*'t %PR+$ T "3dZGQPUTzK SG2>Qz l5*zP1—UWRTQKBuQ ʪuτBTWMn,)P1X*DHVCRJ2b dZ?yL"M _'Ob(UUB δZ iXJJ2lǜ*Z=*ڡTQ-شJ@uMscx"LMd tI2P1L* P6nSEW: /K ԡʶi"K2$×Ρʨv. bN*pV-M&L&Zn@^&y" T  RE -7U, *RD "q"ԍe*ڒ&/*b(UZ4S(] Z*-*&TEI**8JD:JJR@=bi2TD|P Q$]| Rfkm%fBB2UY TQȡ*UpT)*)CO1Up`T*=_>_?B|ST} L*e=z>zGZSV}]*80U*iU>;~i?Qݝ@*80U:Խ! SJy+ݍa(#UEG@NRw' Q)TגSSGS_?PaQ%VRTQpJqӧOdTgW/smW,TP_?{j㏔XyT*fTor˘*8Ǩ:U|?ޑ5{*‡@< Bގxx{u q/w;9< &Vn-[s![mo>[3T9ٍ\ޢxTT#@Չy5[#9e+7b;T-_ŗsWU [*8U|v??#zJn{ٛKL#px;s<?\]%#7,'>Vs+pF@/a@z_?#T&[yխU H؄EUV#k*7^`,d2=r o[[w*:U@ƻ:੒#&& TXy!Um0,wZT?_W[\ QȲmDZ7xr0/02somcrzT0V;ұӭ[[^0Hsqsabu*~n[˫Wr-x+l5s_r8U. s ygkoݡK'k}G{mXH7=`嵷~rdpaD8~ @'.U~߫StqxN^u3]TaHHф:;/!TF@;^ #UYBuB/]hT,2L'  ^8v8x8rceZE8{^g*{*y@e{ 3e}77{c.{|ڻ^^㯥}תޗAM2-Qxp.zS]lZH S"I<|xt>:{gı="UN=\i ^S~pkyU* C U.wpϷW)V }+įWZTC{Tr @ΰBm[3)gXy'<8{y3:Wy'w ,_Qe5޾JnoU^tZ_^e*{* Po'"G|HߵA,BjӅpޖ:;}/ۈ/|h ;wȑ>O;$H,QeՉpD\&|V T),`T[T4dokk C _~_3L~\zd"'m#|b!ĽZ+td(`7":Qx(F@p ]Ja; y3]"Ul|-q3ov >'|ɶ{FF21e#Z!MT 't TWxyH 1U0UvM xrTJɼ a2"V+//HTY~|%ǐ wXa̶0W}pE:AXۊc`* ?>M0v4Ulg(-HٕoMy8^;`K&TRA%z(X[ϩ:U!08 _T^SSSeSp:J4Vc```eLLi֫ Hj/`UvU )]7X[C7^g׫lKu-J9^_?gu|ZspΙ ,rSŐ*x'WO,Zʧ5˕90qÌT;Y_|@I.bee c\ 磃B\133BmQP1J/O>U׿׊ayo;a={O@4#EC!aJ%}OBȜsPTTAů;o-*{0N>###oy ĵkfga@pãFČڣO~#pTV(r~k *zTU>*]]@x^p,EZ.\5(*( 0U0UPs0ULAEmSa*Z)\ G&-*\TTA.4J5 U¢W1Gh,*U鳌RTgل*pTy}QEwOQ"U$3Jn"҉^\UVEʈDY**נ >'jc ~GALL}UDHVu T֡FfP ] k^A=R@E 2Tb **R.|8ߖnlDaITP ʵk tdS,IsTMNA*תSEx,H>Nt )xYw$ ͹۔wY!ݧ @i"N}kxQB(Vv2*͉kӃ~&NpU*+U UUi$z "Wc>x#B=7=.60]K= d<=tqxNY5F~ 9TULf/0a&4P9uʖ"*OUd٨0*PE+'ATݬ;HP.^sKD(nd3JKb<\Zf!dP̹ja;uaI9Tp]Ťe=t*_V*j߈Q6xl`o߰KE#6ڦڈo8})™e#x<hCGn* h24=vuaJ V>LAEZ/G,GNU AO`b!(b]f{/Nls`<T1(aT͞omRȡdsQ*B#2BEfU ѴJQEU E}H܁w&=DO["6%}šWѧ=xUhWt PemWmk;!d UUyS ʪj*JbR(}ssx@*z{)ֻJ;UUĚLMbU P n=lOH'UWAE1瞣 *x)QCPe&5*(DWZT&;u7P"`rSmm7H$ $UZ^Pz}⎌64#sbTo H¨vm *1"@LSJIUBڑ;:j*¥*BizC6dJ;!*꤅bJDN*e*em&-궱@zwXDz%wTVLy:u6-WJQLRE}[* *(5$ՇJYJUwHV=ݒ~PْF)`C,Ꮣm0ː䂍\śV>"cM ZP9…U&"z?L2TCJ?*I"%詖tٽNY)@eXSĢYq9NƜz9qaqa+iŽ*5KbJTa6US9*RSjm+k)ʔY)2*pNXgq25n#ߖr5h]:V(RoVӆGbڅI,MZJҡOL;g#:xVK2hkTREwrJ*bLf1 T9x3x*J]WiDwƹ[*H֢QT.F*@oZ z<.DK] ?8 "YbŎK#fZIhJ&ڣzJWezKod_21.T9uJ-J%[9d*;mՎÁ@8?7WVdaUU5Fm}N4mo]Sn76Bw_€*oUo'33)qfPDR]n:UXDIּkNK?LHZN޼QZ/w)UZ76(2PŢ+U"gUa$*[y@@{"%D*U˰ j/.: o %F'OZs9GrIIwI6hb/s&BL^9KII2,n2 %[l-DGKIK 'W9B 3U4Sե`쓝.׼JqS+zb\dr*o]?jF+JxT=7 n4EёiWooU{s*KtnIpbK3d@TXcW3TU:&\ڒ8d\*3U Br"W41WަKweԻ^WZwP6 -hF(](ɐ*EY(n W*FRpO(;[ ,,YX;0*;QjRbR& RhJ)UN*]M5xA6'6zo7hazC5#W9j QC${.uڒJ.TPY|fRTv?hiȖ +VzT$xhPEryhI[T4uN5J=JHnAvݨwqj!@MAj霛Fۑ%ts&`= /^JBR 2U*--HFTNgU*>r*e^{kn VTA7Pk*_A+1]bA-mտשO4iЫ,-ݢ[VL2X-bL+zt#2{Ң)QACaUFKX_Z ,Uk,Y|lca$i5_@BE6QzqTBH.AXZ'b7qN==.u7ik چօL' ̈M4Ti70 Ȥ,ɫ[;tG^c2+D;]ՋWQhȍO9|^E?J gY2U*rܦ\Mo[z/6%]퐼ےu'6c1ņ9wҚUX WJ!/SE*)|lhrm=wuS5V4N,IUl0ɍ/굣5|2.i]Y*?%ѣJOLT CKP9,BeQZkkW~m5g46>y؍nlyڝMnmwצv ZFU4&tל/n+#twd_Z&gMTTpmIA dj0B>Jϝ7z7oorֆ6z6 KjK5Q_@I7/z<o؝ڼ~ $~J'N]5 QURJHCNbv>愑o(u@&I IQ;(buA*::JE"FXwбu%\kFCD$Bԧ ƘRe] =Z*DZ05UblɁ'1 ~unOܴ n+_`4Q(}w{~F6`F%e^@JbVO!`@G^H?GGU[S7Uqrfy5ˇd,\^ rx6ROC$22>rSKnNC$SAz~g65AE{M G߻6Kvsx9MU\Lng,1Hq6i8&i;=#T{4uMMECDlrQ%c MQQW(+fJCo/()KSҡ RerRS,APel&UAeWA/DM56z4(n'>R.Wܑm'oS nKmM?jz+ϺMDCkU(Bl¦(Mp5j8?=j#&PŤUH*` "Jo?~/r tvbgyIʤ"+R .TfgP1\ &EA {UsRins1FWtTS? j5*H|kGH*%B?أg..G-D^4!Lt&R#۷L1 /D"Hé,8'\QΫP1bw\ ʥ;@zU TfyPW4T!%TgzsWCrT+/sHd\<,I y )RiJ8I37єR9M6 K:gHiQi6m>K7ڣ{mo\1]1[r i=!G'_yF*,QbV= Аw.ݤ)IA$Թ&8)JתAi2<sR%XjʶA#7]ྲྀhtm-L#z$•BMڒ'p^5Tܼ !Ǻ̃B[DOjҖ$ JR-@wQx ._0U0U*O{tӷ*Y~{A(a(6޾eߥ(֨w=_(ͨ{CE"L*DOM]:I8hk.>+L'uY t~DޮؒLB78Rop JY;™PkoTx׺T +Ìx6UrT*Ь<:~p%]:/ȭE|mF?TyT1;ւD'+@9gHDU:ҩ8ʥK 0@AT)w`TiJW9RUz+=|t#T0Uj*OqmiJ=Youmm[X @KLQ&ʞޯh: Qy_X*: +,.X0Uj*E/* .=ԷIu6me.AqT)^TRޥJ9ؗ}'% * bd]"rTt6X*PeJ-PGmK^|?Jս%!RN"R%)wbix[#VmUTyZ<c5L=UTT TyifJL8JySeP)+****Tj-+****TyvTTTT)Uru8 Jr*kTTT"Ur-b*-***դe(,Ae0U0UKSuH +R-Bl@TTAS8 Ϝ?ί LLLS%m+5G*r%LLd^ݻk?S`[.bUSs{1L3:~ZHٻk_S`卺6 e mDZ7Bӹ=e+PU 8x[ջkS+5vMe/UܞI#V}a,<P𥷻C: Ur-&XCTߵ$V֩^K\Ű1vXyN x XLX;T޿=k1yr|2UY9x)ۋ10{ʣTx;AC\GoW13Z-P:T TfBӹ=; SG_;|UUWNf~;뢐pAwY!TASk8 TI_]IJ9yR >fnlRծn/.NDB":fLP["f5֋Іtz=J]11άɄmUi"TpɱW2/:ٽIZjkHw.CRܦs> ;@~g3|g;BM<rSbxx|d VdK*s%\azxqPz-檒):GG= X]Ȧ2gϞm dJJW W.Vc&[>J~UKHK߻!TG⦽{k!`TZ6VZc@! P-U!ǕV4UyPmUI'8}WMÏQw'hLL=FUT(Yp PYUP:QyKRBh@VʞTn"Ył"C *M ~e?h6PYb\%LUݻjʞTe,P TizU+6t'̼(8Tݩ|rUr 6ųJX:[T^:7B]TwȾPjqt8|5Py\MU&[ni٬2=͊<GdPri.XKbU7\Z ȻUq 骪[Z2Ȃ%+2VQb*j9JߺCVUY/[n@?*;Wϔ@J!SZ0d9"'"Vk"Q8`x|oEsN *U Nu)BG%V m& o&?-p1;6U*-S/Y ZD"q˟BʷϖUdU.UJR!VRdhpĥ06^q0#.e|.J VаA&g6 m&DU%su|U Eޭ@#*y5_J>R2AJS( (QԢ$K 3*z P TIuwҽ mE.$gV#n|<6JgTU}a+,+ߔLOб<.\|lUw/T NFҋč>pϳT6 *Kʷ3;[%3FFCUE"Ҫ_%B$En#Pt}#:CcIj_+\>$DggV 3 }o݈&*33 CEHϑfg 1ݷoc*"Qe5 PIufK LifZQcdQNTp:͉YSɪvT)ț,7fJ*3ʬ|/2 V#d7Lj*H7 %1?;#P$<9-R1+UΤUaV/|p9L5ȭ%&EipT/iT1!3"p"#(Yq Y* @V%1Y*(#:=;;ɍ.?O ~MB'&L~Vg3%Y}mV?* 2Uҩu >1d;dj̾N$̨zr]zr5o9VUY$7p?.odjڕHU}ejXFAܟ33^!Tu# TUխ6W2*C1aG"xJ*_r3,M|?D>%_Z@#OY]uOY 7Ь2L:e \YwNP@{ "pL#I|NWӕK* U**TԲ9-zdRUgnZPETjچիJ~RrMʾjϭVUe*AUrw6W宇z>?o#psU/3S0UU6 ,*PI)aD-6}A#T!<|Oɨ\R2(U,ҜY%N$<_$)*.XB%ǔ9#( YE9"8vXOah/ ' >~b_9a#*&d?P3>TUZ5OX1 #"^ O!O)Gaȣ1JAU*y?EPɒsqPTiP:؉*|;T!;')!=. bɃJ)ڣ͠ YeY"W横% Y]0y3bdU1AT2h'APu '"hT EJD}&!b#zT;sZSrϠ*lgU>gB?gTqE$լǟW$Ȱ /BVɪUwX@H\Ԕϭ7_m*uZ$P%}{*5 06Gϊ/?*=dN=iT1[mP)m@ = G;aUa0b]mzUNùNΝf+"2m0%ɤ\uR2O0?T"-ZY$PŢ*,y91&$<'2Ȃ*yU)UwNrߓ7i* )j*O41%SͤI'"͕HEU>& .LȈA|QXUEU2K?}D)Sig0NaoU t.xEUESrZ=N7DDʁ bn6DƫlfhI'UWUJ:-2HLM2AEUAߡN^;rzTJUGsT9e>SS$Ө/Ҷ.bQ )>H."s'D6sak?w"W PŠJ8yT1CEK:||\=pp~Re3R"Z_$PŚ*A>pHAapW~CL<v )PE~aLB D*gb頢,t벖SUƭM_fY"*%̭ 3dfBa(UE #ơZC7e3S|'8}^r9J 9gA8<3ΠIxTTT |f=+T)d@U Xm~&*;E.N0bC޸ ..?6ɠyNb^˹HT1FY8wsEۊrAUspXN{%\"*%,@6|*IpgQETqP0/$ispkWEm=Gۮv)GMOVӨ*ω"IV&bJR$GXV%Xf*)pd&*~Nv"2";(kz B|b(+R/Ut8< wxrP`Pz!&&RWlT*^;*.JRY)c@K+(PE7BJ7;yA"3JJX! *.?K rSE%s:9Nz=ê0ByQ8Ȉ ¹ #{AbUvzON &b*E 85jXA5i T)S`e7╗/ϻNv:;O&3:}*<ɳd}-32B.:;V+pwc俎p.H''(*8KsvF2R,{SsBHUSXc?'AdgP|UVMPYNU]eJvVEFԑ:b8(~8ŕ0fŰ+LfPg'ɠ 9x @@8u"nNu F5AˋR%XU*DXώjUQP!(x* >~ ?4'"u !8V%f`jNUQaqݔ:F EĪ[^$P%**S%7(D]#룊ݼuE$/&2ʈ0BfbpzѪcU~ NISVeB>N9pV bU-/bJŖdU/yT1FMGAJh ^)y'/$,w#qӂ&MNa6*6Ktsdy$!8*8Ve"*&T \***"rD^&[ǚÝOL>8v93kkg]fg05*c%#;O?yHSDsq=v.8:af bUjiPE;b"#GꭊNL_hJo:-,ҼEU TPT:@*$dr R!*͠J] T)Sq;G %ݟ) P<7c{`[7*JE)HJ验VC@;@_cJܖxzvԾg`j"Uu/ҤEUJSeU ވs;@"JB,ÞD2nʀƫbXmacBf]$Pź*bAJnTQE!U b]a:*QEf`j2U"qb8nUXn<4Pp@]J*shUQ%kJUpo =}" SłkƓ 4*2u~|N+#8+ q{E:{' PBU+)P%ey*٨m* ^ F1y$4rF9T*G!+r^(A<; 5n"*EU)UJR0rqV SJTa,'gظ]9ߕ+WCE"g*;98+NQr;)rvM@'̷HAHY+PJed:@iQnXE 4|)*yL&\ W%gHVY՚sE64-R T RP  5@r.(𣣣"GTqPM*li"o:U"P'= YiaUI69J Q TɗU ETəJ.WXie1.svNEn^wL,Q%H8Eb߉*\eV ߆g*$bғF"*YQ ׵U*.ADBQ`Pl|U \¡|ZWԡPrX//3N*JL)Pc@ -~ | ӂ3sA۬OtH1"ʤUTU\a"Ϭy3JWmJy*Z,X;:g$'[7*iEU LZ eUʟXѲ(UVǙ{OlBU\"7XZ$PXVHPsgC߭*E/ c7g1=-5Tp@YBQ@+,4wSͧxWG]P\(MNUJ*U TUt|7U,ḽxJYY:*-^||j~UL^ 5*Co@R-R^~"ј"UVUQ'ڴ*%,bUG >L* T*kU5*l6z =#`pkU@PqYR*>z luٷzȿ@aT۔DhS/VdX 08w$zM|]0alc0RZPdYR6[*EC!E{}i)vBPt8e ZU:B!:N5ONrd堊IVlFU0 X7 vIp])o?o&&EGz</i_@ өT ,@"U V'w|v*ͩ ƀ"}%V#_QIy[JmXKQ\$܀*5[s^V[JUj^SUR%V]р GA#ȪB*R ERڅT@*b񤙟مN,HAPReUmKT!#ST t> l٬bz=]!oGQmTJ%'^3d^ ;Y$P Ye`UA'ԒrgI~tX$0%qx]Jx#E |^)_7y#͆9OiJG<Ti=UAPTUj;RtܤH} U`\UUSz*U,c@5؅+H7lRQ@K lլR%R@~=2#)~m _*T)lJO]**T/[{2/߯ԃګԠ\8'|߀*VJIU!w T*raɸ֕*VJ5IU,VJ U!4EVYUg*XeTއ#˵TexKøws>o/--|OM*JYT)g[r 6RH[Du8,P<\:*mű]w7>ܢ-mT;@OԝycU,fP5U]P$UTT2}gIVyW4'#ttc̛}{a僶YxXRc@TjcCr( 3ɍztfJrGE@#odOVFt<TTShgVUjs hH*DZ}cU7Fb"-B}8\EfGآ r3(ͺ7+#烕Y_? T)GTQQ̫59 ȼTzn(m:Dr%(YX,))E< PJ ᝡXOY$U٠#$z% APRU)iT4 aPc@T`P8lrŦ@V5Mt),_lTy(}keBwW}P/2JL|gis!!YTi U֛7UT_>8؛UUjw 1022%U@RSQyNji}]>q[ǭoʨ<&Ae8<Uq t}I5 *-/]OȨ7q矩C]ēAv:h']eU@{@#8NAU@Pӓ"R dLݠCB;Th[yVz~zAiAPY3##"3I^Vb *OdM MJ+ח8 YŶ>z>ɳEnI(ULr F@1aq#<7*N23ܔ8pVYe'u>#f{eUQJY%MDH222YTi5U3 *JG|S^^=]T); ">[U*VE&g!SjjSU*/gNʍ*XRFN)PgjPJE=4*OSIE9$*ֲ@)q$ ^=هAS|wbbbQQRRLkmmmR_f5T3zST IBTUJ*7DfjzG%]0^xS>f\zzj7.RLufjB_vPUԡ)fI%U̮"r>drl81W)ULT)StȡT)Wgѓr@=*^ *JiYE3I qDbF6o0;$3"%HWM`7"d*ʪܦ4)s:N *rSNsV **%dx,+P/*,WFba_|K@T'Akǀ cxb|qt:~>1èNλD!6LUUU#*/ZJVnyIz SPRMN *cbIx 2k 'NyC6%ӥUNGոJc@&6y*anuߏ/t.rrV} #@g٤b!2X) UNGح_ b*VEUtE2CD@DS@*ta;Y;X+GÝԩ R +ݏ>TݻwG8T*G*ws{MgNҞ$G))^PBXݵ+@jwJvT*CE7R)*gjORTF *^/b%\xyl._|[8UrQ1*G*U-*s5Tv4Q+b˗^/_?@mV2*U5LjT! MT*Y}_)JO^T3TM L䨲fVɪUJsUY *G*W%=Bַ4-fReT@TUehTijwU Q2TBA3U:AP]JT,k^*J;g Q)PTU< XF߬@FkuxAPT)ӵO#ʨ"y{O*O;^+i6yʟWO UF4U.m*ut"**eR*z@Ux/]*JT9SuTJSeh U@PUUTtv7RvU@PHV>VkTHU~ݻ@PTIVjTi!UU@PNY|TJTe{U*J JQ)Y/oCfco8ڷ&4Ti lЃ:4{,߹/ovpBn *U5T%;ͨ2K:c=.ِ٘nY8~vMPTi¬R *gtzrӪSMdd5D3ewrv>6vؠcIwčNMî *MU4*.%M\HDc)CoFg,3KcMhvMPTiR@ļ.x,7TjYCe|.ct(*"w(&4[Vф^8+ ߢT !$mdU Yg{ELR*PTU3h r~cURhjwppw'5cKHv#u| eU"nJhy0* Y #rDNϗUJr}V'!:>3KU3V~LrYy†| hvMPTiR`XeIb~ϓUf`ׄ*-U D"JyU tPeKeM*x/+`>2@APrVi3&8LU@h:X*%vKHDPT@h:Y%*GL|d!/MU@ U2 1V?UPӟ~z?AZ*U t|CկIԠChzMgA*N-*5ټJMP*YJfTqҘQPD453rMu kݯ򳞪7.֯_^PV ZUUwuä^xOoH=۶m_.g:5j5Ymo*XA*ZUXI$HHUUjnǴyݸJ>TnˠRpלi{TyjuP^$mz pqJ!rsT)jۼs6F7Yzb}# d*78$C+s9Nb1n<~=2P1l݋*[EeμuUkT*0^SrQ^r58jH>$~E}[ug6t775% PPҷ|PA*#1ޠX/H+qxͳJW{m/#[*E̷k.kZT*:YEU~G1Tz Y~h(&CzrTjoamUE,ɺbuYJf+JOP9/<䭥*&;yB_nvUJ7unT^?U:ҾY ykJ$^l4luW4uffԶTw*U:g[U&4{N_n Sʾ5_7UJZ&krPJNZ*M~inJ]UU Rzbַ_:YP'UrfubY߉8YzE]+"PnbXĸr:YsX*Oܭa8)6~zj7E S~u3&vN,RESv8Ǫ΍O"nA: U!Gwԉ-$AeGy=&N2d*U* +\*S_(Ur?Tţ~h@LDHp9t U:~'o6{;.FC㜶Qd?Q?aW22u |! )閃*U7*֢J~T 6y'ƨrm 'Y3Fs"&4^dผUP''m*ZG(v e"U8ZgZU9XU*+Q%bVUnPIdlu=vʈqV#9LX]d%E]b[cD._WUk*q͉b84 .$O|ŭFfkJJu|XY*w -*.nԔ:7OHWa.N 8Å,d tqLl@Fr*cSb0.vqNY{fX{~[b-&:YJa*D?pr~sK*+aY Aңƨj{~u:;sUwU4k䰛UrQ] dKOCD8 7wC"99-ጂP͛A2T%+~i|UŸ Es -U;TU11ɸ ~YU^W98&uo8##D!Qb|Daݾg\* ixwV)Az1IVΣ:s . hAA_3E~oߜݼ-[ᇹ*qQ2k^䰲 m9Ҧ\ˣJTQy#;9g'*(9h/"e?!ϊY3SdU^ݗ[lǏ\ow#ttٶ]xP2*v=ZU<V뢊l}/f6oe>sfT2}WI!K@YB&cMA( S[g 8-"{ݱ xA8#NR3_JgJU)4i2ܙI9(w]U1VQ bp'N.r#.gk&EIL륊yRK:9N>Kr ~ND0 %g*UVռdE裊fr\ QE{ E*S;'b 'P8'b12"LP>sB&N :A"=b0OuP]Jya.990*}F-*9K*a &QowP1FdpUU7Z5du"9wQvYJ ֨XmV)ƨR0h_;XTŴ&gNN5JvaJcd)ʯΪ׺U:9s4u1ӧ(C*9kTi۬R*uSb(U[/ӋR?UEFyq!Fc+YEik Q; 1G8`$⸃yA@.Q`UL:YdVkJZܼLHUvp;{sqqzeǍ?<=6s̿3-Qܵ~=vwvX=;s\x6{Gֳ-U7+EY鯉*yvLJ25/v_}?o8FY!!EbC, kTi߬RAX1u֪e6k 0U 9KoQ4X[ZU8TVL\*ņU  ^&Tnf VkV)V,bj=oL'fT%?"U4*|kTi۬R XeEcK#UѽhjU_Un+}웙kKQrZU6T!k_ZJC@㹪dwE_Bfm?B}ףҜX\J;rZY*&˽f6T+#9+f*UZJfJNَ9{o䗠E*y:ҖYxX9LܾշimBULDŽUѾlӨbrJ;2rZYi&U;fUbXZJ{f aH+*JCT:+U@PUʨR#0RZ*fSeU@Ye*7TJ,=82ǀOWic@pdTIgaH+WozUƷ|MʂYpmUJT)ag?̭-O2^A*Di*U:#eOdy@?U3hX_Vj] a[ygϞ19{3:gp%isYJd>P>V,\lSjUtݤW1^ U~}گuPuJiHg[I>?ô>A>?Pw T=hzk]nflkTi U>~og UcU_/hŦ?~|OeAP/zM/lPTU@PTU@PTU@PTU@PTU@PTU@PTU@PTU@PTU@PTU@PTU@PTHU]ɮ4P즃*E;b!{᪌k5\F4J*Jmv߆U凭APv/ |tk;w| TޮYnj"ъM/O}-Xx`lʳ!]pi zGw˗K+/}_].](g,)hŦn6VMUr4|޵lQ"/VVV޵6ﲛ.ߊM/lJMTd U J6H$:z+x~MO=[酛}>qMU PV*&[ lH8_!{D݁]G.nzlD+6p*5m:R4_mP7 d=+PJݙHyt;ne6]utW5}V]5m:RmDccK,_"^i]X]nI]|;C.Zӏ'U9zMUjm*!WŋK_&\ale6Lwnª*VMU,b/Aܐ.\ kԥrRKW+,ؔlRwaWZL$ |R릃*E~^[,lHJww/TK,|NdQY?!M'U)UJTڒUUGTiM.$gw? _R?(UJ @*P fnPTUʯCw* TSՒEIz٥U@J˖Mz*[jݺ[ʮ[PTj-PTU@P TU@((PTU@P TU@(PTU@PTU@PTyR QK-u:*PPebh/RdP bUR DS !*PPUPzlRU@(*+es/蔧e;@ Tto=K ](PTj*TF4 r75 *PPeR}!I`߇#ˠ T=T * *PP * *P @AU?5*PPe3/sOvDqկ>2 U$Kd'ؗ.. U"[dpTU* -_rPTIŚ*Jh/@PCQBk*P"$U/@P_QJ 9PTjQSUZ"* TLI)<)|[, @5J"[,1|APjˏٱYUJg*P[ʆ-? PTںQNJW@Pj~--?ȣ+ EQI*<zǎ @5*c*P|% @mܳ$tA.+̏TUZgwTѿ%: *P[-쨌w@mų*P[R) _|TUT}k* Tit= *P[K/* @PjeFdPjeFTU*;@Pj|*áTӵH|?* T#TPTVU|͖EϓJѡ0dP1<*{AR}*PƩBnݾTJ~pÖ@U>jGⱝlT7?Qwa*_oo}BU )= z8U O*RUHX{U1eM:^rF++CeU8*CC BTHCP*6kU)۾Tj+<J$vW?X\u8츂IBVUǺiVQ)V -]~O}xͷ=n߉sbx UYݮDȮD]0 BP`TȦdPE\2*B䝅`!WUn#Q%bʴW?dP^V]Vy_~&PЯlU2`S)d bTjZfYPD}w' YEAUV A;JzVV%UYYVsz=!l"T#U$߫G^nV+LSU,Oi?2*Pp||\UhQI\ SO}f*MffB%b +|xs.*̚B^߰лЗJzS}My0JJ>6Arzm}*8z?OMPMU>1>YQP1*w#:XRDUI[7dt,xRKmvvюhKWp/Q%Ezh_/JoA~̳*>6F;)YE>5%_VM2Z UT"BHdGZJl>=q$OJmQC$3*8xl)RDJVmi8s/BZ =jf%[}tYt\4#UZU,*)^]VY zRŸc p!(_#l+AwDCmߦ= iWj+'@*DPOyҪPӑRT Wʰ|"FV*5DIba\ECUZEoUTFFΜgTW9*N}v{R<5rwR7"-=rVY<.2"={DхEeOhGE dUQ~ P͜U2SJ*u[DlHU!Q222u~Ze'#>=Th\%UQ:@騂ʕGs2YҬ}c T v2HU Y%3פ\T4Q% d Q30*^/\ TU>V+U*JTUePVYU`\-Tւ*ųJ%+] *m' R0{7,SƋ͏9*[\ X*3D^sϽ/q2k? Ye bW\*ٛ3C~l ¸VP Y宛W?^WU@ vV=pBU%\KAho/-U jUI}&.yU0>HzA-ULT_*QEF+.W٢|%2UٛQ% ; <.ϰ ^J_/ ,,`DM|GT <6ɰG~*~>\VqT9!7 WْR|YTQ%;N"/w|х8,R/Kn yR"y\C:TI>܏"ObYLeU!`S਒U! DI#Dh*0|? `U] $D1Jȧt`aȷbow_ԚYE+Ye;o| E6%.ܺO&x|K*+e|?𧡮%'**Gx*ҎtR*[NCSTT*PJ⏏{{Ż^Zdʹ{{ )W2K6%&`U@PŨ75!2}ER\/_|x㍏zTJ5%JZ'APDoR&%;@zTJ)cU*WT/^^2U*wUO~ϾwƴR+U*YRLPQwMDҨFQ߄T1~'č# ^F `A )]ȶnjԙrHciUpuV.n1ք!eT)ovukwH^Icٙ*} [E˂@8TrS+BH:m ż q7XKPˀ9Ci5E/bI'@($"|^V#bIE bݕUGQGog~z*ǚUX"}mخezQ9N:6ke{@q `P[r\h*E kRNJP(L(vӔ?DUf EOE= @ l[%&e5٧NY% %qNnS*,|a tF}b*** _g.#[7ǦUB.~0-LStkTf);"ȩl;:@e}|J4C (:J>+h "]V XS+,Ng4*L3]db*9HKNYd**Z~fYpTlT"ƿVQT[$`zd)YX/ncZ=mU=!X%h4D{#= *KStN/ۭA̋k2hp6o39cv#X*9xF?#*0L*X`UV*k~\聏*»k~ͻ50UU0QdU VX`U VX` VԑJ蒢IENDB`mondrian-3.11.0.1-R/doc/images/arch_mondrian_v1_tn.png000066400000000000000000000301441261646570300224100ustar00rootroot00000000000000PNG  IHDRϦ pHYs   OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3-gAMA|Q cHRMz%u0`:o_FPLTEհ|6><݂=hu-ä>>f쇇Ռ>a,x4Ħ䓝xżoXl'wxyѲŒȲ;?savE꧵?䚛9,Ѵ?>D6_@RRT^j)̎P 5凌Ԫ 1gghF:4ꌚ7Z覩ޥڨUl᮷Œل5v0ߴ2ߑ64%!$6 ɗ{|Ƕ79 :90툖7Q^&}5v0峺5ޖ5lmpo0qswT\\_□9FT)jT>.1;䲻5>.ưȮݛÙ~ Ψޥi-q{P+@88цn 󯷮a薜mthmlmqqqRQ"sIDATxܝ}\SWͣ$@HZpHy&UoR ҒShA LHA3* 0H 8iVZef$]ݘllkBPz@! vї{sι|9q-fzO0tv@ 8=@g9vXlJ\t)Py/Ίaq@2`zXF@gL8&;t8 Fg(^3B Oxlc {C},+GX|=sof%Ocޏc{ So[oݽ}p.pFVGQs1~b99@o=Y*qks ?{m=}zc wXn53qCsjGǬP}V[u^k^# ,Э걱i #\ܴPXl{YF:zUk8t 5:K 36d ޢ9,`r~\PwlL?̪>4ݛ23ݩZAۻGv]ǏǏ_x_GŇ?v ǏǏǏۮ;5Pc@Kh @uqαYY+emjPE׋ĨE[ BS!*Ja* RT*xb ݺu" V(οSeŰzy2n (^(:va( B0?j\H-Bj!QZXH-ҏ^\ō5pBpY^61&֔@oe8'o4M ?ܬz[HLmV`?wlᇐBB Yz~~ -$nRjMde%N8q 0xUg dޟ`޳zc)FdVQ"Q-Dp.C =0dJJJK1[(ɔ!,Lvݨ<p{A;V6%݈4s *1~b wRI7{(ջM4Mf,HdG%H.ǒ2D%Hns^rZ%+=fL^XWŸ)F#dTcDmmJgAEBe <=fnAA?/edƦ.  2κJxv}kLhECut J%n(/7s+R Q" >c];cd.U #Aq,,Fc0:~Z#ݓo6~e{4b$.u#h4ձ ?#n/7 3B%Ӎr>kfD YׅؔBz8&4JJ4*Mc. $+ zkG:Dz#es e8#Wa%?|8êK`u$j;DF#XJ`+}Xi,QxMZk"kli+TX5ˌr)[PR@ZD"#K\Dg) ** ETtitaWh (q\Ӑ[+p FIO#QKBl`,S7\\^T] (FWkC]sF ȲFZ VB5 }k8~0IFJT49 A)TJRiT_(RtO@gEwE+*zk6**1 ZIdrNSWcˀR*&%.$/a@PŚZ*Z~"tizECYNHn`}X˪}\0`DjiTC׎w$$Zt;KȦB$:$3MfYup V/bՆl]m2$6f< XÖYGedIti$!/@;&%Bmc# ]br?{9'jՅn=dV`z92r*wčąbpfp D&>>Z uR1L"ɡxr a0RI/ d\N#6@JxH Jdd0GՒ>űM&tbθZAmEAL9j :t5u5T <({-,Fw! J};%%輦XԷOETPk`ݱd>]yM r̢T!Y9A^m۶ms{sk֬Qܶ #HWIFCSh43,75B! uZ[T >Nuih Ѩԏ'$}xM ^M/E~X: 9 N#t@`EmA]( Jaԡ" >$W  B!OE5` #BhjpZ'@w3PFFOf D'T,4S-v4ff[k@t^4m[v)A\G `֢R1D  xIJpnwKR>Z1=T=|}z7  OĖYGPgpmA}ufje%A\;MAP,'zJ<{6B)}g^V =-\QrŊJE u:,c{RvGNGbR)8.T餻 N18c1ιy@HuxHMZ(V0 +bB<׿/H:ԩ3ZiQE tA8ñj իW=1}s&pjq/._|˗gU  ! @d@w[ 78}2+;9999Q`rۄp8YsThsq,qhz㌍QontW{qs8 VyEy'n p3%iUr[c#̹wXNLoқ;BҒHZ]q7q к=+X׆s䨋o5Fun<;'w@q8kkssZ 9-׷_A<"]iÝ}lp8AH#n(5rKDbHEbq|H>2E0-X<9Tӭmm@-4 F5hIS]wx\r-aE~~~~Qe:~^++ .+,m6+ÁQ5Hnd?_/  :@d7H|QdxQTTPXdЏ =bb- MMP{ Oa*0:D"˜A^@QTJ H' {EbT$%HmA8U.ir9;H@F4i.AuNX폊Ws.Oupp RĀ7I%b!!M+:;=z/a =}I[_P8HVF.א^$ڼ<,2ikj+Rل  nd)fP$B,HBj׎<-B^H!!$&d1 4FhpnR1D╨,S7JZJ q}q& @}D"6a8Ņ#wey%ZI b@6BXy,+VJJi Z\@6a\8D"jv1d͑m@!v1&) 7w@lYF"e}d]ЧXC70 ʬȊUryP :X<ﴶtuydB!.#1b5f=g^+ϟ?퓓Rgg!?sV*xmX,;@Ha;Hr40j ZYA.$+?Oxƍ7V8wZ }'oƍ7V>p`z{C8'p}vm߾}/Qz2<< xwn"|=}~pE7VO~\AU{=ws1<>tV!սA筷7ݰa16lذ:!-+lvep9@)@D;6{?lvlv>Wa^  ͮsoooR1ft{lԕ A?&^jrUkFQqZEᴴ4E\U2:h //4EE4vԅw&fP_:#.cEp*w=iwaZ$RբxZVa\$~k*pf  ^/*** /G)- d0 w@v **G"[J:g*r]Zw/A U "~$R RT* uR1(EnU@]|1U UgU.ґ6J`^DŽ- d/h< !@“9R r9`0RQ* LfsB?cS͂A Q4V^wANn/_ammh]]@ĕ{c Ph  ; Lдo 1113vBkm d]yy--*]$8rC|AnDYmG 3dYcX1bۈo?}w``055(e9ؼ b mR2@( .A&h4&om bA#v h4y4H, $ŅGێH$B-`۷<\ , #݀=#w%mXJ*%"@=c5#3@ ť#sWEqZr/%66BPRS) qM|#Hū&5/__߇_xR8l7gK<ȮKٰaBٰavJꆠoz0_zO% P?x ?onabqor؟^us{do?x*?=IA{A v扪f3ii-ii6Y{qp8¥7aޞ[z {`f{{{3no HM{"U+5BR =~ yRsղU( ;VnߴjacE!]#{*E0,VEjھ?];Z{KEe~x?|QpB?*ACМi;~Pd0vDq:<3ȴSv(ɉ'GS7Ko6VZZk?Z?ڤP>aG<"GQN+(qƍ7^ULQbݴ! USM!3GU؅b@ K}NII0 dD,>}dNN 颋U%uh4eL2}3}3@L69e9եO 2rqublP;̞X ُ&9AON id4幘RO d9MƮ.F:RG"ѹ aIKb0u4ŵw LC˱ Iʻ\.4 I;2]$Dx<188x:'HS4Rѧ䜮F$// Á' e>%K|ZZT^qvnqסM1v},#sZJ` rD"iSxdpD8C+FGheU+>UDi492!+h `P\.#{)rv`Ee?nR'`#NLk d Guv}}Ya ST"Hv{ɜD.@bp'sRHGM=xb< p);d*Ӄ˞آA3u}+?J|A X^~Rc-젹}Dt H"a0 P)A,DѯBCDEE'6hjDS@SԹ#_XH`e姯/dI^FKdԋ5//^r%'#֣.݄0.["G|vڵ:^v/lL9lL $I&Ԓ˲,^J(mp)vKkWMo_v<=='r*?@E òl#ob(fn+'چJSbYj۵sUk}(l[ D&2 ex$/A9U6o~g~ΝܼjoߤAzW_}{ȪU)6G>qb“>Vo]#F&n(UrBc=d&XG~y~ĥ{׻w~緿^{Һ_k_޽{o qYYl#7]yΝ;;S͛W==.oOnj}7Zqq9|oSO9oɁ4osQМ|R3UUWU{Do<_U5 ?>D~~<_j/ - R?@{/H{eO-lvUt0f=*`v p-s;L-CIMIENDB`mondrian-3.11.0.1-R/doc/images/code_general.png000066400000000000000000002661261261646570300211170ustar00rootroot00000000000000PNG  IHDR: pHYsodsRGBgAMA a cHRMz&u0`:pQ<yIDATx^ xǙ.rg9g9>{Ϟ:IĉLeb*yx88ޓxqKl˫dQ)Q"}w Jl)YWh4 _CBuu[o}U_455~tNG<|p:9AV__?}?8aMD)V'C8rFRU@fv"N1UQO)*znβ7%Q'ˢbiJUV6Q+]81tFeygvUlJ$֙6bbXFݞ>klÜxJD0IrM|qc{?MVɓoΫ}8,:N&>H+C4qYQT!' R^U< fd?a@<~@Vcw*(G }o[7K{eVV W9kqH-ɞ-:8`u☌։h8#}"}Rg~g*8<ٹ< ;kcRAAd%0oNֻJ, FYG!dS`[$jiuH b8X7jg'XqZsrYZU֩lQzP|88+~cQ]ACkЄ_vI]?Q#*?hk`7Y5t_y-cy'qo K@jWf/hlPn/lwu8:'Ή$Gq r&WUPmQcXqkk(7J0ҟIUIQ5+pY(hz }F }MSIlD{C }ΑGO18Nr\_~T~8<:y8 qn 8?fc?6r`}ᅞpwh䞟`Ï]³}v?u׭F-G"c952gzl=i3}{Cci,` vcla}buN3H@)%8f,R^;R"ή"|fgJ:*LaT4ݶixk,5 s146mwX-f9 <}^L{_Fy^BPNL] kŮ WE.gy.9\pѵGWReYj(tt*d6 ;ɢbdYdp';&m s?E ;Opy `6ێ6rHA}ц-;#HpA#Ī4ܟ4:h%pءqj֎Q; !z* @/׉vw~{ Sj$tMP5,JLS(5M_n3IYcx>5|EFo!sm. K@J`ޙ:@I7o>79@Oc$#$sB>I9އ6UC@^(!ʌ4O-G>@$hwDN4/buW3.1ԝUjͪLIRSTmPF1yK*fzDP/8][ 7I'jщNE~Dh$NU5JYwpƠ` r'r'%Lmqyq hS}-6w^{ {TD@b@f,[6(1yl1z10xbfa`1 bU(1K.5]nLpTxoW LqY=CC_/?4Ty 4!oN[}uoQo}o"&ʛ7-2ZA!Cm 2F+AHXPOSKWζccmMrt 8J2q82AV"sކS0>|7g]}GrS3RLCZ`Vkjw 7BC8,>Չ\$Sicwb:1~\sa0@s' |$/H"1X9JO`)h$V Tar!WԋEN[&,Yzl3ݶ0&3]xJ0 T$>=xz2` boH&!l Gne0]EZT[cUEHa.믱]m6OU*qܸtb6rE^oq{JM޲._[#HjWb>JA  &__d"(1EN q˧;<*#FO`ݓtxwNNq%`GE!8N@'֥]6&s2?1: ;X*5, G֙8TZgoo*)ft?[-6Ej10[r ̦e2˓R5cIgLpE4kr Z-\fJhDZmDL" .\:Q>:/QhGr1ĴSJS@'̲U5J-ӌ @wPf y \AU Tq֬fT d¯J;̦@B–P+ÂOD8*Y1Cq| +Y1 @]BP]&PPawXAQw0G+" !7Fl aUAF+z%TZTP%`a * UY*jjP5X8Caqfa`02Jk%Šcl+%nn 74U1! 6 L#:Fg$v0ϩab˞&*̞_q5?zdؑ#999]o~_~@`ՕWx_s÷_̟{{{99`9`;r`ȁ#pԁݎxWg{ODe|K?x 6i8Iu.=Ky뮹,sr{=wi <@ H[:)B䈇4C,rS p8O9;n-0ysaBR @qOpdE)ȁ; P$$JP`j@C_>I(21:[7W?_=P3ȱE-kUZL(0"GVŵC$"]kj R ,TvUsUhľʾJ,ڔA- ׾%RL :SL>ufPF-t9'>n($ tf@fxPk_>p~E u" yQ3jy5$*ίGj\zܬB\^!pY,Q)|DU KYLO b3QXfJPj-UcW\u^Au>r*+4W]#^Y^x5jjEY1ꀁZmhd46-#s<6,c @c 0 FAׅNćoi!x}T,fcHy`bh_p,&xL.i`\ZK(NQ>/95Ё}#g;:}`)}ׄ~G51<%8|~`}  k}`q⨛Yb}?+u{_pWDyrLCL1A?vF<^HsH1H00{~,@`Q}|I ÐK%FHDWfp8h࢟zz@&gxozg,=[Q8㙔x qy]Xa&xDz}B{A[|UfỆdPJWe= ͼ1ǟfUA]ŝEmp!mxÕU*2 ;;fx ;ۜ+$<","0YmNvfetv1!TS)Hx4qh$4M& @N3p嶺vuL0|c. \B]28#('p: SXs8;#x8<#|"y(®HcA,=nUz3lMA5' M u0S=Sԣ`GlyNE+ n^4X8h7[&{*[A`gw5VZu3}3V ن(Ṗ m2HK*BDJ<߆dg[fL%{αyhagb%SK+BĒ.`KX0率}/{ilK}/9^r뭗WnZǰVc-A#-ˀ&`F   (vpL0[dxyTzTn `Qr8҄YFÍxdrnhhkHmo' !>0@"PbH` `eU?O3dmx::5UdR q@$ ܂E5&hT YV?Sjׇ#i_U7ٰ;S 1v*<&1n1`7 ||c.3]3'ٓ&- Mx0[nL4tXJ ra|I?uP#12 ӕ0s8$LWJp2ԑ'~}?F`PB\3<@VH58ם±fA` Y$>CȜc Q0ۢQ. Ϟs獔t\ˋ\ߋ Ћώ1L?>?3bH@>g2DȜIqj@]u?_/MT]5=7_퟾_e/.u~zXEwG}M&$r+Q|ŷ{v37q/<'Ō7̎!{9sc(o[O-Kdrrpș ]<[*Fs ^LBhBK?3gXm@w`=nTv`,'6bp,u58ʡ;b,]f5d,qw)9H1&z$Vcc c9CFԏb XxE QGbhZ#qg5#( i zyh+G'pg(d&zG:&CLa'^лe w*w;U#mf~jZuGSmc큼 *c$Gۦ*(04{sH34I8&4,!B6iȪh9R@I~"SѠTd,*{Rb7Z.@rzԹdR+5cLk*^$WM)RgJ V.faFܓ_Z PD<|n jsT$-Lַʲee?"]T*0@rf~},59Oı_=?lxau=ɇzzz`aO=?|wE2pd!E8N8)N'' Eةs7ثi?u}= ^G|slM!!7|Q%=M 8&8XH$މyjy'4K ЁeML9dO8Ik\ST1 ƐXh5 #_5:ٟMr4S=R8`#jϹΆq)౎y! < xL7hq0}'K DauP#=cFȒxeU;Tlݡ2a7@ܛC\^eWYeqrf?fOi0*% A5aHpK$bnP=Ľs W*7G!?_n05s+.7 /F%_/՗|ү4^˾vW:.Ჯ.JgwШy  qȤү_ud .qv?|Tm}}BqR4/ [&t_&5w{,ؼ$q&ˬ''sտkSs `r:G> ;y ,NN^W[t(u='+ ߜאޏ:7gs_eD-)uxqt݇yl˲>)L-m5]vxs/; l13wMG]a|£.˲G&CÓPA&cS=#ޮ!aFj6#<)p۱&75k{~+6Nޞ"z&3 <=<~=ќC+߯?X5d CBݝSFilsW9^{e BNp.zd%>,胰3`+{ϲ2u 7 M}*ޫ$5N 47oY_?iy=I Z({¯#R]>nmA&ᖩ&W %+)CpXO">"%I#01ʚ Bs4};={h̴##խwS*J2B?^"E/ˠwvY$Du$ع]ʼnWi^ 6D'?`!hU׈{e|֪$Z_G>}Q}pX_VdWp'OԥGbi}ޝp_rՓ ^+\ @KchEQb *(5 2^v>9@/6{s]qýʞ{po{0S$<*?M[XC^ڮ#g{$lg91>Vϵq0quDZjeS3-uηt;_ł^P ʿ}_ ?v//:Cb?AϷ_>|/ÑI}.@bwt8)N×&?Ijy8 emOs?CmǫzG'|xM/,{Iʓ} Fg&s'.0P7d38?ͻss.3Q=%oo8:y_\qp`)ڟ:'G]yW<&@2O>uS xlSYzC!Ȓ/;]3vWn+4= Q_0[R* 6զI6_|y*?0v/{r05O XǶXK$<߱;6b9\3tz(:~:D<6Z ؑq&E:mƆU+LʗCʏ@=}iz@[v#aG_J+c>jr4jW[>˸m-XI%_6V;q5H:6#-S8^b9ntǠd`5} 7*ܜ qwLn ӷ}Q_6'7竍$|ɹS-z;DWEIM ':9D]N5n2\cbpB$pK0*;1,ݶAZrU;#~<I]!&8!\2gAl}{ J=66 8PR@r9Q$V,FoRP{/p'i 'IGaSZRhMYpc@2==]mM:<4 ]I֩i!ƙqQYE2KI=5R╞zee 3/C-KL! d>#dWᐓ=-fus灆qh83Ccp-mMq~5 `> 4 C"sԗ@kpU]B6+CL酣|3o]Kkz_덗^+fk{wp?0~E2$!8#d -2gpRZ?>Jy*\it͆Г@o*3Xo<>h῿o赩/]u=jW|-h [a| d/!5OBu0͎cXՊ2x,uXjG LH=^?o;-i0psK|D<,oAaI3j`n6TnM)6 `N-m}vJF z}/Gߩ~+)aOS="*Aރ^e󼮠"@@K^ M̱YU%< zdKZ7Luծq%yEG]CWqY+j^OђJzWd.]5/ xMO[qi v-EI@ B1~Sƀ2YM|&\[|-M2gCE橚j*A8Г Zb}|ݷoL"5# =L &n:Sأe=\. yH|L3z<]>'裚?MRkzRXze&N/B=zY|$虅^Qy^Fs|t`m M dgoWW晚_~YM1o;]t E]S|5{)ۯۯi]~Հ񮫀goڥ+깛vu7Bpd!E8N8F{_?YRK>!Y MO@ oB/][uY4^|sl>cφ?ry`k[B|uUmy7Tx9X셚8D?#;A7٩糞rΖ}rH{C˳.͵QHsGOd7O ;i3lzAnCS7oԚ&w%^j35h+:s&y%<) yl%ö\<4qyX$<ڈOw^=A0emjHŠρ߇i+l 받-XG hm:wh s1n{nնUU 1!Y?DB|~iqjNw,Z ZG[8rfjD"# ðQO"0y2Tb 4rݹ06{F?[jtO…F>p4l}vBHeQ30KU>Qi%XI S#^MVxft$ 5v@$2A 4"1яc14Dsc-zA'JM L cCIĆzׅw 6u*WA\> ć'q"!ԋxs ,0A"@;Qh7>cU񡭢xUuIWJU4j51~BbTKj݂qUc#a0&Iߎ` ,~Pn&4Nø޽Xk@Bv0 "-׮ t]v 'lj0퓓o(I̍c JYj A6S ^l$`"ǔx #TP,3ag؞PsT5`. َ7 sM ܍Z}3'_yKA}o74X7/ofZZ,G@|Q{\}Gs+﻽k﻽ۛt>m@ϣˣ&~ixzÑ B8N^*رius5${\ 5_%;Ot<7~BnߨK:LS:8~W#1eΏ~hue~Ky|^j7ʺ% {ajӆ2p3d]3. w)yaji|ʮ/5~"~Ilc^$HyRBb-̌\[)懦)[WwL m35_ƥ#;':=>8#h}zK:;6m C>P 0s):zh5M7`zQ~}RS @ƀ6L Hۢior(^;$<{*PMUՏcIX.Ism(iEY'RE{PMiƣX&.ī)m@IG^+R"eF֯3焠/и |z:p, IKEۉH+d$pXeuD$WVUSSAW,U&A)۬'K;ɢzoHKڽ*. _[#K d@kdW=߮Lc0OM%1~>`UF$>{3MX/k)~6pb$5]G˧}~d6k{'32t?}_,{f%tY}XٟYYϳu?s)BS=y_5>v_S68)Nt)tß"^/^F5/^&ct7te-CvgeBSۿƔg&x0k=~%f'<ٴ$5= S S>ـ3%ʧ;+A&eOKf%/yz4?%YlӆyldoϵOL{^iW;rFHy?3 5O{Շ)3;4x),^[gVxWG]%Y,:\EnhwB_d 4{zzT:e $ xSx !}KIs6V \vNۂw:f 0(NOm1=ߗo!ݡ`= kp37pQё=`s =^UPI+y/`JKc-JJRn"Q DI2JFe=̊) D ;*ʃFdH]Ⱜ:'EF4_+NC% ey,yҙCTOQ<45bv2 ;4@셽S0ǫd&oÆ*ޑ5B1|.'T#%^(,8Mx5Kī}H@bUjщ`|݌^b'q#lb##o9(b@o"h};;^ŷҏ8YȸJ5k7>bu>Uq"%! =US#um "OlOo a.b$'A;ʯSgwJ=UU8n l]r 4"} -$*˽ڊ>Ndl\D3ݕ')"=ђ^O}G0B2=X,[ L%.evO";P2͡@6Auƻ`WnQ<!*;/E7J%BrƁ @%+o% T -z*E2 ︭a50Lh(q"j*KiVD/⯴k1تo?\ړ|2sB`sd*V쀦x+{SD\VܢSM-- h,sp" F( h#{C*RAoVTdn3DNGÍx}P u6 da1xr =D8)J Q;SPIUZh|AEz/f@d\}ʬR_;f -h#/@o.F9;=h,4꒤8`o {1fb̏QiU ث;8;40wS8ֆ}H^(Ewcҩ x}ʲ8щ5ѣ׀8ɠhx! ]QGCBv&LXSW70- WQiƫU%P kBC0Cӆ3aڃRF6<4\h]GBTG;\TJS?Tb|щž؎=oW` q,x=lpzOO{ :}ӑ[to(@J s(A%^W%X2*-,OqejHk1Ylb @>pL| ^Bω \ym51͟&sGG`"^z+3u1`5޷-!\(.'IӳJ,&% H  jX LdzugT8ARz@JƐʼnpRW4=Wy˟b&. p¢#ib?[q3%{4PPLj(r?ax8aR#0Fu׀OaP_V40eh8EQ4-{$Mb0b;)-5y[ $*{SU?PmZ+ A4j?n Hs5)_c*21[ho78$M?lC* C߇`$~GJx̀턓^ !\6r3ӻbP WW+^SHTUG=>{NB)@oa'Q&<'!/$?}Մ#Čpg{8&>ȅe ዞ i۷MZHy{(GC xF9r_1Vv]'cb<{1EUPӿ+Km\ pl4~ xO2n?LS 3]pd'$m;i>< wޛ$Ow< M{[hE雑ŝV5Sr wY3w6telžؼ5>l]`˶ij\ͯcm؞& wJ~ko2 A=)Dr% {. ܀.s^X峲uR=PGQ)Ȕadsu ڰMi4Xؤ>=WeYnPfr=@vEQE{ sBYd0YIdgdgӕXt8Ot8vg^$MSyt"\'< "+?bI4う rUkpqFhfAcޭ>/!|NotC]9|wG-/}}8Q?ECo[ y xZJctPѭ!V[ UDQZZC"\ן"9'AzI$? ^B%@>$D%&YBq5C!O9zI=UcoNM(8?:f6סmrhmXiIx@5C4[d& =`"H@%x(퐙N'1 ]̀RV5UjMVQAެJêlC j0j&[ԟ5mIќX9a䤖U 1azp 2Kq9I. 2&'rsqa=X>$C@ -쑩\Tyx;!iǐ:'^_a4>0Um!|W{9Cm/a5.dnѝK00ʠϴ1G3 c`A"Ljjjf` ֡6T>:N` Sc`f8԰t`$ŬɦnY' j~~T۠D|Iy$ai -kVjXA笂lznV<9&`&4 fULzӺا>=a>7 65x-Ԡ0rݛ& 7{]uW-^vV&rDQ9:';P9Q(TЎ ( :& (N9\`1j0J ~iG Z dӄ=9!3t"`܇:xD=yL8D z4aE)%@  %VB1Z3v+a 0<^u>u}ZWpQ~D? QcQV7B/+ y2K"jP$;G5ۢL3s].x&eu:'u90g&IīEV/p ڇP)xѰ"%O:~ M]-ʻm1H*{411ٞe0㈁10L"SvHONR>7* qv` t !$]C) $uHD˃dzqNz]=pM < Gg^%N D|,>UGp֚ݓ@`0M$MY/5dD"Ut?0YH`ZSQRd)NPfgTI0aD ؽ*6!á Sm|/B#t-Eq˨tfH/|bp,;aK:|˯цY1N+*^ aC(3{FGmZ4oIk"ӱ(JX,6ehIpv^6-ŮRVzzjb H?-xY[@Ƅ>-)Fj 9rpwU{D8ֻw@^'Cct9:|N%Dծl*ojv8J 9Z JA>'@C5Q@ĴXXt8 YUVv^gb>FrS#sf@|/[8),n($XMjH'RH;L{:a_ǂ,nYz,N0Q@iԹ]c! ԽX:ojū ;$쬷8mj|6M] .{^f  K:e`w.^v).~MǰH _no

Ļ]Og|` Gf?1`Jpdu3\!zașB'{?|0L|p~RD<[gV;. KudG&0Wgd^PC$J=$)?<ݼ, 4jJs6tA^ư$􇣞E⁚eIӃ(nNaWcrv ā2[ASt9U09&z`8'o7颦 90Z9@1㼤kaCu jQ?)-6]%' zizw1c֝WYy\ej&Cga4ƋfBQ :mߚb}ez1~ӥ"(g>Jˈ%#|7`o=S<~zɿV+zC@T~2꼧 +M|Yt'LǓo$~VVc'LZN5ON5Qf2\B3ɇZ9ZcJ\ЏI5 izچa'5O~^R F35Oy8$VL3Yya *9r]k~rβrNiNRPBvɦމFD& aDhLN oNMfO!å{,{ƃ@ ^ݴ# `[.k { F4q d_ F?g!xS0Lcx#MC½gQm1UIBE4+ʍR c%c턢Ѣ6(E@xq P>^F1h?I+h/hw~+0V@ e^iO ?}ݽl+Zz7ȾG4pU(Šp g@c *tF|'<|Σ@u%hgY ,g[t0K.P 1Z3YSP&,D0~ anE^zQ _ Qπg p0}Os+:e`ugu?UV-׎'bf;)oʸ~A2NV@PH$7uH؂Zvځ鴁mtljby"e,z`2L#e_rЀk*JXQM TAk3j&W.j~@&A|f!ћcG:G!B0`=c`ݱ- ig{'%X&(pfVֵ7.79>73'ih8-|3=f ~w#S]c~- P6goQr$9lPFzԡљe\_4xHO!-.[C8ƸgJKv t c{ -s?h{GugY諺&* ˌαNBRcI Ǜ. ~ct%܄oAp/= rOz[A=T |0]b=L$d1ܓ/S/t?ծؽnP聺wkޮ~ ~fvöx/>M' J%U^`?Bjouf{Pjx/G(|+-?WsgkmN[ew.!O}>g7@ӏV2VCA;Te%poHK6 i& R08AǪcX!gxLƒЀ+N,˄0:\~:*av ɠ?G, Ag"hu-)ӘkkuN3qW C 0wxl!p3'13ګ N{E G]:$SLuI1,kt{M#^> ƽ6/}y4~yfxo>5/D9'%_> xقRaGAWCx x烔9mx1wå@,i`UM,U o0uu`RzgU˛8#n@P#4epˁֵPZtV/"UW> Q0S}@\}kN_ RUUƹxKTXYu+."9v_I  dM{EaPk {3|_qOna^sͭ^K皛斻'WWx$? r %:V|{m; d?Q>\߹~7h';oAnqٍ؉n9(^`@0  Rc탹 3 §z'?Cj>0乚\{O# `@0  l `VSQ?_4Z&6s((`@0  `@0 KH%@>BۀdxVi"f6 +`@0;ޙZ?p"rGSN5M7 *1N fQ e~X5n#5yz| ;kwN I9L̬ sAHn0=tz Ho^b'W+-I`c`` 3puءrY g?m$5}?=bhu4Y fۄ7tPnG+|Of(䤗U5H)ڇo:v\Tr-yyTt3(Q|*Vj>K@% ۍiOW2o~j:lo4zIp*^CBfP̞;=t\='4m>ņڟnpv捽-&Ih$>􋝨fW'vE}`@0Kû`Mdoj OYD|}Xik }giTGG`ls[(iC|J$CQ,q)w&up5CvEeu4~'GŦlO6r;DIKJ&b䬛 I|*\qp,R&ԔXC3+uÑ ͒n*eK1Mr5J&:*՗@2fGyq @* 65_4MaJi}S:p]pmPqJ|޽7Fbh-mJJ89%s>vg?NJl5ZM$R6&i{ Nп$̳=C=& EDaC0Ncx)g9%( $Q)Ě\? "꣔AނJ {ʬ)c[E neOv6zIeK%Yr5JNc+Iޟcs%a&yaOei`@0* VU}`A]˨yNZ>g\a.U~#ĉR*ie+&+6s6?7778880YW1OL~O%Mz1,GS:>YGH+T>zգo>zo⠡GUm8J7W#r6#d,3I%K&IVhibs3ʉ*"Fm`@0   \Ǵ< ء`5/~llr\SWp[$xt-l5XV#y>-|p5UYWяOLy&M?vhf5 IJg>TObgqkUJ7x2VaeK>ODJťr=R3T٦&Tήj>V$ m215Gyz y>|WmqoI/mn$ٝPv+v~R&+ ʲMi3;;g3kkV|7A܇JzS*GsUiv9. ҿS> $HQ&O̲%j>V$ mΛ$)[Ci||2^WըQIVjejKyFO4I:Вdj^SM833c6{z^ݑ|t\p$9s$;+ݯVGGy> [æg܇J4/ٹ3:7H))(V9V%c>XB3:ቕia PD6!!2|ƫ̲ITm>d `@շ\h {4,@jQjy;3|luKDnOr58j~;`@0:+96tQXmaRjsͧ~͘j~zz$>4m?T4m~s"qe 1pCKۜ6! 6[͆y5_`ٰCQ|6$h4P"5(G(A!ڍ"g`@0 J jIqi,B&Lp8`  C4m~s"[iu w:ms \]|OaL h.}FE0  kn+v`Og}K_g Ն*ۿcמMQ+QH`@0  v`[ , چ$ǻ`?oNfL#@-jہQG`@0  `=d vH``?uW5s;knkSJR0  `@0ѠA[ _[Hu `@0  l gЂqx\ov EQ0  `@0)>ln!, `@0)}SyP[wc!k;AH0  &e`S(,db5mRݶ M`OOF2dm"ۤb T| TAiTugۘژ7QQ3pDi"^s5oqW!ƬL1|Ilj 5b٪pckcJ\\B.n~ox1@G3gPl<]t{q?umA_'kOa\!O:U3m^j.36imR>*VmzmRܩh]yˮQ 6[.Ma/_BbInlC}&Fo^vϘY:> w/큠7%PGGrgd"L779?ϟ?gs|&grn|tz6?z|n&-Mߣ@ŷ@vJuQwzw$NjO߱aR÷/g~ٟ̝/?y˿#7]'/*ɫ.վ4:c?S3Bۃ㧵`o)ԼnEe͘l |> vNKP nt*')/oAτOqL?ѷw: G&1dx*\zkG4?rSMGӫǬs1v >-rֻ:T3FL=y[sUP*nz?wl̍93;xf/2mL"'a-zQR~ʼn%y=q5vjtuT㛏p-Jg~j.MA`LE\-6 $Xn 5毻|ps$h GCۣ,y S6FsXpN;z| <`">0H-IS/jgY$TKKKSqD|e_wFv_^w8Da䁼H|Q)CiHϷL%B%xٲ)+m51+WY$gE|O%fՇ?v)aT~Xe]6HNjo (&> ׳}YƎ5 MlwhWS,|6GՉmt.j~ O~:n]i42 Լg>X(v=Hvzaq>yn}闎%>ov>ϽO]w|瞀הJ e7)cE0@ݻtX?嫗?zCK{TdzKc18 u]`Mnļq7/315h5OPgNN_L5Ow^T'w<~mj^_d">BHˢ_i$3oSL}q/X"Oh㑟F5?{hFC^/駕p|bxhz4+S7e#S)ILk$C[)&X='V癑%-r9A)a J>Ez3l *ye{NyuZT<ھj42Nuf9R,vJi훼^lϽ=ߺ p.ꋿϥK |x%ꎗ8~w;nWCޫ?7O~/5Ґhf+muS;]a$8ǻM7"@e7M^7Yk{;j^wpM?{gjͮ^O7Ej^C59\蝘7;MylͷWL\y?-$i< ꌟ\{>0ɏe=!q1YvN΢&[*#-2箃L(jϢTV=fO JRԩKԑ%Wf2Nq"~⎍i8^$=6X{]bOUMrM[i,#9I;Ki1X4OTmsE 5SK=@nu'l9`)RNФ*Htw<*D;3q`ݚCck |t;vЎvQ~ߑT~]IR۟|07`Ւ遃/e#BH62p7ԼR1f܉sH~OOMx;ܜˋgk?uj}4K@kԽBŲ+}/ 9 =oy|tG#4D^Ty4d (gZie:F|JIwh; 5/GcpQe6MBC$5Jq6O|}mW2:4?7];=^H`gQyINJwv eTw,8ܒꇿdCSϝ招nZO^7^ N5mBOsD#?g$k]{/{d$0:\t [ş41SS1!ۮ&Լ« :y C#PԼyL%/E%jMjqU>ĭaUd|4*GZ='WF ",X# X!R,Uzzx1"2ar&5eV(Z ^iPlK%\q ׸E?yWU=0oTuM;^6JRhU{t(`ש}o L0tl.Q$~* *r֯9hn:=}k?pJA?#2m9yCuG+W@Gߺy8b>j>v HL5i2I^k_YRվ}vly}kw`Լ&CM+xNzQ }sÑ0i')U]{8lx`枛v]xZC;Xh$=N*`^mWj^Ww-6_nM߱~zO<Tņ:k B%]j>;P}~C#_r'r>w񽃞Ȏ#M#ˆCsgֹRuCVS^?ujK%~x5'V(u1t uT!ʪ^D{ /dv_{5:ԁ,br2Rz=^Zpt<α(RPjwRl׹}VFȗW&FMRQZCV4~vevvQz[bjiէv@|ᮃ.$yj^C˖jnY2~wy;v}~O_s?8Oߞ j^S*3QxE}@;eGiUg>Z뮋 =|7>[)gM]! #Q;4JPAg?WGTn7;W7;\ٛ[cͭ=0HjßPi Șm~Գ0^k }։^SX]o*); 4ϑj^h=XsD;nʕ X,ϘM4@-?MTjJ|P[VTOYS#&,yM +zBP$%'j=)k>]MI;t5}T;&m;axDuuRY*a,W\eOZV¹gb$M}~Mz1mzJ4񣴞 Gk݁:㗛.w㐛CJ:U%+K,yH͇ Ej\䓑#yg$Cg̥kW\ԲTu9TEz CtM wBп{okvJjqx#-I}2vg0 FFoBNu{G=ugduB|\iCR>SjG ~O*G}L|Gq[rog/y#"o"G^i5|S׍'#Gm|Z<-by7WU J7f*UTuxzmzס YJNu) FF~/ҿ'b1;Ɉo:~u5i:ɁKuwUju7.>p=_;}׹w+|;~עTy&/꛹}ӿg_h _u+Y?Pjk?gva{ +{NQUTyEP333U?Gm=m֓ϞWwȖ {3u?+- XKx'F1I/ICojg\Ҩ:T!TkTR48_!_z=9VzT'/z=9R9KF$/*N/ߕ>^oJ/6ߝxO\_y3RM gl]Y6~.ˈݢ]K9xf@=f:3A&-M!@ŷ@vJuQwYY*Q{5wLd!ԼWo{| )yݡj[`@0  Y'_AT^}_A`apY?}T~{TmZ6]`@0  `@LRQ_gd2P:\1VnU&;e+w嬢U`@0  HQ_~=JgluC?o^] GCa4.Bͧ$@`@0  @ w7Sjz-SPg;e6 #aSͯb^qF`@0  Vb E5m:mC`Hs$5y!m~+(" `@0 XRT7q;|85PY_0U `@0  lRT3@晧i|klmVidN:krVfCEJ=酢`@0  1G{KYpƪylmh6B͇27\ 9s zZT%8[ Nyz&v⼂`@0yHQ~4Rvn֗m>kƧCM^Fu^udçRɊMPD0%Ya+bTRؓ&<00=gST-h_޼]J|2l.m`@0  #)-s ?o~S=9Y8xB'?k4Lt<$ęhIrrt]u%MGqk8UI[] TX墪$*:vq*QKuw|uU׋tiYvV,x`q]'e՗ך$T*9z-tl1V!‚uc~`` !PG}Pϖg^3ų+6祉4(9ħ1pl|ID`@0  <eeWkg1 6/ 4joa+[}fcU:WBrI]K2zu/Dg(yE`@0 ؆ V3A//8d d 73aU Ro ``0ꮂbLj0LpS7Ko ( 5/:`@0  6iy! M@&B뀷EƤ[MD!6/`@0  6VHfP5:(` y `@0)HO믂eAoMD!1 5/:`@0  6iyZ+@*fl;VJ [MNIJoDh;bOuD6i``}=k}O&g[XXNsjj*@o/BpԼzO^QlѠWp=Q[[mM_Zd* kP H*%5?FjԼx{V[v# 5a@4 fMYOhiםo7Z8:z淯ciu[Uͯ^)fD@'PZKZ6+rHռdq/̥^6->f {#>Ax5>@z:nd{Mvu\`@$Va?B[0  la5(!?O}ռyrdO/S=nox4&J߹=x$n!YYdFk$\kK)HI?nZI1ggeТK..qj z߾8< ?FyKm7w놗*{RQj@NlnY/J(j+I[RJ2SSSi$eMWBhؚ 7ʗ lR1=|rN[hiDL3:BUyNZ9KOIfyɮ1y>QU2)m7+uj, qz``0%<|>?޽{Ϥ j+Vյ繁7䡵P󍭝ZZ˅^bMMw0K,Ugޭyn5ڪUavl"V|~.Tcl|D%+LN$yL53TrVnSTg ʳEG)"DWsBVpit J_P8D*R/W㤳An``ؒj}Ν>oyرꢢ"gV3x5A05Vj~dlǎo4n(_-c~hx$5dVxu$/ɹ% `{t{ccl!j5WجDt|w,;l,HA4X Zg=m=m z$NYSʟVrOMr6Z ~TΫnYwa N( l2OmP^jONNƫXW:_*7.AK4$S<|!EC.(U`frj>"Iڏo5>9,*X?C~ccY,Z]/O7YZ0 @ 5}g"1hIӶ6muQm6󯕽fexz75n6{}W)>/֝x80=V)nn(QD 1 *|f=mm%I_Pv V!ez 1HUgEVE6`@0 HQaz{b%5?31uf5?31k&Ж1yEʯm~ QB`@T!"`@0  mooo}-#ȑ#pqСժUBXaNTa{2 پ7 @ l5)p8I#h)Nj^&'cc]]G]l5;TnOi%j-XgO" f`˨W_}Ut0¶vؘmxdl``moh鱼˙Sli }` _gM#N'؞ 5M`@0*[Is{<^ 75<#j옕]go3h ռ~˜_Vݟ4<7.{8/@|2w&zqT<[͟}R&gIؕ}ZE0pbjBa.nog2;;M55 F)jj2QӆmOU\͟N",ؚ BjmD8)עTEkλK^ \ t:_<ׂ%^e\ kȀP W.X7O5OƩyiy}4?+Otxހ ဴYo5ҋf2ԖxIT|LJΩF,&4qGe¤:%UgDe @aoHka jb$yReIU ``S0 |zj{pAil 5v.ҦR)fP1p&%Mt'-2^J|HWp/x @r/xs$U|VVgQ9$hqus&):=m^O0Ԑfl@5OՏ.12`@0ˀPiEe,ƨ3#ogɻeFͥgd͝@re )|Hѵ+nJͫE|Vjmx&xVxW^(k~"|fYIa–EEەTͳmmjKT/` KQd e*;f6-[*/xiJU^6Ucr/p)egֶIUyJ]YK3m5;TƯ*'9ܻѕFxYR:Pk5|Sf !^KK`Bzi)9f}_ ;kw^޵'$~_W`:;cM|cccEԫSs,+ډT@fj>=53)Oj^uV J5;YvB_52z:ysK=eZ5x,3cOL.z93g_);F߀I~qTͧ_#3l~{Y+8q&Xo:-')XOOK/ mt=md5yHvEAWOohpxQ&״k0Bś.畀5:n5d,``k1 |Zj~QRL35m6ϥ|2782<:n;[RT#?51=?" ȣF'?=5#/շKj~}WWf`htllMMw0K,[WͫLtx̬ vEl}$1۵L36~A]5$̏rp y KanWM^m>=Q`@0j>m5zOKʫawLLx<H*j^s^fߚF#6^O7':)X#F0ez+ٳGVl~hNVO6q`@0  l,OOK;T:f6О6uvDŽ=J ~vv6Fͫe1ẝk4N,\:QerQy>rimJʉشBkP'(L4h(Ynqz`@0 BͧaW6gό g6_ĥM5`j z<wy6Tۭ[fj~NOI@&l3O[0 |Zj~Lj~zylR,]#22lLMI=+d+:H, (Bͧ 683"clk$D]ԃ!F&Șz:tHG6ݝbeҒ|"GMG(`@0 X#OS͓aAEH5Шi^FK9-Xy 5-;Y{ROr3U[, 6?Bͧf7?8po *ja@Fd6ͽ3000!u5l*B!HzF̈^e&<|߈E j~Uj>6Hyު 5i٭iyn[YN8.]խO, BͯFͳzyn*gy2-lF >ҟP\ngP1b#!/`EOW]DeQ󍍍/dឬ, u ×g`@ˀPyiom*j@f<EH_yvy~;"bRAkl,Doڻ | [ᛖ6Qp`@0pj>=5/7?+y^wCg Piy_xQڞ1ݫfy O&pU}N-B<ϫ6{# 0 5n│`@0aj~j~&fJy3hr$ Po[IQٳynwUeW  F qo(`@0  Bͧ%7? DqM@|gU^^h`j ǚF{]޻F{#Z*D`@0aj>m5m~X0†C+E& OS7@cٻ~g2)5ڞ2=?Sݏ2 5R7CL0  6Bͧ湎2Dҙ`Vk|gt嵮4Oׅ߰ ^]Ly=gͫd5VG(Zv嫰o(`@0  OG͇ id5#T)?>j| 0R?@.i2j^Yv;eOp' ǀPEf!LVn|/pCaP$.\3M-%%= NU/{d@yc ZQ82Qye 6g@<}ۼ-tFQVr{"*h?$^aԼ,SP|~6M OO3Q]Yp1|}J?nhX]f6m>ڎYP- Xi|O   Bͧ|!&7߼$)V9uEJ`@0SL5`3 fJE^-!a\FͳKmC8+W gX5lAxڜu)55g6&-7% ySGT``yOW;%l5*H͟u( Шyh2fs+Yve*U)tl_ ++,RM)J~)Q,  5-|P\1o 5o`@0 XBͧ] 3@q j~C AQ-@F 5]UKg&QLo=m|UP dJ[,ٍ}6IG"v[}vw|q 5Io/؂`@0. 5rI慚PSfȔUX a*mHfn$5q4q͞ Pr3' MʀPiyk6V͇L5R"۳@<|lmS=S㈬jeBo{(`@0  Bͧ想KYmjKqf Sj5YQަz[$cͯ@G0  6'BͧG<3CX5?>@[f REdžK6ju ^yg c@wn3M?j~]8d #jRvy;iv ;N65V+lCX.fn L`@0j> 5;5g~jlq QPd?CH yމR6T|boB/"1 |zj~7?@{jg8C\KH!"nԼՁ_$U鴞}AK0  6"BͧmS 9m~3hr_VJMHΒQn2 |rſE<zwn;(`@0  Bͧ< zj~ M]0慚W"_ kU/o]ۍ8`@0  Bͧ晠'Mݲj~S+\g}f7gN,ɟSYaWesqdMi)S]ۼPkI[0  lOO;Ǫ3n`Ys,LE``y(͈o53`@0 5?55/ 59pA?~՞O=eSqj~G. v3Ji0;p_[[0  lBO[C3MLsFL…Fϸ ƨy;|R-慧a_o›(`@0 BͧNM9 j~,PLK-EQZFӞ)з!c `{>At,JsGdY5o4M&SwwltrEbģNCDF`@0j~j~R}\3Al\suUNV|D0la):Hd9%O^u֊Y8cd"1Bo(`@0 ,BͯVcmPUtXӹ4FN"Ֆ~f j7WkNm8;n'ōˊLJbgiZYYJ٥CC^MMM1/ lBy!3{ ÀPiSࢂO3Kk(F[($j^e''i#x%FQril=5f7"AYWeclȑL;BmH8l!5u:&`@0YOK͟vĨyܙ)3se[;}w 1 OLXX7j&v(/+{^U'⋳_JY,RiޑI^TDxc5a]\̟ UL?,^Vgv a@Լ+@!蹦_g5]Jk_uVԼGe *XJQ/fQTϬdvvT8 ϫYIWUC?M^Ul.Gwv 4 5?pZRcW5٦bvW{yCQvQgAÓffr~8yyh(^Þ쪡 <ò |E L2 |j>䖡R棘?`ݦlt5On4 HPTd2g'E <, # 2X\Iy+GC9Ҥ;1ĬBgF!  ̀PyOxIAT/>\(Xj~T&SC4 Nn<yx.g/UgNM^ٳW_5^ehwdb @j>5x;}JA?!ڪTxlOM^JwClr@'M/6T>6JdN ])cB򃃃CC.vj 6S7 `@0  lPOO{5]eY7:CSQ`0iV(DJc=mwn!_K0  BͧN'qi׍ e}RBo`@0  $c@ԼwzIͯ' l451 5/nz`@0j>5O~ |h7!(DШia ?K9- ӆe8`@0j^EH) 4jx3Bpe 3 jԼoz y!xךu^%_ͯ!r  €Pi\3!fuP)M_}wѺB7"3fh|nfڬ,w{ȿRndyORx)HB ohTEyɾCI8C<3uobxH|8]Iqjg k>6q5Ż<=tт+ NNrAO`7WoM-4uFRkfW2rwO"Ӆ@l^̸3ڼZvG|fD&w/Z7L?>Џ ͻ~\ @6tcM]]6|Y\U7V@lᄒ"?i`AR@6?p%]\Zr2m$U&N.c4O ȡgNzmg\v+CFow# ofX) ;icwssȴQ5l>͏Nl;9K0ȸS>XWpgk[uzmhaY+:׶{Ο1kvlԼռU-u\Y C W! |Zzb.|.b}.>wnf3hct g_&qS,mB '-#3|A=aJ6[IvZ4J^GG0.@W|b2bj_,|m׷x b$<l/!6߃|bKFO<6_EB(=lGi5K`;|e7_5 B@6qjE$.^v>ܡ΂ŵi{3C泱yC>XWpбh+ @`d6f+< \UÑ:1@FOd76ml>HWpKm=76Z'n$aw[= dLOj]c|o5;aMm͆ޚ)|jm^R1Tx|ɦcTNOd+fm|ݵ><~Y{B*H`;Jwǚ QǭȽrD:J=5 7Z=i;zJ666jO#yШ?D}hGluƙqntm tjп!;w~W2"'yɴdiz1d6o>SQioZt]DU Qc9>rՈ+k :ӭ ЍƂf*nX,cCBiQЕ2?=q'G[P2'՜f!ڼʛz@a %Zsx69^yA^ꘟlQv\{੃t VwzG vm]qP8(5F'#M\6"D}#666ny| o\x#o|lp}NhG={C?u=Hn?Eǚ!!{yqzLc9:\9snĦ@ku)W:nEvy޵wv]F3(7Sԇ*^%`ۼUV$6y11B||0ݎ{wRLjrWNGsu@׮35iۼk? b]π}6:]I|Ѝ1o]ӕmƎ͋O#\+b55pCEE! P|2C' y K46̴杸+I&Imsg*^%Mew0l9S4wݡ2UjDE֛ eU>h>crL}x T-]>d ߻=;]aHQ@ :l>[B? ];a?LJֱ[km7[BL#~S=AY*F? tTp{ϴi67nZf(`nqXӉf5d*C"'yxKH`}zbZ>hNQW̺yu:\_:$߇u$XරH aZF3U'g0! $'yy:f";TAh">cYo6 @!'y4/y)m>XWpбyI@( l>kBA!l拲1N@ۼM*ɴoU lgu u{J'6 b}=a6?mȴcљM~~|gKyPyVG@( lGQ\[JcRؼ(ڷGeyb 6u<6m`eyM򕨝EZrUWjzkkA: |{yoɛ])\[9í҄|ըwuQj) 5vGjB/l24`ŷymOŎ7U#x\PCs?e1$=6k<:P 7lGgؼϓ7:҆@/ YXؼ`Tzx2^GC̒Qx'ﵚAhOgB2my<;o>;vոM;uh6R䄮/l8>nGOWuU lw] '5Ll'cBΈ Y\yc} vcHU夋P7,l>Ґ\*=30}@ d6edzlrElgCmwmusi\0.=ِf4$ͣy0&@ ]|9m~vvÚښ 'J vxU lGwo67nqE QHrKbCd0&Ml>Oy3<[6ft(`t?*Aх0z6On;ny׹|{T_q )l>rb|We Q_f~&`ۼH*!#`]O?l>D5@Ȃ6~ {6>FߋLY/!@(^mĬ;6Gl~flXc Wuhms2L{߯nGq{d 6"^aEY' `ټ$̹liZ3yeWm Fޮd%҇{"Voޫ`MqzBX{ʐ}Ce@ÚY!@(4m~W|6|ۣp\rjދ( /l>o=8}nB*6߇KE P\|B?9g cKo_qm=?tww6yA; RC 0a]9 ӵ[-5|]`}8|B @^l^].[|lU.>tl# P5|R*6Fwk]6|] %˚?pjK lz/vbf彣7-!o])cC~z}{n x @$6?scIQy86?psi-{_p/Vp<6_5A(ҲWƮ??zo:tuNLLSw徝Ÿ6o '6edzoY2WPvK?el>7Fb[b1 >(_?g?/Y~jKx~Ȍ$_͗^m+8Al>gͷGeF!@)mv{zlٲe޽)m?6D距WPvK?el~`6_C@&g}ʴQ6m<η4͗l8Ald9Q@HD|6ߧL6/ *ncv LicObON]σQJF3Yh(5&hr{ʭR|~l~CtnXS[av6&xݣ4o" vd5yl>rN |_3ml~ְy%5_Ѧ7卭;D6oح>yO>|{Kۣ=m'Bo|.i#Y4fsw:v%!yW\vmA70gʹšqznM߰A8|3Ǿ;a@2l0!Fc?6oMOaMyr>)ǚ6_#e Bkxp+n#UX# t`Q/O?fYl|Fgn*ϴ~jN |ܡRKlԚg_xI$~J>cGBlTwGn˪1zwTMl޽wZs+x*t !pw+g]vU4*7Rۼ]hh?4Jg-@%geϕͿ6ȏ]<11!`=Μ=y;\Օ: ױp"[,I樄γDew[֍Il 1pۼk$rl^yI1Сূz`ey'ng+Bnw˭m~ KB(!l>litky|\7wk}n=\ySuǿ'6le `Ql>/u @{yɷoޱyCn'c=@i{y}}#U6ZZzlR[a|Z+@@m~י%%|eUZ `.WBOlf[)b|Z+@@ l^[|UsZ `)g%F`0*NZhz'ͧooZ6?6s3o2, `|k-@@Z l cY*%m6_"מ՞66*]_ Ll^یqqvټL-lQG哯 @ |l~ߌR;Zl6ߨ|yQHE*2&geo_l^T~C8gg70;o}{i9Y/͛ 6Fݍ|kx5n 6ߍCȞ6/_՟`'ʏ6-ol!mް=SS0PQhyJE"G7;6o5=̳|[#}HׯGNW<wɴI~ͧr8h@O4m~fyU2w]9z3wjټ=5.qt#H#6Fl,y#W>͋׆[=-A @=SG?}uvyͫDU^vޓp:.%PG}z/݈g F<7_1csgFMD훢G 4miEܽ="wY`Ofl|YlI_Io)~yb=/4@g|6/BOsԱ- ɋ_rڵkbVN`7s[Y/Y!pnmyָ-R~F嚔KU}'ac|e?6#?ڟ lMjz[Bu}VI;oz5oRU=4@KlԚg_xI$~jjjx;>=r2m!b .fRUGWu/~UL][?W#o$OaQgaf˛@ `眮|AHk(6l6o9} < @ +|yl7ID~剉 1q(6F,M}fXrAF]ea6iC7h7s~y5^lCӑ+G:8Q4ɞ I"ƀ[`[QX dtmv܊δLv^<>>.x1y1ehī`=i*aI)nUvFU1>E $;zjܣ)BՂvLL#d,j$j$f1J;!`;uBG'{Gf/@@\|6es}C7wk}n=\K9ۅ\~.qT43LƒӮC]ʂf}u 9Wڗs2m|헝~; {ټJÅ<6w> dG/ݷر֙ /^zubrrrjJ|Q+KA.2lnMe@KUx^E/76`s](6^lP#gcEֻ,Ď6+H[h3bk}=̳FC*H Z#S'lP#'O/徣wkGgo7%*ol>2ʨz$c٭I @q ` l~tƶS |NE%cmVzZmc#B>7B:@% `mzbERƝ6J ۼuOUT<6Vz{Fcz>i-Ԃ*IOw_S͛ a)!~(8v~z}=L y-bx wM}f1{@#lW?># 4@n `ؼurv75Nen76ߍC&hlW߻cl>}o[V~p/|m[%~!T6|2mJiKL y&@MEL1vRM6I?̫Ot@ l>mpc#ϳ16t '^uZX郗ƚmlG!J泱yCy|%л7R϶7Dl>TjA$gfÆ\6_%Cem_=!^*KQ7@O!6ϯ}΢$GK /@ ;~MV> @Lyl>;#e6_u@(7l/o1ndG/ 6ggD ˴1@&cE- `^ 2쌈!PT|9@ylŸ!l>O+_LWec#pui{ Ռ)fV?D(/l>esᆔF*-Z@ܯzmJ6|íRf]^g~Z0g6!: `S|El>K[c&+bni P,|'k aXyyQ[!i-^W#w}w"Kl>Oc@q`Il~ƶSN-rѻ~3˷\Py'ӦXh!`nAKP4{ݴy5t|  0h|B?)6o }MC6?6oy&F۳Gӱa,@`mzlư!Ж6)L(QȎ-6o{UQi:Tc,(l>#W+]@1 `X|W7UBy{JCY( Pb|v6/1jnf3r$:ph*@-w=|#l'a~ 8l^mN·fHlG !PTo/1l%m->^-OŎ7U5ݕeYp u/wUόvg)[arkD75j> ݽ07*l>l鷩Q5A5D=wM(l>eu!6-B2o ^oOv=6إa7 kWGǍuúտj˲[-ݦ?xo|kxؕA w:CCk(d u83|ea~y&dFxW jp l>Vckgw歰+&UFk_;fofʻz dmຽyS_}r*|Fv'2-AOllm¯%6BؼM|ocN{KkJaGUV>}ߡx |qNnFAed~ `=ڼ}{ڐiS\c'_MG,;ǥx:ίm5:o ;'"c`p=+6=&OͨXg `| .e۷Vuy&W;ƹa\k]>`<4w1*X;]ĿutݯYӸVɹe=Fv5z[ۍQ;ꚩe 3y!Ph| d@z\Cc=:,j@yl! mǷfv D$'} .*L$F!|%j 0p<696?ʼn@@D|6?{Q %o |%j 0p|LYx3my |qb 6GrX@l>B5@8l>e{P"B/N "Eɴؼui#6|C@#.!T {yCy e#|qb 6յ>Ys~Y{l| '~ׯ_oG| @ -|2<2c'ۄ<c@l|ZkL5ik7l;5뵧t6D]k}6_τ 0P|6u6696P@vި EPΎaC%b:<66c((l>VnGfܭ|܎A%$'y#f36_P]c@/r픬L7OMiyY,*8 M<6 Fwo6k6H:ʹWsڃKce9 "3 P8<6Adnb `yLY!@D6}d[y\e#{|Q @E#ce0 `E[/ Sn=j=w 6_UC(l>Ϳq|:zJ7m,46!|ֲQGq\5Ayl"cy{0F<16߳O2mV^bӆL,${ll 6H0FgߔO #| 2}JbEw< 6͏a(! O*DO l>}d@U `, @#'׏MI6L}R|l*ȼ O*DO l>/~t/1#7 6yb" J*DO l>5m2m|kܡ*ǰ+Omeao@l6|#o'@6͗NĘz&{[kOjOec-l ]hZ Ռ)fl3gQ#jGlN4sbc5;k5/Ur:~lv chy&NϽL@od6ڑ fc2mfb{[YR;S6V$~hGB@[;oo. !o+⭿GV~wׇ7:)o$obkG&_;fV*^!0 |$ݝpu*حe>bgMW 3w\h>Vl^|m#*dmuu'ѧ@ lB e|ϮN ~vb'x3$`>-Ckrgmm^ b*|9;eDOWOP]I:-D?C:/7f!}16w@Zl^睼9|? l>g+a qo3!6=SL366=ۇ=h͛oW OOݝ|N*{ yb8B?ҝBczH&F'ؽ^}߃q'l:IDAT`u7S*=*؜ =3˷slċ^ :mlߝcH͇{M1G=bv2{QY0M@ :l>7>3~Y{"u}A@&qoq7_jF& B-O[u 6_/h2:wi[CPkxp+48ΤCd?dGO`S+ufyɷ=m+dVAIرy{z]jD5ݕ  םP&U0֌vgZarDσU ĬiWCw7;Kg*5S94RT|^t6o =6إ%uM:`tzx2ÈG+"l ͭ6ynXCMWtޓj!l_+m&ݥА(msղ1GܠGO`c37Tؼؼzb1z@r|Vx#ngw 6Dvl#NtܝNg;ݕ[I.C~XqA<߳[O /|BWCl>L'JJh2yk|w]*hvռ%`,9tl8(nl>ӈ-V'-B d6ed::0ol~>FHN bټF8.TdմyKp>2:2\)= ^0nS%n2LhH6o M6w%: /MMBͧV4Y!@(m+``EY' `Yؼrzl>5!6@E!ͧlޕrЈЏ/Y%D:nCoX([? jY@|i9&@l.(D6_/ Vi=@=l>6wɴɡ1$t%ͳn$ 6o|kxhhswCHN滊  P9|U{>!giK+gLH/d(*l/}1 I/6qTɺplOӁh  WhLg\GZr@zf|GfI$X@yl>M-@6[3C"r@K @`yl>M-6?ʼn@@D<6_bH6q   6ͧ@r81@Ha_i#.!T 4 P'@ `|9Y@ M|%j 0p<6Az#.h@`|9Y@ M|u^;\ @ =<6AOokKPηj: @6͗þ$͗yovlGB|6y3Kvwڇ?ѹ:e|GO?=X %qoqΨQ;_ P%|2G Pb|Al)BylJ 6_04H!oGB\6oɴI(L˵҅&*X%\[c !P6|/6ϭ10$$л7rF yɽf9U c u Pb|֏"ϑo*c6͗XɘY+!@(m^mȴI(L拲1N@ ` P<6?0ac6_5qB6VFgu  C ayl>B 00<# 6L%e 8k޸~wt᥸à> P0<6[b`l`KRp;4i}!l `![|+[CîpxkxȈ hw~U&w*ȫNFIm!-`CCEc5lϭP10 @67~@%"c&:@n `%Z   `%_  C -sL@ `|nA``/}L@`![|9@yl>B 00|ɗ>@Dyl~`D-lDS Pr|\4scy);O/Hws+w]uݵ>W~Y{" P~ׯ_o|`z ?|\-Ǧ2ud/1x`[J6FVolNLl>[B#(l~@KRA5s z6Hk{_8щ7OϑiS6c>U&q,;o E c> "ǵO}ҫEl*s/lX+Y>Fۨ uSy=Hd(,l>棓lj͗Q `]7pm|WDTۼqЫ{L/l>B=m5=b5BNk=mMIx5#6͗I 5\ 6Nl=1양i cFwo6v6Hz:A 6ENry7Oll2|*Nw/Jl @ 6/;&{J}8CO y?_.|~W-F@^|\_lӋZMqOryy, P|\ױl?9'$6Alfc*Ok*m'g%0/ryfr|G@( l>NlzBJH/"@!T6=6E7dCW͗PR `_@060, 638p1 1P@'Ƕ_zqɱc*KhtL/ P|\~rҾQjGVk}=̳b Du=C {~ׯ_o潟B@Y`ms_tKo_ɾKY `2(#bOL!PB|\guyGhϹ63b'&{â6_守S}#E c2$'9y˿"eX~3\vh: K|?u! 9 =6/â6_(S4})F yE9Yee?2b|~ G|kG'̲Q2% Re'ǵO~^[K`w%=EW ml6$`ξ)0?@ 2l>/778xYE}$лG~"oLS@8l>/L,5]ag~{Q Y3!@(6;ѩ[OE!O|Q0 @|\2:֑iWbt-@yVG@( l>Om;1+E`zCa6;'Fʹ]țk#%ͳ:B@Q`l~e`zCa6 _?:muJiߢGdGgu oտt~bw&bo{d'V 󴆩ۮ'HDQ6vƕ'(l>WňsOB ;|ΖFvm!E<5!t'Ƿ 6S2CzF$unԭHЎ3ͷv 91{'lfv4B3@6]E`-z@vpubZ#|6zo;6s@|\dON9iX2K`ffr)Dylމמ;\`86??011`qm}O^^xy.bǻK`w5>>_o7@C@T>*uiKNy#;El#W}%jf3°$2pu==#l> Ҵ $!ǵ#gǿv_A O'Y|b#ޜu=*A* !l>'>{u?~.*6Cl>OzX G|kMC@7|\7ݣƟt.Mt-4@ȅɿ]U?3'Y}!gF4 t#ǵw~|_N C|!@ C|\g޾h]Iۣr) )-~J D9 ( n6ۿoOϑiE{[GDoo]vGȑ%G-)w[hx2$ǵG౱;O/El]6E{[Gpbb֭[ <@@/l>Ň!@ %|\~s+vkQf.^(!iZƿ$'xSZhr،^FE?f<:wCF ( l>ru~uMͿbQu WWWy/l(+YqF2(u|BvϮFNczmU`ISx5Fj͆$ %ׯ1cUzq6/{T[y:ce_9G7ꘛ]h`~۲tr~kw^q{3ͻ2lT^+Ճya(6/L6emE33/ϒ  cbN??mWᩩ۴Z3s_t `dƸ^~Uelk5֜10i7h'849Qy;6c`4ӈ^?9)cRxU\~|/NիF5Gx;0ԋR}՝9Vec/ߌ2zd-cY׫ϼ0{2mݟ&`NT6;*h\:jGF;#dqo.]͟P ]C[5=4uip{ݍj~z䩃o0zh;塀5`S/w3 1Gl-c>v'm7iDfNV~~;Wjۉ_3-{g"Ӧ붑лa㾒>h4d^Yy֘q6u͗bZl6f,vڈ{j <ëu<<6yw'VF)e?; '6Qul^b~:k<qx_}wt5.aحO|?ʋ67Jd{ ^f]>&2en!L/3=Eb[=+NhtuҊN#M'o'A7o'恧Bw 8#ת6]m>S&Λ_^^>}x+W^;qB6C"}x~߶R*&6/#_7 MJ=m GPpddD)_9.qR?"Cqyx^U;O{ cSGbe CY# g/5lsFz=-g$ OϵGOHV3&k^7Y$ұѡB/>G("6C 6lH`h<6{.X#GH$X=u_ۖÇڀǐdCGO{=@Ȅ6_iziG@>eF!@ U<6ix!ׯGR}1@@w<6EW%w_jW5V{(QwkHD."V*2 Ռj= ylKz"GXkV%=Gkxp+rmbf6zt?D yl'ag@O fO:0ukc}]mcQ4wtkxȊm{Nu;rxt#=oyK3^gq^n([z@% `)wYe|G:O?=("l?o >4<zyIv隓#3`tw'jC; i#u܏N6xl3C:l>}/1f%p!ٳsAJv;:MQio=5@`|\u~KO6ߟ*^b|א=\|*T lA@l>_Fz?l>Y8=!s4ogX)q`gڄ4dĀ+y35w'o>KB`Ll^miSpIKs|4s6?.^Fm5[侲\Ǿ cbO{ H rJJQ QI͗i| d@z\uC9>; 9xA[V`=b\׷ۣ7>F6_ݰflڢS{zS*ΪGOOugl>Uj /Ȅ 6k_,XI(L; nO](utkF,ڌ{mawa }"债拴1V@#pw rheQjfd2Cb/N_-y֗7l>6ߗN @ 6_il$c 3/H+>]ѻjU?8;fƊ]SlXc=۸14t_5,{z"j{552G<*;̹4]:aqb< ,  6_7-:X_k w˱m!Z2rn=$ܻL0}Cú]x:fHtVm_' 3rAl޹-;"ǂ0 l>6oߕ0v-^'!wwƃt;WdX3ڰT|,ɕ>h~ѿybi}YJ!@`ۼVK6Dcڼͻ=A:i)]v<6Hn{6|Z U@D/+חZI#/̨Pȫ &DoX֟Qy#ƾ~L:fb$h#5ͷɧEyl>*AOלoi5@O/B <˒oUO*Yڽs6ᄃMe΀ w=c`:ƹWW|roޡI66ͳ$]bH`C \|۰Q*^'zwu̷G~2me?BhʍQycn5=@ ]nFN"~l`O棜oը)Fxd3mWbF/ͧ%"y `і*jQkArS9B lTSlćOq6&20 [V`=l> Dy5hybfMCƹVgGN)Z'ci aXBgw#y29:@ `|*>C#.Po6>&* 졦|r ,_z=cA+a 6c͡* MS@u `i/L@1`|u%C |5 6lOgh%ͧ0  cՕ0fT`1B@yl>T6D{ 6WW˜9R!Xs @iT|F P]| A@ <6_] cH6c)yU^HQ>X;=Ӄ@ `|*>C#.lʋh*~VT^>6Dj@a`|u%C |aV B#/jCQuX4 GS@u `[2pdq ':gv i$cՕ0fT`\2[y!p~tG^3, #<6Kњ6 >'D C cՕ0fT`XGo6OM12@`ie|G O?=TĂF >s `@`pe 'EE;z?s+w[BY!jf3DǤ|@zv2F^H/FOdw{7Z)L|̇o wz@ ` l❃W<6g; 6_)@(.l>/>pz#C_!6?8g6_%C(l>7"| G| B@6uo0mM݋1A ]|q@F@D6ҭc:OWh #͗`-d KO`WWw cs/ t `]9 o|jDk(lk!S P\|*ܻ^;:h6C@ l>}nyo3z/{1\Kg5!z-ֆcȖ_yW 몲GխOVndbѰ9P'<pV\}iMa02L7.>w}zl>]356h)Np lcuRml Fs߮m{\1Zj8}|i׮Όa61A@L6iFl~3b*OՌh E#͗iQL:D6q=%9*Yڼ_ʣ{hͤhCOf;Oyͫ8[4-cH@gÒU\>l橫W"gؼzw2eG}Cvw[N'o_GO`+O<,c ] P|zKR[Қn)W֭KNJzR㽼n_F`}Eܵ|]M#=#GUNǮA7AiWD }3*< zlH3@$6l6ol1)i(|>ni\+hPd6# Q 'ͳB ` m~Dl~fYֱ7f =6_pIcDF '魆KouK"\s;TFr!*AyR@ l>oB=n^-Y=gGPla*l~k]C6KxމO/>-zoWUw`, 0@|6/y7-9m-1J5 `ؼ{l^Mj9ym66;&]-|Ro7-2 ME6kיp<6_-c$sAy5 %ͧl;[oПUb;f])|1VlǍQC|6?tKvי7UxlRNdJ/ڊ1j@_XX^"mo'&m. 6vq2mw^ۈ_ElǼ+D/ڊ1j@͟^e`:Za|A1l@ML3mv7*, +S l*b7F O)6/7li#6~ql&61:&Z]|1VlǍQC|:6"_e /o޶l̫C fpa@`8 Pd$ɴ6o }Kx1* 6_PT~hU3d@S͋͟QPWdTY{E` 0@%l"64MF l3mc|W6R @$dF1O5 `<Dg) 67Ol' bg6?5!@OjГiS #cHJg)  ~Ax {ꍌ;y@%`fx_K6@~{[gL@a ` lʶxi3tkRyl !`_ PX|"cr6߷j:GOb37vR]wUxLtU @l>Ϟ1=@%'涛6?km*s6߇5<ĥ}L@ `ؼzlσ@`/~gL@a `m^UMHl1Gh|+ 6=cz KOj;No7m63mt!6A Bml6D28 =l7̍>f~Y{U 6R%*?4ʸ PX|B:%eNa}#^ZZ2c|A H/ !6?ů]w~BbA_ԙ6<*˰2@%ǵW.N]rlz`u޼'6WA#L|aW@@ 64 BOM%TIV6_C(l>s_l]?sqӁ+/3WPm|C@6鱙vA܋/7^}+6;TV[}%`]8 2Ss緞 ?z{L6~l1ɊskOj΀[B=ݷk պ}`Ԁ*EO`'F|bÛ~֨ӯ2l>ǫfDDiM56—ZE+os|*146z7Nlu{.**s6l>5cȌK\wt~SȺbveiu(q {~x7ꑿTi6prt{[O~o s?Cl&!gFoܤ ~hGK=^gD#eڴ׉ O֍w[-5@=Xm|f C6ѩ;N~ꇻPlGv5)7vB|tG^3; 6wغ2&/>u,y9&9l>qzup]\WfdW}RѥZ-rNNi(l>oqˇqO|&g)1u3fpCg4yo&Vwgعϗ@#.nweΓiA&ǵGో˯xkxdCeW6ق껌նv#F'a혽vhߛcִD߾CeԻUUuy O޸ 6!l^ý ?̳Ig~ytzeˉ-ǧH .Xlb:t+M fpaIt ]C)?ڄ̇1'g0bqc\֑YYl&!@l>w+[᫡"Tqoױ6?ů^ ;[ {kGVuT<˴(2@#ǵ>~yVr*o]%l:L!+!@d6[l[B?6sSܿl}(.bE_? Bu%*<9 zdN dHlJ'6)N/B!6}NbFx\+nai 2x@E''wK9w/͒7+M/B!6W_mX"ztߺ7TW3=%ӀMObXмyɴ!6/ 6_e^31|^1 @l^^EC`LWFZIl4${^s6q֎!ZM׼>q!x=fJ!t&'.쑂ڣ'gж׉ O]ěn~&WMW _L\otaSZR''%߆u@`W&^ x3 CH6߳ͯ`( `)Gfл'T Fl>*@ `m 7t 6?xb l>M۹i#Mil4͍~cv#iKl~UgwxiH6ίuQT^Ϳ,o~El>(35ShLVh]=:xwm0oO)wt,/mCioje[A`BmlߢcH띿޳6!dJOloBd,6UY(Xt  6*E Й6GoJx^ ]7LJg bJZC at @|o6>?wHY<{swyA1@q `, 0@|_bFM7|˳bD}6?5!@OjJ g^ iYJ!@`6MbӶ&ڃ@ `\d6϶v6bsdѽ%ͳB `ټзɛ5&Z@^ `\zQ6Mk>:׌<Wu6O{" P)|bWy#BUB/)BE͗bm< CK|_\N o|6S꨼歘-Ԏ{GD7 ;B*6N!;0uɔCy''1e:{|UA c|l6 rGno%ݐ!/ =l 6_3C |6/BNV*،%! |6Svڭv=tk<\z;Ɗͻb&/ue!7}~υa16_g6vQmWl>4K/x!{|b4rIJ#*zng3qxǵ6nZc'i8@M< l`Il~˷y>o&ېiKbPH6iVLIe*X3ȓqqʼ$I2CC,] J1'*X5PT>!P(|6?b+:OYh$jf3d@Xt>,Y@ {yIct.lU2]l`mHikoCl>wU6D 6ߓBdsk}w<̳e(FP !'oKbєZ()l>V!@ l>1m\!Qy]͗Tޘ<H @ |B"6oܧ Pq|6B@$|/6m<6+.yL"H @ |r761͊Yh"{y%aylz+EHDdx2j6! Pb|6'$F1 FjN@F -DO`wHT*mm<1 ~%Fu6evhWVf߶ַjakdf/@m `ln~{υ:0/1  :.^Bo]\ _4cH"u|xx] a( l> cV:^Y|>ڍzPX;`oü?tD0X@$6t)f+.1 vyw>iʽia@{~S(0 (,l>_uoГiSQc#ji:V'X{H {O`1mț/I`!P0|r1]x `Y]깰՝\ki=S ڍ.Ɨ as lqNF "3yoCl@| . l1,ٍ:.t*{y#<d)|L9B|Q@`^m*6Ad @ `|ECg|Q@`ylgT6?@2l1{L"! 6_U= @d @ ` lZ;~G͆{;櫼2w@''+ayl>Q |%cLOb \#w6N 6_ 7cG~u}kZj'cXuVQ@ ` lob %Lx6Dm6ߗ5+XGa{l/`<l>ϯ[/1vLt%mԟX{kQ-{w|ݎ{6Uz: jaL8 .6e~7EuM[UgGгT 0|f+iFR*NtkPZ}@P%yg?gviOO`nuaec*?%CDe -79`Լ]f6qT |u$|~@`6oO ,_0 0|<ۣ7ɴ[%Klik΄i9cXtN#2m2;4 ''K37vY}n 7]W 9#_zb ּչ fjVE?Yo+q7w7od9ΰy'!׼}1~cABY o]s^Á@ | }$:Bڇ P\|^qjNM_N 6_%C(l>o?9gv̭K/Z 6淝zlDolK # P|ZzbfIC[ |܊@L@q `mylDolK # P|B:2Č$c9s+K2@%bo,6_u76_%C(lGW 3b8Ȅ6_)@(.l'7m<6RLF!G|aF&wzf_5*#Ru/΃ aܨ{TC!m^ =6GbLȄ6`.z5<(O`.^kxpˍ1!7 1l>#WBOM&Dl>u*͸{e1dkUs=|v_Uw>{6iɡQw03BXil>7|Τ@ @V^:eӊvL9jpB譖@wi{xP}.6/C z6C^N@Ą^ݫ<X~ʷGEup[jwnNb( |:C=FWB\fNh&ޯF=&;g (1^@ 2Rڼ.~3<#ӱil/D'(l>򊓓=Gh sqK  PJױzGW}o۶m%<6_bl>YA8.rճξ6 cB#f>Kw1e?7. G6?;;~ *D/gx?:7]՛zvWۇ5j4Bī`ՔP ]633c;HƍmOO7_!cchG f𽘍>&k]·%G\>wA ueIK~,--]~]H^,׫`W;@5}4v( @@(K`^'txc &2mXP!@`d<<^]}Tbt *os4E {0 2|P%F<^=RYo1yS|5B h`) M@6?5!@L6/\c|qUy`1=T2g @*g6lmȴQfȖ6-_Z '͋_];ן!8F@q @EvKisδiW9" e Ћv-6|d" @z%J!@ 0(qm~$6) z @@ ķ9-ڼtL @z$?tܥҌʛ7J6_@ @"T^B @y+x0e@ B6δ y4 @@E 6pzWl~f.Q=6 @Axm~Nl }B @-.6_lzl @"`i+6ʕi#yy]$Ցc0 @ӴyN޼mFxl @@DyoCl>_@ Tc7"!ylsmԮ<1@ @ /lW6|^  @@|HT @@.  =mȴcP @&l~Ǝ{PEskGw+}0y@ \UlY)Ff\(@ WFo96cS<  @A3勓oT刔 w~2mq% @@ _\~Ȅ]* @H|.L,5`E:~ @|Jy(bzȴY!@#//8eH_Gqh;7h+?x"V4Ώ/r+\ye&F 7~wv1xhNSF+c=`k׮.C)1ƫw_X(Tn8e2=G>/6W=mL٘G^{_fTO 5G ;';M,|+Wz2m) @1hKTsc4rqOjxx6^q(qGwC=ʲ_W;{/ݖի?ů* @C@l~7s3-{AEN蓵6㼚#Cl^oPY#tO]ziLүg1e_IU@ ۻǖ~g.---eѿw^J܋6gO>_Ϝq7~]%k4;QF!M1RwGY4AeE}Py|b ס+x|G6u:\?)b?%67Vw^˥kgq~% @b3nή]J\v^y5qGzGmgoE~>k>iO?'jSNZCtm^l]2j!jۼCwLPr6;vZh<'ecl꿞\\;'1~# @3~svu^L/,H#ە-OFjEFOyzǟ;uJts;7+?ckyNhT}i$z)^#uS?y5f$ʾq>E_> D7/3Ůi6NN*%Q?/}aUvJilmW;v9?,8ԅ @1]zaDz忋Лږ|x?g)M+ƒyUTVLWql4 l uhwq]΍/}cFR !l~gRdm~8m>Կw|?JQ};W;eYǿ%N{飼[Vl?Mܵ%ˉ+I]@ [+Jvyqc=?tf7 M+6/My`FN~gOtz>Vطν[Ej+?}^=ފGͮ]^[H~HB 8ČwLj)Jv#ykqj9,GڼdŸKroKyKݡs5Ɂ+v'6 # f}ONMh;ؼ$.CFbl>];Zg/qѿ]^+hyJ V_>4nr,yޕ @@tɗ~|nn˵OL8e2 >c]qhe̡sO^^XX\]]k/ʘK\wN,r+\E}{>PyŸC%DM@?o7_d2Zs$o|SnC)1/}nļqhe̥?.zc'_?2a׎ͿKl~O[eß~ޕ @@,%}%E)0˿h!vˏJ/5_d2ڊ/<6:u}ǤLqlRCl~fDe@ dM3g+Nl2oL-~j.fnH$?> @ cJ觥X61hkgۥ @ 5ѩ[k@ (7Ll7 @ lޗ7g͞!@ `ɛ'{C @ͫ{WJ=A @>6d_@ mVx~ƉO.rߡͿ @oML]6`~7{luz|riQndQFoʊd Ԋz3\)/zIO0ܹXPOvŨᩉLO6\IɂIˁ)N>N`)Ofv$?}?Ֆ In]rNkRt9ky"JS]*ݼl+s7[WruV2jbfݑ,덫pOn:~Xs%'KbI' >Ē-˹d Q%zTo;z UqGD3ws,"&|E y /9[sqo^}Y>%W/Lhy~qߝ7䈿>m \t{yW#o~%r/X.j5/-џ8BSMWn;9䜻l=1Z̴+OǦVyQ&^;Ҧ5Bykr+VdTfSVl~jNj-:#eWv˹Vsn)X:y)˾)ʐ4&y!|][Ũ oNo=1'G8v~Q׏5t|R[;&frJ<7E$vٯN6咜Hr 5|tǦ$$Gr:j-ow1ߔevڭ}yۑwy3vrVf,uSկ Z;vkVe.t3GDeuy [S:ݧtA{gh^}PC&N}z-k86%De,oP-ޮ7m7pF|Kcۃuڿۇ.lP˖1尕 5iyF7;^KO9v1|C QyeJgᔺ WWk?ŃI>͋ƲyA+%~hZ^^;;/(=AByْ7+tZmzB-^糫c߷y9]V6%mWB`wn>6)o1mޅ+ }.B>Ew"ټ dA"W\}SeX;:_GtTml׵ȩ%M l9>zI)/è8i(5ku0sIeT1ۼtoecyԿzl^E]B\}V a y hZC;;cN&$R\EۼۧF:ۼyK|X҇ƶ3лm^kWB^80/껿+RҗO=ʅv A.e y -sN#-gڕǦ卣])]^;*Fc󳛏.Vk#'9֯>滜=-v~3O9Ev٧ΓM.I}΄u"I~+~bV~n !.9xMwu6ɛ|B gW,E$d;*asW8ao,6qj<ϝD} e |0?r꫇fQ#uK~w\~}̷6oxȻy>]ywxQvKZz'Xl;)oJWy9pAE.`;7[?O}NN>Rpu˖Եvҡ|㎚uKYFn6eZ:-=~U5oMɨ$8~'fg]0d>]i_F_-Jش|3,|jsuNhK׶=B;_UK+JBjqUm_|ߺ=RHs\Wd-\*+d]q )MѥRviG2"Ƶ9) -۬c"LrX<(r_v}97CrA- O`9/diJ9 &rFXJCG}M*MMLRɯ,>)&F#2>]ଗd |PUS8?xpik~C u2E}6V0{3eDP}_!oqJ~'7T{'mwۼɟݦ9i܄.O2v4L\u\(GDzr>lOhFc*62r>]_|3_WO~ۃ/  @ 7?q[7 ʃ}p}/P @ t g){w]˻zK$|끏|FIENDB`mondrian-3.11.0.1-R/doc/images/code_indentation.png000066400000000000000000003664151261646570300220200ustar00rootroot00000000000000PNG  IHDRb6ot pHYsodsRGBgAMA a cHRMz&u0`:pQ<yIDATx^\I6λovos9g FPQQP2( *s Yhϩ۷o:]sӧN_FO?ݟ~w~Oׯ+??K?x2 _)~d4Iq.)%SVq5&>XLOJv\8yՊpQ嵩 UZBdŕ~%ij B4c]N .h*iVjc%B#Վ7thbN.(Ohv& XBO)PTa;CR7-}[kp'+b`>Jψ'ZGz'vJ. 'Ş W{=7ï/׿P+z-Uݺw불[nj/?ρw[[=}:{QW=}ݪT&twpB(ZH3lwz Ju0ikuIU*!oχZ֭?޾.aq5dо3Q}G]ziSM7-9q:2~ݡk,Gn7K|?]>;?9goofm{w;3Mޙa2|ӌޚfT7=ޙݙ?Yߝy1>q ڄͯ/뀿Z y?X5[VUv^WY{|YOd~qƗm~}[ӌߜ)æ5ƼV)]_,fWШ59bWY~-YyeYaՊ߬80bX^wt'mo;Ev-'nI 7[OxtFd>:~4a1ƭ;[ ?Q>K9;G[ށF~2k; imæ f2l )FoM6|sֿO2xc_^9НXX`Kc /7tuw35xg~XV[vo3+~rV+65c:AI[ߘlIopL:e"K$+$8A!nDoLv._ Bv+Ve yK/K14 ( ڃjh#BhTu~mhGb 0|cCAlI9րk ^~/ߢ/M~o^9 Y[%V`oՎ}k88@`^ { =vWpC@H=w )>-C:=k!3sۻƒi£AC ƜO-4|K`ޯ|X'G?j1kZ,xⱋ/7lj#Ӷ 3286{\m XȰhN{`N{neN3f+.*X~ZaNGc*`f.ksX X(́ӛKAorh@dUȨ SgN09U@p+>Vrƭ[ ӵӵӹf'd@6d)8Q,/pQ\:54>8h ?'(IK7y{o22*/27~~-~m~7ځ7/v^<52 2ӛ( >8&82()3n뺝Е^Ѩ7ljhOMmha%/v0;/Ƚ9 p <}-W| `gp3G/q:j#g.ǽŽ{]ea֞W@9> (~>sI_s{sR կ'X<$90am糋ز-B|bI>Og10Q⬉mYnӎfD]'|w؞7>m| [iq)l;9\c9 mgn=> [MrlMG/~p[vɉm;`=ҳ1Uvb,#;`> b}Is M?aq7h'%$*6Lpw0x"ډylў[`ܝ?x?FjOBtd<Ɨ@"6jËIDo`!\߭#߮@G{ fVܝمꡒAߟQ~' |J,s'>o`BZ~j#׃gFLh=~ӱqpdƣ[܏\s5G=y ӏ_g5f͡DAm@6l3 fđY&#pd+V߆c&#sLN"&oԪ/ߏ'6~J走y{U6OODy5B*lJl^^$ySGRza&6:6I FZG"W'^FE^{_Bdฌ3"KSMlDpWL^c-D_qQg@$36O<0 l=ydF(f2s6ً+)_E?| BA!5AW#2Mpؼ@AEN_B}JBn+8 ll~Ʒ_\d:e:99ٗٗW(Pu^l8'tP EVp\l[Q$o8oMҍ. :U ?;oSS5kx1л9л%л5л=лC oQB(Zi4*Y7EA<7wϬ⚃/:z2} tnL1pse R~wUsNF8'8q.>iq_ٟpttr!90|utL8q>l7_:v&GGqJupE:V1[O:OאC/v=Li*@TT)dB,"o!|,g\0!hz'f)-v>ۭ; Co`qzSkVy.%rXao;1#F,CgڀSb+@E;wj^7`nE;:8o>g1np|:L\BIv\k,AG>0rO3.(K}̱_.6|^n _h=_,+#j/j'u&^$c?͂x83 >3nǹ>lyD;ahݫ ^l8l掏hϗtK`B/jj.>bk\ ӻ% ߯BjԚYO 0i6GF' |V cq}c6%~>2;2穅r]u.y;]v]lm٩%n wBDv<;rml 9 GƬ}b>.Ĺ'3Ĺ0J gW_O؄Dq:  8Qdiag.[cAo/e{1U;ʼ v:c?9v0å 4]l^imodx-Ol=3K + 7[5m߆Yy9pz#XF+Hw9DKg1%` '*bDP   $S.'z+ KIx`iI0f/{`=Xpق΄J{p8LN;z2^w N{/>6_k_ãXr{z3/z8f}XY~3%~g6 AVg rܦ#Zz9pfe槖=tϩŻv8i眓mL(MN-6pG‘ ||&bx Oh=fU~TnNf2jcZ}O> |ӿYeIK  _/"/ _M$/Q a_{]mݚã7Xhw[l6=e L.@;.>%`,uvzfٵ|6:cS\uy^eldfpm}͡[gtܚ+]{+ V>l<|~5=V_wC>]|y;3KB6}Jf0Xyg/5Xi ޫ,dBw~11oL x:ԅ&B`#o:NCOr ikD/Dgd_ ˽{9!JRAX)EE))׫@0dfÒ. K,P+ qPxvh u1.4>Cbq] BMbcPRe_1W gErPf0@!4IDF@DF`dDž(\Br` &'눋 nAq1'}"1wTgՙ+.[\8_4uy"hljvAMlmjgqTYۜpԂ]nK/ 6Df`JrUun6 ?gZz=ly;r;6y,w~Aߵ}6 tYm:h,l.|6Z*bzߙ"5e zx +;^/{  sl<#7Y[wk2=V{V\fp N\kxF4ϓ.zJArXm6`*auۀJ ^4ϋ6|=D ͋6s*6l^š\IEm8t%LDW l^߆MX"VFKmaGxB6yi?yBjg"VJ26AuFAU>^\HzkX~ڃY_wpRBE 7y-,̇B_b8,H-~BOTyrXFqAtQ!́^Y_J.F Vy yЃOxsg4m8vqnISLL2̌ \3<33ÃׁUGdq"NO55J65N453£U2Eqi56f޹?d+SwG?Lzx+G-s ֖֖֖֖*Tens@MZEqd@6'P D(_EqiT@Zuo^}bA.A?R}ܯ{Gf׮]m;'[w? %Ng#ڎm>sE9|1>R<E)ER#KK3Kcⲁr|VP:,9F">t,d*,((N/J+J-Ob^|-`HC*ZZψˆȴbI8p1^c9qzDr!!pya|B$:\ yy-W#Tbqxq!Nq ׎x^:s0 +ffN<D6@bA`;샷 ޏίpFXlC6xv~ՖMt#ǹ8$~ݧ ,ߧrC;fmw>-S:4l#i[ln:6b嗋{8ǀʿoᢽ_<4ĭ'msmS v^` N9x~Ao<컑φþo<-G/69~qKCM삌m;Cޘ,:g΋={|MM&]Onlbl mULNɐm'C@Çj6X`0F3m>8xAί=ʱ 2 6 4 fzeyn35^1%բ3SXq96ys6 B8V ]yzyf|fWۈa%6 zoCNB|BFdmDC5[F>sAfswZ ]1LBM^c>EAf9XTjJo:5ǘvޟ}X2. UtXBs''!6P;9dq[touVP`AGZn) ,Ӥ ` cu.8{0{9 3c2> ,D]ɉ`\똿u#ƶA&`U<7 d5 ^{ss5o>OMszQ΢6:X^X8lQ%΂XY 6eNk[@߮I.El><( 󬲄JԂpi`sZOJvy?#UV y+ *+}z =*`E>yu9%Y~56xl)6}AO{L.6B 8d_k6 [fVg0sCAez1´2o(4L-.87KY660؈_qLK!"e1V!"qy1y6,r{HK`/cӥ]0ۇ*6 |` xǠ8<}-Y7X S\ ;:ԇ5!6*o@N;8escgWRN58x.Lް <^p?8LGybxM_d6g;ý+AyCfoDnS|\m3a(р/~&LǢX10͆PC~l=Zh(M6[l>̈M?pقeb'AxDڃvx1qN`'+-n8?Jַ58 |E_E&yx kpi,TPG) ^$6 EyiJyT ?V*=yϓy^Ձ^F%`%ldgl^]R@/abv ؼC mLQVQ" h XoÖHJ,Ћ9WoVl^Ep̀Q}TVo l|( Dy u6Ch9óyz+*6h7+ JJ`RzD$O&x嗃Џbr`8M,=>,=z5bgzz际HBz)'g=_:0Z׍vB/ B/64gV}oti{;z5^ˁˡ|>~9㗯}ر໵8ȀlW)81>zx}*=ܥ&RcoE |z-Ȩ5x蹇B򑃾?$dǗG~>ƌ0ṅIc>Laژ3|5)Sc?La~7NG!>ga4g l$i c+ *If ev~=5L JqLbK/] p7CW8^2sh o l'Ob@w9^@l&N !Nd&]50ɳ+Fܕks!͓m ˰[Ð|PCpe7'g戦(.0& 0x<D(=ؼr fv=>Lp^ǹX* ssw4ޕtam|p{:DiCl~{svP9K-_0 '!Ĥ|g`+V. yD!wy~=X-8VsKfs,/NB؜+ dG/1Kkbݾ{aK`ל*2]z|Uؼ[&^dƸ}+d,x_I,gl>7B?Fz1=\)b^jzq8dW<ɜB/r`n^&V ҝbA,l3/$(-zw`r`ˈOO}䧞#?џAc?8M>nӦA OƢOƠϼF93,qi56ZL9ؼ/p_A?Hs 5>xY/y9#王76nycM[\8ZMsԎ 2QB(.jlԆ/o6NQ0=ۑ[nοyߒv~sE//,î'}kޮ*X(,MʭH+pʙ>B ݣ+Y$,2yր7_4z%Զm"L샯QhTNeCA2(QH]^_;@Ftۯ zED:p267TW)QVwy (37}1&NL}Ihz=ߘ#Ǿ03zO8CNЎ_O,I.y7qPq6l~8\,x5ǮL8vͨ~ZQkckWQJ[j ڸ{@, Pͤ90F9Mxٍ -6bف/#(%+ b^m86@"`Lq&Bw4qȕ *>9~1j<қm0n=r.{wҹ(E8. a'9?80-{"Qa#HLڌ6qN#lwB 8,l!)iJ8< O! ln{^`xX#WЁXi+,4m%YFc|oD)=^ML?QF2y~(l%vwian i\I;,=S¶ Dg'~O*_#]4k4½"2ȱǽ׻z6@`Y' ( B}M|qNC_dw1)V߲-c.?6mb mVa9 {~֊;ۀǓQg9*p樠.:gTܑ#ٳ Q=b:{8Q, %p!\.(.U\mxKk1UeߗӃL8uiK+f_^1;|UV͎Y5;n5N[7 Z78h(墅yfSףNGW4\߼qX^_O!2ާxԦ3S^ NqHª\$Dapmnka>jsC^G0d8-M?1Fos:YKae_|뽰J.疄mPڹ~]l Uq`ׯ6Euc@JlG&#(_uNK3QԿl>9AQY}0g/ (4^`.!f&pqAW#)$r)  iWW`Mw&Sςǟ`{ځ;b Xx.@G :EDv6Y#L0[Oh 1&&?!Q[@ݰ&م`}dWK%lO/毘-E̍9jc Sm}'*O2{"l<ۜ~e Kx9JS.B#? ZoN,x˅ޙ (}2- /0c/ؙ[mXR@j59khO1Q?&l`<`oE[4%,M2rfC Y0q Gsw|8gLJ0Dc ZSaX>'>mΈ/&~}=sv+^ڈ N cF/#`u/oő눶W !R;nը* M[&3 .,1lL O$HA,ǐ .Nhles%R w.$LHFQ`F0Ip5EߘȤðWb_D,B<&O0khnL)ē6pFA mA;Nn:* XoMEHv!p B88a`{D`/jH؋BqA4P S@{qqg5ijmDZvebU9q'"ǯݣ`.V@ (t3<"T9.NۈgYlaPu_=. Txj͡oWf9ڏϯ,(80<--55GY5ې~\Xsakp%Kr=vPIL$@dXl2 n`t^0Ϟ(N*mCta7q$Of՟<_:c+2h0wu3x+x!+ wlwJ_&jJy\]d@D6BɋI4 0{; ^6o ѝ< 0⩁z8}`O |3@ch&0vam[6Fcx9Mnap;+l#9Fs'oCxea0Ηr:h:q ?p_}`Ix&C{[<{ _=t]? }`DS:, 8q}訷1Ymql?~^6>"vN<C7/ˣbǙ,O0YDXȀlȌSp"/E@yE5wlu8jan8i"'EXVIVѧʾ4 WI6wSz{$A R5bggaP`_DRq@;l):_p@?A~,sBA^= qIEqiT O[i/^6,|S` N7~tFOHƳzؖger2_PpA4g=1'ae|™i}Fw7^XOqpm Uxڐ߼%pO6s\ }C%sjZWL+W"m"Sg7Q.?OId7!pt$©f V ́ Og<_ Iyk-~*06{k}ϻ# Z& tޯHU`e1%gp ~4\8;Npk-;.RfpBG&Ĵ1j:TŤ= WԂ+'3` ˂E(c*ܐ Xa\yFMPCz٦tWI L ~|;&l$;n $ >܊ w 5VN$}F,`$li \v^d C VXŵ+NaZue{ar[{O`o˱;^7az[c;,Ϭ6ڢG=gt<oM`'x`;'LNw_pc8h:K}`jp9'=p ̝``K~`[oJ8zK dil=WO4]]{x2xUxUteCf~NG!( X*<77.Ƥd K"PQ٧ŕ~aU‚kÂ뀫 A A-A5`ِQB(  rhqUci#"ix3ׇwzo9x:$C7~1俼 w#kL-¯?X D]>mĿ16u9e~re۔`wQ<()/0RVDpcIA3Gjtĭ/vxQnY(z/#e%@N4N7_+8TNb2dSptua=-r=,X%Έ%S 1 ZLUuv@X+OإXIC x< B>93cUЬ>+eTK *a?P^|*@υΰxOFbѬ{#`_t/-1dH FPXj@5@ń—iF02mb65㕇.ؐ@۴5&'6 ) )` 8{lh\rqK~7ǩK*;:C8,કa!+ir[SgA /+@gaOz+8] C(#WF^@1k^πa?EJqJJJ^YSLxϓ^:ⴿ4͗g̷_a <_ q N(E@_ΫgOI+'Ɯy-?U=Ȩх 2{9kj:mY_30 B7͗B:kk6w4PUz=#>)}(0f _ퟰm9*vJO@BIA|cZmv6`_ * /_M)Tx1 86?(6?*'"3n!)NO;u3W-ܮ.^˰`8_I38)>)qi'vr;BMvT\ÐFbӥ!vBK qOa#lYQڒ xw?`р/cRlt2_Dz+B"?B; P.`J0JM`p\ZR(Ck A(55ȉlN'{k(*m_"8\ڡPe)v9BJvz\3u Eq &=nWj0q:|6?> #?ЅN*&5G 3b&у˻vQ?pCP;5D趓9.6Eم`s\C[V[6x> e!H%T܃M? &hB/g0xc0P P- .Vp9.hl}_q&M2JIpD>U ҼK1"{PI"- zפƥ0.ФUBqш1k\ 1r6}y l(10 oD5KWaFTɸorkp}c8ڀ}vdæ~8lG ؤݼt莦MDz 0ψ;afvP`Kx/v£`OC+0ucpc7L=⡼tSaػkKg-8!0vyv;8Gs@5v9rĝ;@ p8"_S#2c?P{ V:@ 8&8_ (5$ z:T45RRp #<+,C ^LfIׄߝ^EІƾwDM2{F_ݾ{%J+DГo6&v' '%zfĿ} $dkdk_dOk>IG'9\!؃ s`c߃ }jgoy6ăgC:W,w&=j=q0;Sp)5 vvQsfn{N9t}g"QHtl*fu>OQ$~IGcR'OVGu H R;5\H=Dډ "Oi}P2@H!!J8V>IH;$DPӒm@ Пp\ktT/@-&'>G@k:P@^XQ=$8c`d/:fԅ0ER8h*" &$y44ꘟ=#w\GpK' 8L"+qdn[ŝ+hˮ5&{VٹZ^4 r¤<,y&~ 1hGkjc:$Z j8t>A?HiǸM)FNq,0K AXuZY"r:GPqFQ 1tAyuqX 6Ȯήʪʮ̪YQ^J)!e %q%E>х磋Fx_+( ?w*C=,WN坾w S]s *ː \Bs.:_A94bll,DP '@]`]`]@`  K0d l۠AY'Q B2ӭӎ)v7U+IQ y|0{DKN`ars?DEPɌAY\K@e|"\/(v@ana 5q:U-pZ~H"3ZQ\D5VD{JY<(\+zpT 3$+*Qt&L8]A9J)5 wX9s\ss !\q  @zލ "l81}S8h$t#0%XMql;0(* d:{ɐlD2Wkd A_ԀM@R|.B|. $bAR~DQs&6ٟsb:\Br.dI=Y2*ҒV108øpkB8O8a_ "0=l8.dѳC9jp/sR#C |WnWO]Apj;3W6vxpУP^^xdz xGU\T!!w'[qAJ.0%%@pREHR%E BSe`,(5>% 0nT&Ť '()JӪ80%fHQyDd֨6"SڈǵZ)^ϸ_Ϫɖ G'zsj /Ϳ[w~H+V.`4OvUGNuGnuGNMGnMGf>G:]u]p`ڙWۙQD^M'M\(ȪUіQޚ^֒^ڜVڜ) DSJqSj _9ZD(МRPf i%:)#E͉EM@Bac|AcD^ʽs="}=,>,rFt MV 'W%W_ p*ҁHX'oB5COB}+p.\lY ll7TzGWxp{E< AϘJhxDWx + 1UHG4Gř(H\{d5M_+;QDxiN0Z즂""װB "gyDl,4P$&%@$3\W"z)/hE M;Ӯ5H. $q0x1h|,D7hBU@AؠB* jH}JAzfamT&KMME 2Pk2TVf,# 8"=XL .17ɔ |9_ <ND (FxI39QIS.(k\*M xFU IL|)\j\!5\!Bd- S+%DQ-.:pWsQ*EC!M_QЉqu1SN) {U!%C7|H##}*MxEW𘈭q6l4p>Vt~IuИCørVU0F!NN`5#MT<yix3].JuB*Cxv#GDZnD+S (l#s3s#s"se_C@ZDTnCF&؂fq-"ZE$2%JQҖXrHREr M$ hf.mk-|=믯)ԥUіR@I~J(nM*qt6_KZ[Z p? BO µ ó9Ws4_n².g6p\hx MK@f*"!M!aC0ÅzB Q]`J>j 䟄61TK ğ8}'7p ~I}'^ ukEs SS@LY 9kǁB@ RҚ[B2Z/fY7uC@K\ξq_\ɹa97 =LWsu < "pߋꨳBF4U&ťKY-92v!`hSRč) "s>1T|Z118W :R L0'䓄hrx @Zr@^! Y.fOjGHfk 0)!#4@J+A*05bs 3Ij&2IM3"QRVRLLU,Adܿ{OR܏rt?] ظ:?Q$h Jo k *r3mCˀ_RzR4jE@Jc@JS@*!H#P%HoA:|F z 0 *F q0ǸDuHaK+CBְ֫9IlJKr5>y")PȫIC[@[oD}7I >)!HWЇ $WvAH"--zXu7f7;n.&FnMo#!!"#==uY|r$^Zv3\֭;п1lOD:Sdv/%{R|¶8L ٔ:l4n("o\϶y7" : # گk#䶱AmWνIռvaayPێ-b @PgT+C -zC+zH[PQsZNJP3$kφ0 i 9>)tHg^-A_"i@A@MH\Y\v q sIpQj>uf6M"s+p3tޏ겋J jeMp1 4~(:AC{/ 088{ hC:!Tsn@'pIy]j-",Lcj}Cʐ‡k EH rp.E @Ggt1E7nwĕt1tƗvq$0$uH*N*+zR*zS* @>꾌 )7'; H?Ftj"3#b(z !O ZBN ֣9}/>\iGW5~Մ\+AUw~̞EaCs8@^'#` w 6+jKhS4V df+<>@iSV5Ɣߎ)#mTz;Mv+./XwZQ/ڔAh &D|E/O >%g2+22hi>ZYz[ A tf@҃i"% W~sbjQ(fDߏԸ&nhq\WH{$}lT|D ˨dKgag[cLG++ +$V }@ŷ4q \|WBc$WlЖ2Ubrq%WG(W}Z_OxG{{C:\ї\DJU_j-j5 Z;@V] ^Bg5W#J]jɘY'EV-J~eȻ~Wy 7Վƻ4Ӎ{R7?2=o# h5{@`Iqo>R5Ri1@1`@ٿ{?Igɿ~(~Wp}ЉYÃX(kKV~+0=p(!r0E*hoO.PM 9(xB 9c  kz[l>7PH\a;[pYۢɸ+|آx0Hux4z^+޲E&j Ws.1,),r% &)4RF\Z0]tQ;'f+fy]Ϋ]nfÍi<")f6Ef0΍5 Fnd|&,߰ô:L2x* ` V QGpfA"n7.m.ZS9ZR[#@>@ogc&;%8 ,^=@ CmH5܎TET"v4x)}0 +;/aΦ@{4E$zdd= ޥ@@Jt/Q+'4\ aB'Ak}RZ`6Ep\Ɓ :brt/ +dWL2 IE{F"0w}9d`cg?bՙBa[\ /5 o4fwb @ f g~Qd- ;T z.\#\&^ɗJA _ (!Us./R`]rK@魘>hjCcKzbb"JzJzJ{8K{IJ^˯K8͑VMHPP|Fkk:&'O~SU=~PٓJ\|2`WYOtN;9Ce B 7{Q=w/7mYd 5 k@րgJ0&-AVm?SBhU-sj;9rk;Ϳ6٨;),'ET,nk7u! ,Yd 5 k@sxKͿ6e:2*nh{Mm>YΥ柫N/ +k@րYd 27&B)@wHK76h}"'d eղ d 5 k@րEmZ kv_/6{=w`oa!沜d 5 k@րYCEJ6 CfUu1 uDKSLN۝'CMe9d 5 k@րY `oe)0tu]1"CS6e9e 5 k@րY)q3o~oܕ͝Y5Zi23*`/'n2"5 k@րYd :zL~clA#6w/Pݍϖ;sV E5 k@րYd x40g ә="{(aҼU`ٰ+h6csDvݝp, k@րYd 5\i$nvmPm;:!95Ϳl9!( аݻ]C2BRȫ9?[J!Ȑz5 k@5mw }i3y޸7S+cjy+x )|FI/l5;ϲwt.[Ih͛~P͛|RbOa,GXrQd 5xэ{EDC@3"BewTnc\!ml9ٕY7oYI/#Bu=B<\Q:|})"+GSfEUO׮MD̥yd6p|Yd h-l1dl汘6yMEmɥ)"oN+mI+nҖYK7"|`9Y`̾΁kk{tE>%pmmi_#nμw Aҁ@:8okkkm=Po…T  ?qq 9!Nyy"Yṇ5%PUY%di;.tiFG}d6*Yd HWc hNMr(ysc [o HoݏS]G5u-Kbb1hd\\dۦX0"?HhX5&-V7i!MԻ%ND϶PR#Y8yDqYwb#(G#'D `kR|>,u8Ohe֔-)N-gϢ nɦN(~U1$*thFwed6/?e 5 kj`βMM}7 /KAyx`l2[KG 𫶛=QieM,LE3}-> \U9ɖ {)f(VXvh'{=-@jJ |___YYYi,YΥSI8_<w}Y "i +ڎ;\w 劓˯퐴k9;0|5ſrY*xWc?x*vBҁESa5|3}DH&uZ/U3c%T+j0Wl~MրYi ajW\~`}L[ބb2^eiW{ϛot] ɻ)zi )m&tnd]< (m30+VMoooqqqQ ESOa&W xN,+&$yf8hA~PyPsF463mÇo b9bo Ŋ/e/W%S5P:WTK` T&'X(T:[39d 5 k`02ƣsj P?`}XLMR 6ΐ쐘#.-mF \Rf/ujĨ9ψM6VWZRyA{zzMß'*T 5&drN=h>DB)>H+Ӱ7$M0b3f(ftPjb&:*^dc_ЌPG @6?G 2J+g5s_q)R5 k@ө) ajWLn!g-oy;+>6;6ݼp-µ`p蜊֑S{Tl>W{ 4:|?C:rd 5 k4[,uFe׊ӋC6?g֦;=@:oU̓EfEfd6?j`=mdΑb Kd0 Crl5 k@րǭ ;&e Co~*λ}^oj넛 !y7?fǭ맹|ZDΒJ i@“n6$j!y0&k@րgNR R!l`rb*Ĵ5ؘ6\ ǎX{ 5AieKH:mR@ V5 k@ր5 Xz{`*o꼛QЛ<-]W㓊4vLy2 RCC ;y5gK :y YvYd xh ^wRQ|C8~7W NU7v$XRJSj:#\Y,--*lgK :;Yd x 5=aQvw*1m[= F_(ʪkOr}d Fq.(C2Bҁ )A iq9Yd j`{Yuog3;ÇڡmΡ{ZoDfTDfTFeVFgW!Ek̲d 5 k@րYϕ5i! %ZvjEGjb Ͽo YUuC@fYYd 5 k@րJ 67pwȰ9+6^u3R[_hɮɩͩɭo횵ts𲰲d 5 k@րYC@m]Cel>fl>*&o霵thNYYd 5 k@րJC@ V7wΪʪ̪&{~@6=QYQp̬m9si3]AրYd 5|i`rdsO6h鼓S۝S'D{m=A#3#33˫`/K+k@րYd bR`ĴYƠH}z;" 拯)Ս7-\=SA2N "AYd xl~Z }Ϳ0;]M. KƎ mS|z54"/=}@ n&"k@րYj̺; xZΨ^a-핿Gyb)`WT ?HV>*+רrd 5 k@iά0{}u%1RbnhBŸ--$? ?޷(m:<=C@qJH(O\Og>L_)y6_x y6ާߴw]J ɪo4|3{ :ϸ(OEe64`w{?lYՐ>7| GdiPy:H?l?wi3l0)ϳhakݼ^l>>'8T>BTzymK#{:ma/Ӛ?m~ Y~>[ogkwSW7KZnqo]2tpY\p|no! A,G)Y+T5TH;$-j56.gjfb2kne0 6pVܺ<ܺ56|Ѓy;l-,xygI1 m?khkİՊk`c3Wn6} )7<'y=Ӣۊ5SSD^Ch}~zb|z.ؼas̚> /Qm^{TmwnmON?ys|<~%u0Dx(toj޲zsZl͍Z5_T}^eν”9qҿ5]8jL {RQmxY}???#ddxbU}J.Mw2{2{ UC]VzEGF̪άNaw?b$f~~%iMY+ 6QHN`VN] 'm.o߿\Kl\첣+jyE'W*ߌ5S~~_a\a9D;oҾ&6CK`ICmoC}ǽ`"8j=BZ[ii`+]Fy"44dl^-l^EV?G-G77<Ӊ)U M/|4qsqsʳۧ 9 sY6Yz\A)'aX+%^`՚+r"+\3g䭁p(.f մs6Hzxk+tRʊ4%[A{od]g[Ϊy;z0w1l"PnY,q0 hJYz >BtElV MMY}ң}7y`cMx,'￯]v{kvmd*Z:z`jRS i ;Ȫr!56F{wFM73+J.2˭Lw7.E64f+Qkb?ZVrI{r)Q޿S2ko/lI(jM*Alj6Lyr/Pw?[?ִ߫qNY:7u<%՜ݵj?}Ԗ4]x~y S?VpEy!pY1CuےY,bM HƤbOV?v$XUl~@y=,?֮'l.n_?Tml^AŹYsyUYK,-Mꜣ兀FkmufWSIG!覸;i, Pq k# |ʱS|`R ,T~\ҁLl0*:*f-AjiL8Pʱ?MX3I{R!y |~)D ?U}7nw7/9_l^sK$kY'$,Aw_kkpű+oiVJקk<ܡ|޼BUJy])̮Ǖ_?o׿7&i[bch.GREjTA}`zMM }^@ia毭nUZO^6 pAyx?Q}}}0{}3gM'mYkw9kQ^:KokyOF˯>|GD,='ahͣG穔/B%\"pOۖ<~I:,LV&ɢ_MQ_D?ZԜWoQ ƃUf!BO4梦9n3\&igRozrl6?3c}Kl^˜DWpIS6SU;\w WgXyJMn v[UfWeĎxndqaJ2TUg&VRN`XrWWPGm1ܒv|ؒҁhODk%V"GjS%rHVtfi۩sp}@\bB˩=ۥO%nfw`Ows ~ZSbsU~Gw[% M| #x JB=Ȼ~1Ӻ{G:>bߵEnw6sǷļn~iӌնT_?iYu+O+#׵? v0. c#0n #1_Vlj 7΀=kƆxSʐafh\y)JzMDv=ʛzݣl^hB8}֩W Fiov[r'7ΚNg:\?$,1-=BP?Ew-b;{0IJՐR[K-l^,QqAI# T Gg=Uj.UQB75 x沖':JJ-T{+lwz_@\6/L ͇=[腁IJHMչ7Kby;Ȍ+k\z[K:$mqSz +o17nmdXodqpE'x9 ڍ,:RJ.c*ccā+bάm:Z%#8>QT)EḶxpٟhsH$R<=XPo0csMElGPn{kj+/NJ&J*ZT}c+՘ܰ`+VʘϷ{ou?G^U?OXjVNT187.iJȦ]ʱ;&/ɨ4u&݌hK6<9hI,nw0)3fʲʐi5/]Ͼm辚R \I.\XpcA|K׽{ҦN5M;eI;[k/) 6\os yLb'|:`#tҬزݞm`jg"h$X/Z tDFeX?r)XA?OT~CE66BGJU-+%IA'+QZ<TE\ ̠D*X^xݭy;k۶3K8mij7PwxF惇CǨ"m4%#\:м($x"(1Gy$dQo*yZ.)c~K'םnҼ Cy?`ZJݵsT?n񬶵N_ye=}oByǷJvci:k|U]0(T>̚g[+zE ԡt}!gv[Xmg6PƷg/ޛRҚRQr>ꍜ/8 $07=8Jkg.^;Bz{{7޼UݗVٛRޓX_S]|l^)E3f8"Biw1áЁd~/- VYmKG* UQ* :Jatb~5yyߓ׏f+(jzޗ?2xJUb~Z Hl,>c@Uz:2?BCWCޘm; Hg)r#7Qd;#/Ku*,zQ2E] rX 4)Y"FچV倦hzI zT71$c*O9X[/u?~IA>*=kɫވOjo>Tu:7q -N`JmSOn,A]?Y_M>}[)cKgo͘oLy2ޡjCkTUkWjl}}/߶w#-H?ZEsgjKCjkQ9,(CvyjR;7`f975H-Of(Ӗ״V]U_Fl>*BVUdVemKF|}]'L#y&IKo E~ X,Z'cl^Gg̐>e9H%keB ^atcuA5YV*#\&ίxmuŻ۫n<2׮?l!{8^)] ܀K UpD]9 FbTg;WC2U^ڻ#M_r#nmoΘz?Mz[@y_+:I <看 #yZwnI5X:xgOz=<՗c⏠H柊.x*C@! ة,;鬕ԟ6O~ȰS״\)TN콓^yPA`lH\eЪG="*k@րYu gnm`"ehcf,+WXRq5l/&ryd 5 k@րY <ʻi^~OZEsVV6t\JKϬ̹η<0HӬnd 5 k@րYCItɭ1dkkZG546﹓Q1xO?dYd 5 k@րYf ͯ5l麓[#bȰ׵6$&6/sbO:_2d 5 k@րYCUg]wz<*)ڜ;nwLQCe6?ToY.Yd 5 k@3AR^xڴӦN_3d<6jUݝ]ӝS7’iz};:w:$exL}1.*X[G.\րY! SL'P9Hي|=|PLTl7 }"QLt"@vg6 2ZJWgPQdN"s)ɩELO'Jc]_T#!SLL\YϴIy7#T nza[<I{6c:ā2H4̩Oƃs&9xځC+J>D3}Or| k|ٶ%ZMkˊu}]9' R[ ^K\|/\[>ԕ4gVyCs!A"U4^ k,9 *`d魎•[bA|ͫU*srhmmU&]F-W 6 =殮:i6sW>RwhS{6М8$]x}4>,O}iV\7Yd <uIyWlCi+C#(komðyZpQX+x(6?6?ЃMҘ"ei"jGB?V$0-^P{j(\}+l%HNҕL;0ktKT@{!s V﬌T<֮k+7*$=S7*mL1]ؼpqLSKSy+W^րYZ5u} 6_ @9TlyGB6Wy ?dgH%d!޷}fvOHݯȢ6[%qA4O1@QlkMHD@ jU}ODdFF.7o޼7O73oe|ODh~g lSSvb<Ӵ v6ۘ&|_5"W0H'E_Vu6\ehyKQ9F^y u2Q*y*Ӽp[ Kg}U{QsvE홎SU 1?4? P @f*i32C-V ӳ#+,m~?O2{?*ۊ $sl+x A  T@4參Sjk+4~\(T(h6z[ yK@`nu % VCE @bg,Xf3FTY|HOwKzmMEoۆXt`]֝cgggssnZFRS}<{*pϡUUD@`iޱkj{x#[4+l4w" :d .<>8yy݅楆dKn_wafؿ _8,GBͪU[VSjuΓu/51FwzPE:\t ;vNorIՠP Xh{g_[`i~fe&!JOo,5<90ŵm:*k}|_`[?lc޺AK3oSn64cDBF:ei^xP̍5ͬ0CH NwZGF ik:v3HtR)Wp~oo{K~TstWI.24A{;gtY%ߞ6uO6c::|7AsQy]icXj7p^{Nj#R6On9/3g@?߼7i{K|hj,+},L.?~5Ik&m*`Ry"0]_ {T ?},R^Esbc9y͝-6w (wwEǰOPZDF%[6Ԫ頵SQSQ!(SyMim[&Y@O6mq( xT @X"%\|i~U֛͛_FQheGm<Qя( Th*4(lȶ=6|]^^Y\\ЇF{zፖVE.QZLF=j}@J v0؏6Z|_O6Y-{W:וȹbr-q:"1iPJX?i"4Ok joz…Ŷ!"yo,ikbCwPh~mj_wVnq/0Z T4*4O2 pyIr+nPXa?iͳ05?-|$gLжJ +)qм 8kL,B1˙bJ[X_ܽhd UI] 7euf#MZ0( PlW)4:!}JuzĬl!Jߤ[ o~i;/MDy4ρ~F+獻i-Z3<= -1K4=} K6HN=mΦC6/eUj6O?p?,~ <$*aP @,4֛_vji#gDX.ovt>2]τJZd?t+4T5h%V@XPdө1^QOvE]<UfVH\w3ܫy1U~W,mn++TSKX>XN Vsw ep*I:͇ ރ1ӼYufh4w{|CαiwO~y³'hN;dq4CG\vtо}n2O*R]L->}򃓧Ξ>Z'VbV_Q++6c^z17{ǩtм7+Lb>=}sxOxXRC}6;],Xh~uk&a>jD4-[= +O|Ks-2[hÍayPHn z24_cAjaмtrN_w`qhRv|*hpY1bQ8P GPoҭeM3[cFW;FVodL37֛?ֽ-" iz93FnN,+c/gles9˙<STxڡaDSyDh~Zk3 kL6Z[.h`H£ywG'\V}o7zƩg7.gtx_+¿!iy W >!'Y-g+T?/m;Ow Mrum}_gg.m|lWghu>Gtb8ȏuT{pZFZ7tjnW/RSS9hjUQ> &c2&K)h:¨4{H&yɩ{l\]row%- ͧ)(P .wa~t٢y+T*~R@ ͷ~a?umaq?gޤoʰazI<2 tt"QjPHOgUN&JR*e`i[8A?virNys|4MˢA3E4L(R@\4?s{l90> N~5Ik&^|ymiAFF^~i/i~V >h> pw3pyOLNJ%Z]յ_.gy!-/N4_Evoxڤ~@F;; G3Hw)ƚ6q;:~+?W;cck QHC(Kh~m~a@O4?5VX7ִ1oDAn f_~յMr%-efF@4OX.QO{!~h5#yW FK2ht }44/$2;fd: ʼӼvv9dQ|c݃BA_)5-Vu[wP :MN3F]kddL>=D@/CP0*,W|: T c4_l|X|@H폤)!%gGO]tt Bh~}PҶFOp@o~#"@+ 'G2FbCd(bR fyKHncǨJbˇEG%ZJnu#1|$6ODq)KĖ [ʋZuB-+tyiuͳ0I.7Ya@ߥ׷?(|blT @ @c$W 6_.3<6O= (p@ @W4_j'dPA(wbyig慧$ y=(Boޠl<8 @jEh>*SSNU4jx^BiyFh@r(hն .wtt>rT*6;ci#i^C 658*W@y}e]'p@V%yy՘[ @T)ͫ6}kS`9~ӆ]zS97Oy7Ϳ)Kx'O=}72Q|xUt YUm %JV$Vxu vsW>ZmS ;I-"48F@H|?<؈`hl7m2ܺ7Xnj;tӿe=@ E{GQzy_j)4Z{@i @);͓y>c4/87v>Z G4Oa)*N.iv@_ĕl4o\ύd{F-ktOb`\cD͊Ә(Sέ꠻߈"4B%^]Q {D6ênmfWVs焵Pr}v\E]{ߡvn`kuK'ıgZcAcT @4(#s< YZʆZ]d@?4\n7|Eg/^d$ͷw-I@~rjjffF{FC0U#3TTusJYٓp1aYqi ;piua\jjvPK]=Ox[\ڨqI" kĠ4&ҍ]^U~7V,frKmUvBSuԜhe `&R5ֱdI/iHqA ٳN0̂!g@?,{K;!ךq~tui^MbC+.nax$[rdO2~ \-؜՗6y[VkLr-_~X:ESGMN%{KbF!HFSrcl S<ŊY! W ._ݒ!K4|l[i~x>yOLNdl\ՏhbޖR ;lJ$_$TnV5? =b<1;֤V4キ ]K'dq_j|YJc៬ UÀ UӼ(B.@(b=c}i}6?tGw͙'&gggO$OAGhO`/ wl~Н)m^ cUeN=Wk,tc[Xic,I2c- |A1\4キ;Ҽ~1± +{Qi%ۼťo}AޥFL(vyӆlf2oo3Vj]\HVrҠ`+3`S6EW"BEO`-|6|)8Y\|Ԣ{GFϝQB:-d6h LoAs6 #ȊѼi30*9dzo{d>hzۍbqpdttjz4777?OΖ\l^;zqx(Mfca ~p*+#͓I^ LN G@L o2\J4^oSHT2In6:A&z:MkT~$F$(r@ za^['X52R XkywsyZ҂+XJeyJǬu̔@l4W,͂y'ge-J4㐌y/!N[[[s/+P(8͊u|ɳJ3hȳ1@vi~`z]N+?r9W4`o~U4ڑ`a|jLZPq(+oalw38k26ɹwǑ yW F(?4`6Kwg͞6y  `;P @4?5l U#a,X& 6 ܞNA @(q|8^LGF(G^6^c|<a @(Pqƞ 7O4?M@?:I@mf,/-5ꛖʍP#(0sJͯn/n-3z%}򃓧Ξ>Bc?xܝ-zE^ +VFW+Kf8y4キ:K ߦ A,P @ Nd$sgLo,|D!lya'i֝p˥V /-a?\.:E*4c`E(@ Gwh-dӆlK;BoO!bo=W;4<:6>q5Tkb=7ړ3jq]{㺄 $gWG,޾Ch?"p&lzXUQ% s;R.ap*ʪG{{9W٬/>i9tC^PٗtN(q9Eh*+nj:)0(jW Fg!K47I4%GI흽zd'nСN N~"pV_B"l3^~%Q7L,oZK{P^G1I'"vKˋQvEZMͯ0.6Jxaмڑ8_=Ak @x K4Is='L-Sg@+TJ6{gȵf`pxdt ~~~~]=vcMb&av4GSc B-j:1q)O+;LkŇFofR^+x.v֊|Sb9gߔB8+w7 O$DG;K"f˺t~y6\`/𲷄6"c(@Zن2d67#iޞ᧐P FߢEȖmʮ q!A( =Bydؾ7+6?~_|5 U|1s|.P hbŭ F󫻳zͧ*P(Gr=#?(r@l47|iuW͗|0 ^|l:A. xt/۳@A @\(ͯoM/oː%ܹ'8ށ6 ͺA|gggssnFLKKMlG-L\oWQho4ϫM wP @4?-C^h~q [! ySjƭ_졦ቍ ;0ޖG};RǬ宗zXF+Z|x_oyKoo䩳ϵX]JG S3>O4Iuת;zG~P B8i~egٕ &Om4m"ܸճw~o7"9y{Zx{)Dx9$BU&aмtrN_w`qhRk]u}n 5Ҽ׋@4 @gVwkYRߴwM~ǿ|<*яzݰ/I3nlr2ݒi7#CP-YQ ϊ~S%Q%^)g|v6V2er5abK~hzݡѱ+WѼ.Wdt]ޑ<>S[ ӏÂ_j¿eߝrd}X~?dt'rӿږ/K{鐠x@.,//nޗ!2OI2R̥ ߨpuu6pk|v.qntJkM̦rn'N)M ˚~"ӱN7_:2ҥFR,ծr셥"ͷw-I@~rjjffF{KoglWHTՑ_2]Q>`T+:j Ω#2mʊb߻7ӹKwwK;H(V .ޛ]ٖ!/i;k t~o<&=/4ow_H!٪L Sޕ6SLSdū2F٪6/*P^\RNwZGF Gbخ9v2//9}_k?YRs-Cu[i ,?P h>!A( by׀4No>wO_{|7yiY RkHs^haXlF-)hT{=a&HV@_'pyOLNJ%"Up+rм3Rd[ߪyJ߈,uH(@4_S`s4 6z|{G}!q{g8~tl̾Be,.k O[8%`*^h[E̹߰[h^%fylAK=-%0Cj6nDΜ8>19;;Kx"yB 79v dׯr]#;vE/}l,zfr+i^ߜŻH^c`uwyWCW,X,[j吡2ϯ. O.,fP $X|(` 4y_hf^o10P}gW6ɕxnn~vQ^sɏ4S .+ON^*XV/6l, @(Pm7DXS &byfW@q0LT<(+/gtSpz){_vCXW]u:|XSo N0 6<@!U4gSͪVPbU!ώP ¢6a<* )'K0O7?6uwI+Nj PlR'I$UѼ1b,u)ɊE+=*׏Ui}hl"h>1$U|RLlcQ8P yhym~` Pp2'9$ u@v S!ﻍfMY_~ h>Aġh>]&h>QB(m|n`M4mԾX͓y6hz@bT @o|/!Ƣh/ C-V7HlMc#Bfrۼ ߹wi[{>' A^Oāq){F(^8qzT4m@Ih~cڮ YQN{6/lys4qGl*ө^ SN:{\ Ui~i`WꛖZTTZ1A! @l+ Sw=S3e/K; vGL)ӫnn, \juyS) 6puP @\4/6Lt/{,oݿ1e5м2@x4s{xwhxtl|kn4о}m8[IkՐoX)ſ鯰h||XliiHϓE~brT*݊~m2~yfYߡC̆y24`q h|v^8L֜K NjuVc6G#DŖ՗[| @GhH׉yz smz5[$kvP @]W]pD17?:O6l@X {a āPm766ؘswX IDATwoboMSFr͂ȱ{|`"DNd~nܥhRJff6/Ş4ѹEݒn_y[{CP,_7 mQ*ܰ!<((_c@<+?sL͋l %Zi+婮1557oLu.l ͓\wWer+j3c_(R2,X IlʂA̎6/h捣X'}iѹ"C`m^  h{ HF<AU xm7ѩ<7;[| g,[xA\m,\KxF焔RUTF kၓ%Jɷ1|ɘm|+LSV1Hh>?4o A@hd*7AM} lmg{PpYB[5ۋEӋ(MO=-&"'P&[ culhHdP [|6i^D7ovԗ^l!c ]yF%.]S^b1oaN[ CHz(|*_͘m^͇EnRw-k8 ukzԭ/`B/a |jvWr`Ya{N=)5վtN{Q)q@>Gr$P ðKVy{0?jMe;Y`:5K4BJɬYiXh^v ‹u!GWxZ*GͲ~V @ BZ`{~|رcT%1Nâzfw5mFhG xhwOY'?8ys-*͛7\KtjrǷZZRwW'+ćFz -ȴIw4:uk; ,t1(/6[&0vS/BP{긋̡@ x^ <|[G u [.Zh^ܾj-+yfdKʡ|7 u@((o^$!/44)ӫ o=W;4<:6>q5/4,*6:拨WMhU2]1RogܴݗO@e@vӥ2VkF.9&$S}5p'~wyOURPތ>=A(P1G6ǟ3O,yHOm44z@}bT o[$<̍v/4T4C틄łkv]8'U )sR5+~jʆnzm6!n!me[O^[1ϋէVa}iHU,ت @ B_6޿=Bg9? u"Cm7O4gI} I@j4]p|ց;!ךq~tuTy'=sվn=W7Y垿1MY ^ 4;sff[5'Q_êh>f$bS4O+)'5*@b'&gggO5'ؠcci^Ed~nsEc(p,4u͹ңe%x+#WhgOs)5[m>3@l4ϖq\![4}wIoNs@O ͓IF~Er$id4Ե7cjj ͫ3ƬVc&ӆ7?R'׼ߍ;͂^5H86he^Q ǹ\?!_FммXo^_l: _ٺ1}0OED"ʚ6+oM@m^gQj1+,'aNBOXEMF_QJTQҼn'wje@>Fq$P B}zlq| %ọ>״1~v`@ox04m y}=c4\2''?oӘ?vp"X1BTM}4 `dku>aŗ[K4(31'4ODd=s_=àyJC-V ._X!ym/9>/n߿=i̮?ԋ^>LܘBnn8, hX:kyW['yߐmA)o_9G6ƙ 6_&#z\ E;pIҩ+7V`Cg@ Cy A! W^yebb8Q$IA]Q|<P 惧}Z 'DILJnj|/_yK1V]E3q5G'wX1?ƒ+ھCEc3G{!z: +QdI{ZQ='>^rj6f@ݡM|D6)jm.=f1Z@Bй|Yjw5&$I[]]E2ONMύv;~ȑZA(yH=mymNdf'w`_`t]_q.֝} % yA-O씃a U= 'ܱ#?md'm?}DA`K#_/ݯUŧ2~wG0e+RL<)%V/qW;xYtvAI4Yz!'ؠ%iG,4/aF|YzpM얏駒 1i2ҫ3n+PJ!^V4Hlȶ1<9\m%)իW;;;CXFxڬF: ][W0 Adq&vT_a,, NdtDqb6ڥ\6lqvgA%`(y?zE;T"Ș C\Ld+ t5O:WCVldN m,E1Jx@yzЄ155ey 浟vFG)/6#pLI;{hٍ#Q;gW*(0A\+/3`@Gi+޾,=D쭫M3{FJc:ϾRwTc =oܕ̙Dbq`' O1}3/z,2LԄt.Of+s E8/9NY,S*P=[K)$I#vXf/4짏ْ6^%✃ɩ5 =yh^XPl#{rcQ[UQz(G},25mT'sqJ<-yX~lA.X%$nWWם;=Zx;wPi~!]zY|, ExZ-H.r;r+rX, ee,wDM57z钽IʝB˝LHh8"Iwh^7)8%7*joz…bgw!"O* ݣȟHggM$p4@U3\w ŲN2jQ@͇@;v'"F+cS]5Z(ǭ[K4nE@T/|h0sx6zsCp<<3ph AQ։.sllV^$&I OtOREb)IywvG:mjţFO,Whh> g״m>IPW^yebb8Q$IA ɩ^U4jx1/4vB(Hivȳ`3*&!)\M1ZlQ*oDP @d)͓֬mh^}kjQ $E-s4,@@mHhmR,XAAIW_}uff 1IR|ҺzbO 9P $K|4O@;?4O@ORtꤻ8R$IAIꉭh>Y@(@ĎQWLq, IAQwԖO 9P $K|hƨ'[X^>A{ٞX^vIʢte4/KR|+x ;RFh>Y@(@Y&AhV 4$uԅIHdKK7w)q$V!W|A%wX~ݽG)On3A=^/$<o=W;4<:6>q5/4Xk"0_W_/@d,^鶈JlLْsHcnYyh(eC۠@0 Xhg8{C|gCZ͛n^=]V777Oxc`š^7XG)Ư>2䟐Qzڴw-I@~rjּFx1|8`믵֚ۘM{p̾o%<-2F *lyq8hރHr@l6yXoic̏k x7\q_8-y|칩Wd8j=w;C5#$tuTۧ8n5wԙ ]/ʢdlOk6 '4vb4uJC(Al6Wx`¹<$yBy=Y!I趩jollX{{\q{Ebw9Hz{~nPs~K%ʲd&tLK‰-U"I#Ϳ3z !Y;qImzۍbqpdttjzV-Yh>ޅ(!g`˜m&wp/6v˓F;|R^ ۠yxD!DIGnj|<>eDKy9RB(cy yKyim>TEGL- Ft(++/  ͇M? xtXTϋy9RB(c@]W]pôw;F]CerSw_ܹ0&xQ)|_Xfy@^Fwɰ1c sL#h:5|l0 ZꨀGL "g@м)ȱq|/!/aM P1c*IQ4cAӡ@l4?}g2i-GU\ODH0zO1Z`AsP Cyzt~lfi~ۓ|ضy"utvQ)l/7--Y;,Q~?x윿 3T߿Zyl44ֻ[F,Rdffìni4ov7"s?xnf)"(ۛ#rpY[믴QNj8_9NcU WEY"bw'Rh hN5 /jM6I_RYW@'K;:~+?W;D6ccn4ϽhT$)Et~.V1H[soJ6<5Or2// v/ 0Y*[r4oOk9. iݡѱ+W9v>&dU(cfүOsF۔ E:$'~rd' PмZhnLoe#bzp{q@rl^emi`'@ _v4_^?^ӯק:bSSSN`bک >iVyK]x81fg%C3eE3-3}$Zr# eEE' o[$<̍v;'ٵ)q3+2zÔ wOW&KT{}C=S앬[[[CkN.zcY:ۼ7Q $Rh~ hmح}ٗ_yvums~aann~vTqEl3+L(9!Ɣr~_g'H>6"ĕ+` P.V m|i~::OX:Ji+IFx"Y"kK [hXp1\*X2a$`s32y@ T @ l"lVכ7ς%ā&@4ODѩ8KG~f>" FA(344>ֲM,A+,cH'@a @L* WNKy!< (2I HIj_|&9P ln4<6 2  h>!LLV>H@IT4ħk@󑓃kjz7Ysˉ2cQ꼼4= B=+@ O<5#׀ޠ{:GC]4oځ_OT_`r>l(`k+ F)><%YZ4_Ƌ3ckY̪_MGk+l1u1ήΫW.\yR$cǎ\)?u7h~qcm|&=6Oֻ,G C[f($oTY[V4͚, L,4wmd9Ϯ?ԋi-͓]|[G u [.m1c4G#?>vQ c.*' cOU4jPqѢwAӉc@w9Scy{Έ&@v[֯;{nw O\zͅn+z5뽰s T^8G)+Wf 1jTZg-rsV*Ӿx>(5~W"o }@k4k8%Jz]f'!(i6k;Vo2"[]]E2ONMhoD ~LL5g}"z͛E8s~USxHZ8d/([hST]{I&D?q52eTF 6j3e Ǭ0CT bGP dN|4sny>3Z308<2:N???J4U~TϼUv;.DʀP s ðK7sA(h~hg\KթHh+i\'|ԏ)*>3lZfiJ2f8v[:-\icLNUQv ;΂g)^dS< M,[GyS^W4_4Ű2Ȝ1 Yye,y2ГNm7ѩ<7;[{T͉K|\'\| P b]9/doh^z''v4`XͧyEP[|>ʀP s $ Akl,慿V4O^1D0B(hâh>C!v=\I! $%J=;RrUm5? yf77/ilX4P W4}@iVA"p\2\_u_m$ ZXi~tl5|e3jyFQ"J|Ur!2h>!>ăˋ']NjL5rjY`k,t}6Q5A҈O2{74k-m4TϚLYYk.Dh> YyM4wErNF@b ]cf~RۻmޠKN7sjg੖h-4;|W_iKtט![w/G.uѼayKӓ^u۽x2YdDL3gyhynWmdly4ɹw|20 Z@zMۼ{8mn1Fwec,8%͗9yr-*aKbɠ<`z3ͳ@@?66(p@ @WG8 b*cb'x4͚kk@]dtEu{r6_ƋYEUeȉV4y &з|h>zL@S4gs@me[O^1ϋէƖ7Չgn%JtŘm ZOe4T/g$w^{Guvڢ+QT!"Ԥh>Z_@mBeV4H\U|kk}E& Rp*h>LuS7hȍhP @U|6[il_߽пͧ7PeFrP>楳M#؁fԮhv 3h($P @Xi~;ssA --6߿<}㟽|=G HdLc%P @ '*/kE|>A (1# P ~3OL{i~Ӽ0σ3hBM xtj 'C< @(C<s =l"=bh4{8$P @l+fT5 B_ _tivv6a9AH nR*zbgE:(jQ F?ES`%ۼAM4ip=/---4)UP W[m.eGZ(@4tvI}hn6 @(@fJkn( b|q dCi Elc͓y^=h>3@(l0G 4@]`Ai$M yg6{Q/m\&6@fͧ0rsC]\dh>Yh~bqQ(@I M(A ym~h9 **T_oZZҫh>5XVEuO7OTF)U4m^z''FK9ͨG`dcyߡ< $ӼV2ߥ['b+@)Y l2h>34êJ(`P(mc?HH"4jqѢIq1ff,(h>DyO6vh#hۼbyC0gC|d7Lr7EKÍ[Fɺu3ՐG Nco4wu2zKbR 2XD& Ǐ-r}=#V>`@()nP`=m80ETA<#9K"1s{Ϊu RKW!T:etph Uȥg.h%_+\KȖӼK(L]g<8 @(X___YY]\\_7.m v7m^qX _ZI19_0P힑.]400zީZ=F2Y5AJ_gn:p&G&̍?|o Rޒ3@4K1P @|"h.Ѽм22Och)dѴRlG'c Yqz}h CW%ۼݚ{_4ʬ(.@(@&[RV8鶦e|Qm,EL%Wg~ӋMR{ژ'g[@(|(,)g/jbA4 <*{PDKy8@(yz͟^p:%m&iI2n؍=FX(%Y< @(C|kmsgL̓ [ xtѢ= AмQIqluz|c>̄1cLHF%P @ EA2iS晳 󷁧M%^,1#IsCC\XW(5Z  I=]ن6O4ρ4@jP#{VCE4) ) d7^?@8yW FoX=߷ +0MR0^1ZG+;_ bKkzȁ>k6yd=4M (|_Xܸwex[6YdV2HUH|;{(mKj SWMjꏊB7<`2 )a E4ZC5U4A_jl7--C /ޠ^ UQ|Z/c}(ikb_yKHZ@ 棧yfz;t *J+#AKx{:p|qڹh~A/p~q$&XSKAG{d @v͇AtS6fO+M42a_Z1-<\ЏcDy6/>ϳ$H6Do{>SgOkfyn.dIKI73h>A(h~6uya<Ӡ.SGS`OB81^dT Aqlᑟ~b9hOlq_+c7Dʹ9=-Lq?ɲ{1ͷutpN_w`qhRkiVw_@! @*$[ $u=ytS g>7W*%XROʏJ ;9_OtFPO+bLsW|{gݡѱ+WYh(D$oЧ\ȭ^yɶ8Xn*}yy>꩞66/gX4]@ˠQ|X4Gsq 6oy+@"?xPx:+g^x3g^x`o$taΰ=D!"Ai[$<`uݝ/W Lq;RSX]tD_6J8i`|=oK޼vmN9eeyv߈j͇8#k(h>46i~eS+u.j[wQ@<xB͠tC>??\ǟ?-m:1b??  ,9azK}w;C5#}$'tuм@jdVkh-G-LdSes&W6o0b|Lr{OCDžK n>Ctbc~Q=gxD5!A"Ϳ19;;KxBy"x*U1v` rdL5LqB_"P6/rzSfߧ-B%~HPקyheyv_YCOLܠ[ZF]m]l3lپLrK~ nȊOyy {^[Z'(9 àSK͆H=m\Q70'$'j ڣ=hfFDfx@yzdT.9cjj,X1Tx OvzV槚xCDs/4o/Ŗi4yx1ACe,~7赵мQz0S>cUUE*hRs||%F|H4ܩDѼ0c/@k9<ّಌ:(izۍbqpdttjz-|{W4;TdJi\[!۰^ҭ.Cy{`^WCsei{zJNhD@ ۼ1}+@4։CQ6{G**yl2Wj$y =p_m^i{Q1v @PG|eN:66FKt $H44O^1;Xy]c*ז 8xڈh46C269ˍ4,XOzvNJ͇IlEς8Ӽc0hƂ+ڸ{cyޣyfI?zK͇2Q@U48PzՖ_6Nf_.~zXf'!*y6S#e_}UڅIA&{]=泊h*晳 |H@c ܅4'$ Oh|=2P A][V2H-'A@Ih>vA(Xh称M0"P A@ϳ${RDZG~G ?}d9:}q"hό)<2$JI44+^BHh>C!n=\I!  |Wڲ*n$2R˭j)~+{h>pOi u͸\p0/ x7]x/^r]#g>7W*%XROʏJ ;9_OtFPO+bLsWzp_>_{ur_Jc OD[ixE(EC-\bƢfDXOUsi:l%O24yO oo7v:FYD󛛛E~ Dt3:aWμ gμ/'`IÚHKca?z(%CVW=QkEDiCN0ֻ,V1Qr<LxyyDC-jL5rtz]ccaf;CVv74&#fr#5҈O2Ylldz1&]4C+|-A"(6\ښ6|Y|zJK4q3>F?]cп??O$tN,ϿÏ~K"~XRi[[wC-Zy-DUjh>>|FwI] {3 qWcfNUyn7pf]b*y Y$dFmƎNƭ-r|~=lzΚ^G!J Ej 惧-r/K çyM6;y43D}}}{s?Vx^v3"돱E%پ~"~Hׄ6/Pv@_ĕ,4>ro1]z>d MgZ,,wBa`?@br4OzwC]eEhr-qopaerF󺓋%c=kNp(nj-rNi^dfbqByg|d4< TPnMA====K{t.?>_C;a9G|1Sr,_q5yBcM"[]]E2ONMhowyN+30 O>K'&,qi1JY-{)sme6R|uxc@z{|5467Kk;^}-[(1K>6/SOӮ6`\/ެb%OfrmK;-n4/m=}V. l5Kgۼcr6ob2s8Z+| 0hbqlςmJ7/BrhZ[pD4;gG:;2ꜢO'$Dn118tם&^H׹[+/[Kqm54_A}#4xU方/\ؓƄWiî {x3O-WM]U͋@R喉_혫mYi'u\wX2=>?W|wu85MU~Vhޫα͇Akd?߷9,|#.:q( Ϝ8>19;;Kx"y"x󡿣cch} W'?uB}u" yR9zyՎk^ͷGM\h 5bck3ɽ {A3K͇B|M!6Y-ull<:ppH $2x@y`ﴜ8*м܍9bvӆo&g2orebkU׽W;/iU4m(?,MP S W4OVMwfff{{vʇ_<|0J/cǎD67/wyc#4 .Z(a+211A] )@R ]]4[m;?;[rP{2h`@~hFs4OONNN߹Mvի/^r\K4/4}OKLVG DGQiQy'h($P @>>==M5 7yVˆ7I&!l޳+F IA3hhPh4Ơ< [ s4P}A>Fq$P AHQFֽ=TQ< @(C|i޲lpq;z&h\|{/.1AxL $h($P @|t4:*Jy;Dˈqh>a*4/gf,.?>pRZZsuGAUuGJ>E9M.#_spi> :G`D)PkE&sH!U5(_\@y2un?^24o2KEcm>igOtǟᇟ? tEM'FLx{?B%gc?,@oO44+^BB QN|~GK7n|$P { F;2|6&b/XZFxڈ }DU߆{ɗsOXzP~UF___o*<):C|x{|졇|1a]zΒl_]?Yc?$kBD`'_tPMUzQՃcF "gqXF4(l1 6GhŝKŵKkoq4ݓؽt4v3,)o=W;4<:6>q5 [CjZU~,´nIF]Rn)?g9-h%gȸg:| iDP d[Xh+ٞE zAx>$@:q( Q;{ouw$O ?95533sݝ 询F.Z.ge:i_Fq9ZeyYcO n֥ #+|P $b/7`tnL<yм?qI[h#\y Sbݮw}g˝4q֣+Zu,muYh-~eZ-f̓cD&}WcIADisFWWw882::5=]fgK4X@F)iGP d[8imn~p{4]@CغCQOPr }IMPƺBFRzA( Ii17̟Ϛ6v?C+Tڗ ʕ^z74_NhJ&KE6k'"cva- )y8O~Ha?1<-H-]##'&&!RUEZ$J h>ΖlA im7_HGc [[VrDنB6D-ش%fp5&sncog4mɹ]{wdw= V royssQ\/(ȮuDLNg_ "&KȤ<~8Ig*|i,yLcFc@,4;OO,n_XmXꡐ6OOOG̡KH+qzD]b$=vUIerCmwyizH0h^5C}e4caPWK4iL6 lho4O]G7D]w^{g2Hl󍯼%wy8@(@꽃O>B8.c^lKz;gG:;2"y* ܷiӸpN r(Mky@(|({D:q( z%}򃓧Ξ>Bw4WibAhUZ8U+Ѽ:Yr 4FŽ--@>Fq$P AB(@:66F9u $H4-í;}}šK4Tn:E4_mb:%P @ A1Y+W^ 4R AΞ}ŻCãcW^мM۟MAַR|5)9ܴpSfR`isr4K|Mw0/$h($P @|4w}_2~Cx lEpTQs?D#/i{H&yɩh^eqm3mWucmaolٛYH8x˲2afcykY vx4()m;%yQZ;qUm5 h>Roc(2#N餂hy ēLGWwO4o{nGvq6_V(k8>rkZ_խX 7i;kvfoHYɍtװۣJ#:?bhcf%YCT)!45=xڄ< Ng_%{<<<]EGƂyZϽc,4 |K6SܾhL,3LN͕7iH5m@YF9jL̩]*NKL~sBŢ:`pQq)N]A^Sktg{B^΋Sy=rVzQF|4?'4/7/^"PFSSSӼeeם]UgY=m,>#}fL6+@a_u޵Ҷ+pU0ɩZq߽Kq]&g4uXqޒ;W`魧W!"g_Wizۍbqpdttjz4777?OΖ\h> `>h>{СE/7K6+BѝfimW-؎[cr|l4_X ;;ػF5yfcEf@q<76O^AӼ` rsU BӍb6;ҼٕFf͵Fh@]dbExR) vTQ0bY|4/Q4GTEj(]I R*ܹqfϝyaZY?{(}l3K;e!= j4u$2yS4'^FAd @4Oӳwtݸy=E~ay6W! |}4m@IcǎMLL,..V贞燆 {zz>7߄my#;d\|p͇4#[(իW ɋ=ʟ>}4_#߃m!)h>ϵV h!)ۧ~CV)6эIy iSàYP4h@! @l+n,h>q^|a g8:(BR45`yfm>h@~)S4~uA! @l+' ͇(! xh>A(`iw_nXpq`-O>d͓< ?:ԋ#X#1L(Uc4"^͇42BCs.[FP|4o`lnln z$h>LEGL-*pB5МAKjм7i+ âyA= xtҫj.g+BjN:OFw|H&Q|4o`tn<)ӆlkZ1ZJAIĄթ ˽M"`iɃO Ϯ1#hG xtтI||vdVyoSYWh>X3w*(6 ,..ztђ\Ԯ]Bv hIu H:UW ĆT4ߞ% =isҥ#b@D*@v^TJ{]4LV(' 惥ycMy2ϟy'QT7_,[ZZhxR<EoO#]N󭭭a-dOGrlf: ~KsK{,yLSO~T;{a āP dFH@>͇A<7/3p@(|0 Z @<;A{` |;yoSMc(P įh4P C|4_h~ڥ1yӚ6EǏQ4&A+h>X.-R6ۼF6@E[мiȇ`i^̂=߷Dyr%m~y47|(Rh>LVB(G|4oY6d?yc'*60B@uH|0 Z @wg~ss꽎NoӅ| [%cl: P  H@sCA sXW(5!H<-8N[, -D ' I0m@*~H`ZB(BS4l M4oq6Msdbᗎ2Mw}x0Z& _z|h;2P 7 C -)`a0)Q7imtgf'ygٵEP(jRN󭭭-@ؽlMzP5ͽ1&@( ygssݶwFi¨X1imag/*ge`4I| P J@!  @ (͗>wu-~, 4?[:߻xgR6帏Ț @H F\i6y(oe4}o|:g*(W4 [(2@,4o|;׆iԷZb?!fAG?D(h>B(|n-`\z}G/E@Y  @g8(BR 6LXlj?z腮;{7 yDHnRK5'_okd +("W4gk{Z oҭ)[~Gfhohxn;2p<ִ|GP dI| tK|]KѨ-u0ۗI^e, ChlGO~?u|FKD@(2:s?H/`G敏3}-ρq<͟:!O'Ω5@( @,)H*Ҽ"oq |%%9h>gs@,4xw}LכĝbÏJv.@M߃MmP r@a q6T8[gyկfKrǖuNiT 'E:K4og\=:.^( @ )0*慫Ku%I2FD{AqL|@Xh_YoC῟ʎmW^4!@SI|@R u֋9ߖܽM, CXh1Zrb]U3ſ;/듰DŽ( @L(`V0M< Ύà@a(<@,485t` dHn}흛2P=|&P &`i7'GGԑwM7/hWCjB(|n-4ůohfݶq/tHzn'98}l Ah(iDP d@ߤ[ g~ssJ(AHzn;wg8ySQ*YR4lȀIFJ:ge 'zF27,q@ 3h!) [?<=/!&>l+ԃX4؏ȒHd @c [{e`4,C+|8*W-P Dh>&@(1/-@O>6?8}$4؏ȒHd @rO2is;OO,n_XAh Q+Opt44K5S|qM@ T@|4u{QW٩彫wd}SQYR4_^6s*3>+IQ) ?m~pgAM&f~{M]ۑOK|mP j@QQAImj8ezs-OmYA@,4 6~skNBef~Ϭ޻1'h>QA(=@)/E;-:;.+ 0',79ДbcOaAkP ?~β 6P pK껍>f~/̮}tsԴ Z@t C Fކ]z3,oA| o/C]>&!o(L|n-G}Os_!34gߜ6h>%A(U@dZYțngWm\,$@j)T U( ?w^;мCvA(<*`: yfxnM6֧ѼaWo&ꇍU bÏJ[v.Lm{YmЌhP @* U,iZ:R^וߺ:mjuF;Y |O S@,4g_^q׏:$-}ч?lG x8h ꮱ= {(c4YQeV-x4ߚ+ 2@,4o`tn DO`P  6Zҳ6=ǖC4h4}VʲI*|2$61P @|Hd8 ty6ܠ_lh'OuJt۶Z4y6xd)J(#HzC b=/ J8Rߤ[ /Z޻zwKF< @(@! ek Kf[O|Fwy?.Եp6ӆ⨇7cߤ[ {M]ۑh!=m'bG%вг~.,^;dyz1(W*<ה-Coҭ{2kiP QKU4_$/[(6&RXhavSF ?BRwaE@(h>2l&s4/=mtj`{8}/6UGy52 Vxo -Aߤ[mS/ήݿ9m!*#ӂ6Ѓˍ𴉘PT4" k(R@\4Oͷޘ =36|2P  S>!*#_#g@D*@2͇ @+O}8#y|2P  S>!*/^ݾ΀~=ĀJ@(L@!P E˻WG>=ZA(@) T @v oJED)O,n_ZB@mAD*@2' LoyK245h*ʄ*#_*2߼6'!P+(h==y0 ƌ6+._ܾX\4H@Ay|"P 3 !6"{qq..7> OvʥAo'!P+(h>9kM*Fx} zg T @(ͧ(PG(Q 4OyaP)U4#$T.Non*) ʏyS:P H|~:"bƢkymXA̓sh*)U4ذ֌v{WPAi(7h4ՆP G (V{w"w;WͣǥIG@B(R@i"B6ۏ}4{gt1Cl-haJ*fblJՆP @G6hw'x5g]q/ F yP (h>H~%kyxڄPB, imP cA$jQzF|̂ME]T V_4~pj*AOY$Qh~14s-o3}GP ]| ":In3gqvpm,ZCώŽGϩbg*15ՙSc0cDh>wiq|eo%+w7Ѓ!h?(b/_eYU͙0ӻ$/ ^{;Uˀ߉/P[WZg/Z9_قm>Y@(s@QAE&Fs d;IV(1PͫCjT;F|X< !S//ͯ^$g6C@ æopÚ:{QQLɥOaW;.:Ӱ'M6oZhm6~0~,y_Xy|9P ӛt]sMq۠O9UqRcު_W3˧p3bsv\Ld akTRC;k'P>WaBrh~laZtq` ls!h>(`VM'/I|"-ތ`L5bslT00@{0[wo3` GP \Qr+O:=l !Jr@4fUzh//s!h>(7V F'%ro)OMݖ 苫rd@ͧ5P{(T v@1?׻HyZM_>/,o6}Z}+|G0IyC(n"Y /Xr/h4h>ݬC(M%Go5|9rMмQ)0IyC(nb%YF赥A(@f  @0y>cyyd,X7RB(0IyC(n5Yy2σA#P @Zͧ5M H8i~pvK6ya:#=P4"ЫJ@OsCS@\4?C;+e A(@ S>4T9 J&y|C8C(7Nͧ)T ~zмxݣ1P @| 邪 OsCS@4?~yhX @(@) Vbc¦١R f@|4P ZXh~yP4>N1P @|:)6|nu 7Z6goHa,8 @(5mZ[[c..Z4U| UNqݍV B-ߢM$ЛV9}C>"l @+*uŴT FU_4%Ѓ泎h)O'cP D@h3e']d=h>A([@QʀP Jӆ9lyr @ 5Q(/_mLyy jsćP @:槖w sQ<?p(S4N@Bh~*hk6##(2h> "@P Si^͌͟`a4]qP Dh>ZC(3s/IMt=JP $Zf  @0Wk@wazY.(G@a}[CC0H3"ky=ֈ(h>L͇.!+#_پFyn͏/l%gkڀN(`Y`dT n"oP@*`Y]dBV .^ٻ6J,}<#P @͇ u  @4O62iҿ|A%<#(rh>$гM#{(1dy yka L|$OEP db yfg6̓E*`VM< |ȴ@ MgWZW.p|8C(`aShއc"dӆ<_̓C*7V F>{1}h~@yzN~ayi#̮?ԋCkEP  =a*ͯSh~'36_ b d_g%(bU4& o(ҭ@\4?C4?.m١sgv/`*O:(H{L=bAZy%ĖIGWm IiBhwly_]#h>^@P ]|mc}Ŗ:jNs sGK:Yօq]˻D2|­9̡@ FkD$gߺ2BTw,X( @(xײc@͑fU/l\l^szdW=m/0c,4s9Op:rMq$< =ʷ~0g?/x\Kw0$}4O6F*gtRcsn hwm @? &ZhO:?.'O< h~ 4_(P @мOA级 q٩.*9FuS6qi,<8IO|/O2l/9d母l <8 @(PEċY /NaLS` {ꁣ~6kS 94ڳEƹQ _V?;z[#Yi%g4_P @GVHM 8FA \XhEqra :8:gọ3sFŁ{C!黍~=m]'g@*ts 6Y@(@!  @ (tkY#>ֵa?`W$35J(T4@IXhS/ά}ts{7wfWu6 o~>easGP dJ|HlȀ1<'[Ʒ7&~2$=}ѧ ]4ɚ*4)@cS|H$P  &ZԁfA(tGsCm2M{j{L(YslnP?y.@WyIl:3 7yñݶ zr0?#G(h>QPMe[<WJYlJ2,UvvNjJ/tmܸp,]dPf5]h~bqM2Uf M4:quxیά6}(GL(rh>ti^vw@m6%Y"T(͏/n_* Z=[4ڋJ3 F3Ϗв>5P xV4 4YϥWh,S嚖HatSNHw,XϞ6xڤ帶Ł˃kf!OFU52_f>F+y#9"B(o@iAY> Vs~2*;kWydR +62M?`YEisyo\4?ujleؖ4UM4Fyl @ i>xExI"]pYq M@Mi|RK Y,O(4?K/`tyۀ@m=*(%Or.]cyVg慿a'oX%CH'lG'@ @)+/rji;8<zz{ @( O=>P $Gi\ &4ρb_Ur0\mh>9܀@(4Eo1oGA̅Ӽxx @+O=>P $GiY3Gi4os֛~y~b4{BP xS4n@MHyu$YYYY]]-Jcy|X<;3kOu*i@( @o5X)O0#}CM47[K̮7hF~Iv/6 uzHBNb@(@ #`^LxQbKY5T];ol\Om~Oa@(R4d@ݠW|<4O@OrDP e@12iBoްO,n|E6y @h>$A(m3n4_\XԜm@ (G@JP H6dg4?o eg4&\AGqDP C& eWגG 흉{ս{R %@r \,8 Ĭ(m o7eq, If5r,y-ْeˎ܇wFh%k{li4sgf>ә!ҳYGy@@F 6?YBU6?uv!;T.2CL@@Oો/b4j:2 >,"l>=mFn ݮK mhAbl>xFʵ'f95" .[_rN#Y^WȺ[W$ IqM\}[{ @ 6DSn~ĺX=( %Ǯ`A$q杘.WjA26iIl/C*]ڳKi6 R@<*.V͓6y?ژ@\#!2BHfuQL|TR!y\Q7/DTBEﭪAƃl>8ܼrPؼ1)Qda\(6CYm6fؼ/qL h6K2BH=a'udo?6(5J ~,vU?_3r '!WW:ՈZ/UvѪ($'2qgodwPyy7 k^e N|68JB!I &r޹r@\m^պ1Rw Q(8X%!y+yAPe]=,=r 73Zl>=m'nY ,= 6ܣ8ؼ߇w 3Bn<=Myy;mݳyx,l>f+  7P<]*Z6< -R\a=c~}x 1C 6_Rpfz-zl %-M6~EOT4?܄mi_ؼ߇w 3BjS,7/-7fƄ^]l>  P(Bn\)C_M@( @ & >c!JO!78|n]61i#XiGd%jh=i5n"7s434ϕQ(_u ( Nj6@ & #Bȡ=SCR{뷯;%X keWϐ3 2"b *uBhdjr1yJl>C̻'fuYpv$M*{mPfN|xŤk2^d\CV!T@Hdo[)C6Om Ӄp ΀GhH,hvͫMIT@/SpW}W(5"sYr^(OWzy r>1@bwsLaa! Xn68yya4SJ9nR "T첏DQvwŪ8>.)ɱ i\'yjnUlab*! x]l6oXڵ+55<-ye$jZ &bjT.9:jB/#Q,HI%ͷGG|XJ* 爬ӣ"k{rmCkL;۬@nd2QV`fgg4rd˽ vVa6*+|, @3ڼm%m#T6s @ a3  @mY<OΓ! B٦WMM6R 1&Xu1  6Ey!="6*dž<*ټqyaEu, L60y-ټ +cnLll[,뚡uy|, @/yx O.H6OiC2K|p=dy̢l =:cbX&ǀ@X$P8z6?e6?3<<@mp>Ģn  `4TGsi(@ BvOi=Bf Ari^z PO57oOpijGA X `>+#1͗|rYÜ?6?Wޥ ټ C|;j `:y6%6F~͇uQ kl>ȀQ<@mu>/6B7YcJ l|x&PBy,umzʀ77OmлI9@bl> G2p)l!|ټu&ټ ͓1sM@ʮ5~44@p$b2`$V6 Xd  kZ׃#F* 6LB d^yAg;xO<@A`|\!K@ $66τ^pzyn6 1`qG @6L@ M 6_!Yz>r W:l>]&< y/f`( @"l>&A"@Hm~"m^ow(z*&||dj L6;l =l>Q@P6@d͏X+ިibl>]&|hM4mB^=7OyC#X*@P6@dۅ>luf/QWFu '^@hKEIV$>LTD^YVm!++yH}}!).b("ZgyAco~Bn6C>JJyxVI}yZS+kHx*ځ]W) v^4iLFyӀygz3R &y*OKu6Rȍ;Ϟ(Kjβɸ*4ˏKJ,y?̊Nje%&e5Urua1mZP|?<hb{nTQ; ]y3a>|$ II㒌\슎4,J'f / ^3qr: νM$lY>+^,&euQ;EVwSF|^mv:t9Uv'~<01'x͢yI&*+  yl]LĞg(<57׉8ι㸪*zKyɚ}ɣZ%{5)y߃ͫVIQWń{E gQlAqB!eD%ؼx.XUmۘ'ͻW쬢w֑wsb wI|F)b@hmY>zl~;f7X4Qj *m+ <yrfniC)Ogvwg}r\gu=7OiIeo/#aNl}a,_^G3^kI2}T/BfSfl<|i&(͓#7?J2ylL< K_5MJ׼ uv*}[LRؕm+=]|7NY!]bӪ"SX*X~jGYV{q32EV1ѩQhcі0*[QX`pyVz|+&AKwM**#d^Aj*a+͋B5moa6?B#ڝV =mf6 l>X}  u_$uAJ~Y/s ~4(1\Nms??p޽[3f˩ɩήf6l>+ `1,*Xui:Bmvxݻ=¶I6?y,@ 1  |||֭[?3gҘ`k6O' a>,..zy ~ԓH6/=~t.`6ߪzl+JR\'y|kV@ `l&Uf_i$x,<'|SSR1t!מ6,7(== 6< `11*O N~v>+EF ~OJ4R`σɔIH1[4ܤ` I; >,&6O]ǓdbXn~kyJ6d>F&芁>i 1V}V%?2gi>6 {o~ѩꁫUW*i~g|(@ &pW)'Ąx= nB{l)G+(MjP>3/L[6Hn !Ս/KLXmaAuL ٧V-RA6*dž<*@m .c4uv9ۣ 3@qB}乧+tXT]襠U6|М4..uH!Llx2[t +U(eHh.arbjRj==u+sH$XNgh4%sOU{(_LL1%QU^8puqեR_\B<NEf>h͓>rmGU?]2y##4_x y9 WZΗv(0Ъ./|4 @ 8T9YJ @W._}Q+|u|u>kmosHoۯ}Z<_5>pxG\>/1!ݲsOM')(:r \q`%AAtll,% IRFWO{ƴ>\f, .x6owQb>97@@z;S @@˟6%}|8z0l]z6 ٳg V4dbZ_5z8"@@@@@@AsyIyDN,:Bab?;, @P PzPwy/zܳ: ]·[mR@@@@N|Yt< |    6ϯ<ݮWUaY    +C@y)=U6?A6/&feZ    rDwDͣʵ(, @@@@`0̕uN`:Ϛgn 1G14{Z9X=bo^< *Qv`=m`xC?3a[,1ؤ0o? l~);TF+ ԟg18ymi)s0Wu^I4Sb+hfX#lޞ7_>I)'N@@@@@ ^̵1!FsF}mǡM  {j~F\n)ȣ8G֖CmA@@@@`Mg Q;L.,%&FKOzyGXa.3R7O,2{7cF2kytNӏh     Y6^і0[/W,!*{g*{FEόs*zlݶ&FMbZɢUSUkq$El l$G<(|FAѩWY[ήβ/Ai6O;l d-5m^sgBϜ|uuC~qG<٫U%[;oP=Tg?w۷ottv$ TO-Yu]d["aUnS=T.|c'_(JAϏ+-Jɓ":m zRmΪve4"azRmΪr1#{jjzqq ՓjKuW$vxr^4CA@@ 2cJON"%lP&;L^#Ֆꬺew } &/֑jKuV]h.r{N.@@@ 4[ӑm1bQ]`Si]5   sɩH 6MmmlKXY/OOק-~zzxӚdi|y.N6yyQo~is@` Pnʼnɩexv}ؚf-[5S,k_Zx̠ziCfs0*\g,f)5;_1_ Ŷpi|y yӆ<z|`( @@Fۼ<0nhP!Ɖ&!"`#ִ/׳ӥ )[SL՟}vDc)iifمy nΓsSOMۧ~7ɴ1uZRmioQsF|ri$>Oxu.O >}t*Ǘ*% :O.tyzSujcRFK}y_(b`KAr,ml-i c}`: 3N ,9ڻOk^_*9E5׮?hKfz.c4uv#JR^)R m{!^4uyy1/6v)6l8u)/[Oa8!&b  K$@f}oYᚵJ%y?gk6=%/Hl>Ok49dR#o}^k4kt]6 TNX'[5 H~5m{|}A^sK$'/mezdKX.lAKQU%s1Cr9yF񐾛 i_ѬK^Ś%|jz>SGrݑ #k|;ߊ8&нr<jL]ǐɀWӚERB-n7&6M|5D>6?=m{j|z*Eܶe؝J@l~sLSG2KG:Fݱ4yܿL2j!7?33sh:هo{OxG?F quT@˼x*{z~Jޓepl旰]`ei[+6Cv{ڼk2&vMiGͿoMSf)o%^A@@BK|L3Rj"gͫ'=ߏT_+s,.A^m$v<5X[c毷LHg͇v`6jkGJPm=<9h˲_v1 *7OE;Ky`B_?;}6hsuus6wRD'MֹkM&)zM3[=v   %mY)"gM^m>r6KW'Ua&O~5*Ws c9Bg6Ah_X:-ӑTO e$º'{g}YӣV'o!KcZP[.AϣUi)fLNkƙa1Ę]٢lE&nAE%,p&NAB^Zzӕڳ6,5lޒZVk)\Z|(ܶv mXl=c,)F)xt h%V*fr~t/o0<.Pm u;}"5BCb[\Bp4ys4jb{`mBDj-_biOh2%nPEbȚզ&e# >ۍw5k‚^w۽j4%=j5 Y~S[XshSp~^_injllj饨nmj44utF( CzA6{;@n^?hm6Mt Z S# ԛj;d#]vS8Ŷ766DFNRŵ;9b5 ;&L@I U y(u֤sڧMcAyeډBqPdf R!巘nM,EE_Oe[Ml(o+}OWL1-Ts:@+ee];0rq4i':NAcr뇳k.Wt_,ӧ\o:[4ieߤ#S7w'$97؛ŞK>v3N^)Y{"Dv㙼smg7Q|S2dv2ؕ2jNd}w^XMq=I}S_:Yt6"6Rt:)ԟ/2A-|SORiZԢ"¶s-gO]#?]{m'sj]&_,8pS{ѯ2X}vټbFqY۝AN]*҉\ERB|Ac~;z0f(އWfUFEՊ]KKeRޛq/b fZ=1YJX: ҹw{tѯN;v=<߻1l䖆aR՛_Ƕo6_~G7n{ׯ=dN-.B@'~x탿z}hC޽7ߤ{Uk뾟!@@@ OX c_GBݧwZs=0X|%O/TXdTa*3qP8p \) iAD-j{q?uyϿt]|]tO/?kwwOՊ€X_bH[p+#o ]B[fmW:رTD7miy;@IENDB`mondrian-3.11.0.1-R/doc/images/code_spacing.png000066400000000000000000004105451261646570300211220ustar00rootroot00000000000000PNG  IHDRb6ot pHYsodsRGBgAMA a cHRMz&u0`:pQ<yIDATx^\I.wgݽݽ{n\̛|w;~f Nr*ewS<{Wk6tF#L䣳Ȋy̻=f_X2~\,?do\zLl\Bd/nS|W^y~(*f4|____?#ӭ.'lw %8lc՞H}m!;Cw8Y8.ỏᖮn{k\B-Cv:ow >p+p$@>pu%0;|\C0=t\AAH79g|H~2о~Ǎ`߈'wlF YyXkz'a=+-=wr[a|GosYiyfsMe|d 6дM|vm:4u㡩MphF'o88ik_oj1GXVG`vݒ].f7,^/b/ol޶2)ߟ9[?nd 4p&M5~o; ߞIޜ͉7&l|}mxm܆WǮ^1k_뀗Ǭ^k:jcpd+c׿>nz2oMoLo$w;efta flp涏gotΎ| ,\`]_r,wz7-[e{Xn `8Xёe{\nWXjrlOfr$=?,Rd%i`;j1YvJi`3jH$ſ82fXv ߎ^d6#?$T0YM(*K- K,[bb`7w}5_v~ <mR-06|4QATSTֻSߙl6U"*w%>8ڌl^m"u/#*OO+  ? Ï "9a}_)N@nwD1b_Eshd&+1-%ޚ@^= 1CIטaX%._A5\p&2Wr ]!,K"~ ?nVB6oL#i6u`SLoMy|y]OD#7'N@E^Sͯߤ~4^SJ #?~ޱ?U# ϣu_F:Xc723yr',h ^G%ۏ.d,ގ84Ӣ-[wm%ۜns^݅芝 n ,Ֆk,=!űn/a芀>"6 m}ElEUMs~:%WW)CWwWWWWWy߽ \ˑ Bޥ %ޅǼSEMۼ/?pk naallbnez);“AwӇ焞mq*1ts."{ܢG[yDY{DxDzF0z ;֞Q8םkѰ.%/p k6{"XpD.)>0#Hq*пA%Fg,ѷN7yؼѻSޞlȨ'y>ᄞy>YWW ch$9=gKؼb#4?h'sx&c*Q?> ؼ+1\nY}Gw^7w ›[ڢ/.8u"Dd赓O8Hĸ˔v"DDctĥ"ܺƽ7;ol6AG@^"1 y%ϱy$7'3; 7$yM nj_j_j_j_Ը9Ժ9Թ9Ի949l:m>ͦMn؊Gl6C2$%PPPP|ԡCQܣqAe7tUNu|0kyyM@sDpKDpkdЅȠȀˑW"*p=:@drd!EW{~n5 o{}E^kޱ6^'mOxŀ*h}.H 7>3HRmc}oCiD9(%$ 8@GC|)01 ! xS~2`q 8aߓ 8(4A?BH8gy15p6\9w8rHma8; 4,`-Gt4a~$`a.e;]nsMg;1q\`` nwy,-nNێ.h|3?>eʆpօ0Xn{~\jWX뛅K2¶e{[J]e85/ kxNobS ( –7`wXiؼ__If-cۇ3?" _ZA?y]_-Uǭ9<~ݑIL\o7~qY{`jUF?v1L8eLSfns\皻6sa2yLSYfGƎ3L]cso$f-`H3؉rYN82̅24qm,2r\쁙 %m`Ȝu*T`d^ w _J[>!^p\ˮk ;w)w%jߵ0?-;aӖ7|,] >Ŀ)Ŀ>R^n}em8n6}w?]@aAxQ}q8v,&7&?6mSY?N|8R}ޑg3;?xDcK;g;߉4,RYHwT_S!xbUf!sYlIз`& bȕ 밗;M79ve:( ܓ&luF=4fM8_BO~H/ѯfWh'B/z?>]FNϜE~W H/c昆~7= h cW ^7Гy~F|4Bz7c>.-^03ɜǼU`K9@;+-]Go>K ӓ?$*"vw&C}.ܷxR,Xܷn.Omg qI)ϲxe>},sYf2d,ĭlcy}E %V+q/ӿ-+㜟WGGy6K=:={ KM)q .Z===?:? Y;T?HxwF|ap$(189cPcpCPHDyG]"Ds^ <)~̙NA.vžɌ<8G$'D*PG0'慝rl5lˢh'+0.30.'<ߐy!tGup|#Sc2h+ +<'(1̹*%I=! N0NhX4X!T0l88p/7ܣó1Hѡ^k.>k|o8`dP]o<w]Aa3ā\fNvS7aEDg]MM,wɘk8~\SS%{0=% :|r?/v7(VP|w1_vfl2K{ɱ廐|syfxBmlqcG' *[]l^oӇR%D{@l(m8'<3<#36BɁz{^saD{^E-L:KmXF'rtؾan'y͋64,'dfa xF ̅e6\X 9ۈa\XiBu:,{^X1 &B,j6%'6 =9Гy~0l:,߂ c y&@keHxЯ6#6pyFˍ\nuՍ^ujcz|e΢*Y4/v%H,j,kcdBϼnc^,҆Pc"pe.7 BObAU bj,r/yPy~VKb%^A]E} 7癅ރCp̋ 楄qn@'|^~P`6Ӕgv0Ma4{iN&&@qq5T8Hd<=.${iN9n$o7Mqk56钿(k{w_x0Oִ5 u=[</v/K^^]^Ff:*8dHKp!.G& "[dᦸ5 -ؘܖw?F?_ßEeGeF98$=o,?zcv^ӄZI]û6^rQ)%G)N+I+=Yv*ZZs$M"Ʀ㒲St/=V|l!RLH@EDEa$\89! y?s,&+*hǠC~ >V'wEownz$pAL  nfbPƃ_mg^_+_}K=>`Kw`tR 8/xmn̏pm 6_3GosuʮS 'm&on7~!Ϊq`7~&C~ZJv2Rf2bOgohξ9~+pO.m" ǰa G> f`1u T6x5o˱;X޼{N%=nwn4yd8lukN{[_eb`z\hoz_:~*=~+-]/x5As.r f{< *vF,}Yboo`E\wB2{ n\ ~d4ټF3:,`&xJy^$sB7, b| o8MVHR+8Uo#yŁ^Jmm{۰oLۨ^,lڀ4 죌oa󢅞ۨMЌo#̈FFFyC"Joa 3b@|ojWoux03FXsX{ =}#BF׍=4ۍon8BSdWZc6x~ߤDp9pzB?YNIM(VBu lX{#= t@7DI{r^7G1 c& ӣ~53vSVoXaeF 7ܴ"kӊBOo}6{*7.'&;&#:¡M1z՟}eys+l6->v\w? qlzi|veb^ur~ujamZq]Fi}fʱ19GLi̫lʫh 0=Ó9e 9e.*,98Oo?E,BFq]z9 q'cFOg3< 9ȧRd^\G,I-^ڳ8r#݋xmR6"=_s& JNe2F,ygҬ~xqCJTc UYQVy$4x\OL[DS|!9w'nWn;]q4z{Σ1;]O!51>!| C6^k~e}m~?_/`Á@쬶[c;;`x^R ؤAL>b,|}Lo7wlxluj6=oB!4LMHMT /ǩ';<~́K~m6 ~㉸݈ɯ]_-Șv 0ewi6|c%>b`Zz({Cj74;aj`؆Ck`z{|nsm9:uN Ym`}a`@=H}cC}CH&vHذ/`-Gg8MHpv,ul >X_nu\&puC [0xÁ0YjqlN0X-c׏v7o¤ێdam(ՂKWj,~|<zor1z|aq.vsB?y0z"pn? =?zpsz [Pul^Yսn w6N 6/z zį\(B`+ =c,ʍ =z0ЫуL1n6/>_r}~7E~Ήo9;߾;߾;gXLq wNKp!.G& }|5̓7ŭIUPY|O{~qv4߿rq^<<¼¼xYnfU&5&& -MZ-MZ&HB\L2Drv㦸5  /l}g`O$aB=m}/ظ6}_eNgWu7&y\,bs*π 3[u>sume9_3=]p1b?`BZKk[kkc1酑^oK1өBlk NƱQkΎW!z zz?ઢF'ص9mV%@AƂ؍z/F/$V[ӿ*e- *÷võNXr KipҐCFl+r7f6`ZxL~mbNu|V%8}DrQSy^љΡv)S[yqO.[]Nlqit$l]!p(H1Ha#Lم 5]?t}"X_cu Z7&5C 1<}K.ul6E"ܛX JMo}]Y,m&Xk'Ͱ0GpAYc w6 {R7l 3th?.Mh'> xa^Ǝ'L"M#6 ^cjjjkʂ1p SX1Heo鰪l^tmtmznWYJfUބŷBz6"WoCAN}NXzNjV?t;$ j6<`%7fk߆9SF] X)X\Xy8߆AYyUbbJIy1 ..ƈq҈86JFR~CVjۧ6yiDC ͣmΈWzG\JK`!T/z`܍- B7B| ny^ЃPs7zrǩdBo7>*~ m8!=z5Wxeر-?q$@2$%0W>{Y!CdݩmfWc@{J~gw0r?Ď!n?3IdN&k7y)MoJ'S6`=}gq q .̤'}lyؽĭ[hۼDw?J*J. 8]u2{7e'祉sxs]zo}˟gVzw0G< )S jJ*kZJS昶k/׶tk騣m]ok ڦƋՍ4)/Mſ8D۪Ƌ *q'ߍ?s .xUc zJ_>OWSB *B9%Z^0=I+c[݈|mzߑeulRZz%u ZP^W8^%,=l~esnESvYczq?sNG- N,=u4"9<>Ǔ%<~'~gO^؝n1[#7xЍB llr$1 FHFpeix8.jvn`vGl:rix$&g#p3M0Q p(xwÆ;RK_z/b517?l`ke {ee.a`v0tg}:{+H ( lqi < Af Zx6s]wXv8|8 2t(lHC|4q1qwG摛ox0قw>FP=l"nx8.yo P 4ϾvGa`Lp3O 6 gR(3|`o/ .ErZ oBi)̇6~^-\cRB/.&0TkYOJ:1T-d1)e|]*Y|Ƿ@B5ۨzm4fĊ>Ol$Sր*aQB{J XhT<P8ET>+NíXp (kӖ8ֳ5mkg/ͭ@bgü]\Zw2GoS!֒κ =bMŌc``d(RbyzzcSeSv5R #M/X{epx~wc'{,X E_e ʭRU.m)ncxVfq¹Cziԋ|*+ 8BR/ N,9rp`ҁ㉶m8ed7!ƃM`G7o2mh|t,sy[=fmY,s|ٞVk`fykl@fC&vd kh #CifG:юc-[" ݸ?r Z?tݡMC7El<9=1pihM"T1ǎM)nGiSՎ$L,a89_"l̗:>+_ȯmSϞ}}W4;3t TpɐB\L2DȜMqk56iWlS xdyvA/6nk9{77n=hE k|~F.}4 >cSq f~_fKgÅ[9*/m]K1Ao_zS;yFkWEPsfo;=|[gt>0Bi}='ʓ _Mtj/gQ䞏t{aOkc$/L;Cvd8Ķ'7+Ov4~?>|FImNgWeV&,x\\Y.iN&q>}p?%b+yۅ$ xd ٠} ؑm~ѓۏlsm1.tfj LdTAױ@Y7`:d}K,5f *[7>٢2" oyD`|c࣏8yCX*Ż?LS,D?8'|4gGj#coe+bY1wGE;-E %6Az_m:tuzig%Ên?<㏯=bϱ#TS)}&R} &® [c1O0F>*Dp9?<ش׵p;(?<ۀ6Ǘa*&#۬55 <͎,JBr  ^Ia9R%[YJWы^BzrJ 3Nxat'BpsuF7z3n9S;3olYf/]pڰj#Hĸrd!Enᦸ0+`|{xȂ=-"hxKxcYȣ-{qU^f%W?4˴?LȲ<67:\r|&0{_Q\X:Q4.xpC;yT84vJYTItx:QE ׇiӖ fMgf~2s)'U1/M%.c^x,l8/bO?7-3v^>gٜ+.y"D]K-mB!:MLa}%ęi;y݈Xy1 ixՠ& fnh)6徟Vs)*F lN7qo%<`G &> w.Gs%;0âx.m:iBʍGdCIܭwB.L^nB[]ޘ|hD`ybnh&b%A vcZu!,:qBR79L3raxe vx*dQnJw,Bs(O, 0+%y]3bX|XR~hHѝ96,Bϫķa6Z"l1,bF,#Wm5VψU+է>ruXfTE<Я}n4W>XjÙfO4=F+-_2ϫpB=M"W2MzzZ]a9gyx~=m9B"|,, Bt ša+.7{ha Rz ="- jiВ!Kf-tfԲ1gZ1#~Ō3WNRWWOPnjՄ3RWg&όӟyr" _:+t`^>?[9$?S+fǭ?;`٩ fgzvY@񚙀@f53X-Z4<=.Y!Cdq Mqk56An+o}Q.6l ] śxAϮUyܼz}QP֦7VV23͂O/mȩh*m- wzƧ.x wڋҚ.<*?hc].ʜ^z lL^_:NoԱs0'g|@IMhn!zaSoKj ^0iMvq~g/0N ЍJj1A)e ㎝jX$VcT_=ũGa?WZ?Ϋ$j? 4_ZVTHs}=s}NdEXC 4$j9G $ A^, cTEy" "P?{\ P`^mu3`KwvĤ,1ˏIʼn\@;ǝ ,s6wpv|aÆe951m&"z:¢ k'df܈]{pjtxҦ# Oq*W R '0f " K;LߙnQ,f͏˱p} l3z-i0OdOc #DqƢQ3 BmbUw®b&,Jx6`px E<0~Lڄ /)eXB?ϔͅ5Sz0wyL,_bX!szT֓lu^ۜn6wrハ/MVZGk}[?`m}7 d8a^˳曣7Ĭ_qYe %35Zj,di&aIN !1.<d -2-p#758V,)6bw9 jp/燇jhhlhp D?T?TTx |+r늪^S< O q92AV"s7poL`^eb{w E?mxxt خտFgq)뉾ӹe2MEJ*kȯl*m Ozzc3[$ԴcS_sb?虝h,u(֊pxЏM$ σ|X/W\\zB8I1m3j 0>(9u8&OkJ8:Nwq*~/G7{ l,vج֖&798M9GT~E)i8d{mKxqG~QezǺfֱkia*NAvOمؔp1CߍEa=wbp[(źB .""l: C%cǏ<;-Fg9΢E@=235iTfJ:_ǙqnS'#X w+± !m8=f1kP', .b f 4aӱGs` wBK,\~xϷYD'\KrR1`Xo7i ~o`3LM Bd2c٩uf`Aq4ZV12u(CaM 41sŖ"EvO 8G}zwq/(6OuP3 30$V| فO 8h1`8:U{;*`f߸նl/%h/ Hv!-ʖfJ,O40^]%_jmɸ>)]BtKa /!^xb*L_лYXA}K\1`#oBszsfd2 xP X,k: ioeX~yVGy ʳȄH hh(*B0n%\d(`* Z$8 DAvqCKV_ø*"cyW/ȫ^°;_ WAޱq/hL)F(0!QDm q!wDՍhg3THc'<5j _Oh'u}Fk` }>ՁA{c]|OPcꌬ+-xu[LJY;=5氾3jf6`0PXeT#<A8L3j ްG]yZ]~37R0xlrQ?Έ6֋dakH"* zawN-^LV] [ ؘA:b~~LGZNy zGFNӌſ8Lڈ4,!ֻ'ù,bюZxvN1f438`@NANaDX [`z_T"A绥M=T=a!f)=--σ3{+lo0f{ |jhxfЁzaqb:ev3<iL FhҸJ_.xf7,ўU*I5K͡u0G&_&&8]AAEp .2a8deOIv*4 BņjxՍz_d*xh v)W-@Pgw~:w:OJ?(ACA ;#>S>Πg}rr<-0{G E5D=]Wd,l<9o#@зاK+a1 0|ݏϡlAyh*v3!:`R\i`;FatcvWюWˈ/塿RaրYkͶl;_IihNKUƇF8)t pM6 0c0?ln/`}![p6| Km+ƿyKS|i[/O{:Wg0=ÎHĸrd!/S]Op ZznW&j4O|ﭣ۷ǜhJk;єp%D+pvˉѝ@NdH̯Y!CdK'FnZ~4x7׫=ld{D{$zE۫__|?fU\f#^uNtZ*jRRI}fYSVYcvyo({y#±g9+:5u2J,Whbk91->_Mۂj@4)yHNaE'B.u9"1%`v([!%I^y OX6>bA<k|Fqm)*&6?yIZ֋-AA'sϼ4&m\'%zf쒬Fx5ғ9էj Ν-ҊS,TĶX8VZDiLɯjAT YDUY/(5@fY[tetq+g*@ͳP l_3 i0i5:DϞL+;ev9KΖD)K. NG; ;}|<Mu\b'OaW.pڂG° B#$]:u\1GɯfIXψKJD(4`)V|ZT̎e [Kxh^&.H0VZ]˯A@ {™~( p,5E) fǂ;s{92CY/|c`h0=2ղٙ|]rW!B yQȀ^LC qG<ՈGe!|" 6e/bR#`E Er @^V6ac(5`Rq =Tͨe$!z6BP#пAlP(p0ࠡ%D|0=+}c? h,4AC)ZmLg2`#&x @}66Boq4jQ h}A_HX5 $8 ;|A8nvl숻H-k;F4ndCG)HX659I|p1\)ć\vA|];>)VɅ/3L:.5G- 1$2LhJ Y I&? b]W8ŃAQ;1Oخ>SyT 8U*1rj c跕pF L\)qt  `zt+00'2RÀ Zsm<@xH\cP ,P챢z6,X%q*X. f` PȰJ*k,VW$`mufA :`u? FCnVjR-[ou `(fy+ۉ]n,=NZzNYySV0=&n'Kwn -ok,=Vd<֣D o,kw?p'QegK ؤ@OOzPtw Ow ŢQg H9pЍXsAJ-O$($A"芰pFn Y];"\X 0Acs |@LTi38Cj PUZ !Z6 c2l/PqP@a>̆GL%>0&ayH^\p(\.wc "񕲳%.\9XWqqoHL6×%6% WZ3݉ eQT ˷ApV4]q>.TW=j=^Z(ۃ0^FH /9BXeW,V^uKRP,!Ś%@"lAju<"l8.h&@=Ӏ]0D0uDVt/.-ѓ[6vnnX8qx;`bz`׮OD_zq%%RO;`CXITGS !xc440 p pW%"!O@XCg C% pO8nQY;Gt6Dg u}2OƉ8vJ |O!6C\AoGʳ_ $/S|!BG$ %xKMq]Kwl޽[|?h])iy4J["k̂ϭ'qKӜ)n:[ڜVޒ^ޚQіY fUeѶ55ۊrf)˛ʚJϧ4S ꀤs@ߗΝW$2@ȹ\@>rq9lhA %RD?Ǔʀ@ hGq؂bB_BOsOJK I23"BVKO#DfHQ+3kY}GLV:ϝP{"~E7/7JhU"Ai-]ڢeCUtw?gJ[5EgT5-QўUE5Pu1bV%b'"fRUZYkZiْM)EM) '4$Ж1P䢦B*g :Tب@SR!tA|ĻM%(hL(hoh# G iˣcscsOԝnɮɪΪ8Q^Z 9S|:0Tu# c> eqe^޴_2SeJOŔp'⣄.'E2D1D;8u9hLR D .v*,( ۅۅ5p(4PH9sH}PP"(;0bt#A_.tr8Rg\%!^ Ju$Tz%Tz'Ti' |J$V#}dM%"_)5@rBI5I5~J'U&UKTObAPNi >Ex&@UP;ǩrSe;Rңjr y+-r"8Fr8D@8F pͶ94AY3EdM|TS{(t r cJ klɨW\ )dg&?J_Ԁ}DR|.B|. +UxVp="C\j'*^ĖRj:z\rW:PvSUt(d֣B*:^m=3+E'$H sDŚp,&Dq 8E8#ELGcjq=YF:-w#`OpN<8*<qe xi |$8]~t J Lu{&Z ,\xڹ: ".2#*>*>:Aĉٍ;RH!" QAzMdzsQh@V]q2#m<@\^M"  9NDbQsВXu$= E-ŷM]JZn@'5/oMFHGNy *E7;w3\Q$8GU/BhRp(nZ$jqӵ" qJ8"EAs5/eU]ʨBz lP}"gT-dt镚,K\.=bG\Jhg;8؞Z~,Pv Giۙ3R88.2ӶRIfۤXv--5Takla؂yJDFQ"rZ"n"χ:u>4),!M!M@i i‘&B!H`G H?S96mpL_ 7cu>IHQ;t =NW# . )M@t?@ԠQy/()0T |Z10N?R 0&,q * ޜRH(3d9Y61E1$h hKQ)Aa\dj.h@ NR3IjAR)ua L{ V<r<EZ:j\>.yϾ{/en{/`e_%NĶ|}PrXqb~,mw,CB])Jqv#4CA#Wr0"ȩ( d0^+hR|5W2`! A5$ . "<<,ug;bKǻR+YMVu%?WZs% 3@ewJE+)WT]M*$W^Pq-R$l[y5;+XQ\ ' /,Ė:/N:Aލެ ⮓ٽr[r5p`G)+1WNERvEkCTA'Gd~*XW.5 q1(r#"oG)Jĕ]/Pqt*Gշ4\}WJgjniA3 GVǹ۩sGd( b*AScjNjfb%j T"_:%^=%)jݨ}_h- r[ki¨%Ԍ!YmZa AJPz7l(;e?Fq*̻/Eb ֮ɳq:.ݭ T^{{onY++.>@tJy􍱝o4g!lA}ag1<}yTo@zK ˅[+n'-g/<{fQ9+TRH|n=0U6LBH'sI͔Mnlìeg.&:ե(lH H4)vALP0TB^_tePHERvt^^һ_e@Yd 5 k`k$ҍ/<N^yk3KpA'Cׯ[7avT+*}k ]RwM5 k@րYd x4#,-6S2|ו[ 6PyOoF]NIݎ?S'VրYd 5 k@y%-Ep6?T3`s{-9ZlkbyT2U. k@րYd x40WT!,p†nWo=Cs /_0[?om_WրYd 5k` [,C6?s+s]`6_w=&CWȞ6~s%5 k@րYd Znw˶5 k@րYy 7a97O)U|zei;y(Pyb:ߟoW,s;;;SSӍC!io5 )A e5 k@ր'H#{LŰͷv<[v1rFugfmś]Ͽ 6_zGD x12 =\66GtC!)^-%dpr)d 5 kH,LJo߄;4'%:cc㎎?I!fl)A C.Yd  _itYmmAy_l~Um*.gVwepT>n;Jo~o̓F~R&>'%jy`| ņW yЛ /UրYq ,Xi 6_z[a VuNȮΩxa/k!y;~HA?|񃤽gK M5 k@o;o>pG(o Oӆ4\WW毗6_m~'WC-zI2 MX>tZv3 )QA߰$OqVYd p6_q a`gJ.`,*zڌbli }S'O[*gxM<*@/+lj~W,RE!W:]yLnˣEU |@X2-v/|*Yd ЪEn=j+bȰs晲*8\a;*Zoqo#ĪWNU=p 𡠮y 6NJ{Fx=~5I{͒ؽށjս "d 5 k@@?4xIwE~d5.4Ŵ)QݕsJ~˚l4k+!HXazn g< pS?NhU)_+|#Fwuuuv-[p!maq@gSTб@DI/\(|SӀ6]q=⤉A:d*^!\dj2ɴ>4<2lo <d x5@.ީj0lX Rgt#Oޠ6Ҧ%篖4]vwβ +R 拭FbhE-mJJ8s>O ,/Ŏ<޲Ul luyD;,A;y`{t >S0rEB@eĝ؏iiQ:|ĪO5"J5(.jUj CrG` ZI֗d|_rPkj2RYEv8.鷦\xYd 6 ,\e`m7EPLQϖUudt#HooG^};KˇZ}dګ_I'qlZlɟce))lwܩ;w},s iw圴eY "4 i K:saDSa5l;m$:Tߝ'cl:f}(PNsؖDHUR~q8me՗id6VN&k@րY}L.]SP-(AfµoyD,XWnͬh,oͬh(oyc<>ʣp)4*ݴ BJE;? )uis횚jz3\SSo_u:Zo$ތiu*KPAwSh>ly"#45$*nȳG_l_HcPL9].Iұ~˯%qJ`r򁥚H5ȒlLրYK^r;2[r O3m ݷ3k0Ok֑__WϿ~'9|:۶u\4wny$n3 oxlT%2{K8]U%FyFmt)ؼZ2 x֭rz]Ӻ JbMLG>e { f l͘A!x#vXkO#:aG'y<4e eeWxk& R5 k@ԅ:o h˫o >Vf,x]2: xڼ]n%K̭Mʣmsq3o*ÎE*F`.d6Id 504*3$~d0S.YϺ6NQ]E l~jΛ*.ީ zn^m;bn3)B1ɂ5 k =Ϯ54пq#|.u3-8xטtzX~WD{aPIW_ȩpƌ} *!pH2(9(ARF1ZPpp58Kcϸ(>E5H s"fbl~=>[\TZ3TmO)=X_,˚i/^p]`{mP]|e]%w`ڀ ]ק.K=)U䯖 e}>ir(.r G\kxGґ_(O?58K%iO`+f]˪Yf;,^muA;.?jwoͪlͬhy}ʼ}Çk[E04o՚7?m7Y~>[99DL֥6}+whyҍ z_i왺cP! v88 KQ[c O``{: L3f5\2c(E;o<(o-BgVeUs6?qؼV]~7+/ZUпyWI1 ݼ/@ Zro肭~Ox\>[='5򜈩ٺtyXAkz{j{=䍗o1 ,?_sʳ v[.tnʧ1."'N;V;^dz:v/wھi')2uʉL)?[UJT~hlK:N= <*p%/C/\e6_z&RL}em&]֗jUm?;oqK71ܓa޺jW,[rxG3YM![ֻ>y5KyV9:|4שߪr+)\o: /VaU?\4J5OEH.>U_Ϻ{/TT9 ~=|ڽFF4գZn*mQyĴAl>5l >tk퍸oo~ ͷ_p<>=H%8HiZ['9EX%fVY6nk-cɢY'ϳZRҧPx;kR뾪zPS-QrHWQbuៅ>O(K>bjQ [Jm@;ta),)mYa={ z< ytD_0׋D_iW1*-\|/%דW>CE?Qpꖋ;5Uܫ,ɛݓ=i/ؼZ杅x$\hJ.rm=:nPwኇQ#:g9n]`}y?ő*jAE^k烫z *mwbj拓ȂDŽ"a6om2J98 Ix*/b^ֳl>JzcwjcאasWltnAkEM׋ G}OgW06ym.m?~x綫[<U%A 4uv{Z`'Fyd"44fl^q l^ǕETO@qyDxʣ5qr/LH:tUv饬ا]$SSW: T=z+you4Z7> ܦ;>r~`"\6 ?thM>vչ+1[9D1HuE c^%`ϬБ-;-wll>ei 82o.vzekKٟ |?cϝRtueϮ/er?sO>6V>v,ـ#*/͞zV]Sؓyg"sH{\KV!}? µ{W6tz}(g,pvfuWvmw+u4%7#OkSKϧ?[҄֎~+wޯ|^e۽KyEGG%{jNe^G{.g?^k@!?~cYPI͂ mZfm% -?yŜ] u%)z-Ep};TUVTzvKۉpRƛToGZ)[֦8͏W1G?*.QC([:kOFX;h:@4jJT,yqϥXP={έc,<?ޟ, T5sЭv^=t'0ȥkc_&`o H.H|sGϔeėDdqLٝp 45 C1ԩ&YROҊԨzǨ{6?CӅwa?y3amZq)#3^~]ڭ†↔3 -L/_7޹sAtO;?[8{OL˂ʟfwʃ57˳^a[`}aö&yңtv4ztJnʍ *˚=uƯqV+s(JdUb, dEM#)JqZ0T(>T$eGX, EVlcmFkkޔ5N*r*~L4~v+͊砭Bî>JOFmxVϭՍ.ATĴP+GUa׮O(d쥎TzI;lowK]Coҭi_l~mdӕ1==M?R=ӆ*SWZEKFwӻ@uNUԞ}ͦP/ex*ܴ6HqG죴zۥo%^Nho\o]2֞w{j4*Bx JBN[;[m֌HYy=OF?ݶ:s8vϝ(80EfI,wD=u4OnɴP>Ȇ!)T;%+BK|7o]7pQ43olrl]gJ]Grs@ymP]5io.nK)x"h=-:gWo%%cRT|_mPw|׭kU][vnQ[-]WmsӼ9wV+KP2/ѝ%K/,㺍[`jWHKJJY~tSb9>I|jm@Sڏ16^VoӬP ے(V򘈏F"kZ9-\ !GXY ֗j} OU 5l# KER)@C~uyD1dX3ݻgkϾGy '23/!3´VU{> 5nRNX{N_fۇ?Py;d3Io#zNݍU |ž.{fά{&k S*WKv1+ݥZrxKfnO/⻫S.l6HQAk/gRs=D]Oޱ~{du{ah}%i35@`v6nͫ]&TJޛ,bο~4Ki >y%Q([<<K]/:#%J/6?v~DS4jDx͇dCIjPweZjQG}zT$ʑG6WEKf05goXA}23ʏ=c,XiVtm+EG˙}o`-^[CG^ߗ|~M*Zc:ܝ6DOKް|FVܬ[駜4/:`_OyO'`*}XA:zi1+ݥshsكY]?nӻy嗅`1%/*Z茚; ={ʯ9A" g7,Z8Hta]h/[iX 5[{kWB'dͧu 6l13ڮDfԟnno ļ -}۷ohͷ_{P|N~[Y73jnVݬ|l^%ծ3fVWl5CO:cѪx,i<[=mʲdnؼ8RYRYfUf ҉%__?(Z9N7KijkTtZK;]mL͈ 3W)yK[P h֢Fk)'ԑGjՕdPG4v͊> O fUU/<#/ڮAVSZbZotx89ccٳ[;׌M٫5}`Xp'xh>j /$}S);ʏ %ǟ3:TAL y>v͗Lu*๷hMޯO]OؼR]:RG-Os5u掝g_ zwƼ_N/fͫe UZYFnA<7q]Lz`͝'lb&VŻ< ,Wt[]_^yL_gj/%׶'ՐmO OӗնtHL'^yKko>n6xϷ\6}A_4[*or&n͙%{Y8Ӭsw{c"?BoL~LH#4t~"{,۸" :^wceA5Y;1++%W{>rէ iSEMnE+AW[t2R>CMeU,yKP^Jn%"ւڣ<>n",6 PӒZT}*}d?f beP))V120ߞ?AݩcgM)VR7_LOqC#PB^^|bÓ$$4c'6'cto{>'/='_O?J4s꾳*m?˰7Ӫo\~=z|ɵ ^[r2,۸5noUyVqoWY98귭5++]vT摾hI}a`}`( 7jp#kmCr5蹞ӸΰVzzOO=oߊ0H#RM=ìw-o2~^ϋTo.Mwz:{xnGfOzcϞ}>lp{6x,~YI/^НElxkegiJKo}툮l)S6!KߺuBl^{p=ݚw/ܭjrK~{henV%MY^2]a)3-JHo²R##:f]%6kv^CvuRwFY}]Tdzvsߚ}2~>˂R!FrB?m֒',3t9X_fگkt%@_n‚Kޱqž!?~ւMգh[yBy+6Ei-lf"dU[͎/5_b7kǺ]Z/Jߪ C龲>[m>'5򜈩ٺlg),6ӗ&9*bqi#Vy`ʈ}CA>韄_ix@!LK}a<V6^:v//8L`6oyyf36?d U!s0Ԃ I<'bj@'RonhSn\vbje{Fe|S6w|_\|4d 5 k@րYP}VY 6?}֮[iU2;j;sj)並|xu_">y6gw_+hVH|S`|_ړFրYd 5 k@)/P!y(7Ko*mE#6O1mT^ffjzoqիC.|e 5 k@@_;\]Vł+&ϓ@5:9Y4晕=Jڋ>aWiWP~d(kI<(AˍPրYHy5QUD 6y[iCTCi3T,`Ԁ9Īؼ@QD xؼ8?^ ۖA{oxJl~&ryd 5 k@`yng~y|qzu6ؔO͟NL:㽱(>dw`poV-K%_U2l\Yd xN40`l%@̓?xP8ain(柡染w,Yd 6 <1Eo~xtj[KPY ƴyxj~楶s)%K4eүUo_4(l4 uF#o޼ymlžb S.Yd lxB6/] ml]tb/h"TZ: l^!^+Ϳ5n#mb\c# A-si~z<l(A}])`{ 5 k@րgZO)_u "66M!lǛ'ywR<4qicaaqB9[kZb)dl^_#CoÌ眎?lS?O|ɼyDB/E5 k@րgZOZ?W_~PP`p5l^P<o^Hm󽹭B+ב[o0~? K yyT1c8`ee w\xYd lx6tY׭/=ܰ池Of}Ѥяd~8'r<3LMM===#""Μ9s)`{ 5 k@րgZO旬5M!2 v8uu_xzͫͫ9?7Rۛ;V>l6x|B)lr/6m~&g%k@րY'apW)Y_8{9o/\e4PlK8b<(MQրYd f]]S= lò =6/z u?ؼ6/iYϨd6V\lYd $Ǜ7.S[?%[y0'"! աDY7ze &6~i[mn =6i6\66f9gRE:ƕc?_;t\)-F(+ԓG4'/cf?6gv e{pQwUCNy:~I+_+k` 5ۛK,X/kEh-xڼ@ &ɫlX7m`,_;4ϞyWJf-6v|s 1ܤP/ſ~>^U^|;Wf6~ڤyl(E4t!2?I#|t?_409BMЏ,Д WҨ. U+Ab$O5zH^>39Yʹ//\=z0:kFg"3/-hIeR*|$1Y>|t{EV^m^pq{8iawW#{>jwhQ1V;K\CI@* ݇~׶mܷo믿΀>n'O[0*+9 Y/[[PDށ,G#D׹n7ǀ u<U.XhA󁲪hBCN}KK7Kcc׮凯^|ybO_WW7ˡyIi"c1<:{=GРAΑC* <|1+`L՜jt4m7h楗!/hC0:+ M6~ػw#GN8駟vttWҼ7/6͇|P)@o" sh>=B&t|ёT e4o<#+~18[/$[̇xBpDbIi^;h*8jm֝yiÃQ*FU#8ӰYYYe(_,.\g#CCW.\r``>9Y,ըm5fU4?/E1JX;hLZ )a?,̋gLf!=4ftwR ?jW s5C|Nr#%Bf 0_EQT-*ͯa~Zm>i O?=h93*9"鵚ٮAŠP.H(Fhj>2T }tOP@$P Ġ@R4_\"O!=|}} 4kkk+KK7Kcc׮凯^|ybO_WW7c+ӷLgcoA#7ϔP{_Ӧ\P2b8E7*v7,mǵ/aŝ6[LBiӎޖa~#Ų^576u[F1 I' gVm=i3$͇w Fvmy("푭!nۼt;r@5rʣP 4I|QAmReݣtOjatKWox|ёT e4i3CZeA<{d4+LV_2p')Qf%ԫ֚ը#=-#6{޻]z!He -XDm#yeRCs[zSs>ݫ^>_֚j:#0Y.3Oiqs=l۪r$g>ֻ;cl#yA(R AZ Z-> &4ߏ.[5Íw>U&F yUy^Vk+yq9,x˥yZy)+q4yhĩ*Crey6 @( ݦ0{{q^VAU͓y>08LUm>ŝA(@H'Wicg| q)KI@4O+TN iٺlN7MۼbWmoSVh^ @(DdiliC4ρYչM Tz4E3ӡh>V@(@R $E Q)eP9niC~DǛ~I z[S ͳW۷SukM!.bbf?k32I$Z~ST%ݯg򌞖(uh\,:JffÕICh(*yAJjB}@Id/м ƶ?i=dj0 X3bZF!ZBduIoD>h˭v!yyJ4 Adt 鰉.:RB$ ]pˁJ3> ƾV\_#|vF o~s&h^<oȱν)V=Ʈ&IWHg '"o_zng2گ:1T y}/)i -m5.ՁץT<_EHͲ mTRtU4SXsI+"ȞE. 9-ԝ|*L4olyգ|@y`A2{Ѽy//y=V3d_3m.}x:x=ĭK*|;pW3(3l4Gk'oi6ȇU*mK"<{BWѓQ&A#G& 1O==A`ws N*~ ii~͛3,~{tn^E6}|2F$nHE?_-YF;a_X1VzWx[B jTٚ?s53۫y6~0Yv>|[8E|EWK%M,497 [[߉u9G{?@%Z65;$x?VPT ܿ4 ")=m (Uln^(dGk;':sn8χy,%WN&ֽxFu1Љ8Pr0㷵ZT2'ۻ @Ormd4O2bF6{di^k3 $ː'fu ӸBmYnd{?O l6^t#Zzzyj{X7Q A9VBh^3o6m_6w {biiTWvێ֧^Y-fN u+ϼn<^ǫ;ubJȏA^іcl̷t;6W&\rѳV HlɪX'E; ]=gٰ)EvF{kMi^:j*Ѽi3HqkM h^ c4?>9+=~J闎=ЧYϏ+yrmnwyu楆 c_TT]_4\PP\RaDyi{Tѳ,Xk5td%7/ip3=|O͇L΀a#AĔ@k6yr5%;3!SZCgXZJYiYRw(6h:k O~ඝ_xosqT/s {ќhtp)6;҈Ĥ堹־iT(k:v׺ƒPK)-]E _z<+W)EQV-jҮPp3VťųJ"9P@m| =m̉nۼNdWG ˙_4ӏײvcbz}[񹷈ˈkmK~w 4P @(P $E;s ) Zûe(4z3<|@y`A2A^pм~R* bP $Ekwgׇgֳ)ֶ͗4Y 4m~N;M~d9^ l`ez?pKuӎ,yi8M y/ESh7iޑ"h^Z1w~G:0h; UP @R A-޾VM4O!M4umnaJo6fl2|T'nJ(6B!8l3Ӷno6j28`"sx+&c;!ʶ4Q{>Bh8w.UP aq[ЧׯFcwpSͫ7_4ӏ{߾WCFEeS%ֱ@(:[<浦-ցηաyգ {, Vw yޛA{&Omއ*G@EbGxVqvB S3,A U*GʚP ԭI|ik )ۓ47U)iא( 3%@(P c_ӆl&6_W=m>{ml0ɯxx̹\>D]2:{]NWgL-ȭL3j@'~FkW:.&kmL@o@6`kiy)Ry 'L3]-孺7\ㄙ糄YIVOyv^3zn;S4/ݤCެdtثdkM.2G]|4zBh^z7߽~S V6zwO\,--nԋGiOw IfrMo3~T^7cP{楳M|Й`"Ly aJU{-j8;=L[P JDi~sria4߾7lUPFSϾ~أ}ڑ%xi^qۼڎ[#D nC{U. <{?i4D{ zLdt2'>Ny @H )[i~fۙeӵj3 O~ඝ_xos*BӼϛy[ n-8 v oomƀjh_uҼk$E^#ǟa"(8wӒeмdn+SojnieTN- ƈhd6^-ֵJg'}Ћ'c,X *ނJggyql\UNQ clZ`hyi3gaHu,kh0޾DGήm,J /͇)'NS@www`0ēV^EiJ r΋!멿҇L^VEeyJZ^02yYUBd(R@4UCh~ 6[7BW=jŽ`i(20/ch>F1k"+u4SV*Sk/2Lq=G.QˠL%SVm @zU a/l- iY7޻von[xyP]]j+JP @(PI<_%4,s_WFeDI*OR} @ tlw疷xi;/9XNOV @T Qߤ͕2fa.6_XC͓m>{ml0ɯxx̹\>O3j".n,l9MR/ź[S-Q {$Ր`&ըTӼ|ٶ+Mզ̰+N&U!ח0j`m0m2oz;'G*MRq v3|K^m> >Z^ݿ/|4φ[*_(|}ݝy^j{q/ͻDlT7rOoYaN}i3>9+=~J闎=ЧYϏEmwܜ|98V %@/5BL K "L3 zh VPTqi>|DtH(ޫ5 Kjpl!Kl{x @zR )nHPQ4 vamj4_m>L0|T'nJ(6B6.kb;"M$HM|,c?іA[<-gh3B:<1uy0c%]yo>QW=͟xi~qçyo>-oJ\.|]-Kqx^y̚#-sZyɣ j4м s6v4Fjn%Ͱcl󆃐c,;{Bj*Synl+RhćMxPqHo,o*Oi:K}BqS]]X, W}@|`N`N3km$cn֌ QQf,OI+T~x ~H`gV\4o͠Ƅ3*/"HIͻŕ-D[0}n+[%f@(@B ͧo>yOh,X(E|Ր @(h~hJЅ _ l=8??_zͯ61",a͇Q qP x),ϯn2=mTw޼C-9Zz Te ,.@)T4 @(@4?Ƥ7h'bײfhIL#}_׊|VTͧ;(IҼim9H>o;HCBmn_biw Bpiig<@{ +yV4T\.h>fAP 4@ iYZÂmM2Pk8hhx0gn?gѹ{Mnn,U^ͳ'3g?N^1߀3R??X4>ZyTÑ^j߮ t{g"zon2ݞV˹YiۘV_VLbR*ox*/ R@(4yxR7oݼmwyeOC& 3ّy艷Μ4/ktK3u9Ar-4џF:CtoC|Rgqx0Z8NOAY<[("=蛓:^xT@+ol]\!Myoe死͝o-߶f'}\)<ұGw#KO~g7qz뺍͕UH\[78|yx^;Dc]@,~H=)gl2۷t!#"ދrhTʰi*3纪l@fPaHom%7to⍰M4_m>gOܶP~ mnݡSJb8߬Mesßl`+Xj>@o.)C5]j'65}iޅrCV9W).0HisKk+iS5O/& }O?rvumcTZXX,CxT uoZmP[мQkDj_z[3VˍㅩZ6zH/MyնAߡ@  QP Ǿ{Ta%߼bq>BR4aPyb~65U6:͟66}Ѽj|q[OflT3/zA cӼй%CL(Iƙ gK)3٥3af'+Jl,׿l0{ҩOxS6;Kf,ln6k={ʇ֜EZ{ЋfxlxY=7Ky~rpnK66{Cf: P @V 9}&[:mt5>1W=͏ON=dRxc:iGcj3k{z4oW )A(HKuksv0*>m;[ w:>U({h !SpwmvvӼubhE,zJ0 #> *FtwQk%IDAT^û%m枤ɡP]D0>h4~(@Ǿ,͓l5miz2?O?c}-6?;;6Ttvú96+Lмa-߆mcx4T;mvڵ'tx~8Y#O^[-㨪悫^;a6XA<(),ȫۤFkJÜ&/& }O?rvumcTZXX,Cx˱l)Lb}ٓ׳b-v5h^mgaSkgFQdaD_}ayF|E״yC(h^)ˇh y Q4O0qPKyͿ76u[N:V̰iOh>TP@@r4iѼŒ@ ߧ*o;ȪɋSi>*fg(?4uvt$7>61U>}E)ͳ;m/4dG?> QET@|3`<tý_Yxvjx4jSj  @(B((/J!4ϗIg;"?=33??UwӼby@ZjB9d3tw4qIYKt iz[O)~XaO癃Vť:vBjHWنBl ӼjyC7p4 @(bV y'Hht[y<ۼ5d>1adW Q}(HXh~ico;HCCm)";wewp"Vmbgm ͧ?(I8{Y}^4&+wuVWl@h%P R Q_0>U`KiՀJ6| s1pyӂ#,V?sK+_|դFAP @(JyA1xڔJa܈@3|LJhn??pWAd)Vh~mRKWh'vwyFd'B^y1sQ/ 6 4ÙWŚW*P Th~hJЅ _ l=8??,> ̾OY˻~bmis] y\Kv"6}m+>ѐX:Ǧv2P ħ@MՔSAL "=K1ݸ5,XFl+mwi]|r(oX0 Bok;#U4_G!'(@ Uiw[s"llכu8Ŗc3ERۼE6(s@v2P ħh^ &W&!Q9kR |2|Mkim>r$rj8@wy[Ƙ k2{jQ&4{/!C(@l Ѽ |lA nw`~\RlDE,(@H/mv\`*i#FH#C&l >Q`]*R*UZeP=*H!HDh~st4~\qzzP(\<Q:sOU$BuهHqTWhv"Fd=|d4 @(bTh~cWG?K{Gܸr_}w 7yeMehq^~qN2!oȱνu떌e1y5:S 1b$ƫ;(5+dWi>g;??g^t)f< eͫ{, Vw y^B:E=Zub(LߕcC`WP%C>@"P @yra6U󛯒 h/]yCÓُ>xp={ݐzKڼ1>R?G-cdN3f:#'ä^Nv ( ;.ʉZy<;C\yZ,ۖ y?t9-AAw(~ 4WƓgqWizs|Da&;_][;=֙sù|^F ߷mm Ӎ*?dRxzV,",;ĔlU&$4+$\Ԯeakv#o )btB09l2 \e?t5E(:t| 2iÖMWG!Â^${{=qt+mGS/%2f%4o0l!8US`]'RK 2[)'sIJDs;t`5EU ߗ P@-&6nj:W=͏ON=dRxc:iGm;[ w:>U(h޶"xtaS?([~5^Dnyn|6n%j'~BSkHOuuҼctϿ|QC0'dGki%Ews*-95,Xk&yuGm-J *YZ<yyP4_$XмU][ʋ̵ѧOcxڥ$g}ϵ'y,Y|Uk_'v#S(@|U״Zk@ۨ/& }O?rvumcTZXX, f35r; Q2mvrg"aW4jcV5V4I/|a%5s=[ŞOΞ 'nd ǵ bhBpҼJ^ձG9+c< @*)h4O[.-\\, FЕ z=i#y^ͫ;^4L4,co/Xngr;tp7&F|/qr1flq[i>p؛/YzR<((tFxŷ FF%7P2+*ݰh yPD hrw2e8OqG&k%/ߎ3rʭ֖4_4_g*S4_U=z=+H hrG,,)ת[34Ϩ]keATN2ċ84 @P4;__n6N@_\繗}?o;HD嵟?m50nQ(%6Ɯ0`Cs#t5"smJ;'|AzP7 rӼ\oʰHD)W@[r_ݼG44VcC:R4_۝t,bÖ ,u'ɩmAW+'4sAu*T,>mP;(Pe@UD&׭m>cEPFqu:vkM ~Im曗<,Ҫ((|*y,7;1Q@*hvtiCyydWGǚ &伒*孪UK[xwd=z2J| D_/u"@<ۨy~O|.#:a~bV#0w$!UrR {QHFz0FJ46DGP @("@h~t͹<32O|@y`A2WL! jCŒ QU= >>!UV 4T^dW4ƶH uM Of?l=:7wib-wf6tpۿF ['e sNXO ;ry-sv1sY^eW5B)O!W6ot47Q(;|jkb8_Qrt.;nDih5h>V9:3YZZEƕSK$A(P SHG,mE&yFE־|q#Ĺ$Lz8r3[L/gP ò.w6L}Uc|P ]a ]xŮ?7tvѮ-kI+2VVz DhI7qTChͦ{Jg߉GvK[Uu* D)S Yu>t׀|K3Qx_iXCfxA[5S{ xhqGcON}ҵxulr)$h>{;h$k34M# T5 S۵ 3foỹkԢvEǙ^7[~^p1Ƶy;.}i4v'3|_h1h<@)Qmo-Vh^upa1M6 64~\@lLFIb浄!]++^İ!5@4qm3Fnm&T*N@qY/y1gri3h!>kNS-JO xxְU'N$:3HyҨ1"AbS4l_L7!'yϜM9X`M$YV$Y4QW(PC ky6/i#cC-9_ ~gG5tT%*75,J);:v$+H%ji3 ¹ȓ,j!"B(6yoCc9dBF'>iCOc{_0?1MUmyzd&6AX2 a8վƩjաeK 0Qf]j< )OMyC؜{, Vw yE,`.^~*Mj+9@(@#+O!͇4Wng(?49+=~J闎=ЧYϏEe1a&z{4nJ!{ }s7+l+PW.ޣmyTbsB0*>m;[ w:>U(y]ӹbXK=Zӆyڰ&dG&KEI}7kkh#rKl4LDª(`z x*靤sA]{)6F "*}BW4;6iw$i ys Q4F% R@s%1fL^|~s}FjWD@z-{^V%:#-)WE&Ч6_шCb(`W4&ctWe1=|Z ڜysP`5ǘ`gr6Χ @ <癅>WmO~آ)R4L)d^a+K7ZX*r)UcÉm>V]n> U|ʁ1(ADd0 Obwo#ݞW8HjLмZB|~"[4sXR<oȱν*yc Z W6X2 Y*G4-Nv7<th>AcZ cj=!JQQzy`^l|DqP JCҼ <|@y`A2ϻh޼|AΓTc(wf-m٩++H (PQaf5,(P $I#D7mh^zu4_5#kGUZK iyRcO[ё2C$$wݙd !ZMؗm@!Y'c0bV8V@I( @(ҡh`a^igv}٠g430S]m;Zz(lvXF&Zd`>ڹ9\CI7͇9O>sVZgepe1^sY9ZnY,~?P @ZP&h~1i~ޞ^_"'MuƧ?ypVB/u8~Pxiעvk6>iO#%Y]}Dvn?+Ch"l6J5ΧP~See>6;Ns)Dkk:@(@WfHQF'͟xi~qçyo>>-Os 6A`Ms8@\W{8E$Sٻ`qdkuZ5m.-.a_d*{bMէ'P @FS A|l(6ա/& }O?rvumcTZXX, {2D5ZM^͋%3Տ(iV4_m<:ͳ]`i(20/⾰ UiJ=t)+WDʘBtG:a9" yno <<zu4_q,@WK,4_*A(P Ѓ=Jm9j\ ksTW 4Za@C(P4Yo! 4Z 櫥t NA?4|ͮ74_`NAA)MjT!!P@S46Mݶ* Cwʦ6ͳLl]RE!pYьc6/jʥ ]ᝂ P @8Hϒm4ϧӆh@ͫg4v1 9ֹӴZ67i6fEɶsrZR!Cc-:\zv gq^L"(\(MhU Y@B7>W=\9dY.-<̑h$9jzPOaWMxM_N S4uU:vW $*HmX!P+a{hjyCÓُ>xp={pylaGumC9|kџx\â;r[휵շ%qs#^C?z`I0ifSH묧QXt4/<8|]벩LڣP @Q&hjִa6 ҼmkcH~um}<[g yn88H]: k~ӺFHmm=:ߴ&?8Of՜rcϬRqXyW 'cAP @(Kn6l{˵NvPGP @(jJhv h6ot47Q(;|jkb8_cGINРjyFTf/hlɐ @(h^m~6,h^%*i1*כW]#kk5> mwulAՠP+yA<h ~끡?X kyjg8izU=XwzznH ]~}nnT*>}J+Һ:??r'U1N]?yH67ӺB#RcC:R4_'U;.|%UQM(@@*M׀n ͇ͫW*TBs[ƴ7w c.u5[6{lܫ塪l( @(^мO6͛@FA P 6@I6`tYU`=3lAŸkf{y]ܡwy<2x]v1kokO+G[{щ칠~Eh~4 fMU6 3GjJPT @T4oޱ1K4ρ^M%y_6ƙMwOػ'.Nueh}ţ4a kllYo":"7]y-! ;)n2vw7%t[^xYᾬ8^ 8X!oQX[[ӳD/^~u|C5P @(P@do Ѽu^W0B%e4?>9+=~J闎=ЧYϏi^t1jBB:ߦ/c[}y[wbro>Q8,M_/GrP''"A(@)<60o󛿹Wy^Wbs 0*>m;[ w:>U(h޶#cs^8 Ό6[F+:t$J _m~;ba87B˦:(E~D={={ҥK0'&@(@c*WiAKM@UeF/^_\~Gvzlggg4XVɽW):.ۏ̌vvd+8ø)/9Ux$pW՘똼kͲ5-lΑ CG:Q}"(H|in&=/n_!aY޾DGήm,J |GU, ըQjX/*"j%z𴉮RB(Ů_>77W*n HKJ3A> ^cɋRiC^ n=nm6kw g4u4z`{FQdaD_}aeGWko\-ȵaE&8FL(h>~<<-//FWΏߺT"WGU`P  @(R 9Hm^N[#7V/Ll:pu\꺶e~mn}[~5=QzSALKR~n~.\0445mWox~B]'M:+V)k/}@)Ƣyٔf;.u]mn~hP68r]͚U3?y_:x&L=\!gq-rfm%7X1eɩ 6# {^Uj7 ʴEpa*G)>ʹ%֢Axu@4o4 ֓W<1r+w<^"뚅Ȃ?HC)/ll}hv6m^o3ssKͫ6:64ؒP>j=߾*NHMʰ˹ -h>P٢e]Mm&6Դɘa70`dZ=z+l zf Wgd/wa=U%bͫ@oyxҦ"mx'b3 t$UF>?Ul14 Ӹ9 6}nlC7I'2U+=CK ԯyU6y@UGn^(dGk;':sn8iޘxn#4os`|ouԞYY1s5b\kf|sGb_>JRK?H7$MڄeWlO$^ Fu4.$+<RE*/QN`Y@u7PFT a'g&y_׀^WbgiewO\,--nԋGisq]+l7DBdKSYBTU@(bU i_<}EI'@oɯyu4dh~|rW> {/{tסO;1yaZjuoѭ>k0\9 ܖH.W3w >p4%B(> _YL-͛|ݣJ|%0g OܶP~ mnݡS79͛T~KI8P @(|ׯ_+J72E m첺:??ώtvvo; r$hyʛQhsd}a״9O?c}-6?;; ñ渊;D~,η Br-{\ج?!4(:"@(Q46OזЫ* N<(F| @($h^QHPQgP @(P $GN]N, ZsSi~Po)YmK3: ~Dk4繗WaI>P?(B| yIf#MR)͒|+r]M45j{x+8xDۖd ?Yʹe1Lmi| ]q+kd=ĂZyStM1QOB WDi~ZoދK6?j8ۨyÑ`bK·X)w>]T+ìf!K^n` rfV}P6VyE'wsg qnJmjc rj11ܖ}Q_fɭ> l bq*CxHuOk( 6_ZEh^zQGU] =}Gu}4VZR49IDzv7wup%P,(mf%+lhAZhD7m&׌-^4QÏtq>R;'3W4/F޶}K;) ?X k(T Ao'7Ckh1Pvtf'Ȳ78\ZZy#l?1Hy;ͻ3^t(Ӕ]2Ā0uW9Z*G>f)E LɅ!Kujgu1vsO|ʫm..>A h޳=U{D =.@Jfz׾ȭ@fg(?4g9+=~J闎=ЧYϏi#͇ypޏ˽|A )@ Yg0ZUE=- T@4߮ۤ6o,݇Gkڜ˯kAQGm!GOܶP~ mnݡS&fMvO{V5Ԟs 붣;8,VZoQUӽiFoVN,g͇<= @(@umD޼+_Jߠ/n1WJ//.y#;=ۇb󳳳YܳEjTƴ;ɒr<;/9U-WTl-+ZFLX2/<5S߇m^ P c y6繗}?o;HO嵟ձ_MbX,·=*ӪF-+Fwv cij[*h]PWP @('E7UѼ!/KEI}wuR AJkvH &kU*9L<^Aϔy"K(h @*hvml{ay4_#~-r!]~e7%4Ec6 Ĩh>F1P 4yp4?sN7y&S4N[ @b4?veYu{||# \15 Sӕ5א֮yGkP Ӽ>۸izu4oP H|B=_9>L*=-P ԊyU6.F+y/"s<) DYh@`y"O(jSh~lC4ςe4fh6}x +3h!sy%2ϲQ4_|c7Z ]h~gCE S HGy-6 iHݻ@iOr|&4^piuq6ͫQ%4?q[m>F "(sWTHKi޿Pnي_|*Sy(ЈUL}UNd@=(O-l]Ԝmt|l ]yg\22;|ӥq/3<-iBJibeB֡Nắ#h)+8Ɇ?XKmF]hxKgyMCѼaKGtL tyڰUn-@:F91m灅ia"u%0U6&u 7+8ׯ 0ZP ԑI8$E]>4 @( $K䈒v7^;4}-@y54]͇!~G9&h>j @(@=) [뼶r&[Jmޓoi~k}R揺M̥Uh`)^4K7K\Ot4_o=B(@m) ͟˯S͆ {{yƾ4^Q^~q(EXoF"jӨ n(Gi΂7\@W]rR q"J6kͳkuh. P @U qg6yMxOaW4P@;1K:*Olr|~ l! h*.OV+Hhj,(Hh67&lAT(Wjٖijʴ5jn(Uм g[b1gfgA!ͫ̄ Uvk7txe^aAe*/S0DW'8F h>v\KM]O|.#:a~b֭[7 v7]乖;q*, Wp:ͅP}|4?0ͫ6O(;eop3G~cNϵv{ݳz&4,4~EQ4;o3gic7S`g(?4qH|E!S< h>~/&w THG1gMf#յϿo97]4FE ی<2_b3j3{k=n$1l"DéG4޾Mev%sr6JP DV4;O/m,U|e)!K/g{{=qt+mGS/IԭOgO>9wf;>Eqd"̵|J6\B|u6V_@ *onu&Iɩg_W Ot]>Ȓ|~l,Opy:C٭Ddw%8+<@1 mCT4ȭ.yP6rws//~w4k?5^+͇9 O~ඝ_xos*$+Tj4.\h2q=sOcʗ*6on8 xfQGqСIWzJ"=uh^͟˭ycdY*i^(d47~dvq[l~vvV޼袢1y-TiçZ~/6ӼewD:8frvܞ^38֫JOgh>zU~ Sa0 @S4= W6ot47Q(;|jkb8n;\@P @(*Qh~mmmyyeq4?pF˗|_ l=8??|[}Җ}g>/O/]?yq|4_ɀV 6"< #"b/0E!NͧB(P@<&Cygf._}u¥/Ν?yWJh yr"(OO_%P @( Bde^YYYZH d_͍\reѣq 7S7@EU4ڮEàP* 4_phӧyoc }ML( N(P@JMCOU4UW3T+Ph^ @(F|i^z u|*ƽҼN^?[jS?h><ǖr* X| i k] =}Gu}4Vi,nV4c=$O|)惵1h>F1-+kc/5h>)ߚ]繗WygQ6O(;eop3G~c.oGrR¨WU* Zmj@*O!W6Phx0gn?gѹ.Om޸ ?_dc} ,'f>eߊfs'a^/kiӲaZ%(Z9JӋC еX h{uPͧUBn^(dGk;':sn8i^j߶]a ws˨4ou7]CyZ6qy mbK| |w>@| SHYZc430S]m;Zz(lv؃ #]\/9jG̴g%rwmWg) 4,)5ܐ @(И $E37JK ri)rweMkC[ͅIZ7?>9+=~J闎=ЧYϏ{̩lCSŇ03nzXG2>EHlnC :y8ۼ͇9R4ҎE g'JmKo>C~!lxnѨo^wH7 KJk]7n 8$QA@usP Բ<\Ƹ=mEձ_MbX,Ǵ{lkKu4_[Dm 3!P T@dҭӆP4_ͳ]`i(20/⾰+Hv@ia @(*6)'X jG.rO$(83 }cxڤeMd*JMv,UR4_]<͂5'ª[R|&i @h%P R4_U8E-9U  (W *P @R4BWmg4BS+P4_xH P>h4٘6kgG?4ؒז6h9L+Vh: ՅP @S4_mg6|l'>iCOc{_0?1MUm=-93uުѶj3?֯ q@5v h>HZݹr- uP @h>4zp3<|@y`A2{Ѽ"sEbBмꮮFjCxNADdPh4MC:l ' }6{,2MM4mMhg2$6-VQS(Qy<-@u2@uQ&h>4zs|Da&;_][;=֙sù|>{q<m!Gwa:Ǽmތ'1l"8ֳm% ?umAu:(T @S4_mg3{ hg`KKKv>QOp\4/XߙOu⾞M Sh "Kм U'P @ <zu`cY0z?pKuӎ,ycyOیs 4_mţ?6|HPh>vu.w.æ>o65k3 O~ඝ_xos*y{yyUmGU:ul(c0:!N(@dJ>t @( U4 ;Ji^Xg47~dvq[l~vv6F2vR0qiBh͕űeZ8|MՒ6r:}|t @)O!WgK}BqS]]X,y_o -U@wwwKA&LP ԨyE4RO4^QiqwXz5:QZP@BR}}(,D;Hyu4π>~!e Hм"a-P 4͍o{ U]ӦA 4: 櫣3JP @*O!ͫOɀv%h>Q(P FмR'gԜ6hH cYA(@*6͓ Qi61"4&GP4A4$P @(ͧUo޼C-9Zm]ȕ酪xe+{n]PZ"y ((O<_׶yoȱν*\Zݎki&^ii(4NB+96P2!P @@)yգ {, Vw y>ia4zDT?h"Ǟ. A(@ o9+=~J闎=ЧYϏѼ`ș>"Fd")p:_HCy@Td U@)Jla*OܶP~ mnݡSBh7|l4lq/`SoGNV 2pWXb06bм^_-yVQ8P @*O!ͫA_4ӏ+l DEP @ZU4BmRohnPw#gW6Kbq>kl@P4@uмQ%PVͧU6q/X(L4苸;}y5Bu:vAu|FP @rͧ`'X EoL|cꩻU @(H SH4ֺW4_]@(@ SHmX6@iQ @(h4K;=z߽`;DQZͧ<(Ph4P^)ͫz̳.Ot$ )6ͧ6/i#cC-9ZΆׯza/ UBaC oGPb@Uyrу:O*O|.#:a~bVs-{h( lW)/@!*D4U9P @()OWbo;H$'5mPw Bpiig<@{ y־Xh^4 @mPͧfg(?4^pS3u?h>n IT1ͦؼ3>-9:Kci{VО,(:P@xi~3u}iktso4}y~QO?1t.7HAmVO {|ix'wwì5VY\ق 3LܾGhwN~<fppzӌ_z-G/ٯ_|,gZgu4'1 q5/8Ohy0"U_nuVm@ 4xiɧq,K мAh~|rW> {/{tסO;1yku,Dɱ4" nQ4"p>@ѵs̵p7;iD+@L{.;_g񮋓yXd/?ڽM)Ӳqq"@Uu|5U$Kn||m=KT4Mw͇Ƨ?ypVB/uO 4Ofw^gyXh,ۼ ;߼Of<F݆˽\bxwd`A;W7]tm/s<;x%q^\I lh;EHxibjy_=mA*//.y#;=ۇb󳳳44[s^Eo^u6i v֜Y7^~{gOb\LJ 7T'()mϷ4sۼJ7xHv3OE!m|$מpI R CFW4/`sn@4O9^'7~&Ü/& }O?rvumcTZXX,h>L!( cinz?)ێM7z'ǝ\powLTa_tm?:;LVhίe3~t..̔Uou5~#Odҩh>^g3*SCEmw4z{FQdaD_}aͫc@vag`Mq6e;s^M8u'W ZՄ8Nu8`nB&֤Um^Cϊx樤t,M"WoG,X=2 h^]$ f7G:-=v@(@2 ]o];[#?seѹAwo([RP״ױĖwPfqs _@gY{*UL2"b!P @]|4l_RY*=l*i^<oȱν*y%G\iVJI lq@5zhǠZP @(P' y6 c&u͓mYKK+?s;xp={ ֱfLrl-]$|Nʷtfk=+,k<݁n9cW*h>}}A(@5K^Wz_:0g7NJi^6kcH~um}<[g <-Mh?Oό،L^6¾FiYVUĊX[7R4w7j'Qଔ E~P @(xi'o |`&6z)wO\,--nԋGim;[ w:>U(yOtr8Oe7]mc)ޱ&?.!H 4J" uh>fOoIPh^d47~dvq[l~vv6յRiaaXyElUм=I @(Ps D&N7ˆD'0U:.ŗyjگ 6lۨyE:lŽ`i(2ɓE־޼!:V4`W *P ԪI4/54L4OVyeWOU'X :QR4?@ DEP @ZU gCldK@CyeC絟AzA2PGz4A|#Q@"4 آČƨ6i~kh^m^Q?!T@7n U @(Z"n%6ƆΘ!5ٱ4ڿׅݣ fPGhXͧW&(xWܾzm_пyն@yz%ճz= @(W O6?'hP @W _7fK>Cjײvxb/Ζ̽q@5}trP @(P $BYaS3 vǟP(p6oy~mPw Bpiig<@{ H"k h 5P @ZR A'9RDy9q&bYyc.:m|da~`ޣss75s%Wȳ쵱Lv$wz3s? nYbxdӯee7֓6+el%ڝTAc @(T*t+YwH]y*BGQC#1*>]ABd'ڴ3׿w {biiTWvێ֧^ {/{tסO;1WLoJi^H"0Vǭodp4 w#?(RȤ[ ?p(7_?y¡_t7z r#_LMUh:~CSŇhMH!@"4w \'W[5^Qq/X(L4苸/}Ct+#ef)]M{ӷ:s5S{]q>PH΁k? 7.y/tO3962ԴۦWӦm끡'|@k"2 uzВ8҂G뎴ΰ @T Y_f,XH,? {/{tסO;11 yɴ)͕NAyDB+ل]L ; AaJ2PJyEs8'm[/-#^C&ب%D#HzisdB?Pm`_M/m~1kZUi|>`4?04>U|Ƀv~ͭ;t|Pk do6|g7@;iʰ<ke7 u@2t8JmkhÜtuLJӼAu[֊\Vo HĒ.pd$PL Mxw/恚Uyc<|Cl6tT'i^8ϬzYu3N4XߎcyU. O묞^1G^vω;78~x&JSӫ yT2@~YпGQַ7*XSpb\2m5Ӹuc^ #'rP fgK<Ks+w/xw4_޾DGήm,J |O1_@wn6Ks>;SL\ΘEx#g|ExwtgYq{ [q.ȲߢmSD+O^Y RhC2!y\|]Ѽs=&t|g\?T,LDhOgymHm0 ֜'^͐+B UweR@$|wwF8$ 7 KTAZycJ8zxy9]Ryۭ#ۊP W ~/7?ZA0@Qs#^=mT=YE݉lS:OPbZck^2SC4.v5@dҭw?;2z:D7"^i^<[qMq-9ZفuiĸI&5;^FP @(PO D&݊h~ʱ/ {ml0ɯxx̹\>DUƶe]s7~y]l<^6mÂD2/¶2DG)4FP@p(?qm~KQ[#m̮/!F==cXZZ:Օݶp94/8{h^m0#(ogcYz6>+\C@dҭ6oW<6,XԳ|@+_:Cvdc>?6i,ZPY %E NHO%ZI(d'yfQ$@66m>L0*>m;[ w:>U(Dywm:Z/:".6@[p(C#q0#%T|()MP3cNOnj,Yo+@ D&Jl_-,<y_4ӏ#>'=kQ}iѪbxw?kpq/Ӏ hH]KrY*EIkL6J @ $BO<S N_h矅vY1#^=mR'Bdq/X(L$1}7m(UQ|ŎVN3wn0!,Z/FA4[X\xDcZO;:uևjv棝!HW 2Vi󙿚^bt?PF6+W6Ou'MzPzkLBi WU,݈-X"s?A|H DPz D&Jh~]{a6D{ّX4HGd T(WjyHe̩@AeT&͇a S4 $@dҭKs+w/x ""^i^m^Q?!T4_Q2vԡ<ջB&m~ 3 6Tg=K,]>-|kӆ=Q( @U D&݊h7}wyz#mH@7_*F /h5vEی)iE=-ˁa.q9fz\!H稊hlOx;+XE@*?T\Y+sE{$cEPԝ6e nV8$ ҁ'M:R I1Ý^t^U Uy-Dv!(t+y'ۼ &kJv c^ 9R9{dXʼ+a2q]ZW^4ZO |q;ZѺ߀*"(Jм+++ lyoȱν*\z 'i^9/rf 3"DW4];P @(p>h>4z`3<|@y`A2$G[}B?hG)O!ͫ^ACÓُ>xp={ z/kh? 8Eي VzV yL+;;#5h1P @U SH/쵱Lv$wz3s?{ϫ(!;_QYi7m)hseQ[^6ŽFmq­Hu_A:$T @(jX| i-_9JYg>Auy:P Ԁ|%0c|T'nJ(6B.2m6eN7 v8n$d+ 4C(@ SH1 ,͟xi~qçyo>-o,8Mp7PtlPγf-4#Iq{Ϫ|%4%qgPͧc7:(>յRiaaX<P+N_ DEP @ZU4BW=Ľ`i(20/⾰UױyW *P Ԫ|l끡V46_K@*MXUE9 @(W4BO~XP R|x @(P SHm,Bݟh@U+4@Td U@)yՃM\F\dž[r޵B%c 0Urj8 4 A|ww%qccA(U4Bmx'bײvoOxy+#c+Vɞ))]ͧDAbe'F(;@)yգ {, Vw yޛ棱r4/V@Zh5Tzjͧk0(|l ' }6{B nmL}L':CaKGŚF}>{ml0ɯxx̹\>D"37F"Ǜ9όn֖1tQ{mެ'1l"l @i1h{mP @Ln,y׾j4+ͳ^hg`KKKv>QOp4o{y[׋V|W]w13?J/xT0IX݈F@(@b $E74ak6?>9+=~J闎=ЧYϏWNPKlη4j_)K& ;˻ P HA1c*٨Vi^^ÙW^mj:~yLiJ^LwR^>ޱ@(Ү@b4r:ѼnmkeZgFQdaD_}a~,LM7?etBY<]VdJ]ڌOʱR h\K;y68`'X {V(Yr 簬ú >ьӭ^mzB-4wYGUx &uAq-̰P%zW`gn9 @Q )]3y&NOhi Ҽp Ϸ4Aϙ6ERӭ=L58)E{Bkż}xL+_gAAߡh`; [y4'ͫ7ǯh> |oi ޙFewOwø;^yO!/lX5 9B(n;&osNOER@<[oHpa1M6KmeҼn O󎉹^4U:h>l P):?qQw@qҼj|2gri3h.` M4?=-qӆ;jĴf=Vh1JzڰE_7B(ODiօoSI1=ĖwPx%z\*̌$,먀w}̮4VW#2h>ӆzAwn-iCOc{_0?1MUmlѹ#h^D4NjUƿh]ti=ҫ0 I"|:A(P $Grk_5'|4z2<|@y`A26GP(͋\G'3NU( @(Zh_׺<*_Ga݇|<׾Qxͮ7/|da~`ޣss75O4/Q :wDG5dIV4d wGYʊ/'?+OIN:3=z5[&MsWX#9B(@)͗6FW׻omyՃ& 3ّy艷Μ4/Xp&4`5 trU|`y@wM60}dr}bxmGmx慶ӳ {X҈?Z> %Uxǣ#rP @FU 9ym cik~5K:3{ihg`KKKv>QO/3s01 QN|Ͼ#'wŷ8X4k5qyZp[M0CD|R_W3|}j @R4_(E@RE~Xh^ c4?>9+=~J闎=ЧYϏxh:P4ȸnrL,ݥLR-ő>W?h^ @(@ic&癿Mho^'BYӦ`h|l%{[w Oͽ: .'\d+ Nv^,Xn0B1aLVKšP-_@;P ԾF%B(@-+ >qfr׵]ݶo.Ic7:(>յRiaaXic?)dKLiŨh>F1P 4|rl+w/zh^8$OÈכQUQ- @мU#P @JH<9՛廴%<W6O*H S8J(m% S&YsqrS7k6 |m9 c@@(Dм<;⮬O-\iwWy"uOo#Ծ\4_}Q"P ItonuaoSJ YԐh P @ZS qg6i^ڢmϏo\$OU=YuR Uƿ>uEk֗-P D|6Krk:_Bۼ &<[2)-?z~=|r3eBE{.NuE[_ P 4iF_5h yoȱν*4>_H=|̲(O?yh 8yv7ĭP @e U+<+- {, Vw y^Bd<^j0q N`.y1i~mmmyyeq4?pF˗|_ l=H_~v/nw^[bt\mn%@U3,~{tnӆ8~5܈'V|Ԕ<3x? s8iAͳN\8jBuB (#4X:_Mx;8JO/ %c4Oc<%<7W|9KՅ 8w]| "onŝ+P @(Py%4?rK3ϯth!ᗚ"gMf#յϿo974TV߼}wMܢyM,6"1)z䠧B23ܷS;rm呿x*rk;==M .-\\\\XX$hhndȕ+==G oWQ[ PHoӾQlAiCyݶK7_K+ͳ^430S]m;Zz(lvXB|Pnws)&g#DMbV>4\,K4:w׾~vg KwW[k*_3.\ '/@(i|}/j HKDKōKd'ϭ&@HSϾ~أ}ڑ%ظɊl\n%\pqܟ O4AFASW}ݠu@V#Rn95(߼"O(@;)sMSDO7d * SɀM4iZo%2w,w][I#GHCSŇgGUIFQGk~\T)|JAI=@*"@(@(4@6&_IayuW//.y#;=ۇb󳳳N}٭{.|ߵ-cNHñjg.Ҽ,Xm>lqz~PtqG1:,dEp z8&#\@*:yB(@*Nmٰy>u4_7&mRohnPw#gW6K%Hk=扊ZR.FAb @(*N7k@2jIм#.Qiq_xefJ7߫*rp ͫ u@;_J3'|:m!\˭QkP2mj P 1ӼoV'|4e KSQjfbpg5bA(@+ &w"jC[}o` {?l i2Oz=u~u>QZT 5(mZ FP v"I͓6 6yqc|Bu DurP @S 4cOזl| ,8+VE3Ah~:Pp'毗n(o=hR's;4^1716Z!+/"\@NP @(yc%E>UY^ͫym^'wU`&{W,ۨ/;y "/ъ# dͧ(\wxh~isdiaJHe֛@󜏥_HR(>&63d CkP'7\KC(@C(N_[$ׁ>]46@_=/11iVIa2mc)g:̔Dc҇g|\נ4WP @ZW 4."g@2/174O>~":aDwCgls5#U[ Ɣz^p jg^P @(1Ҽo>gb@_=.Ӽai޿ROMWAt  @(*R 4>_麶!|ha7G͋K=vzq8/VtME!qkh>.P @wXh~zikrziXJ_^֛OER@kh>&@(@\ DKlC!4/l TY |A(@-+NAy_@2`~WgV 54_=C(@ DF9UfOӲ|d|JP DjP @(@;i48=m0@)EUP@1m^y<_Ł2aMz"t(OGףP @(q*mrOc>ʯ}(je2mU,EŨ@kh>FP Իͭs55Omzi3aibwݐ ͟>:ydӟwѯv'柸[$x|_"\@uߨ:P ĭ@;i,4?C44&K##<^<|@#ّ|nl\M'nn0A1X YDkP("Iyo2: MH{yC_gGGrcS/\-\K3}?_3_23'%RGB q"0B)Fkh>c̓P @rp'5fӚ6ӦkW$O ?3;{ƍ~iH]'r56#QQWü?#xW+Pyp G)P u DE_ʳ[K!kyߦl̮/rOLN]'_\\,+a?y i(^B疧Ww|gYa=؋`˭?u e p + d @;i|4΁>u4mթ$@!NwE~zff~~͛'?6icN0sۼk8]y7Kx"ٯRkh>%}f@(@ DFcDZ |*i^_N73bDDnݢ p4/̋uZn4K?4#^}_#q~!`"\@"P 41nySH5 t>7`=Ͻ,7 EiF)yT=sΆyk62ǚ#4볉^^7pGHJ*754XCP @_"Ie[?zrUͳKձ_r%'fbqE8 Ay'(\wҘi^7ϧf4qJlvI WU VuB"\@ YC(@)N#͓ I |&oͷ=JLV=귾#<90u6Uz;Pdp 'U( @(jRwh~V7&54ٕ) '@59P)( W 54PŅ {< ^Ɏsc]e4L>iUk:dU"\@IvʆP @S 4F@~mz;8?q|Zm Ύ& ק_(Li&Оa[Od߆eߊ`ي 5?ZZ-*^/v`92UPcוr/G`ąP @+NO&@?H?\^ml:6?tuʵ+Wsd'qF_u|K-`2jillfNt'ilqB%yBC jۋ6[6z`SIPן |]8**N_$׀>U4bv鶁_ ܨ5mz8^f3Z3NX?W4ou@0[x}vtmM*KjwU@Pf@ͻeI`ʼn#{MvnAjwʃP @V 4n,_M-:g7ڿoz!3tYgfo޼j~c^4ovwAh^{ۼu8'GIBмׄ` }x-x7P _eFšP ~"IM6ۤwB٫KgK{*= LX${<<u;U(x<F4A;^4n0`aE/FI-cBAm&/쵔4O Z%)=㩒#B*b((u"Ic=S')/{83_ޙ b0rL@$!!b &<36cccƋɶ,YYwkn-^/^'S]]]]UWRݪ>u9uSoujtbELy Io>{n[;f`14oLW 䚬w]Aɖ]Ov#aP @( h8&NϽ;B ̆d4_G4/}*h> yEK#4A4j? @(R3i4+oM_/TjLG[OͧSaP 4A8ER(0ΤmA(@:+L?ٶwadQM$:j_a Q6Ys;L1fc27t4oAnP @( h8&Ngz`rLH~3-D׮^c먑\=雧s+dⲒJGѫ/\ޥxo}-RE9ŗ0 O||P h8@^;U?4ryq،4qK@7r<|sU>k>0TY]FhjFo2Ŝ4o1Q($P @( 5[;xa8~(vU:j7 _Wb7/Ξ.>80oP?a`hO~zZ8 ^{d ~loѳHwKkB?)vG!BM_F$.˫RPG1Di Qvj8>M}d3iG}>>{ʑ[7p~F4n6HNuL ny}󭝽~K\.dKk: >lƋ"?"hSF~HП.tpO FP'e{WK =,1Q@څH(hA)T叒@cU Qd3i4s]s'jN6 :Ufu60hvpgWMC@%ۆ{6yZcs ;G }>ߔX=ah^ P+q芗d AܬJ~Y-2q` K%]L#q3Z7BCym\[E(9i@z6P @ W@Ù4q'#N 67 _6TG~l|`8CSrT+ܺҼ[;_c J9e|].-!ˤe`-;$*  ch^/P @ gRh>׃4MhAX^LqsWRCc7_ZQ5:6vO$Ok92CQ++#XXd,lE"lSvzJGa!`giA$J*M]("{T !,-&ĘFQ[$P @3i4o {:&u:\m.3iC4ā>54ot4_USQ:_\.W4/i=]*ˀ=ze?Bhw 4 dˣ_`-U --G.,'ҵAh"{,5 te мn##(|4I /].NJ,nu7j)XNDЧ &9j;NĄ|мA-kl>Tp|IP h8&N_<2u|ީi3 Ѽ)y;mkt=$щ C`H 4]ts4(P )_ys|rbRcƱH{k Ds63g||Q͠D&S@ 7Y@uP 4I?g)_m4/;![nO"\DŽi} h -0B 'hވ@P @( h8&NϾdMd#ͯ1 }BM hh|u;=0ӳ)Q*(HΤsnr[Ư2#‘ 4Qo<]мA:"[(`Oм <P Cp&Ձ_=|U2fIyv!u4oo>j}`6y]֠y[,0ӺEQ8(HΤzҼMGWG߼?ƸH9ʷvtYm}!X]}Cwr߼gAΒegg ŗ⫄K򋙰oxNHKP B,B=|M7 ch-J@(> h8LЛx58קkEͷvvX-vrȏ\-ѼaFb *^vI MBz9 ޿S寴^-X)0MP)(Ц342-Чm}Ni>Bkla(AG'7.B3/,v]@. +}+ ch~w @(d h8Bn~3oif=/N/ӆeoH9_~GxM;ni@ P į3N4π4/}9j;NĄ|D*PLVGP@?4Iuyz)@N6<ې7Oa!}b4~149͋B( h8IЛ`||Q΋B ch-J@(> h8˦?}Ʈ7OC.P@P@G߁P @( )L3 yEڴ_%KtT@Qd34?a>܊y3AU@7I;P dΤ6lq1&4oo>jF6)yo>9m5 kI&ɻ3%" ch>-ZP @P@ÙT_[Elq|qo#Srrw)Vse%!۷n1pK((56%O]7^KO@(HHм>777??xʜ.t7O(n UVD(*hτEP I h8'ejs|oLy=]V[}p`92:VW](c:WgggEHӆG6g"%".Xfl9H o24aA% )2A܍14MRA(@Jp&Ջٚr߼5Yww2=˜FGݓ$|kgok'<599uPXwVclHq+kXe"],.Wls^-1 bI`t{y |)T@ÙT'Dy3S<| FIcjk<'' K)v|)aX{"Ӽ"# y墳^9^wK{E5]r3p ~mo FFנ~?GO=a ͧcCLP @("4Iu9TOmۤ`Vm<{t9\L`1]0ӥP(H4Iu+ͣmi l n~zjR3}NҊѱqMxx"%tDyrίc:. <`NGTR`<];t.([mЂQ,-bޡP$Hq E0S`7P Τмk -iGb_<=z9_i8rY1c7_USQ:_\.WWϼ:ex <v)/٪lE(r-gFXZa ͧupP @(\4IuF.5ЋTuu6C|^h~B=O|'b! WKbXvǰ隘x^ݞh4oPC9뮀4{+ C(\4IuKuKnL&͇╺e=JGFwktCkH мFP Q gR}h~bcی]1' @.Ց{^`<}T3:鯀143 G(X4IuylZ?'X\#jPMF|%*a ͯĎ:C(@4IUB /v,y 7:nGQ ch^GP dΤԅ*{9C}içO8#N ݮ[%Ĭ8IZڍ14FP p&Տ=6g&'|%<z"Mo'7O3)Vse%!_>m.۟Vvc!7FKGP @()i2fyzo=䛧 z2rϏ\2u2yBvd}>}`6"ݒi1h9 @(C gR|=dЛmً`y*<@ Oo|kgOgr7D|gboh 3⯡G /eW  L7Yzy|72 AX pORh@iْ(P F gR}i{MEW[ƯDCih$[;{;,^; ]ɖh48oXGa 2%E @&DBMUA ~N¥H_iZ$0E2: ch>[P @}p&ՙC;m&z4O6c7>y4WXJ56аs M 3+փZƸKqx:ya UeA9]B@cli@fP $34c*'M<&p CLr/* 㙙/$Ӽ %߼DC 8Uz!&MH7}@P v4IA\Յfl4reۤ7_ZQ5:6vO$ODΑi^BLx2tl)(xo^Y,- ՃJR_UP @p h8̥e%мݝj8ʓq\ӼS*x5"ڰW4w6'xFV܅v{"|]8\XKb)a ͧc(H?4IAi uK G/f Vu3-0ӢP(H4I |ynfӆhZ3X?)$ Zzp"0ӽQQ>(HΤȾ 䞯e )$ $14 @(L3)h>*͟eybr hh߼?z4A7Ji3^4_kHm=ρ>@SQ͑e|i{Q3(a ͛Q(I gRh~f]JU @oy$мѾ.X9r _x9l"yb[14P@R@ÙToE7(imxq4otyBvd}>}`4ot) chLuP @p&՝QSP @p&i#1V]OspǼi|󭝽~K\.dKkkd'.;K3,P  zXȒLڋxwBٮj(; .J1rע5Gwfda gFӢP @(4IA:<M>B^[vP7PMC@$ۆ{6yZcs ;G }>ߔX=i^-]3o}7ȞcxLrEY!|d<(;yiP$Hព;0Ӳ%Q((HΤy4fѼ]|QIy=̼q E2*+];dzOh^~!#:#%`[5ek@)k- @(O gR]h~^GSfθyYXy<3!8O7K4_ZQ5:6vO$Ok92!2RD o fEi^>^o^Y,-/QĢ)h@ P hS@ÙT'H0>4OI,,,ѯku!Uw"=O3Q|NPN k oi4?Mq,҆[h&Q ?.4^7~"\4A]Ps(Q@ÙT7O*SX7y.-M֐Ϟ(?ѧ`iޙXhR7c $Y ch>mA(@:+L4OyHa!O͓~l(OA qN16Xty6~jhN6|} ͈DRJEݝ h@&P hU@ÙT?K͇R{5OI͓vgv2\~qYIye|J3ƅQr;ۆbXE_I-14z * p&P'F}I]S~KE ۭutYZ=hW"4ot;') ch>Im@(@&(L d6曧`2i#M&_rrr ya߲g,5#A4/Nu}O-^1Mܼ[;{>sdt!ʻ`n(:u yHi?>;g#Nw!V Tq/X>yw(Ub(rP,B0xTF ch^' P A gRi1=h^"_CF@([;{;,^; ].տ5"| ̾2Wx_"rlC%aɂgy9JAQp,1rwyyU VԢa ͯB(@d4Iy"tQ n6B%c|<>'L K)v|)aX{"Wc(+Bkb ^WM&YIBW54T̲ X* ! V֨a ͯ.B(@D4I*1tN@6S5Чp9TG~l|GrI:D.; ;{Ǿ?+k =!|)4AtoT @(3^4_m'b@yMyNI'XjIU+a gp{P @(Τ|:X6|CFBMoE+a ͯC(@ΤӼ}>=#˓qmq4ooQ ch^GP dΤ:%!҆Yh||wJE)a ͯB(@d4I.yJ,O3F=ko>jLN/.+) o^Jo⟉/ӭ8[RL} | %P @Q@ÙTog6f4i,6F.'onJgs*kӞ5( ZLh@1)DP @(2p&Ջk7/*h^}moJBܼ[;{>sdt!ʻ` n;u Clo6 M xY 9X2&BhЁA:݇*E ;R-!/j}Պ*SU({H] e0ӥP(H4Iuy?Л)X7OyC䛯a3͋6fSF+7a%O ?rMNNFyY IA1toN0?L r?E a/ߴ ۟lsd .9zل_U. AEr.|QIb_]^P @+L/YMh><6'?8Rh14%|SbDy3eP|a__נn\쾁Ak\5M.Q 5RPU~K D4Ai= @(R3n4?y3͇yVgJ*#?6>xfffc`0J wO|Pl]'Ҳt]i>#SCZdrWy @AzGA |頀34π4qϽ;.X9m ,`"m)ojtlv?H,--ѧsd$r Q@ys=(>Ph~K,gxفK %"+"h`v@"4QIa 'i(4IZS j>ިBe-guIy{:!erbJU¼xĥБ˱\|Tz 64%SI26ieϠ ^Mp^pqDR^QMb_U\P @3N4h^z}ѩϐU|1ojnXvctMLx^GnO 6ǖ3廓lU&%0L#P Τ,z23zkķ\fVjrѼѽ-wF.yù.QOHql R@ÙT7\"Lo7ޥn/.2U톛׊6yq4yf#1J chި@P @( h8EuKdaҹ.d*4m3v (r*a ͧosdP @(t4IeS/vسX1)͓M^.ؤR h@fP ĩ3.4\7(м`yC' ]mA64<({Xa'W7/IRdaIw}T20ӽQQ>(H~oܸ>x`EE9 180oN¨ߚx݇6yns,]XSbV[WkTG@i(U>.HmHd*5F# chlP @gR\΄ǏP>94S {*c33U$g}œ6` ]d6oo鵓K@~增Zƨ6F@l?J/twvGϲ$-P>%-3Ze|q7H+G-@9cIj@iږ(P B~&z333r82}J+gOSh+cT2/Ja#ijjjT"E{( FjTBQT S7M=P dLJyHa!חx`9 Ʋ|9D9~T)n},PMCFaNQy; ȏ]H]10s/غ.EJJJ:^y~= F/xv*4'׃/!T@T/!"(r9yQeGF7pr0DP LJQ% 'pxŢo>ɽlڐҟ^o;wp4-0}nX^BE /7+fd6o>ijtlvuZCYEFM$ ԃaYAqʲ"^ q6/ GvmO|x`_YN!F~CA%A, Yi4Ajb @( UICx8>4OaXilP&?q݇Ol=mǒ4o LΟik"98BV.XY| |UMGyY|q\Ҽ,\,B&%xޔq=w*Eȟ:RW棸 (j0d!Q: s ch>]B(@*Ϥn^4?1wa"繇G ļ8{zx~n kOXa;Fy< F)a2ڵIDc騜曚[,v:]%ݞ04wPٓX]qi4AKPa(?Ǿ.XFNyc^l={l6swJ cޡ0*?uڡdkͯ^SM#_G; h$;h>Qu^ @(0C+Ͻ;sb^<О~'_Wy}iK^K_cޏ2aTlc3G̪D׬R+^}dih`P`*zPTWWS藉]T @(^ [΄h~Jenn/楷Y?[Hums[|]8b[ !=9^|jAa7՜ CVYYIn,P @(@To` F횽L3X"4cb$i&}T12778P @(013zk|R}6ibݽwvw'=ŊGͳy\n=?߼):*P @*#?ʛclUsd}s7ܼ+헨4Os L̟n)O5*]ퟡ|܄`cYCdP @("+3ix|9P)7?D6JX4C'MaP @(P 9 2S/vt iNЫaGFF6o {gsc{{M3TK|P @(W rS/o8w\o<鼌m۶ދP/mvzuyswYBi&:C P%(P @ Www\V2G^ bI煼n rWj!XBEgxFP @(r"22Ӽ y  2+P "м UP @(` |~ i旯68/IP @( H4O6BiuQ "eJS{, P @(P? ^yetCP @(+Pza*{T:MoRHsyO} K6:}W2AQ(P @Ͽ1ajqx Dho{B4_7'&3P @(x{)`36}q,(dF2BG4={mRA/ UP @(XQ F `gG gZHIP @(0>|~ٙQ2׀Id'Џ4OXρ^yyr3g4<4poəM9&mDP @(V7?|EFv ,6~`19Bx~\f~ouƑS 9\srP @(0CųmVEs|c>9>Wjs*f c<=*˖V6fEYn}<{y駳ML/w sM 4'P @(paRqHIoOsؿ{;o_߻{7lꫯ|o9O7=* P @(h7)&` |3}l՚oo7Qn_(VlyBz=K6Wn7IwF5P @(`^JIٯ鶿wfp}B2 6zi> imw߼;7*'6۷o7_τIP’' ߨT.T͍/mY)]fhzsǞEnɆhrrj&,TN*-Y. WgBUR9Tfӷ S/o蟸={hfSA+鼀B(@&)w`xbҥ7*'ʬ*͛=˗3arRi̪u=sv~~ʕ+P9Tfӷ ӯޱʦfs2pZ=wRuJ2onRdhB(0]sfoRʬ_CL yTZ*j](~H2]4?y}[\;#=:˿5㨈:A($O],\FyreB]!4ov6A,e/XgҠB(02Ţ|33s쩬$O,/,ÑDSMcD[ݛ,BB-Օ⛯蛅o^[7VP @( RhՉ Y˔kYӯzNQi#g\nJ4g6ZN'5hpM{L47hdBP @(@l p]NF=%dtcYY[m󩓉/62ӣS,B9>ߨw{iU`M<ŝJo sg{|¥ OIpn%X6 P @(Gf4s뿾eQyWNx4}ӹ~w7J;6x[x9:Z _؟&wYcm 4OiY)<<'#G?업pkچmx! KO9҆jA- R?9L6"|Gby 6x VA(Т)%64KԢ_~ҼiC*mH0ٱ-{AiP,7Q[b&"qJ̓  @(a u_nlM#Y)fϳ y/҆T4<p}8| sO5_Kd)Ve>Jc/}5yEN@ R7Vh)Z6i"KPX\A6yFcd P@'/7:g4[pki)wocCG~qG~ռ#!62c^l߭zxMͶpw?cc?5YYkW"K yuDyꛧjPIyFn2 ]7i^G#S1߼A@(U"#놦/ٳ[(#ged_nkFLx=ee=oԿg kOXPڷ ${ du!|ܧjDO?&kb 'hqTeRJRFydRQⒷRi#4R۬ oyny]bdP@D9yGU 4k_ܴJ旖\z?[XY/'| Ŀo{v&=Qiü*dEso=G҇f7]Ŷʚ&-]= osH#iC??8b3((h~y7SJ{2gёU;tQKx>ojjtX;wZ4替GΖp]xƌK @(U"mL1*m'$p|DπJoKy@BNR~dץ]" ݽwvwG=Z"_<>sαPyMBid;2UB#sz7XGP @(QĥL1*mdʜE_כo49 bǦ/VIRhs<ٹ.w 4o̰\P ġyL1*mY:xsLi~hq꟭7K4ݍ?],p+py|?l @(0@]}GF 7*'ʬ͛GFF]홰P9Tfպ9;?pʕx:%驜TZ*ۅW vt銞rTehշ&F%n;w3{}R!Ͽa,P @8XwVFRUk{m۶mllݒ JKeV˩EhvyBRM.#ޥ2K!'kV15 " 8Z$P @(`}WߨTb_Tu9UPDyoTN* i'-Y|Dŝ޳mqJ7pc4߼C3P @(0B-v Z=+楸y2y#:P @(0X:-F7?\gj3TX|aJP @(0Dz ۽j2P @(GN],LN6rj+e4|ijA(P @)K4o%:OY;`P @(P ~41uiHo|gz9 @(P 0Xn)h y<i~{qclP @(~ l57N///AkȞ~qf~lџF_=k7賿zWz7'_x{Gg?yAq/@%NJNw1٣gF}稛Q}kL ;EP(|覟=O?CIҗo|g_|; HdžwN5Ogym7u? %z+ 4.ӷ42mlKNoKQ̳DofCs/ޟEe%-SY bl،\鮀(5id *W֨['Rݘ)Ҋ?{JWw~n<% ۅ.a. &%_2{ioKkV˱p&&PӗF3wd. 4+3P+u@' '>;˴IIDATP /\ol$>v >#t`O0 (:p!C,2D-JǚJ&Ĭ}|twcrLtFFZ{MƮ&0YuorLZaucr ۺ:h[X;ۖ2k:݃T،5oLkSj5!gdbs/ 2H= uՊ~g EĜmltLv;]vWacH~KrVLf$l'su-CޞYÎe {0 $H>3l#PNv٩dI+U>'S'fғ^>ed>}lvhrY,t.NtO_ο:+RF)|i\r.v.42u|%>x^\'b_Io/y-zC:0[ޒ ;e)g(6YءfgլcsM{"LUΜW q,n5Xb[0IIjHW)6WٯbB=)fe ד>;SF&Ҋ?{{h?S!=w{puU6^::B6zyuc%%yglpo0llIaCKmx)m)g/zPUJ0*IQTvowRdS%V,* MM;F6>uG6B[xQ1֋ZF'ڄt]jUNqTe2(14&5)oeCpxNVZyٶVW~+*1}tuB_& [FNڏU.+l׵tgMN4ʭh9;}r9uTo?Pmo_@Ŗ>_evZjہJ㜺G=uYcuCyOQ/\٤2%AGqz<'s놏Ut}UزTG ?{'{?l>-ڶ}gߧO>~nv(:Xl_ؽ{N5>ݼt㮓 OY Ñ IUl=7ejw;ͯ_{/~|E|˰6 bӉ扄 l!J@?]7CH! fҁ>4y*^s@ Zhޏ.JOW^#R׮r4OyvTF@OF4πm'F!꟫e4ci,t1;mW'pOW г$] PT~ >%"sa?.E$6inDV%^1y[y  ZFN:NT9CٶwfUo;X/yoѻϼ+O{>;^HΜ='h*;Ė[=\2Y%|󎝀^p*ϻ=;{_%=hE^UrbyC{7i=@C7W΀~Z`^rn.薣ER>t. i/{[3u^k |4F2:dEDO]r֐q?2zadXe2-j{zr8V@/ϑï+zBy0B ۿ(h[к7eOOKN調PO"U؎ j=yá64~AT=>4|i(F qR;<۾ym_ܷ9ն0848Z!⑎1PEz.:+@icoˡ|4OW&GO 9{s_ASe{u'{mo[?޺ӿ~]=~f_^#%9%#}r8g9Pb>t/Q>ҍnk9\j9x}Y62r߶Y v4,|Hmҕ=&} aΟ^($B*S894J ),,P3@ 5v׬Zsͪ[pv?\{}Zͪ]o60Aο0Ԕ6,W2exɎ[3}ko_wwiW_%iݶ$4ZIENDB`mondrian-3.11.0.1-R/doc/images/code_wrapping.png000066400000000000000000004105451261646570300213250ustar00rootroot00000000000000PNG  IHDRb6ot pHYsodsRGBgAMA a cHRMz&u0`:pQ<yIDATx^\I.wgݽݽ{n\̛|w;~f Nr*ewS<{Wk6tF#L䣳Ȋy̻=f_X2~\,?do\zLl\Bd/nS|W^y~(*f4|____?#ӭ.'lw %8lc՞H}m!;Cw8Y8.ỏᖮn{k\B-Cv:ow >p+p$@>pu%0;|\C0=t\AAH79g|H~2о~Ǎ`߈'wlF YyXkz'a=+-=wr[a|GosYiyfsMe|d 6дM|vm:4u㡩MphF'o88ik_oj1GXVG`vݒ].f7,^/b/ol޶2)ߟ9[?nd 4p&M5~o; ߞIޜ͉7&l|}mxm܆WǮ^1k_뀗Ǭ^k:jcpd+c׿>nz2oMoLo$w;efta flp涏gotΎ| ,\`]_r,wz7-[e{Xn `8Xёe{\nWXjrlOfr$=?,Rd%i`;j1YvJi`3jH$ſ82fXv ߎ^d6#?$T0YM(*K- K,[bb`7w}5_v~ <mR-06|4QATSTֻSߙl6U"*w%>8ڌl^m"u/#*OO+  ? Ï "9a}_)N@nwD1b_Eshd&+1-%ޚ@^= 1CIטaX%._A5\p&2Wr ]!,K"~ ?nVB6oL#i6u`SLoMy|y]OD#7'N@E^Sͯߤ~4^SJ #?~ޱ?U# ϣu_F:Xc723yr',h ^G%ۏ.d,ގ84Ӣ-[wm%ۜns^݅芝 n ,Ֆk,=!űn/a芀>"6 m}ElEUMs~:%WW)CWwWWWWWy߽ \ˑ Bޥ %ޅǼSEMۼ/?pk naallbnez);“AwӇ焞mq*1ts."{ܢG[yDY{DxDzF0z ;֞Q8םkѰ.%/p k6{"XpD.)>0#Hq*пA%Fg,ѷN7yؼѻSޞlȨ'y>ᄞy>YWW ch$9=gKؼb#4?h'sx&c*Q?> ؼ+1\nY}Gw^7w ›[ڢ/.8u"Dd赓O8Hĸ˔v"DDctĥ"ܺƽ7;ol6AG@^"1 y%ϱy$7'3; 7$yM nj_j_j_j_Ը9Ժ9Թ9Ի949l:m>ͦMn؊Gl6C2$%PPPP|ԡCQܣqAe7tUNu|0kyyM@sDpKDpkdЅȠȀˑW"*p=:@drd!EW{~n5 o{}E^kޱ6^'mOxŀ*h}.H 7>3HRmc}oCiD9(%$ 8@GC|)01 ! xS~2`q 8aߓ 8(4A?BH8gy15p6\9w8rHma8; 4,`-Gt4a~$`a.e;]nsMg;1q\`` nwy,-nNێ.h|3?>eʆpօ0Xn{~\jWX뛅K2¶e{[J]e85/ kxNobS ( –7`wXiؼ__If-cۇ3?" _ZA?y]_-Uǭ9<~ݑIL\o7~qY{`jUF?v1L8eLSfns\皻6sa2yLSYfGƎ3L]cso$f-`H3؉rYN82̅24qm,2r\쁙 %m`Ȝu*T`d^ w _J[>!^p\ˮk ;w)w%jߵ0?-;aӖ7|,] >Ŀ)Ŀ>R^n}em8n6}w?]@aAxQ}q8v,&7&?6mSY?N|8R}ޑg3;?xDcK;g;߉4,RYHwT_S!xbUf!sYlIз`& bȕ 밗;M79ve:( ܓ&luF=4fM8_BO~H/ѯfWh'B/z?>]FNϜE~W H/c昆~7= h cW ^7Гy~F|4Bz7c>.-^03ɜǼU`K9@;+-]Go>K ӓ?$*"vw&C}.ܷxR,Xܷn.Omg qI)ϲxe>},sYf2d,ĭlcy}E %V+q/ӿ-+㜟WGGy6K=:={ KM)q .Z===?:? Y;T?HxwF|ap$(189cPcpCPHDyG]"Ds^ <)~̙NA.vžɌ<8G$'D*PG0'慝rl5lˢh'+0.30.'<ߐy!tGup|#Sc2h+ +<'(1̹*%I=! N0NhX4X!T0l88p/7ܣó1Hѡ^k.>k|o8`dP]o<w]Aa3ā\fNvS7aEDg]MM,wɘk8~\SS%{0=% :|r?/v7(VP|w1_vfl2K{ɱ廐|syfxBmlqcG' *[]l^oӇR%D{@l(m8'<3<#36BɁz{^saD{^E-L:KmXF'rtؾan'y͋64,'dfa xF ̅e6\X 9ۈa\XiBu:,{^X1 &B,j6%'6 =9Гy~0l:,߂ c y&@keHxЯ6#6pyFˍ\nuՍ^ujcz|e΢*Y4/v%H,j,kcdBϼnc^,҆Pc"pe.7 BObAU bj,r/yPy~VKb%^A]E} 7癅ރCp̋ 楄qn@'|^~P`6Ӕgv0Ma4{iN&&@qq5T8Hd<=.${iN9n$o7Mqk56钿(k{w_x0Oִ5 u=[</v/K^^]^Ff:*8dHKp!.G& "[dᦸ5 -ؘܖw?F?_ßEeGeF98$=o,?zcv^ӄZI]û6^rQ)%G)N+I+=Yv*ZZs$M"Ʀ㒲St/=V|l!RLH@EDEa$\89! y?s,&+*hǠC~ >V'wEownz$pAL  nfbPƃ_mg^_+_}K=>`Kw`tR 8/xmn̏pm 6_3GosuʮS 'm&on7~!Ϊq`7~&C~ZJv2Rf2bOgohξ9~+pO.m" ǰa G> f`1u T6x5o˱;X޼{N%=nwn4yd8lukN{[_eb`z\hoz_:~*=~+-]/x5As.r f{< *vF,}Yboo`E\wB2{ n\ ~d4ټF3:,`&xJy^$sB7, b| o8MVHR+8Uo#yŁ^Jmm{۰oLۨ^,lڀ4 죌oa󢅞ۨMЌo#̈FFFyC"Joa 3b@|ojWoux03FXsX{ =}#BF׍=4ۍon8BSdWZc6x~ߤDp9pzB?YNIM(VBu lX{#= t@7DI{r^7G1 c& ӣ~53vSVoXaeF 7ܴ"kӊBOo}6{*7.'&;&#:¡M1z՟}eys+l6->v\w? qlzi|veb^ur~ujamZq]Fi}fʱ19GLi̫lʫh 0=Ó9e 9e.*,98Oo?E,BFq]z9 q'cFOg3< 9ȧRd^\G,I-^ڳ8r#݋xmR6"=_s& JNe2F,ygҬ~xqCJTc UYQVy$4x\OL[DS|!9w'nWn;]q4z{Σ1;]O!51>!| C6^k~e}m~?_/`Á@쬶[c;;`x^R ؤAL>b,|}Lo7wlxluj6=oB!4LMHMT /ǩ';<~́K~m6 ~㉸݈ɯ]_-Șv 0ewi6|c%>b`Zz({Cj74;aj`؆Ck`z{|nsm9:uN Ym`}a`@=H}cC}CH&vHذ/`-Gg8MHpv,ul >X_nu\&puC [0xÁ0YjqlN0X-c׏v7o¤ێdam(ՂKWj,~|<zor1z|aq.vsB?y0z"pn? =?zpsz [Pul^Yսn w6N 6/z zį\(B`+ =c,ʍ =z0ЫуL1n6/>_r}~7E~Ήo9;߾;߾;gXLq wNKp!.G& }|5̓7ŭIUPY|O{~qv4߿rq^<<¼¼xYnfU&5&& -MZ-MZ&HB\L2Drv㦸5  /l}g`O$aB=m}/ظ6}_eNgWu7&y\,bs*π 3[u>sume9_3=]p1b?`BZKk[kkc1酑^oK1өBlk NƱQkΎW!z zz?ઢF'ص9mV%@AƂ؍z/F/$V[ӿ*e- *÷võNXr KipҐCFl+r7f6`ZxL~mbNu|V%8}DrQSy^љΡv)S[yqO.[]Nlqit$l]!p(H1Ha#Lم 5]?t}"X_cu Z7&5C 1<}K.ul6E"ܛX JMo}]Y,m&Xk'Ͱ0GpAYc w6 {R7l 3th?.Mh'> xa^Ǝ'L"M#6 ^cjjjkʂ1p SX1Heo鰪l^tmtmznWYJfUބŷBz6"WoCAN}NXzNjV?t;$ j6<`%7fk߆9SF] X)X\Xy8߆AYyUbbJIy1 ..ƈq҈86JFR~CVjۧ6yiDC ͣmΈWzG\JK`!T/z`܍- B7B| ny^ЃPs7zrǩdBo7>*~ m8!=z5Wxeر-?q$@2$%0W>{Y!CdݩmfWc@{J~gw0r?Ď!n?3IdN&k7y)MoJ'S6`=}gq q .̤'}lyؽĭ[hۼDw?J*J. 8]u2{7e'祉sxs]zo}˟gVzw0G< )S jJ*kZJS昶k/׶tk騣m]ok ڦƋՍ4)/Mſ8D۪Ƌ *q'ߍ?s .xUc zJ_>OWSB *B9%Z^0=I+c[݈|mzߑeulRZz%u ZP^W8^%,=l~esnESvYczq?sNG- N,=u4"9<>Ǔ%<~'~gO^؝n1[#7xЍB llr$1 FHFpeix8.jvn`vGl:rix$&g#p3M0Q p(xwÆ;RK_z/b517?l`ke {ee.a`v0tg}:{+H ( lqi < Af Zx6s]wXv8|8 2t(lHC|4q1qwG摛ox0قw>FP=l"nx8.yo P 4ϾvGa`Lp3O 6 gR(3|`o/ .ErZ oBi)̇6~^-\cRB/.&0TkYOJ:1T-d1)e|]*Y|Ƿ@B5ۨzm4fĊ>Ol$Sր*aQB{J XhT<P8ET>+NíXp (kӖ8ֳ5mkg/ͭ@bgü]\Zw2GoS!֒κ =bMŌc``d(RbyzzcSeSv5R #M/X{epx~wc'{,X E_e ʭRU.m)ncxVfq¹Cziԋ|*+ 8BR/ N,9rp`ҁ㉶m8ed7!ƃM`G7o2mh|t,sy[=fmY,s|ٞVk`fykl@fC&vd kh #CifG:юc-[" ݸ?r Z?tݡMC7El<9=1pihM"T1ǎM)nGiSՎ$L,a89_"l̗:>+_ȯmSϞ}}W4;3t TpɐB\L2DȜMqk56iWlS xdyvA/6nk9{77n=hE k|~F.}4 >cSq f~_fKgÅ[9*/m]K1Ao_zS;yFkWEPsfo;=|[gt>0Bi}='ʓ _Mtj/gQ䞏t{aOkc$/L;Cvd8Ķ'7+Ov4~?>|FImNgWeV&,x\\Y.iN&q>}p?%b+yۅ$ xd ٠} ؑm~ѓۏlsm1.tfj LdTAױ@Y7`:d}K,5f *[7>٢2" oyD`|c࣏8yCX*Ż?LS,D?8'|4gGj#coe+bY1wGE;-E %6Az_m:tuzig%Ên?<㏯=bϱ#TS)}&R} &® [c1O0F>*Dp9?<ش׵p;(?<ۀ6Ǘa*&#۬55 <͎,JBr  ^Ia9R%[YJWы^BzrJ 3Nxat'BpsuF7z3n9S;3olYf/]pڰj#Hĸrd!Enᦸ0+`|{xȂ=-"hxKxcYȣ-{qU^f%W?4˴?LȲ<67:\r|&0{_Q\X:Q4.xpC;yT84vJYTItx:QE ׇiӖ fMgf~2s)'U1/M%.c^x,l8/bO?7-3v^>gٜ+.y"D]K-mB!:MLa}%ęi;y݈Xy1 ixՠ& fnh)6徟Vs)*F lN7qo%<`G &> w.Gs%;0âx.m:iBʍGdCIܭwB.L^nB[]ޘ|hD`ybnh&b%A vcZu!,:qBR79L3raxe vx*dQnJw,Bs(O, 0+%y]3bX|XR~hHѝ96,Bϫķa6Z"l1,bF,#Wm5VψU+է>ruXfTE<Я}n4W>XjÙfO4=F+-_2ϫpB=M"W2MzzZ]a9gyx~=m9B"|,, Bt ša+.7{ha Rz ="- jiВ!Kf-tfԲ1gZ1#~Ō3WNRWWOPnjՄ3RWg&όӟyr" _:+t`^>?[9$?S+fǭ?;`٩ fgzvY@񚙀@f53X-Z4<=.Y!Cdq Mqk56An+o}Q.6l ] śxAϮUyܼz}QP֦7VV23͂O/mȩh*m- wzƧ.x wڋҚ.<*?hc].ʜ^z lL^_:NoԱs0'g|@IMhn!zaSoKj ^0iMvq~g/0N ЍJj1A)e ㎝jX$VcT_=ũGa?WZ?Ϋ$j? 4_ZVTHs}=s}NdEXC 4$j9G $ A^, cTEy" "P?{\ P`^mu3`KwvĤ,1ˏIʼn\@;ǝ ,s6wpv|aÆe951m&"z:¢ k'df܈]{pjtxҦ# Oq*W R '0f " K;LߙnQ,f͏˱p} l3z-i0OdOc #DqƢQ3 BmbUw®b&,Jx6`px E<0~Lڄ /)eXB?ϔͅ5Sz0wyL,_bX!szT֓lu^ۜn6wrハ/MVZGk}[?`m}7 d8a^˳曣7Ĭ_qYe %35Zj,di&aIN !1.<d -2-p#758V,)6bw9 jp/燇jhhlhp D?T?TTx |+r늪^S< O q92AV"s7poL`^eb{w E?mxxt خտFgq)뉾ӹe2MEJ*kȯl*m Ozzc3[$ԴcS_sb?虝h,u(֊pxЏM$ σ|X/W\\zB8I1m3j 0>(9u8&OkJ8:Nwq*~/G7{ l,vج֖&798M9GT~E)i8d{mKxqG~QezǺfֱkia*NAvOمؔp1CߍEa=wbp[(źB .""l: C%cǏ<;-Fg9΢E@=235iTfJ:_ǙqnS'#X w+± !m8=f1kP', .b f 4aӱGs` wBK,\~xϷYD'\KrR1`Xo7i ~o`3LM Bd2c٩uf`Aq4ZV12u(CaM 41sŖ"EvO 8G}zwq/(6OuP3 30$V| فO 8h1`8:U{;*`f߸նl/%h/ Hv!-ʖfJ,O40^]%_jmɸ>)]BtKa /!^xb*L_лYXA}K\1`#oBszsfd2 xP X,k: ioeX~yVGy ʳȄH hh(*B0n%\d(`* Z$8 DAvqCKV_ø*"cyW/ȫ^°;_ WAޱq/hL)F(0!QDm q!wDՍhg3THc'<5j _Oh'u}Fk` }>ՁA{c]|OPcꌬ+-xu[LJY;=5氾3jf6`0PXeT#<A8L3j ްG]yZ]~37R0xlrQ?Έ6֋dakH"* zawN-^LV] [ ؘA:b~~LGZNy zGFNӌſ8Lڈ4,!ֻ'ù,bюZxvN1f438`@NANaDX [`z_T"A绥M=T=a!f)=--σ3{+lo0f{ |jhxfЁzaqb:ev3<iL FhҸJ_.xf7,ўU*I5K͡u0G&_&&8]AAEp .2a8deOIv*4 BņjxՍz_d*xh v)W-@Pgw~:w:OJ?(ACA ;#>S>Πg}rr<-0{G E5D=]Wd,l<9o#@зاK+a1 0|ݏϡlAyh*v3!:`R\i`;FatcvWюWˈ/塿RaրYkͶl;_IihNKUƇF8)t pM6 0c0?ln/`}![p6| Km+ƿyKS|i[/O{:Wg0=ÎHĸrd!/S]Op ZznW&j4O|ﭣ۷ǜhJk;єp%D+pvˉѝ@NdH̯Y!CdK'FnZ~4x7׫=ld{D{$zE۫__|?fU\f#^uNtZ*jRRI}fYSVYcvyo({y#±g9+:5u2J,Whbk91->_Mۂj@4)yHNaE'B.u9"1%`v([!%I^y OX6>bA<k|Fqm)*&6?yIZ֋-AA'sϼ4&m\'%zf쒬Fx5ғ9էj Ν-ҊS,TĶX8VZDiLɯjAT YDUY/(5@fY[tetq+g*@ͳP l_3 i0i5:DϞL+;ev9KΖD)K. NG; ;}|<Mu\b'OaW.pڂG° B#$]:u\1GɯfIXψKJD(4`)V|ZT̎e [Kxh^&.H0VZ]˯A@ {™~( p,5E) fǂ;s{92CY/|c`h0=2ղٙ|]rW!B yQȀ^LC qG<ՈGe!|" 6e/bR#`E Er @^V6ac(5`Rq =Tͨe$!z6BP#пAlP(p0ࠡ%D|0=+}c? h,4AC)ZmLg2`#&x @}66Boq4jQ h}A_HX5 $8 ;|A8nvl숻H-k;F4ndCG)HX659I|p1\)ć\vA|];>)VɅ/3L:.5G- 1$2LhJ Y I&? b]W8ŃAQ;1Oخ>SyT 8U*1rj c跕pF L\)qt  `zt+00'2RÀ Zsm<@xH\cP ,P챢z6,X%q*X. f` PȰJ*k,VW$`mufA :`u? FCnVjR-[ou `(fy+ۉ]n,=NZzNYySV0=&n'Kwn -ok,=Vd<֣D o,kw?p'QegK ؤ@OOzPtw Ow ŢQg H9pЍXsAJ-O$($A"芰pFn Y];"\X 0Acs |@LTi38Cj PUZ !Z6 c2l/PqP@a>̆GL%>0&ayH^\p(\.wc "񕲳%.\9XWqqoHL6×%6% WZ3݉ eQT ˷ApV4]q>.TW=j=^Z(ۃ0^FH /9BXeW,V^uKRP,!Ś%@"lAju<"l8.h&@=Ӏ]0D0uDVt/.-ѓ[6vnnX8qx;`bz`׮OD_zq%%RO;`CXITGS !xc440 p pW%"!O@XCg C% pO8nQY;Gt6Dg u}2OƉ8vJ |O!6C\AoGʳ_ $/S|!BG$ %xKMq]Kwl޽[|?h])iy4J["k̂ϭ'qKӜ)n:[ڜVޒ^ޚQіY fUeѶ55ۊrf)˛ʚJϧ4S ꀤs@ߗΝW$2@ȹ\@>rq9lhA %RD?Ǔʀ@ hGq؂bB_BOsOJK I23"BVKO#DfHQ+3kY}GLV:ϝP{"~E7/7JhU"Ai-]ڢeCUtw?gJ[5EgT5-QўUE5Pu1bV%b'"fRUZYkZiْM)EM) '4$Ж1P䢦B*g :Tب@SR!tA|ĻM%(hL(hoh# G iˣcscsOԝnɮɪΪ8Q^Z 9S|:0Tu# c> eqe^޴_2SeJOŔp'⣄.'E2D1D;8u9hLR D .v*,( ۅۅ5p(4PH9sH}PP"(;0bt#A_.tr8Rg\%!^ Ju$Tz%Tz'Ti' |J$V#}dM%"_)5@rBI5I5~J'U&UKTObAPNi >Ex&@UP;ǩrSe;Rңjr y+-r"8Fr8D@8F pͶ94AY3EdM|TS{(t r cJ klɨW\ )dg&?J_Ԁ}DR|.B|. +UxVp="C\j'*^ĖRj:z\rW:PvSUt(d֣B*:^m=3+E'$H sDŚp,&Dq 8E8#ELGcjq=YF:-w#`OpN<8*<qe xi |$8]~t J Lu{&Z ,\xڹ: ".2#*>*>:Aĉٍ;RH!" QAzMdzsQh@V]q2#m<@\^M"  9NDbQsВXu$= E-ŷM]JZn@'5/oMFHGNy *E7;w3\Q$8GU/BhRp(nZ$jqӵ" qJ8"EAs5/eU]ʨBz lP}"gT-dt镚,K\.=bG\Jhg;8؞Z~,Pv Giۙ3R88.2ӶRIfۤXv--5Takla؂yJDFQ"rZ"n"χ:u>4),!M!M@i i‘&B!H`G H?S96mpL_ 7cu>IHQ;t =NW# . )M@t?@ԠQy/()0T |Z10N?R 0&,q * ޜRH(3d9Y61E1$h hKQ)Aa\dj.h@ NR3IjAR)ua L{ V<r<EZ:j\>.yϾ{/en{/`e_%NĶ|}PrXqb~,mw,CB])Jqv#4CA#Wr0"ȩ( d0^+hR|5W2`! A5$ . "<<,ug;bKǻR+YMVu%?WZs% 3@ewJE+)WT]M*$W^Pq-R$l[y5;+XQ\ ' /,Ė:/N:Aލެ ⮓ٽr[r5p`G)+1WNERvEkCTA'Gd~*XW.5 q1(r#"oG)Jĕ]/Pqt*Gշ4\}WJgjniA3 GVǹ۩sGd( b*AScjNjfb%j T"_:%^=%)jݨ}_h- r[ki¨%Ԍ!YmZa AJPz7l(;e?Fq*̻/Eb ֮ɳq:.ݭ T^{{onY++.>@tJy􍱝o4g!lA}ag1<}yTo@zK ˅[+n'-g/<{fQ9+TRH|n=0U6LBH'sI͔Mnlìeg.&:ե(lH H4)vALP0TB^_tePHERvt^^һ_e@Yd 5 k`k$ҍ/<N^yk3KpA'Cׯ[7avT+*}k ]RwM5 k@րYd x4#,-6S2|ו[ 6PyOoF]NIݎ?S'VրYd 5 k@y%-Ep6?T3`s{-9ZlkbyT2U. k@րYd x40WT!,p†nWo=Cs /_0[?om_WրYd 5k` [,C6?s+s]`6_w=&CWȞ6~s%5 k@րYd Znw˶5 k@րYy 7a97O)U|zei;y(Pyb:ߟoW,s;;;SSӍC!io5 )A e5 k@ր'H#{LŰͷv<[v1rFugfmś]Ͽ 6_zGD x12 =\66GtC!)^-%dpr)d 5 kH,LJo߄;4'%:cc㎎?I!fl)A C.Yd  _itYmmAy_l~Um*.gVwepT>n;Jo~o̓F~R&>'%jy`| ņW yЛ /UրYq ,Xi 6_z[a VuNȮΩxa/k!y;~HA?|񃤽gK M5 k@o;o>pG(o Oӆ4\WW毗6_m~'WC-zI2 MX>tZv3 )QA߰$OqVYd p6_q a`gJ.`,*zڌbli }S'O[*gxM<*@/+lj~W,RE!W:]yLnˣEU |@X2-v/|*Yd ЪEn=j+bȰs晲*8\a;*Zoqo#ĪWNU=p 𡠮y 6NJ{Fx=~5I{͒ؽށjս "d 5 k@@?4xIwE~d5.4Ŵ)QݕsJ~˚l4k+!HXazn g< pS?NhU)_+|#Fwuuuv-[p!maq@gSTб@DI/\(|SӀ6]q=⤉A:d*^!\dj2ɴ>4<2lo <d x5@.ީj0lX Rgt#Oޠ6Ҧ%篖4]vwβ +R 拭FbhE-mJJ8s>O ,/Ŏ<޲Ul luyD;,A;y`{t >S0rEB@eĝ؏iiQ:|ĪO5"J5(.jUj CrG` ZI֗d|_rPkj2RYEv8.鷦\xYd 6 ,\e`m7EPLQϖUudt#HooG^};KˇZ}dګ_I'qlZlɟce))lwܩ;w},s iw圴eY "4 i K:saDSa5l;m$:Tߝ'cl:f}(PNsؖDHUR~q8me՗id6VN&k@րY}L.]SP-(AfµoyD,XWnͬh,oͬh(oyc<>ʣp)4*ݴ BJE;? )uis횚jz3\SSo_u:Zo$ތiu*KPAwSh>ly"#45$*nȳG_l_HcPL9].Iұ~˯%qJ`r򁥚H5ȒlLրYK^r;2[r O3m ݷ3k0Ok֑__WϿ~'9|:۶u\4wny$n3 oxlT%2{K8]U%FyFmt)ؼZ2 x֭rz]Ӻ JbMLG>e { f l͘A!x#vXkO#:aG'y<4e eeWxk& R5 k@ԅ:o h˫o >Vf,x]2: xڼ]n%K̭Mʣmsq3o*ÎE*F`.d6Id 504*3$~d0S.YϺ6NQ]E l~jΛ*.ީ zn^m;bn3)B1ɂ5 k =Ϯ54пq#|.u3-8xטtzX~WD{aPIW_ȩpƌ} *!pH2(9(ARF1ZPpp58Kcϸ(>E5H s"fbl~=>[\TZ3TmO)=X_,˚i/^p]`{mP]|e]%w`ڀ ]ק.K=)U䯖 e}>ir(.r G\kxGґ_(O?58K%iO`+f]˪Yf;,^muA;.?jwoͪlͬhy}ʼ}Çk[E04o՚7?m7Y~>[99DL֥6}+whyҍ z_i왺cP! v88 KQ[c O``{: L3f5\2c(E;o<(o-BgVeUs6?qؼV]~7+/ZUпyWI1 ݼ/@ Zro肭~Ox\>[='5򜈩ٺtyXAkz{j{=䍗o1 ,?_sʳ v[.tnʧ1."'N;V;^dz:v/wھi')2uʉL)?[UJT~hlK:N= <*p%/C/\e6_z&RL}em&]֗jUm?;oqK71ܓa޺jW,[rxG3YM![ֻ>y5KyV9:|4שߪr+)\o: /VaU?\4J5OEH.>U_Ϻ{/TT9 ~=|ڽFF4գZn*mQyĴAl>5l >tk퍸oo~ ͷ_p<>=H%8HiZ['9EX%fVY6nk-cɢY'ϳZRҧPx;kR뾪zPS-QrHWQbuៅ>O(K>bjQ [Jm@;ta),)mYa={ z< ytD_0׋D_iW1*-\|/%דW>CE?Qpꖋ;5Uܫ,ɛݓ=i/ؼZ杅x$\hJ.rm=:nPwኇQ#:g9n]`}y?ő*jAE^k烫z *mwbj拓ȂDŽ"a6om2J98 Ix*/b^ֳl>JzcwjcאasWltnAkEM׋ G}OgW06ym.m?~x綫[<U%A 4uv{Z`'Fyd"44fl^q l^ǕETO@qyDxʣ5qr/LH:tUv饬ا]$SSW: T=z+you4Z7> ܦ;>r~`"\6 ?thM>vչ+1[9D1HuE c^%`ϬБ-;-wll>ei 82o.vzekKٟ |?cϝRtueϮ/er?sO>6V>v,ـ#*/͞zV]Sؓyg"sH{\KV!}? µ{W6tz}(g,pvfuWvmw+u4%7#OkSKϧ?[҄֎~+wޯ|^e۽KyEGG%{jNe^G{.g?^k@!?~cYPI͂ mZfm% -?yŜ] u%)z-Ep};TUVTzvKۉpRƛToGZ)[֦8͏W1G?*.QC([:kOFX;h:@4jJT,yqϥXP={έc,<?ޟ, T5sЭv^=t'0ȥkc_&`o H.H|sGϔeėDdqLٝp 45 C1ԩ&YROҊԨzǨ{6?CӅwa?y3amZq)#3^~]ڭ†↔3 -L/_7޹sAtO;?[8{OL˂ʟfwʃ57˳^a[`}aö&yңtv4ztJnʍ *˚=uƯqV+s(JdUb, dEM#)JqZ0T(>T$eGX, EVlcmFkkޔ5N*r*~L4~v+͊砭Bî>JOFmxVϭՍ.ATĴP+GUa׮O(d쥎TzI;lowK]Coҭi_l~mdӕ1==M?R=ӆ*SWZEKFwӻ@uNUԞ}ͦP/ex*ܴ6HqG죴zۥo%^Nho\o]2֞w{j4*Bx JBN[;[m֌HYy=OF?ݶ:s8vϝ(80EfI,wD=u4OnɴP>Ȇ!)T;%+BK|7o]7pQ43olrl]gJ]Grs@ymP]5io.nK)x"h=-:gWo%%cRT|_mPw|׭kU][vnQ[-]WmsӼ9wV+KP2/ѝ%K/,㺍[`jWHKJJY~tSb9>I|jm@Sڏ16^VoӬP ے(V򘈏F"kZ9-\ !GXY ֗j} OU 5l# KER)@C~uyD1dX3ݻgkϾGy '23/!3´VU{> 5nRNX{N_fۇ?Py;d3Io#zNݍU |ž.{fά{&k S*WKv1+ݥZrxKfnO/⻫S.l6HQAk/gRs=D]Oޱ~{du{ah}%i35@`v6nͫ]&TJޛ,bο~4Ki >y%Q([<<K]/:#%J/6?v~DS4jDx͇dCIjPweZjQG}zT$ʑG6WEKf05goXA}23ʏ=c,XiVtm+EG˙}o`-^[CG^ߗ|~M*Zc:ܝ6DOKް|FVܬ[駜4/:`_OyO'`*}XA:zi1+ݥshsكY]?nӻy嗅`1%/*Z茚; ={ʯ9A" g7,Z8Hta]h/[iX 5[{kWB'dͧu 6l13ڮDfԟnno ļ -}۷ohͷ_{P|N~[Y73jnVݬ|l^%ծ3fVWl5CO:cѪx,i<[=mʲdnؼ8RYRYfUf ҉%__?(Z9N7KijkTtZK;]mL͈ 3W)yK[P h֢Fk)'ԑGjՕdPG4v͊> O fUU/<#/ڮAVSZbZotx89ccٳ[;׌M٫5}`Xp'xh>j /$}S);ʏ %ǟ3:TAL y>v͗Lu*๷hMޯO]OؼR]:RG-Os5u掝g_ zwƼ_N/fͫe UZYFnA<7q]Lz`͝'lb&VŻ< ,Wt[]_^yL_gj/%׶'ՐmO OӗնtHL'^yKko>n6xϷ\6}A_4[*or&n͙%{Y8Ӭsw{c"?BoL~LH#4t~"{,۸" :^wceA5Y;1++%W{>rէ iSEMnE+AW[t2R>CMeU,yKP^Jn%"ւڣ<>n",6 PӒZT}*}d?f beP))V120ߞ?AݩcgM)VR7_LOqC#PB^^|bÓ$$4c'6'cto{>'/='_O?J4s꾳*m?˰7Ӫo\~=z|ɵ ^[r2,۸5noUyVqoWY98귭5++]vT摾hI}a`}`( 7jp#kmCr5蹞ӸΰVzzOO=oߊ0H#RM=ìw-o2~^ϋTo.Mwz:{xnGfOzcϞ}>lp{6x,~YI/^НElxkegiJKo}툮l)S6!KߺuBl^{p=ݚw/ܭjrK~{henV%MY^2]a)3-JHo²R##:f]%6kv^CvuRwFY}]Tdzvsߚ}2~>˂R!FrB?m֒',3t9X_fگkt%@_n‚Kޱqž!?~ւMգh[yBy+6Ei-lf"dU[͎/5_b7kǺ]Z/Jߪ C龲>[m>'5򜈩ٺlg),6ӗ&9*bqi#Vy`ʈ}CA>韄_ix@!LK}a<V6^:v//8L`6oyyf36?d U!s0Ԃ I<'bj@'RonhSn\vbje{Fe|S6w|_\|4d 5 k@րYP}VY 6?}֮[iU2;j;sj)並|xu_">y6gw_+hVH|S`|_ړFրYd 5 k@)/P!y(7Ko*mE#6O1mT^ffjzoqիC.|e 5 k@@_;\]Vł+&ϓ@5:9Y4晕=Jڋ>aWiWP~d(kI<(AˍPրYHy5QUD 6y[iCTCi3T,`Ԁ9Īؼ@QD xؼ8?^ ۖA{oxJl~&ryd 5 k@`yng~y|qzu6ؔO͟NL:㽱(>dw`poV-K%_U2l\Yd xN40`l%@̓?xP8ain(柡染w,Yd 6 <1Eo~xtj[KPY ƴyxj~楶s)%K4eүUo_4(l4 uF#o޼ymlžb S.Yd lxB6/] ml]tb/h"TZ: l^!^+Ϳ5n#mb\c# A-si~z<l(A}])`{ 5 k@րgZO)_u "66M!lǛ'ywR<4qicaaqB9[kZb)dl^_#CoÌ眎?lS?O|ɼyDB/E5 k@րgZOZ?W_~PP`p5l^P<o^Hm󽹭B+ב[o0~? K yyT1c8`ee w\xYd lx6tY׭/=ܰ池Of}Ѥяd~8'r<3LMM===#""Μ9s)`{ 5 k@րgZO旬5M!2 v8uu_xzͫͫ9?7Rۛ;V>l6x|B)lr/6m~&g%k@րY'apW)Y_8{9o/\e4PlK8b<(MQրYd f]]S= lò =6/z u?ؼ6/iYϨd6V\lYd $Ǜ7.S[?%[y0'"! աDY7ze &6~i[mn =6i6\66f9gRE:ƕc?_;t\)-F(+ԓG4'/cf?6gv e{pQwUCNy:~I+_+k` 5ۛK,X/kEh-xڼ@ &ɫlX7m`,_;4ϞyWJf-6v|s 1ܤP/ſ~>^U^|;Wf6~ڤyl(E4t!2?I#|t?_409BMЏ,Д WҨ. U+Ab$O5zH^>39Yʹ//\=z0:kFg"3/-hIeR*|$1Y>|t{EV^m^pq{8iawW#{>jwhQ1V;K\CI@* ݇~׶mܷo믿΀>n'O[0*+9 Y/[[PDށ,G#D׹n7ǀ u<U.XhA󁲪hBCN}KK7Kcc׮凯^|ybO_WW7ˡyIi"c1<:{=GРAΑC* <|1+`L՜jt4m7h楗!/hC0:+ M6~ػw#GN8駟vttWҼ7/6͇|P)@o" sh>=B&t|ёT e4o<#+~18[/$[̇xBpDbIi^;h*8jm֝yiÃQ*FU#8ӰYYYe(_,.\g#CCW.\r``>9Y,ըm5fU4?/E1JX;hLZ )a?,̋gLf!=4ftwR ?jW s5C|Nr#%Bf 0_EQT-*ͯa~Zm>i O?=h93*9"鵚ٮAŠP.H(Fhj>2T }tOP@$P Ġ@R4_\"O!=|}} 4kkk+KK7Kcc׮凯^|ybO_WW7c+ӷLgcoA#7ϔP{_Ӧ\P2b8E7*v7,mǵ/aŝ6[LBiӎޖa~#Ų^576u[F1 I' gVm=i3$͇w Fvmy("푭!nۼt;r@5rʣP 4I|QAmReݣtOjatKWox|ёT e4i3CZeA<{d4+LV_2p')Qf%ԫ֚ը#=-#6{޻]z!He -XDm#yeRCs[zSs>ݫ^>_֚j:#0Y.3Oiqs=l۪r$g>ֻ;cl#yA(R AZ Z-> &4ߏ.[5Íw>U&F yUy^Vk+yq9,x˥yZy)+q4yhĩ*Crey6 @( ݦ0{{q^VAU͓y>08LUm>ŝA(@H'Wicg| q)KI@4O+TN iٺlN7MۼbWmoSVh^ @(DdiliC4ρYչM Tz4E3ӡh>V@(@R $E Q)eP9niC~DǛ~I z[S ͳW۷SukM!.bbf?k32I$Z~ST%ݯg򌞖(uh\,:JffÕICh(*yAJjB}@Id/м ƶ?i=dj0 X3bZF!ZBduIoD>h˭v!yyJ4 Adt 鰉.:RB$ ]pˁJ3> ƾV\_#|vF o~s&h^<oȱν)V=Ʈ&IWHg '"o_zng2گ:1T y}/)i -m5.ՁץT<_EHͲ mTRtU4SXsI+"ȞE. 9-ԝ|*L4olyգ|@y`A2{Ѽy//y=V3d_3m.}x:x=ĭK*|;pW3(3l4Gk'oi6ȇU*mK"<{BWѓQ&A#G& 1O==A`ws N*~ ii~͛3,~{tn^E6}|2F$nHE?_-YF;a_X1VzWx[B jTٚ?s53۫y6~0Yv>|[8E|EWK%M,497 [[߉u9G{?@%Z65;$x?VPT ܿ4 ")=m (Uln^(dGk;':sn8χy,%WN&ֽxFu1Љ8Pr0㷵ZT2'ۻ @Ormd4O2bF6{di^k3 $ː'fu ӸBmYnd{?O l6^t#Zzzyj{X7Q A9VBh^3o6m_6w {biiTWvێ֧^Y-fN u+ϼn<^ǫ;ubJȏA^іcl̷t;6W&\rѳV HlɪX'E; ]=gٰ)EvF{kMi^:j*Ѽi3HqkM h^ c4?>9+=~J闎=ЧYϏ+yrmnwyu楆 c_TT]_4\PP\RaDyi{Tѳ,Xk5td%7/ip3=|O͇L΀a#AĔ@k6yr5%;3!SZCgXZJYiYRw(6h:k O~ඝ_xosqT/s {ќhtp)6;҈Ĥ堹־iT(k:v׺ƒPK)-]E _z<+W)EQV-jҮPp3VťųJ"9P@m| =m̉nۼNdWG ˙_4ӏײvcbz}[񹷈ˈkmK~w 4P @(P $E;s ) Zûe(4z3<|@y`A2A^pм~R* bP $Ekwgׇgֳ)ֶ͗4Y 4m~N;M~d9^ l`ez?pKuӎ,yi8M y/ESh7iޑ"h^Z1w~G:0h; UP @R A-޾VM4O!M4umnaJo6fl2|T'nJ(6B!8l3Ӷno6j28`"sx+&c;!ʶ4Q{>Bh8w.UP aq[ЧׯFcwpSͫ7_4ӏ{߾WCFEeS%ֱ@(:[<浦-ցηաyգ {, Vw yޛA{&Omއ*G@EbGxVqvB S3,A U*GʚP ԭI|ik )ۓ47U)iא( 3%@(P c_ӆl&6_W=m>{ml0ɯxx̹\>D]2:{]NWgL-ȭL3j@'~FkW:.&kmL@o@6`kiy)Ry 'L3]-孺7\ㄙ糄YIVOyv^3zn;S4/ݤCެdtثdkM.2G]|4zBh^z7߽~S V6zwO\,--nԋGiOw IfrMo3~T^7cP{楳M|Й`"Ly aJU{-j8;=L[P JDi~sria4߾7lUPFSϾ~أ}ڑ%xi^qۼڎ[#D nC{U. <{?i4D{ zLdt2'>Ny @H )[i~fۙeӵj3 O~ඝ_xos*BӼϛy[ n-8 v oomƀjh_uҼk$E^#ǟa"(8wӒeмdn+SojnieTN- ƈhd6^-ֵJg'}Ћ'c,X *ނJggyql\UNQ clZ`hyi3gaHu,kh0޾DGήm,J /͇)'NS@www`0ēV^EiJ r΋!멿҇L^VEeyJZ^02yYUBd(R@4UCh~ 6[7BW=jŽ`i(20/ch>F1k"+u4SV*Sk/2Lq=G.QˠL%SVm @zU a/l- iY7޻von[xyP]]j+JP @(PI<_%4,s_WFeDI*OR} @ tlw疷xi;/9XNOV @T Qߤ͕2fa.6_XC͓m>{ml0ɯxx̹\>O3j".n,l9MR/ź[S-Q {$Ր`&ըTӼ|ٶ+Mզ̰+N&U!ח0j`m0m2oz;'G*MRq v3|K^m> >Z^ݿ/|4φ[*_(|}ݝy^j{q/ͻDlT7rOoYaN}i3>9+=~J闎=ЧYϏEmwܜ|98V %@/5BL K "L3 zh VPTqi>|DtH(ޫ5 Kjpl!Kl{x @zR )nHPQ4 vamj4_m>L0|T'nJ(6B6.kb;"M$HM|,c?іA[<-gh3B:<1uy0c%]yo>QW=͟xi~qçyo>-oJ\.|]-Kqx^y̚#-sZyɣ j4м s6v4Fjn%Ͱcl󆃐c,;{Bj*Synl+RhćMxPqHo,o*Oi:K}BqS]]X, W}@|`N`N3km$cn֌ QQf,OI+T~x ~H`gV\4o͠Ƅ3*/"HIͻŕ-D[0}n+[%f@(@B ͧo>yOh,X(E|Ր @(h~hJЅ _ l=8??_zͯ61",a͇Q qP x),ϯn2=mTw޼C-9Zz Te ,.@)T4 @(@4?Ƥ7h'bײfhIL#}_׊|VTͧ;(IҼim9H>o;HCBmn_biw Bpiig<@{ +yV4T\.h>fAP 4@ iYZÂmM2Pk8hhx0gn?gѹ{Mnn,U^ͳ'3g?N^1߀3R??X4>ZyTÑ^j߮ t{g"zon2ݞV˹YiۘV_VLbR*ox*/ R@(4yxR7oݼmwyeOC& 3ّy艷Μ4/ktK3u9Ar-4џF:CtoC|Rgqx0Z8NOAY<[("=蛓:^xT@+ol]\!Myoe死͝o-߶f'}\)<ұGw#KO~g7qz뺍͕UH\[78|yx^;Dc]@,~H=)gl2۷t!#"ދrhTʰi*3纪l@fPaHom%7to⍰M4_m>gOܶP~ mnݡSJb8߬Mesßl`+Xj>@o.)C5]j'65}iޅrCV9W).0HisKk+iS5O/& }O?rvumcTZXX,CxT uoZmP[мQkDj_z[3VˍㅩZ6zH/MyնAߡ@  QP Ǿ{Ta%߼bq>BR4aPyb~65U6:͟66}Ѽj|q[OflT3/zA cӼй%CL(Iƙ gK)3٥3af'+Jl,׿l0{ҩOxS6;Kf,ln6k={ʇ֜EZ{ЋfxlxY=7Ky~rpnK66{Cf: P @V 9}&[:mt5>1W=͏ON=dRxc:iGcj3k{z4oW )A(HKuksv0*>m;[ w:>U({h !SpwmvvӼubhE,zJ0 #> *FtwQk%IDAT^û%m枤ɡP]D0>h4~(@Ǿ,͓l5miz2?O?c}-6?;;6Ttvú96+Lмa-߆mcx4T;mvڵ'tx~8Y#O^[-㨪悫^;a6XA<(),ȫۤFkJÜ&/& }O?rvumcTZXX,Cx˱l)Lb}ٓ׳b-v5h^mgaSkgFQdaD_}ayF|E״yC(h^)ˇh y Q4O0qPKyͿ76u[N:V̰iOh>TP@@r4iѼŒ@ ߧ*o;ȪɋSi>*fg(?4uvt$7>61U>}E)ͳ;m/4dG?> QET@|3`<tý_Yxvjx4jSj  @(B((/J!4ϗIg;"?=33??UwӼby@ZjB9d3tw4qIYKt iz[O)~XaO癃Vť:vBjHWنBl ӼjyC7p4 @(bV y'Hht[y<ۼ5d>1adW Q}(HXh~ico;HCCm)";wewp"Vmbgm ͧ?(I8{Y}^4&+wuVWl@h%P R Q_0>U`KiՀJ6| s1pyӂ#,V?sK+_|դFAP @(JyA1xڔJa܈@3|LJhn??pWAd)Vh~mRKWh'vwyFd'B^y1sQ/ 6 4ÙWŚW*P Th~hJЅ _ l=8??,> ̾OY˻~bmis] y\Kv"6}m+>ѐX:Ǧv2P ħ@MՔSAL "=K1ݸ5,XFl+mwi]|r(oX0 Bok;#U4_G!'(@ Uiw[s"llכu8Ŗc3ERۼE6(s@v2P ħh^ &W&!Q9kR |2|Mkim>r$rj8@wy[Ƙ k2{jQ&4{/!C(@l Ѽ |lA nw`~\RlDE,(@H/mv\`*i#FH#C&l >Q`]*R*UZeP=*H!HDh~st4~\qzzP(\<Q:sOU$BuهHqTWhv"Fd=|d4 @(bTh~cWG?K{Gܸr_}w 7yeMehq^~qN2!oȱνu떌e1y5:S 1b$ƫ;(5+dWi>g;??g^t)f< eͫ{, Vw y^B:E=Zub(LߕcC`WP%C>@"P @yra6U󛯒 h/]yCÓُ>xp={ݐzKڼ1>R?G-cdN3f:#'ä^Nv ( ;.ʉZy<;C\yZ,ۖ y?t9-AAw(~ 4WƓgqWizs|Da&;_][;=֙sù|^F ߷mm Ӎ*?dRxzV,",;ĔlU&$4+$\Ԯeakv#o )btB09l2 \e?t5E(:t| 2iÖMWG!Â^${{=qt+mGS/%2f%4o0l!8US`]'RK 2[)'sIJDs;t`5EU ߗ P@-&6nj:W=͏ON=dRxc:iGm;[ w:>U(h޶"xtaS?([~5^Dnyn|6n%j'~BSkHOuuҼctϿ|QC0'dGki%Ews*-95,Xk&yuGm-J *YZ<yyP4_$XмU][ʋ̵ѧOcxڥ$g}ϵ'y,Y|Uk_'v#S(@|U״Zk@ۨ/& }O?rvumcTZXX, f35r; Q2mvrg"aW4jcV5V4I/|a%5s=[ŞOΞ 'nd ǵ bhBpҼJ^ձG9+c< @*)h4O[.-\\, FЕ z=i#y^ͫ;^4L4,co/Xngr;tp7&F|/qr1flq[i>p؛/YzR<((tFxŷ FF%7P2+*ݰh yPD hrw2e8OqG&k%/ߎ3rʭ֖4_4_g*S4_U=z=+H hrG,,)ת[34Ϩ]keATN2ċ84 @P4;__n6N@_\繗}?o;HD嵟?m50nQ(%6Ɯ0`Cs#t5"smJ;'|AzP7 rӼ\oʰHD)W@[r_ݼG44VcC:R4_۝t,bÖ ,u'ɩmAW+'4sAu*T,>mP;(Pe@UD&׭m>cEPFqu:vkM ~Im曗<,Ҫ((|*y,7;1Q@*hvtiCyydWGǚ &伒*孪UK[xwd=z2J| D_/u"@<ۨy~O|.#:a~bV#0w$!UrR {QHFz0FJ46DGP @("@h~t͹<32O|@y`A2WL! jCŒ QU= >>!UV 4T^dW4ƶH uM Of?l=:7wib-wf6tpۿF ['e sNXO ;ry-sv1sY^eW5B)O!W6ot47Q(;|jkb8_Qrt.;nDih5h>V9:3YZZEƕSK$A(P SHG,mE&yFE־|q#Ĺ$Lz8r3[L/gP ò.w6L}Uc|P ]a ]xŮ?7tvѮ-kI+2VVz DhI7qTChͦ{Jg߉GvK[Uu* D)S Yu>t׀|K3Qx_iXCfxA[5S{ xhqGcON}ҵxulr)$h>{;h$k34M# T5 S۵ 3foỹkԢvEǙ^7[~^p1Ƶy;.}i4v'3|_h1h<@)Qmo-Vh^upa1M6 64~\@lLFIb浄!]++^İ!5@4qm3Fnm&T*N@qY/y1gri3h!>kNS-JO xxְU'N$:3HyҨ1"AbS4l_L7!'yϜM9X`M$YV$Y4QW(PC ky6/i#cC-9_ ~gG5tT%*75,J);:v$+H%ji3 ¹ȓ,j!"B(6yoCc9dBF'>iCOc{_0?1MUmyzd&6AX2 a8վƩjաeK 0Qf]j< )OMyC؜{, Vw yE,`.^~*Mj+9@(@#+O!͇4Wng(?49+=~J闎=ЧYϏEe1a&z{4nJ!{ }s7+l+PW.ޣmyTbsB0*>m;[ w:>U(y]ӹbXK=Zӆyڰ&dG&KEI}7kkh#rKl4LDª(`z x*靤sA]{)6F "*}BW4;6iw$i ys Q4F% R@s%1fL^|~s}FjWD@z-{^V%:#-)WE&Ч6_шCb(`W4&ctWe1=|Z ڜysP`5ǘ`gr6Χ @ <癅>WmO~آ)R4L)d^a+K7ZX*r)UcÉm>V]n> U|ʁ1(ADd0 Obwo#ݞW8HjLмZB|~"[4sXR<oȱν*yc Z W6X2 Y*G4-Nv7<th>AcZ cj=!JQQzy`^l|DqP JCҼ <|@y`A2ϻh޼|AΓTc(wf-m٩++H (PQaf5,(P $I#D7mh^zu4_5#kGUZK iyRcO[ё2C$$wݙd !ZMؗm@!Y'c0bV8V@I( @(ҡh`a^igv}٠g430S]m;Zz(lvXF&Zd`>ڹ9\CI7͇9O>sVZgepe1^sY9ZnY,~?P @ZP&h~1i~ޞ^_"'MuƧ?ypVB/u8~Pxiעvk6>iO#%Y]}Dvn?+Ch"l6J5ΧP~See>6;Ns)Dkk:@(@WfHQF'͟xi~qçyo>>-Os 6A`Ms8@\W{8E$Sٻ`qdkuZ5m.-.a_d*{bMէ'P @FS A|l(6ա/& }O?rvumcTZXX, {2D5ZM^͋%3Տ(iV4_m<:ͳ]`i(20/⾰ UiJ=t)+WDʘBtG:a9" yno <<zu4_q,@WK,4_*A(P Ѓ=Jm9j\ ksTW 4Za@C(P4Yo! 4Z 櫥t NA?4|ͮ74_`NAA)MjT!!P@S46Mݶ* Cwʦ6ͳLl]RE!pYьc6/jʥ ]ᝂ P @8Hϒm4ϧӆh@ͫg4v1 9ֹӴZ67i6fEɶsrZR!Cc-:\zv gq^L"(\(MhU Y@B7>W=\9dY.-<̑h$9jzPOaWMxM_N S4uU:vW $*HmX!P+a{hjyCÓُ>xp={pylaGumC9|kџx\â;r[휵շ%qs#^C?z`I0ifSH묧QXt4/<8|]벩LڣP @Q&hjִa6 ҼmkcH~um}<[g yn88H]: k~ӺFHmm=:ߴ&?8Of՜rcϬRqXyW 'cAP @(Kn6l{˵NvPGP @(jJhv h6ot47Q(;|jkb8_cGINРjyFTf/hlɐ @(h^m~6,h^%*i1*כW]#kk5> mwulAՠP+yA<h ~끡?X kyjg8izU=XwzznH ]~}nnT*>}J+Һ:??r'U1N]?yH67ӺB#RcC:R4_'U;.|%UQM(@@*M׀n ͇ͫW*TBs[ƴ7w c.u5[6{lܫ塪l( @(^мO6͛@FA P 6@I6`tYU`=3lAŸkf{y]ܡwy<2x]v1kokO+G[{щ칠~Eh~4 fMU6 3GjJPT @T4oޱ1K4ρ^M%y_6ƙMwOػ'.Nueh}ţ4a kllYo":"7]y-! ;)n2vw7%t[^xYᾬ8^ 8X!oQX[[ӳD/^~u|C5P @(P@do Ѽu^W0B%e4?>9+=~J闎=ЧYϏi^t1jBB:ߦ/c[}y[wbro>Q8,M_/GrP''"A(@)<60o󛿹Wy^Wbs 0*>m;[ w:>U(h޶#cs^8 Ό6[F+:t$J _m~;ba87B˦:(E~D={={ҥK0'&@(@c*WiAKM@UeF/^_\~Gvzlggg4XVɽW):.ۏ̌vvd+8ø)/9Ux$pW՘똼kͲ5-lΑ CG:Q}"(H|in&=/n_!aY޾DGήm,J |GU, ըQjX/*"j%z𴉮RB(Ů_>77W*n HKJ3A> ^cɋRiC^ n=nm6kw g4u4z`{FQdaD_}aeGWko\-ȵaE&8FL(h>~<<-//FWΏߺT"WGU`P  @(R 9Hm^N[#7V/Ll:pu\꺶e~mn}[~5=QzSALKR~n~.\0445mWox~B]'M:+V)k/}@)Ƣyٔf;.u]mn~hP68r]͚U3?y_:x&L=\!gq-rfm%7X1eɩ 6# {^Uj7 ʴEpa*G)>ʹ%֢Axu@4o4 ֓W<1r+w<^"뚅Ȃ?HC)/ll}hv6m^o3ssKͫ6:64ؒP>j=߾*NHMʰ˹ -h>P٢e]Mm&6Դɘa70`dZ=z+l zf Wgd/wa=U%bͫ@oyxҦ"mx'b3 t$UF>?Ul14 Ӹ9 6}nlC7I'2U+=CK ԯyU6y@UGn^(dGk;':sn8iޘxn#4os`|ouԞYY1s5b\kf|sGb_>JRK?H7$MڄeWlO$^ Fu4.$+<RE*/QN`Y@u7PFT a'g&y_׀^WbgiewO\,--nԋGisq]+l7DBdKSYBTU@(bU i_<}EI'@oɯyu4dh~|rW> {/{tסO;1yaZjuoѭ>k0\9 ܖH.W3w >p4%B(> _YL-͛|ݣJ|%0g OܶP~ mnݡS79͛T~KI8P @(|ׯ_+J72E m첺:??ώtvvo; r$hyʛQhsd}a״9O?c}-6?;; ñ渊;D~,η Br-{\ج?!4(:"@(Q46OזЫ* N<(F| @($h^QHPQgP @(P $GN]N, ZsSi~Po)YmK3: ~Dk4繗WaI>P?(B| yIf#MR)͒|+r]M45j{x+8xDۖd ?Yʹe1Lmi| ]q+kd=ĂZyStM1QOB WDi~ZoދK6?j8ۨyÑ`bK·X)w>]T+ìf!K^n` rfV}P6VyE'wsg qnJmjc rj11ܖ}Q_fɭ> l bq*CxHuOk( 6_ZEh^zQGU] =}Gu}4VZR49IDzv7wup%P,(mf%+lhAZhD7m&׌-^4QÏtq>R;'3W4/F޶}K;) ?X k(T Ao'7Ckh1Pvtf'Ȳ78\ZZy#l?1Hy;ͻ3^t(Ӕ]2Ā0uW9Z*G>f)E LɅ!Kujgu1vsO|ʫm..>A h޳=U{D =.@Jfz׾ȭ@fg(?4g9+=~J闎=ЧYϏi#͇ypޏ˽|A )@ Yg0ZUE=- T@4߮ۤ6o,݇Gkڜ˯kAQGm!GOܶP~ mnݡS&fMvO{V5Ԟs 붣;8,VZoQUӽiFoVN,g͇<= @(@umD޼+_Jߠ/n1WJ//.y#;=ۇb󳳳YܳEjTƴ;ɒr<;/9U-WTl-+ZFLX2/<5S߇m^ P c y6繗}?o;HO嵟ձ_MbX,·=*ӪF-+Fwv cij[*h]PWP @('E7UѼ!/KEI}wuR AJkvH &kU*9L<^Aϔy"K(h @*hvml{ay4_#~-r!]~e7%4Ec6 Ĩh>F1P 4yp4?sN7y&S4N[ @b4?veYu{||# \15 Sӕ5א֮yGkP Ӽ>۸izu4oP H|B=_9>L*=-P ԊyU6.F+y/"s<) DYh@`y"O(jSh~lC4ςe4fh6}x +3h!sy%2ϲQ4_|c7Z ]h~gCE S HGy-6 iHݻ@iOr|&4^piuq6ͫQ%4?q[m>F "(sWTHKi޿Pnي_|*Sy(ЈUL}UNd@=(O-l]Ԝmt|l ]yg\22;|ӥq/3<-iBJibeB֡Nắ#h)+8Ɇ?XKmF]hxKgyMCѼaKGtL tyڰUn-@:F91m灅ia"u%0U6&u 7+8ׯ 0ZP ԑI8$E]>4 @( $K䈒v7^;4}-@y54]͇!~G9&h>j @(@=) [뼶r&[Jmޓoi~k}R揺M̥Uh`)^4K7K\Ot4_o=B(@m) ͟˯S͆ {{yƾ4^Q^~q(EXoF"jӨ n(Gi΂7\@W]rR q"J6kͳkuh. P @U qg6yMxOaW4P@;1K:*Olr|~ l! h*.OV+Hhj,(Hh67&lAT(Wjٖijʴ5jn(Uм g[b1gfgA!ͫ̄ Uvk7txe^aAe*/S0DW'8F h>v\KM]O|.#:a~b֭[7 v7]乖;q*, Wp:ͅP}|4?0ͫ6O(;eop3G~cNϵv{ݳz&4,4~EQ4;o3gic7S`g(?4qH|E!S< h>~/&w THG1gMf#յϿo97]4FE ی<2_b3j3{k=n$1l"DéG4޾Mev%sr6JP DV4;O/m,U|e)!K/g{{=qt+mGS/IԭOgO>9wf;>Eqd"̵|J6\B|u6V_@ *onu&Iɩg_W Ot]>Ȓ|~l,Opy:C٭Ddw%8+<@1 mCT4ȭ.yP6rws//~w4k?5^+͇9 O~ඝ_xos*$+Tj4.\h2q=sOcʗ*6on8 xfQGqСIWzJ"=uh^͟˭ycdY*i^(d47~dvq[l~vvV޼袢1y-TiçZ~/6ӼewD:8frvܞ^38֫JOgh>zU~ Sa0 @S4= W6ot47Q(;|jkb8n;\@P @(*Qh~mmmyyeq4?pF˗|_ l=8??|[}Җ}g>/O/]?yq|4_ɀV 6"< #"b/0E!NͧB(P@<&Cygf._}u¥/Ν?yWJh yr"(OO_%P @( Bde^YYYZH d_͍\reѣq 7S7@EU4ڮEàP* 4_phӧyoc }ML( N(P@JMCOU4UW3T+Ph^ @(F|i^z u|*ƽҼN^?[jS?h><ǖr* X| i k] =}Gu}4Vi,nV4c=$O|)惵1h>F1-+kc/5h>)ߚ]繗WygQ6O(;eop3G~c.oGrR¨WU* Zmj@*O!W6Phx0gn?gѹ.Om޸ ?_dc} ,'f>eߊfs'a^/kiӲaZ%(Z9JӋC еX h{uPͧUBn^(dGk;':sn8i^j߶]a ws˨4ou7]CyZ6qy mbK| |w>@| SHYZc430S]m;Zz(lv؃ #]\/9jG̴g%rwmWg) 4,)5ܐ @(И $E37JK ri)rweMkC[ͅIZ7?>9+=~J闎=ЧYϏ{̩lCSŇ03nzXG2>EHlnC :y8ۼ͇9R4ҎE g'JmKo>C~!lxnѨo^wH7 KJk]7n 8$QA@usP Բ<\Ƹ=mEձ_MbX,Ǵ{lkKu4_[Dm 3!P T@dҭӆP4_ͳ]`i(20/⾰+Hv@ia @(*6)'X jG.rO$(83 }cxڤeMd*JMv,UR4_]<͂5'ª[R|&i @h%P R4_U8E-9U  (W *P @R4BWmg4BS+P4_xH P>h4٘6kgG?4ؒז6h9L+Vh: ՅP @S4_mg6|l'>iCOc{_0?1MUm=-93uުѶj3?֯ q@5v h>HZݹr- uP @h>4zp3<|@y`A2{Ѽ"sEbBмꮮFjCxNADdPh4MC:l ' }6{,2MM4mMhg2$6-VQS(Qy<-@u2@uQ&h>4zs|Da&;_][;=֙sù|>{q<m!Gwa:Ǽmތ'1l"8ֳm% ?umAu:(T @S4_mg3{ hg`KKKv>QOp\4/XߙOu⾞M Sh "Kм U'P @ <zu`cY0z?pKuӎ,ycyOیs 4_mţ?6|HPh>vu.w.æ>o65k3 O~ඝ_xos*y{yyUmGU:ul(c0:!N(@dJ>t @( U4 ;Ji^Xg47~dvq[l~vv6F2vR0qiBh͕űeZ8|MՒ6r:}|t @)O!WgK}BqS]]X,y_o -U@wwwKA&LP ԨyE4RO4^QiqwXz5:QZP@BR}}(,D;Hyu4π>~!e Hм"a-P 4͍o{ U]ӦA 4: 櫣3JP @*O!ͫOɀv%h>Q(P FмR'gԜ6hH cYA(@*6͓ Qi61"4&GP4A4$P @(ͧUo޼C-9Zm]ȕ酪xe+{n]PZ"y ((O<_׶yoȱν*\Zݎki&^ii(4NB+96P2!P @@)yգ {, Vw y>ia4zDT?h"Ǟ. A(@ o9+=~J闎=ЧYϏѼ`ș>"Fd")p:_HCy@Td U@)Jla*OܶP~ mnݡSBh7|l4lq/`SoGNV 2pWXb06bм^_-yVQ8P @*O!ͫA_4ӏ+l DEP @ZU4BmRohnPw#gW6Kbq>kl@P4@uмQ%PVͧU6q/X(L4苸;}y5Bu:vAu|FP @rͧ`'X EoL|cꩻU @(H SH4ֺW4_]@(@ SHmX6@iQ @(h4K;=z߽`;DQZͧ<(Ph4P^)ͫz̳.Ot$ )6ͧ6/i#cC-9ZΆׯza/ UBaC oGPb@Uyrу:O*O|.#:a~bVs-{h( lW)/@!*D4U9P @()OWbo;H$'5mPw Bpiig<@{ y־Xh^4 @mPͧfg(?4^pS3u?h>n IT1ͦؼ3>-9:Kci{VО,(:P@xi~3u}iktso4}y~QO?1t.7HAmVO {|ix'wwì5VY\ق 3LܾGhwN~<fppzӌ_z-G/ٯ_|,gZgu4'1 q5/8Ohy0"U_nuVm@ 4xiɧq,K мAh~|rW> {/{tסO;1yku,Dɱ4" nQ4"p>@ѵs̵p7;iD+@L{.;_g񮋓yXd/?ڽM)Ӳqq"@Uu|5U$Kn||m=KT4Mw͇Ƨ?ypVB/uO 4Ofw^gyXh,ۼ ;߼Of<F݆˽\bxwd`A;W7]tm/s<;x%q^\I lh;EHxibjy_=mA*//.y#;=ۇb󳳳44[s^Eo^u6i v֜Y7^~{gOb\LJ 7T'()mϷ4sۼJ7xHv3OE!m|$מpI R CFW4/`sn@4O9^'7~&Ü/& }O?rvumcTZXX,h>L!( cinz?)ێM7z'ǝ\powLTa_tm?:;LVhίe3~t..̔Uou5~#Odҩh>^g3*SCEmw4z{FQdaD_}aͫc@vag`Mq6e;s^M8u'W ZՄ8Nu8`nB&֤Um^Cϊx樤t,M"WoG,X=2 h^]$ f7G:-=v@(@2 ]o];[#?seѹAwo([RP״ױĖwPfqs _@gY{*UL2"b!P @]|4l_RY*=l*i^<oȱν*y%G\iVJI lq@5zhǠZP @(P' y6 c&u͓mYKK+?s;xp={ ֱfLrl-]$|Nʷtfk=+,k<݁n9cW*h>}}A(@5K^Wz_:0g7NJi^6kcH~um}<[g <-Mh?Oό،L^6¾FiYVUĊX[7R4w7j'Qଔ E~P @(xi'o |`&6z)wO\,--nԋGim;[ w:>U(yOtr8Oe7]mc)ޱ&?.!H 4J" uh>fOoIPh^d47~dvq[l~vv6յRiaaXyElUм=I @(Ps D&N7ˆD'0U:.ŗyjگ 6lۨyE:lŽ`i(2ɓE־޼!:V4`W *P ԪI4/54L4OVyeWOU'X :QR4?@ DEP @ZU gCldK@CyeC絟AzA2PGz4A|#Q@"4 آČƨ6i~kh^m^Q?!T@7n U @(Z"n%6ƆΘ!5ٱ4ڿׅݣ fPGhXͧW&(xWܾzm_пyն@yz%ճz= @(W O6?'hP @W _7fK>Cjײvxb/Ζ̽q@5}trP @(P $BYaS3 vǟP(p6oy~mPw Bpiig<@{ H"k h 5P @ZR A'9RDy9q&bYyc.:m|da~`ޣss75s%Wȳ쵱Lv$wz3s? nYbxdӯee7֓6+el%ڝTAc @(T*t+YwH]y*BGQC#1*>]ABd'ڴ3׿w {biiTWvێ֧^ {/{tסO;1WLoJi^H"0Vǭodp4 w#?(RȤ[ ?p(7_?y¡_t7z r#_LMUh:~CSŇhMH!@"4w \'W[5^Qq/X(L4苸/}Ct+#ef)]M{ӷ:s5S{]q>PH΁k? 7.y/tO3962ԴۦWӦm끡'|@k"2 uzВ8҂G뎴ΰ @T Y_f,XH,? {/{tסO;11 yɴ)͕NAyDB+ل]L ; AaJ2PJyEs8'm[/-#^C&ب%D#HzisdB?Pm`_M/m~1kZUi|>`4?04>U|Ƀv~ͭ;t|Pk do6|g7@;iʰ<ke7 u@2t8JmkhÜtuLJӼAu[֊\Vo HĒ.pd$PL Mxw/恚Uyc<|Cl6tT'i^8ϬzYu3N4XߎcyU. O묞^1G^vω;78~x&JSӫ yT2@~YпGQַ7*XSpb\2m5Ӹuc^ #'rP fgK<Ks+w/xw4_޾DGήm,J |O1_@wn6Ks>;SL\ΘEx#g|ExwtgYq{ [q.ȲߢmSD+O^Y RhC2!y\|]Ѽs=&t|g\?T,LDhOgymHm0 ֜'^͐+B UweR@$|wwF8$ 7 KTAZycJ8zxy9]Ryۭ#ۊP W ~/7?ZA0@Qs#^=mT=YE݉lS:OPbZck^2SC4.v5@dҭw?;2z:D7"^i^<[qMq-9ZفuiĸI&5;^FP @(PO D&݊h~ʱ/ {ml0ɯxx̹\>DUƶe]s7~y]l<^6mÂD2/¶2DG)4FP@p(?qm~KQ[#m̮/!F==cXZZ:Օݶp94/8{h^m0#(ogcYz6>+\C@dҭ6oW<6,XԳ|@+_:Cvdc>?6i,ZPY %E NHO%ZI(d'yfQ$@66m>L0*>m;[ w:>U(Dywm:Z/:".6@[p(C#q0#%T|()MP3cNOnj,Yo+@ D&Jl_-,<y_4ӏ#>'=kQ}iѪbxw?kpq/Ӏ hH]KrY*EIkL6J @ $BO<S N_h矅vY1#^=mR'Bdq/X(L$1}7m(UQ|ŎVN3wn0!,Z/FA4[X\xDcZO;:uևjv棝!HW 2Vi󙿚^bt?PF6+W6Ou'MzPzkLBi WU,݈-X"s?A|H DPz D&Jh~]{a6D{ّX4HGd T(WjyHe̩@AeT&͇a S4 $@dҭKs+w/x ""^i^m^Q?!T4_Q2vԡ<ջB&m~ 3 6Tg=K,]>-|kӆ=Q( @U D&݊h7}wyz#mH@7_*F /h5vEی)iE=-ˁa.q9fz\!H稊hlOx;+XE@*?T\Y+sE{$cEPԝ6e nV8$ ҁ'M:R I1Ý^t^U Uy-Dv!(t+y'ۼ &kJv c^ 9R9{dXʼ+a2q]ZW^4ZO |q;ZѺ߀*"(Jм+++ lyoȱν*\z 'i^9/rf 3"DW4];P @(p>h>4z`3<|@y`A2$G[}B?hG)O!ͫ^ACÓُ>xp={ z/kh? 8Eي VzV yL+;;#5h1P @U SH/쵱Lv$wz3s?{ϫ(!;_QYi7m)hseQ[^6ŽFmq­Hu_A:$T @(jX| i-_9JYg>Auy:P Ԁ|%0c|T'nJ(6B.2m6eN7 v8n$d+ 4C(@ SH1 ,͟xi~qçyo>-o,8Mp7PtlPγf-4#Iq{Ϫ|%4%qgPͧc7:(>յRiaaX<P+N_ DEP @ZU4BW=Ľ`i(20/⾰UױyW *P Ԫ|l끡V46_K@*MXUE9 @(W4BO~XP R|x @(P SHm,Bݟh@U+4@Td U@)yՃM\F\dž[r޵B%c 0Urj8 4 A|ww%qccA(U4Bmx'bײvoOxy+#c+Vɞ))]ͧDAbe'F(;@)yգ {, Vw yޛ棱r4/V@Zh5Tzjͧk0(|l ' }6{B nmL}L':CaKGŚF}>{ml0ɯxx̹\>D"37F"Ǜ9όn֖1tQ{mެ'1l"l @i1h{mP @Ln,y׾j4+ͳ^hg`KKKv>QOp4o{y[׋V|W]w13?J/xT0IX݈F@(@b $E74ak6?>9+=~J闎=ЧYϏWNPKlη4j_)K& ;˻ P HA1c*٨Vi^^ÙW^mj:~yLiJ^LwR^>ޱ@(Ү@b4r:ѼnmkeZgFQdaD_}a~,LM7?etBY<]VdJ]ڌOʱR h\K;y68`'X {V(Yr 簬ú >ьӭ^mzB-4wYGUx &uAq-̰P%zW`gn9 @Q )]3y&NOhi Ҽp Ϸ4Aϙ6ERӭ=L58)E{Bkż}xL+_gAAߡh`; [y4'ͫ7ǯh> |oi ޙFewOwø;^yO!/lX5 9B(n;&osNOER@<[oHpa1M6KmeҼn O󎉹^4U:h>l P):?qQw@qҼj|2gri3h.` M4?=-qӆ;jĴf=Vh1JzڰE_7B(ODiօoSI1=ĖwPx%z\*̌$,먀w}̮4VW#2h>ӆzAwn-iCOc{_0?1MUmlѹ#h^D4NjUƿh]ti=ҫ0 I"|:A(P $Grk_5'|4z2<|@y`A26GP(͋\G'3NU( @(Zh_׺<*_Ga݇|<׾Qxͮ7/|da~`ޣss75O4/Q :wDG5dIV4d wGYʊ/'?+OIN:3=z5[&MsWX#9B(@)͗6FW׻omyՃ& 3ّy艷Μ4/Xp&4`5 trU|`y@wM60}dr}bxmGmx慶ӳ {X҈?Z> %Uxǣ#rP @FU 9ym cik~5K:3{ihg`KKKv>QO/3s01 QN|Ͼ#'wŷ8X4k5qyZp[M0CD|R_W3|}j @R4_(E@RE~Xh^ c4?>9+=~J闎=ЧYϏxh:P4ȸnrL,ݥLR-ő>W?h^ @(@ic&癿Mho^'BYӦ`h|l%{[w Oͽ: .'\d+ Nv^,Xn0B1aLVKšP-_@;P ԾF%B(@-+ >qfr׵]ݶo.Ic7:(>յRiaaXic?)dKLiŨh>F1P 4|rl+w/zh^8$OÈכQUQ- @мU#P @JH<9՛廴%<W6O*H S8J(m% S&YsqrS7k6 |m9 c@@(Dм<;⮬O-\iwWy"uOo#Ծ\4_}Q"P ItonuaoSJ YԐh P @ZS qg6i^ڢmϏo\$OU=YuR Uƿ>uEk֗-P D|6Krk:_Bۼ &<[2)-?z~=|r3eBE{.NuE[_ P 4iF_5h yoȱν*4>_H=|̲(O?yh 8yv7ĭP @e U+<+- {, Vw y^Bd<^j0q N`.y1i~mmmyyeq4?pF˗|_ l=H_~v/nw^[bt\mn%@U3,~{tnӆ8~5܈'V|Ԕ<3x? s8iAͳN\8jBuB (#4X:_Mx;8JO/ %c4Oc<%<7W|9KՅ 8w]| "onŝ+P @(Py%4?rK3ϯth!ᗚ"gMf#յϿo974TV߼}wMܢyM,6"1)z䠧B23ܷS;rm呿x*rk;==M .-\\\\XX$hhndȕ+==G oWQ[ PHoӾQlAiCyݶK7_K+ͳ^430S]m;Zz(lvXB|Pnws)&g#DMbV>4\,K4:w׾~vg KwW[k*_3.\ '/@(i|}/j HKDKōKd'ϭ&@HSϾ~أ}ڑ%ظɊl\n%\pqܟ O4AFASW}ݠu@V#Rn95(߼"O(@;)sMSDO7d * SɀM4iZo%2w,w][I#GHCSŇgGUIFQGk~\T)|JAI=@*"@(@(4@6&_IayuW//.y#;=ۇb󳳳N}٭{.|ߵ-cNHñjg.Ҽ,Xm>lqz~PtqG1:,dEp z8&#\@*:yB(@*Nmٰy>u4_7&mRohnPw#gW6K%Hk=扊ZR.FAb @(*N7k@2jIм#.Qiq_xefJ7߫*rp ͫ u@;_J3'|:m!\˭QkP2mj P 1ӼoV'|4e KSQjfbpg5bA(@+ &w"jC[}o` {?l i2Oz=u~u>QZT 5(mZ FP v"I͓6 6yqc|Bu DurP @S 4cOזl| ,8+VE3Ah~:Pp'毗n(o=hR's;4^1716Z!+/"\@NP @(yc%E>UY^ͫym^'wU`&{W,ۨ/;y "/ъ# dͧ(\wxh~isdiaJHe֛@󜏥_HR(>&63d CkP'7\KC(@C(N_[$ׁ>]46@_=/11iVIa2mc)g:̔Dc҇g|\נ4WP @ZW 4."g@2/174O>~":aDwCgls5#U[ Ɣz^p jg^P @(1Ҽo>gb@_=.Ӽai޿ROMWAt  @(*R 4>_麶!|ha7G͋K=vzq8/VtME!qkh>.P @wXh~zikrziXJ_^֛OER@kh>&@(@\ DKlC!4/l TY |A(@-+NAy_@2`~WgV 54_=C(@ DF9UfOӲ|d|JP DjP @(@;i48=m0@)EUP@1m^y<_Ł2aMz"t(OGףP @(q*mrOc>ʯ}(je2mU,EŨ@kh>FP Իͭs55Omzi3aibwݐ ͟>:ydӟwѯv'柸[$x|_"\@uߨ:P ĭ@;i,4?C44&K##<^<|@#ّ|nl\M'nn0A1X YDkP("Iyo2: MH{yC_gGGrcS/\-\K3}?_3_23'%RGB q"0B)Fkh>c̓P @rp'5fӚ6ӦkW$O ?3;{ƍ~iH]'r56#QQWü?#xW+Pyp G)P u DE_ʳ[K!kyߦl̮/rOLN]'_\\,+a?y i(^B疧Ww|gYa=؋`˭?u e p + d @;i|4΁>u4mթ$@!NwE~zff~~͛'?6icN0sۼk8]y7Kx"ٯRkh>%}f@(@ DFcDZ |*i^_N73bDDnݢ p4/̋uZn4K?4#^}_#q~!`"\@"P 41nySH5 t>7`=Ͻ,7 EiF)yT=sΆyk62ǚ#4볉^^7pGHJ*754XCP @_"Ie[?zrUͳKձ_r%'fbqE8 Ay'(\wҘi^7ϧf4qJlvI WU VuB"\@ YC(@)N#͓ I |&oͷ=JLV=귾#<90u6Uz;Pdp 'U( @(jRwh~V7&54ٕ) '@59P)( W 54PŅ {< ^Ɏsc]e4L>iUk:dU"\@IvʆP @S 4F@~mz;8?q|Zm Ύ& ק_(Li&Оa[Od߆eߊ`ي 5?ZZ-*^/v`92UPcוr/G`ąP @+NO&@?H?\^ml:6?tuʵ+Wsd'qF_u|K-`2jillfNt'ilqB%yBC jۋ6[6z`SIPן |]8**N_$׀>U4bv鶁_ ܨ5mz8^f3Z3NX?W4ou@0[x}vtmM*KjwU@Pf@ͻeI`ʼn#{MvnAjwʃP @V 4n,_M-:g7ڿoz!3tYgfo޼j~c^4ovwAh^{ۼu8'GIBмׄ` }x-x7P _eFšP ~"IM6ۤwB٫KgK{*= LX${<<u;U(x<F4A;^4n0`aE/FI-cBAm&/쵔4O Z%)=㩒#B*b((u"Ic=S')/{83_ޙ b0rL@$!!b &<36cccƋɶ,YYwkn-^/^'S]]]]UWRݪ>u9uSoujtbELy Io>{n[;f`14oLW 䚬w]Aɖ]Ov#aP @( h8&NϽ;B ̆d4_G4/}*h> yEK#4A4j? @(R3i4+oM_/TjLG[OͧSaP 4A8ER(0ΤmA(@:+L?ٶwadQM$:j_a Q6Ys;L1fc27t4oAnP @( h8&Ngz`rLH~3-D׮^c먑\=雧s+dⲒJGѫ/\ޥxo}-RE9ŗ0 O||P h8@^;U?4ryq،4qK@7r<|sU>k>0TY]FhjFo2Ŝ4o1Q($P @( 5[;xa8~(vU:j7 _Wb7/Ξ.>80oP?a`hO~zZ8 ^{d ~loѳHwKkB?)vG!BM_F$.˫RPG1Di Qvj8>M}d3iG}>>{ʑ[7p~F4n6HNuL ny}󭝽~K\.dKk: >lƋ"?"hSF~HП.tpO FP'e{WK =,1Q@څH(hA)T叒@cU Qd3i4s]s'jN6 :Ufu60hvpgWMC@%ۆ{6yZcs ;G }>ߔX=ah^ P+q芗d AܬJ~Y-2q` K%]L#q3Z7BCym\[E(9i@z6P @ W@Ù4q'#N 67 _6TG~l|`8CSrT+ܺҼ[;_c J9e|].-!ˤe`-;$*  ch^/P @ gRh>׃4MhAX^LqsWRCc7_ZQ5:6vO$Ok92CQ++#XXd,lE"lSvzJGa!`giA$J*M]("{T !,-&ĘFQ[$P @3i4o {:&u:\m.3iC4ā>54ot4_USQ:_\.W4/i=]*ˀ=ze?Bhw 4 dˣ_`-U --G.,'ҵAh"{,5 te мn##(|4I /].NJ,nu7j)XNDЧ &9j;NĄ|мA-kl>Tp|IP h8&N_<2u|ީi3 Ѽ)y;mkt=$щ C`H 4]ts4(P )_ys|rbRcƱH{k Ds63g||Q͠D&S@ 7Y@uP 4I?g)_m4/;![nO"\DŽi} h -0B 'hވ@P @( h8&NϾdMd#ͯ1 }BM hh|u;=0ӳ)Q*(HΤsnr[Ư2#‘ 4Qo<]мA:"[(`Oм <P Cp&Ձ_=|U2fIyv!u4oo>j}`6y]֠y[,0ӺEQ8(HΤzҼMGWG߼?ƸH9ʷvtYm}!X]}Cwr߼gAΒegg ŗ⫄K򋙰oxNHKP B,B=|M7 ch-J@(> h8LЛx58קkEͷvvX-vrȏ\-ѼaFb *^vI MBz9 ޿S寴^-X)0MP)(Ц342-Чm}Ni>Bkla(AG'7.B3/,v]@. +}+ ch~w @(d h8Bn~3oif=/N/ӆeoH9_~GxM;ni@ P į3N4π4/}9j;NĄ|D*PLVGP@?4Iuyz)@N6<ې7Oa!}b4~149͋B( h8IЛ`||Q΋B ch-J@(> h8˦?}Ʈ7OC.P@P@G߁P @( )L3 yEڴ_%KtT@Qd34?a>܊y3AU@7I;P dΤ6lq1&4oo>jF6)yo>9m5 kI&ɻ3%" ch>-ZP @P@ÙT_[Elq|qo#Srrw)Vse%!۷n1pK((56%O]7^KO@(HHм>777??xʜ.t7O(n UVD(*hτEP I h8'ejs|oLy=]V[}p`92:VW](c:WgggEHӆG6g"%".Xfl9H o24aA% )2A܍14MRA(@Jp&Ջٚr߼5Yww2=˜FGݓ$|kgok'<599uPXwVclHq+kXe"],.Wls^-1 bI`t{y |)T@ÙT'Dy3S<| FIcjk<'' K)v|)aX{"Ӽ"# y墳^9^wK{E5]r3p ~mo FFנ~?GO=a ͧcCLP @("4Iu9TOmۤ`Vm<{t9\L`1]0ӥP(H4Iu+ͣmi l n~zjR3}NҊѱqMxx"%tDyrίc:. <`NGTR`<];t.([mЂQ,-bޡP$Hq E0S`7P Τмk -iGb_<=z9_i8rY1c7_USQ:_\.WWϼ:ex <v)/٪lE(r-gFXZa ͧupP @(\4IuF.5ЋTuu6C|^h~B=O|'b! WKbXvǰ隘x^ݞh4oPC9뮀4{+ C(\4IuKuKnL&͇╺e=JGFwktCkH мFP Q gR}h~bcی]1' @.Ց{^`<}T3:鯀143 G(X4IuylZ?'X\#jPMF|%*a ͯĎ:C(@4IUB /v,y 7:nGQ ch^GP dΤԅ*{9C}içO8#N ݮ[%Ĭ8IZڍ14FP p&Տ=6g&'|%<z"Mo'7O3)Vse%!_>m.۟Vvc!7FKGP @()i2fyzo=䛧 z2rϏ\2u2yBvd}>}`6"ݒi1h9 @(C gR|=dЛmً`y*<@ Oo|kgOgr7D|gboh 3⯡G /eW  L7Yzy|72 AX pORh@iْ(P F gR}i{MEW[ƯDCih$[;{;,^; ]ɖh48oXGa 2%E @&DBMUA ~N¥H_iZ$0E2: ch>[P @}p&ՙC;m&z4O6c7>y4WXJ56аs M 3+փZƸKqx:ya UeA9]B@cli@fP $34c*'M<&p CLr/* 㙙/$Ӽ %߼DC 8Uz!&MH7}@P v4IA\Յfl4reۤ7_ZQ5:6vO$ODΑi^BLx2tl)(xo^Y,- ՃJR_UP @p h8̥e%мݝj8ʓq\ӼS*x5"ڰW4w6'xFV܅v{"|]8\XKb)a ͧc(H?4IAi uK G/f Vu3-0ӢP(H4I |ynfӆhZ3X?)$ Zzp"0ӽQQ>(HΤȾ 䞯e )$ $14 @(L3)h>*͟eybr hh߼?z4A7Ji3^4_kHm=ρ>@SQ͑e|i{Q3(a ͛Q(I gRh~f]JU @oy$мѾ.X9r _x9l"yb[14P@R@ÙToE7(imxq4otyBvd}>}`4ot) chLuP @p&՝QSP @p&i#1V]OspǼi|󭝽~K\.dKkkd'.;K3,P  zXȒLڋxwBٮj(; .J1rע5Gwfda gFӢP @(4IA:<M>B^[vP7PMC@$ۆ{6yZcs ;G }>ߔX=i^-]3o}7ȞcxLrEY!|d<(;yiP$Hព;0Ӳ%Q((HΤy4fѼ]|QIy=̼q E2*+];dzOh^~!#:#%`[5ek@)k- @(O gR]h~^GSfθyYXy<3!8O7K4_ZQ5:6vO$Ok92!2RD o fEi^>^o^Y,-/QĢ)h@ P hS@ÙT'H0>4OI,,,ѯku!Uw"=O3Q|NPN k oi4?Mq,҆[h&Q ?.4^7~"\4A]Ps(Q@ÙT7O*SX7y.-M֐Ϟ(?ѧ`iޙXhR7c $Y ch>mA(@:+L4OyHa!O͓~l(OA qN16Xty6~jhN6|} ͈DRJEݝ h@&P hU@ÙT?K͇R{5OI͓vgv2\~qYIye|J3ƅQr;ۆbXE_I-14z * p&P'F}I]S~KE ۭutYZ=hW"4ot;') ch>Im@(@&(L d6曧`2i#M&_rrr ya߲g,5#A4/Nu}O-^1Mܼ[;{>sdt!ʻ`n(:u yHi?>;g#Nw!V Tq/X>yw(Ub(rP,B0xTF ch^' P A gRi1=h^"_CF@([;{;,^; ].տ5"| ̾2Wx_"rlC%aɂgy9JAQp,1rwyyU VԢa ͯB(@d4Iy"tQ n6B%c|<>'L K)v|)aX{"Wc(+Bkb ^WM&YIBW54T̲ X* ! V֨a ͯ.B(@D4I*1tN@6S5Чp9TG~l|GrI:D.; ;{Ǿ?+k =!|)4AtoT @(3^4_m'b@yMyNI'XjIU+a gp{P @(Τ|:X6|CFBMoE+a ͯC(@ΤӼ}>=#˓qmq4ooQ ch^GP dΤ:%!҆Yh||wJE)a ͯB(@d4I.yJ,O3F=ko>jLN/.+) o^Jo⟉/ӭ8[RL} | %P @Q@ÙTog6f4i,6F.'onJgs*kӞ5( ZLh@1)DP @(2p&Ջk7/*h^}moJBܼ[;{>sdt!ʻ` n;u Clo6 M xY 9X2&BhЁA:݇*E ;R-!/j}Պ*SU({H] e0ӥP(H4Iuy?Л)X7OyC䛯a3͋6fSF+7a%O ?rMNNFyY IA1toN0?L r?E a/ߴ ۟lsd .9zل_U. AEr.|QIb_]^P @+L/YMh><6'?8Rh14%|SbDy3eP|a__נn\쾁Ak\5M.Q 5RPU~K D4Ai= @(R3n4?y3͇yVgJ*#?6>xfffc`0J wO|Pl]'Ҳt]i>#SCZdrWy @AzGA |頀34π4qϽ;.X9m ,`"m)ojtlv?H,--ѧsd$r Q@ys=(>Ph~K,gxفK %"+"h`v@"4QIa 'i(4IZS j>ިBe-guIy{:!erbJU¼xĥБ˱\|Tz 64%SI26ieϠ ^Mp^pqDR^QMb_U\P @3N4h^z}ѩϐU|1ojnXvctMLx^GnO 6ǖ3廓lU&%0L#P Τ,z23zkķ\fVjrѼѽ-wF.yù.QOHql R@ÙT7\"Lo7ޥn/.2U톛׊6yq4yf#1J chި@P @( h8EuKdaҹ.d*4m3v (r*a ͧosdP @(t4IeS/vسX1)͓M^.ؤR h@fP ĩ3.4\7(м`yC' ]mA64<({Xa'W7/IRdaIw}T20ӽQQ>(H~oܸ>x`EE9 180oN¨ߚx݇6yns,]XSbV[WkTG@i(U>.HmHd*5F# chlP @gR\΄ǏP>94S {*c33U$g}œ6` ]d6oo鵓K@~增Zƨ6F@l?J/twvGϲ$-P>%-3Ze|q7H+G-@9cIj@iږ(P B~&z333r82}J+gOSh+cT2/Ja#ijjjT"E{( FjTBQT S7M=P dLJyHa!חx`9 Ʋ|9D9~T)n},PMCFaNQy; ȏ]H]10s/غ.EJJJ:^y~= F/xv*4'׃/!T@T/!"(r9yQeGF7pr0DP LJQ% 'pxŢo>ɽlڐҟ^o;wp4-0}nX^BE /7+fd6o>ijtlvuZCYEFM$ ԃaYAqʲ"^ q6/ GvmO|x`_YN!F~CA%A, Yi4Ajb @( UICx8>4OaXilP&?q݇Ol=mǒ4o LΟik"98BV.XY| |UMGyY|q\Ҽ,\,B&%xޔq=w*Eȟ:RW棸 (j0d!Q: s ch>]B(@*Ϥn^4?1wa"繇G ļ8{zx~n kOXa;Fy< F)a2ڵIDc騜曚[,v:]%ݞ04wPٓX]qi4AKPa(?Ǿ.XFNyc^l={l6swJ cޡ0*?uڡdkͯ^SM#_G; h$;h>Qu^ @(0C+Ͻ;sb^<О~'_Wy}iK^K_cޏ2aTlc3G̪D׬R+^}dih`P`*zPTWWS藉]T @(^ [΄h~Jenn/楷Y?[Hums[|]8b[ !=9^|jAa7՜ CVYYIn,P @(@To` F횽L3X"4cb$i&}T12778P @(013zk|R}6ibݽwvw'=ŊGͳy\n=?߼):*P @*#?ʛclUsd}s7ܼ+헨4Os L̟n)O5*]ퟡ|܄`cYCdP @("+3ix|9P)7?D6JX4C'MaP @(P 9 2S/vt iNЫaGFF6o {gsc{{M3TK|P @(W rS/o8w\o<鼌m۶ދP/mvzuyswYBi&:C P%(P @ Www\V2G^ bI煼n rWj!XBEgxFP @(r"22Ӽ y  2+P "м UP @(` |~ i旯68/IP @( H4O6BiuQ "eJS{, P @(P? ^yetCP @(+Pza*{T:MoRHsyO} K6:}W2AQ(P @Ͽ1ajqx Dho{B4_7'&3P @(x{)`36}q,(dF2BG4={mRA/ UP @(XQ F `gG gZHIP @(0>|~ٙQ2׀Id'Џ4OXρ^yyr3g4<4poəM9&mDP @(V7?|EFv ,6~`19Bx~\f~ouƑS 9\srP @(0CųmVEs|c>9>Wjs*f c<=*˖V6fEYn}<{y駳ML/w sM 4'P @(paRqHIoOsؿ{;o_߻{7lꫯ|o9O7=* P @(h7)&` |3}l՚oo7Qn_(VlyBz=K6Wn7IwF5P @(`^JIٯ鶿wfp}B2 6zi> imw߼;7*'6۷o7_τIP’' ߨT.T͍/mY)]fhzsǞEnɆhrrj&,TN*-Y. WgBUR9Tfӷ S/o蟸={hfSA+鼀B(@&)w`xbҥ7*'ʬ*͛=˗3arRi̪u=sv~~ʕ+P9Tfӷ ӯޱʦfs2pZ=wRuJ2onRdhB(0]sfoRʬ_CL yTZ*j](~H2]4?y}[\;#=:˿5㨈:A($O],\FyreB]!4ov6A,e/XgҠB(02Ţ|33s쩬$O,/,ÑDSMcD[ݛ,BB-Օ⛯蛅o^[7VP @( RhՉ Y˔kYӯzNQi#g\nJ4g6ZN'5hpM{L47hdBP @(@l p]NF=%dtcYY[m󩓉/62ӣS,B9>ߨw{iU`M<ŝJo sg{|¥ OIpn%X6 P @(Gf4s뿾eQyWNx4}ӹ~w7J;6x[x9:Z _؟&wYcm 4OiY)<<'#G?업pkچmx! KO9҆jA- R?9L6"|Gby 6x VA(Т)%64KԢ_~ҼiC*mH0ٱ-{AiP,7Q[b&"qJ̓  @(a u_nlM#Y)fϳ y/҆T4<p}8| sO5_Kd)Ve>Jc/}5yEN@ R7Vh)Z6i"KPX\A6yFcd P@'/7:g4[pki)wocCG~qG~ռ#!62c^l߭zxMͶpw?cc?5YYkW"K yuDyꛧjPIyFn2 ]7i^G#S1߼A@(U"#놦/ٳ[(#ged_nkFLx=ee=oԿg kOXPڷ ${ du!|ܧjDO?&kb 'hqTeRJRFydRQⒷRi#4R۬ oyny]bdP@D9yGU 4k_ܴJ旖\z?[XY/'| Ŀo{v&=Qiü*dEso=G҇f7]Ŷʚ&-]= osH#iC??8b3((h~y7SJ{2gёU;tQKx>ojjtX;wZ4替GΖp]xƌK @(U"mL1*m'$p|DπJoKy@BNR~dץ]" ݽwvwG=Z"_<>sαPyMBid;2UB#sz7XGP @(QĥL1*mdʜE_כo49 bǦ/VIRhs<ٹ.w 4o̰\P ġyL1*mY:xsLi~hq꟭7K4ݍ?],p+py|?l @(0@]}GF 7*'ʬ͛GFF]홰P9Tfպ9;?pʕx:%驜TZ*ۅW vt銞rTehշ&F%n;w3{}R!Ͽa,P @8XwVFRUk{m۶mllݒ JKeV˩EhvyBRM.#ޥ2K!'kV15 " 8Z$P @(`}WߨTb_Tu9UPDyoTN* i'-Y|Dŝ޳mqJ7pc4߼C3P @(0B-v Z=+楸y2y#:P @(0X:-F7?\gj3TX|aJP @(0Dz ۽j2P @(GN],LN6rj+e4|ijA(P @)K4o%:OY;`P @(P ~41uiHo|gz9 @(P 0Xn)h y<i~{qclP @(~ l57N///AkȞ~qf~lџF_=k7賿zWz7'_x{Gg?yAq/@%NJNw1٣gF}稛Q}kL ;EP(|覟=O?CIҗo|g_|; HdžwN5Ogym7u? %z+ 4.ӷ42mlKNoKQ̳DofCs/ޟEe%-SY bl،\鮀(5id *W֨['Rݘ)Ҋ?{JWw~n<% ۅ.a. &%_2{ioKkV˱p&&PӗF3wd. 4+3P+u@' '>;˴IIDATP /\ol$>v >#t`O0 (:p!C,2D-JǚJ&Ĭ}|twcrLtFFZ{MƮ&0YuorLZaucr ۺ:h[X;ۖ2k:݃T،5oLkSj5!gdbs/ 2H= uՊ~g EĜmltLv;]vWacH~KrVLf$l'su-CޞYÎe {0 $H>3l#PNv٩dI+U>'S'fғ^>ed>}lvhrY,t.NtO_ο:+RF)|i\r.v.42u|%>x^\'b_Io/y-zC:0[ޒ ;e)g(6YءfgլcsM{"LUΜW q,n5Xb[0IIjHW)6WٯbB=)fe ד>;SF&Ҋ?{{h?S!=w{puU6^::B6zyuc%%yglpo0llIaCKmx)m)g/zPUJ0*IQTvowRdS%V,* MM;F6>uG6B[xQ1֋ZF'ڄt]jUNqTe2(14&5)oeCpxNVZyٶVW~+*1}tuB_& [FNڏU.+l׵tgMN4ʭh9;}r9uTo?Pmo_@Ŗ>_evZjہJ㜺G=uYcuCyOQ/\٤2%AGqz<'s놏Ut}UزTG ?{'{?l>-ڶ}gߧO>~nv(:Xl_ؽ{N5>ݼt㮓 OY Ñ IUl=7ejw;ͯ_{/~|E|˰6 bӉ扄 l!J@?]7CH! fҁ>4y*^s@ Zhޏ.JOW^#R׮r4OyvTF@OF4πm'F!꟫e4ci,t1;mW'pOW г$] PT~ >%"sa?.E$6inDV%^1y[y  ZFN:NT9CٶwfUo;X/yoѻϼ+O{>;^HΜ='h*;Ė[=\2Y%|󎝀^p*ϻ=;{_%=hE^UrbyC{7i=@C7W΀~Z`^rn.薣ER>t. i/{[3u^k |4F2:dEDO]r֐q?2zadXe2-j{zr8V@/ϑï+zBy0B ۿ(h[к7eOOKN調PO"U؎ j=yá64~AT=>4|i(F qR;<۾ym_ܷ9ն0848Z!⑎1PEz.:+@icoˡ|4OW&GO 9{s_ASe{u'{mo[?޺ӿ~]=~f_^#%9%#}r8g9Pb>t/Q>ҍnk9\j9x}Y62r߶Y v4,|Hmҕ=&} aΟ^($B*S894J ),,P3@ 5v׬Zsͪ[pv?\{}Zͪ]o60Aο0Ԕ6,W2exɎ[3}ko_wwiW_%iݶ$4ZIENDB`mondrian-3.11.0.1-R/doc/images/logo_mondrian_lrg.png000066400000000000000000000064421261646570300221740ustar00rootroot00000000000000PNG  IHDRQ(gAMA7tEXtSoftwareAdobe ImageReadyqe<`PLTEԚihC߳٪Oʂ@ڧuϲ׿ώMٰ\Yǥ63Zu% tRNS\\ IDATx[r D9_V"Ic__y5P8>#@ quV0aۆ l[m@ض:_.'@z[鯃v\u N ],57AH ?_7YIE/9Ap$M7|~#.3DK~Yz&Auj١ ^;R` a!i_ T"pzU E/PW z|<<ޖy s=,gծ뙓M*1lg\}x,5W*NHa*!]G5Ur*I'Rzy\q uk>e@`[j7`*>. VɚΗ!+>D,z .o#]c xpҝK Sx:w&Sa(ȆJ7#?"Y4D5Ɖ;xr+-$F*[8E\KϑSBꦽ]p'ɮs{N7cwQ& ("]܅u=yl1r#5&wS'OJ1<ӓR$Aq˺:ߑ,MH„<psl{>/[_B$S µp\'>/Tΰ75( ~ѝBwBeU\G[Fo[ruie>"<},a)r]nQDA%'{ MV–^+=''msfCcR!pvkٝjC(Z{[5_^|>v F   ,N6JF,ܟTΰl7Dͷ7>@Õv"0?@E6F(>ylZyVlS[OY3Hb<46 =a%(,a*/MS;\ӞgN H02kE.}\C% 2Ĉ7ˬڵems;8,.,Vkjڵ=ygl TUј޺{=$5 oy'qK(|kiߕ" UlpW2@pސ B.F όl;Dt b=@䈵yӐzƾc+ ޝ듮:2D!I-5P6Q/>=؍-V;1rQ  BiCgxAlilJIhMΏ@lt;M]<#sS:iD@( VJ% RXĈ*1]%wUI52 ReVoH=C<#z , Ze zǴ\XKZO':X R8ϣ>G9 _<.iBq%Gρ_y ' d{@?9ʵ<cqu'r# w>B3)"eҼ$N; 6S DT|+6"ڄQ܁r\8`>JU0,Ec?%aee_"VBL7ir<"9eeC>E3%lshB\&CXJCw tAK ȖsS%GNkX@9tqJ^D-D̈́8P! 9#0bNɞ@H-EVd ?!ER*_'b#dEuYRp"9HglEM,=Q^~)1'{ X 6Cp勓 HT>,9EZB ظH|u8Wk XbJMwL}x DC:D!AȔS|J& l rP0yE# g^uhr7@ h.`}`@#c c՟Z:,FC zl ZIj%HPMp4G>:ʵ :a @AѨdx, QmٱPDh7 /7}RlN2)A}g}f/ՁR&SDDGAβW-Hw)zEQ.(P2)*!+C- پ.D|,2A_nnO ,}b}Hp!+l+̗tA!OdgZoD }74KLH8/~5u=Q2V}8kT>q r4b8Mޠ`O\M8 KXL {fTeh詃F. 疑1'Q=~%}D$} +$\ +~տ$! ־>;|ke*+)}^\D,՘~>IENDB`mondrian-3.11.0.1-R/doc/images/perforce_setup.png000066400000000000000000000465161261646570300215340ustar00rootroot00000000000000PNG  IHDR˕!gAMA aMIDATx^ xř8v]nY@96&!h `sZYC$ߒM$K lraKe,hFќﭪ>H3>ROuu[U=݋fggC-٩SHEΓ)-gŋggfI' ' )i)@N~ɬg0f& 3*a&78' ɔ;' ' Ħ(l?$L ݟS%cEW6|wΜ?;O<<.ٯ?FMľ񄩱hQ ]T 7gs1 2FH6 i-we 2N金)N@Tgj J@FPT` jt6Csd@+sdc(;e pcDAO('\'\;`#̀k'¿,,ۆr `'wF (U@ˍf #f'Osb=wn ߥoW1䶀{/]nVN}Wۭ-ª!A 3A#{L*~0v}0<;(!-@ٵĮ[SX!|1}e:ok?AO& sXMra$O\X\(0$| (,m+!%wx_/MGE\y̋+Ld ۝=zӿ~?=fxv'o'{}ﺛ$* sQ7G>aE?1}k3ؿW7v- o\sw\6pkI_K}+v_֫>?J}0GƼ:NdBv+(1cb_l`@Y68Ƒ?dVqXXѺ)(LB㤨tH+foq^d0P}kK|}I线:}>%Fp7yuYrCKNew?[l>B|j}GtVI@,w'b:yODN1SO?} =ATv$|EK) 2a2#Cݟ-2n/E7~YUk>ۺ⼗v}yOfDCŗt]E?8P|E?sFD`}"ALP -akrg=A1.k^|+U#Q9hVrG%w*S#"SƼ>yaUyy ;S}W|o=WO]a>V;Ta+B yE?m5VFWV?S}?H㛉u77eQmde@ cCHzbbOq|`GcbF$CJ&p_rkELi"{~g|ؽbIRêT/+\>}"SL^4T+ao?t/e\LgWIP?pͧ+{}k۾~ped:~exA2H]"݇_S`V_v%4) ߞ-aOH!2\]I:`9 ;n(#9!FW_)'OH蝁n. Wn< Cם7!u1h"jW?T|Q}PfFJPr\Q㯎9|t,UA[}%_F7gi&J;2P S€ 7羚 { wwKƟϺ=}+tXUg_~ֶ N#Q1祐'~ .}YU&}w3WC/*k#Dz(u[}%1 A^Z¾(ZDU4P׆%DcRضxzKӳQB p(եR!p"\ 9!;H!4&.&kD稭iriIh/dOTt*TWnJHGu{z+aSB\yw\ugW~|o.!D;>O5 ~LT1Q-= $׋'o%tlO͟.8ΞݳZrEߍKxs(9\V| T.HFo]f:#~De$? &;!2_9?*竔lI. Z尘D"SUmy q; rBQQ|3pgU@z(x"}"^w i.?}}6Rw>aĘɢgY% mB'ZRa^_<֢/6!ow=& wӻȧ{܇ee;dw'+3`>7~|yW]Țbh){1rv雞*jbao4(9υUH)v$'_v Q`K-3fIi\) 8`i\ ^y{BIZ:AYS >2>}[`E_ּFR9T"_)Fk^4UM2fCyP@P/[^ r roY g]1u,'m;g>p}+^¾h"N e[`3q2;gKƇi}PqV" +yW^ŞԳriK{|={ꏹ{w٩ҿt?A_qe~>q̫fa=f#>ٗ2q# ا3`M{૧#MuvӷijLץq}KNu]_3:Eo'cZ{\8~0׏y'Oh C4v*qkD$\8/,7/Kҿ_?\qy'לS^ⲏښ >}A1wm!b7Q2f#b3-7  |9P@Jw/>qǥ{`eě*CE/1}axp}mf=8A?gTƋl+돹Q 0ckK 6fk./ېQ -=61-m.==FMz{x)5xR>3pS@wWQZ9khYV 'N+<><ԁ @a+ \ps©F!QTF lt 2CRRهCP;*YOQTهCP;*Y/8V HI}=*`BqAtȨ* p̋ vTgdzחk,<* }kh*0dt t=Zg[s7HP¾PT(% }I? #V@Oo=egwrw هយ}ﴎ56:4@txþXޱŶvz; o[w7_jPȟlz.[~_ U|ف%%gn!,*c|xN5>tlfљS`{ڧj~kG$L,`Eãu4ce#o*A!H DPP }Ⱦ9F  _zG3X, ۷F3zMAc^쿨@F 2wNO΃`b~_<1j ܻ$&DsTw`W|X,}dC?٧g}E 'kmU]fc^  B(`cYDr0GӤ`W|X,gƪ|F0Տyا@>\\{Yv:fsl?Dnj/Z@|!1#UG96D#Yxq)6?*AtW4:: }CMVq :2KhȾksmx<*@٧ >`E"ASsmt86۝šKbhp9l7A֑`8 z)Ib2p<*+w/s|c>`ػb7 #VpT)jBEr hp8PNpo#Ȱ{px ;>*y*"}GY#{V>djc;8Yf 8V`P*KK+&˻٩wݞlo`ΰ>@{q{~!.2mզ)jOn31w+S1"'8k @1Kv kUg.?̢߇ޅ /ۘ\Zm?<Զ5]cC Z7*’RL>tC+|&\$QC~_/_'ȢdoZ0y{RZhwY&:p̛nI>o\7[ؘ4x|` ~KOԼk1n0VlRP!z5gI!d_6g,2*/m?ڡ)]^k?8*5w=ahutv`cAؑvAQ#!/6QBTXxûUWX`|m-˵{q5]P_,tk,Gbs:YS٥C6@ɃO>\?Dx˛ XTS Oċ㱑xp<>:>ݸ„'cHgYa (PhkxRQTHFd_F7cR*M}>T 9.@PNϐ 5}@۷Oƚf }*`G}v< ه vTgdz|T@!PT (K]Ex@PT .:.IC@ '>0&*P k(T6e^Ⱦ=FY65 #}d߂kX ;+ L1NXc8خCc;Dw7싁^l۞hglg玆u_p z}'>h%k>>}̾3{;CȾQa_a<ϻz3(uO115^ g01θ\ǒ}tKjϰ*Q^ &X_R)s5cU\טJYeesfC`<ǦykthF6~==>=<< BAKb mdge-s\b7n\&]?dBXH:3_$%P~Voln`Akr*}%vј*X*]0~e:|b]x#GiN&$?R;N'ڧdoiN$Ţ*)X ]հ&U%HIr:VmNkڰ}P\$|+Cmd9fĺuc*cXJd3BwSI{*&|W"ݚd5}(S2nU%vOR"odt!, Ըj#$B$]I갪 ]6]ql AHX2K 8>:[WC/>$7\.6>}Ƭ蚢UFZtZ\]iV+ bjC]f))&,s'fJ׸1]]kmF5Ԍ}C6y}&>I}5dJ 6jҌ@7TGeDӇ@6WvWttFc^~ ca+/R اY,Be MP<}ʲK"`fIcy2.j i% }lSvBrܽ,'#mDa~u^ͪ|33klA⮘T CiFR]usOqI}k@2k|n݌}܀T *`FlFKO,S+b1O>}H/F\ϨB&-IGBdB0rWڽqr+g2vN1΢߉'LyGF%'%/zh<ߗ*,y`4 oF dgѫjDb*+Z=Nb43´z _ *'CvDVtjd\<R}WeΩ7Ü;,jދ vmӯ6MVr9y פ +G"SQl0^яlzkњu:[8ӗ$yT W$x^l I%d}aB([/Z;P}B~ ?<^^z]뵎w! 5EaC/m?ڡ)]^k?8*5w=} )MdjXTXxûUWX`|Ǒ}sa¾SOvc.e *? sF }~`g5`}m@ڝl~:*><')%FCPd* Q},]"0YT(0{;|~_IAP*쳣oÆUF4 }*`G}v<ه vTgdz|T(EPT }@'sU8@a+C@k $@kРkP}=:ʞuzAGVٗ?ZfWͻ,6={  gwrw v(8ɫ5U=ds>,\) yWQa< W0zѳq4LMMMƣaWp,KȾoI7m^\E}I(Eãk4Уg\d,UdL MCHAyC[C bP`1c_gf]]G{zu}^{xx(ǂaYI}V |0c_JL)rT-p1!(HX,޾3_$%[VoƐt״a xTS&BqHԱ<%a]#@:!I=3eXMg:^fIsa )nt+E웰Q/lj.ܻTRK)H҆PbxΊaܖ''.\$* .5LHQuE2Oonj}76Agjvl@,c$UdP8RpA=Xph /bV1pDC:/. 5ɦ`S9ߐ] mr'}ѐsV$O^C15L}ñEhX#ҐMkA5 _E,> !MѾTD` l]H0yLg8C]|j頣qb4.G 5A(s}繾/GqEpHbtȐ}IOE 4ӳ/ZNgQtIQ:cL%d'[Cޔ؇#] ǐ056jW0BCNiU]*8Ӑ5 |u:h۝.r ꝰ!F#. A/ncxհ"w[x1/̌Ge$>8L?ͽg0 װOf `4 O!j IO*AݘW&$Tޮ& Fs8sl["*#z' VCL!K))bRg'(ծpx$0اYՀs4X`K 5S?.W;\?=,#hRlgg!VfJR3=7Gڡr3r45  RM! @|utC; ͆ψYC15Ll#8:>D {#m%κ'9QQWWᬓӇU$=]Ȱ{pYR,=CK3sg>$ dZؔZ>%S#s!` Z[eiieP[!6",s֒mU%DktV5 ҐPM9PR*jY^fE=3}%̉d8yL<$[1>S%D@K~DYNc9 HY1a_ FFȾBXu2dE/K;JכwFOd_ [ o`0SkP!zB)`} c T@þutv`# r]^ǞKȾ4аt#[Wkۛ仹q5]P_,tk,O<ٷ00M4A' }C4쉰k]Ӽ YcSƑ`<62GDzhWxx|,JT>;>ciQl(C@g*iه vTgdz_g,-* }>T>;l\E1MT (49Xw|ot t=Xg[3PP/]~gK[KxX)yf=g wrwli_@\ I Q [M F$WjMϡߗ*y}ƽޚ\0öѳXFLDx, ^M?㚟'c"`#}bx0ll, F|3uvauX__P(p,ZtWRI~oف>3d+|_FdD}xfu#\|\3©=}ݛ˄u66wΒ0{+ &i7H&c ZGCl߽;c&H$'bPh&`_bQ%RK62!nReP[W *XQXr:15mX&ƼBEGZZr&c7 rٗ,DLw ajG#,y|=fK 8>:[Won$>5PtTV>Bk'vX4*# Ԑ0[xH ǐ0va6JC6+u^pm JňJPݼ ʦǔ}s|0711f:fhWr:P9$Aj`!nȞٝb T!s̔ 5Rѷ>|!2•|HĐ} y@ Ssh#v#4Y]եs; YS Ws "Gp8 b4 ʐܮp8>>?g_  <~ɻ)J&`.GeDӇ@Hʔ}j,&?e}W >iNh+M 4,h¾`4 < 11!^>w"oE= &r%F<^w4}klFXO'~jH`cGyU}dHW1^3+4pu^ӭupeֱud_!ajmGe)T!mi.q8QՎ g>@J$A G݃΢dzd/kλifЅ$K| X MOZM?#j4` Z[eiieP[!6",s֒mU%DktV5 ҐPM9PR*jY^fE=38}%Ud΃0 'X`120n/OJ^&B"'1ozYn2K"RkA6ac25 bQ"нĀk@7]R )j"Y"%bm^Qia!eӂ`kҍ{%ѫCRGK/L"pa3GS83TtKnfKm^} cjC~_O>U`aBٗ :!(|5Co3>5;J[6g}]9C =~ f`; 0DA6`_(ЗmXX>{㡠ka_ׁV}}=]m]._ww;r~.W$)06e:Ⱦ}ަٲ߿\޼'횆2ge[cQaQ`#썇}C6>|F}c@)QwJqv> <n c#cx|t|,69Ϟq%OBt[h)*@ x* ,p}>T>;~A9PهCP;*YE@g_3e.f%@[K5y%q/{: ^ vd52PY,* D"xO򞶌G'3p'ɵOW0e !wJTʃ.* fHr8PxGt*=Ʃ'qd?NSqWJdyX6jv.'`qd z*pH}ͻecUR"M!Dp܈i d䩝;ņc~%q؀Zbrah3ɂnÇM$iGK;OU;LၣL}b:G*%/R[dnŃC XWRtw +`+.DPOb7J;ř>p+[D*!Ⱦ o1Z[@04>{|_Obo:BCA˓`kZbY1} 8E>2iVx)^UxE f g 5|VK-ށ,/[֠[Nqe&t>e6PE+ց~eyf o[w7/觔i+Bd3S%.} gx|: 64:uY62EYʄP}0Ùi0MMMƣa;<|}@6}'gN6G>7vQQW}cqX, <ƾMJ >6X( )&aȾxw[Sk9vyW~$\j׮:;RpT1%8˧ >;CS*%|=fPಬ4P(XN3Co7c&C4 W*4O2&~2EI|dkRdúk_枾.S֐V$Ր梀l&²VcII't 'NX.(־QK7Cx&cS}SԨi48ʱURS SA`)hQVD |U% P xf/Xf*U6,1ZSm8D@v=˷7"ccqgK)4$O٩4.u>Fz6@OԳm㰘կ!!^%R(Wu)#T%et1b #^ww~_0uyA}m S*gWeܽa[WU+%a%`Km.|֧\k;? DFERRs(X9_k8\T(7AZptJ֤Fs|l [麦o|s:[hE;o7hH\TDӶΦ_S538ҧd}:)Z 5=F`HX}H@c-}E=@c.S6>&eq1~9L a;.px$0r>XՅ yO>hh cs|%՚HDƥ;5 1q ( a᤭%1Hk&%W"T#3t(TPd%L<0*8 fսo㫯]p3g'jXoHttHN%"}{0UҶŋPIiq YSkt8*۔@W!BIu1w+\4 S0˝%)x(4<28klqC>度5PA2 G{gd#SŧR38D{Ț-WK w$g(\55pxSΪ{C#U]֊`{޳}&tᯩiԑQO/$jڀSPI}0 =V FUVZMLU1!6ચm[~C ΍I5@&!F9#7FS#ipA~rYuoh$p; | u?'offFӐ~0zck*Fj$oaRS79+e̕y\%X2iҪ& ! D*qX%յR:b a1YyCy|.rCOg><ȋlv<>j_]N5mX#_^#O5ӌ&xRY3rMV4q!&Gq>;q˝Fc^!JB6ӵQ"] 5ÊKŐ+ÇB^i/Ley8ԓ KJ&EnUY>)j%NJ~& }cf Y`UW,O !gr}f1$ 15/4((ڥtӉTfXp9GHF^ UXhGW\+!4j*8?=5V:M oH̷&m:=-}W/]#TNZtK6WK4Wdo44(|ij)~I;7}G)z-5.<{̞a%ߎ.,nPv|fӽށJC| Vuaqؐ_C =~ f` 9DA6`_(g/2>Y..M\grډnH],fa_xq{{z\Qul9v`]PHc3>,1* dV ܽMw=e}Uy횆2ge[cQ>tPW@þ!O|ކQXT NYڑ}x,3* E6V>;^?T  Xg[4P微PwPo..Hg!LyW>P$e >A6?Y>%_n:VxHd f9߶ʣ, /,`>Ox jMi>&n:>*zY;(a+K,Kfmq{=uOi*6Dd}04Lv*ChLxyţaL*IJ/縀m9p^hq89d|Fnj:G>UyŰYbľa\Hݡx&66=Dlƾ1HjP`I>)@KY2ƾax#V{b%kZN<4{{g|-(so]htNFOOSe֖'R=gjG/UG\j.;R`!>~$e`FG`샾J+oϲhTZ,W(Qv] &Өlhp7c>k|IUv^jQsA{eV_Se֖R[#_6 ^v.vfo6 0cHN_Vrg6 BDgVq~8"4*Mh4[79؆h kE֮ihXJvPR*4}vl¬!#<y,g|znoTMDIpjȅY9YFg7sYtŖO kA#,cߖ7 ,*NaM= /ڕU ϼ1fcgBF˅_8zQrø`u-*%*hW>/J>áՔ},DS49JR : ŀҀs5JYK%'"k|?L(k^V;}Dgs]f^dQk k <7,ek^vC~6`pmn3ƑJK7F41R4}/ B<%WRїFG}61قTYd_w'dhU85⥕c6}ށ}*縐]+`6Lv&,c߯^0#3A5B>=@fArp}okγVʣ,m/YLٗs\QlhPHi|o__w{OW[o 6r]3m * QdϺ/X}T ((@l>T>;uه vTgdz|T@!PT ( c7qV(^yoPBCPT /\>xpmĞ6 Il%+7,+expSKl8;Vϲs,Vųܚ_ާ?[}77'#I @P;)@3 Ғ0IENDB`mondrian-3.11.0.1-R/doc/images/workbench_database_error.png000066400000000000000000007555461261646570300235400ustar00rootroot00000000000000PNG  IHDR*tIME  pHYsodIDATxi$U]ju{/Y 8 ,;D1 # ~ DdE#_$`d R,`Kf3޼92'q%C(@=4_"F"IȯsvqU)H Eo&_9:Z3dSO5F:Oo9*rz9@R n-y*HS+D {t9xoX?88nj@^];NwGή۴kAp'W TȦ!@$k yN 4)Ty $9b3Y/s B HɆd :؇)#(Je}=8X'Hƙ^Jk)WGՋ{tF{0؂=Bh9j$OTwc|b^ۭ[nE:aRw ɘ@<1Lph;ge7-O;kqw]A뭼WhOϖo ܧWxws/^G~5d8T ] 1wSgU|O|X8vf LŲ-X+u W݁uq裝}Rڱr8c37G3r:^;nUpNw6#e", 2L#sRfD!,=DNqUgLH/A ^8]q:8ɗK<ֺ,0HY>^9(db I膳i !- D,v#̦7}~yˁcIS$@65k/g2+c.j {}tmˆ@²^0E1!4H rم0ĩ4F c!Q&n*ްkJK 1F%2v{;<MFIocynw;13Č،FNqV0$JR d#p)r6fɊIzLJ]ͩV{ c |>b뤵)m"4[r 6jֆ')p(jz~2 Wg  }U5rMuf~$j:ЧQY >ndʪ΅?=Pɶ0Y'A+ 9R'=l[C(SAzaٓV2a'f_!8YN;餓N:yɺWߕCtr MtM.q/|4UňmzP.*iWeW'KK*MUrlጦ r-"2Ă"d,`Yԍ! 7"hd/;A"͢]e5DL ąD=ݤ_lAU-$gԹo[Q9>Dge!ze>f4 k\CaD|-=wtK-@&T0%d_wp< 31Nvk{'!GAhV'ŗ5YEjYCU JF#|2 zim5jÅզ+mB $U׫,i8,wY pB- * 5sF1y}yo`9K"T ]V4O rtkkV/8cq VM9eҖ>/TaA N tU0]7IoTU|^GP",tx@XA=kelqnoO`K0e44IR))!L}~f*hKO&atu;N_-+['W0'Äm(P gg4M"_qsL,)qU+4S46v/M(n6Cˆ qz9/3/岖\ S?SMboltB4K)Ac[ϗ 1 \A&2$+ $8HOFȡf $C21E짉覌bТb"ˎtU\o}PU:5я1"'v'|X{X 5JK{ $hn{uԽ!Um$(=4l0;݂5G$cQ4 z"$cEc%\9o7 YNRԕٙT$3-۫RZ Y%ƞ銛er 6l!dvtz5IjJ"mCJ}}NgR~m:4Ga 7êٳ f_*2r]iLA lR55;]Ivom˸v㣏)CBh?X,DZ1rB$.!,)b,Ú2%E 8N'fG&i,=KB@=`VViZWqhd M(zA<"S.:to~CvX4uL[6F2ǜ f! 9{39U@K'1!PK1<Ӈ-;M`8]ʋVX0cʆBk3S[eÈ\n|+*\߭:!RRB啟߷6s_+Dk$+> Q-I] *i"<MQ ",d[QX,ʍ:P+rے}-c}o7\wI'///fQ̀bj=qS7Y[ qg,8I2 !Y͇<+˿1ȩ@"irMUȤ}%\s.9熵k7*}e_o2z/m}$I-o䴷kGnyWcЬ3o}k6:IJ(5ՒEgn0c'3jRP]8 ku#-ٕꄩ(0JVR9Sӳd0 ˰RW+oI&9ڛK.bjԦwMoCҜeB"$ǩISFCPBu`745WˢFvHǠb [(6+fQ *_|$9ǩkLO&RHetU%Rfdnۯ,&zyN0CWL[Q8nxҪx_@#mjyOhAT-!^8_M+p2\+*%)%"&:VH7Js%2TǡBM~|5YT3G@QRskէš nf uбp 띅\j-vd9AG(> JX*:5FLS-@`I<'^tճ kOI7/m4#S| m{gd1*Z}׊rZ&YHܺ˲Ԉ%*dzD rp: ޜ8Uљ캮.9Y]]-q ^Ynf4CsJ呝 v$^1ay6ex5U(*ݴ1sv첡G9EN|'aۢ^[ՉBWlgΟڷ'lԜFpEtQ9rёszc6/,pVT(K hҰW+) \@w6#4+8YGR Zu=d4ۊd*{ MFYL2 Ȇmg=%Xfp;h#p;COrqD}L\k_Ff$@ T &Vj!ap5lhpPȤyAoQ3$GNDfz5fiLY6mHׅ_?ʻ׮=5Z)?K_G%%M11ҬNBp:BVLƇ !FH"%r.\o-/vlR Zs˗Rx{/[c}lt>vDIZLj"ԹOBJE;]F|l;c# f9)T8φ$ HI$_Tr,0X MV1=8+UWSLEy,1FXL1R48L@byƳU5QTO&G._Ƚf[뎺\|;$)8bEFQҸ>9 gTR ^RGjZ&&eٕʱ݈CN_X{K> bV3[S:Ӣtvuz? 8;e5k넊|-w޿'D%β#7Y u6vG3',7_zʢ8S֫cKE€Dpssn\w<}<؍?ĸ爩G^r( [|aoXYh:н/u}<\_M~=y o'^ST 9[z`?Vَ0_ҾK=~洹v>ax<˷7|Yk4< ~[<+M7u814ʪ2jCN< c`C%U~v7ƒ X559~v>2nzڹeHI?s;3sQwŝݓ_* Ha($a98 q :|d$@ # cpQ>`uG "c$Hڼv_{f 8l_WP7==3_o~S)4BAݓ "`D@="{hqK;|p ,'bAf X.IMĔW :uSURCU?-Z>lh:ߨZp ob.2<_ϧ7HpP;}4>9Wk|Y}ۏ%?5/y099-.:o_8lBm"\m`8&=5r{^R/Y}=ZrfH(Q ́_x;k@=վT.=w9l+-N1/ = >Fq/>SKҵkiꨋV}͟1 w?#; * W31ˌf,՜Ҩ(\ӯVݯP:״5FO^&dskQӚ~u$s`8ogXŞ)6J{<RɌ@ebSMKHb9pK%isIg{lc(4㢚HZL pYǔP˹bD;#r Q[yj% ;{)7E}&@@8] w$d^C-9aRcᄒc˕#eSZ{V&s7J#j_r+8ħS C$^}=ҹ 8ݼ;@ke Hv_8~ֱB8V7` U|<>+J0Gd O<(D>;|]fS葶E`JCG8 av״\/Y3=>"HJ"ĠBQڗ\!DB4 GeTXXRkvפq%B44 9jH)b9ǜl4,\BMP+q duQW"QoJ-@0HՃj<` B;:φ-y\\݀ HնwԼχ$ljX8%@Aa ln$P":x&KGo8pJ}.l~a/jZӯg|Ͳyl>L&5+&i9Y'm'ɟɓHI+o儅1A$ybn,)KRF.eXĴXX hPƒ! P̌d2Ѧrlƻ0갼\[AlV0m[6m^ r`aG8YL\bX];7=: i ~we L8o?+ }^Ft/~h췻'7EJh6d~IO/5QW/[gz.r8V:_v?_51kơ>Zy\j;p 71SE'`7{]t) ba"}-<1 ˹: BcTu)Ponn62?W?=V:gϳoAhhx9 =GE?S`cODs Ww;pJE?dJƆ:>OGwG~%> U$j2" EȳY AvY@x9YClb_/HYDUִzUv>XvNli>+lP0%› *d b9N | ` b엲&qNoD bv9hP5!^(򶇈'Q }8*B)\}VDn0x*hL:x׽Di㙷pصʑ۽DV)S1x)<8D!i̗Uǹ zkXJ-{sySZZؼPGBP %8.Dfް /mpL8x.hS~ƛoۚN|q1ZH1$%%֠{|_vOJwٷzƝ(E&qCʆ [tlYw>3g'QEi7Faf <0״Exb'ڡVUϻ>lՙ2ocּ%NMhsX**Pgop1ax % fmt<= y8MsO(PͮAN}o [yf'Kh>(3%"8MW8(Qynӵ@$PXM$ס`"ض em7"#H^w[Hv?gUcEExӈt(Ȫ|o}c+/O>ŭ:|tZBv*R>mۗh#6̢S@8Ȧfv8zO{EBD9'1ohoP= )Xi(lxշ}8fz!1.e|noGD? OcKƛ|: $UL(2ln?-e #psOb1rm 9S+e! ISOjggkDVmݗ s5O g#ݍ :6\9Kv]e9(8@2yrNrӥhМH} @ 7R1@CxriAS#\kV80 6A0Ҍ#%<ԋT]?8c7a<']՞; h?K)mxf&-Pl^;ptʌX%֬eXpZhR^̑󉨎[:zQ \Y+R++gnz}kkQ8dL#)cW >T%_LbQN)$*CePOZ[˾ubOx=UTđ<$;'fyj\G~_uIz?՗mq]+^b Եt'ג.-+tVQ|~;7̴$G*+N)zSȩ(,Dˋ "hm" %8C`.vp;W̝3c"v@!PDyO"H(d@Haɠvlg6/޾~#+YeRZ˺[(&U:l'Z؋6#tx+u1O'E_V+xw9t?cVLy k?&?̎RFMM_;D?w{r 3?s Zg->H"v2D ,[WjfrLO>9Nd2⥙<]U~tQѻA.u1LEZD^J`l_B6he_oŗPxQѺJa/O Kᆬ.}aH`ƪ,pJ fqm LmmGfԬDs}B̈fl#J=IPyA+ '9ϊPJUΨi sʜp 1Wׯгk+ca8ܝƕOiu i̙D;ߞXZmwxNS[ОdJUV"Ce@~ru;kBewJCH,Ĵ(@kQ<7 rH=/~$qOݱfPU;<Ľn""XKJO#dj Gn ם9k<ςVAǐHN Ҍ鼘W04n8-08<:򢖒7n{1yX3Z᭹H.I>wv74Re)*:0?:-C/elEuʤBf3UȢ3Hu mc<7v poE[Eۀ/d|6gR'M(ܪXsCBW(%)(cTC󪐺 B>IR^#D㜁rpKn (oJVMhu|bSÈ9N0*-:Z-W,0 ' ک@ܚ_W4a3? ʲr%Ja9V]-0LN^GbVk>ؒk6A2V8>Ѿ ( 6vV|3'^ߌտ?1|8G^fȍ( -p:^8<<᯾ҫëV+K'_>YqE:6LUi^Zu,*J+=_y|opO_[ɱfp|9)bOA1IZ]2Tiwk}џ_vä+õ,0ۗ33▟TkJ+r(S\BTȮm Ik2#J8!Ó,%etv 𤭸8qV!^c#Qx'0KtZ&V@DLgַyW,$ؑW7. ,v/]g9g5`ȸJaWb#8hJ;jXGi>ۦ/ /?A ?*Ċ݄JnJ@׺I1,M)rT!>_ScKc} V5 ;VZ{ٟ[;O_(+z%jȬf;/(!ϱ@{R {?xzm7-ky0~3R Q6~|2;96)bp|(+wAe 3_wbi)=SRےq:{;sB+<3~xQ*_ T-<jvY[)ж\ aMjp]m  K*W!k]t#"5TmWA]j ÉGQj^/F|A˒­Y倯?S%[ U@uQXkyɗePb #rlC?^N$%xt06ŴJ޾cֶÕT_Nn;d*Cqe xF`1`$XΓ&ԭݽގ-vl[?跐B3Hq$Vld1M /&,ct@ `?`g'9ش܇J_S*}znkV$Z+N{؉d?5v 13X2GC(xJR#6e)txDyʝg K!<#V^m~u\xR3cS l= (g)W0lz8X!|I\ؤ H8<{:y0~g,vJ+}XwMX:wW$kCiD&mz8 E*Q^|f2NhD#TZgKtB}{=boOgנX<ܥibD>yR+TY?iP:9am<iVeعW8F'SN5_sR#Emw{hx~otv]*rʴŠ B[|ɫ̒zTI,v>ϹTU4˱Fh4Ɗ/Ue C|r2Y[#eWYc`ܢ4M)4k`1O%Ln"Y1)VUdY5㐝{2 4w&0rUWv f `ML0$!!dȐHD(I"EEɗa– IXb@X̀ڗWo~h.Na_Nի=2SK,+PK6rwݲ@JA_ʗ˫VokkmslXgGg.UA%UUR,L;ƚ=OP%'-GP(Lr:{Րmpcx<\#VpآCe/ ?Ѡ\.s[%/85|+1"C e*hV.֦ 6=5 8k*n\Ӭː?JFZ.'i8Umj!/K3U'UED j-.UjnZ.}Ϯ٥U%dڮԹHYUFA`TQh蘐TحTqEgaùFf\ *{)UfykEFs"څl5aإt JX$ rmLOh&)8>BsԪjeݿ[{i955Qq-gX6J0܄N)gr\xw]N_8~x,2<فzS^qJ?J9mKK 0vע@cN'9NnR{X4bk{U+.Silr1'(R9u\^Z.s{=B83nʟc/U՚E FqV*$䴴ISBt5q.tTq/ޜqjamPݻL⺙x\dMˮ5E|1'R&qbA- ,sN%嚽Dy;\2\rђ0(}GGGq' +J>1Iv$g0v].ett/O2r #F%* 1>'y 8#ƅp/ql}$Z؝اkG>b!=2تƽp2v>er[i#N9)1Ә0uf1Kpx1-L^PKw܈<) y;k}>w%kjv4jnT՟)QɛWͶh~v6my͊VmTvpz*io82048o4,Ee2 . IUʮlG @9966IT9醇H`kV* J ds9x>C;w.nG!9c0V~T\EwpOpQ<1(D% FL \bUӒië82p N40"X/Ԉ{XBc!.q9Q.wV0Ze a'K͸ 'HZ$ NGrO C6;]k0Dh8Zwww)7 g\%G ------ϑMLLe]fogc{v8^fƝۜH'Dm^',]v⅋2ɱU}7|c C/G }ݠ$v$ He˖-˗/ڡdp 轿_s=#!۷yX;:::.O!<ʕ+gy*99 0ᡧzJp8 * \ Gvh p 8;vlb M|Ue V+Ya8|eˠx@򩣣tZ2FLh#MԜ9s^x\M6q ] ##pй*pD Ĥ$tO?t{7E*C$YNXTap@-ǾT; 8 aީ[_z5͂q/K΢G4A4ŭ|ɔ,, l`p`;f3sډWMqmU*-x7 4N'xm֭h'VK.ݶmx$2@(pm1"% Ȃ)(p* /pPB jT=sk׮ 7n܈Yn^ѣ 2xN%?!ZÚA`+N~_k=8:.& iAm.[D g}I\29)LL| s,_b(sz7o 3F&9%9UmqmƵ7HIA1ԻTJf6,2B['>|D\`-$q(I5e${Mi$m8q7k܈اWUKKKKKK`j!x$\C tVjv3ɤ)X_{ڠ?K/R)W@䨣agyf…04kP@/ {W%5 ZJXk\)PfLR_A`˗/b"L{챐%ivuAׯ W.Yl͛;:: u<|p Ij cDt3<b#iNR\w M/2O?}ɒ%>ZPqq믿KN:g}A38O?4"BqYgѦM1d dP4Myp#8+W|ׁon1衇p>67l@0h|[?.O < h[;n˚t͍:dָ}WlDAޓfN10`ܶ6jHZoV8}SSN$ !^%Yqt'+#R '=#R Bb7IcV $MJ^.~P+#%{Z‘<5A.)TU@^֜$n$V;|IPu͚58v':‷#,0/~rK/OY JҖ'*CSG)H 7Ajy%KBr_8/JDz.4Bq9H0‷$t!kiSFGFF:5'#{qr(ntLmZZZZZZZQ N&UjL1.аj*Xn]V*Oozp/2Xd`` e~̔}ݨlB:󸊎?\.SOA0'ND?fZr~V2ga駟`Ax20v8\X)gYé+Y#B-OFU-6l۸ oT3PjmExl7FP+'9 e X@g)_.%:.U;8/5@`D} # bj֭ k֬H-Z7m8{gAVar [KKKKKK볨'Yb!`@`V3(gΜщPPvBdgzHR0v!2m0>^۷o?cS./q8|#dǠ,U_|KA0CUxEm ,x'kv7n׿~" )…sF`١ q~A7RTFG/"TJ >oN$N{W0^|E̙K.8 / *p#J*d n<*gMZV"=mٲeŊyeGSO%%_t{z`-----ϙ,,UHV|jrH?4.]d?[Y⁽0;~;t"iF/)G;0{%0 ]t)|&~O^#x_p^vg'۲Lp'61B}xi k\+۪ BHeyڽe;B]~ahkFAbˏ;8zuVe5NAq䭷o|6<{0|)lu6VVYRJ WF'-[N2M@d3y쑵ہK); Y\N_vx 3)}1a^BA)B-;< fW*9lI ʜ%;`2jX}q?O~[ٗ^֯_#e}b6ZZZZZZZ'+Np= R)Hzd6 <nٲ{ho}M{9`ōԃ/AHW^j=ؼ YWXG}Qz7 O`P# ̖t =^P2,z72.lŊ ]__x.2nUV꡷nڨ_eMx…Y8JV\y饗>ɍ7|G8V2Ϗ>he%oe?g.mee(\H%###R+ š2OV*W&1zm#>s:2)pRؑOif8cx[YN͛7/_|ttTv`}}LP%l%m8Xsyt[Nrmde#R!O/$?ZZZZZZZSYa;+gǞz ۫>2Cr"]#p"yng&z}40![3ejU g}L3>mE2 :e3aenN]F]L`t/ l5_hIv0̒m;JðZp!htka2)?E#%,54 p7G%*RMY ݔ`){|j80*YXg;[% Jʢc椬S!ɲ51>R."|gd6#SJqPp y\YONWx@dzommZ:kiiiiii}n2 Lu0m,YӭV#;f ^1_8lww4J|$|RٰX2DzLwOKKKKKKKKK˴].m. 횿VsūVM#;1j5 ݆Xd[yz:c*ћ:S.wZj EMSu(JApgU.6k.U%q9ӯv7yJŰ,P0j-@m2vLp/d!XKKKKKKKKP5 r,en fمOLjF4PDA]r{ވSVXagXU-( Ur(uhʁ`<5U4t{X6;-6)k>Ϭd l`--------CS xvf#pE|@VW5±ŞhHCjKbXhvJ;P <rS0.W 4}lYVv @(ZZZZZZZ`N04YQ%;{ V ILfD( f^˕cX>ShiA?iCc 0r$Vm"2MnVMMM|e

wh2n&Ѡ#fًxϟ>]_9JF"rpPjx_u]w]Uwn*B>UV*ۃ>5Fg2p(%n:uuutt0s9d=|@v7M׾X,v@voP+A{6H$ry"%~ ^6nUp$}iiiiiiii*O6^/M3`8޶~֮;;ڻomk}W&%U0`t`^+Ja/ d}<}f.oooA' ௩ 7&''q ;a'&&bY0%}PKrBTRf("@Æ.cR4coz`8e_c;? 8XWg8TJW./.}JvPl6eʌ/ *%O?réTχI?<6z9K/.Œ:mph3L:5Mx%W-ZSH&Pꫯj4,(UH +6eYY2%-}a+f1oRNfaG-W)IYI d*AE!8=FQ*RTdvĨ)Yd ?Q NPUˆ/9n+L[.b47|շ ]D hl5pDjg]^df|,_@:I99FÆ6]ѥG?R8:OXԓ IKI9?v '99Tjoic*U*R@wN/]G|fʔJJpsXKKKKKKK!(woQSgX.jOA"&VU+lnna_" |;)355D+J5rgUW*һ 5Ol}AgeUhjZ͚?qeSUjPlޛ:p{]_@[5>Uh$T*ղzdwղk qyezmYXXI~ dEo>0Ԝ%M48N!.V(k(@/T)*PlenxŲ VkpT㓓B\.ṵ,&sI֪<2c╖ʁ 㤬IuW(&L,G[}Ԫw Bg -------%02j.EdID"bcDp)H[>5 #7tᅬe86lKmoLgTA%CP*L8------C]*Ij/hMIcN7p=k_l< (#/.ie՚]'}usCxLM&'cDV/pNgԧժAU.W\quvDm۶577 {yp phkDCng*B).qafѠK\N0YV*1f)K []rm 77[N=OWt{Q['X{anTwsRɂ=۶и 6fiN!%5vk=[Q[)2ޱ;5:߿L犹jŚv?xܡV߸wU-~4F ou@_g5S9i_Z5aD'&&,Xh" .plx8 B|ƀ[}ᆱf55xΉTjCm<msTE?~Vq K8, vш n@ l~뭷x ݾ++W?Lc ud3$;_g/mR)7~pG?dڪ5?nO~ {ǂ]4-------CF t3s9of͛wWl-{Hx4%SҜΞɜVKXvDgGgX5}Gyd8d:cPeU^9\XnpH"YM!d2YTh8|djܙrQE.FlAoo/tuuuLOO/]~da֎ebJ,jyJ(V3VL[S؎A?ڜ*>e9٘WZM2}e*[jފV Iˊmm-?{{a*drNל LMM1eC:JH#@|͋/x'o޼8/~k>t!uOtSjiiiiiii͢;LUcZV5Z}nٰJY fNWA ycb Emݺuy#}-\ kX>u>t`k62~W\.Y .MsKЛZ̮H iy@_#2K?ǟp$AtWjZa+3YfŊ<*wy- MMM{]777ݓ))100wUWy\&5F@DZфZ*0 `D?1%&61Plkk!6US*)IQ{~ӵson֜{>g:k]pϾp˴[.}rLU]GApm!4.HC=zh01<RÓfY:LeLLLLLLL?m}hR"rJwqGY+ m_67uAuS?ʳ32];#_Da hq@,o\f[et ? 711qa .WhtbFHr`녾70ueq8tI7 d?R%|Zx蘄E'E兒,ě=i_k fbbbbbb:tΑ`Ir9 QD]וR~d CPV8=UC&4 =l Q͝:Ѝ8{7?䓷rz'(q ^osY{ N:>o^}O?ͫ>{"bj7 ">86""}}0(p{5?CT7ggdmz@ǎ}_袋LCc вU 0)J|4#g'Ng3'{=grrĀ#3111111n1mMhP(*A'MG F_-Zb\ez DwE~˴Fc~E \'$!b֙LLTCEaaaoe&633S. Arɟ;qWO=\s J1a}0B=quk11p_h4` b?xp$1. ! k3+++{jſŻ'O™ b8##Ɔwr08|`W_軃,_O3uןtalk fbbbbbb:tΑ^O(N[4o?//Y'~zf<ߘCyLMkk+G_Zdvwn~&}חNNMM{G{CYQt+tUvXGǍ WaKK'Nsoc/xUW嗮g}gܵנ4o4 R<@TE!V199IHQ~i7̂ {Nr\ p;(5s TU$!LIRDGkU*4/(Dt6iN7Zn^z^xV h RK1㤒`bb`vTzW.H:  ޲,4:}0 0<KJ:"I۰@)π30ݶFLLLLLLL?*<_.ီ Y:#{K^t:_>~]ӪƱme3H0˶E`vX,ڶJ8Wi;"UFnhRz3U e1.F3{ljsb>EiZ4P wV{J ^sN .(8Guyyж2Ay^dBi4Fv\$ǎ{&iNEk@Ťypcl fbbbbbb:/uΑ`Z8gjyiNsv:K$x8*ݽ kiCDzM8%I ɩ*_dtuR`}2Fk0Pǀ" fff^Z>yD7W*f{~a/xF8 333+++SSS@0)L 0;`+:srCۅpIF4o6u\Z-%O&[qz߼={%laL 9/y@P\.Ĉ}ًD31111111!8IQVRR?7ĭN)k=qM-[j9`.3Mc0+ť㳳8_6yɲqb@2P-$IAq D4mzg(~e4 į&iFB3snGIsss~_Q5 ( ,8y˲4u@RǩKK';ց[0== Cvtpj2\Noanwmrso$`H9ب*+ ,l 2mp"]yAgi htNGz`U5Ei<\g*&m޴f!=.(sAeJF&0E82ZByw(rf GT@f0Zeanqz1&g`-p\{~~ð`,Ku=[]'dP^1or^gYfeYfŖ%b% 17 b"UմNkxpӚ.|={'Wf9!`ž=e?5Wm'ZIͲD}c̝ XaDYzl:&\&Y8|^MNmhxa {VTj{iyF(-_؟s B[~qɪtvv48"\d?Ms]W۩=Ny=gYfeYf2.H̑ω<Ɉ.MퟝŴ/e;ai"WS-;/iLVXMK4q݀(c&7C@zů)}-2$p5C،"cx3YaȍFRD>([n(U͛ LQfW(dY@cjZq]ׁqv,Qr'I Hw;/-s CʲX7ggu?fbbbbbbbX'|ʉ)b%hgn 6@vC*'__Q6LI,* mT Wsa&@T ʸgiKDp@~qhqp} +;t8T0k۬:;@86i U`풂z0h`HN~ۅh]78o6(V311111110R XQ ~l E|Lm`qԢXow_ ^*o_8yI1{7p]k]Uޏ~<챝yHHA"RR@iEBBO U($4MF?*EP UE%E@P&uN3cy?fs؞$Lsc{l}sf{>k}wu>|-Tfe'dH, ^dPik( ̳(405`Fn Zn4ӧO<(f8rqF(QD%Jx%#6&mjJ( ^b(w,JeIqljyբ➙Qiwq5=v/o0)JK"Wk94vdBgX /~%J(QDWłYR=$7ؗi DQ- 3#}? YZ$ ^z넏Mm߿_J{SZ+.?8_ŵ-r%J(QDWEe1[XQ @iO591S)Z|奵03}(ȃgmFߎLI%J(QD22MPդ#itH0ª`Mtm$q˰1zJFQ`--F(W:yp[z J"E)RHWEQI^y2N(o޺9Wf@u}TR1 "U!F bhpuJK+c?,/VBE;qRH"E)RKTכjAʫg8ښVA9R,o=Zfy^Toh+n1^hNZ9$]9 m[ֳ_|ՙԶϮgv~gߞ˳:.o`O IYS+w5]/Qk.9LkNYK>϶ElZ( 158Aij-bяJ"E猪Z35PYb̌n;&-s jZdrBX +B^Q9A4Q\kIS4eY0Ep9/Cqy,ʫRS~\YuKɅ̅X@ {.ip->!. gK/k,^wG9J8*P9?G\ԏ8qjaγu4u53|7MZ֑&Ie j-L'L8ˁ(̋0UJgĩZUPjhpѰO0-+&UXiGbS(*DUk[p EPlx l(( (PX@ppÁ4,ihX2̵hBR7QJnq/-Jmxݱ< ~gN9L>XN94^VjE4Asg"4 .^ EDSF4VK̀wy&;].aoF|`8-Nkµ{6hWѧk5äUZ#g5[g?OHh1+Xϔ:O W'\KB'x!unE 66 vԛN*D׌3 9ӏ'(뚹yf"5tk<6U^~FE)ucssh۲9Zd̳ܲgM[f_>׀؎0ػ[> n|y_3v۶mj]0,5R 0FVG4UU_~Çij&8Yі$QhSʟed(q:M vQ" y>2.݀ \'9H䇔Ͳ|eٮ'R/R7E+!ͲxT uAhL8慬mlEQƘaAyׁU9@I%z\ׅ7]-̘ `Ȱm;h8DqvݏîV ;6toߠBȢ(ylJAMW)L' +^k/y%&DyZcimMMHI9bkqQYj@34D>Β&&Ilfe5pNܤ\&4&mݞj`Rb$԰_<٠5ȳ Y?Zhvdͅ@'N)}AM ƸO6͙>"SW1李}zK}~n7g~yy"Zrɔ[ӏ%qj:8u]ð0EmD b!(3i*oಧNMtC ;ɫpip4ѿA Y ເkܶd72 Z)ϑ] bLgY:U14:Ѿ+ܫ!\Qp^FG`'׏C\Ch,f#` +JA!94z@4 Co7[mʚn\0`Ue͸$(!jgj~hVEAj5>i)[O/O.ImVsnF*c@4 !9K&lbK9}cG?P%P0 V'~>d2|aH%/m#1mzd[nyoyo '&r .81wr,:'!|],ӝN$qs'FӀqTÇ</ 3Ԁnl}nu&BWRYN'AH9ܻ l2dE_tJ{0N4\gVbjxV],Ȳ ϟ8 'ɍpw_PU9"/t *E3 v]D\ؕ[m4oIEpWu) VPk=Y R ßEdqʬI+u!f\bEVj/`R()PP1"FR~D ܅Ct7iEVzܨZ+$l柘S%O=]Ξ Z:Ɗ< C-S#>kI?k@)3G!EV,g?a:T ?~4z;yRy.5!a"8g^0AL_=uߒم,=}˛{>]V+EvC7Y!Z"%b Ke7zq$M8ۆ!ǃؕ$bQB/"^~O*}146-k!ƈ*b´`nz,9*$4-VQ݃dlMSH8KMt ji cL؇oOu{bb%g±0gaꍾYLEQo'{ׂfz5 AN bRUDY" `pZַY^qRU{z9sUED&5&77_cbF1إ bdžΜ3g#1gͻzZgZ/ fId}wv{뒁90҂VGP{wnRH0,7!9w _s?"En/ᑺ/LSn!j^IT xHu_#ðxIQ2,y#/{ݰhؠ 1`C/5tiOxO*Y*UɭPQuϬan*w QϘMs6>"RUfs1}OX۲]+L3O3(fzYK_%1^ q ~Иj!5yA PbmƧ;)@ˤɟ _H>BE4=(˫%{E<zA IKM +5 ٞ[u+r3KCH5"i֣ m] \"G_'<P`)eZ .Pli{ E2M ~?"mw/oy.'~?:_ϭ[{iQ"# X!M?a! > N 4 f,$Xf%l3(jۺApML 6js?_V{wu˟n:.4h6mN.K$,7ݻ?=tBnA7o';>胏a+HZ8cpA]CH1l|IR$4Yi7 SXH tͲP0^tq/ks,l@&6$ uW^E..5wYG)lNs<ȖaѰ\0J֪2hqWN=,E/JΝ7vC Q} CiМJ￷=?XΤzMwպŊ/kQWaPc,ǎE⯿ >J1 AGUف|- /)"CB٪};dO/O ݐ!ϭ p0WA =<H( ΰ*b|r-ݒc5WJYL$ݣ ?O{Or\uXx$ ( bkLaD","RRkbȱ\>7%-l+2'R" k|핊lkBfȀhtBƣ< (4eKHDXW4"GL0 gҤIx<ݸq#1O?e閖ݻwR֖ݺhq ::jOe2q3f7/˰CaΓ}}u'dЇ"G>CF G΀]W*EQXPSp)DqqY7 *g2.?Znݺ3 %{a9qⴧ~c*5%ȩb10ѕk"`${τ]zsCKAtwU###{z$D Ŷlj|^li a`)C3 ' bi)~C-b(Wt51-4LI0{Յ arw7Fxc+CBѠX D"χ2sojǜU3|/m$ 95S˅|1H Z͕a[o%A-, HjO2D ʍ Z+腈260~Ez"0yM4>2`LjzħWYAr+b^'kx g?y˟}iE+ǜ8 OFRERE^]A;,A5[$T(f1tTŬAR|a& PQWe6N:Xڕmi3U,1Y-W{ƍ[ ].OZv@Hڢ}&l!Ǟr?v?*Hx_ GXH܇Y"EaamZ~(3aAБ9UG譈(Ba}$%nGI"r-iEgQ#Tmi'Օoo[qe=~3I+T,t#JE&x>?ِJH+g0 o(}:ŜG; ]l”3 E~W[,jXUh-jY(/n9#T=eP,H_/?l?* 7vRCfCj鬻o nؔ#Ώ҈iONqΏMr_+TmM'}4>mhmƲҥK>ǰBϟ?Vλi(p^h-2Mam{U_|qҤIX4[esfΜ900zKK˖-[@9sꮝ=x< /8e۶Q]j={lQ1m'uv4Dq,gO}ݝJa`9Nb6u.Fcp7hVTJ(v'b'|2LO=ojx7zzz.2Ȇ PxeU8q"#I_~9̸`FXM@ᅗ&O > ^p@x[TE=t:aÆ3<ulWW{ `˗/s}C ݼy3Ӓl Ɏk֣d2-ǎ=~|7ZK&_t$uԉV u8)q-VP W^ g y_ c9DpŊǡ/NoU ̙ ``L-.Eheȑ{ D5RWuY0 L>+3j}h褓N" # &&_FcǎmkkC`/*iR۹PZAW_})GOv}rQG|5BbI~ᅭ0'BqSNw'秺O<!b0Vlݺ ![1 9N%R=NA*GPD檵r{X+cI0/"Mh.nXcwFC%qQe 1VP$g9!DL<= WL&,hh[zE$BiDHV02!I|'t 7_F12_5EJs+&qLbXCi$&s'̺h|4GK2<7 5wq`If9?YӌjcdI'FfWp | $,j^M4/"t1Z3n\4a).;քa'p1K%Fp(*Kj:rQwUk6yL4_;PK}횮0c|Ɵ<>ߟ>DIwOw{/FFѵҭz*ol{OTbe^Uods3fV+U&CK`Ͷ (J&$3 1{2n$I/n!Irԫb|hS Bܹ̘6CL+ f_0{ӛ>9';XʡT+צN믾SZcSDI1m:o榧7b15ʕK1 ~yKڤ,0xa(%_03yWw/M֮X|ذnջcOa` BN9mx?'5aG{/_pyPǽ;'`O~-"tj뮻^~UpƞXַogg1 rdYʶde]6mz84Ee.3IsZqC+١&2L,^t׬g1 Zt̛ 7[pFWX])u1qtUx CaBMTD6L@!?8h&M0 kz>dPP(Bf/W2 /q;oFC0ZZҁ4s 6T_}=ڡ!fL;o\+c!Z*:g8UI) H"%pl̉c*)28y4m\1םCia4Z~m k+\ ##qX֯]_*Plݲ5M fPk˦-'xJ>wzA"tqI]vqa΂[6?Æ .Yq^{#u9==}0fV=q²<lG+uRԎw@9 S.B cB:{օH1r1GĻwiV.WyoY6n;ůO%3p=KhG jCJO@2yk:./`NF?DR# nnE ]e[hG[~r`// 4U6h ?o2aȄc,A7uyI={*L|$m;p˨1JX6-Oiw. o_$C5.aru/X4 ,*ij:ASBʕov4|KD,>R$InذaΜ9=c ̜9wߝ4iz_(iys9q Ȋ+.bTq}J.\d"J6}8q"2o/pl22e fEIi&7 >eVd ӦMCI.I#w3p ټǖ~:ϷpzuV2w܎!14oig~dbI-,zZhƲINHbZs%M0O=TDSO=D0#zӄ[,,p"SN;Zv۽G;>ܽpY E.N.8l* sLWWTí#FX\^`Gx\:Оyf#*s_*̘1Ba`3OPy}Ճb(eO[[_W4 >ޗeeF-@(Ew{nܸNA-09餓Ћ5@}wDzTN̳ay1aϟ5^{RC&s~{]"6EI֚ r菱0[(K="*u a C肘 \zAApsћ@eXT͈Bp*ܹgͼ^/.I,KSҁuzdtM?DWƤI'u]+^>?uŞnb4 0 za^ vY/=2UMі|+}u_͍Eb΅L;o~-S' A0\zي&3n]f!1fN6j<>MMsٶḻ&}>C!HR`df'X$|L"l刈c92\ʉHG{xU[2ɡi?ӧ$҉!Lџućb ˪w | ҋϘzvgG/@L[Fؾ]ei *4w{wmjԟ !!VKjI&sNY) FBBߓVo]tCAm*WŢ@ ݣBcS9Y33@EQ| ԔF:)TTjTtBW/31f[O* P*-}%Μ?"5*q ֈ!G}VpALsXjQ*`  C<y CID2 Ɛ~euꉧ`Pχk2(}-CVTMvK/^zƁMeM)D"n2p6SaPKb@oeӺ"U\r]qA9xv q5x8 0뿇r/C*6uiUz/7H;%іC0MTĆhuuD,Uʋ(Ky:j zk/UE2uR.%4jomah˲ u簎r.Xx'c lzw,t,wE>kE:vx i'O D&n(ڱ"[C`L\(lKUIB|IF-D0PCP(Zd wAkB8pvsݚ5}WٚV4ud&qޤY H'ֽO>m민 y呇^f(H5BiPakdd}UG9.ZMtJ{3Hm;eZ[RѸ*ؖJܳ! jݍ&1Epܽ###GzW+~sK2WD ;jnD4/ƅB! r9%E)F5!Dў}vM*c~^a0:99L?!1mY?O7>6NDVݿ[h6 h le(鴡jDBPkh׿/-vx_xnqDZGhrRCL/}lR6 ; ܴ vhw ˶ E',9pw䡛#x;Vd{D[TjB8.jL{Ow9 q7Ξ=;菈* h#k)D"`9kbGJ8t]#1 J% "k(?tMa} <[ \>ӾUX4qZZJr(\r!I4< A0C5MZn#s/F#H,*^5Z2YE4dY@n0WQ#h̻di7>cnxQC>mgbh>_loVbCζS @tIcrmy~f?{Ŋd$IHacFoiiGܳRlXbd[:eOߤ% 17PXhI(]z$BCUcep2g6mu 5N&g=̯k+VΆ%KA- "kW>u8a7'if&f͚EQ…?cӧ@H@[o.{ꩧXfv:䨁_~04pkTm(mYF_` 5agA#Zu w{i#~\oO>Ic-oX)nk;vOӐVZ2ac|=4ޱh2Mdž$MdI ~VMɤz̙<4>x,!ʢ˗bDݳ:w >>fYTCXLDIe-|%ӏ3 W pqr%嚯#f,"VK?`@ظ&SckUg?( ʠGGGvtw'^*?PaP_oov{._xȑݯ#Q "`C ]W,1GRX`  {yR!vW@%HRV㉤aنiɪvڴyU)\ݥ )U7,.]ܳ! !5""6#ZXQT(QIƍF% M2is}AQf/Z<x3m;O7,K_tI.ξhu3_~?\˵28#bIP$( ƅQVF84P iK n0P N0WRJwy{ u2k]* GGGvt[h3D&qo~AvX -vzֽaR,5%?hq|\7_ /^p񼅵jXt$J iZTbAJi٘>Ltbu_f'-e% k/ 1A&fg2Lo?-wCLAK?syZ1պ`~1,CII%in$OۀNϋs(hR"J(dkcV'0'b~W]XO?OsiwCXSEw7$ٳg7w|G[/pmwȪ4+d{QMSi3tSkmi{d9*qɮ\r%执V?̜!_ 9?aZpa_qEYDžrA_nm> 1Ydtl@Ǣ2fY%޵q[a>@P+,MZ oV^y>܋[tc=sv^u,Gє;?}{7X WshG!_f,_*_}=J- Ť w-󁫯j哫{끪7o먕L'P8k(\_f떭~@@=]=&M/~G:3}AQNf6>QM;,!ztKJTHrmS[)U4̺݃r^A/_۲G 9_pŪ'mR.V (!=-k^-62Iu}=/KXȽ}\u$-&|Xf >o3:qϮHkCBUVmg}/ $ % .ALj+ra=W]yח+{n`@xx,6a=_c]Rۿ7~}í_q>}H;oyG~ w/\|8Oc|>@A '|ç[}?_Y?L}'C2A_WۼQm(z5ז* x~oa}?y؈AwO?[_Ylʼ=׬[3sO׾o^M 5+|\%a++_꓏= t%d,?#M/'{S+J[g&kz{qgk:f{7tFN]C~%W?`_}w߇sw]&1jQDMT[ZZ2I2ajCڃߗkkϦ䇟 ` ud>/B[[K*A|q!>th4WzݥL&U}>j- :Sվ;]Ew3>|e.)$[z` 0*b|v"aۻw잷`n^olQԡ܃1&{m+ϙx.f^~A {x= 3|ZL\(_uU~Q<t[e=^„Ç GuR{v"@\6<6]d]] &EoL^Ͼz$Z0ԩSa>AmN\`PɰtL1A"e9&_ M o׎x?@UX:|`/cr ѐeظ F2jԣELV# );~TnqؖDQT)bG[d|J(U$Ap_VU5 D@^%E39 ;HIM`7  wu}{fBAD*  w±Jy (>rBfp_ށ g~IХ^mG֗*24ܽ#NSfڹkW4}>ECp\O:qGGcZ5j 7Jamh >^HVƂ   ɓ+H%Ұ!d;DvBB! -C Xvy'|}MWx#rExhHͶ`Xx8G$$lO%) Z7/CBk˶CGq8H l O:3?M9, EuR)"oэA!l:"=o?lnj>bћVajva " 89$,) S(b1ɠH,jJz<z뇾ޮƞ.lv׮]wppH$hi{I&Jm0 k(dܗe=z tiL '#ذ0<QAʂ-cOOOKKKD"h<2`V;*vX!ڂ1DO/U{o1SUEs6 @Dχa\Fp3rl6c."²X,/Eaudm Er8^Gv8X%gö\tlMV36CcOw=|.vO{;c>u-->BH,!jB5C" N/ $|8}PJ]Hȣ?(h4ޫ_<Ћq_ ?(}:::P] @e3Nb e"h @?{Z4C}C!z G Ю7<*{^g.aV9j~ wHJRI^OU,hސF nCߵy,Ǐ@&x]E ?m|T` 9 H0ªg,aX,^@d1_ POJAXj|*ɣF1Cf/ ђt)D j  )Mq4s `xӄDCy\g[IB6- *%m6h8{wբǻ>|ׅiMwi}ps_K1DYԌգFq[v2Me"40f`$iv _( ='Ҫ(*7D+Յ8Fxwq!b L`e 2ŀ(| \(V"pnˆ":(Eպt")~Ar cAuU+"ULrs/.z2-,L\lx{h6lB{{.; 9Sh^,9dl9 yo.FvmPmZ;zH2Sq[{n]v׊5-uڇ; jneG|}9?چnMRC r OAa#I5AhDz8'hxAX폡Lſe0"  _<@kd#0)$u40>;Gŀΰgm\ᣇ>u{l "ۆS *]]ݴ/a70AEu$(ATLwd炡7݌YRH5mҲCRBQuAVB(zü#k= lt!ɕUJ-H#nشY3̆(Wj+V5lyrJџreO_P,K*z$5 ZKUá( Ls PA*+ah,r.J}ZhGwrʾzY,';JhAqcvd!/8_`}tɽuY!xo_koWߵOt@tw~5 ϞrIIZXpɔ3hA([A$Dxx>51v"$-b<>> D<IB3$VJ1jٻowk}wY|~.H yg,-j8Rw >,qaXY`܅ HjGG[x<)IBOO_[[^`t,J~T*Y坚fcYVeY@А sXwV,GPs7 2DyDBF niEwB]O n͢{( еHѓѣ.<$A"EG @kHHvKV/\PpvnIψ[谳|d\8_Zf}.x" }3j#' kJ9$kg{0 .NM :Q% jN C }5RQAAr aH*R4̐vhXKG$if M&cg4mk4DE-ԅ^( ְ0Z7\npb9{3CvR *@=>#d.E!ƮC'#Z Ig?<~E:d2i=,@p?ѭ }jo>ݶlЕjrO~T2F9\$;fА)gN\6s/<7JHC"鸪;TRRDccO7-;YWJl4(|a5nLRcf>_7nL\ǔc `r  @:s>EmiDt 0@aWR^c(1wtp`5M4D6ɇ!mU&>‹'(ZaF 7 P;Bq˲+,Invb q&fhiyr0G"1La \Q? Ll߾>ځ b.10X%!I$BP}YunijA1t{}ab6Z(4Mx$1'`0XNa|\ץI4+ ?TSM]S4PX0hK\>U빞1^4L#S!E|2'=t^>u=Ip5D{!P+ܰ,]Ѱ?z($tgNH @ZmgoL&"bt- QE`ϝ9 j_ְn,:DO[~ȼ~i ۷W 7 677OyFQyoZR'ỳj8W@O+CvQ,4U{4 tb6a埞rZ2aG3H$2{m8U[YB4'eC"rGAbx&qXZ8rEl# 1m SUSޜ;ŴZ.1yV^9 9MVΦЁkO u`dyfad;&ZoBW>2lڲuV^J,,,n'Iр& 5˛9U=>}:MaFgϞop+i`r6g\iBiغ(Li _ ZDٙ_bf]^/ Cl|7Rܝɑy9a>t4mh$9[@dQ ^HYԽYYdL& vWӍc4GT?RUծ'[64w<(bBǿ_smEG j?=YHrQ΍UPA{tpeƻ~:Z sl(GOP"_@> &BݖW[P"QP+x&C]c 5tEZHP\Eo퍍 yhx!r鞼jx-Vm.5VFS0GG3:r39S{z6G/Llcʖtӈc3'.T_)KfiXa˕oc:}t?771ߕjQ*B\g =Gu.쐐n'X۾NJz}>rS˜i=KlLC9l .Qr\G8\W",s+H6B/q?b7ć]İ .4`˄!x'\]G}|W~&[ (Ҝvo%3xiG&(\W<: II|p fBno@}Sg I˒9nHMH/4YXxOS,Lr-0U5Pa)W(aRha8&4Womkwc+?L$@"ޕHDޒ4~GYF6p404WeVo'EwAlcb koz7oBuَd,͒ g#gmӧkok}ϟJc~^+Ly4rEꢮZ1'[/~O޾Wo\\t"kY)79GΝۘN~^sZ0_*rMUU (V&o_v㣆K5΋jڴmڛow<]ŇC)w5o^|ɫׯZ+f/3T:zrXրʙad.kaΒVmsr<[䏾dY.ny-tӗ{%hwQ.;0 Up`"U샟m9eEM""=~N&qHF{34Zx> # mIZ81MBL.v^śrQ*Vumt>~<ʟ8E=AnᇼMx.]2MSF9'%E0JJ~p|Vicv+(@68ISykw|HۉݖMU7ػ?Eto^n^/z}֞G)e= rbVgaܗ$/. ;NW̊2XSD5Hi{N:|8{'2i lKus%TWH]T6W\up}1~XX{{үʕ;>a'>d U\@/Cq\X_7hBm(E&:BLY0 8&eu|w~8x_;fSo6xK[m'V/<WfɅ?Kroc/jEջ{4M8_}/^< (&.^$%s9KGWAX?̹Q#K"A,j?g\q ^X Zƅ i\/NMGύ/xgau!nHܞ;m*Ҭ\|k NA%K^R뷮_4%~/z,|gʪyZ8K] W٭WZ!cHS!kD73 61xއGJQBj-JV7~o M#:y,sðΖ6Urgny:KFHMnVׯ`9Rq&#*5%Epe pY\]$g'>m;{}< .^QE.HOL}߇^uK/I"ٲY4K9ԭ?$`O1p -,> 4$wpC%%v/fabGmkMQ* T M9PxSG4XwuVDS^?Xrv'_dfqV4Q<\5Xm*F,alxcQ{p[W?XC{ǵ.OQ*&{kGckO /fC&UmfF*iPT:naw[.K"`48u|4O==cr= hhE|TyۤE˞9f=5xYeu]HIQy\܁_&5 ˱a~tyoN+fzkf9@=J8[s=nr($v7d*MeQXm˒|!{9JX8[w}"*WkC+ ,.|زn|1Zu<܂ YwQ*.U53JrisE C7)p&\Ws Qi2tVYiTMLQֹaeo4QiSHĺ4g{L7#x2rfY-N& zg^*RiJ`Zێb$xReuPsC5(6p` EuՕooMm9i {</8l6jjb} JKn-5\@DþGk0$IדLPhb&;4U4Bo:V;vH)Tچ 'qHhխaoCK bj]U\.n#RNqI6mݒpv51ln8Yw52ɢJeN///i>y9UShdԊږu)v1)V|% 룄N-(NZ,̫ hun24hzDj\ׂܦ=8٪EI\SqB[JF0Qrtu[4D]M6?WuVz^Щwګ|nKnՑeC"WdvV~xb5Vs\Mr`;q( ^єW:K]HKlym)T8>R֟3jG6l jb4B+ FDEk UIΘxyaìVɿȋbwm1ڗ®d!B+y$ _b+H!Dgp -H1/H6Υ{.}}'_3;;3^_bfv|W+#vW=Z6)@?wżFHB?}UN'AEBtV FiJ{42[0giD5e)iBH0ܶb~v* O,7I(PbB!R2$ WT 3@2'Zb RNre*UCd7-u*qumn8ۀ*iZK.;hr@svifd|5z#?ّ?*+Xд Ka|nwlCFUF­_3$( D97>w#k/w|87|~0[FQd00ye .jw{ID|(o!mvNb`@Q\]>}FG4 "[M^QRƋ[FAWJwе ?Pɻ2d^EвmZ]zF+H{,sFx7 7SxJEX*=5^d[jt5+8$ SyW'*^JL%iK(T4P* )uQ53}z1|Ч(YG.$TBG!mP{%[An)M=0P)m-QHrDG4xbbo ~yR[朼齎hD?<- D)M'htӕIu,TR$C4U"5BUUș!ҦAHh4`0YBO2 y}}]KJ:0(rÊ Ba7.%(xb ڻ51;9P{;ɼBT;rǟVsvV,&76Nnnu*ZLz)A|R+bfly}NVugv])fVLՍkhsT/T 8t%H@0 zL( *#8~ӺťV0kC]BcQ.A#Wr ~hF"}-PfYs;n1]ꇁf~KZ*ɑL]M~$7ǔ0;f,H&"+YB<pP"C N,7jE19?`ciRxaY PNb0_aFQݱDՂ1sJ<6\05)a󥺢 vN(J@UKrV*@ SdW",^QXdRl1v(jеti:w,цZu&~X*CD6, j |qmǯa0^i͗fsaI盕uЈ*Vx3 "s*> o Z`YCD2N܅ɐYH#1=Ab SҶ"ʊ <\[1fҾT1l?''˫*311nyyi­Bn5ӕ3HxZo|YJЎw=87rђ(HhEqDP;n'HAMfzpL6(K .Sug3 ]f˱nϓf~ϟ_u`}XwD7\ڄA͜?);N<1^+;ӵZ?K^lTcyF^+d{.$Ilj&ɻaϞ=GQrgy  <Ѷ|lyQzaKmuŨlc^}|ZCzw޷FUoц $rq:n3أt敌&]װsF&P̌ XaQ@AJHo3H2Uy]TL.P( T67G܊ggQf?⩭*BBs{h ђBr^[[k6SS3"l׏8'u m`lILEAQTq!PWݷm5#G<쳏?x_Y¤qO]x>u?\( c'ć:-VͲ` }Ef?r$|FP?a댝ID`T4`Ey]>4;7ߺfK[`w~ihi րvRTPɽi2nd!szPm)_dd\9Ѝr|Sl秢Ba#f΢JF0M|E)LcC&,W$vĺ\Y05szT)lmc%yG hȸswNz6P$„N"U%JMPHuPoQb8B s Oy+۱)9*h]pI_4R L'm7c1msyw|,07n\ESl'נjS3ӮNo6'eWMbvNM6rzݱm^\?:=; =nX@JW#I5]/pƈtq3bb3hMTR p=R_?Y.O.@d7g/,V杌5-ОܓҢ$EPѹǏM xPVv7rѣGQDXW-Ii1Eז05M Ȅ8[|O~~sl*듓 %KűL:6S< \u 3$õY=(/{0ٮ-Ք|qM05kG2*'6o1b=IQd`"wqHx`C=mz7Qr"lڪ!IG-ܐy)^8P/o 1GJrzO_8 -Bσ [/QC /2Bubvu]e|.c*Q8ׅv766Pj3)q -tE r'aÎ<@"#9zҥK"zd UeAJDD-(Jd"9);A|;c|]wݵtEZ.:(~8q4]@ƀA=A?رcy#ջG X%k#Pc^KN1#~z8ca.V-;FW^1TS_>V3=46]&>ХpِDS3Ɉ 9ҵXЍl z-Pas(fEc\-(<(2 EkR@.Y>3䔀)S(ɞ&L6kljB*0߮~x?-abbZ=NAhc>ڬH{ po"TX6DUBbG̠r${Em~jwUCϵZ 8-CI][ޘp OMM|W{Aib三#S'1 :3g%P'h@篠Ы zNOWi9c ;n'Үo"T:ZfC!%5n@?~©nPP9o/^\K;_><,F<>)^dv˕\˜<A۱͢C_t7M-g?n{gp glS)WVh"`mc^̈ 7oX ڣ4_p jT.lWۏ/|o_|OO<wjriFE*ӓPpWR v>O>$ڌSN{TbZX?/ }݇~1{iVy{e<2 :kQ6x8!S@RFgTQcRF ܽʧJhQ0, [a828U@ZlC­fȡMᷴBP. oNNN .҃ oQ\?=Mv00  rP`q1i9yB@̘?L/V9yp! ^PtM10>exL|Dռ}zyBTnf5kGgΟ'㯼_G?|ѓw᳷CIwҒ-#J/QByM@$B YLmRNf-Y "Uۅ%; '"$%#ޕGUe[ՖT@la @ 2 *hlJ (D!8׃5~IH $ڗW5,H~|]=9sU A!uYOƠ6k`}1PYWǗ{#-]`‚Vc@`AAPvIQ=^wHH# K[pɓ'7mN[hΝ;B}W^ 2h6kryd?{w(U cٳg$ .]ne8DB\DIv{˯_L/@HD-!ZkAYUuUV`͝U5_~ALLJnjtwng$* ɒ6JB6pVBcBb>2N+**F)))@^:ynwGO]=+Ą)MOOiZ?6&6-hVV[f]!R~VVV@`BѣGC?BY? _H %22UGW9k)kgMYYû>5 7hЈWnZqîKɩ)8pQOYyQ3*,5 X#F؆Twd +O!CDp*nRI[Xߎ@k\Ԏ-)"0ބ0a8I9s(b\ `U*w'#MQ}-L …t(k4Izrr2S 4;nxT"2ҹc$覆Xp7K!p$ Ɔ9+}hi*~Fs':wV}o>08[S/,,l׮kmZڭ[&c ۪A:4.]-8N(jN(O_Vc"7YV5Spnn2ΛY/Z3<غe'ֿi ?ضe}kߝ"?8jI#yNUt+##[nJ IAo-mܘ$!!o>3fL6m*̷{ڴ WO>u/ZӒT{Ӓr%ϞCW. &֥[ףGgff=z 9)KfI'7+@ap"o&ԉ.g01AY2# "WW93{;~vx=Z)\.B[(L{q# @12?v3??X Z 1tP .ٳM6 AmذnyTUYe .l٦V{=UPW[sTPbпZŋKkaA8z#vKO0af0!䄃A!8n!%? 0Nn/-+ }駯XoV U-5ZiܙL~nz IHog^nx?D0rN`(0+Ipb4Ia`f͚.Ü\P1%œoA.E穩

[n 'Mċ3HH]L/}Ұd@L{Z~[xjX⨔ۖ_ǰ84eoyY gRebڹվ>~kpΜZ HšV:1 yn+4, Z]XPԪ@BAid&tIL:f`eǐ‚:AA0YB7:դ@QCw%kI{yU+$!`7Jrq/{-y ~߳oӫ^7<|d&Z͝ѹFDjU 3So08 /Ypo~v>hq8*NzJ;_cjA 7BܒkM q0`P,*BZ $4pݻ'{X*#؃~b"b I A)&-J:[nd`uu?ueRC>v<ۧwv'姈.1A Pa&M@ݻtR ,XbŚ5k:~ڷoc?{v$נj++'&4Z& m޼qcN?={!]&Sf0Jvnn٢o5aj f_PXAbC1g<$Ca]%P( l䓹?zṧJ'H'ґamQ0%&{{N9]?_|¸VA#}Ț^2 n@GY UD2k@WGmժO03ȍJ WTÔ@I\m۶Ŕ_,62hOVFFȑ#qrL>`BR v<`PN^СCp0ȈYA`A1c`73338hdԂkl"A@m* q`E+f&E%n,v_p?thV\uÂ~6Q/t8Y *g cRɪ*c!S( zQ,A+R/PTn:Y,bJwW$6JPn_m ,2wU%sӛr&$*,a;_OfFTҹD$@7B4~Gx_*k CA((B->%z1^֤7#?\|oݱcפIan/MZdMÄ"݀% oӦv > 6o cL@Uj dMݭ6K 1 y]:OkZ+h4͚V]u>ѿ/]8Rj23HN1mUe/کS'J`Z`ap@E8u)V"7~ۭnOCARI4I_,^ؖ-2ywGKuȩsE.G-Ӿot[nQ8CU1o}HVmذ/VXpɓqRdgX-<6]UZR -^V m&50yFxҫhnZnۖnwJ-ޮ}16vcJ5 lDb_~%4ӧKRcU>TlٲMCOÔ(vE-쏓lLja| 6MŊYjرcԯk"Zso8p }A3f=`2W_}Pl7l޼^Ĩt`](SL[* 500Labp>|F=k:0:=KLد39,e&ۢ3ԤVd^Z|uIjb$rZ0} P_ r!Юb/^^h֩uқ}>CE#C0IL/q.}Å#OMb_-^9,f͞iyQAN|V ]?\kPFJz`HUbDFJv,[&EMZTýgxB)ɅYŒ9hwƌz`{xy&MD++nJ[({tɤ"<˫^Xwo X_Fi}ހ- ƭk 'H2(|y@n]vn~'U;2ڟ<~ܞL}A/)LG Eڽ{wݱpǟ ݔO?Q)uǎדCf%́';->қc .\JiT%OrV-rt{ 屌?5㢋zXH՛1!p2hx-M^&L`jWS]C 1渮]{=*_:֣S|rr@=4:ә99੧'eMk<جָXWPeSo`f=]^_ ]%mNwzY|y^w)񺘪KfA񔵔P UE@?;v8[~M~sƍsk׮ş:Jd,LEST;p0=F37ß}> l:n8< Gc*3(j0 mH0:)) 7??Xs۷oٳm6<$Uq#)t3g@D@ý{fggS? CS F;`XJX(P ( EtʕÆ cq8 Ց06r r?;LR '?~'n)# CT:SlPqh02B&]H kqaI덋C̤,^ԧ8rc>ߣ蘑'`0J d@d IB@3Icj4VUnQ1WX%4.t. =ػ-_׸Q{d<]h5R,ʌ;ev\ef{۶4kȩcޟ5Yx0[s]*c+w 4 r{$ٸ6f mS-V(t>$.SSn)󴏤y,ұTBjߒ%On bz7g^J< )݉gϞ[ {h >OIi~ʕ.|VGUYnVDJ Zh[hqَ;Ꮱ ?vnݺ-'N7{WU{FvBBHeAVyGpXAAg2n*8[@ 1!}_:6@9Pӧ[W_}տk5A_Ө=6y/!Ip6iن>;}xn5 $%ᴹM*D fS k13eks |b| [nu6Dv_u ް\c]^tzZZRR^]YcНĴi/>7t&++q`jaՂ?fv ?( qPp~/zn|-ٷ1kvJJԶBR8@ &'mVR˚p XI"d Za.;*m9rvQJ?T^xud́LWz^R璀bJ%V!Q2 Yc7̋gv!1kd|> ɌD3ҟlօ/A.Al˫+v%1t`Ai‚`M&pcCMb΀Kɋ?hdDSRRmHA9'FqiNif`MBK//['//oƪ[M:?_5׊7M?ŽݎARX,Vz_#77oР!8po~rfKPPwB#L~I_|kWbc.朏 rɨUyʘ跡^HrT߰yWl& l`o  g}=((hرh KDH,"vcz 1؄Fa dHtItNC0E'! vLB/:UO}ի ݻG|_x1C'F/pF d!!(ƀ *:P?/yf:F'N]1)F8iwUuuVLم k K9X ΢{%IW ֭[D(qZғ_|q &@M>|8ƍ2b! KVmN<,78*5w#sO<pB|'#2Y |JNb2?/_/Ƹ^+'߷/:$ ڷ#6.a֖&rwMk$SۤZ+r`6&:xxX!:bN?CYYI>>!">Gͪy7fj˜$s09c x,RTeTp,aH&-Zh* ay="jÂ?m\0M6ͬ88]ti7& ChtiC^Bˍ§Uo8n}vwt,cBgi%uu=>2ިj= V®DNxN$&&Bbz JHuL Љj{Ɲ:սCɾ7 ͐6|O<>;`@G]νtYAuuĜ8w1hWU6YcbZYCޮArų57 s >pWnuB9x?ǯA)K] r΢wu _a~ֹ\\Wg҇Ie?5eh>omZ7!Ts&|n}/qbH{^pw񝞞%2cƌȠY{y'x> j|Wi1IL?ƻ@xpկܹs^ta$`] &GtC zPK*(Ĝ{mP~EZv4D O*mDq?(Ƴ\?3'c]V~dVY9\:^oߩ gϟ">o߰>;)ʔ*7oZT!vŃ) Np,XI8獹<\[`oNvsĐW.ШGFXׅrRSRILcL/TvNr cM6髯 ˁۺv 4 iJG:%[B,$4! 8 (>x^ǏOt:AhTxND\rh@'""zVXAL (++se )(%m V*6W^yx,"(`)(vN܄&Fķb`-gY"}^,(($J7?Tq[O IhU֬Y1 D>čZ$% Y͢~ҋ0 hiP+WP8$JMp~-֮];bĈÇ`B #G8_1:qsqu *@ v؛*Jj#5t2n\\QSt=&|~^T5iS>|(7h{Nέ3HS.*8d I(یkR]1jVo8F xߧCSR K+Ee^- Wn65z!3/23V'H-^&Bؘ/cՌ]YMn𑨔 ᬩ!GE^]~D-)&[gc#"G[}1#)W{J(@NAnd6,$;jR>ayGYB)<ܣG kwɔG'\D3m;U[!!A/_ճwvҖf3v%I"Ӵ 4XzQwBxP]3<`J(d ﲲaǏeNVr2OV3s<3:e潻](73oo^0ו /(m].*3S )e˰`{w-3Ǧ&& }.!糯^:T]­.~A{yFc+V{@P3(T/BIO>dNNP/T, `t Ql \g޲e 0ɓQܼykn:m ` `2&0 U[P)22< 1#9ȔBe @۬86*In"Aj+@rs) _;Kjj*@`y> %{밀6 %]t)رcŋyEUi/P1tċt`NC9'N9@'Neթ8w5ˠ\ISSkHpXUUDZk53BxȤ]-:*Mzo! $`.hO҂03K3BCրp\Qzh."Ab R˫WCMfq4*`.2Ya*;FFxĈBf#gIO67hoiAl8c~^pN8AErssݛ𫁃_p* ߇:I$Ynw36-+X̄=vIZd5=^fD;,xfb:=klVXDH6xŨ^s5kVJdrz' >6|f>JprLtA:v;5`4X,lTDŋ kZ@G댱 i iؘ;ׯ_ LC7n!d"sb=|0?0͟={_ I~'OfjHHNNҀ*BKQdCIM4v Z`MAVlj6IMرk+ yVV/&L< Y_\\ ԥKo߾ѣ'nf 200'.f*ӧo=J\t)AJpdyL~ T&Sa{i~4`V6mz駱CkI&֭[DYCRa"9"@UAR_B|Ŋ{e17I=s0|Lbt:ڼy3~IL-(f7Z.>-[0gΜ qF ͈:t(3hu3 ITYkֆ|&.}PvW?;8'fBݕz6|Ƞ(oiZye<r4A5gc~ 蘏)f\%X }>K9Ks}ʌ'>u*A!M]6Ink9QJL% )̏~O@,x-&K]\?w+ ľe_R>oQڮL/_C GW=M&ŏV~c4!Hb@OtLr/ 5=qd0}||bLwآ,rymƭc.n8S0{KJJ틪cc8~xvv;tHaaaKdԒ#H/H3w}ǎ0`w; 2tw[}^#pUgvntPk:$fq9,h F}YE%B(%'%Mt3`3Ǡoݼْ|M/%5!$Mne_P0Vuv6N IT~qcľ!yoC}'RcsF'K2_YU^UUiBQ6PRb㭸P"̠ؓzEF,50MjrT̑&yacyנgu]=aN8iSLAYĞiӦ p`{@ AF=x ]  OGx?vd=3f8@R+d)!!N䀏k֬aV/?Cޢ" 8(hC:Kx "ڵkמ={{Ȝ3a}]scRd|'&ZDl Ef0킂j*p@ƹsq3 "s'9L|9@O #gAyz"z!4PCz1QO>I{/f… =?gDRn\d`镜.E W|uBAOKu?=Zr)}ZI*qE~ݺEׯ ^ ('qĉ999pG˜  e{y]>҅Brj/s =u$]8H^OhW,/>]ޭk^Q~: :"JSOrDլdpV]s!5-菇Jxlq7n 89xAD`,9Jy^)lA6Nprfqvć+9&]PO)ɛ8Bex?A5刂i؟4װ\p$80??ݺu7DFdHoHpx$ qjOY-Z9iZҪiɒ%dAafmt0)V}sNϨ֭[ ;5SѤ(H'N6T-Q7" L6xޚ&%ʡF44 (*:ikd0^(h7k_tÏtNzl`:+wӦM݂BQe˖!kRz(K>(ElذӕNnT j'Sġ$2QvJB n4L4Zgov˦8h$r=3bKп޷W({C-J-RBK i@Vy!"A̜ #ꙡߜVU_c/X`yZك!W4IE+FF3cIB !7MM7h [bFT66A,0ױVVU1;Y'j5,UT5n_$&JlނY3=.];?aҗyczcކdw֐5Z]8)A)|S.ZM$ֿdNVFx!0Q9C32Ҧ?Y._=0e7_8 lYY1l4K7!55^JwxL =~\޽Ɩ.m|!FWXhi>g&+OSA6Z$o95s9Tw!!bL҅1_]b(z>fqӆyuF.QT4R3N^{\~EoY8^-Vh q2GLh膷aےqi_©'K^^LqZ9Gb RVV;@ECdZpeqsebcM͗ s9so5F2Xxfvn#{.]/W[uS~&oS1M\٣G.,,$YLZ".." /R`2eʕ+6999WVVq999(]vœPa$XA@ޣ4 jIщ Cc(0Kt!S`*C[^ ֪jrD!AUWWh+MpDno7LP/8r#Lg(F&XLa #PaVIsŋFļK.zБd5XB 9H1cxEΏ?8y|r:P(lx~޼yxZ Imb2@?ԇQ׵gT(qs&Qtǎ:{_R ?_kj=_YZthQE'BũluV#j:^\5$ORك 6`X493jPkvx.XDy--͞H7`W4HҦ&hbH Bd8wׄ>DxOyyy2PYn"jDf6n8rCسg)/eq;|8J(l0IIIxHB0D9C$Bp4' S/ff ̂r^w&6Q[][WW盚=3gصk_mlgQ' "o[ :Yg\/t+]:U ' 6658shSy$ŋx:E1vO//;Jسg} /Yom!mMfקX1:2`"K @X)))SNOQ3gΐ*W V/aÆ'v>˯x2(( 59z(>sP <MKӦM#ر3vI ӀRP޲e nݺ޽MӧڻqF4⒩ MCe$6Jt.s(t*I'(N:灭֭qPrhF(03L8c97YEygڅAt> d@)d P`GoP͛v{gϞիםwމ u(33sܸqtH̱RԘ`I.i,HF¬Ɨ{P:+4dl%b3VSW[F&u^xfCr<ػ6rS٭9#ZM!ˊBщS7u&&:sPJ:AYb10 A#}t%hɳJv$;va!k*cݒ=B0B>Z0 EZc#Qv F PsF#*S@IF?J:2+)3$ s#GB7$*1|tN 8TSÍHpڄ*61Eh$+%j f^BvB`w%Qi}s!&@XбvđQYtVFVsqaujwpEufWÖ,wź*x"u}67__̹z-Ǐ} W^9k'a].K(ՏOGe%X2e.,}^{WSW6m`+f}f\/w)v&hu>dldV G***G_<SFQók%)a4='J}^zСiAL~{-{ޖ_hC:tGI(۝6oӒʏwMp.' H_pݝxhɃ`s@u]wВ3baa]'W͹+?v\܍ǙigdxڇE?PA@<>bcISꊝ;w98i<`bg۞%K\{h ESSӡCKH[nc>{7R+ t H7Yp5S|.^ &3|%[~=̝RU`19vV<{ٳgO}}=n b )GTt )A!΋vZkp_DН.B &+:r3uvvbp=g6e s [<{vA,܌.$gT5p'j]v  Q׆AҠON:ahyy4O31>ұtמ5/ 5@v)j7oݽkoXMa1eCp'"Uʤ$f*]o+M׽Y}8v:&]_3po]]iZt>ٍbܽ}X3ဩx_ Q5D&XFiz,¥*5B e\ɘGaK~;J;LR !d)MqE4rhF1qG(р@'M! ႈ@X̪9y`Y@;D[,gsg˗/3wu+O.٪gI 3ϰC$ x=XZ`J)6 zb!.:!30}8!`bÇ6m Io[oa;﬿b/&(Ӓ'gaKyeEZL!imkop[>1mڶ/w4͸/~op oDg}M>d溺;sh"LUW]JebP<,/8eUтGedxǗ.?u^Bq.?vmǎ|ݧ[74LܻPi΀n,)+Tᰁʏ3k2'ДQ=Np&Xw&üy踖jU(^H;nYGn?]3+WUj<}oϞJZl ^Fyp 0%aȊG۷O2O]zs̹뮻PTwd͙'zҟt )s„ {j"+I2WXW^Yp!1_BalnN:+&t˫q&-K/Ɣ v>Rtttk.{Ax *zt60s03@*&O~#*lT SL/BAPXet a$:g3d -X e=_yW]T'eǏ6u:ʘ;Wf9&ŠfFQ]X`b@QI']}zk핿pT|6>~B~)@EP麙A `/?\u6=D=i)3Fb t k[y84vIDtfoc=U;NjelU61#X׬S8d}OuܭnE֒)Z O<(51䚚,TL4!DYfmذ1C>Ӝf-,yz+xsuvtYb(|~Ǣ|KDbcF-} h=Ɯe vd댟8M26`Ehlv9"F&889Lpʞ}{.bO4Д[mzw[lhG.<92!IX^D);w.x6)B[, j|/L5CKc¡-U ,H@&F>-iN@`ƌ'{zŮ_-]ݕIѥф>mxZTq@9A0F0(R͑|5\2Zle˞x ѣG? 1i6fnwM2}M7or̿={9+m| 9Hx9y Nr9nJ9;^Xx1A`ԩ@դ۠ 9p:n^uwwo'o[(77޸t{ ;c4ixUR0XS.1.udJ@9) .R$2B!`p֋zitK ՑAp= wf7 K)L MŦN)098"l'&IA;JFmr~XcM`Lӧr2w࿸NA3ЀZq'=rL(e.3\R M̈́)P)V0&EH@GJkAq+jcK_v\? WhdBL:ggH1RRP;G9Ή{Ͽ[i}sgf۹tWfuDP,X㵊 FDnΘ-gv)s撢K .#h-tݘ#+Z6&V+xj4iHIo0P, iV9W3f`y EVzdWd.Yc=)Ssa*=d8CkBh3j^3A==jfZ|袵 EV4LƚYz5yK裏B2e =,<[oEU9cO>ٌ{Twt8MI1HgW#4`p#!0INo5ϧESIS k~ cw!N:6AI4ݸx^0Rwvq5s`V竉xlQwOg2ݚѵKFbEQ8Y |زe >RhHy.YIs)-]9P1%I!ƤHxRN%)f["N52,˪T9<=:9AOcO ՘tr`2o,2]L4d> `FF@IJSb<+PX T`T;2>( Xl/٬߫ sĉXXh>~RBFxz&@#\]]])9_3~$OP:3O_<@)f/W^u$Ufgf+J,bڶTWqj[2̴ F1yhTxY5xʪ2h"d0rOYc):hr4Aro Vps}G h -(r,m%%Z?TW7Z5"bGFTQCʋ{zzU=. E }46\`4֭c:ٓd:7ތ -WEt L"Oal Z*NIOsd; [f HfPUǯsjKFj0SVS̑!ƒ%t LFdB84#JM =UTMl˃|h>_Y;l2 L+%U1K1k$ [8G*:ǁ?B]'?&r܃ziY! ']rd$\ջi&6NԕU 3yU.01>[ _}Ipr|wgfJLBY$KPئoJ)/e oτʂtʥ#@DSZ4I LdQY\2T7cH9rP 0d_sX$%Ej)twMN1I_9!5%u4W;`>Re`IafEq*bM<6}Pߤ`9]x냾) LL {AM.gyGtORb1cëa'Y'.ݸxw:S9!ҠVPJ5|L)1CAHL55e^/ȁŒ>\GH ިZP/r8-R\\(+B+e锔ǜ@3Gzt#fIq+9ETJZ-@dvq{"%;b*#+LL{S`:R1A3ߝb̒bSw%kRLL4H"/OkN 9HM2"a,(޵u\zGgIF@v ` [ec@cGv/#0x띂$ ^H1 B,0,eG ٯS_;MN$Naм{=uN}uVwϳjcޱFjF'۽̞@_\WZ˪l0LկA>_~HЬ~_."ʐیV2PBVek]N~cICi |t=8-@@* LÏdžaUcjȶ iI_ҕ (ߗTs0 :E`;Tg$>yʅ?(6 QoRpƀD?! S$r[%J~nwQ] T}{j<]NUDL D"^ it Eat#:$h>Wq}Ͱ$x`A!8~r7c_ZBwB%'?1$Dk0Tt+sZo LMj )hMa;>ɠzdG&nw5Je6k SYBQQ1=i uO[Q\k%o߸t)(-ob㴭B*B $чk]tToK=Jz;WRavǞ$Eꋃq9UU?r󢕻hnx{b,ҋJ̽&hxa^8&Qܵz VN<2"IbF )L t%ѫ*H}6|+k/сQ uzȳaq=(6&j$i|E2t4<zX49X|: DʊSlJHpѕN,˴+_ַE'?3<[َϙt&>X2@[Y*yAE|+RI. 'Q7t-h1@64y:ֆ}k-^u), ps7@N$AǓTR jfg!.fU971rm2C VPI^eZZiZ}9+"Ӝ$tm9 DŽSBJ+u=cZ+gbɮObjX*;O8?괺uG$r01Usĺ,r*ĩ4{4qW}yD.j׎P)W'8.?<@|ֽ=a=5'bdWטh.;SSˉ}O/4& 5/P ('I E,=kg}5O;ž{aG?+c뻅nPH+NUz$څqMCxL~Bt(* k4A.˧PI,P_-R+&ѾoҸ"E7n> a/Y=zH:'Eh;a݂8ex{y;oWw~?|{/C護ziN+- R1QŒzA& X*'F/j]W!D^0Gu  UU.应i Y`(eo,[4G"9ϬBJGLK/GrL u哓7G¶FZ'tK/.Ҁ޽K}Qhp\[J YnG/́E>U;nAY#GzAA5I8ݹs+cRK[.Z?SWX8bHM + *Un.!%\dywtvW!N0̮e):Od{՛-X/O!! aB&ybB# S"tݻ(m*-;ZҹŖTVYCagEp /<[Yr'v$;13B`ta\U`we [hOSp ]#| ߟgęP ;>`Qn`)]ۃE^{4g^@'(YBF봟-3?+*m1ZhT/=IL""pgg Xn.(c\˭dz$nK_6wMPu&|Y>EF6[Zηfc|2UVkW7j^eI+d:4^xC(]OZ`:lTCO4a0# YKXE$A3`vQH۱^u)S+xaD;O~.c5؊A0e`W,f`V|Z9jd.e<E^J_1{x]/׌U kU.r&z0K;=n+ښ BIl*66PLuUT6.v>GʵvKgK@UW1&8l(\Wur^n k gzW7nE7H )DMR^kska0;L F@n?60WpYs>KL}Ӱ1pMlx!L(,b7$y1[a{Dh/I$mub:ҵ[]y""0(,9ᚌ$\ݎTw?o3N R8InDhA@R.ѶvirO'LJ#d.V0ܨ;,SN̩:qx:q4]U/rh+X0MS: 8,t,#UD#3ɥ;SXBV2K0.yw̻AcƂƿ'׆۟{h_kw٬RzRE,64w]y<;7OSA:׊hBu[Y>W'Qb /`$~*e|i:'q KN\ivZhQC:Se֕SdrjO^QNŖumIpmK]Pk:{`{{$XV7lw[f٧(?u~lH( 1DE}ߊ~G[B+R6(>`31 V_7ɯNW.]CP!1`-`CJ7>۬褕iUoBX*\?e\QB1*"`VPȼeʃ(w9sj%! L0($UqlMU`\)(NE.;Tl+* PLL8R8Ƙ@׮vg{ʲprzvt{{oZh'&_pJLF"yD|.dHn5 %#P'{'ʖw}GdYx-<)p,l7y/F%D±<i"E+,KO^! - /ߍdepH>D~U>ZEc1Y` ֶͧ^'\m?:ރ E7,$j:{=xxg~ߋR]ٸ̔>:1űܡ~_{퉑^h9)5f$ҷVHNC1iei`@2pNTt-%`5@rǡ?`<4>zD)t+0fd /hJwI𿉀ˉ^/|F!J C5\߇\7EJS0&aP 7ܰqF#x /v|ܹ^َgmGpO±2ٌ֛v2hoh;It}\%[0lX.H54\&x%m(`4^XdApL1qJ޸,S/Cu]d` D_7HVX.4c@fD<Q#']o}?ڪn7Kb1 ,8Whdrt޻96B]pElzőbN y8FH=N܇Rࣣ,59{W'\[a^–F DEZf/|u]V@q^uhq:Bʩx""bُoCJ^(BMC-S;|xT*[V7l/A-: k UanEw]KwFѱוQyBAbhrȧA(NQޛ?y'?\`q.L4~PG&zxBQ$-7`q_7U~@r(hjo>кuk+9Y: {{05kƇðPWw^2s֙g|×Zv6$VH`0aH\AA,@Gs%tNj$M$!?X*u1 UkTMˤǂݳN슮IPM">DAh4K*+8FȒl!ADq%ŐL)F}&wGOtW&(PXL|4BA2Ux,m٧_ipЏ-ͺl)C\1{H@Nt 4fe乽08*zK]S i$xMd0U* Df]Q)NF1߬TSkMb~3ƚ5/V}쥙;S`_C k=b)¿ h.SI+A@KPoDǏ>r霫~9!UaI{^jĺ!``,DWb>+_u|G]W,vwa1޴a]V߲e_}\.c]4ر뮓urQo7 MTƓH x=]W MU) ǚ燿R <$&ܸ~|x9GjKDH؋X&.솒8,[1#YeM"&}%X!Q^@ad&  H#H[2 O86}ϩD'nViD@ ڌd8 s1u$1e]{y];}埼zU76Ti)6#A x*/Ѱ*0,I #svjh1J "ʴfqŵ;K?o)]g_ϛT;5bp=^B&1>"`0L>bOYM3o U} %0.&.IC\i@q&ҎX> u()DuSI'Q:F]dN)W懚w;N*m§#4}JY^ !eAh@>N*׊hf)!l =‡E@QbBOG`I4; M L7Q*@ң_=Ɩl=~?٫/k}.];|Wo pH@) EZMՑ!}]LQ#GAzY##*G_P¦0蘪gPW1Hjj~챳gK̈́(tk+7z QtU*g<.Pټg2/ (9n9?ER>mNǠ8YDv~N*x$7)KGCn@"+%6h4:v+/[|iRq!T6B, |r-HnBZyN[%Jh }gDiX+|#wwA" tVFW\~ϒj#c(5cBbu~/UfsEBMQ1Et&ŶrVvJY;{nPEUfNoo6*y*2Eq4H"OdH0 ennX`W'Q3Bi^O2( cu^'MDX)5T5*FwL X.൅4U].sƼSsjΏ|tvv#P8_&(kSrO%kFN~rxDH T# j9X`iL,21AD#| ٶf9m۩T. /|#ߕd# J@ٙ?,W"OGo);.f2`EطX-^FH"4m'WVC+7`td㩝w}o׶?QS.45m+L9:ͩy~룻(GGru~yHnuS)<[lXk4pqh)tpbk+kHR!P(pZURЊx2PPYg(hw**Rkd#a>tʨwl6ʏY,,3o0}yϢe֫u^-۷O? /~-ѸnݤȑqToL&=7a4wUBLSNanϝ^7r|hj_;#;,!4 V5s0̴"L !D9QI3(~|?>ܰv:]˲lño82~>s*),cb,Qhnzlzi;ӷ?\Zrmx?;a*"fyuKg GA b\{^ B]ѧg m5cûh}7j=쾱g|"ș-12gύX Lf"=p[gMt\D#:Vi._'*,\&2g72lhT+V?ej>5vݵlTП}X)_\v6D8~x]b^WeVrVn?gfY|? 0 QZiL7#lp([~dWrZiYڣG?9o h,|'|aW=p?@k:Pj>]\+j\.gU]NUrm%6UMeBxe7 10t )qĨQ^յgym{]sKV/wɊd{U90^KTK'F f3t@i0jAsy_{! ߰"@$VU P9㷅w3LNF`X|*zf #LGKh8 \}pGnH"qa<rL3+;c M}.k (e2*5 lذR}u$\#})}_twZfq_An H`rhho V+DPjt!oe<}y /$#J'Jf8o]RPY'K^]b9!'[_Dw RIgi?Y+fy1OƓ|18]|ey/ñ(g)tT'G^@ƀϣaN,S2.N;}aYs*Ւ%ųEm+! $G_eMcJ;q4C'p BD"!Sr뿴%Wx7Ki+(|l#gmV.獻,Yuݙw;Ƕ/ʜvκuٸx jYg~m7{HجԜn V&d)2%NE %\ؠJcJgq4>M| Q=e;TZ%7\IӲ'e:Jk$BqT UUs|w'H' ~G? "%6^O+ # Mޱ̶\Z*Q8Ƴla"9ϡjBގ`+=kfa&( sYA0A3<Jޤ>F_dA /_o}d'3F5tjߦoh BqnێϋyV;1Q\n%1PZZ3f0i'cBn>eC6|OĤKr-: Kf۔Tob[L#1:@& ؞SSyzkǗ|Tbj mH? r_'C]wz,^W뷾5 \q44}k{_p>uΚr@wϛ{,Z`=XE88RA:ض,!)%VUxFb0 Aaʕ+c1i|<}Q#?ȑ#4APrq}r|\m{SZSSדMkZMR1LL+&bbqbܱPupӲ=7l@W%{v^3 d_Ѫc~?PtMkډLÂͰ4M`8Qu[ot{]qN<@3ߕ >YR}A]R>_}1Zx]o<,32p@U `\u"#@(yX"G\ϖh0"E l)pC Fu Bj)J)w#0HV,QY$cl xd HZ ,ZE,}Q N5 (`RzQK !+@#21qzhEDLHDQ*x'Db-(( _(wnua{0 .6 @;84| mq[0%A]mڟN=042VpNXu?e.Dcϕt]wF&HSRjBV=&x]l򸒑L?#okk_or pMTozA, %CM9iӚִ?fpv < .E@>.C][BSKg1$aDS} T*oDGC69ĽH1ibO0*dc[n:YS")SGnܛLPoL(5ؘow,Paym_ۻUI ]}JՎ\;`c}C "r3.:.j^!K0q!P++ ;? hULۘ=hhRJ6&1=o|K& @v.O#gR$4`Fx]5!D!;H h6\ ASN&Dg 4!E%jـw)_,qiX|>!0`,Źv{NrQ}`H9u99[uY)zf&/MuϜ`out&iڦb,'rbX D[HC୙@O৕d'k INj 19%IH- DQJTE< uXB(I?cn4d!޵ZVZyUֈJZBbS bDm5"16i -;>{;3t^Yg}]g}[W-?MjQ~P^sy/ß7o=-TԡۓzhX2S_R |3Q,9ٙwk}F!nbe@SSSƿ~o;_[~y{x;rey.,W>Fh?nS7^h,%DŽT͘ƙՈN<±Eh4!y* 6ܽ<'{*-e\Ҡxn6Ž^,;w5*k$Iӭ:2N88z &E^x'@2ܧs6zgai$D_ϥyN~ ҩ:y,:I  >y'|ϚCM&I$vkrO:Y=;3kg퇡Kn"RbiP 3V?s<c6fC ^n77׀Shkִil}1NB?nv;A3&ԣ7?{5}v<9ϞFۚysH5ϴG\s1~F& }~F+ /痨cp :o7SmSzyh#C+=#[SGX%m/x'NIE⠦fKGnPm 3fmLG@WNvNM)%'g;TVn6{h˶2lrN m+Yٵ+BUs(~ 1rA+'8% yM Akl&mg4wz\vs/Oz}k{DŽ"VU*.)&UT2:^E)#k{g밠!qBi!U*k1t]noר9:a-8V`ږzz;nwL clq~ܛm>?F# /KW0Ç0պ-M.N]#b{9e`d m/~_"9 s8h\|ч"7]%mQD)UsSȼXjA#CT[ oNЈr&`fLIA1995,NdOu V0/u'(eg(RHQ>dߐhG~Yuqۦh/۞USX ^)T?߷r#$FcŃgx?a6TEdbJ|8&aF,O.Jnwыphv8r)*OugpY%pl*xpm@΋ۼ`~fJ𰛥 :4)s0G8Xkv ax Wjj 8ޖPjKM+"InmnëW?OkH!4c'8yV",RQi,2SUaIϝ;q VKvuSj5nm{qqA'a!n*/8!*2n4Fp& EF.f$Iueee wvvb.>}%.--}`wy<r*e\@+`* !O$Xizێu|+1Hǁ`yXYAK6Na$?fxGPdBrE~F3YeVq['qcK2-nEjpխ*ZB* bed X+W6aUM诊,kiwtH0923hɘk ]VIӪK 0Υ2ʁt%NTb-/6!M]Fo.svRSe2>˼>Qo=b\A\Sq=8ۮI9϶4v]g: M \9t\7 7Ti3Q- 4w88}o\ʒq5e -x ;3߹`0iA%1, =UG[L"v]E+3pZeP/J` 33yumG? "j9N/.UʗF8a1)DBmעb(gṘ"b|4K,"ya:H4Mv1$7 "h0~W[V; 7:d*5XIZapO1t`V&Pk8+"YnD. TeG|4j G f]eF)]KrEsqV]0ZV* (2ƃ8ښFh;o1ԶhjI.iqp0 }5-]L nUsҫbɲ8γL;,Y[[+|:,$eךVY/-g,/3Z#y%4vۛ=8EJZK/t-$_%~_<֎꼟g}of3(cbE1Eu DIJ?H%TiIB5 B,FPjb-w{s;g5<ůw4:o̙33w};po'Fa V vd|Nr'iN` [q ; ֥RaddX,c` WW;>^5t6kVSQDIYxǜ\SZ& .էy " b0XUB a4M <Ёa/X, LYq,@ľ"UW䩛IT[Jn䅲\#J"!F9=_r3sޝ<82VKWzlT"e:ĕI,:5 JW7R{aC6elAaUe,Vc3.`vK#r+ sfFKOS\N/O܀@%3!byfM&3XL>f5!e4a*l{Jzo  1C0m *".M1hoY xhP&L3C>-+}qz}T.0ύfXFqn\ewpwL>]_qƐfcժ3Ji+gqaҚ68PtV&;2|xhNeMtyACL0 `b$N L9M9~.@HX0L+Eq9Z5 cceZe U467QmZt*M7Vg6:LmJ5rE׬΂3~ R} (MWUP"E"Q!Icj󌍣ʤM*2k$MnJK9T:OLUPHS. IO(̛Q>g%6 }) 䞾/=^7^= >h5GՌh+` |UtɐC9C9u[O$U\Vg :`EA0ǿG'㝴,tbf JO2~tYAX%81?]cQTNAjXyX #l͜l1yC;w[u]ИwZJY$Y!qD PH,> RCF6 p]kS)vT*ށ"±-sz8('3Y+YIҚM Foo/^&[*F28 $*J꥚ 9,"ȢlYH8HďN-tZlb20@je% _ҍ8X(.NbrAqTAHC1h/U ~\/hͷ]{曆7|OƻmoPTZv|Ttb"׈%RB*!2O3'gԔ &$iI]l<'~$R1<,/ :g:hAK(|=E-0)$>C2ӂJ&QD:2ѬI˙Q'->f^!-iDŒRڈljbb uښ*+*Z2fe%'8UE*0/c3L}Au6ou>HJyF7^OZuW=P~=]veNLLݻwM|~׮]l66R)ȑ8[|o``;v9 gv'g(ZIVYttVdptVb>ǂlvL!h#*ܻ}xxM?p5\t֪g׮]rJEQ<ݻwu \)2^Ap `@g۶W\5|(˟ +&9?KUW>[YbfIK8YnٕbtbBWRmnã1e8 gϞ[^x/2^^GV*jK__KA===BIj2ݱTBდcI(5M#ɪűtEV焲(E!v&Ibi( $ga(MO#w"9[[SHMDn(u_+J|{?nYȿ")d{3x?_ _jcͪQV:Mגao̥Qov:-mv|Vo.LF2SdXx0 b7Yà1 AxO G8ܳ;nrh0"Jl^(JWc}׉X I:^ݱ=S 5B039+oW}f- "=2FᴜETUM:nM4 S}7}):R!s{۷of6m`|W(禛nŽ[Y@hX|7&xzbb⪫BoCCk֮r98XC`NqPtQ ; })YPR"p|JhvXr̒KNp7HkI뮻_ `H?裠+hP}]>RY*Hj[ͅ0=Ȫتqx.UCM!Jg *Ebv:@䔛[o\:1(c#L4I?Uc'ٿ^|oϭ>-#$$iOT庍W3/wVYt[d;Hהvƶg&UY-*7Xa 2\b*VjrvU-AnӶlAոucU4]NieRT t|W^&Wٱ>bYQt*b?{q=wOմF8H!p_ g'roJ9g8u-q;o*%~Qv}gM KĘ)."[ugUID& >U$cK"OL줍O~o;<<|rH  ^?쳫Vڲe |%xAh \f (qݯ*K.Y쯹TN2K'J3L%/RG}Bt|_`MqG䄡w`B3\ q9:AW63=ʼ FX,|;v(hB˲˥ ''YT'ƶhrYsB\Qq1N,\\CC+f4h6[#K& $L5"wI[Y p*[58|Ȣ8'[hdr? ;Jٲ ={^%+ߴi֭7*)0\(4ShܱTj&H zzqu~qi;ͶْO۪(R3ҫwb3#yFPV#UM)$J$(w,3s֛֯_ێ ŜYjmbĉogn޼aeIF3c l2H3^KMUB5:/*=/ho|õ]n6 I.EsvyM2x|dٻ 9\;K7B:@();QLJ%8qB.]vR!8EDBй@D!]jWgg )r_Sz^uFpD"䗋wgSӱD-3ؘH.6#Msr8X5^V#$掆]]]RB+C>Kі.!Iurowu,͎SV絶;|!kn"[fd C>{ )C[n' x;~9ΤBin7˸ X?>hʈ(C|(#2]ne%iUh >hР ]գ2 plFloo'];::GNe[ZZV,_ev^sG7B+-BBB[~%i2]Cmy}+t"$sA1_d To5\l9qtӧޯ*GS.I~X>]wf><ΝJ0]7VmTVJz]^;/vf-LrD)RI`jY|`zf.& rZVP1fXփ ZàޞKh14^#O.ݾccp]t*xRQfR7_~(+t# rŲB]]]WW'uv>|Y)ZhhĠA "_нb ̙GWLeVhSSRT.x<^RI5S|Ng}U@ ^?H$VS]cY$'M>xAQp4џln_<V_T]'y5XW{*C={> UUr)OKձZįLy4be:֥T@{њY?P,JPչso{J̷UM_ZůeK t{2%t?$?b!PGj#33M>#.Zh>ط1_>y߃ۋk⳻̼~WW,+Xb(FuA4_ r?c۟yt?Ǐ<hfxC}a  /̈CKY8ޢwܜTkc怒n:9d칓&Nفkf{13ǴԀbQ]j E9a>bג ,3sܸ~L+WlʄY&Ф(  ,A8|V. FV,[`TRljj)eRI?nĉV,m*|o&2m?gy#>2R; ]h&t!$I766nܸȑ6l7"aXzhxwذTrOQP,˲ܟLA;w>M꺄g y5kvss34vаay eSU_˳Y2^+k|+魙%0@&O {饗Cpx<!f@r-I9K{vkGGԩ Äĭ] W޽{M8^h1DXT֯__Sfo$ktWu ݚD >dS$I>}}ܸIw=; iH @!`\o[ہѣGCw}J%d‹WxE4 3WI~xș'Y7\U$,hX\^iQJ.ǥnY'U*DIVS]-fl#=Z(7c+m?4}K达\'dLUa}ܟ<~v􅢵fRl۷w T*1 gmmm1İT,^!H444 'r(;Gd;:DQ7u3g7my}ܹ;Zyv)JѪ^.AG8B.t`!8+31vmۖ-^ mO%(bЫF.\Y27ˠb7UqN< ?Wq}n(#F曚 3gއ*u<(ܹ3|>ݱc0=nӦMp5w˖-hvϞ=4M͛7$/hyH 9WGuqծ]Pq kY_Pn>FT t!H(q;zmB*5֭[ P%\Y-G!2B?%3 ?_AK͜VsebbZ^-lE(J0Yx21J .kiTMY//8Ei<$9G*stXSTBl8p.9xMtۙʜAE'S(_0*tf=(Z3 a309Db-/s9zc8\_ЭE>hTY-tA%Z.Cq `*<17ÊOAkcb*7 hjw*p Q(W&HJZLbQ)U'H݊aVi% 0ɞނmM' ^ $aU*kd%]42];-泂'T(b{RYK-^bPUֺ}K7KN=x[sI/퍌k{bbQ1M#ﯭ={>c֡6޽{O6 9ar$n~긱ᱢr" K wDb-Ze8 h7ሢݓf" Xj?7\i%Drw`2=C>S N0^R)qxBcT}}=Ta(VMҕeX~KQăHgħ~(1:tww[0X6`t,A<PC;f'N QSSqQ1 Ng0=bYU$P h%h40RH/^LKNW}}}` P*tM5 -iT$,Vi1''?Jh_};'Էjdz2)+.dc/NH nswwܑ(eU,HE`9TVLȱL6h7v ?l'Hj /Ew<4c܄Wvn'ܞ`U0MH$@r qQ9BV_{}Y| ]˗ /Ϙ1:ʩ?a\ s n#G*e9V R5kBkO>-?7@ZM(ubIldr\tCj)3?6zb :L.Ͽ!us"_=u9[*lȑ#"T(FD"ڱk5W\N\}lף::C֟^%Jb~vKQ?iz{ <'1:X$1Dd>jiP7(B^Xj HUV6«{AH 䳸|k'C@0tS7rA26HJ%H% /흦pq\A@ Z3N.2op4%`S 4M*kW)l! 2p`a:%ʸ"B]WP @z 7G!u&NMNO";83Ju#*BK&bBfNE KJ3E1D@#,K,bAY[觲8hM]LA .QUq[c{ H$!*`c7[ڟyǗ.>xK Uk,ro?<ŗ7ZʎoLkj_};3zNTslf.w|bOLMME\offVӴ=5339pǏҙwߛ0ꩱ}P&|n7&gq;l'0o;,ҟ솂c.7rቱ!|_'8.[)q յ٪,Pdٱ-UUE~fCFTZmިf3y3cre.¼9OВ,zn`٭xpb'5CB75#tELlKh>('ڮJ`P`J'TC No| ȋ(ܛ{4ز-C7@FJ6]!"jF.i6 O~#qVp;`b#q[-+h6 =4 X Qjkl ?b'석F7ő`S$*:ǘnSdnm۶@|E < _ΔNB\%*К`)UzJO#)d:A!(K/ ??+O>zk/vQg"sƋvFK깹J5bOv>9z&OkOO/v#f޵b/]ethxz~N֥(!'g-B4лdttO0(,vwWj8z9߿G| ?=7du JX-]tzzLLO+W 2dc+֮: ES]R1M[ UKF-qÇO@Zَ|{n Ӧ?^:*@t&''S'bL*Kb ۡ:rucժU sss8 N<ɚ|6OcܲO#!db#jrfqGh%ж$/P}o{ &$B]W/k9sWWZ922ONM._ ՅBLT ʎWU`͘@֜-E",S~K'석&ÏCphzʿUp0!~@ͺ·gp] M19Ms b IuW:Z:QinL$^\ eȪ˖m?|r{;z ٺ6{y˽w4RK9M]ן-.+/GDSTO.1R.(dbrH-;35=5vrbphy !NYTzT#//r wۏ> cٲV\q}Ӈ+nyi;)JHkL&0>*mf ].oIʘU^9gA]'NVd&@TT@ Dh*Ϣ BbtKzdY-CĂ Z*ˋ;IIDs6K.y7$5ڵ+5쒉`b7rynp7`J}m")D@su{c얡k/8Gn͛7[ !1_QsrY~]`7I &zTALWk,e:S ]F7=PNccܑt G_$OnDUdǵDY  8HNr<Ո`βB#3zsBDĮ)"G7R9I"ۦjko?1k4^k}G7m ï_qcȲI8΄gjYtMLzz T?YVtɹVWŋ4g`JȺ4ku lX;Je ʜ/F x6L\7pz\ StʩbHr5-,PV+C Knmr'x'ɟ0A|;N";ΤTn4jgyƵ5ujP;|ɓWԣ>z7_wu'T2$]w'1G5Mo'''EPGD?q󳳳~An I^⥼=+2h$GI ."D&PמpLbsvҘ@D /(|^{~~r-k׮>\˃1MzOhD7G7\aƍk[C甑$p:2AVؘْu̶(>Ob'(~Rx0>C>8b"E\hQ0%擌EE>%AHXؾP .g,R_غw7n{rڲ+|L}F'a^*leFFWgͼi& JjY$*-f5WBۏD)nTQr[N13OAB2<$oB0n,Q d&[MF¹Se,C @"=i$LI a@E,KuS"GxR)ۍԙ4䩉`GB_pq,CRͥ[<B'i=П>>D/4->gYfoo:n{ ?!sOh+敇Bm(EguULVsLMU$E1S![a'㖥[ &X T%`RfP2s쫀p̅R &4&EPXk2=hfhM=0>[gWI-fp*P C}VO^-rdL|ؖxO,Z~gґWWa\ƃ+⌳ۤN0 \'8ff\Ӵ&LpQB`_  /#rjR!!B狀>+WްFFF9gM\Zl@ ^ x4tٳnqoݺ|6nXjض)rn5ku @0]\@OPZ{? tTG+ëWn;Mx^uC)LMOxpš@ׂ9vzNRcǦ "j}jͧj <޻%ܴ۟ize+=sr}3,q:,硿߂J8 G1w*P;̝k\=cXiY(D("ZTKZeTǬ؅d `;Zȯr/`=} x+L 5^Ɗ 2gmG^5b5pϮC ~Ns^HLL4$}? H@؀tek zp 9gssQeD[G~N|Ba"O9Ll9zt H64211/񍿔UWm:s9RiL8hl[/#+)wT*7\*%\X(O7. vݩ۷1=[NN%A<\c!v D0n婰񟛦n6J70]vɎe*vT-Աp_v<ۺ0<;L +{P}y,e ݅](e|Y<]s5{_+K| ,`Ct6X7hz`8x]tɳ=D0 CSmSB-ٱclOeYfCaUv=|BOr$Dhƛsvʬ(Nˌ8Db$@o<"uĢ(b1XR(.ޏH QtGE$Q= D]COۚjZq ,R~9QgfemvR'x;xtD8w5kf[9UՁWEz~\ov{õ%'{}Q,aV+vSZ>bhhxzj&ּկ~gyP'4}d'B ]O1WYr:/b62X"$f n OZ~s<:\Y1b1J98ھ;W_ݣiѳϗMn ^`۹իZGM]3(O/|a Ͽ$_t/23FDWT>rdsSatb2,do~W,@3 .ꁬ&\,)8fX][U+T'+h@eYft>L''б>s!q#w;yQe41-JÈy$TyHh=3|1%aLBUFDܭh=XƎ_r hSM2"P^'L< $HFUny008NNIp}-+<}%f$B4nS*!Q|qxk&նU3L rvJzgfjPNq\'Ptff\RXyu]:Yl{b֒%#7g(CmrFT*1ry-[-|l6n611naZM aاddvy~UO=s*q";: wn/P,~^cjRBænrz#3&TE}:Qd{{jz h|3>0nja`c-]sBserp'c1 QLK]@q9)#xS> Ƕ mIN²#=Ź?+*4$9>]GP@a$Жci*R)k+ gyS7^Jd3ӈ8VK*6)ynGLض-|RBIperudyƄZ$|01;TYgd $nݺ cg}$0 u.}J>Q&R%F: rI}Ϸs@dD\6u>108~41V~%K@@p}`Y0T `RÐJ(^, TR.W]j!pt${'w|?F)f,*KYYfe&^i@b*qp,2b 4၀f;ssڟ*= c[bmsJyI׍AAS ȫ uE5}tڝ9>_?r]d8WXdGe:]4{`icccX,"`B-Y (h/_[e\iXj ͕bJC`hɻ0aXY@YS"ڒOaJNEa"`2ge2,WvJirpS( 5(/ kq ^"V>R)+f1XpA3+iJ$CЅ"+4R߹=Dw~y~K=?N_eg,G7ԥN1_Rq~=S k J9X,1UlO*3ݶCikv~gdyk;>r+'s9}ݷ{Γ¢MŤ6d4H "_cAfAApPA %P?qˊn*UIk󏉫.<;ٷ}:w`R1nU:=}9XJwk7)rDM Er4EKr !zPeJ Wqb!*Z@YP mU.`dLֽͫBuủߙ}˧v]. Ha a߉:z/^yp%]#$ZTxNvba8-,t]Z~ o(~GG.02,0 _$R灿0'R^vD8ηK%N`Asch]x'Cpq_Bks4dI͇c9]*~Kh#ir8%R^t˴ ezlad8 :@4aK !Y(tpASϘs v]*Jw<+MfZQ)r$BGItɾl7'ʓb[@FU'W=ׯNVN900z}B鼘OdͭŔ d,ȯ8Z}c]RFdpؑpq15kFQF=fjd24z1g,XE5xiJӘ5I8L5G'f\"E,t뺮=22yF]QTJ2p Mhq_ѱKpZ"fN ]>=uitBF}f.[\e\e\~2i"Qeߞ^Qb&II\|>w9R . tT`Vtxf&~a@D6Wpa݆G7nঁ&^y߮]Lڲi`ӃEǶ?stLyd]E9].:hמ=DܹWp1x^IL T)t 'OZ[8sGQ+QZ|xۘkw]oZARȡ2:5Rgk3ss~z=]:R;$JP-8rJaFh}FHx'v<-ٖ+ߛxh+VlUKBDD{[ۓZ{ЪxyTB#c)9\>cn4~^RX9+ײ2:Iߝ?}&2g}s|;yuwh}'S1u:6z*hzSvCzz5}K|@v̻*.ZF}džݏ?թ;^~g^/>;7\Ĺ\; y@z~q1`UMl6[,KTʫ׫*JT*UVjj^ 5bq?|sFoԶMqkt3g^p i(EFq\^PҩhTّ\9M4? #8숨 z!7a5UblTROhp{M;}6l'AliH6s-r9wB̅+a[]Y\Y;D[ GbwyScO9/|fX"q\8*0@@1O>Udc=f(U<ҳ5f_1qlS EU)MebH4IWWԴf.k\2VUU-N'-''ӝ5Bv+̞ STRN5U3ع+9 Q뮮)ጞܺGCr4?Ї?4vii9K+{_ͷ ٖ_ᡧGh4nȝWAnmp!Qv), v`[wP_z֭;rҥKzZd!F+5]i BGP&('9NϞyGqGi@>3j4uqgtlP6pH>}v5HPG2u-UYDh-S//.BFUA\?8ARPl0cJM0.0_Kr3C 41B}߾ ھowv ]ӷ6rЮG{ojF}ODdQ% ;lʄ8Y\v/;V5@n&Lo]AmI( &t] kBg:8/?j>JʝߺzNs5>0##fy*dqnG,fq׫ա$3yjJH Y:J3VO;eoSdzWqObg{FǤ2ZR[)%Lp~&젨XgY=3# "HE@uT)4Oƪ/g2tPANT*o˕z̙Ӫ߿H9Xk6oPСC,7moo<)Pf2bOlZBGځ%Mhu]@d/{W^1w~o|]x<88Ѽҋt3w65 )Ki`p(JXIF̋Sl] 9R'x#."LSbv4(9yg3{HL{r!$@Jk])S܎y;wܼfSOo*YpJo[u]_ʂO|Ğ'z7W[4ޒeb Hi RsJ>າ3*E@ʢ,)9!ԂE[:rֈ!q]wy$!ԪT| KI\t1]e?7捝-\LrI K13+f[p s{2CMIݻ|d˜8IBEGAHR]w~gw [Qb+`$+CMoH61Q' 9/4` I®733]]{kfv`p^0u[[s֭[~u7=?%mar# uGnHTnQW?ǎd=iVtWx @άt*dtP.,иmFװ,10 kvPv+fEtkky xkccc6;Aer4@7rV{_pKp*Ph.|p<+dpmV.:R;Ә(ǫa<MHr*gM8exRs,75& }7e{.bIv_ǎDπO9f( 8{ 9>ϡ߼m`U(7D8pq)QOy38 ?nucC<#ke\Y+r=#\(4ڽŞ$t i0\ ;gq A$3rf08ۇtBje?M~Fo:ڶ :/Rw)7lKyR[igz4W6S&& t Wsecۦ@sn[z:x<>wnp%3{{yQs+3б-(暣6\׷/^ܤ+Mou&K%|?p!-@j](OVsB (˔bACo>YYjÍX\R%yŋOi! \$iX6\͔z2-XЕ4]i n [|jԜ'(G813\ٵC|6Ml^Z܋yi\OIx# s]3#QG[^xC$Ik4ę̇=(vn$N\yt9-vϥ gNDŽe1&,{8ۂ̆_kp3F1Dq $if*gi#<'2F+#(j&ZPavܖ̧3Kf\ϛ|H?믽- OZsΝ}?oYG\gh4Z] VGML'RFh -ʽk<貞OX[m33ﴋwmK|QEt`.J;TnT\ʈ0l9ؾhme8֊K lM:cs6L42OuJkphck<:NGl!s,n8 4C]fc8v t h ;OG~w>s.lr}%N6υ'I)h6$m 'Ӡ˜Qar.I8(@H8-n5 9Hm >{v~رÇǏ9s^B=v?ןN֟~3ɓ߉ag}jg_f@.\\[[w_ܼ7kkW=9r5^wu[[[Wzޏ=ͷm7jm x8P(/b 8C+u$.ڙ/ځSS$U( X]4Â$P 4רm^|"$CM$bjZ'&vkʊ =ԧE6FQ)T{]Y8eduY $X(hTszՖi= 4kB>C%\T]f&̒͝ho6}Q2<9C ehږgC#\P `_/c3$@IV*Za(ti5>ZHjJ:@L0ԎLrxeF 5"NI%X0+:G1K]o!0eL)׹fh8_mY- Ptl2nZp Ncžcegy4#ʢ%Gh̤ZKr1G/:Tr4G `LE2E$t44FGCTv- 0ńvS;F &e0`Ytu8ԋђ"#([PUs e?r;>řZTOp~:CW_=<>?@;/\pSNĉ q6G@{Mvm/ _j6ȒL8SU޺xq;I,sƌÓb6Bs@aҜPH,.ϖ\-leݼĒY_z+NU܁>ڥePBP; 6a2axho.]fr"83Qbj-xI^sUAʩ(d`H~6N?&:wٔܵTK2)^/Vw`Ut]atN4sZW5:Q7&?q۶ߎ7lk0̤'6(wKԦyɇp]vV[mĖ\)HD5Om|o'|ɷ38M}HB_.44%LM_w_;Pk3cFFY%`!l6g'Y1/bPB&shm7F02V㡎0*cL&elp

UgwU.+BüBTøkY$b9;?Y5l?6罥l64}^ jzh6l)qBeX&mOeL"Kma/LbQB ABrc6hQȳ\2e+N0Q+E:U3+N-+P 5xBcQ fYnkc=vi;ORn[u TÙz8B-+.5z?|) heI-ui +1QǦ|q)Y䔮rYs]חjٓ¹eTCU*ԁz:ZÎu'Ů]acXJTDx (X 8o%bW8 hDe\)d$'hJaʄuM7l=G0gEPVR8X"el"/yURQysEW˨E) 6,"KBUdcQ.lnAVct S K%eEu3YT4cEе+ 5V-Ֆ|qJwހ Z_춬D(.H#(+͓Vo8Yb$Hъ=:Z753֣88=WMn;Lp,}9fo#yy8! 1<\2jmZ̨pl+7LJ[Y|ԩ R&] a0pn" ZK8<.W[cY׫$nj fbnŕjBƒx(9oĽΡ(%#~/_Ͼko&|8#()ئwÍ 2YTVBGfZp {VL=SLLpahM1L6{hew^4$U._,))QZ$SUR1"˜s|Ym?n3MnD,~c&)|8`GtomdG~{m6s("Eyj#%mIRF‰ɧ; ,Vl8^'Fئ0Ԏ_lݓ)U#Jf,:xa= SzVr"W%@0J*A u?(h(;NE_a^,˔t5"T;AKԩ+oJHvQ:UR:MJU Uq.6:jekREcE-۬ 2B'x $[__ 3!|sXx3s=dIH \Q6e-P-Zw/ +jYVQ[Kn-<\(+@$ʼ9g_f@"%jhNz|}j9sc#]kWs}ɒ%WEzn4566bAIFaU)boO8-_GGRY]]KGQt!r:3f\'$; nn007p9츹=%׏= T!ݐT[lS r"ў;X6Xan)"%G-Bb4B*u[sd-y4)fg,q5S!hhb@[ bq ˹ 3PyPVZjw;v,H0Dq8<1R Xj}>( Luw/MQ5beeem~ ͅL˸mC4j!5.G w觳2oEђ Z{{;*о>)Yz\[ojO?>|3u쪺ǎ;Q'uL2 i֭K$cNiXK|ҥGE&Εd?z>$Yg14q!rp4P^ r:7o^"f -g|*SL1Eֵv3?+ϼtjRjQ&/Dp ]744L4) +0D akSN@' ǫKٳgi(7Ȅ' :oӧ6l„ f~Bw &Eyg5CgΜ "@0Jbp3> ⃏5Tk>Gтd]%<|Ptt)SV7nܸ``x׬Y{;v̟o[[H[l5T(<=ksε۹vyy?z7q_-NFfzQRlL/Ǎt=SC[0j&YS^=DzoeTpNb)]ijUL͗/^q&pVTosGCm6!YDx^^/7fi#3JG u^" am )!W{|%ϴL9[cm|WϤs$ܷ.=^Hz } Ÿ,뼳z_2f!NK +/JF"UWWpq2Z&IO<뮻@ J #\. h"=y$(v3fB[ouÇg!mܸqȬ8q"EU1Lh0[G5uV\6#ʔ)(|Ho馱cǎ=G`4cСxdae$$?k֬ng4aN"ÃA? _h3XK'C_1T(3`H$ .tUǨm7o}A[ (Ycٕo|Ksϒ|Lg0?r;}-5G{LL/y*st=tmyTzH 8gܬ(lRWX#o@ >ӏ=KKKKT_⠹nqW!`Ţ> xڴi`b"憆G}4H$ V9[nԩS` Ž;p.Ż}>c0h[[[Y~ǀqơ|j'5XKjc( fȞ8̣X,UUU g}6vX0/~Lxҗ?W縭XMb1[?{ol]otd]ÄeN_FA1ELk<9Qr̘1;wPw_.E4fŒ@_m^lvGskG3jtb)R-?_G+v59k Ф<PHYK,]lxĉO=8`޽+WD1A%?xIك!9`eԩ8$bdT MoF&*@<@H8&bIӞ9r00 >FJC # .v%a"} FѢr+mo}x߾.\H^G̙wQ"ÈBD[lG>zԶmۨB|QdCs$(ͨ+TdwV> 0pȪ[XStZs-j6+.ʡ?ME)bB!XrNϑOXC^Y]xwjEr@N0?CL@!&ݻw[/^.]Ͼ; Yf= .G43fx뭷ȸܑ+2 'kd6w6&O-b₋7iii9qD6UWW%E<`!Ydel(~%l޼y?'ܥXM,箹vh"օNa&E֭dTݰa~(z8 J{ᅿUd6J(I!-Q{^h??ňR,Mx*vzRyd&T"y9A0;I KLJ WXrJƺ6mڻ˄ R{6$)-p]R;q9Τ.s .Lj!C&Lx8ƹ(ZB8 (@ey7|3PҶK}Liҫ`bN5HauC%%eXWTZ_~=dHَ`Y9ۋ^)q=VM,NӍr9޲HH.@v%=$PQ})nڵ߿w|tp8 6Cl'N|( }>O2%p8\]]\. q-P,3.-^+n 98xeLWRz oyӅW9\9 k?G22[@( { ]LL7}o0 򃦐LVVkHkk=.$Y#/>}䭯_z3g@mm-K ./񐟇&СCm1 ZEnO8AdnD xp'l]+%,R$z{kKnh6&6tƜiΤ.b(/lZT*3vP81~85յP87QDusMLrg* ~< ftS.vvU8ιl\N+2ǫvRXo 1S35S3ͦ=Bܝ!m|GxNc9`|}ahG.3gmjǏ'H =z}Νn:BɾdxI ڦ@Ũ4<< dKΏA)4U.7"x2B>;fR)F).ʋ_\p-)Ɖ?O( 4pȚ5k|wrt92OGL<.OW4(vS>bQYF&FtAP3OC`8UE4UR2Vƥ֞^Q_CvIv$K Ucu:2dsG1ּB1b)\Z?!Gbɲf/fhA0Q$lٲ+WΚ5j#GA  I$3d^=i!x/e=ҡOP37"=3 9NJ|WW`TՄBuT4z> #'i]n㮌'b4(˕UTw~>g7a9JW^B ޾zj/ظg'ܪh4*:q] UɠSR릚N,UhiF`#x s?bh$Sغ #ojWWO60aB&u~>$PAytPv#×:oH ZOyfͩǏ㏁xaY^5 OL6m֬Y@f;,kڣxfnIWh{ac4p<fUJx(HVX8@01eJ<^<*!@[i̊EӬ,CGkG_^ !%%%%eܸel-遖+NjYw94l#D^rңS,xW O>$HyW߿sU, `y/8yQ\+z;0H@vp 67+J)= <4$Q#CKABVr^o‘(V t} B*diwvKh*0YeK[ndj))))E9ƻY̦"fAa(n?_`CQlUFts X45ٳ6wb a d&>f F`f)Ï7_TfwdJY!tdB1 bN|&I~< oWU\7n\L>r~6qFA\kOAK+ vH')))i7PAJ)0ea%K~iŘUWJjxe? MsH2R`!GO@(ړzzzP _ ( =x 0 pmmΝ;9.43^"1$pNgyjtkˌ3Vk=_O o79Npx*U=`+9'P@|)oq_1pO?tҥ܊̳'#Nd`evKv`Xì?#̘`d0~04x^b+*7o1};::p~aluwwa% y0ݻoLFwǭ;uр+^ !---L 5ߡC@wkkQ+""M6˖5Yji$`)))мsD7[jYVgH[l]`ŋP3gΪU9X,:V +%%D``S-$ȢCH`8#9x mmmJ zÇQ E؝oT@@jѣQ~Ɓ@dH$.beTL"mv:~d׿+3n,ںFUWݕh`Aˡm5+*%%%%5*wS+s;v(|}ʃ1. J&?|oo/>{!pS1诔԰ˎ쩨}щ34~X5=`х N+8ٳg\~7rw} Z9A1Q{qlٲl6;f2c]6Ԭ[YQù%ujb4UmڢD_/wܩTfDu6op}.TV9b' )e8,ǃOCp1ЛeyrȯYL(|S v$-ܪ*,.Ҝ99yf5&r@ "DV__iBHypa12bH(3M@Ile<9h7X6:GPCOO+zPAJ-V$'3dP!N]pn6$ϟQ~؅Os4hwqH} Ù?  A|~NdӌZz5@RX &W555X87-r777aW(~ˑH%ׯ_ϼ8p`SBJCXV*;Q&T踒ĝɈ9 :ݛ+_|A}?GcD: 4M$YKIII `$X3MBAѪ[kbN)hixLkkk9pa0UҒ%K~ĉ9f* z`$8H1ҙ`Pf#p&Gyle%x"a<1Zb+eUdFuuu՝~"@'~a 3B0 90q͜9kr~nb^Cscc#l0,ϛ7esgc#G2k #q &޽; 5sݻw\0}ۇG:S%t9ō/.-`b?\fm_җHypL&c=$8;@'_~# 裏U4I{vu];q[ax| ÃiC=ka [nIttt~Rh0i.n+V0JSSӡC֨ :;rB.whȱAӲټS>iݚ^yeu#XrI1 L!ne҅LRRRRAw(!F1 06*qa8xx /ZO?}WǏ.ķÊ'9;>ؾ}; .> W΢BH8H-hCb9ˡY )͛7o۶/_x ` &gs(G5PEp>;i+˅}7q8"5.{Efpwh}6];nQsoF.8{n`6na+*D%8SL,ʚJ>٬H[J#ឱcDž:ÿhhl }܌ ?Vl )s CRRRRR}$XdЊq!xma'I<@WW7S?rhd)vt>\rI[[nSna3UH,糸jOt?GȦ?ƒt_vDuUE*r\:]򮔔k!Xs=M=yt\08|73!noW`sP[Ox>4T3 8%ɓД)S>x<~W޽+/\CᬳQmP .Q=]t0\'05\[o^/xwǎӀNX?*ѿ;A=v!uP}4{C hllCg WT ` Uf`V\~ŊS7gpw=;Y|9ll0*E2M.k׮B߱`aٲe8<ܿәB^ҹ|4]Bay6É5.OemEUe' Vs& bVhόSҬgf45Q`)xߗQ4`d4ʹ&.Sit}gE S<3f{'x_x/Yd*Vd1V,po醁lY۷og|k4 $`,(HdҤI8Rm۶G,0G?O#ڵkĉ `pےq;Y[q`9ƌU̓}$ ك6F63ElW{s`Us)6 7 wE&g* 7HTաjJ@զ%t{ ጄ0\zSP2HIC7 H+0j򼳳}N-NsFM]m__?K#Nj0Xۗv[orplm]9@,%%%ET˿(C\&QlIW?.SGL?iOI}t:Wz\Y൲z9v#pSO=22e?xO/^-bAƠh4`N!PLx0av݌T^O%tqV8W_}q[$9U58C.*o.t@mkYbf("v F % Qa)%!u ءh0~+NDaON?Wt:\#`'crн~1'zeZt{t6h1JzzX0 *? ˺[R?j(tISx_/bwJNrB/ݐcc=fcZH6RÛ4ZnhŶ&6o̽ф?I=6IMZmETJ- uxa߽s0>5{^{3k~Aa?x )/p{c}X6Z>{w[X[⑳ZJ2%# 8HiFTVVfeeرp>|̙3OχbČ3jcqKKKAAٳga7oޤ}B.)|ppe5Xq\0ю&yerV-5ShaٳQ3*D ZfF{̩@ mQwp(c7lQ'N+kXĐw4?d䊶'& j숉ѽQ6~CេYvFJ^-<džwLkCCCzz:Dg/--Uj-vܙ+Wvʅ T_ܹs]h+aĆ8 Gp?>W_}U1Ђ6Sǡo0{9-_QF $ 3ѭq, G[ '''55z }Fyy].7>`n3;iap`h95G *cƌrCN协3]^ڵȑ#pfzbWII֭[O8AQG€/^LϮ $/# Pɕ+WVX|}z*|]]v%&&:u 믿:N8.NG)g | FkpҞ4m,%Å曥K&''{<*ҥK}3gT_|<}{$$9߹s'.~vyy[o;nkKKKuu5Ƥܒ7rݿpN] Sxݗsu޽{l(JҲK{I\\ݻwzM6=z))) k2ж0;;rɸq{iӦXNQ.\`08 MaT%U)-86BYbbbЪӍ͛7rF>P9S.ܗJ'Ʋynܸ%.N" _F4Fƅ,1{m٫ZTTd8qΜ97n4> >0&lwO3?R+A*@ˌsJc 9s4%;; JwlhhOQ]]e˖?8)a r^:3L.Kf4h+Ĝ8%%E_ fr SC ) QnL.2#Ύ؟ u~laL0˘y}߄aHഹǎ/[uaNf a>Q O FƐ$L'MAKL?0Dg!'F*ٻwoiii~~G}hK޺u+33 M7o{C?Oo~Qgb۩vu/YQi vzxҚ;аV4gX.XGD$&&RW6Ӹ5))IiYg5xb8;6͞`:aQLlOuaaq̔g|b'V*4 yp#pYHl d2jED0}XX#džsO`nn_|ܻdɒ*?u(&J'OٴiXSSD)C:ؚyf1rby4tZ9- s5~\8BXGPok|j= 5Ub۶BM~Հ{h;:~;YPAaBrJ#o `O^t0ڵk:T\\ nmmu:ˬ (Sp#G^ziH2//1u <0gH|4\7SXDfXNX]ׁ_:Uuq|'3 =l. L4̍&1Tl*]RRRAA׌b 75ƬacN1$Bh0F9AaE f'cx@(1iiifa&P[$e:'82r˓\AѡL{v `(%9}`3&p\ݺ(.+ DI0ݗ. 'NHH2[VV'P9m JB'x SSS='8ANI0ᰒ K8ٳ K휦x$? y###;n  LuBNQQQ/iػ{RpaaaEE4!n;,,S:9=\RR>'A!S_Z-s€zzz^f{`z]s>op8fEaHB1q wxd2$,XA&oVk5#+wt?@ RRfJA nlllRRal\V+gQzʟZY$SJ;7;lȒcoxآ |z<$HpWEoc+H1\~}Bkkk PK`߲qӧO//_~5xjgg' ]84%b&AaްἼ/wB4fÆ ϟC hLJJ S #:i 6OϤdW n***,i \&'#'/m x?#OpDd$c[:$[A˄KFk Z߰OA [ZZN#b +Va2ุ>`Zc]%""B'1{'::zhhlܼyW^;w cK|̙ӧO2 cbb{sy>S+ApQy99gd^3{_t:;::p3f@aѤ違j`؂f PTz={u6{ƅ>O~ b ;Ɵlt 07c! lhhP:?COOa0QN&sμu)m+<GLf/ V!8G嶵AmqF*!؞Fa3Uɜg͚fb9`fUV͝;̙.Ԁf 6 C Br=l VBv:r,URRu'NpǎZ[֬Yù uuuZ.L+YYY;uBO[[[qqc4^X>W` ʋ]/_dLԾKq]XGTӎ3?MM5)iz;qs~`7MA4(J BR޽;sL(M=ApVXX GB.ɶ h*?gJuu5ڵk---pV%555v LE`XN}}= ?( EWr ^4ӂ0Zd< \8E": ˂8nFF kd`,׬Y}7;[8*2,L%jH5r&dc6p B@[&x<4V }7/(2 31:Ax2H`AAMBNa+u(..wnذftRDff& @.,-[$$$l߾})ݻf0LbC@MA:{P[U+ݻ bVzmkk줵c3Tx3€_:%3TcSS$&XAdI3bXS&[irq ǖArssO: a%K}}}ظ|r,Pz걦#Z)aHy+ehH,wWsResw8{&QI)d'89ɛ+yA!L(=!mb&%%ƚ‘dh2`xxtr BБ< 1cp8LḢ4e߭az`_ yA!< [3^*,N0]8.'"f^C{111s.H?OAxg *6r9Ζl,//vAar=a}!7Nڄ/AeeeL1l^@F By255y.AAL[>3)AV:`f:={(bzS euM&dJO.cf # ^|q 鄒LNؿ߾}_=q4D>KY^ǎ3'kllT V'_4T̉B+G$*++Ǐ?k,EpW~]ƌż*?H-~ ^ zC|7&NDӦMC_WW'bkjjcVd t`R9 E1G5-?շF(fS euM&dJOc( ՝O晳3Bʭ (UFJQO b*vlٲ+W۷o1&D"TylwM7 :S&Mڵk\XX7 ֤T^^KJpIO)PӴ@ ֮AVoI2}||TJJKcNUI3L&):hB23_> )X. A ?=ZxT9"XH*<K/tԩ wB6Vt sNaCPyfC/..v7mڤH85;8, 򿴴Ti@lΚ5 fwşg#O@ޭ[u]ap[_YYm6,ح01h)_Np`}jd2L&SW*!]x4uW<9 fnE#{G'?(w۬,kE+V֯_?l۷TDvРAZff&Ӓ٣пW}W^y/}qٳgLww7kUUS"h7n> ,( CǏ-+9$??_@Djgzpwt͚5V%d2L*aş;mlݟdbLfF4ѣGF:X8?UV6lXr%˖-.3d 577/Yl7oZQQ~zN4 d:Q m&'GlR^^{1 cv a"Mz)T/5_I: ya*<mR!6ejƥVu3kOM&dJB3næ5* .f$TUhaŋ;`ڵk+Vw}EEEK.}^|^xa…`E@IX39믿W1mSޯ}ktM28OJQ-..njjQo&0\Ǐ߻w/–; TY My8PPPO+f\0r0nܸ}Ƒ#GDXhmmasCfS \'8o~n$ҵM&dJ?PcU8pLoPʕ+!Q&k?*p6vvUG :L`aر XU1#G`45f^S]1;o/,Qm6U%fd u8M>Q͕),kd :^H(K.9rZUT!E͚5_AUlLmA tqFkԺ:ޢNtۼysrN`F g&k+Tt߯2g3NJ֭['O nޱcb2BB8,5]Wz[Nb 6L&)=v$9úy; r;pD"Ξ="뮻{GJ]PjFNW8wqF{ќ̐{ب3\5-Te7UDmkk'wXL 4E8򣺺Z :'||̻z&̥x9_d#ϋ]V'd2LTA0ܦT\lҥݍ7Oďm&L&ON%5J_y@{6뢢O?4Cڌ(\AŦ:Y`h|87*H(SkZKq)K .++`d2R`mu0w{N1\u|h'MīʄqrСgSsTD:yv%|V'I/VUqBlذйS׶6YK"L3:&d2Y!l?O%TAΜЙs^ɔP[۩چ⺺:|Te2L&Ů`)&0`- VUU*Z[[@!sdJ|- N_&d2]J;Tcᔗ-[TT?7n|GC݆|ZStFV'd2LTAp{{{0B%-w,YrJPxѢEk֬imX,333(a2\V'd2LTAέеammmVjiiQ}{: &Qsʑ0R.l2L&Sz 8#*OO* T(!-)IDԸ +-uz9DOf9BΗZ a]yyr oe*y^&k{ ކ0vggѨoܢQ=OH]pCﺽG{4[:/奷ԹOo)l2L&SzW CKlqs}f #"<!mR#hthi۷/S!@1Y\DǏ:ڄ'0Hh2ӋY_P@-̋'L7`n577u1/Î`7 -/v+Oe'q80 ejQD\Է|8D%}1i2k\RNwg͚%$.|{QP?$CO.*Y`d2Sg!d5ȢHGc-[lƍǏ4  ?aܚ3g|0rHt~^)x Pr (YB.TWWPJ*gssskk+ 9tqNSc<ٹs֭[ׯ__YY,J(,僕gҩ}xV1l0JPވL0<@+D%f=rR&0[RRb52+B"gDm&al2L&SzCprd4233Ӝ`XA􄨸ueY-a>ѣUF~??O!/WXʼn'VTT4A͘1c+VZZD3gμ[N*S3f]W\cW1ľ)f|M7;_.h>Ǎ.cby˧L2i$5d+6mcq)0F_wu3wܐqm;votq>rwΞ=%O>>Ce ,? -o~~Bp EhvX`d2Ss+GH"n;>`@~$ eIt?~|Ȑ!PԺu~x}B &o6o}G_̣Geӝ7oݻ"n mذΝ;Yfi"|뭷p: +~:W]u{GϱcǾ; _ǐ.X27 K(Sl߾ޱc=G'8h!8pB.x#Gm@ƍY2 ]v9q-'۷? Η,_EY{}7y& JK<ԦMjkkr([:󔩫]:Y~[w= ?L1L&)}tL"DFxV]]ȆHɉ8+}`'?pq}y{,kE+VeBZUUUgsgܹ` M8;U >P Um!Amohh!ת ߯TRekTWWH2:!'J \r #:q%(?d]t`:|ַ/ˉCc"֢Tcĉ7vic>}PSPFRݯOtTJt͚5V%d2LԪrp.7IzkjW$'VK Wǐ̙3WZ nذaʕ4.[ Jΐ1p -YyUF8@c>(nh»* `kVTq 9' =äa.­؆S@2 Ju= \EobPŔjeu]PL8ːF"6ѨspOe(Cpܛ:u*/ħ5\PxXg/Uc/ /pBqѢE0uͫJP_'oL,FTy@Ġt9àR#&tֺNv>w21T/Bg͚r1{ݻwL]VV|WrW_mjj:t(PL2T NC'k߾}J5"1cƼzz͛V45v)*|<~>{Xf-y#֫J_?s?~7v'5L&t)cWU8pf Ԃ ޕ+W0^{3։a~j7n|5lݺu]w=Ep 5׉'JOE$pòb^~UI OQa*!^!s}ҤIv=VduStvĈ>eQ=B4x &ت,Zf̘m(p@p|#:DհP;x +kB$X_x9s1Şþ1xۋ%l2L&S*"J65FZq[J6]bwgyFVRSP v烠\mg}Vz_{5 (TZWW*X'wޭ܉ 6@ޖ-[&N<)2 ѯx8Q{?~rbdر]v޺uڵkaYœ9sbPSS3o<8=cws;KGWv#|))rCyG-&M6)4fLzu8%P'تL&ɔZ]:H Y0wq[^^ZpNБg޸q]wq:-m> X,:,mpzZfGytt\uuvq mP^Դ lSq>3A㾾Q2HS V/x… y8ӧOꪫ}]e0np6vtʝ *cY>+3vO][ {h?} A]T:&d2!H՝@K7xO?|w„ h ŨQŝw {d:>:: Xٷ Wi0N'pLB-++ـ/xb'hke{4 eCfV'СC鬥<6+߹soo,Ge+dϕ+v= |[<=XN(Ha_O[iSqJ:09'rM&dJz :#!_X9X xt;ws=+P ލ?>h4iTow]ee%NhyUFf,ÈŐ+2UW "TM' 3VGu8CNۿ : uhSPPxWxԤ-TWAXp[Z1:pC 6;A,$OCxìN>i*̬02hw>s )!:lذYE"Za2 6L&) {?G{37Nwv a/xE۪ ]W'Dǝ]3Rd2L&bWE3{6ٴ |UWg^UUa8kmm[)uȲP'8~L&t|CpMp.5 g_/qTxT+**|7>裺 %lJY`d2S &'ޡPPKi:ڴ:L!k>|ngtE8BofJpZȯEӀȓ[x+St(VlGE0\Ou #\VSS8 a׌afI:8cduM&dJO.OYf # ^<5}:Kd\cTbH$S!0Mx  ʯu>pDfh`%N7Ul,S5[85`GU&3aeBckHЌxEɓ';uNQ30 〾 $?FtD!. fr>UHb b2S(,:.3{AV'd2Ly`Eխ /|N 39 *#L)N)[lƍ۷?^iL|2ĭ9s|#GA\|Zڍ'vF?uU`?[[[IdϹ`4 1pȐ! $3p LWZdz`"g_| ҂zWȴ179XHtL*˸aU5rY`d2SZ423_w]XAh8uJ$ƣ*$6?SH/d'VTT8 1cɓffΜy뭷N:Ug̘1+X1+t~cG1tP:7559_0F-ǎc`naڴiŬ pW2c ryy93;`ܹsyVӧO7M}u]? v32)#qFL&ɔ:,'(ˈ&M-' N28y=~!CyyyO<"~!/"l۽{?)cA"k)CٙG`J&/w޽}v+ڵ Xqmڴi֭Ι32y}}@|ذatwꪫԃw}WI̋0?Xjkk+,mƍ8 `E=s@W;407,++c8؈A5kֺup&Mr-0 M_Nd2L̿Ĺlx<+ȋ9 08} rga'?Qm.>#YYY?^wWX ʄ䪪ܹsV |ܱcɓ'UF"(,, Y۶mLIP_]]f8H]ï3 v)Ŷ\!_~ePT\B:Ow莮YƪL&ɔZwv>9 f$88';kѤpprO} Ϝ9sժU V\IeS. C%KDe=zb ^!NUhT0Bg Q5^y+jĂfzbI\,[tM|Sdgg2Dk=u؇*N`V?;S @)ڜ-tb_spO&(vH*% ϬiHlv46L&)9"Q"I (pvm`ڵk+**VXq}K.}^|^xa…@EYUW#~m}׋>y "`梿B'fЍYiDbPnU;B|V+X)i !`ͥ"q'sٹs'L04M;Vz46ǭ}'f$0)p)oWrHϿ񻑌;d2L&ӗ*c+`\Tqc ڂ ޕ+W0^{?Vy]0D6557\vZطnݺ뮻 nvu U \.bBXe֬Y ” gp>8oe2fÇڠR-CXTg_}GU SLQ| lb3NQy8IU!sFCV'd2L4TdMQǏ5J!O?8[]]-%X;3I^{M{]uuu~!oO>1g޽[6l-[L8yeܣX89U@̢#?Ӹ0wT[pgz\c,ܧFJO=AO3)uʝiBZ+ 6L&)=v A` tXt)w7>q'LLL>]{@QF/~;{tP^:!; # Ar> &JUg*[VVb !ZQOЬZ p+R+ň9d g6y^I"1V;vB9BLYkTZ9!\ M_Nd2L驴^`bAs>sp?'d2L&bWApXsO{UV.{ mRh4z&S'2BTe2L&Ů`InOy 9[*3 ɔ:&d2nc\{{r|]O⻼۸䜭ɔryYPw= ?2M&dJ.ܯ_Pرc殲V^͵NAkkk;[TdJL&ɔ=ΈBD{Ɠ}Vzp[ >#?я :dgg|-ǮZ9Ln!TSI:"tVtQ-:2p*y \( aGjFL)LOS8#SP{mm-^1Zs2Dؤ[MMMȁ*,PYZ СCEӟkuIbXKK K _GBtC4haRW+NpuuSO=?d2LԪ7 8uf>?aWY#B.-[F &|СC%%%EEEBؑ[yyy"K(Q* *Tܬ'a 2dyQ'xig8#vU#L)-OT]<8̯e3s@wŎdEkHxn^O;Uc Osy+U= [[["l2L&S7 8t[ggAEA{>CZr.`1ct P877#**͙3g^wu'N+ 0Eaa!666BR^^+N}W9g:ThŁI&Mh JF<ՌL 2ƹs2cppWL1 b-u ?3 x "x, si>񡮮n[i_'l2L&SzWwwG|B1LgE٨GBLp/^z@/K% w|ΌC/"ࣴt˖-< ®[NGUhFi"D^u1p@(Wk{Æ YP_7X-#ZI i(`(5k?z·qLɾ(+y'VVIBupY좢"-( (S:pfgqhBNidIii,v< *i&d2V= 4fff;'ÇSmmmtd!KzpO^F~ʔ)ǀO^^^<|x+6:&d2.!N@%zȑzLyx1T1ACȃ@JCȨ{j3e[%}w}>-[[y*UFΟ{WcV^ ˪@ˮ]tȳƍPbլk015]l۶kEee8 \:uꔆ_<M6)6*pYkW:Z)l2L&SzꂉÎ0PRgmsUZAu! *- QXTAgA4p k p@偵LڐG7,1($.0˵p@E}}ʥ`mm- L_ H t; zb*d HOj9J1"BV'd2LJj]LeJKKȄު/^`Q$;L8UA:O{*s&`0YƸfT|4eAN\mEAp(ҭv>JM֌Jhj@qt1U#k>IAStWTE]OHZB**LKYY3"y\ Nۉh; &G.k[fMa2L&Ů Fz7s#tȹ466<#//OEtzP /HcDx+O. !J.Bn@VQ/SGgCrZvgqI4V'd2Ln?+J!`1$WYz8d:jm9d:qDo+|{:ݙe&;yJ7VZ`d2QLP&6_cRN;t4x㉤HKnњ~9ьH[X멎;l2L&S: 8~F8F |aMV usOjjv3#Q~kxp`Q~Y99V'd2LS'XiKyP/1 a_OE2\i]+'Oe?y:~;үnǍ闝uV'd2L2:~{222={jǏW8im2'%7J 3?h|O]wTYr|x=O|U'KFL&ɔrN$8TuP--A j?8}t^^^8رcZpf:Oǻڎ_ڿ9?ocCCQaɎceGvNvvuH|t'w}&\7L&)tDqnBis VKVn8A?~ ·d^w?Ew L|r:\4˝vg܀\ G~Z[[O'(:ff2L&Sj{9DtH'k#=Ժ魽]E!rrrN>#TUU@tnVV:Xo%2j%%%ʩЫ'; ttt0΁ \K>G* әJ1ua#a`X]~r>?tDÏ92tP npɓ'U8t6CǃV'd2LRo@0wշ[3]j݁A%B˗/_z<PuZ, rVٜ&ڃ=:d%þ(p"WXd?0]s%Ļ:XPN<`~~F I Uù eAB35Zę:H3ww#n2L&S 1ƽμILNBOHH(@S+|l2E.aJ\:t-** -0.dJ|f:%LĵX` kvؑWR'wy35FV-%d@ y03AMMMjhhp>֫vfq*X˵O;z]~5X[[J|Nd2LiވHEw;;]]HO$8I@Uȃ#A:z |z[+WEqq1, U&yz~fϞeY1 &JEsg@]`Q#cƌaja4f;G[WaD0J´΃2$عknf9# .?:e0t#kqiĉ[__& ,3ow߽ѻ0XX\/+3A|ێug]q'+ڧO"қѿ^[[ 6L&) u!q-~π&p VZ gpі/_xիWd_gҙB/8y ş}*]Qy!nn5S0$98$*x&bH6֗F^177AΤIvńX+߯\ {a@XzNܴs4=P1+rBVlIbguD]ّ9'3}3ddfvJ|8yTnn?l2L&SGP8uѐ/Q22jֆ0pV]]tR  }'.\eZi_* oӦMo/))ill (Pƌl[neΜ9S͛Jas۸q&N(V ;eʔr- Ɲ:u*<:vX,# .gϞ-*fs Bg}V.)---hۑ#G.`X &̈)!Km۶'O?Xyƌo=z<:oܸݴi@],TTTxȢxeeeǏ߻w|Mw[o}_߿2qLXhlB n̜93ND;Lo~| 774k,ewwn͈رHVV_s2#.ΌF"Yb uV'd2L`9#\w uu5?:'0pƠ0RZdUv% P,ݺu+ZZZ@F "钒EsU(f;n޽yV-"``YIA,ƠAp'fԃyiW0BY$ 7N@K/D7fyJ >t萌㞒"TB`egٳԾp=s?(uĦ.?GNwvwtN:7ri`Nd2L^3.(%W IASڪB /@0dMZ )o  >b.τB>|)õjԤ; w* b0hbG`>J]1 C.N8'u[roԨQ~{qlق8 Z?[˚|ck#1ϱ"#3GF_Pn_:.'232\G 6L&)tXrU?xҥ g?t!3XaÜTH駟4i6|Pʲ2e3/`1dYpkоpzRVzȑmhh4h_\LBl!ȍKJJRC3JؕpxǕW^CP ;}1_r<3ܹs/퐙ң[!l2L&SM^;yNNZ|%K/^r/O>$d5(ҥQ%ذPXXk׮;ްa=K\ODȔLceyÿvmL瞛:u*ǻw :JfT{Rzj\!ƍ;wtw}W[^}Jn'~uo=v#F`@Gᛎ;pplԦZmmrHu$-)rCyG3 UIXسgO[òț`iVݲj@wQ ָ櫂*cm6}UqQpPRn.L&ɔv`!N< qa<޽[;n`Q$GmɁ#aMPEZbȫ *>^zˆ:QjQm5q6۹$ bPqM*9??.168:&e Nhۜ)՟9{' X iH{gkL&ɔ` Xi` Wiii4Zx1P 8࣒xd2L&b^=t䨠/*S2&Sj'rxn/d2.v]0VVVbP.MTO>m9 6L&)=u!U8p ԫ-_U!,lJuuG7o_ϫkud2R &Ҽ˗/n*{qL sɔrY`d2Sьxܝh?sp<_ ߿ڒ[iC lxkNd2LiހH.?5 Z9O@lA؃>Cqkʕ(..uz0 ) P*e`(3gΜ3g΍78nܸ򊊊iӦ.\Pp)2HŀA@\(FzR B&O\YYcr1a„1cQa+Q>X)Sf̘1b烲p'ӧO׹^tyBXEnk!+̌cÇ3IX rFQG1żWUCκqL&ɔ:!E;#OK$L"覂txA``/^zjC/K +;va{ѣG3/L)jnnUf*}vY:u*0ar-BY겲2e}9-3"x˷L,#k׮ l^+nMY Qs Z9ڙַ^yuH:}恔bC`˜6L&): h8wN1NXTFo[[ ?xҥi'뮻O ͚PkV pdt=EEsO2d…;w㙎IQFE[]-kU\V N4nX`VXvxUpk"`X4;lxtLzUW]}&LP(尺+)S+\S4 @v=^}n _ ϝio~S]YYgNU˃$糧euM&dJOHpV^0  gjiwqF)Δ)Sx2`۝;+?VX"zdB~xh{?k֬*i&d2Vtb\"K Fu_S"='Xr }衇V^} ՙnVAEdd8eJѪ8$5Zrʐ1f*c " ( 4rV}oun{޳K~xKd믿Pve Dn?ȁ:!gKµÕmMիue̙+ <YTX]E7tByo"lrȩܽ{w}ݱclСCYg~x!pS{I!Y`d2RP)ϗ~ćJ۵k¿l`y=cܹs|I>;tJҨPeSx21u\JJJXKYX?}tynݪQJQ뀿ź6l7n-vܩmI`РA\֭SR+31Bn۷k͛7'N?ho܅w3NԩS_y tlf;0>þW4i2iE(J/yȑׯw>qS{I=ZF?g0=A켻vrp6m pp:%+\""+[lQlbjڊigf_ضj*ygiyʕ+%*fc nܸS6 @gnii˖-}p>lCvMOUfœClg*e'(ә*-+IKِ]NtkW24I!O0=O UU5/.d2.OLp7@HF4:Ƒ R^^ lvJ߫S2;_JH )$W!Z_bÄz ݐ8L"On 'Bu|sGВC;t!_3a;\(r<٤FɏdyM&dJM]jOpCm=D.mH6$čUWW;[!zAǏ . M& 6L&)5unZ1 :b]G 6L&)u 8vnF[E#( Feeep~&SӪTmƅ 6]&d25w]1`~zڿP C5y1[ ę3gϟ`zZrHz_(r;S9YQ&-p_cyU;|COAy(^B0Cyvo n6tP6vBar4jg8YѢ>!o]xDT9f<99nyM&djr]"g8\-akI59PjꩧzgUEVV`[m۶/ڴiq+Su Ok2#D`3F2*|v8QΓ*u cHWc3ffK|dyM&dJA]Op4xv?{S7QqGW@=9M-~Opu *ү0y>c8q'L'`C ou va9n4^'5''gذaC;-ˇ mچ8^\0?FbPf\8+|+3fɓǍww@-SW;چ(;v.XQ( )CFч'r뭷6m|÷v%9R\8]o1 Ÿ 6L&)5u?6ًjg44B@l W5o޼s>Km_G"XYXyvP~o Y\-[YvXXE2yӼb(X3!&MZn]yy9<\$WSHW ./ر# zꋁ-/輳Ssq^== Uk RgΜ)fqq7,G,?z>}teԨQP]v ;C7S}Xk2[ 3Kq^{ߏ 3ܴrN2kbyC q)ty[kM:`5Kӈ#`f`dnn%K(9N)#eNf1cJ۷ow>x v[C瘏@O8q;w|eB`m!_²L&Դ)7-mZۻG4nsVA 'xg}G?k ;aݺu<~x!HVI&tS5f1* *˄bBzEKJ <{ァF#Vh ֲͣSnlP֜?އ_ё5e\+,y;va)Xc"P>CZ yw-.`nysK']xHd2LMː\Hp!n2O 8Y …`ܹs~in i)P͜93Èr!tūM8Bƪ KtͭҺ:tQy$!fQ۷k֬7nʭM6Aw^|[pkչlV85baQQdܥK)2 ˨Q6nXPP~ze9"/@t2oN8A:.d|^< HrLdyM&dJM]1P_K{sv'`XMIpE-}tδ(Rqg>OJK8|U RToz/,'|sZl bbгgOyayM 4=}Ç=gµ X}e!a奖/v„ xv=U`ѣGǏ7&NZ$ /ǰHL#Seggޱcnj3Au 9l2L&SJꊩ%c`)P ̛7ΝO:υYYYUQ <7߬Z@֭[^;wSLQ!4J9>],OvҥK(/5B< U.3zPiIIɶmxżLRٳgĈi&-ܨ< WUUtʡZ@/WW~z dGV5kZdŊ}ׯ]wޚ oe8J$IЮUN^^czW OԜ?z0fgw=xknXpᣏ>ԦL&Ԭu@0,T ܅/'xϟm*++!`zVWW+Fy\`^UNhYf '۲e2gAAJlKԟ۱cJp+^|C*]mJIӹ~mP=Z]lذA1 o|@gP֙DE옓'sΊ ۧ=ޟ:ȧ*7 ^dlڕ??}!ǶwmAM#l2L&Sj 8y$L["Eq}衇 ?Y6mڈ@nAi(S.H.q[!1x93AY,4V) N-s2]0Tx9q>T3L]2ʗ_C"+@pJ+*naO8~׌b\%s`N Ͳ[|:%cJӪڞ={޽[pf%l2L&Sjꊁ`Q ˠC | Ν3p>BX4|D1 A7:?P$bheee ؃*SACiiB_V(0+C(btsi/J ?be@؀y? c-\tTE.M{8n?p@qq1]Ef%} 1yyl2L&S늁`ڂJ+Ϯ%s)By©/FzW{:r+)ЖQ^ZE\}"onXsb>np 3fee0ĸ&dQװPn*Dyެy\(K$VOemsIͰAY/hg Hʭ!oȩ,Y_e瘟( B%G yyn*RUU_2L&늉 v>,X8(R.4[pTpMoBIF"_A`VhL'!,O>X9ݰDn"|!G\ݫG&tkWʒ 6L&)5uxϻhJ@& B*5D'd2L;Z^^^__ pRY'd2L:Fp2⪩9ժmbV 6]&d25w]ܦMP_o 5\>Op<://f!OpSe2L&SshTPAFLdyM&dJM]JpSL&ɔ `VCRD'd2Lˮ 5 iѴX֝VX_,^uB-UgpJW-p%W/ O:H 4he2VnXvT\"~j]u.9jԜ ~Q *lm/\[v͡]+_W<99窨X`d2.ByG^k_D. bHĵlBIOyEu\t`4MEbeBeeeEݘJE"M[}L-H3###q˖-U\B5&١CS\a_mnEEEBXbvi/SU<烞ecRnD*b*myKQ=9kV#eYL&ɔ*$} Zm8'8qVM8O:uԨQz3g>g ypGL*u!tޯ >:r݅p' Ԝyv;vH#L„a(rssUcU}`.ѡ֐l &a6V<[=m`,veyM&dJA]$ 86[ ǏxΓJ( %n:t|a]hӟ)l2L&Sj*R/kh?)}.9S\, E~GydΜ9"7:[q7nՐݟYPP0rH^3А!!-: rUU'4W˗?(yfggs``&馛>aÆaP*,De往+2Ѭ e[ǎy8Y3rrrǴbw8~6}ysrN<%d2L%'G@¥i V0 o޽pp[nVN4 PoѢEG:u*]w%(o@Ç5jKO>]GeE2R|I]?~<;uTޭ`X޽{c)/vZSS *"@B=x^w䡇j."DL&dj]`iHY!'<(m˖oۖJN2&U N~Vƭ w}-^xw}7-r>sƍA%4 2nذaذa#RK,aBP<>8pѣɓ'cBo-ZĴ\30$_MDЏ2N(fH>}8LFXN%-[nbs'7>Hs&gZㅀe &ܼy. guWy06eyM&dJM]rOOpE\4>7T< _' "q!{?wl[3oΙ3gݺuk׮7o^8Ws)Uޑ#GBr*x[0]xL΢;wt>j;v+?+Z\\, ə-p0Ӂ@creP#5%˹+f +WglpveW<ڥ;l2L&S 2A]:cj`\NNγ>;{6n8`{RmСvr? 1 3ّ#GC 9p=}t^{*//߷o\tIHZ~~b&MoJT SK8btʹիWuurD3!ӊzI%Z衅,lDy##iW|Fd2tA76F/0ܹ3 bnذ ^~W_}ovQQ?0$m .o׊2g̘Ѯ]+Wr:Op!L8U:O޽"7 i]^ޱc*pnn.mo&֥ |kFu]N(bjժ1c0!ͣWI3dpt Yeà?6:tH>nP@Კ 馜.|Q (4}iY`d2RP) ֯󡤙r#̐&~)@YÀ<4[c,@C 33weٲefͪܲe:$̦M&O ֭[{Դ+2sL ̥Q,*$U3a4:ߦSk·^ρrw1Bo߮3v7~xsN+4 ŋ; z\P55G #/Q]8.\裏6i&d25k a @VGO.Q7X! )o>+V|PfxZ]w^!`I4T,baʎ;jBx#r)m!lgz>Ybݺu{|^fHZ |ɒ%mڴaMoܸ23 +W:uJ! /JvZwb UnLo>Viw08+ 6L&)5r?5LPPyTQ 3oT3`, 꼜ڐM&fɓLrS48` 0k BHJO,cVHuQZZtiQ\\ le %-؋*w`-OM\`\+;Vuvʪ9wM_m<&d2R PZ(C``,J| h/'XT˪tzZ\T6hNaBI2G Bm*A;uꤪ`.]0LuB9-Yq WtGPNVnc&(ӢӞ\L&ɔ\*bIL|ƂsgŠ4%t|`r.QXS8Rr| 2!d #*+KTE >jPMCwYU_50?.O:r9|m\  En8q"0=,jlGAJoAY peFS&BZxp'W61}%<&d2.'AI o$q#tgcF(`92[ML>$4"7Dw-c p7y0m6Js];?ټ6&o$b3l[T.aL&ɔG[{mHMAy ^z饐d2L&S<&ӥ 6L&)u 8vTMͩVm+sII .ljL&dj24.|xw^^^MMMvL&u!8?s Nt8dZdyM&dJM]Op35fb_U'aI ˶`d2\+"8*}v΅ [`* 6L&)5u3--;l俘/D} +V(TrE^Ĝo )U>}ɋ^JY-Od2LMX䬇s-ZGH*˫ʳ t!JKK*!L,++;1ƄUUU*W2*־}{gr`ETc]M.TNslْ>2IU6Ăp &akӄ4Wr^U's!m۶ 5 TFv=+ҍUSQ -i\J=s%4`>'0Z*̐9TcV1<}swU#8zh˯–'d2Leu 5| vWD4JڧN:jԨ^z͙3fƞٳgq#G|;w|^kQ14r j2 Ŏ,X"G&2X섹 ԩzY,G. g( 뼸֭[EE=G 6L&)u9&ݙs[_\o"' Q_w`~۷oii+f͚w}w֬YK,z꩝;w8pn|XnFI%.TOX.-<N<FKHn o۶ ? qT_`,Ӳʐv$J tvŊP2tAvvE#_ }v=Cf`BF7yG #hvv׃?μ憅 >Mmd2LZ(?6jg }!yG3gƍ,|07njʔ)#G{)^Y]M8LH8d ŌI&-[ SL9i[ g}x@~L~z 3fӦMX%G:3qQTã $@~(Zw.ԫ"I-1k *2/ǎ7 æaVigϞtR_V( afc ^RR޽U03icϕamy-Kd2LMKThpizz b2"' `޽{0'n:VѲ2.E= ``SN+u]T^ >j(fBS'`hmtc]0P[h8q"1ydz1uTzyo#Fy^dXWe/ pװaDibCλN(ҌٳgiiKDH3ؗۊ0`M7DTWݻ7+bl#wc?׏0OrT=r`eyf͚9rHݝ> oK_aΝ;k׮Yz޵kalyժU|4ӦM[|9ϖkzj]({ Xax,|a>Eu8.v_}]ff/r x&+V`/L%ٳ|W nz2J*7L&%G=bq~*))ںy-;lپu˶-[mۼmݲIN2E }|?yRn͟?_qp}ݷx}ݴhF׬YӢE| ݰa< xŒ%K@1]>'($W@]z8KܹSn&C<@$am 8d|IO` PRDf4Wp̫G]`y2;<@}@[+!cBvq3Xc!`YET>۷ ,k]hw!J'`gyM&dJU]qozZ٘KmZۻG4nsB>H{|*[ogQ79s[nڵ GiOTD(wȑ#!-ѡ=),X4Ot˄ l` W225\1 '.nUg9]1I[Dد@CRPD ׯ>|8`pѣ׬1<@""xawWcٳgY-};uꄅJ?l 2ff̜9sѢEQXGxb6lz>iҤ7|S_KxW  D2/?ߎY}Dd2X)c EΝalذBZ$/txU6"T/VdlUU<8cƌvڭ\Ȗ?% dĉQ mU1Br(R'ޘ92 >bQ>׫ِ/|yL wb63s-f׏;VU9} fbO0bVhVЍgEn4|ISYlN!.q8/dի.|vcƌc8׿*|ʚ ,!J 6L&)u9!.J б39;RPSxd<@|7QL^af>tCo˖-5kVee-[XK+ϫܫ U.PS % ҸgϞF_E` 灒W -2j(*.[ٳu]aUa3jA!C`j~~;w1E3h̙3#!?J!|ٸ뮻/^?l0u?d/}Mϕ 6L&)5r,EǏ(5 ! zHUXByvb ${Q )v{>pffFtz+m®] (A@֐KҢ ׯW]TuT[f6QѲeKOP¼<¾b5J̼|r( YK;HCc`wޭvU@|w;vrZ\gyy踥ة\3rHGW ZPD4&);*4?W'd2LTy*,tj) T.QX_|&O!@!gSNj6^pdAAK`*-r*sW@M'tK _\+AoU>ZQڵX۶m2dHAS)#buyWNh(VtxuЬ,^C~ + *]ʹرC`3t6kXd!`uV3^),Od2Ll .Q[XλQT~W-P#WqK%'ϱsy)L&Su>B#`)Qȫ`skar\G*@@%PL+&St#*Q܂uJOBLӇ'7=r C+ۭj!B:MB"(P!"J6U$Oe2d'd2LTy]"AmPW(^CF^Fn%w0o.D/h ˝JsHn%Z.AFF6Z+l%yʓZCi_ТaK 5= eyX.M !"^&[`d2RM) 6&% .,,z饗lm2L&iel2]ZY`d2RP&%TMͩV>gNFиp¦d2L.` FԄEhΕWa~]/NRr۩gɿk6, oDK/RrJlyM&djr]rE`W-B!=)++KlMUPܴ1OEEO#|O09l2L&Sr.^w`} S5W^s`~"Qȑ#|A( Gbh#ڿ.@C-2*_nݸ.))afXUL1`e f̼r dStc+2=-364&dPƞXˢ*vn*{tVc+][ dwKH;utQ]A<&d2.p}}ܿBOp$r!prznmջvz뭷~`q͚5Yw>S;w~wa{`ӧC$oFI%mE8_4!N%anׯ_}NŅ_ Y]PX`@__7nƌC :t([b(**>ИY ~Å޽%ߦM]q&d_rHy3f|7}ĉ<(=mM`LrF3 6L&)5uɳC44 8fdDoEx>\۟g<Ȝ9sy O غu+xmܸ177WC)S F+($^T`A:@pZ=33o>zf?C0RWEnl-\})񕀙[nLXl`-&1k֬n;`4*:Q<:$ j w5vҭ[7B1c9( ]`7 ieyM&dJM]rOpZڧ< S*+,{8 WgcOBf3fַ / ֭[/`0 dXN]W5}m۶q1aPRfDɺ z7?$hΝAҵkj=zطoP]eUV@jeիW+W3 aP%">#`Zݥqƍ:t8vرclB#[oǏߴiL rg]:wϞ=ؾ};+ [|l`̙;V 0M';,Od2LK NBĉ%%%[#9ɔ|[xTϟowMq͚5d~~> 7oذaذạ`,V-K,O@Ɛ XKB~j0Gh&.]X-GM0_l>rI&O 19Tݽ{BD9r={Tf{ʤY4_׎;*PXBr\(2:x"c"\ZZӃyzldȐ!2H38L&ɔLT#'N@O+ {?w( [3ψGoΙ3gݺuk׮7o^8鼚#@r hU%t v+$X;jilC˅@aÇ3 @ gEގ=y1CL+]Zsu0N GWEP09E4h3Cnnji倲r* Z D"J^/"XtJ}% n.Y`d2R@)W6Yg5Srrr}ٳgqݻby!Ҡ}J "`MU\o޼RS9n8ex K%Pe z*ݻwlx0ˎ;29oj*bo߾%}*HW$e5ak6sOLZ!2ײO>,m4| >fifV2`R9糰锡,=̩t )pQ(9Op$߿}v$*#L&JLEΝalذ^~W_}oʰ=І)DS܊21crJ [\"I&N2=mFcYk_ <'e8+:Ol߿TYuU⦛n TTeNbre?P|Io]P(I&)BJClu^J^](-ύnMmd2LZ)BXɫ _nأ}2L%n߾*qՁ BCs J5[ee%y|myy63J_X-̭UPD*Vl,Od2L)`=qʝ>^]Nǣ#x=^j{h"U!0& #ʽZSS<&LA g=Oĉ޻w)SԊy8镙 [\ii)}Ə?y#Gv#1cư"Cbq33kGѱcG3K4!cYj4<&d2.`N 4{._,bW5ma\FFz Vm,X0k֬u1o|<pkرc+4GŢ(0*+(ٱcGy䥗^[`Ϟ='Oy>U@ UUU%xUpYRR"o+sNxo޼-//0qĵkw >sLaaaMX=p@zر~Ç39oG~z}{Co>|]"gY9ChѲb۷,*A8&d2D 'kk6]FkNͼUiIoߺ-ң[C Wt~;Sk׮0 7ܰ|rxҥ `Ϸ9wӧٳG=bE Ӣ6m-?yo4H*ouuu5ԻI&ؽi^s5yja -`ݺuksu:tFyjG:Egj<&d2.2&8 ކmWKK:ul?nij8^b.-\= ,//Yf۞x≟5k` &4Z &aM.MKLw^MK; F;aРAtzڌ gȉ'ڷo?rH!RCppEY@ҫV+.JpԹŕQ 1k1d镕Jἣ:d>7gmj% n.,fL&8]_nڼcV;uKw6ֶM$(DRQHTnW6ޱcw1o޼G}ȑ#\o ^tꂙ=ڭ[*u.3+:}v:L2Ey.3o޼ 3lvjkko7|ST@R .}kBV zҥEEE oܜ'8߾_;%˕L&dt12uwmZGOIX^\S$ۦM0y䑜)Y!`.:*}TbҤILÇҥˉ'4JbS@3ז>j3 {;vT X!\"'1Y3{lֵL&ɔ8Op$y7;smxdg8|5S0P?> *"kw}[h ʱ©!/B-**ڵkEEp|w;UUU+4[Ϊ̳k׮F)/t yŠ'׬YSRRJzTWX<\_ n޼М x oٲE榒kS 6L&)5uǫO9ף{5ャé`Xģp$*`N ۷A{YVVJ5^:t(d 0áUR%-fUb'ȄbTaZXZ---UP K]S U8:Ӎ ,(p@Zℛ۹s.2r%^Ͻ&MڰaBz1`cǎ3>2o~ۿMK`Vk iz7M'\7v>bAaHp|  8 c* UMЬ`z!c >奀 8,[&aw2?hSL&ɔ2 VUgG"xzK}ǏdffN}A ; P72.Z'd2LECpB+MppؓuKU͔/^GF孺}a~P&ӗ7b=P5mJ*Bd2L&E{b.d3|[cǎ9s}6J.^q>_RMͩVmuܹƅ 6]&d25w}ɟec5'wӮ]t@[__=Ot7 (324SCӀp(5"&WʫgT%eLQYIEA@hnɀ4Nj~K'eD"hЕ'V!}n}NTD$eNL*e"@iab6 SO1b׮]Jsd|+E$^O@Wi{i[5 #$3bRabuѓ^ɝk4XI,5%005wݍn_TT"bI0h :kU,3bh'~b+#I 3VaVq - D"(9ۖr{Uw@ٞ^pg 8uJy} G# B4À?իO>]ZZzI:,ͯW˃eՕ)c 詴#H&jчVpaaa! /Fz2e`N<g Ff͚5a„s=S%Vk:1mƁ\_b0wGE7/D;L&u2K"3YPo}}==M5lb;3sss1ë GIQwݒ<"H$%pwv{KMGlBQ Znr 0 (믃jjjkkkW9>"Mv!ݷ<6`W s ӡ Ft&yҥKJ'tDXA sέǟ:ujĉ.hs% i NNN> (lsܥ{FٳGСC񕀫5Sp:$c`F<=Os8}]$OH$Dɩc}Ėm`ѓ/w*-v;C ׮] X|7VXҚ2e'|2}t@5` \#y^z7k]w5ftK1{lrCCGt;U .g͚=p%K0K]z5:_ϟzcfΜYUUB'-ZKJJa@ѣGcaƱ̎aFҥKnFT, -^J.**niiYr%8fGOL6ydLh ,]Zo~w`i?'C'X$D'[YP8nyHNVZCݧCܺo|-2## w:tw7ꕢFtWSS۽{wzzmv_laaԩtyΘ1cΝٌU[WW?~ }}X7**Db68+ǸAbI`}hEEC zK ={, ƒ`o3ל9s -?CÝxt|EBzǎ9D iLxX!B {R[Z&plkkF8p`?7L`jDv+H4H$Wb=A5֙?q|i۹t`W_}*-++x>|xҥUUUJoRf1:zhL Kb{s``;XG?.ZfnÑJr‚VўDpI_*@L.xyqxff`a<тYΆ7hLϼ |`t' c,%HX? i0̃ZamMұ<"H$%[j[w=FC^U+&whV^s¤ΆnInw}[lYdO<~zݴigΜI3-0aÆM:7rHf_z;;;Eccccaa! nɔ> v> 't9lByp<|:wq&w}Y0(c.\+Wđ cƌ!X ${˜4߱ru+?^;p,JHy-_GܲP$DAVbdזODաC5Yco=a%*NԒoqk~kž{yݪ̙\13: |ۿ?( ''O108}ArP `^ I0C0tttw8 @yMx3gΰ?1ƍuuuEEE۷o'?2<]Z'D|,c|O\ 6.\hG>,LW?U'X$DTb` `V) f9`__V*4;ێ/*gdttto} pdw}7n{_ T,@3v}7ttm֭%%%0{nm޼zyFٳD\k׮Yf:W:L@СC9FaLK?}tFi ݷoaNB:P]]}'Ǚwǎ3gD'Od PiEE1Kؓti2Hb"֩x{キj*5zցxǏǒ⬟ j?>7OjzJ y8yM`ɒ&D"*`Ɇm#)w(h{R,l˲M2_p\` g"@{->"hӦMJoCA|bx"JTԎa#Fa7^-,D"Ѡ+p}!\j+#%7?O vOtWTTtMuuu>Ygg' yUVfϞM}x#J{t30ߚqy<k2ȼ `s1OI1;`Dt3[P{&J+}KNХ &G)]c͛hѢѣG=z8*8 , X-}J;X)[pS4\*,D"Qr* Oi~h8b6ÅND)ZH},rne;y>g6l… AɜeI>}:_( ;rac %p^\\_=LFRڕt(e+Ukt!/mwX~+av`(bNsmVYY'v8 S0˰b6Fe` /:om0@hJp\<FX+2D"';k;]*Vb퐯wDn+>;-0\SSC=oUΟ?pF3[8v޼yQ"3X0 b2s~Y*5Y}0K0i窘ϘA7U̅lglXj3q7m%NM255ǯr<81Yf_$OH$D!Qu<.0וVw:u3>~sOt*d└ /Y :m&A%yE"H$JN% ?+>KXx@@a.|V0G&%@#[z{{AÃD71O0>6l D"H4躮q.84Ƹtfe8˲LYO?PLUJqZZ虉DN'X$DTMKȜk`_%Ԯ]^P:5SSS}>_^^I$n,I`H$SCQ G#FaBrww/t 7!?uեq30c$[q·&٨tOX-VE#&]STKK5et0̒XtCmA/)x*n#Y$/55$|1]zzzccsia8+Jm줥y^gss3NZnˬì%Afee浀͹d d%%X@@ npx&Cx) `0mc<"H$%ਥ;R9ii)ҰR ./_&OZSS ޱҿɋǏ@7I9̚ɠ[&q4Rq2o!BZ3` Xy$b.4b oii!e'YYYw,Y|dpcCA0τ``1CHX<\̰a8.jb`)1"H$ *3;y}wf_2#xdz kۤI=9,,Y0L X2&ّZb":2˄N靅e3` e+ωqq0044 }#X ep茞g('K^㤮S?ٔEI(,D"Qr*pHԁ¢T$! .Y.{}ZJG~o~Դ{n%&(J CFnK?L"Qi3=e"$Q;a\2nWy 89 V&˂qd8 #x 8Jyyy `_>DaÆBf%t`k uD"HUWbl[r>; /gᄰrssNZnٳ ʶnp%JRKK 6'OL`0H-xIi|Pz? 4`k 18g̘Ft&i!)ГT?c0O?0 L0Z,X &p7'+q\CC 3MZI`H$S Cyoo߽@{Gﲘ^^|a۶mK.?뮻:$~Nhx;Ǐqt 1Pex]K,X :;;AJ0 28 KAAat WVV-@llju'`4Q1)lr r"шn&ɓ';::>#G*߀{zEI(,D"Qr*qx5>vk{TJ5& .c̗*^pmZ [RRrٳg;w2 #鐮YF279w%KXfb-v$ܓ&M¤'f\r%Deڴi4>k,'s!._ҥKSN>vT,0_hъ+LbI.\e(ZML`dtLJp w(ɓ'WO8%yE"H$JN%XVO'~uq3ouO/UvVhn D՛gmȑ~-[@oCp^ZZ4/%ýn=Hcuk΀Ԫ*9sG}[o?5078@GphT1ע1// (((0aq Ϝ9SYY'O*x_B4$r؁M΂͛cǎt<ZCO6UWWnwڥtD2n ݀ǎ]eĉGQИO'8+S> yE"H$t% iۧB ٶRP0K؉SNtB]9eqlmmݼy mN 9(`ǎDc+ 'L6l e.Ͷm. dTDb|R5M]0k|ѣ&W+77<o|Zb}Z8a> ,kzٳgP1^_ωv /XY`w>.ПEI( :%;֬Y^ʟGD"H$ l|i:R%,_:fHHwRz*ʡP@YaOfauuŋ}{ׯ;w… `Cu3cP# Ȃɓ'ꫯ[d,rE;0 IꭷJf4^hy.^Ȑ_GtLɀղ,K0va\&>}zee͛q+9p҉,JT_ӧO37b !क D"(9`VKyoeɿ|kiT(pGyS VS\p$v@sy~g}?l20@X#޲&/_qF <8|`%Mav1*??@4Fa`䮮. ygϞ ła| qܸqJ L"1+4 ÇW:|-X$M6.{xw3='LkWYOQ"JEEEq4>$їKD"HJ8(;6P#է\)Nppe{|nJorՁpk׮կ~ʜ1cƥK _|x;} HrC#`| $z"el۶;?~=;w4iN>*))ikk:tJtIMM ,,Gt}i Mr+c h|衇K{#Gܼys]]ߟ5knĉ nt?r̙3?!Ҧ7x%&0(Qɶe 1b6|Ւ'X$DAW!r*/}zv"apT^|i`糕ɀhʕ/ٳgGuQ$x1++kݺuwq c.U98;<:dbaoo/R r- }0Xz=A8ҧ 8g7tb]vAݻisk}eE;ㆁь+">Ɍȼ)ݱcc0S3죥B'"BN>f͚L D"hЕpL0 8k^JzltD{?r-@϶6nqȐ!`͹s/yGF=I-A8'aXcF l2` `.&e([[e;3eo`ɫ[%ncC*~f& e!$`~7`8e {y_x;2$d D"(9R(VP]RE-ߗj)s@wRp&~ D.Hr 7m /`8جlc0 1r/P]ҳ0KD6M2wѦqNs1,bm1`$)li<^bTtL7fg'p}'X$DAun]Nt@}˯ƿG5iҤ^{mĈ@ 0c tww qiϞ= ,`ՐHtcID"HXRq!+e-ljjz^z^-|- TeY>Byyy*q< dH$DATVk gE< [_ G@/L42k}}}5VOO@3\O>1_^H$D_i]5'G-8GpAjJβU*Ŭ(ACKBT'X$DTLƨ~CxeE}A ,755GXnM˲@ 73A$čq <"H$ `þV4>ĽkgpW&{zzЎ#E"fnA$u1ÆHLH$Dp-8_i5[j%lE!gyoc)}Yq{{;}}}p8lrIYQɶ\&qBomuI`H$u %Fu˰#)/qvTEm8/7^a市*WK]Nŵ?;v j~&xMCa&8WS:I6mi6G4:_c˯H`H$A&i+xXMu)[tvcR驾 R`VP~ )=hdFa0tGkaIxMb2SIq .I`H$Eϴ' l<[g pTrG3I8>SK~{G9ԮX1LY5[ S虚 W&tw&&lC@[ f7 t^8.#_u+ sG"yE"H$JB% e:f ɺx i1c )))JCpZ.v08677feeM-e\꺶W+,ͱXL{{;tMJ cwp`(_.4ĺ}{ 2xy饗>D"H$:wuwwuFu2~P."t9[/ \@'슻X 7^zUaFJD׆W֫XLNN( _'?hp}QQM(W#.[7狙 D"(ٔp 0bi?}H4.;j1 ' Hp$S{e(jB/sQQNۘ[MMMZ0F/^7,h{p3t0 fZ7܂'(YP4p\x5ǒ'X$DTemZ]}?tF]qrG@d& ,ǂhM䆆?`ܹǴ4Oҙ1fĐZ1ۧMVSS# =ߎjh/>.낓_a\^yɒ&D"*p#Uէ2w={*dJ@oc+xXukNB*ec0(_={޽{A@oٲ_cvwV VŒ37o޸qΝ4 3O@Ϙh鴃Q8N8Ўle;CטBI&͘1Aϲ;N\---,X~<tFO׌%22zz#шyt^|x,ߗﱼ=݁ޮ^'yE"H$JN% T)?Uzؽ@UUU БV<;@OL:z?ӛoM6-\ѣΝ;w.[zĈsP i0ü}v;v?OtȐ!׼@ !7??C@[nMMM9s'8( 40^遆LGaC iii3fq@cxVVVD#Kuӵu5{U| xSRz3rÖ;s 3;'ز/yQ'H$DAU1Dgg׫`5V!#>9w2?rhZgm<Ko A PbTVVu]_/^|`ӧ6/0 :u* v@<\'34` p8 ,Vֆ^[\Κ5 [\\ :vcsc ޘ5ј&a1(F:gz2 wHt9ߐΩOw~8::zQ:WZ75k.]AL qjzA`[[q3 | mlذĉ(%gڥn:Ybi|JQp +Vj'Q$@z F(nibeñz-&UBgbK69^;Y5O8~ǶW_}G122222ZК~wh8~%ko-ן*f%vEYȤ+)A[wcuuu=s{キo߾M6j"i"Jضm۟Rd2 SN-Zx}10%'Mǿka Gѷz0NTL `m{ȑm S6 ?Ak׮Q %W48ZdG} E<{47c>.8ɒXF zjFzU=tyKEJJ'DI322222_7b9{꼧H̷Y{ْ2XF8Դ ˒( ~A`vm~{:lvA@F$ [,zĉŋw(իlxx@yi!b%j̍78M#'B@A! 44@LW\S;y$!,_;@.pRfh lL/kG @A 7oS*;vĖm5r>llƓ,YqX RMJ3q~k;np\ɻjf3c`hL #e@6c#n߾_Y>+wy]wWB(``$ow-[O;v7"e+!o&0HLɞ={Z\ra˗k@a2o߾[~8,Y4(#;>kPH}dOׯ_h6rxVx0La4ePZ!hIJm?W3^Ayċ8$l1q~k;d(k% <܈r,I$geLm1E"JQڴi / ]lؑ#GV\ NUK*? i^.^ߦ(Ts()2 lB 8/6R)#4Rn~%hoIm/240.1|BRK)GiP)NG;6c;0mNeyHTO/**c;I-`\HѨ%zew4qEZH˒\7J뵸Ec6q܋}.P`16QV\Ā ag"M%9U[rddt9G5Ys=pY(8|.,׳NX><<<ݍGիA7n|tq jkn%l0q [¤κ# \)nΘ?2mn-*@ҴT2՘i!߬lדA7ԲjI8[ռFm=!JX,=81f/\&BZ[Vq,{QKLs0LqGF QŦD=V2T:wjߙ82r„ @islF?Sz5mfNVv\lYoo/EHoݺuݻvڶm7|FFa,NLQOhzGۨM8F$ZjiA/8 Eq"KطCj͕-T׫t-@wǎX08>u!$;9NFĹ?"N K\EQ^߼y3xdd8ʕ+qtseST^{m͚5<b..8FUPM=,v;u/(ٚ::duY\O.?T;Wr[p.&'!t[,׮]sm߾|]tigg'ـvA+<\T*Sf%] }&No)hȴp/XP\=iVjwÍAnAgo +WɊt մ-a=K Fs/?4 q8ezYJo6}j #}_kdtI9K'l5> tSÙϤJ ;'789-Dq' SA8ޗv*Ly;A ÈI)"n1 fKќk@pViz0 rI(.F)8˗?AC Y]ŁQ-EЛ+fNMdq"\`MFFb&at(>WzP&IIf`*́t"C/ӡ')gXhaB˿-T,dF}w(Vas.m8F-%%-WaI `)-2pN<`h9*DT, LŽe:5oLqRjbP:cz%'`T$VjQN(BRoc`H6;gcKZ7fJC#%,'(\8',mj"]lvl%疤$R*=Ne"4 E9ߝbӼA0A$BC(&1y2;ZdJ3CrAKh0_Cu2Z#1ڀ)y]2qBi nޮ3k5#=jG2;p#fk iG8Wʄ i~Cw.Xy`rppKm@UҐ8&%#;iI@-5ϲX0.qW]*P8MC2%/'hV)%]\zKMSv0f@1Kӈ-!f+xﴀ4-.D _|qlllϞ=[l+TY#.r@_aY ubbZ,O,Yr޵)ɓ'h ↁil82fo A&NQEt|'iie n\}O`1l6R+B؎<:|݇4JG/fFs!XXa, >`5ZؔZAg~>۹s n|>?%Hj?uhh(9rw}λF\2q%9O>,Z#W[n嫯b/%Ӭ4(ׯ󔹦36󎚰<>>˓PKm['m-P2~A 1xԴ] #ikF=X6 q1^\4zun%q W#&b̕R>ĂRJm*KfGivyBluABHøаy޼`GE1-Q@b[$S =6P}I&`c9xB8:ܱnOo'd^ e*zluͯ5@ePKp"OujL;^H!DǩUEHpU/oQ[|cW_} >yUW]U !D>2}~mu=zETuN8q7H;|7sA;D^mEF`\RߎI?~v~{7_{q{4>5\qv 17ɦEOF#Q^9^lsm+VymtSOSYaV'x>vhf׏w]^v[ /Jל bsϿ}H*?0xeLNLIO Y$4USR3xڗC T>rrD1eNE_퓘E?H^z.byW?Ʀa-Ku\MrpcwE{WSyAv$01*+ف]%#ݯrND6âz#zeRQOu xUX v֖;qFҕELf~-smPjB1 hӔ&Buk[)oяn4F1TEZɌj=Oiu9,gti "((N+v>fmVkD׻]vY haj .7'4EH {1N}wW_//r+Ϝ9; `76 Ʈm8C v'|;qGa:X6 ն|L\_{'5_wu-[jM&4kixQwjoPѰ۝1'Ysed#+'xM Um1}ƳgcIzqm?Hߍad4zx!8&_T),2Ϸm'*dN\6D% KQ%U$DpTƄ},ؤ= U_$6qR+*/VvL┚- '`_""k~-`iL I!ԑa: :vlLB8eQCҘCiJNȡB$v_$F-!) %Ee)k#1.L d %%Гf%46y# {'ᴕGo &Y#ASU.Ab Ԗ:`W*4Բ%!}Q6aQIiŎ`-P92@U㔛f/FB QVwѕRH#JPWI'AAcgRN'Z2Nm,J(,35QmO kw++"o2xeaj]SS VřC,_oW{g!wMa*dv޺"J U%xh֭>$HuzVkC*n͸|! e8ԳxACJ)/pQVaf3EaCg cӧ2M* Upe]l1Mr#P8.=פvI+.yye* چܞ}qs^$ f۴2m0817|@~nW^y[otMߗ. cb^۽{7)(ݳghlvO8Hpv.A.Z,,,۷6WQ#,Sy8{OEF!DZYG^qbFFܹs;wDy\9xznfrkaZh4Lb:`LE.,OH ~' p >Ǡ`UOUm'CUx2ny+ZmVVVj,tlRUodv<æ)s)Yl)`83AaFT+y̧>eRJFcϷsBH+#`dfEl,|, \^m/:¬Tf)@칡7|8LjO|3X154n:Dp+N#:3\;;=+?)XumxF3+7/bft_yZа qOMuҖֺ!cV:6 ZejuFI#ӾGڢL$M,h}ПbE 홠yv\1 03LhFA ٰr{﷼dRFή-G)@G[ղ-'X0_9 _Uɉ 8^IW@Y'C-CDS:VdSSmLƐ"R wM7;άϽLjlϘ#a%蕨HYFԑ5z{j Ĥ;;KoVFR^)``6M75نrݙp>h Nb5*QtC6I2'JѮvRl۶Nw ٞVIk9g!5YUכBMqtQPm? aڳ5)"c"[]rS(C)iBA Q6Gz"вJd[O:3EwVo4EM0٠7}cxΔ]KyUE:&&]7wbX:QQCzP[=c I ?v1SO=upѣG8p^{[oIjyd + uƞFud֭nFfpR.ҐaZ<\y\{!h3s))f|^jEKV~?_XXxzڏ5Z }Q, I~9Rz/h4hDgVQۤQ wXeRę;@,UR7 yzK(,M NimT2cj/}QasO9)}ZYҧ_5nE)"IC ;3g 79bgޙt  6dm*A\1NP ?|4r aAGإrMQtӝaX>Dn0E=RSs{b-'8%i(׀OO┋Dkm cH> !6K>yQlxAD|S&,KCrJ ԜSȘ5E%1.8rێuF"!Ř كGYX2E.P0s;9+EX}{Ju?ޱ$IJ tLPMyL|nVsZENE X-m٦H^ܨ[3l8>5@iIE4JIW7kj5BbKUqHǴ&a -"b9gL6Ef7 Udl bDJ&6ePVN9$kC0JN*ͨ`tB^F2āa,>"6ץڲb%&ZMNZ)c2"D+QX[M5#cdO.+y|'B$(Gv^q/)ERutBFq!Ac8dh Vca,2{>zx3YC<C<úkXvc{Mh!d mK~P/+(( E8OkL9=zxr ?h ǽzBE&Fx<@θ?䓏> /ĝey555y:Tpx> ÿ&Ɋ ^.'⋽w}~ƤnĵwZ%\G!Xއٳ'>~Eތw(rl-ɲ,ژѦۆu84 ߱cjb&t3qmڵ'OFCytL6ɷo}vwD?e[[[ћm:*mB4uFxJ^Q1K@(LH)ci;eEWryгZZm cqg.<ȕ?(Q0) 4$mQ psNCS" L3P^ u|>A/T-:(}YVR-\Qe_<,)r* !9W=bKtvYPe>oh X͸a]Z 2I!!q 8F@( l:KpN1)hþ}P3- (#Y& Kin' M4݀T"f36mR\4G2D 7"QŸfD6B~tllU PmBr(zJ StC d6 a]fpITZfLrq$6B|5`<:MVYgsX*.Bx^zgI!w5f6EX3EʑHHHV5 O,g"p 03 $>4Wv#}Ο?K|OS ]`;#gg>s³%<o|޽=t萷 qC;|p~1Pi@Q^ghp6 18x=Z]^Z o߇8:abӴvїJJD/h„ XkOa tt7 oI̞d$(,WSAU s p .MFyK͍P*Ro>dvk"T ӆ ys{T}cRY1r5u5#뚑ʷ-}Er]#Oym;?r?!ZzcoK2]JYRdlޠN a,xYQ_`.h[{cV!W)˨%c7^\E9nC-;딚tU%{(Syƈ;h'9dͭt! W_Pk :jMwιcO;y:6ѺpPIasO< Mɜjfi<"X{qwWҹh.`*).p:cwc;gs-lD*25/8fMH$=B4s^Yj݈;Ɔ^*ŀTO/e$l)ܽk<ݲxƴV͘;t <&6po'CU)??免DKEM]u`,J^C` -Axu7ͭg aJ UJ6}s90L:$\4$`oڵ^{nD#GȲڊX%]ٳ'RՊ>q4s`$L:|,GSuF ԣGoҖ;~1Bxl؄cJU'G'~7ܢjwkKQ@4% @sL WQI Q[m{yB sN_i,p[f7:fKP*B'㻦>Z l%ƀg:pƲ'W"ƓdW|l*b||1Snۀ'Nos]1 Ѻ RUdY]2G7=O:t jۭ~e^WL$a-&y]^3_y 2i[!f1kVBw W<<{+9lr/8In>oFLͷ 7h5X=ܺAw~v *@AW\"_s5555^7N0b'mHS]T2,_?lA 2/)Ŗ[>`SNp{Lp$jQN^G,MœIddp%֒h:w59E Ko [ Qе!bios_4@J7>U ;X6ud#3ZL2HP(@s Qp8MS{c+TYPSi HT@j4rWO7;jQrò0crBɂR5|2A6 ग़P,t fzJ\@ 5BiP-2 MZPyPǿԍKhiLjU(hvI$P)xa}0^tcnD; .n9 NL*BX8q8 (K T !/WT0Eۅs !Y#'D= )d!$C`P9&UtdIZ_B,ڭ4tk 3Ub~[ [;>0TF1pLPr $ڒCQo;j2TN(u3$QgXu,/Yv9'{_kmŗeSLٷo_=;00/GYO W]u՘1cN*x Z*!pH66ro4/Z:|ϟ}~醣|s~ݓΊQ]8Uǭ_|7ZNd /14w-!( НkuTd| ,ddVP !E`GZE}h-Mp ٲZl-9A.lEE|؎h͗F^mNlC/2l 49sBR.3Qʖ۶=I犹 Y0d^571MIH+'#(hiˀxZi 2r nQqR8l8Tr m|fjĂ(Mf̀dHM(Ƞy5HiJ2ga?c_вMzIVU#w Og>H66E 7PT3O5$JjI@ؓ%)~N{PHC{ܽoyV |BM+7>ĸ)ʯ^~, * A a cY;MЌL岂mBXQ}1p8Ǹx7Ma$q~8vH$L]H8rT>x=7MULFwf gS0tR ]ի\G+oWt(Ibl *&$ oqX/7cϚ#z]W1Ӵs~"˦&DG(ۖS$^*\&Dr)wSMXE0K׬Y3k,hA-ve{O .JW\q:OjYb^|<}+,  $NA^\:sΰ'b z;]zlFڻN51TO.k(sP\L a ,#eXz7+uǝP SD!@f+:(I_Q)ċ:t qāel;/æucV3Bds"{mʂb +Fj~dX>rď~o73EbJO[X\|5vQ VhP'>U/B;ά 1D=dPU+ڴm444,^eP&ϥHT+@$R(Җ I(O 6@M͐a{`K/,ڮflBz_ j]Ls[fM>Lz&5:rW*F=22k79='G .rT*Zi "Z=2=37? [#C p~tʰ1B8TT }`jBKz %5S qDpRFFDnV<?J7LAsARpɴnxIװ4چ{JܰFoϯNhiA;aͻ.{y+(:}4/+im>hAW 9`$g8 4U(*2ñ|P(e1o9S s!wp>ߜ(7ծ^zh޼y/>) fYV\&nRlVE-[l…,lb팛8"@:;dH[R%I_.[HX#)%R8\ҕ5`G@|zpφD;'^`w I@: zWSeSD#r&J@B~4(r6_W`VB=/ YSư}-јGrf*<]fB((cZMqh|N14J[@fJd,xFlAP#8ѫn,mcFf ꕫArEd˪$ƠXuU*놋$# xy8Xr;y^~S[ynJU >_=y ~tX-1.@gx^+`6V{LKr` KC=G-Oغy蟚?ޜ9'@w֏y?f8#^nWΒV[SGTE7w zzLXԖ,,v >hJ@{y i``жb[f2M b;>_>tt΋[cz#Τ3;9?q+-Rn.ӑs[潲I(26Gh+MyTcQ} MA2~SIp@0%UUk 7xrGF0[uӝm6,}rw,ݑ_<5='fM"{{rͷzB9nԫe8vuu `gc,ߵ[B{`α?zstclG MjOZd╚c|zw\$B8a_4}ꪥ"Czz掶`+$}B ͎&`Aʾ9At^~r[9ts0s)!׺W,.޷=a_z&8^pXBoqk~Ք/5c\X,b}(Tgzg{CiO\7={v\.Z<7tPU3 Ç9z;H 9{joggѿlܸq̙uS9:8~_Z/ʋ9/a:BKbrl̓uMzbZxKh*5V S|d|$Nq3oSЫRa?_(0x]YUP@LCS##-*9-D/si0Ny l6 @0uS.L "e CPPN#졉Y*[6 :$4|.tk*M c`RiΨlm(7T UաlMZ@֪b zʍ|+-;X;+e=5 )ɕ"^6bNNVb4[?|bar11|oow@1~wʣ?|χ֏Gx4L㺫Yƺa^ ԱAx>:PCm9uc>v\q",zr9I5>ۊBjlaSZMoN@#S20Siq >{{{{g]s7w-4ҍ08%&!^q'H;)-:@.>G py]&Xx:-ޘ'+nDuntmm~GB5NȄ"&VATDE@!c~&iV s[zoWT,f=ez+fU/l6QI9M4eZEfzP0~K =\6ˮuv(v?|G}ĉNҮt4>y^^OD'CX)k۶jiqݼ$F*|BB>A艜"k;! 2"tZ?|kyڱv8z-P/kMt!RA8tF[RAD.%O魥"A-jk 2A:_&;ĶZgH(>|m%w[Kz2uI!( ]h]z[ߜ\2j % خըaxN1 lkQuH~lll}}]q!(411 sf\xAiUUnj^ZZ()#v?qg 8ڑ$[\@$WT4(Ukxdee1LOwu. +R "hXPy.2ԎOhۘh,\Y?8">TՊ5( BVWW!M-Bޑ> tlll@}DQH)b3ΟC-|<Y(B4^ך ˸Fzhugn~~ZկZ^^4 V<ܹsslrrk_{( &&&$IlrnwO81==s7hې@ iion룍F#R Xӎ :4 Њ5 C+sssácOAӅwzxQ2"EA.0V,Z/xvQ- m!`yCdڽpv:=x"jzJ࿂]D!4SNVh&Ur|?y|𡱱wou !ROO&m+|g溬/Z6Ο?YWhp Momo /ZkT*p9!mUqiӸH%HK5ԓMgŽEt]<:,)˙t T2]^k}d_֊Jnn' Kbeɠ}xU, +i?r$AVsO puKss^wu< H 8 F8gݿx2/ nALj]ŵnc++K `WUҥEj"HKjoò: "PZ )紼 h899qÇ2nC_ZZjzGa0 S( `S…K33t dgyyuj _]]G }k8@0f#t%311s]@y\c=LYTϝ\bjbDZjuuz<ةw~}w_p\YD!'<$ E~W^wo67[_qw9}:!'cqec4J+n/Tu/q+9K+jdcn7S+I&9?ApM魢lBէaHG`@(&b>sw?W_}ry:ӧO8177n}jkk+;wyꩧ0[naMEA(sqXxӦMP}ȑkCs-XBOcWp6Ses,M4,ҌZHJ?%7JHUcT=)Ija OB1KO{$Q@> -Y; P.[J}===C_ž{CȞݿO&7m7XVڵpa%ǎut޶*#DC__?~axxC7o6<9: w3"],~ٳц8L&Lt8q -5#_㓯:(3Fw]bM~S0Bwwid..qf #m۶m\5G[8"k|۳'aPҥ--˞Y1<|"+ԪtE`n,8cMTi(-hӅ#-n' }%p=! LcSUA"۷'ѝTe8L1`VS4ǜ€L^|9/:J?LyUwWG:i,4]Vy'`MlsMsb (5ZGYי"dY*$kc4{*eYm:kƁl"OK Z7-ݶl3q)"͗&hIN ~uaT^lU^ ic\R1l&bu=,,^)VkH"\F vbYXpaX,Wccc88GcwE2kBV,??p҈,JYf'\m$hm=YX2lgc;;:t42<2,fٙf:uj#sZ[co~ _??TzM"G" ^,\NV[!9Xah4wlpb>Չxp=Q\R ZON7)+W<וd:߻n-LJm~ˡO/{?sbJ͟d1zX0ykƼ@DR*C+\5I8pg^\15f٢5iOS~yvM x4Q_a'޳JVU&\7 DN$xƪ񌥀uD'S{_yy}9G3N`_TUBw"Qqݘ(i{̝,&z(zo*R(gs{&*5Yr]O,^y:\FGo@R,N{.oݺT*\ g8KqQ*iO/eIn%,q`W[߻#Ѧ/¢ TOKu=6`*ƿO ? q<]QOԒD:͍C㷧>|PϮ ֿsn2PP8AZM5ګWCxxփ24'' @*LE`?hj{ Xm7ct6d uX;yӋ 1X qe2)Jr$ `X[Ba_kF-8T+bǏVx77lzkмQT2 2ɡW-|qù]AI,CsXcb*Y*f]S {=Y 1hicɝ[(Ҁ,oos߶Z(2n915AT6jE~di';B8!t?T~{y/^49 8fKd"K\J҄P~~0=цr5 ߼uv8/XԢE-j_>%7\==hL-#LqnH( z8m˅Ruj|zBX?> 7$ɵݽ~Q, hx˕A99wrv 6)*d,~b,oՊp;w<68k _{ׯ6G]\?F5ʦ#Csvٝubn791n.gbb<tV@-иdDK,,y̑qϳrي_'M-7݈`?#E-jQZԢS* 7+nRw%Zb{O %ǯA{qy,Q*)@u"@NeRtzxT*)$I(j2sl>Q)U)PU45^? Rr,IR HRVE\.`hVP0B!YQzQqq躞Nyd2hiJ'*|kk+mi&h 5 7s9_ 01>q,ˢPQqwn-( . !̊fLH8# yFkh>wBdۻH*\]}3wĻ D$~A$ @<EH-H <^>=}nfĽ4>:ur91d]r26PA1ZVWW֡i|'B̽ig`z믿o,ZEid~ptݻwQ"&t@"Nr4`IT*(h5lƢj'?{o2IM u \MIpi?3nsjӍ6L!CdTgqP,,+1 QlP;.\n$G,;s>XcŮhP\b m\t@vY"dCb̑;vp j)흗_yt D#P.?TM{Z{8d6_x5J&S(eO+=_<8ovכ-dš&m}wwCVQ»<;FBBBBBBˀA= A@F(OR bL,|%¡n2V㄄IʈDP%+ɂ4Sf^_aI(B5d 7s]Vséi"YD ?+c:*Ht]qs{l@ ;jZkWzC*PƵn 4k:sV UWȿ8Seb͵R]aT S\ '"z e5Űb#Y78Dsl*pzRN]PF`ɇG#4?zyDΠ-έ`B’. ^oP[izbI?FeJʃXOS M$3L/l݆}`y ֛L'>3:nu=}lۆ ߀a>ں 2ŐC9m #boݼ v+z:!GaZ_z$$$$$$$ m gG[d_ ~R5P 6jޡf7[naת_HJb%x:iEuh7 p-bnWaC 㝿VG)\;p լ Q4N*/!!!!!!!!!$\\nď34(XxpEς(wg %:s_2ɕ?%,Qs4G{'@n}Gsit}jcc,>_4t/fWŽ9_Z,9zȬ5-;J5Q17s"c+0G>~q/T0׳+j'iXB!s6 'y7O?7i-(&+XIX3{$WsE,rEĢ-Oiѷגt p#o4e1ys:oez6;`J8&n3;#n/GOɅEm>}Ks^gh^/F.d_>JDײ!x+ KbODO py {_ q@"^Qw~IENDB`mondrian-3.11.0.1-R/doc/images/workbench_database_validation.png000066400000000000000000010623711261646570300245250ustar00rootroot00000000000000PNG  IHDR*tIME / pHYsoddIDATxi$U]ju<ba#Ǒ#V̟$2 B ?[HcHFD ,Dr8Vy3o륺qέLlljl?Qyյ:TwwO{}3߈uKo=:hJZ2%cZ2G \h i5 \os[(| sZ5Pj88ǥE{7IX=vJ \-W@؈Y-F.(l.Bρjrx,4H+ڄv,&²mS'q Ȭ렜lx_{o1H  aB܍VHfz@_K ,ͶQvNN0V{I''W8_.8wQ}7I'oATHs)628.*άcV9!wQ[2uRxtv< 6's "H*;k*2/SnS]˲ETa*[\=oCdBo "nX\r{JFlӿMlVAo;~폟Kz/^ʿgnܼNs  w.͗e+q\g\G+q{ B?(Hƶ}nvLЌ;k69J$9YC~D Wݣii7csuW:I4]g-0Ы 5p_)95Z{ABGMQ%#]Bk0$;akf ~ Yb-T%[No3["C%\P3s4B,`G3>hVثU!uӝtrMƞwrb9B6 !zX%^kK~:а8Sgf5s fE];<᐀,! [v,V sbٖC,ܪË*}I>)رR ^zp19jo΃[{mӝ~kťMnfC99KB! `(ȸܷtgZYsN'ٸ3&fYϝ(ph䋅 Kk]u$4VZE/2r1HtYGLh(kA섄\ˏ/8DA>A!bަ&{c匠z^斵~e% Sm80j6MB_X_4ͤ =Q`%k{H>H\#pj i "0h5UK؊ܧbbk&ʶLa@qg!"V uڄ7Az.et,nCAzoqa(%4W( #jNwӝoBαGjz;7D!?=dwk^쯍G9YvdXTa#F(sz^7oX 5% Zc\ 6nuڔ6y-pQ9Mn5?kꓔWP8BrpH=?Ck׳xǍ: s?5ӨTL7y\fUY[Kd[Q,AW 6m /r,$Zl{nk?Χ N+ }a0?5Ͽ{O:c<6]=ͽH$\=X~AKr7pbkT.Km̊::uMyKѸ'!_@ a] N1NczXokCa(^3|CEyY.Eۢr񨖁9_Ktw͹am1+ac {J.hOm4aӮ1fglpG%* ! ĸ,-!<Ґ;KOǯ8C9uEl[Ul}V4Oݗ6|2~Mtr7Op4J;v'Ωq?]~{枻ooO}m4MC“F3ʕҠ+-PaU64-G!H0+3S'gFeGpo/m$¥Qz1zZwW3um,(k%RG`<'sc h7ۍ66;L%:UUEQTMpRJq`mmKM:<n,S,h :Tםַ.qErP./N0`Ky<{'o2t/~}ŸQ3;s7c{ ڠI6Gg EÕj hz<->R\\a>z聿㖛7M5Py "޿~@gboE=T~Q[tW.,Uz`T**D IK8mmU.6U]lT!z^mdE!We͒hjQȔ&~V ^3";|,;\P%tY?ٱӜ˝=QY=15MdI[dRiA48%Ut$QU\YmC,a]As!(Mm_Nm/榡IJJI a3P¿->j՝t;}R4WX݃NN ?" -ڇF[Q::'Ϫi(E0kJ=Y$SVh.i|6v?_ʅQm +MbV 9f5/E-y]E}},d8HA# :3ḚG  ,EP(0"aYx,o[zO XWw_'>~6g c'$`̋(#=j8T6:P9UiU6|w3JBEsH4 ⬴G^nO$OgxXwncr '~ .Tzzktm^ 6\MlΊa 4NfJҪԋRq$tܺPSԀi6%|=)_\ٴ&0MhNBRXFM/-#g7R1%KBa}o}P:MTя1 @n{C̱S , fs{uCbOdʭʭo -V Ha a dn=)($uhd$,^2οqX|!qHUT &2 ܨ(Gݡ"dP$Őpcb֬d)+&W?lMT֛zE!Ypg8G褡t*vM ۪oRN t̴9Uqu|"L3,' 6 2yޮUJ<;3BAӝja)"̐bFxgYې3PXqlbfTtֶ/EaZ ,i8\MI4-u`h^V,3To6BNH@n"U{ϧV 2IB{W10g$jD!CߔhѲkE+>=eHhcdn$%peqE pK(KҌ f1$C$ⰆI gQiݐT SzʞS>shoKUWV˕>uK'2RRij.R퇬0.sP˕fvRSvΤ21?^s+ 3d!P1G> h%Z jw)r ),-@~%.> 㠨2 aV2N V~ac&%S`A,9JB*}!3RQw#,Ys蕨ZzP!wiSsirlWǢF^ tUL$>4/ri-nE+Zъ?l^mJ[qH(zHҜI!$ 8,u I H@))9PG<5hڄF:2 ~7[m)NaDM"#/@g߻W׮ӓ8?oltEB*iTI,(T, 1 IJ?Gd?tGV: ϼv ş_w[[za<獜tv-o|ݱT/}κNeQ3dFIXm7%mtˆ(E@Å3qf[>nW"qKSξH<0Ir gjzNn&!Ԭ4@jew- W=lB!fѦ4imjC@oz ,:DH3# M]j^Ӥp2v@oovA!-pƷ@I{lVʡA0KHSWřTyB,FyMQ(p=$S 0"tw&ě/-Xrka˲Gi5~(%u܊V|~gc{?@ A[CFX~Qi8^ 'cε8,dWTQ։d,2g(/ڶ1t٪`(f%NO1REBɱwYhDze'}m흷p岶]7~sقe|+c󖒝Fwib)\y-^0Q |aFoc4n挡n|֮}ТGNu z7{g/Lz{Dͷo_<,wសkXO{G 1VKEكtOKg^&mf:b.XsxZ,{nZV`^?7oB>48xړ(z*U[̵]+".l^EizM UAV_;S+ 305LuNɟ^ӻ<銣ڽkL38s-dT_~q)tB1ENZ3q T+$g<ʻʱPM }OW_wP%j)'Lu.)Mx)aqx O+f;;oc~p̊5w@Վcta`k,o?ፗ}(ʮnpIЏ)iΜw֝uw<gvc"O >t*zPL_4x9{'^w\yt\ٞ7/ wjM[6Ln;pOm&.vH}rRa'SY}ۏ$?5/yU099-.:뢳n[8lB"\jm`8&=5r{^T/^}ZrFH(Q ́x=k@=վT+/9wl+5~bر_Z.Y{MQ|87^tަkS-QkD?wcA'FTw/T\̈́,33 _pG#WsJpMbZuv@}^ӚjO&ZTt^'iԴǮb RK8ê(LN)8W.Jf(Kj_\BFBˉ C_(IEfIX&ݒCz:ӣЌjf{,#j21^P :Z+X ';HKV,}K5R(Ut إTXpA5!cnY,e>k;\>\6u*gf2p4o'n#@|jxp|zˣ>g֓;wc8 R/b:@&2X *ψLd1=2SbE9; %)Wo`r0wPHuLjl,#=ʶ:2qgc&\wݕ?o9WGDnE޾#C(+p39SlJqsu04< UQ>ʓ'bY Z*|XeU\زB,SQ(3o#Oj)ciM _6[VW@5=4,Ɂ“\y۶ɟɓHI+nHr˜ ^<LARLs)#2D[,bZq,bQq)%CFQM F9>љ$dQGJC(~?^r׷n:=l9شm61.ȉeOEbRd1$pa! svwGJ[/rO-'WpoH3Ųm$򶕧]xi+nX?ƛ]_F~(iEH&=Pz{]4ouM$?\([|IT|^Ӵ Kir߸/>AsڤÞ v,w#)pd_̝a` 8lOxss7P }Ͽ{99{y BKGkl9%.L}<@Sr]w愓+!T4=7}:=۷=G.,I"VV&@$ge"ٌGRm³G.Rdt~Aʚ&DԴ5իB[`Ʋs2%GfO ԴǬb%BPHBo64ޫHvMh8)c+M7Y_ʚ9#3Aքx]c"z[D *G  Kp8 puj5Z@IvmY1 ;&h4^1rOzST ^ x&O8AQF%Ē]=5,PF%ɖ߱xŊCySZZ߼PGBP %8\̈n_p\p`7>x5'*hRcsbHJPK"Ah&*r7{RN`"@I8ba܆ ڛtEWoYw: 3g'QE) zoxai#:OC{kyb٪3ke80:sǬyK\h$RX0JBsv g ᙷ7\H8kF ;woyz P&P `] |ӽNӚ}fKxZQ?3,EO[@  C2hȬ#fSR ƃqŒ~Z/x8pcn 6R+~qp0Qݦk=H ,0R`1q+HCDm=%m7"#H^{[Hv?gUEExӈt(ȪTB'֍]QY>2-!;L)?ƭۗp#2̢S@X?Ȧfv8zO{EBD9'1ohoX5S\@>s0 E :ۊ0gka $fڥG vlxSOGؘ E %lag!0X;hi[~BJYBaԯUT5ӀQI5L'gbE~LJrI.%JgJtL ߼h9'A}hNK K!<ԋT#]?8c7 jO4]%}qmxf&-Pl^Ȕݱ􋺭Y˰ФFq;#QpqVjVjW?(2Wp.(ȘR~s-"GBASd}JŢSH&Uʠ}mmET|Oݍ/ ׉=㵎VQ]G Κ婅r}1%wV_Žw{Ɋ%ҝ@\KN/\RJ0X?8vniI0W3sg=58i|GNEqeP0'Z^X(F&`^r >}Yu{g+}[jwK (K`GHHHA!wH 1<8  ADD2(gxܥ L<~䪎Uk>S9o}̗NN6'ءѮyU&u/R8(`RÍtXlڊh/=JRnpR /AQe/l~1{=C3/2o۝>x #"(n od(}&[`w[h8kmA0񵓙huǺ/Lfe旾U3ӕd~Eq".t>kޅ_wa*"%:m=RUcfZFc.z{-NjU {9xlx_yMuadl_,@d7Ve)U1kmgl/nc=4cf':bF4fP)OhƇb]Hp4?xVDHeRuF-LK#T3U@h!?Ǹ~}5\ pXl t6|J[L[`ĭ4 Tޏ"(h[OSUvBڢu,$T*RwCӨ{nv?Y*dUB*g'EZr੾{Eq~'{ꎝ7".$u^Tx!SS7yݝeynE 2ؐ/-5ʠ>V-̅:׻rx#r[^HeQ\HXtlN4v6M62@%e7O_moEȄKƝ#ǃ`ڻ_?4!+0YfHż17wimq߭]WHl-[v׌~F(gF#@]g>gI¹ٍg]QM߭BR.bl>-k!'y~X[ nlIK}k;t")-9 &=.UWݸ:rAANH(1$WV̀g IŒNolCU~eĝzHG)MVTLS)j'y 2D 4N(vj[Ij<^ԗS0/޲4?":+w1=9HK8Z-` t)/(51,ѳgW ku˟\k?64f{F.'jXcgC:0%S~-^?I!d,u^<"`cZKp HO͝ǯ>, ~ ?bѭ[( 89>`3 ~6Bn>Ȩ$|gw{?!PH&Te(@qȓɍ0܅ ;fTZOol"Bֹ; &'YJ%2in(ZT)^k6qG<&R?[|1%s+қrSo @)ʽ^κk<'b", f$#īȂZ.9Ȩp|?.i3 U^fR&2U2S]sL l3r*]uͰ+eIkp@C:ˁ\Q=Eq"ruҗcꚃɻLOٶ6 `w]5sm6/l#[r!i]Xq`p{Gq}.tv ų[OxZ]&LH X -Ah q{Vi5n_yuыwb>E40_50.e1 8RvwFׯA[n;+7Lr m\ o| Z7R"(=^B9K{NWEj4vLr%PU(fUp >+H ̵V8&mZcicw \6 '@,ز b^|iĬFIV[,^Tg*pJ`7ƈCs/n{(I R-Dcgƈ4%R.xA^ОVW#_~%]E ENd Eѭ06 ɿx9+qhEtx .i} qqd- UB"56 s"H$b ;۠yx)SG7a ^ hiF3nCѹLJMM {iD#pr$4NJ|7Hf;TbqKM|c=6ͧ^HFUAأH_Cl M:?60zزJ"\(o+癌)l ĉ[T"CwaRvO{(<-JӄK/MV nQy&E["`XE]3ٹ'NM;ϿW^{v{lYa aH2$Q2'}bHFfe%Ĭb}5a3`]]ceى# ˩zu߹Wƿw{BKB,+PK6"wݲ@JA_.T˫VmslXwWw>SA+ej5V*M;Z[[=OX%'-GP(L2Nqsǽj6F8Ѯ.uku[kP8l!2;:hPT8AْC>~2W4TdkS Brl.qiV,dȟiP}hi}~w-4XSju{5扙*ߓ""5vSg}Z|N- QSKJy>g׏R{V}\fa$Ƭ{ N*Y4tLr^*MV\*8"V3Wİ\#_7.Xpu*TU@Z9lL.ޞ0r>r-&|5fs٢C*cT*0GV&{>>?*~SSSr&r9$s>HMؾ}{wwDVR)sTZ'/R{?ONNb<o={vݪD"1y˂!iP(BU2.q aL EDZ֑H$BԄ9g\5(''NirAC`X,,'II/}M%6: h*Bs|xKJ)[̶Zy;qg\D syU#VBAs|gwNRx%*WX"mmm|:22_Y8/9i]#K)n`,KbV]8NerǍcNy&]8WIDv5 tntU˿q+l] 6-M t'ٴneJEEP, ~GΝ;`kY>RdtppkrpDK%g@3*\.c6T8x'IPp ۑIv85np0c<=bt%$v{{D648G4f-H2vzrL|U9&[.sPkawc 苇`kNFV;y"C:;;m|*6":夌ǰOc΋|gx!,UƸ0K0ye8Br/q# S.qkޕ azӨr^@ F`^5;=U&|zU[ `f*7>48wT,t|a *xeWZq&#\ V$Tzr*atv|$5}V%EHH`T[AUA[ f\#>18l\0Y?䗿eܾ뮻3"nrU*L0Z~g%j4g<ǒ%r9'yJǹs0ajSWUvm\ pНTIKDũoa"*uG4̕vO0 牒!)؊K<𝁪QFwܤFچSM)q3ƍ}UwK2|0Nf7L5 /R*KxD:(zg,X=`JZO8O~eD W_}UR ʕ+"5j&;$ExlٲX,( Ybf]wn:@ r咥Knڴ R{ n22FD8I >3!68Ə?$U~}w9/d"C>/^1Z i<]K.䤓Nzg/_)N83O!"gumܸ/nCBKkI.p)O#}}}ܔ^x?|=bŊ_zcasmƷҌ$R1,GƱYAhx#Ifgu------OʖMdш=mYkn@sX u c0N9MrDUrUG'x"o׿1RP!սp#<")4I/vsL4`59 Bܤ/"0~+0Zb%I; PBT- `I& Kb;'UW^c'|2#xI:_.g.R!)mYq24|D<Νdp W\⼔ K-+%߁?/HIA#sT #xIBGH0F`qnV6Pw!wy\EGG.~ꩧ KY\" p3-9?}ςtOI Iz;D.,锳ĬuVfUYe_qm܆T*ݙA("<6 R#aDfC`,/ˏrPʪLD 0Xh1wh<2LV{rZҌ'odY4v^`TMi裏%Ϋ`6vP㎓B1bň}S!#tXAyG}\x?Si?jiiiiiiLp9{]pA` 0>8]3 |,XW>ߝ-i͚5HBA]Pŋf"@tmaV~@ `vppPf 0=44$0%1 bV*hxx8/]CtePSO0ߜ9spʕ}A{zz0 MLL0/ըRj,SmI!Ȝ~"7\YI$3dHK~ۺu+i]`H.:::0v$nx".E8=ˈC.n㏟uY2Pyׯ_Ea`r_^yZ) ivp1eիWR$ .䛶h"ý3pBu U`p}𭥥YO,0d +p 3kщPPnBdgzHR0v!2m0>^۶m;cS./q8|#dǠ U_|yIA0CUxEmӦM'kv6l׿~" )…sf`١ q~A7RTFG/"TJ >oN$N{W0^|E̙K.8 / *p#J*d n<*gMZV"=m޼yyGSO%%_r{z`-----ϙ,,UHV|jJH?4.]d?[Y⁽0;~;t"if/)G;0{%0 ]d |&~O^3x_p^fg'۲Lp'61B}xi k\+۪ BHeyڽe;B]~ahkFAbˏ;8zuVe5NAq䭷o|6<{0|)lu6VVYRJ WF'-[N2M@d3y쑵:;;K); Y\N_vx 3)}1a^BA)B-;< fW*9lI ʜ%;`2jX}q?O~[ٗ^֭[#ɲed}b6ZZZZZZZ'+Np# R)Hzd6 <n޼{ho}M{9`ԃ/AHVZr%=ؼ YWXG}Qz7 O`P3 ̖t =^P2,z72.l ]?x.2nUV꡷lҬ_eMx…Y8JVXq饗> 6|G8V2Ϗ>he0ǎR'펍a7dsc>qRұ~-U)6R? ɴ6YXT#$ %41qyܹ+5!~i6fRYjD# =%c,H|ti7J4]>. &Hemk2z1c,^#7f_19_8lww4B$}rŰ X2 DzLwOKKKKKKKKK˴].m. ^؋ϹL| {zp~C/=n숶f2YVD8֙r+r[(jd--------CQ >ì)vYYw*a˙~QcTe/ŢWknSmn[Mf.1[0 ZZZZZZZZZh,tu.~`=F<P5z$ F|JFmc`5l0T*PTC֡){@߲{BTɬӝR)1;-6->Ϭdl`--------CS 8S?rz3H"@ R"O4!zaE)W@4r--------CU!86(Zhik\h۶ў6e[q_4̿+---------L]Ac6B6juˎm?eP߰aE築CBw0iZZZZZZZZZ(voJѮٟXrE .\l&[:qx[Ųh47sjj>f큣e`0 g{6 I6 8ĬmrwrEXmqɆ^W6lǸf="qيy;MF)񊫄G>ۇ,G\+;P za------CNZ'MUpCE+beҤ &NMA3DRQ3L\k+X-p 1D@+6l&H7`> ^p~1R,#-Lm`ߏBrS#^dbD сڏD"t19919'-------CDO$R-˲+Bh gY\sٱct5C%NRT*qFOI=2eU,ytzΝDZ?o0A;{h4Mɭ2^8^Aj»nݺgySͶ >Pvwwˊβ@l|};;m4 7chYzEO ZZZZZZZZSK\s#P 8o(5~bѺ뮻.]{Q쎬Uwn*B>+W*ۃ>5fgYp(%vZuuuuu1s9d#|@v7M׾X,v@voPA{.H$ry"%~ ^6l0{#KKKKKKKKP~BBxl>3>τxgǺuzg1o{VWk˜+2-aj&0`t`Q+Ja/ d}<}V.A' ௥7&''q ;a'&&fY0%}PKrB\Rf("@Æ.c R4coz`8箿_;;c;? 8XWg8TJW./.}JvP\.eʌ/ *%O?réTi̇I?<6z9K/.Œ:mph3L95-x-_+YSH&sPꫯ4,(UH +6eY Α2%-}a+f1oRNfaG-W)IYI d*AE!8=FQ*RTdvĨ)Yd ?Q NPUU*/9n+Kl[.b47|շ ]D hl5qDjg]^d֧},_@:I99FÆ6]%G?R<:OXԓ IKI9?v '99Voic*U*R@wN/]G|˔JJpsXKKKKKKK!(woQWgX.OA"&VU+lmma_& |;)355D+Jurg5W.ѻ uOb}AgeUiZVͺ?q YSWPlޛ:p{]_˕j@[u>U+h$T.jzdwͲ qykzmYXTK~ %o>0ԝ%M48N!.V(k(@/T)*PlnxK pT㓓B\.ṵ,&sI֪<2c╖ʁ 㤬IuW, &L,*G[}Ԫw Bg -------%02.EdID"bcDp9H7qkg[[[;M&SUYΏSן*ym߾Td2DkppOڸmmirzŊWu88(U4K&ؑՅefIr,a|f}kFnq_1ѝdUA%CP&L8------C]*Ij/heɤ1+PЛUkN/]_KGli e[[]'}usCxlM&'cD(pMNgէAU|iuvD[vvv {yp sphDCng*B).saf`ْUAFȲZdO0cNRPZoh񌽵7r|*ދ"OO?B s 6͛JٶՌ@U@1Lu)&]l,BLAuEmv뿳[3˿ MG}U\Ϝٷ;~jvQΗWn*'-5Kvjf5.\A1qy|4=cÑhD]5SEwNRS]j h'H$*?~SX™x88okItYݽSyW߽R"kW<ȁqL)t ˪rZn9 D3 BdRBxlD-N^^\U9U-G{啶Dd* Wŏ٬ ڼyM?O+W9{?J di{99 sqǝ}[ ۓqgIG62|\e}}}!7{쑑L&d;5"p8*% \;Rc5UTZŲ;`0-mc;`g{k6_vj dc6^j5Ll͗b{ˏZ^(w&-++wt? T2;^3 LMM1eCJH3@|͋/x'oڴ8/~k>t!uTOtSjiiiiiii͠;LUcZQ5zsNŰʙŒC|'G pj޾ł1gN_Xlٲ`/X XPu>t`N?x衇چJ Yg`ho\H$I4jm8H٨V{Kn+]bl31rxxA3T ZWZ%KDl0QG54ͺgu֪u̟籨wttNMvv򗿜Jg@ҁ?}^5a NOGNn~[nꪫNIl qYt-㌙Ɇ`------CL f^lo?θN[3t/r @`k[kkΑx6sV5w_ ./^|ئYM_f׍p$<zO8NF/daZִCVەV^|rC L;Ŗ箉[[[;XϪ~w{<.# "hBU@S(XtSRĔb[[E  UII ;{??;7 Dfssou?>{Y\.-//_t?y ,:nX>U0UvmÁUҸ C=~1)P`SK O e03C0111111 M.K*qe0}]۬h N(6ˀJt 433|*Ųvpq_"_5nM([?0`đ#Gp0\%O ]NʁeQ &$ZL?nKiacRandx.|@*%Ǵi_XX Uq+Ji(Ǖ^uH8:qMp8鿈P:C;ou >xm8zQ(hW2J@ oL}Y$yG% K+0D^v]WJu'}ABZiT 麚$ǧg,/ 4 D577w*vC7t dP7Or-kkk #[%x \"eYg/;}'oq᧞5NP1QzMIԾh`ZQ8yr˚vnR NCDAכpZ=ǿ /_r%1{GhY*sH}V@yw>pV3|Ax399Ib^f푙7☶&v]4S(K栓/1kw.|2z=|b;G ^eZZFyH.U{m&&ás׉wH2M | { d9Z[__'kK%Ø0 þjt{ 8bW_8K/m4pL h<Iцzvjee{/\V4~xw)8311SlvdDN+0}wPE)pFq. Sx"LLLLLLL; i]#vAΔ~"iummeqKBZ+Lτoҩթi/Hw6 0Bnek1liyɓ@xΠ䷿uM{UW]3<ӟZzfVTCw""z=D*&''QpiA;b_PXQkӓ@H( LDٺl8L J;!x8Ҭ XJǵZCx'c"b !G4t&&&&&& J p10c4WY'8upI_ ^cȀ,370oS.,/VKoӉ4If@\='9t8uQ9t* N &$)"bYJUEn?[:zxNѴRqVM-`PZg7/u݋/xi h4SK˥qRIR`011 ju]}T*pʿ_+{^F|oYiz> Mv Ri}}m` RMӔ~g@I{ n[ӍwX#e&&&&&&EAR/ˀp@W,V qu%/: 7pU[v{Xj+k/8iUض2gq$e[Ǣ}v],mV%q[{tp^74] x*K#w6|YS5S91xZ-(ۿ+=SRJ~Uq/9Eǣhdנt]Eu(+}_X)nǎ _V\'Xޖ 5KGq01˕҉y/dY89 pOU_ 8AA"6wNAq3YdfƆiWʀz4J#!I㙹v#᤹~hnpyn?p)o[..k\ L?) KϳǩQњзݲ)^d*=Z-toMM4uU>ugi #$F _*Zӗ%TI}5m3YeXE!qHR4@1\X㔔# =(9DDjDdcJ [<Erh@ÑW.ۧ"/L̜$ 4V)]Q0]ׁ%Q0q`e>T=7Z5>!=NTZ@0 ]*IgHq4&<򘶧MC k{Z1yu.Uf7pV_(؅y0$Q p 6$a8sb 輪‰b=`7Bf=*I26P"0fR>Ɨ`HA9\F!)r]P4chZ7P~M\ g }l7n ]/<(H$=V0J2Id{i =$GIy_HdzZ.'[rd!~o<'If-a8cְQqY|sC2waF@vd \瀀i}hvX\w|/D <́=A52,2G`QLE Bp8Ĉ0eeAf\8˞d%NVW;qNpT(àI 6C,IR Vp v׳Y8~E:ndX%I"(w_%jXI}mlFYU8<4G1^Lzw7++ U-8yi9TiG!' ar|YQ( UǐL3,2,~&}wMBHƉ0P47NQfABYP;'wnk͌|o}vjfz>g(D۝8Hk!r:uj^_2TL^۪io}/B{&p]^QP;]$8N M`&qdZQ4Ay@- a((up㌳Fc-M"@ZaY:z?NR!z( 7$Yc,2,2-K.J@(cnp[D$il"55]MGӓ{of''N=z4 B8ċ}{ ׫뇡(NHݽRțeǘ;GApP 8izqztM'hM `?Gq|~h< u @iV 4a[6?`A(I<24U鶛7ni8qD$v5~溮SS{/O{,2,2!Ze\&9p#y]|?;i?_+ 3eD./??Z*vc=_'JNDQVé$iQ* LojT=_SZdHQVkE82fy#ÐnR"| P(<(EQ7fP(Ȳƨjŵ8$Qa[cY(8NAv^Ze^o;뎫OZS$J޷Obl:U :?mL \YT$Nڶ@;[Uw{{<@`[ Mb92$ XH 2D@H)$(H"Ųyxc{}l{OU3}Sߺus>uw|$@O^. cx%/Td˵gi\k /EE&n8&Lpmp5#yH^FU;-tZ7ٳgo\IpYK,QUOEIuG,gk3 yQ!)|Iu.+IB77RWۖ9JZhѢE-Ê(rQn!.e%w}|} /|QddGuNjJX.Ψِ 6a-ZhѢE'W0MErH<{?zJv( }鳇[f m s}Oat?ȽmY3X6p}m#_S5jԨQFo$J BT,Kx8ɼ=ЀE (FfinI?SiM38vėw2+k: 4Ux\ՂgS5jԨQFo(BV^(X6}X-(b 3 ;a@]X\(n=~'h۷\8ݕ;K:k^Ȟr*vDゟ˽%r5jԨQF7L$R4L(0\BxJ"؞yp$rr8yF.Mu^zZLi1 _g: #&Bߕ~^ZdiQF5jIF!c&Nw:P$ؘ-[h8>7/v.7 ͜ a(oxKDg va-ZhѢE-T!@bHt<d)Hyx🯰Q- ģ<|"_\ޗUqo\$e% =?N-ZhѢE'Sˣܲ(x+lNK~qz֒3wM+hpۆ?6݊bWX.Cv%〯Uh.,jSgOk90VyGkNS{}CT/?Ӭy>5a;X)֨Q'{+}5EYEzK]M7J"l)aRnk"z /G@Yk֜0:uρNI2I_p0`9+ Ӑ`WB RMc" u}.$2fiG1mH‰BΊ$LۖhZڮ~ J-d%ImBJi] $iaEcfiZkMU2mD6Msh22 hJYD$eF0`43,Di%9d`A٘G`G²B0ʛbrn P~P:feQn8ϻ>#-gdc{''9`CVnZ ɠ0 Y6FRdc&E"y@%"di~^}ˌ5d,ڷA1oؖ\Zlݶ<\'";Cmvm튶 e>|oUM'.vciC/IEjY/<( 7*W̌"nX۵]om0Lc羏weԎ}*jwɠlUF[f{ YJ9/-{Ct><@) uiVG8vlмV +Q 1d͆/ib|e ^/p@EQlnnq^O۵]out[^/}PVƹᅮH8p8̆@%gu,\koll{Am:oKq\[^wl{PQ4-@=XO=sfG?GuqΟvFCqk}<@ F03$w ԩsK &㹤aZM_xo}’ʒߖ(2`%{]z;>v_DJ_闽y؁4քڤH\5Z Hp8ml5[=Ůؤ`)Ѩ#vzN]arEt35I?7c3QG _b4T|N xo>s_5ceYJ$Ƙi弸>՟u?O]۵sK{u7ض['i*(P꿝N'&m#wFQNiA)}sVdV~e_E<{nkk Qfqp]ٳ *<w oR xB\ȊJKc6C-94U4͊ +ۼ+UZmChnu-:WXUp>Tn'nG۵]oe;blyéo,&(Œt-;_ZZ aBv:y~BP& 0 E]ɓ ]]lKM~#hkwmcXI5]5yw~,b BE`a-aXWן˟w2NƔ榥ȦogEo?V (y7x ~GO<ԓxѯ=/=W|Ήq8)i*>n F8T`Uk]|F?v- g,H{Ͽz/~+kV[aǷX|kfɓNgyo?7 gT2ysMj窓5Kfo2v_[p/j z.%׈AIgN=u.TCD)l(2,.,砀$Judvm[.QTίDz=mcbm!\01]DDp.˲qmup8h`<5[-Uecu)4M;\}}ΜF(** MPh4sSFh"-ر5ԙ3}f$ s~ֳk-ֻYKHڱ]L]7]syT$I>ę-Hz34Cr]'|7*B vj1 ㍡KοW B~lB2czC@7LrLsR~`t/`p0 [7w[BD+YR-lbL`x](^;A!i´ G-|zey{a2uIoDfE1GR. eUEʰ<50b6 4^!Fmɰj6tM>ZXj]EF3\0w>xq:ي# 1 4#㍽}@#x}>Dw+D(F!A&1h6Yc87#-&t59-kU# S % FII! FYؘ$-8渟Dքw BOG/'Arx3~¢䓱ΌGz X6|`cI@\#cHFWO~|АDO c'Ͼ77ʁI6~zO,1Seջ~_ 4˲"nƌl6+RCw,MˊItfo|怰6~'B]KȪ1"R%r&Mg0ࣰ^U-` axop, @n0ۉ4>$+>M˜5W^:c0#p{_p<*iTJV+ hzݓ򞜚w" Y*I,_sr { =o\loo"AԩO#{>ʅМサ;7XJ@U*-JM GCBYozn bMl!N'C!r4E÷F5 ^gH?5 w~4~BF`UVv}/0fUJTK3ڮeV0,ԫ^OxG/>n>E`hf #_`E+bu3frYN&ꭘ#X7΂|cɮ}K^ʫ/ qid*aM7^Pɴ) -d eŪ 누h#j<f=шlEz4ݩSX ݲe 1;e閖R֖ٱhqigvtUM617nP>{W V!pM&IR$)>o׽|Mպ?'^r= h1OR/z;::=<9gO0m+dn 9/E^5QErwe 3<'M*W^z5pDUUľKR)xrRdMaiC;怍BOF 6`k΂wn7 ACʫE~ ~sϝ}>,EрaxSh=pqٰLc3ίT*;v8z]yM% AZQPPinC!-mlO:Q^H` #L-ݬ{Gv47mUW}XHAO5d&il2]LI!,Y 8x)42@7v0T0 H |>4!}_vYS-xKO%~po"=5m7?e%?͆fioR-k/~d dgZ^WXwQ|S̑;~ L1cs{0_yo~}ϊ?_]wwuo~u,VN9}4KE)(7|̨lxoB$4}`XZZMYԕh]= OXTS+ZɦI{s]UdؚeQ%œVB^FZ%a.O󁪬 M&Y?`z&f])zUxT'Oҙ^ 'NY*LG4 NI,~"bb%bI ^NRya"g~-O<\Pʿ?m}s/QvY;E);mIe"m5EڛoaӛoD)N'`/bU[ApBUPRbNb%кed?L#OP69]Jos'Iu҈ u?hE[>~VVՔ|'eK- -Kz[{\K"SZeh$hLM%`Tu^@_ h΄R SmCSɫJr=dTX 9e)g_c a{ڕϾ٦ՓNZ#,kWKPQ I" -WS*$,K1Ѵ B>l4ZWl<㜓qksWo[]+Θ3YE`X[{ֻ9a|Ẽ-ty.WblIR ~ۤs/: Bެp?G@;,Swo$M7C!7]ll<vDU n=^?$gqQ Jh{G`u$_s(I9LMFoIȆK -DUTHfbIxi3_s헧̘h4RQ#4W*V5o\OAY3PW`si $Q5 G?nʶo`U *hӲRcTt7 )lGǍ݁м#;,$xEP4j:ʙo#Ź? {,DZ>h< D]寽Z [|>ߢE;okZGkG[teYX0 s竢X[p!SNŢaƍ,˺;gΜ0ZZZoɓ+ʾN>X, /8m4qP]n=o;xv* |T*aY2oj*1` FO?h4SOLoFOOW_ ِ4i ~s)SLv$I/Yg ^x/AP EQloiX(V[o%iq'|r*ڼy矇Lw߅+WB!n۶ iIB DY}P<~Ηvvwg(3 hB4s܌36`ŶýjZl>D={<䓁@@IAqu(( #@ s|gYl8躎6lsG4]*v ;'t]z5@d2f@4qơ|kk+JM ux㍹\oۨaJ}ʔ[ڻQ!^*XnZL$BgoFRmIG NB(jӦOQ 'pRxt+({+/ͳtM_ c9ѱx`ժC_&Y (<|1aChѣG0O<(@5#흯 `@|W^yag38D*3*4ݴi eǏ`/*rd0P)W!G>::,p`MH̺t*+/F@w=}~r궆Vp;{ a(sYVށ~H> _*A/"ǡ@`\DC!ߙ! Yr `P4QcIgt$30lX'C:♁@\`@{GڵaZ3,HŃ&iEQY, qYrw˺=`f#E?9EYr s+&qLh]$!ɓ^`ѷ5#)–5ud"/-!zs_۬nЌbwlHϛNf{m< ~ FI1(Jp'^HS,IНsՋTcފfq4ǐ%.yzӦfuYپ씋 ҫ?>/$dF 5܉?ڏΜpׯYOČg_y{TE՝CXt =0PN$$Igy^H%  dY gMV=Bzׁ.۰kw󻚬O=R[*5O.|sfͩ+bUto_rdZEQR5FڏHgbw?xe ÌJ$ۋb BkD\._K)AUg͘%RkgfwvCI'K\8}מްI'y$fqon}z SN?T.ÐޗC*Ph  >W_xua  eA7\{O;pL佷[8Ҟ{;_3/t}f5| 9nv 9}ݿk^[V vw/ "OzR۽m۞E>_!P U%ڌ3CpOޟVu魯lf0l2}s/;fh 2o&tܼqrkw_=jW__jmTפp(ʱn 0`!ÐAؤXTIsL568 EL"FCj{ Y}}E$r?yK.U͖/̙ywv}N5㒑Æyj[o.J;h)jpkZ,Dx$&jK2|PtxN\xB@͡k?ȣ[6mvgT<{^z9ibXF3gؾ#3}vt3N?%ϛpۻA.^7IPLր : [Um{GQ)V_qmF8zz`bp߃C!ߜ4lw.w DzٜM+W>*ewu( θer?K_9װ4ݥc ySAYPd' I;HXt㯻[,3$UUkbDbClqByxϙM41i ]zo a*k,\ K4>#i/uISa'oG pwXFQvhnT%eniE0~AȚX դ:~OCabai~heIU_԰-K7{Z*/Y[ X"ģE饗^J͛ϟqO<0̜9s0;SNT裏"Q%-˺K0OKa@k^cj[GDMD yGQ4,Ozű Džig{.8p0VXTՕ+W"V (bYvɐg۶m&LHӏ?8I&z?>묳."YjW\*޳OMk/S%yӉȦSO "QfӖMe7ػo;o/zs’=r܅FQF pm4m޽D$ w_W^8q"#̞={~իW_{S(6n8v RR)`rW0,4̜92e 2vK{ꩧX%M'[ҥKeY޺u+׿Bf[HϘ1%ad&E05d@ ٚ-;<0yP -3j UV]'m~6cz2X?9Z~f874]2byiXԪX#.[fk{lmTnvx p4c;ɓѨXA;x as9ݰavaFIS.nt>1fvA}9ТzAI/`(x8}\h* wRWWTíQFŋYpD{]i3lAEtM6AYfâ`^(p駟ӡ p7P`O[[{4 >/ ea|@ w1PM=lqU>;Jou<ؓخ{傅 Ǯ_(¨MD7ctn!+j\H p~# ͝s7~_] w|U7fYl' E{_tMOtuaqF믿~5tup3a9`{y.AZQmޭ؛n/n$/r%S[-0:puGuq,^0]n]f.3V^:$ qnScoƱB{kX8S%Hu. DȮOEL<h到k82TJpBO<~p䇵xy3|q0SOF;[bKR![[j%1X&Gڂ&Jݾe_&0]?h{{(;lAE /޾^~>(եJZ)ӉD@N%(|ߓn}uC/]X1#!UE $(tGLǮFtsg-g^ @*)WTS,h U/P+j1Qj' W-xPH#m}]|~⨱>.X'(ɫgc{?~쯫7] S8aJGf42Mg%[S#H$a4wnY -jQ=q_N9G=JE\>.9\8:ڟzY?e=%5j p_1'\,1RPz~.6_Ev"uaa>puR(/, <4VIo; J"% eXlV Jͩ€xΞ9P2Ɍ2S6 e=e ć n|/_A@7ꔋ@5 "2^ epAT&o;(=!`KE;&boKD!PDtܱmƵ4r.$ pbOG,5_kMtslʖKҵzw[;=Cwm.<"}jm?mO?ۖ2GsTȷfOGáW\> \~k9Wog?z N=kV 75+AN30nI 1:!(lKPHTBQ x50@ ͝vg@]D Ak@PGy8\\x ,Cfy*u\2uA22V>s,Rƍv( t֣-}w Or5W! m:Ep$K|4b_ : {m4NC!;J,/rtF,A_=>c"H)'IF0\*TEӬÄ$=ϮK&!Jr(r׶|<14'(ޖD'TOjkCbd!Lu/65pQ'?ɭኻ~s(pDRhr]m牢ƙ^AK9|6>rL͓[a:./a;H;u&xsMo;'=yox ![XFD/VP(TW3&4E{y|aId{}mcZU6u5OR$,1]W-R¥Ȋ=zdOOpd4?,KXفℳ5g?ϳxU~|767XD#1K-R,kMY)+#!I!i8.oڸaW,#aŃH8 ETŨV-錪f,Bn0[ 2d.re:[`%Xiȇgǡvش0 @o q]ڶIY|Keq|Qӌ]or@vɒťb}1P_5C6u׵#e:Ţ#,[xb޸˥z*Ԧp,5Df0[msQRZ$ >=ڥ3//GP*^Mow-z K7' qpBX[lhbܹE/YrO<1s,@ }pن 8XfN\>섁_~04 bpkXm#mf_ߏ5`gQ->!(I ܚ-~\oO.Na-7, :{RZ[xc`"M;ID#):)AubP L$ʅs洷?f4@QT,W$u5bD /if,WN# d><cѤ((ՓAH- yQt_&kT`}otv0F чC[zG'`xTow ˮbg'@U(4ٔp$PFftS#i/+j#p\_ 9ByBZKG`Wᯥ (GR UAu,M|- »M0 KUDr*B-_W(Ңʀ t1]E覣f:R{>J5D!R-u [!Y)_Ͻ Cm]5}>sW(5Uo1w84 ͝U*5 wA/R{$,[jBo8n*nKU4]]Vhld\{ ۞Vui4mƴ9fA8!DUGHÉHU !_0 )qh"mS(7l|z+tpÜA/˦at9N $8f\ᕏ>&tdkͫVo6Vi&@~ &qJ u}A?xV/g5e5n]=My.U˸ 7!)< aDp"k 84`d:Zb` :@QTh*O2J02mꂫ0܀D.[?P9xGw\]u lE_2snH.n~f+|kZǕS7u.q!X>rvuKOG Q{}^!gC!ߚ~Gca ܁c{ FC}1><,nشyLa,/p|P}ܠaQ?/]KuʹpPTҲy4Ibn;>\,b^fO.!)?ҽ_af:A[] rn5c.6eXя)IZD0ތfY uIJ t.nc#yAt8"0̤"~0pخ Y^vQ1?k֯sm aON!_$IΛ7h;ڟ?sɃ| I'UI29ca-mh"z+*{Ͻɮ_~= k7sc?f9d=ȣ_sʇWbF\xBď|sm߻-_ʫ*}@wG`93ZHTd]Q-ס\D6hZ,K$St8夓kb6'{¦֭rUvW˕믿^`Z-|/owS͙WU\UuSNowĢV* 7\9#+lnEЋ,*Kʁ}a֖̤)1jIIY)UmX ErKD<e=(鍛E往pV:axoeW Ukr,sGX-$z2ңy6|㗤A1'՝/ksٗ^yy+7}յTKp/x"B[6'x @*Xj 4vuNp/I+_ Lkpa[>n.6n4-떛o.>ͷ2Ï<>tłht z2?7G1M`31ܦaò%.{\. ?lɲ{|)'xքs]y`I''X|ži?xl}Z`88O ^mۖzM_X.'[n#F xk|l~,\纍wt:Htu`Ʉ1vXUuˮL'BtdӉ4xb۞6{l,0.8 ȃU4jSAH>,CaN>mBMWtN r-==~pMkn=Wo>9 ]o~%nX`_C?a4![k}>rdwi'?X1Hw-NiчCcM*W UJ 3m2R@ujo}k$y ȑ#z~wwJGa6"4wcJ!=.^ۿӛa4CQEJY{@yp|*%Khd>/X]py3f|J|醯?>EhL'6)vpjnr훒(SN~R@L:^n%QDC ޺z}ٹƉ#+V>}:DzX"h)6#EXL Ge?X6}{GbaLJf ~kMzG.0AH U#{s:&;P4L8uÄH?J&S@RTdwec}K_Z~}!78lذ-AoBH )6t9S G{(ii4 CZ)zw@3" ,G EB Ś[Roo<VuJ 솺}a#:aCcO8`Y`cP189KA_,N`[( 5)_<0s, onaayX-nh*MA|w un,,  `CЁdozas?iw/ޔIB~GFI @;pr9`)J’SGG-^HgRjON'H Û gY)'zҞn  ;^ðb8'HX,&fD9T;M3?Gt[aH)uIx_0a/gIcф9#6fYTbm߻7[Lj!jax;ʥs7B#a n?nj[( ŵ մONA(1^\ x\(hUcUI$ i.mꕝ; 弳WC#ϔ{o4z0/Jy|D:bĈ\.8 b&弟2RTR%Ca E5j({JTPi V-H]U-Yo/4L]k~6iH3ȑ-Zbhxb G ^ PG{d<.jPHh%"hD|jCM]2̾} 8H$JmY0 k(Ne;vX!<@NG4g7\aaxa$na% [0ǞG>xB'd?*``zds ^\!#qѼޛܦ0MiR2fz:LzϞ}(ˣEP(lmQUUf_}> #|q\;kIsTt_kr[|Ac;\6N- 'Zoq\@آ;4^ -C* pb5Á 8q>'A(v8"!P:j3iЛ~ 6^Aiڧ T8a|}C:FÇF6 ;-> !  u Fӏxyu`j*7W>Xe@P3 ˥|6w)m~0 G)L$}ف{ȏC!}~,J*+#GEZPeus.aת"32w/Bd1ĿB5Eʥ:a;0 &+cF4ct^! e%QT,V U#r TCh$%5c=&4Bf .K!e9.oS34>l.ùиGR-*UIts1߯▓ȴEp"o`YG GiERpkbM@DH wq!Șb媌-*d.j>PP #R #)>/*Dò;".$}5!YW_y,.R"=~xde4Bd.ҙ@H%Bd z\1{ GrBXة zKY %2P:I~RChݓL `)T'>f%"HƄMGl|=Vh`OڅrJG~4KJu)>su2Á@+hb !a|1ȃxϟ)`%kg!z7W'e5~ZW^l/>b! E[@52h,9?چnUV :3@)hq?;bH0i*@#?G( 2GS-^ a[M/ 0>oyȠG0)$ȏs"0>{FŀaqF@~ԅ^~w3à&@0Zo>Nuuӂn`uǕ"(QR-odw D*K/Tݢhwe6d>.V̇YiE|\чCϢ?]=J~[Zf]<.dET#XSTK `C Ls Q^EQ.`D#8K$q=˪jVX˹)Jc@o;2A吶C?ܭ~7G]J@MQ7;ԭ;X5w?=;z __C'O?:$"mg.rZ5A([$ވy2P$iIbX.x<NT!( dC[3޻ˆ-x<^( 2 >KȲ֖DX-ժH+m7OM3Ml,(JYX\m`0XT DSmTfcvJ6<ϳ]]ݐ\RVLqb6T~69 yT+H8 HƲhhH\d*ӚH /xP|XE"zh0l۷ P,ˣ]ð`US BZ-h*Y{;TxBSBȐum,X:rSȏz{auy=)d9:HŪQ)u'ʣ$ =2n_4 gaR)xvd=T;*]D MO{2t! =),#A-[HqdzsK2<s-y؆@Bs?'~hֆ=_-Jv\@/HhWڠV9rtT8R)e2m޾ Pwwd0G/0SAxªv4.2vyp@o ЉʑHZ-w6A9'? ףH%Q@N0rr1Af;i4bxk#$z ]7&ށF36u uQ uA1~/H5,V ;=zdPJ$b ƙ;ab1ߔJ@(x$i2C@X9{rpZx{F:J'.>#H[mypwjI+<9^ @hotc>DяC rGGimmLQxR.b9̧ A_A\WtUwp2{x4v@W,Aȫ^oj4xhpTU`$7ԅ׼j5Ӗ'qpiLyb'&~ Rv`7 GbTS\{o 6rit4ȏ01XɚٻK^}^ AW$ oVlb9fm("ql+ND!?@\Xv5r%K"C"be9sL]﫞ݙ9g|zL4*鮪R_ꪯr<zQc<ZGpl#̤xSmDiot!YHTC@eبVNs>p ȏ a.ݰ纰Zue K6thBQDޛh` ߮C\ǨM075MD`HҘ 9pQ|p`0`qD:rNa_qsggg}m}4Kjk̆SK֜<Ư 8]Ԋ*0eYiik04) A2.%IYiH^kr.l}r: P45\1g[1SbΥ~;,_Pz{ppuSkv/^O?tUR ?$XMF?`u  EkLU9:Z FufafP  ziÉe68<_Qm2tm+B ǚ8 (JeYӸSຎ_w\g:yzf,)L`9cO'Sp6 |p #Pqzu AA&/h >;w#)LŐ IЦ@TuC/=G@prH@4 dO^Ą,&1ڠHrUw'` AQ¾=yy9A/iu4J8ГNϷMBq 0AӤox;&-42UMhxA]CԸ524ұB-[[ h뭟^lm 3j0N6o@8ԲHz dyL=82tlBˡOf/d. W$ (ůgxV7ۢ5'CHOƒzBC kvEx -뿺p5u4gwz~&r܁%uϞX P2lnl*ZmzC3Dl"NkƋϣ"bvNi90p\EV=!mɁ [wwv YnmnRNy׽, 8,ƯZp<߇;1F6MV'O?>lhxM]bЙLAȊ'%'Jӆ*9N]S\+,)}o'?Zz*Ueضqj),IrQ䲬4(m鋥 )Mڑ ޒe2Bh@RJ6)yYH<{Oo!J۲:RMq*z504e̯]]G!%f -5;^3<ʶ(G8;0 CB{ Smڳz0ACC)hH櫫{&vmߤ(eS.isNcRSgh2Ѝv]*FJr#%jeԡ(JP;zS mR%|?z.Woܸגb8 SlD=Xz7"?Mc}_5A(zleH;~1d9_xNI }0,/Ӣa-K{itMeVT{̼$( q"AԮʷۉL*؂YU0Z+ˊZ}?yE*S˜:]l.q#/.9",u#Du8~vîPW[C0嶺k/X\^׼ lHs[ar9g7q KEӎ9M2wQBy{rA{uDjuMmG'?vWHƖZ"/Kfa:@wՏk%4e%b38r L4F4>]8&4sdDg=oLW?IG$H!ޓxwcu vEkȚm/ݬDm(L]dґi1}GaUdmJTLJS׆C6݁WWɀ C^~M tE]E,); #O\8?K;ۛJcv^KɬyMWdIꢮ6|x㹯W_=~7@Ljg"ӷB)`9MO\8{쥗_vm{< zett$UUm?g^},e7]rQUM]8|/zy\#rxq=d"ڋv/]<իΜ~[tUml2';kI+%/"r[, ٕzҍ0kpMVGUNpm:m[?#?0"X.Ngo(o֮K)e=K0 Ҵ/Ia/_^_3Oz.=uiI'XY\u>Gp} .Spn._^]uROEcjy]Sط7DIvJ4Z`5UpB?%eu|7~S_>jn(_{5PFʹGثMWGG ^%"|NlkъIa|ͳ b{ q?1p}?Eqk2}K Dq z[ttA[o}∋V'B?rǑmC{+zgԯ5KO,9ׯgd$@rgcu!m&Nmxej5,i~1͝&JVF`N v6n|3U}|[/ZeU]5AϪDVG[ppMSocHSB8v87 wk#8<ř%t.܁5ˬ;UU(syٮ]> { 0?ow,F]e2,q}*:P%\Ay]B^DW&@>E^V줇Bߺr۴T] <{cKޓWEDt̖WVwל{X-ؗ$lZ, S4m֞9ݘƌ j0< T%bF#ru]i:m{{; "iVeØ8i]Ć> mvۏabi5Q9*U."0m*d\WiuO"ڕk?pv^6eVqeGAQƎ6h0 TܣXK]Z=`xwnиiTq*3&OQ ) e]$\Ű &E3Wq_ pr41"n"l,%Ϟ^R0棏={|w~S, cG$6,]̡9k kY* خ,.dsǦy#q\6LkxK3HIya}˒ڠ6KjE^5)D;=]KX(qݚh [ոw%d~Y&бY/e#qłp $AW  _&@p]a>.=Dj&}\L`.fimEu#uW˫-A)X\aZ- Y4]tu)kR(#)"!QM=´dګ,qEm(KOȇykٛ,oX =*U',G#f5l'z:gV*π}•b-p+YYHcwloh w hJ7䦶VF6TahuY1=44Uf.o 35he]W_ ޚrtuԀ@sPIVi˜p@CaURoҸInqӶuErI(ttv8p5|I'$G IʥCdo9 /h7F͡-ڄ}^U`@s?5#{QIm~~w>M]Q}7Msgθ}J8e^Sb<a͛ك4GYejbo%oʼJ1u}ctU=1*:C8c*m q)%qx̪piQLat^jbAyhf&їe0zj_ 8l]JvR/oX (/]VH |qxI0F&y͡gNvq<>˱;By?O^b+ pa0m"Z(0Ydq$:oYu.їc=nDzU (UIΘxyaìVȿȋgZc$;rowϣ{޳^{׻Rd"$a 䄐KNllجq0Hv_KyȲ,$l JػΣ{}ߗTή4{{v:ԩsQՍ^*|hh ]1K#J` `S?/>h#Pe['A i1E7A߇N㐬QQ9i}BH(a&-u~`*K({" ~Wܔ*ދKt)ET0E(?܉|J )ε:Xet&t HhV(<8;X31qAU^}iZe#'e"ݨяdGntT kKaM ۽~uWT&0E葟+|sG^XyˏA~+'ܤȌ 6L;bpYsͥ.`3jI$-.OQr9Cv{\M3 k>(([;G"ʍA Z q" hZ՛:凁aItF(#tEɾYÄtŜ.Uet%t]0y׆Kat);aZM۸+7_A__qF}“SETX)ٖ͊)N\tĜՉ iGhX{*&%bJ@( xx<FBz-K: z-hӞh*?X6y hq9ceNH0 nt#_4 +jCUiX"+rtJ)XK>%ZާzXVhGx 3 [FB.EFJ h@np]5a1l4jvkq u řP~u֮9 ]K?+r:c7Vko9c:fW.&DN&s *#UxdN&'{^z/kȺTrmllJӠPQժnY6(Ê7 Vœk܂d:͆iʼnzfX:0.D Z W4ՠQ~f~o777ņȗoM<ȝ !lwnm 9^Xs,TĉMSS3͚QH, d~|yEtNn_a!Bp{yC-X@u\j4k]Q@t>OB2|+LsLBNW#ʨmޤT(iZ҂$4xd3*;]~/@DN"S Cb crE\)Z5 )N^ S jF %[@Qݍ+9{*y`Ck+r`XqG!S1i@1{ P<1A9aD^qݶhD?<- D)xE|Ӊ./t:VTR$Mds7ևJdqAi333 *0^lwcN26@:C-:CÈ"PGNЛ^@}(*.-wccFzv.{+ɼBTۍR۟Qݍj++Ei8jv*uԁ#A|R+bfly}^Vs'gvM)VVkhs|Ti1_uR*ӕ=l\m灢|b~dmOCW;K߻tiilz~WRQ/J^?Md]7mo2W]G39iYD86l,yq@1^hw;ɄTER?]3TlAsAR0, R$1̒#JE(|&<;!FFfruRTOCMXqj$'a|aK!eI@=p`ZBt X,ع#35DUQrĈuE7Ji{ss vE/M^xX|"٬Ha{:#ZLMN)-'v+tLGdx/ȆE' tmmގ3w]i՘$6XD9.)X;2y㪊i+L< ҃Ta yI-! u]\Af4@c|Z QT8|]=bŰ$CjZ3hI'$U+/8^YF}| 4bA9>ᬷr|i:EB_kl}RYRxiGqDP;Zlģ f@#AA419cFYOpqy;O 7ueV'`No_yL9?믿cAJv; }hwD7p!xӭ,?rOW_/ˊ|Jq,X&&E3 xq" f"ٳB%'O|g 1pmH;8l&hꫯ=9͍v'PqUy{_6!q:j3}Qv:ځ&נ9ccvRYC/E?9YDߡ1Fѡ SU=]U.OCB1J  @ܬ>|>@CC'z.PZX}|y0mGZR(@ii4傡EQϓF: ]|F$R$Ae0Fau | ]4V7>>R~e)RD kPԩS?p>77 V(q<8h'6eAAF{NAe$nn?À;fF1 iZ)'箬]Z兹.W6FW+@XU: ̫&ө{X$ku-BUVg'3(w:V~:*6b&, XNV2 P쇱on*Z&Nae's4?dԊXٗS2 gYESM6>Vr$H:RSn&u&-I0ǵӭHU$޲P(8qwǟx43_nA v0Z'vYT4I5Zl$~Hp܌lNsݜ)v)ǧL.Lm6%k*G/}_-ze婩O~L1Le}j@uyhs,v6ګn3C2rs&?ɲ $OM@|bR[&v/Y @C}ڣtDf=r+C 0CAr-{G\| iv a-Րä[gkǏO_Z5kkE7N 0 i-4v`6d's=>ܘS<5<_Q 2^~7|\YY!i+gCR;bAF n.4ǎn<.m3Xwq;3㌅njO+Za2m^yPvWtas7&k!)frkWZPfE͖c 9)WPxn 4QeFפ@\&|fie@L4i5覶^eӳfJVvWd i'-4퇖ip:F͊HHpe^ػ!RĶ f4 ٶ8G̸_DN(j`%X]8):k`B*i@Uq0Mrj\Զ(t 7:,^i9s;XY]uBXFp HG1@, WzSO};0O er5cA?䏏}k-wHGl=zZ|@ F[psqqb2kmv>Eh0/V*riS4nÜ< ~˱bN>tܡ~ֳ.1E{B{e>t_|j /`7xClC &r,6k+A|o}OO3LRLB3gΈV{/_ %KȬQG"8r14$etHArƐ A.7~:̡$*FAG" tG ?W¬; y3N\[$HDz'F=-E33<A .5@T>0.-'O35&Ӌ]wy(<ØԇŠ& K&{Dh͛ AlH dɦӻըK+pO<}?=}c;Ss,$)K(MD Q^CI,3%%l_@  zaPZ}:cGa5AvRĔػ,z*2-lAh@AAmM@@AE]AB|=(_ Ǟ$ BR}y;!ÒW_H^s9W> FamEOΨ6ot})X^T{#ܾPB^Wxwn27^QIlhG < '5afEˀ ,4qbXKTum UKTP]:cDt:I@̈` 1 eQok hyV/XsXjR8aFB\BU~е{rB+  ٳҥK1Z^:tܕ޽{w `ŷ]ɸ{>^r 7=IHׯ̙ӧOs2# 6A@3f<-<{,rW`.]8xlr{0ڵۺvvጌGO@$'%_tb1Er(6 C:UP&#;<&K|rןA gzOcONW#5M´ד-c7sss @U PÆ *pB^ڶm @]PƍDo'K _6)/bVmʼ~_[Ѥi@%7jz B}jC]ZXtbh˽aýv]knw /L= F>dp0<(-!is8%?k|aC+}fI0Yϛތ)֭yg6[X?Q/j65mv?[!sY?D0rN`(0+Ipb4Ja`͛.ܭ;LX`Հ<xM(?]<55g2T!ALBذdsGߢ9UK浐'CKQxr|/C큰xCn쫅Xrq)P,5G&E$8S-~Єh vS\)C̙3N \[ibX6mJW^M`^3gc>[n 'Ő32H]H/}Ұd@`P m=k?PMv<5{,3\q˾`c-cҪerĿa̷FP1`!stz1$k]k(Yxn+u,(C>E( Zbub(42F*k7i Xx"mVYH/j#87KFU"Uw,T9oQ8kԋ&Vҩټ [|Έiaq5n +#׫>Qa/Q!n5RkbBЀ~7p/9`~ɒ%ШxĐ@0{[ֹEY>mڴիWl+P !wW .▔T5& b|B@{@@ :Hh=zYbUzC'&BZp8 I%9hF)K- UVS7&/?S}HY]}S~(Y%ƴ4( LܴiS޽{.]O?]bŚ5k:}'|ǠA233;tc?{v$נf/))s$&4Z&i!FolڔOΞrwMr~ީ;[$3mZ,)-dh90{ɀZ :SP߶(=ޣ[n-Z>qU+Vswܑ=r{]X˖V/Nw|RJt7 #,G@w+"BP5wLltGnݚ'F| kE+I7A= rq%Cm0Z7p3,4iz( v"h1:lB0|ArBQьZk;9;;pp>T@I\ڵÔ_,z dG8kQF1c9@ny6 0ˡ ޽{aÆaA=`cǎnfdd` pќکذ X E6,T<,y WiM <Ena<.ݵؼ⤗vfUz!L}N_,}:|eߖfA~I1(, t8E *UgT3 cR*c"as8#Q,Q( pZ(/=kyuFX((;)Kl|/Wm#^OE5sZtU1KrO>L2 Fs157Inh6TR,AAS6QPV@WNx[aFe|3ceCtǎ]'-^Χ7Z&DVx65#Ɗ#[rr-vV j%uuLw٭FG 2Ƙ/tԡqlQKkެ⪳}R4šnVAr i㨂,cΝ;S/( #*¥5B(r}\n7Y8.qEԔ&̆?дiek̎mkPcCoO|u`/9ue>uڗ{BpSM p*.+[v 7n/A$.\8eYc?6+qEW~udd Lw%OzLon).,*RjwBK]{@McQ_| ~鴴44Ę@UuA}[lYfͲ틁', 6lاO  EA'h]GEEEUo~׮]@9ऎ;=͛7btE@+.~_>Zd+`(.iӰ#ׯٶb իWϚ5 8}?~X*J anF&rGk.&q_u`|oҧ{UYܮjq҃0SS5 ofT X7V7nuMD`N|7 "/(?s1c`>L/-[^tOpGq{V3^kٷR6|/{=z`?A)~R0;F% k'}rʹ7KOXwv{|$l$](Hrr[f}յkÿ8kGH .*M`aQnSUCnhĀ^j Hq|JRU+Bu &Nȴ)zZLw1:%"XuXNA%b1HHLo>{'9ukb >b@]MBNk9fwy~-tJ\@T ,_w?uyx]LͥJxZJIh(T";vmذa? i&uOX%uT2R)a*8pK}#O>dĈ6?~|8ӎsUoƙgiוC a)`L*`P<Ʉ r0.ƷL|d?u\\\>W=eV^31̟ifژM5(z[^DKLE Oɧ>RHR }K< D; [hsăޞ4eΜy~NRRӵrꂂK~PTFEjw+܈V$-[={Sc86}ÿo:"]WN'$a"[jUQauEda@pЙG*8[@ 1!}_:6@9Pӧ[W_}տl߾''H pRvvns B|,rUs|{pcO<#KuUYkI~!ذ(:IL*YNJJK3xf:r&ACvIMM#s`c$0a̙%%%D OBI )--%%LV0dnAny TO|@BN i]:\hh((hFP#*22$h8"-й&b\!Yß֭[1@]cK,$ի)N]vEht<', gU%lٲBasÆ hc`H;7cĉP <}t FĝhqnO!ۼU`1U޼U2~3 x ^&߹kX)Lp};3gX9;NM!$L<8!ӄTb-L m EȔRXUwU|”}Yv@^2L;1LjJBd&oϘBb1* rD1ʟVoۖ/A!Al+* w% m8NT}C+gu&; v׮ܦuUI1gE `SFCKC;Dz1RPoΉQwzXSTʫKK7rŪg5~㝸\1V @srrˢ0G!W]CCl (tw$|ɠO0q7_uj^\lq=`߲ҺnNj% rcFEEVTTmk| cmڈFV)c@uB:74<,-ϻb 6Q`  {[y?CSu󗏍Hӟju7m{boF[C^]OŴ qaq<D:ׯmІ>ҕnNGDDP"%05zڴiAAAcƌ@_B'BbsA&GPH&!ё蜆Ba-N@(C37튙, _t}xba*{{n-ZЉ +܀Q`q0hc 1 @è"'j zlڴAȑ#Ϙ1#77bSv ĉxWLNt|C.]lٲSv"R$ւ^|~k2QiAG_Jd5_bmb0jPS q`H8t'Ob0 7 -GÇlSO:,X舦}mmm:9`Rmd?.&!G?q;'>mNj)I2툍K82Q]{d0)|tS-4홹gO-]Zygy/ uإb3Wee p{C!Ҁ{dC?~|3 4c/@<]O'B!@0[oE=s aSXW)2ʆ0{lQ±cN:uɔiYIIIxb"[].Bt!DsN>$aa+ł.@:z(P,7J&s:ׯ_ r ^v l@?5j_t)33o۶k׮4w\!"LР;%IDEԌQݳgAjh5?&U\\)xhZ7ߜ3g‹. bqCwT}rX}hnA}ISz޽ w^;>)TjO7oZԪfvI.`s2]2!sޘ+xsNŵ j7=x1 <}wD@OEz]('5X=+446Bm[h; +{5W-ˤ܋# W[>ǼKqvVQvK bl%g Dw7>nќcۮܦq2%?-p,^tQ+,Esp1Eb.7-dR)5jRQSc%{ؚjDd0P\m` R Hy,ml;裏^̾)Pnӧo^ޕ=b=~5z߄;Eg@ !>6.dKNN>vG$=~<#_NL!]'C5/!;0?ŤJxRP魯 xsxjXWQYh e*fM&#[ "" ^lsaaav& їM8b vh<Լl-Ԇ̝Ϛ:tViڦox*eRUHD+B'b;PfԨQMÆ x^ǍGt:AhTxNDXbݺuh@'""z饗/_NL (--ue )(%m V*6^{x,"(`)(vN܄&Fķb`-[,޽{^$J7?Tq[O Ihʕ+W^1 X>Z$% Y͢~ҋ1 hiP+WP8$JMpA-֬Y3|Ç`B #G87ߐ1:qsqu *@ vjߛ*l6=l1رqLҥO rS'yzaob +*8[gB]Uq 0PU!/ X*T%cVլ2x}y%'SR JDe\- ݮilBgBf8^ ef,NZL198^L_Ǫz>#QjYS} zgefT:]>9޲`ˬ9OWFr rS$a!-.4(dNU ˓8"Mq0nݺQXCKD>-m&iݩZ  |jп۷+o47.LLruRGăojl`~WGA y$=~,sT< yǶ9L&65-V pƞ* ĤܟRGeL ޝAq6\*`ݪ65)s.V57xxhk*iZ",g^z.]ȼw &k2ۻ1EҚW墂,<< !y.]*@ 7z2#qljidNؗL+B  r>JrC)bٵ{PWk4Vj:bJ21!dOggg@b@Ŷ ;`;k֬͛7N4 UM6999k׮ƚ?>v crM ?z "]Oh`"##3 3L91)X_x: a",& `$<5 2|b< ȅM[@x.Yn̘1hqѢELKK /{ʔ)9s ׷nݢWgfc̼yn (;@0mРA۶m Jv\\0,1b̑O=-g}jAOZ%4@'N;wBJ~Թ~z(ϱ1t3֞={0׮]{v)3GCeddڵ Ms0&Uh㪞u3n4RR8z7@]yLnW%,r!#~Su3(T3/o_JWTs*H$J1LĿ:*Mzo! $`.hO҂03K3BCրp\Qzh."Ab R˫WCI!8s{rrR~sI V!10 @#FȘҴgF&6=KJΎW_~7|~rtFVH b3wɼb5.:wެ콅_ <(6:Wްo>eYחO$Ͳ^u[ n)]:e&\Mr}]"뵭6%ڙd13YUM]]cClLܵ'爷"G +FЬYR&O<G3Vc z-W F> ޙa 5`f&:.^e_jT:ZguNHCNHw ܹ~z``gܸqtVwI$cÇ瀹hٳkoHÝ~{PҥK JWTW&; cLԘ4GKCp mܴiO?]O4 n:t&BtrFR)2 rȔ+VF{=(1ξHr KTcsЁh͛Ob?oa~o4JM(ֳCEٝ?|ݠ~N-Lx-9}3̠ 9xX@|N1۽Xr.jɷ uo-^̙^4ulVf=<(OրS d iJIr%^ˉ%TrH=f*apOAg~,{e٘l1^.r{N,_yU e.ҟB<}'jve:~9"m2)~}РAPF( 짟~`ae9t&Kd ߵ`6l7nUs9v$Q[RRҷo_T `kdzdؑEE?C [Z\&,otAz)TE:ŷw̘1;v؀sG߁me;2>:Cp{5C,FtB4e54iҝgg޾ugK55Ԅ$7}C)kð[MWLN!.;%h$R͛7W@Ǎ: śoI,Ju,|eUyUU E _CIQ>Be $J(Vd62r}:pi9H {Y[z'>FG ,+@k׮]{PC!s Q{wƎKq88hY8D&2` cض ۪UΝKvɟ,BX0ZP EB$Z`~{x .j9s>IAr9ZDC:xmې&y4fu+eNi idV҆m/-?_rjbN\HL56TgUVͦO29\-FS{А.V_rۘ|(t .j²ESc Y9ਹTCmx̙?|m@յ7db'3 BwrH lrFIVb/s ^b"La6 FVӂYTܚp3R'Wrc-\Յ =]ޫk.՝lhB#8kY'd DžZEBtB~ _~2{1P_ĉ'%&Q c*+s7lrG!w H ɩ{TV־Ǘ-c.?֑t|#z=K_]RtyxEp(M=V*!YuͅԴ?VƊc*i㱩SݸqC'T=t*Mz>ß}SNeffpp޽7l0E2 $Nq! QV&KYԔF5-B+ʙ *hLH[xd&s+3ceDG)a*SO :,ɡG}n9c[e%YؘO9K%Qg0qRٿ>8ͮs}kx#tA?q$oD AGMD֔# zb(^>r!DuA#!#"Jg `0xjǩ >h@:{^AǢoPd/og$x*K e,'!RY`dt]3s<&g&sZb[UM`ɂ_je,^$;Z=͌% ʆ܀66ݠa7 3lՋ1P٨H4_ZZVƜVr"dMWzSY׸_~+y mٲl̨vI_Z?y_TYCZC@hu- DhHM.k6`$[5j:y$Q1b]`j}7]M]ĉm7Fsg{`Y('&׶yaӯygG;,]qn.i39n_RL}✫'. :s D[YQtc׳GY Hrd568p@߶|}d%?ggev?86,0;x)12)xq{!Cm**52g_aޅLF`PHK1InrPkv֊  N'F}S} pKKΘ:z}cs [ fQ{qX5.3]JIlKkǥ} \,yye2ѧjTw;O0dJYY; qjkhYÕ&Ι;+5֟65_jv74νmHS\,=|`1;xV)tm\mNM"Ó6oN7sfgg=d1ZPh8IM~f J+LS&#`A4DӨ̨BgbTcM> f[8|aCarX H:1OK/Yv k6HJ2 w(OqHuJU9}9JO_wZ1!V.{%LIbUOsUVdl  )ي-)GP W^)**i\"~LC#N,6iiiIAAkY/|UУO),((KX3ss-LL9C!e(6{ ɯހu\%2^G K!1  9W п]{9? B!f3It ȑ2:3bϞ=Ç d<~̿E!(dð&%%y" C  +Nm KD+0 ʡ{ݥGmuU\Ll]]ojΜ9c׮}5&bDXS_/n1fIsPҭtUT#T-' J̙3NŒ /1:88Ɛ=#*aϞm/ZdC7vnF55^bIrK:,9c@O:O?EΜ9C_M&X~R Fء?,fZIF&FVd,ѣXZZA5`7S/M6Rc!$5LJA}Tx˖-drW[[uV{n4O>hƍK,4 TP*eddй SotЩ$ :d&O[nupCht|NϤ2㌩d=j QCYK* |rCQnB?6o^GW`'ݻ={W^wy'7ԡq!2ǾKQcn%W» 5 _"OT{BKҐ}WXM]fou>/mOzG]c_FL fh5 /+:gc G'NAԙ(AY+f l43LdQo&Ϛz*at؅h OiuZcc{tKW ]kk1b`64+iD%hCHBuIN9T/ )$Bbr+ \j ~Ö._HW' I5(T#'U6+Dt`ΐ0Ν;9B 91g@ 4SuTLE 7"iܮN\2^lVf743yy? JT tbJH>:CL !c#%2zV"l:"hͮx (C$'u;GzRI%TTW{~}0tx.b`#bJ [lR`X|_|1Y?w7\y-|1v,PT?>Yp(rbɔzy]Nmڷg_]ش-3oqϾܵKLؙHY* K{|xz?3a8$M+vIxed ʊVyo{,YrMMM.!%..nݺٳ7nHz\x7ҁ`"ݤgm gLxb&1n(n@0wJW (رcXO{gϞ=n首F4OÊ% GQс0t8/ڵkѪZJ_dl@"Cw." F'dLWى\۔]0b{n8ٱcY{ss3:89R%,Fwڅ+h.~HF]/DH>9=!%9{Ҽ?XHҍk_{_ּf7Ti^sݪݼukm6_c5Ԗ}L2dwWu#+*hRav㧿m,7m_f׏St}ͨýzGtu!pjͷd7ڊq2 cqN΄ }'3Gl`ZW? %K  43? "yb1z͛7ArfeCt?o͝._lumg\XBHFV<,gy&)HJ>2X,/`uh)4 B6+,Ԇ肉jnnڴi3$moᆅSYPdТLKzҟ‡-i1 plhƴi۾4w 8xgso?E-U%J<4}tNE0W]uUkk+Ab󰈿4'UG =FU{ͷ_{QT 9YL|*`1緵;wn0qC{:&XR~gX~*?Ϭ~<Ȍ'BS&.F8 cALw}욀ͣZJ9{lVMzB"teEUUt_\#_Wym6s)?{+i~D3@{y@ X +9r߷o>e2F$^#tI#lH⢰ĐkjjP1 H g͚a2'b Ls\qdXbO.͋nNѵf͋I .}8ՎGBG0(3S2LZ6s:Xؑ3~b4,[\H ;Vt)fpF^T2){[?0vCSglݶ}3op Pd$ay!lܹ9Wؤ m0D,b0! -f8 TUV,X 93&]v|etvW&FFJ&}GjSP 'Jk 4G.g[phY˖-{'@ G%J2Ǥ,Vi6iN@6M[ozKKe3zF#th֮Y y3l;)w`^xaYB SUnRރz d9l7xҥK{1@J `ҤIVI@zbUODNĸ=T(@ 8HP  D([/ꥡ!/%TGRj<6y$.0cR74":.@ ଊ v\L&=B(5BJAu|Efca6!05OFZ܁:@jkkk#ǝM0pI% ZwL4Y6JVLwCX9@#:*5ʪ)aUd?,} )s/\ 1넟yvO HIAEU|t;'v=[o;M:͝M ^o]jB2 `*X2fy9c(b ϙK.v4軸b܎]PTsP vcSo(k9֚ꮿ[];ժѤR`3#%M@ \3NZ$^p[5ԎYY>^vd1b\O!I$; QE WΨyUAi}Tm VF,$L(VY0bkfQ{/> jʔ)tl>sWc=g3rSݭ>4%ň"]ꃏ<0f܂‘$9]#X>frM%MH)sp8t bAF$tv{H-۱̙!vXM&1Gy?ɬwkFn۳/)Eqf2\*a˖-[0H!nMdF'Next}BŘ&L$2J"!z*I9"{o9x 8L0o/Rh"hq?iE?2dWc ɼAt2ѰNMȃl)y澾ET݅aךLBw{[lIRMÎ3(N6i'YR d <2`0t dHjjjpswSN |ؿ*3aZ<TAd60,@Wq U @О<v0_(O8$ђu))CS,:Gi2/ 睃9AT0 qɃ2ݮx%Б(@.$+M%^Į@a%PQE(C_Ѓ`f~2,6ω'bm`q=.)J ABG "g:^@p7wuuT>~Q6NtX';rKa.fM`V3gK: 0`ЕW݅+^K.)qIvDkj3HwK**,(b.b iA3鶉 i%N$_:cIE78]xVY:2vXʹ6^F-j4~\߶5,&tƆ#,Z6.E[Erb䄍ZoƐ& nK8Jl3ӂ/䡃REeG*ʰ£y(  b'(<0!Q 8ӌ( 6Y6LWy2CKP5i,iMl~e0r1=vBxTŤ.ŬT3lh6 W  t X? qꥥ~g$dwYNȑp9VM@k8QW."V1tUPoU0|ATh':_VH1n)2 Bg,#B cֿ)16ĖI'=+ )e^Mi$)L2)EeE*s̞R݌¾"_TB%+D ¨}a\1rp59m$m 2hNxј_LwZ`J-q&ũH5DC$ O5B}PdvHj78631*dGo=4]US?GϳnͲ"1Ԕy .Kr!%xjCιPttvKqqdz\USRsh8Dw# \ӉZ6%|pS)j' yDDL.hp01M HYt|wB2K)_Ok<,jI)N3)#0Ѥ'"LH?9:+s#5ʈpsMaZz$}#ߙU]d3YX%3,d wFbYXЖAV{k!o 4 d=vwW3_qeDeuUz 󪕝7N}||'U.?ϧYqFjF'޺}`_ܣ/QUY.aǯj_T-m`dMW1}is?ds/lp COC?>.x__IǠb#zUJ}j}ᇰON)-kG?W-{^_L0zpS.0"d_jvQ[ă8!6 (.pD2j'6 :̿kog k"+,]B|.uBD:S,2rFk?ޘډP Zk3f;#l%wF'? gQډw^7ۂnJE6i SZBQQ>>l vԏZ_j$o]r)( ob㴩B*\q m]_ޯ⇏= z[RaŖ=LÃh?)Nwyc梩-&Íf'i|jH/R4J1b{"YG;m_v.56~ϓ qZIOh8U ~!Z1YZ(Ci9qԯqѭ+0d$|$IY?p޵-X)21daSvߙ|; DҊ#lIm)"8j8ЊE|p8~w~oƫJ O>yG>sr0Q9Kh+ZqAf$dI;tͪG1@=ul\ FmΥޕ]+fP\(Xr" z?LS Ȫf#$,ąvs7J$Lꉜd֭kVbnb9UbIPdv0pXk|tեE<J]Zc4_N @sweʮٮ8,]>Y;<ʙJ33j<.&'rQ! LHLښ8BS{:Q*#8i j O㘐[ 򜰌 73IIWQ#gcU9euS܉^j g^ijV0CkiߠlJYA,֎~J"R*aD"E< OY?bJ\mcY۝^^`Yxe >HVОAz}NJ$S#TD-k-pjnH5 CKs"BhU7 Mp8.aշ"j2'AtvRh'n;y6@q2taq U绣us_Mno__ݸլ'? ~F(vZiy EM3 /mrA Ҋyi\UODKea kQz^8vժ3]+f"6٢9xfʔ<tJ rēPb Y:OҗPJfBZ'bg`)YVDOX3`9O3,ěLl+”" q I7%K99ԍ*Mĝ[x\Ls/^{4M0:ʮ]]p ]P>Ga"x"'"l*)t"-U~,[heXwŤضreluL۽vڻ4+kd 3%|i"XbB)ºVi>tAOdb붆ܿ4vb44&OFC:G.v>I^iͩ1$ X a6Y+ZxvGkxv͔u)k:3sh#`Ual8Cdv7STEx0YW[!#D NRCHͼzI+RG}t IڵkK:Bu^̓ X0 f@; ׯ_g_ۏ>_kpCzO}sˆMmмEݽrVt+OY?+_u"Vs{v"8O~tk-L?zf?y^{׷cJxGk:_{*}AMD7n CR}i>+Vv:]~JkV &I rNzD J53jG/YoہU/gdf5E!Zd}ͫ-TO/ /B6  +l$8.Llv׿y5F)EK+U:7ʊ0ziW5p,"h\:+f#;Mo pI0:7.V3BiQ[g} DA;j7k;+sǧNY@}NYW[PkdӚ߽t>7[ñrػ^z.|xȖ2Kq$fza qw/FēQ(w?AiBgF$o@s.}uaSp7MD#mweʮ.0v.Z0\jRfMFT$f`||)kd <ˋ>܏Y`1{xY{fkFX25J9By1NO"qmL|Zr(6Q]Ė/FvBwTĺRzY;GA#הJʹvK>gO@Uc,LDzH̦Ҹb]x@%l,}I 0XK_89n z;ɽ~BԔXHI(=yq%0,%f}AA)zls @ 1糤 qp7KWV[#0#$ ׯu?9{~ϽnY:r- i?^7g{F\hb&& 5 mlUAPSA @V,߸ʥ9)խ_MK[W@͚&ME|1+SD^^+W=,5[P`tԬi:.x,j$[ٸ ~[Ͳ++6vɩvmM嫼]m*]dkLkx^^xi(`t;mvRi]#ֵÌbh r @ ٺ1aHmi iNbJ1+mQ^;cMvsA )D Tl0tПaL"GQXVQq* ˲#֊H.y/\HtyDeSnQ!ytlVZ:۷kATSyVA/"@X 8}~t9wo^܂rfQ@8)m'xqՙϹ >u!uPHu6:_j;dpthwl3sIH ^pGap.K)^K<}(莉FFdؼxCTϓ 7^%ld旸1Byo,ܽf}:m&;X@ Dqco+yud9qtݽ= Di v~u xUVWظi7~߅y8ea2Ԝh /x6_hK(^O?t0 ~9Wpqtȓ@^s4 -+,m&fV. ؁A ُ9u6ܘ8Gөm#l)Tѹ53߬Y[Ŷ0@2 lFV-} -~`u1 `ZBrM'y,upVֹq !mfű* jʳJ%1df1t'tW FWS-:y[<.Iy{Ͻ8; G9ZU+7%ޠ+/yΆId5fZ\߿o+h{>qZ'FmFa1H4N9|FGxCPu?ׄ z,pCMu;L#B!RPu4sdm5@3 8Qs8#5,ֹRåLGWyQ!l+ g ){I^tKb6VFF *Jatbǚz\ߚ#26=q+_T9;Ji,JJ HL64\PQӇ P8 ɗ(ea`jZt3+"UiRLcm5XTR3ó %/,$ Vt1Un5ZUƽ(X&KS R<EBc5t-aq&֗boVwU͡K5M+۴ S+\QvGi~y%†$Xo KR½eab;C۷/M(F }zppsmDeHu;T$g"lk&L4J4sE~k7p%Zkz;% =% "yz-?2 _?57Z[`qN~G/;`D`lc;oU=ͯ|;W&\d Jl Pv(mtaʰZ|0B/ϕ.pPn`j@,VX =$\Y֔@?f9j-SU1ѸQS]P( pK6w3 [2˒KV )A?Q!-A0S2s+ZDoT"xP/ &d9XY+/7/W)ljzPlR-rKs~Τ&Tri! `dYhBcE j&* niK3gWfQ/ juW|4[x5 o뾢boY5.N8i#FpһqÇy0ODzawu5Ak]oA NyԤ4ooDYQ[Oo A 8ղo|…uzuu{9yx޽{&`PSNrq]p7~}wNeyM/%Pkk^|ߔrgw0#l &o+瞈}w=gz.!wuLT>{q! bX--WTՓ&N3Q>WEVtSʙbnWdrR3.=@ ٙx'D/_{^>Vkx|UPU7U쌙HI6XW[(8Zl&U5<"ka4m[m|2ƉJL\-Xe0}"-[ fq$pmi#҄[ pH@p|]m{XpyiOk??sP;J$7|;+VKK6:(t^HaͺoR%Yu]XO @Ä4 ۃrC=2%D -F E [+i nKVhҜfK>8?G)4 ȕXa9KMvU]$} $f3C9©q4[,bo>*Xis;V?tY)}Γ줂~F m\Rqr[|j-r\-`L1:toV+- ޷SZX&ؘM_pB3]}.aAθɄaeQ)9WBbu.BPX))'#јMlJڀ^%*e| M*o_9{IB&q$LĊ,ҭ*?qa[ZZ 0κM46h ><اIL,,"0\́dN B4] YXfyNJLɈNj<"T]5y);z7v99-ʻ-*02'ۼ`dVͩqDE1 A]]#F5g4AI ..E=+tsi.l-!`ԌB1oIӊFSn~d\kO[xm5, )Ȯ;Tՠ?,Bĕ6RLrjL֚RKaGS 25ЌCRt9Ye]!),5gȤk#2gjCP4 wXAY~Y{ }ÐHu; FG\FFK= 3஭[~⏾'p`x~#>֩[#/zכuSOi Q =" $&JXɏ<I9zЄ ×nx@й+D3 f3V߃v:zG(Td{4s=*OJT1c}'Y`%cߠɛ 066-EJ ;erU  5YNb'X6gzW=Q" M푦45ZLۙJlm2UYX-yi(95 MBV%_fUلWA'6Ct4fGmyq66;qɉѤ:y&T8K:A64n|^mY)ZE #* j<)eD6>fra[+'Ov:AzlxT&ӆ9{W瞻cK7|s]?eSSl 02:Q$vL*pδ^iaafO9rP Kc!=X COF aK^4( iP%Nk=+UV O (I#4LPIV՟[]hM\"Fê;FVH XY:ρ>ZYaץF:cMa:L!4 \5-fSP`5W-ӹXrGDDImdBH~P/~0jќ ` 7 mc}ɉJCW2\m1*s)<ڸ⺧mq1̢3 ѺZt-"Sc.9M Fк^C 1U07okԻsTTEs{*Amu]/n{Bx;iɴAd$# / qՕOUx9pZi%}5m{n)@pHi.#5$ }r>']# G]B0hh4&K}[:pvmmAD\>_@߶QmAj}A,[_2U$u3&%V"mżf'Y,Td(ĉl/IA,!!#vqe1\FY%_g܎v48 Fn?S-Vo_k| nZs6ӄ xȚ 9 IJԨ21N*0L3RJ&fNRL)79qL`6Z\LRg{MA~(8^,B\bA3 I=X%z.ܲF;ꖸ~s@Fi aC~{ǫx5h/j` dAI2<b k3у3fPqqԞBdah-3 3˩C@@r6@6:p@0(wxDOJ x0<~cCÇfka06'l_7drq*9 A\A "IRC%K֏3:\k|n@m/q1GHxcZ AD j1Aʎ(0L H&!~L0dTLF+!)2U59fzG x=<3=O?}}}={QP;֯4 :>j׃QQrr% 5j.-"WV`@ՅLGnͅE@B76#AGC ~taafO}S* #+p2h+++ O=ÇO& fêlޥ ++>ffZnj9s榛fLEFxSs+^u=f9cV7z;~:zmN/鷾ݍ}@<[1F+آ,kIhx tܙz]__ǵYA277BH #e.!eF7H}љ…KXZso:tyhuŹ)\wP&,AnVV־OKK ~`Y_?wp) 7Ш;ڳ։0*F C~[c ?/zZ%g6zsX, ] P33ڽk=;j0o=cyٹکv͵g(7N;^޽]K5@\ӱP{y׾ Fs8Cu߃)VoCI kKCv}fn{/=Z]FVC{i?欵Q0`ݳڙ3-OlB9r; 9黧wgw%dIe NvdFNJ2BHH2B' VH2H`bRvUd޻s==z01_z󦧏w7aɢ,BP oj:%N0 XJjeii`Nc yШ?unkJE-+ZU3̉5Ues7UUx .`[sѣG/C]ve^2 PN$)['`DI_bvj?X F(8$3D",[.Xr^(`k8 oQi@d8ǷOuoh\uh5Scbjrp ŀ $JH*FSْJr+}X&oyN㧇.1B.V yY캇QBDh1wЈ&E!ٜ8՗O2Bj+`^}m5-V}/TT&:iZ+< W/>%!|tWu'j-WL[h9urB8`$ӼdtX@!~=@:AƔ6B$B8g^P02)*ФVu شS acՊ[Z fu zU L I u )H*Kvh$_/@-O>,L_dBz>bxEͺԚ=TBh6ӿJ0Hr{{Ϛ5 /=S/YVj|t?ԭK/ CxFb/|Td׳}t& Ĺ/A4-1p#pED0kg(vL z^TSᇪ,)u? NSj"2?!fif 7 i߾|' )0 [aրaݻ;::> ( +uk[?wWUk̨'N Oq>0\H41C*c$Tɗ_yeS v7%Sc"@KWE7txƳ/b\đkK:o;oP$r,wF`U{5f@^+=D"]t{6NڌRxMl{HUyihh}ttkK /V(.\[t7޻>.Ɇ.B]=4M/X0w[.m]]z⡑B:{bOMIRC%+,.EQ3-=&r@ayqpxbdN[oz`pTDy-"?ZCֽ%wfzԙAA)K.4I([~ uB0$mӖ"-[ȑaY ]A#<<: ߶)}U|y _zlQ`tp:Sj%wۭYɊR\{;=gƟ j<6uCpr7~)ӱ5@ HZiZ~z,x4q-7>}fRiJ0tc^5m-Xx犻{ݎ,]q6m>_T2-hIw/7|oo4pq+и\N,͆bh qUM5A~) 'p ܴl\\rzuSp"H?"M7I0<~0ޟ*oΑ#OBf=Ǐ P:)z{,Y2n$/|b#c^&b6_K8|0ۨ #q!0]iPF ֬ F"h`Mm&ES""+j0{0"šo>l\3dkĨF`]2Ihfh΃v[ B}<;TRUkWjȰz edDA8V<菅T#Ꭾ '8?+C *z$%/谴qsW-/i C4C cLtaZ"X?BS8uuD}_y` #8:񭿂>?j$ 8Epĉ3g58aN~`A IT+\x($57_88:'NرcΜ9-zUU H&Aed9D]CӞɳ:1W1BEccD%OuA':b~ E~Cr`ahz!L#0u30NZ׭4 uaͨ5 "Zv$d;$K$J{=J %N8~Yg]z-{ iXh}|H:0iKJ")ر/hBao}O]kꇖu"8ŗ^ފ6m>Ty/z{s 0F3Hlf D`J}ȭa6ZCfͩ8'(t{x}#zS/~pۓ<?yr> }sfvv\3hd/:AĈi?\ƭ7,yTɏ4%,{k{Oy124kٿy\]ػh)3}k߫=&}tp( *`D0DDF:gtpf̙Ѡ :{uWwuW׾8 ̜3zԫֽ}~ǎ}"T8찱q_~dpCF5r떞N\nMSzm႙f uW^=% AZnE\Q6bXAE(G/g9aXnˌxim܌.S!#Qh;! U/^Wq>o/- w? O)P7=xwPJM')EuMٶ'zW{BI庮b81}ب'vd99RQBQCCŋgjHsW -V0xi :dF|aN!fV +||Em9^q?x_#Qg"KFmc/6L+W4ow\煗~;E6>覇?""kc~~mrYdAy~T[,|کN.oN:qowLH3A|iAނ'7l/<_yMå;;U=XPKb$KPMrToo✞Vr (dh Y-E1d8 d,Ǎ@047 L@R\@k$DeRI L^軁4g!l8yHh`T;Ӝfd!Dg#8h~?5$E;a9ZOJBȓ@R ᏞKzݬ4e}={A(z[[XȢv#z3RF-Dnft=&j6ڵkWZKݱB"p08T#*%n^}>!Ɉ5ne-^_62у֫J)Mx̬ywEgMؒZ)frzd9ku]cưuݷQ%}1{}ngˎV *su!@}F ;5|;:;zk~]rG=)`m^$7V+/Y:;ih.*ˠJMvmQ$0q"=zPTX@09&eX"!|a@PF=eyy( @T -X4 $Irb6@BtNBUJHIXn OSlE A}ZYdx2[UMudʮsT9,^UVڸY%t?_"+pBk6a"gPoZyRQ$\\ˇ+eUU9ػw`|> 7zY]v%e5DɂAY}ϳIKŢ yt@i:9YhaVA h "LhfYdQ P{WRRKkbX,)krIY%ISy9B)xϿgW?s睏' ` oY*p(T2X.jZbm$3iZTЕrYSE@CpĪ(h@XxJKES%ɡMhjh.$h@khm {a PLMظв pq, 9Sv)Ki(ߏGPT`% kkGM]/gt&QD XP @kݳtṬ}IbCd;D 5a(YT>@Zpr!n*7Za ड MPC$N PFzc$_^j4=fZHK!`d96"QVc"u|/ 캵k&jkFls֫꧊,Xp'e",MڭL_}秊We~a0g{y34M#}erCd'W_Ye_I*)Pwue_/ 6Z5_dz &]YI!PcbܔN*k3ݸi[˗?Nlx{[]@-c1D`yYXC c YP-͙@nӭۇ Ʋeho]\$zYS/~tUGo|O:vh]dc~9sgvgkC63$)DHIpC vTH)I! TFfٝ~?ShGWGg{{^|_W $9H~?KlhM73>6Q^y PMmg)c(1,G@L8ʬ8lC>qY||H)Gg0"Q<4Cd<+/+0늂`ZvBF$3ϰt>/rE.t߽,ty_*$p\u#?F힦='I {ŲQDf^嚗}}Ǿ_ٺ!k#vcc"0mx;WVEgKI^;ILr:y 7\}磮koc<'jQQKw޹1HNGy0-I 34:z(,+ر *m!u-<^@_ҏŵuuX `y@kCu3Dۏ/ @v{g˖-[n6o|]w=6lX\QE "S TzllܶmM>l,c'aȇЃCoxhe /D{P_իW@s Z Kaxɟ~?z<|{w}׏}>'Ԯǟ:'KkrV{ӍBC`<σމfA$8,cW(N(,,sx1'8trZiV/e2\Y"A#hj(|t)J3fH[Էv#<3X"Z|>s&^"T3|mVdE }+&5pt(*c:wlEQ©'ONUEyDW \i[7k(B5=n$U"sZرkK"?Z+QY~pzQ[{%,7ˉo+"?t`/TG"P߲z[vE[6n~Q/3>Zݹ1]E>JrQ~QۉxUWFKyL\jj >¹#zE|/r!fo^/hH ZsDyV.' @h]e ;bNJ"'<*F4hsEW̮k.:ouWA1FHg,C_"yM_fwO?S3O( &yޓG,]":Gf2{Yb6sk jBgy:_۲;7#9i9sA$E]Y\S **}H00ɠ /I3,JEJA3=pLGȁten%A\P7d14*j=7, =,XqvW Rm+жb(}ϝZLuKEu+!Fb(PG^U)pEq=(ElhUP+)XXOpx3c? F[NLs|L[Vc;~2ZBU20p JRr!`phuW?YW_siZ2u)O|&?+?[L$.N7=yQ.&v!1== .@пzluCޏ8 i,'3yx뭷9~TE,4[O}QjHafx'Jp͘'` (sLN)TэZEdd\tۣ-aA"8l;#?HgIZ-62'0?wklj>,}K{ݳg1ʼn4@OM3e5(;v0TUm=yȲ `qq``T[Mh U h×4L/ARe45 d.Ԍ 5J% Qnsz+Pa7N:ԇ,5/)_KK^qb+y1Ęn}:u+>v: ĸ7a\n;sΙen0(c1`!x$8ky EzF%pol_Xo^|RCJDminBv+PT5h_Q^,bj] &qAĆl[,qm˱ճa'4XYBf3z ăih*FN> $WWWpfR! !qX{o}^VUg92O0Uh Q΢ݩu XJ ৞zJD^V Dꫯ'@ܦZ@T=s4!=m`wLaYJ)8`w) :A˽*S+4C%8QXALx;/_8ԛ-1ڑ bIFyx4 m,m9/ 61& IDRRS 2v0@;oV XunHgT%<$)8`aa I#ΆLl@!R)R$fs 6(plQHKG'W+J5-kw"PH?G >D)A`M~SKk  B\ƒhn1@Qn%]YP EM-9677^f f< pYè C<'+7muLؔtޒN{`ǃX!OԕZQWZ}Wg 8;3Z"|4NƋkEՃZ7,xI:s i2AZ<)A_)W /uBۓ YaZNZہ(\p7+YçowN!70aemN3PEIRA͝mTݨ^Ud0H j*5TiZKF۾Za˜&:dqrac`-i(b `z?\o*mFёب;D._KN6ɟ.u"ݩbޟnwlY2*Off U #~&?ّ%S)h|d:69*#8]l1S#t̄6h73m::xWڢUYLKRMzfzSi2j”")T- A^Xh9Iw'-˰!k =V'Ewu8h_ |$g\`~?t?Y>^Ce,ģK$Sѿ9C]1t8s#6ЫD6.̻+P0vcP!X2 a)R,]a&6]|G C"W$6)fXdVػPBX)kTi:TqlBj^XmՃjE?6/`sbF+ʆXpuQ'Ђq=E-6KZ~<{-H2|35KDDT 5)2nn7Dk*;'!,{Ǿ_FU#GIJݯE6gLՇ\r'T:<'IRq͈x#&E=t*̹(v8KX &-2 V{~5 'CGĈtIiG_(fT6ce0=lb7Iȝv1J: ㏔ɻy-'Kf, txw^JUK:(Xp!B0}C.,uY'ˌ( SjJI+@6 Lð|?/ fY_m/-/b2F\jݖ#M3SG{BN[N<^|*RDa eikX熱u/tĂD@_T1> hʙ[NiiM 0%d}a>j$meL=OsS7)L -+86N#ɤ(b2~R V!xI˒K'7ӫVۿޣ٨0gx,x^(utiV㍚`3tW+Aޠ(5?:*M՞TR=HAVi Gδ3*=>3t3Ӟne3L6l8+-^JW{W* [Zrznӥg!mW<[ϥ~AfTLJ'ׁٿkLLN4p_Bl#(ݱ&:$HuΜǏ!52GjZl֬7x$kEEm<СCwɞ2uJSSѣG̙p8֬YcSSc1 `nVV3'W\i&yz. 6˼Ct`qchViH{B7Ә#~5˙r!JWS^DPe@H@CBɪ B\M)x)5}BNOz}p\Mha,(yU{HTfa8|pkk; 53E^xᅩӦ)@ϛ Ν=lco_{ђ"1} &հN7ިڈCB_{Iu;Sjמǿ~mJ>/c+Ih? $fya[2U։)VӮJ_Aj2{#\,l!@A0?m&^Rܑ],|_2?_;K_z_Q1玑w 0YxI$%:W D5.;ĚMǿ`f`R_u|zmI>/n5miLE+(sΪ*촨(@#DA^v@[FFu\%bk2$ 54WVVb*).is3U->ֺur<^;8NLtW6t|EC \IDp񳐿K?ꚶHE*ćV"L(J5˺gjKs>HQHW Gq n٘+!#=Z{w kGY 2tv+b{b\3͟ ݾ/~*:X:Υ]v-\x ܹsae{vH X\vk#77G ogfK w)V5h)u{W{nk.+Z?jOuwyRd* I|?q!A`xTr1-je>o((Ø!Ů"=[-  E%%7y~i45OD;ai1/?ewmֈsdߩ5H&1,+˧N<~g~܆#s/pfsC]C'b|Xw? L9"&wll 1$eRS  d@N99'%566fgg'z8t#kfEǘȐ(N2wWzFFF$l$Q J)d%#T D.QI괐j1%5aYZQ? GXdMP1UlGd7vEKB`vAe6Y4L@2GYYY^wѢE`[>w~衇,SM W5kƍ~a0nН={6g޽z,YA u i/^MMM娭`HcDgҐ7"QhJƑO/T;q׫ҍ\<$Gf/u*T{V¦@gQb?Z[K$.phGg̉_T 5ѷ; fae/%$^S-ׯ^XS/\y>PY3333\ଚtŨEE }oio_> w6-V:QP=Ǐ{}q0p|1oMz&N"[DAg4A2YL@ALF`͠0D#Q$122ֱIj4Չb ن^#P*fxm/e^W4L??w}?{ߟV44& A,jpKg-jW9= ~ӟ<+ ;b0Ӌ__ckr>{,#zo ,Jr> aLR;ˮ[SCHs~=GQ,D8JQ4!@2DP>#m ]G 4 SKĎ"1uTTe#D_N lh8p {.g2 "^+6,!m~l6rud'쫯ά ׯ__UU'(CQCz…k׮z.--8|͛QCaa!. 1k֬6gΜ~>_C0oA_I_\bo _pHܞ6\W t{2jQ=w$W׸jz d1767YR>gvn Yh]x{ d/ &w7jhv8w9VaÇXL'OkhyHtQx)2jdM߃qa 渓@bH(HO5é15aJ iBDQ tN.! 7#3"d?0.ϸtbs>39,I_'a9NUڼ+V~W\ %a eauu[Z+Ϗ, :n8:9(@4@c(BF*++LyQ % LB&37)zMFU3 7 AG%eeeht֦߯VEVlMT/3lT!C05Udk<`bvvvSc aOac[tG1AvJvy=/Ԃ5DӧOKJJ|l9zW#FpyF҇%3Xek[XmСA!\g8wѹy-H$5~ p"+gUӎ+@ƥ3cG?ʺ1~[+Kz6g;vf8F1yXg߳P2ybTy8 :  Y,)@XoL]޳ UUܶ}s󒅳i#BM_~/çMYǧ_{-3XJD1Xy|TfܱcE-$U066.]cr]6 *?z}ɓ'Bc`txqAP jŃ 2(K iRS޺u+]In6$]3Xhi@Ffә[[{_ 16mܨ``V ܃. f͚)Vw&Mټy dQBd+fZWwrTQ"fv:pёliiCR+3;+&Zm~AN2 C;MV~5##ٯvǠ2WJH7C7=,V']t (>ٟ>8al=!Y6`eİ.RSшj[A~1?=qɛ%Vk$oW:x: ŀv`ǀ={8FI{M(CSxǿ  ˖>'U޻Vf̊^d6!\2,XoMKXc9nʱcǖϘ1:)extܸq&M*))zinu"  ӑ.ZɲhW&L0|QF \L6G]RR#2 rSuuuK,AȾE'D":y$+B%.^ވGcOIKK, BӰa$TUm䓚7`ɇ+Xb[\\ى!RXg n*** $1S1KK A99y>y ϝ;>ҥK=\1(I~3px ;` N.֟6[x0U$ɋB3TzV'ώRpey[~3 ׅ:nUh~.˴gV}һ&*d-u!.ݑ%S<kꐩӆ}w\~'3 hV`wx:]^L0pU똤Fmmnimml:lX%Iwǎk̲h4DNwϞFرsܹa7ZlؓD$DXr0'ipHrB%dWO1qe>⍂7Sm-\HPi֬,F"lhv{;VC Lgw,o:ՇZ!a_P/^ v!D1xL ae#Fp )Nđs:F Ν% y.CYdoSL]'8p2vdҀ&Ȇa۶mT /lhرc2XuPdb$7Hc2ٺ̪JO>y#T Ήb>|ӧ?~sR&3!ݺu+6lH6oތjwڅacwZ}w;r w8IA1u(JTPH&&i&ՙĦI;q?m: V "A@ ((v9 єbY~%si}%ohKpGG|(,ڼѣۧ7KDOQU׬j C%˗u-=j[S[  ]]iXZ\0Sño$Z4=J|GX`͛0}t*a ^,8^]t7pC.%3-$u]GII1V g͚-c>M b(+Jg4&IhOE'<\WW8N=NA530?ğŰ&p %2c}FA&qStBqa&Y't.)\ n bP@Yp'o49it yklޫPRmfg ATzySxcD3O+ʏ$ T.$_e.ah[߂.Nfp!=ʲ^L)8T/x{c5^ cp õm :!y8ףpkBc܅rZ.& :JIK*C9B -\D ,A ț8r>|6HTLR4EgH1]/5|at8& 6Uc: (Dg6KP*)B8П!V8  2ʹ6 j@vlmZWOw[sK>_;raV?1Dɓ%!͡nFdm%+ ^ώcWj fΜIZbHS1g Rܽm&Lڊ&Hwށg̘Gl^ʉ.7t cݢbZ%_u].?~8 =@AKB?DQFN{l:0'1XU,ڠaY( ~%_r`lMgO>$ @Pae!G%sȰ,Br,y|S&tvԩquuuQnGZ[ QkiE ܂===-O> < YNH 'Q%|'|Bjي9|%RוƟ>*9wϋEB~wU5fّJIbZ2 OL3_'OdnjijJ5k745tRRl&"q#U`涌i;ۓK67lh4Oik+WHqPBT J,U ,os.v!+N TM)ڜ9sN]2``Qȡ|ٲeFh"è &Pxuh}=(I:x2\R(F5Ygo䈂Q5_Sc0_('!T2Kbn⽽MMua+<-1ǶK\&rT0,̝XdGc*Tj  Y,Vd_R!E-3B<$U>(\r\E"|'~_t{32^jU0kP`7b6*d]Bhy ZEj T9'/hf{OUGcǺsӘ knH57 Yؼu랝?|TSsGcuݵudEZ9s:z{a&&ܾ};&`zqO+d={b'OK6^u46mWbt ǫqtCO޽x &{!a'Rcd, /E {?~ͧKCΈrgȸ~"6%Ot-02VAV øT[0-<0988-MMCC]&K&|Q]$ ;~ʇy  ϔh_?$l"fbՁ|mRLFþTY٬$&X,}.dX@@)6<-#f `֦8 ,0˴^ \$Y*Po2;ҭ,/r'|HtC%& A]WTQQV{_~č Pb-d{reV@geR6ʅH)yOKܳ|쎎c_m_ QT{K?T+ҿǚ>x?;+mǎDY5\h(|a{d#pM#GP~;;;YN~@U2Ӓ-F=z(֭ؔ[Le5߿P(gW ̚ piXJ Jo-[>ҩr/&wɩW4%clX2R)mh[*WՊJ%FW$ dD,qz&؍4O(4llH0YJY4ŵ&ey4.YbEAQ+b;d_%Ë"KU5%2 6>0)a5V/|2utі`b BG뒭vmVKYٓ;J%j5yg+OO lzuVV.^x4e5U5Gh, ͜5s׮]<4kzU*!6nHi 4Τ.]e>& \X)=zxg *LJW+f{.!ìiXB 30^ިY2* EA3^ \?ȕ"{ɂ018MqUjRͥS?W?Ň4\sԱVx|0łZ@_c}c"kN>IAKf8dٖ*(}|KW2⡢T"څ|@h@!D8K;^9 G?9Ƹ܋oq꣏>"h pCqp=9ϨP3/LT0 '`;q'O7LdH:hcY`PT40ӊɸe)$\ƜP걧O \~EKKloΜ9!i}㍋l٬"e!MLTR4]aϭdbr#L%];wTo_oScߏ/ԃRcPl.'meP̥#a +ե관W,vujkMEס?j$K+0O>Ng_P`_ ӪFYR  HUE-[,`N*@ ץC.狞wdVs*~Qzx"Jh0avkƴ)qM'ϜGƬkWD)HZ-J2P]lcJe xeuY!s/E:jPT 01g TJDp-S.*O]*,^Z RoQ%71R:H2q b >+2l|(L,Ll4Lq[ng…{ŷQ{ t͛ M&?~<,ŬpTU4twb ar]qÇ0˶96 $Hf0T9 K I?ˇA}YZk&zkeaC2sΐנ@ךfTDV8]i9V;g"ı"+hA?Y8}koYr=rLSd09Yb`8[1 3#5shʐr$vy`?w9(I`\,fΝwnˬuג5kr+Wnذ ,dɒuф 8_ ^xe˖cgҥ/"aukp<} ߥ% afӋl(Uͽezk֬Y{ om8>mFeV6_\[wҴǎlZlٽj@\&5`lN:kuc0ڲ7-z7DIF:۳=='E2{O:kvΝ;u-0۷/ԧheմD2帴T/C>OFLݑyJS+ŚxX6P*Kt$Հgaɮ;pW*!:;8v$Cy⅊ܝٮA+J?v}cjշW DږC |./y.>tb,W֊U(|3 G>>,NlX 2P2;K8N_skLS>yutNs0onnE}d,f;oٔrqUA]SðP-a\R;a:5 o2QWUSYJ kUcV>+XT*:B ḷ\/4 tD(S~_{y[Sr(3({-/њ8d a[)}, i<$hөV*z$\,"w1rTٹ=3=3=l0k&16l̒dK!^jKXl0`,HHDЮH1,kclx3=3=w[{ku*ݾuﹷn393O0#9'X)yYViG&)MOO(a1Or#qݺu~81fHcj$=/pSΛ7Ŋ--- ,J2 X,O=z@$J6mː%P,ܿBNꊬ,C!Xڛ :OFUanxg1MǴtئ{xȤw&Ҵ:Y LD_4YeM rEJ]mmmhOU.05/Oc>P@3@5+IsgCUBd/ no6,ޟoǑZtdhy|H!IĵX<$fVe˖>zԵuz@g1.Q̟ɴX8,+?67VE5mȤk>@S fT lkU[[+ZBe5M5Ywz-9 1 J@4DP%NM:NDޔJ:P,qt}ChTq\gz| LiV<O*[`njjʏ|#(g||\{ﯽ?^jUPF&7jŊdP9F 3TzhpwʥOW M-|X,h\RT$0~+WB f?;|4 ײ?G˯';o馱B1ֶK B@4t+t9a1!G]h"H\fF>>ϿBj+ceEH2Mi;\:͛g | F!?Dtp0F*L$@ï$IJ} /,+-8s[gϞ _s\Wکi@2wi-Ν6M+rwSN#YQTa$*[hh`hX ۽{tD_βrtq+e]F~Z*{~c͏퇼6 X,8xR2-V~˜[cFaIE[ +??i/!Q 0g.#ie!lZȲT,Uͷ0LdRr2km[)q)q݃Y ܔ.=u6WyݨrEcnU>3vCS4/: 7-% /gtuQ P kY2 o̳w*iS;D1`bkHau]2^xcDz,^%uںQ `,ĒB:Jζ6'G0T-U p*fiUL6ꆭȢax8{dL LXDpHb*ճ|de;伉cˣrbXPbF5$&3)9_g,9ܝ (8 !Ltk2LT2 VNA<`aյ,*3`l |;ݛ/p02YHA7| ,R< jnnlhh dUL18_L9WM!*L7M.SMX6s]?)0!e6E otPQ ]q{>qu{;CS\#0nH]0;+3=%ꦗh"c0ev=ncYӓ-qU$h@1Tm@O X,@("@+/A,ljjS P0gTG+R&89Exo%y7Z(&[{948wM/R<}5QwH+\$"xF݈/$%JaYQR?Linh'blUp5qP%hpjY@W29Y^2'M~,]>[vVr2Io9} 7, U+몲LeM`,Bδ8)\3x8W|"vRνt~&@0@#3K<q5i!_gs@_|˖-zfzƇi~i۷?ۼ$ڢ䎊@'[ Z XG>(*?xL /bE(u#(L zۛ02qD顡!@xR8ŅkD4UЅ+Q/=ӓw@B>c1xRk6lO<<zY">a4 >aТ ) e@)L&CO9?F cb$ ˤHr8(#a􍢂F(/͵iFuگNLdĴm\4сMlOuP@3Mɵ,BhĀ4`tJTݐ{L;qqT#:aWMsld!q̦<[\mu&5xWwz'ؼy ޴iӳ>裏mܸq۶m[n-{衇~Au.78kJ73D'E$| app0oFAzz8ph0%8Тs]h})t>QΏL82ZenNʍ`2)]www{{;}1G +\8Β{ڳZzxF'/mBׯ,?cxv($OCqŐHA:;;! h0dH'\C,y(4iÅG+V._(麖H'GZMOC#M\uV;d*݀9)/i</JXb0$@DVyxvx &*UYa+˴u1آ14tI=vBQ5rc!ݫ JDDRs,L4 .дAy)"G9=P@8: 3xIEյ`"XdK!{c4f8۪خ Z<(T&}`'͍gBV罚20ǵ!B߹4"dSO0Uz4Yttt0"q׬YCz\X},,(ҧoW^y Ȳe81MJ8ŽːhudI:&VO:5{lnB λv"-4Q:g `F pRRH+W={|vOis 'LE622Ns-#QUUpD9WTi6zZZff5˥R f?Ғȷ,5//DϏe2) >44@`eE]/N40{˅ [hJmC! ^W^MQT%B&O+qTARĠY}؋ݰHR+Yj0 .\4IOL+ (Fa.-M8𽫮DC#g-[*T. "%c>OR/-EabsZ+ykx/T3 Fb$?!/ecjbiDaA /9pA0z𗹤K(ߊ)|{l֭zw} /[lٶmp K/C, >CC.]zȑ:ȉEL&!j !`V_ZYXR#gф ]|&5J@ Y֗ Z!~t2u2!UW]o>Ɯ?uVb$Z\~Mu,N$~!Rwww611w64[Rh,'/qvdd$j$fܹQBbec6BS}։/ F+ ilJqt$?^A0uso{>vI͙u܆ΩjdWEU.^2c-UM`@_v9`2vQG3[z+JU_Z,ۗϟFo-GviyyAxxU&l'ݫC?[2P@MuLXwpxeƻo ! mJ̴a5iSV$Yj 1Mk*R,&̙m'ss=#@?0lܸ@sÆ yg{ؾ};xʁT@ I%H2:Yj՚5knV$W_}իIOK*anݺ \~oNt~5נ9 P7߼v뮻/ŋp (OvhzC˖-[|9 ><].AX,k!o\|P,Y+0RMc pI{0HqwَV""Co_7T [ B i.tc?um[[Uev>/C'N40h82cSݝ6mJ$ٺ01ʟba_c\<*޷oyI " (" DGq)*-KK­QpZg.ƪ @ EGY}~qZ\ЦߩW;ls}~3Es0pqjN {hL#uw{ H,E -Xhn ͡6ԉ,b^}Vx&! ԏ& ^2[=:D'Esu]_8m $>͒ȱ &s1nxIqyfD:!fQ,%go`;!@@` p6cj G#)0U}GiNI{xM$xHcFTVV"5\4PUUގvktKuĉ-zH4mkkCT'o۶ &MB6Agg'F)X,F-KkV>x =8rMݹs'i[Ú~! M7ݴuVI.]qF*MQl<^F1M6vvwr3ٲ1?y$FH K0xE~cKN7\P)Nmӄ 'vj%Z㨓|]vЁd2Wر#+Vؼ> 6f̅ǎsX8KPW_},Q]t/z&;xZ^K׹gMn~w2tqQ +fG6YEp% M~یy%t02e&bĜ#ɼ3Pk+KIӎZd~Ʊ`G6mcqlDkDzR6 իW?SO?4P"5k ;N-_|̘1Ǐ^z% G&46!>y^,*b7mp>evfl; !O&Gppo{;с J&GH,6MV8G5[J$>qI,]GyuO tY8|95P!ji,A2Y݆mjlymF]p0Q,PE՝qn˖-CL,o¹ g ~l*|yw.\<y z-J"lٲ7x[oSsc}^/ 04QaWWߏ{-XO?EonŨmݺu3zhT!V\;88xTُխ_裏06z=-ā;Ǯ<}zo|%,Ȳ[1m#=^|&+Vt?2MK-S#ΐ#EA-a95S~9%Q. 6~st5O:ˉ?]KWήJ9HTȇohdV9o$B'O*//4Vѱ%qt31BD[[VWS\g^L\55ՔgÖdɒ 6TVVL'OjGNΡ,;;eI篾jwkk8$͢h)PB!2GEd*"K>*dɜim_[ٲQIiW'GEe=@0,K<&@>0;G蟡g3؁#ݳA+l{ڵco(eEJ;,9߾5QZ4GgsĊy…6JGAY48:CuQ5օQiU6\ӧuvUӧ}[dW*1 yOx<ŋ5lɥg'I"Ω‰2_9O>niSS5c:t{Μ+[Z[A80mֶݹB.`D913=gvmCCԯr޶Ɔ?b2k,h>ʇ1 ƭX ~ZI"Ay0`lv*e:SqK"H5&S *FKq{j@,r<nn޼9 VM`먑e+dI MH'kt5If͜Ntv-Ȿ'WW(f3i+ܴi .)-a9()LNxRah"T@,y\ - -"̚5jKbM. #|'Op6V@o{(C RII iژ\.ɓ]x@9IzŊ?pd@IRxE9RKD"DRVV~A/OD;uoXd*--Eq~mwP)yv{x,KTR2dSEG]PѣGI* cg /ݹX& NZ־{"ǦhҲD4>}zX DK鬦671<~?dݻwr"Ne\.w"f] 6TBXD  \LSv0ͦ{R/&Sl@&{-He2<^?R@1<8ĹqVUmMweb\).\GHsx]EǢr4g"1 Q'E;# [ڪg=vX4qTU!zݺu3 \c<VBxqzcAQa@dIT3,q^%K"$b-ClgO*Q̱ڽl>?k@&8nژJ7pG73I$^jHM&#JGA2>>?vB)/|0gYtdL>aZ0y>A=}aęVR}WeY>a0nutDa9% @;AS / aYiq$3*fXHOr8!vCճjDzCf}0 X_%e䓔LkPg29~i Ī8Je x b2y\%VhOXNtH9 9[!.ą|!3 ԬӟI2o,°d6!ާ6l_xPO27R\"L 0idBCRn@iXNЯ8EY ˗soeJ䪮}k{>=F a1[X6YTRrH%N* N.! lA$6 04u;δGH# {߽9xBWa.sO=n E2{/_zqowފY89Lbn(۫7Zal~#!2/=^YpQt7LG82U+W8`Yw0 CTim&ɪxRò(WldyʕLիW kpx<+|I`7Sĉ |ɳg?wъzS5 .)zkΜ'*[M(W|eB# IW|T*;67R.T&犀@Xx;@_.p?wm>/]q%JHG9.ܣ3]jl|eF1.]w.\3 O t҉ǟF+<of7k74Mz&xx0&;2q2|1Hq.-!E3- /]fM=Bd:Krld}۽0f1ۺm\Relw3VuG3̤{e۵vyQg睮lV_te+?J{̱tv,4:Eu @k|谮j?bNE Cdm1kNb>F{A9(Œ,?"AW'?i UI!ԬvJ1՜32TKbIjBOi' X,FGGob4 Oߴb܏^ ޙ7/46zri+=/!tVt: <`S `bkvQ, [p{KݎChM {.ws2vZ,Gv7b,lerX* mxX?bƩ=\Z `~ձ;rհ^m犌xg8lLxp๣Gq]hf"wܹszo.K:_Ѿ;cc.FpۥΈ㇇Gx{Yr7o޼yW^y%p6> `kcӴjz;"2ꪫ-[tk'_y<&g*Hgg~ ̿?Y`! ]}d/+C"-atЏi*FJ$P4uqK!E^<APΈw'-:v1dI$ b'*vJp ᄋ&L⤡|FnI7Ng-9Q|d /28ݭ7 (g7ٌ72 ]MeͶ6> I ̶\EN4^"Sb DxW)txiKK_vnHK.ATQoISef)>*iX>%YSeM4:tް(_zXpIЁ1rQ$,(]{r RP1 ףU3 n3ijEgsI-e>aF xN|/G9c0y !h .(i 䊽JP,?TMST\&2S%&EX7-MHR|&qHϋtj chfC/p#$I2sELMҗ^^{iBٸi)/PIڰc.BZ*e3 2sH\R~&ȳ=5c3ѯ[6zl]ܡniHs slVJgOO'&&;(ww=5k֬>?šǜr*=!yA+{:0FˎgzA1IC<'ibg}u5" .b 9SF{lic Y$J(d3YC9T(%QWd6I=V0 b XLt? mZ\rZ]~| bdn: 2,dp^9E-qiA*2C҆SOYDܒ_S&T9Č'& S;6򇚤A<`'߹+2NY6Ai:-7'iFVľG?פhbb‘0ί}O;@\v%IEs=AFx7: u$sQlhm۶9s4y&9U]d $%Ge|ѥ]}@Wĉbq "8\{'C^OOj_|q®<m PSYMNi)hCzK7"LjaMhJF!4C a|U 'ȭ[uFW.܀3'#s\mq-s zJ6NGoAOi5dHPXEJx8r@7::yfWmdd;U.gđxBZv \7"ga#'N[r\t݃;2H=sy8@e9Dc}Ih: gP^v1,#Ɗ\.0on+sB_Bى 4;jm Mr 0>xȾFj ڐeK (AQPs]vOb|~KRʲfP)1>Ee:L.BPWQ:y1T.-`ҿJSԏg_m9oHer@*rvf!JIӋpCX#mxk9<ߛ @#rV[,̊RXƛRGbR4Mq} %FAUxbC)؎ADӋ |\}V}z! v!!1$|B}bqo8Ya(V)v1ؽv-J95yI!ML¿bx$NLFlb(,a#?E$H+%h~~^! d ٧ijI شGc)_[|cJŒ +OXp?F'WA G.=ONaD<yhYpvN@JC~:Tn fe.T*h4pQ:hc@>y!p2GiE]L"lat͛,+B @).[BHQ;q'j~'yh*c)J:P}'2k[Z5RTRPlV@aw :4wU.qGoϙ3Gl߻2>U1麓 F_egQsY0C䬕6{M{ցbyeݏrB^*$o]Vq(81\7n䦒&'+N:M.[S*Z|@2|"E S?jRgvJuZNRVf%ѱb~9bU^z-\P*{]wq؀`a.9v #CL8L xzU['oݷr*%#Ӻsp,zS2CY RDb~?8٤>?`i 7MHQC.;ܹЫM54]w.~+0wVӰ^'JW!kbQ&ص;]SoL GYO2a E ߴ^ !&J18ajۋ.lU17Dz*9.B A*@ vJ6zӋ+\F\1h2))PmO7u\fR՘ 1Q rPOdL@a-4kPji2yajVI ]8O5(r6cL?}1RFqɇ s4q|-ZJ&ˁ K"mSB9aL#IیJ%S*QWn2L[ PZTtN"IS & 86L%w<"v۶[N5d2*i曋/#{)@>phP_T I1`:+D@CV =KDfY)Ju@˭VkN9pd9KW]#k/{fWU8yefdbDD! HD@Bbh U#؂>"mӠ1@ (P[g!` dfy mB,F1rI  rke[ЁѮT,CUJt*i.eB!*DE$-/ 뺔6|Wȩ۝<(?VӴH$⧥&SfѠPDV5I~P,Sn8QV, /3&Ēh,Gfs̙$dM+dlȂ~u4RTi*RR˸pLrɎz3|8&1u1vdrwxX~LB|\KeR qɍ;848|p}-ģO{0-C"T%T~ֆddؐCo<h] G0B^ ϳMgi ӦO~t<^c1 -U ci26`?otcbv='\QK/gCQۢR5j6a3G0"}/0zSҒc&3D5.d [E8HD\FR㐮:f[H42|8sϦIGI8L^N~R<&r8vlldI:b4m3"}⚵:j` GfzI>]$p|8\O7'uww|8:k,|[ס ~7XhԉjDYt"zG\FR L3~b|~4(;%JE*|񇗟s+Mpy))tfSx毺le tģDhANLN*̙j)0 |3- i4.[v%YN: ?OB TA߉]aDIށG>ݻw\h…O>$^u">?cO~#D~?ɏJg8%6ȼ=/Nj9?V͓f 8pȽ} iN% ӽgϞ3<+V&)˵Z-xAw=zgP\\ W2TrLaFK ^9V Lb^$Y3e1`w4!Lp|-,XZ}9(/p<m4T?G?rny?[vn$ +Y a^X 1V1Ύ q7_a )EII/ō7]}>5Vy^V2HqLTaa>$b)_g>STS[2 GNz_xMOӵ`EM B\d2E6;N9ex'} 裏~kˎIIS nA~~ArÒ?~*cqxpy_vq]!?^atHHD҄AՅyْ35uhP@u'R|T %^IPR3?@9W4ض'lס7\o26K3GC|OWֵ6i骬t o}g4QۚI9JajUjF@_lB>fmu/$tV`###6m%wuxhVc[M´~ـGzNT>d:,9ŨdV\wo:s(ŷ#LBD"PPr MzW:5Va!"JEG櫭δuXL&L$Rjm4Z(E1.*rIJLv5Vk B$_]6x 7lhJRiʊǓ,W*T,ᡡ0EUe.P@DT,7M]}g?ޥ\[7PG)mWjT>{$N40^٣>;??e(~T*n_i4zja!t)Mw]"tuflKsG6RJ+[O]}]wn'x۷Ȑotw޾rL&=gΜ +_kA໻{hG* eG๎Yg}< zm!f.x𢋖};߶̪Uk_{ fnV]p/`tGmo&o:N0d; C!fCCCsϚOj0˲|:sI0Vk8^d ڵ몫r@?}}}p޽^x(v>CU{YbI;wB½4=h\>L '[Vӱmc< H s4A9  #$TMK$tcHly hѾ.Ι;yI Wk5cMQa&m-4a_$4[sBhHK[e:HД8<\,Cz, CDZۦ%EIDt)*ӧ_zv@TOYd$D)8~Ԟ0 ]垞@$m޼yӦMxAoBōE/կp e>2Ms]/x+qA @v|{ll oڰa}܆1+~[W_j}b'o[oT*mzRmktVe04a!ݕ=|xx5ث(|rs-E*}zR H}l۶o0+/1χ6u,җ*xntZow[]Q?:AxqmۭT*(facn2< Qpd',˂h6[\־뮻kпxb4 ΢رfYg@Vzh7R8n2IBn˲"IqYFIzc{U~{`|ࢮ"]-7"eͺ,֪eT--dnL nYƠ00f;}t?􏩦oӧos>~E<1r$VX|]ɗnБXX.OiNdrh8'p|4st_ӻʕ &?{?p#ώoy6HF}wعhl\&Yq7*({D?6,\WȼVarL4,bX8fӦ};N̮eY=Fcݺue:^'DiT*.^8xq xLJId/QX2{9@v{{;ʡV+1`L*4 g~ݚo9C4`jJ2x̓O>y-7q;H6@j4¨ - J6Mm>L/Ipe8=X!( 5"|`eS*ÑCRrFjӲ@yv4߼y3?*0([KU#_yeEK/w,[o|;P^<쳱ns梖MYW?>ympLQIm?.è0EEN"$*,J(?ZM;Y}l'tTd۴Py rbYGYO3Rs?6uT4girvƙ ,FC%I ,E~._H&Ϻa]ab 4=inNj ΑX$J-˸sWכ־wN2wΦ\$勥JGg׵~9=+Ù|`E~qВZ58F? ha< VN)A }ťh1{tc#mZyǶ-Y ~&Y8G3a9ׯS4Yjhij$PPB e4,:uJBA^6'GUՉQH%eZ}+[z >r-V?x jm2|Ej.$I* f~K.䛧14|z;;咡 f<ۗ|];9^4,;:$nɂK_(žnZg&,#&yI9}G~lh:zPF*i;#(9 Xw͗_rM[*ev^޼ep$7˧n%B Y|" 8JC5Am&u>cK 5MVH3666eJ+<sJJ&ӌA $q\bϼ  T,lAPp{4O6`0$ Xġ<]9Q_cIdLRU$rU](*8XU|(M33i:ͳ5b^o4{@D(Mu+t*)O0Fہ^z?<44d0&md@;.aɒ%y 2Pĝ3_xq__"֖$GVy\eMU[~al˺wJxmK=u\P,?x*YT)(2 WXV4<;uΜ߿LUapİCsؕj=pnXOC!50V¶)<8{N4*x }'/' $>::.&BiJ?˲5JV7lɦ^9鴬(ҌG{vt)2,Eнp{4M\ysj-[^$ٔ-`ɮ{ Z̎(h$r\M#})VQWa%G)͚(E:]%3IVʛ4 㾸a2\_@ `lɂ`Zoo/xB$& }yof_IلӥumEX:̘1ix2u= zXo8w߬YDAhhJqAttt xWQ(_B&h8]]Y 4{gEWU4- HMoLE34Eb&֖/hhWXz<֘Hry4B9RM$B"%4Z\R%r ;|3 :F Gz\5ϸ9D(28E3 %*& 8,5,vv{Vպ"Ѥ`>5.bܲezzz.g}Wviw;wn__cq%M3eS>W_ ?ɏ~cx|hxDUTX4 Comu] }z$41dҔާKVqA|mܡ{ qϸL&soݺ5p|;gΜ;wBe[1g:x"_6|]vqW8thLMIΏu)'ޝ'Hd߾}z EGw -LD |k!3Ox?tww)JZ-G"pk&6nmih4f$9SpdA6}}b(rF)1{V^,4n>t1 5$/Y# Z[[qPQ7* ,>̚5k0L?ubhP/"3<8拒c  \ Oʭ96NU9AQjO m]#3d_DOY0}8gWuz-F4i4t%*G'Fg=LaJ(L$ C8#m,C^>`Մaj|ǶcYoDA\xܡAh山1Q;5+Wjxyutt:H*Ph۫_9Hf4Mǖ((*&xmb9BcTIQnDf\dn;1%aO1O -muM dX9[òE%Pnx 4xyƊ,L3iDc)AZ8nx~ n|b=TkuAmiibgvA <_@-'+xwر~kv:FEs(+rƍH /,Z( 9W*n&OD(DP8stCãNܴMrjDcJٶ%k(<ݨK!kؗ79lP5K7b<$fhd4 E,۪K lG`آHC9MvJdD :RFۘ@{c:B># +M㏬nplбOy e&/w?rY:+̬01,l3cX FV$~ $X]l66 G1>a<wYYy~X ^hvO+/^(HOX׶hj% 3.t{ "ąj㒨 ]T]p,|1=Xf<&`e)!C'Z<匝(+byme= ?OB $;q A I*Xߞ`E2!$b  2]K|.V#̀-,CeX=RZ"1|el~q0,fC(_}@fX/ң> f N/r9NF: W)h ֠cZ^N|,JN\u8mY˔I8l㔼"^yu8z'1p0rjͦA| )E54fv yh:߱L7'Gsrl h't6ôM0=Q feⷧz{ I F=K}ۛKJ=im ٙnw)I_{n%Q'&Z5Ԝݿ?z)tp8tҥ;vdd"⬠SXtNUőI2hVϜ>ͅf ]CQo#4J 3 LEF 'd:2eA/Fes J&8fG"}L 6 29j*-j;hM.Vܳ,lrOv]dԩfukΝ e91>^)K}BHL0=\c%3[̀zV ,' k-Ǜ:"r#˥3nۅlF2Jw;>cDwiowtH<$%9n&.n'Vb"zJ\pSiajV*D!SaW,Y3K7})W_6U'j8 5%GUx>D" фYeI R6Ӈ'L1(T|:tȔe.kD ,D0!B8=edl.11]@+I ,S:$I$ӪbYBQL9{zzx2/^1}CoR W181q6?O=^_r]v>8K200LTyaϧw}i{8xݺun!8P"D. A K@*h԰^?qtڵO?4=hd@R jHMYb(pbAH~8`Ӵz6 f@u]Gn4T]kϝ{ɓyWmw{~mUQAww:66a[.v.;i|4w\nhJ&Ue7۷OJ}] c[Hx_q]ۉeXN^[f[㱯O X~oו]lm/YݥeZ I:=Vt,|wnGQO޽?[Ownr[Vmǎwk5R4,b5m(KR>t ~<{l;w.Xx8QhT˲oawW>$ՊKX-mݪv.XXuG+O B.o']]]t?Ri EQ񸈶> :xplTnzwcU)g9e͛Lx}mzY A`mBEs|ֲ!e1,&VUUY`jv^ d1ZBMr~tYFuxd2J.)IBյRSm3ֲLS "DΏ&%S̔33gi?tgZ͉.$z'}ٕ+W>/ի 0NA4MvL@G9nxn'ɟ( 8྾:###dg)JZ>QݶSN rE^w4'N*J4?އ:044D|I$Rëw]9KǏɓ1EV)9_u]yɣ>6 E!殺zH꺞H}|˴[j0(.r7ӝKZ߿uް~߁-;oOb!' xjvE VryǴ-c"W_ %,Kb4&QhK16j/Ju6YirJaoO&9.p"qcϲ xd14ӴڢT(F9>k.\9JY;Bs!B/sj﹊'zMz%ARK=,}n6; =zY1Yp鱉B__<Coذ4|*Y |R>qF1y/D12pQqpGQ4\T*;v.5p(LLʆtbPy#Ɖ(E̙=|2(RiVN9rd߬9W 4׭[ww+䆍o.[+l/Tؿ`BJv ͛ϟNeƑO"etV(dIQ7ݮt°;1WG]9rd-?׉5yga'3u޸q#<ʾi&\wx\=|MKFuS׽y۶m7|s:.T@s(c!!cJ:m ˖-xm<`Fsbr% dY;vXj4.qmBwq*"DdMjK6?9MLÛMMoiDU ,etءFj֮]ۻk.tɌdB/B01l:(\bqxvB!,nuWQ@L4% 3v|A3J<$q9J \\ gA70;ʤ2>B3^ms?/?$Zpt?TFz L &3AUI[r 0V^ D-htww\om JP&JFBCk6Ȇ۠4E-=P!-Kq'KUWֿ;seԶןSS2 % j ]: dxF~."+}ޏ#0[,f1PbD& yY yvg*gGwOQ9tHRDJUyd^JqߛVĽ>^&/K>;zHPs歷°aN' mhQ*GjLe +޽S☖KFP,!B\xM0bxtn!]2Ce w" _ѳj?]iTkq$@B2Df BhM P hDBD k&a&dCGګ\.|~N V#d:*\{s{}w1*G/TUŐ X|g[nŊ}ٲeˢ70 010,9i92{ zɧ{+Iо.+sa%QA"!9J*Qj]Sgs/>la؊"! A2122U% Lc6adeV,'zTh4׵&&ON}}0ݗox>%SSj5lDFGNzEV)b H 8 abʿM  [0T*Վ $ɲQV0)0K+v@e ya}712'=/+?;x A)Ћ.th"o` )3(-\]l? ͮP*&eץW. ӓPkΰd9 4sDKzNwhh4s8Sx,뺕( ]7YdQϷD]A@ّR$κqyȣ7 9"P^&V3G/D i4kaMrȹL:;TeX9&v֡<,ێ)7j5:@ɻ=ɒH*('bs|brZ1zڦ&mm+ːG d ~ߑJf'/.Wټ(8wކEj,&ɸ  ].ujB) Zm^XLi#є. 0/^MJJC >5]8ANZ$Titʤ YٔT{sV1Iz'uӕd¾u .Y MM@^tNm4!{B`r uya$RF/wOzғ#B ffy!89OpTJHzftZFa(~F˲~cYr?qg]56\rɆ o|7P o P,d ú ЇFפjeN2zǖbBװ-]̺FKg^ *GQ)EѣV#JպԎ$}f^@^p11ӔGc0[#2jZ{{6=IO~yA0 :ėeR],gZsR̾>6m€u]{Yp!mcs={t;4 BI䵵ڦ%"ERӒ}N^v_S/߼enr);**\zw}7ś7oN+ ߵkK3ǎ&|.Z ]@,ǝsk׮M$ %7fqmYd7|ԃlFq=9p<ph,x۷ j\پKi\AKiL,&$| :V(458%i4jCCCw"z-Wf23.󀧶m>4t]:眳7n855EZ(8<<]מl@p8 5Zb#Zu] / `~FN)NH4L'+j&=2XWi`Osl*/wD,m̛.zaB!@bNU(~LPTaB#`9M'V>rHŮջV"&dRG#-y22QbCɒH5\c,*d0=* %/ ,iRg(rz >&.XHHT'$4YiKԠ? ]mj5ac{VF5Ad. mIOzrG{?C :B^m/d,(iESҥK}1?C$:aqS!: 8B?w#?JѾXRL#@ oC"^NO%-Cv"ǿF-'z?_|Fx,&10Jñ iVYK9%OQ?C}eXvݬK@,|ɧdqDRQөC |o۶m$\U#ҫ_Zzr9Oo\7 `(駟ƞ^xapt,[o<}n6'''ԏW^yBۚQ)O zr饗(`tԀ\)իo{.pW̟7ɻ4~0~HSw`K1GB`ciЊ`JO_b.h- ͳY`kbqP{F("l}wy'~`z?p}=o&;[nVF#&#r x; رC Ѥ3d)7k͍YĴ۾ @IL#7ɽ{V͛oV:uܐX#V`DGaCxr8`@F!" "ᚵ|.e(i6JlU|qq8",\g>Col###7(~b7@p6н7x4G R@?[ ÈNC?3#,Npll шW"(7ӍN>/:d X+:웪Jy^8T}#T$!yB t9OwC^]YRݑjn:L[P(cS}ɻ#l6OT\ٚMr1g?@̾reş1L7Yvٻ )tYYe-U] :*/MCh8c(*}1bB /F<@zqQa2 ,lhsmz}~'NL۠>uԩNYvX9.vlQ򊒇e@,CWyZ0 %o[UД$:2) vJ LNwDױrv .L:BXgٸq#Ǎc'xbҥwF jI?w<{IBɫW޷o9zԉ3f(L@$1Ue˖+; 4(eHXtIq7oZ#ʞB)L)0ak A(JݝH$(xJ:M~W{{1m4HX賡!jFO/B윂 |C:2u%dO5r@&B#IfѼ}:t{S$Z4FjJ4"s%#!h ]^`:H["Tk;+Ƃ!fbgΌZ5Tj$"\JANhsb)Iհ%.Wl x)5|ڪ%ˊrY1"Ӡd狦%lYJ)ڴ, .f X;/7Únu6GƲMhh(A)-1ǭʑ8BhQBK,QfW:_M /=9R[[{nT9j0HhZU4Vq_~-#4@0e@ @t|M6A#\|Ϯ_~۶m" ^ np'|0ؗ, gΜI9ISN͞=3gdsǎ(ħTHV CCCX3E^aoMh8UByĉiӦ>|#GΝGtر6N'4-HnoX*KUïjPv#zo7ήH1- YX.7ONFc&0aO>>}JY R$~P { 7+ʲ,3J&jmi1kFP M5i\x:gIbX Y\"jլ-Mt! T3V7\ H!90sjj,˕bA¹SM qX*0nY1&'b#r\务PNDmj!&R~x],5=o$,t[R̰O˖V\ɣCbXіDt(eJ,$IsAte*Zdfn'pH^pakk];G] @\29e{4ol.Zw3-^.T- *H4+UBG<pC̘1z饗2t` , My:J%q01YSxŴ1:3:4KWе T:::ęL, &il(w}`6;͵kB2<} cpp T '#`Η_ rѨttlccHyl6]. ;J##}7x_=O*޲Epoǘ+ C}Ӵvx8?k67B&M%(kSo9{l.^t裃 t^Y};3LJ@>}x6R`,9|#۽G,{PO988Yb"KK~i8Ԑ-}G=z$OvT KN'K@}4Y&y\nEit]vN-ט#%"K O8 _p'PBOOώ; )x0~y_N>!a͛or/l&KS2r_ 0΢ ɒ 94jCіFp5,K@pi ԡC_t/Nae((Z):iAE=c܄Z`:XPVnJy Z/-\`$|]0yfell @K,Yv>~/,rҥS[0 b0w((T;J~;/^d{&d0" [ mYaU8"`jG{ZbOuGL竟}̢ >; F:Л.S %iEd `Ph<˱f9N!oG/:bl)9zT:y/'u >odޕQ]ٗ{Vf-Y{W[8q`K^`,$60KĀX>"`~DC"Ҁ@Z F, k̪s]4X YE]V͛ݼ<~dt°+[uaqEk?m7љ3G0Cb.T0X- ZS۸q8j͚5Do%,3O;=KLɤ THK.25&yz1 S(>_lZmYBGf̥*~E)~ijzz:켐N6Z$/~ ϒfsYko>;)^jPR-< `86- 2_LǦz,:9"/)* @HW`bx~'#&ORK u:BFxUreqHIDc 6M s6lfxTђԝ(]Œ0Irɪ* H%a'A`R;S"8IU2QOoݶv2Bɹk?#/ʸcVda/Ux=L,LMW%afuN0LbŊ?z 3ߨ X\+J-'1%'$ؾg;^h .l8^l:;vzC ?=w8-I ۮ߳L^Zj[$b dG+s3ӕ3 TCŌ"egT@giMye?߲e >wzp娬ϦŨ><ccc7;N1zCY[u={v aMuaԶ{qRL /kcE/"0L΃"&q7O:LxvѢ5.) /@y@ T1xۯ@,h -*6O\4Xli(&ü, =NٶkYe}rXȋ'4Wjڶ9==8,' C ;/!HfYK ,g(~)(. O&D<+~AXw?G?9$L_t).K˚=cPw=JJUճ_*%L]4S;LR0mg8FZ/_NӀ_[ sb^udIp5k};_ /^xE q:D8o\tcr)V䌞[,f*[> 㡽{Z ?HzSS3< kUro?cb]c+WL*)8۱{=_IaM8.<|bVgg5`yV4gEv=˪|?tEv.O_߿RI %KD#&i4BK7mt]w6[#/Ѝ,h uԒz!+|a.An=a)nZKO~X pٓG,w9?yN, NRI5]|w|! {1" mb- מ?GtczRMi)q]Awы/Ec,tZ.l;`xz֕l]䘞$2j6]$ǥɹvu9G||fg{^UktDYZZ#)/Pm/O5;ͼ~հḮ&\t3 +4Uum9sjݻw;)ү|DUٜپyE "yn玮$cZe6Zԫ}t6ꛚj.-絞?5*I^hN9Q0ݞLƷ? |cZ8#װ;yD0L!f!7b X O:_W9SX(榧E@E>1V~i9iC7n޼X,^z[n(B4MJRIBk rQM`>VXThɌvC7Y,]cms<ѱgYjkI1- EU7 dV20paKK'n }%pxO:}W?tz `ĺf]˛mwuC+=V".Y%XdISi(2}3 |Q Mu,nN9i*f*Y% B b .wG1BlVfѡ3PJ| )@6N]\7Mdu pڕc{lQ%\ul.R#= 4n. cagKMָ2M7I| Z*1몗¡qCI2!wpj-drՖ%ICKyB1taQ\IJL,t&`L7cF#u=hmxӉF h[HjQ@n2@=OZI&=ʤ3e6al&*A}xqل185\;'X -/ 7a,cLb7iRŧzf 7}$za1Y j.n$BIf`4%10Y߷m*i#uD,-0~p\8sX0JO&SƎL]ahKg=udlyXkyꩧU(_wuO>$9M7ݴm6߰aã> P ,`o'g;.ۼy3UY~֭[s]駟a䮉!$Ӯ@z~+E3,o:iYɤ'RR#0ԁf ?#̡fƝP &{] 1J::cx]s,F3A,xK^ǂQ7I8\tD+ bWЈXR-JL2Xf(ڲz"KzhGפdB?|M8:Q!!T$Xpzp2>ip0.l aΙa^әT6~\.!2  oB#2j!_[!@`y8>9>}Bc-ew|Rx 0Bn.YU>)[yf<A$,s0Y&0GGGa?}Yo \ydԈDRI,BDLjznpY=\IlY] "b:uWk qm lr,:9^,`6>\b8>NH=j7 ,`u^8r,5TcZ bZL۽,$yf{j%Ljj1[*Y8 SUt+Oʖ=}^W/X3XeB~ 5զϘiwG u;&CS'\Jmk<,[:TͅJ4Q ٓD>;53;22RWuD.1t@XH,IT$Yd'{3 ЖJ֕ ? 0R#~yip(L,,S PDXgr %p6\ܱG0 .|FM@ $L!L8w8ݒ_$Ҏx1ߗ`Y=ޕIQ̪AnX@uq bW 7ubAK@Za 4tDSJF8L=R`((зp8WO$“J`hSY]_v#ؽ덩d&΂Ū՚lFj`Ǒ7{>_PEFV%Pjl, |@~-O^%ܠ^kDPNLy9l 4,x3xhЩB8(HYM,d6,s>ZģS˜ȩO̴Bż$|ΠP<+滻:iZC߰jrl?\ĨxEB9'GѲ XU&H`)Ce_/.OeJR6 Mh5nOģ^o'|p (L___%B.`DOO@I'PZBTDE.QwK*[_\ Ƒ`@* {0pEg|Ѐ1c2+#ND7sJ#RkZo֚)SJ~?'N}{غuky˿?۷R)߿6{Y^(;><TBggww̜y9s{Wh3Gx9xH`r3U;nyMP@par D,jXAy_z|)[mrV#q8QiE\fY͠z|lcK# z˃Lv%j4R6˦\ˌޱ1ɤ/Hy0t2b$X#˲q4nf)(bccVjTF(IC-=gxjxߋj_3*l"g<VU'N&YV\zClPdhaq ǎC#QEQDK,G<[j fa`ac K;ZC ^nٳgt٪>ÿ[lYbܹs%Ju B$㏱{k@I?|R)\Nhܸq>B1 ].Rph@W_}(|ĉk?į5k ,J[[[ǎG.\d`TtIT Rc"a*Npww {뫯W^ܝ]sC=%tZ. ‹/Btu]|`0n~냊ݕ7nxPi__f>|D _O '(|H?5jT{{;Qzz uŋ]bQg4֞r7p;]Hח[-rh6V?Y"3054đ#GƢ[C9+=Tn؂)5G1 :D:󍿋h=[p3 Xʳu̩DlĈΎz>TU!NN$s>SxrC)U<֢%xp[B P|B( f ǍP^d<^ S Cyx8KZ<+ @9hheM>|b P4a,Vl;{bݰ{<;/޽[͛O?p8W },f)cmRĞ={pl=/?B׋ݕy){w>ՊK,+V&>nܷg/?>6lXrePǶl񍿋F P޽_SY\d1xn)_kuơkᖖ)1 ˖-77m\ti68l ݸ~Ê+y@8ŝ;w644⋈F,;[,AATTXm)ԂnH Ҍ-9Ep*e"(|̛E6g܁ԣFq +F_,`ŋ[^yf`ѣG7mڄ .AB~?NN:ȑ#dĉ` "EZBܷߞ>}đɓ'p:+'L| K.7|3#L!~h]P{SW ƒ' ?H8@7p}&P:B$qp ,NT|4]x9LǞ}vǶg+eQ64jXH@ ;8`J|O>UZQk֮]ko\I`W߸nF#4ojbI 9 vڅB[lٱcu kJ?0P-۶n<(!TBq|bՊaɒ%75Yfks&4:8NJ),yޥd,u-pUF@tT(lM8ģhڸQ\xe39h%-s;6eS!k42h(||+M~ɲCvZ͂iH *$XEV"roA'~? 5€Kr2y>|ĢEl6۪Uooz!;E(%)Gդ,N#i;E,)\uuu{aJXr9jRCCCcCd ܦJ+P)H-PiZ#Hr |~/fpqܫ(*(!  Xon7aˤV[[ ,vm֭۴i p%KL>7Rة GgCޙ4 ,pTJ[\ QFIAq-:t} 8bRa\C /mʔ)}1by}4J1c;SJաe '8/ҷ ntwC B<_8>L rKK=S4C۷Eِ 86択^oyƳ^g\Q 'W*.YaF`N6߸qZAՌ\pN qYNbS R0ݻ` qA&ƍ2yvG# ,Ozc}=hQo]Ո8"([=I հ e)W> ,^r>hw8:::y؃`45^dVԇd"˲o;[}^/ :"KrbrR.,ЀhA#ѸN"Suzr;h4_^{r$MR:7D0`^˖-۱c~$z`wΜ9/-\R}]N:u7Ft'N 2 &`bֺm}>n5ylTgN' We#dhx:tTvvvʆ߿T*]ʞMQ `GeSDKǹ.\ GU ^W__(Ӹz- 0B zW7V'x܅'5:-M`jQc8uq`dZԳ%fR 0glȝlٻ 9|YCJFP6?(*Xr*HJ e! l#ɨP* T *,hW33w̎vXXT۷ot|c>22r6.Dp =vի;::a*zP֭[w 7Pҷ0,uÇ }q>`VEO^ud4`x^"M!@6)wy,ReޒqSv|A Jʕ׏>7nB \Cy_ٹsٟՃ6T@@U6{mI$ Hx81$S RH]o6߻B6A,f1#?ڼ(b,"F~g4w:-h?^:;iZ,6HPm۶ر[nyk.>`*d$뮗_~yÆ {ɳ+d`_1T*zS ϧsbs/W.Ɏ{f%v*8z[HWAReġDN_{DNOOV.)UV0E i{2[6專|Gj&9)=xS)'ӯ_JյW&/Ռ%o>~r?XoXГ)8.>\(hqMgH+駟 `i]kT+_%cໄzXhT*K,q, 4L=%x,_Ж{dgl9Jb;UZ|XAWB ܱ]y5MeցւRdꫮ/ߑ$Xَ7i@? 9::J> Pc611>4y! DٵZEw] OLb1DhwxH_D&‘ݩw3 Ol 曷z@^6BFLڦjg``,F]w\Hpn ti%N*!۹wSgtih]3bc٧ۥ I%|0(l9ON԰/-$mSjpة<.ګzs2)ΏMTҹ  U{F:=~;c%1"F_L. Tt\"Ǧv ך TRET&Mm #͖/Y0Q0̖<8'f̼^)eݶ$F1IƓ)ٺm -mUAeѰZ !EwTU/vP̖Kz- )-]WMfw9f` 􃐩k s\OOMSNTq6z&A'DYhp4SLsD"ߎσסv,GrN(w HJsV떑ro'b %`@FiXp`9ƾ@!N0Y:{|' E@tDGd0=> ч~Z"_J -\s ) ;,dj޻`BV.y 0%(׭0?N Y91sL@ӹ%YfQngD Midy±ӍJf)Nb3F.ϘIv9͟ P.L3]2tBu,/Kt|Dݾ0US?ƻ,NPx֭~ꩧh/`q>WIDw!Kkvbž~%ՈQ7M#Db67@dǒVcFsLD> eai4tN$y8/ g+˘{kyE"BͦK<崦*R$qo.&=Y c.0eҩR "s>9pOZ:*.*̵j:^;hc 93ǒX:u*d>;1]MIJ)dDˏcy4\KʤLʋ:>,NY/_U;]*[+/ei˲y}KqMSUtF¦-<o]'eR&E^ I #E;0& iNtpc8=Ic$1OtKx!;jmۦTxԈyp1'쮋]@V8]PNڋM#S0;cn2${I5gʇbN+&JTvN^6 S} )\֣{ȦJGg?7۾^zW"_ȊX,YDmz]#7/ ɓW%x%Yl59]m{.r6s;vJm63$ A ۳uj(沨k4Y‚Ke#+*Fey/BEL^p qjTõh`[:Ru%Q9ٱP̥5EEEV.鯛,2i:Ub]WY?GgCgAmC-\II .m;H~q1z1? qs>_5vRC@IwN=y3iۧdSt_XЁZtfW ^ŢeO?H؜U]־=dE7'E.noۍPꚚ}{ysh['$Jǟ+|E cUwl<"wUͼH.lfOlvMbt;`ǵGG"K KϲKJ~%b 1䦔7.Lb -(* %)d2 2I>1*dZ#DUƌlI})zG*?7Q >?P$ I?#hbӦM;AX 5ԩS9ZYATC'I$jt Ie˖i(?x .N!bwY/Ϡl<1 J*qa']mDBǒû|]א#N /b4vLi&-lEfbv¢x*[u$-<#KN˚M铧vkZ$N EA\HYM`M<N"L~1TFЭJKXFM)5 ׃ p\P2I>p7tY@ (**= A 9eʔ- x3wC,;鋾|EOɁ&.\x)C{ MGe18]w)={H}i96@4 fgEݻw˷n:y'ONCCO6ZBվ}wqW_}UUUPBi"5O& [ɿ1 #_Udwu3ƢS_+h@]p!MBUyiE(L)SnNvi(Zs]U-@ fz/%Ӊd:r8!ޏlg!2pR;4R2o*+CbvȞX2TYnKCm6&QÒѽD<[~[<A,//ǨsN˵f͚W^y/Ϝ9Ccwy0l={޽=`րPСCLv4iꀤvtt@99춷JO>3f?~ Эyb’ZU`7w\L6@Çqp~=6466Qa̦!uuufTO[ߣc)!h&~-[d9TƕV $)մ&J*hffѬe4P[ (|m.-0%*ي^([9fG3I2"o4=zW>Fb!7ipVJ2~y`'NqL*`` Mm`)ˉa4@߹3 "NnD"*ᬸa#Jڍ!X,c.?eMx2ev+Zv[iri<8es$/qaH=jܷoM}]'0`!2B~1"@??BCnW:;]Lh[%KCbc&rL#yɎd^NdqY~ R$ewQz)B>ŋ/Hq|MG׷~mݺu(\z5%NP/ e eGGC̙k.r9s&&Z!7\{B7ݻw֬Y0lZKM!jPENON'0444@ |D{ BOQ]4M ̈+qnSߐqo1bwhY2Ww8Ԥf9U cu*꿄&}b)&e3Bs05CcJmmn>f!xej>5hfvHg^M63 RY4M*sx=ЙPsM;'= ctnfl>ߺҾ%ౣIm?LV适ۛE3Po۾MX.^w;KEhuy,&>?<ːT=L) Er'C 1W|0rʑ<"˙#[F8&ؐӲg'jY3k %udG_a` UaTM4p/{嗙N^A#ZZZ@[׮]jժ7xwݼyM/^ }A%5/(m0vٳgΒ%K.m2eWJrQ|@帪ښ6mѣGQ-.F|A;Mq^/470u q\0uNC"ߜG!>4byfC~A'X?W}zĉ}ݷf͚u1 ⥗^Z`-[f5Z%.}}}pLg|F6KAH6JBPQQ `N|:q*y`SQ~QB|b;R$յRt@UMM޽{tG&&Ot?fNQRPQL~#N,o#Mгy)tF5%y6&+O`4!7e0̦3i3d5lwe5IǡdϽaÆB9L&IQTx drGjb!wб,ϢhLQYcʑ`V`t`SOK CCC _=쳏>;Ck`O7߬Zw 8uǏvuua<0ԂݻwҥlжgΜYd 9KP|N:Tr\gg'bdPsܹmmm0@@‚Y{Cg8'Ǿ}Q!97E/S UB O'xcyMh◷}5}h2mD.|ϛ<'Jhw'dQjMݸ&Azmmoe-DBRg;aH`_'N$%v\g_0]PsڝW]ʷ<O'xڃ\g,;>g :.UIx&-iu`e`TXDXҍw-'0A)T ՕU6T,brzR(par v%XKYQd~=cc0ŋ ϟ?O$j*0{||~u\ 86& % 5rwX4::PR"Ĕ+4T%,1c.*㤌:ݘ={6NA}  AIõ@tgHir/?{MO׍$Ȋ;S1% Z)Ltd6D7PHb Ha*j4-fQF偱RXdمfe 0P>04P,%DnZ󓵝X*r$8@뮽{j(a]psȉvѢEXLVիWwuu]1j0K`&bJz`*Ī)1`Ρ9sD#zPwܓQlN年~I&9G+4E$GM,99R"=t0 c\s)=wI+*.qٳg:w]˅t&PaA`l/pUy1[Z\G&ar6HUao VSk7+`@˩sC-֞Fww&_iuKO<\78X`qà 9b_1Ixyڵk׾ f!w֬Yz+7΋/lٲMjK0qԕ̫حs %W:L'\5b JaIݝU7:MOL dRCt `E܀-KDa-lq6{]Vˀ=M%* 15MM^fυY`)C]V4Q3uC -FllĂ|C[yq %>fNmX͖QR.I"9fֵ* mX`J&MfӆYR|Z=_B":c%L52cǟMo~ypMҨH1Sؔ &xr;vl(T(!A1WT T*Ei21*Ѓ O'xzviȲrahLFAO+X ] JSUkS8sx;T "Grd,H}L4+>RւB`XPX!L$#rYoe1*%%Eȩz[ E~+tgU)U>zOsm}Bل֭ᰲ|Ǐwn8tZ%nS_}ٶ XNxt~5Fj>{F |o?q/_+h4H$&W37):"=[yW!dw߃qx:R `:rSK\$"}Gß$b@mNS+#ù#^%1ج7e3||Jbp$$-5Bi3aL峹_+B‰%0??<<<#/oo$_&]!UCdXv&0Mr%XZ=ׯ爦_Q0XXlf͚S!ˁ'*"9ELBZ<̓LRwsmٲeΝ{y衇4q]nar."L}O '8\Owt0yFel_7 ͹iŁǏZ4,nmPŔΔVkUjQTIFUV;SRY6mT`/_|yX7LQmX~WJ˕Yat$Bj%XtaEouaOOOX/-[bX +mplotww~ϟ?uVW{Uo5# TU)f[\jMJ" E0Q "<<!vX9ߍ1y⯿:YkWrW\30ooOΚ5+W(+"Jһ j պe;;V77|S%Mh1,[Ф؞LY-3q&suy믊E1 XQOv]o=S*UQ?gDÀ$ JRI}%Ҷ'CbDK>%pxj h(ܕ 8 W~,NكcR>5 !rb@K #/劦A6=f0#ڧWLt%#s`2)0Sg`;w`JÀ)Ms'Q5JAncʷDαijb m=:F1BF9+Tbh+|frSzC6uNFXʤSWQ7޽6f'mmV0:g7q&DP7'%,FP¡޵lCʵ"(D@ʢapetEpRm+SFjYV\P.K’KA[uC%Z"JjUka- &h1XTKDͦ)fXE"02#ݖ-6se>h4FPdfK,~XlE::K8:tu<0,3 Uy.U7r?%_B0%dzg;ebb4t$rG˲L957JHPP@PMQRdbHI zm%IB#CMvq-AN4CCC('gؗrYNL}VO;"5Z5?n :3}ݜ9s2 {x6mooqptXGQW H&Vm\~ 6沑xɓ'F*zkDw~ha%)K/]rC2G~K|c(-mm LNg2T(Ig'so^0Z?o|܌?c܏qu}}}l-ybwq0wC{alO>Q6HرȱQ.jb0(b._Et ==~o)hT\niZ˵3;QSJis:A,v\e$FbD(=Gu{g$E[YUTeU ؠM BȾ'<``jj/>3ch"8-*J Ku[feUV bF|S DGV{l4'&1΃>IJR)"cbԯ6u۩.o0(FQ90vrc0FIRktо `f.ЁnM(Op˲-[߉ nT.Ϙ9SzG'.̟¾5M,j| Mw׍G`Sx<d4ĚO ,' [KQ7Pizoួxk2 |Ͷc驸GaUEp3Y뽝uc+ Yjz3 PP*i*# |x뭷tF 5X N8#8rH.gh4Z6]t^]@0q^t6p<44488[|'']%9sI@*dт8i4Au7s2&`\HNYfo;ĂZV(atK3 .\`A?WfY4X@9o<Ѷ 7lim5 ]Yq5JG|'}>/^p9oܘ Qa d4)}7[|"]7x,* # *BiFTȹh(V {YM8^zkDwO(<-vueO"z~d4D_;Q7*ZR*=OgF 庢ʢ(_Նf#~o,e/Xe棏>o\z5Jmzo-{xم{zbwף%UMw!qđkBtOբ@e'p'"MK 0D]۷o߱c@ȑ#s%g*l+9M pWzㆯVZ/P䎜PAN B T TJo?}|]JKA(:UUoxxK.}q?@(O.S_Z)l Q=oOOZm1te4B@;h… 4 6@w^t<߭D~MMnN[`@-DDgF]XQka/Tl OQk6f (nڙ6$XDC%xLKQv3U}f͚EP{̙@= - ?Ak׮%r6m(2@yc|z{1u=_~Μ9Dͻ뮻A5r- ,P`,_,7nBIA+7o^d |w ]fի}LpJ[P MppF#` b<}Q5_1:Ss( Z3fX,c\LQ\Abm5wFժn:,,K:NBr41U,e|51CBY%):?Gse<$EQ TΛ2&ͦ[-Kכa5 G_yIGys|nXXGd؟NjzGG=);xit{AG'Uf;F-;W(ۉwG =a PŅq`9.KQJ u4/O?: 믿O:E>(066,+V;v ÇyQ?psxxxbjM,]СCPtN!zzzP zvm'N@ٳgO;p ]FQfq XJQO%I#G=3f8s -~(anm)'?s򩃘fs<;wFǏ/%&'OĐ~'8CQ}ݧ~{w^ }G1%w߽{7n_|AnuNv_&N[K*Yrl3.iD4SB!%]B%PJuj5}+5M1 6+r.]I$T7s/%"ᠻ3h2&ʱRՐXZmW8YI=ZIdpHxJuWE';ㅚ)د xh^a:MRG4bE/MF~mdjLx'&2qn|M}>X:5QnXel54a ʚWo8ȵ&>Dd,>NU< p?+1|u `۶mRVvʕ+DCCC< ~SW_}J,_XNJj>2|T믿)؀]mSL&C qLBPD"ApRɉ KDԠ:/Y^$G/PV Bat‘GFF/@s/CP+{ G7M^uP$ ;団VQWDד<ӸxG<ױX.Fw-mI<+V-)+UV07WH_Q0YbI7_b1\6}>w480LV=ɒAUGJP[݋DjZ`Ƥźx?L* rG<`4,xXM4Kj3,83>Y1sV"V Yכd\kǼ͆'Hvk U5UKaZmp E8#W_"ey;S-3y_sJq/-ZkNl1̦rR*d,|+MO˒qT5/ay0)#VϤ;VXhò']L#R7ZJ1-F"!{nEӛd^~6_V'k6/.|pG渄{ApO>$ڶm[4}xݻw6lݺu+i/w#4$%OPڵk񉏴ז0%AbPCB1f{G(3b'(Erxb`(,Yr1ZJhR?rݸ0 3 J:K𓖵ǏV#:5k֬ĦMKrP 4*{A%QKD5/b8ycqYio2w0 H-[DveGم~5*reg3m8]LJiYlƔBLnQՙVk U :k5>INOJ%Of\jq 2D/+Q9WY5,]-~;;>,VW|t~" dPTb,SgP, % j4rRD 5TKeWp#8r5g͘1޹zW^yEUUW:s΃-yfge:\KKnf;A6{|;00ev P 7oJ6Vw2>|0'(… PoSNE1(tRٿ??Fq+V%G=P$~SDԅ78yo ^Lt ҪOTAL,x<| ?>+{z(p 8bjZ5 X Gs?zI[RْTj8ϔXD|WM0G~Ue[rEgȯQoFKp>%YB,Zf+RlV(^V dW[6o\ӚXGqđ:!ȟ |RAQΝ>>|M\׻uVJh!k;*r!]v1)iڞ={c{7500P[ 5(2>c6pGۑGE/0>QC;m:QŠ49r".kηUnό_<'k0C Q  EBQ(Yk~x8`C88{^=w:=嶰5yԮ֭S=uwp bEPg.s #~>|Sp4944=;Ir>l9rO-ݿ?955>_Ӯ]%Lu/o*aXؘ۟;>YSR]K0"ɖe/ p0۷嗱R(C)a (?>t [1 s0^r [4^1 60K |`.]@mtK2Sr9v0%\@Ay xw"Fm 2'0O Ŏ02#,B:ȃU) L\cr!K#.-δu /t`f@t]\C<̘xA\2ɀm9teп S/_;Mupx6l *u- ˰V䡇{zzvf$w] _>,A?|IG'^n\neppа5k89:W{preY*d:0neڞk֬ٳ{ §G[ҰϷ_CR%G>A:*=O>$07|Nn/Xpcǀ`ܹH^|E[lyGy2]?{9>*Ç=oFys( m443(\0!85tw3h0 1™t]ǚ0+x}%(V0sLC l\` nA (,y`T#c$ ܡZ3f3zMVZ ȥm%c¬ÿe-3ˍڵk}xi&OEɖ,YrرkL/z|,X mSPI q:FAcb_d׃0Yr6Y 0Z + ~3T&t4c%8`#ggh Cuv=?Bg|yC33 |OWX&Ke^nT"xx_nX+zP^U-L2566'\frDki/6\7jϘՠ.ZaXZv lX"/0(_RBwn-aqPw:ͩ\.+bK1"y!#"Y0dV-P[M ^œ˞~y_[f olf/mEY24G[&?< v`_;g*IXww ?F-LFP!DP'2_)"$":t7oݺrںXu#G,À} Ů{0O8Y-a;vٝɱ?1{ :?X0\P|>}ꩧx UVHClCu/orc'NŠ<ēq* 2#xH  n^2& }N>Càf]mRJw߾=P Í)liM+#* X9*t(x6!zYX9˱Q\o?4=e~'*Z$ٻfʊ2n&xch6”A*-;7SźQ?/JDiT47x#S*gͦ"D#XzG<3]kS0ei8۩gE:${Vb6@/q¢R=c|g6n-۶Q8>! N FxB*kZ(ғU-O1&qDQd2B>-K=}3^JQE9 rMMţfy`ީD%ejZ,ѰĬ^˶㉘AdXK*''\0I,tL Q"B\&6ih drE͛7k,Y.{zz|ȓ Z&"IH}H"Dssۑ!Ӵ-ka{LG04vW/u37xѕ=vjibV+ō I0ݴiO?vGyW^Y~}ww7FJxNJnB.:7^SMfР, =R3_eiEp+ Z+Ud(O<>ߛohNM~HӂW酙|u|YJ,tMd:‰jedhMNURtIux$!@Z:'} CEф›4SQD%eZvgz^ 둉3rՖ |"DE1ä7QM9/|t_dZǢ=AZZ2KTU\P'rX7l4qȀC\"u/c`x4lwmTN+n+Vo'&Wpell8BcQg5RnQ\r[6#J˲G&5a$#dM+5 Mz i]t($dRx grn0=ˡeٸo[7qEh^ >w=>[ԡzM~Y?mÂLL&\,PHa)R(жm,X`Np!z5)D)lZDC!;2R/hOKtQNP&MIHclE/pzhd,% ~Rh C|5c"b#-6(7nLz|L(8Y\R„RRͩ%0{|2CW!ZA-.F(bffedN0oUqj6K\k5fy0- 5Ga޶|<$1 R*uUj94F?0] /LUH;"KP؎[EH"ȉ:>) ߯Jqaƴ^9RPpŶZ&ccOOڿ TS.9-"̇@fƝ|t ͛7/[R\?za%pϝ; 3ZZRSm*ϳIM F` Ɓؠq'XPϟ? ޼y!r&&~F :E_>oc˗sadhFuDXmsDZGɩ?rDWXXV)q1>|v:hۚ,X1#87Rn8(" 9˂:.Y)7rt wI,6!PD1j51N!8aER@!ByҴ Kguh\NR^mfUPٱ(-:kfK\S)#$_T5& *sKY=|8ՠRVJV(J^k5kr m1{X aeH87xq^.,BOr"j 6n6mڴsN={.r袣^`ܯ ZbgΜI pFECenAtjr2}}K,( ɯ02.XbĆӦMyx?sRd-Kyrqy3XNDwz /\l֜X%K̟? , hҥ6lXp!x=\ư>lp':K =N>}ԩh\T bb9 b'_4ɩ}t]%;s:]ݱm)&\`T,5}V^kfӚ5pK/6|A t޷ob?8~>48vȢ#{キg'\[n}wVPܹswڵ{nX*;yX$B3'=g - RѨ[6wBPH @6Ɓ8J Vd1vv_֘3}jql49+7ba֞/0G6Qb)YzΤ40I$W1hy? %*m]su;xxNw:VplUAea@< `_Yb 8+_`V?E/vljƽދBlp \ e{YjխJynnO4+W  o۶MIHld2^T[onerԾT*Q۴VYC.05p饡ÇwZ6BK`}wڏ0>ڀԩw+6H3] ʑ[ȷM4_~DW][&4HN_}(K!Zl$]+LﯾjLY\0o;{v_fMH<ܳ-Ztʿ?cQv%+[p9whjLRo휡VOVP$_O eW'‡͞5-қM (]~v:ozl븙\av]SO)bB'X>bfc| <Wsf%LVNH{.7R߻ dtx cǎ;7m<A`o "zA{h `_BWܽ@ )!DP24N+4t6 _S\.pszR& 8A׸0Ċ2廠yfgִ@ee/2x-J:Fiz)'C/o.ړ˙ 3 gьϱ@I,s; (q%(ghebl8S_$ %Ky7|O>+O$ 4ZD\荖?ZB'E/\$J& }ǢF|%őCK壈$*єeLg Fч{DqlgU p*L^,VqQKRe؄ $/W]K%>;EPa׏;i)q6[dZ//grY!u³:_GF\6ٱ'|Rz:S_QPWD=Sv* O'4m(ْdv2Mod4 ^%{'8H"9NjD|S(Fb1OK1iu~4cHS5w}D~TQT%~2CLbAqp|\@k>C|>OnUVY J]AN;w.2]۾}իIW]ue&%%-;%+Q/ы[y) {4{~eV0K  +?|.S3(_`3lP8} *Qz8ʒ+279Z$J(Op/&8MD1N&Ӝ =i 9 }Ll֨O=cH%-$;벢W(̘y f̜ B&rts|g[f>ør4.?t40k@&FѲl?2-xɲq9l|Jͪ5[1I1}t5h񲋗R~t|xΜ@2XB=D =`@Ljf͚E[nկ3xdG]}mvY qx5+>8i_%! $v%ŠvXYlqx.w]]WVU#Un23MO訬ȗYU|Ž-:>#vۋ/HV TGZ 嫯zEnݺ_\{| ӭ߿@ %}'عs'0ݻ/BH{Ƶ@eڵ;vv*b Fa/4yaك6zkٲe~\|޽_|17p;J]9 m<}P@2$`4:0s3SR,V%$C .ڸqw9]J+-,+oS"@Ұ.Ug1,<䔼e4rC$~9gt' ,!"FJ78jS51h4~KYt? 1$Z]-cxR7ܼy3&{|Yg6saf6BP / vС ࢲ~~zdd$LK;cժU۶m 4ľn]e ٻ+C@07+K,Ϸ~/Vtic7\]>=1 \o-b|lP+h<E7}Dv;!ޣ]m\ǗЌ`/lis%F?8v?r(isC CR&&noh6lQ*_8ϗfsݨu{3F 7YH'5[  OOU15y{d|ZZLVRM,J6XZz1eȈ*#r}5f a<"=Y |/I)wup4?P,[=q_ݫ}1'S Fҹ۝]lÙyȤ%#`6 >:Q8-Z\ Ӛu N7iЍ֑I\&UTPٳ$ٷ"+ХSˬ`+JA(o&0P1 H) $˗/ߵk7߼i& CXZ7sKx\:rtG NE4DQ*4%OC*47/he*ނC3<P0NF1p.wt:ft2!nQH<ѩ&azGW`N >|h`{[nM|gܝ*/?-ҏ?T3yը{edLӓP[y1o@֭KR}}}.k._*[j̬E4yŊO>ܵw`HMx?2Mz%+}8sCaLZ],Y߯]b 3-[Er8恽{?T]E#>ϑjJ`6 5ԥ.u!C(εc<,0EfכIUcccP )X,r sʬ`&-# #{ ^zI(#e˾+V۷ŋ%=8]wSOVd$:aǁ@LffB6/AL&Ʊ5ݴ.Rhn5ƉcCDž*v9p@ WpP(dri27LaMui4yHՍن "PjL#G3yTs{>CT2χwd eS o UՆUTpԐJL`UdƜ@+%BMǭcc 犵D]=eu+Ud@>'uщ|9 ~k{(/dlxO8ԅoiʫㄐOz=&īop(3J ĥ+7N'Od8.rԥ.u*Eɷ9o+@dL@L&C,a|oUXfY>ܞuL, 805klٲ]t;8c.׉+rAFe 2zD@-An$5kM%ITp /&=(ztH4,Mlu33ӤM\NZJP*FmH"nuˍkVWBz`/1.vҍƞc_vosJt-2 M8"V"1YJ@RVTQ9 bL@XHa9R?s05{TPh`_p!`+;tSz>?hAќ+.u*F|m۶?7UG"U;=bՎ#5<4U2l?VO_*RQCJ{J%ɻ>/G"]A-i큱 Gԥ.!a<LF'aڌ&aG~Gpmy0g/^ T E :YB{ s1իW?s[mڵvbq:6oތhRʝvCk^.V}@kډӣ不ÆrǗn5߃i2XgcWvb3vCkjEUΦ+A'ݘv=LtM`8.w0j*НLB)q x?ᙍ *Q>|~w/9-x&\VLפao_X=NqmN :O3#?SjѢEi͘"\*Zղ? ^oX?Ll/P)SS^i^dr>MvjL$lU(#Hn]sZa`q&&6lh9#jT*#r2 QI F> )( =uZ9`:AhbR JYf *o k6*ՓM)]jїUڿTK06q>ucp"{3=-Zt-/ZDvLX.y>&lskÔlFSDJ7iېa4mL1 Ҵe8!1mv^uq:OY6t.JAX-qɱaJ X,f ϴQ<د^2 ,pqčf[xrݴӶעeE O&hS^n&h8 UBa {9 UJM QM LP۹3ESqIsvu FZ%|pipPH$%ب``ApL6 dɒ 0m-Rt9,>iT˕ض0Zf2@]{g,O'Jͺ /Ra\/' Jӱf8(ݕCi֥.uͶy&2UQ=ٌ\V.{ ͱX^c6m4Nv2:nYa2n6if$ik2D 2zi(J~G¯2 2>&ifB` vCrmTq@P?Ke@;RNmúԥ.u^bB3mG՛A\*Vߪ]M,\nxxضmJc|>> ) L<42LF(Ӣg'xnK4{}|W]-@P+[--t A B -Ne]m…N+G ԥ.uRnم}lސ~c1{Õr tVξ#G T* ;>RtT[plMCU'Br }tr%`01sa gpWq #3.J0=͈Ln6r6s#?T`tlg:}6e85fj7` 46]w vt`㑑 V6f.^ Иgνmў۳Ok9]q`Ϊ5ZezÃJ&}]QZQr=L5 muC(p.#0JR5nץ.uk*V3mU=ת1yMSLU-wwɇ~~T!otzgW2P;[F>?ɒфrrx衇|{GPFL&\A~`C2Vlr$^ *Ḧ~.CFGG.cccL8ІL3TfF9 ]X(f&R)zz%=G"BR '%uIe~,4r9K`hhC:?yڱ[:Di<:zqhͿS{Oy1R jsKq:ׯK]TNK:(iOa7_6ꏈ$J0<@$0 zXY hDឞ(9z(u^veW_}W^ys9W]u5\u+d˗i'_m(jWiԢ]t_te˖=ɛ>00Jz#+NN~yD]q͚58ɡ-N(uMڬ~ e N 0u]68x+sw-b5Ӄ[ Fƍ7thѢE_>*л@pJyqzOL_ |z‡~~'E˟uӦMts|pc_ mEvw aoN۱1&WVPvbnQ=mϨw %T ޶mtP GN ٠VjW_?C̊*3 =L #+qpVh_.Ӓq@+/@n,}P"C?ǮGE-ZN-Fsj`>-h{L 3~B-T*\Ck.PrZ& ?Lp`_G/Fx{/KH:S0jN/]v-mt <9~g_uUU%zA *?gy&v뭷^r%BـWX|r3>-%KܓtRX+Wb/H\wuxcr饗WZO}}}3E {E-Z'(@\!-gb;{<~' !X$(IU# G#EFЈ9-͑R)rA܌ ,0{|v{=+'sNo=?hg-巿ַcYYn?H2_:ْ&90Ɉ/>= 6y 01p&@*MPVMtjjjɖ˗/]r-{9uë+W~:2vg`%3+k׮8<P666*Ö-[zۿk\lٳga9:tuua,3=,Yk.1cs7޸po.WAd7+ +mCGG,&|'gΜٻwo[7֔`~VNH$DS3_"MwmῸh~pO 9= x\ 1!)`:x`]]fܔH& F4+Ʋ|!U!䙂hjnj.]8T:h̩^R˼B 6p Z@$H4+Lb f¸YƐ (ֶiӦ+H2LK(soxpAt L7@]Fd >=0%uE"H$:nmcB2AoYJ`W *$Hie\h1c:i ̂``%XU$ݮ.#pɜ&Zဩh"8zAX2u-^F'^0/p"h^ rd:ƭITb?J|֦HNH$Dsق`;b[&[?̳"FGGLjǎc.(wq)t4a8f44h $eb5%̊+c"Fj9I&h w1fWĩIFk[q9uu8Aev0p^5;8{Y8xQOM?kD.7F:^ɩ(/YY*E}^<,[%s2cJ<0c/=YlQWGb@__nvXhқ:ѸOO*/K%9 vNH$DN3 ^2?u<6zX5ccc \IF*I쨣6U0R[O4/]?~oE"H$sN$ Syc#Z`5tA܊"fdd+FGGM2L4CrXcCC?˿a?g}(þ4_Xd<3++Oۗ;("H$ͭf+-l3 vSG f57p౱1ٯXX4rtɼԒ"7V& ,vn@Q">88KMm8qBD"H4`NJ,0}XRjXނ BE#Gg^/1 ׾˨0JW0k-'c.Έs1/c*4a&(\h@?Mv)"[d pm$ pa ndgƆ3&7x#1W_q>R'X$Dyـ` VQ;p7%ԧCZܰ@ ~GBj@#3p!k>!@_x1Ŭ}QH`Y #>ӹѱW˭ h'0QDRDyU+7bhN  [XX!4QM^2’Gј*-M_*/GqMp\?#~kLYቩ:oo,䬋D"H4ǚێwB;wA!  ܈$h> >;t#`J⸳k(q&SghF@ &1 ` `GL{_)yYF^IFtpL(%f6T+)22*Y̞ DAW:ˁvcF0.S 6r6^;15a]ey # *I*Sc՝;[?@OOs',D"+.''1BPoccc^^ RRR t.y&nnk05P-2=$27ucN\EEhg͚5W^ _X{o޼\ 2a,@XJz!8Q}3,0T 1YŢMf-;KO C;IJL?H$4J`H$f< 3m[%%&'x?dd*Oݽ{ € N"[ot+mvww+q4 u ˗/[YY"/m6)߱cPh^̌u֮]ˋVVVGW\nY\BWW޽\e3``nvv6a 7GtN---}71;`Dl2\<cFF믿`^`/jY)Tsh$=;VXѡ4:;w.??{y=`6mC\CqqUشŋ/͛7a Ljj'ԄsݹsN\u)/ɓ'͛$-_w2ES,Y^̴$ˉ!)^NIeyF޾ D"h^j!X'B81 f2vO*+َ,4Fe09ua 5'ӂ;;;i1)*PLS\쑶6}GP<$:ĊÎrƔ3 ێÑP4%ុ-,D"|lHEBVq98]644߿k>|!2kƂ&\y\RVVv 1L24:ggg3іlUz,WLl-**b@^^^膹X61)gFjxf2.1)ji0:׮]c1ڵ8fr0om0ݼy3/Z{{{EEddd\p(Gmg*=);)-34$'NNR|̥(uE"H$oV""O˔W ωAShddɾD @dMD-^ )26 (dj,1*UzQYwR335288Ƞ/; dH2; uW&'3u(8lr111ܝ0{ꩧnݺdbw a 0.88<< 5Yn駟7 ԏXP(2[?xܟ94( я>h͚5\LG*; +Mhn/n( h jSXIY*UN"ьKeSTHM41' BӴ ݬȢBb,wo"ݯΛ߻{Ty{Nnnvv"Y$b}ŕ0ax[UUկ_ K+[pr3zKRK ̡xLj#xJ=so|㽻&˱\se9ZzvL[!l2L&S &[WΞ=+W\|?ܥKe˖=%4yرՠHF`c^z7y-[M& 7a!RXT5<̒%KX_ү)S08.))  *t %3 *O`Rff&=uQ.quuΝ;ꪎ~9o>vXK@?* gϞѣGx|q?|0LݡCl 6jl<Ƿ'J#hFFW^Ci&d2kRw+"O8c=Ӑߊ+fm omm*%:VGۣG2 s)0sOWyAdWvVPPu͚5C9](;*q(ba׮]!oW86E[t#]S qWe fNLbTaa8(v(gԭL&ɔrj3gϞ80sJJJtErl[׮]HXSTx:W*D #HԢjZs USHRF(9RO^ܣGxbv:rt,*̯"б9eSoKKK?8PvϜš 6L&)5f Xa` *Wfff4Xre˸d+X( Dl`J%pݹ꬞!@')Xyu͡Q"W:hV&Li=͚G afcl @Z]]E@U9zcyX/\*ےad2LVW={s\ʭ+| D \g(:CT~#YiUB-ToVmH[Ƶ _FkTTY ڴf(n5y)AbF {fSoXQ b*Y^ %spKM-G[(=Zg}2L&;>,++ @!V $O'ޔGBq ݚeMfD! (o Yr5;yús>(gzsxEv]eHnLL,Od2L6 >s <ɯkhhPy=3=Wj2L&uf Xϖ/Yu>؀[Jcm,Od2L)6nUL9\$Y43lS_&S\n˕իW]&d2wV￯]vUB_.WUw4&S dgg, nmL&djj3ՅtiJL+p\RG'd2LT[ѧOW-_%S s*m 6.^t:vY1={t/ud2ZWmԼ˗/Wu7PXIy=uoU%J`L.l2L&Sj 8-g.%O!s8wq…+V\7e&Dx~qVq NK*̆BOUQe]gZQ8*,-Sz6*9 M ݐBe# Wc->!AQ jv\TVV&.ĉtcH.d*c[mm-ϟn[Myzt'Ota<&d2Zc^ ^l'X3}QZX ->(ֻwo ƭݻtaA"3kKTJfyeUĂT|bͩ24PTɡ0ZY0l sӧz Pғ=lV[`VC$(ʳ C piDDD5Fr1@5.x]r H"o1I0O߿?ӆ&L&ɔj $~YO0h<$jk\20ĉo `5i<(5A{W,|cǎ?~\lqs}90''gҤIrW2{[ab<.qn7Xd 6,pBrO}+_Q;fӁvy1%/9gڹ,Od2L ǪݴH<_Amݩ=aA)|D*AnEy|y]rO> U,[, h ?C4uuuXx7WtL8vsNfY!]v1|uq!M2y;v8oBFdBܿɷnZ^^ޯ_?naTG+#ҦܦNь3 ӧ3Aw̯Xc+ϛ70Uh3;6s~饗y...׹:ü[n'÷,l߾7of0}kN1Y`d2RSWXG]G2GߌCoSZOĠ*MӱAݻw*F1€[nKTV:ƴJ@A79]R3Hu *yv-sG`^:'0r gjg9w1F!ɀEEE}+`,Gw=" y\wBgg,i&d2Zb\#k %O4E0zi׆0_cP1.d!^ ڌ'N(d  ֕I4MG%*ڔ),*76 K7ME 꼚غe˖9s03mۦ2e -X+9ZVhu@Zz!fݑ#GS^T/T~w>`={x &<=zt(36L&f*Xʁ -['vQ]%J9υdɪ[^XQ,fUnZ\\ mذi=//Og&LB=|ãY[K L&ɔjp\*ѣ _ʕ+/__˖-{ǝZرc*+ JBAL ʘ*yp`-e=cjPa\)))(Yefu_b۷Ϙ1C{Ud6$XRTT4vX.`ւ*(ձ.0ɓ6޽{۹s'z)cꫯ]xW8e`-q<Dq ~斖~zl7a1dZkVW+!i^9Լ;Am2Vx*@9;;[xMf*6UUUڗnR]bՐS $U`޲Sv@|ӱp\qdKTդ]J@3̣Y/}ilNC<= ӊ Zql !1l2L&S 8qE%#82\谗6(RVO+FEJ!e8چ tȵEu7(⌡X̣'S)AM}Y )B@/\Җ]B,+. fH:*@Q4+M=鯔mgse:sSe%iv<ˉpS&) 𵡮gmmL&djj&o$čhu#W:++ ؂픾W5Fevy 2'5(9קy)@RHBĵGņ 걅!qDN΅[:ݧ%vBfovPf`yI:%L&ɔڞ8z\۔xmJ̙3ImhhU]L.l2L&Sj_wuI?+}`)dyM&dJAǮthe`Bh Џ!|dj]56ҭ[yyUWTTиzֶd2L6 V￯ р0tKZ^).'8Ów'2L&jCp4~ҹhr9 .,8Ynnn]]]HviՉPn]pb.M#l2L&SjeCD}åb.řc TU#hhhHOOWPdj]]:tԹb{^VQc&d2Z*"8*m쓰t)\w/_Rà{{)ކBeF 6L&)5r1iiq3)C,//>Y ą VXrӢߔC]@LG^=cUo"YR G5W7%3$hhתПp_oCIk1jG-AZ.&Wʑ8MCKv9e-օGD>AoWJW'd2LVWK@p,:ut [HiTK.O<ĪU~UEzz:`[ݺu/v q+gSu J ReEF s+ w8[.OARR06TTT(H5Ʉ7c҄f=]ʊ@I.st`Q*e6.S4=aqBJΥP>Ok2#D`3F2*|v8QΓ*gLk^&\dInnqf͚zIlX n.,- afffN8q„ _-Ǐmچ8罸`~: Ġ *qWV0mڴ9s̘1㮻%Z,v* Q 7}t9]"C˱40CQ<=vSOou뭷7|wZrNN"1p>* c"3C;?l2L&Sj< /8~0]lo;vT;#H)bc`˗/[lժUKmHD0++g;\f d)r[ܬTW,"$>E!l} <̺S!OeI3L&uu=QH|t)vq *** Gy~_;;5gYY٣^*8 u…nr-r҈SN1bHXZLՅ[ {h0no̩>5i$Xe%F|‚/p wf,lw[r;w\9?kg̘nyD5o<,M#f`uܸq,:lذYf9O0%D3$ ӛ6m׋-bB"swجv <&d2'8nZ4NB5g{_ I <\'*-["`w,ʽ{Quuu;wtV{~*"[g-[|Y\\333]شya6ZpǎsM;z}aww xGe cǎϗ?[5550+Z ox>~,g!@vǎ<ӧ/h?x X{پ};K3fϞ=i8qc^ygΜ:<%&4hl:9'3мm6͛Ag:@lڕ,Od2L>"vJp}1ſ@Q5.e~302++kݺuy\@yyyMj1Lݻw;ހ ]}!sG'O ;sn)'@< |k>쳖%d2LUK.;E.iqڥუIw' R8)'-cZ?~GupM^0`Ub143̙3B`NNJf uXM'@:M՘pT'(<,m( M-\R_|ܸq$=z-u0ٵB{L-hrcʰ>,)KZa!cӕ ;Mڎ;'JhNȋk vs[<=zt(L&jMB#Mv }L%R^^p.˖-[OrKѭHK9Bt~n…Fħ% Y(^l‘5556VfpX2tVVV]]U Ď# !0G^g޽ϟ1cʭ;v@߰a[pkչlV85baYYdܯ_?)2 ˔)S mۦew.S᭞ީSCg0Zم ϋ'_Nډ,Od2L6% u+<~a~&V[ؔWtGgL)WYYx$nMWտ+{@[_ovkV >9-S1^t2dʼy?|k .ba.9ZYf 50V'N9sСCٹE_r TN42UFF={,X@:Q`<&d2L/yU?CXJ>T |ʕ˗/Ae˖=sazzcxUT|&o}-WRR,/׾5ܹsUMR:(:BO1 =O<ٿx1cKʹsˌyyy&TZQQk.^1ȑ#Өo 6L&f Xʳl `<ӊP^pQ^Up \J &e`.9VQ%9}Fț۷[7x#̆*'pL#1):dT5,긛PɹB`5>쳭md2L]m&&`ᠠJ ;PnQQ96 %$r]t+n|f[ r[0mfRT4<`٧ w6>TkU[].=WsƄnť_ZWݴp7DN5'oCd8qBoC-'[ ז]Dsh׊Wc*9Opf**'d2LP!W.XL@Ν; [#_< .lSZrթH)Tuy 5ٓ wv1qΝU\F5&٫W/S\a_mneeeBXbvG^*Mx=f%ƤtU8ԇUo=B6zr.@׬GʢU 6L&)UI"- Z_l'8qVM8ϛ7oʔ)Æ [t)?_x10dȃsL*Çu!tޯ >:r݅p' Lyv{M#L„a(TcU}`.ѡ֐l &a6V<[=m`,veyM&dJAGu] -r`!C 瞃-[۷^7|sѢE;tx≽{=Ylhh:t$C]wx*Xwԩ'O7n 0 z(}Jqd9Gy;j(xʜ4iҔ)SXzN>q(rQ '8yd]9s&;o<ޭ`XÇc9/vب *"@o~>iӦab36p z6lXq㘳#OΨSN~9r.9̚5KObHL,Od2L 1nZ$q;ճg܋}rSğڋD SW1j<{,$ѳgOX Z  |~g͹s疔\W\VaH d*`73|wk<`ɒ^z9wވgw:8 [ YBa6lf-[N>MJNR*Êl9Y1/.;v#8̹ʦMwij6OÜ_ė>ot'<@*jBd2LVՏ XbqƒҊw]şdMK?@[+VЙ3{}gΜy]wѢ!3gƌ$ \B 'Nx 8(*&Lo> 0S\Z>JT9n1O(!*;(+C222&OcS?~Q1~#G8ϧ?~ 7hCqE>}ή)&aJDŀ8=y*@p+L/Fi $m .oך1c0ѣG,XУGM6r:Op!沴jX`C@XQT$ ;}tM7ĺtoȪ%Ko E6oJ|['d2LTy|(i\cH3-_P0 n A:օ'==]!;# ;»[~EjkkN&fv1g(KJJΜ9-px=}ĩ]/.\øsiT ILͫηԚ,s`읯'OVݻw͜9>yyy\or?_w>kL_1'NF_߸zzM3L&]+ X6T*50ķ:~w iIy$eٸq#˅23좃;Ob + S[‹אKAh a+?-3{|IT<[k׮ ,B>̬'6mt9 t;z9/W[j۶mjtcZ}+J_,Od2L;~P,,0a ~ EN+ `(y :ϝgYUP,wy $`bF͙3gܹsȑ#z-e@svR(Ē:;l;_ZYJ0ʶ1\l\iP҂rXKt%2*i_g#:~ڟ&l2L&Sj* T.T:!2pEw8DO[%a /k6fr2-J*,05L,Od2LT#Hdr\:%?+(Af. ;;v‘SGOWE'KQY\:-UQj*Э2 i O:r9|m\  En:u*0=,jlGAJoAY peFS&BZxp'W61}!<&d2Z$$7M#Sd-&TpN}yMܱro<6xS.U?Z l^pk7VI^16̭l*0eeyM&dJM]miH.6%&ӵM('8]&d2w]mϺ%re.7Y`d2RS- ~"!aLlk2,1l2L&S!ɁB'aRfAY`d2RS-iiq3)[m,/ /Q'\㢗?1'ϯ=q&ԯҠe2Ao,~Vd( &ɧPE+%tSlUtvP)C/ T{r +SeRɳG-dO[B} A >EۮgfU&fl2L&S% 8\qSNHIU%yUy6.DTiiiB=xXY!UUU3FݘN*TXe2XW5zLj څiΝ;G&ʆX!$l@yUsJ.kd.[n0&aѮg]Ѣ*w*1e6M%Vg>BGfc^UYe:j̪!8'oj|'NQuu5P[L&ɔj_/Pw]t񿦏="Ӽx[[[KyL2lذKLŋq999߾}/kM4*sra]ZDSMf!ؑT|KȄ՘GB"?e %\ФPݻwK2ȵ889he (C` (//B^<1:Q ]f~1CVa-e&T;}d* sާOcYZ\!5VQ'z555d~ 6-l2L&S %&ݙK{||<~+<8Q;W:Ϧ=+W>ȑ#+++_|7|sѢE֭x≽{9r7μxcǎ?|Lr i56c:q4fd?ݯq=Pkf2L&SU`6ƹMqmjg }!y_ҥKEG1c`A,,,gjܹEEE999bO]]C<+˵  G,1{p 9 c6Q`3'bkaȏImۦ iӦرHVgb92 "cxT~wEzU$>f BE&A%=`|4<=3ŋx _V( afc ^QQ߿U03icO[y/ٌ6O<%d2LUGC*4Cg+eD$.h)OЃaN𫠠@U` xkڵSNӧO8jƊK,vԨQ \8iҤ)S4'Obhmtc]0P[h̙|͛GO8OqСC'O,efxI`A^Y(\WZ '&X &Lw;P5dȐJf,3/91znFc*U^烕\̚5 ++//ׯPѴLBނwر3g̘1W^߿?Ti&ummDŪ`]TT%-aTxW] ݺu(?t};f˛7o棹[7loٲEq l{|<*DX.j>5"kOQ[o W7|m3`>;ƍ S'zUu"Uy;xge5ߛL&Ԧu=QO>Xvy**Jv/.[\xWq];QI9F?BHb !{믿>s̻ =h~~~N<v`+[ 3-֭v\1wE,w^yDD0a?)4ਓalJاsl%=Y+B0sKn\1bJvZNgTf DGYZl? ّчTcf!=|0SvM7Xnaڵڲ߅NL&ɔjqoȅ1v4rh觪Ņ|\EEw_{Tvm@SO=o}[K.-((غu7E:ݛiTAHa 4|[&T`f*YQV8wi7n\3>y 54ܱeJzJ d*q1$U!KBpm۶I& f@ g~N:Uy͚I+"GvG}PiWm2Dڬ ]>ܝ2e +(OMOvgϞ׿U_Kx O D:__I&d2R?Ɛh+}¾Gپ};ĵH^x饗fe} & UMM͘1c[WWG猌G.XG6mtp& \Hm<G:̡@L:!>V^̆|#Σ`Zk0o۶mA|+0tPE(Xx·"D;jԨPn<+tM<Kr`kw vy!İavp糛6mh> J0ʰ'fE5-qGN+]Kq8 /;K`zx&XIHj\$e`BeзL&ɔJ9O0WWWC1e!|*%ˁ #2(bbsz_ ,**r Q%ENedN}ɞk0J"G+Q+x׮]ǏO~83h*eP9Or *ϱ.kȏ8UyV?0={Wz`Fљn:ܦPcK֭['V֓CuP1Ίuk E 6L&)5r`UV%j y7|qq]JjU*s 9s9/叔I4dGhֱ6%Jsylrq-lZaՃH¡8`iEѤznuP5[1VXiuWNz zhbeyU-9B0R;CUDy*DDɆymhhP<ɸY`d2RS) vEB]tpx ՒyMܙBɎU3,w*!#EhM6RolA)O6Rk}Bz.)XȮG6'Nap61Zz*lyM&dJ5'd'Wd2L֕AtueyM&dJALWQq:YQQAի[.d2ڻ M('8]&d2wLWQ'd2LT*f0Y`d2RS- ^Z%viEnǚ4Y`d2RSW:cqƍsEEb1wN:D< /~;V+V(TrE "s'uTrB ՄU4qm}}W ewCIeeeP ^ק_չV33v£Kޑ)SJi;L?W{͆C-quE)% 4ϖ'd2LVUX3Hu/ןsp!F>] X3--M OƄr"jIٳg| B8u{F1[n c`GZTX#@g22++K0Md X4= IR7(JU'T!<' .Q>}! [BzRzzٚaʹi }УcF`r'd2LTUK.^w`} yM2eذaK.`ʟ/rrr~( Gbh#:|.@C-2*߀`fXUL1`e f̼r dStc+2=-WWW364&dPƞXˢ*vqn*{tVc+][ dwKHڐ,Od2L)`7>>_lj}'8ĂX89r=sPwܱe˖}kwo.ZyOD544 :yR uA[!-&| fo!}kJ7c٩K1 ^JkUl3f,X`&L`BLPUqeeeЧ3q3O2cкԢĨQv5΄Kir8ӦMW"X5M1A\'d2LU'`3۱c$ ^GÅ/~wҥG'X|WaaaVVDs=  eu-,/V޽-r &`"-HQ:yxn*'_*p^`={ˋf͂`{YBOXFff]ݩ'زL&ԺHPC4<0]`4vA88\wuٳ֮];uT^oAlK,vԨQ :iҤ)SZ[[+3 #ҾqF?g0qȐ!.|8*CNbU1H,ᚋo~1b_ o-L7&g,6RXhw/=Ҩnj3aFx/ܥKpy8Mˀ ƧMȣ;vv_٦K 6L&)5u=ii(4Ν;S[[9g!Q08$ }*\2[`gy^JJJ`0 dXf]W7]vq1k,PRfDɺ zW?$h߾}Aҭ[j>tP}e͛7@ je-[(W3 aP%"{=`ZݥW^~ӋiX_{5̙;v쀉VK#G8pwfŬ,xD,6EN+s!le0gp 6L&)5BT#SJ *կ~}JnÇ?So}[K.-((غu7MՔB1E ,ېWX!`QKe2H].dBp N4If8+vԩ̓ !f ^^Ԛq^8~8*Iy/رctTKWa~fm$Q7fҺz!Ew[U+9Opʪ 6L&)reu P15P,33sժU/ѫpj@^4ٳ1XGxU ;w䢲["N sá1R @;Fgz,*!LwL[n޼vܸqwf СC. +IbMؚ\C{lDӧ{B*ee#Xh[5@|̬dLsga)CwY{0C=SRTQrH;4h2L&S++c 8v"0'}}9}vHk` ,{^z%:YFe|AhC )unMM͘1c[WWG猌G.Xܴin.$+c@^s׮]+:U@ \v QFMUW+n&P\NIUF$q!Wfxw˗8ͽ;P%)H={(>,4VqK+ eэGz 7(dڵ .!vGjyرcvyyy~֯_hѢӧ˙ Z}7 /}ݻwl`u?~<ؼ<{foݺ5!(w׮]"W߿}.j96-[(Ђo.4vQ}]! hG"l2L&Sj*!…B]UM?C~J+BU( 9sμա1C/اBn~w3jΜ9sν{F)sTS` rK;JB0E!\"nyҥ1@k5BƒR  ˱"`=4K⡜q Ѱ ]'NvZ=C'M'd2LTya:./ `U_ v>xy>S0 E; SWj]\"%R=00.^BU6(VL =A' \NSopVnW3sDuƎ,د_? 3EyӸ %fRU0 *t\'d2LǼk25.u`)P>HVH^&[U]ܐ:<*~ Wl(&\ Oc1-8U|XʿB:rγb>CSb2Y/uE. s f bZQ^mKFd6tSˀ=oNu%{`"nE8O.eyM&dJX y7ymw]&orcd!A\"Am…bG 'ԧ$n.DW·:O& ̪G;ӳL&n|-}۬#V~d 7s_Aaxxd ]RXY`d2ZGa}ф7*s{Vp!X2N3g(L[2]cJ\ZZϛd2L+Vu7"sgXܿ4R2#vIL/X'd2L{NkDKtK8ؕ04 {056ҭ[yy2UTTиzֶd2L'Ec`O×+ӧO?JU[[k)Lמ|ٍ!Opke2L&S{'`K??… z:uAL׌,Od2LXF\7r__W\YZZǭ@L/R*Òa1&d2.Xcƍ4+Vhll̄ ~l@|MkF'd2L&i8c ;)!l9.W.Rmm.t"'W}.zY^Ւ裏AtK$ ɪT*"H]UUi *ԢΗZMSy33 6L& ).Fܙںg/rݡSM9Ξ:0gsxԴ4# F8h=z&B UfӧyeB2V6uxH$RSSôL^__OnݺHu]pT>9iA[̚o߾[^GI:wLU0vT:x1٘13CT?eSL&ɔܞ`71]`F"QץKg:uұC爋]MGxTy`D8e+5zBɮ]2C]] E ń={Gff3gS!Wy%暭x|muu63J_X-̭UP{UBgY`d2RP9ݙ64cg.۱cNĚ`0ܫ@?>k,tرq^aiГ>| N4isp֫{5UVV&Lh#^ ^Y!*t1b̙sիFӦMcE ffNwL7(9ؽgi7vjwѝ9>5;t}ϟ(vylU=?/clka6Ya+"i4Zj:-5RtQ&D:Di*= bH !!aKD s:Dzju{{~^yw~}}a(޽{1c'KJJ/^|ȑ\8O? ӧOhwΜ9 ʕ+;;wnmÆ vEjgjcƍ/]7C˗/>})++իWnf9s&*!/Nre}M&dJ./Ss.Ͼz{>H\j-RCK^KQ`TWP277wΝ[nX;wnժU01GSMh'NQfCCrrٲe0hssR ,r[o7߬/((jkkLT R|2^dIEE9.\x1}yn9uS]]7гtNwii kL&d% %@5#E#.5 %zkbYjϝ>Uu ԔpzWZֿX,q޽;v8qĄ `⒒CAv6*{קNy沲 Jfdd-PQŋIPB.\XrI+VpR䚕ȫfg S0)tQƌXOUtP'd2L$kCnޜiGnnlt+Js\ăbp)QlnnM6߿˖-?G/_~lp$4 k27U,ryv~Yfa7r;ggg/\P ]UoT4e˖.jqӨe/_V;'6  =:k3b}M&dv%ᄻ @w*I]0o%\wg"3#Bj!1hSPXiW6mmm}mh׮]~={˧z)S Ȱ/ũ੦B=s gUš@ԩSO:qGGիTzsee%XLa< R83 ^t?yx+nbut67ꋱ{l׮]d2L77$#EB ~b\W{04)4geeA| ZWW7a„K.;vx[ZZWpSmzӅP1~N>}]`j ¦ꫠ'GmhhVQwZ=qRă^{Xgp1(\8[YYМx>yvZv~77mɡK06T>&d2L%]qjĹI_2*N|y/ _|͚5`~ 'Onjj%-ZΝ;20CPpV+7TP__*1V`heF$UvqcU`x8@N&<Ka:ί㾌oZY`d2Fpd-=Pn_%{Oޏӏh4 _=3J][)wś)!'Nlڴ / :VJ5ĹP8ڶMn5Gm`V*3 p3z={ƭ7`緀=_EN&$y uI)p]5ݜwtk YMd2Lî,w|^^zj% _C_7p9+W<~8"L4i̙/_nkk[x16e @  U|A^MJ80W;bAeHp `Ap*c઀MЬ`z!c 88pCG'd2L@0r9=wޗʕX,jժGy@GQN; cw޽{MrfJ ZXfUqp~ p Y=j! ;\pA|fpq*>y/j}M&dv%04`!\[b{Q0zD"$ԩS;;;aFLe}M&dJto__TLz{{MiT>ʬo2( 'ͭ7cYu Rd2Lâ3R t<|&(}[[[___ggl-AKKRF&?::zFef755544pL&d5įeVp.qРk+GNIIQ1A999677>o?/d>^zaaaGGG'x2L&fW,M?:Wk~:sicVm2|#~Q&Pd}M&dJ"jp⺲O CfffLy_^UU_K*8p(i(>&d2L )sDZZZ4v~(g?w]>~;կ~%2"l2L&oUwC`w q'Tmry[y&6q^rEDJJ !^w_ ;^N@V=%_2GqI#%:L-ˠcqC HQ9or}vZJjͨ̓ġr>x{ ^^&s)%s0m1dY`d2C[8;R&74wv- JޮYcLp"u[MMMX,B5--Mc}ͫM /_ֆ6|5jx[1rrrOQ{ؚgnU$ C vxfvܬ5Vj>ߣGY1ah<:왧MAY rǍLyU`xEv/\#` :}kkg_kL&4< $Bg!.z8CS)5-_yyy0YOOvX[[ qF kbH[gP&C8 +mc l>#0\Bn n@X;pM.%0@r3Ḡ 7]JAMpnnާd2Lî$3 Ԍ1HW?eΈe.*4~geebBx=PqqÇϑ)ΔG@'Ot&\,N:2)6pqb=R^qfQZV PzvţBX<0V*ގ@,!PJֺZ^f$Z΋~a+)Lй(Nx撒Gv.*xdS>&d2L%D]{Kdv~ח/q'}~0|p>a ]ϯZٳJX^^UB[vJ VYOdˆbbFV0??_EPrMMR-)2"T.\8}iӦ)$ڠћnݨz&d2L%]+g^zpwkhj{kZ\U 8|]Fz4= -~HMMM<OoݺҚ5k78pg>qRײU\lmmm/R?}4!7|СC3@J?"/ujST `}xȑ#L,w/\@07!|Μ90x]K,! -˝A^^555Po߇ny _$t<8SQ+<>O&d2L% ˗>|hJxΘV>ʣ锈F&8 @+8lǎ/Һuv裏qO^` >kiiQ/[zܫBX(pĉT5*֦/' w+Oeب&nQ0\裏t>hσ[Oh o޼… 0ŋm6O2E FEAjB8 9o)''gҤIprAVHp03r*V^o?plJJB'z_F(b M&df%G6rی/KO-} |ž\eHx{I[Zn|x{ᇗ/_UTT,Y\J5css3) DZcBrǎBx4mlTיό66[1DJJU4ʪj?DZ)ي~(Rd/[Uo]MHʫy1bH"/6~s7\9"M]̹>܋3ye䆇9VB. S 𕕕)K;8%ܗNxO>DAvǘ5ko[ZZ***}apY2Xrsa !g\Dp<Ǝ3̪hU 3ieHofPoa)Op"._~&]d2LJn"\]3>oxdAɄdO?.1|% I"ɅJ׭[n޼Y====[n]`|J==YRϟ?Bfc=}v ~-++s[ 3v]p;p){K,Ԟ={OcY{Hsݻ-Z?~w>LUq!8eʔ'N|roڵkmll=pXٳg 4艅>h*qi%ݹs… ̙3_۷NflmmHV=]w->|FԩS|P"> c#Bӟ߆Aٌu1 H֎Q;e>##`d2]CD740 F'$w`ɤ8/7+/7't7<}q---pΝ۰aVUU%>3`y8``ʰ*~k5NԀ5 FT\Kց?0Boik? O&ev 0"-t 0J`Q T1&vUXҥK~3f_+`Q>Q \O.UZՖ;a1DŅguN_=,fL9u>إ: r!_wT~Y+Qv0TS vK>vis1ks2Xa0tv1,55k꭪0O0Xo~^d2L{ RѻA9RxHJ7<$7&yZA4++26֓#0\{{O>m6 8[ticcҥKQ!K3T0XR}]7̏f9aVafu)A 9\^hӥR1ZX!y2Nòco*5!\صIQ14,7oJW'd2LP qE\+""SNu}iJL)mz0#KKjueyM&d@ M*1)2Q oQe8VYNh hmmm Vx?(L&ɔp#Gޯˋ)WU} cU悼g1e2 6L&)3'8"cÍo@ Y{ ][t :*))LRB ~kUHzqհ8N ._|Mpe%5% SݘZuéuVw46ͳ)dyM&dL}梶/ &+%f!N &bA/BQQj&g?UKP,fK.bvzN @)((Ɂ8;::hĽZn*>ZbVUQV^ 4ydyҤIqnʀ̜8*~Anp<Kx) kTy8'/ 󤵷Tީ ŋO 7mrX5[%8@*R61lKvXJ1NUHf=uS \t`@/_2%aQb+J'8v>kL "e̫a#`[&KyØ" 6L&iܕ'8pE%1B->)D$_*S8NWzb؜9syrOLr &Ô"(bG9h , :9;e𗫰 Sղ8 `6_{( b. ݂4FX SzYW.g@$K *1ܮ4ӺaXp֌bV ./--WX8x,`MߐNʅ#D6m9AL ĿX<.d2֕W7d]2nK\`!I&gϞݴiSUUUyyyMM{ァppKץS/_eM`<V :<s[u&?H+'/`D[z;۷?CC pEmuuӧxrAC5:::x[7udfa16@%= HVTƙcYщYr P34B^w>pa'fRlj r`t2,p!;b,;zJӧOw{yM(l2L&Sf*qby%WG?>p-\ hc:ϟ?_{_ 6K,9rHUUg} 2Qt(׬`@b>CVr4xKd pϙ3Iׯ_̛7O-Zqr\xwڵs>v+**\*!La[qd˗ ]d:L%CSEAw}p2cpvL&27p&L&ɔJE?:_՗}ɏ>bn+)?41   *M>gm߾}Pǁ9+VpAI ӎ4E8 6KВ… =Jc̙~)`n8aɓ'aV֤ӥxT (++lnn'9sy3k/_4"r=+65 U.]sB1fXCCt{n#)ΧN={'oix!ny:X`d2]i?G]|8"ee zkpP+\P u9e9vvvرG)^vܹp0m(:P aF3mYCsOcc#./^ekA[Yas aZyvu njjr5XYg@ &VJࡡ!,Ui(QX h_r;ھ}Sg^3Rgƹ S0r ]*K)3eyM&dL d-{`"`_ϚU| Aqs!Fn DUx)%BMMͶm֬Yڵk?;wjS+Gmb 뮻*++!iӦ UaAtU RCTdԩSi\pA^jX3L %PS̘1SxM4)|>شUǼh(` eTUU N<~)|BޕX}h@)Op"Yb/PvS?L&d/ nmfv挮Zx6M(Lov d!! Vvtt@ +W|7~򓟔o޼Z|C :TQ 5;,9sfo AF`QGȵ _P "Ё:sLICy.^_GB+0V~,0N?FDϯ߱cGYÇOdTah/]$pe # 6L&)3fVqKO?=f. \l&+W|@/~_|E^/~{*0X*8Yhrڵ۷owP1xȑjl˃M1l\5ydA2H0Broo/tD[UU˲`Jfr7,.**R`w+pqqy,~·O"6oJĦbm8p?};v>vZh7Ԥfc^ĉ  B{UnqŊoJ:avaQLSHZ;e>#l2L&Ӹ+end$hs3nKH AQ bш) _׿s'O&M6=쳜@>R 3#G@W GMkEZOjY#AO|J@[pA ޽{* B-={dp]~ ъڜހY$izf` Ea9zDɍ&/bL\knH ‡I[QQQ9,E#h4ٛ)[IcSz߷ނ̯~y|>˗q9BLɌtSk.ʏAAϸ48rAիWwvv zMڒR-ɰpcPC@QR(U@TÙh]$v8F&Ign)0Gرc\~L ~#AL VR Z¿U;H faщ*J0 GdE6q|AEsEQ h;p^z -͛7G]84LRm۶{ _uσxQ0fcmt %{"<%E*6{ 8LOј4MJaq95M"AxѨwΣS;=eg+6y"fya[Sca[Yaed[q-rLuԨZTM*TQ²,0աSlM faILQݸF[ʾ}y(L`0-!T-zERh %j`z0㽽yf9O00 $ u_m嚱\ |i_} xH&^nqǖE"l XK07.7&cag;dž+"$ة~GBشi8bH$pB-rqYf(#k+DUU0 08#--nXNZ|aulO؎02Kr_RpJ_Zj21[qwٵkƍ)/z_Np^X,&dt:M1,,1|[KF3m1wԗ*IPx8ŭL iݏK 'aa Ax]{%P?}Q휗nE*_ja%ܰaÚ5k`ׯ SѨ'W jp@ %c8BQZZJL1>PJZ>.0oI(jRqq +W8O00 Ì?J+J;"tdT҂ؖ +yxruRdؾ⋐Kz'P(iee%-b:jB`03fpWnm+ 56 ̛֭W\jɅ?d ̋b;jƍW)؊˗Z>~I8O00 ÌB`ݧ8ِ_wYذ,'_nZBe)*T HkacY# [RRj)SεoqB%/&F\ƆÌYbnYl黔0(Tt2҉@8ىh$>aVb-t5K˲W(.2t.},!pT*EzZ^^$=X 7kZ^JrVEJ`K&FWWG[c2eeeDH!ZpqB1A۞ ҆*,Ցm`yafwDڍ-XBoJX;'J( v`HJ{bCQ(9@v4ƎlLAL%Ᾰ= @mG2x9p !n9?VVmzNB,SBg3 0̨$ϲɎ e0!?w (,U|/=-LIhɝofss3r{6 Qk^}!HUV$uA*LAV*aY^;͑b ]b ;9\QȦHo>ȱI@M~OMy}~?_/a'}_n|ledXvqGQ 6I(K(F%K|G]hQ[[ܹsvZ> D⮻:}4Ej ?מ?>$AGH5nMŒxcc'؀oiPxvCs-mX˿x73 >P l,i 0 SX Ïk;}x`J?ɿ(I r Aoֽ{!X/۷oɓ'!#\wV0`_jMM Tϟ?eʔyQ 3qӧ8ԩS ў`dẇĚƵVh0c Z.^8LΞ=ϙ3gх.\swSMMM7Acr7IQQ`<3t> 񁤮E948dh>0 0t텦S04SDKJJr!.ws~3s~1 pp(YT6R4J}6&>yyxo[QaagL,'100` W HG?LӧBA}u]Scs)3 FK'ݿG}믿~nݺhѢGB+ϝ;W]]}B#(@߻Av#eOpS _^^`.L40 CL-˂ YkCU[Κ5 "[SS<\F/'(/پ}hI; ٱcn j 2*0`G\ |PP23 cvOYؗ5gK`8ODJIRf(t0کl`qz{/](1 0 Sp`sΌeۊ֍S0P2-†'MWaLf`^K޽{ڴilEE /رcϞ=/ޥɤa'ܶm[4hgggUU̙3pJIs ΝRn~GA2yh@a[L rM}O<͍ҷa>ц#{Μ9;J:&Ǭ肙ѱOG C[2Gd,'R _24_3өd8SZS3AeUU4s4a),y&*$$ez%w}k$ 4G '-13X/Ta777/Z{j R(#  -//j.ԓ544ŋ!]]]8BE%̖G(;j{D"-.pQ!|ҤIK. ‚╗,Y^0X, 1HC)؄,kGa& ouk6щDt-IkJ*ež` Qbq3҃9H8O00 Ì6 jL#V`kn24aC nC'3zP׿vme(*z`,?rȴiH=!sG޽{3g̜9"(ݻw֬Y0`/|SNL%'N2.]WW'A)Ğ={V\yYO?cǎCR{;ׂoݺV曦&ĴыVɇet̵XCT(&~HYN4EL`+r#mLLZt0 0#hA5|~EpD*vWe - 'tR /qٳg/^58 E g2TpAPI,dŖ^ mEK!9P/A TW:.J3G\F#Yz͛0Mx;)mi>"33 P3H+>L[M '|"to9>Gq`acqwldY,CƼFw/  ysݹs'IjSSӄ RTgg'Na2$۷oʕkqZ*?%H V4[VV[Qla8BS5# 踴e˖a`?|C+NҥKں\驯BH$ .--ch666YRRB]rbWVVRLpEE1ۅ0 %09slܸ@!~vuuu^,8Hl޼yժUh4J]8[spgg'>mՅ0 ]1x煴˲t]4B>ym&p`0SO/-Aў"q w8O00 Ì:({=ET, P^0DYzzz؀< 0 3Kp, BIGG$'P3/@yez~(Sq޹XQy߷ni]y4BDW#dQ3:k7q}I@P4dM[ߪ_wٻ•vGn#O:':nwԧ0/ z`Lpss=3 0L%qae=e{{{\`?M <ꚦ +L(!yqS6D"aÆZ0 \pZDR._~eÌE'Ād*Ǣ aI6*$P*cB%.8CϨTš ݢ2?yafQEk֬ikk{饗HDpB@фwb8k,d0 mLe :T7epY\ ALr[EKZLyafR3 ^n݋/n{2iΕB%V!6lT,䵗JshIb鬭4f+! 43ƐxT Mc3O0 0CIO?-,h>QX!\ZY*D C MVQ^(,F=8-l/"CV @,(q > CUێ`~p`aL) ф(@)ekҫB-\JFLsi7N~z:#P)p9l1ۡWd1tcO¹܌S\baI0655AX! PCe`EQ PaD*>BUу%ƾ0Z*yXih4 %%Ec/T.`a0LX,CD"qCC=<70VyafhR3 /x>+@|- ;::DZL"Eoo/EAiۍ~.)bfjGCo7'aa&`ChЄ Y/D*[n+>vڻ lٲ62 q r|pƍ4i2`ܹsɐL&/_N&L7o޴if̘C K{0 jxT) 15C![ٰCHs`aT[6ꃔwӇ9kljk#~ш0*"ؘ!TZjį9s'|p1 fᄑ{ Q{/B)@J tR O BpVPKFh駟BGCںu+GքB4(ف?K"dDfM#FftcC},{8mpIǛ/5ݨt+B 1s0 0?2ykm/ksgum` ؜'/|%g`=ܓO>qF-8pv7P/;.E/ v!EQ`Q >}:åK^p̛7?GxnqŠiih9s0ĦMqڴi8{|?~͠ڋ-J&9r>'gln [L&c }p<~xjY33_DPvЕ*pXf\K~qIY0 ܸHzI ۶oq~2kd}vwwcb6Ō3hQeH0Ek@h/^HuF"( <P(Qjg N *~/NoiuuL!_J85o~|xo3# D"c g"a z&x̙v-Ç{;g (!>d%p(+0`a͆҂7n:uoj*x,YܵkWuB"Pwpk =et{۷% +h݊T*L&Zx9N.BwرgzTi[ye oG5Ð;AۃZ/|:y=ng80t=S U;t0%uq'N _~%ڊ7{ȑ &q؋Cj}0#L- ?KR?8I YQTUpyO*9 6p4a-`I8apv/ lh}y]!U3NB/[W_RN1&G_{5֭[3pDfx<0tcǏS4'O-wmwEGcL*L/}7#tMh4U;Fzkl#vz|!G͙;;ONŎǎJTdin0 0CCȆa\9, μoܸqرp`0  @m[[[)xX,e{)Z$yQ*F!_ n"Nfs|ٳ|T.W+Ტy|b[}YAaa O/Y[,zt:=cƌm۶Ap(H$_ Km&syrksiR2CEYQG}֖ e '[rf29Iy Gyh47u 0 Ss~UW{߀%3vʕ{kggg\5kJ"Q^x1eoo߾lٲ`0ӣ\K.uu+hr|xtvM۷M瑺ȉ_4)<9O00 I˷zw~ȃiqӧ^wvϜ9Se$ 6]7ө&5k̞=lgLYf`.bXOv3Ş7EŒ cǍJt\ 9yk>aFg!++u ='D O)-ńi矧 tRa!3-%I 슍3B]8p: t!ə9@?Oȑo\yaz_aa0.F0bE*s^ajZxݮBK.iL6勥`0lH*-bNbC@gW3 0LmQ!% 5_jzשYNN'7T I n0.R;.;N46f<1G6oެH3FL%b=q4JMO:c+_Etb8T3!l8+*.ȹ|\ة%Þ?Kü_$7z2/~WHhո{t8}Z9\r%\^/%"!G֌-T&i$f,1x*t!9T0.l^M5h؇flNS{p2\X% e&uC1Ǐ6neYh8r.K.~KaflL$ WEK pE |O<ܹW.TU8d:T]ӪW ,˪fڍn[֊+Rhds VR}TP(O9 pBVy_#K.봔!M)LR+^lW%NM+mPnV*b\ov,k>V(zz7Uni |,% uttקR)ߝ䭘9\r%\^l~K1uUT8^(_'rYd{N74 )֊..2}T;v@ JT*t`.oRQ1Oa̟*<~ι^h@@PD64(qLa*S3LjJL51$[ƙ@}>۷]0 GŢz\{QCJe~_Lnr&2T6{]Q Xx r@TRZݎdV۳lVJ2l6NS3c#=f,tD"b 67Ϣj/KTP͖|㨩Ԫ&7M~rj%7'oTQMBoWrc|"j5+o icm XLyܿ6 +Jwww>fRv {M ㊪\X\_WWt:-ϑőp֨~>&7M~{sU캯YU&NPz+6PY:igfKeĒ:̀ZX#cɒ%sϊ+VZ|5kȣxPw:r!|\-{x6Ey1eh4h zlGI-'.&b1 !8 уAbV[En#][(,]$P0X-&IvCU79[)˨eR$CpK&͘o]Bt|&d2jh"Ff(hr% (lHh#(ʝk?@i^2.j?8P&Vg A##ew˿" T%_ce&%}nB䟍֐_L2$L:1OA CQ$Aڭ++, Ny_^$,m5@pxd>OR'P Bww7@İZL6>3ΠODd%$֘x? HE8_ L r|:s 8 D懻8G;r[.q%jdq@B:=(=!7}pʨB +(I$6Vkj%'D7<pѢE$%K ZTb4תY0aǛd ԃOODQ.B1f\5jRhQŰkZogi_gGL655535=^o\+-?88(A_.)NMG.k9 x>=5{@B9¥>^l) ߃?vM&'W,e[c1DLIhk˪(s ʕ+$wphё.x7y(>@8"k"|bTz`V|6GOpܒ>dftAj.Ejnh V9m:L2$L2M͉Hb ۝6`4*ce@Xu`VRCrrr۰aSkk{T.p l6y 0׿aUÍ˗1d 7c˗/GSC@V.W8dI w8\lV]a($Ƨ TŢ 1f0HWWgM7bD… 0dDƐz*np)Tz䯧d [[[< FS6ڈ`+b%4'u1 p"35t62֭ۨwرcR'xb "I[ ݻwM}w_={Ep]ti׮׭[eK]R 6oތNcvw<@)E3;;gLlr&7m~E7%IוzѨZ^5 Eঁ  &ŋ[ OCD ӳB ݫW`>\B!K#`GUI,$>%p|dX XJSO81H[^-*b]xÇGǧ-Z46!r A#c<4vOVmժ`ו&jVc0.\ܹs]=]]׎{5N?C{޶mhalE+( .[¯xWWF|/ЖtuuwXO<1yd?NG>EE ֹ3 Z o"1=X8 ۺ7zw/fIފm;]4uzz̓䰭-Fb_-/b=~Noc.;Q9o߅&7Mnr߶(i7Fι-$J$ +bXuբ_k $U*>ʖRJjրmJt;0RJ,&認jABRn d^ހ&1z@rF}Sf 8w#O=\_ z X{\| :AT;vÇb=?~LW56ǟζL. VZY(`$ Ģ4&z<~_VsxTno_zFG;:1/e0˂Sӹ|rPĖPA#G_HbVVv%3iPfѻu^C'5B]4+|-VtL,m`@ʠR;$5%Jz#25xRYS&"4ËsCHR6mD* 'D2]2kޢ]H@[,SbP.mCL)/Q_C.΍n߅&7Mnr\LMP^C bւ 4mnRVZFC E]+%R]x:bn--86Q.8mv͢4LvJEݻwO6`\%\FF*^z{XډuSSUhX2 J;mxXk{PU/gϾfvok{?yQg~/ lp*v?뿬]jj6ímell#JC_qJv9d23+ j\U;ݏ?Cw.Zoİ}bbh񝋇 $Kd&qVB"3d,^;,A|Dbxqrxh8I&Iw/ww5:^|xwPUfr\K8|Ij )Ӽ*rvS…j9 _ՌTIFD\>u&I&dI&% wZ!\UoGR 򌚦USvT5;=^6jup5Mtyz=k Gff:bղݰq](fR옚Z." drL:n8۟eꀴzբZH-7>_H8~FBAEMJv-oSZ;q{`VvZK8pAyDrj~w/be`HǕ&Ҟw-^~ݵZohë ߗ/FBJQ.v;ޕ?Q{gggH qB ('"r`T~/;T*U9LT+Ā,p,A=kcvgg|z"CO?S3=_wopWC2plCׄtZHz]z,U˨QxY"5(!*Q)o8kLȱcT+_ XҨTOO:?Pl|p}~u7 3qD@l`f]HyOndQZ\8a!WeVX[-ry Ghb>Xh gΜ9s̙Æf׵H )k,Dk"RУÕ3~?}Ω$Bgm* $dp$Ra!NJSD׶V>7:xSUթӲ Q(Gy]կ=?vzLn@{ ԓOŷƛ?ZJY{_+KܳO<#oW^L%މ 0i;fn|70̸^;o]|ݵswU6}_< knV]Oo9OqlG_78Uy/p!%!pr+~m__VwuE&f}vzZ: COD˦h ׷^j+"qn x+G^""v=aw*.KبWgK/notlPg7\}3dL^B +R)/Zo }t{JO=N>?yˍ:N9s̙3go Ό\6λ.2sLO\w}*(DŐ4_ߝZ:qPDE™^:q' Z) cqIl4+Փ1`(6$B b~j ,w."slEQAq4I-y.k;bif&+Dĸi+53)=3M"GLѬcwel/ZfuNxB ji3=TZb_7 ZVip,Cs\Y+Wv,͟FYnۚ9 ;Q¡{rrםx~n˗V^۳p.rù|6,56't⨪k( }YX:=7֢.v2{;c;2a3|hyh}dO&-?jT$ATm +G'*r3 syy1L,ɅSh)ԫX<4R~FsۗosO?;93uć;fP3gΜ9sy,f4bt";KcOѷl. F 3hH . :q!`n1˲H\׍`l=%n#CztzdժT*5M$@ʲ8i6[@-Cdr^mXʲL)jm9mXQbJڬP,AJr3|Le2ˋ(NQ `.H %6`0dY0p:f A"3Aр! il12]rv5Yw}"!Eq`Fo,Ixfrjt*fz瑛30: W,a2dq01O'mqoI;v^(|\JCD~5y+L?fqjM0=]$|$ _X\# iᥱ]H"g>lؙB5zA8ׯC%j d81=dII ];v8NA)pr~᪫\CVIQfqbձF6Smua߳qV,n 2[xa4)bVo}w߾}yBui6+PrJχfQLg(-O/,lO:8UӂfjFbiq : q=Yҹ|R)& WHJAhj16Sl};|lH⇽3vzO j4 ڞG^WܳFirja~E:u$:&2cӴUxU?{mb `šɝ~Y\ZFWADUtly$pf}nDF!lZ1Zw~IIR? AAS0DBQ)Cߏ +3eAl7afFV7,OHTX1YuWV,SPa`nמbQ41S!@S;2ݞ|!Ӷm+j!:%')Jf 8^]wYDVzBӚ P/%=: 7c:82[P^hڇ',ƠjzΧZΥ'~VD*vm X,։3gΜ9s̙3fN c[T 4MT0&l:DLsLjm}S/)UM/evh+n %b *t ™&6]Fj"%2Ӻ[({3gΜ9s̙3fj,9pܥӥ8Cоg~aܚ||I\JN.qkPҦ׋(ѸY3J}!"ztq2k-[=C2e6pj߆ƹ/3g[~`%RRQʢ틲jzbWo|gG%J0r4VPZ,GǬ{ވeW8ƶgɳi?Oўs{iE\׶͜o3]`_HGSХi-ɍۖÞyp Weqh"l\ GUH#/mNY&!거|,ߖ08΋׮ټǰW,d^VgqVo5z'7d vy;Ę^-c>O n~e ")7 ]}B"2#! \eq/$(׍#jg"!k3RLc^l x7J1i66\\JηtÜ2as,+b-g"Y }8k (a!΀L |CW(V6n˟&#VEԻ6&@YslP >>e,luێgƙA\zCv1F/_>s_ c>o': cG-U5z$\ MPIENDB`mondrian-3.11.0.1-R/doc/images/workbench_get_schema.png000066400000000000000000001736261261646570300226530ustar00rootroot00000000000000PNG  IHDR X'tIME!";e pHYsod5IDATxk%QqsgffYďG~DD EHHA? A$Rd2JL,!8Y3~U82tlӧݪ~O'M'/-W_~'/y$ӂ1&Ji$sI {G60+ C w @;n7V^Ax. SIhaͶ?N\6V 3zƊ«x̃Ufi"v]PF]AdW2*Mq6MWQxd͋~dM֟ąa1v|n8_B2; 2}j8_v/[Vm4/4%t/ݼ߿نu_mFVq㑱"VRץkQO ǎ%ɹ[qqKj0u~TA]*nN K !`%x&S>Ȕv /F Ҋ]+-ijHMlF>'> * GаtK< eq  8:k DzDtxjd#9S'v0R "3p͋(p48oֻ|GhǨI, ȓ|gD߉\1шNMG) pE4%*:OW,'V?™m+g,0-550ݸgo`v%;yU'o)V'߭F kڃ1t!i_pHSp=VNGԠGpt6 `G _y>xvxpC*(j $#3L|jSm't"wmWsGH!D67 D|d80eN4Th[+ B4%hZ@R:NoY<] rK]۵]۵u`uZBQ]YRg55yasC,2QRp(mKx`y<ժs芠a [ߐ GW.v6Yx#|2*# xn(RXh~=:0 d?执cQ]*ћ-V a ɘ@39MޱD_El,@<^6wev<`c߿Jn2slk!բGsTi/X=%d)abfy #,h T#%ㅟϙNd"lSx~l./oQsaDs$LLz1=ܨ6|`7݆7ݴ7_k_}-*!?RWR!Jy?QHNg,gJ~O xt8bGhRq%D e!R!UfE y( q7C_顁MJ.p>@=)X,>k/*Xf N\}lĽA,AF—꧘okBgqʞs*nm:%h1qMV1}#D"ȼs+#X8 ,p}X:f EN$@j&an g.q%O[rCF\YftMplO}scf),PuJu7+^a&eXprZڮڮ};ֵoі})@T]&ܪvhcqs }u6D89 ƀ0:3;S9*r.9M%+E(5Z㕌1- ;1QUNy2k+uQDB"RB2@ʈD9eQJE-UzaRTP/AtkZ\9@dpf0Q?W;Rs LPH![JJ jR4F7EU/❝0HCXj*2rLcܖRɝ1M͘t<)V+ .v`J-Yog.xGFJ.ݸq"+gtrW-`uvw:y*GI-m$7YOY^o?ów^H%,f'*jWjo!*+PXJ.keg}SyHl>87%3eli'҉깲̏g׮,kZ=GYv`yr0g` DYd|,WrG_]N~|_8V2=sl_8/W уkP ڏ{#^'> oz 22|xe`b:rԻtw~phó|xb_zxQf J`t:%W'35I૲\H18c˪ [:PB`0,ljˢ;`i$ISVVbㅩ38^=eu( d,$K,‡HN]29q 2G)80#B @j޼8ؕ*3_~U;ӯoyqׁ4NTA[}b @@rBӣm'Gv헟'__uNcѓWj\|t(Pv r (W3$C:O4=!`kDN,d:j#t|Pl0mp;Of&j&>K8d{Ut(LyyW!QDh5=NYt"`)uvuW1; eYd%ձ{m>5?YLW щTJ1UySIx؏b eW!#8KQ("Z%E24>ͺ/ѐP %reuyXf=% PB|K@iUJHJcJD:j|:Dھ۾?? Mm)}BXGEH7"P hlb@>V|q|X턠&I!H( 0KD(Vz~\6q8j)&XJ|q\O0"V0QUJ|hTO89&iLX͆jc|WGvvU}wDD{ )UŭsLqJ<@2%+|03nrNT( /fui_123Y@vA<וtĒTЫ){]KDxA3LGɼ{PFƦ 'Kp Va܂*8)αWlH8T6Rs E_?ZhSߙ ө6FQ B-%fz$dZ}K{Z3nXl!f Kw";<"5G0kF0J2S1RvX@T8I&p2S9Xs|~a*s|ADɕ* iT!@"0^?mkK`(\cmm>KK(D$Xq) '`2/E5CVc̤bBJ8dI,BАTIZ g"I 2r)+ޒ?kGBE\QZ؜pi7*DaРu6#I? 6'[V2`lf_p>ܛc!.C*(HZf3IT!B%yGo9˂(SW6;Yw: G)K1URخy3rU"|}ge׶*a Ix91aԁIgV-8Wf#"L^ΐaAb<@PT7BQLPu!_"̄NXԙјiԁشBm%Wܻaq]?o_]98/W̳ج:\4Uh$w#D$Iy?91Ш2 |dQ_)XvV$SÐzE.irR, UDujâUPr=hapW^1܈ .sB&|)zklh3Vֶk0ɌzX0ڪlațf,s KP$"jB4QbRtPJҜ̄%S+zR𠡷jLiHiO8W)LcN54vo|sˏoւ$4q]_zQXg[.2#Mf&";~C@/P&/=E_g\pu^52 V7W-ߑdUtvNȝwra_'|NQY &єQX-x(%{;V GA.2 #ðVL)]Y±U) q%If*$gbrOi6S!4R`@Hq'rի=YdHzkM\g/ Is: )JL-Zڦ:լa(tåIer=cf5|lM@0>.bFj0H3AN}YǩLk,|Y$DFa9i{-"tz6[/2}iVZU8"*:0ђE~O&w0[هmm ?CK4BTD<`PD"8!J HJ"IIKD9jу!p$d?9K|QPZUidpc0,!!eA=Y9J`$KaY!i~צk/bo_߽88U⫡.!| 5Нf( U@$)\*R=SiNr9حȍZJOAV1`ޅD2fY뺆z3Z,/S|xfI&M%f+q?x| )ӵ 4۫5@[Gn`,[21xsn 2ٙ2c9939c#?q`n;lԜF`rϮ"SApxiM 4rI #cbIIf4 Fr:XDwߺ`})7PLυ-m!xNTno֨#, ۹G ˎ֣y($CpOo.eK8קp([:c50Ga&+.C&%qk uZk-V9 [UUX|{mw/}Jl۷G=ڑB)P(Ll`Jbc])8B&7(g0/qkUIB8[! j$ЈòʧAP U3tijM-g= qRmY@3/34-SOʐIpwe2[nk|̙g if#=9۝ lfZEgHȦдi*JF9'niLJ7|l[yo؅i-P|6 td Q|◂]O=rvt_~#䢣Xpv#ok д\[.iien]s~ѽz; w7sK&~2N< zi}8'cԜ:gomǼYX"Խh"Z)ps6>S|\6cӏg>aUk*ۛ7`6"lAZE#f?7+;E % ܽ0 nYpŽ:b6^E( o!63gi_~2xUXN惞MoP=!笀^d)J\- [ .Q'"R8[wm)x"ضo?z/ >j^DSDH'f%J =*Sj)Z^T怭 yQL˦0P9HY4QŢ`IQwArݝK[Z I  al" n8,@ q(ۘ8WLK"X*0JBǮk~#*N(*EW==>ݿ_0r3@}:D@\G fvUbcWB%.Xr!$(X6Pg9C @c; 4SSRcc-cb%4x%l KI 1t[Wr̳ E:ݹeC "4MR0ru O>W韰du$CXsfKV5⪫wG1;=Q7wκfbh5Ga9gxbyXך^vM7mk٘iHO_^[ 'hH;oi+ Q`>[ɑ[G/]yވe2 4?۰}I`:1q`㺛 vL5лw]-<'Ė1ey|(3/,Qﶷ\_. Wll.^f弄h[s :sTOh$OV\X+wwnMŚb='@>*˧\De׳PUw_ħ }B#N○pTѫZٸ|-SzX.8.w2" ˭ -Èi(&rLEYm@\1L˴c Tg0kضaiiu'jyF nz<;t`ԔlmZup(ېHgSiBd]zhp]]$혴Pf(޽ÏV4UE?>p\ǟ]~r˓qNNd{py3^};vÂӦR:46n2H'%nl4jcx*q$zvr<1D8(Rb, d3$F{}/$x]ЁWF5g%uC[%3ۧs/q%fLKt{diQdD*V6~LlYDtVB(2o1h0NaPXD},i>]>aDP~ XHL*S@wӉIhMK3iOd 5]T4`0qKFDy9N}@qăI7Aux jxgz;g#v( XK\0ː!R>G%#&"{WuDy,"wqkE}&&]VϮ1DX,ǏHWh:Lh^F,KqWߥLgI*gɓcb=)>h>UvNЎ6ACCq\L٘#2SLmٍ?"E:}橳~x!g?߮5V u: {-e+.s`8MD"Aܶ~Ӧu׮dk[:G˖t3zdu9 C3dP?wCYUQb9-8/LkM{ݟ/`Zi/EgC Y0TMy?!Ek9V6jmoib-~frz!DOSe,DHɫi PSpf}6 k7w5*L1qK#H#8Q.9Kmݷ`UnUz4'QceYN3(WNcYM X8G"7% z2j3nt!u~}l<[0.}mpX(cXyѷ}c 8֖(IߕԞyn65c}=c˖̻'o/-WP&/*dz|`n{V.}hٷ/IF,ln'^~s>8 wo|8T- ctJd`gp[Suy#2)VB cllnh@ _yi.h0=u*gek=xfُ>G@+lv[>hRa]'[ L*x q~vǛ8ʿ]?s,=}] 4ufC㡎C6A@Y岯#ԩhm]Wn摂OREMF9{"%Zq9-v m{FdkɩX_zf|j\$}uM8S( y<`q\0tl<ꒄU-gus!9 /kinivmׅxH{fAYuKx8A)嬡6·O+N \yl{Bx_wNi_F5w ߽ǀ6-7 נA] $ˁƹѐ`Q bR_G"pË|-7S. +ŃP2+Jaz[|yz͛Wm/?,Ϻ/3.`LCʚk͗`#n`a:n3.km7ic1>P<ٿr|,AwLoWīOllivIU/=gV}͘L, ph$R1&gfxf,o C<@ev[[`ās\'7^% އQ ~x gZdO 9q R *͏ṗ/S\xixf%)>HAd4}A3B)kۣĪX>●Ԝkp?bϕpD2} C F7 qS|Eb(|q6'ꛔIƸ{- D=\( H$հ\ tlnv0c ̝-MX}%8!D{Mزvm< C<NM b3ރHM)1}=JjHVAC@A2}f8"XpmSbC,b1Tǎ/ZˤX\9աB,]?gz*ÕgRPgS/M|$'Lcl, y緀3S.(&}MOX=D 8!{{P@6mH%¨#)Bo+Ԇ ^bNh:&A 9 < L(wgk g` m$OM.Tِl9|G3Ch/e&1aby<)ZV,57(Osi ,ϧ ,/4׬BhΎBBg_fրwWo̝{g6v " %""B'_"<# x1l)B!I {bd~gns3gxdɱG3rϯ;Y>E O~1~v|?xӖWj?*$oU0!Ȩg>ܘL3??LJd:)Uvv.vaz e{Gs$O ~܊p|;>lQyxF~LBI~D.<}<ϨGNoW"QOi4 l/O\N3K~2틟_?,Cå9m޴kV!X醙uȏ{?@9~@ ^ҟ^Jj|p@4=ߕ[`3Q`JnS; Bik#Jxu\S۞_xm,u\˷;,N%hykZl hfkxQa v.H ,=ȇ7^}m+Wl^[44%$.YRBZ mHZB~$|ǧEk D."lhWHt03K[n8}p88?[,gq%J;n0Uw\(ɓG3~VAFv'@*AƂORLb0]iD܉AJm%^ ! K`1 PZ,+[KVd!4A㘡6>jH*1뼭R@%1^#NyZ, }ڄdޒw`p8Vƛ:@6AVS Y :[3rw' TP?Ak ѝodWIcp0 (x/rA^Z?{?"Ma<2XLS%~[]Vэff~}YosoOZշ.ψ[tܵ}cq}tf[ϙjCIRqWpѢ)=8No\s^zo[z'Sg5E/ J(/PYr %$oЪW/KTpY=o_KS/(a߫M-"F K]|mAF&%˸ y ~}_~qDT?1vMB XZEP3ybA8^2˅)"eeeV%}!Z~WdG8UW2˥JUsnҔl{h-M!b=3` *Q;&lGHkK MR=|fKι,E6ijz5]] ۑIE[=>K3;$GT!j'ZG4;leE=/3έp = QP8z\t>HбZW1֒ 3NM!f-^4|uܐhHk#u2Ճ][@#sKN |>me;86¬TNMmKF4 RˢW[fIC{Tny_9e"RTJyan^+|+;}h̷9\h <qE# "ǭhdꡁb'wlR^80ۈʳLx~F^Uf? e([zg< Aݨ2A>ܮO_ކԛpkp%4M9eQHЧ6R ksu8ebѹmsda\bqzzHn93|X*Gbǀ݉=@m`L|5X"&;żdb"p`8%ajP]IHp`P?J%#D"klʃ`Q'3kP3e~wuexQ8LwId]#U!)-F b,#)5`e1'va,x3Fs#}y,񿑍bծ eoɁShbrܸ6MsHyOs&g bfCHx?~Q`@S13j0M7]%[{(dB ^rճ!/z>MqeYT;qWs+@,\ :Ij%l9{cm.^3rX#&Cw&q"qN%!w-!2LDͥ(ېI08c4D]\񮼸GTuu{Ki2P_* TH)ڃEKxI OoSyW c=[:f[RL#"t]u` ڨwA0y:r8HA xc609Jnw4SXmЖܕ"f7PNQ%M] {{V4{ʷQ74 0{y`AjmG3Y$euĀ3mu}WfMurjUiʤP-z9I3 Xy@ifG\shiY=77v++X*Y3O"j<ňCnMNs߼u;g7 =qԊ E!]NbwXJ`,`8[)ws3T^?M(T c_~ٟ{4fg1Dl,S}".^#p$\,{G|ijx;>8kM|P`Ud{>yobJXSu EAW:I2JbJviUՖϹ\3UEU F0E18!юߞ_dtQC'*APD TH5ܪ[u*_N}^{un$NW6;t`NWggtF&L3FtDC[XPl`6;@ XPƑLBeÜhQf"Ġ^iO^x]\ch*tcaJ-tcw-SPK2a5 p]e?~e~2VԷ.;A/k] !ү~D3w)DwUHWJy9Mmv(&*EbW߆~Ùn2or@]%x@c!EE UȼfK­` znsL(:dCyo(̨`= u.4EGiiY:NR&65^CeHw |>]c,ܮ'd2F[Kex=3níE V2s/ FR IsssMMM___yyfs|,))Ig3\Qfռ0S+ί7 J*Fm@vO/++:L||!e UUUC`/ՅVejY*˰?}} Uk:AP>ND`awN&CBfPV)"t&_eҞΦcX IG?"bϠOw.bU^y=0L`{zz.*mqgsPi VTTp յ58H&h[> );^7IW#_ >lҝF\49x|*KTfٝ[*1nʟReFnfzI$2̓%Xb 4lu&nl0 `69#A(?i($7 Tu7n.{!ӬUuz**,K&ru:@m۵ql}ܸjJz__WGj!={}~zvTe/FUUy=1::b1Jr~eӍΎ% syS,pt*.(6 8p1tt0)pr 2]ơs*n6ٰ g8H5@q .3"6̠t@tgp+++54 Y>qPGH # s͸RS\tsh}cˈbB"CFd1Pgg'vv"C ͚ڎ6<>ё1(2;>ʴÉD"aZ(]8T0K0yg:¨j _԰q#B1˳`8ґm%Xb% ITˬ6 =c&MӜ|ZslxƧ%zl1ԈRfZI0රZJܓ'gS=B![[^MĪKclG{^(bǁx, qǴpuf(9]l` ]W /xAʺ:uhVF6! rְ1B5&ݹ?,@d^q 3 ԰Ae,p+iJ 'a!h⳦6[Pga0q\@8B;$ \ r,j0τ2 ܢƢdhZUUU-2  j9=2AL$Xac ʹMtU]id ZKN)%X`k&+9=U&rڵ1cD7 D +dиa/gk%Xb_ 2CjThtc*.]vԘq֭[_~nӶlƶhim۫%eMMMDf*,/y\--WܮBtM8vnZLj}v˖-hw oڴ飏>.v@!} ܹsy:G:n'zX3^/joii3T@}͛7C/ɯ;wN'AQiz%>`|ڴiP?X@pMD"8C$of6g͚U[[JQ7oq01B$jLn1 Zx1Ý?Y@dT|E-!$4v vd/ P+d<,eӧO˗3ɓ'QA4Ga%Xb%&$XMeKk&LѵP̢"XwV\Ao{Wd/`Pٚ.8qҔhw8YQ{^ T2 pr7 r0I&Sީ3RMj} ] 5ʡC43qw Ma<@HKu?|ժUk׮ݻw/h'x I*f*+JMM $@$3–0 Fn=n%,B$[Ր$,A%-tD&ӥN] s!"ҝƙ3g2q^* |rJ{!%{LႏR&{}ag֭?-7nO1GdGdg"QejjaI @/ L^cR eLkfјgp#..К9s`ԩS&%h .O_<4:t#maygЭgx2Syv"9k#i*ZxpSGoަn%Xb%/x" V(B|饗3q/}_4:u .vZoR7:o_ F>ZXTub{.=Uzp{EYPg?CM'#GR,e4"!ąRH>Tرc#8z( πK)r\sd/!C>ޥx&kCE@S%Xb%Rn]/ꦼ=a`Ɂ7P vDQϿ3Z[G/r{dn\=\.OKK/õTۀm^GgښO39D:۾}Ӧ|.ˁeuuիW*]mmm4Uа4:F/.$5`-ay…h cD. K. Y#=!B,0K sBv2رc#fKmI}AhAwy ˪Uy se*5HNb[(0A4l7Ƅ ~'"DLE0v$nx"DP%I5G"eFAt3)<|r@ S;vXnv&/(ʢHQ.^H@rJ\e''Mc'cI qAX.a5K,[,`!+UU,})8U#Wtv;LUVרݞ˗zfCUEwd*l؉aR"wMV,K%E~l<㮻>dz)Hlv)hy0" U) Xx!LAD gϞ?~Ç5 {}xL6/X^#e4:6B ft!?p/F tGJxB|TjAڵkݼy3S={ 4k9́M-k׮eSN*hY~]w݅W'OwcXj씄v8 nB4q… 3f̘3gGY͛V ? i^bL I.]+ Is@`H˗'O[oIUKЈl{C%0%GL{9XXb%*ePi`~Y%[ T>t n)ftGc&;å%ټfro~yݬh ,P@$E{K)S\kiQYB poU'?H,UVP}Zjɒ%`/ `#rtdѢEW^=s }siʚ 㗆yE :SN^Aahf;>gϞ(rv]vH|p~(N~2/D,A4RWD`EN rrar|)|9_beMS8;w. #$f͒jq9& Q&04W^M[#<"7I g6 (ˬaWR_3|7pYwf|3]eÆ Ǔӧs *)+LM %Xb%*F9,Y~  \O5[Yem$Htp񧦚1su_q۫os?Һcb71 lB#> bŊK3=;w&$*pT8u{ꩧ@\)o`2"BuTj-_7m4c Bcc#P )̒۷˩Wx+/^8ҸBrbY8 h?ƍϞ=4ݻ5pGq{=<9s& w-vi>}^m^&E0a$AB ^d3Yb]v#X @FPD$"DJ4'y^ݧ⯮{=4r}ۧOuuuQ#k +t҅." 1@}&4f¡z`o0K.P8 LxK/W@¡7|Sp&J{'{^yb% (,tTI ZZo{^}՗_~.͛BOUX(b2o6p\C9P[!4 ?PϬoVsςu³087j7)ج"5p1y$b`;N=d:"\pG  |T,7Agσ5JN@v@_Q)Ĵk-p`P'j `pr>D~(GDjRP,TCoWVV`0#ݾ} j"BbȊP@5>1C?:Dp( Z >UP ِ4xh{BP\>4BUjg"0 G_x,PKu^ S4,BQ+'hPjFFTjH#ukσd*³X<س&aU #jE ApniAh;%tvd+vvwv^Ok4pQ>CH7A8Mn{.t^k:Ra qa&ߊom ϯHvbOA'-fDFX]]Ÿ tk'WxY"X^XXN톚`dg pA`m~\ .B?@rH1;7KTBM F%B,PM(@k8J@5&%(.DPȆf ZG!K! ~7 <}zgsu+QCPŐA荱&"FwE,8wbBS0c OqSx}jۗ'F34LFI%c?SnD \f@wlljV<2"&͊~2BRX1 {vm;{iG3>Q(ݝei[0*qu˼n ?<0%So96wıLEnoM겢R'XvKS f@Nnp~pxBh׮]yyL,cL:p[-+ B9הfy$͓|m]&P8#r8uffv6W- rv6\)!; W`IHHHp2D*NU9ʓXԼ8e UU+B/WYQi0}gyE6HBi5q:#ZɧKxReL*N?YUp"ښBz7|fl-k R"@9:&XEv:[3(*fE.7?#Y 2#Ƕ@/5Popv2uI$$$$J`!$j6\ŒAy[n:tj V?oC=ۤ \. d) 7b)RFS.,,WeNnSVjH3I'emn~$S Ѵ{,TbT)bB(E^cȱ'$~Id6(ܺiCB/ArEV04ͲS0TfIHHH4kXI!"ˊrFmPUTfQ-hTaUY\jj^v͢q}mfcOA+˂:J IU4MP[.Z\hnn. N%,)S%XeC$Zzԁ9y^NG Q5 %I{@Pe=ۉ0~+cE0CǍF{2Z`I,F!1`H0Njy;GSCCCBZѠnxu,a se;>ˏQP`aƑiEɗ0U˲VÌI%!!!E(w|b Y3CS pOR42 E3ʋ4L׬bOcQx[$sqxd0kƭd#iFuQ)M 3oߙ.*O|s*2Z}6k䃊ː}gU5Sʹ!C[/_ A˂{A$ INL5KBnJd2]XXдh45|٭N׵Tm(hnǣJ(\R_4tʕ+w᾽zTphXuk^~,O CoY/Ix 侕?+{qP#nC"jiųK%!!!>`#,X\Geqz.-SU>._< fs93y{e{.vM "&b8Xm F5TjhJQy4T U Px Hlޔ {=9ߜ^#?0f=g朳Ws|f7__*@a ez>HA()"V_}=mPaiFV0sܿ]C!oroSOON S:7,S|Ԅ)GRHQ8́ϔ5NAF\qhh4T|/vQ]iX=>f~X8"BX+C`III:Vf!h3oCq#mhŊBOН? lԱuEW#SWOfZgy˼s߽8v?wuWOw ҧ(d]Ԣa$Zwt:?_W| ^W Ci̹D5[|TXw'sԨxw1FWlZm/yg}.Q锋##+7|ȑ]ٺݮS*&~c'm>0Wq̞}۲K}{6R~5k'''~5f18;6X~-2pB`D%%%%ܕ$I0R/)CbɐZX " qQF۾AGX38>(t?lٶM`56MCV(!DMMC2EL'"J%ߧy6m|hN`jP ߘJF0͹ \.ElB6l5-zտ/W.|V^t],v;J33STC^7^Z(&&&֮]p^&*OǁHZl-;w3Oر6;908hy-Ѧ@:Fi#c Os&cgKIII}<4rs!ީDQU8ƌh:՞;%7ڭl bwrq'>sO}YwweZNgjو HI O51t|MDۿl[yUr!W0ug>+˜sƘeYaZiӦ~8뺐BO A0^{իWO9x 5M=zN`vݭ[N߿Q؆<s~XRii%%%%Fʱ)¥sY$cf)ڈAݮXeJ hڎ?zԦg+Wzf֛}^]G'#JuSEjAy0Mվ$԰k4%s"Hj q^.)-[~f8M@#GLMMmذ`oy禧0Ɛj BNkJ(jnn (ƍ?8ˢWUUHT'Q@{P|_Z'5:t:_DcEt⩲(qEO]4[oqD7^vōW {]/7mWy,vǃꆕ޷83+V](]b[#?#LD?bY8SK%Z qܮkTr:lk(lT.&&&r dsM7m۶ (0z @'ڼy3@<0::*:h=C@r;w|l* CeaN,U(:c=(ݱc`߁JlW$9ϓ:aخQ@du}Ptm}>^sq><ΒBDrtx,4tΙSRИkZ1918؞V4Qh[4 haMVX8?rGn\({РFM~W7q8p Z<du0 jll,- 'Zԥ*P d"YlfE`<3PX,fzaʕ^*('A68$B` Tx5usb+$0x]a ׸ ,MD 7\S(KIIB\1,~BU,T\Q?M?ߦW8$KD\xLADu}sSo4+ò[bU^uf"7PTb޻+WjðZN5ƋxUХʌ$ѨDE( rrƁ,+EyH T#bylj}\,<GࢰBm; ] ؀sAf.!(Xf&0Yk BqH#/o- aNySZxG[ JtpNǰ ci5!u:s###к@[rEF^,0T;NT6Ch fs(sYa1"-2])T8⹼mVsF(Ԩ +T*SWx]/P^C`ffRF%ŠKl}_f# D(t% }0e;a%Xlh `,  E ũA|/ԩu2k b /ya9grDM}<#hJlM#*F}V$e* &N$QGaőC_߃d\72hezSFTb>K  %v1@xmY$ *j qV2S$@QHl쥤&fe˨ ڶekZvKUuE$?\e%U/xRr"ب((PADnN8$*F*OR#ޱ]w\ga/Ҹ9 %V2HЄ =NXkZP@QUN.KIIIImp! PM%W .JcƊT*L;g-ԲT1 (Hdߌ##XRRRN%uj(5 0o+j(vZ(>G,Txi`i Guj,ʑZ"n XX4gNJz'*>ROnj4; XRRRRևDJUhRtZs< ѓfLxbIz3kq)OR>Y0ssE!QT,%^u,"0k&F$ǒ0s}ϟ-%UJJJT8xO))0NSaX*3U,FpgdaDTUΟ2ikxPiE O0pÀynr9IO㇯)))Tn4 2a`٨($ c@vƀ88?Wx|x ע^kd<pZgb(NwrEiPSWM@Υ oBK1Kr:?X'"Ea`aNmSEM0R MKGXԘf(8A!1X!'%2q0EM+ $f,Lx8|74\'GrPJJJ0[-|%XHOV HQ) s E1 8&-m\.B ݮ;8qÙlr12֭V˲ MӻݎFic  JsRX,a)sn@ D*oSbU7sopppbb0,s}}}Yjl6;h4*JX*݆T*O؆r9IJ,  @uZ C SSSPaff*8\kzz(sMua_dc\ff&Z EE3ARa$.] Im4 noTK2z^'oߖAx{}0_W{\D/=lٲ%''g…~(m0a/. !RSS;;;!۷ov!R<J[A၁.LN&wU fevtt X\oNڵkRϟ khEEESNENICr%KP]z뭣GR3@@/i1jR-7ꢬZdh?7]`)(((h\~.{ƫ?,@|,uK\#vURRƪ[`wgyZڽ{7c:"!!ɓ߶m ]CLL@.`B*x*++@~Ɍ!KNNniiׯ__ZZZ]]l8q"|!ٌ<:}4 jbX;j ᨚ 6;wnŊٹs'g̘?/fΜYPP`ԏBqqq)#[N ˹ zmZ䮠܃Ǒ\na\x^+>7_m6=t:vW^ o=Pg}VUU5ydXGNg]͛S` '%'#TxRQ\`ibXBf!Ud$=--M38(3… )x@T%kȏHB9!ͭN>M4wGdd޺u+MLEAZBE >g=tK_jfk&L彟|:z(@:4C$&&sr|~ 3C lǍ`2TIg*(<0= LҰFMgϢi'N\#6ByfAA1`sϞ=X)5c6~/*$"ܢTBd|%dd$E)=jKAAAA{8XA 3a+(LQ?**:\O8ƍoԉeVTTr0iҤz4BqYO'//!v߄@=\])Fq=5A'G G0%q-j_!xj̾acz|SSSvvu3`"--M֭$T/4<k$@0Ci0+mj;*Gd :~ҥ1+<dzDLK N3=="7o޴iTNGq/2rM=}yyCh_e #G0[#1F~~ $'B FYH|!839dx4]cM'`1󿜏!C3h yCTp7vtt/--5cj.Yx1#~< ?mذ5&d/:d,LTPxbWXlD?a)lO pY2E": sJp]UUUTTp8(XQQAL&ڵ 6g{ɓ'H%SZh"bEA.Mg͚n:dh4oٲe z-d+i x&jAŸ02ߊyy7[[[! 5}݊+>sLYY̙3a裏>v{\\^;4\X?+f&X5S&o߾~z\lo񝝝!77wӦM7o82 r|ӧlSaү:FO,1a􅺺g}VNGVZvI/;\PZZZ[[1.X!99]~Q}hG3*`CigФRPPäO2 MP=N߭Vcs@`=u ZPPgWJJ رlNڿFǨ4ߧC2CnٲƍI&FGGԠ^?3V҂A`2[UU%[eCCùszzz+a+ꗕU~-KBB ֬Ysvw"|8qށ[B}qni΂;~l=L:UbǏxPa^M#r{]f'*<¤f 0 _4S__jhc> zoDT$ZD].~6Ai鐖rHd HHH@ɫ01tjlccƽ( %4~xDg݃J5>.QTT3@N6䗙ql}#322%|CNNNSSSxx9j uAeD YYYr f,i6&_TTTp_={F|q6ڛ?hgh(}33Z{jKAAAa~g2V$q0Yuy!JgE}ձ`)%DPL:ΣxHZlmmE$&&Js΅DF %$ձ &H]c(*ߺu EoPPPhxEd:nI*ATHY;K,\~_TCNM]I Q}h<Ys xzz=]X X~kh:r0 82 SOjb9yH(x'%%A-f, ӌyP[:oJWxY#5 `Hd )yyy2 JPPYD%(ltS 1P}R3I &`6Y &O%.)KZZ2Oqq1]txTBߍsiQܴ8dM5V FX}7ލ~#=Z_?Me<o/= R}Uz!{ @fIQc +N䂪ݗ1~ 1Ą8 +*-jAB}|ŀO2 +3rP&677IfBiC6W !!!X8wohhɑs%yD*Q-2N6RwNnD6ߢq^0?)ښP#X `&d7{}ZӤ)"XP~Y8%8K$w ;;[KiYVGprb \QI=r$T] Od Je bH WYO2YMɀIIjh826m|ҧd 8%%90G3z28M2e𪰌XN$+$P!},kgJ\8rCEZ ]@a $" zd'H"?Y+V2, &!meڈ<.g̕phzAT0+pmssszz:vD6 Űj9H@6`Y/_GB;dkD?n2K! sRPPPPkpÞ񰭖۷n0Zj MJx|錌DxCfJ1i U6ggee!dwU#LpJv͆er#Slii! 8<Bb lY݇v-hm Xp3dybzm!(G?8lFZCÒ%K;wn̙9}D^hwzjY ۝:u5>>^('3Qx0W&չ =MZaX鬫3gΊ+8 g`dQQQEw)q*++O$1B|UǕrj* ?8o<[`Add={$}H/%T˟ß~j.++#===.](//|ݻ711q…??A`\.^2KK<#-@VZr$2СCUUUH+lƌJZZf(  J ϗ)ʾ~ 70?Xd`WWf&{Ȗ:00 [X2L6MX5JR,'9}X}Fv :r4%?ר4n-d<9aܹ?S[[ tdjwk1ZTMW^y|ݺu%%%tݻw=svI_nۧCӟ~~g6!n-r)QH)H$ǽ@`5Og9 [ Ν;/8n͛_" in s|#o}!h}'q+n[x{/_0.[t|LDdkk+r̙3s-ti͜9/wK. !!!Z߳N^,)$֖+Uĉ_r7l؀&k`AK/z46ܚNcЕ߱cwh AmdDば؍(7vG$'oO{A$`L*$$$$4Y>Æ|a .\@N9W_KЁ.厎5w6mڴwy ƦMu޽8}h c=S;44W©ɾ!B7=G|(`ܓBe 6pd…Ň ٷolܸ5駟 AWn]!/_{w`_WWT{ݍYj|mtLn>Χq䶵 {G?3o!!!]`i1,3~{]zj`)w܉6歷Z~K/A- ]Uvرve˖o( Y|ad[xiȡCVZtR *ޛo v_xTupA]xPF?*0sGP,:;uFF/[Da͚5|5!*T{g v | … HQk'8'FK4ۤ[_W٢!SK^>7aH5*+@8L95wp=t %>'7ɉAmꢖҢ~i8t h` 6q/^s2Ao!?CH*#d|!sDL:nN*wKOb89ls?Bm" q7z?G%qmU~,-a)$$$^xmHM5Ǐ-S\!HEp x[,%l+>=අś~lB |'1 @Xo$] ])ׯ.,Ofp@Z5Hb@v(TF5/d$CJca]g7- u$L T@n؟LM۲pX1?k6l11L Ba(c<8l1{4zc;:>e*68BXV6Tg'Gn& xmfneF8)c9HkFE%9(K!T+:Hi͏yO-IQeOcQ*Ωuj4t*GUv-T7iT%(e2xd%$|%$$$t=%tSJQH$GQ(2rܠ*ɑ bfႢ4F""#+lI.u'hF4U%T뚤J./nİKZ R)U`d?뵌+{%vGU6t&YHHH覕,Oq3C-mZJ&JeX,uj1 +l4F8 AV.dy&v3?FC$m횖K%PVN5*K!9@45຤0 HqLѠ P YWxC ]SƖ72;ёH$ ur/oeIq=5vu0L*V$XV5`xW#9lw|L+Jid̍>&*wlyj_&DUw6u\F*e^'~ )%IR!T9s_O96Õ/[6?ג$zD|Dh^$˜Gͅ 籏$ahErK&CPFfoR2JUQn((L\ePHHH%q/mkz5msՑH;Pcm[]H7w3rsS>}z躎2yo? #/;fiS +ǚЭ#]zUdɶzMJCi\H$Y ne()o-{>TmHDVI4>hÈ) 'b؇^uF"l?E# #XBBBB׭q]bB@BRCSNEN\3gϟ TT#qW! !pUKK "Af,Ǔ'[E|E!(vp )@`8" u}֭t;D]pT\FaF_]]]8"0Q`ի$Pȑ#9s&xy6 S`/wo} Ky< w32V9t=Ls܊eǮ<#$qk {W ],MSRMf.vAB smz'`-[?B?o^bk4;s``4Ms]!t ė[x&W$R) V,pzSLi z,[R|ͷI.5J)kGGN9UΎzjzodMB- ]L&@6/F/HՎNȕ&0!FGhɣV*IX,\iP(:t4<-ϟ?& mUK$IW)/Ի" lG%~%AA*ưSU)>/Oڶ8^(6IT7oZ]CԽlMi =~L Zp4"ʞ}{Nh?aD1|P*"" /Xx3=D˥!1uqKlێ-g3m_|nH}l^|^4(˟b0f 3~C^BBBBB'ةIQ4y$z@xdM}G`8ܵ`a3.mڴ 1+Vڞ?8m4``nh\^VI!7T*dPX%RKUh6_HoY?>3IRp )M;.=NEM.^#-4N<;ŬzJ^6' YBBBB)eYmz=S\IhYlM~[YΟ{-8xp$q{{{gϾ0p8gg͚E& }GJ0h4\UlDF/m'TV-Zt_ `:r6=esWr`0\ A H:v{+hLj˥q5lޖZ&X ~#3-SOPT@[k畿s--[@Ws)f3J9 RFdY>wkػfٲeKךwJ,-qj"quֵ@HёꫯΟ=SqFi?0ݶmmOiIڵ+ ػ'Xbyggg!3nmf@p8d"Q|ɡ\*沙PmVRǏiT KD5qHa-S'id2/i AWuQPPPPpiO8 g&բfP6H$vÑ\:[*ޮnLSӘ|r82]FlP&Cwtg츖}nx3mU\^]Sl\vuOxN&SÉ~ M>ξMW@nRPPPP}0l?񿝥x_nVPPPP0۶B޶,TU./[v{̀eKŒeu,ʮP6/V1[ _vٺݾtVY54ol2Ǿ8C*{Ze du]3Hm2[]^1X])jRv)x5A^ɡl*~\fuݶzJ0 `Dbe K7ZBLlt5GͲOU(Mqu[=!TPPPP0=Z?_r_߽Ca87Urm" ۂ.1Ne:. 3`m6yX,VW[[-xbY2*o(T&K-(Rڿ?w 6 3\ZKVIDZik.rVʺRKatv YՆݦb)yl+iۚU,͖O:\tXaT–/((((((otgq4KQ^k{/:-O*(.w+((((pUeCT39-ۆ].us3 m9v/K)RZ[UPPPPp[`<ܖ/%[/i˺`|Oe2<4 vEkbĐ bi*=L:3N}ҹDP21Pf% f9< )Cp8yi g SBx>\NL8ٳ_*b dB?NpKeI  K 猒i`IG xWGcBS&")і_&㍶Kу+̽3<;325\a8 Jđ6:8! :)N/wD! 9ۙ&0RCDq$:i  J(ׯpSAc1JH,455QO2i3gss35qWBp&zX$FhV@ u9BHy2$'`^'N;CmRPPPP%"a$1xrǎfL]P,+?~qdP2 b.Wnb0+$ =sD9]|yҤI'=`hsk"#D ?ӧþP8U[[W^ 1G׭['rQcdlyMHxԩ3MgRj'1̙3LΝ'NPH4pgLĤB`OM|TcŌH z.]D̅YKD0kt۷Q3HCBlܸQپ}; "CԪ!!Q,&L"y)"=)H:R\9bh#B`OqK296iRK?bҏ> ң t▄yI)8c Kjd?=$LțWQW\\FAsBg %_矿9s3ڵk_|XVKJH䂬щ4!"cobͶmێ9$zazB u$fh4S0aJIjżh3Y(BfpCĀ}}H+B9=cLfHY*EUP po{ dA^':2ǒ⁠TE_ٮ_Naeőiz(ܿi&ڐ7lBh"U>}: Q$bǏgTL,=x?DV@A-d?+XXY@BP2:fɒ%B"RY=D[lO%O? sãӦMCCΑkב\.pI4~ƾLe!~y㧶6 {'pٛ7o& Yx?3N8-Nda 텚9X N\v-Ξ=ϼyc|>O8q(Men… ߻w/miiAzi.!JzNPE*F 3d:s,Qwyx{P`(qkk+hVj$ajKvLvʕ+K/QgSEĨ?4Z%7Y9#4ilÀT6Ԕez]P7 `&RlΝ$x*;k.˖-c"K,pGƵW_}E!4!WTlE`LÑ ?c?Br"o`Đl&pm̙DAYrGuuuCVQʑ}c$) O<pWZ]U*6|$ |h"p,byCKe!S~Èv^UUE=$Z_W/^xʔ)ph#kE ‘7oބhQy5+rmN pKh#DH8hGGٳI( y&{oB˞놆3HVf(۷_re7nx뭷F_,lᗍ۲HCܾ>|ӦM7of:#+ٳG֓HiǎΝ۶m,}JD$< ]Kd/6-H|B4T#g> D_./ I8Zk)mY3ψ%"Iu…\(EyDMM 9O4 ЬܔӧO99 u>}s>;;{(]^baÆ8ʰ mڱc7AUVaBOVKt"e^PɁxlȒY?jkkiL؎f(L~|AqI]3<ׁ_|m߾AX.?-@k׮[OW$-ڥ_u`vatٕoz/ϑmHw{.|tF%2R"gbcbH;:*H$'-l&r&{-P1>c*!*^&f0/v ?]: TJKK) G(ZsֿZN2˵ xja׶5˱ !!>#SZy)8ŧ QSEB=9kaFTy e'/*V䢤dTwz^|w eBlkJʵJ/0IN`BꧼB*:v'o9ُ[5_ Vg`LAoo~Oʘ,g ;xaU252222v EHd ,p$ N83lM]q;t0 tL D(N6UiӦڕ+W.[xÆ '^U:a&BE3ڳgς;LɊM:adK4 w(\Qn)יDSoĚ8qxQ)N Er R3 Oi`yǦ& A1"5P>BWB1E7(..FU0_kL+E`UAARQӪ% A(g<6 (6 ,)Ӱ?]G hg(`i@QqŻJ<';P wW=X89-Ҏn"A#+b"KО^b70ಮXQ܃VOagpY) r_Nn$R9s+یܳrо<a;'wh. 4OU1K=dr(#rI!Щ7XJGu2Ny"zdnFFFFFFF&y+rJ@+ QGG,:+!njO-;79IB7H1Е`od QAB?;N*|vRgddddddth̀ss6~gddOT+ZKb %-t)hJM TX/v&@]cJS+Of[[mt-XWXtnmmQi#O,2 ^eo*~aFAAASS)@{{;|>KX\dxPt:x8&utt(*3dO`)w]]]7j܌n+W @Fnnr_.n:`Saa!<Eʒ:'Gunbt222&LpEjzP;L)WhHQ4;{, :NBۢQ%̹Qfddddddth[cgϞTzŽrQm0 < HjnnV 2jhl<ڵkn uTHfW>d޼y~0ٚ5k>]g}[ޝ_כC$%ť-pȑ# *B0͌3xz^pk9=۷o̙@)___z `۱Ma广~fϞ}i@Jhٮ*ȥ1'N0*wbUddddddd'egdA:𨫫 صke\OII2e D"NBJN)/'n0VWV^ͳCJ2Ch(@ e- z<β2Z9t[:-H JsP M<&>PIQQh-,WCrP-VWW/\p֬Y%;w*'xXqACPc3 ;~)#41G?`ʡ `0O@6/^NŋyO xH;eK,(L^^޴iR&C@.yx;o<x>VAP[gg'H0(ݖa‚?w\PG֯_Guuu-rFiD:{1jf@gǎEEE!VTT,ZHM12SO=EGD]HT\!&֖co1[Ta^Ξ= qRӧOӯ_4222222Ic9Î?SAaRR哔^XI~u:;alAA)q魷LNN FC|SSS]^>Cs-+DC[n\LK?y-׿xؿef=vsꩪZSo믿ST{s.]ݹ}TGcc-|衚uuɀPIRR=].|v߿۝|R 1bfST4 LzwO>:2t)}υx222222cɅ̸ƊE-m^wZߠ*q91a 8p$`#㊜N_כ;uꔏ>(--vvvݻײ1tiqɒ%'N>׼VTTPl߾} jP(/BL.~>X?\ukoN:_! Gބ]akjW]֥Ϭ #ˉ'$^Psg"IYT㈳ XLr\ȾX(qPSǾtuuy<V>uq.fffķ#9)mjƢ"|1q<i K!42222) C520NKDVbcd8 Zag?11!33$ Ǽ%988h5O\sqۛ384{2J#\oٶ{0,++'5gȝ^]Zvޞ4+X#{&+v00tJHNsxN+hq\!c 9 ;\:;JkmLiOHOKط|W#Qw?[WtOY mr 6(YE&Qr&XB {D .l0؞~z=9UmeܳӭjMKSIZKz\{4^xz0fam%2pgάvy|ugo<ǛF+t<:<8NQ,ҳ8?}t-e;_2f̤+_~7/O+Z*ÖWtc|_r2L04壏>:wܢyZͼr)otj *%:l^CBfV~!W`(^sáJGv}zʬ+" Y62$ tjBHSpM4yaVeyl%D瞽_"w Lj,F#ˆ@em;sb7J-PN>MD9bbTQyw\goqT}ͯ(\eg%NNyb{YnzFyɓ'F,h0U6]ҹgnSM>(>V܄Z"l^-O3q߿vl:%WwGϟknn7OV퍍 뵾qjp4e̒FR0 4:e)Spm Vt1D U Oy~O_xKW#~R>/1'4Mַ\yg{wg3 .Lq>tIW'fM^PV+G.nJ٣Vy4'>Oz^+l9ׯ_m&W55l֏;1z3<Yvp8>wl'S Bf,T3]*\OfyK$Wf 8Tm~-jaC2M%IčSEh{fhdyOS!sU_*{׋i9ͫV vpp8N[4*Sf,+m߫gػr~o{AI1IB-3-ur Q4\f_H?@]O'Dffi25.r=<qoٿh)ͅ se\(9RGөh5D4'\,gw>[\FwtRuvwkڹ#2&ځNJU-SGjAY^ꖗݰg oN\.<'u˱+mk2yc7U’UҢRRwX,#`XF` 2e,X,#`XF` 2e,X,#`XF` 2e,X,#`XF`7t-LUJh]q U*Vi)4 6e,X,#`XF` 2e,X,#`XF` 2e,X,#`XF` 2e,X,#`XF` 2e,X,#`XF` 2e,X,#`XF` 2e,X,#`XF` 2e,X,#`XF` 2e,X,#`XF}qJ8|IN$Nv(wMozZ)O,ZEY۱3#$&ǯl<Dzf䡨) @Xa L` ,0&@Xa L` ,0&@Xa L` ,0&@Xa L` ,0&@Xa L` ,0&@Xa L` ,0&niv]WmlnWjXa L` ,0&@Xa L` ,0&@Zq,ͦleJk L` ,0&@Xa L` ,0&@Xa L` ,0&@Xa L` ,0&@Xa L` ,0&@Xk)JGP[jW|RwL_+X ڥ-ޖXa L` ,0&@Xa L` ,0&@Xa L` ,0&@Xa L` ,0&@Xa L` ,0&@Xa L` ,V_UXelRƗ7MY)e(Xk-QU޸dUu L` ,0&@Xa L` ,0&@Xa L` ,0&@x+ݮv-Pv"@Xa L` ,0&@Xa L` ,0pSNC? X6Mn0@Xa L` ,0&@Xa L` ,0&@Xa L` ,0FK2U|Vꦭ:miYi}Tkv[_?XQ-7?x:^SdEˏ4M͗[nE۲U8Mp>ӱvWqU۽5s6_W{BŊz~)E/WP_=|X~p(.'_}}?kˣn/~wAlMg.V'VCܜuܺlƮoϿZvp>PNWk8f.{Ee<Mnh)Rwuy_Vx{2ۭNU-Ws}7ӳYr_O=fSkO/ˏJ]pu:nvXDzyXe;WO͸\[{3uX^?kUZo[ߛl,m/zؖ=d\sgØ&H_/M>Zvgz,FfgGg'?SXZT}vnqS˶뿩bjnouw0.r<{2ߺ-gOoM?xNWLmT{SQum^ScMaZ lyE7MJxh)[nNVot^-[z9?l][^;lyrqOWZݪW=:SWc]WݿrW^i_X}?`HcY?|߶.ry㍻~vqyţ2nQ-_sn9Ο||?dIiN]#\r5_]4xէ?q>NW6Ac.bݧ+}}aYrO;ޯ2=ʡSrNļ]Ye9s>|9~;x|uOaɍEu4~,q /XwBՆ~tg^\Rr|s7٣|ls`7ge_SO˺Ok7>ش~#Zg^_+QnDwj>Ջ +<=ܚK?}/[-XiIݿf<~{IENDB`mondrian-3.11.0.1-R/doc/images/workbench_jdbc_explorer.png000066400000000000000000006132161261646570300233700ustar00rootroot00000000000000PNG  IHDR:3tIME"Sq pHYsod-IDATxdYU~}^ֽ@;53QH2@BhbHT/F31AT0@DP'38nuyZTUW?9߮{9{O{7GfF.İ'n:5zu](Pc8Q@j- 7EKX!,a $3 a `5 c$c`;zaM=JD%gX‹Cø -^ V Jʉ 0,<_[`Wt3`4V3*-l4`xqG ^ YXaԴm.nv+Ҡ)a>D#3*g΁ '>+Rg>9{GIǵ%ЩSN:u?˥TZR cp4l(Zb?ltL.,6=˲] 4JܔT6K )˴K+1LLA- 4FLՐ- /@FIo?w`o19<4DAU._z~wi;Woq#~ӟEoO/$dBau 4uaآZ_?vvnԒ*wӘ(cI!Ed!Ԃ>N1X]G=JWa=q"7;<[#ܭ::uԩSN:ݑtBL v.`C* (j(* %t)=̭^wcVE@T;X䨹0N`$ r BBUa<kpV7o2_}(SpƼ'\: ̫ KѨE@PYq9ez x[-r܇%5aH-^&nϷ7R.BA?qb @ْ.lL?Hb^7<2j:W)Ǐgn li7آWM]\צ^vn-W:uԩSNd)`T0HqRHn] aPkѮ`8YA즽p {!\ªptk xyBS+|݅n9^ lœ)/YQU7/'"{=~⷟ҿ?yDK5Kl꾌P@49qF`sǹ6a\8sRm.Bq##"V'h(<Ч-`vO!.Fj}N͸@]cТUxjl -w|PUHs"7JP]z mn ذ 6J$y;-Ys Vtl 5k3Zm{7}d~k+++++l<@hPe+ÍEa/U5VŜ%rKËf5'cȳ T3br*RC)b!l5nLƑnipXc2pL4Z؈7F+Aڗhk1O-n~? IUJU:\ {# WJ N 4d[B|V,@;C-+vl5WmY;k)n_,+.hǹvX,Y'Dx1BgC(aD崸ݤ]\6! HSnj“[9Mv$yzP8Цnȭt_cC-\i;mlzAl6ە]ٕ]ٕ]ٕ]ٕwZ/@ V&`]%BЇuCzgrH➨n4paDx*} ü|&22q uq(:L%#5\aYqu i`~ygLHASVxo:!jo[\FS%c&M{YI5~;VC[^}\:E\HTRȊf%i&0G $. eFQav;)|cK-̯,_; lL?_kB->kcҰpŭWSk'c:a|x^r^C =&Gd. <4!nˁk=%l+AE!7viӁх&U(惷>H3RQٴNL;S:uԩSN:Q`^ HZr=쏏ﭢ'5R|6?t},TeDpE}shI*beErWk I k`x$lf&ߺ8a̗g׎%eסoiRQ]ؘS% &e7 fʂ7Ypkaz{Fpt#bj(S(N(˦]i-?eJ7`0F!B123tLO϶ h K]̣4­wlWo<0o70 Qh(,3[CFE}q"Ҕ(cCngWak9%(>1m)ɫl9G ,$ ’5}2[z%(_}:\N4kM)-JH6fTn"שSN:uSdx{~ o{.#\d0H?_)?/r+|."iJGWQK{7ZՆb--/% Пt v+m.W&љ WQ&ŕPnmʹZWI+L۹}WxKRm؊?sK} [1(>HBJS~m'm1ߒeio3|9Rxo d_z-jYvQuҩSN:utgJ=]ڛ,c±Wlo@F@b!VQPLP]N+S[ꢆS}ہ˲Z)U9ܑ1L I n0  IoW-XOQ>sb22 ]8f+́+`c( Oo&t+&3o@C&Z5!}QѨ^.,Bp6GIC{-pUI2?4KzCL/j\ŅRscb&n&ٝp*:uԩSNwR]٧>x<>8::b׮ӛBgiY1q!rUZ|k 88^g>o}jW=W~+݇0hdXW"P$ $=tUx⿠X^ۿ{_MVO^~PYe^d{wHO'HC`cHIls'0@ Ȁ ;(0m")n0Ix:{1ѝG櫭owgwzz7=ߧ&BFcpv>M 24)$~0paÏGXUJ&xK}'R1ŲGfB=Q@ ,6Ry彋 eB ǟ< Wշ^}ušN<cH QDplTLfgzaFXPW{v47-?A/Y\ v@"'!7z.(҂*$}3SuEHMb36?)a DbL@"(H5-^!:VT6׶!-rU?='F~)RH"E@PԍE!G %:AhIu}B:9#ANђO#;w,v:`٘ɰ%ɔ5ŢTD $9n3BYY&% i#%@,wn0#A׆0ӄ+#YYlqGƚan2Nz-KV ڍC-C^t[ *hyΎv>zYW=k?׆5- "E)RHX101=?B $cHDЈ1U,QD }ExݭB9ē9`TY,4m++>ά2XR0P;!HDP| ,\u$Cv-65߾|M7n`ԈJ )H,6XA.$qeP wJ%@2ZE/7/=p=uD`~n^vQ;\iڲ=cBG߷nBgOn1XIV4PdD( C'dUCrA¹h xhw eB:))j6\Lt>0ƴ>T& ݡ:qtybf2$Q}9g믟~NI;ΛUG8Oxrq'\ %8nR.Lw9qa8'+;Frq FU ei$\(ز^^7!ASIh3( L]y*>Pg|}qzԏBBcn#>ƒ+uX99E)RH"ŗDlVk U8`0n`:(DR98Dr8y #4t34vq7(exUN^A,xҘDF W)$޶3?>JuUO\qZuυ 4Ilg۝e2 t`R-j"x)l@" KQ?*JX<<L^|ړz[.l ?jTk=*HwQe~m'*-]}w.ZL,#uJpPo{=_B+\N[1 DP0^NRBDad!*4da=cP!9"_N~} RZJkK3Eeq\h vtmJ*%L9|\tۭBJݙe T?hKte!7S޷(WOMϔFDQ$Q.Y+{mZV3 F~FM<(*d \9^3Lvg IؕW3d}+KXuvF*e-ˊTFsDTKwK/ 7r)r)e ;銦00E^AD LeQ7q;a$FBԄI()e^K_(M7 * Q xwcKGƚUk~13_qؚ=f>P֎E*)R|Q 0ejK>oP֨=xvt.N~45YǮ:SHKsF7㺚QK?s/7?ٞ#c`QΡ)/ {pQCIHٝzXeϡI1lu[ٺTYW>kG\- 矛Ћ몋VP^+.^{E0fG*@QAP CHg" 1IT5"aa$ϛGjmxd}w;7>0ɏwAR"ԟmMFpKdhk!K+ѳμw(3~)_=@xx 3[[>-#|L 7Sp/yc?Q=cpg_\xc྇Ͼ<+yXٵeQ66 gf[#Cp2u OA?cfVPִ߫kv8Fev+l/l{#%M>}מsnϵ v,UMܕ񆵇3 /l+^˘I(졝˿\y(/9ڦh뇯YG>=C]aʿ(վl( #F/\rq\@% 'T h0!jn FDed`f}ꪮ~5?SLuuW}U/1mkV? 0~p+}u77^Lm0I&m9^MK{gvo>>>fl!d:613@{3dHݥի"'aaYAex30`+U  r0Qv3R0U2X a4Ŏ l jiV`nphfIʺc ?HGc؇sQ-J=CvʄZ+B Vk]LvvlTh"OctIS guuMS"6\E"e@Wk몶T5}o88V^wc@'kZlugN}fnXv]uϸ*lݸ Y$Q [@;̥Y\CVP-Cl1/+uk)>񆟭Z:& mH|V;.dŲHrݫ_t&hbfSqxh:%M̀$Y'|%ܝ_{h9 Zߔ蛿޹|hmW]z fr%M"dN 5w >>fL"2y ͐9JҺcm|*KӡáT5\)A$^ǫKA6 Ӥ`pwjGGThnkﱢ!ʒ@NJPc;& 6IaJ^yXX?0> ᖖB\|r # O<:JQ/,WBllRؑ8uCP/ &dΆ#|]s@&_)hҒJu\\Hd^△`$zw>'Y (֎萢W[alPRs )D':M8_'N@rı!;HB"mB _ ¡CbĨ<>oksM^:rbJUAZ"6s`+$ɚV~."dXJ^bP@8:en76S[xE0@8HxBu L~kPD)_ p+"۽ 86xbLwe$d5 f%(UJhwY(}40H+-p5#iv ^|Bp镮M}g}g}>r s8#BBlg\'\UM5̨d3d+`䅷oؚ%tHQ A༅M f^r F*l(m`Xlڎkl$ySsX.֐z#IzG'LwKۼ_'2MLvtdJp2p-`cRe,Ӳ\Өm842 )>.z#R/l~dZ9 RB{^~ō[6ٍ%VDQ^ҨHcoXR%HɪNE"!SqKc 뙐bY#i9D1oY4loɗ-mo<] yWŗZmyas=cԗߚ9ifG :(s0ͺn/@a"<ԀJFPlV1෯~32 fx')-ױYȤ!3p  ñšR Dҙh\Qz\P'LFF8XȏaػBǣRVL!JpH2Kh^]1z>>|:2rA$0k:j g&Bk7o4gg}3o#|KPrU\[vU(DX v]Q.5uH4B"g%Kh2\bkiۮl6]˵jCz 4=h/?յO~j^yƩoָM 4Hp $xRZ6X9!T^C2IY'#Yornd˓|w"S\4͏uSOleׂ\@)BʖDŭZ`c94~?/5M}I/R R+ ~<9ӡo66聄_Y8)Zv8?즛߽\'@"/҄ q՝{R_/wlu#ᗿ~r޴ENlr6'|CB|*^+ =e˟}f C>x bq"#}>>ܷma-wwl8l JZ]@4844~yc;^Kn:+FIU,4ó4Ĩl(̔LEo9G@!rA\Fgw}Ç>| c$r1xPWHaZsRODtCBP( rJڄJdrڞS3RG") tU\GlMaYFx6fj&K\t߭Tڳ1aU*]3 `ӆX#jAі My i8kK`3`"a _|kti6>'3 rV z3ۺBb.ֽ* Hp.vŗetx=8zwv#k 0l>$c n|o躮Kd`_Ιިq2(aQSd ̋|\?}tz0%Iup KGx$4؝)Nu׷g]Үd<)e5,‡>tV,|80c-$ :p7]TKQLK`ĐGW*7K9p]w|Ç>NG`"R %#u:u[)F^E@cd-d,/# 8/t$Y(knↅx{b;<.ԼI.*"B<"X Xk@[%?{4`KrF{ lP't< mI_~S:C$kn<!eQlD0h Vv Ҍ L񚊅@3CrXgWǛ'AUM$*-06ȂY=0 a0;uF{,.H:x0kU*d3?A>oH0Gnqtl~%@-[O~}jr {m^dˎ8rO ̾jeEXMmb9S:z&(f0M*l~(+HT} `ꡞCB2}1hiLq쾯`p{`)Fmc'tdC 3Ϣ\wUϠK\2 s$BA)c%g|{>efpVC\^FYM" rUds0LW̽>|Ç *o\fM_4ShGk*_HD&9.V(0C 6kۮX_tmׅ5v7)g; 1y'* .Eɪb͋LIV%$.%)W-vٻ"=3?XrZiGYd,2xd#HMޕJv^wMnxrLpr "BB)+,XaXb$a6AA!"Q'xM~^ޫ;^ZA{T}Sz*Φ|C.-N޿\{+o}xD-D+ q \980pR#Ѳ$ICF%9l ?J#OXË_ϰ,ff֞[Mk9NgQ49R0xzv:Apt_ܮv{W *J%q./~5eQߐ핹 ‹_4NnVel…sQWѬŵYLd"qennWyz:W\Dwxa܉7oaf_4b9ς<+|<0~W{ dYؽ͹KCzs*} g^ ɧBg(vg㉭W dzG* "JAz.p&xam5O>d)tGO$͗I"K,uatnu[Vխ~aR%̖yz©3 Ɠ")idE- +Bi@fy6&)Ϗ鯭YdA92 @ԈIvtuY{g3^V<!4c%Ƭ] 0X U^A2 P*>x@)뒗~k¡k.9LUCq#kYxxGX'qVA2Ao{@' `\ ·b:*}}"Hx8 k^3B`O:nd 䊹,vnu4 T.CS0h ܷ49;EQ Դ>B4jcǂJ @.ceU2&%i]mshP[uAτ~%H!?5v4yL9Rhjͦ&WG;Z dAWu&&]'–t [JGn B.Af\=]AA??M]}V?rPӀI ǥ(H]co\ ߓI; hw5u};گ 0it g+XIiw\0 8nt0H؄9#f.h͇"IzVZiVZiVPk8Ƈ75ܿQ*[{ċwD^.Q|_z^ciqϬcSjf}wg-xWFn[uWA܅Pr\S#lӃۿ]o}yD}ޠ{g{?=2[6RJjgEXBBADY`$$ 2/e}.%q?xn}T[,R $?HMd#t ~ǖ2EjFr)PcP jT?8~LbEMوGfbE 75%c+M*õ{Y&5(N!]EAZ#q 9\#w' \.C ;k,4 =r'&ĹTɟVZiVZiV>-ts-h~cvp镺ͩ O6&͔uUب2Kv#^)Nvv~5G=q<|l|8 C]#*a*H2 -sQAwr(s }f͵$-~&`EݣPq[~w73Rw-c(Ni> 7G 4>Z:9t38Sprɹ1JR >X{Tgqc׸J ]g.D<%,0=B8ڣQX@q\R\Ѓ.ls_f1$wq0#$Ή~ b NN(v^ nXr6aO%u a姘zȱSҪ<%-\B~ 9;m?D iڦmD,.έJ+J+ GI^ZIz#4{5 7sŘUda[Vխnu0wA]aND 0vL=D8]¨ " D T`^@ 3H9N^'~5[xՄ0Ea< Dt{:.ȅWV{!Y`$]^jXQ V[fO.? hW(jnA’ #G9<]ȣ* AKGΗ(@0/X:VIAh{>W 4x5{j;ūz$䩺{m|qϤY)>cWm&+ރFt]PKN/ ⥐S@4\<UyڒGhw!B9~_n3[iVZiV\Gmjl"zN1u? *ntz+H#Xb';!Bny {I,ux4q A]NyD8MztZ.Ǯ,ֆq T*?5pj/bJuOq`- AWQɭ$+ $NiF4G uV_k#AD~esU+V!u$qxU* B:}XkGϭ8NCuF.NW)OѸnu1~sh%wArU׺?tr2`H B p-ze?n*re"YA & 0Aq&йfZխgYyhNgi\{M W8t]7Il>8 ~U*,éxMt& ZR ,7[P Y~'-hNvL+>]}^sN屜򖊶zu-;;Fl/0!B _!ӂXM,R,r\(v c4yB!b1wȩ,E/#LӡP+RK}<8ɬ쌃'p1<<: e||;XNnxc6eu1gKc|ƲH q A6 "E+l赌i7rTA?XᔐH' tK^';>.Z 544 @|c>ΉUe>|Cm1 FZZZoMP^Sw"2:Fe6gy&jtH# g1Iphk2.H|f20H3;M.,-E^3@h1$^E\JCyRB&H{|CLuI, gѤ0*we4Qp@>GSYx+qX!ydNC1XH2=E9:R6pSƎoH#=4n\W+\/Q1nվ? BP(3jLӟihO {sgH QS&̯ReLR0F>+z6::ݏ?x޼y4K{n2ƉxN:1@8@{.z\A+>a` NQF@!A< d,UA2ٳyq1Ep g* !&&=Nb\O1 MhwuuqiFHqQl` >U>G,͠\wxD3pz_Og*,E^2jy+5lV \4nYpo~'_@.Bt%|<"?K?c ,nTdIipиU( BP|*@lΝ;/bz뮻o^v-eƠ"hl2xw=ܹs z*0ܟ/ Ĵ!2BX`rf2r(hI(ىAQ<T{{;T+z<Kc&8zGp/ R+'JO0d?M>_`8a> O;4NsQ&C9 C1e {.2`۶mG7ƣ1]s a"sS &w#v<-Cۻw9sګ\|9yYAt\zj\}ϟOLAŸV) BP(\1ZhAaN8a׮]Y#꯰{nd;9s&t`x$t*)?}m޼;038C$ TUIdIϡ`/E]t饗 kAS[".4X/h-F38m5=dG ;ʕ+~;zI k 555t1} #z$t*'I-qp/ԇ2Hy䤓NBU$\8#D6`oEtwwj19!9 5W g8(2#8,A=͈*GF5 ,:e0YF/&q +v u*MTBP( SVut7)Fd4ZE992QET@g>7ٿzj]nNBOQ)yA{zz)y h+.7SrI+Oܚ={^2'K/aVa.8Xx%; _ȩ aq/xZ.^w߅ '<Ӵ}_˳f͂K* c?kGg}MK,ڛo)G(/_NHq6l?>aD 6 WR ?1믿˿yh:\ptzb Ƶe˖sy@۶my%(@eaҥKyEz!r>[]ƭ{o*Ɠ8/ 5L +M w߱'|SN!2(Ɗq&w BP(r)uɑ%rn%1 Y 萊$@@jE a6^x9\s {h|;΃>(es(D'|;$<#<13<i߿_V1|n4FSSSWWWTizs=tK.>FB~ Uc\ex(B_,ƒejR~Y %Ӹ) E xPEErJ$I9$Dxa=ƃԍ:M ]Wyؼy3eGCrjxx^ߩЗ$i&u s}Q(2@$HV[\GG|\t ^d5`K!,&' і*'/QP( B)])`CIb`LM'=d͘d5 °/^sfLɴüy`G!cEu4?xxaڴY>,J >pE`)ʤ]Ap2W V/'2A{TuI9re$0~iVdcٸqu]'%%\|Z%EId>E\sE#b, 7S.LȬ_k_]jBGf6C.,;!kmId)%zkw&Ė,He-IW#yӧO,$Λ<22XϮX$UW]E/B>|M~A.%)iڹsg__&2"N8,R/woߎMQR F"ч2$+>H BP(yȕ锢Yop-r`ʯn()DP駟~WlsϡCdsWL*&$lŔc]S$ ~.b ߅GV?B*Cs̙<m۶a߾뮻xX_2pqM7φ dT_5kC $Hz76e/3E2_!!NqF' nݺzHK}ٝBy#$Ccپ]rŵp_׿5?S#dWn62n RVA~ɤLJ~HN?tN%37w㥗^"#fz޽h"Isq[nANgΜ)/ okmڴ^9N'5L+)*P( BsW&W =i;w0 UN0eAQ~ C 99⹒\mB BE9BrQ0u%`#'xb{{1/s g裏֡}x*cժU{.>,wttȮd8=/zCϼ[1Cm <] "HP")e 5( Ș aءI[ti]]SNa[( P/hɇAمw}饗{q!+vR VI8BmA~/<62g!>H,ٸz6fG + BP|p̓E8x`7.lw^hy`$T϶poٟ ^q7tT}!K/W[#+_җ-tf+\y+Vظq^+YYx8o_V*# *Iھ-\Zկn喯|+r,VBe3GydqY:RwK}m߾7d 裏x'|2:^^xSO=r.psT<%AH-EneJjs]|#Y$&?{AqQ@Gf dL$ Z~mݺuer(%K^ZJ)˲?Tcc#Lj+ޔ9øpygN_}U"ZJ~̃ɄgyGN6l(omho(+\O- M> BP(8 zL{"`%4Fq# FO2r\ql4I-OS]! ҸBpo =J%Y.G#U( B#WJήziؠcŤ=k>n8۝޵!E](nmyB}i}NC=˛K(>ex) =RMNtuuBeW8Y0Qᵒ*U I'k.x2kH۱x he8pq/}!m|%p;lXXbsFd{ aPHچK70R DɪӐ BP("rRd!c8Mo ?|Sow}Wjظ]fM88kp2xZrGFF$·Qhݻ[ZZܭj4Tx*LZjJq':\PBan>!tGBU|Mv.X BP( Bq@9wgc{7"P2ƝV12BNTy2|~_2 ,݉k邤[`,QP( BP(ȕ+D_2ip7ZF8\b`mM+ 'o4>F]K h}BP( Bq@3YS\ 2SFc2 c;[-zm4XW(3 P4<K~rEP( BP=ʹ+YXV2fD=-l+شiFs'h^#?BXr (Z/d*W BP( CfW⺥mYm0ici`P(dߨ|{g{]8iڶkWks%{шBP( Bq@aY,m(f1[a$ Œ1rŽ;z)3>>O$INSwiHP( BPX:܍ g#x_Z TJ,3cƌ5k&W^: {o92l <adj5)V(+.Ӟ3 ZsDxg,w\GG۹0d&({>"/NbA6?R;ՀM%c}9xG(kxx/v=92$<+H2 ,* BP(٬Sne0c @F;,E_;ຳ|2ywC֡˼cGFF`<>V 6]V)־"^sM&O6;UGnpp  8&طoQ*;eNq5W__rNnqWvC.,XsKb[Jk) BP(a"(\R LqnjKޔHݚi(.\R^d7"D>8( BP(;<`Stxx8w~2r- f͚få7tVYv%&W$y|~?gaŢD]3LXc)aB.Lqp@% >;*"YH&g{Px-o(-F.kbJV1YRm0X4 ŕ)x̰t488aL8)|¦dυdIG}`^n)릤1eJDQ"D&opb6ƎhE;8&K۝ I 1.EGFF8H wРP(}lDKN8HcZORd1[0cSLP( BO iy{@7n˂8gM 3Jt66+]_m<5A Ň)565gv$暚tonPy>ht4-VNonnnkkI`MMMm{'mk3%`׮]-i344:3˅,\ˎu}akk,BϜ9st,lkjld%+$y}Μ9;v1c@l;w_NiSг=)wd2tYOK>_RpR4O*rFA2|kk$lo~lj1 uhh6Bޭppn/BP( &?9ҶKvkNLwߕс9`FK"K|>oаᓭj5:jB#40-vժ˞L2 Ǝ;qޝB w-E$wI(Va˴. id;dI'{Nϋ[Vc}}<c<ڽk3a50BfT>#Qϟ1^d{齻QlJɌbƙ]AɖVڴiF}&d3:dh#^Ԡ6l؀{X#GSL}/l3*P( Batg J\ a?7uwu쫉E5.rKKK__kXld<꧗榦jkIY%|u-_[RjƠ\N ڀ}vxxӉxg?{J$p&ԏF`JuGZ̘1SR2kbr_L) BP(WU+$wd|Ɓl\m]2dSGwgwNgJ+/z' fsɎ_4*Hz٨Dt  U.p{ˎPsddDg͞n8yF,ؐY@@LPb5}t&x5>> css3Ȟ9Tm[ɮ c'5-ZTS޿@6?hMMQ)E"Uy> #Ksr?_Ȑ}?Mg_St]+ BP((ĩ lǜFRtrWji-L+BC0p*CgdęV9Dd2ojjR))uW qJ2f̘bwk ~}@`bq -Sãpm'!Uّ~3qs=7֯_GRijr Bu+.hBP( rMT\1͢X\Fi6k"oVw+^fDoȕގ:!M 3[gLKz::;wqv i>m$5Z__k׮EB͛w=F꼟~{g^68 )%-)V)@ !H)"P 5BH #QU*J-ۥ^}}; 56;{wݝeoj$z˲`j5ðMKqQfV]E"tY@pb*buGwl ;ۮ:ljæ?zӦK\vPղJ`zJ2 A~Œ̰h~1POAWp y0 _|E{P۸\8EAIdte#`euW888888888>5]!b"⿏ڃ:f"]->C#`ikV ۨ6jRv>{#Guu#RZ\\ĠhAvSM`{9 D? 9kzG\5hH} Y3͠;M&Jhۮƙ7|QTҕWm,(*^l[fjBg[q El(HȾ}`޽{eeEȓmۮBIpganaakOo|ݯ[oղ=n;-0$*a{qX@?:|0.# }#*lEb;04eunnΡՊrq7U|qIR~qxo (PT:yd\{IQ5IN|j/]qn֠Z5&CrYo[P  cYKK͊cp'&kArpppppppp|!UĂs9jaHL߿ĖuW"%1,z={.avqvvOw]m7K{|2%U bMec I Qb137lCuV\r{z<mk !=ψ$UVsP{ 3lecϞ=7t;t5@UЏF s'2l<؝|##RdϮBSsg*S,qVVVcdDyK8g$op脑.\iz?8`c %"B Kix0Hs{6B:GU{!#7p$JW,(Kr{Z6'Ƨg7*E[}ЀVU.aI.sp}bcylb?@RsMțy? TM+il.:&^T`?SC,04g}S~~ݻ1/.'aΖe@=+ C,'_ZZ`eȦ ,uՕ͋$޻w;o9+ﯔQ316hErpppppppp\r"جc}ΖuW9 Rǩv:pʹ$Cy4$`@Sdu~v,[|z(o~Z%iOL tuA?zQa[˦v /VC͘9re% 9;;@c;2U@~yyZX4pgztЉl6"YlK4m8Ao_fِ4T\+7,D )&rCS^>Օn_y{}G&@,ϖ]>[EDELjY ܁(IЅ%%"5E)KA(QB+$"ɑ竲Hq|!WHgXJ Pfh"IAضlȺ;iJUښ,ӴŊ6qdwfD^首 )~RiRV[NΌKeJr`#=u)HdZp"t?7sp-K &9eixF|{J-Ї8kђ< 2CZ |'l8V0~ZUE]F|$r8Vd7&A" $U MLb K,4KA`ɚ)QT/ #E/RD~zBű[9ؖQuP(H<\ af2]JHI&.f$5 4uo,,Ct'z1)'krF$0adR$Fxh-L="ҏi$tBn:mab48k辶M$5UN$1b 4HhlR0A0bMQTsQYVأ!#>DBT-y4ƬeY !URIV(1KB'7}F~ՕDdݠsIw ǥZR"Wʑ'}d(AkM4A`ʎ3Z?=_owXTC6 qYeY$@ЃnYdh4{ Q=+#~ߒƴIf,IJcKVR/tM~ t4iɢ: )r&4;w3u6l(g u HL~ q/|?@uwF4/,24L3T}fxbl,I Q$PUAc`r\K.%0Ãd)e.BqeIR_u_!V8S4p?@ E ̏ӾC&+b$ē..-O+Y`X1JR@Tm3, KԒF/FQBd,ֳ>jR'Y0%Ni1BH9 QjbJs8igLDs[C6D6Q+fvrc, ̹;6}X Gۼ.#߽eF0Fw!!ZoN E8H-[lcD+>DT3-_͇ySӍZXX<8r+vrVQEp"=ٲ<_qHPSӉEGM?dSuļyr˖-[lGFvQg+I S(Ŕ<ʼM\x`%cUa9D~kSٵR2" FNO/^W'+i=  (R8wv*wrokt1t[9O4r<ٕ9[߲e˖-[QFX)MFB*d; ɲUZ+sQ~Xы^Y,,,on4ǙcJQ qLu]L UVuRuko/}D%e%02C;XnaHQC@ cyN+o6O`oٲe˖-[%QM]ʋt8I,CX8{RJs<(vE9##3G.\\VCxQwZ <8DXձH-[lٲewaqVjakIbb %2^/6nVv3Y Tiͱ()`řlEu0FE W`qOd5nӷߜfȜuyf?-˧dQ["ݮ?oqK&jBtwF JeCqIVݩmtd9Z$4GVIJ(ngC&&tT4mzt'w< 7ϭw_\}/?Sմn Nx|qHpg0.PKNXlY(*´&e]AR*0a jVW0hP^ԯ,I,(#)!8:U@% x6Bc yغRqi Tﻞ\|.u!Lج~6 ji9atBE/劊!) M/n0] j0"qVӢv  0XHÞ.YXX?{jje "sΧί0Ժ p9a)lv7ͪ] 8-Q=( B^˖-[>k r0RZEgEҘNeV`:ͳqjizn9a:Ǣ^TyzgYc3 EÇ'[P,u-0ݥv4WDq]7}Jڋ|^Ƿc k]|ԲEQ f huQUoI?n6 n*jO{*s|>_ㅊhmdBZ4|^n %XeX%jXRݘͪU(PPiҬS<8pL.BkZWU=뤅#MU0K# ִkjÿUնIVY5Z{ $z}B}{Oá-w+̸1GKX+*իB{xsm ZF}^hPx'.^nܘƚkwC`@/ ƔEFZ(e-\a$I]"YP (Qv"KOʿ?߸94A' t0vB$-s/md=I˦HV&|l~+)ۦ\渜uH~V̴8:n30A3;,`8M'S09csN'r[O&ڃFc;3N#BDl5&!ȞB|b\+henm^Hnm]X_D \{D66FQfk=}lY7⅔\V:TVQIGl2n~?]/Hr"Y=|M>.y?:8p\"~'ħ,,,`sꅙPʊZn?oNb b5IMu]i hDn x>}e樴ġGDjVXXX&+L LRmK5 _ZiZ6k?`Ok C1$ /?ijjc~5 ]~s=y`{mU ۛ%imI4U|wb()ݙ}[hׇ=kMC?C;VWj,K˹X`_&FY7fkk{~po3΋㧘AzxxK ۦi!Qs PuU޺5}ld^V4E3<.g e&Wn0+g/ًaQxΔ,* >֗ #u{X- 0*0BKJ8 DI:72V֡l<+-L^7 }lio8_ZlCeԶmk}ҥwArTgՁ  !Xʲ)SD`c8 *D rYp%R8%JEH,%dݹz>{E%LV{zE~W 6=m<3vJDlذtg{f_u`kEM1ٕ+TDVFn޴s##*Bnv($-85LJE=lTO5n-V?9]f3(4j=V^Ӫlz D0n,߸O n+Z!{Ӯe JjHl"o kS&( }EI! GG|\POuCv9>u;$J/=j^vnKiL] {㮦+;~ 'v: u۶G͛(D:]~ȃa$9ez ( 3JwoWG"bM]϶il|Ne:J G)."0j *URlD3~+5*Ķۣd;f>_:|@6oh) 2p?<8e;?v6jm*q" 3gu6/UY`Qe4cUmyv%~"x p2:F gv&O&d=*=]'4W Ų™0qA-O<#b M1n% Wd d0KϹW]W ggs]yVd~`j7_-)D)dsG^vf@V=j0ͷ,'\ cmbL?n Ļ9:ҳ< k"$3tw>?̽_DJDaԴLLj^xQ8 l!{ICe5-EzrҾN~>.`OKds'13QEq9Iᚧ}K$^bPQ5dE5 q+tqG{Ey$I$" 9qF[> ZYtМk5qH ܦ $JfRt#FL*$Iz4MaJyRQ$s<2ҴTb)ʠ/窪yh='3et*#$j\hSB{]Хc3k3eXv]\g K>|W|F:'u:Ej\KdԘr53SO7k%JDUC|̯~࣏?DtgFlگ$g?pxǁ=&W8L*Ad: "3zq'q.i$D׫e84aC L*M9AEUfdL ߩ aߑ/?"MxH KǺzyRT\%*W5?z Dǭfp%1q-#_ٗ,\峏;9:=xnh;)cSWPS$ƫq*GfD\ [~Wl1'ѽyQ }'?ƦJ1+rlllȱ R)UUqn4i7 \xᅘ>;v) ֒%K̙c6:ۘ|%3d21BE8p`ӦM=PlNT|ff݌^zcg6(%Kھ>݊> "ųb4kB!p]p"Ewf*C˃nEK/Ct&(xI󠊷z/6 7*E"W,R'28F#Dbw'MՋ!v[ -T¢L֏(_*/2rCCC 96>>~hrvgEv8<σB'ZXH)%Kϟq+VU( ,\!?;x _f-;yf˗/fP5=ɝ;waEp~}9͛gϞ|>`m۶/v;۷3L.d'd":Zڀr pQ.iyNO:2lܹ QB G: , M۱s'mMJ%U5ŋὰ,] }ꩧصZ p~7z3(;؀yp0FU<Q)ɯEuXQ43OjӓP;c}* W*.޲ukKTLg$^|Cc1>|b} "QdnsL$$o@i~D ,I2&h2D{K9~RȜ Qҁ]=a_$s(B!ɺ[\. ztZQn:iX$bj('皮t+B&Gǡ]*UQ]x3U,Gj$oWz(t#[[ns 7ݶooZErsr߬KYqWݼRC"Vğ=j7]sV{3ޮPꝣstv7ݚ"'Ii4-Y89_}޼y;ܵf흫o?;޳6NA !+݌誌6${Ld)}O?bP8cak4B0G>w!Yla5IV\uĔoy^\cBIm6z =|ჿxe@?<'D{2xIѨ#ȘZ F粈3M~h bжI'dRsIsP  kS RRIӺ#WMz 9)MY9[ AlJJ{Ip 8(2"'!# xTw{3 :B.`jbJ粵jCv(,18i}ИCRsIz`}HmluL> ߀<fTݻahV ,ZA2Ӷ-dD)䱼;zcCC'AYiQhҥziӦ7n?ǝKXgv:WHt駗z_y OnvRȾ??ݿo֭KMH C= I“#p fqmZAʤ] RFaS`@N?w/I]~Rd6ɞ:x&CK3MHg xldbrm2Fxo׮]g4x)iDEl;OԹ蹈eM=S E_"ٸ(tuw)Hr^{]{k aYtwAR[f#U/gqҌSN9e #:ٲLZX_A%[,ن*i#()>4^n]>#i=â(k4ݯȢS3Շ%2z ù5hjG:=|eC󐦊LMUz䗘`a# *'raEҴ<Njt$&H\1F+vMQ_5-cykFR.C؏\=}n*r!`OO}M4wݭ<cn7}dkD{sk\wEEK% rbz78|i[9=DL~#\ݫ4MG*)$Z*Po0~s?2.衡B>'y%͈R%FS.Ru+汴f>D{V=c2n!p_j0>E_\KwFкy_C+EIj>Bafs9в^߾⊉IL}O_-_^, {w6=;xpQGZ pv .;ڎ̳s9w_~z`0#P@HIlc==;>{f3^<6c& I Fps9g8;s>u}UN9V.[@/brQ^zť˖=S9y:򪫐zx۽gO" 19tG]s M??+W&| Cy֭__Tzkׯ+@ l _m=sk׭-kOڅVZD<~ɥy?矇6ˡÇ/,dd4޲u+{.l![.sh@ww%C';dFi߇-`)3ںgB!OՅz`O?ݒ$J$$tDK/ېSE`ux611s̹=`p%@), .?%[tǝw{sE@ ^600}-2z믽R۰,ꪫ{[l28_nb .d¸We[=wGa6nDmHoZ _M$w- NMN~r\r%`@R$C%r-OZUejQ+HL ?r@(D3\$;b,&BL> ins] @(jͷqu= 0 crCZP`dgz:19H,Ͷ 4>]l>Dٴ5UߢSUdVKU2 qXrZ;ˆU֬Y·Ep뭷qHxg? IՄǟx⭷ނ/4}#Wnxxq³> ʍ6dW\qE*WիW9rw) {. Y b6CA_\MRjr[Wj|>l2/|Z`tہ5kx晃NNM\ZO1 Dle^{5ȿqF eGk=8I/NWdYhtח4| R ԟ9k| <66;$0Ç=ΰ,jɂ ZSSS34M` k׮b-H|rҋ/F7mۆ棏?JW@HO|a/ o9WXlڴK_ыᤐ#Ⱦ}[Q[{;|l>s0ܵ T_[9Eerp8 VZ+<ƝP?g?rOg)~zcZ<ל !~r f8?b5l;44O"F'YA߼MۮZk/|WbvG|,M'xA\F8%r_p֥Wwnj!%1;BF*O},DN74<ƬY ͟ l3e"Sr lfZCULY)_u 4>H­mɘ$wS1,_d>`\N 혒@3IN"$"I8*R5iukZxA,? Dbg2v-"$k5CdztF6(Wkj Im Agϙ8_wOպr/W0 \}|:Z)'Aò 'HjZMOzp]ߏ{.lC0^'pS\\<5 M%X Kd&;{hqѾᑮ^!̐f0xP/@'''5E8P9 @@6ŀtA(AZj3(>c׌g͜u1[蕮h)zPBwulh(a?UPMC X={kB1XS߼gb&2};t󍯺M:75wMӄ'O&+|/v"Ne0B+Uj*j;߻$~_u9$Zږ+jٳ-c8khZ d;!?ِԃ!d$r=#JhBjPdzpRT]S OadʩTr*8ogxM׬l_BLz6q\dYH9}\_l|zYc>xK`zZ-E^.qZ{\102XQ PDkiCǗFEm9Ox|(. V,WMG4l'qHC/|7~x\-J] EHBr)!1]{=Ȏc㉧"4@":qqm_u,bx2 J'yjd\.SR&_Nu rXQx)dJ|Wdes>h"g)Q !CsS\dhT 9Jzt(% !qYulx5UEb1^Ut#%C?:vM uMˁK/_ꚵ,ϗX"1:>dGWW&C[HO>Y͡~@ҴaU RM@Ƕ|Q]}3aB@8>(ժ^365`8j=ގ Fj)/"2zf Fttg7W~?YR7R q`˶n `n2 pX*Ym(p|Wd*Kρ[8Eh ;U.z.̇GZ|WM%hXŒiݏ|dnܼm,Zl[omg/L&2CLrft/VnBM`%ѯ}㞫׮@t-=1Ey!,(aF5ibdjc멞~]õu]$REL5H✞~M;ַ0fhEbRd$4JfLVj#L3ce[9/뛋52M\Qyݍ7YsN$;N"bB `bٰxO K@JNG$ےBbT*fP|$G㯢~͹r=|{wΐG3r!L4gw( 0ЗtREi2A1{Z:ѮAs\8Q6L^B]yA  4DHbQ$&Jа )R,9g Jgg'TӄB8hR濄-@fx 9V7X@D(ėE'.+DQX&S&zˆO,-{zz| nڴj -;tRe"`*T3. [MbAMH!MpRspݰS]>V'''8DK.LZ}=iXZL`/ Ɛ Ѐtφ,@W䥗 sͪqC=oap,kFQ3H\.;ŲX\ jé8:`iF#AfhZ"azE'`t0 9V* Z|y!C$t'U4 #G"2%xeDq-Y= 70 p{toHa1d 1aB}EA! .Ɠ:j$\h2fYJ9/\J9O\j.蘘PmE F,x` `jaL&CI(wK^t½{BW^]o.D2 MM"(Aغ*`10m[RL7pQNw9kN/cr- D)X8ba~E:ZH P4e0*B43$u݄W.!4x:}jk0hd4=']ty5]fӝ_S*K7h}֛1f|:ޖ/~)ϭi:?۲-%3E7X_PUJ*a9<0 R YBOdJ $EHBrM/JwwvpVsJ CwSHQ.3Gt AI!K<&j:>7~cLg 3fb*K|I5lQց˃_OA 7nmLيU#c>>uP$퐴9\)= \$ED>WQd抌E86ᘞk4Wu,1mc0AQTZGcbV-$pږb_^7U?`dQ ȶer`@ $򟑿|bԃK/ܶu؄, zlǵ!?51ޖr2.Y\-o|(-[T]}f]v^8͌Mי0jꅟ`bx<DCr q,WQUx|#VoںyΚ JBTS,G^XG*yŒE\l֞ _ 5,zcAR2\|٪D:ݞ>s< ZjB{.jh$Qԑ+A|4E@ζ'zd7k5,Sã$TbQ:JZ:ۃ. 9蘵R.tD$K!L gɏd8tǩ3,dr]wCH z?xh?H۴i|GwjS#3f̸FGGSO=NVPUuƍK_WXT_م . Px瓻*ٳ.H, fzlw@ 8qUZ=s7x#\toFwߺu$pݺ} ]_WձW^yT*x<~ԩG}_f/Z.KAH>h:^ s2$}Ν_=ܶ&x˯~+@@8ƮTV\9Ax믿^.;;;\J2^^EعctK.~uן9}' Pu"xljjsKR/rk&={vX||׎Y}#oQudgWWVs=o 7<ʒ/r3g׬Yn ,{y]p;v@۠r. |w饗Λ7%D_h׿w܁Ţ{/w8q W\qE 9z?bl @C8{پ};@sUף޽{ —vdv<7zKSj/ÇK%`x 4E?p J жG ۞jG]{|cc˾;u9Epr> 0{EIҭwHݡ䂒 vʕΉ rTlthLDr qddtxBs$r\# F qI4R `DB^&A {b^4pR(mMojE vm"'Z3`dڕBX򛯑Q [ߺ?:n鎶_vΧP":ENDBCR0pAL{w~7ި9ub#_x;-D9 Q3D!q e2|mjq|$Q@={kFfjQ?*DֻD*N)ֱ=}"3Ƨ&mL{TXWe!6 ֞-8VsWkR2CX0xEH-Zv(i0D[ 4j >3k,-'j{%!#bhƣHH/pӧҩ6Iƒs.td?(hEKa[3zN9 53AXz@(Ӫ3Y܋3PlarK !aVg6Fv(S8R}k^g ,bX~̙;C4FnmnZà% ;Zmu ܤ` ۄbaf3CRbƓ>noӈVQBUbc@y$㘖几2J:w `(*PhN"B}$(9N-س癍N:W\:|x[ Z;*"o;ʿW~:)ߴl+UUK$x6G^v٥]nZW=جyX쏓kS _vh+QMwu$S1Q `czLSRVBo/J)vn OCiybc4[X.(^,gעmͳ/دt2}Lǿ9pMGbW]轏O_+k c'#^nԈEHBӧ=gނ_ G8V)+nBP%&uyPsP&0`LXuT"YU!z S醦S ]5P44򉑮 jF觰 Xlvj+D&_SP! lխ%xp iӱ8#gϞm-700p)8Cfs ux]s{?@RvW!*hjY nf]216D/x.v"(JEQB?;Cu 2zt^L''D3*ki [}"tRsZ%`i$'ϴ%K@И*fͱm̙|<014WƬ}C9=ߛfMgv MsfͲm Frw!1.SmZE\!/G(4juQ˥\8W+h e TI:!xYO,wb p2m9 axvb|," Dk GpQMк bT\fsJk=UnChU.o3֣N+1}?Wh!Ge{oꪉy1f+l@ARt]o}lw)axru4,.[ka#M0x (`4J'j I 7t!B0Sr$[0B ZW-1=K3BR{ʻ$U4D[Z\9NBxrh|pk6pqӣ aDhSYTHYQCqgi>тMVp ( =x Ɉlb%hg䦭nظYZy4DղH&bAd"R8Q)S e81(7`NkALN ' 5r$>)Lwd,Z_t՝w}mG5I^ [{JF VVUU꟣dPnغMD3| fr8[׆FC ;s<[֥.bcb0jTF`uA[b-c\$MU=3ap<`X[EBSUmh ߃5̶ξLHrx<+JlXGO99VnrTF$مo -.8X`'GI>Hpbn20S枯6,;/AB#aS>PihmZy ƃ$J XQ ? AE8?b -P=7=W.(X $ajzb qFqװu{fM | R܊j8vhQEU_0[j0R=4=Oj[ӝx8ă8t×UV#/ Z ?+t??#h>WԧCCG-G^~.2LsX6ɗ!twHmF(c%h)V bD[2k޹o<r2F$ʹkiI a2l~U<$RSpވ$ź0R]/*G 'y R5W5 -*|Z,9Erc?839^u\&{%iF*dkd a_o`0 IB%_.T6kR/3Z]}k.LD QTP`0W,bP.RaBacj$IIQ*$OQmMNz{3¹ ҭ%DjՌD8U%|GGN^Dj5a$qcb+^Q.AB#-dsV2 $$sͩRo:)F"Q.Kͽ39_Y ò/M8 40 cH0 )HRM$I¾T1Gh!Un9 ry% ؎Ң|!Ohy^ P#_}TJ"@NgvcQR%_ԭZ a J"8%;:Jd}hΣcDf#4G5qpMrO,O.)wtD]x# !]"d&&ES)~b;^(OgO_a([L9)uRŢ%,0y 184y,SO]ׁ0M[TTq@ |$ij{ZULvbxā0&f3 ŢEmH-nft id{#qqykֻDF᧣`BB1R)FIB q $RPbB 6ﳊsnzY/hU{UV:_թs8OC,s4I 2p(1pZPG^!jIjzѨ(Wvgθ kaT*M4pA ʅ:U؃PzP>Q;xpR4ʍ[ ~Aj ]#p@.mM|6ѭ×@VA V ; G>=A[8 < ǖn'eT^eZS_&0T* [!+h6msVWo~ƅ 煐"4ԑ+Qca JOSaw(Z[a\V$k}&0={|uW-ɳV>S` |tBGH=9l%A%x%dw?a(gk \b<( ?aRlT3y(ݑpr0V!/j;<)?hI. `Y+C&m9d{q uϞvv`JaZP67.n܈F$H|iw:*//AGDYAqƍh5PwAU>rn4@Lٯ)G)QffۜCzeQ4rcW mtڒ'ܝ}mæMwf;XjuxxZuz$V˅jyy najv#)h w$Wc4ǦB *F U m Juf0O{j >ߏMe?\?S _Fk H#iƒ`UOD0J*y^ (H)h)*rg`^dCg{ScD[yU P竫+*Ou++MPAYlO u?:tRYH?_zttj{6fCvkƾ,Deoo竕!3 3guv/\QV@AR $m6LZփ NDpQ!pz͛jۻxq}8f^^uP*A?F΀ѺU|t(JآPo=rOh xZY5hL0D^ sUt\͖o9^amʲ\?,!5ȶ]i `Jݯ㰵TˋEYƇyQcD.Ih4nQ&UQB\x QҸR]imޅ # 1SfXiB7,oN\sAn˕.¸`I*_<TRIѽ•ڸxX(5,N?Z|ei^}E7NwnN=y S}dNIy0MPyx7Ɠ|CzlsA˓;IYcP$ N3$7 A"2aR& %ͥtň4GS8'pݺZs~-%TRIFdVeJDx0JQN,]K 47ڲeT*R}4w;|oqaZq#Ē%N'"ƒO_1Mq>C#)Uni66oHb3My!ur'UYaw9O>UIj@^C?|/?Y~w4ܶk*DL*$1Uu;OPubTpMXn;W-qҠ s}2] YU^kvroҌ{M aQ)g:¤So‘!G UpRrˍo~>DؒTRI%!YMLDA7/ < qBDٰo52 d!9a4b[0AAS9$Nl~ݷ(dFe3%&,-3dΒ[ʺAHzz}4h'b8C+ے/_]YZR$IFl^=5w? AX0dzƾ_1AݳB)QFN[959 rN0^+=nd0S%R郖 =aݵt$xM&x)M 9Tvm&ߖte nrt;!죭אָ'?ыI͡xLJ*di8!C6o5Zfn4X W A͝˗֏nX7E) 3P3Ј$iMcXlل zf~ǔfDŽնSb"M zs/}? 8\+HmJ)Qg}jtY]_z*[> u\;T*OQ*"QBK{PFbxVn-0h%ԇ10Ϯԫ_|۝l QRI%40* 'D2Z /4s'9paݲ]AeNrE]L.jsBpPTySiH[0?Dỳ}aOg\Ŵa޹_j.FiȒ$Y$Yr=z=4ۦoww}di%pDmNjԷ'&|26ax>WiU_͕R{`IC|=J'|[6`rVTp$SGԓT[L9JQN-,,CZ\*Tu~#H%XI%td J'Ƴ"O i"<4V-^s^˝HY?WYtx?$*M`[fOO͑;dn0/S*>)5x1 0RϿ Mr!34 SЋ3<af7K_~ˆrA ⎋9RfLژ}a#fpܚLv7i1*.,c=x3$3&A VjHh:Ge4JOƫb*!37fm]Aşď"Ojw$ W5hT䙬7chn%%pjI%Tѻ+8҇_ttn|F:eSZN+"E o%yVo?A,8n- ^~ C/W򡟱\(&IeAh,5 2@Ѧ c5 F0c8U^7@AV ^][[Bc=v\:<9 1]?@Tn`@U VY<zzӢwdDtoѬUAAW@߷8uGDۮ棏>z_8 &4 Ȅl̤.G!c -x ډ={QYdY{^y'y_kϻ$M"Wyfkizx`͚5> M9fsӦM֭`߿qF כn _{ ZM۷>)J[l|؇~xڵ@v?!)|ʇz讻,soݺg\5LOOj 륈 LCDA05FvSC100088k`C0| 0 0 q𭣡 9yoP4TۀV͆}9Ӳ6ޢgt(uUwlq,Sϱ<'o+Kڶln\oooR~v#⋹\W~뭷0 _<#'O±y饗0aɒ%3 dɍ7x)\i8 )Bgq9HIp Ϟ= '"R.(7G7:t\Cӧ2Z̙37eD|RVU__Eެ՛~nr򯬄66 n#wY EqUZݳgD8 x4[ btaaπuynB]2Ƒ zŵ #SE9oe4(-80HX&1>X>4ЌvAX1,?Ju2֬YCYo& <0 ,{DŁ4(C{:U4-~(offdww7>L[r%µ( ^}UzKT*a2T }Zϟ?ơzЊBtJ"^L+I(j(DR`Q裏b<0?(F[Y\؟aa3`r喛o=b"6nXȲʿ۪,|o 1aYmFš.ܹ|S^6|"42mOhkjj ]xipHP; eL 1 5zZoq pb xxTgL1Afb),K{Z2bW+.<|bA/;6֪Ģ MiE^!;T)_՛d؛CQ#8]{1@yAϫ^q 0 0 +p7$;*yϺaG7]TvOɳloMLjxe"IL6{ M?3Sv'7Du"m)(٭[?~[z† *8p ҀWT 0HؔJ%Ȟںߎׁ0U8.XB751#SNw ###2Wi*a85RwsҥS K] n lOl`00Tơ!lΝ;aƴYsHU0 0 s -ز+EbuJUwUpsmD$繸d'/N~3:؅c'O85::GN}pq*ͨo]^! -/ {$1d\Q#޵yfJd(̓ .}e(&P_*.,5.ah,[?(em ˨a ӲS~x~;R}4DX_(€1T2x'FGG)H5`?50 0gÂX[iV|UaZ/l#xw(L KE[9דYIoOnZ)z^P0"m;r8~N87:C.p[n[}!=њKfC@9rξ>ѣGWZ5R*J[a;6mjǎ۶mU,ÚerrOMMae$Ihg}vA&EX E-`B7>/0.3e*qlmxaJPL7E}W -Lqaa~X\tROWVɢ ]I sz|H\JوU+HbJKf*5F%}:3c IQ auH *yu\h h]K/T7Lhiki1_ #raNQ3{!5]:  $:[8^W q<*sNWg.z''>;}Wa`9%lCLLLS%:KRycLK3W*&f;vd #)RS\4"i;+}XD+&JP*ptjrI"Y PO\E }B[XGZj5#P;8E/tM0ZP`>"-[Vj+̕W04S񴓤qZ6 U2?E=6Iø 0 0 +JlGrM"a ~YWwmnqg'ڞgp\h6S_*]Ϩ6FPAƘ A0H\ `,Hl[*qaIkM `ͰI#xT?GjmSH G}bY&̊F)S#``MJwc9Ϊz*fs꺭CCCcc߁8gW0 05ɂ RvFrc\KT96i$S).tDO1g*7.)!Ƕ3 uw_/VZEQXhrzݒzߒO1#3\]q,GmeqOve-ZXJ֐ %z'6zClw et> i!Cǝո"1F+z< )'"M.mҠ/̏d {]/2)'*O=ԶmnNM0*|0 0Uʂ助@('4:s?aȌL;sR` iJKaZЊ aߒ~_FQ, XᏟ]τoz+.TՑ"})7-L'[" [TiHԏ47$H5/W>FQU+N+ 0 \|q[å3f'UE jjbhf}+y K(}dǎ===i ^w6Y1 0 \|Jc."?5/T槑b, J a*%/DV?ϟ֟oHU0(^=2R U@,L1Ͼ00bPJѧ~߆m;Spw0 0 s ˕Ky"u$9/TRVSu$薒#&+KF :-zS*_?K,s=}ݥ*sj?66 iBw obbYZtg~aa>e?XTLd&Y&-VҪI$ofOۿ\c5T{y_j·rK E:[ݶk*adI2U]ܵk+ 0 \|re^d2"+ΙE&䍡LS)jY荮RNơ?~NҹOgiw~. Z<ѳ[6lTm; |>黲sN0 05^,RiW.VOVg*-]"3eq+D@trWY`y՚A+_('snyh_fb3̧J"'F0BS+ 0 \|rEGL+14`WwWyŊܢI5 S ˸ԽE*̰L̥eZ#Ì aN*V7!a\c;~{w,Z _X'TFZU R5ijT*U U6J) c̥]cgwv^3;;*h/c^μcysW}*5l011ʇ% [?p,@ AA%H_ވ˞+eqV=1z}-[Jrz6cN3Jq+q~ʵXFFd6 RA& '`ߕu֙+sJRr9Y*KA0,b0'6v$CK%T R0ʱULH6P#I_L% " 6L0 ̙3C=tw8y^ZN  =Kcp>ȏqa?kNgFa{Gݸ8f,YF}W^z3g~KA0,xg.(n'L>믕iCXWf%؋o1M;kסՆo'Aal6(%=׊:tYVժj$a*\T*i]Ah PZ?1p>>ƌlF衡! .w]C :A0BAje*" wlq@P*1ug%l4&Ux̺N1`_q/sϷB6v&g˖\6;'xQ0FRyy۷W*,{1lXp2Daׯ7E}-[bشi㮻rAhZN999o4ζmpnƲ{nɌF} AAEOR$RږyKiF˺dn"Ŭ%iQp&"6wl>aϞ~(QYSw}3ܹ_?cB`ffT*w}G޵kסCa_r`gAl޼… NgΝǎjɓ7nݺf`!#bGl ڵk]7(M\6S4ϟ߰ar?M]! bubq&l zefIz򺌱6DOba0+Iۮ:W}?4u%ё2c1KD_~?tデUU52;DuxoۭZ<8b?B=|۷o?ua;Zl6>l\@QYf2{9rȍy-Ǐ߽{k!]! bubrUv=gF!e,Vo^4Mp+TGT:s=? l/U KM KqfMg+#KUfHЍB> x')dk 8I/ wvu8>+8abb-QbffftT"*`dfp {q`5\ATc3чA:Y6Z[zt@ zS\ xou`B޲0[O(WK%EI% 73UՑѵBƑJQ860 B~Gy;0J#f?iǃ.~Zu߿1I7 W L@N(&@Hnz뎃X''']Mh܉ w  + %k7zK5͢׃ 6qzKk#u8 +\M]j[lhƲXYS%Eh֥PU$7Nڞ\J{Q֔B-:;v`q& -IGĽ W1-b*f#q$mq]zO>z)6WX{3=[Cm3h1iI}\r;{/liuA:wї\Ng AA+]A4E63έ&L& rUjucTEtabDXjL8G2mwÞEqa9[6wO8yfs޵kرc'\/8~pȑ;wJqK} z&1\%^Sض}hijpy ba@7L:, m%arͩn EXk4,?}a]e#.O' XbQ/1e]l`NCeߖWXӐ,YKsg# Kev2XLVuګa}wlKE*GvM ?(j>$Iv{؉K|MbVjxS /_\.🩩5kO 1Y.l%"ܳ߳k3,)T!^^2o4kIMΝr8 CxgNX,K5'Xj! =e֍M#XtJ1'8d}z^w2|PS,STN1,馓'..R4} e@/t|~3-P9 E ,FuDj՘4.~.J\Q8ܦw+_~ŋk AA+KW3!K´K}1U7Ʌ l0_Y3\0JoDrUԧ϶tԨc~b2F"jCp~V}&48 'C̴) [KVs*+{j29,%̱dl_¤XTjXt‹ZH),lYRVpΟ9vQ  V,7٢)X}Uv9D"W~ Mru]*ØzKEZr&|r ܴnj vW и vlBNg0жnbփ(nc'-8`i&wBa [0y͎9{oCFKY|\ydTxg!xrx`ry5AAp Bld1ۗ2i23/imZ:j^Eh0 }Ϯ5oC`<1YA6kRVeիW^eH?@-L⬾$1Zf'RL0#9L/c> 82ƴdZZ̜ "+¸Ն*^F6pll'N;vb+p;Jkqa+sG>s~LsrxnHS  V 7b0!I$0J=S?;-/eiu}ȃd$\qs<+QAoY!0.71I\i`?dƛf\ LK\.W*(qiqp!%1%3B⨲ut<30؈sڜ'é޵Qs<޽]k #cCh#EJE#T_*iJRP$*Q(R@D41`!^S8/ݽy;ww0%=WsϜ9svfvJX*6 /TqRQEɁj *Pu L0+q*ÆGw`$K暹rsf#yJ# f$L#2]?_Øٔg8 =?P r3MZ4CO*M(|_/,$ V(B8yH`nԧs+hE+.XUP%TC Ѣ?R)Aq6V̤l _ʸm-UH `va0zPS)9_hwdݕuW444V?w;)E2 ş6(qQW\W*Tۛu{>yLU-0jo痂5LJ%_bR)cǒ"2C;qUA L.* X :c w[ k׃̀!充t#!QVId >kvm+@`F1 Йl5Ǯ1 zeNЯy9L}gO _(3TRV)JY24m*؎ Oe9TEgn*0ʠEɫ9s暫z'[3xu,]wECCcbWj\2FOۃ54.;}ZȤsS F}&V\=sșPqK׬bFpn/k6D;?}K;oA4d֯`^)ƮA8#Wpr`rO!hajj VhA28&RO`-E2acpCLt䯌&`0VNϣCm۶G2oGZ(h ,PI=UdUJUnLjk%=z_:eʨB22MʰPr s f2W':c@ ϕ,-ejN{K[]+֩K,F'2oR.]ɂG 0"{ "-XatVȧN C-[&Bh[) ^()Kj:'BEWdqzl mI ̞eV," Y~\( 7\Nq|ؿ{@塤gA\,!v.DUCC㣈x "]DۃZ/MHӁǩ G`dY65(3ǰ_?{>ǾWU'ڗӿ}ݿ{~%ndLZu^{h9t>2korWBҬY&UV'N^xᅢL$dIՁe)_4h%ccǎf֭:ƹ۟z)ŗ^z ߿eϞ=O? B>~diK{"h`|MSٻG,Xʓ,Cx*88k:x\Q P ]wECCcO<1촓p,,=$k]늒+ں%yQܹFUl\d|5hmO$T[ J,5ϱa\a,G{\b~$FNzo|8=yy8 [?^s }a=oyh th׮]"hټy3 Sq ޱcQ>Y`Ĵ W^8OGaJhn۶Re(QI3{n :?e$TVY3u\+_hƂqۨ]bI)ό<$ciɹPC?Jƹ a'|=Jrt Տ5mدN^78X8+GyXG޳VQ5Xcpn{Pܫj:I]%%H(ʝ~SerxƤ IChjrR䄌9BFgf6㥩$$yc%`P,t PT>SXkSb79 `/LVdr őx^PƉyܴ-|p3aF{,+iabd233ÔGv޽Tޞ.oذI#S:P EcBBܠQih#c7zNh[)|RbN} P$j\2LJ^|r=h5K<5-`:O؆*ξu5[xd5uW444V?dɁ*lxnEU+~spQ5E.tZngyٳ4a|LUi6T_)̈́| BkIPlwygvvOknn{'&JƔ\Y'ɛ V#w>nݽ I(2"%:IIg[n4e:v)W;ԩSXѧJ8;vO~sIrIGW%{GEEH$S$Sj W^yo/%BuCD޽ӣ%LZvnNd|٣V c#6m,8p`Qpv8hhhzH?nNΝzIɲʶ=uKb4!-J X nS`YueҞiATvGX)jy\ "ǗÃj *-˵jQE^biVV٬uYa捝v_ő0Ma/V!B*{SgH f]ے6_;,' L^@4Am > 91xP8`Џi-0ITimn& ͫVuEx}p8{Xc_GdjMd2SΚdgiUUT`88=NKLjV"lkc:WOgʤ&6}#F2N5t'na5I"- s+Tu榦7SpR ~ǎWY~4c[Tp8]rfv!8jD73`g8$ܯsD/< ."GYŠ卤o8">I X&0ΉD ʌ9qÆ n n6ebf b}V1Wl IgF1lS4rVDp(=:"_cP4:؛MFGG᷏eڊ 7x F,E ͳ3ϬiM=Ѓa6"T^{?2G\^I7,$E4:k0F[Nj`]Caҥ\pZm0gvB)$D"G?m4X{YY1G3l4KrnB^BxuWU]]̟utrK/+ڞ4osڎ3cqkx*IUwΚ@ _G~Me+{7 ~bݩ݂nN~3sWqE]CYyrA9;v͜y^cbXK3HVtDPiSY TL翹."fЍp|4yJ<.75>$2q^osٟ'8 ja*wM[E׊DE*v立aRlQ2Mk\AA_]éM pr :xH͠L L&LB/<%? OBq=]SH]B$+T3kIrKG0;C0dREaw ҳ{fE\٢P(в\mj:@Q*9Ya&Mꨔ%ìk*N) 4qS"Bb19'mOS)ANО <θN=:K]`]MMTD$|R xH׬U o:^ ҕ&oʕ Q p6xスO&H2Y!?r@+xWן:!Ge*G*L]٨5|Yx qeBa٨4j:uBh+r\$5#7tOtvw{=xp9SJ8$ise f|IGR>[v-p&$b?]1WZl?/mΊE'X]^[td@X*WGFj5~8\-1Hnx2ix* 4 C(Jb6*+(JhH86/<|*kvhI 냶و_S 9NP>Nx{c޻+ dNB;v \`q :d A?"YEq>|VޕRSE;L[_oP^>hBw)IxW6ox~]Wr,sM?zdP`d2Imza薝H& 8tM52D*=İS%+W"=OU9+&T i&KuN9_h9ܗtһ9zDcW:ph&<+峛7o1w)=k1VZ פ3],EL1XL,b bL4R9.#m\CQ2vRɓ'<]E{ZZZN/,P"u 4553/fV+/1,;aZTyy\^$)`7ݳO;p##RY~Xٖ3 -FF3lbXaA)a#:?tZYEoضZ׵Kd@8&JeYyGgigur0<2ZT$ɋiu=UsF+ʮ[JQw%-4ꮬ^$E@^|bX,Uպ~lh Z֍r$d!z欿~o[SՂ!eY`G2\4/6l}7I6[ZUSUZM-$I< EQj$$P.sx xq(J!'S]4c7\9:dǎg׈B]$Mi&M,}]~QGinK3{pڴu=wnY\C43ػ yW\3 b^3T0oL| ?qhm `0NA\0-/;͵s"  o%r4 LXȑ%dxIV͞}w,ipTEFOZӖJt]zpP8S@|U΁<8[ZO͜ˮWUI/^7c+ bXWo=wϾړQ"[lYb[odɒOQ+nc&Y5[Ӟ#H "TlDT (¡Bio~eGd,vS"p39%r0pë3 STV,< F(Vƍ0J%EQ6l˞ݳOd;hؖ% }P0 ~Y4 ÕUD3Z^|ițt(}1H xt8TUp:R^ڜ.(A̧=(n]lқ*rξ[r6YFN MZ$(n4RŅ$ 4G-Br'}ud9˨Ӗf:0!;:Z\OC:npc#--$1v̘gp/' ޕ@YU}-^lジ64- (sDg2F%.AD'LNtId'sԁ!J< DŽ\E4 4 [/`hw{nݺUWs[.~J"/s+oEC̚^ԉ(q;"ﺂ(:Y^ ZbeGV6ZO [-IG!o\СjkeS%om~ยGRᘜm=OtAbHxGQeT,|:t6l@miiak"Dp@7ΡCt<<1"η>ISm" 2۹97RSsEǍNeYM1g 6qr4iҤd*%ʊa٧9sJIUH\RT|J1vIEprWV0qowWzicN:A9,x-pALAs8^0-H*_>zW}؆џ 6uvvdxG.x' HUײa)Ru]4?Ѽy߇RO6pCӧN:rԶ[ǟ}9s"Ty1mm~ﵵEB_b0&ϼڝq%wԭ+$ X7IHV~,o>~ȆO%<[ Z#o&̯Mp\"p,EGMdQjɃȂ@cQPA:'H0[u(tBY@ Qܕ"ȋ^K˗/*|WW~8zmmT*NEIZW'Si <"ylƴOJLE:^.kqP*҅ \(T渤4EAຮP\S=8Ķ_/Q5YF\93 W?ݲ]EQB8SS ܳVk ADv2-k)Uiom8eJBDZ w@p+A !1`˾\W %$@ 8r-ۧ)txEw,SǪw1l9̺y~mC=ztWw7ԣ={T3~wwwٳt$F۲,ޡ^"Yg1O| ͷ6s E]%rYSO}SLȢZO$ΏI,/*݅s]C?|xB녪jl&~{7d{zxG;؎T,FJ:}4 z/{lA_fM> ErT_y(c/X`u3m~ڨSDag8IY񏫞Xxڵn H+Uep߿[>UIU2(*+Fݎ6dyc?׋u׼9w>xysum\+8&\:2;s/δ?swy7̺93$߽뮝Yfc29K<DgM. [7gu޽{iN7Z['aJ#PnywvхCܑ[93`&m9G~ʯT _!}N_W'SBٜ1uR^Rcqth\s;#%0x<.W\qźuե r$ys&;f/? (J%ue?Gض{Kg(Ig^DD1+ x^h$ j)e|k˄_*zѢJ' )T Jg@ٝD TD\E#(󨉘A+oFpB栂fVè ryꩧN6mԩ8!"I(JNt!sŊl\.%KloebX1DE# www?c(x0փ२J%xH$ 'mBw-C ,Mh T"^kZ gA=yW%OheJ<β :aeTTi uMXpaXźGm53W,5Oez_tK$;@XWN8n t[?s~8(|Ku%9yǭSZOCm>87pL.D3#oK}gi{΄-ᄋѰL4o{:/ҍl5MetXI7E 6IW90jۋbCʊ"zD}X6x(*nǕ iD zn9DV ?0}_'~"*a3L){^LE̪|Mc`+ OtXK|Uss3rp!!B]0=-OR===LBq6Nßlt|1vc4cK@dBƀکV.Ld<$b YT-$MNSsݝՙjg@Z$fs*]_kp:Em+lE`Mu&$F: h O̐ݓqiPdQcR( f4K<թ84Ds [[/l7߼ꪫ&XQrhB18.3~E__f[l!a+NrHϊ9tGcN/>܌3ƌCiiX9B aL6lҰAz#2pbXD&z!a^? P#lO4Pr6Ct9nj 7͈Ay"QI(BBurkoeU. !':Gςg8eʅ|T'@cӢ.z,'(FT"Ue ,Eꩧ]GSĔjjp_ͅ=y2Dp>"`a)BȦQTj0@B Tɣ0d7fAXo}AK8M̽?V!ߢ0ɗӇ/?+*WRP 8Qj0wQ_vi/7/ T!$Hf餷ackyaP7p+1ҳ Z:P]MW,@tv|oʞec l} !LRE­`\@)dv_u"!o\ڵkȈ!Y{C[a3sS+6c]"D8ۃ xOƀ.)M-aWp ]oi c6{Bb@[7cZ;8 H*¾I0$Z{R?0(9p_T<p isܳeavߥ:ĺBFد0_d#W,|eU m y| ~@=MSp3k.k%+d"FOeJE,c P]A@㌫8Ɉ! hL\)JwEQFYܕ}{J ,Rd%J9B#0Ѫŋ Y1 4]opM8sjO<1d %.1"X"gfAX_1CB#?9^veP)U6Er9ピb\~Mda]IIVI '25BY%4Efۤ麍ZyyuuޕYcvkc;bBq(Z*RK@jhHM(҈Vƴ"L%(`16\{y;;=]}vl9ljo{}_Js0`R)f~eh;q\fJ}gTwP;|@6I}gz{{ "tf-o+p8v`Ц\.ہ Qk'%Q//L2#]ha=-a O>_hB4Фg5Xnp1ѕ9ƾ%i5NH$,I 7Kz8,5[VThaZHOiN8BQ$2 id`;j "RKH$v;K_T,P73?",JXk骰/D؄ahjۏmi`.>XS>WXB۩浨ZDзFv&W^LڗزLj~XZ3EhXC5"sq|2&IV33l  %DUjUtLC\Zӝl UVZX~`y,ogY7eLA{b$0<,XfD++XgEJOO<_IԵ,1<\wc#7*P(TL" g1aFaTLN`7z،l7IM,h;+p6 &XbZs7KLpdäp6nt^B.fXi׵-5] \z.Z_W!+JG= ̖= HUR}_\/q—SspgW2vv=LrX`!Q vt6EdAˊXa_pd2K!%e4AX^^8ׂ-XlZ4sGF+B^ּ bs(mE5bJ )R}'v&]XNi]S (Ei0vXmCH4Ʊk*ǂ'=PFg83^ >WC`J}Cojg# wDU\Kk%-UI=~G P$Xee& -QZ"Ngz&l&#?xuHv pD!@j|Y'O^%Iiˢ~{);ЈҾHG,>HG' Yr4%^oGIL!bM 8˴ PddU BEu{bW*%YHBa ڬh4JXliH lbp r!Sz%/*+;vsfh:g61␉<=~ޛD;uW888>pܴpJHd2x<8 0 \9`,0L&RT0e00"_ء}hn WlbgR~V>IY&沅FpbT)W7mP9D٨B^j@t">q2T$!-Bjl5*8j*ؼYodqqCCÏ7{z?tJ|7hP >ғV_5/qD"^`3~˿~1iE%_F4Mp D:#A] -!Ln*$WnŨ+ L?&Ri,bI V`oxfa 8}IkE?)dyvtW]we3Tw1])pv(I04X3؅3𐩩)"@$doo/,#K)Jɓ@ Xt: #;F-0[ei*9[ Oǘ (C[3Bp%rb@ЅrtW*Jh{za` L"a3u/9~D:-AW`7>2ٌT@t8 Ʊ^IXN#A p'\|3V?*jyd"vuBlR*2~7wh --Uj"]YyjN2LWCz %IbUL`m 8c2Ӧiv>6GXhe -jR`{@JT$NPm5 Kd:Wr)}]/quW888l_ZatYP>}zժU4#/Drxƀ֮]<$9qL'X2 Ù\wO,Dw\"SX$=[#<:۩뾹/kLJQpJ\Ow~\*X܅!J6 .a¢B3Dndl!c1 l[,~bшG!b7?}ν#4^'254&ɂf>$FfI h oH޽{QKqV00mYLE mzX>qaFNesP "&{/,L,f3u2ݕr8T3~SO=uW888l@+cYj?8NuØ  h,Od o Fӫ~owL e6IBgWL3iVbvvE*e-\XD^# Ҫqiplv(_ܖOMNnt9t yEعrp, ZMR\"U(l y  vMN*) VCv)4ʧd25'L[G|puKpr&J\: vPUjDGFF%c`Chx!EkWVRfAtwwe0OpUV*ΓT74AY v`-*O$a5KuWn DKF"n ߭*FjYDI>?;]f/f$9U#/ ;w@L#GFFzRtM7֙l۶ѣ1o瞻W}0vp#6o \GbX|ϱ21C@Jޢmkfk0dL(2-)bV]===irM,0@՞1Vd`\ӽj8*<*ݤh\.V\ zyN 0 J#[C*@_b6{z<>Q!YŞޞw`ݺ-_ؖ-d#3{_˷|؟<cǏϽk~TzL*j`vU 4#,ś0]XPh񼹀]1L_5'sb(_|+ wWfbh% K=tJp[!θA@dx`uhbZR>oPZq_A}4թ AkׯBI:::`e27=p آ&`0۫V`9 obv@]^uήrnhC"qzhӆr9/ʋ~/]x\jh}࿞|e߾e!TYNw(WE;D|`zbu!tBB]+.Kͱ<є شĥ^\B#d 8"1 }}}M9o5q$aޥ(ۡ޾$ _)Y%AGj&u M1G˩`f R7ԓ5@68X6m};\X,b ʳJ8"6fD*cfհ>w++mf }\%Y3ru-_ܰHM'd O1 <55nJ7]Q 2ŦGa]ylC8X~zݏ<ȝwO irve#ez!Ю'T`V)itźMb K mQWٷoy0:$x"+nigp]>'Dzh/Yg2ߢN/S&Hhr~eIbB":;jW#J:0^!r>P5>5r9cffӷ;~8]ð vb%(p`4x 垞p,֮bKb2ah ]2ϫŜ@,Ev| Rq/ ]N&&&z{c`?o1ݕ]X:O[b7 ƹ[E)~P(`h ք6Y3 {A"ԎyCۙǎ;?Acjsdo?6:!kn}~qTdB^%R*x9.~88>5*.:]1uCb l ,H7h0 &icp$YYL-}uQZ]ՁeHNVթlI\eYaUv\?66Y^GЀχ3W^y#G3gtwwJOL&c$Zɭ[㦩)Rk9v#`%bK(z~}ٻ9 ~]5hhbT"ܤjEM#FjiR"M" <}|,z@_{b2Ui,/q{Z>FS3LjJYr$s=z_`N G_䲼HW0X ܆QF`W6XEցضx91g=q$Kz '`H„IURӪdS/ j-xa42rqUh9O1s7l|ݺuSo6\;0diZ^ۼyj#N{BYYL_`򉉉[Y0W,1fw؁  38~3ѽou ?Yvk}1l/}fmNf֌\~ݰnt s- zV"R+|1VcS<۷q@g#"D+T Z#`P2K$,?p2_9$IbJLX!l8" iejhN}9wr98|+SR WgT7A`zrgi}¼$R%(UVz=1 )_DI,\ @ZاPY')j$ڿo/zGFW69.߿ /UNda0⫯ ka:p6طo_r=N$59~ulzq_r?nO27l:ďI:Cz7:wf^lCcG ]r 'ZK]AFa4,rMӰE-5p1L@DDR䇁G4PTd4WiMM\G/خO>2LKvBQcէ'Y+|я':zP| p҂o7-X鞞2Au-mjZ,K7[M7TG`u=sa0`͆%`ttt]pt%RJZ_27H^'B~)Zpcsq,8M2{lfdj7Vuяx"8)0a炮-^d`#mX t’z)*4zkp%XpcE((,Ȳ$+4k#&SGƿ}G]+?ɾu9YijjJl*)d]m[(I7DI. GAL vA`&J$(zv|/|k_5L*DKv27TM~%FW"Juj r?CR Jgd1Վ$RPk;2E?6HI77I#K"bnZU!R$)ed!:w2rr[bL$rl&T- ƚ<7|ӟppp\X$k>T, hdلo b) CH#ZHAuee[ߛ ^(p!1̍855۟k:[YR!u}0:-R)X ˖]^ʆoTڡ0n\fiiy n]DUYp R&w@*(>{; W&r&BqEޒx*ESӆ'Z%-C"BJ( V $=Azߩq]q+9BdܓE95o#A$I rIė ńsGqniSeYd҇/[_ʝ\w/p)õm۹\ cA08DZR#%`8qmgHtӘUaL5W.xF!?hգG*"Po#ߟs3 +~釯dVV &= Ģ ,+'(r T{S!%BGQ5?A nS,flai9]Q0PldX>x Dž HAꮌ֪O=uW8880k{W4fUa@_( 8Xѻ/[-* `1ی b/krV5U͔lf 6߾+(ijFK X#htNΜApwn0XxY7xJL:_'V4o%"HWI. ÎO QNt/Rh0 ˲(j*8s]wUț3]/:X73畊S ]q~Dw93C%(_fz?4 GL&3*3.]ƃd-Ǒdrfƞ={/]sCV+TрTkX"Ė۾wv\!D949%ɱ 4Ԩ_w. 0H?8| ;tTB=]n{DR%D**W׮5?G_S7}Y -_.L5>])Lwejdd\)?۶Yepqc}wRsW׳>b ,$|> ǁ] $U0tTzs듃 u];l696X*ժsZJovC #31>kSǦ~tyG|Irժw$"X&"`0dƻ k`P, '#32oE[* Ubz_>>ЗDx]X%nXgsp|4 ˲G-[Vg\߽{\.=蒹 G?K]2XZ+Whrrba-˂fX׻Rz%\zˢ68'INR*l&QZKfdQk͚O?M7H tVӳj':Y+vw"2GB l 8 0G=.т&"WQ'kd>#F〨|ȗzK'w>%`VˡF`f˖aOr "iZL@ĉ+CEP%Y0>,: +ܔ,7n$_uoDVÉ0 a뮻0[|.MRT0AnJ㏏É}}.$7Cdd\4<"Az F(+,`BQlb0&` lv~~>9^Bhz" v-"x~ZA?6|3(ABa E0 qpPkaκwEU\0o׃6b1bFtjL}H(!Q%40+g]wSscN,'4, VΚ&5:JkU;IcǶZLΰp\.iJ#K ``uL.JFNu`]0m65XX!Ǐ acn8zGWw%sxzGwnj ]q )ˆ[M / =i 0K;3rۃ'\r [V7_m۶9mommݺ[o`IRoEh 7:`//_EC|>rժU`.2Hoiwz8cW]up06mJӮ]FGGm.GtWF:+؏\Ppnqa,tЫ"0t W,4|JY#LeC_3ڡυc.,R?A/1ߥg;QktӾz-c &Ga$^,&I ra9=Y]0[D@X*,xNmJb2b H6En|fg|m.g~5k8lrr[(ڹs7߬B믿>00cǎ={uݻw倅`24MKWlٲF`Æ cKJWFZ`w}΋/6ngb8rU_{f>f8o(N(DJ$@HOHaV!o< !EQx!! -:vLc$9sU|UO؛$c i4鮪M?!wvٳ?s +277d)+20 +ӎf 8ުȸn6?FQ1YT@yc|p)!29*/5{6zSa9C4Vmnhb=biޚϴ̬N f{/p}pj`GtFg *veW[LoJ^}m}UPyX`Al'&SdAq,Mmqھ\YY-0R \"Mǖw}?t{y7;F $R dÇ)IGyܹsi02ԂɓEg%'WpuuHB۷og̰/H(#BjSw`Ay!,ז+- BWrW'`**|~lll4>޿#h )^8॥R4ADĤ $O8IKMcĄ c ؍:R'k'ZC#ɭ+wҕ2mLrjI=VnW+ 2-((1\OyWˁ֛B<q4mεV\Iꓝ {n0cQHz҄ D!;l< {$L@(*]/,3".Elj44g~iJt)ԩS<̉'("Ȥ,4 +1֎=|ۏ ֯+CWN>72wBy&&\=...V*K/kwxt$%&VtEPOis02S~jh "쉡bL#uJ"cW'K*=9rf|&,w Eq!XIip E!`\/8PC*)qmzh> t;T|d6')O>yȑpm۶Çgn1>8 1U( phn`wK}!D c>&6­1+H*7 (8P!)UV^xᅚN6G֕;d*H'%{Js^ج;IrSGIԸlAY[h%}bx8A .ڽo"p妕;KWt9 'NɢMquI^fNMFPC pH 5?a7j햮\n[lBO-%&EГ"eܒd¶=")…#늊BQ)PyKmxɭ%F( n5ᩤ}:TvM'g:fn,|iꍩ!NL\qՖbsZsL?.Z?=[ygAT/.nET0eR7MGQ+>'=K<ٳgGp'x"W 4xGWvc EFdz"C?~ԩS($?c#>X/ olF^w%uWll-tݕ}}Y+͝Ji```pvj†g1;jğJ!I[*oGG) gX\YY\|oz&z aYjemJ/S<{Q=uHi}Lt~}eM14 gS!HҨ^E7ⱲCZJe۶h >T!T'ߣo ʞat b g;WKVjZdr3Vo\xb*ƈW_}ܜ~qRfJGvP w}J9z(333GZ(X[oa%?nT ЋPx.^cǎ奥uxwɠ#)B Qyp4{׋hCW nb``0q_uJ\V$/8 K41{ejS+ڈ ̵7h 6|2,y]ay5!3%.j8᠁5]o,!D9` 5jBe\ͅzny#mB&Uʰ2eT 7 Ĩ { :foQH4|⑥ dW$ *b M~:M?Qtl$`Id\^?6BDpo &,@)DcȢg o߾{ovv^_Tʊ3?R m"̽[ yݕ#?S'd3B^ضEα7]`nwmǩg,UcƸ&V¥оUO#$Hnы;Y1N1,'F)W.!Mh"QFSCW %W(6R*A@q:Jƞp.xrU9<|D qT /BO( T~[0 IVvfry5 u  7eeM0-r0mw*2zE2`%8RVQ1ޜ(ܹskȮ.D͙ʹ+S3:.%!r?Fj#U]X\O/* CZ+w;="")7) Zt˸UlBTq/W* NSNsdi:{笳Ne,'YD$,Ym gaWj]Op6(Ty}ayv͂.F4lPbJ]RRH:77G#2Qm{ DZC`+yEQ{]100v%Z/-Z.XbN@EMV)4֍mV>p'3ݜިoS(Eïa)Z;2+2K 9zW+&!y')Pl-%Wm.Ze7FťNsaҭGWR\aZ/:%G'3gnBW,I^PGYղjd„H4r?r=.k BIp(pr#@$-T2d_nn!Z) ITi Ec_E ӑNl-+ iz~Z jifC^M][zެf`-@aER1iN TD\IwT&]6Sw(z^z, ST DaV,ߩ* :"ĄQl0}R%(2+6fZ̈́U]APtwJ4sh(jDBN$j/G GZᒤ>CZX7߿8 UXn/7sۿ7LՓl"RLפp;Nm3cAT.iVgDHN*tNӶ1:H (JѦ.s 9dIY$VC5`(b2܂4.}e{'gAŮ3XEl6TR&[҆.%Xdiz_ GcQ(%6fRN_u(j5Q0lH_;vS,,WC寎aԇ6SPn{} >3HA^*k (4u< +q,tB݄5? i6x]!vS^|jnv6Tȇ?Zo}ҕ#60tY*<T%Je = kV^D}79hQh"tUm{!h4 >U'`%eÍ7DaG0LGPҧ{} L)幕 K3[dP|XxWJN? x+GX8c* f^h]|}׮ZaT2Yom;wݻj7Tɋ1g GiLN\VsdYl^]b~qյz-Fێ{(FAz^P>۱m[6ðn;iaII*Q78o{}Newrk龜 aRvGC g~/glLQn:̲4)j7307ueSYi fWB0M3hz]YMKFdKd  JC ИF``d BcsbA? WJl࿁?^`)cSn:b``1K//ꍹh4fsڵ^:ߘO,~yuQfcvopni`,c.\lzfRղ'#UM%GW<=,|uCfsl62~ܿlwnџ% )2V _{gGTP#Q_U۴iݻ9>gWG.Yb9ɩVEQLJ<|===JS(|K)J(k.Y1NO97tSWWž>.ݕ\ǶȔY%5^kx.\PA%Uĉ39ύ'aAr({z ^ndutI}zl6WN"O?,40vvvΞ={lj7{=I;{-ރ6xJF'jH["RAbArxjitKR+]mmdjwժwn3dqY AH խ:EDӧO|t:]Bau咇AEmcEiTymL=`Yuqh<B'F\"(Wh'M GDNɳeIzw߁j+|H\h"S/,4mB= EܳP&XR F?<OV$5EUa8t\.^|~@or k>ZlXG`iӦ8q護ZV> .$T{W= wk%UŽܰjBYhѻ>VX{n7>#U,X,s]p֮]~_R={~uWZ[ uʁzW͞={B !/޷oORW*w~NH@ ?|YdɄSpA8㸖Jd ,?&ԛ 0m۶Ep @NZX$h\YFȰ[N26(EɦUU̅J CC(os@6Gb,9m?=8R*Ywu034IIۿwؖ0'Ro!eݺ[әP(2#gMF' v~!'E$æ !Xl Jarv!Rb\!ٙIL&iӦ왭[GXrXPzr__nG/8]a2\ַ(FJѓr85[ׯ'_ff*| ȟi!d׫PXF\Q0IM9֖Ne:~57JZ˞I#_;h - :OxwpW<;07l %ƳȧC<i\-@o&Mt/V 3Y2a2dD( H= i6KKv@lXCD c?$lԐ*V8 NW'z 죑Sgx}{'Mxp~> N!~|@2#XRp:N}:Ag5dutf{3sH A\8\Ft3 nրχOdQs'/BСcIۣS+P6Ҏicac?#9{゛"?;d`cEx<1dD?XP DVh"uT_7xcMs]x<Cч|mlYU>㎎(lٲ={'_1$a$Ç?$I`A===|=K1 h4T ]v-]P__`+y ZdI:yɎ= Ccǎ͘1#0C$dc-Zk}^aƦ* hH`>ؒ֘ 164&DQ" 1Zj2ܙ;3׹~Zsϝ" eκ{9g[KjgPP"2tH^eݕ v zfQSw`Ol-FF &vo$LzDZ󼻾k0? `v1XO1aHshvh9o9z $-Ēj/r+Pn9zb7]-+b1BfZڮE1" N-9:0?9l~?Oz@k=Ǯ:c,\^Pfn@ȗBcB/RW4ii/:]`!+y5uO 6|IPy'JO1FQ =s@Eh# 𥧟~I O+Wg`,qO+y\yd\bHVaƉ^~bBUH^pFgcn?T!́*rPoзs/G8M`fmy[EET//=ש6jaJi[Xa{ΰMUmX,T^sms@uASi0V )/rJy`pYr8#mَ;2d=^ +SOM?eAO Ƞ'舺vӋHU+,L]t1FMt2ͦtf^QI$&KPWaZoֿEthϋ;Vl+{OqGenY~]I V2&Zi 3fb0ʵB߯עsssdNZ_e[:C"K3+^0 L}LŬ(09A=]Z ^ųVw@,FiT?х[&~wZm`pa Q+X i]ji6EstiNE$!dc1*< /Q@Zի/$Ea r]&=ttɗ'>wFSumuז%Ф9f)R_OKL{r}5@ڞ:O-*BY01bf" R9ΒrVԻ (0<dT0!6;b``'6 =HS^W? \IT ";ZY:`#z36OְAĤ:/Qf.ઈ 2<,vLVU\ravcP\&PܨK'LFk o\|*imɂ k=uOpI+* ޟDy:Wx#6 ,)czyi _L/: N\d-:oҋjwc̷mN3۳KK&-qCEs,,ee5+{0F)"b = s.)@KjuNc ˹Av\-Oثmoyqޝ@jyj9X{_Y>krX6NFVKzl"++r]m9]r'iu;ŧ+wΌzsw0dI⦩LrVp8|Pji2לHKi5IN?(riq~~>=_߶8KV!0jQבO? &z7-Sw`t+t@Nokt6.v$jaz5$KR~rTyL !go13N2\Yl6qkmQ x#;+[] كۄ]ocuM>J軾1\o&(XHuINKb]A;o$+,#dl7Q$]GN ky%Bq|G*P̖%o+q,,B`@W,At"sKKf54\FQaa&,,\stt*G,]$sT&AgZm7O|o+}B?% l;kb88z[~VϵځzJzWgzOr \]2 aiqC̠I$CW .#]ճ4G( d<+skpbL⡼J'ORMWdwKWf=;.*.xg"U3CPZO٨Z>GZ,j6p WR-~k=vS5PthEDY6)T';#Sq5tݮ6FcmsnqDվ?_L=F1q9W820И+IҒM?z. -Ge5ln{,+ZjNYfp55Dj5ƃjz)3&6::Pt/ԶIVB1UT^Zd}&&~'Ϟ=lӫʙδyS1Aa 8TC}놪}C?yRyx19~ ? mLgNw+Ӣ\ћlhv3` 파RP]GWG2J_Y8uKߣ l' VXPv6zyyVMsƻ vA&Yse}oczۧF5*M7\O>@[YA t0{ F~qDp!lR2Jm48k7RYw% g7T=8N;]߽Q`+eOFev j_D?'n&h:\H Sk׮yGB/Q1)38gFDg[Ǟkb3M^v ^I{I *]TB8BILUW\SuCR =t.⬹< /Ckw܁b=+W~G(̘q3w߱{7rCDXFi8E.>t=S[h_9mК5~I@UK}s'J}whP(oU:)mUbŊ'KP%nh}RJNFaC% qrՂxʔ)c+=\X{,Sf988,\t/_:r1SljAahcq$aI#QCqE'H#9hK#ҹ Y}%*wU#U=` @ ΝgI}_2 q@1I m4Eд&; W1l["kɓ?ز PP]\fߞGLHU Z&P[zA6 uj[ŋY3AdEX7o޼f!sL'%hڨ/#sFJF%_1 IXO4M+Hvϙ5}ڔߝ{z>hT`Ӈ%Kh4oЃz"ir-UV{ꩧӧÏ>w=n\݃DC'A,,LrֈDЬ%sPa`q(:~dM$JkpppmdEQy5:?7z|'V'7o^;2.gן>}'شi|ncٶm[Z]z> \e֭ U88pϮ1\$ o㏐d,C=~'1"P5]] $Kjt1} ">Sr~~{w7˻"۾tɝn=+3R:EKyj-]?߱Ĭl,Fc H8Bd nfl9#'kFNm/YtzvZx6Jϖ@a:QThf/m[]};N9xhOjOyk{Wo#NaGDW%aG Y[մc;R,jSZr\ M`(;pop7x9sH* w~kH.SIx`Jh(1<4`z@0*2j;v!3Y7ni{31888WޞE(H^m eG)ЅkB$&H]BjX UʅaN$+C=E1R9デMPp`^\m/抶?7&O=/yoN41ߛ(FaMIwٷ4f(Zуء1ڿVU*GqMrN`aw| ǴR?d[1Q&VnW+JCZu5wAW==}mm7s}|r4I#RU ʒ"6,c+0X !+YȐ\.ǴS$ ; #UVF Vyc C:$IRU5ST\!n]I~p&"ºr d4wq&iyQ FA-8A$>A$"MCCWʎ="&%lVV;:4VCr6ѯrZ#<ҔN6mm۠ nhSԴ`%fhۖa0$yY*UKPh^* {Μm"Qdj5J|OeNP꫁VJ:W1:6A BHCoY]=p%}Ǒ aQѮǵ+Yޕ_| 0L0Fl,?|98882Q?~?hDbJ  i\i#"WD*w*xByԊ &YM6:\EQdGڎr̼G;(*  X4*N`*m4, q͖74q"aC$eEN4Q݈usJYDv۠Pwy6A}\Ă`zHb$ 4? @ 0w#1*eM&t@L;Ls'J?T h` ?g?6pppwJ%AfˣhAeqdL6d]L "[ou kI (%qB1f{+@d$hI $cB p "=ACɫHoɎvH3h3! q{*r `IXBaaBa",WB*~HU^R` ͢'߹=3H1N@[]v}N̹}?.ZGY\-֭{sbK%\_YcIrDaj ئ)8VR8_ gzS.Weiد*N/}WU]/rW w$3FpwŋHӂ-v7믿azYV4mwllE}Sy4MvY@r #i#žňdcqf[gwأ )\8 uU?W! ŵV^@FxӮrHCy=#ߕ+$/q>OK]9. l70'$f8d.IQ`^]!1 / KHcq_H2mr{7-+jAϜ6z[e6Z i}3L`.,I7MTf.4GG8"oZp| lDžw66sU<ۆ(@lB̂7 ;p47aruocGpXE /2# F/_C:"\.]mKTwjNypynRfq>f *AB De8u7!O^ô8L rN[i4[=hv``ED '8s2'E1CEZA1˥EM4-kTk)c?ƢLKI(őJzebQN$URK{զKJE%EQ[ˣfU%qFiMlF3 & / jRkUC+ 8 Tu;9W rڮjހC|DP,YQ~HɜϢF>???B&ؗ(L7`W! ŵ!Hd %r_,8&'&%}۟b߂m ֗}1jA'FQisqqkWa'Uf8AP`;#"ar,? nبU dR"~L"M8D!~Ruۚf(ȓD]LU7 kz-B"L~qDZFjU6gzhY 5qX>Cֹ!$I46Z^[QKmG 1Vϯ*,fz.X(\ѱ|{|E]f\ ϳf.+ֲ9\crdXPCR*b/i4@uW(((((((>F6S*,, y&''W"Mn[Uͯ^Gk7x( 9i-R:f ̥_**LO@dĈ^Psu˒EQ+f/]Q@֠ľ^$ZA.Mupq~&׫%&KUxՕ,M\NHE28V{NcBe_Wʊ,Q(KBq@e&MJE]&KyE/RDwqX,4YYwܹ)l1Z,Cʌj]CTwett4]AQ.h gWeEa^Y_l(b؍*<)~9ܰZ0?s/?w~1+1p/ H,)]]:1(gi%!p3uc[;nxVoVUdl+MՏBV)0L°X/ȞkF <[䘕ŋiX+8 y<$mvqQ߳oie65ghñ@p <!.$aV~QЀdIdTs0,kj<0)c# <$γ<GeZDQ499+Q&KuWiY >v荙uҲRKBZKfkF&\a ,%a-[dη~̀ QuQ.` I4:vx" 6Edem^ éq#Zbv[lg:/=쳧O :Y":p݇']Ҥ-^kAYgϿwۗzmV{y\2*1I H&1 Ec +K,ζmJzm =4 f;FT,8tWբ.r9/ \y ɲ7knky]g{/{fq(Ξo,;Cysc@ݽwO;M+]w>tp+JhdIZ <S\ٗ^zI V˥?zZwdih;СoşON\HB#GDnGˑ i{Ю =#N^^m!*džJ@9:yf<{]ή;f t>dh][eC%}ccyV;vξ +8tB%Iﮬ.zg^-U<lA'O޴ƽ{8qrjr#G< ?~A[iA1-fO>Sʲ, X޹_̇:F)yͿkuڧOF@҈]"ĄaV*#KWI~h[bQCΝe#GzQ;vٳ"qiݻ7ZYm9~g>% ֶmp,jz[8$aqdh,KY>}zEvKMIʲ* uTx$p l\MWI4+dGqE+#$^BgΜ2QZFdm iѮa c~y+P 7=] i^2t7B^ŵQj˲{+KWei4YH@͛>WXj㵓alFL&l(r,fِ  $肐Qp(>GޙQw}ϱ;n$e΀eMd*8;EAp5Rp1$qQ)"l#( (#cWV3;GLߝ]>5{=y#l9se -I7/ŔA7(~M̙7o@S_&dLgzнiݕ;Pu9^D"9* NvK?)KQ1&$aQ( Z09&H_|E'*']DAH '$'%AIqu-Bb!aĘxQۏPgrDɔ ~- P4t30W 5+jMxO XmlhuӬժ}a:~*嚕{10f&_60UOĘ-^rV^ogÆ }CZ^8Q~Q FPdM X .S(nV@ނm7LK7~{7Ň&& زbR% 1|r(c`ú&׭[RthB5)Qfi-ZjJZwTe^wvdD"90h`tZt_OԄqm]:Ox)W$`xQ{=IO\!őHqJ`JSWNi?D D(9<%$OV my|%Z#p<sx*1{ٿߴf͚idz)?˓__ >Әq? 3j{28O___6 ?O{λ T86mڰkǟxbzAhif<98gnԖEiZY7ZE1CkY~=lQ4o= kUlG0 'Yi( .Jm\>?~q"$I%SHҺ+Þ={^~+V 't HV0Nw%`' 2aZm۩| f` 6ƍGۿя^ agGy 2T0AZh=+Agm}uĈY!trVFUXA^~7n Ϗ5w? >AS2NSHf D"Ex0e;qF8J'H$'ijSL#PN\IEq2' ;}pM]?lÞ!01xND^`ap+ØC N/ts;X;Q&YA-͛t ׋ Bi?jnKۭayM۱󃁡97nد? }:rp "drcJ###0F:t fdxomZ L.i79=8"V+.97즦)G*`R2Uۿo)ܴ)v˟}X&uEu`-7|JՌ__»N8ԅǏQr])Jݺ+WN1_UUE"oYwE"<* <٬a&BS n 23D2KIgWȩ+@%$@uq?D( NM8U.{՟80v!!Vi+ȱ*xd۶f@Tbqͼe(v:4 Œ0 S4WTjLm?4n9=wjVlPk-7 E}rraPVV/eՆ7lӬw?nAt\mE0Ζeh4ph84F1,( j玏v ?\VT} }An>='w ʼnj⺊q<4gm(!C` "PJǸ'Ⱥ+dCSug΄<3D2#$uJI*ȩ+#jQ /B?i#EžQM􋛾͉t9MO7Gn):cW`LpU ba~33MP ִ(\3Z+D9 LG8j$ 90jz;H&:hn+z3C+‡Nd`В/ߏn+e WT!k@ {"'\8S-\xwSH|@@dD2ۡ%q&B)I<*cG"%U)`pv>E`]i>RCdj5 `{>UxoN<qLuC( `G* Q0crCL㤃4(YGX EuiW.1 cccZQ^7د d Ob~ ='c+! H$D"939rwAv+ 1[FZ۲z3a(ۛaU|-a2OuNuJ} :MLYW֙I~"H$D"939ure*txґє*fVĭD"gRmy"#gmXF>сEgb4T0$4Jmq:iSf_80Dqz S&o:f4vgD"H$32[a\7DS>펿. cccY|d'1 cϾB+<>򍢆8TFȳkJ&W6tq;R.%D'0b ?N+ 8:Bo5A$Ft|%$YwE"H$ə) ;'hZʱn}. Q'h?s F.c5Cv &!4=qD(7oB EF%/*!DP$Hs[ 몜WȺ+D"HLN\i$CT EتiZXG"n#>lY+ϛWcIf+AIpRE? ,1 f\ӎ-qR!R ٕ"H$T{bW vn%"ۈ3Ҭ,B^}t]Up 3 "{q-baRLXƄ!ʒ^ww*QTii \OPU5|4뮤$[r,eD"H$HN\q}/5+?L&[ ݖʒVF(8@ B?SZ{7熛*7v-K̴ R‰G_rn =K._Qt ,۞8$3&[nMI=o]zeztM3]wNFSvsP- +=[6,]PA+՟]%1SH`3sٳ'vs+D)1fY0%8&Hf:QZ*ʣk sݢ0cu=ʔd裭 JR$i2" 2jzC?/^w-V6<8X=8I(i՛ Lc)I)XIg[hG;_zAliRm3B4}p"8p K8(4^.W < t#IŽx2FR8q$㴩V+1UkI@ lDI^e@D_FUTjޜE YƄ  mD@,Jr5aJTj,XȺ+d.Lf!w62dU{d'n ~B|B?ܹӰ48WܲeW|ׅ?B߯wM7_W^͛ەà7BSo^vpu{4o_|ヒhW|V.]y| ٺu~Ok'R^qI_:#8O C= (/pt޵}jۛo=דּvTyފ/pOyk_o,F*=ouU19FJ$"%yÐh%JAIxAy$a(a@fWE0;~~ǜ`‚v;EF ~@iQ R ۓB2(iWkz4gs -l[ݲ *;V?J7H2Ro+w{pTMq'SVcZ RnC{㊮ϷZhcXzy7ijJiU?*[¸Iʷx4b&dtڥ 6m>:[, wN?T'_0uN%/lϝ9fǽnS_:sFvlۡ8񑚣nV.U;N;[چ[Ohp;ڭfkXKKzԁ0}vzm;wiܲzP&?}y]ܫcG;>? ^s:/QӐEk٩C׵<`ɲL7,w=~BiB k2ayuWx|pӦM`xhc) ၦi 'yPd| 5p(R)`#~_|*!*E%[wLT|gFL"L-iAձ^ }"SU&Ȕqo(fP1jvǪz{t*yΞ?ڵhWfˮh`J*~)&!n1(?m-y3sssy(,Ǒc}#U}|s+ 2>=;<kMJFZ1^3t+/5^Iesaa!B Sc/ꍦ;{!N=cիWƘ3x3334ܕoBc0g}KOdyVRȺ+_M WSQ"B@\M_,e g;YK\@|~dPLolU^Tnjɉ٨za`vvvbboy}cK䵫t}֭899 o39KaXKq &g>tu}zرc}*^qW,*+e3k:ST\)bz<0=APW*+ *:EQΝ;3q'tk}2_P'zm.\@Ҵ .Di,?N 4td*vA")ɓLh*l蔆LF/_"[<[j) pW%W"jx1b7WbwJ%~(dQQyP6 4N$ Ls u UmE P: Y vdi!QBh .XT5Rd3+JDMcZe )S+$9( QXF,+E"l\r"h*Lߓ&A3hC*C YwEBBBBBB⫉!s)r]dKhYX1Yb*>ZeY"иCa#P< T)i):ZRm@u*ȃ颱!* yCY80^vLa),Z̢[^Rh&8(:lA  92ꃍd.]$i04\&vQ MK]/񹠺+X PTwe˖-'/.#$$$$$$$$4L(*+U15Pts `IB32MU*й]PY炂rs8cq󓁪a+Q% ` $(|0͑" 5 a臁6mDV%FEy{ G!K ű% JFt9U zNIꐉvp$Kh<t`vAݕK. 0ނ/5euW$$$$$$$~m0\`\:xwr<iS20w&> F\ SD4]dI2ͺ8Pзld  @aORt ~^(l'**ABL 0$' ȇT }BQ YKh/-d"e\ mhh .@bPs+IbrȑBȺ+_M \aFjWCRrП孷nt:i~\_M\]lG'_4nIA@t ЄI/8bp%"ey<@[T@9($dft8[U4~VI!+Ž`H^1C )Oτygt I# BV'tϟqǒ*Ⱥ+(Mx9㼐U%$.ʂmF}.BfT-x*/611m6WǪk] VӘO\`F EZ0p]"HB4 $!d cs57.KHQ[ǀ^%W[L!cܬ;=Uk- ^S=|z箯}c(L xIh44WnIYZ`sOӻ*x„-RiQ 22bHH0aTQ$T7Cg2 BML+. KjOA]XP8ywz꿮\P4:ѹ9-+CYpZdboڴivv[2\r5_O!WF*f~џϾm(ErIID-ǂjᩊ1}b;V+OM8"Y_l884U7??OsssB 䨃s! @,-x=Btı'!1DuW$$$:@h0;mܸZz6wD΢l& rEBb!Ag^xnYĹM +̏˳L_s ٿ?O#{p sE$}FauqQZ)T4DL|"0j]4l>ø`l%2}H*mi8"V:7oDKN*.LKK")P}G' cf<]]Wyp)e% @Rm~}ga+ ,낻;245QI6>T-}?NnjՏ~dL }.p7FՁx.]XTcd+ 9r}APj̓(aFxwOOAb HHHuR4LSH 4$!!@5 AB^ &W9 IY BɸTZIe Oal*fK>+kyyM&CwL< ]cӿw}n۱cǡC=(0؅h`~HZb;==Myȏ;)zu{z<f2 3ƈa1Op"";rmD +'Hf7Ym/fɉlۋ_ƏN%3wc >~P{X3<<|硡H۷pY4#C|.L+ ô;85!`cBDt 0m |ü9(4rE% G?#QKIq4f:Vɨ!rq+WZ?x oF*ĉP;Gy?S}i#wavDz,7#WT+Xc% @,MADey+8ΕV ƛ5?9`/ bm ô @5v#O);0 Z( Տc 0#57jYޞru wz yX@DeJ+@B$UVAKE>B`\.uV.B֚X4B9V.N8 }`aaN?,p@ݨ߼]i*߀PS"'0@ CeC(CXQ%7eLzcff :ٙ|WJfDB(R4::q^& EƏ<yYPJ Ax|XZdnaއn<OLBT[ 1_Cr4ўN,}`00 0ɼ5 %RcَrF7nIukV&A=5.hb'GʁQTraK:ȗ ttg3F`3OcBYZf !gz{Bi@Q@`Dh|0f4X~A30RTOOzpi``\ 9 6nxYAl1>0 ]UwGپ+,wac˰iCȉzW%AdֲETX3-Ct nf&izeUm4"W!;'#VMJ6"J:a߾}X8<:~͛Kҹs"<1<822C!(Ь>lÆ … &Ҵ7DdP ۶mGZ/A&'ƍ]]]8i.ÄwE衹\.YrW^yU?11k~d ػ0 0 3̻\1L!_RܭYCB  !|u.u5X-I>wM6:لgJ )zK/_Vm/C$`s2:v NI$h|@8R==zXQ#M Ca' S"Qģ@X죂 L&399Z|Wp8y6<;熲 0 0¤t|z#-AH }aCԴ2)e3ut < Px331H+|?L"H#i7ήLP0,$@PZ< 5RH9@u`4D8LsrHШ wڅRMS^{5Jb:߹sh. +[Z2  }W~iÏMq( 0 0w ⻢m['4T]Ҝ2ZQ wQR%h bbE&31+9 UPHYU;RQ%+ɡFx %>B=UQ_Ci*^HK12@Ðy/b=mFK<&C5Z* kaaaNBP/)Uu/$Sf39oUH̫XĆh֑RmdMD#\͙.MmJԣi4g,Rѿi*OBi>XaKCkhJJЧo7 ZtyWl1N 0wKO'yeuZEu!_pO>^vbwavFqRT;͕e=ô)4#^,+\ UETL 9:B:*I3R(*X:^c8=HVQ_{Qf-%ô0LCnc.\xW?b jɱlJaa5j QJ$ ッWYiYɺ+4*l%ma2TӨ|!jutuB]n]R]D55m dnZfv|WpR\!ߕk׮-[پ+hea[@@իx o$jFUbj-WY0Ly^L!+Wyyy+^bzSZFDžUtI&҉FR3սlll,ӑB4ّ㗯kٲD㕎4-Kf0Lþ+ ô;8Q1Ä+b Ӗy2ôV jV\9ί\ Z $5ϚtJ C"tztLQd2T*fI';3?_MWAf.jav}WiwzzzȔX Rak;ffѠ)AF xX)al,u{iUK ۲}یFB,kD&n ioVN/M/0m 0 d t2jBv2ô)4"=_,\iyL1khEz1f~X6"?LH WJ"P/#6imEk}T.7)3 0 D èՄ~H'1L _0o64+}Tޠ؉N;qPT?Q Il.Ri\JA4???ޟ^UaBՊEm_jRT7rJ3\9}ߴiS^Sש)kن D.U>5l)AH 1444Ⓓk&ߕ^xt: F 0_Ų,*VB.~1 mmeG Ę .Wm}+— z>Er !^&km!o,zdLˉ$at|DAl}:2 &L[\հ>dɒ7n'ze"K9hON|;"pD@dy|WpqUs8,߿f͚پ+8;::{aa憅 ۖ*^U*ҐF`^fAXwd, [uEk_7¿_=ΕD+0LrE};;wĖ׿L%^:<Hqw֭[sA$^YϒK+jNE2== u%d]aaNb~sW 5zYp#&Y:V+|O%iХ9+,.eZsijfQ]ӎ@W4V {g~JW.,1C}eZPٺu=ܳ|jk׮g -36mGAW.]ŚÇwvv͛|͋/B;wkpIrڰaӧɓO>yСd2944DUeLwaayO7[&}"^s_eGPT]Y?[Yn/~ tE#0\.766Ɠy}Wa;T{$@ R*'Fk,%qR/¨f]y-{uVdP,d2u'"JtQ a7P %F W. \!jhM6!bj AF311A3FFFhصk6o^}sya ]ܳ 0 0w$󟻢wA:UBMC(%[Lԅ1]#Uo챸 ~EcZM0ZW%l)ftctX=g3oqcǎ=#S׳PNLU~GjT:<+#ܱcǑ#GΝ;}v<Mmi7n܈6~ab7{ }WhZ# 2 VB_Ϲu("=ô/HFTLjyn_b!&c4Wt[+a;uٰ\; I1u1q$3rpљNT: *r_v-YGctWWN ]˗/wv8Csȃ rY}*.]Z7;!pյk^xg8gPvdvJ`U1'4Wj73L[B:4 UY Wdk暯M' !Mf^Yd' '?ͫ-Rb0W7)VodPYT:zU-HP.JTK8zxͰ6RJ,PqE&f>b ]9p 81_aBun.\K~cjɱlSO薭P'1GW0Z0AWYujcYɕbx5/{g#Wګ6^0c/8BQ$ɢHd/a"Q|HQ(h  l`[wxk{SL0XÑy*̜}WtǥZP-,u[WZ` ӡws/WT]brKkE6/,OU.(M`lf`HRMw颔kZ0lK@@uTf*+Tt*#[kc쨜-Y l;h=A@Ս)}R\2X`n! rC)e?e %j505zQUV}V,Y*8a:!κ1&\.ɔjio@BbACkCk@'ybb}Wa>T{9ĔnQU,%ڞ2ZtͿuݢU+z~u7t=??#FbZLѤT15]TtʮT!UV=U"E!uh4蕞dC!g F(X1EZj&We\!}W/^L}WTLE:66611sWaYH̽\1Oۯ4[L(a_ɵrq^BF>갫""BEU5huM)ٴIZz6华Fa0vqD9C"nj"jJn}T"U<ՈM0 6LFq ޒ%S>#fþ:pJ'?+~-[F*wL{ߕeatû"[RDKKDm)-Mg! C*a<6Z_>Ɋ T"NP~W>[6 ! Z:0W+_ B#0X{ENGT*7o:5,E +8#`\n]тq>իW.-BfeFs/3+̙32q- ߿wŕkZRt/0 00re*ԭVJ4F 8$\;gYG\\ڟ5*^?錥TjzCD{;f.>)C +SNUtX{1W ###(bBCW'B m\ lp 4>1qW`:0 0x ~z=/\bɓ''ٳga>_f͉'`Q !s{rboo;|MX7n<|C(ѣBǡ}ݯ3]aad Q(͙".cÓE!-#-I="SF[6LT*s,Ѧ+T:G4 C;.RWW#GS%/A#d2*%tV(*n^A)  ڵ>_8==ӃA Q(''!#رBܹshǀ{~W@jX0WH{ߕn<*P2Tn gj_aσ*n'N?jcAmڱlSF$K]ak63Y>iŲ9+QZe9v L%0k*QŔZ`5Q ˌKZ~[]-{uܛW:C-`7UXl4ӧ!0`mڴJae F!Bc ]!8HحP(PwA۶ mFİG!0W]l2ʏ+gϞ뭽 vhF0 s-{%f+WH0H'q֫I/Ѽó\aN^Dž`E0թE\-#U0Td”ZLs&LS~B%b\6>JbZZf h1 EK,;S,]m߾СCGȫk.8Ν#aB[8D~."VyZo{*X~֮]ǎ98o>~~e˖O?W^!as%P,P0\{[X*\y8FakcJExѩ+JFM J_ 0GUʞs/W% "ۅjk`1t/1I$-O%C]%L7Lj*Sjа0XtTѣQNMMeSOcBKC(_|BPlzVDbxJzyg2[ T*\.ceEtAGk0H0_ ]JU7::Z(U .fL*k[g0/Hoo/)Ld3Hݸt4nqZT-ˈBav̐ԃN>;]- g(H ScR#Ҟ]ÐԞ9_,UT=P FJ=U,rb޽===tŋ%0_z%ړ|#q#HVR'd2(b\9qߕ}W~zTKy-wakqq$ [p/UuF=U` ӑM+R*bZB[W?J$t=6z;W~1 PF l գ3v jU'i geĘYf2J5V(oV!UN DK A?>3$*(W`OH- Xā!lD+Þja(Jw!+ck \p 0&u#<_=4 0=f)aB3ta`0LU~#K?/OmdPIOԦɔFnҌKkdԬ1fؑjRGRI3V)1TIRbO^cH|U(h MI~T,QX0W]aӡ@j9B-S v;0 l*a%S{Ǟ ]4jj L{eŴCX7dL)Q&&JVU'U 0Z5eČ1* >Atww¾}VZwhp!0 0 k?W"4]Jj'00'K Njj(BsZmRka١ŋ EMLLXfX8waa<ڋϣ[GFXUITފ RLVD6ʧOݙ2 G8Meθjڼ,_]aadJ_ "bi::;DžB̙3= l*:iQ&_˿f!IdJ1tgPcewaay Fbdk2q}>EZ_ߝϤ:]g3r·ɪL%%63Z*B0 0 s}2rr!vZ]5冒%Voo~y EUDLS?_Zݯ>l64ơb*Rg3 ]aad>;S]n>\IW)M 6KEPZe"\Sc~q'mE.uLc }WHPx+ 0 ,H\O}xGD3>Ȉ%TJOFgo\R%@B_?o>~v?R@EQ)AЇo4Wa,?,ONNҗܴii)5bggjJaÆf"O;u˖-qO@6e) s%+O=P. 0J~O m(fցKi9Hz9s FeiMSd ә%BS a"er֛8562{3g8rOװIHb $&Y BUKV[*-ꮺڶꗊJjr(BQ7HBrrc|=s}ĻUHy~:ΜΙ3g<ܖ\^_D53M3Ί!,\.{XW3MQ YT\/@l#|>0Ƅ@8 i0t:M}/5kXjA.^0껂y/^={lWW׳>̾+r9V, ,4tZ$<2-j0m Y]x<22MO`TԧC$M qdrJӉ//}lWS߾w?s0)#/aB8L?Q7lzj y!::ŋC@?~+wyʕ+VBر{h~!N/LLL@Va&wav fuٳ TBE8jM4OY0LeBCX³^t!ᇢT*89$QGX2y`p3NljEˆ(u%ɤ4|˶ 0m˶_K$s.*"3[v2N}ne/_m;qjak׮u]KwG}J-uuhF g.oٳX:$;#7n܈T*@x>>E *؂3owav¦\^SL[:u-iiXiJHZWs+WΈN2MfV,_"^hUy,rE6oEvT&4xgcŲ+#l>YGUqcǎBTӞjtիWl!Ne::7::Z(`#[\.SƋ0vI#_^հիY64tp[Zn9wav?:U3t'0m *M WJev_e^Df,E6M' A~,a3,UH;:"P'|pg0fԾ.'~`N!2 ԣTӧO _EE.T*040ڵkvw S)~ҥA;YNi)ꌜ00]aƇa:Ԟ٠-fCޕV99bnT*".!%BbQ-OC=eD% W7\IXyO&zAH#g;xtdVN"F0ebQ҃21U`[|9D(:Ŵ*t===gΜQ6R ;wB_-B*Z0 ԄMJV}@J? 0mkfg=zh+BzRBB8w,fRǭZz1P,%|!B11e<_pl1YSZde8.D`C޶]G>,ZO) G=|@N:Eꐪa3N0bw߽}#GY,[lV9q="]w݅yO?Th-OΡ ss 0~71qUU%}7o07ak`پ0`SP)5Nrqh:6O"!9"QM pD:1ꥒ˿;%Vk [ŝ}1~:HpM4N?p^ĴՎga$Bf|G |eL$P,;::Jn G;waaۓu&!UFO\1=V 5C5` X Ӊ⯗iW%1d D4D"wTk 'H /7 S'(KL y=+Wq0֯_o.<{́ 5HbBqb!XPJx-S[}ə0 0 s{ (*ɬg*mrbKBq3*.VŀtIZ2Lm$\zE`a ikuI: b5*SS r@(aRdcHEHG ق-`,###BIP,u XC )珊dDy/9paanO\qjEni]88RBäb!S/T^zAKtJT hR6O{ S,VTgST$ GTHW@P/ "|#0 [i7rЮVA0*+<===`aL0 pn18( ӾPZli2\K,,Bn@UbݽtCuu%vl^&/|H-ySTʾ"D CZ\ rL.4ORɑOxVqŋ`#LL&q\<}WiwƟn}&jmu ӦPXGp(evKAa8P9;r[6.e/FyÏw̏ݴ/5.TR ivT_xoYDnH+Ye]Xx?5igs-hbHp[NK.-_|rrtttP">'wavB̙3o MRmZi}+:+ R6r 񞞞kV,,#)) TRuʢ9Y??|2n"6!oo~҅jq{\6n\ϧܑHF T <(,r||OUT U+Fpa4֭[g3 R ֫I7!\,WݨXxxVb݅hD. ش"sETBP 7|?g~ъg'SPY"qP峩ZcdRn,EWFSOtn= QkHz駟~*FlYF , 3 ]IRJˮBHoѣG-<J[} 0 1`IM"Y!LC'sJ9sQXcfA*Gmc0U/JbJq~+ XR'~ꯌD/+ 2# ,ǬRI@ s/+Jڃm'uKgf4u, $ W^b0LEuj1~A1z2u ky*,4IK2Q@OP˺a#W%)^~C_g?/V\q=džȋG vݸq`fL]{ ~ ®]vƍv*P/wkm۶" 6lڴiǎ|g 0Xl6brqۻw#<~`źE  }_@Db#ˁ1 }Wiw05RV}UIqtb 0m ۩YOsRA$ԎXRĩc0bڿ#HBH-Ji Z6vCԅh' i Wd(fsyhr:wرiukGϞғهSucpazbV-TH`K!Tor֜C"Bo#Xre׬X*FbBUذTkA@QO)+6 -~c”rljƲSԶ&Q^vzai` iR@@@\.=z.\}ώ+ 0 ܞ̹YzM6T*ʭjҬ,L*.nb7ZuC':' BvUH&T0lOaC)\.wErZ tttH)V ([o۶m}ʕj3w Vd껂%Kwn1rT?ԭ:=X"!6[ H$(R6RPdeI$R!JH+D&XxHV( xlCdDpk6ԏe0L4 ?ٵ.<|$¶Nt"[Xȇ΃>aZ9rӧz}曾ѣGakv{~'AmO< 7:t|8ւ AA$^ ƅY$Kci9E^n 62fJ:|t'-' Ӿ%SV#PQ"i5? Aa2UΏAeXy)|&V 6`?zA*wy鲜4M61JwebbR+a$:gw)  b c%#TAX73)62e&(H+lT_ 3%B'O@dl  !ӂX2z`HSG8(2lJ墌(R}xUMēٰxןA!ib}W._]yg">Rq@ AA7 #]]"L0>$)PeWkʕwf㈳D J`)ʕ =9c6T})s~VQe9 T|Y_;@ ˲@@ +8=zw-Aqk2 STӽ#f?9!(yb+  c&CFF,gvH+ /O0c&SGYdږ$9𣥄m0PeazX8 q@+A;(/fݜ&W{WDD5/6_9AQE:s,&-1) P󶲃4z-y[,5U *3}į=)3hKIcqLT#Ӟq%iX6eWbLq'L- E!$t=ns흲+:+TdIM. U2̪NvqN̘̾W'~1Π |ǎF@ʥKfffH1 ! nHA{5Bpl8eWbLR{xy<˕Lú^k]+u\˪2_BsYxb\hl\y ՙ|mEʒ| A=WPA,9믿#ܹm l; nQ̽=a4A/XЁ3Pc Q6WdV)Q,'bdWJ0N ?ujކWC8 f0 b! ƝF̵_Ъ 3}k5]I2r O$}:$hc8DFr $$4:~49;al\Y1;DÌ ~UWEξ bl! yZgcH!p~G2s0AZ|]*6Cdr'HH}Y)t0T)F 6 |;Y)//~L2m&j....޶mnr%49=8tnUf|3YF1K?Mik ?WaUĪb@f=ϛ td˔3 zd2gȰٌ?LM/t0,tH07!2x26)@WVa:<-*_|\9y.c.;i6LGL7lIܚ |=S3'&&Ҳcǎy睃+ ~AAat*7TR_RiD8eIf-Ō;,[\tqa_奋ϿpvBE rN0!ヌz9,{1p׮] Yr=޽{֭=yG!=W^C;czz'r A Aߕ9]0Zb\ԻBA:~s=V ?ᆖeb{ h0N.Mbw r BAM.5U] ꣾH꛱LWl,a1VkcIsCX,0cǝ7`_-A@Hw̩{ g?g\,Y@8qBR39 AcSS`\;ɢm"A@Ly"3tߕQcȺK qOܴbY$j$-ʴI{ۓ T=aM|fy)3'vBıEib"}aƴ aY}  ´}$} \pBrziq1|ӎcIх XG};wnjjرcf*H 62TVlYnu|^P7(A^k &RZ5Rv$,l։0m,֣R%`ҰV$ȒԳ4Jm`DEZuz:t*ӽ˦iZ- GOlF|,t 'V6@_n1\}Wn݊+>,|DA~P)X% Q_i/8ɒ4r,+18i"zG]Q[ 0-lDPJ=a?  ^grTd!3<#Mxy\3j;3y{h< Zi9ZK='0h4`O?~e8ⴥ, 3-]^O}WࣻcP# WwҥK333p]dDčp:|y;:( 朲+1(^.[$o< eĽ+/eY^r&T.+Bm[;!"><4 Vܯ䲠`e4Bi"V*+XQjH@bZ `D^ug?H*"*ewޠgq&P*s+ ,+GFFp6Ʊ+ 0 %_hR*//*˕T0]d}|l0TkCBʚ3>5i lJo`nj"j#×D D#rL4)CPb-95B$`.]"lB9Vccc  ZP\| dNtj@P cU `(wr/]U nN90uW80 0sp@TDKEU!-e{!L:\4T눨CPaw_<ќ"h,jS,<_反MؘolF \(0H\pn*DhFR{Qc(]va_TR)*y{#Va;ر菑qQ'q0@Ir%\%qcUuCfCuWȏwyQPgΜyz{{CMq^ea]LO*B2~O bU󩄈f̒k-qi`tZ-h'^|}W$ _9XŒ}[XϒN%d}'2q^EPR/XxBqh Aq 4) j!N3iM֢,e(1cyJbITq'33PlP Twe͚54O 7]bàw tPw($T N-jnn\/?4Ox2%׭^Bw&2xJcݺuVXnmmm6m’%K )խ[vmrOOOuEl2HXTLUP<88f! G aPb+bqq>!aLH :P4͛72}kNuݕ Rݕ~w [X2 \i$<S~;nz̞B(kSwe._$=O࢛p]u} Oi*< $̒BqVGi*Pmmŋ؁Ӏؾ}P̙3O;Blmm}BAR0a>Bttt uF5k|-t1lcc#Vq.\JR.\f!xPZeÆ Tz*Ģ@ g0\waW\ߏ6SJG20YHߩCui2=TJ%<ʑON\I _)v/E*:hUsEQxz!sx.W,utcЖֵG_p{/Z[n9}4ͽ*Swe8{,.i 7oꫯ_|#iZRɓ7|34 'F >8}B`yw[ZZ.'N!}+$f΢+X<`*%د 7ވ ֧0 s֋D"x C ?&{QfB:hIT*U,Lq+K⻾i (iUkW`T/Y6j4ՉRHYP}<!-L;22POD6?":;iL aBBh*J[Ðerbnl@#1!B({=l* zPDS^z饦&]4I؈F{dMAO83W+P) Sq?ﯭc*TaVx9Y)20zmN$ L=Vg] dgL\!4M$Չ.tO!`QO*s_dsx #@OOh~ t&?3أ&"oAXM[l<5\m"?%>(O h@4,EtV( qT?:\ڗ.X޶mM9QMM pM7k? )rP U`JP%`6gZe]]yifn%HraC'EyvI* UtݠdZ00'4")` 0{ 䊩+u%fv/T=6q6t緙L&pMJ)iԫStSzw-䭘)d2q|SIishԎd!r>SÔ&_U+E0X2_p(Lv$ `X&ΔxϞ=#$.$z◢X%sǢZA(Q$*ɱvr9d\wa?}s|t^:E_s2 s;K`ϝ;LQfBP/ޚ!3эܭR ;9H ,l2%FEBێ#o0U+W6VԓIohJ,dC?jwAaPЎ$BHfЁw SQIDL 3P-¼Oa#k9]afCaj߉( =[J5+ 3kXxꩧL'Yt+Tw/hnnVv&뮠;1 0 vfNTqeTQݿjhh8|:Y3ti>U|yüTÏ~Cf"2./cPc 0 0Lf$3VQ_r9zyJ-_o?\`R׾{f6uWaf2T֯Į|I7\LF%b\LԳ1[Ze"'l]?=?&qR_G`\ T*O0 0̜dJ)񤕫e?5?0 BI'WELuHd`} [__Ӈd}yA~<+r=- p\9pPqr NPmV\)Tyz! /aVΫ)`!:;;>{ |TS0/5 H'C=0ӟ̙3d2B |a P,SwbՏdra&9 +eLd0ے }i Ӗ)t~#r\I0Yfʤ7kŒm7x֛fY0X") TLZ6krbԌˌ %mllJNPEp*D"A0]p Xp**E T .au>*ơ!1ht3.eYxܹs+V8unݻwn8Jbaz,|X.ZIW?4 02blXі9b2RQuգj<3Ca,th(NbAK?_S?9/Brh@lٲc;wJ_@q{Vo}ɒ%mmmxz@;N& ,+Wvuu 5!҂Lï;{hau)Ad֭k֬ krǎ6mھ};z뭸ޝӡJ]afS<sb Z`Sz k,1? 0tö-Q狙 6QM|o.֭[WZ;v_ V>Tsεkׂ>nٲ!y߾}l |rʘe:;;WXm6.]ٸqu뮻F@ h7`$V,~|[1iݦR+C*瞛{uWT:XP)64=%鍭I$r2N4c'9Z&3(Uq2PP1EҚ;ˇJqk'͛ ]5?nchRj TI;raajF(c]vUU1' KO+JݬK/-X@ͨ#)RwE oBߑ(;!BF@ &'l]%gp׋(ZQk*tfg1ޞR6e)A0aA`PhhVD2}WT+bVzWP(`/NL(7ɏ9L6y/@゙Yw媫bݕgyBwUuxrW `v^r7rh_f g'JLU1 sQid}]zE*wVjMF7B֘.c=!-Ŀ*T0ثOLL̕cT) W̰۫0PO&(fB@ 2^rJ&{ |l+r_GŢkccdbc~,?Vѧ)MGqyϩUsd(A `>g=/$L+(N@"_ {G\5m?Q2B+}Xhp0j:}6]@pe͜FXUGT0ZU|SPqOF$Ie !KzJj6 =zfT+ƤY|lKE'章"!fD0YQ(:̏Ξ=L.VLVtXq:6!6aЀa '$NZ`eSqhhuW-[F?1~yx+@0;h3b٪ةr (O,7Q' ?E*jg$](ٶ* RA 2F'.hȈ29q zp>pAh(j4k Zq\YCƦtAxP@a/*IB4˰2LuW?]Q&-&uW@ |k~r%t!7$Iee&i:>J̧~,Wk$)eZ=:DyLLs-bA@NtwwBZ5dirvx{^H揄sK9* A2`(m !1Ch3]R1w0B]S32* ',3)UݙRe 8ad˲yv 3;44&5 [;A4rZ2uf]mS0C_ ":OyU]\V_2Ԓ@ hoaYI=o<4QwX^zLJBo #U+L(XW9 _0%)UX,\Hb|GGW~  c>~^xOг:MٲV·j(c&%c) Sg>bĤ |ew]ɓ-RW h!"H /9s2vFZ)x.r Qh.pSsh R3ֵh)``F;.//^ 5(aGfw+ uW\fF+~)۶l<=s`&O(?L6g(m6 u𻙾ǍYD5&OC9O5HMyy/WzD-$ůAtuW+RLHww72]2Ro yRʄv ;4`ッ LʒAZ* pj* *#A s̙0:,`y 3* PsV~(^x <{,R3+Pθ*BĴvR AOC<=K:S6O"DzmMƜ:Ͷ;@ }I|) N =Gi7a[Z"m)Ċ!n0HZ|SKO{oLo^*l*;V._zgv+y_/?{p ^|9]U0YDm ,YCc=wQFP$2a/-B(Lyy"t΁&AK&S4I366fJ40eH&^XҠ%M8(|Xk!^6F)PVaG< hc1K pꫯhΐ+@ L\zg0]E~Ih Y#ɔue:sab GeNe@ @ ;=={~k3!yOΚeg3|X;tBWuܽ[iKC)Q*;7o}v$L9ݽe+s=':K-R;.^_}U]:a ֭[C 6SH,2<<,TcACuϟ?e1%@5 .Ԉ;Q/,`bwO`: c=TgL(65;LtWiXUHw7CkkEuW2 `<uͦ#x :T\j0Xm(:R!cY54Z?j~bz)]}qiXx*_*9Ӌo}> ߥK,YaÆWRƙ3g2N^r2oܸ˾hڵ>8{m(c֭#H2'LLӁ}SSS_~ƍ׮];88(PF5{Tx[n4$9/_Nm5. O:CjXohp8kD 4IfATpۀc~عsUpvN  `0fNW4]|_xu<˖)2vo@T FzQ24/ɲPAِEm%nX{zMK 2y\"I\Y('ȡ@eh)0d2d$T6ʕ+Ach}4;#b\ O>!ExS/U ( Sz 6T@Z[[ @6+. *P-2* 1\+'Xw`0 É+d{K:bz59 *PHiw~lR%"FD%W]&%Q+fȗywo;"ږBp}XAU)8M$u+Q4Y(NB#M[߭e)ԟWYEU[ htГ2Ϊ^(mʇCUVVT`߀MB;w4tW*Վɯ(O7Ṷne3dE&A9)OO2DĐaa㓥Tփͫzl3 ht#".q[o?@c0Q3/fh^ױ_LO iԘC I9H0$SHS´y)P*W weqL,%P`L"+MhWܲ-whH Gpf_xWʣSe`itvː'W#t3!r[2 8:`42HwEӴ+VPkk+)uW0F0 |SQuN*Y5?A$D7^.pyY+*ժzݻBLDž.k<.):88J6kN6ѯn[[cgK,k0FǢElƷYm&N3 % .dTfv٥+~-D(guzW]"D\ztQ(O?|) MƛS8^ u0 ]a0L&"bUe,HH'a03^E$$T8ݕ)[DQLtM=^2~-V)T򅮉_oG?O/E FÂuW FCӴt:]:Y:`0~',ժW!at$A)]Q]ԹV< դ|Ӗ"lƏ袔Z5[r"W7gy_hj,8uhd ht{ NW^}_LM'шwE&c0{bcccH.\800E3ˬӕS1*b/ZƾɂB}QZ T%%G4%R֍&W h|!~o?_~Gy)/RQ=乕t(G!C7M}XM+di:.H#R5Dczz:H"-(:zx0G|tN;::zzzH΅Iu1+} J%;w/3 P@iLؔ0~bbp4/)W˘ htƕ ~OlfBdػ`4,ȦE㭷ޚqݕY[r"\_@y=ꟛeB\MB]iT*)ᕊ޿``dt Ц&ƄYh$i^._0,P,p 򄈷[\GJq@f"NP>z###U@Ep1D' XPl\ Jc=Jz"TuȀɠEfeHw.>tYsG҃Y^ww\`0s.lC:U`T]=Y*p\Q EƔ;^HSL#WA8GGxɜBIh "۷n]n 5o I?S L`߾}:::6o, /E60 ƍw!7o?aÆ'@A駟 /P'@c۶m D2^t //LRׯD"˗/g0qrrR(Ϯ\s(---^weѢESpC޹s.86n']a0  av@3\OF|C:I: 'Kq0*eKo0Tְ͐|"RHؑ_輦f ^Η&֬Av9|p,ٽ{ѣGc칭[c? XL`_z˖-_|: kt9r$ZR0d)b˗/_vmL)0%(.\-6mt >! Km߾GD=8Nwkmlz 40ty@; H` Xw`0 ÉY]{fw&ƾpKD:Au>h c6j{R4R &eub_DyVD=oߘ7E KHCMiP &:wfd``Uq03gΜH $]]]tϗRV*}GZfP B1c`)8C Uzj H$XŋhNi*BgI0 WAcF{}:uX,b :o߾pB^@dUCf?=Ƙ `0sQPuad/[*Tݏ@/Wo xNYX!*E!aٹ;˖ʍ'Rͱp5-_(E#\T,px:WlnNb[C7_y啱;؝9Xx0Ц\vcض +?HV]&TI={c:XDtjZY| _(.]Moܸb LJhiƠX L&JD---z_Xy]Xw`0 É+*R_D"5T j ^zi=#ҧz":w_-Hah+W͛wAJ tW@P$װf0ȂR͏Z$lմ 4։d0d: `3/怮xߑ] _Bq$VʋѩJɭ>mфJxH:߃uFC[)'\1tX0LVdY櫬nFŽg&AȗB#щ1DxȡS7ohnn.@YWI@387V^=22A-9\֯_iLWR$MMI]7hS|szkn~} =$~akߩl[!0 2Ma~X B]s][[Eld.iT{x4p1W+k2,jN>?OƛEH%LdT2Cwl8 y /Aä%O~Jt!`ZpNZn޼tRy裏h#:]k\}?;3`dQXH P5C~i$ԪT͇*#4UC? MJx <cl;;s;?3^uuɺ>sޙ{?Je)Xp6+.L3]a0;p xxG(PJ*%+tsʯXw`رc|dEEa0_IFD]jZB玮H{].v7\PRj)der%grM8Q +mn7Zj"V:c++J(I7 i2<VР4'u]*0aSR GIhàDWDΊRrBgBQab&9}Mԇuή/cC+ |,v,TǙ'aX@ (lI T:F{lط{]Vr(6@;K͇.02O<蘥BEXDz:B兡< pC!@+_W( $ h'9j0%裁{!"%1BT"? vD(-?ʐYvBIr Iy5}5]a0;𐲵j]N/+m rk×NAZp,AdB: i]KLoH݇ )wH<^d+/ژO`xW0AEP% (ݮJJqCY[Kׅ)I|_B*P ~t4( mX1*pLX:A|kpm+ЁZF%ԆA@8uadI'?v%ʣv݉贩-͏QqdŌ16ƐTimEu4V`. %B :1o淿ύYOjuyq.JgxW];;V߾}ѣGw^c}rn^@<:*?G۳Sx˗Kes msf}6,bU ?+t$dQTDƩz͎`sBc)]l9#7:ȅ"\9I+Р"]܀bu(۞w &(@GDxq9F3 }ŀ1W\&v*mDRRY ),njZ 8Aj{QyK\Zg  d?wya}r/  þ7r / 432TƿqGO,6VjhSdEayaxMº+ `0.Ll<]!"&z bf(NRE苾~gU|w?~φ}T̤)ǡlL <%tFsbm5J(4%[^^&O L<%#l>pz*U1,^\ !\ ZCIɃ9$T)AWXw`0 ƅs bL橜Ynuƺz﹘i2P<%!Z"S|v>Ÿ4:RDI)N*-WI0螲t*8TW]kZk "Ʋw^|z +q@DZ{===}5אuxM7 GuB1%m;Ќ-*vc݂C-3A+N`8ǎ>rȃ>+b-5r `0 +#fbDR̐U>'_) \c̘E+m~.#;~?ZkE4A¶kt$ *JGJ)h4Р\*Rgףgg/4cpJˋ XӘktW+̐)f鮼}81LBml`0 >8+LmuѮ4`FҚqbx^'qR?۟ս_XDIdݟNX|Q)^ewqG\~衇^W_ꫯҋnmaa8@Ua&۷~,?={[h?37x/H~SO=8}T\@=.//iP,[[2uW `\X2%t\ɵ >i0"Q\W(nטLxS/_ߖb+D٨>۟ᥢ0'oÏغ\n믿_.p4U Bz&^{-@94+> ~D8G7ΣBgg$`[J{ 9G;dʽ˺+ `0.@lwЅQ#c2FqۍƲy _ygbDZeh4ZK4\sI-=nӯ񏥲]ˏvEz,/\50p2^Іih+ϺM?<(O?}-mͻČY"j<9 eT錏 0 0tźG[2jmW^9Ƥ3Ʋ[S"$hm\KL =mc)|)707$㘉4~ݕR^袋0)Z|u뮻ysss$"*5 ,1,HQRN#O$0=a; 8}[ `Bic.`\rɮ>=1lK;F`׬`0 Ć{W̪EYE< rpl}I,lr̠* *jRO, olL/7ި8;v [Iw{4 t>r&M7ݴgd171 `68/ εVs5hU,cz)+ҔxZ&&2# X˶"װ_s(\E(OO sq|dUW]ܹCжmۖ^^{5.w~{n] D0dp]#7gl%)!`0@wBJ[xI.^{z" J:r~zv'0іwHmHlZأ١ld}t- +@{(BUhT,< K/$\HҨ?M1EJGcpRg8ٜت,9y>w]v̀r8p`qqԚꆱ `0 'R(OўA.LN[y.A]CGIYc>U0CWm\8Jܖ-q{ĩG{?M[IYb5o$NHLOO{4tqbY/ J|28cE=JQMq\_?t'XM^F_~>K4ڭNd<}{RiT 8I{٪q|WyV8yΔ̇o5J|a#~7Kxy11>ʠŭŖn35]TZj~7x3Sy/KeϗYZعm/yK^nJ 8/tUf c2S$4=@h(iFO9f, $! )5”%y?-0"}+ub Ay{߸M6pxV E$eK!%Dd=Sd^ku1 9oImIL@jzXOęCfܨ3<1l[+n}J. E!~4MEicmQ,؁=&2I*Zk\>Xce} G獳Ok*W?f9זT%%?Jpﵗls&<=3KklZ%K۶rR%lvI![Kqfbofrgξsx>}03 3F뒔)UN5ꄔKA#oa;D1vnnm75Np~vŋ"N zP|N=8UC<8̓ewx 'XKOi5wY)~! b1u]~z, cy?T(V&n3FoiZ26Rܘ X3@R$j9qRRc“,V$MH]j38T>nNcݣl\  Py0\3Dr8ig,nZ;AE_hKvmcT 37R<7!<%1P"*@8sN;.a? }z[~۷ogYד.%Ҝ&J] sB&G-YEMY+o<wg[{惁l'9A}]|^{s^5Е$IZpx~N B|0xek\Ù7&vvB+n (Нu8 :H3nq/M@% t}ըނ:] (Mu>Ӏ1I,mcmZڲes֕/x7@GFsV_J'6!r!"tRc(2VO0A5sw퟼_߿SO=Uӽkg+/ }<9QTs{phFJ =/. [@';sчܒv#<Lja;O}sLe)ƥsAqѭn'j;g#b#W @oNHlpҥ|wł#<0K8.8):b1N))+'F86Z . s\|# CPr D¥~JX(?ç7]<' i#] v^ڣKyORr-4$o&~ iqaor\isQ1;@[Dv(AiN׊aMW-YꪬХKOW_^ÐV8IkLIC]zg7OpOXV6V873@(7ksg_վ mhCP`k0ܒ`@ı_ Q߼}!cJqwsN L5jJ䶱VZ>~de $gΟ$hYy1ŐX(Jg Nb'LS](bc6 LnNc!IL쩰=t+*EQ2c >L$>qO۟ATP^9sX"-^~{ה=fjVג1:? ];S%mzweTybUrofIߤޕ S>,Ds.2NQf|o k-缪$I'd:mY>_0]:xvkgg>۬4 D: B_-2?#WRDu`deW)<=Ӣ&7MJ6F८Wp_j/_?ǝycІ n)]  D#m VJlhET'94JF H:LE9!2Ko% ` >]㚈4?,a:昘FHD1fĩ( $sUn*!%ѨtGѼ”7QQ̺aQ GuӮ?M9)i*8.;Z9_Q*[$qO?#Іl5\,D(aU5+1aVS"{"KuLjHD"b.DL Ul@@@F@4$^/M2D6cq%LhJ?}6M!ʼntLds=spjPQۮEulcccZLڦ*-mi֪Itj[Q|XBzhY %w[ x0%s2l"ua'I!$;ٕ?#$Wa@.DW.u5-a><pN`~$MSLxaOQ]y8Cm3IL=?v,`Ű>N(t5Iң€'rEZ~+/;yM֛ڕ:U׃~3m'i?qaʨrR&$K3{`KH,HD[h$;p[GHC 8ж "ً˦L}Hp@Wܯ[ CQxDmI>W;|fd=tX h /=u?=U0VyVŮ̒,; 3ޝp`y>|e( D* >\ze9,;w1 `iޚ[2k ';du׻u'Mu?!=E<]!ѳ] \X*(`1 h-Y% |JDQDDNUte+@WjI]([ouE`UU &0Px … pJ.٥.ykV7揿Oʦ𰰘\X *p^{R=%EꋀUEhQ5h&V&s!pNevZDȝF9l[W6U5s> ು1qidFK+{t&fU^¹"B+kʒY]o53KbJW.LNKVcfBf-j#)V}{y/^Ώ~TE۾d&=fMޞx9:O|OÈ㳄sn/f$e޹IUw|kLwh30(($xKdxTN7X>$ZUVC4^81 ) s鞾LΌ(giVޗ^kZ)C"6O~l*w`ct&>CSV/s\4t {׿ecߎҮM\8N~i>Xk"*^C tM)p*#KYϾHg jDzj{ׯA)jjTlRЕ*U;`Q瑔"%%}>*L%yf_|3:tW1OuT;'{\ _jL4N?, v8yKNskK-0q فh.ڞ:38' ]3gGTzO]Y!?wo_,KY(D /\/C7ikBX`Y>O6MQiBͦX$ ꕠxv~6\T~S'D ;S:i6syΖ@ YRri+_K"g߱WKMg"׌;yIl"yI+'_Rȩs4yI'[2dFZnZA8`Ft:(+noܻ-O2q!híVޣPFIWST>j(iGtvHuh+a蹖Mj0^L 6ӣķI*|l꼮C '1biL*KL\ V#~fORjM ߾ j޻QΜ93b} I,,JF"Ն QǙXhvfEtLFaRRRR zRJ;:QhbJ(U(⹍GL"!UfY5@l$i˲llaS2`5RDt./{[ NP6m&_IIIIIIII]2"P j rƟѹ^,S01Xr9H?0@14k"8{xJ̡| VÈM  `._OZ;4av "n<{DѭY*S' ڥFW&]\X ebYm !l3MS:vA`H<}J򨵵aX9A2,Sj1{4,"9N1v&PT*kRRRRRRRR$LBPy+^gG1YRj+p?Ē[JN)uwf28Ea`Tה1\H\jL@"*< (9N~~Yi LHY(@)۶mrdᆪRRRRRRRRR.+SkG׃ fY,dr)Vgc#rՖ- _5D+JƃƝuXr)ܻw/ߕJB3cRRRRRRRRRK)uOJ=ЏN GUȿxxc>1\c)0Wx~;BhA?$,yf޽8yW.NJJJJJJJҔtlX<3EgU.3CeYBϱ-m˫dd%0BZ\M&k L,݁+Ʋ٬<Tdi_IPY-3f8}4`; maV^}UW,b!`h u-̟? MVXq|L/[ #tR0F<_dɜ9sfϞ}6Lr T*+---hwb⤤.Mٕɕ,He23KY\m Bi "f_Xd"W&2-| ͛7Z䓞dɄl,MUiEPՊPRTuωRX"?o/~A[w`S3Vz܅1uz.裏tMoo^,VME9||lZdҙ#ՖHL-n>~{\+ :B+T@k׮}w 'ׯ5kl8y̻"%%%%%%%I$](*>wS퐩Llk62D)1!TN8sN?<0-[6d7mgwN&Lz+N2)%_{,n.V3-#܅=I|q|V-FcopLLzU l3|*7trdɒ%Lx€Up]4""<4G&("BUVz2̻"%%%%%%%cJdK¡t6+#[H1=ٷ) Ӝhڼy={Qߵk==πU<&4 3fKkJ:-<#xRS3CL6ll,FL5p|˦,hwҚm=y$ZTDBo6Eܿ8Cw]vecǾnq0CryڵqHc`r۷ A`Z>>L Đo"(A\WAezD +ʻ%HIIIIIIIM$LTPzJ{1Q1!ydҨ}X&2,lŨ4W` c;FXXmaUWS$2sA3f\tN-Jׂßzޥ˰Kt%xJ3Kɂ0*;llld<~Y # XIG Zl6C:ε==~ij/>pE(^t)~4}"?}?x ނ>L#@S.T}ӦM0a裎][layYf^X$ @'{B 7{Ql.[l;w& q?\dIWWիGf 0qoxb` v9r 㬞42{lW\бc2BànXb8 (  I.\^-P8pok:XpEt '~^ΛofOϜ#;  7CB( B"Q$P,%oyACd DD6aX؉3̹o+VUu95)<9U{#_~$3HWOxK_rKfk>9_?'?\zywy~1.yeKٟgdvvvXGGG..K~eey#ykC-py1rN~Ɵ+?/oO}*cy|3OB.4?P#/|ER|V^o0?܏ĨP'J`L";wttjKhHYz14lmvlpW oRB%:[?I_Wo R6WV^J. A"9-#e(f+֭[O<񄼯SO=%H_ry/| rZWIL/%>.c>ɎIxgw-,U$HQnlJ!ddyMyGCG<(e}(; {K$";S>=9>~>d3s^~i2!/N0wa.`9 i{-|V)yVKH]b<){"o꓉r|W/o'meZ3K0 )?>CK*؏]i3?:rՇ6weϘO*~Vb?d*߱yzUr% cy~"j/&ot C+kB\is.t奋,=rKox~ےr3^,ƏWHnR; __: ' y ʓҹ7'~‰H~ʼ񱼂WJP^?5737]?!TrO_~cFrG>fٝurB`>#?7~ʷn4"//3-+gT]XJ|'(%>o}ZyFZo[yu.~-kgoX}~O|w[Y7yGr9~x$|"SسבIC=>.I]CL+M_Gߞ+r~%p|IA:WPwN`~1e?]IįL"+ }+M'(7//g< PFWPwN`sWP' ԉ,GWPwN`94+u uW ԉ,GWPwN`94+u"Qwq`]uW娻8FWPwN`94+u"Qwq`]qX+#+ @,G1+u"Qwq`]qX+#+ @+r]hqXuWD`94`]qX+#+ @+r]hqXuWD\ @+ P'Qwq+ @+r]hqXuWD\ @+ P' uWG\V@:QwX+ctXuWD\ @+ P' uWG\V@:W娻8 ԉ+r]h+ P' uWG\V@:W娻8 ԉ,GWPwN] @]V@:W娻8 ԉ,GWPwN`94+u uW ԉ,GWPwN`94+u"Qwq`]uW娻8FWPwN`94+u"Qwq`]qX+#+ @,G1+u"Qwq`]qX+#+ @+r]hqXuWD`94`]qX+#+ @+r]hqXuWD\ @+ P'Qwq+ @+r]hqXuWD\ @+ P' uWG\V@:QwX+ctXuWD\ @+ P' uWG\V@:W娻8 ԉ+r]h+ P' uWG\V@:W娻8 ԉ,GWPwN] @]V@:W娻8 ԉ,GWPwN`94+u uW ԉ,GWPwN`94+u"Qwq`]uW娻8FWPwN`94+u"Qwq`]qX+#+ @,G1+u"Qwq`]qX+#+ @+r]hqXuWD`94`]qX+#+ @+r]hqXuWD\ @+ P'Qwq+ @+r]hqXuWD\ @+ P' uWG\V@:QwX+ctXuW++@d'_L_o+{mzB>3HߺRf픹`4ިYXG?ky̯ jPV\Yzzf#So6/{pP?ѣ f~Dt'kKj~/WиT{ˆ?W-T@G7X_w񀇺^ 66-ͬ{nmx~z\+j3֚Y}[kCлG뮴W]}V(Xkj%]z4#;lfq(p/XbZkR/` eIKѫ~>wE<1]9;;]X`~ d:"#@/ϡ}m~zw>0k~xs 9T/mC{6F]ioIJiЇ~'Ѻ+duPaςJC[$x8`v3ZCv a:]&zyۗz/ie_wgPw`M^sW0p$I===?:=-=޽{fh<) `b5Q*S|MwoOFm|y9}wǏ5|e@fߎ:wGᦸY:߮-_td2l Ne%6L00R_?W4L&~-cQwN+,c/tZ^op~g^Ae8/=J'v/Rǧ'Ǎ I YW0a`ZڻnAI]J!gwIj`-I'IHk# -٠'l) >Rd͙Kvx=+a*e/|;^Lc;}\RV)Tumª3/N}%ԝ}ʖi"Te)QRD{2؇@Eaȓ>uW+ݝLFGGGw5Jz`ogWۓAN2*%zαۻ;QdJkcŇ􁝘oJWkh%ظ+l|K/y8(dumO:?8 .M&xR>_U Sk_Fi}v>NZ RC/yk,&ݝRUT^Cu6$|ӟ~[*t{j'U$|+\B^7k4 @^qƍqKGSrKOػqEUNF(*w+}5Kiw}joaz[u5%uH e_"utuA_ii*TVTKơ*:גJ#/Rʼnұ}/9h\^YMʃ6XeOٜ^'HN(NDeK!T䂑Fě` AW|+/d,]_MmUWNNNi>M&cGiKo|css|'>񉃃<)Eia;Eye;/Xinou\ε}Sa乼2QCG?O{|T5 F.\Pqe \Z:CvE/XD*MNs o&f}q'_}-d?<CUrvN+y}G>۷o?K$ %ÌF#ܹCڼJe~t.M>ҍ[ ox[n޼SOI9::$qQiNh'pp'By_Ö`__ڙO* FBكP=f+*HD[(Oq7?z+J=HΈ#MUd<,q( EzUQ^ײFl߮!q<Pb$$gra]>&\6@*~F_K~޽{]럛zֻ zjZ]4NoqkO[-GGn-;98;hTqvܕ8sޘTVI)ɋ"+dIe(kiqYrTȪbRevpt#RXg*H0v$m2ђ[Hv2+qAlR"ǓSyjWña{WUTFNsiL)24֒PkXlm>3&(yI V+Mn%oؔ #MGZN]U/!w[?xIlE0-------k {ZN"Bci?FPN ʔJG>h_܏c*|c_?7M<";Z3+NmZ^>`؞qtxzcVr|t>>8[5)`2v'N~} B3;9$H9=@6s 3ӑNwScgnwtUۿ_8 - G/@+k- ]jtJҊ\v`v9p_t`_>^T*EmTrlNv*Gב߽~;:@InI4 ??do8Ҫd{}ʹnQVҬUnt]㶔lj. #pE/m~*+NGYbv9+% Micrd2m*#Dc}U+Ϝ臮l>dD0,uhJ)ϋȎ3wkkrTuz]4/wk͝ʸshJcbFaQXN:Sʇ6}F$%*m$Ff\{|ں JîU. IFeH4e, "7Wb:V^0_*"@u}o1aXM^;><ʮfrwo~?3?$ӊɆQ6u\<]vMv좺Jqz:Q'MeҥsOM,BnlD~먔."v ]l+dEg8zzQxl}Ŵus=n7:wܑƎV?Ӗ`s{ILsWaFWs;Bp^-s7;xF43ƧRJǕJg_Q5{>i߸o|_ڍ7~#g?%$v%+I*eKh < fɔ.֬Ё̍~J;8,U.9T/ϜRj<%FeTldWFO% Au,Ok !3 KfrwhIM(c uR5tH/UK^iK%ׁ/,/(^o{_}׿lSڛ)[NIZdck#__E[gֵdA4J?צUnJ#tҲw-Eiq=M1֮yqq"$½U99fﵿQ=jPLy\SEPImAimܖ!6hꖡƯ毟n@&**b]8JE-%گ*l"[], U퍛#O'֡2ݻ.{*{1WQGȘ56VEm˺ӵUV$Z7y^AXFA.ʸٚn0,lH9kK"ĕ/ WQ`q&_rQ\[ AiqDG' P9|ͳlitEICO6APIқq Υv ?EX/U9>O+]P~.~}O$jUP:vδw5vRluZ*⑜Iގ^e K7W;Frإܹvn'ؑ%w3jZC3aǕhE;Yt{ޙ5)0Rg6g,ݹַ.G|lV0ՊFڡif8U8ɺҼh["FrHcɢwzݻlNoQ*VUPo?Ix88KvGDKKKKKKK` rƒ-Y{25*# XzY4lf)C;B8"qv>kw{'c1e[6˶/F/'q5ȢKLg7YcT>YB_ g:Տݼyޝf߻ӑ#dċQ8)إ "m`w#${ ^zs{S'O|ꓑ\_\\REa()<>x<ĸ;y6hIl'v7FSs?.8[a%m79z{nwGݻ7oejRș]ta6WF7n?vokNgqӟrۆ mB_',nT Jf* 4QXmI1VqŌKeG }:?ە: v2ZԟA\ٛ:HFRsI+HN_ϿY$_0 #([Xdjog+:/> #eʴnq'ee.qo/V6*0 .}u\ H% O~XV.Rsw`IP ATlYNJ7ovZgr@7O'ON.8_?/"i-tn{jʗ)UF>ڸQ*ӶZ.J[BQallfγAWm0ko'rTޮT%}<&I6o eFgINp5Ήf ʗ_=a0[ a:#(ӕ.*<}/̢4E׵~…1nTb4egpqWl`v&gI^(BFvd%ط %}m~0$yrNIXڍn3WT`m*K⎶$rq+#پ =eƙGt݋L ,v;[=,rه.1{tvԃRr{7<êV?jIڵkw}vw{''nzzv`[_εʘpe*p}q;2%q%vǜݷ {FƎo+iXUie/'CG_m-JΓRd=k:v2ol(,ThRdE mğ{[g2/gZZZZZZZ[f#?=*Qa&c"Ҹmho FIer퐫 <|EJߌ2D*Ev*T(/* 5G{\OXa>*ʼڔn^Էwj˜ٙp>w~ok;m,zg+W WW8M:{-i;wJF%⊛-⊺8Фm*;m僊vӔ2foth]qeFsˉ\鱍MMv<t \|Kq{2Ow<_Oۭ5ϴpylaֱۙyJ֙ "4nZ< aU;wAJutOd` P\>CLF:w먻NnϝF^?=_>hӮtWwG{KuTf;s *{+,52Xmo*ڸ3si/><o~Dž}\֪R+iRXq$Xvn_ul JnYXr\O_ѨLJr\;,$ 7~{{ts}\Xuzꋷ̛HI>wߵgDm_VSj MT_N/+mB~JqE_d?V[z:jv fw9IVl״:F榤;KkQwO:867[x0vc]`u4*ʝSec4^zgssU$h4t:yE$In0Hx)RИdOmɾʘt*.Gw#urOMRu֒z^UEag)Sfk:}i\~Ƹ⿥}}_-ۘn9ugf8={vUS.\Q5L9xٯ U3v6^@f nCCBX0hkIf S c$c`;zÖxw5=‹#øz DJeyDx;wkS2cyAڄ:t9t8h&6%2^XMh.dqvv3np Np{F& D3 džΜ'@Noc7u{sϪkk,z뭷z뭷gH[6E$qؤCM Iƀvb!!!rxǬp*t*Q85k֔>H[qrp[M[[!` *051 ۈ醀:1UBOWD BmO&Z6όz뭷z뭷zFQ|tQN0UtE[0 DCbSh-2CFy. _A70ڢ2@qA7[P-D $ +9mGw"mYAaYB1iT$ E!h1as ^xazWc?C}э|=xK{0؂qN/8gGM'tB'#;N"8#kϢC;^_öwUodb6TClaD 5Ҽq[#Xq]E 0 1\ pwfeɃ>?(uj'^c Ɂ4#*xZS8`Q4vBnpT59/e/T8;s}8<7S*!p#0 H:ι.N\͙c8. aBAi8t>$8 oI<[~O~tkqrl(ΘF2t18u5a#5/ UxiJYF$׆58"_i7r?Z謋[`$oλttL[QѹIIlBFMK6b o:}:}ٗ}ٗ}ٗ}ٗ}y{IjiVS@W)\MKi["2M|ɼab)5>w0<:TdֲnHW p҄~ QiXYɉzEEvItKZ]=6? ?*,T3[b VVQޖp2.nOL2،Ds`aj6 'ߵOͳeǎؾ˾˾˾˾Dc#)oVYrQ K8cBtgq3^6-R&Bй@+$j ;; PBd,;ߧh r qmlF-Vjz&-\r]VgA|oVDޚ -S':oo|5ۯP<桋E3 l(D(Fbr${KAz@!msi8m5a\UoO3g}0ޝ9U5О;?hK n#8?L9 Ǥ"BeӶc`5.n|X9(x ωJL\^ȱPty^dž;vv m3rfKC@^Yv~AInU熟Mo"X*[o[ovQyf+AQ-VB˒#l:PHs uHVY[p38\,ofBx{Y 9516I 6Ӻ=T d|A#[ij$۟vVG%E9e"Zэ7+1< sQ9ړ3V-< }zcg8-NlmkmBp yC,2G+"7`cPFj"}FMGd\Y$#Fw~z)$6'fDEџ"b$JN9s#C廌|GQh w:Ԩb5NCdu5Y'nfb}ѭezPϚ;Y'd7oC/To[o[ooEj r^>7>qqs bx0ϸؿ޾ޭ'? RZ00smlљl xꯟO&w/<:'<ϽwcS|*C> >?z;/0HX/`tfGDp6w7/Mluu MSHŹ+1K8M.fU)Պ~{3eĚeNs#z%>G("ħ|)lM%Dw֫ /?3~{MWycT% 9(۵"ι S# Gn3ZV~O:u!+làr|N(oa$EmDt~YڊB?BN1~ČjPTGi?>DOtooxSѿz뭷z] y* bgW7g;C?tw?_sTjQ ANZGhiж{a3f?_sf|YCBFk;]]w1;ε+??ه'?Wgx?|¿I]9RʣV(QVsEWo^<>Ч~7_}Ջ`0@bɇѠ!&~|c WnIȶ~J\?Mw(%8e{)77zTqq= ƃ,mB! +0Ln6 ö,Fժ0)( MjpSDQ0lv A/$RKt_nmvnZh,W;XpT-ɀ &@ 6Ԃ:B$Xٔ{}wfp=4@ceQQ:)7?ϣhArIu !$)gc0L%I\j]G5\!\k腯= vHeO{ﭷz뭷zA&uk| {a4a\Gr0Э"I]y}uo!.@[L, Ƞ`bq es\ID#W6)#TrFI}{kޛgz:Ov]3_m4fvgT}ӿ>ܓ>0*b) ZP:s$ъI31.%PUU1t@y~9rȑ#GXa Mu0 F@6s" `njBCɣ-czBaa4VXRscQP a]~ nX'tjYs(n7i5ԛA_P=ob%@`j+/kYyeg~PTP>x{`a陼*=YG0@cAS2REbP;_fs|WVWvܴs>weu5bLaI^ Iu`;TS.r&y"_k  ۩Tʵje>(&6tEB)DQ0׸%'tf*c(ů4VTcw陪5݉=!$:"Qd11g9YP?W-Qٰ} >jT!4d 8ЃOT0k$B)!#n؅ ]yqAT/HӨ []qQX\fbX2rQJdC4B7qH`F:B̊%CL, q4('ȑ#G9r۟XV!g! #!8ҹe%(a]8 V.Wh -\PQ{uM~3l0ed abN5kŘ9ESϛIȡ2pN|㝽Vsoқ{~Ut响3QfR4&-d%I܀,bv#SBuwn;zگ_~XH(~%w|wGtgqq qUf6äA㏎ EV< PK&"X8]|F23=pC>6G]\IqtZ)ֈO$ZJYQ*\xwe}Lx5cQGQ31?J}JCZsA+:8yBc0˼jtQ(V=SvB v=u3c}?-B:&QvձR˲S L Q0SXվIpt\ח6+F+HQ*R"@~ȑ#G9r/] *H!7](#40%m[}Xl{<1!$A_RhYif@ D\3>v[$gO[>*cά2JPgÍ[o~?L3beiuC.9rȑ#GiDC2,S4]Yp]Pt 0PA-7]$CYHVR!I7 ==3#kҋV6bME.F(k tWkb`y&d MsĐqǠn[/nS3֢wuw?x2g]SP\ƅ41pOa(f2C*=0݆:lW]uv]5,N:eL#>:8!(@Gw~*aHcϭKg~mS*qAK$U4p\.A/8fӂ߳ֈ~W,ΒH2Yo2qq"ScRPJ@^D臃.MAGl33r}`ifYS#\WkM>v64Fuq,_1m]F ܹFק ^aѲ rVc|kW}}M(R<3;W z.$JY z{emΒ0rQ*-~ئl3@](R_i~c)8фA̸Fl-a0 ׼5yk^GgA1 ~)(Tº !L} DQIGj3I MSg0C~z+ԡd Fr;A 6)ģ( \'P>47xK{NgnRw"|CZ+ƶ3#WYj 15 Lh!l5+EnC۪?5ظo̾{ͧ?>]6Ń3򤩗{1tϸ+n9:q!bKd4 I\%?p12@G2vqUy2m X/4MkiEXݕ+긾Fx{^_۾Y,D.KOu>s†mw? UP6a*}4_ϗ{ K\{1NF-gY;]zwÑGzِͅnm\K?,A&X11n8pFFJiϔv4wa(YA%Ih6ZFLADBl%w`$U=!(? 6l;p yk^׼5We+(cB.CU$$I7d5#@%LcD"UW4mņjQr6[(&AU`hy^ O@ oPV*= ""qPy)BAfaM7oy+v-_:(@gnws&P'Xa\HKA\V"{ 匕{֝|ٟ?Cp|g6IT3RGBi. _}_)Ǟ~-<7 `.x)eP$GUw̫4Woxa㒺­>xo/Y-'GZQǁ?}]Hrx1jeژ;2lQSoF=|AՆw;R+*cVӫ ڰ-!΍<}˰ OЧ~ 7s]AߞضXx'+5 >|tsN] >9tD,<5fUμ}9ڻLFnYPWc[s)39VqSSJ7?TX" f'UW-_޾/:T!:Յ`]M\RjnKZҬQ` lgE[,mvuځ9^@9ꪫꪫ3Ø-X 1I)u@'Ph QAq1*))`L;=%qT=ʐDۆe%:GpT6 5ƃu5,e,RֶtP)e)g 4%k ee Z6ןJ%5]Lqr e>[f4 *GD\h?Vikx4]9~kCQS&|#]ߴ"RGJ}zv<L[IhD_QayN'{KX,UCl$πA<|Y Db U%>,e~)!?ݣvÕqt\ER3)UK+'߿~ ϧrE/%+-M6܋R):ӀD_UkYJ/ÄHEP8\L"}( 0 )->p$ԄcwEFt3Mo#1Z{E[VEFlļ1riPʎ q/.&"NDaDh䪫ꪫg)$q1@ ^N `"$zάG:&4XyyǴő$ 2Oʘ6aY\ ˜^b䆲Iqأ*H1F+"O yX  q087lLHYU3#;mPtIH2^U5N~2Y DV&w_pV)%V@@1c(C*e+U5~)==99XLC$wGe_>J@?~}bS[ri9LWW{΍sj  T̋WeE4;vv" E' q.g22lC!2+%pI F^[Rs@0Urj5qpz)XUW]uUW]u_T4qy#?т[Vl^w#zĜm}ᩙ3XH5i+]RlN+>9SE"'d%9!tx~^h%zɲzJj93N}νT(yrK!P=kU|H+/{QU~1Rң)Eư=&H+,c@]!SB:2F@iSj_+lpf8h7tZӽ>ᫀKp"FOo$ȝcq¥H(;m7cY:[Jrc/2zÝъɓ6>]oi-4ƾ +&q aݏh /&d ~|F%RFHxt=k>}:ള`(oxUJ4-'.(1}56'%?7:t҇."'Y7{;_Y!|֏ɠ`EG46{wReu|jͻǓ0Ch xC^ރO??4â+opFF*&jvoh+ܸ*a E'V{Q&  kk!L!8Se*Nc):`:Y3 Kegmn.ɁL?4PO*AYh¼EsOOZ|əY]:>n x@$}eM=eBxlBJ}wVt^C{m).5BAgȚYNb<,6eSN)) O2\s5\s5~fX ll" `r*H681%誚PСqFR(сa|%:T\ Q6ְeS Y,UPC.G•10Dȗ;o`^i&0w`e fKGHnxZ.쁾$HA, &BĄy2tN@[Kh93Jy@)A-iQ?VJUi _SK7v凢] @bQww}OMk ĜtN+n%yM8~-NiTxA}kY)\1L?^h#znXY쫣P.BZŝvъ!aP9;='q^M8l?&ԟ\pH>C feBQ%ݵrJ䲵eI<[ZwkcB.K8:3vxCw]'4S5y&`wi;$G_}s>dF"]Bω~cf/*}&ۙd7$Sqt^8\^-F,u;swwvQX&`#H@HHxC$@ x"O("DAw^mfgvn=}9׺uz6=ݮSNU0[XX&tYR9ɾmkk!WPil@lϞgK.{/XV ߹'!8mtu| 5m+_:kZaKlurrlgYda&;[tipsr(õWgqc_-.M#g J^`H@;#Q} #!uh^█K/"/vb[띇L@&K'vYT٫G/ѝrګAxaW8J\_LNE/ i9Js(*R0Q8lWaLd,K:r)Rt.=Xlf7 ,\8勋N{[^_+On>YzgUteqkpR`ffpnwgpzqGlVQ--dC, [7q_8.&0lTŋ[H60ZG :nS%?^s7o|-QwM[)e9?&02|nݷT_{x69JtXiV ƩɳWR;Nc,H߸>۽vwåD"8hG^9#D2W0/cX֑1\Q\߼qmggeK !>"WwVESJ+{Hw񳟝0e)WT3LMHZmd<֢*I18q ?5Q:=դpxA7ZLs@a*4ɍvrz+~7K!=lpa}f/^^!ƳEXX%$P7AAoƖia58#*1#D=yP<[2( ,3kk#0 @óg[c< GOlH#vQE'cnJ.r^VWR. X2) $$),4<*ԂIdpKχf%PDFPz<KG Jo,ߛ`"![O;Akk}mQADNP{Gb A|F "(%ʆ-uc9vFU# (Ea92V 96(#?ShB -Ŵ@cdCikkk&I?/EpM(u;(\0:>ؐ"$KJ+tE`P7 ;*QUc^9[cڡЛݾ WM$! {H Aõ7ംl-ȭzAvy,!AyŖVw]YJPo0ve 9L.](K=./-eyu2ۈd'3[np5`83q+b^)B̀ Kzi^PX Yp><𷥍GikP&R?im|ԿZieM`yTظsa q+ C4.#wHLcےf]P x[B6bsKx 78{aujxk8st)>V4mJw[-qt7t$zCBX"#V@Ax^o%;שqBN(߿hwF5] Oy+3++k_zWo,'H2@E`=8`b<x1v8భ` @f`PR[uwY<ݥUX@3us9Y"jB]~ٹSf9)L =6UiehQ^@T|>BBpG2lTOwPScҽ罍q-,مb>J%xUĹr:\9N.n*BKvgeB_eb. ' .rBH^Z1[̀nCn y.b]+˖O"f1}⮁%7}n0[ԭ!W'."e.p}b;W8u``C@.l. X̳[V*aUzedzrP(DKRA!c[ZZ&X?44Tr(堡k<pPtv,=񛧃-܅Scrz[3fVT`fU\#{ĸC\Tq nGnj\/0M]2 PHVش";*/eD+S[R][x; أWjKsDMkjlrOQY H2![,!j@lݣ|6<8j?P7|~ }Hdj[JfÍgi ZYh"chwww{{;Z8}X/ףhT"5iALL {Sf$V$ \W3M$]Jf}Qӧc62|jS0QJ)nM>kWz lrUϧos"56"|ppL&#x„6mGՖ6:3G,i EDx Ţ 7F~ťM&g(B߽뼇 BraE}>͎%י?]M.' }>o{(OIY'84w2vLTƩ89ޖbwkERi3LQTVe;c{edR+4ˌ@( |\X\]=p!KtJ2"v $ҡNP: P[7X%n4>Uf ;s̚zQ8!G1)=`,Zb,rHtOVIJEZc VЎ!8P,'Dpb}p.S 4V YQN^ꏥޫ hBg0j졪9F>^U~ 8Uni{/p/E꽍.*WB_PKZsze[֦@/7w0 FɃR F'| d`---|rtt_͛-kwtBaoȁ c":3zAhxՔ-tYž@={ǐN1d>qdH: 4gf N5s ej '?J"\X5b``@9Iy\c p)`ЎB=':BỈf؋&ÙyCcq+hP e8-̂4d⽎]tn5BИ'?@%@Lť| Sō1c85j iDiPs$TPPPPPPP8F1 >g-SQ~/z"#nd`ێݘLVŋ-7W?osP^Zd {\K(o~݄[xHA $`=af|>>lxΝ;/fYnxse%&l28/g&;w\bM|gB4o٘)BR rI<,F+o>Y?to>pU3wߕ#]]]b.Z1c/QpD سdZPOBYG8JrA%i9>7}{Hp6f>N;Bi8 dmޏ (ƼrBmƣAyb0\ۅ;:ט]lDgv>;Ǵ9sCG|rx\prիQ^?>>EneѡzF >/MPR_XxGMoߤV>koo~Rd~3g;G5¥N8]vA aj"ǰ{n(8,o9s&dnJ8 Z&(\[lAl3{I8g}/d8\s5'ׯʪ6dpe8"q 2N9j%pew؁[6l؀!+WĖw"֒b.,\y x)f.aLČxIeQaGeI^~06I'cô# Z#o%Ѽ y9EyG!y52|+zA~@,N?*dF,Ec#YlJ1 ,5&~+oA(D, (uL]yö'ʨxp~{r=^ b]K^ZV[;P=?{޼y^mRuz)%L φBWtwwO+fϞ}a ?L7Eъ )eV^yz0HmFq3Kŋ0KD'xZ 5kR*%( Of?zt~ꩧ̻d/Ak I|b˗RԠƍϟO#L%RAO?1՗e$gu(&t >?qŊصuֹs曰j ?۶m !oM! @"CZ.]pK. {{oY73=CĭNt)RMe V3߄yy{N9/04^].ՍJ\ Z~/ܮ1֥ik9N755Ù$gR(Db zhkaJ߭RҡWX!|ᦴKN9=sebz ֒ )[kbL_ k^~ez~3ַu}I)I84Qa/'cy\]>LnAV XLlٲ5k@:,f߼y3WZ_|9/a2g?â3<oDClᮤiIn9CUϠկ~pM6^(l`dØ1xL>l4ǁ!@pѐB6? _ꫯVg}m߾I=\€#enMb@viR`xM!0c?ߤʐ1I ?ooř+Z }b- oG-HRŮp"˥|ىxtx@Rҥ 3gBjjIhr.b(8<|ACOB@! 4o/)|6MfGO?tK/ x3t IKyRP.[i% 4HOfa. }5{ᔲg)ь]Rn aF F+gʕX!/S!(c|IA % 21+ <+;nqlٲ#ǸE;C6ɟfwr}}DnR_ 1C=D\(z TL$^nXbd 2y(y#DQcSr-?;40[]xgΙup0#̓iI޹S/A~ :XV뮻P}:=%FN'+2b,&7nܘzKI:k,@ [K)y8,o0d],Ix^~/g}!<T@g9Ve…/s3#W?S@r&{qK}}F$Ȗn#>:*{+1{iAV+@ZUPPPPPPP#i>&w#cYMctϴ~C%i& 0KW_}5RPR6P["p/wSH>.R"O&v˚ٳ?)s8d0jժs=i''@8ϼw믿X&`"1eDw ﬷@V1Jŋ-ih>}:VbE,~Bb^Yn|]w^1YNN&H ê%< DVD&$?pzZTbIAҥKyr 6nBl!! ~ x֗]v}wNQ ETo/N(R@yv \/3=GO9AFU=mmO➓;}=p,R#!;[hȢ[:x}]q7pT|7 p5$%rHv <_T^|+rŊ6mҗ$;!\?|R5C!(P..-i$_7tW ŗ,R,D%I@Bs9Rg!PПz?>+WYF3,y8Ї@- UޟH}O.n-@љ@?$eУC 3$% ʈڰa7M}뭷-[FP޳gϒ%KV^-۸_xIz5 OJ4.iqr6K/-r;3cx"ЁpHSmܸz_mFt#JA'Z0\1?w.±)~\}][G͏lފh"OF,hmL˥\Q3|Hxh`6 2R2U̙X,&G&Y5\ -Cy|>cwUt…|j^  (oɮ9/ewy笳Β|:YnFIzRCܒYnUS/ܗ aњ k4\I}a.b4PvGTOx[RKa|3P%.p` I]|/4zsSP=ywwh@Yw ŔQ$o`ueWqGGwZ0~I'ڵKxf`Emb;ph9͐{y! L/x6tˡrⲄ['rrsn)tJM[o &0 On\ 3K%9W򣐰xb f/d"b~ P .U胥h%مBϩm((((((((|16C kYZlp'9M۫S>=ZfΘdȈ$OßPݻwK H!(p>Xa"-d !gNO1>h%Bk<"JiHbKK=*@Eni^ GIᎢ*Gr=$XvpKuyT,5E+Iݑӑaf_+se]MW}$9gD]kv!u3_,7PPPPPPPPPPP1^aޙϲ^M!_絈*̈Tr) d7Ģ+(((((((((|0=o8^ޏPQ7˙r7no+fmIψㅜ-[xX0b+(((((((((|0?[4_}cj0? /mݳ[ɎEQp%Iv]65)ꯠi ?##vȪ[߶ӂ=[, jhf$; 5}r2tE> b{$. tݴ"c6-Т/4&J#ΏKv>§SPlWt܊O) hmR޲h"W.uj ,lKd`Oo2Q_AAAAAAAAAӀ)'ٲ{l淥ʼw.U$BZhر'2f=}>h:k&;>if5BA25bHl`YZoo3֮]АNV+ls`}p*H$ĨzGk)|>qT{S'y˲D" GӳeL#АFv AN% z]Ψ"`a/_;Wzʙ_XՑX ,&kKOzq 0$IX.|2eLSv9wu<?22,@aJ=tAFe ՏP`ڴi8+Bqёʁy[[[iGKϽ{⥪bH+aJRFrvّy0= L$Rb.u$pt47Z*|fr-`wQpgijjpb qH+CЄV&\sƍ^sٺu++^i$B8"9f>c(|u=sH;Zz677/[ :Nó{<,C#<ёN%;&Po/_0Q§ fipZ Vv޹M^M 6mUǒ\>w^tAccc$Ybu[?* mռCE,KੲpEUT+JۑrJ,7WԏH^=!S׮][mnݺp8\tesq#1D)L]z5>sЎ7o5k,/|? fSA8n֫zv{;Z[f^-mͻ=h MAk^QQHrСc#sV [liiiaH0$f 8*`"lb Z^HRf&i0r|xTEP|)+MW(#//Droo4KAAAAAAAA S絠6H@{X@(04===GE!Q 0a" Ν;a@v3QG@ntdrur:'шqq'\@|BĭA :aɛAA+((((((((|ajVryaT$ a76gK17z-b;pM(,pMVq|dӧ(ƷZUc`ɚzL\NHR4zL}Df8l[R ^iU\mg&W޾#h+}D"JH=H (i:GO  . N$ܥ\M7,ik׮mhk+d ْhb`h0٘0n+Nat,chz8NڡPmVضpH$0p$fZ|1̐]}/VT I%*iAˎcelD/rL4 MDH(kzE7cI]Bd4{]@圁fګ=%7F:hxGHL&F$M&PSsrB!8䠘}ώFB2|p)922W!XҢy+]B+n1'HJY "'RPPPPPPPPg`$ [ X*\!6M٥o_պ QY9Eܬ9#XPlmk;س}z[wwii<1y宮>htX(ޞֶg?jժ͛7h4pڳgwAvb~cc#!G+D7nD=1c[tHr{Ͳ$eэq_OW $&ȘꪻcjfihH [A&t>꤉}-:֓w\/>/W3aTHU*Zww`tLO hP[ZZD+X5dH6(aޜ , ;3ktT 0ؿeH2O5$ tWkhhGz+^wtt8p`Ϟ=܂R3H5HFT BH$^hџg0⮝.X <FF%9L&DPK穧Fh?!2s[o§M"1pXa~~˓ih[vkwʶY/OMԛ-D7|?_pT|&}X\0ui|B+Źs=ohz`[[NNHc2S3_xX,6ͥ]L-)D{A{{{~˗sNS\OCLN- \6L4}D^ snMUȺ0Qy:3%K*;!@5y_:YAAAAAAAAKHWp~`X!WTtGW2ۭ^8|0{\hu*O:aA$-}N8~oPꬲCض`T'h!|&Yk`- !lH8z AJ\h%1M?x]ӧO4Vl6 B̬6p E#.\J#ٲd2E y|Dkxzzz`e|%XWt |2?s]~kYc?49Mw=#;XAAAAAAAA(ɘ^qYU.;D]L_4Z e7׿!l>8:XjgT9TJRr5P(Th.-9LzLJ]0/>|رc)ek`k]6GOAq$0yH<'e|'BR<ۆ4-ډv,U=Pϼ?=-vEOQs@BGr<@f߻qiyy|b4Ngx]"P{kş!w뭷&SZ0_ O9JADBKTFՄW#oΝ4/2 -Dvm]w8dCǃ0.j*"_X(>CCCfg>dd"NOOHb6_Bc }Y۶_yzh X.$*2?1!+1Aڳ+t#ƨW##<"rb 3}"uJloWJD4%.kѮ?AAĥ?I#3E]&v=58̳l$2Zfl6j3)vhΟ^5bl8Z/ONkHqeeZY<9,kfq"EzoC[]=}t;ֿtN1o4j?9p{+XҴh"nVwo^"֙N;O<T2Tx|>JE٨h% 5/+*x?8uPR %7R TUYtUX[ݍ 1gyFI>:::0*1^(^obTH$G+&  v%Lvmc۳--ӱ;oܹnu 5Z]tŕW(kFk9OZMi]t,+WvOa;ry޽+++ghf&6>>; =;?5gfƵɏN?L"E5mT*2jY,ʆa`bɓXFf0o&W_B/.. < }Hrl-aHR$M^tC-ЂL&G"/!y&(Z&k9FU=s 7{ gp0>1EX^  o t|.A&Vz 9@wn1UBeεZ- Uc5\03호/^\ 37{C.Ch\ԵEBd/ؕ4. "T*0a( cZų58 7 cMm^6BAA,Ѕ%.}~a׃BZ|4M1l]׫[ouwA)z}ĉC?t. OxZ "2szv',Lh)hS2=u\.Cb%M{|Qv]N&sFGnsmo  b$#eI+nڠWX2ɢGj,L?k?>3VH?+6WCN/7?_ W(nqi›|FzBuC%ᅫξ=Pq*05=܃BR)Q'k |A8Ƣ~Lf֭hg_t'cW j-AAAx<ե2nŲY6$n1 ]-,[SfRm%>9AA8LE,vpdo0i6KQ$plC:?q!B!/ .kvW֟uUv]7MVP)v뮃[w~:CB!'lF#}C!BL!Bn@ןB!?!B!;]B!BvB!t !B B!'B!d'O!BN@ןB!?!B!;]B!BvB!t !B B!'B!d'O!BN@ןB!?!B!;]B!BvB!t !B B!'B!d'O!BN@ןB!?!B!;]B!BvB!N!|Jr#>~9B! T?ImC8z֓O]BmBMm. iF(yKAIIIIy gVBozÒ82y 'YY> \406WT3T$ud?3*cPژfrOyPy\r/ȓ#ӄ!J 5˗yaᥬBҠOy0_>uX^<(t+.?70}!Ў\ϵeŷ;:_ B̥~̱BԭV~2'~0ֽXjyrfLs_"t !of_j6nvet ,SO!|R毞(siYp,BP Yy҂qvvAn&P*zrާ찴/:w.p?/7'GcSňr۪\_K?ڤtTK yy|&EBv4+ ẾHJQٙ-q6=Y!|6@>#J)Rׂ)))))_:?\rIjѢFjk%\OHjݰgI^eyV+p5|kq֭64EןBA/߼ud2z=\$u'ˑj|N "Wa6k%I$Vfr4ꏅ~^y.>kyʩ|Y&|.`?.8uv 2^^lFu~~K2.t}0<>~@=oE|BǨCm6PF;NN$iFu"Poyڮ&RE)@d;X_/cj{xtа/f)#@;na`:?:quk6WC3kNkʥQ3GFfBT7V\uݱk?L{4M$M1OZ F>zm1 c\GqOZLˤm7m{""PV]EyR^[mxM ykW>~'2dƩVF]5:]Y_,VO9/b.iWQn&FgYx;_ɿU4VUQfݽ=1_j__mS_Ҽ~;9P.S'V뺩yQȉTYʬvHW/[`0կ~jc~Qaڦ4n} (:O:]|>o4$Ir~@ډRI[t)hTg5ͥUk9g~Uqv|rFnK_zg0iv+ehHEyj2z`ih6 \i0n޼ C^>]*Oڰzh~F{ɃV| ra|/ ggA+Ykz_frGҎHǮ@jFQ5*ӮTh(MF''vG4Ϛ.pGy(Y'1a2#fM`hwa')bh5ti׋ MAcZ5Uac0Gq Q PfM{hr*%J)h, V{i#B{zJl;>;턭z" ҟ !\<{t^g,VKjZR3gAnFΊVÛGkhiQ4QPݽ^QX/?hNvPd;pR>jB@Qt. >fl2UW79t{l%C(;碤sZ1; _И{i؆-J[gyOҟŨiw8QZGEMJh>WN:[ŕvwDi"ӽ]r\/GcF %Qlyw?@Π֫`G m؃%+:R:??\v;>9=u4Pqlf_֢( wR9(4z~;9ka\=Lo_ᜎEo؛᤭eElo0NQ=]EI(,uI4M1l> ?[|՛p[GIv ($Kcg㣣vOgnyt2E-S賙$ k.p8n;\vI!tZf9qxf[ˆIfkÿa> aeŸZ۸V|Y5\7ںy^BcjBu,x6xR@Ȳ0q7q,$FXEh Q40lՕzI].dַ,n9oAq6ʨ! RʽÇY4}OFH}4puH~|ӖBͺkbou(gtヒ o ='4_ݻw[(NѥCPRRR^1|VQZ7޼y$?tj NOo~z fg7j4Yv:Poܸ}~ n00\0ny*af `ol`VwA?bFT00֭NNa C\g81Ma l)H@V{fϫ]F6p:ZzA+"棣#l H'"AHՈYV<ˠ+\gծ<҉,L~A0q"N ;ShH ӯL'rOeE$\~ȑe: powރha)wޭ[j6jذ0 žG!yH~b@ ~ LեQu"oq :99zqn\v(8Mh Iq.H'Njo?Mt~%@uvr6Cp+6Ҁ0@Qv8ua&bP2qN&z TWov"%H_ANq( b~3ҏm z>8`~"X]HtBɸW2h@EWd$Xp:QHjݱ)VU5A l'H6*vݵNsF3DyF$P)fu _$ϭ_2<Y}CPw%0v{o޼7on5!{ YHM@!aAY˱^ rA,ZbW;_?v0DZ믿 cV4 j=I6{qjժzT_0$r`0nΆ(2VVAT{K1eAEzO& cw֛Lٙʚu~סQSr(mP5D4 5/{ܱ\:Rlďl{^ !ٸnŚT6FcN7+2=\SVxVY&HUkxazϲ JJkVOM#U&G;".37}7`7 9MRMA{ZYđ>IUMfL-qkRmM2/0^-i{A`-NZ7vqqlr4sA0x DS5Y/.Kܙ)#[).V7b^?:S)%3vbF T8puf KʙA1W ftMꛜ7xà {Ilg+=>>144>g>33EǿP#a&"(~AB3!!'J#ꐇ dSLOP)4Qm@ c ZlS5WQ7ttpzQ )`p0ͩIԛF(N&a_!Q9HUf(hx 0 DI٬CȆt <.@q&I_Dix]*q@T)dԘs{|4F 6*H5?~  X@#zeb<: Qc h -sUC3x~L#Nm7/BA] `E<% (qD aI  { &( (D6s<)b(@4C@H#$pQ>'I"0=#L Qb@uJs\.y-ڈ ȹX'Rja/_|0q+׻vްSփ>|}A'x߸VozC, c~z+?xkp+jO;',*ĠǔIQ[r7Ћ1yC Ji4YQ`Or)$[*2< +-a|Cjn"[=K&LjtC¶ڂ˯ݯAjlZ; ]L&+(x/kUC $wgUS9\֗coHWm+r8%YK=~t jľ!,- E {B$ʽ}qg&ȉ]/:d"cfۡ|9բi[]4&=Y&Aw&3 i8JFӥltbi?z׮]BC)lqʲ˵*{S\uP\4!=4fr;YOڂJ:9_T La%hwᶤs)ݻq+^p!ѣG(^|_mۆy7Dطop19U!c6ywg&p?5\d'F[yB0AXCБB m vO|z\32` !/,sLnA&KIh'64R8S 04-+ h5T Q&ʑ¬I غTfWs3+w6w9c\hp|9ºE|INДG4. .LNbY$9 #2kA!e9"XCm?<&)c/sDr.DϜs(̧hf"9+xMG0bG@,'ik3 LZaUمmA[V1Xs& M4ݰL֬׫dkiXb%C;dxQ. ȬR2a<}D x -d2sՎ_W?0p&BB%mE?xr"7xoڀ Q~x W$_پFzՐEYbt 7PـAL^Z7&UM`gڵΞM|V8 ذa˪j4ǧ\֘/60b887 `D!X؎ Z.ͪbbhh9Xn0jsy{M7wrrR`(U8p(H׬:e*}TROhPor-K9gR,*6@vM;asZ_[9m~Kn |W?JX[nNkPtS>/l$ FBs]' }eG$*2C'}- MD\w8SU SPub,`h!o)~tLm}`:Ŗk5nL5O>/ R#-uȔ쌥kf=t[[/ͨB n^|+4,b;4U(v\ }P_>i3}Cri+„{eB [J^=PKJi(b_\=¯c*j50ҶfVT) s LF@8%``jfF5믿~hh9yvm4`0&$$b{~H>0Z Hb>IQY:`MT#5PW}%E-*u7 /ՖegL/I<=Pwy'ʧmKkq&G} ovs4o\}v*9z3gVZed2;\r``A###䃿kpo{rƍ~<7oN(v͚5)>>88HF Z /sn7:N#+aD<Ӵ2CR49О1>T>7:~Z xq\11[6%c-,&QRf_ 8r5έzKX˚cKSo)'tU4 [ {@KhVU4rv]ܹq .2rUB? Kfl݁EHƠ恕^}*=edQ:R)wueGTu}USs]o|-wu+%+|[rV -_w]w}];;v}BYN;N%w 6کSn=J݈[4<gdfTX߳H0o-c@7lC&: ˖{ˇӐo)DC+$0hzL+֌OMNKFE$2ѱI0UpN&Gm:w8rUQIS")5z7uyȔO'''1;8y5C M{%_tE_n狤cX:~dĘƨy.Ǝ%"+cJq88?[J8e43-! (S5t|>= %Ѓ fgxVZYW\@>6j*3@Zvz֫mk?i:%ԗr` fftM/ ln[M?qɦK}~?ߛ$N2!#FڜXXfRJQՙ"~Yъ 8[P)'a%&x\5[5`[]UE;;<4LLMMaS}Yk=0=F+9z4 7oذ-m{+nق{y1[E}fce|?tYu+5 V1ٳg7lM V.A>s@F۷?|Ԣr KRYCjwT(KY }uͯ 8~6λf ?O?"[xڱ`,RN/K fCӥ7m<3-4]>Xz5(qCׯGuho"|fơHcCQWwwT*|_780<<X,7ZlyEf|li.^?#e|r 3L:$t%vg]%w!Ryi0HrOO-Ȱݴ|Cy*-. W$xQSI0m&efIk !G*cd#Jo~@ d#@Vb?cΝ;Q{yniMGx1\ߡJ޳gϽǺa#߽Tu\ANy[v܎ޡw''# @$2cߙ=w>{I!!@Bsw_u c}z׮Zkժ^t#_(ZY0Ƅ*Zrf_l$*6G": = ,h2nt7*](;]!p8@T2jE`mlBOH/UjWX\\( 7$#BEٱkτnvޜYykU%[GXBiE,gSyMZmpxώ4MUWC|a~Aˋ 1p_Mv[[[>ݳ}SN=WJtd8-\<%֧dq0^u57H^V00 ,9X-Hk%KQ-_0 "Xz 9iÄ{9R.(AaD*"ɾ;XiRc܊-UŢx+QK.T p _u>>Z"#LTUƣ +FfۛN/]oFM8^J"^Ul2nX{~.!Gdd@(wG3fP-0K:{0DxlӦMvG[{'o@G1Rb3=X^z?{N|4'O=)wu_{5`G!XBu@-ͣX*ˀ*N݊~λ H~M7ڵʕ+1C23.B饗f͚ H>SN3zF/e/tO?޹SȰyf(sBUȅv0E1B xg j~Rzǥ=DFeN}|O_*gxdj[f͜9sȿ~zXun&;ʧp`1 '|P2~yTE}xJnNą͜9O>]FׁT:E---ҋGa=_5|;{ lժUr:Od/TE18垟ZM&+Vؽ{mo6/X̲dR`/^(D_*gXv-ub1¾yF:$6{l/]r%6~_lҡEх|Mܓ{}ϛ{|2ėe,TLMqGv#H<vۭb< gCёnIaپFt{g(bTes!3بSZ+W]MÕZkk{ooW4wITBksS_6MA,UԑD+36vjJ2I%sn]E˧WkWT,*=,^ALBc4xz;:y۷&kNkQ)Ek y0 9F)z[vGMs럿 ._p 47LSsv {z<ӉL5Gɤt`:V*{~/nGqd\&Z3XʗU fuJhnjwrO _+ٸ!% X*[ k8P_I9=|#<ų$:d@ tSf*W2eb ϝ=ɻ|\Iq*6ix.N;#PBdY_!@DZ.)"ءr$+'xbO #_JzɎ$*(t)|I3V<__RW):Y%sqڝd8TI~)DI8>Fu$"+2y(/|P(+yDlsF)( !L꛸S0S\j"xKNNB~dX&2_QQBN$'?q!H / $(!l^3 w'5z)<UEY>V)''\}:)j& U3OT bsSk>?g; ݡ‘T6W0>9[}C[ĕ?sMz!` '^M3}8okdp33HC:˧CaRH /kA%܏Xʀ.CL}A-N MӍ@g/Tɝ2" ϒLA<Ytx`Z0?x6LUI'|~KJ!2˻ . Prg ~! -[S) ɹqFqKB-H3D@.B*"lpcF%W /m >,L1E A't8ҜjU#▚(reȀքxi-\f%'\{g*+b&CNtH<ɶrK $j$DfnDFe+ "= gA|s˩\n@G2|c/ь2T05?ĐA-0aI#82l( UL4IQիA|GNпbnD!y%Ktwwϟ?|Aϳgu  ws믿 <(@I)#')(30!dx%sC0B*؇;ꕅ7rTR]]Wxңetd*p2"Ԗ+JUH?L!e+#Ň\[+.]ɧ-2K=R5|4C*λ[OlU.3o'2o_T+ 3A2@'3W&_'?,_+ukn{3g[BV`dX-Zbc*y%C*CXȀ.!bɢ-Iw+Qx UIR)1&N-߹)KFw20#A}RUlVity,V{&vQmיfs )~O`wns&fu@r_]n84G:]'LO?CInbPbĂ]|9]xμ .|W\`ђK.]v )rAV( SP8˙Aɾ6?G5rڠs9Irϙ|wG>f?nliů]k'xo]Yˉt~ilI$>f,{ '`5_7GF`]`TٽPX`yƎcQCs{0mU&%U m7,X UUKSs{* pj͠I΁(B1Ba "uM>4sS T_h@Oә8!qX$ ȃ$(_I)r"?%/v:@ls 66"yZv݇#G4XrO⑱cR ʉP'0(͵|SD;Kz(OP|ǰpa!ODGԅ._du<ӦB^.SbniOɶ+"@.W  ,DtcBԅ\A/\ qx"=:?:E\s reQ6Qs /^z-xE@}SUxXҰj] rp*'ZtCMY k|놥^蚫3nnE3zuz½^+(1rFVxExAǯ ֛mow(˭f*ɋUf3j\6c_v;fw3 3ᛧ^umqa8,tF.R?8i\c"=jmjjajnky=AË&vC jU@,BPæ"m]FzΗ%@W5W:USWHGwSX7<#0ː"^]5"8Gnyrs#FmP/2Lu?[n& ꦖ{wakX.^UV (P:FޠP$DѾ`QAji{w|:Rj6'[¹3|{u+Cjd:ty::Zh8Y0qpAwC^3*UCsy\z!`>aJlb!`]ngǤö2h*I hHTwoAB;w7bߕZ=j<>\|8(Kx Fݽ&V Uk2=iFxh$L03GGM@co~"fryF 4%[8X;ƌ-WkdXv$qOICBwd I@7C8n&6D-KCSSNV!۶k.Ӎ$^&m߹<+5狅QKg3Ej6"Vǝ&3#L)8Av[6/R0kMDR`Mk`x$ί\>;C{=Zi7|\>|@-H,rJ JEEW @:h$|<=2+l^u1by8;po|#no}csTE^2|!Rխe8[s$3#T1"=iT !ҫv#1&bo2g2UDgX.O8ĠX_T7sH0\Vcj_(UZGC3t{#(54654 جkhڲu۾@< Pkמ}|E-mz,[An={ɐ5JD6767aK mݡYl"ysHٵg7*˜sK/o=@((|T! 3r_ FUO00%I](Wn47Vp؇gN(zcOYp|ɺ/z eAW^-5[w_a5 ]9l=1u?캥_T.i;q`@'AWF"ZE> .[Ver>?ira޾ʡ[-FXa\̫sϴtάLF*㎝H49SL޲l6t04h өC c>FFĀpK֦FJ!N)]npQ(jv3hٱ}E:1#AȐ2UVZr߶mƍw̱GdX⣏>ʫ;F &sV5l:ۡDSl-L%ƏpS.:FH& Pf͚uSB1r:7n _Μ9si"`VF<,m-Q+ MYĬvԑG2?rŋ.X%J+tVDY-~?cڱs8XAkFGFx&|!HW^%D/YtwJ_^LTbǓu===fMbNLV(0 ǁ~BƕcJ- y"[s@=/;xd hk"&Nkq(Œ1OXʗ---I5]x {vIѮ{aN:mI Wfh2}/ؾ@4 H_r?ћ>)|hh>xޜsIyWq7x}Gй~z sԩ;o<ȦZֶfEՔ1O+s='. rKw)rrsN'B.hY{vIHyL+r҂ yc=F/(07t&̓ 6雁Ȩ&>3L/2P7oܺWp6gFJ:w9r!>,dS 7ì\G`TG)ʔ)O<7)$߿>dF&Mw^} QIy!"V4P[0ck2XEՐaN1 ! FAܭVPikyB8p/_Hq#P ,0ff+47vZbr`0dPrD"j(D( NHu X}# 4h0WUkb[w4ͽ#K_g"fծryTM28taXmFCW2ql|U=u_X+V|'vvƳݧ4̹)˷=C"_SqAEaTuQ/?+ FM۷jÐ(LlYî)5=M۷g]W\=VOYEZ*T}/LkSdi[>󻼁iо>ۂ0EpU)L2!S͎IA]YU{% )`p[ݿ0 jUw;j9!-rkV9+nJKCܵ7+Ãr+d>_ q{<2BZ9x0ȧ%OA&A"Q:6g,3dA*^&K)0+ JOGxKHP 7@ǗhbC׾kpmҗ@ Ƚ,=\ p(0- n߾QX)&L R#/y1 #5 ߁HȎӠ LxWh /U3QZ(_,^K޴i\V 鰏tr+:q=Qz.ajzNXzj*M$ {T F Xhҵ % -+2tvv73#40 jo$nxER{@6z)3M Tȴ6?wvRx٧}zfSΜzRgdg+T)'6O>g>vE\*saW> /ش}{vsYx Ǽ?9L %jTKVĽR+m̺+W5$ z ضzaZ.[Ҏ?>~us!#1 uQuCix{q[9O!-Mu$Ru(Q6Ȍ $vT)!_Qd֨KHi#=o+/ECE(t+/o9d/⒋Bm2>LϢZBI-:d_^PGtֹI{={PQ).H A=9{ 럡^5slTbzh u1GAعf@?l>*\~4͛^\n-WX;txt~)Ȝ?C]zQ_ϾcکJQWDQ?Ѵ3Oۻg5s;Z<wT&C i_IJN'A=PE_@5'D R[ ԋ⡽HEz=7|RF-0-5}c\Ϝ>i`wߔ>3Hئ5M_%a\ uvʳCAE `2ؾ};&)Yq 6]b~; +d^j$Ӏ<¯Pxb@@ly 0׭[` %.NOҹ\W$lDqg{N3 2;*q0y W]u4S<dpYkAP |9ȥX O_@`G]̈D4J{V2z>Nƿy^)?)r6ͱe͹/nhU/]ZےXO|)SSE;S *ˉT;E Ϟ}.ʫ`(p(N2$1& ܯQ;ah,kLG}>/&& bhԅtZ[ыŰlyWb搧! 8?s*H'ilWCTi%b얋~/7uJ*6t,R:Dٿ[oU%ΜA{04k.GcxOEQf#CuAx8զB>7ۻJfQvz9]f6>%hjTT$"9$b@nY3!"f)Էk.Y[2)$s:mZݿW^f\5j/{ľyELhiBy^ƈPe`\ T}t>SG7Rz꩚EE}رci5? dBLz}'ʃ?c(O"B˥|$\V,Ҧ9;~ kdhmleR͍_^ m&jPGB_Q':='1p7 tvwwb'ʇ4PonJ-VN'0l4z?ӿפQK: M~_ J>rmʄ._"Y { ǛXaPMX &LrIbNͶ{C\/3jU[b‘ x?ܴunŷAM5ka;3^nPFcsK)ßz+K8CMlp=`lPԋnenhwoͣ^paJ5W̹}|)9~H4?ǪiLҊI}ICK -5ceB.|rҳ`K1PA׆S$gDI>{6mZ`ݻQ Ce iŌ_=,,]T)%c܆!cu֓LIB۰a>li<@k&H'L@/P,XFO?]:hׯG#@H@#W/zIȆ끞"ρ1@\3r$rʡ *+KQ`X1:.ḟz@g=2'\Nf(6>˽ȓ@ 3l3f6rAM2o&|~֬Y<4H:L'cG\bƵ2*B@-d+CF퐮r)I, Ӌ1Ez"](+⋺p^'pj)5CLx8E{9UeZb04߿s<񋩋@1=M-dV/:U_QUQ}DdI}UkhNf"+S\9قbmݶ1jnW* FbXչsK_ċU_~WXt(G>Evin>[Ek/9xR:|.27e4DȜK+bsSy/$iT=Tsee9=#>oFc>(BV`i΀J~]Wl;wc1;$=u;+k;XiXh&_Ȇ]e"oQOTZZT[ٮY3i;9 J -ĀQFF\iI%<-=}Hثps[[hڒK.ڹ \x޼ B}jMx0F)O<2/ L(b%>Kb#6 Z"LBsy1E͢4]U]=rb\ʊ{P[L>봛X(N V tmQJ1K슂4UM/knmEE3"\ȏ70P+rn(1vtǵ/u8,A7W(`q*%ǻTs⊡W^ iNƮ7&/)v?tLvfsCX5*5yFY*W٪ѯ-F*86Ů5FhsXQʁ5 yoXڰ%ȐG|W/:ժawy4 'ڴ^S.0P /7o|O'6F֔*İj!b?8匳/C[l汗">o<|PD(pLႌRx7ЪK/%f E] {G6EsnX/U.#͐FY2&đŲ^MfB,2L|gSO`b&~*u'O9 q5_|>aB\dz]j"\ϝwLABF򲥸\Fbb&G[kF]p?Z۹yujQqjā Ctq5Y3@/ϿCoh-"(gLId4UBG͉7.BmU~ ɲ.U.MrCCCO<_>( EA(I(\$:L h=ÌnJK %qHls@ ,ybO}[B0yݞc(nYjPSCt!ivMzM.`{۷.CZ\b9aA1\MqIYӪhdqQpbPsMX4?.6%.vdPņ:êvՈUJ2]^_VTmm5eRlڌx2nU@X NG(`]G*'@9`SvW fRzTy+E8`kdh/[HJRPfBSySB_`X]"R +jqz%lsՐȡ_aʫP}8P}TbQ,6^a!k$KA+\T:mY" }8*]~P@:Zf |Z8fubksV 4ΈLe15[JMW)#Sa‰B\vdKÛb 4+'X]uhej]!l@UN`U E_9w\eDVU /O,Q1 95>۱{ɓOJ{m|5KHu/>gv!W饧ֽ0wCo\8aZڱ/W:g}aӬtŧ~~9ә?ѽ?jIaƷrłԩV9Ӛ-dH*_t]dhxAY劉vb)VZ(6GEVX] 5EI'xB">,W%¥呸6nEL,ok2[jJAq8F&Vיt7x,fz:lH}CsXj^pYLKg4ktSr*b ټn:m&v]x,kp#ӽ_zM+T2ŒfP$X)0!L5;yA:X5yb!Ï'vWȤSrU[>Kc-ka}uUW\k@AC9d>- (ci>.l##mK?r'SGONw6ٰLe0p߅R3<ӗ|p>&~9^;w.XˆmԌ?)=^=0fJ_d2TtqH492䣏=!=wFrݮ9:ꨣJe clڴ30ILPbsN:c ds`H,Ա6zh^'O\I/Z^Wy䑗^Gχ$X8:e xxfw8#2@ƨc71bB.^E/˗y 8PvP8Pm]ݽ7dĢfG; >SNe}u'` (VPR!aɴ 4) łYJ{!n߱k„ tNK3}jNt<\C}$Ƴh,%m ۋ;M7nSO=?0$Bc7gM=?䓦&WAg!/\|IR9O6&Mkp̳QYڑ_E򴴶P>R@~t ,\Rs̔)S~ӟ,>CRϸR|koo/Eg׭/:._vݻ?S/'W~qKx&nljٰqwb4+UmmmM.]=}oA[}.)qjCCK d)wnln9BοKŢE,v6Xǽ>hS "t_ZXѼ.YnkESRF:n/ 9Lj`kUK땚C,DSFjyb11({`+xTkX-T1,"hEuhR]&a{:=P  QN:!O՜N˴sC!g5xeÙM)N9;iEV8\'52}\=O:~\u2YVfi}Z^lv'bTc n^@oS8/\dLRLr~r3O?-<ZY9*XHgCl%&i/;VN<.(fK'^3y-^`UsJbKg ёAhs͛_=X.mtk`i_QLf/ӊQ$,VgU޳2u'R_lحjAr2|t-yA˖-cnjOȖ-[yg}vcc#?"Nn :x믟g~;;udб?)<W_}5غMnp;G<=ne̙2X (<}9͛ ڒJA<ɓ?N;mذK/]hxo:1ԵcyṘ~x'S2 yZ'%444ܹjA nzרh͚5fYd<~$@e57Ι3$ /"^"Lu@rK.+P<hhj8{? U%$2T]{gFd@=n ( ~i~~=3DDִkמz]w u^\p[1 tw2,)K.W_E7r*Xx1P5??tI8&TuԉV;- B JC7ߤiQFQ7HsK7P2˗/gb{p@j+To'h d(gxxxĉ HQ<|gN>yƌ ;MFcIHvތOn™n[Uѵ?:5 /q1theqsU|-b/ZZ v~&QXJ"[>>|?S C^@ԾPg^&S/ıV{Ŗϕlv-|[kv0 %b21bs_cÀZU)_UujTS.ޞ}JU`֝$bݱ|}]%=*^ 6fPqJ%RLת*D7˪ͭ+6WkkU^\7ܴg>&#]7O{.WeCA^.uG~Q-eKo%֒ @ddJ3x(mk䧷Dy}W5 gHP'reҝFͦp::ahB Ҵ! h$7bc@s"?Y@g>TKB4XtxWͫ0@hF}(ys;l19.^QmPS뮩 Obd4uC4(Vb+9;8??#B҆tl+z Q.5#󓕏6 n 0D!. rǙ`Q OFğдGBn:r-q(awW_}&mʙcpGe[@lvG% 6D2ovz@"QșItó̐ ÚB'N}Z膌2N8dE/R7B? Dc31$̸fXZٳodA7Oӿw_-w5-_"+Mr9/UJ%m~6 -AUule2P#dF ʈBM-믣wbu)gI?O;xA[oEbxjH@Mh_x54JW_rPSB+RK<=Id59h"G 9y$c#kM^i~Hf #fV*wN\՟Xͱ;/i[)@wva<["#(:"x"%A6*.N 1V,qx{Q,,fL[@r yo:t"^ Q'A # {@=1Y\n1ik~*)j1Pո:(,O x%suM/d0 pC$ /opa x7...]4Yy7nV2ނ ҨM8pL>Fq[VCa`az~a@}v; E}(;ӲE**a{}osb7N`|e!L)h]SR H3-u$ V,/]ܻo]v8웖n\ S}viX,+Sh^|yVQ(`nN [M:<~85<QM7t1 [BB| +Cyt tMf,IiQi<4;!|<6HH'+I#T쮻 !!NO']b;"~@Ln%t`S5j anpZ 'PжM@!@CWFc͠Є"]ڸKz067pї5?݅RӪ BWȄV^mZ_ 0IZznod eP$H@]V9Ӆ&x#f 2P7TԗT;.Hg܌)W"Kk]w bz! C~w 7Wת''hC9*x & VdBHXjմ ʙy7^3a[8ke^eR]CndXXKLIҊe1.K{V;e9 }ڒڸgf2&Եvo&Ź:KK۾gfq $ז;֤usYcDb&Y9 (ʹi( ; }d٪˼puuYOy2'N, Yn!蟀BH  XS}zE.8k 2t;۱LCNE$mE9:o !pML ,#)KW"'(SYlKoHl0RmIXw͕?L6%PYbTPb2py +4?IOŨ+"QuapzJy?QGx)i0KP+)>[Yyⅆ/~S]FRx}ӌP{u,^04Hyb+.^iI3aSmv;0֛!tBccz.f+ASd sSN໹#TEi3-޵4 .v)!  kBZݠ'>*-IK@h̹<y]YM35,{DWg׈khH㈟7,|G AiҙʸzQ4&&?ض/mrLhaaťVO!LCg'z7S6{^""Dmnv]\9ZD7;a<1wӜ\^ޕHR8ά{zf֘k^m.fòHg^`lYY10252Kx0WOuee}Y56~@T++:8}_|(h&VrR:0XP1%E nn5[=@G%"E^TY)QAi㬀2'TbERF-*rqTJ\%gxjS>iI'ꉒ4$(\q!%LcilY6,G R"Tӈ*3\L@m rє0#< a: $V 7fI+9Rb9)񶓤4 AEmYV2ZO]}w4 m/ {4u C,Ac9#U.h4u-j%ROtQTn6K;|>d2k8}OpUP>i\ H;;NLJ '9|@B w䖣N1,}ilSF}%03ltE3vu^IV1d[X 4"4x۞S,EJeDwN@X3CQYfcZ(ж : p{`rnk؀!]z HI0 ߀֋eIЉ6c"˩09Ñ9C8x-h6ԡaA/*4z3F^yPIOQ|"~h"+& 4ڈpD:kr#8"V&lẁ:v< .q,xfT:UrP AYoe6lup}2ksнlEZ KQ{TȻy_|pQgN"Fx3}0e Atmxt54E+qPh4;zQA=wxTKlSJzѫ|ovJrT~seV}m ZrR{dg﬊~%G\v#g07/qAucPCZ ިfrzibM,@ZݵU .OV˾$`QcM`rbwgI\5Vhr8A YnBBFD*N(CH@wPj&7VREĮ_ʕ+gΜQHh%+ʦTء]:n|ͯ*2K͛7e0`ڦ8WegoTcq i~A"4$k%ȼIYj)/q]2?1RǗ^uV{?=wk׮8qBDŽӗ.]RjnRj7`% ۶_{5̕?v]GԮ>af*I0BE|Ŝ'^X.4\Bx2nIFgB"O*C @α2LkdO3h$ !CvqQrwk^H;hi T@OI5\ \|[*h:mupjF" V&HVr`/heYt֔(竾w\3TA2ju4a%/\7ˬPic:eZ- `/C$ 2I?PC35q?MQH \Kj,Cڞ6k3,&Դ!JqWuGpq Kf0h9Ո$*i` 41En9PRډZ柣=+PLz0C2=,+ilvƣYF,Clg&*dVl k] &#m D{mPK^1bwq(G2$K"_,G]j(@)hƮr7h7[vqwy_qƩS^~e;֛ryՊHT^ؕ?Pd% 2\I2U)/uv]G׮jqB%SiD_"u,MˊrIn9WHjk"nd̚]UfGmWTUdĚ][<ŋy*O?[x ^w_/a@2ó4HDhYI|爿Nlci! geЯ - @L>?b7y jSi7_X$5 ߻dB:e{g9 sn?VH<e~AS"~T1 T]9r ˂M[үߗ಩-1it{H=ym՝-_M,t %]4} h4|`>zW}Qeݫld24&5mJD0^,\A2KR~t]:v)֢ԔRM~2`\?S Z)Sǁ7!v! EAz Gp]Y[ O!5I@GP39w;}yzuwv~+j965_ؽ[=NJ~:PO( B[ٶ%< qW ܲ*db{8Uie3F]iָ7n+7qM+#Da*4/r.0^Q=D16G#6/}vYf^:]}O X(HK/_Ih2 R#Rd!G @!wʗ 0oOAB@]d%QLNȪ@tYs!ڢ8)A|/zGu&nA,e~Yf+-,פlaU!j:,0e_58Xֶ}3gNidov׻y&|pW)((,*rm`,BD0r+ E2(OHPĪ۠Z_ڕZ.q;<8#=߭qn$!fĬk+1obS**RcljBlv/$ q FF辏>曙[–lʵTSz_wy{ݯܮ QF$dl6qoH.7pP0`$lWNG)-ÕK"~]\q{NBj$E0y^':{FSl,l!&7?[&ѽECc^EIoIKK1)e"o鲕UUƍ 57dĽ3ZWװmۓn3ÖB$oܸVªUVǖ8q =Mh>pP$pSUU? 1Mș^du`p&Qr07%$_ȞP}(QRPhVv~}}-R50g;/_Ì~u&?5Wͬ̉{fܻ*+~OFA䗯d?w|qq!`xSS}6zf{9(C.\P- j,,*OOOAY`#1i]W^x^Յ%蓚ڭO>Ξ=SXXrMM.^S._n0(Ln2$09"MV֭>Ƹ`# *r{41J6!De2h8IWpf%N~ 1{^xܬͮ 0GSR|!onv)wĪq,r}UɆ RMjBؒ':F͈VTi,qL0Xss;I{eOs ?eY=52W73 fbR,4]mL7hC?v1zF=Odh4Ŏ .Ո{Յ_0na5AD,?x}E$H0J0za 4fCQ-xSC 'pgp_݆ y 89ypdt+? 9GB:b{yN#9dmBpW^}Ύ~gWJSowz̙qUI`_ZRv ڒmO>;(2qC(c$4>ZH5DVXU_WWT'J3 ߑMr/+ۄ.ŏ=v֭fˏXU+@$-\z׵MšK5ړ˗/Z}e͢EBy9V.ZbE}}QMoEr֭] 23֦(<x'Af*@/c eQP(%k rfC@ψlBjb;![y.cW`:'^]]_S˴YiMj*)1<ɺ'eB\rzXD ;nKLLMʶn=>8)rW8BOn('+*/ߴ o;{`#GB{fvwڵU+W⭦>r. `0im˅'p80AtקxSDӆykҸ8o-:,/0ğw< :e;CSx1)Eה@v߶'#qҗ+#Lz˅:ůW~_)_H.ļH$ +!Tt+"9Gn*3֙nO8`q,$]pK/qTqaG+GC3ZoYS>G'Z[gaeAsr[ {lRo:)FFFp0C4 0( ~K ;|adߥI ^3=p\ݝۛ 98fPgޅ Zp`x.%9U6 x2:￿sN3cXtrń j!۲G@Ϗt C*ŏ-?v>'55Ub!1 UP.(@pLlŗm5@\L;#Yb1[vcFΙ3?J.Pbǎq@SQEꭷڳgcgm#3ajCdn}}}:/HMOêgqx{[Z9gmgϞAf{r'Ο?Ǡ!((055/ D9---ͽ(spWxs 4P9omaTAjv 8eiXjdꍍJ( Xy5[X'UU/^lƠi #--fɚ={$ %0eeį.]b&ظ4 ~P~e˖%ףO;;Xt)>` ?'n_!@| h(t5#Tx"]ux~'?n ͛7c4!3h@oG"KJKK㨪vؘagJB"p#}َvRnE9$J 4Fh,zj:-q Z-Y_ĸ<142XP `D6sOL×-Jew}g1z`#sz$ +z~wpmZS?bMpDEӑ3vĉԌYJ67F#^M68k  n>J{p8ލMO8'6==x{mKo'Gq#X8QsF% :DN3$QgNphnNbgҹ7%%|Mg㗒b@< Xʱ-=v59 2}{;:{ _}m۶iс m-f]GNLf܇>x`OO믿`F0 iǏ?z(nKfR~9t`2f,w' snX?XȬcLAm@:h>>9 (|`kexܹ@|xjEdc?9Dt^؎@x`,caQ4hDuJvh/y?*8_ls7>1+|$ZYR[. |WG{Br`84RR{zPU͞ G\1۞~_ȪL_/,hDRjR!qDEP@A B (5$J0(4J@@don79&3u{|Yء#B$e]*FW5ǓN:; /`p?tߥ[8k?;ך7/ayCTy՛ٚ^?g #bk֬ԩ`~>Oxȸ8@45%¥piI4ѐΥٸ ?߾cqC_y{3G%v1w\ڵ+!b+₴ub͍|6V¢(.:q<>Qܽشu prR@eEJl5uǍ\t"գ !ߩ<LGO6V_},@t#xNAɤ!B>nŲ^sT-x%ljNU29=Nbʀ$#iB,܉ٳ'ZP(!htqd PBt2 !vڵe˖}R曁VHcÿ{xyH'ks4'#u%Ь[Id.x=p~}`'n\2m[*Uy݇a+sB`#0+(G* U.\ż*]襉G~Nkd+82lޗg 8faԩeeex (A6S7!kVUUN:2l+^w:eiԈ!/>?ıјCp?I\C;DކR ˋU?@N洑EB@ =BE\M!ZiFpΎzwt~.p|)+K.AFP7LO~x` |$ ?u4ٱcG%u׺NK3_,>YUٳ~ՅȱW^QVW_&ӧv6뫗T CFVr<V}h?q2WgrTΧ 'GN55q!)ɘ] J>欒72[ˡ\ZBf2j h]-i&zg>ܽ{  yfZ6رch" 7@2UTT'Pr $.q2K֭CӠ;D"oذ>#pǁtoD}!V ۙϊ+(Wjߟ@0@mݺĺˑU%ɁV  _RGrROMx7"-9~9kTeJ D:)S:t &j2T#M2lܸI6 i2IR4Յt< ׯ_@AV׮]Bh4:slssDQ#‡&ةsmO(t4/rG*;I7٥\+KXΟ޵տJ";9=6 8yG.>^eӅ3WWVfXM[te -72r5)!ݘJ9ChUc7&H{t4 : gx^v sp^ڠx!H~q-a 3CfeʢE&?2 w2d;:pigTos+W\ƫv o *69=8׻=?xsm{ϽGB}l*9(,o$&:3KDtB֦L4uA#{HFx0XD=O^/*b~(FE ;]w/.5-'[@Z`|$Tٳg?Sk֬ӧI0sYf9ނRyĉ[h`Z0jw_k 8ƞb0i6c4DR95QW4~mw<ҊN'N.-5.O1e_ -0VժG"Hj1ȩCtpnY:hT⵲ \_[ a*NZ"Z IsNxI0s5V|`vg u-V= MJ24%KX"KYt&mI!ѣ?p є@īt͡Ç92" xz5/jjkY&ɶx,`j!w>FPSlǓT:C q:jUofSe;9oi2=ҥ2i :p( L~ag#ng'[sꆮg;w"{,3l"n5سwo}C}$R]S2JH65eAAvqЕӅ:C˅'(X4 'P |bm'<-v`?mȄYmrA@arOY&%5vS`} XB *m$kL,sE8foP|T\:4"%})$ʎ[o%wּ,ޔ;D"5p$:|<L=`SoF, Zg9_C!e͐5?lM@)oݰq؈a7\coof.`İzFϥWquӲIEOrhMI02C3K\nD3n r-.!3pM駷o }l^7S5uuF8RBҟFz \פ]G3D)GZdܓ&gK.Y%@(zY. K9Ҿh\?s̙1cYE'q2) f7?3Ohzuii)sGzY~zV^7}j<q1(ˎw xiy f l|؀&&[)k*/ =èd.Tq̈A:l5)I∁w$>(x} O`;qrN3 2ml"!SS#Gv33e TD>ILS%ۚ a/Jl[$j=lSl6{ťR9#46[&P#? 3,ԎN_ꪫ[ґm7oFD@q_eC $*tK!)j3ûJbAp?7'(0cVˀ:'6,F $?p[<Ъ ]`߅?}ھMvHBVY 5u]Chaן- Ƹ}u<M j|]Yt$[ˠ1B*@, 0tӐmG7}Ա7m|?L^_$ uC#}AlbYEs]y=dݻw7o4w\ n OPdbjPz'|gϞ()ihk/^ wqwݥK뮻5;1ve(boD qɐ%mvli[=@vɴ~đܢEhc!!)E҈n<h|>}giuO?MK~eBюNE~-XD'"VDiG8,YIж?DD0p)13[HF+4DP*&N,NI#߾|hK_AKV-71#g[H!E]pJdnJF#Z6wȆ"J#{%.JFJv3w[PaӲ~4|.鱋|lDdM (3g2I fNT!kK(cZim8Ch'N ɒwS㲉2= -%9|_vlv3$vW(Y 6D2.1+촎)E\H(]䧲1IvHSP W?ԲN +<)dx6o/ղtx S wJ󭜷nr!/ CQQ>[B~'yKjlCBfF\{!:]VB>YVEVwm6l>ҴyѶj9tI+N0e'RVsZR4^2-m(s{Vy.9̔ڄeMQTk:g7 鬑\|4݀yDSZtIJQMyc^IX\Lt M5y' ٍ7$-@_bFPլ]e9]"@k] E9CVˆa۰-νo6xA]I8,mxư~Z2a${Qk/_wog>.qȂCj2S> Tՙ{U2G\œDq1&n@[D.eD1 J Q311dc0bx$F(j" *A^{_U4U$LX{}_]w}u6n,)HEE/KY vʔ)7u}ɒ%g}͛۵k'ā|Ga+ e8@a,RȈ5kTVV{`/` vڪU-[tIʵDGOdzX#ݻm6M #̛7/%]6nr PM7to߾ pȪUٳgAն0'1 /}`m.[K.4!A s^{E C˖2Gj[p!ƻ F!j {Dgǎ۷DR;vB}藊 {Vdd?5 .BKprVj-H6c $4ޫ ʡoذM6NO\osyVdeW\ȧ)i&Xn:RW^0x<,`D@c^EtŋF^HIrUMfsC`WqMXlz]oC`~y DF+?-(9+9Q^^΋pSNcƌ4i0 ԳgO_bN\HsgJS~(IMbGIJWtueW^͚=2ȳa8M,Pt .` W΂/|rh;N&cw7A Wa>tʾ|RZ'4dn#D|ebPr?=77ۗM6I{(7# p9|WΟYa75z}PHMs-8y7Y]!Bޒ(l08'ؖL45&3E=&X,)C/jYۦ41\+j@ȵ@A#6ٍDl24htJDI'7[5#S9q,wuxȥlv2٤_ DQQqX .`nsZ OōBF]APLf((^f2 Y#ψqgHq TJcd/EOHAd {X̜9-6cf[%coژDa ~vmd>pF8Æ S͛7N\Ԇ&jAa]y/yz쳐=Rlܸ1p 2iHYO8q„ ZEEpAi~D5Hi6%S ?#v?~SNNBh;g.%4ROƳHxݻwWC]}I-z]1 ,YS?0CP;w;w-Z%l YX]krbxΝ;kƖ-[vW*^Lx`&%i@ƀ7xu=?C;5jH͈{hڵ[bȌƍ'%Hٳ'XO>< tqwY;cŕgy&n fpV`]NMFk֬aCæM֮]f̙7 q LJ?S. ;W4n.oW;N>dE4FI.XȏJ$hNH@ٳ`Yo[(sB:Y0eO')(;9ӧ;U7l}N8TO < yp(0aѢEHt tw\9ri Dv8ЎJFT]~7YK>{0m3)n/U@Z5f̜2m6bô(4Y&j>xZ~y$&a"F&?ȔЉa6QcR(TUĢn { f-5Q(.6,: f=i3YZO  2ZL/Ҹb(49dz73mRrNK /V_˚96ԮU{tQ7k 4Z~kّ;;a2),]uU;w`> 4hPf4+mXƋK[&uzvucggJ >1/++.,J~3ڦuց_UTT̛73Ձ_{O?&}ImJ ~(΃> /x` ϤIL{U')&O+ 6@ͪñ1*СCa,lW%|G3\/{552k7CY}]ZwWXt-G2 'W\mYhј1cIj2u̟ـ /e@^|9uԉ'*y No0JGtD.!`k07@|رO?4]FK/URVyG((ߑ,H^ {둯чK3ѢGF۷7u+~#'[HK,y饗$[,iF.[3Reݞ4hnpa;r $B12)E֕d 2\ Ek05x(mgm^ m'ikoU-{7Jx^PTbRAN3o.GQ-(ka<̙k6Oe֯:X ~x}}JBO=T/{vmMь&@^(#M%Ϙ$5vЎ̾zZm] %#SXƮQ_]MJF(hWᇑ78Lkp3#ER]]3 vHTA%-WRF #ބ^ R&WƾrFُ8D ǝ/.q|J(VW'ꪭbI=A?Ǐ  o߾סC˗w)B,ߝ~7@믿ܱc^nmƍ]s5@)Su] 3.d&^v|b+LVv&,rTNj))&l߾Vpy衇~>F~P /@ y2H2R3}ݿ/ϟFnݻ7WcO=Bd+)v/RJ~r֭O~)NG} |,.uYܠWV8 |Ccs)ȕ|T^'37| F9ydFh̙ ?E߇00W4Mu[3:MƃDJC`-ٳg2tM٤ST(|0eO% >cd,40;`4^4.,)u-LpӊA#$v2qyB0 #ܨ;I1lJP \ te.VD ⾟*.)/5I#^6k.GjJKbP=$k=ko_VV^Q$H$7 >uFڹÏmpRfCe.Ӫ0;8@ZW_h"^xW~XZn-i>mpOP#SZw={m׮ƽˏ@" NrmpO@\HckՂ޸S<͆ OnSFEqmj~cMV z9|郐]ta,Xb8ұBP䉴U\K^lСC/oַ?/YD#@xZe(Xdv2Cܼ<ʕ+Yv)XztaU?3f -\XFSrcINՁLNq@=z4=,F`@;1a rI6XpA!AF5A6x4_3M14BmXCH )NR^z_f FPiǨ:O>dQÃ}ZoF@@A$Ɖx!?iOqЀ}VK;e 4O#턐%[J,e;?mXc$`:C͟͟ШJjkk "U{vTtIPZJ:oG_9a5Y)] ~q%TxADŽKu]g3sIGh?O__OX*ٯYmgaqY7n~<;eb ɒ)[#f%}2lQ:6[!e亵ky3m4FlfW+(MQ%*߭*-K8c[l߾,bIQ]E[T%j@7O񇵏? h%=g?#`q~>XV.aNJ4(Y>BJcD<S p 2iҤ"H uԷyTJ=7߬8rEw:p@>+**ѣm0`t*Ժ㤳py]&+(֤[YY f߲K>ע&p^&}vL,X8n8Ū{/RdžʗEA[mA>aDƍ f5jR"5@Pդ.*,uܶm[%Uku%rml{:h˖-lo3f<} R[C(Edi;R%+Xqu^=܀`uKt6lX Y`?+üypM((F$ЌLύmg'&O|bz Q[WVRLVSu@X|_GB3fZg_?uϙ.z PCDEHL38;qߛ&N8NOBQDG" I $9}s3RFHX=GgekUkRS uԸa}iݺUz ح[͆ M5M[746w,QpBnu]xO7n\WH[u^{fbÖBGP԰{wݳK}mGZ>kŴu^]7{?.ٻMMڣ{oi \:Xj{iƭ%6]4{?^V{h<zR! ٽo=Ocig[xZ^Զu\ya@ (12MǬRV=tJh'e}V۴ֆMڥK]}Mk RScXS[hhR_ 1d R[ۉPzܼikcuɿ [%4+/jJmk,44wޘY={ktg*"{w7p3Z{wolhJث7oc}ҽ R{4;kJ [w+롮]{R[UF>V7zߎvh))V_LdK>.]M8e뫯1@Xo^x0&lV5>O*/ZISc'7}6~e^6m球^xᩭ Mo{{M zva.\O޻WR Lַo_UIcEKڵkATAo0ο뿂{h$GSN9婧իՑ_P/Nf%{00@Zn:y+mST˳{IC;M8`TH^jU18MVtѺ_mjuLvm6ƏOaU,ğgOZtfM;s OJ9<M$a,j `cζNJ@ Y9\Wݫ' ?9İ<_ y{rr҉HիWykݞрbnEg}Ô4ߍNrh2NnwyjЧ-TQ#QsL.n `;q<ɖM ]0əoqmlwH*~mjSZXgߪtp\Rݺ/ZLy&kG{],5}/~s<{oF3O]vN4{=5nJ߾3g e;Q0w\ jF;tM(SҝR!C?+ |t=f3\7 [ؙ Y~d޾l2ŸO"3we#^r6ZGjy X΍}$!g07T 1gJa fzhi"ׯg&fV]`ThCp@+lxC)i8p K_g+%~S/j_h [A`D-+VТl[m ~17T 䏸2m}dV3EAY#OLjYg_oRTߘvZ%_<7\ Eǐ-k{laD20cFS5 %=-Sj' J_cyJW5AZWʗGtT%)a)^lG;z#L WX*M)*1y Q̀!}o\~$V -FK%*EZVR?YB8w641{1B LP۵wnh l{[diæ7X?@/~O9/֘zգaGw߃0ǯ_Ck#O%IkG٘=鏞eM}O?W ү; n,谭B3 ,@Qg?Yck^r39jKl~+OmP 6folc wZz?|Ѱ*HEe`K 4!oRja egZh|uQeitL/'17Vs.^Zۺߣ! sN>\fYCKׂ=U6vSxYWanO,|aZ `̌ecXhT~}ҶvZ)e*ܚٻ16oٲnF^,:s.JۘH~w*eJ#F;@/|si\gp^גEhXЭK.'zm?\ ݲ%۰q떚XߔfH`V95,\<*,n'>'(5V ٔ)Sdp뮻?'*bͱ*CZn5\ 7̚5 4>!#oM0A#9жTb >jȐ!A\YB&>sUcDaҤIrbE@XlDw˗/`d^MuQHቡoJp4*l%Pcѯu*CF^2D޼.85KQݪU3'MER2)/5#NPK2z!W]uխ*lc[jmVA2w\ƊQR)N{ \3= ~j3)jK<}`!o1䵥|{X::@690TH-`\Q[Xc(V%AM{=f AU*k0PjQ:Tg=4#cTbEGǜVu2޶[YkG>i7y[+MEO/ߵQID(Nmy(fM9re݇>=Cl^U3Z{T aW0&EټiS1[=-6{Ҵ%~uPi*3̈́x/ޭ_ܫW-X[ojyKGJ ^=ͪ8KKzo码nM֧A]u9SCnڵ2_ m+#3g8r嗃Ͱ =zԩ?x]6ۗ^zI(ϺRʪ->A8,c(@?/;C@Y`R~h!]xO>@p#Ky=C*p~eK.AQ!t O1ŀHO<-2>jU(O( 7yn8hMRCr EL# d+¥Bn`:40vP@(R P-͛geBV7b2^z%(jcm-گ6ҕ{gƮJu@-pp*݁fvD@9cfn2w< qOB8Um%)<- a.HD`2Pj[z_., e4ɪ ^x5V 0'jn>06`5A-ysEüePnE{ݝuigҝ2UKTغT׭75nܺy˖{#[O7lY*JdK` V6l3`׿UW]e|qm0ڎߴ|@!6nx/oO\x}ノ/ƍ7l{9٤4s iE!C&L|ջhѢbUMCi&pTaEL6 x0z72`,jɒ%lÇ25=>;6ɽ9AZHaƸx 9ιm 7:, '۷//5NJ-pRBUIj'I3!aԪ OOYjThh}~,ȧt"4UB^*B0`/T|xGl `?Lx570TD*DHmRζJmRK( m\xqxϫگlJ@8|k6fزCSØCvjHtw̙ۡdx}sN*c6瞣:Jˁٳg_q\̙#3$h;+_3<]`r]/d{,4sȑ)?l1\d۔BJT*;YƍUۣs@ DO^Ms0ydmöU0f6k֬0W߁ {خ+J.rMwvπ"۰q2PnEܒ|ǪT;+qj W +G6ܴivW-u]3z۴qcn]`є[@īoI%"ݱ}7e~_ٳk+WB^{wk;`46l55ukhhzu]yE_+W@#tu /ʸnZ5k`U:TݚRKN^ g?Y|%A١i8LM*J;^.ַDZFymY FGT2,\1Zl-M8TlO7X藧:qLf<b "$bZE_qǢ_, lj'{'6fU)ybk:Ȱ^Z!=S2ޮtƀ_UMv ##/]h *˘H*+]P įUVa{3k*Bh_믶=l՚]mSi<͋كn#FTmOșܹsS?OgU w}LJ`mSN8NӁZ .{ꩧݡ~;̑@hS~$R̓3fnpSO=U/Gy㳭2/-tGݛX<]M_^0J{{-jla+=2؝~*M /o0ƭ3f7n?+f|W ZPlՁӭ yuk.j]oؔk&$ %k{# ZJݼRb<86.*Q)0WP 75WWYE-\VaO9a1y&/I|}ʠ6)+#RWBBedu)UDAK'w5pİ(|`*Kh3wR`x& ~AߴnA֭ +gҡ̝/eIe$  i-z|JaKցXGbQ_m mڢ^ѓ#}hN>d~B{⦅{9G'A\(&T~,]xo2}tTC/ypg^q?lt+VYȱ|C? 诐7nrQW[n3U@lEK[nPHaaq?c'xɓ' r8vGQpxu!LUFۙ}N l.5kBA3.NZT"2w3l /Uj00ƨ c^I_ԅ p~: uDRY0#zqF93?)K566dͅRs -g x.mXJ)b#Mr yX VF-oMXC2`Fh5[/g8蠃+LC6[ډt1"^/|yw E FnQٔYUvu:.\{Çw|Y,J:_ 0]5JlET!LK}NYfPE Fi5X[jOo<~9PǏ#{.B8uqǁN[ˆP@ ^SO?tGfSG+% #.a|ķ9Rh( ƕ*,%KDiB޳)$+y ,;4h… mj:?z8ttLԄ̤U܌Ԓ4cڴi<u6ݜ4i2*mGFxxH {M"+8J@=3FB~;Gh̟?Ycy;/կ~5vX.{D0Cj1ēժDѧ_Mh d6qDM _؜~APC(̬ UnWe￟LUA#{`FM%JQ;ܦ2tt 4fϞM=~g>f#K),Qw>}zà4⃍7Cm}:r-UXΰk)WB*T̰AWh[{п .VCʹu]+#@![(lS\3(ҤYy]Zkk[Ge7B|3"ҴpoK d]j5+ߡYU5@j7;鰅$T^_@:r#7mfߨoبo_ Aӆ%K+FL@ 3!IDqiS> /]n䨒@{ܿM{IV\I#Odam\ Sy^}bb7TZb 0b5kրeAig;t.z#6Q<2 qROyXoXcgf"I,:u*XKaϪTɧ ] X4G=hA Ux3mfj@70ep믿~zjcB {N6WM'f ٞ/3f-SEoqx=nmiwϔ{r3zf]F~ԯŽ-flRӧO߾}) ( <ٟC͕J)/rj Uܕ]`i,Xe_* w,גx}|]jjzo7!53b+ ̀ 5@ϯп9>FM1,Z ϼ1̊7nU +Vk`뱍~mmox5(?=K4ÿf /0=F_;]_ߥW[a.<(B~J] ױ"T65H]?Eo`_ޣ# 2K}.j6lآEtRr0 ˠAx0X#Ϛ5+Õhp?b{"~Ny晓&M_ ׮]kJZh T|縍?njAs\ġe*ZMG\!70VO!5h%3uD(ёׯ'N;r4Fw^v#1YSD7nӥ+ A3ҩa4M /5vt"cG'HUsڴibU˖- eV)]):uzRa5f;rE[bt]2Jp^nw7d_~Y:Gt2Y&y .8(0"7X+iWW+|2b,:Mu ǟwJlֿTwT.mKsB.[9cƌ?W^_p1T.XUG=h[hZ#  |Y-JX)<6 j4evͻTTbɃW1v vi.zpC7M#ŋXj⩊.(RI ^{5*wR\ yI>(0Q =ƍ~Jte<QP刾Jt6`|e ww}# PGw`DƈS}suEFsI9~9}I&1#aL>;71BN=L=PZtCLLP̾|2U~UF Y_tCfb6BftA'>c@PGpv6E25G/ٔ#~f$, lcNSzQF-9 ?ómp)?Q#Yk[B:T۴уlziGCuCWrԐ B]f^"[j_e|Wf^ ZVW?K3g_^{g=7 N+9'lֵuJd3MF.,V\~$m+2 g^"StR(sSyW-\ҸBX~)KJ =E/#ěZ=+ka>F7+ W^I-6[S[׮'W翰֭Z$(BWF0bf4,6WDx$}*U#:e q X^B4 xUl6) q.DivGLm^GBVF)Z6+1,-AUV&Mtg 1 CB{E5 I(ԥrNpӴmr“jKXr%X͌o1 D(2|5vG7;mS9 [,ָY$[ X^ 62Pi则)F̾"sI?zSp6΂B9crwQyXOE3ELiaah GDC"Xg w7Ӽ'SИ9MuLXrZo@iK*Xխu5gSmzvU^Z7;ݻli*d.ޛ6BuI7vSrm=oފW6u[j{=~{ݻMzwO~My"h=_<ɒdn󖆦BF:LB_8)4!jTj-)4U!"o2#քv0=[lկ*עT$(}r^]Cexc;h_A%v\t0Įvk}[7+գ{׏cv4Vv'MQaW[_j <-qRsz _5&0zi̭ܿiKBqse@L!rRWNnT"jqava\rʣ>*S6l+6M_t|pWa"Ȁ\ ~D=GD`AѣB+zsq#5Dcn]?dcQtFid|!Ӌg) f,: R,dJ[Y]E9U!!rcd+9[8s >0vXe tT~)jŶlZb|T)kyɸW_ׯ@SLdƭ﷏fc={T(vѓik,=腨YٞPojh4+ux6G3:_UNWka=!*Xy[؄kSEFr4R)2M)Mv ɌV)eAȀ u=#ω8bXR}:#XA$Tb=&nŤZ ?(BeSq֩LqEѪE e;lh \^e! &0C|$[wfB U1Q9[!  q$98?4q+L>Sr#jubteJGt?P+=#aIeEikT"N_ćM5w|L.&R@Э"̙ꡩfYu-Rj}MVXg9l |Q3}!CsA aBpe>xٶF n6/=x&I2hl3I3̔;7sOؤrJsQC4[o#ZC#5GP;'eЗKWyg21 TiT7gPLԦ>}O*uN޽Uн{W8,-[6x)SD1W^a/p&y;{;N(䉸1x: ./|aƐZR#2.KF@"0gR*TZr+x,SUH'lSrT7rW 5 ֛_j"mǶsMm`'5pUtc^?@xnDzXbx269bۄWC|U4e$Rش/RhirYiyk?)x3_!&luhQmO, 9tHzmP!" aas싒 9׉+3Vm)Sdҿԫc.wJ&Hey/&EŋGzK0qi*)釟4.RnyJe*]lޜeg V?Oev``w6n_.ȟ?wA5Վ; ֭+mِ*5ej[ `#imBeEy {Ҹn< L&1|S!0`IS?u%'ӧO_Cu#4԰5;o]򸳳[wmR)h/4ڇ٤n:DJeBwh8IN#PcDV-;8S1yp酃|r]XU^*SѸ9 RӺ =ne0Jg#|iE*~)_,p7f m4VC匒) '%PTƣ4~4(A1EJb;LZ)Z(u)jN02Ցc0G)a" 3z6*=7ԸJSxsyM:5|1z*J/v,CTY:k}3 n iOf38, xv̙)w {,ʳH/Xj 5f)œ ϧAVC93vK.\oS\TdkQ2_T}~zT=*Z>E6\;{;)aa^a$dlBk֬Ǽl+{䅍ʍ+zgfZOktٷ[.o|ݷP7moZTSW۽'opYa:ML-_MeȐ!B%7zk&M4bĈChlz)m_r)*/,3<| &(Zrɝ>}?xda{o*{1s1{d hC7Pĉ άTnyzz뭷" X4ɳ ɟin4L4쨣2<cJE"L,vѣ5JaXA- A4IkB7 +.W ɓ'CTHߙ/7Iedۇz/K9,~wҤ+⮻r Q!CZxb T6 aiP 1B'㬦5}79hK' mT*!9Lk#>')wO 2Ta?ĶAX(hgeMc?P|C;]Sߒw)7 H:#B )~߈{vzT>Ty(C]>܆GƎlġ)),0WO 5He?K3! F)( r**7sUi'7cK׼[iCQ$N5E~[,lPj1 ]?U0me,ncc&Pv킻Aه~8/UzLn-2ܹs8!}dxٲeɳ`dZtMP`ny<]^e`tu5-bfwK1[M((۷]ߵTxtfp>cev#wyFN2;6VzL"\tEa\*uYc E^Yhf(tr3bIHɻ&DPv~ Px5Q*[Gߜbvi`ېC6[7J &hvqʣh@B# jVM3& &[5) ;r!=L8LfF{h`1E[nI90Zh@9}Q;!O hjs\u[ˊ{x:=G@x){*}jEv嗯YD:brFƼu .D,OڋkIbPR"Z|gGJӝ]kP)؇h t$wr!A`;, JWȋhQҘaÆ=pC2M3\qnEBX:t(r o8 ]*(JTEfW@nb aّNwuL\#fE ۣ i5kUd"dm~Rؗ>l'Mdv^lI'O .WQKt͑} K10 dqH25Hp3bӇb 'x ky)iC ]փ]č8eA߲Y~]7V|YV0M[6k1ݺtw[js/ʷc/N|N>}:+ Ú&9$GGjNoD2/ +}"k#u>j:Gk?ygپg?!__uPHiѳwXxҜorxG $dya;,̜,Cؔ1 SjX8@}8N=XΣCErgpkSWt0` |2 CiĐfu#/ö:K%Gy2UW&5S!xK S1|B GO0x k!/i['1oE6t̎,ήK/ޓ67|U n5\# qQdvO:%TX*8 k+]9A*E\40W>ydC)6@X T Nժ'AX)c IS}07;lS,|YT"׶Ǩ634{tIJ<RH-U۩빩?"!\7X4eʔ tQͥ 5FaEaVAsEQ:ViR®Vhrq=OYe3w)AmKҍPKz핅(( ͜db5fa["7)/[} F{xlȠ/9r$2jԨGy$ҧW<]ZEy^`"cg`ÈL>幒kO TS#cKXv"!/٩!7ֽnƲ =+W~tSXȇCmIerJAСC )0uS)O/A0p;S ~K.UG-:RYm!tx^uZy*lӍ^=EXUG^syםIGfɤ|?3fL*ɉtzeѢEk֬sWXEcu̐)ɘџ6;kiD-4y8HmSWG.oJ"ѧOg?b28ZeYI$fů J WmggxSc{ƄL>6BfO15!ABp.dϟHcǎexN:3խ[5RI?Ƣ}GC{45*5:+#CϔsT@U\T#()&^~yh .$4v,3+_[ŝwW\å<(ƻ|?#*YFC?lIW*+k`7-y_p-=~i.`ruHY0GcpN4iȑK,EX8O 5\TCh)fˊİP9y9 h~"T3f8CU o?sqX!c|2h#z'<89pٲe/2z䥼էσnrm#f˝YXMP,:]"?| `C5ŷ~w]M?~gyM7;~'a@?O͛8qRtcRl*ņWϪ{뀭q3G J3n.ՉuU [m+ Ll|=zwEJa'G3gg<3Æ 3?r1`C=tȐ!4 I#SdѢE\Aؠ1pkyWq B*R$Z}'>}^HK;֡oØ1c _geO?t:>ӷ't)mp즏Pj6VY@@5km`O=T{Wő%q.sL_+jfi0P^U:0Ɔf0f0\ܰp2V*ϟ??{:,ٳgCx4 Ra}la4L/KdEP+:,t{s~ӟ<R X!җN8c^yb0^z-Qx,N8tKڢOD[oK/eXXװ >lh0߿p+xbI2YαͬѣG#CBLz];Owm+r :7uX#m3-]k̐a:4,RC`'6;3M7( alM ta>a00:"Eз&4+R9j8eʕ%* >!egOR8>\?яկ 64l7azݍ4,;d&yLb_z%Ŕ)SC:TZN6M^ᡁ)rixqEZ@[C*0Su;(} Ld䓈N4immG0rQl1KDO*V ȶ~Seb3BCH ʰ`ZI ۯ\x`Dаܺh:eCŽ6>5Ҋ]ݼؔa裏#~XːTV+`.3׺<"(7*k}?*tǢ\j^3>0eIޣ{XUj^;{y67vCjVd J<ƽc$ 䪆Ni*[k]lX;:4/LE /,J/tjNfP:W|H*<+ЧOS[|pPUg?Yvy0*'"V66ᇬàR>+eSC^{_~ys.X?b-zV{Q-ݻ`gVΦijT,/pʅG}$m`/Rm`8nZgپ$250Ç=_s>Mfy}wT&dl,5+B İm/_Ϊ}zräTuV_o=lDK]t<ɯן?555sC $] M$=q]1N&5ON Qњ;VF5XZq!Q#~^dǹZ0tjܺZO+H USO٥`y7p wv?:)셂j7ʋSUOY9 ]fRLnr%{/{ RθhCUbAg a{3=)-mLC/avZ"i FQE.xPſQ\9貙SMAE9rK}ݗrmG;g#l@V;Wwb@zhh/ Vj:Re>)GcHkQr21II*3пvpI#mʔ)3f+8n¸,vYYOݿ묳">)y@{ΝOp \d1p#FXp!? >|ذaɓ'{̙f{𷳧~w)5u7n.mDD1pŋ3|`CÖ͛6Y^7 b!O%J;c#)"@^X|Cড়|-Л{"Bo2!<*5ND-+ShNnә?x%O9Se7h؃uꀭAKKG@dQaqv8]RYha${#Γ(r vv]d ]u}nÆw/cT*9Mɝ9*0541ѻ-[5lI 95j@|ڴi7c5׌3&N*S~|Žy^:3z-㘂ݜS)8L4rIݏRqR9=M*d 7!H/~VNt_z[Y|sU?Is\|^ ;sԨc]HTOŦTSJ RM=L{ RJY漿wO'*hEK#L2*RFU\W0]ifa%(\g6PI9F0q151hsĜ1Xu їP#RQ_H` MdXEyW*4ogC,btep>G=iaJzMc?mUT{Y*[؇7*PN]KrSa -{"5k$:Ati :;!T\E.o,рX1213 OZWgH6WNhe EV1ŕD s`c+JAV!H9DJ۰a#)fg˟io՘暫?o׾QnaTMٖoH_rufѶ)Z)_H^wv;ˎ-:Ժ/9Q[E3ڦ\"q?IڍY7#%ՋW(LSl$w^W-~jC; x邾3֫uժU C6M G(ﰧ22ի8&K~kx8F7tT 팧v^b j|GmO#itqƶ%IP]VåR/t ~2Y寥6,k_,.,Hxz1?+o?4~Tʂ?묳 j,X@^#5`U^,L}ҤI#UNBE*#{hg1g HNY)q\}ՍoEȔja6_,5B~e{m*4Nȿ۔n{LJ$Ej׌O9O~iumߦ)EtУ>6P'oԩ'p}Hou-0M41{_zF3;CFSxL1:ܿ]1FPeҰnR-ts3uZgy#  kg'<묳17Y=;l#Q 5 cL81BVOUQ"b8p7Gߣt.o6o,ܠY䮌u&;Xܴ[׺=Uie˖})g,Y ~L]8%=+Y}47ҥKGj4zp {y)?՘F*3RCÌ`&]gY:4ڣ"_WeKR~;vɂSY/<n:gec $bZQɬ۱>Q:)׏Wxoۨ=+VOTvqg71U]Gϳ^z)קO)t L˻h+Kwꪫ1Rw6k,!BS1 ~iʁ5_+J 0a__up\0@#ڔ[gê\dUS61tZPLPnL=lV7(oBx<ܠiRa@r=« FruƌK,;4_na%;RrA"xU>qdV*vbْKZ\ҍҭb/@^8aW\qҥK?pƇ0ϟ?Ĉ)׋?3 $^#I-n[02"tZTW$}PQSxȃ ?u0v-RQsρ`h@\~>ef\>yi &RLXu$i ]6.6p-aFɻ3(ܘO~> pD#c.̝L38M93εU3̜$@$ch9=ڂÊ=U*|Ũ{w$z3E]z&@ &L@܂rp*R3"&3n QnqM~܉)D1b)?%tJ ľhk֔HO[0[Y㐟>x@4Cv,a)vabq uv~6w;M8Xښ3N $2馛48gGup u5u]65Y ԃ="._f=aX~ 'rN.27QD[G%HiDBoZ~@3^~>}U xix<:W&VyfOX# EZ UFS0λ~Qn;tQx;ka H]GS Yb'C\(gɒ%˖-4ȩ2:sU<"2F^DD#T_5H4 0ojWM$CtQfSB|Q;rViu1~Q۷ߚ-iͥ U|듀+=GR*8p*)E& lp7xgJk0lMf+n\181\4Ưt*Mlx!-*olS9yuI# ~)s@ z9qqqyM̢&뭷j?Zi?uDx QIR0D}8DɈU+åu]kVLq׬yßj7Gjjoa##N.V %N;ϓN: :@/2 ߍj*`"p3G6eWXirOU*O96D>NvjY`H!XK9jQ$R5j6keqZ}mO>iS#7Sjsėj9q3XX-s` (cmL91 -aPR9+ňC{̙ßP32#v1iG(e"陃xrK .Y:ˇ(3]fc78e0yX)ne &hͪ@m+cbar# GjIuL+7~"~?cHT{bˆ32N) AشPo7xcܹް_SW=&=aÜyoޚvùDx*dT# tP dw26ؼ[yVT]t+eSl)BkrVJM77ua d*:CD̚5K@Hף|`:FaN<ӧ3G =_+B5(U Ն'g?âQC PU!khtO2Ǐ@mj,:|*F^B8)SekEޡ7rш\b_*U6(0TW.gPlo(H+ KʁرcSy̙3E4I9S_ET~&S*gz%#;* %U$UpdLbIhg;ε>m9өS@ M  ܈F*M1\4M'F1z 2(&60Y92% 9g^k[~_~9] -hIL<'>i6d2dpsmzvE [yP|*A/p^K8=e @gaÆ]vM6 {nډPSA0 ##썴G#GD~,|g@mƎ+ׯ_?yd8c"?SMC!|zEL|CM,C\ٳ÷l"bh0 ;߿?=z={68w\?x`2~G%=XX-S3F[tv@`6׿>ӧOq⫯Q%pz "Nq6c 4I@^\p%ɟRD N:.”TR`d7⋨v%]D1LH=2CSq9&U0.ƍù@S %tQ+ 4Z%1T_y8H+`qaPPP"FYmv8J0%08p NSa"M(F>JS{\pK/Ը3\ӛ *:00?hL3>CKk]m55?d]}8 SNEa;/ !7oqg̙3xp$Lv;/꽒O9S][nݺS' nlc)|UՁ5u ^LV8ПkRFys5A^[@'D13elKSX>ŋ5++U0bDC9קx}*3?kֿ"·Qn@?XMv:KmF2`nݴICyh176@~LT4sVCYumpfKF6MqAt WXA4LUV 9@j Lxe6a4oMH02Ohq@ <;k HHvD;l@`bW# CMPn6z;ÇTp5rRagz-m%ŗ4ߢ3|$BF b~ѓ Ь@H)TeqŘ4rhWB#IbFq]F^;43f =I~k^x,U\m'Fb!*4`r.gP'.pED5g $1uDiǎ3pѽ{Rлrύ-Gä9sڵky_^&Bm~ :XB~`Ǽv͌(N3"bPi1z^{qCM6cYMO*9xBv#ZHjrFc;^L3rƇqKe HWp0y<^8xv˰Μ929~ߓgΈO|&./9te.)E4 &}-4O.L-5{gtvD HʊiO_g]c8&ofMl~,UO3ۚ,_.ݷtػǒX;տ"$~%8씔p-:P D4n9km~&$!:0b&E-D%zyD̡edtDƗ&8~\qEU@K.wVK|L'Iڴ1U U,3)+deE{}rKxGf8tz/ߌ'ǧ|Uzl ԅBFMc.~\9_&)@̤3si#Po_?C٪kϞ-uB=>p ӈ6D/lQLy+Ot9?~(&C'&??ҭ7L,*N\J^?^J:p5W?(eʪFģֆ^v#W'E7%TbYVN6{j征tnSy2dYs D\EGxC&Ha/ABcD kF&VY'"*Qrŀln4;Ѥ2mP4>3]O]iIOu`Vđrwj'o/qȄ~oVF zXYĔ=K/ħEȖ-[xxX]'/nmdf0iHq 2FTT;#ںҲ˕g`auW,x.PG( xI| ~,XBN:Ef0p* ]Rs i>@g飯-ve/e1%w;cpzS opUN@ X;-Dik|aDCCx$Y|1K܎ TU'DFpCfR]qh4EQa1YtQ2]cz\?ʒ  [\1{qBdC !%$.ǴC_BCZ!F@@4Bdƍ#q£Po8ʘx@O:|I$b : o7<)کBht;#5~/ڇD0nĔMfXƜӬaE!՜h3ݹQ)ĨV좄wKĈXӥsFVr#Xx.JjȆfxLԸ EAM@##=J.O3 ^Ovܚ~(ڱ^l9!Qvv&C_Z2tnͤXtMH ;ڙ9|F/N(LĉIB&Q{A?;l!@C5>E{{SoаO_"in4JuT(OBv^Wp!%}{Y<@BN:0#˝fMHjAl$m6j$2Bqу˹ŎhUɋ/\Iƞٴ79p0 u~;?~J܀qZ:1|}q󪙇䐥¦_wͨrabx-u4ńƧ2¨Hॡ*wf11(tȮߡCEh v1lIpꪰ9q9]f[9jfv J-_>4i^SGFEz=֊'7轾ڤ$$ʮ8<Ų¡;|=nŰ4ּ)ݻ_{{)~LjṮO]:&zli"i?_ja1NSԒncF";Oڲh8-HsSNŪp_w޸0rʕ+^zxg}}*~,! ,jժyqk~'wq~;}&V V FUI*@:~,:vE q:ëy!!iȉH-m:bp:0]GjVP]3qF~!8yX Gz\(O,"QQ:k'F'P{ܠ1N5 3g1MU4~EYġaY?]óעouPhD!Z@V莉11h }yʟNM ߋS~rƋD@D(-QvDN7`Vks8mKEC@yƓ0@?8|džL٥P+u$+P8jjk;~O"B Lv]G??3:v?Iʟwk; z 2C١CŃ>j2C`H%#EO^ =.wuM 뫩 rg>-~N$g?#,)geMݏ;UB-ӴLfX*~=. d}Fx;y˞|lmK/-2C|O{?\uͬŷy>"hG-hĥQ^Q!5w_ M r|ڵ70_%Y/v$_b{$35knHzq!X?E7GJJZii.Μ)~g.\~~հ0-#>A3|OC,Wz0_\ebH +HH05j| Ufggoذa{1"f%UtZ\ 3hA;Äׯ_W ?d?#Gd*V5a;>HMŦI)$4BN+Çu5:nAW%8l7Lr":s:Ҍ+`y~υ_'gN)wN\0=SWیZh@HW~Nc@9<ǥvNt.?tN#Y9K=/U[㮗B/>=oЎ )tԯ,]m|1K4`ଟJ2:SDk5SӭIلiE" @ l  $) #*?Ѳ*k(|b%ry)rGi8ɏȳ5)b1i=uȟ{zk7u^GF+WϭxջQKXUԊ#r*HMK31u;f*,̶H>>V Zɖ=dL~z<tR@30}:M)\Ivkſ43l5HRS{( ߰ac:TId46#2n8Ĉ]Vy&J@H#( 9sE 7 JJJ0_W@{0=̨sKi+5rX! ⾙%Mr7 P#f-唦O4ЀOm9 2B""5H{>ˤO4b8 zs'fD,{rgPS[ВιjvR2 Gkk]w̯7'޻7`@kQ]P`(Qޱj+ UcU'I]Dsf]͕/wb >$9Vz  "&М 1 6G t렄?wi?nڧ@Z&Hq\r%:w͚5(ٿyf {:x/!S^~:Mwߝ2eJ޽wލǍWgΜɰvZ!C@Q|K/ꪫ-[s6 ,`6}kL[o,b|c).:DĢFAoc5F\( ^u % 80uT2_P< +B.Ix0GѣGg̘ڙ sxi.\ MBm@?̟?*%\.g[lJAZŠ%$)v;vu8zp(rJӬ#Bo6}wN_y嵌KfLD!3$!aGd9rn{-[+6'2uBq**e*ΩM[3zܔ|y]o6_ueuYՓݳmp9%!++ܞsb=( &Mz饗233; `]=h cT‚51Ld1c tѩk;l*ljg$.,,""&÷NsEQFw}`C= z0v_XvLìß8$3(&GyĹ`cᢘH=yZpaOmH@Qa#W :SN}vѣG \aVIJ1԰zjRL0!//:1}|?-Eݻ {0d#5(f `M>]o>`2lذ?yxp1Q طo9Q?b-Xl(\#kpĴNUwo۾&`v݊KJILJ*LHHsK~g;>G;{% ^e>~Bjg]uP!i)Xя;F6j"J~zq 3B"f &W\1lذslʔ)82m4E.W_UgϞsPN:t(=@{::V_7 hT;w$"ᑢ999h=yBq .-PxMV|*JN"(Wȳ> @_fMnnŋ-[F[/9cQ޽{Q̚5 @$Cgk7tܮ]fΜ9uTŅɊ%I=] X~/a}oO> ,==:(tC| =gq jãwHaa!O>Aa(꨿o߾;L|AIҥ{bn5p/!@㽄zB|뭷Fr[lŖ @λ$>(+/U}`uBnѹCnݲo-&O9'9 i9, Ew9~|7 BV4ɓXHt񗌐puu5VP,`w PsVTLVIN@O_N~dÇz |;0#z۶m‰#:>׮] y3ff|}r5{1*dK.`!*A мByi3' L3)ZηO[PSP?1ʕ+E,{ԫʟ0AtysxK/8`PCd夎AU3D,O믿#*ӔЭY/hG`phGT8])l|T5ZO6`Cf=POP.ΥI/?Q3^F[6, M-:10_*^>|~p3 ZUb-o8G f9tzة65A]7XIr2#hĭPkzl雉^2]6kVZÁ #Naab^S.-- {X/1c5ՕNexˌ["j8,#)5K.+RSh*sܨdaܰ I@0~x,X*(XպuDflC.k@&L8{lNN];.ͽ "#>Y pu]MDo( \Q&//&@I!6m2e 0"NrpISLDCg&c-E߅  Yj w3g5Vue-.W)b>>e=z=z>g5:itsf͚G }8{cǎDc}Ƕb˗H\.if际8{{GDz*3"6c\n!ѿiۣ%=-!Pn nǨ!5 \ͼdaK k\0_dʁ䄮]+..-ҩpj=.GuEϝ&*./UU9S%g(}*4=5 VҌGVA ߿? v.Q-??_JKKƍiP@BP;$cB8 0#pgym՝:u%eΝ4y-SG(YZ{Ν/iן9_݋@qBU.TxI`,f`]4Ţ+?1rȏ?Dȶo߾'OSN~AJS2iCnledd̞= фRZɶ|_һw.(S~i&o*(Lq /? :Q"b _ 2Zkwg,dz۰eGNhC[l弋C`rlX#fϞֽ4Ok7 0n8>qhONԵaі.w(]J7`uK~L%$"lEM#jZ7|O[u7xs*+5e C7@ii[Q 2H  jߌD֭[7lذnYG;v`Kt@p`C׏9n RW^MΝ; Œ]}tBŖ'tOB6mbs~4 p=zbi߾};CƣB\\6o|/M1?Fө6HcK3s4H Y#b %H`̊`w.7ZdOXOf$#b{ц)a?$*m9.44Nk훶["yaWtپMhS.N,TUH\A帢Lj)߀#p +HpUp_B}+!ŏghp: # /n~{_ߟy͹W^5fq;̨$xjwׯ_;;Oy\#=]Ψ%MnD `gEyIPKήf"fxڵ 1+)B8< |F,M (F>7nąYˆQѣ:9Auر&ME'>4mǖI??? Mqqerx¦Hh<F Hj9LX<93GƅCaEꧥMo&ՄSzb-_D"ࡿ`RIi[KN[rλ#'O DhN$e (~zq*$'JbC?В:q%?%SPKNO=yǝVVQ.OՂ/E%Қ^]S 1&*pRs;?OR\N1;322Zk(OU&1֚hĈ[n ]Š 탄#z,f UǠз^p-Z09u6>qK:wNq|x4j VH?A%(//1M2kG;ӛ-+++CG|0h[l]-1BX333;vڼ G$ѣGÒPJCT[jF;BwF":8nԔq}*o(XqV؄z"r8f)|M?uyƍY3˖nͧ Odd.زqӉc]5[n$)j #-U (T t\U],}|h8e(8 9ZLKNk!Bn 8,&b1vJ!8yP:;vyW-DBdVq]"~2鯵gyxqDu$YǑ*پ_۪kYZK2\r䆣̈́< tj9O+#z- ՂYMP?Sڷn-\R[+Rdv  ^ޛ@ Gڈ-ӑu:\@#ϽC;*o!aDkO0Oh&di.LJH>\X]l/=~>)u羻^Nj y藏2:',<% 1ʷC)Xzq@@GMmִc1 8xc,<_ $s{1S k 2ډJʄe |^!hR"@W z?w\+nctK/&;J~ߠ` RO+aSD7qao1G| KKxrQ!Ɯb@[E⻅ok$o]d-KQH >=q?kJT~/,0LKܬ.g*~qR% 10!'PZ{؈!\.߽sĉΝ2CAyH4{❜(X7w,i:ϗ7wi׿{}ýhѢիW|Tn^xxc l[lŖ+mw3 CyȃiiIzk8JINz]C4泔TPa@7 I(0CN{x;uw޽{* x;C."7nw@Jm|rzsx^^K<& &Q3ǤϧR1b-b-"m D%̪$>26q;qA܇5I2~**sכ#Ai@<33Ep?zhjjj q O8bL8==ٳɃ B1|'P.2\.%%ua.J {[l[li$q9n#qC"џfDp}~D ]csrh#o*SFTl6+Mc0`cǎ@@999.]̘1cը6]m 'PW (I ev[l[گ9&AMeDӰi8=n%{$Q>߅239 MJ3Enk߷- ykkk1F‘*okzz: (XjnvvGy|={6)) hB>m&X瞻QSlj :uĉ޽{\r֬YСC۷o/..>{ꅙa-b-Ku:79)Q񓫑?2CMN CI(ԩ5k0$ hSpBMiKxɸs΁@^pU֭[N>WVVߣ4vZj_r?dB\n uzBSb-b-m_ڜÏ+!;n /QXkC%>;;А4%t@l f"-'''3WeEESэP_,B7!T:k/ƅO(wHs~~ e< bmBtdҢ/GaUOt}ZGhpy:k-Biן|;8qdf;QRSS1(ÄBSQ0?*woCmJ'*'LaU&zRICOϪjk/*8$~[lŖ)= Z4#bSֻ͛.myw!h,MJJ*//޽ɓ'pΞ= lU85:׹=rBT޹sgԀs tɐPd:eP! G*u2D`R,_-.'BEUMg l%)q8QGrrXT(/flvg3 |?.~!-E 50Ձ5$YJdF^>ONFϯv5[lŖv)HpIܰ׎kZd, "Q ~oПa@LJ3g?wuK..R||I파[o-]Jx@\Jf`)7ډq)[UUN+;SOkgIK<7ː52-Tb)\?S2z 4ePaдD^pԩ,Dt̢`)3ߦxqh<4͛7CJI0߾(OF )Yp 1)uԨ0a<=?~6>ܱcR*w^@LgTTT:t׮]"fFO48OVvۣ9}4q? ׭['~|C϶ǝx^:tB%dIQ'Nėm۶IS/tk*~N{qQ:3ONpPj cggkwl ܛ˜IlK;4=ǃ/ HIrzc3m=[l݉39rʅxŀnh~H{'8,NSʆE= L,%%%>7G}-|r|?{=ܳtR:z0:Y6u{V<_Ftj Vym #j| xFj:8ߘj|kߠ-b-O,"tĉL, @&U _ʿ_,`}3"eLغFL`XBn,Z{]dɏcw?)y睿կ~]w5] VPFt\kܹywOk7nH7 >ǎKCyY6:uEoԖO>a„ [ ŽTS5_qwލOO2W\? B2m4?~|^^ tqwP4̜96l@̞={hvVV6돑$GhmK[NHm~O_QLfJ2(ҭ\1evv6逛裏;f̘-[%77w44{T w^^{ FI@SBm !ȑ#7mڄڮ}qaС~!Y}oիQ jٯ]q$ʛڳgψ#N/2z}A%;ÇB^z)d̄x:3Ř~//q8bBzNҥKiT:s ˰䫀ƽzF!\ݖuDĒZp1[lio LvIiL*j~CÔpH,PPFȒ%u] ΜLzpP`X8dde&Ў?яz|k׮(/322=d_d ~!^BE@5D~da4Ht۶m.8@ ޝ . +L@~O,4 \W\~=^&y/++)h-Tb>bc6l؀zE.+b=YpEkt4x ~t_d ?<… 04?  q#G@رcw#Jh`BJizGȖiÒOvEݘWǎӡ J'WUzÅ)~?Bb` k8 iFA3t[lcjAm&X+E{X6%rBf DrZz#G9jhѣ2f1_!']곲P3dsmhkHbJnY?!M zqPB_uUׯz ]o35 QM8xV>T\T1vAUs%xR-pM欷cXQєjc/7[l[liNeI N$J:?N8HuwI$~@ç({L7lذP 6e ; f/Snܸ[LK44i'P*ܺUUUEΞ= ULV'Sp"=Ug l = #v YuUܸqZݻ3RX@~%0zLJ:B^={\\Of tM4?~-;w.4n ر#N}ݺuùt‰тC_f>--P1# #BK%Q l9iL<[t1A[lŖ.m/M&s!T}!F= п+C贲݀ 3g`~xM`ѢE7|wc׿u3(C XOU&Md|m OvE7o#Fp*aH:l0 qB1O>uϞ=yޙWU~3$P$ 2 "ɉ⌊cNՖjZkůد~UU+U"( 2$9þm ~:k]> (D!C:!Xkx6sL6,^G45ҋtT}0z޼ym۶EXnBۡ[nmڴ={$dȢEu~ ˡ(SbG /0W]u믿θ\{>`aag̘Ĩ[gϞ9 #@7ZB?j ҅}?2iong2DM"J~_mZ~u%_P@P@5>wLm* yp?>锍 ?D#v̀6A[pg`n@:@ņ[HZn8|} .+p9R.7ܯ ʗ1&9C~EG6z| _[&W_G0Nx ϡz}K )RQh _:vxw=7JիBt픃5Q~wLI|=G R1z=X.]?eFE scH: F[*g͚UTTD ܹsDebQ3PltŞeq|ƱEL66ɏHT> 6|We^dl ( Q#1COu^ш5Nr嶜 {z}|As\]D`hXp,^v5`-i!w9^h8HV(`1p0O0F}III֭r" ڧWӎh`j]y|{i;4 @?4tgH |…|UZZZXX(h-YfYkiYY#zTݺuCNTπ+SpukV8{ /tؑ;oxN[N`o> dR{Zr3̬v[[lssKPRּف۷DY( (oj|X{nؚ&㚜JzW}*o7buuH+hRfܕ_*J? 6d-7"(S%:z*L)5Y@/9キ4J/M2eѩDR؟_|J8-5  UG-*LFC пTMF!~ꩧN4NhG >T>sLm۸'ݹ+֬YӾ}{tm;1Vfbwz'@@P@sj|rNĸk|:CusM$dr”;Al>xD`}z#-BB6)i |{aN5nubeK,~nՖ(S%2SfR9L6_.K7"-Io+ RYY)TNS0 aÐnzEGgyԩSP<#7pm)WڵkCH`De1DŽ)'O̎DȉָOVUU: bG8KBiÏ>MIDb (/Ƀp> Ed_APcBoqBdk/׆jqmM.&:qet]b.ڷo' z̀ɓ'1?o޼9s&\nzĉ܂zC]tYdT*pT@!Y!wP&Sn.O_goGT#Rݨ -L}%%%@~ii)rٳڵkA( {5YfԄ[˖-bwcS֋$/? \՗"1&'$uP\JaUU]w\Su]TSWO [4șū$e )rA+i&/3]tYz0#!}T@XfHOu)&{L˖-|`dkDmRE3 36l(,,?Ce)'}lj1p5ˍA]@%ӳ>ӫ1u:=饥%:frɯayQM8 ʤq殇&UVU1P͚5]SSՄgkXݏayʃ<(ll9BDmcѼ!Zυd/ 87ڕ2wmƗY|f|ހ_|*d%@O %.A;Bʍ!Fؤu~ zUMr2 #rR.-źAxPi2 +LߪU+ 1e5nӦW_}յkWZ~=+@ 1c" 7Jzł :wLȉ$F1&:tP mas-πnZp|͚5L >QfFn4ZTQaϞ=aʡb\RRmѢ3Z p\s;sMz +V@mB*aH [S.\ͣDC8M A3d7sժUSL$-NZ4[?$AyPA-iޤEMHM47Re[-rLkU ;5B|?N'g}GY`T;,2k&iBIƺ|Z/Ʌkƅ`Z~L(\HzbeQ yS"%`כc-}V`&Ez\ vR|Ƶ,DBeսUvB2nX,JOBe:h.d 8XzTqݻ_ ; `10_R`ʕ(|̌p|rvMiQn gT ؾ}{[)(<Bj׮TiG SN .Q7+)lS[M@~ :#=G}p‹jQ ]$Q(OZ!һ))6$_ *\<"++cMaDkPY-}E W}ь̭ުG^矠<(ʃ|ϖR&LWn-h4LF"1&;7 {f 3`O`D;י~ 0[_L 2{C/6Y}Vnl*&7mYhX\g+O̟25h^&Ti&;ӣ%cad.-C[@C&c7ׯ_O#.CVgKdk|QIhzYYng&ԯ?r"pUءCgt-tY=|[VМe0vȯcǎ(NF"?|p%O h_\7 DCp袋ċ+LR %e@:1vX#Kna͚5HO c^$yh+0gyP}S(tg?Ef"$2d20`2#FЯ?bd.w'ݧO#o)6IC$B͛nY޽`|hH+VVUᛔ<(ʃ|p3bXS.Wh_ݨ?Y;쬺3M/C[,2{ 0rI+~:pMi]/ 8ޒ ms/H}CvmkMֺF/#4d@jYg QA6}ʕj jO9$xw'u-..f4d}^ԆM ab-SLpF~>/W_}U="Lyj:8tPFdQ!)!P֨ןLmj1֮] ,V,Nƭp2>,ϠqqBفpA[Q"!sT*%-trhtÆ 4lӢ~ 'OɀBʈIq#0XQxL40OʇCy5/A1ի넇t5*t-Q0K.r&HTTз羝7βRJ*rwc'SDha-:|?wPAyPGKʾGCHMUmen~D6* d/5FZNJL XU}d=]dk[AW ,e>]|`t]SNp _%K!Oٱ+07#́t\-E ` 0eN@қwxb9*܍"zmQ^,)52ر́u0(7B9m4_qji(V>Ud7"&ɨ2AyPx,^]SrzFT: W51u6 ~;+RD$j}de@-va_mO4uQZ PFoQ(D C.`;cO>dc`J?;X$DѣKf--- OfG}6ca^+EG}4rHа lc`BÆ 8p >Q$ B Nc"c=NӧO%Ħ4x`F ޽{0`4G8Bۮ]P`܆j斆4H~\r6m-/]d|O>8HOL:mD3gvi:,\O6{ CC`/_\LrQD+Q,̙駟y849c  }ӦM;D6?_~e.]x܃3PGq&ҸߏI \0M 1_„,)8#=$|P *˙n2a֒C1k,\}*"E4 sFl۶-*ѣ-[zw:i$Mw%ڍ HSNW1S:[D2(ξ~UBFݻX` kHIGC˒C *%jc}h>_\[ks k7iCQ9 !z)iL [7<(ʃ|/oVgٖ2@yMe%s-;sΙ_l^Lnq?4|;< |u뭷~#Fr-T2;F烒eJUL{;V.g *`{>zS@}@kYScr 2 ϖ-[JRs͛9kԨBQAn~TŧbgD<^ XJc%=a=`:묳JJ˷:((DREv Y gqu]|̂ @eT@832vW\~" 5a<_~ќDK.A9쳥؄msPHA$l9ϧ 5_? =\tW~rb[޼>֎e*tbaNںK}@e)2;T7e]2AyPA) :tn /mjOPI6~#N̟v'C2#قo֬!慨}۷o~8tȐcףGIŵ~ߎ;7QGg=M|'x{?epn&w jW>} 4͡(jcR(u*Ց ٵ!@le1['[J+<҃xQ 9O=TR!p w?!ħY&KC k#;<Z@R \C}Ϙ1YwqGy9RHJKK RE_\\ܱcG!4%>d 1Lъp?ӯ:`ZuCeЫiat&b"h] QӦMC?>}&PeIa4 ÅTCvZf޽wyꩧXrJ&Bd8"j1,tdĉ, #̆04={g}_E~B ZիN_hGHt RKYE(i~u"2-` ʴo^O &O9s>CQ0a* AyPr^ge'O`ٖ2^JgM.ݪFMM,*Qco"潻Ǫ|3&2)ˬƵn8nډ^` /tڽs]n&<޹s Q[)_д ނ p:2^V'dUگ@}{:9lni/IdIw-ry衇w}7r~o|pGNo?`82_}U'<%.%@]'SN9Ev;sϚ5 &C 2eJV@zD_^{5oI'-]y\+~Ιg 8uY5 p%\['|.\(ձE{!C9GI b)/Gh 6sӖXQpg+-rAf6 iTQ@:%i[:%bw>Ba$YohVoŏÃ, +}JK׉ #Lڶm@[9̤j΋x2lܸdCRi3ׯSgSIKPAyPMƱQ˼%%7/M-k\;7g~k5ZrbˋZnQ;bePas 4KFa 1 ڕUUJ[;nܸM6e@ѣGg\% L:M6 ,H s1,CiPaѢEںt޽k׮ܻdE6̵vo ;/jنpBY(eBp0H9 EcA<zTO:$ .yY~a>}dTtl*z:MlJ! )ٳc\t)UX.9stQzJ\/#8w`7Ԧ"fX&LsƏOa裏JzaN|\>}:}a?cz ԧ 6u!<'lzJQC*͟jAyP{<o<^J,۶)ܹۖhƩݱ)]5Uhʫ&w [o(IT H76Ϙ8ڤF47Ϗ=wrca ZQqq1 4 *a_W@kNI@7|3̕]AS1PhV9?=r V4Y't w v/4 vOiK., ] EE߸EN_H-[6 l" 5 AΝ;#vP4n4y2È%_ ّ;d2<5UԚPs&ɌY.]^ڭ5[732LƇ2mDAyP{|MZ憫%jDm$4'WGSive7qu{2p&N?/Չ1;h^k?9qM2c;LxV=?j5.N 6lجY Bu (!C(m0*v橩V_d3Jk+Tjv[Q\iӦ9Rqlp׭[-j5G<2h%%%#wt]sFŀ飿Sqe.tRAҲ(CNp{A)4w=mݺ LtЁ?uZEwRm۶pv /u]Y3IaˏYn=#k1H؉15ʼD&6WV~eض*]yL $x Haf<(ʃ=X+VQ"6}s_$? H{T~[t0mRc8$3|c"H˞Uv}#?6-kǵ翛vB)B7~./pq͛7t(\>|ngϾ;o6c6VSO!_A=7R+,O&XBe~_mϛvkP5+o}x OxL E{*@ ]e- `SY"F9;Wմ?-ǺtOquZ}*`ңzk( r;sGMdS\ٻK%ϸqb@5% rV̭&>3f`l y]ꖟX# Skuj]G0EQoNd Q5 KhJOԴĠ F C|z?;prs^KˁPdPALQ0nէ4W׺>fjVh΂*B 0A9O9dEky} ?Ɇ^bw ]61/LUռ m,`ݢ"kxgLJO-G[5Kh瞾/},RMd<=OjzByYه?o{~3L`@SEЋ/ϕ ;/Ua n.epkY qIEy@~4tBw"OmBQs` ]QF~rJkƢ ? aܺmIB3mH"p3OO0sΡd0S|jK6lʨ!G@gI>0)2X\@srkGD'۴]LH˖-޳gυ lTSiFgQ!W E{7=]nOP_rjy8VaK1~E#oFRu*a[Yls\?Y3v񿹩'x:5M1eQG(K 5TBw+ZKB?K<=O2P =?g!أ?fп YvH @ʄ_[ @n-dm.5״\-@=@Ҋ+?O뿒#F֮]K}pXCw0.:f,ˤ}IYz% -aA1xPqB uڵUVs̑y 0]~R:Әkɯ:9\} 6h'@!+Wh"J dfCʜP/)ʊ*Lu0 ']YR&B=0DsBiOBuUD QyJYT΅GI!vi:"SQuXMJ9SN9IF*_~W+Q3ְaFƓ.RQN Nu+ܚ~I&2JO;w =+ӺuW_}L6bdp\/^tFR)@=J`۷oJ.>`qݤZۮ];cue(Q 5hޜ1I SmXlT`ݺuNB*q%@I1 ۣG!F^m!bϤ_Fg =(H?CR5]?G pR,r)rYK )c y\ZeIo[h(Sc#p]j Y`&=z4>}t6n8@.;h.O, rزT |8,W$ <%j}-_\G#mBxcVQ%Kba-i.>P, տ>X뉋ie.p! !njDG!\oH?(9r$IG't4a璑 =~9SN9jC%j,jJ02d9H(t'"܁A$]}պ L@M6AN/V G/ ?=N>d˃hVϲ!*Sh͟ʹv3dvIt"di M9Z2kd^t)<|͏=رcA<)~u/ !dO9x%eE'0-ӧO+VE(;0ʂ~CQ/gH̬ ̜9G5'VO2Xr%Ff_KE*Sņ z3_{G4g*q:"'oC_N9SN?D7G~D!"'`\j ݉j-Ko߾\r%&A H2d9U?ɯK sAiէI'4nܸ:;0^bϩ| +-Z^Eu|ӟ> QY]tw߭! u]wucƌΝ;s#Gwy s9{0$Vy##Qg}QG;קvC>i{C翚3e^ 0qC9b"- D}&|X/ʐ٠I]v Ht-ےI}N9SN9(uD^a'? ^x0w]Rz[ha9Nho?]364hxÆ gqw/:vہO:uѷvۥ^:m4г!g{'E &裏 ɓ'SԈ#ON@.ַ6otuYwuk XucZ.+}|k׮='T0SLMi?{?9L2C@=Iٴiwo5[͛7{zkC翚 J}R|ꩧz' ]7ހ#?[~%`~rTaŲ,YÇ[=1;.9aY`(r)/1=6GҘjfكg@?KmNT'>_.D(fbt&{୵k&)"ҥKګ5:% L{_@<2i$w;S,֭իɣ'Pq*hG>)*U01DܩOW#-DI{ 1BD zi6B WR b=)Y(lS/'?Vj\fda鍞a-3~(R\SN9_ çYLIrM$q 8[ =RT׼Z4.Q5C!Fԫ X,QY|}'U52ۿx+Ŧe-EQ+ c&eE2ʊUHσfKh>I ̨X(Qbb~鎝2SJ[SS_ƙÿ1zԑS:묳Na{n S&~ h%X1ϙA8'|RmBMK$^ߝʕ+yGϰA5rŊBN־}{s|>%KJGAIT#r R#ڵk:ieWh66?-7{s V7w]ĩ/+؞-\.Eŋ/YUѷo_ߑ^z͟?!2dɓaV!\xjd |߯F׼y?{A͘1C'Fm C?>}rҖ-ւok`FA{T&W&(gTx>뮰O)S !$ 9L[29]m!je 6e:PJE[Fq(Jߓ!Y¹ kW71 2Ө( x6Dcя~[A;O]wk&uä~Rp(3i+A)SofQtRN:$A?#ҨN9 yիWk!WJQmڴanZnG0`=b0GÇꩧ @!?uЁiƉ'H{((QTt.BUIT9*.V [w9%h"gv9 Lu={dҏ;~P_ )˃Yc ygC û|rQF1znn@!OJ8qr9SN(C Hsީzg[a[꠆B-]A`֮,㧟~:s=D%p&s93m@iDS&Oee% cҤINu4[]8:BwTgj)}"E_si_aK<.{DK߭Qю#RPRyҙD>3gΤk_fM}x ̭%K/;Q.0\Jʷ쩈O^=5k-*r)^&*/S7RiZYȥPYkyݤI]ԮKE!?[n NH{x:Q_(j߆Ν;(JZ>?3o׮_gG:0&L媫"Cty뭷2{< [cY8 :Pf\3eW 4=+W4h+BXfׯjۘk#8tN2O/@XN0!d3fPl۶-G?gM){1uQ~_2_}ղ+͖w;_Id;o-7}[U5M#iDi̞:V:~/BCdže SND"!hC޲-9UUm6S}Y(.u (\I*곟_̞=gp?kH<dVUF1P@N  )G(.i5q6{8(_ouT. Rѣ0b_"<"<4 xm% qPsA K^{55-ZtGlaԷ\L}pV{~>X 08Lsԟ H]t?>vԩ*:蠍7FXY6$7t4m9 o@ G(=.cZ.ԟBdK[jfV~i ENW+Ll ^ml ecwNxY܂ݴ%RHO"yX~@t=itΤNy.ʽ3Q0SN9}(`'*¶ 6t-ekU[BfSѴYwz%kO8޽{_]ۭ,/]$zhʕvȒTw)P˰aÞx AΝAlfcvi>`Ϟ=2(gd5T ,0>+5V1L3z_O,P&SW FSr};L၁ ֭ N`ׯ7f9ݮm̙ӣǴGTVXEtaæM;9adv)r)Pޤ,S|Voa恔ݚM7)Yܲ;UjDd=z/w%%KrJR|gҤI_|I{q\y< 3h5T|WS]b5.N<)DI!GC^PViP.e@qMRО0PįAAʒz&wA1'sG" 炁Rsq Z.R˖-,ݹAL. 3e"r}< JTXjfJY$)%A7,wѥK \xq;nbCfi+3c} 'nQbx$5t?r)riPc!;("*-]5ں-Tmٚ*.DŠj3iŪUB6Cg#<7n\߾}È-h >ۆ BED8ƠytS ܿd@ڂp| ѿzB5k 2DR|ْ@-2$*w]Wv^ү4~8@~|Ɓ>2@4YfѣGO>;vG?Q2'#`JV25d-1@F3S<„nܸH._~X / :eH%+++)2?@wZje6}Ҟ֭[/CΩ1ņ Q2 "|'FSN9M 6!eM͛5/.HiZ5+Wg j^ PСCx.L-1`/| vZ>"&)RN[ӧO # 5tPZK/r)ݺu)'ȏqƙuw242{:fɕ^bA)|SQk wUEB%z5|v>!H,Uk~SN9ӎƧ@\V߲u[hRTTluPj]?sj!d>&0k}#;t"d7Pg}@0 Ai@s&&Npw!љ3g= ={BGWV :̘1C2^}d…~ؠE!,.Kvie]~"fPKgذao&p;/~⑃>X- K+F;_Tdɒ/7tGЌ~qX0;\'> &hD!4QF ̙#[H<쳩n 'tOs=!`>Q2}2eGCJ?)9gaB|HLX/ zOC|MAIzBP_PtOᄏm۶6l83@/"CPZ]C!ZWkAp@w_ee%"O;n&2?Ƶ; O '2:&O)dz]w]׮]֟6mW_B7%|nf5T"g2 n4Rb*I߿ɓG_(y +9SN9ΚW4LԵ2@]Vܲ#c?"o}[ygym׮d LAp1ŕW^>UO`6`rRWY\{7DENBjܢѭUfu&䑅>+GG =(_{.x}ĨݻwgԖߣ-[GW kٲeLqg̘qꩧR΀OF5WV 6馛/,ZiLbcLXTA s̓'Q'EƥzvVb:P|ggy_>У/Hd CVSN9.@O_$2q~YϤe)lg!sQySV]{x ϛ[qׁ\#Gc)LL'ۥ>=醢}A)irP3Eo( `34+W7P!J?_잴?|P2b70^8:uj*ͣcrUpW6/$elWG_gqƤI< @.>OeT*bXrٮ+ 1@a̘1aUS#˫4hР3gZv-P~Ϟ=pN޴il:; j?sCDZjW( ntg c~yW_߷mJxIY<à S# {W.QCr- z?򑏰/^i/yh '+W|gq<HŃz,"N}Yѝ.~=7mZ8DL)kZݞ,|od迣_(& /QRrm)r mRo-nRUv+E*+bRƷdӚ /p.͇Bt+BevguݰaC˫^onߜ0a(V6 H/& _HF?Pw+o’%Kԧj߾w:Rq=COQ͛_j_` ?aҤIcǎ.܂.biKOSս{w܍[[o 'W/] Cj~NR6[jBf?[%;ߗ^zcǎpYT'g*++-?}x=w:rn, G)rڞ'ȶ\_?N&me ƨc#/?t |uJW0n'muRm4ts4?̬|7N;yk/"\/5i-z!*D~tM~AH!C޺u@!bǥK0&NxrAqx y !w]SN=SlkXV>ۧOʄXIR(qٲe6t-QAFKg߮]믿|ʙ0av*9nAzP'O x׌fgű7n/~Ai h;t0i$DuJW\q0Z;w^d F$W2,;w~9{l .]-j롨B`j37}SE3n5HLd쳖bE )Y]!TMDd"dsܟSN9"!vheܲ-kn;UUe l_n,? 5pPV^?DҬs̥/N7Q|Ms=h*tНϩ˯[cIaNΤo>4JQ ֭[sWAƟ6 viӦ˗Jbph*󬎕6lн{weNQ۷e mۂ@mԟUVVSNTGS7vU瞆ZFqNʢOy_Yum7Mv,ZU桹Ձf({>5Ȋb$9d$Fr;QCCN9S,Vfvc l*¶ 6t-eЫ+gU[Bf੢i62QyNPR%i2=G+Vi&?*%~39NugHoٲev_sΝTT)2"x,%Y3, *sD(x,(Pmڴޗ_f ɠ! :tOJۀy"m7%B SO!.74evTSV^)5DlQ]g)d2IAş'ݰh/>))M0B yԿS)ǂLrr)2hw2䍿>*B.ʪ(VÖfjFTGsww(]Y ?w>ؤU0~1%Q_Cw9:~rүrLe]T c@6 !UzfBeFFuBhp:@@uk$I|*D]֭[t,ݹl $3]`j ̌b:hҤIٵk˗¥xLׯԿ"rФ|kY[[jپrjN9* VET8rH駟f-æ Ź8pE~1裏{챳g6W^Tq}\=yȵWs)JiL[QQlʕ:1Ya wUoS/\uv,*Wjlпf3/5z>vзpgdd}h[ ûm-ZjNJJ `OzUtm*)G͓@&7v!E&UI)aVCsb#kLd昪Niynie3߇oZ3V>[k׮=tHg H3 R/:є$j nP-K'T𽨑F2n:uZlLqR#MrEڦ }OOֹ7nc1^UiݺQ#|O5C JjpL gy( /EcT+ԩIyFOINQ_v% )0gΜ=zkٲeF EzQ}-Z4f̘_Op,iӦN K4) 1,W0o޼yP<Ƭ6r)jlпت3B|Q~[V^/om֞/D'^K.tu)W]E we(޽СCv?! D8蠃ܧelBAw1ƿ{C4hQGuG&šPTw)T E*\O lC߾}@ UYCk c$wݺu uuBv@{DbpFD/| DvRNZJ_ꫯf`/qvp: {d1bċ/OxAU''%w-DHssŒ!ٓO>6ᢄ}cY9>x:U݋1ş*Cu:=I͌I7\x^ăyO? T?2%j@0@a-֙[;w~l*/l@@Qp!Z$kH4t} AJՃ "}0Tvh={<WC L 6^08t' /3fի#ƼCFb0vXPg/N;n8S/Rc1~EI'ij04I3 [|O|t90\p??_-I GGCdGWaoi6m?4╄ge/孂Y]6f̘ 3fM8QCzCdk-[\?r) 56?!)WׄU/![7zjA e} _˿~5׌?^/*OU QrSUC[`r ,Q|r AIi؝p @C3gry >}Z Rd9U(0ԧ) ;B$G3gNynݺ˺49CRx}s9gɒ%K.ÇB9xvr˯?Xl>{k  D>}tƄ.~M7N<oSNGq}G9N8aʔ)*Yx(8Y=>PǝSN=zmv饗2#Gt{L0AEs>ʜ*R&OLp%_ve/E_o154U޳:bi5kfW91/_j:ٳd.K][!r{~C6(D5!洮z)gРAL!CxLd{ڵkWQJHr)r_@'}5TJlqo:Q /я~}M.t? O>EBg1\۶my^#?pX8_~3f;Aj :(j36 Ӗj*]sR D lK9ΝK9 OP__ WBj?#\ߟ^8^P/^lC=1RT&ӹsgs=G~G^GŎZ uvQGT 3?>i٫QHaz)O:ngfܳRo?sIAU2͠*퐍q`(DQ2eBxdҤIrJU/iw;eTW^Hrwx` u]]R'WI<9!MAϝ{SN9ϠCf@ůujѤP,TekbZ? X5SxNg|.L:A"BwCQG?uRE{V6m(ŤN+OiGI*zַ9)ɹpBHK!*(?D"S A2tGZ ~!9vSV'DS%h+䁏 pb5Gٯ(qj|J-gJt`6g͖'$*iRꗡbNri̍JRECS;2|׫,$3 UA֭[G@d]]W_u#8b=<~A%gэ՝r)+VyD={,R;k)sRPr d@]U CFd#8Qa]b1 +S_P+_1zM`t tVDp ~2hRsݞ2> /l2FOL*|tHm" bWBA c+VsQ~~jDd}G]=zlذҺZE/?w$%ٹ&!,"jߊT4/WF=gLoɎ!KAN ޣ/(Ѽ?ZޏZ#ß#fX cX !~tUxS)pݺuR3e, -+))M#W,S&3L K#oCtRI' s l!MRCܠ(K|12C d SNpR{B 5RwVئ4P]Z>Ѐ]ٶ^۰zMzޚ}O]a^xH?Wk_+D9S=Пb~5&vnUz#p6gdlٲw SN9E3m: {&)]v}嗭M?aZ #] B RՄ/6:o($y#Eʅ frFNׯ_jفf_0<>1]w\ ?0{lذmoAU٧n.¤уA`ʣ>2mڴw0*i#Ycq(n[&Du~ [ף(-DV6 yV. l ACQS/rV( 8}y Qnxҵ/WP!P|(ю_5%VN9,3ˑFݡ@|ȩ8<՜I+N~Tu3<p6Ǐ>,XpeqC+V۷/ٞ{:=hn@p{Ԡt?鯵(OF:~[ZŮ\YY 0oo{uUM(sUGF"L2ˀC՚$VuG-M()?-IZ8II ET|U:EV#|\SPRdTꉓ 6-lǫ΅ Q-5bullp&@R+D!JdO_?U!1rb=B7҄(I#1~f<U&MdN7Ȋ E%Rh6 -͒CQQ.e`Z` l-_em|26}gcj XOEJ"p%\*f܂ lƌ֭c<_y(Z\i$c2W> .@n: mׯ:/D~T^KQ &8?nQ?ФK.N:h0| Fn`xTѣ*Pdgw&N1t=OE1_ ^A[M u\{ LOtFn~ICڦ9DKaq˯?@jڵܝ:u*XiFP 4uois/P-_\IM'++')8q!m?%: k™_`GˏԦ l=5^1~;s >c`WԿ"J IuYֲVղ}պ]x3Ndaɤtۚtm넵q!/y䑄{Ŕwܡ̘qa,K̏?qژ?>E\09V+{VU<4@uZꁌ4]sl2!egϞ:XA/ViȐ!kWò;wo:@ )v9GEd|W(*o?toZ+F,7~`vAA#Fd R]2O>ٓ F0o)k MN&>hZ˘_m۶ EOxBH( 9ħ7+Wzfi7WC.\ܺU;Ivdwj|п\o EC&4a e-ԭywzz$ϴm{,<䛢)7w; Ajd^Km.߃=mK&/h奦fnxZ_N5Gau5KmvY؃M6i򛠡;u t~*sh%L9Nu}]`s̋yN-[FEi\j؎Zt)hݺu[=;x;w6 iB9:lнJV47HQRgQ/~}N?eYVCoE-5ε7LZ֛3<Ark,Ɓ^G5x ' bk'}޼yRr2!㩜^o2Ҷ`LI@E-ɩ3"М ˣX]0E1>j1z)D#,ߧ?r1і]˙b.jLJNA cᑉ'uL1`gЌ3DV$9|T:0wk/٘D JR@SnAN8yf]O>*z"j7zTx^x']miCx[Ǚ6'#"򵎧/K WCfZdh*-mHT:j(;(:E{I'= 4}dWS#i0L6M uŋkr Pj8;=@KY&T i&QOK\CT\F8 --9c@j:i.ų<9OdIBѱa #ctԮh h-xP<8iW're0boH ٥Ƭ!n!AwE$EkAHl@^?p B}A88XlX+WG@BoV 9E@.^ !C 4z豑 ?x`ر#)$慞„j@N0-֭Iyi5rF 'lrSr*fx(_9Hh!yG.+[MR$ݜ!X6<0Z.NMU܊<יtR`$ QX^v{0wΧL~)|P/Db ~_t҅2bĈiӦ;txbpO'5rBVDR֠U4C$E>a&ݪjlذȣ?Ͼ" C~t !]8VyPO 'bqS=u(R%6q@!c}G`,C&_߿?QŲ2U?l(;wGؒAh~|޽{%oW^O#A$CZK:da[.ŴJai駟Ng=F?GIfx$VoEf>}:Af͢m4z>|9sXE ޽;'NT9GV~gz1{lJk<jiŘ .8p bv"fC 2'O>ꨣ(o߾z9xCҘ d{9׬Y3x`W_%Yw&LDS;ay4`(8WL--:7;.bN9SBF'Cʮ% Z'_Os9rYg#@4R7p3O~ UpΛ0apm`N:${BV .[n`9LsܭJΟA YbJ c=%gO)8vvk@zGN=T+=L Ѹq(I;K{_p?G}NTjnfzA|i 'b׮]ۧOF1;K(vS0@U LLHa3nXmR(SdIW VF>uTyҖ3Ț x2d.j`t%'|2?1_(8yO"hm 3wL&`dɄ:D &6yKGAG:v=IZF y``gΜt| θ ZYiJ"9@J㣍;:2fMĘ")Y0b(z DU_8;OK<6KSN9B|[U\"1}sUEmT;=fSߝ۷=ր~;=g>;tMcс5_wu]vׯiH'W_믿3rHp46j(0@m :w,sqCY=zA nL8>V2x*P 2dҤIԵW$刚u]]"1,{hihѣ'O2P5k0<K_cǎeHs xzST0̾LMP޽y|/FT4S2oܯ>Efas*+y*V#Q${~PDR_cSQo[us SC~,}`'Xz^V]BaJYU)(9 ZGx"4;t&6+DfePVgrldxԕrx?V=er]kY8'Hۡ6mBt/?8Kvu8w>ytKj*xB"_=Ir)D,!NԸ5= J<|7ts#e3fhw ҝ5ki!43 fctMb!U[xl5(nϺN?6m0`JgcLdxOJ_iT8)~vЄأ&k`fdQFj +WtMc1ضm[F{տ;E1jk׮eh;bfic1ȥݪğ@(P1I.F ~UAh3`uNS@U~b2e<{ş"ZST$9ų_ڵ<+v[)r\ :Dd#O |wxPL|qHU)ve9zH>T E_~9qr3boZ>)ȗ#dϖ>jKT[ORQϸ L S?ڞtJ.!bAC`aGQ~i ЏtSxj5رcU,K2 PXU1RعD$G.L'tE]Xگrqゟa[͙<:-tV+?o{h?_S[0*y,㚹*EmpIz@OnК C*NĆ,V*9tot7V)O0!ۂGRuJ@6mAL㤦h^ V1JՊΔHNu͖ji=[v)Dy}֊%uK%ukL%%]ЊmUBaȉ~o|#X3E"F}@}ҁɌ^". 1S|xrCjϩ"CJF*<"ҍTg\8#v ;$7)'=C@|Q ^{;|gʈJrj5'5X$C~vj3賟,ՅWDfZϞ=dR:׌ćEP;'E4fjIru;,X~_)AFSԵ^kɎ;H]0`?_|QoH_0D3fne-H=uPr>zJ d>iGkэK-sMQSEdGk]N0ƆAA 4L}I!aݸlp4FؤUq\W]/:klmc'yޕyOQN$o+)JvHY|ߤ \q&~n}j/MkS-V5j.71-k.[=7{qas /WvlДj*=4Sy[ SDPOX1?g]p|6p_yz j;C%3/5`T3(c?p$kfzU< >t*_qs' k6oh YKSi7r D\&p.d/ғO>Y#GЗ -ZhW?駟aMo va'q<(CK.'+3P~Ho喳>nk936QرcW\q9xc@Ǐo/g3GPXӏ:(o<&O] }}Zxi$ ë<4Wiԩz?QmVbE2}mmVݺmUU۶}G̘19!# sܹxҥPn:ceʶ 40BBWa@ʑl<(z0Xb*Pytʷ!F ZTC'#2n8=GdܵѣģF&{AwnfC "}w+gjY5mw}! ?!UP%* Tu:)IHI8Ea\d֬YJUբ}ه?nLtAj3Xh|-Xnc2eOUgPrtwT#d=sNebXk'.h<8N9pz1䪙6*( L fbnzRkq n?tmW@˿rwuC aMny N i(@ d޼y?y jyz+ ҤI&;ž}2@`zr@I^`;uTuGxWSr„ &  g*9ik8qDEԌLJj@.B f si^n$K-2:d|o͚h}+%E14ddnB+а푹G>BOe*eiJ6(`au4V˾Z#kVܯy IHE#g^}I(sZu0{oE HTa,-~A i,M #FRGí)I%]m1̢̘AЀnpGnf4&:3!CY7b5MěGyҭR iP 36K8d uרQ^ /Avk/efo+ 7Yͩk;XRT_7F)٦B\tE7U$ /'t9l*~! ֿB?Z#O`5Ks:ERy E45^p!%P oUCK(V SUvC SnE|H{)D:d0MU_<ø ɲ- #$Pu]y'x^z#e)+x@Ɏ M\Y kSEB)eklSK-6t&+ ?7 rfUkIq5eYY`r`.~̙ qE~xrW /A~N.0}Q#[͘1C}W[HJǏ_̙3OF*MQ=ZKR^@/E;zϝ;w4D0bwm7H TRrKix1@~`)_7c,J78bIALXɬ馛TH+grgc9d^lu '0^tAV58({XX 9o,r%ƕ*["kRAeɬɊcO\[ t^7nM9hK}-WԘ:gک~K ZP9x7~__|y)0`]lګ0gl`EI?b#N;;3z>`^r~'ea`G=z4Ko(O;3G,'GloMJdxE>}8z`G3؞IvA~{<89 #1eN7_l}jhšm+)Kck PO (Z^EkHuC T'{ k / F"b;ƝA LW\~{*Wf1Pp"Q׸u &DQUI·М0S^sIC uZxWsv~Jui؜~FRGs{7{(Y8sCxzR ƌfxiIݻw;D"BTajX6=&>˝t2%F4{U9e&0+ILfvoLT:}t6%_@IU )],3 O[WJ}nB95J+Zپ~Uځoi6*xů SHwʰR7Yğ,ll u "KY}Ր㠃"sSzĢغze4V>"4Aj#wȟ?auR3]&YWK(7pk+WJm(FQ,Yn݊u˦pV GcIa}BY0-!>kSʜb^/Wff2:lI 6/;C{u-U\7ۿ[X*|bW zֹʜ9sD@MQ>%c!r3<#_uݣ%>yX9կ<q1ozR, [NTry&6 @zH*(3S#<†KИ:ʸB4'?w5 !8Y3>Q2Hjb͹N c* ]΃t

lH2r̘1.tYz/b#n;&UY16yfΜf0uԐhǡPR?Z5^TtPơL]_9ڸ3I`E]L01rK+aKs,Tpt9|1b~#<uA8L 24k/})<-JGVGw|z 1 }i͔4h{ ){RݵV ,aLިdel5Zȟ4@({ui@㥞^ej1XmBhK36 m8p`8Swʮ54gPRfr©U7V47kLL);9r7W䉵 ^è3(j.=AZUA\y.YgE;^_y*@ _8w`heD{˺H@&M|:&CL>2m1> O]a2-&QQ]X6콙yAQtɠBD)UROTMˬEh^#%6Cj]z*ODMjgx!Uhxós[(pSbmJKhm*jjҦ&/R])G&(’u%}Q7Q*W}{ַ~ӟ~SJpWǑa0]E_ 񬫍"l5+q]J=)g(|„ ' 饗^Rm0{zP um*]Uxڱ߷o_8>яćz JY~IigoDz5Rŋ#'y6k_/SOG5Cmٻ[*(b2^ U>E-ȿii>'BlEAÇy޽f8gL 4L B(%4Xߩ4 (?C G bKF`,=Xd_S|*{KeYBEPlKs#>h ŶЩT o3]Q {HJʹe#j{|0JdfΜyGO>YP9Or~it֬Ypv7r)rȴi`hҡ*;:uT:zF46m[>!Sj"2Wo%;-!w}7?1mO?}QG19}QcjKO>Y({l/+mӻ`ch2(@2hSO /2dׯBYSő^t5uQ7o@\8x3f̠I!cҶXS s`-?=P}?X ~PظbB:mԢ@_ {$?C$?Ɵ= KRۻK鲷:<31laL-m5754Qר#YL0=t #H(_]ȴPN!b󯡩m!.)/%4l7H,֓XvB[7?ާE,mT+UF'2*ӄ1{9(0yM7L:ʬ(ONnЄ7^eɔN7DL\)3Tƾן2ݩhp^ZZ?MmK*RRN @9UJ>KTgQ0_NJ;Hw^{2A=$5j(5q؜h88G-TFvSϕ; ku09C}_ `a(ƨĢK!~߾}C"k9U䠄,#})l2cQP>ī3'PaF&SE;T+@?Q8=kB.U,#vX\ti,bRI'ÆXET1^ 1, ?`jjicM sfέl hjlTeoZQUj{WexP}\u%|4U%\}՞lM )_]GW|Ծ6e=3P{J:a܈ Rg1&ʍC*ݴ'3Uaӟ2ᢋ.9}&L8op_+tooi/ ojrۂO|O8q…Z}0@cǎ#N6MU ~0BGD-qv34UW]zr)T]Az+XĜ>WRկ{1J%آ$iE6X]vqdif,8-z;uEx_$cn)byTOo(" TH9͠/K6I\.BG6ZzbZ}Oٹ1f+m^hF4O*Qwt2ן.G?a@^N8$?~}:S7u]W^yT\z4si]yr!0?<|M7 4|饗铟^hxCJ7}I!C`RƗg> |Cmfa;ܔ>h̽߷җGl, x[\(R[*k.CX\c˗/g(eabt(W!M7&յCUOtf9];=?? eYΰ]D`]Hխ]lF5FkmF|RE>*[Q-[ %.s/dx$щhɖ@=DiFTuCغmlwo$̡^7<>FG!I-R-;O(+lK\(67n*CdXS $M؈u*a5 /Ã6Ep/mgպL<1HYVa4F\LOU?Sūu )-{xfYWqWҪʙv̬ԍmvk~TfsP:r$xgMBW?9z:DV~ q瞻 Hގ~@mFc_S7p.>ƳS X?])U فJkC_ܿ"-ebNKEz!eɷ%:0SŽCPUbCݑ%N("wҟf#w]3ˁp )[hhm^~A@gyæYjZqIa[^DgɤDiXe̯1OR-R-m"iӓg_JBV64@Y_]7՞dr^lo|P9ڥոgaSϪVhQ';އϺB&tIS+rjuD$ϡ\ ʷU6&M:a켠d TX"}^kE3᠃ҧ/_gFiQ蹇/d"쐗EmAR5d1͔o@3T{u*![Bm C9s?cB\Ww+sLQ:*ږ7r-Vt;ibؾFTZ-jՍLol?\lՌ.RյF|Uݞ8JcU%Lg6Uwj>TK뗊3tRlJBSv;p-D&b$z돭Kcc*ے}Gd _p?wVT@ ҦK_K/EM;DU\+jUG<~_/Zh?#hݪ"(*9sL2eԨQk4M<9en… dӗBz;$o?O{{7`t0G޽{&%Kh`Ő}!{=t(ɇ[4bĈ|:4dx}zp/,[]1A+SCB2!PPd&4 Ο NO^xavj_0p ㏫3-؉'--`sjj:2^]ev榬Ǧ]JiI]Ru[N%~MB:m҈&P[]}=@]vmθE\eFTP9 aSl3W/у fPJdZlBRT7w`Rǯ5TDux>y[+uԩzy(cճg>䓁u5vK%\}nRKf i8 M;sdi9U] JȠz7 =m&IocFJ\JYz0B=H z:qzyKcǎM 88j|߾}YڐAq׃2)oW_o\a&`<Ɣ| Y {&8XE矿ꪫƏ#=d&46kZZ T3ukVZո\Ę/-k<(I::M]Vh6+Wj\_nN ʕ+y}#(HS NuZڤR[~/MTڞ㽨TU~PxW^!F%~vןzM$Mi EgU.K'J߿Xk>hp^~֋"y=t?jo7o)^;JW 3f 6L xРANTtPfgsPlǝ3X`VϚq˷.\ >횠`"{h )|Ȑ!?83~z! 1O̙,G>C)sRyiG`¹lO*;{XQgrTKTKƐTJ[t?E̕ԩS!alb'5;unU]u-z6lߊou۲ z~ic4X}ڐe|R3 ;Ίa [m@vm|hVԸL'0X^,C5k 45 j?^|ŝviСm(ze?0eǍSOF?פWrMjS8Ŷ~VeK\ݜn{͍8u)?nп>Z@ݶ,oۿ+,aŲC[zx)SKZj˯DcayNŋ3RX!?ȌݻwKOܜK/v'dp ;(_]`y۷/-?3Ҙֺ.q5? ](}Y]HRk`ڦ&0(->0'W\Em8:TI"d?l1]RbZْ =G ywrg,-Jw ٳ>`x2Wn%ud;wQRV22@`f@ӦM;CÇ[S6Ֆz[i|jSe5[烲chtO-}ɦ¹EK}ղƦй8q;n7A蟚SI7Wl{W_} = ͊V\ Jj6Ԗ_ vgw5kc… zCgdipV 4 _pj$2ԢwuWmW /Y'W^ao-J'LXgb4:׫#P(Y^Y3U=is1_J5]p%zb0/tw]xX\(t* } _ W"f4dn#^ٓ ԣGw>}F w7`!cwCo:"̘1Qg}Ti5Q~vt̙3eG 7:-)d][oyzBjSvXZjlݿ}mO5[±R l_;`k{пeqp0(.? Ğ\OW4-ETN}?niuN]ڹ0/}ΤIfwީQyZԔr:o,Y2auͥ˛^oӓOѽW1o Ʋn5~ΩВ:mQ,g&,nVP*gxrR[Pv͈co](PFN_*Q~}5uݢvzA/3Ku TG cc֟r}"7#pDY+/( ُxiu@޴Z04$GxߋQdEEyZo㎳t?_}=z(DW!guNҙC j)-fQ C.B|_4%||L91ܒ"|(ln|42 !ٱ%otM7}wB`~^,X9?ܡKL]t׵bM>9|G}c ps3gΤcztb,e^>՜9s.JSlrf// .bێ'Z*BU)QD9twj]zj$/+e[P`fG3ǝhgSKAuVS[ PDozaS񝬯uI#BaLضFIyra]苏3+g@;զrjd[9R!R]er]UVv"MUjll*7^ԹpQ+psF?M⣳.GƭꦚP-R}%}b >39oˠ?ժo)].Z^F;ŔW1ޫ]tǪv)7v5wο%e` K蒡gϞ/b^ L`b-O*]`zS /e^z%Ũ'62ÓqddHݔEh9x &]`>S}z 704yd:1L7MDHyi>W'oMAhNgC2y*aE/^lDX3x_Tjdl~rl.RCʗ}%~{Wy ybZԢ-&gg%LDiJ_ZC۳SJOedkK|W/_/Jt_rjYy= /¾h [` |~n:Ҧ:l*0ր?lIuK ݶY ֶJRC]Q?I1y&'lREb~"ҥKO0"i2`vSLJYaHyOWiDw;TtS(֏aoaf^TQtW[֮&H}*AUUC 6 Qcz;T;搙U[~gVFE\۷/# Mc o-/p@vd[h"2O,zǠ<<)3Bq2_~\.\pP7E=1"Smw yy\* ^OKyRJ\Vʺ~\q\ȟ\b#wR_?0qUX>.aL0 3ջXpHEyG{M6PkQ "wh"o =EC5!Ǧ-2[6ӶV{6ΐ&/Y$kgڢ'TF:Unwz Zze;y=ٓ}Lrzp20dl5?74kisI7,OQV4N[Ž|#+5.wg{}rdw}=zΖ={P'l:ʁs=T(΢|~~ii f@4IɁy 9(S NY~ETfmwrzH~6рRuxS2 o5ĝ@XrqRkGn?J rDWLЬWc:Gar⤳w,XNvrHRJnwORgmiF8(J:-j$]c.2 ۢxPC)R.ˇr VYԎݶڳk}SDäwvnڢ'󜽑c1ί \/1t*Jԧ>5}trٲeRTTRʫ <\]O>)\XC>ǩU!v,:␱>+*(/VR:a&oUCtPӯXNT;K*RxU:P+f)y8! -zz1kf&JҿSJ8żlmgSKr,EONR^PG݁EŁobzN Z2kL^ja_X`>gL=MwK&v7-3N,/5 <_iTcvݽ{?8nU{'POQOY{1:ȅ*:9KV~`\ϡQ uƔ')Us[j_O2~s=VM?٪( 6i"UpZ} MP*Vd_k҃v̙moOUׅNqm;j^Di^{ś .?bdb'>1~x,Ncƌa*pEx̫fI"a^{͛%#"uؑ{Acc3,~<̖l\'y2^cSt[Xl *d/bk{;)S 0`޼y4J<,-#)An9Gy?4AG>k v_0=PvCQZs=F?p zꩧZ%NfXA)Ç1⨣JW' id[P׸qxϛTqҝA)HÆ "/y>h Vرc!bqWH6wތ}_֠ ԩSɩMZ >ӯ0?ix &x 93iҤ'?J{-hJż2zzWBz1\ve}fP5a'BRB}A3̙3FBȸzR G1teԲ`0_x0, SĂ|ާSuU -3xEf4q??Cٷm _2+c)7Ս`f*ՈKx@@ʬCCmzӞŋ+ $uv@;F |`2x.MRV۳k}K@n[ЇŸ7B;jx*ӲeSoY3ߵݎ۽K?Rϗצ`Sqw(xdPrd9pcZ2dȳ>K6c=;… Sj"nFl&@'|OvTiӴFd5\]wG1c #%5`?#={U5 ?0WO<\xсD瞛5k2Zzkq(LаnGdc:|?U;zBFP,(&+񯲖=zhL]Lcx+SN5Y''iyiܹs)à81VQUiz!{}Gg<3JOp+.JQldOQk-8=e 3a:,M#gyɣ݈^:exG~O>9eFDkv駏?c Aja*A 7W[SzDΔuat/ #Guk={6ߥf„a)yſ%l1Z[P,Tɥʽ[MuhVʖz2,Bm);iE,p` BS@l*zT N iBTTޭS63f酗kGBXYضɇNrYPSoLK4dD lm)cK44I'dsL$8 &]+e+z$9oW7cᩢLJjl%%JOH4h-s=[)ߩ_6AKpM ԑG0>t\XC->k* ,!`ʹ^ɨ@7V"nxQA'K-_hS1Ͳ_g3mڴ]wՅFD8##i9˄rh[ ;TReMAzE?CmV7Bk>v' K@0t?BX҇nc$b[\O)XRfxT,.^/cXBV( q)h39l(.5]}#G!HѮyVRd93XL'?jРA ۂ ؗ2vrС|7w\60.D_!])/jo($ft$aGO<;Hjx~j֮S/6)e0LrU'P&shﯸPt*eݪP($fj?G-c $B@]'4М`gNS-zwO-:N lR6x=wyP{bT ֤G)Cޏ}crє)S,i6;6m\H['hKg" XO?4G6aج)"420RɳSzjqrcIuYՒXH:N3Ӝ믿ρ:ΖdڰT "!)ݙS:E\\Q  Uҕ>U1աSNh! yFtYO_ +hOiO2EmKơ4L:C%>Rsr0[#۵ɦU mi.[8nU׫à]u9mFowо>cܩX+J,&(u&n7wܷ-ߕW^j [^%3m3M%bcMd[O^%f?TfٰB2\sy Ё!\ J~wS_}~✣|dUr)iRTQ JR%*8'n8'6pĆkN5@رc)9|0*_"H7p!)44odU0ۨm`? h17(' ^d`WJB @>ի3S?g?|b*XIj,Yҍj}sILo(Aլ( {ϑyi`[Ju)l|aM?΀יr"R=3 .F4Y %xO!L${k7[DRK@#*=)ʈ(/h~ Zɯ0]azG*=AXphJXbKEH.BUןἋ00N2${9T,Аn>􂝭  F[K)&th W`K YĤp@ȑ#ugJcTfSn|0 ZŲcp0s` A6 ?t]0? v䉃Uk@/sx,A+H a"(q0a{QGF<.qA-ڮ8%sZ-5OEΤT/ǝiĈjO5QCTqv|sֲvѢEaAA(Z jC|s*2Bx[u}j ăq'We Ql|pKLEzmsB"f3uRf~VͩfvoSs1ۗ 9{6$Ϛ̯xKͩ[Co\)+:sZjLSj(5)򢥱tO>䫯l/f*|;Q`!O~aEn\}kśU“W6}PԑtOY ^ C0(3(nteV;P^tM<#Va_)~X{[D_ :KP.3f`eRBvٲea)[YPߎ5F G~)el~PzL!vڔpΖe-)[P:-V3Z%<6skr%\9ӔS~3gZ$N, kV3+V|hV;&s` |cP[0EֽEa!Bd~.y 6[`fls!N)JBj( (eo|uGߟП%aU#fh2eMiLu@P$i3_WU/ivm7RIoSFFʚj|N{4c=hܹf 3Ç6ˡ)V: ښ.pdgO;T LP"@h-&{>zv Blt~_m'z衏>(?~ :fݒ6J0@3bN-a{pR3}t4aťpGQ Yw~ Y/fwrvp(R}ݷ;RmWJf@iSL<ॷ wq)X/5dXR;mbtq4:|a0C5k*24tB+ź6^Zf|J0|&̞f)3T6; #ԦGRQiCkf -n.(I$s'z$1V:϶>$mRc dPJ1Q~05l3x+xQ۴Ԕ1ܔJRlT6믻ԹM- u`(*?kS_N͍+:ZVC@J^../| z*+l!E/ݿRFGu?7 [NQW_* kBfQ߽r@[Vc=UP%x6Y5GBDuS%BBAal!J eV@_L~"U[WSUD&8M}Ɣ7~o*|JIW^yG<oR>Ԯq78@xաP18l}M *p^4rACS%il暙ɋ#y$U>Կ>K_Rm~M^_}7-z|ᖥ\pALKW` HzၴrdN:kxX2$ZopşvS|T"F`TѣH{{TuZ64 ʀ$*jMVPIG7^J4\7Aify#UBX/">_Y#4Qtv<`ޱ;|s@ :锳 g7O,1aNTV n֡樓T*'wVMkm f27BU,"Z-$7S*Pj3z҂v!bzQ(ćv\q*R։a#6"6.'(Atmg_]_SxQD,r%;mX-/5λ({W K;7x6l|O{x~οk_;ujҤ))_3//\z~zKK@#\ ]iu*5V5wۢӪEx-޿*%~Tjy>P}~ y53nB`YT7Y10)uv} ثF(}9TWVΰjS ~"e݀ҪK>(L>GNOgf2S]~mx&hk)V'm9AL<]Я_~gzp [9'P41/j~ G"x2iG˖-c0oW#W2Q뿑4q3 MoO-O!``)R)]V^ LfqaR~ ;wkR6< Cıَ|);i!^Wab)P圁QR׋bZg lU5 ܯ [5,_gWWZun2/[wWydQVٍڞF*f8 G6Uu5TMvKغ J:U+\D Zڀ!Uv浾\_WrbrOǻPDCLζm*)l|rD WO_KOPpO.$uRYժ&y輭5x5 !s4n4a覡ǂO[=o?vߵf}ĭE$n;S#3RnQQLխh ʑ/Jk7\W2q7:5[rc?x zcr4iI'$W*+?كXHjJUy: _=ϯgh}N~ -_) \h*dʍ^yf3޽;Se]2mp7#3̀d k.Nה+%`v׹wkFh  m#$!M";/$1/v< g헼$~p[lBH }Ev[\I3&HowuuuuNcp6 Yy-"GXi:x|М0ݻw0y[w˖-r(++&!Cd܅(Bg8qN#'IWPuv.l }i}]f#ePV6E$h^`ԴZ 2$KATLg}Ư{y9SVZ>lUݛ:] &l(gOd+&hxRD{2;dڳCaSY ɹ9qJt]NC2˕ARݫFUp mĽ{Ы9!{JFˡ38O䥔b"U~:u9D& ?Afx:;IIC,5|pLꘫHB @"uBO^`(nZGEW馛 eD2 J醂h3+nY`f;K[} uK@4Ytg蓭J2T\%i' 8jtv1="CɵE΃B3#3 "Ԅ։TIEroD@͸{I쪈u/m>JI7u g'?3n(P~V4ϲP+hp.I#r>>*r?aW9&M&:)ugZt0 ZV I'rtpp%+ΨaƑaPc}Ozx:.pu ,@L`??x_~?W_}uݺu'NLC?\t#<˗OPWWgP%(___׿'>ѳgOF#M8>SdǓr?r7 M} 5-SOau R@ϟlĄb:NA2\N&|[~bH 43=SK#Cy&L`p7ocB@Oc̘18sAQGF5kzPl?=D=S'|NڀJ2`irUUͦ iO6kWђ΢+1^B\WUz&#H&6ӞI~SL1v5t6-a}Sc*Ns̏T"r$y].1n_Νo}eYS& 5өp9+Thӓt~~ҥwIoG"4[Hpƒ;Z$$ VW\ן|P2kZo=C M̷̋LI?>E 2v\şo ̥bRt? tU /:$Ԁ"s(0ҏ t~7:?~ӦM8aƍF߽{7kϘ17bFa6Ϝ9s8sd?d^fn v"<]IrhҧX:PP&Bq_+B咄IGߘT;Kw4Zt?p g*!Ԟ,={Z.HG"ymaKe:-"-P\SQ&WzI `9a7B22^Z!B)$/Xc6Su> /־z)HIʠa'< `L ĨGH`#> v'Lyy9~dL4uhhhqZ] PZG^]??|z[YYIcI}}=/ӟe˘kEm{Yɴ)i.5T$˝:u oo+e &tJE\|T\CjuyLI> x[jn7^Q]]_>x}yטƈIRIILL#gB7oTtԝ;wN6YW\:>jB}AJ44<#F\J9ѐdqT(FT iWk*1G-"MpuA"`i7 /cv/%YeslTJ,Me`*d򅅅?>p@L555$蚼_ϻ1Ly(PxtvC 5&uuupMH {ނ GN(C2')'DxpZ\ .;kGFկ>sM#И{_~eh#Pcp$jȐ!'AJ\E'i)#U֤ذ]v:"m '#/&wKύ4W67lЬ WηzÇc%D &I#h O¢Einh/ /++Nm߾ȑ#N!F1r d=b9=ߵxL瓋nVjҡCG+I58ڤ[R5nNH$EP:@V i*%?Jh###bʣoN |>y5q 3 oY8A$ÔR80gkk+vPP`ZYJl='D8 lٲGӟGrϸ;tyW뮓'O;v Z菞yboA@sq`ܸq\v`z~Z~hĻpNmX#!R;P2lӧyx K΅׊.nzӛߩs 5ADɠ=&Vɱp1J3fXWߟcqBSLQ:~oF1IDel:U.kS@WK&@KAqlL&_Z(,I;/œpihG[2>|g1ggϦ_޴tQ]zbLt'QG133.}@ȭ𦌐ýhE.yS--Amq\S5pLWYE^~G?zО&PИx)蕕'NM h" ƥK ] /pՅAo¿/rqFWj75):=ZQx46#%^ݱt;x64; ܏>@ǎ}vU|x/^}[?~ӟvժUK[n曇FC>^;=:g _8mƧ>wz/t\?PZ FBW3bĈG|*# <1=H;iEHf,z˺c0o,= #2/L/ɯyGƍ ]Λ7`׭[G8+Vsy@ٚ2qD\AI˹/sҘ T?C?񏱏y*t-תΟ?pB޽{8q] ?9rH4d)DP9߾}@Txr]L 5o(1NF]"" m+?Q.E,e&ۛr%+kNWp2Dpi/;M[+@ߣì_>dN]|p)r׮]T`Zj~͚5"&Tpud3]r,PEpkcp#FgjySe=xX^^p$s ծ\y:E'LZw`/b_IgW۽X ;-}gM[tݾ-}ݷxbY| N:կ_I3s۷koBM9C5E s \as;v֭[uz)zC0 Jw .f)Ǐ3$DuH> /}{ޅWA4tE{D '? B;v Ɉ2l+++كB>uD"Xӱ@'x;tKUɯ:|˶ftV\htjy >}zXegh>锽x:Kv ʎB8@G|O1+'>vRiwJ?zrFM> 2eqWL6 cSLl(S1r R਽  Ggb2o+P:tbcpI9ii7v'VSC'8a9X2uQÊzW"vy~{yW׮][]] L6fwyg׌7C@O܏Vhin{]wΙ} Zc 7o(2ɸݤI29s.] o߾S:"΂t馛p&6\x@oX^\!.J $%WI'_~Pk5]\E?M𹖝X-t텒>‡=`XKPxwp=@;~>2Kgg4At*< ȵ&?y.IQ׳V88_L.$hF$!a<~/~h;WjVDuAvӻIL)>%ޡEn'fST((.)YTOmܲcϤaiuWt$\c!+Mo&oԩ֭DvIy)9nٸe2a7xi1kM[7Ya;b ;vnͤݶ8nn݆?PU5u=|t'-Gi;{ٲFݔ:} 7mzS*Di1^]jgӷnRQ[D8mfxu2s3fDfSw/d{)aiKe*A:.A S]C^M !ؾ/n3-R:.Wlh'CPcvzԎ7<$u^Jw3 Z{nI dř:GWj^XyDƼ#.sNB9\(MqɈېa{|k]iĈ*TPN/--<߹/Je>6!ۑ]ә_%㡛V&.顁 9ޖ"C gDb(Rдqk^mÆ;s𙦦+(:Nas:L;v4iґ#GO^^^>rWWW˚eC/V0a?jԨqc~:w|2䵘E6mِQ NJ֎˗Ci%*+$Y_~k95xUꙓ'O5r-k1KѪ4"6r=_wv p8ڒ: %+H"]bQ6lXWVQ"+h%rowpr[={]՘ڗ|^P?7Z-@---a6 tDȀ̿!rrTtR¯՟[xP9$ ݩ466yu8:V\uuu@1:os0Pѡj6Y[  0@/;) F\]29.RL '$1= B(1bĈ9*xGjQL#Fxis]iq(G7jco~A^OLIINk7z'y^xaƍ ,9{Oa`J{뭷0o)CTx[%T~h9bڋDBu5㷣m;#l*RNiExUMM269w\^ꉘ0R,T$Vw`%^[PsTk):uX~BY 7J^㻳"Ia?U5niy7"sjk4/xР= st4-I͛DCȎKH2_\;ab :##DUu_$X.G: &)DBܚ94MPi_Q)*"1=*igՉ'  G!^A{7Sf ZF 2bĈ$W ckĪ1aKX̘2A,*NzZv׿Cʕ+~?f'xb˖-[x}ኹV]P\TTTZ\Z ܟH$ǍoLJd̴i}~gT<"3t@O[Z m0gą:GѲohݽs7ZHw9= qy[0*L*+d$H8u;8> &:"}̓lMf2AX8َeݤDy=s|#Ny1#BK@HÆ bŊ8ghf`qE!oe_14:Q*.Ç8pED%C4Lg$P~bb 8ҥK'F9̙Ìc0 ~7(Z&j0aRcRO~Ϝ93;Y(N>*¢YgoyԶ͛"OcɄ+M1Ӗ&Hfa{U(pt䉛7lmolig0FQH"♾`xt~UTZ#P "Yx8, d$ܸi˶%Wkw]/BOi =dqj.C[IhbYY8:n={P޺u+n܈Vp O6mڵ)G4 =rݻwC-I )A5(7eϚ5w1(zv֞xvh5$DF֬Y1b +O'=;h [[ fӮg;>sv{5~d [t…wZZZ0=óg~7r!{#v^z%.ìi&[X֑مi>֭oԀ[WPCV$T֚y{'*%PgO[X˖.=b\(.G*O(շgʤ]gG{ʵg647Zص{tMkNg9Gs޼ƶhϢv{]eD.>.>p$Gwx߉ш)҅]X`\h.&@R]&C"]lcǎ ܹs@Tq:{A>[ނ "4뮻9@juD2ɓ'k;N8AM&CdÆ :X Fʣ\R(gzc<1̜z5dK.G\@!iF na{yyaL~;#Ftk?EXW8^ $SDێgvm긊x0% /vV؈?MZv܉{ "ۧo,ֲnF$OlܲL*jnIzko- Чu7bx.T[S_!O=~L46D*e߷nx2}sؙXjK8kiM,^z0제H)Δ1ҤEFf̘;v`YnԩS" "[c`Lǟwqy܎d]h' P3B-,0dÙO V<pՀx#'Yz5|AÇ?tPg-Ϟ=+ca<$3 d;m,U'ayS)P^&i ?bĈ]vjkk _KCvgO. XeO|*kזcp.v0cZ7oެY0awX:b.4KK.4\(+-ѷoL:Fk F"`bVg &TQ]qڒǖ1^V|Da8P~ڔ*( x*9SPˤe3 /鋵QIdeDoL,[R6\V( #q[3g]$r6bD %N%6"؞={h& 80=|+PkIV~3tÇO2_$>:=9Dp@(ϛ@:C ֭[q." .y7p YGw" g.[iYG+aZB} _yvh>I=uhIu-IP-`Y8t8qu=ۓPl 2bĈ# [^ آjܨ'40h@F }OX0gyꩧ0mֿBb`2,KXL3gʰ?c [" RN!\߿;s1y\"Qv/Spӓ[~lcQQ# Qf4G>62_P .ғ*IJDΩzkm&@Wt@X"en* eӝNאןP~ӟ2D҈wgc@^v-G f(Af %1#S00:ι9'NSWcQ^7dɶmz-ME OF$䨈j44aV:KXB>a՛6mڼy3\3ggϞM\wޗ^z [ނAdE۲5e'\3FcۨNS:-uJa{H'cĈ#($\(yjgw>Cm.--{-[?k\|ӧi9Ҍ.Xt4ϻ"S$Vo@f5:yiae3^m {'kjj^~e\Hc?E;oyP&.&8RK`pPP.@1b%Q@CKsXΰ=B%?Fs{. hB(]%.vMZ-8D:.;lт9DVy!=lG3Y;p^#HHW/Etʕc4p?mtm%,MΟdGD:JGa.]J5oGbD(_q[. Uf޽@ɀ"Pύ7b<<|P!JMѡKuV{ݺu\@gB0ܹ\@b2ȩiqh7~OLkᚷ`dv.YJqdΈ#F|?s>U =;FvCByz`dǸϕeL6SSq? ;W; *#m%}%ǎ"aN%sҞJ (κ|!)&!?zs=3F_b|2@t=gȹ )g d;$饗'3sKu:%e2/=7OQ^ Q 4Q3P\ˢ4~jI jEAO>~Ԋ h ̴% (wiN)̺Z9 %C2aZOhbW t!i'808?1w^ wd"dVdt7g/pC'E*k1YB#YFUUUBw^#RHH̴ģP&J}%WH#OF ?.<pJsJ(Ci@*Dq/X7W 5*h83gK|M_ Chp;rу\FREeq-O[|9NgeZQU|"&8?t`gɫ[#Ft- : 0g3#nLTcƌ1]t̾$ǠɀV.R=~\95cO57ZN}۷*'%\Ʌ{l^*/qs/'arVoʉI ᢢCNEz4m'\C`ڛ^Wycgj5F'n pA'tڽ{\'r0!?1?>%|:08xV 0Pvf¸[_&Gyj'ݼzkɕ^\BΝ; wш#F 5ˤBI.ȇv}9ώGBFY*bl(M˄.:dRڜ0ێז̨b #l/\KPY8v(+^' 6__.={bH/[Vx3 E-r] @-tAt- R"Jd8>*6{2M*Ǐh8Ju8Xl}5@RX㖉-06@cM-QOۍ5 Meg=7f=/s<2ш-D+'|`C9ZV&^ Dz鄛>m i[m ;ٺi8*mrhΤE$ [ݬ$vZJۡƿP@"_z9-뺀dž@FR@yf?\kLN|OO`Zc\R0 PalVV=kIv)Q9':ɍ>={#3 g@aZ[C)E.gS\*oȨD3?*O@ QO.9?;,\_3]NgĈ#Zއ?-H>eӷA;lAm- r ZlV"ʓ{K"0G6(]xI =bĈ{nƶ/( ~dtdq `cBliTD :M&q@rv pL܈(Z۔#o(MSǹ蟲-]z@$uE75,nK1c^ޓ9rDYKs\A^q>?棏>]Z[Z.0wܸq%%%Lo>ۗĚ4B3SIp63N [WW_11\dȑ#O(?fPm۶{(-aY&Ti\vW&[o㪴baCcJ޹s'-oN*zD(͞8qb"^=WBѣGݻWXf nARz;Q!:\+p;4iҮ]L8Q8SSdrEO0&"ֈ#Fn@nҨN%Ƚ*D|å{}{ZtR;C~OPg⠌V. P gTR"ݐl䘕kkk1;&SX2O[㱶x 'RXc c09v ӿUy[WṎml&\W[km޻dk]y߇0O<H{J1ҵNBe/>ӦM5j1c4?~|uuq23,X oܓnxĈ5kGYYq!Jo -{8p a.G = ":3ٳ׭[[q۶mD"+V޴iSmm;0dkoyON2#ܹsyѷF}@5Aivgb!m%(T2x`ɒ%B)-6 CϾ}7|=z?j>}a9s@!>?i$(*:#F9۾dVAɵo˨_GZ}޲L`Vc}kjjaF #T0Ο?_i`(H%z$[LỊL>ziWiY:uxEEE:x (fE~}'ɧ-Ur:H&[P=_:v`NAy\:}HB^Xh*Ӆ ;%o5b$OzYP`p 1? ĉ< HZ D>٧OIF(j_xK~_l&4ڊjB3h@SZ.Y]]a߯_?")PPaУKϠA;&TӢEр׮]k'=kbcx01bFD[,XP #"kcYvW;GC$Ep̵8 Y ^2#,Қ(.(N%(pPRg7 u#)g/ya^*5'EƱߗ2k^ʀ΂*CtIiqKScy-l|,?o=m[Ho% f7F>?z2Tz`͛7ٳg38FՒ>8p$ܤmI9vX(@'Nܶm~jhh! sgZA}jkky> w^S@[zOh#!q9YoĈ#7t;*(H qˮeKcъL{Zjq6sW3dY 3\_YuN: 8AVrIĎIsy͹STy.ˊ 6"5_ωT[eEIΦZB~fȭyG|^Jsی<"2W/f`˦3e{ݳy=qɶ۽?B:x_Tψ΄4&fhВ%K>t0Ja@Ot3g嗕`k_( qF . 50'.xfnmܹt1Be*.u߿l2z~9sL>]?#njnx'@bQЏg1b ( LJ'+AҒm8xܒۀ듞=ͱ3YuuuB37DxE.]rJevv KXPXzf[8p|VKKX ZـHTK~zD-|t0dZؗG?p}8dK _ܧ{/T&7}M}afjK/~e%-MM_pTz7r_^Vpo} Seqˌ39RPZ &`yǍG=:N۹sɓ/^ }vBy]vg075k̙3Gn:| 3!,&?|b[n*quٻP  WUU^Ǐ>֬Y3iҤcN:uN[o2ӦM+V0F1rJzʗ}ch}8yq#&/-_btLwu >`,̺d2vO@9鶩TprBA>(q.DƆ>}$d5 ;¨G:>'o *I>OJSg~8ug7u}m]QI?w GC_y|{p'ēOϿN޽+MEa> "< I\2` `1z&Ё%5|+WĘcf%=?zd@?5^GX>ﻸ09J`(+))Yd kť? )'W`ΌPC7$V 5bĈ#7tq_ٱ?~_~WVVo2wq_gXrubre LD.f8l[ZZ0MZdH{>U\\ { }!e\ |9[رx"-y|+(˺hqMg={FoIi QӧbK‘ңGB[6ll… %eee@iAm;_oYyϗ\7/G&w#2I?xDK 8g3ax(PIBrWq9y9#7?b0v]>:|0 C8ov`ХhvT13 P%x2bĈ#׫t7tIğb~i^rMCmIo:S#D&- Y92Yf'9=C!L83{^`РAD<34 XLͶ3.'=rxF9p*RL[kkiIhkC͒׿_~?я{1:I1ҵD"LoԼ:;T*E eUV:\.aOq9ʧ>O&u ¯Y߉K8`)>QuKE C9b ;-0bĈ#7tPrYLп0SAAW<9Jd yNʙ15~c鵵 J%Hbz̬(ĩgjѢd F:?p'n=*<)*N0ґm3T煦P4{  9+|Iem 8v]Sa %%Lg2<7{n;vTB7f.=‘ j;Jss3}è/ؗ_PB c(.r~01o *Pn.g%0,>-}%p B!Eƭu5x!2߈#Fn@nsRVz'3󁱪9MԄFVqۦYinv U(bEX7F!1&"n-&&n03Of<e Onn;s}1ت^V4Յ079l l__<1{nx.{p ]>exԆ <Swp=[:Wo͹ƍD5q|X|y+_y[},کrӮ ngCn7nO~_>_:t8ӇHEچ@Ϯ^M \9v,8 (B俯̙3cƌ^u‰A4?w$_b_OqM+F !ǚPq'@dcվ ŷ y'ܰz|U*|G_lh*\ KɖÄ2tM L5ezj|hGaT.gkq+e˴0\m2pVX|#{l.Mÿx?Jիf6?8ck~\ɤs'OS-}{uߘ2T OA MKM4C):L{~lв8ˇ?%ثƽF9,Q/)>[;m>FSEiFZ ;Zn)aBbˠG)eOZsKd' /&xps0kcBLJuw),]"jcC㍾m'Ir*AAqA2ib/ jjڱZm劕LIKB 5[Hr m4/(l{w2Dz+zC})]6Q ?V`ʔYXƾ,2Xh &~'TgOA1~L\ $i,Uj?l畊Nٲ)aT*l6}ԟf岓|R̷J-ֶ!80lzbJ2j;؆D wjfeV4?o AA)G[ߐ7uQ'G0=ʥƇ68O>7_faZP+YϋkJ*fC |T_0 #Ͳ\r_&\WjSotվ}O8m۶.  棹u!2(;Lv]]] (׮[O~#&5kVKkO&Z;/ZۺVܿj|lIGҁI" xk~qm,']*xnxae?MP[RM ~C|}ki̓UVlj.  饿R֟ƛ6m<~{9}z۶l2c^]&hk֮s2˦_.†Mס6ar]n}ENVTZfX}&Wh!al_|jJmjxm =亟OAA߄&F}smXti*kBcBhl q, 5z^zmB oz׭]!/o߁LvdJ:RUUW] K}2tݟcm1a?LH_~hJAAC[GfHѫDH? Z&R}y7odښ5ka/L°VsiG$ pHƱްLC #VUܞ_Οͷ-ZB\t{g\Y﫬|g軵*}ϭq}"z9ZCAABK6zG, CtmIrV]O:_sl[ϟ?wߝ7o/FQlfP?/y칒[ow->J1d3 㔋%PpbWaYVR_ۢ(AԆA`E]w]:@ uBqzU撟CO ?' /?+)YG_GNc"2i~ 73g΄PA 7 mt]ߵkv8Q!6Ieww7|mI}w޽[Yf.\':x={nf?nV<>>lPO6mѢEhE.H|AAAŔəZP;h/8\*ahI: nkk7ȔLPAb~WPc*@胲 {uAC{T t<)*>1S![o5w?N1~eU ݂ x7Aߢ޽{Zp.*`RKs'_  bHrUW_a[WԧbjPq`d:hk AS5駟9}4w4> 5DW_}c"Gu2z 1*;6sL9 +cS Bmmm|$$o.:!PN4ѿ}Ofzg-[4  &'U=? Hj΀qű@XBܼy3T_>޾};hu֡7MsΝ~ax| GGຮmەJj0H }^~:p_~k}!Kp#G@L|1?ņ|  Ƌfg~:P͉U8GRAM:/JLM]]]P R >|TҥKACKc 5˗/ߏ=L@qr1z) H7tQxb(Ϛ5 o? E^lן  bRq_%GYOժ.k Dž/]n 󩧞۷oaZڵkAdJC6mVá \ugEѣg^`ܹs{=?pѢE .|7@,1˫T*3f`D' /@|94Ѳe^C 1Ex`l2<:xl |+Wdjw}Lc%6>.ٿģSs pc(%_ }wܹdAAcGV'Ykl _  bj]iR| |  Ƌ&OB 9_?d AAS@k՞>O4%}O8m6g%  ."T68†7 _  bHөK"!_  $1!_  0AEF(J(T3Sl$ c&  XU(nDZa AC!"a @a˖-JT8r0_11 _  bjJzUؿ s. *sArb-sw{A AASEB IdDr?QVCۨSNfP($oߎ@g\c6ЖL;SA R,"&5Q!%T*P"  j!Qb<$"YQJB;mg:wϾM{7CY{?׳vW'_+\B!.sA_lYjj*`0;;;4z̙3Cpܹ^z+ӁDQ]!Bdqw={.w7nXn+VpڐN|P(TPPݶm[SSWWWf$B!W`_we}X,`/^5g lhh@㩨p83g΄b$"`۷o4eu \T_!"Y\ KN|u~y>, _b 7Mx8zf:}$B!Wːppi.C=^@e'~޼yw|sΥ>[ZZRRRϟCiii脀b$zJw?3zG'L&鉛+&anu<;}B!IV%=!˙x0tX^V\B3 Aagb?]QQ5`0OvYYYÇx͝bw$PHt3Zmmɓ'9rdڴic}s,?eʔ_~eҤI,G}t˖-w}7*b!{* 6hee%&LF{;}t\hȐ!΂? ŇvmF=}bl !B$k]:.Xcb'ݕѹZxh8qm۶bsc3gڵ ^ίMMMO?HٱcbL0!p j8zg;wD$!yyy==zUk̏x?ܽ{wމ}eee!ހbC8p~ZpJ0?[B!¶K[Z*OOv"nÈSNwA1bݷo_x97B ꏯ} ;?<`. `ޭЏaO`OBt-qÇ曛< ꨫW ;y$.Ľx<&_Ⱥ^vK/ė4B!?6%O޽o:xp8cp:̷a7oFmݺ{n<}v8:z89{˖-={Ϭtf,]YY e?v?` T[\?l0D p\b?.qFb|!##]&W`]Zkkk!B\9k܆ӑDO F[[Co̱1^]vmjj%K<]~Y^^dʕ+˖-31g|? TB'C~4hPkk+B #H ?uTNNCV'o3Ϟ=kB ?n)S7 !B$k]sT#5'D‰q [Ec  /"?p_~~ҏh2c'33Ӫ/Gw^\fK 0,-=+'|BF"r6s#-Q]!BdqpN+ٵ͔͗^)bZ U;a@`հs2iuڵj*KKK[/F"24E'tE5:1р8p`ҤIyyywu׾}ayl;m+7֫ !B$ [:ν{_c(k͘KYYYO>$%%%Q;k,|QQ_aسgφ?SnDB\眐u_3rsCz߹saf !`8ra7|ÂdT_*%"ș3gL!BC`anKgm4WЙotpM.gdd&?k0z0׭1`WΆ#`q=/0Z?<ӆBU jE /B,zBTa&C!|6'555!@8:9mi9|Xu+fxF,dUz<3ȋ跪qHc=dVŰ޽{\>Bo諺B!ɢ'?3_m4t ٰjȷaF lVeNѕ~? rm)l"׋d6Qnnanǧό#º?B!B+z[@0 ~0m3 a\lj3`[?Aa{:LzZ;fqB B8?K=M#68B!H=N`e+9Zbi\goӄmw ].ӪI(&}G(2LQd?yQ0%/B,z$+rwJ?T/Z#444櫺VOÔ{X)>5i+M߸t`6k* į8Saڿa>[B!H =Q#n.!4{³̫ BنUr^$u9szB#Bt˂nfϵy.Y-Z(hx/ !B$ )T'&9sf@ワO藔0cʣ8** !B$ '. {`z4CCǼypQyUS$B!HRN.\?>/==~'_0ˣ(| r%P]!Bd![d^wÆ ͂YJ˟?>yٲe 2;H$B!H6Wxק7wP3fttt@13k,'"$`m7x#?>oɒ%P_…  HOOGê/ !B$ {wbǜx[8=R}ii){g͚5x_`FF:W\M.]ŋuanebYXKy]%ֳ6B!DRǻQ#fKS)i[eY-tr(%%FMX0Kf͟gy]>aRz-ƍ&\sw1n$ S! }G΍-q.{U]!B$a7Hq%eh4C푎hSS3< s+ pa& zB>߇dPiii>}7Y[[; s~!D'3X sc`,NG@ 3UoUUe|f6CuB!m*6?Ozjg9s 555ӧWVVN8vw}|?0uO:uӦM{/ kKdbH9z222`,χÆ ;q ~̘1 ƍ@w\NNq !B$ ;WJ9SP"=lH局Oss3333!\F>01p^΍W^aH#JOOuᦘ?qcǎE"|Ǐ-fNax*jkky-?YZZZ؃p3ԩS;|ӧO~ syѫǾR ۷o~~>PEEEdESB!bg|2 Gqd6p1c޽0_zN8aތ*R9~xf@s,"0J?5a>a,aWT_!")V>B!񕕕\џ?>Gz-T)S|> K\–B!Dqs8sYgС="r߂%K0nŋ3g B̹_tiSSSii)Z*l5'' 6iD":=}qѣ+=BرVL{!\]va} '%_'6@! W^nz, 8443pn%f.q,s9 u|bLәڊxua nkii,p)Os^)T_!"Y8Ld㫪(kjjo8q>++9p}Nx8!ЃOT֩zPy^ToFM~{^pf@mܛ+ިB!D2^XJw?7c8X8_!0x?_? -0Ghp/Fg@Ԅvuu5f8p t"f`!we?8"|Y=B!?ǩ?LCӉm"<X>Q*ק[qe@ c؀&G?´"1ss3װ D(Ϙ0~?b\Ol޽EE/Baui$vYku8ӰIX;3@Uy\\~1`Ê,Cẽοn^faPQ@a`A- [)K-@ bbbL_bLTYy5%"T7l3,==ݷ;}h!(=-{9{99)-]JǧӄFϧ?6 8m6 hСCFD"H$eJ:j/~¦OX>mWus]ٵ$]iÚWאxg>eӹHDNfHCTn״|s,S0P%qE"H$2؞:=>w7b{2dHS_O5#$H$D"Q?F|~\@Lv|>d4͟T~>Bz`Ϥ@^UW_|E"H$DgڗvWO|NM;b1? |D@(Ax'ĸ0?f.%D"H$:M{ZRg 4766ً n7b)~) #ʠ$H$D"Q{=Ykߧ{O̟v矏D"'H?CJWtŸ 4iÇ׬Yè4H$D~~~wi>uY}̀bՍۀJ1$qE"H$2PV%%Ou@y%C@H$эBfYYBěϸ$H$D"Q4@ˊ'U"$q};㎹_}\˄t4z.v6;㎼<"+b{׎5+=h`"mmm=&ŬǨC.E13SP?>]̔^T`"P-4)---5ꨁ0s,kJxXkxA`Il'F6OD"H$eDc[Uc|umៗV<|]GCFIwy'[r7xn= ]x1WCsQ0")ǰ #؊A^ LibƩ:ҋU!3)qTQQ2A1-\WAAlҔ5${DBF#ݿ?P9>*57訟#ZDB=(eŲ|lv*Pa- <"H$DQ?Gd$<0:`( W40rJ{w݀ײ2C+ @Rd _|W_}%\2gΜɓ'/\pرJ3=3fձ3d-5SF, mC~$ gV*@"\6+?|p\NF-Q0xDx ^Oc*ǠgPUU'|!9 3-D"H$ʔtRXJo[  z `Ǥ| -'#C'L~7>tڵկ]bADs*.jq@ ?sdYX njj"(07 ]iF"d3Sar5j>_isbfHuA@`BxDwa t@|]]M&Y9Rx#b 'fe$H$D"QF{OVuG=W{{u;}Y1.%Rn7|3rZ wy'RBp?_Qg*ѣG֨XHQ… /䒥KyQ\zK,^sA>˗WTT\tEpxtz4O>ٮ8L 3g΄:RF,-++[l٤IƏ@ɻzԩs-(݅4a3Уi„ S)G ':9rqliӰh' @zɻ8ܻw/R_$D"(#)pb*/7?N~*`,;)7eG;t߾}icK~XzزWoYfmٲ+o۶M{-b"͛7cO> ۷s رg\v]6p|8 5y٣41#-ԃFq66ll7rTCv|umUVVN/D"H W[ӣO? ʍvY;s; b.//l>sA=OuAk׮}ի샆o_רҧN/T&6  G~f 5=,D @K@Js. P-(p2tpaN8JK{ <<+49rssI[e̘1I-RӋǏ¹,n|>36Ҹ9) 9c cg`;H$D"SGKO ?G]w\Fa%"'mrIbV)K=ٲe PüyXعs'૫ZT4ظq#]x Gh  <>p1vh2_d֭[qH'"kaH9E僇qXG O^wu?H$D"t4'|i9s&?#F%[NigU^C~]9D(EwTtFKp*@?'466 oϮݻwAHG̓B /uQ><$v ".rx 9tB`9(sBiGZxFDj[QQ[(qE"H$2%A..I_?Sryy9CڃJ't7,J>y4J)  4kBX`10N!`zp,Q3 TR i8}q/H^3)=|X'-Zˡ޽{Ǐuuu0W`v>=PYG `M13T[[~Ȑ!8[\\ZhˆS$2+VD"H$N_]Uw}}3fY^Uc e ʲHd9,ra"2*OЧNjұp TKKC:ΕW:@63 s)ߠ,N~(voܸ71:p? ܏-*A/W{}ԃ(u43YK\H$DH|l=\E&f}0P#k*e:89@[%PS{E.g(ͻ8D"NыItʹd(R ɑp9R88̌6yGX ܇;KJJr4wCa*քx7v{ZfnJW[?O 6 ӡxG@@b]]ِNS:t(ei6qGJ"3fS!!Vrs X2xbK3[ &MBʚ5kH$D"H$:;m;F9|p[[[ov˲ʒɤLJ3,_\|E"H$BuT/,WY1}nW]V041aqV2P=c3Dx&HD"H$eJ_]+mo *ןT>o=HDB騌ۢ-&'m$-CV}qُʲq̅@x G"ƃZ4NTZ\ꄉfD"eQ@O3 -=L7g`J2l!%awS $H$D"QF5'\v{0R99ٶU ٪5; :C`Vq`b'@&TpU$jk}z)6mR:vv6tBYC -bؚ`](^ D]]]^^AL4ߢ,MMM,CFDP',?heY\arm0hp^4aLEJD"H$eN6Z]sQPw;I*q 3xKK >Y80w͛7aZŶ<gϞ=s=w}Zw///![2dр3f?z(UUUSL1bҥKǏ*<׸=sP[CCIa30.AU #;Uҭe̘1"G*DJD"H$eN]Z)O$rUs^~gy/֔JsPVV"p1-$gO,˟E'3 <"H$Dʎ18zw=yqSGGu$l? h[[#<2rȝ;w5]/˖-v ˲999xp` ^xJ;s%K\zJOQ`A 8r&]P^iB;;v, Ν;[=˖-9s&J0//嗿;lP!C1eoG" 5ŋ‚I&ȏjQ9_Bc> ,..`NQ'N.l۶mD{xƲ2|s=7o<@_xᅙ3g?~<n0:::aѢEþoẢk%ĩS,r7nmoEC%AwM9 ā>JZ8dbJD"H$eJC ,8Iߗ1b}iCJg͜=eɸ|*}8%:thwڵk.\i&0wEEE,'It0/Hz=edC:3(EEE !k4[e2x`Ǹآ̳J{pi VF0 pьoׁUVVøGMo7M$D")c[N+.vJ&b'VLP`ܯt8݉t&4|0lذ͚5;cԩ;wdN -}ı܌p49fq(H:8'z GqQfƶ矯ٲe 58!N-$@)pĭOD"H$ʈzqbV 7{>p?k9|)oݺxTa l߾}֬Y"zqƩT=GLأO}|g]vݻaܹS~*mp|0aw^땕0 jkkM&J#ꫯF H$D"gDgߛȫ:1Iomȑ#aϘ1B~)W\qŋ/H!NX$?ӜkFQ%FqFs^C"׮]l)裏 sE;M?z^z%lǎJ; AfD"H$ʔz`UEJ|jilns?^߿9$Hۗ]vن  ~vߠK,X+s\pcT ';} 5 bF>J;(݅46݄8O-m5c?''ch'JKKiOLWEzaaѣG$H$D"QԳ/VWw5[W!Kd~vPN]歷G}4 ׿]y۷o[sF,RLF۠t? H$+H' #_1&0t /aTc9hk sn1 D64"vb;---fЃ<!rE@1?!ԤIfD"H$z|PyAunynɎHz2mWUUyfvoo> 2ɒ%lA;wnf:C<GPٰO9.|ܻwoii);fg3,Kq`T6è@ ;eEYC"Ho?ϽVHWF( |:V;X1e%|*j?~J߱ тswwe1׵l?NE;۲C)S'}Yqի汃K>qH=@1 `/i!˓p e e)Xc2SND ĸO>u]gcD'_|dHr~,LgEIzw ,8\ul5zOS?V/ ˟>;1uB??W KxP&~zewWh$r/~++=[[[,[@ot DQd$VCó?NgS]P\tel[%Eԣk4&p8RZ㥻&1o;<;]SkqQ$qEg(Nh0&eDuWz7zU"Ww/rcS4{i_} yR}lYNBcTMބa#E;I\љu#ηHԣ/V׿&f^XgRJXSK|2'^]篻[ےIf}x0n_`?JDSD?pHs#n꘿l'%:U(;^CF)RRul( ɗԛX}'cWb1_b\AM4k֬ 4Q?PSSS0's?q䓾BOG>h7{I+^txYzɳ,+'#XL羷6_u=Dߋz}>: +UuI[z) gY|Q),,ĖϕdT'H=a_:)DTN"lo>|xol¦k@42KNbh4{ǥ)++eee?rvD@zE7:tNAQo)W}nŽMGe>zN75S:~nWC/D9@V 'h~M&~ 8I`|2Ư8 \W^^ygg{T@3ٷ)0_$Zt f=83\-rg6ccp`.хK6.ET*8K8ťLVX/J$7QJPymH\ ?Ç5|UUj=saÎvA&O/r1Jy]_,stv> 9#*[zl2>8$dv^MV-͎b$eAPL,Sc+!=Wx%,)(.NX[CIF\˟Bιs⃂_z"g?>3G^}UaP:LCf`:ADNԌD1BU(HTir>8tBI-4 P1 `3o~%"k/ &HAqlz9nvn.~qNs{ݭa5A35~H̉Iț (+Ez*_<K"q0eI ϡ܏iP`8uw>۟$YZJ{ x4/5vϳ?*HꪫȾП(kkݰakyꩧY|뭷ݑ N_vKsgc5F{:G[,BN!~$Loŋ/g85}E="s؈ǖsޯiFZI#$bH{IQq#?7޲~oNdDᐃM5lX0V5d>봂^ȳo׾卷9b#l㮯3FWo v[Ui^/..&@,Q;=zT(v18߿}<>Rڼy3HpEāQ/h!FN`_ò=@NHSBHvG,e\<=㏯XB=2_L|eW _74D*=2& .~A\b[#}{]ꊆ-T4|Y`JT{{4Yqi4'RNB9*ٻw5 VAA oiQg~UVBG;Zߗ_y=[}<|E:-۶AkÇR_z_=Q9aJ;铃;HWԀlvΜ9vRŗ/_ڊ+nڴ  ͛O#ϝ;}`oذaҥ/Ο?Ȑ!'c;e䬩Uoѣ&1%qEg"LE;oF+*) S s z2*;]DZH"`V\%sl[_tv;?k&D2/[.̪fUJ^RB$s}N*Hr㺉ɤ}T~=wɶH{Vv" P(>Kx|;Qɲz@={fJp6a0_Q >pƣܬ1cƀ1b*yR{t?ٻ',ߞ[efU֒UPU8v2n`4(:3Ƅ mCkjLKK D(ˆ4, T!deV{* twLAUDr^J;w=k[8oib¾}B M(l$,q}ݟ}wa\p9Ia^.!oV(DÚe<ϿTmo7uD1d1g^V':Ut"})S@O `ѣG[mz+Ubyq70q%{Chc3.]Kp@X&`&LAA~@LTPS"Q ch3(R@״ʢηH 1 /)+x.f-ɋ(6zD Kzt".rK? Ck/ Qݰ=Wum4LUlBi #q|7#B؞J9B"w ˠ:"kE_  \6ӱtYl2eynPIJó!Yuݐ*`!]~G`KS\]+gzimsK?2菍CS->};|C]W]ې2OZuE2b*YBJb&P Jb1;N? Nx,)q ERFJ1Aܓ@9(&ﭷނvA( &`:VrC1VhժUg Sr (h0NaX*e`U$̟J¼!Dpʓ^f #2֭ھ{R˖-_|90MΚy$A =`@ǏǵO~O)0QP:%KS7;w.ӏҟ~zZ'q|Z!/\pǎ:ӁF*>¼/2~|OG|bi P3/@u%_/\D$"z Aѝ.拪YM]SiuW^ 5qoH*\5E RmI۲!p?FLǗ]'Zo\Ue\WԜ.|]/n'^q tkat~I3#b2# 娞hߪR>Zz5#ꫯ6l`&Fn Fsݻ駟&b."q!<%4~{7={Wӭ:U0sѢE4HBX-0ڵkm> hKzF .O џOnE3v(҅$_Rk*^Hࡌǚ ~F"r! ~ꦩ:}[,Q3'Nx<5ձlFcǎQeX,ƷnO8q 7 8uTgggww7DI:d2tR-v411 _zT=,PT5E }c[yjHW5sdp$hlQy޹Yy^I"8uٔ L;3P21<1>GȦB7UDɽյp&=r-* Rc ӧO3]RQޯJ "q9V_`y7 ԋU,ҥZܗD_s2Da,+A4 _r /iꆦ}'PTKR\*aSl4J"p?6. ~MpBBッp3$lvڵX[D)pD.ޞ,#)T*b%JK<`2-b3#t>Fqp20l2e\^ #4L+>JEӊ&A]:>XoUxf24ꫯ2Qi5!]g?CIx@b|\r˖-COWnb%#dԎ>L "_|&\y:tt6szNӘ0nBHeɒ%G ~_s5l1R@"bQO@G[H\&lW(b^˭.5[vZ0~hX9Se^s&?1nhѢm۶u:s{rm߿mR֭[qGyBa7 ={v^_mv+0GVLW翼J`02Ua;35Jҝk=l ظ6L#>/)6pbgxȱuKx̅:(TZ j ń (2ӵyAH9Ru|D!t RK J.D?RzA¯< xB jɹ%P޾};;s4C;gpdzg"7" $j2$H!mNc{gm1k=%"ZS 48x]GGɓ?x<+7>t/6o SnG>C|ف 6_wof[[o'ٞz݌D??}w? 1b[fӿμyhLQpYKo]o ٽ-3O/>8hÒ:uGUUf*~2U(%OɚH\.`A\R0Lh\k&(WP^ 2~ b2e d۶ | (& Z!%C>)SAO ZF?jqrQ_i@9PS22a;}آ>;?>T93+W`, }6~kVw/4EU=WjUy}'O0}B.|$ /^ 022JH#744f!hʥdy0س#z#ZY^qŸϻhNq{?LMKbrӧCC;1OS=[@ ֓$O^:X!Ajdln59| ӆ}E Suh>t 'pO%?ޟFܶyCUPJ IMˉ4ejxȓ27BY:b-+خ4>b;[d2Raמݫ׬Gj+ 0O$N9с m;N2r Mύ("`!cýLWZ%a[7nTIuD-nZ-RdtUHΪ`LVe+^2E%uOkg!MBO¼I>&C%|rK5ЃBUmE"BПTZd&9dZ0H?Ix{M~@cG\M )LVAldzH9"%s}]vn3a.UDR򊢨M_~=^n;wL$Zuxxx"74[0X.ɶ᡾l2mӚ?8ݛqt$J勓71=;OS](Ne_tT cm^VBv;п/=BP 0w) ۰q&#H>׌hZ>#d_F첣jzWô~߻woTzku+|xɓ_~D-c:Xs׮TG=M=ٞeʪ heD\nb"L_pO ]#Z( h=fU- ? gdNGS3zzܼ0I_PzjzA.2qW-ۯh@m ctJOjSXтG{8nڻ#rE8\M VW\FGG$1'`+_.ZWg~l{'GV|cNf^\cg2gK.G)m$.XR>504ME}Jf,J^_v}{joL#9t%F \֕*Zݕ\?O}_kaXn4q:վJDa+Y[X+LKJ(U-޿cP_z' fPv>6 TXfq\1&x?AZ [.v8%r۶mi wU;tqv3%R[AUZ[*(~p&N2=Ft`[{TK.Z UŰtqZ|{lf"GZW+}j2 }a8Or+/+R}f.gOϴ.@j+'ovp۷k޽t[nG}t<7k8QR$nT'rs !Y Y ) K4_z.|n6(Vo'ŊFKMZ txի#wGn|,|y.V055588HѱV #?9p?S lֻ gr]<%B(+o:6 OWҴ D){RY,:lٲe`֛gjڽAF7[iŪёĔe6" V+Bhɖ-[l=&PJNOגW*(O3IU2%R 4U!ÙNu~nO'?%S: 6xmۢ(zwEt)`Qs| ݾ};k`8W_+ЏAA= K̞$i4~qDgrb_+Xן1 Y܉ u\764i.LjT+ɔc|[n5#|rx93P {)dG'W`˖-[ d~:1fuM5-3)gb )ei+Ad??8өN;9otţ}ĉ[>|Ok /|뭷}^ve߷o?y_wu^{ /-S<T+[l^4+7yg s1XSO=uUW%}A (8h/%\w?/^%~qwoMC7o~74YIxAI0,_(`'J#nǫ'nx3/RS<"r+z+ }ci]c&$1rl_Y HTX3{'=pOE:,S&Uʬ74d yR kӖqliVM}ÇA.oTruh|`KZSӏ#r?6FA#?Q[?* F3@9Ԝt}lbXOoQsoЇZx}L#2!"JX(}Yw><{JBfȌΥ2<`0ZL 1Y=%&L_G3"n[/`)SM6Tl|Ce^]Hauڳg3<#\='| ?/`c7s{X/kn4$\r%ktt±;8 вB^Ƿm68꿼Al:ЦePKs~H"]PipiQ-[l] W=])ШZmqC]\vK4eIp~dLmz+/NZvmկ~_d?Cwy]vOMM=7tQ5w޹s]wc_/8yK} SlT~xpp9{Yټ+>%YK?d"=#j, {BN~VDVL%ҸNbA}z:5Xٲe˖LVNwQrrl$T_LT44T#98ө:O g7)ak{)_Tfffov0o~}Q^t"$֎DCs ?C{XQ`pWjLKW &''IuEK,jZ۟'tL&.1P0ؿ#gKJS ǒ-[l.JR8\֥*R Ҵ媬{*EqK0g:?%u$sRRd途A^R_zwߍ;;vO]8^$oٲx_= {ݻ5\tE4ڵkjN'I#/7/Xן1Dgv^iC MͳjiƱSHUjjl. P^PN"\0M7 )f6n%&,Oh64K(gUArORJ|["/dܝ;wqM7 7w``>p6 TV)*gA$#cW^yWľ}hG}p?,h73`C 9N2C[ՐNW>(M{QJo'2 rF[D+Ylٲe2koi (ߦ:vY+TY!O *0 JګJ yܭ5' 串܌[FOD4d=y r/`03L۠0?̌}ZU({&J}7 ͛7gǎT`0 Կr\كl4ҡj@nw[ןs `0 Bqoo/-܂7n'~c H?|$I,۰aí޺\ĉ+W$]xb0+`0 rijkAkAS$+ݻ3'eIt0 q=P$I:@fT8Z)42h/IZ՝e;ei' wrUUg} $$! 1 D PePTaJ B/&"("E% Q BP$< s}h$oWf}p}^X=_B!QCDB1)&CsCO^:[/MࣣW_}Jr ommE}+s ;wDDG*b1a]=a?J-Z$ٞtI|dd$'% q !BjEJOi1JYvҺ_Qn:$3eʔT*;kV e~zCʶ]xqw]{…J{φ |oo/F%y``@Ch9![l/ RS0?!BHh ?W ?Wx瞓S)K,'|RMTEK<\6qiٲex{a#B!L| @wwtT^YAfL7hht:->7n_j[~ߡ{ yG}T.xwK~YOj X%d'D(k(}.رJd- @h>k,*ʐD Iu\ 6(k{B!9!-˪PE"*bD<b ̓8㲝Wv]R7 Dx[=a-+(_rechp70J Ѐ1S40 C ]Y}D}YF+ܺu+[[[x WeK107-4$_k̙҂\B!."*= mkq~uYo|RynF/]Tvɵ^ fu?я/03 $erYǠG>r3gD(>'?źBOO!R+&d4><Sy*▮NxZ$5]wݥ'Dիq)(+TEv27tyx's~Hsǎ=tww,Xpŋ?3"Q],y%["zJ{Ȇq !BjWPD4 n8MÈqnTd=6>+V@[C}" 7@vm@UԹ8qFIo:yGA~i)  SOI9:׿? yYFiC^67j|<˸B!FJ(WxWF/ʉE"Q?{lY9v0 pKr\ >JF♃ Y,1@D ҎY6#dsq_oQb7tCqϟ/' 2~)ןB!V4Ho3DL7%'G9Wz(}[W!ϣ*J$lVA/=|J'ḂXRM"F/0?!BHMh(}GgT7f:?1-[&!B+JW*a_ΨqO?m B! 3m:ԑ}* }_۶=:::<<<B!=d⯞{ ?_O:-O!R+YCOQ A$@@ 'B +pv'BwJ\}<>?^eߣsq !BjDnԿ)r_.~r@b~O驿_NR-8#LFJFGGT*II>W5% /ܒyP.ðDB:c(2}tv.ɠyW %#0}q !BjB|߆+>>}q1T(xksժUh R;Nr9w5k,͡!hw9c Q\(]9 MbAx4M\ør1ރ݇0_:::=:?IJe7B!_G9RzX(W~d 4!^ǁ~:uӷo^Ҩٺȣ$&(*xddmYQ $8##Rt+x.ɋ!GaFÏ1y~<9Lܒ)$aq !BjEJ(C;||? CuVYM\.<+{7w\X0EG"H/j6RWkDqD@K{50Lݥlx MBoH oH{6IW/\s5siii'B!W4R<+(遐E>ACCN:fGGd=8ЋmnnUZ^Ά *?ۃG|@9&.P&e\B!_f1oT.ZYor9hz+V@\ZK.˗C}^~_s5ӗ]vY[[UW]^!^655>Eo߾ڃ0,#Or\UF'^w'" nK-7FGGQa60?!BHhLjOlÕMJ{C߷Vu։ u]J+Pʽ:#:묓N:O<$#[g2T(a, ?q #9ga@N&u[|0x+a\+袋ڇ O!R+  Կaʒ3v7xs="׬Ys 7 ݼzkʕ+򓟈 摁moo߼yO]`O<zgD7vXY 9R #iN!ȏtI5Z/ֆa)tvv"m6XF{:A?h(q{{{#B!- zsJ+'~P N PC/PV+ :%_,\a@_{P Y1p 'qr YYd a_σBh"O>Y11:o<9Th;|t,_?s\;#D1EBݢY\P iӦOyI'9 ;ꨣYx1 }…hȓWoؕ?HeoC9q !BjD_7+Uh v #48b-RV¾zɠ{ʥ "eewߝ9s첕@?Rt)>묳z!hh ')@?Cٺu+7n(*!Hpgyf``Og@;쥗^c@C}k_۴idX)PGywD^ a8 1=0AYf)/gae LީS J?;GCyaΜ9R: ?|9B!LCoTM%smGvE#A  A z7C\_ =}Wq^x!^;=%}w[N:AsNP*:ݳ>;nKKK.C\Uy uOO ( R47:ny =kGuz-jUqN/ 0Yϝ;jl۶ 6 f7cƌ\ <ķ+ xAYdaQwy񣣣(yB^G(Ljë@!=##4r܁G}#<B!! ?]APj2uhRىF빁Ģtö"wBK. cw訖Nï R B矇jOR/F*J4O9k׮]ӦMC^ݻeEeYJO<Fb>䓡!O;4 ' (# l"䳃Fٳ~m4G~IuwwCCP914:_pqL^xAl$9C  LGw1yf$0`T2B!IBcn5E e6"xG"V\*'Pmmmr M7tz뭸uwy?O 7p7BK/gX/:UFW^yE 9zKvCj:XǕodcFi{ ,000[Pc|PR1,[T;S/*SCJHg]a@i$~As|~0^;@9#s(@H1Еl`\B!Z1᥿>cȎAgٚ/~xή7hMJxK.–8?]v5k֠&Xk)BJa__[]1D$_^hܹs7m+֭{>z /|_}ꩧ$yqŮx?ydɒ-[zDm&a`3z>N<ć~X*?C9 ~!9  q_}ы/(0]zzz0^z yLڹs'BsO;ٳg_p=( !0x$B!Ԋpx& "Ģ/d6HR*U)QIXs=7N+z.?Te0'zλ>(.5b'@+e'D͛QSC5r< yPh~zqΑ3f@_KTC?(#A/8GFFd=È I2qYf6w}b!W^yP_~Zb uy+( $sO!R&+[Y#t΄a]vAC}&TTl3 S !+xP Buz#![҃J"|ԩԒV. %Sݤ:* zɒ%xF\.CÀ}2PyU=g7[OD۝;w#T@'a$$ .B J!B /?=?vڴi_ס8?EVWZ Z-'."{%HO{{XvdQ̐DO!R3=@>(+xR"ⷷV׶@s]گFt?9<T'tRzYH7@/v '9.dE;222R-e~$ʗ}09jhh_6XD!2Gya9J)?Ǟ́s&(z_jsp jn1W¥f!BgBO0?L-[V}P!BC(I]øB!>Ӥg\B!SR0?!BH'u B! JR0?!BH"u B! JR0?!BHM'u B! JR0?!BH4kןB!Vp5O!R+(I]øB!ҟ5O!R+(H]øB!ҟ;O!R(I]øB!ҟ5O!R+3M'B\=%u B! JR0?!BH'u B! J(R0?!BH'B!JR0?!BH'u B! Lq !BjWOI]øB!ҟ5O!R+(I]øB!5O!R+(IøB!5ҟ5O!R+(I]øB!>Ӥa\B!ZSR0?!BH'u B! JR0?!BHSgW^?Wʐ*xU2 3d  RPdcW)gc /lJ$>ٳfږT~ʒ'B<@{u)b!M0]oHM6)-'iz1MW&T6t@M7%S9Qy'+2q  hhmI b]ڰ /%*{B!= ˖Q6^wBh(Ze"=IeDme|JG@C'W¾|%jG+?_[:d(Mt+"{_\fGXYlyP}eV'JB!L&ht3=hKG/k+&AlN4iy}ZkFb?T}L:A^ ~~=<-={T01Qg&7 읻voذ/ R)|B|y B!c5Ѳa öT4PUf%v-ϲ@^<:6ŵ2` X~((1_$Vb3I_v,3LY'ϵ2p)h~mF=̅)SL2e? Zu0<2ļ廾2-& @y嫲gʟi{ڋ?:%˞RFC=Nzv%帆ן0SɎB&OtLza̜wrtJe Ա`T7?!2eʔ)SL'C Mu112Zʰ#Nv#ko;1$$ix "ێX_\mQ 嚰!ggXQ4U~ o"],dl-HSIˎ`2M(31|CX|*~lD"|>HMMV9qgovKKKw~ߎE?+{xx8H8ngB!L2 夢QF2N՜sX.*$*^Ό9ٔm;N)m 8rs*T9 ù}RɺO^$Kӧ es#(3˲Y(@a%m~mL~LZvh/OPX@_ϴѭm;oX.ڞ6 s|)n[|>kY>L2eʔ)bZlfVzxx%=6IV1mvt |S^g$k{r$zxR%Ko5UQNhljnd2D+&I6L`u>(`uFƂ+ȗM1Kv?Kή)3HP( %?FP2Aϔ)SL2TQnhlXʗD~jG ;Q3WʾrkRي)뀃J+2VЍ|@`/}B}seS#XSj:\:TVۢmq;Ŭx);J:*ަ7bJx2\$L>c$CB!d2*[VwtjLO c=<TmIkڽn K^ir+ɨz݇xV-v"l o,ˍvvwF}0!Cn{tu N3y {kN5?gt?\MJ}? ` *P7 %X.  `J4ƀ4<S1W F(4gؤO}>yieUY<<2 n΢'@iaNRc@Xն¬nۘAiSaP1VcﱤeA^8 gkWtkBQk 4g VmYNZn zK]sNr+#*' l=0LXo.|<ޅ_r43bE;?kI)}j6hGl%4t2`:w`W_g(xSV 32O~zXnDCR =#!V وY5.P,Sg81 =PsѧsX "CHY͓ ْJ+1wzRe!4c=ch{Ak+gFb>fjN1̿){fVQ߹hp 8R-ѽcڰUQ -|ۀ/fiV!4JtAm,>_U ']P@gWV\p(evl:W^SiPaP1M2f%g;:>"w roݸqb6St2ሐ-܈wpj-ΫgD{0w_՞;=P\\p510tgMKpYݺgq,ELf xy}XT.Ul >"?䋗oB u6[o\/ X[#6(M]x1 " CVp9,4v➴"!ҬI/l,ppZdԜ` eԺr}#{Pt)7aGE%?.Q"p=#?($dI$KT7Mʜnݥ8&"cRB*t\~4} t:b 淼`.DО-ٷ࿟S{ך;Co]9] ݛʳ?~מ^>»b @ċJ}>C 4=[*NXY6=sKjңZIɍm"QP$7FW6r>) +9rQ O' xKKbkMD}]x[wan E-0͓OI [kyЀ"++\چT{5㼟uH=zjNBBqYˎS Ƶ$i+>\Ctmٷ;1aAl9=N8 HSyP{-`Ûꙟk_ۯ|_3;- -|15G:Lsǟ׾q`ieBK0#˜)#8_LUG2epB'! >/N:g*ĚT{`*f95$!aZ@O" MQR'Am:ىʲ8D>kS#Eu )t0Bya* Tl T2$QWg xWz6ֳRF,Ll:}iȕ"IYNcИ0 l:(IAtxa,:}Šؽj2 :un;q,yxKeQ]q8vL25NHPqc4%bO`9=P &粍9[-w/%qZIo] n]G_S*x#=zmb# #ֺ6ݞb9\g~7䳝z:+ղn\T5xsiU &nD|3г~Ɔ˪_$D Ϫ('c ٸd%*@]׌Î4IerTD̙j ژ␧]u #=+^UB7=,xf$"j*]y] Heх }7)uSQjAd/P+]xz*NF$I4Xt;mHHrUt Y'̑iN~cT#'-52oL=gB7)qRT)FKOk`)|̅dywGFhjYR 64 QxtWY 7Ƹ((jvp6T4+KrDa+l<Q)HI~&I:M){Üڻ̬Yݵ!niڹ j,La<-BBe;G{t:6 )DЈ+I7T$_}޾ΝQJzRkV{Ϲ0; #ꯐ3!=`"Q5 è80L.&\WdA`i*AG((0M2ù _WqpYHda!F>C]B,׆)!e,Ur술7}A~ }6^=/^= 8X>qBq֤`]R(Oꖁ}}MGޛ{y-+겫)`ISdp`9FI%͸w7ue.:+/2, n(4MmpFԒEL`aR8ZJYfeod1Vs $I`Zi-5G)qAd>D 偦==S'k:gK;]Rn۝@mbv NC0M7[ןgPW kQ?^4؆ "q h]@M1$L0T!Ly fTӔA\4i`YǶ]]Q2ד#dOH`5h؟k+S?l 8!]ECb$6j}wUtmypDl%; #﬌cW֏!9h:tcUL>eִο-grD.Ѿs;z(u+YxOe((0j0wZ'Gߍ8, x+Nq~fF^UDI$](ʗ rfϬ.8u^Ԟpw0|NLf0f\ š ,>LYU@$H[(enI881佹VNٓͲ8dE3ocPBeHOC>5ׄHwlB1rZpf M)L &afDthĴRd4<=]5U-އT }KS4r ()ϛLVqtl7tk9Œ~d+M'F7?s3Ҿ q/ivf#oA<u*c2l{'pjv!BYͼ];Vbi t!p[Mr.X ,)Yp׬~a]xVG󡖆v=\'- 0]‚ΎbFu@]!4[pr9Bs|F|&oWs],8PaO 0M\-F`#$@Ipw:DAg.^k蒖HR%ņ 5ʋMǃ1H6;ʶhY:sd %,PT;ZjJ'X.Iq]yGq)e+=߲YM +kٮEŝ\P/(/БS7,-[팜[歅='" C;* ~K3fs}1Ǵsr>Dу%=媊4qވ?D@:ecHG{3&0᠌-er2LAimik,*P Iȝj*W3%@ }3"ly4BΗ5CWEhg ]޷ls @.]߲tz 9d_'e`'v7 %u5<:0=B'lthNu9/\cf릻kbg78$D7DE!^Z{ pGN@gPQGe :b8NQX[k4-e!?m%hiZ~eB^ڱ~)OZવ/$^]#~[J聛 ҘwK4koI]5ilOYA?Žǻ} Q"-a2BtwŮN~~+֐pOM`bO |wLUy-'`7$ݷw;$ygmix9c<@K l@зSH{xŲo{vMwY؎ME]=E^Z"Z~z~gCaS&y ) |[- 7;_vѤP,~ ZsWZ"8:Tsr5/P ?Vv?E4S}ڼo?zqM4Sr MjKi}.BjJ+MYb$Q~tKK@6^=랝c;uGg~R2h'W}8v 1-JcJpK,2s)SW{f.Bug,#.gn9lgcf\Uw?g™D ߙ piOuxH(۷w`%9pP$Y\qP.R^||!A W_|{S o$z}Ax_ĺF]ٔz%᣷aNu{ΰqrHJCw-Q {猃Y9XaR)kU ҧ5miѼIf=&' AķOY 臞ϮϦ3gCi~Lz P@ħU#kkI HGB~ն‰~5G|!À5#㈠*e:ɽ?%RR"?wGQvp 9RǗXPʁñEc'C7ڸJ"gl3 WU6!ULIg)sK=si( B^ +!kb^v[FcjBU 9 AR"2? XtQG>4܅5[̙i|5ԣjٛ]渎g7x0,VcHY*;\.KSs3L}.H[=+j/ )&0 +px~nk=-S.-M/ Vb(l`m:k&6jѐj3!mFe4,ՓYC,īcO`1H@$ Lg&;44S%m*L@>/_˦]qyS/PmZ5̞78H*ā|b#s<&T)y"H3PQtH`Q1AQD$K"ջo믁Pp}n3θ#:h0:R $H x73xoqȏ rU˚D &d3RP{ |<}]p sW|ƎdzU"y舨bͪwvn +N^x:lKo,Hb>O 9XmɅ *k~%8:Ȭ ·pNϚ/mW_wD ]3_ 6;sm|U w޳!g>@W&=\{GwNvVཝ3W>zAVꈙ98Aœg-=%\z wӮn^C1Ͻ͚ )+k_}ѫoe+P4aV84VH68 VRXO: /RJq$-߫P6fI'>J̗vJ켞E:]PBカ=Xn{g?tER~FLHP]Hvܰ">3Q^{{"'F*<~"=c52Xݻ\w^*[[%Wmx9s O?eM]pٵ{ vӏ 6ɒ#IncND_EL9ChG47(` ez0)6mNfd'Eik쏋sS׼U < IA .sp۠ϴWC;F`vB{~A;90qͅ`͑û`n)g奰W[7hЁE hĥ=m{Ifܱa?kۅ8J5 [ބ`e%ald&CKPw|PݺMPPg-V@i9뚖rE¯J7kc(9L#H- )Vjrh!%t c"|3x/C^y{_4YAhy;^Jx`wuVГEw$ |M0,MxgWgx0>ޱly*ٲټS"C[˖̅Q55bFv R<iИO! /W Ʈ&ԶXcQBՊM\nPL4IT c6B4#ѰѨr( $J.3\Up*fYȥYB !8釦 >X.7I~G^)M5dt$Vyز4jڒ-A-fV96*%u].5PS06U/aBg dwv$XD [c :"cQC., H弨h7y|XǾYGXĪ'Է%g#~0C d0(uO3ffٞrlV 6'82%uX컚i ŏAœcD¾"X}4^1>f^4fBq=a z"A#"P]`<D6,:~HY1L 6%*bO)egM֦6g?}{~ze8) rp=h~AO2y.%6#>72E.ȉTԲ &6v6CtJ./caaoH A~_aH_<(Fi 'zf^O1]Oj8}Ә̏ϡV'GL9GnxE' > E$K L!m+F*5mk\zڬ)u2תAqqf#ԬX3']v6zM BHL54дWJۜ ZTU$%(Sj{LQT\&d*kl꧲z=fNkjNش?)!GTe$1}͔#'t8LI:Jm"?$f+s.qINca'G3ӓsHE L!wEۙuܰ\=D9p8KeW Z/g#摤0K [(ЪlHp`9 9UiB :?!{_:?| }]@Lġ]AH\|`@ 9~tR l[v<>1CҤ߅Nb1ձИxofW8TӠ|_r{37## W6e"2nBnP9!*1$j2ӻNDž?Ǧ=#ϟ|_CnfʺOCXי.!1qb"ĕ 9"70 rv_{dk#V/N{KJ0ɫ+3&2QVc W(SH| TNv%54f]<)9+Z(J*%$Ҧ<kXZ XHi ]|Xw Pi]%VNh}<쫄_[R{[<㠿n ]6R0no _nlj/am>؊,N`^c:G 0H ЖitK#K Ei@  \TpNlqҼV ˄^A0g 5dB[`eDv`xC&q<,*s,fi{R=U ΕFe" C[ O8GCUw`M4jyn\8z,,lZe*S]s4*c"נaA)Mbx!<^*g73U4*_(/hR~\pT\(M*# >Mv Ṯp3KTE sa$ g^cgM?ȓ磄̉F<&}ᶻQgZ Kgz]{ɧO!yRfYA^-$:]smqeYl$Yq }w{g~~,ݮ Xf3Ip7pNN`(xO|ty!I^)óa5jԸ!]#vg8!^}N{S ^VO]1r55u,xu0z~0 'y^X@y^Elo ~ YVu xREQQnrQzuTRBQRkԨQ L2KYT ` y_|Ľq=әbbK`{b:<ۢ͆}UW>y֙\dۮ* ѭ+bcz~~ M`+ \: N [IU((y *]YajοF5j}MrĒEMxy%|o۷_m^4MfK8bn]wv'Y9veoڱ8Blz[OOw{[OS]e\cR]rK4vy24wXF5>iR(!4'/{\zl}cTq4RlS4ӯwN_z|,N?Wۿ~-'+K;o ^_${.{/}tZ] c9v^q 7 w7/F5j@`dwv=lnl..fk~}4(pS4'Is8YB0ϱ6_um뿾~do=_y'hyBX$ [Q<#XEE6)OQL&˲mqC̉w֨QF۠0֠>򜤩@2֜;Dm[6ϳĔ2lKD8 bL=BlyRGFj 8b%.,Ƙ$fg.ò 'CP~F5j\f=m1eJGg5,i~^H| ?/"s=?hΝw޹t:(kp"J|mm H%bogj@\aJ[ڌg5jԨQGzh"W qѕp8la&P*AEK$JyGüT癰@ k|(J766|ߟpDj'y^ pN8s)2+GM;y]J/=5jԸ 5Z@@N`?pG1*E kzI&Nk'.Jp2^X^O2Y*wzK0$II vwFrI?I A!KRo8Ѧ ՄrF3#*4azs3lGC< zY/e4.5m}4Qy=@ʹܒ0p[Ȝ N=*IޕQd;>A9 ˠ,x?++.H ̀X@@0#l꺲ƃƳ3xl|*?EEdi%nѨ'g*;M cW>@z.Q!Y҉+Ⱥ"0FQEB(ӫSQNzNV&Їf a?"):#r:p~?7Dj$)IS)K3C F !|e%z%? 9< )Da)AOsR؂Is;H*jeׅI -ݻ;pMSp#φ"Ot?8 YLh7Qi$0" @Db+tHꨤJ*!Q̮rUZPҌZk(gRf(Zk)2= #7 YY pQ0 fp`li}EoynfC(3뻞A$8_Q.Y.("49e]' DOQgx8,"Ҫ9!F9&V Y8^C%TiIDAbwo8ɔQgEbhi*QyL5MsN"qJ$QiR@ZNZkZPI Øwv+-N3CDžL9V$*LkN;pD:+B|cION6$M M%I= h$"Y4ucUulB[vAY)044myZБ#ӭDJWĮJ*GA|M<I$tY#Ar+(irO0HbQQۮT-SvudA%aT59 CPiN7UL605V-w0 mqRՂ i*4PIkr"x#fUhK^, ,z E[hjKv&4FNeY)xC\?@*ľ&,M7,"WJ*MT5'a'eIX>'kEy,$7IX@z"Q(NISscg$P"j*U+LӘY%OD7TxZ; TdKt^Ȁjsbr I ?CQEWUu8峻ҭ <$I/\,o9QD$uUhEI%TRI?~P7 ÇoڴI5?^0ʨhYBeI<_?gFWX,+vz%/yO7N~,vdDdTal9;H8!Шխ>r1Y6o믿~W4 PH}饗,;A￿lyďF?xTL޼@`cQM7b|]w%I瞛kv}:p????g߿wƍ$gd5k!̒8 |ӱ0\fsywkn۶m߾}"3xT^|EZn{1.HF-xY Xeύ CR16DiQao AȲgL +%%A$XngsQ!&Qxvy %Б/AN^(ӊlvmr=Ԉ>/`/ 2Nt ?sGPHd넌WQ&>TW]ujDA૯ uwC;GꫯI7xEСC CÛouǓ@ lO>w\^z-[oe}Q`0躽{( ˇ @(?d0n"ʀKdTЁ=$J!ODv:gN *L ~|xNP,x1p9xPMß0 9o9G( QZDc7Q!faa?O> ggB2e ͑ R" w]^4jn,NM:.ReX\\Mf+S; g} vŁ%% 믿h $ 0QUkLEhΝ{W'#J]y^xᩧ{9 4q<|;M53hr}[oAsB2vaDBmtĢ0brȁu+\{äB%=\ۺu+/ nB3l@$Z&M9H@8B"c CtywדXssuuh-r#Ϥ h$C:K.Hߚu|u%^? 'ڂ/"G2.RgT@|\=DŽ >1 3cOJ*t=nބev߾o5޹Uw63=7όDX 6,fA(<["m"!0!llcیxn=}ί?nfǞ͢uƒ9ZGϩ:uT&j/FCQ#_5M}w0..\xa#@<0h@TG80h­;wOΝY!0~ 1 ׻裏FTGQ,W/"wItsl#ضe˖)rqFr<4r8|_ !ι87l/lq:N@E4PwPPJM'@-mTJr@3gHHrBX(UW!j I//y=%Q, %T `d:{r݇`l\X|,o'vY?3/\!'>I;4?Ag 5q||758V}Wz-^"Ԣ# pU| aj`ov: | S B>cRqOO!DԲ6(ֽ: ۷o,r@Lu*JU$DXϗ4<(@C4 ۱L W] ' %h'%p@չ?ܱtn書 \-±~d,\ xꊸÈҴBZT n B`5.VJtvK'Ff1* ?C9Oh"Los5 >·r_4Ob@[HݧOtSO=Qz< @][nE yq qqh&O?5$kEth-ANWOc#숩A:twP @|ٳ&9zg!" ";BDZi|&_+fMӳ@?Z32LvLO \*W|(O$ڮY!"P8LdlWu}lZ\2 E/^izſ{BVoKt4sc`t*=(6N'zcTq-tXLsWyDŨ~?pK  )ÀH4ē_z}4zO@h~e~9NˬGtΝHm: zTwZj5Z 6٧N=4Q6뉉 ߶mO?hcllX}饗hדȀ/LOjt'NjH_Ԙ @D5 4k8 < -\Yb0fp iuRX(6#X!ycc&q]'p4S,{{ ZZ"CV V^c#r䘱,GNp h&JTiPڜY-*򎝘oڼuiyXmӑ1xjʟdбeukYS^XV#8S8ǎC G8 L8.;zK}|%?4OHr wJ@7XZq]3O7LcY7lܚrZe-, oZu21ymㆵHn*_Yxզ0jV,Î02cOno鷙ٌks\! LFdʄ*xVIhT>$hJcZ./!!Ƈ zDK@l6\TOA, ^ jgkԂ7 -K~iפ%!|#1Sl0_셻7H\Hh=꽬T0k6hCB5lh1$̪&ѻ,[=Jh` ]f]U $rA*\$w`A̱]ki ɚ5Ν^y/Lþt:i> ãC$<;BsFLbfR^'>0VV42M }y Œ1<gx߱?J dЃc)RABEw!'"r% Ǭ$,!55^iӦT*577y扉 >ϧ{۷IEfmHD"AHmC8::[*j(B] k'xܦtf<Z%Bw^7GG |w{N42Dx:f'l^@cZo|J&W 7冇 = rb7zKeQёjn;vnYD@T-EP[˕NG;_])ʩT^7N8l>W⮝(pb"]ԔeZܭ‚fb[0nÒ '7o|39G˂m|il[z ^0jd\]F(yf LҠ$Nׁ~Rv~E@NIk:um+W@3֭6oa;# 1/U=N&7n$/4d aݤ7JLׯ_[nlEȋ\*0hFa$_R!tVz6 ۝W I73P񜓢*o0RyDB4Y:oi?I2 E6ZPQE]BIxsn鹸yk""v*|\*X*Ŏ,intHEtX45c'Izʜ,=An՝[@J’*4FrG9z%4RQ\Nٱ4O5#}>bŕ 8@,!96"]VyF+[6l|骶m樥$v =:R"< u88C0X0hY-I:!>9'h8wxuƠX\$iXD/й~~ Ж%臈E:j{lѱr; +>  C!$$$a${gǞXoxc#؍DkB.[օ.q\BB4G}Uu_|%  c-|U^|򗿗q ؔpXšFSHhSQlC&DzzN`ADXa`~C_: uw/+cdTa܆,ڙd+d,`=Elr~{k+^7 XZrN`Xo dlC`hSFfY7`Bp] 7` M=TTC3_V<Ƃ0Aً0y>&k'@!B XD"q;15i[Q.Xu x뫬a>>_WKWDT:m"qU@ȼJړ?)FCQ.UR(MD7Q@Կ*2TW^+v#-B\=0_WW9XO82)1%' %Ÿ&Oiq/J1ot\R`e J( ELZf".]}O  Lp/p}.@gbu~u577S:.\{o?\,[8s7GyDX-Dը%%pUU @{O*)(DZYf 51g91&q⁀" TaE{>D*jV.\hՃD]WW[[3 URH6#'^__-CTyN]Ͱx{UڦAEF!LDe/V]]N{͟zf R֖kTAƌiIj$H32e. rԦ, WN?5 N~(n7,Bj84Płx,h4V0FDbDQ#[Pū- O2K`ZF(OQr"!{wU5B_ 8=5Zd .Y3"Lw:bx9L#?(UN8R7F)|+LyJ1ݧΐڑ\Ep&JB0IiKAX2jXKt.3M3FW@J%%7ðj=$eٕMcڵz=g&mx])DYLQ}6Q= ];)K,w(%]ԝ_}*8zCd0JADBHųL@/=wim|C/Ԃ[4,Qt2@/`Ѥ ԽX;hdZuk'c1)3:0Iiɠ,:REMaCzԋBjzLݘ8µq<z$ƤA.Q+u-eQ =&gƑK=|βN,2¢b0XRWj zM >X$ViԂ)? 7Z[ڟ> ysN]Z(&?J W4zY60L-3uc_JYփ'm}..F\$Jt: F\U~M%< vP JLV!l(r_Ewa/KAu\,<`\R$<[QY;O++ʐ MMMwǠݰaJ}H8@Rl=82ݻ& ̜9sԩHL6R-[߿_ĉٸq#r`͛ysϞ=81$ˀ:޽]f ,ڃ*"R:;;$$/E5I!J'V?9rDm9 ((ki9˟R/9*}{.⢲ty̝Gy˓L$2sܺٳg:twy^uQZZQibBϒaTcM0P&6_Nn@ӧx8UEbZg̵@%SKJ(ԛ ̦,YL5ԇ~bŲbHҘ4,+-`ji^P9<(XV+>y=]S3 c̙{8*]r C*r~chn֫U}ib@RcWE{dv:sROcF*+t@F'ksS)1Uq1G-D6I[)C9\D589#@pF~Y}XjPjӤqHv9j٨혛m]ܗ/y `AR,Γ=dvINnbeG*m v_0'l߾}.`SYYI*{3GOIq\ V @_J/@0mOyl _#pp9VeT09k&3n9CVp̛?Oe3aJۧ.>>< #ML. 2 .`vƳ8O)>ziǜt S*D(.Zm6== 5Ǚ“̢'̰d 7Uȼb fy~zGOjjjhV2Q3qא0GkvѪ_[z¸gqCI0M)*?RgrAiv.JKJ99)Ғp (42/YN˹){&8k׮k_8TUzSp:m*x~GTT4eC;K H3&.#!)If*IG^]~gٴ*&\'7Q{0.z!,Ɍ3#~ o#!) N2mG(/ƟҮij"k#?];v8@Ϛ5K\. ʕ+)6 X$)6A-=#PZ.V^M(fk1TB08qA:>cM(.\̨:}J 4b3~o ,X+v,WFo<[}<K*YU3ryrvlx'L֜A $`iY Cݥk|7#ɦ;L: \9 ) ~.w?N(]pgLr_rrl )"E>!jވ3Z"hAoScF+"7CO&O:ɁJɶ[".fϞ}ܷwGx~AF,|СC+p>Y<؊* wV\rTp˖-d^t!P[ 6qZuC0:0S[mL GJaoM l8[kq_2҂@]'x0e1؀ jANdM0yVlWA` 2*0^>,+0q/O~)hyvXu>T8zƁ/h 3$.h"@+;vL}rc}vڥ mǎ<~8-*M>PyEU)F /K(G兮d~v3iL,mH-?qt QfwOFXd޽-qus,da0 s@蟏׎N6Q'rNC)I*X (,+QiӦ>Ai/bhtJ].?DՍىM^1bc͛*sˮ ]63ϴ`jd⏎bN#-#pcD_h^ i !@_d͚5h8㈛Ҽ/d ҫ vEl@k.L%Q-NIˠӄ N7G,F9@2]Lvذj6\t_q6rQ"P LOJ.Μ9#ނu5"tFH7"xW;#l9R(]7>1cؠL$`pYKO'T<C:j53%Al(Ј<z_uD$ڎg)*oճchI@TZX4fc!TbL B0҅Cha0" n#_z8]A6oli_mmNx b]nl7Kr±@% QpH|YG  FMxodR2HdSo#ɱL /<,L^S ~}#Z4W :wUﶲ;>4zѥKY2 i._ BGCz U/^'j*+ꄎD\>n'hGȆGRK4< *+^tuwQ;~2_"^g]PG&sÇ$FJ;wR:Iˋ '`Ue_mUuŦTPM4R"er/g20|3ǟ`K_z6;υ̖ Gkp!$|G : x[oş0xdH`A*zZh.&gfC0NIѿV q@sQSAE՜|饗 . ~zKJ`i];w( pfx $M @#p YOS;!öظ@1)Cq_ Ea"_^ >CCS ]?Zzٳ>[- ޷p,t~Yך4is3fҲ ihJ"=UZC!1)~ɺuL>|4|4y諬(&!3p,"!"%qdDbrMOS_R0R<R.~tA\ 54O1s!˘0?ټ(c/Ԏj)ƆgΜx|tJ˶Z#PUjJ8 ˜x")Nh6GiZ[۹Y]]J1so۶cb郩3guޮsn'6>_ iiGD?pd-))58++ j+WQ^)=j4| *5U/>EYjF5;>}LX)=PV1Ԏ ,gL\@_-VZ`)fȯݽ,664ZzBcNY2 #h;Ϝ>^grGpx?#PEy&i]wMO*rqc-yi ɸqwAijg[hښz&Q穪L6Gnw;e{!2-t"Oyt3nsgq j$эdw:䓭ݷ\>'eƠ9r{G;̩땖i@IWʯ]ːPkj# SM=~83tLfWMMjLaMfӘ `;w߻d/\_W̝7-dN; σ4#gDG3t™Y&Pw*PqTh%K IAc`|I[{BZZԠEtN$S:GG!^ßCq)o~+>d VT&q^m'! אrNy/?# ACC)(zɩ^O-[pW6d/~/ *0[+!f#Pt)SO=|W_O,=}?6nHJT^) 9j, `P)x],9S9c,Kob,QMj0[*a2IeB-h3r艕s۷o^ꕩ͎<>מ|P. {xQ^tvfEۖ7 fmir˹}'N/]6F92l ,u*i)e9TE+X|+CXS2^8ũb]2G3U8]+R5IВKvSYQwu$cI҄oo.;oGw*;8 ÅTw)`rAŋ]hEgGYh 3Yӛ2š1mqZ[7^t0^]SI?W?>[:K-uJd *VДv١6\q,, ߹޵ظ@)Q;1Ҙ Z[;.4;(zzz& F_q xln\>s玞>=ASQݻw|dR}(e0*PEvuև?^t}MVlb2-Ne!.fΜ]]U7%Eɒ?|k߻w,Ģba) 3- rR9[λiR+OxI]ڸ;OZe 6#9T3gvA 8ÇKB:2ڮxђmL֖lgϥ"vwwuʬemkcڴY2F,{pնm[ 8Ev$S,8fQ(=wlf"9#xY{t]DTf"b=?qhOwSn/Oy3j;teEEpŊUؼvoQUڳg>&\ʁUIGML^Wh@nyW:8 16ZOl"CB`OرiI,fzehL-ԢieapPݒ%ϭ[PK{$36 %`ҙ5ڙl>;xW}ǚ-jjKaDtO<+HE75h`Yl\0|z=޻,ZTIKנ@EyR:&V`O@uus)1c/ƦLn$^a=*BO,f=aqڻ;/7t\.dj/dT2`j {01WGpGcϜ90;vlR( Z("ɓLԲf8,aU"/`(9,7yP@dL(QzJ9d=jMI%|C8SiZ襏k{bt!S+W|.1Mwྉ铨cEEv%gG(]d bmm%`PTSԓwV.iDToۥKk.J{EP8Q&s/pp02"(&pێ;w_a0}v1@3gucyXMϟ9sw=Rӡ lh˗/[(7mڄE;v {Wp45-3}cw}СYv}P4^LAuɀDpQDE~:cJc8/G= y =:8gअ1Sd"u%Kjߺuĉ;8?z_ 6  s(ta߾}P__Xէ_0\L|z,]^?~@=2wB&[~:svB Mr9#p\O>} 70- 2>hQ @wU j:EpvnG14;q׮cL阶9kYY'4Y,rH(fºpB?sƾM? C,/I7E`JQ$|ŊYKGԁژO|ڎ̶z!Ke  G"Ic2ihѺ9>>Bϟ(?Ravky?gyA m5 oΦ5kXzF ZP1Rr jVA@强 ~)V..)=O|9G"n+Q5662x"8Y+\Pz4wKNh:Fʰ*2%V x91GU/0-&i( 8 - s89u$;%7T__Vd?ѣ'>i)-Uq(̳. +%e *yBC߬QTx)T0(-֣4?7f˲dœJBN ]xJ$Glݳ.D!3JO y"B)u76\ڏH@ WU `y!p(b` Ja@S8Z뀕6D-booih.,Dߥ}0^AL?uK`_ O0)| /av#BrKKJSbY+ᅞ*>+ ̺XaG*C. ]Po95 4x0h#5UkBKuL$F)-fKHTXa>TG ۹S-Qʌ3?/)Wl엓 l6P:KT{$[N8q"!^My@]wOu[M_GuIXnE6FlC`9~B9yu8$M's!Ê+2c^{JPjp~=Xf,%ю0b܊mi;hO<J ^33JeXJO3cbb(6T X!ҢJmPDX,$`d!>S"ϊf#CFP(eI̷bL5y:J8m#u@R aulLAP,6J0nKd.Jk89/c"iq}ah%ikN8uÆ LA@ȣ#-Yrj+_ $rXbNSAœ BH8gRX׭_kF,\>mJ@N7_Ã" s ䷆8:T"a Ċ`lSty17f WsD1t'O~'xT&X 246I ^W&sJ=WN28tH6mFׯ;vl]]¿C .+2ygR:N gp&VQoMbkI♚Ԥ&5I-Yi*FzIVЮfp&>=,'p8pC<<,Ԥ&10`֡D6:K+yIHTVR>;UnRԤ#(U6:mRVVmŒ/ $3^UW,a7ܐ!COm9{T೧3*(||)I$J!Ƽ^RNvԤ&5~Mu*6rhp&P(CHmMe84,qR)i#IMjRTz] NwlHC7@(JJe!CF-Iud-W[_V-DpXP(v{fC  jjn>I46MgRe $r@'I٤MkhpȐ!C#$rx e^W3F/M"'J^}Uٳ`WX2dX2͍ϗ*Bp,N;JK/dfp& vgu&t!CF&uVwwt<I8/mIpH.jk+!Kq2dȐ_/&|74ԗR)} $LF.V 2dhGd$I&LyԿG¡\.f͚|PBp+VprɩVp 9UΚHPQQAJ~$rʹki|R9ˎx<.t*^FrlA`d opqC #"mYr6.w˳K!p `0H@Ɣ hF6MfBpOhsss]]X_vݺu 300cǎ@ gM:uɒ%ʶm۾4|ٳAzu̘10Oyu}gy>MMMO<{֐!C ]ݰ?*_Dټy0> ̙3EwuuٟA`2m4<$۴iv͚5_~o{P|~ƍ`e-_`+V7!C .ahԨQ߰a͸qQ@&\ `P _."Hd˖-FRݹs'skcc*/aȶk׮p8 nUM_y֒!C q$f [׿-~z衇P+%0NwwwEEl[NxVH]@=ztMMM}}=9L&A,ؖ9AMW-V7!C .asNobo`{챭[!;rN@` `VWWCz/\[;pnƏ3Ւv=yZkΐ!C ]F7~(⬬[Tx7tEx-{s$r47e7D@H萋H':ʽ [l9ߐ!C SQ{<7mo>f͚H$:i `&a˖-?gϞ &dH'|rՖf4<7a0eee䗏i]ëVzy,EbNPN F\.cwۭ9Ϥ&5LrYZ}@^o?t{U7:P9s_?}JKKʓlE*,(wҹT.:peiii4iKHǁ(R8q'9 @jZ|*o)_'UUUP-V;4U˕<%[T?c;yԐ!C#?'ǃT&L,|W&k?xwʄC!h0d\(hE–h[[LFN?ŋTbpyTd=3dȐDǏWg2$55Dʝ嘇_(pyUU890 *j(Yj x3;fWU@X;ܐ H hllH@H2[CǞU˽մۏ~#$Oi4M!C#R-ғN+ 9lK}{t-(-v+Pc`}wM9`oW 7:B]$oK#&Z]ۇ$7CyC S$n8 [n+C 2n7,2d_/RneRԤ#+^2Э& {&5IM:bRE=HȤ&5IGR En9ݘkȐ!C$t}MyI۞o9Ԥ&e黪M,eYۙKgʂemmnB2MNp/+ȗ1r|j@6tBH$")z4Eњ> O}%y ֜. Lܗ]oBC`kG{_VJʂtڲr`+L(WPnCC;::* -n>^WE6'^Mx`` Jpy|3Ԥ&Ii_ȣ559+zD=¡T Ns` D@›JLRlǨ:r6ELSuu5)g`ĉ9s #x%AJ |as… 2P[;! /\j6`^2dhR@2̴wYߧ^ZmmRg**)V]]]6S1n-g~KpR.|𦼼%~06pve| LVox"1z"խn 9Y*XYNɬy2dH?/ew9؝xFu2ڵp2WTVasirDh<'dy L-@99!7Ƀ" @2 ѣqkoJ555(O+FAY ̤ۇlv;hY:q N7IMjү7UTVV(os[>”wtw^)lڒ1[w>^R* 6ttt'Wɓ.`RooBpSQQ`兓7nH_D"𩮮bz~,Y ӖLr9q%2IMjґZp8wwtL]CepP})!d;Sm۶棏>zqKOhhhh?e 93Z8N9n/^r b|@pV.*` LԲc8 6<6#9BnW=n{V}tYYIMjR4gVjq60}Xj汘ܗW``׶̔)SZZZ\Ǝ`xgd=r曲Oᩧ!~_lK.o5\.ͮQR/2d$@>_N(-)ѵR^^exa8Zjy"x<ׯm:xo[|||;:/-Vhr+L 1NM|ܼpĉ!|W***<885.2(dȐJ gue+--k[ti.gUFuuu?~<|fpP,X ,NH[lqM:<|jkkŮ]xvsxPTn666vvv=#3j(2_@J9DVA#C <6E %O?ݼyM@D"o~СC ȷ;MMM;v 9s#G|Zv-Z<쳔Bfgٲe0$'^2M\'7)lpƍxT- 0!`xnRԤ#..*5Ȣٳ1V *x$28C“O>9f\gÆ ӧOOihhhii8R\4媫%B SNɖү^pC}Mp.&5IMuQL~ l:=gOyW7Ν;W^tuu?3ϟj*7|*--}' u6Kj]}]c6jSCݽ+LWWxNɜUcq"/ևÃdJG;;)?DlIIY(0ai[[%bL&r뾾2RRtSWr;+*w[C2IMjґ~EsZsx9A;,+cRqӊ&%`rڜt"ɟ@z IEf Sgg~~& Ǘ2dQw?vg}3wcF +V&, !HHah"(+?`ŋ~#X `7!R üjOu:x,'uhw+A@DI6N6۞_BT9$&%+tT0Qԛ*S˙7ȥ{++A%i6ED98&He݈ce@&FL|g*Mz4rQs6yH࡜ !褍 W7qZuF.糟TۊJN9r^Lg``` Tl&$G>H>^Ƕ TO$.iQZ4K&c!a<T-u!*nw{ MU.C!x>@N>_/7oI!NBxdb؎c[z1T2B[-7TId`p).E.$J-v<񺵫qeқ8-LbPnQA#I"ְ$iz@tIrX2+f d_X]F!L^T\>oБZpaV]ZYUv4-jO+3U|39y$J{(Dq:n C)sf鉛RJ۶{صj7V*8iy}K4 ,Z~WJe$#GqC^-sG'݌A4f>Y \]t"T/T"Sq|!cJO#mOsΗW8R\L$Y+LH&Fa1Z}qlT*e.2!3!vAX]H~Xn{]W LOFIڋFBdhǝa\dB${600؅|uuf0,T/:S q7ftzv=wǛ՚yܢ»_+kÚ}׾BE$7nӡ8?u]!]8kZ=X+um׉X)a={^NI?577F$I$geJ^~Z0=3wXJϕu|~9=!]!b`#R+Pxa(BI׫[Y7wdŵr8J̄r80 cǩȕ|SDjYy5zuYMCnw0ȶjXs}?JrRۢ[KufkG1u,1t9aN^~H_JsX8Ȋ pjr^qeCyV^) ^8=ܴH-U.&},$zn̎ٿSPHR`+sAI*Q˳>׾Ew)Z\21!|trۅ. %2d;ea藢Ry#LqtNbϵJ{Tn>aO2PKLk ]?df:(3^z^̎C]x6%Ml"?n`?I*C,gpF7)2GCIP8ThGmg \ԇ=Y4p_K ,\6HTnHMEOR%V8Ǒz}O*]Ӳ/XP;bBL ZfucW zՃ=)rJ lH" *K$EOZm=Ψí^w#K^ϲ5#k6㾫947quTƣ49ͬt(qM\""FxU"诒77=rpLCFRi"*Au'E.ggPpY4Nyfed8~JV@/%-%ԃ(f8JŐq677ffڸyo=zg8NǔZ; 6 Dd\SK:X.kOhv^?)ű:8ϭVavV*J' CB }m:B»p`KӴժ9DA^oO?ks\&^G_/)L( ]!]r vS\F1^kfޟwϳ~'y'WmireeZ@3LOO!FxaaqleܥFõn:筬,tT@!o66@cW|fQ#܅LFi>b`;܂`ЖBd2q,gl^[aa<:wnf$7XE@ը|n $4tH79_f1[)W7.k'x!]VtΔD#ޙ4߯766j_͏_j}ͷ^=a@MyRQD뭷N04=ݸ{K0>4̓ 뮻Pg5^{ W£WFq%s 6ݐɃp蟜Z@愁|uIAv3'N|ر{~#ǎgΜ#x ڶx`6v>|u~/֏< ?/?<Ս /z^W D2JWooP @ ǐ$f6vZ9=gr8NPʼns=|g/"cy'xww}v7xzσq~*}q&:T wZݟhdV(ԅݼ7YP'GPBLOOB!nc~0 Vuo;#:>({|ɷ~.<z`O>y%8O%`9\XZLʲrVʫ&z0zF }[\ZwZ@m0$Xo.-moNv酹8OG} :2(d$ٷo3:JH>*Pߔ< zɕD C;ЫVweq9&\s$v<\VيmEydx䡫LeFJj,׿ѼTdX6gkֲחqcs?KH!g8v;T7fwt?kH௾ѣ_=uTIBZP pZA3NْJQR/DVd-4,cE҈? W&(sZ駟>sn#'NSY'zWjA} Fk |Vk` 8| gϞ-3==*:x;m6EJVT=nf &$P?.Bm:7 n 3*w?\ֻ1=ݳ'"+F8,;1d%H%H+ bm85xC1$2x읝GsnuΣgݵY~*ݩ>V=wp,~\}g’҃TTM ν?z?ԧ=_ܺ~…rϏEI׋*34 bL`&3t>sǖTMxs=g;=hԛ G͹>0<4Yd_9t@56FdzeQ1qL$`;/jv(~O:uTYsn1Ae}_Y]]}饗7=??w'OSTVp'_|E~G1͕w}3H׻+K~_- ;N %(-SИ%>讐)ȑh燰CR>Ĝ.s$>>PNP6,ۧD?p'zkW?ƛO}; ?>7\X`x)2`G7j3>_~}/> \ޘ_|m?©3wY^]? #J:ޒFlQp!I¨,*ni3a1\A {W7т | "Ю7E>; _\' ʃ},(~}}=Ϡ [+\|9Z櫯vA+΀$N_R'$^8<ȑVb/qn!nA)G]C3N~UdY3^~Gﭭs)\kwWNBO}<nTi}gggg^v[)Wzg;Vחuo޸|8N״Ut￱nk:"I 8,AQ5 EuHea#U+$8v MΑx4tO^\\:a0^O8 SOjR'z]otzA4Mi8%,Ԏ-tR,H?- Vv}T.%@a}s4L1Ey9ʑ#ǭþ(aoe`e S!Ӹ8WB߼V #;2-ouwpqYmu}Gčc3,o:Z i%<NJV~*\fHϰ}6ʉ:CQ*! rv|w4LшcJXO蘒oTreoؚVZ=77É{fv`+޼ʂJ >e;(/ҵy-P{ay*e'J^lA^PpQlmoIrPBC#.8Ci'v(G0'̣¶B&`nۭD<}'VmPaK@5 ZqՖ kc1p,p!Jrq4m(adyF$ҫwJI1MC#,.FgRX'_(烈:]_qz^իW&ܧZ9 P,kG@n3r麜44>` hd|X脑@0ak?2a}EQ*jD߻FcN;_G|MN^[{jZoxARQp3YôeYs8~a+ﮬlllgeΚQ߅HBqqd|v܍ȑցy3V(MCU:@0uM;Xϵ S 8;ƹSf YCx21FzR|v4=3PQF:1,s&~QLǬCyT.4yeEbv27L(%(:JFh@B0`e}AU+-IųmNkkKBCi4p"@z-THvۊ$8sDu3Awㅄp"(lRjKnrqT&H^DAJ3o_u~l6p47,ZAG`B$Z-ZQR")$0{2u}ʑ#-pPr}t-4BN$ "y>15Gm^aT X*&\HFUe`f]/V*A(fLO]ߌvHEtxajaׂ ȑȀ=Ik?2LKbæa'.8?Z)}]%QqRҠ׺nxu/Ţwcp]stHxcIL8Co벦~7 pʑ#ǭhaMjCi t}OضxkSW ?ބJn70(DyyyG3>5NGK'G ֵbp!r;#G[r*QKϳ ,$RZRCGPKqMVrIX+zV*G0W,]t|Z َC )(i#KHՒg~`̩{v(GG(%Xsh `9maH26̝̩"a Q' Z)!U'PJ3(@<(0GH߉$.O$QL$vEMVH i"Ʊb=50gC4\v_r?G$i ߊCo}-O޿۽LyPj~>47ZL"Ǥ(%xbI({>"nevf7Fw}ftՁ| =n>q){GJ߉$ّc Ror>r1f)Q/qf5D4|Cm1 0Ğ/hŐSe(qZ0P1ƎfvngdaI\io`jgi;ey0fZd_X\^;K4_? 5H3 iP LzƁKD$Ӡ$ ;v#dݗ-Vx f&mޤI*ai}.4WQ˘u01I>"cLݑI逍0eBC"c.F=x$^wSup郐ܼfjz^2,do7-VLUi˓ 8ڹ2+_kcјs[ӧoIENDB`mondrian-3.11.0.1-R/doc/images/workbench_schema_editor.png000066400000000000000000006020501261646570300233460ustar00rootroot00000000000000PNG  IHDRd tIME"/ pHYsodIDATxi%UO-]ݷxfD @A!%JQ~!+ H"H$b A P@v28o{pN=EH~yWuVW9u9U~R#b]U@ 0c`ަ6CD 0)Ca`1ԲV- 4W0V30Y{wTi*k`UCø5i[U`0!9ơt"u4 ը_R+3SƤlVSSZ2|;02WRӰ.I.VƮ i ;41V"O'@{ۆw毥Us{IǵJ+J+ܺX0q530w-+k53 bLHWsx2퍶"E&L(9^@68&\Lh6@*RB\w @5OAv|_Χ3TIbT.*d+ ;C˽=X2uZۻ :[~tk0L> -a{~kd5>d. }F؁-20WK p ; .0FUG"}a,e*`?|~(YgLjwZdRAtu"#ms:En1KGcdnhud-۲-۲-۲-orN"?+RS/+QQb.+J1sWi Og&wDu;Q/*^7=1B->nd%wը˗a'j~4ly8a2f@NīBJ*fk? xJ{ e7mG_y+ PQ]b>W)$*_&r>ƼD~lhiزr5ؠ8v֧󑵄}X[+2\| ^Y@ 1fX0?k!vr$n\+ HhPڿ+J 3׳+8)'I*8n;ͼ"˭XS[{Яk<s M(ϖb۲-۲-۲-VJG3|.qU7GAUd{Hjt̡` a:' uڋ:Q/C*\s5[KH%yB ,Fx=:ߍLIF`=90L$A05($4[ )\߾ j6_ě qÃWoTlퟛP[|r`kWzQץnĕD ,iZ@qI9pbWiy JG*3蘳>w~z"_!)oj+FpE}X6h΅nd 7ػ=c怣$"-Ldul2$T)i ; ݉տ$G0(dʗHVaM7z#Oޤdx+J+r yɧS"lvyVNF NtY0ol$,tietgN2W[h s1,fϗx ,],E0ƵhӏL Ŝ;m&tI',/]+!IOmvyEc0Ϋww`o;xy -e7/GZ+pLsWϫN \j+Oj4Z=yE}V`0F!B425pLyGP*̸ZijVw-; r ,6۔EnD1=܃ E5 z G%{snDf0vM5GwtSfUȫ9iGlWQ?X3b \kcIӹfT* Er7 K6+/N,0AN/aЗ6I 65bYaqŅ)aLK< abdN%m9tGPHK+ =hl iS:4ht\Vz" R-EX, 5kzMA ,J䯀>yghReؒLF[aKS7Y%~_mR'~n9y/TRe?5Q2ZK^RќJ+J+ߋTe~q;DOa~p|s6wכ>ăS2hj{܍GWo~>O~}xGؓ_tg_~&bfAX.MK=w={;|D??_}?xiS@M0TBqzM]%CÃ8ۼՏEgNeF/,k,~<U`?~w=w)컑b}tepcOd4(ȏPsD[kC-. w>A ao1^+ti`2WqQeU)*jk;0)P5N"#C/ ~yDt[h 6H;ᜏHa;8<a* xc p3 uGn9C,+K1hLnLqA5YA)КÐJ bAE=ℳ ^CP& tly\ҳJqε;gv޷g[iVZi{zWz/d嬋tSyzō;Wi^e'*NguN煃i |(]$zq/=n糏b/mGC~^چvIqy Xɠ/= U|y<zl4 r9-sKOSeXXy8*A~eb?c!*ҚڂAICao~>~i8|<0}ŗ&0؀ `Ϲx|yECfC:18&UDhХ%rw~,WVawP%%ȥJugah~xQɕ.%go]ӱ.[]qxZBa/8O¸\&+-4j:ݎpX.j.+7s(L0 k& v/FVld; 9L5$#zuo4 r2Qd.aozn]d W;`9{߾CzO\GWQIC(0PrTPlnsXq(LibBHB:ޱkvtpT/JӾݙUg5 (\B,K4rJ4 F͐P+8A%Gk]<#<TXC^t E:CwY:u E`+:NAI5EU2)2 a@=h1&4 A&>덲$]NܨEَ4]Q@diJR7 j6qfw.&yF6b`J1g8= J̰uKE4WsR'fU P`0[K x*/8Q>@0h^x;xzͥxW6o: +4,x%m+06jQ01-hJbH/THdJhfAV XX7,A͡C6^ ڡfEyGys0Y'+ce4B Γfx(# y?Aވdʵ4(\wiRMp'3bdGI,L/YLnw}:U̹*ƙ4` 5C Y6kSأgq#m50E4NԱv)Y]òG׬U풥L ؉(x 4|cq5 AJ 6|,-N9ԭ~7u9eaaYQ:x$q¬԰5Zk#/%i[@+[HIw96թi8j#nBazF}^Nt8]2g)ѥxi*cFq Y^X \CR? w.OiXxzfTcSlLΡ(Zu?aD C6װ* jَ\IT0תn11w@h Ö7ؠR]31dAɖ:?R<{M:(.6ΫOήod~Gng}s{,q^tt )^D|bAЗ_\AZUM69+i8FD!0n<1ehAQq̻AF`(жm<~F_/%Z37_č^.b=x TԚ #c3:;i K -"\6)?pb檗WלqBDw L*eYac-X]wO#<#<>aCrY/.G~ybEWǾ}}?Jr!2!aa BzluFB\gIe b)^<@ 5B3:EI=pIȁ^p|dewHu9Wl2QC-F4I O8:xJf6<{_xEEd\{͗^95S~楅[,H>7QkA>v{U0C/5Zg\p5_>k7<)N6 `ԴfN2Nc޷+Xhj B4g7jՙf{q^g&"TXhU1Iay^lZ Q Gԕmhmu ` rC\eŪUtբЄ>]:fB6N::c(%.gDS:MGo{:s徇z~! UXFe8Ѷ=[n51ɱeeZ;L{RYF Q H9)8b"RCpovw%[WpHU ݲLA5ٞ_Tnݾ <`47^`JEEJy;,?ཏ ԍOR]f2KNN5T3f&=ȍc;;X 2wkT ` N<>nLKIf[70zKqzPQ)i>QAT׶P14XZUUwu֚<@-Pv "-K6پs<9ys?A;c7@]*rΑ&.&1Ҕf"=&l!:ch(MfP``Q&̖U5"*hb3[tz( X2b#ݻRGNɴ$Bn&LAE QB)d~Rge֯d;n{[e <H/F@AmJ8 \QWυTk+x_ܨ.GN}_\O?6mjO>OS-gSfT:($CNoUW>zIA&kf.M'ɞg6cPRW/AqёSv;"}8F.u!A # 7{8ȹo:i#ދZߵjw#ΜVYkxx\ˌ'#{p~,}q~7:AQzޓ-8yufR@`Bߵao~V ^O=rC{OvF#$ڵ}5 @nB ~x./!?WDIw^ ~mvߟy_Fz6֔ c?ꇍ)oF"ܱ{|<9yxEa9SҰMGT6UT &M P6 #Yw(Y4)%~g㾀AL94حouEh@tuaYA0D SM "$$RWG݅rr^Io}]`*zȨ"!'vqٸ(4(Ѓ m7s7qGd2 58xf!J_JRS'cRq˩_8 ;lN̰"W~מxjE״o>vEgLW/>i3 k٠ p:X|^K*7-vbW)iATDa8Hh #jm9:ڶJ;j#t #-@kUQ e2%sLܓ瞬o<޽"@"6rǪ̺ZaZ$tV!Gq/ECMb:Z$ _~ 3"քYf~Dtط#gkMAxpQہǥ՝ajj#-έS{5>\,X*ג0ͯ|o'"AxחΝct0!OY-&Hlر,7zv$::`fRV A 7@cG'#8 X}<& vaIWBlHaJ::*7\HC"HXPS%ut4 6䀶İF*ɚX/QEao 'Tt,Tm0LtDXd"M H(#Kԧ*< yƐ@ Y BB~zP$p/>Lsƹg!j-EHy9D%Rf :&^!BM$`:)jJ6C.ۗNWW1l"Y?)w~Yc*3`z37᪟,{w#<(64.[&Ձ{lZ=n{Udz:Y \x?㩰sot#x_ B\eGOkzVMqy83?v>kn^}% HRc2X4?8TVssYOWJ|=s@ݤSr=oDesdbm7f;gҪ.`DoCsTQSM[|oyo8oƚpoP1gOlxYsnZq ww$ـÃŁ7! "NJV$ }{kkx^ -{lTE%ƢzB\VLV)7'1,AH:'G J!֎ƺ\ Q/uQ*'Fg()t-Fvv0$HfBuA! ʨK:g¨sxN)wÃmҀq.]Uٚ-`04@Y8 RED6P6bS!xڷ~sO š5+hҖ |zse-ъ@0tf/}6x{8nى:m D`B S\Z3%[25GL`]9ˀ[?{%= E& d C΄Y _aصӜ>3byr be*"R|KN/%x埶9X;c8MKJS.,0ʠiY¢l QGM?n@$DWjM5&biKI8Jro Z2d3;ukY,hYt Ghωc.܋cfD[HȨ,U{HMw<NcG96e~F/DkaA4ʔ[}}{?{xRҹ?=;@ȰBߠK9  >}z!{7&VL,; 栐g 98/Iʖa<8ωP  v- L2YH] d ,Uè*G M%2?Wp Hq AAUtyxCA1Y\MўT*WvbEn4sl!\\KA#jrlaDb4 gRq#V @j3/ VE&}{hxpF#451Ӏb^׊v5no 7M~$&2yTAZgQI>XE-;:: ~Mˑ zI:OS909ݧxMT4DP8ETLKrm?v7oPY?(͛筽I\$ղ3V\Se"C#&aQ%4&7ۥӏٵձiê5 !XdA`({{ ^ ;ML@LU (~-@Vi$ooh#- d%&Xc*L,8^ Dc2K!J;tYa)u=*C[LSB8mKBtdm53*=yh?4'a"ض3+e@RQm`PYm~rѓA@oA{o^.%<ܖշ-i6-*?nì"ǠT 9!v 0XERJ \ҳdo\%+Ε;l%]QpsEc";'Ղ %Y(&HpCxAZp2L0! \><<_91 gj2`i#%6deځ0a>Q1Z%GϪP 6ݼZeq$854Ǩ9A wn0@ ͳh@-f:eQٜrpI,0]Vwnpdιt)2NЋx%5)EeOqT(-]UTӦ7z/h\ra՟ޑ?rh@&\:}3ĵw&!|9ɪ{_Hχ㇀7j8aEe;t/4=9{``dۋ\fI,* [}n\HLm-0lYykf8R3*ت*ՋRDe;Qs!7|7G.iN Qc<`rΫn Q!]WaY]?;XKr{=ޙ;8r H)A yBbD"aYIJb9$Y<};{Q9D ꚣTwWWU_I:L9;yY&:+;ӝ;+ ~K1k>zH=V5f!,I6"34`5?>v>vL+_|#krms 7|8wvI0h9$ ڻg7?޺q8=z޴r|uO^nGA4BWd/}Te%vÇ`t0h2#{Gg3AL $*d׳ѹ~|xx;xX~"V[t8.EH7۳rhcZl!rY6#x4Š;W&gd+aНQ]lu [L3[BǼDm D0H2vݝ2(*|FO4yovsWSyfYneE֙;8Ld7-YtdbtbQ6as4mvoHjݵs,li7L҈8hVdt-g0U :P(:X Yd, /Zֲe-kcK iªNMV:Os; 괔qFP:;8$Ǖ`3NvƷ^?7?:~sљd( W 4a/(i,Jc597ꕗ?}/?O<`4{ɇ'M81 \ g%5N6~'Eޟ5za*>\SHxd~f%RFsE]ZH$Th4) >pz  FBd%h\mo8s|(74ف,9qE]A=bF*rItD9wnrXyWFnɕn?p9̧e@chRɔr7QtR Z2" .cHjgOWRE]1jY;7'e ~֪"QKָ6ʱ*" fcu-%t$:9F~ȲDh#M4G^,Mkk'C(ۣVJw >9>C6&՗ €XSZֲe-"IK(j{ZNE2/qqfQ0ǩ)p&f@нlJ1K4#xqZTx&dYa^Ţ't9s$筱Ļ/~/6skNiFU>+<:Ti4}Ild]bQcqD \0-a{U:jfjRpZ>1$!NܲɻR{E=e-kYZg\t{sh:͟?<|wv޺=9(sFlȑGg%dCW^чϞ7^|Sg? ԯS`F2Z6&Vi;+Hb,czk`>f2ic>VeF7جMƂGe8^t͗Eo]ܻqi荫7Gp.۽0F:zN^ ^Lc0OPOZPt‘;4 SdOB#\j CV׬%NQH+,z3낷Ix* Er "S eÊ\W17v?IiaACX) O}Wyԥ.uK]{PEn={.߻?Ý}y KPVۅ@ $/n`ɏ?0O;DIW;iCΪҺ?WrX?^QbB.JB@l夀L@!O|_umku!N|$xap!SjH,yW `LL3")"4'h8P0`Rŭt{\gP+ ,VzŶEjb^`5BSn(Zͬ$"F.]Zԛ.n<2W#&DФl$ C=.)i &#*I؜khI샤hL.,7V*8.!pO7$< :qGqBݶe.Q+`р'16T;=gRԥ.uOQ+ A>gi]R^aLi ø`,=7[To\i%qȒaݹsN!=5 ڄJpZUhte7kh!u08MC :L|(jPVt<)XwR:f8N)4 58SkCYBG\X wTJoYQ~^O^ vhƝ?s;D #7 *@ 2=hU*PՉڱa"û=34W:#$&&Ȱ4gRUu6huxÐYc_bJM'! 7vOP97HU1Zq<ץ.uK]R׹2 EkeČ󓽝]bhdžiB\͵~rt#Z|[q,!xJ)҃ G$r{WTL@7G>(amyW mܝSbEfH> Xhl۫_9y͇1sqmNdʶD<#M,ƎiC k,㍬5[)w іx2 x܃2` ە̱$e̸6:U,>"fpAZ;() NBkE*\mсq!#:,F[u PW'5I H郲suCws2vkP19a!9,/4k}/p̢BrQv!̔*jf*%AQP͊aR-B2Fn,L:^t$Qn^?|b4f Ie^\Zֲ϶t8mY-co쭮n_ &hd5 4Ul6NzSe.7&IAo{o7;/^߂~ti+gϪ%+ Pke7crbl:nƽ"Z 4_?| \FPˆ)W=j,zq>LI6槪 *s#whn=4/<V{+ MYv0G̯Lmy &~32ˌ8kc` PM@ȼV}2s{S<ްf%s a3]LRr☦ 4ۚi_[.{E.~rrjv\FJ8vYV:.dV*N?ngs^ěL6oz vIK/nsÃõ51lV2`({<g&vٝlo/LX3TL;TxM$#\K-L /x+Mltk"/.,HIDT(_1c`|č3僢#0`)>!CSVkvĔt9qI:LcOOjeUrʔYܢ:$U U9TJ q?l[pei(ǔT!&ߴ1s4g|́wuuqL)FHq$<` 8? 0K13Ni/HaN+E+OC!V휡a赶0W-ߠ.'?9 '%e=>hu.3tss3{Ek89H꜊qURRRRRR*=|_֥-ZP`I{VX!=\9g@͚5 4Hyo{3I«W^yeWWן'ri_|1\O'/~綾^#]bB+d/^I&M{0r8L <]r%U??;'<Ӕ|)`eڴi%J@P&B^x!p>,C .yo!2OEK,!A 6̞=OY+K#p X-DPࢋ.jPǥKҮ-[̜9V~0/~*o.}%710? o ,Z{K/C`>ee]nҾ}KI촥 jj^pW!\p'|N#2zŸUcCIIIIIV\Fr]2.+|Tjbuee!}9y LAKP<ʫddȂ7|̍$ZA@1V% )D1K arkiݫJ}sw|AIu/nݺSNٹs)w.K`pUҗD *XxW\s9Ծi&n_|9__~eD?9-:o<7i WeXfIRI.9UBxu~k_7n(s:*2Ƣ<3uT^عK6yn 03π,ρd,[RsVQ@x ]]](P;{E]ve@Zp?riZ!C %0("+$*+B[PRzWȲnh70Ed7J9ɽ^?˖-XitXR@bxL2P1 s ^*%i +^Yk-DX͛1.Cby2;22B-R|%*ϔ 裏@ HV֧"t)82`CY &R' іAd瓇y(XTRRRRR,~Z2sQf 7ɿ%m֬YedE|HxOx≼,RbXf 0 `<}G.looAjB2B};9à,)ҿU P oIleƍ_$ّW:MXf:JjLY`_\8#;h--ٚ3呯F\~׿u|r0$#,Kb) ˁ汶g"Il9=HZ*LXS2u8ZZZ()þҥKK8b _o!˴Š1ڵkW__n' $S2?$ر&E"sX1JJJJJJ-Mz%OHgKʻs5,yI(O+[ly@IFHj~HN^ L2/ǚ3)\7._hxJ:iu$y|3fp\ہ*ܾ};FzիW?8C[+_ pԻgÆ 2b[L$M I2:,[K*}uh,Jh1nݺzHj=N LlU"ۖΝ;%P5:׿&~:~apM:/qP#^ ?aGVq- dt}3̹< *vaKcPۇ͓%`s۶mxrԩ? ꫯnڴ^T'ǜVGb SJ)))))))A,N'I8 u̡^@0y撡LIJk@ҵҁj=p5UHN8*d".2bNjoo~ӧGpr([|矏>Fz .|7J[[[H`> gd Rm(%w9Bea b8(r ɺW.<֬YCx9ɒɲ<*Ka 6DΞ=[(3'-!iP^ֆ/ZU~iF Ž̃F Y_~޻8yd`]m AZY2O] &gGW\Id|IHCG3WUCܛ{U%%%%%I:l9KbI,vV6t[lsB |+o-ohjË2 y|_|+yW]uҥK7nxuM! /o/~WIX>X21NHl9/Cÿկn֯~(]*I^# +@4E$ke;pCi>M7t)@i /+O=Բeˮ ͙Id`vjx B[[W&W vUN6YfiET7`q={6/-ODRB`Kv1t@*%ԲRX6壼imm5v |ɻw+NC()iqN\ԿL<.F@XrRUPRRRRRRRR,jPz0 6͂3d3- f2ht4JR! GƲ'ᐂE%%%%%%%UII 淗k앭 Y2h DiKa_д,*)))))))JMZ ,/h*X(2=R!/J`*jk,*)))))))rMϲEɎ+KnJdjhV ez󅢩,*)))))))?j0\R[ ͭ pE+3gc?ZE%%%%%%%UA-,+ϘEӅ|{g{MozH$Ҷ{wkc^ȇc=PPIYA`ۼr9kΝO=T'k"{+))))))))9r9WhZOOϔ)SVZUyUW] oI%"BZr죕. P~vtuNmn;&J`ll xkkk3 Um "^a`X cwy[l!- H :$PD o_|kϺŋp2ςLG?xkkk_Q)OB+#h/Yao%%%%%%CF~h<ϧe3]{vm||+5ƍze8Ig2wM_*it0\t)9=!HFlJ^a2-_Ac5 }w777csٲe*06{oժUV^rvfu0BµT]bGJ>P&7m4m4Zt())))))}fehbR$kܼkΆ7tS}cEZo axxXHQsd.##ŽTe`` l޼[|> ;h̆t- m{iE__VWW9=i G (Oǽ!y{)I8ۺQ^fw_Ǟ7IX Mz>&HqO$n]vAQ"8&`XZ1{j$ wKv jIg9 x ###GeO1,RRRRRRR:^ehI"0YMCHj$,ꁾwXd0=a StxCΪ`0(< $Ɋq)ܹDSom2UHW_>rniK뎕h`(-:@a ''H@]Ghnd B@.ED*)+ [(udbr-rFU{IkhFFFQ[jdުU⍍7|@ 21ݦ dSyfCXMTh.P,eG xVT̹t<5t> a fr%[EXmPJh<&d0LP*>_A+)hX+|^vQ =āJ]2S=di2b+C$TFXAX,66Tj4$õuq ['4v%%vpL?%X b\$I z5Dg3EX{Fie ǠB*>vRn%%%%%%Ϭ %30`6Q.`<<wuyMe3Y{'Prcci3}T6x@sKcWWaj?! }B{{ 7:*/LilllkkIppOCCC۾ƒ֜"l({ NrP`s-D6^SG7P5uѱ4Pߘɦ+%#3fعs)S/^ ڵzJj%%;}-:G2H$H>o`OOg"pΒG౿vZ^)o~C]=C M0K=ͭÃ?yg'(/Zrk4Yl{X,|6S1ϢPjǖK"Ȟxԁ ehW</|I:{ _9pPY+s2hPU(U88I7'/8y] nQ_[ kw\`j<8{l)^]nGHBɤ{bI|M6P(ok6e ͯjPwD` 6֨R|hˈ3 d\x'STs3Mza-`dCw (πkʝD,hydalmmlkkF-B8`0͛7Lns Cudr2wJHs$g b|l4Ywx7g?zQIIIIIIZ+4gqժU[Z*Y,,Aٻ}hTZ >_.n'ڢ/,2l8κ]H(wtTɡH]b_A@\.7ś~{5  56k.TEXd%_innwsC#[t464TkUTE\5?׭[d.Ajy"WdžCIt*֞zi@+#FuGM2Sꫯ֜tpX<]{>r,JHgT(>I"s0g5~͚9iھF;ϛ3Ew#VٻoCTwټy34,c8knn6<~0Vj$6mZ6Fù(75IѨ_{I]׬d28c% Y,|WJSLٳ:yg?z}`(Ih0oksI'uttHY}|m?{,7edK.'~zIYTRRRRR:4iAQ@P(dlVC?ߪg][Jҳ(it}LK9_8uJS,wtvj[Qg+ 7ܰvZ1OfͺP.'|U`C'RǭVK/l7aώHh:s=BdnҥKO=T9˖?RqɿņM0\ggOSSӏ~S\<O&Gѵ"Q 6YC v,ǹ\n͚53-pc%uDUY,*)))))g ^_Zr$vmu0YgC,j h( $G X6pޙUw:E"B B\(KB "rՐB>PE_ZRPP+- a1TUը*Ҫ-j;cxz[y=gt&1ѣsy.~]**755{5NMe{(I\yz]ơy#a 9A親 rX@u`io?Q Z*J$j @ v x^~etAGU4ކ~hI6G0D8˳mdQ?1$:yk(4hHz&#Ј<44kyqh<=3)YiWDn]f_М(&&k \yԵ80bBmMt3E9GVF뭅qFG*KK Á5wMf:gnn+Ɠ@^},L|Kv|?}W pc;gZkNcy׮]|l)'W(>z^z^y4T./޺oGVzݭV0J Esvv2zv_#Ep`"O8>xls$pcAQ/Tk&&&&&&;Ia*InR)ogq͵׸<ז󹥥K/7$+\봻 E<]rN`Z~$Q0p={,-- 8]-rmY<ŵZm߾+OOMn۟/ёn4ž+5jupiS  m#G0,ܿ+qNOxyfj*+,q}Aڸ<`\.sIJ#dIѱ^Wvu}q%#gVGqNQgɣGh,ݠjss_Uupw_z%vnxGݲ4Wo'Yj>ANg9J(9ɓCd\JIBgF5qpM Rp$YIɦ:~-\ErfcA²9[NbyNv8E) m %EQH9wMMY;رcxwyyV#ǍA w(6>>~)&pc IjЃ"@@Ixkt_nA(o`1V`esv+^34Jp9Y&&&&&$PT)w{]%=ʕfRWegqxa{II$$tHD~F$<.tC8]t&p YIF?rCY8MbA5]^ Ad(ĭGZ5Y#P+G#Q9,jqdS ˂iiRrfbRQ4 q]F5Idh*VQa}upF"#$#^ U(^#@rY6 ix*pi6uwB.9IJhʉ,*\*r#/+( &( ~Fh(D| 0ϓeO`g4$6S<ʼa8rcBے'|Fd׵IF?8 HY7ĴLm꺠ܲ5;ΑP%8.+JvzzU֛x˶q Ԡav۶Mpl3$4MSS UQ$H2ET#䀆DQF-$> NMf6ۘ@&/G^cS!;dCE]ǁEuJTomj{=r.0, g$Inw1+.)K=ׅl6fA f.,;#:xK7yQvVZRPed;#m2,2my<<A+4AQܷbP(IxO<)bgl5q`b,V'R B ? KV& va_$G[>,Č&(3 Ȳu"Ņ4i^[Qʪb90tPky~z,[@()fcZzƊCit{ BI30:+bBȚqrlO7TYDYd[%YtsgGFFYfeYf,L¯@ԞQ -NL+/eX϶Nv_ջo-(8wݾ?_,·{םz+|/j54Yt<ϰ Ib=Y_)&"đ0a%( Ó?B ,r|*ÝbE(1-y6IC !^}O3l ;77G p:eIߝ;w欂<8 mlA0&䂗3feYfe#kr IapгMcG;ر W{FG*'St;"/ Z-ߋ?Ph`gVJh0M2|2LHʊgVT*X 5P&ohnvOxC _Om5ilH[nH\m1 caa$7U˂%ik/v^3 )'82L$kyE7&nv 8::*lMQ@# QW{ x9%.pO$\nqv1IlgKY֨7tro%% 9IUݗ;3,YD1|"I=@ZX3{_&* ȃId+ֵ=3g|ϕ*( KOc9-z6BPi?qv7 *k3vZ]]W%Aĸp1s@.Ȑv \xmǿRM^_2MԦ$2,2gQ:e qǡ\V:v?v'$>q&^.jL:+ljB OyFp ]ORW2PxB/$gYIE25n6sUT&B*$|z!/3׋ mɚF=PŜnN,~䛚I 6چ"襡A̡ɦP9 l 0x}_\w{b.~\2,2GfU[Aܧ7]G5{r g~<1mAKV֭o34<$I.4$h4҈$IUzؙV^|d/] O:NP ٍtttn*aS1;;k׮V$UUao3d zQ.kZRA9EZ_F_ Ft!DcOnzCE)0111111}.ԛNk~'оhRɛ"KF# CU4[za ܖ%Y\&?t"G\LLLLLLLL?a1DA|߸?> R"N?۝No,jo?7zNWr)+Ek)a®;n:}Sam$u·l^,2,2H$9KJaXLI5qRJ)/aP)zKuoN'dɱo {1AK8?Lwg}fߏ=ryZQ*"MAm`j4MQk+VRH>"TRJ"Hm*'{=~kf֚smAw֬ofo̚9+y+\6ZjZ~I4MBqUSm{iٳv,d7eWS8m7cGgk!OPwa &~ϋ`uz"H"E)Rl^}((茗/tҩ\xIA5i6)&5y;/LR?߷v_)$ws.saH"E)R:BCėĊ$Iǎ] ZZXCy=Oǚm+'\VQK}((軘RIUϿ9)RH"E)o!SauU HشmXVKK}.C#D(>9Jp| UZma8~8ˊ^Z4RxYdg;/A,W\ WR^at)RH"EtviyAЌ7M6 _}e1BFl`vrlf<5bRV#6t?N1KRJԆ NNCۮ9~FϡHg)$|Q)R++]"RH2'Us[XL_ݖ\r|Ϧ^1CXab 'TZyhpسM,)䝝hcjy#V45Ժ%Ye2sIN ˮNw< nWjm9+cx,I)Wn; nN3hhYbն]-FQ+$.q_^vWêhq\50buqZL~K3PD?a`N͵MѣB81R8RLBIٳ{k͆c:6f{dXn(b١?}u3rۍ$UX5X]Wr:2,6 k_;0ZCWlu>TXHZnw5HETU N +(8/0ܖaECx8Y EƊFp|w|ZjivD)!T4è&UW0SxyFA9dK\o_lmtZr 7 h wpN)m뫫zmGay`ee6CRÍ5ԳZ鰖$QR%F8nVBAM U0(hV1h77ϺͨhlzŠn;dhƬ?>D7m]ʓߢk'dQ{KW.YTxDH@ަ70bAha3R1,O32mde{/nueyaWsZjϧˉGqHLqkd21; NkeeskiH;++&(S%.qi<#i꫇q;ӑaYOU4 ]§iʲE\JSD!0+agi݇-ǭGo['OЛ:eq"Jc Qlr$Gu]L0zF9陧 +_~u<|ɿs zӔ0UGE>IO6'UҤOͪ/9ab^&FuZ[ulk~qCu҈M>7:!Vo1wykx>ˈ)vs!Zj߈Fnku:v4s׾vcW_3STx'^3j_7g3V~B ӟwT|6l5r?RɎV\ۭ]jח8pAb7Zͭi ZoV(j5^TeѬn~\Rr,D ۚ ew[1&e^N ˟͜wo>ߺW>_?x=?ۇ>~_H%^:>Scf-dwz-E{_^ҵۯ4غ#E{͗@"ƪ~3p%{h:=q76;cZ_;kwzvO>Q~~7Zj~PU (E.wk ae?B8 `K\  J"ԲFJ 6;}hpFPqRv@iZ'ɑXGIE4sM ]3)J^vrw)v9|Q|7{>zݷ::*vVՁ\*BPCux(-ӏ0S4}??mY -F1Ä %l)P q<6K=@sP[g$Kr%4+O<YoO(e2dzqTQY%R sVT񋅒Y*I |"fl!~V&RƌLhZ(qF1eT :k<Ni!Κ\SX2)r_A.,ٚN@'YHQA&,5#V"μ>E]rA((W\L@X%yLa<=r E^(~uT;/ȂV?Hg~-z p{l;&j@ů #,+΢ ,‹wus; E;d񊋼D#sͯ<=1kU)J'R@\q5 ū2>A;穪V,)Ɔa~/8= q=PRvs8ҋQpO8Nm}sr1VxCi0O-XU Ͽ{Q\;sgQ@$,2B"H"'׻ݷ߾ze`0`I IDPܹ9uݿo!,ѥԜ>u:]]%bn'=أᎯnقr]R%b׵>d(QGi:v0۷^ p? 'j H*(ݑ%>BneCzBzcHB&tuG}9V+&?F󜝻?⊫6nd(d8۶֛ OH%%)Ue(w)ެ&qs '$ '>y"y9s-[6u丹s;MUcl|}Y~OP##C /hMj!eA}6}}͛_AΖT$ض}R%AyȪ_,Z9,1 62'G 'E10"^wQVhz)ReR?eڴ#<|U3go[_Xend%2Y$ ~wJGK6?aˆGL;D=p]/?'?1.+n@(C)9ۑ!΂ldzY݃o?֦sLD0ju]MsZ-;.R(Wa jiX۵آ,pF,"V3)CDc:k/o^ȣ=Cd/ ҁCqp8y)i-V;TLGý*prfbq86"R@ :ʂz ߀'D9v =mۦ T+r&P wrvjUX 7O82ƛ[º{+OtP:z֗[T]өՀѱ!$O@ z R1fO{g˫ /:mtX޷^}^y_ dR\)DhF9*qVMW@;*Jpނ3Q ,?>(t ֨A 5 4Y+/nxnpz=j gREzag> 3O9>o~WW@2DI(ԯ$CZpK宥 % v+‹R+&J|8{`MX|TAQIqGwU[^#Zdx@RcuX+#։H@!l4<C޽'O1fa w|1J@` xH@C??7-ڄ_Ymf-[:i[Mt-;Z F֗^. ZY<8^\/|Tq6 Z"(hAEۈ!kXRqdweW}o_|_ڦGkWz;JzBR.SE&XDk:ѷ ~7vDuSzwo-Rь`q2Ø:y\iS} e3ߓ6S ϞyNG [,eҬJjdFd;,3,M^z1coF hi(IҲe+ovO Ԋ+Ʋڵkqiɒ%J789{s- mru֡ {۷ydrƍqK(wyyS(bW)r~@ĘEѳ>ͫN1Kx)9{R칋m;44tWiӦO>lk۷/JҢ p s 믻N֎k\ٳc7oxS'&(={[T*+=WN@Uӈ`/^ ĉW=dqd[|4& >qOV;3'{{v*ڕ @??pg0'^L *J|>*p¥?nY9眃3XUW^yBx}Gh9sʕ+c4*GGP.CltR 7}7e P0}}}\%;U,<4P::-#ћSN9ͷ64mѢEp͚5|0e۵JSO(! ~⩧TXp\b_竎V.\eQPEOXVɢO̒fptq!3qڦ븞C9Jv_Ed%*E>RA& <hv{z'b=FN8O> SiJMRkX~uG}5O>˱%\$''⹋.l%1~کgEKΛo=,1q Lri'Z9@_)\:s0 6ܺ}÷k 5u@DJ4Cbx$ dO? Wd)qx)c:$QnO۱hVoZwz.l?bs:xH7.mahyY絫z#<ܳCNۢid6RENө3(Î:@@AHk.D6},@@7`qGr _z'=moN?Գ|,Gjx;w꺵Ysjꎻ:H\~uy oaA\㏜ !ϼrgD͠ `&j'-"25C-;3Q7: B ۾m%O:B)pMoKzl8, !!{yӛ+]P#@q9HUMX CqK\$!6pKAD$ @(8z&N8qם?fԗ;űhN@x zR>՛3SO9PFXmxok>-v.qy꫾@m}{;Zf 9/|ƹ_9w=<ȹpJ{ 0 d G9o|<~Y4lX䱕kw"wд Q /h$t Pzٗ ~Y/ wB{ X⢅etNi ejgt'F,#V+ƽRoDXK] Iʵ:<+'Ēޖyllt1tON۷m&=RPNH(JEGIR=c#E`8mjjZv,$<|k]"RW ъUs {h ڠuQ(fZiHMiwL Ql"=0.+W,#8$ǽO?\,\0N4*~"*r< :RnS-E$3jzgh]W!?nkR dl_ē;ExdU;8Xnvx@F+%Xa+ں{瞥-f݀U`nRQ1$(!p#X:T1Ըz^=w߃F+W;cpu=Φ4|)ʜ,BgN 8co嶷wW+ԇFa/ ศ%wJ MfrRD5A)@euh&X@8@vCXV@ܳ+H$+^ymvC7SHj퓵J4Gß}ZOaw-Z02 !@{X)ګҐ]9՗6m>}G99ska*V)U<2m /njOV[i(81c&FQ.N&f ^4m7J^t$趢F.pi2ZV2:H?H?H"zۮmxkڕ]COw^ex:cbD.w5?M;zDr\Dof\itLED/b;'m?#rǕeDW]u)ddC R-H@bV&KkJe| $\c92M< x/ ӝi22{4瑍GI6 0iV3 %dhb #S>GF 8nx_3l;~ݴ6VnjWN? -O۾g'r&c>j0ȀUhq+zKHie⡓w0QNl (s$m"sS2 qһ6R!']5%]\>0㝚ոWJr ʞޢV`j.V1j%jA"Y{&{ꥧA (fJ}B]sd[;  FwFzۆ?q#ȳmx8;U Ooz{ nЍK +yn ۠Shl!OU->̓Aph 3Tv0Y#T^S` @ >'OBh*Pht$RFl? ,4ȃ?>R/Gcӗl?[',E@NOٸ4Ai\&C a1tlx,?Gů +P!3(ܠ7L@@=#3PJ0@೷6 ]]}Y~ aásGf.75XdӾE2B͝~,1@VrBe2z.@0).92H1CHk0z2Cns }n@g`Q4\@ðچ܋PyW^l.! Qmxvr8M֡ؐ~!`x~ƙ,G {cXm:گvLܻbܲMtOkRqcZŃ/B{Y֙5k(j{;zQGߴ-At)VG~@U$.9։G%xεl-dB01Gs6gLOUkSkwJ6Df3iJRlF7e]\GխN]<$BoD/~,mo#rKlb"&)ɤiQlVƟ#  |uƻ; ux'8Gsrm$]V"m $c=Z*gs{Ft@߫(Yg%JCo4]e{Tl9} 8ʶ,QjjCoZ'oiӦ I9樶C񴤈Fe#{;<,J\9`(ǵzn=M^xqXx2I;pZZ \8ri/;bO?9o-9 Pn"*ZZLޞ^pekdxy+>w}dzҺn$ 8}!;BvIL'N4<:$3=0ܲe7RtEDGVVH DJ&H"dScU?t:j5XN&ٸ!w\/UV, HU'S FEQ4\7ۦMsN㲽|{eajɺ40rkb!EəZH%[pڪ~Q"plR͝{v| kȯP0ihA'0 Pw % !4MMD Ú5kPqrY{9"'M\s;`5įN[lYV.]&+~h bn)NTիW[\dyu7eĤrZ )j ?jЃZ2Ѹn됰ܨ~) >RmB~/9{{W>sh5ҬDB/uG4{X+Ec+W.(R `9fܵ/*ZD^JLMHu2[Rqe"lZEP-aYq(EtjT.#ӎE{LEt4.:ezxͰ4Err%W&g?&h2]fFcch )˶ _{uh< OcBRt]twG3$CbE/F[ C,d%N"/i^DBa(FU8^L  R5_sgj6DLddx:7=EHK.r#dC7sDVYC4 *JW\v-5;3OZxTX1줚k19PZ]g؀oXp9՝?q:gdc;,| L C3NUA&/ERlCS_dPKV0 -$d۝Px4Q]ۃ:f$F; 5ZځhbH7DS-pcAy8 Xʣx$~Lu)^؅š\0$0zAKp2l\ E5kX<dvҔǭzIUvڈEշx}N9"@JH_[dzJ{nMī$"HyD9 j{y\]JD$]v maw}R([4SJJ}_rv+vGzZe|岞CyFh dZ=텕KlX ޒjL! Zi(,GKH@/q/m X`OwEvǽcB#O2uwȣOnܰ{|8.sϾjb^d!"p4BB*$7ڝtZ`<z֚?3?t?̓QOC^Y_rľZm4:,!&%Ayq 2ݕPqΠjp\%#28`pϰ9qQdQճ V`(HC!q% bj<v!s|.:Bxׂyg\z pY+_c ]H A<HBrNT#{GHh?.k˭:m juW7Wszm[~[֝_z6vi_GӦ -hosS/lN}MH[b"Dn{O=mхh4OG6 8O6Lftot5tf#uJMD;92hxձR }ݲM g-aY}th過ɼ?Ty7 Ų$r}W/1]ʋdئc;vLQ=/Ex({%'A 6}}9惎ѭЭ?+f~QU?lǼ+bDeb?y֭~ߗenA,+ɜy晎V[Qŋ$[oMūT[d2~)E"d]4]ozګ7O>6xɱu\t%H߃H8l߿!F4D"&b!6d8Z|.Ѯ޹m!3ѱxrVU_RY{r^`K^ۗ,9/N4aA!o6vď~?_f׿37Q_Z5޽{G6m_tJ[>h',kuǝ+_+G |[X@ >羁16lXx^@>stȹdɓg?caѢs0. ?]~m_s5VK$ Qw}7FKA _zryժUT +JOOidSNdux]饗'7|ԩS/W\gC$0ي+^'suWJ[5='ӿok瞷nwNa x drccc֭PoϞ=7pT=ᦛn:b5\ jR>?p s7n|˖]A[88c4u]ϴl[Vj_r!ZI'%=4#r-]vY"xG@9>V\i&Gq֌JsW\~ͿŬ>+w4_( PFGGQ17l@|r՝iYyK]>w22<%ISϛ5R f͚h#A #v㷿Je=H |L4y̘ V>YDpGf..]zҋ.aXnS .;df_7~sPiZV~pM#!l{=nqHSs^dn`&M9_]տhKֿ/kָW̋-At&Lصk _*4HbDEW"Rw}V:E@.a,͏tcc%tGH g>

Q \FAGuԎ;b#jG@shFQfȉpq8GmXx2q3}"KI zН#89#Q7zPN""jջỖGOٟX7~Ax=`qqv,AE-ELB3‰űuD&G>$ ωۺ0CEέV9ȌmtJɧI R*AL.J%JR6:V& p>B4X.M^F_zŕ,[' wFӄAokLV)L&RJYu.8|[`Qa7/XDP^bDϗ#9rV;1g,RhCAаgϞ#8,}&LߵkPgƺX,L2mll =24(їj5 4 Lv\ yGYm ]8?;wF$㆗"yµy (۶mCpʉl`m0Jf>̞=te=O?!"ğwF fΜwވ֚)S'k, ;؈E;5FuR8" H.aǷ'r;]³[Cf(`'@ q]'KDlEw;[{ B@9V(!0"~\.!ovD4 9Yx8Q0zUWA ֮] OmƌCzd2!6pSu +h. 3B n`X0 "N&} E;/a!_K0KbOIQWcQؽkA$C ږn62>m84(C 0n}㌦)\gA!CB*>6"m G9 aۄ˲"jG]{ d IX+awKb^FyE-v̈́:.D0(K9ţ1^NTXlP8Yl ԪH> ЋW{%U9S˵J,j&OF3JlXAMYfY݌U14HTZiY.}e{YN9l!fwBKSwp22Lf2\wF&!ӝq%X=}p?*c"#n--tjq\'V4遵/?xfq HDS&A"Es"ϜuĤ.o>6$8bɱ,ͩhp'?0å6b4˻'J H%Tok&ԶթdvBgx.+VuHOcޱ:ʍ/ L& ͢89!DRh/#962VL{{'@I2gTHa:J7)a9)0  Wz<4sm<+!զ7azfm7`UNJj&мb+Rr<=08RS}z; U<=&х X`jXGMd@LfNf$'rH@"& "J7pƁi W Q<\ > @ V8(Ѭf{GːԙphG5ǀd]4t 㭎53JViXGTPTՠWX 'gr@#`ohJRp2 8 &L1J,҉f.H}XHlGLH)R$GV(ׇ x|bT9-@uT_W&B[ Joh.&a&1~=Hr=\@ | w-  K~tT:ZF&|mG_|q #Pvκ mUy8.~a[#d2mg ɾk/ EUoV-W1<4)Ft=&Ҍ1]c2X"xK 7|d.'[>I1X_(VD)22}ҮBXjk[6v ʕ[>ʼnr(^TNqt)H}P-iǚ ڶC,P]ھ[/}Cu Ǒ 逥=iDrBs62Nā_eBAW/?YcF@B)jƙdkU 1pns4;=9XcSL$"j'sh__K>> {cP:%ύm_i^BC+IMbJ&M5jhחFqDTnx ȒP,* 3N$%4=Yf5IRM^Ѡ:δ)H"mN/!_n"!.n'G/izdĐ$X՚X |R)ɲ(R)P 4F<&v4޽徾l)-$T _1"x&ɻvi tyNTU zD%B'OV'Zm(2B+v<5-;m 9f| <;ضHu5L[`/&1\J5 K%V1 ;ʎa,mkωzU,7N~p3L,+ٗ3L˂(4^Z\fhzJ qm _|*(N-|0lUЀmvpݗ>,s66D}Q iRNQ.皑T I4-jz4+{U;\ؒ,t 8˟Q-|c_EҒ0岺n .Z{rI_$B =Z.(ە UL: /SFv]MPEnKĒB> ;,j6:$ j( yIرAj3mcLiɔA\"K0Y-hR,%-ńqI(KFmT1ǥpmI]&m,A,ڎ>wIyu:hdScS hl~+|SFrVѡӧpTT*|1A;&; ->LD\pӓN({OBܓd^O$H,65~AlShR8*Q ˔E mim73+'fKU,Æ<wk-/c Sy/bͦz{{*v$s9|k/p Ć[V ?aɴ2v}R[~0}t۵ 8X&RZ0ZMKԡCTLDBMdN:0npp@ #4ix2 -pH,3' z#[#,AxU I_n 1™[阎6(CGg3 Y'6 hh#cHTTFKdh"Z+Cڈ$*3z-L-h IR8k-"F {lV%[9.l6 "e[6mJT:g2MljT*=Fj+y/jLcWG [PY86Y)$IDtF0"a-CU!3*Do_9xΝ;'MLJcYz6x(]L&invB{?wd49'/a= o@ldmAWdVڊP]2 g!iaN#lyu;}&{ЇC3 6jըAAǃiND޿uO,< +̑$ w0|7H5L-^Ҷ]II\!HӂO\5Nx$X}єZ{ʭAP t dn7ο@0I!rML2İ/aKm߱0 >硵PD8 ?[.J[~lR`dm!2&;(+ԐQi -;n<r.M gv~'# БdAG Ýl>f\  q_?n !VJ>g2Mp7K !EdSX#B̸rA)gwn1v?r9SpUl|Yí /q/ 7(@HƐrahTa0J>d? @?|e-IqL q`hpNJȂst2O !a8-!:e ‡-bGʱ" : Cn=7j8ߔLDBd_v4ۛG}HGG aF(8  g"/n!D2~!ʯ*B?S0Fap@/ƺ Vp ;Y #FdWˁ2q&-wa3n ^3h'™u|=p47P^<"vԵnI~^.&sk}&: Zr/7hhQvlkr"9х"sT"m}8>ϣaГE9^U?ןgQDB'ΑØZ.y?ORkŏx<bQ>u=pCRSAb 9|9=  qXwp&DAg~+_Jd-1,=x?B^_z_}؏b^IS"UIebf)tlΎ&Ӊflar>EV7=%)ٱDY@D)dKAW3Cd!t5hգ'h4Z,99@ ,y֐^m@6": !ghpdAPEqSR,2{Q,*@g! %ѸZ)U/\Қd5uSH!7̹ϣ ,UQ݉D]pPuh?uޗwtٯ;OrNnE%y WeVO[fڇPn~X>?wO:[[>} ͑ tQ˧ &\w Oh-*8@0LJ(#|ШvwM*uYUH#³Ѹ"9(Ջ#KCɬ?@ņ}llQ>7">zq]5R ыjP~^_~aNJ 27= nnwj#ϒ?/ෝSs\6>/p $5a/rQO&~, ufA0!GI+F>%r_I/mg?R_@>0X$m_fAhHHiz^|^\}{wm|}W>ˏR> O?,ee}0M#3\Z%.5 chbZEQgHn~Ow؞7Q}A(BxAڕx.rL6 Y) *11"8!E+P-OAd:d왞sW{9g2gSzzjTW߭Vl%4w{ccm6Kқo yypKkkkkl#usBzE/^qh4 ''6SpȸjLݳ,*MPNvKo۷kG9:6f:iשOjeo7z'^XL`Cl[0\~&‹qhmk`{@owb9T Sҋt\3mi:s4M@='AZKcR<9yo_,;îҨ!J?G{ SO}G}k:$Yw>zѕK_:S{a61,t(а\=#I~/yf[Q$+:3XA?<,Kyi9Ѕ\ŇݻwOߵlv|py3gθvJuJK̓WinW+mvuM[u{\idߩσ"|>|ԴMeIDIsdKKGĵHU$as\f?֥J Bzn|AEA|;^W^־;Ue &nHpunsP Ry3 3 usNr儗Cg[nmY]EHgU*HV55t ]W(]Oq6ة\.K(#j]ýDZe< k0+NNº"EO_ {jͿwI߭^R%F|hNRP"*;C1ަ3%)g/< 6y @>v֫ X\.)>kyu-q[}o]9ҬT*Cp핗O.{ ULsIOvϖߺ鵖um61oMzS+,=F_ndU.ǣ]ʒPךͥZ򡖋CV+WcQџɞž(iYG;A(] (-[k9 lܥU:)w=ga}H]Gk2&j"O̚sS!k5$JI {8DW:MS7ND3tɸaY0Id*(Ey+raj>da><$uQr4,--eX5$k/z|.9*m%$JCRϳ\+1O?a]5)Y:UzMw"/ bP#'Wʗ\O$i7e(cO'8#>@J6@TP" t ԄYH G}Lr`,#'-#gtRw| KE:BȹP2K6j&u(!Yc^Cp5ɅV&cb:">K+jK4tEPdS4tʀ<%zDT9%Kd}kȏa ́3"R.5J%h9MX3Ke!U tWvQ%;uzePV=K_P̀^a{ԍ^Lvg% aN'%IkeNAJ1b9%_|R?hm @G{I?% ! lJBh\.8%cr0 X?4ٽS z=|Yh2}9MܷF{INJoSj>8@*U)K+0b@oUZԪLH@o0AܺƗD[߽WEjԣW RBe p*0k]D,*RSKG+ =8r`ʊ\/r2fTOB1Δ^]SA] \hWp4r#lyҗm b>dJ@S[HiAPs TT 38xYU) ԖfES폤MƤڤl: 7n0bQye!ۘNZkႻ| ?C`*/'ݣw$2 p `4y"\ •>- ۷H P}as] . :*,0"'z4mLf1!@0 H'zQ463r"zaf5i1{SDwdmWQvt#i\]9 |FEH6U 0GcB8*!eyD֕ "vF߂X@M) Ċ5EBˌ $*RJr^2=}ISrNJ@-)W{ DfRG(^Z%2'i*g~Ƹnrk顆h9Nƥ:T0WSzUe[yFaR =ۘT/)J`eI+5f3N \p$'YLt+%4 wRmv$9My}"ٶ 3ɲ"k NB0>@uZ*Au(Hq.L"(A;:qhzsfZQ¥$%Xe8gm܇5kUL飧kS|*/KKY2,e\1Z(.g -jiSp T*^]t89aZDLW7-7w%]Q|FӹA;"N+/'{~gDqjxwd,`Qԗ9{}Am{g5vww{6WՉaン0J|,rpFI;ȿ =e*y~0;wF=4uI3Ӯ,E-$25S"Ϡ6 󀛤 2iO8AȎ6-4.Ɠ=ǬxpJEdt3raw% &C+"h>&Ϟ=;%l^ =O^P2eB++# Zr3qVֆ뺆NS_l`ӐIIYGL*g 6LYy{ adBMa߽gEcoj9&9yET3:|:pHTZ:RGenllԙUj x<9wL%%f<-G{{d|>L@nW%7?YSonnֹHtuF/K zI4D=׹V uGqw_ ʘmF/ʚW!wvvV~y'b04 EfVh tm$HkMuS` .ZϢ_ ISFN z}3>~d39.\ 硡}b|ck&UH) W`ԠSRYk ,еxL5<#VnF +ALקqX?ޙ<|&.l2,s;{ NW@>VNi|>3dVOdXFR&\.N JB?q)7xV()^HBE@@".((V]vEEײbYņI<{1&a}>~a2s9~Ϲ*(pX&簔< >@4j,}"|t9QGЁ%ɼ']i h4:be8U{guERnn3( !b\Zak,ol̊1 [UkjkZZ[bdY :%Yq\f-_B0@( 61 oJZ(9] bQBn+ B̘r 1oBQ?b]A.u5yMp89x|> ^,p9=MT^^>?hcKLqIP]WEc5b\ryx| mC1Uiz,9 JV]hJs9>Xk_ۋ~./n?ux'J" i2 M 02-Qm}}BՉ"Ͽf(Î?K.%q|)*r nSSKUaȣiaOˈEME%۶|S R-hjhaJ0hIU f"4'luw핛yb7dU+,XLŸ&435-^"tLEjZ Ϭyz̙1Y-\"PMR UZdGƺ `o% ߏ"p.nZ)Xmw쥽ps 5|8<ͪ*Q֙]ױ)MvP -6M5"oyW1(khTijj0`pOAQPH(Eiii(biOΌuy^{Bypnpd>ey}4Y陜8Zs'^#HxŶpcGfwq`Ǝ?,1S_aQammm>CKp*YnգҥK̙ [ :qedS 矿+k(~Tװ ,L]%pe,Ɉ)FLf:xq"YǤ5v@cwFR-[ˣL sX,5Ju{1ӓuBVt3EZ4[^f!7Wɔt]XT%![[AϲWp(\ҧe%`s!3hH@͜jʡ&&`餘(yGI[ I(*HaLXG=銨xTlQ~^[,0];= ٲIiZ:r=/bil 8cN__ssFFB!M Fh]bQ&(\sŗOb->Udf:ib޻K7iɐCڔ#I?F/x_[Z^BDPz1TM,.@-_9;;_s˸sA9 Hr@ĹPlt "QdU|-r1 >,`)+((2ej}S+4,Kؕ)[nfd;IQ[Wsi' ]ꛉ:IN[ãGx+VoٳgxAR>m{ /aLxhH 7qWTTƚ`1R6X[K8uj^@XLSa4Q8 Czz:UװTCMuuu]ƌ>ڍ .e_VV/SLŔ(fJulܖ_#DrERZ(Y$R$VE>(i] xde(Y&,cA)**B;Ѣ7&R뮻;l 9RN D*d֜y晘UeĚ={UT%X;di|.NVEՎ߳S%l92;shnIIbV ӳj2Mꏿs9m-}477VqkA*uĀUΓ%~|U\wo1>7#bkGܴJIeHi6܉SLNn0A>h  ^YE)/p̙4/Գy{֚[rdgHq9mbÎ`̊dt$ۆ$. jj&p 8[ 8 Nb]{RjDQT&k64$_SC#Wuy]mCVv@,R[#5 tE3r}O[eg@4Q1@7*h$tNel1-[;([#p4^zВ%K^]H_noi5*v[4Va !-f<#] $0:`dkzBXA&TUUdeB!|BWv !({F|P(Չ!@ D8OQFeֿpC~~f(nWom0uǑl : ?#{Z6p?jD%lp|"?ŸΊm`jDX(Mod1yDs07Z*;;T]WrJ:q[m붎Efg ݪVa׷g=qίp^[yV)j#b*!i< .?S`OxpǹӶ~߿b^fµzIvj *A8-% ҭPT<6U $vRM@|8yT@\8i.kIKKm$V~~˗0t#mL Ԃc詧Z|9&4<._eM!E#> +ŏu:bC>QԄ {B=#)iik_zګEޤd%A'%q8WJ\RːubLD/DxLC4h_q#ϔާOwP9b,ֹ|Qge᯾zÏŗ;֮{fSkkWUmFn"+Q/_|o+I#_iXM$lJ<-Eb1(^s56myJg䎸w8܎ܼF8Ժ7|u\;9딩gZzҤ^qNE(µغ$_`ΐ@8͛ 83+⋁q!Spx;v8p :Z6 @@)T,r5E(b'Ql" s_x(Nv>Y0ZvOnz:v c@ o֐Ac hL{0A!> hD)#G#2+~"4v""z/tDCES8ÈvE>**^g͚E1,#F#cؿ1cX, >?s$xDR=NTѫv茌KU.h:EJ",St7+q%Z‘޴7έ{Oh,Pwؐ |7zc޲;r?~a,qVeTVt[S `IRb! ;3Q;حh1oJܼzo&¡_E%,sY1UwTBS0Lg&# ع8Ӱ,dF])x%$f3vUVK;Y2I^O G%O#م䕻Y^F+Ca4Pl]"٤IQa@޽^`ESm Ȁ(v&~~IH 0klAdy@g=V\b .. V.nWT{JyZXUW_aZZkJME{W'_xr _NI:bdAL999WE?Gk3@h977|;D*++1ZHb;YHF?|-,Ito"'Fu0A k!;(hC; -|M _ܯ&BdƟx"(D 1D 2''Vۢ&|HP3E/;FEFSgºCUr -j0`@<zXj{Ϣua0xZlc'ׯؠɀ~ȡ,Dr={`nPȑ͢x|q)/ϔ4f5' Qj!++/ZpV3OE' ˮ=N9^ӏ3!ZdW:)jTV ([W:2xMu7P IB4#K8 ޔ)[UR/)9tnȹT2=fRЧN)xc7CĪwoCZdj LCvv pRZv;H+f۷o߹s',C +p1{DTȌįϞ8"$Xө@16͟?MIIjimLIMr8mI! RAD?Zуe?dR@,@l޼NꫯOBs'`I"%Evv&ʾ/Ak̏>XsCݸ1cN[C%{-GaT\qԈ}=ױ}D 1rHQ 0o榛nz^l+^_{5g}Ϝ9qԨQ/vl-_r}1]ST]]1` Yq 6);`k=jސl>쳍 򋯼i)@nο<Ĕo N˘вorU+Rb1Y,?TR2 .uWYYY܉8Fo͚5P veg͈-Q=+Sig:vǽi/R8i qq!'B.F @?&%K=@t)FQ}c{&UtEz^뽵dA~~>9aP8 +W)_̙Ѵ>Pg !1MwtZ^^ F//d : 9 10K赠 CPfٳ &1J}a/>DMTMy1r4`۹sqtIMAYV-ZK/{Μ9h.1{~WG},5\a,\ߏ,sa  HJЫvcLD,ӑq0}Uޖ?Lm1j!Ȣ/KfdDlJӃLMsyG P~Y̫1۸-bVAS&uSFM 96ht'~XsC ’& i+"^Fu[ EڸA;s#,dFL+d toӮ|U 3[n )m?iUo` ß@PqtnjI`s VB/! Hk߽i}* *U |S&^tC?bޓ+FO>޷ysјӻ?ieGS6CKuiu]%!XımC֗^zZ#_}ߕ.]o|̌\pϿϬ~aGg`1иgIf,$Kv3y+k6`t^pzjJJffv]C}Gw*udH:sP*Џ~"qF~`uN~Hw=3ãDL<Clb Y+۽|rr m} (@t7\;v9Cs=@!5Ъ:+%8K'!єA X|Oݻ_y=3P_x￿_~Ν;_ HGN6ghOx܉z)]1b @d2e_Nٳgǵkגt>~BI J@7|3cמx 5ةBhkfgg^yOܙ'kϊ#O: ㍰ZK!vfYr2'~oJj-sݏ:-fa^J+2tm{ +xd5$H%C6uE1BC)ozhJ u+͛(!aD2QPƓb8kbSzC^eN;';?oO^~zc88lYv)6J^2dѴtO6l4i^?#~3.|K}D|BTX~|mY| Pg~/!#clTV֎}g_lX2B;2ٙZ4@ïO6鬱_Όߏ[o7R,Et^z/*\;,v W̉aܹtc 8$ŋp~TvҴHJכ5㯺*Lõ6`NYNfK.ّϚxmފvڴi  b&x@ԏ!W ;~G㣻U$R$ q?`D]z U""iKY`zVQ3/*@&h/c;֭{C5k0 (L<|0ڞC|P8;[b1$ 9- Rcɒ%&㴆؃x([a b*P7~@$ƍ.!Xt~?qHDHVɵ8tPȾ-[l߾qĉhj`+0O~)V‰[ZD@C* 0.E{`qnV>g>_Q,وsi8q:dٞIqᥫxas^]~ Ztz˶Y|ż.j =7iqIh6$ÐV^ l_[[ V^2}z/Z]r%؈QFr)W_}5p0Ea52:<]:eFoFyHWySgްϗͼ=w_46Ms\8Ʒ_g͞k ,&խ0U^)f0͐Z pUDز*TZ%qF;57.=c͗o͔n۟eYN{}+)QY2΋h-[f+TVd5F̴dWٜK=eV_>ɞ4R2rAD "K )ZcɄLn00cƌAkÆ á8iҤ>ओNZn id"M:,eׯ) P"m{6tJ<ӕ]J[H&dȐ!/h-O}n$8bIhF߾} 16SF"l :X@Hgy&n"@R_`~!0O$N}4[ZZ/ 8Goߎa.h0+A|%2bɸ^n;3V]vmƌ郶KVt1ϙ3TVVwꩧe+>l H2OT,0nCr2%35=#5kc3?ްG7E{piǝK[<4\eY~ccǟC@ǾLl\b'ܺe3u,^WCETUPHA$1cV8;{|e%Cz++lXWoX} ?nNNNqq1E_}#GL:Ġb*UMmK̷8/+*a fH/ uKvmu촉Fy:WOEdT1N'^trW̞Dیz__cYtޢ':G{0d4u#(<椫T DVVA^h- +::Z+@xsD2X%>haQ#Ξ/S>==-(4P28p]'pCtowשWZ MM7f>cDxx] aQj^q3[do )8F>$W闙xˆGQq)|Xb-??ӆ5 3'|pw"7TQ!pjjQT^{q׼&i*HVG{;S![b!j^E:4i2vX|,--%/<.«`9|fϞSORƍ3gPƍ }W_}x kg~P:A W ᐍ '|EEEpX\ J{wm|_~%2y EFdm\ƐMNإTYĖ*6mF J,1}儊*Pg҉,jxaTRKG}0C.3 ~n((yG0= Zt)Yiܙ3ge˖au$ NjeeeJv1+]Lo.;$zCaCފ(r'tKĠF=CQ6"##*LtĽ-,6mڄmɰav堚R8T+”4@`{xf]SփFIV5OFfI9g3)CFF,nʖ`0n Py-qpa!&.Y JQ'rT鎘'5b5vcf#DSbWiԢc2 JWf|ujי _?S1hM:5SXYyəRa$K쁔UI`E$vȗtAvDAw|w, w8ǝ~~յN{tTW*ZM؏U;c:Qjo7N=p;dt+Ϙo92D)~c2dѣGn43Y"'^Z/̌⢇QG #ЃG kk݃Egr>/p v9ҿnBGmP7J^ɹY3gLP)WJўc?i[=Qo{:){} %f4Ca뭷(TkD"kW'U؅vvvRÆ yxxtW.W;ŰhC@uUhtarI 2!"m55`7X5jԉ'0:=z?5o<|2EVuժUP"oYv- E{FF… UC"L6!dA)t1MA rb K>d$:99 b߅|AA~ܹ޽{!oA_a;QQQ:Q`}b 1zz]?OgS#GD߿ǎ(AlnQt]9VnuCA(XOLuz?W{ZkE sJ"*Q|3l`ev%^ "L/͈G3̂QɋC~v5,wúW|ɈAكR(sRȧ#<,6ŭ(sR&j9E)F)R5P@Z uUQҦM=y,.yPc/y̮Wj.L}:ɻGw2B99ՠ f:]:" Cb ba1=@0Ȫؼ݌8r Νq/lVPSӖ>'ja> *z{DFF}B0_2#U&Y̬퉉%%% P_PSPV&%uaA!jA6| b4#+2$D࡙|?y`&XеK{O^k&KϿ qjnnE>1Oo`g,ר:8?![J3r0Bz[.2ǻ>n ď+**B}0 96l>Ӯ;C}p] K]lV;=,}LBF;m 3Xb"JoXF_SGRb}z*2c9jQBkj490YLR2+il界Wp֖Q_Mo.]>6%#w`3P R"c-KmdQxG2qM ~ÖfTxN%߹mH\fsysVF+֯p0ˋ[+-g]hUR;NdIKX  Ga@322.\@8~w;vD7St-=<"j cYCQA ,lji^۷"U'whP}4~Ş bRQsFM8nO: ܇EPo\"4?rĉKΝO_VvqNr6f6/N%ΤyM69pW.6{yJQQh, **+/hak7{{{ 埪("Qo&K_CkRpiuuX]( a1fS]muԂ׫E.[elB*DϠ֎M*n>gWდvR/ C1DˤC, J_ze˖g5ҥKL dFk!pܖ<{1&kg|7n4Ӊ=?͛7sss$\|9\XXu S+(P^#1@svލJ>3L6~JD};p!ٳ-9U^#o*ڜu fRtU.ݝM6Aחc/xb]P5ED2h +}&7'x5$yRLHHbHtZG}"hN^JC7f 2捈HP7fBX`LTÆu9Ɠgاmi 1ڂM=cSv9kJ 2ArD:] )H^nhI}/<r+֮Y8(X歺 O hZ,C7JHR9ـD YdLx&L,Uxlݺu4X*n똺u"%kd4M(--[hӳ x'&K4wޕGGQ[{I$a Ȣ([*̼ GAqTA@]eİ$ ;齻W68pc>~cڦwS[PI:rݜqqK 7МOsݳ{6о*e&FbwtM0a 㙝=^5+{מٷ&kݷXnyOVT<~Z[/)dPrN94rUtrNZw.+ug=\>+Iյ5ɉ csn-^M^ BOJݍkyʿ^z@9Yȫ矧dO Ah0X3UV\ܴc{xɮ圲e,pJ̔V ˼ N >cr˖iTJuSأEt'-[Q&\@~ lΜ9o>!`<߁BEJHD"'ha,RZ /z!IYWrG) )aIxB ʕ+b1T+t?܌v;b^2_Z%1PQcK# nP-ZD¨YED &{4Kn7Er#+)A/rG}E+) !U $3sql&E&hc#tTBe0chyʉH-MTGw !maAҥKE[vZ|Co'3RG (RAіUCA?SQN/YUD5?3"D J<6"BX`vU'HMH7ewK-oT\l)1H~ہMѱMm TJI s2|Vqt@1i5.Ӝ[8mxXk471h ~OFy!*CIPZ,Z1-JA%MlP }sk5 q,9LّҪ{}͚+. fQ׋`^G_{[$Ol3ǰf29-Z2>pɒD:h,Fx>}dddВFJD*=sєLDЈ,NHjjfjDk%׆CkH!1w[q('b u/]Nȩ)Q!>1 s8\`0xUVQbLFh|G\&MyK[7nAϝT;v&XcyK3X;Ԍq{mjjjqj YϖX/\%H.1bT]vRx iݺ5^LII1)y'aL_QF͟?J(Ú5k鼞܀-a$&&R BČ\"i#BԍRS?zc5;fT[[K|~imALi#\/ CԨͶ/5 #إ4XJOoSVWWQ#n&#UO!w@iѓ= 6D(.5Zcǎ9rH=mΘ1k˖-1槟~}޼y`YYf7w\4>k,\dG: `y >W㓩%5lT1K0ds+^O/{ 3-xMyס|v%L] %'sbJŠRZWZ"99 g *B9Bˆa?=Y6sg#]UϘ{9/N;MŤ (KYPL^YET+*ٴ L)x˂Z1@eV2i+ t |xQn!fege ^!S($тȎRH$ '(^vT n3"&v Ypݴqm'*y,QT物: 1 [o"SHS)*.Yju7eիaY,|ꬳ䋯f1%E:/ϲ%֦,M4:3bZscRO=/_k1Ͱ&WCUdX%NĎzv/+*Ѭn4 猙][:Xw1DKu_o/)-ЧK\KLVMBGaTS1I=JI9*Mm@?Nθӱ2e[ėP9B9gRC8_Qn Eʑ4}9!,.6&e:V#Ƙ ='8 e;Km!5W6bPWZ&ȲMh @ :ZUnڂAܹgȐ! :o~3r֭Y+r YNE7+-^99]-C}͟s$EN-KHI"xE 8`ab ,e $ ʝGhM5ax)%l\Ip|?冪Y4 =JN5v좿sHG9S;9\ֆ@rUՆ4 5bÉb.ϫUXx]XѢ/~sXYf+>{щ~)SyU_=dw8M;* WԩfT"h2Y(SG;ٌS?gyܲe <.4E "t Mz̅ \ @`'|2{3f|gxDj@zC_$ 1bÆ ;h^0_Iq L L__ iJJJL=z4$t_dgg_R<4sL>\kЈӧ>|e`'L_1@¶mn!Qc=`Nz1*5:t(Kbv| $_b)i!a+wqD@O>S5*2l4󇟨*7 >E[GrݻKDQ\z"-"⊀c7丆Rod't;pS=P6oL*5o/j$#n4$BVR~#p?~lǻ_nۘXcOW_M/oM{3hu봢&̘i"1d̬p0PJlSbKgFuRXUifnP=5I;2fxB5_WMLw:qa򥑔XlA=`Pfșd:9`HDOrss(肮N"FbkH 4}s_]y9K'O Mn=x}[3aSzKc2.5# CFt6qQ:r%+#hҽG7,Hk֮ӻ߾}ƍW WTO}ʤ#p^;} ۷ :t>[y|q " F|{-A'N!z IHgvDkNOYxiL&+K+b=^:=\鞝.Tq'lّٹǡCɭ/^՘ Ak4CЍ9R0N):*t͕*9GLN1HaCwf| &&&%ߓO>i)!`N5B#Z9߷`Nwԭ^5xy^*TRSSn)p< oᕼ70HX>}@X`fbrw>|2;Rm+va;tǎByA$` tNZG8!֤$Sk>O!ŔJL$Kr.g,RNGYMάW I&ETOD^?MWD.`9}$r:Ts gi|h_|%ں)a,.ƪ/;@d4|B0-!eV??.ăeႼ$`,+Y {a/o=UMjwĦg,/oT>֬޻U)C?ϙ*4L^RϷEgL9_eל&P2p-6 1{U96CWծ>rFѽwm1vUy:g5'!H)i6 (DrlBc@TRCԊV"4j * _xu'nz=:8 ?rQ"|>ӨffE;+{),"&@,'kd5L.V^];AWj1/jn_xϾɖΜ_0\Y1Qm6DQ^YgJKu[Z_k"gs?`QyѱF;?~]ȶcǎ= c~j5ӱWkHНZjo8K-~mrj;T*2u< aOˠ &TZ}k ac)BBo߾ɀOnx#'4?

cn~"C/_Y~ohrwff# řf MA]i.# 3r! R5M 4sQsN ER& v$ǘđSI_r>HHh4[W*4XY?m:]ABrD=9\N-wpq~},GW~xw}ϧo~{N5ax8٪+M&8T4T=k$v!r2U&fӱRqbt;n|}ұfՏ]S/:/=b}BR ٤ebǯZtFXL]Rߕ衑pXdj]Zo#cŅ/f\3kW弗NMC-ra]&Y2!3\❵Uɷ@yPQͲ\2{ >G3kܣ.,qjkN6XTzb2."5uq\/Wx;3sn5Zs'w|sG?{ٙ٬Lz(՟NgwlR%Ÿ_*0Rn91#o-/,JVp;~wU`'y!]{&5'r rѫo;@,5#Vp=v: 9p_ך:$m+ˎ;G$Zmq* Gח^dQнK vsqLuBPuw_K>w"e/*h3EmbVg[gmBh>ޅ)tYhʎ퍌 ;㣿R)ҵߙ[ܠqb(M6IH5c~;CmP,7߄`Xf5^СCd`rx#v@?y /+4F2;;*@6c1p!VfeI?!׀P̸H22b=Y]jEE~#e2yq,.^J°nԻA|b/q|//y{\T0ؙPx޽{]aƃV9H[AS󈏾e$`A[72]bouz@zp0 F~ЇY~މ7:vNF [. +6ifg当y!vmr Lm[{F*L׈*^tXl  [yUsfCNY~Tˍe}3h=1:&Z9OLd'87pW̔\ UFH3dRS"E#͸+F$$zdGf7dtɫ4@$#x6xv !Wq؍nٶK"[J͞.:ꞁ#XstQb=K<0x Yo k͌'Or-;T_,ߗ->2$*/9;/=G:?52Zp=R^¡C|OH>\0p%qwMˎew񠂂{ ؕd*ɗVLdae*LHD]c4!]m9]ַuwjZJ3x x%t/%b6}c |p r}ksF35?sĤt>mifƳAn㝮W*PcE'thMK~7~k /X;,<9兕~p^xBرc=o_j@TC7EN* daFFJjs9imTUɛ@7Φ,2۷e4+@EnYSNwf !id>,Zx㍐333ѓf0u"1&w9t, (LAXABvXa@3g@COXh1PCEVIv|2FSEv5h 5dO8e*K<EspIsӧ@7%)],6 peFF_"[ gi_|YhtI.4.ڹ앻vVsn?7P"ȡ^9;4u[.@j`_ەr$9W|zS\&Jn R+VAD4wMPv!"n(Pc4=Ԩ8q7+PF?<=x֌=UpעkW G3QK>U k ""9rʅσ8л Tq?͊XedCPMY^tRuYa8<&@W8Qb4 roʈɬcZd .L;@_aIqO&@2'ȢXWSDpF!pZI~lJBU\ĖccMnh;>oF~\Tċ矮80h"AJ zDÍLUqa=JuʯRo_NSZ}mKUUPX(8CAlf._ XFʘaDP+/@h⥛W,z 3=]U_s\Sӟ~{{w?ϣ3"_S&?Tx)n uъzaLLLvOC=1LXk7n@Xr!;*inW"b/ L`p tLĘЛ)q*UjYe*q@ՖOHmOִ;h[h09jV09imٿD@kkV<;zN^Wѹ|&6`nIidn3͕[+׳q1CZΝiַՠ*َM"ڂJ:t^-!Lܠ}q̳eja`8߽\:~tz"1 9t$KhW>լș-N8`>7cW1ҋMLrCX5 B>{v X4Uʯ8٧t>}{{އym iV(VK׮C[Qy Bi,#95 9i:(+3{@07p$rst(8ZE.@>E^'^tk|eюtgfb}׮*3Swf\B3wݵx`aa /^v Wt іlm'U^xGsTkjUFm7D&Bz;Jٮ]v%S+O%kFLSz PA>UK5~RJ`”c1.ph6tIFaڵXT_۷H7C @8f@ebSĈ5&bS-#}5ٓXwz簥Fئ fkjY *gkhg\[cA[Ti5j'{18hy(5r 6 з(vU+a?--7ꑓ5牱qݓ$0 ?Ԑ )) Ȩ}?s?Pi=\Z`r 0z 6`4,JBٳE-]Wa `e${TGVj.y<*n6mz;=/~xtG\xs7::t " 8fwATQ6urKL0vY6@m#^go1M R ^Щqw+p@uk#ɿ~4ZzjU݇xBQO~gyzhAC߹&!S9XmG˗!dTdS*UltA C!%PcP,Mu#'E\8 "ci$haGms_ؚL;S\ZFoVwԾP}"2,X5:WB^UVu[pE` ~w26yHC&1[]z&C/X{.iyC/p  X7AߪV>Ai nClӱ>Z~t6 K4;МM}A홺}Hp糟S%]! ȞEjxohPxʴPm&` ?gq`˂|F}G!S|, 5apڐPj,mCNk.:{LS] 蚔90th9<uUU'W`$ GlV|׳H(pccLzSdi׾5HSO84%bEFgqx8nO"xE,8"B[ V!HAdiiH9.`qv4 8 ` 0+x3`ߩX5.ofbV Zqdu  %CV. u+VұV#;v8oCMme:DIeL"G/y \Љ4}=`Fitj3ڴ2lmO6^hi*U <: 4,6E>gqFָ$d1^TaUi%mⴓ4 Y,پ Jl$P44Mpxu= Ƶ5: Ro 0j@K8TL>G3E :R6f)~twsIщ8N@YdϓɎJ[Q Np.ʖads2BkSҥK:X.8P F}*t(ߥ:+ >,U^Iq9sddTzbm-#6 SJJj%9 ~ĤSe<$ׯ5rKZsu"KYN99;urKsR[Ezih@Cȇ@&zɕzgʫjGhǂ#S _7={\]^^r S/q[@\ xj.u(Hi!7$ ']}ם !-Y X U\̓pQʁ ŌO8SM #ZLct4o GicڃĦZ tEJ-K;)I MPAcfѰt@yc +Cֳ!pBA= E@WRY"4\Yk6+az d4)SKד8ɢs1+H׬ vkqPN N҈H/+meSm*_mTصsA6tx܎R{Q7jaɗLѝ=A7trqixF5Q >AtBrpu7@1@. O6QhG(QH}{,RsX.QV\(GܹsvYuЁ<~`k׮q!)6(әpGzÝhæJy;/-'f`Q$l IZƈӡq{* Ww }D0aTei;ah7域rݨ{Ujև:r#xmU h0R]ǂ`,+V +_zָykiڰx~dyAj&''QU|uuܦͨSbCʡYvq9Y>ÎԪ(HV²} ˌXrƚ /#RQ I%#M2S(bRvxv#!gOtaHsJf w"r\yBcNGsIE.ȾB_BiҸ˳3XΈo ,WgQq4m19C3oegv=#HTU@dȤN- _IF6;#2? N(1'oO7]ؾ ˞yE'm^VނT|4 , }$<-/-[SzNLc MkpFVM]ݪ5u= +j{:3d*5FdWY;^.'oU  -oџ'NXYYկ~E} s.Ws/ ʀ~Nsh,c; q=߶NPwW#7xW6J7&C0X"Yu`D?#899YTEd\'j/R՘>v|imؘٖغ/XߺzΜmm}^,*ZիW @Jz0ؿ؋e-fe]..:ٌzOQҎfp>3,=oN3ܙ[Qh8R^Zi 6VBoe3AoHQ۹EH1jes( 3&HhA6^[:=Qmrh{b |zXㄷE×GdSC`q+p{&Nc'zwG~_HoԸRiU/1@m1Y^^Fx:?:ѬOe[ @K ~'7 v-NK;$$@Fʕ+/!WKkfIbfgJ aPr͟?^Hr6ZZi,~ӻF9^TQV,C,o-,}`Q~ ,UTHJ8浇wYԙؐy/#6Get(YPw^d9<3~{n,ܳ0 #Ql'&W ꜃&,DlSM9Q8HbȨ "E&+g`hr 6y Lˎ <\~ mƤ;ߖy+1,v 4" U}~w{/_ \777wmڪLݩ(7A=.o gE({!Pxҥi8c:ŷ~?g1Aؐ<:+ڄsD4rOPV"?2mkڇ~/~_'HO~\plԹ`Q7y=o~}s/^җ[o'_Wϟ?+!I_Gpt }DI$2P\:H6)Q-p!EؑpEcЂ~o}H!' mahˆ.&dui}<(T2O!׀ks]jÊ0&a +)ƫ5b"g)2.gÈb$ v~e^ fOO/ߺQj,Zɩgghl /hڍ%zRFZIOm{W$E_geUe411#3("Ž;k_kN*^(\x!0Q]U]WfVe=`gd4/*˗ a(2:l%^s-]nE#aC+o[5lۈa]]fiwmsE.0mD\*N4S<шTZ$#˰]nj%3g"4cp6BISʵ ;۩d:Jh"=޿q]=د1G$)JlqP.t\6apxfժf6N'I6$&lУGy(=s0 »-[j*S>裙3gn۶mԩvuuiU BiFٿiNJDZ)J2r/"W+ME2,1Tb.L/' ;L>§X}f+o{t)nm"o`]`۱KE&L/1NL&cXoo/F R)S^IMD̢%s_xtK+uۯ mMp2iԉGNrG(@54#)J"fG+;d$uPq'-Dy47R: Œb!劑#V$[LmX5?Kݶ`߻%O3l#e*if-Y^VRm<ޟhI8>̊RA'4lӳ-tj&5"#@D:=Bejv4@3}}}_>Y=O>Y 7nlՇ@ ͔$.HciEB>g$;7>Ddh|HqEZҔ6bi!CӨ2O80###N?FDӡ9 #!pskQÄLak).Xw"gi;U*ڵk/_K77^_u`BXfbͩIM4(!R%QV]5MfG]:(_(vbi*J^!N5׺dSn[˗ 1ءCYu~w%rܳs4]8dǵJ5Fպuֺa/8hcI[0m(2՚F߾@UA]7?SNyH 8߿n Ϯw,};>^`"oiY~EDnfs-{u5Hz'^yϝ 3ۺLJ˺hFk,FbC;vHljM&4 "1G#cQ@!qn x| 5PP@ _Wo@wzxɁ?+˖zյttK\-%_S& NW,>B8$za!*X7o;~4燮 uXs;?+$ҙ>ݭ3o qcYC|\֤pRUQ3B!NZ @]wqd}>, JR8yI@ь^~0ΨAd$}@PL N{'Ӟ?ս yN>78e2~|(MZF2?#>F+-u|vW$aȑ#tuu͘1W f^-dF5Y3\߼y_z>ԩIM$(`>U՚6n\ǖ_uxT*v״cUop8oΤ) 7ޘ֭ ] 9@}ЁZ<4b'Uf+* '85r7S˕鸼(@6%E,մL* 4t\@8,p{ 8Nu۱ʇ rO[g\yԿ. sV{N?|?1ylm^xc#uU )|i;H*C1W'3Vջ7t /*䊇>fSayŋۚ[ZE)K,`g/,EP42 @yc$M4Bc/Mw]{ӦM[\.?XkIc\y>AdQuQ@>|pU" \CR T94"@ = #LG%`'xl]8b8Ǻ-"S^@K qh/ W?f> _'6b99?g+ nرc;w! <ӰTݤ&]&dՊ8eyA-Zl x:6o-Hx eC u;].:?h:{NE5Ttsn[ s N2D::k[|qԤ BXuAz'@>#@‚- Oy,1{g@FLY/8rDq]߬{D .2D]3T$#wZVx [{h8g~pgldzs6-ĹpB 0|1cD'ᯠ+TwR#|f S}6QX|V\ =Lq`Eq<F>vHC+7Jߞ)դ&Fjϭz<' B1|xpx؈BXG ,_= bd:mTe sq40 E[TMV`a(F!QM7ⱴi !T xmB+ Y A1iĠIT4F,HIJ`fpGR1*2 T*"!bJy*HE%pEZH^UsR|\WU@:79$ӳl.P fo<\NG4%NdhȎWtXq:auLm/J1w=72Q$81L#4h4-SE=_΢j( ]ong**5X`4jFr"!~\Ɉ>@OrG, ?81mդ&J Ip)Tcj!~+5%q b$K*Nx* ƛL,S$_ǀE G#IM[1m}xy׼mK'r'5 ֓W;k[PuA X$}2 Wv*Jq/ %8"nIHPY{nN}G3s* ]>Op [ҟ7`cyy:tБ#G`TiƳ0\uX&/컷> livH^ 7Vm nƤX߭Z-۶N4 _V*b5v4#hdGEL<@R(vGT"_uC肇a'*J& pEE*)~0n~GOVJ`z\Go#^I,5?^|/|o}r&)jSu[#XHN]:ٷ<4-5X^^x0۷ᮥ#?Owl4$eYńb|W4 <{4]a5M`pJ ?k2̶;o?|̶S^_8 2%Y2{KhDww n+/[^'WQ.}{_@|Tv=1 bYe#C4cMgcٚ'!J ʼn|EfS^T KM,K`iE?:L*jŮ[M9IpD˩ʺF2OĉBQq"ҵ۵"`0ծ_}BkNEO|[җzpQ\=0v7YH-^^y/rvimn\<}t5{i{{)OOuye4ެFyۍ[nV`[ zU,Y2액V3 ۻgj}t miIСC:˖f.YuɩZV=r何_f֛> s}}C<ܾ^N5`qtka ߹ر?(, E:ݞMJmlb+TYf65? Yv^$WtaU,&vt_ʞ=9QS&X,2;; Z={9rĉ0]G֫zhZQB!9LҚ?$z{4Sw볢 &JFzM>b[؆ ^аt+Foga#E|CDpApr{P̠.d&z9ߣᢒ,> @95a;+J ʝ q 6-dENo 'ra Kox٨|ϯ_yW+`3 #S#2n*sm8km7_Fqᐒ_k]YY&/9ndQ[N?6== }? X5V ÚIVb/Q^țQ߷M`Rfw@2s^DN(/80]\m}fA'7XGR+.[h|ZyQE'w~Xnm~CGoUy`,bD_xV^矪jA*/QzH}Γbi]%CTu+^NOq 88N'`'P&,%,Uɇ;SXOUTM| J2zL9gnO3UϳG~)Ql6L ׻ *0mHiXiiN_($.Xce;qKM"! "֝Sd <,Uc>p?D6x~ѣG1!6 G~g>1^nƈ8ZS*> 0uO*N(*ʼnLdgo*aEb0onCP5$/ ӺifB689]Lӎ fٮ^O4U|&mMw֝JuF^10\/S[YbU'S3`zE~baGA<WAeƍJAZ3 59<P%F1Þ]3 MKdy Bi(ӰѨc$ɒZ9Svh^n]9~8a8YO@Ga״TnhEz]qcF}M02Co0(vƴHۭF!=ߣf"_dgฮ(8zaD;XOU]fNSJVo _|śn魷~K6L0\&RRKHzVu*FXxbPPq%`I2!~dDĈD&)b3LYM$:!2,N1#nO܊x$=.69"hD]h f+ۨJ$YL;gq@9\#>TeI]T iެ)`(8J;cո*thY,(,S%L)љnEDu Oږk[7XR/LE Pz.XNg[k07%ɐ vjҬ8aqjJ Ual[TZE@bWpӳ3ֶSV Eg4Kl D4R˓ܭSn"͐1l&rQQV~v /ɲ~FEZ0JQ%Q?.VU*;'eg`"t\˅E8eK0Me"h^)%<ӷx`Q7|k}l3y.s`;K/aup~&rtV^ IFauES=XL0w36A QnT*VWWLgǗ}|.?#=.6,iQ̘eH Y[%,MTA䰆ʯVc2ɉ)0&i@E_I(y"MLqN9g":MZ4c*HƑk﹎SyE9…m~0RpB4<ժFۦm\Զ,`w'kӨ*1&Ofd˻bNhŵ`ή<& t 8dL 3muCoZX R~In5,(s0, \qlnr۵$c:+"0 55cKc'0U)8*r_e)I%8wEkԧ`u謭b \ VƺmZYwP>,ega"zr1JI`&6",5ʹsYuo}'HP X 3<jEr,*CR#!3DSU($(`8J/a?PG :~)Pأf>"Et $|#qDuGE%gY|'"w@ҲTRo@2'l4of '='rG0J؞i:@,[ |ѝgQUuN_x >{0]Ы)==8@R /rɼCq 8eeD0Jx)UOPX,BD16%~4GT M['r`Qҹ 9'N9弤5LwȾ8g@l9C7x y^ʸQWeA_L-j❌ɸbђ֔D "tsUA'"&!CmL')~C{ (ɶ ;S16Džgv ŏ]Ƴ?|)E&YF[Er%`NwTS( ~`1Ɂ̙j\`x}%V?>~++fP_>AV[,I 3e;2±9 rzbx~N ߦOſ\k2Y>|.#:G}_EhJȕ$ 5)^fUP&k $IN5fڃ}jWVۮj " 5` b`J2-3aiRl ` v i'5ca,Kd}G|wweɑ d~x.Ww={w YLŜ,M|:s?s @ƒo^f"ݽ=`-Lƥ'۲TkY3X$E)69SĢQI DuK+"vx:Om܍A2Җ@]4lEke, ܣTlO9dOUSL䉖}&Jpdt+nmm7TUUK}ƌ8b8Q"O4 Ӥ̦M`c^r.;b1jRM|+8}4"/ޏ&YYU+bm㑉%JRsQ)fAy2U1|*])'(ٮʐ+PG&8JR9X-U|jIf:^8jQ%GFu,ɰ2"%)X  xk::L`liؑOE2~*%CJ5 2x(SlAq01GhfE9Lzs F o8&B!)լqh$"oYyo@U;<柒phbpPJɋA f`#Lʉs(P+fYEkӘ\ zzCr-Iy f)m4$w0mĻ%KARlh<[n\9H `&y xEM3)MjMc k2yVQ)#1SL] #Ggvtt2kjj q:a&@ҭx xFEx ǎcgEŏ*9D$ю)[2%-Ա,ٲ¸PlkV=)[ݕQuu6a,s#<7hc8v!hX,2g]2L[jFyilk0+ `ZFΪ`=rm" *FPXD!r!ƉF,&w<_9B2J9U1 o~ko^ #O Yf]*fh<;Y%'_T˚(J$sKo%7טh.n&6aau:94JLpM02FR6cPMdRb$ݶfd.>@FDŽa0Q jRYY[q3q"{1?KBg;bȴi3M0[:u*u{ bOR`& cCJó CM#'1˒ej^mn%~oc*^tWYY(=xJEƕ kM(b1EnBT5CS[y<0_/zԙyW/>Q)CaˌFʳHIs4O7 䓋dEE #BWh9iҤKŒC9 AWĊ1oM*GZ<(yvI)в8@M* y#ː,CY+,ynRc_#X7Vu%cq8 Wx_-Yymhx\=ٞʊ`va Gj11pҩĠ9"aBaG/>IMtǣl, - ejCN~BsEuW!uzlǩMl{uݳ?x_UWVL,dE仺2a%m"㱴Aw}OST{\QԴMYgDI>/no*|sm ECTG%L9[3Ф= a101֯_O>W7ʇ~n:Yjժ7xlΜ9xnޣ~%< <7f̵!3,*K5OB.U Y, bPOƆ',R,*dkYYY؃Q,<~4E3Y9+jY, X\"RȘ"a{_lE^#dr-X|M\l~|>JsϞ=]ByRhՃ tN` ]`<=tTd, sK T]R4]E][ӌf"#WT$#"O/(>0#-zo64F H`_|_ۻl颇|uQT5K00n$ YZC>'U :Dh P\m#M "2R<&`RBXw"mpNOpڪ#?E'Q_R("~cKK TOOCeIA/g!'!/ / íůzôy'V˂|0ydRD[=ryl\vݻAu"!p nصkٳ!Р};wD[oՑ@ѵ"my;>QEn-)m?8L8c/-ނ|^7/"Y/p('N۰aó?] ł6B2T$9Op}MMMXqȡq'AUA\9=ӱES83g,p'ʲM[BFOx)u3N%3I9qdGg-ϼ;gwZ$ #ҘKc{^݃~,T_z&(`Hx(2e a,pN2_[FU, Fr?!P:SfyR#2i u&֚n3Gu軺p8񟉕RyxϨHvEiyG7@{{o<J(R-??Ω56ROs@% 8ӸgJC˖.f?uuׁ'L*M nϟude&O,R&":EЕ+WBc!@')!ڙ8| Lā6+D1)+p0JɊ+Ibђ x:bY{O'(Ï|ƛ~cǎ)?,-7GD,q}`<z1 4:* Hev-é)pjҏ)Y~GX&hH<֤z tEAL@)hampR ]]a jnn)-[X ~\f4RP"U7/cje˖uRO0Yf?qlrQ)dxtR׬YX_J`ٳgϝ; ",[M&&/_NjE4Cc܂.})0ի/ZRg +6~򫯾{Vȵ 1x={|ǻwf@rfF{2FSAc:Qn&!2 7܀oH2.^d)@"&D=ܳeR;C$b%/;tP8޶mۧ~w^Xb`mʐ#b{6*N P`^Gi);y 6nĽNat.3(;yg;+tL'kַ3Do^o2c(+Έf -[k>][Ćgl/y|jY}jCؒ .y{z{,v|A!4F eɎ*˞8qO?π\eGy两σsp?xȑŋ h(䩴㏏;6yd^#e߾}Ν`r6E`ȉłȆ(<;֗M6mXEESg#41p+~/\3e&:yfte0rn݊ѸtRpHk0?~{ li׮]7  ٳK1Z}]\nݚ5kPoh,eH(טX|0kLϊ z,Ȁ)˗`B|  _oڴf|ŴbȢ4uۛ80T/!):-=6͟S ՘$T}m[;ƍcoں_z&ja=ѝ8۟K tM>n.vD%( #xL8_N-;`@aW9)!0MW^jszAYd ۞;w.@'^xqΜ9`n>|05pQSSêh:@ '666ᷡR%š\K'|r_6K-r5EEEsĀϠV޽{Q>gZOرT{/6PmFI޽NQga@~g"~Jv;^ kٙLjXJKKh 4yܸq=܃ߧa%U-SYfm~ziWT-.Ο3=)vFYe%]\ts09_ JMJ N{Rx0E{6쩪12R"CCEwy={%,s7#55\,Xx?zBJO) &J/Ǵ0@dB|! `܂ v`]X! 気,J5Pٳ)p@ᢐ:Xȗnq 5`!N['OVr S 6ZE]Ci##+5C c]-KH!DO,\Q9R<G!3k8u4?3&l]D@xˣܼٛqwwtBS#xHcwo&0tg^bp {iwܜw̩dޘ%%%\ P/?`naV'dcͫc{}\l 0 #s-\3fDM_ ?CP Ja&i^3n:77… %KMh#LXA2.]r̨, ~O@â*4#)fEr8]A3^ 'MXG\zo&UG tS..Lvʔ)W\\#(>Y3p"#' &9~r F'AB4noܸ /ưJ,(^Iح^[TT< cg3kvi+,&=T饹)"'QFɐЃCZۮbK`Kj> RS7MNu] ue /.5踙=ށu|(蛜Z00 KMd,_ͭ!ӵk׀\xHd^nQUEE8رc&M"0a}PMMHgrJM(v-[VJKKϜ9ØQ4zBm|ĉϟ?kidYGJ`EcRɏ6V#_x1"g\@TB!4"9Pggg3 z "A §n"̂W^y@_4L綍G!fNqwС 3*e3BbJPCHɌN_̱nB,ȢB|$y0SCU i6cP5͜NOJ/T'YvtKl8"EC b>׷G@o݁B)Q0fs֭_K;<^p`8tf;5hBo?~Ywnjq]zV8N&yPl2"=Prxjjj3+2yb1 E۱cǢE z!Yj())!G}SN51RY˗/#q)NC)20  :cfFÙ'MMMxy+ .[D?4G{Ϸ~bP8lz;B@@Qdz>BH*@I3`Υu 6 Ohq fNňT6 4]SܢTJ ix#_Gc9UNxhI1",(HZ, #;*2ݮX4;8اbaeG{ %=WjNdyaedvvuXU5m ;맖z=̌&t5QkX%U􌁁A_rPѡa\j<}:&cم ,̙3_w^j2vtt.%QH3hnnJ`9n ,d>127hfΝoϩg` D62c!t qJSz\E Q6ZZZ˩4IY`PPBn"ڎ`Agѓw#19f.zԶoߎ^GGZ\`p녔nƸJ+wb4Rp9!",WR BuRC05Sf3BWІu5bvL$8) QU؝+v şz%ԨjjېT}JoUk:{pyn ܞEqvwugged~҅ 7>Rc EʇhvSfjDOd'4nk 7B dl* q2yM t$Y&5Bԝ,>Ӏ4LS]]7nDS^|g@;w?[oZ ^~e`ͥKB*Uׯ_OKwy K{&SB|Q^(-"⒜ Tׄ+¸U ;=%oKdz6p҇ob0$ =tu(S4FȨ+^oA\aD=@g˃B 455gsoݺlh 1ToG\XXގʉ9?;;ۊ3ҥKY8 :݊3mh"Gϧ0:_~ѣG2~xn.J .PfVM߫G145M 92EYdE&cY}Xq``Пh v-"MI3xQ¢8;Y X0q\VXA74ODV$*GUxDQQѽޛ8qDPpnc޽fHQHUTFWP4a0?T4RDo >mP'C>$#7 yJN1If0XEYdяut4h\N'142Mw~t'?L{)S\UUtիWTIiF7@Νkllloo̼vjv*,|XCx`"8ڑ 3R M@lW;} =2 /z׌N&R3K:îvh-1ū*,Ȣ?i\h3M==@)$\Ù-&우6(@ 6DOQX7EOEAuI?@ xWRRB^)/΢): 3,oj֬)d<裗\r g1/wo<'T˹H\x>o~J &[ъq8qF!?Mh[J ƨѡ̙ "cfdI7U?o{G搤O>dRf%J(Qv /y6`/sbqv_޶~eG*UzT'.]?(W?gL\x~q0?R55kshX~}60ٛ,D۷o𜥥DzeիtQjԨaC$qϜOبF7c- hdX)5k47OROgbNHz՘gQD哲/*˃uN,x!K# T?|f?]Q@ 4  aO4#c2T¿ι<*e$&Ie `P1at . jֳPxȍXn]n8\]ݡSlASA݅EW;m=C׮]s.أ|9f;9')CU7ÚЅT=4,aXB'ܽonsKPP4!`7š2gʘY4=d,-d0I4Npz(Q|%k\ɔl/ߙL,N,,Q,XN+oLR^zM713r-wqW^H|ohQ2;?MMP!uVCaoJ;'kG1NBNΗ> Nc±m`;e"~!.#8 ܅7Nܥ$'8-1_b8Weq˗s ƨQh97@ȋIJ%)X;T=RΧC+WyHe{e\YN1ݎy5kY >b8ѴȗS6lK/9HE&J(QTlݶ#WZAIfdž5kovTLvժ9Ⱦ.+e5^4/pl./Q%s}ϟg7|3UW]Otu 6 /r5 Qd(6flď>ri+Iu!e_HBm3M5+{%$e(U{9yR)maK.m޼^/ MѺuWOX${R^EC}衇o|ܦM9^}m(57W r[(XKyp[-ZԸqcNϷb4E%kӦMI| EݠjED ϧBu%J(.PBqIq$W&ɯn=iLAA,I"noQ;jI_~9x|/կALSL1Z}_ӟ)nME49gϞzj$I. q9vLRjV K,2%5O0AwQr>R4pJ.ՋMfܸ#RI׮]_u,5kn:]E1v5Fуnʬ]+@gF q tt";)#q:,X^'Bo@]vk4iS.raqPLFUn8Ƴ%J,*g5ۉ !{}:ŘƎ:꨿\bFT| pI:Id f&"kBP$%H3C!^(,X{Q QC!a}9w4̝<}6G$F -ȵ:vk)rPV8.3Y4!]C66h*G(OW HNa8ZhGyLOEyƢe˖߲e|PSHUtΛoIetyȕIҷk0 ٢ˆZ]{Fk(QT@b[>RU; H۶lI2Z*\g_Ͻ$QIUwZ2e\я~ĉ^{a.$]z!EFok}'@{cvhR 4Yڵ+hkٳ'G_~e/T1^{Om ,ի8k,ody'ꫯ&e|2%SNUKj nۡڵkGI.d=I:1L\eMݻ7XLku'd:tw+~ʋ^ E!CPfȑ_@-|䲏xa1. 9SfΜY Nlڴ)ˋJ\nb?; Əoi4RvaH򕯰0:f i 8QDR˫~`Lv=wXmK.-vD9QgA/'/]eV[1y&K/T8@f)c1{ r-cT_|ɓ'Ofƒz1gf̘ޑG #ڶnݺqJ!Ejv-"pnǎ)Q6|M0]t,(gڵL߿ٳ}p iӦS 3>u~j#YE%JʆԪ6mJv\ճl{f1W 3G^vv74),-}zum=vUW])|/N ď!]{wukREP]Æ #;gΜIyR8W~B\ \tDcGRƅ0&1m€,Զdkvavys8t3C*ƍ oL0!IWijW?gwn6/.>e.?O>!qG@XmnG.3P)yg?ӧv=+Vhٲ%OC_n]*qzm H3hSOxKիW_pumԫiDe%J("bIiI5Sm]6G^H3'9DIiR琚GohtM4öY~ӟկfF~6tPロ~;p 0%'56]~}ƍk׮YfBoV X<e#7q^ׯߴin-/AdmU%)A!^Y ;21}sXjUp֡W$A¨9> H >P ]My<#:J'z4H=Sǎ듦ꌚNӟG9q%J(QxR⟩ F2>ꫯkNy\y^{-5t7Wz. 8^ve7nkU;Ao޼(Ӯ]:Iu˞{9}i1EHc=)=n(Q!` BHiFA2 /IU;6a͕H."k{%z:I Gn۶OMw0x%~^T8Fô 3PhذaPҨΖ{Km# T$)o(p*x-!u63du~:̭vvooyq/@qK,i׮7t=`k(5I.]WM 6l֬g}<Q*0j*zR+iwNزeLv!.pN0\>E%J(QR`1+ԏz^_`D$+Y^aUZ!pòu8KFRfgspb(d')Kw%ȳ7nl/w1]dߥKC{lɑCfXOYt_u2 8d[-iȹNA!Ư^vR34UxܫkYhxK5^'e^+ Q"dQPqn!Dw猎kh_nRwK1MjJC%X0=Oxi K!|owӎ&|h,o"QDX0sgCf2%i_Qya⺪?3aY=XkjeYtXĕ+W>)!C@|=O DºC(%/~M/͝;oӦ|Q4gw T@3 :s[j@)2uJRsqΣ*#wm5<-IYc7k0Z w w[:}qCdEO(QROkIq$lAvGq۲Do#U+WܤIߕ$gR٤8]t%ƎP$T6h`͚5|~IVMT0-ˌCh| r S^_IxPXa)pXM CM__4j3IcGK-F H39ij$KŰn kL'IY+e&J(%ּL|& Q\=bN$_W]u۹*Nug"٤8b'郫3h:3s:3͛7oNכ-}_ja,e- 5{JH'm̀zZr%EQO "Ӯuz (]f͚4҄!F)M ^S\(X4.:fXx f!=DeKilhKAWtc˖$SЪUUx~!]j n3=tP=UCHYʋhe]/]kڴ ҥK)T XmѤe˖-ɍt/~g̘qI'M8QI1o a(q΢œӫW/ZR 3gIU;w;wJrf //'ԦtOP!>%׬Ys)ꫪ0Avf1J(%Vcշ})ڞXd7?q?cfrJֶ",Vf)/b͚5 ޺ukW&W13aJC۴ih" (P'>oK-*{Zo~…I/b)@#a*\RWw7o^:8cgΜJHKUF=-H!zq EeyիK/LGp>Y *%J}/6~PVv)M>jfX^6,HY_Ύ`5\o?ԬmZOe,~ߕ{O>03!C>餓Fo} d P!G+P#2dGuٳh_ҥ ƌ`1_WWy:t8 *Cs, M> G{1e޽{O0SNPV 8[n8ÚI{'Oڵ+__u-y},d=6OR C:D%ʾH$Qrp͚5i~%ei/4[^&۶#`WX~fys61N&Woy5qsF(Mq Ѭ˙XaKrg ,<j?irm ޣ_P3g.8u) lpX<2NivkIa(uB;˫ᰑw85F:Ǝ;x`(uݺu=\:qqE]}g.vCZU>xԣ71v#>Z $á{1F={9s Df ޓԴ_v YSwdΗNIRxJnAldŊVB#i cM 7i]G IT%l;!EO RTTAXy;Nq8oEj{w=d֍7f{ ԢE &g}d:uXHohj.{ab}& znLNaaȴ[MR!6Lf$}T>&]L.N814BʾCEyo6#? HѯG !TEO(Q|G6HdӼnfU M`, ъW [6m /|7F~M+*r? ,2zI90ui -)J5gAi]>sӨcyc&H\0orݴ~6M4qQ ֬47PzQ(|m%s*%)ЪU+N P{(ѨЀq6"pU3vLؔLi0Z.KiA=˥isQ BAa2q #([m}R'z?a1x{aa!! ! U9͛7OXZ&,SˡIjxaӧgs *)Nz駿\eʔ)TioCnO.S%J,{ǫ4UwU(.MؾuΣXKuvs2apey[nի? 1cF*VP^{#L}S11jfAPW]̌H H+v4h1_rI==z֭[Νi(l@L̞.]_IiT yٲeAiLc,]?5hopru#ڰA\\Rܥ~Y$QoE1t2KGWיo6#/R s&9 10<cǎ>|K/9s>SƟ/-σxxD(uIJ{ԠW̙3ox4n?:_|BQD>c[1UgCZo֫:zh9|rؔs7ڸ_5gΜ^zcmPc ȕBfH*t8S ܓTXDއŒ")5ff:m;mZ1fmO?AWuQ.{ 4 6lLӦMԩ1ϒ6v+T۷o߅ m6) k6MgEjVZd<$# s)Y[yLBl_BH^ ̚5yW^ӧφTe;52ѭҬMA 6yELlM\[B|,erF`2}TM*D5U?r~sU q6l|l|;lsQ:t>É4 ׿/Ӽ'6hओN6fkip :[tFPoC31QcP[QDYd/C6x{&2)Au^*| .w(ٺ#ӿj/r͚5AcdepGo&7l)A/]@6O1у=:Ij.N4)Ig;I }GϞ=CVgV={+z T1r?_j{_-Ztg<$x89ğ o TmM ˋY}/9Dܹ>ଋP־5-X@7s %ǹNo_E6۷OKlsEN(Q|F반ɪw.eם%aIٟΌR %,']Wb{Lěa2뮻GwfSݺuwȀ Bf5l֬Y7nk}6mS`-4Fd>PG@+ AI&7|8p࣏>S0ir(e,Jrc=f]A-i`:kl׮k\i0hжm[8UfvN<[fa3I8'|870o3q^4| UfnPm>,CqFIYދdwqez34{Ŋ|e?绶NۘA BaCp S ca*uE}"y<$o};?W~{9 %!z($>ѩE',^#AWh% v<Ԡ% V|$]3,+^8ŕ cƌ^xz-`l*F[4)cP7TE%X.,4$䗭nشqɒ%6do\|Wc3.G 믿ꪫ9+?? Q]_\qXpwפ~1sG3{aQvfƌ&o+ȮZIKRd&`[gYDSunB]Ohuĥ͛ $LK%6nAswyj<ӗ%eVbh[FUMKao\ggW~tyL:UjfYȠPcf( Bo{Hq{ eCM$jF\={tyn3! 4Zz 4/CN.7O> uj:C\N9,`RO 3犪\qg5QQ%J"{]_CWѾ_U9lgJv5^o4"?Н:u/ɞoW_}\6lo* 2C R)' :*/œ0'9a2IRwf1R lIꂣ +\ 9Y@^[W2;>NT6;52ŴS Bv ”<= @]Kʜxt5(~c,j8nзdȑ܅gy-ZKPi@aΦr6LA9c iQ[܂m8lPkZ^G389yvޠgAW0.-Z!ɡ9yޓmD(F t6eonq :u'5ss+mLU&eV ß.%J%)X}{?V?M.,fv0er\ivȬb Q-$H~ߦN /ylҤСC@3SOK/ \().0%)͛7OwN:I_ COQA'L3H9CH15ՓIVn]tPaѫW/p޽{Ϟ=[CWm /!5mڔӍCC1~UEo*}:̟?ހj֦҈5۵kGIEm1Ms^CZ`<( 40`dy!ҰaC4H//4G%JevdJkV?(ذfێ9 R}+o`&K]34) E۶mAnݺ}wuH+o߾cǎeN1cifF1H\>*sυT8* oߞ|*rBb j@0Ir!9u9s.v'B(IO#0Xe˖j`/Z 'la δiӺw(3~x萣٦Mj׮à")مƼkIڽ&+d/*9#ZhY*S_}՗^z 棝O'ʕ+8nnwmw֬Y[y; x \8o6ue#F5MRi@FseٺukC{v'RI& $,m޼9V )I}GQFs훷vr,/'K2.ο(J(Q*V3q^~J~nܔ W=I:HUЬx95U&dK~Qaއٲ\XlO>J%In׏;JȂj1?! YS&ّi).`fueES w$K2 /[Yf Q=&`&lSa 'f)N3)# ' !R5!JR|"ɖ\"YX M^XͰ$OQl,.6[')yw]ITDn"/H 6& 9jk=7`Dg@I@-wGu=\h(}ony ,ۀۧc8vGsU!95~K.5:&Ni'IjIfX +-ʾ`DB8/!G+o+QDBі$ gm0<У_WA wKm/e{iqc'm)Z}=Jw)L~%2\|xܾ2OMۼysBڵ)S??zxT1Sm092)sRc5YeaCpїJ U4i҄S%60td≀Pfi:Iui6ɖ{ ҴiSiTqI=% `pРA;8XHip扦NR e'xdp ] \r &7d!`(W^E @%s Ħ %$p\NUKSE+W\jUVd dJU߶mۢ"uFz dLͭ[w}fGƍGK0ҿ$^2/r|(QT6a~`,evfUWѶKT;h55kIY濼4SB_- 3&I7c 3^=syW_}ߞy#[eƔM82$5)cvB.%') ʋW BB5и3074C=-d(rc3X mi[?-F$Q3vP|Ó2g/*:Ig]ךBmׅˋh6sxPռydq*dvd'&`P ;TM!7νХ G'؇  u@~Z 9`g} ۵kG`NE˄<3sHk RuU4 >O2o cvVtӢDK-6~PV >ش)Q|pC^ 9,fRN?YĘ]dXf`(RaP׮]KSQOh@d\.$1""$ά\a k; x."2n wrD&7IJs U.C-iX$e)50gWLw*+(3aF$)R!IѣX2tazCgьQS~￟5\$N3Ɵ'n*\r#FpEj/"0mŊC$G囆yAH)Sqgroo:A?#Z2s?^r%C݃^zwyܧ~O>< n8}{?<*濝QBN5!}D%ʾl Ct)fX{Ifz9%At,fv)g7 yǔ|>&S9iݺuO~䄏R eq\^TX<Sׯ90_7o\lk]ڶm;bh5CiQžt3f S]z5رٳ6m~Rf͚5*i! ;Ec(QD˾)~T3g5ScMUhYVʋ y\%͛7uÇG?JR9rdÆ /_^v]tc۴i d6h .SM=qpsAA]x wq|]p!)dȹO?gBZr=D%J]z2 Y+MvTՈEO&M6郜EA6?o8:c Q98Dˈ܌;ՋP߼ys*U{キC=z;vo13g8cڵz@S'ԩS,Ybԕ*iڴ)Jo̝;]vlgCOW 5k]jVMIx\;<rz[WtG%J([.;1Q풼]3;RFTeDcv&HRՔ<H01)FTOI-6l({aw1(|&`k_Ahh1we˖@V\9dj)VBxzI&EEE\w9\7ǐ01Cͺ]gzhOVYgE )4^TrQF~ ,0KQD%~-bڥ8,%Wum=yia3<3`ǎkBzj&ҥ{իlG(;3@ϦM>Wx}( ۘ#3gBzWtG%J(+A?)lQXSdˇX}rn$?&ݰ }]w|ͽ{+?2ׯ__FI=3R٤8/nѢ~N:-[ իP^_x*~6l8D˗[n]bEVIKBl|0O @rUTZѣ׬YSN_3ՁTȕ衇>,F;xθ:)BVϺSB$e7nhK.$D L+IJyq/rs1ClelҤyYY]ݺuZV-^$HҐ@ƌCO خ];8OEv! ʠ I?6`zlRvR!ċرc iss L)bҟ!WE]͔MIhN8AYhls#5S̈h0/!)2"5bEu1@A(QTdi,ɔk/<b*JWPR`1+KP -wz-0Nl(X![І=SatO"&51χ y0۴0JROϘ|Na?'o~l.jeqk:ɒ%&L`MKa D 9ުUZhaDmvҥv4j#6Γ֠A!R)=N>0(/Ġ錋^M%J/lݶ#WZAIfdž5kovTTo,&YO:"t^,vںur3A0 3:0aF[oiӦF߾}5j@A)IW&'r".Hi^ZȰE-q. :?p'$NrrP 4,7*sژq!~?JO8D7q 8j5`7Ph2h#y$\tFaX0-J/=R nc9'ʧ}燌QDeK)QR(ɯnʐi>ɯed+4[T)[ }vmyGN:@w'0`)Sz @.P:ÌL6}t7޽ISTT԰aC^ڬTnt=رܹs׭[6K3Eq:BgH]QutBN>S&J&sOJ&$<'N2R^/f \^sYP8X&Piah\fئ~xT>29˗/ל@I|ԁCV]_ =L˖0J(Q*eWQ3UX;/T!{$Yg]C <4m㎛2e8$PiK ,_ƍ#[~zOs9܅ }:wܤ {A;&e1&k)/"N"0DjP֥˗/SrJxgkРiƀGre˖qAڸq#…tafz**hD 5obQDB$Wicշ}9ڞ}[ MAl)Q=SY,H0;Ǐn|}wE=v23͛7??:v"msVXL a @o=z6mZb_.]f͚eHqƌl8^JyڨSNbLQqT (O8P,p믿>H>]e61 ruG=rnTʋAt&Wzt2|S6mz;GyR),,!{)**y%Q8F14GuRWuZIrbEw~)ȵ4 E%JʆԪ]`ӦdGzYuX,)NW2y6nZlu7&cf$%)գKA~V:p_UWDt|_+Xjwygy?%KCu#*^FFaaڵYW_}5I6m(2'\JGr"u)ܰaC]daܹs=XUq@yq/2t"o|A.1b`)2r+ ~a .`?c_|1Gaqzp3f 5\<3,Gq C]Nҿ&J(Q*V ŒҒdG5kh^&_ \\j(ťI5j2yBdixBu闿%{ FnZ~=XY^{_~9,CW^q =7o}H ^5BtFl'͛gm}*g9_=RIK@0YB\WʋȧZCz)⤓N;v,>c!v<w3zh!Cy}Oc6qwvg}OSNNv6idСÇnjsꩧ"^zC>yZ:"H{l+I,^CN*AԬ+4eVXzpE֭[ԩa لgjD0Ou>dOi*>}͛'_,~a)%~z.b.]JwyO< /\>a4jԈE!E=@NziU-&( 1zI3jD%J(-PIme˚5k49q[lK&e]֫W &KINwxxV^D h5^pn*D%J"<ѥ`d!'6ƏL޼ys ٝb]v2e?C?)Nq)5T"}pz4CAiTg2: [IRf^ |&z6\:z\=)7rb:Jyq!fM4y뭷Aw}7RXXc}[F~c򗿜wyTL's9< 8.Ydԩ+ݜ[4_W\w9E%J(Q*]?i;Z7ga̘1IL_~:tP~@p= W_]^.(C@eZ:yQ35iR?$U:1=NRL*4NRͧءwqa(Zj#~ k2(RC/hȝjq/nѢEׯ_ߩSUV=Sv=Ɣ{?C#G?ѡ<#0d >衇`Pzܸq{饗o'g\q_Z\Χ%OQD%JeJ&DA8IAO?44sa@0j]v5e}ܭ@~V!"j:H1z&26\j]Ƶf4P@\]6sL iE4dE6rMQQ='`14IU+p6V -_<ЙdEva [kj~%J(Q*Teh$ڿ;'? po, '0iҤ޽{'etvԨQ_W?]LӔ/) nWlX6<. jP.26 8:'`4HgWHh1cƘNZzždkSˁ$ dn͇Q>8^<1ne(QTd2[>R͛8Ʀ볎[¥2b@zwy)Gn:HQnWMD)Wvg8fQQԩS׬YવF8gΜ{(uGE%ʗZ87|`⒭׮W^|y xneElBaȆlիb=E-rJyq7n‘ 04vKd5#aQUVi%J(Q*Jm/޶R5`:L=[`1$_ L<6mC>xkצpR3KyT6)/CF8RٚLK% hW^m?6K%J(_j9U$ժU97|^FWZZ*3isS3+Ο,_eR^u1-իPEt@Պk׮b(QTT nhS%_ \`Q1oNlk F6m{=&i7O~-[@e.YfepQhB!%-/}\,}d.a H~$b?~9eݲs8YKF&v]FU˛6mjo%޾gt5Ԅ+Rh%gv6ìP&qG1QZ$iJD(QDX <"撣mzaFJD B:1[T,g?x&e%0kŊMH!.arWJr"x;,I:Q$jc~iT2CBJ\Kn\RLF13x-o>i %UteNji!m6aVSF8&> My0"];7nڵi(QD>ÊKCT.1 2")=l_s5|֯_o$ݰa&M!3 )j%S#jjժ~z|!j?G\qIkfQ,SȹTŵԩ#&);\q'h2iKGuDFB͛7[kX`ŠR V Oʳr!5{䫘hy8Dg1nժUT;E%J(V:,DUc4ٶc;c:/mL^;S5 TuFCկ~U|_= vzHa $fU^fMZ4wq'pB>}>C=?Dڵak׺!PvIz.5S&Io߾TрΝ;s1;vԩ%TWuZ\zjAUAٯ_?.ĹrVv&Nh"Q?ӆUV 82t?yY\h0J6.:bĈF%J(Q>uŒF]J2IqdҰ>"i./Bk&\3ϴooQ- C]E ˯ GB4(>}zQQM8QBOӰsnݺIw6$:i$*ZtvW~}TI? .CgΜgu.StќK*E NA#ke:G^:u6nܨhioSm~s,0J(QDdk noJU0WQ@,&}&t˖-s*@?O &N׊+S ^[RLU p7ǓO>#ԆgϞSg}ao>Iu~H~T%QF. Z"M=^Yj-۵kw q.U'rv3 iٲ%v{IS޽{.]< )Am۶ ѱcG^hy=8kҵkWW^&,ҥKG\pQD%JY$p)ˮ;gWc?,Q#˩BgDfd*hjժon[f͝wi |nٲVSz&eFij׮-QO>ӧO6k֬Y3gСkƞ7NuGo̅-5s" pE;I]x ^K{1cLɍH?~:6JN4J( Ji0JRe.ԴiO<:نՅ >ydSNU[pmva;)`jzꩉ'2/Ya(QDޅE 4$䗭nشqɒ%6dlo |^Ǫe\.--uQX_wuwqJRtPg0gX*9PTQ05(#6oޜ8GSźw^ {OI tќ6hiӦ-Zp\\6RN:{gΜ9={2ewҹLH4xŋ]wY7j,IuuN+9EvPvݱˋ`>QD%J&{]_׵$#ڷ*m%6LR`~W_}]wG?g?M76a|$ 5$c\3y ĶqF퀃N҅ZC( 嘭N 5 pz=zL0v'VYXf͢"9[n@gH]ts-rVKu,9&Tg}lN-* R}Y$Qh=Yۏb(QD3޵Y,㿼LΕvˈc=6lЧdСr q 7@ytyR ձi~Y窳)$)$ q.ƣ*aN,X0k֬ٳgSlٲeI",%)AmڴQ'e)Vr3fΜI AW\ټysojڵsΝ:uq(Q'Gԩù*DI!t7y[ɴ^i^۶m`MCDΒY%l;]0=S,F%J(8D&_Mq6IpU?aÀ$]&nժr!B> *,Rrr ݦVZ_:9׬)ߵkW65k6l=!$8;)#nڴV5ѣI5*,,t!C5|LݺuuY4{͚5guرcNݻwB`Tkc߄yIp~ϵuӼEqk|=Ԛ̆ºPʭJHW=zb(QDeR`4:w żR~V/}fݺur˭ުooF(ԟQ}+VpjoҤI~M-ٓS.\ 2dҤIpTGjǵ,XuرK.}={6Gk֬;̙#JB{SO0`OzԫWOtIRͨ~*.uוwFLvN:uy֬Y|׸>}<3\%"{]>1i7Y%J(Q/310fkg=brQ 3`Rf_d@˖-z!+4쎞.p WN ΝS׮]+#&.P PJ)9M>]3'WrϫMuGf믿qEJɓ!Z@M&SI v3fpu0Tm"eٕe&͞+Eܩ )S5rerzHLTN3^|EZ~=Q)1b(QD_.M㔖ab?Bp'zǝ\JvM~$ 7Y 3d``4RtX߈=D/`sP;ׯ϶w)L \ЏD*݌hWԦ0hXzeEEEF ܑ`!t6MeޙGQ]wUVw%JHBоI`a!cb|1`'&8Id&$c,amhAZ-ad${oߪjU=~Z nYBo*U^ZswŴYC x\,_ߙ+8btH,D"HT]jCZla,)]c:놆Ap ~[ZZ<裏,ZyȬz5V(oM5\]<"H$UEbE6Oq#"432aI B@m75.6IEH$K24+,,|ODMΜ9\2+ ]<"H$U>ܧ݉vE =zmƌÈZefU^illd:V]<"H$U>ϢL>4Ŀ#2LCC-f"d,3JgQ$DGj-j$Y{, \hfbj,AO?n2dt krmSr"Q_U9F7H)UszSir|1v`)]E?u~obo塘.٢'?v~GkmryUeŦ&0"H$NgspLt C݌B~CuP .o?)o"UMьFKWenv#?KǑFG ,@k`V<C&[8Mt+ pV%Vyv  9*Ty*01x+q<,W)1F_477stXz~4Y$ϢH$DU&Ϣn30uz- xя(Ky3կo#v)zD><]*B7<|ȑ%ohh$/a·Gup}5=nHn|ĉ>%݄Q42L__/P/ЎhqE$\]GhC,q[gQ$DyE/7prTX,XCnE$dtO"Qw!($~Ow__*z~L8X,.X$t N2k0k3pc'#b\nD0a&n,o0I`[["CvafagѢE+Vdhoo3g_da0Sbn/ڬC14QgQ$Dyϳh9%/豠c(h~*__B>{Gb^:GyG98sϑ+Võk2/#p B!KCCI8s7j;R1ըHeae8+UIEH$Kݳq*Z%a*0`{.?v#GFbdHf\??}@;::zz`eǎ^{q#FGVW]u0aݓ .O}S/V;@)G4iԩSI\)͜9sXp֬Yඉ'@0| pJW_}5Fs$,m8-}}sC}CO\^qx/4ĬXW7MJ,D"HTm:šf\1qbQCD+W=< x;.tvq]Cjkk钄A@P Gߘfww7nE0 o˖-3fÇsy9~+1ׯ_ "ܰaנ¼y~m >y]vqn`m۶曷rˁÜ1..Ͳ6mDJ;wo[L)=t[oOLi$-1íJw!g;@["H$JvmaL ~YpxGkR =gXqxꩧxud yw$n޼#H\JPh1A*HJڱcrr$Ee.b0`Vn 'r5fn7D;3”~'pҤI`\`tժUQVܶ{8Gtfx8n4ř+/gΝ9$r}<_"H$B{)/x%Y׌o1 ϙ q˿Kn}7c\P !ЉQvp8[&Lػw/йl,H-+Yx[oooSSSp?Y c1<61(GzfAcPtRq{nij7tڵka✛_^vL3Ф]vM2׍7rWUY& Y"."H$]:О*p@P {~Gy>.C@K&qZ`K.Qe0E7:2ѣ !*odщS>ӠӮv q.'& @̇pӻ+:͎xرc$I&mڴ 3DŽ/,vz 'Ais(-/~,-Yloo^zٲex8!H$D>"/“ Ui7 <^zC.[\=Zyb{MƠt}l…@\UPcsb7ݍq^qimm]t) 1A"^aG>p{w;>\`5].`,'O<\nٳ3f*/OEp stOO~|?g͚DرC/jjj\ZZZГ,Cȥjqo۶ ݘow^ټy5\EjP ?boĉAc|Q;I['H2s%Yĸ3>{]w]b"H$ΠE.@FGg`}K_bDKA8dz\5&r>P>,߻ umݺ)qׯph%1=*D7rIN_D"͕;w꼏 V^ ,Pѓ'@C!h6={k8R3#`-[Љk0I*ˀ2i+QMW?s 4|93ؙe,s,ePy -4iЈBcc#, }\M-]tDvsқHSFys g/N<ߗH$D3BY7ntH"Бg#vU;P{Xzk#Z ^Rd&Cgev;%`%Kͼ<% :vD?<"7u8Iw֗5O*32ں#X<"H$U.gKA@g fppiB]bECVZKH$DP *َ.,C`bYD"t!,rU/]?jH 2(<f|g/D"H$Ytpvtf&#T^Sv.<͸<"H$]̺^{^CCC*pXbe?XGPNt֒<"H$U.,>C<@{}';::Nd˲,H'F` E$ϢH$Dե¢m()æ~Rgwf}[J---a|_oooAxZ2"\O*0IEH$KgˈF4cSBgʶtGŭb[#^YOV 2(O|%/ctO0=ٓ|I'Y*Ad0(x}~%t@ '_?(yE"H$" -e3`]K0@.G#>ǯ(^cz$\njjbO? Yr!,gGZ5\IE8䵶򤧧QM YOyEֈ#pIó!fǁJH0IQGh9>?R) ̇&9szƙY,`:3d# Y҆v3~U ;Zr! *ŗijDx g~FIEH$KÃEG@79*R8XR] 7 fUQ%tʧJh&ɲJ 0ǣ>:m4p_z%ܥ{샆tcdԩSY"Yyx<HjnnxYƑH6Ñt?U^]A]E6|':f t5eʔٞ ݭ5q`IQ9uƌL#x|{ҟsbڜ$F2 B/,3lC"6 E&,\P '.b5.ɳ(D"Qui؞ŬRol=j!\~E?JJdUFOUtTr C_`ι~/޽{w}}5knUVC9!([tCaeT>87@T`0`/ۼye](YdɏKnܸQo;]̏1t:;;A?895` ~ frR)Smƌ̙CbMM͕W^Ig:;okVy5n8 H3yկ~EC;v`DnDy]~+V`p}14:@C(v~SH߭z5`,>&_=?={6n9s&q#'OHyK> 㸋вl2}CIEH$KދַxŅ^ֶ=;w}*3rDǧJ )#edx)^‹c3Ͽ" .O y14,pSH$DPN9N@_ Eb11__[qq#M V]8 h܀jjj%V_}H'?u9k,3)rmWo$q陫})/@D^Dh۷o5F(oرcU9 ވ+86r 4 Q`s1 2 HAOPb:>*3K8Yf M1 3 ^n(\SƄ  ^6Q"E%yE"H$6 ϳh(5e[vj>,7kKb~:}9Grc bheˀz'{챥K_~ƍ7p%Xnt*i8^Sd\\.rbtΙ33gr-p&c:hi؈+8.s]gQfn)"D"ũy{ق3':9]~K~U*{m/Yq Ŝ;w.H _B__??,Z/?pɏ܀` H'b#G~yz@OOO#"/9v13T5DO`oo/)r@{< |aVEUNH@={6G\\[[XS^_ܺu+pouww<1}OWWۇ/EL[d :c__޵k믿NQk؂?=|?$ϢH$DU"(+n[v_~a%ꃮ71p!R,cQr+( _ըQM8{R3󒟸><`_Zr%]zꫯV޾ƱcSԤIOx.#$(aܶ6I655ڠ3!)Z=a>x5.`IgN?;;;1"lr-h[k`3=([[[[ a6,GA.ϟ?\Ǹen$V?8ɳ(D"QuiжcaejG[E C>rW}䊪NX<@4f~+_g>իW^pFboo/ |(t(c`v׮]^{-W^Q?#H޽; _3f`1cƼ0 ܶm̙31ʉ'f͚Ǐ-=c-\^b,a< 6mmǎ'N9 Ei dΡC8; [?+~e9C:Ѯ|E,!}[5j0"vtt|_~ABf2}\6;PȒ$8gW[񸋑;V f>H}U-wz Gΐ0s.]zs{G1q#+3ρ^&M:LMbߕ )94s=rVX~|w;J$'xт7"9G#vd#H$DDHͰMw(|c` F:篂@Z@\HJ#vѭ'N͋ #r :<9:(o?%^I!d7U4Nkxf5EfUWAbC4H_as~é?H,D"HT]gǖJR1_h V15sQx A~:=J6Wj6|K_b%:ec14ŻLtG-f>{eU6rgLL{1Yx[ cʖS/YL=5f$yE"H$. pQWg٧;v w|>; MXs!?g?;'tfh``ݝ;w2@Y[ G}Oňlg1kݝL&8 bpN+ VaD'/UrnYGMU.EuYFX,AO"Yg9tЪUz{{eH$DnTƭ -dr}r@RIYh8ʫFZ;ֆ0a[__AC̦LB҅`Od2ѣG@l22# R)ˌ1=#`D=IÈ. ^^I, #ldfa9߅_5V"/ 4KU^f1(_JgQ$D`VF(T6qM*vܾP`d2D׾ t_ l#xϟ뭷._|֬Y@.4,X<"pdk8rŋEdk>O7n[f 1WyKc⥗^<$_'7h%fumEX?RYlmmmnnƥYD"br,)fÁ}{lٹw'FϞ5>"5A\ǥNa͐?{˘LxϜ9sڵӧOŵx<6m3 ΛfϞoL@8@r#GT=Ĕ@~,Fܴi.F90"`,wqă۸ŵo\sa/{Q̤-ayW__/ /\mmm$D"H$4\Ϣ}/`ٍvu@^YGvE/j=+ES?t8cƌ+WN>wo~nݺ%K K.u\1P>JofsH$Hd _z޼y͟?ǎw'M @ඍ7E^|E W,n{ qd WXE7ߜ9s8A ={bJ ,طo.n ydܹsU/~W/_[oyU-e F%](x-hYaÌ̙7siSI'R! Xdǎm]aG-# rƍўN%p |L '|vY-Y4q8}c a}>X=1g`o- uxw4R1o 0 NpFLPv0 MZ"_gWyܰYD"4lUW^rͦVZł](\IWr .7##vq_*Zb믿gYpڵk7m4uT۲]2gkjA|M$%.dsU&Oe@0Lkj b _D :`V8u/Fxܶ݇H,rOju|oA_@CS=_y#[AŹm1w~׳ k@ T(njDt!:f:DnnJKiXGChGK(M%'{R(q<ZzeN.D" |Y>cEƎbUu!@$)FC-±G[q|Lɍ7hXf͒KqH1xA7rÙ5 vlg% CDQf0{[MhRd-;,S 1Lڟgy晿aC^kg͚J"H+mjld: Ń_<8v0t*ku]ݽ1F~rZ"Ǎ`[*LC~ Eh$0O&)/rcPO&xJN._ SNquL6>ݲm&Hѳ ?T2>}k nX,Z~/k /7%VEɳ(D"QuixE Y.\CX]' #jx˧=qpbZlF?D"N81u;~J&R#FAw[ź:;Z ܺ kΝg,[{Vސ|aҔvn[ښ'M{>XM`-`1ۥIL6slhr3&6r7ǢH0g76mr\'bW>_rLH&Sc^j)#;k.1Nf[X*0oXZUM]M&_ ן|#Qul,oj߭H,^E F ,8l)ZBr0RtvScm:-DŽS%  W0W'/;W<"H$U ,#}Pps##& |hc9uuO=Muuu/&t(ۺ@:mڬ\Q2wzρCH8f:|`MmcVhxihⱸcbښZK%J ZE̸hGms]d .tAnΚbh$c֖ ¬΁)pKdz2zzá0Dp(g5̊8rGˁvy/D"H$YÆEͭ%dp0qCn=h?3!s``;۶kjjatM===$s*o7ؾ}˂ -^No&y x6?3<7}^L[vm] NpݼH>8`;4eĈC+?ph68fW^ )z? ДYD"tVIqG'%v`ɓo9חf-[p\|ES~?oÇ 볹l_e[r3/! .[ph\&Wpq8`j xY$J̳СCVemH$Du-oy$KmNs~'xr8ihh`+V 8͘D>ώhiF~@1dnʴj~àbdG!ECOme/ULgQ$DҰfsHN)z+Cx c Fd|nBRL$RYS[aλ0UZTKϤ9mܭ7*YYdӅH$D3kIsJJ+Y<;&+Cm۶gy</F_З˕aYR Pu FhK8[J%`mm}j]lpnw /9* r(SU%yE"H$. /c;%6w|'ὩTJyL'|'8~4U0hlh>6p7/e"pM6H0Jܤn5g/`[&g!_FaM٨S[[W*ٍ tP|eSS#^*H457ض E0@ D m;`;S A_дU(.pߍ_Q9ʬhZܵ$ϢH$Dեlβ܂`dqr`577rHxV9[v IP;"*% %ad)ˎd2 u2Iu?MgHWWe c/i Eht{a8!EUM1^ʗvT(^(nv6*Xl!5Ɓ}uU(M2Q Z偌鶶6B, )a\5y(6]}8s JFRoa~骑YD"4lXLӆEBˤI''T*Dhll,J X,p8K>|8+ ]e{?S|WEJ)?4Y"5Z<8L> I0 ӬlTW F |UDT2L%kdѱB6MJ\}pCƆp_O$M_.ARCT2wT[GbX$~`W+CRICA/FBxQm\vH&MPyumK/qE"H$jx(3YJ؉\I-e΋qqJm+T9Bi>@cرpЫ c BTr|X caÇaJY`b x8O<LM6 ch_WScc}/$ \$EarU,tu'}DnExm&Ss(fB'M4H6C(Lڵ̤l+7{{{p'aPM ==]G-Ya?=I } =/H$Dg`藵TAc HXt*Iǫg< Lr1: 'Boo[ZZyB{{m}NNTߴR@*mR33p3̨Mi5"N*ŃX69P65֛yHOG CD*1\Bd"]ߟ\ѣMlmKH0X@o2&sT]Mz u'ͦ]d!D} dw|C]6jkwmvu47  ,677GgQ$DW.gT^b0/ӟ?{$Us}G""(PP+q1F̦HVݒ]]+UVu$ GSNݸqe˶l2gAѸY3-uuJ۳\"8)mZoZ@}ge@@@\͛]ۙ0~`!WdRoϸޞ&{='w75ER_ϟ""0mzm O eB>q-='{3i|X\2߽:nzE  Jc215E  Yd0 ct1bY$o}{IgojT 4`H}q%J%I"f`YV4%u֋/x<ϓ+r۶m3gDQ OEXF&M藊نxϏ~bѡj  )mH75u8l9LKDHÂW YjJEAW+IWt矫Ͻ<ľ KH⪋L/Md2}\,l<}j5޷}Ǐg1{< BҔ1lCP2-+p>ʊ$mc;X"`0vCw>eF>:پG xhagCW0Sr֭#}!fڹs9s/B υSE. x_M=[ 1Yk ppsd"Y,޺/T!TJQ%b{B65 "=l\3cڊ% Ϙf8ϙ4v%xM7Fye-lkhhWοan _z"h /|EgeєzYYd0 ct1\>3$*߲hڧ7އKE@D얛aLR\'$#~V 8ɴ޽{G8n׮]]]] ,HVgO ӤC=6c,4%pUEgBVBɲr  e]aRs׿MӔ\O-^ ˪aT"3\. "Ĺjŗ];u98$K_ܶ-%WHD#gnuvI~Wv2 kIG=Yc G}rbb"T*l{ `F: lX:/ 1'SػT-:L+Iy(-o޼y0aB>'cǎ3gpL& `o8zQU/qDUqˁz$"i TdU#9(sMAӄ!:[Am3p`9 `"F&+lg˵- w?9,De`@\S'Ų @vD"A䩣c׮]׬Ysϝ;w֭6m"(K2Yq G4"tx؁.m{']t߽ jSxoOꊦRCqE.|OUթSR ĸX,jZH"kY%j%1bicǎ/NQR&F;mڴcǎQ/KybGy䡇* Dl~͛e[hxh7 UkBN!2Kj44im[o#;'on%-Bt2՗+H,R'q&@H'9ð*DJ5ϙ26qeǢHLvE #i&=YUi:pfKNJ # ]_\ir+U +ӏ!m{"'W09Xq`0 7bPDX3ETH:"&(^"W/S$ؘJ~]wS,'O#@TH,B^(@ON͉jcXKJ(א][xN6uڟ_6 Cȑ -riٞkd#dRxWjbP)=q]wuH$f.WfiQTc ri>iDcA߳`>:qdžLfV* v++'߼9-;:@D.Jo7x& hwxH&{z*r |>&7`v[Zzzʒ-?co_X"i{j/R7[xm>:Wf1cgWzYd0 ct1wڤϒ(Hɵ QQe߱h6ٜ!d٫U*\s͆ LBJud2NZ<ͷ;Olǡ4!7J/Gׅl6'G1珟߶W\$r0,Xi`D f龾6 + X+5$蕪iBAZq?JCߐIdQ)˾#!\L8EZהN9# b,0uvv@"䩨J4\7veX"Ђ8A>T ͲdoYd0 ct1RYDNB?HPE%V_]Aܵ:-<@\rڵkA;;;1ƪWttt}TYp_} h/-  ˑF#T [rm?1 |E+a"'&9cZXvH%I]*,nQBȰ!߭KgUrT"z,AS?d 亁A aD\7 'Y -iFRsU7d;c-ېDŜT*A=gL`0/gd!SAh7ۻwi~Fug͚uС|>rLa[̞xbAPj4uBZ8Hl,_l]7G_ O4KlG_?*|s(ˢCt/qxroO?몫e쌜d0 W?tSS߾v;0[X"`0H>]J}4h+1/}:Q%Q*/-CIJD5-CȡUB:%OYB8"(*ikU9%VTY"`0H.!db}Ӧh6Y';TH4FOVQmH$JRU-+n4f/ ŀ= ͑;K3GD^U.====w핐X XZ#a@2+`}$Y!1x"x _x<ӷԹ9y"9U=5ΙGYy̌_D|釠qßY$ l >`sM4YȴRHtg[h]yAF5cb*ٛA@~ Zc28ŸrsQmq/<A~btO4,eXšyelvDo[B/TY) /;k}6p1/Yj=gQ  <] ݔ^)Sߒ٧j8ݹsvۍI'  F(oDHhЕz,+qK}:RsF.*jH>עkƅz$a9d¤ΐHrXAQ^ |Pn$לҰ8I4lKfg5/fam줳\@YX2f( /J  "Tk q+ |2ݏ0mp )hxʕ;w|;?<σ]N-˰A>7X$zŘ*%HG1zc]Sio'+!Sme SNJ-Z^[W[=,)$X$GBAjԑbHLZ l7UT$Apd<[rX7'? >LIT)Zb KIa-XxPTT'P&G=$]a+]PVqJl_O-k yQzY:~+׵@ȒY48KԅGΈzYEkwIUA>``5 n "Denu2-fOEz}bK"MxW sQbglx^4n3U6p Ew2b2dds}şj,>p9^?WgYLt|ү=KE|q!܅805}[BЈ (.xMG _6/.ptuu%Ye%;Ƴٸ=fpRJjǖuUjYlms)d`ji,=d38h ]sݧ,byM]>U]XpB7b\P=x.~k&mX>7̯eIiViU#69ZCeł,:l#[7a^ lNpId^^Ч+o+"Y"fXz{Gp-=]J ZNt:wQQKTvjK/#\ N_fyncG_8wc}/ӽ ~>O] ܚEKp}m`_+W| tX7_Q>.A uD?R?>BWDPCmZ( X(YJ]tbyFTT\M.w>w!0~q̴#Vwn P5 sXbD88Ds^~ bn>C4tG>H%( MZFdڿ8M^{Vַ} ,)X5677o߾ AJRTbi|`%6nQl y]%JeFw2M,mGKT{2%ǖ[6^=)L')v^ԮX!Û9l%=PJZ⺿1'hwHTfLЧ/a1A[b:NJ~jK= CZ;J0ͩ@]Ecq\)/)i7$u#][0d#% S8p#.#o Jˉy=4D&S+˄\ͮiw6(QY E5(l9y]%kq4}.˅JONEo މi4̾ΝkLzN"zӐ 垏-z{gx߮b\qm3mbU :`>|<:¬6bM-M@[65fgY45zn18 ̀h| \YY\]]zn\ (wvv@DeBdX|ق0NA/?,Ѓ1>,ĢvnuŭHnT6 )u,LFQ j#%HF'GQDD8YO- %0ōߍG[YS>V6s0K K$RŖ -FQ #@Ƶ#֧( }GxV#p9VX&—e.%]2`4@t{c Pϛ hp"A6n`_6 ү%*bGk))PXz)ngILs}XT""qI3}8faRO@a8zdɥbѲAwW4 kVs"WDSN@.zń;J8[J` էA *Iq\ν ]=v0c7R>P؅݌N5ڄ1I A7DXe |y<=WV>CMq_|E_Gg?YД_Łw26J>eh%`I_wU,z( t?96Y SIύLbAS:[B#y5kd8g`n xEΰI fNFSV"ب`%l͂(ĵTNYYz.О <̈́eܺPZiiyZF2QT8GG2.MA3wz<"6cMNmd`OL5q+hCg 9wۂ4eHd$#q-ŭ$b2W0v߆NtdʬKG1/D<;)>}͛V# &,,ם]!:DsjmN,U:'z39[ٮOJ;g6J9] r!>Q֟~/Eq8'g*M6 9 srhRH)MX|YEؾ킾 2֜>"!_sk`W#T]mdb|xVo7[+?TJ\!? a:ZU;s4HSY*q>B3UZg \)tOłRp)Ks|Mޑ?gj:qX.9ރ7| 4U(L R(ܰ{?rKxqz| ݇Bb^!? תOdZhҪvvvVq‚'Ơ7hݓԟTKeؽ?t8?LJţJrq=uZ4ӀaGv*iX;X,砝Kųɘ4VA/i{_]_}nxtZ2I8퓃cCsY{a4_{f+QGF=sYc3Mb*𝣣[nb|g.:ʶPIm Raj^gss^xc^i߹Xqʕ ]Yu\{ONQYUBLe:c\Md_i6Ū՚caJ AO\-GIXz2}9 8N62P(ܻG+pL---(E{0T]9Ԏxgi6wv͊*UJqr7,8ۡO0xև:6vnW [m`V D" G!~؇J@`Clow h?=5dM1"Ɖ󇇇< h XޚW>|8O:QLVt0j5VXX*Ur{;V F̍h?{ٳ)Yo2[:^_;::*756J~Z덓9ǍY̕)XV8q8a¸{֟G%˫~vag'Q7VW[d8aA,զ?Fj X0y[ē|sc}WrOjX[<=>,WkQDf JLzZޖS '>ڕV7l߼1NR~䋹敵Ã`XAxYjCU 7+v<׆wƘŁҜpSgdS+w۵qwC7PѨxxX7Lm~c^\?YTa6Yt1̍_Dq\ z3V?R,K'=G>~FÌnU՝0/}Igx?\"Sqlj}kPtG4\hs#|b[nfţDI0h'+`11*RxWKՍý`&iX!hs ʵi,qj<]ŦGG!(WK NãϲN&ë'2=x_+½o|Mq:ʕvr]ngl(\oU=j4M~Yva8UR) Xq4"6}k[V) `/aon5gF?4ZXN17t*F7n>{vZi}oB Gݻ޸sZ.WJcR _qtMf+]RO^7aJuݏ~A ^86lu{AlVՂyu3\sYrK䅝rM&zcG ZT[5xOH9BQu}nP{Z?_σʰ'x_qg,!bP^-N{}|tZIBRJEU e0 3;[GolcU+š=Jͷk(eIeŰػZ:Tp|򫷞WG8vv{vmIw"YV鰷;`h:< =V86=R)W̟'=浪5{'WK\w?_>O}h^ͳ>S^ONB[+lh|_qG'_q >vށQ[uPWM5V:ap[s•hoVeD*;:Kavӳvu(oq9뜧bYe'nDz r4sϫWַJ~056o)k_~,NXRÿ}u:ew`}{//9j]vVkG7~v[W덫FӮJzUmeY`/'a% సն<~GleuOA\fl baG3WVDe94/ŢiƯ[;QTjCxWx<WSB$w`0(2<x2ISMxj%@@!*Lr:9qSˏ|8OiMaG8 01QL&`*777M{d}_'?;8;K#eI0YݤU&@/e `l 0-# zcrnRKv?v1mIgcVEB?zF#M~}8J'9s&HoEDc9ӧO=ny[v@D38u+pDȗYv70\ET/ZGv[i's3Q*qxyk^c87V vX߲tTzo_$șa5YuZ.x-}#s :&d|׮+e"JyҤv(\[_˓o.D c*p~){tNZhytDR=ٙT&n%~N71Vеr9"nHfBBzӢi\G^{u1hΞ~%u׼4gElD V/8F̻͟'3 Oo΋bіL:W={CpI]]kj#vF +Z"ŅQpi(KJPךZ?Z,k^ZyO8 D!rR78G1 _<1Gy5ł{}"C΅kRXoC?n&<M]Ad)z)2 Kzld*Net]Y}"!ԆN8U+'I~@*I Q2 i!%GC"ZF+ d>(A$:!|LeSp eqB*1)0"Ē E\)&c3mK*0$X4Bh41X2CZE?D|Yŵk^0n_wSJ!$cѺl"$\yrC؊8[1Z{g-s0m sSy W˽d}ǡZٷl "{}郓^9X?ގgnzTT1{=C2kITĉÓ:>`Y&ʖil6pK[l NgQy׿;cI3ur=60B$cPiΊrpqԭTͨmGGl뉮oqm}S'V z}Ps[{o^77D컶2chF2c&k|M3K>4w0mZC/ IMC[ oۦ8(=yI!Mخmi;AEXU˻{^wX&hqBz0%-Zjɓ`GV-=)@C9.WB̷o/X\42Ms?`߲q(L="^qBKaA@ղ|IncNMpy;"p,ˢ``.C,8Vs{ڴi1Q?Fqڶ=&@>ol)4mݺuŷ"(R2.jE(ͼK'جoo71,#P&k5PQ 7#.uko<ȠY遷߀yh -ӂ]^hUJ@"!76toW4ǡMlcSw{CO>滦(%AJ  |ͱ8 {nںd7aB( *E\B7zzmÊg~ֻw!9~G]eHDh˒IƧWtulbx Z RfD@U4ǎ]L}0P)p<; D#XmP>q 86\ KQ8_;vY;N'd G,Q"L L V#[^,Q14G2B]ƿEYӭtV'h hBoR ,4hpI^QhoѬO^pڂS`1* "Egv< u="H|G}}}|>lVؐoǪm#Yd &/XqCd͆Qsm"3w1 b4ݓT^X塥=[ Cfv¹0W">(I!vYjjo kÓ㪞'4e Wxvh!(O ʙj1n(eL9J lS6T(P8ئAT ȉM;w=|C BzcI+k!XluO M ;љȯq0f$Yhm=Q\.f8{ \ "b^_.d81 U .! Y#\1N]Lt+U`,p茷@Tx1LCp0Lnd\eb]H%dD##gkfNF7 9TϗS0Κ44!EMmjo vih7P~U)xhHbG@6@(βTphwW/E4K4=FQ@ Fϝ;Ϝu[蓏?Nk JUEim;†evewĊQdCxdACxoh_yMWl{:@Em4lB%8b!F ;c[[yrzIЛ#QeY$-BLnX,(ʢE8C'c6n(6UFNno$dp~P)'t{1uww4 p)JAJ(rT6 \iBC+V pp,r`Y;*RCSa`M"90CY\"*m= /d ]aR"r'[/<8,4Aсf*M 1"e46"4\EWH%/KȡMZH ZQ?3$FNj5(rk7|#V<, .r!fR41>aۼ9O i;DE劒EbG2 3uTVun8ΟEMf&C#Tu?`Z4B;^MXe;]A5G5L34u483fN(ZyGul ,>^6%ȴwOej;⾴r壿*wV@5g)%[3 ۳Pי6ID#OJ/E4}*7vȲ\)BEȨX5ӧӧ i5]YiEgHHe0tvdy%)|l"QBs r"y&AbuY\qk!~L6rc6iٖ1,CD%,Avttc^G8F{ |ؓhtDXJ/_~¸} ~-  [AUËUD^<b&fX6C%Sh ^釔LVL`?FaX< RI_Wuxo~ֵRgFZ֪K|nmks <[ȅG}yժoE"DcK%Ph@=qyYG.@Z.Їygdh]'/OTy=6gY;WDYmE( F'P?88\pqO Μ!M߶\Q"F]*f-[rק D~s\绮&~ӻjզ>(5FxHJ bk׋D!iێGyk(|czY<~~f;'4U'4ׁ:xMmj>0j͟%ٻXI\~NL>޻w߻z׈L $FLDb02l$++A-QGdHB(^;WwOO?8U}׬Cl y}9z{Us9VM.^V#w,VZE_/;ќr<+v]JȲP}c"RjKFyG X!1Q\(|趻iʈڵYfVʸihi8˒4 fDI5Tl*pƩ',r!4ˏ[6(8]SڱpFp,֠H8\زw).Ǐ/ꈩ.ՕNמ~ԝwk>%}qI[ai'Od`+TI:/U_'As_Pd%CmuDɷ7x.r,sKfFX~矟؏ :r)ϟ?{k| 1;Zl'~gjvh?؆%zܹ?_|?U+)fѯ~ꕭ/v76NTe˨F[W?T)Oèİt㏟;{֡?L?I!0a:X-㛓ʑCg>ޟصXsY'_RϿlZf&P[>MĽj%Q,JCg4s϶gT1W[ӏ=bR+gEGx5s *{Vl]tXĽ ه>^Y\]F Gy-ͦ/ K4 _~~B?RΜ9,,//={ԩSv#;wCŠܵNHgJER^X9vKWg#ҿu+.k@-ۗ.úq!̼N÷LzCܳiI' YRO%DPDmd7ØBOQZ=lkTX8[-նqyɦGxjLn@3a_(b"qe髣lvV)\.=ytέ|slR%8r}eqb75uD΁GCVll9N@^jR^˷3.^D8z[['7=22H6v*7^D:eq%񂤤hŅ~2Ps ] )ıL˗PZG1mTt>q=3lrgN)ta4fJ4KSÙ"%^`rK}a)x) 4\ =`Ѣ4YlvjGWQX*y kS uu䅳e~k~o`JU4Méj MbNF$Sġɢ>SIHHJ~+1ۅ8aV֦L4lJkSwx464+++_#AYk!ii-,,,Ѯ5,Vu]ьNi"T4Rh&OL 7&(L~*X9%L| ^h٭K/k_i` [3g*lq^xfP脣qJKOSxQRT' bd[P<_Jp/L{?I ,O'DEpk 쵵ͭj2{bsruYYըVb۫ǎ#]S#gx䦌w&mR;S4NVS,;a X$)ڻtCĿBٺXJaP%QFi`ĩ]( q^ß:ǡA*jbPۂe(sǴRg!Fr0$B Y=qb2zahQm}zeۻjkVllr%MW.vglV|$IX-7~g_P{,]T)&YJX+4 {#ϭW0٣~NszKf~MM;yMǾ^ʬ2KL&Xh2qjufa@~UO*! { x77"&ϼ$ kL8A*ׇL䣙@ Nԟ^h:C XjoCI(rÔ;Y]hB 8LGQ97u-EnLl[UIv>`J 9JYgc 2CcjY TUƾkd@ۺnTCofhQukG$ˍ%/ CӺn`jjʠ=ugi.BLaV,mll^\c8Y\ n1GvS/@n.9iN*!ZL0,*ngH^\~gNqע0pKgSx30j,2KYE'SaIhݩW3RP4\,^RB͂ݺ:r+NZO.4^VBRO3Ё8KaXvL MQI03t:cS IZVmn,tG l4G~'%K2-À'E; q0Su"}x yqdx wIqsdN?(rn~49JQ3yD8NLHX?TPb 禾\j *G.Eɡ@HSEJMr^X@X_<(Ħ !F0 !GP+ag)OؙnfR,#-*M]* }ڪp/(P,Am-SXȥDAS%LE6X䩈 1Lv( G8ν T1 a?C򹱹ɅW Q"~ו:"1";2|"i_\ "x46(P KsMxŭD6-8߃;G\.6bs,@gG}cN#o64}RIou4 >u Sx\pYF qsq ,χaɶOTbR|'}V|W>h6n]uo/ +|VJϋ Iy.;(.r"ɰI"Gfv_^]![9q`sjJ&5~PU4YeCq m؎X  5>-@ 4,xK 0wf?Vi޻hqhx덏/Ã1h8D(Dd즛wkVWɅ֒U߸jWկַ9LU$0ٔBV :T|iC| +,('@^KZRJ#)LwS7G!xUa4mUFI8$ioEh&oBw$ "7YR ҉eF2$%zԞҎ.9j-8-gCyA칉1'f$%WI\B]'wV#3i`_tdaf6ZyO õ$k 1O-ū*Tn*K}}r{GI~|''`Ec46ӿ3np,--X4cK('TVioo谥gVH!@8]8m1Ly2 ,e@`ZrXFb|+zܥMM up)[/՜饞/)BWfe S .v2DpR 4MxU7@@Baбhu> L`QȱXҺ\HR/F|Rkx'mdH@aVUEOe? -%ܲTфtWZw^ mMΩ/rj $o*<&bW)17.7JKJ:8rE}ON;Nɶ$HUuiC #1:'Ǥ,(eG3]ϫB迀BΡE#Aղ;Z͆°ycGYr`QB3Yݫ m۶mʔR;Kӧwòp0d&go<|-)֯5~=ˋ[*'Dk`daN BΥxejBzc)1UAҸb\ })XZĪTзXx0gCdfnCבM$ A|_11LƼ>\RSӔNFϗMM5v Kr\sTdLE=S۶8L>sWr5zZF NoV#yY2Mq̴ "$: !Q FX*cY#KkG-SuLCuUJ"jӛ<*b]hǽHFAn-/a(MǓېuGi9IC.1⺊T?˟oWBοcL/wIOsI)K%K;z|?|ߺu+$j^x2Amt^j;v N:m\M<]p[c+EtŔNzxOT4L iOYly<&іjZc5r.DC_*"9"Rud,r cHļǑM`TGR=G k6Wv%X*P!Յ6] `XIehGccR/cbW2C^ juJ6TQT0P xAZ@ed 4o4 n.tWSX ofP,kTh c<dUQJHx\Bw{c*5ZC7=:Sk}4 d>k ʔ6dY9eV&0 (Q Ќ0wӨ HR(梿" 4\o4gYj0^hM\7B&S\[{ФbjܖXKδ64yy[WҥKgӺmdS J|ejJtB9s022aRTjKvZkԗMb %VS142KDp]Vǡ/Cٔr,u4`Uh')Yb(e`:KjycS5l"SUf>~ C|9qK M1,jhWFvF0Qlv4\T`7T&E%u8K b/rF(%:>P,\P.%52B 97?qwܫױ=yx=r#9O }}} v6 ͘1s>rCLr)]wx.6SkCCnoo8ݟ\ƾesUN,2sN,dXS(B>ӳE#q/4VQqrmmm9::k!OCd!Y51 ԁb3tENro5'I[Q~ j+qmrM.TnL".E,< ,#T62{L~32v=MPHb|g5GՅ'/bYL/FnjńV5 8-9 ՈJ:byL2)]0L9bU'`,DjD6cC̖XV4RzҴwTq"ڦ'}5k!cT*]\GajՉÅ{GkjM7ّ^L_ bkql,dB~>CGpCԓEXv)Se3°츼Rn[{-ɢ zyuyi֣j8NY#e0MǏwww=zAJrp$Iw̚5>LJf E᝝ɓ ,N1000gwҤI"YҥKe͒5adxXֿt^oT*2_) ˄Ҕ@.aa=dTBRA!Z;.p.ؼӔOٳg{:޽{,X@8ۻ}v4jl9>44y 47owc2zB*1SWV;gUqb4XZP>QzhuSWNUGZJ͹g/ynn.hWfN?)h4 =|^ \'YL%u?mg0Y/eyh㴦mpEKѕ`HB %J2|)&+ʩ-3YM^8y&}Z%_> _Zc*?U|?zVT?裏~W\q@O??mae…ۚ5w;wi0ڀu4N6\>8㣏>22Ԓ%‹L<"ر`Bx#Ihӧܵkg DGS:WnZ7iRolZ"ˍ@DvЇ}>k ?mUH$={.`q>4$sߩСC̙>}:)9s捌?:Z z{/?ӝcd9WA]lQKGGŀvD4 PHJrꫯo*Ǜo9w~iTʑgyϘ1kvhcΝ;%>Mƍ74nY`D $/Mɾe.caÆw}PiP;.*FX1O1Ƌ;cOxϘ_ZkI=~ڑ"ɨ.vOvg,#/g "LqSi%TK딙]ǫuvZljge?hQ5WNjO*5v'g.|a<+UEÌT;,_$*,̛7#^{-@_|i8X8 o9k.{/^l),18N$3%m#f4(L.uQ))L"M!R,gŒSśbA+ã48m6XhnrR9?ڥK~_NE 0jAlQYHl`G4F( XJ^ZHfJRԔ)Sٳn:7oϚ5k~ywR(m\Drǎ===\#nbCC(4Q?}#RH!RH!eςZxۀMx ϰY$XX~-[o"W^y%Qo |+/ ,(w.[@O9s_ڔ~=)S#tE{HG`+P,w^N(2c[a,چ8ue~`pNu7 ,9H9O=5\cS>KAzr̨4t\/믿K85:|0,;E'14PH!RH!Zڲh8,&FCӥl#M"AI*w&;ж|rwnx7f͚+sνkm۶e˖{:Z(;cǎQHww7?)O?y^J#'|矃&wqPHJ@ f}h$i&C䃄,Y ;l"@RR \}(fvtCڵke+Y)h$-ʕ+җ^zvB{08E>|uZKM6Q/ H^vڵPݷ~uVh(̙3ph{Ŋlў!;h={8kT1CT v7[K;;;:d ~Z0-Aj $ -ĞdUQPRH!Y-v~'lE /{Т:HPk)?\֭[zjr; >/0;C*XiNohY܁R8,x7R> &c+;w\p![ Tb#*AI4R2ܾ};uA'01Dh)p)6M.B_1cٻUd.Z 8O)B7n<|0e#Sb/P&2ԆPjOݼy3hh"N$>|M c`gTa<@3IxAPPH!RH!Z͔Zӥe, 5ESKʫ sc8e{}ݔm6e[o3g>:mTag͜F-<;@$P+4%u@1*@޽{ٱ\/Nrs=7thhhZ ґ1AFzEoc>3۪Ej#ŸSNAyT/rA}bIix <;šߞmXx={(pEtrȵl2^pP,˟T}nٲO>J04s-rq,YBi;vQYji7sW@}#RH!RH!Y4-Z<5p= `tbpU8pVXr%ꫯ::k@IFdҪU M6+f$,VuuuQ,Bz(!; N}d\v-W{W}.Uݱ$΅$t@ u!DnF |CF0"tGbШn>(l'v|I]v\9MLz:g:d^SY{ubþ} J`>3J>Ѩta|_}U ZUfm>?rM?cǏ%m=Ҭ=nx `KEY.w(+ڎ;%Ҹv4mge`5:1a+ rm߾ 4Gz=11:u 7]?޽Ӊ Dyf,,#ɏbY[0L&t;F6@PKo.5mQD-aT}Zh0q>~WhbZb J tL0. Ȕv<:ķNq4}TB|'>#JhÄѣ<"-ĉo j5Gا逸믿& cccxe*;bGڌ4NI:hRhBPw}71N͡u h5WN5Y"L"uʵT¥6$~Y@駟/+%n=܃/⡇ Пs镉 qŇod2Lk]XQjQk~)ZerrҥK 8fiiIZhq/O<# #Ԕ+5}]p'|B ޽{} Ï:܀,8C0=$eqZW(Tv@,yxOΞ=KtM3$K/tw zg|MxEy&&&&N: W{pj1>Vx;:W0{QjcO˵Be*fUNn[oi[=%7d2L&Ӎ幟~ѿ! W'.{K^][f'GF W< ǎ%8PR}* 0hF.r囦>RS>Buuui0l m8pDJgh0Sڪ!.XoW!3Ѭ+ ?94(Rܠ]Ԫ;@e Ґ#<|Çq&1qCC@fq̙3\bW zzͷڠ#FgouE 2ut: Ć7x$o6#">%h'hǏ'OP:K^`ө}Zjyp?d,/cg!J`g*[0L&s,߼W b/LrZ m懫;bߚSghdx_l~6;E>m9E>;t:Pt_4aMj7 ǚ`[إ9*oٲBhpQpdݸv(7)p"@1`@4Wmv]v)kPUS7u,0LCZ:Ǐ|ԙ{~ TՊL +%&0Y1q@bCbATĩF]NY>=f 5OyE(*&|+ ](yDF Jk5QqUHqR [RSSS::emu)kt1߹sG 1iϷDkJ oݲL&fdq5:iCizeȆ!=A#AH7h[ v D9_iBEp2KKK _qUC4M',Ptc`6P~yʱ e4 3j} 4::J#C~$JjC_NBQrtҒ (QN&TsX[t<)q# (X= Sck:Pin5Ӎ4#JDM8XIXz#|Յ}O'JGEPnƠ߹i*Z~j2L&GuӜ mڅrՊ΍۰o߾˗,~L/ͮB<_̥--iRp M Ӫ R8hF2 "S4 }v SٻwV Beꔿ4< Hrupppll S(7!ݡ\)h<儭pg5}}LbW:G4F!{kYaJys8bgWnVZXM5_h@OՆ7EpFJs~d2L7W]9ܻ9~u`-$KW{hE Kj+Cj=]VWv}DӶ~}?:>mUlp{%PHIHidu$`GGu|t;eWẖ&뜙G-x6SkN =ttt҄6 CQPl۶~Q_0wC= _Y BTWUɮ;5,S:A^K{6MXi;& ͛&&fhE%.?p{u(!z'ct˖BX-,6KlKU2Qv6̹8rQ yէ[]V][Vkc_seeA1-I+\m_YY6L&d2mgO@l:j"XVqV/D.C\j^)bϏ*ZWBV-Eq6S? R6L&dEbZfs%يB?kjԙ%6)+E펈Zi.fn+;Q]oxP[-$Na% ^Kď8fZ M&d2n!yikS?Kb&ŰP 8NWV V+Zn9/[ ]m{.><[, 6Jƪׄa! Ed2L[G~FWGAqqj6Uʅ l>$k4tvW_I41⥮('پZ58r. ۹guZ+W׊Zq9Ȫi%l~Yd2L[EV+^U;FVH j5[8^mdysUJrXʊB+iRl9΋<,L&d2:࢟â6xg;Sbϋf-\}!tWFbPd&fP _ti!_f"k6Y4L&dg95 M~Jى|W8pI!|TrIENDB`mondrian-3.11.0.1-R/doc/index.html000066400000000000000000000041231261646570300165150ustar00rootroot00000000000000 Pentaho Analysis Services: Mondrian OLAP Server

Mondrian logo

Author: Julian Hyde; last modified, August 2006.
Version: $Id$ (log)

mondrian-3.11.0.1-R/doc/install.html000066400000000000000000000740371261646570300170670ustar00rootroot00000000000000 Pentaho Analysis Services: How to Install Mondrian
How to install Mondrian

This package is for Mondrian developers and power users. If you are interested solely in Mondrian's analysis capabilities from a user standpoint, download the Pentaho Business Intelligence Server instead.


  1. Introduction
  2. Set up test data with a non-embedded database
    1. Microsoft Access
    2. Other database
    3. Optional data sets
  3. Deploy and run the web application with a non-embedded database
  4. Deploy and run the web application with the embedded test database
  5. How to configure Mondrian as an XML/A provider
    1. Describe the data sources in datasources.xml
    2. Configure XmlaServlet in your web.xml
  6. Miscellaneous
    1. Configuring mondrian.properties
    2. Cache setup
  7. Database compatibility
    1. Infobright
    2. Ingres
    3. MySQL
    4. PostgreSQL
    5. Sybase
  8. Compatibility issues
    1. Weblogic 6.1 and Xerces
    2. Log4j and Tomcat

1. Introduction 

The core of Mondrian is a JAR that acts as "JDBC for OLAP": providing connections and executing SQL against underlying relational databases. This can be run within a surrounding application. Mondrian comes to you as binaries packaged in a number of ways:

  1. As a WAR which includes JPivot, an OLAP web application framework, and example data that can be loaded into your database of choice.
  2. As a WAR with JPivot and an embedded Derby database, which requires no additional set up apart from deployment to an application server.

Both distributions contain the Mondrian source. All necessary JARs for Mondrian are contained in the WAR /WEB-INF/lib directory.

Here is how to install a binary release:

  1. Install the Java SDK (1.4.2 or later).
  2. Download the latest binary release mondrian-version.zip from SourceForge, and unzip it.
  3. For the non-embedded distribution, set up the FoodMart dataset, as described in section 2.
  4. Set up and start the web application, as described in section 3 or 4.

If you are a Mondrian developer, there are additional instructions for accessing the Perforce source-control server and building the code in the Developer's Guide.

2. Set up test data in a non-embedded database 

The 'FoodMart' test dataset is part of the non-embedded binary distribution. It is shipped in two formats: a Microsoft Access database (demo/access/MondrianFoodMart.mdb) and in a SQL script of insert statements (demo/FoodMartCreateData.sql).

Under Windows, using the Access database is easier to set up, because all you need to do is define an ODBC data source. If you want to test using a non Access database, or if you are not using Windows, you will need to create your own empty database and load it using the MondrianFoodMartLoader utility.

2.1. Microsoft Access 

If you are using Windows, Microsoft Access is the easiest database to use for the test dataset. You just need to set up an ODBC datasource for the test dataset.

The test dataset needs to be accessed by the unit tests if you are testing with just this database, or loading into another database.

Under the 'Administrative Tools' menu, click on the 'Data Sources (ODBC)' menu item to open the ODBC Data Source Administrator. Next, create a System DSN called MondrianFoodMart pointing to MONDRIAN_HOME/demo/access/MondrianFoodMart.mdb. (This allows Mondrian to access this data source using the JDBC connect string "jdbc:odbc:MondrianFoodMart".

2.2. Other database 

If you are not using Access, you can use the MondrianFoodMartLoader utility to create a database and load data from an SQL script ([-inputFile=<file name>]). But if you have already loaded the data into one JDBC data source (say Microsoft Access), use the -inputJdbcURL and related options to copy the data to another JDBC database.

The loader uses the standard J2SE JDBC, relevant JDBC driver JARs, and some classes out of Mondrian that do not rely on additional JARs. It has been tested against Oracle, PostgreSQL, MySQL, and Microsoft Access.

If the target is a JDBC database, you must create the necessary database or schema first. This is database-specific.

You can safely ignore any log4j warnings:

log4j:WARN No appenders could be found for logger (mondrian.rolap.RolapUtil). 
log4j:WARN Please initialize the log4j system properly.

Syntax

MondrianFoodMartLoader
    [-verbose] [-tables] [-data] [-indexes]
    -jdbcDrivers=<jdbcDrivers>
    -outputJdbcURL=<jdbcURL>
    [ [ [-outputJdbcUser=user] [-outputJdbcPassword=password] [-outputJdbcSchema=schema] [-outputJdbcBatchSize=<batch size>] ]
    | -outputDirectory=<directory name>
    ]
    [ [-inputJdbcURL=<jdbcURL> [-inputJdbcUser=user] [-inputJdbcPassword=password] [-inputJdbcSchema=schema] ]
    | [-inputFile=<file name>]
    ]

Options

Option Description
-verbose Verbose mode.
-tables Create tables in output JDBC, or generate CREATE TABLE statement file in output directory for all FoodMart tables, as appropriate for the output database type. If not given, the tables are assumed to exist, and will be deleted first.
-data Load data from input (JDBC, insert statement file) to output (JDBC, insert statement file). Any existing data is deleted first.
-indexes Create indexes in output JDBC, or generate CREATE INDEX statement file in output directory for all FoodMart tables, as appropriate for the output database type.
-jdbcDrivers=<driver list> Comma-separated list of JDBC drivers needed to connect to the source and target databases. The JAR files containing these drivers must also be in the classpath (the -cp argument to the java command).
-outputJdbcURL=<jdbcURL>

JDBC URL for target database

-outputJdbcUser=<user> User name for target database
-outputJdbcPassword=<password> Password for target database
-outputJdbcSchema=<schema> Optional. For databases that use schemas, the destination schema. If not provided, the default schema for the user/database will be used.
-outputDirectory=<directory name> Optional. Directory where DB creation scripts will be placed. Statements are in a format that will work for the database type indicated by outputJdbcURL.
-outputJdbcBatchSize=<batch size> Size of batch for JDBC INSERT statement output. Defaults to 50. If set to 1, JDBC batches are not used.
-inputJdbcURL=<jdbcURL> JDBC URL for source database
-inputJdbcUser=<user> User name for source database
-inputJdbcPassword=<password> Password for source database
-inputJdbcSchema=<schema> Optional. For databases that use schemas, the source schema. If not provided, the default schema for the user/database will be used.
-inputFile=<file name> Optional. If no input DB parameters are given, assumes data comes from this file of INSERT statements.

Examples 

Here are some examples to give you a general idea how MondrianFoodMartLoader is invoked. The command line you use will vary depending upon your operating system, and intended source and target data sources.

Example 1. Loading MySQL from a file on Linux 

The following example is a Linux command line to create a MySQL schema called 'foodmart', and create FoodMart tables from the test dataset in the SQL scripts. First, create a foodmart database and a foodmart user:

$ mysqladmin create foodmart
$
mysql
mysql> grant all privileges on *.* to 'foodmart'@'localhost' identified by 'foodmart';
Query OK, 0 rows affected (0.00 sec)

mysql>
quit
Bye

Now load the data:

$ java -cp "/mondrian/lib/mondrian.jar:/mondrian/lib/log4j.jar:/mondrian/lib/commons-logging.jar:/mondrian/lib/eigenbase-xom.jar:/mondrian/lib/eigenbase-resgen.jar:/mondrian/lib/eigenbase-properties.jar:/usr/local/mysql/mysql-connector-java-5.0.5-bin.jar"
     mondrian.test.loader.MondrianFoodMartLoader
     -verbose -tables -data -indexes
     -jdbcDrivers=com.mysql.jdbc.Driver
     -inputFile=/mondrian/demo/FoodMartCreateData.sql
     -outputJdbcURL="jdbc:mysql://localhost/foodmart?user=foodmart&password=foodmart"
Example 2. Loading PostgreSQL from Access on Windows 

The following example is a Windows command line to create FoodMart tables for PostgreSQL from the test dataset in the Access database:

C:\mondrian> java -cp "C:\mondrian\lib\mondrian.jar; C:\mondrian\lib\log4j.jar; C:\mondrian\lib\commons-logging.jar; C:\mondrian\lib\eigenbase-xom.jar; C:\mondrian\lib\eigenbase-resgen.jar; C:\mondrian\lib\eigenbase-properties.jar; C:\mondrian\lib\postgres-jdbc.jar"
     mondrian.test.loader.MondrianFoodMartLoader
     -verbose -tables -data -indexes
     -jdbcDrivers="org.postgresql.Driver,sun.jdbc.odbc.JdbcOdbcDriver"
     -inputJdbcURL="jdbc:odbc:MondrianFoodMart"
     -outputJdbcURL="jdbc:postgresql://localhost/foodmart"
     -outputJdbcUser=postgres
     -outputJdbcPassword=password

2.3. Optional data sets 

The Steel Wheels data set is optional. To install the Steel Wheels data set on MySQL, run demo/mysql/SteelWheels.sql in MySQL:

$ mysql -ufoodmart -pfoodmart < demo/mysql/SteelWheels.sql

There is no supported process to load the data set on other databases. (Contributions welcome!)

Mondrian's test suite assumes that the data set is in a MySQL database called 'steelwheels', and uses the schema definition 'SteelWheels.mondrian.xml'. If Mondrian detects the schema, the test suite will run some additional tests; if not, those tests will trivially succeed.

3. Deploy and run the web application with a non-embedded database 

  1. Install Tomcat (version 5.0.25 or later).
  2. From the unzipped binary release, explode lib/mondrian.war to TOMCAT_HOME/webapps/mondrian
  3. Create or open the mondrian.properties file in TOMCAT_HOME/webapps/mondrian and customize the  mondrian.jdbcDrivers properties for the database you set up from the instructions above.
  4. Open the web.xml file in TOMCAT_HOME/webapps/mondrian/WEB-INF and customize the two connect strings there to the same database parameters for the FoodMart database you installed as per the above instructions. That is,
    Provider=mondrian;Jdbc=jdbc:odbc:MondrianFoodMart;Catalog=/WEB-INF/queries/FoodMart.xml;JdbcDrivers=sun.jdbc.odbc.JdbcOdbcDriver;
    becomes
    Provider=mondrian;Jdbc=jdbc:mysql://localhost/foodmart?user=foodmart&#38;password=foodmart;Catalog=/WEB-INF/queries/FoodMart.xml;JdbcDrivers=com.mysql.jdbc.Driver;
  5. Modify the fourhier.jsp, mondrian.jsp, colors.jsp and arrows.jsp files in the TOMCAT_HOME/webapps/mondrian/WEB-INF/queries folder. Modify the line
    <jp:mondrianQuery id="query01" jdbcDriver="sun.jdbc.odbc.JdbcOdbcDriver" jdbcUrl="jdbc:odbc:MondrianFoodMart" catalogUri="/WEB-INF/queries/FoodMart.xml">

    to the same database parameters for the FoodMart database you installed as per the above instructions. For MySQL, this would be something like the following:

    <jp:mondrianQuery id="query01" jdbcDriver="com.mysql.jdbc.Driver" jdbcUrl="jdbc:mysql://localhost/foodmart?user=foodmart&password=foodmart" catalogUri="/WEB-INF/queries/FoodMart.xml">

  6. Copy the following files:
    • If needed, copy your JDBC driver JAR to TOMCAT_HOME/common/endorsed
    • Copy xalan.jar to TOMCAT_HOME/common/endorsed
  7. Start your database, if needed.
  8. Start Tomcat.
  9. Hit http://localhost:8080/mondrian.

4. Deploy and run the web application with the embedded test database 

  1. From the unzipped embedded database binary release, explode lib/mondrian-embedded.war to TOMCAT_HOME/webapps/mondrian-embedded
  2. Start up Tomcat
  3. Hit http://localhost:8080/mondrian-embedded

5. How to configure Mondrian as an XML/A provider 

To will setup XMLA service, follow these steps.

1. Describe the data sources in datasources.xml 

In WEB-INF directory of your webapp, create a file called datasources.xml, with content like this:

<?xml version="1.0"?>
<DataSources>
  <DataSource>
    <DataSourceName>MondrianFoodMart</DataSourceName>
    <DataSourceDescription>FoodMart 2000 Data Warehouse From MS Analysis Services</DataSourceDescription>
    <URL>http://localhost:8080/mondrian/xmla</URL>
    <DataSourceInfo>Provider=mondrian; Jdbc=jdbc:odbc:MondrianFoodMart; JdbcDrivers=sun.jdbc.odbc.JdbcOdbcDriver</DataSourceInfo>
    <ProviderType>MDP</ProviderType>
    <AuthenticationMode>Unauthenticated</AuthenticationMode>
    <Catalogs>
        <Catalog name="FoodMart">
            <Definition>/WEB-INF/schema/FoodMart.xml</Definition>
        </Catalog>
        <Catalog name="Marketing">
            <DataSourceInfo>Provider=mondrian; Jdbc=jdbc:odbc:MarketingDB; JdbcDrivers=sun.jdbc.odbc.JdbcOdbcDriver</DataSourceInfo>
            <Definition>/WEB-INF/schema/Marketing.xml</Definition>
        </Catalog>
    </Catalogs>
  </DataSource>

  <DataSource>
    <DataSourceName>PostgreSQLTest</DataSourceName>
    <DataSourceDescription>Test Data Warehouse On PostgreSQL</DataSourceDescription>
    <URL>http://localhost:8080/mondrian/xmla</URL>
    <DataSourceInfo>Provider=mondrian; Jdbc=jdbc:postgresql://localhost/olap; JdbcDrivers=org.postgresql.Driver; JdbcUser=pgsql; JdbcPassword=pgsql</DataSourceInfo>
    <ProviderName>Mondrian</ProviderName>
    <ProviderType>MDP</ProviderType>
    <AuthenticationMode>Unauthenticated</AuthenticationMode>
    <Catalogs>
        <Catalog name="Test">
            <Definition>/WEB-INF/schema/TestPgsql.xml</Definition>
        <Catalog>
    </Catalogs>
  </DataSource>
</DataSources>

<ProviderType> and <AuthenticationMode> are ignored because the XML/A implementation currently only supports 'MDP' and 'Unauthenticated'.

Multiple data sources and multiple catalogs

If you intend to use Mondrian with Microsoft's ADOMD.NET client library or Simba's O2X bridge, the data sources file must have precisely one <DataSource> element. These clients will ignore all but one data source. Other XML/A clients, such as Rex, work fine with multiple data sources.

Note that each catalog has a name attribute, and the URI (path) of an XML schema file. The name of the catalog must match the name attribute in the schema file (for example <Schema name="FoodMart">).

Whether  you use one data source or several, the catalogs in the datasources.xml file must have unique names.

5.2. Configure XmlaServlet in your web.xml 

For example:

<servlet>
  <servlet-name>MondrianXmlaServlet</servlet-name>
  <servlet-class>mondrian.xmla.impl.DefaultXmlaServlet</servlet-class>
</servlet>

6. Miscellaneous 

6.1. Configuring mondrian.properties 

Properties are described in the Configuration Guide.

6.2. Cache setup 

You will need to specify the amount of memory available to the cache using the -Xms Java VM option, for example -Xms256m for 256 megs of ram for the Java VM.

7. Database compatibility 

Mondrian is known to run on the following databases.

  1. Apache Derby (formerly known as Cloudscape)
  2. Firebird
  3. Greenplum
  4. HP Neoview
  5. Hypersonic (also known as hsqldb)
  6. IBM DB2
  7. Infobright
  8. Informix
  9. Ingres
  10. Interbase
  11. LucidDB
  12. Microsoft Access
  13. Microsoft SQL Server
  14. MySQL
  15. Netezza
  16. NuoDB
  17. Oracle
  18. PostgreSQL (also known as Postgres)
  19. Sybase
  20. Teradata

Mondrian can work on almost any JDBC data source, so even if your database doesn't appear in the above list, give it a try. Mondrian can generally figure out the capabilities of the database from the JDBC driver, and generate SQL accordingly.

If you get Mondrian working on another database, drop us a line. Let us know which driver you used, the version of your database, property settings, and any other tweaks which were required. You can find examples of connect strings and driver paths for most database in mondrian.properties.

General database tips

For sample connect strings, look in mondrian.properties. There are are sample connect strings for most databases in there.

Infobright  

Infobright is a variant of the MySQL system. In fact, Infobright uses the regular MySQL driver, and even reports its product name as 'MySQL'! Mondrian detects Infobright by looking in the INFORMATION_SCHEMA.engines table; if there is an engine called "BRIGHTHOUSE", mondrian assumes the Infobright dialect.

First download and install Infobright Community Edition (ICE). To create and populate the FoodMart schema, most steps are the same as for MySQL. ICE does not support the INSERT command, so MondrianFoodMartLoader automatically uses the LOAD DATA INFILE command.

If the JDBC driver gives the error Unknown character set: 'usa7', try adding &characterEncoding=UTF-8 to the end of the JDBC connect string.

Ingres 

Andy Grimm writes:

In addition, I had to run a perl script against the demo sql file:

> perl -pi -e "s/:00\.0/:00/g" FoodMartCreateData.sql

That drops the ".0" off each timestamp to make it a valid DATE. Our next release will support timestamps, so this is a short-term fix that could go into Release Notes.

MySQL  

See the MySQL example.

PostgreSQL 

See PostgreSQL example.

To install PostgreSQL 8.2 and its JDBC driver on Ubuntu, I typed:

$ sudo apt-get install postgresql libpg-java

The JDBC driver can be found at /usr/share/java/postgresql.jar.

Change password:

$ sudo -u postgres psql postgres
# ALTER USER postgres WITH ENCRYPTED PASSWORD ' <***password***> ';
# \q

Create a user and a database:

$ sudo -u postgres createuser -D -A -P foodmart
$ sudo -u postgres createdb -O foodmart foodmart

Sybase 

mizar_sf writes:

I tried some solutions to get mondrian (I used 2.1RC) connected with a Sybase ASE [version 12.5] server. Finally I found this solutions:

  • Downloaded a jdbc3 compliant driver like jtds-1.2.jar from sourceforge.
  • Placed the driver in TOMCAT_HOME/common/endorsed
  • In configuration files like
    • mondrian/WEB-INF/datasources.xml
    • mondrian/WEB-INF/web.xml
    I modified the parameters line in this way:
    Provider=mondrian; JdbcUser=userName; JdbcPassword=userPass; Jdbc=jdbc:jtds:sybase://xxx.xxx.xxx.xxx:port/dbName; JdbcDrivers=net.sourceforge.jtds.jdbc.Driver; Catalog=/WEB-INF/queries/myCatalog.xml
    (The datasources.xml doesn't need to be modified if you are only testing the db, but if you are using something like OPENI you have to.)

8. Compatibility issues 

8.1. Weblogic 6.1 and Xerces 

Weblogic 6.1 ships with an older, incompatible, version of Xerces. The symptom is the error

java.lang.VerifyError: (class: org/eigenbase/xom/wrappers/XercesDOMParser, method: parse signature: (Lorg/xml/sax/InputSource;)Lorg/w3c/dom/Document;) Incompatible object argument for function call
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:120)
at org.eigenbase.xom.XOMUtil.createDefaultParser(XOMUtil.java:165)
at org.eigenbase.resgen.Util.load(Util.java:49)
...

The solution is to place xml-apis.jar and xercesImpl.jar before weblogic.jar on your class-path.

Generally, Mondrian uses whichever JAXP-compliant XML parser is provided by the system. Unfortunately Weblogic's parser cannot be set to non-validating mode, and Mondrian needs this. Therefore, in a Weblogic environment, Mondrian explicitly uses Xerces.  Fyi, this note describes how to change Weblogic's default XML parser.

8.2. Log4j and Tomcat 

The Mondrian WARs come packaged with a version of log4j.jar. This may conflict with your app server, such as JBoss, and cause errors in the log about log4j appenders. The fix is to remove the log4j.jar from the Mondrian WAR.

 


Author: Julian Hyde and others; last updated March, 2009.
Version: $Id$ (log)
Copyright (C) 2001-2005 Julian Hyde
Copyright (C) 2005-2009 Pentaho and others


mondrian-3.11.0.1-R/doc/install_es.html000066400000000000000000000776251261646570300175640ustar00rootroot00000000000000 Pentaho Analysis Services: Cmo instalar Mondrian
Cmo instalar Mondrian

  1. Introduccin
  2. Configuracin de los datos de test sobre una base de datos no embebida
    1. Microsoft Access
    2. Otras bases de datos
  3. Despliegue y ejecucin de una aplicacin web con una base de datos no embebida
  4. Despliegue y ejecucin de una aplicacin web con una base de datos embebida
  5. Cmo configurar Mondrian como un servidor XML/A
    1. Descripcin de las fuentes de datos (datasources) en datasources.xml
    2. Configuracin de  XmlaServlet en el archivo web.xml
  6. Miscelnea
    1. Configuracin de mondrian.properties
    2. Configuracin de la cach
  7. Bases de datos compatibles
  8. Aspectos de compatibilidad
    1. Weblogic 6.1 y Xerces
    2. Xalan y Tomcat
    3. Log4j y Tomcat

1. Introduccin 

El ncleo de Mondrian es un JAR que acta como "JDBC para OLAP": proporcionando conexiones y ejecutando consultas SQL contra la base de datos relacional que sirve los datos. Los binarios de Mondrian vienen empaquetados de diferentes maneras:

  1. Como un paquete WAR que contiene Jpivot, un framework para trabajo con aplicaciones web y tecnologa OLAP, junto con un ejemplo de datos que pueden ser cargados en una base de datos de su eleccin.
  2. Como un paquete WAR que adems de contener a Jpivot, incluye una base de datos Derby, con lo que no se requiere ninguna configuracin extra, aparte del despliegue sobre el servidor de aplicaciones.

Ambas distribuciones contienen los fuentes de Mondrian. Adems, todos los JARs necesarios para la ejecucin de Mondrian estn incluidos en la distribucin, en el directorio WAR /WEB-INF/lib.

A continuacin se detallan una serie de indicaciones para realizar la instalacin del binario:

  1. Instalar Java SDK (1.4.2 o superior).
  2. Descargar la ltima versin del binario de Mondrian: mondrian-version.zip desde SourceForge, y descomprmalo.
  3. Para la distribucin sin datos embebidos, configure la base de datos FoodMart, tal y como se describe en el apartado 2.
  4. Configure y ejecute la aplicacin web, tal y como se describe en los apartados 3 o 4.

Si su objetivo es desarrollar con Mondrian, existen instrucciones adicionales para el acceso al servidor de control de fuentes Perforce y  para compilar el cdigo fuente en the Developer's Guide.

2. Configuracin de los datos de test sobre una base de datos no embebida 

La base de datos 'FoodMart' forma parte de la distribucin binaria sin base de datos embebida (non-embedded). Se proporciona en dos formatos: como base de datos Microsoft Access ( demo/access/MondrianFoodMart.mdb) y como un script SQL de sentencias de insercin ( demo/FoodMartCreateData.sql).

Bajo Windows, utilizar la base de datos Access es lo mas sencillo de configurar, ya que slo es necesario definir una fuente de datos ODBC. Si se quiere probar a utilizar una fuente de datos que no sea Access, o si no est utilizando Windows, ser necesario crear una base de datos vaca y cargar sobre la misma los datos proporcionado en el script, utilizando la utilidad MondrianFoodMartLoader.

2.1. Microsoft Access 

Si est utilizando Windows, utilizar Microsoft Access es la manera ms sencilla de configurar la base de datos de prueba. Slo ser necesario configurar una fuente de datos ODBC para los datos de prueba.

La base de datos de pruebe debe ser accesibles para las prueba unitarias si est realizando pruebas con esta base de datos, o cargados en otra base de datos.

Bajo el men 'Herramientas Administrativas', situado en el Panel de Control de su equipo, haga click sobre  'Orgenes de datos (ODBC)' para abrir el administrados de fuentes de datos ODBC. A continuacin cree un DSN de sistema llamado MondrianFoodMart apuntando a MONDRIAN_HOME /demo/access/MondrianFoodMart.mdb. (Esto permitir que Mondrian acceda a los datos utilizando la cadena de conexin JDBC "jdbc:odbc:MondrianFoodMart".

2.2. Otras bases de datos 

Si no utiliza Microsoft Access, utilice la utilidad MondrianFoodMartLoader para crear una base de datos y cargar los datos a partir del script SQL.

Sintaxis

MondrianFoodMartLoader
    [-verbose] [-tables] [-data] [-indexes]
    -jdbcDrivers=<jdbcDrivers>
    -outputJdbcURL=<jdbcURL>
    [ [ [-outputJdbcUser=user] [-outputJdbcPassword=password] [-outputJdbcBatchSize=<batch size>] ]
    | -outputDirectory=<directory name>
    ]
    [ [-inputJdbcURL=<jdbcURL> [-inputJdbcUser=user] [-inputJdbcPassword=password] ]
    | [-inputFile=<file name>]
    ]

Options

Opcin

Descripcin

-verbose

Modo de eco de pantalla.

-tables

Creacin de tablas a travs de JDBC, o generacin de un fichero con sentencias CREATE TABLE en un directorio de salida para todas las tablas FoodMart, en funcin de la base de datos de salida. Si no se especifica este parmetro, se asume que las tablas existe y que se borrarn primero de cargar los datos.

-data

Carga de datos desde una entrada (JDBC, fichero con sentencias insert) a uno de salida (JDBC, fichero de sentencias insert). Cualquier dato existente se borrar primero.

-indexes

Crea ndice en la salida JDBC, o genera un fichero con sentencias CREATE INDEX en un directorio de salida, para todas las tables de FoodMart, en funcn de la base de datos de salida

-jdbcDrivers=<driver list>

Lista separarada por comas de drivers JDBC necesarios para la conexin con las fuentes de datos origen y destino. Los ficheros JAR que contienen estos drivers deben de estar en el directorio especificado en la variable classpath (argumento -cp del comando java).

-outputJdbcURL=<jdbcURL>

URL JDBC para la base de datos destino

-outputJdbcUser=<user>

Nombre de usuario de la base de datos destino

-outputJdbcPassword=<password>

Password de la base de datos destino

-outputDirectory=<directory name>

Opcional. Directorio de creacin de los scripts de la bases de datos. Las sentencias estn el formato adecuado a la base de datos que se indique en outputJdbcURL.

-outputJdbcBatchSize=<batch size>

Tamao en batch para la salida de las sentencias JDBC INSERT. Por defecto es 50. Si se configura como, El batches de JDBC no se utiliza.

-inputJdbcURL=<jdbcURL>

URL JDBC de la base de datos fuente

-inputJdbcUser=<user>

Nombre de usuario de la base de datos fuente

-inputJdbcPassword=<password>

Password de la base de datos fuente

-inputFile=<file name>

Opcional. Si no hay parmetros relativos a la Base de datos, se assume que los datos vienen de este fichero  de sentencias INSERT.

La fuente normal para la utilidad MondrianFoodMartLoader es un script SQL ([-inputFile=<file name>] ). Pero si se ha cargado ya datos en una fuente de datos JDBC (como pueda ser Microsoft Access), utilice -inputJdbcURL y las opciones relacionadas para copiar datos desde la otra fuente de datos JDBC.

El cargador utiliza el estndar J2SE JDBC, el driver JDBC, y algunas clases fuera del Mondrian que no suponene ficheros JARs adicionales. Ha sido provado contra Oracle, Postgres, MySQL y Microsoft Access.

Si su destino es una base de datos JDBC, deber crear la base de datos o esquema antes de realizar la carga de datos. Esto es especfico para cada base de datos.

Puede ignorar con seguridad las advertencias del log4j:

log4j:WARN No appenders could be found for logger (mondrian.rolap.RolapUtil). 
log4j:WARN Please initialize the log4j system properly.

Ejemplos

Aqu tiene algunos ejemplos que puede ilustrar la idea genera de cmo invocar a MondrianFoodMartLoader . La lnea de comandos cambiar dependiendo del sistema operativo, las fuentes y destinos de datos que utilice.

Ejemplo 1. Cargando MySQL desde un fichero en Linux

El siguiente ejemplo es una lnea de commandos Linux que crea un "schema" para MySQL llamado 'foodmart', y crea las tables FoodMart desde los datos incluidos en los scripts SQL. Primero, crea una base de datos foodmart y un usuario foodmart:

$ mysqladmin create foodmart
$
mysql
mysql> grant all privileges on *.* to 'foodmart'@'localhost' identified by 'foodmart';
Query OK, 0 rows affected (0.00 sec)

mysql>
quit
Bye

A continuacin carga los datos:

$ java -cp "/mondrian/lib/mondrian.jar:/mondrian/lib/log4j-1.2.9.jar:/mondrian/lib/eigenbase-xom.jar:/mondrian/lib/eigenbase-resgen.jar:/mondrian/lib/eigenbase-properties.jar:/usr/local/mysql/mysql-connector-java-3.0.16-ga-bin.jar "
     mondrian.test.loader.MondrianFoodMartLoader
     -verbose -tables -data -indexes
     -jdbcDrivers= com.mysql.jdbc.Driver
     -inputFile=/mondrian/demo/FoodMartCreateData.sql
     -outputJdbcURL="jdbc:mysql://localhost/foodmart?user=foodmart&password=foodmart"
Ejemplo 2. Cargando PostgreSQL desde Access en Windows

El siguiente ejemplo es una lnea de commandos Windows que crea las tables FoodMart para PostgreSQL desde los datos almacenados en una base de datos Access:

C:\mondrian> java -cp "C:\mondrian\lib\mondrian.jar;C:\mondrian\lib\log4j- 1.2.9.jar;C:\mondrian\lib\eigenbase-xom.jar;C:\mondrian\lib\eigenbase-resgen.jar;C:\mondrian\lib\eigenbase-properties.jar;C:\mondrian\lib\postgres-jdbc.jar"
     mondrian.test.loader.MondrianFoodMartLoader
     -verbose -tables -data -indexes
     -jdbcDrivers="org.postgresql.Driver,sun.jdbc.odbc.JdbcOdbcDriver "
     -inputJdbcURL="jdbc:odbc:MondrianFoodMart"
     -outputJdbcURL="jdbc:postgresql://localhost/foodmart"
     -outputJdbcUser=postgres
     -outputJdbcPassword=password

3. Despliegue y ejecucin de una aplicacin web con una base de datos no embebida 

  1. Instale Tomcat (version 5.0.25 or superior).
  2. Desde el paquete descargado con los binarios, descomprmalos y coloque lib/mondrian.war sobre TOMCAT_HOME/webapps/mondrian
  3. Abra el fichero mondrian.properties sitado en TOMCAT_HOME/webapps/mondrian y cambia las propiedades mondrian.jdbcDrivers para la base de datos que ha configurado anteriormente siguiendo las instrucciones de este documento.
  4. Abra el fichero web.xml en TOMCAT_HOME/webapps/mondrian/WEB-INF y personalice las dos cadenas de conexin existentes a la base de datos FoodMart que ha instalado, teniendo en  cuenta el tipo de base de datos que ha elegido. Es decir,
    Provider=mondrian;Jdbc=jdbc:odbc:MondrianFoodMart;Catalog=/WEB-INF/queries/FoodMart.xml;JdbcDrivers=sun.jdbc.odbc.JdbcOdbcDriver;

    Cambiara a 

    Provider=mondrian;Jdbc=jdbc:mysql://localhost/foodmart?user=foodmart&#38;password=foodmart;Catalog=/WEB-INF/queries/FoodMart.xml;JdbcDrivers= com.mysql.jdbc.Driver;
  5. Modigique los ficheros fourheir.jsp, mondrian.jsp, colors.jsp y arrows.jsp situados en el directorio TOMCAT_HOME/webapps/mondrian/WEB-INF/queries. Modifique la lnea:
    <jp:mondrianQuery id="query01" jdbcDriver="sun.jdbc.odbc.JdbcOdbcDriver" jdbcUrl="jdbc:odbc:MondrianFoodMart" catalogUri="/WEB-INF/queries/FoodMart.xml">

    por los mismos parmetros de base de datos para la base de datos FoodMart instalada segn las instrucciones. Para el caso de MySQL, deberamos tener algo del estilo a:

    <jp:mondrianQuery id="query01" jdbcDriver="com.mysql.jdbc.Driver" jdbcUrl="jdbc:mysql://localhost/foodmart?user=foodmart&password=foodmart" catalogUri="/WEB-INF/queries/FoodMart.xml">
  6. Copie los siguiente ficheros:
    • Si es necesario, copie su JAR con el driver JDBC al directorio TOMCAT_HOME/common/endorsed
    • Copie xalan.jar a TOMCAT_HOME/common/endorsed
  7. Inicialize su base de datos si es necesario.
  8. Introduzca http://localhost:8080/mondrian en su navegador.

4. Despliegue y ejecucin de una aplicacin web con una base datos embebida 

  1. Desde el paquete descargado con los binarios, descomprmalos y coloque lib/mondrian-embedded.war sobre TOMCAT_HOME/webapps/mondrian-embedded
  2. Inicialice Tomcat
  3. Introduzca http://localhost:8080/mondrian-embedded en su navegador.

5. Cmo configurar Mondrian como un servidor XML/A 

Para configurar un servicio XMLA, siga los siguientes pasos.

1. Describa las fuentes de datos en el fichero datasources.xml 

En el directorio WEB-INF de su webapp, cree un fichero datasources.xml, con un contenido como el siguiente:

<?xml version="1.0"?>
<DataSources>
  <DataSource>
    <DataSourceName>MondrianFoodMart</DataSourceName>
    <DataSourceDescription>FoodMart 2000 Data Warehouse From MS Analysis Services</DataSourceDescription>
    <URL>http://localhost:8080/mondrian/xmla</URL>
    <DataSourceInfo>Provider=mondrian; Jdbc=jdbc:odbc:MondrianFoodMart; JdbcDrivers=sun.jdbc.odbc.JdbcOdbcDriver</DataSourceInfo>
    <ProviderType>MDP</ProviderType>
    <AuthenticationMode>Unauthenticated</AuthenticationMode>
    <Catalogs>
        <Catalog name="FoodMart">
            <Definition>/WEB-INF/schema/FoodMart.xml</Definition>
        </Catalog>
        <Catalog name="Marketing">
            <DataSourceInfo>Provider=mondrian; Jdbc=jdbc:odbc:MarketingDB; JdbcDrivers=sun.jdbc.odbc.JdbcOdbcDriver</DataSourceInfo>
            <Definition>/WEB-INF/schema/Marketing.xml</Definition>
        </Catalog>
    </Catalogs>
  </DataSource>

  <DataSource>
    <DataSourceName>PostgreSQLTest</DataSourceName>
    <DataSourceDescription>Test Data Warehouse On PostgreSQL</DataSourceDescription>
    <URL>http://localhost:8080/mondrian/xmla</URL>
    <DataSourceInfo>Provider=mondrian; Jdbc=jdbc:postgresql://localhost/olap; JdbcDrivers=org.postgresql.Driver; JdbcUser=pgsql; JdbcPassword=pgsql</DataSourceInfo>
    <ProviderName>Mondrian</ProviderName>
    <ProviderType>MDP</ProviderType>
    <AuthenticationMode>Unauthenticated</AuthenticationMode>
    <Catalogs>
        <Catalog name="Test">
            <Definition>/WEB-INF/schema/TestPgsql.xml</Definition>
        <Catalog>
    </Catalogs>
  </DataSource>
</DataSources>

<ProviderType> y <AuthenticationMode> se ignoran ya que la implementacin actual de XML/A slo soporta 'MDP' y 'Unauthenticated'.

Mltiples fuentes de datos y catlogos

Si tiene intencin de utilizar Mondrian con la librera cliente de Microsoft, ADOMD.NET o Simba's O2X bridge , el fichero de fuentes de datos debe tener especficamente un elemento <DataSource> . Estos clientes ignorarn todos las fuentes de datos excepto una. Otros clients XML/A clients, como Rex o Jrubik trabajan con mltiples fuentes de datos.

Ntese que cada catlogo tiene un atributo name, y el URI (path) de un fichero XML schema. El nombre del catlogo debe coincidir con el atributo name del esquema del fichero (por ejemplo <Schema name="FoodMart">).

Ya sea, que utilice una fuente de datos o varias, los catlogos en el fichero datasources.xml deben contener nombres nicos.

2. Configuracin de XmlaServlet en el archivo web.xml 

Por ejemplo:

<servlet>
  <servlet-name>MondrianXmlaServlet</servlet-name>
  <servlet-class>mondrian.xmla.impl.DefaultXmlaServlet</servlet-class>
</servlet>

6. Miscelnea 

6.1. Configuracin de mondrian.properties 

Las propiedades se describen en la Configuration Guide.

6.2. Configuracin de la cach 

Deber especificar la cantidad de memoria disponible para la cache utilizando la opcin -Xms de la Java VM, por ejemplo -Xms256m para 256 Mb de ram para la JVM.

7. Bases de datos compatibles 

Se sabe que Mondrian corre sobre las siguiente bases de datos:

  1. Apache Derby
  2. Firebird
  3. hsqldb
  4. IBM DB2
  5. Microsoft Access
  6. Microsoft SQL Server
  7. MySQL
  8. NuoDB
  9. Oracle
  10. PostgreSQL
  11. Sybase

Mondrian puede trabajar con casi todo tipo de fuentes de datos JDB, incluso si su base de datos no aparece en la lista anterior, del una oportunidad. Mondrian puede de forma genrica conocer las capacidades de la base de datos del driver JDBC, y generar SQL correcto.

Si consigue hacer funcionar Mondrian con otra base de datos, mndenos un email. Hganos llegar el driver que utilice, la versin de su base de datos, configuracin de propiedades, y cualquier detalle que haya tenido que considerar.

General database tips

Para ejemplos de cadenzas de conexin, mire en mondrian.properties. Hay ejemplos de cadenas de conexin para muchas bases de datos.

Sybase

mizar_sf escribe :

Intent varias soluciones para conseguir que Mondrian (He utilizado 2.1RC) conectase con un servidor Sybase ASE [version 12.5]. Finalmente encontr las siguientes soluciones:

  • Descargar un driver jdbc3 compliant driver como jtds-1.2.jar desde sourceforge.
  • Colocar el driver en TOMCAT_HOME/common/endorsed
  • En ficheros de configuracin como
    • mondrian/WEB-INF/datasources.xml
    • mondrian/WEB-INF/web.xml

Modifiqu la lnea de parmetros como sigue:

Provider=mondrian;JdbcUser=userName;JdbcPassword=userPass;Jdbc=jdbc:jtds:sybase://xxx.xxx.xxx.xxx:port/dbName;JdbcDrivers= net.sourceforge.jtds.jdbc.Driver;Catalog=/WEB-INF/queries/myCatalog.xml

(datasources.xml no necesita ser modificado si solo necesitas probar la base de datos, pero si ests utilizando algo como OPENI hay que modificarlo.)

8. Aspectos de Compatibilidad 

8.1. Weblogic 6.1 y Xerces 

Weblogic 6.1 viene con una versin antigua e incompatible de Xerces. El sntoma del error:

java.lang.VerifyError: (class: org/eigenbase/xom/wrappers/XercesDOMParser,
 method: parse signature: (Lorg/xml/sax/InputSource;)Lorg/w3c/dom/Document;)
 Incompatible object argument for function call
at java.lang.Class.forName0 (Native Method)
at java.lang.Class.forName(Class.java:120)
at org.eigenbase.xom.XOMUtil.createDefaultParser(XOMUtil.java:165)
at org.eigenbase.resgen.Util.load(Util.java:49)
...

La solucin pasa por sustituir xml-apis.jar y xercesImpl.jar antes de weblogic.jar en su class-path.

Generalmente, Mondrian utiliza cualquier parser XML compatible JAXP que proporcione  el sistema. Desafortunadamente el analizador de Weblogic no se puede configurar en modo non-validating, y Mondrian lo necesita. Por tanto, en un entorno Weblogic, Mondrian utiliza explcitamenteXerces.  Esta nota describe cmo cambiar el analizador XML por defecto del Weblogic's.

8.2. JDK, Xalan y Tomcat 

Los binarios de Mondrian, tal y como se pueden descargar de la web, necesitan JDK 1.4.x, Xalan 2.6.0, y Tomcat 5.0.25 o superior.

Si est ejecutando JDK 1.3.x, necesitar ficheros JAR exta, porque JDK 1.3 no incluye un parser XML. Copie xalan.jar y xml-apis.jar a TOMCAT_HOME /common/lib. (o TOMCAT_HOME /common/endorsed, si su versin de Tomcat tiene este directorio). Si su configuracin es errnea, el error tpico es el siguiente:

java.lang.VerifyError: Cannot inherit from final class
  at java.lang.ClassLoader.defineClass0(Native Method)
  at java.lang.ClassLoader.defineClass(ClassLoader.java:502)
  at java.security.SecureClassLoader.defineClass(SecureClassLoader.java :123)
  at org.apache.catalina.loader.WebappClassLoader.findClassInternal(WebappClassLoader.java:1664)
  at org.apache.catalina.loader.WebappClassLoader.findClass(WebappClassLoader.java:953)
  at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1394)
  at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1274)
  at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:315)
  at org.apache.xerces.impl.XMLNSDocumentScannerImpl.createContentDispatcher(Unknown Source)
  at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl .<init>(XMLDocumentFragmentScannerImpl.java:249)
  at org.apache.xerces.impl.XMLDocumentScannerImpl.<init>(XMLDocumentScannerImpl.java:245)
  at org.apache.xerces.impl.XMLNSDocumentScannerImpl .<init>(Unknown Source)
  at org.apache.xerces.parsers.IntegratedParserConfiguration.createDocumentScanner(Unknown Source)
  at org.apache.xerces.parsers.DTDConfiguration.<init>( DTDConfiguration.java:367)
  at org.apache.xerces.parsers.StandardParserConfiguration.<init>(StandardParserConfiguration.java:198)
  at org.apache.xerces.parsers.IntegratedParserConfiguration .<init>(Unknown Source)
  at org.apache.xerces.parsers.IntegratedParserConfiguration.<init>(Unknown Source)
  at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)

Este error aparece con JDK 1.3.1, Tomcat 4.1.18, Xalan 2.4.1. Las posibles soluciones a este error pasan por (a) cambiarse a JDK 1.4 y eliminar xml-apis.jar y xercesImpl.jar del fichero mondrian.war, o (b) volver a Xalan 2.3.1.

8.3. Log4j y Tomcat 

Los WARs de Mondrian contienen en su distribucin una versin de log4j.jar. Esto puede entrar en conflicto con su servidor de aplicaciones, como en el caso de JBoss, y causar errores en el log. Para solucionar esto, elimine log4j.jar del WAR de Mondrian.


Author: Julian Hyde and others; traducido por Flix Alberto Martn, based on install.html#65, 23 August, 2006.
Version: $Id$ (log)
Copyright (C) 2001-2005 Julian Hyde
Copyright (C) 2005-2006 Pentaho and others


mondrian-3.11.0.1-R/doc/install_fr.html000066400000000000000000001020451261646570300175450ustar00rootroot00000000000000 Pentaho Analysis Services: How to Install Mondrian
Comment installer Mondrian

  1. Introduction
  2. Installer les données test avec une base de données non embarquée
    1. Microsoft Access
    2. Autre Base de données
  3. Déployer et exécuter une application web avec une base de données non embarquée
  4. Déployer et exécuter une application web avec la base de test embarquée
  5. Comment configurer Mondrian comme fournisseur de XML/A
    1. Décrire les sources de données dans datasources.xml
    2. Configurer XmlaServlet dans votre web.xml
  6. Divers
    1. Configurer mondrian.properties
    2. Installation du système de mémoire Cache
  7. Compatibilité des Bases de données
  8. Problèmes de compatibilité
    1. Weblogic 6.1 et Xerces
    2. Xalan et Tomcat
    3. Log4j et Tomcat

1. Introduction

Le noyau de Mondrian est un fichier JAR qui agit comme un pilote "JDBC pour OLAP": il fournit des connexions aux bases de données relationnelles sous-jacentes et exécute les instructions SQL. Ce paquet se conduit comme une interface avec ces bases de données. Le programme Mondrian peut être livré :

  1. comme une librairie WAR incluant JPivot, un environnement de travail web OLAP et des données exemple pouvant être chargées dans la base de données de votre choix.
  2. comme une librairie WAR, incluant JPivot et une base de données embarquée Derby, ce qui ne demandera aucune installation supplémentaire pour déployer cette librairie avec un serveur d'application web.

Les deux distributions contiennent les programmes sources Mondrian. Tous les fichiers JARs nécessaires à Mondrian sont contenus dans l'archive WAR du répertoire /WEB-INF/lib.

Voici comment installer la distribution:

  1. Installer le Java SDK (1.4.2 ou supérieur).
  2. Télécharger la dernière version mondrian-version.zip depuis SourceForge, et décompressez-la.
  3. Pour la distribution non embarquée, installer le jeu de données "FoodMart", comme décrit dans la section 2.
  4. Installer et démarrer l'application web, comme décrit dans la section 3 ou 4.

Si vous êtes un développeur Mondrian, il y a des instructions supplémentaires pour accéder au serveur des programmes sources (Perforce) et compiler le code dans le guide du développeur.

2. Installer les données test avec une base de données non embarquée

La base de données test 'FoodMart' fait partie de la distribution non-embarquée. Elle est livrée sous deux formats: une base Microsoft Access (demo/access/MondrianFoodMart.mdb) et un script SQL pour insérer les tables au sein de votre base de données (demo/FoodMartCreateData.sql).

Sous windows, utiliser la base de données Access est l'installation la plus facile, parce que vous avez juste besoin de définir une source de données ODBC. Si vous voulez tester une base de données autre qu'Access ou si vous n'êtes pas dans un environnement Windwos, vous aurez à créer votre propre base de données vierge et aurez à charger cette base de données avec l'utilitaire MondrianFoodMartLoader.

2.1. Microsoft Access

Si vous utilisez Windows, Microsoft Access est la base de données la plus facile à utiliser comme base de données test. Vous avez juste besoin d'installer une source de données ODBC pour la base test.

La base test a besoin d'être accédée si vous ne testez que l'accès à cette base, ou elle devra être chargée dans une autre base.

Dans le menu 'Outils d'administration', cliquez sur l'item 'Sources de données (ODBC)' pour ouvrir la boîte d'administration des sources de données ODBC. Ensuite, créez un DSN Système appelé MondrianFoodMart pointant sur MONDRIAN_HOME/demo/access/MondrianFoodMart.mdb. (Cela permettra à Mondrian d'accéder à la source de données en utilisant la chaîne de connexion "jdbc:odbc:MondrianFoodMart".

2.2. Autres bases de données

Si vous n'utilisez pas Access, utilisez l'utilitaire MondrianFoodMartLoader pour créer une base de données et charger les données avec le script SQL.

Syntaxe

MondrianFoodMartLoader
    [-verbose] [-tables] [-data] [-indexes]
    -jdbcDrivers=<jdbcDrivers>
    -outputJdbcURL=<jdbcURL>
    [ [ [-outputJdbcUser=user] [-outputJdbcPassword=password] [-outputJdbcBatchSize=<batch size>] ]
    | -outputDirectory=<directory name>
    ]
    [ [-inputJdbcURL=<jdbcURL> [-inputJdbcUser=user] [-inputJdbcPassword=password] ]
    | [-inputFile=<file name>]
    ]

Options

Option Description
-verbose mode verbeux.
-tables Crée les tables dans la sortie JDBC, ou génère une instruction CREATE TABLE dans le répertoire de sortie pour toutes les tables FoodMart, de façon appropriée pour le type de votre base de données. Si cela est non précisé, les tables sont considérées comme déjà existantes et elles seront tout d'abor supprimées.
-data Charge les données depuis l'entrée (JDBC, fichier d'instruction d'insertion) vers la sortie (JDBC, fichier d'instruction d'insertion). Toutes les données existantes seront tout d'abord supprimées.
-indexes Crée les index dans la sortie JDBC, ou génère une instruction CREATE INDEX dans le répertoire de sortie pour toutes les tables  FoodMart, de façon appropriée pour le type de votre base de données.
-jdbcDrivers=<driver list> liste de pilotes séparée par des virgules nécessaire pour se connecter à la base de données source et cible. Les fichiers JAR contenant ces pilotes doivent également se trouver dans le classpath (l'option -cp dans la commande java ).
-outputJdbcURL=<jdbcURL>

Url JDBC pour la base de données cible

-outputJdbcUser=<user> Utilisateur pour la base de données cible
-outputJdbcPassword=<password> Mot de passe pour la base de données cible
-outputDirectory=<directory name> Optionnel. Répertoire dans lequel se trouvera le script de création de la base de données. Les instructions SQL seront dans le format du type de base de données spécifié par l'option outputJdbcURL.
-outputJdbcBatchSize=<batch size> Taille du lot pour les instruction INSERT. Par défaut à 50. Si mis à la valeur 1, la fonction lot (batch) JDBC n'est pas utilisée.
-inputJdbcURL=<jdbcURL> Url JDBC pour la base de données source
-inputJdbcUser=<user> Utilisateur pour la base de données source
-inputJdbcPassword=<password> Mot de passe pour la base de données source
-inputFile=<file name> Optionnel. Si aucun paramètre n'est donné pour la base de données source, les données sont censées provenir du fichier passé en argument.

La source usuelle pour l'utilitaire MondrianFoodMartLoader est un script SQL ([-inputFile=<file name>]). Cependant, si vous avez déjà chargé les données au sein d'une source de données JDBC (par exemple Microsoft Access), utilisez l'option -inputJdbcURL et les autres options en relation avec celle-ci pour accéder à une autre base de donées JDBC.

Le chargeur utilise le standard J2SE JDBC, le pilote JDBC approprié pour les fichiers JARs, et quelques classes externes à Mondrian qui ne sont pas attachées à des fichiers additionnel JARs. Tout cela a été testé avec Oracle, Postgres, MySQL et Microsoft Access.

Si votre base de données cible est une base de données JDBC, vous devez créer en premier lieu la base de données et le schéma des tables. Cela doit être une base de données spécifique au jeu de test.

Vous pouvez en toute sécurité ignorer ces avertissements log4j:

log4j:WARN No appenders could be found for logger (mondrian.rolap.RolapUtil). 
log4j:WARN Please initialize the log4j system properly.

Exemples

Vous trouverez ci-dessous quelques exemples pour vous donner une idée générale de comment MondrianFoodMartLoader est invoqué. La ligne de commande que vous utiliserez dépendra bien sûr de votre environnement, de votre base de données source et cible.

Exemple 1. Chargement dans MySQL depuis un fichier sous Linux

L'exemple suivant est une ligne de commande linux pour créer une base MySQL appelée  'foodmart', puis créer les tables FoodMart depuis le jeu de données inclus dans le script SQL. En premier lieu, on crée une base de données foodmart et un utilisateur foodmart :

$ mysqladmin create foodmart
$
mysql
mysql> grant all privileges on *.* to 'foodmart'@'localhost' identified by 'foodmart';
Query OK, 0 rows affected (0.00 sec)

mysql>
quit
Bye

Puis on charge les données:

$java -cp "/mondrian/lib/mondrian.jar:/mondrian/lib/log4j-1.2.9.jar:/mondrian/lib/eigenbase-xom.jar:/mondrian/lib/eigenbase-resgen.jar:/mondrian/lib/eigenbase-properties.jar:/usr/local/mysql/mysql-connector-java-3.0.16-ga-bin.jar"
     mondrian.test.loader.MondrianFoodMartLoader
     -verbose -tables -data -indexes
     -jdbcDrivers=com.mysql.jdbc.Driver
     -inputFile=/mondrian/demo/FoodMartCreateData.sql
     -outputJdbcURL="jdbc:mysql://localhost/foodmart?user=foodmart&password=foodmart"
Exemple 2. Chargement dans  PostgreSQL depuis Access sous Windows

L'exemple suivant est une ligne de commande windows pour créer les tables FoodMart dans une base PostgreSQL depuis le jeu de test de la base Access:

C:\mondrian> java -cp "C:\mondrian\lib\mondrian.jar;C:\mondrian\lib\log4j-1.2.9.jar; C:\mondrian\lib\eigenbase-xom.jar; C:\mondrian\lib\eigenbase-resgen.jar; C:\mondrian\lib\eigenbase-properties.jar; C:\mondrian\lib\postgres-jdbc.jar"
     mondrian.test.loader.MondrianFoodMartLoader
     -verbose -tables -data -indexes
     -jdbcDrivers="org.postgresql.Driver,sun.jdbc.odbc.JdbcOdbcDriver"
     -inputJdbcURL="jdbc:odbc:MondrianFoodMart"
     -outputJdbcURL="jdbc:postgresql://localhost/foodmart"
     -outputJdbcUser=postgres
     -outputJdbcPassword=password

3. Déployer and exécuter une application web avec une base de données non embarquée 

  1. Installer Tomcat (version 5.0.25 ou supérieure).
  2. Depuis la distribution décompressée, décompresser lib/mondrian.war dans le répertoire TOMCAT_HOME/webapps/mondrian
  3. Ouvrir le fichier mondrian.properties dans le répertoire TOMCAT_HOME/webapps/mondrian et personnalisez-le  mondrian.jdbcDrivers en fonction de la base de données utilisée.
  4. Ouvrir le fichier web.xml dans le répertoire TOMCAT_HOME/webapps/mondrian/WEB-INF et personnalisez-le avec les deux chaînes de connexion que vous avez utilisées pour la base de données test. Cela:
    Provider=mondrian;Jdbc=jdbc:odbc:MondrianFoodMart;Catalog=/WEB-INF/queries/FoodMart.xml;JdbcDrivers=sun.jdbc.odbc.JdbcOdbcDriver;
    devient
    Provider=mondrian;Jdbc=jdbc:mysql://localhost/foodmart?user=foodmart&#38;password=foodmart;Catalog=/WEB-INF/queries/FoodMart.xml;JdbcDrivers=com.mysql.jdbc.Driver;
  5. Modifier le fichier fourheir.jsp, mondrian.jsp, colors.jsp ainsi que le fichier arrows.jsp dans le répertoire TOMCAT_HOME/webapps/mondrian/WEB-INF/queries. Modifier les lignes
    <jp:mondrianQuery id="query01" jdbcDriver="sun.jdbc.odbc.JdbcOdbcDriver" jdbcUrl="jdbc:odbc:MondrianFoodMart" catalogUri="/WEB-INF/queries/FoodMart.xml">

    avec les paramètres de votre base de données FoodMart database. Pour MySQL, cela donnera quelque chose du genre:

    <jp:mondrianQuery id="query01" jdbcDriver="com.mysql.jdbc.Driver" jdbcUrl="jdbc:mysql://localhost/foodmart?user=foodmart&password=foodmart" catalogUri="/WEB-INF/queries/FoodMart.xml">

  6. Copier les fichiers suivants:
    • Si besoin, copier votre pilote JDBC (fichier JARà dans le répertoire TOMCAT_HOME/common/endorsed
    • Copier le fichier xalan.jar dans le répertoire TOMCAT_HOME/common/endorsed
  7. Démarrer votre base de données, si besoin.
  8. Cliquer sur http://localhost:8080/mondrian.

4. Déployer et exécuter l'application web avec une base de données embarquée 

  1. Depuis la distribution décompressée, décompresser lib/mondrian-embedded.war dans le répertoire TOMCAT_HOME/webapps/mondrian-embedded
  2. Démarrer Tomcat
  3. Cliquer sur http://localhost:8080/mondrian-embedded

5. Comment configurer Mondrian comme un fournisseur XML/A 

Pour installer le service XMLA service, suivez les étapes suivantes.

1. Décrire les sources de données dans datasources.xml 

Dans le répertoire WEB-INF de votre webapp, créer un fichier datasources.xml, avec un contenu comme celui-ci:

<?xml version="1.0"?>
<DataSources>
  <DataSource>
    <DataSourceName>MondrianFoodMart</DataSourceName>
    <DataSourceDescription>FoodMart 2000 Data Warehouse From MS Analysis Services</DataSourceDescription>
    <URL>http://localhost:8080/mondrian/xmla</URL>
    <DataSourceInfo>Provider=mondrian; Jdbc=jdbc:odbc:MondrianFoodMart; JdbcDrivers=sun.jdbc.odbc.JdbcOdbcDriver</DataSourceInfo>
    <ProviderType>MDP</ProviderType>
    <AuthenticationMode>Unauthenticated</AuthenticationMode>
    <Catalogs>
        <Catalog name="FoodMart">
            <Definition>/WEB-INF/schema/FoodMart.xml</Definition>
        </Catalog>
        <Catalog name="Marketing">
            <DataSourceInfo>Provider=mondrian; Jdbc=jdbc:odbc:MarketingDB; JdbcDrivers=sun.jdbc.odbc.JdbcOdbcDriver</DataSourceInfo>
            <Definition>/WEB-INF/schema/Marketing.xml</Definition>
        </Catalog>
    </Catalogs>
  </DataSource>

  <DataSource>
    <DataSourceName>PostgreSQLTest</DataSourceName>
    <DataSourceDescription>Test Data Warehouse On PostgreSQL</DataSourceDescription>
    <URL>http://localhost:8080/mondrian/xmla</URL>
    <DataSourceInfo>Provider=mondrian; Jdbc=jdbc:postgresql://localhost/olap; JdbcDrivers=org.postgresql.Driver; JdbcUser=pgsql; JdbcPassword=pgsql</DataSourceInfo>
    <ProviderName>Mondrian</ProviderName>
    <ProviderType>MDP</ProviderType>
    <AuthenticationMode>Unauthenticated</AuthenticationMode>
    <Catalogs>
        <Catalog name="Test">
            <Definition>/WEB-INF/schema/TestPgsql.xml</Definition>
        <Catalog>
    </Catalogs>
  </DataSource>
</DataSources>

<ProviderType> et <AuthenticationMode> sont ignorés carl'implémentation XML/A ne supporte pas encore 'MDP' et 'Unauthenticated'.

Sources de données et catalogues multiples

Si vous avez l'intention d'utiliser Mondrian avec la librairie du client Microsoft ADOMD.NETou Simba's O2X bridge, les fichiers des sources de données doivent avoir un seul élément <DataSource>. Ces clients  ne prendront en compte qu'une seule base de données. Les autres clients, comme Rex, fonctionne parfaitement avec des bases de données multiples.

Veuillez noter que chaque catalogue posède un attribut nom, et l'URI (répertoire) d'un fichier XML. Le nom du catalogue doit correspondre à l'attribut utilisé dans le fichier XML (par exemple <Schema name="FoodMart">).

Que vous utilisiez une ou plusieurs sources de données, les catalogues dans le fichier datasources.xml doivent avoir un nom unique.

5.2. Configurer XmlaServlet dans votre web.xml 

Par exemple:

<servlet>
  <servlet-name>MondrianXmlaServlet</servlet-name>
  <servlet-class>mondrian.xmla.impl.DefaultXmlaServlet</servlet-class>
</servlet>

6. Divers 

6.1. Configurer mondrian.properties 

Les propriétés sont décrites dans le  Guide de Configuration.

6.2. Installation de la mémpoire Cache 

Vous aurez besoin de préciser la quantité de mémoire autorisée pour le cache en utilisant l'option -Xms de la machine virtuelle Java, par exemple -Xms256m pour 256 megs de mémoire of ram pour la machine virtuelle Java.

7. Compatibilité des bases de données 

Mondrian fonctionne avec les bases de données suivantes:

  1. Apache Derby (connu sous le nom de Cloudscape)
  2. Firebird
  3. hsqldb
  4. IBM DB2
  5. Informix
  6. Ingres
  7. Interbase
  8. LucidDB
  9. Microsoft Access
  10. Microsoft SQL Server
  11. MySQL
  12. NuoDB
  13. Oracle
  14. PostgreSQL
  15. Sybase
  16. Teradata

Mondrian peut fonctionner avec la plupart des sources de données JDBC, même si votre base de données n'apparaît pas dans la liste ci-dessus, vous devriez essayer. Mondrian peut généralement le SQL en conséquence.

Si vous vous apercevez que Mondrian fonctionne avec une autre base de données, faites le nous savoir. Dites nous quel pilote vous utilisez, la version de votre base de données, les paramètres utilisés et tout ce dont vous avez eu besoin.

Trucs généraux sur les bases de données

Pour des exemples de chaînes de connexion, regardez dans le fichier mondrian.properties. Il s'y trouve des exemple de chaînes de connexion pour la plupart des bases de données citées.

Ingres

Andy Grimm écrit:

En plus, j'ai du exécuter la commande perl suivante

> perl -pi -e "s/:00\.0/:00/g" FoodMartCreateData.sql

Cela a permis que le format des dates soit une date valide en enlevant le ".0" pour chacun des timestamp. Notre prochaine version supportera timestamps. Ceci est donc un truc pour une durée brève.

 

Sybase

mizar_sf écrit:

J'ai essayé plusieurs voies pour utiliser Mondrian (version 2.1RC) connecté avec un serveur de base de données base Sybase ASE [version 12.5]. Finalement, j'ai trouvé cette solution:

  • Télécharger un pilote compatible jdbc3 comme jtds-1.2.jar sur sourceforge.
  • Placer le pilote dans le répertoire TOMCAT_HOME/common/endorsed
  • Dans les fichiers de configuration comme
    • mondrian/WEB-INF/datasources.xml
    • mondrian/WEB-INF/web.xml
    J'ai modifié les paramètres de cette façon:
    Provider=mondrian; JdbcUser=userName; JdbcPassword=userPass; Jdbc=jdbc:jtds:sybase://xxx.xxx.xxx.xxx:port/dbName; JdbcDrivers=net.sourceforge.jtds.jdbc.Driver; Catalog=/WEB-INF/queries/myCatalog.xml
    (Le fichier datasources.xml semble ne pas avoir besoin d'être modifié si vous testez juste la base de données,mais vous en aurez besoin pour OPENI par exemple)

8. Problèmes de compatibilité 

8.1. Weblogic 6.1 et Xerces 

Weblogic 6.1 est fourni avec une version ancienne et incompatible de Xerces. Le symptome est l'erreur suivante

java.lang.VerifyError: (class: org/eigenbase/xom/wrappers/XercesDOMParser, method: parse signature: (Lorg/xml/sax/InputSource;)Lorg/w3c/dom/Document;) Incompatible object argument for function call
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:120)
at org.eigenbase.xom.XOMUtil.createDefaultParser(XOMUtil.java:165)
at org.eigenbase.resgen.Util.load(Util.java:49)
...

La solution est de placer xml-apis.jar et xercesImpl.jar avant weblogic.jar dans votre class-path.

Generalement, Mondrian utilise un parseur XML compatible JAXP fourni par le système. Malheureusement, le parseur de Weblogic ne fonctionne pas en mode non-validé, mode que requiert Mondrian. Par conséquent, dans un environnement Weblogic, Mondrian utilise explicitement Xerces.  Cette notice décrit comme changer le parseur par défaut de Weblogic.

8.2. JDK, Xalan et Tomcat 

Les distributions Mondrian, requiert JDK 1.4.x, Xalan 2.6.0, et Tomcat 5.0.25 ou supérieur. Les choses fonctionnent mieux ainsi..

Si vous exécutez JDK 1.3.x, vous aurez besoin de fichiers JAR supplémentaires, parce que JDK 1.3 n'inclut pas le parseur XML. Copiez xalan.jar et xml-apis.jar dans le répertoire TOMCAT_HOME/common/lib. (ou TOMCAT_HOME/common/endorsed, si votre version de Tomcat dispose de ce répertoire). Si vous disposez d'une mauvaise configuration, alors, l'erreur typique sera celle-ci:

java.lang.VerifyError: Cannot inherit from final class
  at java.lang.ClassLoader.defineClass0(Native Method)
  at java.lang.ClassLoader.defineClass(ClassLoader.java:502)
  at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:123)
  at org.apache.catalina.loader.WebappClassLoader.findClassInternal(WebappClassLoader.java:1664)
  at org.apache.catalina.loader.WebappClassLoader.findClass(WebappClassLoader.java:953)
  at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1394)
  at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1274)
  at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:315)
  at org.apache.xerces.impl.XMLNSDocumentScannerImpl.createContentDispatcher(Unknown Source)
  at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.<init>(XMLDocumentFragmentScannerImpl.java:249)
  at org.apache.xerces.impl.XMLDocumentScannerImpl.<init>(XMLDocumentScannerImpl.java:245)
  at org.apache.xerces.impl.XMLNSDocumentScannerImpl.<init>(Unknown Source)
  at org.apache.xerces.parsers.IntegratedParserConfiguration.createDocumentScanner(Unknown Source)
  at org.apache.xerces.parsers.DTDConfiguration.<init>(DTDConfiguration.java:367)
  at org.apache.xerces.parsers.StandardParserConfiguration.<init>(StandardParserConfiguration.java:198)
  at org.apache.xerces.parsers.IntegratedParserConfiguration.<init>(Unknown Source)
  at org.apache.xerces.parsers.IntegratedParserConfiguration.<init>(Unknown Source)
  at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)

Vous aurez cette erreur avec JDK 1.3.1, Tomcat 4.1.18, Xalan 2.4.1. Les solutions pour cette erreur sont (a) de mettre à jour le JDK en version1.4 et supprimer xml-apis.jar et xercesImpl.jar de la librairie mondrian.war, ou (b) revenir à Xalan 2.3.1.

8.3. Log4j et Tomcat 

Les librairies WARs Mondrian sont fournies avec une version packagée de log4j.jar. Cela peut engendrer un conflit avec votre serveur d'application, tel JBoss, et causer des erreurs dans le journal au sujet des appels log4j. Pour fixer ce problème, enlever le fichier log4j.jar de la librairie WAR Mondrian.

 


Author: Julian Hyde and others; last updated October, 2006; translation into French by Manfred Sherlock Olm based on install.html#70; last updated April, 2007
Version: $Id$ (log)
Copyright (C) 2001-2005 Julian Hyde
Copyright (C) 2005-2007 Pentaho


mondrian-3.11.0.1-R/doc/install_postgresql.html000066400000000000000000000652761261646570300213570ustar00rootroot00000000000000 Pentaho Analysis Services: Installing Mondrian 1.1.5 on Windows with PostgreSQL
Installing Mondrian 1.1.5 on Windows with PostgreSQL (8.x)

Contents 

  1. About these installation notes
  2. Download and extract the distribution files
  3. Set up your environment
  4. Load the test database
  5. Install Mondrian (build the "mondrian.war" file)
  6. Deploy the application
  7. Disclaimer

1. About these installation notes  

The binary distribution of Mondrian 1.1.5 works well with little or no tweaking, with the Access database (.mdb file) provided with the distribution. Getting it to work with PostgreSQL however, requires some tweaking, and the most reliable way to get it up and running is to rebuild the "mondrian.war" from the source (available as part of the binary distribution).

These installation notes will help you install Mondrian in the following environment:

  • OS: Windows XP/2000 (for database and servlet container)
  • JDK: JDK 1.5.0_01
  • Database: PostgreSQL 8.0
  • Servlet container: Tomcat 5.0.28
You should still be able to use these installation instructions with variations in the above environment (e.g., a different version of Tomcat or a different version of PostgreSQL, etc.). However, it is more than likely that in case of version differences, some steps may either be redundant (e.g., if you are installing on a higher version of Tomcat) or some steps may be missing (e.g., if you are installing on a lower version of Tomcat).

These notes have been produced based on Patrick Tallman's instructions for installing on Windows. Those instructions appear to be based on Mondrian 1.0.1 and therefore appeared out of sync with Mondrian 1.1.5. These notes retain significant portions of Patrick Tallman's instructions, but excludes portions that are now redundant and addresses some issues not specifically addressed earlier. The instructions have also been reorganized.

Please note the use of the following symbols in this document:

[!]: indicates an instruction/observation that requires special attention (either because you must be careful with the version or because it can result in a common human error).

[#]: indicates an explanation/special notice usually intended to explain a particular approach or remind you of a previous situation.

2. Download and extract the distribution files 

Along with the Mondrian distribution, you must also download the JPivot distribution because the build script uses a .war file from the JPivot distribution. The distribution is available at the following URLs:

Once you have downloaded the distribution files, extract them as follows:

  1. Extract the contents of mondrian-1.1.5.zip. This will create a folder called "mondrian-1.1.5". It is recommended that you rename this to "mondrian-1.1.5-bin". This is only for housekeeping purposes and has no bearing whatsoever on the installation process. This folder (either "mondrian-1.1.5" or "mondrian-1.1.5-bin/", depending on whether you chose to rename the directory or not) will hereinafter be referred to as %BIN_LOCATION%.
     
  2. Create a folder called "mondrian-1.1.5-src" at the same level as "%BIN_LOCATION%".
     
  3. Extract the contents of mondrian-1.1.5-src.zip (located in "%BIN_LOCATION%/dist/") into the folder "mondrian-1.1.5-src". All contents will automatically get created in the folder "mondrian-1.1.5-src/mondrian-1.1.5/". If you wish, for disambiguity and ease of housekeeping, you may move all contents from "mondrian-1.1.5-src/mondrian-1.1.5/" directly into "mondrian-1.1.5-src/". This folder (either "mondrian-1.1.5-src/mondrian-1.1.5" or "mondrian-1.1.5-src/", depending on whether you chose to move the contents or not) will hereinafter be referred to as %DEV_LOCATION%.
     
  4. Extract the contents of jpivot-1.4.0.zip. This will contain a file called "jpivot.war". Copy this file into "%DEV_LOCATION%/lib".

3. Set up your environment 

This section walks you through the steps to set up your environment to build the Mondrian web archive. As part of setting up the environment, you need to ensure that you have the resources described in this section. If you do not have the latest/recommended versions, you may need to download them from the URLs specified. Once you have downloaded these resources, you must set up certain environment variables.

Resources

You will need (to download) the following in order to set up your environment:

Typically, the above will suffice if you need to merely deploy a binary distribution that you have downloaded. In order to build the "mondrian.war" from source, you will require the following additional resources.

[!] While variations of the database (and therefore of the JDBC driver) or of the servlet container are possible, the following cannot be changed in the deployment environment since there is a strong dependency on these packages/components.

It is likely that one or more of these components or an older version of it, is already installed on your system. Please contact your System Administrator if you need help finding out if you have an older version, or with installation of any of these softwares that you have to download. Installation instructions for each of the above are available on the respective websites from which you will download these resources.

Environment variables

Once you have installed/ascertained that you have all the above components, you must set up some environment variables (these are used by the build script):

  • ANT_HOME
  • CATALINA_HOME
  • JAVA_HOME
  • JUNIT_HOME
  • XALAN_HOME

You may skip this step (setting up environment variables) if you wish, but you must then take care of it in the build script. It is strongly recommended that you address this at this point by setting up environment variables, unless you have a strong reason not to do so.

4. Load the test database 

The Mondrian distribution is accompanied by a test database (the classic "Foodmart" database). This database must be loaded for you run the examples available with the distribution. You will have to make use of the following resources from the distribution to load the database.

  • mondrian.test.loader.MondrianFoodMartLoader: A data loading utility that takes an input JDBC URL or file reference (from which the schema and test data are to be taken), an output JDBC URL and connection parameters (for the target database in which the schema must be created and data loaded), and one or more flags to indicate the schema objects that must be created (tables, data, etc.). This utility is packaged in "%BIN_LOCATION%/lib/mondrian.jar".
  • %BIN_LOCATION%/demo/access/MondrianFoodmart.mdb: MS Access database containing the complete foodmart database. This will be accessed through the DSN created by you in Sec. 3.
  • %BIN_LOCATION%/demo/access/FoodMartCreateData.sql: Text file containing "INSERT INTO" SQL statements to load test data.

Execute the following steps to load the test database:

  1. Create a database and database user: Create a database user called "foodmart" (password: "foodmart"). Then create a database called "foodmartdb" owned by the user "foodmart".
     
  2. Copy the JDBC driver: Copy the Postgres JDBC driver into "%BIN_LOCATION%/lib".
     
  3. Load the database: Open a command prompt window and change your current directory to "%BIN_LOCATION%". At the command prompt, run the command
    java -cp "%BIN_LOCATION%\lib\mondrian.jar;%BIN_LOCATION%\lib\log4j-1.2.9.jar;%BIN_LOCATION%\lib\eigenbase-xom.jar;%BIN_LOCATION%\lib\eigenbase-resgen.jar;%BIN_LOCATION%\lib\postgresql-8.0-312.jdbc3.jar" mondrian.test.loader.MondrianFoodMartLoader -verbose -tables -data -indexes -jdbcDrivers="org.postgresql.Driver,sun.jdbc.odbc.JdbcOdbcDriver" -inputFile=%BIN_LOCATION%\demo\FoodMartCreateData.sql" -outputJdbcURL="jdbc:postgresql://localhost/foodmartdb" -outputJdbcUser=foodmart -outputJdbcPassword=foodmart

    [!] Please note the following:
    • This command must be executed as a single command. When you copy+paste the above command into an editor, whitespaces/carriage returns will be introduced that will cause syntax errors. Be sure to replace these spaces if you copy+paste this command.
    • All items in the above command marked in RED will have to be replaced by the actual value (path, filename, database name, user name, etc.) applicable for your system.

5. Install Mondrian (build the "mondrian.war" file) 

There are three sets of activities in creating the web archive: modifying some files, copying some files and running the ant script. Each of these is detailed out in this section.

Modify files

The source code that we extracted from mondrian-1.1.5-src.zip contains among others, three files that require to be changed before mondrian.war can be built. These are "mondrian.properties", "build.bat" and "build.xml". Changes to each of these files is detailed below.

  1. Changes to mondrian.properties: The changes in this file are predominantly changes to connection strings; the path to the Tomcat home directory is also to be specified here.

    In particular, the following changes are to be made:
    • Replace Jdbc=jdbc:odbc:MondrianFoodMart;\
      with Jdbc=jdbc:postgresql://localhost/foodmartdb?user=foodmart&#38;password=foodmart;\
      [!] Please note the use of "&#38;". It is important NOT to directly use an ampersand here.
       
    • Replace JdbcDrivers=sun.jdbc.odbc.JdbcOdbcDriver;\
      with JdbcDrivers=org.postgresql.Driver;\
       
    • Replace mondrian.foodmart.jdbcURL=jdbc:odbc:MondrianFoodMart
      with mondrian.foodmart.jdbcURL=jdbc:postgresql://localhost/foodmartdb?user=foodmart&#38;password=foodmart
      [!] Please note the use of "&#38;". It is important NOT to directly use an ampersand here.
       
    • Uncomment the line "tomcat.home" and set the correct path.
       
    • Modify the line "@set CLASSPATH" - replace all "/" (forward-slash) with a "\" (backslash).
       
  2. Changes to build.bat: In this file, replace %ANT_HOME%\bin\ant %1 %2 %3 %4 %5 %6 %7 %8 %9
    with "%ANT_HOME%\bin\ant" %1 %2 %3 %4 %5 %6 %7 %8 %9 (add quotation marks around the path).
    This is to address problems that can potentially be caused by spaces in the names of folders (supported in the recent versions of Windows).
     
  3. Changes to build.xml: In this file, references to the JDBC driver and to the XALAN path need to be changed. Specifically, the changes to be made are:
    • Replace <property name="mondrian.jdbcDrivers" value="sun.jdbc.odbc.JdbcOdbcDriver"/>
      with <property name="mondrian.jdbcDrivers" value="org.postgresql.Driver"/>
       
    • Replace <property name="mondrian.foodmart.jdbcURL" value="${mondrian.foodmart.jdbcURL.access}"/>
      with <property name="mondrian.jdbcDrivers" value="jdbc:postgresql://localhost/foodmartdb?user=foodmart&#38;password=foodmart"/>
      [!] Please note the use of "&#38;". It is important NOT to directly use an ampersand here.
       
    • Modify the target "jar". This task has a zipfileset tag defined as follows:
      <zipfileset
         dir="."
         includes="
           LICENSE.html,
           README.txt,
           VERSION.txt"/>
      This must be modified to include mondrian.properties as follows:
      <zipfileset
         dir="."
         includes="
           mondrian.properties,
           LICENSE.html,
           README.txt,
           VERSION.txt"/>
    • Modify the target "copy-jars". The path to the Xalan JAR files (xalan.jar,xml-apis.jar,xercesImpl.jar) is specified as "{xalan.home}/bin". This must be modified to "{xalan.home}" (remove the "/bin").

Copy files

  1. Copy the file %DEV_LOCATION%\mondrian.properties to %CATALINA_HOME%\bin
     
  2. Copy the files "xalan.jar", "xercesImpl.jar", "xml-apis.jar" and "serializer.jar" from "%XALAN_HOME%" to %CATALINA_HOME%\common\endorsed.

    [#] These files are not really required for the build per s, but can create problems at run-time. It is just as well that these are copied at this time. Further, the files "xercesImpl.jar" and "xml-apis.jar" must be overwritten even though they exist since the files distributed with Tomcat appear to be an older version than the ones distributed with the latest version of Xalan.

Run the build script

To create and deploy the mondrian.war file, execute the build in serial order with flags as indicated below:

  1. build clean
  2. build
  3. build jar
  4. build war
  5. build deploy-war

6. Deploy the application 

There is a final set of changes to be made in 4 JSP files before the application can be used successfully.

First, start Tomcat and allow it to extract "mondrian.war" and create the folder "mondrian". Once it has extracted the archive, shut down Tomcat. Use a HTML/JSP editor and modify the following files under "mondrian/WEB-INF/queries/" as described:

  1. colors.jsp
  2. fourhier.jsp
  3. mondrian.jsp
  4. trendarrows.jsp

In each of the above files, replace

<jp:mondrianQuery id="query01" jdbcDriver="sun.jdbc.odbc.JdbcOdbcDriver" jdbcUrl="jdbc:odbc:MondrianFoodMart" catalogUri="/WEB-INF/queries/FoodMart.xml">

with

<jp:mondrianQuery id="query01" jdbcDriver="org.postgresql.Driver" jdbcUrl="jdbc:postgresql://localhost/foodmartdb?user=foodmart&#38;password=foodmart" catalogUri="/WEB-INF/queries/FoodMart.xml">

[!] Please note the use of "&#38;". It is important NOT to directly use an ampersand here.

Next, check the "WEB-INF/web.xml". Check the value of the "connectString" parameter under
"<servlet-name>MDXQueryServlet</servlet-name>".

This must have the value "jdbc:postgresql://localhost/foodmartdb?user=foodmart&#38;password=foodmart" catalogUri="/WEB-INF/queries/FoodMart.xml". If it does not have the value, please update this.

After making these modifications, remove the "%CATALINA_HOME%/work/Catalina/localhost/mondrian" folder and restart Tomcat.

7. Disclaimer 

(To be appropriately modified at a later date).

These instructions are being circulated on a "AS-IS" basis. They are based on the Mondrian 1.1.5 distribution available at the time of producing this document. They have not been extensively reviewed, and the specific settings prescribed here, including instructions to overwrite existing files, may or may not have an impact on existing applications. Even at the time of publishing these document, it is known that not all features of the application work as expected. The contents of this document may also be rendered null and void by a subsequent release of Mondrian (which implicitly addresses some of the issues sought to be addressed here). As such these instructions accept no responsibility or liability towards the accuracy of, or errors of commission or omission in the contents on this page.

For feedback, suggestions, complaints on this document, please write to:
suhasmallya[AT]users[DOT]sourceforge[DOT]net

Author: Suhas Mallya; last modified: 19 October, 2005.
Version: $Id$ (log)
Copyright (C) 2005-2006 Pentaho and others

mondrian-3.11.0.1-R/doc/logo.psp000066400000000000000000020251421261646570300162120ustar00rootroot00000000000000Paint Shop Pro Image File ~BK&&@_@Q%~BK88~FLw;=~FLd=~FL~FL~BK \ P(~BK [O%xmLSW`>dJgd?f1Hl3.]t{o[h"m-d ]2mL-ЖVm ܽι'y3?rmbRWRRH8E40mYC粉 8J$fƹW]I*e&]Ntd GM֗s ŭ~:EV) .^ Fݺ_@@7 O{~LxoAhCB<017.f `Z*E᰺opUe=He5Dи=|~t97 se*e"5A-S4@Ç-mدne;AQ,FC@ *9G0PJQQA2AM9Ur߯Z;'q HT 5'*rkJ @WWt Rb ! {IH( C-PK8WzhUBdk@M\"_p3A_Ζ쓱o]w, a8R廤b- 8v7+ L=n66*%FQ9#[;XcܶK=?]UxC]H?~Yͤ3'16oܰSbDr?зߡ f3|Snzc6 g8}Ľ֩j?J[O}bRPZԞt Fyl} z "._>cE\,: EnroKCv.µ}t yiwzGV%!gu\b˧|*%RwVUs =.F:I;DRH݇@8H&p%H.c>~BK eY%x LwMVaJ!bimi"ρa3H0,pP(.Mс8aB{Z耩cb[v,fBo_rwzrm$  g9@+Z9 ʅIjNeZMvU^ZVl#&}Lmi%Y^~f,Yь_ē?EuIoR6KZFɕGLʯ[/|Xg4o/ δڏrabg쩾) AĚb9rBHdxv%iw8!@W7yO\B#[PRY$'zBb!y)>3 <#‹i+!=S`0ϫgF)Bz VġؗA@XJFfp_4WWs{?lBElϤPݒ}2ʃf2Z=H%ٮ:Ew_ m4ք/vߛ BIpGD!@\1鈇(ϸUU_BOH?>.䖆/' itA\hƆ]t~;F5A4:'n/~4z@c>EM#]1msbIJbk7`фbv!/T)#"w_Tv,靦JqG\xǷl gÅeg>)<}=ͅtz7/I* ?Zwu_m,>qA|ywhr -FמA Eg4dPc#~[7OOx>69126eyl6hJ!2B^$TPT944tdycj-;D!#NB3 ' ǢKk-R(Nj Ө*Րqa vNVѢJS|rs wgq0 {m d#өLlEL(il`ATR%: 7Rs4Z9*l[@gԘi_񱏁΄qCDqs q$MOO9 ~BK ZN%x{LSW_oC6S̍* d(*W ^^@˛XZZy"3Z ZeS!B1٦Zn{[pq lhY)f/{sLN>z@.g~T.Dp#HBhbHܦ5R@; #[w_+O=UTM<ֿsOcf<@{Zl7;XJ3!g( [s5fؗOӧ,ڧj;tZ]ߞQAΫ˟v- OQdJ`1ȥ$̓gWQ$8~h]ED3PK+@B|,;9QI]&sXËV/vhՉQ8xJ6 d׀hV2p$>&'–4'.YxȰtB2XLX%)"$/eWl/HJDTNwńo ^ܥYi'(fP{`mqy!UK+7Y8qù<>\ c657V⧰Ss)+$. I;7л '-aJϏL{l+'J5/~K$mkgAڮJMLGTr\P wVID:OU]q_h fp{u*U;osC6GFww.=q.m\%[K]oۻ~x4yj'mޒmmo5L]rb<ˤ"C 1i|Q{򳃬/eKh06E6(*yŵTJј :d'>v_6?o]I3i Z,y,),$A€:|"YA#A1Ess&'|ZhjYۅfAYjZY['vt^is uẕH$s&~BKL~BKwn'bg~BK oc[x  o74F(~BK oc[x  o74F(~BK oc[x  o74F(~BK rfx1 0nYDA TΨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ ̨ lQ4 F6FR~BKw!matting(.~BK I=[xàSU~BK I=[xàSU~BK I=[xàSU~BK }qxݻU H W@ $A\}gcLa 7na Z#ګ^|ޑޏG ~?y=|}F?<&{?~a}iQ0W-&zѢaW-&yӢa -&آa+-ڢaOרq.Ӣa-ТaM-آ-Ѣ]-٢-8ТC-;آ-:ѢS-9٢-hТ&-NkԢf-Niآᄦ-kܢ-Тရ߶9Qa.GtlQCunQQ hQw jQpǰ7 lQpC}T5NCE5U[T#\4E5SZT#1FpŤsQ_ڢ-MoQIFҢ)/Lj@-BF z)*عD>\j5RNH9a[T#nQE5RHH[T#E$hQE5R@}k⒜OB^FE5D3gjdQZT#JآYRȂFE5-nQ,$yjd[T#XE5dר8'-}j$e'j$ZT#-֢IkHR FRZE5Т-tmQ$pj$EQQ#i,}.>Q#I,zIa353gj$"-ʴF+Ԣ Tj$b-ʵF*آ [[j$5L}kH(EgH [T#oQQFMٻ|xt62s*iL_52_P#Ӕ_|ML7Z@LŋpZB *{ e{ \ɤ0ZC ŻZ@ MHw7R#iq35ҕwP#iq5ҍwR#GMtQ6ǩ̨̨ƴxiJ'xiF'FܣFbj-6FNb#j$-6FNbCj-6Fbcj oͩC؁pot8\ĤNnQ#h#5R#i35S#hq5P#wiq5rQ#7ٻȞ*7Gʞ*W93rS#iq5rP#ohq5Q#/hq"5-NFdjS#h15NAQ<-̨4-´b8j,J$-ƂbXj,F-Bbxj,B HWq xx6)*̨iTDԸ4-ƅi15.KqQZLHKbJj\RrԸ-fOu!ZLΞ2IuZ\%qZ\[ 8iq!&Դ5&Ũ1--.GIiqAjLIKRcBZ\ԘT45&6o,Ϟjf)h7&"PcpZ,Di5bQcPZ,H!i$5d(8G-˞j0fLh4j Z,ScZD1hj A|35NEPTZ+jHi+jD)T'"q8-r"WPZ8i8Ch8@hM؝HiؕAi]lu6N|ۆ><3*-r"1-r"'!-r"'-r" -҄͸҈OJ3TO1Ґ-Ҕ"S=H4l!Zɞk@y'o?6`>w@y_޻}j׿h|P#ܢa/-~gs5os5FXl"3gj$2-T Pj$w7?P#a Ԍ `j$-F)ۢ)ܢ tj$-0ʷF⻧;U6fbx`rר̨_52_P#h52Z@LŋpZB ūPZWq>M^8>jd3]jd-nF&j;w7lF2F;NBSoS9oTǐzxiH*͸9H#nNS#MQpJZlBFIZlFņ ZlJAZlNZž*Gf;GFbFߍŮfZLl&Z@l!]ZDܡaMZHܠš|f3+F.2NF.nqxCWLF^pw3u*5'S#ϴ8DZ BxӈByCřQZCq6`ڸ,w7TrwI$3jHj,HA-bKbhj,D -"Kb vq bTg5 g&ƥQSQ´tԸ(w7 qInRR̨Iq9ZLKbbj\SSB=exHϞ"i,3Ը-.Biqnqsw8YI513bԘƤ 5%1!-.JhqYjLF Sc*Z\ԘgO5 SM>j &̨E1<-XCb)j LŨ1,-ƠXCbIj HE1-`P죖@̨ũ1 byj B1w7ScE>QtnxɴjJ|Ei8yEx 5NM 88BQWqzWqr.rIu/r"wq-";-;"+-;"-;wnTT;p.rI9-rswajlJƆ8E{؈؄i@ h&xiD'5bxsxiLix{T:PQBQD;QFhԸJiԸNGe5nM!xDwhaxWqnpwPssLWx_d85^E&PZd 5LW0_"+Zd*5~E&S3-2?"Sh :j0רE)] pQ lnhfT*Ys ֨E*W XZ$R5G%B5: LZ$"5jJ譟 h$ьJhF%kt.5jdQhZ$%k")-XIjHZըE[F-B5G%ejt."5GeK\d ԨEF8F" I]YJb֨EF-5j%%ћJWse%>* KUYZͨ,.MnX^F-RBHk"eQF-RJiPLF-RPRRFw7F"QF-R\HyAjtw1jt.»5j>^_LQ5j^V7 xeRExcJZ &ԨEhxZ+ZsnXa5jT!5j6Pa5zӀ:\ͺ֨EءcZ]ըEcn]F"СF-!k"ԸF-aMktw'4ѹ4QpR5Q@MQi@3jt.BC'j"4uF-Bck"4wFw7QͮQmћtF" F-wk" rF-07ktwݨѹC]Q0ؕ]Q0SQ0ɫӼQ0W5jRa=`"l"?-BZ\ 9~BKwv_lozenge9<~BK  [x]]}?bϾm;6*@D3qH6H)$5RUUT/"\1^06^gy=fl.1UH0~˽/waxBTna`pulǮ^|ux?n?@dKEKE""p44*2=׶*岱/ C eUJF^4JPR$.Areie6j(")w]v /  HyB&I5 54h 㸊2g<0p]KFq-4w:H0:zؘTc-M "d[ !A{K b 1@PHHR0Hb1fy$. ڗ)=nxi9(#*Y2Fp$;rXQkkZJ`]:@Ry2A5—DMK(-cYF^%"R*DXb(Ri;lYmtl{  ?ɘg`I"iแ,KRn!/1CƐ3H<#>)O|?pmK5/ pÓQ*U<$MK< Ыd.!*lqe]FHɌ$w %`bAcD$'UJyL~<Ь!1Fqȴ 5-%[b2'J> AZ!QZLN%c8Er}%:@KJ2GP\2%ۘ1%QZznuLMDu8WbB< mUe:Kjԓ,b=aK*W<p IZ"n$p:(c=/ n J;iM霰`̈"(-AwK. bJbֳMAiX*mWX ԕQ ADh_Iܨ&gJfM@4uP(J 3 92ht]8듫ZS}fՅbaqXR  g=?@B,ۆJzϷq E^Y).-,.^|9t҅RถKA9ɖ䗃@nre*.%R`qr`K'}??ycG}#GO;uzg޻tūg-]x'Ϝ8ޙ_>wnaBi~0_Xpibil W.V nc7?xwz᝻}t׮߷o'|מݻf<{ɧ=?;?O_x_z~o7^{߼CnG3mёsLw* M lټm̖ӓ[6O߹mzy{}`?mt3ٝiommkN[:R]\:Օst:\.Lp_#Mut7wtuwҩT6zt:ˤzMF<mݹT;3ݓuYtgg ζwuvk:RTWW:Jg]Y`(wW;;z{A?mZ[Z[6ךZZqK斖&8ێWexicK{ƍ7lhjnڸflmijkt= n;ٙTggWh mMM-̀.-@Ķ_KKsSе6nKg}|'s2d, Hu΀ '<%Aed#|5B8{FGGFGLJFGӓ OL >4 FF\<>480<<65:8024?n^{ .\ˏ_~c}ر~sǷ{mںy-[7mٺu붯o63>15==yf䦉ѩ ̖ b Low׿P04SQTr䛿yC|ׯz嗇^;/??xǏ;~lG̝<'掾}p_wѹco>αSgxb|J?m,R-\,-V,*h+[XRbRai RΗAR* KEޤ.::t^X,,/^6PFZV*.uló%::Tw^2r ȶ.8 ًE87@B b[?W>լD@B"-]w٣8E OpVZp[bb[=m_쭠$ZQ K (m*=G@IIǡsw8P/."p9K ҩ@Gױ:y B(kKDRQq8^}ݲŴt OGU-*ߣ,L~]WK|7iKS$=T#/ >hkO%LK}!t#O% ܗK=Hqn'BIAz+n9X5s!m{%CNCkfL>^-i00#d> KP T湕jz l3sMovG#^3^>Aggy9KjѪ Hӻ,ˣ2rA۾u)mP `i JI&)V;](IqSOGIZ[H5lwK? =!y#2+V`<ۓ![Zq"P&Pђ&gWq1Ԭ$&*X bWEtۥP!KA)$yM{cWC 0YZ!OYdzfߙgEuD=I,Y "d[yr$F?#`%x7b5 T#UqQG{>+c5 ްq0.2SrT;O,;W*?.5AM9~QpMh3о ґ} x|:KpDKEԤ@&P]J3O/$F^0 w\&2NP7)ՒQ|@.P;HQ4F%dat|D{ig.`za%E ߣLWIKUjb(,()dD7mC.*#3 {+xbpwAIvKW*EdqԱ=cR/yTRR tZ)VO0B-|=ʽ v,.!놗w`iPHt#!<9#"He*[J(bܐJ=Bx0OUHZVa :?840ĕbf''>w!ul[jw-U^FZFuST7"k\} <,ő5!DoWep "sՇӣޭ]UkUJ&Riu+HV4O<:$":-D])z#-rezkaܖ繽seL*](WuBz-*9vꐊᘊK}<_U-2Nj58e y-K/ne2t3'k8XGcW)U׳PmT@zxx%;%%cṞ=ER*<~u!+pgO~+5Nt=L\KCOEU,V(+:fσl2qXBm8*% _X gx恞u_RmjJR=ґ$UTeZt_C}rm%_܍~xOcoep4d5boZ ւZQ|N ޺B*8UtP;w0uNٌhI2VV 73X3j+~tOW=ʁ}dMF>Uc}lvU dÒz:!ܙc aC˳hb"\%!"ye*%qPD _V~C'+U) dp Zp:kzb2"+ɡ&\QN(byP堳cEyvЙ\ LY}㟪N>2XnhHj~ O?e\j=vZUwMWH[ $/*HJ0Ѳϰb(BQ„[2sξ}3ݻcei;LtO9kgg=/gO2{IS]\*2Vqěq%AHkv[hu}-6"5FIÀԐw1ʦ+Uf&o,LO-=aøHyu]H~8qP.Jn9'EEJ\$NsI<#uUy^>M?}뇇o&Oi -אZb Y"'۸Wt5 +,XߒPI_d"˼&+X,7~1G!g_is YL免-9qb>+Kou}huLZtۮ!TmNxx9¯~TUQbt'߱zZuF,%ZnIApzzqϽ">xkQqj5yFѲ*mlxd~?ޥMX$126Y PC$i2 OX7 6TGaiEz(ڒ sss=wqi^!Zfy^K`8]-Jek::muh)T; nGJO{PgQIY"_ȼH>c룳|릮<5vӷ۶bq~euQh_öKzYa8z`;$/zHYGB&{y'E]Wu_im<[b'0WK'6C` u3P%|SM֩4akX)Kq(BU*xb6?z%f|-2iXɣx^s(1 #QpXњo{ƅ 5VhIxm\lV-7$ު3k..NOp2 N9;} [c"Vc$ # 4+W$"+M,eQ+ Fea Y1_㊢jm]xnh_hӷ]<[|&qf% (5: 5ʒb;ŲQ%\*! Qɠ̇ђ Ox52ϊmZ&kҲ_b8Ο1.IV{׺D >0]8 LѤn٥$+,GTDzܿ8oxWHNY60-l⟾`qpOފ+,S]urO#P/` A| ɥ$ą\t0 N^xpAS߁mK`vK@$doۮ̓ϟl>=s7tٳ[jK5=QdhSbfԥN| Ɔ`ykq '4 K";aڈ;ܵĘ ,❲-fvGX"$`X7{b~?Ydc _̖0&9dM!~C(Sc`?<ˋw?vfxL|Y598s+@鶭WZ&r56h0$_taTDdi,)D%jehJ4Ϋ.(T*ܨ'ǟK\ Le)F"7>GS6Yߜ%Qu:&q%}[d񵧾2&>HXYӝB$@m'6iG4(Bц^&#7ϩyO* DT52cTikpύkHyʪġ8RpY.qT ^{|zK ![oc63+΍h fpVr. .w&kp/$\Dĵ^TX~+zi% T[`):0c:>d-05Ю ٴenO0NOyIp7UtfjQ"APs\bDAwr#yrS̠ ;?/SÁS= r$ydLv΁oI14)8WQNRGML|+l)*e*İ%Dɿ   YFЇ8=GpՇGf=0/uGM!l[{\n[seX,&"e;Y!*wL>.zK;RdtIЦ,OZYːDd8衙9NJ$zt:]~*^i /!qcW r=Ȁ(.M؊4%72[!T-3kdf;۱܍~tx'l]|KL[3ѷ%O&l5Q!*io"2,}i:;=T>U`I@x2,s,#Ξi,7шspV8񆓪!Wf=(O*Q=6_-W] lF?{Ve BW'nnP6 v FM@M d,?75hzKԨSݢ ,G\9YAr A$,⣁eQnw{dUr>6$.Dz7o>;LVX*`@)@ ҢSSR!l~K申)tCG"̏Yg~N6EӚaɆ]G{`E^Wͷ@9goEW pvyMr@RR3B`6\: KuIw]b!.Hs?XYQm5,dKtGC @qS,O/?xwxK3 בGogϬwp/!t Rmy*˱(Kђ9?7L}Fc}yU=9P_YU9Op*(i 8*jgSvrq_}Ū_ rW <}ʀLXZ~ |)9`&=CXTcl#w yӋ,i=q>gvP!˚UsqȠ~NTEb6?qP\f*f-( wwuƈiXZ`#k֨S#. "$^v_'Su8rGXzrWf<)HPdm49iP:+#ǁImq v՘:7$4px[fLV eBrÁ,y듸8q] iXf.D}.nHc<=pn(I8_q1*[\oY#Ϫnjǎ&]W  5$9$Xzrteʳ/d\pASzi>MGHuC%OF\~g8(-Yӆ$ m[/ͻ||MXGKHA^#J ЇhAhF6MĝUp~vƆe(X`Ӳ<%6!qX1֗_I6@v*AdutIG v%P>J`jP䆋Mz+`gR%@U!:%|SWI*WH#1+Jx5+3"?Pm:}/5+}bE,$Oob#4'gcv6K8kB!*';;nG_Wbm[oޕ|~ϭcaCm,\"!.}`< gIӨwMlh0:5E>%(gKzc2ύuh MQ-Y"A_-89=)'piNhc&ĂfA)ǰ[VnJU&q*>쩿v\[ynEƶnA&ڌ/񜜤NpR Bȡ J&/ -!C~᧎D)#?eC4TKi5Rp%&e ֥m\$bx?ZMWqQD {DItGn-" KxUO͟V]U%`&dȆc8d$k=πx 1`@xm0`;wU29{~M}A5w]gg}WoD\;e9~!шg"-] O 7]dYg$\Y<^JSD/hw^'4QTv~rVk@clR`nхN=39Ӆ؋Ş 0-H-w.Cq_\<0âR֕Ar)ΫX.UVkKy+77_lD~3 󾠵\}9낷rƯ,AZޟ"{-RgfrAV[hXK87,S˛{O߆G :_I- R%v!19#wI~8+3>ov7Ϟlhu(nB80luE cLmXl7z\b^_tGHM2JF y8'%wo",k<σweU.ʬWI׋AfU9ke-lnW\DBQgNz A0&,!l4%/‘H=ҏ%Fg?+[7ZGYς-;A5L#_;b1VLw3Wז1A&GOCn˷(5u'{>dsTjDQI] JFia\Pi)6m7rYiq}ǯv-0\':m%lzf(.o9 U?VLF.lK=.UV/Jj7bK.Yp;?T.`^$6nk} y@W6B[&)˘ݐ' rR WO`5plt ߚG0XHdl1K8\ })dѱѵbSF+}WҌf.x.4Jl7lmmQbu]*&趗ipM˃qHy`M/TWNs#D]v0i(Us83{j' It)ؿCH L01 x̂bQB_5`ԗz>>>^7ѕ!!<u.}Yf ȭpX.K78s]G[=iXGs#5]DR*p'*X˳@̳ѝ/TqBϓSMUKXJ`pt 9菼YMxs%SXXONV;Rn2]v3DVTʌ%@V 5*b3!EFvAc!jxS?D%VӪMRNhlr}aP#(~'l22IVvONEg 1 jLm>yt=P)kZKjs8^yylm[+!QѸ˱F˔~DX ߴĖXKŜ :)y-OօeV($Jn4H_)EOhǵxO}GF.%˕ xr>99b'D/t|,@*Fj>R-_:$~z:aVchc-\b#b:,J?$fo1בB:%.EvYVv98~C42HSkzIc샫cfEo6agDljOlKj*B* 9k^qNKV~{#lj,[a@ॽ)*qFQ9D!`NMX-o..lE&̚+>1Z{=\(?f}豨POuK"f QtRf<Xc)`1W?Aossk_8UN'QC]$^+^VSAJ$-%C}PWJ'& WP&-5y/9["it;@k8ƫ=R%X=)M vtPJC;f tF Q buBu~;{7wqo>a9@gJmzR\ #^=[TPfOj˽G9qp4OlTV8@&GlK?E!%nD{w:MWlG{7pI96@pa®q'oaI'Ο Jxclm|/!){w*KC` ܭg頝%y(or1BP'3np&3pk),JHRxCֳ7_qdMd.|8o]XJfXJreUb$(O4uqMFmRђ)DUS`V35z,j, ۋA@Ar88XY7g"Sk.h\-Z6i<߻js=LH%nV0#M3vL]-n!ZG!zQW[5pבH)BbkmP9݋E#/ ,Uxv-XfU|K[; R;D9)dH1YfIk']X\3LBm-5 P c*`Ap8'.98UCplu9'5Tp\ڠcsrr,.Xg7ZVy&|z ӗG=^ kn7u:ڻ loR2ft˧&2UYdv%{V$s ;1|0 D6W0q=D9$%G=Eşs+K1s/]|Cƅp 8pW?.(Q,2/]^5Ggӻh}λOo yo~Xt|9ιKt>Zt_G_u"y2Wd0xS @ѮdmsҿM4y7R`p5U ,2PH!pX YDK[Ip" H6w~  zmI~WkKZ3չQ̼Ѧip1XL|>pY޲$,43g 3ք=}>r%'˃+W.~k{N=fa-ۊ!&)Yq!+tU#Z*0[]vAQ1w<Cdл_i+4v%QYN ,,ǩsUָO7-R_S-,'q&7+ol_pPYU;`y遯=׾DCINr%J2hd2@r xՊX(JOd8d|^{@%6s7q4#U Hۦ\Cym(DMorhD7x5$W|}؊PeqZ|ƭd Lq Lh12/}#>ů^O8~t%ÚXd\ aF@XK* .v5ۺRl/ŧg7q$eLWVow~9c$.9)Ӓm3>3-G;>q&d6HSu?"M+̱JFYltRY&ѵ0)N5XtO|㯎r^ ,@,<ШEK+U)(q2d++YJ#T:BxhbV&ï%7 cD;̡EKd'\P -Vk \ #*[K>̇TŹ&ZL8I8 -)TNMy3qr ;?46G( Q ,6 |XbgB̕F=J䖵 ZdX$ݾTc\Jc^z߿\#g[B]V u%W{ uݍIif[ f]Q;D}:ӫL9Bu(KE{|__|m~ n/5?C;y)+Zyrr|XnlVV֜Rل:Vt~@?fJb a K-W 'dXeMP+ mGܷ_Jל79/zL;]?)VuM(Bct..mn}k..Sss6g:Գ}WMwgi5m347_"=/:svk_d<~fr(.%D䂮efh*.[XfsrpR%h'J#n8|T7`,/[>=ӻh<}F{ć'UzYd+r) +\`DĪK4ds U)\\/rE<|}~{mge8 L(v7I#R>x25XI6"!oWq[X2< fPhgYaI\a)eeґW~;z7| ,39JjHZۢ vU k򗗠j7l 펈/)8oe]z w;w|` ,GiL؜ WF98ʃb)-8i}yeƏVWPؖ2fR>GLK]x-+Ai;ݸL9:L'GP\-W몢*wtVM,1g4LJ–Kd2I+͵^p%x>]PW K_{g{{FYg=NhJ-ZkSxz1166䫼g4jSZ i5maݯ*e3mlw޳7'Gә33^gP82, sT- =}d'7-tДBKc Z"Ǚ{1lmϵX 7 ll;~QLhθuˁeo'--2 S)f|ֻgϞݺ~rxtt ܣcDnVC"BKf7k8EItsZhIw֚<_dHl3:{\tG\6zWkю`cqL'm.7˘:T_a̴ȳm6=[[vxW~;[g7{76Mfh4b R REuCb.Wvy:Atƣ\&1.(7p0C:z0{5LqmGtp?*^W/HcB~`wm/ݘ1 @2i.b̺֊>%/S q4R % Tautj( p<ΥL]37kN_咰|;z\!ܑۀ*7T2V@#+F+%.QR/-ŷQjxt=q5,H3f iX|4\Ӱz׺ۭ[}Oò0V21foayU@&޹'L7A0O&;vT*i↎D\|c 5_\`ք%T_riѲ֫r\(&CQ~*m/vF020HN}X6^sTos57= Kԝ*3fy*RЪI4{~ݏr&dp I-,KY( W&/ .]ۓ, [;;oݨ.Ղiۿ\;Z CΊlc?1Ho%An0t ef:'"/og߽_l$|\ξp9GOs], PQ$."bvSC4hbzI/d$wZ4W+(Yj4_ֺ){>! *E2蟻~HM{Hh<2馝$.CN8LUv`ҤR%i7ԇnG[$RƻKz[[o=83Z̧yz' :]_ڑɲFUUONd'u:ipbCX6 x7j|d\ADxZs?;흻:M1vt+C݂D ,T$$TsR٭rDR%Yc9%0ǙcT'̼B:_?񞇧h>\NV2 M 55NVf(VLv#RXn4\2i_Q1$5v" nKѰ{!]w[-'I:O*hJyFʵ//^٧,p۔}hǢSZLYeOcHK^Y8U:ԩH-t㇮i{SE~W}d|]'ħԳ3~eI:U[&?3!Q(Rڱ7^v :5UH[ Ks3 :< ߺs;wO%p}Krx]j3 ,yH/J ǘTBKݟ着Fd!aUS?. /{g6{?yD1yޚH32MjĎ5JQEJѤX U֔b~*E1gm3?6Me\~ kmy0拷]'sO0LsrSk|~b9h!2P2<,w Qq'*8hԅ(@Ց9 PCB.oq}G - XLR%v e>b4z5cZL4N>>dR-FuX\a)C~E;g6/򃏌ƮOF(Xn8ٮ&#Ɨ{IǹOU&ϒ4&6GңZ4FYZ5uҿ`^s灟X-Z NBQx+'tSyd9ES PV2 Cu(s#Ycly~ڔ[Ímū%߸}qvpӫHS%Vs̞f{q~tB͸Їi7reU}~э"kmih"?f22Saӵ1X@e~۽ %y!+J&qӧռg<]T5PMZeq(3j^)[y?YM*.(]{j81x2];pvdjcw|DR(R:?-O9nwyr[-:xW&vJ1MY6uDrV;[!IԈ`k/<ۻc}ە myS_';Yz8X%XHiKYwi @=)sTU ȺV_gj4="E i4~;z{|*楀 Z+ňDd|ܟdVSbچDZkO(j LTX2&j4JR0\|NڶRiGgn=צcƒ;~̃hy_xC?f `2~;sN|4⧕t9(ib].e LӴD%jFw+UVCKg],|kȓWqfos?T<ZAߖd4&Y~,.٣6HIitp#<Zc ɥCȌJUKhK]|͙FӋ禝#3˅O߸n`)؂i2I.m ahmkT0fEZn ie#Y¤RJ Vj8!cY(_mnm`;mZ|"XRWZ$ucrH7pr6Os}edQVG~ ]CkY)qӤ̽(t*l` )2#NHr]%Ͻ;[{?< FDrb~DnKyDLM-3 NVIht7Z2H:n?_d 7osO}Q8{={{;{}{/]U[*+0gdtk0C_B7B5:GC )]#EhK+XN*, A9.B&y?PǏTExXTp`w{ /o0fQ3ĶgҴ}hk+-38!F#ҪMoY|Cs>.)LJ!JYn1h ;.VR=T$%}\Ja] [UrJ9na5q.2/l;{NUHX}IXFب鮽)*̤uRq')/F& ,8n_2]zc[Qt;Saߵ}w7Wd>jJ#МA'e]G %Rcb*jU4Vf`KRVxtr(̊4d4oJ9]"GǣKtVǫ<}ͷ [~ewihG3{̨:KIS;uaYd@F댴 T 0zXFy7ZcXS^+Z`:b;,M 8Zo ^ueSVRЇKS4F5m(4^Ԃhjh=U^Pb!=M!g|X#%!w_Fe#{B+\!]= -%gpK}n44ql Rxm'93glcgJԤ&Vj:5+;qσĝ3l!hnj9rIe'Ylacbx0s;γ^`FX\-\ ύ#OE\&Q"5aαeaeAC%W@\A{ocA3/!3JV>W90꺚.}í.~@O{X,9gU\f G@Iی6Z&z7mc0c  CëQi|e][#?6t],S%[;?;zJj9oGʁSO{K]LӋW=(>K w]rDGl]8t V+Kx*Yٕ)`y87`{IZX{<ӮFBbS2N;#>ۆRgBȩ.:Ҷ;9=cq#e 2I{޽qU8ˆDsTWz0Jf%sP;$`Ta%:z!"ϋ{7YKLYb,aMȟ:` WqpfokhʴMbI{@z5,5tL;w^'$*,},Bd#,:p8UamN/qo 7L Ka,! 4FbF?-]l:<ԊkתWTV֪%Ziz9іG6!dT. qaxWRjUJN;Ig7f8 :Vee~U7X]'=Ļ8k\=;ai_$W=iq^k ^3d]7s8|=7;Xn?N((͐C'ï?p9+;>r⓷:#//I,}%p񔵱.JE٬4+\t-M3vG f~lG0,ȰNZXRZۖ͠GђNJA;S-"Z06szvN~ÒU_oU9Z;;W!xj[poҡD}iUY5XVn(s [&H`WL`ЈxYs-מ1L8ʩDd| <,tV;yaޮR̠ٛZF%ZꅈN`'ˬ',Ug|:KNdpih߀}FNcDY#Qi )aea/O}R 왉$z\T.Fѕ=UpqZ$:e([ԨnWo8oxQnkֈ8ۃce.<;.veg5|^]W'SB7Rj/ss瑞% 7bҗ:xGG}M՘GԖ|^ENUC7jn+R-e5iQ>!2g:ZM~k>?N0Lau`1Ch)g2pRDKr K.W2C"xeձy C%# Vlj"Ƚ% KtM$͛>w}6cN^A&}H2$m.*#NG)Aj!e~ oϪjWݡ7;3l/-^o;o?pQfc6KZt~5Gy0Zєaz|IJ{Z\5-.|d74zBd7"͠ES %n>/z Rv_ ($Z2ʱV |.{m=QS5H=}Jr(a(-j h[|qZeQEpRR)4ug"B: %6$M9[g`wqF;oll;pգ!mR\WOFp2:=GEfGZrm]C9jɲCgaX Ztl.p\g5PnTu}e!$5 vtK@JϽ;sfpc՟'I+VZhˤ|=:x< t/X`G |y,NeQB)}+PEIJ"KUY=܀]!Goomz{?.O{U'/.$vU!ՄɳJÄC dyY2ϗҵNlĦħl# 'j~ % wіp.$H4o?f1έYdj/n}iJ_9^HFaݓ0Zg:1QVȡ|9G7akq@Z)2G휧{BW2x;om nwٗ%<-i${KmӉ.TD>:xr<2 GP9 A8{@c[>ao|dN{"uT~uKeѓ-)O'_;6<}%Щ2y:Gqԙ.C§ԛi'1帄,ߧ8HUFT2!9Tzm=2)*:UXFK󽍍W-|x=4׃ENFq4<$p=xQfijq]rG"+C; .ӠvқaWQ7VVI.n omm|'L mLDo@%"RY4V,NJ AގK>e$V;j[PyGW5=DC?O~jmP`پFژtVo|2C9Ho<]\yxx<qH /*[rXUvU## 4ZpDKu[s$ĵM+K{RR%hd]ܠXʚfgpk7|᧢LUl69vxSЖ&S|<4ƌu؃]aFn? ^n-NSY,.W_|ӭ;^_n>Ϧ!% M6n⎮'yqt6ò).ڀZ ׁ4f4+nW/\m*Pz_'w|3ټ,gxwoR?MNbvqS~&0E4;s E %jy 'EY~jXq dXǝM~sw?}MA) :M-^] ]~O ,*=gik[xDʷ-R?LtW]IJ\FOE2GsC:ZvZ..۰2RJ6:rW}t>c|d. {~}3^N#'O4 TjquB\: ]GyēZ Bw0OMfԨ'M+, .icT .+Cho}mnm;RKs΂ !EwxT~((ƀ[G_[.BO< Mk2ՔB״ߤa'w2*,o]lOgRG "Ǚ5GGãO*\^HR3/O} f;/0.("eB,3S F7>I7čMͤO$.30V[ 2ɨ;kN> %lQߘTVvd 4I>yT[\[o{^iDOͅ  'JM0,{.?ipyp8qYxXYCTRzڸYcz\TkY c.ZYzL]r418kA'ue4龳|Wo|ζ {?J[)^&+.՟@ G~VQ 'Mr8e6:.Y"𳝨ݎ}_DdmLuLR!._xY0;ͭhIFxCm&71D~;0NK*Ѵy=xۋV5'8z)I(uZ}漄u)'2wO l\+ zK^JFlʠY ug q'*ZJd|xj55 QvٍnjaɓCp.oK`p>u[Xz]^a0͍^\8{݂JIڠ*FBh *S /]zX8\dc¬ BQ)['> %׷8Mor~"AR/7Sf]ib}2DK;uϷ;;;0ql\C\.e"3KΆ㎭ qPTZ- G x]LB$ L[W),sڳA%i8][[~c4=,MfA8Y8;#t;I>:tqB]~DѾ bPPoNٶAǫl(Dd]fPl]tbt\Yo#:h6qklNT]7guSFG[v[EjOqkbO+EdX^@\,0e0j5 ,ů 1ӭ녇~QYpL~2fR)̵-K?Ֆ.[u7<}~@3vdF.Ttmp/Mcť ѕ' 拴S9F,؈YutsYz 5/sáR/K4ukte JD9 (0Qѯ\:$AIKWֽ O1żQIZ _CIY 8JRtp174s2*DV)',QuԶ:O\/%v-vn{l~CTc`3pxt=&RU: I9ٿOIz(fA$\X, ɼPFU+x7lle#K"[൝+=p䮥*!}-Se]9%#x`gпWI?hGXp_lEBXs~VWhApit6IltY."cƴǺh;6:R hnfKoeٳ[׿# GD18zęqv@S3#vK3~pȖowM덎\|!((B˂QCţj5\Å<5I+C}vк&,:. "\*,vIr9Av!of?[ٹ-79_hB%Oi|U1L K0XNx#Jt`og-$i'qkmʰ~vM޹_\OSt,u'<.X(uqdzh¼Sf:Sc5:1.iHZMF2tXs͎ u04kqh5U@*M>}gn ~J(:UydV̱tLD]4QxQ`XBB(vtW&@OMQGFKm\!/({[Ϝӟ%uә/]#ɡv­ GGۘcI۰b)`ɋyhԬjf,v2DK×jFTQK ˊc0ݢk[QGSkǺ)Owlv_'b: Ȍb?a* V-rB>b ;jm{FKdƹjPTWXFekWGKϷ#u~ l":o7{;7V:q~=RSvc*6#C}LX/=/g ,q`vK1w6L^tyVIcJۯ־*moZɨd7j8'Zw='jch:MG_ݽݛl2>0JGomoP!ZI )"KO~T,3􁱛.uV㸏F(,#X<%Q%16י=ywK;RxLGG2!X*onc8Is+ M`Ei#?'FM5}u 5ZH&ʨ\ǐ`)KE\H_ΎE_ :X6u4koyorΧWox1S؞>d'koVQGV$Z2F~ԅ Qˤt #R*۽آ(L^)moml/5FQ/`)dxH3/1F@CH_.XD<'ǒc %2tY$9L Ki88')Ge7i[BbIne8Dh …Tt3WX4̮\G_{-:wnW|&U[|V#s[h~R;n'>pDm6-@ `\T.k߾x0ceTb8?r؀U%gb>U4 D:P,`>^.4EwUO RCz\ |{~M?WR|Ziz!a \B2VIFÅع.!N}:E)?p\- LT w%dΩ|403BedqW[_v{m>_ϥ:OF^H`7 i)! Ppt|Gm(²)xLIJɀUPNArk~R?Y7Jh~N!x̄625XSRqSA3 ?g/ˆ گli[ 3 H oǽãd?C 9ěչpd̫OH7 9 ^z階KSPCc[8#CIzŋiK;-5Ijt~#5qE>;^: U#% E,N'Df~eb6wJK] K}9mg,5Fu,3H; |fq..ṽͭ),Mz9)WI{px!Pz|P^yuW ?J!3 f=XE'a+K4["|74(IK]8m9ڷ%/Ǟ@5(c\q$ Eϯ|짟!{7_ϵS5jܩZ%W:so\K1qbĉn8,R2?W&%Q.)t4³[}ՙ v$;D| :ӥoq[PyE]\F뻊pC Ѓˏ!P)A=2цa =q.$Osp*+Z_J,'ԝ6_ZNqvz#𰔯RQLTpz^b]TMٕ#$?jF- 1d02ß]Flo4k_t@ÆL`ZXv)zmmyNEKM9N![Xz>|\]w?4AQ) T6}f[x<,G"Pw5{# 7Y]<Ǘ'B$0, (M%F VڲQ R>>Is5uEq& ¼ *TQ>F lYT!|CvK뚒(8^<9mELە"Űh׺gB7_K224`Wxr<"H%Y 6E!$+g.htNw*rAb/u)KM6eAbv$8Tkarz^R<0$@Lgry/gq=yP.\Y*Z~DC H;aR?XC0`VKa%/%^uϔu"JjU1h#Z-qWCp$WVs(ړkL.ɕhzwDE #Ybځ.AӿI#"FopIz+Ee7`Ʊ7"RuyY DALL;P<~*(ya#MeP\TЅ_qҲIܜ3 _O#TECAaA._TةZcHyU:ٕ^y՟wTTbla#I0XD$QL(ZoV ѡ{56 ڧaI$߉w49PZe? {j\Ǜgwn~<" agcD?^D'#UB%f7 95m_|qs;8Hw@W~K@K ,Th1 c)mSd̸b4ЫQ XZ&?ҳĎge.#W] v^@"h2NlLg9y|7,fVbG܎j T@61iv-׃X O2I$j6L9d3O{8U]`i齨b!G @(Bh!@:PLƀqQ/E oKdI;{YO yKeqq\8c\I5U#54X.Y>|H" _p9^?gjf~(X2yXB_t7#%̊xCCYҼZT# NB/dKĎu!U}qXkE~K1t)[J,i#a3KF|FW'?=q8ij "LRKsFbr^D8#ayZL}QQ"^[ܴ.8 mR˅ln]<@ƅٔ1_gYp dD_&{$Xxp˿)jVHr9] ֐.5ݠlyK #ü×xnW%C}8d ,z^33ѩj9S̩.̼WՒI-ΏYV #se\d^RLJ%#X8Xjm\tG \@c~JK-M&rCpDna*R?c$@i$,_}JW%(-H?wx8l~x{-ge*4f6iV,5ǰ\ՖEP̬ wf5W#`9_旆Q;t`D4Q$ĵPYTIoɿ+Wx$2&[7Z9XO\FųigE%(.c%\ HtB!ވ FG̵$l%/] R1[z2K̜!8-Lpp8O_ٍF|'0-jUŖi<2Q0*J:_rJ-U JVe,\I{gD%WG$9k Hs:]PjI2Skcab;v&0x ~`)%/TYbYc eC_`$gf=5H7rHXMX=/h~vK[9iphQ}a{)f ^"~vCi%yƄ6KN-(cdwNb$f9N!*9G;Hnf}C%-rc!# TǗ+-M4d{K-$k=H sdsC8yNa~|yPJ9ȓ-8$/䙮UCӕܫWvœH~uFkGQy~:P![MP_CƓZHE!VZ2w|RyMv,^jaJJ ,GizfU<7&a)"DX;Ϝd;^K"U{fU6ĪNQˆk}9U0=dywH ȵI&N YVF4Ym˞yۧ-%8%!RRťjWdeɈۨaX cJVoTTQ 8䘌I!1EZxzB.3e&W61aXb(c2k~ne63YyWLIh#hA8x //&T Nggȣ 9Xe:4]Dz׃C9SN^'"#~i4Ws 4UŔ6\8*a* UwW#ɪoOohFO`Azzwi84Idp=JIy^7pWJfLbEJ+?_,ۮL@|fVؖ)52ڮ@r[3MɮoBwUR|e@ gKRiOU3DlZ(QQ5YYmƻX>7= $㒶TԢm%ge 'ĒWY#jVJB&ಘǧg0=YdqvF Vz a޺bɞH[ciľ &q6ns[˝`y_u8ǜf/MdGT}ѥyz`4^ 7 JYT̑VCd8&U'ՠLLG1C~nFYP]>-4T*cU#z+%4't99=YsYGKlꖝ9?q08R_8w0q쏼Ę(J9\Vv~[Sxi9 4FZ\AUW0})!:tˏMy@ wDyӓ3)Y`/bx)88 0~/RNTxdY=o4_{L`pB{ؿ5w rB ʜd/ҍI7d*g$9њ9iuqa1]#d%XTz6 !{v@&*] ;?Le%IP7f*8@eKM|Gm+j8LEdBh*5<_fb!ml5&T[/rnf W= kz;î28NI1CɃ2|d03GB/>.RCd@@C*=2S) ;Mn"' +lfvyۭh$r PKD< Yt5Ts6S &&gi¤rT0NR#eIsgd%_,jx,sFr ӓt-B93e}wtC"[v- P:jy݃ϛxM31 ʂπJ\\f8 ٿ$xU6e6Ö闓ő?"O.H?T7H|In0Qi-ͨn4!S&yr\?DY'`{1n]UDmD0"HDTwrjl P)ef#V:T#&9*uFwFPFD)5@@em@P*YLܨkvUi(//S####CX s(.y&g&&f(™+Owӥ"<7,Hވ`R~aa8L0tM%фQ2S8Clu''X==z+mU_5CKwbx?lUÉ[ c U\ȲrFKc_ ylK5 ]l)ƪ 5QcujCrwFcAɅQ%X?t___wPHjp8I \,-Slvd0](e `Jr!S,劥tytjM*vޝJYR>/A,9c\>0JK:$Tؙ](+=wa {2ms%ӠFIrjR6ݔ"w Ιq"EKjkqh˚z0tcZgF6UBJm󠒞މ9 R 2$%-(/BYʖX t._˨A Ƙ`8%TeѧPhB),si O|{羟sУ?c⡇~ǟc=?G~٧Ͻ/ /⎷_y|=}3vٞ=##GzRlwHgϾT}ݽ}?ݝk=޿ӽ={w;8ӽߞ{zz tR9Zd`9^ɦztQF~,Use Ʊ VyXA᧬kῲsELTEZ t8$=dceWRH LscjsܼB"RX 1rE)9ϿM!X}L#Y,%@ʌJV[臵neM?ħX?Tc.3L:548<88??s-'o8fu:v}W׺?NڴiӉ'r'q'͛_MO= O:M'z)gl;̯m׿q7w.//ˮ+UW_kꫮft?馛onǷ~t ?_wt-;zt'~kǟ޷?t@_pjw|ao+<6_D|(8, @9ުvZk!pk Xp(+ CVQYP9BCי.9=3vry(㬷a[ 5Pȗ~TjUJ)Ȃȃ<q&BԸՖ8D;o`&➼A(D :Wfry2Ţl~QP) Ա-py1_Ph!x H&?eH0/FÑH=^?/~j_n 7i'w o8e릓n=8;]v߿+/o?'??C='Dȹ:^~xywl|ޝw {3}P!72:)ߓח;OpP%=GәH*SH#JG3Er.n"fBqH:3*Jcg7JevܕL*QQ`'j21rLMEa`%j)䢰azVX>Rl S?!O'+F^TdC13K?:Tgл!_>v]MG_|u{&rvtj;펦&fۭfp:6{b,Njs4]o[VnT6O$Tq_Ir = 7CP 䋴4G#p2XzUG[;;W]ߵfׯjMNp≧|۶y֙:s}mg~[^x.pum+p^^wu{~rnW7xM_n{;__?ggSx|?;^z7^y՗ۿ;^۱^zW^~|o>ڹ]}'޻oOo_p*3%,4L~K:C72Bd8_ &Vló]S!1z\1M9J9D)ad~d3LH\#)ɦёt Q384LJ_DK6]|aq<6p&d6[fa2-FLFbЛ6iY8h%LZfzkFBh2YMnK@uУ\vPoӚJ_i6_wvz }o;W- qٜ_nnZVI嶸s0|A?LD4H$áh<mm×DGGs{G]%Җ\޵b䊕ɶΖZ˻;V4/hn[ry׺5k׮Z}qkOشaӖ'rʖ8Ӷn;migm;S:s9o9gxw7q].+pŕ\}u7r ?/ _x`~gȽk/kގo[;vhu~//k;zߧ>?~O`GᄋÏMۿg=<80?wgg?׽o=?۽{L50XŤ7,fBQ#l!mVDl!FK`4ޠ57 :@?tz]ܨљ :#CdjZVAX]O:qæoXḮNܸiIlzڙgqƶ[ܺԭ[^xٗ՗/ycK8HB'c9md|f]Vdb胮?ᆠh"PAS`0 F@\js؉M %bU^727yœ d xѯ@Oo4 uu5u &(#mV&\zh kLt@n&|NaqdGN K?<&&[ABtKئqdxh8MntgF?x&"v:/f9"md!脑Zq~Lm4iKXaoLd-,XF, HK# BO$J۷\,欭Y!F}4 C^UNoV#`4omNw$ZVExkU]V_۹ǭ_׬xM'z[N;3:̳ιkTfqs|-L6GCh$Nbp=\0ׄX7Gn(9azp3dޓ?I(9.Nzk.kCߠ'lt^MGt 5¶@Ɔ":e]},k <=`GKHL.*A = ^"4!Wkc1Z OJ##9=ry{'r tAfDdg!b!$ 2W L&;=U<A: G{}n3Nvk&@ LQ#DPfBKI(@4:t:ܓUBFC}+:O `:Wzm#.#K<u Q'@#,MG%-mӴPPmniD"lnnmm--𬥵%܉m:Vv-mm+7-8}&U+ۓD5%p"EBh4@i1;<0jڝHy8-̴VDY֌X0lP)H pq.Ay#@: YݦF%i'Pw2݃eMН '=48J?7_꟟3Ͼ >o'~'~_>胏<C>#u[g}-m[n?no[n~x-ka[@!( :8|A/M`L]b:}#pI3Hف@U6+y'iw-_IhjiZѵbEJ W[;[[h hmm[\bEE]k֬[zMת.Xݵv:f.:mXb+Wv#ﴵPp޲b;;:6nmDKs@k ږ'q2:#H ΣbdDXK9%i{ə GE§ g cd#^k]F-1בDtz }*h`pPˢg!~Y~6` G`3hp 1* aC#ã͓Mٿo`O>ڵ㝻v}ݟw~{oƛo[o;~ww{_{^~w~zYsHxhfMjea0XrPc{ f,=>,Fcu0\V6"&籒fo:k/%\K.8> u׾v涳v7~mg~Yd<ܼSN;ͧv򖭧rƙz&g|ʩ'p2Elٴ 't 6pҖM7~c۰v1֮[wqǬ[n kV\fZp{gO;::VB;i+x39SQ#G[2N߶umIxp/=X? C@Y+E"10,r u`I&@pHL@|Zpb3^ WH~)Ak `O"F9!Ѧso~L&E>_CéᑑP*K  bco`ُ޽>t]>ٽgߞݟ|׻w=tw{ uݷqIh3lu(ϑl<(z L&WIՀXN:#rFT}}{BzBT ,Y;}o\g|;~oګ~᭗|_xOzgz?#>F?O<ɷ'xGzysm?{{w~7^^q^~U}W|+.w?ܭg{֖u9o=SxG~G/{׿o~䯞xGy~z{O;ooona]+/K/K.Ew/ww. ._tFHBCZ(4i '畜e, j`\ !e5dұ5y4!R"DeFpEWFβ5O>ӣ|nt4P6pP{!;"vCHq`ХFaFȃ鑁ޞ܍I R80 ! ClvYDtR(CȈ 2 Y, ;Yvi##Ãô6Qͦӹ(h/!Lz;ézOt> ,Qzӣt('ӳ 6sz=Taxв͍qQ p6Kgxh03LO8 {2=yz)6:I3нo`_Ono__jz>'ldgݻ?w7?;}H⵷|]#*ɴv.+dlvD_ȗIjl4$zd 6l`N$A'7P6L+h_-,\#7&%d^SxtKg)>aQ+:8G,)LCc1'CD?3 LZtN8*hY$L3ȟ%j_HD>鵏J>pm;% 䞍EOMo{3P4 QH Gȗ^ %* ijx./G2/B%`p8 %lUΦ&U >G=oh'[ڊq%B A l \. LtMLjFqp- {hXΓ#J >#EE=Kd P4!tu" #2Hz/=F[RLn"asn;5Lr;!ց]:,8p,rXj#ٰVF4(jP2Je+eèr8m(zYR! 0.x<N  B*X^rz^8ێY p,P{}Q}7]=`  q @_ ݂ cNj-=8E! px}^2Y(ে>?ԯϳ~%AO&P,dL%~!>y|gSO]4J4NfXK7Z%%C1$(NE!XQ O"gm- $-DBȈ%Yفpvav}Cr*!>NEoq2 3#[A0՚+2R1- Q-nbY'/v"}(9SΤy٦GY|6  '^KTγ}0TO=m4+S 9JD)]~}ӝ(LP}oWjj,QY PŢ^o("* h" r姯( \Jax<, A8Ct tbxkd#` BkN` Bd'0 yә6pn؃Du `u:XLZiFC; UEɨ\# XaP K vIAp &Q~pY&9ӴZd`"~Sx΅PT,PV,yB"P[*r|o~[e  Dp %vZ_A*:dg].,b(l hQӳ+A &G$Oè{&x]Ճ!0DjgOFC;h/HĖ~2+T<~~?|B}Z; p>B( $!.]xBA=8P0Oi%ve6˴".Oj*c,h*sg e*hNC1ޫX\uvoJz4o^dQ\r- ݙ.HPCC\I (c `Ha cEɊC h.íDg|P ^&I,0.y10\6xRbDz))HK[: Um7e6pUХƈ^DsM$k nD@C%KXmrC9nMɀz2FqtݎU|3i%tK-|E9%ð}禾y- L|c1!I \U<4PT#mj>x&t|_A0mOv]BH.sg]nCx4GK,Fe$ `  CAbA %.&`СwCrEGB,JPf$6l< ϱH<oy c 9\yOiAQF=kQlaNdeT$ 88&`G/CAx쓟2.p$EMcֶϿQ D h w%3!Y>\4aV̴$KusY:s) r6(.E l$(Gb61R@9MIWrK0x"i1Ef4 iP5NWǵ{""NLaT, I.hT)SDy4VNTe>'KW'G'nY[jv9FLVǡ)Xn%qT_W-΅x¦|fٳ_٢8bK"PHB7+0 "0"U"$,`ِX?A%TQS]V;L"']xQGrT.%DICϧsϏ1GV_ɫS0GW,)\QgXO,eG:9 z\VӠ߱(x4 VǚNzrm .ouwe KE,! jDYt$K )(AKFj@udKT0}2R><\Of,Ԩ J)8!]Gwz[ot.o81 Ȋ%<(u[0iN #:%ؓ~0Ojaɞ@$sʼn[[Z;O~QhUC ,JW|  g ( Ak!{̳]#Xҟ۬efbq99`:v8qR @DQĕKߍVr 's&p@Xu>8y:O2Bf5X,%X Ag,mR#h:K)ⱹ7Yys 3aPt`%e-T sOs]\rL:iO`o7 HW ,MsN8Q͔tO4Mؐ<_;ccj:@s=1,TW7C^auƛ[bxeXrláx,ҍHVq_r$Eqi8=KS"mEJ CAd9CZ:ZZy$NEF9R->"QskHf{S* j5,:y C^܃\Sq[ o_6H!v}M-wP^EWHR%U[SHVooi54e`-^B/4./<'ِR<Lv\5R9rE TZj IiJXɲxŢڠ[m)Mo"lLĄW*RSą.趔--]MvinKDu% `O.$v.lPDrr,%>j(If} `Tu9AJ*k6b^{T҂IDDt|178Be %hqhUHRdmY&Bp0Lj_ nX2=ʲZM2>l MQt\z29B!b"·篆h1 2QTqK/L).]r 5<2Ls.QxjOEUksY${NI٘\ւ%Iq=TģT }a4ZB8a*,"@\=h9jt_"HؖJ(yJ+ ,䇆ή5<((cKQ1גuA04ʹlrT1#7:4ŏJYr䧥X4[D:)I!nz]5ԁB~D9 ,(5XGMԳTDz67E?:Dύ.\ wEBXѼLZ6PREgyJQQ5^E"()JŌWl {.UӴgrBK a 9fb2S(e荒*PEH5 C~'-d<ODA` *d2¿s1 ~FbĶ"mVF/eXwVA HCKkU7uR(ͅo@%(N*H~*nDQEA59~Ԗ$2KsJzfKT8m>bԛ#pc 0 JW$嘫x> ,Ħ<$jHc@(q$W3Hg8\,,:*2G$iԀCͳN%X2gh3;Mqaexq1mNJ`֬A^{I f=(kS5N t,%uR!q:\..`@2QfJm-UB{˪P²"X5'ٻ*U}RuZ$^1{+&K>]X=,R:eWX,UG8~olVu9'(0%M*"89̢j(q1э99^Lr{pɇGΕ]kOǕ^CK^Ja bYrȄ$58q7I dYmwq#&XLTйk:耥A@;D˚Z! "nЫ"3d`uz@hE[v >;»VܧuEqvDԪƍchp]IT?#?ˆrjF|L]GRiB %t @N"`w'b$N(Jzp2j<- f.#5p q1@UoA \FCo͆G:w P_x].뾀K.$c]kמ4TuuMےԠ -alY7`ɪ % ! RZ)]pOCL_{<ťng=!qJe5, Ps2wzGYz9 Fc6ٚ\&Ӿl`hSR+eM*bVnq+j/ _ƨ4Ώ0TEoZ*e%h<Jc`^8׏*RPeCo$[:V=v˷~+ЌWЮJ,52gtU-fTI! %EAłJ6Y$a#,wk1[\ qD=i@Us+}C-68r*$[&]=hECt<=G30ЈvtÝěTMa21]$P]Sj"W/|99qVj+.ЌKHJJQ,; |vC&볏T$@HRUy%V\-Hj(XYPu+oJ,Xג tz$Imc#&貹&Jz<,lYH%Dat RA<ɳѯD2h4h02p_;֭_7$\VLUZQfZ%B[(!!K,XN$p9-3?8kb,ejjY jP{xs'q +Ġ CMfBl|9ٕ4> 5ZDSk-6)KyZDIU ⅋lXU19TJIsޡT(DcJ*c IsJ %NXbR0."C1EsH'%1M9M:ȰmHH-AӣpCP\"VK(|=pe֜|;<(z|y(1]E.IɸDa)H4Gۥ< q,)U; edip#D#`z%a+^Ee=g3%62"1Dy"bwa`4̏jc%gSI^FmSeLF%yZN:#ODzQ~V@%f\vRYE]+TYBSEM(V&frVgs*h]><ʸZ ,e%-ZU*:#%+2=c#sۆj)lo0T-Ifx c2HW{#!7wD\ K?/,=ڌ D/d.K䤤K9Y"1RKAj(!Tع$qKmow<˥N3c)nhA%! ڣkxt++1u(7m6 ;MMVGfq5lZ Q1LIrT2HiN%-]V"2ز$q|T -!ϋ'Y\>R|@u15y,`D >#)T"ɋCKSJe\6y( ^jLAu'{V苷&։dh$,7;%i MHDAEN27-.@0oinsk4پj_?vˢURfeiZdX*8UH0-e òK$f@k AE ~UézEZZ牘>e264Ji6ot٭?ȍ5%ٱ^vZEgh#+|)ǖUT Ӷ4^ݣش[qNxyVЉV,譼q+jWK4Q.EYƣDθ,:k:ȗ1Z֜]WsuE5,%ȂRKGweULj'e]ur u*t0Da] FL P$]*(сLWWIwBu0߸ywjXEac詮zܫEta=hMukdsg aÓ35evn8Л1̡B\}\)Ugh  9;,DS 8>~T-|7j-)uĩd$Rxmm&~}.}{@7ɨzqcEپ’:R >瀎 z-u 84墬tFq"ΰD|0%3^ש\\sQyw>j~P 6?gYbg旝T4s]R KSQє> 4D#N"v#RFEJʲyLX5R+KZՅꌫ/?ihV7ǣIH^BJi(L0f’o #̈́l%& Q{lc Us˭iORBoebk{٬cYUW,k *˄tcC$-:_b+n\YsYo8VpA}Pc{-;y6)`AzK~G~`Z$ !* tq,2/Q17\>eV<4T܄F'6dhӌ>6Mu@j4845$[^eU <NmJ p-VC4rxlqulӕevHie[6Y쫸&5$5b3Fp6K s-mgm͕zuWUQyK,C l\kff+Y͓p2Vz&lO;>Ū+ )`Ce>O$:EvCbAvGVr $Yܻ@frD/mFdFyCP4A`J6jGa{J?f,CE~?JRt.yl.+*,St[[77?ve7瞖8vwE_57EÈަ)2K{3F$Ɇu|9S N:B I rbkS1~\yXV]yxDUB)G2>k:lkh#``gJSg!PEbo—:M5ֵ ̟-'ag#L =ױ_>!W?98'3KZlW%Vƭ&6TlYbR$ W/J:s’7cN_xۿ?#xgI|UIۖ5Z!8;`,"~wrׂ3.ɡP0=mT'1#b86h6z]Өڴ·ޔei7-Vfggff+~(r0 .^腪 Ea,c:]V|,dۀYtCj,jHOg Ѷ$Ť.d] 248`Ce aVtYHNm*'19fź,|פLLj/u__D ,{2DZ%fKIr^؟{W5X$=oqωnB5Jsul isODۙb@KaZbl+.,nflL<^UX!h-@ c.uޒ,QkG}yūn.TQ7u[#q+`%;orJ6|rKy+oD*\^ěכu{\QH h}UY"].1I"Xu|񩱱}+~-_wTtI_=/r{-ۥ,F/\lͅemD)a4Vu5H^Hc XbSNb69_xKL@b^2|o,^{TG][7LD}7͹JZX"E͗ U9$R"1tFHbGnQib`uM&xϤTX,T;u=i 1LoC EQ#!S4<݉98䊲QDD;zA;L+:?+˞O2xVڣHbOjf?ޣ_|_(sd}M6+Tx)j^ۨԛ+Tg[6 7ֈm2ɺ@v!Zĵ4S_-rmœm_}l/B$C.|aV( r6nq%k;ca S+?:t pK5>x-FS윤503;z_Rm*&=uIt,3KbS.@ȗ+Zk?zlEl %6AK*o '>;GHM O0Xnn4qz]t"I,W]u&-g[wN4HD MCkQ<2]m\05Q}] Nr#Ֆ0Kɚ?diDiFil;u_c\*ۙ0BW^~_!eibO5jo*|ƐSGp&fcS?7,ߒ Sqrs+unqA >"fs TH\)3sx^Q(n"B8K`46 L՟l}: ;vK~Q<r34e[Ǯ|j17[kTlH7Kk0Phk(PtE0hI/ぞ2DT_:y+dNW@9ǢK0 ]{ha}w/de"Q\0@h1A k#ɡBX\Vj9ĔHXsnF1_c^.dJbTEme%{tx_9ͧ] J=<W\ڰ$KEPQca +۝g2"{ƳǴzGXv쿵{G~J>LVnO egŕwjp\ >"u0!G/>Qzkks/7=Q ]peڷ/+8+˙WDC4-\[1w-uNƒ\nR6VICeyt z.Ɯ&7WwuY7 YO2[(rmm٦#:+c_hDUIk*$za9HdLo(/J0lԳ;< ֱ5RD VaىO.2wc~υ*$*˵&+7GVg7+ +뛸,X[Zf sİY)OFuJd]<{ۋÏ>EQr gmynTvt7^ݷ.Za߹o\KiTZBlF vp2 M(s,u M[ԢMe5f2ɸ)(Q˻Yra1d"d~/!ǡ&1CRx IPXQX%I5ξ^Ɔ*'4: G= hr GaVj ٻw:WfRU l.έ6K,j8&r%GC`6u\ i679yOQF\a1U,Sx_k"}jw]dMߑ5;zbtc ʒ e&*!&(fTP+b.Yb\wb($hlp)bXYl>W5郁r = Q~oFNadKsFr7Kbvqȓz]`Faa2 Tv$g"[aW{gy|P$ .5)`gWyY17n ېj+t5Vl:j}„3go{SV-.]vsf׳ov]%3#{0wwڔM@kq ^"~1zx=j@tL9$ hb (ꮑMf |yRvDЂjRTPD1C#G ZG){'t=NߤqOx2iUޔa#įs')֗Z!m,/SE[>zϼ,|)Q5J PS$` QdTАRlj[ϜxSI9RAM֛b#B P?|;*A7=ˎ{\'`W®<5iv}=o=u]X݋eHw35t2]ȧI dN'ȤH12"!I(NT` ZATʕj){_NPno<kzӃY,)&-,Hh1&{L\ Q575?oҧ훟޻C=k Ɉod{?f+(1ib]=" F'+nqAd $L_Ѝ̮-k$UךzK|[]1XU}\0v/ LLOõ^n̚ސ'i w3=u'&S+kIiͨG7@} DS$G(*É^>G`D(Y[.7Ej,=h7S?,٘|(,Ʋ#Ӊ0*rχ%yFa_$Oj2Mu1TLGH,c#9z%tJc-SsE*Y6ݧkl:{o!*A~^Vsڜx`O`>,f4 9^ D#F*31ߖ5 +P_Md3k+qdr,Wǚeɡy`q6X<#l_Ӎ2S0u$jX+e"WN=qib mߩyX`κA4 OD4o_<A)6V0aL:T6 EusnfI1)y">l<1e /oh>-a1Bo pE谣hiw`RV"ic2${^GZ~w-nMxa,8;fg"T]of*7`jUWÛ@^3seO<Ҳ鼸_CYx¹q1֮!W[ 0SܜE |VarLLT{Ȩ E*:.RHD"}ƏY/A5ʩY |7oз`Lgq$-h+F7>/9Q%DSs$?mFY d%RR WJ0XWq/wduؕGO;{sEnq]M>W\hqMVrUGn.,W+ݡ6P\:7NVk['o|A+gblcu4X ɛzyJebma\65%gٔIc IۙvvH UJY)q|0Ż~:~9]D:` J,dz܌_?|?-{z`  Ny6΄A>$a^>L[ A- 溼orы0Qoٖҵ6QAtU;y38WjNTBm& s>_[fڪ%_ <밼]7ȢfǢ-O raSF!~؄Ԣͮt`f߹8ˋ7V1S#qsy\- T&"ɓg:ɰŌK!^9|s\EO$rpʤofLش"Q|PHQJr\v;X-*<4.F9j $:-wlDO ]X pu[l z2|k\궻Ot.0 D1c`*JK-fJ3/`D퉛}@1C<gyI_%apr ٱr8 AC ZWey'7o&+!8'7iJK^P[B1-(O2˶0pŗAll a )j>m4[O7<>.5kg7q+h}2MH ׮no_0Wk.xHcJNyh[I 0tcG$Q>> T:SNOdux&[(Vr/ s 9a8:O#`E|&$Ƹ&mԥny`g {$^H$b-*GTme'M>6 ^yߥbKi1۞5O פO <.;.)Lk2̻<~ٳ/yDw|!lcAV^`6&V#AɍO2eǘ\WfQhhi݁@F4Vy&&b)7狹"Kz:9F=4P@Cـ*qaFgx>OhCmvHb|S n1>,^2Ѻ& CTmce^۝AH@LjR@*:~Py$xb6<ƣD \ JdTq5Py_}/?$:ɮ}xQЁpH'?Y{ 7WE]_}̠D4+k5oc#HK1ܫKx {3@Fyw/V@.IW&Ud[,/֠񻺴-b콶h.ҮF|']?+M)T,]g#a伴ϥI rXLǧbI&!)%8k5idpE<]|:ܙHg˹Beq/TJ˯Ԡ7A"Z*9+tRYQ#qk.*~۞Г.:Lu +z?RJ!@4!ݗ7~*dm4r2eH4s7)0NM J`?Bf~7өB:Ect*S* \!?dWdS9yB7QG^qٷk[ oz.eN*vkob C1;]CЋhCag\ٵE ݶ9@}w]Vl!}E9,-R:]ZWЃ57Qa\v5.=}K7.PO})ӝ1Hv}><aLi 1]9$6N5Mv9"ćL:7"Lk* htF& w%qwRoڦk)𐬙GrF pعgL^&K"_ 26l߃ڵ{zOޘY{}Ϩ赩I}e{o{T2;GkxqSNXYXXXλs&.\ z/|[\o!#\]hm>sW7Ru%My  dQ-Tko"4r_^58Ft&G ʗd[3)*hIr̭#6y=x.B7pa Px!d 'ozTBh/W 2 =Ғ[h9'_Tq/SH tQerhIΑ<{,j *ƹQF,,㕙beGgv@dx@#F\JO~h?)H@L~Я0ZUDvpM\-i0jEqZA]tMgˬ;fxR#Y&:,lnE(Z l&]GfoWkf*:7f[vwjm>{W뙈Jww~'LU{V|X+T`:p_\ux K,N}SK&,P1AȊL6)N=H1fX )kϥHȀxP.gso;.[JET2$Q c$,ҋr Ӽ|̣΁+hR:ORpt'`)&{{>ɥ-mœ#`e}5)">?k% ,4zsw};D˗аh=y\`~W<ރ{ ܵJҿܥYxZ4x"Lh4Q\ڐD6=t#<8nm k+F)yGP}ŭ eߒiW^d# bB4y=U˅lX ҍk¯^wZa wgk7j\(01:;TL^oqxveI85jZ^}h-)=c ƱϟUhT".QACNj|4Y\~,,J>;ݺ܍Kh$ψ IțbKTd1eTusab!^ʺC?7m۞{pG^InWV^>Aޥw6mpWa£:R$R\ Dyƽu*c>P v{L$/@Qs=ȫܥr1׎oȱp0`N 2~MDjIL/.Z'Ξo~v ]C^:h:qG {u%@E,Rʊ4N,\Ф0 FCHo„ G^|eqs|; 2 )JGsY2Cܪ  ȳV4~tlOS|~!p#S#$OrM}ǹN l!I= Q"0@" B|Ij  ^WM\çnl"M/ uq⦅:<;s(R{rܼ{^[drvt7l eUެC3R Q`!,WV4 ,aN9{߫LmG 0| }&c1an?7@چG ki(0n/qSiOă:0\Z84||J+JE\g'{ ȚaBF÷g&C^vDi 1ii4֖gʩ]kZXvʝ' B>(dlfaXϽ\:[Mz,<2(3q!i}0 >qכxHntl2krd4(B\@.GcdL|iWtMaww$9.lh;rq;u,*_Z l7)Q01ꣃE*zp_w_}N6=o)Bt:6KlIб^CC'L"ݫs3l\YS0M.#זݲ Z-Yզ g_Vv&OȈDlš/@BY|_?ȦMKm!C,Mp-7u-\ܘbXfpubTOC RŊt gvgPbc*GL^wl1ɗV77j]h*flh -lDMbz(.oǐڞ!֒a0 pև%'fy8ѐh B|iuDJ2~Lg,LF$;\ҥQ8RQt"stT-yFgH! Xp_/TilO2> ;e79%Mx /n@cэ@$D ~OM7u8g;"'Ξ{L^H;=05˖#}hd5Ҵ,U=iK1oxdE(S<$<ד Zae/|Hzq9RlF߰/~y"@aٷ(!ՕMs;~}}`/VŹ9~B l[gZ,p{Vʹ|~@`&irJGzX@&.pQqԝo,[([|z"N䡋?D -IɓHδ 97 1ًOkzA,n}Q_ч&H'KE l;"-pjq)U؎CcoasRĺ|r&q$"h˵)|w#6mi8dI!ʖ̊cMJp=Ww"Ȝ KRmWiPO : ̤фjC&Ml?}gtlИ6a-J \6˸KZiFg혌ŵ4 QQձL?:eP977rƣ/p C.7A89^j ~Sﵿ[T\~X[x YDhZZ B 8u׫~[1WR[a!nF񼅪 [N!fIXq6aFE7:bX 9[;4tb؃`yq'e鞴-o77S-ܰX{l}zk zݽku[զ:5(A` qd%JWp4*E`>3)_/rMRcս T2+v$}'%`)C'IOL#]Tٿ\*sqL 𓃱INĦf0+o=6$EXmS+LHT5v-*mpK wȚT򉛽 qa =hQ@t_}sCFc m\\wh}}j`Xo\n;qoݨD\0R )v?}e2VMz߸)2aփrJH 88a5)/'PNiԭh34}uu#h RFcS x{ Y+\{ՎćDԐh!)Ź-*OޤOk L\|9k+^wOl@.7ilB~{_o|P5*TMt^6S*TPK@/2s$!g_ _8G qKCSZ"򋮗 aRt5< ͙ޒgί_>0Cqogx''s6'$ !'<6ػ81=g,RH&` /QNGkU'ݮj!7#9Af28u̕lt%t+u~em}.+@DƱc{+d7 &.<$~% U 8_2 Zd̳L?EKPOH:Fm %$ (,Iǽn{)J9W.} IpLMXeC%xH/הKlhT< i#\6n&=z3~RbBa5ݧ( <D}y>e7{FBpַV8pmU]lm~mIhcعotƿ5CXwmZɸT7!Aa-%jeA l梒C`:U'j4OC\u3el>_^~!JVXe71Zl0}c!o41z!Ф^P;'ڟ/Pekt" d?IOFt1iHrVAՅ Jj7ٿg+\2*cu..47Vk'w\Eao ;csi8\)WGC{ܖ2QKp2qFM3tezIpS}:I>Ifm/'aC{qɐܑ.^5f~"6ضz]fFb!b eTQd^淎ɃzTeawCd2,̻בCJ.76*xvkkYwfmPzscIe؅<+A ٫Ksgι2F!͌Q <)#uRY4Mu-~ϑ(tTK TP8/V|\}P>8 a/ݹhlh7Q(uFkTe70(ЋűF+Ku{<ϵݓ BKPm:묰d-zpR2rsP*.,tQKthӥNtΆ KDS|۾+kf+M"΢g WP)PNŦ@aCM8tRϔ:*, 0{ Wo P3O%| Jڿ{9ωh0"жFmѤ{> k!:`ȟsք#X5)sa vzGu _E-S()K]=sR.̯6VnL4qB͍֦o{ky=jbaǛ{ zrI$epL IR"No:I!%H%&.zL: ? u7)Jt %!dL)VP2 rh>A2/ L<~3(C #s*--Oʶv2TyB?wlŅ>[M:v%>ՏlLbnJ䃃"Dtssu雯~?;ڽ03_y 澁LZmȥ.hA. Mɶ9A|:zb5WU6ZH>cBբhFS ˺HֱS3jggb0v>|Rgҹ|Hk1z3=K k.r*I(1A/YxT*9BΥ&=HlAVf}9.[e9ԈR>!;p`qҴL71Tmg ^p?ݿfg*dzUlnoQQsÎ֡Voq}g ~i ox4#ݶǴBHP!h!ua$)#ZPڡ`IMZ]La xk\5k.[*hҡu wgk&NrCJgS6ߏS>=6p&TZ94\ D{9-k-O >ٴoK\'+go{d`^Ɗ#+If-<6GgŪ"[k< pz^1StdRXfBT重  -Lum!FNCc-ǮRQy=b_Ȼ4 ًl@X^{o_^0!y@dQw4{H0NF`Zp 6?Ȗد֚fnD5>sٜ+ww8gJ >vyb9d+i;i7s 4-` 4#ۗBvrV`r*_!=wozJ<;;,*FW) yf4u}! K"4c4`</-Up-ʥoP[j$c L’4Ω}Dh8AƤld)2ǚNǓ-2:*-$-䏢rtxHl 3{?SCRg}8T{yB+`w^klno4]67X7u̹y7]{vg czya.b0e:K[[K%6rn^ Cy>-wp+\ Ix[=Kϱ&s,J3Q@*0ۗPll *AgV!hl;u{^W~# e- 1nbts: 1EQpL8fL? INNŅKbn8A#\y2Y7ՅӿUbN*ԧBmD@f/D%hXzpCM#/൩'?xM~t9d"CȁqBC"#{~u |I2@@Íf3}d\747& lm<}?+aџUJR^`teDѴ$버-(I!iO竳l.σf '.3-`V[oB㔡ﲥH8kSo= :]<("F.]\g&%X^4y]~ݢؖ`FubK'%7moDgfkؙs-<ʵrBXθ!: )څKxLLh= +."*'"&(PT~ay{iB EtiZ.mìr>?2CrZXr!o>c|Ee$,xܳwҨ: ޢɃMfdq)4䜊f+ceqrӍ:[nց:r:qKWB"})|ZAi>SCd wWtt߽T%s$S)r)ߓÓ~r-g!ɻֳTT o|/M Ñ?Z/h3 nt8(}pÒGK9/>0InR@+J$]WWGCNe?P)i?WBzc‘'u>}륗t=-rk{k\\AM3  xK`Rj-A\ɥ'K\>l@cfBTʺ\HVfː{T6~h| `@o8ml94W]ȤfMГ'Be(-6L*om1x$*)%YN0ڠMcԍx @O#aJX7%YEy|yypBe :~ۯ^vrRtt d 4JIcT*l4]]+ˢL3y`L2̡3\80[.T~x2f!%RBJ0d#yrnǑ5# r&S=,WFHyKgG*,zqKhK <%Ͽ2KuܿBXn;ugf2a;۪bcheSSGo922w:EQ3CY!D2&l (eǬD H3j!SR-WK]j6bHՄTF:jlC~07 Y$n!3rr7;GNсW= #l{ݍKKBطz⺢%ՙ-)q3߾Qɸ[0{r\Cb7{]X&'gZA81h AH<>#L t??rˑi^LL*~fK.stiva =fvMA(̇T 2JBq2C9"sݥ=Fn9/F47\Qb2} m526%!\Os5Yte]v69>QqJ ˹x@NB"eTh$$^qKN%2=:zK,ʦNM9BLLR ĭ$zX; apG}4ǡUITL8j$,Ǧ1Ҿt}TFbWxlM.e_R0bƟW}H};v:U rX#5w|9_(A M66Ov=Ӂ4?}b3%KL<0JkT*չŹم9NUDs3ٙY|:,D8oo HeŒ͹ι>A9҂ȓx Bi3+4 ;\%R0/:cT ̉g#xRai0.kCJX6ە’X^0~>|DAAgo߾8$RCdXn#B1\Bbi5@SFc{G|Mİhi]ؾ2R3c8Ժ~4:_G >x4 aD?K#{uN 𸁇"omoݯonUܐqNj_{Ϲ{Ż|ϥ vnp™gϜ=ۅs]8{̹ ':{mN9{3'O>u퓧NuNnopwSN<}ĉcN-ٹJvS#X߭\?pX~]jhf;ȸoL7vۓ*V׿Qٲm暄. f*Q8mj۬.vo߿W\XrnkB^\Xuݿ~|?}ϻw=Ư˿wʯ~?˿_{ܛ~?ַ ?׿o}k~-׼?k_׾?ڟxO s?w-T]]Μ~{@V8O3J?z6̣٘a{A4匃#28B KK6Ie/ð5C`65;x-x٪6`mP-:uۿUvq߽{\Fp{ߛvwAoxw5ƨzp~k_|G<|#{{_r>+C\yʵ+]}Ǿc~uvn;iN= r/ylF)@Od:pwP^’] ; ;\Vz H[(7f{}f+R$G;{]Dw|G{?WxW_qo>~̓7tS( `j> A''TLUԧB`o|ͭc|4PR o@:Gh7R0u<We%u{%0\yU@5$_`\E6H\;S -b^^^[V ’@˭S.qonG;ﻼP)-l7n`|]T>qӅ_=71ACfH4N¡- @#ݦ%yήdp7qkayqyq̻501*#B)*|XM/sVʥJiɍcO9}۞wWo~Š=ȷGKһKțກy՘EU #VnoX}M'fg]^ۻ#:UwwߒE~IXzKu#R ] ;D 0K2T ˞a3$x,,ud\0n C f8}(h jo])r3'69vٻY3>{ً^K>G.*aOxW[HAAG Q͛ S+g!#'!?{'g]{=JIɦ'Tz=(*GADEzH!ewN ~>o{gs= l}>UV`)<퐛K5..)xlJ6w05,cr R4 :*0Mxh`y.J// X-v6[]1Z-0ЯJ%+X_33Ty%²)׫TQ-a=Nu1&Kpcؤ |UK,c5kl#G. BrtTx,k $KvP:^ByM P$\hʣu4ٖ9IPS2R=l@/=G*Dڬl ,˚FDah0gPW^z~7I,硤AweD]=g`0\lW\uG6*.5_s UB5kB,Tj*\K>q([ѡ;۳ql1jnBεk4YMY/m[6)XaV%cfo\"X)`KD1&vב#RYC,GmyUj-ZdW[#ʐD C*A*,w^;/U鼇:uNI r żӘz{5DChkĂ9mI{jICbd2 8ܗ5Aimi.P|f6dl22W< >}o5Q8墺ŧwPNQ?XUDw~۟?a T[뛃`4 XƷË< TɭF*fJ_Ų eI*ZE''v uqt@]CHyfHta78]A;B΃RiSed g}uvJp޷Uq43),Wj1Z1Y-7 bg=2Mݤ8r|W%^jڡ@t(놃DE,0:Gv>֐"hR? ڜ_Z*yO*Rmpi@ݷDB`iby(*9DL gr=䟰XAzdm5@ =R :[QWeTN۪XWi8ďWYѾmul obPH@al5aPq2L]JA ~Z{!151J1r;`xHv\ql援xK&QNµH PeX]ROl[~9N6=s뇳IH}u&Ո\m.J"#,y`P@(ZD^Xs1ː Ѱ 7)zlT=#Xb;%E4aqBh)Vعb1 T,<,g{7<{~ȑROG.j)5z$gK*TUy*^/ b̪_ D0 \ƀ&q]"Yُ| -DڔSm3ӒD %-qVSѨ}^ L>qSOu\FKTPA72c;7+[^?п+J]u3GM=P5cPm\k%(ʅb-y-CY>(!Fb,/$5c êi2aj8ضOېĕ5 JIƷ%{GPt@Y@'IY%*Cxk$jq2lt)dyT/Dh 6m޸@S.`_S̼FfޟIh9%̽֫T(Ñp8з4g\'l`k\<3ľ!ÆzX:b6\(e"-ҊYN:: `Y$A0 '!_lLÖ)~I.youP(RK-[rVz֦dN|XB0k#0g^X~ӂ@8 |Ʀv$ !*zF9I$P-[$$rCђ|e XMב&> XRqZc;`jt UF[IDˉnv)KSQCպ8"vjON(`ð,$Cj? e Gq@i#f]\+]2kh>,W EXK5c^isKj .Ɋ@ Bu9-۹}'_N*ҏ&>[CI>,.›,YK "Xk^Ixɇ%i8}(]c4f—i3,M$ 88MsyՇQR=(\D"aJj@eiT&`{^)Uw︡МC=o4L6OxF8[wBnYSdI-N?jq %=皁N}9,{9>uU/'VyCҘ_OL(U~X.~qIH#F gF:IX_a1kbAm)0\14}Xǟ/c┠#b̓!KeѤ?\Vuv4\ʉݻ;Cs9ߕ|R)v]8{& )L桞M>ؚD=Ί,G̥,1I`mRun4dÐNaIڛK3,I6+Kvd#R6вJߌ)jLprh&,z]F՚Ofn(GŸ}t\ۑC`Zddlc%-U%^`T.!,N&.LPHh .AEv$jB6y ]V-=~3r.-KhPq,FHIkH`c!-{_ѡϿdJ~kfޣ[0Hr< v@E6hi-]( |陶+u !gd50ŅG+emxA}!^P&Ad>l׷F:s}wNXJ&̢FFrˆVQ [ D¡p3/W&63^T :, *7hod- 95,bB(tͱos)ϋ*n65G!<ڴmRTtC 3jdUtsQodtl2CL|y}@(S/ S3jsAr$J:k3Rm X7uuq>B'rTS?Z㰥M-s2\,QPX %d6<|8hn;# k n>5a1/&-٬v(!X)T7BX1H*z`0888t[(!%*ga+I˳9?BAPr4t %r1ZC!uٝ@ C#T>@vB "q $JEN Y4%6QyVhd6*w*'^ǩ*Ԟ/PtmʿaiXRae0,h3*8H;S- cLrcje ;ݚKf?2X,/$0q捦L͎nCҁvZATi&< D*cU+>g~9-$`jM Vk\aƧ~) LpZ:6mbQh(x4 ^"jA&&c^I}RX<1;ZtsSCQ\G8A* ޳}b#,n|0sLLO׌SWP9&,etCZ9RErK^4S5[_ `˛P 0,-J#upD2& !,mj3zLt&ᾼiBmKRT>6'hHڮwh I }^Il~uU xfxY&֐6QVZh!! gR<c07d)4kXRk5+xHT:;2Ѳw)*(& "l BZ"Y.*~緮E+7Zd- Gc.S}n z,_.oǯ]Z5r&.; 2}nIu/Y&#=%%l6i } DWJg :-J2ʾz˃h,|q̬YXiU:CƟ{*8h,_ ALjaߙɍtQVy /Dt:'+?S/:|X*k7vA= b%s@x vF^l.r_0. œCt[ȈIFXcoL'MrUd hܢ7`2 +?RP/,X+"rYx@$%/zq̡uqpi#2H6T=h3>SOOfa 6Q_-{=[*K8? W7P$ dsaΌKu|-V" bdPXAE_SSA (Kkmb٬~vmKY~(nHP [.XswST<i8؈@<"].&>=g;]r%pt -ql@b\b(Dz.wO?j@6 )Z[{w&<K6ťh鋡㌧@,.ѹ"h T.S񉉉 ;BҠm@Vk J'LXn"x$f0$Τ~%376 ilYSM<69FIbgVр3r6]s$z>=M<>'v]ʹ;;OjC,[.KR6]Gߵ\n蝓'$˨QUmao^c@p6W%1Cqe\6#TkA/ L}WT$7?*mbbW~GDE$`.ʌ$) n< ߉3BtũH! #Q,e_Ӹ.[:.R5:1$ZAQ领nz>,I%Z/򈰄qFoeXy&JMj<|L 5`YۖqX^X_? VJB~-iVEMh+aR|~lCLq:JKWl㨓4C `㹶՘+3RW~%xqRYDI6Y)H:v)uLqkIB3-_ k|Q Z Q[(xC6 K8MRWKd$!`$s#h *Ļea2qLh=u?P?l&=TtďBTSoZ/pIѓ9jrKs  nݰrɦ$a%B,pcs2@:qS.* {;ސL̴m-, l{[D[dDel59^Cr}HōP7\ndbCo|z]b&0ͤ7=j}z}?Ym Un85ܫJ#޾Me br-q a0cYmQ=.lX a"%6w,mn[:W[j`=]%!D |L*ތAXyZNj'FKԛ {<)tA75AE3jih4T.NfD-rSUQ "Sh|E  6o"\'X]sY3C=NT,H6o~.U0 aDW}OzxEŃĴNF% 653vznF DXC 9 fpzyb ,E-UfͤcjrmL $!2(ճ޺0УP1P@}KȂ k ,mYSCҷkҲU# rH\oș4 ~ΑK 5ʃp>u,5}H(q7R.KYKPЍ'g\Te7"l97r_Y4"5i&N",M?}W >ۤgcr8G*òLE8.-7" k,<8 4ep@ג->`bS[QqE4H?i w4Wr{^,mRMwу6f-}`W\⅂u9ߟfrKr\*qr$KXH/qS\S㈌>}K_$3c# SS`;=? 2ض7QyrD0%.^Tyh4 n\M\,#)AJ fu1m$5c)S kse-r4K\RZYx5dKdG=T \ۡo|JMkPkg!,yQ%ԺYe8{[bI;4AGcw'qPx6C%6,-HTu(xYHL O6 -mJj_Q̩%Γ* /6ɰDFTyEoh\~P6h~hC}EΫe˶$%4.QIHGnhfg`;B߼|RUz[ ľHmQ-P\t 5% $|Un5rL5b( *זylQϏH'$t>xZ#%ˮ>'ʃKꌡc,Ju}WW]ޣg)TT$dp\[h# N$e,^6mMٸ=XID-!D"=q+ K펹thZ҅yAy(%Ȳ.*t E?d: z{#7';1*e("\8vm#Z:'D1dL"ۏq R(eƪ}H3u(bXv?#&Ԏ{HBI Y%qR3:zzw +J Ucme`)b:4H].qgrrAw(CyXƄҲy#)%Js`PC-R>:Lp?^O6)\WJ|@w@Fu7!IոW| V ]ˡR C6sifA2W9mq%8ctɭ%܁iz _xUÔ,lf4F~j+`ÐD`dk@oS:L-%#B8q]+ayq;Bt }GYe$C\St_6Gz'-Y,Lx ,iڒ6BXOUK*R߬pd" Zυ'#[6-דWq4W#ti.5tkA*&fјȥ3 <rB+i  l&it!9QVwN.eb2JD:̤ҚZBakr|\; t*OR TrR}$QS$2؞=#cgٻwllT=cl|ltdD<>@f\Cl_+UW]y_v~዗^zy~._30ˮo]뮿7ro?[n[nM}ms]{y=wu>SOSO=/gyⱧyy^|^zg^yu˯ᙗ_}Wʦͯo+o_{77nܼ76oݺu-oܹm۽wX"M3fg:+bP 6 GCP_AI7o;kvkk{[o_  ,F _84-]pe-hɼyKYvܢ˗,>eNۗwLBl21006?fv£m]mm]m]zz;ޮ>~7|ut::;@K}ޮٳ7nkSߵXmZwvtwttvԫw7FX`p^oűȂs~ۣ-4vӂv+t)ԧZ:ֶ6x*;[f)x*lvvvt*v2[[zԓ՗hmmQ_p١ӡ{kBd٭]mmm0{ٳ=٭mm-ٳQ5znOz /=poڦzwUYx;*Rz0UT{U1GgHk{WY[\:::Zfuvt*< j[H:; bUTRUeµBٝMf3k6MEVٳ :x鱭cF[Uӥ~Yۏ=r CΏPۡ^töDzr[s~蝎ހU(09kvwBL{OnENuC@ީ~}pnڢYTkSȁ(u$9,uG8O}YVxQ>Js6}ߩPv*TZ66cv[{Kg^ i;vL{wJ0hŧ\@6rNx(X?Mƛ7!z: .rH!T09~huIEcË-X<-7SZp%̛`ys;oYsbΙ7<7 Q9'Ɔz(F#p4ṱp(K #P42gX}(<̜sk·T#C W{MT'd'rq˖.%[t`?}GFp/_~)'p%˗-^d-\XxEKw/YtcٲK[h/ZDav1mkתN]sڕk8i'W=u[u':5r'9מtʩ'b+WrªǯZbSO\ĕkV\N[y眹VYsqVb2;sojǞx~ozw}}Ϯ=urcۮeMںm-lݼy-=S>櫯^x^zyO}7|{տW=нw};?=o޻'?魷q-}ws}wv{?㮟wvݿPޟu睷{߻o;~@<y?m˯a/3=tH[?M%d 8A:pyrЂ'&&3cLR919:ID||X6>9112K㣓HjrȾ=ݻwd׾kĞ=x|];oێwݽk{MgMN~0c?N={-;wn>6yTS1p;{ o7 5xרe2!؆iYiLNxD6Y*>OF:,ϲY]}R&d|ld"@X<\|:00'Db|2J/N(~t6BR:Molxcywڸ񍗟qUO{{_W}2nQ(LhMShD<(4$Z:kIRG1Lp:glRi z^*H*|<9O$q4$Ё\sf @ф CBcx3t8 v775sqUZAɌpp3l.CBYA &P+Tw*wTUT3PMeړ)%AoR-R_IMl~g ֆ?tM잾ydr=WЙX7,#3*,Cˡ +#t:a`¬T̪ѵDB>0jZ`g   Ogj9dh{ 03<\ή}`omٶ;օ;I@ LFe^dQ`lyl* TCRUԆfVγq2 :()s.ÝJkx,}3p<>=}ѾldWBڂ?A)%$^IjBM+0@sJ'9s4)T[=9Ul&6&0=;6矻u}o=1MGu1S8eOEe!$m_@9ktSo`j6&bBc9s!%μY9$f=/qN{ EGDlT3°nuP/j|dmtC=TzE6ccy-b u2P}HQ*nC˦oiËw }=dA P`l[ yKIXHX77{) h 頊ưdj,Oh  f_tHXyx ^YpױC`L#]B亠'r6&TPE^C}@ZKk R:, TdI=մT3Vg+?==Ez{졷(TECV;ZiX] ,1d'(&@,LY"}XEshHeUlC`_#xC% qmr짻R YS`7 0sps)YB0f zZ&m2sŚP 8_^:SE\0)GBKrN:\'\P} ?d.abnԭK\ZE:wSYrFCz,d;"@o_00ɌnRsL]]4w /ML튕8^80O*-%J\j@'.%B ';` 5߻l@ 8c&% *v8FkWXuNQ,&42AjW!*YN$fok찂9] PhgͰDCۆSvr+$"i6NFS01EPfSn Hx764 0K4*`ȸdWZA%vtW`3O`fd2|a6{@%L>: hL:ބN ҍT+TC y~ WZjrE!,bM1B_YFQZ~YTͺW6q4@tXf#?[|{ا5iث-HZs.ɥQ';"벶9Wx_ǵOD6f>}Kb` 픏1БkpķRArk}1|gMn-Ӓx1ף$wK&Ѕ#/h\1IIf`i4UhNAK61yaQg53Uk1[fXjx9p$qZޥnҐ0Ki۽ثTIMog|L-AFٺf|*8%P8;+ 7K<2b}sX`H|)L)ktc'Ak"5!Bp%L˫:+ 71 9TVXv*^OSuVZNUuhAd\V7VE 2ͼH(n[ɷ<T2Pvy)*2#%ZIBXGAcYLPV|S?;Q#[Sziz|A<פ9P~IH{%bѯT#i9}V%fRvp_ʥܑwUYix?gG^QFEдK ` )8g:+"cʳ0V~UX޾9_>0α>\5 F:a?l:_îrh<E~O":{ba?t]9KRk$NyS{CsrG.D$iSFl-; #WNDn`J:dsMlJ,@SwHV䁖֐e,,4~2_ cꛫi@\҇7Mh_^YRCktF"2Y_# è1LeZiY_eR``ya<:;ȬL>LJI͠eG#ZJ2LĸLci vexye4|PTՈy?;(/R@Qr:/Kv(R:6?&Ork)(fikydU.3 ۀt wA)!몰ΐ#] ż1,2d"8z5[wsW#$C7|47lX5Xߡ%*<-c4 DU5wS\VeMS5t0$ȱ]OMvnJç:711b=ta[{$Ixo BG=5҃ݲk]mՎS1-C[1m+Vr"`1#ݷ;6+ 1έ#RQh ޠo 5$ma 턓E7us@7:c)Ep]묙lcИ+YU; Mm$V|ǕR~G$9V_]OǙm8qm2+u`/<8h.5Piɗ%"MӔR`lqQăQrI$[[jjʼɌχ'&kg h\\8ӌUUZriX,L_i43RqeA=-i@BA|Y<7VnH- oy]cz[2E:!yvdz.Mf5˃x"f]rsLb:\L еe1"(WbI v.;Q˾npErvMKluBCP qn9PR hwYncgRKd3rD4IB?%ʃx;RX4e DRBy!-x`qO7OKm3 ~О9퍒Ep]w'^jWe S|/[v7R\ >Xw+dǥ}eY@m+x3W)DK(Ք~v~Uum;=*4ئRۺsM[%}4p4~84|JǗ%7fwLGFUpǐym:i:K谗(F7V}l㭍cqiE.׵k\=NZLtbC0V^s7p-3V;U;ùHŖLO͆xW֯4"qY;5lxfCz"7^Yi?2M)G$XG%̷yesp}$^m] M# + 7IE^GZ6~>!}X+-&-x71Me~?\>/738 <3Sv _y]=`έz~BK [x]sT}_cO$N 0@3q1'. q|`cNqN=;v4&!,н q)>#V}j>뮳C(ZF EB() Yyi/Duˍ0߁ @Jq\+/-> 2" C䖗k_Z4JR"%CBex"xRPZ^Z4* U-яDMKAHPA jHd%K%k 0-/-za$@0j@FB,/-xP i uDK3ˍxK' ^*c[GN!F@%%87@Kp /PQ?Œz;wGt@dRiڗW*D lgI$ c!-,T-)NH E h\X^Z\99);Ix[AI@ˋ%y|rAʜ >m YWD4j5.{ 7q+A~ ҍH=U$GbH8ŕ@HP*>(B!Kx8KA(9iGRP|]iIyFhkB kE%'ţ`R,S·5Hr~\BI ãtȷD~X-dxTVT((Z[WԴ&mA%'{!'w$gD|e@AHRF p#`l?'o|Q ލ3aFxE: )@V_(dOG. \%}d@ȧ!CKih)2
-:P$!ul%Wn B^P3ӰEҒ%CGZz6iqPq]z$&\=q#Qm]u\^qn\n8らHb<8D1bGOdTKyj;`f5|in&_(rT(U\ǩ:>ˎ[8t;J:$ ?p^.! BoW133s~0wB._BX,˕|nP*Y| jGp\n)KEtn.+fggf/6KY\̞rrR+?y$ZX,UrYϕ3bn)- q(sy`&y𳐻03eqU{y?=G;zOz><ս#޿ʞW{>ȣ}=swzC/~o_o7|;GÛoYUdGge+/_ўJwtv,lk_kmUVvvZzM.ݵwÚ׭gÆ }}n=kӻ͛W6Y\hoK$⩶֖xx2knM%D5ikKD}ٚDGG["o'T:d2@t,O&t*Lg獍zW%20솦XkZZ 4TxHD+aZL:HmmɶT6ǚ/hqbO_6]CkkssKSSr 747WGͭx%7m ZbtnwûdKoWUWlOg@T["G$Ad* 23 3x,$ZI-XK5ݖcLcŗ^q"?o ᖞ7[{uׯ_wk׮[ ^szx^'kwWWxX{M]+Zr[zzEkVZ }s-? ز\[ شo˖}l=[o{7oҷq#:iӖ}6oǟ}譱 9KO܅~w|`n}w?];w|q/sݟ w}=_wwyw}۷m?ou\k۶o;o۾۷m Np^17}wO{x^~y套r׏ڋ_.担 3sNeϞ_gss&F#ScgΌgDzccgO;,L:J})᳅`YT-p̠@^ B3W.8r] -i o$ Hc)u/E햗 @z }–ʘQfdvhPbHNJ㲳x_'o}2 -%uC~/AaKb)yy(SG STZ/uNY$K \T=e#ن HK(/TKڧGn!(` t:zDt~)ށNO[T!8={-hiH!j%Lm3xE/!63)Hqnz/ {Q>bz8NO2}iL *H̬jS N'^VaH>ohjZO$io.wvBz* wPz{,y M<1,:(]ՑEќԮPV=n6CnL;$xOJP%vGTtY N^zb\Xt 4z bZFuZ%4i~H' $^6Xȗ Ghxq9¬ G|a-bY;k%KjVpH8#> *&vOGPP:%Edfbd`iɊP3bVG\bryub$ \ G$!!l{c'ޟ̹9hRLK2BXtFyޑOqv%PI!M{'^/Yܳ [e(94+L:ji69卑ɟ'#DJ?o|FU>1yO\)~ȥ[ H'ɞtiGj?ZWI]۫aT ]Demh)M~ؠ:E)$ngZ^9N/I|m`Ų]*iv•ZYagp4eDGX"OIKZ9ey$Y~R~(T/S muEǗ>|eV~t옐b$NZfrܸӌ@:{;{ڗؓn!;%L*,?(V3MCM;\j&+eLHaŁ a%kqfǝHjO>>N':a镢FI--JQ#-ihI6O<7I\+1ⓝ+AoU0%+/N<=\O{*K-W^U(d2.΋/F.RSFSZ M~+aKBB%ur%vR8U[pԩѩz3xcbij !PehhREi3Y8!$!bZ-DK鸾o&^חKN93>y`C:L=EHFd]& (ENꭏ10Ʌ:*/4 }BR z?Iur\G9GE.lr`GC/$Db_kk&HIQjP&ECM7.d4#7G 3<\)"]YI* z|I`hhxht||ͩL,Qw.G:((MZdԆ6:#² kX`"m=;t/fL✭Wn4NHW_Ȏ o̴Q^:24:66rxvFF^87CEvWZ\{eQu!PR<Nݗ<m?5s&'F'ϝ;)L3{~b(AIDeJ)&D3Lɛ{&J pV#?cAܯOحGi||Lksg'&&F'e_MSmsU ӹhh J9ђ"a#=Ҥpd8H#9ԉ4XZaa)4 cm.B1dzLNMOeg'_ЉCW=K_%tqT[yȝf4ފsƙ1Ipl8C Ե\nhIpSٻP*Y^^NNMNNNM<{K ?zDSnۅY6 MX: zMH Ð>٩`0/Fhirx[Z\L3-'nJ$xIеT R~p*=b\yM\"f&F9ASRu0#"7 S٩)oIRDGyꀥxy}x΋4! w4Z7A]fFVʆ2%qup SZCv\ -RޛYvU?LcrϬ}*ɒ%ylY644n,ƀ/hlb*m,*3v}%U^V߽Y2lUD'ĉ#ocr3gl-0h9H-Ml#UaDU+D~TjYZtx{jźף;sran-_WEhR č"p8,?eF?6ʡB9`J: +F!CIX;Ҕ ]C/9]9*F;/eo-(8rOl{]X=-ԑiWD6 d_gM%Z]ͱp9&e ~*Sc*;.a9֭P9ޣ^0@(hnmll $&x[XZ\/p3y!VД 0'cswNku_džKf*IG`:HDF"kssK ?;ܦUJxEq3"vˑN#>ִN.;1֨ GJeT< ZVVFqЙ}ssGF?q˘T`9VocuX-ai|Sɑ{Gj鏒͑+!?Kѡ/t@e:|a;nv旎'.BYQ /%D]^Xa9T8O9r\W bhmKEީ|"j]DIU՛a7q C7~7j#AݢԔNHDrD 9`O՟P7Ydf[m"˻{m$;qCēQ(|Om"T橎VcPHc>cQ#sۏmk!p`!΃<~>.Ttcvy_[o؉QXg Y{Qe隅+V{{t|OK4*!hGA+t ke>ޥ3hg۷SE^L,!#q,&Th>u:M1rTFN,XK~C*x(OT9̅I7<~w<4j %;񠶄8A[>PN<0JTey9XyU:JEbԄ@hڽ[(J]nC2#KTe^%w^!uqy7< 4M;e1Fm28l5VO{⋿py XEiď}oL`8!@G4b#1t"t}ˁ=C Y09--v-F}xw9@F0J:.c}* 5f[;X{껞M*)\~1c%pg.7T6Q9NJgZ&Py?QYoch .Xnzr $g/s/tLu[(+`V,s"# e"N{7u3+f6W=-KzD86yeJNLm2FA {7?vw~nnM+˼KNǬ"ڏ_莆񤈷%Fa&4F(UAY|eV*ro^{5%;/liB"8pIX'N,C􌢯呕w_92%ɼ,\N8 03S%UrvL|dvBW)j׉.K3;$!.fjΥhQmf_(`ca'9r{{iw8\G?zH|:)q)3SʥCQ)PgG ,U ,El;43b;|4r (!C)*EZAg;7wg/ CѪߣņuԛer)EGˆ(́4Fڏ@dWcZ_tqyӀIA@)%pqgk:?a3Y#y&<(1cS.aG9Rk|]+r#}dm[5rQV2$?~sELWx'{nkJx[eۑ<.'qol5뭧qGx,ŋ߈˴ QD!k5"-W2$s@ͩ”2/+e6Q+E%!̼~`lGv kakV-75}<8﹣hlm\v B $ (0lnm6sGS6{tLyʓ-u>h)RirSќ2:UfY)M}(:Ù\Qe ՟"xK LES67TyE{~S֖;'tVKҡX2 64%,-}ӻB*2KhhIn"&L )c-JKujc2:Tk 1,YUnRbRޅFy3te^՛.;oAM5ŲD ,4މ/61z\:_.)! U.?&pfeǢP%ZiS>`\OkꉷT?T!fE%8rS?<9|+[[W6kK8*L8Q0n;ݮ{eԼL[?r%/9<˗i9t!~cs#•\Ѳlk]Y9ih)lpcl$(R3U+os8 T)ur'HKC\>OQo̥|~-c#ź_tGz=_|j0<!2SHN "PJaY{ R,vmYkT`iqKWˆCmJl=ZSo^l`1,QO_;.d[.Z/qj{ ZOP(@<?fߊ<ԿH܌?VeexXAnEK=}*R ̬uh ZYߪ71/t\,N&,"F~/;2KcCSu:f+D`4*SX_=TKX AX涯aH{U>T4<}gF0O()R̙NgS+"l'wC=_2\M -|۲J9FY*:$E's4/oIqlq"g+K{qب7dsplĥt'&iDOvu3_gn~nrw=gdi3 :*,f$߀43ѳ>s X4>X"+KiPmn}-Ǿ%w?NvBW l,L?!@)SZ™5T2dɨ+(V` #}W""IS; B'z{(lƄ[dzըտS';?wį\k;ey%:CLeçH%jԁvE.E^_!% 2z̨8$-PrߟDCqQY-Қ4غp;2@Iǔ8ϗr잗{+wM?^+%#%tZ-PɇTdZdӛe:6 ~UoPdq?̞|^ddBlT!Ɏ 6:t\ #û1DI9~?|%Em9u!ҽZ[Vq)L@G({WWYrMWK'Uyez^+I}gSðk,JBj,=}6jHۨ,6&2K8sWF5,{Pc٪m66?osʩ_  :w|W(g-|ZLxn 2;+|{&S$OJNX,e^DZ7LX.h4j( ӝ:6^]:,C{K=c[gK]Z]9_NK3kR|(Q\ε٬An\E.rQ/߿|MZoB\(Sަsmǧr)=}llշԍ.Ew].D{$52.t%r!sfWo90wܱmF-Ц\sk\(^*th3 3%a6xx6ԱWTYܥ~6vkxx1ZX&qw.q=VD.;;;[GN,- Enrc/6 -ՂiܣsOyi>U$Nz {z2[BHbfyՠwL]>wڼ a3xAa;0Ueݧ}Koc S'Vs6Z8^zI\>zf]%hjY_ rœM _esD 'C\~gB.&FUIm;=p$pMځ xY;KWl]~Z]?rd{.= ݚR@*7άmm6kSZM}hi#H#;44} tfQ^Qo r4>|kW>TZӷj{;N>7[d >:`E2[hR˄474#s'w!a,3C6Hf^61R65ҢhQzVrb칰,gj2eaSb^onD{E?^ۓ>}7NjxpPBF 5p n]}/Xt{{&JZ$Di#{.pI^2?R4!k9ݶq5+dSR6W\r$/lxe bdp!.S,a (WwhFqtؽ g=/y q~'Inq?87{#.LY KJQxLD@ho31zeRbNIs]QdOfڌa}z yץ^"E{pqtQsF ށ1x=5v'`ܸr9ڏ^[[9K_;KpT f0q6u },XZvYR0ĢZ}A\~Dkv0%aOa:_n] KU;$"smKH5qܑ's.5TbQ* 2T-'?@&E$Mꜞz.Z湼dDrI Qʮ;agꂐAa#*̔,#wS#U[{|è#-#q2lyhǡmN%qn$ r.C6.$ 7/־CK+Kg_5-k"4r^N&Qt ,O\qe=n.&IZ+ȒN3cQ+l_a, BZD|L{Bhv4i yGI.hwí[yONh֓?9p7*WH+߅&1y d.=<u{ T3!Yk'EY%,~4lanYxߥ0q8:"k3n/[/hK|鉥/pDU]I92dRv+Bo+`>UQO&4OXݷKͤ8:&w@] G0>̅.Є݋;\nTEw՝İjtFҷ-..pȃ<ÓHSg~keZ؆YPSeBm\~r$ I&BSL>ZM^~.r)GM':?_S=! q.,.-.6el2h.pgMzUR&7g~?2Dk<Q1ȉcZ²TIN}R><2&X\-bWtԚ@Vy1h0"%AyEv_F8`7n69lZ&㰱g޼|׮^wVYy %sOp虸csQ"3Qu}taD2'EeR:L|Og3&>SO%]qk2Bd*TL8AK{b/1{} t$A:fئ{=n;ha 266ZW.@B;L@U2KAEV)cS3Ȃ(3 T>̨֭'6DL#& d.Gć?AjvT%H2 W`{ZR饃t"8aWlnm^<I/@&VQ))}aV²qL 0μ,Deai? :w%6>b%|K1NO`Qɶ%C֕qo; WWWWO~2+wjs :äRClkie+pFF6W}!\ J@yZt_!)o,KMFK{慵`br{gTS M| <t 5{+?幥c=ѭL\Iۍ$VĊN>es Rɨ}?Kk43lw`T> ~h.qy {W?[WEl.vW]J=}t/N;iRg:rE xPwIKkg~'Tٳ;6*^(y̷TE8?NXV}mYJJ[}6$q}Ԕiɔv&άlE^Ƈ?XvĻ˄p*]\3_uocd$\LEKFmOڹR*,+ynL*,ԘH:GG8uȷ45H(g\P}`~*Oͷ@ڗB`GI~![6-y?٨5C$ڥX-t\8{;Wy#.Mꤷ%6P/.qf\:\[P&_J .sD SVuai=x}@lmߺ_[ TcINzxD=oL (,Iw0!-!]4uIK2Nr&`v%r:>uX]ZrIGz&˘d*Lr zhBj5) pړRw6S_/2QIFר>'YǠ,1,gf#@Sݼ(6X ! !,-(H]DcI$-0¨Fʧ`rt7;4/7*,7U5{2 O53 (O*DEډC K Ҩw3:Klz˿S^G]+ݮ&qwKӯʓp&۽fʧ߸MeqV}ht^2 uVj}iq'Oĵ?: ZjW_'t%*>|#Oy8kLhM2Z"vd96m 3{;Y7$v쁏Ōv橂JӷXm`]qrLK㧬:oIE#rͅʩw3.m# \KfpaPhϔ+L52av+Ğ˿P8NaG ܾzud1!er3 CG2jԖeó^kc'ߴvNF~իX H`GCQe4k2Zbƥ^x`cQGUXe:g/տ* D4~`?={<]s՝;=4%uoM$.R8 L?im.e׎_XCυTHs'ryWxS̿ÖN!l8:gTSTl Q>V[ n!rΓo`?s;?A 5tgۑ۽-QRDW P,0gCcLJŻ4F}>҇9J=!9 0ۙZ|$d $P4CMt'[qYܷW?Ӯ''htR7wћDq)D\t=A%pفȒ]РC:QqF_Ǝч71pis/5Ն Kv 5.RLfZΘ^95@ 8mSRT/!) .5;ޣS|m.2Hxwyp_!Hqkh7# ]M1mhrwCZ]IYklmԞ./-.-`":1Km\@R:Qd^h\3Dey3y%ɤ+ga)Lƒ34PdG!pNԻh ٹ颥CC$FK4Ir$¯= Kno}p4FpO,/]]]{I&yvSYX^'=[Bӳh뚋je޿pR*ZJP5쀭kaalQhELH.i\um<};ne͔MDRzrwl:blF]xdfVk^_\X^[=mp$nuj\G" H“IrY&,q 74݅ 39-$o/ސ-y ;00 Pʗt>> //,{'[8=R[dkd^ ZU9,!FJŧUX;Pmcȅ\axvGQ2rO`vf6h-Adl+L)?ͭʢ+T+=P j߯lO .ȲãLL5ʜmpY ˙WhuJ.+x1~{O“1 z\u%H@5Z&=Zh ,Y!M0'q"KdP*!7,_]y'kgۛR0Ta[+6XW>)Z(qqԮ,@8}m(E*LxWh9rя4ޠۗJS3 +t2<>(_H}W#b ~˚1 ;l8IB0j>C%;ak{dGWkv@LdhJ|iMX o1etR/#V~$T*/pX :xS/Eo{:q._z5Ж~o6܇[E((qo@+3ለ*v+}걵i'a{b(r/!ߌOˈ45{>#22^ۗY4XB>E!K3/SbLb}ow7%c:?|!.kV3],1) Ԧ?6$hڍ5E#"luNv ‹}󿿧.3[y3I Ǚ$ zIid(V"KBWɁRS*!ES)㛙Zp]6K$bܟ[j ~cmpC\UX8һv:L҆ܧnguAq usec]؛ 6Mϔl_P`XA3xElĥ@#]K3j6,Jy>x,f^j4 7]==?A܋\ q[%n{Wop0qtWdJ%9|_+Q^L OkVVO<7}zݤQXjw2zP|PD"̵($HkX+dWj]>+2$( ]|Dq'!\/[ws{0^|\Q͠դ%h%g]vU87a@ !`|'!qϷ{аٺM:v.c+kG׎>#2)t _t%G8>Mmvml͝ )7gF@~XqGVyQL g>ڔ>mt7|'{+Diqߚˌy 7_yt@ZՂj(y6$# 9Puߥb9RmVEr57N;6Fcks_x/]e+Qir4W%*NSWLҕHuge%_!,FpE yPgT=u|6(} iItSY0Sk¹a2w|>|jz(h!5,EW%F՘{u_nGӌBi; W1~牕ե'_g+t(HYu1EW"=Ϫ,i(TX^TrQ_xR3f-l}غtw5dQG_~o q2xNWpaq`!&qFKlhIh8sNR\ČJN?67?Օc'^ɡuHGw- ln~ %-G;:ߜiFU6*k*SMgU '}atIXOը/z۾pP P X('4P3C6<}i@"ZvmغM8aXW.]Wѻݗi5[Kj˕k/Ԗ! x) '_-=JT[*K=yM]Ywdr¤j>kocro3z.;X쀩MWQ:̛mfRhG7}ΜT- vm$&eJؔ1Ss}roEٿ8&W%{r{I1x^,tZMpvˡlC7mgn%x)4kejhLeY~/ JЬmm6܉Wd8t3zW+(G0i8/?4C)2IW q 5 X-+TԴkGMG;Μ}- ``>0.?A [Ha.smg[L­]j@3%fh}L VVj^kV>;py!Z ˢk{vm, vy̻h棥zVoEQ=҅YqoW~Ḳ PX~`K^d=Q;f#,/ I̯m;UٖLj2czī,R&…8t_nksc|xaaayi龏^Af舆m*B]ʕ&J;3 @2zƢMN<幦aՋEyWl&jW$%-ݡ8KmC0?/15d"b 1jpDV|<7IH=i'N4J͍+WjW:P-~ş„@:`gڣ5Lj֌FX,Iitmk^4R_8*I+hj[jl%R$~_hpï3{gcc`0Tx \o5I{"qW/w'CPd2_^'+/ Xv8k\qjCI²#3z 1<D&T Ij5l-c?=TMق`G,ne!wZJ%+ev Kk.~*,§s~M;"-<+QY>rSʦEûS֭(2  gϽ쭟*4 hql4.TFa3Q:&moSKTxzE{0bm m4%PKNK. Mx8O~ec[6ptHO%t,.^e+ͧ,|jRͪb ,rX˙B|zoR~Տ&7iW,fSΊۮb+̊6\J+G-{y`i6Hv*|wt:n_ > gy-1 F|G4o\u(ebܻz5`A-.N-MY-R'rqI爐'< D.2j9X_;~ԫ>킃%U(A?8a9-WOPQ|X~V$*aYTJoǤKJom;55Vl=Ϟ=wC?GW{˅dQ/A8 hFDJ"oa.2TB tioo:=h(5lFz>ҴOIPݬ_G[#k?Bd)WԫVeܒJhOl|Na Y6D܌K ]$hH-ƩůAcoxod;ˮd4_wډUi% c2sr*>Wu('^-tD%("NTWr%]] GVN:q՟KgKQأ^QH3{` ~1&b˂*UXIQ2/]fCI7(UmZGs.+V];+N*dEhZ8F8%rD^N" s?q`>D_*">|Ȯ,_N1-z=/s\[?wW=t.'9*` P2@psI&m=ZW26ܾ,a;tpqu"O9;()HD&!Z֕|lmuW|jWKF0Z7a)QRtL2ت"אUR۝48W/C]*~xaD`AȲ]>`4o8s~3WQZFTd9BocvGUЧ$i jbF-ql': %QKG\,z¦ؙ5|5kǏ^;W je&Т =M j].g%1;:1$N-(dD*N'aê*,uFNK~GMat4ׯ=wK^Oϡ r,Gi AK6A-]x/5|O>#hAёOCuvԛWW^# =SP^.Nafahz𙉄>ԝUdMrJ#*\Tʔ Ģ꽶=#?_7eCTttڪ)ۘsgϜs7\\th< ( ې:4 w*5Nd=J.$f7=b!a:qbOba%łYԯ˲o+f^Ļe Z]h[?w#?|IM^`}?M9 ] 8m{Bʎ`4u`rhk^*' 7VuX[^^\[yt/#ԬM%F T~K%@ uj-aTed Ֆ`-sTMT~g_/g*c2ΜZ6ϝK),ywEAq!Aͳ1nJ6\9hWE?p?JC8".(}GorcZ9`\G8اve,ND%feQU[kfzP/SADE=f2eiqK%<1(ԈlZe;3_[NeBcʳu9?#M("B hWs(Q&Bp`%Jm١jFmz*RL3!3Dc\s 3?t$'"N KoS'lnBuB>XfZCOen/7G~S 'DyRE KMq`),&%}NΞOATpҽ\^@N&B) @p?h}v-{arG7NX#hd4McO`rba,?GW ӕ@ǖtF[1 јTF(?䮕`aG%H~9ѪKz #E)Te/(QoiDY-S>V%\mou`7>|O|% \frAtӕrpawP,t#i/ȡa,bHaSQ2esfC٬ >XAf;毽tquqkt@V2 Z9X;PJT\9 sʍ'ޗf3sS×/(K.XXJb:XUN-xbd2{9nGo#pq %c2D  % ItnZ'uk KmT.F܆ -6mY )LOqvG;*ՇN{ͧ&MhV ƋfR54{8щ)RAk7 #U6>k*/=iVsSfqfw e3-=,GtٳgN_F.Y)'Ȅ~\Fa+:GiAr7  X zeLa Pir`QxcQk^>r_U{h ͒>[@TH/f ;M\#=˴̟1r?jԊcz$qEiD86ם?{Ws;eVRC^2=]lqىX㭂2Y0BT:/᪡ >9-̀f-MݾRF∡qG|?7t8h-Zb$vwU*$iD勢X\D1Lg%*u$5Goe9:(2/ܷkOFuAl|/cxqX{Dbt%"]c7, ;8n\F"dwG$SziqnPvpV+ーv=.,9(L &rУ!QT}y*ۓђP+6wVf̍C-b,J87w߅lRKE!޸} H{KԗeW}bŃo7 A*,bNQKWX?M7km}_+'8u2?ÒIץEKvMTTؽQ-3 R&/xf%[Sg6ಬ-A8hz#߿~54Tx4F(φ]|'>dQXHwb![G:0цteB%D=ѷ#ܛhiO=5O ]QJe+GW;=VY^Ͼ(0&K߳k,e\XJ"&}c+E1d/IeբeL}/=Wtf fiBOXft>:OaEz# 1glaɞeJ;ͨ*nuTFډ'~rIZeFDKVŕt(r5s+4Z 1U#~REHRf~X!9NEW೴o&>=x-ُ}u=~?k~TC%^L/]{ԎG4"`3Hcͤm˻MiC+zu.I4hRxhx.6$;)%DQY/_XXZ;}_Ic+Km^!D$$@Fz64r 5 ?>ÂfYdR;N<^I\b{zgN=ֿ_ *b6Xԗkw[tRWZPĢ3KlԐ52?KRX@HBӾt8+c+w iNLs gxϢJ&q[h"K_\vSȜ TW2.&ñ2BDt0~U@r% "Ֆ2[zU>iJh7[s⺋'k{[fkXL.UΆ~SݞW `٥F$jH=lij tZ=,]G{)*ZiNoy6M>sgNm6QJ=0*oH5l,gdprԵp uhVSin.ShLгm qza (*Wzj.(~AԧhEx_S1U՛߼#GOod4I>}!%Ϭ2<64 bQ?K5y^ؗRUZ5}`Y.AqT- *6GϜ;?m3P&ZFo[&ONiЛwErQEMC6Le˖NUd-amM0쨂#aGR4Cwz<{'\jz[vqlAJx0=Łik_뾥士ZIg7?X\v*2tJ\DL@c@K =\nsIITVkDf)ŗk= }Q5j\c')H˾’Lk]F}GԙV 8tZ0ɥA;hj_~?s82ltR,E1Uum,JXV`Rv, -'DNOFcِLVOU[EVf榾;M{y|g'<][K^_:Wr{uS͸f&b ޳}ud}/s;ڄ׶$.oC+2y~*(x&7>3g_x?XK|ip7$Ip0Iwh>^e> DgЯXEg;գ.MbXP96;plX :4 Hh꜇Uh 70p8V%yQܪ=VVW=t=a@i2/${Y5_kKKat =,9Km9QX ž|ҥv tG6_̼0 -f~ Om_ޝhXؙl9 >;9ޝqj;1FZ͈gemx_DxJQbk۞hHViDl❮Mn "y`=8ڻ8r{p?Ie0ZaVg͡R^w}4J)K#AL}TN0@)eW*z-;j':.qzOMH~5 /]e7>=svFK|"]*|2 >.z6ܸcKG:0iT4{_bvA DX dPOkpgIEތh뜧QЪ7pߘ4 _Jvy<#غp}ڱN\ʵ)yee[ܪ$j;J SEQ֭̔J&lm6kW,/{,̼'4e!C|ĽQfR"B.3p( |L+[ t35SJ%gƼcUֺѲ+gxx>vvE˱/}h:F;ZAVo4[1Pj-<6@99wMkYOeMӳ_/z8(rAjgpZţ^\r9ی .K2x0>Ord4֤IoVTomϬy_=f$1hr<`uտmU5k]uvj:GC'ص,arcBTιf( ¯$\zfw*r:bS 1 Pfi)'xڪtS?2.180==U#eCX?72Bk9Y7t*7l^R-[X_8RL1[ q.b'q֮Ht%Q|}z,ؖ+ba)\8|͟屺zO/V˪Be??e48-fpqɁEF64N%xV ABt9s GA-8_$*w'+([_0[𸸛= { OQ{HdAΙ9G!-OLsgӳn8ɺ o4/_d$}ue-.`Wu]ېJooa"r4|WspV?,W~˗W79ҒR2_9++ý*{Í,QrtseK6?Y><: irq"Iub5ˆ'Dlq*[G1AaIqR>>tCgc4Yٻ/Y\i<51gj3rrnrVcE/:'TݱB~%V4}Q . nuURѣa>){%=Wu1q Vu\ˆU(cP{wSyIiYuӋ'y(r*Et@vkџi"<2>12L p9ؚ`|J 'gg'BoR6\BIYS 7Иˣ i 0,u ͌cȱOUdgggef؊^)ڬLQ𪂌OZ/ T*S/]Ӱ^J6*!3oj]4'ڽca/Yϊ1D@?юɈ ÈwFGQ1Oo`LszF'S:+K=Ixͪ-x4lL!,q9m=mcSj; ."t\,l2>|Ҍ̝߸ŹUs;+0OFeiBKJJ:/ߪtz5cWmeE4D5ɭ*vCXZ4WarA~w.[jȊ7>zy)72蜺gx\{㟖WGqtldph\K4y[232_KPjS"PӲqzYZMPyY2{F'e"PBE$yK35w ).b..-ͱt<>2z衊ܜ]N˱bRsϚ\jT58Oν+`i\4,)vpq5&ߵLHʿ XavN «2l -qWÒfSqAYys)Ir8uq %vsqiɟ{Uz/8 %D^%sNhK Mw^R_O Ź&51Q9=Ó/Ӽc7>Aj 5/!ix*rssr?p:؄P>2!ޢgjպK>5EcZ_^KY}32YoWu\bK~6M퀪 1#*1`MӖ=WηVWT5̒[zqk/ɌcUqeRSBGE a'r$r#pp9:&_'6fOOjXN:̖^j䌚6nfǼl$%hИ;)5DžG2,qrsr2o>r9du>嗕=THWOk6S= j%W1JŋqA%3Uw(^Wm`F4vI~1[.mU\'Iȣ)cؖKJCV\ *Htѳ*?>OD0ÒBeb\혬2CS*) SiI@ rʦ{'T.A,F5q gB%'a {3j%MUBIKaqOOɮ;F6}NfL RԱ:ɰzՊ.{l)djԐȫ(7]yְ{JmuqIJ}C7: ̚LN Fy412%3 /sTi#D(݀%YO͉ƍxl3[0507-ѡ}5UW?TJ̮7:WK[U-Ly9 m}E[XJ0F'%N_f&\Q s-q(Tח kD^Ev-O7tFhzͳ%S8Qҋ8#vSqGd(nǵhȾ@0A̸4S34 a "E0-<OS"L(7AmM99dMw #,Jѧa3XR/8V)"?yҷ%-X^|Gϫ٧ɥ^J)|e]/ٕd .>7"HyV ҹ8.U"]qڝ񁁾޾aq$S&B#<8"dLbԤٙ8c2yGi`r~[&&ĜLAQ|FyWF2#5%wt-,F[F=G[P';!qG(7b Hd>R.o\.^,FL]ZdڗI-(g1[x:G WT8x <^כ[1/(T)+j w0P+n·ҫ8K?b?݁Arh #=p/g2 plϔH7$RFw-< vI)y/j^Zy*$/-MY9yvt]RIƠ0ɶPD*U╡A+kaŽ6-gkC Ku6j+\Kw#7+轆TA9.-%%eUO~̐ӰKӮ5K5 #~#G p 2K18'dX$P$3p jlhȴP4NK5xG218Jؿo:%!sҜ& GG>{ؔ_)nZmOxWg2Ќ!%]C~44+8"q1`gu\Gg]kvk`hW~_iƪtxgTVZRnjxv\yTŽ',}^a*'s2/6Utr1%pf qFF e<m LIÅdgs:%"YYSX1HZb)JmQY[y#RKԉ.DaK肑ɜ0<ܼ܂{&*r1s )6R,~+ԹpA XGpܮ5&ʹlWKmFHtIFMgk`yiM-1FFqZQxīuK^FOp]?)-+*hz樆d7.!X⸋kN#*(zMɮ K*F`VXr3+KBQ8.z1pCSt1©y L*t:2O19ߔ,$Dy9.z!Z6CƎtq&-uto[r [ܤBK 5akV}TХG'5ks5Hʈ^%Y1rN7]|WWix/]v)N,)\.kS9tB. }=]]]hzvC{ƸG8`?aǘyجqk s%RDF N,ۜ{R)>hW12QIG[|$\ˬzCbɠWT ""rp#H+Pi.R+}F,:ND@VخUYMP+PHhةk{>.^CyEQqUS_,8-Yv8og&hߢЩwT+b`Hؗ>@/o2:.v rS8ܯ=lVIKڔ}&%D~QdσGR)I ?9+`V.8tHѮjǴHi~ s&F{`yNaQa~#fBUaAhL0x؛Le4JN'tՁK?Ij%5kHK P}\:|LޠK1z{0ǵ;bdۮHI;Qѣ({M_د QNZFBѡAD Б1բˬ:>6ǣ*@ÃCALoe?sT)CJcxĜVz*P*XjlB7AJYdx=qIĔhc4Z(X {T[PO!ZTE &FkR(c;V65'Wk|յ}W_VHm iIR <"g[x"/(wnv݈$Ho cT T'Orz tvv^Er FaGTfg|D#f0G8цY7(!|du2#p., fJ ,[E!btN]p)q;]p$0%حWL582瘝E+wCG'D!u_LMǔ u2h\*Qm|la( 3`QyKlyV4*c~BouӰnXUZP*Q*ȥQ7.k96K2.qA}n#(kMy#k?2 5ȟߐeK\mJ'.4#;7 ibxT;|hɰ"[=:lz2 qx ,WK9WysU?,9UNn02q5peңCdblP+R{-lx٦wY.VIj-kSNe8^1$W̺1պ.Ɇom[Ef'a "zàHp~`/dۇdf؉'ծ%Dd(GŚTsJ|#'NsXƢbuK  J(vt, D>PSPXpj99K]~h: T"\DJ ZcWl\—8؃J\3b.KJfָb0и:%itʳ96U]ʧdY%#QLCk.S-d13*ua]tmBOᐵm`?P/=8тJ$u"DD<>:Ď&O\RuZ;@McGDgFuHS)3c@iV^VVN#<^3>.yylr;MlT-D ҝo3tI?eke=RՄ.k!=jb II^ϊݚg'rmAѠ?Rrט ưj[`[["nPŁOWww?`n-# CaYN np[?D> >(4XqoY#'ő)o{cӕ!8 2z=TWx3ʌjU 7q"?VJ-9'P~^ۭNW4[6Ҁ+Ƨ%=' ֙ĥAFK +SJ]6TmyYqyu:.KR#+Zv6[rјd"zU˓"'==Ď )'ޤ]} H@ x5!  W\ &0M VRO\2;!! Jn ùKA4CȌ'ED5'zVOWWo'aٷ{irYH3`t"0`HR-;,]:J.(PqY;يgё)%59QAR?9*.(vm,!H2ݭ҅d8:ӨTjW95wybpttt,.Y (x rwF"ހa%1`o7=ydd`'1)uHd~п;4̾jZw/RDVt<* 󰴶SȆW<2R)Xbſ%4Ox$PhiҨ԰{VJ0иK@zthӷ<፭xG vpiD!ҀQpgϳҢouZvڋ%Kܪ_P;/4=6 Ĕ/;q /tHA^AB$avA.K*rp:! ×aVBp;xyZmll@dZYXPPZ}!ɃnIyhd<+%q/yba14cxx~ |{__wO{\b@bPуGZ\y\+caa3A,(Tx#Uczmc:83\NuISQqqYm| $(n%qSJuB)=8HaPݺlZmݹ[Ϝ}SO.ϞOD[Z[A ێ/uv?MOjm'kko=w|[VpÅ SrډHEԃ|v%pOro/.B[!"i?uN&jt{UZ.eDžO.~n2WssrHRE4wJkP3HE 'ns9! ?NOsH$ Q~+^J?ںn5`;r_bi}^i!ѱl|TTTPPQ%E=`?N\ BÊDYTb&.dCd%LZ{s SNsgNēmmč;Ν!NlxρZ_h *;{3gp;)zA~+`n!Z%.@].?B~_]A;ZiqMbtz@*˾owE?]_鴹U0ˬgAѝ,tE d8H(;o8cLi++)u{22%4R r.z[i7qzZN.2CmYZ]^\PXRN ߂$8 -bXV6Y,ʹry)>,3,7:CG/9~ԙS[Os7ߜLۅvs@'Vz1Kx J`~s33o^$Xl03;dCklX-V0c8}g&_,F;٘?ltY[^Z^\ږm|ɮN&pTA %'?|v':zo8p藇o:ա#;p>ѓ_ȡN< :qsgϴ;sj%u ]to~rrZZbKKKV4;x&=K NwŹ<6Vx{ _ ,.-a@]t )V3xiXJ v$Smr;_n6{ypWT9Xoo,}`Z6mYYWC쓲d3'n8$cCNfYk|y[+ rr 2JJ J*JJJM&SyyyYiieeUTU_^Yn-+*-/+KLuMM7mںem^sm^wM| ;ooƛo[n;v;;wݹٳg}}p#SO?w_|}g_x嗾ڏO~~{>ϟ|}z_ؿG}y3'>y|/we'&%ǥuln>3ؘ ሧ/Ӊd&\Xq rC'r~`q s 9lsS̐[1Dv?hA,`9U谳v /.Va l Q+`d}-ٺ+)*nɅiZς5Cso:O|~gZ{/w_0wuv_7L^c;30k4tGFLJ'85>=a,y dt Ggu eZ0egZF7l b, r2LopI=GS0;; 65D+,0z3EZ?R`N-VG۽EyY بؘhB`.KEFGx(<,$$$(44$(8($2Gaаz(z^hD8=9$<"<48^BA6A!aX"aIIq1Qq11ٙ9Y)ɩ RR3 22sr44oݲequ;ni7\-~']&(1O>C?OS /?x?+>wO?gC3>ҫ/^~?~w~~џ~?7}8|}'>pGG|7ߜ<{sgOo?}\ϝ\{ۅޞс~q6524=::6;16<26Ekb̌@ѱa3f \I҅=%d|cbc£bcѱQ1qtbG$FGDIf<<88m:!048<H EDEؑĴaAF&€̴ fl(At3LI%bXp'^CJ (A`$6:!!!62K>E*lBbvNjjRlBB\\Rb465-0LTSɩHJIKIMM!#%-=%54zrfZJFNVfVz2{*D%D='%E%&%%D;ʠ@LbbBLtRbrB|dtJ,=#!9=5%35)5-!9-%>55.95zbrrzFFJZBbfFRjf|r~fbzfR9-Z4oXX_YB^~q ;o~v;ngyxWyL$/m޶iknc=<<0(? Ͽ^}_{7ȵ>x/~w_GGW٩ G??|葓9WZlήk 󲳳s2S33ӳȳKNN󑜜JB?))---㙜@g$M#<ǑOk|;!1>!9)!捍"L( L\aݺuĞdɁ: J]n} IE7w@  冄EFFe 8"2:& GH k4ҝIYD8)驩4FtWzZjfnfZVZRrZ*A{l 8Z1q E$$œN#:<@)O&FEv pˆB$rCYDEO=:^C,Ţ;&З!/*&.1>6>&%. &TBBA#c[$yƗH̤NV^~QEE,07޼im7na5;iu\M7߶;;+]sV_ jMUUڪK) /..-,,(+,(-)--/..,).˥K>QPX[XTWPP[T\TRXXw( Pfeg&Bt@$a`djzMN2@ p P<t/&z !'#&B OJ%F:9= fD)bRbl"abRFVZbJzfffzvvYdbFfzJfvnVFzv9ߔtN!-DDŽ$8pc<ZM a'3GE21HK lJD(y5 aHdpP(`Z!Nр%P L#EI~/x$~9 %+@n$CN(8IAbAAq4ud"h" |&C!B6AG c"ևDŽ &U~o?P`ؗ/Dm +g)B9\,( e*!9d8,˜EgOdlؤ˖%\߇o䉧zG>}{n[w֍}߽Cȝ7[n[nkwܶ[tͷq7zÍ^5n庝;ٶd2Ai:ްq9!!~ltT6lC*v?7 ,nn89BD2fIY55 Zj:TU4657547lkmXR_H+mcSsKKC=-_Z5MյU 664mjETY$)*,*U!%gg)/&IP N#NN"N&F'.)踸x"Rk N' &$oR;@&֎%:2,QgH: Dz1ހCfP@Ib&U蔸4Tkp7OS.GFo,'2,69)kKRuifrgbwWoNnE}/~<}?;p/?tೃ>O>O>{?>/~_~'?S逅HODŽ/~}`HH24 ,prBK:ew2Q"!z!+GѩJNL%2yK͛z-ۯz7_eƖƆM6mjټes˖-76747oݶu۷oJ/Bfu[^yM6m܄77o—n&6onK7nlnj\߰i7!j$CDklBX}]Ft#Vd)APUeLTUeiYiiyr Ӌ!V+))..)!sCW )0,#3*H.U8:sT&G .ķ LCPz:%H@lfGm?x?FӲh:\NչӺ" K3㓳fXf0hfvrlrgMN{{>ޘ[q`Аp|Ҵx0/!=ZŃ?$á$ ે!_@A '':IB(3)ʉOןןǟy汇zz{vg}do[w;ww={s[uۮnrǮ[o杷~M7ر߱ST|ۺmێ;͛7]M [n۾}ڼnoP7oloi؄rh ՛7mjjhlH\'hӿƆD rz<*kR#ɏܰ.$\@:Jȶ[#t4AL|f^UG1Q!0ox:ŝup@< xTuGʫM]8kEvbw\[2*N+T%*,YExy+rR!e2;bq]WҐ"'#"2& G||ZV 6n?/ıy3a!0AQNDx )!ÑoDZ謇.G{̳#:N:w3'O?v_9zѣ_=z'|qW}'c ~~?|h'}z_7w~Wxǯs}^?{{x{}=gc#{}?|=y˷;oq7~ 7y;na׭;nuu7p]{M;wܸsݶm;۲|kmzmn$oiWlTdt8Xx0 2B#%;Dg$DA Kzn(2݁m}TphhDh]Hى0xdSSpYd,p1,VUB%߲(z%bŹEUZ+WKgBq9 9Ւ괸rp[X )0P5D 7Š'anP;!uxa2@N%"hP)rqO XfhI5%mnzZEm~vjosv`6*s<}rZJp|j^ShvBW ~̙ L=sgN8~_;qcGlߧ_g8o߁/ܿO?{rh/yw~ͷO~ӷ|^|^zγ>.6 8Ng&$'Qx5(Fq5*22".>r^Q(D$c"c)@KE7dS[tۙ.l ,.sI4bffX52XeB&8.2,-.M&Fp 7p ~sDA~qvxn`;O+͙m D.r £IC6(,0$[lbjz p=Ec^кmmlBk`9*Y"_țݤPgԊlB 7Ӑb )97 8_2rd?ˋ, K,ZPRZ-:N~+3h2*&TYQV\\Z J )~*))+,!f\Za.Rc9W`œ "N!IqVJjFFzFN^qyiya9o=xU4PIfo}V4 uZEHD䂾6i@lb_ZUbl41='Th#)ˆ*A!zԂ$$$5!䠉F#rǢ[8)O}Sr#9lˬd$cnYB%%zjDa2'%b̌5="QqXTc1=j*Ĕd {/-C8/{ .@L}!b祹y>ޝUA>ABJee(R\xERVQQJKJ \#XCXTTa*C(? $=LVT7[Wszy6 frnƧېDm鲊 bs,Ϧ~~$RrK~pB%Hۆ06 AI&>u#ltsKaד)?#ɲƦe$g>grY'Y*&E,ex7lPlG`m|juؔ<lc۪?ݵ(_e%oӀ  qY&:mqnv.-/MA>?GhXX;tԴ}IqqqyՄj+jKʪ躩!{e.Ⱦ*q)*,K8#[F&XVV ,g_u;K J+*U&T_*j6Y˗g.&6nD !:c!mVAP-3Z;lJ* ۤʊ#)!RIfdEC@Dr|h)"19M X"OdzFfؓtD'ϖYl+a&J0 ƚÒ 4H$[cҪ^'y $Ke8piAn]lթ>xGj_~.BB³eLKAUpw禦JM.lPW_[m0L5UTWTU]Օģe >+jMLD%%D[urTQFJP%?JSy 诮n!?. s7YT(E *}AK;3}_X!"G'SAtN-/Up;0yمK "0.0}j qăzD@${HGAшǣⓒ \ظ((: %DVvE,s6\a. 9|c\=k+6'9&H:&sd ֊[aG3u;+I'Cp?xpwAf,)%5M U&j*ɜ>+*j*"B2 RbEBYeE%]5*RSAeR"^duMMm TUG76\c 좫"gHf0JkD dgg痭zBpC5cPyK GX@Ae -B8cG2l .Xc=@$570C 8B0$:А0(B#£ EA\FBNA;5]qSͧYu!&}+Ϣeh2:xfM5q)ҡu wx-U ZZC,Hck#*t0+-1!%ȲںjOج%0UWN+Ɇ? $ \\+aɿ4U$Dzl~y).e_!π׊Ɔ[Q4"V6i`%rݺ87lWxr8B9Υ!o7yվ)+9JtN~hX !\R $UWIE,$ fy&xɵ VZb j+66:1)>9ܬRdl*TXuh%࣡A̷֨Ufn(feB Sɓ"y؛vf\M [aO.iy Q'CٓrӒKj255\ᬡ 7aZXILa Av%|PLe@n%IIvm={;%ty M[n6R EƙQ4K# KVSiGl|nW(rjV9N1n8Id%D"/ X"aA ĠuPѣAFyUEw trW!N;OȱOMKL,}><;I\TQFCOߧ`)>So1*6GAˡjM* a&=C!K#-2yӣ硪.N;K*NX ;]䌲G=KL5Re5U{*AĜ8>0ULW J@%x +!x'WSЃJ-#n[Vm0/]ݪcNl֭ҷoR)=cC7dWS#U'6ln0|Pʰ@=%I$ԁF4 X! HH2 q]_&5ˠ fw8~XáSaz%( OeZC$C:v2Z.w^?̈´;ojgxx%Ãg]?.eY4S=Q%B"êkjj %UBXbE%B!;$ A&See ?I3JK8TVYlٴqOBK٪|+P NQ\myceU,s#d apѐgY(5mU yȳD(`U]hP4[AJK@a~U.jƗNiF;KqWql%ʸ 6zOd~X*]W O2-4BsBцar,YNM#VykKC}=#R7ՍMPt uu˪D<dA*+%s9ZV\\T_DCwEK7547_*EQc%Q[b@+RV:iwѸSy;[~PVnAr^2KΕ \oÚ!lP!#| 2SRk646nl#$VQ$]]U[caP!SVK0]9l O3UAZ[SYa%J~5($j˛I]@.d9[b9\9J-Sq.o; vD:Z]FtxT 蒥Ȇs@A^#`n rÚ(Ds@т6 o}Ah_'3ƲQ>D,Euj^r]*VwRO6nq*bUaӢFTp"q5nX[~b6[msN2Ƴ:P֒e]i) q馦-ȝDcXLȵuU5uե%aU̢eU5,SV#0gwu*8B zF%icm]uMSmUWv,j8j?eB,2 LebBeiL2vKӱly:'6u0!C pU gfn ONY YJCEg3Gno GDl|blRJJJ VF)ngLz%U.fZW8qʾrîKqjG%\Ɛ8Şka6l^OXăq[Hu6>?Ry~ 4 x?s N0YXgU.qp!p4G$h2ÓTR/{\R6q+ m$,1y!nӘ+iͷ@"JQC< J@sߗ ]**W* ہ[7򲸮 Ms4SQSͱW_hnnlu%,U"j6+MnFcu+h1Wk|_!TC`}gF+U KLWˉ1G<}ϥ&O.9se*@4>[Ӈ$NMqt9%Z31Ap>!rb!;Nmx"W&# ESD$D2[6L3 ߼IJg?Shhˉy nR&^O-9)bq`}!;D y:|$rhavKJdL0g@n<<64|u g%9WjFZC6@n@ dSNZaYE5um#Rj{_|Q0wmX*.ՠm@ʓKnɶ^V)WErǥc*Osyyo3b:S,F A_5_`>kF[%A+R.":VA?5} p >쀆wSSa2W^ԲTrG?~x~Lۭ) 'K6\!gjBnB0;dJ,RQc* |EI| :3W<ۨxomL0,C< QM}ex<=89 |/͜:ԤslLuFC vD za3 J|H \E nO38tӣs#a@7w;Z0.{BpѠwŵVvuDʺK0/hVj =Lf|YnR4y1͟AHglwݍ ~^p9A烞t^;T߮RYMv^kӡA_VDڝG{\g"GʨF TKTk#=,܌x\d7ևC?&)ăf30 L?= ] bQf =|SNyA:V d{0l[9P [\ݫNxwaf"ip-T9ry($?x26LojDlָc\GH}$& B|\=-zU'jYYի+P`W^=P ;jw{Wɏ>5wf=WF'XrOUbV_!fOu,+Ok|.=rScTM‘&DIsMȊJn)#2NNƥ!YHH3錙L f w>s%iCvxn`FRWHX ITG;G-IRF̓?h\-lDX/,e=GN-¼En|r!7WDDP›W W muwW*nC qNUiؚuSQͷU,*י}*f^7qiRsܥ{?>tSGA'N%ͮ4)^DD)h93dsrς>D `6uD/Ƹ<~[010R6 ?Ch!I?FdլwSKu-~{N,ٹjnAv]7ŹzIXKDB$Nt`#wB bnhmwiލb&Uqn._;~GKFb[O?0Kԁ vy70}yXV`UK9z*_MNʂgBqI2Be, ͉0go\C6՛Ev>\9?ɖXWupr ƍ3$-}fVA@#\xc0lT9jd鬺fšAx|#\)d w/lNJ(y":NgI )NJm*66;uM4 S'K*X O cnk^yO?[8,ŽJ.DZ6b.ߢ/D%9|ea&?śh!0K%:J[XgԼ"Ip{w::RfFQܴ\9bYm»?.pͨD/,tӆ-pRr4yņ?ؼpo}󂸔⎳>RvTM !u_6$dĎoc>0zJ&,q8*z%!#6šQccQF% $os#툈8m&p7M#,c8s?Cގ1d4>vx9[A6*aw|RkU#L@rz`T&][;r0KY6-D-㪴/\ D󷧨¥}sn%Ze2qX_pcczEL1kf_!Uq- UdS+X3=%`ub^[&qVo6g/\z?Wm\ ,G= 2Hfq \>3Ԇ䠃nj4 #l!C<p`og$%6)rF’ YPފ'!:m46Gffq̻vLqL4&/s1Nƫ z][Qy [*mn cį}F` ou˚,|0K &<غƄ~`AT^mh7[_A<E}}#Um-'mtpikyD,43~Z7E4:[<\GВFi),RCBɾfI^;,swu޴k7m0'{oo.uڔnh;<bVp3q,B%U,qu;V %D+3IʚR"QAR ytEq e003{c.r /T6]W70'"lP.mXe8smf|XGdu`q;&]r#l­"R}-ݱP.st5XCUaHVXY;yRݗwC.8s & ̪v=hLT^MfXVrh$,>Ŏٺzݗ"G(-;ҧ'\OCǿ%]RL.My(`A.!؁ G4(N!#:M |J#[R8S_@(Yq`l)=|h!١7p8Q:9PwRm&8ሎ?“u]b*D(] KGònjKqݯ|\Xnv;˦⏵zՄq ^m"sojrpZ$]<-Wd')rZz58+#>4e9s+߼&'uհt,k`@Tis(+aH.WLt/mI`1AOìR=eNAQu-Cb@Ix̥)A/sb40{%J-eY} 7{Z3| 0>t= ZWҙcrLjT6a`5^9`@z6U Kɖoil*|YŴcbs4IGTgbkA% KA1Mޅ]Qov\o9*Lb]oV<Uf[=,AO&B1dgo` M!vI <>3,L4w扛 @89R->u)5*e+ -OwECaDRߴPƓ^Xa^EʕXR#_/ή, togg7tydfݬ3~Aި˱p&&rFT*ERvVNlŁmvϞ?7귓+.@te{(O6+k΢ɘd5~w2i7Gp#zRK܁a'KM^dW8ʼn_h*n|Lbxx4C- Cͬsj7X2К'NRX @;#86}O{} @)ГX@<{frUL\Tj pPrk+Z dt +HHUt.47.^p_{׷KxQD/! npmy(U='JKE9|i貒kI2`'2)va]&P<&$Ht†e4F$R1[ C&EƱd 9|j:o2kA6[*J 'i.$S=`i6[ KA_˝r5-D;T6pd%㨈MXGp / òʏ" x3|yyf\.k <],&+\隰e$.!F6: K-[pCV}Uo~QyiѬa$R: AG)q 4rns81"Sp0Br֟ MOMO=l" <8")%ȓ39\͵?,ѕs#[h K-.US՟-kw`-fhn 2]霣#R;HF,lR4 Q^X)ulc}}c kgЙ7 J P&ymUw@5MSgc\~lj":v.?v+ƥ:P&$! H#p)ZjWZ%gwUM:AXNBC$udI %ccrwxQZVl0;M t Z" ,] k\mKKєoE2ၸYp*,{D7 ;A9ʧtTْ$skْON>l$Erogww?˧qb۪@Et+YyX!?ĜnNkժ>Yt#IFuʕp{0/r/b.̏/ͧjt: Zy$iw#;=1L䤹KR Bb#b< $hQhr/n\XF.SIIϗ`5?ĞWW2cd<@ќw lj,Sv $ϟXYU^_W}hbdq }5b&$bQ}g&;'gMXΞn঎:Fu`CdVg' Ԑ-& (|T%IEK3`ihw^車kG)?o[O)m-OxEan䌉4# OCNѤc!,9ªʻ3h5%L#kkĸL&@H 3sKs wd؍pF42{JJwARAxC6%Y3qKFlaRsDݺ$+3/}{7o"^7/c{wwc }FNT/ȾpϽh:FԊ&`fShVw&Ob7}Qi.i/DB5@Sag^eE> tѺ 8Љ&OZ(dqb!1:ت0lXЬT; hY} +z %W2ɷL`Ov/ |yq~~1ԴZP|zeu݁}0^ q?('>@#8(YW#xNKhT8sލg zn4lk7foBbv@!w$r"@檈#@O^\cVLXn/+y?kwR%H#cu@*@ґ,:}9kqJy)n:OLvQJ“c;)ږ½mLtW*qa8zK#Rŵ=Fcx*fw|G={哧d e?9Y%{"BL%tc3w?۵ #qoG)ՙkKTOc+@Rwy'sa8[80ٲlFۀn:]̄,hg@OΚ*UMdKh2^߼t{o}0 " J/O*d-ljiPmKϼ 9N' a*ȞpNHT\BZ m? Ɲ82FRf1Nݹ\,=/ ֋Qu4,u`Z ]y0ͺ6Z(H`JoP!(vޑ9n=8igrz܍~*SN&Z&uEX wzDf9*m`E~!6fTu+oo e{ V^<>u%A"?p RFu9OMuvla )I0FdcET=<)L쁠:pf%JUD)|.7wL1)ȳB$!}yBaSu4y{]_bO?q]B6RFǴ-pwJ^7J%,A[. zD+흭~~7ΑN8.GLK׆iӾ}l*@qHEXPDq5FEdSvgBU`v)AVGbfe.1ET6-ʋwm?W_^0`Q4iۆP6U2Ry??(ĖqKhҢ5Hk[_EymXiv}ջ|at:mյ!lMlAƃɜ+vB`Hi_*%35qn"R WD/e|{4oNaOߣxͳd,U a;os&NOQExh|BED(*.Ybu/^f`0J`k/1' lh- q\*m%YR66qXZhM5RCq&ar1,dBpTUZX Y/SK}MpgwRP(.^477Zzۮ#l T¨N5;3!QYYeif󪚓aroTKWџQTaI:= fXA@}3VLh %A}'(L<"p!&`$M'CUZ]"G=3l}B%D& \>[(gۅWȑ6Q/[=kXseLaCѰU]qX:0ݙ)@c'-jZ-Hp2ԛKy%33=Xg3swDwi5+Sf^[Aa^rzf+L\6j+r+50,Btqwa2k{Tڣx#ҧu>p 漯KuW2f"/4c1Ջ6$]y0~,fT{ǔ&v1C2Jgsl<07s#7ve($V#2y{_Cƥ3y9 ; (w̚mEJ.t KA\G""vi%,w̗rٗWj(-SaYv ϗP8 ^]zzZuO4w͖v/J=Gȱh +Lɡ 1Af+/?Q =vW ,|6a]QK!ajp؁߄p~D"dc8rT2;t*5gfY.`?f$u}IA17Dۡ\B @=J<)vυ#^wIO{J 7jrjv=D$i1Gig?ۗϖ`,F1i,ATڦjڀ/{OEUoB4xMnپr闿QiSć~Чy !qxxJ*\KȀ(Ff`>:R;]qH$k6˫umkX-f3S}Inxª7ę&$縬<\Jk9 z&d"SIl"=\\]-\Mƺ&o[@J0 G֮LŬj M^,Y ٚ%5NpOs\Gp S]mՀo/{Ր=(W&, H_& qY5LhdtiymUDy@a+IXz\rr`&(#+yL }hnRvvps;>[O'a 8(CO$=#< [&DE 0xGaڔFbSiXq*-OƄe\*KB7M&9*Ďҵt=3du0$0-:aE2{K?N*_’/RJZuJށe$7!gxlP; :%@IPW H\' Z@^Adiw`pEjuRH_Bj{Qd¢A{8nqfOe8g|:gfeo,j/H m@R͗:̫y|ǰ%ai6$7.E՞K0#B=j{]"v KZI}Hv.y5n]z-9QMo(5!8NN+k}Wj5"\u\ˋ+ҢxSY/MRڶ=l祝Mv2 >/+3"$yO,"_ CED&UhS(sLzj:N' <6+:-p8}{Y=~wXt04q6li`?vDw4 B\ޝʋ=S~֡1>׳A q-V]\rR1}'sBqacmj.fN7uPAUTשh@ &O:+P5P\|7{WGowo?B%u(Og`eѓV_sg"ST&4ʤbo 4" fw'TF}b2xi^3W B̖á-څiHrd~ؒ8j$`WrD_m[:Xp>PKm}AAւޞl{y!' yBpQDGX=Q4Ass98S(rs-m`J BP|sޏc&!暊]RWߚRwc!Q|JZDըmD"k7&c޲˦Gӱ:4b,$K#cX0vӡ.N<@kòT:xt1Lgʙ} ˑigdˡt#ϲHHpX2PICr!#|L$p3>$jy8#Eǵt^ȃ+=ճӑ51z|hh/fuXZFoS_9rXx9 t0kknn=ڃێK" 1?C(}l2Fϼx!E]M#.Nl؄DB񅴪w=ALI&S6pOL艂.3]H2ħsl?C$, a(kU˼l6iITeՏ?&fJ rBwMA2R'$Y)M.u m@jXܪPC_r9?-?,+ V#SN"4_Ѫ%]i}}cF><;DC[9IFÑU#j+O3t*i>5 -r|!m"fpI _$Sih&F{`䱻*OvƗySVEy\PY{$("nۡ!Ub&D.$P&K;ۢg栽ݧ>>Jyg*Lf狹BtӶQJ,M_0 r)͡zZ̳aa9Pyn鿴[1+mHE\gUBP]qMИ *8E@|>tqy\̗+n ECm\T+FhZEp\N u' ,LF W?x6G+;p<l,Bp)|n.sOL#MM%Ib_Bfc7Ո&aWrEؤtn s)`4/O.[(<;{֊JcrIQ.r}=l=nk@q:y "t()]X~ +%,w{d߽ݞ-'$? nlQvM@Vph&y`i,?V_~b_Ph6_ -;;9sԫӘHINeU嘐LŘM{(\бbrфxD!''7D; M_I\xҬ1g+O{w\z*=6t#)mdޒT{~Q**.P?N_p]ԞsV*Q}-CRPz U}5; MpaFq-7 V9-BUh[0jlmo_z߾ F4T@ *&0L?#'fsSl/ANݷęT_P@cbBِ;4R5cLA*d84'@+JNMMNfʋs1X # a~GђdR4nyC][ɎP,bWꈔ5_xxT=$sTwwvrrP1 Kܥ|KB6;*qpXNS1U*5/WXbl+xVݭ3/^y{TĽnddr"BƮFş{%D/<'ZdIta2 S029DH]J/WXDB3+`xĨLgL)?xv,|( S%;F_68롊ֶr^_ o=uquHWjp!x)//,L3 -6 Ǟ?UH;_y\)7omv Rg3Z%-k8acaʼdZ ɵ&n]|鑟"*yQ3W#WY;|H'GOYLʃoh2L&l9u1ЌTǸeR2d2O>(3dj:IiJ\٥d՘k1$I PӏeC%ɼ'ulXz9}9{ĪP/ $DߡIGRSjXuzgDž&b>_jov6\"3!f;j- !\!]vMTxwG Q; 'e͎f2㸴Q9ɑYK?|I1D DL:ci@m#G(pGMc֑pb* GR) X<0+ 3~r{8eD*Ô?9^Ȑ+8H1tj!!#D> j9gi5X#>NXH&vJP5XpH͏cHd2INѥ4JMg`[6/#CXQa"F܎vQGe Ȕ.hGs''fBǓA (hy3RX@9vnU`GXx "j{ Ņ|}mZīi4UeäG0}6[J>fi @+W|wJܔ@-j;rX5k\. |!K!rDex|ЙȝM$!f +81x,G2)b?˱B~@͵i^[v\.6=pICKR3-9.KntuzÁmOi$JiI*+X®?~Kjͼm`anv~8[۸AdlpS%yQ;辰tR²޺t}oW!M O+A=v_|܉Cc@*ZQ(K%| qBoqGy`M@>MT&MM g!mxo>Ԩq"o[s緷{~Q6tGb~ӓz-Z P3ZϧMWCB)٤6[OX}$'MU2U:E#1haٴ3t.;].=媕mhڮy'[jVR\}o9Ғ<9$؆Q5?(yeiͥ MJ Ζrj8b;DdB_ 3Ggt^zsi x, ؛KM<(D]?NڛHrM,S1xZ S4_3}Z(8'*WO Ɲaŭ[o| ћ]](isH+ZP%֑-ZeA R$aMJ~b) VqՈL&7chݍ\~owe #0VqC^ZaZ.fRx|rv: Z , yh@!OϞi4C?2і}hC3C- )S\1_O["Qqb瑗&FCec3u4d8j 9ޱEB~:d  2 k |]QVC][-Ⱅ3_x\i.2DlIz/pSm' n[.^K˃Rl`d \s C^C{8}8r\dK:-' :FYy>mHC@i3pb ! T465'Ȼ5EX*~j-K[`MH{ҊCcZ0S!! )둜Ňd{}Eazm ˁu=סK_7)K[ծrM[1c{{naq6˰7:Wfr"ğID D"~wD_iuEH[VmG3b)M<^G9g`(E.ü=%{ɉpr**{D&H,xP4;> i2뛡~KT !;"/nl֭pdzY(*SRvd)D0.+eeg]}pJ :0y?piq~//ntZV$Ԅ07l[5NİƼc2ew_v; ^4#wxxK}y>|sMXsŹqF%S$4V&&q£!x2{hBME0 |6AK}*=N㖧<ا_Hv:qszxeMd'QENl$ۇCW]qs#ObQ*oqZѸIM[]K`8,;I@4X/,- Jwe2c&RVfv `\B<{̥{{ϼ1&l^k|e&_ǐ4x:9fbĹ |r3)2|.jRT."tB4-&*HHŧM7@O!呥4g-Ón?]2PK2$O Kv#=1c kܙ F*Pih'<>6ܧ}鎥bM'"5:ĵzC:8JsǬ8 kS`ÌAQ(k$.L>^)?c٣tHK%/Tb -EHd #UfmU +N;h onٖ=(m,)l;^1E;A0߻2En|+3fv0m%!uk&n"aӮWm;u/dW[")f۷g=gNl ҥU; laH8*ʁi?'f*>tBD &&š X<Τřb.)oeT'aI*Hueu^q' ؜Yq(%(/~jNq)XeY4zJӰT~P-Y`,vK{(/~\4s mq2neud r$-*hAPG6\ھ_p_:yay6Lx6<|B1ͤwPZ'do%;Qٙ놇%G_zqijT*n b鱿VU̖6)yhא ]+M#9nC_EYU_R $Z7-:.&{ KhzF^b 5W7H'&Ŷ/kK |q椩 zG56m#<̀^nntL4U{n#o{Q+ pqdKK iݺםX()zh1"a"Q] c:JAr=<^1E_2n&&g +PD % K+^jZ5`iv%"ir-{)➞@I 96LӖeO0vũ|iG46 SwvX4gitۭzmMp6 X]vZ F{ً~{^\BрV|nFdh&}닯cv[oABy`698W[Hz`l.Óϕ]YDI1fF^N@:'hV!pҥ  S_ԓHRShU (\,Ņ*)N 'XC6E$S,lm8{ʃow0Uu8 oHyC<q)IWݹP0Abb2*FL"H<!PΪ,qs q\ Ӯ%/D$9ET&_,d 'Wb$FU0P]SmaF&C(`KT Kx|KX&Kf; 94R؜#LPGX)3skH600.bvt6L{vg.lo?_|v4*#(eIhrքi<+^s#4,Qo|Z+sdpB9{OW] A7/foSk>Z9-%s6ؿwhp% Ls4[.s+Zuf8i0M4bSUKGf=/]k#\2_g,[#|(!NTb0P1!+q|ߘ TD(`"E ˙;w=G|W!T[̘i;3'$[%=[8S4R9Qku7*/\w*QeO{uոzm#CR![Br'-/rBcGrmad:m Kښh>wkɕxP6~x|!džVf fXVBlCL.L%!bbNJ]]!Nc<5cw@ h'ٹčhUe(-MpN1DMA`ڰw[ <X~d(]BRYYzb}@%-½]sG xOz޳f?>/&Z@$[.2"=0#`i~eqf=/7"B<Dl[Ol/秧өXn0=Lxbf.8T6$9&bzu22m OHDj*8.K[fRlȖxHk;14YFp-&᪘E3\"CY*1i(k!W,kX_{etMSvd߭nҁۗ;c_m5J98_Z\Z/OÕ&&%6.JscDyٳ\{^dT-(Bth{+OӰ8DEC:DdRN?ʽ.(DPCy+.}ܖJO3llf;xMc0%o(t252ձk/7z(vl*lnxuy ,Pau2SDTzFG#G tk yTs3t}11!bdZ20T&;>'KڰD8j+8Un"J.-w|s8Ie^<"pzOx{qnn_t60̘աZC`W܆agscūw3Gog,b1A^Ï_)T"aEFkLq c&MGG@NM:6Rrb!SRɺPM9 nPk^BB mbz#MS(jrSTCDnSҮ]E%"=J `uedwL1\6ڛfIӔV;,Qy<uM;Go2xkOKS&qŃy 3M<%8D& v=}"X" |`t2t$mc@! ǐi J?u_ C %^:0L~%?cYkى}y>OHk<ʃS|a?mO>q`9/L~zalQ)7m02Ռ7wDBPDRqQ4Jd F%΁ csaӄTMԁ#4Zi@P8Ro4燦' vE#P #U4l+"jC8! ٙVJ;!`*qS)69±f͆ *ݗxI8/H.z '2`ֹx,M=DW~ e#3x!GǦƷa~˴@/ee_gѐ}e׃M7w(lo`ᆱqV<֌kPZe⚽Z?hn `F;NP'n9dÔU6iTICkUl=mFKޜI'!~Jb|Q-&78лThzsnPuSTђqR(֠ve" @`# 8}C3G~f+ճ|]皍/|fN>1M\>L)\^䔕 ۘrٸB\l@ؤy5@%?=~G!Q3DL<ȎS KYh16%; ,C@ʼxI&/Kʲ r,X{,(qJ΍hKeqgX [֓m(ssq>*J~g.p@L-ށ|n`08xxh(_PLY7w]k/QbI|{&Ӛ1MnH9i qp1IcKAgk" ')UtfpЋEEw@BG`M6+ by-&]VI  yN5tSy\1,(^͒X%qo85H{i[R%;جѓ`:]Գr}9(yU!bGKko=1Ֆ%y9#9W-s_5Z 0,oLS䍅JxoͣM$i~Zn)K#mX,ޏy:tC|!2] ^kϰnn# x=nnּ&b#l6μn%YgAf5Dl| S"y>GndTzqjJ Hԡ0JYY1|#X<(kWr]ID9K%q5`Y."%I,ҫUCr=pnXJMƼEPU9NZ'VDžT" @-D.Kz\&=B!,Q9'oXOYIX`@\]}s5 Gca?IK5AvJO/]o xS8ͅ Bh4 O["9; ]'g31D8gZ9g`Br^d*ountaI S'Z) H&J5#"&[p XJ-uYlpWVVMf*"R^^^ͅ T>Fmr![ P>%&vcc3sw{r1ƛud$>u=Ѯ.n x.4*:s{[dqǂ Gr B~(+~Ho1*(-,Ljg%4͐ިYQ s[lj5}@>L@PcΫGSGTRȄ0YA8GL`VAU K>BH^]]VuB͏;Zchp:ne~xdd\Ьxdf_9C_p˔?ϥ(4>5;;woR= gl_J'/LL?:]-s4i6Qs|yhĦi4rJGH͚?`5iF`8\ӅLΧcQ3Ştdi>dGoW2дLQ)ʖYKJS8H_QV܃" B}v]<+@#ӥwlk' qŘVY(NܚSWDJ^yq*h(Nj8ćwˠП #SCp 9t#@$n7f~pKsuQ?M!M:)3|] CIw?rQׅ  Mz]vO3;a)z\"]*TXh)WϚ\tP#J}#a)EC੆Dzes|5:k-`+kBǶx Ďlvhlrfv71w?eP[3\p C @#D2Z#,xW|t rYi,l|rhwM.=75H؋7\nx?̑h\rCC!<3GJ?|$;x8?|ǁAy``f ߿@(at>4owM{]#vՔ:كLZtYď6+pզZ@*\.o|8XZ`+*B%5,#2iUdu@.GWqb7{Ł!oxtzi#=P+G.Yhwpp9o=vk0پY^*ݪ]_ʴc{{v׽wOvױۏ?~٣ss G.,/ SS3 wOOO8>;:6>>\(Ƨg&FG&&&'&&GFvP*D/\ѪݓBҴT/T,)zv5h X DKf,ϖ!GDKC7-ٔ[bUfa1IzuèЮx]-L7z FccGnN=YF/>3_]|ş,^xG=w'Ξ9󃳏=?:yo8|:fZjdX`*$"Ы윤<X 3wvJvJ/<Kq⮄`Ie.Mgyd2,EHFYeaw(߱z]׋c;[[[wflUr[j|I6 KS{w;o7>[]kvöjO7ugk76ts62ꖱT,T:^xyڲ^\2+WJ޾?G/?J+W\}^e%skdPNoPIQEr*Ck;G?ɔI xij(% d,Dd/&܍:KalqGRNxڥũTk{h87F/9e.^?Q,W^#q໗7fgk|ɍ7>]_qcՍF^_BϮZյU[ZUZ[]#x28LL3i͒euyl?q5[چ ,TeԲƠ{ɛjKm|,bXjvyH퟇}18d68]7d*MNFE2R9 u?2 Eԟ=W /g{vg: _j 񶶱Af+p>Zt>5mͲ!2I e[n_=ɴ_bhѬp_fURiI<oNˠTy$KV؉T~J'+en)-aH_]:wD!"(W<&" 9DdPx Un];T&rO=vM3?}Y/l7k*Ygmc J=9_a0Ejo) D\jZ֑tl?yO䧿Mґʼ]4lʼ7tl:z)F::M8eU(ؤ2xFX')1aժI0,;STb{vy L~[_'ַ5ƚmŷJDžu:QRt}D OL[qJ| 2>W$Q4e)PX>2\ Z;BM;^w}V>Ͻw -[4fF#ɖ$n'R %doBYؽ7MYHBHĎ{Q4;1gglK#D9y_H!-#5|GkPwŋ-[L^|={,Yx w.*? }o((( *4|JV( TL :?)L',Bvn9yᮮHs=ta|ZJgߦG//:D2آXeX%,iCfe mxN"1ףN $@m7nZ"㗔=xA K S}F0\dB(X }wiw8lE@F_z.unĵu{_DjTP!mtL`9h|cv!@q Dq؎4+mVrhXwᾦ ]"XR.T1-ZU`ñrJGT;eU`cиdUuz'LF,-YP@a~sϛT`|H9HqXdNYqydbZ;']JbaXa 2>̫sbH;A (g db1 |5,]֚W MR eƯ( T:$Kls`tlE,%WJ%@L)ܸB^CiIO #lk[Tr57m ^)'B[`Yg28=R L*`gnɟFI>4xX4Ѳ` g@UG$[la:H E7’h)Id|RTc s'uDκEPG+%C, 59ɩiq%a$\.F:b hq;Ƹ7BKXI@Y.1D$X }%U,˗>;Qw D99qB o;rufBW ,b$@QB},pwHҨ\I̢  9 b1 z\2aХ2qRhWvoܰa/lT/ڌpj\.sK`w/$қx[8噑H8]~ b5W^ ,ZmSHxX]& q·%1$3fc|d'r&n sGe}Bz[KG z8bXLm$pG[[EK._v_xb܏*Vh)+{`9ZdG5ˢ%b=&<:` yx#=ݑpdɏȱ9 ./8ҰtY@'4 H=yT&D[D$e`;A$ UdQ ja4z(S ("h:YlqR7~~F_g_,W۲e77(΂@v !e-w u."oOeҒiz`>‘'ii;[_y`Pog>aɾ}XE¤]%/Ti HSw|fHaWƅ XyïKhtƲlٹzC}sK(Qi&pI|x!ђDH%sH-R客/edO><ݜ$ZLwN4[Ò-;3œurоٗ!].oC"sho&FK远QR NXG@Uri^,=Ըlo.X^dYr .1W)VhYAIw]tO}%9=H++ai)LK B2ǥฦ;4Rk#@آy틼0QduÃq] 4IZ KۥDrTm,*zU땰N|qK3bh$Yo \ves*w KҘo0 s!yAJN_8 9薦/)3{ef= KeU.m=hlBke3\608ʜł)͙bKlcHn8K?DckIrxG5(D'{dU\KRb9n/z MK+ͼrc1-w%  Mo}o/_tɮo1 8 O飴jY%VBr ϗ:2Z2,῟ wvwoJH ;[`tq2%Qd,p-Y&:4/ ´h–mρ e5Y6ekYyJ\WKG}aY[E̼a}[RwXKp;ҽyJ G΀٠*۷q))^uqk_H -{tcX,af5kRX!q;\Q|i6ܳjeS7Ǟ7n@lh;&99D8/j^0%X毊9\*/X;5/eS!- _ k4 BVP8!ːtMiٞ8i2D,QӪEH5l"6iQ!ڎ$Eg_$|BEa^ѱ|y` ~/hmTQ?+Uc%/N-F:iNW:'tG#qX,j[h͝pȃ3;h#ݧV9) &RIҸC}` ʜ.9`_)m'X$pSYV)Ps4|"(Rxb΢]Pvؓ'>"QT=}z< eX(uM;|Dc±H8dK;A>' 5hOW@5/Ll`O ܧ G,fj_Ga)&41 &4AܣSF%w\ǵHa0I >txρ8^(C%!`M"W;E-%5#Drxω"{`) qO*":E[]/ÒrFG;֣p4@y%+xXKN;\/ϥ: KG-agdB B&ԁz4Z!q#JGNfqT-H>Md6jhR$BQ^Io9ˑo\Ey`jzC|<~QbЪr.&s[fxO FquTH-mfhR`)JW68t 6# T*~v3'(DPeDsH>xpWT>& x -wy.P N*(ECy8YꈊI)n,SuZnLb5 Qu Y-S3!oPҡ4YS׍{ (Ŋҩ;X?ά1C̒Lh+l]pL=|HG8g H )e5F{$caB!ڡ U1c.dy?2uCkM BX4ʒY4ol%l9 (|,cTGtbxS6T}PJ BXFei %1QaF:wj,h/m4CϑoFNa˚{,KgݣV& 9eY~ wNlқ@bJ̦Mk?8G+gtrvsy5S#'O7;6a Q9c[P3U܇oN~TԄc_7mڞ c@BA [n41c9됐1j9w_@a d"e6Dž)R=5 Vz!3:tPö:[D6=,?UEz`wT+v}w K[y͊Ebݑ_:q%U]Y =&{TFTP6 nt EZ rtZe,%%Lg`;6K3,mv*w-6ۘʜncП~/_bX ,GE5?eX.sHߨXb!HX-Oedk6cy,yE ]-D+ri '峱.`̒@LŵyI\\\q7NMa~K'Pƫ]?K xIJTYr֐"I[Oi]pwӦ#p2u*n)_37ص&sqM2޳v)Y ٠ђ/ઈ( SEkA2m"-f K@ Y\*K%k^NF!ArH9 ^7wƮM@[{` /x![eXԁB^ޮ olIbw˓Q]yM2y ZV)D!E[^Lh/ >aZ'kbBWflrxEOd\rHk _ 7nacHw,hs װt0^EYD 2WtJ@16ťIjބD{Đ4 Ǹ$Z)҂62qfa>KMgHmj >OQɺ-a^\.Rkvz{%K!*pYۏIlfp#D+uVl!O(ThUbz fkj&/1QZ\u˄JR'UcJ9\) 5*iIBF]VB!( 3wwb׿j2PsS)Fgg ˊx%,mfQjE43uCT`i^`֋F;ldYhi(TS ^0Swu4* J#\u9U6K Vf9㈏N" bڎȕ6x)MzL6iY´7PqV_[A&e:9UQ$5]%Z:p S+7EcݑտqIev[GR KyI2DAd' 12\6/rF$ͯL~&W]TԭL&gx<b5&Y#ʌ[ hblT$rIE"wA\btXX#vLe !R0QH=G.rL@*W5+[lMNVC@4y%h WwlBQ$^;^aI[jN]`JjOLm=4+2?VzvޮP8$ְAFecx۱2-'< [u% ' A m^cn/UCTꐚ:{ɒxCSO4 5'`r tt2IƏT^/`7$+l$ܖN wEŸ ?l̃Z}wuё5qå uYNJ)\0+$t$$]rےB2wF5+@-ao(%N'F#SUT5X+z#'xUD|btwv#ϼT~j|(kHi3JRh2'xsGr})coʊ%oGPTfv64Zp85߰ [Ӫuicg T_7vŸ{ɡjCIs"Kμ@:Xw˚F[J -B"ju+nYJIGw lT/੣U_딊P e(9i\ݲ4'bHgMo;@f/65K& ֲࡐJuqX]A/HH6\.F4m\Q1hӚ?Җ窋p(Mi 鑡_@Fv(Bĥ} & u(dm` l@d`pI4䱐rƤYZsZr-DM诅[vŹ9krϲ k9r=N+$DjW? M$K_zPoAk{n;hD51/E@*rަtĈ\yc5`N+_Q,lC"UnE0GȒR@IRMGq8 /,R' KWv:]}RXiy"̻Ls4& b mO&.m&YB}en>,#,m[FZ;8NN< 3X+==p=!ylGN$i^˼0.,lhTYEŀP&I r;!\JSJut-/m٬I,Z^vF` .8cˢ!*$')ݜ.<3t:{n?Jã/ɖl%8ee6QOFAV#|]e"wKdHd')#e^@QҨN[;XQYL˷K Y>g|#HspLXV] Ҋ̕N;v6a!j%eBF0ipqe AրC.M 40+e Y ! 0F]ME+'/=Nexc. C$dč2,Q 8ӿ [ΎrTbmuY' +TF~±6Ě'<$ݦa !͠3%)7-蘆m"cYʑ=N,[btp XfEʬz\!p#o YږVVΎ"6"JVz`ȣ/"@G "a[x_#NGc0tX$A.gDHaVFȱE4/JQfhAmP/X3/KL'dz i" !]E;#HWϭMeg[t 24'@ג>`m$q+S*n\n[zb<1M !-Yz%C:.7Oe&'zfn…GnhH&g HT\}cG<6H0T;9|\i3XwwO-Oeϙ1鉏 u#2*jɂ 0/KQFFRo{~!U_<)яW4 ) 6RLv_yV1G"a7K&*Bh8<:jD3ϲ&DEZn .,pgv4#kHQwʪEzI5pͰN_,;*Z^'onWd}bHgghM']k> iw[M܎ja r$hD˵&$O$T^/_>j,4=Z5#Tzگ<hԛyNO}#;d^ X\֊`2K 8LiF`iИaAr#K.yBZt%>7PrQH_JɑUT}2=yǒ`Y(6vwZCѯk9q"oM !:ud=f- !N-)ɹI.zBV G~]ͤRDuoKOP[W+JX*\*XvG`${Ǡk5 ByÀUR&j-'6Ajmb|Yt)6N $0re}A\Oۜ:>M%3CUr!4f&Pl}C%b _87X'I!@irsAҷL[3ϩ΄aSgbVfi-]MUBV^/,S2yxxǯ?z@(|)y"2_|bcG{HIl`4cAdWELkr/R P%f[0|u.i@cef0C#ms%/FK7j?yyX Ps BS PmQ *M 6B M3Jhr49 M7UDvպ4vt*AQPA06y)f! Pd; AɰNE/Ji$)HTsmWӏt:[?XV(ʂ;؞X0/uM+VKlCBU4E0yo/ 2ceshQΠQc*He=<73q[L0U@m"lP=vhl踣,ZB-]?ii*KtsL6iP! ᠞ ^'«Ll9ڥ"(mTz߁%c N&ᩫ",?0ZQ`oHLxgq uk041 [6%ƩP"Hu*_·ФN2PIC#Ȑz#J$@@r$H(`ՃD>L4 [OPWL6I#>L/<85_aX}*{A3B0*8f @BUh3g*8-kova'[=6TPL" (XI À9bT!ix$N ކG$` 1<448p<l'Gk K _ɁÉzz`(LN9pǏܳ /_򫯾˯ګo;o?tɁ821RWCgQw+6nJkSsKKSSc]CcCSk(4 'NlljimntG]ݝ-ގh3O}곟/|㍷~ۿ{æRUs봶E:&LnoljnCMXX_Ssjj&NPIk&MmojmP0qJs}M#tĺ P;fE]|I 8u:&T&MhPS mUh!֩9qB]c}z55\2_FfBM_ĉ #p.D}њZ`&MD=NQ3I}:IP_`>^}ƺFƦɭM-x7*x_y lQQ8W0?/dℋ?tч/77+NR QRFI u*֨Pp2aŠB ZS/QV1sF>k|ZF::|絴477Nninnmē;u-m5 wy‡>t _ C]|IMC:SB͓Qz)-'vOQ7+׫T(U0W&Mlܨq-:dCd:aeM$xC(=A!^QB*|=;+&OnL}˛TZ휓urSc*J *^rч.F=}}ީ}}=h;uǢ=XO,D;;;#]CmRnkm MuBmSZ[:BmPWE+[?4B8 :><~Jhrsk=ԡ^Mզ^E~X}Pkkɭ[LT'Qf0$4Aŵƺ{TĬm ϸbYf]`y.XpsΚ9k^~͛w͙={ٗ_1w̙sΙss̹]623.lfξL.>|՛3gΞuKO>}i}g^:c|3OYs.7 Eyz5[i3g_Gyi 6Yv [%oB/^rɊիV]rW\|ي˗.] _x+-Zdz`ҥK,[pE[H3 ͛{s-Xh!~lEy]0yU,W[pzE]xʕ֬]ju+Xl*yK/\}C ~~f(6XeNu650߸+_+_Ư~[n7'o??wvɏ|_k+5W]]ٳeMoZuڍ[֮ݶ}ݛپ~5]g-n߼n-nZf[o\};oغakܴn5[vl޼k-;mޱyˮv\k]^c{^w]n߲vuVYb^=ϢkW^n+ڰaFUy4;v=rw^zWϽ/W~^|7~ٟSO<yzG}}g>ȓOww}?#>w=w};nw=x߸yUk7l\fmW-_ )=w AUX[`:횆|c ʦ.Y7qӈIT&/1b'94>9qG=7)1O;<LdN$dJ&V|$NJXV2$Vvxhā~cV_xoZ~M֯߼mǶu+-7N?,9Y8sq۷ uL l2cfi;&ɛ((ӢY+MsR.dD3UL'IP&>@Zyء g \MLvGue۴y;wlX^rr{ǔO,PHʺ$˺5  Pp`:cX2r.tl&c9 L2AFe=ptZ/Phf*02]2c8br%J)DQ,nB(J1ɓ+.x[X"ѼE HP \VG((*(DVUIսޱc-oZkekσId"okUEy56%gR=]d P@rh$cE˕I &Q6[* :EX$Çl޺c-6/Ni<}]QAe!YrbQ4Rf!u3lvq &uHXe `5xdQאck3C(am'1tlޱgpKKk[{R [dY3%)a*!X~' yE$Fu8 Փ֊,*\eGJX:+ c<̦UgmM-m*ZKb풕! I EɵcZc%s 5\X W(lXjrU8hNT޵kΥ֙'RCp!Cg6;wIR7o6 2~EdpЬ#a$4 $`ia*Ǯ$R~:UUt9m۶.ii6'G"7D!Y]p+wY'`}RET8Y acb )619;:Soie`nޞgK&75D:~4S1D푲)0@w˙H$C%KLNR`cZ4tQC$d?j9 L&Yݐ8K{Z[Z"д14z1AFi0szd}pH Mt%^1?y%Ls[;KqgP1^ +~i_GGkGW{M6P: Kb5A>:|%v$ZrAM2"cHxGyv\Gw%}<-Ol?tZsMJ&OınI Wcu]|/8~@Q能.MКԕ#`Q-]?*'$-KwNئ\ɤ%^EuKi6O㽀ш M#e+`7Jr߄r(糍ԛT^b27mY(3q։xgq0 -#LфGfJE!>] v'Z&.mOi;ǒN<:ȓr4OL+!o #Jb*B KX(b`2rxd3֍`ڹa4=2ρs!"TqTK%XJ$u)C}N H ANz2fv[CBfZ\ǀ 5)>9e#(?xN7ߎI|prrlj>bػ9"?V !!|1ڲ=nwwUefeVe}X 2ދah'j5ն"2"^Tt]?މ]S+*u%ߒkpLWY@vX Z]Rڋ` {*L/ūt-eMTqI8I /oWuk(ץ&T.o87VZq*a2#-V>d`UZH"_~ZXOS?G|=.dV=%(h|J}gc2BUN5sgW6"]n>'v/3͊Xړ\!-EENMG+/ĕGLEw qRz 0Cl:Ty9WZ*igj& o3P*j/d&UVTK!adrJ\-\k5vg-dbF(TZr>̔p'2(C5I ih{r]Ƃj* \3j'oK)GmLHI+oU)QKTLL oIp{\65qUf`O 4W YH75 }]V5![;pd?UKv.xYs?^aycyS.F'zeBcT/Brgu=J #\$UFRA^DҒ</ [~WGR ?](I K<9FaT{: }Jp6m=&QZu4CF-e{fG[V52gNyoh3\ϛ%C+},y?JۮsG1(n2"\jT5UmD֭\Jo {Xiq< p[oNOlStj d84C i1hVsa_+52+9Y}:=H}{c959%Y/]9oh' *ȼLO7PcW>XX)O J$J!-(! 觧 `ț= riIy9:rRGڧ)]F~E4\.]m2!"_!j63EMYLhǖqC0eo4|$թF/߈(j yț̻ϸb Qh1c(ˉ]DEr^ͼ%),volO]LZ 9`Ru Y!]2| dYۗ2%Aܦ8i%ER{@Zfh}{x*R %9YY9quG93.4G}ZtYb39RlJw7jYX\&?irjȗ0ʤ`Jg"TE+4ATMbal+U4Ľ%Hk-V>7IpFi5IDn=̎zLrGM|[MDhRFmt&qVƭv,uĥB`3L7hnxD(FdjqqmlpC;G=o8OgTƳO؜p0wmގ3Vi)0pZU3-c6n +wFi%e݁8I~RwO qQzBuVjZkHb$x`NFԝ_kH7w2ze#ᦄՔBw nQ69Q3Xib%ȻGَhv wDK!#nC{lp'2 +Cϥ1Lz֟LT;(E=nEᵝ]Um쎣P`y8{l1;,w.mJ%0郄H9SB/?x%{Wl q÷%v`4-5BK lophGyV 7} zN2VN8AR G7}ՋK@ÃT8{:[k˝.6+t8)ĻicR8{sduf!avй64nߵ]ߖy]]=Xi$vϞ+iؔᄑ2#)B&mC:N15B,KZ{{'+9i`y1z>ث=ޕ|Rд s1.VӵV*^*|qPu0MZQT9e;0;FAP]X0 ʿTBZt8^V Ӳ] DZ |^*46:iMBsQtr yiYxTFU7MXa/m˱tK&FcR K۵7GSX~ !\Ǵfp -=!>|qmuQz J! %G TaQT Oh f8y/.7 8/:!2;HQ$'RTM #"HHr5C2MTp=[,1\ze;:TXe9bɐ5 ;CV2 h%#P;^=xp ERߣNGx wLQRy.z*p) |xDv%jr8lI=a#p¥BFCYڲCy,"7q&G=I$҂IsS0pR 5RTqV:SWxM/g+0K~&| øq\_coYq7B`8Ă e5jU]́Q\x'?z_Gy_swxę''ϝ<=sfɉG8>?3=S>_0ʕٙ鏦f&G?[o'[wmwo|w|pёwܷcC;wû;?3;tÇK/wo/_~ګ|MTU* t.ەd\S,]-MBoOT780ᾍCnv 7^}N E!ݙg=4 h[іtvwdDK[g.Si.]lMeS--kZ[RL& Lk;P*]쏧pE"[X׷2S Ů x ݽYd[6Օ \.3)i:֑ \DXrLW6g=p.-?mpۙʵfP"3l6BI̥;;RM,fl.}_4#*\qt::Z|e5Wimmi]:_hmҩ 5j|ӎֵmmk[Y"_ȖJ_*~M\W._̥R H'hfWsQIp'Ѽ@ QS)*OwSl&3B_W&jo^|lP"sfsPq RxݥRP.ŮB>/;UPXЃzOXYo/L+^*|vLNM|nk_n֛o֛zM7ݸe [vx p~-CCC6 oܴoo`̓C^epঁ 3S 3zoӟ?믾W/~C=SO>{C:?p`zl{ttȃcF=}{l'߿gρ#ɗ~KψBM Cfyt5<;0{Թsg&O<Μ>ṳ&N81>q?ujyȱ9rtwO+Sg:{əԹ Wnha3mjٖaatдByAjp]M;[p \j]C7L;ժBZV ˨ϗ+7f`+5i Hgݭ2BS5,f(~!&bSS$vAܳ+P-HzuqZ{[0_.jD,b\2*$W0ci:kYZ +p8On&3iEӀKژkc$QMi86 Լ OFȵ&pLW8-B7rj OηLXd dD!. hr҇|7zw)@>R~F}PHK/<,8dGg0--cඐ󖔸h,Ϗ%+2Y +$#N]-8ZH,ϣpiS3Mn뉩9<Ē!n3Eu߱\Ҟ"}!Fq;< W/W=UvC46Q %z<u)qJI^EC1 -ci$3άRxg]Rv̕˺<{t_$Z S:lI-igsbnԗ5Ӓ8Zj꼱'o2IqB+R-]՘-OYn@P2,ieȊ{GcRM$8F {{93rQJ1-Ŋ#!ZW/w& [D<;;Lh $2"Q6hH$sH;^y8}Nr'#?6*6$#|bλ,%_ 2/y.x]DwOp"cϲKWA:|I#e vAʅ6ףmi`"kF.<]zF̲( m I(DKyA=11$}b?\">()pK+Mxqs1[XaCӧUPΫ䂼dM^ˤ|RS| y_وD7eùPe"<&S̝?{ٿ"ˎCZvL}bBo2afR%{w[RDC .eR4rI%Gy tGM]ZYϽtG63| HJ&zI)ˆ!j֑O?6)(GB#ZJ^qlwfHnD(Mٖ\Unv9/r†Ւs5K>0egdɓ`!Y5KN}oIh4f 6է022l6Sxkb[./rmR.I,),XA 58JJTOŜX$ ۱jʫܵ:2TX1<'˝ޡDK?%WK+;W E2ٞ!c.-/`)H{ЗZ1u-W Z3w8.rP,.6"r#Dx\&,P/}KZrx~G:;)A-O=LSxpמk:pNs؋sQEQY&OuLL:r,73>Q|D{ } MvrTj3zV#wn6,͗V|6Tc&1<%1t~MJ(<9L€"m-$T2_Š߳{ֶ=.ƠcT&#<@Iːcr,} H-&|dI/IR#L/\(G).xǁv׷}pk:KŮػ"I d.j}AHۨ,ɥ+*DrXʔt pZȩjrA27 [<ƶ5], ƎHzȾ״ݽO 6i4Պ5gZ _1'ZFܡ ?)n4,n u&|eaRUf]r|D dkwe;wwwy>]ɏwvd%Y{jɖd`ͥXU,Vq'jmI`l#3 r1FSf,B)Ngsaݞ1ipYs%2BdD &|i^1Ҫ6|u' KgoK]"Cp8 ja"jUG٧QUf[ZY Ӫ[[[/?±_ҌV3ǗXjcViS8}r2SP?>̇IkDBh8q'"Y?ݩ9ھ63kbT5ʹmèAI~ᙃGnʟ1Nzl"aE7y8J\cƑІY.4brKhKp*ɣ@`\)2KCca%^s7']Gc}*- o?O[^JW4^w0,(yn _|ayu)( xQ\INdpĵVe-Ii:@IQ̿#p+y68i:GskU^wjiڍ͋x܅z08a`$YP}Xs D̢ܖ3h#9#M.ib*أDd`ӕJM72dNͶtn~# 'Ͽz7!- c2rC#S!“(G.2XruH04u"Jgq_PZEu^VK|uWaZvͮa5[_tiqy[TK5ZpD.lȐbvIďxtU7+ULLMz%SYR[كV7˥╷z,:䗺VXڝGWNklc"BU1cjsOqE7)jD53|Q<61=Av"%\KZ*)X<{:MX,^|ʥ_^,fi}8ͪ;xbi䇟Om,b IM#<&F XNHܷ2DU$>))"D!OqK(]%߹?-yݳRqX\^45pV)ṯ>|#N_N2)iV7S-k?B@`UOJ7[8T bB,SbM(7b2L^C3IYg8D5^2{xz^*Jŵ^\[ hժʹsM)(8e G.,D(rRbUxז;3/54QY&*V&~6o2nm[ӍeVJ2R3JRbƙ}/}3 4T}z4ݝ{y3ֲ˚jXKkz b԰f gTĜaf)g;r! )-i#,UȟP}#.˥se~fb" $JcJ7V!*'3zs55öu(p*x^YV4 RjxBaԅ_6JcSI<u>.b(?et>9gA0**Ǽ"5aHR%S#sJ.fr۞A֬Ubv fn7=S7=_XXZ=W)񖮉%LKܦ,R(`vFD"9j沈FxC}KKǠcsޒt%%TP?N^ww;8~Un5~pųOI\6"jȭNG4i|]]C!)`9ʨ|&=EqiU;ҤTgQ-q12kYC@_p)X3_+פh#MI΅yۑ-f"})IՋmyvNVo4ضfղK^jKef#}=hWmDl;brc,4xsx ͚Ց4YczRDRJ "|Rs &j\z7;fCHH9zfVtRѹxHPX8_1 eEZm͗AT8s gcv 菶_:|K/fhL6b h+6v~xypjuNMdXrŨմJeC0G21b*9 X+1X&Q3iKl7@p/駀z,F$B[fKIr&fL]j[6ڞWwFp5i4\Wt,ê6A7N?tʋ?0 f[<Gf\a_F66:C2mkm\z@^|+`oT~Hua531a8!WuFbLGb# ?4\d&y8i cd;wN׆X D$Nb9²VsF, t6_|ⅿ|l9Ƣ+3X(5j,&5t,i!7](Vno8hx2-_+z噣 O^/}b11-Q 7E3D\ f}%r&Ox$,, #WA 6k%$$r~ iη'ְ㺝akn7Q5Vg05zӴKgC?r_‰\u1 j0ՇB*26,!eRY,"&%(MDߍ tERDL4o~w:4ܺllv:mPzנ$oA"zӨekΩg)^Sn1G]R&IEd|QPlEBٙ`$`f K $:Y>O޹ {nv{]v"XR/v︎z[ |aai?I"i(tX 8*Tx+T2mA3TÐGn?1֤FPJo1Q(F}_>Y{'m(kl-ňnKb\-eWzUsضr/?afZ\LyZjV%T OfL@|餌B>F!{Onygc8'XvN XBI:tU{Ó/.._~t:/+y&x^L7U4rXMœ}C@Fq,-I( :GB:Ey}?|rvskscЇp1vCa߲PD:LeX:uM-,+H`sTjXy ^1y #,1(&sTDDVՀ{P'e( M`B(M8 F;pNnt1*DjFÏL=#.O,:1x `?ИDR)/sP\mD7bE`.l(jPgy$tkYn~Ai` 5ŻBIpFr2!4{]۝~*]).C62/;˲ww=v`!``ό1KxssλogcBUU*"HIEZUmD,vxrΘ&y'=c#._v׽p=U p e~l͢j=&2 =-^mFZۑ"bm0t<=>8Hw]zI{pLBZLK6jTh0Q1ݹ폒ݏf|p_{q𵶶7vZQ,Va2-=/l4Zzv3M\zϿs3A1JLNjCv"L>Q@FN%}e2/|\)-lNec~M?ܹ'P ݌/qwZz dlw[Ȏ!V )Ar|2-e#p TIͳ%u(}MFDvo^MޭOf{A)] T5ȍ cc#ݠPHlCqat!#ujңO-=?w%fB sUamVy6 P7[2ITK堯5q W+R.Ǚү9}7ܸ}8pp ٢6sO31t0>HZK׏\~w6N^Nb,K'{?2xf@M]2u(_.\%Òf߃yz>Gt(-A)\~odD֙rէpk@\76މqhu3Q5Q1wlD]zg^勏>urnak돮XT3,eD7mQAe6%VLz:9a "c ,1cXfӨDS.f5V^x]A'|Yn;M i e)XMMyԌ3)\+|N;$QOJeS% F28dqB g{g~tFeHuxPn@ ~DUohWط-t O-=7b}__Wlg0,`ɀ2mGr c+>Im7R\))&1tyUuLW6J "Ph Y۩>#)vw7uqRʐwb+9V.V+U NܙM-7l5:vr}3sξhhd+\9$1Z1̇JTd/t oˉ/%QnW2-3'5SJ8( AjCt.mI`(#T a0 q̱ )([^0n,v-Uv9|߾Cx?-p$[L$jsɘZG5r=i fl͖'b!%HɊsk(t~{! #/!>NakvRH,`4<{R[Z>{Y.9g')rL3$ޫWAxdkYQd$Q\V +( J`R%,JNN)sY;d XdD8xQNqݙ/v4<(eh^P! QkFN=4>[Ҫ8~eZU+l,wuj//{ҙ*nj0@/|hs,H`D$E!dhg|bL$̣\xPsv ٞvw.To q. !NCY2éj%e͎[g{ȬGsҙ?3^9S2̡2S"\jLrIwG_$r~3@0ICRwN9.УV (eOWB:`Ogz]}{PTGhJ1NzQ3", cpZWnȴU+'NZ\\zg`zLRI$<+~xZ$"xdV5,QmY`iH\jg?L45_2Ş0(* I2R_ӻzuIѳ*<\E|³\?֡lB9^mq8"jtZtVclmTN,/Y$&ĄM]*>.![ WӹP`Fb5n:9k-|,ÔQ6XO h;ReG2V'x:h |dH6H՝Vɢ]W䊦P\MTqC'Hpk9xyu`B{ Wת ǞZX8p븟|X ڙrSrU+S\%D)`-kˊp=1lc|D 3# K}2,7]iGT/@ȊɢQȒQlefn9k뫫ewV꺱rŗhglZRp(]A5D [fY1%*/"ݐ$RkVH\w jMbw>Ϫ . -c9_]{V7:-JōRT EmPRߚ *՚٥U <(ͭgꆹܙ~+a&FDs`)7}yq-SV,|EM HBKj'1,g"Ey.,e>HhaH. ˱g&Vug=_qmg+c5w,]Bz KA,(o ǻG6r5kK͎}uv`G4, .,Fe+dvA>&'Yrk[u@TQ6Z(X"kV˥4bdK6K K<!؇z~8_?};ؘkI K"`G}%kUKsIK1cQ&i_:dDi9xR9_pjph Ċg9l,)S;9`wfq˾n `.^Gu90]*_~zɠzXQ :ЩQ*vl8&1k*^A);^l~ĩӋg.P=XNQ֬o[*''CLn1RXET%Se4r^ bPCPR-£5Z=כC~هuEa4&p/% 2fkUK7n6rl XﺞS1Ǟ_X\~'7|@n͖C5Nd ڒ8O|8-ohH'6˅;ʕ'r`OtFӾ<Rl#JGG j՘0Fg>0_5<َ ݧ&Ayu+@vY(P>n9xުkpҵ0-*gVMl\m0O-,[PN_IRbMD>4KIh6D+35Sn̰dɦ)kvt/y}Bo~eu(U떒b,'cҮ_q(Jg!ltNsLK9t6KK^]+UMBZ`n؁3teifm,+ gΞ~GJ\%Ϸi|nu;,΄$fVdnqhLiBߩ+XU-eH0)[@ЊHu3/v6u=_OIp~ҥ]<&wġa\-]5K ǭa`Qu?yjAOjQSGzq8Ò1R K7SPO Hg0yRDRYvܫd?̭L2"l2N0j69= -\5*]Z-l@5li7#Jy}lyVb<`sKÆ$ ܭr:<g쟯R?T,ޗ(]*FXS)f)JpZpN$R>ufȻb,]5,ǚ.i!psi@v?BQZ?w^(g_mnսZ4!i[aRZ0uRFV*U K`Kk5!tJ HIV0b_yOFڑ5ahXRu H,,8ˌZ$#ƥ^J$5 XEnY)ŜQG‰-<'\gg"#,˱kߛ_mA]aA,*4Jim(olYeƚQ*Ϛ&Z}Zsk.VbB̚ݹzmH6 1kwo{{I, 1AB$A&HxC!/y 6{t9}u"Ut1v{ۋmU}U}U艜NP#\\ګ~H⏞m\|ߑwDGLyAt(ırd%HH8M̉Zl LE\0(s)?dDIkS9TEK>ФOF[!1nЌY!68arxU)cۗ`Cᓀ2 3M JFYͭwAftRLӇ$.mP7|vC xLT`ir{5CK%( Ct2[[y۫.4 ¡Ǘsg|9@V&V&roURf6Ha$&ϛZ fLLjӲ쀀.oHor6SI6γK0.ģJ>/uW-_{TZzJjKT**2V.QL(W1"He`YsVѳWs-x`16.M0U$R#>jC8OXunH*< rbr8ɜ39wM3b7=WةypHlw;N#R3rJKVQE=Ӣ+ђwNK52ez7a݋"+y;=tfu5wxӇj\ǹ2Y *HM`9D2%6]7M֙:klac$!D 89%{&g>ox^k5br|4Zj zn9+%b>k zO)C -u A\j ?UCnrO-C*GLĊeלIr-ʓ:z*qq-}#K i:ӥQ|"k& é,[d27@j((j>$>c8כ24 ݃[!s AXk{fu7!wD'hҴKJ7 E%[7J%41nXűTG,}B98@;Y*Yv1!QV:f(q%.Ҵ.GJi| 6' ii:HTZ綊(<ax!`W5/'>va9Aϡzˆ<-6C,Z($r*4W,Oh"x'kBΊ :D럞3^ Sd>:'ݻy{>X-ΕkWrmٮ(.Vhed`鹄rQAZ%J`8p8hGiwj< ˻GB`ؑ@G=w$8H;*] mKi%*` }g29*v^#:~2ygȅWf9fΦb6b64^~JBP‰+W]8low1<8eeo, AS g* [ıVv|@,Ceُzb=+g~|k"&Չ\uHph{3Yqho2>-o4̂3&d#8/{B,Pw-+3nC!Q#Ԛr2;K޾y@΋׮u[7=|'Ģ%l$2J;z^@?^"NlPe#)RR%|QRgkH4H'mOf}# eG$N!}\+2ZMc},L&`e;kR=9720?bvo9/O<Bbш`!ߡڲ+I!}6"<0sje&.nx["|} J5B8Z5Z~KՋd7\4v@YRӵ\nDK!oƨ",/mf!:ɢeVf zќ狚ǜgJn[DG 3\-`wn|N/݆:lcn$)7yH)JeH_ ıdUrR!!ʗ< FٰXS̬Qn湇?qvi퓗~ ^-͉ MKC_l(&Bo[<]$, 1nĩRy$'cBSY.ML("'?3f]Hwwo:GF7(VvFPwЬt9 Cu\8AS*nmRqyy!)蝮Se^?zK?vL=3kom>~}z[Ãr &J\{jwDi{.¥3qФLM9'\Y8n ~qT*n޼np#dчU3d<q9.罝,ZqIM3LD5p ͱlߣDDG;?Ks˹~}>*0 j8 KiaOU3qlF#Dm5ld(&HZ7{?uG7:WLT[Boe K6͔s7DZ? 6>C<^f<ό >>9K._x,}y}W+~ahၩ/՚TEQN8}QK6؀aJ*)RÙvвDR)\?#8P;O=]e WiL̓xvW$Z_홏E;4aU:lv-M(SM46YmKd"N_@{$Ϲ 6 2}\nSt_Kh]>䴁ֿרE~+e/B+Ve nE ,m8Gr\)U3=v%ղ~ũK;vs{t,J\X8CQ|u ~VsTf4YEaE*ĀeVFKf։ |HIrr9%drBi``7./--o<~&7ޏ: hA'q›j'R5fkNr S2*[V2.+hY~mB>ZxieyKB j_!m%|%J-ӱ2 Zl'sGx"o/r1,|:M hIdqzgF.GT[~ٍեKT޺6vvj pٌ!"f_lu^SD£8Hy-eqkK"I.ueXiAtcTZsKKOɡ sX>p` d^嬛j}lLL ,ewxՖeXJ͠}v]'$n9&@pMX]6Wv6_R,^^RJc8e )N&XR@J@ FTL@WB&T `x@tX*.]r+^x#gr~o7"Ƞ2# a_e2 IaipYT-o9Cw3WT0lFJ:d\ u{Hޫϝ,??IVHHi@v#,[{EA$)G>) *@`P)/Tcm7{%ᕊe4w=!LsַqmaVK~>ˍZQ\[_h\P)Sl{~͢_M\ZdXRGCOۜb>+ ]ڨ0 APru,9KO859~? z@PCzFN͎=RsI$qshn6y$: RP/T7ݡq7ٽ<rcx.*A\>J5wW7ύ~>*=yv@Zjf0mkJkKVrۡб1u[JO*LU-7 }|^&@J6ki߿PlH4`a AM ׭ ߄iK Ju])ۚ},JN|S,jSnmVHk<7PJ+f.!SFQ0 ,oan?s%LQv5s+W/DTKcA_GwQ؏L{P9V+TF[=4=p{CcvK _R .{֚g/ԙV? ;$\qL_ . l$`%4J6oVB f@/v7Oe8LqZ5l C; #F^֎S`齻035=7ڏ?_A66Z `͂PeXnsRtvzeǰɱQU~ K6Kj8X{Ut"W0ow N15\>vӓe\MTB9&Z%2cӣM\'*QXr"O:gfp8,3P@񙭏`G`vzTfv/[Rؿm ɀ/]׷۔}1t, AlU9 qxjͧ͌#3&X6Uww?9v*BN>)vrh5'tHCӥAER AER@e `Z|726ުaYO9CјG"Pt7^}G?=0FxJ-fӃdPfX7J[- LDMŵf X}d^252=<8Hp<)<\kmp'_Y$p؄QQhӓ26+ԀQ\ ,xHD$c4MajģNe %J+cYr߽{sa`yK?ٍe~|xʕ+E6ؠ)] Z f;wV #ƺ&gE7I/26 ;ٍ|՘Y ,u3pɨؾ'(,xc2T_{qXa HfM4?eRXp$JEݾy@Hg!_ھfBR.HAϩ76>8F3sۃ+L0a=ȶEd:yq/Q%<x0*^ ׀|{~jfzntzf>iJ˄}zNJtL'lQ; K(>K !p8h)l Iɻ(YʋhG`ƞk)A?Ϳ#V]z0ux{cs!Wi ~XolԠl6*Ұztm"-)(,4"W(K\HP+ KW:qR UX~ݯ5OdfF ^7҃ Ze*# I\l|91' sl4itNaiBqEmKRV{t)Z^=`Gݝ/޻tf};t:,! guwq}YkpbΡįkkv ,uvkMGvC㪁ȉ [JyaVh*Yd\YDԝsp9q̫8Hmu K52,9Q xWÌsƜ-9Ԧ_><MY5dVyyhQ0Hkp  B%GQwKW=^lZ&~g֗5kFrviYZ^k7lVh1y:V-8CP~t8㊒zUJё%Z!k@zg}eȱSSo|$nr6 >R tiΚ!%*WCVe2 }ޑ^w=:J NZeOC+6szSjphyu(VO&'g_:{㓻iJ"#\N\z^WI_s(%{o[eeI6ݯ7KfE7Orp>;J5z\B\Lm,ͤXKu]FRF68%'q nR&3>$~k0Vgk"~s(ڗڭ6 "3,A8вVGSDX*lXRm̤Vڥ"71?,.x0R|ѫYe+5^sة]$MQ Q@+8 *6NhO%)]BqR!% I' Ա&5V]ˇ"wJulO4,v鉉sր/Їj\ʪF!{{;[[lo r/=FvۇNO5f>DaI:K=HWR,I-*7aTRD(јcpX4N!BSZeޠFѧ;q|b͏vB2 .ݎaˀ-Ere'r+N W Kޫh^|rȧ8d-XJ DGmy+RT_(Z~̙saAF3y).^ح\$ t8Zz!³9Ttʻ.lm-Nq-1!+r( .)8 ?Z*ڍvT7Dž<[pMN?ei0[>t(_FjKGȸq\ILƖY䀫\u H2x@ 䳡ikFǞ)U:сJs?ż6eCs!;kzNuƵ[Pm6J>=K6G \ڞF.U#lveut8weњS:/՟E@`Qz}񹙥ݓyfҎb,yʮgTvC]p*N]CM!ŐvBe  몱zӓA) Z>:vJ|Ȼ9V⒓(- :{'_xꇿ"iM`)G9ɵͷ6/mT'+` GynR!~ES0c,U\&_zlX)>/‹o GEU‚ײUr,*WD"p'?qb|ruĞ%ԓg}3PQxB2f;ҭ0B{> C='!1Rofb +J3 ~z` X:LsQX:y Eɿ!38a~ٺA;W0X~sTzsG^_{N Д\ e=j 3X3Z YLájH/3ٍ!Ԡf89zx|D2$ƇnݸT)hݹ"g](¢</w ΌK2XdN7QCs|+ H`$53F8`-,p-\X0JyDa)C5lɸI%MY(fg#zWN7Xν nd8!m86ug0"Jà~*+TV<ѢP$E=X=M 6䨶̡j  C^>ן}豓Kv֖]-q13SUW'Z%`$If,-y.j&? [RrJ`z4wb11vwGrnf_~&N(D^O6.gpPf!]4܄sSkѨ+\., K*}{la78nQS.--bѣQuq&eBzbXTVK=rbtfKux-֖E__;ԹjIspd%PF4Ll %h`6K 29$=b89}֖;9?377w/j.ܼ:[~qy:Ȱ`,k -qŃD* e.ؠj0 Abr!jb`6sK9hTņjb؁M ҸF/3ǧ^3eK`ɋn Y |F_0R K4.-"A7dFB]Mo cCkx&-ExL/n1;̝_ ciyL'.7-awI׮m:+k9ׁμ~GJlˋ S4Z1(et}S% "F,:jl ,J)6j_~gNOU%Qu4"]j҅;0)bkzt.|0$i4 yҙRi%S"*hfnx}yWӆt2 z5APg޾IN~ B$N7;_g H2׬^T,Uip!N(ndJ„6rinr`).Vöqk^f J3''&˟asϖ7n}:}삄қR Q r|bGq9/tsid۔.CuHQ42&QynwRX"]z.d~{'b6|y,uy!}Bu\kV͵͵V P o)Qj$1.&r:XCo+ť\6W5P&ĐרVv^;{LU>;|# sH'>,"fZ _$ \[b󵑸7cmGIc¤jMωL%[0r竛K^l̤C%4xpDK[[]o/_& &4~a= φ`?r~^gr9_`B}TsU!]R'wG\4θ_v?w&g_u!lzH--#K#Ȃ >l!fDXQm~" ': AoQwem%kYSI%[؁{(8/}o28ɿزؙE&cl ㆡ2SqW'j)&Y@de'[b)ޣp ӒK4E-ec.ceђD֍70_x{nF+cKld昱^D!|7_5;6)/_ze Hv hu\ n0yK;5l^+@ DBv y 6V.^\#„j$c%PYY'T=s!$o@ pjeH[/RdSTrg-#c gme`GV7ai5G┇\j %s)Gέ.8t}[X2#둲JY+*y"6(•+UQcIPs,q`v \b2/^Jpܠa͎EDdp@(\z*,Ο$~lix߷ }~A7ɐHT2Sr֖f4m`6= xVhci"Yh ˱h{G/bAch}&*.zRI$mo_\;#z%B&}Ŗ)Aux.w_yZ[8f W9>ڔ0, ave^ e:"+h{.>DU'&:?3m17VnZC_,|Gc`9-0Xf=)a`h)GAfYXƤ#J5pװ-=% R;7Tk,񃳰yN-1 g9ɳzx .6$ a4r ykwZlw#pp˲Gn1 }׊l!<Č tes/>X|:j5;/|=qpRw?,~2)P,.`5SxH68b`]1*b"8M43XӾ,>ZJcY?ɛ9Llݙix0L@f@[?(ܤ0^vk56Ac2E-1OX.qe-rHu"_m{LXw4kӐg<Ӈ )Sw뛫2ujB6+5_{tf!u[ H} Hmi)!4e:IKg|8㱹WٔB*]r!'ɖI;$B%m$sK%uCF+l 5|ovp`k݉Eyv/w1G2˓#Z4%Џa8Ƀ \}o;VpA˻Z$\R,8f!Jx%՘M`]s .F%ePi\1qljNZ$e2"~_O->]vw.&YE-h)uY[*deiŕg|=Iv'Ü Ldݬ`'ђ),_2G@+J>r`X=$Ӝt~?, pfS\wW6z5!bx |חM9ò-u667`b]/R"_Y덅 AWNċ;xJECn)痳/BA2<}>:e}˥by|.$wQbbȹpf]ܣA=BO &$Z QNC-.[`QDT=j Ӱ4t`c%c'=Cҳ?v?N+ktwN#>`}# έO7.775 [kqo;]YuY5GKvge)eaCf z4Ch%*tb.e V3+y\恭qIuDo H-Q'Ti}ݳ<|\;ȭ;wѱ8[DKAQhrHNGimm yBCًNd(340Hy|*(qgI*/z~1Z:y{׶u.Sav1+&uĝ}/wj".޲u/G)*KعwMpH[Y&<g<D}˰5,h=;(S'57|2 ijysl,l%0*ƖrUļ|o4yx™[* I|kkGFL.2g:b4E {%ёbȈx;`wWR4~h}^Pa2ԓRv'01H'ԞGMI ]ć?sNX'ݿ 1+ךbȊO@E`6c.P#Mx6G q8{Unqr0vžeg9WPV4Eb.qRyHx; 5V-+nۇv̯{䕸ϖ&ؖ2נ%>:44Qk ۙf/2HF#u&z2ZCVLj{ep-&:$w=2Nf-}594%0̛U-tNTY{yO+u@*kV/:MɾЉ9<[KX9Vף5Q.]s@m*,X09'z %uBKujx豣3Gg2~{ )2t?-U_% %aP8 ȓ >2 b-Pڻ%Dh{u(H'0bQh܇J=Ԓj] ct2k܎yn46%殖"gwn|DS_[{ u7q lB;^-39j/-d]-|j&SJWef /=+Qߔoz0٢>ɩ9G,^$oglGV5 dxʬ1Z ͜r:Zro(!{rvQd65Y%gPJ:LnKGv>į^{f4<۟ŹՖ?xow#҅S9%cṰ۾ [YhRt#(ڽI[m`JyܸMgc2QQ] iPyb!!GD]46n 8d ѪƵT\9}3G沿h)KB*QBTxdDBѢ#(#TX&!}Ȗ #X:?5W񞷑{,GBeFh~vqn~ĩws nx Y8.Ć\8?xyVz7ڠWW[QVk pƄʕL.o8blTD V+ y%Y#[jU4qjlb Au+2,[|ČfF:T_{ej!4m)mf "m5>4 TaTɽ \&F*L2S߹O>nvDK;l_G߬,/ٜja`'}TvMUlKc4//3pbs ]ֿu6'jwV:u֓WٯteN ZJTRt\at֨xThi2}E]ީZ8 #'fg})f2owHP,s ?hD1#wCeǑF:Tpia,|,or}a?}qgrbn,yD i`gƾ%Ƿ3GmFPhr#^c :X\ mH'q9#G#_LHu \&c7S,1z/-r:*bi4)gpݕo|Lj!Ѷ?ox( Kߧ_v+3KYaKG<D?RqikO% CI(亖XnzSs\@OOha92H?hD (rfkR):Ѐ/ c8HB2f% ҩa3KԗufQWYz5{FB&DXx3d5%%s,jJÏ]ywo T 8FW>YwQ ZN=PU^ 87#6lmR[2-;s&&0+|]R̗JT FtSզ걆L z mB7"3N7;OoAFT@R M$nd'<4?䩫ܔq+>BA, ycz;KAFo`T.7q8z^1SP=4[.f)څ7tJ:s,Z{6%pEv)!~}eKE!nVNjryg=>S! 2C󀈩yd@txDjU*\CÎSr:ܠJ/K Ƞ׾DP(MZ Ό /?7?7{B2Ntn|q>pg!^3¡Yh^2ȩQt>+)y\ZS Uk&L6ګݚ˰ĆH`du \TeEu'h5fծKl,;mPa!_-đ'Rǟf?Z:`OڏHf85R%0]hh:|\4lah%j*Ȝ-R6f~y cu7u3K c'ϼqz0?Yy{hs;W668 e]&ӟ`g|Kg2/}b jq(%",cѿ{.´4M 7VNlutR!BF-}n:Mepvz}"p|P+87* ^:rJTRIĈKs*k ȲL'0:O%n-td\xL')Xj#sH Q8}/_J=ykhdvZ7qHF T!rrro}ߣ5nUrѡibne9W,/]Zx¥t6[3OĐTW)- kݪط,OVeGdF]}igXRmy3_Z,}cEmV3aKarQ$I|RqV04]Qmɖ{oS$ͨwƆ8nz$ܐ^HI5Jh@0lU}Ʒ><}fFuv]{mAOaOoI\ssXe>Xjn[q3,U`QĿyA_rgot0]Dp bV57'b3`(XA^FׯHAڑvv`f[ S0:j` 0| !D ĩwۤxyo%MD)Eh;)3vu9==iXs_<|QytHT _H$u9ܭj9vB[/_*~O,%=q͉'*TR".I=<Ǡp=w-{JVv[2Md7Ѱ:UҊB h*a[4ASQф\o"kWm!/rf4]('/߯C]JhiL#n+6DJsw7ls=A~!v N9PFmF)AITjw +8Ffl8;œ<, ̦%߄H%E>S, γ) 2r9Ɯ%iF GBP$0CIXJRz\tU,)lTnL-uQ6${>w),'RR=Qo+B0pv}v_mq^vѡa#-s7$jT r:8f)}H=K1 DydHGۑyvٻ:;ʞ+py\&BW#єŒm$4xw83Q%%_(R .0` MLs?s>8bf  {HDR)J=+TQ|Sl)22̾Qeh4 |LPK('.kG"2$hL MaFQzyrrW_P{v %FܶU2!3Ud'v{܃F (3Ad[hi s0y-6}U[𢊱q~Hx.Z< cB\fiM* B(4.'̶b\2HyS.KR5HLW*iW֖.@Q b|B5+WTT2W2˘4Q4fֵw KYl3]noA){9R%m?]ԩip|st;:A8ib\\PĪz'D(_02KLr 8(󌒋%BXe'rكn^d]A0Odf 4'ǰ-30]d/:x|P$ l+E*.y2{eb*ڹ˟$/y,"qV־,_"qQqSO3=Sqnj~1sC,`XRƳyKu)ԋ>2Ae>Cy0 q&-N'X%\,yrrr趏-?|׶c`$²Vk\MQbZD)1"|JŕW\?N^DBfi{-N?sBQfѣs &T5\+Yb&.\]ANN<cmmA;ڕ0)#"Y1Hl YyJoq; /x~bdl'n>urzrCq \v;zYHڄOrG9l,Ds3@7kTrqbcf3+}_p(L˘Q,yqJR#Ǒ\-M( Ǡx(,F&5 (̕;K\riB%SMu8L9V Ih(fnv&"0nUXloM%ŔG,[C9GO?=YsWfIԇh3 <ۍv3csPDs-`/fp@s> ew/X#jN"نaf[9qvv%h a7C,܏D!`Yc3O(zhQmx] ;xK_h4VIOx$+vy#BEgZ7w?|H'%|y滗8v2ݒ2^q9zSg6q>wS ^,)1_PG[jPrC0/=+nfnON|zv/Y)='+ZC ]+-#VYD rq[weˉp*"e9 CWXl_`o:b[[44U?ij a@h ѥށsF>\}؇rRi$.: ̖]C=6߉~?Lv}2:]흔.'fY` k%?9 ۂ;9*4WEaD&' iQ(>0mɖJ?̌qRʐ9???'`yjKfJƴ̬8TW,L}nϨ,QLRFd_hC KMD_G(k`)GcjRIq$#rM /}*?d-w.gnEhITQ9ʱ䮤L%$+UF]Ols=\AHq.;yiNw/}r@4vPOWR6% @L4`B4tXݍdJC#j a6GY<4g@?1~;87ZOe:n8B#F[ʥ(6"U4dV!BE&2xq,\F*ˊB2w Q%;JuF3Z\") Lťx RSJ.|(O1 ]|Ei*!T@Hl ƾYm9dy\I733#}=<PnNy 5|̛ `W{G{kkGG{GO{}UK]t;E\t b^r\l 8z@OO3ī|K02a116ۏ3s9vu U ¹XK?tW1.. "qpG!R]d3*_5!aڐY8* 4w[M8Gd"qR-E_PGG.ɖ hO\4c Kn{G6nfD'-v|tC9'G[+pyĸw!}2Vn֏v3*[[;AhimA3=XNΝ .6u@.|=R(gS<Zd0`6":bᅑP` r?>0MIdNQ5xbh2;s8xz/3_\#-K]t/ј(YrT x`(}!m\H~X2I|Gĵ2X"RjJYߝ 6;>vJ)w5.(H8F.X%q/NNœJ}Alkihn& (b@Ij,wwutwvS<n2,:4N"Ɖ)d y595#0,g, Ϲ9E.!$',5 b|#@]GBz#Ȉ,|(&:p/Lj;>t~X !5^aLmT2mM/f7{@yeHS^8Ԯ~xQnF;~(yzC=.B{rbڮܦr+/ Tzz[a63S}?"Ilonj#GT_Fle$gvĪH:W> yXC u +IVڰzɈ1JgjBzpOڏY x'%(Ѭ˨leH[y l"a,RYik݃e+ii8p@ʰf?;` peJ6|9?H*ޑyζLbhÒg >j-FPP;^6 B2ޗ<X2$`IN\⪬-ۨ2-`侺Ȩ:{}K)ߏKQ(O4{,Q (-,/,i Ato<;"V1Qהڕ?uQ}IuHDm|yA' q倧Eq"M Mm--*k*kj[;;;QPZG }Ceog;D;u,'(C<}0Wv@c#:H_X`t(N 8Q:]$=2,ddgϿ{}`P<5g` E$* R:Ǻ}zX$DȭDCBj8VIJP/PɎ_k ȊBzSD< \CyK*y?˶rؗe)1RX; n};ɓCNʪɴH(,ݳ⾠ v,Z664wuu443*RUU]ׄy\ȭ"ik--=NLl2Pb#)fڜ}lsb͍R53O8<,ُEx!& 3mYVphCOczڀk<3-++ԛdxLdc%UbؒQd4$檅‘)o$"vhNNم% &.VmVYLqETCf^ɧJ##7p&9.?r 'Wm1x]->5\*r !mŶ$]{׷~oO]lSm>\t!Mf^, }Q_UUSG' HҥRԂXyhXt6ҭ[)m$\\!lB$pRC27, zdL=b+%U,{$o?y8JZc܆t8F3slYE|3dIɗHeA'e;B1%*QM0$]zRDcHBXQL<6r%dvՠ/- X19$@ÏMG s6~b_׶htJ1f;cnv"zw?.X.aIVԓkmmh X6655‰,zXnGzA+*j;:kZ:S4@?"V~C4cn5T7R4"}ᒓ5˱fe~3ȭayFIťV&Ӭ%OYT}- r}WY˸\ ,j\ )ZT<N:.e C![gʊsk>zZi{W~;4J.T44Q, {71stw①w}%*f{)nlj" . (noj%MI8zrd-VJk(l"N泵ABzEM]uUYՍd;}6 Cf}Na (FYta슄tڰ6 $so~vvf3}}}tczfN[#U+DG0 7hvWtщ_g)H(`w94܉Pd_eFZNNnAəE3Ӝ+1m0)-`@0$ p[ JD’;[$>"QURg\S,VY^ݧ" 8wŰ8?3K88{p~FF{c-Ίs`(^ Y(gcKTK` _,7qװxUmcC2o;::{DƖ#%U儳rd:8n'DR"z5J./?~>^i9C湭(@N.!+8?zNb1y}@/dNghv"35'/778,f=XJ P)-Afh/dJ[ ݤ^ƤeӴ1CW%Ӣ՝)gX ;rM ED&$|DBNfi`H( Ќоэ7b;hBR)܉BTs#GV֐k ܎}Ɔ[ uMGjP|z-,aEemMѪ@%X>>G0Ӷޞ&'XGiCI~uaIQ/&QDbq$0<qz"=;777?B#k3Q"S ue|T{: '&o'|%Dq 3GhC3X('b{ zB+ʆS|wRHTIcQG$WOQliߖ_׸uߏS_>} 9@"ɛOWߗ\E $F{&%ӥ~#QM7"DAyGJq1"H5P-\P\Vf ǷUs[DlhG$5o.]DkB|oeuC}sW{}}}u5϶6rUt[z:z;Z{[JJuvvPjmv_ntutZ]{wcmm֖^{[]A!@Ss}}kC]sSC>(ZS턊 .Al7@U}ރA5 əi{AΒwM/A/H@ ^6[:' @y?:ۛ^|JWoy}͵ bk}'z7Gэ77a1]nP` ~0 8 t:nkzATWQC+7ζ <"l̑^//.۽.)h W4mW*9lQۖr )8[+W,R`4`4u:`ڬ٤Z#> &.n`M&H~dJKMYӭ&lӽiMMMZb6F .;''ÚeYmi4+]ȱ#%bշ4T?JRe]MEEƖֶ֖n2C#ӓcX;Oa[gF%5Ӗ3e&[~/E@ ; SG$ǀ!,n`X U?$: ~K|{>j|eP76y72c4,Xxh A,N"us<2my '] ˜TGfPuQ!?"4c[[ލJL߸VH"%%'HJ:I)F.:.9)9@2]R$t$ޠKNIJJs?ꓓ7a7%7tM%MuRQx))zNLO)=-Eo1P`h̆4f2БI653ӒWLYc Uը7774#h8[jo#ч~zgoǞ~?_xϟ{yg/ Wz*}+\\^|wacۯ_|K^օŷ|o\\xݭk-siū//,/\^reim\Y\YZXm,l//,_vҵՍ @P #%ӎ9L >g ۀ` Bq8~ߺL-/=hLxчWH5]n*F@uD8Eaj\pzξ+\o/]uZjj"f^3LѨOߑبq(tK&9/tt{)tmf0DOƞ5z%;;jR:;zb>cQ܉o=ṋ~_#w~Ώ{?w׏~_>~'>O|Sݟswu]w/遯;~g?Ƀ?OW>Oɧ|~o~c?'y'ݓ}{?ګʫν~Յ /^KW._xmiyiڵk ז(|Mh!"٠#vmNC ?E r8 pd0]|^> R>&Ht[t0ქG=VZvpqٱ⣇r9x`ҊeGW)CW_ڷ?Ƀ~<>{Gxo}<̳V*ғ~߽ŗ8ξϾrW^+gϽv7|gϾ .zՅͥŭՕ'{76[oon//\…7^/rqRLH1W%R&ݔBFLNҧ'D.L=F .7'I)zDА,< I+, coD,)Ygx`4и( ofzZ=#!j5OLdld3(ƥ$LY9iVBW[2m:Ԍܜ [zfv-#;###ݖFNȰY323rr23r 陙pkocZ>l5#lȴlYB[V5ͨX~5˖n[)`1 45b-,*IKͱe楥̵Z.);^^]SV\T]PU^]]rpNǀm-8)&ct M̟g^|?>x<PxyY0.Qg/N3Ho8"sF1i 4)~6M̙poɤfH:H4McMv@iG!CdYǖZǹ=b&X$SXb&$)87S`F6t#)5B1gLaR6r"f4zKץRfԤgg r 9YִtD@t:v%V$6 :Ҩ&%W͹d :9aIpB F)DLƧX(P_0⼠,qث5bgT(|%.-[(G"cjш^?aDaYJ+pKA-`d!Я7&(@(SM8% -VϩV|KJOޜjGtngf|]dkih0KM|+RIG] 4tW$8p2?7R,&ٔd4#2Y-IzMHK!ρ!3'ݖm)s|˫( Du#RAaA^#ŅEyRDVx`a!V.,0s sҳr 3rrɵ撇̤V\[XPP@m#ERL)դ][_>==?O{?_y|}_{/ʷ_}s}'>OqL DhNedIJvzL/a58nld+`⒁ш/yIFgeRaˮ>Zr8PA18+%åKJ=ZZv%GJJ㤬 r0Oʏ>ZVRRzܼ|~2l9yxܬ| o rrQғG(̡p/; /(7/?'WElJr(*½lV:Mt`SY9f6" /I *#FAr9) lEF>oFp* *r_%샥^ pv=u C(Nb'6hᷤ~GTz+[[mmsiiEE`k/_ _x¥._D\x7ξW_ysΞ}Ͼ~sooͷ:w_{^z^~^|Yl81oE,C2G% ݌J^l7aL R d-8xg0LN=Kw?t料gnqq8݃}~G@WN,=.Go_100utvRRWS_[T[G q]}eEEiɱG=~>cu _z`<2\UDy>X|R܂ PK;PK@s~^KBZ™ Yhd29d2Pvi&oA1+ph бA%#);`V5aa2pM6 Z.7%u!K ;c`D3,Bsٚ/?rmc}.Gx ,5t67鲉vs [kkKK/_z+ז\^\\ZZYnnnWV\]^YYY\\zuicn` PhJDDħTГ'tҌ&RI?Y F-ypN'M"$b6wC#Jxfc.y͗]8{ܟ}O=3Gc?_W|跏=z7|GOկ~|wG?ɏx{җ/_~t[&N9}hj;z}.G{KogKx}mYmƚ겺򒊲5dÏ+8Jh/-)>Z{P>Ņ||U_\O 0?btKVN)5)e>93'BnB mmi )'LkgfN"F72$0KF2]MB~壖LfL/%e;s\,0C y|dɢ@ ODE{ h.!!hn]Cliiyyey ,~<"os}nG0\]\{wmyd#8Ẓ9BLI,E9{@\K4!=sEjSQ'Bń@-obg<ϭMw3X[^Y__YZXpeeҕk׮rʕ:޽xmt2zWȃ@?tkWțkO~o}_7uwo~{7k_W}}{?{]_?я}ꮻ?~Cv>~m>}.O>9?7;77?;=777=ɤĘYї< gQlK'̦ )ǣK:d麌 ZAzjZ& ltMCDGDlB 2"аfdZr?V.ћCXsLu~`EXVr#aVbpno/_EZ_wμ$3;D}r@XK:$ITBɎZDžxL!z-xZrp JtHpӳ>r4z~A? #r]缺E`]5h T :[ɫX_ ]  CdA>hccmiu},uA%x顷V׷7˛յ%ʵ+奭+WV^~waɻxe+.\{•k.y.^^\xW^>+o׮u/{.מڟ}^yggh`+*?^E*eGWVR|JJ.>xE9xpù]Qa!DE9)ȡ;1AhZlf#tvm^H'dm. kt}CӂNjD{#As} ֆ/&R0 BE]^a%"D( Au;FN)i)#PiBUUё"H`nQD4$gRrR\ !Pw|AÎnK\ ⸲[4هM>uRaV7P (^_Y:`4&l8eCǙiPi3|M0hy/kڢX $&v^oL:ҕߍgQnsjPyGHwOOGw/S:#fڛZ!j*M-mmMEScCCC1ZSQA2i-(9\J>tpA1 <-ZY憻)&L J)/. >b') 0ŞR!.L P [W>\ʚ:-%q-E N١Bf0Ae<Gg$gn6kٿną 9ؑt*F02ҽ 6"1ȲZa%"A9 PB$p$$Y`?(w9yD4Ĕy8C11E7$C|np7>B^*Rd Ӊ=O.9y`X +3z:7 N *N34> {x]咻>'{ofp)}NӎU p@';[ۺ,ފ1źəTP,@~d RYTΪbDJ̍#rT@ C~_ʡFkaBJ"f˥Y5uWm)1YC"9܋dr) ɢ%,h2X/?]Ŗj8|%:P8>&yEb~#h1Q$_ǜC–ܐq\WC2xi/3/a9n37,`=v*xJL {23 lnQFEwcuAZ2OQz"A1X[xNVj-Ƃaπ{x|r|ppl˱G&FX8 [lp~~pnOAܼ^=:=V%hӧNUt'TNއʫdS TqffV6_b 1¯\XDac M |9jCb$Q~͵sw`i^;g3/B65%rǃGbOB<%\,SO9)ޞi@Bw#Qe{%q!$&BavV0m!\ $]`G7)2}.ɃhA)Y`a25 WnKysceiXA|kp`_a̼wd|AӢKMeBa(NNB{b||jbd|z z%CQkS?Bl o2X?Q!زDogp*΃n@=vt:W._Z܀".0k81C4ѿ/CB $b3Ĩ3_:m@P=UkL[ 냾 }8:ffI6-LJ&q=(+'h݀ HD Y Ј4AlJfdf$Yx69&*Z#,H@O>޶ {k!?QB/];)HWo_[$*X* ^P+8|dF:@ClA ZSJ p)rbК߽ȖjJI6eO]5>QEi )N)ȃP06x#sPoJMtwl4 iĭi%,ͅ|rmTfI`GUR)I!^!9Qe_J6` O2~~b Y 9T V̵YJ#S3Xd4FTbIɱəɱQrX1Q pxhd%Q~1(78cyZ[c R ɜvEX D+XySzFVȸAD3lQ!W{H)c*d+wԔ$R3-QNfʚ6r_-4̄0h0nz&yHaaP:JM̜/KT4Q"Qbm\lb9\BqLRZ a(Nr~SmKp˷l=##1169 q7Jl$ab .nVtGn2ut*f%EN}}`?qh_c4k˫t4u;פm)Vv!ȂEZ</ux͠f3lR\Ƚ 1 ]8}8'۪KJKPc`b b/zf#()-ifQe"$آm1 ʴM!xc$f@F dfdU~]t EG],y2K^?*1,9ˡkFUDJHZ౥R[(+OS. Έ[*H'*T>K.>˩J% (osm֬8氘XzIc8xb^I7p\i2P1NDbՀP?o=;zG>V5sVٴJ7QgQtrFr ܃H`S Bt$r֒L.ٚJ^N"Ɛ^0{>vc5ԃ" b$ +0m ƚl[OM̜SweVB%˨ܧ)HGE*̪U C @iĔHX? UᰂYU F2T%B+%_xRʐJG36J>Fxo6$ǧg)H$Ȱ?PLN) c|-\ R#si8O88ȫj,!81: G$kN7 lqRcDYf"b1y Ri[+qH"4ΖVRx]Ĝ $ ˓FfPuZVXLCM!EgBo쌂/ "a #jy^L9Vf/0 Ǘu ‡8Wk'" 2Ҕy r";~V FR\S'$TSraʇgrSS['4)yrPD'ǧfͩɉ)JEQVŗX8J&:24~+K[hxG !e^(fB.akCJ^+ IȾ?vǑ kZY^.YF"BE]QA&08FL@"/su&}[%h=37(DhNKϠ'?KT JGS -_U)O8"2DjqTU-iP*QKcPW+-z/@**ňT=*tUr%?׷xFAda4'fg&h|zn'(MPva<~%X~ (S#cӔ@_za՛y ǦN'<}C^[_HنJ#X©JsUrG#q*1;Oc7#ӂ\@ 8ur& \4w6s~٣[L%aU{S OjT(*)| چ '[©-!©7#olj<:@@;17==$6@'fgf(&7>55wrv ۱)ʎN$J"]!SS,! @ah‡SҎOS㣄ϡPγ :P,cNGLXLj8 =`0q==RNzv`LqjzN*xrѠ'a ϞqS$H)< 3f5cRǃ<+ht:X0 [.&2rŭ2SS*#Ϣ(mk|s,݁bJDe[[@&D@4SfŸ'x/ tcK9 r[JUɠd"hȉ,ɺN Qdӈ&}Kx%`|'g8ϙ`?9;̟GYk'ƆoD"B*%Ⱥ)djtkrkKD1 պ +zA'ލWGA^vOTl;gGl"=?Wd5HM7'Rp)zUt|N6#)fS-F1}+D P ׀Ae`lƺ\".4#eeMR5yc7j Iui`y'FQDʎ?uo%]JݵU=#-866Hu43յW/3l0sonNnljlc!&Y=f3`Al}_-#<8@3==KwϲM7`٪/^tf}6vDb DfNrL6$X0yRM?ٳ욭We3+w9I(aH ,VV ؍I˹30_%W3"H| wv%WGϡpuP)]L4' <؁#EeA "! +$b|Hqݽ:Gcn P"6;E ˱)VE.AY 1C:>h\U bǶZŸq+]}Tf7p"wfo>\wavvi6pal1z]tq'"U-A~q[nxUhqd~nL/ʠ+ћiQ9Owo B.ZRe6cG2sVd _夞1د+d'= LvZFm0KJ`"ο~ܦ>&*N}ZgbK o %,yߓ_L__[oqglmc*ApZH/H"(w z7l7]<]eVy!؇0w|{ec{UostٍMnb"rah-/\t ? 䗾 D}&G\40 K}R@2,*hrޜp kJ6!'QDq?Q1 >lm̘-YO|"L+tu\Tgfgb.N+H Dvy뇥12,g31263kꢨ~1OYsmX™>B˰ 2G_M,:u֍t Q=Ȗ7C븙fϐl#Wye&:ݫ{3\LhD4fp*b Jep?k:~>if﷾^ދCsqg/|9.eڹ z"[a+9'Û7R55{_o(xGҵ ?{c{({܅NhSl:f&ƶqPȷ/rs{[~1n seX5g6Kr\?9BsƣrD0t'1ֻnIU0-|"Fޤ&u2o w&u 76=XI ]xrk/W 3gaii ٨ eLy=i2^ڃo6_Y<cYe9 ~&,̟M#x$0 }XD̈WGR8=0sbqk.wIGuL$#K;#XıJgLnr{RF]fYo46?=~ycu۽ EݩG0Dᘟ6Jbn[cޕ7(AX,B:PZUɼmW'r8Y  PsZ( )y(f6$)V๱~yK6nlGBѶPđH㈍llb cXz?6>-5z DObQ%r/U|屌&jS //dBm}]/˝nzp.3V]3pv;;5݇C իn*B8w!<|q=fgN(&eqw9ӽ~}1'}qH׺FESMvXhPUp(LmZh7SJFroNm:N8x؎d(^Oį8nsߋ;U,FDLIDҵWu"A^%FضV8Flv/~$~M5\ >n q="`"XkN\5v1H] 3yo\TVS}`Qyi$k(]wmΕ{vȪnwA}{^NA4Łҕ-5AR og:֏S;,{u׬Ŝ`ɧ!6gY3X3vI_ V(fH1tb'qJqke@vIƝ%RmϩG8c,lV+{o#DB?je~a4h1)՘Ir! R:ș$}i\壦zn˪L胢#Ab(M,0G,V'h > oկr{^_opHpX_yz.?} K!ij6˘;68;Z Wݐt~ c6Q1\ؾo{W>߼u݆{'+=1Hx>"CwF]ӷI NWob>(9J*M0Ɗ2ɔ6(tJJ*&H8d̂A(< 2|1_pS yot &Bml@ x$fZNf!#gi̙wz{;oᖽec8~> 7"cin7_qb1G`fTq|AM$ˑOWM#fYo? H C'57sKSW#jRHS (K)X]&V|4M/+M@&Y'xN8stnTʔ6׹}MNQas}cxY-?0a #Уmg\^,H;``MFvXdb&U5~ܤ03G9 mD̤<>>XjUC9) uzJ71F6\M3aq|y(co/4y]x2>R[{k9K#2*8x`A?K=1+\&>~6]iKo}WJn?ƦkЖioFn rzfzc)@/K*\2Y>҄4(1$NЀg@~MAn$z =@6Ȗd,BgMxn2ϖ^z܃ AbedjC1[X A59O6v{ 1' =@ HlرpmM5ty_k[!~JHFX:P4/B ?7"~﫟#zz+AVlJ5axuy8.<]qumg~ZN\1֥j/mtqÿ3a˂鑧K |X̨0m!ʓp2 Jjq@# yRbAr_U,A w v%jQ.,5{8.l0F.\-<[p?U/˛GuUKO;< hsCY[D2}R7Dnpp?X.u߃`\޿J0Ww>94@)F}sI=ͦKzõ-:4ڻF_ē3\ֵ[\ 2XfbŽM@mAqnx砏シR-3|'dXGyeޅ%%}w ؖcUx 62iN5.=EW͗]5PXn33zw~qb'Б\sQhRwL7S3Z-"e̍# Dy#3F A$l3I+Ѓ'EvdJcBįɼ/B^u "K}tE}=(*m@Q& >nul>a`Qr-ځJזgΆ%\ =^K~S]Cig/\)brW72xC3i\&7&Ƿv.>SC?!*7'vo^v0F8jC ?X /vo\Xb[D fE-G M?%,ݒP|u ga|Ǥ4سΠ95m< J[̫8iEdQ `P P/OHB_[ Z>↋q[bZhAەm(:֍ǫ\絗xYD)gږ  vTuaEBY}/`ܺEgġ۹i6Ȟغ Wm=<=.qűRffpF _ĕVe]lNh3\ҴYaef3Ge2Ih Ƚ k#ʽq"=ĉ{rh2a 72,ɨ eS=X_:X1c'4}8l9&Y|~5L!3 LxGVi|ba9r17Ň-pumn.٧@!Fp_@8@ƚ|Pn (p}BJ孡8,gkgan+aqF!{K b<ήSnLJ- G4"R$ྛxw;ۛ<9\Է.]tfs]?uDq v Yo dFg ayYkղkٕQ1HHN\&wR`E#0?(R\)cw*NxϴJ2/SS'䕝RRu.Sm`%ge>gxMMIX]Q5| npk3$:cl*\+9Q.D;'HL;l"6إ`B3_[ ;K덖Fvғ|B_GOi"w"%w Kiˌ:CJZ<9cŎ)xK8#w&G,N1E`7%6O8Z$ >{J߇%vPziַeB!j/=裭7wo<={46X`ܰIƄTхAZQO7^=/BE`2Ҙwy.i6[-~B n@GhvC? .j\xtGz+XG@_ ILzqL` ο0!qF<[N>տVʥ3e8kFO$E3F&Iɻi1f]_6Kn[TkO}Xq"[ N<p)!ۜDEL9b;{ÃvRQ J41Zi*$G3-2,G>[hslQvS9tEZ\][˗Z_t$Q 2M0mQWvc7ACq-&&/_;7wD@#O<}HW1"@VybjF?Fi~ltV . 3YбQ9>P-HI6lFXJL8;{wZ=:L&& m'Zr]~tM#EˎK6S':#'#6 l7éuX& Tr,,áFI]3ƈ՛oqD׋}Z%ˍ{tCit!STF9=zkoB9 G n4; glpv9tOyQt *nGڴSOz~`#]{~R/9W"O2<6! pӆ\1_q$V {K8OK&+yf@^\;8@Kج D>,]#p\N`skg[.ĔR-#P2Ͱ Őuy"NQ Hkx"P.ltOu׿'h5~kXRv%htiv{W&8òum} BO}h')X&&7c‡ &c)ĉd:E҄'92Ȭ)bP|wʅtP2(Eރmx!I05)`0pDDUWi8a4gIp rX[/^rFz &=`qI mdK BbFI޷cLmX*Ph lbRANRݓOᗪw =XTkSmE},|z<ڴwv{{rzt®ȇPK~zG9׍EXBrsM7ϐlǵCDԐ8jaZFts `w);8r/(t Z/][+RD%Dz.w+Xȓ}%L]0rӫ+([ҥ9IB8Yqq]K)\īny}/MRCqTQ>C&Ich Zwo\ g1C|D:_(\jر}j4nLA*CYIGGPR#Uф˔V-k*{†(#:' ̓?xKōRZZ51Zi.^wu{@\0b>̡w iQKcn@ۥ; ;?u^CP3ܷYeoZa'L@u0>ߨӉTe=͌|>C9ŧ GLfBQqס& $,tlFvdv%@}L\zL镍s{ AyE/wc >P(#[.TI: Hc-}6:5$}p~-,yl*,%7bhrģ>WJ]@U^mw!J{sO#wQuE8>-/3P跷6xrs{HdQΡjiD29ז#8&yH~K=j?IzP׀ G(I2_U-W6iײ.@Rɏp"c-[N 诮6CcX<yX>S.ecWv&H6۞8,0bo 2!(,W Iq/+W4On,מ_~\Tumťmzۃ-Wh}ğK< eCN{-Ȥ7._g Q c]x FZ1a9KxQ82ܩZA >^⭭eqFBsZ8 8ZDV6BK/<7.ѳ0H /1~=W,s|2,m܅ҀcZ|)r=KlL $d)uXAj8~|dcj3#em`(Uop&h:q%>G]X6M!)Г&N|fLtf tVnT<$ޒ.7QwD%/𭚀!j R 1,|'}FQ|1\BSb%PKk`q /X2 jdd̸\]q6 dR#v/I@.lEXҥAp/yo_&?6\v:C``(МK2$S(@  3aiN~>1%Pjh :Uw1R U~9ZO\\ fͫ">8z?ZX];wzbk'oku}d 'MP\$Jxo޻^uč~-yzhCJ;)`֛.<oRTv dj4Ҟd@(! ELc#R C0 d8ڥmݴDBh%]++I'7NhueE h-Op'ry43 *r4_HKמXOB sO t-%dCtpщ=HeaiOe4YoJ +WBI`Wqj(K"v-ϼf\(W*ѧsumf{j\1,Q+V !>G A)`pwhC/?ps!-^!Dp]¾5 @CSJLM;/CCTLRt0}ԁ!d%w"aNGU9ғ/dSjT^[_8Bf5gԢUqXH"F_h-#^nx-w0\;RvTD=&FjHnݯ[+5XgwJ-: Dh؂[4sq鑨uK!o8CI Vl_̨>-ନ0 g)6qV~j cT.sv F,KBz5-lJB`HLu|uwYyZRNg'frP˵-U 9b^Ȼqϕ/C^؅d4}vg`'.7Ώey\=mf>pFy77m^nu;[fqp$N,+I)D(UQ9'3G=U^&|mv,%JI*+M Veb" (5RB,9յjPelѽU[?[d9㼡hkxꙥHb:#4On>X"SYcK2 Saħ$_g=\ҨǖÒ8" M(A쟽2X̵_%WAݕctsKoJX:{cBXU6Ѣc)<^lǝNcݼ|vuis(`ObTIrff->23>x<~Z1)T*D_d\^VG]#B n0,E q?3p sj9TP̗BjucV Lc0h"1=]mB)Lˢ% 4Ľ͕6ED*Z|HEdgc#mh1 (/`X]c?{wcMO_xoc cӦ=-{}(SC}C%vZx:틗/5"l<Yjܡfܪ_{ `2å*C:%74G洅# &DSPN$ tt|!QXN4[=RkFԱ\&K/* cP(7*+1o<$Zڗ)[ K!0#KQݢq9 ^2`TRi0pE~j/6[=Xv[*{H@Cp޷pH'd6N,]0m/l_ok}` %$m(34y?ql%nF@Wo)U!<>˕]+  ]zBe1&0ZpNH1]ic=D6%eO~?wXo< 31%!l5_DJ(G$Ik,c[*#6"PGMFo<. M=CnC#VPW=o<{4_$ӅJ) .Qò@: ԸpǪC_O)h$=re|.S,1C3t|zK{]+Ka ;~]nr#U& Vgۀkxք ab)E<#nxa{"9q8ǁ9LP[s;ԶؤC<<²hp'J1[lP^D$8(Bh [e=JTYoaKRm|˿}[пyܿ֙(|K.5#G ?Y+fR0oR^! 2YK]ҩ^eTPd> quQ%"DANXBvEw_@Dw;j-'q ) -TmzJD_)-+A2TW:Of6(corH%D ta)S+LES{ܟk֪W>tA.{]r&lZ/}lBjw9Nh5j[O_Ћˣ4JI Ƴ涚[J޳\ @;ǿк]X33ǕFF&fr3P2bA針TQzD▯TKUL7eai*NGK?*H\u,O<Feg0Nx؊]HafN(%rq2Tz [h7\ Dk_K }CdgUQ}uPy[=(۝~ u̷:*9#*kl7>NM#Oh8 GʅjTd101dyN'|z+UO'2(<\S02ԇgA@9=tPyG~fC9uhU_B7Sqvĩ%s{?#Xlr@402tMEIpjWSՍWMXct26M#մh^'N,QOO%۔Zʴ5XB 1% N`AZ( |lnT`7RNH=Uxp'dZ'/oc[i5 Kn\ܜC:DXTcC|~l/_}qy4S'X#;-c4I@mgh6 UzEvR'6X$k,+-`;x:>++L>~4bUm⋻9|(u Ws\P.I<_^??.q5f^fOuPXNQN?"bmqzo&AJTHZD(Y6TCMKk gr!ENu\qm͍<339j{{A6m;R ᦲݨim;2Ǝd;N9ZXe{lod~tL=d8J6K<\m@%1 qJP69;Q)oil_PPr%ɬ˝%JGJYXI߲e jO0lYV|Xjf CbwRw0~##۪K`z1 `f\ڥGFm8P)ƫhGt9Հ1aٳۻ/6B-HzhI9; m76/mgMzP^R*cߏx' x<n5R.cCЕd(mf)ZaȈ|InRuB= Qrsr#9gQQ#OrSxRxٛ?>sൌ%yivbTR ŸG[8-!DDeq G\L!aX8C ^`2 !ЛK~+lb C? px3x Ck瑭&c 8nvEO,nggӠ-d.)㔆\#uN}߶㎃ko5P &ѵwagmyրvqOK9-sYيx [ VR>Q`GrjBThͤ"mx\!'ɹqW\=w-#XzSFi3[XJ,8,˰qljdsV"S&y^>G|<щM-k3=Α0qG?JbvUojIBXm5:.Woo!9 6MХo՛5om== @) 0`: +|"!_f"J%5ljD)( ^HyDZ^2 7Y\O RT]!dRmjl5׼H ?-f, /^ y]څg'͈`j8w[:2JtzpGR[Gv-c_x@{^w٣eU۽=RG]Hݝ}&7]&;woy|W+`< s/'t3m1A| \Z!)`2#v*qʄ3[(q VNu""4PJ&w @apEM:fX6&,4]X6jvӸ2/lIS= MN{"k^dle5ܷҩ2ehZ^ǟ#: H"g\:>u "-Erm͎ˎ|%T_z; M" fUVmw:[of: @_$)=2D{ao I8%x;S `<`)tR)Ù8!*u>'mӐh4MȀ;4-}ÃFX #{ڮ: qɚ$ڙL%XM.鸃# ?zT}ƾ|mnڝݽ}7@E(ln`j{[;?J!o8yrO\eh[6B4ofEZDSN0b%k|Rw&NgCmoF-,E}Zg"*gXچfR":e4zf3>[sZ)5 !):h iB`xI~x-SwMᙰ9y 9<"ȍe7G9^Bb=v0 ޣ ]S;WCvvGWtyqkni'?@hk&e\~)Tn)-mbaFRb_-X,ֹD<%8l.Vģ0G&97tkD3(e7yVX4 x%rk(`sjiC7-Vv "}G3il"HspI)ãnF~pBK$GBG>lꛘrDv؏]yi(ۺ~N:{Ww[\ސ<z|PB;dOKjq%( LHL&j %{g nVD-/jEiT ?t5|J(~Ecif^2KM;r0A<}\r"H"9JrfRܝX;dp4y|px|tk(g?hTHo=N #zvWJJ3/]*빩}{ [ߘR78uxtt8S_o 0ϝ/ᜍ#W$Vr!j\Ȕrte/liG|Z)buuRRR=w!]m! BЖ-lQU!F50JN& 6wK„Ϥ*ܠl?^%XǮѤ@4&pX(6~zrO5xRtٗKݗ0eJ›?_F%.2al>~VʥDGGO(_P=_<Rk bC+Y]lA\*b'kwEQ*{B2r J̙|օxvO&XQ5wƯԋMsoe36&aI65E 63?Jحٍ%ÁUxu#of/sI'Rdn5=BG>H/W7~f~K(TSx6(n@no(}d.]n6zL;gု]|٨r0Xz bL'pe)Ҕȏ2:G Gxve$%L̘!Qm%g@-4قTywcz=q,b{Tq5D;HszKq@bbbs~beX{TC^=xH;bc[ORm,5pEO `D49c`(x3"B2׾[+{v͕+EąM#C*m.,qt$-[;bqy8@I`..C"j|z^8, :`qIzABUjrGL0$OLqjަAD0auahW9=kT&_"se\MͳPhNcec)]+!Tf1_&!}H& {5١sxn.D Swe@SCAD_{Vr}Ot\^I @*Wv^PѨ;o ~qp`84M0l" O_:cgGDT$s aO:"hC#{5dKEaJr_lf+0sżVJ'I:#lX.oncm(RM?6^H3͉ xP$i>F5r1Ka8Phvz5G=!HH:3wc2|~ei6^XlG:@Nv62xmn׷/|o;_q=c6b2;<Ԅ,OՃ^JsDJ?<cDgbF16LX!}1^| znQ<[ ]:ީۘI> Bۏn3ISY˷cY,BBן_/|Z)M8Fɹ&0 r$SioS췞!=nHVhu'F-89_5%}o}5"XIݑPLLY")x" a࠘]8`0GoX#列ĝ)DLRTz۟{eX }b h0C_!M-d!EyRn7/\XnH W{‰-%E Xw<1Ez=~*"B7 CTl"U(`$Z"b\T9f~!&q+ 1fXԚ̟3ClGDSxQΤ`aiߐ&zH`Ru'f|>U ""aѓQV:D7{|J.֏./P|l fa˝.fox秝֡KZBnȌJSY4G\|b%e΅v.Iy'vXpj:) ܼDŽ6LDX.,^usDc2d(k'rrI\wid(1!'љfIg̼ׄj;,OS6ЃCbiU$&ME 胑DobhfMOʍ!y4ܥ.oF3Njpb_Gn|NM]Yf CfBInfCJe '\O$D36CT{}'h0SL %!OqVmy9_*}MHҋv|^P}Xh#S,K4c<id'O|X2F0^ޡvFZG^(snHe m]w=Qc5A1qhuQjȐpLzsc\J~$O]*} |z zcwh5[=2هq)gNb.BQd4_4W[D//ZxRR!2:8<@fp||OA(UzÍR],NSfcfR]'+h5 ew )o>BBdXަJ{p> ng*<0&(%hRUeT?[k$ p7(ؾt.rTc\2 0n\`Θh=ZD# ˩SI8CM4 pe_thbpMLJпwY/tzբ p 8c~8'P)_VmB诃An sO-uWٛ۔Onp*%a KmI;"seRV!QJ²}87 sl$yfg)[>Q #LT(ʃ@Bkqʰ*m"yAR"]_--X#7@1 Y,ڢ_%ª=%+Ws_=Jey$ZV2C6e.|}@HNg4~#kE[^n4aomޅ:Ia8(D%vDmAW{ .ݷ a1FdJD34 .uӵ,:k`s8Y=( `$.,M8 5bҲ@\)y"W˥2rw-eϽnԊ(}.3?~l|1=bVX#im^3Z*\m7Iv_cZP1T7R@pmjG2ȫ ىk.?έܦ d4~.]P䋂GEefQ:F~ǻf𳏃pdJƨ~jZ'؃! Bq54=\>{w"<>XQܴ<=r]ZF $bJK8f8ؘԸ#7 \%zKIUFQO/~1W˵ xw&}BлNسn7zh}Mǯ 4? <> =-W\֒ dאַHv$5Wɨ@Xv'EM5 }UmeiE*j>#A6!CH,xί)t>tHРcaN؈]a/jS9Wuq|tL%,3ya@In+ n~Q {t}̍8WfMخfhlov_|3^VԳ:2摥=s&xjI֋mMmv+vL?HuXaN\RJIiS#*ELs !WW.]uMeTpٷ?9:`64p0iY{'pj D- j+n(mKkf(vaXfHf;vF1H=Ǥł N<Hp,嶡PxhN` ٟM}5H~͟v ϶wN贷GvBhUWJ_ I݄|=]mJ43o(_63\*ITg_ysWrBHBP2sx~0[;O9#M#k aw6{O\xsoTb; ͉T80B% xh~Z9l"vw='K§`O5_z^{{@sS|oafqwUߧ%s٪w|{@!S5gEǏO$˵.5=\hlz;8/ zrݐq|L$<[p7frttKXR݋JqY;f’ݶ[?|Cz/-:A5hzWg\ f]_\^Pcfȕt E'0`VS"{H=` PZZy;?3 `-3]eo>Պ be^۱M2.W1݋z.2@ o)ӟAt$7CS2)1NLÛ7rvymUX뵠Mww!{RU<@2ul@r2UTȱ>[&6N6*jx"#->wޱB`8& g9[Ŏ ANxڽ?9x ogULJx`agfaTNLXIC7\ O[:6?ʅB²тMY_CmeJ`ֻ?Z&> !bb '᯾ARеryM3tUa zY[ ͗⒀͂ słb>;%KN}X|jC&G/ K:h8OD'PX? P66^*qNH['i~@Xg/vK "6hOǷsnO`nŎ˖b23~BvOʻWv"D"мض_)ȞAiPs+.|zJ"DՇ9]LA(.m6XTLa^D\JyXW*RrO<ȟ,%(22qˏt3g)kYqId,8S勮Чe*/y?GXNy3[DH z!_įeUq\r>sÞ,;QiW(׭@CF| gJI;8C޿(˳FL`<>̈́:Oݨ`ANre >.W3z=˛Ŝ]Ã~:7WEZBdAAgpt΃9 b& 1g5O+ +Yҩ4/e="'z9m]@0[.+ŕ_ 6!Jq+\fi`.# Q"ƣ#C!sjL E^v!xŶc*yzSI%vk|w#ϧ`)Vǡv uC}! {N-y ._cT*c |CL*WKf ]Bb)2 뜋J~ec\!XMg`ܟu!b Yŵte?q "@B\HCjmQB/y|5 x 9%ݶy jѶ cJYf@,Gɇ&9{(ȱYJ eB $FZͭ# 0{=. ꀳDg>GȽR)tOѿ]'J䪯{FbhNXL-$RerPXlaeIXPBC>&*LB Y{z{_wHTRrϽ-Ç,C%F==K{T+au"ELi Azvdk vL#:_EH)$XK9? K<n@']vd6"zg$.FT䂙w)=*&:3A@Msɣ,ɹLdaqҮX(xΨSǖwOl;T`T+jC t*83ÐZ߽{מ^{^ӓ\!XCʞŁBH1GnaӜV> EO'w=2G0hAQ4@_R|8䷞:UCɔ<CS Se1khD x][rvE<*2+" :7s u!l/wEj `qoHT=GCZ`\!Z^%X'9=5xcw a3|ptbbbĄޘO߽s;? "\LscjvJP^RM :7MKTCGYq6LT:6D>1h`长 gsR([7=#LHTna)jCLdX>p2/ KWr٪[ꒊFOPy%h@0Ag*PQ7߅%sKGgEUb.gl@}G7łX~:F2Td2{'y0> }ZǼ/|%lEIUؙٹ{< c/$ak<I6VogK,LPiZlA$6&Gz ӱ)Oƭ/^e̅VrY8e# *,r,$2^IC\f\vծ3\ J#6j([Tw- siQ@ײ`QSe<.d;l=xת3>h )>_7O.%<۲ĥC|c(e%yd ijpn>07 | Qː?]);AMiP8ţ!݋ByTD"gp}ph]1}pǨHp8Tk Ċν9)a'p)Ѳ&t1q~y9GsAmwF7EnEű59)c rea~ݣےa/ѽށ(›'w/##c8G7vrME5Q ߬y  DÊڇ[66 +轀,5M &!+aj?hx¢3d@#ZKy(!י*UԱZq j 2ѭ9N.M\ GCin3w7op jW&ۀ2rJK:d 6p~猁o1fQ^ys탗cdJ¸%TTT?Y+R6Dl *#7^:Z"J~U*7Y6aIUh=44N}"^R4qr^IJ<)spI.AQəGucneh/y+/*7SSnylS[.:O~l"e3z=ԍʦ&"asņc-huGS1/b /I;xEC$`X-$!O{0lS]1Qit2]a=[llYB_f2yrʷȨJE#BeH,,gMgUu݆٨t$@?@lrH)y- LYPm駛{pg(Ɔ($gۊ#칷'P߷o(vŇtqc;)N.ڳVNT.$=JPA+PP$a;inluvikbDU|2f,\DwAE)Jfy^v7C?v>n\ A T󁱬 `fqR6ˊ&62{E xɌbo[L6yb]>; KBTkp7,LQH/v@mleb,tQPkmf̭̉ /1g;wFXϝ=1c6ftrO߿w<i /%QF(s+2XRB T ϱ X'B?by\ p_$?p(F g@hC%菆ţcS56%<wu8W:e+,ꀢh5P=v/ 2OqՌxUaS@)kJFXn\]SX9Q*%G V\#JڞY\C|mD,;y|b"36Ǹ={:*̗܋ODk+{/4`T"ը& -'3?V0}h Q|X< YHà}DM#x$gjg庿SYk<3&iju/RVKf(%WY6nc5Q)4s≼9hu c&5rsݞ9t=P+c(vƶ={#tѿxvCTZ wtXI QxtBF%@[p4"Qe@XG%pIG2t̊,#Wdpc l O-O:*L=,O$Da Ysŀ\YV2\aq:Try#5zHd.7[K.Pj$Fkdx(2zIO.S7owo`| SD,p an1qE53d># W7ڐem޳&W #ګ<s#\4kd}Ӵ蛆X0Baq$ԙ[w߾cG5}ܗ㮁ߘW6/S'__ Ѳq=o`[PC 3rm,M zGbV&Am7[2K/<`JU/PFf'Ϝ+vFǠ;ط/36<ڷs|l@_-So% YX2G,rceEQeaOzD(eY/(YN2XrZL,.= -hrө)F-x?Bi2^ix/3,m*tY3RTmX yMs:,d/R)Xd-mNYՏXU د}JRc(>:404|˕/B‰ePO$Rt"j9œD"N%n< D>7ݝwi0JgƣQ=ѵ4NA*ם1`(+: ]2!ԕ$,emaj:M]-eid͔ĉ&66Wi`ph2Oy!Ɓߎ 2{ɤR\'7wN=p({: <kz:JODۿ;`ǎ;wlcێzׯ۰k׬[w zYӻzػrMkVZg==׮Xc+z-.}=˖\z=+{d'ENϣ]ummj \Wh4]eqǩQtUi +ے24-Fݚm1(3K0"*58dv9Kn:QIh:?y %+z`ʍEUl:Ko^z_Nś78NkN?ї_>z_x/~~~=z3~'|gG|{z<?؏ǏT)_Do*N-]w-Jb,v|~.k;Rar*73/M_N_tKfrӳ?\ų?|zK}wϜ/;s>ܥ 9/oo{KP,ѽ׵*nr"o",Clxj/IqY:"nm#mN#q\-SبB"i'h V6t:| ,Y+^(\`H'Ȕɖ4?3yD8L{wɌa!<#(}?;sʅg*}]K6> N=Z>`k6wXQP΃!WdcICy.z/f3u4+@޶ mu]ݩK2NBQG ma39ˮD$^]J%&cC{OWx_lujWk ]uk'oJ_p*`"ϋlYC ss3s[ ďHٹ &%Ll9=Y Um(tݪ^ve+7`)"}CQ2GE@VQUJX7u:ǰ+ oiRP>Bq4X #U|uISD"k $/`*N{ܚH;a#axOyۑWkkގHj&<چfn.\BUh_Vmf&uFek<*妮L-a*n>57R-eּi+;28fMY6“]"uN$&7P))OC㢉Ŭ.^Q6U=>HG w]tkjvWE,/nVq``h3߆kz5]D8gi_RM V,"M!ݲK+((UA{(bsC 9|tǒMgf, %LQ$5t5!Zr(,]+ǒ6Z,!D6BҜ|1:*9"BG9bƲ-VՊ=?+IDHrCc{Bopp??9rm!m[6TA)f A,sS,G!=r jBҶOwef{[vwG3/U{Vry57~iA籟]n7۵vOIВ5MPM2T) V5b ᄆ³kM4eiQ*RG'uたZmocXtC.}˴z卥ml_a):~ Dj/êڱeV[7ڋ]u5y5W_c5;wl}U;^~},!N/(X/8d3ϝ@tŲJc!;1MMAU+ Ũd2N%e *Nݽh0A%έ@XQ_C2PEr-|=h2x˹G\tp90%҈_KTT}Þ96[D BhvmWbu 9]]r'c%]=x5M &RFyeS; ,7/7vǿCeϬIt򜻪rh>;1ڎ#Bnɰ 㾦ʀD,Tx'k%1?Nvl]2i-XBGx]ǚG;rʊJTYd?>m[P_c;>ǒ=sSEQ+a a(ч] ݃y;%VZ\,,o%؄[7GnXeCD4)" Sq[A5%\AZ,}`j'} KƞԹe&<40w#մ E8x,8s)"E5:N'νVHWwڎ*]K<)s?RԦ.HM$exR4;nWP-oݾ};c% IdҜe]4Cl(X6|2Ntjl&;x<JU7۞%RjX3 'Մȑ"7%Q/ ZqYAh Ar.XWGs:uĔV.凬Yjhr|cL4>"PWJ8DA8 Ͱ%L n4Y63!V*<5`;6 7p-[!hLC/FA; {Z41S*8Sm\ 4WP!ْl"PZW54Me]j(g澔kʳ{r`:Z+n;>؎pwB P6q.g|3PR$|Bv &[t }L wA1j׎f2d:wΏʊ`z^`8߶t2W@R HUS_| !Ynzb\%̹Py^W׼pm -pU:4h*& jvLZ-<~ә)kmo|rq uxC7dȰ#S!Z HN ՟fmFT"L ΧiqFaIgXj1 0+/*VDQx3E*w=5 sF5#/%䵕/,4&5f_z @.Ί΍& B4 ru"[@ KA |Al?ru Քe~h,2\ ]+d"?gw4 ԯ8 nԝAL ӆy* Z7> ŢPn]sn` 4@&+R-rSw(B-VGvd@k{Tc| [KjpxLlU'g<)_&ȷ=`z(xm"MPTޱj>>sxnh<|,9T*O)*W[\-N59]KU>d*Kf[#V:P+6ijC<rə0e\J5+ çv.%CʡEf{ߺD&#_,m Pw*Gv0ēãg]v~Ma^!1nk_p7Kēe!YDw"[Ij-%t!Yǘ5pG2}N$e]zf=L[Rpsq+XֲB^| ԄqfV.{?nO8{AjH laSc &bnY5d8폦sΤ\ 9BYq[(ĒK_]ʂ`=mKabG(?n ,a@%(os.&JK~K{-0&Z 2|%2MJ}'Zw/-(ZK+%R^. v1C K$S9ĮKVx@"=tnǸU;0<+: ,2Ҋ@ytwk\ i $X@MG!O/bFmJ%mu{DphEfuF :^좇׷M3}ؔے|e3?>_> G$s/P0"e3Tƴ.!Դ=ycD,Ͻ?uxZ8g$ 0m6%40V>+J'qT:w@\F>-2ܐSIsK³I'-uP2,]KFN4L6*l^78?W_W 6"HX3{ROS r`c<>uFRx<~}v2,)U]#e**qV|dC<ס %$^ (YCi/j@C-v/q \uCmkjŔuD0}̠He!{xlRt/@A*&DT,a5jC|x*ĩS%t%>ɕT"{F4䑼C9mp-y!ĝinj4 ^5 'jQΰ$7gކ@XR(s05 `5:Dfn\:GKLh+"46'?䞥~OcL95I-u CK|j0@6y G#djd݂%hj!u[e6.{\ZLYV KFGqȰ$Y8DsÅb.ӈ_pii@ڿJ;K2M)Z|-?!Nd,7W8 ZPN8Mt3ÃHQ{SL6=rEx=^c^Y>s\`vvky\\e&#YxIMyUu-%([ ;>hh2+XṎtH6a7RqٟGHPO0mAEЦ DHE`52Ol2AAKjDhO P8TEac1l,<(hQ(m..H*}5O .ir"XS5i&ҤAPkBXFqs>N> / {ʅ܉\@\=-TF@yTM;*Z} fsC+LP!n|[Јi0NXCYrA7M柎G2J= (G6j_qػȉT@ Â+)_( @Rdui3Ii"KjkS,Mlʿ"/,IPZe&X"K]]T\E qc<ȪW=o EC 8T} n b0 G =uQ&jmrҞF83(X!If)WbalH Z= 6=%SzO//j7y8w7Spl{]r`Tf=t2 ]n^tYD_)al3Ig@G44D>y@p^Kzs,q| FYʬˊp啔l:eiuoF~@˻Ǜ\38KmhZd(kwk*~ %?W_hގÂʐDm': ao1,ہRPKjm ({nWdL;U)ˬ\K FنQxჂFaS\,[ʬzGbFwedrpևlk6.Te4ݽ  ϛ8*ZjEm1J]{rMKPH yma)S10Z+s ڌd m^qQw^1krK%<.}n;v5h& ^;5v9qG[pc k!B sKqÕ^V ׵jz=WK,teB :J#"ȃZ[ڕrӨU G3kT¼*}XٺhC3kGv%f. v+`i,lB`B4]Qκ 'o'v/{a~+,0,Q5K巴d|/"|x[6%yJ[ EfR$&<؁`qQ&d0|0<=%uJojƈ;iqR`ID$iQ T[0ii ɧڨ{ S Ta#{!2)H!ޠ0%5'#4)+YGϪ{Mv,q$pOIAb,@ՕCs'mzƤ#G(o3MMʵXU#vy=f&j`ꥹyw,OFvP&@ j&fa_KՍGf>Gw>f${`}jDRc;@HǒOG|B;5Gql$%_.1(]5 aJo{g.bEI + T#ͪ?o `aAG~~+!ƅk`]>ҳ kؿыWT ⷜ-T]79y}bU2 g? =H%nmxNk?gѲ"+ aI5=3 ]pq¨ci/Tu8\*%jI78iIXiXO$#G*/?bi iP9V:ҊȁL@@H'X]#3qO._Pq]pJwQI:L1-aWd gF2|5x!1B?hhFzSy%T q' %jƞD"I޹[zBxC'PRW@  c8Wt x { 28)ZW3|qiUb,O*jRɾண# X+M,j^.,+\Rs] \!}] 0wm't&'\ZUTr8PqBgP+{Jc#RBYMykR cuODԓD==UK:OD d B黰vUCGyQsda+Wz=8IE-:'fSp7JPHT)rـK^-L8oIu`8S|=dKMؐlh (Zb%et,LGg t~p2AÁj1X Kqewz1 IDYXův!w$,'BG+’u],f Un@6=MCP /lU3n l*G.4IT]J܂ʓS s3T{>mBBT@r)$9"f%MBf">/pA ifr+,vʓi3^#@o a9zT,"`D B1! q:Q{P6]ySNc)p 9"9;Xl:v!(؉Ts/\imSuvvpcakŰd:ZD.¶5ꔧ? .pLML~驙Dd4;5;d{8bޭOSD!^>Wl4}˰9882}. d!|i@PMyYKb8R-dg:,$:,Jbe D>%oղc D?Q)yCA^83X94Wn K3Pxa4\f#گH 4i*L[*+%=FӋ@(R1)U<'71xud_JL(PUEKL\.Wd.,F>M"ClWĊ4;ҹ\&5x^_;" 0(lXQrW](oS(ak9YP#m# f Zzj5U#zaEX|I a\5u`W[)yd~X@6"%r)2T mL'32\ UyH.cD K%#T͋b(|_Plf Wkv1[V[qupm$'(aYƚgPxKƝǂpؘ_}ڗ(,U8 nQ^K%ȵ{] 蚁l*iTK,y13P kg$8`$Y!2IIĺ3xtE $cL.nMOUfѶ?}P4k/%*B Y5,hkwmfLv{RC$.ҴÉ >#(!q tvԁmf"Z0;6x\cd܂: ց a̿ԱG_l$ܠ%N%7F(ʹx]YT*fr/4x.j6q/M4Bqj╡7'UCFh ˰5 P:JOgܥLE$%JyOOL9tp}F +A@|KY[F?/MDcl2g|Z6Sd\,}b") +'ac?o[^ƏunE%\\ϣs%rns^RA#$a^Dܠ@8FmDv05}`h 21U3P冪IՂ2 If 9AҶ5I비U" .kv} pyl AȉqT@Lӫ&bDfMsD( Lu3nM!Z˭nrJ׀PqДa%CiَhZ$Z̹pٓGMqSp*ZOx5?7uvgh)pKŰH;Ne]d*ҟYws% TQ -*P!;e/ K$t_kZcMNɄ#dZHkais0U7_:qӌOxaRĥ8DeZ8Y#'qEԀLo/'RHrխ еMXzpB%Sf%I"?,,m= ,A,H.@j1s(ZDwg'S=ܬɼqɎt+l?FdnGa92KF78R8P)wb{g)XĐcTf|":y@d*žf(r8KeQ Фd  Q{v tq<a.4ڽoǓ݉/T@QF=!S枆a҂w0C]UunSBn;Jҥ%nL ɬJݐA9yRG.VRUGe.^N̝"v@L2% Өg߮vK/MOB KG/p~ӹmD<K }qلKfak4w&~:X04Ek_6S!pl4Ql$7ϰ}/AOjFU's?v&?:Jav`_c>ij>d./†|4s\_vDT(аd CCu~B%b8? KrMlh*B0hl5GCiX{LwWtևpjcnKh`-o iX"̭Jq' O!S Kט6)-DM}K0 о]QDդn=+`-)악_Y%_^=B?.Nύ=&P SK6߽-M/MAmGy{ :xd,Rg$<I97r4C48dil8Rvx6?Pe}_-ѽs ZOh' (Z,ڋ,o/'Dz 3a`鷦dUEicW@q9rF[Rl*]}S cI^Ps-c3lQmK\+mܩъ\0za0,*qv@zzjcWAZTf<ݾ#m: 2t|w,-L& tɥx7c[P4[+nW-y nJI-%pP1vؤVP M,wxB(iBqHiI4 Y;vZ9=:!-Pt`I"OѢ0 aD*NVx)iw'7A-#{D>$CS!5F?xdt&~h=2[KH9"6ʳۜȷ9boZ.1 p~^^埼9ՙ囁ODWt5oY]`h̃ c)׺< ^jdQioZ\JKui?P9}q H޻x9|gmUVE0RvIwcn6B`k%Dpp炇.4wA&_8qu*i5UZ=JU;ܘg%KTwm~q}d 6?i@c;a e2wa0BuN" Sw@1Pǔu GB ­;:$0)EyeQ}O*%!~˧S4nd;=o¾w48m@&TSZGfR(F},V0\\V$L̚aD&LdžS@F:8).aBThYk&%&FVEY,0Dz/j]K0T$ٵJfR&J}#2Q=Ƒ`ao֫5qj5ǭzHAWVoJP;wQy(\"J 焚ڨ,%HMŰ#]&}mЄk袌|aAk@c-c`UЪ<.sQ &y ? VV>\˨ wi^iKq 2elwc`، ub %D*2N VVU>R+RV)Lfw@W2X> JծZ:@Ml]tʕr(Ų{D~ˠ4#i [+LT3t"ojz:^5L&q5,"eJHJQkwx8,JD2GDӪU EP𒯂xE u\.ff&gff\N|EZ%/_Ws/c rJ=G{gwc۽{σOg>c#O>`#_#G<<}Ç8;1+LM&ONŢT:3Yf#GNbP, 3q\0sGsR>^;rajbN>yͯ|>SS/|?/~_x㗾q-_[~mqy]7ww=˟7W/Gwo~sݿG=?޵?ȟ{}y??]>?]=3>s/:t OLOMc tfL"#H?У}};zpvx|tn(^ +3V~k7]v|9g_pY睷.~-]xWndyg7oyۖ.~oy/x[/~\x[.ڱswܶkyUۮ~vnݺv}p>я}3_Wnm|LJTNyͯd``@>  H_e[⸌h:;#=@2: ?; Q[KKGw-_rgy_*f}pC@S$R%:2;طbYGNSNoŊΞ2ʘ|$,[:u n٩N>uȄ(aG>e)䑠$zX*`݇|@"p۹d߇6}v'HfL2%a@XF$uGF%fV$ z{1]bN@S2cE犮.y vw,X _p[LE1O9uEW_|T@eX|r@Lzz{Feƣ8wwOo_Ot)G~jrgܰgX[=}=En%.ˌOFe2<e4\9K'١L.erUIb2L2J%*㖼mMgOg2IT|}y޹]W_kܺ/ܷ^r9]q.-nrW\x}[=n>-7iƳO7y:MMyƵgo7nk7qo: ouO{" jk6i5k7ݸzb|v}{=Oݻ}O>ɧzz{~˻}{w~ӟw?oo~[w|;w~xw;y{߸]>o|o~nַ[~Oƛ>_~֭7wqo߸|_nϾ;nK7tӧ?ßO/}˭\a|k׭]vuˡ4zlR+fZ5@0;zt0==511sl֨NP.Lϙbqvj85Y<67{l5cFGs3+^LG4]hjZF)_Ԫ7JZ-" ik6ru+Znj)1*!(R)L+担BT*SRrf:hPh@;D,}O!j V+LYyNnJY)HX\֛\}gA!E5 M"T" HfbH l2lRG ְY,p&ggjYFqȘ&hn$zۨ$8+ v%.g^8U#c׭_36:r͙}]ɡd|TI<9N`&8iH%rU3ɐ7=m4jannR 0+LWJ5jݤEpDˏ/H:a Q)7rF֎ݸq걱޸>ҟIG~Q a]10*VlfVQI7aQ^2(񔽘^H6@߬UbVff ifr rnS03 7;$ Jf!9_`ͨeu]9sV^n5kN{ځT. ) ld&[2ZFɪBZ嘐 ȧlR@HDqZf!*UIjJr^wCwQy25֬Asch"p{P~X'n0 [ çג Bb&>prԫj.}t.wd&hEQr*CD]`qEZpUpH,]A@Ku|6oUl8gdlh/ `[B FKүAS,pe344,--idpsKDJmI% >ZE-T-R~P[$=#c#+}i)&*ғm9nX [ʂdvf;=%2/5 oD! ХF:M<1eX+W\l}u'ۨF?YO$7PDvIpއ?]M\WdbHaA $X; (b ĉ'Ǟ|=pιxf s*=*{9uˬ!w|9ߑhݤʷ@Kz]:XUjиT[Wun|_7x>p"^z jp=PS{ZcZiYHleYuﵨؤE_{ԁ:fiʼ=JS'WxQ Yb|oke9s-THElTCIb)5Li wCg2\^xk i<%|KH2ϭCW"/A~2D;)m"h4UZ&ﴜI#v珶YFʛD޷3mwzɋ-%[I3넸)$ZrMK@|Rq1tG=_mCf;?T$:Lؤ q(e&up(PU,%p}7K>º6[ό7?ur2Wr+YwH^jjRja|DuNvmKVXgf2k*@I&.9 tdПa*:M@@aNb5[D<[%lU >!C2/~b\q=yIoD[݋~ -U!#[Uin2M+%95B[_ *_*X!1=<7Wr FPuZznwd}slꌛf RtlI">݇DcHG{"mk7Ik%B yGXE'C%&Z ׌۰=rZ# &ذP?}ݰ0j{%{'Mh~l kLdt3LQJqH]<-{0̿[`xEJJb0YJѺS<:-e/FBLZ}QqJzN{VʣB8!$>K|dgpۭia9n{egTMo"yی-Eܭ5"VҹKCV:1Vî %t !<%fdƨH6͔r,UG1Sѹ ZWS"ϒj61jCЇcK_}V@[-:[|8j'oK,s['-ުdX^ҝU #\nVɝ+ոu ŠH?e0R_aR 0t0x{Xpupl~Qf15Sq(2xai>:iY{B% x>9.pX…K f duJ[X QFT]b+Kʔ#p-?[nx~b!ÿ5u=-&6C:;#aRvR]NyW`5vDQhjՎ?llu!Q]A".ҲW/m <y:)FIVg#v WA.ж+7tw?= ;-ILeeup./T",O1|2Jl۰&+V+FO7|C8Kԥ6H;CWRe@(Ul_ᘤ-q#Jk@CI˚iɒ xp!,;Y| ]*s)0| me3P tvwWIKݡ0G~7.Kx5;wF!ʅW> "&MIOk]H }U,Ӊ> tLиcb?Jm`/ߠs&nag-t04rZzZEfs)0|&-2)^޶pXknEadUOHRsQz2̺m0b< $42*nou#Ib?teFG֯4<=V4daĄsu*/?~!QVNk&Gϻ-B G,nP.<Tu&8$a֖2]Mƣ *>,뫒JII 5QG(i[$MvvOMyf#c1 ⯁uNQg[u#&B (WM|3>W<M?4Ó`"L f(.{u5=qykU|PF?ZaJQt5;] O-{`Ye[˘ġti_W]ix_ll_cNO@KuqZ)*o-|L']ixr4,TK`8Ju]֡Yo+WY6 e*6]KYmIHu$"K4+JV*$?b5ΐ)!攲l 1fs) C,lBެ͙̹@ (Um9>C'f.rdBUbyA]t1^e$^\{J$_ vWŦ&X67|w"D098]3$M^дTZJzx;fB8v$]؎}Zw5AL'zU4$%VLl.˳d=]%um2R F޾窧0X8 EOj=EZ]QmXGó#bWMāfXhp`%ͧ!y:wᙃ3bi{Bp e/gp eyRxbzWWY1b7N֖lb ^kNL7WU%'^[q)XIbEdja^8 'Y2\%Blb4\> 7Ώ2!U#Ŕ(MMZ7pHs+6gxX̏;@msuq^zɽAYo$//x=C=;x|n,&orqlr#{WIZ-b<]Gt~x 7֋l1_ӳrrz7\/x坳eti޿kg߼;>}? /|{r۟򥟿|:== G{|տ|=9eJxv`2zg޿ky_={oYix7e_2 ~BK xډ\9@vl?r@;Z<0?*2X$ۏٟ!]K% էJ./\*L*TTrݨRSɥ@%C\jjOTr=UɥB%K\jJoTr UɥA%&\jhUrmVɥC%.\jH;UrVɥw@%!\kUrVɥuB%)\K'UrVɥ@%j\\iTr5SɥP%jTS\IUr5WɥNA%:Y\TTruSɥQ%:XW\PUruWɥv7@%\jWTr Sɥ67P%P\jSUr Wɥ6A%z\eTrMSɥ6Q%zT\aUrMWɥ KB%*J.uQ\@*gTr_Sɥ>RUr|!UrxAUrtaUrpUrlUrhUrdUr` Tr\)TrXITrTiTrPTrLTrHTrDTr@ UrY*,^R\.J. X%eKˢ%Weҫ`TrY*,V\J. UH%e*"Seʩ@Ur*L^Q\J.WX߹YiˤWeʫ2a 2]K2Y2U˨2Q 2MK2I2E˩2A 2|Kn#x^nY\na\mi\mq\ly\\_q**?2PT~e QyxQyӣAa\N'q91*崨|e\N7q9!*rS\ʍCq9,*w堨ܕ吨rw\vq9*eר<p\vq)*Oe.gG壜F㸜r^T>YQ*.D븜r|Tcr[\ʭq9.*娨cr_\ʽwT˾Qy,.{FѸWT=Q<=l\q:*[eۨl-U\vl-MTQ:.Ge<=r?}LTQ/.Feϸ<}HTQ?.F券c2r{T˭Q92mQ96.D|]TΈQ9'._E嬸|YTΌQ97.E!r~\Fe_^FeqOTFQ+.Fe2b\R]R]R]Ru]RUTn ,\>kMĺd)/=p++NXK&R26s W۹=d2Fy`/d/phv9<p sdBs 8Ζsd=Bos ipL&l0 m ٯ=d2FŢP;ٵF2YW+d2ŢP5M1˙#eڟ#Cm?\[_aYgHP_t?F߹ .ڭڝ ==2TxPrHo3 keVEX[aI~;՝KvV OCr >荻R5XߠɘSGfn!YDf;RYݠؓEdX[aY7&!ś =YD掜-߸k3՝"2qD7&n$gV7h2"2Ih6)MƜ=1k;+U1ȳu0HX5ȯL'x mԪMƞ,"sG>*|:X]U 9YD掵F޸;^Ud{r Z|纘4{{d֦QAO/~-U =LODxP0$Ȝ:^5ȯL#x ED挍U 9,d3xˠwo4{k+<+=`'/4{9[%qXl٤J;_ݙ,"sgN|OA1092pE`}&cNŞ*X[aYד&U,""2o$ȜIT V7h2d;r*|zHT V7h2d;VyVjzzIjEd2."RR"yVZv7m4s{dY$$ȜI؍yd]D&Rb\ U ̳dVJ̉U6.AyvZib~FAyvZqdaU5ȃ&"2RZ9umԬjMEd2+%X9dҮjML>+꽫vU^96x:몁T{f\@mZbd {7? 3-Z*߇Okm:dy kl*t WDdΐ 6t};[QA#N=>'ð*}6wmVwGyqVwEiMȍ -(&VnFZU]I\(jOg~!i}->Wx3^h?^/W]ʺ`3Dd6,ZjvO!Ge"e/GL<@f2G*jQFot5HiyJDf쟷6ci@%99FZO[542ah$I`ikK5)%'jI`ݰG=i4,`w~.zdu>T͖닖\' mD>ӫ-kGX$uxyZȘLc1nڦ_Ɨu}3pJ 9X@}PFX O=%O΃[s'S3 iN^ZJp4J/3vk !#=]oQ:o0V,fۀ/aa4ZS3vEds_0n’nf;>ӯ- C[_^0x~+6aK= 9"Y|o6YDfk0.y..,R/¶sJ>=&]%eѰ~_:*9ȀG QDf1!1UǤ/:(2H0u0[lOJZm+~ƅ*Mo%%ȀF"y/v.YaQY=Avaf؉|@+S/]PhKya?,@WeDwA̤#>-6S/o!L߼04Z&G5sr86v8vF5zyEwxG;z,"]tAIY+v^oViM-6RxMeT"2YmA|)aYD'} 20j%} 7)Lx$sY"E{tńYRTt_]5V,*FiISH်΀;Mآwi0[d]2- "2>mIDf78BpY^`Ǝy-V "."3sUv&9=@g'"tkpeÌǕl!l(c&Sے9vަď1i5Rv!K',}pGv:#PZ5Pl"23NxoE s{xdIaUDFHt J73`.cCN짽k<⪁"'ًG.VDLv"2(pUׂv["2?gX8|f!1tB8 (("L"2*t ct}OjGİ6yOHs& Οu{<C~:4يE#wiSt&= RVJo#eƦ.*  !.x$`vP`mB(^۲ \M6)9&fUeTї ۏj1Zیh(۬Qm%GDdP [_u(e{ݪUJKعѲ?#i~ =cBusx%m 3*u=z}6{bQD&Dda;_oJU_:'\g~P\s)?'K^q?HM+'ߔ'銁Q)+c`%1W7 Pm1*9S__v1TdѯbrVaQ'8R݇Ҽ9=Ed0a` w? g%"stNVª{LN| \hlonҌɻ]'Rm*<EdID=EC8k1hw &1g1siJ;T 4gQe5Eٓ*S+Mx|&#j5$2k2Khkv&5?HФ/>/] 55kj٬(Eo.J?|k\[u^i[#.вW GGW]tQ|5ن9X){rZϒ=u4T5М\ՔS}yMPlTs0Ȟ~Qg$՚ K("6__$b׎:?h5n֢<ҪO+zq/"~} EUjh' [Yυ2;ByCxn%6C>vp 9<2WeEAi[qh(?8%Gw`߳ݥA忆m%)8}b$\| !U"2'J~㓰j{4ODF fGZ܀x桹#G+q+B!/V&,gI^Jlks NjrZ0کDdq)êLMCBtﯢ_>_Ue; {^ЊȜ靦j'"R{IZH?^/8II^]Z+8$zZ3m\5>__0/ߒhlWDF-(8L< ?.z x5xS܅kaS[$̱#A7;!~ 2 mܻ~ :WNltm;=S3 Ϡ7X9t.\I;-+xW`U8(*"3#)4sctf0]VY"؋W $ه[5y~p]깓A ̔w3x534/a0}>kKA _ lV7$Fa$QJv|4epqɒL"2EYV!]n.wt50x5O9 "2'J w3'/@u|4Ddt!0hX;d"t?;Ħ׺F;BfJh/5&zyj IYQiihkWE,jzN"`;"2>ZDrx76GWCp|z?ˡEQFې M; ,Ii%(:[hP별 "\t x}i 0IA C[Ϫ/=<%7"7Uhk8[2Ϳ5:Gĉ:u)5Ṫߛaa"28r@3yBXvF$ WfP͸lލDd^k֒@,3PB#<,$vF'74fe TwamxȜF蛉4h GIO&8MOhK(,O^[1eY"24 T3IDLebf\WRWO0&G%"CP,o[_D;gl-QYDuBfra"2 kYDL`z? vIDf8SbOtGTo""SB'&4yy~"2bkbj%"sN|HEm^o &Bs'!E},v\Df Ȝ IDf8SWJfPgEdjfGDeND3exQE>/LD:O "sL?}Dd^x,Xq2ezMrDd4O"Ed΄xȼ(fx$g '>(;am8ȨF19Ԡ&@]dO2UQj.H43P_ D-<(;"2k9ݖ`DdjD"2'sdA;"4nzJhrfIN̈́mێ,66̠9ӴKem E O2G;".jYLjsI0-E&NO AUxȤiP1bm IUs^U]}ϫ`mk*p+Ntwpz&tt vO@Sk;Dd^4seEW D+:!0G,"!fNβ{'"r۸W7v5|,&Dw6=EX/oiic^_hO iXCT33><`+նODtG_GJ؆(SG}?L4oEilŚ*+*x `tz kb6""R_û7 ϋ0sǩfM ye E u)ew0g*^ՔHADGyQ Ux[j3ҽ]"2<.mQ-L)P!ADG| (H"2t]F#{ь\e"Wr&"S6b94 gtTcd7.fu݉Ug3dÜ%we-/ @8~ ƴD=%3{kt& +"2>&NpCzȨ&kPWXky ѣzkڝD={C=88/W("5XB%# ,"W=iE7=쥳e}rCDDBD<|U=]T~ &yL <%#z}eóȜlVcϩ_uK]uIzgqIZ3HDDDw Z?yYh7&"c4WEd.ԸT2^Zf8;8n [DdT w 5$"),aB+ѥ9Ot۴샧˹da"2-kHD'[DF.E,IDL{"2S""ID}h7"2']Q-LV,D"2:avM'uOHa}M\_ 0X2t젗ЩAOtӐB~8颶[Df(>/:Xd) )ƳH扟̜#a+\*oV/s xAgs, p4̬' )aLlJ;E]ӉafEd|M>׷͍?d#.P/pktl-e#԰ ']DF|}c"2CYLmcƞ9v$餚櫉{D>="2&_5jK1uK/KcJKJSL, t)wdjYIigew?~"2\|mODF)Ed:Lhɶ9Ot^I泊\8s/BYYDFd6~YͥXb=CW+yꃊ)QDD2 v[@;s~b=o~"2s~Ȍ=zftRu})ŗښDw@^Vg5Ӊ>-Ddg>jET2n61t;Mp"2C95t)Ed}x6O>bhoj%cV)3B?9Fd1;Lԩ5Jm$m)"'3X|63,"3bƞ)EdRHBFvxs"2X)i,w40#c,&+:-&nu#49d1[$OW."30ij `:ӌ4r!)2V !!x%tF'"zLaYDF]VÎBEdPjC[~*_=sLd3ṮϾMe"/{ B_j}K"2(a1"2s ʳ%,'⽅}0Ⱦ~Qu {KC{`HTq8NyiwC` mLl^O|}MW~6hN3F-3̿L 'OwF. L~#?KUhh7PMw< پ׽/yB'=.͑^kĦ|-ەyh$>!`~BKwDkedge and shadow{~BK <0[x[vICk)^,4GG>"HF~ID=1?A.G0Ƙ3QW9Uc~X<c]cWgBcv%<_ 1zk01x525]OeR`  Se%xIZ3yn1hr%#?􁮞@6<96ꊄ|:HNjW|Bdc *['4Go+_AAROjOؓZȬO$zfŏj4j@+=aSJ:!>q_TF? OؕE}(=S@5i|Qk}@-]`{QFM2jRCr(/b@,~i#zh섍) f86|]04 ƫ:ag:8A65zwCRLpL,u ԯ!=xE'lM@Z$_z0X x5'M@8z0P x%'lN@:z$08X<^&N@:r4.0(Xxt<jWR"rD>0Xx'lO@:L;^ ۓX@# P<GWo:!љ@g8 hRc좀e(Wp( ܂WQc׶e(WpHtCn mQ2ߠǫ7 8_눨oQ2xߠC prn_2m;Q1xߠǫ7:"ad\b۶eAWo%qU} >^ 3۶p#-s]|ʁ>kR^ 6`c("IowR1X+7" tCሸmJq m܄qE} A?_ NpE}*b>Ѐ W!- y$a^}A(`jB@$YmC^BXg|&\:Y¬#x3!,kQ|&\@'$YmKfBXfעL tY6nGf8עM kkhTظM ck^,62$:!̨q;±2 0Nq\3*ۆ 5 qbf\@#d^mCXvBY3ݟ/oE\-b!*r.c>%Edj@#fQ 3}c֟5>BwG9# *AP,"-_>Ide2=>4 (]Sp 0~x<tqɳ 4g>{Dy26zKKC`'i[!]K9 _e4qͶ.6ae>J9F)O2|2J_@,ȧ^>Śn}RЁ3Hοa"P&bJ Iԋ̰`;?&0pp sq4G<݁@MUm.< >Y$YD&G]#„{i^j(`":낏J.~w)G +tkS<1{ghT(lye+~e~:."Yqitj 5ԽCw(Q@=^!_DV O':5>DoܕC*d'޷'F.AfwmOa&Ե#-fkwmOafkص!fKOaVصήsf+s;9![9}SS>ND/gE?q;9![9}SS>NC/gE?q;M{/.'vVđNB4lWEx́={`6]P6WFh+lj؏@qs~ =mE_7j+гGܦ=i7I>b-gkf* Wވ;4p?,lI}Y%T*AGd Wp?rt[;YpP#+`c8ПиSeeaWR`;yR'ʆ7` "`3.ހp? pB.aԬx&0 Fۅ7aT(Q#6iGL2=Fppͺ0k6trO\ Oa@5}%.F{JR\Q!t`4Y~B5%?˕8 o>@x*; }o^T\M$.Cc l݃)^틋bt@ 4QÁ>UwWt_B,= @ɻ g#[+J~*ad' I "8/.I['v!,PAE=zU|̅(Z'PCE=q xOut}/1*+;>qxxOu:4(z2:>z%EC42 k|d/.e@.؇Xz@aQEu@@R:E H('~ '7WJ tDY&k~ .9UwzκyKG*(z {q)k D-C#x@: D -]||\/1ť+ txAhD=:m>DQ.yp#>B4 /.%2(z{qjD×BPME=@o/Qtf#bq"$^Dc:@~B/(S=4x>DI6QGvZZ tR'"Nzz҉ǁx@i#"jWUp97 ʔ' POE=&jt:ERt_?xE O@JK?t=ꜥJ;/v? t;`('k?t=j͸uKZ(z̠|qWr{C#&)OA9ċz8H- ;QA|m'K2 Z෪Q#!/W sL.ĥWNOh: `a;Tl uڥL/H9j;a{KT^4u-}rxeSu $bY2~ssk"eΟC$^ÁSa6\Pw_ t{@hP! 6h7>% Z]]qo-uʷm&,RkT6U g>$D/oRPϵC/śVSs"d@(w#th+vA9"_*_ÁS& tݹx)S44cݴ(zL Xl\)"%x/8Й dKvvLA(I'"Ņ؀ Cb}w._ l/'t2XMY@a:@(&" tcm\(sV @}$~BvQ}۝2C&6ˉ<_=-PDKvuW\MxX.+)kъݷ]”uthv48*k{L'tv$Ɋw]=?OtI$ɒ7]"yQ/.&,Xo{ ċz8a4R}ύQ=&ցNXJˍQ8"Ux8mKvr_,e@U.yQ/.>xz%;ie.^q~YSQb' 7CqTo&)܅uIې=-SQGEjv/RO1]ߗ(UI7M-y^ iBz̓RDUl|^O/Luq,fBRd)4M6 =7Ivx7 9I=9"3)<`xJl| zZ{DEGT~8,%OD P2:qӋ@)+Fwө'8^08f:#qG(i&)+T%EAXm e #d6SMRVب8fdYa(N(4ei7GS`yLR9yqޤgsf΍]/PWq F)+,$ќQP7Tᥤ]&\Ebި8>ES`vPhYUkƍg|1g\1)*/cUxӥ0UqhZ#TG|`We,N~BK [xk[7 Cӫ7G}H"2I\tc-Ctc6;1D]ÎWqBcq>Jek:cĴ+x Lh1/8^ 17]<ϫOh(_]c tgtqb$iSن.e%xIZ3yn1hr-WwjIkfMO#<;W|Bdc *['4(毼J19>2!ƫ=ȬO$z>K Md8LDǁa|RiWxB/~gԚFix'4 Y3ʁcwo4*ƫ;AqȲQ^Ā ,(M1l fuAiw0A\04 ƫ:ANЀM~IYRLp0DkHOI Hۗ?`8@kPOYk@E ^K>롈)WqBWRBrc(`aqUЄ:q X✟՛Є;a h{cx[ DA[۶`,C1x0` ܂WQc׶e(WpB[B"jl>m 7Mh w ^GD}B=b@[$u1m'> 9x&4Q cYm b=^ MC~aXb߶neWnB_*Vض)ho" /pCQ&žHQ`mρC&žmIQ`m܄& !ApD(qR2H+7 BpH1+Jn 6Mhs GÊx+-KU|agHط {)o^6 7H3, :ۆང 6Mh  K¬#x3!,kQ|&4A y`V}haoiX fuظ k^,6 7H54S*lܦ݄ 5E#6nG8vXdƀ eG5<3*ۆ 5 qbf4نF}P@ ۏX-b!*r/c>%E(Tҥ(Es=ʘZmф~YKEA[ Ca(,$SYf}'bhuMxi G79?ͽQ&;״ tzhrxiG8*j>x¿)CWp(HU@t|07.X6GL"뮷/kGW<{!ܠx)LOhz%G vOhAZ\/?emi("Oۿkx)_owKŬܧ0?0 Ln}t-,8ʨ7qͶ/ ~ }"rR dęAQSRʴ`9/@>Swo(9! z0#W `H^$e 55A!WaJ0/hHœ yZ0ڠ-< >Y$YDB<'~W&0 2{(QY >*Gֻ|'ǘ_HXɷ֦xrcQX&VtPXKc3P;'4$pz&&zWx:9!z;瑑 ;ɼEu?A-SR흄DOI-c)*4%DEo=a'gfv³ QNd^7n(!*RS-LCkҧ5N!*ORS.LD{66Svw֘|Sffh9H UBIsI=e'yhbgK=ebsP+Tn'6%e}1|l t `¦mkzu.lѫg`tcU $=aU=_wѳe^08A)JȂ7 MKd)nQf뼤h&WinOxxK]-󚚪q?WkxKL򚢪q"Ʀ>I?%^3bl7 .4)$q+M1pl׌86[ 5eDKo#| G4 t]ß] 0l;jisNi~?6CoRټi(:t-[f pNmo?OOfv9v;˯8NK7m]Onnu;z8+Lp_l&nQ;q xȥ* ~Z%M]O~fhm ={#zR5<c_gkvVSC' 8[5D՗PRop MT<_BMO\Á~DO+t6q@/*'y.zRV(&̕{leUMM8u!ĕ{leUMM8 u!ĕ{45Bʿ(x^:U[UW; 2B__]˭ #8_iG\_\DžaT(xP#6iG^&q#8Aac}5\9c'l¯qw>z#W%)g.:N0x,?wF񒍟C7|V Gu7RG{/*Q.^||&X1 }ʞA/Eo:ċ(z@p[+:׺K{x.h@GwV񊒟J.7 }``CȻ Gz։]!gx@v^_03s!|xEyʽ @xEA =^dݵ\8ċ(z Ns[ \.1ť%o/( EPKE=@o/( /[t9!rI0 '7E]$@~z шz;t`d.1ť-G _>4z>@I6p> GuҙTxEq }L9 %$^Dc:jk7eKYPOE=&r K('"@GE&Bts)OA: ċ(zL5aղ/t@@) ~D'"(б+z!@~z,9K'v/v@8wjQN4x~z,Dq떲Z(z̠|qWr{C#&)OA9ċz8H-eċ(z }qA{KG~[?t=l͔ʥχ' Wp[fڌ\$]Dc !wɩ]^Q\>r>@9@Ur#W-\"{\Dc(Hxvz,9; @WWYc :3>M7g<¥(wעyZpXx3>K8g< *j[v׋*p# )O P6IE=Zh"RYnuC# 'X{`|z%{UBxǻ5$)'\i"ʪn«Z8tڕ6r ]\QSzY@頬&T ,5Mz>{/לx@UEyXzJ5'^Dc (߬j=N,=Zf.^}^em9Z:Tء8X#:vBדQ8Ї;%P'}9i+\Y"˧ ݁۽w.],hzߪ&^Dc@_ v Xt]9K!Р tD}'`a'T?l uڥL/H9j;egKTx^4u-}rxeS_u $e,\?йu_2se`Aa/@)0q|Er;v4^/ ߒV-T[ `ݣ(G9Mm2/3ѥMʃR6`wB9ߊbjW^Dce@n.0Zbs/e@ŗpÔ Ab}w.^ @.nE=&Iyq v-Ԁ Cb}W.^lxPl<|l%orR hwEYBl![;/e@I6:L}0Rf dxEIz:Bص6P.Պ9q+w>PYc?S;PVKPpDUT(%h+.&el┵thۮ܁^ċzDaʺ:Ib]W^;=&: dā' d܁^(zr,Ɋ7]ˇzE=0e`)VƿX( |K@ V,ƿX(TxPl2 [Lk,%'"ObSzzaAZt*5ID4;7($nڑ݀.f&$S|rvTnRD{))i)Sᨳ<&XxBy^O/JXXBA|pC'" ObC rza]& Pk)x>Hr1'z hu{~ ]<}KF?: nCcz 4E]\Һ [mǓ̫!ȁSեh4`'S8bC2P@7#ʼ^xϫ@0=>Z s(+^KaŖF/. tc1lc6n1{cn1<7ƘMpcc6n1@7ƘMpcc@7ƘMpc&8Ѝ1foy@7Ƙ8Ѝ1f tcك 1&EI~BK [xk[7 C˫7G}H"2I\tc-Ctc6;1D]ÎWqBcq>Jek:cĴ+x Lh1/8^ 17]<ϫOh(_]c tgtqb$iSن.e%xIZ3yn1hr-WwjIkfMO#<;W|Bdc *['4(毼J19>2!ƫ=ȬO$z>K Md8LDǁa|RiWxB/~gԚFix'4 Y3ʁcwo4*ƫ;AqȲQ^Ā ,(M1l fuAiw0A\04 ƫ:ANЀM~IYRLp0DkHOI Hۗ?`8@kPOYk@E ^K>롈)WqBWRBrc(`aqUЄ:q X✟՛Є;a h{cx[ DA[۶`,C1x0` ܂WQc׶e(WpB[B"jl>m 7Mh w ^GD}B=b@[$u1m'> 9x&4Q cYm b=^ MC~aXb߶neWnB_*Vض)ho" /pCQ&žHQ`mρC&žmIQ`m܄& !ApD(qR2H+7 BpH1+Jn 6Mhs GÊx+-KU|agHط {)o^6 7H3, :ۆང 6Mh  K¬#x3!,kQ|&4A y`V}haoiX fuظ k^,6 7H54S*lܦ݄ 5E#6nG8vXdƀ eG5<3*ۆ 5 qbf4نF}P@ ۏX-b!*r/c>%E(Tҥ(Es=ʘZmф~YKEA[ Ca(,$SYf}'bhuMxi G79?ͽQ&;״ tzhrxiG8*j>x¿)CWp(HU@t|07.X6GL"뮷/kGW<{!ܠx)LOhz%G vOhAZ\/?emi("Oۿkx)_owKŬܧ0?0 Ln}t-,8ʨ7qͶ/ ~ }"rR dęAQSRʴ`9/@>Swo(9! z0#W `H^$e 55A!WaJ0/hHœ yZ0ڠ-< >Y$YDB<'~W&0 2{(QY >*Gֻ|'ǘ_HXɷ֦xrcQX&VtPXKc3P;'4$pz&&zWx:9!z;瑑 ;ɼEu?A-SR흄DOI-c)*4%DEo=a'gfv³ QNd^7n(!*RS-LCkҧ5N!*ORS.LD{66Svw֘|Sffh9H UBIsI=e'yhbgK=ebsP+Tn'6%e}1|l t `¦mkzu.lѫg`tcU $=aU=_wѳe^08A)JȂ7 MKd)nQf뼤h&WinOxxK]-󚚪q?WkxKL򚢪q"Ʀ>I?%^3bl7 .4)$q+M1pl׌86[ 5eDKo#| G4 t]ß] 0l;jisNi~?6CoRټi(:t-[f pNmo?OOfv9v;˯8NK7m]Onnu;z8+Lp_l&nQ;q xȥ* ~Z%M]O~fhm ={#zR5<c_gkvVSC' 8[5D՗PRop MT<_BMO\Á~DO+t6q@/*'y.zRV(&̕{leUMM8u!ĕ{leUMM8 u!ĕ{45Bʿ(x^:U[UW; 2B__]˭ #8_iG\_\DžaT(xP#6iG^&q#8Aac}5\9c'l¯qw>z#W%)g.:N0x,?wF񒍟C7|V Gu7RG{/*Q.^||&X1 }ʞA/Eo:ċ(z@p[+:׺K{x.h@GwV񊒟J.7 }``CȻ Gz։]!gx@v^_03s!|xEyʽ @xEA =^dݵ\8ċ(z Ns[ \.1ť%o/( EPKE=@o/( /[t9!rI0 '7E]$@~z шz;t`d.1ť-G _>4z>@I6p> GuҙTxEq }L9 %$^Dc:jk7eKYPOE=&r K('"@GE&Bts)OA: ċ(zL5aղ/t@@) ~D'"(б+z!@~z,9K'v/v@8wjQN4x~z,Dq떲Z(z̠|qWr{C#&)OA9ċz8H-eċ(z }qA{KG~[?t=l͔ʥχ' Wp[fڌ\$]Dc !wɩ]^Q\>r>@9@Ur#W-\"{\Dc(Hxvz,9; @WWYc :3>M7g<¥(wעyZpXx3>K8g< *j[v׋*p# )O P6IE=Zh"RYnuC# 'X{`|z%{UBxǻ5$)'\i"ʪn«Z8tڕ6r ]\QSzY@頬&T ,5Mz>{/לx@UEyXzJ5'^Dc (߬j=N,=Zf.^}^em9Z:Tء8X#:vBדQ8Ї;%P'}9i+\Y"˧ ݁۽w.],hzߪ&^Dc@_ v Xt]9K!Р tD}'`a'T?l uڥL/H9j;egKTx^4u-}rxeS_u $e,\?йu_2se`Aa/@)0q|Er;v4^/ ߒV-T[ `ݣ(G9Mm2/3ѥMʃR6`wB9ߊbjW^Dce@n.0Zbs/e@ŗpÔ Ab}w.^ @.nE=&Iyq v-Ԁ Cb}W.^lxPl<|l%orR hwEYBl![;/e@I6:L}0Rf dxEIz:Bص6P.Պ9q+w>PYc?S;PVKPpDUT(%h+.&el┵thۮ܁^ċzDaʺ:Ib]W^;=&: dā' d܁^(zr,Ɋ7]ˇzE=0e`)VƿX( |K@ V,ƿX(TxPl2 [Lk,%'"ObSzzaAZt*5ID4;7($nڑ݀.f&$S|rvTnRD{))i)Sᨳ<&XxBy^O/JXXBA|pC'" ObC rza]& Pk)x>Hr1'z hu{~ ]<}KF?: nCcz 4E]\Һ [mǓ̫!ȁSեh4`'S8bC2P@7#ʼ^xϫ@0=>Z s(+^KaŖF/. tc1lc6n1{cn1<7ƘMpcc6n1@7ƘMpcc@7ƘMpc&8Ѝ1foy@7Ƙ8Ѝ1f tcك 1& f~BK  xeTǶ$9ɉ' Hw[pw 3$s=y[kڻgz jU%_Bx5-|}Ð,d!]! Y^R[S5_/0d! YȄ σ C y^Ko,d`hxq^g}`|Ð,d!3|7\,,d! 8|ya,Zewo1{SW/{<3{Ðn+[|@.n>!bF?@,%t; }CwD(V, zPn_)#G`2C1ޅ!yоa(dp{m~f64+6 wۇ^#"^2f3C!PiրgQ^a(d{ۚ)3҉lB'"__ug}O>A!y,KI~y CFa}}k,2>P_9g=D'޻jC} C#1AW C=T-nF/} yxp-_;<7 Q#ԒzNpdL(p2 < }uɿ+0!xwgk&C 餓|J}Lx)oǘ},tw;zoܾ{yÐ=By"WN|%8d7E*U)STc^' J ;_ S`A]FA:\>%ܾ F 4iR;Au<$sbάt\:Q|ݾgoa\C)UG:aN(oKcˀ:3wa]Ks#mB0'Y"׏-HF<NPLQ/}#G޷~'Ѿ7L C9sC{n\H {|>uIu"z3S@'!^ƌ2cCs47$o2)C5-QU(o˚%K̙2eCY};EA|!ٔSCB4Z',P3|2P_̨#Gٲe1I1N:99ݾw Dg#fX}'|"h>0`)!#6Az-i'pMyy y@<4S@P#:|HI)7cy AG׉7 fFhVn2U$&GSb!:g:Dlt`> K)-$d&xM%SPyy9E}2ŷ6]z=2f@z0v C泙# Md~ GZLTW L)ۤ`+^X"E  HO6u߂(a!&I8 DŊoG7L7 Eh03[Ur͑4ܬI)Q;J yx̋1tiR坣.:P~dސ蟸{C.zs'Pӹ_ œ VZ&̸uR.=+I{\e˔fC*?"=kL~)W8zʳWToX|̙~ȨNt% 4JBP9EU7Bz4d乑2n!6W)6?$n,,BTby@<ܹr0Ǵ&q׃7TBż 3Ȉʿo2_Ms:xk&3Õ1ݚ/tE2zˉYp[N)ş=8dFjժVR1<x1^9e)It@\,:F^^ ᛕ^ CH(,Fj3K+Gz*.TZ}MJqr+n{kժY: Wsb*3Js QI.,;uj6߰aq27DǓN!H*.Lk&fHRniM~zuȫZRE2-\93gT2N;Y)tA}joX S0dЬpAT$ Ɯb)Ŗ4w {$Gƍ5lؠ>@fj̉e+ N:]VŻoFYEs`-:Л+2(+!3B#ysxs@kƟ~!0a2wZ )Ot |mK)vmpE͚6iWtƻ;]tǁN%MlaamxJ2eo!=] \k*ӡ|cJttgf/R{J){mڴnի[@ٳfR.hɶmZ27jHY*8~)V`ٲ7T\ќHrR<0T-|L?Bz.)PXR9ѝO)I x}ݫg]tоm͚4jPNjU*+K|yrӥ^" Kn,珿ӈ+Zް~J7j{CvFt@,裻!{N2fa=8 HXri.I,It}3ѭKڴjѴqzujVRl~|X\˩bj\>x{~}ӻ17l߰Z eK*s2gC)2QbyHbL/Z"n&DiͺBˆtvt٤1D)!G$AްaC0G\؆weʟ7wNwpKd"J>|P ۶nѬ1aAGϕ!BWBݹOV|3Xw5LE{"Ǹ[~VR?ÔbH)iT E2h?IȬ,Œ=j$۴lDZ\"MӁS@W+1 ؿoݻvoVukרZll!$bb20d>iP(Z*B#`92g#S3 SdczVp &.A0~c Awک}VHU*x3+#@~Jq! G1|(G:f!ѫW._rH󝮹$o2͉4(7?.DwlhM4i jY~␑ xKfɓ&NϘHۻG ֪^l(ōL~IBCtBZZ*h.!A7ZoI/Mϸm԰ΆgaZR,K(t_(ROAΜ9c)ӓxWLI,,gb NBoV-6WFҿOVLBUix:N![!jY墣1LAaV;CCh֤!OqPbR3 ќ{> ySL).RE=x5gtcfNG3 ۄMXMDw"fxNQ/8 bDսKvRNrEϢk.|c衭X"y2*Va Iw܆ Ɯ^gHoӳjKa4So٪뉼O W?!]tE 8{tek֨^-(Q,k"3$Y^).@/8YI!}*)Y\d&FC9h*|#{0)_eD/WDQI.N>LϦJК#wlR:8_/Ud`^:g.z]e G8[47wܬUx ΙN!@t~qdY./-;ٿѭsGQPJE?`O6]1]i#()9Un5~Jϟ[#X^%i\T@߸qukV\tysfNgD5|Ȁ>=vlӢq}E9x*Jpy~k׬_B'UJfS vHb[! F`ZzeTJF|:ӦN4a<ϸЯ7+k E"LZ՟EsDt7`<4> O !zO~VopW"="l͛6n3v> cG1wZ5mPJKY{Z%O73Xd|'m7O1Ӛqdqп[!T'M|f,2~ꕄ>l47ikjeYHoxgրGWn/ J0]I)qhG۷m Hg>,}c۷g5b';PY . +k!d|W_*?)k )Q\u4mݡKϾ=~-\lŪ56lڼ5l;v׃۲i# b.zv-ԯ4nڶh\[k*/Z]u{S0 @oM/qR$vGωqKMu\Ww $h_,O8n԰}ATj\F䝹_Bls- 1L iխUf8h4Yrץ'Pԯ&(ݨNwVnY>>d W8Hh طggxf2})8I}_%`0}BQi5y|}4>9޶FBGXStB:4Sr·o 5/saR %5b'wQ+q%E`EܼIq8hg"N:yF;oe.,sΜo閰= ƾWǎk׎m[E_4o6h.8{x^HV:eo G(کMs-]'s۽kOWXN΋q;[p\Zޠj]I]f7y z¹q.2ӧNpضe#w}me (:N#A`#r:wϏ jW[ N ϊa` ׫kV͍?L+`8!ǥ]&EL)/{=.(|ã[yogyLARΟcD@߃.Ky`%fa=3gDD0<D߿w%`7ױ}2n>{D%C1)@/s[4WZ%vX2Gd5DžM/PRDČ BO^RWx~G\X\|:o=dlٳgQS'Zr¹84]~fzv~+5%Eq1 KVT^]ۣ^AlL3n{K)Ӵ>/8A0|&ڋăB]t)ȳ=/#u-syncRi0=|h.K gs8l}Sk{1[yt=lPP;]&[X ZcG`*Ţ ?0-K8f}$_}x@nW^|)yя9owxh.}ه63/k<93HW vU@֍y ;+s3@"\3< :-3n۶}9[Xf[+ӓW,XȖu)詻ґN}ۖ kV, 褀|.\8/blchQߠqa^sS3njol{e+a0x%O0fP;']~=kYEtkN,TumH8 ,O>I,":~e)ۍ/4@OƼssӯ.^x*F"Xn8|_ciPmOMI'9w׮\I13EEqsGA" fIbryf#@ԽVĺ-[I 45P8.zG<ۥ 1tXaaq#յCˆfb& po+1/>3"mMNΝ QΡ":#^@g_0'}KQ E?G7mL'8:k^%]v.:Θ<~uh~;`2҃+1 "{EzІ_vsgQsٽY}Wɿtt-dk@OӓVC3X BGH膱c.O=l`<$:;;ڿgǶ-DDzwتrko7п:W_ LFw ⣆q\+\s9&@m %З.}l*uluA[A tV@h;ѭ_tÀڌg\t<xvy]px^|Y@ӽcFˠlɅkqo-HWE=U7|<9_mrt= zEus>-Ao6EEo/CN&C \ QL,=>oits+=a`X ECD5Td/uq: [XOJ)SBDG:?lZSqa0úr¹39w6j;)S.5@lJwck`x&Gt{ $= ;ލ= @ʧ>}X<ؙ|x#8l# 3.4tvVɛ7/H"$ ,toD18!ӫSKg;"r'V@u+=@apyܞ=y@sr(9=,KD=x缹sMLt@0>{:C4˟@S% Ze ts?pzzX,ǿ3=oMz z .T ?Gz\`J` 7:J.~A了o 쬊cV8HAԛov Ʀ [HtO? 3 y9ҙw[AIt"LBGݟCa.:SrYƗyǁ^|VhBa̞- z&] vag=xt J,YT#~;_6 fq k:$ygŋVȗb+['&ѥPBB7 vtbE>CaߧitKF9%A~)QHgʝ4Y;zrޘ{<52ʋwmYeVg~[済K l+'G:~Jzvl9ҵ HLB7S4n?z$H)< W,XJrѥ(Гʕ)]R""5I@O ~&$wS?vX3CX&I+,$ڊ-\μt)DCk/&ڶ; y@ʊ"4cS7W@:餋\VBtggMP=7oL:Ϊ*jժ$.tɭ/qC+wҿ&aTdD AFQoC+/V؟ԙC$ѷsnѫV*WDyseQ]x[=+QV2kQ$DH*@7WR_FcΚ='M 0e6-tk/]~\hѴR!.yc'5b(nN:5V,[xAHEcK4W3:Zwg-zJ^[.xYvsgM2q٩==SޞFkW\:рD-ZlHѡ:ilU׬%!jM-m: cFV` .ujTP t]t5_ OZ|DKrq9oشxL߶P"(?5c c DoÈ)yon¤g2|+Ws#G_|EΜnZ4rU wnߛ[7kTVrJ)X.Ns Ia'x|Xb!+ʣAwjޤ!26;tjhNJ˘5IQO:ۆt#K0g?)3gΞ=I0={Ё.5tQ(w?C=nӁK{y ҀgX"K}Dc@#jW]"p1廔<,`U(𸐅˘fx(iF6ndnfO>j8ٸ/~ ~os3@0 HCW1KA=p`t"YЅ/{0xYs/Z|%a8UvlЩ=h9^}̘2avZѹ} TPVsSaQEWi.^nA t8erlp! !YD'XZ ,-GMQ/ps/\xbT<1+=rC(7Eg@P V/N]{7hcA?g9sÝa6r.O"!No6ǃޫ[Ƕ-׫V T?c.:f.Z5/EWLBS4C1Qʱ[hn:L=tl۲)#pΑ9Diu=oݴ+/ONX/jәKGعi s&"].Q<Չނp__ LB34pʕ+WF(1>рDOR #:}c;E@:@ VP[D[4(v{wr¹3=l`4[ 5BȚ ,{WHZI.dr^s嶯fINtnoٷA`6+}=k\v<%g̺2ѽ+%Ri~M̃dtKF1J"2#sbTP vĹM4R<HLߘ=DS> PxtSrAVbZs~y:ųLw2r ͭ Aw3"Eϙ1yzw5,ϕEt+&1Q,'[;svd ?ɜCX)SXPxqp0n.߅ eEdM{d1P(U! SL\F#)Dfs H%ٶ\#%.Y9|P6<IۯңDA*ݻaC7}v}H[$U`!KG 퐤+Ze SeE?֌ 4eN0޾uڕ 4@>1&;b/@Q7 }+m(qQ,!/Y0{#ٹyzU=Y]fW@e$tq .]B9pMR9w:hb+X_ǂiVKL!xh=8g9I\V/_4o&{Exi!(7:ugQ 1Q$[s".=[r(҆_Ed˞ZNjKܻ./MeEϕIoнt:П<\.NX,@ms."`d[Z߽%\n\b|jQJJZQ-o1@Ѓ/̘ (s4 DtW\舮g!X CM=Eπ>t?>mS,: %S`6>9l};A˦u+Bޢze *+"ЃZ[ݒi!r&/<{)F$g٫Eǖ.Us 7<1ŀOJ?6Uនdg.M1)"3F;5Xr:2,v=tLYSw@\QD']y>3tqfm]0SLR<U.VѴC?Q<'c2.H⧧esM:j,+XĀ,=s&"$"@ efv֓= !`ֳSis (y=&3ؖ61б6ɅgΩܣ x~9枟=g#xK:MZ5" <</E+O:y$؉ Kǖ*b_Q0W t[@_&މo"sY8@g`O2-.nhdܹqŏ(%5Gp6:N$JE," 22#O8~cMrE0&WXZD0墺ma[6m$x,t?Lrň$HPE om5 Tt\xOHƳ'OPDttWq>͓,;+wnۼq+)#bM3υ`Z-S1"-.VCwq}$,,,+z>Pi:zҜ|c9xXX֭[ $7F`rv ͣ*smآ"xt+E"k7\ɁNּO~;c^Dt-2#PvlsseI9"twljFN#-N0Jx.Aٙag.A@sYps0o޴iƍ6PDACWz.ZZY.yߥ9W\;sITD JZ"sKm[6_j }!.NwQ}+G9}{ a<R+#X!CJ:Qg.Aǟ_<<q]vם;7_nڵk׬YC0XC'-IFizD3biRtiFgm%-z>ׁ"tv.tc ]]Z`kukV.[,y%$^)Ns拒kE:y/3 S=vl#̵fPt,<j9;?on9kV^jʕ+VPtԁNq{`d}+ Xx3nT"G Asvc 5%eE*&JPlO\ʑm;W,[pߟ3x-)pyhV4O@ H T̥DI.K"ϛ=璊WrQ#+RE- @7h 4:]g.kQ^qc 7_|\Y3g̘1$b$alc}U)z(4&&FU54 KPI6;EǍԻ} Q<z~ziR1it"tNtPdJJehG8B &b,I? M'ynqU@Oy}ɓ'MH0 =&J0\vCjjJ# <Ϊ*ȎfvZ uy3&>˗.^8Y3пK;_t"Q?!㹭|U#"(zmڕ͟CsCxD):,- 1IOR ɀ#tq{񜤊Kowr.d K/,Y`c)'M?nѣFd6`㹷7n޼h~⣁@ϥnD6_p5?I" $VS\4 ;t](FS'O?vÇ 2hO0᠄~:96CT%ݝUOB2ȉ /=ڶlRvJ7:~t؁@g."(nIXQ'7}ܶy0|8ߟM'/V0rtB:9~OgFBXeb =5]e¼31h>lAۧO޽{k`8]za]J;"kN0g9X0!p9Iq%tqU5K UqUH#>F$Qט murI._' Ʌ3 OOq ,8%+.^ T DGd^ VR@"W)(Zsu3c {k#խSV7@+S9y2#41v<ܐeE(Ȯ oC4$Dn1щ0&ڬy\:8PV􂛸XKܛ昱|KQ._&;~g1ϟUYD13^oJ*#i7$7BZ#@׫l7g:E}l;G K/U3nU9&6w[7oҠ.tEΝ+W.IؚȍGd#*sRE02}j٢3I:IhA=&ڷ[MsD=3s wWD]p~˂%]!Dݿ.E_,6ɅXBGM˗.?K=lNd 0C010E'cs?I^ %?sGؙKW\L|wKNg 4kTN " 7wٳe˚5+$(t̲hD5E4m)m:5Q'm٘~2+œB "h߼~eE=sJ\N% օL 5i+.H6,66O~u]3-W2RqI:@w߶&>bܨ0l]٥CZZeJ/Rrfϖ5K̙3A5lDJnNӻS+k{9G>q̰=;mrE\1;Rz BL3f@0 5I6 0&ƷQ $6zs}:QC0&}L,@YAnŜ2.8uIb^jʆiK̐ΘΠ.bfu $d- 쟑-2wƿv?ё;n:]g.[pA.AlEs3t'OGdLha]U``b% sgx#MB}́ˀ̛I׺P ?#;lZ%ڝrLH5gv-^\E ˓ xL%A0*eYSWFFC cOt"O_s1&6Mcdt" cG;iA/?os0#=At/gi F~ԽoÛHϜB(V۽ckO1яK13G=%u ;"(#\\qټaJ(+_dj.LEVNq ig.MKZ4 9.AHrAGo8;i_:jr;QVIBmbeEU,[hg8v[xy6lܴ%l;C{0=$32gQT}VQqyuZ4M׬XJ']qyHt[k~̜A$ =A1r \ֶ!gy3Dt (Rt\R_S=:rnw",t|!s-+7cXQVT|٩]Eu НУxC=|GؖM֯[v7oeH߱ӕ g")ff*. AS\l\j4qJ[?#[;r;s4 &,qg.)ʺAk[0ɖ9#:ɓL"ZÜ^EBw̷KfYBQVԩmsZ[-&4&JVV*F'y,׮Yjժkmظyְmu+1t:Diߞ;PqY49Tv!"_3C(gD?+.{E\. %=&s2Ѿ=:b zԩɓE0W =)=6"]E;h{YˊheEְPOԁ"k>ڼCf_zWXz (#wh~:OfQ9TM0͊ B\_p`Rێ,{?[|*synVۤf ɻ5-(z#wyܻg׎m[6oڸqӦ[ص{::aAu"ohA}ՊU)=STG)P%>ݴQO%Try;I<2T$&v=B\@ S?F IK⏽ _w$Hu+EB\qK9@|7_n 7oe' S01XТ[BG T$r пբS> ^^`UWPw$t#t DAK).FIagJB~6\IҊIZt+ҊRW+M}˦ ֮Yz5ko$e6ԁ |=aТXxAqn\jTl[ 7BпW1yw+Di^rH߱u|YC}]]m]]}2+W.TK0`EMqgǖ Dk UM_~M]}݈HlWv)Н>[-t J%Am%E:R1~ێ$Jg2qb`nF*si=6>*u+ bF\L8!TTWUUUWԁS_a]P]:ݩ*fEr~̌zyEWr]\[ǩ)׸ή9膩kc2hv]R30ٟ|?mh{')2T\*.#?$Sq#Ԥd8:eNB"(u-;A>7N]EIc񒪚ZP˖W#:ܥS0-ApAZ\Yp|i㋯V@KN@OIHϰOM13LP\SѵwLW;3 [z Ǹ\:@y7/? NKO'knrT:D索VT#RwĂ.X`aE%4ճ\Ⱥ8L7`b?_KԬ_M|AyyyjلJbxDx3,]03SD@#Ȋ:Eфs&Ѓ\DKz%zeAtS+^I/[2=G{JH&\'xU$ 5X\`2VШdN^+d uHkST_|=v &K襩XPNS??5ǧ_By(P܎Gǰdضyc WQ%% tM|k,i?<%& GQG/~FFLqI& xTBw3N~ͿV@pATDzo",@s~Yii y痗WT.ZL.d:uO bS#V>l|_~nwScߒqRhfW>!aX #rT$RA\%t%)M}biڈ?F =*.);m(߈*'T̕$$tߤb*.JicG,x͊Ғs 0֗,ÔDZXÈc貺j2 KK1|_,8@RMPjFj^oDq񍹹 'B?hگ'Kzp(Н"_xUHb\嘚y1mR4"-MN2WiEqhJ=Z ^ԷYjy%EsfϞSP1wܢb;1v,ˆ{.bC֬]<'ӁBCJ/ s&Dc~V>|'ahzk/\0xZY '<\:y%#c*uMhVǸh8%,-,(,o8exۤxnL_k'#Raf~T3)ZLkqr6ק$=e#1_ډ>Yʯܱ  =$S"#ɟH0GX<(EܦX]T1 *sO4%g痨W^WU1x19}Rĉx6iR:=8;pKNP\ϙ3 PA\ z _8.\xR,<̭#RcfzMR͸+vR~i}F?(.v(MiS>>B߰*n{KH BݨýŚ %GXtS9ƸM =hH赕UxހI#V5T/Z0|Ǐ;v/?קe5yb?j7V׬AOxY_;C<z'4dYAݳ'ef]D# uOm _Rb_ :屇hO>jRȅ%ف.*"@gxJ'޿|w/Ȏ&dzKǮS"$-Rxa$+ҘF3{'k1D傂~\X\[iS|bq`S:). os!>(7?A=-!7STTqi:GK#YXVo q< 4"^e3߀Kj#ȝf&%33G:X~}ׯ;`}0M؏. ,$q9 ߼=H6>e(=E=u"lz¢^ς YLR L>\Q`S" a7 "?!K˹)?Yx*.DxJicJ _&_Z)kHhx&~oHOU: =1ȥE+ j#W4'/wZ|İ! ݫWϞ={W޽bToJqϣ\)/-*ȟ9#7';Gv@UKWݸeǞ{ ͙xC>K犛ч7!GNX]/.H7ONй".Z,‹ji7qo8eat:o9mB !B-rI{ns‡,Bpٵ| 4 鼚/jMeh' _SY^| 2W);,ϸK& KG*s%=/kouڳaO+WQݰjwGx>:q Q,ɝ> 賦gMMHxޯAy/Bݺu*{w@;`/`:&O:-g|h嬅{Ǟx_ywtV_|P(j Ci4)'`ނEWߴmkz#r\:oxE"reE=!a׎[7oܰ~5<֮ݰi]wsey^}ͷ}^Wt0WۆVX I6uI/e/̬疖/Yj>/[j 00B\Rm q!:!ՇW??Crc)iw㯮G <@$W[^Ѡ3_ *U6,_r=zǟڿ;uxS]i ?K$l⛡i:wkAV/[fÖz##jH\BS\ $<] G%+WHq~Z^}G^rN<4|ZQB%>g{_ƀެEwvo2gUV/]a+& @o:@5~-%Y\P]99m߷wݻwֵKwIǝwٹs.:|1&L1-{z ZʵދI@; :TtA/p%NȐxI lڭ%tЗhpu4PE\*h$!N[mߺpfU2  CϢsgϜM.9ٹy .[~=lDW`>kUJK.zʋׯXC/Xr@ɓ'N8NMsFF?xH:oq+W>e*WLgKMζ_D}Ո]K/x ]W_?%+taUJ_w? ?_{Vb!;_nڵGbDgH`q_~m7@A]7CSΨ$*sF(?$;{b%_'>Nqo⭃FS KWV9(=|44s $Y!$Z<~%-@<|̄Ys*kb9!(_SA8-,.5A1I_^=w0ԱC~tб#;zW:azFi g*/gaC(LDw_y':7BFP9\2Xٹ3f͝W! 1` WNy0aTܝ/J'8ŕ6=ݿ|F+W`\z݆~^y EMbWI k97L_)`I陻' z+x ܳ*qK,_PQ`rNN`~$/'~kO bZl\ri] kotlrس f>9!"1 ]r!K4&|N&aMG^tٴa=Y}Wkw;OBc+GDߤ}aDx.ǟ0~xX6"M%n1{,r65>/dBE0(,)$nN%L_UWU8y0Ⱥ3 -9- =ZKˮrGz@W/)Q~1PW|0ހ˞>qCϻuwо]۶mڴiAݦmvջtM8xȰǎ7D/,aPs1]E A/E&Mye ]CC};N[:/d:7ƤS'|t~@n!g ̗/|56nٱ{/#Ӳ ,?ma$cb:dg2ob0t^S w*T1z' h +-)())-`aU6n?9??x.<@:0x _6:=Etj)+*C.Oc U\H:VqƬ9sK2{!㈖qh .?T"i5}:ʪe+nܺC&E]rƃ*@rP.3ŏat89Y;TVow/_Pi5[џz)۠V]#>kBV9)` ݚWpQ1訠PJ:kdх #99$p-OkO}[KXᅬ4v[JdP[VDamOȢ|n~](0jm'Я Reyg>:LB= A߻g3oZ2~z``YyE+WegAiL[Z<.M]3sm&(v̈́> }!v}wB W_FHeϿR s|WwF֬Vuunc!k.*tjOH0 G6L ;1.J!;33+g=}F\ J1Gй>>y+:eVyf?n*gdF׾C숲SI亍8}p™+xV,/S|XA-EMv7߀˹Q@o jSH? MS3b}`bJзl\fJr՚m;wߵ>ÎgF7?Gt@; x=\b`~]Ls%bX€>9D r&^w*J >< "(#ȅ|BZ`@>5E.g|s|ZBc>qܨaؾm0oovmz-<_nY36mw H'޻߀A@ d2Ξ[pIrU mΧcEqTqk2/,_˖{ب78pwT0̍?}'m8snƙzsXpY;ꞽ{vmN?\تauܣ˓rT; ۮ2Z8t \w:1yKDC=`r(Q:Q dş[TRp1 . c~t贎6BC0H59qјun5%K+S@_(|Mq7eJJP5k'9$zKgPC!-yRBkW Wmn y/AL [KI:ɱi{%F*&M ^Gזm}.e>He4#.,4 јY_!?#c\cϸ(.tnN_*޼eێ:1t88Ԍ}l]0ӞV A4~!ѵ3ykoܸ wԹ+##Fѥ,<|Pb_D(dFαXąi(I0a1c =y,2E^@%·Y0ESx.RF%dǭT=.(rS<lQ\*"Ї%tS\zt-kHk7 S"E!lZ5&(~A]Ğ?!'}c⹓pi-qjM}0Dŵ>F@H;ҷM# > K2൤ _Dȏ Y]V xO-2]_wx8]#D%t CK9 ) So0tn>ؑӳUKBsso믿npN޲D{K]=7ovE a|@-\ }.%mN%fƏ3zH6fٔY@H:ay*I| AIM P }z7쁌]"}byc#xn2{}]r倩j4^Eݑ^}?ؑ'ŝaJ% v48&7dArnX=G-W-%Iig\ۉZ!ӋBo,K[=mZ 9DMldQNʒa.ł9SǏ>KNhqm ʯ7pL-[mׁ8cƧM̞A綢~^GuILEA5ҹGa#F5f|H G<_>e $Aj 3#O.#G+-l/4KM\RU[wG)zpOqrb]V"1KcBt%@v%HDt/n=s>G@Pc5S CApC-7Mk#&T'LgHov{;ZiסSn={8d(PܙWka J (d\c?vÇ #F&D2-'ovaia"DDOi,I ± PϏ[ :sɲ9NmX!Lf%t._=/Bj!n\sK3C@)s6Ft9 ( ._/f"8F*YX}P8W_WeC8?x9ց}D9fUDǢ8'fʲ)BZsd$t JW/]nE3'wF>,TW-YE0@ȧYoRO9SXh@6o)&Ph2L c% vֲ,Q^X)mwcAqyeuw= D` Ү v%q?G8v=V \D@7E5mz"', gW1ɣ<>*w)AD}0;;pNhNX~WqW_-~-5k޽g]ƧM&⌗& )U!F2\ 6%}|Ix;Xt}.8 H 2<bfJBM֢+HBI$+'+~鎽bN-nIPQz'_8o ag15}GTVf"7H$fgeM=eQB{:,^>YO,O sZ)]#vqaE^d!lGk :іڀt|zdʴ$z|tECgr+T-ZT @(@< 43fݠxMK`V):U+8c *>E!$8;|IޡI_~ pQ#!.ՀTZR""2(c1>G߾.Q.kMF ^9OgC ex+`r$!S4_SV]T$xOJpo\,&!tlߦe sfW_q]v٥2. :a7tޢek.{2v¤i<*}1YH~}C.",~$)ÇAH.2LL5}֜ⲅ.vQ=6~b o!BCu45td!Iά/4R b.n>;v hN=l|dO(8K!wߠp]{]#xX Q =I)C@@ ݫ!x<Œ0q1"+dHҪ_w ]z%c\ut@ux-]{2zSg[t~^ˆX 2:ZjX *5}0ɩ#Fck d$nLvQPР<2h6Vd8#z>e8D U]-Dх+_ >\g5\`'ܭԖ)AC؇c]|A(;(f&qJUU%xOc?s;<ޖ+ ĐS ?Mz۵mt99AEڸ袋LҁڴعDa#EϚEg358wk+y9SP3|EeCߙ?Wt!ùXNĕ97*C9 >`0=Woe(9 -AťeE%/~ b,j-(Wp~bLKĜhP[E`xȤ# ;ybvo"#<19] . =7Es@E&'I3lE6G ~jn>BJT ` бAB -7e!GlTۏ@r2U8:뎪D${ݰ BB `drv$cv|GɶА \ùVZ Iv2A2 aNQfcK/z fTX͘ͷz7x"п#(qYU(%\5Gyqh$Fޟ$W3c&qӻ}x] yϣxaQ1O QBEG߯^=jrٿYsjAآr5>rv tgxkތ^oa<' ϗy,啕/_#lx$~C4IwԵ}<[|/jR<㹚"9]3d+ꖼ㖪o"|JГLecFQ , Ag||H;F%t'?zBj"6#:ѣ:hEpHb&DՋZ }Đ}{vc٭P[/$,fȁ;P W_s BtPq~脱}+~V%}FD{RwS1*E]xEoI`n\r*o=|ȇV])۶(=Z,pϘ}Pg -JPc ~~ن7\op X8Cy;!-=c %n>@B#tGj:gtIrfrךc[`aH~qBιlXD30=؄ctȃ%Ho՟o)!:T"![UI^9 5rS&svu tsFsu7r5V}~gIθb{?\vkn+/b6j,p듀2(63wBYًgdI)jssҊ0,]`vC` /],@eA96WzS j->?}Dz}M46;4$tbNԜiU3ʫxܳ.Nvysԯw.\nA/Zk!YXg\$ތ v;i3BN b\do]8Rfգ;nF( j&Y`.(gC 3Oz'>#+Co,&bϹs*.q @y>/N!y],/~Stɢ zʤzU~ƌ8iJ|Y&$>>O ;"ϘkX~.9ydp5a f:'#N\P7Ï1xK#6@p\ gJCq(N/P< :H_`ᣆtBwq@z#zwБcdZeZ/;=GڛȮb#KjꗮP]UOhO4ЇxmCt$;vLMeeL G'ޓH1}"ޑě=t1}F6he[12*H`k3fdrc*^n*wVZ k7&'t)\xd `jTsX8x'Xof)z]1tN5/վJ oڶE'=Uf'(%+7oE{ޭk.ޫw_Pxn9G}_s<=ěS\6&(\|,i7-"Ks #"~X^x6mü B2χ w*, 7ŐCȠ!@dpi><E&0F^xB6P;VE <|x1>ˊ| ϑ@XO͵ Jّt&M7EE)//0تjQ\nD "aSzkLI+8TqnnwxBHG;dRC`7$xS&\m< xcûBtG-LȌ hd/!pPX*O3ɗ)E0@oĮݸnL.Q;%3 ~?!D#'jo,#Ob=/hEΏf{ !8ޫ;{Dox~ṜUWkEG"TiYR[SwJrAp>d`>zvڥz,% *gdefUntQ$ iD߼}]fpƲ7V_z|AG@ޑƟڼA&.YX|TiǑ"7=o.",yYW|xx>?,͏#(]1y!30Ni]pcP7pO`AΨ@xs#$A:O zy9 3"8SػIУ!Q'{`rZ:=7 E>sVSt%H']QlH(Khvqң.g Ì IKCdg$go JnnɼnՔT #v~[@ QC_ÚZ%rh?M%CK[o(.ş$~t ܽ7Dt:!3 zUӔyt (h<_Xf#wyLxpn~p?aE;GEY+6^WxK^T>A*dLEb4إDVSI wAW# a * ~.E7rdȳq$\p`{ NJ`{oCPqF%$ߝ--Im+ =̀SlG(9-ɢ0Y As7' t ֵDC6;N+'>.ZJ^GrJ H)Nx~'wkÝ1΂#(""akEl8sjQRqZ\ùdN;3+6FyrK|h,0fтЎц={46+)^ b/ MD) ]^| Çt$IY3{8Ķ1Sn1@gMtX&>JDd1p.@hz塇~hAaKbxN-I<_"xˍ׋7/ |nU*d珧24RI= ]_<]uma-;/;%fH;\[ⵒ6x;tܭ"DNetѭU NZj!. ˾; {X7L- J\`9}AX ͩJm`]CoNW^Gs 6TيK#!T:'`xƳz{Q-a.RiNM+O_ 7v Zt˶vx>(ΟE\Q˒T$suZ&zp7 Uج0nt#\ . b\~FqI$:t*7h؄L28kAŲp:hEܒ(:L;Ľz=S w.}O!]E)g3rߔ>郃xPpKxm#++E!2 69k'رCډ;g Co*k\I=bkZd0y;G\btx9E?C: ne>W3簠'u'_==HzI /GˉF=)uotVC]9t1F9N@tx1p(ÜǴh̜9N)rTzAwT̓S (v1ܫZS傲b%Cd|Jt$݇q2x#TZ:${{ls. 8 :_ǔh_?yпvpö̋LƧQ O/6WRK,.̟1+pӍ.hrںv8m.-ڶعkxCUo^GUd|b?&fjִNm&ڔIiǍ5R}cG0χ |{wc v'O$[k_z)b8n|`C#2sN>;;pɁS jQ<[*~nGn /[xխyݧGpS|"t`Dt*Υt]sXukXʓR:i'Y8)gvB 'tqTICwC7CAV^?x,%jO 76Y/ٴ)[ #kv#U)펡t .SwjpoxXCewUbwl-DtPa2L{]+"x g2x@ݻ١]Y3ikJ#(pm=P4IIĖLyEg'!>κL"V ;ID%XH%ǠR_8a@ݰ^٢p513b@m4 2h,="řȡлB׾D@c8ş2 ǎD(_ctWN M&z$\g31PA30XC^;pJ{]9sT(jמ@d{/I z\D?^QU`pBIΚIJlAGuϞ0\w;Mo#sk]BR(K3zĶ~ڃq7MO"gfOPx]бUWbGGQyﱚq".' ktؓr }g8/D`Ō\s)>D눉QA%4v Y}eY;Mh 7dsu3#;8hNl3͠u! -;N6^x429l>ѥsg Gh> ~:ʠPkdZC [T8mQ #\wTz^Ɨy?KyMݔ;l$wjB7]z8o ;!amNPUDr@Zz@n3G95z$vnCM!ݒ Y9?%sh ) 1zӎG'r#fvdvbV Й_ GJ4Yp,˲ wي\Tŕ;4ZB Oz4ŋM9rFĿ˲˲N 8[0[>$ mfqDbH9ǃ1_ɥy9wqRO,rvc[rg=+kswmڲfiju{}%)bgPؔO$L|3(5j{e%Es,!Ur n{}["4+'䊫e]hvђ}Q+ߡɄZ)g+o+CabvQ\2W>{թ#NHB#x3 jY<[l׉X츱.0âd 5J͕6 q٭ފL^<#>" eGEeNfS*xآ1le͘tu6Fv_vn9ZҢZmI$!x5%ꢱ|;s80^PZ`!gMv=A-?O<4EsZ$jUF63@x?L}p;l @w'j 6>),K>u ]؜,pc:Zr{tK|.\C܄cjgϳBEQ(.PqiDBW@\583tXM#d3g˲~ ilذ&WA4_q sDUpS\ YvQDW:yiDtilbrxy06 7K{n٭ssrzu]w=V4kM1(hsԐXFf߫"@AVV~IB.ž]B H1FZpdMVbRFx5qrg:MN(qY*]sNSG8 \ٽ+ri;!8l(ed%p:RmhrJ7g-1)>U* &1F;Z]x,ʆd B=ϼ<;^|v+$MK7J5 g^w""Ms*0K"o$E#-qb3nkI-4M/AIO5wmO^:؉n?-YG#ZtOLDHDt4F.,,)*w;R.\8Ι`- ߍo{o7zDc"FNGq =c[拶ǍI)/IӨ,Dp[j 4'Q7_tFrց1/JhO ;eR"miRh,?*y!TiMV=brDHh~a\]K5 R̚1X6zf5Æ:uל6"J1vۯ=.hB@#ET?9u 7 GEjެ i!i+W a3fΒCAUn,X /<Roۺ5V-./*@y^.YORW Wee 5xmeV!=ϼOh?"oD7ބ`f,ڹ[TO o-㵦6W:V2PxeMq(05<ys:у s[-qw_\lt]F~^l9WމuFň.]C#׵Ccu_9< >vt4b )b-*u5DTCqaݪ>Dw‘ZHlKdtΒߥ#D#ҤfOR&*+˭Jd5l1câ %Z ˂rp7 p~ }^XL,s.& t;t?t?;5nL%\e"W,Er`! CCRw!7bǴ*ulh.yTH0Hq.BC\tS]~#yή( verNNyn49Z̫@^x /bzB\$m=pciMY'6X罳k6x~mIcLx~L0WDpu `^!e69Q LmXl.\aX7șZ]u ȥq'z^.#fZ25 [|aŌV-h̚E13yя#98eB H|QteG)8r w< 9s49|]$7 %Ko-l9hwnd:{(b0c^gIK~vGvrdYn 㔹 Rײa(swZHsFՍܡgSQlc l/qXǫ|hQ颮ZXH|&Nnf\xsLOܹ^gFY=D @S^ ?TMi^mϨmu)Վ^]ן?ON``I!=3s v@Ͱ-qRVUl{Lu;x?\%nK8Mw|;Ds -}Pdg/) [29hWhnfڑzp-G9%^&ߐS\S*[TޘLV;8, Bk%h&-8^()D'vPh``CcN54,0͛b`rK ?qy/4Jdp BT:h"8alj_LʜiS$[Y>Z@AJk鄵^!bf;6zcږogCC1t9"H }ݩhqpD[`Wjh ]dYw"GK=UQX"jBGQ}Fʜѐ_;hD~P{OyW~1 Yiw(㹶rX:'ޮCt&!;õ$P1fRǭf9Hۑؼp;t3tGJ#(>T99vL1h{2 ` Ҧ-b9 ->m ތ+v Xܷ;% Dͳ؊OLA4@n*A?M@v=%O«:u%5y&ΨQ\?Y,{ nB {a1qƎ $yE0~`LB%.RLΚ(Ui0Ϝ5 p65)լdIA&9̂9e%XJFk;98`P ÎpRGg<W} ڇߐS1^08vb5N+$HB൸&] ~#&3!OGh0#& C«@Sg2 i<f# xB!Cd Q@zqcp*oYAe.66"VsZa.Z3,0X>9MGᜅ4])Z| OOٺKS Yq-Y>ZL:$y6!>~@zCB1#q]-qEX$E0x{?>ip0Ihx;j2-Lr=d&l 駻z[ay( Gue)R ڋ|gxc!^{H R;PBHk D FnNr 1ڝ.nDŽ ~hy%R1Կp EiF2UHؒȎMnH@+G3oäZDxpyrt=)Di9$HҠnO[IJwtx{j^ wqޕ6Wu$ٶHHHifٽmvLt?0gV]{,T_sFˁ-l#Lxzĕr Gw[^|^L<&Gj}a2dp4؆9sh^<"%xr`C&~QD}r6nP #uD@'$!4Lo@߯3gINzb;{/ ns4~ s z s,ҕK'f|/ѓFxH#(|!ʻ3On-"b! ،б%]e "w; sL y=hXF*HI2h.o'+ǎ];@W8DNX옗hoKZ&Ԓq;KP\JB%:.:Fo s"ml3(x$y[Η5K\c~SSsMl Mt~|F^{ >֛W~T\x}OLjb*wLCDO|8B5}9#n#,x-2|ȕ7%V>OKt'JM717bkbdD>o+]~.V#a' Ws5 A526"9C-h$t_]AX_mIq)= Se\Wi`C?`>֓P*Ӧ0 Q p \x0xxfćQ !-79NB.XE#Qd?ԲR=3፺n<`|UF$3*/rBڔt:p?hj btg~zԣҍ#+‰J'?2_xPY6[/J"ݰ 5N)?D6&ݞO3.^U:67 f;OBL'ψ]}@Rݙ5mw90?KA4qk:Q.^#Wի^{V7>F+?&3c RBԮM_vfa _zåk&A}hdiDȄ>i{4* ƣ"+<$.bԎ̦("vieR|s肒 ?' A|yYv"oaCd{3c/}[mR}:Ѷ0~DskW(M삎T˰#ҰO񙍧d@"|A(}k]oI4:lx Wr`$1E{H6J@WrGUŰqp-ޙAdSbO\9"D)=*?52oT)>9Y!'tczۗ[28,2:/>l<.ﷴ:H\9(*32Gm#z#Aq6l>4 @؟|:RDoH)Acg3]ǿwmʢ @ qBD)@oSa=n\ҝo:'HQƺ|Rvz",gśㅙLXqpFqIh\b .ήRԊrjmY;73r Xt>/C>'lGגxTd|ɲ ^4+86Wc \J"F'O\vzu怘sWLJ1t~I$.ēH_no6WVyghٷMr]u1M0p<,wSy`t-yߘߜcOXL(`DĄl{m8.sH(LajoCA6 t%"MR혖8{tCN1_:iKt2,2֨j}*w_9 U:?C'uF,$TURE2?p4Z_28LR֪[fꊜlxF N6>ˎQ61-B mZFs&Hax& Aj=zd}J:;A!/}_Lv(NǛhsBoz'b>n22f#4fio _dL=qp05Hf&WF:SޤgIKo_c0TX]qma@]JMR6cmpM\oJ}у}V߯tfÄX0J1C{֬ڂt!/,8݅)k,߄bƲ2還l"Hf[ou,1@7;xew0Iihq (tᯑch[DRzHGxBעXi7Sgɍ<}#sxb3<EUh. #WrMtm[cgx^&FizL>*I#:r4rT핗*OP<" U8Lrm4=~# {AJ,BwQzPrAnؕ#RHRA_|' {0LAKذ)+-ApBG|8 DwN',:̆C-,z2w8YZ]$Sa6^P6ףCC@}tj+8x _" +{*;9ǻmEzQEA4RUS%;|M\Rx.Hzcmz{2g$g^K׃~Z)n7j&8d<@bE^{H]$jV\S rtd/>F`t(xn]h1.O,:*Kݰ9Ǭk\1n/yƸs}o>G&]HWW},T-pGi Նŵ8p kMb3b" D6u$W}f) [b:WWaۖF rPςWg#`^OXvY"`i3al 1n$,PylΗvVJIa Y{ {ʬ߶8cy@tZoB(`V}k;bYCn+sl"ZyW uQD6ݑ)~X5j;la咞.(^/~;1OluF;]u=_Qom;9 % :HƓ[Hb@P&ڠqEDA SvOU\'8v uG6ϣt@T5crw6Hqك; E^5ĢQI' O:%Fz:wEZG߭B`9 Ǎ8" .0xDHN4 R^O _tFkc79Pk[[[ҽ&B6i3a|F0Ķz3:q#RTR bt:}Ge]86pp{[R<2M=ut%LMUnv-AdAS ++`~)DHsɈLv$]MO=qV5qX94H,WsxX@,$f>Þȉ/H07]*d͒8!FtƏ Kt77]asI1n]TܩṯJ7ŊЂO}Pk,Zv.ڂ?ktm(`Ũk{VM/9k#8~iUfTBwA^0Da].R{+sg5Y 7m\ ْ)|{&%2FΊsI%aN<:$mYDRyS% F zB'vP!1R^zftiКqtՃ0y2bf؆8 A"+~AMU˃8Ji7c%KK^mx\s\Qa9{EJ_m+wvEm٩SlQ$..! pR3%W}t5j/Kez G =\uo@bN1vދmVG'07י 2o!ȱ<ž9O얮8 Kz߀NJ1i=W]v62V0l51nYC;Bu~J'qZ&jAs陭=:`0Aߖ-C䈴\lsY>sW_Է,7ew'rڮ{z^?zr/ht~҇k &_pzB@idd(X&CvFuXͅ <#N#Ba]сІXr a0}EJ䔃K:  ^6C.W՜\cr_!3"` $>1]Y QG)xcOQf3â|}(gI:%uOxjW*`A|Y4jK)+`^űA iV FHt r!„ٓ8أYZ,P:eXs 6lFab\f[peXM X=*#JwN2[WZ3En0;Gv$M{ǛdY#{ h,]᧌Q0O6{?{W9b wL)%tiC?? z}"^$&ĹwP#Io';f>qLRZ c|]<;N.-+~T d)}(`)lP LJ2˧p+תY/nSdwgr})5FM s1 HGA%$͹Q|wvm*84sLq>I‚2~۰E}0&6Z%*r,;hgsˁ{^E3GL14cIjֺzȕPEe$y:\20)6}0ҵ}Ƒ A8 Ew+5L;LJy0@IT$0tE|\>Ez)2蹈9b60;a n$yWJ@KAT; %'d]Dksx!gX^=~ WUgZ3zV|c1ˉkL~PRhH()`r.N:|m'^?A$Ιj:?+c?R0s0l> a"ۊhQEo*Md+❰e!lq9;+?WeQQE#^i2R.>0ST1B?pP8,"iGH\^p_L ut>c s*B6wa狑wteU(sz"9-8fsy+"층mꏲ$.}z'S)kXzq|yybJ骿./A#׏c𗀴QwF7$o_$ӮT;g9)999&4* ֵ-sgZ/uXjK6WH=RG>{EϨp+"A"Ύ_S޾6`D_s΢uK8 %$EGI&}! 6&ANw=8O7n\F[s-QQ@?_JtmLb=6r>K̎s*YK;tɛI ,!_p 64r@*xxue OО d+Zc2m߆aq G-״x&~lp`T66GI\*J]eD[nN?S> tYt]oԀ88"dV ;0oLoUR-mY8UBc1Wt\aʿsPGk{ח\8zq4T(10A t g}{yۆWI9/#B{UL0m6GuԗLmݵV/vv)o&+_b'GO@ TP8r TwbƾU&5<jIu|8|_jt41='cEGg?*:&qQ<=~w ȶlfDdK=C^OxՃXbJ)eʴ1u@zZ=7Oiy|Y&2#9Dv7wdr _C??9!d^ >U<'vD34ј@=Y{'5lb䣱i{Nyst;I|,htJW0 _ 5'C%76":8_$n }ZS) I No7cǩf'XlzqxW)qIh4,ê~BKwblurred text1~BK RR[x]_zg:LwZP(P6YdEAVE7G<|$ӕN7@I$&y$y< ]\Aq.J( ` А؈xv*]PdDɶ6*۶dk m2jV e j9Y%o"di4 m2tf9 z ~l/.BNI_ث`[; ,;M2){qnaB@nګ`[; ,K!q)n+.Bn5&3g `[ԈL@>0!}\N| cj h3@ٶȍWwVIW~g)|WX V#Nyf'1{n퐰mx^%nmy7#=¯2lDö%[ 2JvmUBll; ~[ 2|PC] h78;*6 =#^۪X~m#[ rp=@ ),n*_ְP@u8PɢJh3PErS۩(` v:܁'Qsrd,`P뤍olUBζg2)ʹ!1پhq% Ǻ@@~Ume{B%vm2/=b=lAnWQ[y pPk@ +b[Q`?^s(CwqTo[ pPF d>#8~{u@$$ir4ζ7v2 ±8I$Qrw[ 01RdV]G?I$ŀ-j7y ZxgG[u_HAHX 0> m9J1dOkCBV@>$$ir4V̶xs9;3.9AHX (^K!^C'sA^]G?I$-j ڰ-4qu_H3*zxg#h]oXwI$倲$ [xjG_B&IHX ~qr64i84Ű[Ć"5x(KAHIb g[oiAOm,q!I# $iaPd9EkP؏`$#!IB%vmAANڠ(pe-$i$M1*#`l{x.MLq!I# $iaPA̶ЕWIF- $i$\K _òVƶKԒ4'8@T4W]%+{Ў$ E$@K]mxMĶ 4l8$@KPm] e[,4LWQR8w_Ò4m ep3 aw`#IZe6b[I 'mbwa#ذrڕ!ȶa[&I MR?:|v%ieAW:VDuI!$ 0پn0DuIm$i0\ l{2d{u@JT' l&I\9]G%ie8:.I#P c[tW 9DuI*mY%i0h=xD@TÒ4U ۲J`Po##P4U rep6b[Nq:W TjR-5vI)\7u`DU\_kY:@ l\4!g[vI \-Nqkժ0\˒4 `c_/ 9۲K`@}=ںS^VedSmK QD-I !6qOS>VEac;JTۂ f[4)6EOSOn=__]Z|inai}k0_P깋9ppuvrlҭ:9-_@$ixUY{{tY>#(6ǧGCmImCcSs˛KQE4T_6km7Vf'FzrMA*7826x>( 36 ykenjt-tfOC̶<$i0䵉mG+ISg{/{ WS.5dXs˽ KO+Pg"Rs8 (R/,)Hnw5G^ZINu{hcǢl$ UśfM Y_N%b^[sk"G[ڛl6 v8֭y dsٖ$ {JZ-.^(IS<{Sh,Abɩ䃙#pna!VJ hr+`[(lNtOl^/E4j6gso{un|  O)=(<=O^3 ?|^h zTINn߽,)rp&H+Y1Om65 ,,)@Cz0[5ng)~sAƃU*':k9J lo"T(r߿ۆW IsŠ޴џV.];AϿګ,m:isiaWs,Yz{Ev@,7|`c6[õr<j\^lRp1n#6c$M;L5HES/NWּŦ !"/+ka7Y@|r\+žDEޱeMOk$iPޯ[I+^^ɪ*ͅT< }Y-[:;|2=h6*MϿˏ~2ma;sfj<usIƺmH`fj3G&Nw i$7 3ʣΘ`C܊M[a7tl@gq?ۄ%4iRǁ38ښF*hFLJMIgi8?~!,q̀%z?[~E~ps'ֳz^TR#IAz8I$Üg8<9ڦ\M2  7Žm,m׽Cn=kPR]cjpew5G`5[65V8@L_v&?dZJ}j'f3p[FWV{ȇp0̅<=|Tf-i^B`;}'^D@I^r\K|[Z7>ζ$ij 6#Jd[bs9ȕkuh3t'?p.`3\@>6}ƋnsdK=JBVc t] $0W<`w†Li?ևd Hr\l8ȶ R+8G%NV OȶӜ$i0Hb6-$M3ԃ7G_VO$vUwF֡X\{&NӠ0] 0WkJ˦2b#.zrץRHJ}(W,b \ARCe'c[n4jy%ZX$iM{H(f3p'4˃mV=e7 ] 0?-I|ڀ~AMA¬@v3dock<۫Oƶ1PT+}se5Il ʹ,ZJ}B*]( 6C^Crmƨ[L GD% o}NzIPwfN9x2.G~+׵a[r%EU+bu?,[yļ4F.h3dIjtmQ7#?36ZDpnU@O9Pr?F1pmw)p7I\6(" /~Y3o\-@ +ݦQ:o 8$M7|~xS.BO("Ek)0Y me2vCNQJK@|}?v}=ydQJPxqJm!b[jc:N**wTx(%i2EOFy@@k˜ӓ.~Aj5tyȅ,I@>E3H :w-. oP"(JPxq-A)~*Ga:| KV2ҽ5v#IdFVO/=q Xc)J6 ITsl_MFR3#;,.-maS-@EuMr(·?5 =C.*g<٪*AEG1h G9 ݢ$ VģpFo,4*D{'s Mlz d6M2L/8s$&IwʌW))@B#I{EnKyj%oܭf$ 5Qoҋhosz[Sw+KqdJ {+}z55K'>T7#,FOK{>Po1z-A<tRշJVwz/`Ir-GOܤJY%_Q5V6<-<^!G v#BlXxsPn6:psCj.Icm r}>[ )lJ 0*uW.ICpw`\!@ =gR\%$[$=a[rIk%di1<(P ~k0Jrj a[$ 퐭~Lo >՟շQ*uMWAQ[W|pT‛I4*&&4.z/_zuo{JHɪ]m{^-@%i-E# Jq]}k`0v|PcT<-kmmPZK` /d&HJdJ)۞* i|,k4 golzA=N~Wbȉ]*}[)t#KҐkom:'JAu!x) M2~v=L.Ic1b%4dGpF&# _A$Q8/ oqFB'iC<Kd:,aeTrKMIL] >ӣ%AFD7_6pk;@X %Ϟh' սf\x$+n_0ژhN6'!vா0ா;՗Hu*Ib2,E474W07$1.p`(̏Lb5Hؖbd7}/j35@|Aq[JC3v>}Z26_96&гV ن1jp&\i1diT\妶h%)k$ӧPc[?кXG"pSeʶI$~Uf[$X"&+!cV#dɥW9` ^1[j6ܖ%W 5kU QZyMdx,2n$ l?Is\6$Ec+3\xKRlL Qmq.ⷑ w @j Ji~{^.M,mAb-Ϋe-* ]}byP`I 45fY%_Q5ɻ&Tdq+ v׋PRޕ5m7!-*S- 2"3 (9~z.~ȓ鐴Izw HN5huE#>wf.M7D0% {i8빟6lE:H槽߹(kfE:ƯK.ss)*Y pjr$*j%{ELP"%4"VɔhDR*JC=6޶nꉎ _p~1ٛiȫ:V RlH>d+s x ;$S4=~wb ʻ~Q8`UlK)֑fUY-P d_e{8a)؂^/{Rp]LJU>KGZAm<6/jXkG̼)3ScN'Q3w!>[LcɍO n@[AJ<Ԧ'Vw]KW4(hS8<үW+w 9Dk by)z}t{,y3-@ʅlC!=axdA)i[ (F aJc%ѐMݭPڴF'Tz(iH*wqm'LB[Jjɸ=oQ,~3F❤X! ]ՒC(]m,QDM#UOpKZO>XBa`'>;QwV7ɿͶ@-uU"sD(i-~fp%g)<-NIS&}nZG􋡚t$EX7yђ<$~CI0T#xs y! QSa;k|n(N;z)7vWRy(G/1O:w0%'&\y'P蟓`  HYf~cA+>INa?"e jlK4 p[Z|^3M.߷Μ|[[%$jD ٛ%M\1jGBYK9Vmb~vL??qUo˴4+aE#dʳQx'):=!p6;h ^5v`= Dkr,KShԾ]٨(% sA|%49Q%T;*_!tG0J<<±G`LT̿-NIXQ5!1jǨWbiHJ4w y, ]$Ryc?IK:}/^+:Ms_቗  o^w` QT-_&tGJhCM ɫ-NIS?LVZ*ΗBIN:}dE/E`? FS Kcwގ|ƃ RtJ>zji6eSBO҂)i(j[㉢h,+(*ޝ%h Wjs9'Sc.;-ffy-:`~WɄ*s`BINhEk {kȋ ΋ M:]Zq<Ǐ} &Ks[y@Y]xGkC+ZC|r$'a۞x1=trNTd@qyq-SK_|>h+DIS&d:~cC% ;eȃU b]4V6qt<qB1jSQ^ L;BNDjO@[iD]*!,_ǩ{%i6;^V.@6V M|9?L%;Nffl;v_S0_}r 3M-!-'!v 6pdL?7$-A" uAPHOTaؒQ yFFՃC[!J0#^3Ԋ?$PX 4^=.7 O}mA^(z7A <(p8큞!ɇ zmt72"ēv,(idy(U;RK,Lpk'ּl @ e&(?f]n. <TN{'*< |x4 l ldD^=8h+FIS&d >DZ1cp${a*ᝳȬOm!yMJDv4-0`|uwnM4䆊 |xk፶S1JU-mW@zZB.v*@CY /~jOT/Se^H5DE? A[`#hv0n CaRKsR$1Ds˘' _̱(KB.)8/"h !#+ȣl0 "B"|7=ؑ;h,362"lheYq3፶)i:j -+f/䟠D O(j&{8@ҧ) xCk] BPK)i$u,LUCd(o'z2 mȜUy =Ǭh=))LUu&DsX*ZxV>SVne8YQ;vh{zWʒLJ{jV/m "B"'QN62"wļ;=%AIжJZdZzl-"^[;k亖y Gk{T6 Vﱫ$R[Z %$dw}6!tG+6-Ǚ{-$3BkpU]7!:% ) r?:/s¥E*[=yΎ# !}ؤ3K)iZ1AȆKCg4oyFF䎰+΂%DD[ #VpV-z%D[>j{ȧ4ϑ΋) " Fe)iF"'$$a\*R/_]>Dtnh %> fWy+!Z<__8Z;J'0 0jO^?\7+8/•GC?jF¼J&% ½Ukg%`*|X;Ȉ+eDwA[=7_>Բ8Z;J$di"n>"4螙lHkYɔLJ{[-"{K_akޕ}#&Cyc#(iD> ̆^hPxmٟdΖN(i 1i Bz6W4IgWIADHvZcA՚3olz~LJ# (rG[Ə?<؁؂4$yuKe^9p ә7~;`U)i !5`'N1U";o|3iHIC-!኶%_V ;ɪ[;uA44fMSL4gj(i+Ñ<^`Pm9gHIJJZKma(!XYz~ \7!7-y)i{ Om١(il aef)iB"h+f=2lӉPV#y*֨i(ʤAԤQs>]9K c&D~(iNNH]m)k)sJJPE=FMq_W#y*WMwS<t =Q@Ej(i\kk@MM` eR4qf6F+ꂶAQҔ5dzǚ}*xJ[ڊ֒Y?p{(12d^^DVpnJݒT9o=Y {q4"M+]*=h%MY%7L&p)TyoJu$u QmaC!%")R[@5gWn3і|JbJSm)ɔ@ISPԒ5 -"^[-%-2(i ~@^ άRpNFE(+&JI4 ך+giHz,zgUX-PTYArRQҔu[~Ṿ,8|̳d~[<N$Ov>E8/•IZqՇ[R7R& "!͛AȜ618 DF[zčh_ JHWXk+Pbc?x?:T "k )iqAϵA R)iwHdv=&]U@čh)5< x'B#Os8_c; TS75A4a йBj %T•>Jf ooք)i-$m% gWnBlt HId5@6r\Ӣ*іN<hM{>V  uq< $>D{mr>J~[3h85~CIoBpWl % B|Lm1k ER}4Zrf˂;8P|Ln׮+>j_w!aO+KnXkmE0%"50t:7]B>:=8R+w!^ $&⚪@[`g"ђ}|>"ejr+Gp-o(E2 jq𙢶 <,ΨڂMSFPlC~ly \/D6z]-ښ_zӱoΜJE]PJ{ (R# -PI쎽d@S|=.HIm6kmJ7!af@J> U`ɞWϯmyOe8 iE&mjD[ȕWOÂP+@ID"50k^EvǾUS8&sgbwF%PZ?<h Rl<ɂ-yz}ݚ!-5'ly \/D D\ (Gq.Ꚉ(?)i蕪\kv|3%}7~ۚOGނ)i 6װko"2e%@雐a4mOE֘$l]#[G'Cؐ Sea(Y44RTRcoB%Lp*7)LJB+F$lɮ><\h P҈iI@؏yD)Em]-ԎmjՖ'dE祎/eQWBЂR [}A|K4Z/\[gs{bo[sG"%M55Ɂ%H雐03 % Nb=# ]yX ly9p`4)i wNJUj8쳦,ДHw M\tibl#H [WaHvE(iDJ߄GI0,֒( -} mJc W~4&4@i#7?:uKorq|p^2|-]Kl+0)i$ TD߭rE&%@ؒ]Aw {n hl\4R҈߳? TĹ"p^2_4Hn'iH*SvDJN kXqg-}JUL3(% tw:!NDKW"z42ݘO[^.IT@})NJDJNlnOƎ%푛03 % u@1ua[d^2U )iTd,ןTJNսLކ%푛Uvd]+QAכpe,!}A9ߺ”4FDT%^9$Rܣ{Z=-E_RGFRXg/w5zzr[t^+Á@?|q hbD*U<W y~LJ :iFP EkW"\o^kcJt]on"JIqoaI1 H쬧x;AT=X&%@٠{Z؄mhP 3Q@b-lViL+6D 9p5%^F)z*ܥ\27镪uM^z) ZKGo_wwZ"% ШW|mJ)#7aSR҈@o~p3c%N:p^2`EST=.8\ZH8rkTxNnݟBGI,DgW V6-DI#a{*șs#6IJ3ULkݩMgƏt\p poI45"uM^Z̰uYIxLШ'pm]J {u[5"c '0~^*Td21O)i|)5l@t2?(V#B"ȣLOpm]J*ϭ`W;q֛he8:Ui8L6]|aғPJ$_1i EYsoGb%=HI#=l%)iLƃ$F 5'כZ$+Ɵcío;֕0% ½, m ķfM͠|;|Q)SH;L;tO&\B_ڦanJ~ۻ(e"s9l\N3c  II#4"͝ nVR{HIwEv4%G/MISe4/sYYEw^.H]o6ȆBeDŽ4/|up@cON%'"`EPd@5k_=];j-1^oN"% }{hJhKST[e/tDmkDžL7+ivbZ|}+fػ7h]RB})cHavi-GסLJԼ,y'TצqOs݁{oU=9qG`[J`#,ɞj]j43pȂJNv"Pq"(iPߚ5GK,po/=@J`PQD_Ű)&;\DՓ٩r@p[FdS#E\7ݿ\Z >^g3`wΝ-ym{ҿeR,.`PQ}SҸf|+!5RH*wikk ފ6j 2 \س{5PH4>ǤA@o0mBi kw{B:HI2'l7K>E)il[h* oU}h֖c 3|6 )i|ΚDs0)WhQ}O_2)i@椒 ǍOBEm:Q"2Z܄y,/|홾LV Zs?A`-{b4)c~BK TH[x1 Om bt0~BK TH[x1 Om bt0~BK xy@ǽg_ZO{ҞRiSHEY"[Dٺ(ڽv5"t,!kY"%[ִ"=gR1wyf;3ӡ  / u f8g1"E=|*i n]@ R@F'}N„<Ҝ#2!LPKVq:pJ3NRZcD(BĠ['"yw|g-M$H3jI+6]zkGohlŎQWd0K2IL,]ŵ8QC }uYm5nG jT۪gG*k(e}kW/u0?^@X zN}TST-/ 5G=H?Trsg|N }׌4Q cRJ녉1u4 C:jCEnRij3@,I\\?B4RxM+"0Y~Sٵm@O;Sh"iRQ?bIwVQg, 0Zk2d٬a]>zDV#VgV~~$Y@C:j+3@4G?$Jp%M %M{緃~ } LG;zOhMɑ;'u 4-4 O޼*CN "h,ԁ/ hIӞ@$L~- "Y;ʌ<|hInzLHy/l +MX4K "Q@-iZҴ'h*3 gI#E]D~E=-1GZ@%MK>.ZҴZ~ӝo/mMD*=Ǭ*AG4hITb{.:M!`K*nKԭ ucE% ZҴtRXӸZAJ2$/(% D-i:8OMxh"mZh)6gXdђL[tptmpcocą+v4DJWdoICԁG-i: 4e$QJ-i {oJ >nOT#ԁ% PLl{Xi)8L:Y T:+STUl@_O[]EAVh`Ai ¢TSV~[Ҵ%R-B.PPVU5M`]$/?:Eu *T0hj"O9Y7vA+zFGhA:&WVNS+;Aƌ?q&acwwiaIIv @Z(w7(`~M 4yL~Pt,Р< DŽE5žr4m0X i9e5M]}#nֶn}>wMԋPEllk.Zi j:F=] x947Vdր,i;Jx=:UZ qwǾ>CF23:nY lݱ+?qM/5m衾}i)p|Qhli%.L]d(˗.5u/gk#ME)Ok ƒVDw::4"rn/>q̰N]u;I0 4ޜxЎS34uv0tdİQs/5MgQӧ^nf]te/ [ƒRoag_9͍ DGE-%^;m.FGhAX\YZx`Śͻ.^sܦ~ʽus'پ~9;YK2W) :~@ǗN>veF8v@bše1z2T:ZeTt=ѠZmwr꟧21aQJ??iՋNHC7nMK &,<-:cF)Y^cOZ ;.$kܼG 5oUk6nݙ/9%xi8SS& c"'2 :7ʔT2u6{[>~s*35yu+bgv4Qd P4I6r8Ca(ZXQX 0r]j޺WP/jZYQuӢw_:qxis@t G^/foϟ>.w;{6̣ /%k4`,g.]TyI#ϟ>{=Խ fM5V6hIxjMpxscme)<&PI˫j[%8n h\I2&/8{O YrRߙ ʻ'_s=-.z7ljI kW͞ң4جMG#:WNخ_%vJϺt-â'^|t_z2 ]j}Pū+kОi5_#œܜ T(9.׶",( IASI;Wf޶bX?G S[ђnzfhΒ+Fr2%r[L$ڱ!vkg ½P; o+SRNU{ppE7wDkO_-@:ZG ؔ'>\[6`Rjcgܑzoʫk;갼zۖv4R fI#$kP#\y:8KD=c`C`]C[L MKR嬆/>x N3{5?Z>g,ۖzVѫ4-u_g7 hU17'>1ܢWe5uÿk7- R[j4褬xٽLe7EM߀iWnܕ|<ܥro\??T{*}ĒCr^z8](,^'CFE._mgo-@weXWd'j*ޕ:6.bd?A$!#g|TZWa 6̼^PG!WS d)mtXĚΒF˛Z9#Akn"k?}K6𱮪Y{#GE-m Z{o.ɻ:hӴp%e58f;V.r|sp'6hK(mJ9sU9}gWE{vS7_J43wMd[%ذ+k*Sl{{ł"袨bGQPQ5 !$@0d$)]Q!>x^FVCnU7OIi.g@ /Ց!kx)'i5fG:<{9[f/Y*MΥôsoN7ogU}IZm-t?*c֗7.'V 'IS׻Ƶ6+J$Inc.zƦDr?% =&ft>is;nHMk͗0 &!XIyi;¾1*0ԛ9{Igϰ^)lsX$E?|`tәS$Fg}OSj7mݥ9k!6]X\R Γu)&=~Ei^f{ahugu顧XT"+r#=0Аlcmiҷbe‹nMXΛT`c0-qŰ.:;P$MJ߯yHa3Vr|@Y Ub]ڽİtK!ȃ֘ ގ\6df,^̏-;y߼a]+ik;{}+Bܯ޶+:m Ր9PhI`­'G&gˊⱺf4P|hl9 i~H8;%v螺{0,٨y&*,A߅|XsDI)ʳX][JPT=M]x*%\l=rϐ"zJzkHPUn[>OjG$'^0AѬCqmFilr~fǹzDeJHQygtzj50MDA 4jMZw>sk'0@؂[GN0TThMI),qM[Kވ8?7SĞV; vۻOΣmkKϟcG!P7WD_}شU}Ivi?q/dPmJ46gZJ-m%\i1=Z5e /U9j3>_hZ*J^ۯ75P$M=E02_y%i W!9X\´OLI!ֳqǼYc59b_ ][K }&]y&yH@|ʸ]^c>%_!g^yRvI q ƭYx_|_=]@t5n+}? Mzxj[[Poo *'BB<-b=0g`[PE‹at'ngo(1LT,(P  V?OP*$ QKQv;OS,˦VQʉa"msۨ˔Cѳק-2cQJAFt@W jM5_kCO2Fq] (LV݆hsmLVJ9ץ}\ )aZ9 ⏬Ongko*Tدc8|1RW'zᷭү[ڂab&(⚥ xa63q{ ;Iiۦ㛍^줕CQۺ(\#} yuL[vaS.lןYRYopl՜KQE_kf}pw/7RxD>Ld+<`_\:XJʨ#49 KҨkw4ח,~=Y$ inK Wa{Qդ3uԢ#wU)iQ`t5n,i՚1zVd*/e#:Vs)HskM+MSxJS}r^P2*L̋{r`j3ߜ[|jx4F-kߓqD89~|"X36CRIKJ>ޜo1`4nmhM|]@4z!4vFܣД'jZD6IP%!dU ~i\'/TxDd%kr9;qTF'5G*JʠL~'(yL uWБQ=~ ze1LTyzmz?a'PUD0- a45߷I ՋP P7jz/JI:|m&|YOHEA4JFɤ S n /XXUs$?c>(uÞ=𡪪I}L?Lmw#)xr#IywCSGgAjӫ`?fTpwXIǡ]7ms`J}?io|{uiǪ-gH-mp9gMSQP%d$0qgWk/Ux!||e=kٗ"ch[l>(Jv1e[-, ͎#W9epc$(. $ nl-<(فvCEc;}͐T^yR$@40-L7M9TT^h" m㥠 / #)B=fa뮇ǔ$9p&`EAؕ2[w+G(sk Q眒A*,Kˇ Y}B(]XѨѴ].,~CH%i@[XIFsx7P݁rTre`ȵ q{᥀4*&$hL=4z ;!ɺ޵AT;V}{m`3G⓲k QkLj%~a4HBd}`Y}wOS|bheJ~H7*L{ 8bccXTn\h"XaʳS䫫LFD^ I.;4}+GX}%8S}$VDȻ4NA%iԴy@ƖxCynm1dOY} ԟXken?0nTl V+K#ӇSQ9*2ЀE2XyNETLFŐxI"Y_8qwʎ Ss~լ'WX;SϐTHZajXr#:-QM9`@+@p W1*ї=&nv L[P7*P{,hIuTTJh" C @ICRƆ2Z FC&"(AȞ4@q^7 `A$ CÐ=bJ[B0,qRF{&7AY}yن/ &McFjoUdhfE{2rTrHF~/"[XF@hJɺIN^f * d9ٜ7?/_X${bV`ge na&*_~Z]ƮM"dJ$i`[ oe12q Q5t纡4D>sEdBZ <(/c> ov`O04Z? l'4s2FNd:OU>mXiQA#0s~aĞ' bo+`4 - gBSQ*)_$oqiY[G$Q}jNwy*IC&{Te2Bhjf3( '׬9t]zŰoPok, gKhsGyxٳg_tp+s Q/XYV-QC$!gE4 8[ _VR+1W,T`w$i@[ 6^fV*uɈLCw~/޿}҅sgp]{IiT-)||j(Irsqh(JHy.mb^LV>4jU!~\R!ZPonkbP+$q#/3ׯXrk9nwyH\V^ô3IҨ4bk{4țUIEAvjBt`" %[FWPFg{$i`[ @!a8c:dpiܜmعe E ,pɲU6o{7sibEx1;%iTI~%u}MQx[ Mm{L].9;7=} %i@[ @i#^"wFOEx;2d'_^eŇxݿ~Ο9yV㡣Ondw^f8+i$jz Q90nr`IRo1LFϡּ甽)x',F_^!C:R; T!|`gŌqƽڶlմI&Mjh?< SeX7ԁ[_Y<ɽ[Vϝ9s<Ϙ`Ɋ ۣc/%?y]Rc΁4.-$ A9KP( $u"dS[_U,%tty^qg@|퐒WR320oK\.Z0e6,.|_:' C5"q v}Ŝjh9Ε>J::`13+C\'L]&`es`$ L{ *IJԤ*~$MY7 [9vQuEYŠg4:)!)cd4v҈WІƗ' VEJtAF~(-{7EeUuͱmm4<qɸEWcXzlO t12 ^[ YCנS0Ts],{*qB6&GY1aMX M'b T7ڸeoSx6I^v˂J$.:jn]iνs-rw6T!+)i9%u^O s~n$I3t]>^x;VlnQ}MaDcMٛw۲|׸a5d%v)4#n`5bZО 0sۘu2 1̃J|v0ϝƏBĤ[3Kk|Bbm4BJbɬoقW6L4J)RAyCl.hƥlt$¿_SJb嶚.%i#PU틧o ]8@eG?y*֖&=wle6VOؽgS_} ) 淞V3oBoj9. EH@bӞ$#O/dW -%6SC+QLN_ OJ` ֖$ ה=Krk/ŏ’a;Q>K<)M&d};&n<{}쵕̀+ Y$PeOo' [:dQ0d븩\ygEpΙRy.R}5c&n_oH*?f2SJ)R\1IN˪+|p"t4b1})Yw~>%In6,1ǐƐѰQlm!@έ S( \ԜSy'esn޺ͱB Z6.@~ Y2J4]fʅ+7̮oꂳc`l8zڢ-w斌 IC\hi2Fj[)nwuI芁 I)΄(;S~ֶ))⣷,m 6P2]E!ZZ$ vU];jAE"ˑ`&-%yjp\x6W|MIBJ}C%ҒdW)~մm9-1j02H̉%iasM; {{h,Y1%{Xt~t2g+Z-Sl˯ARڙL4Imm7jըȒ4 έ S(E Cb냱+٤ eŀ.Y^58gm%izҜc6x9 Hh ޛ$}?>_|-I(ɾ~8,KO*thCYXzELbO@ptșXR7SUy&k7chCYZT\ȐT1u%ț1Фt/>eyrX:a@Oy w tJbg~s~ WdwnjiFښN `(J.s!=*Iڒ=OOOMG]Bpƒ[YxUwx[$H/b]ȩRK,"Hӏa?wR2$l|Xe*qY{PCP4}qdxCul e)âe;-G lfD9|^Sŋ+Q \ԥK~D Fbn^`̯q|`dy6[Qмaweb2f$ `4Ιgkɋȷ`Qsn*Dx$ipO1MF$ET)A94 .IcG~tr&]΃Ϯ`">?4^c\zx6Mn?׾ϼqbbRLpja~Lj%jA: ѴbFi$i`-| uohlljjeDZ10v=PďĔHKKI%SXOXɶ)D۫o6礜Z6^j2dKkbX,ZE%H5j4ĭ&#*%%ԬR݌WP%iG%֚WW6{Z#zݰ|à?<UܤoK[ݻԄȀC-tE I)Lpp\Bry&o]yC$$i@[7yƺOˋ ^eef<=~0 (`i8/: ĐVN3>r~ Ry~t;*[MwyY߻ubGؿ=q*.>f)*-:6Qx(vxC+z3dh[]ˑ\t͜`j+IV-MƫI?wC$T)<N:DI5|ɌjVb>:p zr6%%H`o̻u:Bi[D;`^O#<]VRt{`}%*M"*B<#4ߢ#m#ox6=ܪ}TW%iJ#o^]9X¥PྴUPQU?3Jx 1T%i?FK5eR,>fw5W$ihݑAqT#ۦY1BRxVGܗֲ$Bl[k)2~kݛ|{-Ȓ4@-L*}}ȟ=ƹ8Y[ꩭ(/+C@V^Q34g;q&q4Ք!I9 - eq&EOHy=h[]cPw^|*;> !X$ 43p^rSVsh)lp4Ik==zRA@S LKS{䲳!:M ][>~0}Y6 QF򸵥1µǻ8ZwWS%X i4:kbUa`@[YZh$% 5d}-rLhq @SchpE-$ 4YǴӻ#">_e't9)*lBwm[?~2lD(IRe.U(/I{ާ-&+Β)Yǐm!C h7s! GYb,ŋJR2Xp]KIHh9/:amk2FJ C}Ȓ"ϾDO;ޠ$yTgi:(y,[Mg=?o@"$Ϲј*b$q-LԮC`b1 ˑSTQ7mbn9tֶ+ `h664mx(j$i)MZDf.`:¥W$ih2}&nV(Hh.1 }WЕfH~x}P~;֖HňxOXSKFI1DjC>F WH訒4lI)iH``ml6nOYg# 4fC8vXOߨywu?tx[$Md7s@vo'I0ŤƱ㱁{H M3C"oY[>Kňxoc6L6S2HȀDVS#"@fqdԴzu$Ys. ^aKDԞS~B\3dh6,0 mNڂ^FKad'W J8cB/5-%#SݺF?T((Aϒuay$GmeksEs`IȀDtdd&*htlԣIN#F9cuw9pxlIݼsQ뒚$2T8BI4d(GOǛI4tE74TCQ-32PLAgrѭm{?+Zq} z0#![&33QY^osk;c&xY*lS}%\z=~jzƋek[*.` CꁆCIbb35Ihi2'#$IЍ8sݳ m!uqvMDẸ1cn,D1c>_[46Lb4آ1&1+[Yjؽs~ݹ3s=P-(Dʖ@#ߏeSǴoG GsuO(b}&*Gk^ۻi]{6fԙ}!]uܥ7q\BrjzfVvNn^~AF6-n  dxuoK/n*T ʇ1<RpeqfD7]ܨ'eT>~ ȿr2`0%-(Df xXNXKRdյѿ n숮:5q@"tÊLTSj5mZ߁#B̜tպ.]q\brZfaUk0`Dz&&=<:#SuV#MZLt{-z[#ōzbZƲƋɀ+%2<4ГOz[&}"eͮ ]V]&n zA 9|HZfo-|C9䙨<{F:<-]iGNG\u' Ne֍A փJ Nlwzć)eJLt'g֍]RWu.n26/ q]W9C+mnװ1@n΃ nm40{ P;Mro03QM8حN0}u3o܋KJ+柛ɀ  dxIpG(*ѝIN$R&$_i/VE@qQ9z~BywA~eVdw ,GWXs ŶI]k|ICM$d>6z1<Մl=D茅8޿g,Kr̯Cp9t֫&?SvD5'Gq\HS[t X| u"D5jYOo ?}]r'YJR~h  d+9MG= +@oL&ºmk2QOLX;H"K6CZm@ }rtr[2G>ʎ{;^FYlSIF%䙨FLm^e`Y6ljiK)?[n~mʥ ^΍Lx=1XdHőq(n2MY.\:P&AxXȶ : ʀpU#֜N&_7Gt$do>*iW/ݬK2iΊ{^81]8*iECe(v=i&|-;JOKoVL&4sِ6eMPܨUԮ YriS?7B ŵeT49օ3\x@eiL~H$s*[WCjI tRTӆ2ֻugضD)YUiE3ј }t0]4.tLaDqyEy{UM16 #4(o[L0.\h" mwYj3n|?;LI$ :6v 2ԴѧvSmsjL|jNj^wʍ 5{(S#4Pp]G G2O(co\fa "H$Ns2*yVUj%C dxHQO~uHPB #?^\o,^Ӑ4p魒PZE/ Gf0[Gp=luO{T"i .ƎJl& T@"G#n>:>= 12x0=:*(1!k ]Ti>f.Di &UU+mW<;ၒHR'>}y4PhRxgr+[֍igNhm];g/%dVqȀuC4tyA҈ #)Ր"YɊ)˨퓻2r(3¸zt!B:IsíRI89YC{7*Y1~o5ЍgYf>I@XZ iITk)zEҘ 9dGB>͇FuoXP`Q$ Og8`2Ur HI$ b(yWLeGs\ ?7';3#5%-#WIO 0>\e2&ﶨGAP>N~B %AV;~=JπpuJgYn/.}XEWI8kn*[AS7IdA7RIOJ E0>{w~mӺMJ" "iIaۛGGX2?]fY i ""O ؆Tnh]:AEGWWO褩 eoqwC[~&6Jټ߾v}7-7kǓBM^ù^,%4MƣH?Ld?H2WÑ46?dzrHpP+] x3$8OHA^5 9$K?rQ^v?n [`'F? ۴lZn.5Z \L ('%nol#iXL&49FHZǦasq~ 0 +iEtcE"LfEҀ-qn0ʾNIǜjSbcW%sM9_n[6nP׫Z "iIQFҰhLiǗ0s iH $WNnkƕ-~l }ۆSխ4(coqL ϶Ba߿rl߷a gzON~> thogcm.}vۤ(?)1cG4,U Z&Ɲ4k]#y$ -c"nlȭ3I"lg DŽ5}TKa\jПLQ$ &!ɚ{7,]|?z sRGܷuFůi}/7g{[H &OR'% d"Iǂe2]aʍ]T3Jr iH {:3$S9}* !-gI k gЦ^5a@I$ " *?Kw:&7ѵ#?=q~W1g D*e*̆)ri^>HRÑ4C gFn 3K.ᑩm8pқ@4|PFHv̺[Vqy*[ϸwڣGc4tg-Ȉyӆ h^ߣ7C!imuZP fC *ȶ%{ρ!%|[Xs>Mϸq|{ۛiv DBdxhlDucY.m#ɃCpUxc@ iȋBߟ{7Ns+^!iR۽{y{8X6GJ"ixX~@͆)oWEgNpSy~$\ZoR#sƥ qb.:$OҒH4/3\n]G:J_>J"iHg޻a3ԢIχhYNZP "iI@͆1P&F+mƬt5 vضֺV);A9DyI 7VI$;4Ќjf"'mgUsݜuWIOzLnF$d@Lb楦FmǮ*Ǧ~ڴ&B[ISU~%KnkQVA$u{K$Mݰ R=_ݷtt&vT%I.pE4Фw$\* 2<4d*4/5e4ޖ~x[+N7^H"'tŽъHF83\_ l%"iPg$D%UNM/A6MwѰYSYJ"iImO2 nF$e2qٱU#=ҼBXTU73{_t& *X p$ GgxuMpg8hU[89HZ˥x@4|uoڭ-dHtn!+N'2U) mQd~_#KM!$Ez[F=Ou[&x2v Iەm]BIPIj;A`Zk!*g'w/j2bZ5s] -B\CJ"iI%Q6ni5'`28l}]MݼBH o{S=stQҁ{@4|N0B$ʡaHIM)͏4BT]FTvɋ?yRz̶[@,^b]VլH#<‰^& !i,-ҭ5'?&-O^ v`$ gg8S!.ڃW>kFD[EҀMjG4Rʭku(IwNpg|ŕDP'1EδI#LO㓊#KL)$EE`d*g| 8?=j+c}Q$͋ Ls7mS/|A40DKk5pCaArQ}~ ~%Wmtq׎`ӔaͪJ"ix8SЧ\3fER&6 Ti^bJ!i,8YC;spۏ ;E?wv͊l2 7muW6t@qZ!i&5$Zk\Fkdڬ}44!4aX*3kڃ0 r\լHd:m?'өHRS I#cQk#dٷPjFA YۂsߌPZ'n$UΞ5am8khZB@N$2QeMa[W5ɗ6sXXA`).P(9H{"iV^;o>`Y?ۧjH+̡gfNmG۬720𢿍z[}NϟD&A8jr1)4<=l/wcEI)gM6@S%ky4kzt޳Xvp42HG$}qDGҵgЏI>̒UQgxk!:e:? &hRZk銄ܘ}p.+`HmbM$ ɀ*nAKjM{e_/ҿ%FZAFTq_ MG }W("a؍Ae,ad_ghF)cQ1d_.$6vson|?k|uϽyx$DDziy}gXΟȞ9RLSJ[&[ThZe2;5o*/Kc[8<М<4P d𬞻- =q#$VUᔶ  >2U D|MlhQRi]{P 3|!o8uf-_>oKF IhN'y.k͓YZz"|2ӐU`ͪ뜡 sE'n ZR$JV|d]VZZDӌ-_uҬȣK6*| gA)[o*Z* IV^9W>ϗ CҀ-I^y-oVA*vV4$ ( <)Р%EdP3]v"? Z;OXw&: ?RykjR/nmoe|ޓˆ6W<}TƬ:l !ih[Fe^Y;+j20$粩G*0$ @F{\8ۢ@0 t@CxvyYK{hĚu;|F܏ >|`QF<Ϗ~k|N;QYGN=S[fYкw%08v2cHŋWVPf:v}Bɜxl+m3$qI^nwJSնEaI-)8;*|LjoBŚGz M)$#q3‡pkcx~n#vi욱u8_Kn`ekߵlB&5tWXA]}ĭGVOmLD T+4 6}G`KY:UFf& ZR$T|PvҬچZ!v=&o29-57qE g;g󓞃 i:6ԭz^?(Aaagi7}mD;l n˚P#ihŝtbxTebeZאw E3"k1$&5raO'+#mQ.mRUu̚v6wiďA/!z3i3hIDȤb4PLZps,uUՍ9 [tDJ>f[.-N?>e_uo$|im4T/i7>t// MF%OBkǶ[no7"b JEҀ-F,09 "M %bLım€.͍t4R60j֞y}֓"#;DxVm47* i >ri4jllY =N1#ʒځ#'_>E:t.nEN߉F|g8i(1EU ˘woߺuνĴBDҀ-ĤF,9kEu~W(f#Wd昁=Z5ml݀M;8}5b|/Ab^!4!z0xpp$ n}H$&'\O‚[/Ȍx턯JsجVzڲ3гiqfٍP$ 3+ H-e%#'o]IZVZ\#l_XBQ@[ T*u{!NU^kAi`njyqε f>dVvԹ?ܼq%X#h4\9g#H(4 "mA7f'?  jI9&MɁj%.l٣ɍ"ih^`i5;{N&[Üֺv!Zd%F߽{eKY- | yI0F`i{6щI؂*j0ukp2ܖ˂,6MjeImKJ]1O}e4pdD*_}@WJPltǟY1Te|ZƬԲϖe$D tԉV'=wVW5(T#4= EXߨDlA݄ n'V[Y-RbҼ= 77$0Ql`+IxW4Ý@*Izc4Ғ¼/bcX%fP=?S@$ ͱ%V晍"ihoTBUN|J$7έym 4RwhGS C`wN^NWޮƶ~(t**.F+844ǖhi{6:}F% $ Dݸb cJZ>olR~NM(]cov u?>m"ʗHcK4= }a ) jeMP,0eJ*-~6B.9ÉGt[\W{aHN+ԩJڊ7ޑH ys D^n6:}JHh44ULFʒTZ{mOCl͵H_ ;Ñꖽ[hz;;Uj4y#iIVfmKM$=R$$ Dbnl.\00v]fQ 1bGBHHkG"b!k^"iCt*c`~}M^IHa#EAPB@؏]}Iˊ2/l7)a_Jgxw Pi6_BҠ- D&ԩJ6Sl`;n%.E"Hi&#iHIC k[us`̂2<&-.p(CKl]=Wz\Z!4{ $ vrHúG;HODVN< =R( $ 5Dפ7b5TZvrÌ>͍F:34|HêǜwRLIJ iH eo$ڑ8}MUدvPVT_H9D+4a$#E@jn҇neYo^9{C>[u}gBI Z RjWd$f2aHE^~$sr8mK>pR&'DÁXi HA#EAC@Djf×[iYaZ=c62PErISpR7w})Nͼ">J%i $ sZ7kzM;MVLJE G:\H$MC6IƑ4G E{-f=[vKR-? i_c֥%i;JkcW׎:y y] C`-A<("TU"KW%&E(@@$ m WZ9i4HG A4U$֮irvyg>ud4eyugx5R1j=tш<_βl[۶3R{-x.QDm؍Yui~s_<6#MJ+'M?* .;t'!#Jx~n6Pɖb](mPGPU/nqܪSQ5_m6M}|ec/?F 'Ԓ}ĭґ4("C"MKۯ++ ;sɄᓼHC!44)[i%C#inGy(Ab_iϘWVzPɖb](lRIꯢm8yol`w~mĒ={f;sy"2CD׋UNmGv?~pΝ w'$$6@:ʋ9iu$[h׳x%l09&Yz%{?43rW/^3|tek)Q.үuB=-|1PDdV5i3h+%]v7VmJ^IM迹6CZ|BҼ%y>% SM`ҫG~l@"?o4p,tsHŠIYΊJK 3ش`DƟ^}@H HВO3W("2T4,:<ۭYr wIߦ*='Km5L[1GoOn۴pTff-.p,tsHjش,7[L8kRvFWBH̒O5w`DT[k[uu]s2"&Geӱ[>F965T5v8:I*a 7 4^Wq/ KVnkro>ozxŖf]`CȶۙNG=߲Ӑuhd.V47\''js+u: Ajm}.ǢC4m7OC'$ͻYjQɹpIQ۽;wjdDLٺԾ3[vsЗϷ_le"L DH HiȀkk*z֎<# qq846֐ѡH$!iHiiO>Cs2[mIAG׎m]:}Hfu1CԾ3Gvk4aghF`߻b5pf#V! IZ9 pmMEAQKv_zW*K.ǢC409Iv ,YnQ$])4Wf=vf)]?o5 HUa瑋w&k:65Ezv BIY9 Ad5z>q/. 4SӶ DҀ$V`PZ~ᙅ*H 2 itی]w1!1ʌ7=I4;8OrdC"CN6iC3d<_{yr}5pQ~+{e±>;O~3lJaBB‡'FAF:zO^bd"f'?â50ԨH%nwΊ<'Df׉g9cKF%F^ܹգmP=wըg1dzraJ"c~ x1zqzkGeD:uvv˦Aw$fSDl07=!Y-Lpr]Z=zۺ$_GVGii̢MG?"I%ذV`_4`}.SI_M07]$!{M)D@(QT 0 *YLZ{??ytݥqF B0[Y$lN]=)Ւ=!j+!20?=dʥX,v>KWU:iMDڒe= y5} &H6mڸrB:mGL'{ކo?}o"XҾک=kt;(PX֒.Wxrf)#od~@]J Ѝgru>~'+7<#c30U\C7,nOv#.9ާ`JRSĀ'Bi?H%LEǻ?9Oo8sHC(a`3p[5GJ.6L9\vͭ2U% jb1lȭ`UEÀ\%:3L]a)"*Ǝ: ݬexKHN;&kMN\~!?}ލ nZ64-BSVZH o7+W fdU1I,뜵j |7ho_||,V䏙$]u8(9{1= н%b kvt1Zt߽|rNk/Ou6ReG&n)M WbowkY>UPA΃ /h2Kx$drbH&`#e@ +!HqG02*Z{wO[j#/^uӗo >~|Ϟ<}cvnZ`ZW}qZ3\FbȊ($!')CIfX+a^6eN|]x߽wn^t-+Nh*N q6ƒAe 7h(d< 0FkxFeǴEv.F,O<4{`trVAYU dȬ8/=!BWIRu4T#,ndBxt#07#)*L[Q#tk%.w@hT\bJ* $DE;ZkKqQM;R#3+''dT_CQJ3 /&mda`x9Yhȉ Q0# ' hi(Ȉ pr6i),+("! 𓓑hF(":d%D)6w`h 899FnX68< ` `S1 `7!$Smondrian-3.11.0.1-R/doc/manuals.html000066400000000000000000000027601261646570300170530ustar00rootroot00000000000000 Mondrian Manuals
Mondrian Manuals

Below is a list of documents that collect the variety of documentation related to Mondrian in one place.

Mondrian 2.2.2 Documentation Zipped Word PDF
Mondrian Schema Workbench Word PDF

Author: JasperSoft; last modified May 2007.
Version: $Id$ (log)
Copyright (C) 2007-2007 JasperSoft


mondrian-3.11.0.1-R/doc/mdx.html000066400000000000000000002631501261646570300162050ustar00rootroot00000000000000 Pentaho Analysis Services: MDX Specification
MDX Specification

What is MDX? 

MDX stands for 'multi-dimensional expressions'. It is the main query language implemented by Mondrian.

MDX was introduced by Microsoft with Microsoft SQL Server OLAP Services in around 1998, as the language component of the OLE DB for OLAP API. More recently, MDX has appeared as part of the XML for Analysis API. Microsoft proposed MDX as a standard, and its adoption among application writers and other OLAP providers is steadily increasing.

What is the syntax of MDX? 

A basic MDX query looks like this:

SELECT {[Measures].[Unit Sales], [Measures].[Store Sales]} ON COLUMNS,
  {[Product].members} ON ROWS
FROM [Sales]
WHERE [Time].[1997].[Q2]

It looks a little like SQL, but don't be deceived! The structure of an MDX query is quite different from SQL.

Since MDX is a standard language, we don't cover its syntax here. (The Microsoft SQL Server site has an Multidimensional Expression (MDX) Referene; there's also a good tutorial in Database Journal.) This specification describes the differences between Mondrian's dialect and the standard dialect of MDX.

Mondrian-specific MDX 

StrToSet and StrToTuple 

The StrToSet() and StrToTuple() functions take an extra parameter.

Parsing 

Parsing is case-sensitive.

Parameters 

Pseudo-functions Parameter() and ParamRef() allow you to create parameterized MDX statements.

A call to the Parameter function defines a parameter's name, data type and default value. A parameter always has a default value (it makes life simpler for the UI). If the parameter is a member, then the data type is the name of a hierarchy that the parameter must belong to. This metadata potentially allows a user interface to generate a list of values for the parameter.

The purpose of the ParamRef function is if you want to define a parameter once and use it several times in the same query. You could use Parameter several times but you'd have to make sure the definitions (data type, default value) are identical otherwise mondrian would complain.

The olap4j API supports parameters as you would expect. Once you've prepared a statement, you can call PreparedOlapStatement.getParameterMetaData(). This returns an OlapParameterMetaData, which is a subclass of the JDBC ParameterMetaData object.

Cast operator 

The Cast operator converts scalar expressions to other types. The syntax is

Cast(<Expression> AS <Type>)

where <Type> is one of:

  • BOOLEAN
  • NUMERIC
  • INTEGER
  • STRING

For example,

Cast([Store].CurrentMember.[Store Sqft], INTEGER)

returns the value of the [Store Sqft] property as an integer value.

IN and NOT IN 

IN and NOT IN are Mondrian-specific functions. For example:

SELECT {[Measures].[Unit Sales]} ON COLUMNS,
   FILTER([Product].[Product Family].MEMBERS,
          [Product].[Product Family].CurrentMember NOT IN
              {[Product].[All Products].firstChild,
               [Product].[All Products].lastChild}) ON ROWS
FROM [Sales]

MATCHES and NOT MATCHES 

MATCHES and NOT MATCHES are Mondrian-specific functions which compare a string with a Java regular expression. For example, the following query finds all employees whose name starts with 'sam' (case-insensitive):

SELECT {[Measures].[Org Salary]} ON COLUMNS,
   Filter({[Employees].MEMBERS},
          [Employees].CurrentMember.Name MATCHES '(?i)sam.*') ON ROWS
FROM [HR]

The MATCHES operator takes a Java compliant regular expression syntax. Mondrian can evaluate the MATCHES operator natively by pushing it down to the underlying RDBMS. Not all dialects support the evaluation of regular expressions, and most do not support the full extent of the Java syntax. Mondrian relies on the database dialect SPI to convert Java regular expressions into something the database can understand. If the database does not support regular expressions, Mondrian will evaluate the results in memory, using the full Java compliant syntax.

Visual Basic for Applications (VBA) functions 

Since the first implementation of MDX was as part of Microsoft SQL Server OLAP Services, the language inherited the built-in functions available in that environment, namely the Visual Basic for Applications (VBA) specification. This specification includes functions for conversion (CBool, CInt, IsNumber), arithmetic (Tan, Exp), finance (NPer, NPV), and date/time (DatePart, Now). Even though Mondrian cannot interface with Visual Basic, it includes a large number of VBA functions to allow MDX queries written in a Microsoft environment to run unchanged.

This document describes which VBA functions are available in mondrian; for more detailed descriptions of all VBA functions, see Visual Basic Functions. Note that that document includes some VBA functions which are not implemented in mondrian.

Comments 

MDX statements can contain comments. There are 3 syntactic forms for comments:

// End-of-line comment

-- End-of-line comment

/* Multi-line
comment */

Comments can be nested, for example

/* Multi-line
comment /* Comment within a comment */
*/

Format Strings 

Every member has a FORMAT_STRING property, which affects how its raw value is rendered into text in the user interface. For example, the query

WITH MEMBER [Measures].[Profit] AS '([Measures].[Store Sales] - [Measures].[Store Cost])',
FORMAT_STRING = "$#,###.00"
SELECT {[Measures].[Store Sales], [Measures].[Profit]} ON COLUMNS,
{[Product].CurrentMember.Children} ON ROWS
FROM [Sales]

yields cells formatted in dollar and cent amounts.

Members defined in a schema file can also have format strings. Measures use the formatString attribute:

<Measure name="Store Sales" column="store_sales" aggregator="sum" formatString="#,###.00"/>

and calculated members use the <CalculatedMemberProperty> sub-element:

<CalculatedMember name="Profit" dimension="Measures" formula="[Measures].[Store Sales] - [Measures].[Store Cost]">
  <CalculatedMemberProperty name="FORMAT_STRING" value="$#,##0.00"/>
</CalculatedMember>

Format strings use Visual Basic formatting syntax; see class mondrian.util.Format for more details.

A measure's format string is usually a fixed string, but is really an expression, which is evaluated in the same context as the cell. You can therefore change the formatting of a cell depending upon the cell's value.

The format string can even contain 'style' attributes which are interpreted specially by JPivot. If present, JPivot will render cells in color.

The following example combines a dynamic formula with style attributes. The result is that cells are displayed with green background if they are less than $100,000, or a red background if they are greater than $100,000:

WITH MEMBER [Measures].[Profit] AS
   '([Measures].[Store Sales] - [Measures].[Store Cost])',
  FORMAT_STRING = Iif([Measures].[Profit] < 100000, '|#|style=green', '|#|style=red')
SELECT {[Measures].[Store Sales], [Measures].[Profit]} ON COLUMNS,
  {[Product].CurrentMember.Children} ON ROWS
FROM [Sales]

Order of sets

MDX sets are ordered and may contain duplicates. (Both of these properties are at odds with the mathematical definition of 'set', so it would have been better if they were called 'lists', but we're stuck with the term 'set'.)

For most functions that return sets, Microsoft's documentation for SQL Server Analysis Services 2008 (the de facto MDX standard) does not specify the order of elements in the result set, and one might assume that MDX server could return the results in any order and still comply with the standard. However, Mondrian's implementation of MDX gives stronger guarantees: a function's result set will be in the obvious order.

For most functions, the definition of 'obvious' is obvious, so we won't spell it out in detail. For example, Filter returns elements in the same order as the set expression; Crossjoin returns the results in the order of the first set expression, then within that, by the second second expression. Similarly Generate, Union, Except. The sorting functions (Order, TopCount, BottomCount, TopPercent, Hierarchize, etc.) use a stable sorting algorithm. Metadata methods such as <Hierarchy>.Members return their results in natural order.

If you do not care about the order of results of a set expression (say because you are sorting the results later), wrap the expression the Unorder function, and mondrian may be able to use a more efficient algorithm that does not guarantee order.

Function List

These are the functions implemented in the current Mondrian release.

Name Description
$AggregateChildren Equivalent to 'Aggregate(<Hierarchy>.CurrentMember.Children); for internal use.

Syntax

<Numeric Expression> $AggregateChildren(<Hierarchy>)
()

Syntax

* Multiplies two numbers.

Syntax

<Numeric Expression> * <Numeric Expression>
* Returns the cross product of two sets.

Syntax

<Set> * <Set>
<Member> * <Set>
<Set> * <Member>
<Member> * <Member>
+ Adds two numbers.

Syntax

<Numeric Expression> + <Numeric Expression>
- Subtracts two numbers.

Syntax

<Numeric Expression> - <Numeric Expression>
- Returns the negative of a number.

Syntax

- <Numeric Expression>
/ Divides two numbers.

Syntax

<Numeric Expression> / <Numeric Expression>
: Infix colon operator returns the set of members between a given pair of members.

Syntax

<Member> : <Member>
< Returns whether an expression is less than another.

Syntax

<Numeric Expression> < <Numeric Expression>
< Returns whether an expression is less than another.

Syntax

<String> < <String>
<= Returns whether an expression is less than or equal to another.

Syntax

<Numeric Expression> <= <Numeric Expression>
<= Returns whether an expression is less than or equal to another.

Syntax

<String> <= <String>
<> Returns whether two expressions are not equal.

Syntax

<Numeric Expression> <> <Numeric Expression>
<> Returns whether two expressions are not equal.

Syntax

<String> <> <String>
= Returns whether two expressions are equal.

Syntax

<Numeric Expression> = <Numeric Expression>
= Returns whether two expressions are equal.

Syntax

<String> = <String>
> Returns whether an expression is greater than another.

Syntax

<Numeric Expression> > <Numeric Expression>
> Returns whether an expression is greater than another.

Syntax

<String> > <String>
>= Returns whether an expression is greater than or equal to another.

Syntax

<Numeric Expression> >= <Numeric Expression>
>= Returns whether an expression is greater than or equal to another.

Syntax

<String> >= <String>
AND Returns the conjunction of two conditions.

Syntax

<Logical Expression> AND <Logical Expression>
Abs Returns a value of the same type that is passed to it specifying the absolute value of a number.

Syntax

<Numeric Expression> Abs(<Numeric Expression>)
Acos Returns the arccosine, or inverse cosine, of a number. The arccosine is the angle whose cosine is Arg1. The returned angle is given in radians in the range 0 (zero) to pi.

Syntax

<Numeric Expression> Acos(<Numeric Expression>)
Acosh Returns the inverse hyperbolic cosine of a number. Number must be greater than or equal to 1. The inverse hyperbolic cosine is the value whose hyperbolic cosine is Arg1, so Acosh(Cosh(number)) equals Arg1.

Syntax

<Numeric Expression> Acosh(<Numeric Expression>)
AddCalculatedMembers Adds calculated members to a set.

Syntax

<Set> AddCalculatedMembers(<Set>)
Aggregate Returns a calculated value using the appropriate aggregate function, based on the context of the query.

Syntax

<Numeric Expression> Aggregate(<Set>)
<Numeric Expression> Aggregate(<Set>, <Numeric Expression>)
AllMembers Returns a set that contains all members, including calculated members, of the specified dimension.

Syntax

<Dimension>.AllMembers
AllMembers Returns a set that contains all members, including calculated members, of the specified hierarchy.

Syntax

<Hierarchy>.AllMembers
AllMembers Returns a set that contains all members, including calculated members, of the specified level.

Syntax

<Level>.AllMembers
Ancestor Returns the ancestor of a member at a specified level.

Syntax

<Member> Ancestor(<Member>, <Level>)
<Member> Ancestor(<Member>, <Numeric Expression>)
Asc Returns an Integer representing the character code corresponding to the first letter in a string.

Syntax

<Integer> Asc(<String>)
AscB See Asc.

Syntax

<Integer> AscB(<String>)
AscW See Asc.

Syntax

<Integer> AscW(<String>)
Ascendants Returns the set of the ascendants of a specified member.

Syntax

<Set> Ascendants(<Member>)
Asin Returns the arcsine, or inverse sine, of a number. The arcsine is the angle whose sine is Arg1. The returned angle is given in radians in the range -pi/2 to pi/2.

Syntax

<Numeric Expression> Asin(<Numeric Expression>)
Asinh Returns the inverse hyperbolic sine of a number. The inverse hyperbolic sine is the value whose hyperbolic sine is Arg1, so Asinh(Sinh(number)) equals Arg1.

Syntax

<Numeric Expression> Asinh(<Numeric Expression>)
Atan2 Returns the arctangent, or inverse tangent, of the specified x- and y-coordinates. The arctangent is the angle from the x-axis to a line containing the origin (0, 0) and a point with coordinates (x_num, y_num). The angle is given in radians between -pi and pi, excluding -pi.

Syntax

<Numeric Expression> Atan2(<Numeric Expression>, <Numeric Expression>)
Atanh Returns the inverse hyperbolic tangent of a number. Number must be between -1 and 1 (excluding -1 and 1).

Syntax

<Numeric Expression> Atanh(<Numeric Expression>)
Atn Returns a Double specifying the arctangent of a number.

Syntax

<Numeric Expression> Atn(<Numeric Expression>)
Avg Returns the average value of a numeric expression evaluated over a set.

Syntax

<Numeric Expression> Avg(<Set>)
<Numeric Expression> Avg(<Set>, <Numeric Expression>)
BottomCount Returns a specified number of items from the bottom of a set, optionally ordering the set first.

Syntax

<Set> BottomCount(<Set>, <Numeric Expression>, <Numeric Expression>)
<Set> BottomCount(<Set>, <Numeric Expression>)
BottomPercent Sorts a set and returns the bottom N elements whose cumulative total is at least a specified percentage.

Syntax

<Set> BottomPercent(<Set>, <Numeric Expression>, <Numeric Expression>)
BottomSum Sorts a set and returns the bottom N elements whose cumulative total is at least a specified value.

Syntax

<Set> BottomSum(<Set>, <Numeric Expression>, <Numeric Expression>)
CBool Returns an expression that has been converted to a Variant of subtype Boolean.

Syntax

<Logical Expression> CBool(<Value>)
CByte Returns an expression that has been converted to a Variant of subtype Byte.

Syntax

<Integer> CByte(<Value>)
CDate Returns an expression that has been converted to a Variant of subtype Date.

Syntax

<DateTime> CDate(<Value>)
CDbl Returns an expression that has been converted to a Variant of subtype Double.

Syntax

<Numeric Expression> CDbl(<Value>)
CInt Returns an expression that has been converted to a Variant of subtype Integer.

Syntax

<Integer> CInt(<Value>)
Cache Evaluates and returns its sole argument, applying statement-level caching

Syntax

Cache(<<Exp>>)
CalculatedChild Returns an existing calculated child member with name <String> from the specified <Member>.

Syntax

<Member> <Member>.CalculatedChild(<String>)
Caption Returns the caption of a dimension.

Syntax

<Dimension>.Caption
Caption Returns the caption of a hierarchy.

Syntax

<Hierarchy>.Caption
Caption Returns the caption of a level.

Syntax

<Level>.Caption
Caption Returns the caption of a member.

Syntax

<Member>.Caption
Cast Converts values to another type.

Syntax

Cast(<Expression> AS <Type>)
Children Returns the children of a member.

Syntax

<Member>.Children
Chr Returns a String containing the character associated with the specified character code.

Syntax

<String> Chr(<Integer>)
ChrB See Chr.

Syntax

<String> ChrB(<Integer>)
ChrW See Chr.

Syntax

<String> ChrW(<Integer>)
ClosingPeriod Returns the last descendant of a member at a level.

Syntax

<Member> ClosingPeriod()
<Member> ClosingPeriod(<Level>)
<Member> ClosingPeriod(<Level>, <Member>)
<Member> ClosingPeriod(<Member>)
CoalesceEmpty Coalesces an empty cell value to a different value. All of the expressions must be of the same type (number or string).

Syntax

CoalesceEmpty(<Value Expression>[, <Value Expression>...])
Correlation Returns the correlation of two series evaluated over a set.

Syntax

<Numeric Expression> Correlation(<Set>, <Numeric Expression>)
<Numeric Expression> Correlation(<Set>, <Numeric Expression>, <Numeric Expression>)
Cos Returns a Double specifying the cosine of an angle.

Syntax

<Numeric Expression> Cos(<Numeric Expression>)
Cosh Returns the hyperbolic cosine of a number.

Syntax

<Numeric Expression> Cosh(<Numeric Expression>)
Count Returns the number of tuples in a set, empty cells included unless the optional EXCLUDEEMPTY flag is used.

Syntax

<Numeric Expression> Count(<Set>)
<Numeric Expression> Count(<Set>, <Symbol>)
Count Returns the number of tuples in a set including empty cells.

Syntax

<Set>.Count
Cousin Returns the member with the same relative position under <ancestor member> as the member specified.

Syntax

<Member> Cousin(<Member>, <Ancestor Member>)
Covariance Returns the covariance of two series evaluated over a set (biased).

Syntax

<Numeric Expression> Covariance(<Set>, <Numeric Expression>)
<Numeric Expression> Covariance(<Set>, <Numeric Expression>, <Numeric Expression>)
CovarianceN Returns the covariance of two series evaluated over a set (unbiased).

Syntax

<Numeric Expression> CovarianceN(<Set>, <Numeric Expression>)
<Numeric Expression> CovarianceN(<Set>, <Numeric Expression>, <Numeric Expression>)
Crossjoin Returns the cross product of two sets.

Syntax

<Set> Crossjoin(<Set>, <Set>)
CurrentDateMember Returns the exact member within the specified dimension corresponding to the current date, in the format specified by the format parameter. If there is no such date, returns the NULL member. Format strings are the same as used by the MDX Format function, namely the Visual Basic format strings. See http://www.apostate.com/programming/vb-format.html.

Syntax

<Member> CurrentDateMember(<Hierarchy>, <String>)
CurrentDateMember Returns the closest or exact member within the specified dimension corresponding to the current date, in the format specified by the format parameter. Format strings are the same as used by the MDX Format function, namely the Visual Basic format strings. See http://www.apostate.com/programming/vb-format.html.

Syntax

<Member> CurrentDateMember(<Hierarchy>, <String>, <Symbol>)
CurrentDateString Returns the current date formatted as specified by the format parameter.

Syntax

<String> CurrentDateString(<String>)
CurrentMember Returns the current member along a dimension during an iteration.

Syntax

<Dimension>.CurrentMember
CurrentMember Returns the current member along a hierarchy during an iteration.

Syntax

<Hierarchy>.CurrentMember
DDB Returns a Double specifying the depreciation of an asset for a specific time period using the double-declining balance method or some other method you specify.

Syntax

<Numeric Expression> DDB(<Numeric Expression>, <Numeric Expression>, <Numeric Expression>, <Numeric Expression>, <Numeric Expression>)
DDB Returns a Double specifying the depreciation of an asset for a specific time period using the double-declining balance method or some other method you specify.

Syntax

<Numeric Expression> DDB(<Numeric Expression>, <Numeric Expression>, <Numeric Expression>, <Numeric Expression>)
DataMember Returns the system-generated data member that is associated with a nonleaf member of a dimension.

Syntax

<Member>.DataMember
Date Returns a Variant (Date) containing the current system date.

Syntax

<DateTime> Date()
DateAdd Returns a Variant (Date) containing a date to which a specified time interval has been added.

Syntax

<DateTime> DateAdd(<String>, <Numeric Expression>, <DateTime>)
DateDiff Returns a Variant (Long) specifying the number of time intervals between two specified dates.

Syntax

<Numeric Expression> DateDiff(<String>, <DateTime>, <DateTime>, <Integer>, <Integer>)
DateDiff Returns a Variant (Long) specifying the number of time intervals between two specified dates.

Syntax

<Numeric Expression> DateDiff(<String>, <DateTime>, <DateTime>, <Integer>)
DateDiff Returns a Variant (Long) specifying the number of time intervals between two specified dates.

Syntax

<Numeric Expression> DateDiff(<String>, <DateTime>, <DateTime>)
DatePart Returns a Variant (Integer) containing the specified part of a given date.

Syntax

<Integer> DatePart(<String>, <DateTime>, <Integer>, <Integer>)
DatePart Returns a Variant (Integer) containing the specified part of a given date.

Syntax

<Integer> DatePart(<String>, <DateTime>, <Integer>)
DatePart Returns a Variant (Integer) containing the specified part of a given date.

Syntax

<Integer> DatePart(<String>, <DateTime>)
DateSerial Returns a Variant (Date) for a specified year, month, and day.

Syntax

<DateTime> DateSerial(<Integer>, <Integer>, <Integer>)
DateValue Returns a Variant (Date).

Syntax

<DateTime> DateValue(<DateTime>)
Day Returns a Variant (Integer) specifying a whole number between 1 and 31, inclusive, representing the day of the month.

Syntax

<Integer> Day(<DateTime>)
DefaultMember Returns the default member of a dimension.

Syntax

<Dimension>.DefaultMember
DefaultMember Returns the default member of a hierarchy.

Syntax

<Hierarchy>.DefaultMember
Degrees Converts radians to degrees.

Syntax

<Numeric Expression> Degrees(<Numeric Expression>)
Descendants Returns the set of descendants of a member at a specified level, optionally including or excluding descendants in other levels.

Syntax

<Set> Descendants(<Member>)
<Set> Descendants(<Member>, <Level>)
<Set> Descendants(<Member>, <Level>, <Symbol>)
<Set> Descendants(<Member>, <Numeric Expression>)
<Set> Descendants(<Member>, <Numeric Expression>, <Symbol>)
<Set> Descendants(<Member>, <Empty>, <Symbol>)
Dimension Returns the dimension that contains a specified hierarchy.

Syntax

<Dimension>.Dimension
Dimension Returns the dimension that contains a specified hierarchy.

Syntax

<Hierarchy>.Dimension
Dimension Returns the dimension that contains a specified level.

Syntax

<Level>.Dimension
Dimension Returns the dimension that contains a specified member.

Syntax

<Member>.Dimension
Dimensions Returns the dimension whose zero-based position within the cube is specified by a numeric expression.

Syntax

<Dimension> Dimensions(<Numeric Expression>)
Dimensions Returns the dimension whose name is specified by a string.

Syntax

<Dimension> Dimensions(<String>)
Distinct Eliminates duplicate tuples from a set.

Syntax

<Set> Distinct(<Set>)
DrilldownLevel Drills down the members of a set, at a specified level, to one level below. Alternatively, drills down on a specified dimension in the set.

Syntax

<Set> DrilldownLevel(<Set>)
<Set> DrilldownLevel(<Set>, <Level>)
<Set> DrilldownLevel(<Set>, <Empty>, <Numeric Expression>)
DrilldownLevelBottom Drills down the bottommost members of a set, at a specified level, to one level below.

Syntax

<Set> DrilldownLevelBottom(<Set>, <Numeric Expression>)
<Set> DrilldownLevelBottom(<Set>, <Numeric Expression>, <Level>)
<Set> DrilldownLevelBottom(<Set>, <Numeric Expression>, <Level>, <Numeric Expression>)
<Set> DrilldownLevelBottom(<Set>, <Numeric Expression>, <Empty>, <Numeric Expression>)
DrilldownLevelTop Drills down the topmost members of a set, at a specified level, to one level below.

Syntax

<Set> DrilldownLevelTop(<Set>, <Numeric Expression>)
<Set> DrilldownLevelTop(<Set>, <Numeric Expression>, <Level>)
<Set> DrilldownLevelTop(<Set>, <Numeric Expression>, <Level>, <Numeric Expression>)
<Set> DrilldownLevelTop(<Set>, <Numeric Expression>, <Empty>, <Numeric Expression>)
DrilldownMember Drills down the members in a set that are present in a second specified set.

Syntax

<Set> DrilldownMember(<Set>, <Set>)
<Set> DrilldownMember(<Set>, <Set>, <Symbol>)
Except Finds the difference between two sets, optionally retaining duplicates.

Syntax

<Set> Except(<Set>, <Set>)
<Set> Except(<Set>, <Set>, <Symbol>)
Exists Returns the the set of tuples of the first set that exist with one or more tuples of the second set.

Syntax

<Set> Exists(<Set>, <Set>)
Exp Returns a Double specifying e (the base of natural logarithms) raised to a power.

Syntax

<Numeric Expression> Exp(<Numeric Expression>)
Extract Returns a set of tuples from extracted dimension elements. The opposite of Crossjoin.

Syntax

Extract(<Set>, <Dimension>[, <Dimension>...])
FV Returns a Double specifying the future value of an annuity based on periodic, fixed payments and a fixed interest rate.

Syntax

<Numeric Expression> FV(<Numeric Expression>, <Numeric Expression>, <Numeric Expression>, <Numeric Expression>, <Logical Expression>)
FV Returns a Double specifying the future value of an annuity based on periodic, fixed payments and a fixed interest rate.

Syntax

<Numeric Expression> FV(<Numeric Expression>, <Numeric Expression>, <Numeric Expression>, <Numeric Expression>)
FV Returns a Double specifying the future value of an annuity based on periodic, fixed payments and a fixed interest rate.

Syntax

<Numeric Expression> FV(<Numeric Expression>, <Numeric Expression>, <Numeric Expression>)
Filter Returns the set resulting from filtering a set based on a search condition.

Syntax

<Set> Filter(<Set>, <Logical Expression>)
FirstChild Returns the first child of a member.

Syntax

<Member>.FirstChild
FirstQ Returns the 1st quartile value of a numeric expression evaluated over a set.

Syntax

<Numeric Expression> FirstQ(<Set>)
<Numeric Expression> FirstQ(<Set>, <Numeric Expression>)
FirstSibling Returns the first child of the parent of a member.

Syntax

<Member>.FirstSibling
Fix Returns the integer portion of a number. If negative, returns the negative number greater than or equal to the number.

Syntax

<Integer> Fix(<Value>)
Format Formats a number or date to a string.

Syntax

<String> Format(<Member>, <String>)
<String> Format(<Numeric Expression>, <String>)
<String> Format(<DateTime>, <String>)
FormatCurrency Returns an expression formatted as a currency value using the currency symbol defined in the system control panel.

Syntax

<String> FormatCurrency(<Value>, <Integer>, <Integer>, <Integer>, <Integer>)
FormatCurrency Returns an expression formatted as a currency value using the currency symbol defined in the system control panel.

Syntax

<String> FormatCurrency(<Value>, <Integer>, <Integer>, <Integer>)
FormatCurrency Returns an expression formatted as a currency value using the currency symbol defined in the system control panel.

Syntax

<String> FormatCurrency(<Value>, <Integer>, <Integer>)
FormatCurrency Returns an expression formatted as a currency value using the currency symbol defined in the system control panel.

Syntax

<String> FormatCurrency(<Value>, <Integer>)
FormatCurrency Returns an expression formatted as a currency value using the currency symbol defined in the system control panel.

Syntax

<String> FormatCurrency(<Value>)
FormatDateTime Returns an expression formatted as a date or time.

Syntax

<String> FormatDateTime(<DateTime>, <Integer>)
FormatDateTime Returns an expression formatted as a date or time.

Syntax

<String> FormatDateTime(<DateTime>)
FormatNumber Returns an expression formatted as a number.

Syntax

<String> FormatNumber(<Value>, <Integer>, <Integer>, <Integer>, <Integer>)
FormatNumber Returns an expression formatted as a number.

Syntax

<String> FormatNumber(<Value>, <Integer>, <Integer>, <Integer>)
FormatNumber Returns an expression formatted as a number.

Syntax

<String> FormatNumber(<Value>, <Integer>, <Integer>)
FormatNumber Returns an expression formatted as a number.

Syntax

<String> FormatNumber(<Value>, <Integer>)
FormatNumber Returns an expression formatted as a number.

Syntax

<String> FormatNumber(<Value>)
FormatPercent Returns an expression formatted as a percentage (multipled by 100) with a trailing % character.

Syntax

<String> FormatPercent(<Value>, <Integer>, <Integer>, <Integer>, <Integer>)
FormatPercent Returns an expression formatted as a percentage (multipled by 100) with a trailing % character.

Syntax

<String> FormatPercent(<Value>, <Integer>, <Integer>, <Integer>)
FormatPercent Returns an expression formatted as a percentage (multipled by 100) with a trailing % character.

Syntax

<String> FormatPercent(<Value>, <Integer>, <Integer>)
FormatPercent Returns an expression formatted as a percentage (multipled by 100) with a trailing % character.

Syntax

<String> FormatPercent(<Value>, <Integer>)
FormatPercent Returns an expression formatted as a percentage (multipled by 100) with a trailing % character.

Syntax

<String> FormatPercent(<Value>)
Generate Applies a set to each member of another set and joins the resulting sets by union.

Syntax

<Set> Generate(<Set>, <Set>)
<Set> Generate(<Set>, <Set>, <Symbol>)
Generate Applies a set to a string expression and joins resulting sets by string concatenation.

Syntax

<String> Generate(<Set>, <String>)
<String> Generate(<Set>, <String>, <String>)
Head Returns the first specified number of elements in a set.

Syntax

<Set> Head(<Set>)
<Set> Head(<Set>, <Numeric Expression>)
Hex Returns a String representing the hexadecimal value of a number.

Syntax

<String> Hex(<Value>)
Hierarchize Orders the members of a set in a hierarchy.

Syntax

<Set> Hierarchize(<Set>)
<Set> Hierarchize(<Set>, <Symbol>)
Hierarchy Returns a level's hierarchy.

Syntax

<Level>.Hierarchy
Hierarchy Returns a member's hierarchy.

Syntax

<Member>.Hierarchy
Hour Returns a Variant (Integer) specifying a whole number between 0 and 23, inclusive, representing the hour of the day.

Syntax

<Integer> Hour(<DateTime>)
IIf Returns one of two tuples determined by a logical test.

Syntax

<Tuple> IIf(<Logical Expression>, <Tuple>, <Tuple>)
IIf Returns one of two dimension values determined by a logical test.

Syntax

<Dimension> IIf(<Logical Expression>, <Dimension>, <Dimension>)
IIf Returns one of two hierarchy values determined by a logical test.

Syntax

<Hierarchy> IIf(<Logical Expression>, <Hierarchy>, <Hierarchy>)
IIf Returns one of two level values determined by a logical test.

Syntax

<Level> IIf(<Logical Expression>, <Level>, <Level>)
IIf Returns boolean determined by a logical test.

Syntax

<Logical Expression> IIf(<Logical Expression>, <Logical Expression>, <Logical Expression>)
IIf Returns one of two member values determined by a logical test.

Syntax

<Member> IIf(<Logical Expression>, <Member>, <Member>)
IIf Returns one of two numeric values determined by a logical test.

Syntax

<Numeric Expression> IIf(<Logical Expression>, <Numeric Expression>, <Numeric Expression>)
IIf Returns one of two set values determined by a logical test.

Syntax

<Set> IIf(<Logical Expression>, <Set>, <Set>)
IIf Returns one of two string values determined by a logical test.

Syntax

<String> IIf(<Logical Expression>, <String>, <String>)
IPmt Returns a Double specifying the interest payment for a given period of an annuity based on periodic, fixed payments and a fixed interest rate.

Syntax

<Numeric Expression> IPmt(<Numeric Expression>, <Numeric Expression>, <Numeric Expression>, <Numeric Expression>, <Numeric Expression>, <Logical Expression>)
IPmt Returns a Double specifying the interest payment for a given period of an annuity based on periodic, fixed payments and a fixed interest rate.

Syntax

<Numeric Expression> IPmt(<Numeric Expression>, <Numeric Expression>, <Numeric Expression>, <Numeric Expression>, <Numeric Expression>)
IPmt Returns a Double specifying the interest payment for a given period of an annuity based on periodic, fixed payments and a fixed interest rate.

Syntax

<Numeric Expression> IPmt(<Numeric Expression>, <Numeric Expression>, <Numeric Expression>, <Numeric Expression>)
IRR Returns a Double specifying the internal rate of return for a series of periodic cash flows (payments and receipts).

Syntax

<Numeric Expression> IRR(<Array>, <Numeric Expression>)
IRR Returns a Double specifying the internal rate of return for a series of periodic cash flows (payments and receipts).

Syntax

<Numeric Expression> IRR(<Array>)
IS Returns whether two objects are the same

Syntax

<Member> IS <Member>
<Level> IS <Level>
<Hierarchy> IS <Hierarchy>
<Dimension> IS <Dimension>
<Tuple> IS <Tuple>
IS EMPTY Determines if an expression evaluates to the empty cell value.

Syntax

<Member> IS EMPTY
<Tuple> IS EMPTY
IS NULL Returns whether an object is null

Syntax

<Member> IS NULL
<Level> IS NULL
<Hierarchy> IS NULL
<Dimension> IS NULL
InStr Returns the position of the first occurrence of one string within another. Implements very basic form of InStr

Syntax

<Numeric Expression> InStr(<String>, <String>)
InStrRev Returns the position of an occurrence of one string within another, from the end of string.

Syntax

<Integer> InStrRev(<String>, <String>, <Integer>, <Integer>)
InStrRev Returns the position of an occurrence of one string within another, from the end of string.

Syntax

<Integer> InStrRev(<String>, <String>, <Integer>)
InStrRev Returns the position of an occurrence of one string within another, from the end of string.

Syntax

<Integer> InStrRev(<String>, <String>)
Int Returns the integer portion of a number. If negative, returns the negative number less than or equal to the number.

Syntax

<Integer> Int(<Value>)
Intersect Returns the intersection of two input sets, optionally retaining duplicates.

Syntax

<Set> Intersect(<Set>, <Set>, <Symbol>)
<Set> Intersect(<Set>, <Set>)
IsDate Returns a Boolean value indicating whether an expression can be converted to a date..

Syntax

<Logical Expression> IsDate(<Value>)
IsEmpty Determines if an expression evaluates to the empty cell value.

Syntax

<Logical Expression> IsEmpty(<String>)
<Logical Expression> IsEmpty(<Numeric Expression>)
Item Returns a member from the tuple specified in <Tuple>. The member to be returned is specified by the zero-based position of the member in the set in <Index>.

Syntax

<Member> <Tuple>.Item(<Numeric Expression>)
Item Returns a tuple from the set specified in <Set>. The tuple to be returned is specified by the zero-based position of the tuple in the set in <Index>.

Syntax

<Member> <Set>.Item(<Numeric Expression>)
Item Returns a tuple from the set specified in <Set>. The tuple to be returned is specified by the member name (or names) in <String>.

Syntax

<Set>.Item(<String> [, ...])
LCase Returns a String that has been converted to lowercase.

Syntax

<String> LCase(<String>)
LTrim Returns a Variant (String) containing a copy of a specified string without leading spaces.

Syntax

<String> LTrim(<String>)
Lag Returns a member further along the specified member's dimension.

Syntax

<Member> <Member>.Lag(<Numeric Expression>)
LastChild Returns the last child of a member.

Syntax

<Member>.LastChild
LastPeriods Returns a set of members prior to and including a specified member.

Syntax

<Set> LastPeriods(<Numeric Expression>)
<Set> LastPeriods(<Numeric Expression>, <Member>)
LastSibling Returns the last child of the parent of a member.

Syntax

<Member>.LastSibling
Lead Returns a member further along the specified member's dimension.

Syntax

<Member> <Member>.Lead(<Numeric Expression>)
Left Returns a specified number of characters from the left side of a string.

Syntax

<String> Left(<String>, <Integer>)
Len Returns the number of characters in a string

Syntax

<Numeric Expression> Len(<String>)
Level Returns a member's level.

Syntax

<Member>.Level
Levels Returns the level whose position in a hierarchy is specified by a numeric expression.

Syntax

<Level> <Hierarchy>.Levels(<Numeric Expression>)
Levels Returns the level whose name is specified by a string expression.

Syntax

<Level> <Hierarchy>.Levels(<String>)
Levels Returns the level whose name is specified by a string expression.

Syntax

<Level> Levels(<String>)
LinRegIntercept Calculates the linear regression of a set and returns the value of b in the regression line y = ax + b.

Syntax

<Numeric Expression> LinRegIntercept(<Set>, <Numeric Expression>)
<Numeric Expression> LinRegIntercept(<Set>, <Numeric Expression>, <Numeric Expression>)
LinRegPoint Calculates the linear regression of a set and returns the value of y in the regression line y = ax + b.

Syntax

<Numeric Expression> LinRegPoint(<Numeric Expression>, <Set>, <Numeric Expression>)
<Numeric Expression> LinRegPoint(<Numeric Expression>, <Set>, <Numeric Expression>, <Numeric Expression>)
LinRegR2 Calculates the linear regression of a set and returns R2 (the coefficient of determination).

Syntax

<Numeric Expression> LinRegR2(<Set>, <Numeric Expression>)
<Numeric Expression> LinRegR2(<Set>, <Numeric Expression>, <Numeric Expression>)
LinRegSlope Calculates the linear regression of a set and returns the value of a in the regression line y = ax + b.

Syntax

<Numeric Expression> LinRegSlope(<Set>, <Numeric Expression>)
<Numeric Expression> LinRegSlope(<Set>, <Numeric Expression>, <Numeric Expression>)
LinRegVariance Calculates the linear regression of a set and returns the variance associated with the regression line y = ax + b.

Syntax

<Numeric Expression> LinRegVariance(<Set>, <Numeric Expression>)
<Numeric Expression> LinRegVariance(<Set>, <Numeric Expression>, <Numeric Expression>)
Log Returns a Double specifying the natural logarithm of a number.

Syntax

<Numeric Expression> Log(<Numeric Expression>)
Log10 Returns the base-10 logarithm of a number.

Syntax

<Numeric Expression> Log10(<Numeric Expression>)
MIRR Returns a Double specifying the modified internal rate of return for a series of periodic cash flows (payments and receipts).

Syntax

<Numeric Expression> MIRR(<Array>, <Numeric Expression>, <Numeric Expression>)
Max Returns the maximum value of a numeric expression evaluated over a set.

Syntax

<Numeric Expression> Max(<Set>)
<Numeric Expression> Max(<Set>, <Numeric Expression>)
Median Returns the median value of a numeric expression evaluated over a set.

Syntax

<Numeric Expression> Median(<Set>)
<Numeric Expression> Median(<Set>, <Numeric Expression>)
Members Returns the set of members in a dimension.

Syntax

<Dimension>.Members
Members Returns the set of members in a hierarchy.

Syntax

<Hierarchy>.Members
Members Returns the set of members in a level.

Syntax

<Level>.Members
Members Returns the member whose name is specified by a string expression.

Syntax

<Member> Members(<String>)
Mid Returns a specified number of characters from a string.

Syntax

<String> Mid(<String>, <Integer>, <Integer>)
Mid Returns a specified number of characters from a string.

Syntax

<String> Mid(<String>, <Integer>)
Min Returns the minimum value of a numeric expression evaluated over a set.

Syntax

<Numeric Expression> Min(<Set>)
<Numeric Expression> Min(<Set>, <Numeric Expression>)
Minute Returns a Variant (Integer) specifying a whole number between 0 and 59, inclusive, representing the minute of the hour.

Syntax

<Integer> Minute(<DateTime>)
Month Returns a Variant (Integer) specifying a whole number between 1 and 12, inclusive, representing the month of the year.

Syntax

<Integer> Month(<DateTime>)
MonthName Returns a string indicating the specified month.

Syntax

<String> MonthName(<Integer>, <Logical Expression>)
Mtd A shortcut function for the PeriodsToDate function that specifies the level to be Month.

Syntax

<Set> Mtd()
<Set> Mtd(<Member>)
NOT Returns the negation of a condition.

Syntax

NOT <Logical Expression>
NPV Returns a Double specifying the net present value of an investment based on a series of periodic cash flows (payments and receipts) and a discount rate.

Syntax

<Numeric Expression> NPV(<Numeric Expression>, <Array>)
NPer Returns a Double specifying the number of periods for an annuity based on periodic, fixed payments and a fixed interest rate.

Syntax

<Numeric Expression> NPer(<Numeric Expression>, <Numeric Expression>, <Numeric Expression>, <Numeric Expression>, <Logical Expression>)
Name Returns the name of a dimension.

Syntax

<Dimension>.Name
Name Returns the name of a hierarchy.

Syntax

<Hierarchy>.Name
Name Returns the name of a level.

Syntax

<Level>.Name
Name Returns the name of a member.

Syntax

<Member>.Name
NextMember Returns the next member in the level that contains a specified member.

Syntax

<Member>.NextMember
NonEmptyCrossJoin Returns the cross product of two sets, excluding empty tuples and tuples without associated fact table data.

Syntax

<Set> NonEmptyCrossJoin(<Set>, <Set>)
Now Returns a Variant (Date) specifying the current date and time according your computer's system date and time.

Syntax

<DateTime> Now()
OR Returns the disjunction of two conditions.

Syntax

<Logical Expression> OR <Logical Expression>
Oct Returns a Variant (String) representing the octal value of a number.

Syntax

<String> Oct(<Value>)
OpeningPeriod Returns the first descendant of a member at a level.

Syntax

<Member> OpeningPeriod()
<Member> OpeningPeriod(<Level>)
<Member> OpeningPeriod(<Level>, <Member>)
Order Arranges members of a set, optionally preserving or breaking the hierarchy.

Syntax

<Set> Order(<Set>, <Value>, <Symbol>)
<Set> Order(<Set>, <Value>)
Ordinal Returns the zero-based ordinal value associated with a level.

Syntax

<Level>.Ordinal
PPmt Returns a Double specifying the principal payment for a given period of an annuity based on periodic, fixed payments and a fixed interest rate.

Syntax

<Numeric Expression> PPmt(<Numeric Expression>, <Numeric Expression>, <Numeric Expression>, <Numeric Expression>, <Numeric Expression>, <Logical Expression>)
PPmt Returns a Double specifying the principal payment for a given period of an annuity based on periodic, fixed payments and a fixed interest rate.

Syntax

<Numeric Expression> PPmt(<Numeric Expression>, <Numeric Expression>, <Numeric Expression>, <Numeric Expression>, <Numeric Expression>)
PPmt Returns a Double specifying the principal payment for a given period of an annuity based on periodic, fixed payments and a fixed interest rate.

Syntax

<Numeric Expression> PPmt(<Numeric Expression>, <Numeric Expression>, <Numeric Expression>, <Numeric Expression>)
PV Returns a Double specifying the present value of an annuity based on periodic, fixed payments to be paid in the future and a fixed interest rate.

Syntax

<Numeric Expression> PV(<Numeric Expression>, <Numeric Expression>, <Numeric Expression>, <Numeric Expression>, <Logical Expression>)
ParallelPeriod Returns a member from a prior period in the same relative position as a specified member.

Syntax

<Member> ParallelPeriod()
<Member> ParallelPeriod(<Level>)
<Member> ParallelPeriod(<Level>, <Numeric Expression>)
<Member> ParallelPeriod(<Level>, <Numeric Expression>, <Member>)
ParamRef Returns the current value of this parameter. If it is null, returns the default value.

Syntax

<Value> ParamRef(<String>)
Parameter Returns default value of parameter.

Syntax

<String> Parameter(<String>, <Symbol>, <String>, <String>)
<String> Parameter(<String>, <Symbol>, <String>)
<Numeric Expression> Parameter(<String>, <Symbol>, <Numeric Expression>, <String>)
<Numeric Expression> Parameter(<String>, <Symbol>, <Numeric Expression>)
<Member> Parameter(<String>, <Hierarchy>, <Member>, <String>)
<Member> Parameter(<String>, <Hierarchy>, <Member>)
Parent Returns the parent of a member.

Syntax

<Member>.Parent
Percentile Returns the value of the tuple that is at a given percentile of a set.

Syntax

<Numeric Expression> Percentile(<Set>, <Numeric Expression>, <Numeric Expression>)
PeriodsToDate Returns a set of periods (members) from a specified level starting with the first period and ending with a specified member.

Syntax

<Set> PeriodsToDate()
<Set> PeriodsToDate(<Level>)
<Set> PeriodsToDate(<Level>, <Member>)
Pi Returns the number 3.14159265358979, the mathematical constant pi, accurate to 15 digits.

Syntax

<Numeric Expression> Pi()
Pmt Returns a Double specifying the payment for an annuity based on periodic, fixed payments and a fixed interest rate.

Syntax

<Numeric Expression> Pmt(<Numeric Expression>, <Numeric Expression>, <Numeric Expression>, <Numeric Expression>, <Logical Expression>)
Power Returns the result of a number raised to a power.

Syntax

<Numeric Expression> Power(<Numeric Expression>, <Numeric Expression>)
PrevMember Returns the previous member in the level that contains a specified member.

Syntax

<Member>.PrevMember
Properties Returns the value of a member property.

Syntax

<Member>.Properties(<String Expression>)
Qtd A shortcut function for the PeriodsToDate function that specifies the level to be Quarter.

Syntax

<Set> Qtd()
<Set> Qtd(<Member>)
RTrim Returns a Variant (String) containing a copy of a specified string without trailing spaces.

Syntax

<String> RTrim(<String>)
Radians Converts degrees to radians.

Syntax

<Numeric Expression> Radians(<Numeric Expression>)
Rank Returns the one-based rank of a tuple in a set.

Syntax

<Integer> Rank(<Tuple>, <Set>)
<Integer> Rank(<Tuple>, <Set>, <Numeric Expression>)
<Integer> Rank(<Member>, <Set>)
<Integer> Rank(<Member>, <Set>, <Numeric Expression>)
Rate Returns a Double specifying the interest rate per period for an annuity.

Syntax

<Numeric Expression> Rate(<Numeric Expression>, <Numeric Expression>, <Numeric Expression>, <Numeric Expression>, <Logical Expression>, <Numeric Expression>)
Rate Returns a Double specifying the interest rate per period for an annuity.

Syntax

<Numeric Expression> Rate(<Numeric Expression>, <Numeric Expression>, <Numeric Expression>, <Numeric Expression>, <Logical Expression>)
Rate Returns a Double specifying the interest rate per period for an annuity.

Syntax

<Numeric Expression> Rate(<Numeric Expression>, <Numeric Expression>, <Numeric Expression>, <Numeric Expression>)
Rate Returns a Double specifying the interest rate per period for an annuity.

Syntax

<Numeric Expression> Rate(<Numeric Expression>, <Numeric Expression>, <Numeric Expression>)
Replace Returns a string in which a specified substring has been replaced with another substring a specified number of times.

Syntax

<String> Replace(<String>, <String>, <String>, <Integer>, <Integer>, <Integer>)
Replace Returns a string in which a specified substring has been replaced with another substring a specified number of times.

Syntax

<String> Replace(<String>, <String>, <String>, <Integer>, <Integer>)
Replace Returns a string in which a specified substring has been replaced with another substring a specified number of times.

Syntax

<String> Replace(<String>, <String>, <String>, <Integer>)
Replace

Syntax

<String> Replace(<String>, <String>, <String>)
Right Returns a Variant (String) containing a specified number of characters from the right side of a string.

Syntax

<String> Right(<String>, <Integer>)
Round Returns a number rounded to a specified number of decimal places.

Syntax

<Numeric Expression> Round(<Numeric Expression>, <Integer>)
Round Returns a number rounded to a specified number of decimal places.

Syntax

<Numeric Expression> Round(<Numeric Expression>)
SLN Returns a Double specifying the straight-line depreciation of an asset for a single period.

Syntax

<Numeric Expression> SLN(<Numeric Expression>, <Numeric Expression>, <Numeric Expression>)
SYD Returns a Double specifying the sum-of-years' digits depreciation of an asset for a specified period.

Syntax

<Numeric Expression> SYD(<Numeric Expression>, <Numeric Expression>, <Numeric Expression>, <Numeric Expression>)
Second Returns a Variant (Integer) specifying a whole number between 0 and 59, inclusive, representing the second of the minute.

Syntax

<Integer> Second(<DateTime>)
SetToStr Constructs a string from a set.

Syntax

<String> SetToStr(<Set>)
Sgn Returns a Variant (Integer) indicating the sign of a number.

Syntax

<Integer> Sgn(<Numeric Expression>)
Siblings Returns the siblings of a specified member, including the member itself.

Syntax

<Member>.Siblings
Sin Returns a Double specifying the sine of an angle.

Syntax

<Numeric Expression> Sin(<Numeric Expression>)
Sinh Returns the hyperbolic sine of a number.

Syntax

<Numeric Expression> Sinh(<Numeric Expression>)
Space Returns a Variant (String) consisting of the specified number of spaces.

Syntax

<String> Space(<Integer>)
Sqr Returns a Double specifying the square root of a number.

Syntax

<Numeric Expression> Sqr(<Numeric Expression>)
SqrtPi Returns the square root of (number * pi).

Syntax

<Numeric Expression> SqrtPi(<Numeric Expression>)
Stddev Alias for Stdev.

Syntax

<Numeric Expression> Stddev(<Set>)
<Numeric Expression> Stddev(<Set>, <Numeric Expression>)
StddevP Alias for StdevP.

Syntax

<Numeric Expression> StddevP(<Set>)
<Numeric Expression> StddevP(<Set>, <Numeric Expression>)
Stdev Returns the standard deviation of a numeric expression evaluated over a set (unbiased).

Syntax

<Numeric Expression> Stdev(<Set>)
<Numeric Expression> Stdev(<Set>, <Numeric Expression>)
StdevP Returns the standard deviation of a numeric expression evaluated over a set (biased).

Syntax

<Numeric Expression> StdevP(<Set>)
<Numeric Expression> StdevP(<Set>, <Numeric Expression>)
Str Returns a Variant (String) representation of a number.

Syntax

<String> Str(<Value>)
StrComp Returns a Variant (Integer) indicating the result of a string comparison.

Syntax

<Integer> StrComp(<String>, <String>, <Integer>)
StrComp Returns a Variant (Integer) indicating the result of a string comparison.

Syntax

<Integer> StrComp(<String>, <String>)
StrReverse Returns a string in which the character order of a specified string is reversed.

Syntax

<String> StrReverse(<String>)
StrToMember Returns a member from a unique name String in MDX format.

Syntax

<Member> StrToMember(<String>)
StrToSet Constructs a set from a string expression.

Syntax

<Set> StrToSet(<String>[, <Dimension>...])
StrToTuple Constructs a tuple from a string.

Syntax

<Tuple> StrToTuple(<String>)
String

Syntax

<String> String(<Integer>, <Integer>)
StripCalculatedMembers Removes calculated members from a set.

Syntax

<Set> StripCalculatedMembers(<Set>)
Subset Returns a subset of elements from a set.

Syntax

<Set> Subset(<Set>, <Numeric Expression>)
<Set> Subset(<Set>, <Numeric Expression>, <Numeric Expression>)
Sum Returns the sum of a numeric expression evaluated over a set.

Syntax

<Numeric Expression> Sum(<Set>)
<Numeric Expression> Sum(<Set>, <Numeric Expression>)
Tail Returns a subset from the end of a set.

Syntax

<Set> Tail(<Set>)
<Set> Tail(<Set>, <Numeric Expression>)
Tan Returns a Double specifying the tangent of an angle.

Syntax

<Numeric Expression> Tan(<Numeric Expression>)
Tanh Returns the hyperbolic tangent of a number.

Syntax

<Numeric Expression> Tanh(<Numeric Expression>)
ThirdQ Returns the 3rd quartile value of a numeric expression evaluated over a set.

Syntax

<Numeric Expression> ThirdQ(<Set>)
<Numeric Expression> ThirdQ(<Set>, <Numeric Expression>)
Time Returns a Variant (Date) indicating the current system time.

Syntax

<DateTime> Time()
TimeSerial Returns a Variant (Date) containing the time for a specific hour, minute, and second.

Syntax

<DateTime> TimeSerial(<Integer>, <Integer>, <Integer>)
TimeValue Returns a Variant (Date) containing the time.

Syntax

<DateTime> TimeValue(<DateTime>)
Timer Returns a Single representing the number of seconds elapsed since midnight.

Syntax

<Numeric Expression> Timer()
ToggleDrillState Toggles the drill state of members. This function is a combination of DrillupMember and DrilldownMember.

Syntax

<Set> ToggleDrillState(<Set>, <Set>)
<Set> ToggleDrillState(<Set>, <Set>, <Symbol>)
TopCount Returns a specified number of items from the top of a set, optionally ordering the set first.

Syntax

<Set> TopCount(<Set>, <Numeric Expression>, <Numeric Expression>)
<Set> TopCount(<Set>, <Numeric Expression>)
TopPercent Sorts a set and returns the top N elements whose cumulative total is at least a specified percentage.

Syntax

<Set> TopPercent(<Set>, <Numeric Expression>, <Numeric Expression>)
TopSum Sorts a set and returns the top N elements whose cumulative total is at least a specified value.

Syntax

<Set> TopSum(<Set>, <Numeric Expression>, <Numeric Expression>)
Trim Returns a Variant (String) containing a copy of a specified string without leading and trailing spaces.

Syntax

<String> Trim(<String>)
TupleToStr Constructs a string from a tuple.

Syntax

<String> TupleToStr(<Tuple>)
TypeName Returns a String that provides information about a variable.

Syntax

<String> TypeName(<Value>)
UCase Returns a string that has been converted to uppercase

Syntax

<String> UCase(<String>)
Union Returns the union of two sets, optionally retaining duplicates.

Syntax

<Set> Union(<Set>, <Set>)
<Set> Union(<Set>, <Set>, <Symbol>)
UniqueName Returns the unique name of a dimension.

Syntax

<Dimension>.UniqueName
UniqueName Returns the unique name of a hierarchy.

Syntax

<Hierarchy>.UniqueName
UniqueName Returns the unique name of a level.

Syntax

<Level>.UniqueName
UniqueName Returns the unique name of a member.

Syntax

<Member>.UniqueName
Unorder Removes any enforced ordering from a specified set.

Syntax

<Set> Unorder(<Set>)
Val Returns the numbers contained in a string as a numeric value of appropriate type.

Syntax

<Numeric Expression> Val(<String>)
ValidMeasure Returns a valid measure in a virtual cube by forcing inapplicable dimensions to their top level.

Syntax

<Numeric Expression> ValidMeasure(<Tuple>)
Value Returns the value of a measure.

Syntax

<Member>.Value
Var Returns the variance of a numeric expression evaluated over a set (unbiased).

Syntax

<Numeric Expression> Var(<Set>)
<Numeric Expression> Var(<Set>, <Numeric Expression>)
VarP Returns the variance of a numeric expression evaluated over a set (biased).

Syntax

<Numeric Expression> VarP(<Set>)
<Numeric Expression> VarP(<Set>, <Numeric Expression>)
Variance Alias for Var.

Syntax

<Numeric Expression> Variance(<Set>)
<Numeric Expression> Variance(<Set>, <Numeric Expression>)
VarianceP Alias for VarP.

Syntax

<Numeric Expression> VarianceP(<Set>)
<Numeric Expression> VarianceP(<Set>, <Numeric Expression>)
VisualTotals Dynamically totals child members specified in a set using a pattern for the total label in the result set.

Syntax

<Set> VisualTotals(<Set>)
<Set> VisualTotals(<Set>, <String>)
Weekday Returns a Variant (Integer) containing a whole number representing the day of the week.

Syntax

<Integer> Weekday(<DateTime>, <Integer>)
Weekday Returns a Variant (Integer) containing a whole number representing the day of the week.

Syntax

<Integer> Weekday(<DateTime>)
WeekdayName Returns a string indicating the specified day of the week.

Syntax

<String> WeekdayName(<Integer>, <Logical Expression>, <Integer>)
Wtd A shortcut function for the PeriodsToDate function that specifies the level to be Week.

Syntax

<Set> Wtd()
<Set> Wtd(<Member>)
XOR Returns whether two conditions are mutually exclusive.

Syntax

<Logical Expression> XOR <Logical Expression>
Year Returns a Variant (Integer) containing a whole number representing the year.

Syntax

<Integer> Year(<DateTime>)
Ytd A shortcut function for the PeriodsToDate function that specifies the level to be Year.

Syntax

<Set> Ytd()
<Set> Ytd(<Member>)
_CaseMatch Evaluates various expressions, and returns the corresponding expression for the first which matches a particular value.

Syntax

Case <Expression> When <Expression> Then <Expression> [...] [Else <Expression>] End
_CaseTest Evaluates various conditions, and returns the corresponding expression for the first which evaluates to true.

Syntax

Case When <Logical Expression> Then <Expression> [...] [Else <Expression>] End
{} Brace operator constructs a set.

Syntax

{<Member> [, <Member>...]}
|| Concatenates two strings.

Syntax

<String> || <String>


Author: Julian Hyde; last modified May 2011.
Version: $Id$ (log)
Copyright (C) 2005-2011 Pentaho


mondrian-3.11.0.1-R/doc/mondrian_technical_guide.pdf000066400000000000000000024005751261646570300222260ustar00rootroot00000000000000%PDF-1.4 %쏢 5 0 obj <> stream xTɊAuu\ f֡Œ5EیaʒQ.#cy<7Xs~?󮐯i]wcK6JsZ\{Qg|!YgN\&^|,kP*\66Sp ֱvcK&D9?տoBe\!z Pd%ɬ^!fDQҲec*۽=U{ R },-E 7LbjFޞb^}Cgslr[R;>&R`VF=#eإ>L*\aA@HAiT3)HRx&%!X%"F4 )s%1y(PRupB!C.Rv8M-e$Z M]78yVUjYV.i;9⸃B,u|Qx_WBu.toj9x> stream xۯKٳidm&M$fx@Qo---P CYFuD_D&-KX~pӆ7m?xG7To?n#No^,5sa ~۾{;N u#L=#BY-8і΋_6L*:Y_KIPMnlnnOp|ܟ*WpQ*{hY8+Lj}kG9`r,z?TI}{1Ch/RH~GrZ}kJ~/wa L‰ΰP}d ; }꥿wL:?K7{ GH5ŷ~_OǬnZ '0\ pT.i1Wo' 酑C\}GG EÏNfl,3Lm<|LW᳠#*`YP?x2mDdKq+xr ?EGdF!` sYٺ&;TڀvGfKA41 $&#/ T+';Jx@|A9ş{~x:~ #7xQ*=(`t2@}ϰ"$EYz4n !9Ǚ_&55O;oƏC ƌGgf8&En H0ޫn Ѧw 1C=ZX{`隚ײo6_ y>t$8 m,Ry`0G<<x$"|4/S7B,O&@z$ÈF.0+rcݺ_$Q{ݘNszj_9$C,X4$ ]i^Fy<էvcN7E" ]\ ځIRm4۵gͅmFjr`=P{%\f,0}W ,ђ/'iImJZAF*;aZH6~TqRgGtxxA)>W Uu 0?n5e-s]ƏLL6((ʰBE"$@z]9?wvUإID!11yMi3v{[Hɨ"\dl,}*[ʖq>/ۆ;zsc:܆Ujvy ",(5K`yU4m$.`F_6p˴e:~2gzNӌsYY:LҎF !-ȽG40mGU'yJ=Lۋ59ӣ3*fD> t6UBqez ;}44s:g/N@ʅ^]sUfՁ62fIw Q ~uv__c@aw>͒!|- (.⪝EK-p@඙5(vhIG(n^e<*6,q-xߨO@$Q&Qqi;W8Tަh8ThJV:SVLHX.H՚/~7Y+Ql9.nħr8=E?ՄɖI4 pLib8;qLV-n@P!eOÛk`?:0uW,Ӯj'Xk9 v-H?'MyĥQ%? P#Mn,i ||gKi[E˧z%)oyVgK`䝒'n;+QA8H՘3FPDfCe6 aRIcB{w)62:xM\#q0?Zb) |BHܑ/oϼ.YV=- PνR ȗ%1b^ )_8+F= {\ǀTKAmq;MzSbk5p9sqb7\' }Rթl,]Y>P}<бݠZ鲊p*tsaR0zMTA`z {x_c z{GjVɤm=C^dž9JBcҲV Rm.0'( T^ԬB0䅋| Wչ|ܨ#6Xd<Z>LМLPfLMqԾ,z5w $5:DQh~LOpJ95 ag?U5Ƚ?/t/G 2tgZnaCco3h94۾=oU#>Jd>9)Xl0G ɞE(¤I7\YRO-jX3g .ċʞg HÂE4g%e-(s=X#"0i80}\KMdovk[AD)gfNZ1"%`ȧ9I\"䈴Lnb82]Sd-qs a*nGLXE-c}w~`.| <,Y^y2Sq=SphMfS>^ JD. x|PLr"R! _(ǷD3YdTn8쨂D5^)VHyg覸 oT5٤ ڰ&w}qscٮ=!]fgiE2|dA|dzP@ T3*y@q!s@Q')*GYHM PPgPJ>]*wBZ};n98V_!R>Py(DOc<Iy@h ~z냥劻I̊7Jf0;`[9.Yj-ВSZ6W"X$8cZcJ&,c/z`ךvV͏=s8>גn0xAYSsp!LЀtRFL$h&%WP.yͤx 0ެ4qpZ7oQI"[*ם,N <֏ޭ/ݽrb閎"p{?URRռp())r,}:ᯯO%endstream endobj 14 0 obj 4420 endobj 18 0 obj <> stream x6u-k [ tw- $~k$C*'٧͝N&Nf<[Wt,O{ˇ/6+G^%Yj6ѕG֏6/!T8?Y`F9tˈPV5p-Ö9hIaںo7 J&Oa6[MT߭>p4:}8f$z}kD)-ҏ:]<6fKZ?,bb9l5f# tiuL[H|wкo9S_m-Tg"XgkV]Cy@je%TV_y pp%߬%%'@$ 옔l0 'ogD\ _B+sF=<G\ުG\j.|GdEl ҹ`gc =BK$ΜwFp?b--9`Rz#y3NE0 ّkߍo% u '!ӿwGp1 -s.ܦgtZ\.Xa{T+'ۓRYؠt]MC TC<1I$ݔ A[}T;U,l%RBv_j:߷_iɘp7s y|?O~tede\+׶0D=[2FbC0+",$m'N}|4-c[qqO4wxiR7RPV_( 筞13 ~\տ}'.@Mktmgo*ж2+Tc/hU!#a4p|.½ɋy;WE៏pj+כ_q=Ut0e31?+Y14Ct"uڬū'/?(]wʾL[=^Uou ^}^D 1ʠޛ6o9v ?9,wOFzVL0Ҟ ~+Ѡm#S}t#i_WZGVx<Ҟʷ(ʷ/ԡ(Ѫ]f+3'e Rx9йI)a%s1 gZbԇ ZdB,h/78M'$(Qr vuN<_5"@SiYW'SOVA no|_ɨ0^Mi$/_0;oJw-ީޘQO i!s5AC4Fw@: |(cǃ5Xi!{gP4O"[Wᒎ^ ʭ_pIٞ3EߩO*z [E\6 ׁȶ[oKh21Ng Jk_I|{Q^9w>Ofu@o}t@{Ȼ!%^'߬`A'0x?\  ӱǫTr&Yv2h_;wSusU^<"^KuGF o}S`&#Jz;_ݩP(ݜK G<IJ YMMLQ+ê: CXlkn!'IgTk!-lgI{~d-Z׾BGe")}-aڇ-}4p|+3 R\@E]٣ppc2J3pI HTC&hdwݾz4 N}>jX`+[}cxj֦*F+J<-.U7KERb@?}X0@bbZo׎n[n҆M^ Z9z~7[K!V2fol қoTRDm$*kZK8lFbˤ\Ixmi 2ޫ`dqe5XI{(g.[7W˜gs[ZнEbM='\si AKcp~Dg2'?yWoi}z}h`е#ʲo2EE<Կ@\s9gO[%{')#?&`qm_km2,o6rNPpĀ|zO@\S ,;,&znm3H,\>#1a>Έf;*/9@tx`l|oIl. + ~ҳ Ҹ,xd!/5''.5)ܑùඒa~Z96B,&@ `K^HSS\o=eܒW:+ a%DӾ}cX4+ r tt8_ٺ7LLiô%g<{pD+iM\5=7+"QfwNcG5P79gB&נwnUZr;uG7bFYNnu.>$牚>HOFf0nk[bH6jwQYnaw}Иxxr1t'Q^ KOjQuB"sPA! :=ltݼDtufffq[/̢1ή>P\)OIZ3|)mzL Dxme;S%0{LR ܩxFHK{OQCT`FA%W͞x=-EfgT*8j׈i?,%d`<$d5հKhQͣPaTyyf(/r"k&- ;Bxqn|ֱEc o ˸ m3[C:&-[߃;$5̈c&~.KnM%l,}F4٨hPc07RJ$&-78*ϡ=9wN"3 *qw/iBO'F\H4 ҁ0jF`ubc6J=t6/K@Ub&<џ*0-Әt!qx'y|_JZ;?"[rDz݉8 ~1-RsX`yʨlTllTMۼdԨN:답;Teu 0IMK_ ;Ul}:,"݃x.B fÈ x*Sh $R[pӞȟ~endstream endobj 19 0 obj 3788 endobj 22 0 obj <> stream xY[o5UAdA` x[B7B/{{x?&)iT֮w<3syU ߸x|\>>^UӽMu< ˀ:Zyb Iujr&2*e#ೇt篛Tk0ٹ!k=b=@hZt^[8 ˴$AFk->ɞ$ ^ƽi_Psif6IJ|m\p!=bTznY u=…ޢRu 2 Fsaqcdp~yuZ*{519 WMk8,O1U@vyq0GBA@=o|dBӴ;=eUb6XKD 4p8>Sl 3r4,Ms"vR;Li79IW:^V*NxvZJn0TGp(G2xZf ]ML+jN~4 qK Z bILGplP:/ivд;%t삑{E+vH=&Ew aIRXO 6(#{oS=8o|8G,d9Z@m gw`QԘ{"d~+]js@aB̪MĻ}c51~s ]-m >yZ=&-qEM)Cx3)!BE(Y8!* ,"r G#JZ. ĉJBFz3R6QȈx Ș'F@JX< m=?l> stream x][qTL*۴y2(CYREPޘ%iUSSs9ՋW5m //wuY,iERvx3n/7LO)Zgfk[c֣Q_z vz6VEUw~9.gk}*[y)_ѫҖB4.0 EHӪȱ׭J- eCi+*" e/xK't*K|;ͺS˰*6>Kͮ+^eϩ/:JaUk [Os5t.35[5 s_XAFzbN_"};1(K[ho'85ez޸)=pNsh{4=6:ĺg2C Zzi^C|iy3/G;vˋ9^`B6ZcfXMfJ<қp4q1pn0k}z6VM o0s DfZd=F_]s#R -e-Die΢͆.bEgwd^#w/pFqF>ـGoFيp:`Spd5 ^iJzn<#aRG]H?ٌM -8;5{D/iVDFx/F 98.?c}C{~jpF}wںH gC~7$ XӪQc>1YAbBaK+'Fh!] 41{_>?ϭG; + ]8/=>oߒ4/,` 99l ҧ<.k)Aq8(^{3PL l?6u%;t4"|'' cZx^6' &<@4j4;QHW`Gq4̤*]1/S Ʀ}5qo 'ul_ <0-.ǝFEk`o{3 k(!` QМՁ [f!dq>r;"I9$spI]0 +Z܃qTbKG1&,H5]`z/v"ی4 ^(={C;+\cD.F"Qgw34qE(JȢk\3,͑iPmiI"$Ǖ1%CA04]6;vqy'c "m \Ji"L8Eo b{d֭0Bۘ}֭3(oi p i̜bj45`ڸ 7\#ErUd4Gt FtS[nilSh7 5<C\aE k|C22f*V#J =aS Sr a"}ir*;4ĩT0KDxcN HJXU1tuV"=,;f%Ṟ\ N <9F G %-#:ur:uC>$?p mP0g+nѥS9-NجDSTPz>gFwg39^W eTU9ݬ}9q^U^;`HAŠQapE[Di35DLV',"`JP\s6i r%.'TT8D%/1#NwSlwLjp?SS0_:t`Uf4#)hO!&b8k^X9z9P`Q&v?=W.ƞOj*uxtwsv͉T3o RFT9ZC7,5ڧD JK`.X>qk2M-7yŰ?t.a*}ңװK+8$#8n o0лZ'eAvy |i~n Ɠ6\`SQŬ~="@-vd~j޹FNqY;B$,]pɐyPvgk}, 0 X YzqD5K 4`!m2+JWϮn#"T/4Y1h"Ӕ uW*e ~j z6*}k~ܪߟ=?ɶ+z4/y +dHƔ1Uj{vB :H751{I?pL![8H[rc(^/OT 3Rд+yd}UYZ8Z8B㭸&|AP y(.gFi Z#YoAG,X1Ñ[4U vl8VчD57}:wv@>H>dy"gn.ZLnJ9bZy&]̘ $~KZ=t.zU_J ӴX9],$*˟?%vfKGC ?n7g[e3@ۄ0ɭ^?Xg|+XfVA#6J\0Mf/8_Z*O_ZhW R3'|] *x\Oq)88gqC =+3]W4D/^9BK@Dap6K!fUWtC=ᐦrKD+G M`եڀa(AաGMoQP'$JF+gEsF nRO|x+,֏'hh\e`M0:YЇjяS$M JD/Vj~f9=W1,E+7V}o\ a9~Z7=LӍSsD۱s>լ-;J\^>>x%jeV'c.vu342k%ULfe5U6] D8ڲk/MWy vtӝT%VWL lԴ F.r3?~㡇7L7%|КH=2Yɥȋ2ʫAXn'}LX <3ձee}/[ dn."EU}cM } mp`c8r]!v|xSu=6R!gg0+,:SLfql:OAd WjB>R]/y g$;dٻ@bS# L3hP̱ ɗ×&OS{D=I*=Ғ};#tM4uS45̹퉰3̞>a264 8`>?5I)c% )r-[ Aʇ  Іg0مYQoƷ(f5hLޭyb9!XhS`.CGs5 .|d0x|Ih`\!0I =jʠc"1WxFi@3*{YpgT]d~e`ZS`jĎ6f?cp,9tiNa-L֞CB8"/7,אm˲9r[H'9,u" halm|-Ljk c9kd+a~ 2rr ʹʣ٧eܾ?FۺJnķX+;Z9J;:j:8Rg z<{ꥀ>[">IK|hҤi]ŜcWb[{V}Cǂ;۔38dA=3 ;Pم^U9wpȐ#G-@U ،aN7ryuպ+“p!d\RRL\230{5ijbm!EI} ϸ b TCrdz+h}mQ &&A?Oe/v!뫇>.5AӔI=cVƀ s[bWecaasl{t-PUfw,_ ,Pj~$}S3UEvZSH`G* . *~d1@_]|}1ӑo>Y>S 5uLLg6!UN!֕ٿm¯4[FSb"H|ecTbY+|G#Kh­&Qi2%4*ACX89sfpS.nz59NM]'.f9rANe[UfYkHvB8R+ [eR+y(tZVy;WMPڔwiBh!3KSoڟZ^Ō}p7&.q7Akm&ݠfDSI9:&Zh@g [%fFC3~h2\}7Ǫbk+>.J"fn#z_[70||7rAV-,YLX' 4)[_.Ƙ` xqtCCA M֫V/C^t* mDsTL%.KY*C% BkA ]9za -mcP]<^6k`mGj!̜Dw~VNP5RBWNU#Q54/)P|;NfnNN{-em&բ 'ؿ2oC+/AE^~Px^!U1~xh XǸbO:=_dVp:AH#[͑BtƉj,V4 s7e_ mC̭'"HdV ' ܹTK^ U[}|->v#Dv|..ZȤG(DquM+Sm6VES'hkmhuO~ߤꋦ e7Omơ`лV{)̧hSd{ܕ4~3o iQ"?YTqcd`؀ײ3 X"$ .;Q&Fܿg*6b3sA'ry 67񻠴VI)&L[Ant lbz.YQ;? dP uE/F]`(mk'2*Og0Gn@Όo%65s'k2W sƄߙ9Nl= l}&eJ԰  F2od(;b(jH 6mT@gH8 -2G66ԸƮ`qT;IQHeAw$(n)rHt Y-UHvDHgM'?L!q{z(ֆfWŀJIy龕gǝ RۋLt /B:n0@ꐇlT#Vï^be[7S~蕛 :lh}_mU&7k6] mJϼVBv;zk 7tyv7\\6t#YμE*wy/ws9g.ݪH^ca[|Hkt&քS.7cB8+T1`̜׍=шsJLNz̜ 7q;7Ua;op3+olc6q.dk4t@ 2hW,3yMh.DGJ&C /E &8y7z3F 871dnZQ_YF]dz/<iXztCnA<֒ռR/菜.AB`]rC }nvP4]\_Az٫b!kyƝ){N%YvN]kCEΘ/C 0LM%ʒg4Ȏ5\-۲Qn%W@as&LXٱJd?M?6T"}gyZܢ\VM1v~7oōx 󆼭$#m A_fJ"H^”*WKS{%GXL{Loͷl8iׯjz.ښJA?(J2 #b~a"#9rPE ֽ֪\6ٖ. ua8YA %4&ي8X^=bÆphaF'2A{+$nIxg+\i1әd ]5`gأ~_ٰyB22g~FhkL%}zOe6 c-tLǼ+xwPdnPvmVu&uu xU*0y9X ILlXj  ٖ2{$=I&ѻKfZs35?xP4PclSQ0ze;Hq[!VaBE4sPe2JQ _,я;) [B :ݔ8_ zm8a;` JbvnR/ƝsL/7t4endstream endobj 33 0 obj 5543 endobj 36 0 obj <> stream x][sG:ɒkKL9JA"iI1Eʶ~0IR\piWڕq=ޝt23?~v_X쇓ǡ6Xꡨ'?*G}ϧQ=TE]}{UtC5;okպnٮWmޗݮ+ӛA/;uіeӝ^A4:a/e5(ql#:=c<z UWxQ7ҨN3+54%;[_mk3jMc߻.9z,~ܵ>?JyhZx_Uikyݵ ne6LyM]1ۗ|/ RL3Xbcɺbo]Pp!o߻'AëM(2ՠJjƾv#a ?~ZLԿ\Ӫ-^ۏE?4MR!6g6I/vmۜ e0YBt`ס-cm-M5;fI0t {Flop@,C"h1Ҫlj7rEܑ56eeK:'/D )tT ;$Y1qrqP~H2g8 9)O젦}˱2o#2ܡdtaN\'tuf_ĆZi c[.+$tx<={c?k%QF874LKZ⥐r gt][͌k5`2e2g:Zbы)1ڟ -4Z5`W1Q죻T}[Oy5="4b-WbIŞJ0ϑXHJ ɕ? i #VpLGu/v4È*ŏpb}g,3QLգ'btjr4EϣNK"v\Y)~Dt6^$j`L $^il,Aht]ci,>Hi&o03v}K|B=5.bJJ;xZ&4~hGt9g')4%715Gj Iv%d0b֜vK8AU7P,^ˋc,$ ×<.`]d=~^QR"6LX) j9>ʏseF-z/`'mmǛ 爄^$IwĈ7i :w{~8b@jZ*kK,H"̬*T%eP8}, BwΡ#h˨+P ^QvCzIb:zߝCC(;M ep`3d6d|KyHu&ļ#!|4zKzje1GB DsBxڐq{M&,}v#E ʼn0o'J rbTNa%H2I O$;~ X89Q:~"JdHPk`m618az}xSLJi\ ekkϸ5 9pVSvm3ɑ 仭ˢ_.|Х9X/"46h #{ ~d~M6rujń& ϯy^܂ J,f̽-eu0,x4u/]Bʘѱi;ݧ9z>FQxp H"M\ nFLB1{ R$$v9I=H&ޡ׃w }Gt |_j0 > a {ƒ)"]D6@A-},%tb'˻#|AzJD(Nڱ/B`W3nR+|awk0'up)Kh xi ^zR&Ix4~3dPv<)d.ا.BQTsi7,e,XC4Nc@ݓ܂#aqCan#eOO >)Z'FA^Ϛ"d&.L#宾 ޔ) UjVRJ24!٪KiʜIؾ?'r|j'YA& [`ebh^E{a?NevPᡐɑcQC2HXA)ُNc_9Zz)s`^CAaFF:$S 'ydVm>gTkҧG_nJLiۅGblFI̵I:5HHi=qdQ:Nv9'&d u}QW1"Ȳ# eZاSR v5] $\ $Vqmk̪96̈́q#rGm7390\PB?s= R"&z&x}a5JϹqq2X>p<2a " uifBi6#u߸`VAj(;tIdXM5_%i\H f9g|T9Ʋa9=wX BT7d*[S#AT^,Npkr7d{=L ǖaA}8 B}, Owmf? p`CQRR Kzay1ksB U.0'\0WhEdAdn4+ V˳td:JRVs"d7yJ;:$7aáX|8U+rÙϔmnپ><< W57sHgnMYCt2 aRPqy+](+:\(paG6it%8&34Fxdž-yAiXH$:exlXjáwb ;m&F5ה#$QTxV4v sCݷ|uLQJf$\X\9Y&KU{/ݚj J`tB/<1UC8jc<#6AMם 3! ƁcRC EwH`Qm -ڣDdlPB%4kb5E7պ%uGFwP^هꁓa>6y|s2@B<"nB;HMT(+◠,!#iJ ;=*R/nQx(rvi!in]L]xQ* zX_"C=+?4 f' ۰b =ά쭿1kITgU&F5rJvo#3!gQgn+ܧ>Nd?ޑۙu.nTQ0rz5g%FZym"3~W!5/JD=$0H;.BZH{nD"WWUҰ\dX V:T)&cj@p o@l#v5Ю-њv^ b(V 65JHa)醄 MVtۅHj2FF:TC ɃBmQ U,(t)Ď#&Bfz+V[R*5FpZUo~၃/avhOB2V4qݴXeSQk{+QERo)>#y=Im=JCl`yTz.'" Ħ|:ZT/񽱼xnh ?pVN~mTeVu2+oPo0%9qע(ы[r7։O'aD:vfav&rX ǐ,[Mg  !h-y͇fb?lqhdF_3vI-I l0Q"wԮ>ʛ_y!Z^ X>" qB1U+F3=Vg֯_}_xXc90N&`#_b6x凉"aﶧYwM= cwↂ31s5R\EkCӬIM`JleQ"ǐxhdlU^n;8b>2v``"?cֈo av H(QMqvSbpvKJ5im{ZAUǙSBx,ƺ'Jj5g9m,3{; p3$ɂYTR?'j"y\IL^]{I)} "M?̴U8Fr* C> stream xYK6 F{_1GȨ,Yұ-=m:=M즻w#ɶHIxf;X$ȏk΄\.V|߭^,_wc_o_8sr3kםeݭoV0FN۾kV%i$7Y5/]hƹo7&<}kYڍ\N6w0L9#u͋޴K{5 p bFߧK_3B9pnB3mi~lRQo4Cjt8?Y*;Zt(D7BZռhA4R r>`KnFSH}l3V)G6WpdsKGxDzNOv&YRhU9$(:$}hD="ǯӮ>P 8_45{͔K( e=6"69W& x[`{vG,M~M"F>qx) / ~(zx.:z@:H3M۳1EL)?TQ}(~m#xoۓ߉6 w6wD0d$͡dJr'!!yJ'"*+ #XNZIhB&GJ\)g`DlW27ĒrΖW3%u?JSΙ8cI[hҮyldn:=vY0-9[v3'`%-g!R ~SQ7M(8!\{;=sEI.&66 l\DQ8[F KTFHf6!"XYdxG/<>}B#HFIr` ?O@ ٛ$.GP$FDRV$}AM5Okd+!fA(ې$hQ U6(j'T} Hx:TMv' Z!tTNqi픐7 = C*&ʸ#TߪEU:׸vhu^XS'?7tuO鏪q*ZXYl[঳t&$$Ҙp(*gC}Ǘ UU[)=]'5 C}!1͈Y.05BҠ$ySe60*505jqCb Јb+Bm@$XA guz5ɏH~2ӄeB }QN6R?#4fȎlx"$\ܛd3y رpW@4q,,BUAvPci+ӎFy|{j*>1NCZFlׅ\]4s;: K'=*q/6>S8 ,yW~:PڥfFePd{ pNjyCI *LDf!F Xi٧pƧ^Hs{d~ BǤ0Yנ]bdL 2BuK(g3qtݑ5|/gOP~&ĖC(u8bbf,S5gD7@Q5SuRkJA3:{dO3`> stream xYYoDVMĒEy2 FV Z ~3}|}DFY3!o~ww3/.wO\Xo;B܍2Dx<宽]1|{ھ &3)j$^!ϻ>KN0'R7T 6BOۋIm_uy!pQMK`REOY>z`\t 6-{4>O)hGy-Gq*{Ё3Oa~ Ru}` w2 z͜sJG]qNB2-ERKOh{њ|ŝX61tK&;T6 hx3\{Py!+)!䏰si')pNhp$BO+#d } n8~ Y@uڏZ<+ ' ~Pe@饆Tr6#PŨǥ[,(sx0=@REP{7J֚{BˍX@ ^t5!ȶ5{b[!%B'JϧДc^Ddϔrx!p{?9XyQq'(@9 +|zE*s2P4ABǾ-BVK/l K\%A: IYd.BCd #C\ 2pjq>bu ;fQ#*=HAHH)x ` ™u9ԟ@jtK˸5 bT"QCqʓ1R{Gͨ]K֑q`TfAoQ*N:(kX%ɈOF̢I ]qrr&xۨ nb7m?v&>"vK)enl>8G".͠}vZNrq ¦<4LSVqefXfT𾼎6hۆJ8%u?θCK::}4Z據o4xA1]$4(-/yN Y,WڣqȾ ZHm|L:ٛ(+mTć@l?KjmZ-;:'W&$iOs rG'*!t2bĤ%)[rWs R7&mT+@ÔT_F5F|LP <'ޘfΗslg=TkW7(7f$%G%de0#t\%m1atT¦ͫKH%srz{v`Lw2)/gwendstream endobj 45 0 obj 1685 endobj 50 0 obj <> stream x]u#_OBˑXqJRgwi\ h:u胜N}ppfv? .Csa?on|xWoo n_|spӇgy31a_}}s|o(n$|˛Q=A(Ή2?Zk1H17|x>23: {:Yxoq9kߔ日ә+_Og;p=*sTJ;>;Ƹ>~ 4J''`‚Q51q?Ӈ_j}rq?V;}|r,|_qJΤ<ޏ}!BpgmpL_OkǏ*"=F=AXHJ?.J?zQҤG9@>]diֲ\`8ޛy hE=Jxr~|t`lbLzGQPE gRJ1{ /B; Y:!(=E :oB}(cM" `F$:e~?wdEƒI\h V2|ZFX`f$A0Q^XkD0E%0Dyy ' §5ig8-O3Xshs&̽nx[ +>-hbZ.&i'GEj9Ġs{ՆJlS*G\!--)rۍ@OvlRӴa)GeUuʁN1?kP[a!8:~LCOOB4 J?yL5 c)'u3 1yix?T8 kK04+Fxscn…bVC[sALGS4Snˈ ۞bKjf]&}3R\">?^񼱺(~}%%-VR("'/F#[9 MƉ׍1Z+@Q (ҟ”Er9zlddޠ?bA7+V9b{BF9^)eZY`Ed8F;R9Nj.p.ɸ`x `1}Tlς+ to7IEwEB'Nda)$,ݽ$"ưϨpl,B-)D}̣<i̓f<n˨чiX.| Y]HN![$;N,08V4#ZT؆RfL-GHWNET,Δ4ڥ5}ICKE‡>rnt)F~X3ya0(j)" g)2ynw;_kho4 j>eۿ]w9L<`>г^v~-JQl]rc)!f\-S^+#>'Rmt\Y 6/ tUr{/jGw1—$$,DoKYԨ;XĚ31~s9`ڽA}ULjh{dtl_&Xۭ 69|fZ!R[$)4l)-u>?żQ.l户3:umv9Idth5%nF@ ^r>eqmv# =fJdɚ~eqx^N,Ӄ)>D6gj[N`Qkٔ[zƭ!`cEFYJ#F._.G\ e2Ѷlg h~,z 6tWL'́ҊtEJlx}Gv<:a9R4ӫ!4R+հ3l/8nlմ=q?, M-`}7߂3{^ Uj}bnmZ=t~c`X ȻK@Hn=*y?@~ g`@BB+A9AI䇾^zu+%Ɋ N8>p jPiX P.X!V"}B9#$&-z6Z7L9p6JmۡOl?W@ +~4g@rbWN<0V̜g5' # <7s҂z|)-\-og Ej>}{#gG)3e HاeTe{F_@Hc4O>,G`f%{S|lAUsUQŽE&b[6XrNۉO/Z WqmQY\=/PZ5_IW&aMEZvkӉEttM>A_l'>*$V%V_8-Qp ċmڼfET$$ "UY}IUf+*$ HNt }:UcZ1 DЧ]pI}UPDLDYg QC^DG_6Qpƽ g%rf#5LLeB'1߯܁ Ԋr:~㧧\3{YxY`'~uK_‡W}bZp8jyS1BfJBO)h7I^^ yj3hs YcPEt E(]Lh'BN %?H50Ȳ'$#@Al'9!8Ѵߞ`LGWiO'3V.\=sT:dEllO/YUfT\q< iM/&۹iBJYgKROjsJs=hc;G;9v\ _L@iӖ',d:/?O"؝KD! O l7Z*.?YfqGT Daꣅ+Ч공l^N,N>UoU* NS`L_ I鏱q`QLhp]٫i-XNq)`;G!u,o' ]jCf"-X&Ӌ,X\~Zqt[~`,X^s#->nZOZ >/<قex - V\~h%>ݖ,X;6h;#YB"Xog$|^Hdk )oDY #ٵ d׮bۮI9X˴NS)?l|nqi#St\ g3ΆV .@Po`*ml>}k6ɛp0B4*0U՜r(Kh'BNelFO8)ddƶMmfw'e#3F(0h#0@ }:xwG }@f0@H;,6mj~Myb3 B:ky -V6BJMou&Y$e)XRh'BN e|Vgcڶh{#4RV7hM :2xa;L{0A l{cNv26K Чv!'Gp)[a"ZZzmTohjw\m2]ӇX5Cŕ%Ӌ+*`\hG5!Oqy9Kaӑ,TOK:"l@pVRp3y:N鹬n( Qg uD- kݬTKj ,7(^e?Ҙ Q J|10WT/k򢛵+g|R*݅jab4RVKQt/dU9-]T6ōw,ǔCBT.POY9›uV+#-/p_fW"[Lń2-Xw d4˪w.(y yuW0`/^5HdYY46fRn|kDn^rJ(v(T9o7*I=tRUI!˒WphՍu[U)Fj)Wu@UUZD.~ *izmJh]-?n"Սw]0G O75<]> Q@)ϠXB]$TB._S͕Ș"+Z𓎛˵}լ/c% )j2OhɷD]6./͢6o\z˂c@s<|k~+~/MӇSiaa_`g5UU*R.k_h]YܲqSѧZ03ַ2+!²DkIѡ>;04==k#ex ^QBn '97[nQtl)^ k$L#[k-_ui2nﭼ&tK.u)+^xEHO'myp5*y[͖Uoez ]q'e 9~tY6fxaUEJólew]D&&{)@g]tV4Rw}Qfy3a(e>:S۸嗺=DJ$^l :<~)*TŅN.MY8jX"~4k8o,Ë2wu[N$AKf'~ŝȠ&iW^*uʷn|._Aޤ#/PhB;:\JВ{6 q>K_|EZIg`Zɀ&'zu(rվ|rKsxǶMְ;m͛w9ÄL}}.y?v Y jZ܆uLed?MrlsXBV)# Wҗ̶Mn^~E^9*];TȴyuL9}8vϥ(e>/ ܂wO6 G}I0[tKObO;/x+;s,GV,׼1EƑ+:'%2ֵY/8HulhkC@ 6o>޼.#Mȳ/V@-Ż0lurqwʖLƯWIZ^ɻh̋PΆdMA q![m؝+ZO˷ +iO<%tb?7ޢendstream endobj 51 0 obj 6532 endobj 55 0 obj <> stream xUM1EE\{ĕeֈB2U 7oiEAaŤ2ú R*\Z[jCl\>>_wC Rh)ɶծWC˷Kw OG`w A:koǦr6BS'w-Q=@|pM@_Aƈ HVKx!풧+ ơR~ad:P8fgFR|*<YAIfUE^%a<6u7&#ڵqpyXfFUqNj; .M 7a8V$_1ax2cRηo+[K8ϏU6UoTDtޗbF(%(kĜ&(- g_XWr#gG.8+ɺ)(-ېpQZ@ U`T/9t/]<;lNwgN=LgUE-اS-BNvS)Oqendstream endobj 56 0 obj 584 endobj 59 0 obj <> stream x]mV&&%@C6Gse۪jVh*oPJcB^y晱rWNjO݇?Ͼ?sU?쮭Z;նoCz׸JПq8U%yDcuK=42NvtTE?Jߗj'tԃ6tֺ?>J8C]9!Z߆/QVVj7ứ6-mwrVJE]IM~ߧ_%jƙ# 4үiZղvqzKRgYYq&VZgٿ$q𷵖;Ь +4:%R[ u Y#[+ZɅUV;~شrpI:ñגޙn>n56z/SKM{8Y7PM֣=})Ng5གྷt-3zh56̧QUF$VZw5M?Kߢ>Z!Cb"1z!W&_#!^,~#tN 5N}kg;|J9 4)-wBUbvJ1TmMQuMc0$_v~?ՊV흿ۚn׷G`^#-tUf؏Z[Jx}m6wx5Cf`Sgpx! ):G[-vFzҲq<-_y4*Ґ ;a3ݴfy`*kH_ uuO#Y j.14/KUFkp%df}ޅ&z#HKa4]n46=vMm߉&O0xaьSg0YԼ]fywl[7"9}VAڍY,B/ ,"Z4vsew|I`؍BFI-m04(ׂrÝS7<hj0rR7FJF^^ݤ Gu-s @vgfdXtnɼE~E&{aY)B lf ccϼMK?"ɪ ?ގvwF@GY CjsV,bv72|p +P I7'3E .(񻚤8Ͱ`&s3 \7d0rp314֜f0T]1a~;8r8QOzpه $U;ݺ i MF6c%Dlr`aJjhM{U&k~tU]ţ%w#!ɩNa{̈́5n߾o`]=>ьV%CSČ] OtNtC y0Rk3hÀYn "ev(c']Q@S' >݊~pXmve%vr FtjfE= nKaN'61]kSmr60F`AsQB-6py$$3K1"׮$Ḥ.My. (JY'xR-ޙ/Kv$|O{f%yv}_LO[U*VN ƿyvy0߷C3@B9u V:r_lN3`^r{nTuC/[LA."L`~"ߏ-N5t~v1͊WvR9F>[|SzDΔn;ђߴ2$ H/%1g` S$7gZK83:ɦ5n^1zYIRlaWǵ'fX>L`?3Zq/> g.\7ȵ\.y#?0 ǩմ|`0rƖkJ2WgZ'YmkeԶadv,BĄsz O߫Ȟ9\aP^h]$9ǡ1MK ;(;Ͱxӡ~43X|(=cA# T U/{ N+%e_>{!eG Mvǰ~'?,,?o9w g- 3Y'Tǰ2&I(B&y2SmkP9q½ /O«As.f>ixfCQ I_`2ceD-r@ iIYKmC a?n63+({.o~<ņ4ͥXyAQzΦ `6[_;^ӳ۳Aendstream endobj 60 0 obj 4937 endobj 63 0 obj <> stream xUO A D)Ec;:Qo*&&̄,h_0`s2VoO3*lDŽJzS=3> stream x][%7V $Ɋ&d9YN}i-H,@yRŸaevwF@H's}mmÿ󇯿no}??[8s{qo؆uײՍ{N;F(9E4:},Ӌޝ~| _FV$חMcE/!l Mtdq7:'K״lll.#=uMoZ靳n^vqR$|Vm?Zc:W}wz,֝~@^f}Ӷ/Й 'Hw7aq O}v~C<)= RtO%ۤyħkbo~:܃qOϔѢ1fWqójJ~;ӏVX': -nJ~NO3e OivP|1ү=y@ %S]Ig/jau/;o\7WӇ]:?s{a;imd` K΋4{{OuW5ɐH)$2SN4:9E&p_I3]cu+dvo!4\Kq1V/`{k9dWHk Ck)@jHEN^#z3~0㊟naL2+XArk:A7Lœ5IzsrV{z`]t3Q1"+(I I؎D"(pe:lZ%Ư⼙|]Cj" ܖYU"՟IF`s2a!Im ,Ő<0ӈpnɣOf # ;GFkX~UNmW,Acy'l $(0~Ք:2֛Z)'K{3`7&`TaW̙m1H.iNj\ r,S,{ S.Ӈ 1I5a {(U[qixy#{9b^j֢(?EF-s -8dtO,8wX?mFH`m| )G0B+YL?h&e1CoǬ F<괵;Y U?%)F Ss^]q21%w@ا./, .o WY8FfĎ"1"~dNϒl`Εfu)V* ZFx ɦ~N"A)AKu(Z?;AkΒ1,dhy 4qs6m-]x$m -PV]TELa_@7aFH9w ;O nEU10nc;cHc[K+Ćm5@cZ:dbe$d@u dEXL1R5ox E e@@փɄ~}y}W.diՋڌ(<)Θ^a8u(ѷKDy `(^CL?+D[nHB"'`G&7nS Wm԰{5ϧ]xG@*gP2^[DeAHuY'8(z®p̘,3w- yF] 0Z}Jb=)Z2yq/|/!CԞ9[,B?~Tb1gk8Gm2HL&Xg<C7(`3Xx_k%0G-ԱĒ j:ۄg"h[xdFT Y$m#C-tՃ!:}RMh}qHMT1a2.%:.fzv{_$H#-ӡVU}*}0'fʚDVpfFk!߳FiZ9it$>ft *haz-gzQeFLllkh1Ht r#Q)vav ܀kp)إ5wg SQHWhڼ8ȺIcu$'g1Ob4lV.@Ic":8H"}ŭ-8':hK<2,79dG 5NqL\&vJ}VE^#nꉄ[r!YV glN/ψJRYW;Ujr^C;pSw 0z:,jC y*ba55`9$΢{(wʃ^DHcj@4^ f풞y\Mdb˞ec\)n5\sCBb*1$#mhw4px8t &QӸcz$p?4x]+`پ-m6 Rm}4gj5~7Dߙ$ߜn"{e&qFL6 s3}b 0&t$J?9;QY+"Ү7bT9BVCG>3x <KnO]!䙡 lZxb7 _wQ/x+ fg_EOIH%&}#z[7@pHtș._ +L`e # p2H,D O7LFVPKl:MDZ#։517ԭbE1ŢHDa'B̋ yoJY pMqwv*_ hE{$,+1 2!5[(3 iׯӺ]/ZzSkndGh+) Q (^3㙵m#i1$9bҸIY&IRշR5оBZ 3™@AǢK6bNfT(PS0+M#>.pl ѹ\@&񘽲5p&tG"YwׂkyȣhJDb8eqԝO@vy^&W)~=c%ÊiéE|5"95cA"t TŅ\eQ!\ˬk\][VRV`R7ת+:s\XX h=4dGO:f@898\Zsl {jiƋmp@PΒ,O/󏮱`%ࢱ_$sU; +.Pל1I2zq:چ-ִq潹i>h',È]pD7!+j5MV^[y}-a`0 aU[/$ >cC\B9jRFBi z#kD(249Rf1|’gFi<8ۼB9hJk 6Z_̣,gcjsDZb35Z61M*x;]+Ր)b[[2Њ<$qS'N:f(cB"%*Ƞ h YyFpoԐKQPd9GΰUj<,Wt&ve4U:?~Uy0 &wxϖ =YXoQ?=k2317?-_̏55 g.9dɫB)xHyCoꗝn;@WKڨ^[g>Z J>=)Bo3ە+0TQ-Ynh0 ,NWϦ|6L!*}ui=]2wQulϜRrr%r%dPNy%Cio^֗E2TL2c g=L %WavЬå&Ls/=bdua>.U^=܎+p@&@M/b\[ǔs=W?uI߮xl" ^]נVY{մ2\¯׊&I`4KD9+ jTϰ?,$C }$_A$قRRuI:&+YE #jtߤZr {zģ^Wsyt+fyaTW"z lL+n9I*}15 δƹ^zܚ*LcjpkWjT&uFv\zP})R d5{2,ܜJL8B~NNU394"U3j?:+3 r)-GX垤MƍWf= rm1IHs$֥YQA N;SdPeTMRD6q.r4.bu>R4`vo7?MXo ;,yX~eN:8Eg_-acjYVD\haw;<|/*0endstream endobj 70 0 obj 4912 endobj 73 0 obj <> stream x]kq2KLZRbGn$a# "r>X(?z^}zzro$ V{яz:U]S y??~}ן~G?N w}N Ow} q INП;d;4r&_S[uEv |VVtwwܓu~|rԲW翼\Ugs;翊vAx{/׾Zz/Guv\ezg>Eey:!lBex2F(|\]hZ參a Z^%[,ev)XJ͐^鹪n'Hy 񣰮w.3ƨ{vr |p[phܢ] X| 3ï~lzW!pʟ}5: jI~^DøPk›Q y2p`<}^ΨjgĿ zt伲&U.v\+;&9'БW^oq:rV[qrRF-# ,4 vwp}(Fp^dW;6>^^DT$\kBh 2DÃ<$܏8\F&:Q0^&[ aK`r?ܔs)3V^)#LmɽF?LH1b,*<9cxz>ܖxcpcĦ5QdMlNfME$;l`+|[*]Ł&]3,ul)u9\%_Aa:¬|bz/ĸk-l~-ZbXٗ,8`!OK@8] *KXR`k~Ch/h`{4a{+jlЪ8 &Vc Mi׮"i[<µaIuѼ_frdQl_}?Sj6*WqZ gs%Ё7i.,? 3[2ڒi `om+^yscW{\صtEX؜웭- W Vւ15k.W ߻ѓ&d~ɸ*ZǼ:CCqƊ&6ogiy1;veA{ ӭ0963_{7dDOG)Ղ`"NJ. l6x<}aԪAkئ 6MM$ETmR <) xAA0";r5gh|6*ꕕ9 !TT辦n49),mL#am[k^Va2q73yX|aB{:*Ã&Y~!`i͙Vs:kdkVZj?cTjg`p cRlmE+WDJY̟,3c/hx\I2L:b |^رt(1q6*jJ\j5oy6xMn19Ma+;dum/0D 깦/TgE}8f(igT T*>{)[5<Qg:–-l=PdR=%cRݛ M5Ox}E齭hZȦ9*nR!c,_`e 9bw-jwԓVx]Db+L(k`<nɓ7Gf͚8xIvyTCivj\J9Xx X6}_!?A]w*RMI"Q ԒDtS叡O',N `g{&JQvܢ4D!M ʧwOY$f &B}Z U`[EHznWeW*I 4uSôHc)Ǐ{5;"DR؛O5ΰi,~. WV[H`$ Zq|FLj)>i0ф3.`i| ')ɜ?3 l\Z*BzNyZVP ! B%DaX"+w<$S${\blxhCzUsho->5irZ rxr3ꉎBɎ]YaTD6Cb{ d{ dGImf-Q>qE7~>>ݛ1΄nU^76KJԴi029d._]Ͻ&Uټ9f5 esVrlr%ei'd7^̞^Wa|7W*%1Be-Y3y%Z9t gݳ#nfStZ`y ZD 0ȂJ[ &:MdߢRzL'oA&My(A5N)OsvNf5#A>^վk˪Y{g_2dO12iR%>[reG [m4mȦQe M"!zEmsl9Frq}fx"CAҴL^4{{BO# ppH{K&hAEٟ$jeT0,X9UOM8~=d-+`7 OoLMQiuY'31:+yk"Ӭ6[`_ǥP~u3J܌⥿Oor4ڊ?DxNqGoZeP FGX"lNjO L8%>dMD$6[%%#9!j|.ї|u畛^V~oNQ_@kxTW_ebU2-C1VۉdPEx?4}4ܼf)lLoSe뽣 [>S67тVm q> >Q?'*VL9c[s,5a򬶭y[.w"$ů ^*_s}}{Z!hj]ah@,`bu*|oM 7#99ѣuKYФ.͜nkjjlיvV za4l?#&eZJz2Ro<cy<:;0|A>X$8cG'nhӌ-?mA[avך7=c^ymd['ZW87|VUDLqD'V-#!Qe5P5:r͇9"?@@r `r҄M#LM(aP54H\s˹ueg4z5SWRV'w !K7nl޸Uhy#=KLc.;rm<oT d5*;߮aM;NRQ2=>m]}sx֒ڡxe}U2?fl 6z.c:'3ikYډ#M#G4YyXqڳUX«tTuXvf 9HV[q]䮴`Yw bj<`A#(Y<4pwoq-uʟYOv/Su*) v0[y{BR $C~`4 *L +YOrIy56摟}gVHCཨL(@ktpu9NӶdŖ\E ͡M2Rw8)XB'--UFYHhˁANWC)eƕreYokaR/Fٞ4T[Z}Pˋ1;G\%i0.I`Βq%-6Ұ1 sRY*BoNkjGFpK'l}k1C^nXZl<y9c]=$M Gq*l" 2 rϚx}VYԀ5žhX)7Mjo:gZx1oJ )8WDj-h,$ۡ4tZGX}a pA;tЛ)y%Zeӏhk L-={x4Z~~Jߏendstream endobj 74 0 obj 5574 endobj 77 0 obj <> stream xX[5(jSZ0 3IryT(USp?senYX7bKa:dݾ/2231{E|~~?tt3:h|du_ ?:kPۀkk .P#hGѻj!mO T{~9o.)@ǘeü|0{ѫѡ{^?}<ܼQ` `xE@_ #ji;$8>&Q )@{q 9~J\9FG1'|1pz+~2N ʵ\YgSa$ ) l[qrB k@1Fyح|@ r5HSJY=:"pic;|9ୂsǁ1pTM`-9i-Qr8&Ʈ --- γAHwNHakmoM)tvƤ]LgH>^ "csFK\U>wʠhFlG VmҌbFK^ JL׫a 6vcԉ0]m)7M]JZx!v^;s\yfv~4S[!=f$́S"jHv qD1q0pI))kgc*묓-iiC|~UGhE6Q:GqT@<{+Oz4&,](0xg<®5;389aqlWPjq>0)\tiƂtq'-iqZLbӍ!ICz**IE "JysV}b"9<ڍroiO2QGiXh-wcgyzˆ&;Ǔ{==j.(N:_D> stream x]wGp%ILYr/]O/E1M% rQ#f|=l9{fg $<ޝzԙIZ. =''.{ܼym֛zgt-WOv`V;O\Z큷R;#w/Ekw~X e$7 _l> 2Bw? p&4µL3kZa3ЋVLxZǹwy=EOScTƓ9 ôSfjЉF8! LjXk'-?ITЉҫݽ0"7NpB RL-[e~'(8o7Xcv/e&_N +aH-߽;avxa|F$|=>|!=Ltx>0BQc)vJ^>.0U+ذj^9o-[RU^1Ze+ئr'w~7γߠ6YL*;0ѕa4Psot\˜uh)PմUɹ_4Z 3: W-S[mz0d`Nrla<eTht-tϘ 7?[CFq 4-g*]}>@O9"܍}{#3J^i!ݸ_gXMej;Lh ȋk`\\O>Khxs)UEc) =E9maZG^#&CCC-Qf9>=|shMn(!75 l0N/v#L1[xͽRX4$$=lU>k6Dj kD:WsPڝ9L$jwr ܜMThOT5$M dp"svd@C?F sjjs"6Ƹ$14 3Xh00U6jNϨ˝8E1ŷΈTf|&44'0Bu9j]K(֫6 ;gzx.=VGC/mtMX[WHJh$֯ vi҇K\znbmKS̀)hS2v&z`6eArTNj51wCSd_Zdtu1ͧi:/&d+F"bWd"lFqVQ+>_ }@NTViה@gޣC)!tI-0qn]}NێzǑ׏F*qBmDX;nԹrq+- GˀnҤ@ٸtFKuNpud T5=uB11 jJaʡg?꧙m%JL_\=ßk4{`[+O|QқEr{:Sm"VmƝb厐6JZug0~̖ D$҆V;ob>0Â9W RgB\UvZݣ4˥EsR*ԝWhqBܮ[*]Yza |ROFҨ 'hYX Eqv(*L/0C {laɖ"CЂy(â@kbD-5A `TyB8I&EtQwJ]D! >B!`<-/p,$--8(JpccDK)&`474b@f{ RP%$!d1i).leL' nB1,h׾œhVM- r ja_07[磷7C1g(jURiqLeCGz&Q6x4g}U\]w. d7d]i =45KYSyڋ !0G1jWv붓Q1|OX|OSV*mQR U*Mg<T9G{ÂOe&gAV+ d)!3. {UI%7˗%xO#Y쨛0vF:9\tEնQӚ(#rKp&:9yW6o7](mآR]h҅=;*^/b]ߤ* |Bk &@Zt=68<{pi  tgDnG3/rT\RmV UuMrfwD2+C"Df"CGtwX &3jۂ˾sMe SܿȸB~1:/j H~: '~Е.*$>y'I7~iV|oV: A7a:@5S;|?+a%ʼ\Dd@'}Сr4g^.n^x"M^5x9ߤ1fuhOqA#|ҏې=73kJ=(yŒ{tWSRN۹h䠛&Ra.?%y6Ya*~OȺȧn*C]<%?1vu) l8`*B"[]wl=;#SgQ \Ŝ#5I#2)lɺYLoTFm25 xty`] G5W%:Fc~24N$0ۖ6D\uNd3/U.HwPT-eF)ٞ"> ZsxEyC"`},}Kby,#ңXzXzKr)q4"M6\2sD/%|L,!Jya5Ҽ_N}TChN\,zJ @N, qHj#^8 !~UGń ӳ1v.ղp`&):gK-DnS_1SPIiV,3J="؜*i1ui,}K(-tG85Qx}txG^6a|{XUbzmvՂ_8L(keoenE8_8vKo\_jSi,̠'vQF~1p!\憠@%?*O׌-ТLdʃ N;+X7X|S{|7dHCI,6*9RZ$jBtHPʤ\Y} 7-ua !Vӗ:WY\KU& 6^r_4ԏU!R|d?b}ZS`q4+^HT:i@]W(ɻQΧukOzWCނ:@?B5ݤdr;`jo yճ`rzuq*t#TcvYIFRC.|pra!rަGj--e֥Y&C'gXHZ[^pљT3]_-C|wYR0C'#i udHR~)΄](;mQw q=$6l<#Q,QJ[IaUVc:dCz7fqJ…ivU[٠"O^CCb˱T[L>-q#C\ +UᩚZ-\c[$BfpR,,_+5AS!#$nԎnCZA{qa솸iږͷLūiK3d2^s)Öx "z7RTql$E8ɇ -]8ϯ3Ma]َ.(\,)MLsMs>Fca`:K/KWewU t^F:]7={v~xs0RyW ^L>)6($:ru,՘ץ7O[(:r2|L~q-CP`L~ANjby,,xT/^̧ߍI@Oliʆ#F4f (#4 \)]~h5݄p0%o^w8'nݛ &$sgmHF<Ƣ' ƲF[+JLG v}t`1Ph! -Ȕ5:y?kV=endstream endobj 82 0 obj 4946 endobj 86 0 obj <> stream x]I >%n`}!gB0aB v?ES=]=S={ D{v߰;GyG@ox-wQ~2@V?o%1{b%&m S}@;l@k @ aU_. b` FE ZrM'G c;|'&h D((q%Z gQ@oÙ(@ į\p9\]vi+j?xH7DL 9LjY+>mq)ǁ[`_۳CY,Bjc"+0Dc.d%dB'-Z AXDٳ H O:5SF;s]/ y_Z}s9W.X$(ED.5UVS$"2iAY](ݢOg<&@S]"Sҙp1sHy\#Zc` nb!!Iu|vνM~U|eQNj+o-o%V\T%_SGzp+heMcNQL\Υ(D:bd˖0YcMx .)f* 9"/Vk#qGEbJ_‹.gClk'#HQLU\BA[W~&4/QAS`6 MN8  Ý[!,Aq"QvLC򅠲f]RO7p' Rp.* T`. %%.DEkCd0b$H{5d;4˜0k[ZXk=Axz=S'jè)PTW<Ajb]7A{P:k}XiC6v4IGʽnKBS] qś):~+6wsLg 4ۊQU9a_kPi#%OU-&Urz X-T%HeBU!Jtcfke;ٓ[kKYV%g`"*_>W wta\0+Z+.͞TE$Kۦ(J>)&{S&Bt0 #<8ޕ_o,Aa? K~sLjmvMrBq %I EkrwQ%61(lyɁpBk u˜<@oiLxPThrM20Ϥ^XQ*Urb=]TpB(VqhBM8('ZRas#> CU(Ζ: n*1Ř l[l@7E;d^U¢{1& &{d>]@Wk1h>**@kqY޸C#贐A~|OؔEڸSz7y*/@T3cdI^}bĻҐ& 2=b* -}9q6EˈÏ w7䬳bU,j{!#8lښʱ"_btnRH.*! !]BIJ"Ůlҗ'0E;ARǪ$IHJUbn^iE ;%9Rc'j`c5tz C .t =/V톙j9},L,0 P\fCWL*<Ԫ}9RMkZHk 21*R{P329!R#BvDw , ^JYr K;lv(F޻ۑR7B0܁sv8}=nM1yڋfERLkBXg{R5'3 I!dXdG/k`6Ⱥ8,$ЏQe1q{ X.S!lkL:[` Ŭgz/br7D-H Y\#gDmBrαP<wMw`_ 7HEd?.=rؤqPYBؙR⅙y}EN$0i8ӏ&ŧ&s,O4yo4-` 0i8ӏ&o4kLڑh RWye9,<'eLVJx,IvbՒ+u~v WD WɧojN dѐtRɨ%Vl^=] ^'66uf HJ`it+p#3bez~\:4}p {Sj+LeR5ýct궶zȕ0WZǼyp=^(Ԁd @)cJQ=;|ޮtj*] ykEJ>'(q>RYt5{l;$T@Ĭx/h= YS3|>=jǒs'*/;jQʸ7' S[,ZoӰ;k&guNޖIsf)=DI`L b:9Vl'!rsY]rts+[^-ZQWѬu/U}*Bon*COm\,NLeި &ZTuFmBGRendstream endobj 87 0 obj 4370 endobj 90 0 obj <> stream x=kG6_G 1f>I̐L-xEBsA+9+m8؎ϩS]{ HlSU?ucO|u?]27|<=ޛw̎sγNW/v__B0 /ᄌ=V{{/Eow~Fe$;wCX;7N`:UD o? %}%|J K)^To{خ) ka@+NWfj 7%<fGo?^ki|ڎsպó=Wr8‘i,v+L 9w7smLNd}vLݿ+4PK L~N論^M VxR0y^|h6Is. ~=z ]0Z ň[;7oA .Hov*4 &Laݰpኧs#hk-Go&ϸ]db0Opki<q [XR2=gE :ϝkE \/F0J;L0~}7#it E3%&(pnVgi~= Nk;=}p Vԥ?I1.~Fow?&}F{w 3]Aiy/oȈ4.}O+u'彩4w}=$ o4{6_;yx7EBN;CVG &lBwyZLtFu IKfNLݴ~p[&dL[Ž03ZEYx$=BH*$[{&--oGѲ\ {iO7(O3!1(r rw™g<8`\ h4sWaMsV8=.:JNΕގT__(s5u*t_zfv5=D6ID3"bVd;T3m@ "R:p{`8U(( n~{snJ[VOOEѤ7)Ff&=_kK35c&ʝ |3=nxQ<2I>~ё z4͎G , : ( 0(la<@8/"ps#8G #hjfh7WG0ƻ\=քƟÚek"kYa<&CYy}JX, LiM<#UZ/A>3|8ig 5 +9B*2DNѿқ^0UL&4Nș 9$S13jO_~K̒l ծ] jRG+HBvgy+sgHk+ei¢x}tRSo rt-c9F}:Eii邤AS͠~D~|_J~Bjܗq  !!C3Ц7DQ̼_.&Cq<+7[ʚpS󞃛"OyLy+6⟋K @3'(-K6g2t3.Q9<<&OްTCH9ʟW=U]ݘ; Ut%?]aوЩKMN1/6 |K*T]^Ǝ* dD X8 _ r^“-t-Rk䥈.\$ѵt(]"yi5I^3T"Pּ"Ү"rȼ#7 25rg"(0EW멮SB3;W7 У⦫ض}edR|`jY }H^mw`d20 jԦ9ĐM۵)odu*"\j:&6y@hQ!]Cu*uE1`WA&gTW  #?WJíJhd7bY*1,~zTy-[I>xe^[7Um`O\*=#R^#a/f&G6M@b3@"&Ղt Wi^UV$TUs]lCaILZm)*G4v@`"j T2*,fbzἴ(2vhjpʌypHeNpt/k~=  ?XITTrOrW2yjLb <'cY֤|`*,9 Q=ZĜc"{{łi+ "?%x:^mA5-@2^g~N$ tYE=~iJk?3FH6EeRV~(.ZQc')KFrH3*]J@exo@G˰st6֑>sv!=L)ί>$x35P.@A~B*?_qX>-AC& [.~`;QEm3k3g-jS`\uujh8}R>5lJi!]] n;t ۼ]IJ],L G%!%ioS̰b7'Ʉ̥dVR*QkK@ehq*/F+VӅ @Z΄͆/Yb4p[ld⽗RigYEy-MetxXqE+(@{6'"zZ bn]`ttÿ֨C"+4IlIujIWgPEDvp|I[єy)Qn͆x-kȆ`*wsWP1MH||>W7 8!uv tP7Nxl@L d\,Q9x<nHܟO5+0XNmcD7U(j &}xᏼ؈#G$Ribii!nVCD6tYꮶ|!Ƚlv4Y+f1-R\[sJj'f*>̂!Kqp*'|̻ҴйH__,z 4d"+qax0GTP]X귋 *%iBRa$̢)$-Av>6FKoy;і{ ERq+ ,dwM*kqQHLi9t^7rXś[k)^Q} xwkdw(NZlJB $EBޤr<,Г2AɆ"h Ь#af/tp9.3LY2 kj$eސMR_4wէ'4fbE/]M l<9e#HE6 ni]Va ߇0PyT {(!$`=NKD )!6pjӨ[w_&t#4ݩ.9cПf=S/ndˁKuŖ˽0ħ@R5x7K{|<Pυ3~Ҝ~!V;]lP̈Fw @S8NV!GA**ITr bd1 ez X֌O2X#)!Z3RZ3B1֬`!316h/c$7Tb:68oj@Zw[ mgÔ,s3;.t?B]h>0´ g"rGWg Ky!5mP׫m84C.\f8ŞZ(1HC,2g,JZoD]+pLms-B{,83~soCFmBE6 v4C܂9bN9L iP6VggDhbW+& =tZˑ}4cLL=EMEObV~@-)MZǤSΡ1tu.#`{{WnϨ',UCv[?l+@Ƕs՞FB7m3joj$1uo9Lendstream endobj 91 0 obj 5138 endobj 94 0 obj <> stream x]W+"PBiU{3GTTB!tTIxT P9cw.A#})"֗[X XG X=ѧ+8^' {i֎3 tX+3Njݞqӄ+&M`XG7nj]Kψw$+O(LP-SFu|T6!ƠT!oj}>of߿RS mZhپݴr$7Ħ<&J<d/' }MnK<Cu}tǻF; ܾ FodV 6<ۨisq)=2$Nyً: A6ndw nxXPL4Ƙh ˀZ pXXTI2mP"i:uQ1% p L ޟNaZJy`WX10?hw{_~N xnV{[{ 4)uc+\K-2z«2#f3PINZ7-lUY*P_4 q,;Bs.Mj냰{]ƀ%Jp5LSOLKz&C+"qt먎7:C h8Fg#6[4}I* .Ir; &7m00 iN-;RVR88@r# j ^:/ 4q'8^'1u2c?t0AN]4EI)g"~D r7 Ңy%TT!7Va`J=$'Aw 6kV+hd_<(xJ(psQjHhJNT&p`բf~51I>@6b|*:sGEoV{_U?KYK'%I;RKdo e@X+$۟;J..Fzz= ,X<@6ωHf,^Z-g%!94"  ]BQ'/v؋Fܢљ=4پ0<[FR#hO%vcؤ|=҃'VpksNC% IC蟧9ry@ [je=ʯ :dZ ~} 2z謔<ɫ2L*P hp21U8tk~G0+MRJk61s? :4 zJ nyk|,pXfB(ƩqZӏz5gt.cMGTε^K7/G|p!N͆[NzJ EYړecQ0o\ SG>(H&GW}ؔG }6̌) ͗ ؈XSQD=!d@QƼ^'` ~+ًWDK*vzw>Z@Pܽ>NhGiDuyE lD/jZXIU sϤa7eNpr3! _iwPF(HS h}4[RQ Ds'[KPwl)Л v"L??1ӄN؆f_tru˥K}Nɐ 2? ͋@Y e^sľJgW {E򪖲}[ةfs^ :Cᆍ)tpW'=6jgmTB$ KْWjBw .VAkF:Q]PGƆˏ"sh7 WъbEZ|W:tp"!IJK&d#Tx½!ɭHVo<cJE 35/=KZiO!D! 1aAbAښlmrk=rEyDj[ƊҲBs$loNzְGzE~+/t^y_ְg+Iᑴ!_ڂ@ :!gg Ogl= }ȍukA7IԠr| Z@m ;4`Uh@GSA 2%*5Oy11ƄVf> D`mTEm YJ lƎâ^318ZZZ]kpe.19O]峗jK%tKEIE(\/%rhC$r2cԠŽN~8RC1EK'1gi`qRos$k(aGJְ'#sY%+V< c? *~33J/ hm[×>te!igΚٖ[Y3|Vqb1/:r g[ Tp}񓰩μ2}9"^ UbEHxz9U4WN"/QBDPYr/~Ӫ :LˌŇ WO%JKt8;xr6e+Uq=$Kط2L-w ZcZJVmLonM(KdtRZ_YŲ*־f"ZbNOHG_Q^iôt:Gߢh"6 Xͫ=fW5|~8e6RtUQj~ W^t -^EB鴼״"|L0QU`"f,,6lv5s4QݝK21qQm-qը_n]4:T䵠/Cw}蚷ky?7/^K^lƻwfBA 3B/~@H5{ij|`9B|+b ⬹#E7ľ%(؎n.D OJSkV@U9@RSlYz#t#xyAYd2;"8;("Ln&!Zsg@] 4!! 9XC. Pk/C)[Ͷʞ.m5z9:@Sm1ev;ŋQpUT T^+v1:_H/$ J>2.NqkR6jǹ{\tա :p87<5o6nYSHU]^=~[~%U+w֧o+zٽr{\[vpRw*vefUizJ wm5QK•iH:C2nXc 57FV3uo^uoٲHw!8B:H5FsӝM:U T-.xØF)z#ţgyMӻuP3[w>@tRz|Fc- j"?a`< @_Y) h:7j9? rendstream endobj 95 0 obj 4417 endobj 98 0 obj <> stream x=Gu*?,B re@܋y?T*'! jTǙݝ3gfwDQFΜ9t:.v,\ݯ/>p Ovx=7.XcvX8(YvJ2^s?/Ú~g,~:fW` )J^_:Ȏsc=M'`rÑuN aԚK[Z հsgoǩZqkGq/~pUjEOrs=xhc_C#fL85|e%PynL(ƽ><8>;:~`ioˣP\"H@G&\Iz13%O<|<| fu a6?"[> !#$v`$ykba#Q+(GΘgb}r"Jr^j!3AG̼SjA@k4d *};k->п'R,&+(άTL5f\WvX=zJo^2s<;}ЁgW`l#6a.% ˙1|SYPWbF '8obKSgtLh .0=H243>zHП p{RF4z@4F]v;eV9jԁX2Cl)PswXS+pV}B(< QΎw406Nx".],"C^S\:GsĀ+fDmV O`9OWrB?:e\'cD,B`Ѧqq3{ZZ/"x"кY8\N%m葉o!\:ukY˚"keb@BnrW+2+X,? ǹm_'^+DM~T1=Zۿ 祂:3Gdz=cAaF@YefM 薿7N6OfK$BiP-u~LpRo 7j|.NW7䇽uc@sX#> ԞƇ.Γ<`8CS#x-sI0S [D;[Ve>H S~(=(?,<\Z.}4/=}.,!>I= Se`[|{ic|q ^mwg^ ;`?ac#7 Y;̈2xJF;iSHcU:JmȸP`HgTjӧO5Qʃ.aaWA~wWޢ2\lq ܯSy#EJ=\[Փk> ixM2ci 6B M 9*ML(N\{PMltm$]\6SHR?_&wGiY{:}c@q7kn%`ah:NEoY o(Z+`e( xHX|Fq>$_kW ׾D`ACDb#q"@ R0ʆ^@Mɀzdo d@Uld. B{Z,hY~i]D)i7͚N#$=$I.ma"ݪ|d&a@d nh/f1Ҁ&; ;f7NH1 ?@Dfd7;w:SIz>D2R5Zm=d(ZFNyvIkhkaQV*4AÏvJJv:rUӵ*(wTƝ:ayy3F7$%xl{1I!eZE'\,r|6-ӫ(!lR!tcN4‰!wȧH뿗~aÛy|͚EY2喃C Puj)rUeͲvGto)ܥ7AMD +7)^9):ًv^[tV$H{w'ZltMgć[sj0zH$;ػ6.("Gx Y;FЄI%_'d .d@/7_1ȑE4Oh rk7 `pEϙ$0ZO rC\#]2u::Z%\uCsӜƸ&W4څ|}O3 %dmqAB:MD80-y*|)3TˊI,Dhog$;yHKwIz~Kn.JZPGJN4'~2.^У}EhtdڄET!GmBjX!@2l;5('iKвr?.~KhTY}7Bշe[sP%Ty&B9idSUȳ ~ K̦/'&487ᐦ8fXAI!&@1 B@Utf;tݯ*< Fd!;uꂕd5|j: ψ7T!olm YSʲާ%!z*9m.Ps ðv.r w'*¤ǹ> \*bT 'IJ,QT-6 y1_Mq*YwJGG1tC,ch\JЋͬ3 fO34_hCX'&BApGC`z[΀-੶Ij,v9;ݿpGNpd^n Car׷KОoh3U`e#  S_ NUG-@"V=&F,9coM!ϲ!jOC:$:0 jYEmprջ4?ՑiludK Ut+橵~1a:…G=<=BOhB[/*ԕ^WmD# /vm!bR:q 2{iFi㥼E4M{H~/c쮘+3«(ϋ%.oݾFVRb Чb es^7TpfZ':=T{jE?bŤAyƂ]i&F\tJSE%憾MvSo!qa6\U4C\|\+@k57k6-J WEb?O\&2jKeW2>ʐF?fd(c5:= $B.Kʿp ~e̪J%1J""{A mx{kYVg&.5Ba1P+YT[!_AF8K{^Nnjށc?Jm!uo,qcGtV~5g4dOM;SN!/6n_[ OLh< Wqe$f2qO|6ójLqŐ Ze'$]4O[HѴjX8v koY5jLysGDn*>N-Qp5ڣI޴#ͤ+OcK5qje*D>WpC0.V /AE 8M:B6k2UwFŖ$Y*5iƫ A4(*KC+g .2$\dl۸^F(t\H}xlx.׼^v> stream x\ pHyn!GIx226/g/˿ytWTچlO?Ub/89`\-ÿ\qRg7V{mgt5N,u U̓-yͥ~]ZjgwKQǝG𳬕d<{ߡeVܙZH_kB/VqXTNCWxR-cXrWc$!}Mz?KX;4x v75wZUAbDW~?XDQX:̎bn,ݤ*!*CT EϽ_EkTԌp#j%^V+a6ҼT53Zŗ0?V;%R ˕u,[TmG Tr%jT@Rx/Rk.,_BY JVFZ7L._ʚs3p02=hwСV-۱&GEN ^*+ISd7pAp6x4am+-ykp}u(Z.[s@ /ڿi:AЪuk⺨ d\ kEzh3uDz11L/d8<îi4A3pG|5W⤁%5-԰ ur*® i2bzzW\}{ԝ$0rBUYT0eʌ!'1a㘠cb3 i"" E,_ B!2{~5Zlc^44s XG<@&Ȼ%QD#!iD%"=J,{&eRB B-=cMyl#,8LIQQ-@g xpB+ͼN !aS>nˠmtWw&eyA͕rAvCX+%P4VN2gςv i:pUSp`P&!ll U`1wÀl2к97VA*-ke1 _|>p'MyjS*Qp?:8Æ.Cx`MK& OPK}˹%)Iį@m[&u8ixrD33َ{;h>8`!$Z u*ZF}!IHDw.˺c'TjC\1Q)4X!LW>ʪ+Xk*_ps3)VL " F%r'z'ldZ :wp ;B+BYMnV,]; PapTGn8{1jG?-jq.gts6QC Ƞs~ljݏlx.9ǍIz*Y_ʓEE|μ-lA[CoX<`slD(`-:x<!H&#v b\Wb]ijt!FKAQEE#RBb^T<&o'  iZY7H4O ֏C]2λ~ a!gkFb Q>$,JMD+GI9T癩U?#pt UCbC/j7զ{VhxVsW68Єx;*xi{1]ګI)|=>SU1cw|xD=('MDo<| 7C7DȺpT f%fLFԾv3U ahMt1 )aڻdSzDZmsʽ\nh.$31l f~^l؎*WU(L0Z@q,.#g*LU,$`ΆWS\?k5Y`h]aEUsZoޫ*GƶM#F jÙ˛KY3&"bƪ=Ÿ́@k+i_o@H\5=]4j0WܲLƈW&[.gԝcB hF|:x׵ƫ7rC$AH"UTRFBFnm&l|>> znXqԼ#xTVCn`=m 9 h)"dݍ")ݸUYbR2ޏi[;+aۅ8ocQ(*˘VY[s5:-hgMmf҃_-+ow:`O C^/BGYbkbܥ7f8#눛'$0r=P0U/~]~b<їJ6Up6 +kXBvUFBKBTǷt@/i:**A_v:[kO*-1 :zLM:ݷ`֗^D`$EG~G6hUNh/C'ѠB Ѕa*z8o+4žn!нHͺ4e߭dsUv(ɀp!^ofͥU&\lxql`5%j`N\1|*5OsAdQP(R\K[q`ǧhe7T8&ޣ8 a@23,X}yyꜽΚch4~1V*+4O7SױZĈJJkވ 65Ka,4n+{j3*Pko]WJ 2+Z{GGWGۄ=EsK kn~8jx5k\U#5mɓu'Gz uTfmnt.$\/endstream endobj 104 0 obj 3876 endobj 108 0 obj <> stream x]$ErH:ł6 ,0;С+90,ojО1|Z1__BWv4 ps ?.^ nw%aRRx)˯lXdHfu8VQy:ܯ,ȟ[Šf0S^^?7Zk%_>B[5> e5Z9\?[ 4LjIwZZX+pW$ ,gb-`@|wZp?w p1~3h h%|3"ka_TvWN"ƂqꎱV/P ޼Z,y~U׫RĢƽA`q?IrshMķ6&>&~F{"G/֜%Y6f̙[j v7Wbdڵ*ݬ}ctw;6błIq7t(۾Aw:i&~!l,7u+ <" s^/ J޲)Gs,صhz}=_ K}Hƫ=7c&*k3 fLI>E "0MF;]A!ـt~@v%/=wwiz0λ62\]#0 UkFqէįXCnLΠ1' P"W_yn0qDycGđȃI.[̆m#=:z8qlP=5} \qeiVۣ와ăm4]7{$}KF  * ܖv粽KjɛroAwzy:]]6-zm+VWZh-ke*JGH4Wlhi%αB?H kq6?KPb;yo"0,Z̧u2o ~S(j>#Tzs;k% @%A =xzf=ONQ Ö^pqA4]i[Y_8ui0ta(Ӄ:{aB""\p$"bz/U=eD<6tFN8 ^|h 8^Γ'')؝2J';9wtJ*cqʍثJwN3&7'>p՚?iFG|z'  L[y'`'_6Gü\59+:aLJ ͣ00:1Z>`݆8cıXk n>g.47Gp_;H¨RCh `OQ]sV[B .g0G張?-:}=Cy1`ZQ&F_a&'@kxMD31y>(k['ZOݥd0[ ,xN.ҪOU ^+P [S/a9K6ىLh[fgP =kH nĶ46ْƃ;c3iRS$e$(f(9K2@|2R%J?8OcL0Yh0Ae3:dS;~grΊ 9="Fؾpy?+(hq乖y|?6]q ".`>X"FEO3&s'h̖ }~h*vOlfZ-<&leSx!j[a@Ԅ,mxcծJέ M11 :h2)D\Ar^ u>'ZTfj`y?\ 0KJ"*au Gި U"אD]mФن GGpY{)Bފxwi] uVωD` s9lSef5(E9K.$L1h*˶1+PfTaɄ/]jJ_jzi$qo!6>u+I6:?HZyz~ _} ]`G>#>v;hX"C>v64mVZ "U}`iK'U)QJkE\*_>I'z&y,Ҽ 4ň~Nk0߁1nGhl] '3jL 3i4e" cSRuAɝ]yI'x4Jy#@X[ --ŖE]Pť>n(3=ʸ;S?;ggmc uBqf\5~ vZ'W sW}gCsz#dOj!]l>=c!'2Q*qy;:T"s>DX^֜W.YٮT>B:ÃzD/U xA R:dI^ .tw$Wz 2wIe&7sOM0u}7N=:_~?00+8P/u*C 8x6LZ|( &|Z'RQ.X^4+9X[=zPۤjU8NcCjl"oDK ZMrhii8q΄/-aEk@t ]tS:Hk)a_!6;!陭Hz*QH6"03z $ݧ._.^.J 8UĐr.9a{/C.]'z8WVmAh3Ba )0+fF%Ygnv0F3cU3El;4'Rq:BꙘ'glIBNBOc'2_]Mytf P̳L@M/d` ',(`yYҰ+B@*ˡM{P_oizd$amz;n}l|W!1V׳̒lQI2s*B,JR> stream x\ykHa@Dv ,@`N!C|6TLwWΞMBj_UuW߷X7Nzr27N?/TǷ1+*j?,O^jaz|sg+^si_׼Jq/VYJ2^86L./$Rx˗ϭ֢Zx05ry9u}*ͧ`Š_֪J7q%@j>X2<>Zϝ]~ZZ k\ MqB,?HwJ8ǗZu͵ҙchŸB[(A Moɹ "Eg2D5c!f]Mj%kY ,fZFt]O,1p)(AN&RR%i&07OrVnl}7W1ҝZ1a#}EKTZNфjy d>0Wkk֡K clL蠍R _{flXx@Օ^XU@o]5z4簖]d@4s+EmN\}kiwܺUƱ"nhOl7F7{,c0m1DtW|pY8e:ar]8~¤P *gTU8F kx?PaFk]>+`".]M`X@6Umt(z}E6,[M.-s"8O6{ńhқ&gW<۬yXWbC[*<3w@xrKGڪ^G*lcp*)M)C1!&wfCjy)`U}/̅h۷(H 7[jmw~,v *?hmAݐڸabG5mY@ Ȇ>ߨ32܀FZ3E gi#fѼSQV15p;B"+#[[8K)7̙1@iq@XQ4QB->͈tbV;f oc.S9x&.5½mnҥC!*囹HZWnCfs&@AC ED 2@Sw#fΡ@##>$t#z9dnNV `)D GU1'aސP VMA:(=9Ҧ!ytBǺe K Fg 6O/cPdQi-FJgI aKٛA%'GdΕ?3ݓ&R8X A6aS7R٦ۜ2$KEҞMH.H["%䎱J)H94duzkq{q`MUZ^j}Z'z3^N;ĈԺO1% \Z[_s%o"Hq7n#MGdݸWuFNSGqgYGqlNɅkbakoskbPLKѼ̙4q'H[di0,ǰVް1 q>!k6a2ψQ.p)*5.Qb]'1\An9؏`?5_"*Wz>)bpU2ٚuyPSe 9 ZƤ]ˬ*Qd]E`dnQwlj 1 0;(Ilmc|H8"%@A>!W-IW$/^o>3λi*d(ar(1o/܊^RÏC^ѳ^۸xH³[3 :89U൲|0ݺkfq.:coa?*:Bptҭ#lؓ::_4uA6D%INGA DԌs퉋I 98a.fPމꈾ*y-;6\!^\"Z˜u2ڀpH!}O^mmU 6\G&#%(Q %)pnӀ[V\L"kib1园qj`}pIo,,=#}GUYӝHm(}#a][mEݽd.pJٜ҅Ix=]4&^i@X˃Eۉq%缙Jϝrs[ָ_JP̍6qqePT#uqtH=7]hïNՅ"^Fy9ax-(Er4a'Gk9o:5Z*SR䈢75z :eShE*v1majI.QkaSVQk/ooE}yDѤ2 hJgspú pR'ңJhӦ{&GyN)ϷF2z<6a\<ԂqKׄ'ay&5QV;'o OhcytZ=y̱/Rw `5uҍMTFkrwXMZgHY.N{޼y&9gS겯N $ʏ!n,wn9Ä n9ƶ ,!?zbm%xgg)@ZeCm3;endstream endobj 113 0 obj 3840 endobj 116 0 obj <> stream x\GV@C ZQLfCJ,ΊC6B>îul󪏪Wݯgwg+SOuիwiř:W=ysPvo{U[ݟq箙CTW3?o-It~ݻ;1B0 R0eUOY/|:QgŴx{J ,SLfjT87LI~G~ޛ]5MK<[Gh=9 c+'>Ji[OW$ UҀbgf,;zуD=JW,QwJ{Ka&dL^Ur4LɃL~(_ƹؒޕԔҷ2Or|ot[ҿ2%HUKi53Z 7=ݭ"@L6[N뢰~u^g=N-s׀dEIk3};7/i9JZBB 7S99fs8^A  :SIKJUMlGeJliBJet:}?6'#ن!J&gfTq}ΘWMeڙͼ>ZqFqYYYW!bҰ]%:,el7_!VhkӐ?UJn@|Kan2 ځhP B~ K̷B/g=-t6%{aF4ݚ|FXDd*ףTNK۰qBmw88.ܞӐr fB3nq)߄}CJRh=/42%WbIۋf9%P4bir|#/b>.8|l݈%X pfx/h_-Rx'Jo4/b)4qr+Zh<*-ZB(g-Geh~yLi/Kމ2qI-^-\`xg:;vƴ "&[hHP Kx"T: wL9 +Sp!E:5Bf^oHݐq@C>zt; $lɵ5 +b4SML0 sP(;-Af |0݈.,%9^Jcj$#Jٰ#RyǬ6/aZBY7aSje!pzŅlkl(dQIEZkzEKDXB9Aq :؇,%wCJV?oJN.: IDbyN^Nl MQ(GQWfP>}z j@\@f/vƷ W]L4etCuZh :ͷ&EEp9{9Q'<3@-rL8$_{A>|Nrq7B4vu\ش6{%6qCTԯ&'wP@ܽ).z@w]%G(.0|WY-wfnʼn]wq:`-2tBS=p{gY9W)l;\@ Lki%jKtӏhqwq=Wۥ"3<\r>8œa\׋Wr ah^8g\=44elz-.4aB aWr4R( LJY.V+UWW!v~ aTA<^K=2D$C ZJ-Zֆ .Pk΋Ό(|T|tS{*/ZgXch* ڢ$J舄t2a3ZL?W#]3+u p*<BBaS LM<>CaȘYa󀗽f{ָv~~0`@!mgŌa:vri2 O/zx :i}`ĉeOdCM E[vFYaJY;Th!gsasϱx{Jǘ;1 83 {e|ǢXjgf3BkД3 qV*SAQ QqiHzAZ:[p dMϳr5WɎqq{r$s]o~ ^}W U* x D^Cu4rT<̙Q*[Zi<oUÍ?^Q=A6f7}KG.IQW"+ao '?Wٓ0*%&@oRHmAʕ 2 "lIiCd5;G`9 ZTn zjiDl`ĈKnV-w,S]ex@.8]nb-g >+]ѫ9{ux \>-ts&[\f"A{,8j!I(HгZ;j%iަ]xԙ[e"C9-^3A!v*#fO;Z=l$aALzA fj4HCwW:ҀM7=ёDFYhc} }% =:[,aQS7ᨫR4ʞ2PߙIG"@P ^6lmYjV߁GfjGTdq T> stream x]W"qaElvcCGN8xR>@d9> DS=;]=]=Ǿy`R{vWGW|a ;O'Ony7lN{l#]ᧇ'_N}"jUݓ/K=ow1;~g}ߧqw{pe^NoF L: ]f7PI|Ё›Wv{8%v{Xk%߾jWje5=MhχMa`x<=gE=$]J:jO pFzLeݢX+WCsWPy{鵖s=/VKIn;! _lрAO=5"a@]Udct[J W_KWQϘ]XO 9iN51r&CO5l8,q [Ηd pu(*'ȌWLooŠSz#:x]@45`a xd &OX|6eۻ1+-LS@"G(yo ] 1JX -Ӿxfr" `^Kz6gk>^mG3ƪ@ʛ917E_D Rt)!YGOmLU 9+Pʺ%UzL{8}Uar?w2{^ ~{䳓]+u;0#an64Xrqxql=G;Xl;0F/6Ayrvd\iQKM5+vֆXރUYS{ ݋@gic<] J zF=Ppa/40޹\ ?_"[{ 9`_ƴA,ܷnC4^l[_~KI{ 5NG س|wp揩y'54oKF@YE@ WJυH@#aEOnw|[r̂pV J#I#N}ԢdbވuĂfIPS6y/Xl3[[p\X|GPi'_O^ @L؉H'sO>~G mtЀ1 t4'ef,& - O&?SA MH7C&9SC/P8QJr$JeD (?8{&[4 J.c@`J9D_D-bwљ`BRx:cb@0`r`M"g :3z}N͢Y]/L#c4eQ"A lD4+蒨3lS (%(KQ*i/Uw;+yIyVbfL5cd@?䘮ݚJbj1aQnZԾ.ͫ\2=2@ExTzc%Ǭ,hY"T^5C4ttfC \jDemrQOAF0H2V$6'}Y^*ǚ61\ʥkM~xPYeliotQ ٛABjЂNxQoE#u%U pFIj L{h BVK(P2/%h]ŀax/S84Oj$bkkccΈU *#VEK)W!/ W^hAmJlCa)WtE[0D.',:R4tX]w6lWy2Ei&kԺs}Qt 0^yj\>+O$Z^`&s.:x!9V褍\iފ3 ;?q{U,O4[B,+jwMVju(WJ-,d,pyM1)TȢ@59 9STNVVMIa,KW#huEbsS[/b<+淗e,"P&fd{*"߷nPPgjQ̗͎ƅw}IQ2c*i!6( ذRי2kVJPdxPMI/+z$GiW&3 ԀYyL76 f*b: x@j<~@TKCdDâoi஘Y1NsQ`3BDBZy΃&=頊aѦVbǎ7 *^#͌a0WOM4?JH!Y+4 &DfD? @붺?t's}& I0P9M)F\a@/Reg࿀bRBN֫V,86)+Vua9 W4'L>D 曊2BK*Rszfa~`RD*#T Q^{ژljǂ`BHs҈)VdӖ~i^QK?H;꺂"}TtϙrMH{g*5lQ%TNOV_Hl N5ѯʼCFPF&DD%4d-. qpb|$S=LâCVl#/3T&N,k۽W*l畂/ \+jM}r[[L]q JM̝kX⵰wޝ%Ky#%pq2lL S紏v~dppybbU0`2Ζ~{>mԺ[)o# -F3 y*ܓ1nVz"i|(**UԄ؟eK:Ďc%suяȱ]/|oayk\o};U5R;IQm,eRl&,=X|':! B֯%ԤT [3CtR(bJ,R&ͶZRPԒPwObsbl9Z6T}ړ/B^z7ڌIh 7Vᒵx/=,B3X7ZZZ!`G֧xã!a4zf7$r%a!+ W4Yׁ7\rE ӑ<+n3$fV 2xXS(~D)E_kC|/t芥DcteɲܙUӼf$T^HpK?ۭk"OiB+BOu8x[N/QqAq{>9$J֟2)kǥLǛYTV|Ks"X7E%a ]eAcIǸf~Dd2w/tLj#StمQ紋f ]1f !C'f:_(ZGRS&Q!C@Wyz!E42$Zr{?eJQ8SW(_c$-Ҍz'^E946ׂɕĹ1`ݥ-1%؄=Eؖ;r%d6jnv#8Kqc)_z+~HkZۃ Sߘg4aas;/jM,O>2,zR{6i#*EvS^tm'50G/~žtv*30`&=ҀkGc>huG\:3XA ʏA~դCFJRh:YU}9iO.^s{owR }:i[hjNnEZlvtja럩jsJ[F7Jh_ZS#vW.endstream endobj 121 0 obj 4902 endobj 124 0 obj <> stream x\V"\ADٍ~?$l !x\ B8Dw6m"KtwLݮ!Ԛz.f,}6{ kdNgo|}x]gͤk8t?_FXߙt.7R;#^87~c>=|d`_`lXeXF[0k X5|V8[GH.`3y\Ɲaz͓| 7oxWB~F677Yۓy72?}|9ᬵ1L=HhJeItY'* bSD34.[k3vhsMo~I|ώR,Tfj`^-Vܵ4) pڶ8/I#~Xvkں~)V1P0h.G~^ԩ}v^xhjZf >J7RRۮWbb#bhH0mN9U\9Rs YJm.~Z_c3>'vs\üt^H+Ο`sB;n(ֽ#D07,/~BpDKSI6TaL0 I>+1"-ۉ?#d9ό'{-e%Oibdۧ4`b4x\{bjLL[LLYvİLAc#c v e<"?P6mT#E)2킲a鶳p9vCR Rpu a N9[ 11)s;R10.]  _Dk/5]ujʓ{Z 3gdƪ:lj4@a8,?z`M85M1ta?"\`ZAN̐_ɢ";8#{́l4V}cm_[[>6Z+yԨu~vSfLί/Z? B;%R7\;_Lq)O<@]N]=ġ3JC'btKTJ3tKCC zB[jcI^+-j|+~Hɹ"" ;Sj ǡ7\[,}cC|&NFkC)J ١VHzВrFp=p5TR嬳-@ѹrY- j-l F3:vĻ l0 $uO v}͸AsMʋ43Ȕ66+Ͷ[ni%1 wwa[}˭9bRo&naN]]zh{]uUpBj].SLYC.pxEOa*=( :v3!!W.j RvMAFjƝ x[88ϭt⥉ m%{ѝ!H *i so{H86 t8 ϜM,RzO- v̠gz4IpHoćKdxRI4?P~5kLvP ` )sIbQŚ8hFЗ1dVryiF,yF~a%my ڦ@4~ 7Lzl`(JNlbzb-/hNx>5t%D5Z%gu00ҰlE!zMM5~6"{/\]*.qڭ3/ʑM:e䮑'x/LV:BjqrM8'Wв3[G;0n@)UǛUqfM 'Q_$MqgÂdBgq |b֪|GKP2r F94h!Qs>)rUX>6Ft "bU!酝тD]A\ۻ͒ZO4z\#ګ5STUtvx5 lYׁ~QwyQҫ}-ZMJ8[yB {% zTt|P)3r-IBL|ԲHOCz8rVA%A**9BOq _NV*/>A+ahMɜy.EY [whKy~5Jy h ߩOO vXQ`-d#%/PT U#tzjc!!`nI"GZt@mƜ WAә "$(eVBtP]@xyeީ94f̯&>m\\kwx1줲 a{3..n@!S3u]&xQ&XK7OtpL& hRB}īFY"bs^KҩjNEACWR)WQd,jk{2[͠63s4sQvR1YS`fLPWdG#oÊS2 ~sQN#;ݵْR4'EN6$7>"# ݂_0 ޤq9W]E6̧`S$99]r2 ya OH9tېB^],w R` DvEԧZE^fX |*œEEEwIHU =Ŋ/'{ч[1Fe8@4Ef<*.rxX"Ŋ"+&b J;QPϻ"G89rJn3$%S=6}( 6 A¼TVHŁ Tֻ]J@Pj')!jP~!,>;׎jd壉ūocYBnUJܤ41ʽ^aNdar=`j褝dGùWsϾq M~zwxY%&R?rLbm9V&kG۟;ɖqpm"̩WN Z,2Iy_jW|endstream endobj 125 0 obj 4136 endobj 128 0 obj <> stream x]WB _ ijQ[}߇T@#+Urp(_cx_D}^{<7U\X6>`Ww\%ßn_={e;71[gͤ8t`T%_\?V{u+2;?[ ?JIƳw{OɎe;"2-L|o7{, _Y+XJ[t]Fk'3Fc3홝) Lݻqps*/px3/Fz:ߵ.oZ> F$4gy35O{y#5IͯR||AjNN;y$9j^%IyiX73 XV@uH13R4I+-3aNB:_<<`Lb2$eJ>Um$Hh9Ck)R;I"iO>ɇ䂶C!Gj[rǫU[9qCDnbR=AO6 aGs4%H'9)'pZԧ *!ii-DF &񮓢qcЖHrk;E9]ߛT+o>ѾxVYO2Br B=֡7&T~RߋT#wMM!)#p !|Dx5pl+DtwCp;1ڟnZ&TW0tN!ͺw01z]XBTRxO,Jb`+5ba77Sϟ =ZÛs0v֊)K=?͇~GDCW &qD3t9$9 I3g+\;O^DYWrQ)u\FMbQk(ZhqC%n~!Ȣ ݢƙHBfRJݕb+J%=]_ ^WkJ#5\v' E߆w0EyQv˵lm3UeI4]6Dc )9ӍLt1V[`Ga$?kƄpK_IxfO5V)]n4si iތai3xӉZ1[>bdg`f*pPEOkb73awF2Q/6&j& *,#S!S i|-`Gݾ}-.[-%L0r"e4OvI- MTcU,I?纇+Jn3@:~*~LӔ9ޔ6̓2<9a% n0T]o*sS҂OOMH1Qnդ 2V3 U7Auyl'z)|x q)Y1 }9vXs D 9lzA'eBܙξouuE9TvM6p|JTq ҭb M6fNU1(4>z| ;Z{P0dwӻJq́7qj-T3+IHNyx+P%|'$~HiISjvds9TB10Ihrt sjWiФS 0t=-bP7KFpخ4c{#/0 =4`BXIмZoC"M }q:kQmODgۺYZipYiKI.Jo}-P-e%Yy/]J5!dDRBxXJFh+m{wҖL`^=myH@ӹ6:NMdY/?`F{|<.)T܉d2GƳ[<^]k1;9͜ k9jUrT2`BxQ ^J 38SC@Eߺ C!u:@_!@r)lѰM.ܠEﴥ[ۛq.p3vLBؐfՕigU`:1%=sBlTd܎yn^?8mypʭTbA%[m[&]"i#G{(F˧)_G R'فϋASl HcT~ 6 }g!94p0lԙI JDkn1cHT:$H( (젭$w3?j7m![W1 t'ɠ &iz"1:3α:<٭m">$@E@Viƥ+Z$9q AdBӌrt 9ܙ/ȓ/V (+Tm_@ 9F|%aZΒX g.|4AOM+d"/OP+D!.` hd &޹7֐X& .#]ԛYմ<, Kh ˀfpۅP\se\FQZXУ]7RD?$J%7I*0Itןm `3^W<0J01S WjZA *O =&P$0 P+c+0*rPf @Eά /" L9cX 0N͚vS>m>>%7wjEr>Ya`_fiv,Lvxj FB1y12F>;b${f1SǨuބ gY[;FY.b` e^nDNi͑OViZ)S}~Xݲ2_NJJXp!PkL>]A1mTţ}K{PF]}TDJGTw HJvݶ/YVpYqoP52%^хS>A䎇%1sLr"v F(^>Qf 1 }k$1je$5qo/"MC8SkydXТTS7S^vlTw;v^xJB1],znڧniuԛSm:fl]:f5XVɃl˫O޳ 0rht5/uǡWm5&ׅOendstream endobj 129 0 obj 4783 endobj 132 0 obj <> stream x[V؇G2kk~H9%?@d6}{]=S{ g{zܓ5\T,',X!œkdOw7n7T1gt o]aKpi_WY_^8| ?FIƳwŪ+cy\R5hm׀k\@K췶+%.WZxӓQR/BYހ,,팤O;Sa480㾾00Eu:Ӱ?&-0fjץ\z bK*락Xsij\k9Z( o)άIg@<~\F kE"١s& #t6郬ZL؎h_+pmU+XńCƁTc)5Fk a),e+! #vd*[&}k#8"w, ʔ7=h_XnXP8љ:FYg^`;Pttw)cgcɹ uhKOB6N*2xCO S#}u I))Ac4Lr%`DK щ-.aHK^IE{%@l*=M +@0K6#c sa s{ztFR$̻Zq2P'| dD@ l.XfQK¯N$I @Pˡ8;sGƞ?N$@ 1x9@*NHF"]^`V"L= ř+haM}/" SCZtgI,qG+w]' L7[MZrt}Y.i?]_k2g.tdsezkp%az-E A[QL w qJ6A|g+>d|_ guOlP5:@dIT{+tKdLۢI!=NN%NPLkWڻCЎ8 :eΜd9>b|SPIC_3Θ z;&Fdc"D$JtN@"¤֏+"!ݗ=ķh(nбPpDJq줹͔GUn-AɸvHVEYzoh4(fokcC'.Mg56g` %RZ8)B2<306Fi7/R`A42iR`^ +xɏ Yę8l{@ua {JIt5ֆ$j=h^sI닁x`Pڜ~&jŦ W<  T8f^W21=?FZsংxy%쪴g9FCMra֧3Of F4kDz(.gt PqَlG-4n!1:kBs+hJyxTJ[FГt3jHBhϠ,i3vdhq g-QeU~YBgLT/Х,XD4lsTeHZe]2x_♬[Whܣc -S7ia QXOp2׏BYM*K2 Iq Hec4g{nJ[OlW@i! ځq8G8I j4Z ѫO7ΒlrAiRǛ&S$EA V -e`A7PJ[ K7|Ȼ4X|\6+ KttQݘ Nhzz]{8)ƴ%G(B uԜc}/JBT m:tNxXA6u&<{HEPT>4ƒ)_.,R\h)ZAGkZſGXvTT9h "Wv=ރALm+ E }rm"Q: -lB]@nzR)w% -v :VC;}}O=0Gh! -=nρV"fBՁEx(|olWY%~"%)vij,=9|DK$1aHH)z;4;,͖fM5UtҘ9QdPܫ'>"b%vJy> CňL$IO>clg%h|D Q``AP%~<]% KCa> >!3Jy=bWw=XفJ%mcBIO FY[TZP\ IIkw@!pcPTBQ|r2.u)ij Yq@Bq"э*p'UQVyBEH|􌄰N8hq&j́8@9q6'Bt*fgm,S%+\Wo&_-e獜y`1_|HTwj>e$'9uWVNy?;VIJUITjvwԸXnL$! ]mН0_ V9RȧӆZBk;b"^ÿendstream endobj 133 0 obj 3805 endobj 136 0 obj <> stream x\ U"mJV5o{IETysB/ }x绽$mH={-T&GT!.Mj .. ^H팜(㮜ϲPd7˿l X4 + )VL Yh+@Ha,rrs׭kp{ypOP.pٍvzBOZ>~I(朱.*Ƀ-dx#~l;-tBg[s0.⻷x)xFnG>Aw2mzGb E-J7]x *5cطV;.ՑqK0fi@;X+ƹbr&ӟu]."j/QNW>%zzgDv$Wٿ ;oʙW1zj/I8=|>%&@֭MEqw#2Nbdqf͎5}ڡlLH!+U[õ6w/-f~`5 F諾 B &g Qh-M9{FzPVrJGS7j]~.5$|5I֊dyYq+twUaKP}>h82k$$TgVLBеZl'6ɹ#Ny ے{/ّR۳9hyif߆R_4XWJk?Ww62 :r V%ƍuиM9:|PeY7DG7(d@p}'̙=GBeGin\nS\M.Lׄ4jI j#nN48q:U$"$T,twZV`Z0o"|M ثm<-# h]v } Q]$bČgf9R"q7g?ՠP~Ot{5xU[-+ZZ }B78 S0`n4g/f ulcҀh7%oX ,}BɌu@6ᓓn!bxgA Ӡ>d]+7 RJ T }nd1+bI y}6fH{_Gglggw./̀LH kzw׏G*ޝDKT~iH3UdIɽ;)y@w8Z`$z)"$CJeK])ALT#Ҵ*PG%L&;*7 sohđ:U7w`+tBX(m ]CEOI=E'c*&ϳ< nw[3N@F4َ1x" U+g* NbN'&L2Vƽ*9V|R8ʰ*W2_nL[Y|Ҳۭ9`SL"wN7wc" KE_:㍧ !9sSUWX{;>bUzR4>ql^(I%tqʚ^4w7VU0aQEx#7s\o`n̫ZKA\cPD$x^n*e2T/ž~94_ jd lTX./0s;^rej3.^[&~Dg~A=w*rL:=E{ Os.gCmf C`&^i7H`õq`FfEADuXvCU -|A(ȼgp9 H,WoX≓k"zT%!?{GZM6 #$d"Kwx1uŠG,kO LcuyܝN [CH%('qѬ:D-He`3SDfx#8iQ@" w}Ll~W Ќ-atW Bn79r53r."s)).dnȟ/y_ oLG_D`py/@ݏUlגL{KO0޻.[sopx%ʹ<ÚvFK>e/ߢa;텷[~2>Q :*x2ߋ>B? \վ~ XpeSd HºlkpdnmcH3+`.0ݨ$EH_m/%J~f!Z) Ň$뢦bW0\--\Lŏ*~;\ 1ژ2h&+ 7VUQξ˂1)d2zU Q^ #T1-'P= K˘Ԥ^`s4-5]2 )[(x+4.oAn]0ӧDtR{V'Eܝzɫ{`0,?^<~Q1 D,iڕM93fw|RVwN~;<% L:LroڲpR^GPt* ev^]J'Vr~CF?#܍>ÐqnJ-½P|-uoPl0g@ނcKh!vjz ftxzm>?%YO1 p1ʟA[JƐ4vY^a\k0TR?ʓA溭`&Jgnךendstream endobj 137 0 obj 3440 endobj 140 0 obj <> stream x\Wd"qLvnkؖ26|Q>?=語ٽŗ,fY]U]` =т,_Jpqr8|`sv ^8VH[qbJ=W\_K^j+Qi˭[*RgY)x? ( ,Vj#H=QSOs F A[zOeߵw0| s ?[_=ғbY4y%lqxszoqp٢xE"2Q]*d&gWfE\_wܶ\v'Upg%Ki<\k, xhfl(lbPy9d?Iv8tSXԽOD{s9ޝo[2óvu/;S?g^!=%ލjf}wE <;rUx6]E@ 3ѥUg^g79.T\H2,ՌCTaގw-R7gW#u"RԝH&A_NJ ?~U ?&)۷|%U$x- 8JUgzDpiGxHt ֩8;HU;$ ٘H"AC?A[g{@5~h%$4RB'Q!{F>GL^CΜ+\MoȶHV ~wq]w,5e]evDlvM~  Xױ;,fck {<=9$~zFV58 P(z R;"H1j}dݶz+LN.B%-WjFH6@`& 0c0ny`Kx O/&t ..XLw0+54ԘMp~e+ U18Vjr@<.C`"S;!L[#ȍ^:xk/'&mu۱jU sc  0^m6S33&{+m$q6!+7cRi% dMzKˮZNlHQހ2.rh$^}h;J]ࣅZ[0,3Z͟rttաf;fvye5' A^5d΅:5?BBVq"t`srt,H u9P -d^]t%YVjΑ ؑ #Omڦ^km]=(ꘆ At p[DEOm5/L$&*':ΑOڮ 4HZiQ[׌pq6ﳤ;̋q͙ix#%Ct܁,ܯi<MRLHRF\u݉9ZTρQ_!xLԢ)(p *+Un\m _ݗa͵Q Jc)⋏57(j= AV>tGǞdq[حkXlj$\?TVeA 1'HIо8>@cYt6-i¼AmQ_|@w&}73 ]Η)@P`LrQwzhwHR#RA/? :!1{ CH3z5}-^'lLx^OXH>*  6:כ\#=Vtd>j a4)c1]JhdJFw}E25d ݛa1Dfr?rE-_cv#R _*o$A^#~H68yZDl2Ev*93m,0;E4]"}lm*TJG G *&n)>$~= FCPR<P(A5IӍ (L @&$Πs Ft&N|ukٰ6k1rl{GBUNl-1K=1z˰^!Jv~ 4y݌ׅSiKs!GU6Ϥ pzg"R1S=tۣY8eP+Ee/8N#)¿fBFCN@H:.[h٣7 n4ܨ-ԎA.8- k֑u%VӚ}hAG+46Rn_ o&w)|gįЃz#$KΨ"\ /zD{y<"(nn2u'doɶ5(xvφ&Aٮpf !lw+hUtA¼* 99 ۂvϨd16...qrc4X-lhb+9c%,oaMWVw,^C 4b`l]p]Ax#,3W5}"@BB "4.`(_66 9$#-+#5 Vr|w]ܩzbuҩV9kl9|8$+y0X7Ƞ_&2PYܔ 4׸fP>]1EJ9(pn|&F1Y a*C߼m@c}-m\ul z0pkUГ@Yɳf4֝^hjy&<s҆L l&ߛ|"o !ƈ]C5VR#RX3PCa@ LD8d!ɺ_c<BrIa8tm J3>V;йF̨D?Gt/M4k0@w">Vl7kl_*`endstream endobj 141 0 obj 3918 endobj 144 0 obj <> stream x]WP‡`0 ww^߇d[')|0/l|?>ݳ3]33vͳbRi_=~Rſqhƪk߃ٓe;GG[7w̮gt5?Z{&UûWj~]Zjg/Dmw~Dşe$;_m4F:6 Yk坘vdP 9k SfRZɻm58Ɩ[>w4R ND"Lχ:L׉'+r=Q7u-QU.'D gQ#B?0QѬ# _on'z p0I;jc8fW_Щmve4K.>Sj,r64xﱅUbM;: U2L( Z6BZ<+族xD؎zG ^&kd1jۙ caPZIH ueff A3Zy;E[hu oy1 Vyldۂ-Ng:u.f>#$mJp2mA:7`ЋmqK9i4>{GWVjt҆nvh&%c:g'[TaWx̨ /8%η \3KjgiVGC-s+x 6+96l=CE^ ( 5GV*ғ@O_M׉3p"H8f3 )>9Asf qȞ-NwC :;aS\/K)lkހi4\Mxvx'd /ڊZ/GG'в:(xM $Eojh<3l S^؛̅I,. v;1S^ ǂC\z6Zx(A<#zZx> 01+ [O琕[dM'tBu/)D;5(PJkR;ƈŸ=_)Db)IYr/:n->׵cܡ< x8LPYomǜ6p&Ҧ*̇=G1,otՓ?TX ƚD$}<h}M4oHVPe@V$-+5T%B)3ÿF4.v>%UZ-KR['I4Q'ꇑ LK9KD=cN#/FG@~ 9 ?S2^r@n|fV? vI~c4=9"!?L-,FyL4",Q_!sh(&|JR M.$ !<HAB ~} #{"ɀO !Q'&>E%Ar#;xDۥYL*W3/SvZƩj)L17Ź%@2D2(C5 | BJeDaC! sp(4Ҥ]B,x" KwF#Wimw&vY[Q2ՌDe?;U'V&*Ó+Zwڡt]V>6BjVX{HSr}#PLj66 [ۦ(Cd~X~U\tՊD^t 7ۼ $FjTVBdBr]tto Yv1d;d)]BX5Ú@KCg}̦3Sxit2+i/)(d-hRC\ffxla: >'.+ޮyPYNEPu=]z 1rIOX/t^B -UAJQ \&plAhLg hRJR(n*jႀޢ ?ŕ{-xIOn.]ڒn3)0Zq&eW`ѱ?|, a,盔 PPZC:~U!@gX18Bx&U&4qlׁ.q8C쒉1ݦB=|D,`d% 1ɚdo hfґmB\C.1Cb?PK:G7Z1lfxw|u㜡Jmx7ht»`t~5(x@>#ıD'bQψgP5^AKSejψ^݃D].\k&rH 82d xў" mV2BĻ}n%St1n|aa 8dtxd͏GӉ6,x*VXiv"cwhƗޤQ68ˉǬ3Ne_E6trRwb:590Z斌BXhb{\iLmY樜)+놾 ڍhyaP||GS$T >VaST .ejQ|ENdJVU^rQV"sŦ``1FQ\xIQ*;o() J!Ci"! '@Jk"⸃} E nݓLHH* BRf>  Z)?Lq1a Ļ'&Nv E{ hLxѻ'JzDJ"j:/(INQ4z?*"HjQoý>` n*Vɏ?+÷ dKvQ3$yŝldhb5w`&סڴ*ޒO{9q7J jÍU xz>.>=I肪u0/ I p6:WEi .<:CZb~6 _f8 J|1c%.ύWo/}ٵK0|Otj<}Gm>S>yFΔwC憺NQ @3pPͷ7^\rI{0ֿ'D~c2 kdDh]vrJ=uTfL^t/` }/;䓟A ȫiK7HG|5k|bSk_:H&Kc> stream x\WKDE ()6bN~JIC$*CHP%'}>/YŜ=q߇}7s 0}vo_Xc=KplgFXޛZz.7R;#|) ?FIƋw>?db``lF\F[&DI!Q7r$*1׉<=I rr'y&o/3fO ?FÿBgWu]arϪx>j6x#!'NA#73y'3娯ZJ ?Gdd2i&?vfwK eN'!!f'kV'e?|_o>#T-xom/= iRykDpA< &QBGtCOPuc떤$rmXsJخj.˕jkF>+zNH!}*RSRaESkkeg+8%?.WJ08f@je9$Q5l87& unjzQϨWQ1_+p)WFAMX+ eu۠r%n\X€~@uG694`C' ؼsaWw+}sջl^;ʝPlh$!aw9sїvE$iC"Zo4ƹN+pl0- X:lZZ*nS0~xi}@i&¤ҬSM0eDz0:07aOK ՘-˝nC6\;0R#qB.^K=ʟbO 8^ 닭߀\VNMxJc/L}iW0C~hԙZRXpHFvC%}.)$ՄUi YQ9}H&:c l>:VH/(gdvy>B"Ծ"z8Vͳjïv&(TځQH%, 2 #M9oj!=;|Ş-&d׳7"dž-h) J뚽049G梔*t h%B7Cmt[Ciި8*2Aˈc VU0CĄ+5).\VΟB,q0,$d7OgfTIԘڲͮ,#j% +GG=`O:gb{Ҧ}{ڵ6֕GDLd_N^٭ RߟWM'="D!;p E13zZk1``K_%~ȖvۋDnUי{ONL28*9 ޤr=RGF5"1ùhrm!Q6BKo^xPҫ KʧPFB'.#"mÓ@nװс%]ƲF薝ONұ ѱJ+tq\!n'4oEpA4v/Ru- m[#TVːP} ΃dzxVMji@ d@ HF:I Rܬ >!T\{DqdL>wD8tZy'*)w YroդC' ^O)x}%to<ҡMGOf&(FBгB:lC*  N\W[`bq.^"kAM52ɀ AZ깕GutۦOz&&"ih* CpA?<=s! 5D=UGH6S0z" T6c;I8}~ Lbn/ {r]y| c^mUUu^jkSc& t# m"=ט{eL6H1Q~s)=/.lXu.TbVX-׶Lo&bps^I-h)&𱓤F`9!\g7 E: !lu  J4kF,mpt`C #æElk5Mɩmc> aحB7I`H )8;ax 0=)8BK @3ib qDtz@*l\(]?8G#᳆e9Sk`: V >4AEWLH_#!uR, .uǏv{.rl\~'mFvD>NRܫ=}t~4K\ɿu)Ǝ똆"\;h'pqYGnl3< u JtȄ.v\Z;K9S$f&W"}Q=\Ü,UϑnTٶlDq`Q^}'DyBOr 逨=GY9 #Y3˫nFT!m"˲eH8qOys uN:a wl]n{hIx".7w(SyK8H&Uб$HtG1sʡ6b06+^/RgD"c TDm~! Qqv'9q |B@߃D] ksyۃ>?lcٱ؆'3MR4*]k+4]S V\}(;qAcۖ+8'zY*FЏ;%Ru`V[ ؀ ͋ sI8x;V+ݭ1o[녰_]=ݱ 6oڠ`ːOgqlZ'˭?K-bf7Ă)O]&=YtZc?[endstream endobj 149 0 obj 4119 endobj 152 0 obj <> stream x\ 15J9L(AQ"(0F`bvES=WUT7@@Hż>1=e%*LJahtҷ?ڦuѽCѴm_CVth$t|X?:סQGwo?ZFjo[u-mӵ\?h!9zb`=nlwZzmLԭ:D}1Q'ꌙ ѳpxZrd^p+@izYnVڵOVkxﵤ'})ZFo-O HДŧd}%+<2bw^形cZ;C ]_[h),j|[%)zdB= &]QnLܼw9SjӶ3C^7-n0!ц"y S$"9_ 3vZgLrA]EPiR1:/S Dȗ:ϭvneq{#O&/jDߩQѡZs]<[W<ESf^.x oVzid,$R @@oI܏P}tjxZa6(Z0˹-GǢI3P],cNuy;xeCx.C Kz9QoyY+xҢ2Y[Ot`ChS˜,<YHJ(e_pR'Ț;waƛX) /ƱW n}QF+);|[z 'zP=W",:W[IP)1!>%,i Om*W]uNG_E8at[L9*枳Վp1=kQ @4ԆI6C|S|چ%WZbS;A.9&L1\i- 5MK\F @uM^4G lDpd5ˁcy% ],9;bY[q'k{{_z -Xcñ+W"HC&ēpNa{ h!59-0uaH ) $l$ vyN!f$1aK 0ifw9 TcMZҒdu͟.BLJ}IqzK u$&^"#!Ҷ"o-2H/# a)e2UP{#\l%Vr%ٛ`vb L记P$&ƻds>t͌WW(V Lٟ2:41 T?u &Zħ,l<:|¿YC ^{ԯѺ)#tq66 dsTZ!=KҜ{ܟwmBO:%s,W7s`ϣ5n!ѩ881^qJޡ>orC[ڢfL %T؟`ʂֶ x6`+EArjȕW̋y?غاV(v*..W#.HЉ6^:hrWZ13 Iay,H Rz'[G:<1fj߈DDˀiW%-lwɽ&V \r)Ng^8%,Sj>YPI!V`?Lo=Eƛp+8LNXE`;"__BF<, dֶ~zkPu:kM3qk%_웧 *6kxjяawpely;{~5oҁzxo.Ndf^؆4yd[|h[{#zhԉYR. N׶Xɋ {mG[c2vW/*W\GvrD3齜]%:iHC^ȝ}-@W^hL;>ߑnnf/wﯖNk'@)hP.Ӓ^rb?z)|M6㛯1U u~g-OZ n/[GW'̯/*f.~xc(3 =fF{بE0Gl1t.&8TgR ݷr1)mfzLгE 9^, )f7k$W9>L\p?h'\lϬKއ qh!"ۨO6-sw,M+W3,Ij5@ nDyw1G&L qiփ|2׎ܒقOKZ&j!'k*}gNmT=ovv {[ߜ;<ǖ̾[#`ߛ눑=[j;+72["Q_8Br<><`|ڟ-:t~ϸqhcTkf܇k .!#(J{!{upendstream endobj 153 0 obj 3625 endobj 156 0 obj <> stream x\oGIy8R"H[s$kmalj}?(eIc߻#9CGNZ00"wgg罳C= "!U8Egld8=HLdI0E"lp mtFӑPqoB)N̽Hc H_kat$ksOַ"`R.Zh5[%'Zĩ6R {x\A+ گ  `ު z gm=$3 cF {L |E1vJc.AzI) wGӵ~Q Dz`!@}\<:, Y <Ӏ.!K v3k|֔~|8cܧ@4 `q}Vh9CaGP \- .̶ T\_t8ey q=Y~uƖ=) >$ˣ`.G[Qh֤-׿-9Ng;tPlٰ?fUI+wl,bL) ̉X)0'YLLb8 %Ût\Rf;]V2 [h9&kG Kq TS. HzJ^9nDoɪɖQB3ر.,3և͌=}u2d%89dg=H&DLCǦMlՖm'=`Jgsq1NÖ c_@ zǞϸm#m6b! /׊(nlϜǬXɿ#)G`a~ٜ1 7XPig2v2 vG{GpM *A`V ЗQw5P;~DuX(%)ua8 #pe& {񻣹( ʖj6qV60QH P $&f-r(s3'FIcƟ2*+w8ؕDkT!܊Ze2Iʤ[r5 BڄOXjI&t"tQ5p ,{V5F礴r_wܿ5}7݌?S'\3$08+uIz:> (t( tb@{ 8m/MԪF Ĺ%"+sJܰaCF60J-n&r7KYA9O5"`fxq 9VC#[@|b1>ř*19 !cX%6!o,~FLT5C^ZMmN !vIqH+-ӱptCdc#dX-2[78XbaR~BDž=vE %Ev|{^rk:%C0jQ0&Q'JMRUq^,.=WLfHya"I,.xuˎ/Vx]A+Ym5Z6bb!:`-7pp]f 2PUCAoI|HT $*tf9c"6`(o (G᪥Z5x3*t;]*tg~ta3<4"d$yr2aX{$HG\5 -%pgK ͧ Kkjk}'nZf8o2n=-MIIe9ҥ}[Qd%eIRs|,-FrWrQʥ6!m#Xę3|"hֳ֝|{#c!1nt9)O)&ke{F$t<26KS9Vg']jp1倥jʭ8YJܟZg*ڲLКWI]dbf4뺊("M_ipNh$c>182,4wNz;^s+XU#Qz|y1w櫕dku8% igQ΅["m#*+^F:/5?s(AXalZ{e /ŋ;ct:v4i-A7'AiṶEup()SN/gh9k5'\3%D.d bRkyp /n?2>~o%e5UDjmh :P*HM6=Ce·f7g}jt?:ɞ])jc<7] D _ј+FuM@u>zwm&@#\Qo\>pw.İ o ^  vuwA7Ѷɝ?iHH3@Nm ~KYՇ{..=nYNWJHH_5cDîzsw?^`_!gW=$"cvt+Ƽv 0hD d^c/{GP?wN3&r,!ߍLendstream endobj 157 0 obj 2752 endobj 160 0 obj <> stream x\MoFE{ rV~H" I:Lzp|p$V 9%6jc3\>iIFb3o~#\vO" c^?.P߷\LbA`G"( ^kG]ZGs :lvh D?tè姒|틮︙:GC?@'i[_ $>JW!&4NB>y*RiJ(F>lkz?&qN6Ly"z,{OI"qJ4z-v]v\PSG6tJ[Fo֫c*3 -܃ U|qDY)0BpZSxw.W2 Ta)]P 5D  O0.757Sd=ZC+JG`3v3W8A6i]$QHOг3$ &z+WH6C Q^{ k֕dY$֘W$ސ8>C (P]5o HC"w a;hd6{ w8K'L>V2~B>Hҭk'|rKLS]r)BF@^S/W>[XԎ ;_zvc/[ Ԇ%A`^biw>U-J,vS v㊖U)Xwr˅~M9#!%NBͱkF HzS@4m0P#@X"lԵiU;hȽo}Hjۓf#"3sSg$o!}f 1z$Oʜ(x5T ѵ> YbD[W{@3JtQXxw #9spJG 6F>䐋5a+ǚ廞t\QQ^y MG1ffy͑~ G 샺ѽֽRlM/9b(^U j|k†^0!pԪdIR8\,mq2;\1M u\|ˆBoH@3LL_[Wla!WY,&>c>a!>@QܖܻI:; #dy#e3VPB!NQnZ 7zT̠ .IeM6ڭDό^M=3JC]M%ϕ3m0(ە6 ^M&%l-MyS?yp7:4A O}1C`*`O`<'^6wcpM/Z4]0~{?k Q͖]EL/nnPq_j82n^\{ `.{ d. XƉcoE8?L< , "V >,4_5JH 9aP1 r6P8^p93*c``:b[[R&ؼi45..?x~u^رK\`)e&rAMexeKXv~-X*y2~7}n/Jy&󿊭?sendstream endobj 161 0 obj 1614 endobj 164 0 obj <> stream x]i7{6b -iAؐQQ@@h SˇMtI㙱}lrsUXz,|c; ?`v3?ڽq{ux:,:α]t T'z~=NjkDg,nX?NIƳwzwPvZ_>M'`r< (:3}{'^YiݏGY%ԚwGi8UǭBϾ0vMjW&Tѣ_GMG|86}pt]x߇?0Qـ^n(ɹŃDmeYEr ;΍vm 17Skb}?, b ++:4zYQ >z?]y7SG5nvjw湗j~,=ңXzp0~`AAm w^|ARd|=uHYwG;5j=JLI2BX?B>w98;c@8ο֟8~Ea,}K}Kω7D%B34}VBd3#zWd/Iśv*3?O'V*~L6yDwBA`yM3Ob OҝXI'3@{H6ѿω^YI"zwVj7M_RTCQ$=Wm5W d~\ -G3u>-RB+ؓ2I>;\+ L8.=NVgJ iSUql`=px+ޫ)!S NFcBfM1HkizBuNGOs,Dk0L}fӄhYZFRs5 KH4H12h1ByZiDHϪZWH@Ӥo$XF94}xhUs EV*S$Pޛ_d`Hen;Ɂ(̦iIIaؚ Iu Msͤlh@u@2a߲=YJ'9]n]@|FJ/,KO; X͚CJF+Huh)No `/chK4h  #0f":C*ڏs'[Gi&8sOo&p=%b*I_U%*3lR_K'p?`XӎV|sz̋Hߠ]m)Z:wJA͜ImZm\ކ5q𨢈 z+m;1f}#&~1J=Fe%A X[Vr}`cLgȦ3-0xn7 6 }ؑBGAg{uZI<'͈(=c3Az JFRSeA*D N|n!Nl_4PfM92 lWUGW-4kPR$859: م=[Zౚ^(cxV!o(5I7"7 tļ[44N@9ЃwNnNrxgiJ}5hTRZ8 ̥ߔOq^qV8d&^a̙q ~ iG3M)x;+\kLЈ" *^%zZ - _O`K*k*FQ ђXt67=CpfX4SX eb)G@m["r?F-f=V U^~tJ̝ 4l,J.pM2~fV>-|Yo]r͐<ۛ^&`>!О4`ɐ`4/|s5Mx@T#Zs_mm"r,h+3;Jg}Z')Cj{-gT3.hhjd*iWI%[Tg>L-F&=<%o o~) ӄK1eZ"^EY,AuyI]{s\tP'V᭣SEOxN%vJGtD¸p7tf u$K9mg*P5 n&8i"O'Pi ;ty޷1AP;,K;5s ֒mK*Dei|E^h2c"7Њ6t6>H;6y×w@TGʁ^܀/봍Ai_:VJ 43J'TK%᭝2}pv') -FG&(l[;} 3#y eb)؂֡Xd`9ʞNNgP%Ð$GJxM]A tmLEWl.!jX~hivrbB#S_[ncZ<9,0`};l2J VDoL1)2'4yW+v[u=lg./rhk acƿK fT!Nok|ɱ[u7 cO>#oK?'wg.Bw>Vx K13o}gq*~6T|I5('WzcV]-C̅IHx?!IRm6$h8pW|%/S!a2}c|DWTALt_endstream endobj 165 0 obj 5169 endobj 168 0 obj <> stream x\WRA)*BreA y/IǃP<Y{|6D(ϻݝ|f~Qp&dMxƋًg*~˃ٍ{,ьԶϊiE͘ frdܚf9%,JÄίD76J {(-Zr5L00o%Px\4t/9`~^l0K0 ,wG MLr~%ު|L/ogK=u8YGݼ7i-3a>bƉSIjIj'揩Jo.,sOJ) P8UZ89=Nu^D¶h„6`][әnj99QÔ XU0t#o@pl[%nŋ,d"弖WP%E+Nd^[ܬ U&'8g6ک/!rCcSkwn¨rx#7m~:!uU*:WVNHHg }!:K<; A)A'5J@kMwC;j̥W*/ 9+DJ $Pt̋ B qWYPv~ZA%Eh!~]jM#!W|! 3-YTZ1*>Ań=}EH m 5^OĎ{燢3ZE3UV@6Њh4n,fR:VtSj3Tt !f58}㓕m$z(9/vІOM \+h[molzbگ# '̛Լ7q+mI4؂>M޹/VsИ{O 7!rar2EAHB)ʟSE))1WJ]ZI TATP:럮=X_L{3J/WH9gO5]bo6h99m^ $*50a}8v( Ԥ5h b>7/#z1iZ }$i.kOs~# ׅ]h0d^"UK^$s Rd'cn7Vm!t2ZfrӿhZm9,HnnZ^V?#em1 |DP5@K6{ Á,۽D&=G>MxZ]{Z`. {:D'wu IJׇcƊu|oL<[Lq!` AZ@S9k|w(s+o9nh;Jk^ugfV8ɁmzqF, [J:ɪ֧mR r EY0sd4ɶ:Sč#4ևYb.Ջwt΃!~0&qE>"'ۆ6{+`% 250 i.DT|^"LKi 51)Iq,ـ}E9?b.,]BDW:LP!(MDi~.< ǫ¥,cݦV>4sGJD"/ࢯ}!^s^lq BIdV\hTN6TǮ=@ys̵ A*gT1 x1X $4Tf&9Qp=`7 q< W Xۨr#C7qG  ?q ֲ9z }8aQ c½> &GCgL!iK`kH$qd7k5|(XB}rS(9hfj/B h9eEEP7*m#8\&Q &QEJȯ_H/bu$ cT8ۥ!V(w%x?4h;1*PnSfOzF&DiuypVl]U%|WP]=NW4(9NnwbEi i-¤.E!B͋IL% *D*nJ~BOKTTl֢V}Ѯ)cv]jEZ5CǬVt'`0(7{"V҅eȣRɧQ2:#1cw(zu(ʵubva=BLV !Tȕ.wtY3C#Gj!ia #paF'^N?"!QMxLs>Ưagśڕ[U)V-t27,&WSa Rg inmzη `H]cPbMQ}>+@F}.+g hod=rn؂@ALjr2*fFxfƴNi!t(KqA]^X;* [9h eOu|Abϗ?MW.#gb_ǐ )]Y dt(%s+kۡY!0hf3}hBt=k}K7dVo?xr Ф n^W<5q/e` -~~I-oV$UKe*ro+%u-֙k[˲nj&nB]&6U83 ~w:o& 2CO=g@Pp%v no?}Q2.U^ʱl)endstream endobj 169 0 obj 3385 endobj 172 0 obj <> stream x]UO[Jv$HfޏVHZUH?1Qƿ^̚k>r@M*1{fZỆ\4,m\+}nkƷ4n{loѢ5`u-В[z:|d|u!,Λ өFZKWO΄+5 MY_ht+si sVetSz#"44z\_%Xy6krq!rBC.ۻI{ߤy?5JZ34X \-[7S!9.I|ej!>\-d0 T w xp{x, J5 [r07n)C௣AگM4nm$@k`x&}˝gC\6NUL&,xEe jҜCt6:ɰ.N{kӿa9ǖftN(vz|~w F rt_$D iCÈ UKwMF M(Vfk":K#14Vgs_u ¾coðUq50<2Od(5N&:+N(]xEjОtݍ?mCL\XDi+0[Zu Rz/ޡ~M*EJ&s+z4HAE>31jBs&\țч 4ZE,Rw(# 294aЊe9S4{i,*tOg4ӛFViTiz1E#gKeSFضXq`~vG ѹߌB媑p|^ OH :6`=XL["$t,TVJ}EaR*bxH;XDTމҩkR32kP6m ! a*C. 6rntSECװ`yV,LWhb~X#>apJD˔%ypM"DKviio'S͸xth0KG7^J-!aP`Zn%uQWLe(/*83!,cavo%J 4ޅFY4w/k!LE[v,L띂$/XS m{eQ$!c("Y*ʪY:S@X,6 MAUMj!%>9qp9\b"(I3H=K,}d.'jT՟((NdK:Uf&|M\NDVbi2QQı1 UJzdNEq=`YC*$ y8T /TO%X՚A闢 }k8l>kmvn*>c3)23̩R eR)R̴b^v" ɪERIgG#SU`<ʢ]sf,#%h22i@xFb.2s 0I(LQDJ.δ ?| jt(?wW[&Ք~vL1C !C41csN*]\p%*+6C_\u(GL-±yvy9õ!hKCy dQD])1s#IxE *ҽQ3"Cjy_=, Afg,Jc(z?KadIuDn$O&3HTJvq.#1Teu2Aft6%?~[fcBR6# =n˖]=!.on[15_N+}Su G=E[(xګQR뵌e+Ok01?b:/HhA܄^ ijh:?% \Qb2=|ѧH}/`=&u腺'>AU[~$e[ W, Z$Gg4l)؁#}/u[<),{ഴii)~Ìt΂3+.VY4%Z}=-Jy#sHr j2IKD }|<1|P܉VN}"ɬmJ7w< rg=&0~"r= ?{d7"+ fV \3Z|w#$ݏ?&n?_'8f)3Sr'O50"iy'Qt V{֬:#n?{}{)$ưs31?K83N&#rҸ( ^}R#HB[w1uKMS[L>:t endstream endobj 173 0 obj 4806 endobj 176 0 obj <> stream x];KqcKv~lc;; ;=Ꙛp,RivWgQ3%_I?%uٳ/;ߛ(Sϒ8Mmb>X&1s?g;g<17`;قL_,j1Â2_QgK흯VT ,(/K+#UԳ*&찢WIE]O*9тZD9R1_=[QOiJkO:I$a^F;7f;E,|VQ*jBlw1 hlL4yN495Z$ Rρ<e_w|JvUԶ@~E r:{(ÿzTܙ}7 xyA]/i6o `$lĕWl\A(XSVCs|G"ij? U!NHv$wzXm. w&eѲ\.E(eMn;Jve-Û<{H&wAPzI"e+|F_qn( =222|>iV/~'p(|(x $wUȠoqrq[ zFI>E<#_8tN$:VI;p'}"+d,¡k؈1| ʀM&Ok^{3^d0_!ybYU)#ژ[ A23jd\?rDnf58Ofkm͹_K'5Z ۃ*v B=57C}m_Q]E, b50FN,o@3B'ThʓÚ ex%<[yVih1ҘkR:5)&qM75yObrC̏קV tpY9՝d|+274@B}u7dS>IcG*R59F( Fz\X|\3?7J/xfx32/,D̘bMf:b6s^9X.mj r9 ?ff2pn]ԡJPc\) RIȰ֎+9"//h43Q;߈wQY![,Ȅۀ%g 3 W!MdBvj¬k6YX$al{lgceݥp__~Pp] €yT^P2x8aLU_C)V :@1887_)P̃6_C%+ .C[KK ݬF{䌮ݺIR_Rr')7a^\ke]TqJ Tc)<͝aA LK"G>yd^X,m*FXGpx-;އ.Si2DHַWPaPQQ?A~'ŔH<餻#5tv",nم_Ԧ O[,wr.hҖ"X}a,4X9piR> stream x\ܶE[iFj~nER""6N"v6a縸;{__RZiFӮvs-g8$?A DQx|~Qʎ lhu09Didr"QP_&(ݯ{_D(Iu,BZ ̈̇L|fľҠ ݝ & 7'&UXq~~}8|u=۾efb!i3q Ql!TkC(`\,ǷD:UI(SD*KE)P!8iq=|le %$-*Ӂmmlۙϖb83%T4o^faw3TEa@}}NyÛqQ`,ugSFcXFjۑ F ?e$jt#)%#OxC[J?'PڞO ۩x2\c  [Fڝ² Y?֫P~˾!tlA"aփ&htf{͙gzEm`s\yNdo+(* W4EPA@ѣm]jWMeLIE#uw7WDO?n>L-<=͂~Z݉;ps.4aT8ķ0F;A<˹aVs,QW|Y׍&Ev׽_P6cc51 >]2GdٺH۞^Hreۼf >?Ĕ7_[ujr39v1 ; i '3% 3&tg)ԓ6B=RS}fo EP9UkƙUIn쑝+T:,0 T#\Z(g%ӻWdmq^s\h**I\]ř>ŧeLۤv^Ssxbu Y 1U]Id 0 6f_()}p ҅1*S&a8BEFqQ@fY>=5QJIlUpս!6NF&ק3eηR&"ivH/:&~{X[1F ^c6P˲`scJ۾}ic$BqkKrfV=}/ |2`.̊$/V?fu4v6u;<&7k7Bajqo^MP _TN*SLES׫ֺ?2hI4ruQAWR ?'lִXC.1|$چ=RzTrEvLSf #:r,"zD:Y%)f+} *8&5dSt:\X_9%o5-fIykn)17`R؆&.<c837~Dfh\80o+]v\)* f3vfPF.ǩ5ƛpnhGIb2_"^{)ibBFJwD愑2+ 4PIݬlF7dCO}t$>wQ#X#Ԑ>7o>cd1ԛ^Չ!!s`b@Y#gX@m`e<.0G$´`.^v:_%|Tb2*u9uB3}AUqrt*Jŝ02':dJ#B3yK0b^'s]f /h?G nLyLv3XKd'tmʻ9F΀@ kwIȨZ:\Jw^$0Jg3&IwDnNyM@`;Z?n dw(t|ti紮Q~P4$^&Z}Sjad3 R2BA&l&(j} [ )",PgdiYqd=pt=/|6[Ll/ /,@ ̝SUz[pFTPWξA _v&4.]!䉍tt!od'GGuk }{m| Z`_I!PΡ|óǤ6a;7ARhʘ 9ջY?\1!=WIS@\Xܹ̍C"rVsI0Rwׁ͚ ~e&pJ)_KX.7q`p\=o4W2)ޛ%|4벼B7,H&BuQ>{ؤ6{f}U|߁Ƹ.0B9bm#J7[/ jY5h)ɞXybuF]: 6m b7 5ys!oCwݦ #QTX= fId{ hX̘1b3wCR;CD4G4B ])xv`{bQ x4o4\+`s\ng͙kbT YH(/endstream endobj 181 0 obj 2980 endobj 184 0 obj <> stream xiU$JcH>X v]!%$擱`/QyW~3;vH@Hޮջ+VsQoyxOo?p 4ݰ{l;<9 jaßxͥ÷V6; 'cn wr_XYKѮRֲV0+XX㣃/s,A^; $\($Oq!_K /|-[P Zå 7Zе}20eK2Mi"e%n8 -O 8?#r;C4*};ƤJ67¤V5gJ"򅿀Jj{s}+zx! O59wg~ nq7k|@-|JAtm:> U{;gDLTũ>)މ Ďu-ȵ'@-L8׾71Hk%jL}Jhm/%ZZa# ѭ؋`UF%6zBbl4VL1]FUZpw2=&7ex*jUZq{96p%LY^yUr_YAU `}aW-(xKYa^ yyG;na]q n y5<&|od a6)$w/"1^Ԍ'>Zoa `~K-BC [!A)C8\ !~m-ĘXb$%Ϡ]v䶺EL4L*1B|X=An`̰v^1n(Fj"R{M-)C3zH8N^n'Np!-2W{PK ~=_YRGBQh™:ِ z@S7Th Иda)*R|] `J:zmDт @&*95\#70̹˕ꊑ(M &lwb$HflQr5gJ7JtkA.I3 }*T 5#J SKc`3p9wP)p 0[2N+$QE!p8#\7FI>мDl_D;jR~\voፑ(f,25 5Yy[FK%FJRCSaዦE.ZAhM4Y4`*˥D%=iL4Eg[y(]ћ$R} H(!`jo7H;&tfw$c5 9dYUgg )Aaٌ[L%d9tIب3FS zKJ4#&vA]vvZ ,hT筁`;eX4()yx()"vis#% ><-ÐxMbO}fW )@8oF1 GgXXib,2.ƾX]r6IIGydn2NH S@ۡ 2+c&=Nr$b܅`r 6({tu!/XRI JN(ˢ ~--%ͣh o>%^ץQBW h ,1Gj0?{/} c>’=+b11)1m!7/Y4}6Mϼ_5QSd%rvvsO7o8%Bզ`.=%Ϩ{X @L6s8^r/1)|-C!OJ{R ŋt"mJo[PjGJ.w֋SlӋ7ȅҎ#^m^2vPbk^P̄̓'W,m/kӊmdTwrDČw *]@.A;R;%V 9}@26{?PgޗK[z竔xn=I 8h{]!T,ocK!TomֹmSXEM }qS۴3^ a-Y;8JJj &x; [f,̧{s/1&r;6wFv϶15 vB8ӈĉ7ZG/E\S:[ؾwgVpbx">5" aۊTJ P όtQ:z!yrT9' (f4lgKsti!YE;gb8쀚ˤ]Rc!!ix( :~Q&)h3^q':cK0:O9S'Zil+ؠF|-2]@Ι\0@rȦ%J4jC4zx%(nY* ݭ05&{6pTոg[za,,Hh^MQ&Mݛ}NMU ͆.]Se2c3H/OT7Q bzZ]qDL7+-1 ;oJF=wŊɊhZDk B(Gw++ǒhƙ JR)6ҹZ$FTe>KEqJH~94".+*@_UEq#S>R`m = FI aGN <-ZZi[cBX5½j*~S!&==Q>R)!쩖3JxZ ]3>˿KSW'ΟzyH?Qq nZjgc_fFaaSbE븣҈eJ6'p1JmRrsk -|213L\ fhnsi;43?@Bb1O&-:„dgy&}FXE΋Mp g'hS)g aU a$߹!:vqf/rendstream endobj 185 0 obj 4464 endobj 188 0 obj <> stream x]űV¹&!b]5PE( 8/!VLwWTOslE!5{f{QW׆u\l74==c῿v3=OuNo|:,3c|Fڎßm;`F_tpҎw\_rNtr?58}x6b|f]oZ}f̿Wg8ɇS5˃W;e =~z[__cpֳl33 ٟp'}}(5ߦy/5:5早45#C=|NaC|Luk.ޜfA'hљv@OКXX$܈B׾8$Xg1.dP>aL՛0v{թ^H OH.*,va5^,'6ҥj·SLmֹmQ#wovn `r{w%9khX][qhp.u1_m;֑ L߻q?q>V_Lv)wYT1ߋa)9OY;h4?F9˥0fɃov [:cs{cZyJIsԠ;gX| 7}.ʹc5 :j}((P$&:pѢ߈ߟ3nWLZ 2ց5/1~CPTNWd)˛`A$h xcZKV &l'M\Vmqp ]X:וf㇃禂di9=`ٓh]kv7 j>rIWav) 3BfB$7e4[`uFdyM~_lX?J"N'5?vfm>dɸUPG}AM`W 9.jQjhM}&ks $Hpz+#爞C2'D- ~U!Rzl4|q;MYbvx Td<X}vqz$JVg0B3EAw0|n3s CXIMh3dL;n&1 +VrUCAz σ9 <@W$҉=XbuoON ytքD2F3mH *LqjQk:?c^~9Ӂ7hpuO5p*D,KAJ*tEQ9(DO'P`qlR?4w>Ti[KgdpuvY0a䨉?*w%cza .qE2 %Zi5zW5nn/[>ircӁqvW8'6p$oSJ)9$kj GV8GV;E2C]00Cv@qBnҶc/BbN5vcI 볥XA|lZꬌXYY%2CʹΒshz_4p0cYoN@uDHK{(02LdzfnAx$VO-Jl~G4maSг[jx?J셌gL':rk~$iC-bYrm+B' ߖ&u"VֹWŇzm@VL F Ba%r ([79O轣jI j9hwJYEZtCjg(Sƭt6_Z`иL0\_(L#Lڑ)Z:Mj[,fb>35Q7|C~W\Pe8&!D iȨdO]'aQ=`-20yFK9$OD k`18 կ"*t[xA38>Rd?p3OՔ('8j+P2P7yM 3`T>akRB |fNzi2,4 @t6"Ds V%OrDei|Nc"*f@ ȿe9?2{68/(Y]&"}t2'ԡ JAT_Nl!f i@vLWt#%<ƔaEwZH ٤6 ShS0_WǚdgHY(7(QiBL(%(R@8M Acn%'h"4,D*\.!$xDvK~2 "["(A i>Ѽ*Z7+ O df@pii@'%3T1!4,UJc [.K;[A 0~y *p:#=owY;#8Itr$N8,o\چ\`,uv,5XٛMϧmiV+}D*cK ՈLi  URT'ť+Ʉݖ\_/DdEN,\ w-s2} UqIJh]_ߛaؚsIg8Orx0yၯoƤC*坿ZhOo%EjD7–熋+\B?06zi?@3| Xřms ǽ1Tъk m&Y2kw>83ԥ^:l1)v !v;e#y.zή@vA{_M}m8G`L~c+2,1Z}J\ X'njL2N 缐*,6f=$ש2OB+1<@xaVC}q,1 =uu*5wYThCA b{ƓX6'ܟsèp#,,]ї&B4b2{eNr, {YPSߍh8q[\`ltA{o^bxwV*  *hGvkpl+M8yPOyIR;ѸKzH`6%h_ayr[0˧\%8 D6˛#stIho;`\; ;0K"=&J,h3W`)҈Jl+y:%:FyZ@^a 3;!"TAt܊. dUrJ&'էq ^><6.HSil܈HޡZ;)qv ҫ[(.[[ȱxIqԓ.Q Dzσ> stream x\%{#(i`Zt-Ai VBhQ.Zxxw|v jHήgyx|XEߡqUoÿO>u }7T矝{l7de@7 :+De -^X߸OV(-υ6ZJ(ث-]Jp'‡Z}o3);.ϕ_Ȇk݌l |.`i5+Âx+͸ 0eQ-xCk4?lUaa}}ٳ9>0..*eMc1chv4"V4Z 1^Yi1-?$.9<@_ @;TO0ޤvmh.z >h_B^@kĐL%BF*ͣ-I@ZεV%Y0`zn`T4fm:'#3e;&4Izcw&#碒A%RĄWa`ZYOj.nu–I3<9 SZ">Vsõf#E:K@.h,jUhG(5kۉpBկ2ʔ|Fiŋ@T) T']EC@Tn(8M#av ̶|+LTGsfWD2/)|'?kIhk2 ;PhNlP+l%V0dO4zSVQuAs'-(Z wbX{F G'51"G)Z1J;2|TL%v6!3vzOo֚E~[!mju>s 9%jpWڮ\^n 96F}g'*(O@n^`^\Z!mH7vưGZOk"Z4=D&6'ONs-} vR/)9 .XS`=S+cⵣ#'p 0QvMhw(E =~H}uHN0zЂȉ@0?3nQ0Y34M4-N=ʻlOd1Ab ^)Qo :i3 rJѦ~sv;y?a,LJ(Q}fI>P. WB~Kyj5[4M7[`S2CѦƵalD0$`6,٨n;+ {7kzu #_+ux=qFD+m_n#)JdM8=  rN O;ksUunN&ma&YbUjO{X34HAY!(u)}E W"YԌzT3j2^.e-m$S . Bq:VP ,?3;NGDf'jM[yA&f3* ,3]IC:?};:Np\d!R+~,qT`wm 2ee<pgۓR𹝭_*zB=NP8LmbZ[KyݞP a +\$ZW6"](dkA\8\PQ.K#ʝ=mC?{P ]RABjLܭP[: 39FdNK@:IT}ǝ0wƋHyd2yd`UqX= E|p>zl:*X;Jif*/98 @K< ?XGl$c;tPAv kwhM_z rPڅ9Elq0BV\nT\=="?рظ.iICzʅdĉ[,GɳcHkF* ( @0i@C /ѱ#}2_-q2Â(,[ݍ4'G@7(#vZߣi*JZOgvǶ9U6h-Zb8*XbD[lIhQ6N*B<}6~²@}} #xVvi@w ܽO? Q_v Y?5ƌPU,-*` y=í8K͍ :)8SH~l–C\p vo5B %KԾJӪ'4Qry[L"p+5 1Gg "fЀool^=Ј3e.?|7[b">i^W`]%Ccv[Nq=@FpU$$(J@T}kLU={5I lQ\jbE]>ms:z *O0Bx25A;H%nzw@s*vGew(+Zg*`jZkR^ G`>SjeP9olp;.e阱<R@D^8X[oz2:йZ=WF) @% V6Rlk3qpXp4"~[ к]MPW@w n=;8OˏkGsPAS2nSKu`G֑C L@9ʜ@2Lʮo WCUp@e1 .c~l-&|aaE -9gť!rbVѼyqg!r0ϳ(lwNsNѐw8W, J&_%92)a /c⋯P1 e[pyǷ/!|ܱvdh"Yw*a]lкm#-\p Ĩ|%/:mf A ys`ȧϡbqTTBQB= "=*a(`W/޵i˙-%)Lt!<|IۄxvRJxna6Bd;Uf2BΌ FMw^'^PGs [h}LE2ډ4wa R6J!ڗao,F>Q}>_B߲Sy9eԚ ]KP" 3UEL ,4;;cɒtFe,@'\2~Q Yn2N_[{))0JJR%igk{ Ɇ c"K;*y`GD2w6y@_B!o&XT.M4-NOHcVNGV,X |ULP ΍0CR!wE{S+.lyr9 <KVh#_C|FTέQNH76 ,c1܉N'[X®sK)F,Ki~ j MV%~JX;0Lȸ~R(Qu blƂQyW5 D%\vy݀BDJƏrMr̚5u4󙍵Bdiы{eDq{🉐9QLHZQLp5TÞF.hmD!j$Tu#lBP?P9>QI[tA:d-v+ MSRnw+ If+9O#EaC,>^ȟuɟ\HJF7o!+y7+%O듌H*G>ޗjMuS [ڙ8Ynϖ$* ;Lendstream endobj 193 0 obj 4317 endobj 196 0 obj <> stream x\GW`6 %N(yCbb@Ll|艹WT.g%,vzz~~Vp&d߆u30}ۮ,т G̅!7WVZCkyZ6a t1?)KsoQ zR dL(` J ijAs`Gx3 K-.Iݐnw6f 1 4hfPcf ^ xN-a0F0h\Ғn@n^l$e%B-{Jo|[n6ŇjGE4~ zE)YϝFoNڄFSaIZA@Pjj\lXM?&kJ=)BHVѯ!r7hU%e5x?d&h*ܠ+Ҩ^BS6׏9ѩsQ|'&%hRZ !OzAF3/=q9Z>7(r% e%DU&É6r)$mzɀz)#&=WFp֬9"=w{Ѕrr-FYYV-ZK6IұdWYP)ƯK qfvfX94j<ԗSwx>/ :ʇA8PsH 7s28^n$z̧Lg m P{Ŷáb;IeR>2w={a @pLʝ A8e:dpƹNZW&EχP(ezTꃑx+x>dp% ;3d860?pd߆qXQDzQVYÌn fwU<7`QuLudϿGs44|MJ&|ZiQ^aj#{-{9ogz ΍\.tJ\,Pƌ o}x0.6/ lAȽCfH~vPD& *0 [7y +߭1Bav j:[0;jC(3TfKPu8b fT1?V¤*5EH¹BΌ1ҐI h"s{}M8U:$_3IoBOdc&rG-(EbKk~|zmWPqC  rYd'^Ĵ{-;F?Z j:m#P!Ի 2F3q1/Е( '-lvJA#3*$Tq]7 C晛٫=.#N[$3i#.27LQ!Sk8L gIٝJlВ^TA荹BTOb2s{ [ξ wLGX33n493[8'eNd0s7sbȜGoj^]rʹI:i'KhI>/C*$*0@$mqW@)yD{GgEOgRUJŦ7z0/IL6a`{=W(ٽVP]hFS.^Q*{EipDQb.tD<fs&d%ӛX]z/%NC֢9Ee]9`R+eC7rB}$g|قlAܞk#vhMX>v7>u9a AQy ekς  ZKi2L}@U)"m};!Vi !ֹCISF;ܭrJfB^VKyƏߒ7wEPaVSXnּ~hv+-l!9 /Nkִ œܽ%5^ ˱:_z2d"2h)ڈsJpG3x:Vȍ?:&xwp=d,z%iē.0e9=oD!pNzʗ3AQ@-I>CM:tQ(LQ v򛉼ȓD"O_'( ŒM51jB%Y%9<'~"wIlft cװX`Njсbj3{E1cX6eCt{eegJrʻ `&wzFz#""uZ }HQ~4"f9׌ 2Ɏ }}quQ}q.}i {$.&?LyaWnK>4r lZInz6?UN4}[@,. MAj/2pHHcxw& 7@E<5.`=H l1{!n?_w4Stx:Vnimom;/Tn*X6۔5!fBqxh,`Q˯2іxR 􆘰[0.I HEh!!^47^|5zMrfihㄷ<'. {/J6;P!SYaΕmV^H7#y\&AE;OX7eX8S}k?Mendstream endobj 197 0 obj 3250 endobj 200 0 obj <> stream xVk1FAZWڧ Ye$ B)H}hݷ(+kvVwm&͏o>T@LǍQ[؜6 \}p^nT21s2qU6%@>:nXFϧfO_oŐCp!ӏZ 0eUxgpt] tD| f4v*?G*a^ݞ~v':ZgVčj}KoMXZ'-S5oE2FQ3R~qS0'^ >Il&-v1IՇ2@?!2;ю zeptf`>DT툱,( h]x'(=5> stream x\Eڈ (~Y >v$"PKZDc=3;;sfBH3gΜ9_}ձG{WG} ޛwkγNO6lOy$UgG6nyϥ~^jg[ǝ4ϲW'긮(M[۝칃m6qOCt.-t c\oͰ϶;{g\c›Ϸ!_Y/ON 0W [y>HUƎ/6Iddt^[YvBD6Qj{Jjzs>9^G]R>.ZWae:Ļ?|oSƸtDz׷6/h6߅Յ`hxu;aKĤ R䳣Ȋmw''IΠRu_23e'Hs}%ehah{!B;`6 iFV== VU dHocYՋ Gc1M~D =RG[ҳ4D;~f(D9G3i!i^(skE,֨8?Pn@ל|o @|?\5@l7'Jx6%+`HKkm2>֟gG3.~7|(y-ԥK h) Rte.ۓvQf _ҫѐ C E:yc74w.7`ep8V 5 ,d @91* Hbe̹BGBiɍv{9L3aº17oxZxxq+~ T r"Jx$<Ӥ*+2$yٍC:D/ B2wHSHu~rvggW#Iq4FAhܷ"H%Nihn\ ޯp2et8Nhcڀ5k N apUp,t}#a-CeCȺ] &XH06wA%Pb1Ye*7]Qo<&-:+6&!HA8Q;*@0,DQ؂.; 9Z<X+`G{0\"M%0k]6Ķty"[ V}, |;5&F`39Inrt@G(_Ŵ~̧h"Xlp -b#!ˢݢRjU}<]qs/xF!~|v3X/a@aiXuS"zk 3.H.'KNy1j(\ c>HQk1 lI@9^|/|$   KI҉fSG?r'p87*13j6S&m/Wmxʹz 1M2 H Q;O;;5jd&dϢe0ggDb] J.D :9h(xx; =Q!HZ8@z1NN'94pps /sjDے9) ѽgQSun)UlOXML}ЩIl/@$YSV2 1}Q8ł8-~Yl8[TWgg `S|8ˠeI čx-;U,(xiԛ)^ #@)ŕэ?"8p]9mxRYB†K1UhyTJK(SoJ6N G!=,%qêISfE^W&@ǰAΘzs'l_04!gԞ1 omHݠkiaP{hZ?h^Nby2v&z࠶ Iu 8U1KqGߏ^w*uLȌ!;.XTv4NUZ9 }YؙIV;.ݹk(6PJItIph$VɯwR Sq<:ɣ.Gzˣ;y8ɣGe<>FKPy5At:zex 2Mvex ! M_3λ =2 \""ȍdP!o§oI>}P$W8m!]tx!gτ~G|;J|_PP[B缭~1:ܜ 8ƾ?.rحMA/za )Z>!0񌢪 Z j'FvUu} nk_$sx9\3N+rE<28<CJ@ySgLy >. Oǔ󀂉R^mF tLfN+ƜS;y~-)Yi?3"k#_ :?Dqfw9jLS6N6r ]Ҳ1 sWYj>TvP7״?+ IQ*j6 .$߈kEZ¹`b7v2P9*=jT<] ʓRUgY eVETi GIk4Gffh_dLk!~u\нy-EB% jr}kpI?"0Dw-nxt ZLs'Tdq/SDjVWFQ%體Ru|[ O"Dzt}0[~C\+y,ϖ זNYaӃ{ᥦweΰ=15"l:&Z|U p~n.FB_Zж㩖Eqb]iuCJb׼(RB=C!Bo1.Y..㾟LRh|@ b.j221 S5vf[K~k &8~N>$Q\TTࢿۙu `kKo]i?q2Z(QI:4_DG@5> stream x\7WyiK4MZZ k_4<@*-)>e{}z;ݻQ$kk=3ό-ز?ݰo7_?~c7ۋO71{o=Js{aw`Vʎ\Z=vFv݉8|~Wo7`=Uav{ )wgL+KX kW@ݞ1, mg{u=%vX߻m 3n^keZ+yw 6C oyn/z7d 6 6fa 俳S4Uyc hYauja|סsq8BJt{뻽bݷC3v{sabeDnW." V6pmapGx ݵzq]AI Ģ-9J(**T8zFs. HD9u=h0z 4B%z:'52/U5XFPFIx9&*9[d)Ѧ0&(o!TLx,o}fj%@pӍ $fh*Ъ:)E;ŨZD8PE"B YF.2`hYC.\=.m*uVCs'@v夯je,tSqqf${&vAoif=[:ҨH',[FL(y9Qp[^.riԪm[5Cck54{XGѤ4Yg3!l;XU4x@c$AXp nqojRCfj_?GXBѶeKpX͔#YW#-/DPVn 5ۥ~<3/` n~? _N"UD)CEfڣfxuUVpWRŕoݰZ׉uze77b>!xb+ ?|'1`n3sLvttm)0bI!-7r'O颊J"L|Jie P7ᵧ6w968AsE*cX\3UW8U޹Zc]Ȯ"gW` FL"guLj;-.3bý3q'nǎûF׌^O1˺WL-G;rypr` M1;;|InkH{ :~Xk(pE;ി/.H#ji7@,=o}!ռx^9JpJc]X[zj}op@;A;9`(c<63\Fp#!>އH_endstream endobj 209 0 obj 3782 endobj 212 0 obj <> stream x[[ǖ`! a_ e<<` C%~z}$!ytɃrB4B>T4i=:gm+&vA ƕ^ҡ :Vju|UyvJ'xҍQpzi~2*8Ɖ&ƙwI0]F"m ămݥ`\m ;ZPW (Agiڒ-h R ηL juГ"Զ k1MO m S>=E* !VI3Ⱥ>6IĿx;騛 3W}BNFԕR٤6X[[LSV*.dGvbls{`g,r@bue9ĝ 9/v?4nPPZM;VT?WVvycI9ծ.Z Ru.@8Og'L(,(5#M qn>I^D1] BöԎq{$]'Qg{m̄8>8yB聙ueތb.Dc,h\tetցq@d>"̀[L0 18h' ,z¨+FWٱ7$,F`ߥ| [$K!9w+`b j5v(!ȷ2:Z5{$6I ~"/$pD~d킠}rm~ze0& h#I'S0qfKw~ɜ0 ;8مQN$r_n Aǜv0S.rM5f7`-OL> v]b#Ks󃣧>54ݛm; PVfM2oHű A!E*uk+WpGB[ S-@|!1P)pn-w l_>0ƾl϶d^.A2Iy۪`\kh'"47 9YWHQp\p8+,kR(0&̋0u&F _j“oBmH 0epj+~MΗ6v&K>J&2X)b͛iennc6Y[WwV]dػGjFA$tEIBјQU-Iy3B]:S1{Ƅƅ7>Nɒ ^BԸ7;e d,)Hrg~^yeueHhEzR rhb}bC"eF%tȒ?ncJ8={!Rf@6,"y}m.SnZd3?7Pt :菉鉯k}cC7󴳎5b2H6}4Hi~ ޅX6j6FǼ bdn7+R}>jhe4auvLuhFM|Mm4 ؒk1VJfogi-6?2mkr>~e5=*wl⼂V^S񜔾=ၔH V~$S&3 5 NDN߹bye9e\->N]3YHa7L9-KPwu&giO͋v2NjP*d!BٴL scXUh<JHǷ(֣ Ύ %:, &hq`~p>QG I/Iq ,'g57bk^ F2pF]jb֧֩6"*KηKjJMX$o\a=a*m9ԝ|Q+׈plV"MczBc)!Ӌoa,xܚ\;ס6# =^Z('#5A`.Q(z"sT}i}U9MB7_ #})y/_xgilpLpj^"X?N2;wķHI}#r,ŚiWRFҁ\ZB&ȢAZYMa]}['.Zqi""jhB{ aչxO$FN񏵸T}F-lMu׹ c~jFG;d7FO0b҈m~C׋ <ߕyDVMm*@}=jhNj[,3PCNNmendstream endobj 213 0 obj 2925 endobj 217 0 obj <> stream x\WZ R -%rnY)iIHxWDQWSh^Rwq<R"xYoTVXWGi?Fi.x&h{/JG(=hѾ'*4>puѥ]=I'$m ox{E-? )LY|OI50+ٹ(]V&̍=Mޕ-Q46^]h&9j\댩Fߵ Dn=t#^Cco!|a{Ŀ@{FP Q7#Y߼yh{$rGgwҼ~>V{?"# ݄ܣCM'LQPVn<_DyC"ZGY6[l#MfZ;VƬn;YzFgZ%V?fϬ72+ YIXPZpp\敓@eʝ.Zf|a"X%ǰpzSyN_7ƽ!sYmi"Ӣ]Y{^s+YYpΌ,dY% s:\#2뎽@ac:4FJO*zSeVĝbL; igjӞSPMQ%" {EɃ9X3rEaZ3㱧L7qF] )Knr$`Ӏz$nzcwc5@bZް"3E<4@6їA$vek؅r'kqcqL ֊ b ؘnpQ`ZΫ N]<_dt[qιN˚ӄ%rhKm؎'Ibq*n5֎YsQU{;[ϙS$zyZ;ɜK<:GYGw fq}ٺB"X #q5 ˙O!LɩM7yYQ!o$G!C>Hm~`ԧ?t}9JW)(L2c zԢZC=' #UTÙ&Akt&Pb,r˯ZUY*h1oR<>|8%>^w~¸W+T@S}1uFhaIFkD-8Vh⦔h̶ќ;x ~ED#'ff8vKf}:kq:s^?؂:+b!k̋+\6խϢo+;OY̑?M^d68-*l8;K$x/'𠫖Ǿo0bރ {$+K2_eW[ىaBIdkSo>M49 $'|DƓ3ݭm)'?499QﺻO dI%ӣA i~&-ePM)OY&}g[<>A~OqڼXާT) ZRwuv\/ErHL&Lt:'qgכ2 00)yk?KǔU 3]UNjV88TRgi>_tY!:cq M~+؉ڮU`h;W-;9vx%J4;6f״R:Vŕ֔Ke3d.X[dP~9vHZwz!iL'UF$U{0,cJR<¶~vla@eZď Jk)So4F./\Z=+S$lg7MzC7?Y(xS(3d7Zb{i,KtVUES 5ʔ^!ȬSL}2 ؄?w5 v;PrٵI)]3Tm@GZ-3TwKpw'aXӿv_c]ϊ^DTI1_: ysҹQQ_-WY]7bp2u_dM0;yN~N]ɡ* _ Z7wg܎mD: )s9:εCƹu 8!ǿ!h<٩Hj [)l˞B&frVt BV:\ß =q q?[cՎb,M)̤=&FM9FUjUi:LPI,`702e|$x0vGFY3I m5(gi/ P1 I؁A)`Ag,|88$$'ۣZti3c8Ku.+Iڬ:pxθ@r^ҧ=0NNzoV},`qbN,U}lsS.v/qj)Q(+~RRDo>]T%sQ 7 nbm3epc^f_D >S5P!(c7oD\D6)^Bވ?-SMa]·bY}Q3(= B30/H/ /_Ѐřs5xa1=̇5zZ%endstream endobj 218 0 obj 3238 endobj 221 0 obj <> stream xkEMH42ZvU"X%k!r陞3wvދ ՙ>}ޯ hXo>Ycu2'ǫ7l;o{+ygtNVWNXYl[K=ηϧQYvJ2^B5\ akY8εYE{V֊ ~0xf3oKO5EXTim| /:aVi 7gN~  p_ƴ? eXkMZv﯆][\W4̕p֫@)iaT( 'L،5h+/UϑeDE3L#"$B'Xc!%Ԇ/䟱J| B3fA %4biymhD{9Ai`uy J802k[Qdef X.R9g#Z9Oe7F)Y@Mfah*6Ў 0;aEŠeL";WF}B  8R(tH 槪%ͩ{OLÎ2x3#lq?q2d95נfxBӪ"(^koBCh;uSfBz}YX'X$2w R4jqē`1ӹ!R Eʀ"pn=ldy†d0 ,]^88yw;G N=Ԝ")HXzٶ2Vq_לpEìfbE,Oږ)L!v'Ȼؚq\nD0h%F^f[qZ1T2QHH KOTPqVfsqቔFea5̊q E︢.V b)ty9Y)+b>G;ty~,4(9zr6Dq~J;s%v]7R&xtDchZb&1IcMRH˩Yġ,T43q%c8z"z\rEh72PNwhGxMZФWVf\^Pb Q|U",b1VeQq7gFŊ"_j[r;q1+M5#^'u-,=T/d"$0GjOs7mg*"q> UQ)\jՖ5|yVZ t۽Ik\0?Zf, aT@erWH=5+dVcyk+^I}.2H^S8I+R^ w+_m҅eфYNTiM=IGįwy4z?#vO}F[b8RHr=シ3ܤR "K|:&Q{SXTj׼1b'YfWxp_".PvE醙g!glMiȁ!}bBvN>ï 7 wɹȍwJi#՜r &a;,Itg2tdOiW-v=ίCI)薅+ŽzQxjo|Ov{bAadl)atH|M$W]#V~D|BG%bBv3nѧcΧDzՀK陈lUǁWɒj-_;rBOQlE0(N{wP1lǰ,e^ Y& 8OC/@XtN̠V˒{M'Qdn%|&dzk=e={ͼRi B(-}L^tFJi N]n CTAٻ/{`Eهl yb,dJ_B-Q!2 ֤|c=;Fr~nu¼wĻE}@{B<{6AVL I NrBxI!o::(C A6s6tW9IYҔYXȩt7=WrQ( x%|R {c񨘆O& SCS:wDQ{8GEëD7 .ӟ,3m&LA:^Eu2oX[%zT$D]#[l.zdpe*4le ڐ-4];urfK5hCWYyل|/VI'`syͳ_|{M|\0Tdd)Ѣ:LiLU)1N,$|niE-` z:/)N֦֒kHmL;O}@ǜށKhj${|O"WAk5/VW"1{do$YFTíP*{:%W/CLYHuy)gk*z/H5{\J JBBa0<2l_~* b\&.j`i c {9Kߊʝ.4~M6r\I":sR+%QSKhU c!5;h/^t!r9'^)#&1c̲|pH^ϖ=Z v;zp$0o;`ԸXIܶ;wF?bendstream endobj 222 0 obj 4453 endobj 225 0 obj <> stream x\YGV ǁDr+kʵ/ #*<<~SS=3}+Rk9wNO ΄,xx=t噊U?wG7]XO+Bk"By&U+5NïGǫkr&V_%^P~ڍϊiEoߎ2'3%u߇Rʟ79(Xkf8zcԒzÙ{QjQH$>إF2c' #KV׊Z}ѻ{(c-FA/%u44~ _7/Äq:ĭvu#2OBG;:LW˜Y|[8Zؕ4z $^Y~)|Q=~m֠]kL7L$htΩiHheӒ\@9!Y䆅YjR9nsukTL4a:bk,?wT`Zyѫ!MrH: QX<Xd]K_!g(=GcaNv$iz7 = Un~ ͉^m VX}* 9`nwg.13Nn=F/QA8 wsF +NV?-<@ #k(@iD =P*F+`)?CX$?:k}C81@5) 4SlP4b@Oޢ߱8E]MP  phQΛii&yf c'mz*n]+1eM$EAX0\I\'b# o`Ìj3pp0:K+}H4& # q&*xU1<'b;uPuXhX{P"~ "RJƜR1k]hl1-:@0l^ZR$9> Gɝ a6133xv TM±{]BOMFll(\謮gFgy A1m] +9e=X )2+,ϋӕ6@R5~،]5ߩV-B22H5&qznMb)"o3  bq4Dosi5DvcPkgװc|h:/EOD iVz4 iVeqN=^LLJF\w3!cw(G W%F&"U{㱶Mc!nLte%WipJGA0ӕv8]?M`њRRh2SLD*0̄WF TQ; d)S)k_Ԑ;=7k|wKp'Kw4i>Xbmۛ~NV-IfLO@ą.I:ոR,{@zV<"-q;FeP+ʘtP}3H`B{MA*>\#qJA10jҘg œ7苭7y醎C't$UR UaC ZXG,칰/!k¿RY L-(~N[ijcȕv9r-D\N7ψ~ ĥppf8a  'G`:_'땸U`joh~-*<@{3bT!Dz:y}Ѵ)r8|i, QݪJau2G7q\2;"R(PUFFgx'ix|z? O/yq/uI I8v9R@tS^p>*!. 4mu lǛ-sܠϨVz7pi 9e"'@~2niMJ#w6IL;C o5&MM{N2-i4\6Ϣ:yQh=ʢ2wniQ4kPKڰև͘3۟nBmyg: enMJOsamhSչ)1'iM_RLdϣ[125TD{dJy! m/;򓖌3zsF[}eɕiP }JÎCKA3j|n6!}, 7̦w(nrg]kw6]攪W;(Uns.Lt6ɶ7pl;<А Ar%EjJ/=G/gFL&U.Ĥ*C>έDf?[8e2C8y, 'ebQ,zީ +߅%%Vţg+_ 򱭖7 ;)m&-rT#P6#ҾLz۴' $hk$Q+c;)ߓdgTKC?ތve:/kwLxv! <x!Zշ[\xW!Knȓ?Ԣ OQ1'w;V8:A:Ul]Ӵum л08;'DvxG}B'{3=dֱe"wJҀDϮHLk:)4pȧKXr7o;v<߂k]o:!Lt.t<3TiwSKFhy}Wm5{/)5qpYn{l w+OFЩwǎ%RO tt}H}5FbAiHrs>ou1iu쀜qKm#ߔ4p0jcu{_41~iW wkQl^OJE@tPrLjsΫLDjQAiq '3T+6uAq}v]ʹ ZV[d8@a? endstream endobj 226 0 obj 3352 endobj 231 0 obj <> stream x\G!` A!.N y@R2=53_D"QL?u>*RȢv'x{x/xIŻ"_,2_fQPd YR:MowϭD)3ޮEjJ oתԪ1:׶'K/ Rɸ?q]ꔨԥ:D,}z#՚u_:CZH)?YRjgSYj"56VcmƿxzN/nWֺt)\H?D$jm8IDA._U/C%Լ畚 Z~ЈI8Imݡe.Ȇ6J8/\_9ohêJz+ zd햼IGԯ?9=i2Fng\7׬Sa"'/IZRdV6-eZE1xeܨ*흴 z}+p-$iXNXPn%X_PSGۢaLH[@RW2mL+kF[ed 6Zq_o-~{w ;l,cw7կ*Yf$=vPi@x&&齃E>}m;(Q>b3Hdbt@PFvK օC lƏ`cd :aN,cWo5PöŠ0לݏB Stl ]!ѹs΂% 'O:'cK6V(ro%4Q|I's `3aXXap”*;ANux%K%y8s>%tn#4/TpwwR;GZF}/ژ>J]*u6^6Ui B2#6,oSd>=Hfˤf]Ny$=T-F䍗KI&}%fBF(_n|-֝=eL؍/J4cE#(F#Ev&Bwah ޫGL(J%/.ed8N~Z4K)yLat0|߽foG]t`%F2^ʁryXJ%Nlj*y0%t;s >ݎ+)oǕu1 9bwO6X ߦ+.&N7WG췘NCXN}:zĦ dhutȍt,lӸHu֠@=_% 0DD!)1=*Ye}pA3iJby,\V a8ZװlvR7Q0rV -Sӱ0ԃm@W Lا;T$Lz!AB Ajaf+r^g1nru}ʖm5[:A<;`eZzuqa.(r\~{E maR)ԈUO@=,f8GՊ9ԃ`e 7aڣ ̓:qebSnbyVcI_,7aǨ Җj&LAUQR2+Q442_`_[ _YCޅAaHߺe\˲3,\"_F͹pض66iwu釉r`UݒQxoIaNE(61,Y4ls8qgH'zN7R\xvsR;q2.&!IHoLi+i>~K+.fD;6u lT:9s5ܬJv{Dc)ܚž/ͻqnC E"SHX3F)kiƮ'IQy0V48;=̍L\9OPmpD4R}DOtLgP""}-SƔHCLv! iL'sr⑟|}`S1Rŗ7[^߮½ѥxϢ,~ONO tQ 078pv+Źhrr6g@f6%ϜQvK] ;mo9?莫Le4Ec;JƙꔽQv/r5ԝR. r.UL rw7pX:Ve@χ{@e־ fD))mM:Hעt >6<`+뜁J^yVT:H[++J3S)zYeBWu4>`xQ4zKg(C# QICPNbCPP>~v_1->&}ݓ%+(oM0b曳!=Pfmv! :;N8eQygR})δ譏/.#7:-X31; hvVõ8OR\>hq^NLX{[r[<5䰳%dzW.R=~l- s?1uvU͗N~vI [Y,d16kC|YڕOWh6W}SPLMx:snsv3DcG B?2hAϐew*Kdc7zqxendstream endobj 232 0 obj 3531 endobj 235 0 obj <> stream xiGU W2kq hf]!!>6 `!YIZU_tlϲlsO^^˂\,m+>O/O—O1[ J?/o^Jazh`\Z5/vF.q/;(,K%Oϋ;{z6܀e?XֲV:GtA_uDG~F}A-VVB;yI`+IpkDc^M\$lt"_l$8/ v_$,2wwP+KJ)j)ZRk!՚AsA0;%֪J|6D0<YJZvJ1pK<֏,1Z[j|x>aDq "4 }G57tkaJj roa`)S+@0J. `z5߆yB+#|)[)m$4)ҟTF,fjzBqצ9D)/ֶ }–aE^I3ˇ'[[rH jۭAp=ºaKUa`KƍW ,=FCƒub%KY̛ע_L݀ 7I Mh%VQQ?1񘂻(- Ujq5XΦi343I<4[+ jD3v8QE}HDU۠Q3Wr@fdڠ8+ϥ0u Uݎe:r%$-yqa0nswӘC0K 4Pi,1Mj9 {հƲ܄2݃l9h*$Q0MYU&Ew)Y+z@0;h{$W% +ўafc^EǪERy* S}SD2!f;zQv@ay&*ޢI2$Ad?,d8Z+^A2 )9d٫ˬ5Ly\R!+gH=sL{.ڟ*%soK7 8]9G)Zn[ڕYit[bvCG艠a03ڣh D=oќ$WEHEdRQ>-I6R#"vQJf:! []&6E6~VId; e-!Rـ%9pU NjEgrF0W>sAnce]'B Q g^)ю@ #`utJTFB ~,B:Ff`P-2 X1/+LT0p&xk]cDL^~ _PPڂpuj(yw/Cf邳y"HY%CR7̺'f3!111~;t t>5@1oAT?C-e84 /u ?k`WurYqrO8:Rm7Q2=ʕ q뙫a@|Z<-5Uf61R55G(ߪHeY tr{.""޷AM*6ʔ?魲$GVƸ:DOy(N/D۵rӦr@R;sD "1bhJ5dnaKWxk*1vFȄty,LUҨ-M5ఆr\i(va6[rD=Έo\]~w(R}ԲGj٣^@5plԎ /  \ } C׹ .(uy^gV; ȨyZ7TԯG0Y$0Nn*Ag)SV=ӨJ\)P} `x]ViɌY(}(cEzr+= S6_;Ts!fNy64)ʵ1/0Jv ,DIѬ0L;_3?cQn-c| WkMnhF Z2µi8FX3ګ^9/D ¶GV4hABKj8f+>oUɵC錖r䱧3rFɇD0ՙtۼH6X H$u. L2ahL3a4=o_jIJ61ZJ޾+i5{%u<,.I0_}OFuֱ[ڜ>f&94}Mқ ZO;Wym36GoJўAdqv, 4 hC7)@zق{2z0:瞳M|rBrV[=˛t%JǭJh-+z143e <d&Y|@ >$xz<ӑXG \}ѽ"{"- ZOQaY"50;x{%9^EHdc;M)!t/g3vtr3!v&ߞы}I7mz )‹!M,I#])>_endstream endobj 236 0 obj 3522 endobj 239 0 obj <> stream x\GW ܞEa;,@X;C@@.惱/N"AyuL8Q~ԫU]/ VrQoK<:[c•2SÓŽc[қ+w}³Bë7 T)'?XK=]Rjg+QǝGTx-K%OڕÌeu?[eby sjJkxWkN$nwVkQj-ߡ!~t =E=x>tJ8Ǘ^R3&$ =Xϝ OϜ[vCA][2'szZҪ`a˹4jXj[jJ{HSi,I7VϘ t ioDi(rڌ<#߳uߐi<^   m)3jyͅ(U* HPӛX񵲻9 hbLc”L= 1B X!LErm1˚aNj4Cs&y̆;luoD=@uɵU Nᄁ!#&+O&ZcX7)Кq WҢ!ƗÞ̥"-E$! #)9lfs;U)G$DIr㜏9yPX/h^E5{Z3<:s~Y=_ӌ69Bc.* qʈ-ZƉF5FKޞLn6f&jJ,h82xN,S,H<GE<rRylFg8*w&B)5M;),*"-0? n7±PnM{;UoBq=h4)7s` 43x- 2 0***]iDg1U1$[(gL9e;RcԵJu^[G@otɼjrkW:Mk[+B}BxT"_&5$Das:ƪ²]8'qJߎC8 T}1Xv36 +KG..0M@ WÆD>t}]BJRl b S\[l (˃Q5+!12&hUQYw- ~҂6@9Vaj\l[yƛU5[x>(Mv5\< (? B(j7P/#z%}d XGtK: źqɉ$8¨dIZ0He0v.xM 'Wϴy~$nmȺbPR Vj/xr0 Qp:G-s)X0^*w'Ȼrjpd1!/r[w(k(m7W5 /z4x5ȶiFe2:nHfZQ_zN{Q83aΨ;Tbw(Wv^Y8n{jR8Pu&fnCp ^8vP_!Ց 3O|LjN8_CmL& 0{*Q zS1`'FL{)Bv|7h9bFYlo`m`q8UEj5}Fg~N&}&z4w̒/&oT<70s9i5#HE[6?j#D?W+endstream endobj 240 0 obj 3077 endobj 243 0 obj <> stream x\GlYf0!!PY!Yću>$^m {ꚙ7:DHy}V}Qp&dtŋOǫ+TN;Gۇ,ъXJݣսU#6  B05Ek#Y^w|@ Y1dVx/3`40ܕkR)H2Eƫ_!4+$PS4sZd"j`n(Ub ߧv)~M: ,BڨFZYCҪ/LV.̷IF. ]"&7t0,'H8>ISHͤ$!OC@($ )^†q ck|]Y߯eu+=$[4ȝ2CoEl0".Y|ȳD>MWn &Vè9·31p$ [wˎ懷9F$Oɶ OyփLH-Gi;=ɇlπj kasm d9ef$ w̾[I`FR9'ɈJ'*Y2c)E|jYF{ڥBChUѡ0ZdZM`iMg2_b4 Q umq}'  $zH衅CBnR c>=wZ5.Xe\XJwd b' 6Et/'^B,뎥G,m1 A# Lg6\D; RNݸT熃WdUskig|:w=kKھPSrǨ+`4$BݦS4F۝$rk`0_Sj-M>OS)#`lC6܌ שHTm#g]fi.hhߘ8>I*M2YD`Z.xY׋9ydžY9vYJ<`=2˶UBI@<|K`Mw42b}\Sb+̂q Q:Y Cڬ43uFQIΘhkԉ>]mwieCC1D&Wn[k;IiPRqփ{ '(wdu>S9_H7ijb $/WBGcDGx5O:Ox %k3vw{5rC*V1^(WmzLT˾ CqYA;$h:nVVfלqUv+~Jfh{RTXC/_o'D=-1|zJ" -[Pj- ]WǾ YP;:$g1ϊ]j-D4F U_39":Dg"I wi#,V&3e'/V2(/%kMK]MLRY\}GnX"CmP%# mlq@]䘺cvCHk^ 9IY&ςsBs)N}.SGZA*B7;]6aw4,msz7::}ޛ5].+/Tب[ Zطŭ@Ts z zr٫6ocv%/nc'@YJЦ$_goM_Ky wuیa]ef"Q.ŮϣgN.կ0h s&3\gh;]-R=#yڷhܯe͙K&L#7i2g#121`k"Ec^<2*WϿ;t±AGsGXvV/h JXo I^GєZ 0q:щsM,|K6 8c[ZXM:-֘ +q"HU*ZHTۏ*L$*Z/ 9I;Bl&)~ߑʮvh[;H~Npn)oxЂѻ;d$_=<Oi|LNXmiD$ rhvXNFt'PEt tWI?֕F*ƃхhT:7e) Dȩb2 uĭПPbe/Ԅn 5!upuTA/BǎzDxM2}5* riW-S R- SdAB/?Z=ZGft4AXżź}?F(nJ{kui⼾VI0Y f]]/c' c 3L`(;T0< kFKendstream endobj 244 0 obj 3251 endobj 247 0 obj <> stream x\{oG)4&*ZeKu~ DPQR-NN-zל{f^{ڑ[ݝ99wΙ˂U\, -Xtr*[ʛbɂU;f5xY!]Ѣr`VƒW\ZWR;#ˏ2;_DzR~Eg&d;9BeLG˕=GU?z֏oToq wKX/YWEYE`jDI~Lr6lT.7֥(왃ED4mxeSQ\Jk!DUBY ֊7)/\Z+yre`` /%[aO[fWX+y;Sm~)ڳ}=z熺_ep~Tfݟ>D~aD.Żqj T[ ED(-W*WC%p,"&#+ҺE US+OZJQ5*g , Y%gKUg=hl{ٝ0&gqW,p9> Tf/.gX1W!+F^e|:n)(͸-U 8T4M#K~D=OaO؀XzĜhCJB/,~K{Bc~0cF E 1le<1"&@3ZyFXPd@ Or_yo:$ U_\ ^xP@;!AGp@)`K\.8ǰkpN3+StB CG b9sC|MȷWC&CY&+xyACA}^ΖZDI)aD^P'[V+/0 yګL/e{_riŖ$ ~-2p"!'qxLJLVx  q~U+Ѩn\ mxW ]k ƒ y;CK8epXQHust Vݥ?Z>94D 2iq悕›+7w1[cn(KR5\oF$p lF' E{Shp4hĦ8u8Z9];. %`4rF (إdT^p@A\ht=j}$ݐG~$>zGD^^*]=[h:|]6͸Ezc4zWހ@;RZI{߽pSܛn OCTqg Ro4"]bScZNCbRMGNҺ  R,Tr'%Ϭ)Ha >d.>J"C%ʈs7R<'I%&Z[^(3qӦʣ/A -WZ( 9,wI3Vod i-OuuS,rL/ *D{ 3vC. һ 5Dӏ (^?!Dv.|lS>N$2|p9_,a=#x] N Nׯ 3Z6|>,u>VX} /.@g8Ϻ`vVwUwp˒D8!1uFKǤӵ=%:LReƑkqF! L/.]GOa 3AHo7:Tm$ՁEDr0 o, -L@uȷzhv4F. 7bI } 'I] 25bBc|6_f%_V juQθ 3tT \ `-kz*MԵ@=Y8 )p O`Zd> stream x=m]7qSH4i>w2܋'G%) @[H?Ia3yYI{1IXwWZewa~9+gKip"Hנ:xc_?A`V*w| $ b*imA5޻O<>@5YX V俿5x+R;!/CxjTYe~ 3hZ_c\0N->B{#춚c ?zyq$9G( ;a hHw6i_DevBr45pjR9e}aJ{ݴw [\륞"q\&WI,1_v .;R-VT:.SlB@;kڵkd%Jm<RhwLQ,# dYO^5^O\=.lL5*a~W{'S|ɖ 6Xi@V0jNcoOAmieJP4yRm h vGxc])8ڴ+r5Yq1|uAp|0O> ?$4x:t&l}  (iDu&F)njch8~ɨ,,um͊G,R)p%V&؎Cj;z l+e| #wna;53%˺`{`w4A5#T'` 0$βI@5ԺԼ0w(Oo`ۣc;a4/p+NJ2TiWN`^x 4 M&7P¹Q.^N10n ~(|qp^ewGB('34xjzA:r@dY k8pLdIP`J?dgOg fhP {͖xk%DM46 %lHX ^^%M8A~[`E;wſ p̎n;ECVAW.|$j2Z) t">F`-10j[B\-F{!|~< ,Ξ(_RFQ#@aBI*B (҆h[CfldUbDT|A{҈о0)`Jʣ$A ]5)p M2kD&(!GPiDx5Ar:Km$ a&FDJj{UFDȀdק %t77" 2mBBpZRZ|㤭Xmy 'mp_# i!lC A)hӬ=P^PzX C"ӇQ~6{Iol8\,3+ 8%@9`C0Wh8HRVr*5c %ybQt]烉X'D.i׸q&o6&t!Ri ZE=,s:Z ϵZZ|?^ONv\Q&Z["3+{% ګ?m$1.U0ӡ.HƝfd Нq^IAa237B*8Cc@ 1,/$zaì ɀU)tAܥ q2Gj)kő.t# 1h;j3Cd@-S%*Sۜ%C/Owچ 8f~Ш!H hbjby_NJIbFJpSP씩4deՔoWT׶Cu:mr{{4>6ˀY&nv-oR^VfeFU\;|䌶F˹}(z ص[ڍ6Q |ː'uܝ,s=xgJӌ&2mti0h7kes#N Jr%9KDT?]3I&ȫ˹;%3|xOF2d9IKށaqMp{K ?#31n /vDN4Q1Y5fv B>wk8un,lr)}N~ҳç aŸhtsX:ՐLYf85JV{Ə|#r34*U%2^&2?ư);2a!ǫAm>BĀHN`ǘe+=  Ȯkm$L9o~;׆6;1n]\.>ٖY+͙ S7Nlho}kP-taC7,n tD m6Rxyt7:G55f5񪄔MVneF娱b]>r ,bnB8Lת0x_xnp:ߜZ3KNf,c_#6 %鳵8웇#k0F/\{sI~Aml|u-s \[<AOs 5bZȻ3CN`YCh޴켒ߡ6M;wCƀ}FZfy$?hYtL.A;i] "'= c"T:6^ j\bIq.\NQCYRPMyʱP4P\IwsF%óR>4dϰrzEy`4X_vVT^CK_R$|wP9E[5  =𝜷k̵伥%/q֥ N@oƻnޔ!k(}AOCAƈ#l~[O>7{>y=ZɈieo`@DkieRH.\:ux.׫a͛68}׾ L'sGw5-q3,zV:{Fz'|ł"yXzX5$\uy% "Ç1]Ɇ9~!1_H[DD+XPtU$N:$T9^ j\R%ɾKiz}1wվbȀZdץ %t7mXF'Ou(NnC\g[]K빖mήJeI[0O󵭳Ǜ^z[Rr+In_{ɹ0l?Z{Xu`asϜcoў%^rŶab;73<2|/=2!4\ SC 9q[\ȝ{v(x ux]N{s6"=[l8{AJw-ry?@Zkʏp@NnPٓEwV>'n(<^ee'x rݰ\Wym me^LԘRmfEIVgllf#6 (\w'! $Rw_StDWWn?0:XJ&LYX`R:qwgk8Bt2.kKvze-1[eÓ %AX܀ N)Bo|#:~."+ 3Uߨ Z7r|;BFƀO\nGI:tx陔X WM9c۟IaFzC Adg2B9"j](HvWj\8 7tn/;go˅w.N]>vL[8O^?7"\&}rRX. 7WH7,9/~8*l3o,2cgFt^Û[m F*,0bwFgư|4'v8~2nLO&bv`O0e"҄4~/beg%ƴ1V:= )t!iİTូpO͇u]_1Бk Gz~@Y;> stream xۮeE1*0pfbdyEq/~ID $\FÄQ=ץzuZcVn8 vx {pd'Wك9 ;fAß^v O|j=Ajg'1ǝ?p g}x41bPibslor© ztfS+u|6| e[a Gs~;tΛ'- zgj\9X26hD q/P&Ϟ59s a!LsFX i sw|> ӧ@[5!p~>9`̏vЖsѡ34nܣV:h#1Nq􉦨`| i+XiS'䬑QfF\U~S*FIuG>|>Z> Qb |gm߼n8 qj`v +A{  2;B\X'Wޮqdf~@B3;A`'p/J핍=SXV ]]BJ8(QAF:[&SAxffք1Xu"g0D%T"A%`^0`!@4WޮPgium*(Q MRA0PaP!@4Y֐ЮC=Jq0+H1s 9 f|w:<m\,-=L "Zsd",tj8`tHT=!P(p_9^"-^>? `  "cTGd C#nP 5o+guؿ!qzJ_lT7v%x?wd| PݖJ:: I:A' gA ?X͟״3kQ9g5 XeZāh\T?}f 3lp1 .FɈWai {s8𺽹O6ߡEjrDZ9\v}"i0̌[ak46#wk<"dTG I~rKr67\ܔZB zi'|9pz3RfbAZ21J)ݓ#dɛL 4An.n%H'pP)!xjV`Kqy)43ıcBcCITw/U%YEF 5?; 5'ϟ\H^X ~Нd>H?I')ɬj'9CÝ\uc>pCvg2 Нd T8yB>9]ܡ*(nC{]*= *;$t%v]PRMwe?R 9( V{tvѮ .}ͪn˗OM#}+/f{|/ȶ+bR+frnjO8n̎:twm.oyˠ•B-c@ NyVtlvՂOod~伶Y,fh 㫊=P2t@^2kxF^]![;pFӖ鵋 q^]2i#c-blI()Ge咮IyqT}s:d⼪QNtawvQY9@ֱ< Y|/mQج4ڮِ6~Lg.Z9M=47-o9UJ1ݯ+@ߊ`AfVʭ^u+_/$t9֙{T$s8YBB4@:ӷ -e,ywӷy3>ɹj'H'pPxa#Pec2# i1!A ] j\/$Er#=dJaɻ囬y!`Lz->sGp}.†,r\qhHHaˋQ..r4Ny `ǘf|W✸]+(qΎyϒ7K?RDiMGz]ސ{&_+07`(y8NB,wm=C~a"n0"`0jxO#\1z  %˧nZKeq*ǞN^h󵼎}VA\ USh|'9:d{%}Dz?,k`^8zQU̵lh :XH]zbe@F>HCDٮ2)"Y3gh'/4D'kșn[UD~a?-5(Ƣy]|.;$L:MtHPFە0z.튍"(SPmλa$!ȲC=`{֐ۻ89+Nߨ IvĽ 5Ez>aY8tryo~,ϭҲ~m=@W!nsغ:d>50uD+cM?g4=\:HaOРkk0ʼ7ޅLz)«Txe-X -Fz:cٳreWԄz/ 3$øO7"o~endstream endobj 256 0 obj 4496 endobj 259 0 obj <> stream x]%EXscyB`B#e~b 1.y:UUW;#BHյsVvm# N__|u~s?w;xExnC|Sv![Nӯ^|A4BuӯG(ګl{_0 |4P^<mI!N-뜶LJZjRrvYzbs XGG ?Ư_Iv^> >hFkG\]8\ЯjڍdXcy@ok/KmTᵡށ6K/Q:/}:-ˡݸK4Uwbb#Nrnzg7 lok8_F&| dIдӢ3:м?FZjg^.g=slrݞkicH.YG{ZӂO%RbSDxVSBO mg,EHe&c]2^-3efF#wB7f3^$(i[b wmkM/xA it(dn<{~ ވ|X$M;a#}i2)q‖wSB5̾adogl^#,#w g&zt!-qh$/Bgm(,mJvwCNwU%++Ýa-I%b'ɇPHwz%`T^h< ]9A/d| m {VZ F<_ꭆ ):9XMfW8ږ]W=;9A)by@cO[H (LDKGQi7"%kDŒ qkNAV+;ԝh/CojvRXjfTQ;tk_Fq3J˸$++rOzBq_8ǶtP:\}aO}xp|s QҞm-,lN0w"N.%]~B(T@)Ȧ鳷xsc<,!3L&8֌Sv~8ۆ$\6jl%dM">DTa@c& N#J;3$|goVh{B{N63@TY%bQ"CŹN:ɜds%xl>m(镂Ebb!3vp ]M2ꂫmәnrl^GKH/Ltq`P$1{q=WlS,Ӑ[a%&:-- .DMH2˴N\B{;Y}vJ5\kxboopr7L7 yv`5VBB!u[Dn,l>K"؋ϭ0| h$$L8e#;ɡ"~Vl~3&X-풟rMm z-d"`*;蔊wxez@< u,Qn27cdN&'X$LczklAuir qIPdY ,nJF'hs ڟdFdK+\) \Nx8ٯcɄ.#I< Lª82F*GaVKMSYy3lfDGt\C%׬J7'ca*e%F%V2&e?/<\p~6 '1 YДҚPb8~i%A"+VT0MYڅ ެٵLE"uX&TA% h|f<9?1dlhQpa%-F,60d n+xx`pŠ `۰ ,=f<ʯ#)cD}c\U0Zf;Xbd!F'3/Xgq@"$dyE$f[B1cg"O|zc8Io%dl& t:lZLZ~Mbm5ʞ%C$(E4]2ۂc s^Zb$!9L$$]$%a~ :b%(b(B{D2|Fgre_0N08, i!E'(TVDK1兘- Δ=2`m0awٍ$ b+NO-A!2r"4Z!Vٸ%R9x YbŒ5mAc߅US$ZP·!ؕbFmVy+`,`)Ԋpyz"Z[aawP-ҕBduACƐi8VL*%}HR OC d Vd\D9zXZBX` ,fa T0؆ex.NV} >,W&HP2lٕr#t>cBy -/qa0$;DĆHq2rR/swY:Q.a|=2gEׄ @ P5<4V{LdzAsUZ툩i$V[v F9ڶb: yViPS)K3*~&&3z*t+V<%{ƅP1ͪi(_-5e#H W6t2`:0H0:TVT[M\3o5Nk~QMGxin."]汍CӳSv#9gXkl?M\Z{fzfs{kdˀl6{*[NN8}픡q "WH4I!6K砇Kz״3da}01YV_BS}U8KۨY͕[j[]b0|^Rd2NG V=7.+Jjl?s(y;/kX\:U+ߨǚC8+xz|>RV;j>e, 1 H1\MsUY9{q+g٠KƷAt ӊ>>mE/%)J>\:OI(0|Ɗ&n]K`_?_PwbG|` [o p;a6 g0jQuΪ\. -**}bl-zH Big%YxS4,9AMX@İ"pJNA2'f[y{WX1W'v1m^&f9 5|N4ٟ֫XPc=KX^⿤ݳpXH> C|yAx!m>C{n~( s?YtO^ƿIlF!jIj<.F8q%g/,/{W5m={ڥ|:U)JMF[H,H ` qߡߥD &QǁUD?ѿOendstream endobj 260 0 obj 4920 endobj 263 0 obj <> stream x]E_4RDn{w3Q4 bԄ捿~R mCyf3;}[";;9z3WOh;wݝqVW޻;_l_g֕l4zٽQ OEjN8i| ?JZ$|rWߩqGah l#*('a;wuj!fuǟj0[aj:<Ԣ1|WGY߿z8֕ԍ8<+c?NK6u++_a_9u4hZ5ȺcM4~z8ZYㅳOGU4kIݭk,#i!Vs'їJ # ]k&\5Z8nLڍ2oOe֎z8fm%lny^Y+V6AFJ T5@F0F#!08?9X$4_L3[{soe-ڛl]Gn\u:[J39ɹEqr<ԕ׎ "Q2)ŧޮWҕ| ٚ wy-~Dj68WA^g&b葨:^Gp8ݣw[!e[aκVRh/xl)웚hfeXu͇|}fDc/ѿ3|wb=]׍f|0vQ3ܠ`"0 7݆ 9*Kh~ؔLg8 vt;hñTFuSub8=ΣxOgUd|B9r'hh5;m2 {@{1v7w|їeK~ \ܑ͍u~Q{EDW=#v^2fƕcLX%G0G&KI39]мZB]gϛUw '(A5Ns,@%?."EAä.>M(VyI* %D2PFFM4xԑ@6 ڳ,OI 9ysǓE୏OqZLz@ ;A0xCf(ya&r.LT)SԄL#r&"s:tx:ɑ a߬>hCPƷd )Ǐ.΁U4VbYy!aQlO[] ] $͈$2^{A*Jl@]8& %*p0'L9iZ6D-%a$lsEJr0 @\x+?mOs&I F03uzz'5ĄpE52沣3Gj&6ѵ(`VB&]<`.mrP`xOY]SC=pܦ\'s-1P bزpiG,Ίb]6MmsqfҘZS LDUOexܨ=FjN"aEpP ȓWmΆ'u{6N5N. )[Bnyϟ#ez0?bhYDa^$0E޸ O 39}7H | (]֝Ad_0bof烆Y~s %yIѹ%JdIhY&RW4 3ll`pьH~(yʄ]x$!36 `tǭ{R&t!!dBb| Jq; { H)zC~f]%'XN(”(s|Ҳ+^)ZQ2O(45ᐩYI&9xեk6 l*AsD}KBU3$k[8ٌS#X ;Ϥ 1C++L_!!h`lo1o+G ݆foMtpDQ٪a/p=PlH$3j\yZn CyOI@|I֛tJz̡X4l0L4glKc  j{]`T+{21.Q-VlKr|R}OB2@ya6R*{[ i ,H=R d)J +~ [Ҭp-,yjm)e}^G' &z.5eϔ{u)9]z('fM BdG yZa W1&ly2DŽOP>>`÷IkPbzx/>ފφc8ĭkrZŴB.tWESYי|Nd l˙m>cg1'8 :5T1S%Uv}{|aYO8w6#}c3S"&L##l:;oZ~O` ĤD9>tR,,8b)" MgTJX !pv H`>fu%80wݐaAE17/7ȱ&HxY$2H_.H>,+ha(H$Iħ">1MykV#z?l|Ul{Є?ژߴjxOήS 0 ~9:.:_UqsyE#[K))[/ObߞRHJeɴR4Ѿ+Zrݳ6xlw3@nWJyk=.Q)v% 9 ׮,)ibm-SZ6P5y~Pv,Na>ƿ`q`_ؙbZ^wvb%u-\ ͗F^BZBoؐc~I XI1|KKNuwt|U,_O4bR#=YӬ4"Sђ{}@Qy b:YB"W(|\kl!pI4T J:T2]XsLw>o5 APSn8͛ 'Iѿ)A[g_/;sJe5& ^i('* oSVet ۺhtrN[nZhqMۖ2dBr;aOdW+]u-FOh}/8c|ssJAƲii^m;U+:Tb6,1dC$( Wue,</\X;'I117Jݵ %kz-ģmvB1R^[ hśEbNv}6&gCPD  E:!UD;kBKe7p?b$54"3 .#4yFmbB^,m-E.ey}t~?<;VjFQ]1қ\o2$Cm*یK˝/;{+o6YrԺ@ߑ1{ĸ:Do8rě6F-Rݷқ=I*ǡWJk@vR[UTW)6up$״dp0au:װ[6W]0Z34? p*OgIV%Rȓ67?J77RL,DriF" zZ7DfJ1aY\Fl6@]/*[nB)o@*~0ݰc8v'ɅGļ:}m<-MÙs= _~"wPkcmFR3 zJ9 *UV/P1GCs2w7j1iua%'hf\["eiB*AÔ̎ѡuXZvQcҬ Zy [K`3!3Lg`p/ƗbEf+muLGg1Aendstream endobj 264 0 obj 5015 endobj 269 0 obj <> stream x\YsHY!7VVxi} bP`8 s!g~z;wq'fiWʙS[uPGɬ>>ϊiE7ٝR }ǓeRKO'Ɍgq<$tI3wǓbF:'q[4cLpx|XJX0뷨yP%Lc8:G W~'A^( eHJϸOR}:zBY_J H9tJO:H- #>+N2zۢ% =E#G^*n]ja;=zm eDWh'qNӊ{ܚ&-x4ڵO#6KTZ|Zh%Pf>3XN艢1Duz8C# Dlpg8=G =Bl56=c 5*KU[$@dOщIÂN2U!!O/J?:`X4pԠmVioo6Epavx4y%$͕&5=# Ov$2fp*<b_{`F5Jel"?6gLѪhY{ۣg/-za8S>%9teD Y FffR3QfH>ԏNfBV`B4u3dmXJ3JWd1uN.lt'͖fNGDoU&60i˔}g\ N:ެHhJ#[%=+Q[O(mt{Dj/`@ K@a }#jEg½AԈGe42"oV}INvRHQCL?܉Fi}rt"$ybO z'B3İwnT#hE_Iuuw" D-+N wĶ|uiȔ_ GV(NXye~`Ol*,*U,ֿ&-@y72Y9lS˞fp[ gJ4J"(Hn+nL*n7l>& _[Z$${XG]2rB]{z9C)9 Q]Jvk]EY1vm&XIknx6a܌9ӆ`3*C_V;7D 덮UyN~Zi;Ǣ VDU^Vl(6ZU\ \ =M,߲7rV17cc?[1)DjĆ[lH_ 96&'4thJsQ>k⍧!Eh\\MveQhF:0VPODwRSܡRvg8ԒR(GY淍[_$WVx)2cˤ\W8#%2fq~^y4ZELdc3H:Z1"Y,zXE(ݶЍי>#Zq^ʹڞ #?!5[ ۅ6e_ muAXK{k DD.KrL# yaFȺsqia*cSV_Ʊ'As!"G's_əVSk]˨*5NVMK Ā/ ֤\iV_yqؾ1;^H+u|gnuo,?lHah>e4ah9Gɘ,@mV4[[=sm"%%0&+| @n6† j5tC`lKuJY7ӐYvX\&CLqünE2w ,r_"t.[#hKO f1DwvEQohowv|%nHȂ ҋFj]F-{5k1ˁf;Y5NRy׹;VZS4>~fD-u؝Soma1`ӭzwAe0QG][@\jJӏjH p1&:T,umq'Ĥ]ӋBZ>̈́'&JYG> stream x\F'֤"W/ẳ/b ZTZ5< JVA}9cr>cD"M̙Ŏ\X/]/ß?ͻv{ov{yp?炩^Xw/}{{.p{܋8|(ܖWo~v\WBe @G[{X9fO[=4hpwq>4*Z1tqi]鹒Ci>+Sqhƽ-8@w֘; t$zyJu\ ; [x |Do*cӋ;*:!?^:~=_eXN5j&z\VRHJt? SVwe?? /`UkVw[`p^9o-^ /&Ux\˒siÝ/C˾J""k|wgNe1p(!}O@~dRqtʢV(tV!)[Pzh1:;z:+$4όBnXS{T9c <TZ%Lx'<G_уa7<ɓ㻔 noRXzm`"黆1 H⇘yoA8PrR` @jVKsR+) R&Jc5YWt1DlVRh]JwHl&` 0#dDqK#zwDv$tYK*N8.<P'.Wċi?*% ?W.[! K(,s" 􍲩 mks Ӛ5?A;ڸd7o%ڂB (G@D7xXo\8PڃI:a}H㚜͓Ƽ &.KR4 gNM6 im9+s+*FH3=DK6Ђ$6OchJ˥ 8r5tT1zϩMm^K&:@Q̪F:]u 4z #4#aKlJ0=ԖHHiZ )dş3^_D2Zj(!%NH 0`k8_ 6i%e v!{N[[L@K +4v+ &ȟ For EBG*FzecJs\' 4T.PŴʰD(e.C~bMi%("v–N Z4l b)u#Ͻca;bB_ !fڽw~fj2|@GJGsAH,r$-Z-hא#W䨓gs q;ˆhf^KqA?FKu~-9VEF,GpAѕ:)8ىT/A+ww0㵼 ^'aehoD,prUkĺR2HzGAr4I؀UNwјr>2Qi@VK_`\ECc9Cef/B'ڿ`4j} t =x g h3^4#V/gkO0y)!AǝULߔ@N1cc`dQ(+gL ]͗qpb_P43vscXrG˛Z4v[ !~cz \uvK]4CL#iD|4(Ђ,d.CWf?ŭTc%wG\S].̣*U'>ˣ'y4}ُ^&ۏC@z,qޫ%ϻG@B5 WBpA_|<$|B׾^m.}bCGq6] O?+exUMi'>LCA[ĞIfHV]yĈƦr_7"38Cpf=i$5%i!b =v9doe`EXɫCljZ5[M&Z7R/QKи\pU<6y>8iFÝ6qAɸF9|jXT2O+s1z#o %UH`TTtH#`@\vC\rqQOXI +m^Džrx T1jE+E[9+PXx=YpD",IS^IrS(8GqcW 6'd:WK6#7Ma DZ5z*P\}!CsAU2KlJ_\Z ڳe䉬gR 陫b͚pC[ '/"9mfK2L #fiq®1**5ބ"4vՌ(74)K}S={DB2QevO7*UfbCDa5LJ~dd߈ײ?~Q̓"kobU[z؅o1*gǠ>t+*}t:e 8 ]2+]B2׌tP;UEpSSD+ ][LUPJ *[U0jhScQD69ulL^Dӎ쮣XYy[ڳ_$:yr *52ѩK]?'':`Ĩ@2lDI[) 5y[ﴶҋD( 1ّ!q{nV++fb.ۥ nBaxݧ8SENlN(OBI},HeeYoۘrlHN~*C3O4p¬$&K$p5VQp1qPy;B沉j,RW$Ip>V;Q.q8K(7TK~봡f%[1 dZ7;ikbF޷2y@̃S g_#:ԝ{K .\. :{J@ io׾ٔEp 6Ynf5R_uf3kNJھ ٨ZG@\.R*ϥM],F\IcLS?@C& _?25 u?Px9|B.9ʩ XFeYj2$hxSkOlhHewHcHg{w5-DEcrwq6M(KX2@+_K\o|DR}{C0M]FobvFyP*:* 4,`xD(*ʇm.Nh~ҥSnQ(lW9D701_ m Tq5U޾<$pendstream endobj 274 0 obj 3532 endobj 277 0 obj <> stream x[[V8؋_bM$G5M//EB2Xy\-xzvzzw!!fUUwLȆǿ7?lore= <+LMO@Ne'E;np9] eQD¤>)B A]o0NdZ@rnDoı+{x]$ D mEY.&Pds{QBڭ9X.g嬎}+BsYz~H6BӃj'wv]QFGG;JkHB2- ؋5 ;q+:ҮVh]W`u9 q9ٖUlS|FvP?^VQ!l1ܫ|0$&@0ĝi4rz.AW8I:ʕ,h2(W8&e0v88h>ZXyjh/:%BJ惜$* ,×K61Dr1B`J(04} bD;& kI"H ~7Oq n%\W ?ʰFk9A a 2B)vB0y{IlwܪIIa0zFU=&L B&/|[clUC2g2R<*3)$ =!B\<!av[oʃt3֍x3^ivXF nlp~r0 cA(:v=lo-礤ڡwsPbKD",ցQLJ';iUsxΕeB*Gܜ#CAT<쯪QSD (xtnZJ`MKp:ʬ50 90x 촕)8;BvI oDEE/B OwSlFi=Jit/ҁwBd7IWOQV",hfej[΄#Rۆ 4W NB ..9F:O~ + b[ԗ )C)ZOXkcI& ғּހV˩}^?/ +ifc+Ki`!E%iQɈp8.Ι:-ҷHs铼"zG-t$vm/w$t P{LR$ѱY8z'o/ҝ;%rR2n3PW޳`_eZӇrgGKs*K3 NܐIYzIY])F(6>Y~k/fI͂9/ YD6UfҢt- s!pEZޞy`_%[_(k^];$ɯKb|3]/9eiA#%ƛ«~3ۥ{錨=4Exb]}2 uyRR“il-rpYB*9C@U4O+.+;-_}+Y{ܖ3:xY<7M8|YtAm# RԿ=// ?Wnө4e"GrhL+)*EGs2B+ɓ|-;h@\L/v@!.%zljMC>,#d1],x>sjUQPy^3ӵ1}Ç5DBN> stream x\oG 4i҇6hlN("v Kre:yO#ܝ7\d,ke'67+wV:xY&]z_ T!O?]K=y!3r)W0;ckY(xϷȸ*Jx,̖0R!brUhϘZrVnR:X9aA4,v?_ɂ1)$N@2 Rg+ ZM[mǃ2ft㨮63:lqJ]nrpЫwb0m0ƯWYj޸т-YZ+WtkŒ~RyEh+‡-"_{ւ6Ed 7c˱,! )$a "wBSm}s@)!t3aYYR$™W9E1 iA B+mf D-'bV q]FVfn7/w!ТJrGakXEjI2e(F|VbL&d =>x8OV+ Kw=,2\43A]֝۩12qvq $ ˘_`̅`!XiЅ [/@Z%Bv1P1:8p M4Ht@DR:xLYQzKk" &#hn'.n l;0v:+~cM3܉N)PI0'\.*gsh,;[Pv"5T 4neɅ unS9ދj$S"~nbgXvAV᱌>MAGÌlp~rЪLD!s705x}AZs5IWDs ^ Qϥ /^1!|Z̝R+aYV1tyQk4 %iMw۲Ԛ[V2C(%idʀol3(ϣ?$ȶ4wNB(MR@ z>Esky@uh r\ӻ"k4=E^pBœiAG"yNHES4ө`g l%`69FmA> =u X.DyVgNLC8M {Ѹ\o Yڗ̔/c/ĔE,JӒ ᪳v5%33/ʶa<6J&ƇB^$qwe15^y[Cᡖ'"p я9xg..|aG)DAPoX$Q&Ai!:&?~MNø8ޓf }Z1WXOjN^>;4whmpۨ.!=F55^~n5D0Ԃ;p9"GO618ע6x+u5n'N@1^Fv ^AC3Qpo[ b؋RoCB?]uK77 (&Aν䎵~A(n9F'͡?na% nubCz'h@_a4< BU 9UkR97:#9UXmcoDeYH9CZ̘xv gv!du'd "I0|C"f!E@a1a3$.bzw+_?=uPH{;d ,Ci@y; 2ycu!\3;ݥL1WP ݦ+o)dZo3 XkaNCҞxz|OhnїT=tv ]x>@OQ4>n[{'8r%E;-ӟopKqIN5]g„endstream endobj 284 0 obj 2801 endobj 291 0 obj <> stream x\oG mAQM/9zI-b[P8A!Y@lIi>dp"m^j?GTuS" :-Ñ$W{Ñd(PL$.zCP~h΀A*!0W ڟNr*.r7.:jA 41S4içD=%g&3'(0GRb2f_ P:`w<@Μ1@ؐ>C,*#+Mt Kƃ@@Cd<#~8 %ie/QNQ'`7 0da'_̈́6s.jpq 䌸HKiȷyqSPW9GW{Yuj+8q`(3 DP9kQI]c 9K @0 'I|E>E!%)6 H݊7 >OV? $|9MuJn3/TMjlcW$T/jID$;* pOI%VP&26i/i!#h4U7%9"Rq j"5y?vhFFfWamdQ)mFc#ꌆ.2&~eΙ`E~nb,n[g,.6,އP|( Kb HtgH@g:=JrB8K&ѓ҅Z8vӖT;whpN}kk`gg͹1vJs+wMtjz4?M3%vl8NQ4 dA^ȀdxL"5m`˛.Gq/E::ZI&¾LH[L&"xGq/om&{g㍒-OQ?. A][$M Bm4#F:~K[:65^־uɯv Tz{wc & _6^&|uGm  FO.ȧtqv~41ہUAj!|Jm]}EdjgpVL,4$ێ鍮aGc*:+li4\b1B:ä).VKQ[/3/QtRxI,㦨Pv0EUgi2IAyLڶNfyҭgNWP'Gi)\G2} ',!;Fr&?;[; ߯ QwRRLR'j*Px-}MX#yE矯[Q*ѽ_n K4%_F1eM~)IZz &]tD(oSjXΓJWUo'²q/+a}ɰ L L=j]敇pe翰Z +|9Hj}>W) #_ۊv]h//+x/eqXtcg}k;~{WA6%!agDآwB#xqJ>&Yj-ޅ/+-M褔NHntfDJCl=)OK\L]昗K.aww&4_>B}|e7]?oe5=G_JV&|uJ&<&%? Vqv!=?NBOt*fOG.; slb%JdH%0 ”@~/DVendstream endobj 292 0 obj 2394 endobj 297 0 obj <> stream x]%E\eúN s$gt|$BTpc].vϫ{9 ِLw}UUuϿvj'¿Gb]u?o5;WzwKQ9׊C鶒O._9ǥRW(+mZAUu+[+L_:FV+~gKF*p4U4ZqЕuM{.48XW(GWڵ{յۿx(ҶrVҶ.i}\#τZeeɨNzCzR/ kjێemI3DEzM/攟a u;IOVwoZ90΅|VOIύ7ۇl#ߏGa|BͪJnLowQUMWSnz3>;>P5FQe j#-K\-?M*lmz~OZYv-f,`c8+FP]?LOMO߆jU3D[\> LR0R.~Po!>==߸ifnzz=LbɎzbE6W ?oj*a<5;xôihm? ;RFwfW09jTEvAMOOӿr=߄Bv3;F5o=!o l~$&h6qjr"Hj!}?2mmI;mn`toM`FZSHH)SKE7l@U+9zQ$77 Vч8zr]9O.YXgl : -pl|Dg9MaDQy9V;j#ڹĴ7#+hᩣPMbHT.c^;|n0tUYM@=DJOO.z^fP44k[ahd5,W^_eR;oDW(~HzR !`-K ʯA=I(0=ƊЦM82Z7K6Re/=t&s?Tv^:ڙH߂E'Z֍ǚ³kz  4i.CPI(&A,@+jjƲ֣'m3q{Su´O}lڶ78ߝ7RVNJOx^)=hKM /76Z؆hI s%90ϵE0Re8DGdG\)Qz;^dğBZ;,B1d7MkS LwM4fʋV]FC7u UUmDL9 VI1Kw06!? n)c1ݤ#ef1Z#8 OG3&!i˰ V6 66y2 W)%Di;g)p~Ț0) ,R/!$+=0k#` ^( 2g "?CH!V6;Q"&\*z OQR촍"8]N]1ΛI~q,{^wHiyuRM_L/ cXDx֢<-J u]ཁG,pYlYB=[G^ȨrbΕSW'v*^?tDT6L6Ea(xD'x "?DRne]F=dgFuHȎ9a} Ql(VEu \0l<{'CNBtH&עp7 ńNep0Fy.du+W'I7&dq~pXtpb [DML_8 TLRAtihS\QB{pY8P$k!!I.aoC>#܁_@f4U+{^y2ƘSslw+Ah(/z¨ÙIfrw6~<8DR(n~Gw *͛.=ti)ObPDN-&a?^Ӱ3/Zw- ̷_ tN>E^)ƠFA!PQm`yp7.)@fM2xB@xspPPɥhH(m e9^gӅy3mZqdK[]fN(VC2" .;IvA MtP{'iomuz|aFK%m~2zan\3&uY'c@H~'a1iW5ߠAˑ9IpAP o^| Tq; Q$ƞ]<3LcLW{H8LR: k*ͤzPh?؍?}.5mmuoe|u\#Ϋ[Ҷx~͉X@,aFl:: 37pӊ5"ys`_ ËQs}1.ujvI?mwcr!00TcL9\;Ert ӆM2nW exQݭ'MYsonks&!2R_hyZ{B jn޻ץ,^1'oM3evVp;C"xh t.R|V*iDI])9fQO](Oc>-YBLv! .þ@Hwľtp8[[1ٳ[oA9ElUZszi 98Gӵ1Kf|7)b7Et^~c?5R+$`eqLz- *edWI/1=׳,Y DY7ζ>R%3X2:2wk8ĩefuY6| 'Et趴)8ˀF@ LpKO_-UbPP2"&deI#kc+Ç*uD}~o7=}<==T=|Pʌ]w57hֆ {z]c 'FARfvp} z{.G71hb?S9ԅ|Ѽ| f#._ΌVqkiffRjf{p|TU'endstream endobj 298 0 obj 5296 endobj 301 0 obj <> stream x\[Gd:WUaQ1SPrJoo+g[)Z5bIegG]| Q)cܙҖ۟ ޤﭨQ]s4?I#z{Z&d-iKRr' ZMDiHk~ۗ$nlEwx($f3=l'UQJ)tY:nGb'lio5쮴,VfGvq ]=#Gt2]6rK.FË 6y{89~ih)'O\W;_KH[(GqZ_sd'a?2F_\+jB Nr)ZT' `5+iK<7;헝 ȡq`ndE0fr]crO,eTwpRN)+W> xry6y$t,=cxl^kg"%Rb$2R¤$6zEEG9MMq!~jVHP[ 躖cZy}rx;\9$Qѥ H1۟xrݘhJt)4tL|Gp b#t~uY mܗ_8,h$]!v3Gf--5|~dLPr4r{ioDɜyg>d;&1߈8ITn `^W83P a4YZxrAc)+Y  k-ȚPUO[$CuGwlATZ6d%gAJU.ĸތmxf Z ;`Z{.QvO&;4(,Mtea)Ꮲ6yi`Ye]s Ɯ5>l&C?XW aUܥDiX)Ap)Q~-Y}8E3]-aBYo~j0!۽<ɼ1̍(1=sm3~{Nr9ki`ほ"6^ʚ4n tL­A vUi#CQY_4р1͊?E~e U6MYv?aYI-GH9hEbxǚtthX.W͆f2|f3L](4qd8RQVsHXFAXY' Lg2ָb bAxgu0Vcd>bٹsmELUͱ%ٜIp30I a$&>m&3f4>G9u _.'BPs0F[q mjJV)2^ԆaGqYbc);X1\-'o3NXwOǽ> bc[o*hf=2aʍ Ԝ3 WDuF{exwHap.6Y8Be aP|}@bMÍyL,+dhgB Vj9㹽ɩYg | I8+? iF_Kv-+F`w{W&s%v2>f0Ԥ uNgR3) Nʆ;$5z{¬Ļt&)Y+$,TgMFݛuQwM. 4&Z~vAT89*t `RTS%TQ4 I"fLyntJ9[*ͷcy^gD\U̬syՐOmE#T8k"/6l Nv = =L] ?У843L?\DK,I4h7].acBgE}lĻѱX3i^2RpP V+,55{dMꭴ=tI3aٍKNg;bkP+հ!ØSS=3ʢ ݷ@Tk= uN 5HpAzE9X}ٟ(sɟ9bQ6ujʒhe:0Y(ʥxXI8G{?(ן1b= ^>Sl`i\m +t}zpb+s|Z6Z#/Of" 66uI\&1:[3OdgAdn S$dOKc$fc&8fx@G@Y cŸ TY;7ߨB5yFo9G y$OC[̿ȒoѧKK>/e ~u]Lny\7YǗ`IFjWx˼GLd}1RT࿄qEltCZ8p؂W›"VT)XލoL1 cAlgX_zFAŞUMW<6rי`o >7#]+8&.}3T1E^y nR)Ts@;8uf#AsX!,?Uq,vrYX[f؀a:>GedԂo&)lxx6 *Rmh zlRz4 ]6}\F/Z摧]B4Xho4LJ}k|O5ugk-}5ؕxDV+U]^k+ԓɱ#\Cw:.F*neWw.GE01κhxu8ߜs2` U^)"d&  f5e ڬqjAU0KK`eKֲ:j}jbmT2d]Ez}Šlh '=!"dQi\fs\hV:W`B%LfޞϽP:qfm?mX 30rKഩG,䧝ٌ%xW_epўz&݃d%ԨRY\cepzo'Xɡ^}V-#~qNǚXqd\Y4hh釾W.&#%E_6 ɭ ?EZN ?؁g2/0$W0|)0 |$nF=O=FWQ] Fe2~rdqY 5T-xE .h_5Tendstream endobj 302 0 obj 3956 endobj 305 0 obj <> stream x\ VKK[PPinÝ_c[V" *DRk>jJ#9vJ{NZkn5+mRL~ư9/s{mlM&Nk͋_nwk+Ql!j[\#W뇐Z֚.%6]Y2.yyi`nPI{w{ѷՖD;Y0i{#K^`d#tWLΔV YlLZwą* Fvg˺tr}]J~X2,^je%U9ZY76myn_坆LTj71k +5Mʶ۪T]~XAC850WCIxu+]?rE8fɶȡ<`U˙*ٔƽJn?>oPC"Cmo mVvͫ$]wxH8. vAB1^]螺%H\%f[a*0]b9}8ADa+3I7 Sws ĥfJ2I5P4 12!:g"YР(7i^|~uu%խBԪ"gO+Э6+mYSRMk1b.7܁&AׯR-OJ =dUf2O@V~\njyu" 95<;H=`$${MZZGDb҇`=lO.J#[-F9K2Zce8!츶#ŏ<4 QheXeE9E􁰒eΒr0}H,hAM!3i>0GOa{FI8wwJۮ Zg*=s4{/.5%f6EC|"1FQ\mIf#_F\&jx!cki34!Ңy D3Jrd;sv88y0n5K 8@^Kb<>b$:.څ@nB>$jK']lyAbq&(0],f>[S ul~ڴQ4a{`eB jGSK%_m5L}ʗ5IN~5VvB-4;=@6:H&_p /.+)O=RUXT7㙴*% '<^]%$HmgX3`x2-" 0Nj$xQu(8HNDz./6(KH~~X;MdyGeÝ}eJqgG^44};^v3rf; N[1#UH6[)oLj-SJME}7qZOp Cq"w12VȰ“jhsfa%ʗ)` ڀ)dDMG0u'оbHr@i,G$W'ztӤ 33:T7M2Àr$VZhWh2y3U_(_t=/,x1/FYdB䂣Gg \lmdsw;:qY8P&KJc(kI7X̎pյ6A;*orP[[}&%wx:)&!F{1tLy${@?>Iix. Fy2~EYB:!PI-̩sQ,K9Op|her0]1NWe`f!I1ycX9ex1̚1a9> #.0ؐU7>L T3*5øq4`H:+-N|P_h猃$_t̫FiMt4Ź~kD3QF?E㽘͔`-gO=t/ U;[VXiM ss^+G[P{0{I梎C. a-[HGڥ|Kc蠻G]@|WT_t\5& >5M*kˋB@m\nɷ NW}jq꺛{2/OYs3w:,h ܩCȦ8{q[2"If{NS]F=$%BZ; ı{q.ܲcU+گXՀJt=r>I3Sɋ883.2V69ػ:%e˙?/~r]- k̷j\PYmz\[kYfV՜̌ 溑>Oćfvҗu{r>BTsUh K1O Zf-e%r]wmi+>Q㊌8)9TAα*84N[om#n;jgA/}/A;Azz Y N ?y WlJr]> }o3fT<_9Us( Cq[4[3Wݞ#եY$Zxjz;*D+漿j<)]hxɮyftSWW#YJWkJrشkC!xv)fuIgǵ f.ȗυIZsۺ+V$&poenB1};*:~hsRj /AbAEz_ ꭀPv3{'F OgUT+1GW´4oHz{(~;Q|(Z((nI\2ٳw2;I[y< Ƌ|Usw((3C5DL x<0j|Qh[j)3jxXї ).FR1"QGHS/MUOD/cD=D5~\<}WӠ]F-at+_yޡk&BB/зFwv? <ȝEshd> HvmSҋ`_ 2KoKeY_YcƚlYWUYU9buМGÄyz4;W?pYiubQGc{W?\ FGQ|7: ldN7z_-7i|R*WUNEw/F{N#M})ND[w,{4Y0;N#`хFv=  (!7Fs}8jendstream endobj 306 0 obj 3623 endobj 309 0 obj <> stream x\G`v,2fLή*!Ș '{Ȳv0clޫWӳ,|~` c}V2kǛ\<>fsvpl!m6:LU(tWh矮y%ݕj˭[*cY)x2X FVR,VkYi#hK_ֳzJzB<6ևEs&+a[Ǜfl%gđc[꠻bbWgj;BڞD}L,|6Uԁapawu988=.<Έ͌k#☇;?gm kXѣFm_n0wߡb4A>4  9 oAڝ0M 3`$ϲa:y)[vg y4G{Uml<ĺ G㍑8)C3J;|rD˔τ(a@*JrtP^qG@$xnʷ 6yc+i(mfeb-mg c򝕨 s՚UBVj-*BWjF#9dkT-RfhysaX^ 丒˓vYYaY5L;qUF ƿ.Vr~^0T|Hv'6oֵ߫`ry HJVua %]Hr :|okaoa^r~*daRRLえ"桉1{Ikw.?9*auQ $?~ZkpF5sJjO*˒YaT*F Qđ`/0UsRP`"BcPO+JA@B<"d9 J]v&5!~2OHHƯC:N1H+_J; tuͅfˠh :z ߒ>#%CIa^A7HHR\jܣƌ] @2@d2[8=W KbmVhK- x(qJaf@MHTж^jgаFv8zA~qkEnwR)ä$*@3P8􉟍;] RQ-Cx8Ca<JH{q^뻃XTި9Ԧ)5[#G@۹F" ɝV|& WYc-z 8a N*kKV=^Yl)*dӹg<ʇL%&.0MnY3>t8@XE*{A[q{Ll5SB?DHݧ66Tܑ@c H_,(e2I &|">VYK Ҫ8T^%\@hЌ\ ʹ.h$ \o*L*N轫b N3Gށt" :H),p{%i:d>DtaT}@h†#-'jRR@)/i6md$ !zh6X\{06f< 8 @G ? )7el)YQ3=Fo6k(QL+sV{//Z>cC#,<'*_-. s K3Wʖ%98GLX]c𦶡LGDBBblB"/j~3Xdy p(I2"9^hЃY1b_ -cv:6 AjwdF:t.*]*L= 9W!q9$>/fQFحz^y{3y05(5rw |JL]y rq#_VӎyȑA'%RPM&:*Q\6E֧ALzH# ul3?1K i#&)T^pd]9R|qrpQ#0(S5EZ0ȃhwDw|syXta2]KB};2{%׻)'sWu龥{Hzhw~D Q6)^I1\~^qV Ѽ{~SXrE@n}7ɷfyZۣЎ %WZL_/ãi*dAL9+vXZ'+} m O!8Nd.rUN#ƔTO-޲ǝ*p@ $s^|k x4ǟ9zE^vg$4OP4L%ѫfCoc w!$2m> stream x\oFV[TR!UVQnٗ!J@) PP[ @J볽3rw9"3}3rșC΀GT3dpzp={m>z>TP3H>MH:N N> &M} RgTH2GQʪӊJ& ,X*)IQz{QzCޏ+bQ Q$QI&Q4P8,*kgP:6IgKQ2CN63=t A ]RvD]b ?Gr.pPY( jWMWj-5^_e5Px"$TepZo5-A-jKF':ϔ\*w)=[n}V{h,zj]^`T%:6n1,Mc1}I825̡E? :nV2ӂ{Q*)*lepX勱X+x7gr_6' ˩y5LA(l5/=ϵw˰E)̷t~AD ~1mbf~;`,h[d7zDS"sT35-}(Pp3j1%.@"xk^w*TOHXjDQ%e+X@\/o>ٶO@ӋPz&,+AS͇T+?P@֝b~$'M\ s?FHN8E7op+1o ޕ˂aG1wC;&"ȿeci+^6JHH2%C4i|i)NNfJSoס>hlԒ+X3kxę6t4k+CqP79Yc;٨ jm[+ǞY-lZSukYwiTs"~4NI;B™F*[mh,YJYYw#RΥ(ˬ"~hEN&lA%+ 2ʙ9R,Tr%Kiӱ-&@H.̢t--:NJnӳ᪥(u:j[^h HsVVNl؋61zTtCśT0ZmO#$c(؉7>q ҘZ+[7ttT L65>T͂g:d= @iY&%Ram}(BdXr:M'm WO7ΩBY/YDw%[NƐHI2@ÊyB CI΍ƎqnަJ9CXylk"b{ќQpv9sB,KH ӍVZ 0찲2|B^>hiF4RgX{`9"6 \еG?Rn +'2tYU~,c4DP%j@RͻNӛ y'u((&K#ɄJ(`bT",_ z& ܌/LSQU[L?.ǫO Urr4;Pkp QK`z8{ hqp|"j8e ;Vu"ƙ#Pc$[gjYA)|a BDax\ nnendstream endobj 314 0 obj 2115 endobj 317 0 obj <> stream x\Y$~lyA ؞rR~пS왞]Z(t(U+(X+ngg_'ŗ#SbhJ,3plb`F?[KS9vKYY-]R[n7 e$I<[vcjKk.KYVLq5G>bJcwvfghtԼ2_qq_/J09@#w-JX~weUI ~{< c e*ѸFc\I -dUqY>Hh>WbYNBs$\׭%6wanDG h٣h6Lp چ%g3di+q0A_KM2NkRb tZsU4xLh+3lJP%D_2Q bVAj%BF7J/GfM)$S礃9bfuو E3HC==6:ϛ[ҴyUY95J+4@m+o( M@>ZxwJ3a)m(:p"b;ٮWVI`iDea1lcoq;X "q;46a k4a|YcW182ff:mt M9chuȬlovJ#߮qELDn[8ŧJF0Ϭp!(-ꑕ1K4~zb}YsoW@ y'@>XhJx3+ʖ M:9]ׄB>yRq'< #aFoO٫H=!>=]Zx֯Bke6eӈ>yn=r4 " x`!_-Z&2DHb(ܘ#ֿXl}bή83/\;e`?Xx䁻U~l]15*XH Eo0fC7r3n]_r l1Y"MԆЄfaݾ&ڎm4M[Iխ zH]Ԋx[oǗ5~Ho9D?2ʚn^pE1G@ߨbБCTyU7+SBo"#!W}a⛑=hA7gGx0 vEUE{L%!<*yH圅sD"RbOՠpab\j]矞G$Q k-H}MA 64_:rLlc%@jH:]^<xx!ɹST^{賻p$x礟K?= BQ^Fl5}WyYl"@\yT8] !zLzZ[[.a;#oio`M#{&iv7tkL_i} ,1RdiAJ1SF\zk:d_SG?m["R9w(og㼐X^߮5襛;~/i m3kuPྴvLv={Y$$;jG NI ۄ4 !3l/H,Rxt YI̟b#b_{X&082LpjǥR-X"xka1 e-tB>䠎9+_?@_זCutLF*_Mwqߺ!$8>e,puĿ _%sm+EW [[*Ԕ.j7k;)KJ7O_tIcK~\LjҚPȸUg8+Tl7Jjt=%oخe紶Wʹ œ"PeftHJl*IT82u1w*V&;(P+hָ!*"t"ѼFP!HW3*7U嶔\+TaA7X`F+0kJ;RxEC:'z-j;s$i05<(<Wе\4H /+@GZHf4'JzLb7KCY`v@ր'xPmzYs[эxqKg&ZUu݉b t|Ncxt,sLa +D%xphsQ$1 Bz04ebUmLҏ)ODyx3\x/jsq}[FD6 ܱ {YGD%S(;B$" xÉƍ@O!cz=I\`z:B4èu;r6 ؐ?ش~W=Cָ]l H4;UNKR WkVӜ`m.]DTp@π1M n S45aLS\瘕SY$LlF90%@aF$9D@vr-"Q @o JI'6of;Dendstream endobj 318 0 obj 2774 endobj 321 0 obj <> stream xZ[o6P@rQkbeMim[A\n{迟dC<F#RO$t_&31_'ƭ"[Tp<(0#;p( `هkF)BMfS/8=60>Y?\N][섾ad㮴3~?r~ l1XeN q5DIq}.3Eʈ ,SLq|&Ui >Oe>c-9Ԗ4v #(.2g|q*c=W-ɯGUؔ(8.8[2o :yPB 6u J_)2&ChK'2z.EPL_͜TL7/.պmKYl[.ac>KD8Y0|DZMF_v:2l6i//C_ZU$DOVUš{ױf$tS j#T)BĦWvGbTZ?m{VuB摅 *W5$1 =+HzB{:LkBk/ov=KƼE9oe&q&e[DUDo]92DWuʧ?R"˗x4KY&}G(\ըG'!tA':q+(+TM\,YMA I؏JmSGV aaD;4a&5;w8? _endstream endobj 322 0 obj 1378 endobj 325 0 obj <> stream x]%GFA'3Ьƍ $xԳ A1$jD #l*&5"*VTW]wL;:|Y՟XŎS'WlϮL#h'_\_ƶ돮XcaYO\v˕`rxe7RVpMkldfzSuK2-F[+%HMa[L|})i'I f#~T Mc(ْIg{Y2aJKtF ;͘o=<9^${W^\=-ϱXPx*s~]J$k;tLx:h#h5"e`|.FD9xL0/2Fp("t);mc29:ג\Xɯ<1^Ari =@/ 0z9g,]~" ,*Pϡ?ꔙUszn89B A"+j i|<{߅Q'QYdٗ3FѭIθIm>#x,fSj $ZwN(!41>\ҿF%eA><4tuP4A%T;k*=Aw;Ymd_w~H(6Ocʏ/5G.pIǗ[]'> $8w%qw͚F!klж];)F[}E_$ۖS5:Go$ns*T!xG[EJlOa+t<φy$<|eobW~i-軌9( 0"_5MHzVT\B|@ibG;r5*DYaGlu3y  Nރ$f;V_sq+\ȏ\W>tZ0IA.WgV;E`+sñkMF2G4&=~RhrH&,Y06 +f@(9wx*6D偄0_j{Dfm@7jgChBD#tjh[*;IԙW_CUF5xXE+^RJY9|qH>oZ-|q(,wTbFJp :=d1Gߌn!b1ƋyڃF N(pi[sSR7 P6˒Є*0$@tERZӁ C9rk < w !Fx ەR}R5CbBl)?G#9R1)Hzjh Ab=h ›3_ CP背AreJ8sR.xUDbVZ!jWez>+%+Ռ,Þ[xU8FbTt,)j0zL#$) %dTW0Qo#172 '.3ifN489EE8ǒUVf#T,"cRI`oAsV1>B ȺI,V)aܧZKc8CK*hc>b0Ű)"J̢X,N2q+iX+b8Sɒurl%/^1 15U2a|S/9z90㹁u"a*mFBhYT5R|@>ŭ^_4\Y[$QyE[Ll@)C xit$7Tl[\I[n+Uv^nɞՋInؙ3{ g&u)DBΊBa-z6*S43^yέMDŽDŽ'9;ʟan c6Staes7n'? B,o7m:E~lM? }rZNàJtd{ґvwFu~ݿqֿoоtUj+ݯnڒu _{?h:s㴯!?4? p|3y^,K¬R.iL(c?Y[ p4Ô'Ql*nOf:v14DCjFȫtQoU6!Qii:ҭsBW 0qǟeW'Bd CZt @,8xmKqLSkhƍwJE*ع/<M341YQbs$X) MA$^eɮ ̦vʵ rMTE̪cRojʨuصe%4v-KTޤ<ۮP`qie;9yh%Xg咥`c*U %Z00'\lT?'7뫷7}v‘3NOFS^Ws?ψpb>VD +I;H(&۰0;n%zë6$Nf4gad/x>\OvG@4 ]wcMj8R& (_6Mn^YvZ,DQ_Y n9m@z,ɮɌ θ?]f+$e4ie1D.ІΒOұ\FB3q-,f涴GQ"W=5 E4L*^_4YU*u UZ1&tIZH3t.Aw| _` `,|Vou)Gѭ"v⓷m9Ye'p$8&ރl(_9FDH(]e gSH06(SzatAϢr8uNDo [&UNA?gd>8NJ-:N8ZGW.n\%ؗ"O "CT-{omW:F<$b,3SqBW5}e?*\D$ZmAHb $жl uE޹ CPs3Eo3?X*Ë|k*%Awfm`^q׻wR} wv@ =\uE<Êh;!Y{턺J.|J[рv1"(]6- Z162$D9{=:鯜ZMh=})ZVIh}z~h5>~:O+=ҹAzƾaendstream endobj 326 0 obj 5038 endobj 329 0 obj <> stream x]6VyݕRV'BETZO/B m{Il۟dۭJޙq=_XŁgWWC'ݟ o^}lc7돯X73s0:nWNe7N~{C//D|?-d{ûa;wBI͏/N ?әu\KcFw`kF.mRk.0΢ZifCO?;?~tV1FOgia€{dqdl>I*iҟT7ڽ'j^jF{W7-ɞH^|{xV3yo3$=>R'16L46*E*ʚ3'ieeQ 'O vD M1 :bDžͨФx|Z!D9 }Oeሼ>\wzS d<wEH)-mO[%rglӼpGj4m3{#߰dA 9`Z]Fa5Tm[ݪ(bh?=a\^uqqJ`G4#".g} F%ʀ4QBA5blWrhK9΃mc#sk0pQLxf ̎>h1Efu̚8G (ƸB%` (ƤЂ#^pS }dYpQC:E?dz|O1)+}_*_Vpj"[u]3ϼ O/Zr}i.}eA%2$P+b(cG/cNYhlە#AIAWǃ 4=r< B+^AhCk-sc #e@lM(`*vxw2^YnU3Ƶ+C;^2#P*o|.1l rUfW,9cdOȆyw%G4Y$eA]?^{ٵfN֩!yZ/:})Ӂ QiTgdbd!MQa4Ph'^\xܵZ9q!\`pWtه ?^7W=Dg+'TDoAf06XʔFZ8y}Iv`FNx5X5OB+)z 'Jb[aߺ{d"Ba5|pi9ր*,tA?9bfq֦nkʌ3_y$\) ؚ `Tۭ5<$ I5iCQ3qi>וkXQvTXJ2}O, զ>_9K9djc07^/bI~[#?EHQ'bG_O; 'L%+a) T9~]2~oVd$(ZBup]߅YAkK1ƯB֗` >Wp݇[qB(6ɛb d63^C$(ͱ4 ׽[ ecy &LilV ZRRM%F-@޸ "sѬ!zk@Ne0 TRp 471M #Q7KNٮM̝RF6$WnnCyfɃVٌG7h0-[3fjV ߄t1-[R+"vUem&qk-l)uoX%ΌfcmɑeCdt"z(R*p p!Ǭ ^a'3T Qp[{+wrz[2`OzŅ@{u jCS\!J\B\#wS ' B/ Ẵr}JTjP,ZDs v 8W܍ M>},Yr|kŨӰZxЯ(l-RQ]ð) k?''F-$|r0j^AY/#(KRP|2Ҹ>õoL+Rjohn^DǔUm淹OR 4dD i^E춠9(K[O"-s#R _pV_\u\+ Ef@;&x$-K a ?]Z$V?UJ+rj`}Nm4@ʧ vWQ$y> DeyQoq2`uiۇ7'X=F {eIW 6ܔ7GЖo&A 5]GP@*I7t2.iQɽ\<@GzR&lGh"Mx5L3yޜ9$CK૝14 u-Hb;2m&)^:p„ h=HW`pN fO/Eф?@s30HJ zGд)>GdHGiL3a9`a"{a,Tێ9L(讫T7 rZYfA ƌzIrk_zj>ZKPv_H:1URφ'xDQJ+C, JM2>ˏ>Al""8$Z U elp,gq{*q)BJ֫E`gKk\β}08B̀#b+T]%r㺘} 23ifmp;y2t?CX''8:M˳nӜVG O!P3:쪏^=Hfn3X$Jm[}%4x49T$'FEBaHohh:IB˩ԡ<(Z}MwjdŶJsXyL8۱~&]((82M7q-e8\"Ό)Y v^T[C@kZ#zfla_1ߵbX"Y I<<:!' OH" 6\ç&Ѧn_EyEYwEb63]{kzR ׳~: P^?KB[_g-lp:hAO!H86Q"H|MeDS+鳵7efE_hgGk# -ę^;g#GW1rq> stream x]i]DHiE-H4:̨UPipQ? @$% TjbgΝD9=XŎٿSν3ggm%Zsoo5eul'ۊ8L0UF_?8{wlz䕬[-8JҕϲRWZ^Z~ua{++ApUHĕ҇A36t/*'Ihvvάd!m:#kSd>]PiHD-@C(7u>阬M?5y[\Sk?ُ˨JFmO94ݒڔfko*RDv·5AՊv3o].DM{ a]5'G{DdӦ#s'kRԮ_`VifRzƀ~_]fj+=E},a+iovddv5AfDIgqcH7d#XO2\ҩ7 *Q,J!LLf5V0a q32PhW 炧E N,/&QəHw\*ёuC]4d{1mͨh5$Q$`F2|#&)QAI1d-^5p(HKPֱ6܁4݈h?eAsi-P"Y:eJՓUңUmzdLL QLjevjtbkQ,~[%D!P1F׈r-dD8n8A#oDVo*!,mдj'm⾁ؚ RB'dB5 -LM\9{dM%ļEF4d-3I6m(3y8k@چ@@Ȏ@aU[S5J7EyLbŴֳA-"N2,zV1lJVbKĴ 6H2.+Ð5Vܘ@Bzn"h'D\xo!{kC14pG:&.qj6ClMȯ~G(H^xCltح IwWZ'd$L23֔ ۶ɧp펴fC>9&lD :S!FfeHnKU6g"S5D$nT3I ;(kh;w-,Z/4?j۹,h7kƮĚu%p  @s]J7>n+Yx!Ϩs~~d:3j~_됄I]b=D**`嶭۬BSΉ^KS93`q6mNU1b F]Hy Gg /rN@Xi@oLײ8om={;6]@?1بĿ|A+(5x737S_ }_|S<YwM/2 =t;}&!Dk8z6j,D_`>́'_./ޣQ} o7gbzfz0Gg|=ݞz<,9I*Z"Eᵑfuq":2Seږߒq&TwB)jTE?[A|pl*8jDVYR]7.Sr"=o}Rb>¨K UDW`<Ys+^זwxfjUqiKG v,`RK}Ƅ&ț ӌ L #& im_"m2UI;y3;Jy_e.aa "v&,p"Y0pǬJc|OCP4b_· p1TDrwfkǜVgr_lRk#ȗ}x^6>yE#iHFŹ (]1#HV5 ]pk.$/&d{SgiF*\+b 8RR fyDQ| hSVe95AL Gd7`n |z:ELLP]A*oeEzdBmmy4h}uavoFHƄhzm7  A$cdҗM0!Ox043Ӄ|QcYbebq4)&a@M $B 9=z/HحoD3>14&8^<8dHp p9t6B}|i q>bf$.1ˋ{NMeN5̥ox-_$!W`s;+;]rh:J_ }DV(Zz/BFY 7z,96&sv#` nѲ;$[<>-@jxn_kBK G|Yo(+%Yi"/wd%j*߻W}.^LfiB "s4U˞=`(4yk(.$WZ O@蘜9;d#fZe'`a࠲X-JRF3Z"d0AgNND 5YNb$19ɺa39in=MA|cÒJ7]'@XRqLRDѪþ(%]=gTcgn@FJ6(Vph]~7(bw& }+C1E!o& nfFF@9tKMj06m4L< E `.em7f$ Fh[°%7y- E7@Zgr!)/+̌ l$#x&f;߄0mZG()'* x2Ċh˚ -i"$~gVkw{8 zyB2;yQ<FPR̪@2x}GW gOi={*XGFSt SeΥ8$F;zsD { H %:(")rZEp;96w3cÅdѹsA$W/4LY(#O0ۚiS4`j.g3L97six8Y^u%7庺{WAj Π?; tx^J=*Ùa0e<֊81ԋxYb.S8BQhPKܱV@^u[L5ć$J;FqEgI=cp 퉽$ 8vеAIF?Ƈ7vutlc'W}R@lto&k=-&tF&_fB(H$dt4x*S;N(o>sb2EcYfreR8'EY%M>wypQ,'ǀr)pA ͎7Y:so9[bq }L /FNld*S\4C#M|"ܜr×^;;M`h}brޑI(YiEA˝PNN w𸽦9=Ҥa^Tgo`7 n) D`sSOltcwFA}lt@n;]$_w\lp 4q$QNg1H1ng+ݠ9k>_TJ_z}$puXþo, F{d*M2CD<^Y݊et־eoҲI bR񹌦Ȋ-Q Mð|t ??[BfPYrhGNQl ~~i%n ]i d`alku>6QAdX C$podIwoИ |$eoP,T=X"yE+kM񆭙[^Wt>η1/xܣn{__>]]W_{,XWjT0endstream endobj 334 0 obj 4793 endobj 337 0 obj <> stream x\yWqc XY2㾦% ǐDG9K;3 5oՊ\7 n?f_Z?__jVvzurYf9ʱ5??>`F_On_5q ec~:4'䷰ҁ ҭV~?~ax+F[;*Uw+RZD_od/A=u;_at#5c#0ӓt90U6BFw4 SU/7J[!7<xvEagR8ë\5?M%L`$ỗπ 덪1W52 Sx~ecZ}~u-km*To7J0޸Zj47.CW+h7 H:Wک$:ވi <|^ϙ] ڠr )j̠)=QuΥt4h~$ r7:8dh* !6u7 )kghsa29W- *aw ^A~G| YrNZoN:Xx,:F0g]J@͸:[s5(Y?Q4AxS7΅ 3.rbhYDV  U͉z׀[_(nI㓟]5% {Ő&bJJ|> dhEL> f7Ru3FZR6سÔD bg-sA\ Pf 1;08wCr w jP $ʆ0LJ}zU6|k.kt~.H>^YNf52m(s |f'i5|*'JL. qK @q s b/ E|Xi*՚)wRH@PN!mɸ=oIvry`ۡGϊ2GdA)ü2>n.HYGq";%fY5r Zk(U?ZT=St t[|A91eRg՚<d,iSܣ]@jlWөޤbOUhJ'!'VU\V LyBi:wj9oxC&ccatJUO 1׈ٰ="kU͵R>m"|[ ^[:{-Һ5O``r&׽2r Gɳ3qc66f4:xmD눬RzEeU]ý.n| .6@A"41yǂ9i\dQH%gRmafXjVo9} =fS}^a?|ü;- YsLB/Ѳ5g45-h;aHES;bd[RdDEn|jz9hOgZ?;ad7ZT}U \6`곇+ nMAk-%id2}3-#~e7V75L oTn@t y2ߓ3G b7zzDF[r(C 36L:yfNVQsuj:)TpDƏIEK5A*p..Oì6h+x1 QI?('}S4R'hwmKU;y&ACߝKGjtz Qae &΍SDr3:k%[@`Ca+ oN꧜*em`G'(6:>ignxMtqHWQn :Dyh>([Nc¡Y:Ugj(Kɧt@L@lۡ-֗cbJ,v3AHb`0B6" #ަg#vsxաl֡cтZzebƾ!\Q]1p/htbBRY!PBߐh^PE>i9"V"Ⓖ4HD~.q@^x$r OK4kb)bl<'\MG$4gb-4.IJt(K2gK&ʷ|(:Ϣj+C乻-_;6?SV DWV2⻥cy)] |nGѻd6"R*h0U8e;yX3CSHft'ђ`kz}nӕ5$1BenX' cӲ{ O_5tuCp.tW4ޒO-/&v d|ѝ; bsᾪk)CGMITTMO(?49"i NJ'Pučm=#R(ӥ 2A D{VJR4AL'(/>'{7N >ZAY4j슧ϤEs@t/r*\aCV~Ga<c.#H8$W"PDH}ъhjO]|7.'#J~VZ .m>]ws$~Ȕ5sΡ0ţ.oQQ+Z>F F:5 (SW Il,mҺK(;/tRWS+LxLCdng޿tssSyw>2\F yoJ_+\@WKM2"(qB*xL5QF?~I]qx9OHG h$ u!9xE@ %?e ܳK6w92[ ɮnM)0.K9DΔS❷ &G|;B_f}*a$K;%nKLhtɬ9 Z4S^Ct`*?ń!}XgH؀ U6/Ȓ_πCIKr t!SfZ5Nl0p"@8Y7|FX2endstream endobj 338 0 obj 3995 endobj 341 0 obj <> stream x]V+˓*hhhU^glTC(M%B3g/eBt;,YvgBnrO__}{TeӷO7:9zY7'_Y]Wi:U&OGN9ʤQד;G7?މL{ev2ӕ~.2U"z狓"L`Ц َn_d)%vӼ,D&G'oܰ|B!<|'P_ρzewo ~[R.|D#"OOD^!!!NS6&l{Ngyp-D ^~)8u%Pz>ԇI_?  jqI'P2^D- ͓hl&J_*oӯ!Z"YY o\gD1׉ |\x~w~AN;U=1'E@,KL=P@H,h A/r{u!1FbX-ksTۙ N޼誮bN@A<|(R g>U˶C0 L4YId[l+J"EAb.x\p Yn|a3V@4 QpAx(c4Z=I{`R7CP 3ƜO w3ЙcV|$閫HnU2?"O-mȘHpmz<)d(̳O,#M `>+?9=2S8p8e`>2q@QĎ3&ƙko0'`6E"7>UN-r&d)+5$'% W[1j: 둯@;}#I#vΊ^Z;p:A el_ R ot{acV:yEiEs=Ҍim@ĠkN6 uU(~S 98Ui9iJ*mکBd =sVaEކfH5ۘ -#OZJ'X:tP W#t{ Bql(ZlmQu⭗a G. c Y/b3WuVvYㅅfWjhw%; @$}fV|\j#l!Y`C#O{O|!L$/9AFqOךgz;L%En rCxs֪jSG+:0{86TW2o%|v;]P-G=2*yN%Jn3r)T @BCǫ3A@{"ƣֱpxg+xw`,cԖ-._]QnREwefਯӁVOXh!F+usE>Xu:gHHp=},/ "W85~љ~%J'A~}&(U&rαDQ8Go#j:ZՂZ)54*BqJ.bz%NF$m2s h8Zp4?JK$}W'R*Qu#RY(,; t>9׷}M [7B1wKJ21,B¤rQVׁ("ެ<-{Z h8Ӻ+Jr+]I 6@ l_nGjA$Fr^Su5#`Z)V[G>L3~[DWe:j>8f'wZn֣\i;f7}Z/k0BH-0rh {0 ?j:{7fwkQ_tm!doi[MbnڛPOuGBl>9yh|Yd1w\DZXn?隺W\i3M+\5yMX֊ߏ4H~V+ǩa$W? mqٿ.v}̄ eB Bq22eԻy-ao ,Y,^c'hNs2Q> C)*)y̴)u׉< #y8n лGfnu5A]K9T)1&qKLvJ`U!*hGBU;> 9QSZ<*.]BU*ᰊ3:'3jh[AVʊLD)pTd,wS80j;mm (ة.f謸d"NHRƑ"pgQ_"\g9"8)HeA6na/})x|1~(n *\ҧxgnU-KխuQL ^&L]Kf^A"C`prp)v]R/ºɋԱntʥCdo";:q#ao 6;;Q;UE0Q΀F>C TU&Y?[$0*Ɵ :HΘ=Yyy I:' uyH8Ur!l# ٪c-2lB>Mh*@ڤ2<N[-ZD~}"bⱧ3z^B!Ԣo5 V a`DZΈlkMi%mW> stream x]qG6{Db@,jDc `- #Q[\-; ,#]~%9$gwEjo/3?Ɓg/o//o|kL?g/?~9/n9;vpA؁^o(n緿#0_OljqOG>hˬ ?A=}6lrQV=} IAǟ>"p~vr ': qS ~GQq {“RP K]i| x[`XB0HV>A5Wh"?I-8]Dc6f Ehi4e:֐@5u6w )63#:>N8Q^4ڔЇI7Amߛ~1$>Auuɛ-ӻw3mhUU}ti4!|譑_ jݪ|T3"(*>O5JEPTcew+2V6MzG@^CW+.Eaz j'Tx2aMX ;{NB N谉xtv3|:6^n5;NMkp[?yX{JފxpM=rc(lxh.r/Uoܗ~_4i܊%S@*^V-RU2ԁ|I:"ɹ5F}&,j6Mt,0[@hEbrpueMtTU&:T#T̀axYv`ZIdZNur+7(9}$K]1["ƾ0YZ _祥܄_+Fk|UUl}^[MU{|p[|;FƵ>ճDH'ЗM|h $lhms/gEܡy @>:+B˄xQW:R&1:n`gfı4ߺG܃G\nzAgoa|(ίnldâ];(|َ~UxЦTT2OK\meDF徛%npJJfjy嚰9Okt->➁wH[ fK{E{2CYNYyzF,ʁ~IxPkB+"+3Dum qL&֣K[qYߊ?i}Ev:[zТWLƒ@VB(.A}x V/)㲗9C?٪"mfٽ0aD)Eb@~-XD)V;ލFx_Qczb@E~Wҥ1ڟ,È. \Ȃhjxz"L[m`씚9|"Y_2X[NU}Y VUrWu@j.y$,eM Gg@4zq%a-bWl)HI6 kz2PbRxU-ؐJ]XzU{KFiXoaɿCXPDXoP kVU"-\+[I<[Xbp??鬙}z9 }@ׂ,"C ƤN :¸#Em|?;a`6b z!2_,JSopɐUQ&3tM#.*\T`jV|'x9][)kILBD:N+d!$tL8$R0 <E']*࢓$-_F-D#D%I?Loғ̙L=jp|q^NӷJ at|@(P0kƃWeX.lRo` |@\5e#O'DfSb0j.yhgs1 -Wy)r= =U&}ѱК/(:(;~7ԕؖP񉔵jPGL?Mg3bZ_#ϾD ?Vfl6aN~֔!9ZC*7t?͟~1 u<~;QG0O%'↳zra{J4@S`H&􇀸(²Zp;e0 _a(L:E2s` I?-pZ_IT5Jvp3b09W?PaO& p_Hhܹ¿Hse9\8۪z Dg #P>֔zD k7(yDUnfML`IQt"(VuTfPS)P"~9~й5E<4\ʹ2'y~ΌV݇ЉrX]|3㛣 Xou/B@i؍|ZBLnKr ϧCi蟁429KSfMe8Ct>OʥJ(8ñUg믇(P&€Bh T8vtT%,N!r1Z _B22p||nׯP9\uVՑA*q5 /%F3:/vKe[KF Uյop5s9q΀(Wat8J園7!|WueNy0xm!m]9a8~l6T* mC!ʿ\?`boM7zKdTS/P>HD.ߣ+tG㸓*sHe,SQgg-){sK*upPcg+{P@ \C#ѣ:WS]I#, AӶV^*Eą:agtU=(my&2raS0[.;pv4ݤa[m"i8X }6YJ ]p,Ki7nxR&u4pU͛6xmع,g~1VTY>?s% =4@D`wfFNG7@x>7ɉ?{ m]yRʱ h| +`Mp(X5 $Bpo?vO;8ubf'mYg&mb' m* 7ȬR"5ߪʫp{9:s*-uuUהQҬw)hݚ°уleb9Ok tb gNpP 0W?b^b5wdY-QlƂ> stream xYmo5Rt U QAh !@PU%)M]6-ž%4kόǏw YӁ?' r7/Nc ϼ)O8q8&|RUMH N';ە` 3P~]IfpG10\,ٝԝclܨj`ڂ*=ISѴLbdzm~(wz{hF=ы bd7Az4'wأcbh?ujn>&H:"y@}M1g=: F6Hxێntx >NpQ/V- et4zT/~V2ʱϴ$_|JlWvOX3yVǿrHz;p2aڋnS{Am ">?uoȐhK#R٦fCpnNVD)v=+tJd=,HN`w:dY:#!i[mmtmK-\tAm^k?,eO6gwdəҁ^VfIG#rwXV0λMp8HN"]:ɴ)kdN5C+ɭKJF6ӥZXWx-l ~U84\{tfrʅ2y{^ +1 |a`B f.5%jΜ0My5,pVΜ)T]MK-/V*//TFzqǭ6^pήPFb/"Z[4`Gqx񢥕Sopna6&r;c -dB:Hg}OqKd!"Ը/HI^ +EZ-ZtoYB ڄY{%qi(xsGTR(0PtH)<1XW~JpkOB^8S~ZUb&F_ +e s6JaX,۔oV|F\~SXmʙf0ln ~? X @!ąJ0BOk\LPNRN.ʸ^N Il;借|ۤ0l$IΥwL}7/Oom13Xx sw(ga/W,FQw~O]ү$`v 0|g3CJ0܍8KI<$ɖL F!S OIk?8.; V<jqa; PRUZ&Wa >"̢;;__T<WK" IXX%q3UMZI Ҍl/}e F#J3ڜ˰ttN de9BLd8OIDFڙ6յC]^Xe3 7ͮWwU ^clّyPdR_"P$)+OV~ !\7Npz6fF^*ԓF=+U6endstream endobj 350 0 obj 1559 endobj 353 0 obj <> stream x\c /DD5ߏ<,c9"r ,.[ytWTa鮮n9 ?qpogOw޻nf~w6<ܳtWř73T%wg7XK=]JjgRTq/E*g}:sx޶8K5 aLZ,~\ skr@;ü 9gR\,-W0'^^%֘Vrp}^rq {åV0u1aP`V+ R]hG =ީ̞6rV VHHiڷW4|skQ] ߷kĵ̇}ѻ@&*fqq`agUQhz6z)pwf8Ȑ)`3]XX\P-ԋ(DCu^5+{K u𖇉Z+ypxZkjJ-~\kboxlV CL^ `@(s;8XP<'B5Z -_ׂ3MJ;xk2aYXl %E/4B`2PYϝ#HnW|y vZG^OXrU) UFXޘ ʁ+nx=4ɂzuCNb)02xfL ^Y b?msB: Hà1H'T;dFV}z=2'H# g}ěn&:"+{zNlу!1U @1F=At$^hOX %D*K,4#qqn *EFOhC+LKL<[$؁٧5az],rq-|ȇ<7J=ji# QN4,&o쬜ÁuV)d!2jouVW:H}~|~ȭfڳKkNǗF€oD^Hz2t㵛1[!x.$]hmePzþ~]Y!0Ohv0c|;R|'DŽi')nNM=D?^p|6;x&<ݎCYRk<"\dmTpBA&ulu"'rHRٍy(<ȫhOKVaCGUB FI"#sNd@ZvhbMyպ9&xot/NIDZĩ|Xf]p`z'惂 uJ}F9/Dd CdljO.c@,&J.5^OixV͔ut,O eMݷo/y'D8%c+= %\IbR6i}?iuMmrnHldL8O-(i&Gi45ġh$1]jH]*P̨A\UFH1T,K^̡\[2Lt+B"O3w\Fim|UR@sKgbl[krOYmzl Yc:vn4N#Y!6. z\eF^1 Wx F-2|2!OU6>Jr (B)@Ϭ8^ZyFE!G*"bpI!.P [JNE |#B.Bk2ء լK/'BلS?:L5tzNЕ"|yymvԌZo$(EGD'~3,:7r><qд-%)މTP蛜H= =CA( m;SFhv eS.:½&wRoʊ-HGE%(v^ '_/3_^(3LOS&/>L]wꚜB,ҦnaMvUGwh:plLpDꡈ5܈2D75 94vI],_V~]"L*➜Tendstream endobj 354 0 obj 3172 endobj 357 0 obj <> stream x]%u[j+BӫVan%iJAH-JYV=x澷KZȺ}|q`0GOpe ~ Nj`7Ӄ_=<~&r3Z9A[f,)F݃I0{ ýrЋQ±y8ZkG(s~W)!/Gsq,-9;(`%0F0F?Ar z-TsB@ 2G>lC<`Tu|!DJE_fq¤ȏ ]X`0 ꉍff;owareLQi3VXu1#.t8ǃi8tN46LI*T1{@l!P:h"C#16n8G[+ayJftIy|tRirPSM{=L=X|1E1 QLYڿ֬kӸB3 ap_1|`vx reŲ.uw~w8 4bZ$:5 Pt)3@օLS&x{Z4h+P L|K6$65bhnh4`D45Sgx`rܢ4hlDXYtaajRԋƻ{qF5 $N2BN;4w6 2c^e Y &iƑ@OD;ffU˛{QoydݷEs`E 8z7̉{8JST&?!;qrT&} AĢE!Qrjf&煨(J Ҋ@ x2h+ü]B.[bX2O-h ̝0>ZXS:'@, )xCX 6`} `bjOqψ HAL3b9!&#ߺ cT<25oWTkdlh, 9gdg_>$}rLI\ 5 1 ߒ&*x0YWhSm3a7\4I I1A[ᐫ[.qg!P(C\ecme ` Ara99㻧aZHC/B*޾և:C Κad)`J<\oZ`"ܻO }@;t"1oh 4;,0 RZSo+tԀ冎K%7.fvzBR4B!+r{xIڡ"-U M; Asv+fKzR_3OwI>W,D܇Mt5ܭXhFh6m 튘y>~cLi'g4GEmȕv!GQ=(}H(9e|:&T%C" `PR oIc(N8_aHK,!\y^T@(%"U)#ߗ9o% UmzӒm)A.d +q ]ט$\;lE{I:#|ׯyirvP::ʀH,[M+q* 6M/|ȷZ܄hs?%ʔ4) /#0/CnR?!E0qaʍx]TX8Bc`y_Z?򻠙6RV?>ov΋Th6TU%7YegQ+bZGs(9|eJ(aKzivmBYs&"J%3`0MiwO( 8%^Tsݗ֒ÐH/=嘺ZJT-Rxgq~L_d"0rZ3dI߶l }I=JpX9q#ywH9Ecx2$Iw[utC:薜Yu4Ҫb*&ܖTŐU}H#>MG ݶBf,:\Ճp;ú3sv+mڍmu4A1411]k%d v"~˴ɀ Ml@j"SwZ!@jF7]{%[!9r9j(p+7 h}#x#\蝘PD7($D2ʹrϚOڈYtq[Zkhmn92!]ob'GDcDlXYVtý@%ڽrc)}]Z#Q"i4F)Ae]pBvl $D< 4xm|T6{|-8n0n?-@%|ٞxb`L]Ή0`E]FR{Mm X@KL'#СI!.:u:o[K{;a6NEׯFvk LOM;XWU`hz]Z~21@D vmk[.R]P -qPT1^+<,|5t0X} ~ʭk59r)'\Y*njcmM#eE*^1dOKֱCZ;Z2 \i̍1e9G[]D Ӻ4Q@T=L~Dy!=9#+r^\SOZLʒT2]]B{-_(6r #87:lI/2ɉكERRv3#kϽ\V4CR+NަHW#@HTAG+LDb3Z UDaɊ[(E+!N\Bۉgm[Q#>C+cxAE0ؖfp:-9Sqḽ*ۢ} ۭ+{A1pː?~>%[])L9o.]e/h@]`[hݨNg7 Quf94Xc5dmwn y7pJ1+_ֽG܎Ւ"PpdUKy-`:hq fCG De5 :Ӂf[~ڑ}x&l?j6@ro>]O&,kH:#t˼!:i%-Imn1Yո6/ܶ}$zydZg5х˞+]'T%vTF/s- "";UiVNZ7ؠC =::6@ͽٛ 1504RiM5 X.6A̠=k@ bP/#U޻Xh3R-#jxfJL$@Fk\>#H&ӁXZqCv y~USu>0h_, %C<5i%dxAO<:|'3mĹj >Gәwb-77q,tZϥ}ZRwm6]MHԬ58|kCr(~PL-e?uΟ/PK?Fݫ)!e1bTjC1pgZ&u rgOk5ÓBO/"HhЈLtXEX1׬7b@?O$ab@/,9^@*z3V&onmL1TM*un):YZkmVO %}7tm;Ii )ўL LU;7Xo&_\@;G[tv3 u}lSSK}_bll[өGeU)M۳Ÿ(.:8<$ԙ(=S [E+;FEq%"vndMܙ ŸNPɢGt@ë۽),oy1G /h}!@$=󵿎Mh㻬T‰GvknZLjw/ _aǍSdVݭˏΏKArr%s'5{`q-'E|}O{=ޠVV"I)?W߹'#}sQخEhoEendstream endobj 358 0 obj 5414 endobj 361 0 obj <> stream x]<ݕ*>fX&ď؉*UҭP-hE/-bvq23w!I9~SWojk\>:7:@ۗ6o_tU6_U׵`ވbѣSy-+yz;V1<ݳJ47vR-k--XTR,Ӌ>Ҭjۡ7wUoLwme̍MϿ{nd[vj%gR$_345y.i*ݱVwBD/AږEO%snϫ*ڍ08k -틻5_adWMK3&}ݾXvn+2Kp)ec-,}3́{EfswX1z)]nil.F0]="/Pn+3" *<%+kb3ݗz6-#! ,AeGpQ0rJ^X3oH g Ϩx@C$NLm(w@`KR-84#nlCd2uSˈ+w&$7!`18 #vBxQu ˼,5(&b]l`xFu_Oee&U=\:쁌ۗ~Ԫ$T-nCp hEv[j+F+P }@$H,& 8 RAф4}76 (f5I+&XȗYǔt 䳜fDU\adBJ]F)-݃YtU[K Al}$ b/ư{/C8=ÀXugͣGVk|֏q{/R>'@>v# BtH- _y%ZteQ94bR F4'< jA%\}ѾS &{BT}lG?R1`j=kvqA:F~H&3žWFi pyO*gG1裡3%PB򡾒#IvGxﶴ \pt$,n,@tD'0؂nb^:~_çK}dvyk|dXRMw$8p|S !ڧT͙R츈!,u 8eQdmcY|r="&.&kq^\$d>0N 9Ixe\8eyKD'D>uR38UI첨 |!dqc7E`̄)s>?(`q|O6K\g@>([2i`.CA- N$ɂFH1nsypgBBsVWu-[]daX#%`ޗ{ۇ -OJ8L <\6aI*D\ir7ڀҊ190 6AN Fͪ%a';YAbcd±R5g3oeLn8ĞqNw&|#H H2DŽG\Ɖ HxeM.-: Te9pNiS8#)E2X _sb]X83 7{IeY6ĮDTiА~< CgDq$ldl2֔5fg i[.ɘ%ɩa.sefJa,qᬽ*@sɨ202%dq^ lHNWL53/ZEfN@]i%ԟ;W{i yd/-p]b@ojQ v;/x}ȇ:^ gCu(+0]T=V ̋@.ww`יX;tk4 Q|EṔaKfC;A,dQ D{{Y$0\񕓊 죵l`q~^ Owz;V@G'}䤅)R"UC**pT٘ȩNLSʹžseS۸ |0kAzXf)ĺA.&Y)0 f.\Uxf^-*tl|rV"t:5q[\J hc #܄/ k։O84 BQh~?|Tm+F+J)%xh%ZoJ8R/R!9cxe=Jh{i,͇:goG 7|Gz~[{9Lעp)rdΈ`ѕ'h/O_m_Tq0i1ݰ3%>}ȷ.|k[?w|3 ®|~}K&$m~|  ݌[oml`S܄'CzcDxo~Wp=Dޠ 8"pFlk-qmt4W7Pk7P`A(s`'jp^eyS@{zX⿕1&ɫe(q̣Ȯ2g4؉9R);fŕ"DhT'MeeXF^h-Y^ ̈́WhSbK1e|0e`"/_t'8 '"買k(,Ө+We!6n<3\h= 2endstream endobj 362 0 obj 4749 endobj 365 0 obj <> stream x\[V,%'Xxc9ҮEy0 q8cE920<=;]=,'!J}5Ur^K%ΞW3[g7Og7yUTz~xVUeKͫr.lOf_,ORH`¨bPVK^hlMϢdIejԆZ\B)^ŽUYXə.W`ʺ\dalq2l+V(Dg-[|i.rք+t{T$4Dk:YG4 kSYh8,a #_[cLW pLtrre +)Ctfㅬ*~7X3X++Q(*xg|-_<\2*yQZ kuݍ(yՎDzUN\_XƯcY0gΉ "O1b" AI!wU8ܒ?Grj2XtXE6OS]R-n8_]jr"$ԯC/r8kQrKL {T:'!P5'4&idɪ+ԚY'˜c0 "aH'#6}[rK=Z&̢Ѯ5WR2:up#Ɋkɘh.Wb/bsNvfYJjTAVFd]d~J3d̶ltȉ^eM sTBk5&7B<p :c[3Uԛkcy,`o;y(ݷǧ`?*xU?q.ivԆdAq%X$+HH~y$-cHܶ9ږ>/_`eV|kt h]\$LvYƛ-r)h_ڵy9VQ-}xE'JF{۬?gxvq҈ݴ}6SWR@}%<ܜ tz a3_FnO;HeЏ@O[\ *iw z"{gw7XDT k|ޗc4#B1x(vAN8: `45o/f"yɀvl"%DuMC"^4D s&֪av p!d!/_z ;'ΟjB;`}kb=&`c(CV%R`)1 ͒5j4EUsIx$=7IYTBT$ f w-3Ʉ48l.&HT8IFĠ~7fqd;UMwTVb"SrL$g#|nG>OPV^ZS3j'gIMF.ý`dRv9UK1u~kNr|zZSB(bn*i-Q䰢:'qFK9ʜg.wk\:u usu_A-^w{g8:fDԋSBcզʱֵJvkmtmW+x<8~Q]2()Cö@aN*5bsNY U 5MJk}{w]tHHԿ% &xvg Q|F4ܐ`hBS`"2nc%p׵'vE~ބ\&45b^\Ӣ裩MKo5e-R rB\`8kclzJF57rjm>C|lW%q1vRIź l_+3[u_[7\'E߶%Lw W zqfOV&XzlRY.$9SNnGp4274.)΄&pE/\ca"H#0Rap8f Zsq ۶c?#`DZ)J=vVO~{pG74#JgUNo;[VIXt"PzaSb X% Ʊ3k+BP=e!v?Esc;(N~~䚃7zpO< XN $ @'<&,bheT4Ұ[IlpMa4Po2,uK)}rManD/D`,F?&оv`!F@n6H3|x:Qo7J;R=6<[@ZZy3{p"|(xh/$7>4ZAU (b"1*12݇p}g#u!($cDS <1k"XPd$2I$2+0a+_3n0aQTID <ip`5g0B>bMQ0+9-|%"+NiYGWǜm-l8WDvrootendstream endobj 366 0 obj 3122 endobj 369 0 obj <> stream xkQy@̂12BIk{~?$8'#"X|w\C>語;( b]S/ VrQgx^\){;mKoݧ3Vzq³BWdzO JaUx{0v/ڇK^J팜q_RIƳ9mqX^:W#bJt-f|XRkR`|RZ8e01XϝdެIwKh.O"pϯaWRx1.TzN%aie*.b~#B4^,M@& 0Ckjhr]/GhafNܧe(nf"4YΥPT:$[Dx;T6:vד!ϺNZ.y1xB QEcA7l ԍҗV-diKaRBA{pQzr%i,L f!0@ 4D4sp| KςhG! 5 Ҩ4ydrFzܯZ?$U^'E+oa4AO`aInL`MF\oԀ XDzŖ k}X M2Ltd}̃ O? guVl4`^eiĄU_jnK!²P,4h۴/+J{7:ݑ+rxrRЍnh.m.R^w߫F>N8;*9i47;ג`dZvzʾsD`%swBFt/9S'r q Y%|֬ EwCk?o9O} OEEb&4"&$h^ѵ5T4ONY3rP7T/௛y_] `H٬g0$M{6F{z(L^ m8C1Lao&~=gSKaLk^h#erD?u.k^pԚr^{@ "1LOM} 1N'ͼ&wNQѐU'GOzõrט=NN\DV攥If6h3>4eU64 `5ʼ!WFLgZZ2[tF5?p~%b5xᮞh1t5nL[g[JϨ"Z5b<ȣ FQjM{ًik{x@ 8cgA_rxNǑScҸg*ZW tf}"h֥SnN쐧nDY٫qRHRTCLߙ t !qtX *՝ iVa_9:{O&β{#v52L8`$CpcNj~TiBf]lTh>!uXe nXL83 ={tNHB}D@ih7%Ψ)`FE3xT8D^:G'+-tvD*bN=y3.WHG;#[߈0K*Щ,cgh A)v4&o:~&=G8O[U&wRT-Q:"e k❘>߫(.mcfUDKnh3nW&gct=ș }q:N>ы4j3ş2Nq`ZťOM% L)tqz8{':0s}^+5[sZ'YZC,}kùz3p B˄I(2 :JQb5ЅI@/fDendstream endobj 370 0 obj 3413 endobj 373 0 obj <> stream x]%Eʾހ,\(9wߏ(I u &$VLWTMܽKl2{_=:g_?'gC;ޅJ^8NJ-10#zb("Ǧ y T ߣFM0j }Xfl[צgTT_Q-F6P˯_iTW(ohoBps:MuJpկlsihܳ"3?'/brA-#hFU|x/=]m [/u#aňj8'\hL (RmBD.T{m~&qdJ9;;uF -WM@&3r0C~j"24(Kˤ0BE26'wpiGݠuě'Y6Z x߷ZN+mvnނ0PZr5V3Thsc7յXN85J)ai1ZK Lk@$=J/ĂיX-pwLRM b7Z8rWvց7lfP=F.uQd)#@hEʹḮ} *EV:Йj1 *<"9y!3TbVi#LpFһ.GPo4]W5y#siӅFcr}G)H'xa>I @q^nT/?qi gG z&5V"HƉ7q"3<18[Q A~)h(K$,M&F} 8a8둟\` x}߄d磣8yii΍02ɷv)zef+ ޛ>:9!V_N%%I\qֲ.VVG(BXmDGX`$oSYJW_LH٧xjGDcA Wd/6j3>LaxS S_dM;Y!kǣɮ_0rvP4gL9@yXz eʲ&&H+v2K% "5Z KH0\9͙YB +~wgJdQ9T@T R&S^aMw#ڥW(hu}~YJYA E 8r5x(|/&=菱“`&7D ~Fч\.N^}sj(3%P IR`r90ԫ?(U]&4Y)w 9KVMeS(}Mk82EJ錙6_Nq#197kQ۵/+|5-1!nJ'd@'^U<k%;inn#jeH .[`7Nn61k7\__|^]iGI`Vg9X%g7{"TE}Y%̅pLFwu&02k_z~BejOrLd編L`\)yWXd߼ c#[xݎB314$rAuAc(`Nzipr>t@gFB:J`0 DE9π9YB4L:Dd -1LxP_y\ײfJ`ʁ0fTo<AS tk0:3Y0Z3-d]lhjvFfLL+q-#l^eUsm,Ipvg73[^թyt S.LBQjNDAϯRK>0뒎y®=UGd{} v졚+ۂtfdr!c8A|v$evU˥;g1:f8u?-yEqȍsb++Oł\;:ϙQH Җ௦&qxfu϶.1_ae7z:6@>;`ɀO[+ra2chJ7EpÊ30 d$&=V%=O2pe3qrȶ'BO/\N2/Ol~>cm.L GC I ڬQ;*LT3&[+yVTBქ;3ǁ9]͓V|{&ֶd@ӳFm 6N:ѡ̎\[NtXK]ZVxa3OtSR;zsrZ`L>L]{r?D*Ro5ZڦmnJQ8eЀF'jt`MsVOî9@.OcVJxM~^8%נ=]O_\M2^zth ͔iTd<8iuxop紀yzmE2ƑW!kUsZ#ԁh5gxq١s3zқM=B"әYr9VfGӷxh&ɢd$tdŽWLɶN+\ɉLq8Zrz/*~C|i" =?.g-ͩZU];2H2/&xw8k^ؘ4MO9kE17þ&ha_:y1kI鰸9+FѠԋ , ,0Y3e0u=/NK CH>,ZMy44/N!-;#8:۹D41E<Щ3檫,剺Sj\3 Xݸ `W6-6ucX|0`A&ڊ~&HE ofQ덩M>YmDm<}L"inQUt\I鞳 -gnc4[wܵ5fT+*?139rX 2DVWڪ| 8v%8}@]` ʕVlvtFIi+$^3cnTr)Ap=/[/#|X- mh*tm]^Xfn53S{~#`50Ys`1ql}F; h /1,=BZ#ۿhqQ:fU>_=.FA G Ȥ6겸")&K ,9ala7)aӥv|x$i)-.\K%{Ӂן f7.hJFtt0BP@YDޡ'tVykM`\.q\c:wƷ֡L^){qc\Kw.Ѹ AJֵ7ÆHo fw/|H[+[31iemz' ik*-3-~-.uq`qcDz3~bޅ J:|=ʤJ)LON:~sJ.Bj4|w M(k}U ?[~ ^NVϸoPФ *EߤQ}q 3'LlXmhNP jBIᴓ!.$!LF%h 8FD>yfHoh]E:Gfk'ߞ3", lHJ%@0xue0]x#l\X6|>ݸr- oNyCIK ,50u$Z ̴ |Y[Qk1BgT|qt nW$^!`J { @p!+BrXܶL*M* ui&% D=嘍VpߑEendstream endobj 374 0 obj 4930 endobj 377 0 obj <> stream xkoUmR KQh)M6*a=6jS I?@?H*̾̽gm AvqEQ1.*WU7lb ~|\|~yS<]U{Wf ^qxu*>JT a5g\Z3gkΗZ2%+?`7F2Yo *7ܙ=XD+dX'} e CaJy_^kh _]k5ZI͡sbTM3ѝz#a +uYPQmcB+]x[s9c_&^zU~TQ~p;[XUr.[|xf-Z/{*j$bZka~TB]>z8XSp=:^隑wZ{OuFqLH b#= yVyazbbm*9:CLXVsP 6w:P_St18HT.! !,i`鞐\!pPU, f{u9F>2h6Q/VN %M6J+t fLWqr,6*v &p xU%6y l1LZX+`zYMxX[`#` K^9o wu&*8! 6^k!܎G #!C2#d ` -U-7 ||Pڏd')XZдq=Da8Yk=ih@FZK $E@U{Q瀜}!n%xfUcvYΥz( š9g؄#wupRϕ ˧ >{.Q,9^7DNpFC~ –qyA2GZ0 Ay|Xy=afɐ2"R$Imy3L;Zg/u!pb*8u4)hV D#H=_P^%519ASjj~;"'W`%J2PdW9J- sX_FN\lr%\_盚\A4sy78ZߎWq(A)iFU~d?Zf^^֦ViXTnDIE.t<&QQwr,O86ˋu)^ cهE3T$3q[ hpR RA ͋t*kpSØ>wkOi`eoF7k)HU2[͙nV)Zм$^9J%lFB:7BFܤ5(j@`dݗ Cv3|rIPś-:J:)5#M(x%Hd™YaJ`^Scnyi2¯ 8ŽDQ41#"JVӎk?OF,;r*η [0)HXd"˜)qKXwARcitlF|"#_%zLZNz!sVS`W"cdD2:&0uaF%=rjd~dR: "&/2H`7VF*O'(&WsBh0x;Sȫ[+u4y FӬV .DGgDl[-+ Z++% j P;9{籩{@n|zԈk2dӥdjֶ޼u\ԈHt^Pwf&wt=<%`* üϣg=ds-̔o5Ij.F]IZ6vE2"fWL?D0> stream x\FVB%6ڪ1$>s TVh>$ 4E/fmά=K~QRErm<3N Ru"/>މs. :뇏_>8D]<ډ! Ԇt$Э.?Jep;]m%}ͱ5B$?H)GT,pRQ+HפwrӊV:X3JF略Zos5@Dzk-:WA(=Zy~jY5sIa ΀'X}eKWj9M t2~}`\l)n%lK4:F 8f笲X91~Ȗ7!`/Ө BH ӵ;GE/'ǫ%ƛV!ŢKX )ml裻S5`~.:y0.;๗Ry}78Qi(Gvlj =8!TXbpnHt9%QM>i`b+-IMq@2s=2Ԛ8<~.%hÉ0:17ŧյrI+\oBǿN̡aJ]'>Cnr A{x}Sd,؝d?BP*ȼqWNQr%My*y#Fr#HZWnnoz+;?}g/J(ka|3`, >EɦbZu nPw{eD7ʋʞ"/0{б@YJ@)B heT'&w9K&2OwRZ)cc|ޙKE&JZ֝5_X>17_d;e{x&{iDa^QMu8*y5>ƕ x*mVEk3:Mk!v|7KVe=R(l@ L5 qYp>t,BN*XsB,}>I_*2eI(Oq7R]Ez +̈́F^g5b/P!+_ID.RBhe*Ur,ͲM;pY,~tW3T94/MeQʢi¥2+:!u~z)B5UHmB!82g8s]cwEupF8ԍ;V4%ol"r<>p :+[Z3ݬ sWS8A;^̾JҖm¤vv9b2N3W3K~|0rO]1BlFdyXƘHؠǙ 5)W4ּ`)(]NM5yL jyskDPW͠uXcI,‡MJg*}N@R@!ȼ!jH "Ғ"\%rd6ldȄ~4WV7k呅z_4|PX2 d.}H)Et$ ;O(ɑ4!zҰv(2H^2KD⤎i6rd\T×0/nY!_zy̪#UifjK=3dP3:I"FzˊJ~k0)&1GXZpq%n I<*kX;m>k]20QLZ iz%ݩh1&l(#O=̘3˦n)d/!DQ'8N/Xt!D=f.hjLq/$`Z2sF"hBu:V2vh7[N.[{,{ b6 83ӣoeHXzl|A0di+sH=Bؔ,@OKx/IxK2wXőeUY*Ne>Ǟ|)XiT:O^/1>YJy 4MKcf" K11/+꣍ӂfM$XYđsUO[1~8,5_?hߩe $ڂ;9Py,bB\5TC:>s0^b$pz$VB.1;!Hcdy*"bp. |UBf8~hdk<"5R8| gak @`>uF> Vn'o@@ҠM zڙ*ؐQP cN I_Ψ&k w ʗDm+E>:ʹo[#6&GŠx'h+\W Z*\j}Ʀ ']O?%VRI[\#jY(/~㉼[N-4\|h2`#N0e>_"l> stream x]GhI:x>8s~hI?$;TLWwWOϜ{H3wG \Xwn<Wn/]=zj~Wl1;<;H7pӗWoJ05^\}t\Zg>H<$^ZrP=|_Y|f?|޹|Ng1XCni{$tSim<~p:3Jg-wZ;Sqo>ZO+SJƝ5c!{mڍ0sӨsvP y.k-9>8pZ/`r?~uJpw{% -X)pUYeat-< iѿG݉N[V7i+,Peu?כ9ݏ)[,L;a5rZ:[x*Lm0iJ K3Ͳ.z^)@>osm?>;&9~ٿ%j~{~K6}{jX=$3iEOI<&Eӵ8p504]!u3 oL,c ;Ay`0 mo3:gLU_,N;JAa0>@.z`M4AP4[Kx Yݝ\w1qTbi=]Z_/Dӥd+G3%gaA)R\CeCvQJ&H!i*yz_k )ԣVRt}O  .8<{L'zC|L<=w 1gwř5eq;ƽ5Segɺ@BDRB 7f I #, tD'C'%1&:A2 JBbY p!@lsk[R#%uvhF}A5#:ν+P/pz l_N0g,AJ[`B"!AA 88Oemix+ \ŇjИȴ%n*"LY&Ѽ$H"  );89wj = =_܉\+B~ P~rI"oMKAESr8?MͯS%45ǰ x_l( Xغk,rt Fa ВT2Dѱ 'AΩi4H!C7t3dVOҷ@!|<|9e_h Ð"/P$ m$d6!EB_$U_4\ZZɁO1ObPP .vif CɧPo=-el{'ő#.")I(+zq6&/]4L,A72v (uk!/pF`Zb3XR0 `ve!0+-Mh`K#SJ6ߴҚ N~^~mX@NskZ16TQXEhW4{/d6sV ]|$d=i׽ 8Q;*$.ƶQ ߱^fBKlUNF6Z*K }:+ v}zg kGHDfe ~;J`r󒤆ܞ`wzTFsD(*x@4[HHVo>Kc2ѫ%4D[0&ҷBƥJm,IZw^Pزb^Wg]C uӡ"u%lMPx\#*!S$smV˺^8]w"o2ت5d«wE-CG=k`.kNZ3s)`ɆgǕ6Xu:U%HZx(.GI%Q*!.& ’[|r9_- H.ZO=05?H_fI9$]}| e,Qz<5ݵӒsU ;\jɪ۶ٞ5۶%5nٟm:="֑g[t`oZ]@[/w! Ǜ]7)oq2,;VSN׵uà#e.08 %2CڍGp@=kFx ;nt-Nըfk8Rӝt!훽>Lt\\UGBW6NH ^Q R ɋq>i I61B;>\Z,_.T`diC<^bCsSm:֜2Ujb;\'N.,9˫ 599tV#:;u -pH edƎf|0-ސ80սqyMT8¯u꧵vd6$>暊|Δ! i{їo,ЮY _#Nr,9_MYeqr\4ϙpVLe._1/*GXze SR Z6(2iHzܨbc0z)i.+9]eu S]zz1 YC>GED6M傠Hg<*ZϻD/ƍ{DCqn=cDƟ`V= m34WO:l)4^R_T"͹oHG- IR ?k:nJx`U@S<珅#\hozu op|q%BdWX0Ig(l/1^tLxXujutT/6JFp=2~=ZUh98LTm/?M10BjqYMoYm+FOչDM2@e姁DYWc(jNLj‚k.Zy<eUeɧaXIjFI 3ʝV"txѸ@eJ 'V 01Ż9{d30NiQ/sQFW#iFRo$:)m ՋCgT|?s { GX\ >?5Y=JفG0LWn5r+XW#6W&4մfu*Qendstream endobj 386 0 obj 4992 endobj 389 0 obj <> stream x\GHd_`"$V]~LLPHPBX^t/ߝcꙝo^{wm쓥LwuwW_Uu4&?y2I#/}4r9ش,t7,Kc[,4h2|y0v3y0\DB$ $5j\F&i6kiJ-2Y:"2P1Qlޝ/HjJUbIϝh3IjnYd}P j7f /TXgG^ҦzH^:8. FMt$b1)n~VDc'Z` `$TlIdM2_ZJ3,kB[څ8+giB*Mc(ux-ޖLűr@ıLK4Ԕx !EB"7]m1mL{I)L5(Vrm404JIX>iVe peX/B-eKV2N ]88z\I_xi/my!l 2~){qZ\{z ^Oģ/|Oaؠx*Q:*1uW&vREZ(e(NdG[ï0i+NJSmHr+Dezc{/KwAzKhBTa~Y QoF;FIRd2jM%1è3+"؎d<,S`x-wSץB$+E_х!{zDz4sFr7}{; h_B. 5<֕RB/u L3DqFVUzy'817?Y[0dr \ܴsx7:NFtOLlg$?̻%icbT*;<*QÓW[J+vbNmi޸D mK@՚H("%R&ǘWGU"S8/Y(H],fwف\+82*L{yl1ȴWc)5HN8F7lH5;#'q'kÈ7gkFHإ%^Tf1P8׭WT6j*<ZQCGu>0YYǙ[EJ0}ČEE^W.ͼ^%㤐5h&G|rm-ْn"e*8aI VeeH(;u$M+%B-\C4-C#\=TQ&$+jj7O*)Mr rVJ8+x i*q7+zն[Pifq(du֯G}݃Uza *vZ&y^l-EqȩpHtץ >́5S-gP=<ҮkiZsK-,u9s!"9r|t^_zZX? mdl͆W*dOלo>nʱ;8:>J3Sf9`a[.߃,[3Q%R4ڢ[*ݖI=vrdOOs]iWڢJe/_]ĮTd (W ieɗ¤4+"%ny9BbsHmw.'-:c>*]tY궗BҰ@ u%ZWV7@z;Fr!K] \=6irAr\[;oCTׯq~ZDJB|9зfkE}2<\u>,jL?;3}/soX+Qj#>y&2f0] ;Plы5XNNk? -gH$özAJo O^ Yؓ^'@ЇΠhyغ\]z24u:3/hˣ+l)MV9v5ħpb8e뀙 U@@96G%_Sw^%#$<[9@rvBŷpϝ׹߶r}`-T# h < Z@a3n+$4k R仉͡iv 6$ţ z6^M_#G[ܔ=-S W*cdx-9[BIYӟOa}]F ;a \Ō@9}MƘn*љASw XrMqT߇՘/v. V_%Ӕ]wt޽v6# 4 ۪F:Xjab ybvmrqWXo#V Gt5zL{Xމk.ne.6 ҋZKXT:cHB2Yv\ֶ( OP<uӵf5U6$kp^亖k.tkZfJÎZ (_rkr ^ݨ:a Bl픇xhS5!tT|63&ffþC)9ƞOḏ;⃞K0@v'@=١#@vܼ D(|\%VwpO98ž;[j_J`I 50*Lr\?+{hendstream endobj 390 0 obj 2824 endobj 393 0 obj <> stream x=%U ,yYM ޮ#T JAhnVyfslό33}P6$980g~招q~Oo}7lpnd68pGL *鳛9Kzԣǿ=|t.Og9(x?+̯ŁS lY q|qc0  <ә Vp:A;:=?)NZKv\ 1ǯVJW,cFD#F+c0΄:A[ӳsd(բb@K')ǿ< `=jRk.q9cZq?J@`ۼѐ?eƇ&[9Xxzztf~7}tvULq\K, I`4^OC#"í `>~)A^t wϰ(,ܠ"t7=0Xֿ {=L"b~˗G#^d;3KkTRBo02x?jTsJOZ|7@H3Z FOo~ᷞv oZ'7VLA7O !jtnY ԳbL\A c^#36KCGn! `Fb`h!ya,D9L-Vد&4Gv,yҫXQZKPUJR+jP,NRt v*L$(g*"*,#:DQ*Œ5$@-4GeLb/˳ ˿{ 2ArIrwh*4(j r5!-aj+ol{t q㻧80)LcqcZ~M>E6"w`!=`|' qZH#/Ku[?XC-k9z|iHay&"|k+l hSx_cMVr+kDM *:JxD\yooڋ{˷mWӿx \9,G%M !6B:-| @> '}<$ 7gWg|IU_?'.v<6=Oo~y.q kGŝJ.5f8st"B\FV3xL2l4+ŎB+__|ܔU|%^bqT 2֫cVҡKg3jM}Qq22+[>Dk2w پagq5S:GSqߏ|O(Ӝا_k7Dj:sUtz @u`g}=oč{H"UZ!v#.XT6EQu\oaF;u|Wm8 LǺd%+Is)54EnjQiIɬF/ gP4 d9Gޓ/ cvr2FVqoL\=O&&4e$"Bڶ" ެR<'B<+QVkdU0=^DUŮ^);&dkI%ǗP~ dUV]3I\rG(R(@W}Q;!w KO[hyЯDJ{ZN>6n5Gi^-eL g*n3=tGdҴ&A8Ԃzئ61J7Kf6JKlBDZ{by{xTͼڏmB{ L`V4d"A!>8v!2C=m P6QtdSTҁ)c)xh@E`h YZ\C(G=/U/5RCτ"¦+֧s!KMx;Tš_biJ 3i ?}3rሥR l^|(g^턀u e n%߿f1ܟ{@v6.3 `kŖtbJr݋ f^ϊ@pp۔tau^0#=\u`SKm5`XlWu3ɴeBً|1,^)x@#K mKݸSr]ŸVQ{mЛpb\UU6aԋ焍Y89FH୵{YԞz֎5x9h Dm'H%pP{T8yL$(x{8FttqD v)kgp3]l%uL9HP;b!2C=򙲆v]\(oW >_W=is0=9Փ D=v ؛*H_\bY3O{.3r6&mD1 vat*)$]FxgG2V7&mf7ÛjJPLnՉ^u4g*E kH.576cRc12*{%SPuHuO> !#@ 撧uKEA?-1L^oBd)K#:DT:XFtTR֐ЮkEMV2撰b0%>\敹\B=M]SfѶsHgSi*yy( [WzK魕H2 Ԧ; Y̫ƅC^sqI#~sդ!n^GF5,:=n35FHEbԈS /? E/V j'H%pO땟y@w!2Cĝs*i5$@-4GeLEd8L-`~FS;}%%oLXHVgv}NN&7>aenNbf!=st>=%RKٗ~Gt*kͮ=>6 $ f>sɑǤPʜDҫQZtcwCy{xT1oGu#wc*.aZ% Dk*e{*@^R(*J^RiK,2qlf MtquTIIbV<}1g|1-@~ Zs0!AOϽP4XV@Q94ы<%hQ[2VeqO f@a;},p櫛(daX:N_i 몆ݪkݖ T'̙6-cJ7f}%} +kU{W$n[PVҪxyLqq{͹Ո^cK)}(5ۧ5=֮>n, @e|݉g avm|MlIڒ/$8>BRTCO 6ePߺ5*sZZ-1ªk!}7BAٱ}6%JaYv5k!"ȵ2ĺli7Hַ~n6BMOP]^kA%e.5 WBA!#yA%vK(VJ%LVb1xLg6T-ﶢ%n^3yIJ]tKokYxi<yM3wT i4% @1^+GPR\=/oER͞"#88-3C KZ̬B`c}wQt.TnNaI|xjBb 88*!`DƣO}+/5F/m&)Gέy~OcӡZkO2Gm OWYendstream endobj 394 0 obj 5936 endobj 397 0 obj <> stream xZYoEWu$HBpYA3H< k? 䔐Tճ5;;+RꫪktəKт/O~GoV{nXգg!xbRy&Ѣx\\34<]=X+-ʙO+V_Y/|(>GbZqaQu2-[K4Y_\b]k).v@rY)f׶(cq~QsNl+{Q/+ɌQ6SF%Lq.PGxOiYYX!1Z}SV Ht:.J#%dqvӭo% /l=F7+>1*FP {f"ڙ05p6@øoߩm~ #~GoӇĺѫ~s?:lF"%IRp8eJÃ4|wksƹh"Xp/mb*iM/ka\ G9( 1x`@r!@VHEE@VDz-c8ſs ' 4ۉ1tLvRQȠx@s{OCζF[sXQ+P()KhRf?6^TAix^''# @KͱJsiY0stĨa&Y\MlY@Ź,-lxWZōW#JRmt [}T[:NCg^rL0(2`0lMdceნ2`kG;#y;l13TpAG«Eݴ )s D吠$*D''ĺ#kPp.rWˇ vr%^Tge)B&RrZpx uARq6ߕhFn^HĹJť? >B0  q%2W˓:nxB4/*&7! Rt*iSau-,v¢nЊ[7h51)/ ۠V$$>jzs@_qZ+Aj$̷8?G8 Kփ>9N䎤X5XEn VƩ0Z$N+Ի=рcT[ q;4^ޢS  0s dAfJN%#Nf{1J0mGp|NZ qy?I?ݩJ$uzV<ؒl ^Xk0Q4F Fj38 P9iS)5ii v|G/nlQ(TF'tI]W<7uRz֡pjex(I<!n_&3dVx4ZRQCKO-^=h]Q8#~[`5D5OVC rT_бlG=]6L3a~?,ji2BG0ݖI,ɰOr햭Fl38FisvAܼ<(&#*Ge"N0G8 ٢]+2߮?_ڮendstream endobj 398 0 obj 1819 endobj 401 0 obj <> stream xkE0jDػA (&\#>}C>x@zfzffvvo!DBR靮w%gB.yK/OG[kw2`.8 sW3?/V,$L: _-^ &3~-S[U|zC!Z(V\t;vQ& }ժTp-tUəRh]|XKm`W28; tgUƭO?YI-*\ -]9甀]q@>.oU)1ʆBKƚhvN  ӺfV(údZZ[ K)B1xD^Y'Ds2%3<a~U#p{6עHgnZKi0Zx>8(T$}LbT.Ȗ2|tC 9;g+w^DЧHR]-MUuŲoHuNXde۶h`pEVKrÏ3xLp}./{$MV >[m"]2.Jxfdϑrjk?Ăj##lS* xHKB^q./h8+ NܣmV 'FլaJˋnmHiDC1JC`{c1$nv5zN;Ll*ӈZMYY8??\%endstream endobj 402 0 obj 2242 endobj 405 0 obj <> stream x[74ɽW=9vC@B%iVI i*3]zIDQ,<~3dz.v,'g?v{ovW{y{/S ^=8pʁ\Zk{_Dow~>^IƳ9_;&,3÷GݽTKkqr@D/T\ݬTz{gnݟ[O^06ҐUϙ#Fufd?tꭵ!N=;˕ĽoG,[В[m MRxC,ӚK|W7赖[gW3fc.zjw14U8 ᄆ ,'ZҢ@&H=  XFM2ީVJ~d-܋S'% &#g\-{>_| iCihyCi1d-E/ia%? Xkƭ[-p9 ECd=+ ,ѹBM؂K4duuVw2UlU`_el_7,zg5\)03^d'>+WW˘ƌwh ;r!$ F3PGA(0iVHw XQҀ6(ãP4PäJ&*>}[)h[]_ wR~j6--{Ii҃VD*G $8pٺ`0{xi4hb)3hnCJ6>v؁G32}!f8l#zй D kED݅+ShaXTi%;mw9[h`{$gP#_!/]!ܣYm%N" W:@6 t;i .+w3f]%V*&8^<&"v׋-Y! Ex$0WH5e]!o`j|ֹAȡ[L-tk @X͐04h:]x^&}JZU_)J Ԫ $){֧ L !nIR_Ah;,Djq߃* =Lr' Ċ k`nWj9xoz tXFdac}I6t7MZHcBYpÖw , |Lf qym3ؔI9СS0ƯUつ]$[2pNd*1V>b͸L!%5)8pJf0LP+ pw& F!;Tp߽fWhrHZيW`Sk4>@2_{*YI(EUI9]qeT:$SM2_u'7F[2|U$[EtC%r\ߦ gbpAhvѓD!ӮhE(pp G{0)}$AFbzfRS 0Z`L(DBf i 1AJ[ j̛!Ŵ$o_NfWLtѯ]`FkT0{0} )d*;LV[̟6Q^V* QJHMsc%tee:.#VXWjf&,{aj7~)Mnz~]ˑ&g+!\ d*(ٟWh?و_J *zX#-_ #r 2')dъU5z\^i=:qT@Qof)!\)d>N ս,7=%iMZ4(eXd#ݑH? 'axUK QokTL ycT%!l~9k>)KZ%Aܲ¤(C*Q.E-<f6`WEm"8 Kh $~8 Ɖko/(Jm5H;mT~mTAh:VkWd.ωMxO X/k+/EZݩ {2AZ</'[SU_Or_."Q۫!.RfaӁ ^1s- b']+S31Y*>Ehݧ:1z礉Qg2=J.E IJf!้]-\_` BAěH <OJ\[Ku[bT:*X?YduCb?VOHm9*5Dc'|HNCpȍ&\WYZ5/΍rѪ k0SlHC#dZ3!=K.+R83̘p<t$EU lHW|}(hV[~uf:(4_y{]b pb"i$hVC"d(cps BkEb+A뽊ri2yoHI/q?]snG)G85Aȳ"Jȱhm\zՐXy//pbsʘ3N+z@6uDY$BLw5bޛ Ӌ5'4"Sc*xpi#Z$˭:R~ׄn%7e7'vз)>)(kVFG^a.n?ue O@e1G(*6{ۏv,Gxb5BߩF{iYU踟Er'4n~STJ(Z\g+ap2jܾėPuw!>Yf4]\8,@Z=l5 A߮NWgendstream endobj 406 0 obj 3108 endobj 409 0 obj <> stream x]-MiB(ʪecfĪ-W~zp~fsCYB6~=gQT-LȢ6´?YZ"jsۡϺ1}n* ԉm#ֿlu4pM+W6)44,6)Zח7۶Pכ**4V7U$lW6(k-֗|=lhiXʖUU [Ͷ.Z?-Kv?ZKNr]z}'Vc@svSj@C5Ʈ\[6%tt\G*Ue;~zu M8  -L*L#.U$CH?e:ѰlDY4 ǀ.|0ybWfP/Be"%>#PR )h$ 50htbdC8քMˬ WP91YPjNfi4WQu)kH=VU)rt⹁e`sU+:ms\aab%$J)JYx+E G0/rdۄ6v{(~ԗDCP< ůC6۬E>4^z] ;P]#( _?mɓP|eI5REe(eϮU]USX"4:U}>P=!:g=x锞p^`k՗skˠfF|K&̡kolMVJ/qj}ho MI%)ԁ(P 얨YB+ߴ뾖*l;(B 2X> )96e6RIFv' 4Z"ii\ݤ77c=,]LMؑP^?kaCuӅuv.p} N(mQ -(7+bOIv yA%fG0`^ Vb Q!g#Z9Q'E SEh St5iyb;=][1_QiB{DLU (q&I 'VY[2!`$|'Bbp],Kpѡ^,IPۊ<|(LopB~I/H1pɗ٤;}uN;lĐ1,@yh ]:n&$!yŸ\wIbbId*3$M4d,M7mϛ|A?7n.:(rsT2kO Ekt:=i0k;f _٘.t%HQJa+i_ZW/zL;:{iɉeJ]#mj`#'TU3ZɊ 4MJn> GpA@`'&>q3/ꄥKkjACAsFuL7nhҊUdzhba7|~YiR %>dvEUrEve/ꀗ"QYhcS7W;SIXiq(ݰ]Z6 EM&þs_ۦ$N)VU-qWtb+B:5T _w#m)0] |?I vUiVt0ۛv~ ~䛝P&y`~֝>6ܦ5v:$g‡3RQ .gڪA,o#l^x#R~|aG7\P]QU2h0M'Uo?|psD[˕&+dUfUN~yLehf>68@bz5qyYY=0 fD"f:Y00mTu aBqTE Omtk3BdS0 xN`dIoC @02ڃ:N3,8#F"sLht*^&4:pOc7 1 cZz0ʪ߿%$m?D $HD$|D |"X`x`f `v؛dL, mpE)cy]us=id'-gE\!}+ꗿrƧ#*qY~o﫦( h"8') e]"Ç4XVAGhrB/Y"ZJ; ƱM<&b=q 򜃯}KqiQ0-B0mïRWcp x8ҸRb>#o3|߆"/x96dHC[!!ݝmKGZˡ@dpelf7I<c*FNJDb'i&wTeCq,;b'cOPRaHI,~XI+LPQ yXh}@0 SJǂBj%:Cpx9þd,䥋*juGITg&?ڒ\=zAM} L6b|J]oL)9y0*Ɍ٨x'_ӌanr9&~`p|@@LF1)=8r)eC p[ zZKs[:D!Yh̷H3~d_j61RHtݘN{L!L. KOSvp3q3pJmM)x/"b>/j abwJ?^٦N؉D Xg}H o^RCÃf^\9{`gk͖ 1AYOj,˽R A(dۏW,9ץ?Dj97e =IIzFVk_XN 5x-ReB=D*k#e}7y: Ρa{槐ۡC~ BH41 JTS>^Hd, S!N!(3wi~{蒼CKe)FY%FTyX q511qi?C?!Cw*Kvv.Ӯx$О sxӭ "/:Q'Y;e@O>11ވ7٧#H:c_;xߗ3f~7v(';f$An1А $ K`8&n!Qa_,uƼ/%"Źnwv; 趥ZH L? oHQ E߼r XF(‚n2'*y`'F~wl n{ /7L)Srː d "=[ s,LgB{7eiљqx,Tnn,=}vWCq Ff߳_?dp2/%4b 7~8'C@zyY4 a8n!Th#C> stream x[oFW+UGob{lJmM.%w z;cH iff{m8 G͈Q1^^b!՟A;Gƭvzd$" #$v86O‹4?\(HV2Cihy"81Ttܘ_ a$kR?4uGS10%"+h7u?}MijGS}M0miJiMsɘ>|<8H5z]"%#>9hlG8 E ' .Ł5?l_DQ$]e'"(@f!peG"3/Y))>Wt{qh[SZ\K~iٞ栭:H\__q2\{Qa~Q7#sIYW. b29r$]CmImC){p dDp8A߫\°BGdPbBK#dF+58XhC|g:A>TavaMWٰqˀ2^<֭c1f}N I3CK3.0r2?+˺` XiB Mn^SǕm uDIq25!$0 qdp4dēC)Qa0MRVp!B4y.wIDX%>`آ(>Im mkVi-MUyʓEJ1UO%dPQ!e[H`?5E R 6#c$h.vdG*p_,ԯ#^~6+/$Í;`ߥ3*1NBEbi@ ZC::>qԃJm )mP̮5 l@3ئzzN$>0j+1K#V EV\(Rɛ!6(&DN*?)r@H[U`{oJu0a)S Gi|m3mlf>'-$n^WGFf@{,~)_Rs~ˬ#ږTR4],"%oD77 4˒o}sf瀍m]3[D%BX(ATYM.Ϫ};빜 Sv?=,aW8weDl^sv(3ȟe'+`iG|j\v376m -dz~ Ɂ޳\4p s@'MFh)3Wƹ.v(R= e , ̵PFЂ5vQ~mt;+ہ2dXnjbeqWrv w I*xhbAqu΋nКtU}==p!q1ՕX.]@CW;:V=b Xjh0IS1`#y:P~_VMی%T.5Ab^;w>؎,?$g )fEXa]9Ѓ B;zXp>Z`nzZhj9m\YF]=hh~.I dO;5HœlAZYB"3`~zq+Xd>^G Kk GO 3*=5GOC_u_ȁGwڭҿ^endstream endobj 414 0 obj 2042 endobj 417 0 obj <> stream x\oDHv*%K׵=>Ei ɖCAlfVd|׳GҶɞ߼ys_;FNA N g\̜/REISPtދN~moȒB톾HTxa^_k^ ?A8Q/\hL":O2@hJ]4ktѿ=hGF5HF?~xC;v _H~;N,J5>v@o}I  OZվCȶ750 5fhګEbҷ%[QYY&UE4F5 ǙJ( jđ7KT#anjt D5 _is`H2qi4!# osSM)\5 5BӀCQhjTG0+6j$!G?Ǒ n!R@度yjÞFudjs+|Bp`˪Y@`92W2\"*u21*0U'ťF?Owݳ) e#cecbʄjTO_rȧ K2.n3j)jijTzji :YΒ}q̘+|j/W!3܅q\f_3+,LjqS1;g6 *4.gy4 zao{[g@APWy|`y%lfy laivdV3Y3մԘQY۳6K:5b,Rjθ]bĿB=6uoifEhf]QHPEr?ڛ$ ZxV0X!QqM3lf+47 gT#H+^S=4䦃4AA8mULуR1vys\XjЕ Cq@ziT˲ݺsv'!83 nUJھ/wΩͣ)g{i4*2ΰS9䯀5xkiWnvV|GV}?9mZ5fp]LN"b~z\b?H$s/{/" ݏn^spY%z,//nGqqPSfYA9V=Jl|(e ׍$i~I%8pJT()R$\DNDK'lQB ֤,&zf%5^S}K0>5D*Q4l" s.:ՔKLꔇtdu ?hB "" Go:ɿV劘endstream endobj 418 0 obj 1985 endobj 421 0 obj <> stream x\kU_&Rr)RQ 9ܞachRPQ$J()o:~do>;{eӷzL?=_ ?.5ؿY^uQ=w5kY{yT5J޾)fc3!/Q_;)Y5Be+>郼H&m`Kv?;E}cvJƸ)̤}mY$ ѝؿ5??v#KL4g6u8FNEw8ʆ(:u`tJ}8*o;ymB;Y%4Rm$_286iYJ_G]0eW4c]nc}W^K'z҇io_8tŸtcɂ_=ƪ?טJ_m{0FPu]/z#515XtF% T3oȩWoǛXz6DCBh^ Hpfj SU6_9}GNdI9Sd2V`1-Uē!d !Wt"H EpUu2pc 11΂}鉊Qpt`҇Nt||̋^ك~wJRڢ8i.۷Dϲ/{.("M}}$~7Ё$< N!-Tz' zv:#JIsoGY ъL*!ƴ׵9EϻkX}_?u#)gT3>^+p)e$@: b񙜶q&.< Z,ҁ.>I!@Q DUZ[HYIk 7GQyCvM8ly; zPN.r ueIj`!dgp`uxAu*2.iTuY%vZ'.? c:aM.p#;$ŕ ?togLE)&:O]uc[Fvԙ]Jf-q  xGq9ᅧj)̑gAHQ.}9vۊ>vxzb' 4!H9(/!3!=OѤ>.Pv38'{#Ӎ UU50\kTy'dyT:WllyV/YJ8D@LJ9^6ŠZ@A9)M"S MhK1v3gH$ѱ@b2a0ÜxwL9}ݴ::bĮ۰ t4,oAaӸ?, ;|:$9JA,:{1]s V ?XQ;4 BY> ݵ^:;n,o3bd`+9HgZL`FWd iuGk % FhRiVi - a.:Ms )_onXRL8bXY*(πF |\Ti &h 0רW?Aq=v--c_FKb[L& >Zs/RÂī||r=20DcyQ.UsG-ɦ>4px4:oǠ&kٙ[i').ڐ-WOi9 iu57fzEL/ԋc-~]p;p7jU3 pUJTM6͇ާ{rN!BH%||S p,1&M;߾*ޘV,d^.qگr n t l|j,knHtA?6P'^(aqň-b^L1M# H ")TR{Sի(sC+EUDyĵ}N'z_s@RJl”IVR }onUr%6&@ "cp7vI~>T8-iv%#B Yklx/:Yol;t  <#> .O&"v/Q |ʁk0E$p.Cu{1A㍊(z%nK=dq gF(X,fbKb3D+&=Q'<=O.GQb`{o8\ߺcLgMV손3 G=WĹEuEV,\tBX~>A2FU`-ܞ!\ ˮUJ}dfEvOCeMcL?M FEqgP|Bj tt]*:qv5Fn`~P7cb4XBaJø2ANm#-a* xY\ו%L{D7K(FSzdюIȏՀw8p@^*BTB5&&Mc{̓2bĪ$M݃|_B@|||_BĊgP㰐5.ʵv\ҔK_­NȋgGpG}D_&|]9}-y e n_~5  ZĂzxdŽJQKdT/cBHpL"/>WZ&7Vf*Z]ͥY^1CWmTdA U4O9֔d/D~xW`Zendstream endobj 422 0 obj 3897 endobj 425 0 obj <> stream x\E)Rb-; " M4FJ{[Jzo33gf#dogܻe|ӹƵnwiN7<>|SU]k0n#LW-~=~xyrZ&tokEoh~2Xr?VecuX ش-t\i>D ,vaӜԼV6tk3-W]n6]}0,[ز1da㪹廬!uv?G=e `/݆J5ϺT}{nUN.@Fr&esa+`[͚:\k/]Ujy?}E7r9^۝m@cTO4ՇMIGHk͑%}s.5Ϸ;dh^m.zrh˜j=0vDץX۫+v‘KnAŔظ{uw˼['}>s$P-0i߭:i?rg5$MJ2CnWEhoGLnTpCWcx>taɴ];A xsQ$8eA-?l_RVPc&#ּ+".<\wLA7T&QE]3`]zL`9[Ɂ$tncBpPFpo=l-G~M\6O($&_1>ő" " '&>JQnYv!EHT_Ǜ 2?Grąhy?4i8R]$tdJm3@#<Kp9͏㠷pߧ H< 0 3j%X yF͏]cf̂ `Gꀖx!*ʳ flv qW/6.T 6ޅ :HEKr_,ehƮt iD3"ܑ]'8P4Eo%@ y #.->ӴUXRq&Wyo3&{*YUy г+ՃeWn9s)HR DG/(BlE(Ft`}?GӦ*Cp^1UzksyϬ3DڍYSք%X w`w  q0A% uw͆t`#:K( ܘ7'KN[?hZZÿiH+. Q|hw.%,%iTٛ*4U+S#Ɓwx.Up6ԫL0tE&:2”IS-TŅFZ zhhk(O~GG6@d&[)2Пu,@^2бɱG[ceD(ԇǯ_AX=>,®)q%sc,"YJ5P9%P|BИ2E0W,L?čPq[`fzh)41u}63qto5F\!NFPҧ*FDj- u,I8Of4mFL$CR(AFF׸4&J$3BͰ^ojv9m!VN\Lqؘ $xB& 1X0ZG(ȼp' /%`h㒴h#v I 4yUTN,8)&pO3,Ѐ@y9fMl7٢z\@rn*m1G1<pe|TJFKJ&pXj薾G]ZV)_A8M/ 6=dJLEiQ6=$J c9S$"rpI(kK5@mz?V܉%@qJxY} &*|Dk5XG%*k^e?pO{;}Gf\㺛;3i0͟9գ`X8񬸝*T׬wEtL=*]y;٫+l*͈)OS%x 笙 Ȃ}PMEX2R[z.aA YBfb4Kk1,LxM'$ux;H ,YUUV UaZۢrBm{ GS {o<\`n#$ج&7NoQ2|؇5i-dbΩIS:6qvrWctˏGJ5b= LͤJYra/¹'XyրNte 5Etұ2Sm\)[J-i[:mZ%RpW NNM\ҥ<Hp^M{"*5sKR6]񉼾k6Nj3.zӊ" ã, 7CH|hMG}԰|VR[7a|Pa8:=J{_. *`@\+_t4wkYQ%*c)w^Om?a:gTnnqlbag^Y_@;]0-;'Y qUXSEOa,NB7E}II6ohc7G=Y |= W'yZn/,x%^&N/4K[h[nQDk| 'ĥDa;$,+r}}Wz)J9>a`/83i dgˆZUŴSErYW7Ș-d'gpnklg46.8:0~!8zRΪmfO.q>><{W3($N"NAILjPhԮHTVE i%}U Rճ5L ܡRsZ:X5F,82=h_[kI>' RExZYtpxEEbe*e7FT!~**F`=#Oup keT"yTDT.bvNnd@]_# E͑?ĥDZGhD\уyNѣ&׳lʓJFvj!r2sHVhΈ)_G<gkŲ>:mi_|C=穔>/wWQ̨>;6+2Q 9 %rʄ W>SbX8<#)n~~5U8b"i囱[: =O+7\Nc$V*Sŵ40MޔJ%g!?04uoV[fikd.]K~]K51HWe֨̕ͅ)h^T@urH"сc"ȅO~k"W&NPDbvFj i8 +P ,Em\#z{uPL>u.SE>:`GO񢷆ݽ(֪ 5M{P  yA>UFY[wf+d7Ueغ[%c ~M`fN5b n}XP>2s$G#C"*=C𷩹!:PGk4ĢoOͻL$)brrn>Oq6/rkx^M uVu[7NJ@Os^"i9!ghӼ^.,)5֢&@*+ rc> stream x]%QV 8ٻ+ 5œȖa9~wF&E`Gd5Fz-/ߣz=xA[ZsfYW}XEu_|uzW//vC?1;u~8|xo^3^~v~=^jg7K7h ?CWL}9ŶS'k+TRį/Sy*H'ķ6h9oᯈ 9QbSI9___ױ(?uˏN}J_?0hNRSb,7{ZT嬃jo\\&_,?'[:/w?&?zfgt_~6Jd([zƸo[:PkO<_߿f=yJԗ[C&gdߒ+4H?'!#+9YQC=GÄ@3BW9d nXDvTb^d S nj5-DNIޚiFRO8!2 2?8ToCjo3f]Ϥrc;|l_R키Q~cؓV%Vc&&tsc %wH1X7S;pW ^뉔U۩\DOOZs} %?AQe^ C'G1 :xE γT@/REƷ>'~XK'xf+D\499ͲWnz =Oi)d!hٚ$GI5`>+]Y!o&8CA4 OBQ{Rņ;0@f^H`ɼmp^ْ>b`@ .3<"?swk\@ߦR){<Vlj|' ( ʨXÄ$V\ylcQE f9xYQ({2tFfa PEBRZN̷r ߛ&-T0&38~Q>.T$nDC|0O 9S j neq$T]31ԎM҆0(25U% @LFjqdchO!l”Ri~B+4}]E-mY%Q.-:4GZG|xczgУ0nݏCPò y`]`A'~@<ǯ_ҟu/S)w󱤄 %\ѳEK陊snB|ySDf~!у*;=4k kjw: w)ڣQeqP<4 7;V6iY-;ݽxrol9<+B@GZgMjT67* =B?r`WoS=Ċ[P2_߽>!r?돼 @'6,KAF(%m qRbˆ*4@4erQ xh$ GDebXZ3oO[ax-"T х.HFPiʇUx#˿J<֓"ra}WLHrq8š fڀU$I"E k-ׂFjhJƋ񯲧,k-4qrk$JmbBΤ ^R#PrZ T `b;nm;dWJfDg N 3 "C;?;a0+'. 軇*c{19(ۢيzDz ! c+WndxGm?]+=̉7EE3N:4mdyAo@nכ;/zo kD%L إRPiT7IqCFCX ^NbT[]4k~(;bH]M"gFi\ 6mO!CTMi} PFvpmFfXÖ.ͦi qYsQ[{&Q{IC܊TSLKMؿ n5vp0B"U|\;:k\{ }bf62H\0UT[! ZfCR9?Vu=m XU2#RFE<7Nx/x$&qGZ,Sx<JR ơ o$.ÀDdܸX5!{.9F(X#Jc˘T7- 䋴A!(R)j˩fO"w"'ѕ546WX+"ɺԊ;4~3 X o`40{(M@=5Ɉ!3?w*Q[3@EŴT֙d=6oO6*e:*iщyIeVZC6,te$ylM!0i >H'D*b(8ZZcw^] lrY/,((x0!GDC xAvkD{5xf)nGNm!Ir[AFy/lVp"aV-*J'pweRθqWGݱ- |54  {hrћ3ȠZ?'oh3XAyhhwk QNr.KiQS:~V>X2g,j-~OӁU, ]ƶikFm!i7ôO<ӟJ(59 ݮOI'P>.M^yVƬQ׷̷FȽSsGGA4{h|XEk,A6_59XJ@Ĺ٪St8md?bvK/"0H!2tU2z?j.ARZbf^Mrڗ:ѥPв|JU(=n] #}5RŇD_\ΎGȁ.cVϲ>_ GLYT7PPzg&yz1C789+C)xgFz؂bPBx#dGv`T rAxG%Rh":c iΦF ȗ#O'~9`A]-^r\V9 @V`ͺ㐁C7]GvΔ鑑";W<DZj03yZba>7jWAWXhn6y$9RhIng< nG nqvDh5cFpT,['Gʩ }`90'}F &Jstznܚ3K#eo$7`M,M5]{,xWCɨtb093DvZi[hv#I iu1zԎR勑·9\KMHNcV@:/B,b͋<2܁XvrZ3 ~?uKDoρ\ZDs%ش?yPM28M}N,E Ysa\G*M8 Һ=RG j8CܪL&B֍>,O8`Hh )gIݴ' S\m\mGR'!kQQw(-̭pS8_hH1l򤦃x){C $Iv@E9 "qe{mSuܞI8 GN֛Ld}^]r:46%}5Ǿ$҉qº}N,sjw5Cw?7 iiЀ[f+g!w&6HLh}D>MTݕ.ڞ3*U, >9s2k;֎f{ۙrpO N0/^6z,$}BoԀֱVt ^bcEE1K_ mխ]w({Og:vzL:ˆ9R\İ1lg+A`J-^^ugF M6p%NG-lzqs|WuvR4ItjFb3ml1ӈ5׷,/#a&C6y .A~w֧8io-~:ǝJlؒo$/\okCoy{FYKJ BDԈ3TGiex}w} Ļ;׾1N4~ LI%~NѤ<[ͬY: bv&[jW66y 1endstream endobj 430 0 obj 5280 endobj 433 0 obj <> stream x\W9H(mU^#*%}+| AUG$}];~ޗ(omsf<W]+ ͣnǃUOo^9VXu]N7b7CKո 5"z#?0꺾w#aHkskxPy|-< Ḥq5Eّ1f5 l-!<- 8Gb\hD NXbbA42Qyvq=SF.6q6^ C3Q Bl| U0 |YjԓIY/A~q.T\2`\Gz\7}3U3+kdpK@XM0TJU)YvajS4S 50Ęu 7+N6@):G$X!jӾK-=$D2z&tY̅ [Ŵ$!h3pS3[ulBzk/5:ܢ$ӃQ} dIDjB"v#A %!,C'|nCҬdVPcxvn 1=wH~W`廱qf1Qg,L&{iWOXؔa$fi):f=MXhٙ"hS 23x ?[U͛ɉx0 &F$0%PΚL5̓_ `lka,| ,u01kj1 ^Cv[{J<8;"K''vィɮ PYBj':nM\PaKŠ 8A{,{$hAW?YigRS<_,<U7j_W&r{¿t~4TG^3[={"LFJ\HS>etMVU=&l2Sم՘qf~ TJ0TuF?T=QbCӠs W+T/Ӂر4EIs!'0S> '[I^h?Cǻ^Ua^"VIP(`Q5/ Zt> fE@̜,ڄL_m{9 gz' P¿(2rXAb](:[ųo{ޓ Dg1Yjܞ˞͠|-_$ӳ2.&WJP7>2p.PJu%qL`*9 MAi.漶2Q;.?"}ʘfEhAԅ(Y, !=ΖJe΄aS1v/qq^!_GG"&]}Ha&*YQK6&ln¥aHY:\#Qw ,l=.f"ٴσJ<=]\ 0&'*-uG{ij+=dxs gy[M^fʛ_jG\+a|cqj}Z_ϩJZ/z-^O˩*?Rr^!.p%>͗`*ۍLAh1#;4ش=8ǻ%ogfɹ9xRp b5l^!p]Ĝe#ӻ,S.`t\F5գJ#F-hj]d7#ZVdϞKc9\K{hЎEi"/?qӨ_:x5t Y3YK [Bb/x`5ZJIx*LMr댤koDHS?'c6aRp|l [rp!4`UbkNiilZJG7|ٱS7s0ǰI#vEn -Q4T-"&eH$ުyFt3,]X>QAqexyd⭔_+S24E$Y`: ŭ;B_bܩuXWxL،02p=ϵԺC+x%n_1aߐVe < Iz ﲈ 6`^_%-ߍNW "[ũ )؊׿glӃ ?dnweO QR'pb#v_.5Pw{6އ̽&Q.PQQ9a3rK}ôfA4Id2F_^G397+&B?b!q#{$$=qbMx4yr(_SX1FmՉ6/Qk>ӹxH!, ˋ;%˰ky2/1^` *_RBP(Kӎm<Ʀ'V=J5 #A2ѷ brt9o-ab1E[ M#0f NA<|.cb؀<%aLY+S\.nw` 4rPKeK礕Do]t=_VX_͞NI| jY`Y91}蔄 mr>E3dYCG;> E!-߱hy#0QL_L}";V]&=LEpv-ԀwmRcH}"sGZZf:iv;n~ WO bL1N"Ǔɻ;v 9!?N$HKS4+tvHs>/FvEHH= Y:=rg|qs #+'0$k0|X¥}P7\> stream x]a` TuőS@l>A>c)րҌLkz!*W5)\01N H]h_d/2[$X|f;譜/~ۄ%ܙj ]ʋ09;^͜@lE^crPW9것",K'[BAfeg71X\C4QM%L%<# cO/Ybkw``h \map+sҧ#e.x%\ "ֺekWfHӟS=_ZQ=1Hp# >Ym&D)7n8 > +z "@^Nj СTyphh; GO[T!t4p*[:F+/2pDwrۧ;OH#QGEŀvhFX֔"%y&XTT!|!C`!,J}aW b`R!12 Njm~S!y, mo-TcpllDx>#$!(3U  *DXU§ hirJBJo52)⡓ Xi.6/GJD\aiu5*ڗ; FsF.`{y^e 4p*Ҹ,Щ>H/a(ѾLY8K9.[ ΔLElT$-Q_xލgPБ,J ȸ"NlA;:"e#/ZYipxO)vsδ a¥Σ3,j)JQ6G)-KA!Luo"; A3GGJ2?SNZҞAH)O%|q!rW{^ޓY/$ϲ9Ʈį ?f> Fh2x&X{tl`s!b`!܊\ Qwh-%fgfLIqހa( mҒGY Ìez[ى*0Pve܆|*BUAwÿs[Y_'g":A˫r5IBeQ- %L|#4{6Rʕ} ϲ vUKNR@fQ(C7Pi)Zh?TQ*ű&o> g;-}iW-Vy˲W+'u:!,('4NPi xOXmoNp pP;֧7Je*?DŽx śϼC:`2;6NԊA UVC~2odbRQ#C IІte ^&jUB歺p@@B(ωJd~kZhcGs[ Z`3E W1^dg"Zh4͡tuuDEd3>\1%0aoea X@?*eQhe&pژK;n{ F,haxdLp5 +va5`h; Z&Vg[va(gAtI9;?&Dê^RNL #ν 2^ ,0qNMx_Ás7\sTY)l? >؅8qm <|U/,Ea~9l A%є6N,踵ӞO@\jPLXsZXTp|ɔ5Re•) pBQ7 9łu$8BeaDz]PL;7ͻl q zh0uy<4T[6V1f/h66E$VuSl<A8vdDXpX;pozJYeSW*֐[=OY/۵X_iw5ZQQLM'|01`VZ!3 hȅybH͆imKz@52)@3F#+`P<,AҳYlj|6h$~ e!HT.F: ] x0nl"o7ӄH/l *68(D&&iƆt)sY]v=c:l#i5^fM93hTVhqP `8/2Nw1e|Vr~.C}y4sRRd4h4Ɇ2j4Ze_jHmG$)3MSTPG(HR=T}8s*WrJ+nW"h%v1V^Co^7<<,RK0 o и t9 6Ѯl!'ȗJ&{.ɗm\{NCq)ULV+MZs ɛwqT%35d t!hi 3fXewA^Dw '=5s[t38Xa7,xIii0ASi]A7: ^x-_A1Fg|8T7& ^FyM!b{W˽DH*(HȯծXy%3S^{g2~ӣwƃ`&g!X현3_E#]R=im;m^@7XˍVr7ݻ/rsb S39nuyi;\N5.{֙-p+sbs=P !t8Qm.0L <ncIo\G8 !#=AxT)_N%R;!.,m[ k> stream x\GxvgCy g:uA !J'.%D (_;UU_u؞]Ɩ:w^%bA_.^?>X=]y_/mk ZkKKܴth~:JbܯY5?\іr-uM[.͏VUr-7VƇ`$|n+ǽ-gּ揁b9ߏ2RE]],gJ-R"R""/KZ|L~F7E"$G"G_6L;L(2k;g8PJ̾AeF75p,{%HEpZi$o!-![ND?vG$8!,Gʯ"y7ڪW'2y|JkpQgGG%3<6RObI7$fLR`P E7XLa=D!DZF7UIFBl\" .P 3gnK#Ovx?= ʭc:?CGԱ:^g=0`Tk?*#Esc&Iv t(gV?X#ղi}ɏЖռZ˖JcUZZ pgf\ZZkNWTG?uCiFHw2P!Ё!Z3<X<+ 8mpH:߶vj_S(x?U)7zkƘ;ƴuN[,\(v{U &eYx7!BJӅrq"?SFtk1YS}!7=+:Ys9~{ť;U e ǃk.[ùoDKtQTXUnyM%ֆxi VKY#_X+X8=Z6UN{ ڴVz\8t0k6\ 0qoD;GKt;o},5nod>ZcvV? N3nı(2IrE:iz+,sra‘5%$a} S8-dj m*8ܹ+Wc0S܈g-/*` hc2= @gK^k1Z&xϝ:Z o90 :|9TJ;|! OPw35GE`O{'L+3S|n9+2Y&vud6q3k p1BT8ۻ[ :?޾ a(=B^YЌԈ R (]O# /Ti~@P/vpHeUi )έk*8F8]8#Z>ʈXa(MH;`kBp;bCСZd:ߛm}; 4?)(Fh[dT>708Imq~I9OWxB/鸢ynb3 jt*  ;&x9YUG}"hπcom"F~vLBhOHRd0{Q6t2K""l6*Uz C̥ =^ظĬ'!'x_ᑑي]QQ5 g ep ˲Q0?VL!o<!\ _3N([/QVRѸ.Xic=.Բz-V&k/X/ʱI2@˱r,&{L! Px 5Xk5^v*\|7Nk\VYAR ۗWSx]$]`%xLȪf}Hu!\ ߶Ntv/'SjﰿwS囑[`;-.)5H6 u3C,F{y&>o\{uFՙ$~ξ(dhoE[0ոWfiab~JOTDu}J?RYkS";JEMiJC4O"WZdh.!JbB_)jL%E|D` 'o|P+*kFj;Fii]nfԭ˺{X棽lZ{07m@u_U#·Le, O֎je$gz`>7(exSx7>r+\T{J> stream x][,UV@sD8cbGx0hk:]j$"%iOu鋇. {љLJ":_S  Nu=`}HZOT> MfLs|?? g6f~s\Cg%*t yWϟ뾃RJsu]~5]_Åǯ~۸mmlT?%=-H!uB0GJHjT[}uJsu@j;:2,t0 y:OÈpN 'Exl? QzRŗRh}~*z TrGgqxlx'ih^?@$a"PKB/W24ZXs~{Ys"-7J-{u~g]./'ud[S[po #NW9L 0/㧝5D*90dni ?l)[S:nw!R2v Q ԫ>Ct rP1].{V*Oa790_(ZAE: S$OӬ0#}4QTSIf9K"IdՐnd>-:l?{ddjpi % 瓗qvͦ"G-) mN4Xi:wr4a0 8[[;V^L/'u| )XG/ry#x/ItxˡH|!띎R:CE$\.SdN5?9 ˀ";8ūhWHؤH~Q*Yd-R'c彮}߿fP/Cۙ"/(y;Hsٞc:=d5:,dƍ2 ̐R!$ 4F80TܜwDB$ %q:k3YʴӘ5fOら # zEVU럳 Mj$)l%n=K 鼱#Θ@R0oCOI>L`ҧH20,3r68PȔ̿@C/mOxKL{+MN%UizC95eAJ]#rSN*7J7A!u0ؐs8%,id~ c0(2w$1S29 $+iw~&i2$}[D (3SRcȁbuh(Ԯ'm 0Td  ѯMX jTO7wAL?%M=:wm@~&SH,^$V vf #DvCD yT+л,пC4#y Cp1ְܠ3S0x._F.ƓYy˻/gVòHXkfK3X.ޔ0$>wr:lWʲ-MXӷQHп#oH9AkΘ(Y"IGzi+T?HԺ1#}a[!rL\řVR9\0vrGx sa6m:2Pf 27 XY95ҥ9 cqɧyvrhlB)L'3UE>i `RXW/i&L1>kG"% KVeGxrMg],]9wI#8ڋO磶rl-4QnXHq1]󜸤l["D\+'Ő*ǣHZ^8+; )J@/ 3աC[j©cRKI7lu[zoD-ˆ')ˆk'DJIQO+>kG =4SɖM'R8ML bd8tV{uC :/j'`y8an ^8-kj*w5kLoHv?#RjE# p b`pwI1F,βc5KGyNH-ΔF@ ǯ~0xճi!e^Hdv|hSɜϼδvO ED=gސ.?w^1]SV#̺~r~G3ݾU1ٛZ;kԠ@\Y5C0BraZɯà'Ma% ixy}8m4"p3a7b/K6;hB_ )V2}٨&L$b-k@Ď;ulj|\}D;tR^67QZBgDLvmN JE |WP`Lێ ]fź9{l(: M ּAȼ(T;a'tó)71̎@{RI^ʜu9_Q4ςDyW {IRȓhSrfo7gںwU w/)m'amB IfJ?c- .Ha O=U:1ZOXQ]:3|2n9w#7lS3^0=Λꀓm[HO-Rhq g/ORdmش@0$3pU&IlXE}mn{k͑P*zCi/g{__>]"h4{~}M>\>$HŌÞ HL5pʍ1MPb0" 0iVyMq9Qp(U/U:Ȭf3ϙ{/Y\^";plQ|1D{uș}o s:쥻ak# yzGR%aF$>h,%g7S3\y#wG P~*1V婀N 4M579ǧ꤫x ƭQ$Cᷪ|o:ك=Rf!o |2k6= :{Y%1“Wp(Y8#t#73cM C+CU0p:;s2n>~SFo?:-@6MntbIw}Sc_uXũ ~Yp\5| 7Zn7yGm1D|6UT]WӍQmosd,toWa yYȇc>.#b5v02x1 Q̤8OK+8endstream endobj 446 0 obj 5723 endobj 449 0 obj <> stream x\}{rՖ@ DUYU:JmA"\?@CV$$:]>= ڻkoϷ khXX۝kenbwm|MsŎ;f>xY#]OwW [ݧx˥z5;[鼶ߥM/;soJ0H-߿y8VkMBׯ O~=={5p.u%M!ڭLJjX]1뇣lVtau~o=K Q'n~s Y+HO$k7fdkȎ? =YΥ]Z-rykiu#kPQ7XoNJZń+ ,v1!,C9om d5^1}P0oD귇nЦbXX+dXT߿}mCUMxzl=S\+rn&zԻ~fjj3u 㹒XJ4ޛmAU?qƋ, 1[ #,Z_2r="wCB3z!ȳ'ܫ1#mt_E' m."Mdp~V(aJ(ժ$ 02 :4ts,3 ^ì I0u UH)R>:UKJTkS呾 @43C7+Yi,( ğS3ElqO%k;C/tzƣ3ux 11Xy]Z4{OlY@zG;$˞kX--JTwizWwe9 :RZ.l)R4!pi6=[`aI)+lR/|ШBM;;"dD@-mM14&R7J0=a;Μ!^7Wזtq y,iR ՚d;c*YUHo+ l"D%Rsoǂ`hLw>AGfS}wHuh,_XQX&1:\i؂hWhwUs#|Cਰ.wHǼ@{g"*g  idV+3ћ!)tk+ WхS@̣632P(2{#2Ӝ3/]LeN3'1 %QܞD][j+KMLy[Xe;\G' Y5YW39u+r) A5 ׹17X2p#& .698ANYgݺF)BOI/)[a.:z:N[K#b'bƞ֋DG4z ?`y+FQ`d$hr[bqZAy;x%ƔZv@wN8"]`ԛvz9>Yz fu?Dڰg4}yЀQ9Id$ES2̏JCf2sM<4E?"g,e-bT, \"7Ӂ&ʳ"Y?=;*]H+eՈ;:qDX+rKV֦QM Dž,gP;QN=l_c> 9h;V\Ȉ#6p~ :i vX[x3G \Vl-}A[LuQW'o 띕Aa9 ?B5c|{|i2ٚ%L~.IS,v᱖zDŽaZ&?p+!!M^ Kesd oI Z:C##P[&V\F.Io@CT4 ̈́lL9 =^y}XT®a+1(tjS M5tbR|K$1OT$/2Bu\@j=-0b3zKr4HM.M *ZP?3xr8bZ,̓W4CW.7z?f98J⠧.9;Ys kD q:<(hJV.y߮B81u,_182;bU#7P9^qCZdn9t%B)&LOZQO"}x=h ?3?<~'V)P1GY:͂4(D:$ׄ"NH& [B8 nX9:^=(SŤGv2e Vܹ~N:]:W6iu#v@b}JZ_gMj}ZψVZOW~`g-5.vx9MGocj2'vę y_vE42jLb˼ ,"eM̌ZG ڼ82oijh^ATe?ͯsf2ThͯrGcq(?<7!g}mǹ$3R]+zq<&w8$L\EITendstream endobj 450 0 obj 3896 endobj 453 0 obj <> stream x\7WA47W BKG*҂hES!IKPқT!.=ƻ;}FU=^{ljZ.v,_Vp֛ϏYcD="ԎhLyZǹwyTZOAVhYxp0 (BOH]2 2@{emڗ`Zzi ~vA o1"3ezXu[%롫UJ\s<-7aL6~s֡S{j78c o s&dLf9eɹô. Q+rVX1V&IC [& W;$t-~Lg5♴Ă*[פ6Wq2pE!7 g:6`"ȼlihFT=c 6jñu^\+ GB1>| v宅 3&mo3:w0 pT͝b2nvTayHjU_qZ5oa(nwqu̩f#ÙQ*I\dA,mEhKٰ̞oyP>G$J;Q L9r 8 fdc(t*)L.<Edhd FSk![G0A@hE@ d[jU"Dc *#а^duF)NbpFaĉh^Ͱ`lܗZ300HzW: #Njqh˃ mЇ""G`9$fsEC+@hEcA.ɚ0?KcZu$=0h[ yJCD"Lm"m"b@gI ZS.J^\U&Ӂ:8ԧNt!̘h^9Ӫ|'Ev*Zo& yRӨI/'c&4B 4)Ftќ^!>!bДU:G .b9謼Gǽ q&d[[^wh>I$5_cr65u`Mth>Hͯ)Pd_45`~o;.@Wz;;}tEDpg!~7iU sfj,xHp/9A!"S4R@a2SA4،04@+)p ƀEFjiKA;&SNj> Ot~}kQC~G,T:X'[Ϩ W,0@i.= q(ij6OZ\ @tR$z^_'vG_a 4\<ۻa_! hA\UˌZ!^Hi.H2Z\ipB1҉%OHon9pa:=.:.M=@Rvk3\arH!Q5Ij jQyp +LY)(0ul qM zwBHؚaY`ZfS#Gfusa*^M~z^Lz]$#=nVf>X1dxBbΔBМG˝a׼"ֹ]  W! BQj9QR;V|kx}BL/\(SM8-冖LuN*dxid!bߣRY ! >Q!.D2lAO/]JF*"B詣=ؕsTw%rsnVdoa&/2w &P_P}f`~m =czڛF?iĒiA\QNDr =pʷK[BO)BZ`fCY Q0=jdodi 0"~MCjuvUnEިwePHu p4R 8f>+[lK*BS@[m#zꝄպP;gkʦ#h+ڧ֦4Wj6q6K4*'A9BWSh[!Ѧ9m5LmHyI\v,Bm chV"8/3no8J>'鋖:l':DzHF;Q෨g2u'9p7eցK^f`D/ҕ0fejk#R_W>#ȂM}]bKo=o uUe&ڥzZ Zl[ @\*?V܋+2R槤i#h[F}嵊 ͙ 4,V`+bǵ82-h $S'͑: *aoDGa&8H[e >BG}IP/Ƈ֗cx/%Z8Up*]iYo"0^H{{ةIEDmڊi$sK.C0(wyKR5Um_<Р2,Y 1fH+ST@\,;MQM-ڎ CBa-]TQ 5k,I,+CvK%-TRdRk J{?1"M w5Sej?2k?[`Yt RD΀qdMo ftUPUbo^fb)tKU𜶰Zhk3*RCHA ] :Kd)+Ĺڠ^Rp)eY{΄R{Ž}3!꾯E;[7t@|x4Aws)Y9[;)FH= ;GF!ʻUl癸Û4KűɛE.7Fi(j[WĿ '-{iWmDs0Ӈ*pYLHV7[>1[?$_2prP`hHVb%j_r:I焌PMΪ{fD8"kfRQT 'mY(DڰQe.BOH+J]}B|xYL~71" zD:C`(@ &C`[v(Ns\㼫]/HD>̴SWa72@Y몢fҮW8TpM\7+67wԑ@_'C4E[_ gIknϟr?oX_cf7Yf3LwV.үg;%|uV#38 =z'/#diDctQF#,Fy]w c#6E(!SNQVik!zO4%nQ/({:@E%j#%}kbHv;}?Jendstream endobj 454 0 obj 4408 endobj 457 0 obj <> stream x=m]QS&'4ýxӣa&% )CHl&NY:G㦝^]vWo_>?]}}Lߟ>>ՏmvpebwNlRĄQ~fPǗN| [/NvUg *?)f2cf{ Mx<ףk9);~>?<I3m</oLVj]j3%?H|*fCΖW2E;>-%B h!|Yfcr[ ?>8?kK?:]\Vy},loN@VH! >o.(0.W59VjfxY)lǏt,/5PgP oy OX(' >]-YT1Fw38pV&&ōḺ\Y@gX>=29'3PwAHd iH}囐-7 jy}gSy)( .ёɇ*H@\r8`xiAu«-yaZX3_+QKs?Vs@*I1ҋju0@~>0fdN- b~~|`,Ҩ;D5jC%r%!86b?(3aZx5`{W;Q&9 3L ԍꍡݏb6LCZ,Hㄎ*= Pb7 ։I!{8]e ۸UUJg,KTǚ܋U8aYH $`lherI[,4UP 1e0(zP'" b[]-Ӗ4IWxFWC :5󆆛s1QέY\1˽c L{c`[g;h")z+eLH%&x` 2QGV5w Bfs:ӄ>w2,y,:.:e%j h2 wh*OK'o#\=GFMbQpͭ/8mxf:M?)H7W/Ʃ4_CD ~ b'2h}鸞fd;;7b͙+ΨʔoT19$GMdLKiy0(E.|IX&-'/fPo8JcW`A\/:WL@<*gh{rP[}JC _Wr%9ev88m2`8O]A:t %@rFB$BIH(dW8BE v`L<[pk InAE-tyѸMV= -ePf Ts!׺,cMA1h ,O}F F H@;"=A=YhD抮A|# FHPh   I(1"`!A׹BC lb!"=8I9 .k^z/Y\Fs\ bdgiҫuyGT?/G ML3Dq2/ Kmg'_j ~}D|=&= _̊gd$D&Gm:晹A8?w~7䖋X6[֖L'>H=ex]; Jar~ަO%iP0!4fi6`+iE]AyS)5J$v$PYD'^|&4/K&zUB0Ṋ!*@0Zϥ;%d6Ri^Htj'*0m׆ >#}+xE ]/1+eA?Bh<(u&44j%>EOЈ'i\e[5EZJ>+V eۣiC2z tF{%ٓą2wwZ4B3$4\ HKfW|s&*ٽ%lmmʆYæn#3 03q22eL _nMyKR&8!jtii h>$LjI: QCd4ғ X>$+ w:#@Q#K04F!h|Ȉj@ɀ@U\ ܘB%JGLI*G`>d@@B eD@5B*$@=PlcDB!H۷5C2 f>鹕d78K u$E|SٍF_va8%Px5FdyϏkYܳ^_bX>Oȓ1.=:Ls~nFhW&`[֞ew<ךК'b0(w7h{qj =,^kma,]g7g?Z͑EOMdWܬX#]@3Lt>{4{@3M1sR^$&Zz@!Bf$ w{H$v3Dq\| !Kr$ЈjOɈOI\ ܠB%JG"C* G`h@@'eH@5= 2 $@PlcDBVٓ@.~@ܻh/KFOR>O_//pj.aŮtMR ao:;٬|@ɉ{ Gˋ( 2ׯ`Benyoor)x/AUW nGh &Kd!ŹD*Sדzݥ /x6!o#YѵXͯ/)LB{ @7ٜt$=_[2.)kYHtDʸEfwQht+߻<1$dUPAL Fy-mMz(;=nrh?8Zlq(Qcr`C&h,X)I2-ՠ ,QtDhWHP`t;" 2$U P$7ՠ{ѭT0G|_㢸)AjBލ"a!G7EVdFRLK O03meHr錬tn6k.C}p,q̃%WR6#hWk&f eTՐ8}+}~o1g 4膏F^@ 9u=/YlkHfÕn}@Q>n@%uPI(46"ƈ,spÅ=Cq=S sgu5YHk}d J5Xұy]rfցƽwZPG ( pUv׍~΂Ybdԍ}΢&A#nd^!#@n$st3Dqr>g]]yT/pA:IQt*Ϣ\ ?(Q:ZeNރ (Q?u@'eH5=O ?uL!I.8$v%ݥ׳*RfqdžwQzxJ|e~]~Ϣ~]}^vwX7IL3'ͩW=hep:dT8 ^VUz9>tHd2zڤf(£Dz\F3voG"`Rԓ  J[ȜèD2) ݔKQ 0LbE k!0j] /yf?<ЇK<Gk#fȌEZd{eڤvmRbY_[q(*3l{[YlI> CsN}$5iEi Ǝ~\.8Vj\$:HOVzUuhwFzUB֙zW8P,m6g=ȩ`qkmn)o7guuw UC.<˥E \~l^0SzWY O+;i,1ٺoNGcoN-#i ; ze5.9p;`-Ziu}(i8esoX{jˆ{؋CU\Jw~_O,+#7zR3=(W3О_ϥRǿÚY?qp++ֆ+ (V}'b;5+=ǣfiXPbܦdţ./BLs@rcs綫,{1[w^bU45NrHpu #jWe~u>x.endstream endobj 458 0 obj 5576 endobj 461 0 obj <> stream x]E >HE,7{ŻJWDKĀ1i{fwg̙^Q$&v|~;w/4n?w=von߾{Msӻ9ۛsN؎:y{֩_?=h0_jw2?;]'SfG$~:;aDb2az}pG)n?s8#ÑwJq?8{x(%?q/[ƴ#:)z:Kxp影S߻G㴄NWa+  5'N:%~q%"LjGgRnso:k/2shvj85ƄGe  ;VsNb/{v돂8(YZkQ(]0vNTMBl m!k4&1 ?|&1;kyfJp[[&s}aځ[Ti;p\oSi{8= XxwU"VU5Sb]:mb{tt&;ͅ,g>;M=QSeqSH/#Vp2b͡,|}KLا|ۙuB;(lr=#.߻;[ x(@ٝ~87A{ǯ}BͷsUm~0&awWsakCE?> ??a-&kpVs{M_~wS8hEEA_x_(,Q!Z RnaNPe}/ Z,b{q^+ʘ6A" de?!zYӨ 4!ԤH쓗*0`x?.:]t{QY=a,yX&[<DZU. L{ ǽYg3`)5 -C,rV1M] /$L !wGlL*-X:!AesJVR< hP_E͍s! UvQm#]%$Zڍt*U7h@,m<0_L{s뭹usnqnNsucn}3έs֭bN-_>[ƖSK6>۱ylމ͇ h,~3roc9g vL 7lX#]l|ю.FdEH0AW~D=G2DOs4(Qiw-6(Xy ƏB4WUCOh-%k#rSutU!\ ^:AD 槤NLEKA_%:ש sE1+~p5⃤%/9b,pT(!cd@0j8c)aPp=iz%LKyGH}n/-K-rN^PvG;2.Xp;İte\cvlV%t ²l@*P`0t{b I$>PtΪ _x~6gi< M7=kKkDWX#6e>"D0ta)C$ O4 _ rԴEِ|J3 Z;P$"ADbI%Skj&fֈ$7VuES56:nu&a"mo*`J;M4h>Q7hzv9Kzg񳗸*+ ֐@ŏT?Ngu?VcOT/}S[^8`d@xOa\ QսELDxDvM%5zF"F]h$H[AЬѤmb/Gt7s̕;iz`IT@? P9ڽ!W%!]4#8WGAm{avNL LЮfƐV,DJ:.phv`80xiӄ٥JT6iMfu#UdB#G }'1 fR.?:)LiM"zM ѧA?l4/x &Q,߮$}? <9{$-+pM-d6⻤jfĴf@n/3*Fb5-TL<;{ϼ0T?Z)t dIV3k荩9dө ި2Q~5"h#O9JȦֹ1EKkJű &ͶBPLe70QzGsRsk|9ִ COʐ`W& b*nJR:9NjeQS;'3DBoR}Hي6jmrK.MR♫5-c5dR2!M _AO:[UxS-kL=\AKSߘ[e;iO䲲Wd*n) yCl)R3^9 :_í`S@7QoL ^S]QI%|9J! 9s}Ϣe ;:ߦrCVN;H 4MlELKnr=*ſӎJ4?]bzPH 5LYCۂNW2VFҘguRO$Xdx6ٟLqR6\s%@kɯ<dҏb+PJ%|VpUeUFҬi^Ursgi8Y_Se<0Fs-9X8YqU@0kH[lVȞ[8=P*.^dWs&,ѝ'}~* _*^_yrV/VDlf)-^hQjXPd' {s3QBiӡ^X^g)RM&0ޗ=Dhȿƹ"KDi^\ U1f5]5CROrS3^P&ydЋdLZ8v?`+&lӿ@y{|3(֠jLO1YoL\. &f䙶G#!:8"v)CPwzYt@aDw {l(bv:1R) e{f_B'ܚ^Re>^2 a-(CĄ6oWY)iF`d<7}g02 bbz7/ 0_&m5 r>&ka= Zo7jU6endstream endobj 462 0 obj 4667 endobj 465 0 obj <> stream x]mQ.d[ 6^(|8sWI\bo 1(ۡ¿gF<=wq-WΕFOW}'m?oW7cǟg S7qw42[5vӛ=ً_wj0YtʌVu';;q:y8Gr&_y^[;߽;NӣsߍZ Oce٧WvtspΪ3r= NA wG3݃FyAӿţO'pxKpHiI3DOZ ٺyC曜juƆAsIGqz,;cJ^Muݩ?"c2ěn :MLTXU:$~;/Q\&;Lo7|g(42Y\qu]`0N9"y@%e37dvqzbp/vU>&Y> ĩ,|b\QѶK},ũtόQx qAXw80Z1<%20LJ2HKh%NC-"2. a]a[ӫI0fVÅ(ܚ+Yxag;n|8}_^F۳ ds&SˊRU r4vPF`Í* Րn ~~rWm 's+?ЏL dGOn?uPu):ସg! قxwn@sw W8 f`3z)3WcCC|SIftZry%`p/[LU,u49@I\ ߀´p&%? 'NȄMG8*ҋ4KZ'mV1c®0zƪ ӘV] ^/˶΅ FL3t`۸VQ+!6xq=4K2HZQSfvqi H$A7|2n^(3ꊿ$%=s !liCqv.@£7Y`%k,Z0lC&+|qlHCR(?^Ő*}|pnMMn38 @inr;sDd2Dndclm%J`v[ id IxzFȷU~;&I dᘜo G1 G3,v8J;J8v  ׂuc0 .a_7tȚ`'WF?{? u[t-ZVTx3 W^dWbP扏UxB2vJbdT|Z𨮺 {t. HS,K'zii\vPI|w0i;KƳȣ?!q0!r۱VQ@q2<tO$@I״.܊MH yW:#ħuOr"}S&5U抄{N8aH[)2:K VIVJuΡ2sJpjFC+/Uc\E !'>GG+3Y+;چMʤ੡mnS?O_B? H3:~|!қHE;+E hՏjh>1zy@pQҁȦbRa36>qTNA,W͵e]d "uylŐlhr3@"&$*yٰ{$qLY댙34fbm%'Z3{󜏘/938:u&c@wIFo4i׉BUB1# y +G+IJؗq27-fЂIS¢o#gl¼(L>P H~"SO6S!GCO(~oz@7B%{R+Ԋ! )k5 7_ZPy7"arb"m x/u(ڕU۵=4&-M&ڠNÜZE RHpV?DШ-,dbi3Hx~6].(_ VuJ+mw4&~FU㊐#q:^,Hr761LF`u`bCP/~=HI:DbR*uH 6sH&W@OW OLet),sMGCt&␕$sJwO-NtP1S!J$ hHp.ER-vJVe4T뙗 wuY#nzO[yc/ j#Qyj.d]jN_o˰szmC0_uvp@KE>k,ae~m4W*D8}oGQÙu cBܲ )h*ɋkWO;_=Kr $d`>\3+-Eƴ5 ,G!;˧Fn;̔+HƏvm㞞8_#"-zi4-yblia8ax,@a&4qT좔{5Z\.r Cm@H v-h| ^S4LPEwOdZk7 euˇsH1u; B Eҽ^N+ ǩ`$pӇW(ozLcguЦN5NKizHnXSTNJG'2;6NJ%{ga2Q.Ƥk9<ye=^楨 ŨV 8ՑuEִ4&5%@ѺgXL}c4JИ|az͕ @ H%cR& :2  &e3sor7s] [~EMU4 .Kh: w{n_Et`-Q2^`l]_׎AOb[:*]*z] M:'-FG#3(YY>}bP@$ Oܧ.AZ YZlO_ZzltDGTy:b<]5vIQ^?;eBۨY0ߥ_KL^)iO4E0BYNlML!:W^s+δ=‘|"?&Nr\OSgT ȴ* ^c`Gaf:('ȷo2¹_;/R퀾pM*}#ZuFD?A?Io#2OYqd+2_T18ԢAzND=A(ip%q@ -引bp#dLe'E0uU@~kФRWlQEӱ()|Jfmp`."IOvTn7׵KxOo*r@;{9w4]UaAN7OQQÈ13&*jrͯ}Vkl ݏvwƵ@Fd6ו&_Ej`({Z 8b/e+4&S#n=f͗jNs$- eEUHSQruѨH̞^ci*ψXH3`LCab"Mx0[yd{{ت'AEakv ϪV?Q-}٤H{Q" Ƙh~kkg0/&!ݡ(q&*8\=>T,3£9s77-|6pl _7#b͏0$bW .c `A)lSCTa:ߓ:\%|+[mTs~pq#bX‰ǢM)X'a&C%Uya{&bd My&'gW & ]#&CKz)L~2x0$ (P#aݰm `62'{8ր {;Q(|"m#i]7![_d7So?tYW轻OAXb;;$Re_+vB<:hUas:YVU?~~ށendstream endobj 466 0 obj 6052 endobj 469 0 obj <> stream x\V!7WH.JYV\RDSnhH/TIa6 ZZ6\?ذFj+mmÍzԄ}mh^i͖77\#YM?lEt}->[֮6[0__lIcBde0]XKZ1ʔ5 f+*Uۚ)[cx?ՖGf؆7͖5R2*ݾgåVpMb [1t}ڵƕgfO*15| m[RSnZny۪`{UƝ(+xpSc-FpB;Qj_ կR$[+`~nfhq9WfAuX{ki>ISk~U[)!*EWL֝BMN\U"[jp{5VqnD@葯{zr^?tf{U1R ?b(H{ՠZ1C-#Y4۠eװyE(P c گ~ k_ #a ]Sח0?OG .ST"WE9ڍ$YLfq',%Rp%"5NJf~KǾ_j1uλvDlM#% {%XX]ܵRAlI5G aҍ8.[Li d|%;(Vxa u`$o3ڪp dKk^ۅ*`1>!(8'k-I֏[S"[ɭPTyzϦ{j _jk %:GG? ?X#JP46NfVG? .ep~0AO-Y[0|ӣL&x*vqen_ҴLWD+Z!=^D@ 8+׹-,{9ӕPoFgsGt/ޏc bXz;@=KR15}+ ɾ/fV;'7c\D/gzۧu,=KL"ҿ_6yAx7?EGh]Pq*OTC EVZc疚Xz3K?!~C5/߀v2P6 % !ILSGA̩1r R4q؜,7s_/L|̛z<z̛gyq&@ <^Oh Q"GVܿ;*uL8ID)TOݎ-)vٍ{iPV>3 .h NHַCZR~d+0ӏػ]dž/ZA>}7G쾏:=Z A޷Ŕ^>?޸RvaWˇO@Na~-sɰ#!رdDkNbØ{l܌x_cS$'0]|ѩ p9i?2Tm0_)V;Hzt]iUOyz\^ikQ#Pe 6icyimrSWd >E~bAx^gU;3 ~g$uD7՟e<QiTAFBGM<L P#~ 8'C=G-r9CÉ *4#}j%Cy-P,(txZ`coa@((UbD ưu0ּ1θc`恘66lz\`9^C&דYǐ{[: z fSqKO8xfrQMK|)z8wi]unDpz=w1XUW49>/8.qyGε㹌 ˆZX7Cv( ơ;ލr}X9N;RDx[UG)II< R0814hӇ#*Xo:ʤ ?qH.Җ{j5> stream x\96kH3AutU GYM&rxdOUOwW]Y!zx;vgOrv_g;L|p4ד2+dt'zDٟveEn쯋;_L5c(s(1g0SҼ̄) >ߙ7+2%c|4KQeۉfӇdzyəOgoPGWdBM/f(t\Y뇾qaӿٺ2S̴ւᾂv9ϊB׆A~;Zs]鵙a{C]|%3[dRn'8q VݚN4)}\`T)G6Yɒ`kRto67YkU]iVR gEV ՈSĎKsyB21ޙ ,{FxSТjJ1}F)!|}L3[ .-KA khKn%EiI5MPPW!XYn.rFҊG n Gk0\:T*~PWtKO|/U^Bf,bBRBRtK̺ .rяFҤ1%gaa@f&2))9*~0 92 KI˂G'a%)-=*"fCM${ͪʹdWRWNkeM tHo}̠楪'6; B?漰8bj-A(sXgиFR^c RKKRUk-i7ߤ'#'tK}ԗGE%քdDs_@GhAS*>#{xI}ŌiCUzەJOH_UF{ACr+$8cSE1_D0pZ1"9 uB { 1j5C <1wķCN:9tc5x@: EzB V犱>DZg4WlN]6$,wU UR]ظ(-tDE3vGџU{vRh$Dԣ-)dH&[SwA4kM!!DI?˱ e`iQ[4v%xБid;Adrx‘zCdԹVO6{!s r"mE.,.ƺݾ`f'Hk"#v (4aRR*ӵ!IŋAg ֭c>z9rɣnm4"C&ׄ[wMKU|mKTJ׼v3>4mAnE۔-MMSR#1vh#)?'Xʺ2M^$gA*7sb\ z6~wɾ`Y.IHj74kiu UDIH)Q/±@9)т__4ԽN턴{BcGZ-(a;5Ŧ/=G=TKk﹫/&[ښoΦI ;HsGh+QMSͮ|P\JvzE٘$9Fg޻A $^ Ux?jBׯR9j#5c ߍ2i9-̞Fݧwnz:I)h Isȃ~" -5!Xn!ݸk/vVBMĎOb' ?̼HY|G~=$ExQs37k#t= bA^l.7a˧+ +tp ]tE_iL;y)|)GSs|9 Mwt9 ⥈m1f8NYg+b1Z#@=s{&t ]M<2>)+}聿̤4 y͗T, O Ek]\)n9 /+ּ+hĭܒwr%D hf]^BdїI|7O<{iyQp=m|'݉eEk]s%a1twWsU̙%O: ɳz ^z8nY%$OU;LZ4;w;Lhjendstream endobj 474 0 obj 3374 endobj 477 0 obj <> stream x[$G'j;b܍M#F6toA#Sݧggv/ Ew:yT{KϞ׻k7g=znN1Gr^^«;%doE>m^jo#dmpnzd0bC̤O.w^Όkv*<"ZE/w(D*OvFIc8Jt-hn$^5^o;{ﵤSo lQz{ Nm.|Eu %>mzki!_8W q28<)wʪ yRJXUpH7Dmg{i%H|Ken[({ė-!PTw׃LT~ gi~h"JF)VT@&qL%2J6@ɂy#T vnBh6Qv@%P l` +PB sB$$Ov-|k4ST9LV%%֙zdwU"m kH!ձNw6@ϦѿӨ{:Lp B)?F0i ?i뵰>s0"~Ht'WE36uYDa [PNǮYLO>`9fK. )DjE(T*_TKSЄ"@ BQ[95LX ccTS6- W#bRdVIBI3"N% Ktn5yBniijy_L&p7 dxUN7(k=|)0>pSz{%6-kV)VuU^Ok7S9~-̔h4d1Z&8t.A~3/e?, [\Xs!O'WSˉ83 q+_↑TPQѓ r JW.R=]\*IxIKB9|V/r@FV`'snO X xBKsoW iqX̜8ᒺw!rP^o 5i!OeS`=WE"URE(5о?x>(Ux! ErixE\"9ʅ=e˥H O[t f9K~w!rGx(Q[4PtxNU,y=IAA|nk%3>*V%˒$y{U43/A(&loML6L' s֊ܣY?0" |6f<ppE}B릛LC|~7`zC! iċ.jgO:S[U]ss5\nIz[ihp੧5lE +7f=Mg/ZW|M=]:&/\"&'N%fZ9\o? M]QcZ"oIv˱Ate-y\ ]n5UE)vzendstream endobj 478 0 obj 2552 endobj 481 0 obj <> stream x[A痬0i)X";rȉ,܁}US=}Fzr&OSNO&/'E" ,?8u9Outx&Zi^`SNE0p2hqSdia.Nb&L Pb9OT mND|C4OɢTT,)W2IUft\l|!<kF' 5;zI <ش42όq_y)@ C/QS1<_$˄'>1" dnș,2sLd?Y²\§ E" F4[)/"c޽Y1׬Pi5)zKaO;_s(t""z[?yrڜ,?'l+ e朥<̙\a+R0[]N%j[BP Cl҃3t. u+s:)t$BM\OF́8)F阋Y~1 QR4"{y˩qd 6xVZ?}$(ZD_1*L-ۑD?h>)T:-U!sX< 7Vr sfu~o_4 oGejS.[2'H,R^_AR3fVS#L p@KP7G "(?vס l&&p ?8=:.K&W Qsٯhic@>1#(uS2bo*Llus]p*LBK㩷@(nIASޥYᇙV#up2Cj4SVDsd D]yƂ Y%,3"yіAT(\Ê|LP Je;ʫ s نbv0%0[7Z}^C>jp"M:CV)m4Xo싴cdJzvkLL|I S`<&Vd m4Y٦2LP7[x\d}`Ha-[])r%fW,\TjY`/uTPROyHCk3&A'rty!ޮu`v4%zMgLHSY(O\NuEABWzϾ^C5Pg52>L3;H{MhMaw]BC\B$lHi3/K&`tC6#:X%543o fq4sF{}U'6qRu%ڰhsi+F]>{#ůB6;krEPx?\awkfUĈNK<-񪑐UXeFoaiZ="5̻<!]e6Z. /}@O;No) R1F8@TY8[zƊmr7)X_{w`^`CsĔۀvh=:[ۊcѹJ ^@h"o!)| ¹Úe.j~R5,&<3&"+j nVA+oez cW {IvP# Tl`ߟƁ#ja_(giga/3d˿Xψm P9P5bh-ܠLh۳- 1yr "O-xT68bH82&P`^h $jQѲPHX[=XEa>=f*I5?[MIwB5 h܀)0c ~*+T ʱ=SPכtZMME2Zw+J*Hż^88Ҏ%\igOnr "V Xf'6f(Ytm?>UqotGCXo+㰉n .JA< /'z"@7[O}Jb, +\gFv1qvE@kb~pL5?wcJKخ~U1a䤇py94Q uZ?B_iGεc_a 2*F/ кֲN:HcљGEh&:ASovvQ6Ǽzg4܏n7q&9~ -wOC;pciA5 M{y"-!UnKϿ9P> stream x]O0."f$NG@ 6tAhB񱉂;琜qIG&$c׏í0׳3c˱֭% OZvĢ-Ep´׎ &VU?cyˆHƿ\e|({X \%j1.a{/O?d( & Bθ>8GV;Z<*/WZiu_։VZiUL#MDލdXR^\iy kvA21J"mQ47_Ը.4 ;b.4Mp1*ٮ}%u/ɕ@JDɪHQ #75vcɵAB?[Ak:hʾ9xAv2 LuH |D-{%ga "_6j=&z2/Q &Z9zyB<͔F+ :!kC1TȻج|T`sހBK^m=iBB;->ih :ޒ[PE"¼oKy_Fe~u^jr/4iNE/ jOjÀrή jU84 MB N烑icڄ=p4iڽfqC홆o}L0%Kmg rOlkFD8DPNvLgenٶ54&N'9QӘvehv|l-;,_jqmU !be+%EI쒏hmV S J\CaMF3j5$}T~2@b! КVJe؆ ҶjhU*u6f(6_LPzVniܽʖj{dwJ[tx~-8w^\uNzޮ~J #Kc3c0 endstream endobj 486 0 obj 1001 endobj 489 0 obj <> stream x[ID H3 C`E,65/@XBQ JHR~nw'$QZ˟%0P&_,h-cla0"f8oGN/(qRSGa .(jo_73F09#BY-ҷ2Ne;"S&4 xy=Vȟe؄Y>|XəY.1Ffk¥P e9'Jqʹ]Pp ^ 1<Ǭ"rpS[pgVQPB/*9*.rЮgBŢִc`b#*v֪8VQ*k[Z4s} Fl| "%8hAYmIrrqRi3A*cdb\< ·"q5zٷ=у@= ԣ@=K\(%,+kM3sb, ҈z^]lDr+^&x]nNuHҚK/P?FާsiG "2]yNуLCͳI6yK4ġHcQh^yޛWv]ϠTSgCJ)z%ީBH܉,tUzIpzG$FQu( 1t ْi5$搼ͺ44em#ז^ͥJb컞i$ؠaZ8gufA~0g9-^S\5tb]ʈy&,Cՠ]0e3mT ]e^|b'@|ڨ ~:] @:+vx4pGD7艠ˁ>WXg,pTrfT_Fy ;%,TN An2:-nqbt$4 ¬VeB9L{iY *S獞tBHg\=L`-pMcg8o4;o55(/76>]Gqt +Ae̼ pWg2#^I JnqTzT+QnZqR=NZ;/'5f$'\,0^S6G2gȁyY[ G>i(Kyq#Z;L*}:EWM^}6u@9Ӽa>Se9> stream xY[o5Vr) .:-MH<:< Ԥj<z$J(h|} Ě(<>^tb  *?>^Y޷kϼYo~[qvX֞cW͵vJp`;|yzмiǷ0͛`Ɓ(uImdzHFn~\usnQ ƍy88!}\P oh-i>k[/pŇ'aSj>i;!q8ӼvYk%uQ4%nRkTm'֊dY"Ox}u+ډ V]$zףCb)SMË]Ցu쾟6gz¡& 0gbZɔ|*DI2 ~vT)zkF@ A5Ls;Z8D(fĴ5=Uh59/rO &T DžFQ6HvB\ $QtC!ᔩ_a|Y n ^g^d3ikuL'U$ ͗;-՜dyBD,hUxrTbdICЀ !Qu"IAKɬ|VYKjL'#II:JI$rYBaoDU1hWG"EE90\ 6ŽltoSه䨥CBv1}BҾg( YV= O"&/ ""1̫]ꛧe=ZUӵ:!Vҧ 'NʹI~0o_X~*dl}Zql ^N 7c6rf~mT'RkНÒޫ{0\eKZyo r$=d':T x'ι`{I'ItZQ֥NQ$t J.A!)XlG,5%^Qu&$Q bōjKrz3ٕ,݈f^Rgbf.%[:cegbZcJv^jѼ^A*`8B304ar}%uIa\v:tՋmRҌ4an2H4m *}Jn}z(}Λz0m-wT&My gHv6Q='ŖeڨH5B`2b1.#m/zT k9%7B@7o|НE=1p{!Si)E(> A< q.vz"~t$czϝ7p;.LO^;) $Lbtek!?Ç9L?Dz!3}I(}\`bxVWOHbW[G*l18:HIo\gL> stream xZoTE&ƪ$qn{>"+U )AALK{=s_s.mW mw^sfO+AV"3Q}gOgw oZe_ ۘ-m LlO+LNQyI < ~H,Bձ@yhjmjR%BnRj%t*ar–@Lt*;a:/);/0= -Sմ[*e&YR^t_gy,ۤ;DSn۔ JЍmvPR$^3x)DSUgc" Fv7&2N&%53qRboDq'޻)-j}]* ?&%^%=}kgD_ODNjP7h^i){Z_o%u=&I*+` ]5-O֣QX(^oJ%ԍ{mޙ|wa)4Uui㿑$Vwnendstream endobj 498 0 obj 1785 endobj 501 0 obj <> stream xZoEWPzBtBEn3P!BUS* >n.Yg7Mڱ"nw73um4`mg9xqZY7YP'|=2:hB'djxR٫ hg"N{ h϶EOڤ)&CRn{]tYzm{m\LLmYY9A=icaC/s>hZCꓼ6-i!i=+F^Q^60-PGl@T7M4`AVDml%P٘B= jzuq\H͢&$7NXm<ϳ{Aщp3>62*&=`4pox_`d sJU66ő:f.ݚ/ttD"Iq}.R/gёg3L)HNخNΊK+?K>Ϯ6D ZD'q~j'sq;LM89ڋxeΪQVEbYG<,5Q,o/^HsDpb:⶚%`e[s._M;xzCqm`8v}}-oh<u; U<_kqS_7k(\Y|újݮ}iLw3v w˳n\fuÿ_ſ{Q['Suʿt| ?Dendstream endobj 502 0 obj 1118 endobj 505 0 obj <> stream xZmo5P(FX"R@RAT*: Ph!5Z3]vޒFɵ4]gg{Id«o1j:G[yM5s™۹/7@Zq&3~8p3鼶C&;te,0ku0ܟ <WhEi-WV1kL kE}I-gkp1\RnZ>17'V2x= i6;ml״i-&U0)8%h(ޏ&{>߉ &8K0J.+筍Ԑ7~)dQ}iuHiL[^AURy! f;rS +Ʌ[>\ύdBs5S ?$B]X,2h s׷͂bFH`v!Aj& T =/.A=t%ۺ>lXBPq=aXۍaba/E='}=}9@A:̂!r eb_ nc)G^#t\1+уئ5{3C$=V*#1/WF|C%Oc扡K?ܜv!yp)㺂.fLAm ҃A/3g;Hdl=3O<\XFB.g $FL̈́wQD͟[qZU7qjCRu,&rƹr~Oƭb}"AD/'HA& "7ګrVg<+ns*īmg 8 8hY +π E!koے݃gzAveElޏ3T$iJ,Fh" ۏVOB!74)o3-i+!!2,٤\^d<=ptሁ]Ͽ;ci7J 7$> Dkĩed+kXNT7#)Or]y)on"l71݆I_1pMk.5e"2ϋKKqrݳ Y3! nqi]Xed<)CA~ktUX)2tc}ip9.ȇsM*^ֱGD4 [i>G]~fendstream endobj 506 0 obj 1597 endobj 509 0 obj <> stream xZ[E^EEdھ_1j|PP zgzz/ .pB鮮UUϣ)gBNyN&|%0y4Lx|dzs6G7 , g!x54LIs1\0=<ݟi^jʙO;V5/Y/|h>h5LϳADeR;72owLVvIej^i9S:He˭a?7IA+.W?%OKc$Oz]!=*gU(_Wg> ڀv'ܢTPBٕ:(%ÂeDG 1OU"*]s38U1\= |kޮw K-SB4啑xkĸ VG]Bpqk%Di RP7݉EKpDPzՓ$@"GN0_W"ʦb ;lؘ A DX*Iv+NS~u/!PԬ DVd(zT 7~:+W>*YۼdC4 ^(دOoɤy/MOI+ nn!&Ig(;HGn{}TƙbngUn0ۥ6 =D2X҂}`)kvK_;am]>U YP%7!=*=G .yUE+S],Ko&?Rendstream endobj 510 0 obj 1672 endobj 513 0 obj <> stream xZ[5PJIB q}|x+ZBЪR.sdij4ْtU}9yMDyd⹊ft|rܙNnm'Mpl^hMn>{ʙpeUVrA|0<$o?LBUBRK\cz.Vۙ!rvKebZRYv5\o4yIJ6Xڙy_Ogw[ť6 5e/Ǎs mIv/Qq`䠍(^D F!}h{3`oD޲ё@]ŇJx*nu,@-oA52oeΣkI>1p@!YMY$qT}knFDUZ:@Z>s&+\C)#J,<V= QcaIܨ.+pe0v;sJH4gi}Cfˠ5j^uc!1֠2\/tj5 u e\/-2J˱$J01$.A6%^O]diհІ~$&y\P Xaec~I wdpׄU{L*j%Ib-QeJs BDM(*xz xdy"EE0VzV<& >/}Z 5M e1Kj; Ls7O/(lK>O4zF'"ӗ4_~5JЛo?sJx( mRYI(F B[v`hlyתE8'\uZk53Z)Q-"OMD.UG_vL󙺎,gJG)"IM'wm8܀nA(o'†"8/)7I{I9,8Glvaa%-v"`~W[TI铱DfufgmÍJ̍0?5Bdg/SSkW,uAJt00 B\G?H}GoJ֭>C#X&$`[ؾA6 c=c^ё'yґĞ}wp3k"M:YO0;| !/8moPJQO]T9&lС'.=/ @XM@44䪲3XTzWK8eW~U.- 2%! 2HpWoml|j?8? ZHmqGq3jykh cgAy tŏYo nsUϝJ.GѻY)hDpDWZV|x<|endstream endobj 514 0 obj 1469 endobj 517 0 obj <> stream x[E7,DDH0~f5 PMﭞkva#tuђ3!TB/kºC \EЧoދ⽲Lj jh⥲)%^ϻ*#hNs3tOE R;q`[Z = ^#AZIL<`]# l\ ?.kcU^wخFa}-fR6L t4otTfp jt<6rX<@ i ŻQܚ[ZH}Y Q;B[H&"i.ME\",F~unh[MA}U# 3 $1]=:IdBD[Ws>ҫvԫ(rbKOs۔f YD K(äE>>oo~g?zҏ=:jw99љĜ3tOf[x:m!NȖ!md%l!%` +F]K/BzmCeچE)`vd.kv[7rne]=F~6ܭN[m%`+gF@`J2L謌]`kݶADO#HB Vw 43OK3NQʜ!gSѭŽcI2TzR | ܯB#8#bV=+D4#`N5ɓ).Wd2GPmv7 ÜUg Ght;+$BۗRhw ^pl@E:qoXs4?oL}#bqMp@|(ahہZʍ4y +(BuEIc9Sn93fJbdBȵa1Z7nendstream endobj 518 0 obj 1843 endobj 521 0 obj <> stream xZ[oEP@h)CT;%!UZ)E ϙYL8Sܨs=;rʙSфOO'/'ã闳?i`NgN8 s7_CL*tM7wqf)PS[UUJfS>WG4Oe%tGeR;72=nL;,Ӏn SPVpnv9Y A[=OvNs2EkMFm7QAy_|Ypd .~]9"[kk_u1ⷣ{LHsR[6+~EOh1=$σq!jb`E'N9wh![IӵLH+6"6I6 ΰZH`M>RqN4R+d;UY!3z\ӕ?lg3 MBM1%' ] -D{q!BhfrŽBqv,^ ͧv`bR(5&U3{2CdC ~" C~4:ߣҎ~MP^WgU.fIt+ ̼`W%Q92nυBF`z˥gEa\]4j#'H"IXp$_=ؐgScJgTv5G>c5g)Ji%f D Uhh 9F98oF')/kK.rǴqt">3d&z'9iWɞ7.,5hL%.R3]P9ocq% y3)™%ꃽZz5˿*!7_:C_7d!&x.LD.p1FHkƋzDu [xrgxh,eh)Tov UP!߬:Hk@I8o`kG6Jendstream endobj 522 0 obj 1668 endobj 525 0 obj <> stream xZEG&i!2m_ՠ  |Ir[=3]Wuw#TUWggB UBժ9Dy9tN`%;.oC%/߬jF+l0Dߋ[.ZVN -I  逿BO?jɌR 2}{-Zz-卸p$D&&<8GH D=MK>yR3+IY*,$ p@#-Lm<ު>kc>?WohoFdQ{ Ұ ''b o\L3 0F0ai(BUKԭ`A[7K]"@t"C0Qp֩{@Fg]Xv7ÑpdCmM!~ѯNgApCMI/(a4Jm2"oO!I=NF. ?Cjԇtȳɯ.kEo&뢮l&ZHA:H TY~(5K]1/QS8ĎDaX7TgޛuӺKsL =dNϔ CZ+ph^eѤo' E`9%l4" t f0Xd"E B:R_Gik)6OΚXo!$2NCLE{#B:;](oc'fd ӡ{뤘6>jBI=" EQqI_\`j_yNi@k=,VNşh1Q0 (xGfg {/*D7q N@3צ~(DJ?wހ7_`wd?zӯ0B:JGOѷn\a+ Hе$!10lAkKC=|1u4+ t+Xd#FSfendstream endobj 526 0 obj 1545 endobj 529 0 obj <> stream xZKEVxeq" ! 4~ V @>$Jra $ Sm{kf=]]kL?_}]=Ϧ 96'|2y6Lſ >:~1|tU'h (LjXݮ%YԍfRjΔRFm ׆ WYx>vսZ1i [QZ齮^8用ހByˠdAhUOç4ҀpID>μiEqD tV ֨މ}5s0ɤ:UPI+,Le(fկuZ?;g9[h&VhYk@^ uBw}}>tNVע28Q݊ - F@]o֍dH)D1nJ#4NfBҽ_71%HF}]h#YAzof{!dpޮ5 F\#V0N# l1~q;wHPL9j\ nދskTu㙗yH:ӂ܏" Qȁ [ 7ޅ&p`DwVb3>h7:F(,o%@z}i Q6!@8iL81'հ!9^pRZRubtH1XWv÷(d6e,()PI.Bd.㜍*}I)RpAѥ3-sSOAũJ"pᎳs}g1 [wWUÔ%Jԙlal0 n$fõx!X뼓 \~%U24QEftCeԁ;Ǩ܁{FnW8(W`lvZHxWɄ;bM#5_?~> stream xZ[EѸFAL<`L~0F Ƙ 1.'gt׬;Ʋ\ $Lwuù27{8 B?'yIc(:Ov uVb v N7gZ%\. /H:oP.ݰ ^~~3?~O^NHmoFoY"z3_,`LrмWU\LF5K 7NIM&cd(@X*b/Bjz a$Xr픰V~A-\n (IxJ$@o1`ELVшB \MﶝC8 kJLE$SqX}EC$8Ędw43uR ##KЎQb:ԀưH>!Ƅ}YUVDǷ0a0<$hK(JX!c&i|;S,֋BYăv DWɈy(קh|5 08tA%}XGnإjD Q3JLK.T.XE+ӸDI ^oL>j `|B槿e~Jt:6Ҫ\NXD8Y.#fɠ\uLd)Nj%PӍQ$lj M}7ܰ7dw u^ZŦ5zJ.>`4YO}MMI,ypD*h$ :떳ԑz;WlyQ]ޡ;++Ĝ8VT6,S$f,Q`HD1[vÂ$d%FLi95 A8 L` u?屵2Ze844~`f``_1o‹c8K9yJvۚ;-膭±,BLt!,]ˑc:uH|Nd2jXGͣA'%vvl%I ߶EsYv6e.a(4)OɛG]l#oV:.TV}pα?7ӝífE׿>;K7r} Æc'J /F1*`w666eи ?̯w9uvNN~endstream endobj 534 0 obj 1699 endobj 537 0 obj <> stream xZ[EF1jQ!D1L APр<$l|5H̋tל>&q LOWW׮'g *~#qp8շ1>8nl+ϼfyJ:xpV Lsw` x&3~8pi=k[/_ߣ(NFYڑ~״i+UWFi~\;ԟ1 Z1JJz;T]J lZŬCꏂփ3;p{Mc\iZÄӫoN r;H-F/ҵ<&Yw) q G~ܙp }%p!'J$ #00__kZ|zDH<5BNB4[ tP:/Qc %q= \]t!V]l*0 5~@n%BrCrfMڡa@նoZǜQUf ݎ!G`8 ˄0' eƚ$ӵ7܌HAB>FvK"BOTɈ);S?-B-Yx ˜BRDVHa?7՚b4~.]Ɋ!qYɄH)r)rx+Bi]3 6~;l60S)vӘ*5D1v'֤fZ8 plIb(($-RļNNpGTQaB~N*m>zJ^VYe/YŅl_Iْw>׈)ܑQ\c=̌'rOKr];nY/켴kr:Nju7xMc n[C4s/PNJ+6Et" HNpIV~߮pX8fr!t'P.HZKA>jIBOJ Z9 D‹MAђS6Ή8$46.-%GffаR88]Ka7XQEVI:&bB}7v?*PtǢqpp!8‰ӣu SMW?$%0!;6ʻ>)S6[|6t\J>jAT#hˋ5^(QKAq Hғw|(U;^ۖ,sXWdh@qA+PAk1簧D>LD~*y'f"fY<,BHs1y[V[L/Z+۰mt_8JOݤ{ E/CY5 1KX<Ǟ~w|/tzT]ߕ#KUvrLȾ</-+֔A$5THԧT+$)ۭ'#l(dg'(TBǻrй., Ü[aFEA?b{97qhLI'z3 { }M_LGxwF3IrB`L`ٷ泟G~ endstream endobj 538 0 obj 1578 endobj 541 0 obj <> stream x[[oDPDHBJ`U x:+( ZPB=g|9vk'ل4*3}ߌgK΄\<>Xg3nX B562LERm!`{zxX\)ʙW+V/Y/|(+L|/\eR;2.hm(d,I] &2S{xP(ä)c66.~_iO[Z·]%^U P/sV)9L/GiFᄢ(n]jNҌwa Bu 2dH)#qhh%<kޫ v{+&! {Kv ӔT/tL{KV1`CvPN8~ڒ`M0K5{#48{yɱEE(Gs$(_JjcS}|o@!ߠ蹶3xHnBk)p:ս)sSucB`bn^ql:B,i#Z퓻{&-5j!X֘CY9Hz3h兎f+ǾB'ˌCvDɸ\4 P nTurqFLgt^6$B3"R9(ƦmT\59p]X!V@54 JnT_ ~=JҎԒfrE VstCM4b$]91ŕ8ԧ HA!icPp-B4S{LJc#{ :ޝ;Sslf'y9 e# 6^+jEZ^tmrߎV_d?!Asw>O)N>M_4=P `4\+ԟ6$j- b9a#zE-ӈXmcm.>6QĎ4kUavt5q7ї P4ڤXdSη-H, y<Lo̍l'i]O O1x5mendstream endobj 542 0 obj 1810 endobj 545 0 obj <> stream x[Eb&2Q3ij$>B&h %VLWV>n܃BҙGU~U=LȊǿpī/ѓg*ۮ ,j눳m?ڮk>oIhl#sk:@I7'8uJ? ӡugh>~ZGCQc9 ̔ z^k=%д !.x2̡0ie Xz yI1HS%5F"F{1衬yo1m'Ɓh*XN  y\ƃv t4L&$)f~.8 p0ލXpgT2ٌ:Uz2XD֗_cgܸ<5<̮|&W`K@^CwfvrNqV1 Ne0 Yv 75k,_0`)i)a8-s[/ Z&MaΧ _xJ49%! ;^10&"Y˂;ͤ\B*GN(3h\1Jvs'JD}M $ .I?q5|0b*3cuFРQ\TX?Tr]* N腳BF}y>"\d +Ov7AƈV bz ;*tZ_##ZSx0~,$1ړ ;y͇dXp#HO$s6v΍Iy]f%䌠4-34v&H2 0,oqk ~t)EPA~GnpU$I(;"oEɄpK'Gڣ :MID4/yx)Ÿ x%yS;Yjnhy,d5Zjd_b5rZHg#Bdw_lx wxea䬳~k$OKaC Nn/&Qv2CΚϚϒ>ֳ%Q Ӱ?38^_@;UO~endstream endobj 546 0 obj 1732 endobj 549 0 obj <> stream xiE4^шFnIux`"Y]?W=3UggglHvUzQU_RxIx8-h-\iդzǔ8]N~/(qR3JGKa iQTO,8eDQ GŽ&r00"բzD[f]a2Շ#2H",҆gެAz oz嵦ta]ZB73fZrGuÉфKNEun([˪K=8ZNK7WՍ$dHVh-CSv/".z11:-{KB)yf8,u:a.ġϴHsZ5PFx;D`E\ ڨ=s&["0],Pzx{  XIk {n p0 XXNKo0DZ+'uSF4ck~`7ΘH ̅q{^ʇYPO; hxP 8| Y%=HE4K1r⺍3?ՂpE%t.LZr#|%'T"@ Dqv M J2Ƥ̄-4!z($*+9~隄Jc Ta95(XX%(05dʹPUQ :J([j$k4443:I`,}(f0PUv%(_%.Pk_[l+@r\CRFr\Cm{c;:Qr_m~ 1Ho:>;96y}R. -Ӽl9l ŏQ!R+"mniVʹ*pmcö.ܹs?AXfCFs'Zh'X; ayMJd/e_¹WuKАHއ[HC.9 :ʸ=AO&-El&`E˶jFȇ!u˚ &)1- t㣣/̲r 9v<ߪS&D<#9Jjp/)BBv@y:?5` F A:n+3dKa:yp]1bR^C}d8#tbʝy$#Ι&@8PKl]Tma=: JjϪ-_x?{>,#x+_Fp#x##x7Zr³#zB);?(УߒXv_nMUӣˤD"4Byam\m°vprֺ9JƎzK[,Q2Jd<-Naf51S Xv`l܎zzQѓk%?+iBbOMǟendstream endobj 550 0 obj 1696 endobj 553 0 obj <> stream xZݏ4W, +"TDBo"U E}(jy~ Ԗ_g{unYT;of35?iy :~xZnjkϼWO*μwܮe@y-:KJp`;]=7o@Zq&3y8pL:-yHV_Jg hzm(V)&yL*/iNZ͸wZ5ülcp^I.\%,LoޏͽV2(R0!̓gmǙS9h 7;b)\s5*{r5M= X-nX8B\o;^Ml[aBLFD[EL LqYSIT8:? /ek8Y=`48YTN mgkhah2$ƈl@R ebt)8 98"/J=Y\%Ɋ.PG%3 ""= " a-0f張KHa1R1`΢;sk}Y^ l~E6ta$jM/JvG)6D')Ӿ 'eFeH9 }AѤz3FkJ/SU$G`K%w*MއAc ? >P! 382%K)jP+ '󧛔.E7wוU{iq[ aN7âw iISͤW=+%CpKh2xb;d8¯5Dp&SsjDrAE 1٘.XgS{eHk}1GǥBckJrQ,f{{ 4O&$"-5IlAD IoDr$ G^r(+ Pg|yqe+G:jPl\-̌^%w60,ѐ|wUGJ:В:ǀх?M #ۜIh;:[T';L{8<`rtkRhn( < cBfVBp>Q5Nb'z1VݐR0i~> St9g*4вA:衢7RjA5.RB*Rkp㹫r7h_>qFg$D*D< Ly/9d\[7ZϝK֖UMJaUL2S*h]4 &ԹW݉*YeTT.B*S\}SJwBda.mG-tl$b/{ EY~B5Eⷕ%S|L@pW{-+n>w_~?G*+{黳~WiC+endstream endobj 554 0 obj 1453 endobj 557 0 obj <> stream xYE^=i>bDP}`(ﭞ潚K3uuկz^TKU3g?ӿmWgo*3c wJ`{"=Rv* 9q O䵴=~V {`V2XkR+&HNrd̓űDCnYHMln\u\`*McG,Ϳ~}pUD/x'S2Y!^BB^%^+NZDE0S [QD6zm3[ӿ-DE1pz8zr%s3'T]hiE(,Vt!L/zZTkk*^6f6oEGھcSVrSX ux0H+6z+l(<*tno3c2( F4i,&&73\=T5v|6V&K(s_Bۺ.S?Db!%zsi#N 7H }iA΁j"_'Q' ٰx"HK3FOh`;3ޤTk-B~Dexy:^OVu8VT= ]Uggg:o-# b3 R@@Xkp7)>#S7}T[Y"F5ڄ.h1֛3^%b+0+ ʆIFbǑe]@~s32`'J񓷼4@/ n"c6|zi?-6-JFٕ AE;b0-ˎE.,}#>ҼkTA;-|.z?/c.B\ [[tM_{4BNE+ٷT S'7An h[lxX72mBM $p3;Va sl&2ίV&)sT };wb ru<'@1-Gٸb @DŽ\8p_ *g|T)UF'hPzɛeyLPh<\ y1i`}`B:Gx_:tDbר́AQƚ!ïMPuoۚ :)YGjrljn$aP/\OHosؒg,EFendstream endobj 558 0 obj 1730 endobj 561 0 obj <> stream x[iE^ˎE81g4}фHQ ??Vճ;{qW"]SOuU/KJ/3 xYX"<~|TpXܼgJG.8g`TSpʈ>)VoՌ0a #BY-kNeUn)G4OE5ҘRJ_ ծn8Z9Y[7cE2U Jq V1ZHG\`j?Zib ы#?}LB"%.1a[0]%5CMoE Aj{:'I4nj𮴠f RPu{;n o6вw{Vwᚕ~m;VF8z2naA Uu@(,A+   ?ENEx 5EB[՞ 1f%# Hv+^ w5'H4 sz/`9$_HF aPhfBCLHo:֌[r#]DtջWh7}لdL |pmv@q~-Mai!Я7` Øаh2I̻1@&ۇ_9 IP;[)BUÇ,ejQ?X'nn*5V23M "V"xw/j#cuc rHȺ\6{n, >ًi0Q`@Arᢓ]$8z1GSU2\xj3Ƥ8'"L@t{^Ps(#weAƽ1nw%C| BbddtQ0>ܑ7Kh}N$oDve Xm3^:uzrBĵ)7eʀk?Ṝ$U&~, sܿf%XslhP$$Yug%tMK?'"'!%(dK"F oM#EQ"6¸lc3YɤXLIf9۹`I 0ԲJW~ 7 ·Cc,_H_3mi(ȅHv5LU tO_N@ڊ4/\Ck{I(N6c|Mmr(Y l[9I?kvRzhKTGϒ(7Ph{;7DMq#}yI.&_ьa 4c1ݤ9K?dR(WRt@dƆ>gEql=aa(\VPm' wDA VE.L>L7pR+(e+#,PJ-gl0\;I[Ut_%Ae>olziu% RDB]w:ɇV֙Tͷ|(HR U,;wMW(4Og 5 NܩMl Kיn8Y OU_<*?Ǧws_ou\܋Wګd+Q<}=/R}APO*E&/Ln38B lݵGJ|顑M?hcG`T;t s\_ 0A|[t<{fpC2 ~+S/~}!v4;eG_'ݏu>Ov>lb,Zx\ip)6ПHendstream endobj 562 0 obj 1794 endobj 565 0 obj <> stream xZ[TEQw((A]0~ϙ鮞3;3,.ꫪ1gBy7+ht䙊~p0b:vˍ vFJǴ.T\ʙ{]@*Iy8*XAйVK /-i48E빬ybZ|Z#љP0ء P\f0R &GYՈʆ%X!NbGPC޺a@iB!xiXC~;~~ą nͤ2ӰAo S6\B?`Dڎ&} 說H+(o`Ay\pKCJDAQOAt0Ϋ~;7[AQy `K"?{Z?L`n?bYX:}w= !qI,B-VG~%͋gyn;"F,$y4i6- :b1XIhGợդ/P0ۋ ,9cbpUɑu``y2 b#ԒlƇ4qȉ#oZȥ h]WS/}Y>PImLmm`)q{@ޢN773FtLn8aM%ŞO6宂m>SDA31;C4!rhZBօ*QfBk]JE{pJZ){ 45Ǭ4M5B Sŋ8GW@u[qF ޥBgVnIC-TǡTz 1j/)Mže]e[3ؓ/▶/~,#U)9Xi*#Ose 3frEU5F M=)| 0X N9p^Νr,b u%(خ5O4Fkk-W-,Ѣ,,]3+X2(gg"^P>}Òn'=nrFD6Q.2%?Ѻ4!Y|]D8&E-oTK%*_ )6tnRc7<k#ͫ i&"Ֆmт+oΠ,%ϵ~E-7_~X-{b5"^iY2&q[x>Gύ$,<0q}M0/JVbY~gE|tFj7JEQ($xc: 9endstream endobj 566 0 obj 1714 endobj 569 0 obj <> stream xZYoDP8H@1sfWPDA(H)BJsƾs]TNiYΙsA"6Loq湊?Umβ{߹<`Lp+2R13{gOG8(gVW ɭeC2Ni%UKȲEqJ$mWX!;;SQ[oui] {(5a^K=~F(-Z މ1w V/3hq (}!^CVetNRrcUkqBq¦}p[K \!7>/%?nQ:͕ʠ)7pIT. ~Qηx1_eOPKi8hj GQ:C4Msꜞ<z>&6q ѹ,FD V 9. l֢=qؚ rʝQq?NȪd Mro  z`Y ~ "@ T^5ؼ{~8 p· 2pi!2{6EZrzDp;!ѿ`8Eǔ .3XL&+ A (뇢t=h} ftABE]C!Yv; C dI54{I?Q "rP#{x k$DMDJ+ qO'yL[[K*\dTLV:|[wuMYXV>79/`ym_mDsԶ~I>ODO_ "Q|}Q:yL Lfcyo|ѩ;RwvK NƛO dn&AncA[:s }Ek 57gaE{9pHԱ_󸶐vYd]0A~'ɷ %?!K7t{+x)FHm &f>X^V (OC0Av!<8aӪyX7MjFlro]sǃV5y1iar:NES}umOkޭn~0 v> stream x[[E` G.(qR G a OjnjSFuxv|b |jQQq-dU툰NRL Rj Zi">j)]>jIPTW*Jt\fuV.e] m8%2u޷{ \Q%Pf%s|od|Q^zvߟUhmϯq0[ʝD)y[•U_owIj8:R;ZFߊT+'񄏼l2m?M@|OJk8n'f1EsX~_2dД PkVxykZď F05 U)]4A NfZs9& IvƘhtÝk7( yO:Gn!|FUH:7g<I皟 ~ 3&'}nu&iX1p)' lI0+HeSwR[骶phiE;a 7R%Uh3t΋}5t]FϯF (kՎ{#Fdޓ-;QQ|>Ό{ʩ*9u>;<ʬQ4Z3x?ƺsOŋMp,P5/ na>>{!AvMd1 &c4E위ӦO _Y˰1\MͿq愊 MD&Z}M"}D!" kizV1 (Nu[Uf:"` 1'+>O|/~3'-n0"= dЍ㌈> stream xZo5W\0=><_hʙo[V/6Y/|E|0~xz?N2LH܅æ5Lׯ4-g^KEnFQUHd,`wKMsN j zP=Fsੑ8Vl+c-G}hMQ,aɴ =vV2cxP6_ʝF c4$MHON7K0PEҪXkKqJ˸G20ut^cʹk O8#L?~PJm@E6h? ]Qy`'"(2Q6E+;rI Ìb3[ϼm*Z˲~ӝdLA6f:l#$ Mqkfd37FuN=O;-YEy!D<^@|\rt[#ӖdWzB&-P`azCϡz6"3(Tq]yE$Δ7$6=I-, .ȎCkƈl.$h7EF zLD' I-.u.w{-fV*y v A6dNcbb2gDFdh<"eT`698gDo\X~cL6, zlR,;ˎ" x!/W1]ZfyW^DL0+AJa"j`.cƧ}ڠ"w!oD3n\FWa0]C:5xU<#.2ՙ]W$vэv{: }wr xPx\0zN[/%JB[ i,B!q;-xCU$̤]_Mʢvۿ*`%/\zǠsKMItHneWy\ao#W\Tb>1)g ^*׿KƮN4wOP:܆HE#;话ƩiVT[_d}V Z',`_ؿ^?]\'PA`ZR `. a2]-*˯u,W>W;0Lw..W R\M4 u K'T;dyudWw3;U P[8CY>^?A+Am& }<2Aendstream endobj 578 0 obj 1616 endobj 581 0 obj <> stream xZݏ4A ڗJ|G C- +*q{Nvs۪|~3ٌ_?f/fyAǧg̛b3 (8IS`xͺ9VBtG>MƈΕ ɺF֎{riO.u\*Z9ۆYr$s8!};-n!$/7UQ5=De*#i JkN:u=ԀOtȝ<j*JmvNl6=Nq.0/X 'I* $jl{D:AaK&CN^ 0LoOݼqVg]YwҮ!1Km$",^:Q"0jSbι%ud/> stream xZE'M2 j֬G>hoJ0xbhBVD7+He~U>nwD):{< \6g{w}yt12dEp.gJHnEGVr\4{U"mz^D+?UbVs+}fݭICa]l&*nkv9=7VH<7Zw)+כlCv\Y"gY02:Rגv[bdN%oH׾v[fӬyvgA-R6ªHυOn֛~cF)䐛K\9$!-B}WkþΣb92p͐$sfȜvK)V/>4 zAY Ph fwZz9 IEo .'""}z)!9 iE0*^5iqi2aE=d 2EY"-$z iBRh_5/ܻc;e^JKAڠmTv#u5b8JB]0TaVOFLrWiVZ+E. K~42Λdq roYgE:*'냌ѣgWEJgG{Wuzd+ nX[>pVk&a= hkiVHWwZ$vRKSid{pEPA#bޝ♵7eҐ$ Ÿ*Q%(Fаkj?et%.hMsb "QKa4&AB_pv]_եd;&!|&ÉerOsrH^q27VWVuJN\Ty@^:m[|wfvZ%W抄 "GON1(ㄈB-C'"aIߙ>C~Q\(/= ӧ ҸXTJ>2yeyTxMx4u*=G?-!X>OQH}6ЃgWhy>#w'(Pw=ٲJ6\=fR!J8 $U"^ȯBӶsAd-Y&?%iFd?' F7o_㡙endstream endobj 586 0 obj 1600 endobj 4 0 obj <> /Contents 5 0 R >> endobj 12 0 obj <> /Contents 13 0 R >> endobj 17 0 obj <> /Contents 18 0 R >> endobj 21 0 obj <> /Contents 22 0 R >> endobj 26 0 obj <> /Contents 27 0 R >> endobj 31 0 obj <> /Contents 32 0 R >> endobj 35 0 obj <> /Contents 36 0 R >> endobj 39 0 obj <> /Contents 40 0 R >> endobj 43 0 obj <> /Contents 44 0 R >> endobj 49 0 obj <> /Contents 50 0 R >> endobj 54 0 obj <> /Contents 55 0 R >> endobj 58 0 obj <> /Contents 59 0 R >> endobj 62 0 obj <> /Contents 63 0 R >> endobj 68 0 obj <> /Contents 69 0 R >> endobj 72 0 obj <> /Contents 73 0 R >> endobj 76 0 obj <> /Contents 77 0 R >> endobj 80 0 obj <> /Contents 81 0 R >> endobj 85 0 obj <> /Contents 86 0 R >> endobj 89 0 obj <> /Contents 90 0 R >> endobj 93 0 obj <> /Contents 94 0 R >> endobj 97 0 obj <> /Contents 98 0 R >> endobj 102 0 obj <> /Contents 103 0 R >> endobj 107 0 obj <> /Contents 108 0 R >> endobj 111 0 obj <> /Contents 112 0 R >> endobj 115 0 obj <> /Contents 116 0 R >> endobj 119 0 obj <> /Contents 120 0 R >> endobj 123 0 obj <> /Contents 124 0 R >> endobj 127 0 obj <> /Contents 128 0 R >> endobj 131 0 obj <> /Contents 132 0 R >> endobj 135 0 obj <> /Contents 136 0 R >> endobj 139 0 obj <> /Contents 140 0 R >> endobj 143 0 obj <> /Contents 144 0 R >> endobj 147 0 obj <> /Contents 148 0 R >> endobj 151 0 obj <> /Contents 152 0 R >> endobj 155 0 obj <> /Contents 156 0 R >> endobj 159 0 obj <> /Contents 160 0 R >> endobj 163 0 obj <> /Contents 164 0 R >> endobj 167 0 obj <> /Contents 168 0 R >> endobj 171 0 obj <> /Contents 172 0 R >> endobj 175 0 obj <> /Contents 176 0 R >> endobj 179 0 obj <> /Contents 180 0 R >> endobj 183 0 obj <> /Contents 184 0 R >> endobj 187 0 obj <> /Contents 188 0 R >> endobj 191 0 obj <> /Contents 192 0 R >> endobj 195 0 obj <> /Contents 196 0 R >> endobj 199 0 obj <> /Contents 200 0 R >> endobj 203 0 obj <> /Contents 204 0 R >> endobj 207 0 obj <> /Contents 208 0 R >> endobj 211 0 obj <> /Contents 212 0 R >> endobj 216 0 obj <> /Contents 217 0 R >> endobj 220 0 obj <> /Contents 221 0 R >> endobj 224 0 obj <> /Contents 225 0 R >> endobj 230 0 obj <> /Contents 231 0 R >> endobj 234 0 obj <> /Contents 235 0 R >> endobj 238 0 obj <> /Contents 239 0 R >> endobj 242 0 obj <> /Contents 243 0 R >> endobj 246 0 obj <> /Contents 247 0 R >> endobj 250 0 obj <> /Contents 251 0 R >> endobj 254 0 obj <> /Contents 255 0 R >> endobj 258 0 obj <> /Contents 259 0 R >> endobj 262 0 obj <> /Contents 263 0 R >> endobj 268 0 obj <> /Contents 269 0 R >> endobj 272 0 obj <> /Contents 273 0 R >> endobj 276 0 obj <> /Contents 277 0 R >> endobj 282 0 obj <> /Contents 283 0 R >> endobj 290 0 obj <> /Contents 291 0 R >> endobj 296 0 obj <> /Contents 297 0 R >> endobj 300 0 obj <> /Contents 301 0 R >> endobj 304 0 obj <> /Contents 305 0 R >> endobj 308 0 obj <> /Contents 309 0 R >> endobj 312 0 obj <> /Contents 313 0 R >> endobj 316 0 obj <> /Contents 317 0 R >> endobj 320 0 obj <> /Contents 321 0 R >> endobj 324 0 obj <> /Contents 325 0 R >> endobj 328 0 obj <> /Contents 329 0 R >> endobj 332 0 obj <> /Contents 333 0 R >> endobj 336 0 obj <> /Contents 337 0 R >> endobj 340 0 obj <> /Contents 341 0 R >> endobj 344 0 obj <> /Contents 345 0 R >> endobj 348 0 obj <> /Contents 349 0 R >> endobj 352 0 obj <> /Contents 353 0 R >> endobj 356 0 obj <> /Contents 357 0 R >> endobj 360 0 obj <> /Contents 361 0 R >> endobj 364 0 obj <> /Contents 365 0 R >> endobj 368 0 obj <> /Contents 369 0 R >> endobj 372 0 obj <> /Contents 373 0 R >> endobj 376 0 obj <> /Contents 377 0 R >> endobj 380 0 obj <> /Contents 381 0 R >> endobj 384 0 obj <> /Contents 385 0 R >> endobj 388 0 obj <> /Contents 389 0 R >> endobj 392 0 obj <> /Contents 393 0 R >> endobj 396 0 obj <> /Contents 397 0 R >> endobj 400 0 obj <> /Contents 401 0 R >> endobj 404 0 obj <> /Contents 405 0 R >> endobj 408 0 obj <> /Contents 409 0 R >> endobj 412 0 obj <> /Contents 413 0 R >> endobj 416 0 obj <> /Contents 417 0 R >> endobj 420 0 obj <> /Contents 421 0 R >> endobj 424 0 obj <> /Contents 425 0 R >> endobj 428 0 obj <> /Contents 429 0 R >> endobj 432 0 obj <> /Contents 433 0 R >> endobj 436 0 obj <> /Contents 437 0 R >> endobj 440 0 obj <> /Contents 441 0 R >> endobj 444 0 obj <> /Contents 445 0 R >> endobj 448 0 obj <> /Contents 449 0 R >> endobj 452 0 obj <> /Contents 453 0 R >> endobj 456 0 obj <> /Contents 457 0 R >> endobj 460 0 obj <> /Contents 461 0 R >> endobj 464 0 obj <> /Contents 465 0 R >> endobj 468 0 obj <> /Contents 469 0 R >> endobj 472 0 obj <> /Contents 473 0 R >> endobj 476 0 obj <> /Contents 477 0 R >> endobj 480 0 obj <> /Contents 481 0 R >> endobj 484 0 obj <> /Contents 485 0 R >> endobj 488 0 obj <> /Contents 489 0 R >> endobj 492 0 obj <> /Contents 493 0 R >> endobj 496 0 obj <> /Contents 497 0 R >> endobj 500 0 obj <> /Contents 501 0 R >> endobj 504 0 obj <> /Contents 505 0 R >> endobj 508 0 obj <> /Contents 509 0 R >> endobj 512 0 obj <> /Contents 513 0 R >> endobj 516 0 obj <> /Contents 517 0 R >> endobj 520 0 obj <> /Contents 521 0 R >> endobj 524 0 obj <> /Contents 525 0 R >> endobj 528 0 obj <> /Contents 529 0 R >> endobj 532 0 obj <> /Contents 533 0 R >> endobj 536 0 obj <> /Contents 537 0 R >> endobj 540 0 obj <> /Contents 541 0 R >> endobj 544 0 obj <> /Contents 545 0 R >> endobj 548 0 obj <> /Contents 549 0 R >> endobj 552 0 obj <> /Contents 553 0 R >> endobj 556 0 obj <> /Contents 557 0 R >> endobj 560 0 obj <> /Contents 561 0 R >> endobj 564 0 obj <> /Contents 565 0 R >> endobj 568 0 obj <> /Contents 569 0 R >> endobj 572 0 obj <> /Contents 573 0 R >> endobj 576 0 obj <> /Contents 577 0 R >> endobj 580 0 obj <> /Contents 581 0 R >> endobj 584 0 obj <> /Contents 585 0 R >> endobj 3 0 obj << /Type /Pages /Kids [ 4 0 R 12 0 R 17 0 R 21 0 R 26 0 R 31 0 R 35 0 R 39 0 R 43 0 R 49 0 R 54 0 R 58 0 R 62 0 R 68 0 R 72 0 R 76 0 R 80 0 R 85 0 R 89 0 R 93 0 R 97 0 R 102 0 R 107 0 R 111 0 R 115 0 R 119 0 R 123 0 R 127 0 R 131 0 R 135 0 R 139 0 R 143 0 R 147 0 R 151 0 R 155 0 R 159 0 R 163 0 R 167 0 R 171 0 R 175 0 R 179 0 R 183 0 R 187 0 R 191 0 R 195 0 R 199 0 R 203 0 R 207 0 R 211 0 R 216 0 R 220 0 R 224 0 R 230 0 R 234 0 R 238 0 R 242 0 R 246 0 R 250 0 R 254 0 R 258 0 R 262 0 R 268 0 R 272 0 R 276 0 R 282 0 R 290 0 R 296 0 R 300 0 R 304 0 R 308 0 R 312 0 R 316 0 R 320 0 R 324 0 R 328 0 R 332 0 R 336 0 R 340 0 R 344 0 R 348 0 R 352 0 R 356 0 R 360 0 R 364 0 R 368 0 R 372 0 R 376 0 R 380 0 R 384 0 R 388 0 R 392 0 R 396 0 R 400 0 R 404 0 R 408 0 R 412 0 R 416 0 R 420 0 R 424 0 R 428 0 R 432 0 R 436 0 R 440 0 R 444 0 R 448 0 R 452 0 R 456 0 R 460 0 R 464 0 R 468 0 R 472 0 R 476 0 R 480 0 R 484 0 R 488 0 R 492 0 R 496 0 R 500 0 R 504 0 R 508 0 R 512 0 R 516 0 R 520 0 R 524 0 R 528 0 R 532 0 R 536 0 R 540 0 R 544 0 R 548 0 R 552 0 R 556 0 R 560 0 R 564 0 R 568 0 R 572 0 R 576 0 R 580 0 R 584 0 R ] /Count 139 /Rotate 0>> endobj 1 0 obj <> endobj 11 0 obj <> endobj 16 0 obj <> endobj 20 0 obj <> endobj 25 0 obj <> endobj 30 0 obj <> endobj 34 0 obj <> endobj 38 0 obj <> endobj 42 0 obj <> endobj 48 0 obj <> endobj 53 0 obj <> endobj 57 0 obj <> endobj 61 0 obj <> endobj 66 0 obj <> endobj 65 0 obj <>stream AdobedC  $, !$4.763.22:ASF:=N>22HbINVX]^]8EfmeZlS[]YC**Y;2;YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY,!" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?-t>Qy>|+\ x?:G?ԿKbY*(aE03IҬmӏҫ[r 3D2NHּ$t*L%b1ԁO{L+MhnҚg2127gmN˜E zǽpІL2_8_ҷW?ح9‹,<9sq-z\C$k \dsDx^;T{}%mݶ(’3:*䣊W5-%'?_׵C)C 6@wLnlڀZXxvKZYS>\Q38Ud>yj)rpdyYgo<""&7f^qq+9im9o|o nxӿr;p= ]0H@mEpGN*YڭZdp0HРRL9s/[o*m0K4c,zI fDwQy}t>k\Zj$CpjNC2E^Tч-Xe(Š(((((((((((((((((((((((((((((((((((((( m7~_m^oKAZT%0DdA)Xd\u$$M>gK0 c$`c{GKqo4!#;]$} D[(,jqp~"r}u(y;c~;MTWĒOI#<Ip6KSQۃ*8)veC6!ڠIHKS,MgBR29`{ ʰ|>2!1!'#+*B7vmeK5u?^i֛=>gMAE%PXcQ%:|қY&۶<X!Hi ` ?*X6;7z~ǫE,s)hI8%XTbАָ ^v˥!a0GNYceI30v{pQE0 kn4 BA%I̼f b[yUf<8FOGǷPBnFcH9z4qjN@|>Y@ mYJO Ń$+LGM r2AG&X6awp{0Lj(Š(((((((((((((((((((((((((((((((((((((( ]7~_m_˫IlH "Rh\ʅ5oUkeV$u8<Rbh,i4/)"a2*ҬL,qryz֘r*+qq߽GyZRXnȁHn1z.̖" nbl!Gj$6n.+TT$̜rsIzQ,#[O1r!yBZB'hD )}0I,ÚNq$r@mp$HMNL}9-YE9z1<:k['9s57sN@ǧ~.̖úU5&5?XҬ( `rxL(8lT#Umz-yͨ dG٢f?RlX/Y e#Ctg#pI`dA't=D$m`$~μӯq+ FVPHhYatI[s:al,@]:L1uW Y =)M:$۸)^AϿf7Q4Nq5K.ݥ*H$Ɵ6Oa ma`$YC@烂TZJ.Ճ zևvASGvASEź*vA_Z? t-HpzT:кd0[渃$uXDCXbB}`00(-KwQEQEQEQEQEM$,f\A+? ³IepwT#,iOp O1F˿'Zߢ!n9a~28ddqZ }[ Uz ($wz@((KQ,W*&6 Yn!ka5bv㑒q(Vb9<"RpI=}3z@Q@Q@gI>w,'+BNF ;ҭ]ۋ .FC4_Zl"o##קanhUbQIA+>M)TC%p㷞GXOhC> @0C =(jvѢ9.i$R7R2(dR0A'q1vb y@̨}Ib{5qU'{+;@ -L7\t##pjRӴ4XEFp0_h'U^y-mg)#¯Vv"^,q3mRUsB۶݇.:T768TV%*̀k++>J=9.erv rz0bPsE+:*;!X4g4VU>l'VQEQEQEQEQEQEQEQEQEQEQEQEQEQESY! %o]AکɥO4IQؘ˷ s{(F]2x˂/<9;]G|b\ F l*ƨ>l rF@H'tP7o(yA4Ϝ0#:[0V/ӵj@oq}Uڲgh;XL=tk6JBXnH$\f Ri|;7n1ed3Y B"IWvN잸ǜs'RZC:!VfBFd`Fx fr7A@"X 0@HrW,g<>ۚ *y9ǥoyqp~ܪd@ntzGgwn BmϽE}mI$A&>FV'q3Zh`$BW|Ï|;7n1bME* g.=_޴t#cX1M9VnU2 f7rhDK"{}hZ*/>N7nփ4[L ܚM,Jqχf56ۆ3 hnU2 f7rhDK"{}hZ*/>N7nփ4[L ܚM,JqMp9(*&%4-]?4O Fa*^pT&xB+P+t;Ҕ}Dg :[n?s֝cS4̩Àf|J3Xʁ[0~5]?4O Fa*^pT&xB+P+t;ҝy{s@QP(%BZ@,aOBX_!:eE˨v\)5gk//jٞT :aq]e?p 'SSa %BHae@?J͏ʚ'0 S`}hj*b8 _jU-xMʟ튏1dܶ Quaڬ@%pnD0`yIRc^o"1FG?Zu۟O\?sn?sᝫ!\?w#U5<`fsE0qv>O>u۟O\L/l9wږDBrB뚩0qv>YLqIybpF'=0BQTąW0>]岤̇ 1U%YܹA4qf@YW?P c 2g6&N䅞2 2>ޟ}?̟:~12B b}Aeo"_?|MzWBvdX[>?8nss`y'}%][0BF߳9m⦂[[ dC% ?tc7]dϽxeY$y*$r? !DHA$*с\ 0p*g#+0ViY`bAHvdX[>?۱h;c?sn?swO j*7ٜq888 2G^C,WLfNRI96VO>u۟O\?sn?s*acldQlF>`'vx~128nsp 5 $nۆ #(Q`kOf58+0'_Cۿ^vafH` P!(bBmJRyʦcEVQa[`h1@UTUJEsp¿Yb 2u !E ?ZEX1@UTUJv|3 gU,! UbkuFփ%LHUz T4H`; Z*@M@GV?ZKj b20>vm&CM2+єÆi@,LrD! 8 ޯ*c W-l0zz,0meXʫUYZd\0t` A`}*;p%8h? TȁH5 9Y(((((((((((((((( |>-m=8ʦسN}?̟Ƀ]P["ٹ)aTqf@YW?P8ns|6onc2kp sI JC-X5]lSp I# ‘111Npăǽ7캄H`y-! Y$`<=H7cY"Fi B$IOj സT(EU@XAI[s#  FY H~Iz8nsx fTyIhQ 3=X~~%m8#iFb@$nmĜqHmF%;Y4`b˹$IR?K,sGn:!IdI$灓"̰F| O,I#9?N9$ObeA/ҐWjd[whc7]dϽk&xC +Hڡ:$~z~12l"mh3jШן5d8!su7:Z*3#]oVV,Li8xH{fwJWHݑ'׵b F!WιI &-FrqSx#xԲ$ЖmT1Fr8 ZԌd1jdr)#r@ݎFIAcJs[ѕ $ޤЃ=i_As+F ۳@2G=8:QB@fLsdu@B].yL`X2H $`9zfK噧 9q=*zڝȷH*@*H$q[O#)%( o!uW7o!uP{j 35h^(e88r, Uqm,7mp)hUv8-%'V`^__dIV92pH8c4jz]J`Uv?sҵl-:]6"O{A +엿p>{A ;y'qy+3M{ki&@/ UsZ7A#mC3hQ@UOhCLhzPZyd/`g}(zŅ}͏c\[M$H’I#I=2}?̟:~12(n9bB?ܒH"l$!'}'8nss`y'}H"l$!'}(n9bB?ܒ~}?̟ԓ C 3v8 XE ,HB;O\eٕRO$I xlhgF}gk̀6OS~ n3#u>VTwH`_NӀ gz~128nsx2+@ϾܒH"l$!'}'8nsv]8TPA* N=!(n9bB?ܒH"l$!'}%UX[[(E@ p{P\*Ea7S`!I?sў8ݚ6 #JNs@TS+<֍gi5ʧ@Tun@Z?*.,'?/O>u۟O\5K).NH9=A"Xw$`y'}Ο}?̟A"Xw$+@rIp ~128nsx+@rIpA"Xw$K&&E ۛѸg-Q ?k:"mȴVwJzA-Q ?hS5ruMwChzlјEtn GztT}o*Ӣ>7?nʀ4ϷMGۦgB??tZޮ 9+PT)t8,Xnʀ4ϷMGۦg :+3QNo*YZr c ``c"7t^2G?ӿ/f'eK =џր,QEQEQEQEQEQEQEQEQEQEQEQEQEQEs>i5Ɲg4$H(?ѿ2?€4Goi G#74O 3*bφ>ک_j)tMn`Cr ALsPiV7Q/vCbTzEGR( ;uJ RXÒcRp `x #,z<͠`wr 3dp} \FN:3=Ff+' x#<rCڀ$z_v=*P@QY7]đB݂Fp[ڀ'}[\/M2XhYgSʒ91ןc[^;(D08$q3Ef!\"^ܠd KF0pqx4Oc}2!2v#2b9'{d#ivmvf $rO~ S@`n"( F^ T^-Kʒ[cBOSV(W|B9d2Ȭ??? J;y'qy(z( &l$ ၃j"#Zv!sjꮥXSE[7(ހVךFjX4hk $y `\inf3"2 : PD  WOb~%Ӥ{xF@P|O[ԕkFad;ڀ ]>DMtTzDطEGAjm?ӯZb*7(ހ Ƀc(Ƀc*vhH eD^qNhZd1H!*A#U[EGm`ܢ0cGzѣDkXY#c.zv UF]2 dg%Է$)*yȋ?`׭1lm5#r ?/??/?§kFad;کkZG2ZJT_Tp1׽MQU?ţWxq|OSFz+Mm4F<0Bj&K"_eD^qNichFlt@Cƹ!}jpi*ıqcv~m4F<0BjQU@.r%Q@Q@Q@Q@E<L ?@2jZ~ʺ}2y"bS80xhEyE>A.O\~1m12qP](yUJo/g=Tj+Pȟ?px=)فc#'( qsArQOq g^M7c;8<&,GkQpۺp?sOnlŴpߗ/FO"P 5"xCo/cs ;ĭ"9RqhyE>A.O\~1m12qVh9D($1iyE>A.O\~fnlŴpߗI.TZԓf1cp|( (2//(y1@11=_#;8Q4J8v8_1 s#I9#cF.J),I#9}?RL7v]h@3gQ@Q@KlWoPֿHɕMݱg W{yT?D=$$ F8#}- H%bJ" ijN0.OwJwOP8,<UĐFF&BEFr P;l8O>УX@Il"ɒd$n~|??GOP61\פօFHP-αuelZ2Frɼ esב@h((((((][UNHLj-dI^-B?7)f} ā m7ui:*4έԓ#99aMd%Ff țJv`gzxl/n&dy%|I81!88}\ymq`FA=O㚑-`E$(L`(r0q( ( ( ( ( ( ( ( ( ( ( ( (3-?wj19y#ZZ'S4.@Fn7 }umJA]!PkAGxٔ3FrS~=qD%Ӻ ,8El8#1lkMJ*)bܫWŞ <`j}6Xx ah#x;Q?\ʀ2-Vv[f|C9B奺SoHƱLvc121f#1hvs;OahxLI; N}eG=%ʁFW'r sTO-\2[(((yc8muWPTm>J#1>898@03*=Ŷ.''*Z楁uA$DN]ԑO hzbh2wd,#Pm2mϨd}|j؂!D =>-sBͲ9 o~!fGo?@ 6 62>}~?Ldsy?t4W@?YVahMB]Ͼ-6Qy &dI:/Q:/U([C\qN~IĜc?^J_kI29 5ZvHI!!Am Y@˖rP4!?xyw4|>OY2]IΎȾg`B0r=h]Vl,#\*)@r? oz~r5w',F6&m_37[^C*nh~axson ٘r?1ׄtӡn|4ňsKcPU۠qpR!?xyw5f|y_)| Zbtcbm88?*YmбN9o+/:>OS@VKn6qJ\BXߧ՚( |G1i%э@W8TPf"B78松vEGbU#݇[P4>KAhDRFcL:T5y%f)㚚CZkN"$1BREUT|0ݵqԷvVѬwPG2+n 1L.&Xsz@OG@V>`i?i@OG@V>ʒGanX Ң ( ?FVfj艨N((_Y7z*Au8~=VsnD@-z{TO#3JYj_ڭ[nVlbeœ֢ympq2῕dܬZF2 b'נ + =#goZ7h/Qjܨb7n\=qk+=#goZ7iFk=#Օw:XBa#ˑ3`A {0 .@S{3~zvDU$NI''$ԪT*Ed(K(HD!8mX?P*Pj?7@V{FnX_A֣=#EaXumy8p&m68r ({˖Sԃ^FαDyQMt4V{FnX_A֣=#EagoZPj$-9y%,ǩ8@4Q\ݬ3^}Y/*HB=A֠ + =#goZ7h/Qjݢ9a52\H[dEOEI$zgdh=p@iQO?BhNA֠ + =#goZ7h/Qjݢ7Ij[kvhVerxUX@Xnls)Gm +mE'I譮5e}AJZn;Sy0!%%4UȈ}W?N=HPPp#AQ@}ЕFb}p0rqޭU[UYQ@k XUx>je=za,uUW[yKހ-t\c7\vtB#pA9_Zqqq&}4>NȎ ve,3[sn[xexs܁ۊnGO>u˰M²lT$F̪AvϾO>u:~.1?qqq&}5ic|cзkn\1= F:3<"Zym8:ԓf1cp|( ( ~O Nnڸsj@Q@Q@Q@V|Νm35ȇ <PBo?if7~7'ج=ovɨi_f1\\gIn>zd?[b'ؠ :su >d\g''sY^&][d1}O4k|u8n.G裢aɠ i.m=%'F?SPib[gk4u1ĚՂh!Iu7QY7z(m6LvV1O&$ v=*VsnD@-z{Psiz}"ki9ħ˳\1;A8/v+Q#q[jO֔CyҼr]#*'hR[3I +2%(I2"`@8SG$$PZ;sڀ4M 7‹ ?oW!nٹ0n#Uď޾rC=yUmI*XbjvOb'/U/Z??@ >_c@z/X]n%$ '_Î k15ƛu (f'E$s W7q@'XFr@Ϩ;i n"?X H>W{@@VU֖ng@!j '꼁xUWv1H 0ː[#@}nXëoePq'vX+[ j٣i J҅矮h1K^lWXNrz5O^MT.E EkUM:-Qۋ6f+\[m,b&r|$}~+7Y{m2TpEeI*E؀#;A\UmբRI ClaX ù@VVwv;Ԇ \aX* N8sr+vV`P w#4jkᙏ`"I>vn|r133'g l<(5{pc6z;vԚn\lu1NVj 9Z(o&a}VE{ v*`2@zY=,o>7<`pvcI ?0Wy@ޥZ܄UĝI?UANğUt6rg 9㡦4zZƒ1@\9tiӁq'@O*_ih0w7LS=-yDp3<:4iiӁq']Gi#:ٴy_;zg}(|`4{\ITĐDĻQF8O&=-yDp3vs,>8w1\z{Sc):#=3IbкJei{P( (+ݬZʖ(Dn@![wI_desSUk4N8ϷAWJFo.;C#7zn]V{Ƿs&Bcwg#ں%ɞe|y y?TZ=o%i2ɋ @{v@Q@fev,wml9Z%|⧠(((?T%nV~j QEQEQEQEW ÎM_.֬mo!6fD(6#qzPV`m#?Y@˖rP0_a\ݾsF)6fqǺXHbOcVn,m.Ts`hR,'航#S{{l1g֙w~^]4DMSr=(V?k-P*  }9@(k-Q?\9"q_U{@[z,hpN%%V\FA4XZOѭ[ڛ?>#]L +egfpzJӢ%I+ dn))ۍ@9@VG*Q Edn7ۍ@9@uO^MdZǬ?/^K)M.ZH- 4uU@<p*'}[gPX -m(IlDBʬ@ :+:Ft&JɤʋN{X]1$%hYvZ R*70A2*  r?E.q Dh}7l@5Sf+BQ &FƥBOikx#wŊcE' /3Οyn=џ5=V.nXh 4QEQEQEQEQEQEQEQEQEQEbyiC~΅?3Z=?so_g@Ӣ 0~fbnD,a@lPǹ`y2_ZY}td(Ϲı GڞLqEWtԽb=;x3*ϚO++YIX+)m IR#@ cޕ]SHnۘdkb*̪n>nڸsjUfev,wml9Z(((?T%nV~j QEQEQEQErW`kTor3WkVG~BI$8Yj6jw7`J۪nmȐ(Rp[OjUdL,2#@(.xf~_ҐߔO,a8#黏/nQոVR%1wqR*4'?sG}xm '}7qq[5H/,Tw@a-GnVڭ3Bs?t~_HRP'0h4+EW]V[5H/,TwUf[o3:_6(J:M^G<9k{9&R=u%w,y?VpGhjƈB`aR~Sd6L~c9b zu-P!A,@g:}BƠ dyV;rfϨ,ˊW1"n07sPokF?u(Ab>#r0B͸ RP'0in|"X9SOwAoY[%tRdqbHVUhN~) ]Jy>ZTbLgq?]~Tx| ~7?Y '}7qq[5H/,Tw@(ʷx| ~7?!K)@0XpGw TUr>j,^X'뻏ʑV9?/ 4UR~R<`c5(&{dH$t[ ?p7J wıYɥ@Ǧ§]}@? _exI| ?vk ^P3yڨz|ŏI*{w m-̩}<\ gM2f?tvxYvPV*fBM Öcۏ?:^OGI~fjren?ںm%`2[@_'ϻb&ƻqsY~(dp(?EFvU \F$ 5KP<6[ ?|(g5#+]\Z2 ֖ˁ"!+vh+(<`'RVJ&1f2823Bs?t~_HRP'0h\ϚK*c;UhN~(eR^` '?;Ze˲!s(&IV"QxƮEKx(Dr;Y 5n$Ӝ֧DImV9?/:خ䉯-!h^n.@io|S [[(?>⦁fS!Q&ʀv:(i8[=ܖbYeDVQ(SmBn-o$?Ab򻯖wv?JEUUO c1 I Z7?Z 7H??3Ns%Y(YR+O$csR I Zw_,?~Q,49PB'==Q@Q@ltPf v{/F l?6t :(pгGj:U3 JpyR $}}#ځ;~q}n+<*"iw 93 8]o8% p9ަ+=j|u,ToByڭPEPEPEPXv+?5O?P([I#FXSpF3@ՠd@#l@RI 8#8ϡm$a2$O#hˇY<ɌF1xr9Z*0f qebNsssV^ lqq$shĺH34UUXryJяڟk[<t'' tSDdhꡈ$T䴄mce &tԀN d]Y\e,ц#iAV]Ξz.0ʐH#A1u ct8e.q">l ? ,-Ɓ\_)~˪oi֍m>N?/ր?ڂ~1WuyOt3֗]$LjՇm:wd}U N"=Z'a5XciFGA)?no_#Y?__ OIz+Pʇ5/Cנ캷OΓZڴd?go:yq!UbMC$ ?bMC$ Ӣ?-AهX@EfjMI?(? ރԐHhNvFFz4ON~l?߻#! J+3~O?IM/6ۻ@V_ٵVڜ+\qGu}f g J+/!e'gaX]n$|LhBYcwK" bR[ҢmZY\M4@W'qWc8lhdGJhՕwz`L֥U&{u?Vtld/µ( ?j> q?jsks!~EPHӭt6ѷ%8_\6uzD?Eʀ.Y73Ǟ;9q|}R>/OZ3,hK,pd4^?نn,a]?4{HQȒጬlh^Zスz _8P]Ոk29m>~?@*<KݟnzUtVk('U :N!˗#8lRh% m g9 tUI"Z62L6mny}K i͗ޜ.}=? ,*1΢YB26Kp3*&|  3EYZ^5_!0r{zlt #y>Q@ӦEM0p`sӓ@lM;ywK'?IUL](H~CHdِxp3Y?3 p@#M%*o!4KS1ߨ9t`09z椬-ecKbp{?ߡ=pI4ETreLoO<=j@ 9q֨MiP<He,y5}* FK v#Pf8C4g(UK  5ZL̅ˆ|Y$D @(QE SqF[uj@bmlu9l@((=V-O:۠}Ҩ*p21g_ M)i#r1z_C1sBA>)>o4SFw.B+ѱ9#5`)(G,meѩu46 ڣZ0=1=;V*70=@^Ǔ۱"9ﬧt-.awfɓAUm#G#.@#ժfev,wml9Z%|⧠(((?T%nV~j LDIp!,9˖k:Ԣ2Ɛ˻ZM|k;k4kP'c@PEPEP]5I٥^5D:O֯n_ lϿLSgYmDݰN&v2= r吱?8|dc+WPH:Mez?O4$`;m}Gqy#R-\ 76{ߞjO/_E_ܾ 96[|a @#H?VG?2<ɸ+ETpN3Oez?II#:CYd@XvVm2hcIw: <3Aoz?OY8)$ me12p )0+AhIܿH%涨m{3c6՚hCv7`U@QET:3Tb{o٨D=qeov( +qne2zRԲ`6 1 :/)V?’@ 7 3ɩ-w!&N943y͍ZǮk& ^h#m@u 3g6j _P~׬ϵ"aU{jys0 wrPA$p9 k?GV`}Jv ;Bl*F:DjU..Oa zX(^>}!+;32,:S6Ե&֞Td+P[uRyQZHFBDz?5]UY$D@zsJӪȿ7ƃgynfc|T4{Z((+>HHhf#^Ix{օT6^̌G$==2nM%y2񁒥r$\zȪ CLp89 >*ѩLm##"J(eYMݱg W{yV̢2e9c$cִh 27zX27z@Q@Q@Q@Q@Q@~}sg*]ԿOխ5W._'hB@ <z2Jt /2p2>5F BZO11*XFA?Nr7h4hK#4j4ĂJ0n=99̿eL ~Ui *7C :dPKI7|wYXr9#qZ! vm!=bjC OoKTB!%ArNTnAu2kKe *ʥ@ O\݇~tV(_1nsg8UZg{yz5f ( (sAcn#%FI*v enB7Rmq-?Aֿ?ar 3DԒ bQEgoo~#Ua  JƒSLX d]u$*QawsդY6GQnߢ0?t BۺGl?!?Ʒ #GA[O񫗟?ܛ-iA[OwH'ז vVbp;pMtQ@Q@Q@Q@Q@Q@/6|Vwߦ*]ԿO|}:XTWԫ+  UA҄NFnSҹ忲?/忲?/52o]|!d5u $~4a]%svP{@ö~U[/,@||yڭPEPEP[88QZ$"CMrjVӞ,B q,5Oq@h弩?&*O7k9o*O7h~F(~F*O7k9o*O7jKh1qhc|T4{ZddP#؛[N[#P( ( ( ( (*.&XszPKlWoO@Q@1cR@Q鬪U "\h\h,?*>Oʀ=V,RPf ,%bV`IVMjB\PG$4kϋ>/_&?-LZO>/<)|y1qh<(cŠϋɏH`TiI"` ߊ}Zrt{V49f OSɭⅴ$a=_#(;<.a\c;=󑊅mm&\!C99H?H?W-Y@L*0pʑ,*Ԇ5H?H??PyAna_,ر8#Ҥ [ >sqZdy-dy-e"?",Fۏ\*F}gؔŮ-$e28[#AZ>OΏA=S%%PTT?:>Z>Z>OΏA=S%%PTT?:>Z>Z>OΏA=S%yOΏA=Sy+?3@.!:DwZT?:̻oNQIsZ}꟝;hQy+?3@}(D??TbC4}yh{G} >حbC4'!BC=G+?3GحIУhQy+?3@}(D??TbC4}yh{G} >حbC4|9sV>Wȃ~O1ݓTbC4< 2AhUԿbC4}y_gף2) Ǐgף2'-<Ə[?xG}?z>ϧ/R}yhǏcڭUYEݰd[?wxV(((;? [a}(Q@Q@Q@Q@ >#!tU,L_ 4 I؟(F(((((((((c;AP2m+|@h3}9m=McfVoq\Y=z`y6ZCg%:u H4ǂkJUM/?\kh\+O UQy61+78.qƀ,Uyrt0 h_dA~szEV7qYq!s~4<Əl^|~?XEO|8p yQEQEQEAߵϗӏyXێ뚳@Q@Q@Q@Q@Q@l?sjU`9FwGǯVh((=1PX62Yk o{PV 1:P5U^oA/Ozޮn[i3,"AT@?wk2x'6E*L1P@bN3IE^zJc`㜚oofKxYaF- A rL1s~Upp<2bW#9#9},B.?994rT,b_cs@-qDv07X<’QR0T'泎d1v/9ɠJc`㜚n\1= FNd1v/9ɬ1JVRrp$8=?/z>.T&ST3<""Lfs sP( ( ( ( ( ӊ̪n>nڸsj@Q@Q@Q@a_g@Jܬ;? @h NM=5^qg$a-F [ьhC6@!U*<8U .ݯ$g,$9EP/6fD(6#qzW76fH]K&+?5iEQEQEQEQEQEQEQEQEZ2#mpH5GVO65ݜ [7cлIctj98SHXE9 gt6"qwxF7>f`Oqcm|G$%>|0=€=rHDZLt;S3ʖC &ҭ-h(.䃁{P_̣H|($.N3s8\/?8ml ڈ۶*NIpjq)C9;(. G EK+ǎ@nMP.;#$q.eے Om aj:'sHl- h{F}~^>!UY3i!hGgU1# "TkjOݟ%c9A=,;Pxi8<_ 0띫&I#g.b9~z1c6ݶ@9uTs yc Ɍ&@IҡҬY$3K1Ԓ8\455 6 (* 0/1ďe?OUb(Min 4QEQEQEVܿyYߟ~5~>_N>§((((( ?;m9qX^XEu9ǵZ((pq֢HDtsg98dT.#h;#oEUw`I޾iK]6>^JՑV#` j'5Ѓs01D#a)~f$8 락}'4yRq#]kszFߧJ Ϙ'6缩?ߑʓw`I޾iK]6>^J?ߑʓAvF?3Mw`I޾h4V0gc|T4{)kszFߧK06Ix=Q@Q@Q@Q@Q@fev,wml9Z%|⧠(((?T%nV~j ϱ[c``pyn5k=x@!8 a9nX<DZ'$qH9;pH ZkGU Ն@F!b;$dVϠu"7Z4j "9+矔=\$2\%2烑'4bH;b$)##뜎EP/6fh<Ӥ'q'bgJlCtP$mG- :( ( ( ( ( ( ( ( (+ހW1:G~* #덣1@ads #ע?4iȥ*I20o\iE @WeN;[hd;D*y* Q\Ȳщ 4$Gx\LsӑOӴDŹ 21A# GE`cXiVYVDR˸Hxy'Oh(Gu$#%GbTaŤ^ch((( SC;ϙcn;gjVܿyYߟ~4QEQEQEQEQEZg{yz5f b ( ( ( ( ( ( ( ( ( ( ( ( ( (*̪n>nڸsjUfev,wml9Z(((?T%nV~j QEFE&wčAFG⑭mعh"&Lo%ݎ{ԴPB[rrA@@TQ@Q@ >#!tU,L_ 4 I؟(F(((((((((.c&ڸN8*=j6Z~:A+VA(jS~V\ʤ-u<qRV}Ռޭ+.0 ݓA#h[NgEF!p#9p8AK}*;xeEYA cqJcK bbb]0zOc9NiW|n#d9;p10 WENVYF RCqh9ZBW2Ŏ2K1$qV 麅ż[Ag :NIw z$.˳$جmNG\(L RA+f5o ׼t,{^Wa3+jt[Uk,S`[*W;&1*>@0b(((?{q=Vڟ|+q=sVh((((( >QbcsqV1@hjQEQEQEQEQEQEQEQEQEQEQEQEQEQEA/ų_Ϳ=UT|0ݵqj ( (b𣩠 (?ɣB4n?T%hh[|&-dX/kzvϷ *E>hj*E>hj*E>hj*E>hҿ3]"m jc8+H,PAw."ePzup4*8poJQ0+>"۔9RNW۟Ω},bUg;`ezH"_ʏ-?go>Y6̤1Ƿ#!%Gi*O J,-?Zq*<'yr dvHr :CO/G_ʳV[D9 0a#*9A4ߴXʟj dǩ 4YO/T{I]giv|LuS 8Degi?_ʏ-?Bl!01#Ϟ_E4>c(_-?Zq*Y#d'96pN?MO/UEs#bYgӽ\yiS !eb| cLO*+ #덣1@ O/OO/OO/OO/OO/OO/O,=LЪ1Qی{U8q#`r@yiSyiSyiS \_oy_soZw/6|Vwߦ*3O/G_ʟE3O/G_ʟE3O/G_ʟE3O/G_ʟE3O/G_ʟEUPВЪ1bzZq*8pڭUYEݰd[?wxV(((;? [a}(Q@Q@Q@Q@ >#!tU,L_ 4 I؟(yQbqVjg 1Qؠ QEQEQEAߵϗӏyXێ뚳@F7wQ,w5Hm*Osޥo4(ro4(o4(ro4(o4(ro4)Q@'EQGf,Fޤ$z*yb+?-; jYsq?_ƬEPEPEPEPEPEPEPEPEPEPEPEPEPEP|[?zqSYMݱg W{yV(((;? [a}(Q@s铫Z$2F 9NO'zDm7!G P^w(BĕڛP` >+{4#hHP[\ޕ >#!tU,Lm}"\9\{sՊ'2[h>?Z@:+?=AҿiISXjvO䕸8PA\HXxkf"Lv!b + ך: TTKT.I{5R;i1(rH9q{*[X#z:p)~i,.yNO'(PԆ&_/}ս?vJ{\ݑ}U?7=>$s{Mq7~ Ӣ15?|?I^#񩿷*blpIp¬Pg??oEbcYrcl21S.?]Ictj98T 7~ ?+NY4NUB:R؋$(lH9 sڙ1?ߓCj@m\)93HQs)-m 89_0BTl< $dkFL* Ri$H$qΚ-cB$Yԟ0O 0rcC Tt`XRGzˡm!h$p@$g x=FHV;RAmH{:+sy# Č} {@wɿhV~ ;ʀ7袊* 0/1ďe?OUb(Min 4QEQLDT+XVVh@ |uP~-n_ lϿLU:y{:|suP~+i+Wk;G_gݳ;szgѠ ]|c a}ܧέN\ `H\g⧸٦%],*;H9>,0Ce\r3Ng+m  ;*i # r:ҦVY#mcIaIqE$NC$-aX(!T( g㞣EY6q͏0pFK 89,19 ?շ*u6Om?ʀ E3bhv"^hq{xp?V* >QbcsqV((((((((((((((̢2e#hHP[@zߪ5ű H<9rj?5OY~mZ?~/~/ghjܲڏ S_VDߋ?GDߋ?@,6CTգ?Q?P:Ʊǜ`rs>$sO­iR[JMhEV-ϛku3V!vVh( ep |Ltw⠾(,n p1N1(0tO'mW鍡iNanYbvOZO ' (4t0! tU 3C fhPPd`i?IY*> I|TEPU8IFJ X,ËH>і 4=Q@Eqʥ?_Pm@z{GTt_*Vڟ|+q=sVjϛY =?>5/ojf6wwRExm cڥm$koK$OV@ cҫI !v70fH?  jbXb\BA=::rsn+2LET)`36p=8UWfLht~q@?M[}mU]#\20ʾtO..h/i+Fm2(#G_B?J@`9FwGǯVjq{xp?V(((((((((((((((ʦسR2kH%@1q烾/'w~yMUCמJEUel 9J?֟<y=ӻ?JP!{Y@2{C A}?Sji Do<#ƭg$7 O ֝&_WYE\ CyA39&1֔okhP[םV58 t/:݇{L3bckn:!yw}kD"]b(PMlQ@h%?ƏH4o ZtPg$7 Ov.`IB)Zע(h?U(?{q=Vڟ|+q=sVh(:oNМLˋ;W"V\z0|T}S@K[Xm$TQ򩨢 ( (*yb+?-; jYsq?_ƬEPI=iuzq!PR6r$g qμbH޾o_Zܱ /GioWB޾o_Zܱ /Gi=_ #cx=j[3GFsCV^*i٠DǭǭEE/L9IwZ7Z>0%=h=j*(ÔxxSR]֝PQ?E &XIES(( |>-m=8 mY"rYZ3TPiM0[ϧY}F?>vJ LgΘl6=}hX[ݼpF p쿺1۷LP*Ɍ pǯM0[ϧY}F?>vJ LgΘl6=}hX[ݼpF p쿺1۷LP*Ɍ pǯM0[ϧY}F?>vJ LgΘl6=}hX[ݼpF p쿺1۷LP~$68c8o? _Z 3w6TwP( ( ( ( ( ( ( ( ( ( ukf3e7u?Wnͤ(DB3q3p3qץX$~F%y?WӞ_.+1 /9b֚l[ ]R@鑵,tTW t%s ›w^' _`Oٓ$`Jܪ֝46WvP 篷# :etB0p6}Y~lП❡iP[\ EP0:SZTYYi/ԿW֙tuxʿS5ET-/ -y::TUweoxed2Ua?CU]ysUnqniEQEQEQEZ{s#Czr CP.zVh CHMːWqLNϵɿvw\1U(뵬KԑȲl2 jص䶬4bfbUF^H+2GݑU[c23 =s\&::Bp@&jƊHlX`Nӷ' `A@4[֍LLrH>$prI#w}P$ݳ\u azuYw ntuFV0@>ぇ>t\0,rO磒Ł `cG*\ #$gȧWIg# su^eīg{;j͞d\.h1@s}?*ݶ ^9nz(Pc̓Ϩ|s,^d[R]whin,{h aU#𩥺T! pM>zt]?wk3lM؀kv-_ҁے@$uE~?JyM?wkOøs2ے@$uE~?JSy!fIcP̲psnUmBnz X~\b6ΧC9)|h=}oδ OU[[ƆC=tUEAmkoimpcP=PEPEPEPEPEPEPEPEPRuӤM&[Amœk&Oޝ=O>u.b-yRki; CJu5@;Ňk%~.1?qqq&kMP#;a{ذMmt"O>uh|CpZ{{ذM&qos\=,km^Fw9>5߸ƍک%7㓏tW,v؀<sU[)H8ޓ\`猶{wZbH<r<F85IT/  Uׅ `p3ڬme$sq);Yy O\zzP>nQԕ;)Rǎ1qn[%^Z䝪TCNVR _G8 Z5J`zIIP+5XG'RdhEIEPEPEPEPEPEPEPEPEPEPEPEPEPEG, fI*/Rj}l@-$83@u-f\u2D26?PSr3ё4):iQEQEQEQEQEQEͼwpuRAjVEenY/|du1`Wafx῕24 8u'ҲdOLe]p'ltSK#H7'gMuVJ.# / tq*G$QSx|Q`4_*:--3~Z-˒0@l? gܣ2#&vRFINq٢ KM;saɑ݃d[mmJ?5šശR1K~8:sZȒ’FAFҕjW|Eyy1Hܓ5n-bsdfcv=I=Vh((((((((((((MsTfkr;Nk JwE'b>/S?QjF>/S?Gժ24Ϸ>P9Ef}_Əj̍:+3u?#4}_ƏTdiYou?#4}Zs#N|Ooj̍*=MZ|OUϲ/=e9ln&y #k#p0F<'ۚ4$jO)GEݸg=e"Y-,2̙J֬/=eF"Y>ȿ_4hoI$W4 +Ty_O6(+I}QI?آi'GM$b餟W4 +T[YҚ%2Z| 0, '> endobj 71 0 obj <> endobj 75 0 obj <> endobj 79 0 obj <> endobj 84 0 obj <> endobj 88 0 obj <> endobj 92 0 obj <> endobj 96 0 obj <> endobj 101 0 obj <> endobj 106 0 obj <> endobj 110 0 obj <> endobj 114 0 obj <> endobj 118 0 obj <> endobj 122 0 obj <> endobj 126 0 obj <> endobj 130 0 obj <> endobj 134 0 obj <> endobj 138 0 obj <> endobj 142 0 obj <> endobj 146 0 obj <> endobj 150 0 obj <> endobj 154 0 obj <> endobj 158 0 obj <> endobj 162 0 obj <> endobj 166 0 obj <> endobj 170 0 obj <> endobj 174 0 obj <> endobj 178 0 obj <> endobj 182 0 obj <> endobj 186 0 obj <> endobj 190 0 obj <> endobj 194 0 obj <> endobj 198 0 obj <> endobj 202 0 obj <> endobj 206 0 obj <> endobj 210 0 obj <> endobj 215 0 obj <> endobj 219 0 obj <> endobj 223 0 obj <> endobj 229 0 obj <> endobj 233 0 obj <> endobj 237 0 obj <> endobj 241 0 obj <> endobj 245 0 obj <> endobj 249 0 obj <> endobj 253 0 obj <> endobj 257 0 obj <> endobj 261 0 obj <> endobj 267 0 obj <> endobj 271 0 obj <> endobj 275 0 obj <> endobj 280 0 obj <> endobj 279 0 obj <>stream AdobedC  $, !$4.763.22:ASF:=N>22HbINVX]^]8EfmeZlS[]YC**Y;2;YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?:m2Ymt Za>7똫dl??֏P?&}#jO&}#hɰHZESɰHZ?l??֮TAn$|zFs@dϤ6GZS\Cr\:(MGa>ra>dϤ\)dϤ6W( 6GMG(MGa>ra>dϤ\)dϤ6W( 6GMG(MGa>ra>dϤ\)dϤ6W( 6GMG(MGa>ra>dϤ\)dϤ6W( 6GMG(MGa>ra>dϤ\)dϤ6W( 6GMG(MGa>ra>dϤ\)dϤ6W( 6GMG(MGa>r|Gv% UbrhXN%W8!f@ c—:h"H)inܸxz+ >n&l)"TSرEUI{i 7UPGMQ,m/m># ^>՞!-ZIr̠ykQZ"8[$#~ƱulcxY8Aa?ֿƓJaӉ@!*栒m+lZ^ȕiX_Ja$c93^m1-w?*=oJVkk#OXkOZVhfRFy|$Z4:-̍2fbӢ/-T`(xk0\ 14XJ$8a.#,q◶tU2e# E-cJxcOcc},VtEPUeRNeK%d# ;Ӫ24=EdjQEQEQEQEQEQEQEQEQEQU^I v<ʡK=6y0zgU̿fv~vٟ* Xc!&IޕcTO}Ty%/&Ba֮Q@༆wԲJLr)V_¬Tslw= P{dՂܿ 8YS@袊((|W!8fc:hεR+; l$146Ai+2v 'TP]\ )rB'򨣷7%g!aտK=S+"p}A <́Vd.4{|B4mu*qcӗQDUÀ0?sWA(^z>ɑg`iQxe[[?EGb9$I  oJz:cd`O/c=n h'I\F 3/\"lo~J0G?EQjj$KR3!R@0?KT?%FQW-4QI ~:ԴP+ qLʍhͫR;.؆̀J?ư lw 9cjھOF?ƪ6%xomL)j9XQ\uSwV &.[jemKQ5|ho/AKZ{iE1 GQ 9X\oJJlEбG|lRr@ʲ> KZLKhoAQnHF(F&9oمHC\>I ;'qG'qP:@UڥT (((((?dZ?LAT?%JO C\BZH%(%=O=bU=O=bQЧ𠦿u5շIWoB/ ?OMR]˗j2W9Ǵ/kտw\}>Xfw3ɓYU|eӭ9q5-G-#'}??'o T5 jl ) 2rHcl-N*#BWm?Ks- ζ6q=:qWZ:.p/G$䟕O?35^N^<OZog>ެut70Pnj`1cʰbIc9f&x6?GkȺϡ#KE!LsjC*1Pxb0p9 v.vD"#QCY#&GODQNeSڔ۰p32xٖGk.o7|̌K+X{בKu(@欥 p1Z0.$OXϵ#?_w_gD@g'֣?oͪ3سRga:a?>u>j%,db=\ׯiNQ°# >Z_O?34gZs5IEzfNx y5rܸs:ۓsUέ!֫UGa=?J ΅kbCT'4njV(1.8HäIr,:cd I#hnߑ4m/B|ZyuNq銫r/u=`p7(rv-_nߑ4 x]X<ZtQ#ji[RsTe, St8 jw?ɻ~G`)_}.4;G\Me^9!qxˠr03׷?Z[ChhgCTo1WjQEQEQEQEQEs7ףLk{oI"F{r;C^a* =2i a]\$JH͹۶ڼ'Rq ʼn JwJ_G#WF^ąHݶ7_m_kquo \ZGjTvWtBWtBTQE1Zi*@hm*T\"$~֑ݲyX w?V̚mӣe#85292XTwYE\ID?Z=I4'ws;v_2FU{?y#V+ 7a#; `?-/{j$UYz(s?}A\#]e-ˎ3ngV?U=?J.H?J.HZ)_@ZT4 W '-딟*UBOǤ+o~|Cg=ˎ! \G4Q \G4VLѿg\]Z7똫B ( ( ( >Ӭ8K\AQB/ȕOͷRۭ|WuCkX<\О#CC.qbHqlF5TQXr6p$gGB]p(8'1u F2#<2xpI_[gl?h~VXQ|=vVVU9djd!@x:*ay<^ _mC 6yECr&:` H>( '1Olc qŪH PPW"hp?5o-H8T[3)u$L;P IcN0?J wWĀ`:WU2x@WS2- gċ4QEjq5o&Ki뼟VMrjʮ^e(="(?+/pO QBКTKs/ Zkӿ-Q?o(O* ?M*?j?GU5>eW(10eЍX_2FWXo~GlvAP!i#ST0Z__UHQ\^OF [gV?Uέ!֫UG`{~wL]qO*~wL]qO*,ESCOO~i@VO [)?U'-딟)-QEKVH WLxkտ?C7?Z{ChhgCTo1WjQEQEQE5 ]+ Vf@? PwFIru>yji+ʻk_X6n.H?}OlCDE3N⹖?G}Ǐ՚)\U˶7)wV<ƛk! [1o_W6SWIz֪W?K '}Ǐk<5fW+v1u+xKHAqi )r" 4ZByi"QZeM[A7ɫ_'kտw\/=Fׄr(H \BjT`?&/*~i?5Z?4 TO~>: (Sʺ?&DSj ?MOU>( L;?y#V*̿0_T0Z__ B5U~*,EW9W>_k~cտ7?rjtk<F8=e͢Epq1(L(WtBL^"-ϫCۍ2B2Y~V}~!Em??u?˰^jd8Z HdVO [)?Tj\i۟>,yRJ~o?Gڭ)VH WLxk!{h&Cumֲc_#(_#+6Yb-@UڡQ@Q@Q@f@? Vf@? PwE3RpQ֨hjT4O[}4$^%XX9Ie-/ˁןTTЉ%Ie?1"F NM:`8@nHf–I1+U+ }%B+ }%BػER(o?WQ2@7+i\S ޖǝf(N2 /wB5j M\y?#YU|lEVEe 5^0V_Un|~e?Z?4 Uqw|'C XQ^)e]SAWP?O^MCʦŒEV&̿^^_Պ z/*?-/{jj K^ ~^++z}/5W??}AYKrQE%yٶk~W*W6|mٶk~W*W6|mٶk~W*W6|mٶk~W*W6|mٶk~W*]4$pgl *EBqxBq,gCTo1WjQEQEQE\?1ZU\?1CqSIJzJ=GZ"P?m?Kz(QNB7XU-#At1*l>!Wjl>!B l])f@7+i\S E Gi )oKc|HEVSVMrj5o&Ki뼟u>6\+"BКU?+/pO D>?2z qw|V;G_φ,}N(2 `QTڧ?&DSSFUz+^_Պg/?/j~ =vd B55CuЍU_ /QEq?+>_kq(((((((Ghhc:@UڥT (((Ҫ2iRaKgAToEUrǯ'j ofoEUUӢml"M& cjW؟mOsB}/?4}@?9_b>Vպ jJtvX}@?_bcZ&W?KOUZhi7{b cQ}Ur^~iQTr{z}^#8/Q]m~Ur5r_=Ү* 1Lg?7ut*jR\J(9Hob3\D:lW-I`)d?pErvvv -i 2mRĎDIFwlEG]Fo?wcڟq ?&՝ޥt˽A'ެ %}ӝLDuU?N/w@Sx4˼E0vz`_zS+ƅSf]U3._*VV{țTUp0 ˉn!M2tF?LbE:eBSqV2*ڮ?{/Gڮ?{/XR3;_2FU[xi_<'#M@˿wkN1DuFJȒB׺F@˿wj8oc]1wb}}TZ2j4dhQPy h.y/<K,aq8Mk[QR0((((((_#(_#*X·F=svX5!X+|6ۺoEqۺK~OEcK~OG?'_cK~OG?'_cK~OG?'_cK~OG?'_cK~OG?'_cK~OG?'_cK~OG?'_cK~OG?'_cK~OG?'_cK~OG?'_cK~OG?'_cK~OG?'_cK~OG?'_cK~OG?'_cK~OG?'_cK~OG?'_cK~OG?'_cK~OG?'_cK~OG?'_cK~OG?'_cK~OG?'_cK~OG?'_cK~OG?'_cK~OG?'_cK~OG?'_cK~OG?'_cK~OG?'_cK~OG?'_cK~OG?'_bϊ'qX׷s'  endstream endobj 281 0 obj <> endobj 285 0 obj [/Indexed /DeviceRGB 255 (\000\000\000\377\377\377\216\216\216oop__`\221\224\232\350\356\367\256\262\271>??\322\330\340z}\202##$\034\034\035svz\304\311\320\230\234\242GHK\024\025\025aaa\254\254\254\314\314\314\262\262\262ffg"""*+,\211\215\222]`c\016\016\016HHI\214\214\214\246\246\246TTU@AC\341\347\357\331\337\350yyy\277\277\277\222\222\222NOOOPS\237\243\252\246\253\261\306\306\306\206\206\206BBC\025\025\026\265\272\301\313\320\330los;<<\271\271\271//0IJL\025\025\025\030\030\030888@@@999<<<666444555\021\022\02378:kmr\001\000\000\r\b\b\002\001\001\003\b\005\006\r\b\002\006\003\000\001\000\001\003\002\r\r\006\004\004\001\001\001\000\003\003\001\n\r\003\r\n\006;%\376\376fPP \f\f\005\331\331W\006\006\003>>\031\314\37631>\f\006\005\002\376\314f!\033\01689?B\202\205\2133! ?&&\177LL\025\r\rN\303u\r\034\021\023+\033@\237_\217\217944\026++\023\237\237@\177\237 \)&\021XH%Z\\`\331\376s\240\376\205\263\376\177\200\2003&\030\0300\035\035`::\020\n\n;\222W9\217V\013\030\017\017#\0250xHkk+&&\020##\017xx0`x\030 \036\fA5\033\262\266\275\030\023\024\033\025\025\023\016\016\027\021\021\021\016\r\020\031\024\021\033\025\020\032\023\n\023\016\013\024\016\017\031\022\013\021\013\033\033\022\030\030\020\023\023\013\023\024\013\030\031\017\021\021\t\030\033\016\025\031\f\022\022\013\033\030\022\031\027\021\215\221\227ggh%&'<=>-./GGG\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000)]endobj 287 0 obj <> endobj 288 0 obj <> endobj 286 0 obj <>stream x܇fpҖBY=@PVRfɎd'/q:l_'N%eޣǿʶ$J4m}Y}oW͇{"suyyyyyyyyyyyyyyyyyyyyy{ : t^x?P|#yAL-‡=.Q<1G.>wKqj+p%O@O'_q?aS.{W|˰ Ӟ=zKs=oG=|vt(DiQ ;z%:(`/sg4 6PODz%#b ? Fo b1UUETTQոL9J[U6! Ht=&l.ہ))"I)N3#ᑱ`&98j }~ӛ@aQSUMtCpEEcm1Nqc9M>)aDpl"H<ѱltr1Mo@JHd@jImP`*JK;E:eö (_Y\,n*8@MjhR%r ifiv) Y-BYX$i)"&y@BYlA--WmO4?ۀ[Crsk)߮Bک-'RZ>گAeZmY Fi 2wE5vܩT| eڇfV.muPZa .ք-@]nfYUk3S-͖uМ`lfL6;ohl-U@!/@5zg %j#k-@K u5mseL׶l2@t91tPݠm9ݺPal2?\s+ZU@v$N@2ݹ;g27h'[wq)ntAp)j p\6  5bt  "-'vH"lX7X)joe& Tv<3N\D||@Vց9cAzs^k¢º*ہRCGTrhK'(b @c#s6'lp83ys8iiAr8rT85aU h"Cd$ N9"9%z̋S( g&`tf sǵ:HaC9&PBv "xLSI1HO:=hlKSSm 6͘_ ([j Dw ] @ʸm@=lMJkut3MIi[o#Ihv U51 :IhCz%Y@p ja]$ )JM@$AiȌdٌtl]FhU@{zA/]~~#P}>uЧ>>Y@ @ @ @ @ @t @Нp;ЙJGW 37[Pu >4qq@S-E@{KKl@ tz> endobj 294 0 obj <> endobj 293 0 obj <>stream AdobedC  $, !$4.763.22:ASF:=N>22HbINVX]^]8EfmeZlS[]YC**Y;2;YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?鴽2m2Ym!yfdjF>6F=svF>6#MU(F>6#MU(F>6#MU(F>6h?lc(ߗoƭ$[6I63u}Mۦȗh<Ա' [G0,Z]&IOKRCEEt=P_}7|mGF>6#S1xXCպύ(vύ(vύ(vύ(vύ(t$R{U3zf%lb {oE]gтTe>ol_ϩ*XlA]'@-i;sRƶ'%bC4}~cF(Wu[r*Zv:AZUV[ Itі[o7|mK[;]GG^x$:~Pdio| ?4\GIɫ3]MGb?30,*}1xG{Fpixk?熳/j 1wx>`W׮CEj}ixk?W`{3bC5ؿǰ<AP1&Y6}9VlghuXcYx9O"xڋ1|y#j0^zwrqٿ q֯^YR[%p;SSMبRv:()kQXlD8rO5ڠW؅Q'̃]yݚSh ^~5<z>o>'6jCA hȓ֎d';TAK\CI@;}^0?Y67x>:^ YHϞ=`Q\l%XDY֝o)?ƚwإlv>`Wo)?Ɛڪm8i+>ǥ+ #}ֿ)?ƍI:J0}+d~R`W)'k̟G2Ot}(E.ᑝRZcm`)py"g@ 6Z20}(SO?Ƙ.2BZ2( WdƏkfu>`W)'k̟G2rҹT@J)eӾ_KAu_xXp}(K1Ϟ|4׽{meKȓ֏m}c%rb0rڷbH_r Ǥd«C_cP3{_ڠ LYAWCTMnq,3E,3E&E::֑0G_Fs?C4 c-ďcf[rwppkvxMT]ͻKqm1ԒG| 5VVV|.,&*Ŷh.Iaq~ASc7PWuuAlUrMK:Eb[,8zz?,(б\a >BLmkC^C5^\ nQl8#棫[(+c¿V=lxWB|F~4^j@gePY8?ՋmE}>C Kc=TTψ_n"gXgdf@O4=m^KN: <~NMBV%Dvڡ#$DK~`s~d]]YQ%njQ}`a >anǦ|eRg\/6HԿÜ@w8 l >N67YK>4؎}6mij'&Cw=jh7P\6r )/:z~UZI.73'H=* ZSZ̟!YG_ fO?a#Ǝ(#__"c*Lw=c{]Ao+csЗvU2zinVKﵹU %ZKm]1]@5eoadUGIyhߘF9S-,ID!cҚ)V+<ҥ`2)Muu?T?@l(UD 䁶 sn{lu7 joHu#S%=^yubyp},@o*vkBP-RsN??P\_m 8#OgFY:p 8QNb 6%RGP=6t!#e~vn[ϔ*G jSAe_Np?5{h=Bs8F~aS  ^½FPIMzS^fDXnFlKgy翴6ҁ }>ߙ[܋]$cPgAsӬ/ƛjH X 88?۬3¹Kռ/7@}hQ0ϧbFNNQjAX$coOa^vdw5.*E^Q5kO$2pO~²HP؝F@*]6 9x8 ty)4ػ_CEGq%yRmınUmk5L3#/~QwtnΎY)_ { 1j eurP? ?/ :Hm.QꘗvWI=1SCٍ~C7vއP, ,,sbHl@GL ʌN9ӷG% Mg\ʣ%jv :O%\ټf9psj_[ϪyWqk|jX?`o89^G95~]ٔ/ $ɏ3}0:VY-YQyXU22?2Ka[5HE|ԑDc'4(|H׾b*۷$BAL2 .dQAEI׵YI֮d)/k\kW)bk|>-V*? R0~Ѣ+3J:B$jkAS!R<k-%>'rշ*;Azd$gr'cq5ZAƏ_ңCEZ2}hOPqao*?ֽLu}f=MCڧuCss݋AQ1Q5-ZD0õŪ`%w'9?`1$H?RQZ$%/o?_5KQK!RO6+*lB]VM͸dcr45(hGF)K]񐅈F1ۭ鸨r\vSZS\E(c)RvQWԯoqf+3_B3_Bt5b|/!?BSZ̟![GGG]EWAsB:|RTcB:|RW,gGh*_16UV/ T=j(e9/k\kW*R5[_-V*? R0~Ѣ+3JB=ME*o*SקYe×Tw7soRTw7so^,"{B/r8ͤRβ(yMCuFyVo_y5vp2ij,FEBW4T\I 4C4I4QG_ZWx'k?FiKrQ^ CMGECMGESE!BzT"{=ف~(+QjW//ZQW*nKSe_+]Z[/_iQС"Q]QqVX>=k,n?şhşh`tZ7똫KF=svAEPEPEPEPEP$Q-E/o?_5K\U>&xⰪo!KW*fԣ(DXS]c]F2+3_B3_Bt5b|/!?BS[FԦ)#~۷ҷz~4utQEt8?#ʵ%F?#ʵ%rv{![jUbqISBOr!{_'ZL ub# _'(>$*o*SZB=Mzx[9zGq6U%Gq6U=L<-!S{%BW<j}JLI?6Z@JI?cW zRҢ+7(iȵ~iȵ~{U=q^OW_x';0/E ej?ݗ-XeKV**YM©j}lKSe_+*?>$Y+ :>=kYU1[zxBxBF=svhb(((((ėC/ZUɝt)1W t>'IୄI&2a-_öןӠYe6Cg*3X).QOöןakj^2P]c]F,ܩi.Sspi5?bR+3_B56OJ&kc$ev*~EqII;ZV&c<5pDB#AU)ʡT* Z1Q;dQEQg8?#ʵ%F?#ʵ%rv{![jUbqISBOr!{_'ZL ub# _'(>$*o*SZB=Mzx[9zGq6U%Gq6U=LA^AƏ<Z@JI?cTO%?뤟1?MniQE4dZT4dZU=*_x'B/\׼袊2 U}GB%zz~¦T>_ڥF ,EzgAWAo*?ֽL=k,n?şhşh`tZ7똫KF=svAEPEPEPEPEPEPEPEPEPEPEPEP8?#ʵ%M>to.&wU,AsM?XJli!$_16:95nuU#kޗOL(?usQ*g!j7딟j _5s7"sOCT{9 biGUYZdoI_H11\z=:Rwi(f?o7Q?UG_SRֿ7B)iZ-ջBldcS5sWn$ԏKF-Li**ks]nNi?KXEjCKnU(͹?ާfj?mndrrj}A)]$эPfj?mZXjVתּ͓ns'Ŏ*QsJ~עWmTy:9nƼv|W&Jؙ{fp_'U_?U9`k6ѪzОkR[9', epFkK:#//ZU&ӵ)aB(8{Sǩ*y}yZzR#RSo?UE>b}n< [?{O.&(,PRo?U`Կ]?Sw{x\}z,MM ym` =j=k JTԎzRwG G\G4Q G\G4WC2+8rp?k|EY}<-xZ-QE_ _?,TQ@%o*K/煯UP e[k|EY}<-xZ-QE_ _?,TQ@%o*K/煯UP e[k|EY}<-xZ-QE_ _?,TQ@%o*K/煯UP e[k|EY}<-xZ-QE_ _?,TQ@%o*K/煯UP e[k|EY}<-xZ-QE_ _?,TQ@%o*K/煯UP e[k|EY}<-xZ-QE_ _?,TQ@%o*K/煯UP e[k|EY}<-xZ-QE_ _?,TQ@%o*K/煯UP e[k|EY}<-xZ-QE_ _?,TQ@=,q+ OQ@ endstream endobj 295 0 obj <> endobj 299 0 obj <> endobj 303 0 obj <> endobj 307 0 obj <> endobj 311 0 obj <> endobj 315 0 obj <> endobj 319 0 obj <> endobj 323 0 obj <> endobj 327 0 obj <> endobj 331 0 obj <> endobj 335 0 obj <> endobj 339 0 obj <> endobj 343 0 obj <> endobj 347 0 obj <> endobj 351 0 obj <> endobj 355 0 obj <> endobj 359 0 obj <> endobj 363 0 obj <> endobj 367 0 obj <> endobj 371 0 obj <> endobj 375 0 obj <> endobj 379 0 obj <> endobj 383 0 obj <> endobj 387 0 obj <> endobj 391 0 obj <> endobj 395 0 obj <> endobj 399 0 obj <> endobj 403 0 obj <> endobj 407 0 obj <> endobj 411 0 obj <> endobj 415 0 obj <> endobj 419 0 obj <> endobj 423 0 obj <> endobj 427 0 obj <> endobj 431 0 obj <> endobj 435 0 obj <> endobj 439 0 obj <> endobj 443 0 obj <> endobj 447 0 obj <> endobj 451 0 obj <> endobj 455 0 obj <> endobj 459 0 obj <> endobj 463 0 obj <> endobj 467 0 obj <> endobj 471 0 obj <> endobj 475 0 obj <> endobj 479 0 obj <> endobj 483 0 obj <> endobj 487 0 obj <> endobj 491 0 obj <> endobj 495 0 obj <> endobj 499 0 obj <> endobj 503 0 obj <> endobj 507 0 obj <> endobj 511 0 obj <> endobj 515 0 obj <> endobj 519 0 obj <> endobj 523 0 obj <> endobj 527 0 obj <> endobj 531 0 obj <> endobj 535 0 obj <> endobj 539 0 obj <> endobj 543 0 obj <> endobj 547 0 obj <> endobj 551 0 obj <> endobj 555 0 obj <> endobj 559 0 obj <> endobj 563 0 obj <> endobj 567 0 obj <> endobj 571 0 obj <> endobj 575 0 obj <> endobj 579 0 obj <> endobj 583 0 obj <> endobj 587 0 obj <> endobj 214 0 obj <> endobj 24 0 obj <> endobj 592 0 obj <> endobj 47 0 obj <> endobj 265 0 obj <> endobj 593 0 obj <> endobj 83 0 obj <> endobj 594 0 obj <> endobj 100 0 obj <> endobj 52 0 obj <> endobj 595 0 obj <> endobj 596 0 obj <>stream x]n1D{}] 6N"AN''A}ff)FЈKr.I_^n~,?}X?.vvنyu\nu}?aO9&-SK[=Ԟ׵vo1>B[Z(B[[(vl4S q}׃J;PJc]Z(RBh嵅RaxTJ5&!+&2 ,DpỲD ,r\@ F  9xXx]`u ,^W``X:X:י[ Vʂ;eV ^XMZXM0x+2x+s6x-3ZV ^-VQx+P! SRL唰ёDI$ ̴`uN`/+Kؗi S $rx6h.J:X=γuV^֢gKd0P D\Y:ZZk$e,;*agEBq( pEU+Aĉ%/n4K "2,K%*45n,h,:Xɋ(!XpUN^$.pU4I,)XP,/!ũ`5 7+7 Yd@@\ /aۭow+YoހJ endstream endobj 7 0 obj <> endobj 597 0 obj <> endobj 29 0 obj <> endobj 9 0 obj <> endobj 598 0 obj <> endobj 227 0 obj <> endobj 599 0 obj <> endobj 15 0 obj <> endobj 600 0 obj <> endobj 105 0 obj <> endobj 46 0 obj <> endobj 266 0 obj <> endobj 588 0 obj <>stream xX}l[W?v<;ymҘ=fqlp d.J8QRfcJxI 64J]7Lf +6h DEǧ&A 9فFs9s?߼{sm `(蠵 4yt "٘;2*{aEW?s_]wQz@x [_z}xx{xpt,74CC}llXn "~SJCŷ|dx /2X r8A_da=k`1JJ$8 i ?UKZ0?8 _?gy&(k4 $`~ u[,9l $-0E2B&* x"+dbkEt)Dp/z ixU @?*!x /+!dvNG:`~#D@/'z 9LEuUYy`?.C_'=䂎.ebQŬgBRte> $_X9A [kw8wVH{%%x$\JKe>U*At^ÁfR'nKMtS K äfpӋPlt6cF BL)Yi?%Zvn 'SI4uy>?%bssȇ4N2Z&RK8%!{z;TEUP $5?Aqji ehq_V1})ŬEe1YT YƐ`Ȝ~O)QgS9Po0P}&gIC 3/or[R\#hl\__Kqr9%|I[:C^7M6ؼ\ŚPkXf8Xg+ic{PeTOmgյ5&jj5kjt̍LY;:![f{IM DB)g(bC1ʟT~n|f-Sv"'8)G':65˟7Z8Lf7?H+D\~2^_KK?Av 6V!1Pʅ"CDasH LK}~7ֳRmº"[(2jD ˂_4_yhDEv/~Ep/.\*/98v-_]9=9y>eE稜)$[K2>Y?Mfq3[(!:J V=IOnUNKDv N2٭9\ES8_8pNAn«>"Š2*\2;fͩrEyvy2Pkoh;6 Q=؄ٯf,-5%b%f3a4q\3Z^/[TXtDM> endobj 589 0 obj <>stream x xTU?>s͕TU*s%TJ䐁 Q `-mvEV1P# gmơmQ@U A{9ϼkA!dF[O V3_[ׅ6,4x!e ' FHl\vƥ~ݹ|®瞿YAagra>a|!=p6ϻՋj.{ ?HPC! Zx|/ݫ׮Ӷǻ/\=Vb>^ۧ}SI;FƙS'7=`l p#R @}uɮ>zwie5F S`vXXDdu, ` ?Џ+ psv7G\),xn>}nl슎݊֫MGz]ZaQӥN􂥘*fVX-,rJ.ک׌j > w;Xu6vwaD]h7nVہݰ B6Xzobpi[/5hNI{  3eF(*S5> ~|U0ԇ 78ڀG N¯~66u8,~[㽶zףp#ֿJ 뎽|pK% _O>Q|' (Puc(e5uP;wkޞz5~KV/ bL>c R<ЃHr+#; >r<+x`C˂ e!T428)li 67M E)Qw`vz6|j}S4nۻ"j٣X[^ZBs 4kJw0jz̿JɩVeK.ݹg)CKXꂫV߰:}-rא;1Z4eQ"N]ؽ^7[ KpΆ`K駥RÕ:m`Й 91w]p9:t;RDlMx5ނćS< V('z<d0(ɠX9,y o27|G0j"}puOD4qzs]JMtbOgy=7Q۸5c 瀑vT"g:[kۖ/#k醅nXYzlgg56:~O 9.~g{6{~"a7hv5u{#(kNjrXA3z&T]KJA/HHxD7UuU Y' EPq!c9g2\lK"&zk,»{L&Vxc|'*61]*z<}5ǚ0Dν3姟zO@p!w"/8I6)$qR,9FnKG/Et!-tVhSug)syIz~O4(ynWf59|"(;%s:fΟ,4-FZ:WipxJE~k+{ ^_&ʼ1qV51<ۺⰚziX7mb\;G8.اѾOa(4E-dV67qKMjSmĖ[n"܆lbH91O@GRPاN45im°KcJHp]#x66R@ZJ}Ldrv)eƵl,אSCɵ}gfr M$E064%<RL,ӧV(~W6# FU @=S&fȫLfU'F=Py@>)vF뀞!ofS0m(| AZ<؆'7مDx-LZI+~skplpgXe6H@ MbHDX+E7L4SER/RjI1A.% N (TW@#Tmkrp]]2РZ@@ƿ}t@y^o~ fN;-:s߀/Cޝ8I^&Ok a22K"!QT8#:0tbi!BHj8m1lE 65g1Sî74~" JjJ7*KsؒWPn-WxQ*FԸ FÍB!2I[X8pIhKRt4dqnm%~Z\w;O0w{j ZAMkRyV0 6d[+LgsIAd^2qAM9^7?qYa?h#o_l5?pګ/GȬFo Y8XE}jR"uJMHmebxҚ3!Z:|2='2b^ዕNbkoE"۲ƺ1r%wQ#)**;6ԍi?v0n l %@v,Q;Y )d!P'NiDٗ*ј$d PɔϢ/%˝-50|}be(\x/u8)|CZ+ GT6ԻeE#H9aL&mEs6W~&] X'%*(1䠰-Y g7p?唪EX.Wݮ~r+]h]bb!TtM V7+R :渜,[ԥS+]r}U]qgR147q5riǮ9%ᷭS~1cڕmSrr*"kۚ'ۤY|VWSX;kB.#|f<LAP@ǢFW̆)|86e%&|P)å~4#-/`wg)U/\e$EJ>+YU+gulgeFa-Rme[=Vȅ4u'=ݩg,j;u2ۓj' 5l˯pJNO(қI7B>Nꪵ}4U􅣀cND5 NP.,,3 7KfOzO|\XZ~wRccV/}7??dsR8*^=ŝ11׵{$G~o_P쳤_,YkxOѿ 2/*/w;ˣx2eerlq_k"ݕX?'iÆi5L,HpQTk) CE,2*X8XB /Z(Qgqť/CmQZ @gb8nE_ut,Z0˛'jI?uDܣ6{Sx:o*XSrAWO 8j@ #Zza>9%d$ҁ  '36.3[`(2mI$.8UBԖߥ# p''J^֨v!A2'ɈDMةyZi h5guwȣ: Zj@Z"0HnI/?]"3zqտ_VOINq~w;ik:p<42F'*i~9U/ϲZ `5\^^cQkHe+&yl,W-Y 0(c=M'³\ߡRL9qG]Kņ7\Rl/jxۜW21Yݻf Inyƒ{pޒE+kixDA~i/Mo3\_@zv#Oc{ͬ#4h%ظ^aAF4BiFk( dG@#3I&au8NsGӎ!!Kc}dn LSN#jR3p5XYCY(4.eugn&wy8" ~37-bRR'j'U'j' J~os-(UNgHiPk-?BNISDZ\52g͗YKZ=~Tx•*er"p>r\hl J8Wڌf|b%JH$h Й:W[ֽճgճCݤf脡@#NCTSEpk2%׺HIb2/>vvp`{t}d Y F[5JGtR؊tVf XR2ju2גkXi8:܁Ӂ8x61ެ_\fK͜M|٠q3jD>P(ց7/_tb\p]xO!U3UJe3F1 3lHN/t3}FBt mO<)QЎ(ΰ: |+#x3w[?眹w|鰪iqeULIr5;.sP'L~| i OReh4r%Ha-w|ak2a㝑;pqkwIΊUss7Y֕Ҩ#?ֹhk-\~~A0K7+Ƥj> N%j'?ktрjPa3epQ@l0i .+NiQW/2&I0 ӁwКlk=۹ߜ^gF56l<ַ&R^x6~2;&! dgėIKJD&%29Fcȇ~[ʣ1 {P4xA, 'Y<.&1xL?LƧ @j)# u-KOUZ*@$2$:H1BfJoC)X 4[ɰx(Y2AYmbT4u d(BN &MNcrr$+~4}7-^#oWKs y&f+e2 =!XN`Y')'1xq$M4@:-ǵW\˙ܠ Qt|݅Sqyi{}ݧu3<KBŪGx|GC#l!<ef<7D܅;2~ӻ-dwT-#݂rAi zO3ݘM9@V7sG4a̋C=EhU~(nC 9@  OH'z5 Z&|A xo@&ToZә񦏴F7.Om}tM#Nt9< ft.eϭ 6q甆a\ZRtZXv4O}+UכP5x7vɒà Ȝ?^gh̜ Xu93{e:ul? fh1NZTiMuf4"INi; Yݺ.eS Te;.],`ZOvѳjdաeIv $`ip7moUh^d{G^'5?;.{O2ŵ3:=F G |]_ PäO]d#6UakB/IͪsXvhj.(ȺCG&b"bwNfXK^8(!?7$z@I͏woTY]2N՘;joqǏo-x^q7'5`.R,V_P1.{/$f'Ad:gc$/&Ÿ$laX :˒դKiw4)Qd:x,N{T nd`xq{`c'rrtPA~T2aOBvWAvuuD8KiЮKDG8c=es!P3Zl27Y=w 7]XTt&nxeiE%kG;F1>(EqJwbAE#AbgYGۜ0g2F0h"jg=ılq9,|G-++ tڙ;qq*.PCY+6kG{x WV[f+qYf>_OҡMzO#PZSTiXwr 9֝Z";md1qRjˢZ !d!Bo8HWpw66OU1cxQI/4qEBvҨXgrݞ㨹@/ylҪhycAA(#/@hɅQvY fYQEk6 $#,5 (.:OsHm+tӉ(Qv68S䳞a ZcV=J{%ˏ,6KY-t -0ԉh#{v\xcQ uCU.-$k7%8yo˖Gv ko;mEO>o|d: &M:".b xܡeXO(4P$5R 1mbC!BB3,xe>tTQbhj LKՊ1><}5`$I3_DD6_8buF X?IlrTR FK] rCL:bTtɸ0X\J\ q%!oF-f1v6/li.t^͔dofQגx33-.QXPC{ܮ.f֫cuďXQP5Qsukjgiז-3fk& ԭZlJ6~e,8s.Աc~9osl򲉍;:qkπm@6C3Q֊*rD2O)?<X:g͗u%(Z F#:3*CkZb'bJ#v=[:(܏oYY0MzJִ֘.eFk2z&AڗlY%{?!2pgjW&qG1irQNAMb<">L =)ݒˡM%Z7*[?.J;2@  ("ǮՁߢQO\=SnN$ftOprѝN\u[W_z\U܍t F<\8 Gd#/ vaù,C"KM,׸fԓmD}To'Qi@T R@WNAGJ<oZ4@y)/71f$t?K2hڐ^w2i C7ČYSr~Fxzc:aMVSf,!+-HwA'T2 W3tk@DZ]YNP^~!v-%kw&e74RG%)a=՛6ws"ad?[&TaP*ǪbV<Æ^=G㹇b cfUfڵ_$HYdG$1ni!""HqyCP2%ws 4\@ր\:nNۏhn6"dijdk›P84L04+2/2/2WedG>PhݿeŽwŶGw\ɰx$a/<^x^b1L_ 4 ڍ"lP9E6ه}p꒷+|G$x\,ː)03P+FIxDNu^ Ͳ.߮6T5A&oaˌe_fLBk`Qth&nh|-}}c]ʣ˖ +Z-[foqiBEM32e~腱mY<(] ԲܑID܉!9G vޫZxlo,įkO+PuHϞ8ϲ=2j@@f*3ZʌWeƫ2\f&{Y1٭OD!rw FٲDY6iDq;_zۂﶏu_j揚iع[qm7e{bƶޜ8~JiI?͑ܗ8Bɫ| jm搹̛+B[o5XEOI!o}id=;$ MàEa0FѰ?h<|'|U!ȏWKi("߱oU+tϲ_nѧ?SwΝqN ǝo@u]sR>Ex7BJrGI5fnКV#4`$Iϳ xȟU~gL!h{60V.c~+V,E꤆ )dIpIF>xyyʜesF.^zq(0T.Ds!oTogVk6f~b5 WƩե?zwgɯ ЩiLLby[]E?IIvȅjZ;r/*\WuGR}aܮ9/k|iC@c a>w橭mi(^Kѭn>8,DC9cF%xq #@բBλ -}bƼH$j: h Ɏ?#>jCrh+,{Y0x#I;, -AUOSD1Ehp$ڟ^ޏtЛ)Ry }AѪLV^q7YB* 5DifsͺseUU>>}'WXC^J_qQEa6A"LVهEK" ZZ&,ERE!ĩ|HȾ'bQ~QϦФ2fEj w 9y+E%-nLHUtAaKhfԈY|ŕdd*嘼@^- rc߀o|o!2Rfq_g!3)\c|r)#$<15uzNهٜ0+AWA 22Eś$yP٘FϾh +&}G/ ^—g~rGt"bRNש$j[l狼+Ƅi_@siID8?]'.Ηbs+nyrLC'>!&N3 *A%,PV+§<ҨTZ"[VS~m-/6q&]OuR%ܪOK ZVHffYl:Zj+У}Z M9RIHhzfG<6nȸs\Nz/y5GX]f^t$ZyM A(N{\d. y}yqkYٌ}>Fbfǂ.T5BgcV?82}6ՏbJ9 u]<}qQ릌 +VCFLlx/ۮ_9=^N^Zg &.0B˂X1N,ϋK.çq1*x?*6 xQ<oWKsV/Pl uu(6ј LWJ X H4L5VON$X*}Ml~gQ'4:C({te48sĔAoknrjaw;H%yY0;.Om&֙-l65i-2ܜC! ~k|Ž>&$@)'-v8gZ  ?=@D6-j@/0sw46Aۗ>2q7&?-H\3iq:B> Wli/"oh9'Gsѩ_KIN\ir4^z.#/3KtjJfŔ^PlI<3.#:E;1ZLXlS2}̩ON<8>Fb4rUŌx> ];|Nҟf5[PXSWmt%:Y̵ T`؉ (;EݣGaP׺>o%0[iosyY9l|>m>P}ݤqv˔>Ys`9\ݚe)z#(;bC96RP_7۴>;Z=^ 3|sitqN%(2׸%=şީ#]Ar;|q&nGsmBsQ$=}/ S z _}ƹ7oV'Ӗ[^Fne'rJrw\:vmw<?FSr[{Aި|\H3^pQ-œKWK7~\":-n+UuXla>WvU?|_?ӸD bo1/APjGS44 &s=h6栉 E3P+\ȁCvA(GSEQ P +ȀC(TzTP-څ&ԌBȈv=Ȅ^Ԉ$$R!3GX$5H=G-h! X":wglD$ 9ww46 i+,R( *{Q" (Jl ["ineI" iC ֒"vn*Xb=a8nq\GBu??_pf c.>ssQ|DCDZ0}g$aϩ$'Q?x %&d^bc-&c\cmE|/hr=mg|uN݆y_ |wM2,c,nd נX^ "@FQsc.{#U$Rz qj\bi'H9[x+}CҁZg.oPĹI  m[q[pQ?s}xwfsc `JNՕRaH3AN endstream endobj 10 0 obj <> endobj 590 0 obj <>stream x|{|T<3d&dfIX5zݏ^#B3_\}ŖUmMMyiZo!(ܷn5Z7!D+},wu]3`#XߵWgVz~ށ^8h CT}Pbmq_5 Wz {@༶ iC@xX'VT&εϵ]=*{UK@1]U=kSrCKڵ&8êg:ڃiaϙVK ujhZ~drH)4-VҪ vWoY8]).b R34-]Z Q!98 4 vv \ XBG^[GR {S><dO-a~["0)0,:|H m>S!V5QVNV#Aj{eR;絥hoɱ(裓9>~ƹ9~fCD3%N|oJ 4E| (; t~tb(e joAhμ%m +Hh#vԦ5:g”߹r- |R> ֐-PkO[г5K WªOSN=\<$c5GByGd|ӂ%mnjm"vִ ùcj+hGz3DN,6mxF$fQS Xi@-0-}ݟ^@H@2Z46}*J hȞOO?oxDp?d(/:r?;1d[;`i{ rGc0aN~ƏGx KfCI ð}Ɛ$~3133FB U[Ő*Z8< OK95);#bitNg~͍_RVwj0)@#Jٰ6_וCu聉聩>ePN9RhnDxyj-o 7 ]p6lp~RU+LՆxCD7BÝ<efJ1ĸhu_T%Ak t>ɡty5pGX6` O@|@EG::P,VR~w%'Wzaj'1L L+s613 `]@WctX]BI!Kq[EyyE:86f+_Y8XKTYݖ8-e5v=?P>ضfLN3> 5F1aӕv-: QTNDg-'yy"|lLY"V:PJT'o). շ+odoWoî܃sv1-te2 :| 1cʢh O3Ohxlf$/`GYΌ?QCv2Yͣ9KCxc2YY FDf%sEaP(Fo`5vc>>QQ+:6+?bUm))@|$ yDKa@EyM8wG+!sy~O7ca}(fcSlm[_o^ u&x4Bs!Ah0PSww\FWVJ5YrC9*+-g6|n o?j}4W\l/#?ݽ{zz{V*o?N)(Iwp 3jCs 0- 1[V0VV(*Q}%GKa2jT;)OoT`q.,c3ygcQ}YvS|پ]igivOr <-]lG\$?NaͭTHFF9ǟCZP-S۪|ѹ>RՑ%0YTSiӡ7>u+Wfٲذ غ%撫 ,t >;FҾ' ,$O"l+ $'9"DC) `,-%)A7N y |Nu>VR <':!!(Ui}gs0&&Lijl?X-rJv)Di4iz^ˀPwU "EA$mŮfb].^s<(":eBf:%)UZE)顃RUUj:U Z/T'=S\tdlז)Vhn,/]D]MrR$r7y}3̎)S}g 2BNTBDs$2 dڹE|ݤEQ8Ex |V M:*"QX’(a@cS c0ٰ "* V'`©5ڱ2zqdUvt(܉bXyLP``D3`DNFeO.Zu^cgllˊ LQ\'7a+L]u6h%̉@BN0م]O):lUU[GZg!Ќ":)|nn(d-S]CnFguQHo7y٤啕9W;nR;e{󅬣p(Ov_ueZH#J;O[T|<%y6-FIPuxu =@v6TYT"@eb@Q~#69B<+j\td<*g08{ )]USRae'މE床[f'WNJΨVT'WnWVoR7>Z=-Qrƛ6=QU=~E7hю"hHpP=Wm3d%AXV#H"yr'<w# :ӑsQ3=wiEZRImj].Ht-HxCٵ\sGɼ۫dp'be&Z:\-BZDqHKw:65nntcc)UV%az*F7mD+7KPefzJrbnLJ6XDMlr9)tV%Tyo"jc4=r0Km훛To]ZeXEo-_qSxұQ2gf  T3ە)-G3y#`!X]+2f9n̍X"Zt8w]n8DrFNKWy.s7k!!^8c!C+䔢\i:Qg,'-SmUr@YAYo̱5zц%ւ+쫊nn,gedTpeэ%&ys^2aH69K3$[)7QWFzλ2 9( aL#izQ.'g-si) 8  K-"~ `ӎ@^y۴uX\u%syiv۾r*:{= ̔OV$j}@fcwI{[Ⱦ5Kl'`(EH:Y^" C$iuz4u/*<VfByg*F=\+6JFIEwd*/Xjic 1te6A K%kr6c'3* F|8f@2-]BE9]Q_#50`>JGEG^|/xw-oW0` }}br;Uű=ݳ||4g\܃#FeFyԂ=n3(E!l6Oz',Hb˼$jXZPkZ-\Ca35>օ$[$3^^luXM&UЗ٪┈Qpf+m̺UkcE*g[5#xe< [G3I;QͯW<QݓT{Yid&a@X(Xܲ S0ΒhN8.ej:t,^I_uAܿ罅W-n}ڎG9s;/CIe o~oj1嗎b3ѻlȦҘ7A#ca`Q+M5Nj26e عP$C+'ͰXÍ?ЕetҒ}ͮ`` tX땻s Wv]mW˕rMӱtۯZF[gsHњ;_ T; RDj91ƍ3H3;ø lu ^vZG9y{.0m<+'#@zi*g|}1"کVidCV~@5̎brr53m.6#љӫd1]=6ٸgw|^7wV5l7n]C!F.WHoJ V(GXE^I7̌jFދLStД2q&n:4pejM23褳'(KcZ}k/.S{z ŜϽ\M;/:>=$NxPQ\__߬S$io=47FF`1}iNPyY@ː rI/z>B=Onq8U q~t*/Ӂ&|r5~Q㇕Lm*żERX oƥ| 8!+-]fKc|sy|02pl6Q/ ^t4 /xb`(*Ŋ"-qf2bR5E/[ELσ{N+o6'NVꀪSmjߜ{tmX,*N;vokkyoii׮[=z߱zf*7`jx cN,2#|H2=y3#㯃#X~K;p`ni)e,z'{4 =7&ݴzܼp8Bёþ :Z$8Knvn{&r6zqԘX`D`nWtf+٦?HR]ؗD ɓʁAeN޹P<rc%L=_sݴQ?EsHbK,a`P8T8a8!:"8qfNiDֿG("-"ցR(=Dʮ8 AEVkq4eWl (\t~71zׄn4q?e`| qs-ZsMirŖ*Pnoxtkvr:AB(S~Ìī`5;Qi),++un^UOaj`Z{wgQVpG, Y "6U,O"1p|q]TܷSnH 9e<=/ C;:ol{sVV\UrWopc}m6.67RiM|qѦ-gz_Ҽ|6O:teձr:hnSݾy_Ib>`fs jz&%8@) dVs%Wg|axX :OJ2z)F1)B+U42' 'wh3O9L̦uKmU;]g <~Fjj[(4#l~j smYvc7NNHn$Ǹ_DɕiN o(w/ݿ滏NjFmM/>pdgtƅpzEaI爚<2YKу`DH(qtAިUZBGS \,tI 'dP@rEGyNԻ }+Я.׫edUb5e7 /oSZ1RBJ'WTG!Rա˻t1rv~ɐxCg=\Rq7Ů[YR$:m +,:[T.AZ^63Y+Eel]Mb`<yf1&6NدuWӹExVtkY{3\~۩gč{A9U5P6> endobj 591 0 obj <>stream x9ipgv4CI#{h]0#FFF#`A3,#3ZˌW^@Gr]r%r"0"vk֎5I 8 ]iG 'q*?R)o{zEKPS'XMЙ{ȼ5u 4-" z޶ [R ]yοȾNdXN2y$;${æ5 2omlʴ+7vLTtSWw>ȣ?f#kJ Pw,Pr<~K"wppZW<pKS Y3?Q=b+Sp^k ;aj.BTVbSƱI- #O 7ƈxIͦ$ɡnc y59EWS'yaGQuz4z> P R]kmMuUeESVYR1 ?OܜlGVf==f9S1%9ɠi5,C 9ԹN3X2AgNL>; *9h}s;E/&7F!h.U&6Q^i?N3}p[4 7tO=}I%0h2bX7:DfM! zcIlq4߯:Y #"6bO(~-$fM`Dd:VeGb9/JUvq|gGNAfsp Gw 1Qq3؈C> @s![.y.֘5g2)u*e0@c~;Д wIq¦ D1׵+z U}jU'NLU+GD=Ґ'KZWTu D$t&ݼ$Si'8O E؁,dXjRtTClM< V-_5(ľoOpMbS8kX8>O8168jK[ :}A wZMK98IL!^zZN,t ފxn5uTO7:JtKpr@> ]8aE22)I[Hz'%S"rc4MLL\Y+DܑV_q`F\d "W 'mQ\&0 we͋Wl*  K8P;cKI z $nn$Kb[D\En C"X<$+g9y| 1 UkS*aAAXg8%fcH_gVgoEo~ꒅtt}x:*=O?-?pp (:݇CC!"]zrW+pWJHWZDhJESJ \%g ?~,>x- 2-K-Lop4yb?`QwS9I\/wP`z6օL~KxBO `_37X}#=s| ~o_FÆOz=ͼ;ߎD?As|#"͑`$h9OON>3c2NjfR SMTiS9ƌ,cZhڌ&ΜbLM1$%huդ)D%mJL/CMP@*n$6A oAYzT=zKdK346Vϥ <%,ZV9DL0d[evO+$Sbäo~ rHҀ 9.׷!2zdI V9bЧ7#LTl$rwc)]ڕk"t@Wk핻]jʢ6-./|h) M(+u|,^ |<l if "I+g͟GZM BRRk^VP?mrh$C6gQGǴP?/%ܗ!zХB\3]۹WS:}]j]] DJ%ⴂrKlۭLdhu$͖TVif?yb剳e }Էs~糵5kj==_?߼_SoX\勮t>գ_gw75p6RGѓ %;ۓ99dh5tj4س> *uznEF2רlqf/胣e!2T(iy8=xSfyB1#v'B [k5?;E=-gs9EfkyrwTgi[,&6֢4"SZV_k(Vh6fF7kMУ1Z\:QJL?26BܣeD'VYH誒%j]_=rW;1p&Lfe2IK ƪ鶵F3^6BXh[9+5[lf5[9Uci(0W6fƜȪ5JyYL3$w=d$\:=W ) 1 t<#ZfWF{̠ ,6Y2X越EZko]`Cۚ[l2j`@1if4 vq6آ$fvF13̆vΟ&ղuP_Dɜ7qi`T'#C5[t: a&: ^2c0trGGFG=c"H n9*sc#\XhD׀H_x9!ٷ.2꽍?"p*dMfnn'Y}7"hK| Ys-n[|w%0S-Y?7u8D)f `1XTEکhaO%lO=܄d -Xƾ o@흠N`]`f N`ρ}HSVGb2K֏~<, ƊAL*bo endstream endobj 601 0 obj <>stream GPL Ghostscript 8.54 PDF Writer \376\377\000M\000o\000n\000d\000r\000i\000a\000n\000 \0002\000.\0002\000.\0002\000 \000t\000e\000c\000h\000n\000i\000c\000a\000l\000 \000g\000u\000i\000d\000e\376\377\000s\000w\000o\000o\000d endstream endobj 2 0 obj <>endobj xref 0 602 0000000000 65535 f 0000506383 00000 n 0000643056 00000 n 0000505229 00000 n 0000484732 00000 n 0000000015 00000 n 0000000696 00000 n 0000600842 00000 n 0000605394 00000 n 0000602004 00000 n 0000625430 00000 n 0000506449 00000 n 0000484874 00000 n 0000000715 00000 n 0000005207 00000 n 0000602978 00000 n 0000506488 00000 n 0000485018 00000 n 0000005228 00000 n 0000009088 00000 n 0000506538 00000 n 0000485162 00000 n 0000009109 00000 n 0000010964 00000 n 0000599229 00000 n 0000506579 00000 n 0000485306 00000 n 0000010985 00000 n 0000015988 00000 n 0000601938 00000 n 0000506620 00000 n 0000485450 00000 n 0000016009 00000 n 0000021624 00000 n 0000506672 00000 n 0000485594 00000 n 0000021645 00000 n 0000027989 00000 n 0000506724 00000 n 0000485738 00000 n 0000028010 00000 n 0000030022 00000 n 0000506776 00000 n 0000485882 00000 n 0000030043 00000 n 0000031800 00000 n 0000603203 00000 n 0000599377 00000 n 0000506817 00000 n 0000486026 00000 n 0000031821 00000 n 0000038425 00000 n 0000599905 00000 n 0000506880 00000 n 0000486170 00000 n 0000038446 00000 n 0000039102 00000 n 0000506941 00000 n 0000486314 00000 n 0000039122 00000 n 0000044131 00000 n 0000506971 00000 n 0000486458 00000 n 0000044152 00000 n 0000044395 00000 n 0000507055 00000 n 0000507023 00000 n 0000559314 00000 n 0000486627 00000 n 0000044415 00000 n 0000049399 00000 n 0000559344 00000 n 0000486771 00000 n 0000049420 00000 n 0000055066 00000 n 0000559405 00000 n 0000486915 00000 n 0000055087 00000 n 0000056436 00000 n 0000559455 00000 n 0000487059 00000 n 0000056457 00000 n 0000061475 00000 n 0000599679 00000 n 0000559507 00000 n 0000487203 00000 n 0000061496 00000 n 0000065938 00000 n 0000559601 00000 n 0000487347 00000 n 0000065959 00000 n 0000071169 00000 n 0000559653 00000 n 0000487491 00000 n 0000071190 00000 n 0000075679 00000 n 0000559705 00000 n 0000487635 00000 n 0000075700 00000 n 0000080990 00000 n 0000599833 00000 n 0000559779 00000 n 0000487780 00000 n 0000081011 00000 n 0000084961 00000 n 0000603127 00000 n 0000559867 00000 n 0000487927 00000 n 0000084983 00000 n 0000089604 00000 n 0000559964 00000 n 0000488074 00000 n 0000089626 00000 n 0000093540 00000 n 0000560026 00000 n 0000488221 00000 n 0000093562 00000 n 0000097354 00000 n 0000560088 00000 n 0000488368 00000 n 0000097376 00000 n 0000102352 00000 n 0000560150 00000 n 0000488515 00000 n 0000102374 00000 n 0000106584 00000 n 0000560203 00000 n 0000488662 00000 n 0000106606 00000 n 0000111463 00000 n 0000560287 00000 n 0000488809 00000 n 0000111485 00000 n 0000115364 00000 n 0000560360 00000 n 0000488956 00000 n 0000115386 00000 n 0000118900 00000 n 0000560411 00000 n 0000489103 00000 n 0000118922 00000 n 0000122914 00000 n 0000560477 00000 n 0000489250 00000 n 0000122936 00000 n 0000127258 00000 n 0000560543 00000 n 0000489397 00000 n 0000127280 00000 n 0000131473 00000 n 0000560596 00000 n 0000489544 00000 n 0000131495 00000 n 0000135194 00000 n 0000560647 00000 n 0000489691 00000 n 0000135216 00000 n 0000138042 00000 n 0000560709 00000 n 0000489838 00000 n 0000138064 00000 n 0000139752 00000 n 0000560751 00000 n 0000489985 00000 n 0000139774 00000 n 0000145017 00000 n 0000560793 00000 n 0000490132 00000 n 0000145039 00000 n 0000148498 00000 n 0000560857 00000 n 0000490279 00000 n 0000148520 00000 n 0000153400 00000 n 0000560908 00000 n 0000490426 00000 n 0000153422 00000 n 0000157129 00000 n 0000560992 00000 n 0000490573 00000 n 0000157151 00000 n 0000160205 00000 n 0000561060 00000 n 0000490720 00000 n 0000160227 00000 n 0000164765 00000 n 0000561113 00000 n 0000490867 00000 n 0000164787 00000 n 0000170425 00000 n 0000561175 00000 n 0000491014 00000 n 0000170447 00000 n 0000174838 00000 n 0000561237 00000 n 0000491161 00000 n 0000174860 00000 n 0000178184 00000 n 0000561310 00000 n 0000491308 00000 n 0000178206 00000 n 0000178969 00000 n 0000561352 00000 n 0000491455 00000 n 0000178990 00000 n 0000183051 00000 n 0000561405 00000 n 0000491602 00000 n 0000183073 00000 n 0000186929 00000 n 0000561478 00000 n 0000491749 00000 n 0000186951 00000 n 0000189950 00000 n 0000599160 00000 n 0000561551 00000 n 0000491896 00000 n 0000189972 00000 n 0000193284 00000 n 0000561615 00000 n 0000492043 00000 n 0000193306 00000 n 0000197833 00000 n 0000561657 00000 n 0000492190 00000 n 0000197855 00000 n 0000201281 00000 n 0000602708 00000 n 0000637560 00000 n 0000561741 00000 n 0000492337 00000 n 0000201303 00000 n 0000204908 00000 n 0000561831 00000 n 0000492484 00000 n 0000204930 00000 n 0000208526 00000 n 0000561904 00000 n 0000492631 00000 n 0000208548 00000 n 0000211699 00000 n 0000561955 00000 n 0000492778 00000 n 0000211721 00000 n 0000215046 00000 n 0000562006 00000 n 0000492925 00000 n 0000215068 00000 n 0000218082 00000 n 0000562057 00000 n 0000493072 00000 n 0000218104 00000 n 0000223716 00000 n 0000562141 00000 n 0000493219 00000 n 0000223738 00000 n 0000228308 00000 n 0000562203 00000 n 0000493366 00000 n 0000228330 00000 n 0000233324 00000 n 0000562278 00000 n 0000493513 00000 n 0000233346 00000 n 0000238435 00000 n 0000599442 00000 n 0000603265 00000 n 0000562364 00000 n 0000493660 00000 n 0000238457 00000 n 0000242066 00000 n 0000562461 00000 n 0000493807 00000 n 0000242088 00000 n 0000245694 00000 n 0000562525 00000 n 0000493954 00000 n 0000245716 00000 n 0000248086 00000 n 0000562624 00000 n 0000562589 00000 n 0000579021 00000 n 0000494126 00000 n 0000248108 00000 n 0000250983 00000 n 0000579096 00000 n 0000581285 00000 n 0000581215 00000 n 0000581250 00000 n 0000583948 00000 n 0000494326 00000 n 0000251005 00000 n 0000253473 00000 n 0000584058 00000 n 0000584023 00000 n 0000595240 00000 n 0000494498 00000 n 0000253495 00000 n 0000258865 00000 n 0000595293 00000 n 0000494645 00000 n 0000258887 00000 n 0000262917 00000 n 0000595346 00000 n 0000494792 00000 n 0000262939 00000 n 0000266636 00000 n 0000595399 00000 n 0000494939 00000 n 0000266658 00000 n 0000270173 00000 n 0000595441 00000 n 0000495086 00000 n 0000270195 00000 n 0000272384 00000 n 0000595483 00000 n 0000495233 00000 n 0000272406 00000 n 0000275254 00000 n 0000595525 00000 n 0000495380 00000 n 0000275276 00000 n 0000276728 00000 n 0000595567 00000 n 0000495527 00000 n 0000276750 00000 n 0000281862 00000 n 0000595609 00000 n 0000495674 00000 n 0000281884 00000 n 0000286940 00000 n 0000595671 00000 n 0000495821 00000 n 0000286962 00000 n 0000291829 00000 n 0000595735 00000 n 0000495968 00000 n 0000291851 00000 n 0000295920 00000 n 0000595799 00000 n 0000496115 00000 n 0000295942 00000 n 0000300157 00000 n 0000595872 00000 n 0000496262 00000 n 0000300179 00000 n 0000305866 00000 n 0000595914 00000 n 0000496409 00000 n 0000305888 00000 n 0000307521 00000 n 0000595967 00000 n 0000496556 00000 n 0000307543 00000 n 0000310789 00000 n 0000596018 00000 n 0000496703 00000 n 0000310811 00000 n 0000316299 00000 n 0000596069 00000 n 0000496850 00000 n 0000316321 00000 n 0000321144 00000 n 0000596131 00000 n 0000496997 00000 n 0000321166 00000 n 0000324362 00000 n 0000596173 00000 n 0000497144 00000 n 0000324384 00000 n 0000327871 00000 n 0000596215 00000 n 0000497291 00000 n 0000327893 00000 n 0000332897 00000 n 0000596268 00000 n 0000497438 00000 n 0000332919 00000 n 0000335939 00000 n 0000596330 00000 n 0000497585 00000 n 0000335961 00000 n 0000339409 00000 n 0000596392 00000 n 0000497732 00000 n 0000339431 00000 n 0000344497 00000 n 0000596445 00000 n 0000497879 00000 n 0000344519 00000 n 0000347417 00000 n 0000596522 00000 n 0000498026 00000 n 0000347439 00000 n 0000353449 00000 n 0000596588 00000 n 0000498173 00000 n 0000353471 00000 n 0000355364 00000 n 0000596650 00000 n 0000498320 00000 n 0000355386 00000 n 0000357702 00000 n 0000596701 00000 n 0000498467 00000 n 0000357724 00000 n 0000360906 00000 n 0000596752 00000 n 0000498614 00000 n 0000360928 00000 n 0000365775 00000 n 0000596803 00000 n 0000498761 00000 n 0000365797 00000 n 0000367913 00000 n 0000596856 00000 n 0000498908 00000 n 0000367935 00000 n 0000369994 00000 n 0000596898 00000 n 0000499055 00000 n 0000370016 00000 n 0000373987 00000 n 0000596940 00000 n 0000499202 00000 n 0000374009 00000 n 0000378598 00000 n 0000596982 00000 n 0000499349 00000 n 0000378620 00000 n 0000383974 00000 n 0000597057 00000 n 0000499496 00000 n 0000383996 00000 n 0000388630 00000 n 0000597145 00000 n 0000499643 00000 n 0000388652 00000 n 0000393510 00000 n 0000597207 00000 n 0000499790 00000 n 0000393532 00000 n 0000396461 00000 n 0000597269 00000 n 0000499937 00000 n 0000396483 00000 n 0000402280 00000 n 0000597311 00000 n 0000500084 00000 n 0000402302 00000 n 0000406272 00000 n 0000597375 00000 n 0000500231 00000 n 0000406294 00000 n 0000410776 00000 n 0000597428 00000 n 0000500378 00000 n 0000410798 00000 n 0000416448 00000 n 0000597514 00000 n 0000500525 00000 n 0000416470 00000 n 0000421211 00000 n 0000597576 00000 n 0000500672 00000 n 0000421233 00000 n 0000427359 00000 n 0000597629 00000 n 0000500819 00000 n 0000427381 00000 n 0000430896 00000 n 0000597671 00000 n 0000500966 00000 n 0000430918 00000 n 0000434366 00000 n 0000597713 00000 n 0000501113 00000 n 0000434388 00000 n 0000437014 00000 n 0000597755 00000 n 0000501260 00000 n 0000437036 00000 n 0000440437 00000 n 0000597797 00000 n 0000501407 00000 n 0000440459 00000 n 0000441534 00000 n 0000597850 00000 n 0000501554 00000 n 0000441556 00000 n 0000443269 00000 n 0000597892 00000 n 0000501701 00000 n 0000443291 00000 n 0000444941 00000 n 0000597934 00000 n 0000501848 00000 n 0000444963 00000 n 0000446822 00000 n 0000597976 00000 n 0000501995 00000 n 0000446844 00000 n 0000448036 00000 n 0000598038 00000 n 0000502142 00000 n 0000448058 00000 n 0000449729 00000 n 0000598089 00000 n 0000502289 00000 n 0000449751 00000 n 0000451497 00000 n 0000598140 00000 n 0000502436 00000 n 0000451519 00000 n 0000453062 00000 n 0000598191 00000 n 0000502583 00000 n 0000453084 00000 n 0000455001 00000 n 0000598242 00000 n 0000502730 00000 n 0000455023 00000 n 0000456765 00000 n 0000598293 00000 n 0000502877 00000 n 0000456787 00000 n 0000458406 00000 n 0000598344 00000 n 0000503024 00000 n 0000458428 00000 n 0000460177 00000 n 0000598395 00000 n 0000503171 00000 n 0000460199 00000 n 0000461972 00000 n 0000598446 00000 n 0000503318 00000 n 0000461994 00000 n 0000463646 00000 n 0000598497 00000 n 0000503465 00000 n 0000463668 00000 n 0000465552 00000 n 0000598548 00000 n 0000503612 00000 n 0000465574 00000 n 0000467380 00000 n 0000598599 00000 n 0000503759 00000 n 0000467402 00000 n 0000469172 00000 n 0000598650 00000 n 0000503906 00000 n 0000469194 00000 n 0000470721 00000 n 0000598701 00000 n 0000504053 00000 n 0000470743 00000 n 0000472547 00000 n 0000598752 00000 n 0000504200 00000 n 0000472569 00000 n 0000474437 00000 n 0000598803 00000 n 0000504347 00000 n 0000474459 00000 n 0000476247 00000 n 0000598854 00000 n 0000504494 00000 n 0000476269 00000 n 0000477784 00000 n 0000598905 00000 n 0000504641 00000 n 0000477806 00000 n 0000479633 00000 n 0000598956 00000 n 0000504788 00000 n 0000479655 00000 n 0000481345 00000 n 0000599007 00000 n 0000504935 00000 n 0000481367 00000 n 0000483014 00000 n 0000599058 00000 n 0000505082 00000 n 0000483036 00000 n 0000484710 00000 n 0000599109 00000 n 0000603464 00000 n 0000605597 00000 n 0000625634 00000 n 0000637764 00000 n 0000599316 00000 n 0000599593 00000 n 0000599759 00000 n 0000599999 00000 n 0000600064 00000 n 0000601396 00000 n 0000602405 00000 n 0000602883 00000 n 0000603062 00000 n 0000641491 00000 n trailer << /Size 602 /Root 1 0 R /Info 2 0 R /ID [<72C5FB8F7A9816300C8FDAF1AEE0AEB7><72C5FB8F7A9816300C8FDAF1AEE0AEB7>] >> startxref 643544 %%EOF mondrian-3.11.0.1-R/doc/mondrian_technical_guide.zip000066400000000000000000014264351261646570300222610ustar00rootroot00000000000000PKr6[w,"Mondrian 2.2.2 technical guide.doc}]dvVzn^!$!褯MwCutόKgz<lgrtT)S5=u3/ b !!("/ $H H 󭟽tۮ:kkϿWs__z_}{OOJ߯Wt.᳍}|~>᳏>sO#|>G|>}N_R?7#?Kǟwto>N[g?_Wfo[O}SπEyW3jo}T/ӪIo^?+Ґ箔hT;WJ=ysJ]o.M6Kg.2~_d2ߦ9xO57POvJNzʵo?7 ~~L?_7?_b4.'J$o] /(oq]O\5g?k)|u_RMt}tr돮J^/ܷG=߿G?Y7=Gg'o'wT)sokַJk?999 ӕdz-ζ*Z?{Jo74xK5W9 g᷼T*ӠuΩ~%Q N❇3T'H~8V8[xQtzIMh4疦OϼO}zӻ`pg{ާ-oQX(k7צ A' < Oz};XuuT`T~Z"7 vG~:3MwBp7!ɔtt ;[A5$p8! 4z8xI/̃8!=H2HzA{ _'#\W0+c{ѹ׋ O;iL덳hbEX j@oLt zI V''"2sfpmB,[QltS] gQ*~! ]F2!HD M-@zu(PKc2^1LQzU<3`pt7=&,3MxbK"v<^7AC'Q{ εj+cXdY;3]h`qX=_$D'-I*xKB_fg~4䒑cݏŽu{a;_K\a: 4kK|b>p^a2 ,~o5FA]UcmL_ShKcsȁrZo浮+W\T6;C~L 2Ým\Y\f h,GxA+hڕSxgg`V̸A؂3A? ? m4“F{uB,6XÝH#v10:F~9Y#R V,!!szlXX\P<?@У~a8ƤY9¸KQt 1Y.V 1nb${Ӄ8#`@n=k,g+b`r1%(p[r!&lElܤYv?&ˉ#miƘq'4u2)H0c^YA[Ī.:|q޶4V<{zHcs ژx;/#kD*^0U#cZL 3o5; Nj&*7T*Gg }8 GӠ)`Cnn3ZДIwCdTF@yMz[mSCբzyk"ej7-'5" 54EuϺ?~q|oyeyai/&cG?@;)" Q^8{bm s`W[$+4Pt$js;yZCC3ߒFU;[(~m֛G߆&e2"0*E @þL8%Hr۽U gq5Oc*!&O +d4+4#289] c=֜!4h{d i.'^,Bh;K p~V :Z˗N9[' V$$BF FD0"43@ɡyV9*0:qR^xaE*2vaBVf30;'xfu]hDpubtI(DAOaYy7Z~Niֺǃ QrBx҉ω4Y[4 / Y;:z:f~MZ0CD!.p$ §Y {a2q2z%A#K5n{GuVL1ͩhx`~N8HA[Cf{DPIwX<G̝0ӑ!7u7!/Irw*Ai0dYhƁ僟0Ac9e1=UTVAҞ+䥎j>BL^EDl%{EDH RtydOΈ(-UT}mOp q! a5G'V#k-ic]u0Ӥmlj2 &ԗjسygp$eozki21@]4fS7ٹFEӳ*R.qWAߒ٣qa€M@%12tCGz`OITO--QAn,ݮI`=Di)kf"0z-"K2c"U(@( Xی >())Img p8^pV3YCbmGSw4#L&Web6g U` MyIZ< q3͜xRw*J . U OҞ5ρ]IbErƮÍ&"&ђA8PѨg։bH1 Xn[oOv૕wS9 uĜ jiaq&rPJ6L)? L=Q -,Fnݨ+EkGƃ0DCZOLM?IsT38U4v+bD^ 1:\.Lnq;LpAY*Qf*"IҴ~fgAg-D rʲN</ 5Wu8e R6 .喾/48em>,v>5|E1AseYx@Dhʺ O&nAQYZ⺀qHjKodv<8!gūs(m q0a=POvd* h"5BZzɄD4g?~"^FO7UQR| sF>d5nS(7`%%$eZ"1@xH\m.ZN @'GՋg3iഥiLoNxCُ{f]8#4]-Tj?Q6J_ʂ[;h{~HNG>P^>>8ܪwy#=o{/zkhV7^)v=>ȴUGHn;ۿÑlmV-:TD6omZ'(UqalU;!j}j>ڣ:7"xx_Rϐs@$i GME-ʴ%tt6C S铄D ԴӑtR؈I(iq ކ7x {[8#/Uc$]²PfCdI\Q#wcg}CICcX{OЅ1\Nb\ֽG[̵xGJ#@8 kB>۩z`{zTUABlͯ+X~$<[[m:"@E } I@NN"b4*{[wwnq|T'([vRem>82aw`5&"tI9DHz8[{6Jm~~-=[ M55oЕ퓬deSXEM~'|#pѹ5ɞ劁(_+'"y6Lܸ0hE)졖b z$\Gcj-'6:0 㓢LI$MaSLYsMMGnv ڙT$ԣdaIеXSf1(n >-H`" JރcɩB4!PRdۀ)hkETLLfQ7vвHڥH#LT( Ӝ(.fgTQd,i''h.@'ʎn54B_f sΉZ . .`GMV YoVbv:/wUI9!(- >RoͤUKj9Y m(N%Kc}V OImN۠5'#=&Z Spi稏S3ӒuyE@dǜBDkVXTo,nz/8M$ĊM :&ILRE?[}47ŤHEl,"ҭA!.N+RT,(2#HE]V&nX:e= ҼA^|z~XF1#x6>+jͲbI& e$Z$7)sT{O&9.5sf]v[;Z Y!ϒ@v [šdUN W`nF& lDwʇ[-V6AQ2s )%2S@ux/eV$@ƶ 01Z$V)a"i[0|CH=3'fkurF%rΔ0)bCj@C[Mֲ=n 艎6L8{2- |fZF,~ҍLt:Hr" -w%ycdNH?|njfgXcTӣ۪W9K*i`im ;zӤ?[\D QdR){I)B6'9t(rjH|DIr4>:ܠ8a,%C 6lY5.<*|:"R~뉐ֵBgNi 920:7~VMNE11/f|`}$B24Xzg岆ʛX2/||!ۨjuauTqs.n,(/Wk)>'IrymzbQl}Xo/V/$~.-,s ?Rv]'ťjdqfyeFy3doB,HK7ʫ@bwaѐrOĄX-/VM\,uD=> ;`Ol1zDH2 ( OXB0Wm0j8a@X9Ov )PgVY7I." j9jP9ZEp UG9WW24j#ʮfl +;<9vF`mdR$hX͈f%G琚6hV$%pj4ɍD6y>;Iv͛5t;yGvSEAk0l\;Hh3^QԢp Mz,'Þf=bqkzi'y¾ZҹԜ %Ez% ^#Uc&>zlW𔩿xvi4[E}YdhC ^F@VGTfvu7A..4ʪN]AU[D_D^wRp9_ fuU)ZJDG p npGb#7tN}Yu Kd1 nnh׹ѥeݺcf v>\xpdH =AޮsiAkPmǻgq%5@g&lƒ@9+jN /1LIutcyIg ;q9,gIǝs4$^oC,} 8vuąbijOqf᱄2=7=p'F?ie^4T*EEL~+ `ON]{ϲ0Ƅg ;3<ӳ8xPՔ͐mG[uV<utK&:nRS$P&vtxu6>Y~zy/(bV9R; U!q`ɼk,`AG@>0sqI7ʍP}ݬ|(ie\zdMՂ1GƐ!+uY`PH;n͇_R\ h1"WKLe5ǹ8¨!yőmoe*_;`#ˍQASx,qXXg:1m#7cQ8hiϏjjOsިTO]F@pZ1Lb#^AI>3C9X q+US.%Q/`Ä:DY@2?6%g;aU5iHub5O\}]].Ck󑝱@s6D'+j8rW$BbmR ׷R OaԌsTm,ayH9?~=9 P=Ҷ5@p6hfw¶]}j洘@w!$➌Qn ynt7ćIm#uàI{?/wpU`ZgNT*9f땱XDc6FDP3b䳓㜚s5CymS;hN FӉp6i͉';s:]jO;%mDPu4lr[;u;{˖7M`mB+%}.F/KNIa\2B b|;:@Mk1P&dȋn[l:;S3wc,6`i;-{>G7W|[/ʑPcz&e0+zXӣ.qW77LLo uUH4I:H|*8Q"vUEsYfBMFI{^߫!Mu"vH̎"{gdH]fp|0KvJ1C8؈>9ed djbS'M9f"ddM ff8cO1a. $ֆwۅDQܢfq?5kWɽ O=8/W#AKgzj#8z۵Bۈ. `}=Oá?=!aLJI7aO!{"=H2g?yYS r?gg(qQVg {n^'20 Np gs͕dnzgw8urN~`X>tq4&:lM@W1kE~3#uh{<$շyM;d@L ݮ;M]:!N>n4ZO= $hD:W-zA׷3M6OwK ] *|*dCė[3$ Smӭ G ٱtfegn3%<䠠 b0;;h#*]5 tJ|*xEbS̥KIƿBrt lҵ\֭:gO7Z~o_S6YCBzumoy11ǮL Ӡ \}=)/ɣ{[c:s'!\ Hot=knOUV-u,`UNeTx/3?U$[;[ؘK~V!~ U/NƊ>M|V7CdbwwO6y3[^͛pXHӸX'<ta>B(}lAf(*ej!3K ck0ggo3~7扵Go; &bר#2hܼVUn3>}Jfy/K&&_\81nԗLdhk-lL7 /5?wHd虺~&SߧK]/׹8mHEzfsIC*Ӿ0ިG.D"!ٹnYM~Ib:GO.AdIżWuIQƍM'̣()aY':aXL'`Dž.G#adltmFx] ܂ُsKqZGwF$u[yd]:=:,V)U F_) 3d݄;l֌&54ϭlY SyM3{/EB_M2Qa[tdvG,g$ |/p^]a 1Z~W{L Cqhf9זqٷX O{ϒ\x$t.džKD$P\SUTw"XG.mS{̀d> VUnA z=b^c_0Ɏ=~Iau^ӼL c_37fQʠf󿀵2/9BE~V+,O{͓L/b Qjӂ^~ p)C\Zo0jq? PÞΜm4Шߣ s]ۃBNzy^9*XVHbOWvxd7u7.9rDHսnIRϓ"|*ICi&۪()x`fR;c78adIVQMMGV(O87ӴChM]\A.=h;"[>ؼz>}ZL9naǥd*KӾt7e%FQVw/}]:4MWyw ;ǩ%MH?̨䬞V"0e" L~ ޛ2<7 .8?hJ`8Sāsc$D)+bzջdT krj$ǍuFHMu7a !%4|޿z eR4sP(brk]@YNB.X ^ӎ|ftϧ W}X4iaBn䰒|uhb9~jd"?VZ5_.ODl7&h9_˖ߋ \&pް{7|gI02ߛJ%\}I;+#l`7ݧ=w6=ёSoj DKI˕ݴ}ݱkq}=INʦ_hj8:2^fd ƚ\qIN ~Z!?\:53Uyt}:O{^>PȒQ:AI\paj:d|"]E; m8@Jf7f\}Ԫ&}߷;iDB VP+\Qyn~g;p=DZtjˀUHd EZN5ˮJͬ''0Q\e!hT>iRX%Ut@tqݗChvag nf%:}tL\f&tK\jSc@NlLl9]e#Q6rdڌ%wdl3eR=;Sέqh^*FVéeȑ*GiDz|((}z* ً֦e f"x^&ns3;e\cu&W>GVe'jV1:|?n+?y*=\ZuN~#9]F'}N-)~i.3zjLT9MIQ'zdм](BXsG,5hP)E2/Oǜ8v?riԕ NP_ov́p{0d=nC{4:$#V4"3';n0ArN'"g9Pf쳣<'7ۅw!ֱH(C~48t=N8,*|:lI;sX?\w8eLg__e+âzPܳmsB'4iS0L2.غ^#Ɩl>\sʿy;moL9S9 @=j˱SSrӳz5g_UhOerygtD=5TdSw18@;ՕހՊvB_=O/\w e=؈"ŧ~dԁMz5ɶzY+2䆵!J~A7Jm/@d8K~[){=:h\N4vײEF1<\= )٨)sg:XPt -N+lrۊGf16z\Aqڬot$fg`|ФO5d#uF/#3zlQκ{aOS67m{5y6կyjF\^%G'Jqw2tH.Hʄ&ZX?~m) * -%ʈwO^l} &wM]ڣYCOfe71M2/ocMi~_୆c9"χڦk0dIn*B҈&67ɡ}O=_e!ž`17ew>t]+gv*I 4̘A|$FjwM}Y8<3\3(k bY2BӜ+k ^ZutsfpP6cE?mdйcS`ZIhB::cVA?Ѩ9{Ӫg$̒sg%ͽ&K N.5n7G ^ V- lN6hg5{MYg utĄ ]E"T&MQ wuۆU-ׅ@x!Olwڮҝlw#MJ~^``9X;qR45\y~V/fi/YD_V]POrV?I*7K",bft,REHZo(=㛅֡#G˛"'E p[1鞱52lvEJ8jp{ZQƻHZS¾TqwOȽ\}H0;⹅am-ĎOx Ws' d"FLo Kc6m'XrKNˡܻfm^y(b١O|)ݩC*\30]?!Z6gg)E%m *hsnգs snGnEQK, Ä|$:5)t"G]((,xEٚ(cNvcL>Yc RH8fAI l<ޞ;; 0I笚wRie 6&ކPo4Yj.L1r" "q4iYiܜWX\&Ԛ77w66EҗF=o$6>!ӜyMJ<}[sFn|ZK 6}MI%E) /Q0nQAݖi~~yJ&)Mx5BUVUVVV^JlKmlY}.ǧY1yCY4N|ϊUjUDY A9bn)yƣTm4@+;:cO' zP6{d ]uXxvR_=F``&o7޺; M c`Z~CھF?Kՙ2o@6JcuPHQN-@oSAA>:GB ,KfY)y(@D}ͱrgnAM=v PPP!`~fΚy^zy,y]H])ڔZ]7!RM]8WıN{c;LnbTZBXiS`ٳM i(z4e|6G>)j{՜pI $z2ѹKO%E퀌WYE*w3b-}tV`I[ϹAF6/)QZ"fv!oZ[VXH@. 0M,؋Opz"1Y/:C74mU+̎s$dù^'z s嵾G5X,K0|DL㵹{d J889]K1x#3R<D͢9oYqj' ģSZ'm1|{u!5hXT+J3;આ</~-O~l$<;朲Sfx΂CQ?I?){)ƫ~9>r73 EjO]ٱDV_\Q/TNE>wC2v`]:!b3I&ɥA$$d(鹛⸁Q."El>dq+ť,16K|c aP;+k0zlB‘ÑPl+c MC꫊iV`#]E뺚872Z}feO* ƺgh+\&7+mBW'FxȰt4Ac i*.2:Ee:t[NlΡ ͯs׮,g3(FȎ a[?zٮ3EWIvɑ GW Ya=疿͊$]^V~ĜfG7E:jh&lji(`IUl+9YO|i5n}x|$_s( pK(jLiKσi rkltq=h퐹5s#ɯBlYd*&o| $lQ2ΦS2DxPnn n#z:c8pyzxcepˀM,tt׃˜FLH`r"& OTz0XzY-bWXGiNfT_r:^uvuGhE2ZL+\LXs`(mۤ*Ec&0*e͊ ,|Ruz~9LjD؍aJ۱-t8s,[ZVda2(\ڡQ6L7#u\P~H {6MgikG.˩=9 ;F&JkfH^f{i:Pw"W֚L2j5++ rPIvQW )@Qz,Vau1{f~$T1VdN ;mGئۦ1Auƙf[\*4fk g i߭ys6H~ $)n%=-JQGEVA ]\ˏ&T~`5%q0pO~50 ~q0pl3Sl'*s_bi_u rx:ܝήJ5S oi5"DLHaRhcZ0K 7hU"L03bid7zOR/9jfڌfxbgSxs-Lˢl郪,w<z*6^luaۤОt%XTY%9-77Ĉo}`hڒEO ,po&4Z+,ڽ(43.24;9Y|/tO>z”zŗٕ>Tc~|M=忶<2aY8M'N3b"Ф=L!EA}S`]XWNJ0i%2*lQ |N5%(^XpIDlT *Sh1&" (Sqæyz'G܊H41UR#(=?|=ˍ_F)_p-*j~[m"! \-ܢ;dL6 @,kjvE-H|| ytzl`!㪩y8[:HPjN02I\h$eCL b)^n91&Iqb&A,P̠ pnPl~Vq4OhxC0j&cLA+:*J(<%\fsp{Z+auZroZs(A }>͉7ōn"yO M;<[7|DvO.:+st8L0jdF]tX d&$&cMp^QnJ8d(ӟ. "я$.RM s~c3͓bRRwDߣ?gywߣ?K)ˤO3< _Пm5!$n6ƊY`|גHQ,oJ ٢v,>7+a*Wx%aK`}eۖbVa\ ;8'iAnS) )Bd(4nk `|~\u-H{ghI!=lm[@Fn]Zy8ۦ=n]D&'[ك+*8%O *\Df%bCAaOP^zn%^=zr1A:;cdk*资!w7϶jsJUG] LG$p0G9Y;S jpwշwyò`;F+o g[J=q0\$1!P%Yɪf)d])W7D;v>z5AՉ;Z?1Fz3͚4Z[ujX4SR+Om4(ǣxFj[hK׀~֊4zJYO7劚4!i9EEkGv̲nՠ2J 4zR,e^?Kz-Ԁ-DDΠH&˫AUkٗR-0s(rGtDn')WlCtPx6ͯ-v/6|]0W>2cD &fPJxJT6ce\8vvom ]~rG@l'U[̊ɫf>88?Ƚ>~+wޛljEԷf'|6֠yL;Ail`%ONJUW +V#g9vO( i[\{kFKޭ5qP-r'̲Q5sS\@ `fXDت{-Mp7i?Xv[P):^ŲٍF>d>t]ZuZ$9V# w_{J?2W߰}p4]#Y7(E3p f`a)B$#Ax*AP^P"c"셹80qnp BaŒ<OCϗ F9 J3J!ԛ\x]q$O`&$~X }Pe40eT2;k9ʽC9wLyl]V¶t(k[UL.D z_h0ne"g;&0}*(n: '\y$#PA`rw6t0.;C&sC@}$eZAz,`H)Urӥ]qd\627LCO]´ iPv}O+Nډ',7ϋΠ%K||U155%]鐨d ;{W,Ǫ9u.S5}m!I˼z5א\J+ܬHIƅ eo=Z߅{uuPF眊\wFvsis6q m\* ? _yED𚫂3fGWsn{,{s;p-DDN6vZ)sf؂7' l*EGВyK_#@)[E"FGrv'QKa}_XRq/l\w ~5+/? @)g XlfJx?;3SWen\r$$Z;DǏ/";\ [.Y.mݎh{˔U[.m#0ЭSEg%WA]Jl6C,*V?MX>rޒ 2@OhF` ,W.f_F}EzƗ>b&(af{H%0G4hZ*\y~7K8?"%Rtp&wziFm0FŴ٫G>Q9-NW ADƜ8{-t)bii#y.ZviXwjn 5[22[~#LjWN(ϼoc~򰹜YK/ͯɝDy^}xρ+ѐQ3om3I9Gob7bk~\Aԡr)wYX~x縿klej[~54uz~eͰQ95"Sy3PɛH-Y1"h3A[ߛZ~/iz҇`gK |ݯnZhMj0 M0hMjos-'!J 4 lP]bX{/mO\. &s86@$?@qViǶ%aݗw(a15?s %Xdc՛F~)AQ!l(Uф'_BbKGFLzL~uy_0=t UEf 5NW4DBS5Zx'b jw8wjJmE4 %V5tŷa|s .A N1$ Xh~F M0@IJ{Fz8/0ͬ jH<αG`V'Ka.llx?ŅtȋOAyp3&,5PR*Fd';c5?o#][xtBʵզavT&L bdS#9͙}mF8xԺ7DT']^pR(6^ &4q-R~&jō}NJVTM1e:kZ&+W L’xջEFg5ʄz^.V#;'g QdJiMZ$e[ݒ0mKa.3!s" mP3ѿ>= i>=upZˏdi *"$N$ZTN9yгvլ|9h¯u^A m68A.k"K= ud߫l/8n d:N]Ү6Vv2|`>!(e46k%Zzoz} !HB=vQ HS!7ĔFL̩"hpeLQ 7K0nVEp1| .;o9{__x-S%5=I5qӌ"YXì.>Y3WNt{ܠM9V%Me #+HC"{@hт+?5{şŸ'bR-f+bI{mNDd<ͲyQK?5/x0-PG- OK速`tY4޳\CLē~UP"ݓ|8Mgj4l_gQ_#xg HYܲcAQ}t;`D"Nu̶Q~2ht)q~v-)a #"tIUlA+ྯؘsjT KӲV]ƷQZI/Ry>ldN$H>!]S5^b>_%PLv0FDki@Vg]/B֪'@L#^r <.]kd,սr mDv s;׻k_J Z\O` o?&Y;MTתk]Q\Gp`*;Ns)Jaʢw77{wkY~^>=~nd{߻{H1W/Vv!%mu4qqe 6؎">dmiPqT]k'o@C`g݃?HyV\wnA6&|&ZU唞ѱ(Vrig,8`w ŸFhE>VK|*$P$F<v 26橫## >E/5fV' {Z` 5@W6! W 0BE ->ѧQJ8 6 O6bvc?T@建)#dzYV#7I2Czkڪ /.>?<} {`d-lVOw=7Hla{\t.`M@ukɜp"!A( ^%IAgP}ꙋEj_W\N;5'09KTAY^ 7*Z~4ȓzK8wfJ_eChy_gMgaÍ8RIq묀y2Ӓ:O3|k."o ZqՇP~ft~JeB{5';<tԯՒ{s:/?Y峬v(@9\rbI^\vV 5|i|wM*4oA=tR$8ɘxh_5Ll=w^'+6p_H XdDa.Qjr:f9IyFRpZ[d`t-(}יfR_$1D _DNWfonH<6v^godPm+Oom(e( bU۳ӻ=QW5tL%'3ɮWU%Bn7:UIw?1%c)v>Dp5Cظ ^0l0^Ŷ15 pυ:-XKnʺ`b nwԚIZ )(QR>A0ح~o U.,A<p\Jh"rOPiTj,K>N>S'Ӱ6sg"9ڟSN<0`,_sdkA`^6MJy,<\4EEm/.U:OR}!3 ֋J33  hRbnk$m۰͋׺\2e_8): ~- 93p:0~veH+n. g}bUkDARI; c (ʻ)[, 1K52id#\ۡ,ZO!f2ƪ|SOI.Qk8[`½ KCH_ɹ=w"bVy|Hut9![\\*Ǿtx[ت؂xe~nֶ0)KQhkv7,_[QL j󫩋(i_s0(%>@;GNN;0t0651+dgu]y)s9,#ͅ-l<|HaѠ҉ڝDծMݭL9umgl- OSrmnSƥFQA hҴdNOK%JzDFZij#8’y_SNh,g-p '%s*PcsC&-Ww'<I%GGmRv 0R1hXn!9dh4ⷜq`oX\K>]Sb^&t/[5^zѹ+>t.%WȂ' h%@_O]y u ]gOZT [Yy+伮ˉ0+t)x+e|ytN)M<++3Z0YWg5؀|,qNmVuW^,.TjgI/Ԙe% EB/1 MjբlN%_Y4"j+/Oۤϲ%A|G.Bg]{0QY܇Z46dOxRFG0hq]f!+/=O6i9A,ɿu`?\ u["ӯZPÒy~AԫGul=%fޙ SUكF_ ׿- bO,R,sFlC?al_\ -7cC;*s_UR y Us - Z@PM hOK]0>[W: 45Lɇ wS!k@{o".Xy +~ģĪjiyM6ق!m-^z*@ Z.1LX.Zaݸ+VnOOJ +$thu& a}.  B(8!prK Tʭ.-#-bLW//F#ܫ eUZW`Jza)4&g,^X% H֬g^dZ8?AgJ ɷI\ڱ0E;¥a_-&# م#P:• '^"eT+,rl/yß;/+ XR6,E6wgŽ=B݊gQł-[א_\@ \vtu%! r|Mi/`+մv'l|`#`H3Lpp1YHQ՜[ 1zGf>ޘ9!p3;=Az닟IɻlUK-9~I)VلCõRDwsrSySt_|7i݋7X GG#%Kφ冡 &~FlUt \l'{;Xrr0 1C#uk٨LapLt8IZi`2ZQ1; Zz`B]a$|muc1UxY$UId3>∴_**sC}{68y)I$R$ׂ vhM: ^zw _3eܝ<,ؓX76: 12 V>]_AB,dֵt24a$3쫧/~zM&䘁ש-Q GJ$ƹlX.۪ do3e9F7A-?|9~\伻H#| (:Ik+u40 wz0?-M%"<3 >(I(R;./n%GkR %&v4=,ғ`nzQbш͙Lٰ!E.yv1l$0*q m#T%V;+CKֵג@t0Z|qo:.MN>~}֔wOD2LHdɑF/d`cmr~g;9J)_į~7ӽ;:°;QrmlBV*^_}wLr z|39_^^ 7WS%k o!^w~OcK|N R]v}n7L?G ;ǻy?`c "Hndr1,~ͻ/Nhr<6' j޿T<>QLyL8'-G:ϝzBad}(C#tY-Ah Jݿ d􏈎}m*>,zˢC,nyb_'PWm^3cvlÍt4/EhYT^x?l 8RL>sS Ww[\uXWN"ND_SRŦIdIlYPD' y 8bD@J)rL˚RaUHОꌥ)(N3b 9( ÷;v$5Ȕ+Ż HU׈,^ i)[G/Ɩ@;c9h9=[,:wK71B(;WIdu06?Xd M<I K$9G+l@Yd=31Qj<>};HF'j;18*M+ N[ cq!Y!.J׏ _G'|l xLvqe_s88,<(dHz+gZ!}ӪA"}_ 5DE?Vpə$zΊ+kV;W[37,,ۧOv濰y*ZT/C5P?>&_XA $*`2wV@v+_lmq10|@uu5"pٔF$HB" D j>RR2j[r|  l5G Cd'~"9*y‚$Z>+&%.D:$?@7vQQ%hj)p*#2C`9'`Vl6"k[:TrA6&SKq3yЧi} 0O=5u}+̦qOz[C;G~el@PpBMX[>)S!1'G4WMbڭ˗I/r)ef|LBZ4aĕ#l% F4>E&O 66vɤ-"#/T' H3{H%ݨkDmSҳ(̯]|2)'KD3bޏ1s`:nkPSbqcT;e=)J5.=ƈV|ˉ|e+MtY3y=]=. Qc@Uqz& Ӓ5jA׎peu n  mǰWb~i6X&\#/5'Ҁ $}-ϕJ?3m1aJ3wdVHJ!KGe0UDdQ^HowDToA6ꋞ|I}-#+%[[kh֝Żr_ =@R`5t?2k- Hfx /11$qkqݖ7)*ri` `ގ,q{c:@;Tsnxg处W\F7F=+jG Ber)?c|ZdTS&qxFH/Fvv51 Ogd;'v#ރ-nڑP{[S ]Q|:;9 l*"vkgHb)hC}HR^lQ hW^'1+4oW%h/>T~ۺb>i$"}@j{0\-sEɗ\j~}ghEwޅ-(U`$^&E:B()b)W:ED L${_EO]s:+7.t%n,QJ#06} dAuK@fFM6wZJ9VE^qLg='vp8%ZQ5?$G=/ž'ٴ~ y?k=HxNhqOي+c7͗)pSpl|;DCO.{0Z%[Œ# Q-bS2Zw&%O/$zv?2\<iI.cJk[VY3M_f`؃و#baV@l:#Qe uX:J54ޢ&]ȇ_̧a>7uM흪\E,7-0A(I_-x(pW֓3zCλ!ٔ{J$>[ zl@ήee9meV"Թl37s&A;ħr|H%Mx,Ӿ[qwNӆ{{S\\jcu'N`LNPAMYxGӹb/:Y.blǧmYQ(rڇXdL)/BeM$u`d9Grð%2; /<4[ CJ0i4p6`:.LѽL/AmS㩕$l*Mp@V^1Zqmjx*M5kK[.9؎{r"M+>D7SWȩ]Hl6z7E]` fCN6%\=λBnX`PbGXCIř|5KQ c@Dd\lmYB$z Ձ?f>,rzg.Z%^.^^{sz'|lb h9^Wē&+~8;i9CZgubJ‡#8GեIL5b>bRyϨt < @$C3X]ABP3  $ Qvr&iз\:PsYUwX1&,F#|$,g@6KUFÃSݨCw$B)`pަ (17xA1F\%uUu: ){O#"^=a]a8!+p(^W$&j'juu2B20񐒤9x,j4s7߼N|7֋9)d+%xj47y>LE=gEZ`| #i^+,+pkC ɉTllA?#$PNMqɋzq[ 7ޭw!Vq G*W>q CP\F/}v&-O}@6zC$2@9Q9;B d1yvr/?%q]tC'JX{ Y?ߣM'Ì%aR6Iڻ.֎*pit n\dKEK>(i;{@ JL$ƌ؍|Pf{Va.Ud"ܹ7eg]fXkX]Mq~ߡ>c0ɌLOx:EIN oI]yQVnIHc\}Ԃ[$Ww&RX?=Np`%7_Q!/Jo*=x< ŁLP2 V\Mq.R6U \+@=]WjKc]n%z}ǎ" !TKDolHlOw`c84)aFlJNS'6xޮ4;յ~Z(_Q7oBZ[b.wR Uy+/˶Qu6:[eː4L*geVƵ=@>, (OvM a3Jk iD#9#bfGf+iPm isr>ĦqC;C)Q(A6Y]&uzxMS< ֵ|MiD=jMbk'QMs{ˆuZ qz=m|h-;U{)~HSe'-U%=:µlq%MvG9ʏ%Mn$h`zOetSY`$t;~t!YB9/=YSymL|.#"|sBY\8(V_ I+kh'}Q^莙sY/dLρTd }($uM鎤!cn'r_3S6K܉f78Gl0 ! d*B~ ?Ah/4- Y# %֡ qqmΪLJQ R4Vok% pصɞx /T ;Vq:{wVŌbz]|찍#=P^wQgVְbz=mφOz3c B,K^{&qbveXx)F[R-{i͐iԘxozJ=Gy9s:9Eխ%5˴1I<=>|9j?c'8>ţAFTڕaDbS̓:^=ñ(4G_Д5rt{Sb\[U*ӜKTam"T7ˡ-"aǯ c/sa6d6{n1aRnNUU'Me_ʁa#8d:V.ɵ@}aƸz롿_;+&S͐išfZ\ mC!_w:_[$= B)fuk-2vi-oh$ϕ/('?1 >IvS<O2?[K0&2lyǣ`Zνa3^vv`/J @|hT"4pR<,;;:E,S|IQ^-V.3(tw|L[]Q[=c,xm(3Wߥ:,ƹ>jK_ZJ_מ;$-nu'Gyi!UAI"l*Q*\MAweynbZE{]4_q3PfKubaR^hѴM$8B@K XMs(NO}8Π6Y!;"]}Bs"S29Ys`=`1!oP xoPad\w!ӰY_ԿK͌ aAVpAgڌjzKTs˺O$ 珎^]+:(Ĝ1fS[YO֓{WNL+Q;r}lس:VPɔ#UI{Q*MLPed<XU2hJ4Q/p]M 9NKҜmsH>evE_5Z^cx8aF4t;Zm3 CXC]iz%c3j9oz5&(w-( ½N γ WqHTx 5lE.Ԥ|#)hgxdkUG9Δ|Zp{KON>UuZuJ5S1gYDdTDȴ W9Z8sGGÜH[+SoF%;N iV]qv.9a !("U(Lk&Fn?cd(nDJ䞔_\&M:;ܫ{suSy@`%Zv8;-ӿu!ڟ+yҰ_sUӰ4dRE8L"K"x\DȄ6荥ً]RYזRb 2Z(o8HuӔ)/!H2;gzo@qM%2M۫P<1N^o=jcjێ|HD ԣ/\}4:λ5H>}ѩIjTkx:Nb2گ ,ulK2ߨ( AɌ\WٔoNÙrPh~ =KeiBY˕4X%q1}W{:!o).^_*0~'_'@- J6npϫS)_!OZZۻjf@ { 6c!lTT!MiL8ҪF|K/.v)OFu<!a$/>t6~?S_èCz7~gÿϰ{d?fQOu=]hV_2fs%0~nPYZix3ΰp;ᰲ7VFYG~v[^4T<ʠ5vLOKBiyl*{aW-{FS{G9߿Ű4fYIZr~hA<6 D]sEa9qEfQlex Cs[zћN_ʔA67 祁UTd ^"=.!?O4aBzbV&dXi3B )WX0J> ox|KxM  `2r$Ƥà. .Yΰ@ជ^_r}nGkb6K,#dN.h)#@cU8pfopɫ `}Q"Te݂Py! *h"h';v8D(. ڡE-i`@4'890ڜ9dA]1$ŏ)vAޢ+XrNbn4)a? qojWk~#+3HڕGYsS)x{s`S]0l-᪩?H in Mn}PcG*~67Ҳ\H|htl;!`M;m{` D___qLe_>eg#&s\NA@%^YRꂇie|K83D8gmYX}@+Ff&|p Ԛ~d6VkI.SO3ۢqɗTMP4ADqʋtp/3aI+b,Vaٿ'g|/݊{-$ELϡ@E>j&CD V31ut~66w m9F54Z]mH+H*!3DK ׾$D9tҊb̃gkEA+vbBttآNom^o OSW?ե[tN{܄}>`Di;CWS k&j=Sgќ!Y>*\k-# 07r\MȧEm [#[#>PQpyXgcXMl`mV@IWj߈<C}&BfEQKYpz$0Q <ƺzO]r^?3#Bp4e|z%pY[ v9Y3͒-NuwIQ -FAQ yt(Zuj&PvꄶBHk ;|LO|jBiY-=iXmG]S<6}"U}<[XηeIqpo>"[PAlg}[wG#x{ wIL([5նE!)۳^vɲ@ BwF?̨)fvvfgFDUVfddddd\KE5y.tZ2,˘97!:[ژ>*14-$8ߦ?%z<5a7>w$@SjQO4/fhgRJKbX 6'<<-Guq3SA||'^4Xz`iUJww!._Yʡ2n= G~h1[ v.6 :lN~ TP/[?x`h#Ȣor|eSAK~`f\!M g^> h7'?Ek1q)] ~98# bjԔ/hyXDt~ݦQpvUI ՚Ņ[J7rŦYo a-cJLﯶT!gx}.䲊"*'M(~Ř7aF %dnFhF Uw$a9'zbtVنk@,z2- ͹A$IV,DZOҝny8,A;^ci*En}+rdni^v֬vL?j^YQ*I?YLfc5&9c nI&d)j?:(88׬1٬9,ΎY2"Ji N*9 U(ـx7nM' nB:MKM\r^yCz*1Քv0~37iPR5_2DX!]K]}Ujj5zQF4\ƈH*[cA=W/z&\ !xJZ)5UHwن漣!$iD q[[l]J)*bЭ#&uEy/}z!o x^4x#t$  %`Q>1xq;jk#R[dd}?chrXR6~(f_ ~1:tS@TlnE:mO+y(Z R8LtHEG+Bu*؛ĄB7m **^$ypSE[z(?3QC`{W~slhE8&'6O"lRGHؤ>Rؼ]J/ɈbJӝ~ >M,q<h:XdL@$r;S˽hGD;[BL1)Ɉgر|xxk!dJ6:qUikHl3Ub 8V3X]g4Uz(bZlDcvj1K9!҉UհZzX{GAk۷r UL`b$:$`Wګc3ʫ ~s%C OAXhjaJ1,W&'ںUx{`yyNuJR/APjo41f24:W;ܚ6.7*D/u}aD)Ygҕ-auНVRT#{VoA(p8+S.6ttSTQ-ήrR'+vOۼ Z`Rɋ*- ˽׻'{- K2I.^<9xy]>9xɳa 'wZ2pwvɭM_ܱovsf0Ydm+vhIoF$q]қGe[8-?ޤ$E&/Ee)rͯ=ruVىM1ۼˁ$rdkqyX@SN2\+SݟnVe) *fGȨg]N\6o*Y=4V5ъHw/Hʟ njn.n؛2 o+ MjMܶBQ;QԀA HbvHby*YʻNBcPiz!%By*8)z ( JlPt #ͷ%8ڝW ؜EA9M1h>orCZyecKSlQS;!FHtJx`Yg\+ jMF3;hJ+躦sqN3 }Ս8RmI{װ[\z H:R8B*"4:ʙ1.ݞ@v_%׉ĂsLS gQSc9Q(me0`يN¨]ۥT"2YSYsIѢ%oF& mtqR@µ nh'۵it*:;~{#r^{ߝ-rt Y4Xprek6 .dD Scm^zη)Hu9Zt0+l1ͷSz`ahkj//=YתLMa Lx8o&)9DFt1\ {dA0:',~\y[׉pkkZwMRrfܠ(jNkG Iڶ=U(/@jpnN(FpD,ҕ{czyb,nP(JW25Ŧ]eO7 aDDk w$l'-^8"t} ݏKtwt1da08\JqQzT$^ð3=vˡp5G55VUi@eR$fMKO7ciT.OlDbx|QP`eVv5JZm% Έmm,ǒV5, &cS:ŀc C-H?꿐OQLrk_ `48./ ڪW]U4ȱT%<[%ts6"nabG̯K({a 5Yڅʙ'%gݔ2aCd~t +Ψ8%G~p, e: 4O'k'"m܅T^NQ %<v$pkwwteiT/v+q.Ix^G[y*?Ҳ9CV;s<_p40i}oh꨿$$bkI$.QS^gq0JdCE6/ |&V×XUpgwsBT@Ck5D։Ooqxknw?㻰r4W4P6K#JmY/G8Kh*fKIyzE#^ D14#-J>RC\\401lK$uHoTU#]]烪ek=i, 4mx>ڟ= ]$eXF}4Bwd`\eP1L6'"`{EDތQ b-ALF X8։a_.0BB !dU2Lx@vΖI`"2kR]ss.*V|{? Ųw٭]rEa*UM ](}W[1U,niGSeBQrrBv]dVk HW)+5Vz%v2x'Sh,h)~˴|wa[-VzDZ$vZ%U!!Suњ"Wsp>4\M#7wRk],gl,D(CܹKm>l\|@/IIazH9* 0(}wOKxFS!ވ0H$d$AAVp2\ 4Yƚ v |Ҩi/V2F+gf/8^,p"k 4rRiTsRbj&C"O&ОO[FҌTa8-]>E571B! &O}C/¬҅K.)yKCgc0g 漘 j9NQjO:ͷ= Q(Bh H! bw@m&'U-d#aK[vhg2YzihJ"IV,ȬB^zX6c,?aIBZ9faȖg5ɡu&]ΐekI2kT9Ȝ,$+sǔO`tlp3l'4s%Kr'uCRWwNh6D'\1nI24IumFN5XؔbfOSM(5W'(לּGH&hI+׽rM9QrGtM:0ėV5 F:?qVh[MlR3XѸ׫n2aUwV4uTLyo8֐7F03acg@:b̅2C6-~Xs1"ǟULhP'rԋc7[NcmfRTjur#BI]Лl0eI8!`Ԥo KEf~K՚v^se{bAEѡ)k%"-4`3#;2I{ۙD8n0PHUg͈&iGwԀbc0.ϠZvDYm F4+\m6TDQUTt4G[v ڊ€tMOFsQ^tfpΉyD27 q`ڤGE|慃MEJSkL7,B |1zd[>/Ȃr.eKT14lȭ9"~& -ɱ Qu(y8/WrKF 0SS}&XIӂ=Jr3rcffLGpxgn߭9z#;=U 7-*&Ո)ѱ#r]5rV F`AوsͰdh#(M dbn5&K`^4L{~d}_}W̒]NV uSxȧi%4v6&IC\hp_ D="\,x\ ]r6"y^G\*4d۱8O .?1cg0iuUŨF3 */F KQuo]-Ý q/>q]!]_:{>9 A;& J{s^5qf_`y4n2Bz/S*io<2 랗pBu%1^{>]'C/7 d*ymVV+oWreki>y?Zg|OF+xh}geE7 SY0ˁ>Z [ >d#?C@E< >;~ ??h9%8a]bma~~ҹ^a3u$Ů[K2O'-ւ%˩tugm"tYH62~I g6uatZ&dgn} #@#q 0M@DfsfnDkn^(+65kܹT8jߊf}%6Xw|4 .6Ԑ-}r\ nq"-Y{YXMbrspUFЅ8(ANKqǓ\4Y@O&\hbx,G„yw8"^M(3p#G\T]g1;DawuE.t=4F#])}+ N?nz|MےN2s36syC^VCW0uh4tZXV-#@q׉ScqsWv+$y@b2H軔)|0%^ tM4}.|F;QL*z#}EEuPQ5N xA( *1mO:Rk_o&~:lu=EvZOT;#gRF8` 9;BRTm W`p'05/*15Ie]4z]TD4x=渲t-*1ԑ 95abDL&ÞFƖTR]\Ք.gp=bÑ䲛<f*d$c3WH0Ksز *תn(Nn;2\Dh|)8-?KM-"ߍB8c"rxELS&y@Ud>wK.r3.mʑ@iM_Al!k@S]u"1@dO6EU) \# ͻ)ԙ$P8u5 (ҴV $:F|=ꀹ:˵U_5]EG97,9F\~C3fɦ0?~D\U+JXlVxW- d.˖m6d|:˔j(r5;m^p=wK|♐l JJׄ[IԉBT\"t$e%D(MkƤDEZIafDo/Cc $\ Yޭ9;^w8:ێ^RNw&A' $d>GJtᙎ(+:bH9<)OvW|0Х.UŇ7GJA7iGC۳0faiKNcU<[?+y]L8)ThS0K&!q8ؒ^$ZRcҜ嘯C#Nኞ#u}ӑq64?^0,ԫ3oNlR2r4ܽo,^S q(D |uNd|1Qr8*>8Uo69NW'k3z3Tq- 8oCm5]́ ̩ۼƱ⽯laEuz 5P/= VS 8VxJLʿXϪZDRV6tV 6I_I#]F@]uC`dc) /A0c@15֒lUbT(vSoѝ^c>(H,*p|BVHiN&( Zk)j4S7^s hsfb3ۂ w?="d-F·8Jj"Kc`AD()ˁ\"f8£f3hyWnx]lbAS:`[txf1TC&*aLáj>;/dVtJ(q$/={jq`{Icܽ'{3}p*'N?Oe|qlMUjŮCQBcFێJ5%KUH0Ϫ oNfu%ٴ+ekrgQb8 AZ>)DFITR%bN3| @OX ;ҔX bB*uVl %* [?Y9$!jߐR:wo)M=L"U>xhdA  xLWXH+$k t q9]DbFx 640IQ>`NJ^̚ xlxmǺVjewXV.AIf ~Kr$h6zbEfV4 j=.0e WV_d&6nrVX|_4UJG0X'nJwXX \t,b_D\FT5 RDA @ B+x(AAP+"nA`(d]1fvP<ޑ[/ȩT P [@CpːiNS 7^pX:7lXHVA+}+ľ5ٝO&9v*u@xIVWr;7[?vnIYcu#WVq@sأDʦgf\ԹjⅆrB -ЈǍ wXBbGZVG׫>0,h3ӾrH|tK 䒪4-f@gfшiQ'e,!+ۢtqzN@PJwz~>e{>ŌpX n(b@׏ }dMj ]_}SAQ1N.'$p)kz'[DZCIϨBN}IC%NuhIu|`kmB0{GOv(8a r<;ȇ"f \0+H7}#vVeWWUÿ=lkO\As2̯r=|™čB#nG) >[1XXʙ59݆(u~GV7 /jϴ֗]i΢bJ?J֥H_v!D~-a!E(F1 n1:~y0 #"fOZb@jg ]*Ze2_xoylEyf%7rk0eshcdX̠LҴT}7՞>3M?99) jl6CS;4J*8u԰ֳJ븂uA-PS336UwwdKP,-ţrxM,$Lf^ YxT+iO)EIA颥V28d'ɤ/,%fAjPjj12Q3uXqCz^Q`*9arT^!@,`׈%)U,Q~BJ܋a*::\ lW1Rq@M$ZIJEe^dxtgl~B`kK12[u!Km*&;dNy4@", ?xQ|b`*l3"R|S̲amPEztWa6'}+tiЈDQDg+tUb|3>_04DV l(]ACkeT:^_GEiWxڴܳq˖o+Ttۜx$mۙ4hO˾1 [۱/9iғu|>&⟲J,[XF/ e;C<*AhcurP tdhK⫹ٕ8c BJаy@A9$~e;)0*m.Axzf{tAez*7/6+'i]Z[oamhYOwgZe o5__' ;ܛH%6S}y h*)f\4xZJr"Ѳ?>w% 0`;Xڠ^{>'7 / fm L:[DŽ4tj^ߴw9q$ZP2j2^fMjoo y ;^{+bEgIw-5٭A uU5{,Y&^Q{r5 d'}|1\g"4,Y |JꈂK[LVcD|{(ZMJz ت6yh`Մx)=jq Ja6PB1% p/'R@_PN+{|+`obvnVh$-?IO2+}P4cgb ®ؾ GH)TD> ^fUf`lp4J'dJСF\WpTNσi0b\KfQIΗmQqtFpr y3 [r({e147Z6L xl5=!z [lM"a\4aBd3߇_< /+vDu%q>SקzX2@nǤb}i"YHo2???Ldk>3 #ː yOjWv2wuƏh [/IΤ*}JrM;)+$C,d EOVH{h>!qvs)B)4@3mvkO<}K~ ј/-֜LL $=$H3!VTa u%'O@ Tx- /% ^~j@ACMƊ5kU~ZsҴR@X%BcA=|ӗ,И8C<yIg WoLf%Oke!b}Jk?2\ſYUGB/WoʌL!2]ѿ4WC/ lx,Na|m/>9KwJZCh/&@Ӻp4J`6vPLj[ :CM'('2 e0sp/+[YLU\ԙF'OPF;1)>gO>knfxܰȸJXDon-d(jPjl䵕^m@ͫ։V6tVY-N@I.S7Ez 0}.`7܊jCЭ|YX'}L?OQ+J־Z3, D<$̉jYI9dߒO*oC\%~tx-+ gX^+Ʀ)_.epikhg:?Uj/:z8uQ45c$4h;e#ir:GX'Ԝ[3@ )ȮJ&UVLcЇ!.UINREc6\~k&D)o&YRh\#Z܍YJ^P _S_ hg&%,^9=CHhSDb+%q(ꄎf7M*SEQۚԸbgN#ۣ8=m54|aOt*=v pt xݥyev!q2Gp@) RccUϝpq`kP]>"1xrơngko,M{M;xV!XC&taTYL, 7c\XӒMJ~:*MS j 4N$t)g!F M`dc$(ac\o^q 37y8r3mk#7}#=Z_ι v~׸?vQΉK~i Ȱ3A&0xA Tnݙ'fK+ͱ 6MemE{IHiѦ%goDNOx#n!"Һ(⊋Y44YV.dZBk CĆ-\$Ȁ#Z|Xj4(o|M{sZ$"Ϫ~Xy٩@$NN- kȣks -&@pwk)N T帒ȩuCWTS?Sm[gĶH^8]D%GHVDLƇ9-c Fg| J΁yh]6r''P_,VMYbNĵ3:gkoxw߮gٟ J7 \hb ċokI'W/ /C$b{qwJҢ}CYЧdcSskI,C:4MGqzB$FvYA}=g\UHuh7eɼ3uӉ3 )#3 u^JMGiv4>C"R%2ܞ{sփ]n )-y4^ԷL5:&?[}l) Ga'jJˏA^q1xj`&$ NL>n11?s#er ?z˾ G8iew?v]ʵ{r Rz{7 H'ѳ; 4ži D־h~ )8Bw%»ݓܲ |f>9ZA7 '$,5G:n~P@ow ρ-J6Oe^&6р/#|G#m_ыTsUošD/SIUJ%:S}k7Ջ9!y _ӁRpp0bEо0 5H)acI/F\Xܙ1j\m ֔L7'T)LmZy)Lwʲ_JOjtَ_(iRinAۤMx²x,NMzC/ cL.*\Ӂ'mhΫaq!O ҕ4ƼeU~S1KIoI .K2@p酱0ά\R&'ݘUi hSvKr-Svʤ՘ WʪD#EHS^@$C~)?~^̬9a114d47Csq$ad's#\m^yתqoq-ߐQ~:/vF6p#۶쫝:8'ꕷC zoŋӐK†s^t8My 4w-ގY*k6! YOw0ѩQs-qiY 8Р|4˵%:ʒR&M'U{'p/vf#[zJ'D>?rpdzA @`d:9-MؑtΫR\XC;6rYܱN^g2LmMJg ͘d&2U|J5E-mbw>|ew[ }LEY~`\=쥵Pak,PT(B>n61ʪM4#.h9YvPn}=3zu։~aQcu:/ 9p١T'6 >-k:clwC]tn/-\\XP 4Y9:Z ?؄$rcd"z!X^+Kb蒈9w֊)_i#<JHm'FX0·x1] j O0yhih4~X8^.Ɋ5I-U3vKO˫^JG/+H^rl 6Mjpe vIGt6QD+YbW^VcA$iwxA{E;/_ɣ;nrvުXܢN}CUӒ4 |]}C1.:z"ED dpu9'lҹ(ES&쀕iVlW-~oEj?:DAz$1}sm䴛@;3K}M/9~ٝ?BLrc lu<QqHc*igxlNfO}}9  46;U$xSbM QḚ,+1;Ծ {̭" 39wJ. v\@vm-l4YidpyC%E%DfT$ЍiZ_'H1y"d[ `r̗9r4W$%ZR!f7 LbHTlSW c;U˕/12{ʢ@=Ƀj.ƭ>T[VH.y W[ofp 46U@smӆUcvXj\Ckkӯb؜qcjiJC*S-'bJ1@F'I!R{3y:5k,~N }ʡxw[fzAV`It"4OII5 pc3á +aMEoݸX%?tR16`Rjp^oYث%,l`{ç?E]fXj-FRߚpv=V[MGrK;QgRf\t5dLS=[DqPKwl5m9TXf'D*Cr٣=f,ņ4zPu[5Vf\gvKLӧ<6FCnPm~~n%7Im3LfmW 47MH$N䕩{Y^qXZ&yBF3>5.b!BjlVPլLZo4ޘM:0yʩ`ÚaU _P/j ?>{3_A9.wKg:JJLrO"b1šn.wlY8[pރGV&QĬi Op!3˲qiaϿv?jI  :(yDAǰRcgʁsuE r2Q󼏻IOx{E22( 9mmCݥޣC K[نQ% wqwOߋjIblC\ =TC 5ğT#fƸ_'r8l0^8°|b</p]{]VG=s}dsZw^Sn$M4b7ė_(D(q]p'`cz>-i%g@G gY^g!)T\:zZAs]+B?֟͡V!ύE4QdkE0߭ɭ7>#e|C{3g5DUC/ @n+Q7M[4p!!nÇJ<-ӗ?t{oޖwBpU*Yd˳,d@`KO\? YCBݱ-uϾo!_)d-gz_6.2Px;l…,P Ϊjߨ((_UV o& ؿ0=c=LN6Ա++1JUY;(r'lYue1UA ;C,"J鉂:ί#cbXro*f Ux(Qtu)T&r:0aj/Lҿ^E"@YF 6wАp]DW=:Xz;H9;F Hɾ}!r:UP㞍CP'uk͖iF;&MlfQմw ~*ƷL\xR$d?4S*/׹q꓅K͟UDW(pi`W_^W#1XQ_!جtcy]M׏܉tmI e:M@Z!$-F%{*Fi׮HZ)YjͻH}-ϻkB@^ثLcc$q̍S{ @qTcgp{-8j,28Wh ՕޤNQA9cbkj?MꯡEYE&Zl[7  MgDS4| i^+b,*Ma̖EĈaWL|5ѠJane깓;|2`_b/T!-&_T%\K3b4Dt$~To|o +5+$a*00O(B*ĺFjlWbRJ7L1DHb԰B3s} YkߦZlfYp^; @'%N|_ 9 m:D+\!s4eיQ5dgt\Vu5|m%#[Fx)dbB 櫨^ w><Dzpoyg=Ұxd HS(+0.FU< Kвm2kFc;PB;g&QdCJ(\l Y>.#Prh3͘'OIȑ?#LR|\>Ь?heRs%fNH 6I>B M@77Vjl;X/GtN.k>[PE'?go2:(oF죞,V οabxxK錥 ]4SkjEt9-&EZ V(@Mh |.udp* o%r{RoY{Q݈w:t»ͽLڟvFimmnBq89*Z{[̄p[FAki6۔02\J f҅?3d?Ÿmu~fQ̡m>*0o}׎2 ~"Lڞ{uZhOCmZ0/vpwYG .G^@hJTr;@5×fzh[o}L0}1՞whfPF[Ci3-Gs<I.gh4uZs}rFQ28ve:Eŵi xRt=L{P2pɎQj㠘 /[C {>( @ՈCLG=cXpCLufwWG e9'}^}< !6u~Ա2wq* pcκ*ӄm^S*[8T^;`Ex_n G+A_W z[={=Iˀ}MQGTFە0jHmv16j :qc}G%97 b  ^uVe]݆dti oeҴxN,ĠSA5`2qrn0 _r4HĮ?@zu?~z/TO.Ut~w?FtLz&Q^EB"ffVƞX`+t>nvJ4 )~VCoOXν. ƕ&'O$MqT'&C$G KH•´fdb]Lec55|w AR 45dC? MuS ex6{-Y\o>Rީ[Klo+'=#L:`[ Ԟ6+Q@*p$]>}X?}v6]+&kֺ Nӵ|mym^kZoē6N^Yo.hU#Ghc%CƩoxV#! i#@ U-3ca+bj`!?T4OUCWbl\Gw4,ͅ|4ޅc͉f:Zz6 Z@^]X*E^0î3`:_Su"u'](8B^:eX @apXJG{iSYMPy0'I"+|t0ݩ+(P$jpa.:\cJ؏Xi"o?gA5ފ~ZGv )U"VGy='5;4Oi|=%@VD\<0Uݦn SxqVX̜r8˰)Z]xD5x1b~⼾QK;ŠeZNFFJ T]-f"}aͷyӲ+jsr.nK/ ֿ,%}m:_4oDnidWH4 ^ہgDp*&H5MB:- 0=vlP[TȒ#֤/*'l\f#!h h:\HB#}qҶ'Mw1AU *ýMzeVvԎ “Y&p:O%m͆1r.uW,{s+8 (g+ޛ51v>pr܁)p\hTNS{d>ӳU%XX0+52ˉ zvuVqnKKTKt%FʯA KL$&[}tpAq@2u[RҶ #IA +Qv0R L? n['9c Bx<*IsDE3HOV<(A6[/+7f 6Zk*mߛI 2#!CF!kMN(h>#yJ8+t{ yJ(j.MӝJDgY v,xWhe q:xh7AUT8 k[60 Bvu0j@ GP0oZf#gFNfBmrW/^p:ޭO{mY/r ub#dSpg:U՝^Ga^j*9K`Fhq1~%Nwof'dŎAKpf ZĉDC<ʲw&$XX,s<ɾWmWgwSS~AV S˛gV{_}}gb3gAxcupz2- 2`U뛦 u2O3eWɓH;h&Z 4o%۾Geg6YJXڬNb/H\זQ$$s7g$tD1Wi'o~Lދ-E+I";7B[UrpD r#Šk6~F'^Bu)SS$UiBEH<ԺOʊtDIR:R\~(F@4;n-ꎥ=ީCʛYݧKKlB}zxpU zPGH#80Z,gz+ "g)xF(Mс-#4T=}#Md7dz[q f 4kI!VwmqYktgߜlU%+o]F@ß9Ѱ'$( `Mt_"D\;$qf%W|1l>R[,6Ù/=XDzbFP%`3#/YzDڭ,f(!j@MzPJ5.-NOZ+95)IŘWb9D;&PY'ć+ʼneӯbPC;_tBsշ}ʰg{YTZٖK窍 c. @ہvަCUb <EE'T>dF%T=;kd$0ɌHn,3~Q"̘} GC&I5y 2y}+c$L=} U U #__njHX"uj/ 0c&$QYjDg5k6XL)k#OgXad!TK;ER0 B c d{J5~IQTx.B#ghV W?oC*NI=rEϧ/|I2D.$Cp|ݼ =7fn ?s Q˚JzzlH2kV~ձoE #Rb?<I<ѹ BOX+R[\IKJ&Sd' &\oE++N~&zRQqņjLU\!G]-a7$8/W@ֆO[GxHrcVd-~]gp|\eCaN ½akoŬzq,6 3v][0P LT ůd}UǹϩޱAp}oЫ#h|b|6Z5scmJY\jx7ASZ$]%iX񭤑%^+E/oeKv#A53Σ|SPd2]߯u{ 3 /5&[ў{RᯇsC\戇OH`\""db\N~Ԥ_gVNP+HeKRҡ}b'mlF8Q4_\@D,-6r'KQ-B,`4^ xOo?MBҡrS vun1k60uͩ%)"жYLQ;wJNM掇0K5 Gɝg,$mK+jcO٦ r1)_D׊;D {(H=y%oDW$VvBKز+1q H:7L*+?!G3+n)bEK gϏP) l0LNЍwNDL5F5 [o29DV2_%6#P(ňa6 Ǐ[kL;^3~-Oi;A͌|Z}rAKF?Ww-Շh-{}y'3*i Nqzlp_Php~b:pX?M(.`m }PXadx7I  <{\֜\Y̋\Fe/cRQ3FlHQD2ýfh CKΆ4|6BhDc0JVno +} x4Wm_+ dKG+c|9MH2xYuYW Yď zW1Ȗ_U^ W9yJJoUtN46;V$ZPPmVe~IPSՄ[-=_k'M~5xY}a^nS]W5S݌$>iNֿK޴c:x&WcBƯn=nK?M?: ])ޤ|sqr;0_(+tOKJKg7ZRC-y_ atLC:6n03_%j6,;_">qT‹F7k/iT>Y_6>cN|~E1mfKLf_} /uau\,#-Z@RQ'GuHةI4ֱRBM?jNU9X(dK:Yn6WMMfẨSLG,D'nP7p6+]3A(Ze+7> jA[ߜ~ف\61O)e*| "ʮl^2}9zoWr-$8oCI>y pPZ T`5F\Cu9{%\f'P{9~u rY]:Y[CBL@XّM<1fݤrBYNIṾl>aj=nkDc7{T(@VoϏ/ 7Il<菣Y@*$Rr5~u{`*˪Vz{..+KXiHX&&>y|b33I^ ?~m'Eįx,G+~5nҪp3i^<]rՌL' X623q u ? >8,j(bAԐ-CtH8s+|mS45<#Іxb0臗^Hr7Nl[=mJ_TD}Fi8>xNIyuKh)yr}u^o:3]P:vEDUnn( Ia)_0ȏWyj/;YƮȅNZ^{L ę 'm/]魈tO㉾F7ˏ[Ζ4d^:|Gk5 1BEhͻX sR˖UdkʶUCNjN+̩7(WN#yoӍA ʍicvz ŵpʜo>Ҝshیccbyb@)3%ZʭhSqIvy¸ɉ6:@Ѽ3 h4eijg|؟|ڢoX;G?4-+M̝75wiQp/bV:^LXKҔ T$yt.ݿ*4s0)wXamңRRlkJzalt>".mI`q}>2"OуxLח.&$.4=k:1|ʥ@Db3MX {uko&dυӆ(}j MjĩH@y4t^Dc a5E%~ Z͸D?g k ˱BqZqJ:=.mq_@/zb^$NJ \/„nEgWq<-\,! Kc;}QoV|cJE=ܤ,IzŸ&bQH}a/ySv(U_S_bb{7hcԄLjc[/BEjCS`c)]](>jN/(:tvlbKu+ );f!l$^')(F2~xI YIX詉8_ë$NI@Rcr6LGMMl~6&g?D3yL*u)bjzrzb Ѷ#ba[ څ0[!ƉV`UjQV EPke$B>iTUiahRt2%i3>V?YQn{S3+ g=/45`ՙ*Q;L$S0_Q kWbwt6>dja*'ZTIvJtGCE]X>L lE>dqdUILܲ RbA~p/KGy +FM :\h̺Mi⎴)^cIEB;XB r2(ydڛMCDHKbio#j ~rIhmC%NDR*M ;Ã-QMAݼzJDz^'eœVeMֿ9Y7A2[95t>`1cSlCx刵L=:X?RͱO>^0O;:ٞݭَ#ݭaݸu'JHKǚ1{M&Tu%ئEÜ#7p TR mxoS!7i+O(P04G!g̍mFEMQ6HW, eFR.q{M]Ru|$1Q^jӐ " C cֳqOҏ]$?CV[}+60յ:.v,2mޮMJ2!s6;`ɾ J0S۷_5Mc<.ʙTG CcJ b&vk?XSCSE]b/"1s`0,]Eq>zMfd=K&x3$%u{=$_/)(x{Zb1( w2H`ng`K|SK@VA7uE4ڴ]ԏL 'S^rnixVÿZiW+ٻ&7bqƽ3 ThU{k\qrI !}߿wK{s]&Vlowhx#Lw4oE&Z;`1 V!EopOwz&7{aw~0KJVկ-2n]$.]ѵEԍ%VBp 6ȩ^7vv Zu1ܽRI]5&kL e\RT-kחi[*-a=SN?l,M\+ 1ClD'CTZaZ%-ݍ_AyE|Y~9"~K+:'5vʷϩd'h;RfiLiʇ|+)ȻgV?}B Mk{*tLaD7SS֥2<'eKuiAl+a1W9"jj _1z%Śb툍=!=28p#2!3TpYrS Y9i#܁o&Axcf3k Կ y ݖB .DNn-D 4F?; ߿7ҧv97pp[+hG3rJ ʢg}TD D+F(#6[_xx++g(r( JjPUfm]M1@?X؍=؋}6J"%KvKMIi)=39 xw; {E:PA!/*)9ZZA1I"ɩ$RRrZJRMK._UXX'oFiY\uD ]VrB6M6i< CBpCaԂ?1$RRe)RjZFc9QEX%؃؇8C8Dnba(]y(r[JRMKl>bn( ^Qxh6B? `DC%~/XX#6?3%NKGIi)br1pq'8x$ qPq:O L QPI<_RkPjZT_L .^~AB n&n7po. y|ȏCeTAU#,+$RR?TRb-ū!3};gxdW Ǒ~>&%z~19~EەEغR{7kij:/Of˄ѵ|bpB_D`dL\|N؃r9ڏhX'P9+TtT}ܔz49NP#XߝIYjr:SQ Qe fhhh#_-a0"1ę>3a WDIb \^DeTAUTC 1= -"=&c a=6 ULI<ZRVTR{'pqg>y\<3<@ȇ( -t~"Q p<[ITRJ] aIq #~Zzl&l~V\%A,"]^?_JI =<q ؇_yS))\,N%%d>b_5D#7pp(H 'P @E=G4D(=00 (*J"%A*?TR=39CO]x-hy*q n4.pr>>7o\~N'iNPqEUp"/]SO|-xf_-B,,r!DO+xWX)-= GL4ʠ, *ê)RHWRUUIigjмD+Dc`fb6`~n^aA _CI/ ׊4\+p>_ cBƃ EUY#7 cAƂ4% eIùFyC?W))״JRMK"3?YXs7 nct k8wpMؐc| ʍrh(3ʌ_x> e>J7@ oRvJ"%Z߹TRo}n>bC}4D zM pF| ~ l\8 { QN QN QNMyV))X%o>bgu*7vcl׍q 7ƁH7h/h/h/h+(n`eqd7ƑݸWЍ{Cvn#ݸ^hC*X:JRMK?Q|wFލ{svǻq/̱^!Sv);3p.bz{PA!ZMa}ZhAAC=`LϑyA9<<|xP><(\G!q-DJʃ~--?TR#[W<{P?={0؞c{\d>(Ryrד6ēC34G -Ay\kZ'eSyoV)){߫U*#x1eeo/N{_ >\ !>,Wʂk;Gv5ůumjJ{fjbNzqŘ^{Q^bE&|Bkc.cA1k^RHuD'YrVrVV@nO:z3͹ƃ]:wK[/mZi4qȉCF9qDm*S9N鷍qJ_U'_hr+rI(=/O3\.,>ӗBVXv S˩LO_T.U:B)kR-HzU(ܖ/!_mz_]?s[#vr_O)Ҝ3f4pM e8w(CܓhĔ|RXJ2~ۏ?[c.<%WaI[A7U)U_86Vc1gqҫD2~''fe!rFXƴs v!ds KFF9 0|;.yI7(gL-Vȯ'bD|ĘHqh$v9OHM^K[)_{UcCN^uY3.g9ق{6L|Ԭ\SJ{bz1ܦ#sVbyVC9cf+6ߋ? b5Dpt2MjN;ӜaJ=8TE5tl˸S;CJmЉR DۆoFtb;V!v_wu;6X[c/Yv;ߨX#S3x=OM>^#e fy?2gTZj9Fć؈qb]Edm:?p7I<  K1ۑrkɀ {[&.]Y'pB]vh^heF~&ǬB梂]r` ^LUhpg:+o 3ںelFݗ6${K.O*8^l'?^husR&4rŧk.Ezmt" |)_ʗ|,eC6P.6>k?'^P%9دU.rpZ.  b:QԴdjiZ\Nk_}Z-rHKZrZZ>gޕwe]9Jtmq( T-BMC}f7ߛͽ(99FoK_X=y_ubV_ǫLz#K۰^/DY0]wj]-S,+X^rOЃ<6>G>^u}i/p;FpbǑAs'qf& Re FY7g)6i><&.itPtCqA}=#qMXθ pL1bF0\G%!1+FHɾbL  lE F /\}f px %\Fw #m8q)Z8Glj#L:sYkQ%29c0u*ݔo~P'_q7`8y5Hg8:k('Ȼ)''[][7aeյrL\2nujTMj қh ^?_:뿋X~a5` "xJ - myX? R>4(o DXnp с2˱qdT9^Ld{&=Y.s%20:rfS٧M%=lx?0ߏ̇nXO^>|}xę/vX7ns%.SS#HpR׷%)[ XGL.Qr>O,3DL!Qv9^t[ږGe;XC5umm*]N$X;Z7aRQ?;:Ų AE0B;8(4QePa44mӨs0ʐj:e9S.l:[ ~ExRPefHe0z<E /岚 XxװEuh4ub~q/sW]9vXīÖ" 4s,Cx0v>((sY~.eyFC>̣O:r3ỵΣO;g= c糾o>g>~a b[F` 8N*nWq^y49u :kgIy~F};yMTNnLҝ{/֎!I8Ѹd>iR?d8蛸'q85(+˩}\cux-oB(&J .M9x@e}_>4LlAaFN wAYCyb4`"&a)a%Va ֮d W @A8%5U,9!nŔդx}Z-ƥְp@kAtSFs#Jm;3F9E_n7`/eז1fգVcKjVNز9Vn %mxuYw?X~"*aa<bqw3$N$ejZMPQ> 6bpX.]۰{鶓]Ȱ}A0B7_̋kE]c?y>݃'%1v.\ښ(O[㷗0+ioVa5G8Ayዊl7&><{ѳG=KK|wD*[*i9QNզ]&ȷ!|$!2'/p$yGkzs}T@7r9ʜzDuٲLu÷w`L}[oHG,qG+4((?L,qqnF $J FcA8Hh`;+ёr}%(9~GO L(փtG9e/:r49F1c.cx(ЮC[i]=WSmMFu#L⇂P#{Q:z _OL<ۓwPnێgSnC|v_nKIϸ;rRXncJLY1+ qQe6Bsl_Cs'%\LxbuR?K.V7RM?V QPNhk d `}hF,ϵγO4Q(nkQȘXOԕߖ)F!aXw=z&^p6vz8&a6cÝde)sN,J>~†lI`·N腥ϒⱮc6b'~-<یthm~H 1=XJ[,r?!~ X4bP~zf`&a? Gzk(76c%C%N$<^ n !NꟘ~62Ks N؍=ɻeNQ>(bN>u<Ď?I q1D/X7N1 Q[Y9Z C. B8K|J@4DUǏWL<@v9L?꞉?}5_kUwtXWRO/WI J11 Wp1שE=\,rqmܿN~*'P m hۢYw`GaYtD' PLtl?hOZ_GA=}pG,ԋ;}x6kG1~!շYkum) __?u"?4p38>{u3?`Ř/6C5D-}̸YWmk;u/3hb}&V_q}n8;oWQ,y*yys5G=.C>!`:*wt֨/Fa:&?jpW:y_UoΙ1[EWf 9Y?X[{pZꨁQ0K˰gpqE(EQ Vp TJlGc֋fh#-_-AFlVl8n8??O\+g+)6x}翚۝=011ш}<ۃSWD73'xxF01 7p{ƑCzζ;z`b?g[0 qpp9BiK*ETD-'LL*~>=ɀrq9!Oa8\9ݟʘפ\`+5>_m'鮭Of_锟}uvy?Lo6;;=olDk43zGy]ϝC d2I;JjXY=Σ`'x4X]<#Ԣ#M ͱ ˱ )cpwY=k$I,>u{6X{E4X4 o>F9M= _Hy/-=K}+ejKyDb`'LBpF;!][;qQNp7P5P ", 9҃b(rj ׎̋S2(XxWxw2Ygf[1S1?gfg=|γKї.E'>Ɵ~D*)yLzXVS n٨wى;r d[ 2.!c;+p.Ꚇv?wߺ٬ bu"NޟKFYm믤ïIlS?Xbv`'*;! r":.<|1JE;Na&h#0ME]QsXEMcdwr >C8zc0"1C 9ў8ў#1D{i_Ph0Gͱ{pVj갚2bТ[֛}tFvBIR/Zb V!QNR>}笅? ⌡dcP:^h肯1 srmO2Ce4Bc4Cs,rlF\k(+*6!3vrXL9pf)kΔ5TM:z,*l]tp#ryኞLTi\}cNd ]*:AT 蠋BWQv+ Eȕi+WTvNV̼<<|ruNggdq;E›t=;f+]Ğc?H%*MhsU=ל>z /:oОܓCz Mi|^C3oɣ~hJKQ?:LHGIZ׿> t泀|DGc~?Yy}DA3m@TGMjiD֟#0|- <8(;`#3I uQ: {0~Ki!6XO#/p+LO3rLB}հvO#Y;BB k8xȫE񿒂fQ;(Mq?xxԤ.hBSZВ65^3]AO}џ a:3Ik2'A Ӄ޼{|@ {9 \IAZ^U&۷14Wn_9g?O'$L1]ݤ})=XZ<Dz$\>P瀹F^} Sku<&~>2>i=G8?F`RǑ#4&'\^WrD]W?㷤%`6u>?p_Ȍy?.k@YÐ؃[87hiGf̓Kq0 {0~K8BB 6oэB wDKÐ4-unI 6#2`#3IBjBI7nsMކv#ޡ﵄sDt(8()}#ħGhZd gkֱ ]>҇ ` ـu =C< bQk{I-АiLgYBVnpS'A]1e7NGH5ӖvA{6 '$3I-А`! )\'p"Rb'oӗ~ ` Pd!+'lfGx'iLC/P4`&XqE,\|m{*& CWoM|&YfthVr$Ccptƅ"w/YģEW>3%owrT.$&3b9+ˊ\Ԧu0sA瑃C]јoӋ LdYRʨvm|ƭۺnѺ鮤S͚6fgfťP]d;#*? xk4|=^Hp OSvg+T5iЛz&6N (NUQR7=pF2R&q:ٹRCo>#џD?R. 1La*Ӹ&?/ =8;wc珞Ipßih)4]O R([ ƪ](3B|=ڽͿO^) Pu7P:Qz4@#Tw=E.%]HԾ@O w˫<#\NdLАiC[i>y}lꙸ>BeH~/';t E_"sE*K"C2|gS*g*#8=}>QyE.lm˒/qwR|Gub:S &e,0ymz;^~I)}Y5ɵ}!tf _(9:s{_e7U;ry[tݙ,2 pxzgY@j};8So2~@p_]:~n;i0B\ ;>$4^+6`<^X!}ӯ>h{tD-&y[G'<˂z T:O0QcgMf4cT|8ͣT5x1yM[rytG|)Wp}O2UAMz.oNPuSҔ}>` /TGYQ a(_01e93u\! hAK>gdp0mG pSZc%wTKkDpӄ<"5̖9̔c<ct VyS TY] N.e@dtOGwi}=8GQ^h bn~](^TOS4d3Yb=-k0sbgq6E)FC>S>~d7{wAeSZLa*YK{>3|F6mܱ)K9:љ;ջ_x{w>_p{6Cmb99ћw}dZo9̜IT:OҘ&Lc:\KRQOS62+ З! e=QM$3lY\V[g0)5ḵ\wB$'Jg8 `)ֻ:۳^{=/om:ξe$m/G I>`St].\t!}?|Wou8%<98%f_u>Nt&J'n^("iK3 .gC18Stb9+(E282 )EқwF2La3lΏbRZ49ZВٹe5[\qyӜyo?si&o&/l<68Jɱ Nr@ԥʇR}3-bzx_[T ϏJhM~:b{bZ_(p1{Kux?}}FtF|, P/:L{{D> m&nrrȊ/}<_'ԗu:Zgoo4n<ߞ96m&t`b"迧7Y6_[?Ly>3%"ŕ5^mzYWsq;EyC_+~vLJP^Ç|D?a#?(񋿣4eZ h\汊+nUܮQ,mw,w'V,">pdڥ<1o#ծC߷wmoJ.?('iuB {ۿi/D1ȗ1J 6\=Q_Apx nLߑ_nv˚Psą?&kl/eq%"SE?|52nʫ/|޸o^=5]|}5E y+8/({{DԿv{-E6anMw$e׍S"Ru!Os:fKw ab) QoC:ݺE,c9+";.JSԣ> f2>~B#1&Pw)s4<֝țG7VfSu _œXHR3S;S3o}HOgּ@{:П祁V/d8O+ZӞJ#TbWҞCO < H[+51Qc2Sl8=&T-f0ٵ'89 ˹BNk^` Ky@6"犸%L[2m?&yFzR],j x%TOw|Zi t0>prLw2dKAֲ짉9y5FF0%Oo>3&Pe(}Tm\) ~BK itP9rv0^yc'ϒgpiBSp91G49:28OA!n1Əl%1Lb2K p*3& s[1Qf e#TE,&k .2"1)jͿVet-LZɏ|'!%92]wV\Gbۂ)t:W-O1AD<nȾ,\ HQD9$L(Bs[0?!4HV&Owv10F1-"|;&گv &?hl?!x@?1jWnd 'Kڹv))4ܳ9k?;eKR/_9SK0za#('&p75scp!/"A߼v|D|ڊ\DN.&%#xc1KRm1.+pYLF*Sj>CMZmhK;+ (eMk7-ܴ{nh&<{fh.ę#&ZJq]B5:XZ'+yo1^K|1"=D< JFyTǣ,oR=޹\~/s06" $$~ȅѝ S[H|dIJ?Y,!m<*)۞N8)<!\6/+{"W>֑ b=Ai(Hs@ sW#WA,ad)GAd ӎN ^~,>;:n;e!KiXrT?| ti}\C+\iI)Wwv҅B&M#r(o ?`OCZ3̖5f_(\@N"]4erVpUтg4cx.:&bks8Ќgiz6k!UW.&p-0|J|˶} --g93Ɉ}#2n uMԾ+Hv<) y2 tKB2dTYx$ 9zU 8>Zޤ9U~_*o%%\fP>f\{}=GC3}L^2^8`{T?6UlgG()%^g~a/ҎM\Sy+ J1xyьa i~ϥ_G1ƲYNdNiC[f3 nq)Do=bnYaVe&si_z!$u Iν|Rm̈́sOOvKz)P2Wx|(HwuK3R Lܵ<@||,wO3?SƗ_GE:yX/L%K1ğ OIGE% k7Q_kGb>Q$=D6u;~(H L MLx_*_[>=qEPc^GC37ҍo/: q7҇L`"7sF0YQf ]98V'o3|N13)J1ӏL`"Ws@G>#.{VfYR6-[}S;عfHYo0gI]֕>{ñLfsU|AmѐcA!H{ .3(S35 >j^ ;_(Qp*Q#hcg!kõ-I ?'gyϣB1{JٴG}'#lA} M̯7c?(rr~17wŻ!GԻo1M_9`jwoy VmDU}2z2BZe As1$?ϔdg=j=EyFfWn^(\';F^UzD9398xf9З,a)k;ߊ'yu PgLb=Ov~c^].;/QcE(Jg0dspĽKpρNQ^; ~+]Ã6UОzY7(\_-U`ߟo?{V>!ki_^lA0N(4ulwrt!Օ6STXt+QM~(P]S(BL^k)kRbgf)) N1O.N$S+2kg {aSt+/ ҏ ` 9q R"1y,g. >҃xP]J/a0CGl`_ؼY+fܿ͘xBm*dIW-[p=Ց|۟\Iʰ}o8vZ ):'orݗJbJ=g.6 $M2)f^d Elޗk^p4n n,eY" #e&GFwdވ)tXfZ?mxfӌPVe2[?ՕZ}J-_Bc.ɲ?_|?skձKw)WF=-hOՎ:Ffi!cGe? @]s HO3Av<q܃YCUhbYsCn8 0Lgq,;~`!r jPi?xZyNlR,r{|ϐݛ;6i-81Cќ]pi8oN-,pKyjwsTh-9` ǶVO&C;ύ؏Zٚ#+R]l%DbWL91$rKf9ܩ?Jr3,Qɷy:)Wʧ2\c&ZC.+򣼸3ы`Sݥ[YfVfЕu\AsbJN 'ƄRpIy NeJʿ\WyU=qkxM\ӱ[/r~G9\,5ʆ6K}eۉ2"2!o#'ʮ2o n}Y L+Γ. SI5IZЎ ]>Lb:JWgr9)Ýԡ!OО̫M1La&0,gYFt rEKB]ӓlW48e/fA>ͲMFh;nel?r=J;p%/Wq=͛@+g'9JM0,^e nEҔڇM'/wʼ`ۂ MH6wR:S}H#J#(}d%F*Wpwӊtu'[AA4ӉQ&mW,n6n0|ZֱT SjTuOd> |Ǽ8"~S|:ֳMS6*q;wp'ҙtc=Ȧ2!0Њ܆פ]n/:zFO-Dg+tbxvhL3 Y/*oriG{Е3f5ϽLa*q7v}S:4!/ҝW~#Ws#71|,a)WMfR f2%sl]r oC()$T9~G25L%'qr>Оt+3cs9s2(Ly*Px||$b t"y^ֲ=Q5Fs(\uf&}y a(2~u2y {thWq \AIѓ>|g1+/93@W"[JVm$qMiCx˫۟]J/^]3Le+l#dqrS+/n<oI%~aimB9V{PMb3T>xhG{^3]JOz1 c8#I3~fkX ӍSJG|O,f k?8zvOap%)f1l!lcUִa c&F6qӴ#0ks"yR5#@F+S,.8sBs* ʂR. "cI-㳘θ@\Tz^blwJ]YI<;9K.R5186@H:9\OIJ;Ws IWsw*)GZ$Nlr iC[^;N ̯dϫ>|O҃טW\/&t1p)q?/21lxP ўtd ۢuj\v Տ]ƞs )SPyzcΉ }~}VX=PTuDŽ1{. q}vqL%1 $rCtJgut/K'[Y']>ѡ;`7&Sc;{ |K3bBӍ79)Eygm!u)q?,g+hGs p t+%ϵύy_sQa0I,d%e `*Ϸ(F[1e'_hs8pY= 3|ʐ(i hHOz6F)T19,G~a%H R9Ko73 I>JD&+{i?r~HSF21b}EYLnNtM T3:;,u:gM>}.9 '$+?FN>E.W=<D+[)#%~i ņ4Y?<|O $pa 2^GΘ',{Y͇L$-O yYX*V63%7|y3AōǬH2&tUƇ]CpmHVF쫀T#{ [O7 JJ KҴ:&&4GG(W|(79ˣ{(!)ܮBY &p'Uh@Cӂt-f$ l#q f4>0mn;n5A,Sxg(3O8PXKkm49xcÙ4YC;@nN)A9S{J7>cvKs˜C}bDO$Wr Rb.XZ$̋%;p.QjTi|^ew.ܧW iC[z:#|B%s8Pt7Ƨl#~y9(Ez1S_gLb23cYֳMlAe3NG#(LJѕ1ԣ> )XyDNi)hI+Ж9򄲍lĒ,a)[֬Xy̉7T'-d隥g}+.ɯ$'ϯN,#vݳOyoRI/%Ql޼vLPϤc堜G=6Գ:lGf/pİc m?>˝?ڟ+whق:L䣇3?vx%Ưd?x6R={5W= ~wj}X_(q)QʘOӎr)AI*([ A iiLhy3icē(Fqnf1,f%?m'iOvE(*Q3ӀDվ|,awf1O0ᱻ{ID ~/r b] =(;#w jI|yvJ\)C&!{t_~l=Iɼڤo2: hy#'6=y|Hi*vQ^W;KiEHgUt-NC)eWS($:o"sQyR.|~ M.NBF0a!X=h ~3\@1n,Pf4K3ָ=gri`%E\IS.|NF p3Й.Lb2p.:JSJ%4|I UKa9kwElQ$s;mIևo|М"K Z`~ i 9מJC:xּO6_OG Sϱc4܁ilFPnMgMf"ˤe+_p7rtgP&]bBӖ 3И&t`5k~>xIwB/*T.h1$cX>g}^=u^>ga"?Sfcuыi|~a :lⴾkXѨy[{T#aۆo >/۽ձ^cA_5g?2 H3R24tɌiOӸkfMA בKe__m|?h'!3%nͲ$2/?fpn|MlYOgj5s1>]L\y*rn2/} 締7;?=p,zEO KК=RD5߽w'1Gt!]u:ꦭ:*Jnh)u}ŭ#i4:#θ8hD+ ?: >뿛;v͚y}yfva1] nh>= 3_hlE H?׺ Bcy9^x$j5"i3/Z,>p"26%q F]N1 ? n 0 `\_>#FlWGm*ŅXw6՚P@oIRD#4FG|c8xB&_hNUxoLk[8pw+Em;7~#>bPi7.b^KG(eG *̆? )py>("t"q.9)ɱ)7c/&3GxNoMs-msI㬮Ɏgںï^},ֵW~+9W okqj"er(9Fc!::ۂEXe=o`?Bqa DG>}⌿,/ b}A':wAS lD,'lAUZ_39{8v\1= 7PAS0NL I8:a8% 8J 2y.04mI$Ōro}yO?Ͼ﻽[]+T+lTy:\͓/3-N] }Z,:SqS˫20uzZ&\ :# "2jИ5Gi EDhy=L`Ÿc|rlF^m\^B+3|t os,܎d1m>oSؗf^9FsH}~^xk-:!Y'w)\frk{=1υ7YǨI@I;+CJ#!׏xԓhwtWV* sᏭ؆+#|0nFX ~DGҾR<{ǖ[ 뙜)vߴyo&u=<^g\]"+N&ḊTG x4qB@9DyD$c (" ԟ3HB,*4"!'>&rB2~"pp+m9 {lvF(Icz n*.{J׮-寠Ac}S<+VzڳuӤ}+w|`LAߟҜ!Gٙ\EI4_j𹶅av 䝬ߩcuVMZd;;.٬^EF럽)=.SzK>o7y]+B5dMkgZ_k[aV35 Ԍ*5c45- Z3tyH:%nG(tk[a|'?zFtraVcjW-Mt՘B=iXu؄|S'5Bc|n(['Cqԃ9~؀؊m=:c X, dzK'mIVH'kaT(Q؊=V\'EBI'ba;QJ'GlV#qCwuRvBqTAF=_^3s Mǥ%Z6mw63ω_O쌿+FlýW.8o;XwT2/(|:ing8E ]smƂ̨1Y:o3>q,gЏ1t(I>` se_tR k|tREASvUH_2zj;lqAh|vXDlgeYim@w)Ѐ87FSD Dv.Ќz x &NC8%ԁIxzP,(r(Y3TGڠ1+GX@QT@ 4'F"xG>sȏ(2 _,F 6a pp xi`&bamg4Ƥ:i2Rկ8|}@e MNGjlRO-d Fb-␥&E 85; 5-9Q?!ٚsxc-nDsb~I؉#doA>z`2`>xbjxdiI|Qn_a/.!OY[1CU|^eg1ͫj!=/!GrIepC; /ގ ^'_Bl5}(Ӆk < yך=c<ˠKpgp:QPq'f|I<\޷'gD̩K\+w1}ɵ3%Ux_6mSX4w&sB;g ,ef[aVM}VԼ~0;3,6h31f ϋ?u EVѪ<23 y#j *}'LDmLU;"?3Ck Oet t5n2눤/8k8\5ԖS18z m#pd(oQeu_K׸#^= 㟺f ]l95ԖMcJ. ;s^Zb,&c>`! ~"!>EtE7:\5@.G4c$V!dyfȏ;F`$&!x<Q3@@m | qp%6a'd#oh0mN*1ocg:/nCJۯ*?8xuD[V~,KθD9Uߛf3o2A[yB~^ƭ8'pcVcg? \r5\.r Ք>T7lo5[)C޼*p^ƭ)pu5 k"r Ք.Rje6o5t5TS2ȱzXHcދ_oq+#^*wI`ל'B'L ,/X8Aa /tB !; ҇\@S,n7eEX(o9Shҗ.ïX ~.<9(ݟ&P#0y0Bx)E_ED!UF2 7щ"^7ywebfsZ[fwjJSeP'*mmۯk܊ourN.9& [m5*}smٙkh5TS2(.qW __ज़z+B[{X"pɥ^J5ԖUol6P%rd(O죲OtS%VHz99Vs×\rWx 9iu4rW9Z2AAj_n5 IoLtk: /jC{tl›cjEkt@ 7D$)Z彰Bq܇_b!qq1:y BiE k%Z 1g,r(8J) p&r }2]4YzZ/j XzUOZ*pIBkO-i֖z 'rP%OS#7~2/]Vx ޲Z?.kXV5Ԗ.Qgg6rDkPe Be }Y/_k܊noG*gdh%g\^Cm_o>p[}`gWYV -ʠoOa2N_k܊o:ӹ~W \r5D5ԖBI(߰HN8!Bh ׉F_@lND#(8ꨁz D!I(3h ^!bn *!2ڢ=Bqבy&QeQᅯ˰؋}؏o߱F \C5ec,Z׾`;E;TJT0 n)UFi$DDCDBJ)o\?f5?翞f—/~)q~We?+?K!Ks׾=4_P߯(6ؿ6/~)q~ӵ/|~uRk7mHnnp>=2y歼=/ൻ_ !.}^R,g?@: #/Y}kn?m-cy$#V hhS@  fi+@6_@ xn: @@ ޟP\y`~#ȳZ= ^P_8<H@"VT&i1 ^[}~Z{m@P)8C;m?]kൻ_ C\ lS~oW=5!n_ڗ߿=4_P߽ފ _WRR@X?z筟3|_~ m-oF濻6+C+q ?xq^OC\sn׾_ݼ_r{/e(콶sbvK!tKa}oڟp 0^s;`4q,|5 |AE:\hm?  ,+@+mE@=0 X@ - 8 \h:=>` 0}V{u|}sz<D0ۖ* o|ok>g~؇8_ڗw_=t0Psyd?77gkwgq) ި^g!qڗo;oW?N 7wE?x!.uQ߯_qG|#w F7$srrx0`b޺y@ `l``gjelɀA_I[chpAEF^()>Xðw2 7#M߲w=xkO==W ޼` CWgW>B-r>}n̄BLTЬX(goc{@-ev'Uë WXLDtWD ҆*lZnTQf=8* o~u8Jp @ЅB֐ B7A$SiyZq?8V\O+.ӊf`F(YF86 fqm0(aQ0h`F,YV8/6 fqm0(aQ0h`F,YF86 fqXm|p(aQ0h`F,YF86 fqm0(aQ0i`F,YF86 fqm0(aQ0h`F(.YF86 fqm0(aQ0h`F,YV 6 fqm0(aQ0h`F,YF86 fqXmBp(aQ0h`F,YF86 fqm0(aQ0 i`F,YF86 fqm0(aQ0h`FO?'L pD!.pXAd 5Nw[&1Nd 5EGҢ-8{  @H7 q3^3e.Upc߬8ht5,^6H#u@S|Uk4 o'?N 7p-s,ը_/D" 4ntQP1=*{&섂x h/0EpilyM٫nbhE ϿwP?A[ ~FCmA@OphN{!ﭣcPu ? sOAg p pj1I~02l9mXS(Y{~QߗG S)Ŀ B[Th8X{] 3ސ&A+_ 8`DEesGg̺kHZm OPtJ]~z&9S nrDwQZ*z:Z*NV&vfB'ٹyYE$y9y^ BXF J FAAQ5 '4p`a'A(* <ЈIyd0\d=tN%Ev>8dTǎ8/ ($,"z欬+WU5i4615wptrvqusEDF=~yRԴܼ¢%W7ttv}4:6>yrjzfiye^P rr!0A1:#%L}#LXGO>ͩf滼Hzîӱ o rCxxb`Wq 4 ^hrƹ$~O z6 #$EM^wEn6GBkGÑ,|DH3$4kxiqV$t?٨؈~:*0E;Df4h3qONi4Jڰm 6E0{{{7;{.MJ[O芸Ue'45`!!e#ג_9  q݋h+"e,2*2(oRI+,ps7pYqFT)*c{0$%HNR]0l,ut544v O&dP=!^g@l1ꝤC9PbwwJ^GMs;j U}ub9Av<_D髖lw?US"$&Jc +k?燉 Q͜q.O[T_uV0oH0+EDC|V7u\f$% M{.ꒃN!Hw =ՕEBt/X_+=ދb.(5mONkZ,v[u_TҚۥ͈f 'Q /BwYxBb"5W3r)2A3Gc7b8q.\ fRsw}-M2>Rq>(%_cYEW4V7^RЗ=rdMDB+*ZVzu؊.zqw,'Ym+Z35kp0%oջ/=z#<~4瑈e=:ֹϻ22JMD ʚ=;Ue;"{u2^Rى_&5}9wCmiE1 7kّhII=$> FgcP?nG.>K7a6]cǰ۠ϷׅP'Gb%J!F^גzfD;jwZ| d2(pٍb}xm yQlg[_k?ɾm"t"^k!ӷo2<õ25/}e7 upi\y['Z12q/.2Z,o)F웥 |Dy#DiUNF܌.EY4q`SYnxLpmd7P [LMߠ_a k'GO-yu%Fާ912-$ ĚS!7dG魗ww̗L%clCjO pOX%}A\^sU$aY>Z Jׅ>W;؉q>뢹§&j(߁4웍Tc)If0ZΈT:[Hb*S,عڗ( LrWg/j)~{ud; !͒맬ůQ@SG gy:rFGK}5wdqk i =u7}"Si2ȽV2+ŭڕY a$tE}xX(|bpՋ3CrH?S[^.UᏙ ӿ.9s.UFԸ${=iVLk[SM9NZGUcmН ZfJ.kT::oaMd5FsE'zf*[6֎,2P~UߍZ%<jrTa1Z»\K+#Ԍ4ơղ_ΡϺ)5cVtJD]sEy%-Cn g7f*fE%n 6cw|+Gde~!O)n+-ۘbyqqQOJT]d V{F'k)Z3ζ\l0474+ZHpIRtɐкѼ*Q^]⯯Lp6|TToVH/Ow'k]͕PXoPŘ԰@((J W39mhn p7)>7i쯲LPiIO=x/R SPfő).W4xDu]8BD}aM2(1J쏆FOW*nD8z<-SO ǜ\()WVthfG91xmв\w{ų|q5ߌ01UuoPT0':"׹ Մ.SR˶:;/Ւ/-=R6EO6N.Dd_ߜ'(<79Qڭ>1=GfubVaJ%n'e鲟E<*-wʦ:FW je?#\9i$/FyZۢ ŐD8rޡ(?CGh-DQS)2z2> '2N:MϷP_f?r,4MF͠k;W,MuN"]V&Aa a>V 9.L^60ŷhu LK=I8߆)cB U(83V~5%#RĽ:oS/WHg:[(4D(3D.{bhcstxt/ƶ2\5aL8"*6_{UxH$xqĽT?fZvI>4 mp$LHvnWl|44MgK /PZ]vQњNU/Gqm\Lߪ{VYi~*IFlHJm"؞\ɉ)]8ȩ (3˦\ ~~'<S)o-CSPm]F@Gr#J?Kf@i-V 0%uc UϞ 9;0x-[iX9jFX؏u~#'䟎Ai=˳L }SKz=2'=o]zεG/y [yR1TdI{#ٚ$xnkSTkT3Dq "e3LRm`pJ_9]Ц320pӴ=a[ʷBv#W_Zf?쯑WM"AJޯF )]㔎@"GMP6~>t!rrʰCr2$+ӡyA"G4t D:`J5ʅ*լn~?܅j Rָ͏BKFB4~ !SJԿ88=ˬڔ/!=$R1HߐSx3г:M,ګ ~X?7\, ,%iW) B( ~V$F՗_^ >/HmheAe$3%nbI|1Nm&w}B4t>єD;ao6^o9C272;|Q. W;/C&cUm9,7RlPk瑮P&eI\xŘyN Md|mpHCvWWG%Xᤘ1V,&HՓ2.{g[xK~Ay5t  c$XuPOlq>VX`42^+&N%&9X^pUB0'Ҟ G|\r.5eYC<T;iWTێab <[o dhh7-4D+6$P'w$掁#f<$R{P+TNHNoOG=6{6u@96f +}@1Dy6[V]'82蹣pU %N8+b%VꕻvZ~eʝwyʡpI\MsOK/FM-o{fct&焲.KVFԞ @N6.7iMKekoiܪ bH*h;z¨]Q^ ک3D_^mcO}1~Нk'8>aH C WiaFD:E)1ط*LY$'ح};%/N-!c!.<jős.SYOv3f&HzC#$ϯ-8%FNؾZukH3kB?NΠzLCRm_vu*fYf-=^v e#e=E|_j$okEXcdfl_{G9߹_eSޙ5-O,ΙdS2 j\#9}(@LwqͺoC`4C:\9& •7I+e>r2[]F&9eX5Jg#\ On?rOXMgKyju6ʠ3V:"JA"YH%y|q#%3~w)B/ZXͧoJ-c>I.a#qy̶L3kΉ3ժ3$w:.[Ϊ;ӝ!Zmdi?ܜ,لSlL3oe<!kf \*ƪ=׭H%+UX\+Z?3:8`q-u/M>.dWo/R[lD2.yLo:WqB)#)O Gz2>Y0k2)} \qw{l0$\;\.ټϛJbl]Y;3zgZ!2Rw8h^#%eJ㼏R:D< -wOE+}MGCMUK3+܀pDpyw@)$D:;'g;g/7u8ON}>O!{.Q-@n)=zzЫi(>E'r5{%sCH>T%umpYgmS#1-w-o\2ՙ9*׎ fj^.?R;3vrvZ@yEGpz͢-/r[B EuyTɝ4mqȉ$;Z- s~ƿ u6ÜGV5+Q+?~ nM 4ꊺˡhy۳=~yF] /搮2J`.oЕ穸8+ſ<&+XKeX4\-Qw#M_-- խ6w9/|ijpJ1۷~A))|,,)qM9R*L6E$(y:}h҄Oqʛ[.dbءwCb N͔<"P,FϟlBX,-<訩N,^-@-QX}'Aubu+򥗏jm1)!Xso+S+УSiϞy) wAtXKy\'E?Hxl#2#n!th 44GnJYT/91ޢ:DϖnWɇt.^P UMI3aj4hNYZkObnN*B-8[MylOqn6/{fڌÀBCƵe;+VTB8X ^X\uu?r~WFtTqFdpvPx'<5W񍊷\?Ap]Y[:鰺鱵&oẽV% ͻƽMjVKT0ekwD{v6rиT@oKFHn]0 t_ vӚn_\Wwdzey~ڕOtZM$TA,MAZyӜ~UxVw}L?)H:ױkLq?ۉX}yܐ7'8ɝ$&UiGd:|菓< .=Z~3;5y]l] FϥȽZte7scQW)<t[w{it>dy7DNX!O`Ǝl^fƕ'gvE 0!O O_#DleMTRU]NyX^_өjs-Ř=]n8}qБ_*?TۗQr%RTɦ5&]d?U`;b\J>jtpT-{- "N#@ck1)OV})b\$d_v-%W=cZ_e0.B "͐ O-S]GMnV1r+5:PYTy2V1{KSG)b<ˣLy*mQJC)ARZ$(ݍt0AHw.鎵w{oxf澯:皹-ʥX, ?b`b%}}–~%F-e tD?Q1L9:-l-Ӡ"p՟aǡ1? &j8!ma͊qiޛm2xՆ! \{x= 9S2pm <08x ZY6`Cyhk|@و7<~I97tfӔr #c ^ 4d}y(k:؍ֳ GΟ@ ng0 hIX!''J!|"8.[71 Kd֬uJukQßzTg희g_m3!ƽhWWhe :96H<; #nAGg\( ( yC |Aki,~j|Q,.]ϻNJtqM? 9gogZ7T&|T2 gC? CvU@ &]G6AAc<|K+M+ {«OzJ8tjCKqsaIhH!pv㾼1KW!:4rTlgnTEBZ֚JfY-梀JZ;g[/ e別xij7ƾ){Q[J-.Thv|oEЦriaἥ I`3_?/NT0_ 1\ aEp#W{m _˿ZvxvBt+w3<jTu0=aM{a'ZUnHVr҃#3C_KvHTw,'ە˝&Mk@"|FjI!dΦ^ƨbӒD,֡ςIK b/*)+_.}<-D>aW۰0ȣAa` ^`sעB` @D܉] TA aɃP_2P0^?ۈ V"?z mllQĻ!.ƷO!1/լ5m!ӓQvsE{V V%}A" Lt< #iotXDW}&oi'%kzJ)O&HtBq%w)кyCkF s֛b]6%VsET+~dAKW!z/.g.lIK`G <r_."-j9:*'~B@8P)9D0|2+jk&&=[FمKU 05-ƕH9 1{ p]bbU#()B5ݦqᐈȀtg֫ȾFm~E{&c ]+D5-]1TJN,!/ _RJxֱռB)%AiP?r5}[ηMR%JAoILfFkM==`yo4JGъFZD #Y/9oϴ0KݖL#4dj"峌}6+'A3 8 w6B_]#C>/}/VFSuw hJrf_Z5yuyi1X_V5i,FTkԱ+zihC~poeaDu  3׽ex?+0Ԗ @˺T=Uim;"a7)xK*-&zFU6/nԞ}8{B*`xõ"j =GeICިv+yڞL+]v?CX]O;Lu.)L {NΟ48;2֢1<"Y*>/$>{C^|iCAPr.9,];^dd8TbbQu 6Zo7|t](mW۔1]}Hp3'+Z~󐵊HAGLƪZW%%1:~|[s)DMqΚpJI6_{B"CviytKKR~&lؾii~˧N;W7F;66촕l?چ[Iϯy#tw>4|<>0B@K'S~W^f3]Ҟl Ila@@裁R|L_M0_(;Cֻ6nG}źǘf %8@ ֮cMa@˨.n،0 9#9'Ҳgs#¹z| 23i9Vu~hx`eqB{k9G2[}É,X0%|WqJŏEB({J/ﵫuF&\Sm2WK6%D)|hkq.?\2/EÝx=L)W(2fv8LMĥRr^?o-ш G 1C:s6qT>/kT')]{8THQ1 O7vYo(%"b!6Ctw>fx:0PU^9ƍр["&y̋E?0ՊڻY钝Cj ܢ>wY#߆#DԼ 6W ڛe_tQl+^tTl6әz29KW<)AbV^ңhdM ! @"bcUZMM$Nҷ8 "7[$P hfC`|^42l $?\=O'ZbShəIو)Y< *;v|/W<Ć~Pf{)! a!mtyWQDlh⩌2qlx;Om+y}$¢y.|}>'WٯrHOrr"?RE9 pb?o4EW#j^wA>՛Rr1ʓ"^W@ͯj_o ~\Cvx-dilSe-*V<.df"w֦WTVq z3 +gƻ¢Ec?,.X/6HUMΥ)ûMNYIxvcO9s?8k ̚)we}0 ,բhɤ%a5;C/?'ޭiVGư&xt(ʝ8B-=㜁ȧWӅJ ,Lf:>2R1汜[+Uv;vSw/ogt` /1m\pAHA!ɷbasP91*vWɪw|ڥ#?:4Kn tKƹ,;ȃiw%sELV+`M Rt3YSDjM  JtRYPAyS'N+]YBhFvp nN}lc` 52*2+Ǜ%X҄"Wٞ79-mσ_'w:Hd;j5dZ06u]\YƹdX".\YB"Z |pCsЃ ^jȶ ,o/|u9DIHDKy8,|kW5#nysDkҜ=0SߴN~ M6YN7J=&A>;)U6ƔQbޘ _H?ZmTq:izpⅪ$yENxn%Ω'#s'<!0K}ȝyc І:4D/އ݊QV.(tmЬ 6z_'M)﹜ݻ+?5&qІpyjD9Pqͧ3|g4,~ZDXwM?DWϳާ*]6L|h^?/0\{ۍt{-OrE ΋snU NM^xl32dԚ9grE/̚fY%\} n,)ړįռ+C.nm^-{]Χ[{ J63>lw)T/ߡ T8 ^s݅ς ta d%D$HQl[J98i X$1 (iJb|ZS_`Wܻb&]u6xF~!֬hN)IIQ.*~Pp wDM,v!JY4B66mFOfmLvj,Dq^Iy0n,7Q`yMg x`3uݏxy7V~9 ɞwLWٺX esq(?n^2{XhiS$"618{9RD44,a^=6 {A[261@Q$4Ud]TŽD41q6-|EC>N(+2` m!ǁ qUOn퍓nS8P̝gH:32~}?~l7-ِWT*}hYI/ $N:_ J2L,R0}f ;&Qȇۓyl}kmI,̽3k-۷Hٞ)睇Pd/LAfo9ǸD댥ϘXQ%cTV۴.QƝ %{k< gQ/%s'#*̰ΊPQUɐXT4L 4?ր$A]Ou%zC@smWËm #_k*h4%o[Z::-|80UUx&dLB i UOvcBN  1}4c_:=h}?rC#Mjbϗ%|p0\)E(yK_62mޭr=c ᾩA;L+BUChVZ+OWՑD$r6QmoVD + l8܂u8Mqw:oaX"b8 뛦[b{DwE#9o2yYsCfe :d-؛rYZ#QĝӟX܈y']!j 1u] M7"~Ce]5_N:ELqQ2e<=z{4s&>+N)+"SVEW(烴ו37p$ wxredشh0\5cx)f7 ZlVVL}B5WX$F/v(G!Nk%5p:Ȩ̀`TNe3F11/OB;U=HI=n،K#ǗM&-Ԯi+k[)\1_?Q9Օ/8&&Ԇ_$ø*4o)}n;6{:Uf!*LqAr]0 ҁ]P&8 AҖX='PF~-n%yh#NОi.zzJvǸwL9pBI`E` ($@\HUʍ x?ibĚMGT3>|2\Wӱz^(¹e"N¾f&$] {gт#XH{_ WqU?! @D>Um j? =ۊX3ȸZ9{,E ^{31XP9S0Y_S?[8,Oj̗U^|$줝a Dd{(K3KT+CV͕ 8˲Ϣ\Yj JGkhrj'iFalYwp=vV`mՂa;Ɖ ` x:B{30{㐍mˠTЪɉ6`5%b N`Cg䡳r![uw ^@z*Y.ͣ EcWxs%P}s%pfD$0(Vr;v94'ٖ=)H'7}Js^wUpd ^LI_*gwԿii?ﶓ1᠝q?. q[ch[cϞF`~'D.뎨4 ?QB c>I"Q@:- N(qM}'%hڒhY޶W(eKjjʍ^]zݶ:.Ij:A#Y~9˰-ӻ^LuFt)|Tk6޸ۋarq?:$E1N G:Ϥ=1Rk [-5E9톙 :9'?$:Ĵx!0wgJn.ڴY>[F#i W^u9~>ud,+VBu:GV?$t.fOKz>۰;$M}#i0⨦3c\c.j;5*<r bw;V7;!^1ZeYd"Xm7[+ *}jx;غh?Ц#1 (zo|kǺu$}1,j g:$jD˄[BxP=OLLww`# Gh;+NJGhNǹFۇ e\7Q,l'.=|x/CUL7aE8_36O"oWkj t;~ct5 Q &;M&- /xD<-N׻ Qf-yO*82HV|[|6 +o4#1L[+ywSpy ۜe|^ḛYK+X{K셼:n:0 yEwU /sΥ bk󕩡]udwG? RFN,*{op$C6PM~hS(2.wvCƛOt~}n{<2ۘ vv%-0+I5ӔFdEc|v- pS= c1[krNN>NrҲ}|2saNoE`|hpU#=>=| ~25 ڔ8nXyvQv.ImVwqSDtq?W"Pjk $^vu%͚D֑-ؘԱ2ky]| Dۉiz?AuB n3ׄ[xSwlwE1N:^ ՆwkSVSv-i& Χl]\_ۇR#EX X$[EE];*4*>-%H1|f&vTX~=!Ifs@/v{UvWp}sھZrJHBiFjI6cv}u0{2Ň6sK#)cmnb|;RY?iBuIel#"NLzE_@KKX6JҨ (]f!,5Tv%q[L:_2YE5K9;fA xѯp0ؙɉp*P!ƣRUoce>\!i4! Zmc9cih w(WhQ$(;|oG)oj enJIX Jnϒֿl )`k9gWQo- ]74,hdwLjXޝ"Sk`ٞǏ'La&TiH$I9Tbfw6H0 WU]_+n T<Ȑ DCc^l'm3A)SYd%~p+t#Ͽ93By1ufVTR?i-Cޚ ƻ;V{Q\_eehcUW,QСPvWῸ2ʧ˨HJR"@h "50@7Xuir{ÅGûozH:M#C5)D#M( \K.Lb;2VZoF/]ȧD7Vĩ78[dE|c_P[h՞xrclf[5%Ҏ$x/ L:?șinW[瑤:<= M/ۃ۲}g? Mo؍Nr*2?|P|؈g I<T-iˡ8s(`Xoh,6z/X xcdi$}$ #ǣU-NMǂ(<`J8 {UOcג41rpnUlέ0ؤ؋qRymձxaienj{Etk%  93$ I@DɒsE@rP$IAQ<䜇q_a(tɱѯ,[;x"&px=S|gbOq :DV13XbBgW$c**Kg9MK "u)B}Ӿŷ֪)NGPMp`}0>Ԏve;^E.=>D4RWbH)$+iV/d.sNc!궾GҾ7M[-ZE1* [5Sߞx?,xFv5HB}6*zvl/|EN <*y_W+fQ"@Gni~Tg(~`~zfxvW SzhwY|b S|$՛07}̸(<$KM܉^tl!s]R,;&z~8j5FU*d69(ؚh:hz1хg}}+"+a{)e޴j]dp8)1<~R\A/IUǎבJX J/~[utt^طGq39)Hq|9/i9nBw=<@,|w14LGkJ^y]N2Sק4ѥŊM@m<UG8'FV+'^A8ě.`is%}WP_ƱmjEe )RjD|F|w^rW?t+tiv \X4c~؀Ѝ)W.~Oթ,r~)%E%nkCy@pxwHȷIQgf+<ȑD>M.A)5I-{ Ai jOCKFRWhA ~i;(Ϝke{.4_(5ݢrgNd1!YZ<{< 6+Q?a7[͝+,&|UA w1/1;dc@uV>B GFݧh^iX%)ei$+istwԒFz% 2SҥV(zsyo,[ mp1+*v1r#, 9p0eXmwtƵGH ]Ny엤2w|ͪ0ofk)@ m)&!gd( # Q"6cGcjz@_O2ON[WZ]Е+̠O^bD 34Ӎҏ(Z]9wCrṃ^  ) /_]^qFn1_>.`J1]_* X"\oh.jIpcvxD2+|(b͖^`v/S `WQ6Ol˛bg'loUOl R=kTBzN^]# ;aJ$V'۾f$|~ 3YAgpj}W'y%ܩc y{/jLa.$H‘ŏM/Qݯlqn6GUƞt.9J{ŷB"qqvY3\Sl{#ځW!CEIR&F۾7#/xL;D*O%}wIuIN-RnզPur1CK^] _Ë7M9.SsXy) $BW,ReTrPȤItpK\[mω ؠ(?WpIYګ{FV23ۣ7Ak- s;U(rn1a3sa5 .;/_Eް56Ln:It2$*}zll{ oe_T`EOW ow?GR'E5C4>Єj+OST' ݌{|q7jk;@-M`[XpQvLQ;h*Ոu^3>&o?MStl|$'kpbg+a[h4-9W3QE1t;Ⱥp8;{tLwzoB)*e-A2J:mwWn&L߭K %=8HИ*2@8JM:[l_Ntەk< s BN~_&`œ/1e$~kO]ؙ;T?V--T;n-4 !d.P`"Dу *ccDc<>n 4'0ZL#fCWDʄ*T(6ֶ2."KV 'ƞ*8U֛'@>}hx"to/ZZd:e/;otLcHVb_ZgbA C DnDc]4a>Ehg]س5)gia f& ˛< ,Lq_͕Ýꡤe͞ G~0P*>0x/sߗK%f/ح_aTœ4$0!iuGYJv|Zs){r"enc?E] J7v0egُ/wc< Y+TÕDzDR=Q]c݅paq;|5?#= Nv3 u*hqKjGw[ A0B02o/4nuU1+AW! Eو ᳳMuI5HDxu*(l5pjB#>͊tg'vLg׋PJKvMqپ-arH>pp \ $癛"򚴷Kw?դ|+K:Rk#1#GQ޲ƁwrB&>Nrje̓buȜe'B7#F˸R%r)ͧ4hяg(߹:}U+p*tQo5Z͍SCg\$V|(K_;t*ڠLoKAKItbyZ?)Hvn5/{yfY@K<6%K[J\P$cV& 5KM>Դᦈn/T܄[K-]Է\1tߟ4xfDKA|:DiDNtǁY|'l SKh@7]M/q͇ܮѷ {~}[2F550QmѫCAtxdÇ?NQQ.g.L9_SYվma2彪jl^կoy66RHrb6֗Ulcfa tNB܊{xa#34ٟD͛f0K+/,,WO +F1vyRûkZIHd!Ϯ3?5NyE:*wmwe?qъ; Nss-&g` Jm_)KWt\;fKf\(??fbi>NQ8^ mְv͒NuۨRNӢ_Ct:T#ۨ{*d pg]; I'-:׍d*E2t]Xgė%7|gF1E/#Pmw.Z%֯-пne0!$>㉙N֙@ HUOk):9~5UK<4~Μ#c|-oX-#f>W#D;PEY KyI=!gC/EQV\:hgw%qx?M>)N 1v{A="ש-(w [SO@? дYyAUsQ\Lf@Ӿz5yњF iDubWn/$$eR Flge6J5Vv&g玖=27|> USw:ЁTPѵw)u{|#,)T]*O?gX E@ݸurT S/NZһIը$l{B=V<̌Ӿٴ?#?0;8@?J:D29Z&f.x'C}'SBAu=vE_a6\|7TS0ɥ_%;fqe XCCF TDc-٠nzcԡÉrt]ScWf(8CRr zj,F\4.4xv@rvdTTsrNsGWO)xho֡.X@k;VZnT Ľ&y{A|}V^X6}û-Sh;otmcd/~DX{^N"U9Z?7 "jI۽Џ2~NKmYZSl`/#Ov0t" zƞg #dO9 (rĐ.5_!ϴIOo{̎~0pF܎-H06zgyNJ`N9`,M@ePcOj@-`{k3v=^Ï:T*Wۇ+ɳHgN j\XOm˛YSxe0/wc3^fj+<)]ۿ]Nr꘳#Jbִ9N'@/ hysSVPOXYNItX2:=æK[ᤥBh +Hd)˞bpD]Q}yɟ~LZC.CVTx"zF˴h ރ) j Vmd[OaBn)LֽrOg\ҷ۠|x,&=_c3/>/Al1.785-pSĕE6>b*L"M?fT}(@ޙ/kgN_aI`" <(*h^1 t2 =J'AVc/x b.WH=>Ի򷃮xaYKE.>:B "MnZl ķ9}3-jb&8`]L&*:Xh+Zy롵ܡ u> Z$l!<^To &\rPiTq߰t XtJTj=b%3s[ʡ_c;_#Ǡ>7 Kbe[zjzV"Za!%NȹwJDo!G.0)gqc ߧíAim67mWu6.]gp1Ґ)G={|;Nk"`\䴡$`)8ǨuσNż2 PE_bH))%S΂TEkgqoIAȘ0\XXBu dO|#s({-|u#H+|n>uR'@ i3t* "DlT>c/:-;'`j?1ٓg+w۴[ꉡ9K ]Ʃ4qQiZWQYSU#3op:6hZ-U[~&)-rVdMi͡*('-7QoX?v 9G+a_Lcx8̪:^xCEg.=AxAD6?RrAjgFeBGGd-]mu'J}D[Ue]àʼn&U/'LC4dx[rל?xf E aoحd&h0|S唨NIĿi]&18ݗ3ɠ(JK~]*2NYl?UOM";ZBy4iXE'17;6z+Ad=Zg *cy%4Q[gо$DlqxQp(8ė$P;ð{$)DB]E%t3_ >}i̷wv_27eu\I4SQi't,+lW'Z\ww(dq|cj]tKeRj(ҽltۅHms#rp >[Pޭ|1n`2-ן(D${A["Y:ԫ\ jGSM<7 }r؅C gokt{_l(uo8zφQY[F8.Qed^lV8s!yDu-F:Xb-=?Qz#4Vzz4h^o2;:Cby8.Εihy~p<p0逾ÇZ S4痃2Pō.l!qo3~̰k/iA=?ʋēb# znnOP&&̣oxfx6?0{uh1CزX}Ѓkmm X+λ1KFJ `݃zCLw+[r1^H‡)~;Fifi>9|DrCR㳆KD?:=uΙcG]Ў~iJ=þ'0ヵBRP |h/7S "ɴ~o >SOIFtwFzxl8aJfbfvٝ4pQ缛]c~ppyIRȷ@SBA[pz9}Gs\M+h cG3Ac9hg|#I<w7>:RSp㸃 *S4G 9sm&QteMúUz~37Œ]9c<.}bI.$WrW_Fo^>ǴAq&&G;je(/,-H:/ ?8߫Nɬ,,+U3Cr- hkvK:J'p޴Nk<Åi&baOQu,ՅhfBxg ~0P|Ă6ǩ&bNq r>cb%4O !>W?\B„y+:"HpWkem+D>X&o|As|z ~'GXs\a?>Gi[f,9"f {]:7:"cНu{>`;'̯_UX`*9(s%&S|zQD{Z }D(S}Ŝ?{Fq_6h>rUG,dKQ3RbbM&qx_<\9[GUIhr6 ֨!oh>>$ы$f&p @\vNȊ6$`U5Ga,geydmL g,X2o!w X@moE:"YίL>>/RrL/M/i@$OXs_eCCf3+E3dW|p F˨2>es)*uTɵɳe!*si S Q5/VWڲMkT#N X@ |3̋"4p0jVm^/ K%;#2,+ns_ ˁ^g4!t'=R X5K~QnF7t kcLʜAq/Û"}r-H{<үʵsH)}s;9+]"|T{oGXEΡu1/\nPAʥ='@|Wvqm]xZ~~<hK.y1Y@񍷁=W f`b>6,@p2Zraa@Vؐxg3;z*9*60U*wԓW=:\[h\! 6?v*_7 Jdy_~z {Af\^fҙH.Hz^.8`Wc7-G5He"]:'PN|b ].qWZ@޺yZ8 )ogUBwn;T#EDSuB [hbǎ)*AJ2{;zPr:97Wd޲ _V3=޾Xy,jV̴/Hotö.bC(վXߝr؎֬Ūo 9*h}6#> ™\zJU)R-LzoVA\Rp׻B=<\ue|FOTM:}'5_/m2H?xH']5AnJ}wh8rF$_ /mZ_7^|'4 l),hwUPzf6KtE='iyGAL&Q+,X\|QúLTk|*oJ\\UHqn1u7:@4꟬^r.>C^<J_ď">:+Lh"2MD~Di3|5GHfIQZ6l= ;{wO zsD'C܌KxfHtm1s#U/雘 r;.M6* ߟGeljiyoǶ6B@K$@`ݚ@@pk{p ޸wmٯ>-{xUݫkuUk)7% Z(~5 :hcL*Dc F9Q9pl)u;തŅŬwct˿HJUr(U?Vnj9$g[zxP~\1s'ոߑ1H|j T{imI" m-[Д/aߢZ# $lGŦ~ZGLZ·|qoGAZ7ܛt|-Q]?4}G`LrPr H)`9(J} n(U*A ytpȗͩTa K+]L%?gCÞlS2wb^.?h3EDU7yX #ďcnё!q#ojauQb#=RdIU_Mn טрWaJrao,IKIwUy}yms Qဣ"d,ʣ3Op~Bt>-3܃ڭ$گb54/ܷeAPETt(}p=g$A$m߰cfz;VU-Pwke~{[ gKfnQ =9FçCJŚiQUaX&R)WTY^cX>-< LUէ4nSfj̐_7t~wC9pNц/ {lSZ1!JVb}RܱͨN_`FS0w'$V ,׈ EJvS/UOq4r;L44/g#|S:Ȱ[Wa;L 1*Bp;,Epg%,H|ry}H*x a4/C5=7DSO/ȄXҳ;4ccbʄ|!gފx[+QH0# CpwQu4ruz` o9 m{ F*%$?MZ ᐲub850NS7ζߪ>rZ&Y_<4hb'h ..PhÙ3&(sJ PizYx)p ְw8/ϕs!X8Ȏى&V:;c M|8^yvt%aM09<Hw nҦr !kz\8#؜?kɀ;ܫ(xg;ET9{ eENj@Z! ȣ+\QӦ5@. * orZ8^i$s.}/F77  80bO.mhnfqU}2O(ODA`+e5 Q`:=\KךB19]d@^"[=4i %k ) .u{Rk;>kTTÔ LU}pY>(Ҷ'r~Rɦ8R)@Gu\;$ZK ͗8F0_O6iN m}QAp uO1 W[ |s#כ3<-0}:^.wfg#2*B;NY=ۜiAػO>T ttCVYft?٢o -lYH\C]UO>]D2j Ɍ"Fg޷ݧ=: _tV3}B@m,~s폠)~ں5!A| YV3іTiJla<Ր2 Ǽw>[Qmb¾g- *t0<&lN녂U|\j'k6vB ?pޜ}"!M`cpkOݐw}ҬKH&gPN$%ö%Obw_ۗpQ27olM}6I8 G]v @/^Gv^9mjޣ|6/T~|;Tlya{='`=}fvnƍC\'6G)Ƭ:{p,k}xv݆#)l6R&}K=M_K-2bz nB=Ww131eAՅeg@TDZ}6`1d$AJc!tǦ|ŢM3N,6zikn=9MA5z0]//SAC(eq=$x0T 2KRyonKvD_s4x&d;jt|piURmfJ]񷥬Iqb5xe7lXT4v)2O>k=|vMFVB m[ /kAFZ0V,S%!aU1{(6ngfnaP:BUEmFXSǦӺ fL9*2L3z4%Uk1\KpwF}P!KKק-FʱIaVs V^aݎfا|(;nHҴ_:X}־2\)` izH&J.N1/GkAiI[ѻ\" W~B.έQPG zpL'QN{+Z{dFb'*ZіЛE5*c0Ѣ(5_"DzǛg=RO 2 _k=T P$~ S(a B/7iQ$W>G + 9s n.@9֤ED*u+ZiߧۢEX~DIE)~PFXvP'6*^x: ^VN&L!Z*y'"$YDkF!L1~=A{[0 ˬcôbrxUebגR 1̶!]0/w=zq1K0|A^f5ĞgU%U?u0$~@\ i0,n6Z_JO_A_+x (\TFOsf/nY<ho Hk=iPt9b=vwxn"7z ϒcxru//ՙ8Gw?{F閎xPHk!"!"1ڔ/]jYCցH6举kTJȫ0\se^fޝhX_y&0,Wy~ﭟ""+ڟ<ȑ7:+zWyMW:0"xv"\Xf\HJGqL~l q@9b-(Es_vj ~= |\E)i nv y S<E X5AE:C,_ȰJtU@N7zw^5Xs  c k' p Pls ѓpsZ0{d'c)fzmT6wzjqcMWBX>` =lZ9+q@uE9Z)Jj鋉ҡaG5:AnϠu ӯL*2c2єܤ))Ym TcHARC1qQ$RؐBʦ߿fM!+CN&|'>pNK;dN@-{kZ.J(IWI8U,"1Ըt)P%FsF z>}gŪ_92Z~voͰ61hY'CA0?G>!tFINHӊJJXo/AӨ> &L}>$h\D8x0__"I R'@6BBϋ|O=KxżܽIQloj / qf%FKWoyi{C򇷲݊.A'$rY2LSQR>2VBl,?wBjw$qN,5}h;OWNHbXX'{  ڸ݃$E[8މ@]lй5ӳȋ4CtsI +sQx~Q SZ8~qP;>6W*tlo=Q3Ɂ!Z9`TүΌwxd]:*q,2PhPTN~^CBcivnyqMCD6"b.+bk6ă^ ^CS6YDo-<̹%°֟ EG@mAKFĶU%i"HBY8_X㗈E): #@cftERo # ^-?e>$*U-tM}GR5ii]ͅ9CO weI"# "`hwvPG\6.N_cj~yq Bz;1_=G8>(DKh<]` s42bNN֛̈L1 y6+3 ='8L߾RPLzR:`=`4hQO;~!o\N r+u :Җ3_Y\$~47u/IB֙JcC}S& m4E[ćHo\B#fAQ:%vÌߚ]'גz U)k9bRR\`ݘƫɩ|m1c9 BB]udMY&y)0uQxfq"{VjƾPB>.Wlw5oJVxoI]׽-4wEuKP\8^|FN@l&Bke9QС (Rg6c#{Lnq%2R0_ v*ν ,=~*}:DDpi*HrF4/5`p:#GϚcyҝhd% \/S In-L ꧙yq*U c|J:2p=vtˀlZ; r\pI9N_:Ōd XqLX fK*Xڿdd^z(>G{㲘< 8Oc[wPu,kH~P(nP8 .u"p`N y s[5ֆ.Dkq6ZI:i(Y" !O4p̦(U>~ŋ-7`O Gхr.Ŋ|SS^9+ p1ɑHo4^l]@g(K\zW=RNywrDTuCnIN;ypmb`O=Wx{ĴJ+*[=vpI)oj~("9l^,]ݺШ.uԍXΙݟo_J:qsÊl. 2|TljC8b@h}#Č[ή+NWKz~AD G6ga]#.2,ŒoGu 2zEUnX>2bCs+qɘՑFN9wkD 6i+ƿ^ [um4}I)cSRp\^s]]bZo=q5H/OrHOx2|jCmrC"S-&]H~$jE|Q "PP1 nsqF%HZ"@ϞW̢4<+t[y_Dr!/xMH28(ưvʺ;Xʞz)wR(垛xԒgMՄ ]v.A7Ւ3nFŝ j[_;w~d~zZ2dIXK9&z6?rJrZ)@ٻJ##ܣHW1B(SIQH2oqUa`t-?{aK6V$"CO,v?i`&0 lU=Jc5K_w|Gf R~fvBy^ N(J$MfbQ1I.ZJC.~1}^dW:hR|Ì~3j$U A|]:jbb%XxLʲq82<5+Ѱ/5YINBC\<.VoZ]|qhh୏̟bRtOa jsjPy4+cqEYt\Iv99\5jr\nR]) K Dj1Tk|A -WH&Ы] q9&F<? öbVV-݂j;<ϛbbM5\׋w';Nw7pA /Vtfqs4IKeeu|ZU9j]Ei E (*cG k+sJV;1 ne}1}d>KNЇnIQ\*)O1Dxxxbf}>>ѠFxH_y+pb[~D۽r_)nZw#jWL\ּC0tQzN%yMY1Q{{hb6:5iy硝"Uo1߹|Ⱥ3BQIךqxז~) P~߿OIpB*,wqX5b`8x??DZ|C_ē.sFrq~XwxΪ T=ڸF^.j%KىPfl a ; 0ƈ90 4`W0z^8e.!6N S-[q?w e,z8Ä5 )11ckڦE-j,VN9qa\,!ւPNb'}zZԙJ(c6w>L_Ex%f&vQqv8x:^>P@%^$[C(\Дش" ejT ۡ %UN ] Hv9Tⵘ~hZeQ~?Vf19 X%FO1ej_rc)J/ |=.Y  ޶Cg3 ϳI&7W {y-)@E/JU]dѦSy,x%.vBhCa"ә Xn6oy4Au\yUExRX*EzֵW1y$Y5ۀwrI+ ѻGO5!tyr%ĮD3ĴY\~ ?8C _<.)w&_ҝ:XFNam춲>N^;l.qf$ry7VR `/ e8ګf.*۫5S~לŸ![h8s}#ZF AcwK/E喚Bŗ>+k}fm<8o@3'X޹bƃ RD  JJ:z`lQ뿦zp #5 VO7Ӗ? {WqnQpWLݥxf@ ZQ HB0m"H_.L^S^Y^|mݞ]rNQݲȻ)~(L,47R ö}*e{e'}鵫Zͯ׋OF134~Yc̬wvЎi|4Y10 '6>4mO%+_YXsr<\1+ĮiZ?of6xvG^8NS,L&ݺ5;+BoT:ii3(:y@e(Xsv 6&&kL\z%ydAU&uEDnCɮ iYPzЉG%0s;C]_1b: 1O{r V}OrcoĠi{Y*WN(1'fm]!t]#| lO:5؟.{<)imr=I?4udѤh,I7A@Kmi$[$IRugHdYx# WHXg|nEXM~cMI:y& ˭]}Wǭߜ*e9X6 "F+l7H J5N^yT@ibCSV}x R05ع O*ZfVdT&.צ)e֤dAr`GЃ;ile|~Y `;XHvI(a^y^ ~n='SŽ rTkmȐ櫻yd7 6\cꢈv2q|T"@qqp2`_@p*Mbte|ӛ4cFNe-Ao7Mn?9w PܒFБK ,rr)!Ci;7wԛlܷ}]{xV68뇰1 AfY>: |{Lc'%,5mM6̑9,3y[be0=_ȦxmU#C;]{J[Bo%`.NzĐcYLuxLCE]\[7"0NLCDHV>Q^cdff3dw?|歟]V;9ݱWn=iD:}c:_^G]S`lnJFшa4ӝV4)_2_[VF {Sp*o~F ; UVjqr˰OlKU|풋uV|o;jyyE4T'}ѰD,U=E0(XY=6Y;=m/jJ|#D|27+h;|Rb;Xҵ$3"D@@ H9Jq$JDrR$%3zݻw/Ou}UoUU]fIJm;l#:'j|cQqF*n2#DJcmtv4f rPM ^Mo0|oȔ9pskLsTy|B}cHc9+U*"Qn.UWGmuEIlLFHO!G*NJ@`~EQ(w,tܙ"Ky`ɖP{L̏lM3yBl؊G1Caڧv-Ҟah>[|+h7"AY^-Œð-V"Tv *W(P e-Le@K'xDW-l{ .2($5M=^o9_#(ljrpWs)cSaaD:Mm~VIꖿ0ρCFxՖ/(pyz_t)WU#{SK^EwV=9I+7>$|̀ @݇'@Hmpf:M\s# \_ZOC,VdCl@ HcK@" Ћ n/q)yq"G_~/rj*.,OLMY)w"KǷD6/ST,0>_RWRY02Yv}rv8=?wSo>SFYE@ 0Lj֫ǨsI` `m Sy}hVV_=?Wj >9|V] RxZ%GmA ױ~RՋzB@r:s!g ZbZiS zNB2GB! =@|D$,GDB âq!<@qA@DdD *5.@ċ@|(bB!}Wr ppA?+cX l,KXK 2+Q PwH?l 𑐑P2=}Œ\ _w୰kf'wSХѝdc4Q#ϻ\D;Nlu=s;N*]ؓϩ>gRLDjƟ>ϏzA-hÕ_)l%H-ةle}q5ZSӬ9QʢBYXXPGU^Iڠ:RuX[٤NMa3 F,ʤ;TNŅE(̑mON揤l9`I&ŝiCȏė̠+''+~5Eo: iJ}\rOnsVYh!Ыg:)8Vn̩ PU2?UӏqGϽ]OQqy7r3vrj*ȢJz+K rt ez: ,ٵLB@wn-ǣV϶.etr{ +Zv5 N78SNJGjkpʾZ<%[tS=DѮWovQCA pVsögLPq"q'03u[2+MGgZDNDwHWWqBT.|L+0h幚.>r)τ )TV_soIgyR/FX#&}6Q۫k 1Ƶ Ȯ agdu,|jݹȂ0k\&6t=0PT&|(?JuuB"“t?4, 6A^?~ܔ&Mf||rȻP7;;$>5aPfoa `2Vsn+p:%^ګTmCd1qgR^]@j(ثq` ]~-c 'žvc9ڰB XaLyrXw(%x½Za!=1_A.͈y_P\K51mW6)13M񖤵zB]^8ol =T(,3Um^ n}4bv\[`ѡ*\I ?ɇ "g >϶$Ն“`zJ4Fq¾{{]GpA-xK޺B G^Sl~ Te z c>*4Df~ G+́Ko47Nq?-DַkD+V/{i0,89CXw&AO\E)hV؀1dqmôa.`"\0t!&wjjrJAp52wu}nZ=V(H <޷[jNHU,mNo)Ddxǯ?d8ٞcB[W A՞<7p姈"SocNo29?@b(l-تEHR.˰_/aՀ/ ,gS(R]~/St9kE_Fz8T⒣.8^pkÏ95Lnr 5s@8Ϩ *!7I~QDVxojs~9vƹ;ngL׎N>ybhܦly5"|SsF&xe֬99AbUl;-n!wN|ۨ[_ F"!kBL1Ux˱ʍhcͪ\>1Q8+]6ǾGr50W~B c2&yaO2wYモ}HeY;1>fSdg+% ƶoxdKlZR4RY{bјՒ#5K߁ѮTiN#pz NzEs~o%Ҧt>T9lXѷʨL_"ڣL֢@D(R‘ kn%,LLލ|,ՋI*F/0՛ML F>[<.PdCw_Ҍݻ ~UmLjmlPN]}gb[HSx>cG,5^I'-Rx\=5S.cg߻C0@dF[mV4 \Frq_Y6gX=qZ9nJ)kX 1ތ]|0B,h̫10%0PlpR,U{ЮYRpa5tx^2sz%d鬕TBmr]XN 4E[6 (;ui#z>[G<č/vDXC;,H'aJK~4 To>gHDX4{_cĆ@wa Q1&L6S1v޸#13aI`ʎ.I$|ƍ|#aLYVY6t&ښ2DS՛n{b o^WZ~u$#zU=V^(!ZN=ayim_nh[e2Ihw|,FqNm3w#wRi$y*\ "=f]=9y>,J`V1RFɠ!x(wK1۳hd`(+j9y z-Vv-S-T~ť*sL?S)gP@;/mдYl@ɋA/irfy!kas09IyTM)"I%;|%RsZ ( ="ƶ-{v [q(!+dgep !h\l,Uҡ&Y5noQ))]oٓ0%$k]kʃV~Upۺ*2R[™ԏ4 H, f#/EU\8|{8I]#?B[٤Az@]512!+=kct( S o5UT-Ľ,{jRj>m>JrߐClGvDk=?.7AY! wO/vFM)1h Co%2Ū"qn¨~5X=0E::\^a])@tTC^#ᑃ)[%ggb7BdWiɖyܰ })W|@Qvt746'Y-6L`fSX٘Wͤg *N:w( }r+HqYRXUw0GwV#]>oOI3:bSYrÇ⶯n,x/+}XeNfcYejj#O͛YjT)|-yuH._v^SZFEFDO7*J*$Fz#KI$KQ* wʄBW6{"sSc*XACC7Wؒ)?N\DIk܂ AN֑Oxa`&d Nyy(7O^z 4U%GMમ0XP~*܏L4;S4Tq :ʤ̻|+-}EqDb4x~K7[pbyǸl\߾ؾEsQV[э`fx^WPhUWZEZ}h?;f_>/T!Sd!RPƍu |:foֻFҖ'|oxBf,g{F -wSpcFF -_F.}YYsRgGUwk%U}oB*Cd &DC?`ZNi!|LWns Lm҈|pY͢IG9l%5!eQ"m٫!x2?S poV{J`WGӃyu˙NrEc6JP2]RatY;n[ I$MbRi ]BN2n8OЩ6YvVΡa:nz cpZ=ywӵ" aFɲ:)Ak:=<)))V.F+ACRxոzj ۍ}|zѲf/?VCL}íͬz?x& '8{8{7rM R8 T-.'56ko: L<zS\"ϝkFO>.%(峆><0ז%IRo8YZ'PN| vNK2]u [n7t^s67,hu}쇐[wlg?ئoHyfaZ[?R.h뻛F]<乯0}2X=S$\s;£xmt]L,EyOsx&T9G"#&0QQyíޘ&h/}ƩQ&گ{>W&'U۽Sζ`,'t.p~BBD :#P&a+V 퀬lX@-JZ}GRNDQPO#Ds-ۙ3A=ݽԣh 1,a.O !hPӅnjDއ1%ip⃝3-[JO4Ѓ:Wjc-" 3hL惱wB%y2M`(x2bx RE .t*T Jxߍq(>UYmX )d^Dk]97\(JBA>vB"ciͼ6댛JG-M[DCb[g}:c:^)2Y9sU"\|a,t(k}bc^^6X6qbd\VeP +dX!^wZ1fCncB`-L[ BK'#Pj5lmq?@C tƎH:EHl,龿q9,c8u٧ב>4)'Ky7+_ɷke_>Cӊi{?s4850$xk^Oq {89 aOuz/(t l |(S}V QGwcG]e)IN ŰJjpܮ-°Vb%QP7 q3c_v|zԧ dȬL< uV:޺ؿNky}˗Vrچ`K)w3c{, mw[Vn2&*^7T,jCb]?%- G4"֋ 2S.^cz;RtY UZRȗ#GΠ"UNCZnvSkXB ֮pR<YÎq&R :&ڵhŦގEҰZF+$"2O* 9=V)|u_qe1aC qgR6q}"q@Sԧ\=v\Fu`fۈ%`Z՗oOp#X\o)SܜJ<7U,v*ĜHey!T,B RXZ)#!4JfF\8:qz~y3P[}F mQS{0ivQVc{4m;g7z9y|HcTql,PA;+?֊~HNu瘢\ݸZ[n@OA@~FA]Ў`=M'J_r[,b{Ca^\G٘ ήC_WĻJkwhGͻN<іSn CEXHnR#Qgb]h3Z}"dr6EҲ:x ]gjA%@yqJ8mN$'$6p º *dĭ[DUWEK/t\ c"I0۴Q_ڎiY}J y'$ݪ x o.G:dZH.g/U;<&+|=w]󻃷3Ml, -PKUQ-q$|fQz9M&jZosfN/yxDҚ9n}Dkbv>>5&G720ՉQ,JFX~(Tb)[ eG0ǡƙb)HDЗ>xAMEQ0(%iR"" EDD:$]D@jTDTJB=B衇Bʹs}wkc9{=ksIX/u̒пJ_Fh3ٱH'|Nkobr[ )Ny^N&#b? 9,?h̭R.I[zkKI!ծMgЅ9 zOlƘY03c6&_!:l Oq٘tʫk^a/29Z˩_-9,' \=~B0#Vx^6VL k{[B"2aM%6u\Od7^"v|0ژD ͌'F(HT+JS%J59XϤ@<.W!|֝Gz֘5Lԗ-{L%pIf= #Og5} XSfZ A*ҷodёkQq^S8\a]X+>!Vr1P?&'>=.0>0nSZ {e>fQbumTfƅOv #MBA34Djk$]0bq%!18,:sxz~ߞ>GU wdOzpn$ 9eg頛t vmKA9m{i|UWׄJ`CF}W ;*v0$hf[U7L\ fA}ԏj ~fj?8%CG[xqǎ anfAp{Akm֡~E-anIL#r%ocQ?e響 Fc9Ve :14n"֢e]s9ŠVOP 5($h?Z?|BJn${-<>'v q? kWP[G8P9lₚ:ȈK9ٛ2U gm]zxJq^a95:8m S!"V3 ^b'H=M=:3_^z w;rèf0Yn(؟x5_ۜHnVpW{yKDIrS!C;wb|3`-̦\gķ t(_?f3XWy݄r' x$Z_힏]znGW<0yg&eq4®<8l ![s`X`tb<; U쵰m1sE1d: M#./2aȎԦMPS{0r> 6{#f90ʛ5^qn[]+v!g: ^~uu۪({|X~eQyɸYS~x`u oek\5`(ܑ4\LY ()xgVYX W}9Ǟ4 jV\B^ToMפP]iY7E'RR)i:T\n}fNUmBZh-DV`wb}$~# zP7{tC O7 JɌyJ!hQ;|'O#P+V.ϧ?Tz(6X/Y3wnQ΀),up>W 7! J?{ v4>vX*ZV׾Nfnfȅ) : >y2<.N\ۃ7qY=I >OE1вl>yYk`Pt}9rj1nlJU]f G4y=> 9TFi`4Qh=;7{{Z~ Ƞ RL619ֻ7/&{؞V\< w|MI*zk."և9ۖ/`v`Awq4'|v'"4yOG2;֖zSJS-ApDƹ)nX)Y qŝt-1-Y7,LωRF>oK:h]`xK)(t?v#NC#{!v񼛶GAIaaZ7m -@o2Хc#8 hE;+g : !y,!ʐDث]{P^FQ~.)l>/<ؑsXF}}5]~d6zgtW햓 9M x+1Y਴C!] :;VgC5l"ªoFI1; )kG=(n8uܖܤ3yb$~)a=O-:ZU%5C.t54J0;O a^3V?qJT;wDX]irO_qTbK=uv2&vω"A)`XLS7!a݌f#[Vm7-YVx&bl>dݕ[ Zx.| }z3q yq){yUN3Z/[Ӹ3j*t^=[Y$5WEtFt(:Y:MȪGWָ+f: wmDYk IHRF<X':nj!wWVy1kV]OYjv٭F.rʐu\ec穏H^ 䣃2Q eOp{L0D}vFlՇ3=3m..S=ۃOZx3( @ޡ| LʽTwYґ_xa}rn5>>ɩa3c K띨480H0C)uם&~)?iCZl,Hؠ <!>}^B{(02۟5*~mv8̒*gߟ[U'us9{~)yV]jg 206E-Iꀍ{!lFCMe Ml\ m ~&=}2riL6 #px/|+AZ@~! ՠH凗 FL۲IlŤ-- 2Z}4ǒMC4ʁ1 0˟c _M]!o.AITVa.3Z#@Z(iގfwR؜JXƴ@"j=X"nV9hهa[w.?ևP>Sc/M$.C<\9Sd7d*8ӥf=Vp%Cֳ|^9'ZfmUʂ"V^Į8d[2({y nJXtp>ſFK:f ڲߒ 1צ:.a^ ^_mSS[LRhdN?aqò E[7 Ζ/o'ubY͉,~2ߥe Ku 46^ΏVvg6wjolKg{ e0i`^nl$I1ؖR-`,09a{Jp8vb?ntcwpd۟o|Edlmt``9f ykh*lV6/<&.y?f3v"9v [8ZNgg?댹ӫ\Ht۾]=73x [PU|H O%2食lO9uxó?4\J"z+ %ZPu72u{ʫkQXHoI+oXͥwspk1 >*=.;}3<\EWߚ|P0Y;QĊ NgllZf' wbgHg%:zqRC̹)/R"E{!KG!y akZ,^tT[Q-wQ-yJK[.#Én[VTǝmp)yNsD_{m 셐p"jXӾn/2H’W ۿOɨ4s4q:Q1g[Ty?"6ϙƓd/OX @ʎ,&r7+NdB` <ג#Td= ~LI5ަQCc.ѣBn~0y?B%FP#[_gfc{Kz8`+Tw {{Nܝyӛiٜ|4 /v3䡘:Z4d+ ;9zT5T) *rx%eJʆ6He||b6UYOI'qse<E8#}H ~^ν`I#nuצN ; to0kJ|,/ot=̄s +ѳ]@ wf} ,5PEBDhL~Y'ب!9QR{坅fa ‹Ik Rk vpr9^} 9kK?<%bjKºJ'fE<[ICZSo w ӯ+ϳا[Q6NVﳪăX'͂vNH>Gbԙ: LLrIۻGxmt1e3 ]uS._ VT(qy!"UM|]ZvB뫶a{ԨbթerjYwc_KE+GW8[㗳c: ֏'Hś`_A;[T†]a҂4+G-'Ks!DS31zн:MU;s[RjϚVr;0\\_u&~\Eɠqk AˌhY "mGDqkѭՇ7GJkW#Fʳĸ̃nv> 5A+a̺Sַug|)4& dh] Sy{|l䵷AE'RS" l)hb̞E#xR,j,j'NI(CI\ܬ+1"r.u0Aљ~WA陠-௲>~]cjqI0qV3W4Xו|ī5>)\-%Je21Zxǟ+^v-'Q g:yXR76wKPHK#V&G{ߖ./0]q=!nQ`tB0:[ϔ3T,i63UȖ!U-.D+0 uV,+[җC6ή*RM^۸M^35rއYqZѦF:g˂ka~n RiYj̓RɄֱ혝RQ7J`IR*Ňw.G;Ţޙ C^X):stS~TQڂ!|ݍ,.⮝{Uuص@0C>;΋ ntd'] QozEtp SFB*INH )҉ JFWLpbMMn `&R *'%Cl>n O#F!e5mvR͇u!Lie$RQ_P$G/cd߶/`e:Gn]>,~Kc9hxH{<ҫ,6j -}k]$nR5(ZA#g@%M|I165z眝ӺU*qxb'|ҹʲԴȲ~|UW-(} ݽCP{/ V/sd, 5$ ,aviڔГ]m,Q ]}Ti2{(>ۣmxhkMٓg=A.߲pCF7%2ѧ:͹[g+<o@'Bjm=ʌ<9&-/~ljM{X\›H:j{J+m͕ٻJmE?yo"C-*Z4+S/ZK5;Ux]s`2DB|8(8Cpm7W v?׎\5EނJ+V=Φ*έbLs.aWݞ8g籨b〸ױCv[> 6>`zG~5]\D{}#G2'l#iWI4/e֫L3ߑ~*>{*I${nVZ+iiv_O-΃rR\{W `I01SZ!.蕻Ǒ FJ^yksr7fBK6҉`^|nnJ:hLTdN76m(ӱ+H:5o_Օy]cƂ,tr EB< r.X?p@>(#q΂7`v~Nt(*tP1PuLR /(X ZbG`۠)J[?h{都nQ(4% "* "%!(U"5 "B%t^HϾ~wǸy=kUsͲƚ{$0 k>=2O"4(`~'ig,R0;(.r tx[ݰ=ÂG>WA^vR*}\0n緎 q xn)O@*I?~ӹ? e؏6J׳7jk|Wq)+OVm_迊#enGzY.,G蟲^^D4qǟ@H*bf|Fd=p`CtM7b'\@z_k㓵_lvOHgv^NzhgErx̶$h%縘 w _sOFcF[O٧+b{VyR<N.⡞zevcO ׆Ǵ_rz﷣㎭3Be^Sο~v왞j%=~ EYD`X#=N3j*MTq U84OOVC'vD:[6x=Q>c`U#;Ie/Xa~Ǵ2F2~̍b#l_Ă3[=hK#YH R(p=-Kɚkg9w»k9٧Eue0bW[+rROek\|(s~q/ Ni q#3#^mx5} M^T<._ fușhЊnQ%EҰѓ9n.ٜPI`p~б،Q7V|CYq N?g:_$ع9F^o ',.ʢ_̨Z٣ݑ+4'S1m1Oͅ8cHJ,ZqR57[J- Ѵf?|f89ABjm `wbDxMItPǼOi{^hCƮơ-&"mB?k219 ӂ "ܛ˶DH/sz >.:,O5Vj=gr_Y`MP쇎 )"5 Y,FF@;blӉ>x/s6ה#c ǎߕ"b3_ s](-2؏d4"ts>bi~u%";E͍.ф-xߜ|8"O`]u.WɧAUv'bR"'E M/=zN%؛ QbqyEOOY8x3Y8vЊ&a:=t~S}h{%L1|j,!v[>T(NR04s _do4'252\/T`7>@*`9_rmw縬9X8 FSz*DAN1֛~ze,͇Xu"po%nJ?i2Mm3Jdjda+-J»akn<њIEAiD^j]"&՛yg`hXA非S['X`@WN`r/ƒ5-M"L;m>Q{[!fթx>d8]+ y0r q2wzW @!oO⼣4(툈 CM<0.AVV{ ϸŃ͢_N)kWwY3u3Fyu$_(Z"eϿM/Ww1"]nRX?NrA'﬘xj{+,]/tqw-zVacޓder%7AS;.6y:y.TQyOùZ.2輸'µÆXlBf.M>uvKU;̏ۍG">.=< a6,KP.S:}aX 5+A]xAFoFs O^d毿#͍*{!ͮعKn/fEVv˴[m(1E6ȍv/Xr A8hM C:I߉\b,J{k0xfft:TZ_2JrOZ͚m\ gO.|f .z=޳浪0lm=GRONQ{Xh ;ϢUē#iHw|Ŧ(`p/Sl훦v or͡M:)}~ֿ[Ez;7F6t3@q\\_O<>nD@qE4ʹ.jPD煙Py 3\+gQX c~zo];uHsԜï~yΫFtN YwG #fk:e~OƑa x`7oA̻TwibHpڹP(jS HtYęSRs%xfȒmSM)ۂG0Eh9qjʴ[XkWZa p5S B1'~ekLOf +zNpb8 CcF hnfNvU W|j,Mn٭Ly6H\@Y>,8G,>DB_$EĪdsvݼdPb$믉R_vȰV+cD2$6qo69"v_kn; =,tAy6bLM{6>ޓ@xMN 0bqYUܬZKB#1px{fhxI H;dj M!SOTx䰒q/W,߆n,eZX"$:aT[^lPkD^%e:FXKVϳ;]f}D7v/5K^&^=IjlfD0gdӢT}w2暾Ty98zkrX 7~hS3s&11}gn#Z^ > gEWm%_FLD.^V1t,d<[b;c'p[mdՔeDOSsFx3tO 1/ X&sOM܊8͒ <ΐv/;7k%0=YG5;/`\ Z$p2?d*^{kɝl=6/y 2i|M+/ a&uhXv<}{!HSH}fPYϼ龎uA6"|Φ+;tu(S\"?o?㏐*k .7{YKjt{JE ˁĊ!C4٦7RLɱY1a64DX?އ1PMM!>'?ܖ+MI1FJɇ.J+)oic%5x8C8`ؾС)Z(T1eeEukD)/pU2q͗&[k&K[F0 ~S ۻ(VoXs6:tMyY- b5' ~XA&1ϥi=S<)+i`EܑN2uH=WNô;,7%x~ƕ+hD`yl(l:׸~7&~id3!Zoҽ G]<1s8jARFC<\Sؘ_[Ub/r8o5?Ur;1tKwMVޫxO8&:l}KhЎ#&k@0w2!7KQ_u1e~9 Z *(`7FnFmVרɮ֜)z̀/94bC0_vuK̮$n"n@-'j(r]9A>A~J/6 }"PxB{P'e#1Zxk~|29).af+X#z} y$K〮(& ~_jl٨}ChI)L`P_W- Ⱦb{Tt =R,V9hPNGUkWlwf#bvURDRN^mf&v)u-qε$͞[(*@ҥgz}Vm[A5=+wi|:ދ!>Ksu"8hԥ8;V9oQhZ&k}{ֆsu1Zu3k1Rl XnO^gϧ بz)(- >Ve3yH!{`:Acgx'};'Zz m{Ob{*W+$Ok%!2k(kDw:;ax z) E,+ $ݳ]Eb=K/k3VnNd%"}*9=6#/Ow+ puE6ֵV>F0uIz4o gm5O=Jmo/StNC촡]h[a%v=a* nuT_zA,TyZX@wY;nJO`^АS}{Vjh xZŞXӲA4H.oy }hfT*c,:qb&DjQ.-OEoOV0 ]*"MQiTD|\VQQ=f* rݧl-hNbBS7X!ڕvÇ{:W{l+p;̽!ղ)=.W!#gFq/t薞}/3M7\ _. +]s8tҽNFf 'C|Sq!U#hJg+K+4#do R>|9b(h^}U!ށ5bn${ZHj ~Y3u|ʓ9*P&F*` -im[Bc _Cۦqf?xZP s$ xofoQnq#nu7U  )]!Av^# l$`%lIv0 EPTh5q]Q麱UOK@mg$^&E4xӕLi:ozg= 'b[9b:o/7D밡r}*/~&,(Qm0P)ytl 8'/MtB*39uC)Cr/GǶ:]O SgFE2VO`Jace)bsA/':|u04'T8H#HPBW7̪ك#^!<,]7nb>1"mSg$d3o >z}́;2L`L[kJbWJN>i! 2\59OQGl?ח^g367NRobDۖKY8ВɬĒ?^qa0)K ѦF_t&*J9{zG A]3Yv4.8# l&0F801.zgE  E `YDŽ "rpgUbLP WƯyٶqD"\^Rxt SYwwiI\;bӔ_r8'n ' E&uSc OHG7v|d|TPkF/Mb)Ibſ2Z.FAѷ稇4>9&1x#|&ΆWiwmQRjoǩ9r0S.k rg?0惁ԅ p$+QQ~gjn< <|7ujc&.CRBٞ?Zp 4¤V7`Pr3 vDh2KIfz<6*5H 1rA۽uK S[qn-1e׽ϑ'Aha^n ~v_%m3jz(e%uEˑjm}D)TЋ7>h`uNdOkESh X@h_YqȺWɡP=@Ebml9QPk>1UjAVaWpл 7S, ġn@+u|뇞A@fe,w!sB活jJbHұBmnuFu kI|n&x+~m`TPb,Dhi=7bĂNuWئ+Ҋ6cnˋ-=f0nPq Gܕo]׊}M6NU8qu`AF*_fbUglw{L [.jXG}-tփ"m7iqZktGjBq7G5'MywlTlKJ<]/d߮"k7Ǫ={:v2SU}'0ꮩAMOjb=ː.ʪ~(Jwav؆+#UJT F 73=ceq11-.E+p\p`9RA=& ҟE„1ɲ AU'QUu!SR՘i557@ec /_G#kUHdf6S21{h/-6ECcZqUu9 u߭r;Og;2O*ؼ;fDz|jU=nQrzE0.킺+Ҽɹ=N;ҁC_lꟍdx֟Ƀjt1CmfLgl[wO̟rKJGxftom8.c?5h*R9XުͽcSy'\FrQ3iDk&Ng @jgw0Sg+ҶRz㡹DWT~L#{8wSH:S4;SѪatTj{ EnLC}ژ̮L'y ~mGH4øMaK F:_N[Fm$%Q% iثz Ɛ$ AElRZNY+Ӟ1;Ve.iⴥk-|ZZg#Nc (s9 .[ iVPvXgEC;P%42VE.ѐaDbi75l( (:槲ǿpJ-y+PsƮsO1.$@s&9X:M iٱrye=wP0 r8"*)ѿ8ƌu;4x&LnAm>!gq4 '?8Li;041F&6q]-@XV_VU/Χ[j+ Ą U)v93yD5PSV=PRX9-߻/Nۂʞ1ŗG>X'k[z 4eGyPWUko9Zרvv-هNS.D*"i')E്^Yȏb@Oi2njp?#kS8e8Af`kuT gr UՀb+KIəJ?69(S>XmNU6e"s%~Yᦩ+Q!SԼc3L,ꆡRyf㿃=!9-,=ԱRrJO w>ᕱ*-0o|VldX〡$7-0v2/g׌*dٲJ ;xiCJ8 tCYQ͖e`o]!JC cn(s^K5>g eiXp?bK8{#7e)e̩LhL"J=gMf+Me q/; M;21(*p4,)-<]w*Ͼ&4+ݳڒ)ĪzkV!!C,};1O_VŜas7CbPT檳As"0cz2ƕObô|"0աꀧ$H[1vSOM%U B$=[q(=jOREߣh49מJѼ#H{A>n#OI `w"" C`h`IAa3c(cJTGZ|`]\mhݳ- aHSYAG&EJt*9zO|)y&xI1\d>nPZl4VxoLQ E ?O'XT1޲|699Ut6<fQ\_=lԹ#yz/ `p\KEG᯾,cČ rs> 뒍|V+$oyKd$6|p"տgDEZU_&P)M4x:g;^rTreVeD42QCԼ|2Z~e9NjtUwɕ VE+2R-MZk؆Dai$Yee\'3].ךpXfv:O?MR5O޸^Y lokK ioYeZ_WA"Z)Y|Lǃ/cbM-?o_:,d,r1dlmikSv VL5`{F!=K <ËvxDf"3FƁA&5Ke\@+o =EE={lQc!Fܙ|N)zmY |.@7)~ͤ-n>6QB?in{6) ?}TXu*;Ff1_} upj 1p^c B?@DԷw-PcMlc:W6?_hؙ'gsP@CT `>0 Z> TWFw] n"HxHm5CŁK5+H$lz=Ns6HzV 7Ʊ<aOٌu@1N <:d)ڶes}ÁB}1g\Sy׀2M~3hxy1Oוχ61vqEUKK"N CbJk@"vL]@ .hPXx3VQGr:EEHz}ŽG X׍lj*\xt2bCt|$$"+8 unW]Jx|d!0i#qBDZ61e)vG9ڤvSj.:.`|#t;k#wܶ{3-iТ;)Iqñrh*k|IK`P`̕Ր3wtg|HxcaEw]A䧦(BwFWs1(@<̈́6H~(r_w;}vݼwRHlT=9~XO``H$ssi6B(EviblsS^J 2E5m`fJJK&ԧ 8цT icHh6x2PEπReFS`'3Og@|vuu=3( KizI`wE-"H% *(A H*$3 H" qDDP2HC$ H<ęa]oknVv9 }z!p6p,ajWŤos9gA{pwX#Z럕\)9Bkf O~s$IvOvnMpdET PqXPp̍6F=s }Wm9i UJzMSNL3n*b.'-'%Kc қfpSCC[[/<Δ7+gv wbHNnOAh0A TjAyA(車̔L݌|d t>wI> AnڻRG _$죟(8~P/UFVBy8Ʌeq"g»c0)Qj!y\kI%I!vf{uelOD6}#*8vYuT^vq~zN6u7~Wf#UyM063͌rR.չgބ M-cLFCukSFtăC⎾ȳ7Cc ъu8X!Gr%pm~5*6;!o15Z{ajdRFIܷ y]f`6Av-D͂i.x'phVI@Jq\I(?*EQWW]8+k|:+LE*mM_12EfĶl1 hr0[+s%7472Rgyw++79sYݗ) 1kõg Y"v+-\MEU|to1 4`=Uh /H US=N< _wԺY4 .kW:M-$9HӾ4 [ n#:g\|⣉! C4Ue#(++& Lj$!0G*}( >]7x:\f 9EDu1'+P|/}徴RuU.!'1:U S639z;gP 7 |+6]w@iaa{[O;PP~pgL8a*+37/C'a{r}]2Ff;Rˊu|獒 yp:JKaײhHʖާ,q,Le!6nvԇz SkrPʱ^Q1$?/k1?U-L% RhfeD2CDBHᙣ|wꊆFx/xo jhNłrR(> aq3, } \Q iaG}]g:oM?E:| ySx,͌5"j]OE8F1Ix/'x^t.&3N4C{aȰ4.\G}ugOIJz3Aw}b<"29ds: CHȐCŖ0zX^ia!)Pl/88h9T xd`Sbvz{ך0vufgjBVJrrCĂ!ܙוc sKowWg)2L! >Rٖ2z o鎨rxhh Iws-NsVt)!c5<֣ѢmʷCHIzJS2Xz{'PÌ&зQ*"owYkx![KZ 0@m$?Ehyvek\`n}&n)s@T$:'?4J8#DqqM'9Ur,kZ5ۣQ)Qb_ZhV0ߌR0Cor#"Qh{~#+ArvV ;riɳh׬BliUTo1[xAZM︮| 4U;۵poם"O`. ~QYbJ.2Mx~M¬<̔+,.ƩqiʜQM7{xuU-.1_{zl܊iK<^#wji1v@*0#{fmPږj:W~v!n 'WOv"s8]B1IgP1ʱ*M6}+JgFqK~+E+'nJ/W4fۓ?'|3]ŋKJt9)[er}H }V=h+;cOY/k1gW+ǕcakGc0^cBaWڛԯecm oim+?~>ts_Y/QݎBpξW6qn=E`Ob1'R}J;aZ7"pS8l-3oh-R4]G3.mƃ9QZ7u[CG >3SK8ĎiೊE^i~s*ۡ҇ .)OEMfV=uzek3`W`EfkBpu<>]㎐l6Ǵ2ONtcTs&qa-/,,j ~53DC SP)#edM\xG4~ <{EPZQP>Mmb<3bԷ=Y0'r3}eJ\t-ebz:a;44+Ztyrw04g EC1qs&[+M2cxT͹M;޹)Q~T={ ٥׹+)sXδ[-PY.lXm<؅g{\WΝI*;ƴM 'ya?hZЯ.ah$7Bϴ7A#c70=8$TۧtIM|*rUގ*3o>JcvR} m7~lFn̯՘ˇ7 h6vWC41->H3A+0SĈ-gb|w䬀J%xq6/ h+us&-s!X4h1'2&e9B,4SlU*zZc]( nC!j^F "F T28EFm~V++䨋}&j6$O]a* c{9;a: Va?ŋdY1@ I8y2]q|3U8$]ȈZ{wO!L$˙"k͎g6N@fV(gۻw 7љ'1T؃C0G+#j+, q礮?/rt[Kռf˦)e]8/w $co\_VF|w"^Vi(vљivfp]-q=IUI`QS{SQ ?tv\`׳o:h>7ʥ̝HYid3eAhq}tf48k.`P o̊j pS ~ci -ʻ" 3 FH%$c.mXes}@0ױktc] {zM0eE#(l .*Y0e?WAQĵl\Tƭ_XB'hQ&Jēp<Cq2ֵA;~rs|}[%E:%gBK^MƲ_5EWN~^zu8o 7 Z o/4<*""qm8Ɩ30'&V؅uFwyF2Y`gmt s;t +_HWN+ݦo*0c݇V0`8 -2*5̑ '/xu5?ʈݻſ7Eچ_/}ޓ [f 'n^22ݧ-wh3sJ-/ش$=u7/-T9$diwDRǂBAvb}F"pf~ֹX=Bf’-\Nqf1Jsu-*|'B`xEpDz=뉻_u}*;JVWnr~ e}07}>X0!vCd󲹇Ǖ%EZc7GJ]b)oH)Z՚]|TDPm G\${P|K|dzԑXl>#ccwaECfQCrx-H_}Dq#p䥠+'Гѱ-ͪ`JIۉ.b^,l1̶4;>\:>Ryv9Y;PL_ufң3+nߴO_?*]I'f45Zn|= #Wl(ZtlN9HO9x7k̳=ajSPp7'XSw"V2RT1 .(pڞnp|PvlΚڧޘU=oPWʜq4R|}*Ăq}QhwMQ bvг?M}iڊU!lj=z:-P +r@hr<\ݒ1jC/;w(uY{:Au qE] ["`f_}8C\B Gt{G?h#ߴ ! 24 iOS/| k3B[6h#RXMtrs~?28 ~o E \gRF6zxt)+\ZN}A$30?}̩}DĞG%bkX@bV6*8# N#uc=)%1E 7ڈE*dA , @'gk3B?j)uY|CPggjeqU,%DbnĦel|i9"shMs.`OՇ駝AʎϾ"z$lxW1Ϋ;l @$Hr8)/<;0M=_տ"&K#7W@q o'}c=tkFyw$-Sg޸˫ՅsW}Vf@J婯u4AucBvC\JJ⼡ V-U?DzٔqLQ?fŖ.{S[xr^\ӽ=JtJr"y<Ta{ՃSxYλogm9:G E{Zu=bN~81T=79Z'M0` !M^w(T^gn%}CFw+7]+H>4z;i2cUhGMᏉ|*>Е&(F-IK= a0t:mppZ[p VۙV ETQ2:ReѲ5A@UCdK l5DK<"sڨC-RKd-4u!G_:1)9&T\>(LE1\98vp+6k-dns\vWt2H0ʺLF$3o.X0}O.Tz;bg*dC5Ncqyzd0M{[7jEn΂N[_YfSrBDDN| GIN=S@}ېK`AlVm#pAH6gHSԟj@e19zosvDԐB_}~݃4CյFag7oңr5zk #.g>v3!0ǓAV-gNA<'*T,s4-`9J&aQxU)A-s_ں۾:d˱L)VHR 饷u5zEq nwP{k[M蝭1K}SD4$/¹u#KugHVzBWХ¾ƅ&`l۫}:gU7N0Wc v.D#W_FW""MA<gs| VtttL& ڸz7'C\w;x@Uuw[R:y5J!7 ^i!(w83a9d U!dw#o.[YNWڇO.~AL*g4 5&&׍ZJ.BXك7<ۢoUް]̞f9o i)9O!ffg siknRR/Br74c8BBSE-'鎼rDcL˃hlHoM= B"퀫t7ګ ,7"-޿6 `=ft5jHq?30:@K(c痦cR4 u+1LSߨ1?a :A+5&< -͝ L*ծJ).{2_)5ӎ&Ʌj7Cĕ}˹YWE㾛/D\ha$P %/&a ?C6,e7{[3ƪ6Lr(A*Da5u_Uy8F=Ɩ9)_P)!9Iju+_sa\chB-DNWaTͱ/s!/܃v :&׌T੮G1=!Wvع.;މLfr^*游DrYZpr+*SVǽ+Fs\t=?Jj^<۪i~ 3NS;'CwѾzRV1\K2/>}8䌭 r1V0w֕+f5@޸s >⽬z2k~W}l^xg=ʩpw]",^O#t{|Y ,:|!<{=^m6,}Vcs HpE0 5s:^҂5~ kv)vV-3Rm=?1,b:v ʤPGVEe/G? {xU-T2ueHIANjkl<}KwpzFjw?YLa{/%IթUk/o]^S1 ct|^ ?tZxkFͬo@TDd&IiRլ@c*ًMP|=:蹧[)OzQt*8~x]vmݴU5|Mmx9_ĵSC2 kRO gi%~ҧYR4G3U]IoR;nzJ^b%r! zyo̙vr(5?G} Wq NZM<x`vϒTN( %͢ K3/8/g1!>Ӻp\fW+DAzc,pׂ!Ipoi/Pcd¢^] &sp2J+Hl\Õ(_eD`jӸeEE]osߨ;:.L,8%8< =?fj.bW޵]KFD$9HJQhH?NJ3;`657Mߒ](LFX[܌;o%G}?c3^*!r"B60߸&k}j.#L-,%%_el9~h:08\婔%73ӡb @nE:%['j.yl/ (9Ae}?T{o]_?(v=T'\D&Jn8m Ǘ*>#pt۲>(@ BLG*y*`FZM'i^qcdäWyy8vҹcM^xGYAV.m$3>H5 Z{ eW~,PLNݕE4@mU;MHkNl1:J ߰KhJAQ9 }5+,9eAgq"C*Gw j8X!nu^ZJ=T3; /]<񓆠8Lq(9$V1(a]5h_uR6e%9o8";c:JAZŲ.qZ"Zc=>GwE] >*C{= oH(|jg\\#) 㼍ՐS\/Mj!OnRZ?%z'^Lcq$vR` tqUvf!Lc>}#,=zCZ]^{Y-?w4Q-a-1}?A fb6HWb_?9_)(\tGi'ms??vB S?$;Mg1xś<,Fw\fRY+26?vR$}xoٚI[%H.9^dve@I ^@[ U~'<\. ד L4978^!Dg\gv )B\Rmh]?lͣ4hgf?N}(<-څ4wpl YELT(h*OP)N{EiNZ&k a+lkś݇穭q9: ierݎ|6)+v5f#AL&4Pk *tJv]/#{E- M!T"幼3TB]ye"O>F؉Smώok%{mT>TDb^ŧ7̸[ǤRfis&we5nќfDp*~//.*dq(ɑM_b-x 똝3],dUG4>&QƖU_'_ɢY0L(Py]2q]3fM$EYm($#x3Xp[$$ 1G ӅrK3x7H;dRo2jC+PVM6>+ae9`<ŐHڔH=H' Y*cݾA^SeGlNk'P1{ vV0&w! }؁eukkuCLH0m(oḞnҚS *#8l3K_pE9Nś=VlI>77UHxjD܅0/⊛K3A-ҋlwxzrGBcf }Hm(%> mcԷ\"%(Q cbm<܃dpKh/V_mbg_aXJ-ˎklM="T_`ͼ~ LЮŸ?~،@AÛZld~?r}qMZ^yv=` Q̋W6R3gMǪ| R;hKtrW6ou0L߻r3ФUڢu5dY݀=t͇ $*3礒e.m<عM5 SrvL oP'r|7cUT\aOlvN81Yxő5Ξ&T1W̲(YM;D_& QyM"7J!E@ƈ Rgu5'M_VwBr4Dk,FR E_M=Ux6"?hb?'t>?B*/˳ތtV;J֕vqD##Bh?Ne+ ìgѼ{ mu,mG/ۡn(UTS \H L'jjEY" TG$vUwL񭦙,Y`e1XD;d4x]/|e`s- &2XM6sf ԣܢ x6GYLX<4.t=iR" rWRAAb%9~Gi&y8=eQ'&u/gG3:sKƠNѤQ$ -[6_^G/(ik1Imw)珺+q2-(g_E|h1yT#1szawXnX%R;5,GTAUǻd(;g~VٽWy[t  «=UOzh.",\r`_g>cȔMa_-'@Ϥ5\Yq<"v@!%\ .z䝱 !9='E1JT~)CFW ViN<%w B~@n'.CB=i)Lo8?OI4:zr&ۚ. WiaXWـdSLͤ_Bu3O1uzpW0}O̗lL)u<gffd OANإ5ۗ[#_jͥh N15;IiKz5HK(40itnNZ&[_9`L5&8sL8 g/c`x%3^}u/Ŧ 6 \Zjk=AF˼Xwl5:Yc*R6 +$Qps.J= z|-1HB>AZmE>oKK&@hP%U+_`>3QZʋUXʙwhq&*ud:W#f}hL)QF6g mRt9ވYz]Mxַ0 e=j3cV)V@ ABLaOzbfTLylMvR"]x ps.?g/q/ ܮ8Ap(j,VY8 4ybjQ?{zN[{05Bjͦ'`cWޝ3]iys=iHt{9ek}MAڑuҒcb `)$svznPPu{+.k\~.M[ChHä7@@C\C4Dvp],r95 {*tCSgx!IPJJl;i(s#?b3@mbfOj !kM0r=8!d]K9 |Gi6B:i[k3̯l.JͲq3ځY/W`zĠGgevաrymU#id)K;ގ1ZRn];BPNw PIW G855mnUqtcEW*B6sv S\;k|юTL?vG=Uǂ#k6 3@bfZHtYL9ӌ&}QtOU~h #Hם4E$4W(<WgȟH>V?~>L PF)jC:06M3lzsK{9bg'ymOd ۛ=5S]~(\Ʌ=$K,W旓xHyW@A?'S.+f[S/]zZEشS A-jH_)h85N b`SrW~"^WoWߘ$)^`W_ K=Q$?("Fm=j[ QBaeG;aܲG^iofX ޺:oSJ<_I^m &w㍖]m$8{|,'vzנ@/L&GJS Kw lLU#ΝaXСdt\;<i6n [*,u޼ ĢnO mXK[zǑ6!=68& )ߔJDG%Y.6*LLSǛN|:JV捥DpoυD7=x_TQtVtUߺî)%L``3oc& l&$;%~#-z\>9pj|ҝ cW'3+&jSR6])Zh"U6W*6_SѾ+wI- qhr I]N?/^o(tԑ?ZzmȚ X}5xz f0:@r7AIW53^*_IFq lWu.K`G:CDas He(c:As~dؐS -KKh-}vGa&YGJ3!XC9XPGGPh>9PP=BMFsM#[RWW~w_zs}Rci v}&10ġ|bTLڎ&TK' RY}#9iBӓ2k)AYSZe=xS-Q[m4yS@'b,lh 8p!L([ v{_5ɫ_!Uquvh`;X8lg@0& tYo""US9/zt3%ݳ#nb 1;<+ ?Iѿ >͡Nڜ/->`VQZl>NXC B}i رM]zw&,+7_MC`:`˴~C{Y~cҽԇ#@̜æ?.=z6vm-OKstWL9k-jzY  ͨgћӀ?ˏHڄ!XD4kh)f;Q*Gd@ϝT N6J49쨠Nd 0w:xa]Wtgxzy>iqW ڝ8w<];ʇf6}GӫJ+Ft`N&S->jQos?M\ZZ-u+.ZjsMς|:nsZI}FKԴu+ZY jokV^\u .R5wො_~d=( -()jA;kGofԼ^+;AË2.Bn)ocYF@広W]-|1a{нǹ8xhbIdGtאHgxHa?:H\4g)|{lA|;,! L?=XOEV}-MT[E$(bc]ժlrlm׍namqxehIIUM߉c7NQ=tRꎅ 'JycFSc>%Fap8q\lmLd6 iA!ccݖ  nЦi 7Z:a/+Vuo*IVZvLyH=0(=koH }L=ϾP^wk\.p}.8jjPet3uZF^❾ =dY BU#K#Pgy ~B05|B FP;g|Im ?TWV睉{ˏmJF\&AQH(cu>Hh)ҕg|tѳKZ; X 5x>{`z3Qg-}O=TNNSvUNo̷IT;wQ $-癤w?iLא*9\oi[Z#/wO\{r8yt0^@B^z(z|6xc =}ɃB!×^roQcnO|Hl,5ajg=|v!Ϋ|ѩn3x^0"BRuXF"w홇^.h {#aJhS5p%ypzyqyqɓ+5FDɏ,;圕WY9$PIL*Br$fO/' + AU쓸BF0*FIUѩen!I6ϖI/3B ]P0Bb Y+(A>;)QvO\[QSŁǠNnw"ƐbS`CqϥaC?IY ͥ੩$(LG;c(}AZ.;rlkє&qq͎v_)a9-گ.a{|K⯭ $V `AN伔 GXhT?Y>Qr9c1'xo}>S޷4/AQ]=OI{%DŤ_0ӼS4>ȰHqɫk0TrIc+aș8DtǞS0'ʦH4{E'Q ᫫ U7޸HmkY?xhx&v,5QBD/E!-dD =1;>t{|BibJAM7ȄY8xGF3ID#5@zRmY[*2d;7q '+Š/c4Xt_Khn f|hͰ6^?/ce><䯊RUYʘ'G>p% $G (2f:Ĭٳkivr$&GN{5`Hh2Im:R$J-Pne gfZ/wiʫRWnk EJG>d{L\D7`{=+D&BXEwHaaX+KzRH=F@# "RTmbSa?*9E-UܳpǠm7u]PeG\/"h}[/p8huzܝ %n+}u}sZ2*n( ס8 nš{q-N)fDbD8_4a%ĉ@gURK yxSN$'_`^n,}Xzyͧ&覎X<gώ"D&Xu}Xϊ)\;xY{񡙃bJcJ=i NĽ90pz vd*oG96B|fL/^hV̑u9wAeA7-\{"1}IMeESeꆽ·1+yApyee)z&3.'srff"V+<U/]P3:bbzV0 uNyytË_kؘiI}M>k񩸰jmAԷw %eDߙ!cں3N:ٝw,MBÝH o aF> *C ŲDϥT=^G8SӪuyW< !ݬOD}XÊ {Dtss/Kg+ȃw&|H>U99F}iDyD[fi#! %Fgl8YPתǐ f]j ;;7kӥߴej-ۼ!xK:e00k@):]Т*R(+{$|\rޜAN->f]J:’{l}c/4|xEK1 3֐N)7 ;@-=}f6g,Eik%pJpIsB|<_pE_I7?5Җz~w UP^sap%:& ax;hʅQ"\-:aqM.+#0>g,[ X0zVqah+wVV_[D mt<ؓ Y}J 圍nB:{5<,$[ъK@AQ1 ~{(c_˿Ԉ2`_rvL5ޡumEb#_uيs\PwJ.nCv&7;u~ ΀'DͣgBMjEQ.NGsHN˖qƪsιqçiCwkDov&S#O,^hMQȦ+K͎9&@N)]xoQ!A:9CS^Qm풧,VJLL=Mc]u$r@P^nyhGXV/y{0&ӫy\x$a&zqycMg%i`;" L֪&؟zH4\m-k{BzOFWy++L -axC+,u;eʻbLCNW]C3Pǩ C]8+&9qmwrezC1d0IPR^٠7[_}`ug#3cE0_Qx{8 9=J/$So&5]6ygr\6X68P.G1f 2nܵ[CU4lgB O):]f 1.{)Xlnx!2Hr40}wmWᴞh:n}3rp3b0Css&9TDh1* i)&}nD*ӆ}{Hpr qk|*Ο=(48cNZk##tZoC[]x<ԭ}l:;.*f!mt4,Ʊ`FUܔB B %Z;@AEHg ڵDEH&wSӃ#nCWzh.G]N%l%R ;!ᑒC&8aX?Qe㉤8C!<3ou͍‡zJоjUhxM;|"RDlտp$D#_qHB 砓j <~a=sK25떺9/J3,uH1nSqתLeZ{W7Vl `4] 0$1WscNկ$Q'f}/o7@d`bNpz@37Qy0.i{ ,l"U(m,úLAIx鰗Y<5c\ELl}mf,i.Wɚ_b8טjce?2׍ŧ?"4\p))l(T|+ ;gmrUapƇbC[tk=K{~H7{Fd]- 2 _R]+pߘ @p[DIdodtz4WsH_',U]3Pǡ"%>H!7{Y~v+˵vspl6_X^~t ADzO-P[`"{gŕ8#G6"Y4\{ɭe\1]},5m{WFN缞]oxy^;G$8.+#ͮo·jB˞AP,{9:"pN+Y¡ 0~ \-Lyh],A#?GA.~)'^6.:իǛ?N!l+yjPT/ p+gm1+R@tsS Pʳw#WQɬzou#xɼƄyIBKyߒcG輑y ^nG$Zі⫆xZ[pY9M'Ƅ@9Gwkҳ0~Sי6nQ8η3QGXFnM?5tG'RiZKym.VCn]D뎕 `k QS?5@Id,o)[$~4OK,[{^1~DV@ęqõeVj@=D܂c$ u W#d|6%Os}v_iZkF2Zg;b^<&~rk@9eO.nKsb9 6+=}jYL&T|g "&DXC5&幌|6e !&ԲtA.CZqnnL>]DԚOdg.K-]ck؍@!xj/)MNymJivݐYa[ >e0C`zx-|9?hAN|}9PyC2 LG0`\ :4!ty):Kn!,aʽ|PT9UaSv`O( 6\'rHA6^(gi3aTgbrݦwO+Tǻv]wpǵ+:w2xߠw_n+@J˅g~)տNZ+z-7m!kuR##i (*/"tŤ%C 8IQjԒbsIͶa%`ޞ,&Qu,L'# ` " )zqpTɝ5|AEHм_ldq7=W%k?jp̏벋HQOUe>10_rw:~ofgRQxɢIxZSA2ny~d c;#ˌ'#U%fgE=">5NM3ts1S'v O`p>D8SaGڿѩ"{= ϱMܝSACE9_ma&{"Ͷ`=h1B"uf,-ךt+<~tfڥQFٕ؊i <.ҚcX<{kwM<|B>#:^ g9S_sݳr]9L%pj{a[),T_4G˲SexKq&(O膵ԡ\ m[*&ksɆYVF2ͷV"3֓ҲJçZױbBbbwq]nM"@LEWbM˺ $`m*h:|4eC.dl.c^ƊMrwy($o'tHٲH7z ˰LBkzGWx[xWapF5>/2t#X#7/j5^I)IW{tdގׇScB1X: a,h}(7zWM-Η)r**%|& v2gjvj{0siHCO88L%(66L%]FJInapi R2 ;z&xGI90fcx*㚔qsstOgc[wmd" nzPC*v t}?,=$iOrCG ]$0pYM*/Ȯr;*G+> e:4*{S3(MWpNi>LVd(eѐ -%XGr1yvW 5iooMiԧ8>,5YՓlGҩ?"W\}¤| A,;(%I&=]8lze56oވ+VfGGgշE042"_l4>#'< W W m)8V:4hF|oBD(,*0Fe(hvP vD8W,Ux A)Ӡ6aLn6n9L'T^ \ $z<9[k6QΆ76aC`x+)U!@tпӥ1I+Z0_Xݜ3TXqU4 AشHdlˁdپ0)&4?SշP>`yHuO῕Xk ;{?'<"t ya귄rJRW2ehH x]FDCִU˱O]2) Ckl'ӫTxQL%N#*]&8$Q5tlr00>l 7a7y$EjHG_ yZrۣ'x@xXW]b!5C~bnv+BJlzX7:P:K/e^y`LSLUsB \#%̏ɕ)eEULvҋj~Ηk0~)!'gQ/ 'ۗ:UۿO䃿׳tvEV?ܗ^krx_n+Lw.kEæ߳o?4 qےrPhlG"?fz |q[,+Aށ|.Qw,M>5;:(ص~b,V#{~A3~Ha|gZMCͅJs X07>vC0E. wn_ʵiXx9kJl3^F+,|, Ka5DB_ z$2I/ݝ.As! PwBBbBWuXho_~k$a؜mznEip7>ٿ-e=$k[bLeC}H)Mn.E<$3&+Y /=>wܠgdPIҪm\F[;u=h96T{R[%t7-`փ rQC#y@],~Ѥ8enz՞yؐa)7=?KWK'Uu Ɖ Ο<>X;Y<}wݼ5IA1=3]>ys"2Tߏ liła(5&)/ښl{\.fBK)2uX I# S"e+s(L$n;N4pD*+U<όL3bw` hLM nwCduQa _(<{2!ӗ10FK$v$/>6g Ck|t5;[IO {`*U>/%X Vdc%D0!6Av8S Oe";LkSQ󜶚_Tb3v |0J ? ?@IKO.jg7p Gp%:' 8X !dfM6{5 KH՜Fcjmmj 0e]as\;[XcPG©aG|9к*Nz9׹%,4 DdfDtDB|BAfs_fY*<(A-b$OMK?y¸*_pdq pQ[wVOb #t5]n)S-_JInMqgT^ 8_fsu'CcAFj/S^1F0h3 w؎n-&-7/m^ZTZ9[_m\d'];?RY oxF1]Z;=\m(F=G0Fsew:2%)T˃17v^Ϸ3y| Nh"q$(CyA7Kmc:0]z+Wws+{ߑ㥩~cTv[\*>2mv1I*8{ULldaJ16t8B>Wߋ*28 #_JVp>]ݹbGsm8a¨l2sʇ/2=kߵw\DE>SΝ5He-u$361q.LTPz{:~5A^(Wmpx<5D Xlў. oF -M}D, vH1J KP%BҔ : 9zT,BPzn@VV\髸6.cBiњMQ,WaIJ9|>nZR}͵2j`"KRxjc4ɉ2H-v{QL14oD֨`]E/0*t_OR BBE}aW.+QV+p n J-E#J&xgIB Do؅ÚZk's!E|qzDs40DNe'h"wYㇰj?dtS+(]'B7~pkv^8`IO{# K7W_]Q]y@¶܈ZbՖɧ,!Y$.!RybV"R;7;,FarULYl*:~m}sgރgߦ= lo~&ïvǽWRcy/ښ|VJ?Cփh&t7:ԛ΅3rdZLڤT<z/q1gcgu' 9gPs~KD`0`*ohd2͛& ШrQ"cv+'>ֲ6 lz<7[0C嵭_쮻eɲE 몙bhɈ?ƱmvhVԑ J^Do=&g̷^dPWƱ3c]n]7ݢGkKg0uA׫c>5!It28$^D-*X-DBpȾF+S솞/T ?v$Cƙl5H^)3_D 2(Y"RR]w-_3 7&5aU3yֶJ+gE=A?jE9γP{kkFj+;#!}c#yo![det3$Sz; a7owi _XM_ e%Wm]s!yX>MEHۗȼےv٥~t}55&jZ߿VnNнJI2gL2/jg'Ŝm$L.-QEOZ ' O?`ETQ>[7KayJ1ڞMԳ^( 645T~14! ]r  0=٫hoaoaZ:êD ~v~0G]M^.j "b߮f!d13uk3uꢺZ<|}c&-T,qk:Adʌ>>VKVt ГVZ]cM^E,x脣8G "bUz⾈R:gwZ%Ht<"YJKոWFc^aO.A dHR&{p[} ;{sHꁉpzaŴl>XsޅpAInIB_zjL.8Ev~gi؈ w%?GeQX_Y6dUr?kwEF֙~zQkS)A+Bp[L$)і`7}aOG,E],IgYS(W$AM۫B(z%1)(P-v&IoKj;Y䫉Argi$* ĊePvۙom߀&F~jh:.h:†Ib/KNCrΝ{l<&*6N ޲l6ܶy>L.Z.IGFX<ܟ0ynk jaKri)8YkȹP)O».OǯVlk5D.0'ua#kN5jɾ3dBH@7V(^"%Xҹ4 *h5 7dxUy A)KXo'cN¯췤Ϟ.Ƿ?j]n$3mb- vk\_?QzEX^tE%$W֧Њgއ܉,}Is#I`4}[L#mًa[0M&ǘxWEL\P'|4+EƘaWp5A梽WCRq&#gW.:,ĴЕ_^kZ~VL *1A8Rs |* ޱK{Q_,I$$T2!Xe5ygEt* H&јA,Qy}mH./R(i?0GlHɃ_q$,|PXcyޑ{!#prBN]m6v[rB{ i9*KCsA /1cMe.8j2@GߤflfW)~*<`M@SR3e5ѥK=w뮁쐡5rgMN+ޯTb\TP):2&ϧ0hWA6ۺAZ%׉3Zl TzeѥZuIAn pR`Qvm/pK]\3x36)If]9"P-`EXYü%IU;{ ʸkF4Suy/ wQ|RܯϘ {[sQW_ 5JIۏp T,3a\ Nr}mP2]w1wGSoj7ܗHK8~XŶ#8{>;#UA]?1}ݟjrMRܢ  Y3}RL:2t+YѲFTc<jIsrBn̻ѷ 4$ImXs9͒nB򤤓\-s4\fRɖy ɸRH 6(m4uCF[Yć`Xݑ+ǡhA5X2QRLC_X)ߤ7b(*x~R?.f0//=o?cR~ƤKe 3o "kɈu79HXl{{{8f i.b%YjcZ/v56 !ѤDfo׺])ڭc^54ݘ?Jx2%I&Ɣ/g- Uˆjj[^ϯje偩DPbbr%U 41<Qmx'Fu$W!?i䐊xz^#x 0?HWIFAY*(taIk>w;*%hnuT ʼn{ÞQuO~[`Qlg5L}pޝ0N~w0ͭty5Gk=fis_KMO,]Qng\l>8e]o<[a5UK$OLE<ٸ%%g^L#J%hW z2 e5ΣQx Q d֣e? uS:K]-o2Z;•Fq|sNϝ]t_OAfSg-f1tP,wܚ0_8Kfdžd%˺֕ ]%IRіlb,gd_T44b˜)ƛ 0(ITO׽V2Gݥkq#V6K)zۢ8Jºb=ԚvT3Ĵ^ 9 RFͼFF%'%}hN#y Q&=YM a?6u5k1ڎQʺjOPM_m_A([#b k$iS ;=zLa(? z%|YbIV7nb8jgҎ5t$տxФW!ZQ"l @0D N3D ȷ=kDa}@)FF/2G=)c=N6ѽSmϴ%$뛻Dw+fr%}@[)mfSNiY]{}|z{S8^4yj_6}O?5nͰJ!m\򩿽'"6#̩OZgg^Jn ;'g G@eO.MQD"a [yx{W5HȝC j8JeU>'wuUV\Wo,'\~Ķ@2(۪fQjt§hЁ]#i05=h Hx%]`DKW蕓ضkj=3|N[8hGp}>S*Z]uGaBr˹jF&'W$L*=mt&_A#N Ddo[2zh+=)vh|$K3u߽FsNH7|ٔ$J!deЂT4S%R;ҭUW_iP0S{t|^x}i' fx {fV'UPes8?VAK9#j~`WU^QK[0||0~" $laڃm+rJ`?#*{xF+fuІ31No=+4Dt$af-ja-% wOp͙m2TwrqxK5PAY=)>NZ6[äDk>fm $SvU_sM7TDn5EKbKEQB&K? jX4ƯpgUӈIlaQL)%s*fx):NrS`d,Ni=mٲCva)=Fwx ),c!=L}Ŋ%!\f u<bֺ ב-4*]4edTNPg~ӲvLcs[ ҞaC)MDxQs͙f%:hso>9[cj8VK4^^7cҝࠇ'WR:-=Z$!o5~ysG0f]#-"(' Á\[= .ҭkLJ6n~淾S$)C"$/미¢] ɓs^4+Sb#MB35Ax o.eK=LcΘBxP7юiCicė/-Ij RQ,K,l .F|t˷NL[GFGfSe9Ao)^\0)]>fT}:+TGIyy?R3{]^ߝEtcࠆRi JEJzJ4ϖ/nA& Jˠ R˙i 3(bye&k{HMv^1M1?5*u! hF<_wLS=qz&D(3$YX6- *ooՃ5i/JT"/=)3}lFlA"(1KS1Zd?ކm OjQʫ.:cQ/U!5k[-y$BiyFϰ{zw_%OwdyM0_wo¹!S+⪏irpdtg*ǜ!S'e*>!_V6bC fսЪ <χCX 4%8)Az~XiyJGQ^@x`|p<鹍 }_-HwI[}=%@t}Vi-*Q"pw-ɡU+%<"gޑH<4SLU ó # tz!Nˠ)xƷt[ºn2\aY5H-F0tyg)@ /6m x*.BZ(nYcDJhҔ2^/G):M'g4zs a;.-]%DDDgl",KsHPZKjV,E&oÊ6K@Ꝺ;$n"YTo@2ςSjzn82V*})! zxT/A+@)R߲f4ӹ'0CmVA2w0RߒԂcȨJJ)/ZZ!0((ع=mme%UDTR⾒IWQ/U vE՜$"޽.+y!_*1bsx;; T^+ EMX= -77׮0k3R:}Ο C ~do (U@:4kfF(\X_ tkb7Y )!߿m{"D}<|ÈaK(K$ᣝΚTo7f|Tw S 8'Yts)K;6mxt~dЮ^~YVYFwiiY$A5.deR zP`ܨm DW=L32v= 4"dgnZRKrv]z Ϋ/k&q aܘt%g߾|[s lv_7!jRe8֠80v':AꍜɭhBlfė&~Z6E 3Ta,VބTjSLY5-S̸<','nr7XbmmQKi:z"QO7ws}0ީr!K3Cv:~jgwJmy .s7Y&|H4 NTN-T\&MV bgsX "I,$eY}?ߜGf o `dp4C]ր{z=]L3W/rWmxBz;|AV KFS-wNɑ9n{cSK+\y W>d3S3Z_Fӈ!cz o)D\#`LP˃*~-@*.s̑"Oipis/2 f6t. 0ΆG!͕i7#}* Zw|,|ymMy 骍G"W˔ic Zt(³iZ g2tME|{=4u &BOkY|Uqyëj@rBϕm^93 l*8h@y_#|k*WgPE4r},(%|DXPЮ=tJ! >yj,U!}:0d7I@}ڐF5@Gcq7oy#0#+WX' 9U{"q #@[ *8|i(̌ZSTTS%}"[y%rrf*QAY$)(8*CGOъ^HN5azGw+s-FHד$ok?dTUSYl@lռS[̸P&z.@#;C @kѻ.T Kz=T6@Z̜HCkbjhJ>ݩe{Q6 2Lv0\Fj9h!c&$MÀoQ7A LjP~bXqG#|xYI^DSui4p4oϫ qF~:I~\>qԮ)X0y${zV@-ސ&ҷ+\06 ms!:ɼ,ca11i/RAv.pMԴ~5D%% p_Ie^po˽ }.. }B]@o\\411|kX| %dnwqûTgvܱM9^Z迕0`VܢFp~aq6R1ֿa،|4y,&bDunnUd爠d9jUWJz?.z_'hW薖=yq"8Hzqo Hw{{GV}b,NHzZ%44:Q߰}?ѶLM_Z' аv }Qf^}Tdu 4_`/M)ұ 8\ݥD55~z+!d{;lN36?,)o>`\&nTaT\VM=3m^F~h'fH~6-O$Zn=΁3 Rb@3fcD4Q te2$<# a2}#D)0ĹAIJ 2U3O ]JF?J~Ώ#_vh*HzH7Zh,uTuiR[92^0}_G\jn~8!Ʋ *?0X%u.!{;o@]uP$2A;BA (NſqB\ U/J芔'ź;W;|-]2 elXK T=5Elb@+]M]oe/N5Dk3MET3ʣ"}o|q吰 \ w,6Hti>Us dU7Qa3iW ^-P+wcAmƆ$? {Bc]|:֔)M{g%UU%3ds+lWGmjIPI1u,6g.<_܊&`@Ej9*"=܎yѵ{ws+~%j&\du0*-qJF\GJ 0!)92u?J/tpXE+OI<3F1J@cοSuSI2dwJ A¡S;}R a{wj4+[ooS^OiQCr hMfՔ!Ep$}c_ȫ(%A5@lfP/Sb ܔ .eǯ8zs~l yt 5W^̸9^|)>:~z g g+q y_{tt{mam؋z=DG4|6#Kmep(ܙ*fG QXMq?^siƣ*iMB[삢%[bk6$0h}nSnFK4Xv7x[zX{2EA^=^bKKf1t77-0Rߣ&1`>JTZֱW9G!wL\*F_BRIf>r=}EeyH=\j1JJ&""{$|)a $Qҷ^eqwzB"cַOMݍ]=~34=*bkTL A,Aoqq ')K/QuM.!{p \!8.w'=.nAsߐo~߾wٷaz]}N"3vݔGPf^+Z($!굄haᄁb!k!5;AtPO) ?'r\wcNdШlx}Cs$BTW?Y)cJ4wHsz)f |Uccoa+vCm5nn'9WXdlh%r߽ 睞A/4S6Ʊe,%lwsNJ~@ڛ. yL%d3 f:6QH݂q,nSl,0'xbm&t4^ ˲0jS6^9 qid辚VBz"Ŕ3:_8U/VvXoZ)=hr_/#:1)"8v<8;'"M%Dtv?B*WUww>m#ZTڹrS'(/ʺ>k`mopa|[W彡"s7oRwnCtw56fC~a~lzal 9)tRr%8rjsdR\\֡~^&D5Z }{+74+ȠILqlUhjAe0c>CEex7 ݠf7`l? qk>c9#2S*Qz9Jϩb }+(ďËB<+Vt {oɳoV^&[2.e$PC,Axm}S<>|f}^Řb*7>#}*@_AQ|JC\ SO|c޹?RXiPyMp븥V( NU#:K>؃c(9Rt#~{װS2+mfAJ}O/3YۂJnż~sO?ǶaDݫFD]iE] 㨫\d [xs`Ƨo|lTDNޑ3ArDzCXbT8/Us=FBN\hjWdzNd .oޭ*(l~Ia|nA$.+qϥOͭ/sCJ` u%< č6 (z8<³tvqvutͯ9f-Xcw@ Ae#yJ)Y醱؏ydL`( +zNh،+QnR3Z[q.̭*0:>>6 v}m $ikcHEJd77ꐖܦʌ&K`RT^4A`>疒*Cp2jl!uuO}Q֡72} XbXEY "B:f :Տ~_\c=79%n•?h_X9lp ettLDiZ|1HM\pӘSرw֝$6lb")L>dlՖ۩C*jZ={nhҹr8iGa]#;I!T]ҽfkV3 9"߶H~X' /Fd7N D_7a6[t֊S}&l^>ӕ: =?_]#XQB /?!l0Cp1xqr/ 738;]{{Ę4y^cORFg`^v&s~#vr0k}.|XBufe4hq$,'F"Y'~= u#?[ӲPwϻ$",3 }Q'nn9BcGڬpۀP'`=)5,.HYM :!Ӊv\^?گ7VrKRJɭ,I~sW,ef$Yn7L/_ aKB7EHriᣫp మW#qnNI0hDyMGu~:n^tkWL1o-Z5Ǡ.9k rզ $dEE=聆ؑA `X]kj3ݳa$ !0ޒ[5J(-qMkǵ ÃQѐH!P2HxQ$5/,dҤBt "5s*F"N1:f({''nv %`zpXBi5k>'# =望Z u}TΪ 8E$ ij;ãz1d5)7uU#,?idvKe>27{ ;xGRSdp QHZX8!6CIr턯P_LUJAuqˋANnwrLTRD7| =~@UG`WG2~,ܚ |4Z uB-r,%xD#kRg[]ndbfIgY_Q0T E8|s`d?℆IV\6ѡ}^pP'S(#vWod t$XԔڝPҐ}M Swii=@#SK >=n*Y^"4hBm/%c`ӧ0uDmK=~yU~VSy bߤ4=c^bTͤx0t ĕG]v&fRS(9D>>)ܼMy}і$=u<,s}aU8?ѫEqy5i#*ty\cޚO~:E77k=JkGTm.q]#סN?u*T,6~m{>Tq4Khk:Gr꿯¨&a711ŘBMu 㥨XC%S wl\S3+hP1jR7`Ow~XYi%)I=1$2@Ñ}q9p@HǶ@Z~X"pAAo[$*;+  Gxd j rRcj z]'Ã{X1zlMԆ"Gu`ANB%`|Ċ}8KH%,tt;)5,/G{ʐ&$.j2 (c;AX;Sd;5Eț(홀@_A B&U! -F}fёL{!rbbC2o>+=Cȡ\C*DKEu|S NULJ~?хQێnIQÙ{~zC#VKakA2Dсvޑp^}{2' D=:^ѿ! w~Μz|\h$=Enź KyN~ڽ"楡 GTPt03O6A8l'8D0-ը&?B[lapbdDv5!+_+F8}ͅ.4 ͤ~~2gELoq0͎Ϧ⽛ehp=/a ^Ht)eQUJ;x.:F2|j5_iY)"ѯ-zS=, co271QnF3p{ZLnQc=V ;X}2?smsLuUν~|ܘXo',W=}~^va/Q>솓w2[hD&g=9(+)-e A&7걣񃐆8wjQX M19J΂z_m%%%ke1dҪfoˣĕa?=pXO}ako}UJ,,I΋EUx]PUxthhA ^7L: 5M?|A/6e.4/rf+J #{Qm }ݎe"w8SXwCc+Z z;^wl@Sp#nyO.r^;k6u59J 8 ߺ7d] X7݌9lL肇296QJBdɭFK|.u~JM'Y~2TMp&\Xk RؼUJњ+vCl Ukȫb7UJSi͟Dt_}"wUx^ ̬46GΪBp؊e|dz)"+izXty+.DޘZ#M6*ϧ0֫HRҦW;W3<+MC&eJwF~Su;4wi\C3'g{^v546J@ɸ /\:+XЎ^8j2J 5^]sz!i&VWgrD|ן頺=vШw|ٰB}²(i%O^b-9"+&h0^ўM3܆sx0iJYuj}J +4d֌FYNOΥ-gPXSy4Y)@j[h]@I\'uJ!|.QOtFnEa8ə_ ss";z+c;d8K˃ї!a@n&.~7{R@Vҽ'rso7yޥ:і'bH4aoUaJO^3lW*}]h$;-]rF&&ݧd6}IDj(szP#+,*:!E΅gJWrN]Y؂TpagᐈaڙQJ'>Z3H9Ƌ}%2R?H[jq\ ? Q$4Wn_BɟF2d]FPt5ߚH)ɥ{(ĥ+ _K%\J6{7U^g,&߻/fsC؃B3ACYS2r>h%&sŹQ5 C&a*mX+w(Qxg Y U1-2lxSrnMr#ڢaF3XLz])t y!ƠIq%2~B\mSi;$h,k S9gY[ӝ+WH 0(%{þGY7XC.h!UDMC{<_!圴RǸ'[R0a?oOMK,f.^c$f֕lt>?a@[8 Ǣ[1@B/R=>E[F`t?-X!.lgF3 ,m֮Zt]c^OlJ,>t`[q[tB>By:ND#{Nrko,h+xsJ&D6=7JnbAq>KpI9,xN WkIMj0O4u/Y[olcOf+E ,V(}z6=Uԃ-޳ ;9dlq|{bmCר .4Qrx({CzBk")_Ud:r&qV.tԻRF7zGeŀW tI] i  LU!JdRM- rWTc4y:q`DR}|N%VwQ5{t EAX~ٕ]'g0xb ut1"k)QmKo ^/z%Lݡ/aObs]?Iڜ;u.GRlsG]柲{5?}iy,R@h?SQz8 % EZm Jg`p`˫Ჷ0-Rv" >t'#Yhÿ@aldSbPKbg}ZA屠Y+E iVÓ?aH僋f!iK/tZNF{S`=/{{ݳUyGi r9LGt7SC!AЬ~#Q4haUF%51[R/G6L0`Fh?BgrBW ?z2Z'Q"?3J\y)*ZU$ ,W/V6+;ad!_ $6"b2M8K:!TG;?1XO,ML80ZCuė쑴->ԋḘ-lEŘ?ذ#@`k XvH .~ilB5_I ǚ|1.R}^Q:6|"pyOoR qi35|"Oc ))έJӎS'㧿gDQid;Vk yìčzZE`--D=NS%9`-µ{t{ūaC`I.Ƅ%s(/_ҳ6"<%gIuF$b$~yk]u`%D$pTqq~-ʥu'~j qjP;v !jlP9t XߩzUѢw\ɀ1g0mM{|s ]j \Qoea"l8~Vy4 13U&OG97VT0' +V+bԿx;KPi˺# Po:Ku`Ԉ(j5` &h ¬{[dqףTEA9@\6h[Pc1*C XA&?H\((AVv>ѕmaF܀!HTGGNW?0ҧ 5nPQ\87+ hKmᱣT_\]AN^MiR11wwʳWP^xW z.Il/V*bfPfЛ\NC}}dr?Fd2qSMܺq11=N1E#ޏ#XHK?x'Fg0[1,S9V°?Rkƿ =:#w'a@ 1!E?;zIߺLӵ道U|teЍRښ-, <_[^HEq ؞pñ ܓ.otVD}L&%F?FIVqWqQlp% GHp @l_z YfViy}?{b gYNE9OqӃIlȦbr ZnyX#r*{=7ቃSsKP)} U&OJaEٌzJ ANm,˧OTo-: E}4oD2hZ#e9ݴ9j2\G^98l1D\2j}̔6kέ9.'Σ2pN\j'm8>vf~aR8.),cYA'q̷)|HyZ25AivZtÊh,wDc]( Щo'e~fY٣PAAbX[{h ttxId:sÄvodsE6Ti;_E]'LQ}l^\J-I#[zaXʹ; b} d< BaS`$gQ"|Ls}LH.ŒY8~wp &P5&6豩G1v Gخ{nAbT*VqɯW o'v),_WS/mY-2 =/PV˅;xxl!HKH1;Ψ圫P控iK(6+<[p("_w}_V,9B!Nq|_ .!Ս#9"]%CA_V?K;<O/Ҋ&Y܄bS r(B%t(<,FPlmbY.x=ӉJmIGjk"Yyn&_.p}kDuMNw BIBdz Jn\9w{/?~Op ; Z 0{.8) {q]]tvH6a. ]+% *x,Wn˂>So_&oG7Ǿ]#|#_ww='݅s)ݎ^*ÇC৆Ϥ(}R__GYGT1NT"q'&pϢ3n> ^Y\DmQs Hl7np=ۄov{lfǔ&ڟ $ہe M?DghNy&eAwW3×F7~}Ƕ`Ąqgbi,s?nO[B)~Q8_LchJאw]yK0?y{:`a)qgdzY?ؿA  :]Gߠy^Z+s||Rk@SiY#|UƿLH^Cy5 H%+iDw秧5F<"ofz/DN{b~~r9Q\=z}o~sR G wLs֙HӧK()cRhi?TH>>X>_`%$8dgrnW)K$O*nfK`79Ij#E(,=y6fU)]9()z KFX\Uq1'4'L3̋5jPk%9LJ xR?T`&YG5Nj(DyBwx_ WrlF3Y{Kjp, {%׿B~,̜OLL K2X~@st7h?Et=#H %H.5co REj5!ӌ_)@p)RZ~JPkKZeQXi"Lw" l8yG#T8 |v afdH",FD2w-zeyYxμ9Zj+sd\WxRddd,(ߣ ޥB=y焖p`tbn/3°х&cl:wS}nm(2mc ;@J&6*=[т\37n}N-: w7vr-31+ H{/%iuůgL.E[uk ,x!a!KmNpKHpww00 3_sO^k^OZTi[TDL=9B8 D{ɼc7D[J?|pJ^էR3*uĪ2V$84٧q>k#@ED//SIB D"sXʷ)@O;p~3j38|K8MfAo{n+VnAVv y_ִ:^sY/$k NcQbwoHƇ!&#aVBS~Sj"! q͠,8w?_Q30=$45ry'c6l6Ĝe7_D21\)!WJF`H|򚶏2lWmSLʣSգy?q~,㘞G2* |B:A;SXeAXXQ9%8VCD9ܲأ%/ɦMX+Khexb͒B߲@ddfHvq A;x2./L Ch@)hmh6mڨ@C u+SCoo#V^ժDHK ϣ=eO]B"ܪes[]wqS91޲!q@lD8Fb}?{ /N@=Fuin;"pC*tY LaUH%$'r9Ы.T4,_d|i2K&$F"4OuwA$Ai7#'>&~ OZWL[f/\rb^?o̥h{(?z1/JA l© 0n]9-fܹyޝ|Z8:!XЕOcZEV {![soi˕Mg\mmR*oFvc[Z))uzu7zwkKG^m-S@$EA QVvpObď&jܘגOEbSMeR7@ގ.9g~K) #n !w0=6GFϹ:{}t43gGguN?y$%;ޕ/o5z娼+G5IxDJ蝀e9AO$7QWInMň,ޓHuޱk]V b$~&ު嚥p={o4ʎ]Ŷzy]lM%qG{*­/p<^`ٯxR&@鮔4O2&I ] vM\ %VkB-M-d clă @v},ԸQ49RMs8A_ּRơԪNTNj6)u*ōe8pa--ͳ-<]n'GEIW98$g{6mAeAUwFt^fwɎ_#vcQ)g3lXi/'c=ItZ3O=) (_%bZ=>n "熗ic|10M*ܽם5S`zC.q/)2lX:}Nt!ej x=f^Mc׊@fvɬvNke똽?5FǞh3fT NѠ1%!$ ^h9 eg̱ԕ^=<~\Pl89hŅ3Ϥ=1):Բ"8]3)SeM;Nrl+,]Nfo)`$wl}3t 54 5Vz MV-TBr<.:Yu ]׉-WgV6/*@VY FMv$*`~=7cYy6WG>:W`F0)9u_# ՝^>O?Y9vcKNagϼw Rg]F>l&:C7Mx㯸MnK*NMdqtnU,E.xzV76YOC㖪HT,M}ȔQcӮm6fJC ^e UۆHםP7ڒ /$B @PO*a[ZUen uQ3o?جiI?qEz]?ӀɌ-d,s2.K=Zy5:K.5OÐ6 ǝEv#jڠl 7^ľ?deE]=tu{ly~b嬅 Ig _+%܎ zE+ܼ%b`t/j6&ھG1V;JޯNB.5>iuˢ0f)cObsZmX3{Ju;g|]Sl!C'Ag|f6&ˆ8KM j<p31SX\Ks?縃)`Z<|oݴ K.+Bꄰ4W#21"m>%&b^Es(.@:E(7t>>`rc+vλ?W1KCPsnxD5<.Pw)i$~HGY2\+]:՗r?,V;.9>꯭w'/b՗UY ˲.;w2h[)=dW\8i2$i)-ˠ5(Fd2E|#v'bdiM^]V)\P3`mjRi9,}PTlDn. }G6n֢mkgΈYu cl'x^m]\SSݓ7 Ѝ }E8}4F'eRD-Qt31[gg,'J*|)9/ R(Qld(]`Ob\wl$e3ܺ%B/;1_yzh2LH|Nc~* ͔2s)!_}ՙV2 {W*_BXsy}"!bOfewihW\`Yw޵r{A FhJ/b4f, c2^OsB#d-Ѣf:R=Mw30Vy>aWigQͻkuXYhR˸X?`•_:q!@/@ /bZן yZlFP1H_ ׷@s@}T'IXӝPrwS7=ę:h|eSn+r+DA`'@b ~ZLx^#nPXL,* 967;^,DZ~p/TY[6}:椶6!fc2t/s L gє"v†f>d_d \Rb,dt:'A˟Lh Y|yonmѭ{t'kOF7YI&^#b1eCBEDr|]"uJ7:/2<﫪>@9-1pCM]{ߝcَ盺\oA-2g?We4ϒq V3g( #XhZ5"w${sLӡWl$*Z[bbά xPD~bSzXZ>R\2~H{-*3_Zk:Yھ‘_0C)+.\CR/,coDFD%`0b@~uM ՏĤf7G Y5Z4|yw aStoQVZp/ 7o|&KnFڅ/P K`Qj>><^@"_BJ뙟ONm;eMOsY̼~#uX{mvԥ=8sQB6ΦV/#S.~4Y|"!ţu;ajbHWOOQIfD/ ~'vߟO᚛f΋ /{GOM&`k+J0 ECiȚxfI jkESd' ڧ@[ &KQbd`ɑ/_f[=xۜ؃& rcUC|Pd Y,B3ߖm'rhF}?).2c: _$Z؀{S`gjBVdS5䴧WV}4rM1S~8 F-]@_]N&R`mp% M't)֓a"_ab\E˔zΩПC.4N@gt#^g~5<U󆙯>R=|{XE\wXdYV7_ nXLS:AXh;eҾ5R&&^F_U\?HƏ֭\65X|ə|PbnsS.̿I7wjr^|a6u] xeiɥZWz6nKil^^0x:bҞ>_)Z\OK‹^7L*͇܌Ca2W/y\HZ~0,gcq̛6M.tAS"x50 :*!gz .(cFi%p?2l?H 00H6g6$t0o6du(ÁyBx #9RR D()Ed!?V&r02T^^he@ygpyw8'a6 ?YrpmH'2X:90!&$lyY.CXXQO"b/7GnwxLOH=F(=*ԒX=c u'p1P(WftԱ/_`N}6zSD&D:來yo|vnoн@޾,1id!jTg? I vaZtG !JaǍӃQ[5t)o{${/wSRdBtVSF7Oߵ䂴Mdc:&>$ã%x@TT-m㸧]Ƥm=o'on['{^Thr@GDq{[=PEyop~ a49,a{\'ŖU.`)Oת×>q|$Td8!>]eZ H?'w0]TH:S$y[B øĂ/=S9϶|vpQɵ=H!ajDm$Cӯ_kpLBa ͳ2pM!!jLb FvaPb{6h*}0ФX1Ez ;95>6ӊ,=εεwlz(BUx&ˍ3Hh'{CC u0l,Sؤ3bPqq zɼ}ksIoϦX&]<ߓ&kN&aat%vgly46a.NjDEHXA#rQv((rei(P~Sч9Ěj' Mƴ) o#?9,_ |f Ik8CޟV.!tD IxzD ZѲW'sh>eDfZVBG-QI(QَP?q(ns|9l]ېIjw ! Otk[5RMAaL +L8\`slӁw78W 0Ɉ W#lR92lfzȐ{·IV5k4_cܨbpǂ4A-[ag- 8NX|/4j`mYYD3ԙ3}}Ʒҽȵ)j%/a{lδ}3+tH PIfz|o.3>> :jc;5 '~v Ѩx\w?OJK@%Њ.Hp /Gu;4~U ˌ-{S)i'd=q8<=,%m| ikXĵ;H6\.>aOۘW6}fSH7t%ưrE 3RzFvdHK|@ @R,J(O'yJ}U={ (Г^(*eo!6pz,6@{jzC>|*v_T#-(fԭG; `c8_pJ2^%y+>Cjee ]= Σ|Jxq)b~*nYf;D+vHRGY(Q7oDk!7l:F);< ߛ %tbPKō`zNz#RQfXG!MĻ'(!I3:؞qUX ϺI۞ŔOlѽB\RřXj5a-ّq֌v%,GOrwnȊNn$Xa{dk JN.P~#7gU&Gt:l)'~8G~Hg@ojsZ[?Q,b`ha跍2HIXC!a߶17j·>k=|{1Yb?5d|e|!mdۢ?ִ-6V0BUK]]>N(TtAܺ׌B|*PH?9Wsި('VfdᭃW-òqe}Ƞod$ڄ6ݔoC>e[*|̞)0ϳ.É~Zm2*";Qe-  y3e%Vo , KDBu\'=Ĵ9cR{xqP) e ML|}w}dWU#s Z˔ZQ2tRoS^tu8vukK⸃}P"n驒{hAD0 W])q_ELNUWP"kaBe ?d+WC5d>B#podnf{tă ,(`,b#_z8EJ[GUyXӀ$Oe6Я<('#?^ui"_jQ\G d?q/& wqoJm.'/6Z& ;4xN_LXn{Mwd1ym@joLrx~D69CJZ6M=%GˀzY;~k| <;(m&~|N<#;@8,Έ!Ij$JVt_= $~:t.Nd m/{kk_?ClG 73ouE*TЃ1ʰ' v@9hKN FʕV>֡ӆܸQyMŗJ̜$HPtL:Wի_ʛ?#ލ:RZ9N`DӷK\?w6F:bey)~މTC'\\WFAy;z(jܥ%}z4Z.;ݧxך'sQ "|mA( BȄ쩮&YOviowL\Uwd@Inpw]cRK ώ1 8; GyOݳ@I+3z|=ۘWnbwMl[(F9&@:'Þć'a7\p0뿉(@WNgzk vm7Ua'=bymW{* ^HɃ{t u"+JCu)(^`j%0itsk8ų].Llf~ ( ie:\/uX=q`_` )feL^&Rd; aݹ3  4%aN@ۣk=#,rM'l;~?f\"1vfG:ICv]mG au ^`'jG7hG=g,ZGy >xnOv$FwUR";=v/T}׋>g#%RA4݌Mj]1~d?=Dn, V{yeL˟L5b"HjX vܼ?l͸tD8HK=87|;J7_ۏ<@tGAhbuzZΓWZsIqOA|4L?pՄ3y r6 mwj@;jasirY /Hm}=4{<-_nz6fKfCH#D՗o:!ˬ3$1Q|,Ȁ{"i't ' 0z.Ic~XR=.% ""|(EGj衇@$!<;y7ͻٳיgY{[}z4Y"iV̱\twһUeMpb@d^?\6-},Uhg0u*:ޟQ6=]*aFܤk1ŻL*{޷ƺx|$( "s`rf keE^g,)77F^h@ȯNUMT7A  u>7f{'el5ޫYh,^wZ2S7^Ж[`׌w#϶@Uoj,㟔Aaa}:'=?upIO  dXt7M=0szP\<;y84{xu}lz$qS(}D4%m#Y=Ս eHVπeo;, K&=۳g&kri|Аtwc|Fj+z mo,7 0Y"s~I9dhH3UzX1HKN 0;LHפv+U&tJGjfP&NI _`qdl9̮ gT^ik My ; Cϊb+kN&lp-2Km+r];Ov4kdϊ;Q+_b.A+ kЗjbJŐa [Z 9ȧT ɐ`%3գQK{֫??\O観-DM( +i [mD?= 0L"xg~mVXT.Xk8U{DDVJքL ى 만YmF+@~ŴŻt˱BmEɳLǍ#a9J(fLx2;W}XxrhBS~?TѮ0}tnnʬ0J%F3?; ʸ]M٤X> Q8r_\C_e-ǿ&cfAmxyD8Z㥄=|}kKnwۺ^\{;hmےҗo]}݆/m5n1ZSsjm_8M*h!m_ZQ+"^z*%|G {}BjXUJ1ngec/PP"Cs)aI̪V_SRNZYKG~$Z@ \UsM>講A|dm}ONc*9^PvM&obElI90w 7,-E4M`A+e WY9MOr?kO30b$r<}qDTAS$<:^\e x]gp%{nZod2bԣLE~AAa;@ܻ2<[8[n؍VX ?Xe) ڑ.Kѳ-b#zBG0*م;}NN}Hwsj]>w:k =Þ)*вqMs@sq{ϑ?6&!/Jv7k:%CnVW"}zw{qo0G(9uvM:?:oZ xqK9Fļ/z; J!%A<%wA?̲}3Hz^u<u7x"4nRVܰ aܴU1`bGb[GĴͶ 79-ĿpH *hp%gN YTyuG@GK4봁'‘c?1w]b\>wDSc5vseoJP˂la ˛+u/)]띂q^lK"{vȐqwl&xRI $,m|H7>oV_gsJ]Wg`03 꽣zHp`RŕbK!E(!2&6@GLaBKJStGD?yÚQK _$)eO#<鎮Z]P ^4Z$de¸b]ho/&YA'1t}\A_5^] ,yy;C?]ogWi2؊xD'ypq)1<S\r1VΟ 850!x 6=XiEt~Pͺhl.Ac 0(۞6jF U=9&;3}˱e#-=y}#F!L4+nǖ1_qX([5\ןoNעl?,wјxL7vvDiH߯_ ɠ"FŃ A$wrNCVTЊ &e5]m6ȑڋ }{W.s55{'|g @$) E>&BGWk 苳{a1|G)}8$҆ÁِMA7obByf(w^{A^>o [9㖰w U[MT;VJ=ᙝ[K{]Wvk|pq{gCd .77#Kg#$\Y?Kŝ·T[_gc>+F?vй7-*-Z6u!q8ѣ_w0I'+iOcPE\K<7G[~[ U3z')!cS "ȫ٩yN ~4!A%OW^P "9^yĜ/2%Kdi.jhfc801L<R-%¯4Xi"\zWe=b@Aitn7'HBD>yyB_$/ |s/&kнFI #oy׺x);mA`1w7:CQs*BLwC !MM$a ;颕"# gOYĩEBeqw炶! 1y.k%\>;Ec\+w92:Q=g ax(Lpj92Nf*܎IPZ!F?ybjD3}< ֱcIKCff߫.g|+ݡU^mJ x?SϽtOݜ@Oi]uq}C: .ߑgCB5vCAz0:댩c%DOiʡzx38Tm. -8f&kw,'<ǘL\V_%/T-G|O$E曒'wL$W>8 3Q)j7#6 Qї2HߔQPԿζI/=KDcx)HRΞ@yaOτ)EalWpߚAAq_u\=m>&*oNX_*=-sց/F1\7# ~vB:7)_S u-δtq̝ڢ_Gk}$^^q lH:uK !I93,l HUYӻmv -/;ҟrd\$ƞSfo|Qz#~dɯwYQ~~ 4EȡG뒣,a˅ꁎg_Nb D}b\_ :}'pAPlFvۛ9洼G}/AT_*rTLrxrm􃿺RAϖ;_ho^BC5m+i lk[*Uzy)wrN89 yD)(+In31251D 53b[W猍O>o=kLQ zi݆ZujF ?y?|l EG{n\=3Szo޶guB`2mK:hh㥭<f sNbDZ+W;wtp\x3zH:8r3HL}8k' Ue*4hgF/dtkbz EbRsl VsY{*&L ;MCSSW繌'Ę[/>^ ?|ef\}#\ ghN(1"O8K֜@/F!L"rk뱋gI]͌N[IpN\\+6QZ,/Pbl{5SSmLw ]?ɪx;|=؀d,fMy1]f$)! !]^T#nC*?#U ׌İ50.FO$&M^~Sv"$)qu" 5xy%Caœ 4=伐TAGY:{2+?nH({R͉JARALj&aGR6!e%ӾӮ5.%,;H;wL~h17EG| dc'^i9g);1lqI {~#X4T$~/g"}Cfj«R3J((OܛƱ<,֙G|zV%k MNC";0~0ZGkfA38՗^v{~ $Mi}|%nEf-508؞+!8ms:ϧ[1.n7ZY5aF3!Ws$B2/#虯Ad,6|@[6jF%% =QX qho)bJd#'.._OcN_iKX B!.93{hi8JFGho2U| zr9^络Sԑ5͏Ξn>PoPiIT GZYέmuloXBWaXߙlmO#P_5NǗɆhѧ|('\g[S'[hOH|3VjQnSx)7ƸTÊ?>(dRwhx|.[{Я''x2IW=cc>uZ_q{ I&x徭5+wI3XǪ$pĹo7V QA;NMFMGIe)M;h~uM|:A >P膠/7jҗP=h [BT __qodNEqkXں ,mz­㿣 :_bO5tS,:rPq!J^앎p `UۋHʂuU=R;)f\mdOa1% 7)y3kR\OGLS9{?;:Om౤VoWd%8Zo]} l\W/i1 #>Id" x= {?N+J:c6F` bRES+Zu- j Ӫ[zdeU{}B91@j݂bqgMw2!iO2_w*aWoZ/2'V`Zt%f@@(!]tDaWnlPi'a._>6EJ}|Z]j3ϰi"'@D[9]Ϩk~[!g'RUET\hu9T(*`cu CTh Vmq. 9PdޘY pVlX|f\X\R܌2tIweN͓-oٯ.x|n0%&H[)#8BO.J1LJ9.~ɶk0t"ّY۰rs:E9pbnW8E# %< A{v뢬Pl~QQNW\F΍T^]1<؅(;3o ]ԪdS{ıoDV{*O Zn75$v"m`iDTZ6Y>&9ﶹ Y<YI!6cʩ*stOai*B;O{,r/[uݫ7.و7JVQC6Rmqq'Vjq壱O]e \vF8 ;eV>4f)5qeNɄDm]ylMT1m׵|'u,Jz/x@^D!u0tuP~ouBJbwjR@;^s'@~Շ/s}ߣPZHk>xx!&ܫ'Е?ҭ DǮug@ɫ\EabDޡ|YUd"ae\sڠNN"awX8Xy,VR ZYXGmZ>'T 0Шdo=Y/kwInZecU^l\ܜrA G03l.N :&EV__d"~%{6/%" m@]jڷ76u =[dJ)ո5Ӛje\I\&C!Z톣:7jx\*۱et냹ЅNF81d!׸%F+Ek׸v=oYGS JYҵkzgOX=,6>~.u5%c]ne4$BZ]fÍl|N/ ^j/eŸI1w# #l:=2.z@2[[ЗaCA@- P,oiiGQˁǞ$$|ݔV?P\»=1[//_ܦ %"8Ne#-4[;6Qh5Zy R24|o4@LLE)]fuu-e?G/!_ [4<Q}} 銆 ,Gqom3-*sdOm&:W-0[ݢin.$#{˽g?Z${9 IVCЪH3GO]IiJޟcme[![}/ĞT%{צTF[(#BkҖMo߬24nvF XS<饜 i`&^cX%-9b CVJNwc0| Lt;57y;ozy|H迖8 ǿ469?}_Fs=QT໅^KxԇwepT*q7U!a8Bx/S(A7PjL9g* ݠ0p>zzzIN2Aѣ)4fOA}UA_l( on ),Hɶ!ֽQ緽,|r3Iqĕ#2 $.=yHl;ۍ-^SED|bL%#.4 -d3M)NHC mt_6#wi?6m0=*,YI.H (۾ =y.H.th>k˭'YBtO,0ݮU^bϥdj}❤ 3X3,kGgiߚLo*j(0o9n8>5dRSeu&ꟖBXdLIJԍ ?DxPG ͑OݞaC@$bgx\,ڥxHj3ѩa8RsѳzϪfHBtm*Nn35~@+z37ₒ}:hxMk6 qʗ(lLL,'fx䳱Dk[<4McV%K('J.N@E3A}=UV_'("~ +0v3d;a>]BvpM函h>?D ,կ5s’{~ S+9=e5p W%1eصA.PMH!:r& '?t%c,vacŵwavd"ozujhʍnB5K,-“NgBjxM*عuū1_CR`c2A[iSǚ`~mK_O{2UN  aн7 ` "Zmܽn.6߿)K،IrB{s1\~|\~g㢼w׋@ +,3=_hOB2#hVC3#.@ +)Ē4q\=o $UEV> .gVGD"f#Zs@78 zZHGMq@TGaQ hu SoBنHq+u@= IzIIgjޑ?Ӽruco˟krd_g߾}( 7gd50QU8ER !R 1YЉ3z됯cQ|4Y|35'E#j|(u?"cÑ5/7Ri&pn.$Ƽ'(90iK/(Wu9S؏N7=e|!^^)iQK{OA4w *Y|.J2LAK̜1ww 9TFEZ]j~e0k{|U85xGri"M_0KGIW Ĭ߮u^[Q_  b|^ 2{|R;74TPc^ׁqDsWI[ߟiۢlݛ''1T.+z;[CKGM^4yCA:"L\$*s4{/mw5dݟxqo`m^OX^@~1լ9mwAs:fb.IJ"(. 4,{pwF w иCMOb.nsz E}>+Y*`T rU:R:y#_ݑ,;*l$`y3nH@lkZfpu>X 49`}{9"DJy5}A@Z Kz2tUO"#8Rb[tuTO{W2v7^"-@0zejRZV_v7|&XA<0r [-#b%\g#'l}ʬRylKi(u$9Bffu'_y =(ձsHђTؕ<8PCp g.LRMtMy8?v.C@ߙas/9\GHa#qㄋIp3'dA15ɵkO0MQ}szn]AqdzNGQHLdDEk;B9CB"Qp" ;i(8I^Ic{FhP(< *rVX^1S:~uZerrgZqVF8z 6~i@)?@anּ6B#,g]`e|g+32)3? 퍑?*x{]SȫAwu`-Ubt1ZaL`X추ljVSZhϲd)〶N؟6n mGMDuEw{dzlR%W$Hi71q@o[!@1LŐ=A4bX..I %*1(~.و&-:%Ȫ0CX N? ̫f} xBh˰,Es?Gyxv76EBbY/,*{PT?rh$Flz⟣ESqNzΰ݀WRwO:mOޢ${TjRj@pCamG]i>9qZ;n9rC5`61+RE/7Q3v!ſİ/WdWcЗz'tՃP!XvWݸ}Ӊ[)ݞ k=q+d^dr1_^֨ yrXpG? !8 }EխǶS.KTכ zEHSt#xd&x͓ [ȳua1hr֑ 3.|9MFvn'Yϸ5y /z&=0>, KWk*d!ޮ\j3ox_a~(ƊRG@<>7pMoH'o^1 )!U8S6SqbWQsr <&2Vt\&F2RV !9ĴތϺ\/;Gc7j!F+>cvSkԸ59#tfEiG #0=heQݬ _k!hRځ 'v.ې.E8V1U&?͝ϺH}+4u"!"`AtgF\p(<>=k K!%Sʝy/#7Ǩ@&nYխ0~<,>څ&1vܛRً>˪FS@\.JPCRF0rz\zNW `tt7Qֵ{bɃFpoQjY/E$P#/9C|~_TquC|>?x#`~ΖsŃG;JmXUG&[*]C,f DlpڄCGAAT-'WN:z> Ns;n&^{C)@ܳjvHQo&\%>Îɋ:xhMM p5Uwa Zv!ʱ9zK2HJie "=d\}Co5J9Д~Zqv䁲ޠNC@Dy n yIR?C-Uhb\q1",:vE~RHqZ{zI@*-vVN+hݳ?oYi0I5݉6ˢ6},X g .#SEk}hzFNHzPAWV׷?@I.຿2t}؅7tÛ:DWAsNuI{8Kʑ+Pr=>B'OZ Go.Qn;PY`[WoM%vh}chgKֻ,mL,07Իl7y]\.tc ۉ%#ZM~/ۘ2E%J}mh sa4m\ 5-? H<܇C"/˥?ޟs%4c~!]gDR֌.&}U7y= oHoSZo1Zj) 6t̆5zaj?N1.pY&~wL=5 ǹՔCSoZ 5?ݢHX#;"30S'݌356ӻacf]xKx(JYԊ3T!cvfU0EpD-1Q B+dbPy3Kb)wB&8jKӎo'8snCαam-:~%Ud&g~\y˽yҟ2d"(>U1aę>a Xx-`l 8rUΙW#[tI!qN@12Ȇ]$ ƛ#G0ܷЮ1ӆ+Ц VA}Ƴdʔ;M;}*w뤂/trTh#u&.N/gBt kKz2qKUe8%>2P: 3 Trme:M:Su1=5Njj֙8qn&Ƀ3ooiq)?%MQ"<> |4 g5Og!Hbm ]hRp #[~Eٻ0&h) ^O6$`ctn tH74?.*9~L{f_2LG`aAyT`s.J1c9ѼG5,J_KF9߸%@z-7 W[KINͱiKNSJq 7e^R{3f{x)7򚗉O;FGC0֎qbUGy<+ 8>!N #ɶJA?k z{6 "G}sԯL:9$]`n}1IK>8-3Eh݀.Mpr,^L+8<bHxTQPmA7D?&P)^p $Q<]zKX3|m(1,0i KvV;]OM\{&ϖJ7hN"ui_H|ED RI^I)ޕ$kFI'3 Z 1|{Qh 52A뺰+;?:GźVQ/$p?%#\a6&~r_Ȼg'\V CUk90NUygfd%Ȯ27Pl UsIݷxw[ WDNB; :c߬Bu]vuY΋&Gzx"Sgˇ(^*A'rU %$֙5_D(R ?zˍ+oKI`<Z}A.+Mv+/ :7!x>,& j!];pݗvItkۈ wF6H-tJh+G1k/:&+ous7<{{zyRiaqw 'e k*|,y)Tv+5HOSan1B4\K{f[}?o-e {u/%.ˢLY(f}7g@;,0w yFڣ5N&ppШí".?&X;A:^J7J>A$Mtr)w NZmc/ٯB$kks7yCa"0r]'Z_ c:z!&GSDŽ@S[ |ݎd=)i!tV; L5]ߟڔa^d;>.n۵M&M>Ŭj$ I[u A]PJ&d DqZJ:6EгҪyɐ&)*J u޿NJUPsI;93xI|" c (twhlB"yiM:b}5kIπՎñ,^85=Հ]!e4&8傭n+|֬tW]̗Y#27'=},ViW]:hM.ιI[1OSꁇpso/3"ٞ#LzUld-'+f6bכ8DSsy k#i$6 !}uO)#~]d)( . A"f(fʠ٥,8$opQ/?)#l0q^KgҾ;RSۼHv#u."im`q}.WB . ׈mPۄe|? Nr1lol- vvxA?ʹN'G92IJ0n;r;2mA(ꚏ]i}:rgl֦Tr/ ^z715aQ:Znx(U6f;D!C^ӱi2:I|tC>*yRMFh"[阨AB՗.$rĵu,5uė^F0,|o$="1@Y|%*3V~?cQQ|F{6(59# ܦ/K=+B4e3@!#vb:𙬇?7oIJ 6[J)yC%]GZ9]7{fB_R y6xۃN'#Yv#Bf@|5xw 2em1.I1y@T>?8EMU8A P3&{3 .v*Fo_ׇl@Ͽ!!w"vyX-Q+{FߖcQݰkev#3hdKڛ#$sv W>͂Hcf7a<&H55^yK~+Eddx84պ7u)Ve-c겶BWQHW=^2E =Y LldJ[*FK%pSʭ &O# *,kYČɟdKMTYmROL[8mWKbm܆+8@B6u]"hvEH3rξw }^ /͠{Ѵn8X~?\?<J=1)cgs$&&>)ЕKcDoO_6Q3˥&Sx-&OiufnԢ=XX"F9u2V/_wNČ^ek0( 5 Pbu5ǐC\/=xSDxUD1݄{ԃѸ zLW=!SuBtcR}<bt#Z"PY탘k~q4@\ς%,z%z(`a˵ۇ;r«+(aVČo*+?{uu+D+x|HԒD9@8>Q U(Ȃ3FoE37'(Y-k4x޺̮iS4yߔD⵿[µ (*!$O8am̨ =Xfc Jѓ?yV3gDe6a J'Sb\2I@-l/<HKgfeY.$ VLSbF°pܠ9wj\`A{utP^t4F1S'HzD6IϿl?e|-'v/6q kȭ8"ƒvpbń 5 Tj)~@(u6)&ϫis1!s)ݣaO)|Ա0 9oͯksa ]:;-DnsE蹏 4aY#[)jq+l߀j` |wf3ږNtŽVqspØc uzPNrXlJFg?wM!--_,y2ɲpΨGy+xo痂w3ggC)v]= aɢye CL0yLe3B1,H,1es_>"E 92 6wɌ0 awd;xs%=!xj58 kbc#T=AT z4xʹ#Ǫe\@dzj8Fu#&$.@|OG to|J[p*\i4\IZ3XoSS?"F͈U  s~=J}C1tnkG!7T.mM7B%k M& %9^CpL1Oeڶ齃Ԏ̾CJ8ֻecYPGěN4*e6D"iy֙'W4Pe~<}#MpAPvUE*Ic ,%SDH X 'ɿ)nwԻK3G$^!!ʿɺdn ׯ-G`RV4?Ee*EwBy.~'o.HrwA ߠ9ֶ6uRh8%y(\yv$3Nm ھ_Oo_R>Ukbec MEgvyǦtGZ[XP6Y[y2bQ{=CtrC3)3#rw…$\#S4=QMκ;@ lYZy25N#v~/L.Υ?Lk]⺏`tI"TJ񠁖4k mŸV[q[Cf`r#/!. vM$*am9%O@@N*O:_5Nn@ h_@*/(]WZܱ 6󷵹.|zpE"" @i]E| JԵBU/% fh F_4z }+vW *`oרPoD~|\vMġ<҅Cѣ_)#)檒wuŜĵ~bVϼ!(Y G%cl;k^9IylpLESƁqAH嵼-t2P%Q& ;ܸ0h-y\ Me)CW5]$8"hԡmxYƜ'nq}*tRс,-u '2aVY 7+q^pjT] xckxE[g·6ұV( :`6~M$ ldb*/ψ>x^s* (aD%ZڲHV5*dАdk[lЋKYw21u\!/o#0͚ !tc$@|-rE=vԤKJ ^WV%9}_̓>u;,& ׂ-ŲrL]k}uy EVuz5r e'р]Kg䨻ySى.7VCȝe=nLrA#{͙M8CSHEE.C@ZLB4'Fm4pApW;^G'z0wI4b#|t 颧݉zEn/gZSGw}PSSKu'U\5uа^]Z1B} 5Cd/kwsX jiE ]nƎ'^ܻz+EB K/W2o᫙=* `!".(@F2{;$\RUAbۈo.Y%~*ȞlX&e3lU5A^Mx1*|?ȃ^Ļ Σ$<P{םgbk( ,n,E<<[zs$xvH-[篜d6U20cnV"3e P]XsiwMr@9S1RhہtDe4īf+> +BnKZh9 Ǵ+)Z_ḣM|rS0PGV|eJh{}JVBg n !`ЯZk $^"]5\ k<8b|KuY gE^ࡪo/QdE,R 8By'OL [ \ #p >Y>;%(Y{ɂDM?'H)l)oԲ\!UU @vw6ܜ~rrͧ/_מz!g ݩܥ$URuMOt;P7]eP~.|S{?ڭQ@F@-)`tA4 3w)ױIY/E^z%%p»ɭ%"o ]R B?]ML5k320oj5e2lK.H[W ܈ucc_rJ0@cJ?LbnNy͕^|aUJ3;t_|gPaץ dɒ3Gd$D$I3IDrHNC$+<4a[[kڮuosn=T'8o]mTVuKb]|%ĈLJmЦcj?]buz_A_çC=&:ZgFkn)W-wk\gv0(>""dr\[쓥r;жT/b7Ș9Dvs)}؋f)"hJUȤmoTْez@ 3)#:Vf2 <S/)WAlJPz9dGf~uuw~W|XZuL'd`Dǽyߺ/s!I_zi¡QnØ뭴f@2Gc@Ƹ=4~AlW*5vDOPj+WϓDW캇 _ma,^cO+lsQqs<rBVYV2HovP@S+%^pK W<,1=G;cB7f͐)o +Ȉ~R_RJST6&xBeeȕP#*,eI?&fn:xVPku PeS Y*KY$ɕzvx=NY1OH"ڸۮ.!B'ü>Rr=>XwVI$ˈe`:O_`(a#pcv+7ߪĢ~UŶ<P4[esfo!#w7?-Ocr}LsmݼF poRRrB*o« ˻UrQ-W=`Zl]4ZaXIƯpj7׿5̞Ԭa08%u EA߀vw7X&$@'^WH1wr%NAp]-Z 1wbWcv4z\ö)OY/'c|?Ӊkc4v(#_mrXIg9#;;|LR9D`n[*ε香[#ۉL'30t> ږ5En?uO7}:Ǥ_v q3CbOo*%MM;d7tVMLDlD J`Bud1> %gT}SN9&(pjSG~aQgwX0e~#nhcH>`+aǼv)I]0 ѠʔJfκ3g ]a!݀Ktb6I͎ZʊUgtx80 1YG=y -uk1JֽNMc_FAX8|`&`0V5dgzF8~I C޿1E3j UQtW״MQ`p;~Y={ANXn6(" I}Bٝԟ$Őv@pm*ݮKǿmNMձUQݼş U${^30Glh):^x oֺ_)W8HۜCɫɭ"s-NL'`e̥ԔHGvNKT\|%\6bɫ_}%dĒ?O?UV- ߡg;ґ?*lv{8u_&61HoN!0T2fCHup{"wyi"lw|n/ $z$a^`@p4j*$_Ur>C릌s%tM+?9:"RPf%m[ o.R'qKgj%XdBi&1-.hϻSw[HZ G*?~hV@Q}X,>4@R YAv(~*1;6kBN'x^+O`kUCi[jc"1ǀ(L5FV=O;?(zTmv xo Enp$ĚS~5M0vrg(Gå~o65yg'p}ץ!rC[M+QY`No܍gZtgf|R22Hչ[IjP)I\7o^2kS01u\]*.Ԩ^#O&nV[8%h램51 hwZX1^]@wz7)hlԋBdI&un<Ҿ4n =F  3ۺAU2Egd5}mO8J y_۝ɧd4֦,>L@"^%X<ȁ,ג:kHS cߨp}n̈-%vZ TtIEf~Fn6klFme'C:>߅@l:k34F{kd?k _vB YR\#W-%ΓHd :K@XNp'mE8?xBnjTv'F/ޥE|.¡R(` <089|HBş0d t}ߞA:#Oc3e*7z2O]Yk0뱞Ao6]2?)3gW⿊O.JXݱуÙrOI=ƪƞm _h&jKC/hk[{ռؽi6FI8$a|y.`.܄ɞ(wȀ_mӈD3aʀ!}|ߐh4QCS?Ǐ",j~}w,nǹ:MlȲW zUC^XWhW/ZBC:y ~u`7?!x2cѿ}Z? x? x\Q}cv꼛z;GK!:QiGPՈ]*i1㸊O.lޝM"d5uc5N\m_VVޤ+6}5.6+bhs.k6ϊsIVlUܗCoj9K<\\e$B}ͷ zO 4uQxp.γ.77he#6~GܺkPy2q0iΑߟS@'7>,gR佌.) TWU۰.xxhn}acdXF,D~_%8vaM~H/;}Wb5J6BtP'-O5K653~8eN9aUzԳ\&u96~(a܄uųwǣLh{<k䮡80PZz(+ bJ4wdUR|6`)nrF7n/x4"ҿ͎b=AM =/IBґniHsR`zT}K"7WYbA V~8ꭅpssabk>U<ǐ 5/N0HA#\y2c7 ?Y'Ԙ.tp9Fu3+V;TvVw040zP$sLG8$D<^ |gj<{Rva-d}UDt-aBBOV(W/MeLyWǼdDV)˯~uӑ @/ VD܋? jcS Slf]6oOQXݤ>Rcо R3jЛɪ$pNlY/p@8vupk`$Qdpʨ2@ؚ6#YI ;#HCؼv -7ڌH|'"l373ʌv(Ћfq&zjtH-XU:Mhs!޾nwtyU3XFOR)nH.u&QLCYB[gꟉV> /CLu]+Ԅy@C@B{1 {Cǯ@L>ڇbM9*Ā.^G%=gM;1dQ~a:TiԞ3cB u)ɰ(9CuD'W *d 0<7b5;C̕+`@FBT xJCO9J,9du+V*g2]IK`I52Kw Y[#z?[z\䳶{)yl'ux u*CBR]WK>Kao*L!< d䦉l`4qa)?]R]#?(wwt nƄROS_ɍ[O8(]> ;&wf,K뮸˰6ڬjK8D3+0t`*ܵ]^]0,1aNnt0mw$owG^<pJJP^yHLnK((قA;{5PT> N$sD%n c})V_>bs~V6$ѮDBUm>|Ovب$$ )]С}Er*NJ S&d:,`-ŁʚrE(}4ʉʾ8<)B%{1Km> Ɵkvg7\{f"WoD8L?]5u铹iO[jTl )VZFjH]*V%UI}(F޵]zT$ia#(MGRUo TBGKCC(SLHeJq^nBq{zp< Rz rHĖWP'$#'$7~QS Hhl(?T]&T>~ :saEt*)q#h{[Obn/3V&Mx "}?;kRiXZ;vDUmKYÞcLw`nژuᜭ3O Ǹ~QCR4F7eW5!u(/gҙ?[-K\ѢĊSݏ>ƍTe&뛘Wu翭#OgP.8&χn~`!%zի<Ɇn)C Nvǖeyc+،I)/w'ԶÕz|PUDiIwX*ߗiS6&]g:8;C*v#ꥴ+ēmBqbE誳7RƁwj#O$TOLQS0م'%:?JkEAfKNΔŐ_(ē.5(`.П(Ƶxty%<##U<۬1)s6k*hZ]:'&P5n] ~=K!.H)!Ƅ`5@*-{t_ō L<@;%&wtxRY=$09L2ΖΨm#A7 Y}U轀>'@@+ W PqM\eŠ9̊+/Gd/ hF 4^CF9:9j)YrmK}*Ÿ/Uu0Z L62=7`,b dM1]pȇ_ 3?4ڱR,McM~/*{6"J_58:3Ob Q,.U:i3<~IWǻOZؒ˨z~⾞H)F%njtqOv }nw M9~h~+,Ca0I)cRBE,yG Et-v9+GQ.$`X> {NKݣ]ޗadtAL#ͺcNB!u Yﱿ-y4#Ίym4k XoY]I8h` U>.S`xz^GTHkET,6VNM5!_`qT j q LZmֿw&;ھz`fC+']AY~)1,jѝHaOFL X [hI4IeJ F|vO}e\ hF#(̌vBbтد歁0X:`(&(j})x\n5t]S.gfPG"d~K 91z?)*i7P[Vk; #DGMWySB2GmN?F+IzPbJKl>j9)5+*U}o*Opɉq,vE|a%(vB9bcͅV u up2kNtvO*,"J@R8㷵2Phe{+=JKKFA,IT|Dcf~a` Kȓ/KntĶT7Kz<$S%;U O&1ʊ>edј;oFo+bPgpw,"f)ukVo"uƞE')oh'$K ^cڣB8Dn_Zn8YƨWxC":ӯRjӳsq .5P)QUaCQQg10WQf/u@e>iOCfG> lHVFٜlì)^[oH伡ve|0QXQ{DXoMauw+buvŒT Mp?FFٴ7aYW=<ߢ-D{e >MoM#LfwOW Tm'\ Kk ;ʤJaK?;T#875!gG:5R-ou_^Y27p6ˤyŌ?&"ں:8jK擲Tj^xò ͥ'JG:ztp"3j噥ː UBsHQqqqwFC߶v!%XE|FxΦ c#6CE+}'<;#mv28̔VZɍL>P8?g,礤؜7o`j!_-K?M8I7I1?d94+qͶArd刽75rʌ1B![U){؈\;JZ:::*!? Kk2/ +94zz[`I] կcًd'Oz?o}95VKEj>2,oB8=P=xOy^QZ/fٮBLLR3Բ}]*]!~qscQ#f AK[Et@A=]^m)1:a{]w EߌF#|^}cqFXZ=lG7QIH*оƮK1~~n 6 _P_ R eNfY@{ %ʿwe>\aVo,Dۮ'˜D\|dT7ǘ}(NsY5( !p7˖ ֽNN% VyAH'_99K1vt,Bÿrd5:'jePiph',52z혶8}$Ŧя/{`)[UUʐ{Ϸg7U3rF߳)ى^i]E?6bȎI<)q2زmֻݝ4D>hh#Y~: 9vg}E͉?A/DV  XT\r yu _V]"7s ;!Q{{UBnY޹k gs'1}9je^7ֲ*>dҍǥx~%{k!\z`mhҊ"dž7"x 8MedfK aJ5wi SkYax]2*)v' kzcb/LY+j6膁YQȱ[>)?lƆTHxL{QGZDk7UVgݗVTZ?4K9E/XҨh|{eI_7$TsPh:o_0K&]]vdbUt++s3USm5׶Fjdn~s_1γqppEQ')$,Q (ˆi>uZǏγ5[)[= )(ssuܛKD>oj{1D/Ss}S5q4s~g/`lu+˧{^6G,i'-i]A tg2觬[dž`2 f 8C'K3BABG%0ä[F\.GvCkgvhRU)_°+M2 ُ{&Wy?OveOs$ Uu6M4ޑζmDQ-lF%dDۿN}GUu-wc$dDIDt>/`1-%}mGlJB0> ^غ/},ilBtg>ܰ-եRTTL(F!1>0s%e &Hq=62J_/?= ij *3ñ)*)F*QRk6biG%A9S$fX%d9_1=}~~MӨ.gÕWԖijjEUUGd&hO xcYr ضЮn5yY-8hqgQ"KA )ngd2:}qm(** {vr@ ^T\*a|[LƦhllT*OrBa.¢JJ+hnie)EAt ݜp1LC?LL@uLà~uI2ɘ<ͬ$xC> a\~"b8B)~LaldP)U!y~ m٘Kw#:Ff,6BJ#Vyqw29>xcܶ3oxmZ;{t!$/$||z\ &}EJkTR!LuW- b, : 2S)_"1Hi "eEeUFOmy*+ʹ;z}9,DQ@$;w"?}׋`9|H "DC}p{A b구X\.`ʐ!( ]e$YFAQfzjIo315rad jċ%*aigYT! Qydmc@r(i YAb ~#(>wKW؇w]HQɘ:$-~Z].Edftxb$I??@" Z܃07< ˰us]z^y U,ϛ}*FJG8cmYB0RLfC(~m"xiůIbIzu)&FGXbܸҲ2 X90՟e͚<3<#l޼e˖! hhhmG<2 3[~磹e)KB?qAAv!gS%ehpczbtx-N_b8cW_z H$ImYؖ =/U  9 k+WQYlF`|1fL!?O#(G[$w5AD'_dNDQ(H|;q#S=Trl-DM@m$EF,r&;2Lu 3=UT҆V WAHOѳS92V.)"WЃ `eX)}ѝl$O <l ذ5Ŷmt]wJ&e@}}=۷o瞣oH$rVZh@?w Oa! ʊ).`N\CE2yg!H 6c25tz58O~_QLc^8L;Zs_aжe  èAjk9l?')FBGTԠWKdE<\aGN2lv:o!";w3;3 C3#yn*"U0Of`CT$G~.ਥ-8ⷄ rv@UJCzlQ[alNHK٭fH O!H0UZ, eTċ4QY<GϏ ۼkΤȢh nYF,̋DGdA@ֳavl_Ѐ_Bt~f" QȆ^dmhڂ? بa dY8$(\̕ 6.(d4 ^|- 薉e YBeA杗Aahp^BJhh/\*]_1F+0tĐ\qEs!)j,-1;0AztN҂ 2@M<T_Dz,((/ N?HJdth6ŨV+WWxhS4e30ܹ W؋Q K3>%avoZ (*+mߎeY3Ƌ"xAôR;K%,lc@$0hdEA^ofc;S Ns|ƪ6.F,?hjeNN(11>!6\ƕهsK@t V*Q8SF=RӳdRg1V(?ϖ ۶ .m`Z{sV_ ;TBd޿}V̆{$k>a쑲٧ fy™?{o,__jSH"6HY.07!| WOsl]$J$f+"%Sz7)<7jKr`_uW>:L=Upf@?&2d\[8}$ ![6o Ssls H+.V[ ec0("")]'kNEp䍴a6"= tӄQ]̚BL LCllE(FFrvӵ ¢3tQ0LlA8vLf۶Av!HAPHGGG"Ow~}7gL¶37l1, 3V "o5 'ټ8-4DǺ,hk k7QVe˖>lV*`h(Ɇ El>':I@{)h4ņ?f,x'[' N"6 s2Y9surlKYQal,M:mr `6W_]OqUJkk 33y6^L[[4d *^|! \(qEDbwҿ>DAf n|`án~Vg _O *yZ2*nT<ٳ{" .| ֥Fәk3 7*^$dD<13 Lu 3}p/^BnT0d"[Q.x 3mIqIrhq{(<''[œrځMw.hDD\xQSs=GA/`^N6.1kl" (2 [͆?R]n|<<cؿ Ix}yHˍ p+c[25+UvK6xo5P'$ Ȳ+vKIJlOUU@6=g)hWѨ|7Xo~s]]StwO ["!3  o=7C$ QtUG ߃ “Ol^_A_Am"$SEE_qQGG 5dS#JM-KqXApIApm8~DUF zL&ECQ{zJՕe&;sռs cڙSHhHoF>3Wlf!|Ql"ͦ 5wc&ʙ71(XOX#B^671N/߳ǥ?TFZfR`e% 3oWLt\EvuI"PmD)z'&XW_Oױcn28=uuxT7!pu}=aa4 \.ۋWUY]YL:MKi)==TD"gpjƢ"QߵYmocl=}}4T\̳K$/Ҥ;0GUUn7l%<ىOU `-Wt2,A[Z[qUdw{gӔonFT%<&|$T0(eyai67d>U=^dƧg8 EqHx7nՋahG~^@c@~^fӊ[ēOY MWqc7G'Z\FL&]+>,+T71 ek&)Ti ش;'hl #biV V To n>\sM Ѩu 1M_{4%I2w/y 瓾C5L*e {oyy m|244ihHpp U]CMrZ&/,JS&$0un Ɨ'qMyfcyx~^գ൝C|rc+Z (w5=`,f"3tŭcmKOy-˨nًO#)28y m;ϐW>b,҈Ll,HjQE\d?y[~t'5M>là]nb {Fcn l5L!K2}pK7Wa}A[K1;IC =_ϡnؖ~"CtˈL'#%?0bAVݵ|ڷx&*|opMCCNL֝({*NLݻ*(`kGLD2઺:ǙNG7MK{.(Kki)pƍ'U802Be$1TU^*%vz'&\dtY.^EaX 6=Wiժ#"1Q 7pѝ ~ʰQm{#-CI 1#388}w0ucS=b˖ql 3LT&N*cn׋Ԗ* w _eb㣼ғ\nm 12#L% ^m/l!&e;,\o/6yTTpUWrܓQB`B!ee4j{OH1` i46(/BǢ><{!qDoCt,J$*\s'}:7sG8}srC ?XIQO6#VBq_۩x 3{faap~66jE_Mt]5B67 y^Z2B=k)\]hM~z5f7Q|YXxJT|H[)k,""vѰs-x_ܡa- |Ք\]=_ۯ ̌蒱4(m @ۧ7Q|MCVmtz]XyY_T;V'4ohx;Wu">$؎>aVue74c;X\BX +**xd\0xQg2f2HaYI\Cmq=]̾A<7+V ^U wvk֔4tDEnjm営6-ccxnLb:֥KY܌"I[ϬZUTG"|~z:Nk5kׇ[Q+L_,FMAe|+Y[]́8%BQ}%?qSIϬ$PA {Y_VMM,F-%$MafLZ﹆["*IZ"0Mn]LӠo'/z 4FܪI)~G8uVeljK#U12M<> eԷH4SXTJiE CǎNxLɤSYou2_s߅9~\u/q||aDZ'ҸO-#{rv탆E&ˍd\hΓY0lb3Ϛ 8KqOxݚgɻEo( ݱ90v}M #aNK31S|33DUsk r0C ٠[̌0S:fFG2#"^=$3yN1{W %=NWGrx afҸy@ǖWzy15:WE mj*bN<FZ:>Kj|[3)\Y1:ػ:6irmCOGu~>XAi(D}4JsI ]ݔBĒIRiY3?u4u>K969G0]LR$0LbYm3m\RBE$2д1 fL%Twxhv߽|n7i `Z M}pӲ dvکpdߣ/.ct|e!Ct~ZWDzlUl}X|Ӣ(OMȫ?`:lDQ&/h|W)iBeTŅGU}\vDA<@_K*ncDOA$N#I2KZV2<0S&6U$㳤 &Ɔ),.hQ+/pm sZ㿏9ztÇؽ{$+h.6 G>HG022{Ls!])vgOÍ8MF@EOCG>At\mQUsNX3}cIJ5CCضM8|xGHM1}p@u>0MtJk]`U%\?u6,H.O4UjwRZJ~+g Ac%EW9=cS5&=Rq?[] C֑HPvC %Ed&H7>FjxJ$$R(Q@޾Pc1'e#KaWBdJK3gn-<^S'EJMdy$ Uk-_lhIQ^W74xDY6֢2cc^n7g&& [G$mww:pʕ494KaAϯ_O4c0 EE zuTUQA rQ|啔B项u4Li#wETeDO~[Grhk(Z[+]Iۗ-"d WU2wM(?DzMBBJX߲3<ǒ6B" J.n"ZEZ3)n y3^#=!BjKZyl\v+Lu,/@1V_h}GM".0cд eU  03e 1M@5B8bϞ ^|q~ b$ ,  L2ɯeR 'in(['4MSWG(0/DBCD\.dRDzlzzfuB"}Ocg{a:=}iko c6=L LOȲ, elpJˠk6% 3KTոBL`d4Aw,B!7MbY6m bi 2i'e2c?(C痱zi, ]D_Ý#5c籱PУjy5QDyu厂XXDWba\D#@y`SzU#b6¢m,<,, *1 $yoaZR/VO0Mj hbS m?V@YJ?6v<-el\D(b}CFFmacWLb*KKmXSCcI&lY#t<eyLB&4\^lB[ }U6?DMm:n$%if|!j\E*z~a,"3br9Uv2gLg'?c(9glsw| uV6 dsԥS6(D?mNmfS6׭S졁/Kd'.W]cpq|!N24WֲR)9s]wIs NҚKo\:ygNvdL4, #T_<Nnͬ>rb_u~ۘg۶E8t Ӊ@ b0ofѝu*m;iiYm[Ic:m9M2h$ Jn2ELE`*la0,YVi& ^08`p0AI<6l("06>1(n&__0=GDBTT).18@׭3/@h_̆~=NYʷQI0_f 'y|Jk]N9e3X jnPA_?#396u$5=GHQ_ǚEx(6t3m`F8~DErvJo6b$5̴cD~7$ȫ+H)82ssn:腤9}?i^}|+S셤y޵{~LsΜ, lr<öO3sQ A{'xab `:񸎦YȲȱc p$^}xTtݢk;lj2Y @&c2<"6E ==TUPA|*r4>ıc dY4-24cci$I 28rdPo΃g xoR<%QEIE-J,Y%XJc5q<;iugfii;L8;eK$J"L \{I[@bx}q(gYg~zb2Lt\6gxiNұal'?kp5<[bKͦR )M$ӊR1$լ\%O,=XL\z癞arY^e/Fh&Hl^90¾CcK>Z)*Uc' /@|Mt熮] umjj1-Lncv:ݷn$L~sMxECXյ gt+#Q>p/fv]g]۹8}?k;wvЋmkoo5I>dZCtҒ3= Ů]/ZFWrH_gǎVʐNۤ<˗gh dlD.cǎvWٲ%ƍ9R$4qc tq݀B;W˝j[ma+Ivݕ)Д׼חϋ;\uC!,VoL2[ z]TFkH8r)YVuz]M캦>dž59|>Bcxu.Oy6PZck(fm }EBϤ]["X:||ڷsaךn<6{#>jꎨ h6)z&sX7=o;24={X;&QOtUʪK҂Yit̯Okً]~ӪjmhҺl9z "z}k" b/WyueH-<_iA{;FG]޻LTh=Cf&+() _^:0vפr˲oZnXC km,V"^k{.65(Rp})g]"#N6 Xy4yt)rR:jϪyM(y{(F$+Sc{b[cwY}Liw &XEڟ:3\d<s[C9qAMi=-@-T\6|fK7{=UIV.uQ4ajzWwuK:z"ɞi]\kə;h)pYwB47rH}U (VL~V9unסǜx?]L^*<̝٫C n4~pkT^o2EZn}GpޔФ$#]@]aoN~O;Y]Ι2M^d٨LkƊi{˥FV% ?`n‹@6L堯!uiӾQ隟)eK(chB{Əi_Ĩr~g`[G^F|^Hb/ss8}tZ:V<>B2-'5_qj c5n|:-x!*J^g=hc-WeEr^5Qu঱bJ;64vxV{6&,)n*nz'8^ )KΗXcW2E ZFX<{ cڲswo醁aeh <*ta5j=Y|cvjӱ#OG7jZwDWvSDz]Aȩ 2F(yYjX3\QMmn@Fb^C[-y#%d !-"OF#DP;ucB՟ʦ|2Kk:HPc_TQM0i΂+H`?"Ƭ:,do^_'mx߫[ӝ ͣlyVkfXn w5x\=g8Vvf{'‡lj~2b`Mfyyd|i|a 68e㈩Y-ZT Npr%c,ע^GoKZͿIoI^e]<)mw\Νa|wW/op3rn|Va,kGMS̗܈?Ve-Fȇ һ3!.am|W؛T|dlQp+Dy%YM:c&=#J/grۭclnܱC%Oz]&K]yRv6Jd\y$ G_oOrٟneaͳ)~km=eߣڋ'5m>f[R{?Lw{3Ry=5Nϐ ]au5"{B7Z]?{u-zWY%W||SUV_[>hZ%ʟ6?{ni%Œvv!9[/.pPsu퇷jDCUGk%E꺧əq| "rz~/ r_}2Tʺܨ]BKHnĊoRcBwO0GbƞлzUE:GgU*;.,sôTl>(9ű+uە~Y˖qKsc|H`y:|)j#,R#,fk%3qiܳs_  wT|rIXޱ9V .mj\!V4"٪"=GsIQCj9=o72qq#bؾBۂ:v6|Ѽa^F.a;[s9۬m6_85I,$7-YMGg+9.!Vik=x㉈O~m xEyG\dodE=o{|4֫k5b̈H 0:>l+/Qwoi)F6;4#jeΤs\j$a.ʶj |37\z%Ѣ&OM3̣eltX#f޴9j5c5}^'e4oSźTgK$);2) rKKWq/z*K,{_d![5XGu߽2ɅYWV~N@ؗoev M?_u =LtQ@KtEztPta>2PQZCk<;ʜg'ν?eZJZ挄~ 煯Oq?k_JK'1>5z>4MڿuiIB3V5Y'3+v=*pej9SR'9/wȺ0aˢäOPjk:`bֻzG\8rjLEMOE]v8/)lfuʫ]'rDYuF Sg}Pl~S@%{kh"$\!6k9҉ݏw 5/x-[9qZIuWYgwNkHU` n3}i&?4'Jk_ǵΑ{?e7,LK/3w_1Vy|tGɅm7E*Qzzʵ^2GM_!s?\>|t_UAu/:vkB#[_I5;yѴQ@:||K>XlOR|SzT W7;wUinxzn\\hι5,Kn޸+eQIeWob^;6:ְ>7hu_Də |a_ov6X040-])W7O -y{P Kj^O"jS./>ؗ:ڒ3XgIzѱ v:vu\ ~7w-tcԵ|sVkyY<)}w'VlvW0XkWUZGs`7#vwޝ)9f.+=GE5q}3~N}}kyrJn@r͈sn OVoR:<^ą!6|wG: mThZg}e=hcֵs>ۖ ԡ[2a偋F 76tiܚ!`(5PsQb[Ǽ8-T'fd!܉l}G+>rTŲ#]K;rWnrSYq`.ś-N}]һCf3u n:1 w5,sb^  ϑ wy^c\9şcGv]#gZ=)=i雏}+6ؗ$'3"ߚó"bmۦuѪ_\ǟ|)Ѳ3]([\|j -N4V[,|{9mW}G]4rG@OPS>iRNۻ@A(y1LZln o%O\zÚ$Ff3-gBj+ `lvt :^KO w^|"4\_궛tTj8+~vkZN['M@&/Mg%RçgL3  N|#uLTdB|h4i3WկM-)s!~a 'KWٗn=k ^XI۽f!mj/o.6{Ѭ;%q#mmC(wrix#0mϟa~*2V_iެ;|*s?99Nn;j ~{]ΑOVeoV[M-n I̅FaӅLk'̛O1oROyArJ-e6 n+q۽k>?y~BHd3EV*_z'/?,+4K6F8Tfݴ9nu1yLWmn.ȿ#Yd^(] z15xyvכ\v^d$#cRTʎ=w7,|}~ъqs⧯=Z4oPsP,OzE3.T -AONѝuś'L yva J1ۻȊ9"qOq&>SV_'aKJ>OƧ5?*79t<5A̡2̟~=-q5!~+-v'FVh[I+}Q6@eCMruғ}lXnL=&:H{7Y0Gg {.c~)pWohTrHAgT"ąxs%>&N50gKlPjo߶t ۱cvX[ ;*®2 x* K Zm)RmFJOT SkqhK@kϪjYq쪮"H;GV9[*yJ +* 'q)Mg3 ho%=M#&#=Rw1GD|ІĺJUM!@2gfX.| 'RrMNk`JG?M`oII8_D~VD6s Q*G=B[|M :ߖhob['bhߙ^}a@\7[N{m]*}f₩̆]g*IP1,wV]C-{E֭eMvoF۱oD1Gl9&v/gÓ?|hx 11'pfߦBL0=)WL&6X9Tg%_*aQVRC/Db]DtjtN"NNGID'xc%:JWl($"T5 ap2"~b'Zdظ_H~$N9uYNj 8RAkrȩ#: bހ,,wVÇdݿ9.7֬ο>`=7>= =r]=+%uPBP^ءק,w1wУ ?߉ǀS}N9T__~&4r/p~?K Qo-ʆ_jV|bEV6i+FyL ML[O#2wY-$t̹,absBgo/=mM`m[ ߴ/[=e`G֕P*DD&lz6M7KPdz6k]dV/k;][k CۚD}0u~)CCSWb2-߾`aH;V~JP"˿t:4ÅkcG`H:`kzm bioZbɲH6h5qFC9b?QѭVvd\ deވF4(k bDSWAV`ې-6F[x+O_zaMך,"6,ڢmEේ<?*:Y~[1#,^Ҏ}Hòi [,#Nacm#8:ilr/x?18x6<ΐ~wQ;DL#qot\+#Kk!(H*{X 0 CD1U t99S "{XX}MG|Me43>#8;7 ޖ k- FY yxZdB†&k8pl?\Dw·)ɚSCa}5Πę8%>NsS<8/%>G֓( R(є%.LPc(qQJ\KS($J\%)ɔJ\JOĥ)qJ\ħS J\WgR(ٿ~dW?J\WR(S/R(qUJ\_LSK(q J\_J/ĵ(唸6%CR+(q=J|%%OP(Ք!%nDSk(qJ|-%_ORf9%nA[RVJܚHP(q[J|3%nGSJܑJ;QΔ %JQ6J܃ķSƿeĽ)qJ|'%wS(=^J<ă)J|%?@?kFф("f%EHLB&/&$o%! aB]q{HHf0!ḎñKE<Y\I=!D5Jȑ>BjFH(J#4ҺF&i1[H#v;h(F.ӈ9O7q\J#42#vӈzJMNIܝD'&t l:N'أC'7& 9 G:QtRL'6dQl,&ntbNɻtbN4pm܉: "//1HD c3d9AzjٵA mDz ,tc%;=A`C RpAdq D)A^f2{ u AJy cL($Ә$u0LҾIudĮfLb1g:aI3Hltc] ~$| $IBcP&9QsIr!ڎ2ɄcL2.D2I6@JrQ'HD,I&A%&$r@#q߃J1e*@XWVt}0 yYLyˏ`>t$ƔaewegXLIk[0ag-tt={ۦcF05' L-%L-pL{db:l$9S[%vS{2S[ #Fv'P܍ԕ}F3utV6vQbOc{g?Xov&y=<|'d&Ŭyv/~YÚgG_`ͳK%{0a+{/bͳK=˚g5?5. fOY}?X"k]r yv/0n5Oa:d<^58: 5"ײ{ ƛ$,-x;BB`4BAX߁OGz:7"a: C4Bf( Ơ|_*Ig!x`2C tW< =ٽAݐa<16X ֢|`7B(q+P /Zױaaq0a.J0|! )8 "$C*A!B%T+x bJ@ VXY ,?mƼU5Hg 1`{ ur!kSAƉ< 0wbHBXa x CW`ࡁ34 |0l6`8} P0!AxsNaT]49l `k 3yHTHLȂ{B7 X/(C=qqk;.x42Y2x_ꔎLBea> PpǾ@m\C}AsW 6ov.,#pq[fJ3pP W)k 5Ȭj^W~EuG YH4ȅ"(j-4GhoƹxAD  ʰ` hŠCWq i7 nC!ǹ>i9~1(81"\TH Ȇ(8g8@ߋ>;t'ug. CnU\K#GF6=B4#L#a%(Qѡ;Y4 Β4u2^G4X$W ! r!n]({B%⏣"0V"qN ISϠE#O^ ^F ܓi6$F2%}sOhdo>]BymF: F&gU8ѾՈCW ɋ' o`K: }}CB1܃ [`sBTex O`;MXZِߣpZ:B7b|%;<fVP c?8dH;;03(@4C|][:` /3H77(㭜:5E>Y &G2?^Ҍ(jdQ ry ʍcq 3pm7qFOAAc*4([ r 26A1B@#|OuKYAb+Ȁ}JCok!Km A>ZաU k5І |`9Bjct Yc Ў8kPAcQ ͰX,w} m| #62#8& 63N8ބc ipn8&3<,Ula+x4a%;7n'`3M teYaЇdLގz@xw`y ЛPЗrЛu= 4Vb( Eq ;Üo`%A?Bð0@ E;tpJapB.| v5h О0 nC=L8 #,gsbNB0OR0PPm 07} tԁq18 Xv0&!Z,ťH/PXq+P 5(+R@'nvM6<t&tQm"۟y NMXLEytdAX\UdB a$b`/EfdA L&#$ EvAKxc5v$)p#Jzb-~GcGɘ8c>*za:Bp Odc5 ~CXH{ Q0kmH6c"A]a=N" r "x*ίռ8s.`vn`N9I3boN4FOma"x+s8*m\ 'C;8n7m,ah{}gxDNFús㉂?/bŷX(؏'zzbP4}٘3m=C-qs 1&3 ~9.q /&G+ D06./A6Ee@O|,_xGQzPQ1AX8p7q)"% !0#D CD~TFT8#I? 3 ~8L~U\ 9eQ0?`<~)xJD}F( EmPE0؀ :_n+ wPKNz]ڇho1C0q1Nc0pQ> *`) W|hԀK[!2jc"&a. n!! Thh 6\ < 4f_PpgP }`\u|5$<@s`a*ab4!7bR6g# PGK>C~To 8(UXl͜tHDoLC6i1["nm[3D |ɘ ؈]pg?) 1۰ 7ԍ8ci;pޣJ:.:2vd"?#q7Ba|˹BTAU<,OgQ A[(ׅ01pRҠ*jcc&a~/#cHpxAyT@!w3$F$CiTvA$θFsrCl[;nxb6bbF34Gk,\eFlY >C/ %T}((M،8+ 2cc,N< xyA* (T:Xm0؉;%Ưރ=$2f 1ɸQz!ʠ2&b&nwC9)`fc* c̠`5N~c8t(hh阋-#rSE4DGtB cc VBq qG2j%Bq^A1 (ڏv ؈FsmH 菡(<e1 #3t]tzAqyX9!)sDo>?4>#DQQ1q(>E)Tb,*N|G[Cg dqE!7f`&9^{*BTF4Gc v<@i|`,>9ȎNqYf00`9s9ic[0nzqOÿ2ߐl~eZ1,qeO"?fH"'O'چbS|u5tq}\- Fx2,˹}ѝEb\~e_m,8Oׯg*q#r=zc{:cX _W9농qzU yL*sHu O~K=sjn^˳G9v$w"Zy6ye)\\ Iexe>t9>1ӷ#yyyկ+\Wu}Wڣc]~~nc's}jx8xJwZ>X4"._)x*D(Xr%p5+~w>*oʻ^Uu6,#^svRړP)mܗҩc c}۹V_-cu#z ya:'1R z f.y\CYV?G}2wAQ^+*\/ue4em3".~ID~{wƛ}8}fSuƴq"U˻5Ƕ.(cq^yYiO^8_2#Qk{n7^nTie&}u_,z;Nվ)ξWQ-cO7;]/qo_N\Sj=j,^hϻ*c"(w6{{wЦuWx#JXi6{픖#m^9ϼj2k!5e|mlr6}kcu}_8K3t4/d_:uN:s^!IzYOq,xQ/S?X1z.Pao]GuzY8º~i᯻?y:Gڐ%:;".eʻGySukY6]kmV^+r{Lm}=ʹRq_a?O+:}fQPQj,󺞀mp.:{Q$8^}[Q_smQ,z,I(F7_1'.AGx|l,YPsf\v|oC(W,ΦR=/o^G;\_:+?opy[042^Mo?qh,%q\'+l\'+"|*G2~t.0_֥Zf]֥z]m+ݦkbդune=pmCC9Η&x㾨 ZQVFgetχr}[B/ʨ\QljZh~2/ˬ>ee\}c̛~\u*gj;eGW׵]^QU/{Kryܾ|uV3{P?r_[.ra ƒ_?>|#u#yEgx#}J۬g6\GqwҶ\ϛw/fg(Ϥs_ֶkO\ڟamqa\yX\p_~FO]nzl`>#=:y~N:Y}zN]4rz>.,ְ#\L粧\ި~7$yRJöKyxzX= a{e=ʫ:ua{^aٲ/3Q/qr܆s#|jvwi^~/)]~kE|ޣuTNH3Ge?#Ϻ8" _9ZZB#aGe=66;H_oY.;ι45VZC\9syxq^QW]l8u5u]'km޺z7cTκٝuiu1rg]wκVmmWv7}bzw}}κZǝqa]׵sM>\lwxvX׈yg;뾏71rg]c&wκv]mZ>Fs޹κﻯܹvrg}e{\gw>uN_[^Gʿ%;q`gZ?(ǿx'oG;}ڹk[םS64,]GG}ʝ1l-Q}o!je;uX;msn3V/u=\x`b{ٮUoDu×~Ǫ>3c{ui;}e w}/N_9F{];qq糼;uugv>76;=sv-;͝uݙYםqhg];ti;Yם}ußӜay@!# ^)Ĵ9BBYBkBgB\Z!$p8S!Fr\sC pCb06!O߫br{/aDa@DĪ8Wmj M,51'HGi"MTÈ)~51l&Jl5x&!qM,ķh껧5Q&c.ŋTc]LMtQ?.VaXS $EҺxXY_g]@nuq. i=7TSPg. p]zl OtE EqtD vb7>rEA/]e3uq kO:9뢢aKwQ(!t:CZFCCx~ Q!z1l/Od+C(?I}WA"kR2 Nh=V2]F766gRuy3s%e7Xgqۙ3o);:kd1lVs+e9XgRZgǔ,r8,%#eW2Xg3xRu9K e*Zg>7gr=쐒%2uQ>ORcw3S1؜%۝S\ۜHيCV%K-e[g=,8m 5g饬"2k؜eauœe3m9Dү+Y6):d9Yl9sSʊ_RuCJYb%Lʺm)+ eXgBRv:uXɊHYÜ֙o.sVL敲Ҕ1g%lmElQ%sVJzx{3;Qü^)P:;[ۜMY):dQgb*KYyYU$JV]/0g5c:[dl&lՑJVWrn>SR 왒5[JH~f]P&RVauVMɚJYY2%k.e#Ȫ)YK;ld|b%PRV:uw[gNRz:KuĜuϱ%*e~*Y7~)+9&eZgybQ )>: RR6nuvAJ٬q%'󋬳Ul|nnΌl F2gӤn쀒͐{{^f^-{}֪lw=,챒R6u9Mϛ3/):ΜyKYY{%!eͶXg3_)y:[}МŔ2-:;d{XYő+Y<)W:W֜%[RDRVuvHɒH:˨dIX6r]L]o`s\ownOsns e+Yg[,;lTRu3Ԝ2aYf->,VR6uu1gHYuYy%&e[g,=k =grJYYs[ʒ޴v(Y^):[dIY3aRv-u?9+$eSZg5i2gŤl^),MsVBVU2g{X5;Qü^)P:;[ۜMY):dQgb*KYyYU$JV]/0g5c:[dl&lՑJVWrn>SR 왒5[JH~f]P&RVauVMɚJYY2%k.e#Ȫ)YK;ld|b%PRV:uw[gNRz:KuĜuϱ%*e~*Y7)eCɺKY欧<$6gߜ 2ߘaRvu!М!Y% S %-eYgl͚iWq<:+؜M\e-^m&6nΦHYl.s6M3sv@fHٽ="< /D7#| ?D2d'/P *rQldn(fPT3^5 ,Fa8,4/Bv@v؁ؾ k4A|28!F!Z!| 6!n[DQxƣ,.l|!%b:#B!~MTJI34V$MCqFlG'*)؋),(JKx@B@y>H~FSP$=,'dOp<)0pr1S}A\BM .x*,DB*z::"G-*ӧU{ qҏЪ yQ f@@ DO "G nONNDs lc9Vb5`/ <~%\<F&@a|5qbh"#h>&; O?&!?Ebi\l Ŏx8H< 4 ib>$Jnq\eHj"&b*f&2`aD4CTȆC8@ ǚȌ(M2M˿Qq3&`lfLAEQ]GFMx#&A^c8(cD.G]$/I{KqP&a%6b;2 Q, b,D|bGmL,®!~Q|Um>}XʚXTsuJ;0ɫi"-2c,~@@u4dLD1~Eך/`=~|؉=8}8wO06c 3c +}ɸȌ<۸DZF$@nA",:3fb. +8dFVI\oހ0 WX؀Hq3ۘ1hxMxgX5ùfͩ В4B[1!5ҵc.ij8A,mGM'(Љ /-s:@Κ .=2g2q&B1÷w9>}x/]˜Տ^{?* Dh8u!$A?bHM A ?Xg&>e?X} ԳD2/ 5y92Nzlɹ=c!|9cng-.ж51Ib-m ;%`_\<`"CLC=|XYOW n~h?G\A]쥋t3. *2>E!@O ??]$B:i?۹0.&Et b&׹p>ES=JEt@'fdcVava7'i9\E\5M]<3Ȥ OxBE7C P Hh8LDLTL B0b``)c%Vc a6a3b;v"qpGq ?$N#,.2~U\︅ȚYP/ mDy9C>u> qPuX_,R%ar\cVQ#*9=W6E@M]Bj9a< ֥<1nӏi{P-1U>|6D7Ll,WlƯ9?16E&BM q ڍ4( R1ZnA6ȋbV1Y">CA>TBhQ=V:zŮ 靨]3&TG(JU}q260~=gx@4F3N W$AW` /M0;7f(ub`3@a 4@O,%pw<c V)a];%)]zMk3b3#qqaf6E8:02)Fa>Clx*:G4c%N409M11f8/NNbc؉nyM1 ҧsx[b>Kg-?D 7E8*k2E\2{6f+Kb38 ׳m0q8 WYֈGHex3Ectv\Er( h ;y1ڣ;n OyS,f`vhY _ lulB|h.#UStFj 5~G}{dy(LdG? B_t j|C8Lu+TGDbf`v,\*h8*x #0w]!p^y* za,|l>6"CSdţx %0#kٚaE1Gi8|+}PZ#&c  8sO3S<!TL7؃ϣ  a&[wՂ}@)Ƴ舮Y'q ghKzhwAdBUBXe88Ok/E18Lma H$\DHY1G7b<&`:vbJ|E;E"N\7hO%;Pb>%\-tux|`'=1Za`6`!;@~EΦxO8ʠ1Z;zqgp AnA7S &'F[{xD+P50SƵRٝc|:x ]* =9&xQU[)T@FRd{98Q 1O|cHy͹f}Lbc+A tB7 PDa#GI41 1b/. nx?ZhDF $@1؋0r#4ASR|oGC4COBD#<;,`.(K/!; {` !? UlfDnX YE1:FԈތ^q'pG06J *#QHq\@\j(L?[pIFq$L O7~C"/( qk 8O[>^8S1gw8RY3ʣ"03N,WC1؍8;C9TA$qNk8d!AQ.3c 6K@)'C9TBtB @b0؋8Ӹ*sn%ZgdfȆ x= kPp*(>uX-pM]Q%0Qm:ya+\4g3c>` bj,J1(FhZ Qp7Qh6見jx0ϱ QrXCm4rcr|}Qv.U 1(n !1؀/pqM,'p瞉,(J?jXȸs_p-nEXOs3:a &b> F /c"&!?ᡏO*=@c,"_±F1D}E;tg9<舮؄?"5/uoQc?a<&$#cyPM1q?!&a:N .r%~I9Ȅ"x UQ Q/jE}4@;GG}F'sf B]Zt2'e3<A}}Y(Kz{dfJu+ Yf99Y(ed«Bf=̐d.IdT_&I4˟.M- Rd%M-K]^2g} Y=C)sP$~f|ؚ<íe.1!4ӭ4r]Sf.fLg(enf$si2;o LD:LfLRaY3۽&^;UmRʞ^ͪz5[S3GH3C$[,$hٮrO&ܯԲuNO{JOKun:ksRW8ytŦ%K/>{Rg^ޣz_ҽgu( uώv'ɄF]rfe 8FK5p>3YaF#9 LkܹR̐d\R; ymhՕO&y43R*4as*^`,kext $טv~MWy+n d^kxxts3^I1:gq0]'uz/؏GuS}6I:,ΒYi,6,w34z>py]P; [7ʜ:ߙ=4>̐d.άRl#kf_xm@&$yjmO2%$;;0! {3mgg]0zN+|fB.-{s̶ |#!\\YseL,;f,YljYS=u뜞S=u뜞NP[ u[tz:=zoah[|¥T{:: Oesrszs],GH3C$[c.̙\e! Idne{V)˒ LŶ'^A\!BG]0z#mr]<.^,C!͌;rOdϛ i%%M-K^]0Й adnJ{ř?CB&{#!\~J!"dPg:ك0ݺg9E.3zTř?3PnJkw>{Ogtωc.uqO/ԟn]02g.\Գrm>Ynf$st_t낑EH2g̢Z%6 d<ڛZvkͬϚk,&Ku<3eǓdڎ'.kON㥸YpI'ϴ/GGH3Ϟi>?cfͨ g1ԩ~FWm|f֚Y+D}S|#zfܩk%R %-LIAeu6 e(=e!\-LIn,n|CifH2$sK2Seݳ2~K{ʄLhdkH,GH3C$[~S}&%M-K]̙32\n_I9^\W\lԲuNnm v<?Ьe;d"DWr"ޱiV2˵bŦ%sz:=VO{(۟$uogs9gx3pOgs9zogs7њidUtedk<(8bKMQ댳b){1}Ft^m.(}"f/{19_NfAdAt1=q\Y{~b>_c|:Y\gf̘3o21Q^Gfd)3b1E(Ad|A]L6FuI]Ksu_ <+ʻJʷuoZKO{u~Ȣ9a6VCu΄>E?q0i}V/V/V/V/V/V/V/V/V/V/V/V/V/V/V/V/V/V/V/V/V/V/V/V/V/V/V/V/V/V/V/V/V/V/V/V/V/V/V/V/V/V/V/V/V/bbbbbbbbbbbbbbbbbb/{?^^K$D~Z'=>\R3YȠ.Q}FukI%rL5ʘ·|YD* fHSg_A]T!2 ss$%#H|" 0XAa£B" 3O(RT 6"I<"YpuHQY$=zU)TMuD::tFz"N"n@wC 710Kppa F": ?ȌȎGATCM[tEx01K+ qgq pнHf}sPm!R5[sJDDB:0.N![G N"/P ƺ{F >%2CϾ/vك>q?⌽9Y=++R1\#D@o(4Nd*Rog$ɘ؉γ<cVa b2" PhHq]'b]G|~A߅qܭ/iVqVLZ#G|-gc8#p3nHY ly+;wvQD}"9ʨ wd/ QQ]c$K 5ǹ'EJ`EK]t,Jln~9\\m%" y?! ȁȃ"(2(ꘃX ؈ NWxȏyG'%`&fa`!B+9?^#Kwc_+r3"qIH;4JȹM\D!*$"HV.K-ȬHot͢HgEFKVEC S1 1%*Zl6^q8 _WlίGdF)TFTEu@MԆ3! Z5ڢ=o~HXxb&c afa6" !XP,Ü\( 1?SL1<İR4W}Ř|"󱊊䪤U9 w*gPM9XCu5YO2i4f L|,Fn\F8@oR" r# [r۰4uS':̅cbwS_E '@;{wC@a\AEHG1h>v9"86;ث@BI]F)̛J_(5MɖNXH"+Pk5kH;UۥU<ĵ݊<^EeO`/Nsg߳xz;#/p7/Rwq{u؉]؃}؏WtD |q_ic}(8pHTDeTdA MEV`%DstG-Fۊ,E(3'arݡ-=p*XPǾ#}Ea,*a?`mu<=D'xׇte³?zn~DhpI? ؅O9{ 9<|ƘpA+?g? ^ʠ%w"9w>ҽ*_4JTUٌȪ3QSW \J"U|2i ِP= IU4*\Lj@ELFBϫJ< ϯJT~,zMAUB-zvQ3cQUa*Э*ݑ8UX%T|%Uɏ8TSeWe TPe *2kc>Tܐ*i*Ь*!qbngHP}Z1uTɌΪķ.<0*XdWUJ}UxCUJF< D&3:lڔ=D$#a "s`> kKN4FRe ֜;B*qѬ*sOqU%*:PgډpYT9hԝA;UIJJJS6jsFkG;~'RUq< Uf/U?q7UݬJm Ts'9<,wkTx*.HdU [xCg+y*-J65yIl_Wi2>&- h iҨ0"FbC|%øF7d3gM&hu7M $uפ8hrIj&=5p鯉/ d!62~Ѥ"j C=؋xqCY&[G/Mzcz¾AMF ;GODȈ#495Ih1؁F2&&a:2b a4ZCl6\A1ԇBW1A8}&eP ؃cxxFut`lE6y!$Mf-ZMt}&55@\-|=0s؇4ɋ|hTlieP%.QS]M:]tƾLde.'1K]~Ee'5ʡK8*psR,.sR(u e^]F}%M. x B8%)Kv8؅x89:ev .0а8H]}vXTq1k gqO( /b.T'C.D)Ag G06Oߠ50 Q-bAVdCvC~@u8c  Oϑ,ʡFc p?4]uɂ8L~C@R b" (R5`P)8㸅۸@u8&a01A83H&h9\}cQ1؈DMxwxbn&µ)zc0.fpwL!DU8;b1r-xfP˰[Rxx6xfeZsg4@` b.(î.i#?  :lC o-AU\k;A`\C8PR(Ju ȀZpEgtA/ /ca0gp 1B]4$aa/~y܀y"3 “9!1(97d@F|؁C0 7t@wz|:wq1|g؄m8w3] k z17!?Jb0|q ax!<(r _flN\ 8S(83FYx 1q7H2PpA [Oj&%fDDqBoGټ_P!Xs3Hw|h8 1XygGF"* za$F!۱Wpz>'AE14G;xqP5 ˱v Zi n؎8󸆊pC-OA  //̐0ḃhWp Z(gDp@NE9{%Iߵ5nYԏ2+2+l💩P$&ﺖL2u~_3v]_^xJfZۮ7VQd{T-HY_Bu&S~ [_bu&RV~[T/xv~ ?~_ru&K>=ٮ7۷ $NdWdvV̌T&>]g癭;wyHd6/Ϝ358%{N.1wL.fu)MΗ|/ҙ/2'e6yjKuM]mf4fnuyM]ȌɺB~{8{瞽.b.hLGufFc]mf4fIuf3گʘ|]h &*ٮ3%^fFwJޑu*3Z_Uu*3Z_uu*3Z_ u*3Z_u#39fu.&Ꙭb=_d]uufFc0Y=v]јmEyv]јGmEyv]YL1wdPųOu&LenLfu]YQaYNIXX:T@EBJ@Bi AAB$D lD$~'={|u3ӭYv, ךkc}W/ x8:e:_]cg }:nNվy_xWk] R+z ip,u!Kz^zW/Lev=~|zˉ^>z,8޳#mF{*>z\ˆ+Vb^q+DL޽RыtJc^W,s#<»Wի>z\Wջ|zpGwdpj"GW}zuGnW$w|zQk>zM\8k,Y{e<;sDPc[22,u-B|pOZakvhW-.sEd6^{Wzut: ^G}z]6w}zz=덭>z}\pGErxz7ջs|"*eI9H˃2G7<7A!>)&,y詾ƻ%E3޽pW/z){o%RLݫw^*4:sN\xT_sT_sx\͒ɵf^3%fQ}uMS5W=\5z zEp~ulDy* c K_=o\$qc(^u< -8<( yKf#9Ϝ_oo y|O9dcm-2˿x٢M729+>Ou]~2iY9>g ]s|ϣ[fYW/^5g/㳗泗᳗峗㳗糗+W+䣧 *cM}Ou<6Iy_X~sioR> 2KU֬clegܚ˶4}|[.dwg~;>rgoR ZS8^x{mRyKfc,n}ŭYvCvSNj]ۚ^ZgߚE}6ٕu}3Fx YkX24kG_kDx=ᵷrǚdRWy΂bUOsVsP0 z=k} kH5~nkH5~nk}kH5X3 fyךKEW}'>z^{d^3,{zok ߝE1p9<FztFźz}uin?#+运=,1K,1K,1E3f^:h.7加,!sl_{AQE wq_)~vcMg/w'}~wg/N>{AW9V|\)Ã܎md6ߟ~_ΘbO js~#+ea~6$݊,I>xKf#/K#]@H" rnJq$nE>n[-b#[1{+>묺T =෹'3w2|w^x]; fc(Ү^=,rX,>{A٫/o,1˔Ug/>{A zo^{}[jVg/'#1K,1KY ,1E>|W.巋 )ϯ"|gq)tSeYJ{nRꞱL7Kg,RF3f)tTPeY*{2,U=cnꞱL7KuuXg,RK3ftܭtWeY{2,=cn&ꞱL7K3uXg,r3fitD+{Q2,=cnꞱL7KGuX%F3fttSeYz{2,=cn>ꞱL7K_uXg,2P3ft QeYTeY{2,=cnꞱL7HuX%V3fyT3ftWeY&{2,=cn)ꞱL7TuXeg,2C3ft<tQeY{2, =cnEꞱL7buXeg,g,ͲB3fYtReYWeY֪{2,=cn ꞱL7ˋꞱL7fuXeg,g,g,g,Ͳ]3f٩tReYv{2,{=cn}ꞱL7~uXuX堺g,g,g,rX3f9m4fX3fT3f\3f9tWeYN{2,ߨ{2,=cnꞱL7YuX;uX强g,g,rQ3fY3ft\QeY{2,=cn)4ꞱL7t{2,ꞱL7KruX%g,͒Z3fItWeY2{2,ꞱL7KuX%g,͒C3fɥtQeY{2,=cnBꞱL7KuXg,RB3f)tD{2,e=cnrꞱL7KuXg,RE3ftTWeYj{2,=cn:ꞱL7ꞱL7K}uXg,H3fit4SeYZ{2,{2,=cnhuXg,^3ftĨ{2,]=cnnꞱL7KuXg,G3ftWeY{2,=cn!ꞱL7˃ꞱL7PuXeg,2Bd!fT+0!Bο ſ % STeJ^jXFSZ\D`Dz zgIIdb"D"2,"ݳr.D֣Wv|9D3XKqn@$'\@$SAwЫH"b{EH"cD/lHlZIN";iȽGE~_ =1.pSy]8_ے9-y>%Oe$kK䙒*g*,aI㺖ؒ[Y%:[r%[Ra%o XKfL$l%I[rp%_&KNn]gIAaKF~aɨӖ$;oI,%[#̖Vl -EJqy[T垻m-C[^ϖCl:ÖKsmzږ]mʖ l lK۽C;f#'my-/2.M@EQ> Hyu@w H9`@v I< Mg9s. GHbLlHΎC9̑1ߑW82f#00tB :+;z'z7>E? <ba#QG1c1&`"&a2qLt<K cVy X ۰;ob7`/m%7838=~E_p q*~uSHȆ\ȃ(HTFm4=h苁1A<1`$Fc b<,3X2 | pG$r8*6@¸ݒ1kf75S5fHg 0s wqǙl+>chHyb56dd>%R _mI"/^װjC7 0T2ŴBntnIel}[Kz:úg-uΒ;K:D,#{#?[R%q%y~eM J{Vee˂$KeK[&+EmIUĖEmym[–ZږaemTVae[.ޝUY-eo [ִ%{-[6vm[Jձ0kˡzn^eF<ؖMlܖ[ؒ-IZfE۲-=q6lۑٜ*1bKn)YO1)o}X j_#Ԗ컃3Cؿ1+M6 l-)~cN72dy|ck~<s ko8ΡR̀5 yMWOjR'a Oa5=|4v,fL H2dj@O HO#lF@N"ju@~! +7-ȻӀ,亰rt|'~ёF\\\;;#82#NsG^ǑюnHu<ё0#bf1Zvq#tww$eOGaQ߯K}בshϑ8ߑ3iz?שA<2WI#+PGsdpG=H\C9qG9:֑L%2GRu}H z̑ &q|)쩎̚ƺO82i##fȏ#mrGClFyZp#):p#iԑ )#[y#G~^%ZH՜]Ƶ<#1fw$݈7q܆[{(t4l<9yXExK b%jzlFlKxUv-;xLJ88|9)|8A"paHdHHTHHȀL@fdAVdGDnE>@ABaAQC D)܁((򨀊*UQ qj&jnC}4@CD1)9Z%Z5 m:b]= caF!b1LDLbb,R,rxk/`c6ElflVW*^؆؉]؍=؋}xA!0(>s|cN)|88= ?\e\ pX$CR$Cr@JBjAZCzdD&D 3 +!;r 'r!"  J$JD4ʠ,ʡ<** DUTCu܅ZP &7юȃv8NkDRQP01_mP5Q u NN}N 㹴;qg])_ɋjn XMxdI킊*hx0Gq K G cc縂p !*Z51Ӱk=U\ȇ:AWtCr.pd"Qu!xC1{.G<_P%P M 1˰0#\F((zh~13cvbN "RG6@U4AC t,ƫ؆؉8gQm1 /bC[HD]tF7tGOX8~. /6cTL:\O|FF:lċ،8'={#9ADIl&lVH}0Ӱ g4#B(h؄L"8C!4DFqNA=GCx,rJ_qא+3E4As=X؎I|dYx<* =`:fbf7q)D4Bc4<,",vFX6f@rD l\+?2*rdAgt,Kxaedlȁ 0?q0?H}4l,)Y n/\GPe>U1k{bRsE_Ok'a8ӸYXawC$?zRp3nxS1ǃ >/L:kyXGHG[+cC"hYX5;8srWq\E㞇#('@fb1N_c637S|8KU<@ɇ'HFlVFB0qӉ/#8 oQd8Fc)B+Lt|<"4()$ i+S6;+R˅he?VnEsnEbCͫ#<xL-">8) &"r h\-HŠ4EQ-iI>Ep%)R mkqՋ ^E؇([:WYbU/c"`>ExWS$mzuEV35ixC؍pE?pPKHc5ToE\XHG./>q؇sRXA v:1 _J5`<6å1f%X `E*>nT |aWaX\;TdF87}\oJ)Zs q-xZז_JXZsn0|(چs0][:صS$7bf`+R >Ύg'A"C>FΊDc XUQqo(Ҧǃ7Ht,~HE6erM"(ΠjE|јMpP`4HwHGǾ6K=P -R/Q[\uU&'$E{t&:c@y['9}sSp1>P$Qhcd8T;a~|`"B( i!{pc; ߘ4x㞀ᘏ(1^ =Ajx&&DbdE:;fGc!.g i83gblQw6 qe^C\liT6Xu>pߣEV`.("|Ep 2 _X˸k_rTD.XA872&MG$NAb"vHxĽi;0o8s!QQX{xES}T)_\TeQU"Pc,)s UJlIT)4l V%^eTYhYVh˩r**|eUB0*\CTSe,Vc. U鏑x!5TϚ|UT>xr[/py}TpD _U1*0 ?UY8a#7|t R%3j3~' 5_Qe,^JNWtL=Q_XP|T4yS*KUUaSc*TX/R9*Pb8T%qZ(ن*Eq1=4xBJīS'U*Z[ݙXxE]Ujo2&b!JPU^#1fJuxվn=\~?}ClQ eUe9`_8xT- 妲c`JN.c%6:L,cUk3T7Qf&Fc;zCglWvU銞؎]sTi :W~{Wϣsu*}~_~a*Ng!1_Pf*c}@~؂<5E3LG4!N$f?Y&p=؉{/>seO޹@GJKұXKci,ai̙XKci,,We,iYً7,]E K2WSEC*%:AD *H t" )TZKvDD_h؛o$"MmI^ZBDv(¾*z7X:KW/Nw?HtX /oG%9^$| ?%^6*Q#%DJ_(.lQeKOYO~γDSOl6Wp)~6:K_'jޟJ"Y&8N_)EYS'{bMW#)E86ZQODNm"#B3 -@=CQO9@J0K'=:Q;^3d5[axcآ)&3ƪc>Ck ǘ1=GdKgwS7PMh(C: mҋ,GcW F*>>om͖ zz ffgO/u6ke/v gc-[ #„AK̰b,xbhy_br/Ql홯=f#smq|G: RqR3$+ABMhFM? qȬ3k1s6W MM$aDЙXlO"h92V2_\3_63g,QlA;}-Xɻ%WV9ɝZ%$[Y|TVPkܶyϔEO:dŝذ{y,2s>gx=yU71=VRVj1-[icJ( fJuFO َ̂לW=3 #ƫ,|5:n9v QRsl_Zv0>: GeːS3,6=[92[GL,=ן~U }֏\tgj-|9x3Eܙ!f|a)g\lo,԰3GQ؇E\ڸ]ek3s2>i ;)0$>SZh{ m#ļw#>˹AϸD WyOOAĄ-sPKK0%eM?yx)c#.m?He#Zmk|MLX;C[JJB lwRoZK5fm^˹SY?lbyJs]I,l#7:ٛ q#5jIAiKxd?a~(`e,.̭Aؼj\WyY#7lxp`km-(iE e6GFn\( V[ƒپ7[<藍{(|G}ζ})}־bov~;ۨˣ`#5G=텕zNSޒpaq6Vml-Zoll#vVb.6{7ml`,6W06 G/½$ǭRlÁ>N7K4Ew|LZ/F5bI}~߸2\;јH3xKV_zgSbgll%^>L_ iL)BfoDxx؋S|-3:3*!ﱟn%~>II>!-ѪPuv ,-VD ZG`mwP"'vȆ"QkHCE}Li "TdoلwCd.I7ԃ1(wR${9=~U/C,D;'E01" [E<q;V[**;PWO^H_tPd:zhE~@XEm"Q[#E64u"g)`.= Yjʢ+J" H⫆8VB`꠵lo&mۈ7}^ęg)=jIú"WQoP2K-clݮɟ ^_jKvhgvjr׿a& |i.n&U<  1;MaMb5,d/=5M_F ;Ʈ@,>}N~‚vsşk='3\ypC>; QQ(b((R(2(r( J*jZ7| ?#Bm:zhFF^Ec4AS4CshVh6hvhNx]MtG(z'z(apA_D QF bG1xCbR.0#!Fa4}񘀉S00cfb6fabcbc ,rJjZz|ϰ 9`+6lǗ؁5vbvc~AaQqIiY÷8  W3~*q q7)۸?/tBG8!ȃp!?Q(B("DQCq@IBiAYCyT@ETBeTAUTCu@MԂ_DmA]C}4@C4B0B* 5@K0i%xvvw?ĩ)|SZ|S@)@)W M,,'(`o9o\|M#3 MAx|S@)#3tÎY|s22TomoEoDf rkGr͛#Oy 75Q~c6flC-5=I^cg~DgLs`\JxQNTN*C0ى\ 9g)Tfg*A)iӌ|pÔs>|S:#3t9BPoJ29%1 ߔ ߔϑo"3< MCLu|ScoF`ovx|S~8|S>8cƃSZ`9gh9ŒorΖX ߔ ߔ ߔ(39&8 {ooJO%vnbF M F{pw@)u0`?[[8o"3o7;b M+77 Xm9e  MR䛲w26 ߔ7@)WÔs79Xd#sC5r57֮a툩lB;jZ׎v/A N9f˓+)Ӗ|OgQə̞gr6lerδVlkmf+>)Zo ߙ\}foc~4m9/kr1/%$䲾%&?ed䊩ljgS4H~1kB1 EYo1kr-<,dM֪g冩^s4-^Śy6WRORM[nMr5kr;/_&w2zrTB_g*;-se*=5yN%̲GZʾeқ!Ta(_=83ܷXK *rs jd8($"x-n=@v:%o!c 4!Nj@@Y؎/xCD!W(+QIK_:미2p՗"1xN-"a"^Dgԟҗe}驗b]__/!"J)}YZD˲"œ?//+TԟWҗe}YU_Vӗe }YS_җ^[_K_}/e@y-"S"Bd՗e}}@/m/!` GP0 iFd$(y0+ Nm@c { Q@1 N<1 x1j dqYb'7'7 }r〺ȣJ a=GG&I];OȰ ={Mȕ&gXxpI:\Eh3i\ M \=>odlpH=W+){&҅@}`?We7U>%gD] ,zF4k7(m`Qz?+ qy^Yy} miz'"\S~LTA :#1 pp|xL 5"6`#΃0c1 ١"0K ;x!?- HP|o+ xݐ)؈M8ROD b1s_w8{21[!5=lYuɘYXxub9V3=·,B*Z"0sq (U~ccehPm0Xୌ M -]=]?韎Ph)a/b/ϗi/b/\bwPrԉdpQK&xW !U}\z &;X>#ke;[V8mNd 2Z\?dʿ2ϔXk+U,ũSJ[+k{u). Vа·G V/KV"?Za닦PZdeefi^JjY1jajJ[\U/hk5t(cl5ukn̷VKR[iUnVޯΡ SgRx2]> ocr l}|fi͏=RxF6Xrke ںfX+ەű=:Z+ 뜫W'Wke[gٴ#ʴq؆ Z_1Y.}'VDtokeE wDAkeb*ޛZY.jì6`~V,r:hY>~o]33չR)"RZÏ^{QYzpҺ"m[&6ͤ|f|{s3l5L9qЛ)iLiB͸j-/͸}f.e5sэf.P3ܳYN3_Yͤ/L"Yʹ)B3mЌ~FODyR\#N6"N55էִWԞZj(Q5F5ZjP55ZjXPӉF$G-i*#LS>l* dcElafvGcaAh>@8TY ʗ8'C% }C}2T_P ؗ<'Cj̟/Ќ1S~/Ќ~Fg~Fg~Fgs6cY~ߌ~T 4c~/Ҍ~Pğ+Ɵ1'"茉Ș?>xF$DdLDDdLD'FwK>hD / / Ɯ? c?/|c}~/Ҍ~Fg~Fg>OQOQӌH0%K2~cLDDdLDDdߋ4c?~/q4r>hLDDLDT_O1@3Fػ*]T4W%q}DQE@eQ-M-ls)335R+LSzSl{[\ޖ>õ|YϜ̙3s#ٔ7GꦼW$Ih?`7LKQ7ԍvF uQuSݨnTlU?΍/S7ԍFM;uQuJݨ~귯ndS7Սǹ)>?uMݨYnT|U7nU76Ս FFu濺Qu_87Qn U7Սǹ~{FQuUݨnT8U7n^FuFQu]ݨnT|V7nzU7=#HʭTxZ-paqq-; =*V~ABTM1(IjYMKlw&ex8^'V:^b՘׭%tDޓn88rӭr+~ϸx@?w%j?n܍[U zba_nӸZwo8/mx%*X[89V4#;tP%f)KMٸ%j?w2x>1Jw%ZwhɆg[C{Gqzy+hlWtLćWpU;l\„)ĝ+w)PB_}o 1.!Cs14Ը.'Fe;ѱR$""8nCŒzq?W?8͸z$ۡI-Ak gge>`C)Kl:Ӹ=+Y%Ó׹sGq`S9эk\=r;JV XT7"-Su!4m! 31 s48v}xGq O/BaX]xuϘn܃ #,-/g)I`+G)?␉,E؍P gpbE'&~6L evu1i5܃UXGY6Y#%>>DYZEQ74KR,m87641K+ljffyse!ċx afD0KLf7,2.܍3V&^G6fx/b`YaF(N$f5L\G W?ܞ2`!}X,vG:w2K!CyƊ]2q)0u%Nx.a5bv`'ZvcBxѺY l380YF#gz0{,F>fٌ}hYbwƿ)>8p;\ďow x# 30 p;a1`)}˱bVc Q< x 4v<]؍^x : OQ8!>'4 |o| xd3 w'R؎؃)3~O-3X%3"tIEnF"p$RxdX%"]EY+4"m] zc9 PDa.a^7~}_U[]`I 03*pMJc b.*P%:@mLD }Uz -҉=54ϰJ:c5F4d:a>~| FLHnh0fbnLJ_lݸ;F 0}838YyXT|0QJӬRu |F,XCAB!3hSx LUa̲J*l6y|sOAʭ, i|siwq A<:E~%ugV 0l!uXDN;~ NʄNXXax_k|K=c#E"'>Dgh$b^x&OtE.P-؊8/qX$KHGf}V؍ϾF ^F?؏J>`x{&BvCxa&1X 'p;<6Sŗ { /ò;t5xWCƋ.\uȲ?Q8WzvY#Ι}:ks<^s^Mkbk9d>-R>iW۴]ZOWf˯`ڵ+ku߹6sk=j\:尃hֿs|eʇˇˇˇˇˇˇVLQ.kqڀl6ZyKЍ&y~fqs3Mn> 35kTmbH6ۏWwT[O!v%̨Ϳf< vŠ=pITi<`eeOz4KiN%4w*&L: i:7iWIZt>Y  ?R_Dde&fgg&g0V6샨 J2% WBdN-=.C-D&dgd%INNMHblސ% ggdWS, .t'-?GQ(?G:u]W[CeMjdLH7& @UM؈x >؅؃8x ka`|,\deOʎMz9TfR;vEaSK_O\* :57=Im?M0 ̨qGև&xJ{x-_ }"Mn҆b/fNiukdDgNk0%5r߆J&y%]82kke5X/tQJQ* ^%l nA 'Ib'2{hT&)*Lj <\U>Ɯ^N_2D@=RF+~U`IPi{ [;iY|R rPi! {Wi+eeb>4TJ{ *m@C$E䠶41@X5Bڐ'}a sJmCL}D.YSTڰ&l*SG%haV+ϩceJsA mX\~ 'T/ŵdk?#cTZ Y$BU,Iy/*UUB}.ܿ>*VO*%׾q2\][.im{:q/?4W?Yd!vҮ^B};1T9HV=bC,μ ̋tƩQiEs.Dg %%}>Xc3><֪RϫfqL(z"2y5z)^~?c ڲRRTDt媖HoO%V= ?cL)m^03tenukO8%fs*Qr4^ɍ+?o~TIca>SK Qz_8ccJ\HkxUӜlUPҋngf$^ 2N~J'PjU ubh(}I;x6O JF*AZ:,gg5=)ɵT6ז\MϭoòhPTK%FGUrk2JJvPNWRYuxecpvNЦӎ)WJ0S&E(%/] TzAF9NֵTj%ZڣqZgj O%f:Heqc^xEV`YJBUU Uۯ>گcNcqE쳚RO;ѯלZH'l{i_&B[>%C8%5n2QؿkK?j=A+叭hyԗn*=D Gi&Z@h%nq*^tuƲr̉z#9SA}eTWylsd'Gʓ\9uLf-'֎Lrks0޳۷SOU۹qeslov"ow{ԧ/g阀-~.hNEUi#'_ T/a_}jxpe LJny^zp;c~F#`T|qLϽžQJI|mD_J]a$kL'd}3+C+"OƓy6|*䮽GL%>f)vCJq8K\ ꍢcR FIoP\UQ;9.W.W?wlG eJwLӮ1-JuXt7o,ȵ]ft ㎑gS.KE3e_bB1U5#á;>@zkUM.cՒb,k3F4Uc9/gٟ97.lC\wS5wT~P,({#U::GI\{76Y+[wrӯp;C$}j` />Q9X, c!U]ORn.wxVKM<#\(ec;C[tF_k}.WED>kl%}~-Qwum}$E.g 뒷E.T׋gc\1ޫn(V^j"Nd}>E.@1MCTdZsdA,\(kbmO.QTJ+֮F:uMo'u_k~=A{?ewlk%3Q+{z߫C0#@"`b:):ekzz>kcI^ %ϢZx%J+cCk_+6/wG5VZ 1w2VdO*UIRdaf+v-o~>Wq#Z:T|u>Q2vތѮVe}ZI~SKF^~vΨҎeݹUTq|lGgdϐYZwON@dCZJ#;6sn\䜛dmӿN4~z{\z4yExmYأ8IYv~Π1\}2VO 8Vw[ާ[85O/kg7P!#~S쬝؋?(;ϘbwZO}tӵ@$o*5@Ҳf}_ .7Wq.r WFW [Y;҈c` ] TC~a쬝 ؋ {9-w8 -x湠~ J6TB@MOɦK9't͈d@uj=}o#kgz>8/ju ʳ!;wkf/j|+{@ 97Ԇ,4EN#EW[y'|_77v^z @̞yՑr8Rr/׷;-y%z <{ ?Y?7Gu5@h~+d&P  ybTPnn;W~2Y&a"Ky$乫#E])w6RHUͿgd}AyD7/#$/߃r{܊qͭ8J0{_!=d4aا$TS%Ȑ5g޾rNٺ)on TޒG;TUHVJ,GwO]K>c48~y_1:|@q9"bz ԃj?<[5E?*#^4\ HxYך} [֌l}ۻK@2Bܟ3r*ROD=GMc@ܹA9fq>?ϖxCeOb>P^ߞڿ ۓY}[f 7fx D\ʝE@ܒ{7Jr$~]ܯUr{ 2nnvqKrWr@~ܞ<Į:[iѾt `0w=f&On-^spw,Xp6u Ag{f/Ari@m'G˚nOA @s  ʝ6~[7Jtp(n);WRά#@}>p8z}C%x@Ώ0WY@(_O╴MN/ꀸs-(g~ 7t?@e̫/f/~F2֑mIzKԽ PKu@.izS@3&zuVz~I vFN>ȸY'r%qKڒGxmKi3~@Y-KZ@&xxڽ@fYup7DwE{gdwDuv ޴vXYJt{Kd7G{S$\n5{skg@<[sWUuh{U=}mdܬkZ᱔إc)P}qK@ +ix%z ʝqKU쎌+^n߶ځx%ό -[#=%^n/Z@y}I@zyFP9rGL{wgj}mjf=*m}e-[DDDlٲEDDDDs'zz~wf|{~ggIOi݇[>w3kVo#޴_r֛I՛ZzQ֝z$9 ~:4~vlfL:qT{fy<^3N>ܺZ՝e_87e_873EZ?,ugEZm8 yx!1ގ۱_dvKdXs'K 1MH-G|>^ך5mG#o戣8\߬I ڬqVoIAթѥ`5D,yrd|0<8,ϣ#S2}σ[Vs{wRo6=qZoFz3Җs+Ý+;m>9N>yY՝uqZoFˏqTof拴~xe}M[Gugɢ873Q= j>4^_i7N yqTot~jO d$^s1mGgf1+=re@ΌKuwpR##S=9gdpN`\qQ*Dϱ=86xR;O&_I#3vrP0CM5VÂqS|zҮ] V+ó)ݣnϬ^s*XoHAPhӂiYPp96|)n4llQ M&G&lFiGI1߿v?0MiA~0*yrG)oﯜ][g|A:e8yb_~a9&hKq ̠ޔ޴2A_SzZ/^&LҦDϥNF1_tKmv97otdViQෂm~kzˬq-=3b:Z5|7V}-15Vn%b>8_vjSg:6]DRGm!AA9ut c`K-~wCA6[wg5j~HZe9rhӦ6sKEg"8=bowl)Ѻr7D61zxϦygUs_5 G>"=!ߏ|MĶLq`g *Kۗm7=7:4leDH:K4Ƞ:9ub͠!kfV@]BE}x%ۗsS!:U2UUztRZԎ~_7O҈2R%IF͢n%6ӞuKGӅu1t3EoЗ~g'20râIe#9%-3ќF3Lbrtl*Ә fF`99mͳ9˼6.dAtbr (%\\\õ\縁eMݷCJn*>jQD=g-O$Ogx } K}Wīcoxw c Fu|V>SE|vKvD|N[vE}n~GDE^~WEy rBV$C^)BQQ)CYQ TBUQԤC]Q4 4 $LSRhFsZВV miG{:БNthЕnCwzp,=9^}9Gp"`0 'Ne91eD&1)LeәLN f13Y\\q3 \,.e%\\U\RZzn`7r7s ۸.>Vq? 0yGYcS/|e=O^~WDd!+Nr!/O R((N JRҔ,(O*RT*ըN jRԡ.O҈ӄDH))49-hI+Zӆ=H':s4]J7;=8G/zӇ ?8 b0CI dFr 2ќ2L`"2`&s͙,f.p.8\.br X. *f)p-q=7m NVrwsrxx<£1g-O$xY3<y6// xx7xͼۼû>#>f+)|kv ߲'~f/+"Yld'9En|)DaPb%)EiPrDePjT5EmPzԧ iDiB"I$ӔќiC[ўt9.tНKOC_џ@1! $q2Ie#9ShNc cx&0ILf Stf09YLpg3s8y.dq1 KYe,f sWrWk븞Xƍ­,6ngwp'+{US0E(J1S4e(K9ST2UJ5SԢ6uK=Ӏ4"4!$iJ hN ZҊִ-hO:҉MҍcN'DZ}@?3 30Nf8`$p*ia,&2La*Ә fr:g0ٜlr28\,".f!p),rJjr rs˸[d%wq7p/yyY#<qOx<ól9g#/"/2Wyy7[;{l}>C>c |+f'-~g  ]' YFvr\&yG~ PBE)FqJPR e)Gy*PJT UFujPZԦuG}АF$И&$D2MIiAKZњ6@G:љBWq 8zћ>xN dPNb'3TF0S8Q40qgd0iLg393ldgq6s9sy|.BpKE\bp9Wp%Wq5Kk빁eM-rnvVpw{X<<ìe 8ky'YS!1[Og|vKv_o]|~d?3{_~ɡd#;9I.r#?(H! S8%(I)JS<H%*ST:5I-jSԣ> hH#hLI"Ќ洠%hMҎt#t+8XzrMr<'Џ D2 a('1N*#)(Fsc83Lb2S43b6g28ùp! Y%\".c1K+\õ\2n&nne9q;+;Y]=}~AaVvcY<:i ϲx˼&^5^ d3o6.ﱅ'|6>s_|÷;g7?#{/>sHN,d%ANr<%)@A Q")AIJQ2@E*Q*TթAMjQ:ԥi@C@cH4%f4-iEkЖvDg ]1tғEoЗ9~g'2A fC9apRHNTF1X1 LdT1t`99eq> YE\B.RqY\\,:q#7q3p+˹YJn^cGx5< dO4ygse9/W|N[v߳=~e9@$O 'M (LR┠$(MRT"LRԠ&MR4!H1MH$dB3ӂ5mhK;Ӂt3GӅtӃcq7}@?3 30Nf8`$p*ia,&2La*Ә fr:g0ٜlr28\,".f!p),rJjr rs˸[d%wq7p/yyY#<qOx<ól9g#/"/2Wyy7[;{l}>C>c |+f'-~g  [' YFvr\&yG~ PBE)FqJPR e)Gy*PJT UFujPZԦuG}АF$И&$D2MIiAKZњ6@G:љBWq 8zћ>Nd PI dFr 2ќ2L`"2`&s͙,f.p.8\.br X. *f)p-q=7m NVrwsrxx<£1g-O$xY3<y6// xx7xͼۼû>#>f+)|kv ߲'~f/+"yld'9En|)DaPb%)EiPrDePjT5EmPzԧ iDiB"I$ӔќiC[ўt fǿ?D*E:E\(RڟJ8c,-+k$bݑ%`=]cQ'80:FSW<^K?>L {-[8!]PAf_MoRqx<5b@gv(h׏wFtעx #ǎ'gS\nldB`tE"Y"v iQrÿ3ݷes#=F 4~S*9rZSǎ7%Ӏ}|/շ>qj7Hn7PKr6[w," Mondrian 2.2.2 technical guide.docPKP,mondrian-3.11.0.1-R/doc/olap.html000066400000000000000000000136071261646570300163500ustar00rootroot00000000000000 Pentaho Analysis Services: Aggregate Tables
Mondrian and OLAP

Mondrian is an OLAP engine written in Java. It executes queries written in the MDX language, reading data from a relational database (RDBMS), and presents the results in a multidimensional format via a Java API. Let's go into what that means.

Online Analytical Processing

Online Analytical Processing (OLAP) means analysing large quantities of data in real-time. Unlike Online Transaction Processing (OLTP), where typical operations read and modify individual and small numbers of records, OLAP deals with data in bulk, and operations are generally read-only. The term 'online' implies that even though huge quantities of data are involved typically many millions of records, occupying several gigabytes the system must respond to queries fast enough to allow an interactive exploration of the data. As we shall see, that presents considerable technical challenges.

OLAP employs a technique called Multidimensional Analysis. Whereas a relational database stores all data in the form of rows and columns, a multidimensional dataset consists of axes and cells. Consider the dataset

Year 2000 2001 Growth
Product Dollar sales Unit sales Dollar sales Unit sales Dollar sales Unit sales
Total $7,073 2,693 $7,636 3,008 8% 12%
Books $2,753 824 $3,331 966 21% 17%
Fiction $1,341 424 $1,202 380 -10% -10%
Non-fiction $1,412 400 $2,129 586 51% 47%
Magazines $2,753 824 $2,426 766 -12% -7%
— Greetings cards $1,567 1,045 $1,879 1,276 20% 22%

The rows axis consists of the members 'All products', 'Books', 'Fiction', and so forth, and the columns axis consists of the cartesian product of the years '2000' and '2001', and the calculation 'Growth', and the measures 'Unit sales' and 'Dollar sales'. Each cell represents the sales of a product category in a particular year; for example, the dollar sales of Magazines in 2001 were $2,426.

This is a richer view of the data than would be presented by a relational database. The members of a multidimensional dataset are not always values from a relational column. 'Total', 'Books' and 'Fiction' are members at successive levels in a hierarchy, each of which is rolled up to the next. And even though it is alongside the years '2000' and '2001', 'Growth' is a calculated member, which introduces a formula for computing cells from other cells.

The dimensions used here products, time, and measures are just three of many dimensions by which the dataset can be categorized and filtered. The collection of dimensions, hierarchies and measures is called a cube.

Conclusion

I hope I have demonstrated that multidimensional is above all a way of presenting data. Although some multidimensional databases store the data in multidimensional format, I shall argue that it is simpler to store the data in relational format.



Author: Julian Hyde; last modified August 2006.
Version: $Id$ (log)
Copyright (C) 2002-2005 Julian Hyde
Copyright (C) 2005-2006 Pentaho


mondrian-3.11.0.1-R/doc/optimizing_performance.html000066400000000000000000000315651261646570300221720ustar00rootroot00000000000000 Pentaho Analysis Services: Optimizing Mondrian Performance
Optimizing Mondrian Performance

By Sherman Wood and Julian Hyde; last updated November, 2007.


Contents

  1. Introduction
  2. A generalized tuning process for Mondrian
  3. Recommendations for database tuning
  4. Aggregate Tables, Materialized Views and Mondrian
    1. Choosing aggregate tables
  5. Aggregate Generator (AggGen)
  6. Optimizing Calculations with the Expression Cache

Introduction 

As with any data warehouse project, dealing with volumes is always the make or break issue. Mondrian has its own issues, based on its architecture and goals of being cross platform. Here are some experiences and comments.

From the Mondrian developer's mailing list in February, 2005 - an example of unoptimized performance:

When Mondrian initializes and starts to process the first queries, it makes SQL calls to get member lists and determine cardinality, and then to load segments into the cache. When Mondrian is closed and restarted, it has to do that work again. This can be a significant chunk of time depending on the cube size. For example in one test an 8GB cube (55M row fact table) took 15 minutes (mostly doing a group by) before it returned results from its first query, and absent any caching on the database server would take another 15 minutes if you closed it and reopened the application. Now, this cube was just one month of data; imagine the time if there was 5 years worth.

Since this time, Mondrian has been extended to use aggregate tables and materialized views, which have a lot of performance benefits that address the above issue.

From Julian:

I'm surprised that people can run 10m+ row fact tables on Mondrian at all, without using aggregate tables or materialized views.

From Sherman:

Our largest site has a cube with currently ~6M facts on a single low end Linux box running our application with Mondrian and Postgres (not an ideal configuration), without aggregate tables, and gets sub second response times for the user interface (JPivot). This was achieved by tuning the database to support the queries being executed, modifying the OS configuration to best support Postgres execution (thanks Josh!) and adding as much RAM as possible.

A generalized tuning process for Mondrian 

The process for addressing performance of Mondrian is a combination of design, hardware, database and other configuration tuning. For really large cubes, the performance issues are driven more by the hardware, operating system and database tuning than anything Mondrian can do.

  • Have a reasonable physical design for requirements, such as a data warehouse and specific data marts
  • Architect the application effectively
    • Separate the environment where Mondrian is executing from the DBMS
    • If possible: separate UI processing from the environment where Mondrian is caching
  • Have adequate hardware for the DBMS
  • Tune the operating system for the DBMS
  • Add materialized views or aggregate tables to support specific MDX queries (see Aggregate Tables and AggGen below)
  • Tune the DBMS for the specific SQL queries being executed: that is, indexes on both the dimensions and fact table
  • Tune the Mondrian cache: the larger the better

Recommendations for database tuning 

As part of database tuning process, enable SQL tracing and tail the log file. Run some representative MDX queries and watch which SQL statements take a long time. Tune the database to fix those statements and rerun.

  • Indexes on primary and foreign keys
  • Consider enabling foreign keys
  • Ensure that columns are marked NOT NULL where possible
  • If a table has a compound primary key, experiment with indexing subsets of the columns with different leading edges. For example, for columns (a, b, c) create a unique index on (a, b, c) and non-unique indexes on (b, c) and (c, a). Oracle can use such indexes to speed up counts.
  • On Oracle, consider using bitmap indexes for low-cardinality columns. (Julian implemented the Oracle's bitmap index feature, and he's rather proud of them!)
  • On Oracle, Postgres and other DBMSs, analyze tables, otherwise the cost-based optimizers will not be used

Mondrian currently uses 'count(distinct ...)' queries to determine the cardinality of dimensions and levels as it starts, and for your measures that are counts, that is, aggregator="count". Indexes might speed up those queries -- although performance is likely to vary between databases, because optimizing count-distinct queries is a tricky problem.

Aggregate Tables, Materialized Views and Mondrian 

The best way to increase the performance of Mondrian is to build a set of aggregate (summary) tables that coexist with the base fact table. These aggregate tables contain pre-aggregated measures build from the fact table.

Some databases, particularly Oracle, can automatically create these aggregations through materialized views, which are tables created and synchronized from views. Otherwise, you will have to maintain the aggregation tables through your data warehouse load processes, usually by clearing them and rerunning aggregating INSERTs.

Aggregate tables are introduced in the Schema Guide, and described in more detail in their own document, Aggregate Tables.

Choosing aggregate tables 

It isn't easy to choose the right aggregate tables. For one thing, there are so many to choose from: even a modest cube with six dimensions each with three levels has 64 = 1296 possible aggregate tables! And aggregate tables interfere with each other. If you add a new aggregate table, Mondrian may use an existing aggregate table less frequently.

Missing aggregate tables may not even be the problem. Choosing aggregate tables is part of a wider performance tuning process, where finding the problem is more than half of the battle. The real cause may be a missing index on your fact table, your cache isn't large enough, or (if you're running Oracle) the fact that you forgot to compute statistics. (See recommendations, above.)

Performance tuning is an iterative process. The steps are something like this:

  1. Choose a few queries which are typical for those the end-users will be executing.
  2. Run your set of sample queries, and note how long they take. Now the cache has been primed, run the queries again: has performance improved?
  3. Is the performance good enough? If it is, stop tuning now! If your data set isn't very large, you probably don't need any aggregate tables.
  4. Decide which aggregate tables to create. If you turn on SQL tracing, looking at the GROUP BY clauses of the long-running SQL statements will be a big clue here.
  5. Register the aggregate tables in your catalog, create the tables in the database, populate the tables, and add indexes.
  6. Restart Mondrian, to flush the cache and re-read the schema, then go to step 2 to see if things have improved.

AggGen 

AggGen is a tool that generates SQL to support the creation and maintenance of aggregate tables, and would give a template for the creation of materialized views for databases that support those. Given an MDX query, the generated create/insert SQL is optimal for the given query. The generated SQL covers both the "lost" and "collapsed" dimensions. For usage, see the documentation for CmdRunner.

Optimizing Calculations with the Expression Cache 

Mondrian may have performance issues if your schema makes intensive use of calculations. Mondrian executes calculations very efficiently, so usually the time spent calculating expressions is insignificant compared to the time spent executing SQL, but if you have many layers of calculated members and sets, in particular set-oriented constructs like the Aggregate function, it is possible that many thousands of calculations will be required for each cell.

To see whether calculations are causing your performance problem, turn on SQL tracing and measure what proportion of the time is spent executing SQL. If SQL is less than 50% of the time, it is possible that excessive calculations are responsible for the rest. (If the result set is very large, and if you are using JPivot or XML/A, the cost of generating HTML or XML is also worth investigating.)

It caches cell values retrieved from the database, but it does not generally cache the results of calculations. (The sole case where mondrian caches expression results automatically is for the second argument of the Rank(<Member>, <Set>[, <Expression>]) function, since this function is typically evaluated many times for different members over the same set.)

Since calculations are very efficient, this is generally the best policy: it is better for mondrian to use the available memory to cache values retrieved from the database, which are much slower to re-create.

The expression cache only caches expression results for the duration of a single statement. The results are not available for other statements. The expression cache also takes into account the evaluation context, and the known dependencies of particular functions and operators. For example, the expression

Filter([Store].[City].Members, ([Store].CurrentMember.Parent, [Time].[1997].[Q1])) > 100)

depends on all dimensions besides [Store] and [Time], because the expression overrides the value of the [Store] and [Time] dimensions inherited from the context, but the implicit evaluation of a cell pulls in all other dimensions. If the expression result has been cached for the contexts ([Store].[USA], [Time].[1997].[Q2], [Gender].[M]), the cache knows that it will return the same value for ([Store].[USA].[CA], [Time].[1997].[Q3], [Gender].[M]); however, ([Store].[USA], [Time].[1997].[Q2], [Gender].[F]) will require a new cache value, because the dependent dimension [Gender] has a different value.

However, if your application is very calculation intensive, you can use the Cache(<Expression>) function to tell mondrian to store the results of the expression in the expression cache. The first time this function is called, it evaluates its argument and stores it in the expression cache; subsequent calls within the an equivalent context will retrieve the value from the cache. We recommend that you use this function sparingly. If you have cached a frequently evaluated expression, then it will not be necessary to cache sub-expressions or super-expressions; the sub-expressions will be evaluated less frequently, and the super-expressions will evaluate more quickly because their expensive argument has been cached.


Author: Sherman Wood & Julian Hyde; last updated November, 2007.
Version: $Id$ (log)
Copyright (C) 2005-2007 Pentaho and others


mondrian-3.11.0.1-R/doc/roadmap.html000066400000000000000000001203621261646570300170350ustar00rootroot00000000000000 Pentaho Analysis Services: Mondrian Roadmap
Mondrian Roadmap

Contents

  1. Introduction
    1. Purpose of this document
    2. Mondrian's goals
    3. Scope
    4. Sponsored development and co-development
  2. Upcoming releases
    1. olap4j release 1.0
    2. Mondrian release 3.1
    3. Aggregation designer release x.x
    4. Schema workbench release x.x
  3. Feature list
    1. Partitioned cubes
    2. Cold start
    3. Rollup in cache
    4. Compound slicer
    5. Schema and query validation
    6. Name-resolution
    7. Standard functions
    8. Bridge to CWM
    9. User-defined aggregate functions
    10. Further work on aggregate tables
  4. Release history
    1. Release 3.0
    2. Release 2.4
    3. Release 2.3
    4. Release 2.2
    5. Release 2.1
    6. Release 2.0
    7. Release 1.1
    8. Release 1.0
    9. Release 0.6
    10. Release 0.5
    11. Release 0.4
    12. Release 0.3

1. Introduction 

This is a list of features we propose to deliver in future releases of Mondrian. Each feature is linked to a high-level description. Complex features will have more detailed specifications in a separate document.

1.1 Purpose of this document 

This document has several goals. First, it lets the Mondrian community know what features we are thinking about implementing. There may be better ways of delivering the same functionality that we haven't thought of.

Second, since there is always more work than time, it allows us to prioritize. If we hear that a particular feature is important to a lot of people, we will try to get to it sooner.

Third, it allows us to attract resources. If there are features in this roadmap which are important to your organization, consider sponsoring Mondrian's development.

1.2 Mondrian's goal 

Mondrian's goal is to bring multidimensional analysis to the masses.

To do this it needs to be:

  • free
  • portable
  • easy to install
  • easy to integrate, and above all
  • easy to understand

As an open-source olap server written in pure Java, we feel that it meets these goals. We can't anticipate all of our customers' requirements, but open-source combined with Java keeps Mondrian flexible. It's easy to add functionality or to integrate third-party tools, and Mondrian be integrated into a variety of environments.

Mondrian is part of the Pentaho Open Source BI Suite. Pentaho aims to deliver the best possible user experience by integrating Mondrian with other open-source components such as Kettle, Pentaho Reporting, and Weka. While building this integration, Pentaho is committed to keeping Mondrian independent from other components, and available under a commercial-friendly open-source license.

1.3 Scope 

Mondrian can't do everything. If it did everything, it would be a huge download, difficult to install, and even more difficult to integrate with other software; and we'd never finish writing it. But the good news is, this is open source. If a feature is missing, it's often easy to add the feature to Mondrian or to integrate with another open-source product that provides the feature.

JPivot is Mondrian's sister project. It provides an excellent user-interface, and shows off what Mondrian can do. But we have been careful to keep the two projects separate. (You can use another user-interface to Mondrian, and you can also use JPivot with other data-sources.) If you've run Mondrian's demo and you have suggestions on how to improve the web interface, please make your suggestion to the JPivot project directly.

1.4 Sponsored development and co-development 

Pentaho encourages companies to sponsor development of features which are important to them. Sponsorship allows Mondrian developers to spend more time to spend more time adding features to Mondrian, rather than having to find other ways to pay the rent. The results are always contributed back to the project as open-source.

Another way companies can help Mondrian is to assign employees to co-develop features. We can help specify and design these features, provided that the resulting code is contributed to the project.

If your organization would like to sponsor development of features, please contact Julian Hyde.

2. Upcoming releases 

2.1 olap4j release 1.0 

Targeted release timeframe: Q3 2008.

olap4j is a proposed standard API for access to any OLAP data source from Java. See www.olap4j.org.

As of mondrian-3.0 olap4j is the primary API to mondrian; mondrian's driver is based on olap4j-0.9.4 (beta). olap4j release 1.0 will be the first production release of the olap4j specification. It will include a full Test Compatibility Kit (TCK) and incorporate bug fixes & feedback from the drivers and applications built using olap4j beta.

2.2 Mondrian Release 3.1 

Targeted release timeframe: Q3 2008

Feature Effort Importance
Remove support for old API low medium
3.12 Bridge to CWM. Integration with Pentaho Metadata. Could be incubator project. Note that someone has already implemented a bridge in one way. high high
3.10 Further work on Aggregate Tables. To support the aggregation designer, mondrian release 3.1 will probably include utilities (2) DDL generation and (3) Utility (maybe graphical, maybe text-based) to recommend a set of aggregate tables. high high
TBD    
 

2.3 Aggregation Designer Release x.x 

Targeted release timeframe: Q2 2008

Effort: high, Importance: high, Priority: high

Release Highlights:

  • Repeatable, reliable, semi-automated methodology for improving ROLAP/HOLAP performance
  • APIs and user interfaces that are suitable for use by developers, consultants and Pentaho customers

2.4 Schema Workbench Release x.x (cube designer) 

Targeted release timeframe not specified

Effort: high, Importance: high, Priority: high

Release Highlights:

  • User Interface suitable for consultants, developers and customers to design and maintain Mondrian Schemas
  • User Interface to support all Mondrian Schema tags and be maintained in lock-step with Mondrian server going forward

3. Feature list 

3.1 Partitioned cubes 

Effort: medium; importance: medium; priority: medium.

Whereas a regular cube has a single fact table, a partitioned cube has several fact tables, which are unioned together. The fact tables must have the same column names.

Each fact table can have a range (similar to 'cache ranges', above) which describes what data ranges are found in each. When looking for a particular cell, Mondrian scans the tables' criteria to determine which table to look in. For example, T1 holds data for Texas, 2005 onwards; T2 holds data for 2004 onwards; T3 holds all other data.  The cell (Oklahoma, January 2005) would be found in T2.

Partitioned tables are useful for real-time analysis. For example, one partition might contain today's data, while another might hold historical data. The 'hot' partition with today's data would typically have fewer or no aggregation tables and have caching disabled; its fact table might have different physical options in the RDBMS, say fewer indexes to maximize insert performance.

Example schema:

<Cube name="Sales">
    <Partitions>
        <Partition name="partition1" cache="false">
            <Table name="sales_fact_this_month"/>
            <Ranges>
                <Range dimension="[Time]">
                    <RangeMember bound="lower" member="[Time].[2005].[9]"/>
                </Range>
                <Range dimension="[Store]">
                    <RangeMember member="[Store].[USA].[CA]"/>
                    <RangeMember member="[Store].[USA].[WA].[Seattle]"/>
                </Range>
            </Ranges>
        </Partition>
        <Partition name="partition2" cache="true">
            <Table name="sales_fact"/>
            <Ranges/>
        </Partition>
    </Partitions>
</Cube>

3.2 Cold start 

Effort: medium; importance: medium; priority: low.

When Mondrian initializes and starts to process the first queries, it makes sql calls to get member lists and determine cardinality, and then to load segments into the cache. When Mondrian is closed and restarted, it has to do that work again. This can be a significant chunk of time depending on the cube size. For example in one test an 8GB cube (55M row fact table) took 15 minutes (mostly doing a group by) before it returned results from its first query, and absent any caching on the database server would take another 15 minutes if you closed it and reopened the application. Now, this cube was just one month of data; imagine the time if there was 5 years worth.

What ideas and designs can you come up with to speed that up, in other words to do anything time consuming only once and reuse it between instances?

Gang Chen: If it's possible, can we calculate the real levels of a parent-child hierarchy? This'll let Mondrian's metadata close to MS AS's.

Julian Hyde: Can you give me more details on how that would work? Start a discussion forum or feature request on SourceForge.

Other options for cold start:

  • Command for mondrian to serialize cache state (definitions and data) to disk. When mondrian starts, read the cache state from disk.
  • Command for mondrian to serialize cache definitions to disk. When mondrian starts, reads cache definitions from disk, and cache contents from DBMS.
  • User writes a script of MDX commands to prime the cache. On startup, mondrian executes this script in a background thread.

3.3 Rollup in cache 

Effort: medium; importance: medium; priority: low.

If the cache contains aggregates for all children of a member, then Mondrian would be able to compute the aggregate for the parent member by rolling up.

See the email thread "grouper in Mondrian".

3.4 Compound slicer 

Effort: medium; importance: low; priority: low.

3.5 Schema and query validation 

Process to validate a schema.

Process to validate a set of queries. Maybe an option to ignore errors due to specific members not existing because the data hasn't been loaded yet.

Expose validation via Eclipse plugin.

3.6 Name-resolution 

Mondrian's name resolution is not always compatible with other MDX implementations such as MSAS and SAS.

  1. Support abbreviated member names. For example, e.g. [Products].[Boston Lager] seems to be valid in MSAS if product names are unique, whereas Mondrian currently requires [Products].[Beverages].[Beer].[Samual Adams].[Boston Lager].
  2. Change scheme for generating unique names, omitting the 'all' member name; current [Customers].[(All customers)].[USA] would become [Customers].[USA]. Mondrian would still understand names of the previous form.

3.7 Standard functions 

Implement standard MDX functions:

  • DrilldownMemberBottom(<Set1>, <Set2>, <Count>[, [<Numeric Expression>][, RECURSIVE]])
  • DrilldownMemberTop(<Set1>, <Set2>, <Count>[, [<Numeric Expression>][, RECURSIVE]])
  • DrillupLevel(<Set>[, <Level>])
  • DrillupMember(<Set1>, <Set2>)
  • Except(<Set1>, <Set2>[, ALL]). (Except is implemented in Mondrian 1.2 except the ALL keyword.)
  • SetToArray(<Set>[, <Set>]...[, <Numeric Expression>])

3.8 Bridge to CWM 

CWM (Common Warehouse Model) is a standard model for defining data warehouse and multidimensional schemas. It allows interoperability with tools such as UML diagrams, relational report design tools, and ETL tools.

This feature will add:

  • A gateway to present a Mondrian schema via the CWM API.
  • A bridge to read a CWM schema and create a Mondrian schema from it.

3.9 User-defined aggregate functions 

The standard aggregate functions are sum, count, distinct-count, min, max and avg. This feature will provide an SPI by which application developers can write their own aggregate functions.

The SPI will include:

  • the name of the aggregate function;
  • parameter types;
  • return types;
  • a means to generate SQL expression to compute the aggregate from unaggregated fact table data. (For the "count" function applied to the "unit_sales" column, this would generate "count(unit_sales)".)
  • a means to generate SQL expression to compute the aggregate by rolling up partially aggregated data. (For the "count" function applied to the "unit_sales" column, this would generate "sum(unit_sales)". Some aggregates, such as "distinct-count", do not support rollup.)
  • a means to roll up values in memory. Some aggregates, such as "distinct-count", do not support this.

The SPI will support functions which map to a SQL expression rather than a SQL aggregate function. The "avg" function is an example of this: it works by expanding itself to sum / count.

The SPI will support functions which can be computed from unaggregate fact table data, but cannot be rolled up. The "distinct-count" function is an example of this.

You will be able to include user-defined aggregate functions in aggregate tables.

3.10 Further work on aggregate tables 

1. Data population

Utility to populate (or generate INSERT statements to populate) the agg tables. (For extra credit: populate the tables in topological order, so that higher level aggregations can be built from lower level aggregations.)

2. DDL generation

Utility to generate a script containing CREATE TABLE and CREATE INDEX statements all possible aggregate tables (including indexes), XML for these tables, and comments indicating the estimated number of rows in these tables. Clearly this will be a huge script, and it would be ridiculous to create all of these tables. The person designing the schema could copy/paste from this file to create their own schema.

3. Utility (maybe graphical, maybe text-based) to recommend a set of aggregate tables

This is essentially an optimization algorithm, and it is described in the academic literature. Constraints on the optimization process are the amount of storage required, the estimated time to populate the agg tables. The algorithm could also take into account usage information.

4. Allow aggregate tables to be taken offline/online while Mondrian is still running

I'm thinking of these being utilities, not part of the core runtime engine. There's plenty of room to wrap these utilities in nice graphical interfaces, make them smarter.

4. Release history 

4.1 Release 3.0 (2008/3/22) 

  • olap4j API. olap4j (http://www.olap4j.org) is the Open Java API for OLAP. From mondrian-3.0 onwards, olap4j is the main API for connecting to mondrian, browsing metadata and executing queries.

    Mondrian's previous API (classes in the mondrian.olap package) still exists but is deprecated; from mondrian-3.1 onwards, classes and methods in this API may not exist, may not work, or may change.
     
  • Rollup policy controls how a cell's value is calculated if some of its children are hidden by access-control.  Before mondrian-3.0 the only policy was 'full': if access to a hierarchy was restricted, the value of a member would be equal to the sum of its children; from mondrian-3.0, we also allow 'partial' (the sum is the sum of the visible children) or 'hidden' (the cell's value is unknown if any of the children are hidden). The policy is expressed by the rollupPolicy attribute of the <HierarchyGrant> element.
     
  • Aggregate roles. You can now define a role in the schema that has the sum of the privileges of two or more roles; and you can connect to mondrian with one or more roles. This facility enables closer integration with Pentaho access-control, where a user can already exist in multiple roles.
     
  • Allow distinct-count measures to be aggregated. For example, mondrian can now compute the number of distinct customers who bought beer or diapers in Q2 or Q3. For efficiency, cell values are loaded in batches and a special cache allows aggregate cell values to be reused between queries.
     
  • Improved dimension sharing. Allow a shared dimension to be used more than once within the same cube.
     
  • Virtual cube enhancements. When a cube that uses the same dimension twice is involved in a virtual cube, disambiguate which usage of the dimension is involved. Allow the virtual cube to use the same cube more than once.
     
  • Scalar functions. Many scalar functions have been added in mondrian-3.0, to the the specification of the Visual Basic for Applications (VBA) and Excel libraries that are available by default in Microsoft SQL Server Analysis Services (SSAS) and that many MDX users assume are part of the core MDX language.

    New functions: Abs, Acosh, Asc, AscB, AscW, Asin, Asinh, Atan2, Atanh, Atn, Cache, CBool, CByte, CDate, CDbl, Chr, ChrB, ChrW, CInt, Cos, Cosh, Date, DateAdd, DateDiff, DatePart, DateSerial, DateValue, Day, DDB, Degrees, DrilldownLevel, DrilldownLevelBottom, DrilldownLevelTop, Exp, Fix, FormatCurrency, FormatDateTime, FormatNumber, FormatPercent, FV, Hex, Hour, InStrRev, Int, IPmt, IRR, IsDate, LCase, Log, Log10, LTrim, Minute, MIRR, Month, MonthName, Now, NPer, NPV, Oct, Percentile, Pi, Pmt, Power, PPmt, PV, Radians, Rate, Replace, Right, Round, RTrim, Second, Sgn, Sin, Sinh, SLN, Space, Sqr, SqrtPi, Str, StrComp, String, StrReverse, SYD, Tan, Tanh, Time, Timer, TimeSerial, TimeValue, Trim, TypeName, Val, Weekday, WeekdayName, Year.

    We have added additional forms to existing functions: Descendants(<Member>, , LEAVES); Format can now be applied to DateTime values; Iif can be applied to member, level, hierarchy, dimension and tuple and set values; Levels can be applied to a string expression.
     
  • JNDI in connect string. JDBC data sources can be specified by their JNDI name.

API changes in release 3.0

Removed methods that were deprecated in 2.4, plus:

  • MondrianServer.flushSchemaCache()
  • MondrianServer.flushDataCache()
  • DriverManager.getConnection(String, CatalogLocator, boolean)
  • DriverManager.getConnection(Util.PropertyList, boolean)
  • DriverManager.getConnection(Util.PropertyList, CatalogLocator, boolean)
  • DriverManager.getConnection(Util.PropertyList, CatalogLocator, DataSource, boolean)
  • RolapMember.getSqlKey()
  • MondrianProperties.CachePoolCostLimit (property "mondrian.rolap.CachePool.costLimit")
  • MondrianProperties.FlushAfterQuery (property "mondrian.rolap.RolapResult.flushAfterEachQuery")

4.2 Release 2.4 (2007/08/31) 

  • Aggregate distinct-count measures. Mondrian now computes distinct-count measures properly over a range of selections (for example, show me a count of all new Customers from January through July).
  • Generate SQL with GROUPING SETS SQL construct, for databases which support it. By leveraging Grouping Sets, Mondrian can reduce the number of SQL queries necessary to fulfill an MDX request, and databases can often execute the combined queries more efficiently than the individual queries. Grouping Sets are currently supported in Oracle, DB2, Teradata and Microsoft SQL Server.
  • New MDX functions Extract(<Set>, <Dimension>[, <Dimension>...]), Generate, Iif(bool, bool, bool), Len, Left, Mid, UCase.
  • Support for Apache Commons Virtual File System (VFS) URLs.
  • Support keys in members, e.g. [Products].&[1234].

API changes in release 2.4

  • DynamicSchemaProcessor. Moved the mondrian.rolap.DynamicSchemaProcessor interface to package mondrian.spi. The processSchema(URL, PropertyList) method now has signature processSchema(String, PropertyList), and the URL is intended to be interpreted as an Apache VFS URL. Class mondrian.spi.impl.FilterDynamicSchemaProcessor is a partial implementation.
  • Various methods which used String or String[] to lookup multi-part identifiers such as '[Store].[USA].[CA]'
    now take Id.Segment or List<Id.Segment>. The previous methods are deprecated and will be removed in mondrian-3.0 (see below).

Deprecated methods to lookup multi-part identifiers which are deprecated in mondrian-2.4 and will be removed in mondrian-3.0:

  • Formula.Formula(String[], exp)
  • Formula.Formula(String[], Exp, MemberProperty[])
  • QueryPart.addFormula(String[], Exp, MemberProperty[])
  • SchemaReader.lookupCompound(OlapElement, String[], boolean, int)
  • SchemaReader.getMemberByUniqueName(String[], boolean)
  • SchemaReader.getMemberByUniqueName(String[], boolean, MatchType)
  • Util.explode(String)
  • Util.lookupCompound(SchemaReader, OlapElement, String[], boolean, int)
  • Util.lookup(Query, String[])

Other deprecated methods to be removed mondrian-3.0:

  • Query.getQueryString()
  • QueryPart.toMdx()
  • RolapSchema.flushSchema(String, String, String, String)
  • RolapSchema.flushSchema(String, DataSource)
  • RolapSchema.clearCache()
  • RolapSchema.flushRolapStarCaches(boolean)
  • RolapSchema.flushAllRolapStarCachedAggregations()
  • CachePool.flush()

4.3 Release 2.3 (2007/03/12) 

  • Cache control API.
  • More efficient evaluation of queries which return large results. To achieve this, some MDX functions now have multiple implementations, and can return their results as iterators in addition to the usual list format.
  • More control over queries which run for long periods of time, return large numbers of members or cells, or which use excessive amounts of memory. Under such conditions, queries throw particular a ResultLimitExceeded exception.
  • JDK 1.5 is now the primary development and delivery platform. You can continue to run mondrian on JDK 1.4 using the provided backwards-compatibility JARs mondrian-jdk14.jar and retroweaver-rt-1.2.4.jar created by retroweaver.
  • Added support for Ingres and LucidDB
  • JOLAP (JSR-069) support removed.

API changes which may impact existing applications:

  • Rename ResultLimitExceeded to ResultLimitExceededException;
  • Remove packages javax.olap, mondrian.jolap, org.omg.java.cwm;
  • In mondrian.olap.Axis, change 'Position[] getPositions()' to 'List<Position> getPositions()';
  • In mondrian.olap.Position, replace data member 'Member[] members' with methods 'Member get(int ordinal)' and 'int size()' (both inherited from List<Member>).

4.4 Release 2.2 (2006/10/??) 

  • Mondrian-2.2 implements a host of new functions and operators: In, Matches, Cast, ValidMeasure, CurrentDateMember, CurrentDateString. Also the NULL literal.
  • Parameters. Formerly you could only specify parameters in a query. Now they can also be specified at system, schema or session level. Since parameters can be specified using an MDX expression, this is a great way to define constants and calculations in just one place, and share use them throughout your application.
  • Query timeout and cancel. We have added timeout and a cancel facility to deal with long-running queries.
  • There's now the ability to flush the schema cache. See mondrian.olap.MondrianServer for more details.
  • Internationalization just got a lot easier. Mondrian now supports a 'Locale' parameter to the connect string. Formatting information comes from Java rather than from MondrianResource.properties, which means that Mondrian should work out of the box for any locale Java supports.
  • Performance improvements. The Level.approxRowCount schema attribute saves mondrian the effort of executing queries to count levels solely for XML/A's purposes. There are also performance improvments in the LastNonEmpty function, and crossjoin can be evaluated in SQL even for virtual cubes.
  • Lastly, we moved mondrian's website to http://mondrian.pentaho.com. Same content as before, but better formatted, and more integrated with the rest of the Pentaho family of projects.

4.5 Release 2.1 (2006/04/01) 

  1. Finally, a separate distribution mondrian-*-embedded.zip, including an embedded Derby database in the WAR. This can be deployed to Tomcat on any platform by simply exploding the WAR into TOMCAT/webapps, allowing folks "kicking the tires" to easily try out Mondrian/JPivot. See how to deploy and run the embedded web app.
  2. XML/A bug fixes, functionality and test suite improvements.
  3. Compilation of MDX expressions. This is an architectural change to allow Mondrian to analyze queries at the start of execution, and trade off various techniques such as expression-caching and pushing predicates into the generated SQL. It involves some API changes (see below).
  4. Allow distinct-count measures to be rolled up over attributes which are functionally dependent on the key of the measure (e.g. "gender" is functionally dependent on the key "customer_id" of the measure "Customer Count"). This yields performance improvements when using distinct count-aggregates.
  5. Improved integration of User-Defined Functions.
  6. Implemented VisualTotals, LastPeriods, AddCalculatedMembers, StripCalculatedMembers MDX functions.
  7. Support for comments in MDX (/* ... */, -- [rest of line], // [rest of line]).
  8. Includes recent, compatible version of JPivot.
  9. Interbase 6 support.
  10. Many bug fixes and extensions to the test suite.
  11. Documentation improvements.

4.5.1 API changes in release 2.1 

  1. FunCall and UnresolvedFunCall. It used to be possible to create a FunCall with the name of a function but no function definition. This complicated the validation process, because we would discover at runtime that a function call had no definition. Now you should use the new class UnresolvedFunCall.
  2. Category methods. Renaming a few of the methods concerning types and categories.
    • Exp.getType() used to return int, now returns Type
    • Old usages of Exp.getType() should use Exp.getCategory()
    • int[] FunDef.getParameterTypes() is renamed to int[] FunCall.getParameterCategories()
    • int FunCall.getReturnType() is renamed to int FunCall.getReturnCategory()
    • Removed the Exp.getTypeX() method; old usages of this method should now use Exp.getType().
  3. OLAP element types. OLAP elements Cube, Dimension, Hierarchy, Level and Member no longer implement the Exp interface. If you want to use these in expressions, there are wrapper classes: DimensionExpr, HierarchyExpr, LevelExpr, MemberExpr. These are in a new package, mondrian.mdx. Some other parse tree classes (Query, Literal) will move to this package at some time in the future.

4.6 Release 2.0 (2005/12/19) 

  • Aggregate tables.
  • Calculated sets defined in the schema, and WITH SET syntax to define sets within an MDX query.
  • Cached set expressions. The WITH SET feature and functions such as RANK cause the same expression to be evaluated many times within the course of a single MDX statement. The set-expression cache improves the performance of such queries.
  • User-defined functions.
  • Enhanced support for parent-child hierarchies.
  • Enhanced XML for Analysis (XML/A) support.
  • Enhanced support for internationalized/localized (I18N/L10N) applications.
  • Pushdown SQL. To improve performance, Mondrian automatically translates filters and aggregations into SQL which can be executed on the underlying RDBMS.
  • Support for the Apache Derby pure Java embedded RDBMS.

4.7 Release 1.1 (2005/04/06) 

  • Numerous improvements in functionality, performance, and stability.

4.8 Release 1.0 (2003/08/18) 

  • First production release.
  • Distinct-count aggregations.
  • JDBC connection-pooling.
  • Support for XML for Analysis (XML/A).

4.9 Release 0.6 (2003/05/24) 

  • Parent-child hierarchies.
  • Partial support for XML for Analysis (XML/A).

4.10 Release 0.5 (2003/02/20) 

  • Partial support for JOLAP.
  • Implement Hierarchize, ":", Aggregate, and statistical functions.

4.11 Release 0.4 (2002/11/10) 

  • Integration with JPivot.
  • Improved thread-safety.

4.12 Release 0.3 (2002/08/09) 

  • First public release.
  • JSP page generates a static table from an MDX query.
  • Support for several SQL dialects.


Author: Julian Hyde; last modified February 2008.
Version: $Id$ (log)
Copyright (C) 2002-2005 Julian Hyde
Copyright (C) 2005-2009 Pentaho and others


mondrian-3.11.0.1-R/doc/schema.bnf000066400000000000000000000061361261646570300164550ustar00rootroot00000000000000AggExclude ::= "" AggFactCount ::= "" AggForeignKey ::= "" AggIgnoreColumn ::= "" AggLevel ::= "" AggMeasure ::= "" AggName ::= "" AggFactCount (AggIgnoreColumn | AggForeignKey | AggMeasure | AggLevel)* "" AggPattern ::= "" AggFactCount (AggIgnoreColumn | AggForeignKey | AggMeasure | AggLevel)* AggExclude* "" CalculatedMember ::= "" Formula? CalculatedMemberProperty* "" CalculatedMemberProperty ::= "" Closure ::= "" Table "" Column ::= "/>" ColumnDef ::= "" ColumnDefs ::= "" ColumnDef* "" ColumnExpression ::= "" SQL* "" Cube ::= "" Relation (Dimension | DimensionUsage)* Measure* CalculatedMember* NamedSet* "" CubeGrant ::= "" DimensionGrant* HierarchyGrant* "" CubeUsage ::= "" CubeUsages ::= "" CubeUsage+ "" Dimension ::= "" Hierarchy+ "" DimensionGrant ::= "" DimensionUsage ::= "" Formula ::= "" text "" Hierarchy ::= "" RelationOrJoin? Level+ MemberReaderParameter* "" HierarchyGrant ::= "" MemberGrant* "" InlineTable ::= "" ColumnDefs Rows "" Join ::= "" RelationOrJoin RelationOrJoin "" KeyExpression ::= "" SQL* "" Level ::= "" KeyExpression? NameExpression? OrdinalExpression? ParentExpression? Closure? Property+ "" Measure ::= "" MeasureExpression? CalculatedMemberProperty* "" MeasureExpression ::= "" SQL* "" MemberGrant ::= "" MemberReaderParameter ::= "" NamedSet ::= "" Formula? "" NameExpression ::= "" SQL* "" OrdinalExpression ::= "" SQL* "" Parameter ::= "" ParentExpression ::= "" SQL* "" Property ::= "" Role ::= "" SchemaGrant* Union? "" RoleUsage ::= "" Row ::= "" Value* "" Rows ::= "" Row* "" Schema ::= "" Parameter* Dimension* Cube* VirtualCube* NamedSet* Role* UserDefinedFunction* "" SchemaGrant ::= "" CubeGrant* "" SQL ::= "" text "" Table ::= "" SQL? AggExclude* (AggName | AggPattern)* "
" Union ::= "" RoleUsage* "" UserDefinedFunction ::= "" Value ::= "" text "" View ::= "" SQL* "" VirtualCube ::= "" CubeUsages VirtualCubeDimension* VirtualCubeMeasure* CalculatedMember* NamedSet* "" VirtualCubeDimension ::= "" VirtualCubeMeasure ::= "" Relation ::= Table | View | InlineTable RelationOrJoin ::= Join | Table | View | InlineTable mondrian-3.11.0.1-R/doc/schema.html000066400000000000000000006126151261646570300166610ustar00rootroot00000000000000 Pentaho Analysis Services: How to Design a Mondrian Schema
How to Design a Mondrian Schema
  1. What is a schema?
  2. Schema files
    1. Annotation
  3. Logical model
    1. Cube
    2. Measures
    3. Dimensions, Hierarchies, Levels
      1. Mapping dimensions and hierarchies onto tables
      2. The 'All' member
      3. Time dimensions
      4. Order and Display of Levels
      5. Multiple hierarchies
      6. Degenerate dimensions
      7. Inline tables
      8. Member properties and formatters
      9. Approximate level cardinality
      10. Default Measure Attribute
      11. Functional Dependency Optimizations
      12. Table Hints
  4. Star and snowflake schemas
    1. Shared dimensions
    2. Join optimization
  5. Advanced logical constructs
    1. Virtual cubes
    2. Parent-child hierarchies
      1. Tuning parent-child hierarchies
      2. Closure tables
      3. Populating closure tables
    3. Member properties
    4. Calculated members
    5. Named sets
  6. Plug-ins
    1. User-defined function
    2. Member reader
    3. Cell reader
    4. Cell formatter
    5. Member formatter
    6. Property formatter
    7. Schema processor
    8. Data source change listener
    9. Dynamic datasource xmla servlet
  7. Internationalization
  8. Aggregate tables
  9. Access-control
    1. Defining a role
    2. Rollup policy
    3. Union roles
    4. Setting a connection's role
  10. Appendix A: XML elements

1. What is a schema? 

A schema defines a multi-dimensional database. It contains a logical model, consisting of cubes, hierarchies, and members, and a mapping of this model onto a physical model.

The logical model consists of the constructs used to write queries in MDX language: cubes, dimensions, hierarchies, levels, and members.

The physical model is the source of the data which is presented through the logical model. It is typically a star schema, which is a set of tables in a relational database; later, we shall see examples of other kinds of mappings.

2. Schema files 

Mondrian schemas are represented in an XML file. An example schema, containing almost all of the constructs we discuss here, is supplied as demo/FoodMart.xml in the Mondrian distribution. The dataset to populate this schema is also in the distribution.

Currently, the only way to create a schema is to edit a schema XML file in a text editor. The XML syntax is not too complicated, so this is not as difficult as it sounds, particularly if you use the FoodMart schema as a guiding example.

The structure of the XML document is as follows:

aggElements
aggElements
relation
<SQL/>
<SQL/>
<SQL/>
<SQL/>
<SQL/>
<SQL/>
<SQL/>

relation ::=
<SQL/>
<SQL/>
<Row>
relation

aggElement ::=

NOTE: The order of XML elements is important. For example, the <UserDefinedFunction> element has to occur inside the <Schema> element after all collections of <Cube>, <VirtualCube>, <NamedSet> and <Role> elements. If you include it before the first <Cube> element, the rest of the schema will be ignored.

The content of each XML element is described in Appendix A and in the XML schema.

2.1 Annotation 

The major element types (schema, cube, virtual cube, shared dimension, dimension, hierarchy, level, measure, calculated member) support annotations. An annotation is a way of associating a user-defined property with a metadata element, and in particular, allows tools to add metadata without extending the official Mondrian schema.

Create an <Annotations> element as a child of the element you wish to annotate (generally it is the first child element, but check the schema definition for details), then include a number of <Annotation> elements. <Annotation> elements' names must be unique within their element. If you are adding annotations to support a particular tool that you maintain, choose annotation names carefully, to ensure that they do not clash with annotations used by other tools.

The following example shows "Author" and "Date" annotations attached to a <Schema> object.

<Schema name="Rock Sales">
<Annotation name="Author">Fred Flintstone</Annotation>
<Annotation name="Date">10,000 BC</Annotation>
<Cube name="Sales">
...

3. Logical model 

The most important components of a schema are cubes, measures, and dimensions:

  • A cube is a collection of dimensions and measures in a particular subject area.
  • A measure is a quantity that you are interested in measuring, for example, unit sales of a product, or cost price of inventory items.
  • A dimension is an attribute, or set of attributes, by which you can divide measures into sub-categories. For example, you might wish to break down product sales by their color, the gender of the customer, and the store in which the product was sold; color, gender, and store are all dimensions.

Let's look at the XML definition of a simple schema.

<Cube name="Sales">
<Table name="sales_fact_1997"/>
<Dimension name="Gender" foreignKey="customer_id">
<Hierarchy hasAll="true" allMemberName="All Genders" primaryKey="customer_id">
<Table name="customer"/>
<Level name="Gender" column="gender" uniqueMembers="true"/>
<Dimension name="Time" foreignKey="time_id">
<Hierarchy hasAll="false" primaryKey="time_id">
<Table name="time_by_day"/>
<Level name="Year" column="the_year" type="Numeric" uniqueMembers="true"/>
<Level name="Quarter" column="quarter" uniqueMembers="false"/>
<Level name="Month" column="month_of_year" type="Numeric" uniqueMembers="false"/>
<Measure name="Unit Sales" column="unit_sales" aggregator="sum" formatString="#,###"/>
<Measure name="Store Sales" column="store_sales" aggregator="sum" formatString="#,###.##"/>
<Measure name="Store Cost" column="store_cost" aggregator="sum" formatString="#,###.00"/>
<CalculatedMember name="Profit" dimension="Measures" formula="[Measures].[Store Sales] - [Measures].[Store Cost]">
<CalculatedMemberProperty name="FORMAT_STRING" value="$#,##0.00"/>
</Cube>

This schema contains a single cube, called "Sales". The Sales cube has two dimensions, "Time", and "Gender", and four measures, "Unit Sales", "Store Sales", "Store Cost", and "Profit".

We can write an MDX query on this schema:

SELECT {[Measures].[Unit Sales], [Measures].[Store Sales]} ON COLUMNS,
  {descendants([Time].[1997].[Q1])} ON ROWS
FROM [Sales]
WHERE [Gender].[F]

This query refers to the Sales cube ([Sales]), each of the dimensions [Measures], [Time], [Gender], and various members of those dimensions. The results are as follows:

[Time] [Measures].[Unit Sales] [Measures].[Store Sales]
[1997].[Q1] 0 0
[1997].[Q1].[Jan] 0 0
[1997].[Q1].[Feb] 0 0
[1997].[Q1].[Mar] 0 0

Now let's look at the schema definition in more detail.

3.1 Cube 

A cube (see <Cube>) is a named collection of measures and dimensions. The one thing the measures and dimensions have in common is the fact table, here "sales_fact_1997". As we shall see, the fact table holds the columns from which measures are calculated, and contains references to the tables which hold the dimensions.

<Cube name="Sales">
<Table name="sales_fact_1997"/>
...
</Cube>

The fact table is defined using the <Table> element. If the fact table is not in the default schema, you can provide an explicit schema using the "schema" attribute, for example

<Table schema=" dmart" name="sales_fact_1997"/>

You can also use the <View> construct to build more complicated SQL statements. The <Join> construct is not supported for fact tables.

3.2 Measures 

The Sales cube defines several measures, including "Unit Sales" and "Store Sales".

<Measure name="Unit Sales" column="unit_sales" aggregator="sum" datatype="Integer" formatString="#,###"/>
<Measure name="Store Sales" column="store_sales" aggregator="sum" datatype="Numeric" formatString="#,###.00"/>

Each measure (see <Measure>) has a name, a column in the fact table, and an aggregator. The aggregator is usually "sum", but "count", "min", "max", "avg", and "distinct-count" are also allowed; "distinct-count" has some limitations if your cube contains a parent-child hierarchy.

The optional datatype attribute specifies how cell values are represented in Mondrian's cache, and how they are returned via XML for Analysis. The datatype attribute can have values "String", "Integer", "Numeric", "Boolean", "Date", "Time", and "Timestamp". The default is "Numeric", except for "count" and "distinct-count" measures, which are "Integer".

An optional formatString attribute specifies how the value is to be printed. Here, we have chosen to output unit sales with no decimal places (since it is an integer), and store sales with two decimal places (since it is a currency value). The ',' and '.' symbols are locale-sensitive, so if you were running in Italian, store sales might appear as "48.123,45". You can achieve even more wild effects using advanced format strings.

A measure can have a caption attribute to be returned by the Member.getCaption() method instead of the name. Defining a specific caption does make sense if special letters (e.g. Σ or Π) are to be displayed:

<Measure name="Sum X" column="sum_x" aggregator="sum" caption="&#931; X"/>

Rather than coming from a column, a measure can use a cell reader, or a measure can use a SQL expression to calculate its value. The measure "Promotion Sales" is an example of this.

<Measure name="Promotion Sales" aggregator="sum" formatString="#,###.00">
<SQL dialect="generic">
(case when sales_fact_1997.promotion_id =
0 then 0 else sales_fact_1997.store_sales end)
</SQL>

In this case, sales are only included in the summation if they correspond to a promotion sale. Arbitrary SQL expressions can be used, including subqueries. However, the underlying database must be able to support that SQL expression in the context of an aggregate. Variations in syntax between different databases is handled by specifying the dialect in the SQL tag.

In order to provide a specific formatting of the cell values, a measure can use a cell formatter.

3.3 Dimensions, Hierarchies, Levels 

Some more definitions:

  • A member is a point within a dimension determined by a particular set of attribute values. The gender hierarchy has the two members 'M' and 'F'. 'San Francisco', 'California' and 'USA' are all members of the store hierarchy.
  • A hierarchy is a set of members organized into a structure for convenient analysis. For example, the store hierarchy consists of the store name, city, state, and nation. The hierarchy allows you to form intermediate sub-totals: the sub-total for a state is the sum of the sub-totals of all of the cities in that state, each of which is the sum of the sub-totals of the stores in that city.
  • A level is a collection of members which have the same distance from the root of the hierarchy.
  • A dimension is a collection of hierarchies which discriminate on the same fact table attribute (say, the day that a sale occurred).

For reasons of uniformity, measures are treated as members of a special dimension, called 'Measures'.

An example

Let's look at a simple dimension.

<Dimension name="Gender" foreignKey="customer_id">
<Hierarchy hasAll="true" primaryKey="customer_id">
<Table name="customer"/>
<Level name="Gender" column="gender" uniqueMembers="true"/>

This dimension consists of a single hierarchy, which consists of a single level called Gender. (As we shall see later, there is also a special level called [(All)] containing a grand total.)

The values for the dimension come from the gender column in the customer table. The "gender" column contains two values, 'F' and 'M', so the Gender dimension contains the members [Gender].[F] and [Gender].[M].

For any given sale, the gender dimension is the gender of the customer who made that purchase. This is expressed by joining from the fact table "sales_fact_1997.customer_id" to the dimension table "customer.customer_id".

3.3.1 Mapping dimensions and hierarchies onto tables 

A dimension is joined to a cube by means of a pair of columns, one in the fact table, the other in the dimension table. The <Dimension> element has a foreignKey attribute, which is the name of a column in the fact table; the <Hierarchy> element has a primaryKey attribute.

If the hierarchy has more than one table, you can disambiguate using the primaryKeyTable attribute.

The column attribute defines the key of the level. It must be the name of a column in the level's table. If the key is an expression, you can instead use the <KeyExpression> element inside the Level. The following is equivalent to the above example:

<Dimension name="Gender" foreignKey="customer_id">
<Hierarchy hasAll="true" primaryKey="customer_id">
<Table name="customer"/>
<Level name="Gender" column="gender" uniqueMembers="true">
<SQL dialect="generic">customer.gender</SQL>

Other attributes of <Level>, <Measure> and <Property> have corresponding nested elements:

Parent element Attribute Equivalent nested element Description
<Level> column <KeyExpression> Key of level.
<Level> nameColumn <NameExpression> Expression which defines the name of members of this level. If not specified, the level key is used.
<Level> ordinalColumn <OrdinalExpression> Expression which defines the order of members. If not specified, the level key is used.
<Level> captionColumn <CaptionExpression> Expression which forms the caption of members. If not specified, the level name is used.
<Level> parentColumn <ParentExpression> Expression by which child members reference their parent member in a parent-child hierarchy. Not specified in a regular hierarchy.
<Measure> column <MeasureExpression> SQL expression to calculate the value of the measure (the argument to the SQL aggregate function).
<Property> column <PropertyExpression> SQL expression to calculate the value of the property.

The uniqueMembers attribute is used to optimize SQL generation. If you know that the values of a given level column in the dimension table are unique across all the other values in that column across the parent levels, then set uniqueMembers="true", otherwise, set to "false". For example, a time dimension like [Year].[Month] will have uniqueMembers="false" at the Month level, as the same month appears in different years. On the other hand, if you had a [Product Class].[Product Name] hierarchy, and you were sure that [Product Name] was unique, then you can set uniqueMembers="true". If you are not sure, then always set uniqueMembers="false". At the top level, this will always be uniqueMembers="true", as there is no parent level.

The highCardinality attribute is used to notify Mondrian there are undefined and very high number of elements for this dimension. Acceptable values are true or false (last one is default value). Actions performed over the whole set of dimension elements cannot be performed when using highCardinality="true".

3.3.2 The 'all' member 

By default, every hierarchy contains a top level called '(All)', which contains a single member called '(All {hierarchyName})'. This member is parent of all other members of the hierarchy, and thus represents a grand total. It is also the default member of the hierarchy; that is, the member which is used for calculating cell values when the hierarchy is not included on an axis or in the slicer. The allMemberName and allLevelName attributes override the default names of the all level and all member.

If the <Hierarchy> element has hasAll="false", the 'all' level is suppressed. The default member of that dimension will now be the first member of the first level; for example, in a Time hierarchy, it will be the first year in the hierarchy. Changing the default member can be confusing, so you should generally use hasAll="true".

The <Hierarchy> element also has a defaultMember attribute, to override the default member of the hierarchy:

<Dimension name="Time" type="TimeDimension" foreignKey="time_id">
<Hierarchy hasAll="false" primaryKey="time_id" defaultMember="[Time].[1997].[Q1].[1]"/>
...

3.3.3 Time dimensions 

Time dimensions based on year/month/week/day are coded differently in the Mondrian schema due to the MDX time related functions such as:

  • ParallelPeriod([level[, index[, member]]])
  • PeriodsToDate([level[, member]])
  • WTD([member])
  • MTD([member])
  • QTD([member])
  • YTD([member])
  • LastPeriod(index[, member])

Time dimensions have type="TimeDimension". The role of a level in a time dimension is indicated by the level's levelType attribute, whose allowable values are as follows:

levelType value Meaning
TimeYears Level is a year
TimeQuarters Level is a quarter
TimeMonths Level is a month
TimeWeeks Level is a week
TimeDays Level represents days

Here is an example of a time dimension:

<Dimension name="Time" type="TimeDimension">
<Hierarchy hasAll="true" allMemberName="All Periods" primaryKey="dateid">
<Table name="datehierarchy"/>
<Level name="Year" column="year" uniqueMembers="true" levelType="TimeYears" type="Numeric"/>
<Level name="Quarter" column="quarter" uniqueMembers="false" levelType="TimeQuarters"/>
<Level name="Month" column="month" uniqueMembers="false" ordinalColumn="month" nameColumn="month_name" levelType="TimeMonths" type="Numeric"/>
<Level name="Week" column="week_in_month" uniqueMembers="false" levelType="TimeWeeks"/>
<Level name="Day" column="day_in_month" uniqueMembers="false" ordinalColumn="day_in_month" nameColumn="day_name" levelType="TimeDays" type="Numeric"/>

3.3.4 Order and display of levels 

Notice in the time hierarchy example above the ordinalColumn and nameColumn attributes on the <Level> element. These affect how levels are displayed in a result. The ordinalColumn attribute specifies a column in the Hierarchy table that provides the order of the members in a given level, while the nameColumn specifies a column that will be displayed.

For example, in the Month level above, the datehierarchy table has month (1 .. 12) and month_name (January, February, ...) columns. The column value that will be used internally within MDX is the month column, so valid member specifications will be of the form: [Time].[2005].[Q1].[1]. Members of the [Month] level will be displayed in the order January, February, etc.

In a parent-child hierarchy, members are always sorted in hierarchical order. The ordinalColumn attribute controls the order that siblings appear within their parent.

Ordinal columns may be of any datatype which can legally be used in an ORDER BY clause. Scope of ordering is per-parent, so in the example above, the day_in_month column should cycle for each month. Values returned by the JDBC driver should be non-null instances of java.lang.Comparable which yield the desired ordering when their Comparable.compareTo method is called.

Levels contain a type attribute, which can have values "String", "Integer", "Numeric", "Boolean", "Date", "Time", and "Timestamp". The default value is "Numeric" because key columns generally have a numeric type. If it is a different type, Mondrian needs to know this so it can generate SQL statements correctly; for example, string values will be generated enclosed in single quotes:

WHERE productSku = '123-455-AA'

3.3.5 Multiple hierarchies 

A dimension can contain more than one hierarchy:

<Dimension name="Time" foreignKey="time_id">
<Hierarchy hasAll="false" primaryKey="time_id">
<Table name="time_by_day"/>
<Level name="Year" column="the_year" type="Numeric" uniqueMembers="true"/>
<Level name="Quarter" column="quarter" uniqueMembers="false"/>
<Level name="Month" column="month_of_year" type="Numeric" uniqueMembers="false"/>
<Hierarchy name="Time Weekly" hasAll="false" primaryKey="time_id">
<Table name="time_by_week"/>
<Level name="Year" column="the_year" type="Numeric" uniqueMembers="true"/>
<Level name="Week" column="week" uniqueMembers="false"/>
<Level name="Day" column="day_of_week" type="String" uniqueMembers="false"/>

Notice that the first hierarchy doesn't have a name. By default, a hierarchy has the same name as its dimension, so the first hierarchy is called "Time".

These hierarchies don't have much in common -- they don't even have the same table! -- except that they are joined from the same column in the fact table, "time_id". The main reason to put two hierarchies in the same dimension is because it makes more sense to the end-user: end-users know that it makes no sense to have the "Time" hierarchy on one axis and the "Time Weekly" hierarchy on another axis. If two hierarchies are the same dimension, the MDX language enforces common sense, and does not allow you to use them both in the same query.

3.3.6 Degenerate dimensions 

A degenerate dimension is a dimension which is so simple that it isn't worth creating its own dimension table. For example, consider following the fact table:

product_id time_id payment_method customer_id store_id item_count dollars
55 20040106 Credit 123 22 3 $3.54
78 20040106 Cash 89 22 1 $20.00
199 20040107 ATM 3 22 2 $2.99
55 20040106 Cash 122 22 1 $1.18

and suppose we created a dimension table for the values in the payment_method column:

payment_method
Credit
Cash
ATM

This dimension table is fairly pointless. It only has 3 values, adds no additional information, and incurs the cost of an extra join.

Instead, you can create a degenerate dimension. To do this, declare a dimension without a table, and Mondrian will assume that the columns come from the fact table.

<Cube name="Checkout">
<!-- The fact table is always necessary. -->
<Table name="checkout">
<Dimension name="Payment method">
<Hierarchy hasAll="true">
<!-- No table element here. Fact table is assumed. -->
<Level name="Payment method" column="payment_method" uniqueMembers="true"/>
<!-- other dimensions and measures -->
</Cube>

Note that because there is no join, the foreignKey attribute of Dimension is not necessary, and the Hierarchy element has no <Table> child element or primaryKey attribute.

3.3.7 Inline tables 

The <InlineTable> construct allows you to define a dataset in the schema file. You must declare the names of the columns, the column types ("String" or "Numeric"), and a set of rows. As for <Table> and <View>, you must provide a unique alias with which to refer to the dataset.

Here is an example:

<Dimension name="Severity">
<Hierarchy hasAll="true" primaryKey="severity_id">
<InlineTable alias="severity">
<ColumnDef name="id" type="Numeric"/>
<ColumnDef name="desc" type="String"/>
<Row>
<Value column="id">1</Value>
<Value column="desc">High</Value>
</Row>
<Row>
<Value column="id">2</Value>
<Value column="desc">Medium</Value>
</Row>
<Row>
<Value column="id">3</Value>
<Value column="desc">Low</Value>
</Row>
</Rows>
<Level name="Severity" column="id" nameColumn="desc" uniqueMembers="true"/>

This has the same effect as if you had a table called 'severity' in your database:

id desc
1 High
2 Medium
3 Low

and the declaration

<Dimension name="Severity">
<Hierarchy hasAll="true" primaryKey="severity_id">
<Table name="severity"/>
<Level name="Severity" column="id" nameColumn="desc" uniqueMembers="true"/>

To specify a NULL value for a column, omit the <Value> for that column, and the column's value will default to NULL.

3.3.8 Member properties and formatters 

As we shall see later, a level definition can also define member properties and a member formatter.

3.3.9 Approximate level cardinality 

The <Level> element allows specifying the optional attribute "approxRowCount". Specifying approxRowCount can improve performance by reducing the need to determine level, hierarchy, and dimension cardinality. This can have a significant impact when connecting to Mondrian via XMLA.

3.3.10 Default Measure Attribute 

The <Cube> and <VirtualCube> elements allow specifying the optional attribute "defaultMeasure".

Specifying defaultMeasure in <Cube> element allows users to explicitly specify any base measure as a default Measure.

Specifying defaultMeasure in <VirtualCube> element allows users to explicitly specify any VirtualCube Measure as a default Measure.

Note that if a default measure is not specified it takes the first measure defined in the cube as the default measure. In the case of virtual cube, it would pick up the first base measure of the first cube defined within it as the default.

Specifying the defaultMeasure explicitly would be useful in cases where you would want a calculated member to be picked up as the default measure. To facilitate this, the calculated member could be defined in one of the base cubes and specified as the defaultMeasure in the virtual cube.

<Cube name="Sales" defaultMeasure="Unit Sales">
...
<CalculatedMember name="Profit" dimension="Measures">
<Formula>[Measures].[Store Sales] - [Measures].[Store Cost]</Formula>
...
</Cube>
<VirtualCube name="Warehouse and Sales" defaultMeasure="Profit">
...
<VirtualCubeMeasure cubeName="Sales" name="[Measures].[Profit]"/>

3.3.11 Functional Dependency Optimizations 

In some circumstances, it may be possible to optimize performance by taking advantage of known functional dependencies in the data being processed. Such dependencies are typically the result of business rules associated with the systems producing the data, and often cannot be inferred just by looking at the data itself.

Functional dependencies are declared to Mondrian using the dependsOnLevelValue attribute of the <Property> element and the uniqueKeyLevelName attribute of the <Hierarchy> element.

The dependsOnLevelValue attribute of a member property is used to indicate that the value of the member property is functionally dependent on the value of the <Level> in which the member property is defined. In other words, for a given value of the level, the value of the property is invariant.

The uniqueKeyLevelName attribute of a <Hierarchy> is used to indicate that the given level (if any) taken together with all higher levels in the hierarchy acts as a unique alternate key, ensuring that for any unique combination of those level values, there is exactly one combination of values for all levels below it.

To illustrate, consider a hierarchy modeling cars built and licensed in the United States:

<Dimension name="Automotive" foreignKey="auto_dim_id">
<Hierarchy hasAll="true" primaryKey="auto_dim_id" uniqueKeyLevelName="Vehicle Identification Number">
<Table name="automotive_dim"/>
<Level name="Make" column="make_id" type="Numeric"/>
<Level name="Model" column="model_id" type="Numeric"/>
<Level name="ManufacturingPlant" column="plant_id" type="Numeric"/>
<Property name="State" column="plant_state_id" type="Numeric" dependsOnLevelValue="true"/>
<Property name="City" column="plant_city_id" type="Numeric" dependsOnLevelValue="true"/>
<Level name="Vehicle Identification Number" column="vehicle_id" type="Numeric"/>
<Property name="Color" column="color_id" type="Numeric" dependsOnLevelValue="true"/>
<Property name="Trim" column="trim_id" type="Numeric" dependsOnLevelValue="true"/>
<Level name="LicensePlateNum" column="license_id" type="String"/>
<Property name="State" column="license_state_id" type="Numeric" dependsOnLevelValue="true"/>

In the above example, we know that a given manufacturing plant exists only in a single city and state, that a given car only has one color scheme and one trim level, and that the license number is associated with a single state. Therefore, we can state that all of these member properties are functionally dependent on the associated level values.

Additionally, we know that the Vehicle Identification Number uniquely identifies each car, and that each car only has one license. Thus, we know that the combination of Make, Model, Manufacturing Plant, and Vehicle Identification Number uniquely identifies each vehicle; the license number is redundant.

These attributes enable optimization of the GROUP BY clause in the SQL statements Mondrian generates. Absent any functional dependency information, a typical query on the Automotive dimension would look something like:

SELECT
`automotive_dim`.`make_id` AS c0,
`automotive_dim`.`model_id` AS c1,
`automotive_dim`.`plant_id` AS c2,
`automotive_dim`.`plant_state_id` AS c3,
`automotive_dim`.`plant_city_id` AS c4,
`automotive_dim`.`vehicle_id` AS c5,
`automotive_dim`.`color_id` AS c6,
`automotive_dim`.`trim_id` AS c7,
`automotive_dim`.`license_id` AS c8,
`automotive_dim`.`license_state_id` AS c9
FROM
`automotive_dim` AS `automotive_dim`,
GROUP BY
`automotive_dim`.`make_id`,
`automotive_dim`.`model_id`,
`automotive_dim`.`plant_id`,
`automotive_dim`.`plant_state_id`,
`automotive_dim`.`plant_city_id`,
`automotive_dim`.`vehicle_id`,
`automotive_dim`.`color_id`,
`automotive_dim`.`trim_id`,
`automotive_dim`.`license_id`,
`automotive_dim`.`license_state_id`
ORDER BY
`...

Given the functional dependence attributes in the schema example above, however, we know that the query is selecting at a depth that includes the "unique key" level, and that all properties in the query are also functionally dependent on their levels. In such cases the GROUP BY clause is redundant and may be eliminated completely, increasing SQL query performance significantly on some databases:

SELECT
`automotive_dim`.`make_id` AS c0,
`automotive_dim`.`model_id` AS c1,
`automotive_dim`.`plant_id` AS c2,
`automotive_dim`.`plant_state_id` AS c3,
`automotive_dim`.`plant_city_id` AS c4,
`automotive_dim`.`vehicle_id` AS c5,
`automotive_dim`.`color_id` AS c6,
`automotive_dim`.`trim_id` AS c7,
`automotive_dim`.`license_id` AS c8,
`automotive_dim`.`license_state_id` AS c9
FROM
`automotive_dim` AS `automotive_dim`,
ORDER BY
`...

Had the query not been deep enough to include the "unique key" level, or had any of the member properties not been functionally dependent on their level, this optimization would not be possible.

In some cases, a different optimization can be made where there is no "unique key" level, but some or all of the member properties are functionally dependent on their level. Some databases (notably MySQL) permit columns to be listed in the SELECT clause that do not also appear in the GROUP BY clause. On such databases, Mondrian can simply leave the functionally dependent member properties out of the GROUP BY, which may reduce SQL query processing time substantially:

SELECT
`automotive_dim`.`make_id` AS c0,
`automotive_dim`.`model_id` AS c1,
`automotive_dim`.`plant_id` AS c2,
`automotive_dim`.`plant_state_id` AS c3,
`automotive_dim`.`plant_city_id` AS c4,
`automotive_dim`.`vehicle_id` AS c5,
`automotive_dim`.`color_id` AS c6,
`automotive_dim`.`trim_id` AS c7,
`automotive_dim`.`license_id` AS c8,
`automotive_dim`.`license_state_id` AS c9
FROM
`automotive_dim` AS `automotive_dim`,
GROUP BY
`automotive_dim`.`make_id`,
`automotive_dim`.`model_id`,
`automotive_dim`.`plant_id`,
`automotive_dim`.`vehicle_id`,
`automotive_dim`.`license_id`,
ORDER BY
`...

Please note that significant changes are anticipated to the schema syntax in Mondrian 4.0, including a new approach to declaring functional dependencies. While the expectation is that the 4.0 schema processor will maintain backward compatibility with schemas developed for Mondrian 3.1, these are transitional attributes introduced to allow support in the interim, and 4.0 will not be backward compatible with them. Therefore, any schema using these attributes will need to be migrated to the new syntax as part of upgrading to Mondrian 4.0.

3.3.12 Table Hints 

Mondrian supports a limited set of database-specific hints for the <Table> element, which will then be passed on to SQL queries involving the table. These hints are as follows:

Database Hint Type Permitted Values Description
MySQL force_index The name of an index on this table Forces the named index to be used when selecting level values from this table.

For example:

<Table name="automotive_dim">
<Hint type="force_index">my_index</Hint>

As with the functional dependency optimizations, support for table hints is in a transitional stage, and are likely to change in Mondrian 4.0. Any schema using them may need to be migrated to the new schema syntax as part of upgrading to Mondrian 4.0.

4. Star and snowflake schemas 

We saw earlier how to build a cube based upon a fact table, and dimensions in the fact table ("Payment method") and in a table joined to the fact table ("Gender"). This is the most common kind of mapping, and is known as a star schema.

But a dimension can be based upon more than one table, provided that there is a well-defined path to join these tables to the fact table. This kind of dimension is known as a snowflake, and is defined using the <Join> operator. For example:

<Cube name="Sales">
...
<Dimension name="Product" foreignKey="product_id">
<Hierarchy hasAll="true" primaryKey="product_id" primaryKeyTable="product">
<Join leftKey="product_class_key" rightAlias="product_class" rightKey="product_class_id">
<Table name="product"/>
<Join leftKey="product_type_id" rightKey="product_type_id">
<Table name="product_class"/>
<Table name="product_type"/>
</Join>
</Join>
<!-- Level declarations ... -->
</Cube>

This defines a "Product" dimension consisting of three tables. The fact table joins to "product" (via the foreign key "product_id"), which joins to "product_class" (via the foreign key "product_class_id"), which joins to " product_type" (via the foreign key "product_type_id"). We require a <Join> element nested within a <Join> element because <Join> takes two operands; the operands can be tables, joins, or even queries.

The arrangement of the tables seems complex; the simple rule of thumb is to order the tables by the number of rows they contain. The "product" table has the most rows, so it joins to the fact table and appears first; "product_class" has fewer rows, and "product_type", at the tip of the snowflake, has least of all.

Note that the outer <Join> element has a rightAlias attribute. This is necessary because the right component of the join (the inner <Join> element) consists of more than one table. No leftAlias attribute is necessary in this case, because the leftKey column unambiguously comes from the "product" table.

4.1 Shared dimensions 

When generating the SQL for a join, Mondrian needs to know which column to join to. If you are joining to a join, then you need to tell it which of the tables in the join that column belongs to (usually it will be the first table in the join).

Because shared dimensions don't belong to a cube, you have to give them an explicit table (or other data source). When you use them in a particular cube, you specify the foreign key. This example shows the Store Type dimension being joined to the Sales cube using the sales_fact_1997.store_id foreign key, and to the Warehouse cube using the warehouse.warehouse_store_id foreign key:

<Dimension name="Store Type">
<Hierarchy hasAll="true" primaryKey="store_id">
<Table name="store"/>
<Level name="Store Type" column="store_type" uniqueMembers="true"/>

<Cube name="Sales">
<Table name="sales_fact_1997"/>
...
<DimensionUsage name="Store Type" source="Store Type" foreignKey="store_id"/>
</Cube>

<Cube name="Warehouse">
<Table name="warehouse"/>
...
<DimensionUsage name="Store Type" source="Store Type" foreignKey="warehouse_store_id"/>
</Cube>

4.2 Join optimization 

The table mapping in the schema tells Mondrian how to get the data, but Mondrian is smart enough not to read the schema literally. It applies a number of optimizations when generating queries:

  • TODO: describe large dimension support
  • If a dimension (or, more precisely, the level of the dimension being accessed) is in the fact table, Mondrian does not perform a join.
  • If two dimensions access the same table via the same join path, Mondrian only joins them once. For example, [Gender] and [Age] might both be columns in the customers table, joined via sales_1997.cust_id = customers.cust_id.

5. Advanced logical constructs 

5.1 Virtual cubes 

A virtual cube combines two or more regular cubes. It is defined by the <VirtualCube> element:

<VirtualCube name="Warehouse and Sales">
<CubeUsage cubeName="Sales" ignoreUnrelatedDimensions="true"/>
<CubeUsage cubeName="Warehouse"/>
<VirtualCubeDimension cubeName="Sales" name="Customers"/>
<VirtualCubeDimension cubeName="Sales" name="Education Level"/>
<VirtualCubeDimension cubeName="Sales" name="Gender"/>
<VirtualCubeDimension cubeName="Sales" name="Marital Status"/>
<VirtualCubeDimension name="Product"/>
<VirtualCubeDimension cubeName="Sales" name="Promotion Media"/>
<VirtualCubeDimension cubeName="Sales" name="Promotions"/>
<VirtualCubeDimension name="Store"/>
<VirtualCubeDimension name="Time"/>
<VirtualCubeDimension cubeName="Sales" name="Yearly Income"/>
<VirtualCubeDimension cubeName="Warehouse" name="Warehouse"/>
<VirtualCubeMeasure cubeName="Sales" name="[Measures].[Sales Count]"/>
<VirtualCubeMeasure cubeName="Sales" name="[Measures].[Store Cost]"/>
<VirtualCubeMeasure cubeName="Sales" name="[Measures].[Store Sales]"/>
<VirtualCubeMeasure cubeName="Sales" name="[Measures].[Unit Sales]"/>
<VirtualCubeMeasure cubeName="Sales" name="[Measures].[Profit Growth]"/>
<VirtualCubeMeasure cubeName="Warehouse" name="[Measures].[Store Invoice]"/>
<VirtualCubeMeasure cubeName="Warehouse" name="[Measures].[Supply Time]"/>
<VirtualCubeMeasure cubeName="Warehouse" name="[Measures].[Units Ordered]"/>
<VirtualCubeMeasure cubeName="Warehouse" name="[Measures].[Units Shipped]"/>
<VirtualCubeMeasure cubeName="Warehouse" name="[Measures].[Warehouse Cost]"/>
<VirtualCubeMeasure cubeName="Warehouse" name="[Measures].[Warehouse Profit]"/>
<VirtualCubeMeasure cubeName="Warehouse" name="[Measures].[Warehouse Sales]"/>
<VirtualCubeMeasure cubeName="Warehouse" name="[Measures].[Average Warehouse Sale]"/>
<CalculatedMember name="Profit Per Unit Shipped" dimension="Measures">
<Formula>[Measures].[Profit] / [Measures].[Units Shipped]</Formula>

The <CubeUsages> element is optional. It specifies the cubes that are imported into the virtual cube. Holds CubeUsage elements.

The <CubeUsage> element is optional. It specifies the base cube that is imported into the virtual cube. Currently it is possible to define a VirtualCubeMeasure and similar imports from a base cube without defining CubeUsage for the cube. The cubeName attribute specifies the base cube being imported. The ignoreUnrelatedDimensions attribute specifies that the measures from this base cube will have non joining dimension members pushed to the top level member. This behaviour is currently supported for aggregation. This attribute is by default false. ignoreUnrelatedDimensions is an experimental feature similar to the similarly named feature in SSAS 2005. MSDN documentation mentions "When IgnoreUnrelatedDimensions is true, unrelated dimensions are forced to their top level; when the value is false, dimensions are not forced to their top level. This property is similar to the Multidimensional Expressions (MDX) ValidMeasure function". Current Mondrian implementation of ignoreUnrelatedDimensions depends on use of ValidMeasure. E.g. If we want to apply this behaviour to "Unit Sales" measure in the "Warehouse and Sales" virtual cube then we need to define a CubeUsage entry for "Sales" cube as shown in the example above and also wrap this measure with ValidMeasure.

The <VirtualCubeDimension> element imports a dimension from one of the constituent cubes. If you do not specify the cubeName attribute, this means you are importing a shared dimension. (If a shared dimension is used more than once in a cube, there is no way, at present, to disambiguate which usage of the shared dimension you intend to import.)

The <VirtualCubeMeasure> element imports a measure from one of the constituent cubes. It is imported with the same name. If you want to create a formula, or just to rename a measure as you import it, use the <CalculatedMember> element.

Virtual cubes occur surprisingly frequently in real-world applications. They occur when you have fact tables of different granularities (say one measured at the day level, another at the month level), or fact tables of different dimensionalities (say one on Product, Time and Customer, another on Product, Time and Warehouse), and want to present the results to an end-user who doesn't know or care how the data is structured.

Any common dimensions -- shared dimensions which are used by both constituent cubes -- are automatically synchronized. In this example, [Time] and [Product] are common dimensions. So if the context is ([Time].[1997].[Q2], [Product].[Beer].[Miller Lite]), measures from either cube will relate to this context.

Dimensions which only belong to one cube are called non-conforming dimensions. The [Gender] dimension is an example of this: it exists in the Sales cube but not Warehouse. If the context is ([Gender].[F], [Time].[1997].[Q1]), it makes sense to ask the value of the [Unit Sales] measure (which comes from the [Sales] cube) but not the [Units Ordered] measure (from [Warehouse]). In the context of [Gender].[F], [Units Ordered] has value NULL.

5.2 Parent-child hierarchies 

A conventional hierarchy has a rigid set of levels, and members which adhere to those levels. For example, in the Product hierarchy, any member of the Product Name level has a parent in the Brand Name level, which has a parent in the Product Subcategory level, and so forth. This structure is sometimes too rigid to model real-world data.

A parent-child hierarchy has only one level (not counting the special 'all' level), but any member can have parents in the same level. A classic example is the reporting structure in the Employees hierarchy:

<Dimension name="Employees" foreignKey="employee_id">
<Hierarchy hasAll="true" allMemberName="All Employees" primaryKey="employee_id">
<Table name="employee"/>
<Level name="Employee Id" uniqueMembers="true" type="Numeric" column="employee_id" nameColumn="full_name" parentColumn="supervisor_id" nullParentValue="0">
<Property name="Marital Status" column="marital_status"/>
<Property name="Position Title" column="position_title"/>
<Property name="Gender" column="gender"/>
<Property name="Salary" column="salary"/>
<Property name="Education Level" column="education_level"/>
<Property name="Management Role" column="management_role"/>

The important attributes here are parentColumn and nullParentValue:

  • The parentColumn attribute is the name of the column which links a member to its parent member; in this case, it is the foreign key column which points to an employee's supervisor. The <ParentExpression> child element of <Level> is equivalent to the parentColumn attribute, but allows you to define an arbitrary SQL expression, just like the <Expression> element. The parentColumn attribute (or <ParentExpression> element) is the only indication to Mondrian that a hierarchy has a parent-child structure.
  • The nullParentValue attribute is the value which indicates that a member has no parent. The default is nullParentValue="null", but since many database don't index null values, schema designers sometimes use values as the empty string, 0, and -1 instead.

5.2.1 Tuning parent-child hierarchies 

There's one serious problem with the parent-child hierarchy defined above, and that is the amount of work Mondrian has to do in order to compute cell-totals. Let's suppose that the employee table contains the following data:

employee
supervisor_id employee_id full_name
null 1 Frank
1 2 Bill
2 3 Eric
1 4 Jane
3 5 Mark
2 6 Carla

If we want to compute the total salary budget for Bill, we need to add in the salaries of Eric and Carla (who report to Bill) and Mark (who reports to Eric). Usually Mondrian generates a SQL GROUP BY statement to compute these totals, but there is no (generally available) SQL construct which can traverse hierarchies. So by default, Mondrian generates one SQL statement per supervisor, to retrieve and total all of that supervisor's direct reports.

This approach has a couple of drawbacks. First, the performance is not very good if a hierarchy contains more than a hundred members. Second, because Mondrian implements the distinct-count aggregator by generating SQL, you cannot define a distinct-count measure in any cube which contains a parent-child hierarchy.

How can we solve these problems? The answer is to enhance the data so that Mondrian is able to retrieve the information it needs using standard SQL. Mondrian supports a mechanism called a closure table for this purpose.

5.2.2 Closure tables 

A closure table is a SQL table which contains a record for every employee/supervisor relationship, regardless of depth. (In mathematical terms, this is called the 'reflexive transitive closure' of the employee/supervisor relationship. The distance column is not strictly required, but it makes it easier to populate the table.)

employee_closure
supervisor_id employee_id distance
1 1 0
1 2 1
1 3 2
1 4 1
1 5 3
1 6 2
2 2 0
2 3 1
2 5 2
2 6 1
3 3 0
3 5 1
4 4 0
5 5 0
6 6 0

In the catalog XML, the <Closure> element maps the level onto a <Table>:

<Dimension name="Employees" foreignKey="employee_id">
<Hierarchy hasAll="true" allMemberName="All Employees" primaryKey="employee_id">
<Table name="employee"/>
<Level name="Employee Id" uniqueMembers="true" type="Numeric"
column="employee_id" nameColumn="full_name" parentColumn="supervisor_id" nullParentValue="0">
<Closure parentColumn="supervisor_id" childColumn="employee_id">
<Table name="employee_closure"/>
<Property name="Marital Status" column="marital_status"/>
<Property name="Position Title" column="position_title"/>
<Property name="Gender" column="gender"/>
<Property name="Salary" column="salary"/>
<Property name="Education Level" column="education_level"/>
<Property name="Management Role" column="management_role"/>

This table allows totals to be evaluated in pure SQL. Even though this introduces an extra table into the query, database optimizers are very good at handling joins. I recommend that you declare both supervisor_id and employee_id NOT NULL, and index them as follows:

CREATE UNIQUE INDEX employee_closure_pk ON employee_closure (
   supervisor_id,
   employee_id);
CREATE INDEX employee_closure_emp ON employee_closure (
   employee_id);

5.2.3 Populating closure tables 

The table needs to be re-populated whenever the hierarchy changes, and it is the application's responsibility to do so — Mondrian does not do this!

If you are using Pentaho Data Integration (Kettle), there is a special step to populate closure tables as part of the ETL process. Further details in the Pentaho Data Integration wiki.

Closure Generator step in Pentaho Data Integration

Closure Generator step in Pentaho Data Integration

If you are not using Pentaho Data Integration, you can populate the table yourself using SQL. Here is an example of a MySQL stored procedure that populates a closure table.

DELIMITER //

CREATE PROCEDURE populate_employee_closure()
BEGIN
  DECLARE distance int;
  TRUNCATE TABLE employee_closure;
  SET distance = 0;
  -- seed closure with self-pairs (distance 0)
  INSERT INTO employee_closure (supervisor_id, employee_id, distance)
    SELECT employee_id, employee_id, distance
      FROM employee;

  -- for each pair (root, leaf) in the closure,
  -- add (root, leaf->child) from the base table

  REPEAT
    SET distance = distance + 1;
    INSERT INTO employee_closure (supervisor_id, employee_id, distance)
      SELECT employee_closure.supervisor_id, employee.employee_id, distance
        FROM employee_closure, employee
          WHERE employee_closure.employee_id = employee.supervisor_id
          AND employee_closure.distance = distance - 1;
  UNTIL (ROW_COUNT() == 0))
  END REPEAT;
END //

DELIMITER ;

5.3 Member properties 

Member properties are defined by the <Property> element within a <Level>, like this:

<Level name="MyLevel" column="LevelColumn" uniqueMembers="true">
<Property name="MyProp" column="PropColumn" formatter="com.example.MyPropertyFormatter"/>

The formatter attribute defines a property formatter , which is explained later.

Once properties have been defined in the schema, you can use them in MDX statements via the member.Properties("propertyName") function, for example:

SELECT {[Store Sales]} ON COLUMNS,
  TopCount(Filter([Store].[Store Name].Members,
                  [Store].CurrentMember.Properties("Store Type") = "Supermarket"),
           10,
           [Store Sales]) ON ROWS
FROM [Sales]

Mondrian deduces the type of the property expression, if it can. If the property name is a constant string, the type is based upon the type attribute ("String", "Numeric" or "Boolean") of the property definition. If the property name is an expression (for example CurrentMember.Properties("Store " + "Type")), Mondrian will return an untyped value.

5.4 Calculated members 

Suppose you want to create a measure whose value comes not from a column of the fact table, but from an MDX formula. One way to do this is to use a WITH MEMBER clause, like this:

WITH MEMBER [Measures].[Profit] AS '[Measures].[Store Sales]-[Measures].[Store Cost]',
   FORMAT_STRING = '$#,###'
SELECT {[Measures].[Store Sales], [Measures].[Profit]} ON COLUMNS,
  {[Product].Children} ON ROWS
FROM [Sales]
WHERE [Time].[1997]

But rather than including this clause in every MDX query of your application, you can define the member in your schema, as part of your cube definition:

<CalculatedMember name="Profit" dimension="Measures">
<Formula>[Measures].[Store Sales] - [Measures].[Store Cost]</Formula>
<CalculatedMemberProperty name="FORMAT_STRING" value="$#,##0.00"/>

You can also declare the formula as an XML attribute, if you prefer. The effect is just the same.

<CalculatedMember name="Profit" dimension="Measures" formula="[Measures].[Store Sales]-[Measures].[Store Cost]">
<CalculatedMemberProperty name="FORMAT_STRING" value="$#,##0.00"/>

Note that the <CalculatedMemberProperty> (not <Property>) element corresponds to the FORMAT_STRING = '$#,###' fragment of the MDX statement. You can define other properties here too, but FORMAT_STRING is by far the most useful in practice.

The FORMAT_STRING property value can also be evaluated using an expression. When formatting a particular cell, first the expression is evaluated to yield a format string, then the format string is applied to the cell value. Here is the same property with a conditional format string:

<CalculatedMemberProperty name="FORMAT_STRING" expression="Iif(Value < 0, '|($#,##0.00)|style=red', '|$#,##0.00|style=green')"/>

For more details about format strings, see the MDX specification.

One additional calculated member property that is worth mentioning is DATATYPE. As with measures, setting datatype specifies how the calculated member is returned via XML for Analysis. The DATATYPE property of a calculated member can have values "String", "Integer", or "Numeric":

<CalculatedMemberProperty name="DATATYPE" value="Numeric"/>

You can specify SOLVE_ORDER for the calculated member property. Solve order determines the priority of calculation in the event of competing expressions

<CalculatedMemberProperty name="SOLVE_ORDER" value="2000"/>

You can make a calculated member or a measure invisible. If you specify visible="false" (the default is "true") in the <Measure> or <CalculatedMember> element, user-interfaces such as JPivot will notice this property and hide the member. This is useful if you want to perform calculations in a number of steps, and hide intermediate steps from end-users. For example, here only "Margin per Sqft" is visible, and its factors "Store Cost", "Margin" and "Store Sqft" are hidden:

<Measure name="Store Cost" column="store_cost" aggregator="sum" formatString="#,###.00" visible="false"/>
<CalculatedMember name="Margin" dimension="Measures" visible="false">
<Formula>([Measures].[Store Sales] - [Measures].[Store Cost]) / [Measures].[Store Cost]</Formula>
<CalculatedMember name="Store Sqft" dimension="Measures" visible="false">
<Formula>IIF([Store].CurrentMember.Level.Name = "Store Name", [Store].Properties("Store Sqft"), NULL)</Formula>
<CalculatedMember name="Margin per Sqft" dimension="Measures" visible="true">
<Formula>[Measures].[Margin] / [Measures].[Store Cost]</Formula>
<CalculatedMemberProperty name="FORMAT_STRING" value="$#,##0.00"/>

5.5 Named sets 

The WITH SET clause of an MDX statement allows you to declare a set expression which can be used throughout that query. For example,

WITH SET [Top Sellers] AS
    'TopCount([Warehouse].[Warehouse Name].MEMBERS, 5, [Measures].[Warehouse Sales])'
SELECT
    {[Measures].[Warehouse Sales]} ON COLUMNS,
    {[Top Sellers]} ON ROWS
FROM [Warehouse]
WHERE [Time].[Year].[1997]

The WITH SET clause is very similar to the WITH MEMBER clause, and as you might expect, it has a construct in schema analogous to <CalculatedMember>. The <NamedSet> element allows you to define a named set in your schema as part of a cube definition. It is implicitly available for any query against that cube:

<Cube name="Warehouse">
...
<NamedSet name="Top Sellers">
<Formula>TopCount([Warehouse].[Warehouse Name].MEMBERS, 5, [Measures].[Warehouse Sales])</Formula>
</Cube>

SELECT
    {[Measures].[Warehouse Sales]} ON COLUMNS,
    {[Top Sellers]} ON ROWS
FROM [Warehouse]
WHERE [Time].[Year].[1997]
Warehouse Warehouse Sales
Treehouse Distribution 31,116.37
Jorge Garcia, Inc. 30,743.77
Artesia Warehousing, Inc. 29,207.96
Jorgensen Service Storage 22,869.79
Destination, Inc. 22,187.42

A named set defined against a cube is not inherited by a virtual cube defined against that cube. (But you can define a named set against a virtual cube.)

You can also define a named set as global to a schema:

<Cube name="Sales" ... />
<Cube name="Warehouse" ... />
<VirtualCube name="Warehouse and Sales" .../>
<NamedSet name="CA Cities" formula="{[Store].[USA].[CA].Children}"/>
<NamedSet name="Top CA Cities">
<Formula>TopCount([CA Cities], 2, [Measures].[Unit Sales])</Formula>

A named set defined against a schema is available in all cubes and virtual cubes in that schema. However, it is only valid if the cube contains dimensions with the names required to make the formula valid. For example, it would be valid to use [CA Cities] in queries against the [Sales] and [Warehouse and Sales] cubes, but if you used it in a query against the [Warehouse] cube you would get an error, because [Warehouse] does not have a [Store] dimension.

6. Plug-ins 

Sometimes Mondrian's schema language isn't flexible enough, or the MDX language isn't powerful enough, to solve the problem at hand. What you want to do is add a little of your own Java code into the Mondrian application, and a plug-in is a way to do this.

Each of Mondrian's extensions is technically a Service Provider Interface (SPI); in short, a Java interface which you write code to implement, and which Mondrian will call at runtime. You also need to register an extension (usually somewhere in your schema.xml file) and to ensure that it appears on the classpath.

Plug-ins include user-defined functions; cell, member and property formatters; dynamic schema processors and data source change listeners. There is incomplete support for member readers and cell readers, and in future we may support pluggable SQL dialects.

Some plug-ins (user-defined function, member formatter, property formatter, cell formatter) can be implemented in a scripting language such as JavaScript. In this case, you do not need to write a Java class; you just enclose the script code within a Script element in the mondrian schema file. Extensions implemented in scripting languages do not in general perform as well as extensions implemented in Java, but they are much more convenient because you do not need to compile any code. Just modify the script code in the mondrian schema file and re-load the schema. The shorter code-debug-fix cycle allows you to develop your application much faster. Once you have implemented the plug-in in script, if performance is still a concern, you can translate your plug-in into Java.

Other extensions include Dynamic datasource xmla servlet.

6.1 User-defined function 

A user-defined function must have a public constructor and implement the mondrian.spi.UserDefinedFunction interface. For example,

package com.example;

import mondrian.olap.*;
import mondrian.olap.type.*;
import mondrian.spi.UserDefinedFunction;

/**
 * A simple user-defined function which adds one to its argument.
 */
public class PlusOneUdf implements UserDefinedFunction {
    // public constructor
    public PlusOneUdf() {
    }

    public String getName() {
        return "PlusOne";
    }

    public String getDescription() {
        return "Returns its argument plus one";
    }

    public Syntax getSyntax() {
        return Syntax.Function;
    }

    public Type getReturnType(Type[] parameterTypes) {
        return new NumericType();
    }

    public Type[] getParameterTypes() {
        return new Type[] {new NumericType()};
    }

    public Object execute(Evaluator evaluator, Exp[] arguments) {
        final Object argValue = arguments[0].evaluateScalar(evaluator);
        if (argValue instanceof Number) {
            return new Double(((Number) argValue).doubleValue() + 1);
        } else {
            // Argument might be a RuntimeException indicating that
            // the cache does not yet have the required cell value. The
            // function will be called again when the cache is loaded.
            return null;
        }
    }

    public String[] getReservedWords() {
        return null;
    }
}

Declare it in your schema:

...
<UserDefinedFunction name="PlusOne" className="com.example.PlusOneUdf"/>

And use it in any MDX statement:

WITH MEMBER [Measures].[Unit Sales Plus One]
    AS 'PlusOne([Measures].[Unit Sales])'
SELECT
    {[Measures].[Unit Sales]} ON COLUMNS,
    {[Gender].MEMBERS} ON ROWS
FROM [Sales]

If a user-defined function has a public constructor with one string argument, Mondrian will pass in the function's name. Why? This allows you to define two or more user-defined functions using the same class:

package com.example;

import mondrian.olap.*;
import mondrian.olap.type.*;
import mondrian.spi.UserDefinedFunction;

/**
 * A user-defined function which either adds one to or
 * subtracts one from its argument.
 */
public class PlusOrMinusOneUdf implements UserDefinedFunction {
    private final name;
    private final isPlus;

    // public constructor with one argument
    public PlusOneUdf(String name) {
        this.name = name;
        if (name.equals("PlusOne")) {
            isPlus = true;
        } else if (name.equals("MinusOne")) {
            isPlus = false;
        } else {
            throw new IllegalArgumentException("Unexpected name " + name);
        }
    }

    public String getName() {
        return name;
    }

    public String getDescription() {
        return "Returns its argument plus or minus one";
    }

    public Syntax getSyntax() {
        return Syntax.Function;
    }

    public Type getReturnType(Type[] parameterTypes) {
        return new NumericType();
    }

    public Type[] getParameterTypes() {
        return new Type[] {new NumericType()};
    }

    public Object execute(Evaluator evaluator, Exp[] arguments) {
        final Object argValue = arguments[0].evaluateScalar(evaluator);
        if (argValue instanceof Number) {
            if (isPlus) {
                return new Double(((Number) argValue).doubleValue() + 1);
            } else {
                return new Double(((Number) argValue).doubleValue() - 1);
            }
        } else {
            // Argument might be a RuntimeException indicating that
            // the cache does not yet have the required cell value. The
            // function will be called again when the cache is loaded.
            return null;
        }
    }

    public String[] getReservedWords() {
        return null;
    }
}

and register two the functions in your schema:

...
<UserDefinedFunction name="PlusOne" className="com.example.PlusOrMinusOneUdf">
<UserDefinedFunction name="MinusOne" className="com.example.PlusOrMinusOneUdf">

If you're tired of writing duplicate user-defined function declarations in schema files, you can pack your user-defined function implemention classes into a jar file with a embedded META-INF/services/mondrian.spi.UserDefinedFunction resource file. This resource file contains class names of implementations of interface mondrian.spi.UserDefinedFunction, one name per line. For more details, you may look into src/main/META-INF/services/mondrian.spi.UserDefinedFunction in the source distribution and the Service Provider section of the specification of JAR files. User-defined functions declared by this means are available to all mondrian schemas in the JVM.

Caution: you can't define more than one user-defined function implementations in one class when you declare user-defined functions in this way. One function will be loaded for each class, and given the name that the getName() method returns.

User-defined functions can also be implemented in a scripting language, such as JavaScript. These functions may not perform quite as well as Java UDFs or built-in functions, but they are a lot more convenient to implement.

To define a UDF in script, use the Script element and include within it the followimg functions:

  • getName()
  • getDescription()
  • getSyntax()
  • getParameterTypes()
  • getReturnType(parameterTypes)
  • execute(evaluator, arguments)

The getName(), getDescription(), getReservedWords() and getSyntax() methods are optional; getName() defaults to the name attribute in the UserDefinedFunction element, getDescription() defaults to the name, getReservedWords() returns the empty list, and getSyntax() defaults to mondrian.olap.Syntax.Function. The other methods have similar meanings to the ones in the UserDefinedFunction SPI.

Here is an example of the factorial function as a JavaScript UDF:

<UserDefinedFunction name="Factorial">
<Script language="JavaScript">
function getParameterTypes() {
return new Array(new mondrian.olap.type.NumericType());
}
function getReturnType(parameterTypes) {
return new mondrian.olap.type.NumericType();
}
function execute(evaluator, arguments) {
var n = arguments[0].evaluateScalar(evaluator);
return factorial(n);
}
function factorial(n) {
return n <= 1 ? 1 : n * factorial(n - 1);
}

6.2 Member reader 

A member reader is a means of accessing members. Hierarchies are usually based upon a dimension table (an 'arm' of a star schema), and are therefore populated using SQL. But even if your data doesn't reside in an RDBMS, you can make it appear as a hierarchy by writing a Java class called a custom member reader.

Here are a couple of examples:

  1. DateSource (to be written) generates a time hierarchy. Conventionally, data warehouse implementors generate a table containing a row for every date their system is ever likely to deal with. But the problem is that this table needs to be loaded, and as time goes by, they will have to remember to add more rows. DateSource generates date members in memory, and on demand.
  2. FileSystemSource (to be written) presents the file system as a hierarchy of directories and files. Since a directory can have a parent which is itself a directory, it is a parent-child hierarchy. Like the time hierarchy created by DateSource, this is a virtual hierarchy: the member for a particular file is only created when, and if, that file's parent directory is expanded.
  3. ExpressionMemberReader (to be written) creates a hierarchy based upon an expression.

A custom member reader must implement the mondrian.rolap.MemberSource interface. If you need to implement a larger set of member operations for fine-grained control, implement the derived mondrian.rolap.MemberReader interface; otherwise, Mondrian wrap your reader in a mondrian.rolap.CacheMemberReader object. Your member reader must have a public constructor which takes ( RolapHierarchy, Properties) parameters, and throws no checked exceptions.

Member readers are declared using the <Hierarchy> element's memberReaderClass attribute; any <Parameter> child elements are passed via the properties constructor parameter. Here is an example:

<Dimension name="Has bought dairy">
<Hierarchy hasAll="true" memberReaderClass="mondrian.rolap.HasBoughtDairySource">
<Level name="Has bought dairy" uniqueMembers="true"/>
<Parameter name="expression" value="not used"/>

6.3 Cell reader 

Not implemented yet. Syntax would be something like

<Measure name="name" cellReaderClass="com.example.MyCellReader"/>

and the class "com.example.MyCellReader" would have to implement the mondrian.olap.CellReader interface.

6.4 Cell formatter 

A cell formatter modifies the behavior of Cell.getFormattedValue(). The class must implement the mondrian.spi.CellFormatter interface, and is specified like this:

<Measure name="name">
<CellFormatter className="com.example.MyCellFormatter"/>

(The previous syntax, using the 'formatter' attribute of the Measure element, is deprecated, and will be removed in mondrian-4.0.)

You can specify a formatter in a scripting language such as JavaScript, using the Script element:

<Measure name="name">
<Script language="JavaScript">

The script has available a value variable, corresponding to the parameter of the mondrian.spi.CellFormatter.formatCell(Object value) method. The code fragment can have multiple statements, but must end in a return statement.

For a calculated member that belongs to a cube or virtual cube, you can also use the CellFormatter element:

<CalculatedMember name="name" dimension="dimension">
[Measures].[Unit Sales] * 2
<Script language="JavaScript">
var s = value.toString();
while (s.length() < 20) {
s = "0" + s;
}
return s;

You can also define a formatter by setting the CELL_FORMATTER property of the member to the name of the formatter class.

<CalculatedMember name="name" formatter="com.example.MyCellFormatter">
<CalculatedMemberProperty name="CELL_FORMATTER" value="com.example.MyCellFormatter"/>

For a calculated measure defined in the WITH MEMBER clause of an MDX query, you can set the same property in the MDX to achieve the same effect:

WITH MEMBER [Measures].[Foo]
  AS '[Measures].[Unit Sales] * 2',
   CELL_FORMATTER='com.example.MyCellFormatter'
SELECT {[Measures].[Unit Sales], [Measures].[Foo]} ON COLUMNS,
    {[Store].Children} ON ROWS
FROM [Sales]

To define a scripted formatter, use the CELL_FORMATTER_SCRIPT and CELL_FORMATTER_SCRIPT_LANGUAGE properties:

WITH MEMBER [Measures].[Foo]
  AS '[Measures].[Unit Sales] * 2',
   CELL_FORMATTER_SCRIPT_LANGUAGE='JavaScript',
   CELL_FORMATTER_SCRIPT='var s = value.toString(); while (s.length() < 20) s = "0" + s; return s;'
SELECT {[Measures].[Unit Sales], [Measures].[Foo]} ON COLUMNS,
    {[Store].Children} ON ROWS
FROM [Sales]

The cell formatter property is ignored if a member does not belong to the [Measures] dimension.

6.5 Member formatter 

A member formatter modifies the behavior of Member.getCaption(). The class must implement the mondrian.spi.MemberFormatter interface, and is specified like this:

<Level name="name" column="column">
<MemberFormatter className="com.example.MyMemberFormatter"/>

(The previous syntax, using the 'formatter' attribute of the Level element, is deprecated, and will be removed in mondrian-4.0.)

You can specify a formatter in a scripting language such as JavaScript, using the Script element:

<Level name="name" column="column">
<Script language="JavaScript">
return member.getName().toUpperCase();

The script has available a member variable, corresponding to the parameter of the mondrian.spi.MemberFormatter.formatMember(Member member) method. The code fragment can have multiple statements, but must end in a return statement.

6.6 Property formatter 

A property formatter modifies the behavior of Property.getPropertyFormattedValue(). The class must implement the mondrian.spi.PropertyFormatter interface, and is specified like this:

<Level name="MyLevel" column="LevelColumn" uniqueMembers="true">
<Property name="MyProp" column="PropColumn">
<PropertyFormatter className="com.example.MyPropertyFormatter"/>

(The previous syntax, using the 'formatter' attribute of the Property element, is deprecated, and will be removed in mondrian-4.0.)

You can specify a formatter in a scripting language such as JavaScript, using the Script element:

<Level name="name" column="column">
<Property name="MyProp" column="PropColumn">
<Script language="JavaScript">
return member.getName().toUpperCase();

The script has available member, propertyName and propertyValue variables, corresponding to the parameters of the mondrian.spi.PropertyFormatter.formatProperty(Member member, String propertyName, Object propertyValue) method. The code fragment can have multiple statements, but must end in a return statement.

6.7 Schema processor 

A schema processor implements the mondrian.spi.DynamicSchemaProcessor interface. It is specified as part of the connection string, like this:

Jdbc=jdbc:odbc:MondrianFoodMart; JdbcUser=ziggy; JdbcPassword=stardust; DynamicSchemaProcessor=com.example.MySchemaProcessor

The effect is that when reading the contents of the schema from a URL, Mondrian turns to the schema processor rather than Java's default URL handler. This gives the schema reader the opportunity to run a schema through a filter, or even generate an entire schema on the fly.

When DynamicSchemaProcessor is specified, schema would be processed and reloaded on every ROLAP connection request. Property UseContentChecksum should be used along with a schema processor to enable caching of the schema:

DataSource=java:/jdbc/MyWarehouse; DynamicSchemaProcessor=com.example.MySchemaProcessor; UseContentChecksum=true

In this case once loaded schema would be cached until it's change. If schema content has changed, it would be reloaded (and processed).

Dynamic schemas are a very powerful construct. As we shall see, an important application for them is internationalization.

6.8 Data source change listener 

A data source change listener implements the mondrian.spi.DataSourceChangeListener interface. It is specified as part of the connection string, like this:

Jdbc=jdbc:odbc:MondrianFoodMart; JdbcUser=ziggy; JdbcPassword=stardust; DataSourceChangeListener=com.example.MyChangeListener;

Everytime mondrian has to decide whether it will use data from cache, it will call the change listener. When the change listener tells mondrian the datasource has changed for a dimension, cube, ... then mondrian will flush the cache and read from database again.

This class should be called in mondrian before any data is read, so even before cache is build. This way, the plugin is able to register the first timestamp mondrian tries to read the datasource.

Each time a query is started, aggregate cache is checked to see if it has changed. If so, cache will be flushed and aggregates will be reloaded from the data source.

Here is an example of a data source change listener plugin class:

 package com.example;

 //...
 import javax.sql.DataSource;
 import java.sql.Connection;
 import java.sql.ResultSet;
 import java.sql.SQLException;
 import java.sql.Timestamp;
 //...
 import mondrian.olap.MondrianDef;
 import mondrian.rolap.RolapHierarchy;
 import mondrian.rolap.RolapUtil;
 import mondrian.rolap.agg.Aggregation;
 import mondrian.rolap.RolapStar;
 import mondrian.spi.impl.DataSourceChangeListenerImpl;
 //...

 public class MyChangeListener extends DataSourceChangeListenerImpl {
     public MyChangeListener() {
     }
     public synchronized boolean isHierarchyChanged(RolapHierarchy hierarchy) {

         // Since this function is called many times, it is a good idea to not check the database every time
         // And use some sort of time interval...

         // Get name of the table (does not work if based on view)
         String tableName = getTableName(hierarchy);
         Connection jdbcConnection = null;
 
         DataSource dataSource =
         hierarchy.getRolapSchema().getInternalConnection().getDataSource();
 
         try {
             jdbcConnection = dataSource.getConnection();
             if (jdbcConnection != null) {
                 // Check database whether hierarchy data source has changed
                 // ...
             }
         }
     }
     
     public synchronized boolean isAggregationChanged(Aggregation aggregation) {

         // The first time, register star and bitKey and remember first time of access...
         RolapStar star = aggregation.getStar();
         BitKey bitKey = aggregation.getConstrainedColumnsBitKey();
         
         // The first time this function is called, only the bitKey is set,
         // the columns are not filled up yet.
         RolapStar.Column[] columns = aggregation.getColumns();
         if (columns != null) {
             // Check database...
         }
     }
 }

6.9 Dynamic datasource xmla servlet 

The DynamicDatasourceXmlaServlet extends DefaultXmlaServlet, adding the ability to dynamically load the datasources.xml file. For every client request that it receives, it checks for updates to the content of datasources.xml. It selectively clears cache for catalogs that have changed or no longer exist in datasources.xml. The servlet considers a catalog as changed when either of its properties (DataSourceInfo, definition properties on DataSourcesConfig.Catalog) are different. It identifies catalog by name.

This servlet complements the dynamic catalog loading capability based on UseContentChecksum. It does not check the catalog content for updates. There is no overlap in the functionality. Both together will give full dynamic datasource and catalog configuration capability.

To use DynamicDatasourceXmlaServlet, change definition of the MondrianXmlaServlet servlet in web.xml:

<servlet>
   <servlet-name>MondrianXmlaServlet</servlet-name>
   <servlet-class>mondrian.xmla.impl.DynamicDatasourceXmlaServlet</servlet-class>
    ...
</servlet>

This implementation has a limitation. It requires catalog name to be unique across all datasources and may not work correctly otherwise.

7. Internationalization 

An internationalized Mondrian application would have a schema for each language, where the caption of each object appears in the local language. For example, the [Product] dimension would have the caption "Product" in English and "Produit" in French.

It is unwise to translate the actual names of the schema objects, because then the MDX statements would need to be changed also. All that you need to change is the caption. Every schema object (schema, cube, virtual cube, dimension, hierarchy, level, measure, named set) has a caption attribute, and user interfaces such as JPivot and Pentaho Analyzer display the caption rather than the real name. Additionally:

  • Every schema object has a description attribute.
  • A hierarchy can have an allMemberCaption attribute as display value of the "All" member.
  • For the schema we can set a display value of the "measures" dimension by the measuresCaption attribute.
  • A calculated member has properties CAPTION and DESCRIPTION that appear as caption and description if the member is a measure (that is, a member of the Measures dimension).

One way to create an internationalized application is to create a copy of the schema file for each language, but these are difficult to maintain. A better way is to use the LocalizingDynamicSchemaProcessor class to perform dynamic substitution on a single schema file.

7.1 Localizing schema processor

First, write your schema using variables as values for caption, description, allMemberCaption and measuresCaption attributes as follows:

<Schema measuresCaption="%{foodmart.measures.caption}">
<Dimension name="Store" caption="%{foodmart.dimension.store.caption}" description="%{foodmart.dimension.store.description}">
<Hierarchy hasAll="true" allMemberName="All Stores" allMemberCaption="%{foodmart.dimension.store.allmember.caption =All Stores}" primaryKey="store_id"  caption="%{foodmart.hierarchy.store.country.caption}" description="%{foodmart.hierararchy.store.country.description}>
<Table name="store"/>
<Level name="Store Country" column="store_country" uniqueMembers="true" caption="%{foodmart.dimension.store.country.caption}" description="%{foodmart.dimension.store.country.description}"/>
<Level name="Store State" column="store_state" uniqueMembers="true" caption="%{foodmart.dimension.store.state.caption}" description="%{foodmart.dimension.store.state.description}"/>
<Level name="Store City" column="store_city" uniqueMembers="false" caption="%{foodmart.dimension.store.city.caption}" description="%{foodmart.dimension.store.city.description}"/>
<Level name="Store Name" column="store_name" uniqueMembers="true" caption="%{foodmart.dimension.store.name.caption}" description="%{foodmart.dimension.store.name.description}">
<Property name="Store Type" column="store_type" caption="%{foodmart.dimension.store. name.property_type.caption}" description="%{foodmart.dimension.store. name.property_type.description}"/>
<Property name="Store Manager" column="store_manager" caption="%{foodmart.dimension.store. name.property_manager.caption}" description="%{foodmart.dimension.store. name.property_manager.description}"/>
<Property name="Store Sqft" column="store_sqft" type="Numeric" caption="%{foodmart.dimension.store. name.property_storesqft.caption}" description="%{foodmart.dimension.store. name.property_storesqft.description}"/>
<Property name="Grocery Sqft" column="grocery_sqft" type="Numeric"/>
<Property name="Frozen Sqft" column="frozen_sqft" type="Numeric"/>
<Property name="Meat Sqft" column="meat_sqft" type="Numeric"/>
<Property name="Has coffee bar" column="coffee_bar" type="Boolean"/>
<Property name="Street address" column="store_street_address" type="String"/>

<Cube name="Sales" caption="%{foodmart.cube.sales.caption}" description="%{foodmart.cube.sales.description}">
...
<DimensionUsage name="Store" source="Store" foreignKey="store_id"  caption="%{foodmart.cube.sales.name.caption}" description="%{foodmart.cube.sales.name.description}"/>
...
<Measure name="Unit Sales" column="unit_sales" caption="%{foodmart.cube.sales.measure.unitsales.caption}" description="%{foodmart.cube.sales.measure.unitsales.description}"/>
</Cube>

As usual, the default caption for any cube, measure, dimension or level without a caption attribute is the name of the element. A hierarchy's default caption is the caption of its dimension; for example, the [Store] hierarchy has no caption defined, so it inherits the caption attribute from its parent, the [Store] dimension.

Next, add the dynamic schema processor and locale to your connect string. For example,

Provider=mondrian; Locale=en_US; DynamicSchemaProcessor=­mondrian.i18n.LocalizingDynamicSchemaProcessor; Jdbc=­jdbc:odbc:MondrianFoodMart; Catalog=­/WEB-INF/FoodMart.xml

Now, for each locale you wish to support, provide a resource file named locale_{locale}.properties. For example,

# locale.properties: Default resources
foodmart.measures.caption=Measures
foodmart.dimension.store.country.caption=Store Country
foodmart.dimension.store.name.property_type.column= store_type
foodmart.dimension.store.country.member.caption= store_country
foodmart.dimension.store.name.property_type.caption =Store Type
foodmart.dimension.store.name.caption =Store Name
foodmart.dimension.store.state.caption =Store State
foodmart.dimension.store.name.property_manager.caption =Store Manager
foodmart.dimension.store.name.property_storesqft.caption =Store Sq. Ft.
foodmart.dimension.store.allmember.caption =All Stores
foodmart.dimension.store.caption =Store
foodmart.cube.sales.caption =Sales
foodmart.dimension.store.city.caption =Store City
foodmart.cube.sales.measure.unitsales =Unit Sales

and

# locale_hu.properties: Resources for the 'hu' locale.
foodmart.measures.caption=Hungarian Measures
foodmart.dimension.store.country.caption=Orsz\u00E1g
foodmart.dimension.store.name.property_manager.caption =\u00C1ruh\u00E1z vezet\u0151
foodmart.dimension.store.country.member.caption =store_country_caption_hu
foodmart.dimension.store.name.property_type.caption =Tipusa
foodmart.dimension.store.name.caption =Megnevez\u00E9s
foodmart.dimension.store.state.caption =\u00C1llam/Megye
foodmart.dimension.store.name.property_type.column =store_type_caption_hu
foodmart.dimension.store.name.property_storesqft.caption =M\u00E9ret n.l\u00E1b
foodmart.dimension.store.allmember.caption =Minden \u00C1ruh\u00E1z
foodmart.dimension.store.caption =\u00C1ruh\u00E1z
foodmart.cube.sales.caption =Forgalom
foodmart.dimension.store.city.caption =V\u00E1ros
foodmart.cube.sales.measure.unitsales =Eladott db

8. Aggregate tables 

Aggregate tables are a way to improve Mondrian's performance when the fact table contains a huge number of rows: a million or more. An aggregate table is essentially a pre-computed summary of the data in the fact table.

Let's look at a simple aggregate table.

<Cube name="Sales">
<Table name="sales_fact_1997">
<AggName name="agg_c_special_sales_fact_1997">
<AggFactCount column="FACT_COUNT"/>
<AggMeasure name="[Measures].[Store Cost]" column="STORE_COST_SUM"/>
<AggMeasure name="[Measures].[Store Sales]" column="STORE_SALES_SUM"/>
<AggLevel name="[Product].[Product Family]" column="PRODUCT_FAMILY"/>
<AggLevel name="[Time].[Quarter]" column="TIME_QUARTER"/>
<AggLevel name="[Time].[Year]" column="TIME_YEAR"/>
<AggLevel name="[Time].[Quarter]" column="TIME_QUARTER"/>
<AggLevel name="[Time].[Month]" column="TIME_MONTH"/>

<!-- Rest of the cube definition -->
</Cube>

The <AggForeignKey> element, not shown here, allows you to reference a dimension table directly, without including its columns in the aggregate table. It is described in the aggregate tables guide.

In practice, a cube which is based upon a very large fact table may have several aggregate tables. It is inconvenient to declare each aggregate table explicitly in the schema XML file, and luckily there is a better way. In the following example, Mondrian locates aggregate tables by pattern-matching.

<Cube name="Sales">
<Table name="sales_fact_1997">
<AggPattern pattern="agg_.*_sales_fact_1997">
<AggFactCount column="FACT_COUNT"/>
<AggMeasure name="[Measures].[Store Cost]" column="STORE_COST_SUM"/>
<AggMeasure name="[Measures].[Store Sales]" column="STORE_SALES_SUM"/>
<AggLevel name="[Product].[Product Family]" column="PRODUCT_FAMILY"/>
<AggLevel name="[Time].[Quarter]" column="TIME_QUARTER"/>
<AggLevel name="[Time].[Year]" column="TIME_YEAR"/>
<AggLevel name="[Time].[Quarter]" column="TIME_QUARTER"/>
<AggLevel name="[Time].[Month]" column="TIME_MONTH"/>
<AggExclude name="agg_c_14_sales_fact_1997"/>
<AggExclude name="agg_lc_100_sales_fact_1997"/>
</Cube>

It tells Mondrian to treat all tables which match the pattern "agg_.*_sales_fact_1997" as aggregate tables, except "agg_c_14_sales_fact_1997" and "agg_lc_100_sales_fact_1997". Mondrian uses rules to deduce the roles of the columns in those tables, so it's important to adhere to strict naming conventions. The naming conventions are described in the aggregate tables guide.

The performance guide has advice on choosing aggregate tables.

9. Access-control 

OK, so now you've got all this great data, but you don't everyone to be able to read all of it. To solve this, you can define an access-control profile, called a Role, as part of the schema, and set this role when establishing a connection.

9.1 Defining a role 

Roles are defined by <Role> elements, which occur as direct children of the <Schema> element, after the last <Cube>. Here is an example of a role:

<Role name="California manager">
<SchemaGrant access="none">
<CubeGrant cube="Sales" access="all">
<DimensionGrant hierarchy="[Measures]" access="all"/>
<HierarchyGrant hierarchy="[Store]" access="custom" topLevel="[Store].[Store Country]">
<MemberGrant member="[Store].[USA].[CA]" access="all"/>
<MemberGrant member="[Store].[USA].[CA].[Los Angeles]" access="none"/>
<HierarchyGrant hierarchy="[Customers]" access="custom" topLevel="[Customers].[State Province]" bottomLevel="[Customers].[City]">
<MemberGrant member="[Customers].[USA].[CA]" access="all"/>
<MemberGrant member="[Customers].[USA].[CA].[Los Angeles]" access="none"/>
<HierarchyGrant hierarchy="[Gender]" access="none"/>
</Role>

A <SchemaGrant> defines the default access for objects in a schema. The access attribute can be "all" or "none"; this access can be overridden for specific objects. In this case, because access="none", a user would only be able to browse the "Sales" cube, because it is explicitly granted.

A <CubeGrant> defines the access to a particular cube. As for <SchemaGrant>, the access attribute can be "all", "custom" or "none", and can be overridden for specific sub-objects in the cube.

A <DimensionGrant> defines access to a dimension. The access attribute can be "all", "custrom" or "none". An access level of "all" means that all the child hierarchies of the dimension will get inherited access. An access level of "custom" means that the role does not get an inherent access to the child hierarchies, unless the role is explicitely granted using a <HierarchyGrant> element.

A <HierarchyGrant> defines access to a hierarchy. The access attribute can be "all", meaning all members are visible; "none", meaning the hierarchy's very existence is hidden from the user; and "custom". With custom access, you can use the topLevel attribute to define the top level which is visible (preventing users from seeing too much of the 'big picture', such as viewing revenues rolled up to the Store Country level); or use the bottomLevel attribute to define the bottom level which is visible (here, preventing users from invading looking at individual customers' details); or control which sets of members the user can see, by defining nested <MemberGrant> elements.

You can only define a <MemberGrant> element if its enclosing <HierarchyGrant> has access="custom". Member grants give (or remove) access to a given member, and all of its children. Here are the rules:

  1. Members inherit access from their parents. If you deny access to California, you won't be able to see San Francisco.
  2. Grants are order-dependent. If you grant access to USA, then deny access to Oregon, then you won't be able to see Oregon, or Portland. But if you were to deny access to Oregon, then grant access to USA, you can effectively see everything.
  3. A member is visible if any of its children are visible. Suppose you deny access to USA, then grant access to California. You will be able to see USA, and California, but none of the other states. The totals against USA will still reflect all states, however. If the parent HierarchyGrant specifies a top level, only the parents equal or below this level will be visible. Similarly, if a bottom level is specified, only the children above or equal to the level are visible.
  4. Member grants don't override the hierarchy grant's top- and bottom-levels. If you set topLevel="[Store].[Store State]", and grant access to California, you won't be able to see USA. Member grants do not override the topLevel and bottomLevel attributes. You can grant or deny access to a member of any level, but the top and bottom constraints have precedence on the explicit member grants.

In the example, the user will have access to California, and all of the cities in California except Los Angeles. They will be able to see USA (because its child, California, is visible), but no other nations, and not All Stores (because it is above the top level, Store Country).

9.2 Rollup policy 

A rollup policy determines how mondrian computes a member's total if the current role cannot see all of that member's children. Under the default rollup policy, called 'full', the total for that member includes contributions from the children that are not visible. For example, suppose that Fred belongs to a role that can see [USA].[CA] and [USA].[OR] but not [USA].[WA]. If Fred runs the query

SELECT {[Measures].[Unit Sales]} ON COLUMNS,
    {[[Store].[USA], Store].[USA].Children} ON ROWS
FROM [Sales]

the query returns

[Customer] [Measures].[Unit Sales]
[USA] 266,773
[USA].[CA] 74,748
[USA].[OR] 67,659

Note that [USA].[WA] is not returned, per the access-control policy, but the total includes the total from Washington (124,366) that Fred cannot see. For some applications, this is not appropriate. In particular, if the dimension has a small number of members, the end-user may be able to deduce the values of the members which they do not have access to.

To remedy this, a role can apply a different rollup policy to a hierarchy. The policy describes how a total is calculated for a particular member if the current role can only see some of that member's children:

  • Full. The total for that member includes all children. This is the default policy if you don't specify the rollupPolicy attribute.
  • Partial. The total for that member includes only accessible children.
  • Hidden. If any of the children are inaccessible, the total is hidden.

Under the 'partial' policy, the [USA] total is the sum of the accessible children [CA] and [OR]:

[Customer] [Measures].[Unit Sales]
[USA] 142,407
[USA].[CA] 74,748
[USA].[OR] 67,659

Under 'hidden' policy, the [USA] total is hidden because one of its children is not accessible:

[Customer] [Measures].[Unit Sales]
[USA] -
[USA].[CA] 74,748
[USA].[OR] 67,659

The policy is specified per role and hierarchy. In the following example, the role sees partial totals for the [Store] hierarchy but full totals for [Product].

<Role name="South Pacific manager">
<SchemaGrant access="none">
<CubeGrant cube="Sales" access="all">
<HierarchyGrant hierarchy="[Store]" access="custom" rollupPolicy="partial" topLevel="[Store].[Store Country]">
<MemberGrant member="[Store].[USA].[CA]" access="all"/>
<MemberGrant member="[Store].[USA].[CA].[Los Angeles]" access="none"/>
<HierarchyGrant hierarchy="[Customers]" access="custom" rollupPolicy="full" topLevel="[Customers].[State Province]" bottomLevel="[Customers].[City]">
<MemberGrant member="[Customers].[USA].[CA]" access="all"/>
<MemberGrant member="[Customers].[USA].[CA].[Los Angeles]" access="none"/>
<HierarchyGrant hierarchy="[Gender]" access="none"/>
</Role>

This example also shows existing features, such as how hierarchy grants can be restricted using topLevel and/or bottomLevel attributes, and how a role can be prevented from seeing a hierarchy using access="none".

9.3 Union roles 

A union role combines several roles, and has the sum of their privileges.

A union role can see a particular schema object if one or more of its constituent roles can see it. Similarly, the rollup policy of a union role with respect to a particular hierarchy is the least restrictive of all of the roles' rollup policies.

Here is an example showing the syntax of a union role.

<Role name="Coastal manager">
<RoleUsage roleName="California manager"/>
<RoleUsage roleName="Eastern sales manager"/>
</Role>

The constituent roles "California manager" and "Eastern sales manager" may be regular roles, user-defined roles or union roles, but they must be declared earlier in the schema file. The "Coastal manager" role will be able to see any member that or a "California manager" and "Eastern sales manager". It will be able to see all the cells at the intersection of these members, plus it will be able to see cells that neither role can see: for example, if only "California manager" can see [USA].[CA].[Fresno], and only "Eastern sales manager" see the [Sales Target] measure, then "Coastal manager" will be able to see the sales target for Fresno, which neither of the constituent roles have access to.

9.4 Setting a connection's role 

A role only has effect when it is associated with a connection. By default, connections have a role which gives them access to every cube in that connection's schema.

Most databases associate roles (or 'groups') with users, and automatically assign them when users log in. However, Mondrian doesn't have the notion of users, so you have to establish the role in a different way. There are two ways of doing this:

  1. In the connect string. If you specify the Role keyword in the connect string, the connection will adopt that role. You can specify multiple role names separated by commas, and a union role will be created; if a role name contains a comma, escape it with an extra comma. See class DriverManager for examples of connect string syntax.
  2. Programmatically. Once your application has established a connection, call the method Connection.setRole(Role). You can create a Role programmatically (see interface Role and the developer's note link for more details), or look one up using the method Schema.lookupRole(String).

10. Appendix A: XML elements 

Element Description
   
<Schema> Collection of Cubes, Virtual cubes, Shared dimensions, and Roles.

Logical elements
<Cube> A collection of dimensions and measures, all centered on a fact table.
<VirtualCube> A cube defined by combining the dimensions and measures of one or more cubes. A measure originating from another cube can be a <CalculatedMember>.
<CubeUsages> Base cubes that are imported into a virtual cube
<CubeUsage> Usage of a base cube by a virtual cube.
<VirtualCubeDimension> Usage of a dimension by a virtual cube.
<VirtualCubeMeasure> Usage of a measure by a virtual cube.
<Dimension> Dimension.
<DimensionUsage> Usage of a shared dimension by a cube.
<Hierarchy> Hierarchy.
<Level> Level of a hierarchy.
<KeyExpression> SQL expression used as key of the level, in lieu of a column.
<NameExpression> SQL expression used to compute the name of a member, in lieu of Level.nameColumn.
<CaptionExpression> SQL expression used to compute the caption of a member, in lieu ofLevel.captionColumn.
<OrdinalExpression> SQL expression used to sort members of a level, in lieu of Level.ordinalColumn.
<ParentExpression> SQL expression used to compute a measure, in lieu of Level.parentColumn.
<Property> Member property. The definition is against a hierarchy or level, but the property will be available to all members.
<PropertyExpression> SQL expression used to compute the value of a property, in lieu of Property.column.
<Measure> Measure.
<CalculatedMember> A member whose value is derived using a formula, defined as part of a cube.
<NamedSet> A set whose value is derived using a formula, defined as part of a cube.

Physical elements
<Table> Fact or dimension table.
<View> Defines a 'table' using a SQL query, which can have different variants for different underlying databases.
<Join> Defines a 'table' by joining a set of queries.
<InlineTable> Defines a table using an inline dataset.
<Closure> Maps a parent-child hierarchy onto a closure table.

Aggregate Tables
<AggExclude> Exclude a candidate aggregate table by name or pattern matching.
<AggName> Declares an aggregate table to be matched by name.
<AggPattern> Declares a set of aggregate tables by regular expression pattern.
<AggFactCount> Specifies name of the column in the candidate aggregate table which contains the number of fact table rows.
<AggIgnoreColumn> Tells Mondrian to ignore a column in an aggregate table.
<AggForeignKey> Maps foreign key in the fact table to a foreign key column in the candidate aggregate table.
<AggMeasure> Maps a measure to a column in the candidate aggregate table.
<AggLevel> Maps a level to a column in the candidate aggregate table.

Access control
<Role> An access-control profile.
<SchemaGrant> A set of rights to a schema.
<CubeGrant> A set of rights to a cube.
<HierarchyGrant> A set of rights to a hierarchy and levels within that hierarchy.
<MemberGrant> A set of rights to a member and its children.
<Union> Definition of a set of rights as the union of a set of roles.
<RoleUsage> A reference to a Role.

Extensions
<UserDefinedFunction> Declares a user-defined function.
<CellFormatter> Cell formatter.
<MemberFormatter> Member formatter.
<PropertyFormatter> Property formatter.
<Script> Script fragment to implement an SPI such as user-defined function, member formatter, or cell formatter.

Miscellaneous
<Annotations> Holder for annotations.
<Annotation> User-defined property attached to a metadata element.
<Parameter> Part of the definition of a Hierarchy; passed to a MemberReader, if present.
<CalculatedMemberProperty> Property of a calculated member.
<Formula> Holds the formula text within a <NamedSet> or <CalculatedMember>.
<ColumnDefs> Holder for <ColumnDef> elements.
<ColumnDef> Definition of a column in an <InlineTable> dataset.
<Rows> Holder for <Row> elements.
<Row> Row in an <InlineTable> dataset.
<Value> Value of a column in an <InlineTable> dataset.
<MeasureExpression> SQL expression used to compute a measure, in lieu of Measure.column.
<SQL> The SQL expression for a particular database dialect.


Author: Julian Hyde; last modified May 2011.
Version: $Id$ (log)
Copyright (C) 2001-2005 Julian Hyde.
Copyright (C) 2005-2011 Pentaho and others


mondrian-3.11.0.1-R/doc/stylesheet.css000066400000000000000000000355241261646570300174340ustar00rootroot00000000000000/* // This software is subject to the terms of the Eclipse Public License v1.0 // Agreement, available at the following URL: // http://www.eclipse.org/legal/epl-v10.html. // You must accept the terms of that agreement to use this software. // // Copyright (C) 2006-2010 Pentaho and others // All Rights Reserved. // // Global style-sheet for mondrian project. */ /* http://mondrian.pentaho.com/css/styles.css */ #mtm_wrap { border:1px solid black; width:642px; } #mtm_menu { } #mtm_menu a { display: block; font-family: Tahoma, Helvetica, sans-serif; float: left; line-height: 25px; padding: 0px 25px; text-decoration:none; font-size: 11px; font-weight:bold; color:#fff; border-right: 1px solid #fff; } #mtm_menu a.hover { background: #95A22C; } #mtm_menu span.active a { display: inline; background: #ED752A; } #mtm_menu span { XXdisplay:none; } #mtm_menu #img { vertical-align:bottom; } #mtm_menu #subnav { font-size:10px; margin-bottom:2em; } #mtm_menu #subnav a { color:#fff; margin-right:1em; } #mtm_menu #subnav span { color:#fff; margin-right:1em; } table.items tr.item td { color: #fff; font-family: Tahoma, Helvetica, sans-serif; font-size: 11px; font-weight: bold; } /* http://mondrian.pentaho.com/css/primary.css */ .bodyMain { background-color: #ededed; margin: 0px; padding: 0px; } /* added to keep ff/nn from using anchors as working links */ a[name], a[name]:hover, a[name]:active, a[name]:link { font: normal 1em Tahoma, Helvetica, sans-serif; color: #949e3e; text-decoration: none; } /* end ff fix/nn */ a { font: normal Tahoma, Helvetica, sans-serif; color: #949e3e; text-decoration: none; } a:link, a:visited { font: normal Tahoma, Helvetica, sans-serif; color: #949e3e; text-decoration: none; } a:hover, a:active { font: normal Tahoma, Helvetica, sans-serif; color: #ef8033; text-decoration: none; } ul { list-style-image: url(../images/bullet.png); list-style-position: outside; margin-left: 16px; } ol, ul { /*list-style-image: url(../images/bullet.png);*/ list-style-position: outside; color: #ef8033; } ol li, ul li { color:#808080; } .borderBox1_left { background-color: #ededed; border-right: 1px #95a22c solid; width: 50%; } .borderBox1_middle { background-color: #FFFFFF; height: 90px; } .borderBox1_right { background-color: #ededed; border-left: 1px #95a22c solid; width: 50%; } .borderBox2_left { background-color: #ededed; border-right: 1px #95a22c solid; } .borderBox2_middle { background-color: #FFFFFF; height: 182px; } .borderBox2_right { background-color: #ededed; border-left: 1px #95a22c solid; } .borderBox3_left { background-color: #ededed; border-right: 1px #95a22c solid; } .borderBox3_middle { background-color: #FFFFFF; vertical-align: top; } .borderBox3_middle_content { padding: 8px 14px 0px 10px; background-color: #FFFFFF; vertical-align: top; } .borderBox3_right { background-color: #ededed; border-left: 1px #95a22c solid; } .content_blend_top { height: 1px; width: 761px; background-color: #ffffff; } .content_blend_middle { height: 7px; width: 761px; } .content_blend_bottom { border-right: 1px #BCC7D2 solid; border-left: 1px BCC7D2 solid; border-top: 1px #C8CFD6 solid; height: 7px; width: 761px; } .contentTitle { font: bold 1.2em Tahoma, Helvetica, sans-serif; color: #1A2777; padding: 25px 25px 25px 0px; } .contentSectionTitle { vertical-align: top; font: bold .80em Tahoma, Helvetica, sans-serif; line-height: 20px; color: #1A2777; text-align: left; white-space: nowrap; padding-bottom: 3px; } .contentInlineTitle { font: bold .80em Tahoma, Helvetica, sans-serif; line-height: 18px; color: #1A2777; text-align: left; white-space: nowrap; } .contentInlineSubTitle { font: normal .80em Tahoma, Helvetica, sans-serif; line-height: 8px; color: #1A2777; text-align: left; white-space: nowrap; } .contentSection_leftMenu_current, a.contentSection_leftMenu_current:link, a.contentSection_leftMenu_current:visited { vertical-align: top; font: bold .80em Tahoma, Helvetica, sans-serif; line-height: 16px; color: #949e3e; text-align: left; text-decoration: none; } a.contentSection_leftMenu_current:hover, a.contentSection_leftMenu_current:active { vertical-align: top; font: bold .80em Tahoma, Helvetica, sans-serif; line-height: 16px; color: #ef8033; text-align: left; text-decoration: none; } .contentSection_leftMenu, a.contentSection_leftMenu:link, a.contentSection_leftMenu:visited { vertical-align: top; font: normal .80em Tahoma, Helvetica, sans-serif; line-height: 16px; color: #949e3e; text-align: left; text-decoration: none; } .contentSection_leftMenu, a.contentSection_leftMenu:hover, a.contentSection_leftMenu:active { vertical-align: top; font: normal .80em Tahoma, Helvetica, sans-serif; line-height: 16px; color: #ef8033; text-align: left; text-decoration: none; } .contentLeftMargin { background-color: #FFFFFF; width: 160px; height: 100%; vertical-align: top; color: #808080; line-height: 15px; text-align: left; } .contentRightMargin, .contentRightMargin td{ /* added td entry to catch content inside tables PWH */ background-color: #FFFFFF; vertical-align: top; widthz: 538px; font: normal .80em Tahoma, Helvetica, sans-serif; color: #808080; line-height: 17px; text-align: left; background-color: #FFFFFF; } .contentRightMargin a:link, .contentRightMargin a:visited { font: normal 1em Tahoma, Helvetica, sans-serif; color: #949e3e; text-decoration: none; } .contentRightMargin a:hover, .contentRightMargin a:active { font: normal 1em Tahoma, Helvetica, sans-serif; color: #ef8033; text-decoration: none; } .content_table { margin:0px; height: 100%; width: 100%; vertical-align: top; } .bodyTable { margin: 0px; padding: 0px; height: 100%; width: 100%; } .headerTable { margin:0px; padding: 0px; height: 100%; width: 100%; } .header_BG_Bluebar { font: bold 1.2em Tahoma, Helvetica, sans-serif; text-align: right; vertical-align: middle; padding-right: 8px; background-repeat: no-repeat; background-position: left; background-image: url(../images/header_bg_bluebar.gif); width: 637px; height: 36px; color: #FFFFFF; } .header_BG_Menu { background-repeat: no-repeat; background-position: left; background-image: url(../images/header_bg_menu.gif); width: 637px; height: 31px; } .main_content_table_3cols { margin:0px; padding: 0px; height: 100%; width: 100%; vertical-align: top; font-family: Tahoma, Helvetica, sans-serif; } .main_content_col_header { vertical-align: top; font: bold .80em Tahoma, Helvetica, sans-serif; color: #1A2777; text-align: left; white-space: nowrap; padding-bottom: 3px; } .main_content_col_header_middle { vertical-align: top; font: bold .80em Tahoma, Helvetica, sans-serif; color: #1A2777; text-align: left; padding-left: 14px; padding-right: 14px; padding-top: 12px; white-space: nowrap; padding-bottom: 6px; } .main_col_table { width: 100%; } .main_col_content { font-size: 12px; color: #808080; line-height: 19px; vertical-align: top; } .content_3cols_col1 { background-color: #FFFFFF; padding: 14px 14px 0px 14px; width: 251px; vertical-align: top; } .content_3cols_col2 { border-left: 1px #D0D4D8 solid; border-right: 1px #D0D4D8 solid; padding: 14px 14px 0px 14px; vertical-align: top; width: 230px; } DIV#topmenu { BACKGROUND: url(../images/de_topmenu_bg.gif) repeat-x; height: 25px; padding-bottom: 0px; background-color: #95a22c; } DIV#topmenu A:hover { BACKGROUND: #7b8622; COLOR: #ffffff; } .contentheading { MARGIN: 2px 0px 10px 0px; font: normal 1.5em Tahoma, Helvetica, sans-serif; COLOR: #ef6507; letter-spacing: .075em; } .line_fade_bg { PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; PADDING-TOP: 0px; BACKGROUND-COLOR: #95a22c; } .line_grey_fade_bg { margin-right: 10px; margin-left: 10px; PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; PADDING-TOP: 0px; BACKGROUND-COLOR: #cacaca; } .subMenu_ready { font: normal .80em Tahoma, Helvetica, sans-serif; color: #95a22c; vertical-align: top; text-align:center; padding: 2pt 12pt 2pt 12pt; border-top: 0px solid #FFFFFF; border-right: 1px solid #CDCDCD; border-bottom: 1px solid #CDCDCD; background-color: #E5E5E5; cursor: pointer; white-space:nowrap; } .subMenu_rollover { font: normal .80em Tahoma, Helvetica, sans-serif; color: #ffffff; vertical-align: top; text-align:center; padding: 2pt 12pt 2pt 12pt; border-top: 0px solid #7b8622; border-right: 1px solid #CDCDCD; border-bottom: 1px solid #CDCDCD; background-color: #a6a6a6; cursor: pointer; white-space:nowrap; } .subMenu_selected { font: normal .80em Tahoma, Helvetica, sans-serif; color: #7b8622; vertical-align: top; text-align:center; padding: 2pt 12pt 2pt 12pt; border-top: 0px solid #be5e22; border-right: 1px solid #CDCDCD; border-bottom: 1px solid #CDCDCD; background-color: #CDCDCD; cursor: pointer; white-space:nowrap; } .menutitle { font: normal .95em Tahoma, Helvetica, sans-serif; PADDING-BOTTOM: 1px; MARGIN: 10px 0px 3px 0px; WIDTH: 175px; COLOR: #ff6113; PADDING-TOP: 1px; BACKGROUND-IMAGE: url(../images/line_grey_fade_horiz.jpg); BACKGROUND-POSITION: right bottom; BACKGROUND-REPEAT: no-repeat; } TD.botmenu { BACKGROUND: url(../images/de_bottommenu_bg.gif) repeat-x; PADDING-TOP: 4px; TEXT-ALIGN: left; height: 5px; } a.mainlevel_footer:link, a.mainlevel_footer:visited { PADDING: 3px 10px 2px 10px; font: normal .80em Tahoma, Helvetica, sans-serif; CURSOR: pointer; CURSOR: hand; COLOR: #999999; WHITE-SPACE: nowrap; TEXT-ALIGN: left; } a.mainlevel_footer:hover, a.mainlevel_footer:active{ PADDING: 3px 10px 2px 10px; font: normal .80em Tahoma, Helvetica, sans-serif; CURSOR: pointer; CURSOR: hand; COLOR: #666666; WHITE-SPACE: nowrap; BACKGROUND-COLOR: #cdcdcd; TEXT-ALIGN: left; } h3 { font: normal 1.05em Tahoma, Helvetica, sans-serif; color: #95a22c; margin: 9px 0px 4px 0px; letter-spacing: .075em; } /* jhyde added */ h2 { font: normal 1.15em Tahoma, Helvetica, sans-serif; color: #95a22c; margin: 9px 0px 4px 0px; letter-spacing: .075em; } h4 { font: normal 0.95em Tahoma, Helvetica, sans-serif; color: #95a22c; margin: 9px 0px 4px 0px; letter-spacing: .075em; } h1 { font-weight:bolder; /* subs under h3's */ font-size:1em; } /* jhyde added */ p { font: normal Tahoma, Helvetica, sans-serif; color: #808080; text-decoration: none; } /* gray table styles */ .grayTable, .grayTable tr,.grayTable td { border-color:#808080; border-style:solid; border-width:1px; border-collapse:collapse; } /* white table styles */ .whiteTable, .whiteTable tr,.whiteTable td { border-color:#ffffff; border-style:solid; border-width:1px; border-collapse:collapse; } /* added for homepage content 6-29-06 */ .callout1 { font: normal 1.3em Tahoma, Helvetica, sans-serif; padding: 0px 0px 0px 15px; margin: 0px 25px 15px 15px; color: #949e3e; text-align: left; border-left: 1px solid #cacaca; } .home_feature { padding: 0px 0px 0px 15px; margin: 0px 25px 15px 15px; } .btn_download A { PADDING-RIGHT: 0px; DISPLAY: block; PADDING-LEFT: 0px; BACKGROUND: url(http://www.pentaho.com/images/stories/images/btn_download.gif) no-repeat 0px 0px; PADDING-BOTTOM: 8px; FONT: bold 13px sans-serif; WIDTH: 228px; PADDING-TOP: 10px; TEXT-DECORATION: none } .btn_download A:hover { BACKGROUND-POSITION: 0px -38px } /* code stylings */ .contentRightMargin code { font: normal 1em Courier New, monospace; color:#000000; } .contentRightMargin blockquote a:link, .contentRightMargin blockquote a:visited { font: normal 1em Courier New, monospace; color:#ef8033; } .contentRightMargin blockquote a:hover { color:#949e3e; } .contentRightMargin blockquote { padding:10px; background-color:#eeeeee; border:1px solid #cdcdcd; margin-left:10px; margin-right:10px; } .contentRightMargin blockquote pre { background-color:#cdcdcd; padding:10px 10px 10px 10px; margin:0px 0px 0px 0px; width:80%; font: normal 1em Courier New, monospace; } .contentRightMargin blockquote pre a:link, .contentRightMargin blockquote pre a:visited { color:#ef8033; font: normal 1em Courier New, monospace; } .contentRightMargin blockquote pre a:hover { color:#949e3e; font: normal 1em Courier New, monospace; } dfn { font-style:italic; } /* end code stylings */ /* http://mondrian.pentaho.com/css/transmenu.css */ /* this is the clipping region for the menu. it's width and height get set by script, depending on the size of the items table */ .transMenu { position:absolute; overflow:hidden; left:-1000px; top:-1000px; } /* this is the main container for the menu itself. it's width and height get set by script, depending on the size of the items table */ .transMenu .content { position:absolute; } /* this table comprises all menu items. each TR is one item. It is relatively positioned so that the shadow and background transparent divs can be positioned underneath it */ .transMenu .items { position:relative; left:0px; top:0px; z-index:2; } .transMenu.top .items { border-top:none; } /* each TR.item is one menu item */ .transMenu .item { color:#fff; font-size:10px; font-family:sans-serif; text-decoration:none; /* this is a hack for mac/ie5, whom incorrectly cascades the border properties of the parent table to each row */ border:none; cursor:pointer; cursor:hand; } /* this DIV is the semi-transparent white background of each menu. the -moz-opacity is a proprietary way to get transparency in mozilla, the filter is for IE/windows 5.0+. */ /* we set the background color in script because ie mac does not use it; that browser only uses a semi-transparent white PNG that the spacer gif inside this DIV is replaced by */ .transMenu .background { position:absolute; left:0px; top:0px; z-index:1; -moz-opacity:.8; filter:alpha(opacity=80); } /* same concept as .background, but this is the sliver of shadow on the right of the menu. It's left, height, and background are set by script. In IE5/mac, it uses a PNG */ .transMenu .shadowRight { position:absolute; z-index:3; top:3px; width:2px; -moz-opacity:.4; filter:alpha(opacity=40); } /* same concept as .background, but this is the sliver of shadow on the bottom of the menu. It's top, width, and background are set by script. In IE5/mac, it uses a PNG */ .transMenu .shadowBottom { position:absolute; z-index:1; left:3px; height:2px; -moz-opacity:.4; filter:alpha(opacity=40); } /* this is the class that is used when the mouse is over an item. script sets the row to this class when required. */ .transMenu .item.hover { background: #7B8622; color: #ffffff; } /* this is either the dingbat that indicates there is a submenu, or a spacer gif in it's place. We give it extra margin to create some space between the text and the dingbat */ .transMenu .item img { margin-left:10px; } /* End stylesheet.css */ mondrian-3.11.0.1-R/doc/vba_functions.html000066400000000000000000004560551261646570300202650ustar00rootroot00000000000000 Pentaho Analysis Services: Visual Basic for Applications (VBA) Functions
Visual Basic for Applications (VBA) Function List

The following table describes the functions in the Visual Basic for Applications (VBA) specification, which are implicitly part of the MDX language specification.

Some of the functions are not implemented in mondrian, but are included for completeness. The 'Mondrian version/priority' column indicates which functions are implemented in mondrian, and if not, priority of the development team for adding them. Some functions, such as Beep, will never be implemented in Mondrian MDX.

The MDX language implemented by mondrian, including a list of set of functions implemented, is described in the MDX specification.

NameDescriptionMondrian version / priority
AbsReturns a value of the same type that is passed to it specifying the absolute value of a number.

Syntax

Abs(number)

The required number argument can be any valid numeric expression. If number contains Null, Null is returned; if it is an uninitialized variable, zero is returned.

Remarks

The absolute value of a number is its unsigned magnitude. For example, ABS(-1) and ABS(1) both return 1.
1
Add-
AppActivate-
ArrayReturns a Variant containing an array.

Syntax

Array(arglist)

The required arglist argument is a comma-delimited list of values that are assigned to the elements of the array contained within the Variant. If no arguments are specified, an array of zero length is created.

Remarks

The notation used to refer to an element of an array consists of the variable name followed by parentheses containing an index number indicating the desired element. In the following example, the first statement creates a variable named
A
as a Variant. The second statement assigns an array to variable
A
. The last statement assigns the value contained in the second array element to another variable.

Dim A As Variant
A = Array(10,20,30)
B = A(2)
The lower bound of an array created using the Array function is determined by the lower bound specified with the Option Base statement, unless Array is qualified with the name of the type library (for example VBA.Array). If qualified with the type-library name, Array is unaffected by Option Base.

Note A Variant that is not declared as an array can still contain an array. A Variant variable can contain an array of any type, except fixed-length strings and user-defined types. Although a Variant containing an array is conceptually different from an array whose elements are of type Variant, the array elements are accessed in the same way.
Not applicable - mondrian has no array data type
AscReturns an Integer representing the character code corresponding to the first letter in a string.

Syntax

Asc(string)

The required string argument is any valid string expression. If the string contains no characters, a run-time error occurs.

Remarks

The range for returns is 0 255 on non-DBCS systems, but 32768 32767 on DBCS systems.

Note The AscB function is used with byte data contained in a string. Instead of returning the character code for the first character, AscB returns the first byte. The AscW function returns the Unicode character code except on platforms where Unicode is not supported, in which case, the behavior is identical to the Asc function.
1
AscBSee AscN/A
AscWSee Asc1
AtnReturns a Double specifying the arctangent of a number.

Syntax

Atn(number)

The required number argument is a Double or any valid numeric expression.

Remarks

The Atn function takes the ratio of two sides of a right triangle (number) and returns the corresponding angle in radians. The ratio is the length of the side opposite the angle divided by the length of the side adjacent to the angle.

The range of the result is -pi/2 to pi/2 radians.

To convert degrees to radians, multiply degrees by pi/180. To convert radians to degrees, multiply radians by 180/pi.

Note Atn is the inverse trigonometric function of Tan, which takes an angle as its argument and returns the ratio of two sides of a right triangle. Do not confuse Atn with the cotangent, which is the simple inverse of a tangent (1/tangent).
1
BeepNot applicable in server
Calendar-
CallByNameExecutes a method of an object, or sets or returns a property of an object.

Syntax

CallByName(object, procname, calltype,[args()])

The CallByName function syntax has these named arguments:

Part Description
object Required; Variant (Object). The name of the object on which the function will be executed.
procname Required; Variant (String). A string expression containing the name of a property or method of the object.
calltype Required; Constant. A constant of type vbCallType representing the type of procedure being called.
args() Optional: Variant (Array).

Remarks

The CallByName function is used to get or set a property, or invoke a method at run time using a string name.

In the following example, the first line uses CallByName to set the MousePointer property of a text box, the second line gets the value of the MousePointer property, and the third line invokes the Move method to move the text box:

CallByName Text1, "MousePointer", vbLet, vbCrosshair
Result = CallByName (Text1, "MousePointer", vbGet)
CallByName Text1, "Move", vbMethod, 100, 100
-
CBoolReturns an expression that has been converted to a Variant of subtype Boolean.

CBool(expression)

The expression argument is any valid expression.

If expression is zero, False is returned; otherwise, True is returned. If expression can't be interpreted as a numeric value, a run-time error occurs.

The following example uses the CBool function to convert an expression to a Boolean. If the expression evaluates to a nonzero value, CBool returns True; otherwise, it returns False.
2
CByteReturns an expression that has been converted to a Variant of subtype Byte.

CByte(expression)

The expression argument is any valid expression.

In general, you can document your code using the subtype conversion functions to show that the result of some operation should be expressed as a particular data type rather than the default data type. For example, use CByte to force byte arithmetic in cases where currency, single-precision, double-precision, or integer arithmetic normally would occur.

Use the CByte function to provide internationally aware conversions from any other data type to a Byte subtype. For example, different decimal separators are properly recognized depending on the locale setting of your system, as are different thousand separators.

If expression lies outside the acceptable range for the byte subtype, an error occurs.
N/A; mondrian has no byte datatype
CCurReturns an expression that has been converted to a Variant of subtype Currency.

CCur(expression)
 
The expression argument is any valid expression.

In general, you can document your code using the subtype conversion functions to show that the result of some operation should be expressed as a particular data type rather than the default data type. For example, use CCur to force currency arithmetic in cases where integer arithmetic normally would occur.

You should use the CCur function to provide internationally aware conversions from any other data type to a Currency subtype. For example, different decimal separators and thousands separators are properly recognized depending on the locale setting of your system.
-
CDateReturns an expression that has been converted to a Variant of subtype Date.

CDate(date)

The date argument is any valid date expression.

Use the IsDate function to determine if date can be converted to a date or time. CDate recognizes date literals and time literals as well as some numbers that fall within the range of acceptable dates. When converting a number to a date, the whole number portion is converted to a date. Any fractional part of the number is converted to a time of day, starting at midnight.

CDate recognizes date formats according to the locale setting of your system. The correct order of day, month, and year may not be determined if it is provided in a format other than one of the recognized date settings. In addition, a long date format is not recognized if it also contains the day-of-the-week string.
1
CDblReturns an expression that has been converted to a Variant of subtype Double.

CDbl(expression)
 
The expression argument is any valid expression.

In general, you can document your code using the subtype conversion functions to show that the result of some operation should be expressed as a particular data type rather than the default data type. For example, use CDbl or CSng to force double-precision or single-precision arithmetic in cases where currency or integer arithmetic normally would occur.

Use the CDbl function to provide internationally aware conversions from any other data type to a Double subtype. For example, different decimal separators and thousands separators are properly recognized depending on the locale setting of your system.
2
CDec  
ChDir  
ChDrive  
Choose  
ChrReturns a String containing the character associated with the specified character code.

Syntax

Chr(charcode)

The required charcode argument is a Long that identifies a character.

Remarks

Numbers from 0 31 are the same as standard, nonprintable ASCII codes. For example, Chr(10) returns a linefeed character. The normal range for charcode is 0 255. However, on DBCS systems, the actual range for charcode is -32768 to 65535.

Note The ChrB function is used with byte data contained in a String. Instead of returning a character, which may be one or two bytes, ChrB always returns a single byte. The ChrW function returns a String containing the Unicode character except on platforms where Unicode is not supported, in which case, the behavior is identical to the Chr function.
1
ChrBSee Chr.-
ChrWSee Chr.1
CIntReturns an expression that has been converted to a Variant of subtype Integer.

CInt(expression)

The expression argument is any valid expression.

In general, you can document your code using the subtype conversion functions to show that the result of some operation should be expressed as a particular data type rather than the default data type. For example, use CInt or CLng to force integer arithmetic in cases where currency, single-precision, or double-precision arithmetic normally would occur.

Use the CInt function to provide internationally aware conversions from any other data type to an Integer subtype. For example, different decimal separators are properly recognized depending on the locale setting of your system, as are different thousand separators.

If expression lies outside the acceptable range for the Integer subtype, an error occurs.

The following example uses the CInt function to convert a value to an Integer:

Dim MyDouble, MyInt
MyDouble = 2345.5678 ' MyDouble is a Double.
MyInt = CInt(MyDouble) ' MyInt contains 2346.

Note. CInt differs from the Fix and Int functions, which truncate, rather than round, the fractional part of a number. When the fractional part is exactly 0.5, the CInt function always rounds it to the nearest even number. For example, 0.5 rounds to 0, and 1.5 rounds to 2.

2
Clear  
CLngReturns an expression that has been converted to a Variant of subtype Long.

CLng(expression)

The expression argument is any valid expression.

In general, you can document your code using the subtype conversion functions to show that the result of some operation should be expressed as a particular data type rather than the default data type. For example, use CInt or CLng to force integer arithmetic in cases where currency, single-precision, or double-precision arithmetic normally would occur.

Use the CLng function to provide internationally aware conversions from any other data type to a Long subtype. For example, different decimal separators are properly recognized depending on the locale setting of your system, as are different thousand separators.

If expression lies outside the acceptable range for the Long subtype, an error occurs.

The following example uses the CLng function to convert a value to a Long:

Dim MyVal1, MyVal2, MyLong1, MyLong2
MyVal1 = 25427.45: MyVal2 = 25427.55 ' MyVal1, MyVal2 are Doubles.
MyLong1 = CLng(MyVal1) ' MyLong1 contains 25427.
MyLong2 = CLng(MyVal2) ' MyLong2 contains 25428.

Note. CLng differs from the Fix and Int functions, which truncate, rather than round, the fractional part of a number. When the fractional part is exactly 0.5, the CLng function always rounds it to the nearest even number. For example, 0.5 rounds to 0, and 1.5 rounds to 2.

2
CommandReturns the argument portion of the command line used to launch Microsoft Visual Basic or an executable program developed with Visual Basic.

Syntax

Command

Remarks

When Visual Basic is launched from the command line, any portion of the command line that follows
/cmd
is passed to the program as the command-line argument. In the following example,
cmdlineargs
represents the argument information returned by the Command function.

VB /cmd cmdlineargs
For applications developed with Visual Basic and compiled to an .exe file, Command returns any arguments that appear after the name of the application on the command line. For example:

MyApp cmdlineargs
To find how command line arguments can be changed in the user interface of the application you're using, search Help for "command line arguments."
-
CosReturns a Double specifying the cosine of an angle.

Syntax

Cos(number)

The required number argument is a Double or any valid numeric expression that expresses an angle in radians.

Remarks

The Cos function takes an angle and returns the ratio of two sides of a right triangle. The ratio is the length of the side adjacent to the angle divided by the length of the hypotenuse.

The result lies in the range -1 to 1.

To convert degrees to radians, multiply degrees by pi/180. To convert radians to degrees, multiply radians by 180/pi.
1
Count ?
CreateObjectCreates and returns a reference to an ActiveX object.

Syntax

CreateObject(class,[servername])

The CreateObject function syntax has these parts:

Part Description
class Required; Variant (String). The application name and class of the object to create.
servername Optional; Variant (String). The name of the network server where the object will be created. If servername is an empty string (""), the local machine is used.

The class argument uses the syntax appname.objecttype and has these parts:

Part Description
appname Required; Variant (String). The name of the application providing the object.
objecttype Required; Variant (String). The type or class of object to create.

Remarks

Every application that supports Automation provides at least one type of object. For example, a word processing application may provide an Application object, a Document object, and a Toolbar object.
-
CSng ?
CStr ?
CurDirReturns a Variant (String) representing the current path.

Syntax

CurDir[(drive)]

The optional drive argument is a string expression that specifies an existing drive. If no drive is specified or if drive is a zero-length string (""), CurDir returns the path for the current drive.
 
Cvar  
CVDate  
CVErrReturns a Variant of subtype Error containing an error number specified by the user.

Syntax

CVErr(errornumber)

The required errornumber argument is any valid error number.

Remarks

Use the CVErr function to create user-defined errors in user-created procedures. For example, if you create a function that accepts several arguments and normally returns a string, you can have your function evaluate the input arguments to ensure they are within acceptable range. If they are not, it is likely your function will not return what you expect. In this event, CVErr allows you to return an error number that tells you what action to take.

Note that implicit conversion of an Error is not allowed. For example, you can't directly assign the return value of CVErr to a variable that is not a Variant. However, you can perform an explicit conversion (using CInt, CDbl, and so on) of the value returned by CVErr and assign that to a variable of the appropriate data type.
-
DateReturns a Variant (Date) containing the current system date.

Syntax

Date

Remarks

To set the system date, use the Date statement.

Date, and if the calendar is Gregorian, Date$ behavior is unchanged by the Calendar property setting. If the calendar is Hijri, Date$ returns a 10-character string of the form mm-dd-yyyy, where mm (01-12), dd (01-30) and yyyy (1400-1523) are the Hijri month, day and year. The equivalent Gregorian range is Jan 1, 1980 through Dec 31, 2099.
1
DateAddReturns a Variant (Date) containing a date to which a specified time interval has been added.

Syntax

DateAdd(interval, number, date)

The DateAdd function syntax has these named arguments:

Part Description
interval Required. String expression that is the interval of time you want to add.
number Required. Numeric expression that is the number of intervals you want to add. It can be positive (to get dates in the future) or negative (to get dates in the past).
date Required. Variant (Date) or literal representing date to which the interval is added.

Settings

The interval argument has these settings:

Setting Description
yyyy Year
q Quarter
m Month
y Day of year
d Day
w Weekday
ww Week
h Hour
n Minute
s Second

Remarks

You can use the DateAdd function to add or subtract a specified time interval from a date. For example, you can use DateAdd to calculate a date 30 days from today or a time 45 minutes from now.

To add days to date, you can use Day of Year ("y"), Day ("d"), or Weekday ("w").

The DateAdd function won't return an invalid date. The following example adds one month to January 31:

DateAdd("m", 1, "31-Jan-95")
In this case, DateAdd returns 28-Feb-95, not 31-Feb-95. If date is 31-Jan-96, it returns 29-Feb-96 because 1996 is a leap year.

If the calculated date would precede the year 100 (that is, you subtract more years than are in date), an error occurs.

If number isn't a Long value, it is rounded to the nearest whole number before being evaluated.

Note The format of the return value for DateAdd is determined by Control Panel settings, not by the format that is passed in date argument.

Note For date, if the Calendar property setting is Gregorian, the supplied date must be Gregorian. If the calendar is Hijri, the supplied date must be Hijri. If month values are names, the name must be consistent with the current Calendar property setting. To minimize the possibility of month names conflicting with the current Calendar property setting, enter numeric month values (Short Date format).
1
DateDiffReturns a Variant (Long) specifying the number of time intervals between two specified dates.

Syntax

DateDiff(interval, date1, date2[, firstdayofweek[, firstweekofyear]])

The DateDiff function syntax has these named arguments:

Part Description
interval Required. String expression that is the interval of time you use to calculate the difference between date1 and date2.
date1, date2 Required; Variant (Date). Two dates you want to use in the calculation.
firstdayofweek Optional. A constant that specifies the first day of the week. If not specified, Sunday is assumed.
firstweekofyear Optional. A constant that specifies the first week of the year. If not specified, the first week is assumed to be the week in which January 1 occurs.

Settings

The interval argument has these settings:

Setting Description
yyyy Year
q Quarter
m Month
y Day of year
d Day
w Weekday
ww Week
h Hour
n Minute
s Second


The firstdayofweek argument has these settings:

Constant Value Description
vbUseSystem 0 Use the NLS API setting.
vbSunday 1 Sunday (default)
vbMonday 2 Monday
vbTuesday 3 Tuesday
vbWednesday 4 Wednesday
vbThursday 5 Thursday
vbFriday 6 Friday
vbSaturday 7 Saturday

Constant Value Description
vbUseSystem 0 Use the NLS API setting.
vbFirstJan1 1 Start with week in which January 1 occurs (default).
vbFirstFourDays 2 Start with the first week that has at least four days in the new year.
vbFirstFullWeek 3 Start with first full week of the year.


Remarks

You can use the DateDiff function to determine how many specified time intervals exist between two dates. For example, you might use DateDiff to calculate the number of days between two dates, or the number of weeks between today and the end of the year.

To calculate the number of days between date1 and date2, you can use either Day of year ("y") or Day ("d"). When interval is Weekday ("w"), DateDiff returns the number of weeks between the two dates. If date1 falls on a Monday, DateDiff counts the number of Mondays until date2. It counts date2 but not date1. If interval is Week ("ww"), however, the DateDiff function returns the number of calendar weeks between the two dates. It counts the number of Sundays between date1 and date2. DateDiff counts date2 if it falls on a Sunday; but it doesn't count date1, even if it does fall on a Sunday.

If date1 refers to a later point in time than date2, the DateDiff function returns a negative number.

The firstdayofweek argument affects calculations that use the "w" and "ww" interval symbols.

If date1 or date2 is a date literal, the specified year becomes a permanent part of that date. However, if date1 or date2 is enclosed in double quotation marks (" "), and you omit the year, the current year is inserted in your code each time the date1 or date2 expression is evaluated. This makes it possible to write code that can be used in different years.

When comparing December 31 to January 1 of the immediately succeeding year, DateDiff for Year ("yyyy") returns 1 even though only a day has elapsed.

Note For date1 and date2, if the Calendar property setting is Gregorian, the supplied date must be Gregorian. If the calendar is Hijri, the supplied date must be Hijri.
1
DatePartReturns a Variant (Integer) containing the specified part of a given date.

Syntax

DatePart(interval, date[,firstdayofweek[, firstweekofyear]])

The DatePart function syntax has these named arguments:

Part Description
interval Required. String expression that is the interval of time you want to return.
date Required. Variant (Date) value that you want to evaluate.
firstdayofweek Optional. A constant that specifies the first day of the week. If not specified, Sunday is assumed.
firstweekofyear Optional. A constant that specifies the first week of the year. If not specified, the first week is assumed to be the week in which January 1 occurs.

Settings

The interval argument has these settings:

Setting Description
yyyy Year
q Quarter
m Month
y Day of year
d Day
w Weekday
ww Week
h Hour
n Minute
s Second

The firstdayofweek argument has these settings:

Constant Value Description
vbUseSystem 0 Use the NLS API setting.
vbSunday 1 Sunday (default)
vbMonday 2 Monday
vbTuesday 3 Tuesday
vbWednesday 4 Wednesday
vbThursday 5 Thursday
vbFriday 6 Friday
vbSaturday 7 Saturday

The firstweekofyear argument has these settings:

Constant Value Description
vbUseSystem 0 Use the NLS API setting.
vbFirstJan1 1 Start with week in which January 1 occurs (default).
vbFirstFourDays 2 Start with the first week that has at least four days in the new year.
vbFirstFullWeek 3 Start with first full week of the year.

Remarks

You can use the DatePart function to evaluate a date and return a specific interval of time. For example, you might use DatePart to calculate the day of the week or the current hour.

The firstdayofweek argument affects calculations that use the "w" and "ww" interval symbols.

If date is a date literal, the specified year becomes a permanent part of that date. However, if date is enclosed in double quotation marks (" "), and you omit the year, the current year is inserted in your code each time the date expression is evaluated. This makes it possible to write code that can be used in different years.

Note For date, if the Calendar property setting is Gregorian, the supplied date must be Gregorian. If the calendar is Hijri, the supplied date must be Hijri.

The returned date part is in the time period units of the current Arabic calendar. For example, if the current calendar is Hijri and the date part to be returned is the year, the year value is a Hijri year.
1
DateSerialReturns a Variant (Date) for a specified year, month, and day.

Syntax

DateSerial(year, month, day)

The DateSerial function syntax has these named arguments:

Part Description
year Required; Integer. Number between 100 and 9999, inclusive, or a numeric expression.
month Required; Integer. Any numeric expression.
day Required; Integer. Any numeric expression.


Remarks

To specify a date, such as December 31, 1991, the range of numbers for each DateSerial argument should be in the accepted range for the unit; that is, 131 for days and 112 for months. However, you can also specify relative dates for each argument using any numeric expression that represents some number of days, months, or years before or after a certain date.

The following example uses numeric expressions instead of absolute date numbers. Here the DateSerial function returns a date that is the day before the first day (
1 - 1
), two months before August (
8 - 2
), 10 years before 1990 (
1990 - 10
); in other words, May 31, 1980.

DateSerial(1990 - 10, 8 - 2, 1 - 1)
Under Windows 98 or Windows 2000, two digit years for the year argument are interpreted based on user-defined machine settings. The default settings are that values between 0 and 29, inclusive, are interpreted as the years 20002029. The default values between 30 and 99 are interpreted as the years 19301999. For all other year arguments, use a four-digit year (for example, 1800).

Earlier versions of Windows interpret two-digit years based on the defaults described above. To be sure the function returns the proper value, use a four-digit year.

When any argument exceeds the accepted range for that argument, it increments to the next larger unit as appropriate. For example, if you specify 35 days, it is evaluated as one month and some number of days, depending on where in the year it is applied. If any single argument is outside the range -32,768 to 32,767, an error occurs. If the date specified by the three arguments falls outside the acceptable range of dates, an error occurs.

Note For year, month, and day, if the Calendar property setting is Gregorian, the supplied value is assumed to be Gregorian. If the Calendar property setting is Hijri, the supplied value is assumed to be Hijri.

The returned date part is in the time period units of the current Visual Basic calendar. For example, if the current calendar is Hijri and the date part to be returned is the year, the year value is a Hijri year. For the argument year, values between 0 and 99, inclusive, are interpreted as the years 1400-1499. For all other year values, use the complete four-digit year (for example, 1520).
1
DateValueReturns a Variant (Date).

Syntax

DateValue(date)

The required date argument is normally a string expression representing a date from January 1, 100 through December 31, 9999. However, date can also be any expression that can represent a date, a time, or both a date and time, in that range.

Remarks

If date is a string that includes only numbers separated by valid date separators, DateValue recognizes the order for month, day, and year according to the Short Date format you specified for your system. DateValue also recognizes unambiguous dates that contain month names, either in long or abbreviated form. For example, in addition to recognizing 12/30/1991 and 12/30/91, DateValue also recognizes December 30, 1991 and Dec 30, 1991.

If the year part of date is omitted, DateValue uses the current year from your computer's system date.

If the date argument includes time information, DateValue doesn't return it. However, if date includes invalid time information (such as "89:98"), an error occurs.

Note For date, if the Calendar property setting is Gregorian, the supplied date must be Gregorian. If the calendar is Hijri, the supplied date must be Hijri. If the supplied date is Hijri, the argument date is a String representing a date from 1/1/100 (Gregorian Aug 2, 718) through 4/3/9666 (Gregorian Dec 31, 9999).
1
DayReturns a Variant (Integer) specifying a whole number between 1 and 31, inclusive, representing the day of the month.

Syntax

Day(date)

The required date argument is any Variant, numeric expression, string expression, or any combination, that can represent a date. If date contains Null, Null is returned.

Note If the Calendar property setting is Gregorian, the returned integer represents the Gregorian day of the month for the date argument. If the calendar is Hijri, the returned integer represents the Hijri day of the month for the date argument.
1
DDBReturns a Double specifying the depreciation of an asset for a specific time period using the double-declining balance method or some other method you specify.

Syntax

DDB(cost, salvage, life, period[, factor])

The DDB function has these named arguments:

Part Description
cost Required. Double specifying initial cost of the asset.
salvage Required. Double specifying value of the asset at the end of its useful life.
life Required. Double specifying length of useful life of the asset.
period Required. Double specifying period for which asset depreciation is calculated.
factor Optional. Variant specifying rate at which the balance declines. If omitted, 2 (double-declining method) is assumed.


Remarks

The double-declining balance method computes depreciation at an accelerated rate. Depreciation is highest in the first period and decreases in successive periods.

The life and period arguments must be expressed in the same units. For example, if life is given in months, period must also be given in months. All arguments must be positive numbers.

The DDB function uses the following formula to calculate depreciation for a given period:

Depreciation / period = ((cost salvage) * factor) / life
2
DirReturns a String representing the name of a file, directory, or folder that matches a specified pattern or file attribute, or the volume label of a drive.

Syntax

Dir[(pathname[, attributes])]

The Dir function syntax has these parts:

Part Description
pathname Optional. String expression that specifies a file name may include directory or folder, and drive. A zero-length string ("") is returned if pathname is not found.
attributes Optional. Constant or numeric expression, whose sum specifies file attributes. If omitted, returns files that match pathname but have no attributes.

Settings

The attributes argument settings are:

Constant Value Description
vbNormal 0 (Default) Specifies files with no attributes.
vbReadOnly 1 Specifies read-only files in addition to files with no attributes.
vbHidden 2 Specifies hidden files in addition to files with no attributes.
VbSystem 4 Specifies system files in addition to files with no attributes.
vbVolume 8 Specifies volume label; if any other attributed is specified, vbVolume is ignored.
vbDirectory 16 Specifies directories or folders in addition to files with no attributes.

Note These constants are specified by Visual Basic for Applications and can be used anywhere in your code in place of the actual values..

Remarks

Dir supports the use of multiple character (*) and single character (?) wildcards to specify multiple files.
-
DoEventsYields execution so that the operating system can process other events.

Syntax

DoEvents( )

Remarks

The DoEvents function returns an Integer representing the number of open forms in stand-alone versions of Visual Basic, such as Visual Basic, Professional Edition. DoEvents returns zero in all other applications.

DoEvents passes control to the operating system. Control is returned after the operating system has finished processing the events in its queue and all keys in the SendKeys queue have been sent.

DoEvents is most useful for simple things like allowing a user to cancel a process after it has started, for example a search for a file. For long-running processes, yielding the processor is better accomplished by using a Timer or delegating the task to an ActiveX EXE component.. In the latter case, the task can continue completely independent of your application, and the operating system takes case of multitasking and time slicing.

Caution Any time you temporarily yield the processor within an event procedure, make sure the procedure is not executed again from a different part of your code before the first call returns; this could cause unpredictable results. In addition, do not use DoEvents if other applications could possibly interact with your procedure in unforeseen ways during the time you have yielded control.
-
DeleteSetting  
Description  
EnvironReturns the String associated with an operating system environment variable.

Syntax

Environ({envstring | number})

The Environ function syntax has these named arguments:

Part Description
envstring Optional. String expression containing the name of an environment variable.
number Optional. Numeric expression corresponding to the numeric order of the environment string in the environment-string table. The number argument can be any numeric expression, but is rounded to a whole number before it is evaluated.


Remarks

If envstring can't be found in the environment-string table, a zero-length string ("") is returned. Otherwise, Environ returns the text assigned to the specified envstring; that is, the text following the equal sign (=) in the environment-string table for that environment variable.

If you specify number, the string occupying that numeric position in the environment-string table is returned. In this case, Environ returns all of the text, including envstring. If there is no environment string in the specified position, Environ returns a zero-length string.
-
EOFReturns an Integer containing the Boolean value True when the end of a file opened for Random or sequential Input has been reached.

Syntax

EOF(filenumber)

The required filenumber argument is an Integer containing any valid file number.

Remarks

Use EOF to avoid the error generated by attempting to get input past the end of a file.

The EOF function returns False until the end of the file has been reached. With files opened for Random or Binary access, EOF returns False until the last executed Get statement is unable to read an entire record.

With files opened for Binary access, an attempt to read through the file using the Input function until EOF returns True generates an error. Use the LOF and Loc functions instead of EOF when reading binary files with Input, or use Get when using the EOF function. With files opened for Output, EOF always returns True.
-
ErrContains information about run-time errors.

Remarks
The properties of the Err object are set by the generator of an error Visual Basic, an object, or the programmer.

The default property of the Err object is Number. Because the default property can be represented by the object name Err, earlier code written using the Err function or Err statement doesn't have to be modified.

When a run-time error occurs, the properties of the Err object are filled with information that uniquely identifies the error and information that can be used to handle it. To generate a run-time error in your code, use the Raise method.

The Err object's properties are reset to zero or zero-length strings ("") after an Exit Sub, Exit Function, Exit Property or Resume Next statement within an error-handling routine. Using any form of the Resume statement outside of an error-handling routine will not reset the Err object's properties. The Clear method can be used to explicitly reset Err.

Use the Raise method, rather than the Error statement, to generate run-time errors for system errors and class modules. Using the Raise method in other code depends on the richness of the information you want to return.

The Err object is an intrinsic object with global scope. There is no need to create an instance of it in your code.
 
ErrorReturns the error message that corresponds to a given error number.

Syntax

Error[(errornumber)]

The optional errornumber argument can be any valid error number. If errornumber is a valid error number, but is not defined, Error returns the string "Application-defined or object-defined error." If errornumber is not valid, an error occurs. If errornumber is omitted, the message corresponding to the most recent run-time error is returned. If no run-time error has occurred, or errornumber is 0, Error returns a zero-length string ("").

Remarks

Examine the property settings of the Err object to identify the most recent run-time error. The return value of the Error function corresponds to the Description property of the Err object.
-
ExpReturns a Double specifying e (the base of natural logarithms) raised to a power.

Syntax

Exp(number)

The required number argument is a Double or any valid numeric expression.

Remarks

If the value of number exceeds 709.782712893, an error occurs. The constant e is approximately 2.718282.

Note The Exp function complements the action of the Log function and is sometimes referred to as the antilogarithm.
1
FileAttrReturns a Long representing the file mode for files opened using the Open statement.

Syntax

FileAttr(filenumber, returntype)

The FileAttr function syntax has these named arguments:

Part Description
filenumber Required; Integer. Any valid file number.
returntype Required; Integer. Number indicating the type of information to return. Specify 1 to return a value indicating the file mode. On 16-bit systems only, specify 2 to retrieve an operating system file handle. Returntype 2 is not supported in 32-bit systems and causes an error.


Return Values

When the returntype argument is 1, the following return values indicate the file access mode:

Mode Value
Input 1
Output 2
Random 4
Append 8
Binary 32
-
FileCopy -
FileDateTimeReturns a Variant (Date) that indicates the date and time when a file was created or last modified.

Syntax

FileDateTime(pathname)

The required pathname argument is a string expression that specifies a file name. The pathname may include the directory or folder, and the drive.
-
FileLenReturns a Long specifying the length of a file in bytes.

Syntax

FileLen(pathname)

The required pathname argument is a string expression that specifies a file. The pathname may include the directory or folder, and the drive.

Remarks

If the specified file is open when the FileLen function is called, the value returned represents the size of the file immediately before it was opened.

Note To obtain the length of an open file, use the LOF function.
-
FilterReturns a zero-based array containing subset of a string array based on a specified filter criteria.

Syntax

Filter(sourcesrray, match[, include[, compare]])

The Filter function syntax has these named argument:

Part Description
sourcearray Required. One-dimensional array of strings to be searched.
match Required. String to search for.
include Optional. Boolean value indicating whether to return substrings that include or exclude match. If include is True, Filter returns the subset of the array that contains match as a substring. If include is False, Filter returns the subset of the array that does not contain match as a substring.
compare Optional. Numeric value indicating the kind of string comparison to use. See Settings section for values.


Settings

The compare argument can have the following values:

Constant Value Description
vbUseCompareOption 1 Performs a comparison using the setting of the Option Compare statement.
vbBinaryCompare 0 Performs a binary comparison.
vbTextCompare 1 Performs a textual comparison.
vbDatabaseCompare 2 Microsoft Access only. Performs a comparison based on information in your database.


Remarks

If no matches of match are found within sourcearray, Filter returns an empty array. An error occurs if sourcearray is Null or is not a one-dimensional array.

The array returned by the Filter function contains only enough elements to contain the number of matched items.
?
FixSee Int1
FormatReturns a Variant (String) containing an expression formatted according to instructions contained in a format expression.

Syntax

Format(expression[, format[, firstdayofweek[, firstweekofyear]]])

The Format function syntax has these parts:

Part Description
expression Required. Any valid expression.
format Optional. A valid named or user-defined format expression.
firstdayofweek Optional. A constant that specifies the first day of the week.
firstweekofyear Optional. A constant that specifies the first week of the year.


Settings

The firstdayofweek argument has these settings:

Constant Value Description
vbUseSystem 0 Use NLS API setting.
VbSunday 1 Sunday (default)
vbMonday 2 Monday
vbTuesday 3 Tuesday
vbWednesday 4 Wednesday
vbThursday 5 Thursday
vbFriday 6 Friday
vbSaturday 7 Saturday


The firstweekofyear argument has these settings:

Constant Value Description
vbUseSystem 0 Use NLS API setting.
vbFirstJan1 1 Start with week in which January 1 occurs (default).
vbFirstFourDays 2 Start with the first week that has at least four days in the year.
vbFirstFullWeek 3 Start with the first full week of the year.


Remarks

To Format Do This
Numbers Use predefined named numeric formats or create user-defined numeric formats.
Dates and times Use predefined named date/time formats or create user-defined date/time formats.
Date and time serial numbers Use date and time formats or numeric formats.
Strings Create your own user-defined string formats.


If you try to format a number without specifying format, Format provides functionality similar to the Str function, although it is internationally aware. However, positive numbers formatted as strings using Format dont include a leading space reserved for the sign of the value; those converted using Str retain the leading space.

If you are formatting a non-localized numeric string, you should use a user-defined numeric format to ensure that you get the look you want.

Note If the Calendar property setting is Gregorian and format specifies date formatting, the supplied expression must be Gregorian. If the Visual Basic Calendar property setting is Hijri, the supplied expression must be Hijri.

If the calendar is Gregorian, the meaning of format expression symbols is unchanged. If the calendar is Hijri, all date format symbols (for example, dddd, mmmm, yyyy) have the same meaning but apply to the Hijri calendar. Format symbols remain in English; symbols that result in text display (for example, AM and PM) display the string (English or Arabic) associated with that symbol. The range of certain symbols changes when the calendar is Hijri.

Symbol Range
d 1-30
dd 1-30
ww 1-51
mmm Displays full month names (Hijri month names have no abbreviations).
y 1-355
yyyy 100-9666
?
FormatCurrencyReturns an expression formatted as a currency value using the currency symbol defined in the system control panel.

Syntax

FormatCurrency(Expression[,NumDigitsAfterDecimal [,IncludeLeadingDigit [,UseParensForNegativeNumbers [,GroupDigits]]]])

The FormatCurrency function syntax has these parts:

Part Description
Expression Required. Expression to be formatted.
NumDigitsAfterDecimal Optional. Numeric value indicating how many places to the right of the decimal are displayed. Default value is 1, which indicates that the computer's regional settings are used.
IncludeLeadingDigit Optional. Tristate constant that indicates whether or not a leading zero is displayed for fractional values. See Settings section for values.
UseParensForNegativeNumbers Optional. Tristate constant that indicates whether or not to place negative values within parentheses. See Settings section for values.
GroupDigits Optional. Tristate constant that indicates whether or not numbers are grouped using the group delimiter specified in the computer's regional settings. See Settings section for values.


Settings

The IncludeLeadingDigit, UseParensForNegativeNumbers, and GroupDigits arguments have the following settings:

Constant Value Description
vbTrue 1 True
vbFalse 0 False
vbUseDefault 2 Use the setting from the computer's regional settings.


Remarks

When one or more optional arguments are omitted, the values for omitted arguments are provided by the computer's regional settings.

The position of the currency symbol relative to the currency value is determined by the system's regional settings.

Note All settings information comes from the Regional Settings Currency tab, except leading zero which comes from the Number tab.
1
FormatDateTimeReturns an expression formatted as a date or time.

Syntax

FormatDateTime(Date[,NamedFormat])

The FormatDateTime function syntax has these parts:

Part Description
Date Required. Date expression to be formatted.
NamedFormat Optional. Numeric value that indicates the date/time format used. If omitted, vbGeneralDate is used.


Settings

The NamedFormat argument has the following settings:

Constant Value Description
vbGeneralDate 0 Display a date and/or time. If there is a date part, display it as a short date. If there is a time part, display it as a long time. If present, both parts are displayed.
vbLongDate 1 Display a date using the long date format specified in your computer's regional settings.
vbShortDate 2 Display a date using the short date format specified in your computer's regional settings.
vbLongTime 3 Display a time using the time format specified in your computer's regional settings.
vbShortTime 4 Display a time using the 24-hour format (hh:mm).
1
FormatNumberReturns an expression formatted as a number.

Syntax

FormatNumber(Expression[,NumDigitsAfterDecimal [,IncludeLeadingDigit [,UseParensForNegativeNumbers [,GroupDigits]]]])

The FormatNumber function syntax has these parts:

Part Description
Expression Required. Expression to be formatted.
NumDigitsAfterDecimal Optional. Numeric value indicating how many places to the right of the decimal are displayed. Default value is 1, which indicates that the computer's regional settings are used.
IncludeLeadingDigit Optional. Tristate constant that indicates whether or not a leading zero is displayed for fractional values. See Settings section for values.
UseParensForNegativeNumbers Optional. Tristate constant that indicates whether or not to place negative values within parentheses. See Settings section for values.
GroupDigits Optional. Tristate constant that indicates whether or not numbers are grouped using the group delimiter specified in the computer's regional settings. See Settings section for values.

Settings

The IncludeLeadingDigit, UseParensForNegativeNumbers, and GroupDigits arguments have the following settings:

Constant Value Description
vbTrue 1 True
vbFalse 0 False
vbUseDefault 2 Use the setting from the computer's regional settings.

Remarks

When one or more optional arguments are omitted, the values for omitted arguments are provided by the computer's regional settings.

Note All settings information comes from the Regional Settings Number tab.
1
FormatPercentReturns an expression formatted as a percentage (multipled by 100) with a trailing % character.

Syntax

FormatPercent(Expression[,NumDigitsAfterDecimal [,IncludeLeadingDigit [,UseParensForNegativeNumbers [,GroupDigits]]]])

The FormatPercent function syntax has these parts:

Part Description
Expression Required. Expression to be formatted.
NumDigitsAfterDecimal Optional. Numeric value indicating how many places to the right of the decimal are displayed. Default value is 1, which indicates that the computer's regional settings are used.
IncludeLeadingDigit Optional. Tristate constant that indicates whether or not a leading zero is displayed for fractional values. See Settings section for values.
UseParensForNegativeNumbers Optional. Tristate constant that indicates whether or not to place negative values within parentheses. See Settings section for values.
GroupDigits Optional. Tristate constant that indicates whether or not numbers are grouped using the group delimiter specified in the computer's regional settings. See Settings section for values.

Settings

The IncludeLeadingDigit, UseParensForNegativeNumbers, and GroupDigits arguments have the following settings:

Constant Value Description
vbTrue 1 True
vbFalse 0 False
vbUseDefault 2 Use the setting from the computer's regional settings.

Remarks

When one or more optional arguments are omitted, the values for omitted arguments are provided by the computer's regional settings.

Note All settings information comes from the Regional Settings Number tab.
1
FreeFileReturns an Integer representing the next file number available for use by the Open statement.

Syntax

FreeFile[(rangenumber)]

The optional rangenumber argument is a Variant that specifies the range from which the next free file number is to be returned. Specify a 0 (default) to return a file number in the range 1 255, inclusive. Specify a 1 to return a file number in the range 256 511.

Remarks

Use FreeFile to supply a file number that is not already in use.
-
FVReturns a Double specifying the future value of an annuity based on periodic, fixed payments and a fixed interest rate.

Syntax

FV(rate, nper, pmt[, pv[, type]])

The FV function has these named arguments:

Part Description
rate Required. Double specifying interest rate per period. For example, if you get a car loan at an annual percentage rate (APR) of 10 percent and make monthly payments, the rate per period is 0.1/12, or 0.0083.
nper Required. Integer specifying total number of payment periods in the annuity. For example, if you make monthly payments on a four-year car loan, your loan has a total of 4 * 12 (or 48) payment periods.
pmt Required. Double specifying payment to be made each period. Payments usually contain principal and interest that doesn't change over the life of the annuity.
pv Optional. Variant specifying present value (or lump sum) of a series of future payments. For example, when you borrow money to buy a car, the loan amount is the present value to the lender of the monthly car payments you will make. If omitted, 0 is assumed.
type Optional. Variant specifying when payments are due. Use 0 if payments are due at the end of the payment period, or use 1 if payments are due at the beginning of the period. If omitted, 0 is assumed.


Remarks

An annuity is a series of fixed cash payments made over a period of time. An annuity can be a loan (such as a home mortgage) or an investment (such as a monthly savings plan).

The rate and nper arguments must be calculated using payment periods expressed in the same units. For example, if rate is calculated using months, nper must also be calculated using months.

For all arguments, cash paid out (such as deposits to savings) is represented by negative numbers; cash received (such as dividend checks) is represented by positive numbers.
2
GetAllSettingsReturns a list of key settings and their respective values (originally created with SaveSetting) from an application's entry in the Windows registry.

Syntax

GetAllSettings(appname, section)

The GetAllSettings function syntax has these named arguments:

Part Description
appname Required. String expression containing the name of the application or project whose key settings are requested.
section Required. String expression containing the name of the section whose key settings are requested. GetAllSettings returns a Variant whose contents is a two-dimensional array of strings containing all the key settings in the specified section and their corresponding values.


Remarks

GetAllSettings returns an uninitialized Variant if either appname or section does not exist.
-
GetAttrReturns an Integer representing the attributes of a file, directory, or folder.

Syntax

GetAttr(pathname)

The required pathname argument is a string expression that specifies a file name. The pathname may include the directory or folder, and the drive.

Return Values

The value returned by GetAttr is the sum of the following attribute values:

Constant Value Description
vbNormal 0 Normal.
vbReadOnly 1 Read-only.
vbHidden 2 Hidden.
vbSystem 4 System file.
vbDirectory 16 Directory or folder.
vbArchive 32 File has changed since last backup.


Note These constants are specified by Visual Basic for Applications. The names can be used anywhere in your code in place of the actual values.

Remarks

To determine which attributes are set, use the And operator to perform a bitwise comparison of the value returned by the GetAttr function and the value of the individual file attribute you want. If the result is not zero, that attribute is set for the named file. For example, the return value of the following And expression is zero if the Archive attribute is not set:

Result = GetAttr(FName) And vbArchive
A nonzero value is returned if the Archive attribute is set.
-
GetObjectReturns a reference to an object provided by an ActiveX component.

Syntax

GetObject([pathname] [, class])

The GetObject function syntax has these named arguments:

Part Description
pathname Optional; Variant (String). The full path and name of the file containing the object to retrieve. If pathname is omitted, class is required.
class Optional; Variant (String). A string representing the class of the object.


The class argument uses the syntax appname.objecttype and has these parts:

Part Description
appname Required; Variant (String). The name of the application providing the object.
objecttype Required; Variant (String). The type or class of object to create.


Remarks

Use the GetObject function to access an ActiveX object from a file and assign the object to an object variable. Use the Set statement to assign the object returned by GetObject to the object variable. For example:

Dim CADObject As Object
Set CADObject = GetObject("C:\CAD\SCHEMA.CAD")
When this code is executed, the application associated with the specified pathname is started and the object in the specified file is activated.

If pathname is a zero-length string (""), GetObject returns a new object instance of the specified type. If the pathname argument is omitted, GetObject returns a currently active object of the specified type. If no object of the specified type exists, an error occurs.

Some applications allow you to activate part of a file. Add an exclamation point (!) to the end of the file name and follow it with a string that identifies the part of the file you want to activate. For information on how to create this string, see the documentation for the application that created the object.

For example, in a drawing application you might have multiple layers to a drawing stored in a file. You could use the following code to activate a layer within a drawing called
SCHEMA.CAD
:

Set LayerObject = GetObject("C:\CAD\SCHEMA.CAD!Layer3")
If you don't specify the object's class, Automation determines the application to start and the object to activate, based on the file name you provide. Some files, however, may support more than one class of object. For example, a drawing might support three different types of objects: an Application object, a Drawing object, and a Toolbar object, all of which are part of the same file. To specify which object in a file you want to activate, use the optional class argument. For example:

Dim MyObject As Object
Set MyObject = GetObject("C:\DRAWINGS\SAMPLE.DRW", "FIGMENT.DRAWING")
In the example,
FIGMENT
is the name of a drawing application and
DRAWING
is one of the object types it supports.

Once an object is activated, you reference it in code using the object variable you defined. In the preceding example, you access properties and methods of the new object using the object variable
MyObject
. For example:

MyObject.Line 9, 90
MyObject.InsertText 9, 100, "Hello, world."
MyObject.SaveAs "C:\DRAWINGS\SAMPLE.DRW"
Note Use the GetObject function when there is a current instance of the object or if you want to create the object with a file already loaded. If there is no current instance, and you don't want the object started with a file loaded, use the CreateObject function.

If an object has registered itself as a single-instance object, only one instance of the object is created, no matter how many times CreateObject is executed. With a single-instance object, GetObject always returns the same instance when called with the zero-length string ("") syntax, and it causes an error if the pathname argument is omitted. You can't use GetObject to obtain a reference to a class created with Visual Basic.
-
GetSettingReturns a key setting value from an application's entry in the Windows registry.

Syntax

GetSetting(appname, section, key[, default])

The GetSetting function syntax has these named arguments:

Part Description
appname Required. String expression containing the name of the application or project whose key setting is requested.
section Required. String expression containing the name of the section where the key setting is found.
key Required. String expression containing the name of the key setting to return.
default Optional. Expression containing the value to return if no value is set in the key setting. If omitted, default is assumed to be a zero-length string ("").

Remarks

If any of the items named in the GetSetting arguments do not exist, GetSetting returns the value of default.
-
HelpContext  
HelpFile  
HexReturns a String representing the hexadecimal value of a number.

Syntax

Hex(number)

The required number argument is any valid numeric expression or string expression.

Remarks

If number is not already a whole number, it is rounded to the nearest whole number before being evaluated.

If number is Hex returns
Null Null
Empty Zero (0)
Any other number Up to eight hexadecimal characters


You can represent hexadecimal numbers directly by preceding numbers in the proper range with
&H.
For example,
&H10
represents decimal 16 in hexadecimal notation.
1
HourReturns a Variant (Integer) specifying a whole number between 0 and 23, inclusive, representing the hour of the day.

Syntax

Hour(time)

The required time argument is any Variant, numeric expression, string expression, or any combination, that can represent a time. If time contains Null, Null is returned.
1
IIfReturns one of two parts, depending on the evaluation of an expression.

Syntax

IIf(expr, truepart, falsepart)

The IIf function syntax has these named arguments:

Part Description
expr Required. Expression you want to evaluate.
truepart Required. Value or expression returned if expr is True.
falsepart Required. Value or expression returned if expr is False.


Remarks

IIf always evaluates both truepart and falsepart, even though it returns only one of them. Because of this, you should watch for undesirable side effects. For example, if evaluating falsepart results in a division by zero error, an error occurs even if expr is True.
?
IMEStatusReturns an Integer specifying the current Input Method Editor (IME) mode of Microsoft Windows; available in East Asian versions only.

Syntax

IMEStatus

Return Values

The return values for the Japanese locale are as follows:

Constant Value Description
vbIMEModeNoControl 0 Don't control IME (default)
vbIMEModeOn 1 IME on
vbIMEModeOff 2 IME off
vbIMEModeDisable 3 IME disabled
vbIMEModeHiragana 4 Full-width Hiragana mode
vbIMEModeKatakana 5 Full-width Katakana mode
vbIMEModeKatakanaHalf 6 Half-width Katakana mode
vbIMEModeAlphaFull 7 Full-width Alphanumeric mode
vbIMEModeAlpha 8 Half-width Alphanumeric mode


The return values for the Korean locale are as follows:

Constant Value Description
vbIMEModeNoControl 0 Don't control IME(default)
vbIMEModeAlphaFull 7 Full-width Alphanumeric mode
vbIMEModeAlpha 8 Half-width Alphanumeric mode
vbIMEModeHangulFull 9 Full-width Hangul mode
vbIMEModeHangul 10 Half-width Hangul mode


The return values for the Chinese locale are as follows:

Constant Value Description
vbIMEModeNoControl 0 Don't control IME (default)
vbIMEModeOn 1 IME on
vbIMEModeOff 2 IME off
-
InputReturns String containing characters from a file opened in Input or Binary mode.

Syntax

Input(number, [#]filenumber)

The Input function syntax has these parts:

Part Description
number Required. Any valid numeric expression specifying the number of characters to return.
filenumber Required. Any valid file number.


Remarks

Data read with the Input function is usually written to a file with Print # or Put. Use this function only with files opened in Input or Binary mode.

Unlike the Input # statement, the Input function returns all of the characters it reads, including commas, carriage returns, linefeeds, quotation marks, and leading spaces.

With files opened for Binary access, an attempt to read through the file using the Input function until EOF returns True generates an error. Use the LOF and Loc functions instead of EOF when reading binary files with Input, or use Get when using the EOF function.

Security Note When reading from files, do not make decisions about the contents of the file based on the file name extension. For example, a file named Form1.vb may not be a Visual Basic source file.
Note Use the InputB function for byte data contained within text files. With InputB, number specifies the number of bytes to return rather than the number of characters to return.
-
InputB -
InputBoxDisplays a prompt in a dialog box, waits for the user to input text or click a button, and returns a String containing the contents of the text box.

Syntax

InputBox(prompt[, title] [, default] [, xpos] [, ypos] [, helpfile, context])

The InputBox function syntax has these named arguments:

Part Description
prompt Required. String expression displayed as the message in the dialog box. The maximum length of prompt is approximately 1024 characters, depending on the width of the characters used. If prompt consists of more than one line, you can separate the lines using a carriage return character (Chr(13)), a linefeed character (Chr(10)), or carriage returnlinefeed character combination (Chr(13) & Chr(10)) between each line.
title Optional. String expression displayed in the title bar of the dialog box. If you omit title, the application name is placed in the title bar.
default Optional. String expression displayed in the text box as the default response if no other input is provided. If you omit default, the text box is displayed empty.
xpos Optional. Numeric expression that specifies, in twips, the horizontal distance of the left edge of the dialog box from the left edge of the screen. If xpos is omitted, the dialog box is horizontally centered.
ypos Optional. Numeric expression that specifies, in twips, the vertical distance of the upper edge of the dialog box from the top of the screen. If ypos is omitted, the dialog box is vertically positioned approximately one-third of the way down the screen.
helpfile Optional. String expression that identifies the Help file to use to provide context-sensitive Help for the dialog box. If helpfile is provided, context must also be provided.
context Optional. Numeric expression that is the Help context number assigned to the appropriate Help topic by the Help author. If context is provided, helpfile must also be provided.


Remarks

When both helpfile and context are provided, the user can press F1 to view the Help topic corresponding to the context. Some host applications, for example, Microsoft Excel, also automatically add a Help button to the dialog box. If the user clicks OK or presses ENTER , the InputBox function returns whatever is in the text box. If the user clicks Cancel, the function returns a zero-length string ("").

Note To specify more than the first named argument, you must use InputBox in an expression. To omit some positional arguments, you must include the corresponding comma delimiter.
-
InStrReturns a Variant (Long) specifying the position of the first occurrence of one string within another.

Syntax

InStr([start, ]string1, string2[, compare])

The InStr function syntax has these arguments:

Part Description
start Optional. Numeric expression that sets the starting position for each search. If omitted, search begins at the first character position. If start contains Null, an error occurs. The start argument is required if compare is specified.
string1 Required. String expression being searched.
string2 Required. String expression sought.
compare Optional. Specifies the type of string comparison. If compare is Null, an error occurs. If compare is omitted, the Option Compare setting determines the type of comparison. Specify a valid LCID (LocaleID) to use locale-specific rules in the comparison.


Settings

The compare argument settings are:

Constant Value Description
vbUseCompareOption -1 Performs a comparison using the setting of the Option Compare statement.
vbBinaryCompare 0 Performs a binary comparison.
vbTextCompare 1 Performs a textual comparison.
vbDatabaseCompare 2 Microsoft Access only. Performs a comparison based on information in your database.


Return Values

If InStr returns
string1 is zero-length 0
string1 is Null Null
string2 is zero-length start
string2 is Null Null
string2 is not found 0
string2 is found within string1 Position at which match is found
start > string2 0


Remarks

The InStrB function is used with byte data contained in a string. Instead of returning the character position of the first occurrence of one string within another, InStrB returns the byte position.
mondrian 2.4
InStrBSee InStr.-
InStrRevReturns the position of an occurrence of one string within another, from the end of string.

Syntax

InstrRev(stringcheck, stringmatch[, start[, compare]])

The InstrRev function syntax has these named arguments:

Part Description
stringcheck Required. String expression being searched.
stringmatch Required. String expression being searched for.
start Optional. Numeric expression that sets the starting position for each search. If omitted, 1 is used, which means that the search begins at the last character position. If start contains Null, an error occurs.
compare Optional. Numeric value indicating the kind of comparison to use when evaluating substrings. If omitted, a binary comparison is performed. See Settings section for values.

Settings

The compare argument can have the following values:

Constant Value Description
vbUseCompareOption 1 Performs a comparison using the setting of the Option Compare statement.
vbBinaryCompare 0 Performs a binary comparison.
vbTextCompare 1 Performs a textual comparison.
vbDatabaseCompare 2 Microsoft Access only. Performs a comparison based on information in your database.


Return Values

InStrRev returns the following values:

If InStrRev returns
stringcheck is zero-length 0
stringcheck is Null Null
stringmatch is zero-length start
stringmatch is Null Null
stringmatch is not found 0
stringmatch is found within stringcheck Position at which match is found
start > Len(stringmatch) 0


Remarks

Note that the syntax for the InstrRev function is not the same as the syntax for the Instr function.
1
IntReturns the integer portion of a number.

Syntax

Int(number)
Fix(number)

The required number argument is a Double or any valid numeric expression. If number contains Null, Null is returned.

Remarks

Both Int and Fix remove the fractional part of number and return the resulting integer value.

The difference between Int and Fix is that if number is negative, Int returns the first negative integer less than or equal to number, whereas Fix returns the first negative integer greater than or equal to number. For example, Int converts -8.4 to -9, and Fix converts -8.4 to -8.

Fix(number) is equivalent to:

Sgn(number) * Int(Abs(number))
1
IPmtReturns a Double specifying the interest payment for a given period of an annuity based on periodic, fixed payments and a fixed interest rate.

Syntax

IPmt(rate, per, nper, pv[, fv[, type]])

The IPmt function has these named arguments:

Part Description
rate Required. Double specifying interest rate per period. For example, if you get a car loan at an annual percentage rate (APR) of 10 percent and make monthly payments, the rate per period is 0.1/12, or 0.0083.
per Required. Double specifying payment period in the range 1 through nper.
nper Required. Double specifying total number of payment periods in the annuity. For example, if you make monthly payments on a four-year car loan, your loan has a total of 4 * 12 (or 48) payment periods.
pv Required. Double specifying present value, or value today, of a series of future payments or receipts. For example, when you borrow money to buy a car, the loan amount is the present value to the lender of the monthly car payments you will make.
fv Optional. Variant specifying future value or cash balance you want after you've made the final payment. For example, the future value of a loan is $0 because that's its value after the final payment. However, if you want to save $50,000 over 18 years for your child's education, then $50,000 is the future value. If omitted, 0 is assumed.
type Optional. Variant specifying when payments are due. Use 0 if payments are due at the end of the payment period, or use 1 if payments are due at the beginning of the period. If omitted, 0 is assumed.


Remarks

An annuity is a series of fixed cash payments made over a period of time. An annuity can be a loan (such as a home mortgage) or an investment (such as a monthly savings plan).

The rate and nper arguments must be calculated using payment periods expressed in the same units. For example, if rate is calculated using months, nper must also be calculated using months.

For all arguments, cash paid out (such as deposits to savings) is represented by negative numbers; cash received (such as dividend checks) is represented by positive numbers.
2
IRRReturns a Double specifying the internal rate of return for a series of periodic cash flows (payments and receipts).

Syntax

IRR(values()[, guess])

The IRR function has these named arguments:

Part Description
values() Required. Array of Double specifying cash flow values. The array must contain at least one negative value (a payment) and one positive value (a receipt).
guess Optional. Variant specifying value you estimate will be returned by IRR. If omitted, guess is 0.1 (10 percent).


Remarks

The internal rate of return is the interest rate received for an investment consisting of payments and receipts that occur at regular intervals.

The IRR function uses the order of values within the array to interpret the order of payments and receipts. Be sure to enter your payment and receipt values in the correct sequence. The cash flow for each period doesn't have to be fixed, as it is for an annuity.

IRR is calculated by iteration. Starting with the value of guess, IRR cycles through the calculation until the result is accurate to within 0.00001 percent. If IRR can't find a result after 20 tries, it fails.
2
IsArrayReturns a Boolean value indicating whether a variable is an array.

Syntax

IsArray(varname)

The required varname argument is an identifier specifying a variable.

Remarks

IsArray returns True if the variable is an array; otherwise, it returns False. IsArray is especially useful with variants containing arrays.
2
IsDateReturns a Boolean value indicating whether an expression can be converted to a date.

Syntax

IsDate(expression)

The required expression argument is a Variant containing a date expression or string expression recognizable as a date or time.

Remarks

IsDate returns True if the expression is a date or is recognizable as a valid date; otherwise, it returns False. In Microsoft Windows, the range of valid dates is January 1, 100 A.D. through December 31, 9999 A.D.; the ranges vary among operating systems.
1
IsEmptyReturns a Boolean value indicating whether a variable has been initialized.

Syntax

IsEmpty(expression)

The required expression argument is a Variant containing a numeric or string expression. However, because IsEmpty is used to determine if individual variables are initialized, the expression argument is most often a single variable name.

Remarks

IsEmpty returns True if the variable is uninitialized, or is explicitly set to Empty; otherwise, it returns False. False is always returned if expression contains more than one variable. IsEmpty only returns meaningful information for variants.
since mondrian 0.6
IsErrorReturns a Boolean value indicating whether an expression is an error value.

Syntax

IsError(expression)

The required expression argument can be any valid expression.

Remarks

Error values are created by converting real numbers to error values using the CVErr function. The IsError function is used to determine if a numeric expression represents an error. IsError returns True if the expression argument indicates an error; otherwise, it returns False.
?
IsMissingReturns a Boolean value indicating whether an optional Variant argument has been passed to a procedure.

Syntax

IsMissing(argname)

The required argname argument contains the name of an optional Variant procedure argument.

Remarks

Use the IsMissing function to detect whether or not optional Variant arguments have been provided in calling a procedure. IsMissing returns True if no value has been passed for the specified argument; otherwise, it returns False. If IsMissing returns True for an argument, use of the missing argument in other code may cause a user-defined error. If IsMissing is used on a ParamArray argument, it always returns False. To detect an empty ParamArray, test to see if the arrays upper bound is less than its lower bound.

Note IsMissing does not work on simple data types (such as Integer or Double) because, unlike Variants, they don't have a provision for a "missing" flag bit. Because of this, the syntax for typed optional arguments allows you to specify a default value. If the argument is omitted when the procedure is called, then the argument will have this default value, as in the example below:

Sub MySub(Optional MyVar As String = "specialvalue")
If MyVar = "specialvalue" Then
' MyVar was omitted.
Else
...
End Sub
In many cases you can omit the
If MyVar
test entirely by making the default value equal to the value you want
MyVar
to contain if the user omits it from the function call. This makes your code more concise and efficient.
?
IsNullReturns a Boolean value that indicates whether an expression contains no valid data (Null).

Syntax

IsNull(expression)

The required expression argument is a Variant containing a numeric expression or string expression.

Remarks

IsNull returns True if expression is Null; otherwise, IsNull returns False. If expression consists of more than one variable, Null in any constituent variable causes True to be returned for the entire expression.

The Null value indicates that the Variant contains no valid data. Null is not the same as Empty, which indicates that a variable has not yet been initialized. It is also not the same as a zero-length string (""), which is sometimes referred to as a null string.

Important Use the IsNull function to determine whether an expression contains a Null value. Expressions that you might expect to evaluate to True under some circumstances, such as
If Var = Null
and
If Var <> Null
, are always False. This is because any expression containing a Null is itself Null and, therefore, False.
1
IsNumericReturns a Boolean value indicating whether an expression can be evaluated as a number.

Syntax

IsNumeric(expression)

The required expression argument is a Variant containing a numeric expression or string expression.

Remarks

IsNumeric returns True if the entire expression is recognized as a number; otherwise, it returns False.

IsNumeric returns False if expression is a date expression.
1
IsObjectReturns a Boolean value indicating whether an identifier represents an object variable.

Syntax

IsObject(identifier)

The required identifier argument is a variable name.

Remarks

IsObject is useful only in determining whether a Variant is of VarType vbObject. This could occur if the Variant actually references (or once referenced) an object, or if it contains Nothing.

IsObject returns True if identifier is a variable declared with Object type or any valid class type, or if identifier is a Variant of VarType vbObject, or a user-defined object; otherwise, it returns False. IsObject returns True even if the variable has been set to Nothing.

Use error trapping to be sure that an object reference is valid.
2
Item ?
JoinReturns a string created by joining a number of substrings contained in an array.

Syntax

Join(sourcearray[, delimiter])

The Join function syntax has these named arguments:

Part Description
sourcearray Required. One-dimensional array containing substrings to be joined.
delimiter Optional. String character used to separate the substrings in the returned string. If omitted, the space character (" ") is used. If delimiter is a zero-length string (""), all items in the list are concatenated with no delimiters.
-
Kill  
LastDllError  
LCaseReturns a String that has been converted to lowercase.

Syntax

LCase(string)

The required string argument is any valid string expression. If string contains Null, Null is returned.

Remarks

Only uppercase letters are converted to lowercase; all lowercase letters and nonletter characters remain unchanged.
1
LeftReturns a Variant (String) containing a specified number of characters from the left side of a string.

Syntax

Left(string, length)

The Left function syntax has these named arguments:

Part Description
string Required. String expression from which the leftmost characters are returned. If string contains Null, Null is returned.
length Required; Variant (Long). Numeric expression indicating how many characters to return. If 0, a zero-length string ("") is returned. If greater than or equal to the number of characters in string, the entire string is returned.


Remarks

To determine the number of characters in string, use the Len function.

Note Use the LeftB function with byte data contained in a string. Instead of specifying the number of characters to return, length specifies the number of bytes.
mondrian 2.4
LeftBSee Left. 
LenReturns a Long containing the number of characters in a string or the number of bytes required to store a variable.

Syntax

Len(string | varname)

The Len function syntax has these parts:

Part Description
string Any valid string expression. If string contains Null, Null is returned.
Varname Any valid variable name. If varname contains Null, Null is returned. If varname is a Variant, Len treats it the same as a String and always returns the number of characters it contains.


Remarks

One (and only one) of the two possible arguments must be specified. With user-defined types, Len returns the size as it will be written to the file.

Note Use the LenB function with byte data contained in a string, as in double-byte character set (DBCS) languages. Instead of returning the number of characters in a string, LenB returns the number of bytes used to represent that string. With user-defined types, LenB returns the in-memory size, including any padding between elements. For sample code that uses LenB, see the second example in the example topic.

Note Len may not be able to determine the actual number of storage bytes required when used with variable-length strings in user-defined data types.
mondrian 2.4
LenBSee Len. 
LocReturns a Long specifying the current read/write position within an open file.

Syntax

Loc(filenumber)

The required filenumber argument is any valid Integer file number.

Remarks

The following describes the return value for each file access mode:

Mode Return Value
Random Number of the last record read from or written to the file.
Sequential Current byte position in the file divided by 128. However, information returned by Loc for sequential files is neither used nor required.
Binary Position of the last byte read or written.
-
LOFReturns a Long representing the size, in bytes, of a file opened using the Open statement.

Syntax

LOF(filenumber)

The required filenumber argument is an Integer containing a valid file number.

Note Use the FileLen function to obtain the length of a file that is not open.
-
LogReturns a Double specifying the natural logarithm of a number.

Syntax

Log(number)

The required number argument is a Double or any valid numeric expression greater than zero.

Remarks

The natural logarithm is the logarithm to the base e. The constant e is approximately 2.718282.

You can calculate base-n logarithms for any number x by dividing the natural logarithm of x by the natural logarithm of n as follows:

Logn(x) = Log(x) / Log(n)

The following example illustrates a custom Function that calculates base-10 logarithms:

Static Function Log10(X)
Log10 = Log(X) / Log(10#)
End Function
1
LTrimReturns a Variant (String) containing a copy of a specified string without leading spaces (LTrim), trailing spaces (RTrim), or both leading and trailing spaces (Trim).

Syntax

LTrim(string)
RTrim(string)
Trim(string)

The required string argument is any valid string expression. If string contains Null, Null is returned.
1
MidReturns a Variant (String) containing a specified number of characters from a string.

Syntax

Mid(string, start[, length])

The Mid function syntax has these named arguments:

Part Description
string Required. String expression from which characters are returned. If string contains Null, Null is returned.
start Required; Long. Character position in string at which the part to be taken begins. If start is greater than the number of characters in string, Mid returns a zero-length string ("").
length Optional; Variant (Long). Number of characters to return. If omitted or if there are fewer than length characters in the text (including the character at start), all characters from the start position to the end of the string are returned.


Remarks

To determine the number of characters in string, use the Len function.

Note Use the MidB function with byte data contained in a string, as in double-byte character set languages. Instead of specifying the number of characters, the arguments specify numbers of bytes. For sample code that uses MidB, see the second example in the example topic.
mondrian 2.4
MidBSee Mid.-
MinuteReturns a Variant (Integer) specifying a whole number between 0 and 59, inclusive, representing the minute of the hour.

Syntax

Minute(time)

The required time argument is any Variant, numeric expression, string expression, or any combination, that can represent a time. If time contains Null, Null is returned.
1
MIRRReturns a Double specifying the modified internal rate of return for a series of periodic cash flows (payments and receipts).

Syntax

MIRR(values(), finance_rate, reinvest_rate)

The MIRR function has these named arguments:

Part Description
values() Required. Array of Double specifying cash flow values. The array must contain at least one negative value (a payment) and one positive value (a receipt).
finance_rate Required. Double specifying interest rate paid as the cost of financing.
reinvest_rate Required. Double specifying interest rate received on gains from cash reinvestment.

Remarks

The modified internal rate of return is the internal rate of return when payments and receipts are financed at different rates. The MIRR function takes into account both the cost of the investment (finance_rate) and the interest rate received on reinvestment of cash (reinvest_rate).

The finance_rate and reinvest_rate arguments are percentages expressed as decimal values. For example, 12 percent is expressed as 0.12.

The MIRR function uses the order of values within the array to interpret the order of payments and receipts. Be sure to enter your payment and receipt values in the correct sequence.
2
MkDir -
MonthReturns a Variant (Integer) specifying a whole number between 1 and 12, inclusive, representing the month of the year.

Syntax

Month(date)

The required date argument is any Variant, numeric expression, string expression, or any combination, that can represent a date. If date contains Null, Null is returned.

Note If the Calendar property setting is Gregorian, the returned integer represents the Gregorian day of the week for the date argument. If the calendar is Hijri, the returned integer represents the Hijri day of the week for the date argument. For Hijri dates, the argument number is any numeric expression that can represent a date and/or time from 1/1/100 (Gregorian Aug 2, 718) through 4/3/9666 (Gregorian Dec 31, 9999).
1
MonthNameReturns a string indicating the specified month.

Syntax

MonthName(month[, abbreviate])

The MonthName function syntax has these parts:

Part Description
month Required. The numeric designation of the month. For example, January is 1, February is 2, and so on.
abbreviate Optional. Boolean value that indicates if the month name is to be abbreviated. If omitted, the default is False, which means that the month name is not abbreviated.
1
MsgBoxDisplays a message in a dialog box, waits for the user to click a button, and returns an Integer indicating which button the user clicked.

Syntax

MsgBox(prompt[, buttons] [, title] [, helpfile, context])

The MsgBox function syntax has these named arguments:

Part Description
prompt Required. String expression displayed as the message in the dialog box. The maximum length of prompt is approximately 1024 characters, depending on the width of the characters used. If prompt consists of more than one line, you can separate the lines using a carriage return character (Chr(13)), a linefeed character (Chr(10)), or carriage return linefeed character combination (Chr(13) & Chr(10)) between each line.
buttons Optional. Numeric expression that is the sum of values specifying the number and type of buttons to display, the icon style to use, the identity of the default button, and the modality of the message box. If omitted, the default value for buttons is 0.
title Optional. String expression displayed in the title bar of the dialog box. If you omit title, the application name is placed in the title bar.
helpfile Optional. String expression that identifies the Help file to use to provide context-sensitive Help for the dialog box. If helpfile is provided, context must also be provided.
context Optional. Numeric expression that is the Help context number assigned to the appropriate Help topic by the Help author. If context is provided, helpfile must also be provided.


Settings

The buttons argument settings are:

Constant Value Description
vbOKOnly 0 Display OK button only.
vbOKCancel 1 Display OK and Cancel buttons.
vbAbortRetryIgnore 2 Display Abort, Retry, and Ignore buttons.
vbYesNoCancel 3 Display Yes, No, and Cancel buttons.
vbYesNo 4 Display Yes and No buttons.
vbRetryCancel 5 Display Retry and Cancel buttons.
vbCritical 16 Display Critical Message icon.
vbQuestion 32 Display Warning Query icon.
vbExclamation 48 Display Warning Message icon.
vbInformation 64 Display Information Message icon.
vbDefaultButton1 0 First button is default.
vbDefaultButton2 256 Second button is default.
vbDefaultButton3 512 Third button is default.
vbDefaultButton4 768 Fourth button is default.
vbApplicationModal 0 Application modal; the user must respond to the message box before continuing work in the current application.
vbSystemModal 4096 System modal; all applications are suspended until the user responds to the message box.
vbMsgBoxHelpButton 16384 Adds Help button to the message box
VbMsgBoxSetForeground 65536 Specifies the message box window as the foreground window
vbMsgBoxRight 524288 Text is right aligned
vbMsgBoxRtlReading 1048576 Specifies text should appear as right-to-left reading on Hebrew and Arabic systems


The first group of values (05) describes the number and type of buttons displayed in the dialog box; the second group (16, 32, 48, 64) describes the icon style; the third group (0, 256, 512) determines which button is the default; and the fourth group (0, 4096) determines the modality of the message box. When adding numbers to create a final value for the buttons argument, use only one number from each group.

Note These constants are specified by Visual Basic for Applications. As a result, the names can be used anywhere in your code in place of the actual values.

Return Values

Constant Value Description
vbOK 1 OK
vbCancel 2 Cancel
vbAbort 3 Abort
vbRetry 4 Retry
vbIgnore 5 Ignore
vbYes 6 Yes
vbNo 7 No


Remarks

When both helpfile and context are provided, the user can press F1 to view the Help topic corresponding to the context. Some host applications, for example, Microsoft Excel, also automatically add a Help button to the dialog box.

If the dialog box displays a Cancel button, pressing the ESC key has the same effect as clicking Cancel. If the dialog box contains a Help button, context-sensitive Help is provided for the dialog box. However, no value is returned until one of the other buttons is clicked.

Note To specify more than the first named argument, you must use MsgBox in an expression. To omit some positional arguments, you must include the corresponding comma delimiter.
-
NowReturns a Variant (Date) specifying the current date and time according your computer's system date and time.

Syntax

Now
1
NPerReturns a Double specifying the number of periods for an annuity based on periodic, fixed payments and a fixed interest rate.

Syntax

NPer(rate, pmt, pv[, fv[, type]])

The NPer function has these named arguments:

Part Description
rate Required. Double specifying interest rate per period. For example, if you get a car loan at an annual percentage rate (APR) of 10 percent and make monthly payments, the rate per period is 0.1/12, or 0.0083.
pmt Required. Double specifying payment to be made each period. Payments usually contain principal and interest that doesn't change over the life of the annuity.
pv Required. Double specifying present value, or value today, of a series of future payments or receipts. For example, when you borrow money to buy a car, the loan amount is the present value to the lender of the monthly car payments you will make.
fv Optional. Variant specifying future value or cash balance you want after you've made the final payment. For example, the future value of a loan is $0 because that's its value after the final payment. However, if you want to save $50,000 over 18 years for your child's education, then $50,000 is the future value. If omitted, 0 is assumed.
type Optional. Variant specifying when payments are due. Use 0 if payments are due at the end of the payment period, or use 1 if payments are due at the beginning of the period. If omitted, 0 is assumed.


Remarks

An annuity is a series of fixed cash payments made over a period of time. An annuity can be a loan (such as a home mortgage) or an investment (such as a monthly savings plan).

For all arguments, cash paid out (such as deposits to savings) is represented by negative numbers; cash received (such as dividend checks) is represented by positive numbers.
2
NPVReturns a Double specifying the net present value of an investment based on a series of periodic cash flows (payments and receipts) and a discount rate.

Syntax

NPV(rate, values())

The NPV function has these named arguments:

Part Description
rate Required. Double specifying discount rate over the length of the period, expressed as a decimal.
values() Required. Array of Double specifying cash flow values. The array must contain at least one negative value (a payment) and one positive value (a receipt).


Remarks

The net present value of an investment is the current value of a future series of payments and receipts.

The NPV function uses the order of values within the array to interpret the order of payments and receipts. Be sure to enter your payment and receipt values in the correct sequence.

The NPV investment begins one period before the date of the first cash flow value and ends with the last cash flow value in the array.

The net present value calculation is based on future cash flows. If your first cash flow occurs at the beginning of the first period, the first value must be added to the value returned by NPV and must not be included in the cash flow values of values( ).

The NPV function is similar to the PV function (present value) except that the PV function allows cash flows to begin either at the end or the beginning of a period. Unlike the variable NPV cash flow values, PV cash flows must be fixed throughout the investment.
2
Number ?
OctReturns a Variant (String) representing the octal value of a number.

Syntax

Oct(number)

The required number argument is any valid numeric expression or string expression.

Remarks

If number is not already a whole number, it is rounded to the nearest whole number before being evaluated.

If number is Oct returns
Null Null
Empty Zero (0)
Any other number Up to 11 octal characters


You can represent octal numbers directly by preceding numbers in the proper range with
&O
. For example,
&O10
is the octal notation for decimal 8.
1
PartitionReturns a Variant (String) indicating where a number occurs within a calculated series of ranges.

Syntax

Partition(number, start, stop, interval)

The Partition function syntax has these named arguments:

Part Description
number Required. Whole number that you want to evaluate against the ranges.
start Required. Whole number that is the start of the overall range of numbers. The number can't be less than 0.
stop Required. Whole number that is the end of the overall range of numbers. The number can't be equal to or less than start.


Remarks

The Partition function identifies the particular range in which number falls and returns a Variant (String) describing that range. The Partition function is most useful in queries. You can create a select query that shows how many orders fall within various ranges, for example, order values from 1 to 1000, 1001 to 2000, and so on.

The following table shows how the ranges are determined using three sets of start, stop, and interval parts. The First Range and Last Range columns show what Partition returns. The ranges are represented by lowervalue:uppervalue, where the low end (lowervalue) of the range is separated from the high end (uppervalue) of the range with a colon (:).

start stop interval Before First First Range Last Range After Last
0 99 5 " :-1" " 0: 4" " 95: 99" " 100: "
20 199 10 " : 19" " 20: 29" " 190: 199" " 200: "
100 1010 20 " : 99" " 100: 119" " 1000: 1010" " 1011: "


In the table shown above, the third line shows the result when start and stop define a set of numbers that can't be evenly divided by interval. The last range extends to stop (11 numbers) even though interval is 20.

If necessary, Partition returns a range with enough leading spaces so that there are the same number of characters to the left and right of the colon as there are characters in stop, plus one. This ensures that if you use Partition with other numbers, the resulting text will be handled properly during any subsequent sort operation.

If interval is 1, the range is number:number, regardless of the start and stop arguments. For example, if interval is 1, number is 100 and stop is 1000, Partition returns " 100: 100".

If any of the parts is Null, Partition returns a Null.
2
PmtReturns a Double specifying the payment for an annuity based on periodic, fixed payments and a fixed interest rate.

Syntax

Pmt(rate, nper, pv[, fv[, type]])

The Pmt function has these named arguments:

Part Description
rate Required. Double specifying interest rate per period. For example, if you get a car loan at an annual percentage rate (APR) of 10 percent and make monthly payments, the rate per period is 0.1/12, or 0.0083.
nper Required. Integer specifying total number of payment periods in the annuity. For example, if you make monthly payments on a four-year car loan, your loan has a total of 4 * 12 (or 48) payment periods.
pv Required. Double specifying present value (or lump sum) that a series of payments to be paid in the future is worth now. For example, when you borrow money to buy a car, the loan amount is the present value to the lender of the monthly car payments you will make.
fv Optional. Variant specifying future value or cash balance you want after you've made the final payment. For example, the future value of a loan is $0 because that's its value after the final payment. However, if you want to save $50,000 over 18 years for your child's education, then $50,000 is the future value. If omitted, 0 is assumed.
type Optional. Variant specifying when payments are due. Use 0 if payments are due at the end of the payment period, or use 1 if payments are due at the beginning of the period. If omitted, 0 is assumed.


Remarks

An annuity is a series of fixed cash payments made over a period of time. An annuity can be a loan (such as a home mortgage) or an investment (such as a monthly savings plan).

The rate and nper arguments must be calculated using payment periods expressed in the same units. For example, if rate is calculated using months, nper must also be calculated using months.

For all arguments, cash paid out (such as deposits to savings) is represented by negative numbers; cash received (such as dividend checks) is represented by positive numbers.
2
PPmtReturns a Double specifying the principal payment for a given period of an annuity based on periodic, fixed payments and a fixed interest rate.

Syntax

PPmt(rate, per, nper, pv[, fv[, type]])

The PPmt function has these named arguments:

Part Description
rate Required. Double specifying interest rate per period. For example, if you get a car loan at an annual percentage rate (APR) of 10 percent and make monthly payments, the rate per period is 0.1/12, or 0.0083.
per Required. Integer specifying payment period in the range 1 through nper.
nper Required. Integer specifying total number of payment periods in the annuity. For example, if you make monthly payments on a four-year car loan, your loan has a total of 4 * 12 (or 48) payment periods.
pv Required. Double specifying present value, or value today, of a series of future payments or receipts. For example, when you borrow money to buy a car, the loan amount is the present value to the lender of the monthly car payments you will make.
fv Optional. Variant specifying future value or cash balance you want after you've made the final payment. For example, the future value of a loan is $0 because that's its value after the final payment. However, if you want to save $50,000 over 18 years for your child's education, then $50,000 is the future value. If omitted, 0 is assumed.
type Optional. Variant specifying when payments are due. Use 0 if payments are due at the end of the payment period, or use 1 if payments are due at the beginning of the period. If omitted, 0 is assumed.


Remarks

An annuity is a series of fixed cash payments made over a period of time. An annuity can be a loan (such as a home mortgage) or an investment (such as a monthly savings plan).

The rate and nper arguments must be calculated using payment periods expressed in the same units. For example, if rate is calculated using months, nper must also be calculated using months.

For all arguments, cash paid out (such as deposits to savings) is represented by negative numbers; cash received (such as dividend checks) is represented by positive numbers.
2
PVReturns a Double specifying the present value of an annuity based on periodic, fixed payments to be paid in the future and a fixed interest rate.

Syntax

PV(rate, nper, pmt[, fv[, type]])

The PV function has these named arguments:

Part Description
rate Required. Double specifying interest rate per period. For example, if you get a car loan at an annual percentage rate (APR) of 10 percent and make monthly payments, the rate per period is 0.1/12, or 0.0083.
nper Required. Integer specifying total number of payment periods in the annuity. For example, if you make monthly payments on a four-year car loan, your loan has a total of 4 * 12 (or 48) payment periods.
pmt Required. Double specifying payment to be made each period. Payments usually contain principal and interest that doesn't change over the life of the annuity.
fv Optional. Variant specifying future value or cash balance you want after you've made the final payment. For example, the future value of a loan is $0 because that's its value after the final payment. However, if you want to save $50,000 over 18 years for your child's education, then $50,000 is the future value. If omitted, 0 is assumed.
type Optional. Variant specifying when payments are due. Use 0 if payments are due at the end of the payment period, or use 1 if payments are due at the beginning of the period. If omitted, 0 is assumed.


Remarks

An annuity is a series of fixed cash payments made over a period of time. An annuity can be a loan (such as a home mortgage) or an investment (such as a monthly savings plan).

The rate and nper arguments must be calculated using payment periods expressed in the same units. For example, if rate is calculated using months, nper must also be calculated using months.

For all arguments, cash paid out (such as deposits to savings) is represented by negative numbers; cash received (such as dividend checks) is represented by positive numbers.
2
QBColorReturns a Long representing the RGB color code corresponding to the specified color number.

Syntax

QBColor(color)

The required color argument is a whole number in the range 015.

Settings

The color argument has these settings:

Number Color Number Color
0 Black 8 Gray
1 Blue 9 Light Blue
2 Green 10 Light Green
3 Cyan 11 Light Cyan
4 Red 12 Light Red
5 Magenta 13 Light Magenta
6 Yellow 14 Light Yellow
7 White 15 Bright White


Remarks

The color argument represents color values used by earlier versions of Basic (such as Microsoft Visual Basic for MS-DOS and the Basic Compiler). Starting with the least-significant byte, the returned value specifies the red, green, and blue values used to set the appropriate color in the RGB system used by Visual Basic for Applications.
2
Raise  
RandomizeSee Rnd.2
RateReturns a Double specifying the interest rate per period for an annuity.

Syntax

Rate(nper, pmt, pv[, fv[, type[, guess]]])

The Rate function has these named arguments:

Part Description
nper Required. Double specifying total number of payment periods in the annuity. For example, if you make monthly payments on a four-year car loan, your loan has a total of 4 * 12 (or 48) payment periods.
pmt Required. Double specifying payment to be made each period. Payments usually contain principal and interest that doesn't change over the life of the annuity.
pv Required. Double specifying present value, or value today, of a series of future payments or receipts. For example, when you borrow money to buy a car, the loan amount is the present value to the lender of the monthly car payments you will make.
fv Optional. Variant specifying future value or cash balance you want after you make the final payment. For example, the future value of a loan is $0 because that's its value after the final payment. However, if you want to save $50,000 over 18 years for your child's education, then $50,000 is the future value. If omitted, 0 is assumed.
type Optional. Variant specifying a number indicating when payments are due. Use 0 if payments are due at the end of the payment period, or use 1 if payments are due at the beginning of the period. If omitted, 0 is assumed.
guess Optional. Variant specifying value you estimate will be returned by Rate. If omitted, guess is 0.1 (10 percent).


Remarks

An annuity is a series of fixed cash payments made over a period of time. An annuity can be a loan (such as a home mortgage) or an investment (such as a monthly savings plan).

For all arguments, cash paid out (such as deposits to savings) is represented by negative numbers; cash received (such as dividend checks) is represented by positive numbers.

Rate is calculated by iteration. Starting with the value of guess, Rate cycles through the calculation until the result is accurate to within 0.00001 percent. If Rate can't find a result after 20 tries, it fails. If your guess is 10 percent and Rate fails, try a different value for guess.
2
Remove  
ReplaceReturns a string in which a specified substring has been replaced with another substring a specified number of times.

Syntax

Replace(expression, find, replace[, start[, count[, compare]]])

The Replace function syntax has these named arguments:

Part Description
expression Required. String expression containing substring to replace.
find Required. Substring being searched for.
replace Required. Replacement substring.
start Optional. Position within expression where substring search is to begin. If omitted, 1 is assumed.
count Optional. Number of substring substitutions to perform. If omitted, the default value is 1, which means make all possible substitutions.
compare Optional. Numeric value indicating the kind of comparison to use when evaluating substrings. See Settings section for values.


Settings

The compare argument can have the following values:

Constant Value Description
vbUseCompareOption 1 Performs a comparison using the setting of the Option Compare statement.
vbBinaryCompare 0 Performs a binary comparison.
vbTextCompare 1 Performs a textual comparison.
vbDatabaseCompare 2 Microsoft Access only. Performs a comparison based on information in your database.


Return Values

Replace returns the following values:

If Replace returns
expression is zero-length Zero-length string ("")
expression is Null An error.
find is zero-length Copy of expression.
replace is zero-length Copy of expression with all occurences of find removed.
start > Len(expression) Zero-length string.
count is 0 Copy of expression.


Remarks

The return value of the Replace function is a string, with substitutions made, that begins at the position specified by start and and concludes at the end of the expression string. It is not a copy of the original string from start to finish.
1
Reset  
RGBReturns a Long whole number representing an RGB color value.

Syntax

RGB(red, green, blue)

The RGB function syntax has these named arguments:

Part Description
red Required; Variant (Integer). Number in the range 0255, inclusive, that represents the red component of the color.
green Required; Variant (Integer). Number in the range 0255, inclusive, that represents the green component of the color.
blue Required; Variant (Integer). Number in the range 0255, inclusive, that represents the blue component of the color.


Remarks

Application methods and properties that accept a color specification expect that specification to be a number representing an RGB color value. An RGB color value specifies the relative intensity of red, green, and blue to cause a specific color to be displayed.

The value for any argument to RGB that exceeds 255 is assumed to be 255.

The following table lists some standard colors and the red, green, and blue values they include:

Color Red Value Green Value Blue Value
Black 0 0 0
Blue 0 0 255
Green 0 255 0
Cyan 0 255 255
Red 255 0 0
Magenta 255 0 255
Yellow 255 255 0
White 255 255 255
2
RightReturns a Variant (String) containing a specified number of characters from the right side of a string.

Syntax

Right(string, length)

The Right function syntax has these named arguments:

Part Description
string Required. String expression from which the rightmost characters are returned. If string contains Null, Null is returned.
length Required; Variant (Long). Numeric expression indicating how many characters to return. If 0, a zero-length string ("") is returned. If greater than or equal to the number of characters in string, the entire string is returned.


Remarks

To determine the number of characters in string, use the Len function.

Note Use the RightB function with byte data contained in a string. Instead of specifying the number of characters to return, length specifies the number of bytes.
1
RightBSee Right.-
RmDir -
RndReturns a Single containing a random number.

Syntax

Rnd[(number)]

The optional number argument is a Single or any valid numeric expression.

Return Values

If number is Rnd generates
Less than zero The same number every time, using number as the seed.
Greater than zero The next random number in the sequence.
Equal to zero The most recently generated number.
Not supplied The next random number in the sequence.


Remarks

The Rnd function returns a value less than 1 but greater than or equal to zero.

The value of number determines how Rnd generates a random number:

For any given initial seed, the same number sequence is generated because each successive call to the Rnd function uses the previous number as a seed for the next number in the sequence.

Before calling Rnd, use the Randomize statement without an argument to initialize the random-number generator with a seed based on the system timer.

To produce random integers in a given range, use this formula:

Int((upperbound - lowerbound + 1) * Rnd + lowerbound)
Here, upperbound is the highest number in the range, and lowerbound is the lowest number in the range.

Note To repeat sequences of random numbers, call Rnd with a negative argument immediately before using Randomize with a numeric argument. Using Randomize with the same value for number does not repeat the previous sequence.

Security Note Because the Random statement and the Rnd function start with a seed value and generate numbers that fall within a finite range, the results may be predictable by someone who knows the algorithm used to generate them. Consequently, the Random statement and the Rnd function should not be used to generate random numbers for use in cryptography.
2
RoundReturns a number rounded to a specified number of decimal places.

Syntax

Round(expression [,numdecimalplaces])

The Round function syntax has these parts:

Part Description
expression Required. Numeric expression being rounded.
numdecimalplaces Optional. Number indicating how many places to the right of the decimal are included in the rounding. If omitted, integers are returned by the Round function.
1
RTrimSee LTrim.1
SaveSetting -
SecondReturns a Variant (Integer) specifying a whole number between 0 and 59, inclusive, representing the second of the minute.

Syntax

Second(time)

The required time argument is any Variant, numeric expression, string expression, or any combination, that can represent a time. If time contains Null, Null is returned.
1
SeekReturns a Long specifying the current read/write position within a file opened using the Open statement.

Syntax

Seek(filenumber)

The required filenumber argument is an Integer containing a valid file number.

Remarks

Seek returns a value between 1 and 2,147,483,647 (equivalent to 2^31 1), inclusive.

The following describes the return values for each file access mode.

Mode Return Value
Random Number of the next record read or written
Binary,
Output,
Append,
Input Byte position at which the next operation takes place. The first byte in a file is at position 1, the second byte is at position 2, and so on.
-
SendKeys  
SetAttr  
SgnReturns a Variant (Integer) indicating the sign of a number.

Syntax

Sgn(number)

The required number argument can be any valid numeric expression.

Return Values

If number is Sgn returns
Greater than zero 1
Equal to zero 0
Less than zero -1

Remarks

The sign of the number argument determines the return value of the Sgn function.
1
ShellRuns an executable program and returns a Variant (Double) representing the program's task ID if successful, otherwise it returns zero.

Syntax

Shell(pathname[,windowstyle])

The Shell function syntax has these named arguments:

Part Description
pathname Required; Variant (String). Name of the program to execute and any required arguments or command-line switches; may include directory or folder and drive.
windowstyle Optional. Variant (Integer) corresponding to the style of the window in which the program is to be run. If windowstyle is omitted, the program is started minimized with focus.


The windowstyle named argument has these values:

Constant Value Description
vbHide 0 Window is hidden and focus is passed to the hidden window.
vbNormalFocus 1 Window has focus and is restored to its original size and position.
vbMinimizedFocus 2 Window is displayed as an icon with focus.
vbMaximizedFocus 3 Window is maximized with focus.
vbNormalNoFocus 4 Window is restored to its most recent size and position. The currently active window remains active.
vbMinimizedNoFocus 6 Window is displayed as an icon. The currently active window remains active.


Remarks

If the Shell function successfully executes the named file, it returns the task ID of the started program. The task ID is a unique number that identifies the running program. If the Shell function can't start the named program, an error occurs.

Note By default, the Shell function runs other programs asynchronously. This means that a program started with Shell might not finish executing before the statements following the Shell function are executed.

Security Note If you do not enclose the path and file specification in quotes, there is a security risk if the file name or a path node contains spaces. If the path node specification is not inside quotes, for example
\Program Files
and a program named
Program.exe
had been installed in C:\, for example by illicit tampering, Windows would execute it instead of
MyFile.exe
-
SinReturns a Double specifying the sine of an angle.

Syntax

Sin(number)

The required number argument is a Double or any valid numeric expression that expresses an angle in radians.

Remarks

The Sin function takes an angle and returns the ratio of two sides of a right triangle. The ratio is the length of the side opposite the angle divided by the length of the hypotenuse.

The result lies in the range -1 to 1.

To convert degrees to radians, multiply degrees by pi/180. To convert radians to degrees, multiply radians by 180/pi.
1
SLNReturns a Double specifying the straight-line depreciation of an asset for a single period.

Syntax

SLN(cost, salvage, life)

The SLN function has these named arguments:

Part Description
cost Required. Double specifying initial cost of the asset.
salvage Required. Double specifying value of the asset at the end of its useful life.
life Required. Double specifying length of the useful life of the asset.


Remarks

The depreciation period must be expressed in the same unit as the life argument. All arguments must be positive numbers.
2
Source  
SpaceReturns a Variant (String) consisting of the specified number of spaces.

Syntax

Space(number)

The required number argument is the number of spaces you want in the string.

Remarks

The Space function is useful for formatting output and clearing data in fixed-length strings.
1
SplitReturns a zero-based, one-dimensional array containing a specified number of substrings.

Syntax

Split(expression[, delimiter[, limit[, compare]]])

The Split function syntax has these named arguments:

Part Description
expression Required. String expression containing substrings and delimiters. If expression is a zero-length string(""), Split returns an empty array, that is, an array with no elements and no data.
delimiter Optional. String character used to identify substring limits. If omitted, the space character (" ") is assumed to be the delimiter. If delimiter is a zero-length string, a single-element array containing the entire expression string is returned.
limit Optional. Number of substrings to be returned; 1 indicates that all substrings are returned.
compare Optional. Numeric value indicating the kind of comparison to use when evaluating substrings. See Settings section for values.


Settings

The compare argument can have the following values:

Constant Value Description
vbUseCompareOption 1 Performs a comparison using the setting of the Option Compare statement.
vbBinaryCompare 0 Performs a binary comparison.
vbTextCompare 1 Performs a textual comparison.
vbDatabaseCompare 2 Microsoft Access only. Performs a comparison based on information in your database.
-
SqrReturns a Double specifying the square root of a number.

Syntax

Sqr(number)

The required number argument is a Double or any valid numeric expression greater than or equal to zero.
1
StrReturns a Variant (String) representation of a number.

Syntax

Str(number)

The required number argument is a Long containing any valid numeric expression.

Remarks

When numbers are converted to strings, a leading space is always reserved for the sign of number. If number is positive, the returned string contains a leading space and the plus sign is implied.

Use the Format function to convert numeric values you want formatted as dates, times, or currency or in other user-defined formats. Unlike Str, the Format function doesn't include a leading space for the sign of number.

Note The Str function recognizes only the period (.) as a valid decimal separator. When different decimal separators may be used (for example, in international applications), use CStr to convert a number to a string.
1
StrCompReturns a Variant (Integer) indicating the result of a string comparison.

Syntax

StrComp(string1, string2[, compare])

The StrComp function syntax has these named arguments:

Part Description
string1 Required. Any valid string expression.
string2 Required. Any valid string expression.
compare Optional. Specifies the type of string comparison. If the compare argument is Null, an error occurs. If compare is omitted, the Option Compare setting determines the type of comparison.


Settings

The compare argument settings are:

Constant Value Description
vbUseCompareOption -1 Performs a comparison using the setting of the Option Compare statement.
vbBinaryCompare 0 Performs a binary comparison.
vbTextCompare 1 Performs a textual comparison.
vbDatabaseCompare 2 Microsoft Access only. Performs a comparison based on information in your database.


Return Values

The StrComp function has the following return values:

If StrComp returns
string1 is less than string2 -1
string1 is equal to string2 0
string1 is greater than string2 1
string1 or string2 is Null Null
1
StringReturns a Variant (String) containing a repeating character string of the length specified.

Syntax

String(number, character)

The String function syntax has these named arguments:

Part Description
number Required; Long. Length of the returned string. If number contains Null, Null is returned.
character Required; Variant. Character code specifying the character or string expression whose first character is used to build the return string. If character contains Null, Null is returned.


Remarks

If you specify a number for character greater than 255, String converts the number to a valid character code using the formula:

character Mod 256
1
StrReverseReturns a string in which the character order of a specified string is reversed.

Syntax

StrReverse(expression)

The expression argument is the string whose characters are to be reversed. If expression is a zero-length string (""), a zero-length string is returned. If expression is Null, an error occurs.
1
SwitchEvaluates a list of expressions and returns a Variant value or an expression associated with the first expression in the list that is True.

Syntax

Switch(expr-1, value-1[, expr-2, value-2 [, expr-n,value-n]])

The Switch function syntax has these parts:

Part Description
expr Required. Variant expression you want to evaluate.
value Required. Value or expression to be returned if the corresponding expression is True.


Remarks

The Switch function argument list consists of pairs of expressions and values. The expressions are evaluated from left to right, and the value associated with the first expression to evaluate to True is returned. If the parts aren't properly paired, a run-time error occurs. For example, if expr-1 is True, Switch returns value-1. If expr-1 is False, but expr-2 is True, Switch returns value-2, and so on.

Switch returns a Null value if:

None of the expressions is True.


The first True expression has a corresponding value that is Null.
Switch evaluates all of the expressions, even though it returns only one of them. For this reason, you should watch for undesirable side effects. For example, if the evaluation of any expression results in a division by zero error, an error occurs.
?
SYDReturns a Double specifying the sum-of-years' digits depreciation of an asset for a specified period.

Syntax

SYD(cost, salvage, life, period)

The SYD function has these named arguments:

Part Description
cost Required. Double specifying initial cost of the asset.
salvage Required. Double specifying value of the asset at the end of its useful life.
life Required. Double specifying length of the useful life of the asset.
period Required. Double specifying period for which asset depreciation is calculated.


Remarks

The life and period arguments must be expressed in the same units. For example, if life is given in months, period must also be given in months. All arguments must be positive numbers.
2
TanReturns a Double specifying the tangent of an angle.

Syntax

Tan(number)

The required number argument is a Double or any valid numeric expression that expresses an angle in radians.

Remarks

Tan takes an angle and returns the ratio of two sides of a right triangle. The ratio is the length of the side opposite the angle divided by the length of the side adjacent to the angle.

To convert degrees to radians, multiply degrees by pi/180. To convert radians to degrees, multiply radians by 180/pi.
1
TimeReturns a Variant (Date) indicating the current system time.

Syntax

Time

Remarks

To set the system time, use the Time statement.
1
TimerReturns a Single representing the number of seconds elapsed since midnight.

Syntax

Timer

Remarks

In Microsoft Windows the Timer function returns fractional portions of a second.
1
TimeSerialReturns a Variant (Date) containing the time for a specific hour, minute, and second.

Syntax

TimeSerial(hour, minute, second)

The TimeSerial function syntax has these named arguments:

Part Description
hour Required; Variant (Integer). Number between 0 (12:00 A.M.) and 23 (11:00 P.M.), inclusive, or a numeric expression.
minute Required; Variant (Integer). Any numeric expression.
second Required; Variant (Integer). Any numeric expression.


Remarks

To specify a time, such as 11:59:59, the range of numbers for each TimeSerial argument should be in the normal range for the unit; that is, 023 for hours and 059 for minutes and seconds. However, you can also specify relative times for each argument using any numeric expression that represents some number of hours, minutes, or seconds before or after a certain time. The following example uses expressions instead of absolute time numbers. The TimeSerial function returns a time for 15 minutes before (
-15
) six hours before noon (
12 - 6
), or 5:45:00 A.M.

TimeSerial(12 - 6, -15, 0)
When any argument exceeds the normal range for that argument, it increments to the next larger unit as appropriate. For example, if you specify 75 minutes, it is evaluated as one hour and 15 minutes. If any single argument is outside the range -32,768 to 32,767, an error occurs. If the time specified by the three arguments causes the date to fall outside the acceptable range of dates, an error occurs.
1
TimeValueReturns a Variant (Date) containing the time.

Syntax

TimeValue(time)

The required time argument is normally a string expression representing a time from 0:00:00 (12:00:00 A.M.) to 23:59:59 (11:59:59 P.M.), inclusive. However, time can also be any expression that represents a time in that range. If time contains Null, Null is returned.

Remarks

You can enter valid times using a 12-hour or 24-hour clock. For example,
"2:24PM"
and
"14:24"
are both valid time arguments.

If the time argument contains date information, TimeValue doesn't return it. However, if time includes invalid date information, an error occurs.
1
TrimSee LTrim.1
TypeNameReturns a String that provides information about a variable.

Syntax

TypeName(varname)

The required varname argument is a Variant containing any variable except a variable of a user-defined type.

Remarks

The string returned by TypeName can be any one of the following:

String returned Variable
object type An object whose type is objecttype
Byte Byte value
Integer Integer
Long Long integer
Single Single-precision floating-point number
Double Double-precision floating-point number
Currency Currency value
Decimal Decimal value
Date Date value
String String
Boolean Boolean value
Error An error value
Empty Uninitialized
Null No valid data
Object An object
Unknown An object whose type is unknown
Nothing Object variable that doesn't refer to an object


If varname is an array, the returned string can be any one of the possible returned strings (or Variant) with empty parentheses appended. For example, if varname is an array of integers, TypeName returns "
Integer()
".
2
UCaseReturns a Variant (String) containing the specified string, converted to uppercase.

Syntax

UCase(string)

The required string argument is any valid string expression. If string contains Null, Null is returned.

Remarks

Only lowercase letters are converted to uppercase; all uppercase letters and nonletter characters remain unchanged.
mondrian 2.4
ValReturns the numbers contained in a string as a numeric value of appropriate type.

Syntax

Val(string)

The required string argument is any valid string expression.

Remarks

The Val function stops reading the string at the first character it can't recognize as part of a number. Symbols and characters that are often considered parts of numeric values, such as dollar signs and commas, are not recognized. However, the function recognizes the radix prefixes
&O
(for octal) and
&H
(for hexadecimal). Blanks, tabs, and linefeed characters are stripped from the argument.

The following returns the value 1615198:

Val(" 1615 198th Street N.E.")
In the code below, Val returns the decimal value -1 for the hexadecimal value shown:

Val("&HFFFF")
Note The Val function recognizes only the period (.) as a valid decimal separator. When different decimal separators are used, as in international applications, use CDbl instead to convert a string to a number.
1
VarTypeReturns an Integer indicating the subtype of a variable.

Syntax

VarType(varname)

The required varname argument is a Variant containing any variable except a variable of a user-defined type.

Return Values

Constant Value Description
vbEmpty 0 Empty (uninitialized)
vbNull 1 Null (no valid data)
vbInteger 2 Integer
vbLong 3 Long integer
vbSingle 4 Single-precision floating-point number
vbDouble 5 Double-precision floating-point number
vbCurrency 6 Currency value
vbDate 7 Date value
vbString 8 String
vbObject 9 Object
vbError 10 Error value
vbBoolean 11 Boolean value
vbVariant 12 Variant (used only with arrays of variants)
vbDataObject 13 A data access object
vbDecimal 14 Decimal value
vbByte 17 Byte value
vbUserDefinedType 36 Variants that contain user-defined types
vbArray 8192 Array


Note These constants are specified by Visual Basic for Applications. The names can be used anywhere in your code in place of the actual values.

Remarks

The VarType function never returns the value for vbArray by itself. It is always added to some other value to indicate an array of a particular type. The constant vbVariant is only returned in conjunction with vbArray to indicate that the argument to the VarType function is an array of type Variant. For example, the value returned for an array of integers is calculated as vbInteger + vbArray, or 8194. If an object has a default property, VarType (object) returns the type of the object's default property.
2
WeekdayReturns a Variant (Integer) containing a whole number representing the day of the week.

Syntax

Weekday(date, [firstdayofweek])

The Weekday function syntax has these named arguments:

Part Description
date Required. Variant, numeric expression, string expression, or any combination, that can represent a date. If date contains Null, Null is returned.
firstdayofweek Optional. A constant that specifies the first day of the week. If not specified, vbSunday is assumed.


Settings

The firstdayofweek argument has these settings:

Constant Value Description
vbUseSystem 0 Use the NLS API setting.
vbSunday 1 Sunday (default)
vbMonday 2 Monday
vbTuesday 3 Tuesday
vbWednesday 4 Wednesday
vbThursday 5 Thursday
vbFriday 6 Friday
vbSaturday 7 Saturday


Return Values

The Weekday function can return any of these values:

Constant Value Description
vbSunday 1 Sunday
vbMonday 2 Monday
vbTuesday 3 Tuesday
vbWednesday 4 Wednesday
vbThursday 5 Thursday
vbFriday 6 Friday
vbSaturday 7 Saturday


Remarks

If the Calendar property setting is Gregorian, the returned integer represents the Gregorian day of the week for the date argument. If the calendar is Hijri, the returned integer represents the Hijri day of the week for the date argument. For Hijri dates, the argument number is any numeric expression that can represent a date and/or time from 1/1/100 (Gregorian Aug 2, 718) through 4/3/9666 (Gregorian Dec 31, 9999).
1
WeekdayNameReturns a string indicating the specified day of the week.

Syntax

WeekdayName(weekday, abbreviate, firstdayofweek)

The WeekdayName function syntax has these parts:

Part Description
weekday Required. The numeric designation for the day of the week. Numeric value of each day depends on setting of the firstdayofweek setting.
abbreviate Optional. Boolean value that indicates if the weekday name is to be abbreviated. If omitted, the default is False, which means that the weekday name is not abbreviated.
firstdayofweek Optional. Numeric value indicating the first day of the week. See Settings section for values.


Settings

The firstdayofweek argument can have the following values:

Constant Value Description
vbUseSystem 0 Use National Language Support (NLS) API setting.
vbSunday 1 Sunday (default)
vbMonday 2 Monday
vbTuesday 3 Tuesday
vbWednesday 4 Wednesday
vbThursday 5 Thursday
vbFriday 6 Friday
vbSaturday 7 Saturday
1
Width  
YearReturns a Variant (Integer) containing a whole number representing the year.

Syntax

Year(date)

The required date argument is any Variant, numeric expression, string expression, or any combination, that can represent a date. If date contains Null, Null is returned.

Note If the Calendar property setting is Gregorian, the returned integer represents the Gregorian year for the date argument. If the calendar is Hijri, the returned integer represents the Hijri year for the date argument. For Hijri dates, the argument number is any numeric expression that can represent a date and/or time from 1/1/100 (Gregorian Aug 2, 718) through 4/3/9666 (Gregorian Dec 31, 9999).
1

Author: Julian Hyde; last modified January 2008.
Version: $Id$ (log)
Copyright (C) 2008-2009 Pentaho


mondrian-3.11.0.1-R/doc/workbench.html000066400000000000000000000206541261646570300173770ustar00rootroot00000000000000 Mondrian Schema Workbench
Mondrian Schema Workbench

The Mondrian Schema Workbench is a designer interface that allows you to create and test Mondrian OLAP cube schemas visually. The Mondrian engine processes MDX requests with the ROLAP (Relational OLAP) schemas. These schema files are XML metadata models that are created in a specific structure used by the Mondrian engine. These XML models can be considered cube-like structures which utilize existing FACT and DIMENSION tables found in your RDBMS. It does not require that an actual physical cube is built or maintained; only that the metadata model is created.

Note: For documentation on publishing Mondrian Schemas to Pentaho's BI Platform, see Publishing an Analysis Schema Using the Schema Workbench

It provides the following functionality:

  • Schema editor integrated with the underlying data source for validation. (See above)
  • Test MDX queries against schema and database Screenshot
  • Browse underlying databases structure Screenshot

A more detailed manual is Schema Workbench Manual

Using the Workbench

To build and create the workbench jar, at the command line, type:

     ant workbench

Example output:

Buildfile: build.xml
Overriding previous definition of reference to jdk

version:

prepare:

parser:
  [javacup] Files are up to date.

generate.resources:
   [resgen] C:\MONDRIAN_SourceForge\open\mondrian\src\main\mondrian\resource\MondrianResource.java is up to date
   [resgen] C:\MONDRIAN_SourceForge\open\mondrian\classes\mondrian\resource\MondrianResource.properties is up to date
   [resgen] C:\MONDRIAN_SourceForge\open\mondrian\src\main\mondrian\resource\MondrianResource_en_US.java is up to date
   [resgen] C:\MONDRIAN_SourceForge\open\mondrian\classes\mondrian\resource\MondrianResource_en_US.properties is up to date
   [resgen] C:\MONDRIAN_SourceForge\open\mondrian\src\main\mondrian\resource\MondrianResource_de_DE.java is up to date
   [resgen] C:\MONDRIAN_SourceForge\open\mondrian\classes\mondrian\resource\MondrianResource_de_DE.properties is up to date
   [resgen] C:\MONDRIAN_SourceForge\open\mondrian\src\main\mondrian\resource\MondrianResource_de.java is up to date
   [resgen] C:\MONDRIAN_SourceForge\open\mondrian\classes\mondrian\resource\MondrianResource_de.properties is up to date
   [resgen] C:\MONDRIAN_SourceForge\open\mondrian\src\main\mondrian\resource\MondrianResource_es_ES.java is up to date
   [resgen] C:\MONDRIAN_SourceForge\open\mondrian\classes\mondrian\resource\MondrianResource_es_ES.properties is up to date

def:

compile.java:

compile:

info:
     [echo] ==============================================================
     [echo] | Mondrian configuration info                                |
     [echo] ==============================================================
     [echo] project.location      = C:\MONDRIAN_SourceForge\open\mondrian
     [echo] jdk.home              = C:\Program Files\Java\jdk1.5.0_05
     [echo] catalina.home         = C:\apache-tomcat-5.5.12
     [echo] junit.home            = C:\junit4.0
     [echo] mondrian.foodmart.catalogURL = file:C:\MONDRIAN_SourceForge\open\mondrian/demo/FoodMart.xml
     [echo] mondrian.foodmart.jdbcURL    = jdbc:odbc:MondrianFoodMart
     [echo] mondrian.jdbcDrivers         = sun.jdbc.odbc.JdbcOdbcDriver
     [echo] ==============================================================

compile.tests:

jar:
      [jar] Building jar: C:\MONDRIAN_SourceForge\open\mondrian\lib\mondrian.jar

workbench:
      [jar] Building jar: C:\MONDRIAN_SourceForge\open\mondrian\lib\workbench.jar

BUILD SUCCESSFUL
Total time: 47 seconds

This will create lib/workbench.jar. Include drivers for your database on the classpath.

To start the workbench., at the command prompt, type

In Windows:

ant workbench-run

Or the following

java -jar lib/workbench.jar

In UNIX/Linux:

java -jar lib/workbench.jar 

Set properties for connection to your cube database via Tools > Preferences.

These preferences and the last 4 schemas edited are kept in a "workbench.properties" file in the root of the classpath.

If you change the connection properties, you will need to close/save the existing schema editor(s) and restart to see the effects.

Create a new schema or open an existing one.

If you open an existing schema, the Workbench validates that the tables and columns underlying the cube definitions actually exist in the database.

Create or edit elements in the schema. The Workbench validates your changes against the cube database tables and column names.

The Workbench validates edits against the Mondrian schema DTD.

Save your schema and run some MDX queries to test. Error messages and results are displayed.

 


Author: Sherman Wood, JasperSoft; last modified April 2007.
Version: $Id$ (log)
Copyright (C) 2007-2007 JasperSoft
Copyright (C) 2007-2009 Pentaho and others


mondrian-3.11.0.1-R/eclipse/000077500000000000000000000000001261646570300153775ustar00rootroot00000000000000mondrian-3.11.0.1-R/eclipse/eclipse-warnings.txt000066400000000000000000000012511261646570300214110ustar00rootroot00000000000000Subject: [Mondrian-devel] Turning off warnings, one left From: "Ed Burnette" Date: Tue, 6 Jul 2004 15:24:46 -0400 To: I beat perforce into submission again so it would allow me to download a new copy of Mondrian and started to turn off Eclipse warnings so I could get a clean build. Here are the warnings I turned off, in case anybody else has to do this: Assignment has no effect (e.g. 'x = x') Non-static access to static member Use of deprecated API Local variable declaration hides another field or variable Local variable is never read Unused imports Unused or unread private members Malformed Javadoc comments mondrian-3.11.0.1-R/eclipse/mondrian.importorder000066400000000000000000000001431261646570300214740ustar00rootroot00000000000000#Organize Import Order #Wed Jun 23 15:37:30 EDT 2004 5=java 4=javax 3=org 2=mondrian 1=junit 0=com mondrian-3.11.0.1-R/ivy.xml000066400000000000000000000126421261646570300153110ustar00rootroot00000000000000 Mondrian is an OLAP (online analytical processing) engine written in Java. It reads from JDBC data sources, aggregates data in a memory cache, and implements the MDX language and the olap4j and XML/A APIs. mondrian-3.11.0.1-R/ivysettings.xml000066400000000000000000000034241261646570300170700ustar00rootroot00000000000000 mondrian-3.11.0.1-R/lib/000077500000000000000000000000001261646570300145215ustar00rootroot00000000000000mondrian-3.11.0.1-R/lib/mondrian.xsd000077500000000000000000003436151261646570300170670ustar00rootroot00000000000000 A schema is a collection of cubes and virtual cubes. It can also contain shared dimensions (for use by those cubes), named sets, roles, and declarations of user-defined functions. A Parameter defines a schema parameter. It can be referenced from an MDX statement using the ParamRef function and, if not final, its value can be overridden. Name of this parameter. Description of this parameter. Indicates the type of this parameter: String, Numeric, Integer, Boolean, Date, Time, Timestamp, or Member. If false, statement cannot change the value of this parameter; the parameter becomes effectively constant (provided that its default value expression always returns the same value). Default is true. Expression for the default value of this parameter. Definition of a cube. The fact table is the source of all measures in this cube. If this is a Table and the schema name is not present, table name is left unqualified. The SQL expression used to calculate a measure. Must be specified if a source column is not specified. Name of this measure. Column which is source of this measure's values. If not specified, a measure expression must be specified. The datatype of this measure: String, Numeric, Integer, Boolean, Date, Time or Timestamp. The default datatype of a measure is 'Integer' if the measure's aggregator is 'Count', otherwise it is 'Numeric'. Format string with which to format cells of this measure. For more details, see the mondrian.util.Format class. Aggregation function. Allowed values are "sum", "count", "min", "max", "avg", and "distinct-count". ("distinct count" is allowed for backwards compatibility, but is deprecated because XML enumerated attributes in a DTD cannot legally contain spaces.) Name of a formatter class for the appropriate cell being displayed. The class must implement the mondrian.olap.CellFormatter interface. A string being displayed instead of the name. Can be localized from Properties file using #{propertyname}. Description of this measure. Can be localized from Properties file using #{propertyname}. Whether this member is visible in the user-interface. Default true. Calculated members in this cube. Named sets in this virtual cube. Name of this cube. A string being displayed instead of the cube's name. Can be localized from Properties file using #{propertyname}. Description of this cube. Can be localized from Properties file using #{propertyname}. The name of the measure that would be taken as the default measure of the cube. Should the Fact table data for this Cube be cached by Mondrian or not. The default action is to cache the data. Whether element is enabled - if true, then the Cube is realized otherwise it is ignored. Virtual cubes in this schema. A VirtualCube is a set of dimensions and measures gleaned from other cubes. List of base cubes used by the virtual cube. Name of the cube which the virtualCube uses. Unrelated dimensions to measures in this cube will be pushed to top level member. A VirtualCubeDimension is a usage of a Dimension in a VirtualCube. Name of the cube which the dimension belongs to, or unspecified if the dimension is shared. Name of the dimension. A VirtualCubeMeasure is a usage of a Measure in a VirtualCube. Name of the cube which the measure belongs to. Unique name of the measure within its cube. Whether this member is visible in the user-interface. Default true. Calculated members that belong to this virtual cube. (Calculated members inherited from other cubes should not be in this list). Named sets in this virtual cube. Whether this element is enabled - if true, then the Virtual Cube is realized otherwise it is ignored. The name of the measure that would be taken as the default measure of the cube. A string being displayed instead of the cube's name. Can be localized from Properties file using #{propertyname}. Description of this virtual cube. Can be localized from Properties file using #{propertyname}. Named sets in this schema. A role defines an access-control profile. It has a series of grants (or denials) for schema elements. Grants (or denies) this role access to this schema. access may be "all", "all_dimensions", or "none". If access is "all_dimensions", the role has access to all dimensions but still needs explicit access to cubes. See mondrian.olap.Role#grant(mondrian.olap.Schema,int). Grants (or denies) this role access to a cube. access may be "all" or "none". Grants (or denies) this role access to a dimension. access may be "all" or "none". Note that a role is implicitly given access to a dimension when it is given acess to a cube. See also the "all_dimensions" option of the "SchemaGrant" element. The unique name of the dimension Values correspond to Access. Grants (or denies) this role access to a hierarchy. access may be "all", "custom" or "none". If access is "custom", you may also specify the attributes topLevel, bottomLevel, and the member grants. Grants (or denies) this role access to a member. The children of this member inherit that access. You can implicitly see a member if you can see any of its children. The unique name of the member Values correspond to Access. The unique name of the hierarchy Values correspond to Access. Unique name of the highest level of the hierarchy from which this role is allowed to see members. May only be specified if the HierarchyGrant.access is "custom". If not specified, role can see members up to the top level. Unique name of the lowest level of the hierarchy from which this role is allowed to see members. May only be specified if the HierarchyGrant.access is "custom". If not specified, role can see members down to the leaf level. Policy which determines how cell values are calculated if not all of the children of the current cell are visible to the current role. Allowable values are 'full' (the default), 'partial', and 'hidden'. The unique name of the cube Values correspond to Access. Values correspond to Access. Body of a Role definition which defines a Role to be the union of several Roles. The RoleUsage elements must refer to Roles that have been declared earlier in this schema file. Usage of a Role in a union Role. Declarations of user-defined functions in this schema. A UserDefinedFunction is a function which extends the MDX language. It must be implemented by a Java class which implements the interface mondrian.spi.UserDefinedFunction. Name with which the user-defined function will be referenced in MDX expressions. Name of the class which implemenets this user-defined function. Must implement the mondrian.spi.UserDefinedFunction interface. Name of this schema Description of this schema. Label for the measures dimension. Can be localized from Properties file using #{propertyname}. The name of the default role for connections to this schema Contains values of user-defined properties. Shared dimensions in this schema. A Dimension is a collection of hierarchies. There are two kinds: a public dimension belongs to a Schema, and be used by several cubes; a private dimension belongs to a Cube. The foreignKey field is only applicable to private dimensions. Name of this dimension The dimension's type may be one of "Standard" or "Time". A time dimension will allow the use of the MDX time functions (WTD, YTD, QTD, etc.). Use a standard dimension if the dimension is not a time-related dimension. The default value is "Standard". A string being displayed instead of the dimensions's name. Can be localized from Properties file using #{propertyname}. Description of this dimension. Can be localized from Properties file using #{propertyname}. Private dimensions in the cube. A Dimension is a collection of hierarchies. There are two kinds: a public dimension belongs to a Schema, and be used by several cubes; a private dimension belongs to a Cube. The foreignKey field is only applicable to private dimensions. Name of this dimension The dimension's type may be one of "Standard" or "Time". A time dimension will allow the use of the MDX time functions (WTD, YTD, QTD, etc.). Use a standard dimension if the dimension is not a time-related dimension. The default value is "Standard". A string being displayed instead of the dimensions's name. Can be localized from Properties file using #{propertyname}. Description of this dimension. Can be localized from Properties file using #{propertyname}. The name of the column in the fact table which joins to the leaf level of this dimension. Required in a private Dimension or a DimensionUsage, but not in a public Dimension. Flag to mark this dimension as a high cardinality one and avoid caching. A DimensionUsage is usage of a shared Dimension within the context of a cube. Name of the dimension. Must be a dimension in this schema. Case-sensitive. Name of the source dimension. Must be a dimension in this schema. Case-sensitive. Name of the level to join to. If not specified, joins to the lowest level of the dimension. If present, then this is prepended to the Dimension column names during the building of collapse dimension aggregates allowing 1) different dimension usages to be disambiguated during aggregate table recognition and 2) multiple shared dimensions that have common column names to be disambiguated. The name of the column in the fact table which joins to the leaf level of this dimension. Required in a private Dimension or a DimensionUsage, but not in a public Dimension. Flag to mark this dimension as a high cardinality one and avoid caching. or memberReaderClass. If you specify none, the hierarchy is assumed to come from the same fact table of the current cube. ]]> The Table, Join (set of tables), View (SQL statement), or InlineTable which populates this hierarchy. The SQL expression used to populate this level's key. The SQL expression used to populate this level's name. If not specified, the level's key is used. Expression which forms the caption of members. If not specified, the level name is used. The SQL expression used to populate this level's ordinal. The SQL expression used to join to the parent member in a parent-child hierarchy. Specifies the transitive closure of a parent-child hierarchy. Optional, but recommended for better performance. The closure is provided as a set of (parent/child) pairs: since it is the transitive closure these are actually (ancestor/descendant) pairs. Member property. Data type of this property: String, Numeric, Integer, Boolean, Date, Time or Timestamp. Name of a formatter class for the appropriate property value being displayed. The class must implement the mondrian.olap.PropertyFormatter interface. A string being displayed instead of the name. Can be localized from Properties file using #{propertyname}. Description of this member property. Can be localized from Properties file using #{propertyname}. Should be set to true if the value of the property is functionally dependent on the level value. This permits the associated property column to be omitted from the GROUP BY clause (if the database permits columns in the SELECT that are not in the GROUP BY). This can be a significant performance enhancement on some databases, such as MySQL. The estimated number of members in this level. Setting this property improves the performance of MDSCHEMA_LEVELS, MDSCHEMA_HIERARCHIES and MDSCHEMA_DIMENSIONS XMLA requests. The name of the table that the column comes from. If this hierarchy is based upon just one table, defaults to the name of that table; otherwise, it is required. Can be localized from Properties file using #{propertyname}. The name of the column which holds the unique identifier of this level. The name of the column which holds the user identifier of this level. The name of the column which holds member ordinals. If this column is not specified, the key column is used for ordering. The name of the column which references the parent member in a parent-child hierarchy. Value which identifies null parents in a parent-child hierarchy. Typical values are 'NULL' and '0'. Indicates the type of this level's key column: String, Numeric, Integer, Boolean, Date, Time or Timestamp. When generating SQL statements, Mondrian encloses values for String columns in quotation marks, but leaves values for Integer and Numeric columns un-quoted. Date, Time, and Timestamp values are quoted according to the SQL dialect. For a SQL-compliant dialect, the values appear prefixed by their typename, for example, "DATE '2006-06-01'". Whether members are unique across all parents. For example, zipcodes are unique across all states. The first level's members are always unique. Whether this is a regular or a time-related level. The value makes a difference to time-related functions such as YTD (year-to-date). Condition which determines whether a member of this level is hidden. If a hierarchy has one or more levels with hidden members, then it is possible that not all leaf members are the same distance from the root, and it is termed a ragged hierarchy. Allowable values are: Never (a member always appears; the default); IfBlankName (a member doesn't appear if its name is null or empty); and IfParentsName (a member appears unless its name matches the parent's. Name of a formatter class for the member labels being displayed. The class must implement the mondrian.olap.MemberFormatter interface. A string being displayed instead of the level's name. Can be localized from Properties file using #{propertyname}. Description of this level. Can be localized from Properties file using #{propertyname}. The name of the column which holds the caption for members. Not used Name of the hierarchy. If this is not specified, the hierarchy has the same name as its dimension. Whether this hierarchy has an 'all' member. Name of the 'all' member. If this attribute is not specified, the all member is named 'All hierarchyName', for example, 'All Store'. A string being displayed instead as the all member's name. Can be localized from Properties file using #{propertyname}. Name of the 'all' level. If this attribute is not specified, the all member is named '(All)'. Can be localized from Properties file using #{propertyname}. The name of the column which identifies members, and which is referenced by rows in the fact table. If not specified, the key of the lowest level is used. The name of the table which contains primaryKey. If the hierarchy has only one table, defaults to that; otherwise it is required. Default member of this hierarchy. Name of the custom member reader class. Must implement the mondrian.rolap.MemberReader interface. A string to be displayed in the user interface. If not specified, the hierarchy's name is used. Can be localized from Properties file using #{propertyname}. Description of this hierarchy. Can be localized from Properties file using #{propertyname}. Should be set to the level (if such a level exists) at which depth it is known that all members have entirely unique rows, allowing SQL GROUP BY clauses to be completely eliminated from the query. Defaults to left's alias if left is a table, otherwise required. Defaults to right's alias if right is a table, otherwise required. Holder for an array of ColumnDef elements Column definition for an inline table. Name of the column. Type of the column: String, Numeric, Integer, Boolean, Date, Time or Timestamp. Holder for an array of Row elements Row definition for an inline table. Must have one Column for each ColumnDef in the InlineTable. Column value for an inline table. The CDATA holds the value of the column. Name of the column. A definition of an aggregate table for a base fact table. This aggregate table must be in the same schema as the base fact table. The name of the column mapping from base fact table foreign key to aggregate table foreign key. The name of the base fact table foreign key. The name of the aggregate table foreign key. The name of the column mapping to the measure name. The name of the Cube measure. The name of the column mapping to the measure name. The name of the Cube measure. The Table name of a Specific aggregate table. Whether or not the match should ignore case. The name of the column mapping from base fact table foreign key to aggregate table foreign key. The name of the base fact table foreign key. The name of the aggregate table foreign key. The name of the column mapping to the measure name. The name of the Cube measure. The name of the column mapping to the measure name. The name of the Cube measure. A Table pattern not to be matched. The Table name not to be matched. Whether or not the match should ignore case. A Table pattern used to define a set of aggregate tables. Whether or not the match should ignore case. Dialect of SQL the view is intended for. Valid values include, but are not limited to: * generic * access * db2 * derby * firebird * hsqldb * mssql * mysql * nuodb * oracle * postgres * sybase * teradata * ingres * infobright * luciddb The SQL WHERE clause expression to be appended to any select statement A Table pattern not to be matched. The Table name not to be matched. Whether or not the match should ignore case. A definition of an aggregate table for a base fact table. This aggregate table must be in the same schema as the base fact table. Dialect-specific table optimization hints. Type of hint, interpreted and applied on a per-dialect basis. Optional qualifier for table. Alias to be used with this table when it is used to form queries. If not specified, defaults to the table name, but in any case, must be unique within the schema. (You can use the same table in different hierarchies, but it must have different aliases.) A collection of SQL statements, one per dialect. MDX expression which gives the value of this member. Name of this calculated member. Format string with which to format cells of this member. A string being displayed instead of the name. Can be localized from Properties file using #{propertyname}. Description of this calculated member. Can be localized from Properties file using #{propertyname}. MDX expression which gives the value of this member. Equivalent to the Formula sub-element. Name of the dimension which this member belongs to. Whether this member is visible in the user-interface. Default true. Property of a calculated member defined against a cube. It must have either an expression or a value. Name of this member property. A string being displayed instead of the Properties's name. Can be localized from Properties file using #{propertyname}. Description of this calculated member property. Can be localized from Properties file using #{propertyname}. MDX expression which defines the value of this property. If the expression is a constant string, you could enclose it in quotes, or just specify the 'value' attribute instead. Value of this property. If the value is not constant, specify the 'expression' attribute instead. Defines a named set which can be used in queries in the same way as a set defined using a WITH SET clause. A named set can be defined against a particular cube, or can be global to a schema. If it is defined against a cube, it is only available to queries which use that cube. A named set defined against a cube is not inherited by a virtual cubes defined against that cube. (But you can define a named set against a virtual cube). A named set defined against a schema is available in all cubes and virtual cubes in that schema. However, it is only valid if the cube contains dimensions with the names required to make the formula valid. MDX expression which gives the value of this set. Name of this named set. Caption of this named set. Can be localized from Properties file using #{propertyname}. Description of this named set. Can be localized from Properties file using #{propertyname}. MDX expression which gives the value of this set. Equivalent to the Formula sub-element. mondrian-3.11.0.1-R/misc/000077500000000000000000000000001261646570300147065ustar00rootroot00000000000000mondrian-3.11.0.1-R/misc/Meta.xsl000066400000000000000000000456701261646570300163400ustar00rootroot00000000000000

Mining Meta Model Instance

DTD Name:
Class Name: http://code/bb/main/mining/Broadbase/mining/xml/.java
Root Element: #
Version:

Overview

Imports

Element Summary

Classes

Element

Class

#

Attributes

AttributeTypeDefault Description
String none none
none

Content

ElementJava NameConstraintsDescription
# Required Array [ .. ] Array Optional none
Any Text empty
; keep DOM node

Plugin

Class

#

Attributes

AttributeTypeDefault Description
String none none
defPackageString Broadbase.mining.xml The defPackage attribute, available to all Plugins, specifies the package of the Java Class used to parse all plugin contents.
defClassString Broadbase.mining.xml The defClass attribute, available to all Plugins, specifies the class name of the Java Class used to parse all plugin contents.

Content

Any from defClass

Class

Superclass

#

Attributes

AttributeTypeDefault Description
String none none
none

Content

ElementJava NameConstraintsDescription
# Required Array [ .. ] Array Optional none
Any Text empty

StringElement

Attributes

none

Content

Text

Import

Package:
Class:
DTD:

mondrian-3.11.0.1-R/misc/config.xml000066400000000000000000000042161261646570300167000ustar00rootroot00000000000000 mondrian-3.11.0.1-R/misc/workbench-manifest.mf000066400000000000000000000001241261646570300210150ustar00rootroot00000000000000Manifest-Version: 1.0 Main-Class: mondrian.gui.Workbench Name: Mondrian Workbench mondrian-3.11.0.1-R/mondrian.iml000066400000000000000000000012621261646570300162660ustar00rootroot00000000000000 mondrian-3.11.0.1-R/src/000077500000000000000000000000001261646570300145425ustar00rootroot00000000000000mondrian-3.11.0.1-R/src/main/000077500000000000000000000000001261646570300154665ustar00rootroot00000000000000mondrian-3.11.0.1-R/src/main/META-INF/000077500000000000000000000000001261646570300166265ustar00rootroot00000000000000mondrian-3.11.0.1-R/src/main/META-INF/services/000077500000000000000000000000001261646570300204515ustar00rootroot00000000000000mondrian-3.11.0.1-R/src/main/META-INF/services/java.sql.Driver000066400000000000000000000000451261646570300233440ustar00rootroot00000000000000mondrian.olap4j.MondrianOlap4jDriver mondrian-3.11.0.1-R/src/main/META-INF/services/mondrian.spi.Dialect000066400000000000000000000016531261646570300243460ustar00rootroot00000000000000mondrian.spi.impl.AccessDialect mondrian.spi.impl.Db2Dialect mondrian.spi.impl.Db2OldAs400Dialect mondrian.spi.impl.DerbyDialect mondrian.spi.impl.FirebirdDialect mondrian.spi.impl.GreenplumDialect mondrian.spi.impl.HiveDialect mondrian.spi.impl.HsqldbDialect mondrian.spi.impl.ImpalaDialect mondrian.spi.impl.InfobrightDialect mondrian.spi.impl.InformixDialect mondrian.spi.impl.InterbaseDialect mondrian.spi.impl.LucidDbDialect mondrian.spi.impl.MicrosoftSqlServerDialect mondrian.spi.impl.MySqlDialect mondrian.spi.impl.MonetDbDialect mondrian.spi.impl.NeoviewDialect mondrian.spi.impl.NuoDbDialect mondrian.spi.impl.NetezzaDialect mondrian.spi.impl.OracleDialect mondrian.spi.impl.PostgreSqlDialect mondrian.spi.impl.RedshiftDialect mondrian.spi.impl.SqlStreamDialect mondrian.spi.impl.SybaseDialect mondrian.spi.impl.TeradataDialect mondrian.spi.impl.VectorwiseDialect mondrian.spi.impl.VerticaDialect mondrian.spi.impl.IngresDialect mondrian-3.11.0.1-R/src/main/META-INF/services/mondrian.spi.UserDefinedFunction000066400000000000000000000003771261646570300267060ustar00rootroot00000000000000mondrian.udf.ValUdf mondrian.udf.InverseNormalUdf mondrian.udf.LastNonEmptyUdf mondrian.udf.CurrentDateStringUdf mondrian.udf.CurrentDateMemberUdf mondrian.udf.CurrentDateMemberExactUdf mondrian.udf.MatchesUdf mondrian.udf.InUdf mondrian.udf.NullValueUdf mondrian-3.11.0.1-R/src/main/mondrian/000077500000000000000000000000001261646570300172755ustar00rootroot00000000000000mondrian-3.11.0.1-R/src/main/mondrian/calc/000077500000000000000000000000001261646570300201775ustar00rootroot00000000000000mondrian-3.11.0.1-R/src/main/mondrian/calc/BooleanCalc.java000066400000000000000000000020061261646570300232020ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.calc; import mondrian.olap.Evaluator; /** * Compiled expression whose result is a boolean. * *

When implementing this interface, it is convenient to extend * {@link mondrian.calc.impl.AbstractBooleanCalc}, but it is not required. * * @author jhyde * @since Sep 27, 2005 */ public interface BooleanCalc extends Calc { /** * Evaluates this expression to yield a boolean value. * If the result is null, returns the special * {@link mondrian.olap.fun.FunUtil#BooleanNull} value. * * @param evaluator Evaluation context * @return evaluation result */ boolean evaluateBoolean(Evaluator evaluator); } // End BooleanCalc.java mondrian-3.11.0.1-R/src/main/mondrian/calc/Calc.java000066400000000000000000000120721261646570300217060ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.calc; import mondrian.olap.Evaluator; import mondrian.olap.Hierarchy; import mondrian.olap.type.Type; /** * Calc is the base class for all calculable expressions. * *

Logical and physical expression languages

* * Mondrian has two expression languages:
    *
  • The logical language of parsed MDX fragments ({@link mondrian.olap.Exp}). *
  • The phyiscal language of compiled expressions ({@link Calc}). *

* * The two languages allow us to separate logical (how an * MDX expression was specified) from physical (how it is to be evaluated). * The physical language is more strongly typed, and certain constructs which * are implicit in the logical language (such as the addition of calls * to the <Member>.CurrentMember function) are made * explicit in the physical language.

* *

Compilation

* * Expressions are generally created from using an expression compiler * ({@link ExpCompiler}). There are often more than one evaluation strategy * for a given expression, and compilation process gives us an opportunity to * choose the optimal one.

* *

Implementing expressions

* * The Calc interface has sub-interfaces for various types: * {@link IntegerCalc}, * {@link BooleanCalc}, * {@link DoubleCalc}, * {@link StringCalc} are scalar expressions; * {@link MemberCalc}, * {@link LevelCalc}, * {@link HierarchyCalc}, * {@link DimensionCalc} yield elements of the OLAP model.

* * Each of these sub-interfaces has an abstract implementation: * {@link mondrian.calc.impl.AbstractIntegerCalc}, * {@link mondrian.calc.impl.AbstractBooleanCalc}, * {@link mondrian.calc.impl.AbstractDoubleCalc}, * {@link mondrian.calc.impl.AbstractStringCalc}, * {@link mondrian.calc.impl.AbstractMemberCalc}, * {@link mondrian.calc.impl.AbstractLevelCalc}, * {@link mondrian.calc.impl.AbstractHierarchyCalc}, * {@link mondrian.calc.impl.AbstractDimensionCalc}.

* * {@link mondrian.calc.impl.GenericCalc} is an adapter which implements all of these interfaces * and will try to convert any given result to the correct type. Use it * sparingly: if you know the expected result type, it is better to write a * class which implements a specific TypeCalc interface. * * @author jhyde * @since Sep 26, 2005 */ public interface Calc { /** * Evaluates this expression. * * @param evaluator Provides dimensional context in which to evaluate * this expression * @return Result of expression evaluation */ Object evaluate(Evaluator evaluator); /** * Returns whether this expression depends upon a given hierarchy. * *

If it does not depend on the hierarchy, then re-evaluating the * expression with a different member of this context must produce the * same answer.

* * Some examples:

    * *
  • The expression *
    [Measures].[Unit Sales]
    * depends on all dimensions except [Measures]. * *
  • The boolean expression *
    ([Measures].[Unit Sales], * [Time].[1997]) > 1000
    * depends on all hierarchies except [Measures] and [Time]. * *
  • The list expression *
    Filter([Store].[USA].Children, * [Measures].[Unit Sales] < 50)
    * depends upon all hierarchies except [Store] and [Measures]. * How so? Normally the scalar expression would depend upon all hierarchies * except [Measures], but the Filter function sets the [Store] * context before evaluating the scalar expression, so it is not inherited * from the surrounding context. * *

* * @param hierarchy Hierarchy * @return Whether this expression's result depends upon the current member * of the hierarchy */ boolean dependsOn(Hierarchy hierarchy); /** * Returns the type of this expression. */ Type getType(); /** * Prints this expression, by accepting a visiting {@link CalcWriter}. * * @param calcWriter Writer */ void accept(CalcWriter calcWriter); /** * Returns style in which the result of evaluating this expression is * returned. * *

One application of this method is for the compiler to figure out * whether the compiled expression is returning a mutable list. If a mutable * list is required, the compiler can create a mutable copy. * * @see ExpCompiler#compileList(mondrian.olap.Exp, boolean) */ ResultStyle getResultStyle(); boolean isWrapperFor(java.lang.Class iface); T unwrap(java.lang.Class iface); } // End Calc.java mondrian-3.11.0.1-R/src/main/mondrian/calc/CalcWriter.java000066400000000000000000000065771261646570300231200ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.calc; import org.apache.commons.collections.map.CompositeMap; import java.io.PrintWriter; import java.util.IdentityHashMap; import java.util.Map; /** * Visitor which serializes an expression to text. * * @author jhyde * @since Dec 23, 2005 */ public class CalcWriter { private static final int INDENT = 4; private static String BIG_STRING = " "; private final PrintWriter writer; private final boolean profiling; private int linePrefixLength; private final Map> parentArgMap = new IdentityHashMap>(); public CalcWriter(PrintWriter writer, boolean profiling) { this.writer = writer; this.profiling = profiling; } public PrintWriter getWriter() { return writer; } public void visitChild(int ordinal, Calc calc) { indent(); calc.accept(this); outdent(); } public void visitCalc( Calc calc, String name, Map arguments, Calc[] childCalcs) { writer.print(getLinePrefix()); writer.print(name); final Map parentArgs = parentArgMap.get(calc); if (parentArgs != null && !parentArgs.isEmpty()) { //noinspection unchecked arguments = new CompositeMap(arguments, parentArgs); } if (!arguments.isEmpty()) { writer.print("("); int k = 0; for (Map.Entry entry : arguments.entrySet()) { if (k++ > 0) { writer.print(", "); } writer.print(entry.getKey()); writer.print("="); writer.print(entry.getValue()); } writer.print(")"); } writer.println(); int k = 0; for (Calc childCalc : childCalcs) { visitChild(k++, childCalc); } } /** * Increases the indentation level. */ public void indent() { linePrefixLength += INDENT; } /** * Decreases the indentation level. */ public void outdent() { linePrefixLength -= INDENT; } private String getLinePrefix() { return spaces(linePrefixLength); } /** * Returns a string of N spaces. * @param n Number of spaces * @return String of N spaces */ private static synchronized String spaces(int n) { while (n > BIG_STRING.length()) { BIG_STRING = BIG_STRING + BIG_STRING; } return BIG_STRING.substring(0, n); } public void setParentArgs(Calc calc, Map argumentMap) { parentArgMap.put(calc, argumentMap); } /** * Whether to print out attributes relating to how a statement was actually * executed. If false, client should only send attributes relating to the * plan. * * @return Whether client should send attributes about profiling */ public boolean enableProfiling() { return profiling; } } // End CalcWriter.java mondrian-3.11.0.1-R/src/main/mondrian/calc/DateTimeCalc.java000066400000000000000000000017101261646570300233200ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.calc; import mondrian.olap.Evaluator; import java.util.Date; /** * Compiled expression whose result is a {@link Date}, representing an MDX * DateTime value. * *

When implementing this interface, it is convenient to extend * {@link mondrian.calc.impl.AbstractDateTimeCalc}, but it is not required. * * @author jhyde * @since Sep 26, 2005 */ public interface DateTimeCalc extends Calc { /** * Evaluates this expression to yield a {@link Date} value. * * @param evaluator Evaluation context * @return evaluation result */ Date evaluateDateTime(Evaluator evaluator); } // End DateTimeCalc.java mondrian-3.11.0.1-R/src/main/mondrian/calc/DimensionCalc.java000066400000000000000000000017171261646570300235600ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.calc; import mondrian.olap.Dimension; import mondrian.olap.Evaluator; /** * Expression which yields a {@link mondrian.olap.Dimension}. * *

When implementing this interface, it is convenient to extend * {@link mondrian.calc.impl.AbstractDimensionCalc}, but it is not required. * * @author jhyde * @since Sep 26, 2005 */ public interface DimensionCalc extends Calc { /** * Evaluates this expression to yield a dimension. * *

Never returns null. * * @param evaluator Evaluation context * @return a dimension */ Dimension evaluateDimension(Evaluator evaluator); } // End DimensionCalc.java mondrian-3.11.0.1-R/src/main/mondrian/calc/DoubleCalc.java000066400000000000000000000017761261646570300230520ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.calc; import mondrian.olap.Evaluator; /** * Compiled expression whose result is a double. * *

When implementing this interface, it is convenient to extend * {@link mondrian.calc.impl.AbstractDoubleCalc}, but it is not required. * * @author jhyde * @since Sep 27, 2005 */ public interface DoubleCalc extends Calc { /** * Evaluates this expression to yield a double value. * If the result is null, returns the special * {@link mondrian.olap.fun.FunUtil#DoubleNull} value. * * @param evaluator Evaluation context * @return evaluation result */ double evaluateDouble(Evaluator evaluator); } // End DoubleCalc.java mondrian-3.11.0.1-R/src/main/mondrian/calc/DummyExp.java000066400000000000000000000026241261646570300226160ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.calc; import mondrian.mdx.MdxVisitor; import mondrian.olap.Exp; import mondrian.olap.Validator; import mondrian.olap.type.Type; import java.io.PrintWriter; /** * Dummy expression which exists only to wrap a * {@link mondrian.olap.type.Type}. * * @author jhyde * @since Sep 26, 2005 */ public class DummyExp implements Exp { private final Type type; public DummyExp(Type type) { this.type = type; } public DummyExp clone() { throw new UnsupportedOperationException(); } public int getCategory() { throw new UnsupportedOperationException(); } public Type getType() { return type; } public void unparse(PrintWriter pw) { throw new UnsupportedOperationException(); } public Exp accept(Validator validator) { throw new UnsupportedOperationException(); } public Calc accept(ExpCompiler compiler) { throw new UnsupportedOperationException(); } public Object accept(MdxVisitor visitor) { throw new UnsupportedOperationException(); } } // End DummyExp.java mondrian-3.11.0.1-R/src/main/mondrian/calc/ExpCompiler.java000066400000000000000000000346131261646570300233000ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.calc; import mondrian.calc.impl.BetterExpCompiler; import mondrian.olap.*; import mondrian.olap.type.Type; import mondrian.util.CreationException; import mondrian.util.ObjectFactory; import org.eigenbase.util.property.StringProperty; import java.util.List; /** * Mediates the compilation of an expression ({@link mondrian.olap.Exp}) * into a compiled expression ({@link Calc}). * * @author jhyde * @since Sep 28, 2005 */ public interface ExpCompiler { /** * Returns the evaluator to be used for evaluating expressions during the * compilation process. */ Evaluator getEvaluator(); /** * Returns the validator which was used to validate this expression. * * @return validator */ Validator getValidator(); /** * Compiles an expression. * * @param exp Expression * @return Compiled expression */ Calc compile(Exp exp); /** * Compiles an expression to a given result type. * *

If resultType is not null, casts the expression to that * type. Throws an exception if that conversion is not allowed by the * type system. * *

The preferredResultStyles parameter specifies a list * of desired result styles. It must not be null, but may be empty. * * @param exp Expression * * @param resultType Desired result type, or null to use expression's * current type * * @param preferredResultStyles List of result types, in descending order * of preference. Never null. * * @return Compiled expression, or null if none can satisfy */ Calc compileAs( Exp exp, Type resultType, List preferredResultStyles); /** * Compiles an expression which yields a {@link Member} result. */ MemberCalc compileMember(Exp exp); /** * Compiles an expression which yields a {@link Level} result. */ LevelCalc compileLevel(Exp exp); /** * Compiles an expression which yields a {@link Dimension} result. */ DimensionCalc compileDimension(Exp exp); /** * Compiles an expression which yields a {@link Hierarchy} result. */ HierarchyCalc compileHierarchy(Exp exp); /** * Compiles an expression which yields an int result. * The expression is implicitly converted into a scalar. */ IntegerCalc compileInteger(Exp exp); /** * Compiles an expression which yields a {@link String} result. * The expression is implicitly converted into a scalar. */ StringCalc compileString(Exp exp); /** * Compiles an expression which yields a {@link java.util.Date} result. * The expression is implicitly converted into a scalar. */ DateTimeCalc compileDateTime(Exp exp); /** * Compiles an expression which yields an immutable {@link TupleList} * result. * *

Always equivalent to {@link #compileList}(exp, false). */ ListCalc compileList(Exp exp); /** * Compiles an expression which yields {@link TupleList} result. * *

Such an expression is generally a list of {@link Member} objects or a * list of tuples (each represented by a {@link Member} array). * *

See {@link #compileList(mondrian.olap.Exp)}. * * @param exp Expression * @param mutable Whether resulting list is mutable */ ListCalc compileList(Exp exp, boolean mutable); /** * Compiles an expression which yields an immutable {@link Iterable} result. * * @param exp Expression * @return Calculator which yields an Iterable */ IterCalc compileIter(Exp exp); /** * Compiles an expression which yields a boolean result. * * @param exp Expression * @return Calculator which yields a boolean */ BooleanCalc compileBoolean(Exp exp); /** * Compiles an expression which yields a double result. * * @param exp Expression * @return Calculator which yields a double */ DoubleCalc compileDouble(Exp exp); /** * Compiles an expression which yields a tuple result. * * @param exp Expression * @return Calculator which yields a tuple */ TupleCalc compileTuple(Exp exp); /** * Compiles an expression to yield a scalar result. * *

If the expression yields a member or tuple, the calculator will * automatically apply that member or tuple to the current dimensional * context and return the value of the current measure. * * @param exp Expression * @param specific Whether to try to use the specific compile method for * scalar types. For example, if specific is true and * exp is a string expression, calls * {@link #compileString(mondrian.olap.Exp)} * @return Calculation which returns the scalar value of the expression */ Calc compileScalar(Exp exp, boolean specific); /** * Implements a parameter, returning a unique slot which will hold the * parameter's value. * * @param parameter Parameter * @return Slot */ ParameterSlot registerParameter(Parameter parameter); /** * Returns a list of the {@link ResultStyle}s * acceptable to the caller. */ List getAcceptableResultStyles(); /** * The ExpCompiler.Factory is used to access * ExpCompiler implementations. Each call returns * a new instance. This factory supports overriding the default * instance by use of a ThreadLocal and by defining a * System property with the ExpCompiler * class name. */ public static final class Factory extends ObjectFactory { private static final Factory factory; private static final Class[] CLASS_ARRAY; static { factory = new Factory(); CLASS_ARRAY = new Class[] { Evaluator.class, Validator.class, ResultStyle[].class, }; } /** * Create a ExpCompiler instance, each call returns a * new compiler. * * @param evaluator the Evaluator to use with the compiler * @param validator the Validator to use with the compiler * @return the new ExpCompiler compiler * @throws CreationException if the compiler can not be created */ public static ExpCompiler getExpCompiler( final Evaluator evaluator, final Validator validator) throws CreationException { return getExpCompiler(evaluator, validator, ResultStyle.ANY_LIST); } /** * * * @param evaluator the Evaluator to use with the compiler * @param validator the Validator to use with the compiler * @param resultStyles the initial ResultStyle array * for the compiler * @return the new ExpCompiler compiler * @throws CreationException if the compiler can not be created */ public static ExpCompiler getExpCompiler( final Evaluator evaluator, final Validator validator, final List resultStyles) throws CreationException { return factory.getObject( CLASS_ARRAY, new Object[] { evaluator, validator, resultStyles }); } /** * ThreadLocal used to hold the class name of an * ExpCompiler implementation. * Generally, this should only be used for testing. */ private static final ThreadLocal ClassName = new ThreadLocal(); /** * Get the class name of a ExpCompiler implementation * or null. * * @return the class name or null. */ public static String getThreadLocalClassName() { return ClassName.get(); } /** * Sets the class name of a ExpCompiler implementation. * This should be called (obviously) before calling the * ExpCompiler.Factory getExpCompiler * method to get the ExpCompiler implementation. * Generally, this is only used for testing. * * @param className Class name */ public static void setThreadLocalClassName(String className) { ClassName.set(className); } /** * Clears the class name (regardless of whether a class name was set). * When a class name is set using setThreadLocalClassName, * the setting whould be done in a try-block and a call to this * clear method should be in the finally-clause of that try-block. */ public static void clearThreadLocalClassName() { ClassName.set(null); } /** * The constructor for the ExpCompiler.Factory. * This passes the ExpCompiler class to the * ObjectFactory base class. */ private Factory() { super(ExpCompiler.class); } /** * Get the class name set in the ThreadLocal or null. * * @return class name or null. */ protected String getClassName() { return getThreadLocalClassName(); } /** * Return the ExpCompiler.FactoryExpCompiler.Factory property name */ protected StringProperty getStringProperty() { return MondrianProperties.instance().ExpCompilerClass; } /** * The ExpCompiler.Factory's implementation of the * ObjectFactory's abstract method which returns * the default ExpCompiler instance. * * @param parameterTypes array of classes: Evaluator, Validator and * ResultStyle * @param parameterValues the Evaluator, Validator and ResultStyle * values * @return ExpCompiler instance * @throws CreationException if the ExpCompiler can not be * created. */ protected ExpCompiler getDefault( final Class[] parameterTypes, final Object[] parameterValues) throws CreationException { // Strong typed above so don't need to check here Evaluator evaluator = (Evaluator) parameterValues[0]; Validator validator = (Validator) parameterValues[1]; List resultStyles = (List) parameterValues[2]; // Here there is bleed-through from the "calc.impl" implementation // directory into the "calc" interface definition directory. // This can be avoided if we were to use reflection to // create this the default ExpCompiler implementation. return new BetterExpCompiler( evaluator, validator, resultStyles); } /** * Get the underlying Factory object. *

* This is for testing only. * * @return the ExpCompiler.Factory object */ public static Factory getFactory() { return factory; } /** * Get the current override contect. *

* This is for testing only. * * @return the override context object. */ public Object removeContext() { return new Context(); } /** * Restore the current overrides. *

* This is for testing only. * * @param context the current override object. */ public void restoreContext(final Object context) { if (context instanceof Context) { ((Context) context).restore(); } } /** * The ExpCompiler only has two override mechanisms: the * ThreadLocal and System * Properties. This class captures and clears the current * values for both in the constructor and then replaces them * in the restore method. *

* This is for testing only. */ public static class Context implements ObjectFactory.Context { private final String threadLocalClassName; private final String systemPropertyClassName; /** * Creates a Context. */ Context() { this.threadLocalClassName = ExpCompiler.Factory.getThreadLocalClassName(); if (this.threadLocalClassName != null) { ExpCompiler.Factory.clearThreadLocalClassName(); } this.systemPropertyClassName = System.getProperty(ExpCompiler.class.getName()); if (this.systemPropertyClassName != null) { System.getProperties().remove(ExpCompiler.class.getName()); } } /** * Restores the previous context. */ private void restore() { if (this.threadLocalClassName != null) { ExpCompiler.Factory.setThreadLocalClassName( this.threadLocalClassName); } if (this.systemPropertyClassName != null) { System.setProperty( ExpCompiler.class.getName(), this.systemPropertyClassName); } } } } } // End ExpCompiler.java mondrian-3.11.0.1-R/src/main/mondrian/calc/HierarchyCalc.java000066400000000000000000000017171261646570300235510ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.calc; import mondrian.olap.Evaluator; import mondrian.olap.Hierarchy; /** * Expression which yields a {@link mondrian.olap.Hierarchy}. * *

When implementing this interface, it is convenient to extend * {@link mondrian.calc.impl.AbstractHierarchyCalc}, but it is not required. * * @author jhyde * @since Sep 26, 2005 */ public interface HierarchyCalc extends Calc { /** * Evaluates this expression to yield a hierarchy. * *

Never returns null. * * @param evaluator Evaluation context * @return a hierarchy */ Hierarchy evaluateHierarchy(Evaluator evaluator); } // End HierarchyCalc.java mondrian-3.11.0.1-R/src/main/mondrian/calc/IntegerCalc.java000066400000000000000000000017741261646570300232330ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.calc; import mondrian.olap.Evaluator; /** * Compiled expression whose result is an int. * *

When implementing this interface, it is convenient to extend * {@link mondrian.calc.impl.AbstractIntegerCalc}, but it is not required. * * @author jhyde * @since Sep 27, 2005 */ public interface IntegerCalc extends Calc { /** * Evaluates this expression to yield an int value. * If the result is null, returns the special * {@link mondrian.olap.fun.FunUtil#IntegerNull} value. * * @param evaluator Evaluation context * @return evaluation result */ int evaluateInteger(Evaluator evaluator); } // End IntegerCalc.java mondrian-3.11.0.1-R/src/main/mondrian/calc/IterCalc.java000066400000000000000000000015471261646570300225370ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.calc; import mondrian.olap.Evaluator; /** * Expression that evaluates a set of tuples to a {@link TupleIterable}. * * @author Richard Emberson * @since Jan 11, 2007 */ public interface IterCalc extends Calc { /** * Evaluates an expression to yield an Iterable of members or tuples. * *

The Iterable is immutable. * * @param evaluator Evaluation context * @return An Iterable of members or tuples, never null. */ TupleIterable evaluateIterable(Evaluator evaluator); } // End IterCalc.java mondrian-3.11.0.1-R/src/main/mondrian/calc/LevelCalc.java000066400000000000000000000016531261646570300227010ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.calc; import mondrian.olap.Evaluator; import mondrian.olap.Level; /** * Expression which yields a {@link mondrian.olap.Level}. * *

When implementing this interface, it is convenient to extend * {@link mondrian.calc.impl.AbstractLevelCalc}, but it is not required. * * @author jhyde * @since Sep 26, 2005 */ public interface LevelCalc extends Calc { /** * Evaluates this expression to yield a level. * *

Never returns null. * * @param evaluator Evaluation context * @return a level */ Level evaluateLevel(Evaluator evaluator); } // End LevelCalc.java mondrian-3.11.0.1-R/src/main/mondrian/calc/ListCalc.java000066400000000000000000000016621261646570300225450ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.calc; import mondrian.olap.Evaluator; /** * Expression which evaluates a set of members or tuples to a list. * * @author jhyde * @since Sep 27, 2005 */ public interface ListCalc extends IterCalc { /** * Evaluates an expression to yield a list of tuples. * *

The list is immutable if {@link #getResultStyle()} yields * {@link ResultStyle#MUTABLE_LIST}. Otherwise, * the caller must not modify the list. * * @param evaluator Evaluation context * @return A list of tuples, never null. */ TupleList evaluateList(Evaluator evaluator); } // End ListCalc.java mondrian-3.11.0.1-R/src/main/mondrian/calc/MemberCalc.java000066400000000000000000000017701261646570300230410ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.calc; import mondrian.olap.Evaluator; import mondrian.olap.Member; /** * Expression which yields a {@link Member}. * *

When implementing this interface, it is convenient to extend * {@link mondrian.calc.impl.AbstractMemberCalc}, but it is not required. * @author jhyde * @since Sep 26, 2005 */ public interface MemberCalc extends Calc { /** * Evaluates this expression to yield a member. * *

May return the null member (see * {@link mondrian.olap.Hierarchy#getNullMember()}) but never null. * * @param evaluator Evaluation context * @return a member */ Member evaluateMember(Evaluator evaluator); } // End MemberCalc.java mondrian-3.11.0.1-R/src/main/mondrian/calc/ParameterCompilable.java000066400000000000000000000011621261646570300247520ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.calc; import mondrian.olap.Parameter; /** * Extension to {@link mondrian.olap.Parameter} which allows compilation. * * @author jhyde * @since Jul 22, 2006 */ public interface ParameterCompilable extends Parameter { Calc compile(ExpCompiler compiler); } // End ParameterCompilable.java mondrian-3.11.0.1-R/src/main/mondrian/calc/ParameterSlot.java000066400000000000000000000037041261646570300236300ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.calc; import mondrian.olap.Parameter; /** * Implementation of a parameter. * * @author jhyde * @since Jul 25, 2006 */ public interface ParameterSlot { /** * Returns the unique index of the slot. */ int getIndex(); /** * Returns a compiled expression to compute the default value of the * parameter. */ Calc getDefaultValueCalc(); /** * Returns the parameter. */ Parameter getParameter(); /** * Sets the value of this parameter. * *

NOTE: This method will be removed when we store parameter values * in the {@link mondrian.olap.Result} rather than in the * {@link mondrian.olap.Query}. * * @param value New value * @param assigned Whether {@link #isParameterSet()} should return true; * supply value {@code false} if this is an internal assignment, to * remember the default value */ void setParameterValue(Object value, boolean assigned); /** * Returns the value of this parameter. * *

NOTE: This method will be removed when we store parameter values * in the {@link mondrian.olap.Result} rather than in the * {@link mondrian.olap.Query}. */ Object getParameterValue(); /** * Returns whether the parameter has been assigned a value. (That value * may be null.) * * @return Whether parmaeter has been assigned a value. */ boolean isParameterSet(); void setCachedDefaultValue(Object value); Object getCachedDefaultValue(); /** * Unsets the parameter value. */ void unsetParameterValue(); } // End ParameterSlot.java mondrian-3.11.0.1-R/src/main/mondrian/calc/ResultStyle.java000066400000000000000000000064351261646570300233510ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.calc; import java.util.Arrays; import java.util.List; /** * Enumeration of ways that a compiled expression can return its result to * its caller. * * @author jhyde */ public enum ResultStyle { /** * Indicates that caller will accept any applicable style. */ ANY, /** * Indicates that the expression returns its result as a list which may * safely be modified by the caller. */ MUTABLE_LIST, /** * Indicates that the expression returns its result as a list which must * not be modified by the caller. */ LIST, /** * Indicates that the expression returns its result as an Iterable * which must not be modified by the caller. */ ITERABLE, /** * Indicates that the expression results its result as an immutable * value. This is typical for expressions which return string, datetime and * numeric values. */ VALUE, /** * Indicates that the expression results its result as an immutable * value which will never be null. This is typical for expressions which * return string, datetime and numeric values. */ VALUE_NOT_NULL; // --------------------------------------------------------------- // There follow a set of convenience constants for commonly-used // collections of result styles. public static final List ANY_LIST = Arrays.asList( ANY); public static final List ITERABLE_ONLY = Arrays.asList( ITERABLE); public static final List MUTABLELIST_ONLY = Arrays.asList( MUTABLE_LIST); public static final List LIST_ONLY = Arrays.asList( LIST); public static final List ITERABLE_ANY = Arrays.asList( ITERABLE, ANY); public static final List ITERABLE_LIST = Arrays.asList( ITERABLE, LIST); public static final List ITERABLE_MUTABLELIST = Arrays.asList( ITERABLE, MUTABLE_LIST); public static final List ITERABLE_LIST_MUTABLELIST = Arrays.asList( ITERABLE, LIST, MUTABLE_LIST); public static final List LIST_MUTABLELIST = Arrays.asList( LIST, MUTABLE_LIST); public static final List MUTABLELIST_LIST = Arrays.asList( MUTABLE_LIST, LIST); public static final List ITERABLE_LIST_MUTABLELIST_ANY = Arrays.asList( ITERABLE, LIST, MUTABLE_LIST, ANY); public static final List ITERABLE_MUTABLELIST_LIST = Arrays.asList( ITERABLE, MUTABLE_LIST, LIST); public static final List ANY_ONLY = Arrays.asList( ANY); } // End ResultStyle.java mondrian-3.11.0.1-R/src/main/mondrian/calc/StringCalc.java000066400000000000000000000016071261646570300230770ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.calc; import mondrian.olap.Evaluator; /** * Compiled expression whose result is a {@link String}. * *

When implementing this interface, it is convenient to extend * {@link mondrian.calc.impl.AbstractStringCalc}, but it is not required. * * @author jhyde * @since Sep 26, 2005 */ public interface StringCalc extends Calc { /** * Evaluates this expression to yield a {@link String} value. * * @param evaluator Evaluation context * @return evaluation result */ String evaluateString(Evaluator evaluator); } // End StringCalc.java mondrian-3.11.0.1-R/src/main/mondrian/calc/TupleCalc.java000066400000000000000000000023471261646570300227240ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.calc; import mondrian.olap.Evaluator; import mondrian.olap.Member; /** * Expression which yields a tuple. * *

The tuple is represented as an array of {@link Member} objects, * null to represent the null tuple. * *

When implementing this interface, it is convenient to extend * {@link mondrian.calc.impl.AbstractTupleCalc}, but it is not required. * * @author jhyde * @since Sep 27, 2005 */ public interface TupleCalc extends Calc { /** * Evaluates this expression to yield a tuple. * *

A tuple cannot contain any null members. If any of the members is * null, this method must return a null. * * @post result == null || !tupleContainsNullMember(result) * * @param evaluator Evaluation context * @return an array of members, or null to represent the null tuple */ Member[] evaluateTuple(Evaluator evaluator); } // End TupleCalc.java mondrian-3.11.0.1-R/src/main/mondrian/calc/TupleCollections.java000066400000000000000000000435171261646570300243440ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.calc; import mondrian.calc.impl.*; import mondrian.olap.*; import java.util.*; /** * Utility methods for tuple collections and iterators. * * @see TupleList * @see TupleIterator * * @author jhyde */ public final class TupleCollections { private static final TupleList[] EMPTY_LISTS = { new DelegatingTupleList(0, Collections.>emptyList()), new UnaryTupleList(Collections.emptyList()), new DelegatingTupleList(2, Collections.>emptyList()), new DelegatingTupleList(3, Collections.>emptyList()), new DelegatingTupleList(4, Collections.>emptyList()) }; // prevent instantiation private TupleCollections() { } /** * Creates a list of given arity. * *

If arity == 1, creates a {@link UnaryTupleList}; * if arity == 0, creates a {@link DelegatingTupleList}; * otherwise creates a {@link ArrayTupleList}. * * @see TupleList#cloneList(int) * @see #createList(int, int) * * @param arity Arity * @return Tuple list */ public static TupleList createList(int arity) { switch (arity) { case 0: return new DelegatingTupleList(0, new ArrayList>()); case 1: return new UnaryTupleList(); default: return new ArrayTupleList(arity); } } /** * Creates a list of given arity and initial capacity. * *

If arity == 1, creates a {@link UnaryTupleList}; * if arity == 0, creates a {@link DelegatingTupleList}; * otherwise creates a {@link ArrayTupleList}. * * @see TupleList#cloneList(int) * * @param arity Arity * @param initialCapacity Initial capacity * @return Tuple list */ public static TupleList createList(int arity, int initialCapacity) { switch (arity) { case 0: return new DelegatingTupleList( 0, new ArrayList>(initialCapacity)); case 1: return new UnaryTupleList(new ArrayList(initialCapacity)); default: return new ArrayTupleList(arity, initialCapacity); } } /** * Returns an empty TupleList of given arity. * * @param arity Number of members per tuple * @return Empty tuple list */ public static TupleList emptyList(int arity) { return arity < EMPTY_LISTS.length ? EMPTY_LISTS[arity] : new DelegatingTupleList( arity, Collections.>emptyList()); } /** * Creates an unmodifiable TupleList backed by a given list. * * @see Collections#unmodifiableList(java.util.List) * * @param list the list for which an unmodifiable view is to be returned. * @return an unmodifiable view of the specified list. */ public static TupleList unmodifiableList(TupleList list) { return list.getArity() == 1 ? new UnaryTupleList( Collections.unmodifiableList( list.slice(0))) : new DelegatingTupleList( list.getArity(), Collections.unmodifiableList( list)); } /** * Adapts a {@link TupleCursor} into a {@link TupleIterator}. * *

Since the latter is a more difficult API to implement, the wrapper * has some extra state. * *

This method may be used to implement * {@link mondrian.calc.TupleIterable#tupleIterator()} for a * {@link TupleIterable} or {@link TupleList} that only has a * {@code TupleCursor} implementation. * * @param cursor Cursor * @return Tuple iterator view onto the cursor */ public static TupleIterator iterator(final TupleCursor cursor) { if (cursor instanceof TupleIterator) { return (TupleIterator) cursor; } return new AbstractTupleIterator(cursor.getArity()) { private int state = STATE_UNKNOWN; private static final int STATE_UNKNOWN = 0; private static final int STATE_HASNEXT = 1; private static final int STATE_EOD = 2; public List current() { return cursor.current(); } @Override public boolean hasNext() { switch (state) { case STATE_UNKNOWN: if (cursor.forward()) { state = STATE_HASNEXT; return true; } else { state = STATE_EOD; return false; } case STATE_EOD: return false; case STATE_HASNEXT: return true; default: throw new RuntimeException("unpexected state " + state); } } @Override public List next() { switch (state) { case STATE_UNKNOWN: if (cursor.forward()) { return cursor.current(); } state = STATE_EOD; // fall through case STATE_EOD: throw new NoSuchElementException(); case STATE_HASNEXT: state = STATE_UNKNOWN; return cursor.current(); default: throw new RuntimeException("unpexected state " + state); } } public boolean forward() { switch (state) { case STATE_UNKNOWN: return cursor.forward(); case STATE_HASNEXT: state = STATE_UNKNOWN; return true; case STATE_EOD: return false; default: throw new RuntimeException("unpexected state " + state); } } @Override public void setContext(Evaluator evaluator) { cursor.setContext(evaluator); } @Override public void currentToArray(Member[] members, int offset) { cursor.currentToArray(members, offset); } @Override public Member member(int column) { return cursor.member(column); } }; } /** * Creates a slice of a {@link TupleIterable}. * *

Can be used as an implementation for * {@link mondrian.calc.TupleList#slice(int)}. * * @param tupleIterable Iterable * @param column Which member of each tuple of project. * @return Iterable that returns a given member of each tuple */ public static Iterable slice( final TupleIterable tupleIterable, final int column) { if (column < 0 || column >= tupleIterable.getArity()) { throw new IllegalArgumentException(); } return new Iterable() { public Iterator iterator() { final TupleIterator tupleIterator = tupleIterable.tupleIterator(); return new Iterator() { public boolean hasNext() { return tupleIterator.hasNext(); } public Member next() { if (!tupleIterator.forward()) { throw new NoSuchElementException(); } return tupleIterator.member(column); } public void remove() { throw new UnsupportedOperationException(); } }; } }; } /** * Converts a {@link mondrian.calc.TupleIterable} to an old-style iterable that * creates an iterator over member arrays. * * @param tupleIterable Tuple iterable * @return Iterable that creates an iterator over tuples represented as * member arrays */ public static Iterable asMemberArrayIterable( final TupleIterable tupleIterable) { return new Iterable() { public Iterator iterator() { return new Iterator() { final TupleIterator tupleIterator = tupleIterable.tupleIterator(); public boolean hasNext() { return tupleIterator.hasNext(); } public Member[] next() { final List next = tupleIterator.next(); return next.toArray(new Member[next.size()]); } public void remove() { throw new UnsupportedOperationException(); } }; } }; } /** * Converts a {@link mondrian.calc.TupleList} to an old-style list of member * arrays. * * @param tupleList Tuple list * @return List of member arrays */ public static List asMemberArrayList( final TupleList tupleList) { return new AbstractList() { @Override public Member[] get(int index) { final List tuple = tupleList.get(index); return tuple.toArray(new Member[tuple.size()]); } @Override public int size() { return tupleList.size(); } }; } /** * Converts an old-style list (members or member arrays) to a * {@link mondrian.calc.TupleList}. * *

Deduces the arity of the list from the first element, if the list * is not empty. Otherwise assumes arity 1. * *

If the list happens to be a tuple list, returns unchanged. * * @param list Old-style list * @return Tuple list */ public static TupleList asTupleList(List list) { if (list instanceof TupleList) { return (TupleList) list; } if (list.isEmpty()) { return TupleCollections.emptyList(1); } final Object o = list.get(0); if (o instanceof Member) { final List memberList = Util.cast(list); return new UnaryTupleList(memberList); } else { final List memberArrayList = Util.cast(list); return new DelegatingTupleList( memberArrayList.get(0).length, new AbstractList>() { public List get(int index) { return Arrays.asList(memberArrayList.get(index)); } public int size() { return memberArrayList.size(); } } ); } } /** * Converts a {@link TupleIterable} into a {@link TupleList}. * *

If the iterable is already a list, returns the iterable. If it is not * a list, the behavior depends on the {@code eager} parameter. With eager = * true, creates a list and populates it with the contents of the * iterable. With eager = false, wraps in an adapter that implements the * list interface and materializes to a list the first time that an * operation that is in TupleList but not TupleIterable -- for example, * {@link TupleList#get} or {@link TupleList#size} -- is called. * * @param tupleIterable Iterable * @param eager Whether to convert into a list now, as opposed to on first * use of a random-access method such as size or get. * @return List */ public static TupleList materialize( TupleIterable tupleIterable, boolean eager) { if (tupleIterable instanceof TupleList) { return (TupleList) tupleIterable; } if (eager) { TupleList tupleList = createList(tupleIterable.getArity()); TupleCursor tupleCursor = tupleIterable.tupleCursor(); while (tupleCursor.forward()) { tupleList.addCurrent(tupleCursor); } return tupleList; } else { return new MaterializingTupleList(tupleIterable); } } /** * Implementation of {@link TupleList} that is based on a * {@link TupleIterable} and materializes into a read-only list the first * time that an method is called that requires a list. */ private static class MaterializingTupleList implements TupleList { private final TupleIterable tupleIterable; TupleList tupleList; public MaterializingTupleList( TupleIterable tupleIterable) { this.tupleIterable = tupleIterable; } private TupleList materialize() { if (tupleList == null) { tupleList = TupleCollections.materialize(tupleIterable, true); } return tupleList; } // TupleIterable methods public TupleIterator tupleIterator() { if (tupleList == null) { return tupleIterable.tupleIterator(); } else { return tupleList.tupleIterator(); } } public TupleCursor tupleCursor() { if (tupleList == null) { return tupleIterable.tupleCursor(); } else { return tupleList.tupleCursor(); } } public int getArity() { return tupleIterable.getArity(); } public Iterator> iterator() { if (tupleList == null) { return tupleIterable.iterator(); } else { return tupleList.iterator(); } } public List slice(int column) { // Note that TupleIterable has 'Iterable slice(int)' // and TupleList has 'List slice(int)'. // So, if this list is not materialized, we could return a slice of // the un-materialized iterable. But it's not worth the complexity. return materialize().slice(column); } public Member get(int slice, int index) { return materialize().get(slice, index); } public TupleList cloneList(int capacity) { return materialize().cloneList(capacity); } public void addTuple(Member... members) { throw new UnsupportedOperationException(); } public TupleList project(int[] destIndices) { return materialize().project(destIndices); } public void addCurrent(TupleCursor tupleIter) { materialize().addCurrent(tupleIter); } public TupleList subList(int fromIndex, int toIndex) { return materialize().subList(fromIndex, toIndex); } public TupleList withPositionCallback( PositionCallback positionCallback) { return materialize().withPositionCallback(positionCallback); } public TupleList fix() { return materialize().fix(); } public int size() { return materialize().size(); } public boolean isEmpty() { return materialize().isEmpty(); } public boolean contains(Object o) { return materialize().contains(o); } public Object[] toArray() { return materialize().toArray(); } public T[] toArray(T[] a) { return materialize().toArray(a); } public boolean add(List members) { throw new UnsupportedOperationException(); } public boolean remove(Object o) { throw new UnsupportedOperationException(); } public boolean containsAll(Collection c) { return materialize().containsAll(c); } public boolean addAll(Collection> c) { throw new UnsupportedOperationException(); } public boolean addAll(int index, Collection> c) { throw new UnsupportedOperationException(); } public boolean removeAll(Collection c) { throw new UnsupportedOperationException(); } public boolean retainAll(Collection c) { throw new UnsupportedOperationException(); } public void clear() { throw new UnsupportedOperationException(); } public List get(int index) { return materialize().get(index); } public List set(int index, List element) { throw new UnsupportedOperationException(); } public void add(int index, List element) { throw new UnsupportedOperationException(); } public List remove(int index) { throw new UnsupportedOperationException(); } public int indexOf(Object o) { return materialize().indexOf(o); } public int lastIndexOf(Object o) { return materialize().lastIndexOf(o); } public ListIterator> listIterator() { return materialize().listIterator(); } public ListIterator> listIterator(int index) { return materialize().listIterator(index); } } } // End TupleCollections.java mondrian-3.11.0.1-R/src/main/mondrian/calc/TupleCursor.java000066400000000000000000000051421261646570300233330ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.calc; import mondrian.olap.Evaluator; import mondrian.olap.Member; import java.util.List; /** * Cheap interface for iterating through the contents of a {@link TupleList}. * *

Stops short of the full {@link java.util.Iterator} interface. If you want * that, see {@link TupleIterator}. * * @author Julian Hyde */ public interface TupleCursor { void setContext(Evaluator evaluator); /** * Moves the iterator forward one position. * *

Returns false only when end of data has been reached. * *

Similar to calling the {@link java.util.Iterator} methods * {@link java.util.Iterator#hasNext()} followed by * {@link java.util.Iterator#next()} but * does not construct an object, and is therefore cheaper. * *

If you want to use an Iterator, see {@link TupleIterator}. * * @return Whether was able to move forward a position */ boolean forward(); /** * Returns the tuple that this cursor is positioned on. * *

This method never returns null, and may safely be called multiple * times (or not all) for each position in the iteration. * *

Invalid to call this method when the cursor is has not been * positioned, for example, if {@link #forward()} has not been called or * if the most recent call to {@code forward} returned {@code false}. * * @return Current tuple */ List current(); /** * Returns the number of members in each tuple. * * @return The number of members in each tuple */ int getArity(); Member member(int column); /** * Writes the member(s) of the next tuple to a given offset in an array. * *

This method saves the overhead of a memory allocation when the * resulting tuple will be written immediately to an array. The effect of * {@code currentToArray(members, 0)} is the same as calling * {@code current().toArray(members)}. * *

Before calling this method, you must position the iterator at a valid * position. Typically you would call hasNext followed by next; or forward. * * @param members Members * @param offset Offset in the array to write to */ void currentToArray(Member[] members, int offset); } // End TupleCursor.java mondrian-3.11.0.1-R/src/main/mondrian/calc/TupleIterable.java000066400000000000000000000044761261646570300236160ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.calc; import mondrian.olap.Member; import java.util.List; /** * Extension to {@link Iterable} that returns a {@link TupleIterator}. * *

If efficiency is important, call {@link #tupleCursor()} rather than * {@link #tupleIterator()} if possible. Because {@link TupleCursor} is a * simpler API to implement than {@link TupleIterator}, in some cases the * implementation may be more efficient. * * @author jhyde */ public interface TupleIterable extends Iterable> { /** * Creates an iterator over the contents of this iterable. * *

Always has the same effect as calling {@link #iterator()}. * * @see #tupleCursor() * * @return cursor over the tuples returned by this iterable */ TupleIterator tupleIterator(); /** * Creates a cursor over the contents of this iterable. * *

The contents of the cursor will always be the same as those returned * by {@link #tupleIterator()}. Because {@link TupleCursor} is a simpler API * to implement than {@link TupleIterator}, in some cases the implementation * may be more efficient. * * @return cursor over the tuples returned by this iterable */ TupleCursor tupleCursor(); /** * Returns the number of members in each tuple. * * @return The number of members in each tuple */ int getArity(); /** * Returns an iterable over the members at a given column. * *

The iteratble returns an interator that is modifiable if and only if * this TupleIterable is modifiable. * *

If this {@code TupleIterable} happens to be a {@link TupleList}, * the method is overridden to return a {@link List}<{@link Member}>. * * @param column Ordinal of the member in each tuple to project * @return Iterable that returns an iterator over members * @throws IllegalArgumentException if column is not less than arity */ Iterable slice(int column); } // End TupleIterable.java mondrian-3.11.0.1-R/src/main/mondrian/calc/TupleIterator.java000066400000000000000000000015641261646570300236530ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.calc; import mondrian.olap.Member; import java.util.Iterator; import java.util.List; /** * Extension to {@link java.util.Iterator} that returns tuples. * *

Extends {@link TupleCursor} to support the standard Java iterator * API. For some implementations, using the iterator API (in particular the * {@link #next} and {@link #hasNext} methods) may be more expensive than using * cursor's {@link #forward} method. * * @author jhyde */ public interface TupleIterator extends Iterator>, TupleCursor { } // End TupleIterator.java mondrian-3.11.0.1-R/src/main/mondrian/calc/TupleList.java000066400000000000000000000057261261646570300230010ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.calc; import mondrian.olap.Member; import java.util.List; /** * List of tuples. * *

Design notes

* *
    * *
  • Consider changing * {@link TupleCalc#evaluateTuple(mondrian.olap.Evaluator)} * and {@link mondrian.olap.Evaluator.NamedSetEvaluator#currentTuple()} * to List<Member>
  • * *
  • Search for potential uses of {@link TupleList#get(int, int)}
  • * *
  • Worth creating {@link TupleList}.addAll(TupleIterator)?
  • * *
* * @author jhyde */ public interface TupleList extends List>, TupleIterable { /** * Returns a particular column of a particular row. * *

Note that {@code list.get(row, column)} * is equivalent to {@code list.slice(column).get(row)} * and {@code list.get(row).get(column)} * but is more efficient for most implementations of TupleList. * * @param slice Column ordinal * @param index Row ordinal * @return Member at given row and column */ Member get(int slice, int index); /** * Returns a list of the members at a given column. * *

The list is modifiable if and only if this TupleList is modifiable. * Adding an element to a slice will create a tuple whose members in other * columns are null. * Removing an element from a slicer will remove a tuple. * * @param column Ordinal of the member in each tuple to project * @return List of members * @throws IllegalArgumentException if column is not less than arity */ List slice(int column); /** * Creates a copy of this list that has the same type and has a given * capacity. * *

If capacity is negative, populates the list. A deep copy is made, * so that it the contents of the list are not affected to changes to any * backing collections. * * @param capacity Capacity * @return Copy of list, empty if capacity is non-negative */ TupleList cloneList(int capacity); void addTuple(Member... members); TupleList project(int[] destIndices); void addCurrent(TupleCursor tupleIter); // override, refining return type TupleList subList(int fromIndex, int toIndex); TupleList withPositionCallback(PositionCallback positionCallback); /** * Fixes the tuples of this list, so that their contents will not change * even if elements of the list are reordered or removed. Returns this * list if possible. * * @return List whose tuples are invariant if the list is sorted or filtered */ TupleList fix(); interface PositionCallback { void onPosition(int index); } } // End TupleList.java mondrian-3.11.0.1-R/src/main/mondrian/calc/VoidCalc.java000066400000000000000000000012701261646570300225260ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.calc; import mondrian.olap.Evaluator; /** * Expression which has a void result. * *

Since it doesn't return anything, any useful implementation of this * class will do its work by causing side-effects. * * @author jhyde * @since Sep 29, 2005 */ public interface VoidCalc extends Calc { void evaluateVoid(Evaluator evaluator); } // End VoidCalc.java mondrian-3.11.0.1-R/src/main/mondrian/calc/impl/000077500000000000000000000000001261646570300211405ustar00rootroot00000000000000mondrian-3.11.0.1-R/src/main/mondrian/calc/impl/AbstractBooleanCalc.java000066400000000000000000000026031261646570300256320ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.calc.impl; import mondrian.calc.BooleanCalc; import mondrian.calc.Calc; import mondrian.olap.Evaluator; import mondrian.olap.Exp; /** * Abstract implementation of the {@link mondrian.calc.BooleanCalc} interface. * *

The derived class must * implement the {@link #evaluateBoolean(mondrian.olap.Evaluator)} method, * and the {@link #evaluate(mondrian.olap.Evaluator)} method will call it. * * @author jhyde * @since Sep 26, 2005 */ public abstract class AbstractBooleanCalc extends AbstractCalc implements BooleanCalc { /** * Creates an AbstractBooleanCalc. * * @param exp Source expression * @param calcs Child compiled expressions */ public AbstractBooleanCalc(Exp exp, Calc[] calcs) { super(exp, calcs); // now supports int and double conversion (see // AbstractExpCompiler.compileBoolean(): // assert getType() instanceof BooleanType; } public Object evaluate(Evaluator evaluator) { return Boolean.valueOf(evaluateBoolean(evaluator)); } } // End AbstractBooleanCalc.java mondrian-3.11.0.1-R/src/main/mondrian/calc/impl/AbstractCalc.java000066400000000000000000000201221261646570300243260ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.calc.impl; import mondrian.calc.*; import mondrian.mdx.ResolvedFunCall; import mondrian.olap.*; import mondrian.olap.type.Type; import mondrian.rolap.RolapEvaluator; import mondrian.rolap.RolapHierarchy; import java.util.*; /** * Abstract implementation of the {@link mondrian.calc.Calc} interface. * * @author jhyde * @since Sep 27, 2005 */ public abstract class AbstractCalc implements Calc { private final Calc[] calcs; protected final Type type; protected final Exp exp; /** * Creates an AbstractCalc. * * @param exp Source expression * @param calcs Child compiled expressions */ protected AbstractCalc(Exp exp, Calc[] calcs) { assert exp != null; this.exp = exp; this.calcs = calcs; this.type = exp.getType(); } public Type getType() { return type; } /** * {@inheritDoc} * * Default implementation just does 'instanceof TargetClass'. Subtypes that * are wrappers should override. */ public boolean isWrapperFor(Class iface) { return iface.isInstance(this); } /** * {@inheritDoc} * * Default implementation just casts to TargetClass. * Subtypes that are wrappers should override. */ public T unwrap(Class iface) { return iface.cast(this); } public void accept(CalcWriter calcWriter) { calcWriter.visitCalc(this, getName(), getArguments(), getCalcs()); } /** * Returns the name of this expression type, used when serializing an * expression to a string. * *

The default implementation tries to extract a name from a function * call, if any, then prints the last part of the class name. */ protected String getName() { String name = lastSegment(getClass()); if (isDigits(name) && exp instanceof ResolvedFunCall) { ResolvedFunCall funCall = (ResolvedFunCall) exp; name = funCall.getFunDef().getName(); } return name; } /** * Returns the last segment of a class name. * *

Examples: * lastSegment("com.acme.Foo") = "Foo" * lastSegment("com.acme.Foo$Bar") = "Bar" * lastSegment("com.acme.Foo$1") = "1" * * @param clazz Class * @return Last segment of class name */ private String lastSegment(Class clazz) { final String name = clazz.getName(); int dot = name.lastIndexOf('.'); int dollar = name.lastIndexOf('$'); int dotDollar = Math.max(dot, dollar); if (dotDollar >= 0) { return name.substring(dotDollar + 1); } return name; } private static boolean isDigits(String name) { for (int i = 0; i < name.length(); i++) { char c = name.charAt(i); if ("0123456789".indexOf(c) < 0) { return false; } } return true; } /** * Returns this expression's child expressions. */ public Calc[] getCalcs() { return calcs; } public boolean dependsOn(Hierarchy hierarchy) { return anyDepends(getCalcs(), hierarchy); } /** * Returns true if one of the calcs depends on the given dimension. */ public static boolean anyDepends(Calc[] calcs, Hierarchy hierarchy) { for (Calc calc : calcs) { if (calc != null && calc.dependsOn(hierarchy)) { return true; } } return false; } /** * Returns true if calc[0] depends on dimension, * else false if calc[0] returns dimension, * else true if any of the other calcs depend on dimension. * *

Typical application: Aggregate({Set}, {Value Expression}) * depends upon everything {Value Expression} depends upon, except the * dimensions of {Set}. */ public static boolean anyDependsButFirst( Calc[] calcs, Hierarchy hierarchy) { if (calcs.length == 0) { return false; } if (calcs[0].dependsOn(hierarchy)) { return true; } if (calcs[0].getType().usesHierarchy(hierarchy, true)) { return false; } for (int i = 1; i < calcs.length; i++) { Calc calc = calcs[i]; if (calc != null && calc.dependsOn(hierarchy)) { return true; } } return false; } /** * Returns true if any of the calcs depend on dimension, * else false if any of the calcs return dimension, * else true. */ public static boolean butDepends( Calc[] calcs, Hierarchy hierarchy) { boolean result = true; for (Calc calc : calcs) { if (calc != null) { if (calc.dependsOn(hierarchy)) { return true; } if (calc.getType().usesHierarchy(hierarchy, true)) { result = false; } } } return result; } /** * Returns any other arguments to this calc. * * @return Collection of name/value pairs, represented as a map */ protected final Map getArguments() { final Map argumentMap = new LinkedHashMap(); collectArguments(argumentMap); return argumentMap; } /** * Collects any other arguments to this calc. * *

The default implementation returns name, class, type, resultStyle. * A subclass must call super, but may add other arguments. * * @param arguments Collection of name/value pairs, represented as a map */ protected void collectArguments(Map arguments) { arguments.put("name", getName()); arguments.put("class", getClass()); arguments.put("type", getType()); arguments.put("resultStyle", getResultStyle()); } /** * Returns a simplified evalator whose context is the same for every * dimension which an expression depends on, and the default member for * every dimension which it does not depend on. * *

The default member is often the 'all' member, so this evaluator is * usually the most efficient context in which to evaluate the expression. * * @param calc * @param evaluator */ public static Evaluator simplifyEvaluator(Calc calc, Evaluator evaluator) { if (evaluator.isNonEmpty()) { // If NON EMPTY is present, we cannot simplify the context, because // we have to assume that the expression depends on everything. // TODO: Bug 1456418: Convert 'NON EMPTY Crossjoin' to // 'NonEmptyCrossJoin'. return evaluator; } int changeCount = 0; Evaluator ev = evaluator; final List hierarchies = ((RolapEvaluator) evaluator).getCube().getHierarchies(); for (RolapHierarchy hierarchy : hierarchies) { final Member member = ev.getContext(hierarchy); if (member.isAll()) { continue; } if (calc.dependsOn(hierarchy)) { continue; } final Member unconstrainedMember = member.getHierarchy().getDefaultMember(); if (member == unconstrainedMember) { // This is a hierarchy without an 'all' member, and the context // is already the default member. continue; } if (changeCount++ == 0) { ev = evaluator.push(); } ev.setContext(unconstrainedMember); } return ev; } public ResultStyle getResultStyle() { return ResultStyle.VALUE; } } // End AbstractCalc.java mondrian-3.11.0.1-R/src/main/mondrian/calc/impl/AbstractDateTimeCalc.java000066400000000000000000000023421261646570300257470ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.calc.impl; import mondrian.calc.Calc; import mondrian.calc.DateTimeCalc; import mondrian.olap.Evaluator; import mondrian.olap.Exp; /** * Abstract implementation of the {@link mondrian.calc.DateTimeCalc} interface. * *

The derived class must * implement the {@link #evaluateDateTime(mondrian.olap.Evaluator)} method, * and the {@link #evaluate(mondrian.olap.Evaluator)} method will call it. * * @author jhyde * @since Sep 26, 2005 */ public abstract class AbstractDateTimeCalc extends AbstractCalc implements DateTimeCalc { /** * Creates an AbstractDateTimeCalc. * * @param exp Source expression * @param calcs Child compiled expressions */ protected AbstractDateTimeCalc(Exp exp, Calc[] calcs) { super(exp, calcs); } public Object evaluate(Evaluator evaluator) { return evaluateDateTime(evaluator); } } // End AbstractDateTimeCalc.java mondrian-3.11.0.1-R/src/main/mondrian/calc/impl/AbstractDimensionCalc.java000066400000000000000000000025071261646570300262030ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.calc.impl; import mondrian.calc.Calc; import mondrian.calc.DimensionCalc; import mondrian.olap.Evaluator; import mondrian.olap.Exp; import mondrian.olap.type.DimensionType; /** * Abstract implementation of the {@link mondrian.calc.DimensionCalc} interface. * *

The derived class must * implement the {@link #evaluateDimension(mondrian.olap.Evaluator)} method, * and the {@link #evaluate(mondrian.olap.Evaluator)} method will call it. * * @author jhyde * @since Sep 26, 2005 */ public abstract class AbstractDimensionCalc extends AbstractCalc implements DimensionCalc { /** * Creates an AbstractDimensionCalc. * * @param exp Source expression * @param calcs Child compiled expressions */ protected AbstractDimensionCalc(Exp exp, Calc[] calcs) { super(exp, calcs); assert getType() instanceof DimensionType; } public Object evaluate(Evaluator evaluator) { return evaluateDimension(evaluator); } } // End AbstractDimensionCalc.java mondrian-3.11.0.1-R/src/main/mondrian/calc/impl/AbstractDoubleCalc.java000066400000000000000000000026741261646570300254750ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.calc.impl; import mondrian.calc.Calc; import mondrian.calc.DoubleCalc; import mondrian.olap.Evaluator; import mondrian.olap.Exp; import mondrian.olap.fun.FunUtil; import mondrian.olap.type.NumericType; /** * Abstract implementation of the {@link mondrian.calc.DoubleCalc} interface. * *

The derived class must * implement the {@link #evaluateDouble(mondrian.olap.Evaluator)} method, * and the {@link #evaluate(mondrian.olap.Evaluator)} method will call it. * * @author jhyde * @since Sep 27, 2005 */ public abstract class AbstractDoubleCalc extends AbstractCalc implements DoubleCalc { /** * Creates an AbstractDoubleCalc. * * @param exp Source expression * @param calcs Child compiled expressions */ protected AbstractDoubleCalc(Exp exp, Calc[] calcs) { super(exp, calcs); assert getType() instanceof NumericType; } public Object evaluate(Evaluator evaluator) { final double d = evaluateDouble(evaluator); if (d == FunUtil.DoubleNull) { return null; } return new Double(d); } } // End AbstractDoubleCalc.java mondrian-3.11.0.1-R/src/main/mondrian/calc/impl/AbstractEndToEndTupleList.java000066400000000000000000000107251261646570300270020ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.calc.impl; import mondrian.calc.TupleList; import mondrian.olap.Member; import java.util.*; /** * Abstract implementation of a {@link mondrian.calc.TupleList} that stores * tuples in end-to-end format. * *

For example, if the arity is 3, the tuples {(A1, B1, C1), (A1, B2, C2)} * will be stored as {A1, B1, C1, A2, B2, C2}. This is memory-efficient (only * one array, compared to 3 arrays or one array per tuple in other * representations), has good locality of reference, and typical operations * require few indirections. * *

Concrete subclasses can store the data in various backing lists. * * @author jhyde */ abstract class AbstractEndToEndTupleList extends AbstractTupleList { AbstractEndToEndTupleList(int arity) { super(arity); } public TupleList project(final int[] destIndices) { final List backingList = backingList(); final int originalArity = getArity(); return new DelegatingTupleList( destIndices.length, new AbstractList>() { public List get(int index) { final int n = index * originalArity; return new AbstractList() { public Member get(int index) { return backingList.get(n + destIndices[index]); } public int size() { return destIndices.length; } }; } public int size() { return backingList.size() / originalArity; } }); } protected abstract List backingList(); @Override public List set(int index, List element) { assert mutable; final List list = backingList(); for (int i = 0, startIndex = index * arity; i < arity; i++) { list.set(startIndex + i, element.get(i)); } return null; // not compliant with List contract } @Override public boolean addAll(Collection> c) { return addAll(size(), c); } @Override public boolean addAll(int i, Collection> c) { assert mutable; if (c instanceof AbstractEndToEndTupleList) { return backingList().addAll( i * arity, ((AbstractEndToEndTupleList) c).backingList()); } return super.addAll(i, c); } @Override public TupleList subList(int fromIndex, int toIndex) { return new ListTupleList( arity, backingList().subList(fromIndex * arity, toIndex * arity)); } public TupleList withPositionCallback( final PositionCallback positionCallback) { return new ListTupleList( arity, new PositionSensingList(positionCallback)); } private class PositionSensingList extends AbstractList { private final PositionCallback positionCallback; private final List backingList = backingList(); public PositionSensingList( PositionCallback positionCallback) { this.positionCallback = positionCallback; } @Override public Member get(int index) { positionCallback.onPosition(index / arity); return backingList.get(index); } @Override public int size() { return backingList.size(); } @Override public Member set(int index, Member element) { assert mutable; positionCallback.onPosition(index / arity); return backingList.set(index, element); } @Override public void add(int index, Member element) { assert mutable; positionCallback.onPosition(index); backingList.add(index, element); } @Override public Member remove(int index) { assert mutable; positionCallback.onPosition(index); return backingList.remove(index); } } } // End AbstractEndToEndTupleList.java mondrian-3.11.0.1-R/src/main/mondrian/calc/impl/AbstractExpCompiler.java000066400000000000000000000506431261646570300257260ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.calc.impl; import mondrian.calc.*; import mondrian.mdx.MemberExpr; import mondrian.mdx.UnresolvedFunCall; import mondrian.olap.*; import mondrian.olap.fun.*; import mondrian.olap.type.*; import mondrian.olap.type.DimensionType; import mondrian.olap.type.LevelType; import mondrian.resource.MondrianResource; import java.util.*; /** * Abstract implementation of the {@link mondrian.calc.ExpCompiler} interface. * * @author jhyde * @since Sep 29, 2005 */ public class AbstractExpCompiler implements ExpCompiler { private final Evaluator evaluator; private final Validator validator; private final Map parameterSlots = new HashMap(); private List resultStyles; /** * Creates an AbstractExpCompiler * * @param evaluator Evaluator * @param validator Validator */ public AbstractExpCompiler(Evaluator evaluator, Validator validator) { this(evaluator, validator, ResultStyle.ANY_LIST); } /** * Creates an AbstractExpCompiler which is constrained to produce one of * a set of result styles. * * @param evaluator Evaluator * @param validator Validator * @param resultStyles List of result styles, preferred first, must not be */ public AbstractExpCompiler( Evaluator evaluator, Validator validator, List resultStyles) { this.evaluator = evaluator; this.validator = validator; this.resultStyles = (resultStyles == null) ? ResultStyle.ANY_LIST : resultStyles; } public Evaluator getEvaluator() { return evaluator; } public Validator getValidator() { return validator; } /** * {@inheritDoc} * * Uses the current ResultStyle to compile the expression. */ public Calc compile(Exp exp) { return exp.accept(this); } /** * {@inheritDoc} * * Uses a new ResultStyle to compile the expression. */ public Calc compileAs( Exp exp, Type resultType, List preferredResultTypes) { assert preferredResultTypes != null; int substitutions = 0; if (Util.Retrowoven) { // Copy and replace ITERABLE // A number of functions declare that they can accept // ITERABLEs so here is where that those are converted to innocent // LISTs for jdk1.4 and other retrowoven code. List tmp = new ArrayList(preferredResultTypes.size()); for (ResultStyle preferredResultType : preferredResultTypes) { if (preferredResultType == ResultStyle.ITERABLE) { preferredResultType = ResultStyle.LIST; ++substitutions; } tmp.add(preferredResultType); } preferredResultTypes = tmp; } List save = this.resultStyles; try { this.resultStyles = preferredResultTypes; if (resultType != null && resultType != exp.getType()) { if (resultType instanceof MemberType) { return compileMember(exp); } else if (resultType instanceof LevelType) { return compileLevel(exp); } else if (resultType instanceof HierarchyType) { return compileHierarchy(exp); } else if (resultType instanceof DimensionType) { return compileDimension(exp); } else if (resultType instanceof ScalarType) { return compileScalar(exp, false); } } final Calc calc = compile(exp); if (substitutions > 0) { final IterCalc iterCalc = (IterCalc) calc; if (iterCalc == null) { this.resultStyles = Collections.singletonList(ResultStyle.ITERABLE); return compile(exp); } else { return iterCalc; } } return calc; } finally { this.resultStyles = save; } } public MemberCalc compileMember(Exp exp) { final Type type = exp.getType(); if (type instanceof HierarchyType) { final HierarchyCalc hierarchyCalc = compileHierarchy(exp); return hierarchyToMember(hierarchyCalc); } else if (type instanceof NullType) { throw MondrianResource.instance().NullNotSupported.ex(); } else if (type instanceof DimensionType) { final HierarchyCalc hierarchyCalc = compileHierarchy(exp); return hierarchyToMember(hierarchyCalc); } assert type instanceof MemberType : type; return (MemberCalc) compile(exp); } private MemberCalc hierarchyToMember( HierarchyCalc hierarchyCalc) { final Hierarchy hierarchy = hierarchyCalc.getType().getHierarchy(); if (hierarchy != null) { return new HierarchyCurrentMemberFunDef.FixedCalcImpl( new DummyExp(TypeUtil.toMemberType(hierarchyCalc.getType())), hierarchy); } else { return new HierarchyCurrentMemberFunDef.CalcImpl( new DummyExp(TypeUtil.toMemberType(hierarchyCalc.getType())), hierarchyCalc); } } public LevelCalc compileLevel(Exp exp) { final Type type = exp.getType(); if (type instanceof MemberType) { // --> .Level final MemberCalc memberCalc = compileMember(exp); return new MemberLevelFunDef.CalcImpl( new DummyExp(LevelType.forType(type)), memberCalc); } assert type instanceof LevelType; return (LevelCalc) compile(exp); } public DimensionCalc compileDimension(Exp exp) { final Type type = exp.getType(); if (type instanceof HierarchyType) { final HierarchyCalc hierarchyCalc = compileHierarchy(exp); return new HierarchyDimensionFunDef.CalcImpl( new DummyExp(new DimensionType(type.getDimension())), hierarchyCalc); } assert type instanceof DimensionType : type; return (DimensionCalc) compile(exp); } public HierarchyCalc compileHierarchy(Exp exp) { final Type type = exp.getType(); if (type instanceof DimensionType) { // --> unique Hierarchy else error // Resolve at compile time if constant final Dimension dimension = type.getDimension(); if (dimension != null) { final Hierarchy hierarchy = FunUtil.getDimensionDefaultHierarchy(dimension); if (hierarchy != null) { return (HierarchyCalc) ConstantCalc.constantHierarchy( hierarchy); } else { // SSAS gives error at run time (often as an error in a // cell) but we prefer to give an error at validate time. throw MondrianResource.instance() .CannotImplicitlyConvertDimensionToHierarchy.ex( dimension.getName()); } } final DimensionCalc dimensionCalc = compileDimension(exp); return new DimensionHierarchyCalc( new DummyExp(HierarchyType.forType(type)), dimensionCalc); } if (type instanceof MemberType) { // --> .Hierarchy final MemberCalc memberCalc = compileMember(exp); return new MemberHierarchyFunDef.CalcImpl( new DummyExp(HierarchyType.forType(type)), memberCalc); } if (type instanceof LevelType) { // --> .Hierarchy final LevelCalc levelCalc = compileLevel(exp); return new LevelHierarchyFunDef.CalcImpl( new DummyExp(HierarchyType.forType(type)), levelCalc); } assert type instanceof HierarchyType; return (HierarchyCalc) compile(exp); } public IntegerCalc compileInteger(Exp exp) { final Calc calc = compileScalar(exp, false); final Type type = calc.getType(); if (type instanceof DecimalType && ((DecimalType) type).getScale() == 0) { return (IntegerCalc) calc; } else if (type instanceof NumericType) { if (calc instanceof ConstantCalc) { ConstantCalc constantCalc = (ConstantCalc) calc; return new ConstantCalc( new DecimalType(Integer.MAX_VALUE, 0), constantCalc.evaluateInteger(null)); } else if (calc instanceof DoubleCalc) { final DoubleCalc doubleCalc = (DoubleCalc) calc; return new AbstractIntegerCalc(exp, new Calc[] {doubleCalc}) { public int evaluateInteger(Evaluator evaluator) { return (int) doubleCalc.evaluateDouble(evaluator); } }; } } return (IntegerCalc) calc; } public StringCalc compileString(Exp exp) { return (StringCalc) compileScalar(exp, false); } public DateTimeCalc compileDateTime(Exp exp) { return (DateTimeCalc) compileScalar(exp, false); } public ListCalc compileList(Exp exp) { return compileList(exp, false); } public ListCalc compileList(Exp exp, boolean mutable) { assert exp.getType() instanceof SetType : "must be a set: " + exp; final List resultStyleList; if (mutable) { resultStyleList = ResultStyle.MUTABLELIST_ONLY; } else { resultStyleList = ResultStyle.LIST_ONLY; } Calc calc = compileAs(exp, null, resultStyleList); if (calc instanceof ListCalc) { return (ListCalc) calc; } if (calc == null) { calc = compileAs(exp, null, ResultStyle.ITERABLE_ANY); assert calc != null; } // If expression is an iterator, convert it to a list. Don't check // 'calc instanceof IterCalc' because some generic calcs implement both // ListCalc and IterCalc. if (!(calc instanceof ListCalc)) { return toList((IterCalc) calc); } else { // A set can only be implemented as a list or an iterable. throw Util.newInternal("Cannot convert calc to list: " + calc); } } /** * Converts an iterable over tuples to a list of tuples. * * @param calc Calc * @return List calculation. */ public ListCalc toList(IterCalc calc) { return new IterableListCalc(calc); } public IterCalc compileIter(Exp exp) { IterCalc calc = (IterCalc) compileAs(exp, null, ResultStyle.ITERABLE_ONLY); if (calc == null) { calc = (IterCalc) compileAs(exp, null, ResultStyle.ANY_ONLY); assert calc != null; } return calc; } public BooleanCalc compileBoolean(Exp exp) { final Calc calc = compileScalar(exp, false); if (calc instanceof BooleanCalc) { if (calc instanceof ConstantCalc) { final Object o = calc.evaluate(null); if (!(o instanceof Boolean)) { return ConstantCalc.constantBoolean( CastFunDef.toBoolean(o, new BooleanType())); } } return (BooleanCalc) calc; } else if (calc instanceof DoubleCalc) { final DoubleCalc doubleCalc = (DoubleCalc) calc; return new AbstractBooleanCalc(exp, new Calc[] {doubleCalc}) { public boolean evaluateBoolean(Evaluator evaluator) { return doubleCalc.evaluateDouble(evaluator) != 0; } }; } else if (calc instanceof IntegerCalc) { final IntegerCalc integerCalc = (IntegerCalc) calc; return new AbstractBooleanCalc(exp, new Calc[] {integerCalc}) { public boolean evaluateBoolean(Evaluator evaluator) { return integerCalc.evaluateInteger(evaluator) != 0; } }; } else { return (BooleanCalc) calc; } } public DoubleCalc compileDouble(Exp exp) { final Calc calc = compileScalar(exp, false); if (calc instanceof ConstantCalc && !(calc.evaluate(null) instanceof Double)) { return ConstantCalc.constantDouble( ((ConstantCalc) calc).evaluateDouble(null)); } if (calc instanceof DoubleCalc) { return (DoubleCalc) calc; } if (calc instanceof IntegerCalc) { final IntegerCalc integerCalc = (IntegerCalc) calc; return new AbstractDoubleCalc(exp, new Calc[] {integerCalc}) { public double evaluateDouble(Evaluator evaluator) { final int result = integerCalc.evaluateInteger(evaluator); return (double) result; } }; } throw Util.newInternal("cannot cast " + exp); } public TupleCalc compileTuple(Exp exp) { return (TupleCalc) compile(exp); } public Calc compileScalar(Exp exp, boolean specific) { final Type type = exp.getType(); if (type instanceof MemberType) { MemberCalc calc = compileMember(exp); return memberToScalar(calc); } else if (type instanceof DimensionType) { HierarchyCalc hierarchyCalc = compileHierarchy(exp); return hierarchyToScalar(hierarchyCalc); } else if (type instanceof HierarchyType) { final HierarchyCalc hierarchyCalc = compileHierarchy(exp); return hierarchyToScalar(hierarchyCalc); } else if (type instanceof TupleType) { TupleType tupleType = (TupleType) type; TupleCalc tupleCalc = compileTuple(exp); final TupleValueCalc scalarCalc = new TupleValueCalc( new DummyExp(tupleType.getValueType()), tupleCalc, getEvaluator().mightReturnNullForUnrelatedDimension()); return scalarCalc.optimize(); } else if (type instanceof ScalarType) { if (specific) { if (type instanceof BooleanType) { return compileBoolean(exp); } else if (type instanceof NumericType) { return compileDouble(exp); } else if (type instanceof StringType) { return compileString(exp); } else { return compile(exp); } } else { return compile(exp); } } else { return compile(exp); } } private Calc hierarchyToScalar(HierarchyCalc hierarchyCalc) { final MemberCalc memberCalc = hierarchyToMember(hierarchyCalc); return memberToScalar(memberCalc); } private Calc memberToScalar(MemberCalc memberCalc) { MemberType memberType = (MemberType) memberCalc.getType(); return MemberValueCalc.create( new DummyExp(memberType.getValueType()), new MemberCalc[] {memberCalc}, getEvaluator().mightReturnNullForUnrelatedDimension()); } public ParameterSlot registerParameter(Parameter parameter) { ParameterSlot slot = parameterSlots.get(parameter); if (slot != null) { return slot; } int index = parameterSlots.size(); ParameterSlotImpl slot2 = new ParameterSlotImpl(parameter, index); parameterSlots.put(parameter, slot2); slot2.value = parameter.getValue(); // Compile the expression only AFTER the parameter has been // registered with a slot. Otherwise a cycle is possible. final Type type = parameter.getType(); Exp defaultExp = parameter.getDefaultExp(); Calc calc; if (type instanceof ScalarType) { if (!defaultExp.getType().equals(type)) { defaultExp = new UnresolvedFunCall( "Cast", Syntax.Cast, new Exp[] { defaultExp, Literal.createSymbol( Category.instance.getName( TypeUtil.typeToCategory(type)))}); defaultExp = getValidator().validate(defaultExp, true); } calc = compileScalar(defaultExp, true); } else { calc = compileAs(defaultExp, type, resultStyles); } slot2.setDefaultValueCalc(calc); return slot2; } public List getAcceptableResultStyles() { return resultStyles; } /** * Implementation of {@link ParameterSlot}. */ private static class ParameterSlotImpl implements ParameterSlot { private final Parameter parameter; private final int index; private Calc defaultValueCalc; private Object value; private boolean assigned; private Object cachedDefaultValue; /** * Creates a ParameterSlotImpl. * * @param parameter Parameter * @param index Unique index of the slot */ public ParameterSlotImpl( Parameter parameter, int index) { this.parameter = parameter; this.index = index; } public int getIndex() { return index; } public Calc getDefaultValueCalc() { return defaultValueCalc; } public Parameter getParameter() { return parameter; } /** * Sets a compiled expression to compute the default value of the * parameter. * * @param calc Compiled expression to compute default value of * parameter * * @see #getDefaultValueCalc() */ private void setDefaultValueCalc(Calc calc) { this.defaultValueCalc = calc; } public void setParameterValue(Object value, boolean assigned) { this.value = value; this.assigned = assigned; // make sure caller called convert first assert !(value instanceof List && !(value instanceof TupleList)); assert !(value instanceof MemberExpr); assert !(value instanceof Literal); } public Object getParameterValue() { return value; } public boolean isParameterSet() { return assigned; } public void unsetParameterValue() { this.value = null; this.assigned = false; } public void setCachedDefaultValue(Object value) { this.cachedDefaultValue = value; } public Object getCachedDefaultValue() { return cachedDefaultValue; } } /** * Computes the hierarchy of a dimension. */ private static class DimensionHierarchyCalc extends AbstractHierarchyCalc { private final DimensionCalc dimensionCalc; protected DimensionHierarchyCalc(Exp exp, DimensionCalc dimensionCalc) { super(exp, new Calc[] {dimensionCalc}); this.dimensionCalc = dimensionCalc; } public Hierarchy evaluateHierarchy(Evaluator evaluator) { Dimension dimension = dimensionCalc.evaluateDimension(evaluator); final Hierarchy hierarchy = FunUtil.getDimensionDefaultHierarchy(dimension); if (hierarchy != null) { return hierarchy; } throw FunUtil.newEvalException( MondrianResource.instance() .CannotImplicitlyConvertDimensionToHierarchy.ex( dimension.getName())); } } } // End AbstractExpCompiler.java mondrian-3.11.0.1-R/src/main/mondrian/calc/impl/AbstractHierarchyCalc.java000066400000000000000000000025071261646570300261740ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.calc.impl; import mondrian.calc.Calc; import mondrian.calc.HierarchyCalc; import mondrian.olap.Evaluator; import mondrian.olap.Exp; import mondrian.olap.type.HierarchyType; /** * Abstract implementation of the {@link mondrian.calc.HierarchyCalc} interface. * *

The derived class must * implement the {@link #evaluateHierarchy(mondrian.olap.Evaluator)} method, * and the {@link #evaluate(mondrian.olap.Evaluator)} method will call it. * * @author jhyde * @since Sep 26, 2005 */ public abstract class AbstractHierarchyCalc extends AbstractCalc implements HierarchyCalc { /** * Creates an AbstractHierarchyCalc. * * @param exp Source expression * @param calcs Child compiled expressions */ protected AbstractHierarchyCalc(Exp exp, Calc[] calcs) { super(exp, calcs); assert getType() instanceof HierarchyType; } public Object evaluate(Evaluator evaluator) { return evaluateHierarchy(evaluator); } } // End AbstractHierarchyCalc.java mondrian-3.11.0.1-R/src/main/mondrian/calc/impl/AbstractIntegerCalc.java000066400000000000000000000027061261646570300256540ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.calc.impl; import mondrian.calc.Calc; import mondrian.calc.IntegerCalc; import mondrian.olap.Evaluator; import mondrian.olap.Exp; import mondrian.olap.fun.FunUtil; import mondrian.olap.type.NumericType; /** * Abstract implementation of the {@link mondrian.calc.IntegerCalc} interface. * *

The derived class must * implement the {@link #evaluateInteger(mondrian.olap.Evaluator)} method, * and the {@link #evaluate(mondrian.olap.Evaluator)} method will call it. * * @author jhyde * @since Sep 26, 2005 */ public abstract class AbstractIntegerCalc extends AbstractCalc implements IntegerCalc { /** * Creates an AbstractIntegerCalc. * * @param exp Source expression * @param calcs Child compiled expressions */ protected AbstractIntegerCalc(Exp exp, Calc[] calcs) { super(exp, calcs); assert getType() instanceof NumericType; } public Object evaluate(Evaluator evaluator) { int i = evaluateInteger(evaluator); if (i == FunUtil.IntegerNull) { return null; } else { return i; } } } // End AbstractIntegerCalc.java mondrian-3.11.0.1-R/src/main/mondrian/calc/impl/AbstractIterCalc.java000066400000000000000000000031661261646570300251630ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.calc.impl; import mondrian.calc.*; import mondrian.olap.Evaluator; import mondrian.olap.Exp; import mondrian.olap.type.SetType; /** * Abstract implementation of the {@link mondrian.calc.IterCalc} interface. * *

The derived class must * implement the {@link #evaluateIterable(mondrian.olap.Evaluator)} method, * and the {@link #evaluate(mondrian.olap.Evaluator)} method will call it. * * @see mondrian.calc.impl.AbstractListCalc * * @author jhyde * @since Oct 24, 2008 */ public abstract class AbstractIterCalc extends AbstractCalc implements IterCalc { /** * Creates an abstract implementation of a compiled expression which returns * a {@link TupleIterable}. * * @param exp Expression which was compiled * @param calcs List of child compiled expressions (for dependency * analysis) */ protected AbstractIterCalc(Exp exp, Calc[] calcs) { super(exp, calcs); } public SetType getType() { return (SetType) super.getType(); } public final Object evaluate(Evaluator evaluator) { return evaluateIterable(evaluator); } public ResultStyle getResultStyle() { return ResultStyle.ITERABLE; } public String toString() { return "AbstractIterCalc object"; } } // End AbstractIterCalc.java mondrian-3.11.0.1-R/src/main/mondrian/calc/impl/AbstractLevelCalc.java000066400000000000000000000024331261646570300253230ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.calc.impl; import mondrian.calc.Calc; import mondrian.calc.LevelCalc; import mondrian.olap.Evaluator; import mondrian.olap.Exp; import mondrian.olap.type.LevelType; /** * Abstract implementation of the {@link mondrian.calc.LevelCalc} interface. * *

The derived class must * implement the {@link #evaluateLevel(mondrian.olap.Evaluator)} method, * and the {@link #evaluate(mondrian.olap.Evaluator)} method will call it. * * @author jhyde * @since Sep 26, 2005 */ public abstract class AbstractLevelCalc extends AbstractCalc implements LevelCalc { /** * Creates an AbstractLevelCalc. * * @param exp Source expression * @param calcs Child compiled expressions */ protected AbstractLevelCalc(Exp exp, Calc[] calcs) { super(exp, calcs); assert getType() instanceof LevelType; } public Object evaluate(Evaluator evaluator) { return evaluateLevel(evaluator); } } // End AbstractLevelCalc.java mondrian-3.11.0.1-R/src/main/mondrian/calc/impl/AbstractListCalc.java000066400000000000000000000046261261646570300251750ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.calc.impl; import mondrian.calc.*; import mondrian.olap.Evaluator; import mondrian.olap.Exp; import mondrian.olap.type.SetType; /** * Abstract implementation of the {@link mondrian.calc.ListCalc} interface. * *

The derived class must * implement the {@link #evaluateList(mondrian.olap.Evaluator)} method, * and the {@link #evaluate(mondrian.olap.Evaluator)} method will call it. * * @author jhyde * @since Sep 27, 2005 */ public abstract class AbstractListCalc extends AbstractCalc implements ListCalc { private final boolean mutable; /** * Creates an abstract implementation of a compiled expression which * returns a mutable list of tuples. * * @param exp Expression which was compiled * @param calcs List of child compiled expressions (for dependency * analysis) */ protected AbstractListCalc(Exp exp, Calc[] calcs) { this(exp, calcs, true); } /** * Creates an abstract implementation of a compiled expression which * returns a list. * * @param exp Expression which was compiled * @param calcs List of child compiled expressions (for dependency * analysis) * @param mutable Whether the list is mutable */ protected AbstractListCalc(Exp exp, Calc[] calcs, boolean mutable) { super(exp, calcs); this.mutable = mutable; assert type instanceof SetType : "expecting a set: " + getType(); } public SetType getType() { return (SetType) super.getType(); } public final Object evaluate(Evaluator evaluator) { final TupleList tupleList = evaluateList(evaluator); assert tupleList != null : "null as empty tuple list is deprecated"; return tupleList; } public TupleIterable evaluateIterable(Evaluator evaluator) { return evaluateList(evaluator); } public ResultStyle getResultStyle() { return mutable ? ResultStyle.MUTABLE_LIST : ResultStyle.LIST; } public String toString() { return "AbstractListCalc object"; } } // End AbstractListCalc.java mondrian-3.11.0.1-R/src/main/mondrian/calc/impl/AbstractMemberCalc.java000066400000000000000000000024461261646570300254670ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.calc.impl; import mondrian.calc.Calc; import mondrian.calc.MemberCalc; import mondrian.olap.Evaluator; import mondrian.olap.Exp; import mondrian.olap.type.MemberType; /** * Abstract implementation of the {@link mondrian.calc.MemberCalc} interface. * *

The derived class must * implement the {@link #evaluateMember(mondrian.olap.Evaluator)} method, * and the {@link #evaluate(mondrian.olap.Evaluator)} method will call it. * * @author jhyde * @since Sep 26, 2005 */ public abstract class AbstractMemberCalc extends AbstractCalc implements MemberCalc { /** * Creates an AbstractMemberCalc. * * @param exp Source expression * @param calcs Child compiled expressions */ protected AbstractMemberCalc(Exp exp, Calc[] calcs) { super(exp, calcs); assert getType() instanceof MemberType; } public Object evaluate(Evaluator evaluator) { return evaluateMember(evaluator); } } // End AbstractMemberCalc.java mondrian-3.11.0.1-R/src/main/mondrian/calc/impl/AbstractStringCalc.java000066400000000000000000000023201261646570300255150ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.calc.impl; import mondrian.calc.Calc; import mondrian.calc.StringCalc; import mondrian.olap.Evaluator; import mondrian.olap.Exp; /** * Abstract implementation of the {@link mondrian.calc.StringCalc} interface. * *

The derived class must * implement the {@link #evaluateString(mondrian.olap.Evaluator)} method, * and the {@link #evaluate(mondrian.olap.Evaluator)} method will call it. * * @author jhyde * @since Sep 26, 2005 */ public abstract class AbstractStringCalc extends AbstractCalc implements StringCalc { /** * Creates an AbstractStringCalc. * * @param exp Source expression * @param calcs Child compiled expressions */ protected AbstractStringCalc(Exp exp, Calc[] calcs) { super(exp, calcs); } public Object evaluate(Evaluator evaluator) { return evaluateString(evaluator); } } // End AbstractStringCalc.java mondrian-3.11.0.1-R/src/main/mondrian/calc/impl/AbstractTupleCalc.java000066400000000000000000000023071261646570300253450ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.calc.impl; import mondrian.calc.Calc; import mondrian.calc.TupleCalc; import mondrian.olap.Evaluator; import mondrian.olap.Exp; /** * Abstract implementation of the {@link mondrian.calc.TupleCalc} interface. * *

The derived class must * implement the {@link #evaluateTuple(mondrian.olap.Evaluator)} method, * and the {@link #evaluate(mondrian.olap.Evaluator)} method will call it. * * @author jhyde * @since Sep 27, 2005 */ public abstract class AbstractTupleCalc extends AbstractCalc implements TupleCalc { /** * Creates an AbstractTupleCalc. * * @param exp Source expression * @param calcs Child compiled expressions */ protected AbstractTupleCalc(Exp exp, Calc[] calcs) { super(exp, calcs); } public Object evaluate(Evaluator evaluator) { return evaluateTuple(evaluator); } } // End AbstractTupleCalc.java mondrian-3.11.0.1-R/src/main/mondrian/calc/impl/AbstractTupleCursor.java000066400000000000000000000025231261646570300257600ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.calc.impl; import mondrian.calc.TupleCursor; import mondrian.olap.Evaluator; import mondrian.olap.Member; /** * Abstract implementation of {@link mondrian.calc.TupleIterator}. * *

Derived classes need to implement only {@link #forward()}. * * @author jhyde */ public abstract class AbstractTupleCursor implements TupleCursor { protected final int arity; public AbstractTupleCursor(int arity) { super(); this.arity = arity; } public void setContext(Evaluator evaluator) { evaluator.setContext(current()); } public void currentToArray(Member[] members, int offset) { if (offset == 0) { current().toArray(members); } else { //noinspection SuspiciousSystemArraycopy System.arraycopy(current().toArray(), 0, members, offset, arity); } } public int getArity() { return arity; } public Member member(int column) { return current().get(column); } } // End AbstractTupleCursor.java mondrian-3.11.0.1-R/src/main/mondrian/calc/impl/AbstractTupleIterable.java000066400000000000000000000031701261646570300262310ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.calc.impl; import mondrian.calc.*; import mondrian.olap.Member; import java.util.Iterator; import java.util.List; /** * Abstract implementation of {@link mondrian.calc.TupleIterable}. * *

Derived classes need to implement only {@link #tupleCursor()}, * and this implementation will implement {@link #tupleIterator()} and * {@link #iterator()} by creating a wrapper around that cursor. (The cursor * interface is easier to implement efficiently than the wider iterator * interface.) If you have a more efficient implementation of cursor, override * the {@code tupleIterator} method. * * @author jhyde */ public abstract class AbstractTupleIterable implements TupleIterable { protected final int arity; /** * Creates an AbstractTupleIterable. * * @param arity Arity (number of members per tuple) */ public AbstractTupleIterable(int arity) { this.arity = arity; } public int getArity() { return arity; } public Iterable slice(int column) { return TupleCollections.slice(this, column); } public final Iterator> iterator() { return tupleIterator(); } public TupleIterator tupleIterator() { return TupleCollections.iterator(tupleCursor()); } } // End AbstractTupleIterable.java mondrian-3.11.0.1-R/src/main/mondrian/calc/impl/AbstractTupleIterator.java000066400000000000000000000022571261646570300263000ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.calc.impl; import mondrian.calc.TupleIterator; import mondrian.olap.Member; import java.util.List; /** * Abstract implementation of {@link TupleIterator}. * *

Derived classes need to implement only {@link #forward()}. * {@code forward} must set the {@link #current} * field, and derived classes can use it. * * @author jhyde */ public abstract class AbstractTupleIterator extends AbstractTupleCursor implements TupleIterator { protected boolean hasNext; public AbstractTupleIterator(int arity) { super(arity); } public boolean hasNext() { return hasNext; } public List next() { List o = current(); hasNext = forward(); return o; } public void remove() { throw new UnsupportedOperationException("remove"); } } // End AbstractTupleIterator.java mondrian-3.11.0.1-R/src/main/mondrian/calc/impl/AbstractTupleList.java000066400000000000000000000107661261646570300254260ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.calc.impl; import mondrian.calc.*; import mondrian.olap.Evaluator; import mondrian.olap.Member; import java.util.*; /** * Abstract implementation of {@link TupleList}. * * @author jhyde */ public abstract class AbstractTupleList extends AbstractList> implements RandomAccess, Cloneable, TupleList { protected final int arity; protected boolean mutable = true; public AbstractTupleList(int arity) { this.arity = arity; } public int getArity() { return arity; } protected abstract TupleIterator tupleIteratorInternal(); @Override public abstract TupleList subList(int fromIndex, int toIndex); public TupleList fix() { return new DelegatingTupleList( arity, new ArrayList>(this)); } @Override public final Iterator> iterator() { return tupleIteratorInternal(); } public final TupleIterator tupleIterator() { return tupleIteratorInternal(); } /** * Creates a {@link TupleCursor} over this list. * *

Any implementation of {@link TupleList} must implement all three * methods {@link #iterator()}, {@link #tupleIterator()} and * {@code tupleCursor}. The default implementation returns the same * for all three, but a derived classes can override this method to create a * more efficient implementation that implements cursor but not iterator. * * @return A cursor over this list */ public TupleCursor tupleCursor() { return tupleIteratorInternal(); } public void addCurrent(TupleCursor tupleIter) { add(tupleIter.current()); } public Member get(int slice, int index) { return get(index).get(slice); } /** * Implementation of {@link mondrian.calc.TupleIterator} for * {@link ArrayTupleList}. * Based upon AbstractList.Itr, but with concurrent modification checking * removed. */ protected class AbstractTupleListIterator implements TupleIterator { /** * Index of element to be returned by subsequent call to next. */ int cursor = 0; /** * Index of element returned by most recent call to next or * previous. Reset to -1 if this element is deleted by a call * to remove. */ int lastRet = -1; public boolean hasNext() { return cursor != size(); } public List next() { try { List next = get(cursor); lastRet = cursor++; return next; } catch (IndexOutOfBoundsException e) { throw new NoSuchElementException(); } } public boolean forward() { if (cursor == size()) { return false; } lastRet = cursor++; return true; } public List current() { return get(lastRet); } public void currentToArray(Member[] members, int offset) { final List current = current(); if (offset == 0) { current.toArray(members); } else { //noinspection SuspiciousSystemArraycopy System.arraycopy(current.toArray(), 0, members, offset, arity); } } public int getArity() { return AbstractTupleList.this.getArity(); } public void remove() { assert mutable; if (lastRet == -1) { throw new IllegalStateException(); } try { AbstractTupleList.this.remove(lastRet); if (lastRet < cursor) { cursor--; } lastRet = -1; } catch (IndexOutOfBoundsException e) { throw new ConcurrentModificationException(); } } public void setContext(Evaluator evaluator) { evaluator.setContext(current()); } public Member member(int column) { return get(lastRet).get(column); } } } // End AbstractTupleList.java mondrian-3.11.0.1-R/src/main/mondrian/calc/impl/AbstractVoidCalc.java000066400000000000000000000022761261646570300251620ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.calc.impl; import mondrian.calc.Calc; import mondrian.calc.VoidCalc; import mondrian.olap.Evaluator; import mondrian.olap.Exp; /** * Abstract implementation of the {@link mondrian.calc.VoidCalc} interface. * *

The derived class must * implement the {@link #evaluateVoid(mondrian.olap.Evaluator)} method, * and the {@link #evaluate(mondrian.olap.Evaluator)} method will call it * and return null. * * @author jhyde * @since Sep 29, 2005 */ public class AbstractVoidCalc extends GenericCalc implements VoidCalc { private final Calc[] calcs; protected AbstractVoidCalc(Exp exp, Calc[] calcs) { super(exp); this.calcs = calcs; } public Object evaluate(Evaluator evaluator) { evaluateVoid(evaluator); return null; } public Calc[] getCalcs() { return calcs; } } // End AbstractVoidCalc.java mondrian-3.11.0.1-R/src/main/mondrian/calc/impl/ArrayTupleList.java000066400000000000000000000163641261646570300247410ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.calc.impl; import mondrian.calc.*; import mondrian.olap.*; import java.util.*; /** * Implementation of {@link TupleList} that stores tuples end-to-end in an * array. * * @author jhyde */ public class ArrayTupleList extends AbstractEndToEndTupleList { private transient Member[] objectData; private int size; /** * Creates an empty ArrayTupleList with an initial capacity of 10 tuples. * * @param arity Arity */ public ArrayTupleList(int arity) { this(arity, 10 * arity); assert arity > 1 : "Probably better to use a UnaryTupleList"; } /** * Creates an empty ArrayTupleList. * * @param arity Arity * @param initialCapacity Initial capacity */ public ArrayTupleList(int arity, int initialCapacity) { this(arity, new Member[initialCapacity * arity], 0); } private ArrayTupleList(int arity, Member[] members, int size) { super(arity); assert members.length % arity == 0; this.objectData = members; this.size = size; } @Override protected List backingList() { return new AbstractList() { @Override public Member get(int index) { return objectData[index]; } @Override public int size() { return size * arity; } }; } @Override public Member get(int slice, int index) { return objectData[index * arity + slice]; } @Override public List get(int index) { final int startIndex = index * arity; final List list = new AbstractList() { public Member get(int index) { return objectData[startIndex + index]; } public int size() { return arity; } }; if (mutable) { return Util.flatList(list); } return list; } @Override public List set(int index, List element) { assert mutable; for (int i = 0, startIndex = index * arity; i < arity; i++) { objectData[startIndex + i] = element.get(i); } return null; // not compliant with List contract } @Override public void addCurrent(TupleCursor tupleIter) { assert mutable; int n = size * arity; ensureCapacity(n + arity); tupleIter.currentToArray(objectData, n); ++size; } public int size() { return size; } @Override public boolean add(List members) { assert mutable; if (members.size() != arity) { throw new IllegalArgumentException( "Tuple length does not match arity"); } int n = size * arity; ensureCapacity(n + arity); for (int i = 0; i < members.size(); i++) { objectData[n++] = members.get(i); } ++size; return true; } @Override public void add(int index, List members) { assert mutable; if (members.size() != arity) { throw new IllegalArgumentException( "Tuple length does not match arity"); } int n = index * arity; ensureCapacity((size + 1) + arity); System.arraycopy(objectData, n, objectData, n + arity, arity); for (Member member : members) { objectData[n++] = member; } ++size; } @Override public boolean addAll(int index, Collection> c) { assert mutable; final int size1 = c.size(); ensureCapacity(size * arity + size1 * arity); int n = index * arity; System.arraycopy( objectData, n, objectData, n + size1 * arity, size * arity - n); for (List members : c) { for (Member member : members) { objectData[n++] = member; } } size += size1; return size1 > 0; } public void addTuple(Member... members) { assert mutable; if (members.length != arity) { throw new IllegalArgumentException( "Tuple length does not match arity"); } ensureCapacity(size * arity + arity); System.arraycopy(members, 0, objectData, size * arity, arity); ++size; } @Override public List remove(int index) { assert mutable; final int n = index * arity; // Strict compliance with List API: // List previous = get(index); System.arraycopy(objectData, n + arity, objectData, n, arity); --size; return null; // previous; } public List slice(final int column) { if (column < 0 || column >= arity) { throw new IllegalArgumentException(); } return new AbstractList() { @Override public Member get(int index) { return objectData[index * arity + column]; } @Override public int size() { return size; } }; } public TupleList cloneList(int capacity) { if (capacity < 0) { // copy of this list with the same contents return new ArrayTupleList(arity, objectData.clone(), size()); } else { // empty copy of this list with given capacity return new ArrayTupleList(arity, capacity); } } public TupleIterator tupleIteratorInternal() { // Improve the base class implementation of setContext. It is cheaper // to call evaluator.setContext several times than to create a // temporary list or array. return new AbstractTupleListIterator() { public void setContext(Evaluator evaluator) { for (int i = 0, x = lastRet * arity; i < arity; i++) { evaluator.setContext(objectData[x + i]); } } public Member member(int column) { return objectData[lastRet * arity + column]; } public void currentToArray(Member[] members, int offset) { System.arraycopy( objectData, lastRet * arity, members, offset, arity); } }; } private void ensureCapacity(int minCapacity) { int oldCapacity = objectData.length; if (minCapacity > oldCapacity) { int newCapacity = (oldCapacity * 3) / 2 + 1; if (newCapacity < minCapacity) { newCapacity = minCapacity; } // Up to next multiple of arity. final int rem = newCapacity % arity; newCapacity += (arity - rem); objectData = Util.copyOf(objectData, newCapacity); } } } // End ArrayTupleList.java mondrian-3.11.0.1-R/src/main/mondrian/calc/impl/BetterExpCompiler.java000066400000000000000000000050311261646570300253770ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.calc.impl; import mondrian.calc.*; import mondrian.olap.*; import mondrian.olap.type.*; import java.util.List; /** * Enhanced expression compiler. It can generate code to convert between * scalar types. * * @author jhyde * @since Sep 29, 2005 */ public class BetterExpCompiler extends AbstractExpCompiler { public BetterExpCompiler(Evaluator evaluator, Validator validator) { super(evaluator, validator); } public BetterExpCompiler( Evaluator evaluator, Validator validator, List resultStyles) { super(evaluator, validator, resultStyles); } public TupleCalc compileTuple(Exp exp) { final Calc calc = compile(exp); final Type type = exp.getType(); if (type instanceof TupleType) { assert calc instanceof TupleCalc; return (TupleCalc) calc; } else if (type instanceof MemberType) { assert calc instanceof MemberCalc; final MemberCalc memberCalc = (MemberCalc) calc; return new AbstractTupleCalc(exp, new Calc[] {memberCalc}) { public Member[] evaluateTuple(Evaluator evaluator) { return new Member[] {memberCalc.evaluateMember(evaluator)}; } }; } else { throw Util.newInternal("cannot cast " + exp); } } public ListCalc compileList(Exp exp, boolean mutable) { final ListCalc listCalc = super.compileList(exp, mutable); if (mutable && listCalc.getResultStyle() == ResultStyle.LIST) { // Wrap the expression in an expression which creates a mutable // copy. return new CopyListCalc(listCalc); } return listCalc; } private static class CopyListCalc extends AbstractListCalc { private final ListCalc listCalc; public CopyListCalc(ListCalc listCalc) { super(new DummyExp(listCalc.getType()), new Calc[]{listCalc}); this.listCalc = listCalc; } public TupleList evaluateList(Evaluator evaluator) { TupleList list = listCalc.evaluateList(evaluator); return list.cloneList(-1); } } } // End BetterExpCompiler.java mondrian-3.11.0.1-R/src/main/mondrian/calc/impl/CacheCalc.java000066400000000000000000000016451261646570300235770ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.calc.impl; import mondrian.calc.Calc; import mondrian.olap.*; /** * Calculation which retrieves the value of an underlying calculation * from cache. * * @author jhyde * @since Oct 10, 2005 */ public class CacheCalc extends GenericCalc { private final ExpCacheDescriptor key; public CacheCalc(Exp exp, ExpCacheDescriptor key) { super(exp); this.key = key; } public Object evaluate(Evaluator evaluator) { return evaluator.getCachedResult(key); } public Calc[] getCalcs() { return new Calc[] {key.getCalc()}; } } // End CacheCalc.java mondrian-3.11.0.1-R/src/main/mondrian/calc/impl/ConstantCalc.java000066400000000000000000000124071261646570300243630ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.calc.impl; import mondrian.calc.*; import mondrian.olap.*; import mondrian.olap.fun.FunUtil; import mondrian.olap.type.*; import mondrian.olap.type.DimensionType; import mondrian.olap.type.LevelType; import java.util.Map; /** * Calculator which always returns the same value. * * @author jhyde * @since Sep 27, 2005 */ public class ConstantCalc extends GenericCalc { private final Object o; private final int i; private final double d; public ConstantCalc(Type type, Object o) { super(new DummyExp(type)); this.o = o; this.i = initializeInteger(o); this.d = initializeDouble(o); } @Override protected String getName() { return "Literal"; } public ResultStyle getResultStyle() { return o == null ? ResultStyle.VALUE : ResultStyle.VALUE_NOT_NULL; } private double initializeDouble(Object o) { double value; if (o instanceof Number) { value = ((Number) o).doubleValue(); } else { if (o == null) { value = FunUtil.DoubleNull; } else { value = 0; } } return value; } private int initializeInteger(Object o) { int value; if (o instanceof Number) { value = ((Number) o).intValue(); } else { if (o == null) { value = FunUtil.IntegerNull; } else { value = 0; } } return value; } @Override public void collectArguments(Map arguments) { super.collectArguments(arguments); arguments.put("value", o); } public Object evaluate(Evaluator evaluator) { return o; } public int evaluateInteger(Evaluator evaluator) { return i; } public double evaluateDouble(Evaluator evaluator) { return d; } public boolean dependsOn(Hierarchy hierarchy) { // A constant -- including a catalog element -- will evaluate to the // same result regardless of the evaluation context. For example, the // member [Gender].[M] does not 'depend on' the [Gender] dimension. return false; } public Calc[] getCalcs() { return new Calc[0]; } /** * Creates an expression which evaluates to a given integer. * * @param i Integer value * @return Constant integer expression */ public static ConstantCalc constantInteger(int i) { return new ConstantCalc(new DecimalType(Integer.MAX_VALUE, 0), i); } /** * Creates an expression which evaluates to a given double. * * @param v Double value * @return Constant double expression */ public static DoubleCalc constantDouble(double v) { return new ConstantCalc(new NumericType(), v); } /** * Creates an expression which evaluates to a given string. * * @param s String value * @return Constant string expression */ public static StringCalc constantString(String s) { return new ConstantCalc(new StringType(), s); } /** * Creates an expression which evaluates to a given boolean. * * @param b Boolean value * @return Constant boolean expression */ public static BooleanCalc constantBoolean(boolean b) { return new ConstantCalc(new BooleanType(), b); } /** * Creates an expression which evaluates to null. * * @param type Type * @return Constant null expression */ public static ConstantCalc constantNull(Type type) { return new ConstantCalc(type, null); } /** * Creates an expression which evaluates to a given member. * * @param member Member * @return Constant member expression */ public static Calc constantMember(Member member) { return new ConstantCalc( MemberType.forMember(member), member); } /** * Creates an expression which evaluates to a given level. * * @param level Level * @return Constant level expression */ public static Calc constantLevel(Level level) { return new ConstantCalc( LevelType.forLevel(level), level); } /** * Creates an expression which evaluates to a given hierarchy. * * @param hierarchy Hierarchy * @return Constant hierarchy expression */ public static Calc constantHierarchy(Hierarchy hierarchy) { return new ConstantCalc( HierarchyType.forHierarchy(hierarchy), hierarchy); } /** * Creates an expression which evaluates to a given dimension. * * @param dimension Dimension * @return Constant dimension expression */ public static Calc constantDimension(Dimension dimension) { return new ConstantCalc( DimensionType.forDimension(dimension), dimension); } } // End ConstantCalc.java mondrian-3.11.0.1-R/src/main/mondrian/calc/impl/DelegatingExpCompiler.java000066400000000000000000000144621261646570300262250ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.calc.impl; import mondrian.calc.*; import mondrian.mdx.MdxVisitor; import mondrian.olap.*; import mondrian.olap.type.Type; import java.io.PrintWriter; import java.util.List; /** * Abstract implementation of {@link mondrian.calc.ExpCompiler} * * @author jhyde * @since Jan 2, 2006 */ public class DelegatingExpCompiler implements ExpCompiler { private final ExpCompiler parent; protected DelegatingExpCompiler(ExpCompiler parent) { this.parent = parent; } /** * Hook for post-processing. * * @param exp Expression to compile * @param calc Calculator created by compiler * @param mutable Whether the result is mutuable * @return Calculator after post-processing */ protected Calc afterCompile(Exp exp, Calc calc, boolean mutable) { return calc; } public Evaluator getEvaluator() { return parent.getEvaluator(); } public Validator getValidator() { return parent.getValidator(); } public Calc compile(Exp exp) { final Calc calc = parent.compile(wrap(exp)); return afterCompile(exp, calc, false); } public Calc compileAs( Exp exp, Type resultType, List preferredResultTypes) { return parent.compileAs(wrap(exp), resultType, preferredResultTypes); } public MemberCalc compileMember(Exp exp) { MemberCalc calc = parent.compileMember(wrap(exp)); return (MemberCalc) afterCompile(exp, calc, false); } public LevelCalc compileLevel(Exp exp) { final LevelCalc calc = parent.compileLevel(wrap(exp)); return (LevelCalc) afterCompile(exp, calc, false); } public DimensionCalc compileDimension(Exp exp) { final DimensionCalc calc = parent.compileDimension(wrap(exp)); return (DimensionCalc) afterCompile(exp, calc, false); } public HierarchyCalc compileHierarchy(Exp exp) { final HierarchyCalc calc = parent.compileHierarchy(wrap(exp)); return (HierarchyCalc) afterCompile(exp, calc, false); } public IntegerCalc compileInteger(Exp exp) { final IntegerCalc calc = parent.compileInteger(wrap(exp)); return (IntegerCalc) afterCompile(exp, calc, false); } public StringCalc compileString(Exp exp) { final StringCalc calc = parent.compileString(wrap(exp)); return (StringCalc) afterCompile(exp, calc, false); } public DateTimeCalc compileDateTime(Exp exp) { final DateTimeCalc calc = parent.compileDateTime(wrap(exp)); return (DateTimeCalc) afterCompile(exp, calc, false); } public final ListCalc compileList(Exp exp) { return compileList(exp, false); } public ListCalc compileList(Exp exp, boolean mutable) { final ListCalc calc = parent.compileList(wrap(exp), mutable); return (ListCalc) afterCompile(exp, calc, mutable); } public IterCalc compileIter(Exp exp) { final IterCalc calc = parent.compileIter(wrap(exp)); return (IterCalc) afterCompile(exp, calc, false); } public BooleanCalc compileBoolean(Exp exp) { final BooleanCalc calc = parent.compileBoolean(wrap(exp)); return (BooleanCalc) afterCompile(exp, calc, false); } public DoubleCalc compileDouble(Exp exp) { final DoubleCalc calc = parent.compileDouble(wrap(exp)); return (DoubleCalc) afterCompile(exp, calc, false); } public TupleCalc compileTuple(Exp exp) { final TupleCalc calc = parent.compileTuple(wrap(exp)); return (TupleCalc) afterCompile(exp, calc, false); } public Calc compileScalar(Exp exp, boolean scalar) { final Calc calc = parent.compileScalar(wrap(exp), scalar); return afterCompile(exp, calc, false); } public ParameterSlot registerParameter(Parameter parameter) { return parent.registerParameter(parameter); } public List getAcceptableResultStyles() { return parent.getAcceptableResultStyles(); } /** * Wrapping an expression ensures that when it is visited, it calls * back to this compiler rather than our parent (wrapped) compiler. * *

All methods that pass an expression to the delegate compiler should * wrap expressions in this way. Hopefully the delegate compiler doesn't * use {@code instanceof}; it should be using the visitor pattern instead. * *

If we didn't do this, the decorator would get forgotten at the first * level of recursion. It's not pretty, and I thought about other ways * of combining Visitor + Decorator. For instance, I tried replacing * {@link #afterCompile(mondrian.olap.Exp, mondrian.calc.Calc, boolean)} * with a callback (Strategy), but the exit points in ExpCompiler not * clear because there are so many methods. * * @param e Expression to be wrapped * @return wrapper expression */ private Exp wrap(Exp e) { return new WrapExp(e, this); } /** * See {@link mondrian.calc.impl.DelegatingExpCompiler#wrap}. */ private static class WrapExp implements Exp { private final Exp e; private final ExpCompiler wrappingCompiler; WrapExp( Exp e, ExpCompiler wrappingCompiler) { this.e = e; this.wrappingCompiler = wrappingCompiler; } public Exp clone() { throw new UnsupportedOperationException(); } public int getCategory() { return e.getCategory(); } public Type getType() { return e.getType(); } public void unparse(PrintWriter pw) { e.unparse(pw); } public Exp accept(Validator validator) { return e.accept(validator); } public Calc accept(ExpCompiler compiler) { return e.accept(wrappingCompiler); } public Object accept(MdxVisitor visitor) { return e.accept(visitor); } } } // End DelegatingExpCompiler.java mondrian-3.11.0.1-R/src/main/mondrian/calc/impl/DelegatingTupleList.java000066400000000000000000000125211261646570300257150ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.calc.impl; import mondrian.calc.TupleIterator; import mondrian.calc.TupleList; import mondrian.olap.Member; import mondrian.olap.Util; import java.util.*; /** * Implementation of {@link mondrian.calc.TupleList} based on a list of * {@code List} tuples. * * @author jhyde */ public class DelegatingTupleList extends AbstractTupleList { private final List> list; /** * Creates a DelegatingTupleList. * * @param arity Arity * @param list Backing list */ public DelegatingTupleList(int arity, List> list) { super(arity); this.list = list; assert list.isEmpty() || (list.get(0) instanceof List && (list.get(0).isEmpty() || list.get(0).get(0) == null || list.get(0).get(0) instanceof Member)) : "sanity check failed: " + list; } @Override protected TupleIterator tupleIteratorInternal() { return new AbstractTupleListIterator(); } @Override public TupleList subList(int fromIndex, int toIndex) { return new DelegatingTupleList(arity, list.subList(fromIndex, toIndex)); } @Override public List get(int index) { return list.get(index); } @Override public int size() { return list.size(); } public List slice(final int column) { return new AbstractList() { @Override public Member get(int index) { return list.get(index).get(column); } @Override public int size() { return list.size(); } public Member set(int index, Member element) { List subList = list.get(index); if (subList.size() == 1) { // The sub list is probably a singleton list. // calling set() on it will fail. We have to // create a new singleton list. return list.set(index, Collections.singletonList(element)) .get(0); } return subList.set(column, element); }; }; } public TupleList cloneList(int capacity) { return new DelegatingTupleList( arity, capacity < 0 ? new ArrayList>(list) : new ArrayList>(capacity)); } @Override public List set(int index, List element) { return list.set(index, element); } @Override public void add(int index, List element) { list.add(index, element); } public void addTuple(Member... members) { list.add(Util.flatList(members)); } public TupleList project(final int[] destIndices) { return new DelegatingTupleList( destIndices.length, new AbstractList>() { public List get(final int index) { return new AbstractList() { public Member get(int column) { return list.get(index).get(destIndices[column]); } public int size() { return destIndices.length; } public Member set(int column, Member element) { return list.get(index).set(index, element); }; }; } public List set(int index, List element) { return list.set(index, element); }; public int size() { return list.size(); } } ); } public TupleList withPositionCallback( final PositionCallback positionCallback) { return new DelegatingTupleList( arity, new AbstractList>() { @Override public List get(int index) { positionCallback.onPosition(index); return list.get(index); } @Override public int size() { return list.size(); } @Override public List set(int index, List element) { positionCallback.onPosition(index); return list.set(index, element); } @Override public void add(int index, List element) { positionCallback.onPosition(index); list.add(index, element); } @Override public List remove(int index) { positionCallback.onPosition(index); return list.remove(index); } } ); } } // End DelegatingTupleList.java mondrian-3.11.0.1-R/src/main/mondrian/calc/impl/GenericCalc.java000066400000000000000000000131631261646570300241460ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.calc.impl; import mondrian.calc.*; import mondrian.olap.*; import mondrian.olap.fun.FunUtil; import java.util.Date; /** * Adapter which computes a scalar or tuple expression and converts it to any * required type. * * @see mondrian.calc.impl.GenericIterCalc * * @author jhyde * @since Sep 26, 2005 */ public abstract class GenericCalc extends AbstractCalc implements TupleCalc, StringCalc, IntegerCalc, DoubleCalc, BooleanCalc, DateTimeCalc, VoidCalc, MemberCalc, LevelCalc, HierarchyCalc, DimensionCalc { /** * Creates a GenericCalc without specifying child calculated expressions. * *

Subclass should override {@link #getCalcs()}. * * @param exp Source expression */ protected GenericCalc(Exp exp) { super(exp, null); } /** * Creates an GenericCalc. * * @param exp Source expression * @param calcs Child compiled expressions */ protected GenericCalc(Exp exp, Calc[] calcs) { super(exp, calcs); } public Member[] evaluateTuple(Evaluator evaluator) { return (Member[]) evaluate(evaluator); } private String msg(TypeEnum expectedType, Object o) { final TypeEnum actualType = actualType(o); return "Expected value of type " + expectedType + "; got value '" + o + "' (" + (actualType == null ? o.getClass() : actualType) + ")"; } private static TypeEnum actualType(Object o) { if (o == null) { return TypeEnum.NULL; } else if (o instanceof String) { return TypeEnum.STRING; } else if (o instanceof Boolean) { return TypeEnum.BOOLEAN; } else if (o instanceof Number) { return TypeEnum.NUMERIC; } else if (o instanceof Date) { return TypeEnum.DATETIME; } else if (o instanceof Member) { return TypeEnum.MEMBER; } else if (o instanceof Level) { return TypeEnum.LEVEL; } else if (o instanceof Hierarchy) { return TypeEnum.HIERARCHY; } else if (o instanceof Dimension) { return TypeEnum.DIMENSION; } else { return null; } } public String evaluateString(Evaluator evaluator) { final Object o = evaluate(evaluator); try { return (String) o; } catch (ClassCastException e) { throw evaluator.newEvalException(null, msg(TypeEnum.STRING, o)); } } public int evaluateInteger(Evaluator evaluator) { Object o = evaluate(evaluator); try { final Number number = (Number) o; return number == null ? FunUtil.IntegerNull : number.intValue(); } catch (ClassCastException e) { throw evaluator.newEvalException(null, msg(TypeEnum.NUMERIC, o)); } } public double evaluateDouble(Evaluator evaluator) { final Object o = evaluate(evaluator); try { final Number number = (Number) o; return numberToDouble(number); } catch (ClassCastException e) { throw evaluator.newEvalException(null, msg(TypeEnum.NUMERIC, o)); } } public static double numberToDouble(Number number) { return number == null ? FunUtil.DoubleNull : number.doubleValue(); } public boolean evaluateBoolean(Evaluator evaluator) { final Object o = evaluate(evaluator); try { return (Boolean) o; } catch (ClassCastException e) { throw evaluator.newEvalException(null, msg(TypeEnum.BOOLEAN, o)); } } public Date evaluateDateTime(Evaluator evaluator) { final Object o = evaluate(evaluator); try { return (Date) o; } catch (ClassCastException e) { throw evaluator.newEvalException(null, msg(TypeEnum.DATETIME, o)); } } public void evaluateVoid(Evaluator evaluator) { final Object result = evaluate(evaluator); assert result == null; } public Member evaluateMember(Evaluator evaluator) { final Object o = evaluate(evaluator); try { return (Member) o; } catch (ClassCastException e) { throw evaluator.newEvalException(null, msg(TypeEnum.MEMBER, o)); } } public Level evaluateLevel(Evaluator evaluator) { final Object o = evaluate(evaluator); try { return (Level) o; } catch (ClassCastException e) { throw evaluator.newEvalException(null, msg(TypeEnum.LEVEL, o)); } } public Hierarchy evaluateHierarchy(Evaluator evaluator) { final Object o = evaluate(evaluator); try { return (Hierarchy) o; } catch (ClassCastException e) { throw evaluator.newEvalException(null, msg(TypeEnum.HIERARCHY, o)); } } public Dimension evaluateDimension(Evaluator evaluator) { final Object o = evaluate(evaluator); try { return (Dimension) o; } catch (ClassCastException e) { throw evaluator.newEvalException(null, msg(TypeEnum.DIMENSION, o)); } } private enum TypeEnum { NULL, BOOLEAN, STRING, NUMERIC, DATETIME, MEMBER, LEVEL, HIERARCHY, DIMENSION } } // End GenericCalc.java mondrian-3.11.0.1-R/src/main/mondrian/calc/impl/GenericIterCalc.java000066400000000000000000000037631261646570300247770ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.calc.impl; import mondrian.calc.*; import mondrian.olap.Evaluator; import mondrian.olap.Exp; import mondrian.olap.type.SetType; /** * Adapter which computes a set expression and converts it to any list or * iterable type. * * @author jhyde * @since Nov 7, 2008 */ public abstract class GenericIterCalc extends AbstractCalc implements ListCalc, IterCalc { /** * Creates a GenericIterCalc without specifying child calculated * expressions. * *

Subclass should override {@link #getCalcs()}. * * @param exp Source expression */ protected GenericIterCalc(Exp exp) { super(exp, null); } /** * Creates an GenericIterCalc. * * @param exp Source expression * @param calcs Child compiled expressions */ protected GenericIterCalc(Exp exp, Calc[] calcs) { super(exp, calcs); } public SetType getType() { return (SetType) type; } public TupleList evaluateList(Evaluator evaluator) { Object o = evaluate(evaluator); if (o instanceof TupleList) { return (TupleList) o; } else { // Iterable final TupleIterable iterable = (TupleIterable) o; TupleList tupleList = TupleCollections.createList(iterable.getArity()); TupleCursor cursor = iterable.tupleCursor(); while (cursor.forward()) { tupleList.addCurrent(cursor); } return tupleList; } } public TupleIterable evaluateIterable(Evaluator evaluator) { Object o = evaluate(evaluator); return (TupleIterable) o; } } // End GenericIterCalc.java mondrian-3.11.0.1-R/src/main/mondrian/calc/impl/IterableListCalc.java000066400000000000000000000031121261646570300251460ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.calc.impl; import mondrian.calc.*; import mondrian.olap.Evaluator; /** * Adapter that converts a {@link mondrian.calc.IterCalc} to a * {@link mondrian.calc.ListCalc}. * * @author jhyde * @since Oct 23, 2008 */ public class IterableListCalc extends AbstractListCalc { private final IterCalc iterCalc; /** * Creates an IterableListCalc. * * @param iterCalc Calculation that returns an iterable. */ public IterableListCalc(IterCalc iterCalc) { super(new DummyExp(iterCalc.getType()), new Calc[] {iterCalc}); this.iterCalc = iterCalc; } public TupleList evaluateList(Evaluator evaluator) { // A TupleIterCalc is allowed to return a list. If so, save the copy. final TupleIterable iterable = iterCalc.evaluateIterable(evaluator); if (iterable instanceof TupleList) { return (TupleList) iterable; } final TupleList list = TupleCollections.createList(iterable.getArity()); final TupleCursor tupleCursor = iterable.tupleCursor(); while (tupleCursor.forward()) { // REVIEW: Worth creating TupleList.addAll(TupleCursor)? list.addCurrent(tupleCursor); } return list; } } // End IterableListCalc.java mondrian-3.11.0.1-R/src/main/mondrian/calc/impl/ListTupleList.java000066400000000000000000000070201261646570300245630ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.calc.impl; import mondrian.calc.TupleIterator; import mondrian.calc.TupleList; import mondrian.olap.Member; import mondrian.olap.Util; import java.util.*; /** * Implementation of {@link mondrian.calc.TupleList} that stores tuples * end-to-end in a backing list. * *

 * l1: {A,B,C},{D,E,F}
 * l2: {a,b},{c,d},{e,f}
 *
 * externally looks like:
 *  [] <- {A,B,C,a,b}
 *  [] <- {A,B,C,c,d}
 *  [] <- {A,B,C,e,f}
 *  [] <- {D,E,F,a,b}
 *  [] <- {D,E,F,c,d}
 *  [] <- {D,E,F,e,d}
 *
 * but internally is:
 *  A,B,C,a,b,A,B,C,c,d,A,B,C,e,f,D,E,F,a,b,D,E,F,c,d,D,E,F,e,d
 * 
* * @author jhyde */ public class ListTupleList extends AbstractEndToEndTupleList { private final List list; /** * Creates a ListTupleList. * * @param arity Arity * @param list Backing list */ public ListTupleList(int arity, List list) { super(arity); this.list = list; } protected List backingList() { return list; } public Member get(int slice, int index) { return list.get(index * arity + slice); } public List get(int index) { final int startIndex = index * arity; final List list1 = new AbstractList() { public Member get(int index) { return list.get(startIndex + index); } public int size() { return arity; } }; if (mutable) { return Util.flatList(list1); } return list1; } public void add(int index, List element) { assert mutable; list.addAll(index * arity, element); } public void addTuple(Member... members) { assert mutable; list.addAll(Arrays.asList(members)); } @Override public void clear() { assert mutable; list.clear(); } @Override public List remove(int index) { assert mutable; for (int i = 0, n = index * arity; i < arity; i++) { list.remove(n); } return null; // breach of List contract } @Override protected void removeRange(int fromIndex, int toIndex) { assert mutable; list.subList(fromIndex * arity, toIndex * arity).clear(); } public int size() { return list.size() / arity; } public List slice(final int column) { if (column < 0 || column >= arity) { throw new IllegalArgumentException(); } return new AbstractList() { @Override public Member get(int index) { return ListTupleList.this.get(column, index); } @Override public int size() { return ListTupleList.this.size(); } }; } public TupleList cloneList(int capacity) { return new ListTupleList( arity, capacity < 0 ? new ArrayList(list) : new ArrayList(capacity * arity)); } public TupleIterator tupleIteratorInternal() { return new AbstractTupleListIterator(); } } // End ListTupleList.java mondrian-3.11.0.1-R/src/main/mondrian/calc/impl/MemberArrayValueCalc.java000066400000000000000000000073601261646570300257770ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.calc.impl; import mondrian.calc.Calc; import mondrian.calc.MemberCalc; import mondrian.olap.*; import mondrian.olap.type.ScalarType; import mondrian.olap.type.Type; /** * Expression which evaluates a few member expressions, * sets the dimensional context to the result of those expressions, * then yields the value of the current measure in the current * dimensional context. * *

The evaluator's context is preserved. * *

Note that a MemberValueCalc with 0 member expressions is equivalent to a * {@link ValueCalc}; see also {@link TupleValueCalc}. * * @author jhyde */ public class MemberArrayValueCalc extends GenericCalc { private final MemberCalc[] memberCalcs; private final Member[] members; private final boolean nullCheck; /** * Creates a MemberArrayValueCalc. * *

Clients outside this package should use the * {@link MemberValueCalc#create(mondrian.olap.Exp, * mondrian.calc.MemberCalc[], boolean)} * factory method. * * @param exp Expression * @param memberCalcs Array of compiled expressions * @param nullCheck Whether to check for null values due to non-joining * dimensions in a virtual cube */ MemberArrayValueCalc(Exp exp, MemberCalc[] memberCalcs, boolean nullCheck) { super(exp); this.nullCheck = nullCheck; final Type type = exp.getType(); assert type instanceof ScalarType : exp; this.memberCalcs = memberCalcs; this.members = new Member[memberCalcs.length]; } public Object evaluate(Evaluator evaluator) { final int savepoint = evaluator.savepoint(); try { for (int i = 0; i < memberCalcs.length; i++) { MemberCalc memberCalc = memberCalcs[i]; final Member member = memberCalc.evaluateMember(evaluator); if (member == null || member.isNull()) { return null; } evaluator.setContext(member); members[i] = member; } if (nullCheck && evaluator.needToReturnNullForUnrelatedDimension(members)) { return null; } final Object result = evaluator.evaluateCurrent(); return result; } finally { evaluator.restore(savepoint); } } public Calc[] getCalcs() { return memberCalcs; } public boolean dependsOn(Hierarchy hierarchy) { if (super.dependsOn(hierarchy)) { return true; } for (MemberCalc memberCalc : memberCalcs) { // If the expression definitely includes the dimension (in this // case, that means it is a member of that dimension) then we // do not depend on the dimension. For example, the scalar value of // [Store].[USA] // does not depend on [Store]. // // If the dimensionality of the expression is unknown, then the // expression MIGHT include the dimension, so to be safe we have to // say that it depends on the given dimension. For example, // Dimensions(3).CurrentMember.Parent // may depend on [Store]. if (memberCalc.getType().usesHierarchy(hierarchy, true)) { return false; } } return true; } } // End MemberArrayValueCalc.java mondrian-3.11.0.1-R/src/main/mondrian/calc/impl/MemberValueCalc.java000066400000000000000000000104021261646570300247670ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.calc.impl; import mondrian.calc.Calc; import mondrian.calc.MemberCalc; import mondrian.olap.*; import mondrian.olap.type.ScalarType; import mondrian.olap.type.Type; /** * Expression which evaluates a few member expressions, * sets the dimensional context to the result of those expressions, * then yields the value of the current measure in the current * dimensional context. * *

The evaluator's context is preserved. * *

Note that a MemberValueCalc with 0 member expressions is equivalent to a * {@link mondrian.calc.impl.ValueCalc}; see also {@link mondrian.calc.impl.TupleValueCalc}. * * @author jhyde * @since Sep 27, 2005 */ public class MemberValueCalc extends GenericCalc { private final MemberCalc memberCalc; private final boolean nullCheck; /** * Creates a MemberArrayValueCalc. * *

Clients outside this package should use the * {@link MemberValueCalc#create(mondrian.olap.Exp, * mondrian.calc.MemberCalc[], boolean)} * factory method. * * @param exp Expression * @param memberCalc Compiled expression * @param nullCheck Whether to check for null values due to non-joining * dimensions in a virtual cube */ public MemberValueCalc(Exp exp, MemberCalc memberCalc, boolean nullCheck) { super(exp); this.nullCheck = nullCheck; final Type type = exp.getType(); assert type instanceof ScalarType : exp; this.memberCalc = memberCalc; } /** * Creates a {@link ValueCalc}, {@link MemberValueCalc} or * {@link MemberArrayValueCalc}. * * @param exp Expression * @param memberCalcs Array of members to evaluate * @param nullCheck Whether to check for null values due to non-joining * dimensions in a virtual cube * @return Compiled expression to evaluate each member expression, set * evaluator context to each resulting member, then evaluate the current * context */ public static GenericCalc create( Exp exp, MemberCalc[] memberCalcs, boolean nullCheck) { switch (memberCalcs.length) { case 0: return new ValueCalc(exp); case 1: return new MemberValueCalc(exp, memberCalcs[0], nullCheck); default: return new MemberArrayValueCalc(exp, memberCalcs, nullCheck); } } public Object evaluate(Evaluator evaluator) { final int savepoint = evaluator.savepoint(); try { final Member member = memberCalc.evaluateMember(evaluator); if (member == null || member.isNull()) { return null; } evaluator.setContext(member); if (nullCheck && evaluator.needToReturnNullForUnrelatedDimension( new Member[] {member})) { return null; } final Object result = evaluator.evaluateCurrent(); return result; } finally { evaluator.restore(savepoint); } } public Calc[] getCalcs() { return new MemberCalc[] {memberCalc}; } public boolean dependsOn(Hierarchy hierarchy) { if (super.dependsOn(hierarchy)) { return true; } // If the expression definitely includes the dimension (in this // case, that means it is a member of that dimension) then we // do not depend on the dimension. For example, the scalar value of // [Store].[USA] // does not depend on [Store]. // // If the dimensionality of the expression is unknown, then the // expression MIGHT include the dimension, so to be safe we have to // say that it depends on the given dimension. For example, // Dimensions(3).CurrentMember.Parent // may depend on [Store]. return !memberCalc.getType().usesHierarchy(hierarchy, true); } } // End MemberValueCalc.java mondrian-3.11.0.1-R/src/main/mondrian/calc/impl/TupleValueCalc.java000066400000000000000000000077061261646570300246660ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.calc.impl; import mondrian.calc.*; import mondrian.olap.*; import mondrian.olap.fun.TupleFunDef; import mondrian.olap.type.TupleType; import mondrian.olap.type.Type; /** * Expression which evaluates a tuple expression, * sets the dimensional context to the result of that expression, * then yields the value of the current measure in the current * dimensional context. * *

The evaluator's context is preserved. * * @see mondrian.calc.impl.ValueCalc * @see mondrian.calc.impl.MemberValueCalc * * @author jhyde * @since Sep 27, 2005 */ public class TupleValueCalc extends GenericCalc { private final TupleCalc tupleCalc; private final boolean nullCheck; /** * Creates a TupleValueCalc. * * @param exp Expression * @param tupleCalc Compiled expression to evaluate the tuple * @param nullCheck Whether to check for null values due to non-joining * dimensions in a virtual cube */ public TupleValueCalc(Exp exp, TupleCalc tupleCalc, boolean nullCheck) { super(exp); this.tupleCalc = tupleCalc; this.nullCheck = nullCheck; } public Object evaluate(Evaluator evaluator) { final Member[] members = tupleCalc.evaluateTuple(evaluator); if (members == null) { return null; } if (nullCheck && evaluator.needToReturnNullForUnrelatedDimension(members)) { return null; } final int savepoint = evaluator.savepoint(); try { evaluator.setContext(members); Object result = evaluator.evaluateCurrent(); return result; } finally { evaluator.restore(savepoint); } } public Calc[] getCalcs() { return new Calc[] {tupleCalc}; } public boolean dependsOn(Hierarchy hierarchy) { if (super.dependsOn(hierarchy)) { return true; } for (Type type : ((TupleType) tupleCalc.getType()).elementTypes) { // If the expression definitely includes the dimension (in this // case, that means it is a member of that dimension) then we // do not depend on the dimension. For example, the scalar value of // ([Store].[USA], [Gender].[F]) // does not depend on [Store]. // // If the dimensionality of the expression is unknown, then the // expression MIGHT include the dimension, so to be safe we have to // say that it depends on the given dimension. For example, // (Dimensions(3).CurrentMember.Parent, [Gender].[F]) // may depend on [Store]. if (type.usesHierarchy(hierarchy, true)) { return false; } } return true; } /** * Optimizes the scalar evaluation of a tuple. It evaluates the members * of the tuple, sets the context to these members, and evaluates the * scalar result in one step, without generating a tuple.

* * This is useful when evaluating calculated members:

* *
WITH MEMBER [Measures].[Sales last quarter]
     *   AS ' ([Measures].[Unit Sales], [Time].PreviousMember) '
* *
* * @return optimized expression */ public Calc optimize() { if (tupleCalc instanceof TupleFunDef.CalcImpl) { TupleFunDef.CalcImpl calc = (TupleFunDef.CalcImpl) tupleCalc; return MemberValueCalc.create( new DummyExp(type), calc.getMemberCalcs(), nullCheck); } return this; } } // End TupleValueCalc.java mondrian-3.11.0.1-R/src/main/mondrian/calc/impl/UnaryTupleList.java000066400000000000000000000151561261646570300247570ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.calc.impl; import mondrian.calc.*; import mondrian.olap.Evaluator; import mondrian.olap.Member; import java.util.*; /** * Implementation of {@link TupleList} where the tuples are unary (each tuple * consists of just one {@link Member}). * *

It is implemented as a straightforward wrapper on a backing list. You * can provide the backing list explicitly using the * {@link #UnaryTupleList(java.util.List)} constructor, and you can access the * backing list by calling {@link #slice}(0). * * @author jhyde */ public class UnaryTupleList extends AbstractList> implements TupleList { final List list; /** * Creates an empty UnaryTupleList. */ public UnaryTupleList() { this(new ArrayList()); } /** * Creates a UnaryTupleList with a given backing list. * * @param list Backing list */ public UnaryTupleList(List list) { this.list = list; } public Member get(int slice, int index) { assert slice == 0; return list.get(index); } @Override public List get(int index) { return Collections.singletonList(list.get(index)); } @Override public void add(int index, List element) { list.add(index, element.get(0)); } @Override public boolean add(List element) { return list.add(element.get(0)); } public TupleList fix() { return this; } @Override public List set(int index, List element) { final Member member = list.set(index, element.get(0)); return member == null ? null : Collections.singletonList(member); } @Override public List remove(int index) { final Member member = list.remove(index); return member == null ? null : Collections.singletonList(member); } @Override public void clear() { list.clear(); } @Override public int size() { return list.size(); } public int getArity() { return 1; } public List slice(int column) { return list; } public TupleList cloneList(int capacity) { return new UnaryTupleList( capacity < 0 ? new ArrayList(list) : new ArrayList(capacity)); } public TupleCursor tupleCursor() { return tupleIterator(); } public TupleIterator tupleIterator() { return new UnaryIterator(); } public final Iterator> iterator() { return tupleIterator(); } public TupleList project(int[] destIndices) { // REVIEW: Is 0-ary valid? assert destIndices.length == 1; assert destIndices[0] == 0; return this; } public void addTuple(Member... members) { assert members.length == 1; list.add(members[0]); } public void addCurrent(TupleCursor tupleIter) { list.add(tupleIter.member(0)); } @Override public TupleList subList(int fromIndex, int toIndex) { return new ListTupleList( 1, list.subList(fromIndex, toIndex)); } public TupleList withPositionCallback( final PositionCallback positionCallback) { return new UnaryTupleList( new AbstractList() { public Member get(int index) { positionCallback.onPosition(index); return list.get(index); } public int size() { return list.size(); } public Member set(int index, Member element) { positionCallback.onPosition(index); return list.set(index, element); } public void add(int index, Member element) { positionCallback.onPosition(index); list.add(index, element); } public Member remove(int index) { positionCallback.onPosition(index); return list.remove(index); } } ); } /** * Implementation of {@link mondrian.calc.TupleIterator} for {@link UnaryTupleList}. * Based upon AbstractList.Itr, but with concurrent modification checking * removed. */ private class UnaryIterator implements TupleIterator { /** * Index of element to be returned by subsequent call to next. */ int cursor = 0; /** * Index of element returned by most recent call to next or * previous. Reset to -1 if this element is deleted by a call * to remove. */ int lastRet = -1; public boolean hasNext() { return cursor != size(); } public List next() { try { List next = get(cursor); lastRet = cursor++; return next; } catch (IndexOutOfBoundsException e) { throw new NoSuchElementException(); } } public void currentToArray(Member[] members, int offset) { members[offset] = list.get(lastRet); } public boolean forward() { if (cursor == size()) { return false; } lastRet = cursor++; return true; } public List current() { return get(lastRet); } public int getArity() { return 1; } public void remove() { if (lastRet == -1) { throw new IllegalStateException(); } try { UnaryTupleList.this.remove(lastRet); if (lastRet < cursor) { cursor--; } lastRet = -1; } catch (IndexOutOfBoundsException e) { throw new ConcurrentModificationException(); } } public void setContext(Evaluator evaluator) { evaluator.setContext(list.get(lastRet)); } public Member member(int column) { assert column == 0; return list.get(lastRet); } } } // End UnaryTupleList.java mondrian-3.11.0.1-R/src/main/mondrian/calc/impl/ValueCalc.java000066400000000000000000000017451261646570300236510ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.calc.impl; import mondrian.calc.Calc; import mondrian.olap.*; /** * Expression which yields the value of the current member in the current * dimensional context. * * @see mondrian.calc.impl.MemberValueCalc * * @author jhyde * @since Sep 27, 2005 */ public class ValueCalc extends GenericCalc { /** * Creates a ValueCalc. * * @param exp Source expression */ public ValueCalc(Exp exp) { super(exp, new Calc[0]); } public Object evaluate(Evaluator evaluator) { return evaluator.evaluateCurrent(); } public boolean dependsOn(Hierarchy hierarchy) { return true; } } // End ValueCalc.java mondrian-3.11.0.1-R/src/main/mondrian/calc/impl/package.html000066400000000000000000000001311261646570300234140ustar00rootroot00000000000000 Provides implementation classes for compiled expressions. mondrian-3.11.0.1-R/src/main/mondrian/calc/package.html000066400000000000000000000000761261646570300224630ustar00rootroot00000000000000 Provides compiled expressions. mondrian-3.11.0.1-R/src/main/mondrian/gui/000077500000000000000000000000001261646570300200615ustar00rootroot00000000000000mondrian-3.11.0.1-R/src/main/mondrian/gui/I18n.java000066400000000000000000000274131261646570300214520ustar00rootroot00000000000000/* // This software is subject to the terms of the Eclipse Public License v1.0 // Agreement, available at the following URL: // http://www.eclipse.org/legal/epl-v10.html. // You must accept the terms of that agreement to use this software. // // Copyright (C) 2007-2007 JasperSoft // Copyright (C) 2008-2009 Pentaho // All Rights Reserved. */ package mondrian.gui; import org.apache.log4j.Logger; import java.io.File; import java.io.IOException; import java.net.JarURLConnection; import java.net.URL; import java.text.MessageFormat; import java.util.*; import java.util.jar.JarEntry; import java.util.jar.JarFile; public class I18n { private static final Logger LOGGER = Logger.getLogger(I18n.class); // Default to english private Locale currentLocale = Locale.ENGLISH; private ResourceBundle guiBundle = null; private ResourceBundle languageBundle = null; private static String defaultIcon = "nopic"; private static List languageChangedListeners = new ArrayList(); public static void addOnLanguageChangedListener( LanguageChangedListener listener) { languageChangedListeners.add(listener); } public I18n(ResourceBundle guiBundle, ResourceBundle languageBundle) { this.guiBundle = guiBundle; this.languageBundle = languageBundle; } public static List getListOfAvailableLanguages(Class cl) { List supportedLocales = new ArrayList(); try { Set names = getResourcesInPackage(cl, cl.getName()); for (String name : names) { // From // '../../_en.properties' // or // '../../_en_UK.properties' // To // 'en' OR 'en_UK_' OR even en_UK_Brighton dialect String lang = name.substring(name.lastIndexOf('/') + 1); // only accept resources with extension '.properties' if (lang.indexOf(".properties") < 0) { continue; } lang = lang.substring(0, lang.indexOf(".properties")); StringTokenizer tokenizer = new StringTokenizer(lang, "_"); if (tokenizer.countTokens() <= 1) { continue; } String language = ""; String country = ""; String variant = ""; int i = 0; while (tokenizer.hasMoreTokens()) { String token = tokenizer.nextToken(); switch (i) { case 0: //the word break; case 1: language = token; break; case 2: country = token; break; case 3: variant = token; break; default: // } i++; } Locale model = new Locale(language, country, variant); supportedLocales.add(model); } } catch (Exception e) { LOGGER.error("getListOfAvailableLanguages", e); } // Sort the list. Probably should use the current locale when getting // the DisplayLanguage so the sort order is correct for the user. Collections.sort( supportedLocales, new Comparator() { public int compare(Object lhs, Object rhs) { String ls = ((Locale) lhs).getDisplayLanguage(); String rs = ((Locale) rhs).getDisplayLanguage(); // TODO: this is not very nice - We should introduce a // MyLocale if (ls.equals("pap")) { ls = "Papiamentu"; } if (rs.equals("pap")) { rs = "Papiamentu"; } return ls.compareTo(rs); } }); return supportedLocales; } /** * Enumerates the resouces in a give package name. * This works even if the resources are loaded from a jar file! * *

Adapted from code by mikewse * on the java.sun.com message boards. * http://forum.java.sun.com/thread.jsp?forum=22&thread=30984 * *

The resulting set is deterministically ordered. * * @param coreClass Class for class loader to find the resources * @param packageName The package to enumerate * @return A Set of Strings for each resouce in the package. */ public static Set getResourcesInPackage( Class coreClass, String packageName) throws IOException { String localPackageName; if (packageName.endsWith("/")) { localPackageName = packageName; } else { localPackageName = packageName + '/'; } ClassLoader cl = coreClass.getClassLoader(); Enumeration dirEnum = cl.getResources(localPackageName); Set names = new LinkedHashSet(); // deterministic while (dirEnum.hasMoreElements()) { URL resUrl = dirEnum.nextElement(); // Pointing to filesystem directory if (resUrl.getProtocol().equals("file")) { try { File dir = new File(resUrl.getFile()); File[] files = dir.listFiles(); if (files != null) { for (int i = 0; i < files.length; i++) { File file = files[i]; if (file.isDirectory()) { continue; } names.add(localPackageName + file.getName()); } } } catch (Exception ex) { ex.printStackTrace(); } // Pointing to Jar file } else if (resUrl.getProtocol().equals("jar")) { JarURLConnection jconn = (JarURLConnection) resUrl.openConnection(); JarFile jfile = jconn.getJarFile(); Enumeration entryEnum = jfile.entries(); while (entryEnum.hasMoreElements()) { JarEntry entry = (JarEntry) entryEnum.nextElement(); String entryName = entry.getName(); // Exclude our own directory if (entryName.equals(localPackageName)) { continue; } String parentDirName = entryName.substring(0, entryName.lastIndexOf('/') + 1); if (!parentDirName.equals(localPackageName)) { continue; } names.add(entryName); } } else { // Invalid classpath entry } } return names; } public void setCurrentLocale(String language) { setCurrentLocale(language, null); } public void setCurrentLocale(String language, String country) { if (language != null && !language.equals("")) { if (country != null && !country.equals("")) { setCurrentLocale(new Locale(language, country)); } else { setCurrentLocale(new Locale(language)); } } else { setCurrentLocale(Locale.getDefault()); } } public void setCurrentLocale(Locale locale) { currentLocale = locale; languageBundle = null; for (LanguageChangedListener listener : languageChangedListeners) { try { listener.languageChanged(new LanguageChangedEvent(locale)); } catch (Exception ex) { LOGGER.error("setCurrentLocale", ex); } } } public Locale getCurrentLocale() { if (currentLocale == null) { currentLocale = Locale.getDefault(); } return currentLocale; } public String getGUIReference(String reference) { try { if (guiBundle == null) { throw new Exception("No GUI bundle"); } return guiBundle.getString(reference); } catch (MissingResourceException ex) { LOGGER.error( "Can't find the translation for key = " + reference, ex); throw ex; } catch (Exception ex) { LOGGER.error("Exception loading reference = " + reference, ex); return guiBundle.getString(defaultIcon); } } /** * Retreives a resource string using the current locale. * * @param stringId The resource string identifier * @return The locale specific string */ public String getString(String stringId) { return getString(stringId, getCurrentLocale()); } /** * Retreives a resource string using the current locale, with a default. * * @param stringId The resource string identifier * @param defaultValue If no resource for the stringID is specified, use * this default value * @return The locale specific string */ public String getString(String stringId, String defaultValue) { return getString(stringId, getCurrentLocale(), defaultValue); } /** * Retrieves a resource string using the current locale. * * @param stringId The resource string identifier * @param defaultValue The default value for the resource string * @param args arguments to be inserted into the resource string * @return The locale specific string */ public String getFormattedString( String stringId, String defaultValue, Object... args) { String pattern = getString(stringId, getCurrentLocale(), defaultValue); MessageFormat mf = new java.text.MessageFormat(pattern, getCurrentLocale()); return mf.format(args); } /** * Retreive a resource string using the given locale. The stringID is the * default. * * @param stringId The resource string identifier * @param currentLocale required Locale for resource * @return The locale specific string */ private String getString(String stringId, Locale currentLocale) { return getString(stringId, currentLocale, stringId); } /** * Retreive a resource string using the given locale. Use the default if * there is nothing for the given Locale. * * @param stringId The resource string identifier * @param currentLocale required Locale for resource * @param defaultValue The default value for the resource string * @return The locale specific string */ public String getString( String stringId, Locale currentLocale, String defaultValue) { try { if (languageBundle == null) { throw new Exception("No language bundle"); } return languageBundle.getString(stringId); } catch (MissingResourceException ex) { LOGGER.error( "Can't find the translation for key = " + stringId + ": using default (" + defaultValue + ")", ex); } catch (Exception ex) { LOGGER.error("Exception loading stringID = " + stringId, ex); } return defaultValue; } public static String getCurrentLocaleID() { return ""; } } // End I18n.java mondrian-3.11.0.1-R/src/main/mondrian/gui/JTreeUpdater.java000066400000000000000000000071741261646570300232730ustar00rootroot00000000000000/* // This software is subject to the terms of the Eclipse Public License v1.0 // Agreement, available at the following URL: // http://www.eclipse.org/legal/epl-v10.html. // You must accept the terms of that agreement to use this software. // // Copyright (C) 2006-2009 Pentaho // Copyright (C) 2006-2007 Cincom Systems, Inc. // Copyright (C) 2006-2007 JasperSoft // All Rights Reserved. */ package mondrian.gui; import java.util.HashSet; import java.util.Set; import javax.swing.*; import javax.swing.event.*; import javax.swing.tree.DefaultTreeModel; import javax.swing.tree.TreePath; /** * Helper to enable update the tree and keep expanded nodes expanded after * reloading the tree. * * @author erik */ public class JTreeUpdater implements TreeExpansionListener, TreeSelectionListener { private JTree tree = null; private Set expandedTreePaths = new HashSet(); private TreePath[] selectedTreePaths = new TreePath[0]; /** * Constructor * * @param tree The tree to track */ public JTreeUpdater(JTree tree) { this.tree = tree; this.tree.addTreeExpansionListener(this); this.tree.addTreeSelectionListener(this); } /** * Call this method whenever you update the tree and needs it reloaded */ public synchronized void update() { synchronized (this.tree) { this.tree.removeTreeExpansionListener(this); this.tree.removeTreeSelectionListener(this); ((DefaultTreeModel) this.tree.getModel()).reload(); for (TreePath treePath : expandedTreePaths) { this.tree.expandPath(treePath); } this.tree.getSelectionModel().setSelectionPaths(selectedTreePaths); this.tree.addTreeExpansionListener(this); this.tree.addTreeSelectionListener(this); } } public void treeExpanded(TreeExpansionEvent treeExpansionEvent) { TreePath expandedPath = treeExpansionEvent.getPath(); // remove all ancestors of eventpath from expandedpaths set. Object[] paths = expandedTreePaths.toArray(); for (int i = 0; i < paths.length; i++) { TreePath path = (TreePath) paths[i]; // Path is a descendant of event path if path contains all // components that make eventpath. For example, if eventpath = [a,b] // path=[a,b,c] then path is descendant of eventpath. if (path.isDescendant(expandedPath)) { expandedTreePaths.remove(path); } } expandedTreePaths.add(expandedPath); } public void treeCollapsed(TreeExpansionEvent treeExpansionEvent) { TreePath collapsedPath = treeExpansionEvent.getPath(); expandedTreePaths.remove(collapsedPath); // remove all descendants from expandedpaths set. Object[] paths = expandedTreePaths.toArray(); for (int i = 0; i < paths.length; i++) { TreePath path = (TreePath) paths[i]; // Path is a descendant of event path if path contains all // components that make eventpath. For example, if eventpath = [a,b] // path=[a,b,c] then path is descendant of eventpath. if (collapsedPath.isDescendant(path)) { expandedTreePaths.remove(path); } } } public void valueChanged(TreeSelectionEvent treeSelectionEvent) { if (this.tree.getSelectionPaths() != null && this.tree.getSelectionPaths().length > 0) { selectedTreePaths = this.tree.getSelectionModel().getSelectionPaths(); } } } // End JTreeUpdater.java mondrian-3.11.0.1-R/src/main/mondrian/gui/JdbcExplorer.java000066400000000000000000000214071261646570300233130ustar00rootroot00000000000000/* // This software is subject to the terms of the Eclipse Public License v1.0 // Agreement, available at the following URL: // http://www.eclipse.org/legal/epl-v10.html. // You must accept the terms of that agreement to use this software. // // Copyright (C) 2002-2005 Julian Hyde // Copyright (C) 2005-2009 Pentaho and others // All Rights Reserved. */ package mondrian.gui; import mondrian.gui.JdbcMetaData.DbColumn; import org.apache.log4j.Logger; import java.util.Enumeration; import java.util.List; import javax.swing.event.TreeExpansionEvent; import javax.swing.event.TreeWillExpandListener; import javax.swing.tree.*; /** * @author sean */ public class JdbcExplorer extends javax.swing.JPanel implements TreeWillExpandListener { private static final Logger LOGGER = Logger.getLogger(JdbcExplorer.class); JdbcMetaData jdbcMetaData; JdbcTreeModel model; Workbench workbench; DefaultMutableTreeNode root; DefaultTreeModel treeModel; public JdbcExplorer(JdbcMetaData jdbcMetaData, Workbench wb) { workbench = wb; initComponents(); setMetaData(jdbcMetaData); } public void setMetaData(JdbcMetaData jdbcMetaData) { try { this.jdbcMetaData = jdbcMetaData; Node rootNode = new Node(null, NodeType.ROOT, null); root = new DefaultMutableTreeNode(rootNode); for (String schemaName : jdbcMetaData.getAllSchemas()) { Node cat = new Node(schemaName, NodeType.CATALOG, null); DefaultMutableTreeNode catTreeNode = new DefaultMutableTreeNode(cat); cat.treeNode = catTreeNode; root.add(catTreeNode); List tables = jdbcMetaData.getAllTables(schemaName); for (String tableName : tables) { Node table = new Node(tableName, NodeType.TABLE, null); DefaultMutableTreeNode tableTreeNode = new DefaultMutableTreeNode(table); table.treeNode = tableTreeNode; catTreeNode.add(tableTreeNode); } cat.gotChildren = true; } rootNode.gotChildren = true; treeModel = new DefaultTreeModel(root, true); tree.setModel(treeModel); tree.addTreeWillExpandListener(this); updater = new JTreeUpdater(tree); } catch (Exception ex) { LOGGER.error(ex); } } public void resetMetaData(JdbcMetaData jdbcMetaData) { setMetaData(jdbcMetaData); } public JTreeUpdater getTreeUpdater() { return updater; } public void treeWillExpand(TreeExpansionEvent event) throws ExpandVetoException { // The children are lazy loaded LOGGER.debug( "path = " + event.getPath() + ", last object is a " + event.getPath().getLastPathComponent().getClass().getName()); DefaultMutableTreeNode theTreeNode = (DefaultMutableTreeNode) event.getPath().getLastPathComponent(); Node theNode = (Node) theTreeNode.getUserObject(); theNode.setChildren(); logNode(theTreeNode, "will Expand"); } private void logNode(DefaultMutableTreeNode theTreeNode, String message) { if (!LOGGER.isDebugEnabled()) { return; } DefaultMutableTreeNode parentNode = (DefaultMutableTreeNode) theTreeNode.getParent(); Node theNode = (Node) theTreeNode.getUserObject(); Node theParentNode = parentNode == null ? null : (Node) parentNode.getUserObject(); @SuppressWarnings({"unchecked"}) Enumeration children = theTreeNode.children(); LOGGER.debug( message + ": " + theNode + ", " + theNode.type + ", parent " + theParentNode + (theParentNode == null ? "" : ", " + theParentNode.type)); while (children.hasMoreElements()) { DefaultMutableTreeNode treeNode = children.nextElement(); Node child = (Node) treeNode.getUserObject(); LOGGER.debug("\t" + child.toString() + ", " + child.type); } } public void treeWillCollapse(TreeExpansionEvent arg0) throws ExpandVetoException { } enum NodeType { CATALOG, TABLE, COLUMN, ROOT } class Node { final String name; final NodeType type; boolean gotChildren = false; DefaultMutableTreeNode treeNode; final JdbcMetaData.DbColumn columnInfo; public Node( String name, NodeType type, DefaultMutableTreeNode treeNode) { this(name, type, treeNode, null); } public Node( String name, NodeType type, DefaultMutableTreeNode treeNode, JdbcMetaData.DbColumn columnInfo) { this.name = name; this.type = type; this.treeNode = treeNode; this.columnInfo = columnInfo; } public String toString() { if (type == NodeType.ROOT) { return workbench.getResourceConverter().getFormattedString( "jdbcExplorer.root.name", "All Schemas"); } StringBuilder sb = new StringBuilder(); if (name == null || name.trim().length() == 0) { switch (type) { case CATALOG: sb.append( workbench.getResourceConverter().getFormattedString( "jdbcExplorer.default.name.catalog", "Default Schema")); break; case TABLE: sb.append( workbench.getResourceConverter().getFormattedString( "jdbcExplorer.default.name.table", "Table")); break; case COLUMN: sb.append( workbench.getResourceConverter().getFormattedString( "jdbcExplorer.default.name.column", "Column")); break; } } else { sb.append(name); } if (type != NodeType.COLUMN) { return sb.toString(); } // now for columns sb.append(" - ").append(columnInfo.displayType()); return sb.toString(); } public void setChildren() { if (!gotChildren) { if (type == NodeType.TABLE) { DefaultMutableTreeNode theParentTreeNode = (DefaultMutableTreeNode) treeNode.getParent(); Node theParentNode = (Node) theParentTreeNode.getUserObject(); // This is a table, parent is a schema List columns = jdbcMetaData.getAllDbColumns( theParentNode.name, name); for (DbColumn column : columns) { Node columnNode = new Node( column.name, NodeType.COLUMN, treeNode, column); MutableTreeNode columnTreeNode = new DefaultMutableTreeNode(columnNode, false); treeNode.add(columnTreeNode); } } } gotChildren = true; } } /** * This method is called from within the constructor to * initialize the form. * WARNING: Do NOT modify this code. The content of this method is * always regenerated by the Form Editor. */ private void initComponents() {//GEN-BEGIN:initComponents jSplitPane1 = new javax.swing.JSplitPane(); jScrollPane1 = new javax.swing.JScrollPane(); tree = new javax.swing.JTree(); jScrollPane2 = new javax.swing.JScrollPane(); setLayout(new java.awt.BorderLayout()); jSplitPane1.setDividerLocation(200); jScrollPane1.setViewportView(tree); jSplitPane1.setLeftComponent(jScrollPane1); jSplitPane1.setRightComponent(jScrollPane2); add(jSplitPane1, java.awt.BorderLayout.CENTER); } //GEN-END:initComponents // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JScrollPane jScrollPane2; private javax.swing.JScrollPane jScrollPane1; private javax.swing.JTree tree; private javax.swing.JSplitPane jSplitPane1; // End of variables declaration//GEN-END:variables private JTreeUpdater updater; } // End JdbcExplorer.java mondrian-3.11.0.1-R/src/main/mondrian/gui/JdbcMetaData.java000066400000000000000000001160761261646570300232020ustar00rootroot00000000000000/* // This software is subject to the terms of the Eclipse Public License v1.0 // Agreement, available at the following URL: // http://www.eclipse.org/legal/epl-v10.html. // You must accept the terms of that agreement to use this software. // // Copyright (C) 2006-2011 Pentaho and others // Copyright (C) 2006-2007 Cincom Systems, Inc. // Copyright (C) 2006-2007 JasperSoft // All Rights Reserved. */ package mondrian.gui; import org.apache.log4j.Logger; import java.sql.*; import java.util.*; /** */ public class JdbcMetaData { private static final Logger LOGGER = Logger.getLogger(JdbcMetaData.class); // E.g. "org.postgresql.Driver" String jdbcDriverClassName = null; // E.g. "jdbc:postgresql://localhost:5432/hello?user=postgres&password=post" String jdbcUsername = null; String jdbcConnectionUrl = null; String jdbcPassword = null; String jdbcSchema = null; boolean requireSchema = false; Connection conn = null; DatabaseMetaData md = null; Workbench workbench; public static final String LEVEL_SEPARATOR = "->"; private String errMsg = null; private Database db = new Database(); public JdbcMetaData( Workbench wb, String jdbcDriverClassName, String jdbcConnectionUrl, String jdbcUsername, String jdbcPassword, String jdbcSchema, boolean requireSchema) { this.workbench = wb; this.jdbcConnectionUrl = jdbcConnectionUrl; this.jdbcDriverClassName = jdbcDriverClassName; this.jdbcUsername = jdbcUsername; this.jdbcPassword = jdbcPassword; this.jdbcSchema = jdbcSchema; this.requireSchema = requireSchema; if (initConnection() == null) { setAllSchemas(); closeConnection(); } } public boolean getRequireSchema() { return requireSchema; } /** * @return the workbench i18n converter */ public I18n getResourceConverter() { return workbench.getResourceConverter(); } /** * Tests database connection. Called from Preferences dialog button test * connection. */ public JdbcMetaData( String jdbcDriverClassName, String jdbcConnectionUrl, String jdbcUsername, String jdbcPassword) { this.jdbcConnectionUrl = jdbcConnectionUrl; this.jdbcDriverClassName = jdbcDriverClassName; this.jdbcUsername = jdbcUsername; this.jdbcPassword = jdbcPassword; if (initConnection() == null) { closeConnection(); } } /* Creates a database connection and initializes the meta data details */ public String initConnection() { LOGGER.debug("JdbcMetaData: initConnection"); try { if (jdbcDriverClassName == null || jdbcDriverClassName.trim().length() == 0 || jdbcConnectionUrl == null || jdbcConnectionUrl.trim().length() == 0) { errMsg = getResourceConverter().getFormattedString( "jdbcMetaData.blank.exception", "Driver={0}\nConnection URL={1}\nUse Preferences to set Database Connection parameters first and then open a Schema", jdbcDriverClassName, jdbcConnectionUrl); return errMsg; } Class.forName(jdbcDriverClassName); if (jdbcUsername != null && jdbcUsername.length() > 0) { conn = DriverManager.getConnection( jdbcConnectionUrl, jdbcUsername, jdbcPassword); } else { conn = DriverManager.getConnection(jdbcConnectionUrl); } LOGGER.debug("JDBC connection OPEN"); md = conn.getMetaData(); db.productName = md.getDatabaseProductName(); db.productVersion = md.getDatabaseProductVersion(); db.catalogName = conn.getCatalog(); LOGGER.debug("Catalog name = " + db.catalogName); LOGGER.debug("Database Product Name: " + db.productName); LOGGER.debug("Database Product Version: " + db.productVersion); LOGGER.debug("JdbcMetaData: initConnection - no error"); return null; } catch (Exception e) { errMsg = e.getClass().getSimpleName() + " : " + e.getLocalizedMessage(); LOGGER.error("Database connection exception : " + errMsg, e); return errMsg; //e.printStackTrace(); } } public void closeConnection() { if (conn == null) { return; } md = null; try { conn.close(); LOGGER.debug("JDBC connection CLOSE"); } catch (Exception e) { LOGGER.error(e); } conn = null; } /** * Check to see if the schemaName is in the list of allowed jdbc schemas * * @param schemaName the name of the schmea * @return true if found, or if jdbcSchema is null */ private boolean inJdbcSchemas(String schemaName) { if (jdbcSchema == null || jdbcSchema.trim().length() == 0) { return true; } String schemas[] = jdbcSchema.split("[,;]"); for (String schema : schemas) { if (schema.trim().equalsIgnoreCase(schemaName)) { return true; } } return false; } /* list all schemas in the currently connected database */ public List listAllSchemas() { LOGGER.debug("JdbcMetaData: listAllSchemas"); if (initConnection() != null) { return null; } List schemaNames = new ArrayList(); ResultSet rs = null; try { rs = md.getSchemas(); while (rs.next()) { String schemaName = rs.getString("TABLE_SCHEM"); schemaNames.add(schemaName); } } catch (Exception e) { LOGGER.debug( "Exception : Database does not support schemas." + e .getMessage()); return null; } finally { try { rs.close(); closeConnection(); } catch (Exception e) { // ignore } } return schemaNames; } /* set all schemas in the currently connected database */ private void setAllSchemas() { LOGGER.debug("JdbcMetaData: setAllSchemas"); ResultSet rs = null; boolean gotSchema = false; try { rs = md.getSchemas(); while (rs.next()) { String schemaName = rs.getString("TABLE_SCHEM"); if (inJdbcSchemas(schemaName)) { DbSchema dbs = new DbSchema(); dbs.name = schemaName; LOGGER.debug("JdbcMetaData: setAllTables - " + dbs.name); setAllTables(dbs); db.addDbSchema(dbs); gotSchema = true; } } } catch (Exception e) { LOGGER.debug( "Exception : Database does not support schemas." + e .getMessage()); } finally { try { rs.close(); } catch (Exception e) { // ignore } } if (!gotSchema) { LOGGER.debug( "JdbcMetaData: setAllSchemas - tables with no schema name"); DbSchema dbs = new DbSchema(); dbs.name = null; //tables with no schema name setAllTables(dbs); db.addDbSchema(dbs); } } /* set all tables in the currently connected database */ private void setAllTables(DbSchema dbs) { LOGGER.debug("JdbcMetaData: Loading schema: '" + dbs.name + "'"); ResultSet rs = null; try { // Tables and views can be used try { rs = md.getTables( null, dbs.name, null, new String[]{"TABLE", "VIEW"}); } catch (Exception e) { // this is a workaround for databases that throw an exception // when views are requested. rs = md.getTables(null, dbs.name, null, new String[]{"TABLE"}); } while (rs.next()) { // Oracle 10g Driver returns bogus BIN$ tables that cause // exceptions String tbname = rs.getString("TABLE_NAME"); if (!tbname.matches("(?!BIN\\$).+")) { continue; } DbTable dbt = null; /* Note: Imported keys are foreign keys which are primary keys * of in some other tables; Exported keys are primary keys which * are referenced as foreign keys in other tables. */ try { ResultSet rs_fks = md.getImportedKeys(null, dbs.name, tbname); try { if (rs_fks.next()) { dbt = new FactTable(); do { ((FactTable) dbt).addFks( rs_fks.getString("FKCOLUMN_NAME"), rs_fks.getString("pktable_name")); } while (rs_fks.next()); } else { dbt = new DbTable(); } } finally { try { rs_fks.close(); } catch (Exception e) { // ignore } } } catch (Exception e) { // this fails in some cases (Redshift) LOGGER.warn("unable to process foreign keys", e); if (dbt == null) { dbt = new FactTable(); } } dbt.schemaName = dbs.name; dbt.name = tbname; setPKey(dbt); // Lazy loading // setColumns(dbt); dbs.addDbTable(dbt); db.addDbTable(dbt); } } catch (Exception e) { LOGGER.error("setAllTables", e); } finally { try { rs.close(); } catch (Exception e) { // ignore } } } /** * Gets the Primary key name for a given table name. * This key may be a composite key made of multiple columns. */ private void setPKey(DbTable dbt) { ResultSet rs = null; try { rs = md.getPrimaryKeys(null, dbt.schemaName, dbt.name); if (rs.next()) { // // a column may have been given a primary key name //===dbt.pk = rs.getString("PK_NAME"); // We need the column name which is primary key for the given // table. dbt.pk = rs.getString("column_name"); } } catch (Exception e) { LOGGER.error("setPKey", e); } finally { try { rs.close(); } catch (Exception e) { // ignore } } } private void setColumns(String schemaName, String tableName) { LOGGER.debug( "setColumns: <" + tableName + "> in schema <" + schemaName + ">"); DbTable dbt = db.getTable(schemaName, tableName); if (dbt == null) { LOGGER.debug( "No table with name: <" + tableName + "> in schema <" + schemaName + ">"); return; } if (initConnection() != null) { return; } try { setColumns(dbt); LOGGER.debug("got " + dbt.colsDataType.size() + " columns"); } finally { closeConnection(); } } /** * Gets all columns for a given table name. * * Assumes that the caller has acquired a connection using * {@link #initConnection()}. */ private void setColumns(DbTable dbt) { ResultSet rs = null; try { rs = md.getColumns(null, dbt.schemaName, dbt.name, null); while (rs.next()) { DbColumn col = new DbColumn(); col.dataType = rs.getInt("DATA_TYPE"); col.name = rs.getString("COLUMN_NAME"); col.typeName = rs.getString("TYPE_NAME"); col.columnSize = rs.getInt("COLUMN_SIZE"); col.decimalDigits = rs.getInt("DECIMAL_DIGITS"); dbt.addColsDataType(col); } } catch (Exception e) { LOGGER.error("setColumns", e); } finally { try { rs.close(); } catch (Exception e) { // ignore } } } //////////////////////////////////////////////////////////////////////////// // The following functions provide an interface to JdbcMetaData class to // retrieve the meta data details public List getAllSchemas() { return db.getAllSchemas(); } /** * Returns all tables in a given schema. */ public List getAllTables(String schemaName) { return db.getAllTables(schemaName); } /** * Returns all tables in given schema minus the given table name. */ public List getAllTables(String schemaName, String minusTable) { if (minusTable == null) { return getAllTables(schemaName); } else { List allTablesMinusOne = new ArrayList(); for (String s : getAllTables(schemaName)) { if (s.endsWith(minusTable)) { // startsWith and endsWith cannot be compared with // null argument, throws exception if ((schemaName == null) || s.startsWith(schemaName)) { continue; } } allTablesMinusOne.add(s); } return allTablesMinusOne; } } /* get all possible cases of fact tables in a schema */ public List getFactTables(String schemaName) { return db.getFactTables(schemaName); } /** * Gets all possible cases of dimension tables which are linked to given * fact table by foreign keys. */ public List getDimensionTables( String schemaName, String factTable) { List dimeTables = new ArrayList(); if (factTable == null) { return dimeTables; } else { return db.getDimensionTables(schemaName, factTable); } } public boolean isTableExists(String schemaName, String tableName) { if (tableName == null) { return true; } else { return db.tableExists(schemaName, tableName); } } public boolean isColExists( String schemaName, String tableName, String colName) { if (tableName == null || colName == null) { return true; } else { if (!db.hasColumns(schemaName, tableName)) { setColumns(schemaName, tableName); } return db.colExists(schemaName, tableName, colName); } } /* get all foreign keys in given fact table */ public List getFactTableFKs(String schemaName, String factTable) { List fks = new ArrayList(); if (factTable == null) { return fks; } else { return db.getFactTableFKs(schemaName, factTable); } } public String getTablePK(String schemaName, String tableName) { if (tableName == null) { return null; } else { return db.getTablePK(schemaName, tableName); } } /** * Gets all columns of given table in schema. * column string is formatted. */ public List getAllColumns(String schemaName, String tableName) { List allcols = new ArrayList(); if (tableName == null) { List allTables = getAllTables(schemaName); for (int i = 0; i < allTables.size(); i++) { String tab = allTables.get(i); List cols; if (tab.indexOf(LEVEL_SEPARATOR) == -1) { cols = getAllColumns(schemaName, tab); } else { String[] names = tab.split(LEVEL_SEPARATOR); cols = getAllColumns(names[0], names[1]); } for (int j = 0; j < cols.size(); j++) { String col = cols.get(j); allcols.add(tab + LEVEL_SEPARATOR + col); } } return allcols; } else { if (!db.hasColumns(schemaName, tableName)) { setColumns(schemaName, tableName); } return db.getAllColumns(schemaName, tableName); } } /** * Returns all columns of given table in schema. * Column string is formatted. */ public List getAllDbColumns(String schemaName, String tableName) { List allcols = new ArrayList(); if (tableName == null) { List allTables = getAllTables(schemaName); for (int i = 0; i < allTables.size(); i++) { String tab = allTables.get(i); List cols; if (tab.indexOf(LEVEL_SEPARATOR) == -1) { cols = getAllDbColumns(schemaName, tab); } else { String[] names = tab.split(LEVEL_SEPARATOR); cols = getAllDbColumns(names[0], names[1]); } allcols.addAll(cols); } return allcols; } else { if (!db.hasColumns(schemaName, tableName)) { setColumns(schemaName, tableName); } return db.getAllDbColumns(schemaName, tableName); } } // get column data type of given table and its col public int getColumnDataType( String schemaName, String tableName, String colName) { if (tableName == null || colName == null) { return -1; } else { if (!db.hasColumns(schemaName, tableName)) { setColumns(schemaName, tableName); } return db.getColumnDataType(schemaName, tableName, colName); } } /** * Gets column definition of given table and its col. * * @param schemaName Schema name * @param tableName Table name * @param colName Column name * @return Column definition */ public DbColumn getColumnDefinition( String schemaName, String tableName, String colName) { if (tableName == null || colName == null) { return null; } else { if (!db.hasColumns(schemaName, tableName)) { setColumns(schemaName, tableName); } return db.getColumnDefinition(schemaName, tableName, colName); } } public String getDbCatalogName() { return db.catalogName; } public String getDatabaseProductName() { return db.productName; } public String getJdbcConnectionUrl() { return jdbcConnectionUrl; } public String getErrMsg() { return errMsg; } public static void main(String[] args) { if (args.length < 2) { throw new RuntimeException( "need at least 2 args: driver class and jdbcUrl"); } String driverClass = args[0]; String jdbcUrl = args[1]; String username = null; String password = null; if (args.length > 2) { if (args.length != 4) { throw new RuntimeException( "need 4 args: including user name and password"); } username = args[2]; password = args[3]; } JdbcMetaData sb = new JdbcMetaData( null, driverClass, jdbcUrl, username, password, "", false); List foundSchemas = sb.getAllSchemas(); System.out.println("allSchemas = " + foundSchemas); for (String schemaName : foundSchemas) { List foundTables = sb.getAllTables(schemaName); if (foundTables != null && foundTables.size() > 0) { System.out.println("schema = " + schemaName); for (String tableName : foundTables) { System.out.println("\t" + tableName); List foundColumns = sb.getAllColumns( schemaName, tableName); for (String columnName : foundColumns) { System.out.println("\t\t" + columnName); } } } } } /** * Database metadata. */ class Database { String catalogName = ""; // database name. String productName = "Unknown"; String productVersion = ""; // list of all schemas in database Map schemas = new TreeMap(); //ordered collection, allows duplicates and null Map tables = new TreeMap(); // list of all tables in all schemas in database List allSchemas; private void addDbSchema(DbSchema dbs) { schemas.put( dbs.name != null ? dbs.name : "", dbs); } class TableTracker { List namedTable = new ArrayList(); public void add(DbTable table) { namedTable.add(table); } public int count() { return namedTable.size(); } } private void addDbTable(DbTable dbs) { TableTracker tracker = tables.get(dbs.name); if (tracker == null) { tracker = new TableTracker(); tables.put(dbs.name, tracker); } tracker.add(dbs); } private boolean schemaNameEquals(String a, String b) { return (a != null && a.equals(b)); } private DbSchema getSchema(String schemaName) { return schemas.get( schemaName != null ? schemaName : ""); } private List getAllSchemas() { if (allSchemas == null) { allSchemas = new ArrayList(); allSchemas.addAll(schemas.keySet()); } return allSchemas; } private boolean tableExists(String sname, String tableName) { return getTable(sname, tableName) != null; } private DbTable getTable(String sname, String tableName) { if (sname == null || sname.equals("")) { TableTracker t = tables.get(tableName); if (t != null) { return t.namedTable.get(0); } else { return null; } } else { DbSchema s = schemas.get(sname); if (s == null) { return null; } return s.getTable(tableName); } } private boolean hasColumns(String schemaName, String tableName) { DbTable table = getTable(schemaName, tableName); if (table != null) { return table.hasColumns(); } return false; } private boolean colExists( String sname, String tableName, String colName) { DbTable t = getTable(sname, tableName); if (t == null) { return false; } return t.getColumn(colName) != null; } private List getAllTables(String sname) { return getAllTables(sname, false); } private List getFactTables(String sname) { return getAllTables(sname, true); } private List getAllTables(String sname, boolean factOnly) { List v = new ArrayList(); if (sname == null || sname.equals("")) { // return a list of "schemaname -> table name" string objects for (TableTracker tt : tables.values()) { for (DbTable t : tt.namedTable) { if (!factOnly || (factOnly && t instanceof FactTable)) { if (t.schemaName == null) { v.add(t.name); } else { v.add(t.schemaName + LEVEL_SEPARATOR + t.name); } } } } } else { // return a list of "tablename" string objects DbSchema s = getSchema(sname); if (s != null) { for (DbTable t : s.tables.values()) { if (!factOnly || (factOnly && t instanceof FactTable)) { v.add(t.name); } } } } return v; } /* get all foreign keys in given fact table */ private List getFactTableFKs(String sname, String factTable) { List f = new ArrayList(); if (sname == null || sname.equals("")) { TableTracker tracker = tables.get(factTable); if (tracker == null) { return f; } // return a list of "schemaname -> table name -> fk col" string // objects if schema is not given boolean duplicate = tracker.count() > 1; for (DbTable t : tracker.namedTable) { if (t instanceof FactTable) { if (duplicate) { for (String fk : ((FactTable) t).fks.keySet()) { if (t.schemaName == null) { f.add(t.name + LEVEL_SEPARATOR + fk); } else { f.add( t.schemaName + LEVEL_SEPARATOR + t.name + LEVEL_SEPARATOR + fk); } } } else { f.addAll(((FactTable) t).fks.keySet()); } } } } else { DbSchema s = getSchema(sname); if (s == null) { return f; } DbTable t = s.getTable(factTable); if (t == null) { return f; } // return a list of "fk col name" string objects if schema is // given if (t instanceof FactTable && t.name.equals(factTable)) { f.addAll(((FactTable) t).fks.keySet()); } } return f; } private List getDimensionTables( String sname, String factTable) { List f = new ArrayList(); if (sname == null || sname.equals("")) { TableTracker tracker = tables.get(factTable); if (tracker == null) { return f; } // return a list of "schemaname -> table name -> fk col" string // objects if schema is not given boolean duplicate = tracker.count() > 1; for (DbTable t : tracker.namedTable) { if (t instanceof FactTable) { if (duplicate) { for (String fkt : ((FactTable) t).fks.values()) { if (t.schemaName == null) { f.add(t.name + LEVEL_SEPARATOR + fkt); } else { f.add( t.schemaName + LEVEL_SEPARATOR + t.name + LEVEL_SEPARATOR + fkt); } } } else { f.addAll(((FactTable) t).fks.keySet()); } } } } else { DbSchema s = getSchema(sname); if (s == null) { return f; } DbTable t = s.getTable(factTable); if (t == null) { return f; } // return a list of "fk col name" string objects if schema is // given if (t instanceof FactTable && t.name.equals(factTable)) { f.addAll(((FactTable) t).fks.values()); } } return f; } private String getTablePK(String sname, String tableName) { if (sname == null || sname.equals("")) { TableTracker tracker = tables.get(tableName); if (tracker == null) { return null; } // return a list of "schemaname -> table name -> // dimension table name" string objects if schema is not given return tracker.namedTable.get(0).pk; } else { DbTable t = getTable(sname, tableName); if (t == null) { return null; } return t.pk; } } private List getAllColumns(String sname, String tableName) { List f = new ArrayList(); if (sname == null || sname.equals("")) { TableTracker tracker = tables.get(tableName); if (tracker == null) { return f; } // return a list of "schemaname -> table name -> cols" // string objects if schema is not given boolean duplicate = tracker.count() > 1; for (DbTable t : tracker.namedTable) { for (Map.Entry c : t.colsDataType .entrySet()) { StringBuffer sb = new StringBuffer(); if (t.schemaName != null && !duplicate) { sb.append(t.schemaName).append(LEVEL_SEPARATOR); } sb.append(t.name) .append(LEVEL_SEPARATOR) .append(c.getKey()) .append(" - ") .append(c.getValue().displayType()); f.add(sb.toString()); } } } else { DbTable t = getTable(sname, tableName); if (t == null) { return f; } // return a list of "col name" string objects if schema is given f.addAll(t.colsDataType.keySet()); } return f; } private List getAllDbColumns(String sname, String tableName) { List f = new ArrayList(); if (sname == null || sname.equals("")) { TableTracker tracker = tables.get(tableName); if (tracker == null) { return f; } for (DbTable t : tracker.namedTable) { for (Map.Entry c : t.colsDataType .entrySet()) { f.add(c.getValue()); } } } else { DbTable t = getTable(sname, tableName); if (t == null) { return f; } for (Map.Entry c : t.colsDataType .entrySet()) { f.add(c.getValue()); } } return f; } private int getColumnDataType( String sname, String tableName, String colName) { DbColumn result = getColumnDefinition(sname, tableName, colName); if (result == null) { return -1; } return result.dataType; } private DbColumn getColumnDefinition( String sname, String tableName, String colName) { DbTable t = getTable(sname, tableName); if (t == null) { return null; } return t.colsDataType.get(colName); } } class DbSchema { String name; /** * ordered collection, allows duplicates and null */ final Map tables = new TreeMap(); private DbTable getTable(String tableName) { return tables.get(tableName); } private void addDbTable(DbTable dbt) { tables.put(dbt.name, dbt); } } public class DbColumn { public String name; public int dataType; public String typeName; public int columnSize; public int decimalDigits; public String displayType() { StringBuffer sb = new StringBuffer(); switch (dataType) { case Types.ARRAY: sb.append("ARRAY(" + columnSize + ")"); break; case Types.BIGINT: sb.append("BIGINT"); break; case Types.BINARY: sb.append("BINARY(" + columnSize + ")"); break; case Types.BLOB: sb.append("BLOB(" + columnSize + ")"); break; case Types.BIT: sb.append("BIT"); break; case Types.BOOLEAN: sb.append("BOOLEAN"); break; case Types.CHAR: sb.append("CHAR"); break; case Types.CLOB: sb.append("CLOB(" + columnSize + ")"); break; case Types.DATE: sb.append("DATE"); break; case Types.DECIMAL: sb.append("DECIMAL(" + columnSize + ", " + decimalDigits + ")"); break; case Types.DISTINCT: sb.append("DISTINCT"); break; case Types.DOUBLE: sb.append("DOUBLE(" + columnSize + ", " + decimalDigits + ")"); break; case Types.FLOAT: sb.append("FLOAT(" + columnSize + ", " + decimalDigits + ")"); break; case Types.INTEGER: sb.append("INTEGER(" + columnSize + ")"); break; case Types.JAVA_OBJECT: sb.append("JAVA_OBJECT(" + columnSize + ")"); break; /* * No Java 1.6 SQL types for now case Types.LONGNVARCHAR: sb.append("LONGNVARCHAR(" + columnSize + ")"); break; case Types.LONGVARBINARY: sb.append("LONGVARBINARY(" + columnSize + ")"); break; case Types.LONGVARCHAR: sb.append("LONGVARCHAR(" + columnSize + ")"); break; case Types.NCHAR: sb.append("NCHAR(" + columnSize + ")"); break; case Types.NCLOB: sb.append("NCLOB(" + columnSize + ")"); break; */ case Types.NULL: sb.append("NULL"); break; case Types.NUMERIC: sb.append("NUMERIC(" + columnSize + ", " + decimalDigits + ")"); break; /* * No Java 1.6 SQL types for now case Types.NVARCHAR: sb.append("NCLOB(" + columnSize + ")"); break; */ case Types.OTHER: sb.append("OTHER"); break; case Types.REAL: sb.append("REAL(" + columnSize + ", " + decimalDigits + ")"); break; case Types.REF: sb.append("REF"); break; /* * No Java 1.6 SQL types for now case Types.ROWID: sb.append("ROWID"); break; */ case Types.SMALLINT: sb.append("SMALLINT(" + columnSize + ")"); break; /* * No Java 1.6 SQL types for now case Types.SQLXML: sb.append("SQLXML(" + columnSize + ")"); break; */ case Types.STRUCT: sb.append("STRUCT"); break; case Types.TIME: sb.append("TIME"); break; case Types.TIMESTAMP: sb.append("TIMESTAMP"); break; case Types.TINYINT: sb.append("TINYINT(" + columnSize + ")"); break; case Types.VARBINARY: sb.append("VARBINARY(" + columnSize + ")"); break; case Types.VARCHAR: sb.append("VARCHAR(" + columnSize + ")"); break; } return sb.toString(); } } class DbTable { String schemaName; String name; String pk; /** * sorted map key=column, value=data type of column */ final Map colsDataType = new TreeMap(); private void addColsDataType(DbColumn columnDefinition) { colsDataType.put(columnDefinition.name, columnDefinition); } private DbColumn getColumn(String cname) { return colsDataType.get(cname); } private boolean hasColumns() { return colsDataType.size() > 0; } } class FactTable extends DbTable { /** * Sorted map key = foreign key col, value=primary key table associated * with this fk. */ final Map fks = new TreeMap(); private void addFks(String fk, String pkt) { fks.put(fk, pkt); } } } // End JdbcMetaData.java mondrian-3.11.0.1-R/src/main/mondrian/gui/JdbcTreeModel.java000066400000000000000000000160041261646570300233700ustar00rootroot00000000000000/* // This software is subject to the terms of the Eclipse Public License v1.0 // Agreement, available at the following URL: // http://www.eclipse.org/legal/epl-v10.html. // You must accept the terms of that agreement to use this software. // // Copyright (C) 2002-2005 Julian Hyde // Copyright (C) 2005-2009 Pentaho and others // All Rights Reserved. */ package mondrian.gui; import org.apache.log4j.Logger; import java.sql.*; import java.util.*; import javax.swing.event.TreeModelListener; import javax.swing.tree.TreePath; /** * * @author sean */ public class JdbcTreeModel implements javax.swing.tree.TreeModel { private static final Logger LOGGER = Logger.getLogger(JdbcTreeModel.class); private Vector treeModelListeners = new Vector(); Connection connection; DatabaseMetaData metadata; List catalogs; Node root; /** Creates a new instance of JDBCTreeModel */ public JdbcTreeModel(Connection c) { connection = c; try { metadata = connection.getMetaData(); catalogs = new ArrayList(); String catalogName = connection.getCatalog(); Node cat = new Node(catalogName, Node.CATALOG); ResultSet trs = metadata.getTables(cat.name, null, null, null); try { while (trs.next()) { // Oracle 10g Driver returns bogus BIN$ tables that cause // exceptions String tbname = trs.getString("TABLE_NAME"); if (!tbname.matches("(?!BIN\\$).+")) { continue; } Node table = new Node(trs.getString(3), Node.TABLE); cat.children.add(table); //get the tables for each catalog. ResultSet crs = metadata.getColumns(cat.name, null, table.name, null); try { while (crs.next()) { Node column = new Node(crs.getString(4), Node.COLUMN); table.children.add(column); } } finally { try { if (crs != null) { crs.close(); } } catch (Exception e) { // ignore } } } } finally { try { if (trs != null) { trs.close(); } } catch (Exception e) { // ignore } } root = cat; } catch (Exception ex) { LOGGER.error("JdbcTreeModel", ex); } } /** Adds a listener for the TreeModelEvent * posted after the tree changes. * * @param l the listener to add * @see #removeTreeModelListener * */ public void addTreeModelListener(TreeModelListener l) { treeModelListeners.add(l); } /** Returns the child of parent at index index * in the parent's * child array. parent must be a node previously obtained * from this data source. This should not return null * if index * is a valid index for parent (that is index >= 0 && * index < getChildCount(parent)). * * @param parent a node in the tree, obtained from this data source * @return the child of parent at index index * */ public Object getChild(Object parent, int index) { if (parent instanceof Node) { return ((Node)parent).children.get(index); } return null; } /** Returns the number of children of parent. * Returns 0 if the node * is a leaf or if it has no children. parent must be a node * previously obtained from this data source. * * @param parent a node in the tree, obtained from this data source * @return the number of children of the node parent * */ public int getChildCount(Object parent) { if (parent instanceof Node) { return ((Node)parent).children.size(); } return 0; } /** Returns the index of child in parent. If parent * is null or child is null, * returns -1. * * @param parent a note in the tree, obtained from this data source * @param child the node we are interested in * @return the index of the child in the parent, or -1 if either * child or parent are null * */ public int getIndexOfChild(Object parent, Object child) { if (parent instanceof Node) { return ((Node)parent).children.indexOf(child); } return -1; } /** Returns the root of the tree. Returns null * only if the tree has no nodes. * * @return the root of the tree * */ public Object getRoot() { return root; } /** Returns true if node is a leaf. * It is possible for this method to return false * even if node has no children. * A directory in a filesystem, for example, * may contain no files; the node representing * the directory is not a leaf, but it also has no children. * * @param node a node in the tree, obtained from this data source * @return true if node is a leaf * */ public boolean isLeaf(Object node) { return getChildCount(node) == 0; } /** Removes a listener previously added with * addTreeModelListener. * * @see #addTreeModelListener * @param l the listener to remove * */ public void removeTreeModelListener(TreeModelListener l) { treeModelListeners.remove(l); } /** Messaged when the user has altered the value for the item identified * by path to newValue. * If newValue signifies a truly new value * the model should post a treeNodesChanged event. * * @param path path to the node that the user has altered * @param newValue the new value from the TreeCellEditor * */ public void valueForPathChanged(TreePath path, Object newValue) { } class Node { static final int CATALOG = 0; static final int TABLE = 1; static final int COLUMN = 2; String name; int type; ArrayList children; public Node(String n, int t) { name = n; type = t; children = new ArrayList(); } public String toString() { return name; } } } // End JdbcTreeModel.java mondrian-3.11.0.1-R/src/main/mondrian/gui/LanguageChangedEvent.java000066400000000000000000000017341261646570300247300ustar00rootroot00000000000000/* // This software is subject to the terms of the Eclipse Public License v1.0 // Agreement, available at the following URL: // http://www.eclipse.org/legal/epl-v10.html. // You must accept the terms of that agreement to use this software. // // Copyright (C) 2007-2007 JasperSoft // Copyright (C) 2008-2009 Pentaho // All Rights Reserved. */ package mondrian.gui; public class LanguageChangedEvent { private java.util.Locale locale; /** Creates a new instance of LanguageChangedEvent */ public LanguageChangedEvent(java.util.Locale locale) { this.locale = locale; } /** Getter for property locale. * @return Value of property locale. * */ public java.util.Locale getLocale() { return locale; } /** Setter for property locale. * @param locale New value of property locale. * */ public void setLocale(java.util.Locale locale) { this.locale = locale; } } // End LanguageChangedEvent.java mondrian-3.11.0.1-R/src/main/mondrian/gui/LanguageChangedListener.java000066400000000000000000000007741261646570300254370ustar00rootroot00000000000000/* // This software is subject to the terms of the Eclipse Public License v1.0 // Agreement, available at the following URL: // http://www.eclipse.org/legal/epl-v10.html. // You must accept the terms of that agreement to use this software. // // Copyright (C) 2007-2007 JasperSoft // Copyright (C) 2008-2009 Pentaho // All Rights Reserved. */ package mondrian.gui; public interface LanguageChangedListener { public void languageChanged(LanguageChangedEvent evt); } // End LanguageChangedListener.java mondrian-3.11.0.1-R/src/main/mondrian/gui/ListRenderer.java000066400000000000000000000033651261646570300233350ustar00rootroot00000000000000/* // This software is subject to the terms of the Eclipse Public License v1.0 // Agreement, available at the following URL: // http://www.eclipse.org/legal/epl-v10.html. // You must accept the terms of that agreement to use this software. // // Copyright (C) 2002-2005 Julian Hyde // Copyright (C) 2005-2011 Pentaho and others // All Rights Reserved. */ package mondrian.gui; import java.awt.*; import javax.swing.*; /** * ListRenderer ... */ class ListRenderer implements ListCellRenderer { // The original ListCellRenderer we want to override ListCellRenderer std; public ListRenderer(ListCellRenderer override) { if (override == null) { throw new NullPointerException( "ListRenderer constructor: default renderer is null"); } std = override; } // Override of getListCellRendererComponent. // This is called by the AWT event thread to paint components. public Component getListCellRendererComponent( JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { // Ask the standard renderer for what it thinks is right Component c = std.getListCellRendererComponent( list, value, index, isSelected, cellHasFocus); if (!isSelected) { // Set the background of the returned component to Aqua // striped background, but only for unselected cells; // The standard renderer functions as desired for // highlighted cells. c.setBackground((Color)UIManager.get("ComboBox.background")); } return c; } } // End ListRenderer.java mondrian-3.11.0.1-R/src/main/mondrian/gui/PreferencesDialog.java000066400000000000000000000515151261646570300243140ustar00rootroot00000000000000/* // This software is subject to the terms of the Eclipse Public License v1.0 // Agreement, available at the following URL: // http://www.eclipse.org/legal/epl-v10.html. // You must accept the terms of that agreement to use this software. // // Copyright (C) 2002-2005 Julian Hyde // Copyright (C) 2005-2009 Pentaho and others // Copyright (C) 2006-2007 Cincom Systems, Inc. // Copyright (C) 2006-2007 JasperSoft // All Rights Reserved. */ package mondrian.gui; import java.awt.event.*; import java.util.*; import javax.swing.*; /** * @author sean */ public class PreferencesDialog extends javax.swing.JDialog { boolean accepted = false; /** * Creates new form PreferencesDialog */ public PreferencesDialog(java.awt.Frame parent, boolean modal) { super(parent, modal); initComponents(); pack(); setLocationRelativeTo(parent); } public boolean accepted() { return accepted; } public void setJDBCConnectionUrl(String s) { this.urlTextField.setText(s); } public String getJdbcConnectionUrl() { return urlTextField.getText(); } public void setJDBCUsername(String s) { this.usernameTextField.setText(s); } public String getJdbcUsername() { return usernameTextField.getText(); } public void setJDBCPassword(String s) { this.passwordTextField.setText(s); } public String getJdbcPassword() { return passwordTextField.getText(); } public void setJDBCDriverClassName(String s) { this.driverClassTextField.setText(s); } public String getJdbcDriverClassName() { return driverClassTextField.getText(); } public void setDatabaseSchema(String schema) { this.schemaTextField.setText(schema); } public String getDatabaseSchema() { return schemaTextField.getText(); } public void setRequireSchema(boolean requireSchema) { requireSchemaButton.setSelected(requireSchema); } public boolean getRequireSchema() { return requireSchemaButton.isSelected(); } /** * @return the workbench i18n converter */ public I18n getResourceConverter() { if (getParent() == null && getParent().getClass() != Workbench.class) { return Workbench.getGlobalResourceConverter(); } return ((Workbench) getParent()).getResourceConverter(); } /** * This method is called from within the constructor to * initialize the form. * WARNING: Do NOT modify this code. The content of this method is * always regenerated by the Form Editor. */ private void initComponents() {//GEN-BEGIN:initComponents java.awt.GridBagConstraints gridBagConstraints; jTabbedPane1 = new javax.swing.JTabbedPane(); jPanel1 = new javax.swing.JPanel(); jLabel1 = new javax.swing.JLabel(); jLabel2 = new javax.swing.JLabel(); jLabel3 = new javax.swing.JLabel(); jLabel4 = new javax.swing.JLabel(); jLabel5 = new javax.swing.JLabel(); jLabel6 = new javax.swing.JLabel(); // Set the url text field to 50 to drive the width of the dialog urlTextField = new javax.swing.JTextField(50); usernameTextField = new javax.swing.JTextField(); passwordTextField = new javax.swing.JTextField(); driverClassTextField = new javax.swing.JTextField(); schemaTextField = new javax.swing.JTextField(); requireSchemaButton = new javax.swing.JCheckBox(); testButton = new javax.swing.JButton(); acceptButton = new javax.swing.JButton(); cancelButton = new javax.swing.JButton(); selectSchemasButton = new javax.swing.JButton(); getContentPane().setLayout(new java.awt.GridBagLayout()); setTitle( getResourceConverter().getString( "preferences.pane.title", "Database Connection")); addWindowListener( new WindowAdapter() { public void windowClosing(WindowEvent evt) { closeDialog(evt); } }); jPanel1.setLayout(new java.awt.GridBagLayout()); jLabel1.setText( getResourceConverter().getString( "preferences.driverClassName.title", "Driver Class Name")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 0; gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST; gridBagConstraints.insets = new java.awt.Insets(4, 4, 4, 4); jPanel1.add(jLabel1, gridBagConstraints); jLabel2.setText( getResourceConverter().getString( "preferences.connectionURL.title", "Connection URL")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 1; gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST; gridBagConstraints.weighty = 1.0; gridBagConstraints.insets = new java.awt.Insets(4, 4, 4, 4); jPanel1.add(jLabel2, gridBagConstraints); jLabel3.setText( getResourceConverter().getString( "preferences.userName.title", "User name")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 2; gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST; gridBagConstraints.weighty = 1.0; gridBagConstraints.insets = new java.awt.Insets(4, 4, 4, 4); jPanel1.add(jLabel3, gridBagConstraints); jLabel4.setText( getResourceConverter().getString( "preferences.password.title", "Password")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 3; gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST; gridBagConstraints.weighty = 1.0; gridBagConstraints.insets = new java.awt.Insets(4, 4, 4, 4); jPanel1.add(jLabel4, gridBagConstraints); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridy = 1; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHEAST; gridBagConstraints.weightx = 1.0; gridBagConstraints.weighty = 1.0; gridBagConstraints.insets = new java.awt.Insets(4, 4, 4, 4); jPanel1.add(urlTextField, gridBagConstraints); jLabel5.setText( getResourceConverter().getString( "preferences.schema.title", "Schemas (Optional, comma separated)")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 4; gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST; gridBagConstraints.weighty = 1.0; gridBagConstraints.insets = new java.awt.Insets(4, 4, 4, 4); jPanel1.add(jLabel5, gridBagConstraints); jLabel6.setText( getResourceConverter().getString( "preferences.requireschema.title", "Require Schema Attributes")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 5; gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST; gridBagConstraints.weighty = 1.0; gridBagConstraints.insets = new java.awt.Insets(4, 4, 4, 4); jPanel1.add(jLabel6, gridBagConstraints); usernameTextField.setText(""); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridy = 2; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHEAST; gridBagConstraints.weightx = 1.0; gridBagConstraints.insets = new java.awt.Insets(4, 4, 4, 4); jPanel1.add(usernameTextField, gridBagConstraints); passwordTextField.setText(""); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridy = 3; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHEAST; gridBagConstraints.weightx = 1.0; gridBagConstraints.insets = new java.awt.Insets(4, 4, 4, 4); jPanel1.add(passwordTextField, gridBagConstraints); schemaTextField.setText(""); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridy = 4; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHEAST; gridBagConstraints.weightx = 1.0; gridBagConstraints.insets = new java.awt.Insets(4, 4, 4, 4); jPanel1.add(schemaTextField, gridBagConstraints); selectSchemasButton.setText( getResourceConverter().getString( "preferences.selectSchemasButton.title", "Select Schemas")); selectSchemasButton.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent evt) { selectSchemasButtonActionPerformed(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 2; gridBagConstraints.gridy = 4; gridBagConstraints.weightx = 1.0; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHEAST; gridBagConstraints.insets = new java.awt.Insets(4, 4, 4, 180); jPanel1.add(selectSchemasButton, gridBagConstraints); // Disable the select schemas button for now selectSchemasButton.setVisible(false); requireSchemaButton.setSelected(false); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridy = 5; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHEAST; gridBagConstraints.weightx = 1.0; gridBagConstraints.insets = new java.awt.Insets(4, 4, 4, 4); jPanel1.add(requireSchemaButton, gridBagConstraints); driverClassTextField.setText("org.gjt.mm.mysql.Driver"); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridy = 0; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHEAST; gridBagConstraints.weightx = 1.0; gridBagConstraints.insets = new java.awt.Insets(4, 4, 4, 4); jPanel1.add(driverClassTextField, gridBagConstraints); jTabbedPane1.addTab( getResourceConverter().getString( "preferences.jdbcPanel.title", "JDBC"), jPanel1); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = 2; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.weightx = 1.0; gridBagConstraints.weighty = 1.0; getContentPane().add(jTabbedPane1, gridBagConstraints); testButton.setText( getResourceConverter().getString( "preferences.testButton.title", "Test Connection")); testButton.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent evt) { testButtonActionPerformed(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridy = 1; gridBagConstraints.weightx = 1.0; gridBagConstraints.anchor = java.awt.GridBagConstraints.SOUTHEAST; gridBagConstraints.insets = new java.awt.Insets(4, 4, 4, 180); getContentPane().add(testButton, gridBagConstraints); cancelButton.setText( getResourceConverter().getString( "preferences.cancelButton.title", "Cancel")); cancelButton.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent evt) { cancelButtonActionPerformed(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridy = 1; gridBagConstraints.anchor = java.awt.GridBagConstraints.SOUTHEAST; gridBagConstraints.insets = new java.awt.Insets(4, 4, 4, 4); getContentPane().add(cancelButton, gridBagConstraints); acceptButton.setText( getResourceConverter().getString( "preferences.acceptButton.title", "Accept")); acceptButton.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent evt) { acceptButtonActionPerformed(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridy = 1; gridBagConstraints.weightx = 1.0; gridBagConstraints.anchor = java.awt.GridBagConstraints.SOUTHEAST; gridBagConstraints.insets = new java.awt.Insets(4, 4, 4, 80); getContentPane().add(acceptButton, gridBagConstraints); pack(); } //GEN-END:initComponents private void selectSchemasButtonActionPerformed( ActionEvent evt) { JdbcMetaData jdbcMetaData = getTestingJdbcMetadata(); if (jdbcMetaData.getErrMsg() != null) { JOptionPane.showMessageDialog( this, getResourceConverter().getFormattedString( "preferences.unsuccessfulTestConnection.alert", "Database connection could not be done.\n{0}", jdbcMetaData.getErrMsg()), "", JOptionPane.WARNING_MESSAGE); return; } List allSchemaNames = jdbcMetaData.listAllSchemas(); if (allSchemaNames == null || allSchemaNames.size() == 0) { JOptionPane.showMessageDialog( this, getResourceConverter().getString( "preferences.noSchemas.cantSetSchemas.alert", "No schemas available for this database connection"), "", JOptionPane.WARNING_MESSAGE); return; } PreferencesSchemasDialog psd = new PreferencesSchemasDialog( this, jdbcMetaData); setVisible(false); setModal(false); psd.setVisible(true); if (psd.isAccepted()) { // update list of schemas } setModal(true); setVisible(true); } public JdbcMetaData getTestingJdbcMetadata() { return new JdbcMetaData( getJdbcDriverClassName(), getJdbcConnectionUrl(), getJdbcUsername(), getJdbcPassword()); } private void testButtonActionPerformed(ActionEvent evt) { //GEN-FIRST:event_testButtonActionPerformed JdbcMetaData jdbcMetaData = getTestingJdbcMetadata(); if (jdbcMetaData.getErrMsg() != null) { JOptionPane.showMessageDialog( this, getResourceConverter().getFormattedString( "preferences.unsuccessfulTestConnection.alert", "Database connection could not be done.\n{0}", jdbcMetaData.getErrMsg()), "", JOptionPane.WARNING_MESSAGE); accepted = false; return; } List allSchemaNames = jdbcMetaData.listAllSchemas(); String currentSchemas = schemaTextField.getText(); // If (schemas entered or schemas required) and // DB does not support schemas // -> error if (allSchemaNames == null || allSchemaNames.size() == 0) { if (currentSchemas != null && currentSchemas.trim().length() > 0) { JOptionPane.showMessageDialog( this, getResourceConverter().getString( "preferences.noSchemas.butSchemasEntered.alert", "No schemas available for this database connection, but schemas entered"), "", JOptionPane.WARNING_MESSAGE); accepted = false; return; } if (requireSchemaButton.isSelected()) { JOptionPane.showMessageDialog( this, getResourceConverter().getString( "preferences.noSchemas.butSchemasRequired.alert", "No schemas available for this database connection, but schemas are required"), "", JOptionPane.WARNING_MESSAGE); accepted = false; return; } } // Validate entered schemas if (currentSchemas != null && currentSchemas.trim().length() > 0) { String schemasArray[] = currentSchemas.trim().split("[,;]"); Set validSchemas = new TreeSet(); StringBuffer schemasInError = new StringBuffer(); for (int i = 0; i < schemasArray.length; i++) { // trim the names, removing empties String enteredSchemaName = schemasArray[i].trim(); if (enteredSchemaName.length() > 0) { for (String actualSchemaName : allSchemaNames) { if (actualSchemaName .equalsIgnoreCase(enteredSchemaName)) { validSchemas.add(enteredSchemaName); break; } } } if (!validSchemas.contains(enteredSchemaName)) { schemasInError.append(" ").append(enteredSchemaName); } } if (schemasInError.length() > 0) { JOptionPane.showMessageDialog( this, getResourceConverter().getFormattedString( "preferences.invalidSchemas.alert", "The following entered schemas are invalid.\n{0}", schemasInError.toString()), "", JOptionPane.WARNING_MESSAGE); accepted = false; return; } } JOptionPane.showMessageDialog( this, getResourceConverter().getString( "preferences.successfulTestConnection.alert", "Database connection successful"), "", JOptionPane.INFORMATION_MESSAGE); accepted = true; } //GEN-LAST:event_testButtonActionPerformed private void acceptButtonActionPerformed(ActionEvent evt) { //GEN-FIRST:event_acceptButtonActionPerformed accepted = true; setVisible(false); } //GEN-LAST:event_acceptButtonActionPerformed private void cancelButtonActionPerformed(ActionEvent evt) { //GEN-FIRST:event_cancelButtonActionPerformed accepted = false; setVisible(false); } //GEN-LAST:event_cancelButtonActionPerformed /** * Closes the dialog */ private void closeDialog(WindowEvent evt) { //GEN-FIRST:event_closeDialog setVisible(false); dispose(); } //GEN-LAST:event_closeDialog // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JTextField driverClassTextField; private javax.swing.JPanel jPanel1; private javax.swing.JTextField urlTextField; private javax.swing.JTextField usernameTextField; private javax.swing.JTextField passwordTextField; private javax.swing.JTextField schemaTextField; private javax.swing.JCheckBox requireSchemaButton; private javax.swing.JButton acceptButton; private javax.swing.JButton testButton; private javax.swing.JTabbedPane jTabbedPane1; private javax.swing.JButton cancelButton; private javax.swing.JButton selectSchemasButton; private javax.swing.JLabel jLabel6; private javax.swing.JLabel jLabel5; private javax.swing.JLabel jLabel4; private javax.swing.JLabel jLabel3; private javax.swing.JLabel jLabel2; private javax.swing.JLabel jLabel1; // End of variables declaration//GEN-END:variables } // End PreferencesDialog.java mondrian-3.11.0.1-R/src/main/mondrian/gui/PreferencesSchemasDialog.java000066400000000000000000000151551261646570300256200ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.gui; import java.awt.*; import java.awt.event.*; import java.util.Arrays; import java.util.List; import javax.swing.*; import javax.swing.table.TableModel; /** * * @author swood */ public class PreferencesSchemasDialog extends JDialog { PreferencesDialog preferences = null; JdbcMetaData jdbcMetadata = null; String selectedSchemaString = null; boolean accepted = false; public PreferencesSchemasDialog() { initComponents(); } public PreferencesSchemasDialog( PreferencesDialog preferences, JdbcMetaData jdbcMetadata) { this.preferences = preferences; this.jdbcMetadata = jdbcMetadata; initComponents(); } private void initComponents() { jScrollPane1 = new javax.swing.JScrollPane(); jTable1 = new javax.swing.JTable(); cancelButton = new javax.swing.JButton(); okButton = new javax.swing.JButton(); setLayout(new java.awt.GridBagLayout()); addWindowListener( new WindowAdapter() { public void windowClosing(WindowEvent evt) { closeDialog(evt); } }); jTable1.setModel(getSchemaTableModel()); jTable1.setRowSelectionAllowed(false); jScrollPane1.setViewportView(jTable1); GridBagConstraints gridBagConstraints = new GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 0; gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTH; gridBagConstraints.insets = new java.awt.Insets(4, 4, 4, 4); add(jScrollPane1, gridBagConstraints); cancelButton.setText( getResourceConverter().getString( "preferences.cancelButton.title", "Cancel")); cancelButton.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent evt) { closeDialog(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridy = 1; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.anchor = java.awt.GridBagConstraints.SOUTHEAST; gridBagConstraints.insets = new java.awt.Insets(4, 4, 4, 4); add(cancelButton, gridBagConstraints); cancelButton.setText( getResourceConverter().getString( "preferences.okButton.title", "OK")); okButton.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent evt) { acceptButtonActionPerformed(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 1; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.anchor = java.awt.GridBagConstraints.SOUTHWEST; gridBagConstraints.insets = new java.awt.Insets(4, 4, 4, 4); add(okButton, gridBagConstraints); pack(); } private void acceptButtonActionPerformed(ActionEvent evt) { TableModel tm = jTable1.getModel(); StringBuffer sb = new StringBuffer(); for (int i = 0; i < tm.getRowCount(); i++) { Boolean selected = (Boolean) tm.getValueAt(i, 0); if (selected) { if (sb.length() > 0) { sb.append(","); } sb.append((String) tm.getValueAt(i, 1)); } } selectedSchemaString = sb.toString(); accepted = true; setVisible(false); dispose(); } private void closeDialog(WindowEvent evt) { setVisible(false); dispose(); } private void closeDialog(ActionEvent evt) { setVisible(false); dispose(); } public boolean isAccepted() { return accepted; } public TableModel getSchemaTableModel() { List allSchemaNames = jdbcMetadata.listAllSchemas(); String currentSchemas = preferences.getDatabaseSchema(); boolean selectedSchemas[] = new boolean[allSchemaNames.size()]; Arrays.fill(selectedSchemas, false); // Validate entered schemas if (currentSchemas != null && currentSchemas.trim().length() > 0) { String schemasArray[] = currentSchemas.trim().split("[,;]"); for (int i = 0; i < schemasArray.length; i++) { // trim the names, removing empties String enteredSchemaName = schemasArray[i].trim(); if (enteredSchemaName.length() > 0) { for (int j = 0; j < allSchemaNames.size(); j++) { String actualSchemaName = allSchemaNames.get(j); if (actualSchemaName.equalsIgnoreCase( enteredSchemaName)) { selectedSchemas[j] = true; break; } } } } } Object [][] table = new Object [allSchemaNames.size()][2]; for (int i = 0; i < allSchemaNames.size(); i++) { table[i][0] = new Boolean(selectedSchemas[i]); table[i][1] = allSchemaNames.get(i); } return new javax.swing.table.DefaultTableModel( table, new String [] { "Select", "Schema" }) { Class[] types = {Boolean.class, String.class}; boolean[] canEdit = {true, false}; public Class getColumnClass(int columnIndex) { return types[columnIndex]; } public boolean isCellEditable(int rowIndex, int columnIndex) { return canEdit[columnIndex]; } }; } /** * @return the workbench i18n converter */ public I18n getResourceConverter() { return preferences.getResourceConverter(); } private javax.swing.JButton cancelButton; private javax.swing.JButton okButton; private javax.swing.JScrollPane jScrollPane1; private javax.swing.JTable jTable1; } // End PreferencesSchemasDialog.java mondrian-3.11.0.1-R/src/main/mondrian/gui/PropertyTableModel.java000066400000000000000000000364241261646570300245120ustar00rootroot00000000000000/* // This software is subject to the terms of the Eclipse Public License v1.0 // Agreement, available at the following URL: // http://www.eclipse.org/legal/epl-v10.html. // You must accept the terms of that agreement to use this software. // // Copyright (C) 2002-2005 Julian Hyde // Copyright (C) 2005-2011 Pentaho and others // Copyright (C) 2006-2007 Cincom Systems, Inc. // All Rights Reserved. */ package mondrian.gui; import org.apache.log4j.Logger; import java.lang.reflect.Field; import java.util.List; /** * @author sean */ public class PropertyTableModel extends javax.swing.table.AbstractTableModel { private static final Logger LOGGER = Logger.getLogger(PropertyTableModel.class); private Object parentTarget; // parent of target private String factTable; // selected fact table private String factTableSchema; // selected fact table schema // List of names for this object's siblings already existing in parent' private List names; private String errorMsg = null; // error msg when property value could not be set. String[] propertyNames; Object target; Workbench workbench; public PropertyTableModel(Workbench wb, Object t, String[] pNames) { super(); workbench = wb; propertyNames = pNames; target = t; } public String getColumnName(int i) { if (i == 0) { return workbench.getResourceConverter().getString( "propertyTableModel.attribute", "Attribute"); } else if (i == 1) { return workbench.getResourceConverter().getString( "propertyTableModel.value", "Value"); } return workbench.getResourceConverter().getString( "propertyTableModel.unknown", "?"); } // get property name for given row no. public String getRowName(int i) { String pName = propertyNames[i]; int j = -1; if ((j = pName.indexOf('|')) != -1) { //"|" return pName.substring(0, j).trim(); } else { return propertyNames[i]; } } public boolean isCellEditable(int row, int col) { if (col == 1) { Object cellObj = getValueAt(row, col); if (cellObj instanceof MondrianGuiDef.Join) { return false; } else { return true; } } return false; } /** * Returns the number of columns in the model. A * JTable uses this method to determine how many columns it * should create and display by default. * * @return the number of columns in the model * @see #getRowCount */ public int getColumnCount() { return 2; //that's 'Property' and 'Value' } /** * Returns the number of rows in the model. A * JTable uses this method to determine how many rows it * should display. This method should be quick, as it * is called frequently during rendering. * * @return the number of rows in the model * @see #getColumnCount */ public int getRowCount() { return propertyNames.length; } /** * Returns the value for the cell at columnIndex and * rowIndex. * * @param rowIndex the row whose value is to be queried * @param columnIndex the column whose value is to be queried * @return the value Object at the specified cell */ public Object getValueAt(int rowIndex, int columnIndex) { if (columnIndex == 0) { return propertyNames[rowIndex]; } else { try { String pName = propertyNames[rowIndex]; if ((pName.indexOf('|')) != -1) { //"formula | formulaElement.cdata" This is for special cases // where more than one field refers to the same value. For // eg. calculated memeber's formula and formulaelement.cdata // refers to the same formula string. These cases arise to // handle xml standards where an attribute can also appear // as an xml tag. Object obj = null; // split field names on | to form an array of property names // strings that are optional. String[] pNames = pName.split( "\\|", 0); for (int j = 0; j < pNames.length; j++) { if ((pNames[j].indexOf('.')) != -1) { // Split string on . to form an array of property // name within the property name. String[] pNamesField = pNames[j].trim().split( "\\.", 0); if (pNamesField.length > 1) { Field f = target.getClass().getField( pNamesField[0].trim()); obj = f.get(target); if (obj != null) { Field f2 = obj.getClass().getField( pNamesField[1].trim()); Object obj2 = f2.get(obj); return obj2; } } return null; } else { Field f = target.getClass().getField(pNames[j].trim()); obj = f.get(target); if (obj != null) { return obj; } } } return obj; } else { // default case where one field refers to one value. Field f = target.getClass().getField(propertyNames[rowIndex]); Object obj = f.get(target); return obj; } } catch (Exception ex) { LOGGER.error("getValueAt(row, index)", ex); return "#ERROR"; } } } public void setValueAt(Object value, int rowIndex, int columnIndex) { setErrorMsg(null); try { String pName = propertyNames[rowIndex]; int i = -1; if ((i = pName.indexOf('|')) != -1) { //"formula | formulaElement.cdata" // save value in the first field name Field f = target.getClass().getField( propertyNames[rowIndex].substring(0, i).trim()); f.set(target, value); // Delete the value from second and remaining field names. split // field names on | to form an array of property names strings // that are optional. String[] pNames = pName.split( "\\|", 0); for (int j = 1; j < pNames.length; j++) { // Split string on . to form an array of property name // within the property name. String[] pNamesField = pNames[j].trim().split( "\\.", 0); Field f2 = target.getClass().getField(pNamesField[0].trim()); f2.set(target, null); } // } else if ((target instanceof MondrianGuiDef.UserDefinedFunction) // && (pName.equals("script"))) // { // ((MondrianGuiDef.UserDefinedFunction) target).script = // (MondrianGuiDef.Script) value; // } else if ((target instanceof MondrianGuiDef.MemberFormatter) // && (pName.equals("script"))) // { // ((MondrianGuiDef.MemberFormatter) target).script = // (MondrianGuiDef.Script) value; // } else if ((target instanceof MondrianGuiDef.CellFormatter) // && (pName.equals("script"))) // { // ((MondrianGuiDef.CellFormatter) target).script = // (MondrianGuiDef.Script) value; // } else if ((target instanceof MondrianGuiDef.PropertyFormatter) // && (pName.equals("script"))) // { // ((MondrianGuiDef.PropertyFormatter) target).script = // (MondrianGuiDef.Script) value; } else if ((target instanceof MondrianGuiDef.Level) && (pName.equals("ordinalExp"))) { ((MondrianGuiDef.Level) target).ordinalExp.expressions[0] = (MondrianGuiDef.SQL) value; } else if ((target instanceof MondrianGuiDef.Level) && (pName.equals("captionExp"))) { ((MondrianGuiDef.Level) target).captionExp.expressions[0] = (MondrianGuiDef.SQL) value; } else if ((target instanceof MondrianGuiDef.Table && pName.equals("name")) || (target instanceof MondrianGuiDef.Hierarchy && pName.equals("primaryKeyTable")) || (target instanceof MondrianGuiDef.Level && pName.equals("table"))) { // updating all table values if (value != null) { // split and save only if value exists String[] aValues = ((String) value).split(JdbcMetaData.LEVEL_SEPARATOR); if (aValues.length == 2) { if (target instanceof MondrianGuiDef.Table) { ((MondrianGuiDef.Table) target).name = aValues[1]; ((MondrianGuiDef.Table) target).schema = aValues[0]; // to refresh the value in schema field also // alongwith table name fireTableDataChanged(); } else { Field f = target.getClass().getField( propertyNames[rowIndex]); f.set(target, aValues[1]); } } else { // Avoids table="" to be set on schema Field f = target.getClass().getField(propertyNames[rowIndex]); setFieldValue(f, value); } } } else if ((target instanceof MondrianGuiDef.Dimension && pName.equals("foreignKey")) || (target instanceof MondrianGuiDef.DimensionUsage && pName.equals("foreignKey")) || (target instanceof MondrianGuiDef.Measure && pName.equals("column")) || (target instanceof MondrianGuiDef.Hierarchy && pName.equals("primaryKey")) || (target instanceof MondrianGuiDef.Level && pName.equals("column")) || (target instanceof MondrianGuiDef.Level && pName.equals("nameColumn")) || (target instanceof MondrianGuiDef.Level && pName.equals("ordinalColumn")) || (target instanceof MondrianGuiDef.Level && pName.equals("parentColumn")) || (target instanceof MondrianGuiDef.Level && pName.equals("captionColumn")) || (target instanceof MondrianGuiDef.Closure && pName.equals("parentColumn")) || (target instanceof MondrianGuiDef.Closure && pName.equals("childColumn")) || (target instanceof MondrianGuiDef.Property && pName.equals("column"))) { // updating all column values if (value != null) { // split and save only if value exists String[] aValues = ((String) value).split(JdbcMetaData.LEVEL_SEPARATOR); Field f = target.getClass().getField(propertyNames[rowIndex]); // Avoids *Column="" to be set on schema. Also remove // column data type with the final split on a dash. value = aValues[aValues.length - 1].split(" - ")[0]; setFieldValue(f, value); } } else { if (propertyNames[rowIndex].equals("name") && (!(target instanceof MondrianGuiDef.Table)) && (!value.equals( target.getClass().getField( propertyNames[rowIndex]).get(target))) && duplicateName(value)) { setErrorMsg( workbench.getResourceConverter().getFormattedString( "propertyTableModel.duplicateValue.error", "Error setting name property. {0} already exists", value.toString())); } else { Field f = target.getClass().getField(propertyNames[rowIndex]); // Avoids property to be set on schema with an empty value. setFieldValue(f, value); } } } catch (Exception ex) { LOGGER.error("setValueAt(aValue, row, index)", ex); } } private void setFieldValue(Field aField, Object aValue) throws IllegalAccessException { if (aValue != null && aValue.toString().trim().length() == 0) { aField.set(target, null); } else { aField.set(target, aValue); } } public Object getValue() { return target; } public Object getParentTarget() { return parentTarget; } public void setParentTarget(Object parentTarget) { this.parentTarget = parentTarget; } public String getFactTable() { return factTable; } public void setFactTable(String factTable) { this.factTable = factTable; } public String getFactTableSchema() { return factTableSchema; } public void setFactTableSchema(String factTableSchema) { this.factTableSchema = factTableSchema; } private boolean duplicateName(Object aValue) { return (names != null && names.contains(aValue)); } public List getNames() { return names; } public void setNames(List names) { this.names = names; } public String getErrorMsg() { return errorMsg; } public void setErrorMsg(String errorMsg) { this.errorMsg = errorMsg; } } // End PropertyTableModel.java mondrian-3.11.0.1-R/src/main/mondrian/gui/QueryPanel.java000066400000000000000000000355651261646570300230270ustar00rootroot00000000000000/* // This software is subject to the terms of the Eclipse Public License v1.0 // Agreement, available at the following URL: // http://www.eclipse.org/legal/epl-v10.html. // You must accept the terms of that agreement to use this software. // // Copyright (C) 2002-2005 Julian Hyde // Copyright (C) 2005-2011 Pentaho and others // Copyright (C) 2006-2007 Cincom Systems, Inc. // All Rights Reserved. */ package mondrian.gui; import mondrian.gui.validate.ValidationUtils; import mondrian.olap.*; import mondrian.olap.Util.PropertyList; import org.apache.log4j.Logger; import java.awt.*; import java.awt.event.*; import java.io.*; import java.util.*; import java.util.List; import javax.swing.*; import javax.swing.text.DefaultEditorKit; /** * @author sean */ public class QueryPanel extends javax.swing.JPanel { private static final Logger LOGGER = Logger.getLogger(QueryPanel.class); Connection connection; JMenuItem queryMenuItem; int windowMenuIndex; // map of schema frames and schema menu items Map schemaWindowMap; final Workbench workbench; /** * Creates new form QueryPanel */ public QueryPanel(Workbench workbench) { this.workbench = workbench; initComponents(); } public void setConnection(Connection c) { connection = c; } public Connection getConnection() { return connection; } //==================================================== public void setMenuItem(JMenuItem mi) { this.queryMenuItem = mi; } public void setSchemaWindowMap( Map schemaWindowMap) { this.schemaWindowMap = schemaWindowMap; setCatalogs(); } private void setCatalogs() { List v = new ArrayList(); Iterator it = schemaWindowMap.values().iterator(); while (it.hasNext()) { JMenuItem elem = it.next(); v.add(elem.getText()); } ComboBoxModel cCatalogs = new DefaultComboBoxModel(new Vector(v)); schemaList.setModel(cCatalogs); } public void setWindowMenuIndex(int i) { this.windowMenuIndex = i; } /** * @return the workbench i18n converter */ public I18n getResourceConverter() { return workbench.getResourceConverter(); } public void initConnection(String smenutext) { schemaList.setSelectedItem(smenutext); connectButtonActionPerformed(null); } //===================================================== /** * This method is called from within the constructor to * initialize the form. * WARNING: Do NOT modify this code. The content of this method is * always regenerated by the Form Editor. */ private void initComponents() { jScrollPane3 = new javax.swing.JScrollPane(); executeButton = new javax.swing.JButton(); jSplitPane1 = new javax.swing.JSplitPane(); jScrollPane1 = new javax.swing.JScrollPane(); queryTextPane = new javax.swing.JTextPane(); jScrollPane2 = new javax.swing.JScrollPane(); resultTextPane = new javax.swing.JTextPane(); connectButton = new javax.swing.JButton(); jPopupMenu = new JPopupMenu(); jPopupMenu.add(new DefaultEditorKit.CutAction()); jPopupMenu.add(new DefaultEditorKit.CopyAction()); jPopupMenu.add(new DefaultEditorKit.PasteAction()); schemaScrollPane1 = new javax.swing.JScrollPane(); schemaLabel = new javax.swing.JLabel(); schemaList = new JComboBox( new String[]{ getResourceConverter().getString( "common.join.title", "Join"), getResourceConverter().getString( "common.table.title", "Table") }); //schemaScrollPane1.setViewportView(schemaList); schemaPanel = new JPanel(); //schemaPanel.setLayout(new BorderLayout(25,0)); schemaPanel.setLayout(new FlowLayout(FlowLayout.LEFT, 10, 0)); setLayout(new java.awt.BorderLayout()); schemaLabel.setFont(new Font("Dialog", 1, 12)); schemaLabel.setForeground( (Color) UIManager.getDefaults().get( "CheckBoxMenuItem.acceleratorForeground")); schemaLabel.setHorizontalAlignment(SwingConstants.CENTER); schemaLabel.setText( getResourceConverter().getString( "common.schema.title", "Schema")); //schemaLabel.setBorder(new EtchedBorder()); schemaList.setBackground(Color.white); final JPanel qpanel = this; schemaList.addItemListener( new ItemListener() { public void itemStateChanged(ItemEvent e) { } }); connectButton.setText( getResourceConverter().getString( "queryPanel.connect.title", "Connect")); connectButton.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent evt) { connectButtonActionPerformed(evt); } }); schemaPanel.add(schemaLabel); //java.awt.BorderLayout.WEST schemaPanel.add(schemaList); schemaPanel.add(connectButton); add(schemaPanel, java.awt.BorderLayout.NORTH); executeButton.setText( getResourceConverter().getString( "queryPanel.execute.title", "Execute")); executeButton.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent evt) { executeButtonActionPerformed(evt); } }); add(executeButton, java.awt.BorderLayout.SOUTH); jSplitPane1.setDividerLocation(100); jSplitPane1.setOrientation(javax.swing.JSplitPane.VERTICAL_SPLIT); queryTextPane.setFont(new java.awt.Font("Courier New", 0, 12)); queryTextPane.setText(""); queryTextPane.addMouseListener( new MouseAdapter() { // From MouseAdapter javadoc: // // Popup menus are triggered differently // on different systems. Therefore, isPopupTrigger // should be checked in both mousePressed // and mouseReleased // for proper cross-platform functionality. public void mousePressed(MouseEvent e) { checkPopupTrigger(e); } public void mouseReleased(MouseEvent e) { checkPopupTrigger(e); } public void checkPopupTrigger(MouseEvent e) { if (e.isPopupTrigger()) { int x = e.getX(); int y = e.getY(); jPopupMenu.show(queryTextPane, x, y); } } }); jScrollPane1.setViewportView(queryTextPane); jSplitPane1.setTopComponent(jScrollPane1); resultTextPane.setEditable(false); resultTextPane.setFont(new java.awt.Font("Courier New", 0, 12)); jScrollPane2.setViewportView(resultTextPane); jSplitPane1.setBottomComponent(jScrollPane2); add(jSplitPane1, java.awt.BorderLayout.CENTER); } private void executeButtonActionPerformed(ActionEvent evt) { //run the query, and show the results. try { if (connection == null) { JOptionPane.showMessageDialog( this, getResourceConverter().getString( "queryPanel.noConnection.alert", "No Mondrian connection. Select a Schema to connect."), getResourceConverter().getString( "common.alertDialog.title", "Alert"), JOptionPane.WARNING_MESSAGE); return; } //common.alertDialog.title Query q = connection.parseQuery(queryTextPane.getText()); Result r = connection.execute(q); //document = DomBuilder.build(getResult()); java.io.StringWriter sw = new java.io.StringWriter(); java.io.PrintWriter pw = new java.io.PrintWriter(sw); r.print(pw); resultTextPane.setText(sw.getBuffer().toString()); } catch (Exception ex) { ByteArrayOutputStream os = new ByteArrayOutputStream(); PrintStream p = new PrintStream(os); Throwable e = ex; while (e != null) { p.println(e.getLocalizedMessage()); LOGGER.error("", e); Throwable prev = e; e = e.getCause(); if (e == prev) { break; } p.println(); } resultTextPane.setText(os.toString()); } } private void connectButtonActionPerformed(ActionEvent evt) { File sfile = null; try { String sfname = (String) schemaList.getSelectedItem(); JInternalFrame sf = lookupFrame(sfname); if (sf == null) { // this case may arise when a schema file is opened, mdx query // is opened and the schema frame is closed JOptionPane.showMessageDialog( this, getResourceConverter().getString( "queryPanel.schemaNotOpen.alert", "Schema file is not open"), getResourceConverter().getString( "common.errorDialog.title", "Error"), JOptionPane.ERROR_MESSAGE); return; } SchemaExplorer se = (SchemaExplorer) sf.getContentPane().getComponent(0); if (se.isNewFile()) { JOptionPane.showMessageDialog( this, getResourceConverter().getString( "queryPanel.saveSchemaFirst.alert", "You must first save the Schema to open a Mondrian connection"), getResourceConverter().getString( "common.alertDialog.title", "Alert"), JOptionPane.WARNING_MESSAGE); sf.setSelected(true); return; } sfile = se.getSchemaFile(); PropertyList list = new PropertyList(); list.put("Provider", "mondrian"); list.put("Jdbc", se.getJdbcConnectionUrl()); list.put("Catalog", se.getSchemaFile().toURL().toString()); final String jdbcUsername = se.getJdbcUsername(); if (!ValidationUtils.isEmpty(jdbcUsername)) { list.put("JdbcUser", jdbcUsername); } final String jdbcPassword = se.getJdbcPassword(); if (!ValidationUtils.isEmpty(jdbcPassword)) { list.put("JdbcPassword", jdbcPassword); } Connection con = DriverManager.getConnection(list, null); // clear cache before connecting con.getCacheControl(null).flushSchemaCache(); if (con != null) { connection = con; queryMenuItem.setText( getResourceConverter().getFormattedString( "queryPanel.successfulConnection.menuItem", "{0} MDX - {1}", Integer.toString(windowMenuIndex), se.getSchemaFile().getName())); Component o = this; while (o != null) { if (o.getClass() == JInternalFrame.class) { ((JInternalFrame) o).setTitle( getResourceConverter().getFormattedString( "queryPanel.successfulConnection.internalFrame.title", "MDX Query - connected to {0}", se.getSchemaFile().getName())); break; } o = o.getParent(); } JOptionPane.showMessageDialog( this, "Mondrian connection Successful.", getResourceConverter().getString( "common.informationDialog.title", "Information"), JOptionPane.INFORMATION_MESSAGE); } else { JOptionPane.showMessageDialog( this, getResourceConverter().getFormattedString( "queryPanel.unsuccessfulConnection.alert", "Mondrian connection could not be done for - {0}", se.getSchemaFile().getName()), getResourceConverter().getString( "common.errorDialog.title", "Error"), JOptionPane.ERROR_MESSAGE); } } catch (Exception ex) { LOGGER.error("Exception: " + ex.getMessage(), ex); JOptionPane.showMessageDialog( this, getResourceConverter().getFormattedString( "queryPanel.unsuccessfulConnection.exception", "Mondrian connection could not be done for - {0}", sfile == null ? getResourceConverter().getString( "queryPanel.selectedSchema.alert", "selected Schema") : sfile.getName()), getResourceConverter().getString( "common.errorDialog.title", "Error"), JOptionPane.ERROR_MESSAGE); resultTextPane.setText(getResourceConverter().getFormattedString( "queryPanel.exceptionMessage", "Exception: {0}\n\nSee workbench log for full stacktrace.", ex.getMessage())); } } private JInternalFrame lookupFrame(String sfname) { JInternalFrame sf = null; for (Map.Entry entry : schemaWindowMap.entrySet()) { if ((entry.getValue()).getText().equals(sfname)) { sf = entry.getKey(); break; } } return sf; } // Variables declaration - do not modify private javax.swing.JScrollPane jScrollPane3; private javax.swing.JScrollPane jScrollPane2; private javax.swing.JTextPane resultTextPane; private javax.swing.JScrollPane jScrollPane1; private javax.swing.JTextPane queryTextPane; private javax.swing.JSplitPane jSplitPane1; private javax.swing.JButton executeButton; private javax.swing.JComboBox schemaList; private JLabel schemaLabel; private JPanel schemaPanel; private javax.swing.JScrollPane schemaScrollPane1; private javax.swing.JButton connectButton; private JPopupMenu jPopupMenu; // End of variables declaration } // End QueryPanel.java mondrian-3.11.0.1-R/src/main/mondrian/gui/SchemaExplorer.java000066400000000000000000006512341261646570300236600ustar00rootroot00000000000000/* // This software is subject to the terms of the Eclipse Public License v1.0 // Agreement, available at the following URL: // http://www.eclipse.org/legal/epl-v10.html. // You must accept the terms of that agreement to use this software. // // Copyright (C) 2002-2005 Julian Hyde // Copyright (C) 2005-2015 Pentaho and others // Copyright (C) 2006-2007 CINCOM SYSTEMS, INC. // All Rights Reserved. */ package mondrian.gui; import org.apache.log4j.Logger; import org.eigenbase.xom.*; import java.awt.*; import java.awt.event.*; import java.io.*; import java.lang.reflect.Array; import java.lang.reflect.Field; import java.util.*; import java.util.List; import javax.swing.*; import javax.swing.border.EtchedBorder; import javax.swing.event.*; import javax.swing.plaf.basic.BasicArrowButton; import javax.swing.table.*; import javax.swing.text.DefaultEditorKit; import javax.swing.text.PlainDocument; import javax.swing.tree.*; /** * @author sean */ public class SchemaExplorer extends javax.swing.JPanel implements TreeSelectionListener, CellEditorListener { private static final Logger LOGGER = Logger.getLogger(SchemaExplorer.class); private final Workbench workbench; private MondrianGuiDef.Schema schema; private SchemaTreeModel model; private SchemaTreeCellRenderer renderer; private File schemaFile; private JTreeUpdater updater; private final ClassLoader myClassLoader; private boolean newFile; // indicates file is without changes, dirty=true when some changes are made // to the file private boolean dirty = false; // indicates dirty status shown on title private boolean dirtyFlag = false; private JInternalFrame parentIFrame; private JdbcMetaData jdbcMetaData; private boolean editModeXML = false; private String errMsg = null; /** * Creates new form SchemaExplorer */ public SchemaExplorer(Workbench workbench) { this.workbench = workbench; myClassLoader = this.getClass().getClassLoader(); initComponents(); } public SchemaExplorer( Workbench workbench, File f, JdbcMetaData jdbcMetaData, boolean newFile, JInternalFrame parentIFrame) { this(workbench); alert = getResourceConverter().getString( "schemaExplorer.alert.title", "Alert"); // XML editor try { jEditorPaneXML = new JEditorPane(); } catch (Exception ex) { LOGGER.error("SchemaExplorer-JEditorPane", ex); } jEditorPaneXML.setLayout(new java.awt.BorderLayout()); jEditorPaneXML.setEditable(false); jScrollPaneXML = new JScrollPane(jEditorPaneXML); jPanelXML.setLayout(new java.awt.BorderLayout()); jPanelXML.add(jScrollPaneXML, java.awt.BorderLayout.CENTER); jPanelXML.add(targetLabel2, java.awt.BorderLayout.NORTH); jPanelXML.add(validStatusLabel2, java.awt.BorderLayout.SOUTH); jPanelXML.setMaximumSize(jPanel1.getMaximumSize()); jPanelXML.setPreferredSize(jPanel1.getPreferredSize()); databaseLabel.setText( getResourceConverter().getFormattedString( "schemaExplorer.database.text", "Database - {0} ({1})", nvl(jdbcMetaData.getDbCatalogName()), jdbcMetaData.getDatabaseProductName())); try { Parser xmlParser = XOMUtil.createDefaultParser(); this.schemaFile = f; this.setNewFile(newFile); this.parentIFrame = parentIFrame; this.jdbcMetaData = jdbcMetaData; if (newFile) { schema = new MondrianGuiDef.Schema(); schema.parameters = new MondrianGuiDef.Parameter[0]; schema.cubes = new MondrianGuiDef.Cube[0]; schema.dimensions = new MondrianGuiDef.Dimension[0]; schema.namedSets = new MondrianGuiDef.NamedSet[0]; schema.roles = new MondrianGuiDef.Role[0]; schema.userDefinedFunctions = new MondrianGuiDef.UserDefinedFunction[0]; schema.virtualCubes = new MondrianGuiDef.VirtualCube[0]; String sname = schemaFile.getName(); int ext = sname.indexOf("."); if (ext != -1) { schema.name = "New " + sname.substring(0, ext); } } else { try { schema = new MondrianGuiDef.Schema( xmlParser.parse( schemaFile.toURL())); } catch (XOMException ex) { // Parsing error of the schema file causes default tree of // colors etc. to be displayed in schema explorer. // Initialize the schema to display an empty schema if you // want to show schema explorer for file where parsing // failed. ex.printStackTrace(); schema = new MondrianGuiDef.Schema(); schema.parameters = new MondrianGuiDef.Parameter[0]; schema.cubes = new MondrianGuiDef.Cube[0]; schema.dimensions = new MondrianGuiDef.Dimension[0]; schema.namedSets = new MondrianGuiDef.NamedSet[0]; schema.roles = new MondrianGuiDef.Role[0]; schema.userDefinedFunctions = new MondrianGuiDef.UserDefinedFunction[0]; schema.virtualCubes = new MondrianGuiDef.VirtualCube[0]; LOGGER.error( "Exception : Schema file parsing failed." + ex.getMessage(), ex); errMsg = getResourceConverter().getFormattedString( "schemaExplorer.parsing.error", "Parsing Error: Could not open file {0}\n{1}", schemaFile.toString(), ex.getLocalizedMessage()); } } // sets title of i frame with schema name and file name setTitle(); renderer = new SchemaTreeCellRenderer(workbench, jdbcMetaData); model = new SchemaTreeModel(schema); tree.setModel(model); tree.setCellRenderer(renderer); tree.addTreeSelectionListener(this); JComboBox listEditor = new JComboBox( new String[]{ getResourceConverter().getString( "schemaExplorer.hierarchy.select.join", "Join"), getResourceConverter().getString( "schemaExplorer.hierarchy.select.table", "Table") }); listEditor.setToolTipText( getResourceConverter().getString( "schemaExplorer.hierarchy.select.title", "Select Join or Table Hierarchy")); listEditor.setPreferredSize( new java.awt.Dimension( listEditor.getPreferredSize().width, 24)); // Do not remove this listEditor.addItemListener( new ItemListener() { public void itemStateChanged(ItemEvent e) { tree.stopEditing(); TreePath tpath = tree.getSelectionPath(); if (tpath != null) { TreePath parentpath = tpath.getParentPath(); if (parentpath != null) { refreshTree(parentpath); } } } }); TreeCellEditor comboEditor = new DefaultCellEditor(listEditor); SchemaTreeCellEditor editor = new SchemaTreeCellEditor( workbench, tree, renderer, comboEditor); tree.setCellEditor(editor); tree.setEditable(true); SchemaPropertyCellEditor spce = new SchemaPropertyCellEditor( workbench, jdbcMetaData); spce.addCellEditorListener(this); propertyTable.setDefaultEditor(Object.class, spce); // to set background color of attribute columns SchemaPropertyCellRenderer.attributeBackground = jScrollPane2.getBackground(); SchemaPropertyCellRenderer spcr = new SchemaPropertyCellRenderer(workbench); propertyTable.setDefaultRenderer(Object.class, spcr); } catch (Exception ex) { LOGGER.error("SchemaExplorer init error", ex); } } private static String nvl(String s) { return s == null ? "" : s; } /** * Called from within the constructor to initialize the form. */ private void initComponents() { jPanelXML = new JPanel(); jScrollPaneXML = new JScrollPane(); footer = new JPanel(); databaseLabel = new javax.swing.JLabel(); jSeparator1 = new JSeparator(); jSeparator2 = new JSeparator(); jSplitPane1 = new JSplitPane(); jPanel1 = new JPanel(); jScrollPane2 = new JScrollPane(); // propertyTable includes changeSelection and processKeyEvent // processing for keyboard navigation propertyTable = new JTable() { public void changeSelection( int rowIndex, int columnIndex, boolean toggle, boolean extend) { if (columnIndex == 0) { AWTEvent currentEvent = EventQueue.getCurrentEvent(); if (currentEvent instanceof KeyEvent) { KeyEvent ke = (KeyEvent) currentEvent; int kcode = ke.getKeyCode(); if (kcode == KeyEvent.VK_TAB) { if ((ke.getModifiersEx() & InputEvent.SHIFT_DOWN_MASK) == InputEvent.SHIFT_DOWN_MASK) { rowIndex -= 1; if (rowIndex < 0) { rowIndex = propertyTable.getRowCount() - 1; } } setTableCellFocus(rowIndex); return; } } } super.changeSelection(rowIndex, columnIndex, toggle, extend); } public void processKeyEvent(KeyEvent e) { int kcode = e.getKeyCode(); if (kcode == KeyEvent.VK_UP || kcode == KeyEvent.VK_DOWN) { int row = propertyTable.getSelectedRow(); setTableCellFocus(row); return; } super.processKeyEvent(e); } }; targetLabel = new javax.swing.JLabel(); validStatusLabel = new javax.swing.JLabel(); targetLabel2 = new javax.swing.JLabel(); validStatusLabel2 = new javax.swing.JLabel(); jPanel2 = new JPanel(); jScrollPane1 = new JScrollPane(); tree = new JTree(); tree.getSelectionModel().setSelectionMode( DefaultTreeSelectionModel.SINGLE_TREE_SELECTION); ToolTipManager.sharedInstance().registerComponent(tree); jToolBar1 = new JToolBar(); addCubeButton = new JButton(); addDimensionButton = new JButton(); addDimensionUsageButton = new JButton(); addHierarchyButton = new JButton(); addNamedSetButton = new JButton(); addUserDefinedFunctionButton = new JButton(); addRoleButton = new JButton(); addMeasureButton = new JButton(); addCalculatedMemberButton = new JButton(); addLevelButton = new JButton(); addPropertyButton = new JButton(); addCalculatedMemberPropertyButton = new JButton(); addVirtualCubeButton = new JButton(); addVirtualCubeDimensionButton = new JButton(); addVirtualCubeMeasureButton = new JButton(); cutButton = new JButton(new DefaultEditorKit.CutAction()); copyButton = new JButton(new DefaultEditorKit.CopyAction()); pasteButton = new JButton(new DefaultEditorKit.PasteAction()); deleteButton = new JButton(); editModeButton = new JToggleButton(); setLayout(new BorderLayout()); jSplitPane1.setDividerLocation(200); jPanel1.setLayout(new BorderLayout()); propertyTable.setModel( new DefaultTableModel( new Object[][]{ }, new String[]{ getResourceConverter().getString( "schemaExplorer.propertyTable.attribute", "Attribute"), getResourceConverter().getString( "schemaExplorer.propertyTable.value", "Value") }) { Class[] types = {String.class, Object.class}; boolean[] canEdit = {false, true}; public Class getColumnClass(int columnIndex) { return types[columnIndex]; } public boolean isCellEditable(int rowIndex, int columnIndex) { return canEdit[columnIndex]; } }); // Set property table column headers to bold. propertyTable.getTableHeader().setFont( new Font( "Dialog", Font.BOLD, 12)); jScrollPane2.setViewportView(propertyTable); jPanel1.add(jScrollPane2, java.awt.BorderLayout.CENTER); targetLabel.setFont(new Font("Dialog", 1, 14)); targetLabel.setForeground( (Color) UIManager.getDefaults().get( "CheckBoxMenuItem.acceleratorForeground")); targetLabel.setHorizontalAlignment(SwingConstants.CENTER); targetLabel.setText( getResourceConverter().getString( "schemaExplorer.targetLabel.title", "Schema")); targetLabel.setBorder(new EtchedBorder()); // up arrow button for property table heading jPanel3 = new JPanel(); jPanel3.setLayout(new BorderLayout()); BasicArrowButton arrowButtonUp = new BasicArrowButton(SwingConstants.NORTH); BasicArrowButton arrowButtonDown = new BasicArrowButton(SwingConstants.SOUTH); arrowButtonUp.setToolTipText( getResourceConverter().getString( "schemaExplorer.arrowButtonUp.toolTip", "move to parent element")); arrowButtonDown.setToolTipText( getResourceConverter().getString( "schemaExplorer.arrowButtonDown.toolTip", "move to child element")); arrowButtonUpAction = new AbstractAction( getResourceConverter().getString( "schemaExplorer.arrowButtonUp.title", "Arrow button up")) { public void actionPerformed(ActionEvent e) { arrowButtonUpAction(e); } }; arrowButtonDownAction = new AbstractAction( getResourceConverter().getString( "schemaExplorer.arrowButtonDown.title", "Arrow button down")) { public void actionPerformed(ActionEvent e) { arrowButtonDownAction(e); } }; arrowButtonUp.addActionListener(arrowButtonUpAction); arrowButtonDown.addActionListener(arrowButtonDownAction); jPanel3.add(arrowButtonDown, java.awt.BorderLayout.EAST); jPanel3.add(arrowButtonUp, java.awt.BorderLayout.WEST); jPanel3.add(targetLabel, java.awt.BorderLayout.CENTER); jPanel1.add(jPanel3, java.awt.BorderLayout.NORTH); validStatusLabel.setFont(new Font("Dialog", Font.PLAIN, 12)); validStatusLabel.setForeground(Color.RED); validStatusLabel.setHorizontalAlignment(SwingConstants.CENTER); jPanel1.add(validStatusLabel, java.awt.BorderLayout.SOUTH); // for XML viewing targetLabel2.setFont(new Font("Dialog", 1, 14)); targetLabel2.setForeground( (Color) UIManager.getDefaults().get( "CheckBoxMenuItem.acceleratorForeground")); targetLabel2.setHorizontalAlignment(SwingConstants.CENTER); targetLabel2.setText( getResourceConverter().getString( "schemaExplorer.targetLabel.title", "Schema")); targetLabel2.setBorder(new EtchedBorder()); validStatusLabel2.setFont(new Font("Dialog", Font.PLAIN, 12)); validStatusLabel2.setForeground(Color.RED); validStatusLabel2.setHorizontalAlignment(SwingConstants.CENTER); jSplitPane1.setRightComponent(jPanel1); jPanel2.setLayout(new java.awt.BorderLayout()); jScrollPane1.setViewportView(tree); jPanel2.add(jScrollPane1, java.awt.BorderLayout.CENTER); jSplitPane1.setLeftComponent(jPanel2); // ======================================================== // actions // ======================================================== addCube = new AbstractAction( getResourceConverter().getString( "schemaExplorer.addCube.title", "Add Cube")) { public void actionPerformed(ActionEvent e) { addCube(e); } }; addParameter = new AbstractAction( getResourceConverter().getString( "schemaExplorer.addParameter.title", "Add Parameter")) { public void actionPerformed(ActionEvent e) { addParameter(e); } }; addDimension = new AbstractAction( getResourceConverter().getString( "schemaExplorer.addDimension.title", "Add Dimension")) { public void actionPerformed(ActionEvent e) { addDimension(e); } }; addDimensionUsage = new AbstractAction( getResourceConverter().getString( "schemaExplorer.addDimensionUsage.title", "Add Dimension Usage")) { public void actionPerformed(ActionEvent e) { addDimensionUsage(e); } }; addHierarchy = new AbstractAction( getResourceConverter().getString( "schemaExplorer.addHierarchy.title", "Add Hierarchy")) { public void actionPerformed(ActionEvent e) { addHierarchy(e); } }; addNamedSet = new AbstractAction( getResourceConverter().getString( "schemaExplorer.addNamedSet.title", "Add Named Set")) { public void actionPerformed(ActionEvent e) { addNamedSet(e); } }; addMeasure = new AbstractAction( getResourceConverter().getString( "schemaExplorer.addMeasure.title", "Add Measure")) { public void actionPerformed(ActionEvent e) { addMeasure(e); } }; addCalculatedMember = new AbstractAction( getResourceConverter().getString( "schemaExplorer.addCalculatedMember.title", "Add Calculated Member")) { public void actionPerformed(ActionEvent e) { addCalculatedMember(e); } }; addUserDefinedFunction = new AbstractAction( getResourceConverter().getString( "schemaExplorer.addUserDefinedFunction.title", "Add User Defined Function")) { public void actionPerformed(ActionEvent e) { addUserDefinedFunction(e); } }; addScript = new AbstractAction( getResourceConverter().getString( "schemaExplorer.addScript.title", "Add Script")) { public void actionPerformed(ActionEvent e) { addScript(e); } }; addCellFormatter = new AbstractAction( getResourceConverter().getString( "schemaExplorer.addCellFormatter.title", "Add Cell Formatter")) { public void actionPerformed(ActionEvent e) { addCellFormatter(e); } }; addPropertyFormatter = new AbstractAction( getResourceConverter().getString( "schemaExplorer.addPropertyFormatter.title", "Add Property Formatter")) { public void actionPerformed(ActionEvent e) { addPropertyFormatter(e); } }; addMemberFormatter = new AbstractAction( getResourceConverter().getString( "schemaExplorer.addMemberFormatter.title", "Add Member Formatter")) { public void actionPerformed(ActionEvent e) { addMemberFormatter(e); } }; addRole = new AbstractAction( getResourceConverter().getString( "schemaExplorer.addRole.title", "Add Role")) { public void actionPerformed(ActionEvent e) { addRole(e); } }; addSchemaGrant = new AbstractAction( getResourceConverter().getString( "schemaExplorer.addSchemaGrant.title", "Add Schema Grant")) { public void actionPerformed(ActionEvent e) { addSchemaGrant(e); } }; addCubeGrant = new AbstractAction( getResourceConverter().getString( "schemaExplorer.addCubeGrant.title", "Add Cube Grant")) { public void actionPerformed(ActionEvent e) { addCubeGrant(e); } }; addDimensionGrant = new AbstractAction( getResourceConverter().getString( "schemaExplorer.addDimensionGrant.title", "Add Dimension Grant")) { public void actionPerformed(ActionEvent e) { addDimensionGrant(e); } }; addHierarchyGrant = new AbstractAction( getResourceConverter().getString( "schemaExplorer.addHierarchyGrant.title", "Add Hierarchy Grant")) { public void actionPerformed(ActionEvent e) { addHierarchyGrant(e); } }; addMemberGrant = new AbstractAction( getResourceConverter().getString( "schemaExplorer.addMemberGrant.title", "Add Member Grant")) { public void actionPerformed(ActionEvent e) { addMemberGrant(e); } }; addAnnotations = new AbstractAction( getResourceConverter().getString( "schemaExplorer.addAnnotations.title", "Add Annotations")) { public void actionPerformed(ActionEvent e) { addAnnotations(e); } }; addAnnotation = new AbstractAction( getResourceConverter().getString( "schemaExplorer.addAnnotation.title", "Add Annotation")) { public void actionPerformed(ActionEvent e) { addAnnotation(e); } }; addLevel = new AbstractAction( getResourceConverter().getString( "schemaExplorer.addLevel.title", "Add Level")) { public void actionPerformed(ActionEvent e) { addLevel(e); } }; addClosure = new AbstractAction( getResourceConverter().getString( "schemaExplorer.addClosure.title", "Add Closure")) { public void actionPerformed(ActionEvent e) { addClosure(e); } }; addKeyExp = new AbstractAction( getResourceConverter().getString( "schemaExplorer.addKeyExpression.title", "Add Key Expression")) { public void actionPerformed(ActionEvent e) { addKeyExp(e); } }; addNameExp = new AbstractAction( getResourceConverter().getString( "schemaExplorer.addNameExpression.title", "Add Name Expression")) { public void actionPerformed(ActionEvent e) { addNameExp(e); } }; addOrdinalExp = new AbstractAction( getResourceConverter().getString( "schemaExplorer.addOrdinalExpression.title", "Add Ordinal Expression")) { public void actionPerformed(ActionEvent e) { addOrdinalExp(e); } }; addCaptionExp = new AbstractAction( getResourceConverter().getString( "schemaExplorer.addCaptionExpression.title", "Add Caption Expression")) { public void actionPerformed(ActionEvent e) { addCaptionExp(e); } }; addParentExp = new AbstractAction( getResourceConverter().getString( "schemaExplorer.addParentExpression.title", "Add Parent Expression")) { public void actionPerformed(ActionEvent e) { addParentExp(e); } }; addMeasureExp = new AbstractAction( getResourceConverter().getString( "schemaExplorer.addMeasureExpression.title", "Add Measure Expression")) { public void actionPerformed(ActionEvent e) { addMeasureExp(e); } }; addFormula = new AbstractAction( getResourceConverter().getString( "schemaExplorer.addFormula.title", "Add Formula")) { public void actionPerformed(ActionEvent e) { addFormula(e); } }; addSQL = new AbstractAction( getResourceConverter().getString( "schemaExplorer.addSQL.title", "Add SQL")) { public void actionPerformed(ActionEvent e) { addSQL(e); } }; addTable = new AbstractAction( getResourceConverter().getString( "schemaExplorer.addTable.title", "Add Table")) { public void actionPerformed(ActionEvent e) { addTable(e); } }; addJoin = new AbstractAction( getResourceConverter().getString( "schemaExplorer.addJoin.title", "Add Join")) { public void actionPerformed(ActionEvent e) { addJoin(e); } }; addView = new AbstractAction( getResourceConverter().getString( "schemaExplorer.addView.title", "Add View")) { public void actionPerformed(ActionEvent e) { addView(e); } }; addInlineTable = new AbstractAction( getResourceConverter().getString( "schemaExplorer.addInlineTable.title", "Add Inline Table")) { public void actionPerformed(ActionEvent e) { addInlineTable(e); } }; moveLevelUp = new AbstractAction( getResourceConverter().getString( "schemaExplorer.moveLevelUp.title", "Move Up")) { public void actionPerformed(ActionEvent e) { moveLevelUp(e); } }; moveLevelDown = new AbstractAction( getResourceConverter().getString( "schemaExplorer.moveLevelDown.title", "Move Down")) { public void actionPerformed(ActionEvent e) { moveLevelDown(e); } }; addProperty = new AbstractAction( getResourceConverter().getString( "schemaExplorer.addProperty.title", "Add Property")) { public void actionPerformed(ActionEvent e) { addProperty(e); } }; addCalculatedMemberProperty = new AbstractAction( getResourceConverter().getString( "schemaExplorer.addCalculatedMemberProperty.title", "Add Calculated Member Property")) { public void actionPerformed(ActionEvent e) { addCalculatedMemberProperty(e); } }; addVirtualCube = new AbstractAction( getResourceConverter().getString( "schemaExplorer.addVirtualCube.title", "Add Virtual Cube")) { public void actionPerformed(ActionEvent e) { addVirtualCube(e); } }; addVirtualCubeDimension = new AbstractAction( getResourceConverter().getString( "schemaExplorer.addVirtualCubeDimension.title", "Add Virtual Cube Dimension")) { public void actionPerformed(ActionEvent e) { addVirtualCubeDimension(e); } }; addVirtualCubeMeasure = new AbstractAction( getResourceConverter().getString( "schemaExplorer.addVirtualCubeMeasure.title", "Add Virtual Cube Measure")) { public void actionPerformed(ActionEvent e) { addVirtualCubeMeasure(e); } }; addAggPattern = new AbstractAction( getResourceConverter().getString( "schemaExplorer.addAggregatePattern.title", "Add Aggregate Pattern")) { public void actionPerformed(ActionEvent e) { addAggPattern(e); } }; addAggExclude = new AbstractAction( getResourceConverter().getString( "schemaExplorer.addAggregateExcludeTable.title", "Add Aggregate Exclude Table")) { public void actionPerformed(ActionEvent e) { addAggExclude(e); } }; addAggName = new AbstractAction( getResourceConverter().getString( "schemaExplorer.addAggregateName.title", "Add Aggregate Name")) { public void actionPerformed(ActionEvent e) { addAggName(e); } }; addAggIgnoreColumn = new AbstractAction( getResourceConverter().getString( "schemaExplorer.addAggregateIgnoreColumn.title", "Add Aggregate Ignore Column")) { public void actionPerformed(ActionEvent e) { addAggIgnoreColumn(e); } }; addAggForeignKey = new AbstractAction( getResourceConverter().getString( "schemaExplorer.addAggregateForeignKey.title", "Add Aggregate Foreign Key")) { public void actionPerformed(ActionEvent e) { addAggForeignKey(e); } }; addAggMeasure = new AbstractAction( getResourceConverter().getString( "schemaExplorer.addAggregateMeasure.title", "Add Aggregate Measure")) { public void actionPerformed(ActionEvent e) { addAggMeasure(e); } }; addAggLevel = new AbstractAction( getResourceConverter().getString( "schemaExplorer.addAggregateLevel.title", "Add Aggregate Level")) { public void actionPerformed(ActionEvent e) { addAggLevel(e); } }; addAggLevelProperty = new AbstractAction( getResourceConverter().getString( "schemaExplorer.addAggregateLevelProperty.title", "Add Aggregate Level Property")) { public void actionPerformed(ActionEvent e) { addAggLevelProperty(e); } }; addAggFactCount = new AbstractAction( getResourceConverter().getString( "schemaExplorer.addAggregateFactCount.title", "Add Aggregate Fact Count")) { public void actionPerformed(ActionEvent e) { addAggFactCount(e); } }; delete = new AbstractAction( getResourceConverter().getString( "schemaExplorer.actionDelete.title", "Delete")) { public void actionPerformed(ActionEvent e) { delete(e); } }; editMode = new AbstractAction( getResourceConverter().getString( "schemaExplorer.actionEdit.title", "EditMode")) { public void actionPerformed(ActionEvent e) { editMode(e); } }; // ======================================================== // toolbar buttons // ======================================================== addCubeButton.setIcon( new ImageIcon( myClassLoader.getResource( getResourceConverter().getGUIReference("addCube")))); addCubeButton.setToolTipText( getResourceConverter().getString( "schemaExplorer.addCube.title", "Add cube")); addCubeButton.addActionListener(addCube); addDimensionButton.setIcon( new ImageIcon( myClassLoader.getResource( getResourceConverter().getGUIReference("addDimension")))); addDimensionButton.setToolTipText( getResourceConverter().getString( "schemaExplorer.addDimension.title", "Add Dimension")); addDimensionButton.addActionListener(addDimension); addDimensionUsageButton.setIcon( new ImageIcon( myClassLoader.getResource( getResourceConverter().getGUIReference( "addDimensionUsage")))); addDimensionUsageButton.setToolTipText( getResourceConverter().getString( "schemaExplorer.addDimensionUsage.title", "Add Dimension Usage")); addDimensionUsageButton.addActionListener(addDimensionUsage); addHierarchyButton.setIcon( new ImageIcon( myClassLoader.getResource( getResourceConverter().getGUIReference("addHierarchy")))); addHierarchyButton.setToolTipText( getResourceConverter().getString( "schemaExplorer.addHierarchy.title", "Add Hierarchy")); addHierarchyButton.addActionListener(addHierarchy); addNamedSetButton.setIcon( new ImageIcon( myClassLoader.getResource( getResourceConverter().getGUIReference("addNamedSet")))); addNamedSetButton.setToolTipText( getResourceConverter().getString( "schemaExplorer.addNamedSet.title", "Add Named Set")); addNamedSetButton.addActionListener(addNamedSet); addUserDefinedFunctionButton.setIcon( new ImageIcon( myClassLoader.getResource( getResourceConverter().getGUIReference( "addUserDefinedFunction")))); addUserDefinedFunctionButton.setToolTipText( getResourceConverter().getString( "schemaExplorer.addUserDefinedFunction.title", "Add User defined Function")); addUserDefinedFunctionButton.addActionListener(addUserDefinedFunction); addCalculatedMemberButton.setIcon( new ImageIcon( myClassLoader.getResource( getResourceConverter().getGUIReference( "addCalculatedMember")))); addCalculatedMemberButton.setToolTipText( getResourceConverter().getString( "schemaExplorer.addCalculatedMember.title", "Add Calculated Member")); addCalculatedMemberButton.addActionListener(addCalculatedMember); addMeasureButton.setIcon( new ImageIcon( myClassLoader.getResource( getResourceConverter().getGUIReference("addMeasure")))); addMeasureButton.setToolTipText( getResourceConverter().getString( "schemaExplorer.addMeasure.title", "Add Measure")); addMeasureButton.addActionListener(addMeasure); addLevelButton.setIcon( new ImageIcon( myClassLoader.getResource( getResourceConverter().getGUIReference("addLevel")))); addLevelButton.setToolTipText( getResourceConverter().getString( "schemaExplorer.addLevel.title", "Add Level")); addLevelButton.addActionListener(addLevel); addPropertyButton.setIcon( new ImageIcon( myClassLoader.getResource( getResourceConverter().getGUIReference("addProperty")))); addPropertyButton.setToolTipText( getResourceConverter().getString( "schemaExplorer.addProperty.title", "Add Property")); addPropertyButton.addActionListener(addProperty); addCalculatedMemberPropertyButton.setIcon( new ImageIcon( myClassLoader.getResource( getResourceConverter().getGUIReference( "addCalculatedMemberProperty")))); addCalculatedMemberPropertyButton.setToolTipText( getResourceConverter().getString( "schemaExplorer.addCalculatedMemberProperty.title", "Add Calculated Member Property")); addCalculatedMemberPropertyButton.addActionListener( addCalculatedMemberProperty); addVirtualCubeButton.setIcon( new ImageIcon( myClassLoader.getResource( getResourceConverter().getGUIReference("addVirtualCube")))); addVirtualCubeButton.setToolTipText( getResourceConverter().getString( "schemaExplorer.addVirtualCube.title", "Add Virtual Cube")); addVirtualCubeButton.addActionListener(addVirtualCube); addVirtualCubeDimensionButton.setIcon( new ImageIcon( myClassLoader.getResource( getResourceConverter().getGUIReference( "addVirtualCubeDimension")))); addVirtualCubeDimensionButton.setToolTipText( getResourceConverter().getString( "schemaExplorer.addVirtualCubeDimension.title", "Add Virtual Dimension")); addVirtualCubeDimensionButton .addActionListener(addVirtualCubeDimension); addVirtualCubeMeasureButton.setIcon( new ImageIcon( myClassLoader.getResource( getResourceConverter().getGUIReference( "addVirtualCubeMeasure")))); addVirtualCubeMeasureButton.setToolTipText( getResourceConverter().getString( "schemaExplorer.addVirtualCubeMeasure.title", "Add Virtual Measure")); addVirtualCubeMeasureButton.addActionListener(addVirtualCubeMeasure); addRoleButton.setIcon( new ImageIcon( myClassLoader.getResource( getResourceConverter().getGUIReference("addRole")))); addRoleButton.setToolTipText( getResourceConverter().getString( "schemaExplorer.addRole.title", "Add Role")); addRoleButton.addActionListener(addRole); cutButton.setIcon( new javax.swing.ImageIcon( getClass().getResource( getResourceConverter().getGUIReference("cut")))); cutButton.setText(""); cutButton.setToolTipText( getResourceConverter().getString( "schemaExplorer.actionCut.title", "Cut")); copyButton.setIcon( new javax.swing.ImageIcon( getClass().getResource( getResourceConverter().getGUIReference("copy")))); copyButton.setText(""); copyButton.setToolTipText( getResourceConverter().getString( "schemaExplorer.actionCopy.title", "Copy")); pasteButton.setIcon( new javax.swing.ImageIcon( getClass().getResource( getResourceConverter().getGUIReference("paste")))); pasteButton.setText(""); pasteButton.setToolTipText( getResourceConverter().getString( "schemaExplorer.actionPaste.title", "Paste")); deleteButton.setIcon( new javax.swing.ImageIcon( getClass().getResource( getResourceConverter().getGUIReference("delete")))); deleteButton.setToolTipText( getResourceConverter().getString( "schemaExplorer.actionDelete.title", "Delete")); deleteButton.addActionListener(delete); editModeButton.setIcon( new javax.swing.ImageIcon( getClass().getResource( getResourceConverter().getGUIReference("edit")))); editModeButton.setToolTipText( getResourceConverter().getString( "schemaExplorer.actionEdit.title", "Edit Mode")); editModeButton.addActionListener(editMode); databaseLabel.setIcon( new javax.swing.ImageIcon( getClass().getResource( getResourceConverter().getGUIReference("database")))); jToolBar1.add(addCubeButton); jToolBar1.add(addDimensionButton); jToolBar1.add(addDimensionUsageButton); jToolBar1.add(addHierarchyButton); jToolBar1.add(addNamedSetButton); jToolBar1.add(addUserDefinedFunctionButton); jToolBar1.add(addCalculatedMemberButton); jToolBar1.add(addMeasureButton); jToolBar1.add(addLevelButton); jToolBar1.add(addPropertyButton); jToolBar1.add(addCalculatedMemberPropertyButton); jToolBar1.addSeparator(); jToolBar1.add(addVirtualCubeButton); jToolBar1.add(addVirtualCubeDimensionButton); jToolBar1.add(addVirtualCubeMeasureButton); jToolBar1.addSeparator(); jToolBar1.add(addRoleButton); jToolBar1.addSeparator(); jToolBar1.add(cutButton); jToolBar1.add(copyButton); jToolBar1.add(pasteButton); jToolBar1.addSeparator(); jToolBar1.add(deleteButton); jToolBar1.addSeparator(); jToolBar1.add(editModeButton); // ======================================================== // popup menu // ======================================================== jPopupMenu = new CustomJPopupMenu(); // ======================================================== // tree mouse listener // ======================================================== tree.addMouseListener(new PopupTrigger()); tree.addKeyListener( new KeyAdapter() { public void keyPressed(KeyEvent e) { // keytext=Delete // keycode=127 // keytext=NumPad . // keycode=110 int kcode = e.getKeyCode(); if (kcode == 127 || kcode == 110) { delete(e); } } }); // add footer for connected database footer.setLayout(new java.awt.BorderLayout()); footer.add(databaseLabel, java.awt.BorderLayout.CENTER); // ======================================================== // jpanel // ======================================================== this.add(jSplitPane1, java.awt.BorderLayout.CENTER); this.add(jToolBar1, java.awt.BorderLayout.NORTH); this.add(footer, java.awt.BorderLayout.SOUTH); updater = new JTreeUpdater(tree); } protected void arrowButtonUpAction(ActionEvent evt) { TreePath tpath = tree.getSelectionPath(); if (tpath != null) { TreePath parentpath = tpath.getParentPath(); if (parentpath != null) { tree.setSelectionPath(parentpath); refreshTree(parentpath); } } } protected void arrowButtonDownAction(ActionEvent evt) { TreePath tpath = tree.getSelectionPath(); if (tpath != null) { Object current = tpath.getLastPathComponent(); Object child = tree.getModel().getChild(current, 0); if (child != null) { Object[] treeObjs = new Object[30]; treeObjs[0] = child; treeObjs[1] = current; // traverse upward through tree, saving parent nodes TreePath parentpath; parentpath = tpath.getParentPath(); int objCnt = 2; while (parentpath != null) { Object po = parentpath.getLastPathComponent(); treeObjs[objCnt] = po; objCnt += 1; parentpath = parentpath.getParentPath(); } // reverse the array so that schema is first, then the children Object[] nodes = new Object[objCnt]; int loopCnt = objCnt - 1; for (int j = 0; j < objCnt; j++) { nodes[j] = treeObjs[loopCnt]; loopCnt--; } TreePath childPath = new TreePath(nodes); tree.setSelectionPath(childPath); refreshTree(childPath); } } } /** * Several methods are called, e.g. editCellAt, to get the focus set in the * value column of the specified row. The attribute column has the * parameter name and should not receive focus. */ protected void setTableCellFocus(int row) { propertyTable.editCellAt(row, 1); TableCellEditor editor = propertyTable.getCellEditor(row, 1); Component comp = editor.getTableCellEditorComponent( propertyTable, propertyTable.getValueAt(row, 1), true, row, 1); } protected void addCube(ActionEvent evt) { MondrianGuiDef.Schema schema = (MondrianGuiDef.Schema) tree.getModel().getRoot(); MondrianGuiDef.Cube cube = new MondrianGuiDef.Cube(); cube.name = ""; cube.dimensions = new MondrianGuiDef.Dimension[0]; cube.measures = new MondrianGuiDef.Measure[0]; cube.calculatedMembers = new MondrianGuiDef.CalculatedMember[0]; cube.namedSets = new MondrianGuiDef.NamedSet[0]; cube.name = getNewName( getResourceConverter().getString( "schemaExplorer.newCube.title", "New Cube"), schema.cubes); cube.cache = Boolean.TRUE; cube.enabled = Boolean.TRUE; cube.visible = Boolean.TRUE; NodeDef[] temp = schema.cubes; schema.cubes = new MondrianGuiDef.Cube[temp.length + 1]; for (int _i = 0; _i < temp.length; _i++) { schema.cubes[_i] = (MondrianGuiDef.Cube) temp[_i]; } schema.cubes[schema.cubes.length - 1] = cube; tree.setSelectionPath( (new TreePath(model.getRoot())).pathByAddingChild( cube)); refreshTree(tree.getSelectionPath()); setTableCellFocus(0); } protected void addParameter(ActionEvent evt) { MondrianGuiDef.Schema schema = (MondrianGuiDef.Schema) tree.getModel().getRoot(); MondrianGuiDef.Parameter parameter = new MondrianGuiDef.Parameter(); parameter.name = ""; // set the required fields parameter.name = getNewName( getResourceConverter().getString( "schemaExplorer.newParameter.title", "New Parameter"), schema.parameters); // set the default values parameter.type = "String"; parameter.modifiable = Boolean.TRUE; NodeDef[] temp = schema.parameters; schema.parameters = new MondrianGuiDef.Parameter[temp.length + 1]; for (int _i = 0; _i < temp.length; _i++) { schema.parameters[_i] = (MondrianGuiDef.Parameter) temp[_i]; } schema.parameters[schema.parameters.length - 1] = parameter; tree.setSelectionPath( (new TreePath(model.getRoot())).pathByAddingChild( parameter)); refreshTree(tree.getSelectionPath()); setTableCellFocus(0); } protected void addRole(ActionEvent evt) { MondrianGuiDef.Schema schema = (MondrianGuiDef.Schema) tree.getModel().getRoot(); MondrianGuiDef.Role role = new MondrianGuiDef.Role(); role.name = ""; role.schemaGrants = new MondrianGuiDef.SchemaGrant[0]; // add cube to schema role.name = getNewName( getResourceConverter().getString( "schemaExplorer.newRole.title", "New Role"), schema.roles); NodeDef[] temp = schema.roles; schema.roles = new MondrianGuiDef.Role[temp.length + 1]; for (int _i = 0; _i < temp.length; _i++) { schema.roles[_i] = (MondrianGuiDef.Role) temp[_i]; } schema.roles[schema.roles.length - 1] = role; tree.setSelectionPath( (new TreePath(model.getRoot())).pathByAddingChild( role)); refreshTree(tree.getSelectionPath()); setTableCellFocus(0); } protected void addVirtualCube(ActionEvent evt) { MondrianGuiDef.Schema schema = (MondrianGuiDef.Schema) tree.getModel().getRoot(); MondrianGuiDef.VirtualCube cube = new MondrianGuiDef.VirtualCube(); cube.name = ""; cube.dimensions = new MondrianGuiDef.VirtualCubeDimension[0]; cube.measures = new MondrianGuiDef.VirtualCubeMeasure[0]; cube.calculatedMembers = new MondrianGuiDef.CalculatedMember[0]; cube.enabled = Boolean.TRUE; // add cube to schema cube.name = getNewName( getResourceConverter().getString( "schemaExplorer.newVirtualCube.title", "New Virtual Cube"), schema.virtualCubes); NodeDef[] temp = schema.virtualCubes; schema.virtualCubes = new MondrianGuiDef.VirtualCube[temp.length + 1]; for (int i = 0; i < temp.length; i++) { schema.virtualCubes[i] = (MondrianGuiDef.VirtualCube) temp[i]; } schema.virtualCubes[schema.virtualCubes.length - 1] = cube; tree.setSelectionPath( new TreePath(model.getRoot()).pathByAddingChild( cube)); refreshTree(tree.getSelectionPath()); setTableCellFocus(0); } protected void addUserDefinedFunction(ActionEvent evt) { MondrianGuiDef.Schema schema = (MondrianGuiDef.Schema) tree.getModel().getRoot(); MondrianGuiDef.UserDefinedFunction udf = new MondrianGuiDef.UserDefinedFunction(); udf.name = ""; udf.name = getNewName( getResourceConverter().getString( "schemaExplorer.newUserDefinedFunction.title", "New User defined Function"), schema.userDefinedFunctions); NodeDef[] temp = schema.userDefinedFunctions; schema.userDefinedFunctions = new MondrianGuiDef.UserDefinedFunction[temp.length + 1]; for (int _i = 0; _i < temp.length; _i++) { schema.userDefinedFunctions[_i] = (MondrianGuiDef.UserDefinedFunction) temp[_i]; } schema.userDefinedFunctions[schema.userDefinedFunctions.length - 1] = udf; tree.setSelectionPath( new TreePath(model.getRoot()).pathByAddingChild( udf)); refreshTree(tree.getSelectionPath()); setTableCellFocus(0); } /** * Updates the tree display after an Add / Delete operation. */ private void refreshTree(TreePath path) { setDirty(true); if (!dirtyFlag) { setDirtyFlag(true); // dirty indication shown on title setTitle(); } updater.update(); tree.scrollPathToVisible(path); } protected void addMeasure(ActionEvent evt) { TreePath tpath = null; Object path = null; tpath = getTreePath(evt); int parentIndex = -1; if (tpath != null) { for (parentIndex = tpath.getPathCount() - 1; parentIndex >= 0; parentIndex--) { final Object p = tpath.getPathComponent(parentIndex); if (p instanceof MondrianGuiDef.Cube) { path = p; break; } } } // Object path = tree.getSelectionPath().getLastPathComponent(); if (!(path instanceof MondrianGuiDef.Cube)) { JOptionPane.showMessageDialog( this, getResourceConverter().getString( "schemaExplorer.cubeNotSelected.alert", "Cube not selected."), alert, JOptionPane.WARNING_MESSAGE); return; } MondrianGuiDef.Cube cube = (MondrianGuiDef.Cube) path; MondrianGuiDef.Measure measure = new MondrianGuiDef.Measure(); measure.name = ""; measure.name = getNewName( getResourceConverter().getString( "schemaExplorer.newMeasure.title", "New Measure"), cube.measures); measure.visible = Boolean.TRUE; measure.aggregator = "distinct-count"; NodeDef[] temp = cube.measures; cube.measures = new MondrianGuiDef.Measure[temp.length + 1]; for (int i = 0; i < temp.length; i++) { cube.measures[i] = (MondrianGuiDef.Measure) temp[i]; } cube.measures[cube.measures.length - 1] = measure; Object[] parentPathObjs = new Object[parentIndex + 1]; for (int i = 0; i <= parentIndex; i++) { parentPathObjs[i] = tpath.getPathComponent(i); } TreePath parentPath = new TreePath(parentPathObjs); tree.setSelectionPath(parentPath.pathByAddingChild(measure)); refreshTree(tree.getSelectionPath()); setTableCellFocus(0); } protected void addAggPattern(ActionEvent evt) { TreePath tpath = null; Object path = null; tpath = getTreePath(evt); int parentIndex = -1; if (tpath != null) { for (parentIndex = tpath.getPathCount() - 1; parentIndex >= 0; parentIndex--) { final Object p = tpath.getPathComponent(parentIndex); if (p instanceof MondrianGuiDef.Table) { if (((parentIndex - 1) >= 0) && (tpath.getPathComponent(parentIndex - 1) instanceof MondrianGuiDef.Cube)) { path = p; break; } } } } // Object path = tree.getSelectionPath().getLastPathComponent(); if (!(path instanceof MondrianGuiDef.Table)) { JOptionPane.showMessageDialog( this, getResourceConverter().getString( "schemaExplorer.cubeFactTableNotSelected.alert", "Cube Fact Table not selected."), alert, JOptionPane.WARNING_MESSAGE); return; } MondrianGuiDef.Table factTable = (MondrianGuiDef.Table) path; MondrianGuiDef.AggPattern aggname = new MondrianGuiDef.AggPattern(); aggname.pattern = ""; // add cube to schema aggname.ignorecase = Boolean.TRUE; aggname.factcount = null; aggname.ignoreColumns = new MondrianGuiDef.AggIgnoreColumn[0]; aggname.foreignKeys = new MondrianGuiDef.AggForeignKey[0]; aggname.measures = new MondrianGuiDef.AggMeasure[0]; aggname.levels = new MondrianGuiDef.AggLevel[0]; aggname.excludes = new MondrianGuiDef.AggExclude[0]; NodeDef[] temp = factTable.aggTables; factTable.aggTables = new MondrianGuiDef.AggTable[temp.length + 1]; for (int i = 0; i < temp.length; i++) { factTable.aggTables[i] = (MondrianGuiDef.AggTable) temp[i]; } factTable.aggTables[factTable.aggTables.length - 1] = aggname; Object[] parentPathObjs = new Object[parentIndex + 1]; for (int i = 0; i <= parentIndex; i++) { parentPathObjs[i] = tpath.getPathComponent(i); } TreePath parentPath = new TreePath(parentPathObjs); tree.setSelectionPath(parentPath.pathByAddingChild(aggname)); refreshTree(tree.getSelectionPath()); setTableCellFocus(0); } protected void addAggName(ActionEvent evt) { TreePath tpath = null; Object path = null; tpath = getTreePath(evt); int parentIndex = -1; if (tpath != null) { for (parentIndex = tpath.getPathCount() - 1; parentIndex >= 0; parentIndex--) { final Object p = tpath.getPathComponent(parentIndex); if (p instanceof MondrianGuiDef.Table) { if (((parentIndex - 1) >= 0) && tpath.getPathComponent(parentIndex - 1) instanceof MondrianGuiDef.Cube) { path = p; break; } } } } if (!(path instanceof MondrianGuiDef.Table)) { JOptionPane.showMessageDialog( this, getResourceConverter().getString( "schemaExplorer.tableNotSelected.alert", "Table not selected."), alert, JOptionPane.WARNING_MESSAGE); return; } MondrianGuiDef.Table factTable = (MondrianGuiDef.Table) path; MondrianGuiDef.AggName aggname = new MondrianGuiDef.AggName(); aggname.name = ""; // add cube to schema aggname.ignorecase = Boolean.TRUE; aggname.factcount = null; aggname.ignoreColumns = new MondrianGuiDef.AggIgnoreColumn[0]; aggname.foreignKeys = new MondrianGuiDef.AggForeignKey[0]; aggname.measures = new MondrianGuiDef.AggMeasure[0]; aggname.levels = new MondrianGuiDef.AggLevel[0]; NodeDef[] temp = factTable.aggTables; if (temp == null) { factTable.aggTables = new MondrianGuiDef.AggTable[1]; } else { factTable.aggTables = new MondrianGuiDef.AggTable[temp.length + 1]; for (int i = 0; i < temp.length; i++) { factTable.aggTables[i] = (MondrianGuiDef.AggTable) temp[i]; } } factTable.aggTables[factTable.aggTables.length - 1] = aggname; Object[] parentPathObjs = new Object[parentIndex + 1]; for (int i = 0; i <= parentIndex; i++) { parentPathObjs[i] = tpath.getPathComponent(i); } TreePath parentPath = new TreePath(parentPathObjs); tree.setSelectionPath(parentPath.pathByAddingChild(aggname)); refreshTree(tree.getSelectionPath()); setTableCellFocus(0); } protected void addAggExclude(ActionEvent evt) { TreePath tpath = null; Object path = null; tpath = getTreePath(evt); int parentIndex = -1; if (tpath != null) { for (parentIndex = tpath.getPathCount() - 1; parentIndex >= 0; parentIndex--) { // aggexcludes can be added to cube fact table or final Object p = tpath.getPathComponent(parentIndex); if (p instanceof MondrianGuiDef.Table) { if (((parentIndex - 1) >= 0) && tpath.getPathComponent(parentIndex - 1) instanceof MondrianGuiDef.Cube) { path = p; break; } } else if (p instanceof MondrianGuiDef.AggPattern) { // aggexcludes can also be added to aggregate patterns path = p; break; } } } // Object path = tree.getSelectionPath().getLastPathComponent(); if (!(path instanceof MondrianGuiDef.Table || path instanceof MondrianGuiDef.AggPattern)) { JOptionPane.showMessageDialog( this, getResourceConverter().getString( "schemaExplorer.cubeFactTableOrAggPatternNotSelected.alert", "Cube Fact Table or Aggregate Pattern not selected."), alert, JOptionPane.WARNING_MESSAGE); return; } MondrianGuiDef.AggExclude aggexclude = new MondrianGuiDef.AggExclude(); aggexclude.pattern = ""; aggexclude.ignorecase = Boolean.TRUE; if (path instanceof MondrianGuiDef.Table) { MondrianGuiDef.Table parent = (MondrianGuiDef.Table) path; // fact table NodeDef[] temp = parent.aggExcludes; parent.aggExcludes = new MondrianGuiDef.AggExclude[temp.length + 1]; for (int i = 0; i < temp.length; i++) { parent.aggExcludes[i] = (MondrianGuiDef.AggExclude) temp[i]; } parent.aggExcludes[parent.aggExcludes.length - 1] = aggexclude; } else { MondrianGuiDef.AggPattern parent = (MondrianGuiDef.AggPattern) path; // aggpattern NodeDef[] temp = parent.excludes; parent.excludes = new MondrianGuiDef.AggExclude[temp.length + 1]; for (int i = 0; i < temp.length; i++) { parent.excludes[i] = (MondrianGuiDef.AggExclude) temp[i]; } parent.excludes[parent.excludes.length - 1] = aggexclude; } Object[] parentPathObjs = new Object[parentIndex + 1]; for (int i = 0; i <= parentIndex; i++) { parentPathObjs[i] = tpath.getPathComponent(i); } TreePath parentPath = new TreePath(parentPathObjs); tree.setSelectionPath(parentPath.pathByAddingChild(aggexclude)); refreshTree(tree.getSelectionPath()); setTableCellFocus(0); } protected void addAggIgnoreColumn(ActionEvent evt) { TreePath tpath = null; Object path = null; tpath = getTreePath(evt); int parentIndex = -1; if (tpath != null) { for (parentIndex = tpath.getPathCount() - 1; parentIndex >= 0; parentIndex--) { final Object p = tpath.getPathComponent(parentIndex); if (p instanceof MondrianGuiDef.AggTable) { path = p; break; } } } if (!(path instanceof MondrianGuiDef.AggTable)) { JOptionPane.showMessageDialog( this, getResourceConverter().getString( "schemaExplorer.aggregateTableNotSelected.alert", "Aggregate Table not selected."), alert, JOptionPane.WARNING_MESSAGE); return; } MondrianGuiDef.AggTable aggTable = (MondrianGuiDef.AggTable) path; MondrianGuiDef.AggIgnoreColumn aggicol = new MondrianGuiDef.AggIgnoreColumn(); aggicol.column = ""; NodeDef[] temp = aggTable.ignoreColumns; aggTable.ignoreColumns = new MondrianGuiDef.AggIgnoreColumn[temp.length + 1]; for (int i = 0; i < temp.length; i++) { aggTable.ignoreColumns[i] = (MondrianGuiDef.AggIgnoreColumn) temp[i]; } aggTable.ignoreColumns[aggTable.ignoreColumns.length - 1] = aggicol; Object[] parentPathObjs = new Object[parentIndex + 1]; for (int i = 0; i <= parentIndex; i++) { parentPathObjs[i] = tpath.getPathComponent(i); } TreePath parentPath = new TreePath(parentPathObjs); tree.setSelectionPath(parentPath.pathByAddingChild(aggicol)); refreshTree(tree.getSelectionPath()); setTableCellFocus(0); } protected void addAggForeignKey(ActionEvent evt) { TreePath tpath = null; Object path = null; tpath = getTreePath(evt); int parentIndex = -1; if (tpath != null) { for (parentIndex = tpath.getPathCount() - 1; parentIndex >= 0; parentIndex--) { final Object p = tpath.getPathComponent(parentIndex); if (p instanceof MondrianGuiDef.AggTable) { path = p; break; } } } if (!(path instanceof MondrianGuiDef.AggTable)) { JOptionPane.showMessageDialog( this, getResourceConverter().getString( "schemaExplorer.aggregateTableNotSelected.alert", "Aggregate Table not selected."), alert, JOptionPane.WARNING_MESSAGE); return; } MondrianGuiDef.AggTable aggTable = (MondrianGuiDef.AggTable) path; MondrianGuiDef.AggForeignKey aggfkey = new MondrianGuiDef.AggForeignKey(); NodeDef[] temp = aggTable.foreignKeys; aggTable.foreignKeys = new MondrianGuiDef.AggForeignKey[temp.length + 1]; for (int i = 0; i < temp.length; i++) { aggTable.foreignKeys[i] = (MondrianGuiDef.AggForeignKey) temp[i]; } aggTable.foreignKeys[aggTable.foreignKeys.length - 1] = aggfkey; Object[] parentPathObjs = new Object[parentIndex + 1]; for (int i = 0; i <= parentIndex; i++) { parentPathObjs[i] = tpath.getPathComponent(i); } TreePath parentPath = new TreePath(parentPathObjs); tree.setSelectionPath(parentPath.pathByAddingChild(aggfkey)); refreshTree(tree.getSelectionPath()); setTableCellFocus(0); } protected void addAggMeasure(ActionEvent evt) { TreePath tpath = null; Object path = null; tpath = getTreePath(evt); int parentIndex = -1; if (tpath != null) { for (parentIndex = tpath.getPathCount() - 1; parentIndex >= 0; parentIndex--) { final Object p = tpath.getPathComponent(parentIndex); if (p instanceof MondrianGuiDef.AggTable) { path = p; break; } } } if (!(path instanceof MondrianGuiDef.AggTable)) { JOptionPane.showMessageDialog( this, getResourceConverter().getString( "schemaExplorer.aggregateTableNotSelected.alert", "Aggregate Table not selected."), alert, JOptionPane.WARNING_MESSAGE); return; } MondrianGuiDef.AggTable aggTable = (MondrianGuiDef.AggTable) path; MondrianGuiDef.AggMeasure aggmeasure = new MondrianGuiDef.AggMeasure(); NodeDef[] temp = aggTable.measures; aggTable.measures = new MondrianGuiDef.AggMeasure[temp.length + 1]; for (int i = 0; i < temp.length; i++) { aggTable.measures[i] = (MondrianGuiDef.AggMeasure) temp[i]; } aggTable.measures[aggTable.measures.length - 1] = aggmeasure; Object[] parentPathObjs = new Object[parentIndex + 1]; for (int i = 0; i <= parentIndex; i++) { parentPathObjs[i] = tpath.getPathComponent(i); } TreePath parentPath = new TreePath(parentPathObjs); tree.setSelectionPath(parentPath.pathByAddingChild(aggmeasure)); refreshTree(tree.getSelectionPath()); setTableCellFocus(0); } protected void addAggLevel(ActionEvent evt) { TreePath tpath = null; Object path = null; tpath = getTreePath(evt); int parentIndex = -1; if (tpath != null) { for (parentIndex = tpath.getPathCount() - 1; parentIndex >= 0; parentIndex--) { final Object p = tpath.getPathComponent(parentIndex); if (p instanceof MondrianGuiDef.AggTable) { path = p; break; } } } if (!(path instanceof MondrianGuiDef.AggTable)) { JOptionPane.showMessageDialog( this, getResourceConverter().getString( "schemaExplorer.aggregateTableNotSelected.alert", "Aggregate Table not selected."), alert, JOptionPane.WARNING_MESSAGE); return; } MondrianGuiDef.AggTable aggTable = (MondrianGuiDef.AggTable) path; MondrianGuiDef.AggLevel agglevel = new MondrianGuiDef.AggLevel(); NodeDef[] temp = aggTable.levels; aggTable.levels = new MondrianGuiDef.AggLevel[temp.length + 1]; for (int i = 0; i < temp.length; i++) { aggTable.levels[i] = (MondrianGuiDef.AggLevel) temp[i]; } aggTable.levels[aggTable.levels.length - 1] = agglevel; agglevel.collapsed = Boolean.TRUE; Object[] parentPathObjs = new Object[parentIndex + 1]; for (int i = 0; i <= parentIndex; i++) { parentPathObjs[i] = tpath.getPathComponent(i); } TreePath parentPath = new TreePath(parentPathObjs); tree.setSelectionPath(parentPath.pathByAddingChild(agglevel)); refreshTree(tree.getSelectionPath()); setTableCellFocus(0); } protected void addAggLevelProperty(ActionEvent evt) { TreePath tpath = getTreePath(evt); Object path = null; int parentIndex = -1; if (tpath != null) { for (parentIndex = tpath.getPathCount() - 1; parentIndex >= 0; parentIndex--) { final Object p = tpath.getPathComponent(parentIndex); if (p instanceof MondrianGuiDef.AggLevel) { path = p; break; } } } if (!(path instanceof MondrianGuiDef.AggLevel)) { JOptionPane.showMessageDialog( this, getResourceConverter().getString( "schemaExplorer.aggregateLevelNotSelected.alert", "Aggregate Level not selected."), alert, JOptionPane.WARNING_MESSAGE); return; } MondrianGuiDef.AggLevel aggLevel = (MondrianGuiDef.AggLevel) path; MondrianGuiDef.AggLevelProperty aggLevelProperty = new MondrianGuiDef.AggLevelProperty(); appendAggLevelProperty(aggLevel, aggLevelProperty); Object[] parentPathObjs = new Object[parentIndex + 1]; for (int i = 0; i <= parentIndex; i++) { parentPathObjs[i] = tpath.getPathComponent(i); } TreePath parentPath = new TreePath(parentPathObjs); tree.setSelectionPath(parentPath.pathByAddingChild(aggLevelProperty)); refreshTree(tree.getSelectionPath()); setTableCellFocus(0); } private void appendAggLevelProperty( MondrianGuiDef.AggLevel aggLevel, MondrianGuiDef.AggLevelProperty aggLevelProperty) { if (aggLevel.properties == null) { aggLevel.properties = new MondrianGuiDef.AggLevelProperty[] { aggLevelProperty }; } else { aggLevel.properties = Arrays.copyOf( aggLevel.properties, aggLevel.properties.length + 1); aggLevel.properties[aggLevel.properties.length - 1] = aggLevelProperty; } } private TreePath getTreePath(ActionEvent evt) { TreePath tpath; if (evt.getSource() instanceof Component && ((Component)evt.getSource()) .getParent() instanceof CustomJPopupMenu) { tpath = ((CustomJPopupMenu)((Component)evt.getSource()) .getParent()).getPath(); } else { tpath = tree.getSelectionPath(); } return tpath; } protected void addAggFactCount(ActionEvent evt) { TreePath tpath = null; Object path = null; tpath = getTreePath(evt); int parentIndex = -1; if (tpath != null) { for (parentIndex = tpath.getPathCount() - 1; parentIndex >= 0; parentIndex--) { final Object p = tpath.getPathComponent(parentIndex); if (p instanceof MondrianGuiDef.AggTable) { path = p; break; } } } if (!((path instanceof MondrianGuiDef.AggName) || (path instanceof MondrianGuiDef.AggPattern))) { JOptionPane.showMessageDialog( this, getResourceConverter().getString( "schemaExplorer.aggregateTableOrAggPatternNotSelected.alert", "Aggregate Table or Aggregate Pattern not selected."), alert, JOptionPane.WARNING_MESSAGE); return; } MondrianGuiDef.AggFactCount aggFactCount = new MondrianGuiDef.AggFactCount(); MondrianGuiDef.AggTable aggName = null; MondrianGuiDef.AggPattern aggPattern = null; if (path instanceof MondrianGuiDef.AggName) { aggName = (MondrianGuiDef.AggName) path; aggName.factcount = new MondrianGuiDef.AggFactCount(); } else { aggPattern = (MondrianGuiDef.AggPattern) path; aggPattern.factcount = new MondrianGuiDef.AggFactCount(); } Object[] parentPathObjs = new Object[parentIndex + 1]; for (int i = 0; i <= parentIndex; i++) { parentPathObjs[i] = tpath.getPathComponent(i); } TreePath parentPath = new TreePath(parentPathObjs); tree.setSelectionPath(parentPath.pathByAddingChild(aggFactCount)); refreshTree(tree.getSelectionPath()); setTableCellFocus(0); } protected void addVirtualCubeMeasure(ActionEvent evt) { TreePath tpath = null; Object path = null; tpath = getTreePath(evt); int parentIndex = -1; if (tpath != null) { for (parentIndex = tpath.getPathCount() - 1; parentIndex >= 0; parentIndex--) { final Object p = tpath.getPathComponent(parentIndex); if (p instanceof MondrianGuiDef.VirtualCube) { path = p; break; } } } if (!(path instanceof MondrianGuiDef.VirtualCube)) { JOptionPane.showMessageDialog( this, getResourceConverter().getString( "schemaExplorer.virtualCubeNotSelected.alert", "Virtual Cube not selected."), alert, JOptionPane.WARNING_MESSAGE); return; } MondrianGuiDef.VirtualCube cube = (MondrianGuiDef.VirtualCube) path; MondrianGuiDef.VirtualCubeMeasure measure = new MondrianGuiDef.VirtualCubeMeasure(); measure.name = ""; measure.name = getNewName( getResourceConverter().getString( "schemaExplorer.newVirtualMeasure.title", "New Virtual Measure"), cube.measures); measure.visible = Boolean.TRUE; // default true NodeDef[] temp = cube.measures; cube.measures = new MondrianGuiDef.VirtualCubeMeasure[temp.length + 1]; for (int i = 0; i < temp.length; i++) { cube.measures[i] = (MondrianGuiDef.VirtualCubeMeasure) temp[i]; } cube.measures[cube.measures.length - 1] = measure; Object[] parentPathObjs = new Object[parentIndex + 1]; for (int i = 0; i <= parentIndex; i++) { parentPathObjs[i] = tpath.getPathComponent(i); } TreePath parentPath = new TreePath(parentPathObjs); tree.setSelectionPath(parentPath.pathByAddingChild(measure)); refreshTree(tree.getSelectionPath()); setTableCellFocus(0); } protected void addCalculatedMember(ActionEvent evt) { TreePath tpath = null; Object path = null; tpath = getTreePath(evt); int parentIndex = -1; if (tpath != null) { for (parentIndex = tpath.getPathCount() - 1; parentIndex >= 0; parentIndex--) { final Object p = tpath.getPathComponent(parentIndex); if (p instanceof MondrianGuiDef.Cube || p instanceof MondrianGuiDef.VirtualCube) { path = p; break; } } } if (!((path instanceof MondrianGuiDef.Cube) || (path instanceof MondrianGuiDef.VirtualCube))) { JOptionPane.showMessageDialog( this, getResourceConverter().getString( "schemaExplorer.cubeOrVirtualCubeNotSelected.alert", "Cube or Virtual Cube not selected."), alert, JOptionPane.WARNING_MESSAGE); return; } MondrianGuiDef.Cube cube = null; MondrianGuiDef.VirtualCube vcube = null; if (path instanceof MondrianGuiDef.Cube) { cube = (MondrianGuiDef.Cube) path; } else { vcube = (MondrianGuiDef.VirtualCube) path; } MondrianGuiDef.CalculatedMember calcmember = new MondrianGuiDef.CalculatedMember(); calcmember.name = ""; calcmember.dimension = "Measures"; calcmember.visible = Boolean.TRUE; // default value calcmember.formatString = ""; calcmember.formula = ""; calcmember.formulaElement = new MondrianGuiDef.Formula(); calcmember.memberProperties = new MondrianGuiDef.CalculatedMemberProperty[0]; // add cube to schema if (cube != null) { calcmember.name = getNewName( getResourceConverter().getString( "schemaExplorer.newCalculatedMember.title", "New Calculated Member"), cube.calculatedMembers); NodeDef[] temp = cube.calculatedMembers; cube.calculatedMembers = new MondrianGuiDef.CalculatedMember[temp.length + 1]; for (int i = 0; i < temp.length; i++) { cube.calculatedMembers[i] = (MondrianGuiDef.CalculatedMember) temp[i]; } cube.calculatedMembers[cube.calculatedMembers.length - 1] = calcmember; } else { calcmember.name = getNewName( getResourceConverter().getString( "schemaExplorer.newCalculatedMember.title", "New Calculated Member"), vcube.calculatedMembers); NodeDef[] temp = vcube.calculatedMembers; vcube.calculatedMembers = new MondrianGuiDef.CalculatedMember[temp.length + 1]; for (int i = 0; i < temp.length; i++) { vcube.calculatedMembers[i] = (MondrianGuiDef.CalculatedMember) temp[i]; } vcube.calculatedMembers[vcube.calculatedMembers.length - 1] = calcmember; } Object[] parentPathObjs = new Object[parentIndex + 1]; for (int i = 0; i <= parentIndex; i++) { parentPathObjs[i] = tpath.getPathComponent(i); } TreePath parentPath = new TreePath(parentPathObjs); tree.setSelectionPath(parentPath.pathByAddingChild(calcmember)); refreshTree(tree.getSelectionPath()); setTableCellFocus(0); } protected boolean editMode(EventObject evt) { // toggle edit mode between xml or properties table form editModeXML = !isEditModeXML(); editModeButton.setSelected(isEditModeXML()); if (isEditModeXML()) { jSplitPane1.setRightComponent(jPanelXML); } else { jSplitPane1.setRightComponent(jPanel1); } // update the workbench view menu Component o = parentIFrame.getDesktopPane().getParent(); while (o != null) { if (o.getClass() == Workbench.class) { ((Workbench) o).getViewXmlMenuItem().setSelected(editModeXML); break; } o = o.getParent(); } return isEditModeXML(); } protected void delete(EventObject evt) { // delete the selected schema object TreePath tpath = null; Object path = null; if (evt.getSource() instanceof Component && ((Component)evt.getSource()) .getParent() instanceof CustomJPopupMenu) { tpath = ((CustomJPopupMenu)((Component)evt.getSource()) .getParent()).getPath(); } else { tpath = tree.getSelectionPath(); } if (tpath == null) { JOptionPane.showMessageDialog( this, getResourceConverter().getString( "schemaExplorer.objectToDeleteNotSelected.alert", "Object to delete in Schema not selected."), alert, JOptionPane.WARNING_MESSAGE); return; } delete(tpath); } void delete(TreePath tpath) { Object child = tpath.getLastPathComponent(); // to be deleted Object nextSibling = null; Object prevSibling = null; Object parent = null; Object grandparent = null; boolean grandparentAsSibling = false; for (int i = tpath.getPathCount() - 1 - 1; i >= 0; i--) { // get parent path parent = tpath.getPathComponent(i); if (tpath.getPathCount() - 3 > 0) { // get parent path grandparent = tpath.getPathComponent(i - 1); } break; } if (parent == null) { JOptionPane.showMessageDialog( this, getResourceConverter().getString( "schemaExplorer.cantDeleteObject.alert", "Schema object cannot be deleted."), alert, JOptionPane.WARNING_MESSAGE); return; } boolean tofind = true; Field[] fs = parent.getClass().getFields(); for (int i = 0; i < fs.length; i++) { if (fs[i].getType().isArray() && (fs[i].getType().getComponentType().isInstance(child))) { try { // get the parent's array of child objects Object parentArr = fs[i].get(parent); int parentArrLen = Array.getLength(parentArr); Object newArr = Array.newInstance( fs[i].getType().getComponentType(), parentArrLen - 1); tofind = true; for (int k = 0, m = 0; k < parentArrLen; k++) { Object match = Array.get(parentArr, k); if (tofind && match.equals(child)) { if (child instanceof MondrianGuiDef.CubeDimension) { // Check equality of parent class attributes for // a special case when child is an object of // CubeDimensions MondrianGuiDef.CubeDimension matchDim = (MondrianGuiDef.CubeDimension) match; MondrianGuiDef.CubeDimension childDim = (MondrianGuiDef.CubeDimension) child; if (eq(matchDim.name, childDim.name) && eq(matchDim.caption, childDim.caption) && eq( matchDim.foreignKey, childDim.foreignKey)) { tofind = false; if (k + 1 < parentArrLen) { nextSibling = Array.get( parentArr, k + 1); } if (k - 1 >= 0) { prevSibling = Array.get( parentArr, k - 1); } continue; } } else { // other cases require no such check tofind = false; if (k + 1 < parentArrLen) { nextSibling = Array.get(parentArr, k + 1); } if (k - 1 >= 0) { prevSibling = Array.get(parentArr, k - 1); } continue; } } Array.set(newArr, m++, match); } // After deletion check before the saving the new array in // parent. Check for min 1 SQL object(child) in (parent) // expression for (grandparent) level. If 1 or more, save // the newarray in parent, otherwise delete parent from // grandparent. if ((child instanceof MondrianGuiDef.SQL) && (parent instanceof MondrianGuiDef.ExpressionView) && (Array.getLength(newArr) < 1)) { if (parent instanceof MondrianGuiDef.KeyExpression) { ((MondrianGuiDef.Level) grandparent).keyExp = null; } else if (parent instanceof MondrianGuiDef.NameExpression) { ((MondrianGuiDef.Level) grandparent).nameExp = null; } else if (parent instanceof MondrianGuiDef.OrdinalExpression) { ((MondrianGuiDef.Level) grandparent).ordinalExp = null; } else if (parent instanceof MondrianGuiDef.CaptionExpression) { ((MondrianGuiDef.Level) grandparent).captionExp = null; } else if (parent instanceof MondrianGuiDef.ParentExpression) { ((MondrianGuiDef.Level) grandparent).parentExp = null; } else if (parent instanceof MondrianGuiDef.MeasureExpression) { ((MondrianGuiDef.Measure) grandparent).measureExp = null; } grandparentAsSibling = true; } else { fs[i].set(parent, newArr); } } catch (Exception ex) { // field not found } break; } else if (fs[i].getType().isInstance(child)) { // parent's field is an instanceof child object' try { if (fs[i].get(parent) == child) { fs[i].set(parent, null); break; } } catch (Exception ex) { LOGGER.error("delete", ex); // field not found } } } // delete the node from set of expended nodes in JTreeUpdater also TreeExpansionEvent e = null; e = new TreeExpansionEvent(tree, tpath); updater.treeCollapsed(e); if (nextSibling != null) { tree.setSelectionPath( tpath.getParentPath().pathByAddingChild( nextSibling)); } else if (prevSibling != null) { tree.setSelectionPath( tpath.getParentPath().pathByAddingChild( prevSibling)); } else if (grandparentAsSibling) { tree.setSelectionPath(tpath.getParentPath().getParentPath()); } else { tree.setSelectionPath(tpath.getParentPath()); } refreshTree(tree.getSelectionPath()); } private boolean eq( String o1, String o2) { return o1 == null ? o2 == null : o1.equals(o2); } protected void addDimension(ActionEvent evt) { TreePath tpath = null; Object path = null; tpath = getTreePath(evt); int parentIndex = -1; if (tpath != null) { for (parentIndex = tpath.getPathCount() - 1; parentIndex >= 0; parentIndex--) { final Object p = tpath.getPathComponent(parentIndex); if (p instanceof MondrianGuiDef.Cube || p instanceof MondrianGuiDef.Schema) { path = p; break; } } } if (!((path instanceof MondrianGuiDef.Cube) || (path instanceof MondrianGuiDef.Schema))) { JOptionPane.showMessageDialog( this, getResourceConverter().getString( "schemaExplorer.cubeOrSchemaNotSelected.alert", "Cube or Schema not selected."), alert, JOptionPane.WARNING_MESSAGE); return; } MondrianGuiDef.Cube cube = null; MondrianGuiDef.Schema schema = null; if (path instanceof MondrianGuiDef.Cube) { cube = (MondrianGuiDef.Cube) path; } else { schema = (MondrianGuiDef.Schema) path; } MondrianGuiDef.Dimension dimension = new MondrianGuiDef.Dimension(); dimension.name = ""; dimension.visible = Boolean.TRUE; dimension.type = "StandardDimension"; // default dimension type dimension.hierarchies = new MondrianGuiDef.Hierarchy[1]; dimension.hierarchies[0] = new MondrianGuiDef.Hierarchy(); dimension.hierarchies[0].name = getResourceConverter().getString( "schemaExplorer.newHierarchyInTree.title", "New Hierarchy 0"); dimension.hierarchies[0].visible = Boolean.TRUE; dimension.hierarchies[0].hasAll = true; dimension.hierarchies[0].levels = new MondrianGuiDef.Level[0]; dimension.hierarchies[0].memberReaderParameters = new MondrianGuiDef.MemberReaderParameter[0]; // add cube to schema if (cube != null) { dimension.name = getNewName( getResourceConverter().getString( "schemaExplorer.newDimension.title", "New Dimension"), cube.dimensions); NodeDef[] temp = cube.dimensions; cube.dimensions = new MondrianGuiDef.CubeDimension[temp.length + 1]; for (int i = 0; i < temp.length; i++) { cube.dimensions[i] = (MondrianGuiDef.CubeDimension) temp[i]; } cube.dimensions[cube.dimensions.length - 1] = dimension; } else { dimension.name = getNewName( getResourceConverter().getString( "schemaExplorer.newDimension.title", "New Dimension"), schema.dimensions); NodeDef[] temp = schema.dimensions; schema.dimensions = new MondrianGuiDef.Dimension[temp.length + 1]; for (int i = 0; i < temp.length; i++) { schema.dimensions[i] = (MondrianGuiDef.Dimension) temp[i]; } schema.dimensions[schema.dimensions.length - 1] = dimension; } Object[] parentPathObjs = new Object[parentIndex + 1]; for (int i = 0; i <= parentIndex; i++) { parentPathObjs[i] = tpath.getPathComponent(i); } TreePath parentPath = new TreePath(parentPathObjs); tree.setSelectionPath(parentPath.pathByAddingChild(dimension)); refreshTree(tree.getSelectionPath()); setTableCellFocus(0); } protected void addVirtualCubeDimension(ActionEvent evt) { TreePath tpath = null; Object path = null; tpath = getTreePath(evt); int parentIndex = -1; if (tpath != null) { for (parentIndex = tpath.getPathCount() - 1; parentIndex >= 0; parentIndex--) { final Object p = tpath.getPathComponent(parentIndex); if (p instanceof MondrianGuiDef.VirtualCube) { path = p; break; } } } if (!(path instanceof MondrianGuiDef.VirtualCube)) { JOptionPane.showMessageDialog( this, getResourceConverter().getString( "schemaExplorer.virtualCubeNotSelected.alert", "Virtual Cube not selected."), alert, JOptionPane.WARNING_MESSAGE); return; } MondrianGuiDef.VirtualCube cube = (MondrianGuiDef.VirtualCube) path; MondrianGuiDef.VirtualCubeDimension dimension = new MondrianGuiDef.VirtualCubeDimension(); dimension.name = ""; dimension.name = getNewName( getResourceConverter().getString( "schemaExplorer.newVirtualDimension.title", "New Virtual Dimension"), cube.dimensions); NodeDef[] temp = cube.dimensions; cube.dimensions = new MondrianGuiDef.VirtualCubeDimension[temp.length + 1]; for (int i = 0; i < temp.length; i++) { cube.dimensions[i] = (MondrianGuiDef.VirtualCubeDimension) temp[i]; } cube.dimensions[cube.dimensions.length - 1] = dimension; Object[] parentPathObjs = new Object[parentIndex + 1]; for (int i = 0; i <= parentIndex; i++) { parentPathObjs[i] = tpath.getPathComponent(i); } TreePath parentPath = new TreePath(parentPathObjs); tree.setSelectionPath(parentPath.pathByAddingChild(dimension)); refreshTree(tree.getSelectionPath()); setTableCellFocus(0); } private String getNewName(String preName, Object[] objs) { String newName = ""; String workName = preName.trim() + " "; if (objs != null) { int objNo = objs.length; try { Field f = objs.getClass().getComponentType().getField("name"); boolean exists; do { newName = workName + objNo++; exists = existsWithFieldValue(objs, newName, f); } while (exists); } catch (Exception ex) { LOGGER.error("getNewName", ex); } } else { newName = workName + 0; } return newName; } private static boolean existsWithFieldValue( Object[] objs, String seek, Field f) throws IllegalAccessException { for (int i = 0; i < objs.length; i++) { String value = (String) f.get(objs[i]); if (seek.equals(value)) { return true; } } return false; } protected void addNamedSet(ActionEvent evt) { TreePath tpath = null; Object path = null; tpath = getTreePath(evt); int parentIndex = -1; if (tpath != null) { for (parentIndex = tpath.getPathCount() - 1; parentIndex >= 0; parentIndex--) { final Object p = tpath.getPathComponent(parentIndex); if (p instanceof MondrianGuiDef.Cube || p instanceof MondrianGuiDef.Schema) { path = p; break; } } } if (!((path instanceof MondrianGuiDef.Cube) || (path instanceof MondrianGuiDef.Schema))) { JOptionPane.showMessageDialog( this, getResourceConverter().getString( "schemaExplorer.cubeOrSchemaNotSelected.alert", "Cube or Schema not selected."), alert, JOptionPane.WARNING_MESSAGE); return; } MondrianGuiDef.Cube cube = null; MondrianGuiDef.Schema schema = null; if (path instanceof MondrianGuiDef.Cube) { cube = (MondrianGuiDef.Cube) path; } else { schema = (MondrianGuiDef.Schema) path; } MondrianGuiDef.NamedSet namedset = new MondrianGuiDef.NamedSet(); namedset.name = ""; namedset.formula = ""; namedset.formulaElement = new MondrianGuiDef.Formula(); // add cube to schema if (cube != null) { namedset.name = getNewName( getResourceConverter().getString( "schemaExplorer.newNamedSet.title", "New Named Set"), cube.namedSets); NodeDef[] temp = cube.namedSets; cube.namedSets = new MondrianGuiDef.NamedSet[temp.length + 1]; for (int i = 0; i < temp.length; i++) { cube.namedSets[i] = (MondrianGuiDef.NamedSet) temp[i]; } cube.namedSets[cube.namedSets.length - 1] = namedset; } else { namedset.name = getNewName( getResourceConverter().getString( "schemaExplorer.newNamedSet.title", "New Named Set"), schema.namedSets); NodeDef[] temp = schema.namedSets; schema.namedSets = new MondrianGuiDef.NamedSet[temp.length + 1]; for (int i = 0; i < temp.length; i++) { schema.namedSets[i] = (MondrianGuiDef.NamedSet) temp[i]; } schema.namedSets[schema.namedSets.length - 1] = namedset; } Object[] parentPathObjs = new Object[parentIndex + 1]; for (int i = 0; i <= parentIndex; i++) { parentPathObjs[i] = tpath.getPathComponent(i); } TreePath parentPath = new TreePath(parentPathObjs); tree.setSelectionPath(parentPath.pathByAddingChild(namedset)); refreshTree(tree.getSelectionPath()); setTableCellFocus(0); } protected void addDimensionUsage(ActionEvent evt) { TreePath tpath = null; Object path = null; tpath = getTreePath(evt); int parentIndex = -1; if (tpath != null) { for (parentIndex = tpath.getPathCount() - 1; parentIndex >= 0; parentIndex--) { final Object p = tpath.getPathComponent(parentIndex); if (p instanceof MondrianGuiDef.Cube) { path = p; break; } } } if (!(path instanceof MondrianGuiDef.Cube)) { JOptionPane.showMessageDialog( this, getResourceConverter().getString( "schemaExplorer.cubeNotSelected.alert", "Cube not selected."), alert, JOptionPane.WARNING_MESSAGE); return; } MondrianGuiDef.Cube cube = (MondrianGuiDef.Cube) path; MondrianGuiDef.DimensionUsage dimension = new MondrianGuiDef.DimensionUsage(); dimension.name = ""; dimension.visible = Boolean.TRUE; dimension.name = getNewName( getResourceConverter().getString( "schemaExplorer.newDimensionUsage.title", "New Dimension Usage"), cube.dimensions); NodeDef[] temp = cube.dimensions; cube.dimensions = new MondrianGuiDef.CubeDimension[temp.length + 1]; for (int i = 0; i < temp.length; i++) { cube.dimensions[i] = (MondrianGuiDef.CubeDimension) temp[i]; } cube.dimensions[cube.dimensions.length - 1] = dimension; Object[] parentPathObjs = new Object[parentIndex + 1]; for (int i = 0; i <= parentIndex; i++) { parentPathObjs[i] = tpath.getPathComponent(i); } TreePath parentPath = new TreePath(parentPathObjs); tree.setSelectionPath(parentPath.pathByAddingChild(dimension)); refreshTree(tree.getSelectionPath()); setTableCellFocus(0); } protected void addSchemaGrant(ActionEvent evt) { TreePath tpath = null; Object path = null; tpath = getTreePath(evt); int parentIndex = -1; if (tpath != null) { for (parentIndex = tpath.getPathCount() - 1; parentIndex >= 0; parentIndex--) { final Object p = tpath.getPathComponent(parentIndex); if (p instanceof MondrianGuiDef.Role) { path = p; break; } } } if (!(path instanceof MondrianGuiDef.Role)) { JOptionPane.showMessageDialog( this, getResourceConverter().getString( "schemaExplorer.roleNotSelected.alert", "Role not selected."), alert, JOptionPane.WARNING_MESSAGE); return; } MondrianGuiDef.Role role = (MondrianGuiDef.Role) path; MondrianGuiDef.SchemaGrant schemaGrant = new MondrianGuiDef.SchemaGrant(); schemaGrant.access = ""; schemaGrant.cubeGrants = new MondrianGuiDef.CubeGrant[0]; // add cube to schema NodeDef[] temp = role.schemaGrants; role.schemaGrants = new MondrianGuiDef.SchemaGrant[temp.length + 1]; for (int i = 0; i < temp.length; i++) { role.schemaGrants[i] = (MondrianGuiDef.SchemaGrant) temp[i]; } role.schemaGrants[role.schemaGrants.length - 1] = schemaGrant; Object[] parentPathObjs = new Object[parentIndex + 1]; for (int i = 0; i <= parentIndex; i++) { parentPathObjs[i] = tpath.getPathComponent(i); } TreePath parentPath = new TreePath(parentPathObjs); tree.setSelectionPath(parentPath.pathByAddingChild(schemaGrant)); refreshTree(tree.getSelectionPath()); setTableCellFocus(0); } protected void addCubeGrant(ActionEvent evt) { TreePath tpath = null; Object path = null; tpath = getTreePath(evt); int parentIndex = -1; if (tpath != null) { for (parentIndex = tpath.getPathCount() - 1; parentIndex >= 0; parentIndex--) { final Object p = tpath.getPathComponent(parentIndex); if (p instanceof MondrianGuiDef.SchemaGrant) { path = p; break; } } } if (!(path instanceof MondrianGuiDef.SchemaGrant)) { JOptionPane.showMessageDialog( this, getResourceConverter().getString( "schemaExplorer.schemaGrantNotSelected.alert", "Schema Grant not selected."), alert, JOptionPane.WARNING_MESSAGE); return; } MondrianGuiDef.SchemaGrant schemaGrant = (MondrianGuiDef.SchemaGrant) path; MondrianGuiDef.CubeGrant cubeGrant = new MondrianGuiDef.CubeGrant(); cubeGrant.access = ""; cubeGrant.dimensionGrants = new MondrianGuiDef.DimensionGrant[0]; cubeGrant.hierarchyGrants = new MondrianGuiDef.HierarchyGrant[0]; // add cube to schema NodeDef[] temp = schemaGrant.cubeGrants; schemaGrant.cubeGrants = new MondrianGuiDef.CubeGrant[temp.length + 1]; for (int i = 0; i < temp.length; i++) { schemaGrant.cubeGrants[i] = (MondrianGuiDef.CubeGrant) temp[i]; } schemaGrant.cubeGrants[schemaGrant.cubeGrants.length - 1] = cubeGrant; Object[] parentPathObjs = new Object[parentIndex + 1]; for (int i = 0; i <= parentIndex; i++) { parentPathObjs[i] = tpath.getPathComponent(i); } TreePath parentPath = new TreePath(parentPathObjs); tree.setSelectionPath(parentPath.pathByAddingChild(cubeGrant)); refreshTree(tree.getSelectionPath()); setTableCellFocus(0); } protected void addDimensionGrant(ActionEvent evt) { TreePath tpath = null; Object path = null; tpath = getTreePath(evt); int parentIndex = -1; if (tpath != null) { for (parentIndex = tpath.getPathCount() - 1; parentIndex >= 0; parentIndex--) { final Object p = tpath.getPathComponent(parentIndex); if (p instanceof MondrianGuiDef.CubeGrant) { path = p; break; } } } if (!(path instanceof MondrianGuiDef.CubeGrant)) { JOptionPane.showMessageDialog( this, getResourceConverter().getString( "schemaExplorer.cubeGrantNotSelected.alert", "Cube Grant not selected."), alert, JOptionPane.WARNING_MESSAGE); return; } MondrianGuiDef.CubeGrant cubeGrant = (MondrianGuiDef.CubeGrant) path; MondrianGuiDef.DimensionGrant dimeGrant = new MondrianGuiDef.DimensionGrant(); dimeGrant.access = ""; // add cube to schema NodeDef[] temp = cubeGrant.dimensionGrants; cubeGrant.dimensionGrants = new MondrianGuiDef.DimensionGrant[temp.length + 1]; for (int i = 0; i < temp.length; i++) { cubeGrant.dimensionGrants[i] = (MondrianGuiDef.DimensionGrant) temp[i]; } cubeGrant.dimensionGrants[cubeGrant.dimensionGrants.length - 1] = dimeGrant; Object[] parentPathObjs = new Object[parentIndex + 1]; for (int i = 0; i <= parentIndex; i++) { parentPathObjs[i] = tpath.getPathComponent(i); } TreePath parentPath = new TreePath(parentPathObjs); tree.setSelectionPath(parentPath.pathByAddingChild(dimeGrant)); refreshTree(tree.getSelectionPath()); setTableCellFocus(0); } protected void addHierarchyGrant(ActionEvent evt) { TreePath tpath = null; Object path = null; tpath = getTreePath(evt); int parentIndex = -1; if (tpath != null) { for (parentIndex = tpath.getPathCount() - 1; parentIndex >= 0; parentIndex--) { final Object p = tpath.getPathComponent(parentIndex); if (p instanceof MondrianGuiDef.CubeGrant) { path = p; break; } } } if (!(path instanceof MondrianGuiDef.CubeGrant)) { JOptionPane.showMessageDialog( this, getResourceConverter().getString( "schemaExplorer.cubeGrantNotSelected.alert", "Cube Grant not selected."), alert, JOptionPane.WARNING_MESSAGE); return; } MondrianGuiDef.CubeGrant cubeGrant = (MondrianGuiDef.CubeGrant) path; MondrianGuiDef.HierarchyGrant hieGrant = new MondrianGuiDef.HierarchyGrant(); hieGrant.access = ""; hieGrant.memberGrants = new MondrianGuiDef.MemberGrant[0]; // add cube to schema NodeDef[] temp = cubeGrant.hierarchyGrants; cubeGrant.hierarchyGrants = new MondrianGuiDef.HierarchyGrant[temp.length + 1]; for (int i = 0; i < temp.length; i++) { cubeGrant.hierarchyGrants[i] = (MondrianGuiDef.HierarchyGrant) temp[i]; } cubeGrant.hierarchyGrants[cubeGrant.hierarchyGrants.length - 1] = hieGrant; Object[] parentPathObjs = new Object[parentIndex + 1]; for (int i = 0; i <= parentIndex; i++) { parentPathObjs[i] = tpath.getPathComponent(i); } TreePath parentPath = new TreePath(parentPathObjs); tree.setSelectionPath(parentPath.pathByAddingChild(hieGrant)); refreshTree(tree.getSelectionPath()); setTableCellFocus(0); } protected void addMemberGrant(ActionEvent evt) { TreePath tpath = null; Object path = null; tpath = getTreePath(evt); int parentIndex = -1; if (tpath != null) { for (parentIndex = tpath.getPathCount() - 1; parentIndex >= 0; parentIndex--) { final Object p = tpath.getPathComponent(parentIndex); if (p instanceof MondrianGuiDef.HierarchyGrant) { path = p; break; } } } if (!(path instanceof MondrianGuiDef.HierarchyGrant)) { JOptionPane.showMessageDialog( this, getResourceConverter().getString( "schemaExplorer.hierarchyGrantNotSelected.alert", "Hierarchy Grant not selected."), alert, JOptionPane.WARNING_MESSAGE); return; } MondrianGuiDef.HierarchyGrant hieGrant = (MondrianGuiDef.HierarchyGrant) path; MondrianGuiDef.MemberGrant memberGrant = new MondrianGuiDef.MemberGrant(); memberGrant.access = ""; // add cube to schema NodeDef[] temp = hieGrant.memberGrants; hieGrant.memberGrants = new MondrianGuiDef.MemberGrant[temp.length + 1]; for (int i = 0; i < temp.length; i++) { hieGrant.memberGrants[i] = (MondrianGuiDef.MemberGrant) temp[i]; } hieGrant.memberGrants[hieGrant.memberGrants.length - 1] = memberGrant; Object[] parentPathObjs = new Object[parentIndex + 1]; for (int i = 0; i <= parentIndex; i++) { parentPathObjs[i] = tpath.getPathComponent(i); } TreePath parentPath = new TreePath(parentPathObjs); tree.setSelectionPath(parentPath.pathByAddingChild(memberGrant)); refreshTree(tree.getSelectionPath()); setTableCellFocus(0); } protected void addAnnotations(ActionEvent evt) { TreePath tpath = null; tpath = getTreePath(evt); Object path = tree.getSelectionPath().getLastPathComponent(); // Verify that the node selected in the tree is something that supports // annotations. if (path == null || (!(path instanceof MondrianGuiDef.Schema) && !(path instanceof MondrianGuiDef.CubeDimension) && !(path instanceof MondrianGuiDef.Cube) && !(path instanceof MondrianGuiDef.VirtualCube) && !(path instanceof MondrianGuiDef.VirtualCubeMeasure) && !(path instanceof MondrianGuiDef.Hierarchy) && !(path instanceof MondrianGuiDef.Level) && !(path instanceof MondrianGuiDef.Measure) && !(path instanceof MondrianGuiDef.CalculatedMember) && !(path instanceof MondrianGuiDef.NamedSet) && !(path instanceof MondrianGuiDef.Role))) { JOptionPane.showMessageDialog( this, getResourceConverter().getString( "schemaExplorer.objectNotSelectedForAnnotations.alert", "Please select an object that supports annotations."), alert, JOptionPane.WARNING_MESSAGE); return; } MondrianGuiDef.Annotations annotations = new MondrianGuiDef.Annotations(); annotations.array = new MondrianGuiDef.Annotation[0]; Class cls = path.getClass(); try { Field field = cls.getField("annotations"); field.set(path, annotations); } catch (Exception e) { throw new RuntimeException(e); } tree.setSelectionPath(tpath.pathByAddingChild(annotations)); refreshTree(tree.getSelectionPath()); } protected void addAnnotation(ActionEvent evt) { TreePath tpath = null; tpath = getTreePath(evt); Object path = tree.getSelectionPath().getLastPathComponent(); if (!(path instanceof MondrianGuiDef.Annotations)) { JOptionPane.showMessageDialog( this, getResourceConverter().getString( "schemaExplorer.annotationsNotSelected.alert", "Annotations not selected."), alert, JOptionPane.WARNING_MESSAGE); return; } MondrianGuiDef.Annotations annotations = (MondrianGuiDef.Annotations) path; MondrianGuiDef.Annotation annotation = new MondrianGuiDef.Annotation(); annotation.name = getNewName( getResourceConverter().getString( "schemaExplorer.newAnnotation.title", "New Annotation"), annotations.array); MondrianGuiDef.Annotation[] temp = annotations.array; annotations.array = new MondrianGuiDef.Annotation[temp.length + 1]; for (int i = 0; i < temp.length; i++) { annotations.array[i] = (MondrianGuiDef.Annotation) temp[i]; } annotations.array[annotations.array.length - 1] = annotation; tree.setSelectionPath(tpath.pathByAddingChild(annotation)); refreshTree(tree.getSelectionPath()); setTableCellFocus(0); } protected void addLevel(ActionEvent evt) { TreePath tpath = null; Object path = null; tpath = getTreePath(evt); int parentIndex = -1; if (tpath != null) { for (parentIndex = tpath.getPathCount() - 1; parentIndex >= 0; parentIndex--) { final Object p = tpath.getPathComponent(parentIndex); if (p instanceof MondrianGuiDef.Hierarchy) { path = p; break; } } } if (!(path instanceof MondrianGuiDef.Hierarchy)) { JOptionPane.showMessageDialog( this, getResourceConverter().getString( "schemaExplorer.hierarchyNotSelected.alert", "Hierarchy not selected."), alert, JOptionPane.WARNING_MESSAGE); return; } MondrianGuiDef.Hierarchy hierarchy = (MondrianGuiDef.Hierarchy) path; MondrianGuiDef.Level level = new MondrianGuiDef.Level(); level.uniqueMembers = false; level.visible = Boolean.TRUE; level.name = ""; level.properties = new MondrianGuiDef.Property[0]; level.name = getNewName( getResourceConverter().getString( "schemaExplorer.newLevel.title", "New Level"), hierarchy.levels); NodeDef[] temp = hierarchy.levels; hierarchy.levels = new MondrianGuiDef.Level[temp.length + 1]; for (int i = 0; i < temp.length; i++) { hierarchy.levels[i] = (MondrianGuiDef.Level) temp[i]; } hierarchy.levels[hierarchy.levels.length - 1] = level; Object[] parentPathObjs = new Object[parentIndex + 1]; for (int i = 0; i <= parentIndex; i++) { parentPathObjs[i] = tpath.getPathComponent(i); } TreePath parentPath = new TreePath(parentPathObjs); tree.setSelectionPath(parentPath.pathByAddingChild(level)); refreshTree(tree.getSelectionPath()); setTableCellFocus(0); } protected void addSQL(ActionEvent evt) { TreePath tpath = null; Object path = null; tpath = getTreePath(evt); int parentIndex = -1; if (tpath != null) { for (parentIndex = tpath.getPathCount() - 1; parentIndex >= 0; parentIndex--) { Object p = tpath.getPathComponent(parentIndex); if (p instanceof MondrianGuiDef.ExpressionView || p instanceof MondrianGuiDef.View) { // parent could also be MondrianGuiDef.Expression? path = p; break; } } } if (path == null) { JOptionPane.showMessageDialog( this, getResourceConverter().getString( "schemaExplorer.sqlExpressionNotSelected.alert", "Expression or View for SQL not selected."), alert, JOptionPane.WARNING_MESSAGE); return; } MondrianGuiDef.SQL sql = new MondrianGuiDef.SQL(); sql.dialect = "generic"; if (path instanceof MondrianGuiDef.ExpressionView) { MondrianGuiDef.ExpressionView expview = (MondrianGuiDef.ExpressionView) path; // add sql to ExpressionView NodeDef[] temp = expview.expressions; expview.expressions = new MondrianGuiDef.SQL[temp.length + 1]; for (int i = 0; i < temp.length; i++) { expview.expressions[i] = (MondrianGuiDef.SQL) temp[i]; } expview.expressions[expview.expressions.length - 1] = sql; } else { // Its a View MondrianGuiDef.View view = (MondrianGuiDef.View) path; // add sql to ExpressionView NodeDef[] temp = view.selects; view.selects = new MondrianGuiDef.SQL[temp.length + 1]; for (int i = 0; i < temp.length; i++) { view.selects[i] = (MondrianGuiDef.SQL) temp[i]; } view.selects[view.selects.length - 1] = sql; } Object[] parentPathObjs = new Object[parentIndex + 1]; for (int i = 0; i <= parentIndex; i++) { parentPathObjs[i] = tpath.getPathComponent(i); } TreePath parentPath = new TreePath(parentPathObjs); tree.setSelectionPath(parentPath.pathByAddingChild(sql)); refreshTree(tree.getSelectionPath()); setTableCellFocus(0); } protected void addScript(ActionEvent evt) { TreePath tpath = null; Object path = null; tpath = getTreePath(evt); int parentIndex = -1; if (tpath != null) { for (parentIndex = tpath.getPathCount() - 1; parentIndex >= 0; parentIndex--) { Object p = tpath.getPathComponent(parentIndex); if (p instanceof MondrianGuiDef.UserDefinedFunction || p instanceof MondrianGuiDef.MemberFormatter || p instanceof MondrianGuiDef.CellFormatter || p instanceof MondrianGuiDef.PropertyFormatter) { path = p; break; } } } if (path == null) { JOptionPane.showMessageDialog( this, getResourceConverter().getString( "schemaExplorer.userDefinedFunctionOrFormatterNotSelected.alert", "User Defined Function or Formatter not selected."), alert, JOptionPane.WARNING_MESSAGE); return; } final MondrianGuiDef.Script script = new MondrianGuiDef.Script(); if (path instanceof MondrianGuiDef.UserDefinedFunction) { final MondrianGuiDef.UserDefinedFunction parent = (MondrianGuiDef.UserDefinedFunction) path; parent.script = script; } else if (path instanceof MondrianGuiDef.CellFormatter) { final MondrianGuiDef.CellFormatter parent = (MondrianGuiDef.CellFormatter) path; parent.script = script; } else if (path instanceof MondrianGuiDef.MemberFormatter) { final MondrianGuiDef.MemberFormatter parent = (MondrianGuiDef.MemberFormatter) path; parent.script = script; } else if (path instanceof MondrianGuiDef.PropertyFormatter) { final MondrianGuiDef.PropertyFormatter parent = (MondrianGuiDef.PropertyFormatter) path; parent.script = script; } Object[] parentPathObjs = new Object[parentIndex + 1]; for (int i = 0; i <= parentIndex; i++) { parentPathObjs[i] = tpath.getPathComponent(i); } TreePath parentPath = new TreePath(parentPathObjs); tree.setSelectionPath(parentPath.pathByAddingChild(script)); refreshTree(tree.getSelectionPath()); setTableCellFocus(0); } protected void addCellFormatter(ActionEvent evt) { TreePath tpath = null; Object path = null; tpath = getTreePath(evt); int parentIndex = -1; if (tpath != null) { for (parentIndex = tpath.getPathCount() - 1; parentIndex >= 0; parentIndex--) { Object p = tpath.getPathComponent(parentIndex); if (p instanceof MondrianGuiDef.Measure || p instanceof MondrianGuiDef.CalculatedMember) { path = p; break; } } } if (path == null) { JOptionPane.showMessageDialog( this, getResourceConverter().getString( "schemaExplorer.measureOrCalculatedMemberNotSelected.alert", "Measure or Calculated Member not selected."), alert, JOptionPane.WARNING_MESSAGE); return; } final MondrianGuiDef.CellFormatter formatter = new MondrianGuiDef.CellFormatter(); if (path instanceof MondrianGuiDef.Measure) { final MondrianGuiDef.Measure parent = (MondrianGuiDef.Measure) path; parent.cellFormatter = formatter; } else if (path instanceof MondrianGuiDef.CalculatedMember) { final MondrianGuiDef.CalculatedMember parent = (MondrianGuiDef.CalculatedMember) path; parent.cellFormatter = formatter; } Object[] parentPathObjs = new Object[parentIndex + 1]; for (int i = 0; i <= parentIndex; i++) { parentPathObjs[i] = tpath.getPathComponent(i); } TreePath parentPath = new TreePath(parentPathObjs); tree.setSelectionPath(parentPath.pathByAddingChild(formatter)); refreshTree(tree.getSelectionPath()); setTableCellFocus(0); } private static class LevelInfo { MondrianGuiDef.Level level = null; Object[] parentPathObjs = null; } protected LevelInfo getSelectedLevel(ActionEvent evt) { final LevelInfo info = new LevelInfo(); TreePath tpath = null; Object path = null; tpath = getTreePath(evt); int parentIndex = -1; if (tpath != null) { for (parentIndex = tpath.getPathCount() - 1; parentIndex >= 0; parentIndex--) { Object p = tpath.getPathComponent(parentIndex); if (p instanceof MondrianGuiDef.Level) { path = p; break; } } } if (path == null || !(path instanceof MondrianGuiDef.Level)) { JOptionPane.showMessageDialog( this, getResourceConverter().getString( "schemaExplorer.levelNotSelected.alert", "Level not selected."), alert, JOptionPane.WARNING_MESSAGE); return null; } info.level = (MondrianGuiDef.Level) path; info.parentPathObjs = new Object[parentIndex + 1]; for (int i = 0; i <= parentIndex; i++) { info.parentPathObjs[i] = tpath.getPathComponent(i); } return info; } protected void addMemberFormatter(ActionEvent evt) { final LevelInfo info = getSelectedLevel(evt); if (info == null) { return; } final MondrianGuiDef.MemberFormatter formatter = new MondrianGuiDef.MemberFormatter(); info.level.memberFormatter = formatter; TreePath parentPath = new TreePath(info.parentPathObjs); tree.setSelectionPath(parentPath.pathByAddingChild(formatter)); refreshTree(tree.getSelectionPath()); setTableCellFocus(0); } protected void addPropertyFormatter(ActionEvent evt) { TreePath tpath = null; Object path = null; tpath = getTreePath(evt); int parentIndex = -1; if (tpath != null) { for (parentIndex = tpath.getPathCount() - 1; parentIndex >= 0; parentIndex--) { Object p = tpath.getPathComponent(parentIndex); if (p instanceof MondrianGuiDef.Property) { path = p; break; } } } if (path == null) { JOptionPane.showMessageDialog( this, getResourceConverter().getString( "schemaExplorer.propertyNotSelected.alert", "Property not selected."), alert, JOptionPane.WARNING_MESSAGE); return; } final MondrianGuiDef.PropertyFormatter formatter = new MondrianGuiDef.PropertyFormatter(); final MondrianGuiDef.Property parent = (MondrianGuiDef.Property) path; parent.propertyFormatter = formatter; Object[] parentPathObjs = new Object[parentIndex + 1]; for (int i = 0; i <= parentIndex; i++) { parentPathObjs[i] = tpath.getPathComponent(i); } TreePath parentPath = new TreePath(parentPathObjs); tree.setSelectionPath(parentPath.pathByAddingChild(formatter)); refreshTree(tree.getSelectionPath()); setTableCellFocus(0); } protected void addKeyExp(ActionEvent evt) { final LevelInfo info = getSelectedLevel(evt); if (info == null) { return; } MondrianGuiDef.KeyExpression keyExp = new MondrianGuiDef.KeyExpression(); keyExp.expressions = new MondrianGuiDef.SQL[1]; // min 1 keyExp.expressions[0] = new MondrianGuiDef.SQL(); keyExp.expressions[0].dialect = "generic"; keyExp.expressions[0].cdata = ""; info.level.keyExp = keyExp; TreePath parentPath = new TreePath(info.parentPathObjs); tree.setSelectionPath(parentPath.pathByAddingChild(keyExp)); refreshTree(tree.getSelectionPath()); } protected void addNameExp(ActionEvent evt) { final LevelInfo info = getSelectedLevel(evt); if (info == null) { return; } MondrianGuiDef.NameExpression nameExp = new MondrianGuiDef.NameExpression(); nameExp.expressions = new MondrianGuiDef.SQL[1]; // min 1 nameExp.expressions[0] = new MondrianGuiDef.SQL(); nameExp.expressions[0].dialect = "generic"; nameExp.expressions[0].cdata = ""; info.level.nameExp = nameExp; TreePath parentPath = new TreePath(info.parentPathObjs); tree.setSelectionPath(parentPath.pathByAddingChild(nameExp)); refreshTree(tree.getSelectionPath()); } protected void addOrdinalExp(ActionEvent evt) { final LevelInfo info = getSelectedLevel(evt); if (info == null) { return; } MondrianGuiDef.OrdinalExpression ordinalExp = new MondrianGuiDef.OrdinalExpression(); ordinalExp.expressions = new MondrianGuiDef.SQL[1]; // min 1 ordinalExp.expressions[0] = new MondrianGuiDef.SQL(); ordinalExp.expressions[0].dialect = "generic"; ordinalExp.expressions[0].cdata = ""; info.level.ordinalExp = ordinalExp; TreePath parentPath = new TreePath(info.parentPathObjs); tree.setSelectionPath(parentPath.pathByAddingChild(ordinalExp)); refreshTree(tree.getSelectionPath()); } protected void addCaptionExp(ActionEvent evt) { final LevelInfo info = getSelectedLevel(evt); if (info == null) { return; } MondrianGuiDef.CaptionExpression captionExp = new MondrianGuiDef.CaptionExpression(); captionExp.expressions = new MondrianGuiDef.SQL[1]; // min 1 captionExp.expressions[0] = new MondrianGuiDef.SQL(); captionExp.expressions[0].dialect = "generic"; captionExp.expressions[0].cdata = ""; info.level.captionExp = captionExp; TreePath parentPath = new TreePath(info.parentPathObjs); tree.setSelectionPath(parentPath.pathByAddingChild(captionExp)); refreshTree(tree.getSelectionPath()); } protected void addParentExp(ActionEvent evt) { final LevelInfo info = getSelectedLevel(evt); if (info == null) { return; } MondrianGuiDef.ParentExpression parentExp = new MondrianGuiDef.ParentExpression(); parentExp.expressions = new MondrianGuiDef.SQL[1]; // min 1 parentExp.expressions[0] = new MondrianGuiDef.SQL(); parentExp.expressions[0].dialect = "generic"; parentExp.expressions[0].cdata = ""; info.level.parentExp = parentExp; TreePath parentPath = new TreePath(info.parentPathObjs); tree.setSelectionPath(parentPath.pathByAddingChild(parentExp)); refreshTree(tree.getSelectionPath()); } protected void addMeasureExp(ActionEvent evt) { TreePath tpath = null; Object path = null; tpath = getTreePath(evt); int parentIndex = -1; if (tpath != null) { for (parentIndex = tpath.getPathCount() - 1; parentIndex >= 0; parentIndex--) { final Object p = tpath.getPathComponent(parentIndex); if (p instanceof MondrianGuiDef.Measure) { path = p; break; } } } if (!(path instanceof MondrianGuiDef.Measure)) { JOptionPane.showMessageDialog( this, getResourceConverter().getString( "schemaExplorer.measureNotSelected.alert", "Measure not selected."), alert, JOptionPane.WARNING_MESSAGE); return; } MondrianGuiDef.Measure measure = (MondrianGuiDef.Measure) path; MondrianGuiDef.MeasureExpression measureExp = new MondrianGuiDef.MeasureExpression(); measureExp.expressions = new MondrianGuiDef.SQL[1]; // min 1 measureExp.expressions[0] = new MondrianGuiDef.SQL(); measureExp.expressions[0].dialect = "generic"; measureExp.expressions[0].cdata = ""; measure.measureExp = measureExp; Object[] parentPathObjs = new Object[parentIndex + 1]; for (int i = 0; i <= parentIndex; i++) { parentPathObjs[i] = tpath.getPathComponent(i); } TreePath parentPath = new TreePath(parentPathObjs); tree.setSelectionPath(parentPath.pathByAddingChild(measureExp)); refreshTree(tree.getSelectionPath()); } protected void addFormula(ActionEvent evt) { TreePath tpath = null; Object path = null; tpath = getTreePath(evt); int parentIndex = -1; if (tpath != null) { for (parentIndex = tpath.getPathCount() - 1; parentIndex >= 0; parentIndex--) { final Object p = tpath.getPathComponent(parentIndex); if (p instanceof MondrianGuiDef.NamedSet || p instanceof MondrianGuiDef.CalculatedMember) { path = p; break; } } } if (!(path instanceof MondrianGuiDef.NamedSet || path instanceof MondrianGuiDef.CalculatedMember)) { JOptionPane.showMessageDialog( this, getResourceConverter().getString( "schemaExplorer.namedsetOrCalcMemberNotSelected.alert", "Named Set or Calculated Member not selected."), alert, JOptionPane.WARNING_MESSAGE); return; } MondrianGuiDef.Formula formulaElement = new MondrianGuiDef.Formula(); formulaElement.cdata = ""; if (path instanceof MondrianGuiDef.NamedSet) { MondrianGuiDef.NamedSet ns = (MondrianGuiDef.NamedSet) path; ns.formulaElement = formulaElement; } else if (path instanceof MondrianGuiDef.CalculatedMember) { MondrianGuiDef.CalculatedMember ns = (MondrianGuiDef.CalculatedMember) path; ns.formulaElement = formulaElement; } Object[] parentPathObjs = new Object[parentIndex + 1]; for (int i = 0; i <= parentIndex; i++) { parentPathObjs[i] = tpath.getPathComponent(i); } TreePath parentPath = new TreePath(parentPathObjs); tree.setSelectionPath(parentPath.pathByAddingChild(formulaElement)); refreshTree(tree.getSelectionPath()); } protected void addTable(ActionEvent evt) { MondrianGuiDef.RelationOrJoin relation = new MondrianGuiDef.Table( "", "Table", "", null); addRelation(evt, relation); } protected void addJoin(ActionEvent evt) { MondrianGuiDef.RelationOrJoin relation = new MondrianGuiDef.Join( "", "", new MondrianGuiDef.Table("", "Table 1", "", null), "", "", new MondrianGuiDef.Table("", "Table 2", "", null)); addRelation(evt, relation); } protected void addView(ActionEvent evt) { MondrianGuiDef.View view = new MondrianGuiDef.View(); view.alias = ""; view.selects = new MondrianGuiDef.SQL[1]; view.selects[0] = new MondrianGuiDef.SQL(); view.selects[0].dialect = "generic"; view.selects[0].cdata = ""; addRelation(evt, view); } protected void addInlineTable(ActionEvent evt) { MondrianGuiDef.InlineTable inlineTable = new MondrianGuiDef.InlineTable(); inlineTable.alias = ""; inlineTable.columnDefs = new MondrianGuiDef.ColumnDefs(); inlineTable.rows = new MondrianGuiDef.Rows(); addRelation(evt, inlineTable); } protected void addRelation( ActionEvent evt, MondrianGuiDef.RelationOrJoin relation) { TreePath tpath = null; Object path = null; tpath = getTreePath(evt); int parentIndex = -1; if (tpath != null) { for (parentIndex = tpath.getPathCount() - 1; parentIndex >= 0; parentIndex--) { Object p = tpath.getPathComponent(parentIndex); if (p instanceof MondrianGuiDef.Hierarchy || p instanceof MondrianGuiDef.Cube) { path = p; break; } } } if (path instanceof MondrianGuiDef.Hierarchy) { MondrianGuiDef.Hierarchy h = (MondrianGuiDef.Hierarchy) path; // add relation to hierarchy h.relation = relation; } else if (path instanceof MondrianGuiDef.Cube) { if (!(relation instanceof MondrianGuiDef.Relation)) { JOptionPane.showMessageDialog( this, getResourceConverter().getString( "schemaExplorer.relationOrJoinNotRelation.alert", "Can't add a Join."), alert, JOptionPane.WARNING_MESSAGE); return; } MondrianGuiDef.Cube cube = (MondrianGuiDef.Cube) path; // add relation to cube cube.fact = (MondrianGuiDef.Relation) relation; } else { JOptionPane.showMessageDialog( this, getResourceConverter().getString( "schemaExplorer.hierarchyOrCubeNotSelected.alert", "Hierarchy or Cube not selected."), alert, JOptionPane.WARNING_MESSAGE); return; } Object[] parentPathObjs = new Object[parentIndex + 1]; for (int i = 0; i <= parentIndex; i++) { parentPathObjs[i] = tpath.getPathComponent(i); } TreePath parentPath = new TreePath(parentPathObjs); tree.setSelectionPath(parentPath.pathByAddingChild(relation)); refreshTree(tree.getSelectionPath()); setTableCellFocus(0); } protected void addHierarchy(ActionEvent evt) { TreePath tpath = null; Object path = null; tpath = getTreePath(evt); int parentIndex = -1; if (tpath != null) { for (parentIndex = tpath.getPathCount() - 1; parentIndex >= 0; parentIndex--) { final Object p = tpath.getPathComponent(parentIndex); if (p instanceof MondrianGuiDef.Dimension) { path = p; break; } } } if (!(path instanceof MondrianGuiDef.Dimension)) { JOptionPane.showMessageDialog( this, getResourceConverter().getString( "schemaExplorer.dimensionNotSelected.alert", "Dimension not selected."), alert, JOptionPane.WARNING_MESSAGE); return; } MondrianGuiDef.Dimension dimension = (MondrianGuiDef.Dimension) path; MondrianGuiDef.Hierarchy hierarchy = new MondrianGuiDef.Hierarchy(); hierarchy.name = ""; hierarchy.hasAll = Boolean.TRUE; hierarchy.visible = Boolean.TRUE; hierarchy.levels = new MondrianGuiDef.Level[0]; hierarchy.memberReaderParameters = new MondrianGuiDef.MemberReaderParameter[0]; hierarchy.name = getNewName( getResourceConverter().getString( "schemaExplorer.newHierarchy.title", "New Hierarchy"), dimension.hierarchies); NodeDef[] temp = dimension.hierarchies; dimension.hierarchies = new MondrianGuiDef.Hierarchy[temp.length + 1]; for (int i = 0; i < temp.length; i++) { dimension.hierarchies[i] = (MondrianGuiDef.Hierarchy) temp[i]; } dimension.hierarchies[dimension.hierarchies.length - 1] = hierarchy; Object[] parentPathObjs = new Object[parentIndex + 1]; for (int i = 0; i <= parentIndex; i++) { parentPathObjs[i] = tpath.getPathComponent(i); } TreePath parentPath = new TreePath(parentPathObjs); tree.setSelectionPath(parentPath.pathByAddingChild(hierarchy)); refreshTree(tree.getSelectionPath()); setTableCellFocus(0); } protected void moveLevelUp(ActionEvent evt) { final LevelInfo info = getSelectedLevel(evt); if (info == null) { return; } MondrianGuiDef.Hierarchy hierarchy = (MondrianGuiDef.Hierarchy) info.parentPathObjs[info.parentPathObjs.length - 2]; int loc = -1; for (int i = 0; i < hierarchy.levels.length; i++) { if (hierarchy.levels[i] == info.level) { loc = i; break; } } if (loc > 0) { MondrianGuiDef.Level tmp = hierarchy.levels[loc - 1]; hierarchy.levels[loc - 1] = info.level; hierarchy.levels[loc] = tmp; } TreePath parentPath = new TreePath(info.parentPathObjs); tree.setSelectionPath(parentPath); refreshTree(tree.getSelectionPath()); setTableCellFocus(0); } protected void moveLevelDown(ActionEvent evt) { final LevelInfo info = getSelectedLevel(evt); if (info == null) { return; } MondrianGuiDef.Hierarchy hierarchy = (MondrianGuiDef.Hierarchy) info.parentPathObjs[info.parentPathObjs.length - 2]; int loc = -1; for (int i = 0; i < hierarchy.levels.length; i++) { if (hierarchy.levels[i] == info.level) { loc = i; break; } } if (loc < hierarchy.levels.length - 1) { MondrianGuiDef.Level tmp = hierarchy.levels[loc + 1]; hierarchy.levels[loc + 1] = info.level; hierarchy.levels[loc] = tmp; } TreePath parentPath = new TreePath(info.parentPathObjs); tree.setSelectionPath(parentPath); refreshTree(tree.getSelectionPath()); setTableCellFocus(0); } protected void addProperty(ActionEvent evt) { final LevelInfo info = getSelectedLevel(evt); if (info == null) { return; } MondrianGuiDef.Property property = new MondrianGuiDef.Property(); property.name = ""; if (info.level.properties == null) { info.level.properties = new MondrianGuiDef.Property[0]; } property.name = getNewName( getResourceConverter().getString( "schemaExplorer.newProperty.title", "New Property"), info.level.properties); NodeDef[] temp = info.level.properties; info.level.properties = new MondrianGuiDef.Property[temp.length + 1]; for (int i = 0; i < temp.length; i++) { info.level.properties[i] = (MondrianGuiDef.Property) temp[i]; } info.level.properties[info.level.properties.length - 1] = property; TreePath parentPath = new TreePath(info.parentPathObjs); tree.setSelectionPath(parentPath.pathByAddingChild(property)); refreshTree(tree.getSelectionPath()); setTableCellFocus(0); } protected void addCalculatedMemberProperty(ActionEvent evt) { TreePath tpath = null; Object path = null; tpath = getTreePath(evt); int parentIndex = -1; if (tpath != null) { for (parentIndex = tpath.getPathCount() - 1; parentIndex >= 0; parentIndex--) { final Object p = tpath.getPathComponent(parentIndex); if (p instanceof MondrianGuiDef.CalculatedMember || p instanceof MondrianGuiDef.Measure) { path = p; break; } } } if (path instanceof MondrianGuiDef.CalculatedMember) { addCalcMemberPropToCalcMember( (MondrianGuiDef.CalculatedMember)path, parentIndex, tpath); } else if (path instanceof MondrianGuiDef.Measure) { addCalcMemberPropToMeasure( (MondrianGuiDef.Measure)path, parentIndex, tpath); } else { JOptionPane.showMessageDialog( this, getResourceConverter().getString( "schemaExplorer.calculatedMemberNotSelected.alert", "Calculated Member or Measure not selected."), alert, JOptionPane.WARNING_MESSAGE); } } protected void addCalcMemberPropToCalcMember( MondrianGuiDef.CalculatedMember calcMember, int parentIndex, TreePath tpath) { MondrianGuiDef.CalculatedMemberProperty property = new MondrianGuiDef.CalculatedMemberProperty(); property.name = ""; if (calcMember.memberProperties == null) { calcMember.memberProperties = new MondrianGuiDef.CalculatedMemberProperty[0]; } property.name = getNewName( getResourceConverter().getString( "schemaExplorer.newProperty.title", "New Property"), calcMember.memberProperties); NodeDef[] temp = calcMember.memberProperties; calcMember.memberProperties = new MondrianGuiDef.CalculatedMemberProperty[temp.length + 1]; for (int i = 0; i < temp.length; i++) { calcMember.memberProperties[i] = (MondrianGuiDef.CalculatedMemberProperty) temp[i]; } calcMember.memberProperties[calcMember.memberProperties.length - 1] = property; Object[] parentPathObjs = new Object[parentIndex + 1]; for (int i = 0; i <= parentIndex; i++) { parentPathObjs[i] = tpath.getPathComponent(i); } TreePath parentPath = new TreePath(parentPathObjs); tree.setSelectionPath(parentPath.pathByAddingChild(property)); refreshTree(tree.getSelectionPath()); setTableCellFocus(0); } protected void addCalcMemberPropToMeasure( MondrianGuiDef.Measure measure, int parentIndex, TreePath tpath) { MondrianGuiDef.CalculatedMemberProperty property = new MondrianGuiDef.CalculatedMemberProperty(); property.name = ""; if (measure.memberProperties == null) { measure.memberProperties = new MondrianGuiDef.CalculatedMemberProperty[0]; } property.name = getNewName( getResourceConverter().getString( "schemaExplorer.newProperty.title", "New Property"), measure.memberProperties); NodeDef[] temp = measure.memberProperties; measure.memberProperties = new MondrianGuiDef.CalculatedMemberProperty[temp.length + 1]; for (int i = 0; i < temp.length; i++) { measure.memberProperties[i] = (MondrianGuiDef.CalculatedMemberProperty) temp[i]; } measure.memberProperties[measure.memberProperties.length - 1] = property; Object[] parentPathObjs = new Object[parentIndex + 1]; for (int i = 0; i <= parentIndex; i++) { parentPathObjs[i] = tpath.getPathComponent(i); } TreePath parentPath = new TreePath(parentPathObjs); tree.setSelectionPath(parentPath.pathByAddingChild(property)); refreshTree(tree.getSelectionPath()); setTableCellFocus(0); } protected void addClosure(ActionEvent evt) { TreePath tpath = null; Object path = null; tpath = getTreePath(evt); int parentIndex = -1; if (tpath != null) { for (parentIndex = tpath.getPathCount() - 1; parentIndex >= 0; parentIndex--) { final Object p = tpath.getPathComponent(parentIndex); if (p instanceof MondrianGuiDef.Level) { path = p; break; } } } if (!(path instanceof MondrianGuiDef.Level)) { JOptionPane.showMessageDialog( this, getResourceConverter().getString( "schemaExplorer.levelNotSelected.alert", "Level not selected."), alert, JOptionPane.WARNING_MESSAGE); return; } MondrianGuiDef.Level level = (MondrianGuiDef.Level) path; MondrianGuiDef.Closure closure = new MondrianGuiDef.Closure(); closure.parentColumn = ""; closure.childColumn = ""; closure.table = new MondrianGuiDef.Table("", "Table", "", null); if (level.closure == null) { level.closure = closure; } Object[] parentPathObjs = new Object[parentIndex + 1]; for (int i = 0; i <= parentIndex; i++) { parentPathObjs[i] = tpath.getPathComponent(i); } TreePath parentPath = new TreePath(parentPathObjs); tree.setSelectionPath(parentPath.pathByAddingChild(closure)); refreshTree(tree.getSelectionPath()); setTableCellFocus(0); } public MondrianGuiDef.Schema getSchema() { return this.schema; } /** * returns the schema file * * @return File */ public File getSchemaFile() { return this.schemaFile; } /** * sets the schema file */ public void setSchemaFile(File f) { this.schemaFile = f; } public Object lastSelected; /** * Called whenever the value of the selection changes. * * @param e the event that characterizes the change. */ public void valueChanged(TreeSelectionEvent e) { if (propertyTable.isEditing() && (lastSelected != e.getPath() .getLastPathComponent())) { SchemaPropertyCellEditor sce = (SchemaPropertyCellEditor) propertyTable.getCellEditor(); if (sce != null) { TreeSelectionEvent e2 = e; sce.stopCellEditing(); e = e2; } } lastSelected = e.getPath().getLastPathComponent(); String selectedFactTable = null; String selectedFactTableSchema = null; for (int i = e.getPath().getPathCount() - 1; i >= 0; i--) { Object comp = e.getPath().getPathComponent(i); if (comp instanceof MondrianGuiDef.Cube) { final MondrianGuiDef.Cube cube = (MondrianGuiDef.Cube) comp; if (cube.fact instanceof MondrianGuiDef.Table) { final MondrianGuiDef.Table table = (MondrianGuiDef.Table) cube.fact; selectedFactTable = table.name; selectedFactTableSchema = table.schema; } } } TreePath tpath = e.getPath(); Object o = tpath.getLastPathComponent(); Object po = null; // look for parent information TreePath parentTpath = tpath.getParentPath(); String parentName = ""; String elementName = ""; if (parentTpath != null) { po = parentTpath.getLastPathComponent(); Class parentClassName = po.getClass(); try { Field nameField = po.getClass().getField("name"); elementName = (String) nameField.get(po); if (elementName == null) { elementName = ""; } else { elementName = "'" + elementName + "'"; } } catch (Exception ex) { elementName = ""; } int pos = parentClassName.toString().lastIndexOf("$"); if (pos > 0) { parentName = parentClassName.toString().substring(pos + 1); } } // Begin : For xml edit mode display StringWriter sxml = new StringWriter(); org.eigenbase.xom.XMLOutput pxml = new org.eigenbase.xom.XMLOutput(sxml); pxml.setIndentString(" "); pxml.setAlwaysQuoteCData(true); // End : For xml edit mode display String[] pNames = DEF_DEFAULT; validStatusLabel.setText(renderer.invalid(tree, e.getPath(), o)); validStatusLabel2.setText(validStatusLabel.getText()); if (o instanceof MondrianGuiDef.Column) { pNames = DEF_COLUMN; targetLabel.setText( getResourceConverter().getString( "common.column.title", LBL_COLUMN)); } else if (o instanceof MondrianGuiDef.Cube) { pNames = DEF_CUBE; targetLabel.setText( getResourceConverter().getString( "common.cube.title", LBL_CUBE)); ((MondrianGuiDef.Cube) o).displayXML(pxml, 0); } else if (o instanceof MondrianGuiDef.Dimension) { pNames = DEF_DIMENSION; if (po instanceof MondrianGuiDef.Schema) { targetLabel.setText( getResourceConverter().getString( "common.sharedDimension.title", "Shared Dimension")); } else { targetLabel.setText( getResourceConverter().getFormattedString( "schemaExplorer.dimensionElementParent.title", "Dimension for {0} {1}", elementName, parentName)); } ((MondrianGuiDef.Dimension) o).displayXML(pxml, 0); } else if (o instanceof MondrianGuiDef.DimensionUsage) { pNames = DEF_DIMENSION_USAGE; targetLabel.setText( getResourceConverter().getFormattedString( "schemaExplorer.dimensionUsageForElement.title", "Dimension Usage for {0} {1}", elementName, parentName)); ((MondrianGuiDef.DimensionUsage) o).displayXML(pxml, 0); } else if (o instanceof MondrianGuiDef.KeyExpression) { pNames = DEF_DEFAULT; targetLabel.setText( getResourceConverter().getString( "common.keyExpression.title", LBL_KEY_EXPRESSION)); ((MondrianGuiDef.ExpressionView) o).displayXML(pxml, 0); } else if (o instanceof MondrianGuiDef.NameExpression) { pNames = DEF_DEFAULT; targetLabel.setText( getResourceConverter().getString( "common.nameExpression.title", LBL_NAME_EXPRESSION)); ((MondrianGuiDef.ExpressionView) o).displayXML(pxml, 0); } else if (o instanceof MondrianGuiDef.OrdinalExpression) { pNames = DEF_DEFAULT; targetLabel.setText( getResourceConverter().getString( "common.ordinalExpression.title", LBL_ORDINAL_EXPRESSION)); ((MondrianGuiDef.ExpressionView) o).displayXML(pxml, 0); } else if (o instanceof MondrianGuiDef.ParentExpression) { pNames = DEF_DEFAULT; targetLabel.setText( getResourceConverter().getString( "common.parentExpression.title", LBL_PARENT_EXPRESSION)); ((MondrianGuiDef.ExpressionView) o).displayXML(pxml, 0); } else if (o instanceof MondrianGuiDef.ExpressionView) { pNames = DEF_EXPRESSION_VIEW; targetLabel.setText( getResourceConverter().getString( "common.expressionView.title", LBL_EXPRESSION_VIEW)); ((MondrianGuiDef.ExpressionView) o).displayXML(pxml, 0); } else if (o instanceof MondrianGuiDef.MeasureExpression) { pNames = DEF_DEFAULT; targetLabel.setText( getResourceConverter().getString( "common.measureExpression.title", LBL_MEASURE_EXPRESSION)); ((MondrianGuiDef.ExpressionView) o).displayXML(pxml, 0); } else if (o instanceof MondrianGuiDef.Hierarchy) { pNames = DEF_HIERARCHY; targetLabel.setText( getResourceConverter().getFormattedString( "schemaExplorer.hierarchyElementParent.title", "Hierarchy for {0} {1}", elementName, parentName)); ((MondrianGuiDef.Hierarchy) o).displayXML(pxml, 0); } else if (o instanceof MondrianGuiDef.Join) { pNames = DEF_JOIN; if (parentName.equalsIgnoreCase("Join")) { Object parentJoin = parentTpath.getLastPathComponent(); int indexOfChild = tree.getModel().getIndexOfChild( parentJoin, o); switch (indexOfChild) { case 0: targetLabel.setText( getResourceConverter().getString( "common.leftJoin.title", "Left : " + LBL_JOIN)); break; case 1: targetLabel.setText( getResourceConverter().getString( "common.rightJoin.title", "Right : " + LBL_JOIN)); } } else { targetLabel.setText( getResourceConverter().getFormattedString( "schemaExplorer.generalJoinForElement.title", "Join for {0} {1}", elementName, parentName)); } ((MondrianGuiDef.Join) o).displayXML(pxml, 0); } else if (o instanceof MondrianGuiDef.Level) { pNames = DEF_LEVEL; targetLabel.setText( getResourceConverter().getFormattedString( "schemaExplorer.levelForElement.title", "Level for {0} {1}", elementName, parentName)); ((MondrianGuiDef.Level) o).displayXML(pxml, 0); } else if (o instanceof MondrianGuiDef.Measure) { pNames = DEF_MEASURE; targetLabel.setText( getResourceConverter().getFormattedString( "schemaExplorer.measureForElement.title", "Measure for {0} {1}", elementName, parentName)); ((MondrianGuiDef.Measure) o).displayXML(pxml, 0); } else if (o instanceof MondrianGuiDef.CalculatedMember) { pNames = DEF_CALCULATED_MEMBER; targetLabel.setText( getResourceConverter().getFormattedString( "schemaExplorer.calculatedMemberForElement.title", "Calculated Member for {0} {1}", elementName, parentName)); ((MondrianGuiDef.CalculatedMember) o).displayXML(pxml, 0); } else if (o instanceof MondrianGuiDef.CalculatedMemberProperty) { pNames = DEF_CALCULATED_MEMBER_PROPERTY; targetLabel.setText( getResourceConverter().getString( "common.calculatedMemberProperty.title", LBL_CALCULATED_MEMBER_PROPERTY)); } else if (o instanceof MondrianGuiDef.NamedSet) { pNames = DEF_NAMED_SET; targetLabel.setText( getResourceConverter().getFormattedString( "schemaExplorer.namedSetForElement.title", "Named Set for {0} {1}", elementName, parentName)); ((MondrianGuiDef.NamedSet) o).displayXML(pxml, 0); } else if (o instanceof MondrianGuiDef.Formula) { pNames = DEF_FORMULA; targetLabel.setText( getResourceConverter().getFormattedString( "schemaExplorer.formulaForElement.title", "Formula for {0} {1}", elementName, parentName)); ((MondrianGuiDef.Formula) o).displayXML(pxml, 0); } else if (o instanceof MondrianGuiDef.UserDefinedFunction) { pNames = DEF_USER_DEFINED_FUNCTION; targetLabel.setText( getResourceConverter().getFormattedString( "schemaExplorer.userDefinedFunctionForElement.title", "User Defined Function for {0} {1}", elementName, parentName)); ((MondrianGuiDef.UserDefinedFunction) o).displayXML(pxml, 0); } else if (o instanceof MondrianGuiDef.Script) { pNames = DEF_SCRIPT; targetLabel.setText( getResourceConverter().getFormattedString( "schemaExplorer.scriptForElement.title", "Script for {0} {1}", elementName, parentName)); ((MondrianGuiDef.Script) o).displayXML(pxml, 0); } else if (o instanceof MondrianGuiDef.CellFormatter) { pNames = DEF_FORMATTER; targetLabel.setText( getResourceConverter().getFormattedString( "schemaExplorer.cellFormatterForElement.title", "Cell Formatter for {0} {1}", elementName, parentName)); ((MondrianGuiDef.CellFormatter) o).displayXML(pxml, 0); } else if (o instanceof MondrianGuiDef.PropertyFormatter) { pNames = DEF_FORMATTER; targetLabel.setText( getResourceConverter().getFormattedString( "schemaExplorer.propertyFormatterForElement.title", "Property Formatter for {0} {1}", elementName, parentName)); ((MondrianGuiDef.PropertyFormatter) o).displayXML(pxml, 0); } else if (o instanceof MondrianGuiDef.MemberFormatter) { pNames = DEF_FORMATTER; targetLabel.setText( getResourceConverter().getFormattedString( "schemaExplorer.memberFormatterForElement.title", "Member Formatter for {0} {1}", elementName, parentName)); ((MondrianGuiDef.MemberFormatter) o).displayXML(pxml, 0); } else if (o instanceof MondrianGuiDef.MemberReaderParameter) { pNames = DEF_PARAMETER; targetLabel.setText( getResourceConverter().getString( "common.parameter.title", LBL_PARAMETER)); } else if (o instanceof MondrianGuiDef.Property) { pNames = DEF_PROPERTY; targetLabel.setText( getResourceConverter().getString( "common.property.title", LBL_PROPERTY)); ((MondrianGuiDef.Property) o).displayXML(pxml, 0); } else if (o instanceof MondrianGuiDef.Closure) { pNames = DEF_CLOSURE; targetLabel.setText( getResourceConverter().getString( "common.closure.title", LBL_CLOSURE)); ((MondrianGuiDef.Closure) o).displayXML(pxml, 0); } else if (o instanceof MondrianGuiDef.Schema) { pNames = DEF_SCHEMA; targetLabel.setText( getResourceConverter().getString( "common.schema.title", LBL_SCHEMA)); ((MondrianGuiDef.Schema) o).displayXML(pxml, 0); } else if (o instanceof MondrianGuiDef.SQL) { pNames = DEF_SQL; targetLabel.setText( getResourceConverter().getString( "common.sql.title", LBL_SQL)); ((MondrianGuiDef.SQL) o).displayXML(pxml, 0); } else if (o instanceof MondrianGuiDef.Table) { pNames = DEF_TABLE; targetLabel.setText( getResourceConverter().getFormattedString( "schemaExplorer.tableForElement.title", "Table for {0} {1}", elementName, parentName)); ((MondrianGuiDef.Table) o).displayXML(pxml, 0); } else if (o instanceof MondrianGuiDef.AggName) { pNames = DEF_AGG_NAME; targetLabel.setText( getResourceConverter().getString( "common.aggName.title", LBL_AGG_NAME)); ((MondrianGuiDef.AggName) o).displayXML(pxml, 0); } else if (o instanceof MondrianGuiDef.AggIgnoreColumn) { pNames = DEF_AGG_IGNORE_COLUMN; targetLabel.setText( getResourceConverter().getString( "common.aggIgnoreColumn.title", LBL_AGG_IGNORE_COLUMN)); ((MondrianGuiDef.AggIgnoreColumn) o).displayXML(pxml, 0); } else if (o instanceof MondrianGuiDef.AggForeignKey) { pNames = DEF_AGG_FOREIGN_KEY; targetLabel.setText( getResourceConverter().getString( "common.aggForeignKey.title", LBL_AGG_FOREIGN_KEY)); ((MondrianGuiDef.AggForeignKey) o).displayXML(pxml, 0); } else if (o instanceof MondrianGuiDef.AggMeasure) { pNames = DEF_AGG_MEASURE; targetLabel.setText( getResourceConverter().getString( "common.aggMeasure.title", LBL_AGG_MEASURE)); ((MondrianGuiDef.AggMeasure) o).displayXML(pxml, 0); } else if (o instanceof MondrianGuiDef.AggLevel) { pNames = DEF_AGG_LEVEL; targetLabel.setText( getResourceConverter().getString( "common.aggLevel.title", LBL_AGG_LEVEL)); ((MondrianGuiDef.AggLevel) o).displayXML(pxml, 0); } else if (o instanceof MondrianGuiDef.AggLevelProperty) { pNames = DEF_AGG_LEVEL_PROP; targetLabel.setText( getResourceConverter().getString( "common.aggLevelProperty.title", LBL_AGG_LEVEL_PROP)); ((MondrianGuiDef.AggLevelProperty) o).displayXML(pxml, 0); } else if (o instanceof MondrianGuiDef.AggExclude) { pNames = DEF_AGG_EXCLUDE; targetLabel.setText( getResourceConverter().getString( "common.aggExclude.title", LBL_AGG_EXCLUDE)); ((MondrianGuiDef.AggExclude) o).displayXML(pxml, 0); } else if (o instanceof MondrianGuiDef.AggPattern) { pNames = DEF_AGG_PATTERN; targetLabel.setText( getResourceConverter().getString( "common.aggPattern.title", LBL_AGG_PATTERN)); ((MondrianGuiDef.AggPattern) o).displayXML(pxml, 0); } else if (o instanceof MondrianGuiDef.AggFactCount) { pNames = DEF_AGG_FACT_COUNT; targetLabel.setText( getResourceConverter().getString( "common.aggFactCount.title", LBL_AGG_FACT_COUNT)); ((MondrianGuiDef.AggFactCount) o).displayXML(pxml, 0); } else if (o instanceof MondrianGuiDef.View) { pNames = DEF_VIEW; targetLabel.setText( getResourceConverter().getString( "common.view.title", LBL_VIEW)); } else if (o instanceof MondrianGuiDef.Role) { pNames = DEF_ROLE; targetLabel.setText( getResourceConverter().getFormattedString( "schemaExplorer.roleElementParent.title", "Role for {0} {1}", elementName, parentName)); ((MondrianGuiDef.Role) o).displayXML(pxml, 0); } else if (o instanceof MondrianGuiDef.Parameter) { pNames = DEF_PARAMETER_SCHEMA; targetLabel.setText( getResourceConverter().getString( "common.schemaParameter.title", LBL_PARAMETER_SCHEMA)); ((MondrianGuiDef.Parameter) o).displayXML(pxml, 0); } else if (o instanceof MondrianGuiDef.SchemaGrant) { pNames = DEF_SCHEMA_GRANT; targetLabel.setText( getResourceConverter().getString( "common.schemaGrant.title", LBL_SCHEMA_GRANT)); ((MondrianGuiDef.SchemaGrant) o).displayXML(pxml, 0); } else if (o instanceof MondrianGuiDef.CubeGrant) { pNames = DEF_CUBE_GRANT; targetLabel.setText( getResourceConverter().getString( "common.cubeGrant.title", LBL_CUBE_GRANT)); ((MondrianGuiDef.CubeGrant) o).displayXML(pxml, 0); } else if (o instanceof MondrianGuiDef.DimensionGrant) { pNames = DEF_DIMENSION_GRANT; targetLabel.setText( getResourceConverter().getString( "common.dimensionGrant.title", LBL_DIMENSION_GRANT)); ((MondrianGuiDef.DimensionGrant) o).displayXML(pxml, 0); } else if (o instanceof MondrianGuiDef.HierarchyGrant) { pNames = DEF_HIERARCHY_GRANT; targetLabel.setText( getResourceConverter().getString( "common.hierarchyGrant.title", LBL_HIERARCHY_GRANT)); ((MondrianGuiDef.HierarchyGrant) o).displayXML(pxml, 0); } else if (o instanceof MondrianGuiDef.MemberGrant) { pNames = DEF_MEMBER_GRANT; targetLabel.setText( getResourceConverter().getString( "common.memberGrant.title", LBL_MEMBER_GRANT)); ((MondrianGuiDef.MemberGrant) o).displayXML(pxml, 0); } else if (o instanceof MondrianGuiDef.VirtualCube) { pNames = DEF_VIRTUAL_CUBE; targetLabel.setText( getResourceConverter().getFormattedString( "schemaExplorer.virtualCubeElementParent.title", "Virtual Cube for {0} {1}", elementName, parentName)); ((MondrianGuiDef.VirtualCube) o).displayXML(pxml, 0); } else if (o instanceof MondrianGuiDef.VirtualCubeDimension) { pNames = DEF_VIRTUAL_CUBE_DIMENSION; targetLabel.setText( getResourceConverter().getFormattedString( "schemaExplorer.virtualCubeDimensionElementParent.title", "Virtual Cube Dimension for {0} {1}", elementName, parentName)); ((MondrianGuiDef.VirtualCubeDimension) o).displayXML(pxml, 0); } else if (o instanceof MondrianGuiDef.VirtualCubeMeasure) { pNames = DEF_VIRTUAL_CUBE_MEASURE; targetLabel.setText( getResourceConverter().getString( "common.virtualCubeMeasure.title", LBL_VIRTUAL_CUBE_MEASURE)); ((MondrianGuiDef.VirtualCubeMeasure) o).displayXML(pxml, 0); } else if (o instanceof MondrianGuiDef.Annotations) { pNames = DEF_DEFAULT; targetLabel.setText( getResourceConverter().getString( "common.annotations.title", LBL_ANNOTATIONS)); ((MondrianGuiDef.Annotations) o).displayXML(pxml, 0); } else if (o instanceof MondrianGuiDef.Annotation) { pNames = DEF_ANNOTATION; targetLabel.setText( getResourceConverter().getString( "common.annotation.title", LBL_ANNOTATION)); ((MondrianGuiDef.Annotation) o).displayXML(pxml, 0); } else { targetLabel.setText( getResourceConverter().getString( "common.unknownType.title", LBL_UNKNOWN_TYPE)); } try { jEditorPaneXML.read(new StringReader(sxml.toString()), null); jEditorPaneXML.getDocument().putProperty( PlainDocument.tabSizeAttribute, new Integer(2)); } catch (Exception ex) { } targetLabel2.setText(targetLabel.getText()); PropertyTableModel ptm = new PropertyTableModel(workbench, o, pNames); ptm.setFactTable(selectedFactTable); ptm.setFactTableSchema(selectedFactTableSchema); // Generate a list of pre-existing names of siblings in parent // component for checking unique names. Object parent = null; for (int i = e.getPath().getPathCount() - 1 - 1; i >= 0; i--) { parent = e.getPath().getPathComponent(i); // get parent path break; } if (parent != null) { Field[] fs = parent.getClass().getFields(); List names = new ArrayList(); for (int i = 0; i < fs.length; i++) { if (fs[i].getType().isArray() && (fs[i].getType().getComponentType().isInstance(o))) { // Selected schema object is an instance of parent's field // (an array). try { // name field of array's objects. Field fname = fs[i].getType().getComponentType().getField("name"); // get the parent's array of child objects Object objs = fs[i].get(parent); for (int j = 0; j < Array.getLength(objs); j++) { Object child = Array.get(objs, j); String vname = (String) fname.get(child); names.add(vname); } ptm.setNames(names); } catch (Exception ex) { // name field dosen't exist, skip parent object. } break; } } } propertyTable.setModel(ptm); propertyTable.getColumnModel().getColumn(0).setMaxWidth(150); propertyTable.getColumnModel().getColumn(0).setMinWidth(150); for (int i = 0; i < propertyTable.getRowCount(); i++) { TableCellRenderer renderer = propertyTable.getCellRenderer(i, 1); Component comp = renderer.getTableCellRendererComponent( propertyTable, propertyTable.getValueAt(i, 1), false, false, i, 1); try { int height = comp.getMaximumSize().height; propertyTable.setRowHeight(i, height); } catch (Exception ea) { } } } /** * @see javax.swing.event.CellEditorListener#editingCanceled(ChangeEvent) */ public void editingCanceled(ChangeEvent e) { updater.update(); } /** * @see javax.swing.event.CellEditorListener#editingStopped(ChangeEvent) */ public void editingStopped(ChangeEvent e) { setDirty(true); if (!dirtyFlag || ((PropertyTableModel) propertyTable .getModel()).target instanceof MondrianGuiDef.Schema) { setDirtyFlag(true); // true means dirty indication shown on title setTitle(); } String emsg = ((PropertyTableModel) propertyTable.getModel()).getErrorMsg(); if (emsg != null) { JOptionPane.showMessageDialog( this, emsg, "Error", JOptionPane.ERROR_MESSAGE); ((PropertyTableModel) propertyTable.getModel()).setErrorMsg(null); } updater.update(); } class PopupTrigger extends MouseAdapter { // From MouseAdapter javadoc: // // Popup menus are triggered differently // on different systems. Therefore, isPopupTrigger // should be checked in both mousePressed // and mouseReleased // for proper cross-platform functionality. public void mousePressed(MouseEvent e) { showMenu(e); } public void mouseReleased(MouseEvent e) { showMenu(e); } public void showMenu(MouseEvent e) { if (e.isPopupTrigger()) { int x = e.getX(); int y = e.getY(); TreePath path = tree.getPathForLocation(x, y); if (path != null) { jPopupMenu.setPath(path); jPopupMenu.removeAll(); Object pathSelected = path.getLastPathComponent(); if (pathSelected instanceof MondrianGuiDef.Schema) { MondrianGuiDef.Schema s = (MondrianGuiDef.Schema) pathSelected; jPopupMenu.add(addCube); jPopupMenu.add(addDimension); jPopupMenu.add(addNamedSet); jPopupMenu.add(addUserDefinedFunction); jPopupMenu.add(jSeparator1); jPopupMenu.add(addVirtualCube); jPopupMenu.add(addRole); jPopupMenu.add(addParameter); jPopupMenu.add(addAnnotations); if (s.annotations == null) { addAnnotations.setEnabled(true); } else { addAnnotations.setEnabled(false); } } else if (pathSelected instanceof MondrianGuiDef.Cube) { jPopupMenu.add(addDimension); jPopupMenu.add(addDimensionUsage); jPopupMenu.add(addMeasure); jPopupMenu.add(addCalculatedMember); jPopupMenu.add(addNamedSet); jPopupMenu.add(jSeparator1); jPopupMenu.add(addTable); jPopupMenu.add(addView); jPopupMenu.add(addInlineTable); jPopupMenu.add(addAnnotations); if (((MondrianGuiDef.Cube) pathSelected) .annotations == null) { addAnnotations.setEnabled(true); } else { addAnnotations.setEnabled(false); } jPopupMenu.add(jSeparator2); jPopupMenu.add(delete); if (((MondrianGuiDef.Cube) pathSelected).fact == null) { addMeasure.setEnabled(false); addCalculatedMember.setEnabled(false); addTable.setEnabled(true); addView.setEnabled(true); addInlineTable.setEnabled(true); } else { addMeasure.setEnabled(true); addCalculatedMember.setEnabled(true); addTable.setEnabled(false); addView.setEnabled(false); addInlineTable.setEnabled(false); } } else if (pathSelected instanceof MondrianGuiDef.Dimension) { jPopupMenu.add(addHierarchy); jPopupMenu.add(addAnnotations); if (((MondrianGuiDef.Dimension) pathSelected) .annotations == null) { addAnnotations.setEnabled(true); } else { addAnnotations.setEnabled(false); } jPopupMenu.add(jSeparator1); jPopupMenu.add(delete); } else if (pathSelected instanceof MondrianGuiDef.Hierarchy) { jPopupMenu.add(addLevel); jPopupMenu.add(jSeparator1); jPopupMenu.add(addTable); jPopupMenu.add(addJoin); jPopupMenu.add(addView); jPopupMenu.add(addInlineTable); jPopupMenu.add(addAnnotations); if (((MondrianGuiDef.Hierarchy) pathSelected) .annotations == null) { addAnnotations.setEnabled(true); } else { addAnnotations.setEnabled(false); } jPopupMenu.add(jSeparator2); jPopupMenu.add(delete); // Disable Add Level if the relation has not been set // Enable Add if (((MondrianGuiDef.Hierarchy) pathSelected).relation == null) { addLevel.setEnabled(false); addTable.setEnabled(true); addJoin.setEnabled(true); addView.setEnabled(true); addInlineTable.setEnabled(true); } else { // Enable Add Level if the relation has been set, // disable Add addLevel.setEnabled(true); addTable.setEnabled(false); addJoin.setEnabled(false); addView.setEnabled(false); addInlineTable.setEnabled(false); } } else if (pathSelected instanceof MondrianGuiDef.Level) { jPopupMenu.add(moveLevelUp); jPopupMenu.add(moveLevelDown); jPopupMenu.add(addProperty); jPopupMenu.add(addKeyExp); MondrianGuiDef.Level level = (MondrianGuiDef.Level) pathSelected; if (level.keyExp == null) { addKeyExp.setEnabled(true); } else { addKeyExp.setEnabled(false); } jPopupMenu.add(addNameExp); if (level.nameExp == null) { addNameExp.setEnabled(true); } else { addNameExp.setEnabled(false); } jPopupMenu.add(addOrdinalExp); if (level.ordinalExp == null) { addOrdinalExp.setEnabled(true); } else { addOrdinalExp.setEnabled(false); } jPopupMenu.add(addCaptionExp); if (level.captionExp == null) { addCaptionExp.setEnabled(true); } else { addCaptionExp.setEnabled(false); } jPopupMenu.add(addParentExp); if (level.parentExp == null) { addParentExp.setEnabled(true); } else { addParentExp.setEnabled(false); } jPopupMenu.add(addClosure); if (level.closure == null) { addClosure.setEnabled(true); } else { addClosure.setEnabled(false); } jPopupMenu.add(addAnnotations); if (level.annotations == null) { addAnnotations.setEnabled(true); } else { addAnnotations.setEnabled(false); } jPopupMenu.add(addMemberFormatter); if (((MondrianGuiDef.Level) pathSelected) .memberFormatter == null) { addMemberFormatter.setEnabled(true); } else { addMemberFormatter.setEnabled(false); } jPopupMenu.add(jSeparator1); jPopupMenu.add(delete); } else if (pathSelected instanceof MondrianGuiDef.KeyExpression || pathSelected instanceof MondrianGuiDef.NameExpression || pathSelected instanceof MondrianGuiDef.OrdinalExpression || pathSelected instanceof MondrianGuiDef.CaptionExpression || pathSelected instanceof MondrianGuiDef.ParentExpression || pathSelected instanceof MondrianGuiDef.ExpressionView || pathSelected instanceof MondrianGuiDef.View) { jPopupMenu.add(addSQL); jPopupMenu.add(jSeparator1); jPopupMenu.add(delete); } else if (pathSelected instanceof MondrianGuiDef.RelationOrJoin) { Object po = path.getParentPath().getLastPathComponent(); if (!(po instanceof MondrianGuiDef.RelationOrJoin) && !(po instanceof MondrianGuiDef.Closure)) { if (po instanceof MondrianGuiDef.Cube) { jPopupMenu.add(addAggName); jPopupMenu.add(addAggPattern); jPopupMenu.add(addAggExclude); jPopupMenu.add(jSeparator1); } jPopupMenu.add(delete); } else { return; } } else if (pathSelected instanceof MondrianGuiDef.Measure) { jPopupMenu.add(addMeasureExp); jPopupMenu.add(addCalculatedMemberProperty); if (((MondrianGuiDef.Measure) pathSelected).measureExp == null) { addMeasureExp.setEnabled(true); } else { addMeasureExp.setEnabled(false); } jPopupMenu.add(addAnnotations); if (((MondrianGuiDef.Measure) pathSelected) .annotations == null) { addAnnotations.setEnabled(true); } else { addAnnotations.setEnabled(false); } jPopupMenu.add(addCellFormatter); if (((MondrianGuiDef.Measure) pathSelected) .cellFormatter == null) { addCellFormatter.setEnabled(true); } else { addCellFormatter.setEnabled(false); } jPopupMenu.add(jSeparator1); jPopupMenu.add(delete); } else if (pathSelected instanceof MondrianGuiDef.NamedSet) { jPopupMenu.add(addFormula); if (((MondrianGuiDef.NamedSet) pathSelected) .formulaElement == null) { addFormula.setEnabled(false); } else { addFormula.setEnabled(false); } jPopupMenu.add(addAnnotations); if (((MondrianGuiDef.NamedSet) pathSelected) .annotations == null) { addAnnotations.setEnabled(true); } else { addAnnotations.setEnabled(false); } jPopupMenu.add(jSeparator1); jPopupMenu.add(delete); } else if (pathSelected instanceof MondrianGuiDef.CalculatedMember) { jPopupMenu.add(addFormula); jPopupMenu.add(addCalculatedMemberProperty); if (((MondrianGuiDef.CalculatedMember) pathSelected) .formulaElement == null) { addFormula.setEnabled(false); } else { addFormula.setEnabled(false); } jPopupMenu.add(addAnnotations); if (((MondrianGuiDef.CalculatedMember) pathSelected) .annotations == null) { addAnnotations.setEnabled(true); } else { addAnnotations.setEnabled(false); } jPopupMenu.add(addCellFormatter); if (((MondrianGuiDef.CalculatedMember) pathSelected) .cellFormatter == null) { addCellFormatter.setEnabled(true); } else { addCellFormatter.setEnabled(false); } jPopupMenu.add(jSeparator1); jPopupMenu.add(delete); } else if (pathSelected instanceof MondrianGuiDef.MeasureExpression) { jPopupMenu.add(addSQL); addSQL.setEnabled(false); jPopupMenu.add(jSeparator1); jPopupMenu.add(delete); } else if (pathSelected instanceof MondrianGuiDef.Closure) { jPopupMenu.add(delete); } else if (pathSelected instanceof MondrianGuiDef.AggName || pathSelected instanceof MondrianGuiDef.AggPattern) { jPopupMenu.add(addAggFactCount); jPopupMenu.add(addAggIgnoreColumn); jPopupMenu.add(addAggForeignKey); jPopupMenu.add(addAggMeasure); jPopupMenu.add(addAggLevel); if (pathSelected instanceof MondrianGuiDef.AggPattern) { jPopupMenu.add(addAggExclude); if (((MondrianGuiDef.AggPattern) pathSelected) .factcount == null) { addAggFactCount.setEnabled(true); } else { addAggFactCount.setEnabled(false); } } else { if (((MondrianGuiDef.AggName) pathSelected) .factcount == null) { addAggFactCount.setEnabled(true); } else { addAggFactCount.setEnabled(false); } } jPopupMenu.add(jSeparator1); jPopupMenu.add(delete); } else if ( pathSelected instanceof MondrianGuiDef.AggLevel) { jPopupMenu.add(addAggLevelProperty); } else if ( pathSelected instanceof MondrianGuiDef.VirtualCube) { jPopupMenu.add(addVirtualCubeDimension); jPopupMenu.add(addVirtualCubeMeasure); jPopupMenu.add(addCalculatedMember); jPopupMenu.add(addAnnotations); if ( ((MondrianGuiDef.VirtualCube) pathSelected) .annotations == null) { addAnnotations.setEnabled(true); } else { addAnnotations.setEnabled(false); } jPopupMenu.add(jSeparator1); jPopupMenu.add(delete); } else if (pathSelected instanceof MondrianGuiDef.Role) { jPopupMenu.add(addSchemaGrant); jPopupMenu.add(addAnnotations); if (((MondrianGuiDef.Role) pathSelected).annotations == null) { addAnnotations.setEnabled(true); } else { addAnnotations.setEnabled(false); } jPopupMenu.add(jSeparator1); jPopupMenu.add(delete); } else if ( pathSelected instanceof MondrianGuiDef.SchemaGrant) { jPopupMenu.add(addCubeGrant); jPopupMenu.add(jSeparator1); jPopupMenu.add(delete); } else if ( pathSelected instanceof MondrianGuiDef.CubeGrant) { jPopupMenu.add(addDimensionGrant); jPopupMenu.add(addHierarchyGrant); jPopupMenu.add(jSeparator1); jPopupMenu.add(delete); } else if ( pathSelected instanceof MondrianGuiDef.VirtualCubeMeasure) { jPopupMenu.add(addAnnotations); jPopupMenu.add(jSeparator1); jPopupMenu.add(delete); } else if ( pathSelected instanceof MondrianGuiDef.HierarchyGrant) { jPopupMenu.add(addMemberGrant); jPopupMenu.add(jSeparator1); jPopupMenu.add(delete); } else if ( pathSelected instanceof MondrianGuiDef.Annotations) { jPopupMenu.add(addAnnotation); jPopupMenu.add(jSeparator1); jPopupMenu.add(delete); } else if ( pathSelected instanceof MondrianGuiDef.UserDefinedFunction) { jPopupMenu.add(addScript); jPopupMenu.add(delete); } else if (pathSelected instanceof MondrianGuiDef.Property) { jPopupMenu.add(addPropertyFormatter); jPopupMenu.add(delete); } else if (pathSelected instanceof MondrianGuiDef.CellFormatter) { jPopupMenu.add(addScript); jPopupMenu.add(delete); } else if (pathSelected instanceof MondrianGuiDef.MemberFormatter) { jPopupMenu.add(addScript); jPopupMenu.add(delete); } else if (pathSelected instanceof MondrianGuiDef.PropertyFormatter) { jPopupMenu.add(addScript); jPopupMenu.add(delete); } else { jPopupMenu.add(delete); } jPopupMenu.show(tree, x, y); } } } } static final String[] DEF_DEFAULT = {}; static final String[] DEF_VIRTUAL_CUBE = {"name", "description", "caption", "enabled", "visible"}; static final String[] DEF_VIRTUAL_CUBE_MEASURE = { "name", "cubeName", "visible"}; static final String[] DEF_VIRTUAL_CUBE_DIMENSION = { "name", "cubeName", "caption", "foreignKey"}; static final String[] DEF_VIEW = {"alias"}; static final String[] DEF_TABLE = {"schema", "name", "alias"}; static final String[] DEF_AGG_FACT_COUNT = {"column"}; static final String[] DEF_AGG_NAME = { "name", "ignorecase", "approxRowCount"}; static final String[] DEF_AGG_PATTERN = {"pattern", "ignorecase"}; static final String[] DEF_AGG_EXCLUDE = {"pattern", "name", "ignorecase"}; static final String[] DEF_AGG_IGNORE_COLUMN = {"column"}; static final String[] DEF_AGG_FOREIGN_KEY = {"factColumn", "aggColumn"}; static final String[] DEF_AGG_MEASURE = {"column", "name"}; static final String[] DEF_AGG_LEVEL = { "column", "name", "collapsed", "captionColumn", "ordinalColumn", "nameColumn" }; static final String[] DEF_AGG_LEVEL_PROP = {"name", "column"}; static final String[] DEF_CLOSURE = {"parentColumn", "childColumn"}; static final String[] DEF_RELATION = {"name"}; static final String[] DEF_SQL = {"cdata", "dialect"}; //? static final String[] DEF_ANNOTATION = {"name", "cdata"}; static final String[] DEF_SCHEMA = { "name", "description", "measuresCaption", "defaultRole"}; static final String[] DEF_PROPERTY = { "name", "description", "column", "type", "formatter", "caption"}; static final String[] DEF_PARAMETER_SCHEMA = { "name", "description", "type", "modifiable", "defaultValue"}; //? static final String[] DEF_PARAMETER = {"name", "value"}; //? static final String[] DEF_MEASURE = { "name", "description", "aggregator", "column", "formatString", "datatype", "formatter", "caption", "visible" }; static final String[] DEF_CALCULATED_MEMBER = { "name", "description", "caption", "dimension", "hierarchy", "parent", "visible", "formula | formulaElement.cdata", "formatString", }; static final String[] DEF_FORMULA = {"cdata"}; static final String[] DEF_CALCULATED_MEMBER_PROPERTY = { "name", "description", "caption", "expression", "value"}; static final String[] DEF_NAMED_SET = {"name", "description", "formula", "caption"}; static final String[] DEF_USER_DEFINED_FUNCTION = {"name", "className"}; static final String[] DEF_SCRIPT = {"language", "cdata"}; static final String[] DEF_LEVEL = { "name", "description", "table", "column", "nameColumn", "parentColumn", "nullParentValue", "ordinalColumn", "type", "internalType", "uniqueMembers", "levelType", "hideMemberIf", "approxRowCount", "caption", "captionColumn", "formatter", "visible" }; static final String[] DEF_JOIN = { "leftAlias", "leftKey", "rightAlias", "rightKey"}; static final String[] DEF_HIERARCHY = { "name", "description", "hasAll", "allMemberName", "allMemberCaption", "allLevelName", "defaultMember", "memberReaderClass", "primaryKeyTable", "primaryKey", "caption", "visible" }; static final String[] DEF_FORMATTER = {"className"}; static final String[] DEF_EXPRESSION_VIEW = {}; static final String[] DEF_DIMENSION_USAGE = { "name", "foreignKey", "source", "level", "usagePrefix", "caption", "visible"}; static final String[] DEF_DIMENSION = { "name", "description", "foreignKey", "type", "usagePrefix", "caption", "visible"}; static final String[] DEF_CUBE = {"name", "description", "caption", "cache", "enabled", "visible"}; static final String[] DEF_ROLE = {"name"}; static final String[] DEF_SCHEMA_GRANT = {"access"}; static final String[] DEF_CUBE_GRANT = {"access", "cube"}; static final String[] DEF_DIMENSION_GRANT = {"access", "dimension"}; static final String[] DEF_HIERARCHY_GRANT = { "access", "hierarchy", "topLevel", "bottomLevel", "rollupPolicy"}; static final String[] DEF_MEMBER_GRANT = {"access", "member"}; static final String[] DEF_COLUMN = {"name", "table"}; //? private static final String LBL_COLUMN = "Column"; private static final String LBL_CUBE = "Cube"; private static final String LBL_ROLE = "Role"; private static final String LBL_SCHEMA_GRANT = "Schema Grant"; private static final String LBL_CUBE_GRANT = "Cube Grant"; private static final String LBL_DIMENSION_GRANT = "Dimension Grant"; private static final String LBL_HIERARCHY_GRANT = "Hierarchy Grant"; private static final String LBL_MEMBER_GRANT = "Member Grant"; private static final String LBL_DIMENSION = "Dimension"; private static final String LBL_DIMENSION_USAGE = "Dimension Usage"; private static final String LBL_EXPRESSION_VIEW = "Expression View"; private static final String LBL_KEY_EXPRESSION = "Key Expression"; private static final String LBL_NAME_EXPRESSION = "Name Expression"; private static final String LBL_ANNOTATIONS = "Annotations"; private static final String LBL_ANNOTATION = "Annotation"; private static final String LBL_ORDINAL_EXPRESSION = "Ordinal Expression"; private static final String LBL_PARENT_EXPRESSION = "Parent Expression"; private static final String LBL_MEASURE_EXPRESSION = "Measure Expression"; private static final String LBL_HIERARCHY = "Hierarchy"; private static final String LBL_JOIN = "Join"; private static final String LBL_LEVEL = "Level"; private static final String LBL_MEASURE = "Measure"; private static final String LBL_CALCULATED_MEMBER = "Calculated Member"; private static final String LBL_CALCULATED_MEMBER_PROPERTY = "Calculated Member Property"; private static final String LBL_NAMED_SET = "Named Set"; private static final String LBL_USER_DEFINED_FUNCTION = "User Defined Function"; private static final String LBL_PARAMETER = "Parameter"; private static final String LBL_PARAMETER_SCHEMA = "Schema Parameter"; private static final String LBL_PROPERTY = "Property"; private static final String LBL_SCHEMA = "Schema"; private static final String LBL_SQL = "SQL"; private static final String LBL_TABLE = "Table"; private static final String LBL_CLOSURE = "Closure"; private static final String LBL_AGG_NAME = "Aggregate Name"; private static final String LBL_AGG_IGNORE_COLUMN = "Aggregate Ignore Column"; private static final String LBL_AGG_FOREIGN_KEY = "Aggregate Foreign Key"; private static final String LBL_AGG_MEASURE = "Aggregate Measure"; private static final String LBL_AGG_LEVEL = "Aggregate Level"; private static final String LBL_AGG_LEVEL_PROP = "Aggregate Level Property"; private static final String LBL_AGG_PATTERN = "Aggregate Pattern"; private static final String LBL_AGG_EXCLUDE = "Aggregate Exclude"; private static final String LBL_AGG_FACT_COUNT = "Aggregate Fact Count"; private static final String LBL_VIEW = "View"; private static final String LBL_VIRTUAL_CUBE = "Virtual Cube"; private static final String LBL_VIRTUAL_CUBE_DIMENSION = "Virtual Cube Dimension"; private static final String LBL_VIRTUAL_CUBE_MEASURE = "Virtual Cube Measure"; private static final String LBL_UNKNOWN_TYPE = "Unknown Type"; private static String alert = "Alert"; private AbstractAction arrowButtonUpAction; private AbstractAction arrowButtonDownAction; private AbstractAction addCube; private AbstractAction addRole; private AbstractAction addParameter; private AbstractAction addSchemaGrant; private AbstractAction addCubeGrant; private AbstractAction addDimensionGrant; private AbstractAction addHierarchyGrant; private AbstractAction addMemberGrant; private AbstractAction addAnnotations; private AbstractAction addAnnotation; private AbstractAction addDimension; private AbstractAction addDimensionUsage; private AbstractAction addHierarchy; private AbstractAction addNamedSet; private AbstractAction addUserDefinedFunction; private AbstractAction addScript; private AbstractAction addCalculatedMember; private AbstractAction addMeasure; private AbstractAction addMeasureExp; private AbstractAction addFormula; private AbstractAction addLevel; private AbstractAction addSQL; private AbstractAction addKeyExp; private AbstractAction addNameExp; private AbstractAction addOrdinalExp; private AbstractAction addCaptionExp; private AbstractAction addParentExp; private AbstractAction addTable; private AbstractAction addJoin; private AbstractAction addView; private AbstractAction addInlineTable; private AbstractAction moveLevelUp; private AbstractAction moveLevelDown; private AbstractAction addProperty; private AbstractAction addCalculatedMemberProperty; private AbstractAction addClosure; private AbstractAction addAggName; private AbstractAction addAggIgnoreColumn; private AbstractAction addAggForeignKey; private AbstractAction addAggMeasure; private AbstractAction addAggLevel; private AbstractAction addAggLevelProperty; private AbstractAction addAggPattern; private AbstractAction addAggExclude; private AbstractAction addAggFactCount; private AbstractAction addVirtualCube; private AbstractAction addVirtualCubeDimension; private AbstractAction addVirtualCubeMeasure; private AbstractAction addCellFormatter; private AbstractAction addMemberFormatter; private AbstractAction addPropertyFormatter; private AbstractAction delete; private AbstractAction editMode; private JTable propertyTable; private JPanel jPanel1; private JPanel jPanel2; private JPanel jPanel3; private JButton addLevelButton; private JScrollPane jScrollPane2; private JScrollPane jScrollPane1; private JButton addPropertyButton; private JButton addCalculatedMemberPropertyButton; private JButton pasteButton; private JLabel targetLabel; private JLabel validStatusLabel; private JLabel targetLabel2; private JLabel validStatusLabel2; JTree tree; private JSplitPane jSplitPane1; private JButton addDimensionButton; private JButton addDimensionUsageButton; private JButton addHierarchyButton; private JButton addNamedSetButton; private JButton addUserDefinedFunctionButton; private JButton addCalculatedMemberButton; private JButton cutButton; private JButton addMeasureButton; private JButton addCubeButton; private JButton addRoleButton; private JButton addVirtualCubeButton; private JButton addVirtualCubeDimensionButton; private JButton addVirtualCubeMeasureButton; private JButton deleteButton; private JToggleButton editModeButton; private JButton copyButton; private JToolBar jToolBar1; private CustomJPopupMenu jPopupMenu; private class CustomJPopupMenu extends JPopupMenu { private TreePath path; void setPath(TreePath path) { this.path = path; } public TreePath getPath() { return path; } } private JSeparator jSeparator1; private JSeparator jSeparator2; private JPanel footer; private JLabel databaseLabel; private JPanel jPanelXML; private JScrollPane jScrollPaneXML; private JEditorPane jEditorPaneXML; public boolean isNewFile() { return newFile; } public void setNewFile(boolean newFile) { this.newFile = newFile; } public boolean isDirty() { return dirty; } public void setDirty(boolean dirty) { this.dirty = dirty; } public void setTitle() { // Sets the title of Internal Frame within which this schema explorer is // displayed. The title includes schema name and schema file name. parentIFrame.setTitle( getResourceConverter().getFormattedString( "schemaExplorer.frame.title", "Schema - {0} ({1}){2}", schema.name, schemaFile.getName(), isDirty() ? "*" : "")); parentIFrame.setToolTipText(schemaFile.toString()); } public void setDirtyFlag(boolean dirtyFlag) { this.dirtyFlag = dirtyFlag; } public Object getParentObject() { TreePath tPath = tree.getSelectionPath(); if ((tPath != null) && (tPath.getParentPath() != null)) { return tPath.getParentPath().getLastPathComponent(); } return null; } public String getJdbcConnectionUrl() { return this.jdbcMetaData.jdbcConnectionUrl; } public String getJdbcUsername() { return this.jdbcMetaData.jdbcUsername; } public String getJdbcPassword() { return this.jdbcMetaData.jdbcPassword; } public String getErrMsg() { return errMsg; } public boolean isEditModeXML() { // used by schema frame focuslistener in workbench/desktoppane return editModeXML; } public I18n getResourceConverter() { return workbench.getResourceConverter(); } public static void getTableNamesForJoin( MondrianGuiDef.RelationOrJoin aRelOrJoin, Set aTableNames) { // EC: Loops join tree and collects table names. if (aRelOrJoin instanceof MondrianGuiDef.Join) { MondrianGuiDef.RelationOrJoin theRelOrJoin_L = ((MondrianGuiDef.Join) aRelOrJoin).left; MondrianGuiDef.RelationOrJoin theRelOrJoin_R = ((MondrianGuiDef.Join) aRelOrJoin).right; for (int i = 0; i < 2; i++) { // Searches first using the Left Join and then the Right. MondrianGuiDef.RelationOrJoin theCurrentRelOrJoin = (i == 0) ? theRelOrJoin_L : theRelOrJoin_R; if (theCurrentRelOrJoin instanceof MondrianGuiDef.Table) { MondrianGuiDef.Table theTable = ((MondrianGuiDef.Table) theCurrentRelOrJoin); String theTableName = (theTable.alias != null && theTable.alias.trim().length() > 0) ? theTable.alias : theTable.name; aTableNames.add(theTableName); } else { // Calls recursively collecting all table names down the // join tree. getTableNamesForJoin(theCurrentRelOrJoin, aTableNames); } } } } public static String[] getTableNameForAlias( MondrianGuiDef.RelationOrJoin aRelOrJoin, String anAlias) { String theTableName = anAlias; String schemaName = null; // EC: Loops join tree and finds the table name for an alias. if (aRelOrJoin instanceof MondrianGuiDef.Join) { MondrianGuiDef.RelationOrJoin theRelOrJoin_L = ((MondrianGuiDef.Join) aRelOrJoin).left; MondrianGuiDef.RelationOrJoin theRelOrJoin_R = ((MondrianGuiDef.Join) aRelOrJoin).right; for (int i = 0; i < 2; i++) { // Searches first using the Left Join and then the Right. MondrianGuiDef.RelationOrJoin theCurrentRelOrJoin = (i == 0) ? theRelOrJoin_L : theRelOrJoin_R; if (theCurrentRelOrJoin instanceof MondrianGuiDef.Table) { MondrianGuiDef.Table theTable = ((MondrianGuiDef.Table) theCurrentRelOrJoin); if (theTable.alias != null && theTable.alias .equals(anAlias)) { // If the alias was found get its table name and return // it. theTableName = theTable.name; schemaName = theTable.schema; } } else { // otherwise continue down the join tree. String[] result = getTableNameForAlias( theCurrentRelOrJoin, anAlias); schemaName = result[0]; theTableName = result[1]; } } } return new String[]{schemaName, theTableName}; } public void resetMetaData(JdbcMetaData aMetaData) { // Update the JdbcMetaData in the SchemaExplorer jdbcMetaData = aMetaData; // Update the database label String theLabel = getResourceConverter().getFormattedString( "schemaExplorer.database.text", "Database - {0} ({1})", jdbcMetaData.getDbCatalogName(), jdbcMetaData.getDatabaseProductName()); databaseLabel.setText(theLabel); // Update the JdbcMetaData in the SchemaTreeCellRenderer. renderer.setMetaData(aMetaData); // Update the JdbcMetaData in the SchemaPropertyCellEditor. TableCellEditor theTableCellEditor = propertyTable.getDefaultEditor( Object.class); if (theTableCellEditor instanceof SchemaPropertyCellEditor) { ((SchemaPropertyCellEditor) theTableCellEditor).setMetaData( aMetaData); } } public JTreeUpdater getTreeUpdater() { return updater; } } // End SchemaExplorer.java mondrian-3.11.0.1-R/src/main/mondrian/gui/SchemaPropertyCellEditor.java000066400000000000000000002016551261646570300256510ustar00rootroot00000000000000/* // This software is subject to the terms of the Eclipse Public License v1.0 // Agreement, available at the following URL: // http://www.eclipse.org/legal/epl-v10.html. // You must accept the terms of that agreement to use this software. // // Copyright (C) 2002-2005 Julian Hyde // Copyright (C) 2005-2015 Pentaho and others // Copyright (C) 2006-2007 CINCOM SYSTEMS, INC. // All Rights Reserved. */ package mondrian.gui; import mondrian.gui.MondrianGuiDef.Hierarchy; import mondrian.olap.Id; import mondrian.olap.MondrianProperties; import mondrian.olap.Util; import org.eigenbase.xom.NodeDef; import java.awt.*; import java.awt.event.*; import java.io.*; import java.util.*; import java.util.List; import javax.swing.*; import javax.swing.border.EmptyBorder; import javax.swing.event.CellEditorListener; import javax.swing.event.ChangeEvent; import javax.swing.text.JTextComponent; /** * @author sean */ public class SchemaPropertyCellEditor implements javax.swing.table.TableCellEditor { Workbench workbench; final List listeners = new ArrayList(); JTextField stringEditor; JTextArea cdataTextArea; JScrollPane jScrollPaneCDATA; // JEditorPane jEditorPaneCDATA; JCheckBox booleanEditor; JTextField integerEditor; JTable tableEditor; Component activeEditor; JComboBox listEditor; JTable relationTable; JPanel relationRenderer; JdbcMetaData jdbcMetaData; ComboBoxModel allOptions, selOptions; String listEditorValue; MouseListener ml; ItemListener il; ActionListener al; String noSelect = "-- No Selection --"; FocusAdapter editorFocus; Object originalValue; public SchemaPropertyCellEditor( Workbench workbench) { this(workbench, null); } /** * Creates a new instance of SchemaPropertyCellEditor */ public SchemaPropertyCellEditor( Workbench workbench, JdbcMetaData jdbcMetaData) { this.workbench = workbench; this.jdbcMetaData = jdbcMetaData; noSelect = getResourceConverter().getString( "schemaPropertyCellEditor.noSelection", noSelect); stringEditor = new JTextField(); stringEditor.setFont(Font.decode("Dialog")); stringEditor.setBorder(null); // cdata multi-line cdataTextArea = new JTextArea(); cdataTextArea.setLineWrap(true); cdataTextArea.setWrapStyleWord(true); cdataTextArea.setLayout(new java.awt.BorderLayout()); cdataTextArea.setEditable(true); cdataTextArea.setPreferredSize(new java.awt.Dimension(100, 300)); cdataTextArea.setMinimumSize(new java.awt.Dimension(100, 100)); jScrollPaneCDATA = new JScrollPane(cdataTextArea); jScrollPaneCDATA.setMaximumSize(cdataTextArea.getPreferredSize()); booleanEditor = new JCheckBox(); booleanEditor.setBackground(Color.white); integerEditor = new JTextField(); integerEditor.setBorder(null); integerEditor.setHorizontalAlignment(JTextField.RIGHT); integerEditor.setFont(Font.decode("Courier")); tableEditor = new JTable(); listEditor = new JComboBox(); listEditor.setEditable(true); listEditor.setMaximumSize(stringEditor.getMaximumSize()); listEditor.setFont(Font.decode("Dialog")); listEditor.setBackground(Color.white); listEditor.setBorder( new EmptyBorder( 0, 0, 0, 0)); //super.noFocusBorder); al = new ActionListener() { boolean all = true; public void actionPerformed(ActionEvent e) { if (e.getActionCommand().equals("comboBoxChanged") && listEditor.getSelectedIndex() == 0) { // 0 index refers to less or more options if (all) { listEditor.setModel(allOptions); } else { listEditor.setModel(selOptions); } listEditor.setSelectedIndex(-1); all = !all; } // Must invoke later on the GUI thread since trying // now will fail. The component is already marked // as 'dirty'. SwingUtilities.invokeLater( new Runnable() { public void run() { if (listEditor.isDisplayable()) { listEditor.setPopupVisible(true); } } }); } }; JTextComponent editor = (JTextComponent) listEditor.getEditor().getEditorComponent(); editor.addMouseListener( new MouseAdapter() { public void mousePressed(MouseEvent e) { if (listEditor.isDisplayable()) { listEditor.setPopupVisible(true); } } }); editor.addKeyListener( new KeyAdapter() { public void keyPressed(KeyEvent e) { if (listEditor.isDisplayable()) { listEditor.setPopupVisible(true); } } public void keyReleased(KeyEvent e) { // listEditor.setSelectedItem( // ((JTextComponent) e.getSource()).getText()); if (e.getKeyCode() == KeyEvent.VK_ESCAPE) { listEditor.setSelectedItem(listEditorValue); listEditor.getEditor().setItem(listEditorValue); } } }); // Not used // relationRenderer = new JPanel(); // // relationList = new JComboBox( // new String[] { // getResourceConverter().getString( // "schemaPropertyCellEditor.join","Join"), // getResourceConverter().getString( // "schemaPropertyCellEditor.table","Table")}); // relationList.setMaximumSize(stringEditor.getMaximumSize()); // relationTable = new JTable(); // relationRenderer.add(relationList); // relationRenderer.add(relationTable); } public MondrianGuiDef.RelationOrJoin getRelation( final JTable table, final int row, final int column) { PropertyTableModel tableModel = (PropertyTableModel) table.getModel(); Object value = tableModel.getValue(); Class targetClassz = tableModel.target.getClass(); Object parent = this.getParentObject(); MondrianGuiDef.RelationOrJoin relation = null; if (targetClassz == MondrianGuiDef.Table.class) { relation = (MondrianGuiDef.Table) value; } else if (targetClassz == MondrianGuiDef.View.class) { relation = (MondrianGuiDef.View) value; } else if (targetClassz == MondrianGuiDef.Join.class) { relation = (MondrianGuiDef.Join) value; } else if (targetClassz == MondrianGuiDef.Hierarchy.class) { MondrianGuiDef.Hierarchy hProps = (MondrianGuiDef.Hierarchy) value; relation = hProps.relation; } else if (targetClassz == MondrianGuiDef.Level.class) { MondrianGuiDef.Hierarchy hProps = (MondrianGuiDef.Hierarchy) parent; relation = hProps.relation; } else if (targetClassz == MondrianGuiDef.Cube.class) { MondrianGuiDef.Cube hProps = (MondrianGuiDef.Cube) value; relation = hProps.fact; } return relation; } public Component getTableCellEditorComponent( final JTable table, Object value, boolean isSelected, final int row, final int column) { PropertyTableModel tableModel = (PropertyTableModel) table.getModel(); Class parentClassz = null; if (tableModel.getParentTarget() != null) { parentClassz = tableModel.getParentTarget().getClass(); } Class targetClassz = tableModel.target.getClass(); String propertyName = tableModel.getRowName(row); String selectedFactTable = tableModel.getFactTable(); String selectedFactTableSchema = tableModel.getFactTableSchema(); listEditorValue = null; // reset value of combo-box Object parent = this.getParentObject(); MondrianGuiDef.RelationOrJoin currentRelation = getRelation(table, row, column); boolean nonTableRelation = currentRelation != null && !(currentRelation instanceof MondrianGuiDef.Table || currentRelation instanceof MondrianGuiDef.Join); if (targetClassz == MondrianGuiDef.UserDefinedFunction.class && propertyName.equals("className")) { List udfs = getUdfs(); ComboBoxModel cAlludfs = new DefaultComboBoxModel(new Vector(udfs)); listEditor.setEditable(true); listEditor.setToolTipText(null); listEditor.removeActionListener(al); listEditor.setModel(cAlludfs); listEditor.setSelectedItem((String) value); listEditorValue = (String) value; activeEditor = listEditor; } else if (targetClassz == MondrianGuiDef.Measure.class && propertyName.equals("formatString")) { List formatStrs = getFormatStrings(); ComboBoxModel cAllformatStrs = new DefaultComboBoxModel(new Vector(formatStrs)); listEditor.setEditable(true); listEditor.setToolTipText(null); listEditor.removeActionListener(al); listEditor.setModel(cAllformatStrs); listEditor.setSelectedItem((String) value); listEditorValue = (String) value; activeEditor = listEditor; } else if (targetClassz == MondrianGuiDef.Measure.class && propertyName.equals("aggregator")) { listEditor.setEditable(false); listEditor.setToolTipText(null); listEditor.removeActionListener(al); listEditor.setModel( new DefaultComboBoxModel( MondrianGuiDef.Measure._aggregator_values)); listEditor.setSelectedItem((String) value); activeEditor = listEditor; } else if (targetClassz == MondrianGuiDef.Measure.class && propertyName.equals("datatype")) { listEditor.setEditable(false); listEditor.setToolTipText(null); listEditor.removeActionListener(al); listEditor.setModel( new DefaultComboBoxModel( MondrianGuiDef.Measure._datatype_values)); listEditor.setSelectedItem((String) value); activeEditor = listEditor; } else if (targetClassz == MondrianGuiDef.Parameter.class && propertyName.equals("parameter")) { listEditor.setEditable(false); listEditor.setToolTipText(null); listEditor.removeActionListener(al); listEditor.setModel( new DefaultComboBoxModel( MondrianGuiDef.Parameter._type_values)); listEditor.setSelectedItem((String) value); activeEditor = listEditor; } else if (targetClassz == MondrianGuiDef.SQL.class && propertyName.equals("dialect")) { listEditor.setEditable(false); listEditor.setToolTipText(null); listEditor.removeActionListener(al); listEditor.setModel( new DefaultComboBoxModel(MondrianGuiDef.SQL._dialect_values)); listEditor.setSelectedItem((String) value); activeEditor = listEditor; } else if (targetClassz == MondrianGuiDef.Level.class && propertyName.equals("hideMemberIf")) { listEditor.setEditable(false); listEditor.setToolTipText(null); listEditor.removeActionListener(al); listEditor.setModel( new DefaultComboBoxModel( MondrianGuiDef.Level._hideMemberIf_values)); listEditor.setSelectedItem((String) value); activeEditor = listEditor; } else if (targetClassz == MondrianGuiDef.Level.class && propertyName.equals("levelType")) { listEditor.setEditable(false); listEditor.setToolTipText(null); listEditor.removeActionListener(al); listEditor.setModel( new DefaultComboBoxModel( MondrianGuiDef.Level._levelType_values)); listEditor.setSelectedItem((String) value); activeEditor = listEditor; } else if (targetClassz == MondrianGuiDef.Level.class && propertyName.equals("type")) { listEditor.setEditable(false); listEditor.setToolTipText(null); listEditor.removeActionListener(al); listEditor.setModel( new DefaultComboBoxModel(MondrianGuiDef.Level._type_values)); listEditor.setSelectedItem((String) value); activeEditor = listEditor; } else if (targetClassz == MondrianGuiDef.Level.class && propertyName.equals("internalType")) { listEditor.setEditable(false); listEditor.setToolTipText(null); listEditor.removeActionListener(al); listEditor.setModel( new DefaultComboBoxModel( MondrianGuiDef.Level._internalType_values)); listEditor.setSelectedItem((String) value); activeEditor = listEditor; } else if (targetClassz == MondrianGuiDef.Dimension.class && propertyName.equals("type")) { listEditor.setEditable(false); listEditor.setToolTipText(null); listEditor.removeActionListener(al); listEditor.setModel( new DefaultComboBoxModel( MondrianGuiDef.Dimension._type_values)); listEditor.setSelectedItem((String) value); activeEditor = listEditor; } else if (targetClassz == MondrianGuiDef.DimensionUsage.class && propertyName.equals("source")) { List source = getSource(); ComboBoxModel cAllsource = new DefaultComboBoxModel(new Vector(source)); listEditor.setEditable(true); listEditor.setToolTipText(null); listEditor.removeActionListener(al); listEditor.setModel(cAllsource); listEditor.setSelectedItem((String) value); listEditorValue = (String) value; activeEditor = listEditor; } else if ((tableModel.target instanceof MondrianGuiDef.Grant || tableModel.target instanceof MondrianGuiDef.MemberGrant) && propertyName.equals("access")) { listEditor.setEditable(false); listEditor.setToolTipText(null); listEditor.removeActionListener(al); ComboBoxModel cAccess = new DefaultComboBoxModel( new String[]{"all", "none"}); if (targetClassz == MondrianGuiDef.SchemaGrant.class) { cAccess = new DefaultComboBoxModel( new String[]{ "all", "custom", "none", "all_dimensions" }); } else if (targetClassz == MondrianGuiDef.CubeGrant.class || targetClassz == MondrianGuiDef.DimensionGrant.class || targetClassz == MondrianGuiDef.MemberGrant.class) { cAccess = new DefaultComboBoxModel( new String[]{"all", "custom", "none"}); } else if (targetClassz == MondrianGuiDef.HierarchyGrant.class || targetClassz == MondrianGuiDef.DimensionGrant.class) { cAccess = new DefaultComboBoxModel( new String[]{ "all", "custom", "none" }); } listEditor.setModel(cAccess); listEditor.setSelectedItem((String) value); activeEditor = listEditor; } else if (targetClassz == MondrianGuiDef.HierarchyGrant.class && propertyName.equals("rollupPolicy")) { ComboBoxModel cRollupPolicy = new DefaultComboBoxModel( new String[]{"full", "partial", "hidden"}); listEditor.setModel(cRollupPolicy); listEditor.setSelectedItem(value); activeEditor = listEditor; } else if (targetClassz == MondrianGuiDef.DimensionGrant.class && propertyName.equals("dimension")) { List source = getDimensions(); ComboBoxModel cAllsource = new DefaultComboBoxModel(new Vector(source)); listEditor.setEditable(false); listEditor.setToolTipText(null); listEditor.removeActionListener(al); listEditor.setModel(cAllsource); listEditor.setSelectedItem((String) value); listEditorValue = (String) value; activeEditor = listEditor; } else if (targetClassz == MondrianGuiDef.HierarchyGrant.class && propertyName.equals("hierarchy")) { List source = getHierarchies(); ComboBoxModel cAllsource = new DefaultComboBoxModel(new Vector(source)); listEditor.setEditable(false); listEditor.setToolTipText(null); listEditor.removeActionListener(al); listEditor.setModel(cAllsource); listEditor.setSelectedItem((String) value); listEditorValue = (String) value; activeEditor = listEditor; } else if ((targetClassz == MondrianGuiDef.HierarchyGrant.class && (propertyName.equals("topLevel") || propertyName.equals("bottomLevel")))) { List source = getLevels( ((MondrianGuiDef.HierarchyGrant) tableModel.target).hierarchy); ComboBoxModel cAllsource = new DefaultComboBoxModel(new Vector(source)); listEditor.setEditable(false); listEditor.setToolTipText(null); listEditor.removeActionListener(al); listEditor.setModel(cAllsource); listEditor.setSelectedItem((String) value); listEditorValue = (String) value; activeEditor = listEditor; } else if (((targetClassz == MondrianGuiDef.VirtualCubeDimension.class || targetClassz == MondrianGuiDef.VirtualCubeMeasure.class) && propertyName.equals("cubeName")) || (targetClassz == MondrianGuiDef.CubeGrant.class && propertyName.equals("cube"))) { List source = getCubes(); ComboBoxModel cAllsource = new DefaultComboBoxModel(new Vector(source)); listEditor.setEditable(false); listEditor.setToolTipText(null); listEditor.removeActionListener(al); listEditor.setModel(cAllsource); listEditor.setSelectedItem((String) value); listEditorValue = (String) value; activeEditor = listEditor; } else if ((targetClassz == MondrianGuiDef.Dimension.class && propertyName.equals("foreignKey")) || (targetClassz == MondrianGuiDef.DimensionUsage.class && propertyName.equals("foreignKey")) || (targetClassz == MondrianGuiDef.Measure.class && propertyName.equals("column"))) { Vector fks = new Vector( jdbcMetaData.getFactTableFKs( selectedFactTableSchema, selectedFactTable)); fks.add( 0, getResourceConverter().getString( "schemaPropertyCellEditor.allColumns", "<< All Columns >>")); Vector allcols = new Vector( jdbcMetaData.getAllColumns( selectedFactTableSchema, selectedFactTable)); ComboBoxModel cFks = new DefaultComboBoxModel(fks); listEditor.setEditable(true); listEditor.setToolTipText(null); listEditor.removeActionListener(al); if ((fks.size() > 1) && propertyName.equals("foreignKey")) { allcols.add( 0, getResourceConverter().getString( "schemaPropertyCellEditor.foreignKeys", "<< Foreign keys >>")); ComboBoxModel cAllcols = new DefaultComboBoxModel(allcols); listEditor.setModel(cFks); selOptions = cFks; allOptions = cAllcols; listEditor.addActionListener(al); } else { ComboBoxModel cAllcols = new DefaultComboBoxModel(allcols); listEditor.setModel(cAllcols); } listEditor.setSelectedItem((String) value); listEditorValue = (String) value; activeEditor = listEditor; } else if (targetClassz == MondrianGuiDef.Hierarchy.class && propertyName.equals("primaryKey")) { MondrianGuiDef.Hierarchy hProps = (MondrianGuiDef.Hierarchy) tableModel.getValue(); String pkTable = hProps.primaryKeyTable; String schemaName = null; String pk = ""; List allcols; MondrianGuiDef.RelationOrJoin relation = hProps.relation; if (relation instanceof MondrianGuiDef.Table) { pkTable = ((MondrianGuiDef.Table) relation).name; schemaName = ((MondrianGuiDef.Table) relation).schema; pk = jdbcMetaData.getTablePK(schemaName, pkTable); } else if (relation instanceof MondrianGuiDef.Join) { String[] schemaAndTable = SchemaExplorer.getTableNameForAlias( hProps.relation, pkTable); schemaName = schemaAndTable[0]; pkTable = schemaAndTable[1]; } if (relation instanceof MondrianGuiDef.Table || relation instanceof MondrianGuiDef.Join) { allcols = jdbcMetaData.getAllColumns(schemaName, pkTable); pk = jdbcMetaData.getTablePK(schemaName, pkTable); } else { allcols = Collections.emptyList(); } ComboBoxModel cAllcols = new DefaultComboBoxModel(new Vector(allcols)); listEditor.setEditable(true); listEditor.setToolTipText(null); listEditor.removeActionListener(al); listEditor.setModel(cAllcols); if (value == null || ((String) value).equals("")) { listEditor.setSelectedItem(pk); } else { listEditor.setSelectedItem((String) value); listEditorValue = (String) value; } activeEditor = listEditor; } else if ((targetClassz == MondrianGuiDef.Level.class && propertyName.equals("column")) || (targetClassz == MondrianGuiDef.Level.class && propertyName.equals("nameColumn")) || (targetClassz == MondrianGuiDef.Level.class && propertyName.equals("parentColumn")) || (targetClassz == MondrianGuiDef.Level.class && propertyName.equals("ordinalColumn")) || (targetClassz == MondrianGuiDef.Level.class && propertyName.equals("captionColumn")) || (targetClassz == MondrianGuiDef.Closure.class && propertyName.equals("parentColumn")) || (targetClassz == MondrianGuiDef.Closure.class && propertyName.equals("childColumn")) || (targetClassz == MondrianGuiDef.Property.class && propertyName.equals("column"))) { MondrianGuiDef.Level lProps; if (targetClassz == MondrianGuiDef.Level.class) { lProps = (MondrianGuiDef.Level) tableModel.getValue(); } else { lProps = (MondrianGuiDef.Level) this.getParentObject(); } String schemaName = null; String lTable = lProps.table; List allcols; // Sets the corresponding columns on the selection dropdown for the // specified table. if (targetClassz == MondrianGuiDef.Level.class && parent != null) { if (parent instanceof MondrianGuiDef.Hierarchy) { MondrianGuiDef.RelationOrJoin relation = ((MondrianGuiDef.Hierarchy) parent).relation; if (relation instanceof MondrianGuiDef.Table) { lTable = ((MondrianGuiDef.Table) relation).name; schemaName = ((MondrianGuiDef.Table) relation).schema; } else if (relation instanceof MondrianGuiDef.Join) { String[] schemaAndTable = SchemaExplorer.getTableNameForAlias( relation, lTable); schemaName = schemaAndTable[0]; lTable = schemaAndTable[1]; } } } if (lTable != null) { allcols = jdbcMetaData.getAllColumns(schemaName, lTable); } else { allcols = Collections.emptyList(); } ComboBoxModel cAllcols = new DefaultComboBoxModel(new Vector(allcols)); listEditor.setEditable(true); listEditor.setToolTipText(null); listEditor.removeActionListener(al); listEditor.setModel(cAllcols); listEditor.setSelectedItem((String) value); listEditorValue = (String) value; activeEditor = listEditor; } else if (targetClassz == MondrianGuiDef.Property.class && propertyName.equals("type")) { listEditor.setEditable(false); listEditor.setToolTipText(null); listEditor.removeActionListener(al); listEditor.setModel( new DefaultComboBoxModel(MondrianGuiDef.Property._type_values)); listEditor.setSelectedItem((String) value); activeEditor = listEditor; } else if ((targetClassz == MondrianGuiDef.AggFactCount.class && propertyName.equals("column")) || (targetClassz == MondrianGuiDef.AggIgnoreColumn.class && propertyName.equals("column")) || (targetClassz == MondrianGuiDef.AggLevelProperty.class && propertyName.equals("column")) || (targetClassz == MondrianGuiDef.AggLevel.class && Arrays.asList( "column", "ordinalColumn", "captionColumn", "nameColumn").contains(propertyName)) || (targetClassz == MondrianGuiDef.AggMeasure.class && propertyName.equals("column")) || (targetClassz == MondrianGuiDef.AggForeignKey.class && propertyName.equals("factColumn")) || (targetClassz == MondrianGuiDef.AggForeignKey.class && propertyName.equals("aggColumn"))) { List allcols = jdbcMetaData.getAllColumns(null, null); ComboBoxModel cAllcols = new DefaultComboBoxModel(new Vector(allcols)); listEditor.setEditable(true); listEditor.setToolTipText(null); listEditor.removeActionListener(al); listEditor.setModel(cAllcols); listEditor.setSelectedItem((String) value); listEditorValue = (String) value; activeEditor = listEditor; } else if (targetClassz == MondrianGuiDef.Table.class && propertyName .equals("schema")) { List allschemas = jdbcMetaData.getAllSchemas(); ComboBoxModel cAllschemas = new DefaultComboBoxModel(new Vector(allschemas)); listEditor.setEditable(true); listEditor.setToolTipText(null); listEditor.removeActionListener(al); listEditor.setModel(cAllschemas); listEditor.setSelectedItem((String) value); listEditorValue = (String) value; activeEditor = listEditor; } else if (currentRelation != null && nonTableRelation && ((targetClassz == MondrianGuiDef.Hierarchy.class && propertyName.equals("primaryKeyTable")) || (targetClassz == MondrianGuiDef.Level.class && propertyName.equals("table")))) { // Can't set a table on a non table relation listEditor.setEditable(false); listEditor.setToolTipText(null); listEditor.removeActionListener(al); activeEditor = listEditor; } else if ((targetClassz == MondrianGuiDef.Table.class && propertyName.equals("name")) || (targetClassz == MondrianGuiDef.Hierarchy.class && propertyName.equals("primaryKeyTable")) || (targetClassz == MondrianGuiDef.Level.class && propertyName.equals("table"))) { String schema = ""; if (targetClassz == MondrianGuiDef.Table.class) { MondrianGuiDef.Table tProps = (MondrianGuiDef.Table) tableModel.getValue(); schema = tProps.schema; } Vector factTables = new Vector(jdbcMetaData.getFactTables(schema)); Vector allTablesMinusFact = new Vector( jdbcMetaData.getAllTables( schema, selectedFactTable)); Vector allTables = new Vector(jdbcMetaData.getAllTables(schema)); Vector dimeTables = new Vector( jdbcMetaData.getDimensionTables( schema, selectedFactTable)); // suggestive fact tables ComboBoxModel cFactTables = new DefaultComboBoxModel(factTables); // all tables of selected schema ComboBoxModel cAllTables = new DefaultComboBoxModel( (allTablesMinusFact.size() > 0) ? allTablesMinusFact : allTables); // suggestive dimension tables based on selected fact table ComboBoxModel cDimeTables = new DefaultComboBoxModel(dimeTables); // Sets the corresponding join tables on selection dropdown when // using joins. if (targetClassz == MondrianGuiDef.Level.class || targetClassz == MondrianGuiDef.Hierarchy.class) { MondrianGuiDef.RelationOrJoin relation = null; if (parent != null && parent instanceof MondrianGuiDef.Hierarchy) { relation = ((MondrianGuiDef.Hierarchy) parent).relation; } else { relation = ((MondrianGuiDef.Hierarchy) tableModel.target).relation; } if (relation instanceof MondrianGuiDef.Join) { TreeSet joinTables = new TreeSet(); // getTableNamesForJoin calls itself recursively and // collects table names in joinTables. SchemaExplorer.getTableNamesForJoin(relation, joinTables); cAllTables = new DefaultComboBoxModel( new Vector( joinTables)); } } listEditor.setEditable(true); listEditor.setToolTipText(null); listEditor.removeActionListener(al); listEditor.setModel(cAllTables); allOptions = cAllTables; boolean toggleModel = false; if (parentClassz == MondrianGuiDef.Cube.class) { cAllTables = new DefaultComboBoxModel(allTables); allOptions = cAllTables; if (factTables.size() > 0) { ((DefaultComboBoxModel) cFactTables).insertElementAt( workbench.getResourceConverter().getString( "schemaPropertyCellEditor.allTables", "<< All Tables >>"), 0); ((DefaultComboBoxModel) cAllTables).insertElementAt( workbench.getResourceConverter().getString( "schemaPropertyCellEditor.factTables", "<< Fact Tables >>"), 0); listEditor.setModel(cFactTables); selOptions = cFactTables; toggleModel = true; } } else { if (dimeTables.size() > 0) { ((DefaultComboBoxModel) cDimeTables).insertElementAt( workbench.getResourceConverter().getString( "schemaPropertyCellEditor.allTables", "<< All Tables >>"), 0); ((DefaultComboBoxModel) cAllTables).insertElementAt( workbench.getResourceConverter().getString( "schemaPropertyCellEditor.dimensionTables", "<< Dimension Tables >>"), 0); listEditor.setModel(cDimeTables); selOptions = cDimeTables; toggleModel = true; } } if (toggleModel) { listEditor.addActionListener(al); } listEditor.setSelectedItem((String) value); listEditorValue = (String) value; activeEditor = listEditor; // Disables table selection when not using joins. if ((targetClassz == MondrianGuiDef.Level.class && propertyName.equals(SchemaExplorer.DEF_LEVEL[1]) && parent != null) || (targetClassz == MondrianGuiDef.Hierarchy.class && propertyName.equals(SchemaExplorer.DEF_HIERARCHY[7]) && parent != null)) { MondrianGuiDef.RelationOrJoin relation = null; if (parent instanceof MondrianGuiDef.Hierarchy) { relation = ((MondrianGuiDef.Hierarchy) parent).relation; } else if (parent instanceof MondrianGuiDef.Dimension) { relation = ((MondrianGuiDef.Hierarchy) tableModel.target).relation; } if (relation instanceof MondrianGuiDef.Table) { activeEditor = stringEditor; stringEditor.setText((String) value); } } } else if (propertyName.equals("cdata")) { try { cdataTextArea.read(new StringReader((String) value), null); } catch (Exception ex) { } activeEditor = jScrollPaneCDATA; } else if (value instanceof String) { activeEditor = stringEditor; stringEditor.setText((String) value); } else if (value instanceof Boolean) { activeEditor = booleanEditor; booleanEditor.setSelected((Boolean) value); } else if (value instanceof Integer) { activeEditor = integerEditor; integerEditor.setText((String) value); } else if (value == null) { value = ""; activeEditor = stringEditor; stringEditor.setText((String) value); } else if (value.getClass() == MondrianGuiDef.Join.class) { SchemaPropertyCellEditor spce = new SchemaPropertyCellEditor(workbench); tableEditor.setDefaultEditor(Object.class, spce); SchemaPropertyCellRenderer spcr = new SchemaPropertyCellRenderer(workbench); tableEditor.setDefaultRenderer(Object.class, spcr); PropertyTableModel ptm = new PropertyTableModel( workbench, value, SchemaExplorer.DEF_JOIN); tableEditor.setModel(ptm); activeEditor = tableEditor; } else if (value.getClass() == MondrianGuiDef.NameExpression.class) { return null; } else if (value.getClass() == MondrianGuiDef.RelationOrJoin.class) { // REVIEW: I don't think this code will ever be executed, because // class RelationOrJoin is abstract. SchemaPropertyCellEditor spce = new SchemaPropertyCellEditor(workbench); tableEditor.setDefaultEditor(Object.class, spce); SchemaPropertyCellRenderer spcr = new SchemaPropertyCellRenderer(workbench); tableEditor.setDefaultRenderer(Object.class, spcr); PropertyTableModel ptm = new PropertyTableModel( workbench, value, SchemaExplorer.DEF_RELATION); tableEditor.setModel(ptm); activeEditor = tableEditor; return null; } else if (value.getClass() == MondrianGuiDef.OrdinalExpression.class) { SchemaPropertyCellEditor spce = new SchemaPropertyCellEditor(workbench); tableEditor.setDefaultEditor(Object.class, spce); SchemaPropertyCellRenderer spcr = new SchemaPropertyCellRenderer(workbench); tableEditor.setDefaultRenderer(Object.class, spcr); PropertyTableModel ptm = new PropertyTableModel( workbench, ((MondrianGuiDef.OrdinalExpression) value).expressions[0], SchemaExplorer.DEF_SQL); ptm.setParentTarget(((PropertyTableModel) table.getModel()).target); tableEditor.setModel(ptm); activeEditor = tableEditor; } else if (value.getClass() == MondrianGuiDef.CaptionExpression.class) { SchemaPropertyCellEditor spce = new SchemaPropertyCellEditor(workbench); tableEditor.setDefaultEditor(Object.class, spce); SchemaPropertyCellRenderer spcr = new SchemaPropertyCellRenderer(workbench); tableEditor.setDefaultRenderer(Object.class, spcr); PropertyTableModel ptm = new PropertyTableModel( workbench, ((MondrianGuiDef.CaptionExpression) value).expressions[0], SchemaExplorer.DEF_SQL); ptm.setParentTarget(((PropertyTableModel) table.getModel()).target); tableEditor.setModel(ptm); activeEditor = tableEditor; } else if (value.getClass() == MondrianGuiDef.Formula.class) { SchemaPropertyCellEditor spce = new SchemaPropertyCellEditor( workbench, jdbcMetaData); tableEditor.setDefaultEditor(Object.class, spce); SchemaPropertyCellRenderer spcr = new SchemaPropertyCellRenderer(workbench); tableEditor.setDefaultRenderer(Object.class, spcr); PropertyTableModel ptm = new PropertyTableModel( workbench, value, SchemaExplorer.DEF_FORMULA); tableEditor.setModel(ptm); tableEditor.getColumnModel().getColumn(0).setMaxWidth(100); tableEditor.getColumnModel().getColumn(0).setMinWidth(100); activeEditor = tableEditor; } else if (value.getClass() == MondrianGuiDef.CalculatedMemberProperty.class) { SchemaPropertyCellEditor spce = new SchemaPropertyCellEditor(workbench, jdbcMetaData); tableEditor.setDefaultEditor(Object.class, spce); SchemaPropertyCellRenderer spcr = new SchemaPropertyCellRenderer(workbench); tableEditor.setDefaultRenderer(Object.class, spcr); PropertyTableModel ptm = new PropertyTableModel( workbench, value, SchemaExplorer.DEF_CALCULATED_MEMBER_PROPERTY); tableEditor.setModel(ptm); tableEditor.getColumnModel().getColumn(0).setMaxWidth(100); tableEditor.getColumnModel().getColumn(0).setMinWidth(100); activeEditor = tableEditor; } else if (value.getClass() == MondrianGuiDef.Table.class) { SchemaPropertyCellEditor spce = new SchemaPropertyCellEditor(workbench, jdbcMetaData); // Adding cell editing stopped listeners to nested property of type // table so that any change in value of table fields are reflected // in tree. for (int i = listeners.size() - 1; i >= 0; i--) { spce.addCellEditorListener(listeners.get(i)); } tableEditor.setDefaultEditor(Object.class, spce); SchemaPropertyCellRenderer spcr = new SchemaPropertyCellRenderer( workbench); tableEditor.setDefaultRenderer(Object.class, spcr); PropertyTableModel ptm = new PropertyTableModel( workbench, value, SchemaExplorer.DEF_TABLE); ptm.setFactTable(selectedFactTable); if (targetClassz == MondrianGuiDef.Cube.class) { ptm.setParentTarget( ((PropertyTableModel) table.getModel()).target); } tableEditor.setModel(ptm); tableEditor.getColumnModel().getColumn(0).setMaxWidth(100); tableEditor.getColumnModel().getColumn(0).setMinWidth(100); activeEditor = tableEditor; } else if (value.getClass() == MondrianGuiDef.AggFactCount.class) { SchemaPropertyCellEditor spce = new SchemaPropertyCellEditor( workbench, jdbcMetaData); // Adding cell editing stopped listeners to nested property of type // table so that any change in value of table fields are reflected // in tree. for (int i = listeners.size() - 1; i >= 0; i--) { spce.addCellEditorListener(listeners.get(i)); } tableEditor.setDefaultEditor(Object.class, spce); SchemaPropertyCellRenderer spcr = new SchemaPropertyCellRenderer( workbench); tableEditor.setDefaultRenderer(Object.class, spcr); PropertyTableModel ptm = new PropertyTableModel( workbench, value, SchemaExplorer.DEF_AGG_FACT_COUNT); ptm.setFactTable(selectedFactTable); tableEditor.setModel(ptm); tableEditor.getColumnModel().getColumn(0).setMaxWidth(100); tableEditor.getColumnModel().getColumn(0).setMinWidth(100); activeEditor = tableEditor; } else if (value.getClass() == MondrianGuiDef.Closure.class) { SchemaPropertyCellEditor spce = new SchemaPropertyCellEditor(workbench, jdbcMetaData); // Adding cell editing stopped listeners to nested property of type // table so that any change in value of table fields are reflected // in tree. for (int i = listeners.size() - 1; i >= 0; i--) { spce.addCellEditorListener(listeners.get(i)); } tableEditor.setDefaultEditor(Object.class, spce); SchemaPropertyCellRenderer spcr = new SchemaPropertyCellRenderer(workbench); tableEditor.setDefaultRenderer(Object.class, spcr); PropertyTableModel ptm = new PropertyTableModel( workbench, value, SchemaExplorer.DEF_CLOSURE); ptm.setFactTable(selectedFactTable); if (targetClassz == MondrianGuiDef.Level.class) { ptm.setParentTarget( ((PropertyTableModel) table.getModel()).target); } tableEditor.setModel(ptm); tableEditor.getColumnModel().getColumn(0).setMaxWidth(100); tableEditor.getColumnModel().getColumn(0).setMinWidth(100); spcr.setTableRendererHeight(tableEditor, null); activeEditor = tableEditor; } else if (value.getClass() == MondrianGuiDef.Property.class) { SchemaPropertyCellEditor spce = new SchemaPropertyCellEditor(workbench); tableEditor.setDefaultEditor(Object.class, spce); SchemaPropertyCellRenderer spcr = new SchemaPropertyCellRenderer(workbench); tableEditor.setDefaultRenderer(Object.class, spcr); PropertyTableModel ptm = new PropertyTableModel( workbench, value, SchemaExplorer.DEF_PROPERTY); tableEditor.setModel(ptm); activeEditor = tableEditor; } else { value = ""; activeEditor = stringEditor; stringEditor.setText((String) value); } activeEditor.setVisible(true); setOriginalValue(); table.changeSelection(row, column, false, false); activeEditor.setBackground(new java.awt.Color(224, 249, 255)); activeEditor.requestFocusInWindow(); return activeEditor; } /** * save original value to see whether it changed */ private void setOriginalValue() { if (activeEditor == stringEditor) { originalValue = stringEditor.getText(); } else if (activeEditor == booleanEditor) { originalValue = booleanEditor.isSelected(); } else if (activeEditor == listEditor) { if (listEditor.isEditable()) { // returns the edited value from combox box originalValue = listEditor.getEditor().getItem(); } else { if (listEditor.getSelectedItem() == noSelect) { originalValue = null; // blank selection } // returns the selected value from combox box originalValue = listEditor.getSelectedItem(); } } else if (activeEditor == tableEditor) { originalValue = ((PropertyTableModel) tableEditor.getModel()).getValue(); } else if (activeEditor == jScrollPaneCDATA) { Writer cdataTextAreaStr = new StringWriter(); try { cdataTextArea.write(cdataTextAreaStr); } catch (Exception ex) { } originalValue = cdataTextAreaStr.toString(); } } /** * Adds a listener to the list that's notified when the editor * stops, or cancels editing. * * @param l the CellEditorListener */ public void addCellEditorListener(CellEditorListener l) { listeners.add(l); } /** * Tells the editor to cancel editing and not accept any partially * edited value. */ public void cancelCellEditing() { if (activeEditor != null) { activeEditor.setVisible(false); fireEditingCancelled(); } } /** * Returns the value contained in the editor. * * @return the value contained in the editor */ public Object getCellEditorValue() { if (activeEditor == stringEditor) { return stringEditor.getText(); } else if (activeEditor == booleanEditor) { return booleanEditor.isSelected(); } else if (activeEditor == listEditor) { if (listEditor.isEditable()) { // returns the edited value from combox box return listEditor.getEditor().getItem(); } else { if (listEditor.getSelectedItem() == noSelect) { return null; // blank selection } // returns the selected value from combox box return listEditor.getSelectedItem(); } } else if (activeEditor == tableEditor) { return ((PropertyTableModel) tableEditor.getModel()).getValue(); } else if (activeEditor == jScrollPaneCDATA) { Writer cdataTextAreaStr = new StringWriter(); try { cdataTextArea.write(cdataTextAreaStr); } catch (Exception ex) { } return cdataTextAreaStr.toString(); } return null; } /** * Asks the editor if it can start editing using anEvent. * anEvent is in the invoking component coordinate system. * The editor can not assume the Component returned by * getCellEditorComponent is installed. This method * is intended for the use of client to avoid the cost of setting up * and installing the editor component if editing is not possible. * If editing can be started this method returns true. * * @param anEvent the event the editor should use to consider * whether to begin editing or not * @return true if editing can be started * @see #shouldSelectCell */ public boolean isCellEditable(EventObject anEvent) { return true; } /** * Removes a listener from the list that's notified * * @param l the CellEditorListener */ public void removeCellEditorListener(CellEditorListener l) { listeners.remove(l); } /** * Returns true if the editing cell should be selected, false otherwise. * Typically, the return value is true, because is most cases the editing * cell should be selected. However, it is useful to return false to * keep the selection from changing for some types of edits. * eg. A table that contains a column of check boxes, the user might * want to be able to change those checkboxes without altering the * selection. (See Netscape Communicator for just such an example) * Of course, it is up to the client of the editor to use the return * value, but it doesn't need to if it doesn't want to. * * @param anEvent the event the editor should use to start * editing * @return true if the editor would like the editing cell to be selected; * otherwise returns false * @see #isCellEditable */ public boolean shouldSelectCell(EventObject anEvent) { return true; } /** * Tells the editor to stop editing and accept any partially edited * value as the value of the editor. The editor returns false if * editing was not stopped; this is useful for editors that validate * and can not accept invalid entries. * * @return true if editing was stopped; false otherwise */ public boolean stopCellEditing() { if (activeEditor != null) { /* save the nested table as well */ if (activeEditor == tableEditor) { if (tableEditor.isEditing()) { List nestedTableEditors = new ArrayList(); JTable nestedTableEditor = tableEditor; // Get the list of nested tables from outer->inner sequence, // descending towards innermost nested table // so that we can stop the editing in this order. while (nestedTableEditor != null) { nestedTableEditors.add(nestedTableEditor); SchemaPropertyCellEditor sce = (SchemaPropertyCellEditor) nestedTableEditor .getCellEditor(); if (sce != null && sce.activeEditor == sce.tableEditor && sce.tableEditor.isEditing()) { nestedTableEditor = sce.tableEditor; // //tableEditor.editingStopped(null); } else { nestedTableEditor = null; } } for (int i = nestedTableEditors.size() - 1; i >= 0; i--) { nestedTableEditors.get(i).editingStopped(null); } } } activeEditor.setVisible(false); fireEditingStopped(); } return true; } protected void fireEditingStopped() { ChangeEvent ce = new ChangeEvent(this); for (int i = listeners.size() - 1; i >= 0; i--) { listeners.get(i).editingStopped(ce); } } protected void fireEditingCancelled() { ChangeEvent ce = new ChangeEvent(this); for (int i = listeners.size() - 1; i >= 0; i--) { listeners.get(i).editingCanceled(ce); } } private List getUdfs() { List udfs = new ArrayList(); MondrianGuiDef.Schema s = this.getSchema(); if (s != null) { MondrianGuiDef.UserDefinedFunction[] u = s.userDefinedFunctions; for (int i = 0; i < u.length; i++) { if (!(u[i].className == null || udfs.contains(u[i].className))) { udfs.add(u[i].className); } } } return udfs; } private List getFormatStrings() { List fs = new ArrayList(); MondrianGuiDef.Schema s = this.getSchema(); if (s != null) { MondrianGuiDef.Cube[] c = s.cubes; for (int i = 0; i < c.length; i++) { MondrianGuiDef.Measure[] m = c[i].measures; for (int j = 0; j < m.length; j++) { if (!(m[j].formatString == null || fs.contains(m[j].formatString))) { fs.add(m[j].formatString); } } } } return fs; } private MondrianGuiDef.Schema getSchema() { SchemaExplorer se = this.getSchemaExplorer(); return (se == null) ? null : se.getSchema(); } private Object getParentObject() { SchemaExplorer se = this.getSchemaExplorer(); if (se != null) { Object po = se.getParentObject(); return po; } return null; } private SchemaExplorer getSchemaExplorer() { for (int i = listeners.size() - 1; i >= 0; i--) { CellEditorListener cel = listeners.get(i); if (cel instanceof SchemaExplorer) { return (SchemaExplorer) cel; } } return null; } // shared dimensions in schema private List getSource() { List source = new ArrayList(); MondrianGuiDef.Schema s = this.getSchema(); if (s != null) { MondrianGuiDef.Dimension[] u = s.dimensions; for (int i = 0; i < u.length; i++) { source.add(u[i].name); } } return source; } private List getCubes() { List source = new ArrayList(); //===source.add(noSelect); MondrianGuiDef.Schema s = this.getSchema(); if (s != null) { MondrianGuiDef.Cube[] u = s.cubes; for (int i = 0; i < u.length; i++) { source.add(u[i].name); } } return source; } private void generatePrimaryKeyTables(Object relation, List v) { if (relation == null) { return; } if (relation instanceof MondrianGuiDef.Table) { String sname = ((MondrianGuiDef.Table) relation).schema; v.add( ((sname == null || sname.equals("")) ? "" : sname + "->") + ((MondrianGuiDef.Table) relation).name); return; } MondrianGuiDef.Join currentJoin = (MondrianGuiDef.Join) relation; generatePrimaryKeyTables(currentJoin.left, v); generatePrimaryKeyTables(currentJoin.right, v); return; } private List getDimensions() { List dims = new ArrayList(); Object po = getParentObject(); // cubegrant if (po != null) { MondrianGuiDef.CubeGrant parent = (MondrianGuiDef.CubeGrant) po; if (!(parent.cube == null || parent.cube.equals(""))) { MondrianGuiDef.Schema s = getSchema(); if (s != null) { for (int i = 0; i < s.cubes.length; i++) { if (s.cubes[i].name.equals(parent.cube)) { dims.add("Measures"); for (int j = 0; j < s.cubes[i].dimensions.length; j++) { dims.add(s.cubes[i].dimensions[j].name); } break; } } } } } return dims; } private List getHierarchies() { List hiers = new ArrayList(); Object po = getParentObject(); // cubegrant if (po != null) { MondrianGuiDef.CubeGrant parent = (MondrianGuiDef.CubeGrant) po; if (!(parent.cube == null || parent.cube.equals(""))) { MondrianGuiDef.Schema s = getSchema(); if (s != null) { for (int i = 0; i < s.cubes.length; i++) { if (s.cubes[i].name.equals(parent.cube)) { for (int j = 0; j < s.cubes[i].dimensions.length; j++) { MondrianGuiDef.Dimension sharedDim = lookupDimension( s, s.cubes[i].dimensions[j]); NodeDef[] children = sharedDim.getChildren(); for (int k = 0; k < children.length; k++) { if (children[k] instanceof Hierarchy) { String hname = ((Hierarchy) children[k]).name; if (hname != null) { if (MondrianProperties.instance() .SsasCompatibleNaming.get()) { hiers.add( Util.quoteMdxIdentifier( s.cubes[i].dimensions[j] .name) + "." + Util .quoteMdxIdentifier( hname)); } else { hiers.add( Util.quoteMdxIdentifier( s.cubes[i].dimensions[j] .name + "." + hname)); } } else { hiers.add(Util.quoteMdxIdentifier( s.cubes[i].dimensions[j].name)); } } } } break; } } } } } return hiers; } private String cacheCube = ""; private String cacheHierarchy = ""; private List hlevels = new ArrayList(); private List getLevels(String hierarchy) { if (hierarchy == null || hierarchy.equals("")) { return hlevels; } List segments = Util.parseIdentifier(hierarchy); if (segments == null || segments.size() == 0) { return hlevels; } if (!MondrianProperties.instance().SsasCompatibleNaming.get()) { String data = ((Id.NameSegment)segments.get(0)).getName(); // if segment contains a hierarchy if (data.indexOf(".") >= 0) { Id.Segment segment = segments.get(0); // split the segment segments.clear(); segments.add(new Id.NameSegment( data.substring(0, data.indexOf(".")), segment.getQuoting())); segments.add(new Id.NameSegment( data.substring(data.indexOf(".") + 1), segment.getQuoting())); } } Object po = getParentObject(); // cubegrant if (po == null) { return hlevels; } MondrianGuiDef.CubeGrant parent = (MondrianGuiDef.CubeGrant) po; if (parent.cube == null || parent.cube.equals("")) { return hlevels; } if (cacheCube.equals(parent.cube) && cacheHierarchy.equals(hierarchy)) { return hlevels; } hlevels = new ArrayList(); cacheCube = parent.cube; cacheHierarchy = hierarchy; MondrianGuiDef.Schema s = getSchema(); if (s == null) { return hlevels; } for (int i = 0; i < s.cubes.length; i++) { final MondrianGuiDef.Cube cube = s.cubes[i]; if (!cube.name.equals(parent.cube)) { continue; } for (int j = 0; j < cube.dimensions.length; j++) { final MondrianGuiDef.CubeDimension dimension = cube.dimensions[j]; if (!segments.get(0).matches(dimension.name)) { continue; } MondrianGuiDef.Dimension d = lookupDimension(s, dimension); NodeDef[] children = d.getChildren(); MondrianGuiDef.Hierarchy hierarchyObj = null; for (int k = 0; k < children.length; k++) { if (children[k] instanceof Hierarchy) { if ((segments.size() == 1 && ((Hierarchy) children[k]).name == null) || (segments.size() != 0 && segments.get(1).matches( ((Hierarchy) children[k]).name))) { hierarchyObj = (Hierarchy)children[k]; break; } } } if (hierarchyObj != null) { for (int k = 0; k < hierarchyObj.levels.length; k++) { hlevels.add( hierarchy + "." + Util.quoteMdxIdentifier( hierarchyObj.levels[k].name)); } } } break; } return hlevels; } private static MondrianGuiDef.Dimension lookupDimension( MondrianGuiDef.Schema schema, MondrianGuiDef.CubeDimension cubeDimension) { if (cubeDimension instanceof MondrianGuiDef.Dimension) { return (MondrianGuiDef.Dimension) cubeDimension; } else { MondrianGuiDef.DimensionUsage dimensionUsage = (MondrianGuiDef.DimensionUsage) cubeDimension; for (int m = 0; m < schema.dimensions.length; m++) { final MondrianGuiDef.Dimension dimension = schema.dimensions[m]; if (dimension.name.equals(dimensionUsage.source)) { return dimension; } } return null; } } private I18n getResourceConverter() { return workbench.getResourceConverter(); } public void setMetaData(JdbcMetaData jdbcMetaData) { // Called from the SchemaExplorer.resetMetadata(). A call to the // updateUI() should be made on the owning SchemaFrame to reflect the // use of the JdbcMetaData being set. this.jdbcMetaData = jdbcMetaData; } } // End SchemaPropertyCellEditor.java mondrian-3.11.0.1-R/src/main/mondrian/gui/SchemaPropertyCellRenderer.java000066400000000000000000000444141261646570300261670ustar00rootroot00000000000000/* // This software is subject to the terms of the Eclipse Public License v1.0 // Agreement, available at the following URL: // http://www.eclipse.org/legal/epl-v10.html. // You must accept the terms of that agreement to use this software. // // Copyright (C) 2002-2005 Julian Hyde // Copyright (C) 2005-2009 Pentaho and others // Copyright (C) 2006-2007 CINCOM SYSTEMS, INC. // All Rights Reserved. */ package mondrian.gui; import java.awt.*; import java.io.StringReader; import javax.swing.*; import javax.swing.border.EmptyBorder; import javax.swing.table.TableCellRenderer; /** * @author sean */ public class SchemaPropertyCellRenderer extends javax.swing.table.DefaultTableCellRenderer { Workbench workbench; JLabel stringRenderer; JCheckBox booleanRenderer; JLabel integerRenderer; JTable tableRenderer; JComboBox listRenderer; JScrollPane jScrollPaneCDATA; // JEditorPane jEditorPaneCDATA; JTextArea cdataTextArea; JComboBox relationList; // Join, Table JTable relationTable; JPanel relationRenderer, rlPanel; JScrollPane jScrollPaneT; // All objects of this class will use this color value to render attribute // column this value is initialized by SchemaExplorer to the scrollpane // background color value. public static Color attributeBackground; /** * Creates a new instance of SchemaPropertyCellRenderer */ public SchemaPropertyCellRenderer(Workbench wb) { workbench = wb; super.setBackground(attributeBackground); stringRenderer = new JLabel(); stringRenderer.setFont(Font.decode("Dialog")); // cdata multi-line cdataTextArea = new JTextArea(); cdataTextArea.setLineWrap(true); cdataTextArea.setWrapStyleWord(true); cdataTextArea.setLayout(new java.awt.BorderLayout()); cdataTextArea.setEditable(true); cdataTextArea.setPreferredSize(new java.awt.Dimension(100, 300)); cdataTextArea.setMinimumSize(new java.awt.Dimension(100, 100)); jScrollPaneCDATA = new JScrollPane(cdataTextArea); jScrollPaneCDATA.setMaximumSize(cdataTextArea.getPreferredSize()); booleanRenderer = new JCheckBox(); booleanRenderer.setBackground(Color.white); integerRenderer = new JLabel(); integerRenderer.setHorizontalAlignment(JTextField.RIGHT); integerRenderer.setFont(Font.decode("Courier")); listRenderer = new JComboBox(MondrianGuiDef.Measure._aggregator_values); listRenderer.setMaximumSize(stringRenderer.getMaximumSize()); listRenderer.setFont(Font.decode("Dialog")); listRenderer.setBackground(Color.white); //listRenderer.setModel(new ComboBoxModel()); listRenderer.setBorder( new EmptyBorder( 0, 0, 0, 0)); //super.noFocusBorder); listRenderer.setRenderer(new ListRenderer(listRenderer.getRenderer())); /* relationListRenderer = new JComboBox(new String[] {"Join", "Table"}); relationListRenderer.setMaximumSize(stringRenderer.getMaximumSize()); relationListRenderer.setFont(Font.decode("Dialog")); relationListRenderer.setBackground(Color.white); */ relationRenderer = new JPanel(); rlPanel = new JPanel(); relationList = new JComboBox( new String[]{ workbench.getResourceConverter().getString( "schemaPropertyCellRenderer.join", "Join"), workbench.getResourceConverter().getString( "schemaPropertyCellRenderer.table", "Table") }); relationList.setMaximumSize(new Dimension(55, 22)); relationList.setPreferredSize(new Dimension(55, 22)); relationList.setMinimumSize(new Dimension(55, 22)); relationList.setFont(Font.decode("Dialog")); relationList.setBackground(Color.white); relationTable = new JTable(); relationTable.setBackground(new java.awt.Color(255, 204, 204)); // to remove table headers 'Property', 'Value'' relationTable.setTableHeader(null); jScrollPaneT = new JScrollPane(); jScrollPaneT.setViewportBorder( javax.swing.BorderFactory.createLineBorder( new java.awt.Color( 255, 0, 255), 2)); jScrollPaneT.setVerticalScrollBarPolicy( ScrollPaneConstants.VERTICAL_SCROLLBAR_NEVER); jScrollPaneT.setViewportView(relationTable); relationRenderer.setLayout(new BorderLayout()); rlPanel.add(relationList); relationRenderer.add(rlPanel, java.awt.BorderLayout.WEST); relationRenderer.add(jScrollPaneT, java.awt.BorderLayout.CENTER); relationRenderer.setBackground(Color.white); //relationRenderer.add(jScrollPaneT,java.awt.BorderLayout.CENTER); //JPanel relPanel = new JPanel(); // default flowlayout //relPanel.add(relationList); //relPanel.add(jScrollPaneT); //relationRenderer.add(relationTable); //relationRenderer.add(relPanel,java.awt.BorderLayout.CENTER); //relationRenderer.add(jScrollPaneT); tableRenderer = new JTable(); } public JCheckBox getBooleanRenderer() { return booleanRenderer; } public Component getTableCellRendererComponent( JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { if (column == 1) { PropertyTableModel tableModel = (PropertyTableModel) table.getModel(); Class targetClassz = tableModel.target.getClass(); String propertyName = tableModel.getRowName(row); stringRenderer.setOpaque(false); stringRenderer.setToolTipText(null); stringRenderer.setBackground(Color.white); //targetClassz == MondrianGuiDef.Formula.class && if (propertyName.equals("cdata")) { try { cdataTextArea.read(new StringReader((String) value), null); } catch (Exception ex) { } return jScrollPaneCDATA; } else if (value instanceof String) { stringRenderer.setText((String) value); return stringRenderer; } else if (value instanceof Boolean) { booleanRenderer.setSelected((Boolean) value); return booleanRenderer; } else if (value instanceof Integer) { integerRenderer.setText(value.toString()); return integerRenderer; } else if (value == null) { return null; } else if (value.getClass() == MondrianGuiDef.Join.class) { stringRenderer.setText(generateJoinStr(value)); stringRenderer.setToolTipText( workbench.getResourceConverter().getString( "schemaPropertyCellRenderer.selectJoinObject", "Select the Join/Table object from Schema tree to " + "edit.")); stringRenderer.setOpaque(true); stringRenderer.setBackground(Color.LIGHT_GRAY); return stringRenderer; /* 2: Displaying Join in nested pink boxes SchemaPropertyCellRenderer spcr = new SchemaPropertyCellRenderer(); relationTable.setDefaultRenderer(Object.class, spcr); PropertyTableModel ptm = new PropertyTableModel(value,SchemaExplorer.DEF_JOIN); relationTable.setModel(ptm); relationTable.getColumnModel().getColumn(0).setMaxWidth(100); relationTable.getColumnModel().getColumn(0).setMinWidth(100); setTableRendererHeight(relationTable, relationRenderer); return relationRenderer; */ } else if (value.getClass() == MondrianGuiDef.OrdinalExpression.class) { SchemaPropertyCellRenderer spcr = new SchemaPropertyCellRenderer(workbench); tableRenderer.setDefaultRenderer(Object.class, spcr); PropertyTableModel ptm = new PropertyTableModel( workbench, ((MondrianGuiDef.OrdinalExpression) value).expressions[0], SchemaExplorer.DEF_SQL); tableRenderer.setModel(ptm); tableRenderer.getColumnModel().getColumn(0).setMaxWidth(100); tableRenderer.getColumnModel().getColumn(0).setMinWidth(100); return tableRenderer; } else if (value.getClass() == MondrianGuiDef.OrdinalExpression.class) { SchemaPropertyCellRenderer spcr = new SchemaPropertyCellRenderer(workbench); tableRenderer.setDefaultRenderer(Object.class, spcr); PropertyTableModel ptm = new PropertyTableModel( workbench, ((MondrianGuiDef.CaptionExpression) value).expressions[0], SchemaExplorer.DEF_SQL); tableRenderer.setModel(ptm); tableRenderer.getColumnModel().getColumn(0).setMaxWidth(100); tableRenderer.getColumnModel().getColumn(0).setMinWidth(100); return tableRenderer; } else if (value.getClass() == MondrianGuiDef.Formula.class) { SchemaPropertyCellRenderer spcr = new SchemaPropertyCellRenderer(workbench); tableRenderer.setDefaultRenderer(Object.class, spcr); PropertyTableModel ptm = new PropertyTableModel( workbench, value, SchemaExplorer.DEF_FORMULA); tableRenderer.setModel(ptm); tableRenderer.getColumnModel().getColumn(0).setMaxWidth(100); tableRenderer.getColumnModel().getColumn(0).setMinWidth(100); return tableRenderer; } else if (value.getClass() == MondrianGuiDef.CalculatedMemberProperty.class) { SchemaPropertyCellRenderer spcr = new SchemaPropertyCellRenderer(workbench); tableRenderer.setDefaultRenderer(Object.class, spcr); PropertyTableModel ptm = new PropertyTableModel( workbench, value, SchemaExplorer.DEF_CALCULATED_MEMBER_PROPERTY); tableRenderer.setModel(ptm); tableRenderer.getColumnModel().getColumn(0).setMaxWidth(100); tableRenderer.getColumnModel().getColumn(0).setMinWidth(100); return tableRenderer; } else if (value.getClass() == MondrianGuiDef.Table.class) { SchemaPropertyCellRenderer spcr = new SchemaPropertyCellRenderer(workbench); tableRenderer.setDefaultRenderer(Object.class, spcr); PropertyTableModel ptm = new PropertyTableModel( workbench, value, SchemaExplorer.DEF_TABLE); tableRenderer.setModel(ptm); tableRenderer.getColumnModel().getColumn(0).setMaxWidth(100); tableRenderer.getColumnModel().getColumn(0).setMinWidth(100); return tableRenderer; } else if (value.getClass() == MondrianGuiDef.RelationOrJoin.class) { // REVIEW: Covers View and InlineTable, since Table and Join are // managed above. SchemaPropertyCellRenderer spcr = new SchemaPropertyCellRenderer(workbench); tableRenderer.setDefaultRenderer(Object.class, spcr); PropertyTableModel ptm = new PropertyTableModel( workbench, value, SchemaExplorer.DEF_RELATION); tableRenderer.setModel(ptm); return tableRenderer; } else if (value.getClass() == MondrianGuiDef.AggFactCount.class) { SchemaPropertyCellRenderer spcr = new SchemaPropertyCellRenderer(workbench); tableRenderer.setDefaultRenderer(Object.class, spcr); PropertyTableModel ptm = new PropertyTableModel( workbench, value, SchemaExplorer.DEF_AGG_FACT_COUNT); tableRenderer.setModel(ptm); tableRenderer.getColumnModel().getColumn(0).setMaxWidth(100); tableRenderer.getColumnModel().getColumn(0).setMinWidth(100); return tableRenderer; } else if (value.getClass() == MondrianGuiDef.Closure.class) { SchemaPropertyCellRenderer spcr = new SchemaPropertyCellRenderer(workbench); tableRenderer.setDefaultRenderer(Object.class, spcr); PropertyTableModel ptm = new PropertyTableModel( workbench, value, SchemaExplorer.DEF_CLOSURE); tableRenderer.setModel(ptm); tableRenderer.getColumnModel().getColumn(0).setMaxWidth(100); tableRenderer.getColumnModel().getColumn(0).setMinWidth(100); setTableRendererHeight(tableRenderer, null); return tableRenderer; } else if (value.getClass() == MondrianGuiDef.Property.class) { SchemaPropertyCellRenderer spcr = new SchemaPropertyCellRenderer(workbench); tableRenderer.setDefaultRenderer(Object.class, spcr); PropertyTableModel ptm = new PropertyTableModel( workbench, value, SchemaExplorer.DEF_PROPERTY); tableRenderer.setModel(ptm); return tableRenderer; } else { return null; } } else { if (value instanceof String) { // Use data from workbenchInfo.properties as tooltip when // available. PropertyTableModel tableModel = (PropertyTableModel) table.getModel(); String className = (tableModel.target.getClass()).getName(); int pos = className.lastIndexOf("$"); String tooltip = null; if (pos > 0) { String tipName = (className.substring(pos + 1)) + "," + tableModel.getRowName(row); tooltip = workbench.getTooltip(tipName); } stringRenderer.setToolTipText(tooltip); stringRenderer.setText((String) value); stringRenderer.setOpaque(true); stringRenderer.setBackground(new java.awt.Color(221, 221, 221)); if (isSelected && hasFocus) { table.editCellAt(row, 1); } return stringRenderer; } } return super.getTableCellRendererComponent( table, value, isSelected, hasFocus, row, column); } private String generateJoinStr(Object value) { MondrianGuiDef.Join currentJoin = (MondrianGuiDef.Join) value; String joinStr = "" + generateLeftRightStr(currentJoin.left) + " JOIN " + generateLeftRightStr(currentJoin.right) + ""; return joinStr; } private String generateLeftRightStr(Object value) { MondrianGuiDef.RelationOrJoin currentObj = (MondrianGuiDef.RelationOrJoin) value; if (currentObj instanceof MondrianGuiDef.Table) { return (((MondrianGuiDef.Table) currentObj).alias == null || ((MondrianGuiDef.Table) currentObj).alias.equals("") ? ((MondrianGuiDef.Table) currentObj).name : ((MondrianGuiDef.Table) currentObj).alias); } MondrianGuiDef.Join currentJoin = (MondrianGuiDef.Join) currentObj; String joinStr = "(" + generateLeftRightStr(currentJoin.left) + " JOIN " + generateLeftRightStr(currentJoin.right) + ")"; return joinStr; } void setTableRendererHeight(JTable relationTable, JPanel relationRenderer) { int tableH = 0; int tableW = 0; Object value = null; for (int i = 0; i < relationTable.getRowCount(); i++) { TableCellRenderer renderer = relationTable.getCellRenderer(i, 1); Component comp = renderer.getTableCellRendererComponent( relationTable, relationTable.getValueAt(i, 1), false, false, i, 1); try { int height = 0; int width = 0; if (comp != null) { height = comp.getMaximumSize().height; width = comp.getMaximumSize().width; relationTable.setRowHeight(i, height); } value = relationTable.getValueAt(i, 1); if (value instanceof MondrianGuiDef.RelationOrJoin) { tableH += comp.getPreferredSize().height; tableW = Math.max( tableW, comp.getPreferredSize().width + stringRenderer .getMaximumSize().width); } else if (value == null) { tableH += stringRenderer.getMaximumSize().height; tableW = Math.max( tableW, stringRenderer.getMaximumSize().width * 2); } else { tableH += height; tableW = Math.max(tableW, width * 2); } } catch (Exception ea) { } } // table height changes relationTable.setPreferredSize( new Dimension( tableW, tableH)); // scrollpane adjusts to new table height, it also changes scrollpanes' // preferred size values relationTable.setPreferredScrollableViewportSize( relationTable.getPreferredSize()); if (relationRenderer != null) { relationRenderer.setPreferredSize( jScrollPaneT.getPreferredSize()); relationRenderer.setMaximumSize( jScrollPaneT.getPreferredSize()); } } } // End SchemaPropertyCellRenderer.java mondrian-3.11.0.1-R/src/main/mondrian/gui/SchemaTreeCellEditor.java000066400000000000000000000106411261646570300247150ustar00rootroot00000000000000/* // This software is subject to the terms of the Eclipse Public License v1.0 // Agreement, available at the following URL: // http://www.eclipse.org/legal/epl-v10.html. // You must accept the terms of that agreement to use this software. // // Copyright (C) 2006-2009 Pentaho and others // Copyright (C) 2006-2007 CINCOM SYSTEMS, INC. // All Rights Reserved. */ package mondrian.gui; import java.awt.*; import java.util.*; import java.util.List; import javax.swing.*; import javax.swing.event.CellEditorListener; import javax.swing.event.ChangeEvent; import javax.swing.tree.*; /** * * @author sarora */ public class SchemaTreeCellEditor extends javax.swing.tree.DefaultTreeCellEditor { private final ClassLoader myClassLoader; JComboBox listEditor; final List listeners = new ArrayList(); /** Creates a new instance of SchemaTreeCellEditor */ public SchemaTreeCellEditor( Workbench workbench, JTree tree, DefaultTreeCellRenderer renderer, TreeCellEditor editor) { super(tree, renderer, editor); myClassLoader = this.getClass().getClassLoader(); } public Component getTreeCellEditorComponent( JTree tree, Object value, boolean isSelected, boolean expanded, boolean leaf, int row) { if (value instanceof MondrianGuiDef.RelationOrJoin) { String valueClass = value.getClass().getName(); String simpleName[] = valueClass.split("[$.]", 0); return super.getTreeCellEditorComponent( tree, simpleName[simpleName.length - 1], isSelected, expanded, leaf, row); } else { return null; } } public boolean isCellEditable(EventObject event) { return false; } protected void fireEditingStopped() { ChangeEvent ce = new ChangeEvent(this); for (int i = listeners.size() - 1; i >= 0; i--) { listeners.get(i).editingStopped(ce); } } public void addCellEditorListener(CellEditorListener l) { listeners.add(l); } public void removeCellEditorListener(CellEditorListener l) { listeners.remove(l); } public void setValueAt(JTree tree) { String retValue; MondrianGuiDef.RelationOrJoin relationObj = null; retValue = (String) getCellEditorValue(); if (retValue.equals("Join")) { relationObj = new MondrianGuiDef.Join( "", "", new MondrianGuiDef.Table( "", "Table 1", "", null), "", "", new MondrianGuiDef.Table( "", "Table 2", "", null)); } else if (retValue.equals("Table")) { relationObj = new MondrianGuiDef.Table("", "Table", "", null); } TreePath tpath = tree.getSelectionPath(); if (tpath != null) { Object value = tpath.getLastPathComponent(); TreePath parentpath = tpath.getParentPath(); if (parentpath != null) { Object parent = parentpath.getLastPathComponent(); if (parent instanceof MondrianGuiDef.Hierarchy) { ((MondrianGuiDef.Hierarchy) parent).relation = relationObj; } else if (parent instanceof MondrianGuiDef.Closure) { ((MondrianGuiDef.Closure) parent).table = (MondrianGuiDef.Table)relationObj; } else if (parent instanceof MondrianGuiDef.Join) { int indexOfChild = tree.getModel().getIndexOfChild(parent, value); switch (indexOfChild) { case 0: ((MondrianGuiDef.Join) parent).left = relationObj; break; case 1: ((MondrianGuiDef.Join) parent).right = relationObj; break; } } tree.setSelectionPath( parentpath.pathByAddingChild(relationObj)); } } } public boolean stopCellEditing() { boolean retValue; setValueAt(super.tree); retValue = super.stopCellEditing(); return retValue; } } // End SchemaTreeCellEditor.java mondrian-3.11.0.1-R/src/main/mondrian/gui/SchemaTreeCellRenderer.java000066400000000000000000000714141261646570300252420ustar00rootroot00000000000000/* // This software is subject to the terms of the Eclipse Public License v1.0 // Agreement, available at the following URL: // http://www.eclipse.org/legal/epl-v10.html. // You must accept the terms of that agreement to use this software. // // Copyright (C) 2002-2005 Julian Hyde // Copyright (C) 2005-2015 Pentaho and others // Copyright (C) 2006-2007 CINCOM SYSTEMS, INC. // All Rights Reserved. */ package mondrian.gui; import mondrian.gui.validate.ValidationUtils; import mondrian.gui.validate.impl.*; import org.eigenbase.xom.ElementDef; import java.awt.*; import javax.swing.*; import javax.swing.tree.TreePath; /** * Render an entry for the tree. * * @author sean */ public class SchemaTreeCellRenderer extends javax.swing.tree.DefaultTreeCellRenderer { private final ClassLoader myClassLoader; public boolean invalidFlag; private JdbcMetaData jdbcMetaData; private final Workbench workbench; /** * Creates a SchemaTreeCellRenderer with Workbench and metadata. */ public SchemaTreeCellRenderer( Workbench workbench, JdbcMetaData jdbcMetaData) { super(); this.myClassLoader = this.getClass().getClassLoader(); this.workbench = workbench; this.jdbcMetaData = jdbcMetaData; } /** * Creates a SchemaTreeCellRenderer. */ public SchemaTreeCellRenderer() { this(null, null); } public Component getTreeCellRendererComponent( JTree tree, Object value, boolean sel, boolean expanded, boolean leaf, int row, boolean hasFocus) { super.getTreeCellRendererComponent( tree, value, sel, expanded, leaf, row, hasFocus); invalidFlag = isInvalid(tree, value, row); // Allow the layout mgr to calculate the pref size of renderer. this.setPreferredSize(null); if (value instanceof MondrianGuiDef.Cube) { setText(invalidFlag, ((MondrianGuiDef.Cube) value).name); super.setIcon( new ImageIcon( myClassLoader.getResource( workbench .getResourceConverter().getGUIReference("cube")))); } else if (value instanceof MondrianGuiDef.Column) { setText(invalidFlag, ((MondrianGuiDef.Column) value).name); } else if (value instanceof MondrianGuiDef.Dimension) { super.setIcon( new ImageIcon( myClassLoader.getResource( workbench.getResourceConverter().getGUIReference( "dimension")))); setText(invalidFlag, ((MondrianGuiDef.CubeDimension) value).name); // Do not remove this line. This sets the preferred width of tree // cell displaying dimension name. This resolves the ambiguous // problem of last char or last word truncated from dimension name // in the tree cell. This problem was there with only Dimension // objects, while all other objects display their names without any // truncation of characters. Therefore, we have to force the setting // of preferred width to desired width so that characters do not // truncate from dimension name. Along with this the preferred size // of other objects should be set to null, so that the layout mgr // can calculate the preferred width in case of other objects. this.setPreferredSize( new java.awt.Dimension( this.getPreferredSize().width + 1, 25)); } else if (value instanceof MondrianGuiDef.DimensionUsage) { super.setIcon( new ImageIcon( myClassLoader.getResource( workbench.getResourceConverter().getGUIReference( "dimensionUsage")))); setText(invalidFlag, ((MondrianGuiDef.CubeDimension) value).name); } else if (value instanceof MondrianGuiDef.KeyExpression) { super.setIcon( new ImageIcon( myClassLoader.getResource( workbench .getResourceConverter().getGUIReference("key")))); setText( workbench.getResourceConverter().getString( "common.keyExpression.title", "Key Expression")); } else if (value instanceof MondrianGuiDef.NameExpression) { super.setIcon( new ImageIcon( myClassLoader.getResource( workbench .getResourceConverter().getGUIReference("name")))); setText( workbench.getResourceConverter().getString( "common.nameExpression.title", "Name Expression")); } else if (value instanceof MondrianGuiDef.OrdinalExpression) { super.setIcon( new ImageIcon( myClassLoader.getResource( workbench.getResourceConverter().getGUIReference( "ordinal")))); setText( workbench.getResourceConverter().getString( "common.ordinalExpression.title", "Ordinal Expression")); } else if (value instanceof MondrianGuiDef.CaptionExpression) { super.setIcon( new ImageIcon( myClassLoader.getResource( workbench .getResourceConverter().getGUIReference("name")))); setText( workbench.getResourceConverter().getString( "common.captionExpression.title", "Caption Expression")); } else if (value instanceof MondrianGuiDef.ParentExpression) { super.setIcon( new ImageIcon( myClassLoader.getResource( workbench.getResourceConverter().getGUIReference( "parent")))); setText( workbench.getResourceConverter().getString( "common.parentExpression.title", "Parent Expression")); } else if (value instanceof MondrianGuiDef.Expression) { super.setIcon( new ImageIcon( myClassLoader.getResource( workbench.getResourceConverter().getGUIReference( "expression")))); setText( workbench.getResourceConverter().getString( "common.expression.title", "Expression")); } else if (value instanceof MondrianGuiDef.ExpressionView) { super.setIcon( new ImageIcon( myClassLoader.getResource( workbench.getResourceConverter().getGUIReference( "expression")))); setText( workbench.getResourceConverter().getString( "common.expressionView.title", "Expression View")); } else if (value instanceof MondrianGuiDef.Hierarchy) { String name = ((MondrianGuiDef.Hierarchy) value).name; if (name == null || name.trim().length() == 0) { setText( invalidFlag, workbench.getResourceConverter().getString( "common.hierarchy.default.name", "default")); } else { setText(invalidFlag, name); } super.setIcon( new ImageIcon( myClassLoader.getResource( workbench.getResourceConverter().getGUIReference( "hierarchy")))); this.setPreferredSize( new java.awt.Dimension( this.getPreferredSize().width + 1, 25)); } else if (value instanceof MondrianGuiDef.RelationOrJoin) { TreePath tpath = tree.getPathForRow(row); String prefix = ""; if (tpath != null) { TreePath parentpath = tpath.getParentPath(); if (parentpath != null) { Object parent = parentpath.getLastPathComponent(); if (parent instanceof MondrianGuiDef.Join) { int indexOfChild = tree.getModel().getIndexOfChild( parent, value); switch (indexOfChild) { case 0: prefix = workbench.getResourceConverter().getString( "common.left.title", "Left") + " "; break; case 1: prefix = workbench.getResourceConverter().getString( "common.right.title", "Right") + " "; break; } } } } if (value instanceof MondrianGuiDef.Join) { setText( workbench.getResourceConverter().getFormattedString( "schemaTreeCellRenderer.join.title", "{0}Join", prefix)); super.setIcon( new ImageIcon( myClassLoader.getResource( workbench.getResourceConverter().getGUIReference( "join")))); } else if (value instanceof MondrianGuiDef.Table) { // Set the table name to alias if present. MondrianGuiDef.Table theTable = (MondrianGuiDef.Table) value; String theName = (theTable.alias != null && theTable.alias.trim().length() > 0) ? theTable.alias : theTable.name; setText( workbench.getResourceConverter().getFormattedString( "schemaTreeCellRenderer.table.title", "{0}Table: {1}", prefix.length() == 0 ? "" : prefix + " : ", theName)); super.setIcon( new ImageIcon( myClassLoader.getResource( workbench.getResourceConverter().getGUIReference( "table")))); } else if (value instanceof MondrianGuiDef.View) { setText( workbench.getResourceConverter().getFormattedString( "schemaTreeCellRenderer.view.title", "View")); } // REVIEW: Need to deal with InlineTable here this.getPreferredSize(); // Do not remove this this.setPreferredSize( new Dimension( this.getPreferredSize().width + 35, 24)); } else if (value instanceof MondrianGuiDef.Level) { setText(invalidFlag, ((MondrianGuiDef.Level) value).name); super.setIcon( new ImageIcon( myClassLoader.getResource( workbench .getResourceConverter().getGUIReference("level")))); // See earlier comments about setPreferredSize. this.setPreferredSize( new java.awt.Dimension( this.getPreferredSize().width + 1, 25)); // Do not remove this } else if (value instanceof MondrianGuiDef.Measure) { setText(invalidFlag, ((MondrianGuiDef.Measure) value).name); super.setIcon( new ImageIcon( myClassLoader.getResource( workbench.getResourceConverter().getGUIReference( "measure")))); } else if (value instanceof MondrianGuiDef.Formula) { setText(invalidFlag, ((MondrianGuiDef.Formula) value).getName()); super.setIcon( new ImageIcon( myClassLoader.getResource( workbench.getResourceConverter().getGUIReference( "formula")))); } else if (value instanceof MondrianGuiDef.MemberReaderParameter) { setText( invalidFlag, ((MondrianGuiDef.MemberReaderParameter) value).name); } else if (value instanceof MondrianGuiDef.Property) { setText(invalidFlag, ((MondrianGuiDef.Property) value).name); super.setIcon( new ImageIcon( myClassLoader.getResource( workbench.getResourceConverter().getGUIReference( "property")))); } else if (value instanceof MondrianGuiDef.Schema) { setText( invalidFlag, workbench.getResourceConverter().getString( "common.schema.title", "Schema")); super.setIcon( new ImageIcon( myClassLoader.getResource( workbench.getResourceConverter().getGUIReference( "schema")))); } else if (value instanceof MondrianGuiDef.NamedSet) { setText(invalidFlag, ((MondrianGuiDef.NamedSet) value).name); super.setIcon( new ImageIcon( myClassLoader.getResource( workbench.getResourceConverter().getGUIReference( "namedSet")))); } else if (value instanceof MondrianGuiDef.CalculatedMember) { setText( invalidFlag, ((MondrianGuiDef.CalculatedMember) value).name); super.setIcon( new ImageIcon( myClassLoader.getResource( workbench.getResourceConverter().getGUIReference( "calculatedMember")))); } else if (value instanceof MondrianGuiDef.CalculatedMemberProperty) { setText( invalidFlag, ((MondrianGuiDef.CalculatedMemberProperty) value).name); super.setIcon( new ImageIcon( myClassLoader.getResource( workbench .getResourceConverter().getGUIReference("nopic")))); } else if (value instanceof MondrianGuiDef.UserDefinedFunction) { setText( invalidFlag, ((MondrianGuiDef.UserDefinedFunction) value).name); super.setIcon( new ImageIcon( myClassLoader.getResource( workbench.getResourceConverter().getGUIReference( "userDefinedFunction")))); } else if (value instanceof MondrianGuiDef.MemberFormatter) { setText( invalidFlag, workbench.getResourceConverter().getString( "common.memberFormatter.title", "Member Formatter")); super.setIcon( new ImageIcon( myClassLoader.getResource( workbench.getResourceConverter().getGUIReference( "format")))); } else if (value instanceof MondrianGuiDef.CellFormatter) { setText( invalidFlag, workbench.getResourceConverter().getString( "common.cellFormatter.title", "Cell Formatter")); super.setIcon( new ImageIcon( myClassLoader.getResource( workbench.getResourceConverter().getGUIReference( "format")))); } else if (value instanceof MondrianGuiDef.PropertyFormatter) { setText( invalidFlag, workbench.getResourceConverter().getString( "common.propertyFormatter.title", "Property Formatter")); super.setIcon( new ImageIcon( myClassLoader.getResource( workbench.getResourceConverter().getGUIReference( "format")))); } else if (value instanceof MondrianGuiDef.Script) { setText( invalidFlag, workbench.getResourceConverter().getString( "common.script.title", "Script")); super.setIcon( new ImageIcon( myClassLoader.getResource( workbench.getResourceConverter().getGUIReference( "script")))); } else if (value instanceof MondrianGuiDef.Role) { setText(invalidFlag, ((MondrianGuiDef.Role) value).name); super.setIcon( new ImageIcon( myClassLoader.getResource( workbench .getResourceConverter().getGUIReference("role")))); } else if (value instanceof MondrianGuiDef.Parameter) { setText(invalidFlag, ((MondrianGuiDef.Parameter) value).name); super.setIcon( new ImageIcon( myClassLoader.getResource( workbench.getResourceConverter().getGUIReference( "parameter")))); } else if (value instanceof MondrianGuiDef.SchemaGrant) { setText( invalidFlag, workbench.getResourceConverter().getString( "common.schemaGrant.title", "Schema Grant")); super.setIcon( new ImageIcon( myClassLoader.getResource( workbench.getResourceConverter().getGUIReference( "schemaGrant")))); } else if (value instanceof MondrianGuiDef.CubeGrant) { setText( invalidFlag, workbench.getResourceConverter().getString( "common.cubeGrant.title", "Cube Grant")); super.setIcon( new ImageIcon( myClassLoader.getResource( workbench.getResourceConverter().getGUIReference( "cubeGrant")))); } else if (value instanceof MondrianGuiDef.DimensionGrant) { setText( invalidFlag, workbench.getResourceConverter().getString( "common.dimensionGrant.title", "Dimension Grant")); super.setIcon( new ImageIcon( myClassLoader.getResource( workbench.getResourceConverter().getGUIReference( "dimensionGrant")))); } else if (value instanceof MondrianGuiDef.HierarchyGrant) { setText( invalidFlag, workbench.getResourceConverter().getString( "common.hierarchyGrant.title", "Hierarchy Grant")); super.setIcon( new ImageIcon( myClassLoader.getResource( workbench.getResourceConverter().getGUIReference( "hierarchyGrant")))); } else if (value instanceof MondrianGuiDef.MemberGrant) { setText( invalidFlag, workbench.getResourceConverter().getString( "common.memberGrant.title", "Member Grant")); super.setIcon( new ImageIcon( myClassLoader.getResource( workbench.getResourceConverter().getGUIReference( "memberGrant")))); } else if (value instanceof MondrianGuiDef.Annotations) { setText( invalidFlag, workbench.getResourceConverter().getString( "common.annotations.title", "Annotations")); super.setIcon( new ImageIcon( myClassLoader.getResource( workbench.getResourceConverter().getGUIReference( "annotations")))); } else if (value instanceof MondrianGuiDef.Annotation) { setText( invalidFlag, ((MondrianGuiDef.Annotation)value).name); super.setIcon( new ImageIcon( myClassLoader.getResource( workbench.getResourceConverter().getGUIReference( "annotation")))); } else if (value instanceof MondrianGuiDef.SQL) { setText(invalidFlag, ((MondrianGuiDef.SQL) value).dialect); super.setIcon( new ImageIcon( myClassLoader.getResource( workbench .getResourceConverter().getGUIReference("sql")))); } else if (value instanceof MondrianGuiDef.View) { setText( workbench.getResourceConverter().getString( "common.view.title", "View")); } else if (value instanceof MondrianGuiDef.VirtualCube) { setText(invalidFlag, ((MondrianGuiDef.VirtualCube) value).name); super.setIcon( new ImageIcon( myClassLoader.getResource( workbench.getResourceConverter().getGUIReference( "virtualCube")))); } else if (value instanceof MondrianGuiDef.VirtualCubeDimension) { setText( invalidFlag, ((MondrianGuiDef.VirtualCubeDimension) value).name); super.setIcon( new ImageIcon( myClassLoader.getResource( workbench.getResourceConverter().getGUIReference( "virtualCubeDimension")))); } else if (value instanceof MondrianGuiDef.VirtualCubeMeasure) { setText( invalidFlag, ((MondrianGuiDef.VirtualCubeMeasure) value).name); super.setIcon( new ImageIcon( myClassLoader.getResource( workbench.getResourceConverter().getGUIReference( "virtualCubeMeasure")))); } else if (value instanceof MondrianGuiDef.AggName) { setText( invalidFlag, workbench.getResourceConverter().getString( "common.aggName.title", "Aggregate Name")); super.setIcon( new ImageIcon( myClassLoader.getResource( workbench.getResourceConverter().getGUIReference( "aggTable")))); } else if (value instanceof MondrianGuiDef.AggForeignKey) { setText( invalidFlag, workbench.getResourceConverter().getString( "common.aggForeignKey.title", "Aggregate Foreign Key")); super.setIcon( new ImageIcon( myClassLoader.getResource( workbench.getResourceConverter().getGUIReference( "aggForeignKey")))); } else if (value instanceof MondrianGuiDef.AggIgnoreColumn) { setText( invalidFlag, workbench.getResourceConverter().getString( "common.aggIgnoreColumn.title", "Aggregate Ignore Column")); super.setIcon( new ImageIcon( myClassLoader.getResource( workbench.getResourceConverter().getGUIReference( "aggIgnoreColumn")))); } else if (value instanceof MondrianGuiDef.AggLevel) { setText( invalidFlag, workbench.getResourceConverter().getString( "common.aggLevel.title", "Aggregate Level")); super.setIcon( new ImageIcon( myClassLoader.getResource( workbench.getResourceConverter().getGUIReference( "aggLevel")))); } else if (value instanceof MondrianGuiDef.AggLevelProperty) { setText( invalidFlag, workbench.getResourceConverter().getString( "common.aggLevelProperty.title", "Aggregate Level Property")); super.setIcon( new ImageIcon( myClassLoader.getResource( workbench.getResourceConverter().getGUIReference( "property")))); } else if (value instanceof MondrianGuiDef.AggMeasure) { setText( invalidFlag, workbench.getResourceConverter().getString( "common.aggMeasure.title", "Aggregate Measure")); super.setIcon( new ImageIcon( myClassLoader.getResource( workbench.getResourceConverter().getGUIReference( "aggMeasure")))); } else if (value instanceof MondrianGuiDef.AggPattern) { setText( invalidFlag, workbench.getResourceConverter().getString( "common.aggPattern.title", "Aggregate Pattern")); super.setIcon( new ImageIcon( myClassLoader.getResource( workbench.getResourceConverter().getGUIReference( "aggPattern")))); } else if (value instanceof MondrianGuiDef.AggExclude) { setText( invalidFlag, workbench.getResourceConverter().getString( "common.aggExclude.title", "Aggregate Exclude")); super.setIcon( new ImageIcon( myClassLoader.getResource( workbench.getResourceConverter().getGUIReference( "aggExclude")))); } else if (value instanceof MondrianGuiDef.Closure) { setText( invalidFlag, workbench.getResourceConverter().getString( "common.closure.title", "Closure")); super.setIcon( new ImageIcon( myClassLoader.getResource( workbench.getResourceConverter().getGUIReference( "closure")))); } else if (value instanceof ElementDef) { setText(((ElementDef) value).getName()); } else { super.setText(""); } return this; } // called from external methods public String invalid(JTree tree, TreePath tpath, Object value) { return this.invalid(tree, tpath, value, null, null, null, null); } public String invalid( JTree tree, TreePath tpath, Object value, MondrianGuiDef.Cube cube, MondrianGuiDef.Dimension parentDimension, MondrianGuiDef.Hierarchy parentHierarchy, MondrianGuiDef.Level parentLevel) { return ValidationUtils.invalid( new WorkbenchMessages(workbench.getResourceConverter()), new WorkbenchJdbcValidator(jdbcMetaData), new WorkbenchTreeModel((SchemaTreeModel) tree.getModel()), new WorkbenchTreeModelPath(tpath), value, cube, parentDimension, parentHierarchy, parentLevel, jdbcMetaData.getRequireSchema()); } private boolean isInvalid(JTree tree, Object value, int row) { // getPathForRow(row) returns null for new objects added to tree in the // first run of rendering. Check for null before calling methods on // Treepath returned. return invalid(tree, tree.getPathForRow(row), value) != null; } public void setText(boolean invalidFlag, String myText) { if (invalidFlag) { myText = "x" + myText + ""; } setText(myText); } /** * Called from {@link SchemaExplorer#resetMetaData(JdbcMetaData)}. A call to * {@link #updateUI} should be made on the owning SchemaFrame to reflect the * use of the JdbcMetaData being set. * * @param jdbcMetaData Meta data */ public void setMetaData(JdbcMetaData jdbcMetaData) { this.jdbcMetaData = jdbcMetaData; } } // End SchemaTreeCellRenderer.java mondrian-3.11.0.1-R/src/main/mondrian/gui/SchemaTreeModel.java000066400000000000000000000342731261646570300237360ustar00rootroot00000000000000/* // This software is subject to the terms of the Eclipse Public License v1.0 // Agreement, available at the following URL: // http://www.eclipse.org/legal/epl-v10.html. // You must accept the terms of that agreement to use this software. // // Copyright (C) 2002-2005 Julian Hyde // Copyright (C) 2005-2015 Pentaho and others // Copyright (C) 2006-2007 CINCOM SYSTEMS, INC. // All Rights Reserved. */ package mondrian.gui; import mondrian.util.CompositeList; import java.util.*; import javax.swing.tree.*; /** * @author sean */ public class SchemaTreeModel extends DefaultTreeModel { /** * Creates a SchemaTreeModel. */ public SchemaTreeModel() { super(null); // TODO Auto-generated constructor stub } MondrianGuiDef.Schema schema; /** * Creates a new instance of SchemaTreeModel */ public SchemaTreeModel(MondrianGuiDef.Schema s) { super(new DefaultMutableTreeNode(s.name)); this.schema = s; } /** * Returns the child of parent at index index * in the parent's * child array. parent must be a node previously obtained * from this data source. This should not return null * if index * is a valid index for parent (that is index >= 0 && * index < getChildCount(parent)). * * @param parent a node in the tree, obtained from this data source * @return the child of parent at index index */ public Object getChild(Object parent, int index) { return getChildList(parent).get(index); } /** * Returns an immutable list of child elements of a given element. * * @param parent Parent element * @return List of children */ private List getChildList(Object parent) { if (parent instanceof MondrianGuiDef.Cube) { MondrianGuiDef.Cube c = (MondrianGuiDef.Cube) parent; // Return children in this order: fact table, dimensions, measures, // calculatedMembers, namedSets return new CompositeList( ifList(c.fact), Arrays.asList(c.dimensions), Arrays.asList(c.measures), Arrays.asList(c.calculatedMembers), Arrays.asList(c.namedSets), ifList(c.annotations)); } else if (parent instanceof MondrianGuiDef.Dimension) { MondrianGuiDef.Dimension d = (MondrianGuiDef.Dimension) parent; return new CompositeList( Arrays.asList((Object[]) d.hierarchies), ifList(d.annotations)); } else if (parent instanceof MondrianGuiDef.UserDefinedFunction) { MondrianGuiDef.UserDefinedFunction udf = (MondrianGuiDef.UserDefinedFunction) parent; return new CompositeList( ifList(udf.script)); } else if (parent instanceof MondrianGuiDef.ExpressionView) { MondrianGuiDef.ExpressionView ev = (MondrianGuiDef.ExpressionView) parent; return Arrays.asList((Object[]) ev.expressions); } else if (parent instanceof MondrianGuiDef.Hierarchy) { MondrianGuiDef.Hierarchy h = (MondrianGuiDef.Hierarchy) parent; return new CompositeList( Arrays.asList(h.levels), Arrays.asList(h.memberReaderParameters), ifList(h.relation), ifList(h.annotations)); } else if (parent instanceof MondrianGuiDef.Join) { MondrianGuiDef.Join j = (MondrianGuiDef.Join) parent; return Arrays.asList( j.left, j.right); } else if (parent instanceof MondrianGuiDef.Level) { MondrianGuiDef.Level level = (MondrianGuiDef.Level) parent; return new CompositeList( Arrays.asList(level.properties), ifList(level.keyExp), ifList(level.nameExp), ifList(level.ordinalExp), ifList(level.captionExp), ifList(level.parentExp), ifList(level.closure), ifList(level.memberFormatter), ifList(level.annotations)); } else if (parent instanceof MondrianGuiDef.CellFormatter) { MondrianGuiDef.CellFormatter f = (MondrianGuiDef.CellFormatter) parent; return new CompositeList( ifList(f.script)); } else if (parent instanceof MondrianGuiDef.MemberFormatter) { MondrianGuiDef.MemberFormatter f = (MondrianGuiDef.MemberFormatter) parent; return new CompositeList( ifList(f.script)); } else if (parent instanceof MondrianGuiDef.PropertyFormatter) { MondrianGuiDef.PropertyFormatter f = (MondrianGuiDef.PropertyFormatter) parent; return new CompositeList( ifList(f.script)); } else if (parent instanceof MondrianGuiDef.Property) { MondrianGuiDef.Property property = (MondrianGuiDef.Property) parent; return new CompositeList( ifList(property.propertyFormatter)); } else if (parent instanceof MondrianGuiDef.CalculatedMember) { MondrianGuiDef.CalculatedMember c = (MondrianGuiDef.CalculatedMember) parent; return new CompositeList( ifList(c.formulaElement), arrayList(c.memberProperties), ifList(c.annotations), ifList(c.cellFormatter)); } else if (parent instanceof MondrianGuiDef.Measure) { MondrianGuiDef.Measure m = (MondrianGuiDef.Measure) parent; return new CompositeList( ifList(m.measureExp), arrayList(m.memberProperties), ifList(m.annotations), ifList(m.cellFormatter)); } else if (parent instanceof MondrianGuiDef.NamedSet) { MondrianGuiDef.NamedSet m = (MondrianGuiDef.NamedSet) parent; return new CompositeList( ifList((Object) m.formulaElement), ifList(m.annotations)); } else if (parent instanceof MondrianGuiDef.Schema) { MondrianGuiDef.Schema s = (MondrianGuiDef.Schema) parent; // Return children in this order: cubes, dimensions, namedSets, // userDefinedFunctions, virtual cubes, roles return new CompositeList( Arrays.asList(s.cubes), Arrays.asList(s.dimensions), Arrays.asList(s.namedSets), Arrays.asList(s.namedSets), Arrays.asList(s.userDefinedFunctions), Arrays.asList(s.virtualCubes), Arrays.asList(s.roles), Arrays.asList(s.parameters), ifList(s.annotations)); } else if (parent instanceof MondrianGuiDef.Table) { MondrianGuiDef.Table t = (MondrianGuiDef.Table) parent; return new CompositeList( arrayList(t.aggTables), arrayList(t.aggExcludes)); } else if (parent instanceof MondrianGuiDef.AggTable) { MondrianGuiDef.AggTable t = (MondrianGuiDef.AggTable) parent; return new CompositeList( ifList(t.factcount), Arrays.asList(t.ignoreColumns), Arrays.asList(t.foreignKeys), Arrays.asList(t.measures), Arrays.asList(t.levels), (t instanceof MondrianGuiDef.AggPattern) ? Arrays.asList(((MondrianGuiDef.AggPattern) t).excludes) : Collections.emptyList()); } else if (parent instanceof MondrianGuiDef.AggLevel) { MondrianGuiDef.AggLevel t = (MondrianGuiDef.AggLevel) parent; if (t.properties == null) { t.properties = new MondrianGuiDef.AggLevelProperty[0]; } return new CompositeList( Arrays.asList(t.properties)); } else if (parent instanceof MondrianGuiDef.View) { MondrianGuiDef.View v = (MondrianGuiDef.View) parent; return Arrays.asList((Object[]) v.selects); } else if (parent instanceof MondrianGuiDef.VirtualCube) { MondrianGuiDef.VirtualCube c = (MondrianGuiDef.VirtualCube) parent; return new CompositeList( Arrays.asList(c.dimensions), Arrays.asList(c.measures), Arrays.asList(c.calculatedMembers), ifList(c.annotations)); } else if (parent instanceof MondrianGuiDef.VirtualCubeDimension) { MondrianGuiDef.VirtualCubeDimension d = (MondrianGuiDef.VirtualCubeDimension) parent; return ifList((Object)d.annotations); } else if (parent instanceof MondrianGuiDef.VirtualCubeMeasure) { MondrianGuiDef.VirtualCubeMeasure m = (MondrianGuiDef.VirtualCubeMeasure) parent; return ifList((Object)m.annotations); } else if (parent instanceof MondrianGuiDef.Role) { MondrianGuiDef.Role c = (MondrianGuiDef.Role) parent; return new CompositeList( Arrays.asList((Object[]) c.schemaGrants), ifList((Object)c.annotations)); } else if (parent instanceof MondrianGuiDef.SchemaGrant) { MondrianGuiDef.SchemaGrant c = (MondrianGuiDef.SchemaGrant) parent; return Arrays.asList((Object[]) c.cubeGrants); } else if (parent instanceof MondrianGuiDef.CubeGrant) { MondrianGuiDef.CubeGrant c = (MondrianGuiDef.CubeGrant) parent; return new CompositeList( Arrays.asList(c.dimensionGrants), Arrays.asList(c.hierarchyGrants)); } else if (parent instanceof MondrianGuiDef.HierarchyGrant) { MondrianGuiDef.HierarchyGrant c = (MondrianGuiDef.HierarchyGrant) parent; return Arrays.asList((Object[]) c.memberGrants); } else if (parent instanceof MondrianGuiDef.Closure) { MondrianGuiDef.Closure c = (MondrianGuiDef.Closure) parent; return ifList((Object) c.table); } else if (parent instanceof MondrianGuiDef.Annotations) { MondrianGuiDef.Annotations annotations = (MondrianGuiDef.Annotations) parent; return Arrays.asList((Object[]) annotations.array); } else { // In particular: Column, SQL, DimensionUsage have no children. return Collections.emptyList(); } } /** * Returns a list with zero or one elements. * * @param e Element * @param Element type * @return List containing element if it is not null, otherwise empty list */ private List ifList(T e) { return e == null ? Collections.emptyList() : Collections.singletonList(e); } /** * Returns a list with a given set of elements, or an empty list if the * array is null. * * @param e Element * @param Element type * @return List containing element if it is not null, otherwise empty list */ private List arrayList(T... e) { return e == null || e.length == 0 ? Collections.emptyList() : e.length == 1 ? Collections.singletonList(e[0]) : Arrays.asList(e); } /** * Returns the number of children of parent. * Returns 0 if the node * is a leaf or if it has no children. parent must be a node * previously obtained from this data source. * * @param parent a node in the tree, obtained from this data source * @return the number of children of the node parent */ public int getChildCount(Object parent) { return getChildList(parent).size(); } /** * Returns the index of child in parent. If parent * is null or child is null, * returns -1. * * @param parent a note in the tree, obtained from this data source * @param child the node we are interested in * @return the index of the child in the parent, or -1 if either * child or parent are null */ public int getIndexOfChild(Object parent, Object child) { if (parent == null) { return -1; } final List list = getChildList(parent); int i = 0; for (Object o : list) { if (equal(o, child)) { return i; } ++i; } return -1; } /** * Returns whether two XML objects are equal. * * @param o1 First object * @param o2 Second object * @return Whether objects are equal */ private boolean equal(Object o1, Object o2) { if (o1 == null) { return o2 == null; } else if (o1 instanceof MondrianGuiDef.Hierarchy || o1 instanceof MondrianGuiDef.SQL) { return o1 == o2; } else { return o1.equals(o2); } } /** * Returns the root of the tree. Returns null * only if the tree has no nodes. * * @return the root of the tree */ public Object getRoot() { return schema; } /** * Returns true if node is a leaf. * It is possible for this method to return false * even if node has no children. * A directory in a filesystem, for example, * may contain no files; the node representing * the directory is not a leaf, but it also has no children. * * @param node a node in the tree, obtained from this data source * @return true if node is a leaf */ public boolean isLeaf(Object node) { return getChildCount(node) == 0; } public void valueForPathChanged(TreePath path, Object newValue) { //super.valueForPathChanged(path, newValue); } } // End SchemaTreeModel.java mondrian-3.11.0.1-R/src/main/mondrian/gui/Workbench.java000066400000000000000000002434261261646570300226610ustar00rootroot00000000000000/* // This software is subject to the terms of the Eclipse Public License v1.0 // Agreement, available at the following URL: // http://www.eclipse.org/legal/epl-v10.html. // You must accept the terms of that agreement to use this software. // // Copyright (C) 1999-2005 Julian Hyde // Copyright (C) 2005-2013 Pentaho and others // Copyright (C) 2006-2007 Cincom Systems, Inc. // Copyright (C) 2006-2007 JasperSoft // All Rights Reserved. */ package mondrian.gui; import mondrian.olap.DriverManager; import mondrian.olap.MondrianProperties; import mondrian.olap.Util; import mondrian.olap.Util.PropertyList; import mondrian.server.MondrianServerRegistry; import mondrian.util.UnionIterator; import org.apache.commons.io.FileUtils; import org.apache.commons.io.IOUtils; import org.apache.log4j.Logger; import org.eigenbase.xom.XMLOutput; import org.eigenbase.xom.*; import org.pentaho.di.core.Const; import org.pentaho.di.core.KettleClientEnvironment; import org.pentaho.di.core.database.DatabaseMeta; import org.pentaho.di.core.exception.KettleDatabaseException; import org.pentaho.di.core.exception.KettleException; import org.pentaho.ui.database.DatabaseConnectionDialog; import org.pentaho.ui.database.Messages; import org.pentaho.ui.database.event.DataHandler; import org.pentaho.ui.xul.*; import org.pentaho.ui.xul.containers.XulDialog; import org.pentaho.ui.xul.swing.SwingXulLoader; import java.awt.*; import java.awt.event.*; import java.io.*; import java.net.*; import java.util.*; import java.util.List; import javax.swing.*; import javax.swing.event.InternalFrameAdapter; import javax.swing.event.InternalFrameEvent; import javax.swing.filechooser.FileSystemView; import javax.swing.plaf.basic.BasicArrowButton; import javax.swing.text.DefaultEditorKit; import javax.swing.tree.TreePath; /** * @author sean */ public class Workbench extends javax.swing.JFrame { private static final long serialVersionUID = 1L; static String WORKBENCH_USER_HOME_DIR; static String WORKBENCH_CONFIG_FILE; static String DB_META_CONFIG_FILE; private static final String LAST_USED1 = "lastUsed1"; private static final String LAST_USED1_URL = "lastUsedUrl1"; private static final String LAST_USED2 = "lastUsed2"; private static final String LAST_USED2_URL = "lastUsedUrl2"; private static final String LAST_USED3 = "lastUsed3"; private static final String LAST_USED3_URL = "lastUsedUrl3"; private static final String LAST_USED4 = "lastUsed4"; private static final String LAST_USED4_URL = "lastUsedUrl4"; private static final String WorkbenchInfoResourceName = "mondrian.gui.resources.workbenchInfo"; private static final String GUIResourceName = "mondrian.gui.resources.gui"; private static final String TextResourceName = "mondrian.gui.resources.text"; private static final String FILTER_SCHEMA_LIST = "FILTER_SCHEMA_LIST"; private static final Logger LOGGER = Logger.getLogger(Workbench.class); private String jdbcDriverClassName; private String jdbcConnectionUrl; private String jdbcUsername; private String jdbcPassword; private String jdbcSchema; private boolean requireSchema; private JdbcMetaData jdbcMetaData; private final ClassLoader myClassLoader; private Properties workbenchProperties; private static ResourceBundle workbenchResourceBundle = null; private static I18n resourceConverter = null; private static int newSchema = 1; private String openFile = null; private Map schemaWindowMap = new HashMap(); private final List mdxWindows = new ArrayList(); private final List jdbcWindows = new ArrayList(); private int windowMenuMapIndex = 1; private static final String KETTLE_PLUGIN_BASE_FOLDERS = "kettle-plugins," + "plugins," + Const.getKettleDirectory() + Const.FILE_SEPARATOR + "plugins"; private XulDialog connectionDialog = null; private DataHandler connectionDialogController = null; private DatabaseMeta dbMeta = null; /** * Creates new form Workbench */ public Workbench() { myClassLoader = this.getClass().getClassLoader(); resourceConverter = getGlobalResourceConverter(); // Setting User home directory WORKBENCH_USER_HOME_DIR = System.getProperty("user.home") + File.separator + ".schemaWorkbench"; WORKBENCH_CONFIG_FILE = WORKBENCH_USER_HOME_DIR + File.separator + "workbench.properties"; DB_META_CONFIG_FILE = WORKBENCH_USER_HOME_DIR + File.separator + "databaseMeta.xml"; loadWorkbenchProperties(); loadDatabaseMeta(); initOptions(); initComponents(); loadMenubarPlugins(); ImageIcon icon = new javax.swing.ImageIcon( myClassLoader.getResource( getResourceConverter().getGUIReference("productIcon"))); this.setIconImage(icon.getImage()); } public static I18n getGlobalResourceConverter() { if (resourceConverter == null) { ClassLoader currentClassLoader; ResourceBundle localGuiResourceBundle; ResourceBundle localTextResourceBundle; currentClassLoader = Workbench.class.getClassLoader(); localGuiResourceBundle = ResourceBundle.getBundle( GUIResourceName, Locale.getDefault(), currentClassLoader); localTextResourceBundle = ResourceBundle.getBundle( TextResourceName, Locale.getDefault(), currentClassLoader); resourceConverter = new I18n( localGuiResourceBundle, localTextResourceBundle); } return resourceConverter; } /** * load properties */ private void loadWorkbenchProperties() { workbenchProperties = new Properties(); try { workbenchResourceBundle = ResourceBundle.getBundle( WorkbenchInfoResourceName, Locale.getDefault(), myClassLoader); File f = new File(WORKBENCH_CONFIG_FILE); if (f.exists()) { workbenchProperties.load(new FileInputStream(f)); } else { LOGGER.debug(WORKBENCH_CONFIG_FILE + " does not exist"); } } catch (Exception e) { // TODO deal with exception LOGGER.error("loadWorkbenchProperties", e); } } /** * load database meta */ public void loadDatabaseMeta() { if (dbMeta == null) { File file = new File(DB_META_CONFIG_FILE); if (file.exists()) { try { final String fileContents = FileUtils.readFileToString(file); if (Util.isBlank(fileContents)) { LOGGER.error( "DB Meta file is empty at: " + DB_META_CONFIG_FILE); } else { dbMeta = getDbMeta(fileContents); } } catch (Exception e) { LOGGER.error( "Failed to load DB meta file at: " + DB_META_CONFIG_FILE, e); } } } if (dbMeta != null) { syncToWorkspace(dbMeta); } } /** * returns the value of a workbench property * * @param key key to lookup * @return the value */ public String getWorkbenchProperty(String key) { return workbenchProperties.getProperty(key); } /** * set a workbench property. Note that this does not save the property, * a call to storeWorkbenchProperties is required. * * @param key property key * @param value property value */ public void setWorkbenchProperty(String key, String value) { workbenchProperties.setProperty(key, value); } /** * save properties */ public void storeWorkbenchProperties() { // save properties to file File dir = new File(WORKBENCH_USER_HOME_DIR); try { if (dir.exists()) { if (!dir.isDirectory()) { JOptionPane.showMessageDialog( this, getResourceConverter().getFormattedString( "workbench.user.home.not.directory", "{0} is not a directory!\nPlease rename this file and retry to save configuration!", WORKBENCH_USER_HOME_DIR), "", JOptionPane.ERROR_MESSAGE); return; } } else { dir.mkdirs(); } } catch (Exception ex) { LOGGER.error("storeWorkbenchProperties: mkdirs", ex); JOptionPane.showMessageDialog( this, getResourceConverter().getFormattedString( "workbench.user.home.exception", "An error is occurred creating workbench configuration directory:\n{0}\nError is: {1}", WORKBENCH_USER_HOME_DIR, ex.getLocalizedMessage()), "", JOptionPane.ERROR_MESSAGE); return; } OutputStream out = null; try { out = new FileOutputStream( new File( WORKBENCH_CONFIG_FILE)); workbenchProperties.store(out, "Workbench configuration"); } catch (Exception e) { LOGGER.error("storeWorkbenchProperties: store", e); JOptionPane.showMessageDialog( this, getResourceConverter().getFormattedString( "workbench.save.configuration", "An error is occurred creating workbench configuration file:\n{0}\nError is: {1}", WORKBENCH_CONFIG_FILE, e.getLocalizedMessage()), "", JOptionPane.ERROR_MESSAGE); } finally { try { out.close(); } catch (IOException eIO) { LOGGER.error("storeWorkbenchProperties: out.close", eIO); } } } /** * save database meta */ public void storeDatabaseMeta() { if (dbMeta != null) { try { File file = new File(DB_META_CONFIG_FILE); PrintWriter pw = new PrintWriter(new FileWriter(file)); pw.println(dbMeta.getXML()); pw.close(); } catch (IOException e) { LOGGER.error("storeDatabaseMeta", e); } } } /** * Initialize the UI options */ private void initOptions() { requireSchema = "true".equals(getWorkbenchProperty("requireSchema")); } /** * This method is called from within the constructor to * initialize the form. */ private void initComponents() { desktopPane = new javax.swing.JDesktopPane(); jToolBar1 = new javax.swing.JToolBar(); jToolBar2 = new javax.swing.JToolBar(); toolbarNewPopupMenu = new JPopupMenu(); toolbarNewButton = new javax.swing.JButton(); toolbarOpenButton = new javax.swing.JButton(); toolbarSaveButton = new javax.swing.JButton(); toolbarSaveAsButton = new javax.swing.JButton(); jPanel1 = new javax.swing.JPanel(); jPanel2 = new javax.swing.JPanel(); toolbarPreferencesButton = new javax.swing.JButton(); requireSchemaCheckboxMenuItem = new javax.swing.JCheckBoxMenuItem(); menuBar = new javax.swing.JMenuBar(); fileMenu = new javax.swing.JMenu(); newMenu = new javax.swing.JMenu(); newSchemaMenuItem = new javax.swing.JMenuItem(); newQueryMenuItem = new javax.swing.JMenuItem(); newJDBCExplorerMenuItem = new javax.swing.JMenuItem(); newSchemaMenuItem2 = new javax.swing.JMenuItem(); newQueryMenuItem2 = new javax.swing.JMenuItem(); newJDBCExplorerMenuItem2 = new javax.swing.JMenuItem(); openMenuItem = new javax.swing.JMenuItem(); preferencesMenuItem = new javax.swing.JMenuItem(); lastUsed1MenuItem = new javax.swing.JMenuItem(); lastUsed2MenuItem = new javax.swing.JMenuItem(); lastUsed3MenuItem = new javax.swing.JMenuItem(); lastUsed4MenuItem = new javax.swing.JMenuItem(); saveMenuItem = new javax.swing.JMenuItem(); saveAsMenuItem = new javax.swing.JMenuItem(); jSeparator1 = new javax.swing.JSeparator(); jSeparator2 = new javax.swing.JSeparator(); jSeparator3 = new javax.swing.JSeparator(); exitMenuItem = new javax.swing.JMenuItem(); windowMenu = new javax.swing.JMenu(); helpMenu = new javax.swing.JMenu(); editMenu = new javax.swing.JMenu(); cutMenuItem = new javax.swing.JMenuItem(new DefaultEditorKit.CutAction()); copyMenuItem = new javax.swing.JMenuItem(new DefaultEditorKit.CopyAction()); pasteMenuItem = new javax.swing.JMenuItem(new DefaultEditorKit.PasteAction()); deleteMenuItem = new javax.swing.JMenuItem( new AbstractAction( getResourceConverter().getString( "workbench.menu.delete", "Delete")) { private static final long serialVersionUID = 1L; public void actionPerformed(ActionEvent e) { JInternalFrame jf = desktopPane.getSelectedFrame(); if (jf != null && jf.getContentPane() .getComponent(0) instanceof SchemaExplorer) { SchemaExplorer se = (SchemaExplorer) jf.getContentPane() .getComponent(0); TreePath tpath = se.tree.getSelectionPath(); se.delete(tpath); } } }); aboutMenuItem = new javax.swing.JMenuItem(); toolsMenu = new javax.swing.JMenu(); viewMenu = new javax.swing.JMenu(); viewXmlMenuItem = new javax.swing.JCheckBoxMenuItem(); setTitle( getResourceConverter().getString( "workbench.panel.title", "Schema Workbench")); setDefaultCloseOperation(DO_NOTHING_ON_CLOSE); addWindowListener( new WindowAdapter() { public void windowClosing(WindowEvent evt) { storeWorkbenchProperties(); storeDatabaseMeta(); closeAllSchemaFrames(true); } }); getContentPane().add(desktopPane, java.awt.BorderLayout.CENTER); newSchemaMenuItem2.setText( getResourceConverter().getString( "workbench.menu.newSchema", "Schema")); newSchemaMenuItem2.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent evt) { newSchemaMenuItemActionPerformed(evt); } }); newQueryMenuItem2.setText( getResourceConverter().getString( "workbench.menu.newQuery", "MDX Query")); newQueryMenuItem2.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent evt) { newQueryMenuItemActionPerformed(evt); } }); newJDBCExplorerMenuItem2.setText( getResourceConverter().getString( "workbench.menu.newJDBC", "JDBC Explorer")); newJDBCExplorerMenuItem2.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent evt) { newJDBCExplorerMenuItemActionPerformed(evt); } }); toolbarNewPopupMenu.add(newSchemaMenuItem2); toolbarNewPopupMenu.add(newQueryMenuItem2); toolbarNewPopupMenu.add(newJDBCExplorerMenuItem2); jPanel2.setLayout(new java.awt.BorderLayout()); jPanel2.setBorder(javax.swing.BorderFactory.createEtchedBorder()); jPanel2.setMaximumSize(new java.awt.Dimension(50, 28)); toolbarNewButton.setIcon( new javax.swing.ImageIcon( getClass().getResource( getResourceConverter().getGUIReference("new")))); toolbarNewButton.setToolTipText( getResourceConverter().getString( "workbench.toolbar.new", "New")); toolbarNewButton.setBorderPainted(false); toolbarNewButton.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent e) { toolbarNewPopupMenu.show( jPanel2, 0, jPanel2.getSize().height); } }); jToolBar2.setFloatable(false); jToolBar2.add(toolbarNewButton); jPanel2.add(jToolBar2, java.awt.BorderLayout.CENTER); toolbarNewArrowButton = new BasicArrowButton(SwingConstants.SOUTH); toolbarNewArrowButton.setToolTipText( getResourceConverter().getString( "workbench.toolbar.newArrow", "New")); toolbarNewArrowButton.setBorderPainted(false); toolbarNewArrowButton.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent e) { toolbarNewPopupMenu.show( jPanel2, 0, jPanel2.getSize().height); } }); jPanel2.add(toolbarNewArrowButton, java.awt.BorderLayout.EAST); jToolBar1.add(jPanel2, 0); toolbarOpenButton.setIcon( new javax.swing.ImageIcon( getClass().getResource( getResourceConverter().getGUIReference("open")))); toolbarOpenButton.setToolTipText( getResourceConverter().getString( "workbench.toolbar.open", "Open")); toolbarOpenButton.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent evt) { openMenuItemActionPerformed(evt); } }); jToolBar1.add(toolbarOpenButton); toolbarSaveButton.setIcon( new javax.swing.ImageIcon( getClass().getResource( getResourceConverter().getGUIReference("save")))); toolbarSaveButton.setToolTipText( getResourceConverter().getString( "workbench.toolbar.save", "Save")); toolbarSaveButton.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent evt) { saveMenuItemActionPerformed(evt); } }); jToolBar1.add(toolbarSaveButton); toolbarSaveAsButton.setIcon( new javax.swing.ImageIcon( getClass().getResource( getResourceConverter().getGUIReference("saveAs")))); toolbarSaveAsButton.setToolTipText( getResourceConverter().getString( "workbench.toolbar.saveAs", "Save As")); toolbarSaveAsButton.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent evt) { saveAsMenuItemActionPerformed(evt); } }); jToolBar1.add(toolbarSaveAsButton); jPanel1.setMaximumSize(new java.awt.Dimension(8, 8)); jToolBar1.add(jPanel1); toolbarPreferencesButton.setIcon( new javax.swing.ImageIcon( getClass().getResource( getResourceConverter().getGUIReference("preferences")))); toolbarPreferencesButton.setToolTipText( getResourceConverter().getString( "workbench.toolbar.connection", "Connection")); toolbarPreferencesButton.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent evt) { connectionButtonActionPerformed(evt); } }); jToolBar1.add(toolbarPreferencesButton); getContentPane().add(jToolBar1, java.awt.BorderLayout.NORTH); fileMenu.setText( getResourceConverter().getString( "workbench.menu.file", "File")); fileMenu.setMnemonic(KeyEvent.VK_F); newMenu.setText( getResourceConverter().getString( "workbench.menu.new", "New")); newSchemaMenuItem.setText( getResourceConverter().getString( "workbench.menu.newSchema", "Schema")); newSchemaMenuItem.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent evt) { newSchemaMenuItemActionPerformed(evt); } }); newMenu.add(newSchemaMenuItem); newQueryMenuItem.setText( getResourceConverter().getString( "workbench.menu.newQuery", "MDX Query")); newQueryMenuItem.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent evt) { newQueryMenuItemActionPerformed(evt); } }); newMenu.add(newQueryMenuItem); newJDBCExplorerMenuItem.setText( getResourceConverter().getString( "workbench.menu.newJDBC", "JDBC Explorer")); newJDBCExplorerMenuItem.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent evt) { newJDBCExplorerMenuItemActionPerformed(evt); } }); newMenu.add(newJDBCExplorerMenuItem); fileMenu.add(newMenu); openMenuItem.setText( getResourceConverter().getString( "workbench.menu.open", "Open")); openMenuItem.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent evt) { openMenuItemActionPerformed(evt); } }); fileMenu.add(openMenuItem); saveMenuItem.setText( getResourceConverter().getString( "workbench.menu.save", "Save")); saveMenuItem.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent evt) { saveMenuItemActionPerformed(evt); } }); fileMenu.add(saveMenuItem); saveAsMenuItem.setText( getResourceConverter().getString( "workbench.menu.saveAsDot", "Save As ...")); saveAsMenuItem.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent evt) { saveAsMenuItemActionPerformed(evt); } }); fileMenu.add(saveAsMenuItem); // add last used fileMenu.add(jSeparator2); lastUsed1MenuItem.setText(getWorkbenchProperty("lastUsed1")); lastUsed1MenuItem.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent evt) { lastUsed1MenuItemActionPerformed(evt); } }); fileMenu.add(lastUsed1MenuItem); lastUsed2MenuItem.setText(getWorkbenchProperty("lastUsed2")); lastUsed2MenuItem.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent evt) { lastUsed2MenuItemActionPerformed(evt); } }); fileMenu.add(lastUsed2MenuItem); lastUsed3MenuItem.setText(getWorkbenchProperty("lastUsed3")); lastUsed3MenuItem.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent evt) { lastUsed3MenuItemActionPerformed(evt); } }); fileMenu.add(lastUsed3MenuItem); lastUsed4MenuItem.setText(getWorkbenchProperty("lastUsed4")); lastUsed4MenuItem.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent evt) { lastUsed4MenuItemActionPerformed(evt); } }); fileMenu.add(lastUsed4MenuItem); updateLastUsedMenu(); fileMenu.add(jSeparator1); exitMenuItem.setText( getResourceConverter().getString( "workbench.menu.exit", "Exit")); exitMenuItem.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent evt) { exitMenuItemActionPerformed(evt); } }); fileMenu.add(exitMenuItem); menuBar.add(fileMenu); editMenu.setText( getResourceConverter().getString( "workbench.menu.edit", "Edit")); editMenu.setMnemonic(KeyEvent.VK_E); cutMenuItem.setText( getResourceConverter().getString( "workbench.menu.cut", "Cut")); editMenu.add(cutMenuItem); copyMenuItem.setText( getResourceConverter().getString( "workbench.menu.copy", "Copy")); editMenu.add(copyMenuItem); pasteMenuItem.setText( getResourceConverter().getString( "workbench.menu.paste", "Paste")); editMenu.add(pasteMenuItem); editMenu.add(deleteMenuItem); menuBar.add(editMenu); viewMenu.setText( getResourceConverter().getString( "workbench.menu.view", "View")); viewMenu.setMnemonic(KeyEvent.VK_V); viewXmlMenuItem.setText( getResourceConverter().getString( "workbench.menu.viewXML", "View XML")); viewXmlMenuItem.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent evt) { viewXMLMenuItemActionPerformed(evt); } }); viewMenu.add(viewXmlMenuItem); menuBar.add(viewMenu); toolsMenu.setText(getResourceConverter().getString( "workbench.menu.options", "Options")); toolsMenu.setMnemonic(KeyEvent.VK_O); preferencesMenuItem.setText(getResourceConverter().getString( "workbench.menu.connection", "Connection")); preferencesMenuItem.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent evt) { connectionButtonActionPerformed(evt); } }); toolsMenu.add(preferencesMenuItem); requireSchemaCheckboxMenuItem.setText( getResourceConverter().getString( "workbench.menu.requireSchema", "Require Schema")); requireSchemaCheckboxMenuItem.setSelected(requireSchema); requireSchemaCheckboxMenuItem.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent e) { requireSchemaActionPerformed(e); } }); toolsMenu.add(requireSchemaCheckboxMenuItem); menuBar.add(toolsMenu); windowMenu.setText( getResourceConverter().getString( "workbench.menu.windows", "Windows")); windowMenu.setMnemonic(KeyEvent.VK_W); cascadeMenuItem = new javax.swing.JMenuItem(); cascadeMenuItem.setText( getResourceConverter().getString( "workbench.menu.cascadeWindows", "Cascade Windows")); cascadeMenuItem.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent evt) { cascadeMenuItemActionPerformed(evt); } }); tileMenuItem = new javax.swing.JMenuItem(); tileMenuItem.setText( getResourceConverter().getString( "workbench.menu.tileWindows", "Tile Windows")); tileMenuItem.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent evt) { tileMenuItemActionPerformed(evt); } }); closeAllMenuItem = new javax.swing.JMenuItem(); closeAllMenuItem.setText( getResourceConverter().getString( "workbench.menu.closeAll", "Close All")); closeAllMenuItem.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent evt) { closeAllMenuItemActionPerformed(evt); } }); minimizeMenuItem = new javax.swing.JMenuItem(); minimizeMenuItem.setText( getResourceConverter().getString( "workbench.menu.minimizeAll", "Minimize All")); minimizeMenuItem.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent evt) { minimizeMenuItemActionPerformed(evt); } }); maximizeMenuItem = new javax.swing.JMenuItem(); maximizeMenuItem.setText( getResourceConverter().getString( "workbench.menu.maximizeAll", "Maximize All")); maximizeMenuItem.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent evt) { maximizeMenuItemActionPerformed(evt); } }); menuBar.add(windowMenu); aboutMenuItem.setText( getResourceConverter().getString( "workbench.menu.about", "About")); aboutMenuItem.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent evt) { aboutMenuItemActionPerformed(evt); } }); helpMenu.add(aboutMenuItem); helpMenu.setText( getResourceConverter().getString( "workbench.menu.help", "Help")); helpMenu.setMnemonic(KeyEvent.VK_H); menuBar.add(helpMenu); setJMenuBar(menuBar); pack(); } /** * this method loads any available menubar plugins based on */ private void loadMenubarPlugins() { // render any plugins InputStream pluginStream = null; try { Properties props = new Properties(); pluginStream = getClass().getResourceAsStream( "/workbench_plugins.properties"); if (pluginStream != null) { props.load(pluginStream); for (Object key : props.keySet()) { String keystr = (String) key; if (keystr.startsWith("workbench.menu-plugin")) { String val = props.getProperty(keystr); WorkbenchMenubarPlugin plugin = (WorkbenchMenubarPlugin) Class.forName(val) .newInstance(); plugin.setWorkbench(this); plugin.addItemsToMenubar(menuBar); } } } } catch (Exception e) { e.printStackTrace(); } finally { try { if (pluginStream != null) { pluginStream.close(); } } catch (Exception e) { } } } /** * @return the workbenchResourceBundle */ public ResourceBundle getWorkbenchResourceBundle() { return workbenchResourceBundle; } /** * @return the resourceConverter */ public I18n getResourceConverter() { if (resourceConverter == null) { resourceConverter = getGlobalResourceConverter(); } return resourceConverter; } private void tileMenuItemActionPerformed(ActionEvent evt) { final Dimension dsize = desktopPane.getSize(); final int desktopW = (int) dsize.getWidth(); final int desktopH = (int) dsize.getHeight(); final int darea = desktopW * desktopH; final double eacharea = darea / (schemaWindowMap.size() + mdxWindows.size() + jdbcWindows.size()); final int wh = (int) Math.sqrt(eacharea); try { int x = 0, y = 0; for (JInternalFrame sf : getAllFrames()) { if (sf != null && !sf.isIcon()) { sf.setMaximum(false); sf.moveToFront(); if (x >= desktopW || (desktopW - x) * wh < eacharea / 2) { // move to next row of windows y += wh; x = 0; } int sfwidth = ((x + wh) < desktopW ? wh : desktopW - x); int sfheight = ((y + wh) < desktopH ? wh : desktopH - y); sf.setBounds(x, y, sfwidth, sfheight); x += sfwidth; } } } catch (Exception ex) { LOGGER.error("tileMenuItemActionPerformed", ex); // do nothing } } // cascade all the indows open in schema workbench private void cascadeMenuItemActionPerformed( ActionEvent evt) { try { int sfi = 1; for (JInternalFrame sf : getAllFrames()) { if (sf != null && !sf.isIcon()) { sf.setMaximum(false); sf.setLocation(30 * sfi, 30 * sfi); sf.moveToFront(); sf.setSelected(true); sfi++; } } } catch (Exception ex) { LOGGER.error("cascadeMenuItemActionPerformed", ex); // do nothing } } // close all the windows open in schema workbench private void closeAllMenuItemActionPerformed(ActionEvent evt) { closeAllSchemaFrames(false); } private void closeAllSchemaFrames(boolean exitAfterClose) { try { for (JInternalFrame sf : getAllFrames()) { if (sf == null) { continue; } if (sf.getContentPane().getComponent(0) instanceof SchemaExplorer) { SchemaExplorer se = (SchemaExplorer) sf.getContentPane().getComponent(0); sf.setSelected(true); int response = confirmFrameClose(sf, se); switch (response) { case 2: // cancel return; case 3: // not dirty sf.setClosed(true); break; } } else { sf.setClosed(true); } } // exit Schema Workbench if no files are open if (((schemaWindowMap.keySet().size()) == 0) && exitAfterClose) { System.exit(0); } } catch (Exception ex) { LOGGER.error("closeAllSchemaFrames", ex); } } private int confirmFrameClose( JInternalFrame schemaFrame, SchemaExplorer se) { if (se.isDirty()) { JMenuItem schemaMenuItem = schemaWindowMap.get( desktopPane.getSelectedFrame()); // yes=0; no=1; cancel=2 int answer = JOptionPane.showConfirmDialog( null, getResourceConverter().getFormattedString( "workbench.saveSchemaOnClose.alert", "Save changes to {0}?", se.getSchemaFile().toString()), getResourceConverter().getString( "workbench.saveSchemaOnClose.title", "Schema"), JOptionPane.YES_NO_CANCEL_OPTION); switch (answer) { case 0: saveMenuItemActionPerformed(null); schemaWindowMap.remove(schemaFrame); updateMDXCatalogList(); schemaFrame.dispose(); windowMenu.remove(schemaMenuItem); break; case 1: schemaFrame.dispose(); schemaWindowMap.remove(schemaFrame); windowMenu.remove(schemaMenuItem); break; case 2: try { schemaFrame.setClosed(false); schemaFrame.show(); } catch (Exception ex) { LOGGER.error(ex); } } return answer; } return 3; } private void minimizeMenuItemActionPerformed( ActionEvent evt) { try { for (JInternalFrame sf : getAllFrames()) { if (sf != null && !sf.isIcon()) { sf.setIcon(true); } } } catch (Exception ex) { LOGGER.error("minimizeMenuItemActionPerformed", ex); // do nothing } } private void maximizeMenuItemActionPerformed( ActionEvent evt) { try { for (JInternalFrame sf : getAllFrames()) { if (sf != null) { sf.setIcon(false); sf.setMaximum(true); } } } catch (Exception ex) { LOGGER.error("maximizeMenuItemActionPerformed", ex); // do nothing } } /** * Returns an iterable over all internal frames. */ @SuppressWarnings("unchecked") private Iterable getAllFrames() { return UnionIterator.over( schemaWindowMap.keySet(), mdxWindows, jdbcWindows); } private void aboutMenuItemActionPerformed(ActionEvent evt) { try { URL versionUrl = myClassLoader.getResource( getResourceConverter().getGUIReference( "version" ) ); InputStream versionIn = versionUrl.openStream(); String ver = IOUtils.toString( versionIn ); ver = ver.replace( "PRODUCT_VERSION", MondrianServerRegistry.INSTANCE.getProductVersion() ); ver = ver.replace( "COPYRIGHT_YEAR", MondrianServerRegistry.INSTANCE.getCopyrightYear() ); JEditorPane jEditorPane = new JEditorPane( "text/html", ver ); jEditorPane.setEditable(false); JScrollPane jScrollPane = new JScrollPane(jEditorPane); JPanel jPanel = new JPanel(); jPanel.setLayout(new java.awt.BorderLayout()); jPanel.add(jScrollPane, java.awt.BorderLayout.CENTER); JInternalFrame jf = new JInternalFrame(); jf.setTitle("About"); jf.getContentPane().add(jPanel); Dimension screenSize = this.getSize(); int aboutW = 400; int aboutH = 300; int width = (screenSize.width / 2) - (aboutW / 2); int height = (screenSize.height / 2) - (aboutH / 2) - 100; jf.setBounds(width, height, aboutW, aboutH); jf.setClosable(true); desktopPane.add(jf); jf.setVisible(true); jf.show(); } catch (Exception ex) { LOGGER.error("aboutMenuItemActionPerformed", ex); } } private void newJDBCExplorerMenuItemActionPerformed( ActionEvent evt) { try { if (jdbcMetaData == null) { getNewJdbcMetadata(); } final JInternalFrame jf = new JInternalFrame(); jf.setTitle( getResourceConverter().getFormattedString( "workbench.new.JDBCExplorer.title", "JDBC Explorer - {0} {1}", jdbcMetaData.getDatabaseProductName(), jdbcMetaData.getJdbcConnectionUrl())); getNewJdbcMetadata(); JdbcExplorer jdbce = new JdbcExplorer(jdbcMetaData, this); jf.getContentPane().add(jdbce); jf.setBounds(0, 0, 500, 480); jf.setClosable(true); jf.setIconifiable(true); jf.setMaximizable(true); jf.setResizable(true); jf.setVisible(true); // create jdbc menu item final javax.swing.JMenuItem jdbcMenuItem = new javax.swing.JMenuItem(); jdbcMenuItem.setText( getResourceConverter().getFormattedString( "workbench.new.JDBCExplorer.menuitem", "{0} JDBC Explorer", Integer.toString(windowMenuMapIndex++))); jdbcMenuItem.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent evt) { try { if (jf.isIcon()) { jf.setIcon(false); } else { jf.setSelected(true); } } catch (Exception ex) { LOGGER.error("queryMenuItem", ex); } } }); jf.addInternalFrameListener( new InternalFrameAdapter() { public void internalFrameClosing(InternalFrameEvent e) { jdbcWindows.remove(jf); jf.dispose(); // follow this by removing file from schemaWindowMap windowMenu.remove(jdbcMenuItem); return; } }); desktopPane.add(jf); jf.setVisible(true); jf.show(); try { jf.setSelected(true); } catch (Exception ex) { // do nothing LOGGER.error( "newJDBCExplorerMenuItemActionPerformed.setSelected", ex); } jdbcWindows.add(jf); windowMenu.add(jdbcMenuItem, -1); windowMenu.add(jSeparator3, -1); windowMenu.add(cascadeMenuItem, -1); windowMenu.add(tileMenuItem, -1); windowMenu.add(minimizeMenuItem, -1); windowMenu.add(maximizeMenuItem, -1); windowMenu.add(closeAllMenuItem, -1); } catch (Exception ex) { JOptionPane.showMessageDialog( this, getResourceConverter().getFormattedString( "workbench.new.JDBCExplorer.exception", "Database connection not successful.\n{0}", ex.getLocalizedMessage()), getResourceConverter().getString( "workbench.new.JDBCExplorer.exception.title", "Database Connection Error"), JOptionPane.ERROR_MESSAGE); LOGGER.error("newJDBCExplorerMenuItemActionPerformed", ex); } } /** * Convenience method for retrieving the dbMeta instance that handles * required Kettle initialization. * * @param xml output of {@link DatabaseMeta#getXML()} or null * @return the current {@link DatabaseMeta} instance */ private DatabaseMeta getDbMeta(String xml) { try { if (!KettleClientEnvironment.isInitialized()) { System.setProperty( "KETTLE_PLUGIN_BASE_FOLDERS", KETTLE_PLUGIN_BASE_FOLDERS); KettleClientEnvironment.init(); } if (dbMeta != null) { return dbMeta; } if (xml == null) { dbMeta = new DatabaseMeta(); } else { dbMeta = new DatabaseMeta(xml); } } catch (KettleException e) { throw new RuntimeException( getResourceConverter().getFormattedString( "workbench.new.Kettle.exception", "Kettle failed to initialize."), e); } return dbMeta; } private void connectionButtonActionPerformed(ActionEvent evt) { if (connectionDialog == null) { dbMeta = getDbMeta(null); connectionDialogController = new DataHandler(); connectionDialogController.setName("dataHandler"); XulDomContainer container = null; try { XulLoader loader = new SwingXulLoader(); container = loader.loadXul( DatabaseConnectionDialog.DIALOG_DEFINITION_FILE, Messages.getBundle()); } catch (XulException e) { throw new RuntimeException("Xul failed to initialize", e); } container.addEventHandler(connectionDialogController); connectionDialogController.loadConnectionData(); connectionDialogController.setData(dbMeta); connectionDialog = (XulDialog) container.getDocumentRoot() .getRootElement(); } connectionDialog.show(); dbMeta = (DatabaseMeta) connectionDialogController.getData(); if (dbMeta.hasChanged()) { dbMeta.clearChanged(); syncToWorkspace(dbMeta); // Enforces the JDBC preferences entered throughout all schemas // currently opened in the workbench. resetWorkbench(); } } private void syncToWorkspace(DatabaseMeta databaseMeta) { // sync from dbmeta to wkspc try { jdbcConnectionUrl = databaseMeta.getURL(); } catch (KettleDatabaseException e) { throw new RuntimeException("Failed to determine JDBC URL", e); } jdbcDriverClassName = databaseMeta.getDriverClass(); jdbcUsername = databaseMeta.getUsername(); jdbcPassword = databaseMeta.getPassword(); //jdbcSchema = databaseMeta.getPreferredSchemaName(); Map options = dbMeta.getExtraOptions(); String dbType = dbMeta.getDatabaseInterface().getPluginId(); jdbcSchema = options.get(dbType + "." + FILTER_SCHEMA_LIST); // saving to workbench properties for documentation purposes only, since // persistence // of the dbmeta object is handled by a separate xml file now if (jdbcDriverClassName != null) { setWorkbenchProperty("jdbcDriverClassName", jdbcDriverClassName); } if (jdbcConnectionUrl != null) { setWorkbenchProperty("jdbcConnectionUrl", jdbcConnectionUrl); } if (jdbcUsername != null) { setWorkbenchProperty("jdbcUsername", jdbcUsername); } if (jdbcPassword != null) { setWorkbenchProperty("jdbcPassword", jdbcPassword); } if (jdbcSchema != null) { setWorkbenchProperty("jdbcSchema", jdbcSchema); } } private void requireSchemaActionPerformed(ActionEvent evt) { requireSchema = ((JCheckBoxMenuItem) evt.getSource()).isSelected(); setWorkbenchProperty("requireSchema", "" + requireSchema); } private void newSchemaMenuItemActionPerformed(ActionEvent evt) { MondrianProperties.instance(); // User's default directory. This default depends on the operating // system. It is typically the "My Documents" folder on Windows, and // the user's home directory on Unix. File defaultDir = FileSystemView.getFileSystemView().getDefaultDirectory(); File outputFile; do { outputFile = new File(defaultDir, "Schema" + newSchema++ + ".xml"); } while (outputFile.exists()); openSchemaFrame(outputFile, true); } private void newQueryMenuItemActionPerformed(ActionEvent evt) { JMenuItem schemaMenuItem = schemaWindowMap.get(desktopPane.getSelectedFrame()); final JInternalFrame jf = new JInternalFrame(); jf.setTitle( getResourceConverter().getString( "workbench.new.MDXQuery.title", "MDX Query")); QueryPanel qp = new QueryPanel(this); jf.getContentPane().add(qp); jf.setBounds(0, 0, 500, 480); jf.setClosable(true); jf.setIconifiable(true); jf.setMaximizable(true); jf.setResizable(true); jf.setVisible(true); desktopPane.add(jf); jf.show(); try { jf.setSelected(true); } catch (Exception ex) { // do nothing LOGGER.error("newQueryMenuItemActionPerformed.setSelected", ex); } // add the mdx frame to this set of mdx frames for cascading method mdxWindows.add(jf); // create mdx menu item final javax.swing.JMenuItem queryMenuItem = new javax.swing.JMenuItem(); queryMenuItem.setText( getResourceConverter().getFormattedString( "workbench.new.MDXQuery.menuitem", "{0} MDX", Integer.toString(windowMenuMapIndex))); queryMenuItem.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent evt) { try { if (jf.isIcon()) { jf.setIcon(false); } else { jf.setSelected(true); } } catch (Exception ex) { LOGGER.error("queryMenuItem", ex); } } }); // disable mdx frame close operation to provide our handler // to remove frame object from mdxframeset before closing jf.setDefaultCloseOperation(DO_NOTHING_ON_CLOSE); jf.addInternalFrameListener( new InternalFrameAdapter() { public void internalFrameClosing(InternalFrameEvent e) { mdxWindows.remove(jf); jf.dispose(); // follow this by removing file from schemaWindowMap windowMenu.remove(queryMenuItem); return; } }); windowMenu.add(queryMenuItem, -1); windowMenu.add(jSeparator3, -1); windowMenu.add(cascadeMenuItem, -1); windowMenu.add(tileMenuItem, -1); windowMenu.add(minimizeMenuItem, -1); windowMenu.add(maximizeMenuItem, -1); windowMenu.add(closeAllMenuItem, -1); qp.setMenuItem(queryMenuItem); qp.setSchemaWindowMap(schemaWindowMap); qp.setWindowMenuIndex(windowMenuMapIndex++); if (schemaMenuItem != null) { qp.initConnection(schemaMenuItem.getText()); } else { JOptionPane.showMessageDialog( this, getResourceConverter().getString( "workbench.new.MDXQuery.no.selection", "No Mondrian connection. Select a Schema to connect."), getResourceConverter().getString( "workbench.new.MDXQuery.no.selection.title", "Alert"), JOptionPane.WARNING_MESSAGE); } } // inform all opened mdx query windows about the list of opened schema files private void updateMDXCatalogList() { Iterator it = mdxWindows.iterator(); while (it.hasNext()) { JInternalFrame elem = it.next(); QueryPanel qp = (QueryPanel) elem.getContentPane().getComponent(0); qp.setSchemaWindowMap(schemaWindowMap); } } /** * returns the currently selected schema explorer object * * @return current schema explorer object */ public SchemaExplorer getCurrentSchemaExplorer() { JInternalFrame jf = desktopPane.getSelectedFrame(); if (jf != null && jf.getContentPane().getComponentCount() > 0 && jf .getContentPane().getComponent(0) instanceof SchemaExplorer) { return (SchemaExplorer) jf.getContentPane().getComponent(0); } return null; } private void saveAsMenuItemActionPerformed(ActionEvent evt) { JInternalFrame jf = desktopPane.getSelectedFrame(); if (jf != null && jf.getContentPane() .getComponent(0) instanceof SchemaExplorer) { SchemaExplorer se = (SchemaExplorer) jf.getContentPane().getComponent(0); java.io.File schemaFile = se.getSchemaFile(); java.io.File oldSchemaFile = schemaFile; java.io.File suggSchemaFile = new File( schemaFile == null ? se.getSchema().name.trim() + ".xml" : schemaFile.getName()); MondrianGuiDef.Schema schema = se.getSchema(); JFileChooser jfc = new JFileChooser(); MondrianProperties.instance(); jfc.setSelectedFile(suggSchemaFile); if (!isSchemaValid(schema)) { // the schema would not be re-loadable. Abort save. return; } if (jfc.showSaveDialog(this) == JFileChooser.APPROVE_OPTION) { try { schemaFile = jfc.getSelectedFile(); if (!oldSchemaFile.equals(schemaFile) && schemaFile .exists()) { // new file already exists, check for overwrite int answer = JOptionPane.showConfirmDialog( null, getResourceConverter().getFormattedString( "workbench.saveAs.schema.confirm", "{0} schema file already exists. Do you want to replace it?", schemaFile.getAbsolutePath()), getResourceConverter().getString( "workbench.saveAs.schema.confirm.title", "Save As"), JOptionPane.YES_NO_OPTION); if (answer == 1) { // no=1 ; yes=0 return; } } if (se.isNewFile() && !oldSchemaFile.equals(schemaFile)) { oldSchemaFile.delete(); } if (se.isNewFile()) { se.setNewFile(false); } se.setDirty(false); se.setDirtyFlag(false); XMLOutput out = new XMLOutput( new java.io.FileWriter(jfc.getSelectedFile())); out.setAlwaysQuoteCData(true); out.setIndentString(" "); schema.displayXML(out); se.setSchemaFile(schemaFile); se.setTitle(); // sets title of iframe setLastUsed( jfc.getSelectedFile().getName(), jfc.getSelectedFile().toURI().toURL().toString()); // Update menu item with new file name, then update catalog // list for mdx queries JMenuItem sMenuItem = schemaWindowMap.get(jf); String mtexttokens[] = sMenuItem.getText().split(" "); sMenuItem.setText( mtexttokens[0] + " " + se.getSchemaFile().getName()); // Schema menu item updated, now update mdx query windows // with updated catalog list. updateMDXCatalogList(); } catch (Exception ex) { LOGGER.error(ex); } } } } /** * Validates that the schema can be parsed and loaded, * showing a warning message if any errors are encountered. */ private boolean isSchemaValid(MondrianGuiDef.Schema schema) { try { StringWriter writer = new StringWriter(); XMLOutput xmlOutput = new XMLOutput(writer); schema.displayXML(xmlOutput); Parser xmlParser = XOMUtil.createDefaultParser(); Reader reader = new StringReader(writer.getBuffer().toString()); // attempt to create a new schema new MondrianGuiDef.Schema(xmlParser.parse(reader)); } catch (XOMException e) { JOptionPane.showMessageDialog( this, getResourceConverter().getFormattedString( "workbench.save.invalid.schema", "Please correct the following error before saving:", e.getLocalizedMessage()), getResourceConverter().getFormattedString( "workbench.save.invalid.schema.title", "Cannot Save"), JOptionPane.WARNING_MESSAGE); return false; } return true; } private void viewXMLMenuItemActionPerformed(ActionEvent evt) { JInternalFrame jf = desktopPane.getSelectedFrame(); boolean oldValue = viewXmlMenuItem.getState(); if (jf != null && jf.getContentPane().getComponent(0) instanceof SchemaExplorer) { SchemaExplorer se = (SchemaExplorer) jf.getContentPane().getComponent(0); // Call schema explorer's view xml event and update the workbench's // view menu accordingly' ((JCheckBoxMenuItem) evt.getSource()).setSelected(se.editMode(evt)); return; } viewXmlMenuItem.setSelected(!oldValue); } public void saveMenuItemActionPerformed(ActionEvent evt) { JInternalFrame jf = desktopPane.getSelectedFrame(); // Don't save if nothing there if (jf == null || jf.getContentPane() == null) { return; } if (jf.getContentPane().getComponent(0) instanceof SchemaExplorer) { SchemaExplorer se = (SchemaExplorer) jf.getContentPane().getComponent(0); java.io.File schemaFile = se.getSchemaFile(); if (se.isNewFile()) { saveAsMenuItemActionPerformed(evt); return; } se.setDirty(false); se.setDirtyFlag(false); se.setTitle(); // sets title of iframe MondrianGuiDef.Schema schema = se.getSchema(); if (!isSchemaValid(schema)) { // the schema would not be re-loadable. Abort save. return; } MondrianProperties.instance(); try { XMLOutput out = new XMLOutput(new FileWriter(schemaFile)); out.setAlwaysQuoteCData(true); out.setIndentString(" "); schema.displayXML(out); setLastUsed( schemaFile.getName(), schemaFile.toURI().toURL().toString()); } catch (Exception ex) { LOGGER.error("saveMenuItemActionPerformed", ex); } } } /** * Set last used in properties file */ private void setLastUsed(String name, String url) { int match = 4; String luName = null; String propname = null; String lastUsed = "lastUsed"; String lastUsedUrl = "lastUsedUrl"; for (int i = 1; i <= 4; i++) { propname = lastUsed + i; luName = getWorkbenchProperty(propname); if (luName != null && luName.equals(name)) { match = i; break; } } for (int i = match; i > 1; i--) { if (getWorkbenchProperty(lastUsed + (i - 1)) != null) { setWorkbenchProperty( lastUsed + i, getWorkbenchProperty( lastUsed + (i - 1))); setWorkbenchProperty( lastUsedUrl + i, getWorkbenchProperty( lastUsedUrl + (i - 1))); } } setWorkbenchProperty(LAST_USED1, name); setWorkbenchProperty(LAST_USED1_URL, url); updateLastUsedMenu(); storeWorkbenchProperties(); storeDatabaseMeta(); } private void updateLastUsedMenu() { if (getWorkbenchProperty(LAST_USED1) == null) { jSeparator2.setVisible(false); } else { jSeparator2.setVisible(true); } if (getWorkbenchProperty(LAST_USED1) != null) { lastUsed1MenuItem.setVisible(true); } else { lastUsed1MenuItem.setVisible(false); } if (getWorkbenchProperty(LAST_USED2) != null) { lastUsed2MenuItem.setVisible(true); } else { lastUsed2MenuItem.setVisible(false); } if (getWorkbenchProperty(LAST_USED3) != null) { lastUsed3MenuItem.setVisible(true); } else { lastUsed3MenuItem.setVisible(false); } if (getWorkbenchProperty(LAST_USED4) != null) { lastUsed4MenuItem.setVisible(true); } else { lastUsed4MenuItem.setVisible(false); } lastUsed1MenuItem.setText(getWorkbenchProperty(LAST_USED1)); lastUsed2MenuItem.setText(getWorkbenchProperty(LAST_USED2)); lastUsed3MenuItem.setText(getWorkbenchProperty(LAST_USED3)); lastUsed4MenuItem.setText(getWorkbenchProperty(LAST_USED4)); } private void lastUsed1MenuItemActionPerformed(ActionEvent evt) { try { openSchemaFrame( new File(new URI(getWorkbenchProperty(LAST_USED1_URL))), false); } catch (Exception e) { // probably URISyntaxException LOGGER.error("lastUsed1MenuItemActionPerformed", e); } } private void lastUsed2MenuItemActionPerformed(ActionEvent evt) { try { openSchemaFrame( new File(new URI(getWorkbenchProperty(LAST_USED2_URL))), false); setLastUsed( getWorkbenchProperty(LAST_USED2), getWorkbenchProperty( LAST_USED2_URL)); } catch (URISyntaxException e) { LOGGER.error("lastUsed2MenuItemActionPerformed", e); } } private void lastUsed3MenuItemActionPerformed(ActionEvent evt) { try { openSchemaFrame( new File(new URI(getWorkbenchProperty(LAST_USED3_URL))), false); setLastUsed( getWorkbenchProperty(LAST_USED3), getWorkbenchProperty( LAST_USED3_URL)); } catch (URISyntaxException e) { LOGGER.error("lastUsed3MenuItemActionPerformed", e); } } private void lastUsed4MenuItemActionPerformed(ActionEvent evt) { try { openSchemaFrame( new File(new URI(getWorkbenchProperty(LAST_USED4_URL))), false); setLastUsed( getWorkbenchProperty(LAST_USED4), getWorkbenchProperty( LAST_USED4_URL)); } catch (URISyntaxException e) { LOGGER.error("lastUsed4MenuItemActionPerformed", e); } } private void openSchemaFrame(File file, boolean newFile) { try { setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); if (!newFile) { // check if file not already open if (checkFileOpen(file)) { return; } // check if schema file exists if (!file.exists()) { JOptionPane.showMessageDialog( this, getResourceConverter().getFormattedString( "workbench.open.schema.not.found", "{0} File not found.", file.getAbsolutePath()), getResourceConverter().getString( "workbench.open.schema.not.found.title", "Alert"), JOptionPane.WARNING_MESSAGE); return; } // check if file is writable if (!file.canWrite()) { JOptionPane.showMessageDialog( this, getResourceConverter().getFormattedString( "workbench.open.schema.not.writeable", "{0} is not writeable.", file.getAbsolutePath()), getResourceConverter().getString( "workbench.open.schema.not.writeable.title", "Alert"), JOptionPane.WARNING_MESSAGE); return; } checkSchemaFile(file); } final JInternalFrame schemaFrame = new JInternalFrame(); schemaFrame.setTitle( getResourceConverter().getFormattedString( "workbench.open.schema.title", "Schema - {0}", file.getName())); getNewJdbcMetadata(); schemaFrame.getContentPane().add( new SchemaExplorer( this, file, jdbcMetaData, newFile, schemaFrame)); String errorOpening = ((SchemaExplorer) schemaFrame.getContentPane().getComponent(0)) .getErrMsg(); if (errorOpening != null) { JOptionPane.showMessageDialog( this, getResourceConverter().getFormattedString( "workbench.open.schema.error", "Error opening schema - {0}.", errorOpening), getResourceConverter().getString( "workbench.open.schema.error.title", "Error"), JOptionPane.ERROR_MESSAGE); schemaFrame.setClosed(true); return; } schemaFrame.setBounds(0, 0, 1000, 650); schemaFrame.setClosable(true); schemaFrame.setIconifiable(true); schemaFrame.setMaximizable(true); schemaFrame.setResizable(true); schemaFrame.setVisible(true); desktopPane.add( schemaFrame, javax.swing.JLayeredPane.DEFAULT_LAYER); schemaFrame.show(); schemaFrame.setMaximum(true); displayWarningOnFailedConnection(); final javax.swing.JMenuItem schemaMenuItem = new javax.swing.JMenuItem(); schemaMenuItem.setText(windowMenuMapIndex++ + " " + file.getName()); schemaMenuItem.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent evt) { try { if (schemaFrame.isIcon()) { schemaFrame.setIcon(false); } else { schemaFrame.setSelected(true); } } catch (Exception ex) { LOGGER.error("schemaMenuItem", ex); } } }); windowMenu.add(schemaMenuItem, 0); windowMenu.setEnabled(true); windowMenu.add(jSeparator3, -1); windowMenu.add(cascadeMenuItem, -1); windowMenu.add(tileMenuItem, -1); windowMenu.add(minimizeMenuItem, -1); windowMenu.add(maximizeMenuItem, -1); windowMenu.add(closeAllMenuItem, -1); // add the file details in menu map schemaWindowMap.put(schemaFrame, schemaMenuItem); updateMDXCatalogList(); schemaFrame.setDefaultCloseOperation(DO_NOTHING_ON_CLOSE); schemaFrame.addInternalFrameListener( new InternalFrameAdapter() { public void internalFrameClosing(InternalFrameEvent e) { if (schemaFrame.getContentPane() .getComponent(0) instanceof SchemaExplorer) { SchemaExplorer se = (SchemaExplorer) schemaFrame.getContentPane() .getComponent(0); int response = confirmFrameClose(schemaFrame, se); if (response == 3) { // not dirty if (se.isNewFile()) { se.getSchemaFile().delete(); } // default case for no save and not dirty schemaWindowMap.remove(schemaFrame); updateMDXCatalogList(); schemaFrame.dispose(); windowMenu.remove(schemaMenuItem); } } } }); schemaFrame.setFocusable(true); schemaFrame.addFocusListener( new FocusAdapter() { public void focusGained(FocusEvent e) { if (schemaFrame.getContentPane() .getComponent(0) instanceof SchemaExplorer) { SchemaExplorer se = (SchemaExplorer) schemaFrame.getContentPane().getComponent(0); // update view menu based on schemaframe who gained // focus viewXmlMenuItem.setSelected( se.isEditModeXML()); } } public void focusLost(FocusEvent e) { if (schemaFrame.getContentPane() .getComponent(0) instanceof SchemaExplorer) { SchemaExplorer se = (SchemaExplorer) schemaFrame.getContentPane().getComponent(0); // update view menu based on viewXmlMenuItem.setSelected( se.isEditModeXML()); } } }); viewXmlMenuItem.setSelected(false); } catch (Exception ex) { LOGGER.error("openSchemaFrame", ex); } finally { setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); } } private void openMenuItemActionPerformed(ActionEvent evt) { JFileChooser jfc = new JFileChooser(); try { jfc.setFileSelectionMode(JFileChooser.FILES_ONLY); jfc.setFileFilter( new javax.swing.filechooser.FileFilter() { public boolean accept(File pathname) { return pathname.getName().toLowerCase().endsWith(".xml") || pathname.isDirectory(); } public String getDescription() { return getResourceConverter().getString( "workbench.open.schema.file.type", "Mondrian Schema files (*.xml)"); } }); String lastUsed = getWorkbenchProperty(LAST_USED1_URL); if (lastUsed != null) { jfc.setCurrentDirectory(new File(new URI(lastUsed))); } } catch (Exception ex) { LOGGER.error("Could not set file chooser", ex); } MondrianProperties.instance(); if (jfc.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) { try { setLastUsed( jfc.getSelectedFile().getName(), jfc.getSelectedFile().toURI().toURL().toString()); } catch (MalformedURLException e) { LOGGER.error(e); } openSchemaFrame(jfc.getSelectedFile(), false); } } // checks if file already open in schema explorer private boolean checkFileOpen(File file) { Iterator it = schemaWindowMap.keySet().iterator(); // keys=schemaframes while (it.hasNext()) { JInternalFrame elem = it.next(); File f = ((SchemaExplorer) elem.getContentPane().getComponent(0)) .getSchemaFile(); if (f.equals(file)) { try { // make the schema file active elem.setSelected(true); return true; } catch (Exception ex) { // remove file from map as schema frame does not exist schemaWindowMap.remove(elem); break; } } } return false; } private void getNewJdbcMetadata() { jdbcMetaData = new JdbcMetaData( this, jdbcDriverClassName, jdbcConnectionUrl, jdbcUsername, jdbcPassword, jdbcSchema, requireSchema); } /** * Updates the JdbcMetaData for each SchemaExplorer contained in each Schema * Frame currently opened based on the JDBC preferences entered. */ private void resetWorkbench() { getNewJdbcMetadata(); Iterator theSchemaFrames = schemaWindowMap.keySet().iterator(); while (theSchemaFrames.hasNext()) { JInternalFrame theSchemaFrame = theSchemaFrames.next(); SchemaExplorer theSchemaExplorer = (SchemaExplorer) theSchemaFrame.getContentPane() .getComponent(0); File theFile = theSchemaExplorer.getSchemaFile(); checkSchemaFile(theFile); theSchemaExplorer.resetMetaData(jdbcMetaData); theSchemaExplorer.getTreeUpdater().update(); theSchemaFrame.updateUI(); } // EC: If the JDBC preferences entered then display a warning. displayWarningOnFailedConnection(); for (JInternalFrame jdbcFrame : jdbcWindows) { JdbcExplorer explorer = (JdbcExplorer) jdbcFrame.getContentPane().getComponent(0); explorer.resetMetaData(jdbcMetaData); jdbcFrame.setTitle( getResourceConverter().getFormattedString( "workbench.new.JDBCExplorer.title", "JDBC Explorer - {0} {1}", jdbcMetaData.getDatabaseProductName(), jdbcMetaData.getJdbcConnectionUrl())); explorer.getTreeUpdater().update(); explorer.updateUI(); } } /** * Display jdbc connection status warning, if connection is uncsuccessful. */ private void displayWarningOnFailedConnection() { if (jdbcMetaData != null && jdbcMetaData.getErrMsg() != null) { JOptionPane.showMessageDialog( this, getResourceConverter().getFormattedString( "workbench.open.schema.jdbc.error", "Database connection could not be done.\n{0}\nAll validations related to database will be ignored.", jdbcMetaData.getErrMsg()), getResourceConverter().getString( "workbench.open.schema.jdbc.error.title", "Alert"), JOptionPane.WARNING_MESSAGE); } } /** * Check if schema file is valid by initiating a mondrian connection. */ private void checkSchemaFile(File file) { try { // this connection parses the catalog file which if invalid will // throw exception PropertyList list = new PropertyList(); list.put("Provider", "mondrian"); list.put("Jdbc", jdbcConnectionUrl); list.put("Catalog", file.toURI().toURL().toString()); list.put("JdbcDrivers", jdbcDriverClassName); if (jdbcUsername != null && jdbcUsername.length() > 0) { list.put("JdbcUser", jdbcUsername); } if (jdbcPassword != null && jdbcPassword.length() > 0) { list.put("JdbcPassword", jdbcPassword); } DriverManager.getConnection(list, null); } catch (Exception ex) { LOGGER.error( "Exception : Schema file " + file.getAbsolutePath() + " is invalid." + ex.getMessage(), ex); } catch (Error err) { LOGGER.error( "Error : Schema file " + file.getAbsolutePath() + " is invalid." + err.getMessage(), err); } } private void exitMenuItemActionPerformed(ActionEvent evt) { storeWorkbenchProperties(); storeDatabaseMeta(); closeAllSchemaFrames(true); } /** * Parses arguments passed into Workbench. * *

Right now, it's very simple. Just search through the list of * arguments. If it begins with -f=, then the rest is a file name. Ignore * any others. We can make this more complicated later if we need to. * * @param args the command line arguments */ private void parseArgs(String args[]) { for (int argNum = 0; argNum < args.length; argNum++) { if (args[argNum].startsWith("-f=")) { openFile = args[argNum].substring(3); } } } public String getTooltip(String titleName) { try { return getWorkbenchResourceBundle().getString(titleName); } catch (MissingResourceException e) { return getResourceConverter().getFormattedString( "workbench.tooltip.error", "No help available for {0}", titleName); } } /** * @param args the command line arguments */ public static void main(String args[]) { Workbench w = null; try { w = new Workbench(); w.parseArgs(args); w.setSize(800, 600); // if user specified a file to open, do so now. if (w.openFile != null) { File f = new File(w.openFile); if (f.canRead()) { w.openSchemaFrame( f.getAbsoluteFile(), // parameter to indicate this is a new or existing // catalog file false); } } w.setVisible(true); } catch (Throwable ex) { if (w != null) { JOptionPane.showMessageDialog( w, w.getResourceConverter().getFormattedString( "workbench.main.uncoverable_error", "Pentaho Schema Workbench has encountered an unrecoverable error. \n{0}", ex.getLocalizedMessage()), w.getResourceConverter().getString( "workbench.main.uncoverable_error.title", "PSW Fatal Error"), JOptionPane.ERROR_MESSAGE); } LOGGER.error("main", ex); } } // Variables declaration - do not modify private javax.swing.JButton toolbarSaveAsButton; private javax.swing.JMenuItem openMenuItem; private javax.swing.JMenuItem lastUsed1MenuItem; private javax.swing.JMenuItem lastUsed2MenuItem; private javax.swing.JMenuItem lastUsed3MenuItem; private javax.swing.JMenuItem lastUsed4MenuItem; private javax.swing.JMenu fileMenu; private javax.swing.JMenuItem newQueryMenuItem; private javax.swing.JMenuItem newQueryMenuItem2; private javax.swing.JPanel jPanel1; private javax.swing.JPanel jPanel2; private javax.swing.JButton toolbarOpenButton; private javax.swing.JButton toolbarNewButton; private javax.swing.JButton toolbarNewArrowButton; private javax.swing.JSeparator jSeparator1; private javax.swing.JSeparator jSeparator2; private javax.swing.JSeparator jSeparator3; private javax.swing.JMenuItem cutMenuItem; private javax.swing.JMenuBar menuBar; private javax.swing.JMenuItem saveMenuItem; private javax.swing.JMenuItem newJDBCExplorerMenuItem; private javax.swing.JMenuItem newJDBCExplorerMenuItem2; private javax.swing.JButton toolbarSaveButton; private javax.swing.JMenuItem copyMenuItem; private javax.swing.JDesktopPane desktopPane; private javax.swing.JMenu viewMenu; private javax.swing.JMenu toolsMenu; private javax.swing.JMenu newMenu; private javax.swing.JMenuItem deleteMenuItem; private javax.swing.JMenuItem newSchemaMenuItem; private javax.swing.JMenuItem newSchemaMenuItem2; private javax.swing.JMenuItem exitMenuItem; private javax.swing.JButton toolbarPreferencesButton; private javax.swing.JCheckBoxMenuItem requireSchemaCheckboxMenuItem; private javax.swing.JMenu editMenu; private javax.swing.JMenuItem pasteMenuItem; private javax.swing.JMenuItem preferencesMenuItem; private javax.swing.JCheckBoxMenuItem viewXmlMenuItem; private javax.swing.JMenuItem saveAsMenuItem; private javax.swing.JToolBar jToolBar1; private javax.swing.JToolBar jToolBar2; private javax.swing.JPopupMenu toolbarNewPopupMenu; private javax.swing.JMenu windowMenu; private javax.swing.JMenu helpMenu; private javax.swing.JMenuItem aboutMenuItem; private javax.swing.JMenuItem cascadeMenuItem; private javax.swing.JMenuItem tileMenuItem; private javax.swing.JMenuItem minimizeMenuItem; private javax.swing.JMenuItem maximizeMenuItem; private javax.swing.JMenuItem closeAllMenuItem; // End of variables declaration /** * Used by schema framewhen it uses 'view xml' to update view xml menu item */ public javax.swing.JCheckBoxMenuItem getViewXmlMenuItem() { return viewXmlMenuItem; } } // End Workbench.java mondrian-3.11.0.1-R/src/main/mondrian/gui/WorkbenchMenubarPlugin.java000066400000000000000000000010361261646570300253370ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.gui; import javax.swing.*; public interface WorkbenchMenubarPlugin { public void addItemsToMenubar(JMenuBar menubar); public void setWorkbench(Workbench workbench); } // End WorkbenchMenubarPlugin.java mondrian-3.11.0.1-R/src/main/mondrian/gui/package.html000066400000000000000000000001451261646570300223420ustar00rootroot00000000000000 Contains a workbench written in Swing for designing Mondrian schemas. mondrian-3.11.0.1-R/src/main/mondrian/gui/resources/000077500000000000000000000000001261646570300220735ustar00rootroot00000000000000mondrian-3.11.0.1-R/src/main/mondrian/gui/resources/addCalculatedMember24.gif000066400000000000000000000017131261646570300265740ustar00rootroot00000000000000GIF87a !!!"""$$$'''333444666777888BBBCCCNNNQQQSSSUUUhhhkkklllnnnuuuxxxzzz{{{  "$')+,.0/2458:?CFBBBAEHEILGLOLPTMQTSX\UZ]_dh_eihnsiotmsxnuytzw~|}!,H*\ȰÇ#Jh! 'aBBR`D S@xA%ʃ >,`24#9`\Mb:\MaNL@Jp' DQ\tߺ~.[‚oݻ|>;mondrian-3.11.0.1-R/src/main/mondrian/gui/resources/addCalculatedMemberProperty24.gif000066400000000000000000000006141261646570300303400ustar00rootroot00000000000000GIF89a' %%%)))+++111777888;;;BBBCCCGGGHHHJJJLLLNNNSSSTTTZZZ]]]jjjnnnuuu! ?,pH,#AG OG!JpRGͅ $hFQt~"xE$DL|% #D C [?S?b|!jD'&!F&C'ž?'F'E׫ҷ۱CBEA;mondrian-3.11.0.1-R/src/main/mondrian/gui/resources/addCube24.gif000066400000000000000000000021471261646570300242630ustar00rootroot00000000000000GIF89a!!!!!!))!!))!)))))91))11)11B99)99199BBB1BB9BBRJJ9JJcR99RRBRRRRRZRRkZJJZZRZZZZZccJJcZZkkskksRRssRssZssss{{Z{{scckƜsss֥ޭ経ƔƔ֥֜ޥ!,H@(18ÂT|T0d"XDQ |:Yr0{eʃ7~@%O1VON0G3L^E =Eذyg1H%-l(:9a ҩP`0!EI8X MHA;mondrian-3.11.0.1-R/src/main/mondrian/gui/resources/addDimension24.gif000066400000000000000000000016711261646570300253330ustar00rootroot00000000000000GIF89aBBB!,H \XP@ * bD/2̨cG|l8 #+yr%O_4yFb$@Hy0y$ҧ&)TT%*T. @,ٯ >ڕ@}z7@~%;mondrian-3.11.0.1-R/src/main/mondrian/gui/resources/addDimensionUsage24.gif000066400000000000000000000017231261646570300263160ustar00rootroot00000000000000GIF87aBBBBBB!,H \XP@ * bD/2̨cG|l8  2J+ (P`̚&iIpj)hјHӡRO 8`jSmd(䀯&E0W6n<˖Xɺpd;6߿~cN$[I9<ӤŤS dxd# ;mondrian-3.11.0.1-R/src/main/mondrian/gui/resources/addHierarchy24.gif000066400000000000000000000016321261646570300253210ustar00rootroot00000000000000GIF87aBBBBBB!,wH*\Ȱ BD(qhqBA^H2"Ŏ QtȒJ-2M= ԉSc?5Ҭ(Ο?q](ТmJ*5@à*2EH +V ف;mondrian-3.11.0.1-R/src/main/mondrian/gui/resources/addLevel24.gif000066400000000000000000000016431261646570300244540ustar00rootroot00000000000000GIF89aBBB!,H pÇ.bĄ)fhѢƏ5vŁRT)0e/[9L/qڬHT((Ä03)2tàXb} 1˯J+nui؟M{v-ւ;mondrian-3.11.0.1-R/src/main/mondrian/gui/resources/addMeasure24.gif000066400000000000000000000016361261646570300250100ustar00rootroot00000000000000GIF89a!,{H*a:<Q@ĉ+(#7r1䀐B hF#ER8ҠI)SѲˌ(? D@#`iPK"@͂$@CF:T p8"J(pP.ĸ.ÈV8}F;y`@;mondrian-3.11.0.1-R/src/main/mondrian/gui/resources/addVirtualCube24.gif000066400000000000000000000020511261646570300256240ustar00rootroot00000000000000GIF89a3f3333f333ff3fffff3f3f̙3f3333f3333333333f3333333f3f33ff3f3f3f3333f3333333f3̙333333f333ff3ffffff3f33f3ff3f3f3ffff3fffffffffff3fffffff3fff̙ffff3fffff3f̙3333f33̙3ff3ffff̙f3f̙3f̙̙3f̙3f3333f333ff3fffff̙̙3̙f̙̙̙3f̙3f3f3333f333ff3fffff3f3f̙3f,Hz@S"RcTMĊʟI".lH UiŜjT bsɓ\8#)d*%Dg ?QpΔP#ə}hOׂSWU#qJ*)S6'A?SɕQ}ըLi? ޼#[|Bc)z9sU{V+`UANvT 9y-8>OСB;ٯұGN0ӿN1o ϣ?`@;mondrian-3.11.0.1-R/src/main/mondrian/gui/resources/addVirtualCubeDimension24.gif000066400000000000000000000016571261646570300275050ustar00rootroot00000000000000GIF89aBBB,H \XP@ * bD/2̨cG|l8 #+yr%O_4yFb$HM03(ҤKFtiԋTU*OKv׉vUCO^}PŁ>ڽjʁm ;mondrian-3.11.0.1-R/src/main/mondrian/gui/resources/addVirtualCubeMeasure24.gif000066400000000000000000000016251261646570300271540ustar00rootroot00000000000000GIF89a,zH*a:<Q@ĉ+(#7r1䀐B5BeSQIPGe&ezAXz׷[tws& ʗ•}MwpASM|vp@;mondrian-3.11.0.1-R/src/main/mondrian/gui/resources/annotation24.gif000066400000000000000000000006021261646570300251000ustar00rootroot00000000000000GIF89a)٘Z-vPPLZhv×kg዇rAuў֤nwivϬ@!?,pH,Ȥrl:DtJRvMxWd7 ^ q))& HY%%&&F(' z'' z!'' "` _)'"yHTRP"PC&JA;mondrian-3.11.0.1-R/src/main/mondrian/gui/resources/annotations24.gif000066400000000000000000000004421261646570300252650ustar00rootroot00000000000000GIF89aKZgvvLY×uhkwϬ@!,'dihlvp,qxs:; i:1a'42l\`< gS$ xY xe_3KuV  ak`$ 8= 2E;) 21.$!;mondrian-3.11.0.1-R/src/main/mondrian/gui/resources/calculatedMember24.gif000066400000000000000000000016571261646570300261720ustar00rootroot00000000000000GIF87a %%%)))+++111777888;;;BBBCCCGGGHHHJJJLLLNNNSSSTTTZZZ]]]jjjnnnuuu  "$')+,.0/2458:?CFBBBAEHEILGLOLPTMQTSX\UZ]_dh_eihnsiotmsxnuytzw~|}!,H*\ȰÇ#J@A@ @L(!%,`@-844Ӡ :8bh#btD^LQƅ?B )$?)`%ʌ,]LQfMm9Q'˟@ 1 ;mondrian-3.11.0.1-R/src/main/mondrian/gui/resources/cube16.gif000066400000000000000000000017521261646570300236540ustar00rootroot00000000000000GIF89a!!!!!!!!1))!!))!)))))91))11)11911BBB1BB9JJJJJZJJcR99RBBRJ9RRBRRRRRZZZRZZckRRkkkskkss{{Z{{sckkkss֥組Ɣޥޥ,}Hp;(\Ƒ B 6, t9 c@Pˆ=< eGB P!$8"QD &Pb p ą> j0aUjB?f@ ۨ>Š@#L1-nhH$ %j] 0!F ̠CJXDk]`@;mondrian-3.11.0.1-R/src/main/mondrian/gui/resources/cube24.gif000066400000000000000000000021301261646570300236420ustar00rootroot00000000000000GIF89a!!!!!!!!))!!))!)))))91))11)11B99)99199B99RB99BB1BB9BBRBBZJJ9JJcR99RRBRRRRRZRRkZJJZZRZZZZZccJJcRRcZZkkskksRRssRssZssss{{Z{{scckƜsss֥ޭ{{経ƔƔ֥֜ޥ,Hт@,6 REr$̻ 0VX!}G\ wAZpB.(;mondrian-3.11.0.1-R/src/main/mondrian/gui/resources/cubeGrant24.gif000066400000000000000000000020071261646570300246410ustar00rootroot00000000000000GIF89a%%///16,,;,177;@@4JB;BBBJJ^NNXUQ@[[KWWWOObQQc\\lYYpYYufNNe\\nPPjXXnXYr\\ccQii_mmZxx]kk`lll}``ppsurrvvp||u~~kkoowwyyyyffutyyct|ŘʵҞؠÖס! , HP 2b / #z DD &[4ač0J-P8_% h%ɂ h Z`AЍDd@#Z0TY(&`5 W_5Y^H(c WC woJPa14\Z& |<9h`~miʹa]6nˠg[;;mondrian-3.11.0.1-R/src/main/mondrian/gui/resources/dimension24.gif000066400000000000000000000016471261646570300247250ustar00rootroot00000000000000GIF89aBBB!,H \XP@ * bD/2̨cG|l8 #+yr%O_4yFbYrQ=cХK9F| 5ŌU Jp")ZR +lSʍ;mondrian-3.11.0.1-R/src/main/mondrian/gui/resources/dimensionGrant24.gif000066400000000000000000000016551261646570300257200ustar00rootroot00000000000000GIF89aBBBWWWlll! , H \hP!ÇB\@D*ZH*pX@#~d`2@ <2grT0̗ &P00A.$@B@` ҈ 8TVd p,R{Z6UT5Rݻ;mondrian-3.11.0.1-R/src/main/mondrian/gui/resources/dimensionUsage24.gif000066400000000000000000000017031261646570300257030ustar00rootroot00000000000000GIF89aBBB!,H \Xp *bD/2̨cG |lH@@ 2J+ `̚&iIpIj)hјHӡRO H`ScN8$&Qj,ҋW˖1ڵh*-h1e >l؁S\1 ;mondrian-3.11.0.1-R/src/main/mondrian/gui/resources/expression24.gif000066400000000000000000000016621261646570300251340ustar00rootroot00000000000000GIF87a  $$$((()))***+++---///444777888:::;;;===CCCEEEFFFJJJPPPSSSVVVYYYZZZ[[[]]]___aaaiiippprrrsssvvvwwwzzz{{{|||~~~̑Qxm=(3<<@@֎E<p=D _D,@ j2x`)Q`I` """###---...444555666777:::???LLLOOOTTTYYYuuuxxxzzz~~~!,H*\ȰÇ#JhA@ $j B2! "@qƄ7`K$p zQC& =h .`h(0@ ʰ`+QD-Bd lY,hݻxwa@;mondrian-3.11.0.1-R/src/main/mondrian/gui/resources/format24.gif000066400000000000000000000010641261646570300242210ustar00rootroot00000000000000GIF89aYh3g4p8n<$rf>g>! ,9:7=35;>11>6@/-@8@,+B7 A*(CMK&$D7IWS0E6FWXPQNVRULOPH JTG!"2) .< '~?%*\Q ;mondrian-3.11.0.1-R/src/main/mondrian/gui/resources/formula24.gif000066400000000000000000000015411261646570300243760ustar00rootroot00000000000000GIF87ax~`)Q~`~I~`~ *PL]~`:CP\orrgmaF liseT\rootsiSeNVi\ocvn_\bt_lispmels.o0̑Qxm=(3<@@֎E<p=D _D,@ j82x~`)Q~`~I~`~ """###---...444555666777:::???LLLOOOTTTYYYuuuxxxzzz~~~!,>H*\ȰÇ# @1D/ ̨EC^䨑ȏ%QTɎ0cʜIa@;mondrian-3.11.0.1-R/src/main/mondrian/gui/resources/gui.properties000066400000000000000000000074471261646570300250110ustar00rootroot00000000000000addCube=mondrian/gui/resources/addCube24.gif addDimension=mondrian/gui/resources/addDimension24.gif addMeasure=mondrian/gui/resources/addMeasure24.gif addLevel=mondrian/gui/resources/addLevel24.gif addProperty=mondrian/gui/resources/addProperty24.gif addCalculatedMemberProperty=mondrian/gui/resources/addCalculatedMemberProperty24.gif addDimensionUsage=mondrian/gui/resources/addDimensionUsage24.gif addHierarchy=mondrian/gui/resources/addHierarchy24.gif addNamedSet=mondrian/gui/resources/addNamedSet24.gif addUserDefinedFunction=mondrian/gui/resources/addUserDefinedFunction24.gif addCalculatedMember=mondrian/gui/resources/addCalculatedMember24.gif addRole=mondrian/gui/resources/addRole24.gif productIcon=mondrian/gui/resources/workbenchIcon_32.png cube=mondrian/gui/resources/cube24.gif column=mondrian/gui/resources/column24.gif calculatedMember=mondrian/gui/resources/calculatedMember24.gif dimension=mondrian/gui/resources/dimension24.gif dimensionUsage=mondrian/gui/resources/dimensionUsage24.gif expression=mondrian/gui/resources/expression24.gif script=mondrian/gui/resources/script24.gif format=mondrian/gui/resources/format24.gif expressionView=mondrian/gui/resources/expression24.gif hierarchy=mondrian/gui/resources/hierarchy24.gif join=mondrian/gui/resources/join24.gif table=mondrian/gui/resources/table24.gif level=mondrian/gui/resources/level24.gif measure=mondrian/gui/resources/measure24.gif namedSet=mondrian/gui/resources/namedSet24.gif formula=mondrian/gui/resources/formula24.gif property=mondrian/gui/resources/property24.gif parameter=mondrian/gui/resources/parameter24.gif schema=mondrian/gui/resources/schema24.gif userDefinedFunction=mondrian/gui/resources/userDefinedFunction24.gif role=mondrian/gui/resources/role24.gif schemaGrant=mondrian/gui/resources/schemaGrant24.gif cubeGrant=mondrian/gui/resources/cubeGrant24.gif dimensionGrant=mondrian/gui/resources/dimensionGrant24.gif hierarchyGrant=mondrian/gui/resources/hierarchyGrant24.gif memberGrant=mondrian/gui/resources/memberGrant24.gif annotations=mondrian/gui/resources/annotations24.gif annotation=mondrian/gui/resources/annotation24.gif aggTable=mondrian/gui/resources/aggTable24.gif aggForeignKey=mondrian/gui/resources/aggForeignKey24.gif aggIgnoreColumn=mondrian/gui/resources/aggIgnoreColumn24.gif aggLevel=mondrian/gui/resources/aggLevel24.gif aggMeasure=mondrian/gui/resources/aggMeasure24.gif aggPattern=mondrian/gui/resources/aggPattern24.gif aggExclude=mondrian/gui/resources/aggExclude24.gif virtualCube=mondrian/gui/resources/virtualCube24.gif virtualCubeDimension=mondrian/gui/resources/virtualCubeDimension24.gif virtualCubeMeasure=mondrian/gui/resources/virtualCubeMeasure24.gif addVirtualCube=mondrian/gui/resources/addVirtualCube24.gif addVirtualCubeDimension=mondrian/gui/resources/addVirtualCubeDimension24.gif addVirtualCubeMeasure=mondrian/gui/resources/addVirtualCubeMeasure24.gif nopic=mondrian/gui/resources/nopic24.gif delete=mondrian/gui/resources/delete24.gif database=mondrian/gui/resources/database24.gif sql=mondrian/gui/resources/sql24.gif key=mondrian/gui/resources/key24.gif parent=mondrian/gui/resources/person24.gif ordinal=mondrian/gui/resources/ordinal24.gif closure=mondrian/gui/resources/closure24.gif name=mondrian/gui/resources/name24.gif cut=/toolbarButtonGraphics/general/Cut24.gif copy=/toolbarButtonGraphics/general/Copy24.gif paste=/toolbarButtonGraphics/general/Paste24.gif delete=/toolbarButtonGraphics/general/Delete24.gif edit=/toolbarButtonGraphics/general/Edit24.gif database=/toolbarButtonGraphics/development/Server24.gif new=/toolbarButtonGraphics/general/New16.gif open=/toolbarButtonGraphics/general/Open16.gif save=/toolbarButtonGraphics/general/Save16.gif saveAs=/toolbarButtonGraphics/general/SaveAs16.gif preferences=/toolbarButtonGraphics/general/Preferences16.gif version=mondrian/gui/resources/schemaBuilder.html mondrian-3.11.0.1-R/src/main/mondrian/gui/resources/hierarchy24.gif000066400000000000000000000015771261646570300247200ustar00rootroot00000000000000GIF89aBBB!,\H*\Ȱ` BD(qhqBA^H2"Ŏ QtȒJ-S F65ԙC 9fP*]ʴӆ;mondrian-3.11.0.1-R/src/main/mondrian/gui/resources/hierarchyGrant24.gif000066400000000000000000000016271261646570300257100ustar00rootroot00000000000000GIF89aBBBWWWlll}}}! ,t H*$… *(`Ë+ thQ? +b8!HA&<1IHh91"E=ܹa9,ҢCeϏ zW@? bQa S`I-WR p忖 _ :LS(`ذ` #> H`U< rEb( R>"<ז1I$˅7c/փgE|kHq,8Y\l!N}̰Ө;mondrian-3.11.0.1-R/src/main/mondrian/gui/resources/key24.gif000066400000000000000000000016731261646570300235270ustar00rootroot00000000000000GIF89a,HA[ȰÇ B"Ć"@`#3.D  QQ\!IQ 1# ~DaFHҡC:teP5G&xjUԖ6,yQ&(+Uşl1 gQ, Q\}wÈ+^|1 ;mondrian-3.11.0.1-R/src/main/mondrian/gui/resources/level24.gif000066400000000000000000000016041261646570300240400ustar00rootroot00000000000000GIF89aBBB!,aH pÇ.bĄ)fhѢƏ5vŁRT)0e/[9L/qڬȇ %eQП$ӧPJ4 ;mondrian-3.11.0.1-R/src/main/mondrian/gui/resources/measure24.gif000066400000000000000000000016221261646570300243720ustar00rootroot00000000000000GIF89a!,oH*a:<Q@ĉ+(#7r1䀐Bu!:0%MU,ׁ -+6T^ɊKUvmʷ/€;mondrian-3.11.0.1-R/src/main/mondrian/gui/resources/name24.gif000066400000000000000000000016151261646570300236530ustar00rootroot00000000000000GIF89a9JZZ{ބc,rH\ Jb4r,XǐG`H@tA2RgM8ATy J(pq(ѥdU*ŃNjʵׯ`ÊE;mondrian-3.11.0.1-R/src/main/mondrian/gui/resources/namedSet24.gif000066400000000000000000000016401261646570300244710ustar00rootroot00000000000000GIF87a """###---...444555666777:::???LLLOOOTTTYYYuuuxxxzzz~~~BBB!,}H*\ȰÇ#J@x@ A #fr€ Tp@LH 5SB @@F"S/P`W 0ٳhӪ]a@;mondrian-3.11.0.1-R/src/main/mondrian/gui/resources/nopic24.gif000066400000000000000000000015501261646570300240410ustar00rootroot00000000000000GIF89a3f3333f333ff3fffff3f3f̙3f3333f3333333333f3333333f3f33ff3f3f3f3333f3333333f3̙333333f333ff3ffffff3f33f3ff3f3f3ffff3fffffffffff3fffffff3fff̙ffff3fffff3f̙3333f33̙3ff3ffff̙f3f̙3f̙̙3f̙3f3333f333ff3fffff̙̙3̙f̙̙̙3f̙3f3f3333f333ff3fffff3f3f̙3f!,E H*\ȰÇ#J$.]ŋ3b|g^: ? ѠƓ5ɒȉ0cʜI͛8s;mondrian-3.11.0.1-R/src/main/mondrian/gui/resources/ordinal24.gif000066400000000000000000000016661261646570300243710ustar00rootroot00000000000000GIF89acmx҂ԍח١۬ݶ,Hp>(P‡ >TĄ ^DHP 0q@R4త 4(P %MtN9HI@ 0AQG$]:  RPR \r T:XłhKlFⅨwݜ L;mondrian-3.11.0.1-R/src/main/mondrian/gui/resources/parameter24.gif000066400000000000000000000015461261646570300247160ustar00rootroot00000000000000GIF87ax~`)Q~`~I~`~ *PL]~`:CP\orrgmaF liseT\rootsiSeNVi\ocvn_\bt_lispmels.o0̑Qxm=(3<@@֎E<p=D _D,@ j82x~`)Q~`~I~`~ """###---...444555666777:::???LLLOOOTTTYYYuuuxxxzzz~~~!,CH*\ȰÇ#@bĊ%Rb=N cǒ58%H#OœI͛8;mondrian-3.11.0.1-R/src/main/mondrian/gui/resources/person24.gif000066400000000000000000000017341261646570300242430ustar00rootroot00000000000000GIF89a!!!"""%%%&&&---///444555666BBBEEEFFFIIIJJJKKKMMMNNNPPPSSSTTTVVVWWWXXXYYYZZZ[[[\\\]]]```aaabbbcccggghhhiiilllmmmnnnoootttyyyzzz}}},H#p C0(8Bƅ JCxhq 1H$% %2/_qL!ҥ\t "U9E0IBd@^H  z @J:`P+Ѐ fC (;#ɑ*;b 7rXBCv #!CMӨ ;mondrian-3.11.0.1-R/src/main/mondrian/gui/resources/property24.gif000066400000000000000000000015531261646570300246200ustar00rootroot00000000000000GIF89aBBB!,HH*\ȰÇ#J<D @b 9B2dG$K|rH.#V

Schema Workbench


Product Version : PRODUCT_VERSION

New Features : Access Control, Aggregate Tables

Java : 1.5 and above

License: EPL

© COPYRIGHT_YEAR Pentaho Corporation. All rights reserved.

mondrian-3.11.0.1-R/src/main/mondrian/gui/resources/schemaGrant24.gif000066400000000000000000000017131261646570300251660ustar00rootroot00000000000000GIF89aBBBWWW___lll! , H(\! $H@@CDxE h8Qŏ<( @N͛d~f9Q4ࠧ&SY`S1 PFZZ׭RЩlJT80Lk1ZD4Ke;ҿ:e{2Id0cj#K.;mondrian-3.11.0.1-R/src/main/mondrian/gui/resources/script24.gif000066400000000000000000000012271261646570300242360ustar00rootroot00000000000000GIF89ai>>>???BBBCCCDDDFFFGGGJJJNNNXXXYYYZZZaaafffhhhiiijjjnnnooopppuuuvvvwwwxxxyyyzzz{{{|||! ,"ILKJ$1ddcb4 gh[C T`ab^M% > schemaPropertyCellEditor.allTables=<< All Tables >> schemaPropertyCellEditor.factTables=<< Fact Tables >> schemaPropertyCellEditor.dimensionTables=<< Dimension Tables >> schemaPropertyCellEditor.foreignKeys=<< Foreign keys >> schemaPropertyCellRenderer.join=Join schemaPropertyCellRenderer.table=Table schemaPropertyCellRenderer.selectJoinObject=Select the Join/Table object from Schema tree to edit. schemaTreeCellRenderer.join.title={0}Join schemaTreeCellRenderer.table.title={0}Table: {1} schemaTreeCellRenderer.view.title=View schemaTreeCellRenderer.nameMustBeSet.alert=Name must be set schemaTreeCellRenderer.factNameMustBeSet.alert=Fact name must be set schemaTreeCellRenderer.sourceMustBeSet.alert=Source must be set schemaTreeCellRenderer.columnMustBeSet.alert=Column must be set schemaTreeCellRenderer.tableMustBeSet.alert=Table must be set schemaTreeCellRenderer.factTableDoesNotExist.alert=Fact table {0} does not exist in database {1} schemaTreeCellRenderer.sourceInSharedDimensionDoesNotExist.alert=Source {0} does not exist as Shared Dimension of Schema schemaTreeCellRenderer.foreignKeyDoesNotExist.alert=foreignKey {0} does not exist in fact table schemaTreeCellRenderer.levelUsedOnlyInTimeDimension.alert=levelType {0} can only be used with a TimeDimension schemaTreeCellRenderer.levelUsedOnlyInStandardDimension.alert=levelType {0} can only be used with a StandardDimension schemaTreeCellRenderer.degenDimensionColumnDoesNotExist.alert=Degenerate dimension validation check - Column {0} does not exist in fact table schemaTreeCellRenderer.columnInDimensionDoesNotExist.alert=Column {0} does not exist in Dimension table schemaTreeCellRenderer.columnInTableDoesNotExist.alert=Column {0} defined in field {1} does not exist in table {2} schemaTreeCellRenderer.columnInDimensionDoesNotExist.alert=Column {0} does not exist in Level table {1} schemaTreeCellRenderer.aggregatorMustBeSet.alert=Aggregator must be set schemaTreeCellRenderer.aggregatorNotValidForColumn.alert=Aggregator {0} is not valid for the data type of the column {1} schemaTreeCellRenderer.formulaMustBeSet.alert=Formula must be set schemaTreeCellRenderer.classNameMustBeSet.alert=Class name must be set schemaTreeCellRenderer.dimensionMustBeSet.alert=Dimension must be set schemaTreeCellRenderer.leftKeyMustBeSet.alert=Left key must be set schemaTreeCellRenderer.rightKeyMustBeSet.alert=Right key must be set schemaTreeCellRenderer.foreignKeyMustBeSet.alert=Foreign key must be set schemaTreeCellRenderer.primaryKeyTableAndPrimaryKeyMustBeSet.alert=PrimaryKeyTable and PrimaryKey must be set for Join schemaTreeCellRenderer.primaryKeyTableMustBeSet.alert=PrimaryKeyTable must be set for Join schemaTreeCellRenderer.atLeastOneLevelForHierarchy.alert=At least one Level must be set for Hierarchy schemaTreeCellRenderer.primaryKeyMustBeSet.alert=PrimaryKey must be set for Join schemaTreeCellRenderer.childErrorMessageWithName.alert={0} {1} is invalid schemaTreeCellRenderer.childErrorExceptionMessage.alert={0} is invalid schemaTreeCellRenderer.wrongTableValue=Table value does not correspond to any join schemaTreeCellRenderer.fieldMustBeEmpty=Table field must be empty schemaTreeCellRenderer.noTableForView=Table for column cannot be set in View schemaTreeCellRenderer.tableDoesNotExist.alert=Table {0} does not exist in database schemaTreeCellRenderer.tableDoesNotMatch=Table value does not correspond to Hierarchy Relation schemaTreeCellRenderer.schemaMustBeSet.alert=Schema must be set schemaTreeCellRenderer.schemaDoesNotExist.alert=Schema {0} does not exist schemaTreeCellRenderer.cubeMustHaveDimensions.alert=Cube must contain dimensions schemaTreeCellRenderer.cubeMustHaveMeasures.alert=Cube must contain measures queryPanel.connect.title=Connect queryPanel.execute.title=Execute queryPanel.noConnection.alert=No Mondrian connection. Select a Schema to connect queryPanel.schemaNotOpen.alert=Schema file is not open queryPanel.saveSchemaFirst.alert=You must first save the Schema to open a Mondrian connection queryPanel.successfulConnection.internalFrame.title=MDX Query - connected to {0} queryPanel.successfulConnection.menuItem={0} MDX - {1} queryPanel.unsuccessfulConnection.alert=Mondrian connection could not be done for - {0} queryPanel.selectedSchema.alert=selected Schema queryPanel.unsuccessfulConnection.exception=Mondrian connection could not be done for - {0} queryPanel.exceptionMessage=Exception: {0}\n\nSee workbench log for full stacktrace. preferences.pane.title=Database Connection preferences.selectSchemasButton.title=Select Schemas preferences.driverClassName.title=Driver Class Name preferences.connectionURL.title=Connection URL preferences.userName.title=User name preferences.password.title=Password preferences.schema.title=Schema (Optional, comma separated) preferences.requireschema.title=Require Schema Attributes preferences.jdbcPanel.title=JDBC preferences.testButton.title=Test Connection preferences.selectSchemastButton.title=Select Schemas preferences.successfulTestConnection.alert=Database Connection successful preferences.unsuccessfulTestConnection.alert=Database Connection could not be done. Please re-check the connection details.\n{0} preferences.noSchemas.butSchemasEntered.alert=No schemas available for this database connection, but schemas entered preferences.noSchemas.butSchemasRequired.alert=No schemas available for this database connection, , but schemas are required preferences.invalidSchemas.alert=The following entered schemas are invalid.\n{0} preferences.acceptButton.title=Accept preferences.cancelButton.title=Cancel jdbcMetaData.blank.exceptionDriver={0}\nConnection URL={1}\nUse Preferences to set Database Connection parameters first and then open a Schema jdbcExplorer.root.name=All Schemas jdbcExplorer.default.name.catalog=Default Schema jdbcExplorer.default.name.table=Table jdbcExplorer.default.name.column=Column mondrian-3.11.0.1-R/src/main/mondrian/gui/resources/text_ja.properties000066400000000000000000000436111261646570300256540ustar00rootroot00000000000000 common.column.title=\u30ab\u30e9\u30e0 common.cube.title=\u30ad\u30e5\u30fc\u30d6 common.role.title=\u30ed\u30fc\u30eb common.schemaGrant.title=Schema Grant common.cubeGrant.title=Cube Grant common.dimensionGrant.title=Dimension Grant common.hierarchyGrant.title=Hierarchy Grant common.memberGrant.title=Member Grant common.dimension.title=Dimension common.dimensionUsage.title=Dimension Usage common.expressionView.title=Expression View common.keyExpression.title=Key Expression common.nameExpression.title=Name Expression common.ordinalExpression.title=Ordinal Expression common.parentExpression.title=Parent Expression common.measureExpression.title=Measure Expression common.hierarchy.title=Hierarchy common.join.title=Join common.level.title=Level common.measure.title=Measure common.calculatedMember.title=Calculated Member common.calculatedMemberProperty.title=Calculated Member Property common.namedSet.title=Named Set common.userDefinedFunction.title=User Defined Function common.parameter.title=Parameter common.property.title=Property common.schema.title=Schema common.sql.title=SQL common.table.title=Table common.closure.title=Closure common.leftJoin.title=Left : Join common.rightJoin.title=Right : Join common.left.title=Left common.right.title=Right common.aggName.title=Aggregate Name common.aggIgnoreColumn.title=Aggregate Ignore Column common.aggForeignKey.title=Aggregate Foreign Key common.aggMeasure.title=Aggregate Measure common.aggLevel.title=Aggregate Level common.aggPattern.title=Aggregate Pattern common.aggExclude.title=Aggregate Exclude common.aggFactCount.title=Aggregate Fact Count common.view.title=View common.virtualCube.title=Virtual Cube common.virtualCubeDimension.title=Virtual Cube Dimension common.virtualCubeMeasure.title=Virtual Cube Measure common.unknownType.title=Unknown Type common.alertDialog.title=\u8b66\u544a common.errorDialog.title=\u30a8\u30e9\u30fc common.informationDialog.title=\u30a4\u30f3\u30d5\u30a9\u30e1\u30fc\u30b7\u30e7\u30f3 workbench.user.home.not.directory={0} is not a directory!\nPlease rename this file and retry to save configuration! workbench.user.home.exception=An error is occurred creating workbench configuration directory:\n{0}\nError is: {1} workbench.save.configuration=An error is occurred creating workbench configuration file:\n{0}\nError is: {1} workbench.panel.title=Schema Workbench workbench.menu.newSchema=\u30b9\u30ad\u30fc\u30de workbench.menu.newQuery=MDX\u30af\u30a8\u30ea workbench.menu.newJDBC=JDBC\u30a8\u30af\u30b9\u30d7\u30ed\u30fc\u30e9 workbench.menu.file=\u30d5\u30a1\u30a4\u30eb workbench.menu.new=\u65b0\u898f\u4f5c\u6210 workbench.menu.open=\u958b\u304f workbench.menu.save=\u4fdd\u5b58 workbench.menu.saveAsDot=\u540d\u524d\u3092\u3064\u3051\u3066\u4fdd\u5b58 workbench.menu.exit=\u7d42\u4e86 workbench.menu.edit=\u7de8\u96c6 workbench.menu.cut=\u5207\u308a\u53d6\u308a workbench.menu.copy=\u30b3\u30d4\u30fc workbench.menu.paste=\u8cbc\u308a\u4ed8\u3051 workbench.menu.delete=\u524a\u9664 workbench.menu.view=\u30d3\u30e5\u30fc workbench.menu.viewXML=XML\u30d3\u30e5\u30fc workbench.menu.tools=\u30c4\u30fc\u30eb workbench.menu.connection=\u521d\u671f\u8a2d\u5b9a workbench.menu.windows=\u8868\u793a workbench.menu.cascadeWindows=\u91cd\u306d\u3066\u8868\u793a workbench.menu.tileWindows=\u4e26\u3079\u3066\u8868\u793a workbench.menu.closeAll=\u5168\u3066\u9589\u3058\u308b workbench.menu.minimizeAll=\u5168\u3066\u6700\u5c11\u5316 workbench.menu.maximizeAll=\u5168\u3066\u6700\u5927\u5316 workbench.menu.about=\u30b9\u30ad\u30fc\u30de\u30ef\u30fc\u30af\u30d9\u30f3\u30c1\u306b\u3064\u3044\u3066 workbench.menu.help=\u30d8\u30eb\u30d7 workbench.toolbar.new=\u65b0\u898f\u4f5c\u6210 workbench.toolbar.newArrow=\u65b0\u898f\u4f5c\u6210 workbench.toolbar.open=\u958b\u304f workbench.toolbar.save=\u4fdd\u5b58 workbench.toolbar.saveAs=\u540d\u524d\u3092\u4ed8\u3051\u3066\u4fdd\u5b58 workbench.toolbar.preferences=\u521d\u671f\u8a2d\u5b9a workbench.tooltip.error=No help available for {0} workbench.saveSchemaOnClose.alert=Save changes to {0}? workbench.saveSchemaOnClose.title=Save Schema workbench.new.JDBCExplorer.title=JDBC\u30a8\u30af\u30b9\u30d7\u30ed\u30fc\u30e9\u30fc - {0} workbench.new.JDBCExplorer.menuitem={0} JDBCJDBC\u30a8\u30af\u30b9\u30d7\u30ed\u30fc\u30e9\u30fc workbench.new.JDBCExplorer.exception=JDBC\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u63a5\u7d9a\u306b\u5931\u6557\u3057\u307e\u3057\u305f\u3002\n{0} workbench.new.JDBCExplorer.exception.title=\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u63a5\u7d9a\u5931\u6557 workbench.new.MDXQuery.title=MDX\u30af\u30a8\u30ea workbench.new.MDXQuery.menuitem={0} MDX workbench.new.MDXQuery.no.selection=\u63a5\u7d9a\u304c\u3042\u308a\u307e\u305b\u3093\u3002\u63a5\u7d9a\u3059\u308b\u30b9\u30ad\u30fc\u30de\u3092\u9078\u629e\u3057\u3066\u304f\u3060\u3055\u3044\u3002 workbench.new.MDXQuery.no.selection.title=\u8b66\u544a workbench.saveAs.schema.confirm={0} \u30d5\u30a1\u30a4\u30eb\u306f\u65e2\u306b\u5b58\u5728\u3057\u307e\u3059\u3002\u4e0a\u66f8\u304d\u3057\u307e\u3059\u304b\uff1f workbench.saveAs.schema.confirm.title=\u540d\u524d\u3092\u4ed8\u3051\u3066\u4fdd\u5b58 workbench.open.schema.not.found={0} \u30b9\u30ad\u30fc\u30de\u30d5\u30a1\u30a4\u30eb\u304c\u898b\u3064\u304b\u308a\u307e\u305b\u3093\u3002 workbench.open.schema.not.found.title=\u8b66\u544a workbench.open.schema.not.writeable={0} \u30b9\u30ad\u30fc\u30de\u30d5\u30a1\u30a4\u30eb\u306b\u66f8\u304d\u8fbc\u3081\u307e\u305b\u3093\u3002 workbench.open.schema.not.writeable.title=\u8b66\u544a workbench.open.schema.title=\u30b9\u30ad\u30fc\u30de - {0} workbench.open.schema.error=\u30b9\u30ad\u30fc\u30de\u3092\u958b\u3051\u307e\u305b\u3093 - {0}. workbench.open.schema.error.title=\u30a8\u30e9\u30fc workbench.open.schema.jdbc.error=\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306b\u63a5\u7d9a\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002\n{0}\n\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306b\u95a2\u3059\u308b\u3059\u3079\u3066\u306e\u9805\u76ee\u306f\u7121\u8996\u3055\u308c\u307e\u3059\u3002 workbench.open.schema.jdbc.error.title=\u8b66\u544a workbench.open.schema.file.type=Mondrian Schema files (*.xml) schemaExplorer.database.text=\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9 - {0} ({1}) schemaExplorer.parsing.error=Parsing Error: Could not open file {0}\n{1} schemaExplorer.hierarchy.select.title=Select Join or Table Hierarchy schemaExplorer.hierarchy.select.join=Join schemaExplorer.hierarchy.select.table=Table schemaExplorer.hierarchy.toggle=Double click to display Join/Table selection schemaExplorer.propertyTable.attribute=\u5c5e\u6027 schemaExplorer.propertyTable.value=\u5024 schemaExplorer.targetLabel.title=\u30b9\u30ad\u30fc\u30de schemaExplorer.arrowButtonUp.toolTip=\u89aa\u5c5e\u6027\u3078\u79fb\u52d5 schemaExplorer.arrowButtonDown.toolTip=\u5b50\u5c5e\u6027\u3078\u79fb\u52d5 schemaExplorer.arrowButtonUp.title=Arrow button up schemaExplorer.arrowButtonDown.title=Arrow button down schemaExplorer.addCube.title=\u30ad\u30e5\u30fc\u30d6\u8ffd\u52a0 schemaExplorer.addDimension.title=\u30c7\u30a3\u30e1\u30f3\u30b8\u30e7\u30f3\u8ffd\u52a0 schemaExplorer.addDimensionUsage.title=\u5171\u6709\u30c7\u30a3\u30e1\u30f3\u30b8\u30e7\u30f3\u8ffd\u52a0 schemaExplorer.addHierarchy.title=\u30d2\u30a8\u30e9\u30eb\u30ad\u30fc\u8ffd\u52a0 schemaExplorer.addNamedSet.title=Named Set\u8ffd\u52a0 schemaExplorer.addMeasure.title=\u30e1\u30b8\u30e3\u30fc\u8ffd\u52a0 schemaExplorer.addCalculatedMember.title=Calculated Member\u8ffd\u52a0 schemaExplorer.addUserDefinedFunction.title=\u30e6\u30fc\u30b6\u5b9a\u7fa9\u95a2\u6570\u8ffd\u52a0 schemaExplorer.addRole.title=\u30ed\u30fc\u30eb\u8ffd\u52a0 schemaExplorer.addSchemaGrant.title=Add Schema Grant schemaExplorer.addCubeGrant.title=Add Cube Grant schemaExplorer.addDimensionGrant.title=Add Dimension Grant schemaExplorer.addHierarchyGrant.title=Add Hierarchy Grant schemaExplorer.addMemberGrant.title=Add Member Grant schemaExplorer.addLevel.title=\u30ec\u30d9\u30eb\u8ffd\u52a0 schemaExplorer.addClosure.title=Add Closure schemaExplorer.addKeyExpression.title=Add Key Expression schemaExplorer.addNameExpression.title=Add Name Expression schemaExplorer.addOrdinalExpression.title=Add Ordinal Expression schemaExplorer.addParentExpression.title=Add Parent Expression schemaExplorer.addMeasureExpression.title=Add Measure Expression schemaExplorer.addSQL.title=SQL\u8ffd\u52a0 schemaExplorer.addRelation.title=\u30ea\u30ec\u30fc\u30b7\u30e7\u30f3\u8ffd\u52a0 schemaExplorer.addProperty.title=\u30d7\u30ed\u30d1\u30c6\u30a3\u8ffd\u52a0 schemaExplorer.addVirtualCube.title=\u4eee\u60f3\u30ad\u30e5\u30fc\u30d6\u8ffd\u52a0 schemaExplorer.addVirtualCubeDimension.title=\u4eee\u60f3\u30ad\u30e5\u30fc\u30d6\u30c7\u30a3\u30e1\u30f3\u30b8\u30e7\u30f3\u8ffd\u52a0 schemaExplorer.addVirtualCubeMeasure.title=Add Virtual Cube Measure schemaExplorer.addAggregatePattern.title=Add Aggregate Pattern schemaExplorer.addAggregateExcludeTable.title=Add Aggregate Exclude Table schemaExplorer.addAggregateName.title=Add Aggregate Name schemaExplorer.addAggregateIgnoreColumn.title=Add Aggregate Ignore Column schemaExplorer.addAggregateForeignKey.title=Add Aggregate Foreign Key schemaExplorer.addAggregateMeasure.title=Add Aggregate Measure schemaExplorer.addAggregateLevel.title=Add Aggregate Level schemaExplorer.addAggregateFactCount.title=Add Aggregate Fact Count schemaExplorer.actionDelete.title=\u524a\u9664 schemaExplorer.actionEdit.title=\u7de8\u96c6 schemaExplorer.actionCut.title=\u5207\u308a\u53d6\u308a schemaExplorer.actionCopy.title=\u30b3\u30d4\u30fc schemaExplorer.actionPaste.title=\u8cbc\u308a\u4ed8\u3051 schemaExplorer.newCube.title=New Cube schemaExplorer.newRole.title=New Role schemaExplorer.newVirtualCube.title=New Virtual Cube schemaExplorer.newUserDefinedFunction.title=New User defined Function schemaExplorer.newMeasure.title=New Measure schemaExplorer.newVirtualCube.title=New Virtual Cube schemaExplorer.newVirtualMeasure.title=New Virtual Measure schemaExplorer.newCalculatedMember.title=New Calculated Member schemaExplorer.newDimension.title=New Dimension schemaExplorer.newVirtualDimension.title=New Virtual Dimension schemaExplorer.newNamedSet.title=New Named Set schemaExplorer.newDimensionUsage.title=New Dimension Usage schemaExplorer.newLevel.title=New Level schemaExplorer.newHierarchy.title=New Hierarchy schemaExplorer.newProperty.title=New Property schemaExplorer.newHierarchyInTree.title=New Hierarchy 0 schemaExplorer.cubeNotSelected.alert=Cube not selected. schemaExplorer.alert.title=Alert schemaExplorer.cubeFactTableNotSelected.alert=Cube Fact Table not selected. schemaExplorer.tableNotSelected.alert=Table not selected. schemaExplorer.cubeFactTableOrAggPatternNotSelected.alert=Cube Fact Table or Aggregate Pattern not selected. schemaExplorer.aggregateTableNotSelected.alert=Aggregate Table not selected. schemaExplorer.aggregateTableOrAggPatternNotSelected.alert=Aggregate Table or Aggregate Pattern not selected. schemaExplorer.cubeOrVirtualCubeNotSelected.alert=Cube or Virtual Cube not selected. schemaExplorer.virtualCubeNotSelected.alert=Virtual Cube not selected. schemaExplorer.objectToDeleteNotSelected.alert=Object to delete in Schema not selected. schemaExplorer.cantDeleteObject.alert=Schema object cannot be deleted. schemaExplorer.cubeOrSchemaNotSelected.alert=Cube or Schema not selected. schemaExplorer.cubeNotSelected.alert=Cube not selected. schemaExplorer.roleNotSelected.alert=Role not selected. schemaExplorer.schemaGrantNotSelected.alert=Schema Grant not selected. schemaExplorer.cubeGrantNotSelected.alert=Cube Grant not selected. schemaExplorer.hierarchyGrantNotSelected.alert=Hierarchy Grant not selected. schemaExplorer.hierarchyNotSelected.alert=Hierarchy not selected. schemaExplorer.expressionNotSelected.alert=Expression not selected. schemaExplorer.levelNotSelected.alert=Level not selected. schemaExplorer.measureNotSelected.alert=Measure not selected. schemaExplorer.dimensionNotSelected.alert=Dimension not selected. schemaExplorer.sharedDimension.title=Shared Dimension schemaExplorer.dimensionElementParent.title=Dimension for {0} {1} schemaExplorer.dimensionUsageForElement.title=Dimension Usage for {0} {1} schemaExplorer.hierarchyElementParent.title=Hierarchy for {0} {1} schemaExplorer.generalJoinForElement.title=Join for {0} {1} schemaExplorer.levelForElement.title=Level for {0} {1} schemaExplorer.measureForElement.title=Measure for {0} {1} schemaExplorer.calculatedMemberForElement.title=Calculated Member for {0} {1} schemaExplorer.namedSetForElement.title=Named Set for {0} {1} schemaExplorer.userDefinedFunctionForElement.title=User Defined Function for {0} {1} schemaExplorer.tableForElement.title=Table for {0} {1} schemaExplorer.roleElementParent.title=Role for {0} {1} schemaExplorer.virtualCubeElementParent.title=Virtual Cube for {0} {1} schemaExplorer.frame.title=Schema - {0} ({1}){2} propertyTableModel.attribute=Attribute propertyTableModel.value=Value propertyTableModel.unknown=? propertyTableModel.duplicateValue.error=Error setting name property. {0} already exists schemaPropertyCellEditor.noSelection=-- No Selection -- schemaPropertyCellEditor.join=Join schemaPropertyCellEditor.table=Table schemaPropertyCellEditor.allColumns=<< All Columns >> schemaPropertyCellEditor.allTables=<< All Tables >> schemaPropertyCellEditor.factTables=<< Fact Tables >> schemaPropertyCellEditor.dimensionTables=<< Dimension Tables >> schemaPropertyCellEditor.foreignKeys=<< Foreign keys >> schemaPropertyCellRenderer.join=Join schemaPropertyCellRenderer.table=Table schemaPropertyCellRenderer.selectJoinObject=Select the Join/Table object from Schema tree to edit. schemaTreeCellRenderer.join.title={0} : Join schemaTreeCellRenderer.table.title={0}Table: {1} schemaTreeCellRenderer.nameMustBeSet.alert=Name must be set schemaTreeCellRenderer.factNameMustBeSet.alert=Fact name must be set schemaTreeCellRenderer.sourceMustBeSet.alert=Source must be set schemaTreeCellRenderer.columnMustBeSet.alert=Column must be set schemaTreeCellRenderer.tableMustBeSet.alert=Table must be set schemaTreeCellRenderer.factTableDoesNotExist.alert=Fact table {0} does not exist in database {1} schemaTreeCellRenderer.sourceInSharedDimensionDoesNotExist.alert=Source {0} does not exist as Shared Dimension of Schema schemaTreeCellRenderer.foreignKeyDoesNotExist.alert=foreignKey {0} does not exist in fact table schemaTreeCellRenderer.levelUsedOnlyInTimeDimension.alert=levelType {0} can only be used with a TimeDimension schemaTreeCellRenderer.levelUsedOnlyInStandardDimension.alert=levelType {0} can only be used with a StandardDimension schemaTreeCellRenderer.degenDimensionColumnDoesNotExist.alert=Degenerate dimension validation check - Column {0} does not exist in fact table schemaTreeCellRenderer.columnInDimensionDoesNotExist.alert=Column {0} does not exist in Dimension table schemaTreeCellRenderer.columnInTableDoesNotExist.alert=Column {0} does not exist in table {1} schemaTreeCellRenderer.columnInDimensionDoesNotExist.alert=Column {0} does not exist in Level table {1} schemaTreeCellRenderer.aggregatorMustBeSet.alert=Aggregator must be set schemaTreeCellRenderer.aggregatorNotValidForColumn.alert=Aggregator {0} is not valid for the data type of the column {1} schemaTreeCellRenderer.formulaMustBeSet.alert=Formula must be set schemaTreeCellRenderer.classNameMustBeSet.alert=Class name must be set schemaTreeCellRenderer.dimensionMustBeSet.alert=Dimension must be set schemaTreeCellRenderer.leftKeyMustBeSet.alert=Left key must be set schemaTreeCellRenderer.rightKeyMustBeSet.alert=Right key must be set schemaTreeCellRenderer.foreignKeyMustBeSet.alert=Foreign key must be set schemaTreeCellRenderer.primaryKeyTableAndPrimaryKeyMustBeSet.alert=PrimaryKeyTable and PrimaryKey must be set for Join schemaTreeCellRenderer.primaryKeyTableMustBeSet.alert=PrimaryKeyTable must be set for Join schemaTreeCellRenderer.primaryKeyMustBeSet.alert=PrimaryKey must be set for Join schemaTreeCellRenderer.childErrorMessageWithName.alert={0} {1} is invalid schemaTreeCellRenderer.childErrorExceptionMessage.alert={0} is invalid schemaTreeCellRenderer.wrongTableValue=Table value does not correspond to any join schemaTreeCellRenderer.fieldMustBeEmpty=Table field must be empty schemaTreeCellRenderer.tableDoesNotExist.alert=Table {0} does not exist in database schemaTreeCellRenderer.tableDoesNotMatch=Table value does not correspond to Hierarchy Relation schemaTreeCellRenderer.schemaMustBeSet.alert=Schema must be set schemaTreeCellRenderer.schemaDoesNotExist.alert=Schema {0} does not exist queryPanel.connect.title=\u63a5\u7d9a queryPanel.execute.title=\u5b9f\u884c queryPanel.noConnection.alert=\u63a5\u7d9a\u304c\u3042\u308a\u307e\u305b\u3093\u3002\u63a5\u7d9a\u3059\u308b\u30b9\u30ad\u30fc\u30de\u3092\u9078\u629e\u3057\u3066\u304f\u3060\u3055\u3044\u3002 queryPanel.schemaNotOpen.alert=\u30b9\u30ad\u30fc\u30de\u30d5\u30a1\u30a4\u30eb\u3092\u958b\u3051\u307e\u305b\u3093 queryPanel.saveSchemaFirst.alert=\u63a5\u7d9a\u3059\u308b\u305f\u3081\u306b\u30b9\u30ad\u30fc\u30de\u3092\u4fdd\u5b58\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002 queryPanel.successfulConnection.internalFrame.title=MDX Query - \u63a5\u7d9a\u4e2d {0} queryPanel.successfulConnection.menuItem={0} MDX - {1} queryPanel.unsuccessfulConnection.alert={0}\u306b\u63a5\u7d9a\u3067\u304d\u307e\u305b\u3093 queryPanel.selectedSchema.alert=\u9078\u629e\u3055\u308c\u305f\u30b9\u30ad\u30fc\u30de queryPanel.unsuccessfulConnection.exception={0}\u306b\u63a5\u7d9a\u3067\u304d\u307e\u305b\u3093 preferences.pane.title=\u30ef\u30fc\u30af\u30d9\u30f3\u30c1\u521d\u671f\u8a2d\u5b9a preferences.driverClassName.title=\u30c9\u30e9\u30a4\u30d0\u30af\u30e9\u30b9\u540d preferences.connectionURL.title=\u63a5\u7d9aURL preferences.userName.title=\u30e6\u30fc\u30b6\u30fc\u540d preferences.password.title=\u30d1\u30b9\u30ef\u30fc\u30c9 preferences.schema.title=\u30b9\u30ad\u30fc\u30de\uff08\u4efb\u610f\uff09 preferences.requireschema.title=\u30b9\u30ad\u30fc\u30de\u5c5e\u6027\u3092\u5fc5\u8981\u3068\u3059\u308b preferences.jdbcPanel.title=JDBC preferences.acceptButton.title=OK preferences.cancelButton.title=Cancel jdbcMetaData.blank.exceptionDriver={0}\nConnection URL={1}\nUse Preferences to set Database Connection parameters first and then open a Schema mondrian-3.11.0.1-R/src/main/mondrian/gui/resources/userDefinedFunction24.gif000066400000000000000000000016571261646570300267040ustar00rootroot00000000000000GIF87a &&&---333777===IIILLLPPPSSSXXXYYYaaabbbnnnyyyzzz~~~ """###---...444555666777???BBBLLLOOOTTTYYYuuuxxxzzz~~~!,H*\ȰÇ#B``: hF EN8ҠI)SѲˌ(? D@!` xiK!@͂"@BF6P h(m$ʝKݻx ;mondrian-3.11.0.1-R/src/main/mondrian/gui/resources/virtualCube24.gif000066400000000000000000000020511261646570300252130ustar00rootroot00000000000000GIF89a3f3333f333ff3fffff3f3f̙3f3333f3333333333f3333333f3f33ff3f3f3f3333f3333333f3̙333333f333ff3ffffff3f33f3ff3f3f3ffff3fffffffffff3fffffff3fff̙ffff3fffff3f̙3333f33̙3ff3ffff̙f3f̙3f̙̙3f̙3f3333f333ff3fffff̙̙3̙f̙̙̙3f̙3f3f3333f333ff3fffff3f3f̙3f!,H@S"RcTMĊKʟI".lH UiŜjT bDsɓ\8#)d*% Dg ?QAqΔKP#ə}hOׂSWU#qJ*)S6'A?SɕQ}ըLi? ޼#ĉ\ɔ+㻜9Ū=+ XgDUQnf7!G?;U܌#NEy2>R3k5W?`rG!O<;mondrian-3.11.0.1-R/src/main/mondrian/gui/resources/virtualCubeDimension24.gif000066400000000000000000000016371261646570300270720ustar00rootroot00000000000000GIF89aBBB,H \XP@ * bD/2̨cG|l8 #+yr%O_4yFbYrQ=cХK9F| 5ŌU Jp")ZR +lSʍ;mondrian-3.11.0.1-R/src/main/mondrian/gui/resources/virtualCubeMeasure24.gif000066400000000000000000000016121261646570300265370ustar00rootroot00000000000000GIF89a,oH*a:<Q@ĉ+(#7r1䀐BArJ{*ܶEp?kQZקCn13-P^wp1wr@_{45>:1W9*?Av⎷vjфo\el= 4}kX|nlo#68RFKUUTeqsۺ}ٵ;bcO ۮZ_u(߰cߖ*yVNE㌏ ɱ}jjMԫaĸ.SlSe(>y[}wjcf>)FY4>5UUZE@t' KF)R"QF_Kf.w }yLJRԷt~?~Dn~FeH6PRw!*JDDpoPTA wz[ҝkwc,}OB d8މak\LG\oQUedx0Ct?xz=@wF6iC@&݁HU]s:T_͙kɁ0*km(Sql8}ՊTta3+(}ܝ ,JeeQc*bAViPjnPŒ*K,,J%u~UDmk`=vTf[F0bsGmnidYv4ltTDjyF9=uծ4C4Q#3L\~$WJlH_0Vp(p9<"L<4)*" aX[dLE7g-ܻU5]KXa~ BTDpDxTE֪*"0Vξx3TիWpOhurފ!1X}[ם]c>x*1fUOFA~ȖBp!(J }ʖG7eц3H;?{aO'_cf`f\#qֲ8*5zh4 <C03CE,(y5 E&NR_DO|s&$LCkKv᯾TJ=eNr(x(SW{pK2,z(ȼ;wC!1me1V[R̬9`a-4$tON{Jn<|'l^u4p#@{!!hGV#nm-$ITuH5,D_f/%ѩUkYX41siQv9wd7 w,Gk/
1J ֭n^+x/w?2y;N[NLZpPҠHmm%GdF2^>L_|9~Œ1xN4&gǯmߕ*2\CHy17Vs^1+X4sic|RTk}W(3N<>֟o| na v5rW*W! 1YhJ_:A[1SG,fy:a/z/Gw=}lΝ=֋o1_)Q _ozs'eyEG+5O2˷;,0)/'K<nɋx쏞>ĉ㵷<*9qC1M `g\*tEsV'RJNݼf2y ?[ _9?w{IENDB`mondrian-3.11.0.1-R/src/main/mondrian/gui/resources/workbenchInfo.properties000066400000000000000000000344251261646570300270170ustar00rootroot00000000000000Schema,name=Name of this schema Schema,measuresCaption=Label for the measures dimension.
Can be localized from Properties file using #{propertyname}. Schema,defaultRole=The name of the default role for connections to this schema CubeDimension,caption=A string being displayed instead of the Dimension's name.
Can be localized from Properties file using #{propertyname}. CubeDimension,foreignKey=The name of the column in the fact table which joins
to the leaf level of this dimension. Required in a
private Dimension or a DimensionUsage, but not in a
public Dimension. Cube,name=Name of this cube. Cube,caption=A string being displayed instead of the cube's name.
Can be localized from Properties file using #{propertyname}. Cube,cache=Should the Fact table data for this Cube be cached
by Mondrian or not. The default action is to cache
the data. Cube,enabled=Whether element is enabled - if true, then the Cube is
realized otherwise it is ignored. Cube,fact=The fact table is the source of all measures in this cube.
If this is a Table and the schema name is not
present, table name is left unqualified. VirtualCube,enabled=Whether this element is enabled - if true, then the Virtual
Cube is realized otherwise it is ignored. VirtualCube,name=Name of this virtual cube. VirtualCube,caption=A string being displayed instead of the cube's name.
Can be localized from Properties file using #{propertyname}. VirtualCubeDimension,cubeName=Name of the cube which the dimension belongs to, or
unspecified if the dimension is shared. VirtualCubeDimension,name=Name of the dimension. VirtualCubeMeasure,cubeName=Name of the cube which the measure belongs to. VirtualCubeMeasure,name=Unique name of the measure within its cube. VirtualCubeMeasure,visible=Whether this member is visible in the user-interface.
Default true. DimensionUsage,source=Name of the source dimension. Must be a dimension in
this schema. Case-sensitive. DimensionUsage,level=Name of the level to join to. If not specified, joins to the
lowest level of the dimension. DimensionUsage,usagePrefix=If present, then this is prepended to the Dimension column
names during the building of collapse dimension aggregates
allowing 1) different dimension usages to be disambiguated
during aggregate table recognition and 2) multiple shared
dimensions that have common column names to be disambiguated. Dimension,name=Name of this Dimension. Dimension,type=The dimension's type may be one of "Standard" or "Time". A time
dimension will allow the use of the MDX time functions (WTD,
YTD, QTD, etc.). Use a standard dimension if the dimension is not
a time-related dimension. The default value is "Standard". Dimension,caption=A string being displayed instead of the dimensions's name.
Can be localized from Properties file using #{propertyname}. Dimension,usagePrefix=If present, then this is prepended to the Dimension column
names during the building of collapse dimension aggregates
allowing 1) different dimensions to be disambiguated
during aggregate table recognition.
This should only be set for private dimensions. Dimension,foreignKey=The name of the column in the fact table which joins
to the leaf level of this dimension. Hierarchy,name=Name of the hierarchy. If this is not specified, the
hierarchy has the same name as its dimension. Hierarchy,hasAll=Whether this hierarchy has an 'all' member. Hierarchy,allMemberName=Name of the 'all' member. If this attribute is not specified,
the all member is named 'All'. Hierarchy,allMemberCaption=A string being displayed instead as the all member's name.
Can be localized from Properties file using #{propertyname}. Hierarchy,allLevelName=Name of the 'all' level. If this attribute is not specified,
the all member is named '(All)'.
Can be localized from Properties file using #{propertyname}. Hierarchy,primaryKey=The name of the column which identifies members, and
which is referenced by rows in the fact table.
If not specified, the key of the lowest level is used.
See also foreignKey. Hierarchy,primaryKeyTable=The name of the table which contains the primary key.
If the hierarchy has only one table, defaults to that. Hierarchy,defaultMember=default Member Hierarchy,memberReaderClass=Name of the custom member reader class. Must implement
the mondrian.rolap.MemberReader interface. Hierarchy,caption=A string to be displayed in the user interface.
If not specified, the hierarchy's name is used.
Can be localized from Properties file using #{propertyname}. Hierarchy,relation=Table information. Level,approxRowCount=The estimated number of members in this level.
Setting this attribute improves the performance of
MDSCHEMA_LEVELS, MDSCHEMA_HIERARCHIES and
MDSCHEMA_DIMENSIONS XMLA requests. Level,name=Name of this level. Level,table=The name of the table that the column comes from. If
this hierarchy is based upon just one table, defaults to
the name of that table; otherwise, it is required.
Can be localized from Properties file using #{propertyname}. Level,column=The name of the column which holds the unique identifier
of this level. Level,nameColumn=The name of the column which holds the user identifier
of this level. Level,ordinalColumn=The name of the column which holds member
ordinals. If this column is not specified, the
key column is used for ordering. Level,ordinalExp=The SQL expression used to populate this level's ordinal. Level,parentColumn=The name of the column which references the parent member
in a parent-child hierarchy. Level,nullParentValue=Value which identifies null parents in a parent-child
hierarchy. Typical values are 'NULL' and '0'. Level,nameExp=The SQL expression used to populate this level's name.
If not specified, the level's key is used. Level,type=Indicates the type of this level's key column: String or
Numeric. When generating SQL statements, Mondrian
encloses values for String columns in quotation marks,
but leaves values for Numeric columns un-quoted. Level,uniqueMembers=Whether members are unique across all parents. For
example, zipcodes are unique across all states. The
first level's members are always unique. Level,levelType=Whether this is a regular or a time-related level.
The value makes a difference to time-related functions such as YTD (year-to-date). Level,hideMemberIf=Condition which determines whether a member of this level
is hidden. If a hierarchy has one or more levels with hidden
members, then it is possible that not all leaf members are the
same distance from the root, and it is termed a ragged hierarchy. Level,closure=Specifies the transitive closure of a parent-child hierarchy. Level,formatter=Name of a formatter class for the member labels being displayed.
The class must implement the mondrian.spi.MemberFormatter interface. Level,caption=A string being displayed instead of the level's name.
Can be localized from Properties file using #{propertyname}. Level,captionColumn=The name of the column which holds the caption for members. Property,name=Name of this property. Property,column=column name Property,type=Data type of this property Property,formatter=Name of a formatter class for the appropriate property value
being displayed. The class must implement the mondrian.spi.PropertyFormatter
interface. Property,caption=A string being displayed instead of the name.
Can be localized from Properties file using #{propertyname}. Measure,name=Name of this measure. Measure,column=Column which is source of this measure's values.
If not specified, a measure expression must be specified. Measure,datatype=The datatype of this measure.
Valid values are 'String', 'Numeric' and 'Integer'.
The default datatype of a measure is
'Integer' if the measure's aggregator is 'Count',
otherwise it is 'Numeric'. Measure,formatString=Format string with which to format cells of this measure.
Formats numbers, strings and dates according to the
same specification as Visual Basic's format() function. Measure,aggregator=Aggregation function. Measure,formatter=Name of a formatter class for the appropriate cell being displayed.
The class must implement the mondrian.spi.CellFormatter interface. Measure,caption=A string being displayed instead of the name.
Can be localized from Properties file using #{propertyname}. Measure,visible=Whether this member is visible in the user-interface. Default true. CalculatedMember,name=Name of this calculated member. CalculatedMember,formatString=Format string with which to format cells of this member.
Formats numbers, strings and dates according to the
same specification as Visual Basic's format() function. CalculatedMember,caption=A string being displayed instead of the name.
Can be localized from Properties file using #{propertyname}. CalculatedMember,formula=MDX expression which gives the value of this member.
Equivalent to the Formula sub-element. CalculatedMember,dimension=Name of the dimension which this member belongs to. CalculatedMember,visible=Whether this member is visible in the user-interface.
Default true. CalculatedMemberProperty,name=Name of this member property. CalculatedMemberProperty,caption=A string being displayed instead of the Properties's name.
Can be localized from Properties file using #{propertyname}. CalculatedMemberProperty,expression=MDX expression which defines the value of this property.
If the expression is a constant string, you could enclose it in
quotes, or just specify the 'value' attribute instead. CalculatedMemberProperty,value=Value of this property. If the value
is not constant, specify the 'expression' attribute instead. NamedSet,name=Name of this named set. NamedSet,formula=MDX expression which gives the value of this set.
Equivalent to the Formula sub-element. SQL,dialect=Dialect of SQL the view is intended for. Join,leftAlias=Defaults to left's alias if left is a table, otherwise required. Join,rightAlias=Defaults to right's alias if right is a table, otherwise required. Table,name=Name of this table. Table,schema=Optional qualifier for Table. Table,alias=Alias to be used with this table when it is used to
form queries. If not specified, defaults to the table
name, but in any case, must be unique within the
schema. (You can use the same table in different
hierarchies, but it must have different aliases.) InlineTable,alias=Alias to be used with this table when it is used to
form queries. If not specified, defaults to the table
name, but in any case, must be unique within the
schema. (You can use the same table in different
hierarchies, but it must have different aliases.) ColumnDef,name=Name of the column. ColumnDef,type=Type of the column (String or Numeric) Value,column=Name of the column. AggTable,ignorecase=Whether or not the match should ignore case. AggName,name=The Table name of a Specific aggregate table. AggPattern,pattern=A Table pattern used to define a set of aggregate tables. AggExclude,pattern=A Table pattern not to be matched. AggExclude,name=The Table name not to be matched. AggExclude,ignorecase=Whether or not the match should ignore case. AggColumnName,column=The name of the fact count column. AggForeignKey,factColumn=The name of the base fact table foreign key. AggForeignKey,aggColumn=The name of the aggregate table foreign key. AggLevel,column=The name of the column mapping to the level name. AggLevel,name=The name of the Dimension Hierarchy level. AggMeasure,column=The name of the column mapping to the measure name. AggMeasure,name=The name of the Cube measure. Column,table=Alias of the table which contains this column.
Not required if the query only has one table. Column,name=Name of the column. CubeGrant,cube=The unique name of the cube Grant,access=Values correspond to Access DimensionGrant,dimension=The unique name of the dimension HierarchyGrant,access=Grants (or denies) this role access to a hierarchy. HierarchyGrant,hierarchy=The unique name of the hierarchy HierarchyGrant,topLevel=Unique name of the highest level of the hierarchy from which
this role is allowed to see members. May only be specified if
the HierarchyGrant.access is "custom". If not specified,
role can see members up to the top level. HierarchyGrant,bottomLevel=Unique name of the lowest level of the hierarchy from which
this role is allowed to see members. May only be specified if
the HierarchyGrant.access is "custom". If not specified,
role can see members down to the leaf level. MemberGrant,member=The unique name of the member MemberGrant,access=Grants (or denies) this role access to a member.
The children of this member inherit that access.
You can implicitly see a member if you can see any of its children. UserDefinedFunction,name=Name with which the user-defined function will be referenced in MDX expressions. UserDefinedFunction,className=Name of the class which implements this user-defined function.
Must implement the mondrian.spi.UserDefinedFunction interface. Parameter,name=Name of this parameter. Parameter,description=Description of this parameter. Parameter,type=Indicates the type of this parameter: String, Numeric or Member. Parameter,modifiable=If false, statement cannot change the value of this parameter;
the parameter becomes effectively constant (provided that its default
value expression always returns the same value).
Default is true. Parameter,defaultValue=Expression for the default value of this parameter. Role,name=Name of this role. SchemaGrant,access=Grants (or denies) this role access to this schema. CubeGrant,access=Grants (or denies) this role access to a cube. mondrian-3.11.0.1-R/src/main/mondrian/gui/resources/workbenchInfo_ja.properties000066400000000000000000000722561261646570300274750ustar00rootroot00000000000000Schema,name=\u3053\u306e\u30b9\u30ad\u30fc\u30de\u306e\u540d\u524d Schema,measuresCaption=\u30e1\u30b8\u30e3\u30fc\u30c7\u30a3\u30e1\u30f3\u30b8\u30e7\u30f3\u306e\u30e9\u30d9\u30eb\u3002
#{propertyname}\u3092\u4f7f\u3063\u3066\u30d7\u30ed\u30d1\u30c6\u30a3\u30d5\u30a1\u30a4\u30eb\u304b\u3089\u30ed\u30fc\u30ab\u30e9\u30a4\u30ba\u53ef\u80fd\u3002 Schema,defaultRole=\u3053\u306e\u30b9\u30ad\u30fc\u30de\u3078\u306e\u63a5\u7d9a\u306e\u305f\u3081\u306e\u30c7\u30d5\u30a9\u30eb\u30c8\u30ed\u30fc\u30eb\u306e\u540d\u524d CubeDimension,caption=\u30c7\u30a3\u30e1\u30f3\u30b8\u30e7\u30f3\u540d\u306e\u4ee3\u308f\u308a\u306b\u8868\u793a\u3055\u308c\u308b\u6587\u5b57\u5217\u3002
#{propertyname}\u3092\u4f7f\u3063\u3066\u30d7\u30ed\u30d1\u30c6\u30a3\u30d5\u30a1\u30a4\u30eb\u304b\u3089\u30ed\u30fc\u30ab\u30e9\u30a4\u30ba\u53ef\u80fd\u3002 CubeDimension,foreignKey=\u30d5\u30a1\u30af\u30c8\u30c6\u30fc\u30d6\u30eb\u5185\u306e\u30ab\u30e9\u30e0\u306e\u540d\u524d\u3002\u30c7\u30a3\u30e1\u30f3\u30b8\u30e7\u30f3\u306e
leaf\u30ec\u30d9\u30eb\u307e\u3067join\u3059\u308b\u969b\u306b\u4f7f\u7528\u3002 \u30d7\u30e9\u30a4\u30d9\u30fc\u30c8
\u307e\u305f\u306f\u5171\u6709\u30c7\u30a3\u30e1\u30f3\u30b8\u30e7\u30f3\u6642\u306b\u5fc5\u8981\u3068\u306a\u308b\u3002 \u3057\u304b\u3057
\u30d1\u30d6\u30ea\u30c3\u30af\u30c7\u30a3\u30e1\u30f3\u30b8\u30e7\u30f3\u3067\u306f\u5fc5\u8981\u306a\u3044\u3002 Cube,name=\u3053\u306e\u30ad\u30e5\u30fc\u30d6\u306e\u540d\u524d Cube,caption=\u3053\u306e\u30ad\u30e5\u30fc\u30d6\u540d\u306e\u4ee3\u308f\u308a\u306b\u8868\u793a\u3055\u308c\u308b\u6587\u5b57\u5217\u3002
#{propertyname}\u3092\u4f7f\u3063\u3066\u30d7\u30ed\u30d1\u30c6\u30a3\u30d5\u30a1\u30a4\u30eb\u304b\u3089\u30ed\u30fc\u30ab\u30e9\u30a4\u30ba\u53ef\u80fd\u3002 Cube,cache=\u3053\u306e\u30ad\u30e5\u30fc\u30d6\u306b\u5bfe\u3059\u308b\u30d5\u30a1\u30af\u30c8\u30c6\u30fc\u30d6\u30eb\u306e\u30c7\u30fc\u30bf\u3092\u30ad\u30e3\u30c3\u30b7\u30e5
\u3059\u308b\u304b\u3069\u3046\u304b\u3002 \u30c7\u30d5\u30a9\u30eb\u30c8\u306f\u30ad\u30e3\u30c3\u30b7\u30e5\u3059\u308b\u3002 Cube,enabled=\u5404\u8981\u7d20\u3092 enable\u306b\u3059\u308b\u304b\u3069\u3046\u304b\u3002\u3082\u3057True\u306a\u3089\u30ad\u30e5\u30fc\u30d6\u306f\u3001
\u8a8d\u8b58\u3055\u308c\u3001\u305d\u3046\u3067\u306a\u3051\u308c\u3070\u7121\u8996\u3055\u308c\u308b\u3002 Cube,fact=\u30d5\u30a1\u30af\u30c8\u30c6\u30fc\u30d6\u30eb\u306f\u3053\u306e\u30ad\u30e5\u30fc\u30d6\u306e\u30e1\u30f3\u30d0\u30fc\u306e\u30bd\u30fc\u30b9\u3067\u3059\u3002
\u3082\u3057\u3053\u306e\u30c6\u30fc\u30d6\u30eb\u306e\u30b9\u30ad\u30fc\u30de\u540d\u304c\u5b58\u5728\u3057\u306a\u3044\u5834\u5408\u3001
\u30c6\u30fc\u30d6\u30eb\u540d\u306f\u7121\u52b9\u306b\u306a\u308a\u307e\u3059\u3002 VirtualCube,enabled=\u5404\u8981\u7d20\u3092 enable\u306b\u3059\u308b\u304b\u3069\u3046\u304b\u3002\u3082\u3057True\u306a\u3089\u30ad\u30e5\u30fc\u30d6\u306f\u3001
\u8a8d\u8b58\u3055\u308c\u3001\u305d\u3046\u3067\u306a\u3051\u308c\u3070\u7121\u8996\u3055\u308c\u308b\u3002 VirtualCube,name=\u4eee\u60f3\u30ad\u30e5\u30fc\u30d6\u306e\u540d\u524d VirtualCube,caption=\u30ad\u30e5\u30fc\u30d6\u540d\u306e\u4ee3\u308f\u308a\u306b\u8868\u793a\u3055\u308c\u308b\u6587\u5b57\u5217\u3002
#{propertyname}\u3092\u4f7f\u3063\u3066\u30d7\u30ed\u30d1\u30c6\u30a3\u30d5\u30a1\u30a4\u30eb\u304b\u3089\u30ed\u30fc\u30ab\u30e9\u30a4\u30ba\u53ef\u80fd\u3002 VirtualCubeDimension,cubeName=\u30c7\u30a3\u30e1\u30f3\u30b8\u30e7\u30f3\u3092\u6240\u6709\u3059\u308b\u30ad\u30e5\u30fc\u30d6\u306e\u540d\u524d\u3002
\u5171\u6709\u30c7\u30a3\u30e1\u30f3\u30b8\u30e7\u30f3\u306e\u5834\u5408\u306f\u7279\u5b9a\u3057\u306a\u3044\u3002 VirtualCubeDimension,name=\u30c7\u30a3\u30e1\u30f3\u30b8\u30e7\u30f3\u306e\u540d\u524d VirtualCubeMeasure,cubeName=\u30e1\u30b8\u30e3\u30fc\u3092\u6240\u6709\u3059\u308b\u30ad\u30e5\u30fc\u30d6\u306e\u540d\u524d VirtualCubeMeasure,name=\u305d\u306e\u30ad\u30e5\u30fc\u30d6\u5185\u3067\u306e\u30e1\u30b8\u30e3\u30fc\u306e\u30e6\u30cb\u30fc\u30af\u306a\u540d\u524d VirtualCubeMeasure,visible=\u3053\u306e\u30e1\u30f3\u30d0\u30fc\u3092\u30e6\u30fc\u30b6\u30fc\u306bVisible\u306b\u3059\u308b\u304b\u3069\u3046\u304b\u3002
\u30c7\u30d5\u30a9\u30eb\u30c8\u306fTrue DimensionUsage,source=\u30bd\u30fc\u30b9\u30c7\u30a3\u30e1\u30f3\u30b8\u30e7\u30f3\u306e\u540d\u524d\u3002\u30b9\u30ad\u30fc\u30de\u5185\u306e\u30c7\u30a3\u30e1\u30f3\u30b8\u30e7\u30f3
\u3067\u306e\u307f\u6709\u52b9\u3002Case-sensitive. DimensionUsage,level=join\u3059\u308b\u30ec\u30d9\u30eb\u306e\u540d\u524d\u3002\u3082\u3057\u7279\u5b9a\u3057\u306a\u3044\u5834\u5408\u3001
\u30c7\u30a3\u30e1\u30f3\u30b8\u30e7\u30f3\u306e\u6700\u4e0b\u5c64\u306bjoin\u3002 DimensionUsage,usagePrefix=\u3082\u3057\u5b58\u5728\u3059\u308b\u5834\u5408\u3001\u3053\u308c\u306f\u30c7\u30a3\u30e1\u30f3\u30b8\u30e7\u30f3\u30ab\u30e9\u30e0\u306e\u5148\u982d\u306b\u8ffd\u52a0\u3055\u308c\u307e\u3059\u3002
\uff08\u30c7\u30a3\u30e1\u30f3\u30b8\u30e7\u30f3\u306e\u69cb\u7bc9\u306e\u9593\uff09\u96c6\u8a08\u306f\u4ee5\u4e0b\u3092\u8a31\u5bb9\u3057\u307e\u3059\u3002
1) aggregate\u30c6\u30fc\u30d6\u30eb\u9593\u306e\u7570\u306a\u308b\u5171\u6709\u30c7\u30a3\u30e1\u30f3\u30b8\u30e7\u30f3\u304c\u660e\u78ba\u306b\u306a\u308b\u3001\u305d\u3057\u30662) \u5171\u901a\u306e\u30ab\u30e9\u30e0\u3092\u6301\u3064multiple shared dimensions\u304c\u660e\u78ba\u306b\u306a\u308b\u3002 Dimension,name=\u3053\u306e\u30c7\u30a3\u30e1\u30f3\u30b8\u30e7\u30f3\u306e\u540d\u524d Dimension,type=\u30c7\u30a3\u30e1\u30f3\u30b8\u30e7\u30f3\u306e\u30bf\u30a4\u30d7\u306f "Standard" \u304b "Time"\u3067\u3059\u3002
Time\u30c7\u30a3\u30e1\u30f3\u30b8\u30e7\u30f3\u306f MDX time functions (WTD,
YTD, QTD, etc.)\u3092\u4f7f\u7528\u3067\u304d\u307e\u3059\u3002 \u6642\u9593\u306b\u95a2\u9023\u3057\u305f\u30c7\u30a3\u30e1\u30f3\u30b8
\u30e7\u30f3\u3067\u306a\u3044\u306a\u3089\u3001Standard\u3092\u4f7f\u7528\u3057\u3066\u304f\u3060\u3055\u3044
\u30c7\u30d5\u30a9\u30eb\u30c8\u306f"Standard"\u3067\u3059\u3002 Dimension,caption=\u30c7\u30a3\u30e1\u30f3\u30b8\u30e7\u30f3\u540d\u306e\u4ee3\u308f\u308a\u306b\u8868\u793a\u3055\u308c\u308b\u6587\u5b57\u5217\u3002
#{propertyname}\u3092\u4f7f\u7528\u3057\u3066\u30d7\u30ed\u30d1\u30c6\u30a3\u30d5\u30a1\u30a4\u30eb\u304b\u3089\u30ed\u30fc\u30ab\u30e9\u30a4\u30ba\u3059\u308b\u3053\u3068\u304c\u53ef\u80fd\u3002 Dimension,usagePrefix=\u3082\u3057\u5b58\u5728\u3059\u308b\u5834\u5408\u3001\u3053\u308c\u306f\u30c7\u30a3\u30e1\u30f3\u30b8\u30e7\u30f3\u30ab\u30e9\u30e0\u306e\u5148\u982d\u306b\u8ffd\u52a0\u3055\u308c\u307e\u3059\u3002
\uff08\u30c7\u30a3\u30e1\u30f3\u30b8\u30e7\u30f3\u306e\u69cb\u7bc9\u306e\u9593\uff09\u96c6\u8a08\u306f\u4ee5\u4e0b\u3092\u8a31\u5bb9\u3057\u307e\u3059\u3002
1) aggregate\u30c6\u30fc\u30d6\u30eb\u9593\u306e\u7570\u306a\u308b\u5171\u6709\u30c7\u30a3\u30e1\u30f3\u30b8\u30e7\u30f3\u304c\u660e\u78ba\u306b\u306a\u308b\u3001\u305d\u3057\u30662) \u5171\u901a\u306e\u30ab\u30e9\u30e0\u3092\u6301\u3064multiple shared dimensions\u304c\u660e\u78ba\u306b\u306a\u308b\u3002 Dimension,foreignKey=\u30d5\u30a1\u30af\u30c8\u30c6\u30fc\u30d6\u30eb\u5185\u306e\u30ab\u30e9\u30e0\u306e\u540d\u524d\u3002
\u3053\u306e\u30c7\u30a3\u30e1\u30f3\u30b8\u30e7\u30f3\u306eleaf\u30ec\u30d9\u30eb\u307e\u3067join\u3059\u308b\u3002 Hierarchy,name=\u30d2\u30a8\u30e9\u30eb\u30ad\u30fc\u306e\u540d\u524d\u3002\u3082\u3057\u3053\u308c\u304c\u7279\u5b9a\u3055\u308c\u306a\u3051\u308c\u3070\u3001
\u30d2\u30a8\u30e9\u30eb\u30ad\u30fc\u306f\u30c7\u30a3\u30e1\u30f3\u30b8\u30e7\u30f3\u3068\u540c\u3058\u540d\u524d\u3068\u306a\u308a\u307e\u3059\u3002 Hierarchy,hasAll=\u30d2\u30a8\u30e9\u30eb\u30ad\u30fc\u304cAll\u30e1\u30f3\u30d0\u30fc\u3092\u6301\u3064\u304b\u3069\u3046\u304b\u3002 Hierarchy,allMemberName=All\u30e1\u30f3\u30d0\u30fc\u306e\u540d\u524d\u3002\u3082\u3057\u3053\u306e\u5c5e\u6027\u304c\u7279\u5b9a\u3055\u308c\u306a\u3044\u5834\u5408\u3001
All\u30e1\u30f3\u30d0\u30fc\u306e\u540d\u524d\u306fAll\u306b\u306a\u308a\u307e\u3059\u3002 Hierarchy,allMemberCaption=All\u30e1\u30f3\u30d0\u30fc\u540d\u306e\u4ee3\u308f\u308a\u306b\u8868\u793a\u3055\u308c\u308b\u6587\u5b57\u5217\u3002
#{propertyname}\u3092\u4f7f\u7528\u3057\u3066\u30d7\u30ed\u30d1\u30c6\u30a3\u30d5\u30a1\u30a4\u30eb\u304b\u3089\u30ed\u30fc\u30ab\u30e9\u30a4\u30ba\u3059\u308b\u3053\u3068\u304c\u53ef\u80fd\u3002 Hierarchy,allLevelName=All\u30ec\u30d9\u30eb\u306e\u540d\u524d\u3002\u3082\u3057\u3053\u306e\u5c5e\u6027\u304c\u7279\u5b9a\u3055\u308c\u306a\u3044\u5834\u5408\u3001
All\u30e1\u30f3\u30d0\u30fc\u306e\u540d\u524d\u306fAll\u306b\u306a\u308a\u307e\u3059\u3002
#{propertyname}\u3092\u4f7f\u7528\u3057\u3066\u30d7\u30ed\u30d1\u30c6\u30a3\u30d5\u30a1\u30a4\u30eb\u304b\u3089\u30ed\u30fc\u30ab\u30e9\u30a4\u30ba\u3059\u308b\u3053\u3068\u304c\u53ef\u80fd\u3002 Hierarchy,primaryKey=\u30e1\u30f3\u30d0\u30fc\u3092\u7279\u5b9a\u3059\u308b\u30ab\u30e9\u30e0\u306e\u540d\u524d\u3002
\u30d5\u30a1\u30af\u30c8\u30c6\u30fc\u30d6\u30eb\u306e\u30ed\u30fc\u306b\u3088\u308a\u53c2\u7167\u3055\u308c\u307e\u3059\u3002
\u3082\u3057\u7279\u5b9a\u3055\u308c\u306a\u3044\u5834\u5408\u306f\u3001\u6700\u4e0b\u5c64\u306e\u30ad\u30fc\u304c\u4f7f\u7528\u3055\u308c\u307e\u3059\u3002 Hierarchy,primaryKeyTable=\u30d7\u30e9\u30a4\u30de\u30ea\u30fc\u30ad\u30fc\u3092\u542b\u3080\u30c6\u30fc\u30d6\u30eb\u306e\u540d\u524d\u3002
\u3082\u3057\u30d2\u30a8\u30e9\u30eb\u30ad\u30fc\u306e\u30c6\u30fc\u30d6\u30eb\u304c\u4e00\u3064\u3067\u3042\u308c\u3070\u3001\u305d\u308c\u304c\u30c7\u30d5\u30a9\u30eb\u30c8\u306b\u306a\u308a\u307e\u3059\u3002 Hierarchy,defaultMember=\u30c7\u30d5\u30a9\u30eb\u30c8\u30e1\u30f3\u30d0\u30fc Hierarchy,memberReaderClass=\u30ab\u30b9\u30bf\u30e0\u30e1\u30f3\u30d0\u30fcreader\u30af\u30e9\u30b9\u306e\u540d\u524d\u3002
mondrian.rolap.MemberReader\u30a4\u30f3\u30bf\u30d5\u30a7\u30fc\u30b9\u3067\u5b9f\u884c\u5fc5\u8981\u3002 Hierarchy,caption=\u30e6\u30fc\u30b6\u30fc\u30a4\u30f3\u30bf\u30d5\u30a7\u30fc\u30b9\u3067\u8868\u793a\u3055\u308c\u308b\u6587\u5b57\u5217\u3002
\u3082\u3057\u7279\u5b9a\u3055\u308c\u306a\u3044\u5834\u5408\u3001\u30d2\u30a8\u30e9\u30eb\u30ad\u30fc\u540d\u304c\u4f7f\u308f\u308c\u307e\u3059\u3002
#{propertyname}\u3092\u4f7f\u7528\u3057\u3066\u30d7\u30ed\u30d1\u30c6\u30a3\u30d5\u30a1\u30a4\u30eb\u304b\u3089\u30ed\u30fc\u30ab\u30e9\u30a4\u30ba\u3059\u308b\u3053\u3068\u304c\u53ef\u80fd\u3002 Hierarchy,relation=\u30c6\u30fc\u30d6\u30eb\u30ea\u30ec\u30fc\u30b7\u30e7\u30f3\u60c5\u5831\u3002 Level,approxRowCount=\u3053\u306e\u30ec\u30d9\u30eb\u5185\u3067\u306e\u30e1\u30f3\u30d0\u30fc\u306e\u898b\u7a4d\u6570\u3002
\u3053\u306e\u5c5e\u6027\u3092\u30bb\u30c3\u30c8\u3059\u308b\u3053\u3068\u3067\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u304c\u5411\u4e0a\u3057\u307e\u3059\u3002
MDSCHEMA_LEVELS, MDSCHEMA_HIERARCHIE Level,name=\u3053\u306e\u30ec\u30d9\u30eb\u306e\u540d\u524d Level,table=\u30ab\u30e9\u30e0\u306e\u3042\u308b\u30c6\u30fc\u30d6\u30eb\u306e\u540d\u524d\u3002
\u3053\u306e\u30d2\u30a8\u30e9\u30eb\u30ad\u30fc\u304c\u3061\u3087\u3046\u3069\u4e00\u3064\u306e\u30c6\u30fc\u30d6\u30eb\u306b\u57fa\u3065\u304f\u306a\u3089\u3001\u305d\u306e\u30c6\u30fc\u30d6\u30eb\u304c\u30c7\u30d5\u30a9\u30eb\u30c8\u3002
\u305d\u308c\u4ee5\u5916\u306f\u5fc5\u8981\u3067\u3059\u3002 #{propertyname}\u3092\u4f7f\u7528\u3057\u3066\u30d7\u30ed\u30d1\u30c6\u30a3\u30d5\u30a1\u30a4\u30eb\u304b\u3089\u30ed\u30fc\u30ab\u30e9\u30a4\u30ba\u3059\u308b\u3053\u3068\u304c\u53ef\u80fd\u3002 Level,column=\u3053\u306e\u30ec\u30d9\u30eb\u306e\u30e6\u30cb\u30fc\u30af\u306a\u8b58\u5225\u5b50\u3092\u6301\u3064\u30ab\u30e9\u30e0\u306e\u540d\u524d Level,nameColumn=\u3053\u306e\u30ec\u30d9\u30eb\u306euser\u8b58\u5225\u5b50\u3092\u6301\u3064
\u30ab\u30e9\u30e0\u306e\u540d\u524d\u3002 Level,ordinalColumn=\u9806\u5e8f\u3092\u6301\u3064\u30ab\u30e9\u30e0\u306e\u540d\u524d\u3002
\u3053\u306e\u30ab\u30e9\u30e0\u304c\u6307\u5b9a\u3055\u308c\u306a\u3044\u306a\u3089\u3001
\u30ad\u30fc\u30ab\u30e9\u30e0\u304c\u6574\u5217\u306b\u4f7f\u7528\u3055\u308c\u307e\u3059\u3002 Level,ordinalExp=\u3053\u306e\u30ec\u30d9\u30eb\u306e\u9806\u5e8f\u3092\u64cd\u4f5c\u3059\u308b\u305f\u3081\u306b\u4f7f\u7528\u3055\u308c\u308bSQL\u3002 Level,parentColumn=\u30d2\u30a8\u30e9\u30eb\u30ad\u30fc\u3067\u89aa\u30e1\u30f3\u30d0\u30fc\u3092\u53c2\u7167\u3059\u308b\u30ab\u30e9\u30e0\u306e\u540d\u524d\u3002 Level,nullParentValue=\u89aa\u5b50\u30d2\u30a8\u30e9\u30eb\u30ad\u30fc\u3067null\u306e\u89aa\u3092\u7279\u5b9a\u3059\u308b\u30d0\u30ea\u30e5\u30fc\u3002
\u901a\u5e38\u306f 'NULL' and '0'. Level,nameExp=\u3053\u306e\u30ec\u30d9\u30eb\u306e\u540d\u524d\u3092\u64cd\u4f5c\u3059\u308b\u305f\u3081\u306b\u4f7f\u7528\u3055\u308c\u308bSQL\u3002
\u7279\u5b9a\u3057\u306a\u3044\u5834\u5408\u306f\u30ec\u30d9\u30eb\u30ad\u30fc\u3092\u4f7f\u7528\u3002 Level,type=\u3053\u306e\u30ec\u30d9\u30eb\u306e\u30ad\u30fc\u30ab\u30e9\u30e0\u306e\u30bf\u30a4\u30d7\u3092\u8868\u793a\u3002String or Numeric.
SQL\u3092\u751f\u6210\u3059\u308b\u969b\u306b Mondrian
\u306fString\uff08\u6587\u5b57\u5217\uff09\u30ab\u30e9\u30e0\u306e\u30d0\u30ea\u30e5\u30fc\u3092\u5f15\u7528\u7b26\u3067\u30a8\u30f3\u30af\u30ed\u30fc\u30ba\u3057\u307e\u3059\u3002
Numeric\uff08\u6570\u5024\uff09\u30ab\u30e9\u30e0\u306f\u5f15\u7528\u7b26\u3092\u3064\u3051\u305a\u306b\u304a\u304d\u307e\u3059\u3002 Level,uniqueMembers=\u3059\u3079\u3066\u306e\u89aa\u306b\u6e21\u3063\u3066\u30e1\u30f3\u30d0\u30fc\u304c\u30e6\u30cb\u30fc\u30af\u3069\u3046\u304b\u3002 Level,levelType=regular\u304bTime\u95a2\u9023\u30ec\u30d9\u30eb\u304b\u3092\u9078\u629e\u3057\u307e\u3059\u3002
YTD (year-to-date)\u306e\u3088\u3046\u306b\u3053\u306e\u30d0\u30ea\u30e5\u30fc\u304c\u9055\u3044\u3092\u4f5c\u308a\u307e\u3059\u3002 Level,hideMemberIf=\u3053\u306e\u30ec\u30d9\u30eb\u306e\u30e1\u30f3\u30d0\u30fc\u3092\u96a0\u3059\u304b\u3069\u3046\u304b\u3092\u6c7a\u5b9a\u3059\u308b\u6761\u4ef6\u3002
\u3082\u3057\u30d2\u30a8\u30e9\u30eb\u30ad\u30fc\u304c1\u3064\u4ee5\u4e0a\u306e\u96a0\u308c\u305f\u30e1\u30f3\u30d0\u30fc\u3092\u6301\u3063\u3066\u3044\u305f\u3089\u3001
\u5fc5\u305a\u3057\u3082\u3059\u3079\u3066\u306eleaf\u30e1\u30f3\u30d0\u30fc\u304c\u8868\u793a\u3055\u308c\u308b\u3068\u306f\u9650\u308a\u307e\u305b\u3093\u3002 Level,closure=\u89aa\u5b50\u30d2\u30a8\u30e9\u30eb\u30ad\u30fc\u306e\u7d42\u7d50\u3092\u7279\u5b9a\u3059\u308b\u3002 Level,formatter=\u8868\u793a\u3055\u308c\u308b\u30e1\u30f3\u30d0\u30fc\u30e9\u30d9\u30eb\u306e\u30d5\u30a9\u30fc\u30de\u30c3\u30c8\u30af\u30e9\u30b9\u540d\u3002
mondrian.spi.MemberFormatter\u30a4\u30f3\u30bf\u30d5\u30a7\u30fc\u30b9\u3067\u306e\u5b9f\u884c\u304c\u5fc5\u8981 Level,caption=\u30ec\u30d9\u30eb\u540d\u306e\u4ee3\u308f\u308a\u306b\u8868\u793a\u3055\u308c\u308b\u6587\u5b57\u5217\u3002
#{propertyname}\u3092\u4f7f\u7528\u3057\u3066\u30d7\u30ed\u30d1\u30c6\u30a3\u30d5\u30a1\u30a4\u30eb\u304b\u3089\u30ed\u30fc\u30ab\u30e9\u30a4\u30ba\u3059\u308b\u3053\u3068\u304c\u53ef\u80fd\u3002 Level,captionColumn=\u30e1\u30f3\u30d0\u30fc\u306e\u30ad\u30e3\u30d7\u30b7\u30e7\u30f3\u3092\u4fdd\u6301\u3059\u308b\u30ab\u30e9\u30e0\u306e\u540d\u524d\u3002 Property,name=\u30d7\u30ed\u30d1\u30c6\u30a3\u306e\u540d\u524d Property,column=\u30ab\u30e9\u30e0\u540d Property,type=\u3053\u306e\u30d7\u30ed\u30d1\u30c6\u30a3\u306e\u30c7\u30fc\u30bf\u30bf\u30a4\u30d7 Property,formatter=\u9069\u5207\u306a\u30d7\u30ed\u30d1\u30c6\u30a3\u30d0\u30ea\u30e5\u30fc\u306b\u5bfe\u3059\u308b\u30d5\u30a9\u30fc\u30de\u30c3\u30c8\u30af\u30e9\u30b9\u306e\u540d\u524d\u3002
mondrian.spi.PropertyFormatter\u30a4\u30f3\u30bf\u30d5\u30a7\u30fc\u30b9\u3067\u306e\u30af\u30e9\u30b9\u306e\u5b9f\u884c\u304c\u5fc5\u8981\u3002 Property,caption=\u30d7\u30ed\u30d1\u30c6\u30a3\u540d\u306e\u4ee3\u308f\u308a\u306b\u8868\u793a\u3055\u308c\u308b\u6587\u5b57\u5217\u3002
#{propertyname}\u3092\u4f7f\u7528\u3057\u3066\u30d7\u30ed\u30d1\u30c6\u30a3\u30d5\u30a1\u30a4\u30eb\u304b\u3089\u30ed\u30fc\u30ab\u30e9\u30a4\u30ba\u3059\u308b\u3053\u3068\u304c\u53ef\u80fd\u3002 Measure,name=\u3053\u306e\u30e1\u30b8\u30e3\u30fc\u306e\u540d\u524d Measure,column=\u3053\u306e\u30e1\u30b8\u30e3\u30fc\u306e\u540d\u524d\u306e\u57fa\u306b\u306a\u308b\u30ab\u30e9\u30e0\u3002
\u7279\u5b9a\u3057\u306a\u3044\u5834\u5408\u3001\u30e1\u30b8\u30e3\u30fc\u304c\u4f7f\u7528\u3055\u308c\u307e\u3059\u3002 Measure,datatype=\u3053\u306e\u30e1\u30b8\u30e3\u30fc\u306e\u30c7\u30fc\u30bf\u30bf\u30a4\u30d7\u3002
\u6709\u52b9\u306a\u30d0\u30ea\u30e5\u30fc\u306f 'String', 'Numeric', 'Integer'
\u30c7\u30d5\u30a9\u30eb\u30c8\u306e\u30c7\u30fc\u30bf\u30bf\u30a4\u30d7--->
\u3082\u3057\u30e1\u30b8\u30e3\u30fc\u304c 'Count'\u306e\u5834\u5408\u3001'Integer'
\u305d\u308c\u3067\u306a\u3051\u308c\u3070'Numeric' Measure,formatString=\u3053\u306e\u30e1\u30b8\u30e3\u30fc\u306e\u30bb\u30eb\u306e\u6587\u5b57\u5217\u30d5\u30a9\u30fc\u30de\u30c3\u30c8\u3002
numbers\u3084strings\u3084dates\u306e\u30d5\u30a9\u30fc\u30de\u30c3\u30c8\u306f
Visual Basic's \u30d5\u30a9\u30fc\u30de\u30c3\u30c8() \u95a2\u6570\u3068\u540c\u3058\u3067\u3059\u3002 Measure,aggregator=\u30a2\u30b0\u30ea\u30b2\u30fc\u30b7\u30e7\u30f3\u95a2\u6570 Measure,formatter=\u8868\u793a\u3055\u308c\u308b\u9069\u5207\u306a\u30bb\u30eb\u306b\u5bfe\u3059\u308b\u30d5\u30a9\u30fc\u30de\u30c3\u30c8\u30af\u30e9\u30b9\u306e\u540d\u524d\u3002
mondrian.spi.CellFormatter\u30a4\u30f3\u30bf\u30d5\u30a7\u30fc\u30b9\u3067\u306e\u30af\u30e9\u30b9\u306e\u5b9f\u884c\u304c\u5fc5\u8981\u3002 Measure,caption=\u30e1\u30b8\u30e3\u30fc\u306e\u4ee3\u308f\u308a\u306b\u8868\u793a\u3055\u308c\u308b\u540d\u524d\u3002
#{propertyname}\u3092\u4f7f\u7528\u3057\u3066\u30d7\u30ed\u30d1\u30c6\u30a3\u30d5\u30a1\u30a4\u30eb\u304b\u3089\u30ed\u30fc\u30ab\u30e9\u30a4\u30ba\u3059\u308b\u3053\u3068\u304c\u53ef\u80fd\u3002 Measure,visible=\u3053\u306e\u30e1\u30f3\u30d0\u30fc\u304c\u30e6\u30fc\u30b6\u30fc\u30a4\u30f3\u30bf\u30d5\u30a7\u30fc\u30b9\u3067visible\u304b\u3069\u3046\u304b\u3002\u30c7\u30d5\u30a9\u30eb\u30c8\u306fTrue\u3002 CalculatedMember,name=\u8a08\u7b97\u3055\u308c\u305f\u30e1\u30f3\u30d0\u30fc\u306e\u540d\u524d CalculatedMember,formatString=\u3053\u306e\u30e1\u30f3\u30d0\u30fc\u306e\u30bb\u30eb\u306e\u6587\u5b57\u5217\u30d5\u30a9\u30fc\u30de\u30c3\u30c8\u3002
numbers\u3084strings\u3084dates\u306e\u30d5\u30a9\u30fc\u30de\u30c3\u30c8\u306f
Visual Basic's \u30d5\u30a9\u30fc\u30de\u30c3\u30c8() \u95a2\u6570\u3068\u540c\u3058\u3067\u3059\u3002 CalculatedMember,caption=\u540d\u524d\u306e\u4ee3\u308f\u308a\u306b\u8868\u793a\u3055\u308c\u308b\u6587\u5b57\u5217\u3002
#{propertyname}\u3092\u4f7f\u7528\u3057\u3066\u30d7\u30ed\u30d1\u30c6\u30a3\u30d5\u30a1\u30a4\u30eb\u304b\u3089\u30ed\u30fc\u30ab\u30e9\u30a4\u30ba\u3059\u308b\u3053\u3068\u304c\u53ef\u80fd\u3002 CalculatedMember,formula=\u3053\u306e\u30e1\u30f3\u30d0\u30fc\u306e\u30d0\u30ea\u30e5\u30fc\u306b\u4e0e\u3048\u308bMDX\u3002
sub-element\u5f0f\u306b\u76f8\u5f53\u3002 CalculatedMember,dimension=\u3053\u306e\u30e1\u30f3\u30d0\u30fc\u304c\u6240\u5c5e\u3059\u308b\u30c7\u30a3\u30e1\u30f3\u30b8\u30e7\u30f3\u306e\u540d\u524d\u3002 CalculatedMember,visible=\u30e6\u30fc\u30b6\u30fc\u30a4\u30f3\u30bf\u30d5\u30a7\u30fc\u30b9\u3067\u3053\u306e\u30e1\u30f3\u30d0\u30fc\u3092\u8868\u793a\u3059\u308b\u304b\u3069\u3046\u304b\u3002
\u30c7\u30d5\u30a9\u30eb\u30c8\u306ftrue\u3002 CalculatedMemberProperty,name=\u3053\u306e\u30e1\u30f3\u30d0\u30fc\u30d7\u30ed\u30d1\u30c6\u30a3\u306e\u540d\u524d\u3002 CalculatedMemberProperty,caption=\u30d7\u30ed\u30d1\u30c6\u30a3\u540d\u306e\u4ee3\u308f\u308a\u306b\u8868\u793a\u3055\u308c\u308b\u6587\u5b57\u5217\u3002
#{propertyname}\u3092\u4f7f\u7528\u3057\u3066\u30d7\u30ed\u30d1\u30c6\u30a3\u30d5\u30a1\u30a4\u30eb\u304b\u3089\u30ed\u30fc\u30ab\u30e9\u30a4\u30ba\u3059\u308b\u3053\u3068\u304c\u53ef\u80fd\u3002 CalculatedMemberProperty,expression=\u3053\u306e\u30d7\u30ed\u30d1\u30c6\u30a3\u306e\u30d0\u30ea\u30e5\u30fc\u3092\u5b9a\u7fa9\u3059\u308bMDX\u3002
\u3082\u3057\u5b9a\u578b\u306e\u6587\u5b57\u5217\u306e\u5834\u5408\u306f\u3001\u5f15\u7528\u7b26\u3067\u56f2\u3080\u304b
\u5358\u306b \u305d\u306e'value' \u5c5e\u6027\u3092\u4ee3\u308f\u308a\u306b\u6307\u5b9a\u3057\u307e\u3059\u3002 CalculatedMemberProperty,value=\u3053\u306e\u30d7\u30ed\u30d1\u30c6\u30a3\u306e\u30d0\u30ea\u30e5\u30fc\u3002 \u3082\u3057\u30d0\u30ea\u30e5\u30fc\u304c
\u5b9a\u6570\u3067\u306a\u3044\u306a\u3089\u3001'expression'\u5c5e\u6027\u3092\u4ee3\u308f\u308a\u306b\u6307\u5b9a\u3057\u307e\u3059\u3002 NamedSet,name=\u3053\u306e\u30cd\u30fc\u30e0\u30c9\u30bb\u30c3\u30c8\u306e\u540d\u524d NamedSet,formula=\u3053\u306e\u30e1\u30f3\u30d0\u30fc\u306e\u30d0\u30ea\u30e5\u30fc\u306b\u4e0e\u3048\u308bMDX\u3002
sub-element\u5f0f\u306b\u76f8\u5f53\u3002 SQL,dialect=\u30d3\u30e5\u30fc\u306b\u5bfe\u3059\u308bSQL\u65b9\u8a00 Join,leftAlias=\u5de6\u304c\u30c6\u30fc\u30d6\u30eb\u306e\u5834\u5408\u3001\u30c7\u30d5\u30a9\u30eb\u30c8\u306f\u5de6\u306e\u30a8\u30a4\u30ea\u30a2\u30b9\u3067\u3059\u3002\u305d\u3046\u3067\u306a\u3051\u308c\u3070\u5fc5\u8981\u3067\u3059\u3002 Join,rightAlias=\u53f3\u304c\u30c6\u30fc\u30d6\u30eb\u306e\u5834\u5408\u3001\u30c7\u30d5\u30a9\u30eb\u30c8\u306f\u53f3\u306e\u30a8\u30a4\u30ea\u30a2\u30b9\u3067\u3059\u3002\u305d\u3046\u3067\u306a\u3051\u308c\u3070\u5fc5\u8981\u3067\u3059\u3002 Table,name=\u3053\u306e\u30c6\u30fc\u30d6\u30eb\u306e\u540d\u524d Table,schema=\u30c6\u30fc\u30d6\u30eb\u306e\u30b9\u30ad\u30fc\u30de\uff08\u30aa\u30d7\u30b7\u30e7\u30f3\uff09 Table,alias=\u30a8\u30a4\u30ea\u30a2\u30b9\u306f\u3053\u306e\u30c6\u30fc\u30d6\u30eb\u3068\u5171\u306b\u30af\u30a8\u30ea\u30fc\u306b\u4f7f\u308f\u308c\u307e\u3059\u3002
\u3082\u3057\u6307\u5b9a\u3057\u306a\u3044\u5834\u5408\u3001\u30c7\u30d5\u30a9\u30eb\u30c8\u306f\u30c6\u30fc\u30d6\u30eb\u540d\u3067\u3059\u3002
\u3057\u304b\u3057\u3069\u3093\u306a\u5834\u5408\u3067\u3082\u30b9\u30ad\u30fc\u30de\u5185\u3067\u30e6\u30cb\u30fc\u30af\u3067\u306a\u3051\u308c\u3070\u306a\u308a\u307e\u305b\u3093\u3002
\u7570\u306a\u308b\u30d2\u30a8\u30e9\u30eb\u30ad\u30fc\u3067\u540c\u3058\u30c6\u30fc\u30d6\u30eb\u3092\u4f7f\u3046\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002
\u3057\u304b\u3057\u30a8\u30a4\u30ea\u30a2\u30b9\u306f\u7570\u306a\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002 InlineTable,alias=\u30a8\u30a4\u30ea\u30a2\u30b9\u306f\u3053\u306e\u30c6\u30fc\u30d6\u30eb\u3068\u5171\u306b\u30af\u30a8\u30ea\u30fc\u306b\u4f7f\u308f\u308c\u307e\u3059\u3002
\u3082\u3057\u6307\u5b9a\u3057\u306a\u3044\u5834\u5408\u3001\u30c7\u30d5\u30a9\u30eb\u30c8\u306f\u30c6\u30fc\u30d6\u30eb\u540d\u3067\u3059\u3002
\u3057\u304b\u3057\u3069\u3093\u306a\u5834\u5408\u3067\u3082\u30b9\u30ad\u30fc\u30de\u5185\u3067\u30e6\u30cb\u30fc\u30af\u3067\u306a\u3051\u308c\u3070\u306a\u308a\u307e\u305b\u3093\u3002
\u7570\u306a\u308b\u30d2\u30a8\u30e9\u30eb\u30ad\u30fc\u3067\u540c\u3058\u30c6\u30fc\u30d6\u30eb\u3092\u4f7f\u3046\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002
\u3057\u304b\u3057\u30a8\u30a4\u30ea\u30a2\u30b9\u306f\u7570\u306a\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002 ColumnDef,name=\u30ab\u30e9\u30e0\u306e\u540d\u524d ColumnDef,type=\u30ab\u30e9\u30e0\u306e\u30bf\u30a4\u30d7 (String or Numeric) Value,column=\u30ab\u30e9\u30e0\u306e\u30d0\u30ea\u30e5\u30fc AggTable,ignorecase=\u30de\u30c3\u30c1\u3057\u305f\u3082\u306e\u3092\u7121\u8996\u3059\u308b\u304b\u3069\u3046\u304b\u3002 AggName,name=\u30a2\u30b0\u30ea\u30b2\u30fc\u30c8\u30c6\u30fc\u30d6\u30eb\u306e\u540d\u524d AggPattern,pattern=\u30a2\u30b0\u30ea\u30b2\u30fc\u30c8\u30c6\u30fc\u30d6\u30eb\u306e\u30bb\u30c3\u30c8\u3092\u5b9a\u7fa9\u3059\u308b\u30c6\u30fc\u30d6\u30eb\u30d1\u30bf\u30fc\u30f3\u3002 AggExclude,pattern=\u30de\u30c3\u30c1\u3057\u306a\u3044\u30c6\u30fc\u30d6\u30eb\u30d1\u30bf\u30fc\u30f3\u3002 AggExclude,name=\u30de\u30c3\u30c1\u3057\u306a\u3044\u30c6\u30fc\u30d6\u30eb\u540d AggExclude,ignorecase==\u30de\u30c3\u30c1\u3057\u305f\u3082\u306e\u3092\u7121\u8996\u3059\u308b\u304b\u3069\u3046\u304b\u3002 AggColumnName,column=\u30d5\u30a1\u30af\u30c8\u30ab\u30a6\u30f3\u30c8\u30ab\u30e9\u30e0\u306e\u540d\u524d AggForeignKey,factColumn=\u30d9\u30fc\u30b9\u306e\u30d5\u30a1\u30af\u30c8\u30c6\u30fc\u30d6\u30eb\u306e\u5916\u90e8\u30ad\u30fc\u306e\u540d\u524d AggForeignKey,aggColumn=\u30a2\u30b0\u30ea\u30b2\u30fc\u30c8\u30c6\u30fc\u30d6\u30eb\u306e\u5916\u90e8\u30ad\u30fc\u306e\u540d\u524d AggLevel,column=\u30ec\u30d9\u30eb\u540d\u306b\u30de\u30c3\u30d4\u30f3\u30b0\u3059\u308b\u30ab\u30e9\u30e0\u306e\u540d\u524d AggLevel,name=\u30c7\u30a3\u30e1\u30f3\u30b8\u30e7\u30f3\u30fb\u30d2\u30a8\u30e9\u30eb\u30ad\u30fc\u30fb\u30ec\u30d9\u30eb\u306e\u540d\u524d AggMeasure,column=\u30e1\u30b8\u30e3\u30fc\u540d\u306b\u30de\u30c3\u30d4\u30f3\u30b0\u3059\u308b\u30ab\u30e9\u30e0\u306e\u540d\u524d AggMeasure,name=\u30ad\u30e5\u30fc\u30d6\u30e1\u30b8\u30e3\u30fc\u306e\u540d\u524d Column,table=\u3053\u306e\u30ab\u30e9\u30e0\u3092\u542b\u3080\u30c6\u30fc\u30d6\u30eb\u306e\u30a8\u30a4\u30ea\u30a2\u30b9\u3002
\u3082\u3057\u30af\u30a8\u30ea\u30fc\u304c\uff11\u30c6\u30fc\u30d6\u30eb\u3057\u304b\u306a\u3044\u5834\u5408\u306f\u5fc5\u8981\u306a\u3057\u3002 Column,name=\u30ab\u30e9\u30e0\u306e\u540d\u524d CubeGrant,cube=\u30ad\u30e5\u30fc\u30d6\u306e\u30e6\u30cb\u30fc\u30af\u540d\u79f0 Grant,access=\u30a2\u30af\u30bb\u30b9\u306b\u5bfe\u5fdc\u3059\u308b\u30d0\u30ea\u30e5\u30fc\u3002 DimensionGrant,dimension=\u30c7\u30a3\u30e1\u30f3\u30b8\u30e7\u30f3\u306e\u30e6\u30cb\u30fc\u30af\u540d\u79f0 HierarchyGrant,access=\u30d2\u30a8\u30e9\u30eb\u30ad\u30fc\u3078\u306e\u3053\u306e\u30ed\u30fc\u30eb\u306b\u3088\u308b\u30a2\u30af\u30bb\u30b9\u306e\u8a8d\u53ef HierarchyGrant,hierarchy=\u30d2\u30a8\u30e9\u30eb\u30ad\u30fc\u306e\u30e6\u30cb\u30fc\u30af\u540d\u79f0 HierarchyGrant,topLevel=\u3053\u306e\u30ed\u30fc\u30eb\u306b\u3088\u308a\u30e1\u30f3\u30d0\u30fc\u3092\u53c2\u7167\u3059\u308b\u3053\u3068\u304c\u8a31\u3055\u308c\u308b\u4e2d\u3067\u306e\u3001
\u30d2\u30a8\u30e9\u30eb\u30ad\u30fc\u306e\u6700\u3082\u9ad8\u3044\u30ec\u30d9\u30eb\u306e\u30e6\u30cb\u30fc\u30af\u540d\u3002
the HierarchyGrant.access \u304c "custom"\u306e\u5834\u5408\u306e\u307f\u5fc5\u8981\u3002 \u6307\u5b9a\u3057\u306a\u3044\u5834\u5408\u306f\u3001
\u30ed\u30fc\u30eb\u306f\u30c8\u30c3\u30d7\u30ec\u30d9\u30eb\u306e\u30e1\u30f3\u30d0\u30fc\u307e\u3067\u898b\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002 HierarchyGrant,topLevel=\u3053\u306e\u30ed\u30fc\u30eb\u306b\u3088\u308a\u30e1\u30f3\u30d0\u30fc\u3092\u53c2\u7167\u3059\u308b\u3053\u3068\u304c\u8a31\u3055\u308c\u308b\u4e2d\u3067\u306e\u3001
\u30d2\u30a8\u30e9\u30eb\u30ad\u30fc\u306e\u6700\u3082\u4f4e\u3044\u30ec\u30d9\u30eb\u306e\u30e6\u30cb\u30fc\u30af\u540d\u3002
the HierarchyGrant.access \u304c "custom"\u306e\u5834\u5408\u306e\u307f\u5fc5\u8981\u3002 \u6307\u5b9a\u3057\u306a\u3044\u5834\u5408\u306f\u3001
\u30ed\u30fc\u30eb\u306fleaf\u30ec\u30d9\u30eb\u306e\u30e1\u30f3\u30d0\u30fc\u307e\u3067\u898b\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002 MemberGrant,member=\u30e1\u30f3\u30d0\u30fc\u306e\u30e6\u30cb\u30fc\u30af\u540d\u79f0 MemberGrant,access=\u3053\u306e\u30ed\u30fc\u30eb\u306b\u3088\u308b\u30e1\u30f3\u30d0\u30fc\u3078\u306e\u30a2\u30af\u30bb\u30b9\u306e\u8a8d\u53ef\u3002
\u30e1\u30f3\u30d0\u30fc\u306e\u5b50\u4f9b\u306f\u3053\u306e\u30a2\u30af\u30bb\u30b9\u3092\u7d99\u627f\u3057\u307e\u3059\u3002 UserDefinedFunction,name=\u30e6\u30fc\u30b6\u30fc\u5b9a\u7fa9\u95a2\u6570\u304cMDX\u306e\u4e2d\u3067\u53c2\u7167\u3059\u308b\u540d\u524d UserDefinedFunction,className=\u30e6\u30fc\u30b6\u30fc\u5b9a\u7fa9\u95a2\u6570\u3092\u5b9f\u884c\u3059\u308b\u30af\u30e9\u30b9\u306e\u540d\u524d\u3002
mondrian.spi.UserDefinedFunction\u30a4\u30f3\u30bf\u30d5\u30a7\u30fc\u30b9\u3067\u306e\u5b9f\u884c\u304c\u5fc5\u8981\u3002 Parameter,name=\u3053\u306e\u30d1\u30e9\u30e1\u30fc\u30bf\u306e\u540d\u524d Parameter,description=\u3053\u306e\u30d1\u30e9\u30e1\u30fc\u30bf\u306e\u6982\u8981 Parameter,type=\u30d1\u30e9\u30e1\u30fc\u30bf\u30bf\u30a4\u30d7\u3092\u8868\u793a\u3002String, Numeric \u307e\u305f\u306f Member\u3002 Parameter,modifiable=\u3082\u3057false\u306a\u3089\u3001\u30b9\u30c6\u30fc\u30c8\u30e1\u30f3\u30c8\u306f\u30d1\u30e9\u30e1\u30fc\u30bf\u306e\u30d0\u30ea\u30e5\u30fc\u3092\u5909\u66f4\u3067\u304d\u307e\u305b\u3093\u3002
\u30d1\u30e9\u30e1\u30fc\u30bf\u30d0\u30ea\u30e5\u30fc\u306f\u5b9a\u6570\u3068\u306a\u308a\u307e\u3059\u3002
\u30c7\u30d5\u30a9\u30eb\u30c8\u306ftrue\u3067\u3059\u3002 Parameter,defaultValue=\u3053\u306e\u30d1\u30e9\u30e1\u30fc\u30bf\u306e\u30c7\u30d5\u30a9\u30eb\u30c8\u30d0\u30ea\u30e5\u30fc\u306b\u5bfe\u3059\u308bExpression\u3002 Role,name=\u3053\u306e\u30ed\u30fc\u30eb\u306e\u540d\u524d SchemaGrant,access=\u3053\u306e\u30b9\u30ad\u30fc\u30de\u3078\u306e\u3053\u306e\u30ed\u30fc\u30eb\u306b\u3088\u308b\u30a2\u30af\u30bb\u30b9\u3092\u8a8d\u53ef\u3059\u308b\u3002 CubeGrant,access=\u3053\u306e\u30ad\u30e5\u30fc\u30d6\u3078\u306e\u3053\u306e\u30ed\u30fc\u30eb\u306b\u3088\u308b\u30a2\u30af\u30bb\u30b9\u3092\u8a8d\u53ef\u3059\u308b\u3002 mondrian-3.11.0.1-R/src/main/mondrian/gui/validate/000077500000000000000000000000001261646570300216525ustar00rootroot00000000000000mondrian-3.11.0.1-R/src/main/mondrian/gui/validate/JdbcValidator.java000066400000000000000000000023701261646570300252270ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.gui.validate; /** * Validation for database schema, table, and columns. Extracted interface from * mondrian.gui.JDBCMetaData. * * @author mlowery */ public interface JdbcValidator { /** * Returns the data type of given column. * * @return SQL type from java.sql.Types */ int getColumnDataType(String schemaName, String tableName, String colName); /** * Returns true if column exists. */ boolean isColExists(String schemaName, String tableName, String colName); /** * Returns true if table exists. */ boolean isTableExists(String schemaName, String tableName); /** * Returns true if this object successfully connected to database (and * validation methods can now be called). */ boolean isInitialized(); /** * Returns true if schema exists. */ boolean isSchemaExists(String schemaName); } // End JdbcValidator.java mondrian-3.11.0.1-R/src/main/mondrian/gui/validate/Messages.java000066400000000000000000000021121261646570300242600ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.gui.validate; /** * Message provider. Extracted interface from mondrian.gui.I18n. * * @author mlowery */ public interface Messages { /** * Returns the string with given key. * * @param stringId key * @param defaultValue default if key does not exist * @return message */ String getString( String stringId, String defaultValue); /** * Returns the string with given key with substitutions. * * @param stringId Key * @param defaultValue default if key does not exist * @param args arguments to substitute * @return message */ String getFormattedString( String stringId, String defaultValue, Object... args); } // End Messages.java mondrian-3.11.0.1-R/src/main/mondrian/gui/validate/TreeModel.java000066400000000000000000000014541261646570300244010ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.gui.validate; /** * A generalization of a javax.swing.tree.TreeModel. * * @author mlowery */ public interface TreeModel { /** * Returns the number of children of parent. */ int getChildCount(Object parent); /** * Returns the child at index. */ Object getChild(Object parent, int index); /** * Returns the root object of this tree model. */ Object getRoot(); } // End TreeModel.java mondrian-3.11.0.1-R/src/main/mondrian/gui/validate/TreeModelPath.java000066400000000000000000000014221261646570300252110ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.gui.validate; /** * A generalization of javax.swing.tree.TreePath. * * @author mlowery */ public interface TreeModelPath { /** * Returns the length of this path. */ int getPathCount(); /** * Returns the component of the path at the given index. */ Object getPathComponent(int element); /** * Returns true if path has no components. */ boolean isEmpty(); } // End TreeModelPath.java mondrian-3.11.0.1-R/src/main/mondrian/gui/validate/ValidationUtils.java000066400000000000000000001354061261646570300256410ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.gui.validate; import mondrian.gui.MondrianGuiDef; import mondrian.gui.SchemaExplorer; import org.apache.log4j.Logger; import java.lang.reflect.Field; import java.util.TreeSet; /** * Validates a MondrianGuiDef. Class contains invalid * method formerly from mondrian.gui.SchemaTreeCellRenderer. * * @author mlowery */ public class ValidationUtils { private static final Logger LOGGER = Logger.getLogger(ValidationUtils.class); static String[] DEF_LEVEL = { "column", "nameColumn", "parentColumn", "ordinalColumn", "captionColumn" }; /** * Validate a schema model and returns the first error message if it is * invalid. * * @param messages Message provider * @param jdbcValidator Validator * @param treeModel Tree model * @param tpath Path * @param value Value * @param cube Cube * @param parentDimension Parent dimension * @param parentHierarchy Parent hierarchy * @param parentLevel Parent level * @param isSchemaRequired Whether schema is required * @return Error message if element is invalid, null if it is valid */ public static String invalid( Messages messages, JdbcValidator jdbcValidator, TreeModel treeModel, TreeModelPath tpath, Object value, MondrianGuiDef.Cube cube, MondrianGuiDef.Dimension parentDimension, MondrianGuiDef.Hierarchy parentHierarchy, MondrianGuiDef.Level parentLevel, boolean isSchemaRequired) { String nameMustBeSet = messages.getString( "schemaTreeCellRenderer.nameMustBeSet.alert", "Name must be set"); if (!tpath.isEmpty()) { int pathcount = tpath.getPathCount(); for (int i = 0; i < pathcount && (cube == null || parentDimension == null || parentHierarchy == null || parentLevel == null); i++) { final Object p = tpath.getPathComponent(i); if (p instanceof MondrianGuiDef.Cube && cube == null) { cube = (MondrianGuiDef.Cube) p; } if (p instanceof MondrianGuiDef.Dimension && parentDimension == null) { parentDimension = (MondrianGuiDef.Dimension) p; } if (p instanceof MondrianGuiDef.Hierarchy && parentHierarchy == null) { parentHierarchy = (MondrianGuiDef.Hierarchy) p; } if (p instanceof MondrianGuiDef.Level && parentLevel == null) { parentLevel = (MondrianGuiDef.Level) p; } } } //Step 1: check validity of this value object if (value instanceof MondrianGuiDef.Schema) { if (isEmpty(((MondrianGuiDef.Schema) value).name)) { return nameMustBeSet; } } else if (value instanceof MondrianGuiDef.VirtualCube) { MondrianGuiDef.VirtualCube virtCube = (MondrianGuiDef.VirtualCube)value; if (isEmpty(virtCube.name)) { return nameMustBeSet; } if (isEmpty(virtCube.dimensions)) { return messages.getString( "schemaTreeCellRenderer.cubeMustHaveDimensions.alert", "Cube must contain dimensions"); } if (isEmpty(virtCube.measures)) { return messages.getString( "schemaTreeCellRenderer.cubeMustHaveMeasures.alert", "Cube must contain measures"); } } else if (value instanceof MondrianGuiDef.VirtualCubeDimension) { if (isEmpty(((MondrianGuiDef.VirtualCubeDimension) value).name)) { return nameMustBeSet; } } else if (value instanceof MondrianGuiDef.VirtualCubeMeasure) { if (isEmpty(((MondrianGuiDef.VirtualCubeMeasure) value).name)) { return nameMustBeSet; } } else if (value instanceof MondrianGuiDef.Cube) { MondrianGuiDef.Cube cubeVal = (MondrianGuiDef.Cube) value; if (isEmpty(cubeVal.name)) { return nameMustBeSet; } if (cubeVal.fact == null || ((cubeVal.fact instanceof MondrianGuiDef.Table) && isEmpty(((MondrianGuiDef.Table) cubeVal.fact).name)) || ((cubeVal.fact instanceof MondrianGuiDef.View) && isEmpty(((MondrianGuiDef.View) cubeVal.fact).alias))) { return messages.getString( "schemaTreeCellRenderer.factNameMustBeSet.alert", "Fact name must be set"); } if (isEmpty(cubeVal.dimensions)) { return messages.getString( "schemaTreeCellRenderer.cubeMustHaveDimensions.alert", "Cube must contain dimensions"); } if (isEmpty(cubeVal.measures)) { return messages.getString( "schemaTreeCellRenderer.cubeMustHaveMeasures.alert", "Cube must contain measures"); } // database validity check, if database connection is successful if (jdbcValidator.isInitialized()) { if (((MondrianGuiDef.Cube) value).fact instanceof MondrianGuiDef.Table) { final MondrianGuiDef.Table table = (MondrianGuiDef.Table) cubeVal.fact; String schemaName = table.schema; String factTable = table.name; if (!jdbcValidator.isTableExists(schemaName, factTable)) { return messages.getFormattedString( "schemaTreeCellRenderer.factTableDoesNotExist.alert", "Fact table {0} does not exist in database {1}", factTable, ((schemaName == null || schemaName.equals("")) ? "." : "schema " + schemaName)); } } } } else { if (value instanceof MondrianGuiDef.CubeDimension) { if (isEmpty(((MondrianGuiDef.CubeDimension) value).name)) { return nameMustBeSet; } if (value instanceof MondrianGuiDef.DimensionUsage) { if (isEmpty( ((MondrianGuiDef.DimensionUsage) value).source)) { return messages.getString( "schemaTreeCellRenderer.sourceMustBeSet.alert", "Source must be set"); } // Check source is name of one of dimensions of schema // (shared dimensions) MondrianGuiDef.Schema s = (MondrianGuiDef.Schema) treeModel.getRoot(); MondrianGuiDef.Dimension ds[] = s.dimensions; String sourcename = ((MondrianGuiDef.DimensionUsage) value).source; boolean notfound = true; for (int j = 0; j < ds.length; j++) { if (ds[j].name.equalsIgnoreCase(sourcename)) { notfound = false; break; } } if (notfound) { return messages.getFormattedString( "schemaTreeCellRenderer.sourceInSharedDimensionDoesNotExist.alert", "Source {0} does not exist as Shared Dimension of Schema", sourcename); } } if (value instanceof MondrianGuiDef.Dimension && cube != null) { if (!isEmpty( ((MondrianGuiDef.Dimension) value).foreignKey)) { // database validity check, if database connection is // successful if (jdbcValidator.isInitialized()) { // TODO: Need to add validation for Views if (cube.fact instanceof MondrianGuiDef.Table) { final MondrianGuiDef.Table factTable = (MondrianGuiDef.Table) cube.fact; String foreignKey = ((MondrianGuiDef.Dimension) value) .foreignKey; if (!jdbcValidator.isColExists( factTable.schema, factTable.name, foreignKey)) { return messages.getFormattedString( "schemaTreeCellRenderer.foreignKeyDoesNotExist.alert", "foreignKey {0} does not exist in fact table", foreignKey); } } } } } } else if (value instanceof MondrianGuiDef.Level) { // Check 'column' exists in 'table' if table is specified // otherwise :: case of join. // It should exist in relation table if it is specified // otherwise :: case of table. // It should exist in fact table :: case of degenerate dimension // where dimension columns exist in fact table and there is no // separate table. MondrianGuiDef.Level level = (MondrianGuiDef.Level) value; if (!isEmpty(level.levelType)) { // Empty leveltype is treated as default value of "Regular"" // which is ok with standard/time dimension. if (parentDimension != null) { if ((isEmpty(parentDimension.type) || parentDimension.type.equals( "StandardDimension")) && !isEmpty(level.levelType) && (!level.levelType.equals( MondrianGuiDef.Level._levelType_values[0]))) { // If dimension type is 'standard' then leveltype // should be 'regular' return messages.getFormattedString( "schemaTreeCellRenderer.levelUsedOnlyInTimeDimension.alert", "levelType {0} can only be used with a TimeDimension", level.levelType); } else if (!isEmpty(parentDimension.type) && (parentDimension.type.equals( "TimeDimension")) && !isEmpty(level.levelType) && (level.levelType.equals( MondrianGuiDef.Level ._levelType_values[0]))) { // If dimension type is 'time' then leveltype value // could be 'timeyears', 'timedays' etc' return messages.getFormattedString( "schemaTreeCellRenderer.levelUsedOnlyInStandardDimension.alert", "levelType {0} can only be used with a StandardDimension", level.levelType); } } } // verify level's name is set if (isEmpty(level.name)) { return messages.getString( "schemaTreeCellRenderer.nameMustBeSet.alert", "Level name must be set" ); } // check level's column is in fact table String column = level.column; if (isEmpty(column)) { if (level.properties == null || level.properties.length == 0) { return messages.getString( "schemaTreeCellRenderer.columnMustBeSet.alert", "Column must be set"); } } else { // Enforces validation for all column types against invalid // value. String theMessage = null; try { for (int i = 0; i < DEF_LEVEL.length; i++) { Field theField = level.getClass().getDeclaredField(DEF_LEVEL[i]); column = (String) theField.get(level); theMessage = validateColumn( column, DEF_LEVEL[i], messages, level, jdbcValidator, cube, parentHierarchy); if (theMessage != null) { break; } } } catch (Exception ex) { LOGGER.error("ValidationUtils", ex); } return theMessage; } } else if (value instanceof MondrianGuiDef.Property) { // Check 'column' exists in 'table' if [level table] is // specified otherwise :: case of join. // It should exist in [hierarchy relation table] if it is // specified otherwise :: case of table. // It should exist in [fact table] :: case of degenerate // dimension where dimension columns exist in fact table and // there is no separate table. MondrianGuiDef.Property p = (MondrianGuiDef.Property) value; // check property's column is in table String column = p.column; if (isEmpty(column)) { return messages.getString( "schemaTreeCellRenderer.columnMustBeSet.alert", "Column must be set"); } // Database validity check, if database connection is successful if (jdbcValidator.isInitialized()) { String table = null; if (parentLevel != null) { // specified table for level's column' table = parentLevel.table; } if (isEmpty(table)) { if (parentHierarchy != null) { if (parentHierarchy.relation == null && cube != null) { // Case of degenerate dimension within cube, // hierarchy table not specified final MondrianGuiDef.Table factTable = (MondrianGuiDef.Table) cube.fact; if (!jdbcValidator.isColExists( factTable.schema, factTable.name, column)) { return messages.getFormattedString( "schemaTreeCellRenderer.degenDimensionColumnDoesNotExist.alert", "Degenerate dimension validation check - Column {0} does not exist in fact table", column); } } else if (parentHierarchy.relation instanceof MondrianGuiDef.Table) { final MondrianGuiDef.Table parentTable = (MondrianGuiDef.Table) parentHierarchy.relation; if (!jdbcValidator.isColExists( parentTable.schema, parentTable.name, column)) { return messages.getFormattedString( "schemaTreeCellRenderer.columnInDimensionDoesNotExist.alert", "Column {0} does not exist in Dimension table", parentTable.name); } } } } else { if (!jdbcValidator.isColExists(null, table, column)) { return messages.getFormattedString( "schemaTreeCellRenderer.columnInDimensionDoesNotExist.alert", "Column {0} does not exist in Level table {1}", column, table); } } } } else if (value instanceof MondrianGuiDef.Measure) { final MondrianGuiDef.Measure measure = (MondrianGuiDef.Measure) value; if (isEmpty(measure.name)) { return nameMustBeSet; } if (isEmpty(measure.aggregator)) { return messages.getString( "schemaTreeCellRenderer.aggregatorMustBeSet.alert", "Aggregator must be set"); } if (measure.measureExp != null) { // Measure expressions are OK } else if (isEmpty(measure.column)) { return messages.getString( "schemaTreeCellRenderer.columnMustBeSet.alert", "Column must be set"); } else if (cube != null && cube.fact != null) { // Database validity check, if database connection is // successful if (cube.fact instanceof MondrianGuiDef.Table) { final MondrianGuiDef.Table factTable = (MondrianGuiDef.Table) cube.fact; if (jdbcValidator.isInitialized()) { String column = measure.column; if (jdbcValidator.isColExists( factTable.schema, factTable.name, column)) { // Check for aggregator type only if column // exists in table. // Check if aggregator selected is valid on // the data type of the column selected. int colType = jdbcValidator.getColumnDataType( factTable.schema, factTable.name, measure.column); // Coltype of 2, 4,5, 7, 8, -5 is numeric types // whereas 1, 12 are char varchar string // and 91 is date type. // Types are enumerated in java.sql.Types. int agIndex = -1; if ("sum".equals( measure.aggregator) || "avg".equals( measure.aggregator)) { // aggregator = sum or avg, column should // be numeric agIndex = 0; } if (!(agIndex == -1 || (colType >= 2 && colType <= 8) || colType == -5 || colType == -6)) { return messages.getFormattedString( "schemaTreeCellRenderer.aggregatorNotValidForColumn.alert", "Aggregator {0} is not valid for the data type of the column {1}", measure.aggregator, measure.column); } } } } } } else if (value instanceof MondrianGuiDef.Hierarchy) { final MondrianGuiDef.Hierarchy hierarchy = (MondrianGuiDef.Hierarchy) value; if (hierarchy.relation instanceof MondrianGuiDef.Join) { if (isEmpty(hierarchy.primaryKeyTable)) { if (isEmpty(hierarchy.primaryKey)) { return messages.getString( "schemaTreeCellRenderer.primaryKeyTableAndPrimaryKeyMustBeSet.alert", "PrimaryKeyTable and PrimaryKey must be set for Join"); } else { return messages.getString( "schemaTreeCellRenderer.primaryKeyTableMustBeSet.alert", "PrimaryKeyTable must be set for Join"); } } if (isEmpty(hierarchy.primaryKey)) { return messages.getString( "schemaTreeCellRenderer.primaryKeyMustBeSet.alert", "PrimaryKey must be set for Join"); } } MondrianGuiDef.Level[] levels = hierarchy.levels; if (levels == null || levels.length == 0) { return messages.getString( "schemaTreeCellRenderer.atLeastOneLevelForHierarchy.alert", "At least one Level must be set for Hierarchy"); } // Validates that value in primaryKey exists in Table. String schema = null; String pkTable = null; if (hierarchy.relation instanceof MondrianGuiDef.Join) { String[] schemaAndTable = SchemaExplorer.getTableNameForAlias( hierarchy.relation, hierarchy.primaryKeyTable); schema = schemaAndTable[0]; pkTable = schemaAndTable[1]; } else if (hierarchy.relation instanceof MondrianGuiDef.Table) { final MondrianGuiDef.Table table = (MondrianGuiDef.Table) hierarchy.relation; pkTable = table.name; schema = table.schema; } if (pkTable != null && !jdbcValidator.isColExists( schema, pkTable, hierarchy.primaryKey)) { return messages.getFormattedString( "schemaTreeCellRenderer.columnInTableDoesNotExist.alert", "Column {0} defined in field {1} does not exist in table {2}", isEmpty(hierarchy.primaryKey.trim()) ? "' '" : hierarchy.primaryKey, "primaryKey", pkTable); } // Validates against primaryKeyTable name on field when using // Table. if (hierarchy.relation instanceof MondrianGuiDef.Table) { if (!isEmpty(hierarchy.primaryKeyTable)) { return messages.getString( "schemaTreeCellRenderer.fieldMustBeEmpty", "Table field must be empty"); } } // Validates that the value at primaryKeyTable corresponds to // tables in joins. String primaryKeyTable = hierarchy.primaryKeyTable; if (!isEmpty(primaryKeyTable) && (hierarchy.relation instanceof MondrianGuiDef.Join)) { TreeSet joinTables = new TreeSet(); SchemaExplorer.getTableNamesForJoin( hierarchy.relation, joinTables); if (!joinTables.contains(primaryKeyTable)) { return messages.getString( "schemaTreeCellRenderer.wrongTableValue", "Table value does not correspond to any join"); } } if (!isEmpty(primaryKeyTable) && (hierarchy.relation instanceof MondrianGuiDef.Table)) { MondrianGuiDef.Table theTable = (MondrianGuiDef.Table) hierarchy.relation; String compareTo = (theTable.alias != null && theTable.alias.trim().length() > 0) ? theTable.alias : theTable.name; if (!primaryKeyTable.equals(compareTo)) { return messages.getString( "schemaTreeCellRenderer.tableDoesNotMatch", "Table value does not correspond to Hierarchy Relation"); } } } else if (value instanceof MondrianGuiDef.NamedSet) { final MondrianGuiDef.NamedSet namedSet = (MondrianGuiDef.NamedSet) value; if (isEmpty(namedSet.name)) { return nameMustBeSet; } if (isEmpty(namedSet.formula) && namedSet.formulaElement == null) { return messages.getString( "schemaTreeCellRenderer.formulaMustBeSet.alert", "Formula must be set"); } } else if (value instanceof MondrianGuiDef.Formula) { final MondrianGuiDef.Formula formula = (MondrianGuiDef.Formula) value; if (isEmpty(formula.cdata)) { return messages.getString( "schemaTreeCellRenderer.formulaMustBeSet.alert", "Formula must be set"); } } else if (value instanceof MondrianGuiDef.UserDefinedFunction) { final MondrianGuiDef.UserDefinedFunction udf = (MondrianGuiDef.UserDefinedFunction) value; if (isEmpty(udf.name)) { return nameMustBeSet; } if (isEmpty(udf.className) && udf.script == null) { return messages.getString( "Either a Class Name or a Script are required", "Class name must be set"); } } else if (value instanceof MondrianGuiDef.MemberFormatter) { final MondrianGuiDef.MemberFormatter f = (MondrianGuiDef.MemberFormatter) value; if (isEmpty(f.className) && f.script == null) { return messages.getString( "schemaTreeCellRenderer.classNameOrScriptRequired.alert", "Either a Class Name or a Script are required"); } } else if (value instanceof MondrianGuiDef.CellFormatter) { final MondrianGuiDef.CellFormatter f = (MondrianGuiDef.CellFormatter) value; if (isEmpty(f.className) && f.script == null) { return messages.getString( "schemaTreeCellRenderer.classNameOrScriptRequired.alert", "Either a Class Name or a Script are required"); } } else if (value instanceof MondrianGuiDef.PropertyFormatter) { final MondrianGuiDef.PropertyFormatter f = (MondrianGuiDef.PropertyFormatter) value; if (isEmpty(f.className) && f.script == null) { return messages.getString( "schemaTreeCellRenderer.classNameOrScriptRequired.alert", "Either a Class Name or a Script are required"); } } else if (value instanceof MondrianGuiDef.CalculatedMember) { final MondrianGuiDef.CalculatedMember calculatedMember = (MondrianGuiDef.CalculatedMember) value; if (isEmpty(calculatedMember.name)) { return nameMustBeSet; } if (isEmpty(calculatedMember.dimension)) { return messages.getString( "schemaTreeCellRenderer.dimensionMustBeSet.alert", "Dimension must be set"); } if (isEmpty(calculatedMember.formula) && calculatedMember.formulaElement == null) { return messages.getString( "schemaTreeCellRenderer.formulaMustBeSet.alert", "Formula must be set"); } } else if (value instanceof MondrianGuiDef.Join) { final MondrianGuiDef.Join join = (MondrianGuiDef.Join) value; if (isEmpty(join.leftKey)) { return messages.getString( "schemaTreeCellRenderer.leftKeyMustBeSet.alert", "Left key must be set"); } if (isEmpty(join.rightKey)) { return messages.getString( "schemaTreeCellRenderer.rightKeyMustBeSet.alert", "Right key must be set"); } } else if (value instanceof MondrianGuiDef.Table) { final MondrianGuiDef.Table table = (MondrianGuiDef.Table) value; String tableName = table.name; if (!jdbcValidator.isTableExists(null, tableName)) { return messages.getFormattedString( "schemaTreeCellRenderer.tableDoesNotExist.alert", "Table {0} does not exist in database", tableName); } String theSchema = table.schema; if (!isEmpty(theSchema) && !jdbcValidator.isSchemaExists(theSchema)) { return messages.getFormattedString( "schemaTreeCellRenderer.schemaDoesNotExist.alert", "Schema {0} does not exist", theSchema); } if (isEmpty(theSchema) && isSchemaRequired) { return messages.getString( "schemaTreeCellRenderer.schemaMustBeSet.alert", "Schema must be set"); } } } // Step 2: check validity of all child objects for this value object. int childCnt = treeModel.getChildCount(value); for (int i = 0; i < childCnt; i++) { Object child = treeModel.getChild(value, i); String childErrMsg; if (child instanceof MondrianGuiDef.Cube) { // check current cube child and its children childErrMsg = invalid( messages, jdbcValidator, treeModel, tpath, child, (MondrianGuiDef.Cube) child, parentDimension, parentHierarchy, parentLevel, isSchemaRequired); } else if (child instanceof MondrianGuiDef.Dimension) { // check the current hierarchy and its children childErrMsg = invalid( messages, jdbcValidator, treeModel, tpath, child, cube, (MondrianGuiDef.Dimension) child, parentHierarchy, parentLevel, isSchemaRequired); } else if (child instanceof MondrianGuiDef.Hierarchy) { // special check for cube dimension where foreign key is blank : // allowed/not allowed if (value instanceof MondrianGuiDef.Dimension && cube != null && ((MondrianGuiDef.Hierarchy) child).relation != null) { if (isEmpty( ((MondrianGuiDef.Dimension) value).foreignKey)) { // check foreignkey is not blank; // if relation is null, foreignkey must be specified return messages.getString( "schemaTreeCellRenderer.foreignKeyMustBeSet.alert", "Foreign key must be set"); } } // check the current hierarchy and its children childErrMsg = invalid( messages, jdbcValidator, treeModel, tpath, child, cube, parentDimension, (MondrianGuiDef.Hierarchy) child, parentLevel, isSchemaRequired); } else if (child instanceof MondrianGuiDef.Level) { // check the current hierarchy and its children childErrMsg = invalid( messages, jdbcValidator, treeModel, tpath, child, cube, parentDimension, parentHierarchy, (MondrianGuiDef.Level) child, isSchemaRequired); } else { // check this child and all its children objects with incoming // cube and hierarchy childErrMsg = invalid( messages, jdbcValidator, treeModel, tpath, child, cube, parentDimension, parentHierarchy, parentLevel, isSchemaRequired); } // If all children are valid then do a special check. // Special check for cubes to see if their child dimensions have // foreign key set and set the childErrMsg with error msg /* === Begin : disabled if (childErrMsg == null) { // all children are valid if (child instanceof MondrianGuiDef.Cube) { MondrianGuiDef.Cube c = (MondrianGuiDef.Cube) child; MondrianGuiDef.CubeDimension [] ds = c.dimensions; for (int j=0; j joinTables = new TreeSet(); SchemaExplorer.getTableNamesForJoin( parentHierarchy.relation, joinTables); if (!joinTables.contains(table)) { return messages.getString( "schemaTreeCellRenderer.wrongTableValue", "Table value does not correspond to any join"); } } if (!isEmpty(table) && parentHierarchy != null && parentHierarchy.relation instanceof MondrianGuiDef.Table) { final MondrianGuiDef.Table parentTable = (MondrianGuiDef.Table) parentHierarchy.relation; MondrianGuiDef.Table theTable = parentTable; String compareTo = (theTable.alias != null && theTable.alias.trim().length() > 0) ? theTable.alias : theTable.name; if (!table.equals(compareTo)) { return messages.getString( "schemaTreeCellRenderer.tableDoesNotMatch", "Table value does not correspond to Hierarchy Relation"); } } if (!isEmpty(table) && parentHierarchy != null && parentHierarchy.relation instanceof MondrianGuiDef.View) { return messages.getString( "schemaTreeCellRenderer.noTableForView", "Table for column cannot be set in View"); } if (isEmpty(table)) { if (parentHierarchy != null) { if (parentHierarchy.relation == null && cube != null) { // case of degenerate dimension within cube, // hierarchy table not specified if (!jdbcValidator.isColExists( ((MondrianGuiDef.Table) cube.fact).schema, ((MondrianGuiDef.Table) cube.fact).name, column)) { return messages.getFormattedString( "schemaTreeCellRenderer.degenDimensionColumnDoesNotExist.alert", "Degenerate dimension validation check - Column {0} does not exist in fact table", column); } } else if (parentHierarchy.relation instanceof MondrianGuiDef.Table) { final MondrianGuiDef.Table parentTable = (MondrianGuiDef.Table) parentHierarchy.relation; if (!jdbcValidator.isColExists( parentTable.schema, parentTable.name, column)) { return messages.getFormattedString( "schemaTreeCellRenderer.columnInTableDoesNotExist.alert", "Column {0} defined in field {1} does not exist in table {2}", isEmpty(column.trim()) ? "' '" : column, fieldName, parentTable.name); } } else if (parentHierarchy.relation instanceof MondrianGuiDef.Join) { // relation is join, table should be specified return messages.getString( "schemaTreeCellRenderer.tableMustBeSet.alert", "Table must be set"); } } } else { String schema = null; // if using Joins then gets the table name for isColExists // validation. if (parentHierarchy != null && parentHierarchy.relation instanceof MondrianGuiDef.Join) { String[] schemaAndTable = SchemaExplorer.getTableNameForAlias( parentHierarchy.relation, table); schema = schemaAndTable[0]; table = schemaAndTable[1]; } if (!jdbcValidator.isColExists(schema, table, column)) { return messages.getFormattedString( "schemaTreeCellRenderer.columnInTableDoesNotExist.alert", "Column {0} defined in field {1} does not exist in table {2}", isEmpty(column.trim()) ? "' '" : column, fieldName, table); } } } } return null; } } // End ValidationUtils.java mondrian-3.11.0.1-R/src/main/mondrian/gui/validate/impl/000077500000000000000000000000001261646570300226135ustar00rootroot00000000000000mondrian-3.11.0.1-R/src/main/mondrian/gui/validate/impl/WorkbenchJdbcValidator.java000066400000000000000000000031171261646570300300330ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.gui.validate.impl; import mondrian.gui.JdbcMetaData; import mondrian.gui.validate.JdbcValidator; import java.util.List; /** * Implementation of JdbcValidator for Workbench. * * @author mlowery */ public class WorkbenchJdbcValidator implements JdbcValidator { private JdbcMetaData jdbcMetadata; public WorkbenchJdbcValidator(JdbcMetaData jdbcMetadata) { super(); this.jdbcMetadata = jdbcMetadata; } public int getColumnDataType( String schemaName, String tableName, String colName) { return jdbcMetadata.getColumnDataType(schemaName, tableName, colName); } public boolean isColExists( String schemaName, String tableName, String colName) { return jdbcMetadata.isColExists(schemaName, tableName, colName); } public boolean isInitialized() { return jdbcMetadata.getErrMsg() == null; } public boolean isTableExists(String schemaName, String tableName) { return jdbcMetadata.isTableExists(schemaName, tableName); } public boolean isSchemaExists(String schemaName) { List theSchemas = jdbcMetadata.getAllSchemas(); return theSchemas != null && theSchemas.contains(schemaName); } } // End WorkbenchJdbcValidator.java mondrian-3.11.0.1-R/src/main/mondrian/gui/validate/impl/WorkbenchMessages.java000066400000000000000000000021501261646570300270660ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.gui.validate.impl; import mondrian.gui.I18n; import mondrian.gui.validate.Messages; /** * Implementation of Messages for Workbench. * * @author mlowery */ public class WorkbenchMessages implements Messages { private final I18n i18n; /** * Creates a WorkbenchMessages. * * @param i18n Resources */ public WorkbenchMessages(I18n i18n) { super(); this.i18n = i18n; } public String getFormattedString( String stringId, String defaultValue, Object... args) { return i18n.getFormattedString(stringId, defaultValue, args); } public String getString(String stringID, String defaultValue) { return i18n.getString(stringID, defaultValue); } } // End WorkbenchMessages.java mondrian-3.11.0.1-R/src/main/mondrian/gui/validate/impl/WorkbenchTreeModel.java000066400000000000000000000021051261646570300271770ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.gui.validate.impl; import mondrian.gui.SchemaTreeModel; import mondrian.gui.validate.TreeModel; /** * Implementation of TreeModel for Workbench. * * @author mlowery */ public class WorkbenchTreeModel implements TreeModel { private SchemaTreeModel schemaTreeModel; public WorkbenchTreeModel(SchemaTreeModel schemaTreeModel) { super(); this.schemaTreeModel = schemaTreeModel; } public Object getChild(Object parent, int index) { return schemaTreeModel.getChild(parent, index); } public int getChildCount(Object parent) { return schemaTreeModel.getChildCount(parent); } public Object getRoot() { return schemaTreeModel.getRoot(); } } // End WorkbenchTreeModel.java mondrian-3.11.0.1-R/src/main/mondrian/gui/validate/impl/WorkbenchTreeModelPath.java000066400000000000000000000020331261646570300300140ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.gui.validate.impl; import mondrian.gui.validate.TreeModelPath; import javax.swing.tree.TreePath; /** * Implementation of TreeModelPath for Workbench. * * @author mlowery */ public class WorkbenchTreeModelPath implements TreeModelPath { TreePath treePath; public WorkbenchTreeModelPath(TreePath treePath) { super(); this.treePath = treePath; } public Object getPathComponent(int element) { return treePath.getPathComponent(element); } public int getPathCount() { return treePath.getPathCount(); } public boolean isEmpty() { return treePath == null || treePath.getPathCount() == 0; } } // End WorkbenchTreeModelPath.java mondrian-3.11.0.1-R/src/main/mondrian/i18n/000077500000000000000000000000001261646570300200545ustar00rootroot00000000000000mondrian-3.11.0.1-R/src/main/mondrian/i18n/LocalizingDynamicSchemaProcessor.java000066400000000000000000000120161261646570300273400ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.i18n; import mondrian.olap.MondrianProperties; import mondrian.olap.Util; import mondrian.spi.DynamicSchemaProcessor; import mondrian.spi.impl.FilterDynamicSchemaProcessor; import org.apache.log4j.Logger; import java.io.InputStream; import java.util.Locale; import java.util.MissingResourceException; import java.util.ResourceBundle; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * Schema processor which helps localize data and metadata. * * @author arosselet * @since August 26, 2005 */ public class LocalizingDynamicSchemaProcessor extends FilterDynamicSchemaProcessor implements DynamicSchemaProcessor { private static final Logger LOGGER = Logger.getLogger(LocalizingDynamicSchemaProcessor.class); /** Creates a new instance of LocalizingDynamicSchemaProcessor */ public LocalizingDynamicSchemaProcessor() { } private ResourceBundle bundle; /** * Regular expression for variables. */ private static final Pattern pattern = Pattern.compile("(%\\{.*?\\})"); /** * Populates the bundle with the given resource. * *

The name of the property file is typically the name of a class, as * per {@link ResourceBundle#getBundle(String)}. However, for backwards * compatibility, the name can contain slashes (which are converted to * dots) and end with ".properties" (which is removed). Therefore * "com/acme/MyResource.properties" is equivalent to * "com.acme.MyResource". * * @see MondrianProperties#LocalePropFile * * @param propFile The name of the property file */ void populate(String propFile) { if (propFile.endsWith(".properties")) { propFile = propFile.substring( 0, propFile.length() - ".properties".length()); } try { bundle = ResourceBundle.getBundle( propFile, Util.parseLocale(locale), getClass().getClassLoader()); } catch (Exception e) { LOGGER.warn( "Mondrian: Warning: no suitable locale file found for locale '" + locale + "'", e); } } private void loadProperties() { String propFile = MondrianProperties.instance().LocalePropFile.get(); if (propFile != null) { populate(propFile); } } public String filter( String schemaUrl, Util.PropertyList connectInfo, InputStream stream) throws Exception { setLocale( connectInfo.get("Locale") == null ? Locale.getDefault().toString() : connectInfo.get("Locale")); loadProperties(); String schema = super.filter(schemaUrl, connectInfo, stream); if (bundle != null) { schema = doRegExReplacements(schema); } LOGGER.debug(schema); return schema; } private String doRegExReplacements(String schema) { // As of JDK 1.5, cannot use StringBuilder - appendReplacement requires // the antediluvian StringBuffer. StringBuffer intlSchema = new StringBuffer(); Matcher match = pattern.matcher(schema); String key; while (match.find()) { key = extractKey(match.group()); int start = match.start(); int end = match.end(); try { String intlProperty = bundle.getString(key); if (intlProperty != null) { match.appendReplacement(intlSchema, intlProperty); } } catch (MissingResourceException e) { LOGGER.error("Missing resource for key [" + key + "]", e); } catch (NullPointerException e) { LOGGER.error( "missing resource key at substring(" + start + "," + end + ")", e); } } match.appendTail(intlSchema); return intlSchema.toString(); } private String extractKey(String group) { // removes leading '%{' and tailing '%' from the matched string // to obtain the required key return group.substring(2, group.length() - 1); } /** * Property locale. */ private String locale; /** * Returns the property locale. * * @return Value of property locale. */ public String getLocale() { return this.locale; } /** * Sets the property locale. * * @param locale New value of property locale. */ public void setLocale(String locale) { this.locale = locale; } } // End LocalizingDynamicSchemaProcessor.java mondrian-3.11.0.1-R/src/main/mondrian/i18n/package.html000066400000000000000000000001241261646570300223320ustar00rootroot00000000000000 Utilities for internationalization and localization. mondrian-3.11.0.1-R/src/main/mondrian/mdx/000077500000000000000000000000001261646570300200655ustar00rootroot00000000000000mondrian-3.11.0.1-R/src/main/mondrian/mdx/DimensionExpr.java000066400000000000000000000034441261646570300235210ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.mdx; import mondrian.calc.Calc; import mondrian.calc.ExpCompiler; import mondrian.calc.impl.ConstantCalc; import mondrian.olap.*; import mondrian.olap.type.DimensionType; import mondrian.olap.type.Type; /** * Usage of a {@link mondrian.olap.Dimension} as an MDX expression. * * @author jhyde * @since Sep 26, 2005 */ public class DimensionExpr extends ExpBase implements Exp { private final Dimension dimension; /** * Creates a dimension expression. * * @param dimension Dimension * @pre dimension != null */ public DimensionExpr(Dimension dimension) { Util.assertPrecondition(dimension != null, "dimension != null"); this.dimension = dimension; } /** * Returns the dimension. * * @post return != null */ public Dimension getDimension() { return dimension; } public String toString() { return dimension.getUniqueName(); } public Type getType() { return DimensionType.forDimension(dimension); } public DimensionExpr clone() { return new DimensionExpr(dimension); } public int getCategory() { return Category.Dimension; } public Exp accept(Validator validator) { return this; } public Calc accept(ExpCompiler compiler) { return ConstantCalc.constantDimension(dimension); } public Object accept(MdxVisitor visitor) { return visitor.visit(this); } } // End DimensionExpr.java mondrian-3.11.0.1-R/src/main/mondrian/mdx/HierarchyExpr.java000066400000000000000000000034431261646570300235110ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.mdx; import mondrian.calc.Calc; import mondrian.calc.ExpCompiler; import mondrian.calc.impl.ConstantCalc; import mondrian.olap.*; import mondrian.olap.type.HierarchyType; import mondrian.olap.type.Type; /** * Usage of a {@link mondrian.olap.Hierarchy} as an MDX expression. * * @author jhyde * @since Sep 26, 2005 */ public class HierarchyExpr extends ExpBase implements Exp { private final Hierarchy hierarchy; /** * Creates a hierarchy expression. * * @param hierarchy Hierarchy * @pre hierarchy != null */ public HierarchyExpr(Hierarchy hierarchy) { Util.assertPrecondition(hierarchy != null, "hierarchy != null"); this.hierarchy = hierarchy; } /** * Returns the hierarchy. * * @post return != null */ public Hierarchy getHierarchy() { return hierarchy; } public String toString() { return hierarchy.getUniqueName(); } public Type getType() { return HierarchyType.forHierarchy(hierarchy); } public HierarchyExpr clone() { return new HierarchyExpr(hierarchy); } public int getCategory() { return Category.Hierarchy; } public Exp accept(Validator validator) { return this; } public Calc accept(ExpCompiler compiler) { return ConstantCalc.constantHierarchy(hierarchy); } public Object accept(MdxVisitor visitor) { return visitor.visit(this); } } // End HierarchyExpr.java mondrian-3.11.0.1-R/src/main/mondrian/mdx/LevelExpr.java000066400000000000000000000032501261646570300226360ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.mdx; import mondrian.calc.Calc; import mondrian.calc.ExpCompiler; import mondrian.calc.impl.ConstantCalc; import mondrian.olap.*; import mondrian.olap.type.LevelType; import mondrian.olap.type.Type; /** * Usage of a {@link mondrian.olap.Level} as an MDX expression. * * @author jhyde * @since Sep 26, 2005 */ public class LevelExpr extends ExpBase implements Exp { private final Level level; /** * Creates a level expression. * * @param level Level * @pre level != null */ public LevelExpr(Level level) { Util.assertPrecondition(level != null, "level != null"); this.level = level; } /** * Returns the level. * * @post return != null */ public Level getLevel() { return level; } public String toString() { return level.getUniqueName(); } public Type getType() { return LevelType.forLevel(level); } public LevelExpr clone() { return new LevelExpr(level); } public int getCategory() { return Category.Level; } public Exp accept(Validator validator) { return this; } public Calc accept(ExpCompiler compiler) { return ConstantCalc.constantLevel(level); } public Object accept(MdxVisitor visitor) { return visitor.visit(this); } } // End LevelExpr.java mondrian-3.11.0.1-R/src/main/mondrian/mdx/MdxVisitor.java000066400000000000000000000045211261646570300230420ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.mdx; import mondrian.olap.*; /** * Interface for a visitor to an MDX parse tree. * * @author jhyde * @since Jul 21, 2006 */ public interface MdxVisitor { /** * @return Indicates whether the visitee should call accept on it's children */ boolean shouldVisitChildren(); /** * Visits a Query. * * @see Query#accept(MdxVisitor) */ Object visit(Query query); /** * Visits a QueryAxis. * * @see QueryAxis#accept(MdxVisitor) */ Object visit(QueryAxis queryAxis); /** * Visits a Formula. * * @see Formula#accept(MdxVisitor) */ Object visit(Formula formula); /** * Visits an UnresolvedFunCall. * * @see UnresolvedFunCall#accept(MdxVisitor) */ Object visit(UnresolvedFunCall call); /** * Visits a ResolvedFunCall. * * @see ResolvedFunCall#accept(MdxVisitor) */ Object visit(ResolvedFunCall call); /** * Visits an Id. * * @see Id#accept(MdxVisitor) */ Object visit(Id id); /** * Visits a Parameter. * * @see ParameterExpr#accept(MdxVisitor) */ Object visit(ParameterExpr parameterExpr); /** * Visits a DimensionExpr. * * @see DimensionExpr#accept(MdxVisitor) */ Object visit(DimensionExpr dimensionExpr); /** * Visits a HierarchyExpr. * * @see HierarchyExpr#accept(MdxVisitor) */ Object visit(HierarchyExpr hierarchyExpr); /** * Visits a LevelExpr. * * @see LevelExpr#accept(MdxVisitor) */ Object visit(LevelExpr levelExpr); /** * Visits a MemberExpr. * * @see MemberExpr#accept(MdxVisitor) */ Object visit(MemberExpr memberExpr); /** * Visits a NamedSetExpr. * * @see NamedSetExpr#accept(MdxVisitor) */ Object visit(NamedSetExpr namedSetExpr); /** * Visits a Literal. * * @see Literal#accept(MdxVisitor) */ Object visit(Literal literal); } // End MdxVisitor.java mondrian-3.11.0.1-R/src/main/mondrian/mdx/MdxVisitorImpl.java000066400000000000000000000055301261646570300236650ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.mdx; import mondrian.olap.*; /** * Default implementation of the visitor interface, {@link MdxVisitor}. * *

The method implementations just ask the child nodes to * {@link Exp#accept(MdxVisitor)} this visitor. * * @author jhyde * @since Jul 21, 2006 */ public class MdxVisitorImpl implements MdxVisitor { private boolean shouldVisitChildren = true; public boolean shouldVisitChildren() { boolean returnValue = shouldVisitChildren; turnOnVisitChildren(); return returnValue; } public void turnOnVisitChildren() { shouldVisitChildren = true; } public void turnOffVisitChildren() { shouldVisitChildren = false; } public Object visit(Query query) { return null; } public Object visit(QueryAxis queryAxis) { return null; } public Object visit(Formula formula) { return null; } public Object visit(UnresolvedFunCall call) { return null; } public Object visit(ResolvedFunCall call) { return null; } public Object visit(Id id) { return null; } public Object visit(ParameterExpr parameterExpr) { return null; } public Object visit(DimensionExpr dimensionExpr) { // do nothing return null; } public Object visit(HierarchyExpr hierarchyExpr) { // do nothing return null; } public Object visit(LevelExpr levelExpr) { // do nothing return null; } public Object visit(MemberExpr memberExpr) { // do nothing return null; } public Object visit(NamedSetExpr namedSetExpr) { // do nothing return null; } public Object visit(Literal literal) { // do nothing return null; } /** * Visits an array of expressions. Returns the same array if none of the * expressions are changed, otherwise a new array. * * @param args Array of expressions * @return Array of visited expressions; same as {@code args} iff none of * the expressions are changed. */ protected Exp[] visitArray(Exp[] args) { Exp[] newArgs = args; for (int i = 0; i < args.length; i++) { Exp arg = args[i]; Exp newArg = (Exp) arg.accept(this); if (newArg != arg) { if (newArgs == args) { newArgs = args.clone(); } newArgs[i] = newArg; } } return newArgs; } } // End MdxVisitorImpl.java mondrian-3.11.0.1-R/src/main/mondrian/mdx/MemberExpr.java000066400000000000000000000034421261646570300230010ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.mdx; import mondrian.calc.Calc; import mondrian.calc.ExpCompiler; import mondrian.calc.impl.ConstantCalc; import mondrian.olap.*; import mondrian.olap.type.MemberType; import mondrian.olap.type.Type; /** * Usage of a {@link mondrian.olap.Member} as an MDX expression. * * @author jhyde * @since Sep 26, 2005 */ public class MemberExpr extends ExpBase implements Exp { private final Member member; private MemberType type; /** * Creates a member expression. * * @param member Member * @pre member != null */ public MemberExpr(Member member) { Util.assertPrecondition(member != null, "member != null"); this.member = member; } /** * Returns the member. * * @post return != null */ public Member getMember() { return member; } public String toString() { return member.getUniqueName(); } public Type getType() { if (type == null) { type = MemberType.forMember(member); } return type; } public MemberExpr clone() { return new MemberExpr(member); } public int getCategory() { return Category.Member; } public Exp accept(Validator validator) { return this; } public Calc accept(ExpCompiler compiler) { return ConstantCalc.constantMember(member); } public Object accept(MdxVisitor visitor) { return visitor.visit(this); } } // End MemberExpr.java mondrian-3.11.0.1-R/src/main/mondrian/mdx/NamedSetExpr.java000066400000000000000000000074331261646570300232760ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.mdx; import mondrian.calc.*; import mondrian.calc.impl.AbstractIterCalc; import mondrian.olap.*; import mondrian.olap.type.Type; import java.util.List; /** * Usage of a {@link mondrian.olap.NamedSet} in an MDX expression. * * @author jhyde * @since Sep 26, 2005 */ public class NamedSetExpr extends ExpBase implements Exp { private final NamedSet namedSet; /** * Creates a usage of a named set. * * @param namedSet namedSet * @pre NamedSet != null */ public NamedSetExpr(NamedSet namedSet) { Util.assertPrecondition(namedSet != null, "namedSet != null"); this.namedSet = namedSet; } /** * Returns the named set. * * @post return != null */ public NamedSet getNamedSet() { return namedSet; } public String toString() { return namedSet.getUniqueName(); } public NamedSetExpr clone() { return new NamedSetExpr(namedSet); } public int getCategory() { return Category.Set; } public Exp accept(Validator validator) { // A set is sometimes used in more than one cube. So, clone the // expression and re-validate every time it is used. // // But keep the expression wrapped in a NamedSet, so that the // expression is evaluated once per query. (We don't want the // expression to be evaluated context-sensitive.) NamedSet namedSet2 = namedSet.validate(validator); if (namedSet2 == namedSet) { return this; } return new NamedSetExpr(namedSet2); } public Calc accept(ExpCompiler compiler) { // This is a deliberate breach of the usual rules for interpreting // acceptable result styles. Usually the caller gets to call the shots: // the callee iterates over the acceptable styles and implements in the // first style it is able to. But in this case, we return iterable if // the caller can handle it, even if it isn't the caller's first choice. // This is because the .current and .currentOrdinal functions only // work correctly on iterators. final List styleList = compiler.getAcceptableResultStyles(); if (!styleList.contains(ResultStyle.ITERABLE) && !styleList.contains(ResultStyle.ANY)) { return null; } return new AbstractIterCalc( this, new Calc[]{/* todo: compile namedSet.getExp() */}) { public TupleIterable evaluateIterable( Evaluator evaluator) { final Evaluator.NamedSetEvaluator eval = getEval(evaluator); return eval.evaluateTupleIterable(evaluator); } public boolean dependsOn(Hierarchy hierarchy) { // Given that a named set is never re-evaluated within the // scope of a query, effectively it's independent of all // dimensions. return false; } }; } public Evaluator.NamedSetEvaluator getEval(Evaluator evaluator) { return evaluator.getNamedSetEvaluator(namedSet, true); } public Object accept(MdxVisitor visitor) { Object o = visitor.visit(this); if (visitor.shouldVisitChildren()) { namedSet.getExp().accept(visitor); } return o; } public Type getType() { return namedSet.getType(); } } // End NamedSetExpr.java mondrian-3.11.0.1-R/src/main/mondrian/mdx/ParameterExpr.java000066400000000000000000000150541261646570300235140ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.mdx; import mondrian.calc.*; import mondrian.olap.*; import mondrian.olap.type.*; import java.io.PrintWriter; import java.util.List; /** * MDX expression which is a usage of a {@link mondrian.olap.Parameter}. * * @author jhyde */ public class ParameterExpr extends ExpBase { private Parameter parameter; /** * Creates a ParameterExpr. * * @param parameter Parameter */ public ParameterExpr(Parameter parameter) { this.parameter = parameter; } public Type getType() { return parameter.getType(); } public int getCategory() { return TypeUtil.typeToCategory(parameter.getType()); } public Exp accept(Validator validator) { // There must be some Parameter with this name registered with the // Query. After clone(), there will be many copies of the same // parameter, and we rely on this method to bring them down to one. // So if this object is not the registered vesion, that's fine, go with // the other one. The registered one will be resolved after everything // else in the query has been resolved. String parameterName = parameter.getName(); final SchemaReader schemaReader = validator.getQuery().getSchemaReader(false); Parameter p = schemaReader.getParameter(parameterName); if (p == null) { this.parameter = validator.createOrLookupParam( true, parameter.getName(), parameter.getType(), parameter.getDefaultExp(), parameter.getDescription()); } else { this.parameter = p; } return this; } public Calc accept(ExpCompiler compiler) { return ((ParameterCompilable) parameter).compile(compiler); } public Object accept(MdxVisitor visitor) { return visitor.visit(this); } public ParameterExpr clone() { return new ParameterExpr(parameter); } /** * Unparses the definition of this Parameter. * *

The first usage of a parameter in a query becomes a call to the * Parameter(paramName, description, defaultValue) * function, and subsequent usages become calls to * ParamRef(paramName) * * @param pw PrintWriter */ public void unparse(PrintWriter pw) { // Is this the first time we've seen a statement parameter? If so, // we will generate a call to the Parameter() function, to define // the parameter. final boolean def; if (pw instanceof QueryPrintWriter && parameter.getScope() == Parameter.Scope.Statement) { def = ((QueryPrintWriter) pw).parameters.add(parameter); } else { def = false; } final String name = parameter.getName(); final Type type = parameter.getType(); final int category = TypeUtil.typeToCategory(type); if (def) { pw.print("Parameter(" + Util.quoteForMdx(name) + ", "); switch (category) { case Category.String: case Category.Numeric: pw.print(Category.instance.getName(category).toUpperCase()); break; case Category.Member: pw.print(uniqueName(type)); break; case Category.Set: Type elementType = ((SetType) type).getElementType(); pw.print(uniqueName(elementType)); break; default: throw Category.instance.badValue(category); } pw.print(", "); final Object value = parameter.getValue(); if (value == null) { parameter.getDefaultExp().unparse(pw); } else if (value instanceof String) { String s = (String) value; pw.print(Util.quoteForMdx(s)); } else if (value instanceof List) { List list = (List) value; pw.print("{"); int i = -1; for (Object o : list) { ++i; if (i > 0) { pw.print(", "); } pw.print(o); } pw.print("}"); } else { pw.print(value); } final String description = parameter.getDescription(); if (description != null) { pw.print(", " + Util.quoteForMdx(description)); } pw.print(")"); } else { pw.print("ParamRef(" + Util.quoteForMdx(name) + ")"); } } /** * Returns the unique name of the level, hierarchy, or dimension of this * type, whichever is most specific. * * @param type Type * @return Most specific description of type */ private String uniqueName(Type type) { if (type.getLevel() != null) { return type.getLevel().getUniqueName(); } else if (type.getHierarchy() != null) { return type.getHierarchy().getUniqueName(); } else { return type.getDimension().getUniqueName(); } } // For the purposes of type inference and expression substitution, a // parameter is atomic; therefore, we ignore the child member, if any. public Object[] getChildren() { return null; } /** * Returns whether this parameter is equal to another, based upon name, * type and value */ public boolean equals(Object other) { if (!(other instanceof ParameterExpr)) { return false; } ParameterExpr that = (ParameterExpr) other; return this.parameter == that.parameter; } public int hashCode() { return parameter.hashCode(); } /** * Returns whether the parameter can be modified. * * @return whether parameter can be modified */ public boolean isModifiable() { return true; } /** * Returns the parameter used by this expression. * * @return parameter used by this expression */ public Parameter getParameter() { return parameter; } } // End ParameterExpr.java mondrian-3.11.0.1-R/src/main/mondrian/mdx/QueryPrintWriter.java000066400000000000000000000015601261646570300242510ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.mdx; import mondrian.olap.Parameter; import java.io.PrintWriter; import java.io.Writer; import java.util.HashSet; import java.util.Set; /** * PrintWriter used for unparsing queries. Remembers which parameters have * been printed. The first time, they print themselves as "Parameter"; * subsequent times as "ParamRef". */ public class QueryPrintWriter extends PrintWriter { final Set parameters = new HashSet(); public QueryPrintWriter(Writer writer) { super(writer); } } // End QueryPrintWriter.java mondrian-3.11.0.1-R/src/main/mondrian/mdx/ResolvedFunCall.java000066400000000000000000000077731261646570300237760ustar00rootroot00000000000000/* // This software is subject to the terms of the Eclipse Public License v1.0 // Agreement, available at the following URL: // http://www.eclipse.org/legal/epl-v10.html. // You must accept the terms of that agreement to use this software. // // Copyright (C) 1998-2005 Julian Hyde // Copyright (C) 2005-2007 Pentaho and others // All Rights Reserved. */ package mondrian.mdx; import mondrian.calc.Calc; import mondrian.calc.ExpCompiler; import mondrian.olap.*; import mondrian.olap.fun.FunUtil; import mondrian.olap.type.Type; import java.io.PrintWriter; /** * A ResolvedFunCall is a function applied to a list of operands, * which has been validated and resolved to a * {@link FunDef function definition}. * * @author jhyde * @since Jan 6, 2006 */ public final class ResolvedFunCall extends ExpBase implements FunCall { /** * The arguments to the function call. Note that for methods, 0-th arg is * 'this'. */ private final Exp[] args; /** * Return type of this function call. */ private final Type returnType; /** * Function definition. */ private final FunDef funDef; /** * Creates a function call. * * @param funDef Function definition * @param args Arguments * @param returnType Return type */ public ResolvedFunCall(FunDef funDef, Exp[] args, Type returnType) { assert funDef != null; assert args != null; assert returnType != null; this.funDef = funDef; this.args = args; this.returnType = returnType; } public String toString() { return Util.unparse(this); } @SuppressWarnings({"CloneDoesntCallSuperClone"}) public ResolvedFunCall clone() { return new ResolvedFunCall( funDef, ExpBase.cloneArray(args), returnType); } /** * Returns the Exp argument at the specified index. * * @param index the index of the Exp. * @return the Exp at the specified index of this array of Exp. * The first Exp is at index 0. * @see #getArgs() */ public Exp getArg(int index) { return args[index]; } /** * Returns the internal array of Exp arguments. * *

Note: this does NOT do a copy. * * @return the array of expressions */ public Exp[] getArgs() { return args; } /** * Returns the number of arguments. * * @return number of arguments. * @see #getArgs() */ public final int getArgCount() { return args.length; } public String getFunName() { return funDef.getName(); } public Syntax getSyntax() { return funDef.getSyntax(); } public Object[] getChildren() { return args; } /** * Returns the definition of the function which is being called. * * @return function definition */ public FunDef getFunDef() { return funDef; } public final int getCategory() { return funDef.getReturnCategory(); } public final Type getType() { return returnType; } public Exp accept(Validator validator) { // even though the function has already been validated, we need // to walk through the arguments to determine which measures are // referenced Exp[] newArgs = new Exp[args.length]; FunUtil.resolveFunArgs( validator, funDef, args, newArgs, getFunName(), getSyntax()); return this; } public void unparse(PrintWriter pw) { funDef.unparse(args, pw); } public Calc accept(ExpCompiler compiler) { return funDef.compileCall(this, compiler); } public Object accept(MdxVisitor visitor) { final Object o = visitor.visit(this); if (visitor.shouldVisitChildren()) { // visit the call's arguments for (Exp arg : args) { arg.accept(visitor); } } return o; } } // End ResolvedFunCall.java mondrian-3.11.0.1-R/src/main/mondrian/mdx/UnresolvedFunCall.java000066400000000000000000000103001261646570300243150ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.mdx; import mondrian.calc.Calc; import mondrian.calc.ExpCompiler; import mondrian.olap.*; import mondrian.olap.fun.FunUtil; import mondrian.olap.type.Type; import java.io.PrintWriter; /** * An expression consisting of a named function or operator * applied to a set of arguments. The syntax determines whether this is * called infix, with function call syntax, and so forth. * * @author jhyde * @since Sep 28, 2005 */ public class UnresolvedFunCall extends ExpBase implements FunCall { private final String name; private final Syntax syntax; private final Exp[] args; /** * Creates a function call with {@link Syntax#Function} syntax. */ public UnresolvedFunCall(String name, Exp[] args) { this(name, Syntax.Function, args); } /** * Creates a function call. */ public UnresolvedFunCall(String name, Syntax syntax, Exp[] args) { assert name != null; assert syntax != null; assert args != null; this.name = name; this.syntax = syntax; this.args = args; switch (syntax) { case Braces: Util.assertTrue(name.equals("{}")); break; case Parentheses: Util.assertTrue(name.equals("()")); break; case Internal: Util.assertTrue(name.startsWith("$")); break; case Empty: Util.assertTrue(name.equals("")); break; default: Util.assertTrue( !name.startsWith("$") && !name.equals("{}") && !name.equals("()")); break; } } @SuppressWarnings({"CloneDoesntCallSuperClone"}) public UnresolvedFunCall clone() { return new UnresolvedFunCall(name, syntax, ExpBase.cloneArray(args)); } public int getCategory() { throw new UnsupportedOperationException(); } public Type getType() { throw new UnsupportedOperationException(); } public void unparse(PrintWriter pw) { syntax.unparse(name, args, pw); } public Object accept(MdxVisitor visitor) { final Object o = visitor.visit(this); if (visitor.shouldVisitChildren()) { // visit the call's arguments for (Exp arg : args) { arg.accept(visitor); } } return o; } public Exp accept(Validator validator) { Exp[] newArgs = new Exp[args.length]; FunDef funDef = FunUtil.resolveFunArgs( validator, null, args, newArgs, name, syntax); return funDef.createCall(validator, newArgs); } public Calc accept(ExpCompiler compiler) { throw new UnsupportedOperationException(); } /** * Returns the function name. * * @return function name */ public String getFunName() { return name; } /** * Returns the syntax of this function call. * * @return the syntax of the call */ public Syntax getSyntax() { return syntax; } /** * Returns the Exp argument at the specified index. * * @param index the index of the Exp. * @return the Exp at the specified index of this array of Exp. * The first Exp is at index 0. * @see #getArgs() */ public Exp getArg(int index) { return args[index]; } /** * Returns the internal array of Exp arguments. * *

Note: this does NOT do a copy. * * @return the array of expressions */ public Exp[] getArgs() { return args; } /** * Returns the number of arguments. * * @return number of arguments. * @see #getArgs() */ public final int getArgCount() { return args.length; } public Object[] getChildren() { return args; } } // End UnresolvedFunCall.java mondrian-3.11.0.1-R/src/main/mondrian/mdx/package.html000066400000000000000000000004401261646570300223440ustar00rootroot00000000000000 Defines a parse tree for MDX expressions.

At present, many of the parse tree expression types ({@link mondrian.olap.Exp}, {@link mondrian.olap.Literal}, etc.) are in the mondrian.olap package, but they will be migrated in mondrian 1.3.

mondrian-3.11.0.1-R/src/main/mondrian/olap/000077500000000000000000000000001261646570300202305ustar00rootroot00000000000000mondrian-3.11.0.1-R/src/main/mondrian/olap/Access.java000066400000000000000000000020251261646570300222730ustar00rootroot00000000000000/* // This software is subject to the terms of the Eclipse Public License v1.0 // Agreement, available at the following URL: // http://www.eclipse.org/legal/epl-v10.html. // You must accept the terms of that agreement to use this software. // // Copyright (C) 2003-2005 Julian Hyde // Copyright (C) 2005-2012 Pentaho and others // All Rights Reserved. */ package mondrian.olap; /** * Access enumerates the allowable access rights. * * @author jhyde * @since Feb 21, 2003 */ public enum Access { /** No access to an object and its children. */ NONE, /** * A grant that covers none of the children * unless explicitly granted. */ CUSTOM, /** * Grant that covers all children except those denied. * (internal use only) */ RESTRICTED, /** Access to all shared dimensions (applies to schema grant). */ ALL_DIMENSIONS, /** All access to an object and its children. */ ALL; public String toString() { return this.name(); }; } // End Access.java mondrian-3.11.0.1-R/src/main/mondrian/olap/Aggregator.java000066400000000000000000000047441261646570300231660ustar00rootroot00000000000000/* // This software is subject to the terms of the Eclipse Public License v1.0 // Agreement, available at the following URL: // http://www.eclipse.org/legal/epl-v10.html. // You must accept the terms of that agreement to use this software. // // Copyright (C) 2003-2005 Julian Hyde // Copyright (C) 2005-2012 Pentaho // All Rights Reserved. */ package mondrian.olap; import mondrian.calc.Calc; import mondrian.calc.TupleList; import mondrian.spi.Dialect.Datatype; import mondrian.spi.SegmentBody; import java.util.List; /** * Describes an aggregation operator, such as "sum" or "count". * * @see FunDef * @see Evaluator * * @author jhyde$ * @since Jul 9, 2003$ */ public interface Aggregator { /** * Returns the aggregator used to combine sub-totals into a grand-total. * * @return aggregator used to combine sub-totals into a grand-total */ Aggregator getRollup(); /** * Applies this aggregator to an expression over a set of members and * returns the result. * * @param evaluator Evaluation context * @param members List of members, not null * @param calc Expression to evaluate * * @return result of applying this aggregator to a set of members/tuples */ Object aggregate(Evaluator evaluator, TupleList members, Calc calc); /** * Tells Mondrian if this aggregator can perform fast aggregation * using only the raw data of a given object type. This will * determine if Mondrian will attempt to perform in-memory rollups * on raw segment data by invoking {@link #aggregate}. * *

This is only invoked for rollup operations. * * @param datatype The datatype of the object we would like to rollup. * @return Whether this aggregator supports fast aggregation */ boolean supportsFastAggregates(Datatype datatype); /** * Applies this aggregator over a raw list of objects for a rollup * operation. This is useful when the values are already resolved * and we are dealing with a raw {@link SegmentBody} object. * *

Only gets called if * {@link #supportsFastAggregates(mondrian.spi.Dialect.Datatype)} is true. * *

This is only invoked for rollup operations. * * @param rawData An array of values in its raw form, to be aggregated. * @return A rolled up value of the raw data. * if the object type is not supported. */ Object aggregate(List rawData, Datatype datatype); } // End Aggregator.java mondrian-3.11.0.1-R/src/main/mondrian/olap/Annotated.java000066400000000000000000000012651261646570300230140ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.olap; import java.util.Map; /** * An element that has annotations. * * @author jhyde */ public interface Annotated { /** * Returns a list of annotations. * *

The map may be empty, never null. * * @return Map from annotation name to annotations. */ Map getAnnotationMap(); } // End Annotated.java mondrian-3.11.0.1-R/src/main/mondrian/olap/Annotation.java000066400000000000000000000014401261646570300232040ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.olap; /** * User-defined property on a metadata element. * * @see mondrian.olap.Annotated * * @author jhyde */ public interface Annotation { /** * Returns the name of this annotation. Must be unique within its element. * * @return Annotation name */ String getName(); /** * Returns the value of this annotation. Usually a string. * * @return Annotation value */ Object getValue(); } // End Annotation.java mondrian-3.11.0.1-R/src/main/mondrian/olap/Axis.java000066400000000000000000000011761261646570300220040ustar00rootroot00000000000000/* // This software is subject to the terms of the Eclipse Public License v1.0 // Agreement, available at the following URL: // http://www.eclipse.org/legal/epl-v10.html. // You must accept the terms of that agreement to use this software. // // Copyright (C) 2001-2005 Julian Hyde // Copyright (C) 2005-2007 Pentaho and others // All Rights Reserved. */ package mondrian.olap; import java.util.List; /** * A Axis is a component of a {@link Result}. * It contains a list of {@link Position}s. * * @author jhyde * @since 6 August, 2001 */ public interface Axis { List getPositions(); } // End Axis.java mondrian-3.11.0.1-R/src/main/mondrian/olap/AxisOrdinal.java000066400000000000000000000051601261646570300233120ustar00rootroot00000000000000/* // This software is subject to the terms of the Eclipse Public License v1.0 // Agreement, available at the following URL: // http://www.eclipse.org/legal/epl-v10.html. // You must accept the terms of that agreement to use this software. // // Copyright (C) 2003-2005 Julian Hyde // Copyright (C) 2005-2009 Pentaho // All Rights Reserved. */ package mondrian.olap; /** * AxisOrdinal describes the allowable values for an axis code. * * @author jhyde * @since Feb 21, 2003 */ public interface AxisOrdinal { /** * Returns the name of this axis, e.g. "COLUMNS", "SLICER", "AXIS(17)". * * @return Name of the axis */ String name(); /** * Returns the ordinal of this axis. * {@link StandardAxisOrdinal#COLUMNS} = 0, * {@link StandardAxisOrdinal#ROWS} = 1, etc. * * @return ordinal of this axis */ int logicalOrdinal(); /** * Returns whether this is the filter (slicer) axis. * * @return whether this is the filter axis */ boolean isFilter(); public enum StandardAxisOrdinal implements AxisOrdinal { /** No axis.*/ NONE, /** Slicer axis. */ SLICER, /** Columns axis (also known as X axis), logical ordinal = 0. */ COLUMNS, /** Rows axis (also known as Y axis), logical ordinal = 1. */ ROWS, /** Pages axis, logical ordinal = 2. */ PAGES, /** Chapters axis, logical ordinal = 3. */ CHAPTERS, /** Sections axis, logical ordinal = 4. */ SECTIONS; /** * Returns an axis with a given number. * *

If ordinal is greater than 4, returns a non-standard axis called * "AXIS(n)". Never returns null. * * @param ordinal Ordinal * @return Axis */ public static AxisOrdinal forLogicalOrdinal(final int ordinal) { if (ordinal + 2 > SECTIONS.ordinal()) { return new AxisOrdinal() { public String name() { return "AXIS(" + ordinal + ")"; } public int logicalOrdinal() { return ordinal; } public boolean isFilter() { return false; } }; } else { return values()[ordinal + 2]; } } public int logicalOrdinal() { return ordinal() - 2; } public boolean isFilter() { return this == SLICER; } } } // End AxisOrdinal.java mondrian-3.11.0.1-R/src/main/mondrian/olap/CacheControl.java000066400000000000000000000344151261646570300234460ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.olap; import java.io.PrintWriter; import java.util.List; import java.util.Map; import javax.sql.DataSource; /** * API for controlling the contents of the cell cache and the member cache. * A {@link CellRegion} denotes a portion of the cell cache, and a * {@link MemberSet} denotes a portion of the member cache. Both caches can be * flushed, and the member cache can be edited. * *

To create an instance of this interface, use * {@link mondrian.olap.Connection#getCacheControl}.

* *

Methods concerning cell cache:

    *
  • {@link #createMemberRegion(Member, boolean)}
  • *
  • {@link #createMemberRegion(boolean, Member, boolean, Member, boolean)}
  • *
  • {@link #createUnionRegion(mondrian.olap.CacheControl.CellRegion[])}
  • *
  • {@link #createCrossjoinRegion(mondrian.olap.CacheControl.CellRegion[])}
  • *
  • {@link #createMeasuresRegion(Cube)}
  • *
  • {@link #flush(mondrian.olap.CacheControl.CellRegion)}
  • *

* *

Methods concerning member cache:

    *
  • {@link #createMemberSet(Member, boolean)}
  • *
  • {@link #createMemberSet(boolean, Member, boolean, Member, boolean)}
  • *
  • {@link #createAddCommand(Member)}
  • *
  • {@link #createDeleteCommand(Member)}
  • *
  • {@link #createDeleteCommand(mondrian.olap.CacheControl.MemberSet)}
  • *
  • {@link #createCompoundCommand(java.util.List)}
  • *
  • {@link #createCompoundCommand(mondrian.olap.CacheControl.MemberEditCommand[])}
  • *
  • {@link #createSetPropertyCommand(Member, String, Object)}
  • *
  • {@link #createSetPropertyCommand(mondrian.olap.CacheControl.MemberSet,java.util.Map)}
  • *
  • {@link #flush(mondrian.olap.CacheControl.MemberSet)}
  • *
  • {@link #execute(mondrian.olap.CacheControl.MemberEditCommand)}
  • *

* * @author jhyde * @since Sep 27, 2006 */ public interface CacheControl { // cell cache control /** * Creates a cell region consisting of a single member. * * @param member the member * @param descendants When true, include descendants of the member in the * region. * @return the new cell region */ CellRegion createMemberRegion(Member member, boolean descendants); /** * Creates a cell region consisting of a range between two members. * *

The members must belong to the same level of the same hierarchy. * One of the bounds may be null. * *

For example, given * *

Member member97Q3; // [Time].[1997].[Q3]
     * Member member98Q2; // [Time].[1998].[Q2]
     * 
* * then * * * * * * * * * * * * * * * * * * * * * *
ExpressionMeaning
* createMemberRegion(true, member97Q3, true, member98Q2, * false) * The members between 97Q3 and 98Q2, inclusive:
* [Time].[1997].[Q3],
* [Time].[1997].[Q4],
* [Time].[1998].[Q1],
* [Time].[1998].[Q2]
* createMemberRegion(true, member97Q3, false, member98Q2, * false) * The members between 97Q3 and 98Q2, exclusive:
* [Time].[1997].[Q4],
* [Time].[1998].[Q1]
* createMemberRegion(true, member97Q3, false, member98Q2, * false) * The members between 97Q3 and 98Q2, including their descendants, and * including the lower bound but not the upper bound:
* [Time].[1997].[Q3],
* [Time].[1997].[Q3].[7],
* [Time].[1997].[Q3].[8],
* [Time].[1997].[Q3].[9],
* [Time].[1997].[Q4],
* [Time].[1997].[Q4].[10],
* [Time].[1997].[Q4].[11],
* [Time].[1997].[Q4].[12],
* [Time].[1998].[Q1],
* [Time].[1998].[Q1].[1],
* [Time].[1998].[Q1].[2],
* [Time].[1998].[Q1].[3]
* * @param lowerInclusive whether the the range includes the lower bound; * ignored if the lower bound is not specified * @param lowerMember lower bound member. * If null, takes all preceding members * @param upperInclusive whether the the range includes the upper bound; * ignored if the upper bound is not specified * @param upperMember upper bound member. * If null, takes all preceding members * @param descendants when true, include descendants of the member in the * region * @return the new cell region */ CellRegion createMemberRegion( boolean lowerInclusive, Member lowerMember, boolean upperInclusive, Member upperMember, boolean descendants); /** * Forms the cartesian product of two or more cell regions. * @param regions the operands * @return the cartesian product of the operands */ CellRegion createCrossjoinRegion(CellRegion... regions); /** * Forms the union of two or more cell regions. * The regions must have the same dimensionality. * * @param regions the operands * @return the cartesian product of the operands */ CellRegion createUnionRegion(CellRegion... regions); /** * Creates a region consisting of all measures in a given cube. * @param cube a cube * @return the region */ CellRegion createMeasuresRegion(Cube cube); /** * Atomically flushes all the cells in the cell cache that correspond to * measures in a cube and to a given region. * * @param region a region */ void flush(CellRegion region); /** * Prints the state of the cell cache as it pertains to a given region. * @param pw the output target * @param region the CellRegion of interest */ void printCacheState(PrintWriter pw, CellRegion region); // member cache control /** * Creates a member set containing either a single member, or a member and * its descendants. * @param member a member * @param descendants when true, include descendants in the set * @return the set */ MemberSet createMemberSet(Member member, boolean descendants); /** * Creates a member set consisting of a range between two members. * The members must belong to the same level of the same hierarchy. One of * the bounds may be null. (Similar to {@link #createMemberRegion(boolean, * Member, boolean, Member, boolean)}, which see for examples.) * * @param lowerInclusive whether the the range includes the lower bound; * ignored if the lower bound is not specified * @param lowerMember lower bound member. * If null, takes all preceding members * @param upperInclusive whether the the range includes the upper bound; * ignored if the upper bound is not specified * @param upperMember upper bound member. * If null, takes all preceding members * @param descendants when true, include descendants of the member in the * region * @return the set */ MemberSet createMemberSet( boolean lowerInclusive, Member lowerMember, boolean upperInclusive, Member upperMember, boolean descendants); /** * Forms the union of two or more member sets. * * @param sets the operands * @return the union of the operands */ MemberSet createUnionSet(MemberSet... sets); /** * Filters a member set, keeping all members at a given Level. * * @param level Level * @param baseSet Member set * @return Member set with members not at the given level removed */ MemberSet filter(Level level, MemberSet baseSet); /** * Atomically flushes all members in the member cache which belong to a * given set. * * @param set a set of members */ void flush(MemberSet set); /** * Prints the state of the member cache as it pertains to a given member * set. * @param pw the output target * @param set the MemberSet of interest */ void printCacheState(PrintWriter pw, MemberSet set); // edit member cache contents /** * Executes a command that edits the member cache. * @param cmd the command */ void execute(MemberEditCommand cmd); /** * Builds a compound command which is executed atomically. * * @param cmds a list of the component commands * @return the compound command */ MemberEditCommand createCompoundCommand(List cmds); /** * Builds a compound command which is executed atomically. * @param cmds the component commands * @return the compound command */ MemberEditCommand createCompoundCommand(MemberEditCommand... cmds); // commands to change the structure of the member cache /** * Creates a command to delete a member and its descendants from the member * cache. * * @param member the member * @return the command */ MemberEditCommand createDeleteCommand(Member member); /** * Creates a command to delete a set of members from the member cache. * * @param memberSet the set * @return the command */ MemberEditCommand createDeleteCommand(MemberSet memberSet); /** * Creates a command to add a member to the cache. The added member and its * parent must have the same Dimension and the correct Levels, Null parent * means add to the top level of its Dimension. * *

The ordinal position of the new member among its siblings is implied * by its properties.

* * @param member the new member * @return the command * * @throws IllegalArgumentException if member null * or if member belongs to a parent-child hierarchy */ MemberEditCommand createAddCommand( Member member) throws IllegalArgumentException; /** * Creates a command to Move a member (with its descendants) to a new * location, that is to a new parent. * @param member the member moved * @param loc the new parent * @return the command * * @throws IllegalArgumentException if member is null, * or loc is null, * or member belongs to a parent-child hierarchy, * or if loc is incompatible with member */ MemberEditCommand createMoveCommand( Member member, Member loc) throws IllegalArgumentException; // commands to change member properties /** * Creates a command to change one property of a member. * * @param member the member * @param name the property name * @param value the property value * @return the command * @throws IllegalArgumentException if the property is invalid for the * member */ MemberEditCommand createSetPropertyCommand( Member member, String name, Object value) throws IllegalArgumentException; /** * Creates a command to several properties changes over a set of * members. All members must belong to the same Level. * * @param set the set of members * @param propertyValues Collection of property-value pairs * @return the command * @throws IllegalArgumentException for an invalid property, or if all * members in the set do not belong to the same Level. */ MemberEditCommand createSetPropertyCommand( MemberSet set, Map propertyValues) throws IllegalArgumentException; // other /** * Prints a debug message. * * @param message the message */ void trace(String message); /** * Tells if tracing is enabled. */ boolean isTraceEnabled(); /** * Flushes the cache which maps schema URLs to metadata. * *

This cache is referenced only when creating a new connection, so * existing connections will continue to use the same schema definition. * *

Flushing the schema cache will flush all aggregations and segments * associated to it as well. */ void flushSchemaCache(); /** * Flushes the given Schema instance from the pool. It resolves the * schema to flush by using its catalog URL, connection key and * JDBC username. * *

Flushing the schema cache will flush all aggregations and segments * associated to it as well. */ void flushSchema( final String catalogUrl, final String connectionKey, final String jdbcUser, String dataSourceStr); /** * Flushes the given Schema instance from the pool. It resolves the * schema to flush by using its catalog URL and DataSource object. * *

Flushing the schema cache will flush all aggregations and segments * associated to it as well. */ void flushSchema( String catalogUrl, DataSource dataSource); /** * Flushes the given Schema instance from the pool * *

Flushing the schema cache will flush all aggregations and segments * associated to it as well. * * @param schema Schema */ void flushSchema(Schema schema); /** a region of cells in the cell cache */ public interface CellRegion { /** * Returns the dimensionality of a region. * @return a list of {@link mondrian.olap.Dimension} objects. */ List getDimensionality(); } /** * A specification of a set of members in the member cache. * *

Member sets can be created using methods * {@link CacheControl#createMemberSet(Member, boolean)}, * {@link CacheControl#createMemberSet(boolean, Member, boolean, Member, boolean)}, * {@link CacheControl#createUnionSet(mondrian.olap.CacheControl.MemberSet[])}. */ public interface MemberSet { } /** * An operation to be applied to the member cache. The operation does not * take effect until {@link CacheControl#execute} is called. */ public interface MemberEditCommand { } } // End CacheControl.java mondrian-3.11.0.1-R/src/main/mondrian/olap/Category.java000066400000000000000000000122431261646570300226520ustar00rootroot00000000000000/* // This software is subject to the terms of the Eclipse Public License v1.0 // Agreement, available at the following URL: // http://www.eclipse.org/legal/epl-v10.html. // You must accept the terms of that agreement to use this software. // // Copyright (C) 2003-2005 Julian Hyde // Copyright (C) 2005-2009 Pentaho // All Rights Reserved. */ package mondrian.olap; /** * Category enumerates the possible expression types. * *

Values of this enumeration are returned by {@link Exp#getCategory()}, * {@link FunDef#getParameterCategories()}, and * {@link FunDef#getReturnCategory()}. * *

For modern code, the more descriptive type system * ({@link mondrian.olap.type.Type}) is preferred. * * @author jhyde * @since Feb 21, 2003 */ public class Category extends EnumeratedValues { /** * The singleton instance of Category. */ public static final Category instance = new Category(); private Category() { super( new String[] { "unknown", "array", "dimension", "hierarchy", "level", "logical", "member", "numeric", "set", "string", "tuple", "symbol", "cube", "value", "integer", "null", "empty", "datetime", }, new int[] { Unknown, Array, Dimension, Hierarchy, Level, Logical, Member, Numeric, Set, String, Tuple, Symbol, Cube, Value, Integer, Null, Empty, DateTime, }, new String[] { "Unknown", "Array", "Dimension", "Hierarchy", "Level", "Logical Expression", "Member", "Numeric Expression", "Set", "String", "Tuple", "Symbol", "Cube", "Value", "Integer", "Null", "Empty", "DateTime", } ); } /** * Returns the singleton instance of Category. * * @return the singleton instance */ public static Category instance() { return instance; } /** * Unknown is an expression whose type is as yet unknown. */ public static final int Unknown = 0; /** * Array is an expression of array type. */ public static final int Array = 1; /** * Dimension is a dimension expression. * @see Dimension */ public static final int Dimension = 2; /** * Hierarchy is a hierarchy expression. * @see Hierarchy */ public static final int Hierarchy = 3; /** * Level is a level expression. * @see Level */ public static final int Level = 4; /** * Logical is a boolean expression. */ public static final int Logical = 5; /** * Member is a member expression. * @see Member */ public static final int Member = 6; /** * Numeric is a numeric expression. */ public static final int Numeric = 7; /** * Set is a set of members or tuples. */ public static final int Set = 8; /** * String is a string expression. */ public static final int String = 9; /** * Tuple is a tuple expression. */ public static final int Tuple = 10; /** * Symbol is a symbol, for example the BASC * keyword to the Order() function. */ public static final int Symbol = 11; /** * Cube is a cube expression. * @see Cube */ public static final int Cube = 12; /** * Value is any expression yielding a string or numeric value. */ public static final int Value = 13; /** * Integer is an integer expression. This is a subtype of * {@link #Numeric}. */ public static final int Integer = 15; /** * Represents a Null value */ public static final int Null = 16; /** * Represents an empty expression. */ public static final int Empty = 17; /** * Represents a DataTime expression. */ public static final int DateTime = 18; /** * Expression is a flag which, when bitwise-OR-ed with a * category value, indicates an expression (as opposed to a constant). */ public static final int Expression = 0; /** Constant is a flag which, when bitwise-OR-ed with a * category value, indicates a constant (as opposed to an expression). */ public static final int Constant = 64; /** Mask is a mask to remove flags. */ public static final int Mask = 31; /** * Returns whether a category represents a scalar type. * * @param category Category * @return Whether is scalar */ public static boolean isScalar(int category) { switch (category & Mask) { case Value: case Logical: case Numeric: case Integer: case String: case DateTime: return true; default: return false; } } } // End Category.java mondrian-3.11.0.1-R/src/main/mondrian/olap/Cell.java000066400000000000000000000110671261646570300217570ustar00rootroot00000000000000/* // This software is subject to the terms of the Eclipse Public License v1.0 // Agreement, available at the following URL: // http://www.eclipse.org/legal/epl-v10.html. // You must accept the terms of that agreement to use this software. // // Copyright (C) 2001-2005 Julian Hyde // Copyright (C) 2005-2009 Pentaho and others // All Rights Reserved. */ package mondrian.olap; import org.olap4j.AllocationPolicy; import org.olap4j.Scenario; import java.util.List; /** * A Cell is an item in the grid of a {@link Result}. It is * returned by {@link Result#getCell}. * * @author jhyde * @since 6 August, 2001 */ public interface Cell { /** * Returns the coordinates of this Cell in its {@link Result}. * * @return Coordinates of this Cell */ List getCoordinateList(); /** * Returns the cell's raw value. This is useful for sending to further data * processing, such as plotting a chart. * *

The value is never null. It may have various types:

    *
  • if the cell is null, the value is {@link Util#nullValue};
  • *
  • if the cell contains an error, the value is an instance of * {@link Throwable};
  • *
  • otherwise, the type of this value depends upon the type of * measure: possible types include {@link java.math.BigDecimal}, * {@link Double}, {@link Integer} and {@link String}.
  • *
* * @post return != null * @post (return instanceof Throwable) == isError() * @post (return instanceof Util.NullCellValue) == isNull() */ Object getValue(); /** * Return the cached formatted string, that survives an aggregate cache * clear. */ String getCachedFormatString(); /** * Returns the cell's value formatted according to the current format * string, and locale-specific settings such as currency symbol. The * current format string may itself be derived via an expression. For more * information about format strings, see {@link mondrian.util.Format}. */ String getFormattedValue(); /** * Returns whether the cell's value is null. */ boolean isNull(); /** * Returns whether the cell's calculation returned an error. */ boolean isError(); /** * Returns a SQL query that, when executed, returns drill through data * for this Cell. * *

If the parameter {@code extendedContext} is true, then the query will * include all the levels (i.e. columns) of non-constraining members * (i.e. members which are at the "All" level). * *

If the parameter {@code extendedContext} is false, the query will * exclude the levels (coulmns) of non-constraining members. * *

The result is null if the cell is based upon a calculated member. */ String getDrillThroughSQL(boolean extendedContext); /** * Returns true if drill through is possible for this Cell. * Returns false if the Cell is based on a calculated measure. * * @return Whether can drill through on this cell */ boolean canDrillThrough(); /** * Returns the number of fact table rows which contributed to this Cell. */ int getDrillThroughCount(); /** * Returns the value of a property. * * @param propertyName Case-sensitive property name * @return Value of property */ Object getPropertyValue(String propertyName); /** * Returns the context member for a particular dimension. * * The member is defined as follows (note that there is always a * member):

    * *
  • If the dimension appears on one of the visible axes, the context * member is simply the member on the current row or column. * *
  • If the dimension appears in the slicer, the context member is the * member of that dimension in the slier. * *
  • Otherwise, the context member is the default member of that * dimension (usually the 'all' member).
* * @param hierarchy Hierarchy * @return current member of given hierarchy */ Member getContextMember(Hierarchy hierarchy); /** * Helper method to implement {@link org.olap4j.Cell#setValue}. * * @param scenario Scenario * @param newValue New value * @param allocationPolicy Allocation policy * @param allocationArgs Arguments for allocation policy */ void setValue( Scenario scenario, Object newValue, AllocationPolicy allocationPolicy, Object... allocationArgs); } // End Cell.java mondrian-3.11.0.1-R/src/main/mondrian/olap/CellFormatter.java000066400000000000000000000012731261646570300236410ustar00rootroot00000000000000/* // This software is subject to the terms of the Eclipse Public License v1.0 // Agreement, available at the following URL: // http://www.eclipse.org/legal/epl-v10.html. // You must accept the terms of that agreement to use this software. // // Copyright (C) 2004-2005 TONBELLER AG // Copyright (C) 2006-2011 Pentaho and others // All Rights Reserved. */ package mondrian.olap; /** * An SPI to format the cell value to be displayed. * * @deprecated Use {@link mondrian.spi.CellFormatter}. This interface * exists for temporary backwards compatibility and will be removed * in mondrian-4.0. */ public interface CellFormatter extends mondrian.spi.CellFormatter { } // End CellFormatter.java mondrian-3.11.0.1-R/src/main/mondrian/olap/CellProperty.java000066400000000000000000000021051261646570300235150ustar00rootroot00000000000000/* // This software is subject to the terms of the Eclipse Public License v1.0 // Agreement, available at the following URL: // http://www.eclipse.org/legal/epl-v10.html. // You must accept the terms of that agreement to use this software. // // Copyright (C) 1998-2005 Julian Hyde // Copyright (C) 2005-2012 Pentaho and others // All Rights Reserved. */ package mondrian.olap; import java.util.List; /** * Represents Cell Property. * * @author Shishir * @since 08 May, 2007 */ public class CellProperty extends QueryPart { private String name; public CellProperty(List segments) { this.name = Util.implode(segments); } /** * checks whether cell property is equals to passed parameter. * It adds '[' and ']' before and after the propertyName before comparing. * The comparison is case insensitive. */ public boolean isNameEquals(String propertyName) { return name.equalsIgnoreCase(Util.quoteMdxIdentifier(propertyName)); } public String toString() { return name; } } // End CellProperty.java mondrian-3.11.0.1-R/src/main/mondrian/olap/Connection.java000066400000000000000000000064561261646570300232050ustar00rootroot00000000000000/* // This software is subject to the terms of the Eclipse Public License v1.0 // Agreement, available at the following URL: // http://www.eclipse.org/legal/epl-v10.html. // You must accept the terms of that agreement to use this software. // // Copyright (C) 2000-2005 Julian Hyde // Copyright (C) 2005-2012 Pentaho and others // All Rights Reserved. */ package mondrian.olap; import java.io.PrintWriter; import java.util.Locale; import javax.sql.DataSource; /** * Connection to a multi-dimensional database. * * @see DriverManager * * @author jhyde */ public interface Connection { /** * Get the Connect String associated with this Connection. * * @return the Connect String (never null). */ String getConnectString(); /** * Get the name of the Catalog associated with this Connection. * * @return the Catalog name (never null). */ String getCatalogName(); /** * Get the Schema associated with this Connection. * * @return the Schema (never null). */ Schema getSchema(); /** * Closes this Connection. You may not use this * Connection after closing it. */ void close(); /** * Executes a query. * * @throws RuntimeException if another thread cancels the query's statement. * * @deprecated This method is deprecated and will be removed in * mondrian-4.0. It operates by internally creating a statement. Better * to use olap4j and explicitly create a statement. */ Result execute(Query query); /** * Returns the locale this connection belongs to. Determines, for example, * the currency string used in formatting cell values. * * @see mondrian.util.Format */ Locale getLocale(); /** * Parses an expresion. */ Exp parseExpression(String s); /** * Parses a query. */ Query parseQuery(String s); /** * Parses a statement. * * @param mdx MDX string * @return A {@link Query} if it is a SELECT statement, a * {@link DrillThrough} if it is a DRILLTHROUGH statement */ QueryPart parseStatement(String mdx); /** * Sets the privileges for the this connection. * * @pre role != null * @pre role.isMutable() */ void setRole(Role role); /** * Returns the access-control profile for this connection. * @post role != null * @post role.isMutable() */ Role getRole(); /** * Returns a schema reader with access control appropriate to the current * role. */ SchemaReader getSchemaReader(); /** * Returns the value of a connection property. * * @param name Name of property, for example "JdbcUser". * @return Value of property, or null if property is not defined. */ Object getProperty(String name); /** * Returns an object with which to explicitly control the contents of the * cache. * * @param pw Writer to which to write logging information; may be null */ CacheControl getCacheControl(PrintWriter pw); /** * Returns the data source this connection uses to create connections * to the underlying JDBC database. * * @return Data source */ DataSource getDataSource(); } // End Connection.java mondrian-3.11.0.1-R/src/main/mondrian/olap/ConnectionBase.java000066400000000000000000000063261261646570300237740ustar00rootroot00000000000000/* // This software is subject to the terms of the Eclipse Public License v1.0 // Agreement, available at the following URL: // http://www.eclipse.org/legal/epl-v10.html. // You must accept the terms of that agreement to use this software. // // Copyright (C) 2001-2005 Julian Hyde // Copyright (C) 2005-2011 Pentaho and others // All Rights Reserved. */ package mondrian.olap; import mondrian.parser.*; import mondrian.resource.MondrianResource; import mondrian.server.Statement; import org.apache.log4j.Logger; /** * ConnectionBase implements some of the methods in * {@link Connection}. * * @author jhyde * @since 6 August, 2001 */ public abstract class ConnectionBase implements Connection { protected ConnectionBase() { } protected abstract Logger getLogger(); public String getFullConnectString() { String s = getConnectString(); String catalogName = getCatalogName(); if (catalogName != null) { int len = s.length() + catalogName.length() + 32; StringBuilder buf = new StringBuilder(len); buf.append(s); if (!s.endsWith(";")) { buf.append(';'); } buf.append("Initial Catalog="); buf.append(catalogName); buf.append(';'); s = buf.toString(); } return s; } public abstract Statement getInternalStatement(); public Query parseQuery(String query) { return (Query) parseStatement(query); } /** * Parses a query, with specified function table and the mode for strict * validation(if true then invalid members are not ignored). * *

This method is only used in testing and by clients that need to * support customized parser behavior. That is why this method is not part * of the Connection interface. * *

See test case mondrian.olap.CustomizedParserTest. * * @param statement Evaluation context * @param query MDX query that requires special parsing * @param funTable Customized function table to use in parsing * @param strictValidation If true, do not ignore invalid members * @return Query the corresponding Query object if parsing is successful * @throws MondrianException if parsing fails */ public QueryPart parseStatement( Statement statement, String query, FunTable funTable, boolean strictValidation) { MdxParserValidator parser = createParser(); boolean debug = false; if (funTable == null) { funTable = getSchema().getFunTable(); } if (getLogger().isDebugEnabled()) { //debug = true; getLogger().debug( Util.nl + query); } try { return parser.parseInternal( statement, query, debug, funTable, strictValidation); } catch (Exception e) { throw MondrianResource.instance().FailedToParseQuery.ex(query, e); } } protected MdxParserValidator createParser() { return true ? new JavaccParserValidatorImpl() : new MdxParserValidatorImpl(); } } // End ConnectionBase.java mondrian-3.11.0.1-R/src/main/mondrian/olap/Cube.java000066400000000000000000000060221261646570300217510ustar00rootroot00000000000000/* // This software is subject to the terms of the Eclipse Public License v1.0 // Agreement, available at the following URL: // http://www.eclipse.org/legal/epl-v10.html. // You must accept the terms of that agreement to use this software. // // Copyright (C) 1999-2005 Julian Hyde // Copyright (C) 2005-2012 Pentaho and others // All Rights Reserved. */ package mondrian.olap; import java.util.List; import java.util.Set; /** * Cube. * * @author jhyde, 2 March, 1999 */ public interface Cube extends OlapElement, Annotated { String getName(); Schema getSchema(); /** * Returns the dimensions of this cube. */ Dimension[] getDimensions(); /** * Returns the named sets of this cube. */ NamedSet[] getNamedSets(); /** * Finds a hierarchy whose name (or unique name, if unique is * true) equals s. */ Hierarchy lookupHierarchy(Id.NameSegment s, boolean unique); /** * Returns Member[]. It builds Member[] by analyzing cellset, which * gets created by running mdx sQuery. query has to be in the * format of something like "[with calculated members] select *members* on * columns from this". */ Member[] getMembersForQuery(String query, List calcMembers); /** * Helper method that returns the Year Level or returns null if the Time * Dimension does not exist or if Year is not defined in the Time Dimension. * * @return Level or null. */ Level getYearLevel(); /** * Return Quarter Level or null. * * @return Quarter Level or null. */ Level getQuarterLevel(); /** * Return Month Level or null. * * @return Month Level or null. */ Level getMonthLevel(); /** * Return Week Level or null. * * @return Week Level or null. */ Level getWeekLevel(); /** * Returns a {@link SchemaReader} for which this cube is the context for * lookup up members. * If role is null, the returned schema reader also obeys the * access-control profile of role. */ SchemaReader getSchemaReader(Role role); /** * Creates a calculated member in this cube. * *

The XML string must be a <CalculatedMember/> * element, as defined in Mondrian.xml. * * @param xml XML string */ Member createCalculatedMember(String xml); /** * Finds out non joining dimensions for this cube. * * @param tuple array of members * @return Set of dimensions that do not exist (non joining) in this cube */ Set nonJoiningDimensions(Member[] tuple); /** * Finds out non joining dimensions for this cube. * * @param otherDims Set of dimensions to be tested for existence * in this cube * @return Set of dimensions that do not exist (non joining) in this cube */ Set nonJoiningDimensions(Set otherDims); } // End Cube.java mondrian-3.11.0.1-R/src/main/mondrian/olap/CubeAccess.java000066400000000000000000000135471261646570300231050ustar00rootroot00000000000000/* // This software is subject to the terms of the Eclipse Public License v1.0 // Agreement, available at the following URL: // http://www.eclipse.org/legal/epl-v10.html. // You must accept the terms of that agreement to use this software. // // Copyright (C) 1999-2005 Julian Hyde // Copyright (C) 2005-2012 Pentaho and others // All Rights Reserved. */ package mondrian.olap; import mondrian.resource.MondrianResource; import java.util.ArrayList; import java.util.List; /** * This class implements object of type GrantCube to apply permissions * on user's MDX query * * @author lkrivopaltsev, 01 November, 1999 */ public class CubeAccess { private boolean hasRestrictions; /** array of hierarchies with no access */ private Hierarchy[] noAccessHierarchies; /** array of members which have limited access */ private Member[] limitedMembers; private final List hierarchyList = new ArrayList(); private final List memberList = new ArrayList(); private final Cube mdxCube; /** * Creates a CubeAccess object. * *

User's code should be responsible for * filling cubeAccess with restricted hierarchies and restricted * members by calling addSlicer(). Do NOT forget to call * {@link #normalizeCubeAccess()} after you done filling cubeAccess. */ public CubeAccess(Cube mdxCube) { this.mdxCube = mdxCube; noAccessHierarchies = null; limitedMembers = null; hasRestrictions = false; } public boolean hasRestrictions() { return hasRestrictions; } public Hierarchy[] getNoAccessHierarchies() { return noAccessHierarchies; } public Member[] getLimitedMembers() { return limitedMembers; } public List getNoAccessHierarchyList() { return hierarchyList; } public List getLimitedMemberList() { return memberList; } public boolean isHierarchyAllowed(Hierarchy mdxHierarchy) { String hierName = mdxHierarchy.getUniqueName(); if (noAccessHierarchies == null || hierName == null) { return true; } for (Hierarchy noAccessHierarchy : noAccessHierarchies) { if (hierName.equalsIgnoreCase(noAccessHierarchy.getUniqueName())) { return false; } } return true; } public Member getLimitedMemberForHierarchy(Hierarchy mdxHierarchy) { String hierName = mdxHierarchy.getUniqueName(); if (limitedMembers == null || hierName == null) { return null; } for (Member limitedMember : limitedMembers) { Hierarchy limitedHierarchy = limitedMember.getHierarchy(); if (hierName.equalsIgnoreCase(limitedHierarchy.getUniqueName())) { return limitedMember; } } return null; } /** * Adds restricted hierarchy or limited member based on bMember */ public void addGrantCubeSlicer( String sHierarchy, String sMember, boolean bMember) { if (bMember) { boolean fail = false; List sMembers = Util.parseIdentifier(sMember); SchemaReader schemaReader = mdxCube.getSchemaReader(null); Member member = schemaReader.getMemberByUniqueName(sMembers, fail); if (member == null) { throw MondrianResource.instance().MdxCubeSlicerMemberError.ex( sMember, sHierarchy, mdxCube.getUniqueName()); } // there should be only slicer per hierarchy; ignore the rest if (getLimitedMemberForHierarchy(member.getHierarchy()) == null) { memberList.add(member); } } else { boolean fail = false; Hierarchy hierarchy = mdxCube.lookupHierarchy( new Id.NameSegment(sHierarchy), fail); if (hierarchy == null) { throw MondrianResource.instance().MdxCubeSlicerHierarchyError .ex(sHierarchy, mdxCube.getUniqueName()); } hierarchyList.add(hierarchy); } } /** * Initializes internal arrays of restricted hierarchies and limited * members. It has to be called after all 'addSlicer()' calls. */ public void normalizeCubeAccess() { if (memberList.size() > 0) { limitedMembers = memberList.toArray(new Member[memberList.size()]); hasRestrictions = true; } if (hierarchyList.size() > 0) { noAccessHierarchies = hierarchyList.toArray( new Hierarchy[hierarchyList.size()]); hasRestrictions = true; } } public boolean equals(Object object) { if (!(object instanceof CubeAccess)) { return false; } CubeAccess cubeAccess = (CubeAccess) object; List hierarchyList = cubeAccess.getNoAccessHierarchyList(); List limitedMemberList = cubeAccess.getLimitedMemberList(); if ((this.hierarchyList.size() != hierarchyList.size()) || (this.memberList.size() != limitedMemberList.size())) { return false; } for (Hierarchy o : hierarchyList) { if (!this.hierarchyList.contains(o)) { return false; } } for (Member member : limitedMemberList) { if (!this.memberList.contains(member)) { return false; } } return true; } public int hashCode() { int h = mdxCube.hashCode(); h = Util.hash(h, hierarchyList); h = Util.hash(h, memberList); h = Util.hashArray(h, noAccessHierarchies); h = Util.hashArray(h, limitedMembers); return h; } } // End CubeAccess.java mondrian-3.11.0.1-R/src/main/mondrian/olap/CubeBase.java000066400000000000000000000151401261646570300225450ustar00rootroot00000000000000/* // This software is subject to the terms of the Eclipse Public License v1.0 // Agreement, available at the following URL: // http://www.eclipse.org/legal/epl-v10.html. // You must accept the terms of that agreement to use this software. // // Copyright (C) 2001-2005 Julian Hyde // Copyright (C) 2005-2013 Pentaho and others // All Rights Reserved. */ package mondrian.olap; import mondrian.resource.MondrianResource; import java.util.List; /** * CubeBase is an abstract implementation of {@link Cube}. * * @author jhyde * @since 6 August, 2001 */ public abstract class CubeBase extends OlapElementBase implements Cube { /** constraints indexes for adSchemaMembers * * http://msdn.microsoft.com/library/psdk/dasdk/mdx8h4k.htm * check "Restrictions in the MEMBER Rowset" under MEMBER Rowset section */ public static final int CATALOG_NAME = 0; public static final int SCHEMA_NAME = 1; public static final int CUBE_NAME = 2; public static final int DIMENSION_UNIQUE_NAME = 3; public static final int HIERARCHY_UNIQUE_NAME = 4; public static final int LEVEL_UNIQUE_NAME = 5; public static final int LEVEL_NUMBER = 6; public static final int MEMBER_NAME = 7; public static final int MEMBER_UNIQUE_NAME = 8; public static final int MEMBER_CAPTION = 9; public static final int MEMBER_TYPE = 10; public static final int Tree_Operator = 11; public static final int maxNofConstraintsForAdSchemaMember = 12; public static final int MDTREEOP_SELF = 0; public static final int MDTREEOP_CHILDREN = 1; public static final int MDPROP_USERDEFINED0 = 19; protected final String name; private final String uniqueName; private final String description; protected Dimension[] dimensions; /** * Creates a CubeBase. * * @param name Name * @param caption Caption * @param description Description * @param dimensions List of dimensions */ protected CubeBase( String name, String caption, boolean visible, String description, Dimension[] dimensions) { this.name = name; this.caption = caption; this.visible = visible; this.description = description; this.dimensions = dimensions; this.uniqueName = Util.quoteMdxIdentifier(name); } // implement OlapElement public String getName() { return name; } public String getUniqueName() { // return e.g. '[Sales Ragged]' return uniqueName; } public String getQualifiedName() { return MondrianResource.instance().MdxCubeName.str(getName()); } public Dimension getDimension() { return null; } public Hierarchy getHierarchy() { return null; } public String getDescription() { return description; } public Dimension[] getDimensions() { return dimensions; } public Hierarchy lookupHierarchy(Id.NameSegment s, boolean unique) { for (Dimension dimension : dimensions) { Hierarchy[] hierarchies = dimension.getHierarchies(); for (Hierarchy hierarchy : hierarchies) { String name = unique ? hierarchy.getUniqueName() : hierarchy.getName(); if (name.equals(s.getName())) { return hierarchy; } } } return null; } public OlapElement lookupChild( SchemaReader schemaReader, Id.Segment s, MatchType matchType) { Dimension mdxDimension = lookupDimension(s); if (mdxDimension != null) { return mdxDimension; } final List dimensions = schemaReader.getCubeDimensions(this); // Look for hierarchies named '[dimension.hierarchy]'. if (s instanceof Id.NameSegment) { Hierarchy hierarchy = lookupHierarchy((Id.NameSegment)s, false); if (hierarchy != null) { return hierarchy; } } // Try hierarchies, levels and members. for (Dimension dimension : dimensions) { OlapElement mdxElement = dimension.lookupChild( schemaReader, s, matchType); if (mdxElement != null) { if (mdxElement instanceof Member && MondrianProperties.instance().NeedDimensionPrefix.get()) { // With this property setting, don't allow members to be // referenced without at least a dimension prefix. We // allow [Store].[USA].[CA] or even [Store].[CA] but not // [USA].[CA]. continue; } return mdxElement; } } return null; } /** * Looks up a dimension in this cube based on a component of its name. * * @param s Name segment * @return Dimension, or null if not found */ public Dimension lookupDimension(Id.Segment s) { if (!(s instanceof Id.NameSegment)) { return null; } final Id.NameSegment nameSegment = (Id.NameSegment) s; for (Dimension dimension : dimensions) { if (Util.equalName(dimension.getName(), nameSegment.name)) { return dimension; } } return null; } // ------------------------------------------------------------------------ /** * Returns the first level of a given type in this cube. * * @param levelType Level type * @return First level of given type, or null */ private Level getTimeLevel(LevelType levelType) { for (Dimension dimension : dimensions) { if (dimension.getDimensionType() == DimensionType.TimeDimension) { Hierarchy[] hierarchies = dimension.getHierarchies(); for (Hierarchy hierarchy : hierarchies) { Level[] levels = hierarchy.getLevels(); for (Level level : levels) { if (level.getLevelType() == levelType) { return level; } } } } } return null; } public Level getYearLevel() { return getTimeLevel(LevelType.TimeYears); } public Level getQuarterLevel() { return getTimeLevel(LevelType.TimeQuarters); } public Level getMonthLevel() { return getTimeLevel(LevelType.TimeMonths); } public Level getWeekLevel() { return getTimeLevel(LevelType.TimeWeeks); } } // End CubeBase.java mondrian-3.11.0.1-R/src/main/mondrian/olap/DelegatingRole.java000066400000000000000000000040071261646570300237610ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.olap; /** * DelegatingRole implements {@link Role} by * delegating all methods to an underlying {@link Role}. * *

This is a convenient base class if you want to override just a few of * {@link Role}'s methods. * * @author Richard M. Emberson * @since Mar 29 2007 */ public class DelegatingRole implements Role { protected final Role role; /** * Creates a DelegatingRole. * * @param role Underlying role. */ public DelegatingRole(Role role) { assert role != null; this.role = role; } public Access getAccess(Schema schema) { return role.getAccess(schema); } public Access getAccess(Cube cube) { return role.getAccess(cube); } public Access getAccess(Dimension dimension) { return role.getAccess(dimension); } public Access getAccess(Hierarchy hierarchy) { return role.getAccess(hierarchy); } /** * {@inheritDoc} * *

This implementation returns the same access as the underlying role. * Derived class may choose to refine access by creating a subclass of * {@link mondrian.olap.RoleImpl.DelegatingHierarchyAccess}. */ public HierarchyAccess getAccessDetails(Hierarchy hierarchy) { return role.getAccessDetails(hierarchy); } public Access getAccess(Level level) { return role.getAccess(level); } public Access getAccess(Member member) { return role.getAccess(member); } public Access getAccess(NamedSet set) { return role.getAccess(set); } public boolean canAccess(OlapElement olapElement) { return role.canAccess(olapElement); } } // End DelegatingRole.java mondrian-3.11.0.1-R/src/main/mondrian/olap/DelegatingSchemaReader.java000066400000000000000000000214711261646570300254070ustar00rootroot00000000000000/* // This software is subject to the terms of the Eclipse Public License v1.0 // Agreement, available at the following URL: // http://www.eclipse.org/legal/epl-v10.html. // You must accept the terms of that agreement to use this software. // // Copyright (C) 2003-2005 Julian Hyde // Copyright (C) 2004-2005 TONBELLER AG // Copyright (C) 2005-2015 Pentaho // All Rights Reserved. */ package mondrian.olap; import mondrian.calc.Calc; import mondrian.rolap.RolapSchema; import mondrian.rolap.RolapUtil; import java.util.List; import java.util.Map; import javax.sql.DataSource; /** * DelegatingSchemaReader implements {@link SchemaReader} by * delegating all methods to an underlying {@link SchemaReader}. * *

It is a convenient base class if you want to override just a few of * {@link SchemaReader}'s methods.

* * @author jhyde * @since Feb 26, 2003 */ public abstract class DelegatingSchemaReader implements SchemaReader { protected final SchemaReader schemaReader; /** * Creates a DelegatingSchemaReader. * * @param schemaReader Parent reader to delegate unhandled calls to */ protected DelegatingSchemaReader(SchemaReader schemaReader) { this.schemaReader = schemaReader; } public RolapSchema getSchema() { return schemaReader.getSchema(); } public Role getRole() { return schemaReader.getRole(); } public Cube getCube() { return schemaReader.getCube(); } public List getCubeDimensions(Cube cube) { return schemaReader.getCubeDimensions(cube); } public List getDimensionHierarchies(Dimension dimension) { return schemaReader.getDimensionHierarchies(dimension); } public List getHierarchyRootMembers(Hierarchy hierarchy) { return schemaReader.getHierarchyRootMembers(hierarchy); } public Member getMemberParent(Member member) { return schemaReader.getMemberParent(member); } public Member substitute(Member member) { return schemaReader.substitute(member); } public List getMemberChildren(Member member) { return schemaReader.getMemberChildren(member); } public List getMemberChildren(List members) { return schemaReader.getMemberChildren(members); } public void getParentChildContributingChildren( Member dataMember, Hierarchy hierarchy, List list) { schemaReader.getParentChildContributingChildren( dataMember, hierarchy, list); } public int getMemberDepth(Member member) { return schemaReader.getMemberDepth(member); } public final Member getMemberByUniqueName( List uniqueNameParts, boolean failIfNotFound) { return getMemberByUniqueName( uniqueNameParts, failIfNotFound, MatchType.EXACT); } public Member getMemberByUniqueName( List uniqueNameParts, boolean failIfNotFound, MatchType matchType) { return schemaReader.getMemberByUniqueName( uniqueNameParts, failIfNotFound, matchType); } public final OlapElement lookupCompound( OlapElement parent, List names, boolean failIfNotFound, int category) { return lookupCompound( parent, names, failIfNotFound, category, MatchType.EXACT); } public final OlapElement lookupCompound( OlapElement parent, List names, boolean failIfNotFound, int category, MatchType matchType) { if (MondrianProperties.instance().SsasCompatibleNaming.get()) { return new NameResolver().resolve( parent, Util.toOlap4j(names), failIfNotFound, category, matchType, getNamespaces()); } return lookupCompoundInternal( parent, names, failIfNotFound, category, matchType); } public List getNamespaces() { return schemaReader.getNamespaces(); } public OlapElement lookupCompoundInternal( OlapElement parent, List names, boolean failIfNotFound, int category, MatchType matchType) { return schemaReader.lookupCompound( parent, names, failIfNotFound, category, matchType); } public Member getCalculatedMember(List nameParts) { return schemaReader.getCalculatedMember(nameParts); } public NamedSet getNamedSet(List nameParts) { return schemaReader.getNamedSet(nameParts); } public void getMemberRange( Level level, Member startMember, Member endMember, List list) { schemaReader.getMemberRange(level, startMember, endMember, list); } public Member getLeadMember(Member member, int n) { return schemaReader.getLeadMember(member, n); } public int compareMembersHierarchically(Member m1, Member m2) { return schemaReader.compareMembersHierarchically(m1, m2); } public OlapElement getElementChild(OlapElement parent, Id.Segment name) { return getElementChild(parent, name, MatchType.EXACT); } public OlapElement getElementChild( OlapElement parent, Id.Segment name, MatchType matchType) { return schemaReader.getElementChild(parent, name, matchType); } public List getLevelMembers( Level level, boolean includeCalculated) { return schemaReader.getLevelMembers(level, includeCalculated); } public List getHierarchyLevels(Hierarchy hierarchy) { return schemaReader.getHierarchyLevels(hierarchy); } public Member getHierarchyDefaultMember(Hierarchy hierarchy) { return schemaReader.getHierarchyDefaultMember(hierarchy); } public boolean isDrillable(Member member) { return schemaReader.isDrillable(member); } public boolean isVisible(Member member) { return schemaReader.isVisible(member); } public Cube[] getCubes() { return schemaReader.getCubes(); } public List getCalculatedMembers(Hierarchy hierarchy) { return schemaReader.getCalculatedMembers(hierarchy); } public List getCalculatedMembers(Level level) { return schemaReader.getCalculatedMembers(level); } public List getCalculatedMembers() { return schemaReader.getCalculatedMembers(); } public int getChildrenCountFromCache(Member member) { return schemaReader.getChildrenCountFromCache(member); } public int getLevelCardinality( Level level, boolean approximate, boolean materialize) { return schemaReader.getLevelCardinality( level, approximate, materialize); } public List getLevelMembers(Level level, Evaluator context) { return schemaReader.getLevelMembers(level, context); } public List getMemberChildren(Member member, Evaluator context) { return schemaReader.getMemberChildren(member, context); } public List getMemberChildren( List members, Evaluator context) { return schemaReader.getMemberChildren(members, context); } public void getMemberAncestors(Member member, List ancestorList) { schemaReader.getMemberAncestors(member, ancestorList); } public Member lookupMemberChildByName( Member member, Id.Segment memberName, MatchType matchType) { return schemaReader.lookupMemberChildByName( member, memberName, matchType); } public List lookupMemberChildrenByNames( Member parent, List childNames, MatchType matchType) { return schemaReader.lookupMemberChildrenByNames( parent, childNames, matchType); } public NativeEvaluator getNativeSetEvaluator( FunDef fun, Exp[] args, Evaluator evaluator, Calc calc) { return schemaReader.getNativeSetEvaluator(fun, args, evaluator, calc); } public Parameter getParameter(String name) { return schemaReader.getParameter(name); } public DataSource getDataSource() { return schemaReader.getDataSource(); } public SchemaReader withoutAccessControl() { return schemaReader.withoutAccessControl(); } public SchemaReader withLocus() { return RolapUtil.locusSchemaReader( schemaReader.getSchema().getInternalConnection(), this); } public Map getMemberChildrenWithDetails( Member member, Evaluator evaluator) { return schemaReader.getMemberChildrenWithDetails(member, evaluator); } } // End DelegatingSchemaReader.java mondrian-3.11.0.1-R/src/main/mondrian/olap/Dimension.java000066400000000000000000000031161261646570300230210ustar00rootroot00000000000000/* // This software is subject to the terms of the Eclipse Public License v1.0 // Agreement, available at the following URL: // http://www.eclipse.org/legal/epl-v10.html. // You must accept the terms of that agreement to use this software. // // Copyright (C) 1999-2005 Julian Hyde // Copyright (C) 2005-2009 Pentaho and others // All Rights Reserved. */ package mondrian.olap; /** * A Dimension represents a dimension of a cube. * * @author jhyde, 1 March, 1999 */ public interface Dimension extends OlapElement, Annotated { final String MEASURES_UNIQUE_NAME = "[Measures]"; final String MEASURES_NAME = "Measures"; /** * Returns an array of the hierarchies which belong to this dimension. */ Hierarchy[] getHierarchies(); /** * Returns whether this is the [Measures] dimension. */ boolean isMeasures(); /** * Returns the type of this dimension * ({@link DimensionType#StandardDimension} or * {@link DimensionType#TimeDimension} */ DimensionType getDimensionType(); /** * Returns the schema this dimension belongs to. */ Schema getSchema(); /** * Returns whether the dimension should be considered as a "high * cardinality" or "low cardinality" according to cube definition. * * Mondrian tends to evaluate high cardinality dimensions using * iterators rather than lists, avoiding instantiating the dimension in * memory. * * @return whether this dimension is high-cardinality */ boolean isHighCardinality(); } // End Dimension.java mondrian-3.11.0.1-R/src/main/mondrian/olap/DimensionBase.java000066400000000000000000000102251261646570300236130ustar00rootroot00000000000000/* // This software is subject to the terms of the Eclipse Public License v1.0 // Agreement, available at the following URL: // http://www.eclipse.org/legal/epl-v10.html. // You must accept the terms of that agreement to use this software. // // Copyright (C) 2001-2005 Julian Hyde // Copyright (C) 2005-2012 Pentaho and others // All Rights Reserved. */ package mondrian.olap; import mondrian.resource.MondrianResource; import java.util.List; /** * Abstract implementation for a {@link Dimension}. * * @author jhyde * @since 6 August, 2001 */ public abstract class DimensionBase extends OlapElementBase implements Dimension { protected final String name; protected final String uniqueName; protected final String description; protected final boolean highCardinality; protected Hierarchy[] hierarchies; protected DimensionType dimensionType; /** * Creates a DimensionBase. * * @param name Name * @param dimensionType Type * @param highCardinality Whether high-cardinality */ protected DimensionBase( String name, String caption, boolean visible, String description, DimensionType dimensionType, boolean highCardinality) { this.name = name; this.caption = caption; this.visible = visible; this.uniqueName = Util.makeFqName(name); this.description = description; this.dimensionType = dimensionType; this.highCardinality = highCardinality; } public String getUniqueName() { return uniqueName; } public String getName() { return name; } public String getDescription() { return description; } public Hierarchy[] getHierarchies() { return hierarchies; } public Hierarchy getHierarchy() { return hierarchies[0]; } public Dimension getDimension() { return this; } public DimensionType getDimensionType() { return dimensionType; } public String getQualifiedName() { return MondrianResource.instance().MdxDimensionName.str( getUniqueName()); } public boolean isMeasures() { return getUniqueName().equals(MEASURES_UNIQUE_NAME); } public OlapElement lookupChild( SchemaReader schemaReader, Id.Segment s, MatchType matchType) { OlapElement oe = null; if (s instanceof Id.NameSegment) { oe = lookupHierarchy((Id.NameSegment) s); } // Original mondrian behavior: // If the user is looking for [Marital Status].[Marital Status] we // should not return oe "Marital Status", because he is // looking for level - we can check that by checking of hierarchy and // dimension name is the same. // if (!MondrianProperties.instance().SsasCompatibleNaming.get()) { if (oe == null || oe.getName().equalsIgnoreCase(getName())) { OlapElement oeLevel = getHierarchy().lookupChild(schemaReader, s, matchType); if (oeLevel != null) { return oeLevel; // level match overrides hierarchy match } } return oe; } else { // New (SSAS-compatible) behavior. If there is no matching // hierarchy, find the first level with the given name. if (oe != null) { return oe; } final List hierarchyList = schemaReader.getDimensionHierarchies(this); for (Hierarchy hierarchy : hierarchyList) { oe = hierarchy.lookupChild(schemaReader, s, matchType); if (oe != null) { return oe; } } return null; } } public boolean isHighCardinality() { return this.highCardinality; } private Hierarchy lookupHierarchy(Id.NameSegment s) { for (Hierarchy hierarchy : hierarchies) { if (Util.equalName(hierarchy.getName(), s.getName())) { return hierarchy; } } return null; } } // End DimensionBase.java mondrian-3.11.0.1-R/src/main/mondrian/olap/DimensionType.java000066400000000000000000000015411261646570300236630ustar00rootroot00000000000000/* // This software is subject to the terms of the Eclipse Public License v1.0 // Agreement, available at the following URL: // http://www.eclipse.org/legal/epl-v10.html. // You must accept the terms of that agreement to use this software. // // Copyright (C) 2004-2005 Galt Johnson // Copyright (C) 2004-2005 Julian Hyde // Copyright (C) 2005-2007 Pentaho and others // All Rights Reserved. */ package mondrian.olap; /** * Enumerates the types of dimensions. * * @author Galt Johnson * @since 5 April, 2004 */ public enum DimensionType { /** * Indicates that the dimension is not related to time. */ StandardDimension, /** * Indicates that a dimension is a time dimension. */ TimeDimension, /** * Indicates the a dimension is the measures dimension. */ MeasuresDimension, } // End DimensionType.java mondrian-3.11.0.1-R/src/main/mondrian/olap/DrillThrough.java000066400000000000000000000057371261646570300235160ustar00rootroot00000000000000/* // This software is subject to the terms of the Eclipse Public License v1.0 // Agreement, available at the following URL: // http://www.eclipse.org/legal/epl-v10.html. // You must accept the terms of that agreement to use this software. // // Copyright (c) 2002-2015 Pentaho Corporation.. All rights reserved. */ package mondrian.olap; import java.io.PrintWriter; import java.util.*; /** * Drill through statement. * * @author jhyde */ public class DrillThrough extends QueryPart { private final Query query; private final int maxRowCount; private final int firstRowOrdinal; private final List returnList; /** * Creates a DrillThrough. * * @param query Query * @param maxRowCount Maximum number of rows to return, or -1 * @param firstRowOrdinal Ordinal of first row to return, or -1 * @param returnList List of columns to return */ DrillThrough( Query query, int maxRowCount, int firstRowOrdinal, List returnList) { this.query = query; this.maxRowCount = maxRowCount; this.firstRowOrdinal = firstRowOrdinal; this.returnList = Collections.unmodifiableList( resolveReturnList(returnList)); } @Override public void unparse(PrintWriter pw) { pw.print("DRILLTHROUGH"); if (maxRowCount >= 0) { pw.print(" MAXROWS "); pw.print(maxRowCount); } if (firstRowOrdinal >= 0) { pw.print(" FIRSTROWSET "); pw.print(firstRowOrdinal); } pw.print(" "); query.unparse(pw); if (returnList != null) { ExpBase.unparseList( pw, returnList.toArray(new Exp[returnList.size()]), " RETURN ", ", ", ""); } } @Override public Object[] getChildren() { return new Object[] {maxRowCount, firstRowOrdinal, query, returnList}; } public Query getQuery() { return query; } public int getMaxRowCount() { return maxRowCount; } public int getFirstRowOrdinal() { return firstRowOrdinal; } public List getReturnList() { return returnList; } private List resolveReturnList(List returnList) { if (returnList == null) { return Collections.emptyList(); } List returnClauseElements = new ArrayList(); SchemaReader reader = query.getSchemaReader(true); for (Exp exp : returnList) { final OlapElement olapElement = reader.lookupCompound( query.getCube(), Util.parseIdentifier(exp.toString()), true, Category.Unknown); if (olapElement instanceof OlapElement) { returnClauseElements.add(olapElement); } } return returnClauseElements; } } // End DrillThrough.java mondrian-3.11.0.1-R/src/main/mondrian/olap/DriverManager.java000066400000000000000000000101001261646570300236110ustar00rootroot00000000000000/* // This software is subject to the terms of the Eclipse Public License v1.0 // Agreement, available at the following URL: // http://www.eclipse.org/legal/epl-v10.html. // You must accept the terms of that agreement to use this software. // // Copyright (C) 2002-2005 Julian Hyde // Copyright (C) 2005-2010 Pentaho and others // All Rights Reserved. */ package mondrian.olap; import mondrian.rolap.RolapConnection; import mondrian.rolap.RolapConnectionProperties; import mondrian.spi.CatalogLocator; import javax.sql.DataSource; /** * The basic service for managing a set of OLAP drivers. * * @author jhyde * @since 15 January, 2002 */ public class DriverManager { public DriverManager() { } /** * Creates a connection to a Mondrian OLAP Engine * using a connect string * and a catalog locator. * * @param connectString Connect string of the form * 'property=value;property=value;...'. * See {@link mondrian.olap.Util#parseConnectString} for more details of the format. * See {@link mondrian.rolap.RolapConnectionProperties} for a list of * allowed properties. * @param locator Use to locate real catalog url by a customized * configuration value. If null, leave the catalog url * unchanged. * @return A {@link Connection}, never null */ public static Connection getConnection( String connectString, CatalogLocator locator) { Util.PropertyList properties = Util.parseConnectString(connectString); return getConnection(properties, locator); } /** * Creates a connection to a Mondrian OLAP Engine. * * @param properties Collection of properties which define the location * of the connection. * See {@link mondrian.rolap.RolapConnection} for a list of allowed properties. * @param locator Use to locate real catalog url by a customized * configuration value. If null, leave the catalog url * unchanged. * @return A {@link Connection}, never null */ public static Connection getConnection( Util.PropertyList properties, CatalogLocator locator) { return getConnection(properties, locator, null); } /** * Creates a connection to a Mondrian OLAP Engine * using a list of connection properties, * a catalog locator, * and a JDBC data source. * * @param properties Collection of properties which define the location * of the connection. * See {@link mondrian.rolap.RolapConnection} for a list of allowed properties. * @param locator Use to locate real catalog url by a customized * configuration value. If null, leave the catalog url * unchanged. * @param dataSource - if not null an external DataSource to be used * by Mondrian * @return A {@link Connection}, never null */ public static Connection getConnection( Util.PropertyList properties, CatalogLocator locator, DataSource dataSource) { String provider = properties.get("PROVIDER", "mondrian"); if (!provider.equalsIgnoreCase("mondrian")) { throw Util.newError("Provider not recognized: " + provider); } final String instance = properties.get(RolapConnectionProperties.Instance.name()); MondrianServer server = MondrianServer.forId(instance); if (server == null) { throw Util.newError("Unknown server instance: " + instance); } if (locator == null) { locator = server.getCatalogLocator(); } if (locator != null) { String catalog = properties.get( RolapConnectionProperties.Catalog.name()); properties.put( RolapConnectionProperties.Catalog.name(), locator.locate(catalog)); } final RolapConnection connection = new RolapConnection(server, properties, dataSource); server.addConnection(connection); return connection; } } // End DriverManager.java mondrian-3.11.0.1-R/src/main/mondrian/olap/EnumeratedValues.java000066400000000000000000000267441261646570300243610ustar00rootroot00000000000000/* // This software is subject to the terms of the Eclipse Public License v1.0 // Agreement, available at the following URL: // http://www.eclipse.org/legal/epl-v10.html. // You must accept the terms of that agreement to use this software. // // Copyright (C) 1998-2005 Julian Hyde // Copyright (C) 2005-2009 Pentaho and others // All Rights Reserved. */ package mondrian.olap; import java.util.*; /** * EnumeratedValues is a helper class for declaring a set of * symbolic constants which have names, ordinals, and possibly descriptions. * The ordinals do not have to be contiguous. * *

Typically, for a particular set of constants, you derive a class from this * interface, and declare the constants as public static final * members. Give it a private constructor, and a public static final * ClassName instance member to hold the singleton instance. * {@link Access} is a simple example of this.

*/ public class EnumeratedValues implements Cloneable { /** Map symbol names to values */ private Map valuesByName = new LinkedHashMap(); /** the smallest ordinal value */ private int min = Integer.MAX_VALUE; /** the largest ordinal value */ private int max = Integer.MIN_VALUE; // the variables below are only set AFTER makeImmutable() has been called /** An array mapping ordinals to {@link Value}s. It is biased by the * min value. It is built by {@link #makeImmutable}. */ private Value[] ordinalToValueMap; private static final String[] emptyStringArray = new String[0]; /** * Creates a new empty, mutable enumeration. */ public EnumeratedValues() { } /** * Creates an enumeration, with an array of values, and freezes it. */ public EnumeratedValues(V[] values) { for (V value : values) { register(value); } makeImmutable(); } /** * Creates an enumeration, initialize it with an array of strings, and * freezes it. */ public EnumeratedValues(String[] names) { for (int i = 0; i < names.length; i++) { register((V) new BasicValue(names[i], i, names[i])); } makeImmutable(); } /** * Create an enumeration, initializes it with arrays of code/name pairs, * and freezes it. */ public EnumeratedValues(String[] names, int[] codes) { for (int i = 0; i < names.length; i++) { register((V) new BasicValue(names[i], codes[i], names[i])); } makeImmutable(); } /** * Create an enumeration, initializes it with arrays of code/name pairs, * and freezes it. */ public EnumeratedValues(String[] names, int[] codes, String[] descriptions) { for (int i = 0; i < names.length; i++) { register((V) new BasicValue(names[i], codes[i], descriptions[i])); } makeImmutable(); } public EnumeratedValues(Class clazz) { throw new UnsupportedOperationException(); } public EnumeratedValues clone() { EnumeratedValues clone; try { clone = (EnumeratedValues) super.clone(); } catch (CloneNotSupportedException ex) { throw Util.newInternal(ex, "error while cloning " + this); } clone.valuesByName = new HashMap(valuesByName); clone.ordinalToValueMap = null; return clone; } /** * Creates a mutable enumeration from an existing enumeration, which may * already be immutable. */ public EnumeratedValues getMutableClone() { return clone(); } /** * Associates a symbolic name with an ordinal value. * * @pre value != null * @pre !isImmutable() * @pre value.getName() != null */ public void register(V value) { assert value != null : "pre: value != null"; Util.assertPrecondition(!isImmutable(), "isImmutable()"); final String name = value.getName(); Util.assertPrecondition(name != null, "value.getName() != null"); Value old = valuesByName.put(name, value); if (old != null) { throw Util.newInternal( "Enumeration already contained a value '" + old.getName() + "'"); } final int ordinal = value.getOrdinal(); min = Math.min(min, ordinal); max = Math.max(max, ordinal); } /** * Freezes the enumeration, preventing it from being further modified. */ public void makeImmutable() { ordinalToValueMap = new Value[1 + max - min]; for (Value value : valuesByName.values()) { final int index = value.getOrdinal() - min; if (ordinalToValueMap[index] != null) { throw Util.newInternal( "Enumeration has more than one value with ordinal " + value.getOrdinal()); } ordinalToValueMap[index] = value; } } public final boolean isImmutable() { return (ordinalToValueMap != null); } /** * Returns the smallest ordinal defined by this enumeration. */ public final int getMin() { return min; } /** * Returns the largest ordinal defined by this enumeration. */ public final int getMax() { return max; } /** * Returns whether ordinal is valid for this enumeration. * This method is particularly useful in pre- and post-conditions, for * example *
*
@param axisCode Axis code, must be a {@link AxisCode} value
     * @pre AxisCode.instance.isValid(axisCode)
*
* * @param ordinal Suspected ordinal from this enumeration. * @return Whether ordinal is valid. */ public final boolean isValid(int ordinal) { if ((ordinal < min) || (ordinal > max)) { return false; } if (getName(ordinal) == null) { return false; } return true; } /** * Returns the name associated with an ordinal; the return value * is null if the ordinal is not a member of the enumeration. * * @pre isImmutable() */ public final V getValue(int ordinal) { Util.assertPrecondition(isImmutable()); return (V) ordinalToValueMap[ordinal - min]; } /** * Returns the name associated with an ordinal; the return value * is null if the ordinal is not a member of the enumeration. * * @pre isImmutable() */ public final String getName(int ordinal) { Util.assertPrecondition(isImmutable()); final Value value = ordinalToValueMap[ordinal - min]; return (value == null) ? null : value.getName(); } /** * Returns the description associated with an ordinal; the return value * is null if the ordinal is not a member of the enumeration. * * @pre isImmutable() */ public final String getDescription(int ordinal) { Util.assertPrecondition(isImmutable()); final Value value = ordinalToValueMap[ordinal - min]; return (value == null) ? null : value.getDescription(); } /** * Returns the ordinal associated with a name * * @throws Error if the name is not a member of the enumeration */ public final int getOrdinal(String name) { return getValue(name, true).getOrdinal(); } /** * Returns the value associated with a name. * * @param name Name of enumerated value * @param fail Whether to throw if not found * @throws Error if the name is not a member of the enumeration and * fail is true */ public V getValue(String name, final boolean fail) { final V value = valuesByName.get(name); if (value == null && fail) { throw new Error("Unknown enum name: " + name); } return value; } /** * Returns the names in this enumeration, in declaration order. */ public String[] getNames() { return valuesByName.keySet().toArray(emptyStringArray); } /** * Returns the members of this enumeration, sorted by name. */ public List getValuesSortedByName() { List list = new ArrayList(); final String[] names = getNames(); Arrays.sort(names); for (String name : names) { list.add(getValue(name, true)); } return list; } /** * Returns an error indicating that the value is illegal. (The client needs * to throw the error.) */ public RuntimeException badValue(int ordinal) { return Util.newInternal( "bad value " + ordinal + "(" + getName(ordinal) + ") for enumeration '" + getClass().getName() + "'"); } /** * Returns an exception indicating that we didn't expect to find this value * here. */ public RuntimeException unexpected(V value) { return Util.newInternal( "Was not expecting value '" + value + "' for enumeration '" + getClass().getName() + "' in this context"); } /** * A Value represents a member of an enumerated type. If an * enumerated type is not based upon an explicit array of values, an * array of {@link BasicValue}s will implicitly be created. */ public interface Value { String getName(); int getOrdinal(); String getDescription(); } /** * BasicValue is an obvious implementation of {@link * EnumeratedValues.Value}. */ public static class BasicValue implements Value { public final String name; public final int ordinal; public final String description; /** * @pre name != null */ public BasicValue(String name, int ordinal, String description) { Util.assertPrecondition(name != null, "name != null"); this.name = name; this.ordinal = ordinal; this.description = description; } public String getName() { return name; } public int getOrdinal() { return ordinal; } public String getDescription() { return description; } /** * Returns the value's name. */ public String toString() { return name; } /** * Returns whether this value is equal to a given string. * * @deprecated I bet you meant to write * value.name_.equals(s) rather than * value.equals(s), didn't you? */ public boolean equals(String s) { return super.equals(s); } /** * Returns an error indicating that we did not expect to find this * value in this context. Typical use is in a switch * statement: * *
         * switch (fruit) {
         * case Fruit.AppleORDINAL:
         *     return 1;
         * case Fruir.OrangeORDINAL:
         *     return 2;
         * default:
         *     throw fruit.unexpected();
         * }
*/ public RuntimeException unexpected() { return Util.newInternal( "Value " + name + " of class " + getClass() + " unexpected here"); } } } // End EnumeratedValues.java mondrian-3.11.0.1-R/src/main/mondrian/olap/Evaluator.java000066400000000000000000000444471261646570300230520ustar00rootroot00000000000000/* // This software is subject to the terms of the Eclipse Public License v1.0 // Agreement, available at the following URL: // http://www.eclipse.org/legal/epl-v10.html. // You must accept the terms of that agreement to use this software. // // Copyright (C) 2001-2005 Julian Hyde // Copyright (C) 2005-2011 Pentaho and others // All Rights Reserved. */ package mondrian.olap; import mondrian.calc.ParameterSlot; import mondrian.calc.TupleIterable; import java.util.*; /** * An Evaluator holds the context necessary to evaluate an * expression. * * @author jhyde * @since 27 July, 2001 */ public interface Evaluator { /** * Returns the current cube. */ Cube getCube(); /** * Returns the current query. */ Query getQuery(); /** * Returns the start time of the current query. */ Date getQueryStartTime(); /** * Creates a savepoint encapsulating the current state of the evalutor. * You can restore the evaluator to this state by calling * {@link #restore(int)} with the value returned by this method. * *

This method is typically called before evaluating an expression which * is known to corrupt the evaluation context. * *

Multiple savepoints may be active at the same time for the same * evaluator. And, it is allowable to restore to the save savepoint more * than once (or not at all). However, when you have rolled back to a * particular savepoint you may not restore to a later savepoint. * * @return Evaluator with each given member overriding the state of the * current Evaluator for its hierarchy */ int savepoint(); /** * Creates a new Evaluator with each given member overriding the context of * the current Evaluator for its hierarchy. Other hierarchies retain the * same context as this Evaluator. * *

In mondrian-3.3 and later, a more efficient way to save the state of * an evaluator is to call {@link #savepoint} followed by * {@link #restore(int)}. We recommend using those methods. * * @param members Array of members to add to the context * @return Evaluator with each given member overriding the state of the * current Evaluator for its hierarchy * * @deprecated Use {@link #savepoint()} followed by * {@link #setContext(Member[])}; will be removed in mondrian-4 */ Evaluator push(Member[] members); /** * Creates a new Evaluator with the same context as this evaluator. * *

This method is typically called before evaluating an expression which * may corrupt the evaluation context. * *

In mondrian-3.3 and later, a more efficient way to save the state of * an evaluator is to call {@link #savepoint} followed by * {@link #restore(int)}. We recommend using those methods most of the time. * *

However, it makes sense to use this method in the constructor of an * iterator. It allows the iterator to modify its evaluation context without * affecting the evaluation context of the calling code. This behavior * cannot be achieved using {@code savepoint}. * * @return Evaluator with each given member overriding the state of the * current Evaluator for its hierarchy */ Evaluator push(); /** * Creates a new Evaluator with the same context except for one member. * *

This method is typically called before evaluating an expression which * may corrupt the evaluation context. * *

In mondrian-3.3 and later, a more efficient way to save the state of * an evaluator is to call {@link #savepoint} followed by * {@link #restore(int)}. We recommend using those methods. * * @param member Member to add to the context * @return Evaluator with each given member overriding the state of the * current Evaluator for its hierarchy * * @deprecated Use {@link #savepoint()} followed by * {@link #setContext(Member)}; will be removed in mondrian-4 */ Evaluator push(Member member); /** * Creates a new evaluator with the same state except nonEmpty property * *

In mondrian-3.3 and later, a more efficient way to save the state of * an evaluator is to call {@link #savepoint} followed by * {@link #restore(int)}. We recommend using those methods. * * @deprecated Use {@link #savepoint()} followed by * {@link #setNonEmpty(boolean)}; will be removed in mondrian-4 */ Evaluator push(boolean nonEmpty); /** * Creates a new evaluator with the same state except nonEmpty * and nativeEnabled properties. * *

In mondrian-3.3 and later, a more efficient way to save the state of * an evaluator is to call {@link #savepoint} followed by * {@link #restore(int)}. We recommend using those methods. * * @deprecated Use {@link #savepoint()} followed by * {@link #setNonEmpty(boolean)} and * {@link #setNativeEnabled(boolean)}; will be removed in mondrian-4. */ Evaluator push(boolean nonEmpty, boolean nativeEnabled); /** * Restores previous evaluator. * * @param savepoint Savepoint returned by {@link #savepoint()} */ void restore(int savepoint); /** * Makes member the current member of its hierarchy. * * @param member New member * * @return Previous member of this hierarchy */ Member setContext(Member member); /** * Makes member the current member of its hierarchy. * *

If {@code safe}, checks whether this is the first time that * a member of this hierarchy has been changed since {@link #savepoint()} * was called. If so, saves the previous member. If {@code safe} is false, * never saves the previous member. * *

Use {@code safe = false} only if you are sure that the context has * been set before. For example, * *

* int n = 0;
* for (Member member : members) {
*   evaluator.setContext(member, n++ > 0);
* }
* * @param member New member * @param safe Whether to store the member of this hierarchy that was * current last time that {@link #savepoint()} was called. */ void setContext(Member member, boolean safe); /** * Sets the context to a list of members. * *

Equivalent to * *

for (Member member : memberList) {
*   setContext(member);
* }
* * @param memberList List of members */ void setContext(List memberList); /** * Sets the context to a list of members, optionally skipping the check * whether it is necessary to store the previous member of each hierarchy. * *

Equivalent to * *

for (Member member : memberList) {
*   setContext(member, safe);
* }
* * @param memberList List of members * @param safe Whether to store the member of each hierarchy that was * current last time that {@link #savepoint()} was called. */ void setContext(List memberList, boolean safe); /** * Sets the context to an array of members. * *

Equivalent to * *

for (Member member : memberList) {
*   setContext(member);
* }
* * @param members Array of members */ void setContext(Member[] members); /** * Sets the context to an array of members, optionally skipping the check * whether it is necessary to store the previous member of each hierarchy. * *

Equivalent to * *

for (Member member : memberList) {
*   setContext(member, safe);
* }
* * @param members Array of members * @param safe Whether to store the member of each hierarchy that was * current last time that {@link #savepoint()} was called. */ void setContext(Member[] members, boolean safe); Member getContext(Hierarchy hierarchy); /** * Calculates and returns the value of the cell at the current context. */ Object evaluateCurrent(); /** * Returns the format string for this cell. This is computed by evaluating * the format expression in the current context, and therefore different * cells may have different format strings. */ public String getFormatString(); /** * Formats a value as a string according to the current context's * format. */ String format(Object o); /** * Formats a value as a string according to the current context's * format, using a given format string. */ String format(Object o, String formatString); /** * Obsolete method. * * @deprecated Will be removed in mondrian-4 */ int getDepth(); /** * Returns parent evaluator. * * @deprecated Will be removed in mondrian-4 */ Evaluator getParent(); /** * Returns the connection's locale. */ Locale getConnectionLocale(); /** * Retrieves the value of property name. If more than one * member in the current context defines that property, the one with the * highest solve order has precedence. * *

If the property is not defined, default value is returned. */ Object getProperty(String name, Object defaultValue); /** * Returns a {@link SchemaReader} appropriate for the current * access-control context. */ SchemaReader getSchemaReader(); /** * Simple caching of the result of an Exp. The * key for the cache consists of all members of the current * context that exp depends on. Members of * independent hierarchies are not part of the key. * * @see mondrian.calc.Calc#dependsOn(Hierarchy) */ Object getCachedResult(ExpCacheDescriptor key); /** * Returns true for an axis that is NON EMPTY. * *

May be used by expression * evaluators to optimize their result. For example, a top-level crossjoin * may be optimized by removing all non-empty set elements before * performing the crossjoin. This is possible because of the identity * *

nonempty(crossjoin(a, b)) == * nonempty(crossjoin(nonempty(a), nonempty(b));
*/ boolean isNonEmpty(); /** * Sets whether an expression evaluation should filter out empty cells. * Allows expressions to modify non empty flag to evaluate their children. */ void setNonEmpty(boolean nonEmpty); /** * Creates an exception which indicates that an error has occurred during * the runtime evaluation of a function. The caller should then throw that * exception. */ RuntimeException newEvalException(Object context, String s); /** * Returns an evaluator for a set. * * @param exp Expression * @param create Whether to create evaluator if not found * @return Evaluator of named set */ SetEvaluator getSetEvaluator(Exp exp, boolean create); /** * Returns an evaluator for a named set. * * @param namedSet Named set * @param create Whether to create evaluator if not found * @return Evaluator of named set */ NamedSetEvaluator getNamedSetEvaluator(NamedSet namedSet, boolean create); /** * Returns an array of the members which make up the current context. */ Member[] getMembers(); /** * Returns an array of the non-All members which make up the current * context. * *

Notes:

    *
  • The 0th element is a measure, but otherwise the order of the * members is unspecified. *
  • No hierarchy occurs more than once. *
  • In rare circumstances, some of the members may be an 'All' member. *
  • The list may contain calculated members. *
*/ Member[] getNonAllMembers(); /** * Returns the number of times that this evaluator has told a lie when * retrieving cell values. */ int getMissCount(); /** * Returns the value of a parameter, evaluating its default value if it is * not set. */ Object getParameterValue(ParameterSlot slot); /** * @return the iteration length of the current context */ int getIterationLength(); /** * Sets the iteration length for the current evaluator context * * @param length length to be set */ void setIterationLength(int length); /** * @return true if evaluating axes */ boolean isEvalAxes(); /** * Indicate whether the evaluator is evaluating the axes * * @param evalAxes true if evaluating axes */ void setEvalAxes(boolean evalAxes); /** * Returns a new Aggregator whose aggregation context adds a given list of * tuples, and whose evaluation context is the same as this * Aggregator. * * @param list List of tuples * @return Aggregator with list added to its aggregation * context */ Evaluator pushAggregation(List> list); /** * Returns whether hierarchies unrelated to the measure in the current * context should be ignored. * * @return whether hierarchies unrelated to the measure in the current * context should be ignored */ boolean shouldIgnoreUnrelatedDimensions(); /** * Returns the base (non-virtual) cube that the current measure in the * context belongs to. * @return Cube */ Cube getMeasureCube(); /** * Returns whether it is necessary to check whether to return null for * an unrelated dimension. If false, we never need to check: we can assume * that {@link #needToReturnNullForUnrelatedDimension(mondrian.olap.Member[])} * will always return false. * * @return whether it is necessary to check whether to return null for * an unrelated dimension */ boolean mightReturnNullForUnrelatedDimension(); /** * If IgnoreMeasureForNonJoiningDimension is set to true and one or more * members are on unrelated dimension for the measure in current context * then returns true. * *

You must not call this method unless * {@link #mightReturnNullForUnrelatedDimension()} has returned true. * * @param members Dimensions for the members need to be checked whether * related or unrelated * * @return boolean */ boolean needToReturnNullForUnrelatedDimension(Member[] members); /** * Returns whether native evaluation is enabled in this context. * * @return whether native evaluation is enabled in this context */ boolean nativeEnabled(); /** * Sets whether native evaluation should be used. * * @param nativeEnabled Whether native evaluation should be used */ void setNativeEnabled(boolean nativeEnabled); /** * Returns whether the current context is an empty cell. * * @return Whether the current context is an empty cell */ boolean currentIsEmpty(); /** * Returns the member that was the current evaluation context for a * particular hierarchy before the most recent change in context. * * @param hierarchy Hierarchy * @return Previous context member for given hierarchy */ Member getPreviousContext(Hierarchy hierarchy); /** * Returns the query timing context for this execution. * * @return query timing context */ QueryTiming getTiming(); /** * Interface for evaluating a particular named set. */ interface NamedSetEvaluator { /** * Returns an iterator over the tuples of the named set. Applicable if * the named set is a set of tuples. * *

The iterator from this iterable maintains the current ordinal * property required for the methods {@link #currentOrdinal()} and * {@link #currentTuple()}. * * @param eval Evaluator for current context * * @return Iterable over the tuples of the set */ TupleIterable evaluateTupleIterable(Evaluator eval); /** * Returns the ordinal of the current member or tuple in the named set. * * @return Ordinal of the current member or tuple in the named set */ int currentOrdinal(); /** * Returns the current member in the named set. * *

Applicable if the named set is a set of members. * * @return Current member */ Member currentMember(); /** * Returns the current tuple in the named set. * *

Applicable if the named set is a set of tuples. * * @return Current tuple. */ Member[] currentTuple(); } /** * Interface for generically evaluating a set. */ interface SetEvaluator { /** * Returns an iterator over the tuples of the named set. Applicable if * the named set is a set of tuples. * *

The iterator from this iterable maintains the current ordinal * property required for the methods {@link #currentOrdinal()} and * {@link #currentTuple()}. * * @return Iterable over the tuples of the set */ TupleIterable evaluateTupleIterable(); /** * Returns the ordinal of the current member or tuple in the named set. * * @return Ordinal of the current member or tuple in the named set */ int currentOrdinal(); /** * Returns the current member in the named set. * *

Applicable if the named set is a set of members. * * @return Current member */ Member currentMember(); /** * Returns the current tuple in the named set. * *

Applicable if the named set is a set of tuples. * * @return Current tuple. */ Member[] currentTuple(); } } // End Evaluator.java mondrian-3.11.0.1-R/src/main/mondrian/olap/Exp.java000066400000000000000000000040161261646570300216300ustar00rootroot00000000000000/* // This software is subject to the terms of the Eclipse Public License v1.0 // Agreement, available at the following URL: // http://www.eclipse.org/legal/epl-v10.html. // You must accept the terms of that agreement to use this software. // // Copyright (C) 1999-2005 Julian Hyde // Copyright (C) 2005-2006 Pentaho and others // All Rights Reserved. */ package mondrian.olap; import mondrian.calc.Calc; import mondrian.calc.ExpCompiler; import mondrian.mdx.MdxVisitor; import mondrian.olap.type.Type; import java.io.PrintWriter; /** * An Exp is an MDX expression. * * @author jhyde, 20 January, 1999 * @since 1.0 */ public interface Exp { Exp clone(); /** * Returns the {@link Category} of the expression. * * @post Category.instance().isValid(return) */ int getCategory(); /** * Returns the type of this expression. Never null. */ Type getType(); /** * Writes the MDX representation of this expression to a print writer. * Sub-expressions are invoked recursively. * * @param pw PrintWriter */ void unparse(PrintWriter pw); /** * Validates this expression. * * The validator acts in the role of 'visitor' (see Gang of Four * 'visitor pattern'), and an expression in the role of 'visitee'. * * @param validator Validator contains validation context * * @return The validated expression; often but not always the same as * this expression */ Exp accept(Validator validator); /** * Converts this expression into an a tree of expressions which can be * efficiently evaluated. * * @param compiler * @return A compiled expression */ Calc accept(ExpCompiler compiler); /** * Accepts a visitor to this Exp. * The implementation should generally dispatches to the * {@link MdxVisitor#visit} method appropriate to the type of expression. * * @param visitor Visitor */ Object accept(MdxVisitor visitor); } // End Exp.java mondrian-3.11.0.1-R/src/main/mondrian/olap/ExpBase.java000066400000000000000000000031531261646570300224240ustar00rootroot00000000000000/* // This software is subject to the terms of the Eclipse Public License v1.0 // Agreement, available at the following URL: // http://www.eclipse.org/legal/epl-v10.html. // You must accept the terms of that agreement to use this software. // // Copyright (C) 1999-2005 Julian Hyde // Copyright (C) 2005-2009 Pentaho and others // All Rights Reserved. */ package mondrian.olap; import mondrian.calc.Calc; import mondrian.calc.ExpCompiler; import java.io.PrintWriter; /** * Skeleton implementation of {@link Exp} interface. * * @author jhyde, 20 January, 1999 */ public abstract class ExpBase extends QueryPart implements Exp { protected static Exp[] cloneArray(Exp[] a) { Exp[] a2 = new Exp[a.length]; for (int i = 0; i < a.length; i++) { a2[i] = a[i].clone(); } return a2; } protected ExpBase() { } public abstract Exp clone(); public static void unparseList( PrintWriter pw, Exp[] exps, String start, String mid, String end) { pw.print(start); for (int i = 0; i < exps.length; i++) { if (i > 0) { pw.print(mid); } exps[i].unparse(pw); } pw.print(end); } public static int[] getTypes(Exp[] exps) { int[] types = new int[exps.length]; for (int i = 0; i < exps.length; i++) { types[i] = exps[i].getCategory(); } return types; } public Calc accept(ExpCompiler compiler) { throw new UnsupportedOperationException(this.toString()); } } // End ExpBase.java mondrian-3.11.0.1-R/src/main/mondrian/olap/ExpCacheDescriptor.java000066400000000000000000000061741261646570300246220ustar00rootroot00000000000000/* // This software is subject to the terms of the Eclipse Public License v1.0 // Agreement, available at the following URL: // http://www.eclipse.org/legal/epl-v10.html. // You must accept the terms of that agreement to use this software. // // Copyright (C) 2005-2005 Julian Hyde // Copyright (C) 2005-2009 Pentaho // All Rights Reserved. */ package mondrian.olap; import mondrian.calc.*; import mondrian.calc.impl.BetterExpCompiler; import java.util.ArrayList; import java.util.List; /** * Holds information necessary to add an expression to the expression result * cache (see {@link Evaluator#getCachedResult(ExpCacheDescriptor)}). * * @author jhyde * @since Aug 16, 2005 */ public class ExpCacheDescriptor { private final Exp exp; private int[] dependentHierarchyOrdinals; private final Calc calc; /** * Creates a descriptor with a given compiled expression. * * @param exp Expression * @param calc Compiled expression * @param evaluator Evaluator */ public ExpCacheDescriptor(Exp exp, Calc calc, Evaluator evaluator) { this.calc = calc; this.exp = exp; computeDepends(calc, evaluator); } /** * Creates a descriptor. * * @param exp Expression * @param evaluator Evaluator */ public ExpCacheDescriptor(Exp exp, Evaluator evaluator) { this(exp, new BetterExpCompiler(evaluator, null)); } /** * Creates a descriptor. * * @param exp Expression * @param compiler Compiler */ public ExpCacheDescriptor(Exp exp, ExpCompiler compiler) { this.exp = exp; // Compile expression. Calc calc = compiler.compile(exp); if (calc == null) { // now allow conversions calc = compiler.compileAs(exp, null, ResultStyle.ANY_ONLY); } this.calc = calc; // Compute list of dependent dimensions. computeDepends(calc, compiler.getEvaluator()); } private void computeDepends(Calc calc, Evaluator evaluator) { final List ordinalList = new ArrayList(); final Member[] members = evaluator.getMembers(); for (int i = 0; i < members.length; i++) { Hierarchy hierarchy = members[i].getHierarchy(); if (calc.dependsOn(hierarchy)) { ordinalList.add(i); } } dependentHierarchyOrdinals = new int[ordinalList.size()]; for (int i = 0; i < dependentHierarchyOrdinals.length; i++) { dependentHierarchyOrdinals[i] = ordinalList.get(i); } } public Exp getExp() { return exp; } public Calc getCalc() { return calc; } public Object evaluate(Evaluator evaluator) { return calc.evaluate(evaluator); } /** * Returns the ordinals of the hierarchies which this expression is * dependent upon. When the cache descriptor is used to generate a cache * key, the key will consist of a member from each of these hierarchies. */ public int[] getDependentHierarchyOrdinals() { return dependentHierarchyOrdinals; } } // End ExpCacheDescriptor.java mondrian-3.11.0.1-R/src/main/mondrian/olap/Explain.java000066400000000000000000000021371261646570300224760ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.olap; import java.io.PrintWriter; /** * Explain statement. * * @author jhyde */ public class Explain extends QueryPart { private final QueryPart query; /** * Creates an Explain statement. * * @param query Query (SELECT or DRILLTHROUGH) */ Explain( QueryPart query) { this.query = query; assert this.query != null; assert this.query instanceof Query || this.query instanceof DrillThrough; } @Override public void unparse(PrintWriter pw) { pw.print("EXPLAIN PLAN FOR "); query.unparse(pw); } @Override public Object[] getChildren() { return new Object[] {query}; } public QueryPart getQuery() { return query; } } // End Explain.java mondrian-3.11.0.1-R/src/main/mondrian/olap/Formula.java000066400000000000000000000515031261646570300225040ustar00rootroot00000000000000/* // This software is subject to the terms of the Eclipse Public License v1.0 // Agreement, available at the following URL: // http://www.eclipse.org/legal/epl-v10.html. // You must accept the terms of that agreement to use this software. // // Copyright (C) 2000-2005 Julian Hyde // Copyright (C) 2005-2012 Pentaho and others // All Rights Reserved. */ package mondrian.olap; import mondrian.mdx.*; import mondrian.olap.type.*; import mondrian.resource.MondrianResource; import mondrian.rolap.RolapCalculatedMember; import java.io.PrintWriter; import java.util.*; /** * A Formula is a clause in an MDX query which defines a Set or a * Member. */ public class Formula extends QueryPart { /** name of set or member */ private final Id id; /** defining expression */ private Exp exp; // properties/solve order of member private final MemberProperty[] memberProperties; /** * true is this is a member, * false if it is a set. */ private final boolean isMember; private Member mdxMember; private NamedSet mdxSet; /** * Constructs formula specifying a set. */ public Formula(Id id, Exp exp) { this(false, id, exp, new MemberProperty[0], null, null); createElement(null); } /** * Constructs a formula specifying a member. */ public Formula( Id id, Exp exp, MemberProperty[] memberProperties) { this(true, id, exp, memberProperties, null, null); } Formula( boolean isMember, Id id, Exp exp, MemberProperty[] memberProperties, Member mdxMember, NamedSet mdxSet) { this.isMember = isMember; this.id = id; this.exp = exp; this.memberProperties = memberProperties; this.mdxMember = mdxMember; this.mdxSet = mdxSet; assert !(!isMember && mdxMember != null); assert !(isMember && mdxSet != null); } public Object clone() { return new Formula( isMember, id, exp.clone(), MemberProperty.cloneArray(memberProperties), mdxMember, mdxSet); } static Formula[] cloneArray(Formula[] x) { Formula[] x2 = new Formula[x.length]; for (int i = 0; i < x.length; i++) { x2[i] = (Formula) x[i].clone(); } return x2; } /** * Resolves identifiers into objects. * * @param validator Validation context to resolve the identifiers in this * formula */ void accept(Validator validator) { final boolean scalar = isMember; exp = validator.validate(exp, scalar); String id = this.id.toString(); final Type type = exp.getType(); if (isMember) { if (!TypeUtil.canEvaluate(type)) { throw MondrianResource.instance().MdxMemberExpIsSet.ex( exp.toString()); } } else { if (!TypeUtil.isSet(type)) { throw MondrianResource.instance().MdxSetExpNotSet.ex(id); } } for (MemberProperty memberProperty : memberProperties) { validator.validate(memberProperty); } // Get the format expression from the property list, or derive it from // the formula. if (isMember) { Exp formatExp = getFormatExp(validator); if (formatExp != null) { mdxMember.setProperty( Property.FORMAT_EXP_PARSED.name, formatExp); mdxMember.setProperty( Property.FORMAT_EXP.name, Util.unparse(formatExp)); } final List memberPropertyList = new ArrayList(Arrays.asList(memberProperties)); // put CELL_FORMATTER_SCRIPT_LANGUAGE first, if it exists; we must // see it before CELL_FORMATTER_SCRIPT. for (int i = 0; i < memberPropertyList.size(); i++) { MemberProperty memberProperty = memberPropertyList.get(i); if (memberProperty.getName().equals( Property.CELL_FORMATTER_SCRIPT_LANGUAGE.name)) { memberPropertyList.remove(i); memberPropertyList.add(0, memberProperty); } } // For each property of the formula, make it a property of the // member. for (MemberProperty memberProperty : memberPropertyList) { if (Property.FORMAT_PROPERTIES.contains( memberProperty.getName())) { continue; // we already dealt with format_string props } final Exp exp = memberProperty.getExp(); if (exp instanceof Literal) { String value = String.valueOf(((Literal) exp).getValue()); mdxMember.setProperty(memberProperty.getName(), value); } } } } /** * Creates the {@link Member} or {@link NamedSet} object which this formula * defines. */ void createElement(Query q) { // first resolve the name, bit by bit final List segments = id.getSegments(); if (isMember) { if (mdxMember != null) { return; } OlapElement mdxElement = q.getCube(); final SchemaReader schemaReader = q.getSchemaReader(false); for (int i = 0; i < segments.size(); i++) { final Id.Segment segment0 = segments.get(i); if (!(segment0 instanceof Id.NameSegment)) { throw Util.newError( "Calculated member name must not contain member keys"); } final Id.NameSegment segment = (Id.NameSegment) segment0; OlapElement parent = mdxElement; mdxElement = null; // The last segment of the id is the name of the calculated // member so no need to look for a pre-existing child. This // avoids unnecessarily executing SQL and loading children into // cache. if (i != segments.size() - 1) { mdxElement = schemaReader.getElementChild(parent, segment); } // Don't try to look up the member which the formula is // defining. We would only find one if the member is overriding // a member at the cube or schema level, and we don't want to // change that member's properties. if (mdxElement == null || i == segments.size() - 1) { // this part of the name was not found... define it Level level; Member parentMember = null; if (parent instanceof Member) { parentMember = (Member) parent; level = parentMember.getLevel().getChildLevel(); if (level == null) { throw Util.newError( "The '" + segment + "' calculated member cannot be created " + "because its parent is at the lowest level " + "in the " + parentMember.getHierarchy().getUniqueName() + " hierarchy."); } } else { final Hierarchy hierarchy; if (parent instanceof Dimension && MondrianProperties.instance() .SsasCompatibleNaming.get()) { Dimension dimension = (Dimension) parent; if (dimension.getHierarchies().length == 1) { hierarchy = dimension.getHierarchies()[0]; } else { hierarchy = null; } } else { hierarchy = parent.getHierarchy(); } if (hierarchy == null) { throw MondrianResource.instance() .MdxCalculatedHierarchyError.ex(id.toString()); } level = hierarchy.getLevels()[0]; } if (parentMember != null && parentMember.isCalculated()) { throw Util.newError( "The '" + parent + "' calculated member cannot be used as a parent" + " of another calculated member."); } Member mdxMember = level.getHierarchy().createMember( parentMember, level, segment.getName(), this); assert mdxMember != null; mdxElement = mdxMember; } } this.mdxMember = (Member) mdxElement; } else { // don't need to tell query... it's already in query.formula Util.assertTrue( segments.size() == 1, "set names must not be compound"); final Id.Segment segment0 = segments.get(0); if (!(segment0 instanceof Id.NameSegment)) { throw Util.newError( "Calculated member name must not contain member keys"); } // Caption and description are initialized to null, and annotations // to the empty map. If named set is defined in the schema, we will // give these their true values later. mdxSet = new SetBase( ((Id.NameSegment) segment0).getName(), null, null, exp, false, Collections.emptyMap()); } } public Object[] getChildren() { Object[] children = new Object[1 + memberProperties.length]; children[0] = exp; System.arraycopy( memberProperties, 0, children, 1, memberProperties.length); return children; } public void unparse(PrintWriter pw) { if (isMember) { pw.print("member "); if (mdxMember != null) { pw.print(mdxMember.getUniqueName()); } else { id.unparse(pw); } } else { pw.print("set "); id.unparse(pw); } pw.print(" as '"); exp.unparse(pw); pw.print("'"); if (memberProperties != null) { for (MemberProperty memberProperty : memberProperties) { pw.print(", "); memberProperty.unparse(pw); } } } public boolean isMember() { return isMember; } public NamedSet getNamedSet() { return mdxSet; } /** * Returns the Identifier of the set or member which is declared by this * Formula. * * @return Identifier */ public Id getIdentifier() { return id; } /** Returns this formula's name. */ public String getName() { return (isMember) ? mdxMember.getName() : mdxSet.getName(); } /** Returns this formula's caption. */ public String getCaption() { return (isMember) ? mdxMember.getCaption() : mdxSet.getName(); } /** * Changes the last part of the name to newName. For example, * [Abc].[Def].[Ghi] becomes [Abc].[Def].[Xyz]; * and the member or set is renamed from Ghi to * Xyz. */ void rename(String newName) { String oldName = getElement().getName(); final List segments = this.id.getSegments(); assert Util.last(segments) instanceof Id.NameSegment; assert ((Id.NameSegment) Util.last(segments)).name .equalsIgnoreCase(oldName); segments.set( segments.size() - 1, new Id.NameSegment(newName)); if (isMember) { mdxMember.setName(newName); } else { mdxSet.setName(newName); } } /** Returns the unique name of the member or set. */ String getUniqueName() { return (isMember) ? mdxMember.getUniqueName() : mdxSet.getUniqueName(); } OlapElement getElement() { return (isMember) ? (OlapElement) mdxMember : (OlapElement) mdxSet; } public Exp getExpression() { return exp; } private Exp getMemberProperty(String name) { return MemberProperty.get(memberProperties, name); } /** * Returns the Member. (Not valid if this formula defines a set.) * * @pre isMember() * @post return != null */ public Member getMdxMember() { return mdxMember; } /** * Returns the solve order. (Not valid if this formula defines a set.) * * @pre isMember() * @return Solve order, or null if SOLVE_ORDER property is not specified * or is not a number or is not constant */ public Number getSolveOrder() { return getIntegerMemberProperty(Property.SOLVE_ORDER.name); } /** * Returns the integer value of a given constant. * If the property is not set, or its * value is not an integer, or its value is not a constant, * returns null. * * @param name Property name * @return Value of the property, or null if the property is not set, or its * value is not an integer, or its value is not a constant. */ private Number getIntegerMemberProperty(String name) { Exp exp = getMemberProperty(name); if (exp != null && exp.getType() instanceof NumericType) { return quickEval(exp); } return null; } /** * Evaluates a constant numeric expression. * @param exp Expression * @return Result as a number, or null if the expression is not a constant * or not a number. */ private static Number quickEval(Exp exp) { if (exp instanceof Literal) { Literal literal = (Literal) exp; final Object value = literal.getValue(); if (value instanceof Number) { return (Number) value; } else { return null; } } if (exp instanceof FunCall) { FunCall call = (FunCall) exp; if (call.getFunName().equals("-") && call.getSyntax() == Syntax.Prefix) { final Number number = quickEval(call.getArg(0)); if (number == null) { return null; } else if (number instanceof Integer) { return - number.intValue(); } else { return - number.doubleValue(); } } } return null; } /** * Deduces a formatting expression for this calculated member. First it * looks for properties called "format", "format_string", etc. Then it looks * inside the expression, and returns the formatting expression for the * first member it finds. * @param validator */ private Exp getFormatExp(Validator validator) { // If they have specified a format string (which they can do under // several names) return that. for (String prop : Property.FORMAT_PROPERTIES) { Exp formatExp = getMemberProperty(prop); if (formatExp != null) { return formatExp; } } // Choose a format appropriate to the expression. // For now, only do it for decimals. final Type type = exp.getType(); if (type instanceof DecimalType) { int scale = ((DecimalType) type).getScale(); String formatString = "#,##0"; if (scale > 0) { formatString = formatString + "."; while (scale-- > 0) { formatString = formatString + "0"; } } return Literal.createString(formatString); } if (!mdxMember.isMeasure()) { // Don't try to do any format string inference on non-measure // calculated members; that can hide the correct formatting // from base measures (see TestCalculatedMembers.testFormatString // for an example). return null; } // Burrow into the expression. If we find a member, use its format // string. try { exp.accept(new FormatFinder(validator)); return null; } catch (FoundOne foundOne) { return foundOne.exp; } } public void compile() { // nothing to do } /** * Accepts a visitor to this Formula. * The default implementation dispatches to the * {@link MdxVisitor#visit(Formula)} method. * * @param visitor Visitor */ public Object accept(MdxVisitor visitor) { final Object o = visitor.visit(this); if (visitor.shouldVisitChildren()) { // visit the expression exp.accept(visitor); } return o; } private static class FoundOne extends RuntimeException { private final Exp exp; public FoundOne(Exp exp) { super(); this.exp = exp; } } /** *A visitor for burrowing format information given a member. */ private static class FormatFinder extends MdxVisitorImpl { private final Validator validator; /** * * @param validator to resolve unresolved expressions */ public FormatFinder(Validator validator) { this.validator = validator; } public Object visit(MemberExpr memberExpr) { Member member = memberExpr.getMember(); returnFormula(member); if (member.isCalculated() && member instanceof RolapCalculatedMember && !hasCyclicReference(memberExpr)) { Formula formula = ((RolapCalculatedMember) member).getFormula(); formula.accept(validator); returnFormula(member); } return super.visit(memberExpr); } /** * * @param expr * @return true if there is cyclic reference in expression. * This check is required to avoid infinite recursion */ private boolean hasCyclicReference(Exp expr) { List expList = new ArrayList(); return hasCyclicReference(expr, expList); } private boolean hasCyclicReference(Exp expr, List expList) { if (expr instanceof MemberExpr) { MemberExpr memberExpr = (MemberExpr) expr; if (expList.contains(expr)) { return true; } expList.add(memberExpr); Member member = memberExpr.getMember(); if (member instanceof RolapCalculatedMember) { RolapCalculatedMember calculatedMember = (RolapCalculatedMember) member; Exp exp1 = calculatedMember.getExpression().accept(validator); return hasCyclicReference(exp1, expList); } } if (expr instanceof FunCall) { FunCall funCall = (FunCall) expr; Exp[] exps = funCall.getArgs(); for (int i = 0; i < exps.length; i++) { if (hasCyclicReference( exps[i], cloneForEachBranch(expList))) { return true; } } } return false; } private List cloneForEachBranch(List expList) { ArrayList list = new ArrayList(); list.addAll(expList); return list; } private void returnFormula(Member member) { if (getFormula(member) != null) { throw new FoundOne(getFormula(member)); } } private Exp getFormula(Member member) { return (Exp) member.getPropertyValue(Property.FORMAT_EXP_PARSED.name); } } } // End Formula.java mondrian-3.11.0.1-R/src/main/mondrian/olap/FunCall.java000066400000000000000000000030141261646570300224150ustar00rootroot00000000000000/* // This software is subject to the terms of the Eclipse Public License v1.0 // Agreement, available at the following URL: // http://www.eclipse.org/legal/epl-v10.html. // You must accept the terms of that agreement to use this software. // // Copyright (C) 1998-2005 Julian Hyde // Copyright (C) 2005-2006 Pentaho and others // All Rights Reserved. */ package mondrian.olap; /** * A FunCall is a function applied to a list of operands. * *

The parser creates function calls as an * {@link mondrian.mdx.UnresolvedFunCall unresolved function call}. * The validator converts it to a * {@link mondrian.mdx.ResolvedFunCall resolved function call}, * which has a {@link FunDef function definition} and extra type information. * * @author jhyde * @since Jan 6, 2006 */ public interface FunCall extends Exp { /** * Returns the indexth argument to this function * call. * * @param index Ordinal of the argument * @return indexth argument to this function call */ Exp getArg(int index); /** * Returns the arguments to this function. * * @return array of arguments */ Exp[] getArgs(); /** * Returns the number of arguments to this function. * * @return number of arguments */ int getArgCount(); /** * Returns the name of the function. */ String getFunName(); /** * Returns the syntax of the call. */ Syntax getSyntax(); } // End FunCall.java mondrian-3.11.0.1-R/src/main/mondrian/olap/FunDef.java000066400000000000000000000045051261646570300222460ustar00rootroot00000000000000/* // This software is subject to the terms of the Eclipse Public License v1.0 // Agreement, available at the following URL: // http://www.eclipse.org/legal/epl-v10.html. // You must accept the terms of that agreement to use this software. // // Copyright (C) 1999-2005 Julian Hyde // Copyright (C) 2005-2006 Pentaho and others // All Rights Reserved. */ package mondrian.olap; import mondrian.calc.Calc; import mondrian.calc.ExpCompiler; import mondrian.mdx.ResolvedFunCall; import java.io.PrintWriter; /** * Definition of an MDX function. See also {@link FunTable}. * * @author jhyde, 21 April, 1999 */ public interface FunDef { /** * Returns the syntactic type of the function. */ Syntax getSyntax(); /** * Returns the name of this function. */ String getName(); /** * Returns the description of this function. */ String getDescription(); /** * Returns the {@link Category} code of the value returned by this * function. */ int getReturnCategory(); /** * Returns the types of the arguments of this function. Values are the same * as those returned by {@link Exp#getCategory()}. The 0th * argument of methods and properties are the object they are applied * to. Infix operators have two arguments, and prefix operators have one * argument. */ int[] getParameterCategories(); /** * Creates an expression which represents a call to this function with * a given set of arguments. The result is usually a {@link ResolvedFunCall} but * not always. */ Exp createCall(Validator validator, Exp[] args); /** * Returns an English description of the signature of the function, for * example "<Numeric Expression> / <Numeric Expression>". */ String getSignature(); /** * Converts a function call into MDX source code. */ void unparse(Exp[] args, PrintWriter pw); /** * Converts a call to this function into executable objects. * *

The result must implement the appropriate interface for the result * type. For example, a function which returns an integer must return * an object which implements {@link mondrian.calc.IntegerCalc}. */ Calc compileCall(ResolvedFunCall call, ExpCompiler compiler); } // End FunDef.java mondrian-3.11.0.1-R/src/main/mondrian/olap/FunTable.java000066400000000000000000000071311261646570300225750ustar00rootroot00000000000000/* // This software is subject to the terms of the Eclipse Public License v1.0 // Agreement, available at the following URL: // http://www.eclipse.org/legal/epl-v10.html. // You must accept the terms of that agreement to use this software. // // Copyright (C) 2002-2005 Julian Hyde // Copyright (C) 2005-2009 Pentaho and others // All Rights Reserved. */ package mondrian.olap; import mondrian.olap.fun.FunInfo; import mondrian.olap.fun.Resolver; import java.util.List; /** * List of all MDX functions. * *

A function table can resolve a function call, using a particular * {@link Syntax} and set of arguments, to a * function definition ({@link FunDef}).

* * @author jhyde, 3 March, 2002 */ public interface FunTable { /** * Returns whether a string is a reserved word. */ boolean isReserved(String s); /** * Returns whether a string is a property-style (postfix) * operator. This is used during parsing to disambiguate * functions from unquoted member names. */ boolean isProperty(String s); /** * Returns a list of words ({@link String}) which may not be used as * identifiers. */ List getReservedWords(); /** * Returns a list of {@link mondrian.olap.fun.Resolver} objects. */ List getResolvers(); /** * Returns a list of resolvers for an operator with a given name and syntax. * Never returns null; if there are no resolvers, returns the empty list. * * @param name Operator name * @param syntax Operator syntax * @return List of resolvers for the operator */ List getResolvers( String name, Syntax syntax); /** * Returns a list of {@link mondrian.olap.fun.FunInfo} objects. */ List getFunInfoList(); /** * This method is called from the constructor, to define the set of * functions and reserved words recognized. * *

The implementing class calls {@link Builder} methods to declare * functions and reserved words. * *

Derived class can override this method to add more functions. It must * call the base method. * * @param builder Builder */ void defineFunctions(Builder builder); /** * Builder that assists with the construction of a function table by * providing callbacks to define functions. * *

An implementation of {@link mondrian.olap.FunTable} must register all * of its functions and operators by making callbacks during its * {@link mondrian.olap.FunTable#defineFunctions(mondrian.olap.FunTable.Builder)} * method. */ public interface Builder { /** * Defines a function. * * @param funDef Function definition */ void define(FunDef funDef); /** * Defines a resolver that will resolve overloaded function calls to * function definitions. * * @param resolver Function call resolver */ void define(Resolver resolver); /** * Defines a function info that is not matchd by an actual function. * The function will be implemented via implicit conversions, but * we still want the function info to appear in the metadata. * * @param funInfo Function info */ void define(FunInfo funInfo); /** * Defines a reserved word. * * @param keyword Reserved word * * @see mondrian.olap.FunTable#isReserved */ void defineReserved(String keyword); } } // End FunTable.java mondrian-3.11.0.1-R/src/main/mondrian/olap/Hierarchy.java000066400000000000000000000045471261646570300230230ustar00rootroot00000000000000/* // This software is subject to the terms of the Eclipse Public License v1.0 // Agreement, available at the following URL: // http://www.eclipse.org/legal/epl-v10.html. // You must accept the terms of that agreement to use this software. // // Copyright (C) 1999-2005 Julian Hyde // Copyright (C) 2005-2011 Pentaho and others // All Rights Reserved. */ package mondrian.olap; /** * A Hierarchy is a set of members, organized into levels. */ public interface Hierarchy extends OlapElement, Annotated { /** * Returns the dimension this hierarchy belongs to. */ Dimension getDimension(); /** * Returns the levels in this hierarchy. * *

If a hierarchy is subject to access-control, some of the levels may * not be visible; use {@link SchemaReader#getHierarchyLevels} instead. * * @post return != null */ Level[] getLevels(); /** * Returns the default member of this hierarchy. * *

If a hierarchy is subject to access-control, the default member may * not be visible, so use {@link SchemaReader#getHierarchyDefaultMember}. * * @post return != null */ Member getDefaultMember(); /** * Returns the "All" member of this hierarchy. * * @post return != null */ Member getAllMember(); /** * Returns a special member representing the "null" value. This never * occurs on an axis, but may occur if functions such as Lead, * NextMember and ParentMember walk off the end * of the hierarchy. * * @post return != null */ Member getNullMember(); boolean hasAll(); /** * Creates a member of this hierarchy. If this is the measures hierarchy, a * calculated member is created, and formula must not be null. */ Member createMember( Member parent, Level level, String name, Formula formula); /** * Returns the unique name of this hierarchy, always including the dimension * name, e.g. "[Time].[Time]", regardless of whether * {@link MondrianProperties#SsasCompatibleNaming} is enabled. * * @deprecated Will be removed in mondrian-4.0, when * {@link #getUniqueName()} will have this behavior. * * @return Unique name of hierarchy. */ String getUniqueNameSsas(); } // End Hierarchy.java mondrian-3.11.0.1-R/src/main/mondrian/olap/HierarchyBase.java000066400000000000000000000141301261646570300236030ustar00rootroot00000000000000/* // This software is subject to the terms of the Eclipse Public License v1.0 // Agreement, available at the following URL: // http://www.eclipse.org/legal/epl-v10.html. // You must accept the terms of that agreement to use this software. // // Copyright (C) 2001-2005 Julian Hyde // Copyright (C) 2005-2012 Pentaho and others // All Rights Reserved. */ package mondrian.olap; import mondrian.resource.MondrianResource; /** * Skeleton implementation for {@link Hierarchy}. * * @author jhyde * @since 6 August, 2001 */ public abstract class HierarchyBase extends OlapElementBase implements Hierarchy { protected final Dimension dimension; /** * name and subName are the name of the * hierarchy, respectively containing and not containing dimension * name. For example: * * * * *
uniqueName name subName
[Time.Weekly] Time.Weekly Weekly
[Customers] Customers null
* *

If {@link mondrian.olap.MondrianProperties#SsasCompatibleNaming} is * true, name and subName have the same value. */ protected final String subName; protected final String name; protected final String uniqueName; protected String description; protected Level[] levels; protected final boolean hasAll; protected String allMemberName; protected String allLevelName; protected HierarchyBase( Dimension dimension, String subName, String caption, boolean visible, String description, boolean hasAll) { this.dimension = dimension; this.hasAll = hasAll; if (caption != null) { this.caption = caption; } else if (subName == null) { this.caption = dimension.getCaption(); } else { this.caption = subName; } this.description = description; this.visible = visible; String name = dimension.getName(); if (MondrianProperties.instance().SsasCompatibleNaming.get()) { if (subName == null) { // e.g. "Time" subName = name; } this.subName = subName; this.name = subName; // e.g. "[Time].[Weekly]" for dimension "Time", hierarchy "Weekly"; // "[Time]" for dimension "Time", hierarchy "Time". this.uniqueName = subName.equals(name) ? dimension.getUniqueName() : Util.makeFqName(dimension, this.name); } else { this.subName = subName; if (this.subName != null) { // e.g. "Time.Weekly" this.name = name + "." + subName; if (this.subName.equals(name)) { this.uniqueName = dimension.getUniqueName(); } else { // e.g. "[Time.Weekly]" this.uniqueName = Util.makeFqName(this.name); } } else { // e.g. "Time" this.name = name; // e.g. "[Time]" this.uniqueName = dimension.getUniqueName(); } } } /** * Returns the name of the hierarchy sans dimension name. * * @return name of hierarchy sans dimension name */ public String getSubName() { return subName; } // implement MdxElement public String getUniqueName() { return uniqueName; } public String getUniqueNameSsas() { return Util.makeFqName(dimension, name); } public String getName() { return name; } public String getQualifiedName() { return MondrianResource.instance().MdxHierarchyName.str( getUniqueName()); } public abstract boolean isRagged(); public String getDescription() { return description; } public Dimension getDimension() { return dimension; } public Level[] getLevels() { return levels; } public Hierarchy getHierarchy() { return this; } public boolean hasAll() { return hasAll; } public boolean equals(OlapElement mdxElement) { // Use object identity, because a private hierarchy can have the same // name as a public hierarchy. return (this == mdxElement); } public OlapElement lookupChild( SchemaReader schemaReader, Id.Segment s, MatchType matchType) { OlapElement oe; if (s instanceof Id.NameSegment) { Id.NameSegment nameSegment = (Id.NameSegment) s; oe = Util.lookupHierarchyLevel(this, nameSegment.getName()); if (oe == null) { oe = Util.lookupHierarchyRootMember( schemaReader, this, nameSegment, matchType); } } else { // Key segment searches bottom level by default. For example, // [Products].&[1] is shorthand for [Products].[Product Name].&[1]. final Id.KeySegment keySegment = (Id.KeySegment) s; oe = levels[levels.length - 1] .lookupChild(schemaReader, keySegment, matchType); } if (getLogger().isDebugEnabled()) { StringBuilder buf = new StringBuilder(64); buf.append("HierarchyBase.lookupChild: "); buf.append("name="); buf.append(getName()); buf.append(", childname="); buf.append(s); if (oe == null) { buf.append(" returning null"); } else { buf.append(" returning elementname=").append(oe.getName()); } getLogger().debug(buf.toString()); } return oe; } public String getAllMemberName() { return allMemberName; } /** * Returns the name of the 'all' level in this hierarchy. * * @return name of the 'all' level */ public String getAllLevelName() { return allLevelName; } } // End HierarchyBase.java mondrian-3.11.0.1-R/src/main/mondrian/olap/Id.java000066400000000000000000000235231261646570300214340ustar00rootroot00000000000000/* // This software is subject to the terms of the Eclipse Public License v1.0 // Agreement, available at the following URL: // http://www.eclipse.org/legal/epl-v10.html. // You must accept the terms of that agreement to use this software. // // Copyright (C) 1998-2005 Julian Hyde // Copyright (C) 2005-2012 Pentaho and others // All Rights Reserved. */ package mondrian.olap; import mondrian.mdx.MdxVisitor; import mondrian.olap.type.Type; import org.olap4j.impl.UnmodifiableArrayList; import java.io.PrintWriter; import java.util.*; /** * Multi-part identifier. * * @author jhyde, 21 January, 1999 */ public class Id extends ExpBase implements Cloneable { private final List segments; /** * Creates an identifier containing a single part. * * @param segment Segment, consisting of a name and quoting style */ public Id(Segment segment) { segments = Collections.singletonList(segment); } public Id(List segments) { this.segments = segments; if (segments.size() <= 0) { throw new IllegalArgumentException(); } } public Id clone() { // This is immutable, so no need to clone. return this; } public int getCategory() { return Category.Unknown; } public Type getType() { // Can't give the type until we have resolved. throw new UnsupportedOperationException(); } public String toString() { final StringBuilder buf = new StringBuilder(); Util.quoteMdxIdentifier(segments, buf); return buf.toString(); } public String[] toStringArray() { String[] names = new String[segments.size()]; int k = 0; for (Segment segment : segments) { names[k++] = ((NameSegment) segment).getName(); } return names; } public List getSegments() { return Collections.unmodifiableList(this.segments); } public Id.Segment getElement(int i) { return segments.get(i); } /** * Returns a new Identifier consisting of this one with another segment * appended. Does not modify this Identifier. * * @param segment Name of segment * @return New identifier */ public Id append(Segment segment) { List newSegments = new ArrayList(segments); newSegments.add(segment); return new Id(newSegments); } public Exp accept(Validator validator) { if (segments.size() == 1) { final Segment s = segments.get(0); if (s.quoting == Quoting.UNQUOTED) { NameSegment nameSegment = (NameSegment) s; if (validator.getFunTable().isReserved(nameSegment.getName())) { return Literal.createSymbol( nameSegment.getName().toUpperCase()); } } } final Exp element = Util.lookup( validator.getQuery(), validator.getSchemaReader().withLocus(), segments, true); if (element == null) { return null; } return element.accept(validator); } public Object accept(MdxVisitor visitor) { return visitor.visit(this); } public void unparse(PrintWriter pw) { pw.print(toString()); } /** * Component in a compound identifier. It is described by its name and how * the name is quoted. * *

For example, the identifier * [Store].USA.[New Mexico].&[45] has four segments:

    *
  • "Store", {@link mondrian.olap.Id.Quoting#QUOTED}
  • *
  • "USA", {@link mondrian.olap.Id.Quoting#UNQUOTED}
  • *
  • "New Mexico", {@link mondrian.olap.Id.Quoting#QUOTED}
  • *
  • "45", {@link mondrian.olap.Id.Quoting#KEY}
  • *
*/ public static abstract class Segment { public final Quoting quoting; protected Segment(Quoting quoting) { this.quoting = quoting; } public String toString() { final StringBuilder buf = new StringBuilder(); toString(buf); return buf.toString(); } public Quoting getQuoting() { return quoting; } public abstract List getKeyParts(); /** * Converts an array of names to a list of segments. * * @param nameParts Array of names * @return List of segments */ public static List toList(String... nameParts) { final List segments = new ArrayList(nameParts.length); for (String namePart : nameParts) { segments.add(new NameSegment(namePart)); } return segments; } /** * Returns whether this segment matches a given name according to * the rules of case-sensitivity and quoting. * * @param name Name to match * @return Whether matches */ public abstract boolean matches(String name); /** * Appends this segment to a StringBuilder. * * @param buf String builder to write to */ public abstract void toString(StringBuilder buf); } /** * Component in a compound identifier that describes the name of an object. * Optionally, the name is quoted in brackets. * * @see KeySegment */ public static class NameSegment extends Segment { public final String name; /** * Creates a name segment with the given quoting. * * @param name Name * @param quoting Quoting style */ public NameSegment(String name, Quoting quoting) { super(quoting); this.name = name; if (name == null) { throw new NullPointerException(); } if (!(quoting == Quoting.QUOTED || quoting == Quoting.UNQUOTED)) { throw new IllegalArgumentException(); } } /** * Creates a quoted name segment. * * @param name Name */ public NameSegment(String name) { this(name, Quoting.QUOTED); } public boolean equals(final Object o) { if (this == o) { return true; } if (!(o instanceof NameSegment)) { return false; } NameSegment that = (NameSegment) o; return that.name.equals(this.name); } public int hashCode() { return name.hashCode(); } public String getName() { return name; } public List getKeyParts() { return null; } public void toString(StringBuilder buf) { switch (quoting) { case UNQUOTED: buf.append(name); return; case QUOTED: Util.quoteMdxIdentifier(name, buf); return; default: throw Util.unexpected(quoting); } } public boolean matches(String name) { switch (quoting) { case UNQUOTED: return Util.equalName(this.name, name); case QUOTED: return Util.equalName(this.name, name); default: return false; } } } /** * Identifier segment representing a key, possibly composite. */ public static class KeySegment extends Segment { public final List subSegmentList; /** * Creates a KeySegment with one or more sub-segments. * * @param subSegments Array of sub-segments */ public KeySegment(NameSegment... subSegments) { super(Quoting.KEY); if (subSegments.length < 1) { throw new IllegalArgumentException(); } this.subSegmentList = UnmodifiableArrayList.asCopyOf(subSegments); } /** * Creates a KeySegment a list of sub-segments. * * @param subSegmentList List of sub-segments */ public KeySegment(List subSegmentList) { super(Quoting.KEY); if (subSegmentList.size() < 1) { throw new IllegalArgumentException(); } this.subSegmentList = new UnmodifiableArrayList( subSegmentList.toArray( new NameSegment[subSegmentList.size()])); } public boolean equals(final Object o) { if (this == o) { return true; } if (!(o instanceof KeySegment)) { return false; } KeySegment that = (KeySegment) o; return this.subSegmentList.equals(that.subSegmentList); } public int hashCode() { return subSegmentList.hashCode(); } public void toString(StringBuilder buf) { for (NameSegment segment : subSegmentList) { buf.append('&'); segment.toString(buf); } } public List getKeyParts() { return subSegmentList; } public boolean matches(String name) { return false; } } public enum Quoting { /** * Unquoted identifier, for example "Measures". */ UNQUOTED, /** * Quoted identifier, for example "[Measures]". */ QUOTED, /** * Identifier quoted with an ampersand to indicate a key value, for * example the second segment in "[Employees].&[89]". */ KEY } } // End Id.java mondrian-3.11.0.1-R/src/main/mondrian/olap/IdBatchResolver.java000066400000000000000000000377011261646570300241230ustar00rootroot00000000000000/* // This software is subject to the terms of the Eclipse Public License v1.0 // Agreement, available at the following URL: // http://www.eclipse.org/legal/epl-v10.html. // You must accept the terms of that agreement to use this software. // // Copyright (C) 2006-2015 Pentaho and others // All Rights Reserved. */ package mondrian.olap; import mondrian.mdx.*; import org.apache.commons.collections.*; import org.apache.log4j.Logger; import java.util.*; import static org.apache.commons.collections.CollectionUtils.filter; /** * Used to collect and resolve identifiers in groups of children * where possible. For example, if an enumerated set within an MDX * query includes references to 10 stores under the parent * * [USA].[CA].[San Francisco] * * the class will attempt to identify those 10 identifiers * and issue a single lookup, resulting in fewer and more efficient * SQL queries. * The resulting collection of resolved identifiers is returned in a * map of , where the unresolved Exp object acts * as the key. * * This class makes no assurances that all identifiers will be resolved. * The map returned by .resolve() will include only those identifiers * successfully resolved. * */ public final class IdBatchResolver { static final Logger LOGGER = Logger.getLogger(IdBatchResolver.class); private final Query query; private final Formula[] formulas; private final QueryAxis[] axes; private final Cube cube; // dimension and hierarchy unique names are collected during init // to assist in classifying Ids as potentially resolvable to members. private final Collection dimensionUniqueNames = new ArrayList(); private final Collection hierarchyUniqueNames = new ArrayList(); // level names are checked against the identifiers to avoid incorrectly // interpreting a Dimension.Level reference as Dimension.Member. private final Collection levelNames = new ArrayList(); // Set of identifiers, sorted via IdComparator, which orders based // first on segment length (shortest to longest), then alphabetically. private SortedSet identifiers = new TreeSet(new IdComparator()); public IdBatchResolver(Query query) { this.query = query; formulas = query.getFormulas(); axes = query.getAxes(); cube = query.getCube(); initOlapElementNames(); initIdentifiers(); } /** * Initializes the dimensionUniqueNames, hierarchyUniqueNames and * levelNames collections based on the contents of cube. These collections * will be used to help determine whether identifiers correspond to * a dimension/hierarchy/level. */ private void initOlapElementNames() { dimensionUniqueNames.addAll( getOlapElementNames(cube.getDimensions(), true)); for (Dimension dim : cube.getDimensions()) { hierarchyUniqueNames.addAll( getOlapElementNames(dim.getHierarchies(), true)); for (Hierarchy hier : dim.getHierarchies()) { levelNames.addAll(getOlapElementNames(hier.getLevels(), false)); } } } /** * Initializes the identifiers collection by walking the axes * and formulas in the query and adding each encountered Id. * Finally, expands the set of identifiers to include parents. E.g. * if the identifier * [Store].[All Store].[USA].[CA] * is encountered, this will be expanded to include * [Store].[All Store].[USA] * [Store].[All Store] */ private void initIdentifiers() { MdxVisitor identifierVisitor = new IdentifierVisitor(identifiers); for (QueryAxis axis : axes) { axis.accept(identifierVisitor); } if (query.getSlicerAxis() != null) { query.getSlicerAxis().accept(identifierVisitor); } for (Formula formula : formulas) { formula.accept(identifierVisitor); } expandIdentifiers(identifiers); } /** * Attempts to resolve the identifiers contained in the query in * batches based on the parent, e.g. looking up and resolving the * states in the set: * { [Store].[USA].[CA], [Store].[USA].[OR] } * together rather than individually. * Note that there is no guarantee that all identifiers will be * resolved. Calculated members, for example, are explicitly not * handled here. The purpose of this class is to improve efficiency * of resolution of non-calculated members, but must be followed * by more thorough expression resolution. * * @return a Map of the expressions Id elements mapped to their * respective resolved Exp. */ public Map resolve() { return resolveInParentGroupings(identifiers); } /** * Loops through the SortedSet of Ids, attempting to load sets of * children of parent Ids. * The loop below assumes the the SortedSet is ordered by segment * size from smallest to largest, such that parent identifiers will * occur before their children. */ private Map resolveInParentGroupings( SortedSet identifiers) { final Map resolvedIdentifiers = new HashMap(); while (identifiers.size() > 0) { Id parent = identifiers.first(); identifiers.remove(parent); if (!supportedIdentifier(parent)) { continue; } Exp exp = (Exp)resolvedIdentifiers.get(parent); if (exp == null) { exp = lookupExp(resolvedIdentifiers, parent); } Member parentMember = getMemberFromExp(exp); if (!supportedMember(parentMember)) { continue; } batchResolveChildren( parent, parentMember, identifiers, resolvedIdentifiers); } return resolvedIdentifiers; } /** * Find the children of Id parent in the identifiers set and resolves * all supported children together, adding them to the resolvedIdentifiers * map. */ private void batchResolveChildren( Id parent, Member parentMember, SortedSet identifiers, Map resolvedIdentifiers) { final List children = findChildIds(parent, identifiers); final List childNameSegments = collectChildrenNameSegments(parentMember, children); if (childNameSegments.size() > 0) { List childMembers = lookupChildrenByNames(parentMember, childNameSegments); addChildrenToResolvedMap( resolvedIdentifiers, children, childMembers); } } private Exp lookupExp( Map resolvedIdentifiers, Id parent) { try { Exp exp = Util.lookup(query, parent.getSegments(), false); resolvedIdentifiers.put(parent, (QueryPart)exp); return exp; } catch (Exception exception) { LOGGER.info( String.format( "Failed to resolve '%s' during batch ID " + "resolution.", parent)); } return null; } /** * Correlates each child Id we started with to it's associated * Member, if present. Updates the resolvedIdentifiers map with * the association. */ private void addChildrenToResolvedMap( Map resolvedIdentifiers, List children, List childMembers) { for (Member child : childMembers) { for (Id childId : children) { if (!resolvedIdentifiers.containsKey(childId) && getLastSegment(childId).matches(child.getName())) { resolvedIdentifiers.put( childId, (QueryPart)Util.createExpr(child)); } } } } /** * Performs a lookup of a set of children under parentMember. */ private List lookupChildrenByNames( Member parentMember, List childNameSegments) { try { return query.getSchemaReader(true) .lookupMemberChildrenByNames( parentMember, childNameSegments, MatchType.EXACT); } catch (Exception e) { LOGGER.info( String.format( "Failure while looking up children of '%s' during " + "batch member resolution. Child member refs: %s", parentMember, Arrays.toString(childNameSegments.toArray())), e); } // don't want to fail at this point. Member resolution still has // another chance to succeed. return Collections.emptyList(); } /** * Filters the children list to those that contain identifiers * we think we can batch resolve, then transforms the Id list * to the corresponding NameSegment. */ private List collectChildrenNameSegments( final Member parentMember, List children) { filter( children, new Predicate() { // remove children we can't support public boolean evaluate(Object theId) { Id id = (Id)theId; return !Util.matches(parentMember, id.getSegments()) && supportedIdentifier(id); } }); return new ArrayList( CollectionUtils.collect( children, new Transformer() { // convert the collection to a list of NameSegments public Object transform(Object theId) { Id id = (Id)theId; return getLastSegment(id); } })); } private Id.Segment getLastSegment(Id id) { int segSize = id.getSegments().size(); return id.getSegments().get(segSize - 1); } /** * Checks various conditions to determine whether * the given identifier is likely to be resolvable at this point. */ private boolean supportedIdentifier(Id id) { Id.Segment seg = getLastSegment(id); if (!(seg instanceof Id.NameSegment)) { // we can't batch resolve members identified by key return false; } return (isPossibleMemberRef(id)) && !segmentIsCalcMember(id.getSegments()) && !id.getSegments().get(0).matches("Measures"); } private boolean supportedMember(Member member) { return !(member == null || member.equals( member.getHierarchy().getNullMember()) || member.isMeasure()); } /** * Returns the [All] member from HierarchyExpr and DimensionExpr * associated with hierarchies that have an All member. * Returns the member associated with a MemberExpr. * For all other Exp returns null. */ private Member getMemberFromExp(Exp exp) { if (exp instanceof DimensionExpr) { Hierarchy hier = ((DimensionExpr)exp) .getDimension().getHierarchy(); if (hier.hasAll()) { return hier.getAllMember(); } } else if (exp instanceof HierarchyExpr) { Hierarchy hier = ((HierarchyExpr)exp) .getHierarchy(); if (hier.hasAll()) { return hier.getAllMember(); } } else if (exp instanceof MemberExpr) { return ((MemberExpr)exp).getMember(); } return null; } /** * Returns a collection of strings corresponding to the name * or uniqueName of each OlapElement in olapElements, based on the * flag uniqueName. */ private Collection getOlapElementNames( OlapElement[] olapElements, final boolean uniqueName) { return CollectionUtils.collect( Arrays.asList(olapElements), new Transformer() { public Object transform(Object o) { return uniqueName ? ((OlapElement)o).getUniqueName() : ((OlapElement)o).getName(); } }); } /** * Returns true if the Id is something that will potentially translate into * either the All/Default member of a dimension/hierarchy, * or a specific member. * This filters out references that we'd be unlikely to effectively * handle. */ private boolean isPossibleMemberRef(Id id) { int size = id.getSegments().size(); if (size == 1) { //Id.Segment seg = id.getSegments().get(0); return segListMatchInUniqueNames( id.getSegments(), dimensionUniqueNames) || segListMatchInUniqueNames( id.getSegments(), hierarchyUniqueNames); } if (MondrianProperties.instance().SsasCompatibleNaming.get() && size == 2) { return segListMatchInUniqueNames( id.getSegments(), hierarchyUniqueNames); } if (segMatchInNames(getLastSegment(id), levelNames)) { // conservative. false on any match of any level name return false; } // don't support "shortcut" member references references return size > 1; } private boolean segListMatchInUniqueNames( List segments, Collection names) { String segUniqueName = Util.implode(segments); for (String name : names) { if (Util.equalName(segUniqueName, name)) { return true; } } return false; } private boolean segMatchInNames( Id.Segment seg, Collection names) { for (String name : names) { if (seg.matches(name)) { return true; } } return false; } private boolean segmentIsCalcMember(final List checkSegments) { return query.getSchemaReader(true) .getCalculatedMember(checkSegments) != null; } private List findChildIds(Id parent, SortedSet identifiers) { List childIds = new ArrayList(); for (Id id : identifiers) { final List idSeg = id.getSegments(); final List parentSegments = parent.getSegments(); final int parentSegSize = parentSegments.size(); if (idSeg.size() == parentSegSize + 1 && parent.getSegments().equals( idSeg.subList(0, parentSegSize))) { childIds.add(id); } } return childIds; } /** * Adds each parent segment to the set. */ private void expandIdentifiers(Set identifiers) { Set expandedIdentifiers = new HashSet(); for (Id id : identifiers) { for (int i = 1; i < id.getSegments().size(); i++) { expandedIdentifiers.add(new Id(id.getSegments().subList(0, i))); } } identifiers.addAll(expandedIdentifiers); } /** * Sorts shorter segments first, then by string compare. * This allows processing parents first during the lookup loop, * which is required by the algorithm. */ private static class IdComparator implements Comparator { public int compare(Id o1, Id o2) { List o1Seg = o1.getSegments(); List o2Seg = o2.getSegments(); if (o1Seg.size() > o2Seg.size()) { return 1; } else if (o1Seg.size() < o2Seg.size()) { return -1; } else { return o1Seg.toString() .compareTo(o2Seg.toString()); } } } } // End IdBatchResolver.java mondrian-3.11.0.1-R/src/main/mondrian/olap/IdentifierVisitor.java000066400000000000000000000012761261646570300245430ustar00rootroot00000000000000/* // This software is subject to the terms of the Eclipse Public License v1.0 // Agreement, available at the following URL: // http://www.eclipse.org/legal/epl-v10.html. // You must accept the terms of that agreement to use this software. // // Copyright (C) 2006-2015 Pentaho and others // All Rights Reserved. */ package mondrian.olap; import mondrian.mdx.*; import java.util.*; public class IdentifierVisitor extends MdxVisitorImpl { private final Set identifiers; public IdentifierVisitor(Set identifiers) { this.identifiers = identifiers; } public Object visit(Id id) { identifiers.add(id); return null; } } // End IdentifierVisitor.java mondrian-3.11.0.1-R/src/main/mondrian/olap/InvalidArgumentException.java000066400000000000000000000014311261646570300260420ustar00rootroot00000000000000/* // This software is subject to the terms of the Eclipse Public License v1.0 // Agreement, available at the following URL: // http://www.eclipse.org/legal/epl-v10.html. // You must accept the terms of that agreement to use this software. // // Copyright (C) 2005-2005 Julian Hyde // Copyright (C) 2005-2007 Pentaho and others // All Rights Reserved. */ package mondrian.olap; /** * Exception which indicates that an argument is invalid * * @author Thiyagu * @since April 5, 2007 */ public class InvalidArgumentException extends MondrianException { /** * Creates a InvalidArgumentException. * * @param message Localized error message */ public InvalidArgumentException(String message) { super(message); } } // End InvalidArgumentException.java mondrian-3.11.0.1-R/src/main/mondrian/olap/InvalidHierarchyException.java000066400000000000000000000014331261646570300262000ustar00rootroot00000000000000/* // This software is subject to the terms of the Eclipse Public License v1.0 // Agreement, available at the following URL: // http://www.eclipse.org/legal/epl-v10.html. // You must accept the terms of that agreement to use this software. // // Copyright (C) 2005-2005 Julian Hyde // Copyright (C) 2005-2007 Pentaho and others // All Rights Reserved. */ package mondrian.olap; /** * Exception which indicates that a Cube is invalid * because there is a hierarchy with no members. */ public class InvalidHierarchyException extends MondrianException { /** * Creates a InvalidHierarchyException. * * @param message Localized error message */ public InvalidHierarchyException(String message) { super(message); } } // End InvalidHierarchyException.java mondrian-3.11.0.1-R/src/main/mondrian/olap/Level.java000066400000000000000000000034621261646570300221470ustar00rootroot00000000000000/* // This software is subject to the terms of the Eclipse Public License v1.0 // Agreement, available at the following URL: // http://www.eclipse.org/legal/epl-v10.html. // You must accept the terms of that agreement to use this software. // // Copyright (C) 1999-2005 Julian Hyde // Copyright (C) 2005-2011 Pentaho and others // All Rights Reserved. */ package mondrian.olap; import mondrian.spi.MemberFormatter; /** * A Level is a group of {@link Member}s in a {@link Hierarchy}, * all with the same attributes and at the same depth in the hierarchy. * * @author jhyde, 1 March, 1999 */ public interface Level extends OlapElement, Annotated { /** * Returns the depth of this level. * *

Note #1: In an access-controlled context, the first visible level of * a hierarchy (as returned by {@link SchemaReader#getHierarchyLevels}) may * not have a depth of 0.

* *

Note #2: In a parent-child hierarchy, the depth of a member (as * returned by {@link SchemaReader#getMemberDepth}) may not be the same as * the depth of its level. */ int getDepth(); Hierarchy getHierarchy(); Level getChildLevel(); Level getParentLevel(); boolean isAll(); boolean areMembersUnique(); LevelType getLevelType(); /** Returns properties defined against this level. */ Property[] getProperties(); /** Returns properties defined against this level and parent levels. */ Property[] getInheritedProperties(); /** * Returns the object that is used to format members of this level. */ MemberFormatter getMemberFormatter(); /** * Returns the approximate number of members in this level, or * {@link Integer#MIN_VALUE} if no approximation is known. */ int getApproxRowCount(); } // End Level.java mondrian-3.11.0.1-R/src/main/mondrian/olap/LevelBase.java000066400000000000000000000064511261646570300227430ustar00rootroot00000000000000/* // This software is subject to the terms of the Eclipse Public License v1.0 // Agreement, available at the following URL: // http://www.eclipse.org/legal/epl-v10.html. // You must accept the terms of that agreement to use this software. // // Copyright (C) 2001-2005 Julian Hyde // Copyright (C) 2005-2012 Pentaho and others // All Rights Reserved. */ package mondrian.olap; import mondrian.resource.MondrianResource; import mondrian.spi.MemberFormatter; /** * Skeleton implementation of {@link Level}. * * @author jhyde * @since 6 August, 2001 */ public abstract class LevelBase extends OlapElementBase implements Level { protected final Hierarchy hierarchy; protected final String name; protected final String uniqueName; protected final String description; protected final int depth; protected final LevelType levelType; protected MemberFormatter memberFormatter; protected int approxRowCount; protected LevelBase( Hierarchy hierarchy, String name, String caption, boolean visible, String description, int depth, LevelType levelType) { this.hierarchy = hierarchy; this.name = name; this.caption = caption; this.visible = visible; this.description = description; this.uniqueName = Util.makeFqName(hierarchy, name); this.depth = depth; this.levelType = levelType; } /** * Sets the approximate number of members in this Level. * @see #getApproxRowCount() */ public void setApproxRowCount(int approxRowCount) { this.approxRowCount = approxRowCount; } // from Element public String getQualifiedName() { return MondrianResource.instance().MdxLevelName.str(getUniqueName()); } public LevelType getLevelType() { return levelType; } public String getUniqueName() { return uniqueName; } public String getName() { return name; } public String getDescription() { return description; } public Hierarchy getHierarchy() { return hierarchy; } public Dimension getDimension() { return hierarchy.getDimension(); } public int getDepth() { return depth; } public Level getChildLevel() { int childDepth = depth + 1; Level[] levels = hierarchy.getLevels(); return (childDepth < levels.length) ? levels[childDepth] : null; } public Level getParentLevel() { int parentDepth = depth - 1; Level[] levels = hierarchy.getLevels(); return (parentDepth >= 0) ? levels[parentDepth] : null; } public abstract boolean isAll(); public boolean isMeasure() { return hierarchy.getName().equals("Measures"); } public OlapElement lookupChild( SchemaReader schemaReader, Id.Segment s, MatchType matchType) { if (areMembersUnique() && s instanceof Id.NameSegment) { return Util.lookupHierarchyRootMember( schemaReader, hierarchy, ((Id.NameSegment) s), matchType); } else { return null; } } public MemberFormatter getMemberFormatter() { return memberFormatter; } } // End LevelBase.java mondrian-3.11.0.1-R/src/main/mondrian/olap/LevelType.java000066400000000000000000000053631261646570300230130ustar00rootroot00000000000000/* // This software is subject to the terms of the Eclipse Public License v1.0 // Agreement, available at the following URL: // http://www.eclipse.org/legal/epl-v10.html. // You must accept the terms of that agreement to use this software. // // Copyright (C) 2004-2005 Julian Hyde // Copyright (C) 2005-2011 Pentaho // All Rights Reserved. */ package mondrian.olap; /** * Enumerates the types of levels. * * @deprecated Will be replaced with {@link org.olap4j.metadata.Level.Type} * before mondrian-4.0. * * @author jhyde * @since 5 April, 2004 */ public enum LevelType { /** Indicates that the level is not related to time. */ Regular, /** * Indicates that a level refers to years. * It must be used in a dimension whose type is * {@link DimensionType#TimeDimension}. */ TimeYears, /** * Indicates that a level refers to half years. * It must be used in a dimension whose type is * {@link DimensionType#TimeDimension}. */ TimeHalfYears, /** * Indicates that a level refers to quarters. * It must be used in a dimension whose type is * {@link DimensionType#TimeDimension}. */ TimeQuarters, /** * Indicates that a level refers to months. * It must be used in a dimension whose type is * {@link DimensionType#TimeDimension}. */ TimeMonths, /** * Indicates that a level refers to weeks. * It must be used in a dimension whose type is * {@link DimensionType#TimeDimension}. */ TimeWeeks, /** * Indicates that a level refers to days. * It must be used in a dimension whose type is * {@link DimensionType#TimeDimension}. */ TimeDays, /** * Indicates that a level refers to hours. * It must be used in a dimension whose type is * {@link DimensionType#TimeDimension}. */ TimeHours, /** * Indicates that a level refers to minutes. * It must be used in a dimension whose type is * {@link DimensionType#TimeDimension}. */ TimeMinutes, /** * Indicates that a level refers to seconds. * It must be used in a dimension whose type is * {@link DimensionType#TimeDimension}. */ TimeSeconds, /** * Indicates that a level is an unspecified time period. * It must be used in a dimension whose type is * {@link DimensionType#TimeDimension}. */ TimeUndefined, /** * Indicates that a level holds the null member. */ Null; /** * Returns whether this is a time level. * * @return Whether this is a time level. */ public boolean isTime() { return ordinal() >= TimeYears.ordinal() && ordinal() <= TimeUndefined.ordinal(); } } // End LevelType.java mondrian-3.11.0.1-R/src/main/mondrian/olap/Literal.java000066400000000000000000000120441261646570300224700ustar00rootroot00000000000000/* // This software is subject to the terms of the Eclipse Public License v1.0 // Agreement, available at the following URL: // http://www.eclipse.org/legal/epl-v10.html. // You must accept the terms of that agreement to use this software. // // Copyright (C) 1998-2005 Julian Hyde // Copyright (C) 2005-2011 Pentaho and others // All Rights Reserved. */ package mondrian.olap; import mondrian.calc.Calc; import mondrian.calc.ExpCompiler; import mondrian.calc.impl.ConstantCalc; import mondrian.mdx.MdxVisitor; import mondrian.olap.type.*; import org.olap4j.impl.UnmodifiableArrayMap; import java.io.PrintWriter; import java.math.BigDecimal; import java.util.Map; /** * Represents a constant value, such as a string or number, in a parse tree. * *

Symbols, such as the ASC keyword in * Order([Store].Members, [Measures].[Unit Sales], ASC), are * also represented as Literals. * * @author jhyde, 21 January, 1999 */ public class Literal extends ExpBase { // Data members. public final int category; private final Object o; // Constants for commonly used literals. public static final Literal nullValue = new Literal(Category.Null, null); public static final Literal emptyString = new Literal(Category.String, ""); public static final Literal zero = new Literal(Category.Numeric, BigDecimal.ZERO); public static final Literal one = new Literal(Category.Numeric, BigDecimal.ONE); public static final Literal negativeOne = new Literal(Category.Numeric, BigDecimal.ONE.negate()); public static final Literal doubleZero = zero; public static final Literal doubleOne = one; public static final Literal doubleNegativeOne = negativeOne; private static final Map MAP = UnmodifiableArrayMap.of( BigDecimal.ZERO, zero, BigDecimal.ONE, one, BigDecimal.ONE.negate(), negativeOne); /** * Private constructor. * *

Use the creation methods {@link #createString(String)} etc. */ private Literal(int type, Object o) { this.category = type; this.o = o; } /** * Creates a string literal. * @see #createSymbol */ public static Literal createString(String s) { return (s.equals("")) ? emptyString : new Literal(Category.String, s); } /** * Creates a symbol. * * @see #createString */ public static Literal createSymbol(String s) { return new Literal(Category.Symbol, s); } /** * Creates a numeric literal. * * @deprecated Use {@link #create(java.math.BigDecimal)} */ public static Literal create(Double d) { return new Literal(Category.Numeric, new BigDecimal(d)); } /** * Creates an integer literal. * * @deprecated Use {@link #create(java.math.BigDecimal)} */ public static Literal create(Integer i) { return new Literal(Category.Numeric, new BigDecimal(i)); } /** * Creates a numeric literal. * *

Using a {@link BigDecimal} allows us to store the precise value that * the user typed. We will have to fit the value into a native * {@code double} or {@code int} later on, but parse time is not the time to * be throwing away information. */ public static Literal create(BigDecimal d) { final Literal literal = MAP.get(d); if (literal != null) { return literal; } return new Literal(Category.Numeric, d); } public Literal clone() { return this; } public void unparse(PrintWriter pw) { switch (category) { case Category.Symbol: case Category.Numeric: pw.print(o); break; case Category.String: pw.print(Util.quoteForMdx((String) o)); break; case Category.Null: pw.print("NULL"); break; default: throw Util.newInternal("bad literal type " + category); } } public int getCategory() { return category; } public Type getType() { switch (category) { case Category.Symbol: return new SymbolType(); case Category.Numeric: return new NumericType(); case Category.String: return new StringType(); case Category.Null: return new NullType(); default: throw Category.instance.badValue(category); } } public Exp accept(Validator validator) { return this; } public Calc accept(ExpCompiler compiler) { return new ConstantCalc(getType(), o); } public Object accept(MdxVisitor visitor) { return visitor.visit(this); } public Object getValue() { return o; } public int getIntValue() { if (o instanceof Number) { return ((Number) o).intValue(); } else { throw Util.newInternal("cannot convert " + o + " to int"); } } } // End Literal.java mondrian-3.11.0.1-R/src/main/mondrian/olap/MatchType.java000066400000000000000000000022121261646570300227660ustar00rootroot00000000000000/* // This software is subject to the terms of the Eclipse Public License v1.0 // Agreement, available at the following URL: // http://www.eclipse.org/legal/epl-v10.html. // You must accept the terms of that agreement to use this software. // // Copyright (C) 2003-2005 Julian Hyde // Copyright (C) 2005-2011 Pentaho // All Rights Reserved. */ package mondrian.olap; /** * MatchType enumerates the allowable match modes when * searching for a member based on its unique name. * * @author Zelaine Fong */ public enum MatchType { /** Match the unique name exactly, do not query database for members */ EXACT_SCHEMA, /** Match the unique name exactly */ EXACT, /** If no exact match, return the preceding member */ BEFORE, /** If no exact match, return the next member */ AFTER, /** Return the first child */ FIRST, /** Return the last child */ LAST; /** * Return true if either Exact or Exact Schema value * is selected. * * @return true if exact */ public boolean isExact() { return this == EXACT || this == EXACT_SCHEMA; } } // End MatchType.java mondrian-3.11.0.1-R/src/main/mondrian/olap/Member.java000066400000000000000000000137001261646570300223030ustar00rootroot00000000000000/* // This software is subject to the terms of the Eclipse Public License v1.0 // Agreement, available at the following URL: // http://www.eclipse.org/legal/epl-v10.html. // You must accept the terms of that agreement to use this software. // // Copyright (C) 1999-2005 Julian Hyde // Copyright (C) 2005-2015 Pentaho and others // All Rights Reserved. */ package mondrian.olap; import java.util.List; /** * A Member is a 'point' on a dimension of a cube. Examples are * [Time].[1997].[January], * [Customer].[All Customers], * [Customer].[USA].[CA], * [Measures].[Unit Sales]. * *

Every member belongs to a {@link Level} of a {@link Hierarchy}. Members * except the root member have a parent, and members not at the leaf level * have one or more children. * *

Measures are a special kind of member. They belong to their own * dimension, [Measures]. * *

There are also special members representing the 'All' value of a * hierarchy, the null value, and the error value. * *

Members can have member properties. Their {@link Level#getProperties} * defines which are allowed. * * @author jhyde, 2 March, 1999 */ public interface Member extends OlapElement, Comparable, Annotated { /** * Returns this member's parent, or null (not the 'null member', as * returned by {@link Hierarchy#getNullMember}) if it has no parent. * *

In an access-control context, a member may have no visible * parents, so use {@link SchemaReader#getMemberParent}. */ Member getParentMember(); Level getLevel(); Hierarchy getHierarchy(); /** * Returns name of parent member, or empty string (not null) if we are the * root. */ String getParentUniqueName(); /** * Returns the type of member. */ MemberType getMemberType(); /** * @return True when the member is a leaf member, meaning it has no children */ boolean isParentChildLeaf(); /** * @return True when the member is part of a Parent-Child hierarchy and it * is a physical member. In a Parent Child Hierarchy without a closure * table, each member needs to be treated as calculated. We need a way to * distinguish between true calculated members and physical members that * exist in the source data */ boolean isParentChildPhysicalMember(); enum MemberType { UNKNOWN, REGULAR, // adMemberRegular ALL, MEASURE, FORMULA, /** * This member is its hierarchy's NULL member (such as is returned by * [Gender].[All Gender].PrevMember, for example). */ NULL } /** * Only allowable if the member is part of the WITH clause of * a query. */ void setName(String name); /** Returns whether this is the 'all' member. */ boolean isAll(); /** Returns whether this is a member of the measures dimension. */ boolean isMeasure(); /** Returns whether this is the 'null member'. */ boolean isNull(); /** * Returns whether member is equal to, a child, or a * descendent of this Member. */ boolean isChildOrEqualTo(Member member); /** Returns whether this member is computed using either a with * member clause in an mdx query or a calculated member defined in * cube. */ boolean isCalculated(); /** * Returns whether this member should be evaluated within the Evaluator. * *

Normally {@link #isCalculated} and {@link #isEvaluated} should return * the same value, but in situations where mondrian would like to treat the * two concepts separately such in role based security, these values may * differ. * * @return true if evaluated */ boolean isEvaluated(); int getSolveOrder(); Exp getExpression(); /** * Returns a list of the ancestor members of this member. * * @deprecated Use * {@link SchemaReader#getMemberAncestors(Member, java.util.List)}. */ List getAncestorMembers(); /** * Returns whether this member is computed from a {@code WITH MEMBER} * clause in an MDX query. */ boolean isCalculatedInQuery(); /** * Returns the value of the property named propertyName. * Name match is case-sensitive. */ Object getPropertyValue(String propertyName); /** * Returns the value of the property named propertyName, * matching according to the required case-sensitivity. */ Object getPropertyValue(String propertyName, boolean matchCase); /** * Returns the formatted value of the property named * propertyName. */ String getPropertyFormattedValue(String propertyName); /** * Sets a property of this member to a given value. */ void setProperty(String name, Object value); /** * Returns the definitions of the properties this member may have. */ Property[] getProperties(); /** * Returns the ordinal of the member. */ int getOrdinal(); /** * Returns the order key of the member (relative to its siblings); * null if undefined or unavailable. */ Comparable getOrderKey(); /** * Returns whether this member is 'hidden', as per the rules which define * a ragged hierarchy. */ boolean isHidden(); /** * returns the depth of this member, which is not the level's depth * in case of parent child dimensions * @return depth */ int getDepth(); /** * Returns the system-generated data member that is associated with a * nonleaf member of a dimension. * *

Returns this member if this member is a leaf member, or if the * nonleaf member does not have an associated data member.

*/ Member getDataMember(); } // End Member.java mondrian-3.11.0.1-R/src/main/mondrian/olap/MemberBase.java000066400000000000000000000210301261646570300230710ustar00rootroot00000000000000/* // This software is subject to the terms of the Eclipse Public License v1.0 // Agreement, available at the following URL: // http://www.eclipse.org/legal/epl-v10.html. // You must accept the terms of that agreement to use this software. // // Copyright (C) 2001-2005 Julian Hyde // Copyright (C) 2005-2015 Pentaho and others // All Rights Reserved. */ package mondrian.olap; import mondrian.resource.MondrianResource; import mondrian.spi.MemberFormatter; import mondrian.util.Bug; import java.util.ArrayList; import java.util.List; /** * MemberBase is a partial implementation of {@link Member}. * * @author jhyde * @since 6 August, 2001 */ public abstract class MemberBase extends OlapElementBase implements Member { protected Member parentMember; protected final Level level; protected String uniqueName; /** * Combines member type and other properties, such as whether the member * is the 'all' or 'null' member of its hierarchy and whether it is a * measure or is calculated, into an integer field. * *

The fields are:

    *
  • bits 0, 1, 2 ({@link #FLAG_TYPE_MASK}) are member type; *
  • bit 3 ({@link #FLAG_HIDDEN}) is set if the member is hidden; *
  • bit 4 ({@link #FLAG_ALL}) is set if this is the all member of its * hierarchy; *
  • bit 5 ({@link #FLAG_NULL}) is set if this is the null member of its * hierarchy; *
  • bit 6 ({@link #FLAG_CALCULATED}) is set if this is a calculated * member. *
  • bit 7 ({@link #FLAG_MEASURE}) is set if this is a measure. *
* * NOTE: jhyde, 2007/8/10. It is necessary to cache whether the member is * 'all', 'calculated' or 'null' in the member's state, because these * properties are used so often. If we used a virtual method call - say we * made each subclass implement 'boolean isNull()' - it would be slower. * We use one flags field rather than 4 boolean fields to save space. */ protected final int flags; private static final int FLAG_TYPE_MASK = 0x07; private static final int FLAG_HIDDEN = 0x08; private static final int FLAG_ALL = 0x10; private static final int FLAG_NULL = 0x20; private static final int FLAG_CALCULATED = 0x40; private static final int FLAG_MEASURE = 0x80; /** * Cached values of {@link mondrian.olap.Member.MemberType} enumeration. * Without caching, get excessive calls to {@link Object#clone}. */ private static final MemberType[] MEMBER_TYPE_VALUES = MemberType.values(); protected MemberBase( Member parentMember, Level level, MemberType memberType) { this.parentMember = parentMember; this.level = level; this.flags = memberType.ordinal() | (memberType == MemberType.ALL ? FLAG_ALL : 0) | (memberType == MemberType.NULL ? FLAG_NULL : 0) | (computeCalculated(memberType) ? FLAG_CALCULATED : 0) | (level.getHierarchy().getDimension().isMeasures() ? FLAG_MEASURE : 0); } protected MemberBase() { this.flags = 0; this.level = null; } public String getQualifiedName() { return MondrianResource.instance().MdxMemberName.str(getUniqueName()); } public abstract String getName(); public String getUniqueName() { return uniqueName; } public String getCaption() { // if there is a member formatter for the members level, // we will call this interface to provide the display string MemberFormatter mf = getLevel().getMemberFormatter(); if (mf != null) { return mf.formatMember(this); } final String caption = super.getCaption(); return (caption != null) ? caption : getName(); } public String getParentUniqueName() { return parentMember == null ? null : parentMember.getUniqueName(); } public Dimension getDimension() { return level.getDimension(); } public Hierarchy getHierarchy() { return level.getHierarchy(); } public Level getLevel() { return level; } public MemberType getMemberType() { return MEMBER_TYPE_VALUES[flags & FLAG_TYPE_MASK]; } public String getDescription() { return (String) getPropertyValue(Property.DESCRIPTION.name); } public boolean isMeasure() { return (flags & FLAG_MEASURE) != 0; } public boolean isAll() { return (flags & FLAG_ALL) != 0; } public boolean isNull() { return (flags & FLAG_NULL) != 0; } public boolean isCalculated() { return (flags & FLAG_CALCULATED) != 0; } public boolean isEvaluated() { // should just call isCalculated(), but called in tight loops // and too many subclass implementations for jit to inline properly? return (flags & FLAG_CALCULATED) != 0; } public OlapElement lookupChild( SchemaReader schemaReader, Id.Segment childName, MatchType matchType) { return schemaReader.lookupMemberChildByName( this, childName, matchType); } // implement Member public Member getParentMember() { return parentMember; } // implement Member public boolean isChildOrEqualTo(Member member) { // REVIEW: Using uniqueName to calculate ancestry seems inefficient, // because we can't afford to store every member's unique name, so // we want to compute it on the fly assert !Bug.BugSegregateRolapCubeMemberFixed; return (member != null) && isChildOrEqualTo(member.getUniqueName()); } /** * Returns whether this Member's unique name is equal to, a * child of, or a descendent of a member whose unique name is * uniqueName. */ public boolean isChildOrEqualTo(String uniqueName) { if (uniqueName == null) { return false; } return isChildOrEqualTo(this, uniqueName); } private static boolean isChildOrEqualTo(Member member, String uniqueName) { while (true) { String thisUniqueName = member.getUniqueName(); if (thisUniqueName.equals(uniqueName)) { // found a match return true; } // try candidate's parentMember member = member.getParentMember(); if (member == null) { // have reached root return false; } } } /** * Computes the value to be returned by {@link #isCalculated()}, so it can * be cached in a variable. * * @param memberType Member type * @return Whether this member is calculated */ protected boolean computeCalculated(final MemberType memberType) { // If the member is not created from the "with member ..." MDX, the // calculated will be null. But it may be still a calculated measure // stored in the cube. return isCalculatedInQuery() || memberType == MemberType.FORMULA; } public int getSolveOrder() { return -1; } /** * Returns the expression by which this member is calculated. The expression * is not null if and only if the member is not calculated. * * @post (return != null) == (isCalculated()) */ public Exp getExpression() { return null; } // implement Member public List getAncestorMembers() { final SchemaReader schemaReader = getDimension().getSchema().getSchemaReader(); final ArrayList ancestorList = new ArrayList(); schemaReader.getMemberAncestors(this, ancestorList); return ancestorList; } /** * Returns the ordinal of this member within its hierarchy. * The default implementation returns -1. */ public int getOrdinal() { return -1; } /** * Returns the order key of this member among its siblings. * The default implementation returns null. */ public Comparable getOrderKey() { return null; } public boolean isHidden() { return false; } public Member getDataMember() { return null; } public String getPropertyFormattedValue(String propertyName) { return getPropertyValue(propertyName).toString(); } public boolean isParentChildPhysicalMember() { return false; } public boolean isParentChildLeaf() { return false; } } // End MemberBase.java mondrian-3.11.0.1-R/src/main/mondrian/olap/MemberFormatter.java000066400000000000000000000013661261646570300241740ustar00rootroot00000000000000/* // This software is subject to the terms of the Eclipse Public License v1.0 // Agreement, available at the following URL: // http://www.eclipse.org/legal/epl-v10.html. // You must accept the terms of that agreement to use this software. // // Copyright (C) 2004-2005 TONBELLER AG // Copyright (C) 2006-2011 Pentaho and others // All Rights Reserved. */ package mondrian.olap; /** * An SPI to redefine the caption displayed for members. * * @deprecated Use {@link mondrian.spi.MemberFormatter}. This interface * exists for temporary backwards compatibility and will be removed * in mondrian-4.0. * * @author hhaas * @since 6 October, 2004 */ public interface MemberFormatter extends mondrian.spi.MemberFormatter { } // End MemberFormatter.java mondrian-3.11.0.1-R/src/main/mondrian/olap/MemberProperty.java000066400000000000000000000034571261646570300240600ustar00rootroot00000000000000/* // This software is subject to the terms of the Eclipse Public License v1.0 // Agreement, available at the following URL: // http://www.eclipse.org/legal/epl-v10.html. // You must accept the terms of that agreement to use this software. // // Copyright (C) 2000-2005 Julian Hyde // Copyright (C) 2005-2006 Pentaho and others // All Rights Reserved. */ package mondrian.olap; import java.io.PrintWriter; /** * Member property or solve order specification. * * @author jhyde, 1 March, 2000 */ public class MemberProperty extends QueryPart { private final String name; private Exp exp; public MemberProperty(String name, Exp exp) { this.name = name; this.exp = exp; } protected Object clone() { return new MemberProperty(name, (Exp) exp.clone()); } static MemberProperty[] cloneArray(MemberProperty[] x) { MemberProperty[] x2 = new MemberProperty[x.length]; for (int i = 0; i < x.length; i++) { x2[i] = (MemberProperty) x[i].clone(); } return x2; } void resolve(Validator validator) { exp = validator.validate(exp, false); } public Exp getExp() { return exp; } public String getName() { return name; } public Object[] getChildren() { return new Exp[] {exp}; } public void unparse(PrintWriter pw) { pw.print(name + " = "); exp.unparse(pw); } /** * Retrieves a property by name from an array. */ static Exp get(MemberProperty[] a, String name) { // TODO: Linear search may be a performance problem. for (int i = 0; i < a.length; i++) { if (Util.equalName(a[i].name, name)) { return a[i].exp; } } return null; } } // End MemberProperty.java mondrian-3.11.0.1-R/src/main/mondrian/olap/MemoryLimitExceededException.java000066400000000000000000000017461261646570300266600ustar00rootroot00000000000000/* // This software is subject to the terms of the Eclipse Public License v1.0 // Agreement, available at the following URL: // http://www.eclipse.org/legal/epl-v10.html. // You must accept the terms of that agreement to use this software. // // Copyright (C) 2004-2005 TONBELLER AG // Copyright (C) 2006-2009 Pentaho and others // All Rights Reserved. */ package mondrian.olap; /** * Exception which indicates some resource limit was exceeded. * When a client receives a MemoryLimitExceededException the state * of the objects associated with the query execution can NOT be * counted on being correct - specifically data structures could be * in an inconsistent state or missing entirely. No attempt should be * make to access or use the result objects. */ public class MemoryLimitExceededException extends ResultLimitExceededException { public MemoryLimitExceededException(String message) { super(message); } } // End MemoryLimitExceededException.java mondrian-3.11.0.1-R/src/main/mondrian/olap/Mondrian.xml000066400000000000000000002630771261646570300225400ustar00rootroot00000000000000 This is the XML model for Mondrian schemas.

Revision is $Id$

A schema is a collection of cubes and virtual cubes. It can also contain shared dimensions (for use by those cubes), named sets, roles, and declarations of user-defined functions.

Name of this schema Description of this schema. Label for the measures dimension. Can be localized from Properties file using #{propertyname}. The name of the default role for connections to this schema Contains values of user-defined properties. This schema's parameter definitions. Shared dimensions in this schema. Cubes in this schema. Virtual cubes in this schema. Named sets in this schema. Roles in this schema. Declarations of user-defined functions in this schema. A CubeDimension is either a usage of a Dimension ('shared dimension', in MSOLAP parlance), or a 'private dimension'. A string being displayed instead of the Dimension's name. Can be localized from Properties file using #{propertyname}. Whether this dimension is visible in the user-interface. Default true. Description of this dimension. Can be localized from Properties file using #{propertyname}. The name of the column in the fact table which joins to the leaf level of this dimension. Required in a private Dimension or a DimensionUsage, but not in a public Dimension. Flag to mark this dimension as a high cardinality one and avoid caching. Contains values of user-defined properties. Never returns null; if the dimension cannot be * found, throws an error. * * @param schema Schema, never null * @pre schema != null * @post return != null */ public abstract Dimension getDimension(Schema schema);]]> Definition of a cube. Name of this cube. A string being displayed instead of the cube's name. Can be localized from Properties file using #{propertyname}. Whether this cube is visible in the user-interface. Default true. Description of this cube. Can be localized from Properties file using #{propertyname}. The name of the measure that would be taken as the default measure of the cube. Should the Fact table data for this Cube be cached by Mondrian or not. The default action is to cache the data. Whether element is enabled - if true, then the Cube is realized otherwise it is ignored. Contains values of user-defined properties. The fact table is the source of all measures in this cube. If this is a Table and the schema name is not present, table name is left unqualified. Calculated members in this cube. Named sets in this cube. A VirtualCube is a set of dimensions and measures gleaned from other cubes. Whether this element is enabled - if true, then the Virtual Cube is realized otherwise it is ignored. The name of the measure that would be taken as the default measure of the cube. A string being displayed instead of the cube's name. Can be localized from Properties file using #{propertyname}. Whether this cube is visible in the user-interface. Default true. Description of this virtual cube. Can be localized from Properties file using #{propertyname}. Contains values of user-defined properties. Calculated members that belong to this virtual cube. (Calculated members inherited from other cubes should not be in this list.) Named sets in this cube. List of base cubes used by the virtual cube. Name of the cube which the virtualCube uses. Unrelated dimensions to measures in this cube will be pushed to top level member. A VirtualCubeDimension is a usage of a Dimension in a VirtualCube. Name of the cube which the dimension belongs to, or unspecified if the dimension is shared. Name of the dimension. A VirtualCubeMeasure is a usage of a Measure in a VirtualCube. Name of the cube which the measure belongs to. Unique name of the measure within its cube. Whether this member is visible in the user-interface. Default true. Contains values of user-defined properties. A DimensionUsage is usage of a shared Dimension within the context of a cube. Name of the source dimension. Must be a dimension in this schema. Case-sensitive. Name of the level to join to. If not specified, joins to the lowest level of the dimension. If present, then this is prepended to the Dimension column names during the building of collapse dimension aggregates allowing 1) different dimension usages to be disambiguated during aggregate table recognition and 2) multiple shared dimensions that have common column names to be disambiguated. A Dimension is a collection of hierarchies. There are two kinds: a public dimension belongs to a Schema, and be used by several cubes; a private dimension belongs to a Cube. The foreignKey field is only applicable to private dimensions. The dimension's type may be one of "Standard" or "Time". A time dimension will allow the use of the MDX time functions (WTD, YTD, QTD, etc.). Use a standard dimension if the dimension is not a time-related dimension. The default value is "Standard". StandardDimension TimeDimension A string being displayed instead of the dimensions's name. Can be localized from Properties file using #{propertyname}. Description of this dimension. Can be localized from Properties file using #{propertyname}. If present, then this is prepended to the Dimension column names during the building of collapse dimension aggregates allowing 1) different dimensions to be disambiguated during aggregate table recognition. This should only be set for private dimensions. // implement CubeDimension public Dimension getDimension(Schema schema) { Util.assertPrecondition(schema != null, "schema != null"); return this; } // Return the dimension's enumerated type. public DimensionType getDimensionType() { if (type == null) { return null; //DimensionType.StandardDimension; } else { return DimensionType.valueOf(type); } } Defines a hierarchy.

You must specify at most one <Relation> or memberReaderClass. If you specify none, the hierarchy is assumed to come from the same fact table of the current cube. Name of the hierarchy. If this is not specified, the hierarchy has the same name as its dimension. Whether this hierarchy is visible in the user-interface. Default true. Whether this hierarchy has an 'all' member. Name of the 'all' member. If this attribute is not specified, the all member is named 'All hierarchyName', for example, 'All Store'. A string being displayed instead as the all member's name. Can be localized from Properties file using #{propertyname}. Name of the 'all' level. If this attribute is not specified, the all member is named '(All)'. Can be localized from Properties file using #{propertyname}. The name of the column which identifies members, and which is referenced by rows in the fact table. If not specified, the key of the lowest level is used. See also CubeDimension.foreignKey. The name of the table which contains primaryKey. If the hierarchy has only one table, defaults to that; it is required. Name of the custom member reader class. Must implement the mondrian.rolap.MemberReader interface. A string to be displayed in the user interface. If not specified, the hierarchy's name is used. Can be localized from Properties file using #{propertyname}. Description of this hierarchy. Can be localized from Properties file using #{propertyname}. Should be set to the level (if such a level exists) at which depth it is known that all members have entirely unique rows, allowing SQL GROUP BY clauses to be completely eliminated from the query. Contains values of user-defined properties. The {@link MondrianDef.Table table}, {@link MondrianDef.Join set of tables}, {@link MondrianDef.View SQL statement}, or {@link MondrianDef.InlineTable inline table} which populates this hierarchy. The estimated number of members in this level. Setting this property improves the performance of MDSCHEMA_LEVELS, MDSCHEMA_HIERARCHIES and MDSCHEMA_DIMENSIONS XMLA requests Whether this level is visible in the user-interface. Default true. The name of the table that the column comes from. If this hierarchy is based upon just one table, defaults to the name of that table; otherwise, it is required. Can be localized from Properties file using #{propertyname}. The name of the column which holds the unique identifier of this level. The name of the column which holds the user identifier of this level. The name of the column which holds member ordinals. If this column is not specified, the key column is used for ordering. The name of the column which references the parent member in a parent-child hierarchy. Value which identifies null parents in a parent-child hierarchy. Typical values are 'NULL' and '0'. Indicates the type of this level's key column: String, Numeric, Integer, Boolean, Date, Time or Timestamp. When generating SQL statements, Mondrian encloses values for String columns in quotation marks, but leaves values for Integer and Numeric columns un-quoted.

Date, Time, and Timestamp values are quoted according to the SQL dialect. For a SQL-compliant dialect, the values appear prefixed by their typename, for example, "DATE '2006-06-01'". String Numeric Integer Boolean Date Time Timestamp Indicates the Java type that Mondrian uses to store this level's key column. It also determines the JDBC method that Mondrian will call to retrieve the column; for example, if the Java type is 'int', Mondrian will call 'ResultSet.getInt(int)'.

Usually this attribute is not needed, because Mondrian can choose a sensible type based on the type of the database column.

Allowable values are: 'int', 'long', 'Object', 'String'. int long Object String Whether members are unique across all parents. For example, zipcodes are unique across all states. The first level's members are always unique. Whether this is a regular or a time-related level. The value makes a difference to time-related functions such as YTD (year-to-date).

The "TimeHalfYear" value is deprecated and will be removed in mondrian-4.0; use "TimeHalfYears" instead.

Regular TimeYears TimeHalfYears TimeHalfYear TimeQuarters TimeMonths TimeWeeks TimeDays TimeHours TimeMinutes TimeSeconds TimeUndefined Condition which determines whether a member of this level is hidden. If a hierarchy has one or more levels with hidden members, then it is possible that not all leaf members are the same distance from the root, and it is termed a ragged hierarchy.

Allowable values are: Never (a member always appears; the default); IfBlankName (a member doesn't appear if its name is null, empty or all whitespace); and IfParentsName (a member appears unless its name matches the parent's.

Never IfBlankName IfParentsName
Name of a formatter class for the member labels being displayed. The class must implement the mondrian.spi.MemberFormatter interface.

This attribute is deprecated. Please use a nested MemberFormatter element.

A string being displayed instead of the level's name. Can be localized from Properties file using #{propertyname}. Description of this level. Can be localized from Properties file using #{propertyname}. The name of the column which holds the caption for members. Contains values of user-defined properties. The SQL expression used to populate this level's key. The SQL expression used to populate this level's name. If not specified, the level's key is used. The SQL expression used to populate this level's caption. If not specified, the level's name is used. The SQL expression used to populate this level's ordinal. The SQL expression used to join to the parent member in a parent-child hierarchy. Member formatter. public Expression getKeyExp() { if (keyExp != null) { return keyExp; } else if (column != null) { return new Column(table, column); } else { return null; } } public Expression getNameExp() { if (nameExp != null) { return nameExp; } else if (nameColumn != null) { return new Column(table, nameColumn); } else { return null; } } public Expression getCaptionExp() { if (captionExp != null) { return captionExp; } else if (captionColumn != null) { return new Column(table, captionColumn); } else { return null; } } public Expression getOrdinalExp() { if (ordinalExp != null) { return ordinalExp; } else if (ordinalColumn != null) { return new Column(table, ordinalColumn); } else { return null; } } public Expression getParentExp() { if (parentExp != null) { return parentExp; } else if (parentColumn != null) { return new Column(table, parentColumn); } else { return null; } } public Expression getPropertyExp(int i) { return new Column(table, properties[i].column); } public mondrian.spi.Dialect.Datatype getDatatype() { return mondrian.spi.Dialect.Datatype.valueOf(type); } Specifies the transitive closure of a parent-child hierarchy. Optional, but recommended for better performance. The closure is provided as a set of (parent/child) pairs: since it is the transitive closure these are actually (ancestor/descendant) pairs. Member property. Data type of this property: String, Numeric, Integer, Boolean, Date, Time or Timestamp. String Numeric Integer Boolean Date Time Timestamp

Name of a formatter class for the appropriate property value being displayed.

The class must implement the mondrian.spi.PropertyFormatter interface.

This attribute is deprecated. Please use a nested PropertyFormatter element.

A string being displayed instead of the name. Can be localized from Properties file using #{propertyname}. Description of this member property. Can be localized from Properties file using #{propertyname}. Should be set to true if the value of the property is functionally dependent on the level value. This permits the associated property column to be omitted from the GROUP BY clause (if the database permits columns in the SELECT that are not in the GROUP BY). This can be a significant performance enhancement on some databases, such as MySQL. Property formatter.
Name of this measure. Column which is source of this measure's values. If not specified, a measure expression must be specified. The datatype of this measure: String, Numeric, Integer, Boolean, Date, Time or Timestamp.

The default datatype of a measure is 'Integer' if the measure's aggregator is 'Count', otherwise it is 'Numeric'. String Numeric Integer Boolean Date Time Timestamp Format string with which to format cells of this measure. For more details, see the mondrian.util.Format class. Aggregation function. Allowed values are "sum", "count", "min", "max", "avg", and "distinct-count". ("distinct count" is allowed for backwards compatibility, but is deprecated because XML enumerated attributes in a DTD cannot legally contain spaces.)

Name of a formatter class for the appropriate cell being displayed.

The class must implement the mondrian.spi.CellFormatter interface.

This attribute is deprecated. Please use a nested CellFormatter element.

A string being displayed instead of the name. Can be localized from Properties file using #{propertyname}. Description of this measure. Can be localized from Properties file using #{propertyname}. Whether this member is visible in the user-interface. Default true. Contains values of user-defined properties. The SQL expression used to calculate a measure. Must be specified if a source column is not specified. Cell formatter.
Name of this calculated member. Format string with which to format cells of this member. For more details, see {@link mondrian.util.Format}. A string being displayed instead of the name. Can be localized from Properties file using #{propertyname}. Description of this calculated member. Can be localized from Properties file using #{propertyname}. MDX expression which gives the value of this member. Equivalent to the Formula sub-element.

Name of the dimension that this member belongs to.

Deprecated: use {@code hierarchy} attribute instead.

Name of the hierarchy that this member belongs to.

Fully-qualified name of the parent member. If not specified, the member will be at the lowest level (besides the 'all' level) in the hierarchy. Whether this member is visible in the user-interface. Default true. Contains values of user-defined properties. MDX expression which gives the value of this member. Cell formatter. /** * Returns the formula, looking for a sub-element called * "Formula" first, then looking for an attribute called * "formula". */ public String getFormula() { if (formulaElement != null) { return formulaElement.cdata; } else { return formula; } } /** * Returns the format string, looking for a property called * "FORMAT_STRING" first, then looking for an attribute called * "formatString". */ public String getFormatString() { for (CalculatedMemberProperty prop : memberProperties) { if (prop.name.equals( mondrian.olap.Property.FORMAT_STRING.name)) { return prop.value; } } return formatString; }
Property of a calculated member defined against a cube. It must have either an expression or a value. Name of this member property. A string being displayed instead of the name of this calculated member property. Can be localized from Properties file using #{propertyname}. Description of this calculated member property. Can be localized from Properties file using #{propertyname}. MDX expression which defines the value of this property. If the expression is a constant string, you could enclose it in quotes, or just specify the 'value' attribute instead. Value of this property. If the value is not constant, specify the 'expression' attribute instead. Defines a named set which can be used in queries in the same way as a set defined using a WITH SET clause.

A named set can be defined against a particular cube, or can be global to a schema. If it is defined against a cube, it is only available to queries which use that cube.

A named set defined against a cube is not inherited by a virtual cubes defined against that cube. (But you can define a named set against a virtual cube.)

A named set defined against a schema is available in all cubes and virtual cubes in that schema. However, it is only valid if the cube contains dimensions with the names required to make the formula valid.

]]>
Name of this named set. Caption of this named set. Can be localized from Properties file using #{propertyname}. Description of this named set. Can be localized from Properties file using #{propertyname}. MDX expression which gives the value of this set. Equivalent to the Formula sub-element. Contains values of user-defined properties. MDX expression which gives the value of this set. /** * Returns the formula, looking for a sub-element called * "Formula" first, then looking for an attribute called * "formula". */ public String getFormula() { if (formulaElement != null) { return formulaElement.cdata; } else { return formula; } }
Not used A table or a join public abstract Relation find(String seekAlias); public boolean equals(Object o) { return this == o; } public int hashCode() { return System.identityHashCode(this); } A table, inline table or view public abstract String getAlias(); A collection of SQL statements, one per dialect. /** * Copy constructor. */ public View(View view) { this.alias = view.alias; this.selects = view.selects.clone(); } public String toString() { return selects[0].cdata; } public View find(String seekAlias) { if (seekAlias.equals(alias)) { return this; } else { return null; } } public String getAlias() { return alias; } public SqlQuery.CodeSet getCodeSet() { return SQL.toCodeSet(selects); } public void addCode(String dialect, String code) { if (selects == null) { selects = new SQL[1]; } else { SQL[] olds = selects; selects = new SQL[olds.length + 1]; System.arraycopy(olds, 0, selects, 0, olds.length); } SQL sql = new SQL(); sql.dialect = dialect; sql.cdata = code; selects[selects.length - 1] = sql; } public boolean equals(Object o) { if (o instanceof View) { View that = (View) o; if (!this.alias.equals(that.alias)) { return false; } if (this.selects == null || that.selects == null || this.selects.length != that.selects.length) { return false; } for (int i = 0; i < selects.length; i++) { if (!Util.equals(this.selects[i].dialect, that.selects[i].dialect) || !Util.equals(this.selects[i].cdata, that.selects[i].cdata)) { return false; } } return true; } else { return false; } } Dialect of SQL the view is intended for. Valid values include, but are not limited to:
  • generic
  • access
  • db2
  • derby
  • firebird
  • hsqldb
  • mssql
  • mysql
  • nuodb
  • oracle
  • postgres
  • sybase
  • teradata
  • ingres
  • infobright
  • luciddb
  • vertica
  • neoview
Defaults to left's alias if left is a table, otherwise required. Defaults to right's alias if right is a table, otherwise required. /** Convenience constructor. */ public Join( String leftAlias, String leftKey, RelationOrJoin left, String rightAlias, String rightKey, RelationOrJoin right) { this.leftAlias = leftAlias; this.leftKey = leftKey; this.left = left; this.rightAlias = rightAlias; this.rightKey = rightKey; this.right = right; } /** * Returns the alias of the left join key, defaulting to left's * alias if left is a table. */ public String getLeftAlias() { if (leftAlias != null) { return leftAlias; } if (left instanceof Relation) { return ((Relation) left).getAlias(); } throw Util.newInternal( "alias is required because " + left + " is not a table"); } /** * Returns the alias of the right join key, defaulting to right's * alias if right is a table. */ public String getRightAlias() { if (rightAlias != null) { return rightAlias; } if (right instanceof Relation) { return ((Relation) right).getAlias(); } if (right instanceof Join) { return ((Join) right).getLeftAlias(); } throw Util.newInternal( "alias is required because " + right + " is not a table"); } public String toString() { return "(" + left + ") join (" + right + ") on " + leftAlias + "." + leftKey + " = " + rightAlias + "." + rightKey; } public Relation find(String seekAlias) { Relation relation = left.find(seekAlias); if (relation == null) { relation = right.find(seekAlias); } return relation; } Optional qualifier for table. Alias to be used with this table when it is used to form queries. If not specified, defaults to the table name, but in any case, must be unique within the schema. (You can use the same table in different hierarchies, but it must have different aliases.) The SQL WHERE clause expression to be appended to any select statement Table optimization hints; may be ignored by dialect. hintMap; /** Convenience constructor. */ public Table(Table table) { this(table.schema, table.name, table.alias, table.tableHints); } public Table(String schema, String name, String alias, Hint[] tablehints) { this(); this.schema = schema; this.name = name; this.alias = alias; this.hintMap = buildHintMap(tablehints); } public Table(Table tbl, String possibleName) { this(tbl.schema, tbl.name, possibleName, tbl.tableHints); // Remake the filter with the new alias if (tbl.filter != null) { this.filter = new SQL(); this.filter.dialect = tbl.filter.dialect; if (tbl.filter.cdata != null) { this.filter.cdata = tbl.filter.cdata.replace( tbl.alias == null ? tbl.name : tbl.alias, possibleName); } } } private java.util.Map buildHintMap(Hint[] th) { java.util.Map h = new java.util.HashMap(); if (th != null) { for (int i = 0; i < th.length; i++) { h.put(th[i].type, th[i].cdata); } } return h; } /** Returns the alias or, if it is null, the table name. */ public String getAlias() { return (alias != null) ? alias : name; } public String toString() { return (schema == null) ? name : schema + "." + name; } public Table find(String seekAlias) { return seekAlias.equals(name) ? this : (alias != null) && seekAlias.equals(alias) ? this : null; } public boolean equals(Object o) { if (o instanceof Table) { Table that = (Table) o; return this.name.equals(that.name) && Util.equals(this.alias, that.alias) && Util.equals(this.schema, that.schema); } else { return false; } } public int hashCode() { return toString().hashCode(); } public String getFilter() { return (filter == null) ? null : filter.cdata; } public AggExclude[] getAggExcludes() { return aggExcludes; } public AggTable[] getAggTables() { return aggTables; } public java.util.Map getHintMap() { if (hintMap == null) { hintMap = buildHintMap(this.tableHints); } return hintMap; } ]]> Dialect-specific table optimization hints. Type of hint, interpreted and applied on a per-dialect basis. Alias to be used with this table when it is used to form queries. If not specified, defaults to the table name, but in any case, must be unique within the schema. (You can use the same table in different hierarchies, but it must have different aliases.) "; } public InlineTable find(String seekAlias) { return seekAlias.equals(this.alias) ? this : null; } public boolean equals(Object o) { if (o instanceof InlineTable) { InlineTable that = (InlineTable) o; return this.alias.equals(that.alias); } else { return false; } } public int hashCode() { return toString().hashCode(); } ]]> Holder for an array of ColumnDef elements Column definition for an inline table. Name of the column. Type of the column: String, Numeric, Integer, Boolean, Date, Time or Timestamp. String Numeric Integer Boolean Date Time Timestamp Holder for an array of Row elements Row definition for an inline table. Must have one Column for each ColumnDef in the InlineTable. Column value for an inline table. The CDATA holds the value of the column. Name of the column. A definition of an aggregate table for a base fact table. This aggregate table must be in the same schema as the base fact table. Whether or not the match should ignore case. What does the fact_count column look like. public boolean isIgnoreCase() { return ignorecase.booleanValue(); } public AggFactCount getAggFactCount() { return factcount; } public AggIgnoreColumn[] getAggIgnoreColumns() { return ignoreColumns; } public AggForeignKey[] getAggForeignKeys() { return foreignKeys; } public AggMeasure[] getAggMeasures() { return measures; } public AggLevel[] getAggLevels() { return levels; } The Table name of a Specific aggregate table. The estimated number of rows in this aggregation table. Setting this property improves the performance of the aggregation optimizer and prevents it from issuing a 'select count(*)' query over the aggregation table. public String getNameAttribute() { return name; } public String getApproxRowCountAttribute() { return approxRowCount; } A Table pattern used to define a set of aggregate tables. public String getPattern() { return pattern; } public AggExclude[] getAggExcludes() { return excludes; } A Table pattern not to be matched. The Table name not to be matched. Whether or not the match should ignore case. public String getNameAttribute() { return name; } public String getPattern() { return pattern; } public boolean isIgnoreCase() { return ignorecase.booleanValue(); } The name of the fact count column. public String getColumnName() { return column; } The name of the column mapping from base fact table foreign key to aggregate table foreign key. The name of the base fact table foreign key. The name of the aggregate table foreign key. public String getFactFKColumnName() { return factColumn; } public String getAggregateFKColumnName() { return aggColumn; } The name of the column mapping to the level name. The ordinal column for this level. The caption column for this level. The name of the Dimension Hierarchy level. The name of the column which holds the user identifier of this level. Whether this is a collapsed level. The parents of that level are also present in the aggregation table. public String getNameAttribute() { return name; } public String getColumnName() { return column; } public boolean isCollapsed() { return collapsed; } Member property. The name of the column mapping to the measure name. The name of the Cube measure. public String getNameAttribute() { return name; } public String getColumn() { return column; } public abstract String getExpression(SqlQuery query); public abstract String getGenericExpression(); public abstract String getTableAlias(); Alias of the table which contains this column. Not required if the query only has one table. Name of the column. A collection of SQL expressions, one per dialect. A role defines an access-control profile. It has a series of grants (or denials) for schema elements. Contains values of user-defined properties. Values correspond to Access. all custom none all_dimensions Grants (or denies) this role access to this schema. access may be "all", "all_dimensions", "custom" or "none". If access is "all_dimensions", the role has access to all dimensions but still needs explicit access to cubes. If access is "custom", no access will be inherited by cubes for which no explicit rule is set. If access is "all_dimensions", an implicut access is given to all dimensions of the schema's cubes, provided the cube's access attribute is either "custom" or "all". See mondrian.olap.Role#grant(mondrian.olap.Schema,int). Grants (or denies) this role access to a cube. access may be "all", "custom", or "none". If access is "custom", no access will be inherited by the dimensions of this cube, unless the parent SchemaGrant is set to "ALL_DIMENSIONS". See mondrian.olap.Role#grant(mondrian.olap.Cube,int). The unique name of the cube Grants (or denies) this role access to a dimension. access may be "all", "custom" or "none". Note that a role is implicitly given access to a dimension when it is given "ALL" acess to a cube. If access is "custom", no access will be inherited by the hierarchies of this dimension. If the parent schema access is "ALL_DIMENSIONS", this timension will inherit access "ALL". See also the "all_dimensions" option of the "SchemaGrant" element. See mondrian.olap.Role#grant(mondrian.olap.Dimension,int). The unique name of the dimension Grants (or denies) this role access to a hierarchy. access may be "all", "custom" or "none". If access is "custom", you may also specify the attributes topLevel, bottomLevel, and the member grants. If access is "custom", the child levels of this hierarchy will not inherit access rights from this hierarchy, should there be no explicit rules defined for the said child level. See mondrian.olap.Role#grant(mondrian.olap.Hierarchy, int, mondrian.olap.Level). The unique name of the hierarchy Unique name of the highest level of the hierarchy from which this role is allowed to see members. May only be specified if the HierarchyGrant.access is "custom". If not specified, role can see members up to the top level. Unique name of the lowest level of the hierarchy from which this role is allowed to see members. May only be specified if the HierarchyGrant.access is "custom". If not specified, role can see members down to the leaf level. Policy which determines how cell values are calculated if not all of the children of the current cell are visible to the current role. Allowable values are 'full' (the default), 'partial', and 'hidden'. Grants (or denies) this role access to a member. The children of this member inherit that access. You can implicitly see a member if you can see any of its children. See mondrian.olap.Role#grant(mondrian.olap.Member,int). The unique name of the member all none Body of a Role definition which defines a Role to be the union of several Roles. The RoleUsage elements must refer to Roles that have been declared earlier in this schema file. Usage of a Role in a union Role. A UserDefinedFunction is a function which extends the MDX language. It must be implemented by a Java class which implements the interface mondrian.spi.UserDefinedFunction. Name with which the user-defined function will be referenced in MDX expressions. Name of the class which implemenets this user-defined function. Must implement the mondrian.spi.UserDefinedFunction interface. Script to implement this user-defined function.

Either the "Script" element or the "className" attribute must be specified.

A Parameter defines a schema parameter. It can be referenced from an MDX statement using the ParamRef function and, if not final, its value can be overridden. Name of this parameter. Description of this parameter. Indicates the type of this parameter: String, Numeric, Integer, Boolean, Date, Time, Timestamp, or Member. String Numeric Integer Boolean Date Time Timestamp Member If false, statement cannot change the value of this parameter; the parameter becomes effectively constant (provided that its default value expression always returns the same value). Default is true. Expression for the default value of this parameter. Holder for an array of Annotation elements User-defined property value. Name of the annotation. Script fragment to implement an SPI such as user-defined function, member formatter, cell formatter. The language of the script. Must be a supported scripting language in the current JVM. See {@link javax.script.ScriptEngineManager}. Default value is 'JavaScript'. Plugin that formats the values of cells. It must be implemented by a Java class which implements the interface mondrian.spi.CellFormatter, or by a script. Name of the class which implemenets this cell formatter. Must implement the mondrian.spi.CellFormatter interface.

Either the "Script" element or the "className" attribute must be specified.

Script to implement this cell formatter.

Either the "Script" element or the "className" attribute must be specified.

Plugin that formats members. It must be implemented by a Java class which implements the interface mondrian.spi.MemberFormatter, or by a script. Name of the class which implemenets this member formatter. Must implement the mondrian.spi.MemberFormatter interface.

Either the "Script" element or the "className" attribute must be specified.

Script to implement this member formatter.

Either the "Script" element or the "className" attribute must be specified.

Plugin that formats properties. It must be implemented by a Java class which implements the interface mondrian.spi.PropertyFormatter, or by a script. Name of the class which implemenets this property formatter. Must implement the mondrian.spi.PropertyFormatter interface.

Either the "Script" element or the "className" attribute must be specified.

Script to implement this property formatter.

Either the "Script" element or the "className" attribute must be specified.

mondrian-3.11.0.1-R/src/main/mondrian/olap/MondrianException.java000066400000000000000000000023421261646570300245220ustar00rootroot00000000000000/* // This software is subject to the terms of the Eclipse Public License v1.0 // Agreement, available at the following URL: // http://www.eclipse.org/legal/epl-v10.html. // You must accept the terms of that agreement to use this software. // // Copyright (C) 2002-2005 Julian Hyde // Copyright (C) 2005-2005 Pentaho and others // All Rights Reserved. */ package mondrian.olap; /** * Instances of this class are thrown for all exceptions that Mondrian * generates through as a result of known error conditions. It is used in the * resource classes generated from mondrian.resource.MondrianResource.xml. * * @author Galt Johnson (gjabx) * @see org.eigenbase.xom */ public class MondrianException extends RuntimeException { public MondrianException() { super(); } public MondrianException(Throwable cause) { super(cause); } public MondrianException(String message) { super(message); } public MondrianException(String message, Throwable cause) { super(message, cause); } public String getLocalizedMessage() { return getMessage(); } public String getMessage() { return "Mondrian Error:" + super.getMessage(); } } // End MondrianException.java mondrian-3.11.0.1-R/src/main/mondrian/olap/MondrianProperties.xml000066400000000000000000001603351261646570300246060ustar00rootroot00000000000000 QueryLimit mondrian.query.limit

Maximum number of simultaneous queries the system will allow.

Oracle fails if you try to run more than the 'processes' parameter in init.ora, typically 150. The throughput of Oracle and other databases will probably reduce long before you get to their limit.

int 40
JdbcDrivers mondrian.jdbcDrivers Property containing a list of JDBC drivers to load automatically. Must be a comma-separated list of class names, and the classes must be on the class path. String sun.jdbc.odbc.JdbcOdbcDriver,org.hsqldb.jdbcDriver,oracle.jdbc.OracleDriver,com.mysql.jdbc.Driver CellBatchSize mondrian.rolap.cellBatchSize Integer property that, if set to a value greater than zero, sets a hard limit on the number of cells that are batched together when building segments. int -1 ResultLimit mondrian.result.limit Integer property that, if set to a value greater than zero, limits the maximum size of a result set. int 0 HighCardChunkSize mondrian.result.highCardChunkSize Property that establishes the amount of chunks for querying cells involving high-cardinality dimensions. Should prime with {@link #ResultLimit mondrian.result.limit}. int 1 TestName mondrian.test.Name Testing

String property that determines which tests are run.

This is a regular expression as defined by {@link java.util.regex.Pattern}. If this property is specified, only tests whose names match the pattern in its entirety will be run.

@see #TestClass
String
TestClass mondrian.test.Class Testing

String property that determines which test class to run.

This is the name of the class. It must either implement {@code junit.framework.Test} or have a method {@code public [static] junit.framework.Test suite()}.

Example:

mondrian.test.Class=mondrian.test.FoodMartTestCase
@see #TestName
String
TestConnectString mondrian.test.connectString Testing

Property containing the connect string which regression tests should use to connect to the database.

Format is specified in {@link Util#parseConnectString(String)}.

String
TestHighCardinalityDimensionList mondrian.test.highCardDimensions Property containing a list of dimensions in the Sales cube that should be treated as high-cardinality dimensions by the testing infrastructure. This allows us to run the full suite of tests with high-cardinality functionality enabled. String FoodmartJdbcURL mondrian.foodmart.jdbcURL Testing

Property containing the JDBC URL of the FoodMart database. The default value is to connect to an ODBC data source called "MondrianFoodMart".

To run the test suite, first load the FoodMart data set into the database of your choice. Then set the driver.classpath, mondrian.foodmart.jdbcURL and mondrian.jdbcDrivers properties, by un-commenting and modifying one of the sections below. Put the JDBC driver jar into mondrian/testlib.

Here are example property settings for various databases.

Derby: needs user and password

mondrian.foodmart.jdbcURL=jdbc:derby:demo/derby/foodmart
mondrian.foodmart.jdbcUser=sa
mondrian.foodmart.jdbcPassword=sa
mondrian.jdbcDrivers=org.apache.derby.jdbc.EmbeddedDriver
driver.classpath=testlib/derby.jar

FireBirdSQL

mondrian.foodmart.jdbcURL=jdbc:firebirdsql:localhost/3050:/mondrian/foodmart.gdb
mondrian.jdbcDrivers=org.firebirdsql.jdbc.FBDriver
driver.classpath=/jdbc/fb/firebirdsql-full.jar

Greenplum (similar to Postgres)

mondrian.foodmart.jdbcURL=jdbc:postgresql://localhost/foodmart?user=gpadmin&password=xxxx
mondrian.foodmart.jdbcUser=foodmart
mondrian.foodmart.jdbcPassword=foodmart
mondrian.jdbcDrivers=org.postgresql.Driver
driver.classpath=lib/postgresql-8.2-504.jdbc3.jar

LucidDB (see instructions)

mondrian.foodmart.jdbcURL=jdbc:luciddb:http://localhost
mondrian.foodmart.jdbcUser=foodmart
mondrian.jdbcDrivers=org.luciddb.jdbc.LucidDbClientDriver
driver.classpath=/path/to/luciddb/plugin/LucidDbClient.jar

Oracle (needs user and password)

oracle.home=G:/oracle/product/10.1.0/Db_1
mondrian.foodmart.jdbcURL.oracle=jdbc:oracle:thin:@//host:port/service_name
mondrian.foodmart.jdbcURL=jdbc:oracle:thin:foodmart/foodmart@//stilton:1521/orcl
mondrian.foodmart.jdbcURL=jdbc:oracle:oci8:foodmart/foodmart@orcl
mondrian.foodmart.jdbcUser=FOODMART
mondrian.foodmart.jdbcPassword=oracle
mondrian.jdbcDrivers=oracle.jdbc.OracleDriver
driver.classpath=/home/jhyde/open/mondrian/lib/ojdbc14.jar

ODBC (Microsoft Access)

mondrian.foodmart.jdbcURL=jdbc:odbc:MondrianFoodMart
mondrian.jdbcDrivers=sun.jdbc.odbc.JdbcOdbcDriver
driver.classpath=

Hypersonic

mondrian.foodmart.jdbcURL=jdbc:hsqldb:demo/hsql/FoodMart
mondrian.jdbcDrivers=org.hsqldb.jdbcDriver
driver.classpath=xx

MySQL: can have user and password set in JDBC URL

mondrian.foodmart.jdbcURL=jdbc:mysql://localhost/foodmart?user=foodmart&password=foodmart
mondrian.foodmart.jdbcURL=jdbc:mysql://localhost/foodmart
mondrian.foodmart.jdbcUser=foodmart
mondrian.foodmart.jdbcPassword=foodmart
mondrian.jdbcDrivers=com.mysql.jdbc.Driver
driver.classpath=D:/mysql-connector-3.1.12

NuoDB

mondrian.foodmart.jdbcURL=jdbc:com.nuodb://localhost/foodmart?schema=mondrian
mondrian.foodmart.jdbcUser=foodmart
mondrian.foodmart.jdbcPassword=foodmart
mondrian.jdbcDrivers=com.nuodb.jdbc.Driver
mondrian.foodmart.jdbcSchema=mondrian
driver.classpath=/opt/nuodb/jar/nuodbjdbc.jar

Infobright

As MySQL. (Infobright uses a MySQL driver, version 5.1 and later.)

Ingres

mondrian.foodmart.jdbcURL=jdbc:ingres://192.168.200.129:II7/MondrianFoodMart;LOOP=on;AUTO=multi;UID=ingres;PWD=sergni
mondrian.jdbcDrivers=com.ingres.jdbc.IngresDriver
driver.classpath=c:/ingres2006/ingres/lib/iijdbc.jar

Postgres: needs user and password

mondrian.foodmart.jdbcURL=jdbc:postgresql://localhost/FM3
mondrian.foodmart.jdbcUser=postgres
mondrian.foodmart.jdbcPassword=pgAdmin
mondrian.jdbcDrivers=org.postgresql.Driver

Neoview

mondrian.foodmart.jdbcURL=jdbc:hpt4jdbc://localhost:18650/:schema=PENTAHO;serverDataSource=PENTAHO_DataSource
mondrian.foodmart.jdbcUser=user
mondrian.foodmart.jdbcPassword=password
mondrian.jdbcDrivers=com.hp.t4jdbc.HPT4Driver
driver.classpath=/some/path/hpt4jdbc.jar

Netezza: mimics Postgres

mondrian.foodmart.jdbcURL=jdbc:netezza://127.0.1.10/foodmart
mondrian.foodmart.jdbcUser=user
mondrian.foodmart.jdbcPassword=password
mondrian.jdbcDrivers=org.netezza.Driver
driver.classpath=/some/path/nzjdbc.jar

Sybase

mondrian.foodmart.jdbcURL=jdbc:jtds:sybase://xxx.xxx.xxx.xxx:port/dbName
mondrian.foodmart.jdbcUser=user
mondrian.foodmart.jdbcPassword=password
mondrian.jdbcDrivers=net.sourceforge.jtds.jdbc.Driver
driver.classpath=/some/path/jtds-1.2.jar

Teradata

mondrian.foodmart.jdbcURL=jdbc:teradata://DatabaseServerName/DATABASE=FoodMart
mondrian.foodmart.jdbcUser=user
mondrian.foodmart.jdbcPassword=password
mondrian.jdbcDrivers=com.ncr.teradata.TeraDriver
driver.classpath=/some/path/terajdbc/classes/terajdbc4.jar

Vertica

mondrian.foodmart.jdbcURL=jdbc:vertica://xxx.xxx.xxx.xxx:port/dbName
mondrian.foodmart.jdbcUser=user
mondrian.foodmart.jdbcPassword=password
mondrian.jdbcDrivers=com.vertica.Driver
driver.classpath=/some/path/vertica.jar

Vectorwise

mondrian.foodmart.jdbcURL=jdbc:ingres://xxx.xxx.xxx.xxxport/dbName
mondrian.foodmart.jdbcUser=user
mondrian.foodmart.jdbcPassword=password
mondrian.jdbcDrivers=com.ingres.jdbc.IngresDriver
driver.classpath=/some/path/iijdbc.jar
String jdbc:odbc:MondrianFoodMart
TestJdbcUser mondrian.foodmart.jdbcUser Testing Property containing the JDBC user of a test database. The default value is null, to cope with DBMSs that don't need this. String TestJdbcPassword mondrian.foodmart.jdbcPassword Testing Property containing the JDBC password of a test database. The default value is null, to cope with DBMSs that don't need this. String EnableInMemoryRollup mondrian.rolap.EnableInMemoryRollup Property which turns on or off the in-memory rollup of segment data. Defaults to true. boolean true SegmentCache mondrian.rolap.SegmentCache Property which defines which SegmentCache implementation to use. Specify the value as a fully qualified class name, such as org.example.SegmentCacheImpl where SegmentCacheImpl is an implementation of {@link mondrian.spi.SegmentCache}. String SparseSegmentCountThreshold mondrian.rolap.SparseSegmentValueThreshold

Property that, with {@link #SparseSegmentDensityThreshold}, determines whether to choose a sparse or dense representation when storing collections of cell values in memory.

When storing collections of cell values, Mondrian has to choose between a sparse and a dense representation, based upon the possible and actual number of values. The density is actual / possible.

We use a sparse representation if (possible - {@link #SparseSegmentCountThreshold countThreshold}) * {@link #SparseSegmentDensityThreshold densityThreshold} > actual

For example, at the default values ({@link #SparseSegmentCountThreshold countThreshold} = 1000, {@link #SparseSegmentDensityThreshold} = 0.5), we use a dense representation for

  • (1000 possible, 0 actual), or
  • (2000 possible, 500 actual), or
  • (3000 possible, 1000 actual).

Any fewer actual values, or any more possible values, and Mondrian will use a sparse representation.

int 1000
SparseSegmentDensityThreshold mondrian.rolap.SparseSegmentDensityThreshold Property that, with {@link #SparseSegmentCountThreshold}, determines whether to choose a sparse or dense representation when storing collections of cell values in memory. double 0.5 QueryFilePattern mondrian.test.QueryFilePattern Testing Property that defines a pattern for which test XML files to run. Pattern has to match a file name of the form: querywhatever.xml in the directory.

Example:

mondrian.test.QueryFilePattern=queryTest_fec[A-Za-z0-9_]*.xml
String
QueryFileDirectory mondrian.test.QueryFileDirectory Testing Property defining where the test XML files are. String Iterations mondrian.test.Iterations Testing Not documented. int 1 VUsers mondrian.test.VUsers Testing Not documented. int 1 TimeLimit mondrian.test.TimeLimit Testing Property that returns the time limit for the test run in seconds. If the test is running after that time, it is terminated. int 0 Warmup mondrian.test.Warmup Testing Property that indicates whether this is a "warmup test". boolean false CatalogURL mondrian.catalogURL Testing Property that contains the URL of the catalog to be used by {@link mondrian.tui.CmdRunner} and XML/A Test. String EnableCacheHitCounters mondrian.rolap.agg.enableCacheHitCounters

Property that controls whether aggregation cache hit / miss counters will be enabled.

Note that this will affect performance due to existence of sync blocks.

@deprecated This property is no longer used, and will be removed in mondrian-4.0.
boolean false
WarnIfNoPatternForDialect mondrian.test.WarnIfNoPatternForDialect Testing

Property that controls whether warning messages should be printed if a SQL comparison test does not contain expected SQL statements for the specified dialect. The tests are skipped if no expected SQL statements are found for the current dialect.

Possible values are the following:

  • "NONE": no warning (default)
  • "ANY": any dialect
  • "ACCESS"
  • "DERBY"
  • "LUCIDDB"
  • "MYSQL"
  • ... and any Dialect enum in SqlPattern.Dialect

Specific tests can overwrite the default setting. The priority is:

  • Settings besides "ANY" in mondrian.properties file
  • < Any setting in the test
  • < "ANY"

String NONE
UseAggregates mondrian.rolap.aggregates.Use Aggregate tables

Boolean property that controls whether Mondrian uses aggregate tables.

If true, then Mondrian uses aggregate tables. This property is queried prior to each aggregate query so that changing the value of this property dynamically (not just at startup) is meaningful.

Aggregates can be read from the database using the {@link #ReadAggregates} property but will not be used unless this property is set to true.

boolean false
ReadAggregates mondrian.rolap.aggregates.Read Aggregate tables

Boolean property that determines whether Mondrian should read aggregate tables.

If set to true, then Mondrian scans the database for aggregate tables. Unless mondrian.rolap.aggregates.Use is set to true, the aggregates found will not be used.

boolean false
ChooseAggregateByVolume mondrian.rolap.aggregates.ChooseByVolume Aggregate tables

Boolean property that controls whether aggregate tables are ordered by their volume or row count.

If true, Mondrian uses the aggregate table with the smallest volume (number of rows multiplied by number of columns); if false, Mondrian uses the aggregate table with the fewest rows.

boolean false
AggregateRules mondrian.rolap.aggregates.rules Aggregate tables

String property containing the name of the file which defines the rules for recognizing an aggregate table. Can be either a resource in the Mondrian jar or a URL.

The default value is "/DefaultRules.xml", which is in the mondrian.rolap.aggmatcher package in Mondrian.jar.

Normally, this property is not set by a user.

String /DefaultRules.xml
AggregateRuleTag mondrian.rolap.aggregates.rule.tag Aggregate tables

String property that is the AggRule element's tag value.

Normally, this property is not set by a user.

String default
GenerateAggregateSql mondrian.rolap.aggregates.generateSql Aggregate tables

Boolean property that controls whether to print the SQL code generated for aggregate tables.

If set, then as each aggregate request is processed, both the lost and collapsed dimension create and insert sql code is printed. This is for use in the CmdRunner allowing one to create aggregate table generation sql.

boolean false
DisableCaching mondrian.rolap.star.disableCaching Caching Boolean property that controls whether a RolapStar's aggregate data cache is cleared after each query. If true, no RolapStar will cache aggregate data from one query to the next (the cache is cleared after each query). boolean false DisableLocalSegmentCache mondrian.rolap.star.disableLocalSegmentCache Caching Boolean property that controls whether the data from segments is cached locally. To create custom caches, look for the SegmentCache SPI. boolean false EnableTriggers mondrian.olap.triggers.enable

Boolean property that controls whether to notify the Mondrian system when a {@link MondrianProperties property value} changes.

This allows objects dependent on Mondrian properties to react (that is, reload), when a given property changes via, say, MondrianProperties.instance().populate(null) or MondrianProperties.instance().QueryLimit.set(50).

boolean true
GenerateFormattedSql mondrian.rolap.generate.formatted.sql SQL generation

Boolean property that controls pretty-print mode.

If true, the all SqlQuery SQL strings will be generated in pretty-print mode, formatted for ease of reading.

boolean false
EnableNonEmptyOnAllAxis mondrian.rolap.nonempty Boolean property that controls whether each query axis implicit has the NON EMPTY option set. The default is false. boolean false ExpandNonNative mondrian.native.ExpandNonNative SQL generation If this property is true, when looking for native evaluation of an expression, Mondrian will expand non-native sub-expressions into lists of members. boolean false CompareSiblingsByOrderKey mondrian.rolap.compareSiblingsByOrderKey Boolean property that controls whether sibling members are compared according to order key value fetched from their ordinal expression. The default is false (only database ORDER BY is used). boolean false EnableExpCache mondrian.expCache.enable Caching Boolean property that controls whether to use a cache for frequently evaluated expressions. With the cache disabled, an expression like Rank([Product].CurrentMember, Order([Product].MEMBERS, [Measures].[Unit Sales])) would perform many redundant sorts. The default is true. boolean true TestExpDependencies mondrian.test.ExpDependencies Testing

Integer property that controls whether to test operators' dependencies, and how much time to spend doing it.

If this property is positive, Mondrian's test framework allocates an expression evaluator which evaluates each expression several times, and makes sure that the results of the expression are independent of dimensions which the expression claims to be independent of.

The default is 0.

int 0
TestSeed mondrian.test.random.seed Testing

Seed for random number generator used by some of the tests.

Any value besides 0 or -1 gives deterministic behavior. The default value is 1234: most users should use this. Setting the seed to a different value can increase coverage, and therefore may uncover new bugs.

If you set the value to 0, the system will generate its own pseudo-random seed.

If you set the value to -1, Mondrian uses the next seed from an internal random-number generator. This is a little more deterministic than setting the value to 0.

int 1234
LocalePropFile mondrian.rolap.localePropFile

String property that holds the name of the class whose resource bundle is to be used to for this schema. For example, if the class is {@code com.acme.MyResource}, mondrian will look for a resource bundle called {@code com/acme/MyResource_locale.properties} on the class path. (This property has a confusing name because in a previous release it actually held a file name.)

Used for the {@link mondrian.i18n.LocalizingDynamicSchemaProcessor}; see Internationalization for more details.

Default value is null.

String
EnableNativeCrossJoin mondrian.native.crossjoin.enable SQL generation If enabled some NON EMPTY CrossJoin will be computed in SQL. boolean true EnableNativeTopCount mondrian.native.topcount.enable SQL generation If enabled some TopCount will be computed in SQL. boolean true EnableNativeFilter mondrian.native.filter.enable SQL generation If enabled some Filter() will be computed in SQL. boolean true EnableNativeNonEmpty mondrian.native.nonempty.enable SQL generation

If enabled some NON EMPTY set operations like member.children, level.members and member descendants will be computed in SQL.

boolean true
AlertNativeEvaluationUnsupported mondrian.native.unsupported.alert SQL generation

Alerting action to take in case native evaluation of a function is enabled but not supported for that function's usage in a particular query. (No alert is ever raised in cases where native evaluation would definitely have been wasted effort.)

Recognized actions:

  • OFF: do nothing (default action, also used if unrecognized action is specified)
  • WARN: log a warning to RolapUtil logger
  • ERROR: throw an instance of {@link NativeEvaluationUnsupportedException}
String OFF
EnableDrillThrough mondrian.drillthrough.enable If disabled, Mondrian will throw an exception if someone attempts to perform a drillthrough of any kind. boolean true EnableTotalCount mondrian.xmla.drillthroughTotalCount.enable XML/A If enabled, first row in the result of an XML/A drill-through request will be filled with the total count of rows in underlying database. boolean true CaseSensitive mondrian.olap.case.sensitive Boolean property that controls whether the MDX parser resolves uses case-sensitive matching when looking up identifiers. The default is false. boolean false MaxRows mondrian.xmla.drillthroughMaxRows XML/A Property that defines limit on the number of rows returned by XML/A drill through request. int 1000 MaxConstraints mondrian.rolap.maxConstraints SQL generation

Max number of constraints in a single 'IN' SQL clause.

This value may be variant among database products and their runtime settings. Oracle, for example, gives the error "ORA-01795: maximum number of expressions in a list is 1000".

Recommended values:

  • Oracle: 1,000
  • DB2: 2,500
  • Other: 10,000
int 1000
OptimizePredicates mondrian.rolap.aggregates.optimizePredicates Aggregate tables

Boolean property that determines whether Mondrian optimizes predicates.

If true, Mondrian may retrieve a little more data than specified in MDX query and cache it for future use. For example, if you ask for data on 48 states of the United States for 3 quarters of 2011, Mondrian will round out to all 50 states and all 4 quarters. If false, Mondrian still optimizes queries that involve all members of a dimension.

boolean true
MaxEvalDepth mondrian.rolap.evaluate.MaxEvalDepth

Boolean property that defines the maximum number of passes allowable while evaluating an MDX expression.

If evaluation exceeds this depth (for example, while evaluating a very complex calculated member), Mondrian will throw an error.

int 10
JdbcFactoryClass mondrian.rolap.aggregates.jdbcFactoryClass Aggregate tables

Property that defines the JdbcSchema factory class which determines the list of tables and columns of a specific datasource.

@see mondrian.rolap.aggmatcher.JdbcSchema
String
DataSourceResolverClass mondrian.spi.dataSourceResolverClass Factories

Property that defines the name of the plugin class that resolves data source names to {@link javax.sql.DataSource} objects. The class must implement the {@link mondrian.spi.DataSourceResolver} interface. If not specified, the default implementation uses JNDI to perform resolution.

Example:

mondrian.spi.dataSourceResolverClass=mondrian.spi.impl.JndiDataSourceResolver
String
QueryTimeout mondrian.rolap.queryTimeout

Property that defines the timeout value (in seconds) for queries. A value of 0 (the default) indicates no timeout.

int 0
RolapConnectionShepherdThreadPollingInterval mondrian.rolap.shepherdThreadPollingInterval

Property that defines the interval value between polling operations performed by the RolapConnection shepherd thread. This controls query timeouts and cancellation, so a small value (a few milliseconds) is best. Setting this to a value higher than mondrian.rolap.queryTimeout will result the timeout not being enforced as expected.

Default value is "1000ms". Default time unit is "ms".

String 1000ms
RolapConnectionShepherdNbThreads mondrian.rolap.maxQueryThreads

Maximum number of MDX query threads per Mondrian server instance. Defaults to 20.

int 20
SegmentCacheManagerNumberSqlThreads mondrian.rolap.maxSqlThreads

Maximum number of threads per Mondrian server instance that are used to run SQL queries when populating segments. Defaults to 100.

int 100
SegmentCacheManagerNumberCacheThreads mondrian.rolap.maxCacheThreads

Maximum number of threads per Mondrian server instance that are used to run perform operations on the external caches. Defaults to 100.

int 100
IgnoreInvalidMembers mondrian.rolap.ignoreInvalidMembers

Property that defines whether non-existent member errors should be ignored during schema load. If so, the non-existent member is treated as a null member.

boolean false
IgnoreInvalidMembersDuringQuery mondrian.rolap.ignoreInvalidMembersDuringQuery

Property that defines whether non-existent member errors should be ignored during query validation. If so, the non-existent member is treated as a null member.

boolean false
NullMemberRepresentation mondrian.olap.NullMemberRepresentation

Property that determines how a null member value is represented in the result output.

AS 2000 shows this as empty value

AS 2005 shows this as "(null)" value

String #null
IterationLimit mondrian.rolap.iterationLimit

Integer property indicating the maximum number of iterations allowed when iterating over members to compute aggregates. A value of 0 (the default) indicates no limit.

int 0
CancelPhaseInterval mondrian.rolap.cancelPhaseInterval

Positive integer property that determines how many rows are read from sql executions between checks for whether the current mdx query has been cancelled.
Setting the interval too small may result in a performance hit when reading large result sets; setting it too high can cause a big delay between the query being marked as cancelled and system resources associated to it being released.

int 10000
ExecutionHistorySize mondrian.server.monitor.executionHistorySize Monitoring

Property that defines how many previous execution instances the Monitor keeps in its history so that it can send the events which happen after the fact. Setting this property too high will make the JVM run out of memory. Setting it too low might prevent some events from reaching the listeners of the monitor.

This property is for internal use only and should not be changed unless required. Defaults to 1,000.

int 1000
MemoryMonitor mondrian.util.memoryMonitor.enable Monitoring

Property that defines whether the MemoryMonitor should be enabled. By default it is disabled; memory monitor is not available before Java version 1.5.

boolean false
MemoryMonitorThreshold mondrian.util.memoryMonitor.percentage.threshold Monitoring

Property that defines the default MemoryMonitor percentage threshold. If enabled, when Java's memory monitor detects that post-garbage collection is above this value, notifications are generated.

int 90
MemoryMonitorClass mondrian.util.MemoryMonitor.class Factories

Property that defines the name of the class used as a memory monitor.

If the value is non-null, it is used by the MemoryMonitorFactory to create the implementation.

String
ExpCompilerClass mondrian.calc.ExpCompiler.class Factories

Property that defines the name of the class used to compile scalar expressions.

If the value is non-null, it is used by the ExpCompiler.Factory to create the implementation.

To test that for all test MDX queries that all functions can handle requests for ITERABLE, LIST and MUTABLE_LIST evaluation results, use the following:

mondrian.calc.ExpCompiler.class=mondrian.olap.fun.ResultStyleCompiler
String
PropertyValueMapFactoryClass mondrian.rolap.RolapMember.PropertyValueMapFactory.class Factories

Property that defines the name of the factory class used to create maps of member properties to their respective values.

If the value is non-null, it is used by the PropertyValueFactory to create the implementation. If unset, {@link mondrian.rolap.RolapMemberBase.DefaultPropertyValueMapFactory} will be used.

String
SqlMemberSourceValuePoolFactoryClass mondrian.rolap.SqlMemberSource.ValuePoolFactory.class Factories

Property that defines the name of the class used in SqlMemberSource to pool common values.

If the value is non-null, it is used by the SqlMemberSource.ValueMapFactory to create the implementation. If it is not set, then {@link mondrian.rolap.SqlMemberSource.NullValuePoolFactory} will be used, meaning common values will not be pooled.

String
CrossJoinOptimizerSize mondrian.olap.fun.crossjoin.optimizer.size

Property that defines when to apply the crossjoin optimization algorithm.

If a crossjoin input list's size is larger than this property's value and the axis has the "NON EMPTY" qualifier, then the crossjoin non-empty optimizer is applied. Setting this value to '0' means that for all crossjoin input lists in non-empty axes will have the optimizer applied. On the other hand, if the value is set larger than any possible list, say Integer.MAX_VALUE, then the optimizer will never be applied.

int 0
NullDenominatorProducesNull mondrian.olap.NullDenominatorProducesNull

Property that defines the behavior of division if the denominator evaluates to zero.

If false (the default), if a division has a non-null numerator and a null denominator, it evaluates to "Infinity", which conforms to SSAS behavior.

If true, the result is null if the denominator is null. Setting to true enables the old semantics of evaluating this to null; this does not conform to SSAS, but is useful in some applications.

boolean false
EnableGroupingSets mondrian.rolap.groupingsets.enable SQL generation

Property that defines whether to generate SQL queries using the GROUPING SETS construct for rollup. By default it is not enabled.

Ignored on databases which do not support the GROUPING SETS construct (see {@link mondrian.spi.Dialect#supportsGroupingSets}).

boolean false
IgnoreMeasureForNonJoiningDimension mondrian.olap.agg.IgnoreMeasureForNonJoiningDimension

Property that defines whether to ignore measure when non joining dimension is in the tuple during aggregation.

If there are unrelated dimensions to a measure in context during aggregation, the measure is ignored in the evaluation context. This behaviour kicks in only if the CubeUsage for this measure has IgnoreUnrelatedDimensions attribute set to false.

For example, Gender doesn't join with [Warehouse Sales] measure.

With mondrian.olap.agg.IgnoreMeasureForNonJoiningDimension=true Warehouse Sales gets eliminated and is ignored in the aggregate value.

[Store Sales] + [Warehouse Sales] SUM({Product.members * Gender.members}) 7,913,333.82

With mondrian.olap.agg.IgnoreMeasureForNonJoiningDimension=false Warehouse Sales with Gender All level member contributes to the aggregate value.

[Store Sales] + [Warehouse Sales] SUM({Product.members * Gender.members}) 9,290,730.03

On a report where Gender M, F and All members exist a user will see a large aggregated value compared to the aggregated value that can be arrived at by summing up values against Gender M and F. This can be confusing to the user. This feature can be used to eliminate such a situation.

boolean false
NeedDimensionPrefix mondrian.olap.elements.NeedDimensionPrefix

Property determines if elements of dimension (levels, hierarchies, members) need to be prefixed with dimension name in MDX query.

For example when the property is true, the following queries will error out. The same queries will work when this property is set to false.

select {[M]} on 0 from sales
select {[USA]} on 0 from sales
select {[USA].[CA].[Santa Monica]} on 0 from sales

When the property is set to true, any query where elements are prefixed with dimension name as below will work

select {[Gender].[F]} on 0 from sales
select {[Customers].[Santa Monica]} on 0 from sales

Please note that this property does not govern the behaviour wherein

[Gender].[M]

is resolved into a fully qualified

[Gender].[M]

In a scenario where the schema is very large and dimensions have large number of members a MDX query that has a invalid member in it will cause mondrian to to go through all the dimensions, levels, hierarchies, members and properties trying to resolve the element name. This behavior consumes considerable time and resources on the server. Setting this property to true will make it fail fast in a scenario where it is desirable.

boolean false
EnableRolapCubeMemberCache mondrian.rolap.EnableRolapCubeMemberCache Caching

Property that determines whether to cache RolapCubeMember objects, each of which associates a member of a shared hierarchy with a particular cube in which it is being used.

The default is {@code true}, that is, use a cache. If you wish to use the member cache control aspects of {@link mondrian.olap.CacheControl}, you must set this property to {@code false}.

RolapCubeMember has recently become more lightweight to construct, and we may obsolete this cache and this property.

boolean true
SolveOrderMode mondrian.rolap.SolveOrderMode Property that controls the behavior of {@link Property#SOLVE_ORDER solve order} of calculated members and sets.

Valid values are "scoped" and "absolute" (the default). See {@link mondrian.olap.SolveOrderMode} for details.

String ABSOLUTE
NativizeMinThreshold mondrian.native.NativizeMinThreshold

Property that controls minimum expected cardinality required in order for NativizeSet to natively evaluate a query.

If the expected cardinality falls below this level the query is executed non-natively.

It is possible for the actual cardinality to fall below this threshold even though the expected cardinality falls above this threshold. In this case the query will be natively evaluated.

int 100000
NativizeMaxResults mondrian.native.NativizeMaxResults

Property that controls the maximum number of results contained in a NativizeSet result set.

If the number of tuples contained in the result set exceeds this value Mondrian throws a LimitExceededDuringCrossjoin error.

int 150000
SsasCompatibleNaming mondrian.olap.SsasCompatibleNaming

Property that defines whether to enable new naming behavior.

If true, hierarchies are named [Dimension].[Hierarchy]; if false, [Dimension.Hierarchy].

boolean false
XmlaSchemaRefreshInterval mondrian.xmla.SchemaRefreshInterval

Interval at which to refresh the list of XML/A catalogs. (Usually known as the datasources.xml file.)

It is not an active process; no threads will be created. It only serves as a rate limiter. The refresh process is triggered by requests to the doPost() servlet method.

Values may have time unit suffixes such as 's' (second) or 'ms' (milliseconds). Default value is 3000 milliseconds (3 seconds). Default time unit is milliseconds.

See also {@link mondrian.xmla.impl.DynamicDatasourceXmlaServlet}.

String 3000ms
FilterChildlessSnowflakeMembers mondrian.rolap.FilterChildlessSnowflakeMembers SQL generation

Property that defines whether to generate joins to filter out members in a snowflake dimension that do not have any children.

If true (the default), some queries to query members of high levels snowflake dimensions will be more expensive. If false, and if there are rows in an outer snowflake table that are not referenced by a row in an inner snowflake table, then some queries will return members that have no children.

Our recommendation, for best performance, is to remove rows outer snowflake tables are not referenced by any row in an inner snowflake table, during your ETL process, and to set this property to {@code false}.

boolean true
StatisticsProviders mondrian.statistics.providers

Comma-separated list of classes to be used to get statistics about the number of rows in a table, or the number of distinct values in a column.

If there is a value for mondrian.statistics.providers.DATABASE, where DAtABASE is the current database name (e.g. MYSQL or ORACLE), then that property overrides.

Example:

mondrian.statistics.providers=mondrian.spi.impl.JdbcStatisticsProvider
mondrian.statistics.providers.MYSQL=mondrian.spi.impl.JdbcStatisticsProvider,mondrian.spi.impl.JdbcStatisticsProvider

This would use JDBC's statistics (via the java.sql.DatabaseMetaData.getIndexInfo method) for most databases, but for connections to a MySQL database, would use external statistics first, and fall back to JDBC statistics only if external statistics were not available.

true String
LevelPreCacheThreshold mondrian.rolap.precache.threshold

Property which governs whether child members or members of a level are precached when child or level members are requested within a query expression. For example, if an expression references two child members in the store dimension, like { [Store].[USA].[CA], [Store].[USA].[OR] }, precaching will load *all* children under [USA] rather than just the 2 requested. The threshold value is compared against the cardinality of the level to determine whether or not precaching should be performed. If cardinality is lower than the threshold value Mondrian will precache. Setting this property to 0 effectively disables precaching.

true int 300
WebappDeploy mondrian.webapp.deploy

Where mondrian.war will be deployed to. (Used by mondrian's build.xml ant file only.)

Example: mondrian.webapp.deploy=C:/jboss-4.0.2/server/default/deploy

false String
WebappConnectString mondrian.webapp.connectString

Connect string for the webapp. (Used by the webapp only.)

To achieve access control, append say ;Role='California manager' to the connect string.

false String Provider=mondrian;Jdbc=jdbc:odbc:MondrianFoodMart;Catalog=/WEB-INF/queries/FoodMart.xml;JdbcDrivers=sun.jdbc.odbc.JdbcOdbcDriver
Log4jConfiguration log4j.configuration

Set mondrian logging information if not provided by containing application.

Examples:

log4j.configuration=file://full/path/log4j.xml
log4j.configuration=file:log4j.properties
false String
mondrian-3.11.0.1-R/src/main/mondrian/olap/MondrianPropertiesBase.java000066400000000000000000000212441261646570300255150ustar00rootroot00000000000000/* // This software is subject to the terms of the Eclipse Public License v1.0 // Agreement, available at the following URL: // http://www.eclipse.org/legal/epl-v10.html. // You must accept the terms of that agreement to use this software. // // Copyright (C) 2001-2005 Julian Hyde // Copyright (C) 2005-2011 Pentaho and others // All Rights Reserved. */ package mondrian.olap; import org.apache.log4j.Logger; import org.eigenbase.util.property.TriggerableProperties; import java.io.*; import java.net.*; import java.util.Enumeration; /** * MondrianProperties contains the properties which determine the * behavior of a mondrian instance. * *

There is a method for property valid in a * mondrian.properties file. Although it is possible to retrieve * properties using the inherited {@link java.util.Properties#getProperty(String)} * method, we recommend that you use methods in this class. * *

Note to developers

* * If you add a property, you must:
    * *
  • Add a property definition to MondrianProperties.xml.
  • * *
  • Re-generate MondrianProperties.java using PropertyUtil.
  • * *
  • Modify the default mondrian.properties file checked into * source control, with a description of the property and its default * value.
  • * *
  • Modify the * * Configuration Specification.
  • *
* *

Similarly if you update or delete a property. * * @author jhyde * @since 22 December, 2002 */ public abstract class MondrianPropertiesBase extends TriggerableProperties { private final PropertySource propertySource; private int populateCount; private static final Logger LOGGER = Logger.getLogger(MondrianProperties.class); protected static final String mondrianDotProperties = "mondrian.properties"; protected MondrianPropertiesBase(PropertySource propertySource) { this.propertySource = propertySource; } public boolean triggersAreEnabled() { return ((MondrianProperties) this).EnableTriggers.get(); } /** * Represents a place that properties can be read from, and remembers the * timestamp that we last read them. */ public interface PropertySource { /** * Opens an input stream from the source. * *

Also checks the 'last modified' time, which will determine whether * {@link #isStale()} returns true. * * @return input stream */ InputStream openStream(); /** * Returns true if the source exists and has been modified since last * time we called {@link #openStream()}. * * @return whether source has changed since it was last read */ boolean isStale(); /** * Returns the description of this source, such as a filename or URL. * * @return description of this PropertySource */ String getDescription(); } /** * Implementation of {@link PropertySource} which reads from a * {@link java.io.File}. */ static class FilePropertySource implements PropertySource { private final File file; private long lastModified; FilePropertySource(File file) { this.file = file; this.lastModified = 0; } public InputStream openStream() { try { this.lastModified = file.lastModified(); return new FileInputStream(file); } catch (FileNotFoundException e) { throw Util.newInternal( e, "Error while opening properties file '" + file + "'"); } } public boolean isStale() { return file.exists() && file.lastModified() > this.lastModified; } public String getDescription() { return "file=" + file.getAbsolutePath() + " (exists=" + file.exists() + ")"; } } /** * Implementation of {@link PropertySource} which reads from a * {@link java.net.URL}. */ static class UrlPropertySource implements PropertySource { private final URL url; private long lastModified; UrlPropertySource(URL url) { this.url = url; } private URLConnection getConnection() { try { return url.openConnection(); } catch (IOException e) { throw Util.newInternal( e, "Error while opening properties file '" + url + "'"); } } public InputStream openStream() { try { final URLConnection connection = getConnection(); this.lastModified = connection.getLastModified(); return connection.getInputStream(); } catch (IOException e) { throw Util.newInternal( e, "Error while opening properties file '" + url + "'"); } } public boolean isStale() { final long lastModified = getConnection().getLastModified(); return lastModified > this.lastModified; } public String getDescription() { return url.toExternalForm(); } } /** * Loads this property set from: the file "$PWD/mondrian.properties" (if it * exists); the "mondrian.properties" in the CLASSPATH; and from the system * properties. */ public void populate() { // Read properties file "mondrian.properties", if it exists. If we have // read the file before, only read it if it is newer. loadIfStale(propertySource); URL url = null; File file = new File(mondrianDotProperties); if (file.exists() && file.isFile()) { // Read properties file "mondrian.properties" from PWD, if it // exists. try { url = file.toURI().toURL(); } catch (MalformedURLException e) { LOGGER.warn( "Mondrian: file '" + file.getAbsolutePath() + "' could not be loaded", e); } } else { // Then try load it from classloader url = MondrianPropertiesBase.class.getClassLoader().getResource( mondrianDotProperties); } if (url != null) { load(new UrlPropertySource(url)); } else { LOGGER.warn( "mondrian.properties can't be found under '" + new File(".").getAbsolutePath() + "' or classloader"); } // copy in all system properties which start with "mondrian." int count = 0; for (Enumeration keys = System.getProperties().keys(); keys.hasMoreElements();) { String key = (String) keys.nextElement(); String value = System.getProperty(key); if (key.startsWith("mondrian.")) { // NOTE: the super allows us to bybase calling triggers // Is this the correct behavior? if (LOGGER.isDebugEnabled()) { LOGGER.debug("populate: key=" + key + ", value=" + value); } super.setProperty(key, value); count++; } } LOGGER.info( "Mondrian: loaded " + count + " system properties"); } /** * Reads properties from a source. * If the source does not exist, or has not changed since we last read it, * does nothing. * * @param source Source of properties */ private void loadIfStale(PropertySource source) { if (source.isStale()) { if (LOGGER.isDebugEnabled()) { LOGGER.debug("Mondrian: loading " + source.getDescription()); } load(source); } } /** * Tries to load properties from a URL. Does not fail, just prints success * or failure to log. * * @param source Source to read properties from */ private void load(final PropertySource source) { try { load(source.openStream()); if (populateCount == 0) { LOGGER.info( "Mondrian: properties loaded from '" + source.getDescription() + "'"); } } catch (IOException e) { LOGGER.error( "Mondrian: error while loading properties " + "from '" + source.getDescription() + "' (" + e + ")"); } } } // End MondrianPropertiesBase.java mondrian-3.11.0.1-R/src/main/mondrian/olap/MondrianServer.java000066400000000000000000000211161261646570300240320ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.olap; import mondrian.rolap.RolapConnection; import mondrian.rolap.RolapResultShepherd; import mondrian.rolap.agg.AggregationManager; import mondrian.server.*; import mondrian.server.monitor.Monitor; import mondrian.spi.CatalogLocator; import mondrian.util.LockBox; import org.olap4j.OlapConnection; import java.sql.SQLException; import java.util.*; /** * Interface by which to control an instance of Mondrian. * *

Typically, there is only one instance of Mondrian per JVM. However, you * access a MondrianServer via the {@link #forConnection} method for future * expansion. * * @author jhyde * @since Jun 25, 2006 */ public abstract class MondrianServer { /** * Returns the MondrianServer that hosts a given connection. * * @param connection Connection (not null) * @return server this connection belongs to (not null) */ public static MondrianServer forConnection(Connection connection) { return ((RolapConnection) connection).getServer(); } /** * Creates a server. * *

When creating a server, the calling code must call the * {@link MondrianServer#shutdown()} method to dispose of it. * * @param contentFinder Repository content finder * @param catalogLocator Catalog locator * @return Server that reads from the given repository */ public static MondrianServer createWithRepository( RepositoryContentFinder contentFinder, CatalogLocator catalogLocator) { return MondrianServerRegistry.INSTANCE.createWithRepository( contentFinder, catalogLocator); } /** * Returns the server with the given id. * *

If id is null, returns the catalog-less server. (The catalog-less * server can also be acquired using its id.)

* *

If server is not found, returns null.

* * @param instanceId Server instance id * @return Server, or null if no server with this id */ public static MondrianServer forId(String instanceId) { return MondrianServerRegistry.INSTANCE.serverForId(instanceId); } /** * Disposes of a server and cleans up everything. * * @param instanceId The instance ID of the server * to shutdown gracefully. */ public static void dispose(String instanceId) { final MondrianServer server = forId(instanceId); if (server != null) { server.shutdown(); } } /** * Returns an integer uniquely identifying this server within its JVM. * * @return Server's unique identifier */ public abstract int getId(); /** * Returns the version of this MondrianServer. * * @return Server's version */ public MondrianVersion getVersion() { return MondrianServerRegistry.INSTANCE.getVersion(); } /** * Returns a list of MDX keywords. * @return list of MDX keywords */ public abstract List getKeywords(); public abstract RolapResultShepherd getResultShepherd(); /** * Returns the lock box that can be used to pass objects via their string * key. * * @return Lock box for this server */ public abstract LockBox getLockBox(); /** * Gets a Connection given a catalog (and implicitly the catalog's data * source) and the name of a user role. * *

If you want to pass in a role object, and you are making the call * within the same JVM (i.e. not RPC), register the role using * {@link MondrianServer#getLockBox()} and pass in the moniker * for the generated lock box entry. The server will retrieve the role from * the moniker. * * @param catalogName Catalog name * @param schemaName Schema name * @param roleName User role name * @return Connection * @throws SQLException If error occurs * @throws SecurityException If security error occurs */ public abstract OlapConnection getConnection( String catalogName, String schemaName, String roleName) throws SQLException, SecurityException; /** * Extended version of * {@link MondrianServer#getConnection(String, String, String)} * taking a list of properties to pass down to the native connection. * *

Gets a Connection given a catalog (and implicitly the catalog's data * source) and the name of a user role. * *

If you want to pass in a role object, and you are making the call * within the same JVM (i.e. not RPC), register the role using * {@link MondrianServer#getLockBox()} and pass in the moniker * for the generated lock box entry. The server will retrieve the role from * the moniker. * * @param catalogName Catalog name * @param schemaName Schema name * @param roleName User role name * @param props Properties to pass down to the native driver. * @return Connection * @throws SQLException If error occurs * @throws SecurityException If security error occurs */ public abstract OlapConnection getConnection( String catalogName, String schemaName, String roleName, Properties props) throws SQLException, SecurityException; /** * Returns a list of the databases in this server. One element * per database, each element a map whose keys are the XMLA fields * describing a data source: "DataSourceName", "DataSourceDescription", * "URL", etc. Unrecognized fields are ignored. * * @return List of data source definitions * @param connection Connection */ public abstract List> getDatabases( RolapConnection connection); public abstract CatalogLocator getCatalogLocator(); /** * Called when the server must terminate all background tasks * and cleanup all potential memory leaks. */ public abstract void shutdown(); /** * Called just after a connection has been created. * * @param connection Connection */ public abstract void addConnection(RolapConnection connection); /** * Called when a connection is closed. * * @param connection Connection */ public abstract void removeConnection(RolapConnection connection); /** * Retrieves a connection. * * @param connectionId Connection id, per * {@link mondrian.rolap.RolapConnection#getId()} * * @return Connection, or null if connection is not registered */ public abstract RolapConnection getConnection(int connectionId); /** * Called just after a statement has been created. * * @param statement Statement */ public abstract void addStatement(Statement statement); /** * Called when a statement is closed. * * @param statement Statement */ public abstract void removeStatement(Statement statement); public abstract Monitor getMonitor(); public abstract AggregationManager getAggregationManager(); /** * Description of the version of the server. */ public interface MondrianVersion { /** * Returns the version string, for example "2.3.0". * * @see java.sql.DatabaseMetaData#getDatabaseProductVersion() * @return Version of this server */ String getVersionString(); /** * Returns the major part of the version number. * *

For example, if the full version string is "2.3.0", the major * version is 2. * * @return major part of the version number * @see java.sql.DatabaseMetaData#getDatabaseMajorVersion() */ int getMajorVersion(); /** * Returns the minor part of the version number. * *

For example, if the full version string is "2.3.0", the minor * version is 3. * * @return minor part of the version number * * @see java.sql.DatabaseMetaData#getDatabaseProductVersion() */ int getMinorVersion(); /** * Retrieves the name of this database product. * * @return database product name * @see java.sql.DatabaseMetaData#getDatabaseProductName() */ String getProductName(); } } // End MondrianServer.java mondrian-3.11.0.1-R/src/main/mondrian/olap/Mondrian_SW.xml000066400000000000000000002673421261646570300231500ustar00rootroot00000000000000 This is the XML model for Mondrian schemas as used by the Schema Workbench. It is based upon the Mondrian model Mondrian.xml, but has a number of differences:

  • The implementation of equals method for schema objects is changed to == (double equals), to compare two object references rather than their contents.
  • The attributes of the root tag <Model> refers to the generated file MondrianGuiDef.java and its import statements.
  • The 'aggregator' attribute of the Measure element requires the <Value> tags to generate a drop-down of possible options in the Schema Workbench.

Revision is $Id$

A schema is a collection of cubes and virtual cubes. It can also contain shared dimensions (for use by those cubes), named sets, roles, and declarations of user-defined functions.

Name of this schema Description of this schema. Label for the measures dimension. Can be localized from Properties file using #{propertyname}. The name of the default role for connections to this schema Contains values of user-defined properties. This schema's parameter definitions. Shared dimensions in this schema. Cubes in this schema. Virtual cubes in this schema. Named sets in this schema. Roles in this schema. Declarations of user-defined functions in this schema. A CubeDimension is either a usage of a Dimension ('shared dimension', in MSOLAP parlance), or a 'private dimension'. A string being displayed instead of the Dimension's name. Can be localized from Properties file using #{propertyname}. Whether this dimension is visible in the user-interface. Default true. Description of this dimension. Can be localized from Properties file using #{propertyname}. The name of the column in the fact table which joins to the leaf level of this dimension. Required in a private Dimension or a DimensionUsage, but not in a public Dimension. Flag to mark this dimension as a high cardinality one and avoid caching. Contains values of user-defined properties. Never returns null; if the dimension cannot be * found, throws an error. * * @param schema Schema, never null * @pre schema != null * @post return != null */ public abstract Dimension getDimension(Schema schema);]]> Definition of a cube. Name of this cube. A string being displayed instead of the cube's name. Can be localized from Properties file using #{propertyname}. Whether this cube is visible in the user-interface. Default true. Description of this cube. Can be localized from Properties file using #{propertyname}. The name of the measure that would be taken as the default measure of the cube. Should the Fact table data for this Cube be cached by Mondrian or not. The default action is to cache the data. Whether element is enabled - if true, then the Cube is realized otherwise it is ignored. Contains values of user-defined properties. The fact table is the source of all measures in this cube. If this is a Table and the schema name is not present, table name is left unqualified. Calculated members in this cube. Named sets in this cube. A VirtualCube is a set of dimensions and measures gleaned from other cubes. Whether this element is enabled - if true, then the Virtual Cube is realized otherwise it is ignored. The name of the measure that would be taken as the default measure of the cube. A string being displayed instead of the cube's name. Can be localized from Properties file using #{propertyname}. Whether this cube is visible in the user-interface. Default true. Description of this virtual cube. Can be localized from Properties file using #{propertyname}. Contains values of user-defined properties. Calculated members that belong to this virtual cube. (Calculated members inherited from other cubes should not be in this list.) Named sets in this cube. List of base cubes used by the virtual cube. Name of the cube which the virtualCube uses. Unrelated dimensions to measures in this cube will be pushed to top level member. A VirtualCubeDimension is a usage of a Dimension in a VirtualCube. Name of the cube which the dimension belongs to, or unspecified if the dimension is shared. Name of the dimension. A VirtualCubeMeasure is a usage of a Measure in a VirtualCube. Name of the cube which the measure belongs to. Unique name of the measure within its cube. Whether this member is visible in the user-interface. Default true. Contains values of user-defined properties. A DimensionUsage is usage of a shared Dimension within the context of a cube. Name of the source dimension. Must be a dimension in this schema. Case-sensitive. Name of the level to join to. If not specified, joins to the lowest level of the dimension. If present, then this is prepended to the Dimension column names during the building of collapse dimension aggregates allowing 1) different dimension usages to be disambiguated during aggregate table recognition and 2) multiple shared dimensions that have common column names to be disambiguated. A Dimension is a collection of hierarchies. There are two kinds: a public dimension belongs to a Schema, and be used by several cubes; a private dimension belongs to a Cube. The foreignKey field is only applicable to private dimensions. The dimension's type may be one of "Standard" or "Time". A time dimension will allow the use of the MDX time functions (WTD, YTD, QTD, etc.). Use a standard dimension if the dimension is not a time-related dimension. The default value is "Standard". StandardDimension TimeDimension A string being displayed instead of the dimensions's name. Can be localized from Properties file using #{propertyname}. Description of this dimension. Can be localized from Properties file using #{propertyname}. If present, then this is prepended to the Dimension column names during the building of collapse dimension aggregates allowing 1) different dimensions to be disambiguated during aggregate table recognition. This should only be set for private dimensions. // implement CubeDimension public Dimension getDimension(Schema schema) { Util.assertPrecondition(schema != null, "schema != null"); return this; } // Return the dimension's enumerated type. public DimensionType getDimensionType() { if (type == null) { return null; //DimensionType.StandardDimension; } else { return DimensionType.valueOf(type); } } Defines a hierarchy.

You must specify at most one <Relation> or memberReaderClass. If you specify none, the hierarchy is assumed to come from the same fact table of the current cube. Name of the hierarchy. If this is not specified, the hierarchy has the same name as its dimension. Whether this hierarchy is visible in the user-interface. Default true. Whether this hierarchy has an 'all' member. Name of the 'all' member. If this attribute is not specified, the all member is named 'All hierarchyName', for example, 'All Store'. A string being displayed instead as the all member's name. Can be localized from Properties file using #{propertyname}. Name of the 'all' level. If this attribute is not specified, the all member is named '(All)'. Can be localized from Properties file using #{propertyname}. The name of the column which identifies members, and which is referenced by rows in the fact table. If not specified, the key of the lowest level is used. See also CubeDimension.foreignKey. The name of the table which contains primaryKey. If the hierarchy has only one table, defaults to that; it is required. Name of the custom member reader class. Must implement the mondrian.rolap.MemberReader interface. A string to be displayed in the user interface. If not specified, the hierarchy's name is used. Can be localized from Properties file using #{propertyname}. Description of this hierarchy. Can be localized from Properties file using #{propertyname}. Should be set to the level (if such a level exists) at which depth it is known that all members have entirely unique rows, allowing SQL GROUP BY clauses to be completely eliminated from the query. Contains values of user-defined properties. The {@link MondrianGuiDef.Table table}, {@link MondrianGuiDef.Join set of tables}, {@link MondrianGuiDef.View SQL statement}, or {@link MondrianGuiDef.InlineTable inline table} which populates this hierarchy. The estimated number of members in this level. Setting this property improves the performance of MDSCHEMA_LEVELS, MDSCHEMA_HIERARCHIES and MDSCHEMA_DIMENSIONS XMLA requests Whether this level is visible in the user-interface. Default true. The name of the table that the column comes from. If this hierarchy is based upon just one table, defaults to the name of that table; otherwise, it is required. Can be localized from Properties file using #{propertyname}. The name of the column which holds the unique identifier of this level. The name of the column which holds the user identifier of this level. The name of the column which holds member ordinals. If this column is not specified, the key column is used for ordering. The name of the column which references the parent member in a parent-child hierarchy. Value which identifies null parents in a parent-child hierarchy. Typical values are 'NULL' and '0'. Indicates the type of this level's key column: String, Numeric, Integer, Boolean, Date, Time or Timestamp. When generating SQL statements, Mondrian encloses values for String columns in quotation marks, but leaves values for Integer and Numeric columns un-quoted.

Date, Time, and Timestamp values are quoted according to the SQL dialect. For a SQL-compliant dialect, the values appear prefixed by their typename, for example, "DATE '2006-06-01'". String Numeric Integer Boolean Date Time Timestamp Indicates the Java type that Mondrian uses to store this level's key column. It also determines the JDBC method that Mondrian will call to retrieve the column; for example, if the Java type is 'int', Mondrian will call 'ResultSet.getInt(int)'.

Usually this attribute is not needed, because Mondrian can choose a sensible type based on the type of the database column.

Allowable values are: 'int', 'long', 'Object', 'String'. int long Object String Whether members are unique across all parents. For example, zipcodes are unique across all states. The first level's members are always unique. Whether this is a regular or a time-related level. The value makes a difference to time-related functions such as YTD (year-to-date).

The "TimeHalfYear" value is deprecated and will be removed in mondrian-4.0; use "TimeHalfYears" instead.

Regular TimeYears TimeHalfYears TimeHalfYear TimeQuarters TimeMonths TimeWeeks TimeDays TimeHours TimeMinutes TimeSeconds TimeUndefined Condition which determines whether a member of this level is hidden. If a hierarchy has one or more levels with hidden members, then it is possible that not all leaf members are the same distance from the root, and it is termed a ragged hierarchy.

Allowable values are: Never (a member always appears; the default); IfBlankName (a member doesn't appear if its name is null, empty or all whitespace); and IfParentsName (a member appears unless its name matches the parent's.

Never IfBlankName IfParentsName
Name of a formatter class for the member labels being displayed. The class must implement the mondrian.spi.MemberFormatter interface.

This attribute is deprecated. Please use a nested MemberFormatter element.

A string being displayed instead of the level's name. Can be localized from Properties file using #{propertyname}. Description of this level. Can be localized from Properties file using #{propertyname}. The name of the column which holds the caption for members. Contains values of user-defined properties. The SQL expression used to populate this level's key. The SQL expression used to populate this level's name. If not specified, the level's key is used. The SQL expression used to populate this level's caption. If not specified, the level's name is used. The SQL expression used to populate this level's ordinal. The SQL expression used to join to the parent member in a parent-child hierarchy. Member formatter. public Expression getKeyExp() { if (keyExp != null) { return keyExp; } else if (column != null) { return new Column(table, column); } else { return null; } } public Expression getNameExp() { if (nameExp != null) { return nameExp; } else if (nameColumn != null) { return new Column(table, nameColumn); } else { return null; } } public Expression getCaptionExp() { if (captionExp != null) { return captionExp; } else if (captionColumn != null) { return new Column(table, captionColumn); } else { return null; } } public Expression getOrdinalExp() { if (ordinalExp != null) { return ordinalExp; } else if (ordinalColumn != null) { return new Column(table, ordinalColumn); } else { return null; } } public Expression getParentExp() { if (parentExp != null) { return parentExp; } else if (parentColumn != null) { return new Column(table, parentColumn); } else { return null; } } public Expression getPropertyExp(int i) { return new Column(table, properties[i].column); } public mondrian.spi.Dialect.Datatype getDatatype() { return mondrian.spi.Dialect.Datatype.valueOf(type); } Specifies the transitive closure of a parent-child hierarchy. Optional, but recommended for better performance. The closure is provided as a set of (parent/child) pairs: since it is the transitive closure these are actually (ancestor/descendant) pairs. Member property. Data type of this property: String, Numeric, Integer, Boolean, Date, Time or Timestamp. String Numeric Integer Boolean Date Time Timestamp

Name of a formatter class for the appropriate property value being displayed.

The class must implement the mondrian.spi.PropertyFormatter interface.

This attribute is deprecated. Please use a nested PropertyFormatter element.

A string being displayed instead of the name. Can be localized from Properties file using #{propertyname}. Description of this member property. Can be localized from Properties file using #{propertyname}. Should be set to true if the value of the property is functionally dependent on the level value. This permits the associated property column to be omitted from the GROUP BY clause (if the database permits columns in the SELECT that are not in the GROUP BY). This can be a significant performance enhancement on some databases, such as MySQL. Property formatter.
Name of this measure. Column which is source of this measure's values. If not specified, a measure expression must be specified. The datatype of this measure: String, Numeric, Integer, Boolean, Date, Time or Timestamp.

The default datatype of a measure is 'Integer' if the measure's aggregator is 'Count', otherwise it is 'Numeric'. String Numeric Integer Boolean Date Time Timestamp Format string with which to format cells of this measure. For more details, see the mondrian.util.Format class. Aggregation function. Allowed values are "sum", "count", "min", "max", "avg", and "distinct-count". ("distinct count" is allowed for backwards compatibility, but is deprecated because XML enumerated attributes in a DTD cannot legally contain spaces.) sum count min max avg distinct count distinct-count

Name of a formatter class for the appropriate cell being displayed.

The class must implement the mondrian.spi.CellFormatter interface.

This attribute is deprecated. Please use a nested CellFormatter element.

A string being displayed instead of the name. Can be localized from Properties file using #{propertyname}. Description of this measure. Can be localized from Properties file using #{propertyname}. Whether this member is visible in the user-interface. Default true. Contains values of user-defined properties. The SQL expression used to calculate a measure. Must be specified if a source column is not specified. Cell formatter.
Name of this calculated member. Format string with which to format cells of this member. For more details, see {@link mondrian.util.Format}. A string being displayed instead of the name. Can be localized from Properties file using #{propertyname}. Description of this calculated member. Can be localized from Properties file using #{propertyname}. MDX expression which gives the value of this member. Equivalent to the Formula sub-element.

Name of the dimension that this member belongs to.

Deprecated: use {@code hierarchy} attribute instead.

Name of the hierarchy that this member belongs to.

Fully-qualified name of the parent member. If not specified, the member will be at the lowest level (besides the 'all' level) in the hierarchy. Whether this member is visible in the user-interface. Default true. Contains values of user-defined properties. MDX expression which gives the value of this member. Cell formatter. /** * Returns the formula, looking for a sub-element called * "Formula" first, then looking for an attribute called * "formula". */ public String getFormula() { if (formulaElement != null) { return formulaElement.cdata; } else { return formula; } }
Property of a calculated member defined against a cube. It must have either an expression or a value. Name of this member property. A string being displayed instead of the name of this calculated member property. Can be localized from Properties file using #{propertyname}. Description of this calculated member property. Can be localized from Properties file using #{propertyname}. MDX expression which defines the value of this property. If the expression is a constant string, you could enclose it in quotes, or just specify the 'value' attribute instead. Value of this property. If the value is not constant, specify the 'expression' attribute instead. Defines a named set which can be used in queries in the same way as a set defined using a WITH SET clause.

A named set can be defined against a particular cube, or can be global to a schema. If it is defined against a cube, it is only available to queries which use that cube.

A named set defined against a cube is not inherited by a virtual cubes defined against that cube. (But you can define a named set against a virtual cube.)

A named set defined against a schema is available in all cubes and virtual cubes in that schema. However, it is only valid if the cube contains dimensions with the names required to make the formula valid.

]]>
Name of this named set. Caption of this named set. Can be localized from Properties file using #{propertyname}. Description of this named set. Can be localized from Properties file using #{propertyname}. MDX expression which gives the value of this set. Equivalent to the Formula sub-element. Contains values of user-defined properties. MDX expression which gives the value of this set. /** * Returns the formula, looking for a sub-element called * "Formula" first, then looking for an attribute called * "formula". */ public String getFormula() { if (formulaElement != null) { return formulaElement.cdata; } else { return formula; } }
Not used A table or a join public abstract Relation find(String seekAlias); public boolean equals(Object o) { return this == o; } public int hashCode() { return System.identityHashCode(this); } A table, inline table or view public abstract String getAlias(); A collection of SQL statements, one per dialect. /** * Copy constructor. */ public View(View view) { this.alias = view.alias; this.selects = view.selects.clone(); } public String toString() { return selects[0].cdata; } public View find(String seekAlias) { if (seekAlias.equals(alias)) { return this; } else { return null; } } public String getAlias() { return alias; } public SqlQuery.CodeSet getCodeSet() { return SQL.toCodeSet(selects); } public void addCode(String dialect, String code) { if (selects == null) { selects = new SQL[1]; } else { SQL[] olds = selects; selects = new SQL[olds.length + 1]; System.arraycopy(olds, 0, selects, 0, olds.length); } SQL sql = new SQL(); sql.dialect = dialect; sql.cdata = code; selects[selects.length - 1] = sql; } public boolean equals(Object o) { if (o instanceof View) { View that = (View) o; if (!this.alias.equals(that.alias)) { return false; } if (this.selects == null || that.selects == null || this.selects.length != that.selects.length) { return false; } for (int i = 0; i < selects.length; i++) { if (!Util.equals(this.selects[i].dialect, that.selects[i].dialect) || !Util.equals(this.selects[i].cdata, that.selects[i].cdata)) { return false; } } return true; } else { return false; } } Dialect of SQL the view is intended for. Valid values include, but are not limited to:
  • generic
  • access
  • db2
  • derby
  • firebird
  • hsqldb
  • mssql
  • mysql
  • oracle
  • postgres
  • sybase
  • teradata
  • ingres
  • infobright
  • luciddb
  • vertica
  • neoview
generic access db2 derby firebird hsqldb mssql mysql oracle postgres sybase teradata ingres infobright luciddb vertica neoview greenplum vectorwise hive
Defaults to left's alias if left is a table, otherwise required. Defaults to right's alias if right is a table, otherwise required. /** Convenience constructor. */ public Join( String leftAlias, String leftKey, RelationOrJoin left, String rightAlias, String rightKey, RelationOrJoin right) { this.leftAlias = leftAlias; this.leftKey = leftKey; this.left = left; this.rightAlias = rightAlias; this.rightKey = rightKey; this.right = right; } /** * Returns the alias of the left join key, defaulting to left's * alias if left is a table. */ public String getLeftAlias() { if (leftAlias != null) { return leftAlias; } if (left instanceof Relation) { return ((Relation) left).getAlias(); } throw Util.newInternal( "alias is required because " + left + " is not a table"); } /** * Returns the alias of the right join key, defaulting to right's * alias if right is a table. */ public String getRightAlias() { if (rightAlias != null) { return rightAlias; } if (right instanceof Relation) { return ((Relation) right).getAlias(); } if (right instanceof Join) { return ((Join) right).getLeftAlias(); } throw Util.newInternal( "alias is required because " + right + " is not a table"); } public String toString() { return "(" + left + ") join (" + right + ") on " + leftAlias + "." + leftKey + " = " + rightAlias + "." + rightKey; } public Relation find(String seekAlias) { Relation relation = left.find(seekAlias); if (relation == null) { relation = right.find(seekAlias); } return relation; } public boolean equals(Object o) { return (this == o); } Optional qualifier for table. Alias to be used with this table when it is used to form queries. If not specified, defaults to the table name, but in any case, must be unique within the schema. (You can use the same table in different hierarchies, but it must have different aliases.) The SQL WHERE clause expression to be appended to any select statement Table optimization hints; may be ignored by dialect. hintMap; /** Convenience constructor. */ public Table(Table table) { this(table.schema, table.name, table.alias, table.tableHints); } public Table(String schema, String name, String alias, Hint[] tablehints) { this(); this.schema = schema; this.name = name; this.alias = alias; this.hintMap = buildHintMap(tablehints); } private java.util.Map buildHintMap(Hint[] th) { java.util.Map h = new java.util.HashMap(); if (th != null) { for (int i = 0; i < th.length; i++) { h.put(th[i].type, th[i].cdata); } } return h; } /** Returns the alias or, if it is null, the table name. */ public String getAlias() { return (alias != null) ? alias : name; } public String toString() { return (schema == null) ? name : schema + "." + name; } public Table find(String seekAlias) { return seekAlias.equals(name) ? this : (alias != null) && seekAlias.equals(alias) ? this : null; } public boolean equals(Object o) { if (true) return (this == o); // Following code is disabled to resolve problem of disappearing // schema elements from tree panel. if (o instanceof Table) { Table that = (Table) o; return this.name.equals(that.name) && Util.equals(this.alias, that.alias) && Util.equals(this.schema, that.schema); } else { return false; } } public int hashCode() { return toString().hashCode(); } public String getFilter() { return (filter == null) ? null : filter.cdata; } public AggExclude[] getAggExcludes() { return aggExcludes; } public AggTable[] getAggTables() { return aggTables; } public java.util.Map getHintMap() { if (hintMap == null) { hintMap = buildHintMap(this.tableHints); } return hintMap; } ]]> Dialect-specific table optimization hints. Type of hint, interpreted and applied on a per-dialect basis. Alias to be used with this table when it is used to form queries. If not specified, defaults to the table name, but in any case, must be unique within the schema. (You can use the same table in different hierarchies, but it must have different aliases.) "; } public InlineTable find(String seekAlias) { return seekAlias.equals(this.alias) ? this : null; } public boolean equals(Object o) { if (o instanceof InlineTable) { InlineTable that = (InlineTable) o; return this.alias.equals(that.alias); } else { return false; } } public int hashCode() { return toString().hashCode(); } ]]> Holder for an array of ColumnDef elements Column definition for an inline table. Name of the column. Type of the column: String, Numeric, Integer, Boolean, Date, Time or Timestamp. String Numeric Integer Boolean Date Time Timestamp Holder for an array of Row elements Row definition for an inline table. Must have one Column for each ColumnDef in the InlineTable. Column value for an inline table. The CDATA holds the value of the column. Name of the column. A definition of an aggregate table for a base fact table. This aggregate table must be in the same schema as the base fact table. Whether or not the match should ignore case. What does the fact_count column look like. public boolean isIgnoreCase() { return ignorecase.booleanValue(); } public AggFactCount getAggFactCount() { return factcount; } public AggIgnoreColumn[] getAggIgnoreColumns() { return ignoreColumns; } public AggForeignKey[] getAggForeignKeys() { return foreignKeys; } public AggMeasure[] getAggMeasures() { return measures; } public AggLevel[] getAggLevels() { return levels; } The Table name of a Specific aggregate table. The estimated number of rows in this aggregation table. Setting this property improves the performance of the aggregation optimizer and prevents it from issuing a 'select count(*)' query over the aggregation table. public String getNameAttribute() { return name; } public String getApproxRowCountAttribute() { return approxRowCount; } A Table pattern used to define a set of aggregate tables. public String getPattern() { return pattern; } public AggExclude[] getAggExcludes() { return excludes; } A Table pattern not to be matched. The Table name not to be matched. Whether or not the match should ignore case. public String getNameAttribute() { return name; } public String getPattern() { return pattern; } public boolean isIgnoreCase() { return ignorecase.booleanValue(); } The name of the fact count column. public String getColumnName() { return column; } The name of the column mapping from base fact table foreign key to aggregate table foreign key. The name of the base fact table foreign key. The name of the aggregate table foreign key. public String getFactFKColumnName() { return factColumn; } public String getAggregateFKColumnName() { return aggColumn; } The name of the column mapping to the level name. The ordinal column for this level. The caption column for this level. The name of the Dimension Hierarchy level. The name of the column which holds the user identifier of this level. Whether this is a collapsed level. The parents of that level are also present in the aggregation table. public String getNameAttribute() { return name; } public String getColumnName() { return column; } public boolean isCollapsed() { return collapsed; } Member property. The name of the column mapping to the measure name. The name of the Cube measure. public String getNameAttribute() { return name; } public String getColumn() { return column; } public abstract String getExpression(SqlQuery query); public abstract String getGenericExpression(); public abstract String getTableAlias(); Alias of the table which contains this column. Not required if the query only has one table. Name of the column. A collection of SQL expressions, one per dialect. A role defines an access-control profile. It has a series of grants (or denials) for schema elements. Contains values of user-defined properties. Values correspond to Access. all custom none all_dimensions Grants (or denies) this role access to this schema. access may be "all", "all_dimensions", "custom" or "none". If access is "all_dimensions", the role has access to all dimensions but still needs explicit access to cubes. If access is "custom", no access will be inherited by cubes for which no explicit rule is set. If access is "all_dimensions", an implicut access is given to all dimensions of the schema's cubes, provided the cube's access attribute is either "custom" or "all". See mondrian.olap.Role#grant(mondrian.olap.Schema,int). Grants (or denies) this role access to a cube. access may be "all", "custom", or "none". If access is "custom", no access will be inherited by the dimensions of this cube, unless the parent SchemaGrant is set to "ALL_DIMENSIONS". See mondrian.olap.Role#grant(mondrian.olap.Cube,int). The unique name of the cube Grants (or denies) this role access to a dimension. access may be "all", "custom" or "none". Note that a role is implicitly given access to a dimension when it is given "ALL" acess to a cube. If access is "custom", no access will be inherited by the hierarchies of this dimension. If the parent schema access is "ALL_DIMENSIONS", this timension will inherit access "ALL". See also the "all_dimensions" option of the "SchemaGrant" element. See mondrian.olap.Role#grant(mondrian.olap.Dimension,int). The unique name of the dimension Grants (or denies) this role access to a hierarchy. access may be "all", "custom" or "none". If access is "custom", you may also specify the attributes topLevel, bottomLevel, and the member grants. If access is "custom", the child levels of this hierarchy will not inherit access rights from this hierarchy, should there be no explicit rules defined for the said child level. See mondrian.olap.Role#grant(mondrian.olap.Hierarchy, int, mondrian.olap.Level). The unique name of the hierarchy Unique name of the highest level of the hierarchy from which this role is allowed to see members. May only be specified if the HierarchyGrant.access is "custom". If not specified, role can see members up to the top level. Unique name of the lowest level of the hierarchy from which this role is allowed to see members. May only be specified if the HierarchyGrant.access is "custom". If not specified, role can see members down to the leaf level. Policy which determines how cell values are calculated if not all of the children of the current cell are visible to the current role. Allowable values are 'full' (the default), 'partial', and 'hidden'. Grants (or denies) this role access to a member. The children of this member inherit that access. You can implicitly see a member if you can see any of its children. See mondrian.olap.Role#grant(mondrian.olap.Member,int). The unique name of the member all none Body of a Role definition which defines a Role to be the union of several Roles. The RoleUsage elements must refer to Roles that have been declared earlier in this schema file. Usage of a Role in a union Role. A UserDefinedFunction is a function which extends the MDX language. It must be implemented by a Java class which implements the interface mondrian.spi.UserDefinedFunction. Name with which the user-defined function will be referenced in MDX expressions. Name of the class which implemenets this user-defined function. Must implement the mondrian.spi.UserDefinedFunction interface. Script to implement this user-defined function.

Either the "Script" element or the "className" attribute must be specified.

A Parameter defines a schema parameter. It can be referenced from an MDX statement using the ParamRef function and, if not final, its value can be overridden. Name of this parameter. Description of this parameter. Indicates the type of this parameter: String, Numeric, Integer, Boolean, Date, Time, Timestamp, or Member. String Numeric Integer Boolean Date Time Timestamp Member If false, statement cannot change the value of this parameter; the parameter becomes effectively constant (provided that its default value expression always returns the same value). Default is true. Expression for the default value of this parameter. Holder for an array of Annotation elements User-defined property value. Name of the annotation. Script fragment to implement an SPI such as user-defined function, member formatter, cell formatter. The language of the script. Must be a supported scripting language in the current JVM. See {@link javax.script.ScriptEngineManager}. Default value is 'JavaScript'. Plugin that formats the values of cells. It must be implemented by a Java class which implements the interface mondrian.spi.CellFormatter, or by a script. Name of the class which implemenets this cell formatter. Must implement the mondrian.spi.CellFormatter interface.

Either the "Script" element or the "className" attribute must be specified.

Script to implement this cell formatter.

Either the "Script" element or the "className" attribute must be specified.

Plugin that formats members. It must be implemented by a Java class which implements the interface mondrian.spi.MemberFormatter, or by a script. Name of the class which implemenets this member formatter. Must implement the mondrian.spi.MemberFormatter interface.

Either the "Script" element or the "className" attribute must be specified.

Script to implement this member formatter.

Either the "Script" element or the "className" attribute must be specified.

Plugin that formats properties. It must be implemented by a Java class which implements the interface mondrian.spi.PropertyFormatter, or by a script. Name of the class which implemenets this property formatter. Must implement the mondrian.spi.PropertyFormatter interface.

Either the "Script" element or the "className" attribute must be specified.

Script to implement this property formatter.

Either the "Script" element or the "className" attribute must be specified.

mondrian-3.11.0.1-R/src/main/mondrian/olap/NameResolver.java000066400000000000000000000213721261646570300235020ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.olap; import org.olap4j.mdx.IdentifierNode; import org.olap4j.mdx.IdentifierSegment; import java.util.List; /** * Resolves a list of segments (a parsed identifier) to an OLAP element. */ public final class NameResolver { /** * Creates a NameResolver. */ public NameResolver() { } /** * Resolves a list of segments (a parsed identifier) to an OLAP element. * * @param parent Parent element to search in, usually a cube * @param segments Exploded compound name, such as {"Products", * "Product Department", "Produce"} * @param failIfNotFound If the element is not found, determines whether * to return null or throw an error * @param category Type of returned element, a {@link Category} value; * {@link Category#Unknown} if it doesn't matter. * @param matchType Match type * @param namespaces Namespaces wherein to find child element at each step * @return OLAP element with given name, or null if not found */ public OlapElement resolve( OlapElement parent, List segments, boolean failIfNotFound, int category, MatchType matchType, List namespaces) { OlapElement element; if (matchType == MatchType.EXACT) { element = resolveExact( parent, segments, namespaces); } else { element = resolveInexact( parent, segments, matchType, namespaces); } if (element != null) { element = nullify(category, element); } if (element == null && failIfNotFound) { throw Util.newElementNotFoundException( category, new IdentifierNode(segments)); } return element; } private OlapElement resolveInexact( OlapElement parent, List segments, MatchType matchType, List namespaces) { OlapElement element = parent; for (final IdentifierSegment segment : segments) { assert element != null; OlapElement child = null; for (Namespace namespace : namespaces) { child = namespace.lookupChild(element, segment, matchType); if (child != null) { switch (matchType) { case EXACT: case EXACT_SCHEMA: break; case BEFORE: if (!Util.matches(segment, child.getName())) { matchType = MatchType.LAST; } break; case AFTER: if (!Util.matches(segment, child.getName())) { matchType = MatchType.FIRST; } break; } break; } } if (child == null) { return null; } element = child; } return element; } // same logic as resolveInexact, pared down for common case // matchType == EXACT private OlapElement resolveExact( OlapElement parent, List segments, List namespaces) { OlapElement element = parent; for (final IdentifierSegment segment : segments) { assert element != null; OlapElement child = null; for (Namespace namespace : namespaces) { child = namespace.lookupChild(element, segment); if (child != null) { break; } } if (child == null) { return null; } element = child; } return element; } /** * Converts an element to the required type, converting if possible, * returning null if it is not of the required type and cannot be converted. * * @param category Desired category of element * @param element Element * @return Element of the desired category, or null */ private OlapElement nullify(int category, OlapElement element) { switch (category) { case Category.Unknown: return element; case Category.Member: return element instanceof Member ? element : null; case Category.Level: return element instanceof Level ? element : null; case Category.Hierarchy: if (element instanceof Hierarchy) { return element; } else if (element instanceof Dimension) { final Dimension dimension = (Dimension) element; final Hierarchy[] hierarchies = dimension.getHierarchies(); if (hierarchies.length == 1) { return hierarchies[0]; } return null; } else { return null; } case Category.Dimension: return element instanceof Dimension ? element : null; case Category.Set: return element instanceof NamedSet ? element : null; default: throw Util.newInternal("unexpected: " + category); } } /** * Returns whether a formula (representing a calculated member or named * set) matches a given parent and name segment. * * @param formula Formula * @param parent Parent element * @param segment Name segment * @return Whether formula matches */ public static boolean matches( Formula formula, OlapElement parent, IdentifierSegment segment) { if (!Util.matches(segment, formula.getName())) { return false; } if (formula.isMember()) { final Member formulaMember = formula.getMdxMember(); if (formulaMember.getParentMember() != null) { if (parent instanceof Member) { // SSAS matches calc members very loosely. For example, // [Foo].[Z] will match calc member [Foo].[X].[Y].[Z]. return formulaMember.getParentMember().isChildOrEqualTo( (Member) parent); } else if (parent instanceof Hierarchy) { return formulaMember.getParentMember().getHierarchy() .equals(parent); } else { return parent.getUniqueName().equals( formulaMember.getParentMember().getUniqueName()); } } else { // If parent is not a member, member must be a root member. return parent.equals(formulaMember.getHierarchy()) || parent.equals(formulaMember.getDimension()); } } else { return parent instanceof Cube; } } /** * Naming context within which elements are defined. * *

Elements' names are hierarchical, so elements are resolved one * name segment at a time. It is possible for an element to be defined * in a different namespace than its parent: for example, stored member * [Dim].[Hier].[X].[Y] might have a child [Dim].[Hier].[X].[Y].[Z] which * is a calculated member defined using a WITH MEMBER clause.

*/ public interface Namespace { /** * Looks up a child element, using a match type for inexact matching. * *

If {@code matchType} is {@link MatchType#EXACT}, effect is * identical to calling * {@link #lookupChild(OlapElement, org.olap4j.mdx.IdentifierSegment)}.

* *

Match type is ignored except when searching for members.

* * @param parent Parent element * @param segment Name segment * @param matchType Match type * @return Olap element, or null */ OlapElement lookupChild( OlapElement parent, IdentifierSegment segment, MatchType matchType); /** * Looks up a child element. * * @param parent Parent element * @param segment Name segment * @return Olap element, or null */ OlapElement lookupChild( OlapElement parent, IdentifierSegment segment); } } // End NameResolver.java mondrian-3.11.0.1-R/src/main/mondrian/olap/NamedSet.java000066400000000000000000000034771261646570300226060ustar00rootroot00000000000000/* // This software is subject to the terms of the Eclipse Public License v1.0 // Agreement, available at the following URL: // http://www.eclipse.org/legal/epl-v10.html. // You must accept the terms of that agreement to use this software. // // Copyright (C) 2000-2005 Julian Hyde // Copyright (C) 2005-2006 Pentaho and others // All Rights Reserved. */ package mondrian.olap; import mondrian.olap.type.Type; /** * A named set of members or tuples. * *

A set can be defined in a query, using a WITH SET clause, * or in a schema. Named sets in a schema can be defined against a particular * cube or virtual cube, or shared between all cubes.

* * @author jhyde * @since 6 August, 2001 */ public interface NamedSet extends OlapElement, Annotated { /** * Sets the name of this named set. */ void setName(String newName); /** * Returns the type of this named set. */ Type getType(); /** * Returns the expression used to derive this named set. */ Exp getExp(); NamedSet validate(Validator validator); /** * Returns a name for this set that is unique within the query. * *

This is necessary when there are several 'AS' expressions, or an 'AS' * expression overrides a named set defined using 'WITH MEMBER' clause or * against a cube. */ String getNameUniqueWithinQuery(); /** * Returns whether this named set is dynamic. * *

Evaluation rules: *

    *
  • A dynamic set is evaluated each time it is used, and inherits the * context in which it is evaluated. *
  • A static set is evaluated only on first use, in the base context of * the cube. *
* * @return Whether this named set is dynamic */ boolean isDynamic(); } // End NamedSet.java mondrian-3.11.0.1-R/src/main/mondrian/olap/Namer.java000066400000000000000000000010711261646570300221340ustar00rootroot00000000000000/* // This software is subject to the terms of the Eclipse Public License v1.0 // Agreement, available at the following URL: // http://www.eclipse.org/legal/epl-v10.html. // You must accept the terms of that agreement to use this software. // // Copyright (C) 2000-2005 Julian Hyde // Copyright (C) 2005-2005 Pentaho and others // All Rights Reserved. */ package mondrian.olap; /** * Namer contains the methods to retrieve localized attributes */ public interface Namer { public String getLocalResource(String uName, String defaultValue); } // End Namer.java mondrian-3.11.0.1-R/src/main/mondrian/olap/NativeEvaluationUnsupportedException.java000066400000000000000000000016501261646570300305030ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.olap; /** * Exception which indicates that native evaluation of a function * was enabled but not supported, and * {@link MondrianProperties#AlertNativeEvaluationUnsupported} was * set to ERROR. * * @author John Sichi */ public class NativeEvaluationUnsupportedException extends ResultLimitExceededException { /** * Creates a NativeEvaluationUnsupportedException. * * @param message Localized error message */ public NativeEvaluationUnsupportedException(String message) { super(message); } } // End NativeEvaluationUnsupportedException.java mondrian-3.11.0.1-R/src/main/mondrian/olap/NativeEvaluator.java000066400000000000000000000011161261646570300242030ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.olap; import mondrian.calc.ResultStyle; /** * Allows expressions to be evaluated native, e.g. in SQL. * * @author av * @since Nov 11, 2005 */ public interface NativeEvaluator { Object execute(ResultStyle resultStyle); } // End NativeEvaluator.java mondrian-3.11.0.1-R/src/main/mondrian/olap/OlapElement.java000066400000000000000000000051731261646570300233060ustar00rootroot00000000000000/* // This software is subject to the terms of the Eclipse Public License v1.0 // Agreement, available at the following URL: // http://www.eclipse.org/legal/epl-v10.html. // You must accept the terms of that agreement to use this software. // // Copyright (C) 1998-2005 Julian Hyde // Copyright (C) 2005-2011 Pentaho and others // All Rights Reserved. */ package mondrian.olap; import java.util.Locale; /** * An OlapElement is a catalog object (dimension, hierarchy, * level, member). * * @author jhyde, 21 January, 1999 */ public interface OlapElement { String getUniqueName(); String getName(); String getDescription(); /** * Looks up a child element, returning null if it does not exist. */ OlapElement lookupChild( SchemaReader schemaReader, Id.Segment s, MatchType matchType); /** * Returns the name of this element qualified by its class, for example * "hierarchy 'Customers'". */ String getQualifiedName(); String getCaption(); /** * Returns the value of a property (caption or description) of * this element in the given locale. * * @param locale Locale * @return Localized caption or description */ String getLocalized(LocalizedProperty prop, Locale locale); Hierarchy getHierarchy(); /** * Returns the dimension of a this expression, or null if no dimension is * defined. Applicable only to set expressions. * *

Example 1: *

     * [Sales].children
     * 
* has dimension [Sales].

* *

Example 2: *

     * order(except([Promotion Media].[Media Type].members,
     *              {[Promotion Media].[Media Type].[No Media]}),
     *       [Measures].[Unit Sales], DESC)
     * 
* has dimension [Promotion Media].

* *

Example 3: *

     * CrossJoin([Product].[Product Department].members,
     *           [Gender].members)
     * 
* has no dimension (well, actually it is [Product] x [Gender], but we * can't represent that, so we return null);

*/ Dimension getDimension(); /** * Returns whether this element is visible to end-users. * *

Visibility is a hint for client applications. An element's visibility * does not affect how it is treated when MDX queries are evaluated. * * @return Whether this element is visible */ boolean isVisible(); enum LocalizedProperty { CAPTION, DESCRIPTION } } // End OlapElement.java mondrian-3.11.0.1-R/src/main/mondrian/olap/OlapElementBase.java000066400000000000000000000073751261646570300241070ustar00rootroot00000000000000/* // This software is subject to the terms of the Eclipse Public License v1.0 // Agreement, available at the following URL: // http://www.eclipse.org/legal/epl-v10.html. // You must accept the terms of that agreement to use this software. // // Copyright (C) 2001-2005 Julian Hyde // Copyright (C) 2005-2011 Pentaho and others // All Rights Reserved. */ package mondrian.olap; import org.apache.log4j.Logger; import java.util.Locale; import java.util.Map; /** * OlapElementBase is an abstract base class for implementations of * {@link OlapElement}. * * @author jhyde * @since 6 August, 2001 */ public abstract class OlapElementBase implements OlapElement { protected String caption = null; protected boolean visible = true; // cache hash-code because it is often used and elements are immutable private int hash; protected OlapElementBase() { } protected abstract Logger getLogger(); public boolean equals(Object o) { return (o == this) || ((o instanceof OlapElement) && equals((OlapElement) o)); } public boolean equals(OlapElement mdxElement) { return mdxElement != null && getClass() == mdxElement.getClass() && getUniqueName().equalsIgnoreCase(mdxElement.getUniqueName()); } public int hashCode() { if (hash == 0) { hash = computeHashCode(); } return hash; } /** * Computes this object's hash code. Called at most once. * * @return hash code */ protected int computeHashCode() { return (getClass().hashCode() << 8) ^ getUniqueName().hashCode(); } public String toString() { return getUniqueName(); } public Object clone() { return this; } /** * Returns the display name of this catalog element. * If no caption is defined, the name is returned. */ public String getCaption() { if (caption != null) { return caption; } else { return getName(); } } /** * Sets the display name of this catalog element. */ public void setCaption(String caption) { this.caption = caption; } public boolean isVisible() { return visible; } public String getLocalized(LocalizedProperty prop, Locale locale) { if (this instanceof Annotated) { Annotated annotated = (Annotated) this; final Map annotationMap = annotated.getAnnotationMap(); if (!annotationMap.isEmpty()) { String seek = prop.name().toLowerCase() + "." + locale; for (;;) { for (Map.Entry entry : annotationMap.entrySet()) { if (entry.getKey().startsWith(seek)) { return entry.getValue().getValue().toString(); } } // No match for locale. Is there a match for the parent // locale? For example, we've just looked for // 'caption.en_US', now look for 'caption.en'. final int underscore = seek.lastIndexOf('_'); if (underscore < 0) { break; } seek = seek.substring(0, underscore - 1); } } } // No annotation. Fall back to the default caption/description. switch (prop) { case CAPTION: return getCaption(); case DESCRIPTION: return getDescription(); default: throw Util.unexpected(prop); } } } // End OlapElementBase.java mondrian-3.11.0.1-R/src/main/mondrian/olap/Parameter.java000066400000000000000000000056601261646570300230220ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.olap; import mondrian.olap.type.Type; /** * Parameter to a Query. * *

A parameter is not an expression; see {@link mondrian.mdx.ParameterExpr}. * * @author jhyde * @since Jul 22, 2006 */ public interface Parameter { /** * Returns the scope where this parameter is defined. * * @return Scope of the parameter */ Scope getScope(); /** * Returns the type of this Parameter. * * @return Type of the parameter */ Type getType(); /** * Returns the expression which provides the default value for this * Parameter. Never null. * * @return Default value expression of the parameter */ Exp getDefaultExp(); /** * Returns the name of this Parameter. * * @return Name of the parameter */ String getName(); /** * Returns the description of this Parameter. * * @return Description of the parameter */ String getDescription(); /** * Returns whether the value of this Parameter can be modified in a query. * * @return Whether parameter is modifiable */ boolean isModifiable(); /** * Returns the value of this parameter. * *

If {@link #setValue(Object)} has not been called, returns the default * value of this parameter. * *

The type of the value is (depending on the type of the parameter) * a {@link String}, {@link Number}, or {@link Member}. * * @return The value of this parameter */ Object getValue(); /** * Sets the value of this parameter. * * @param value Value of the parameter; must be a {@link String}, * a {@link Double}, or a {@link mondrian.olap.Member} */ void setValue(Object value); /** * Returns whether the value of this parameter has been set. * *

If the value has not been set, this parameter will return its default * value. * *

Setting a parameter to {@code null} is not equivalent to unsetting it. * To unset a parameter, call {@link #unsetValue}. * * @return Whether this parameter has been assigned a value */ boolean isSet(); /** * Unsets the value of this parameter. * *

After calling this method, the parameter will revert to its default * value, as if {@link #setValue(Object)} had not been called, and * {@link #isSet()} will return {@code false}. */ void unsetValue(); /** * Scope where a parameter is defined. */ enum Scope { System, Schema, Connection, Statement } } // End Parameter.java mondrian-3.11.0.1-R/src/main/mondrian/olap/ParameterImpl.java000066400000000000000000000204631261646570300236420ustar00rootroot00000000000000/* // This software is subject to the terms of the Eclipse Public License v1.0 // Agreement, available at the following URL: // http://www.eclipse.org/legal/epl-v10.html. // You must accept the terms of that agreement to use this software. // // Copyright (C) 2000-2005 Julian Hyde // Copyright (C) 2005-2011 Pentaho and others // All Rights Reserved. */ package mondrian.olap; import mondrian.calc.*; import mondrian.calc.impl.AbstractListCalc; import mondrian.calc.impl.GenericCalc; import mondrian.mdx.MemberExpr; import mondrian.olap.type.*; import java.util.List; /** * Implementation of {@link Parameter}. * * @author jhyde * @since Jul 22, 2006 */ public class ParameterImpl implements Parameter, ParameterCompilable { private final String name; private String description; private Exp defaultExp; private Type type; private ParameterSlot slot = new ParameterSlot() { Object value; boolean assigned; public Object getCachedDefaultValue() { throw new UnsupportedOperationException(); } public Calc getDefaultValueCalc() { throw new UnsupportedOperationException(); } public int getIndex() { throw new UnsupportedOperationException(); } public Parameter getParameter() { return ParameterImpl.this; } public Object getParameterValue() { return value; } public boolean isParameterSet() { return assigned; } public void unsetParameterValue() { this.assigned = false; this.value = null; } public void setCachedDefaultValue(Object value) { throw new UnsupportedOperationException(); } public void setParameterValue(Object value, boolean assigned) { this.assigned = true; this.value = value; // make sure caller called convert first assert !(value instanceof List && !(value instanceof TupleList)); assert !(value instanceof MemberExpr); assert !(value instanceof Literal); } }; public ParameterImpl( String name, Exp defaultExp, String description, Type type) { this.name = name; this.defaultExp = defaultExp; this.description = description; this.type = type; assert defaultExp != null; assert type instanceof StringType || type instanceof NumericType || type instanceof MemberType; } public Scope getScope() { return Scope.Statement; } public Type getType() { return type; } public Exp getDefaultExp() { return defaultExp; } public String getName() { return name; } public Object getValue() { if (slot == null) { // query has not been resolved yet, so it's not possible for the // parameter to have a value return null; } else { final Object value = slot.getParameterValue(); return convertBack(value); } } public void setValue(Object value) { slot.setParameterValue(convert(value), true); } public boolean isSet() { return slot != null && slot.isParameterSet(); } public void unsetValue() { slot.unsetParameterValue(); } public String getDescription() { return description; } // For the purposes of type inference and expression substitution, a // parameter is atomic; therefore, we ignore the child member, if any. public Object[] getChildren() { return null; } /** * Returns whether this parameter is equal to another, based upon name, * type and value */ public boolean equals(Object other) { if (!(other instanceof ParameterImpl)) { return false; } ParameterImpl that = (ParameterImpl) other; return that.getName().equals(this.getName()) && that.defaultExp.equals(this.defaultExp); } public int hashCode() { return Util.hash(getName().hashCode(), defaultExp.hashCode()); } /** * Returns whether the parameter can be modified. */ public boolean isModifiable() { return true; } public void setDescription(String description) { this.description = description; } public void setType(Type type) { assert type instanceof StringType || type instanceof NumericType || type instanceof MemberType || (type instanceof SetType && ((SetType) type).getElementType() instanceof MemberType) : type; this.type = type; } public void setDefaultExp(Exp defaultExp) { assert defaultExp != null; this.defaultExp = defaultExp; } public Calc compile(ExpCompiler compiler) { final ParameterSlot slot = compiler.registerParameter(this); if (this.slot != null) { // save previous value if (this.slot.isParameterSet()) { slot.setParameterValue( this.slot.getParameterValue(), true); } } this.slot = slot; if (type instanceof SetType) { return new MemberListParameterCalc(slot); } else { return new ParameterCalc(slot); } } protected Object convert(Object value) { // Convert from old-style tuple list (list of member or member[]) // to new-style list (TupleList). if (value instanceof List && !(value instanceof TupleList)) { List list = (List) value; return TupleCollections.asTupleList(list); } if (value instanceof MemberExpr) { return ((MemberExpr) value).getMember(); } if (value instanceof Literal) { return ((Literal) value).getValue(); } return value; } public static Object convertBack(Object value) { if (value instanceof TupleList) { TupleList tupleList = (TupleList) value; if (tupleList.getArity() == 1) { return tupleList.slice(0); } else { return TupleCollections.asMemberArrayList(tupleList); } } return value; } /** * Compiled expression which yields the value of a scalar, member, level, * hierarchy or dimension parameter. * *

It uses a slot which has a unique id within the execution environment. * * @see MemberListParameterCalc */ private static class ParameterCalc extends GenericCalc { private final ParameterSlot slot; /** * Creates a ParameterCalc. * * @param slot Slot */ public ParameterCalc(ParameterSlot slot) { super(new DummyExp(slot.getParameter().getType()), new Calc[0]); this.slot = slot; } public Object evaluate(Evaluator evaluator) { Object value = evaluator.getParameterValue(slot); if (!slot.isParameterSet()) { // save value if not set (setting the default value) slot.setParameterValue(value, false); } return value; } } /** * Compiled expression which yields the value of parameter whose type is * a list of members. * *

It uses a slot which has a unique id within the execution environment. * * @see ParameterCalc */ private static class MemberListParameterCalc extends AbstractListCalc { private final ParameterSlot slot; /** * Creates a MemberListParameterCalc. * * @param slot Slot */ public MemberListParameterCalc(ParameterSlot slot) { super(new DummyExp(slot.getParameter().getType()), new Calc[0]); this.slot = slot; } public TupleList evaluateList(Evaluator evaluator) { TupleList value = (TupleList) evaluator.getParameterValue(slot); if (!slot.isParameterSet()) { // save value if not set (setting the default value) slot.setParameterValue(value, false); } return value; } } } // End ParameterImpl.java mondrian-3.11.0.1-R/src/main/mondrian/olap/Parser.cup000066400000000000000000001536201261646570300222040ustar00rootroot00000000000000/* // This software is subject to the terms of the Eclipse Public License v1.0 // Agreement, available at the following URL: // http://www.eclipse.org/legal/epl-v10.html. // You must accept the terms of that agreement to use this software. // // Copyright (C) 1999-2005 Julian Hyde // Copyright (C) 2005-2011 Pentaho and others // All Rights Reserved. // // Grammar condensed from OLE DB reference // (http://www.microsoft.com/data/reference/oledb2.htm) by jhyde on 990120. */ import java_cup.runtime.*; import java.util.*; import java.math.BigDecimal; import mondrian.mdx.*; import mondrian.parser.MdxParserValidator; import mondrian.resource.MondrianResource; import mondrian.server.Statement; // Preliminaries to set up and use the scanner. // action code {: ... :}; parser code {: // Generated from Parser.cup. private Scanner scanner; private String queryString; Statement statement; private FunTable funTable; boolean strictValidation; MdxParserValidator.QueryPartFactory factory; /** * Recursively parses an expression. */ Exp recursivelyParseExp(String s) { return new Parser().parseExpression( factory, statement, s, false, funTable); } /** * Parses a string to create a {@link Query}. * Called only by {@link ConnectionBase#parseQuery}. */ public QueryPart parseInternal( MdxParserValidator.QueryPartFactory factory, Statement statement, String queryString, boolean debug, FunTable funTable, boolean strictValidation) { Symbol parse_tree; this.factory = factory; this.scanner = new StringScanner(queryString, debug); this.statement = statement; this.queryString = queryString; this.funTable = funTable; this.strictValidation = strictValidation; try { if (debug) { parse_tree = debug_parse(); } else { parse_tree = parse(); } return (QueryPart) parse_tree.value; } catch (Exception e) { // "Error while parsing MDX statement '%1'" throw MondrianResource.instance().WhileParsingMdx.ex( queryString, e); } finally { this.scanner = null; this.statement = null; this.queryString = null; this.funTable = null; } } /** * Parses a string to create an {@link Exp}. * Called only by {@link ConnectionBase#parseExpression}. */ public Exp parseExpression( MdxParserValidator.QueryPartFactory factory, Statement statement, String queryString, boolean debug, FunTable funTable) { this.factory = factory; Symbol parse_tree = null; this.scanner = new PrefixScanner( debug, new StringScanner(queryString, debug), new int[] {ParserSym._VALUE_EXPRESSION}); this.statement = statement; this.queryString = queryString; this.funTable = funTable; try { if (debug) { parse_tree = debug_parse(); } else { parse_tree = parse(); } return (Exp) parse_tree.value; } catch (Exception e) { // "Syntax error while parsing MDX expression '%1'" throw MondrianResource.instance().WhileParsingMdxExpression.ex( queryString, e); } finally { this.scanner = null; this.statement = null; this.queryString = null; this.funTable = null; } } /** * Scanner which returns a list of pre-programmed tokens, then switches * to a parent scanner. */ private static class PrefixScanner extends Scanner { private final Scanner parent; private final int tokens[]; private int i; PrefixScanner(boolean debug, Scanner parent, int[] tokens) { super(debug); this.parent = parent; this.tokens = tokens; } public void init() throws java.io.IOException { i = 0; parent.init(); } public Symbol next_token() throws java.io.IOException { if (i < tokens.length) { return new Symbol(tokens[i++], 0, 0, null); } return parent.next_token(); } void getLocation(Symbol symbol, int[] loc) { parent.getLocation(symbol, loc); } } public static class FactoryImpl implements MdxParserValidator.QueryPartFactory { public Query makeQuery( Statement statement, Formula[] formulae, QueryAxis[] axes, String cube, Exp slicer, QueryPart[] cellProps, boolean strictValidation) { final QueryAxis slicerAxis = slicer == null ? null : new QueryAxis( false, slicer, AxisOrdinal.StandardAxisOrdinal.SLICER, QueryAxis.SubtotalVisibility.Undefined, new Id[0]); return new Query( statement, formulae, axes, cube, slicerAxis, cellProps, strictValidation); } public DrillThrough makeDrillThrough( Query query, int maxRowCount, int firstRowOrdinal, List returnList) { return new DrillThrough( query, maxRowCount, firstRowOrdinal, returnList); } /** * Creates an {@link Explain} object. */ public Explain makeExplain( QueryPart query) { return new Explain(query); } } // Override lr_parser methods for NLS. With this error handling scheme, // all errors are fatal. public void report_fatal_error( String message, Object info) throws java.lang.Exception { done_parsing(); try { report_error(message, info); } catch (Throwable e) { // "MDX parser cannot recover from previous error(s)" throw MondrianResource.instance().MdxFatalError.ex(e); } } // override lr_parser method public void report_error(String message, Object info) { // "Error: %1" throw MondrianResource.instance().MdxError.ex(message); } // override lr_parser method public void syntax_error(Symbol cur_token) { String s = cur_token.value.toString(); if (cur_token.left != -1) { int loc[] = new int[2]; scanner.getLocation(cur_token, loc); // "Syntax error at line %2, column %3, token '%1'" throw MondrianResource.instance().MdxSyntaxErrorAt.ex( s, Integer.toString(loc[0] + 1), Integer.toString(loc[1] + 1)); } else { // "Syntax error at token '%1'" throw MondrianResource.instance().MdxSyntaxError.ex(s); } } public void unrecovered_syntax_error(Symbol cur_token) throws java.lang.Exception { // "Couldn't repair and continue parse" String sFatalSyntaxError = MondrianResource.instance().MdxFatalSyntaxError.str(); report_fatal_error(sFatalSyntaxError, cur_token); } /** * Returns whether the given identifier can possibly the name of an operator * with property syntax. * *

For example, isFunCall("ORDINAL") * returns true because there is a "<Level>.Ordinal" property.

*/ protected boolean isFunCall(String s) { return funTable.isProperty(s); } static Id[] toIdArray(List idList) { if (idList == null || idList.size() == 0) { return EmptyIdArray; } else { return idList.toArray(new Id[idList.size()]); } } static Exp[] toExpArray(List expList) { if (expList == null || expList.size() == 0) { return EmptyExpArray; } else { return expList.toArray(new Exp[expList.size()]); } } static Formula[] toFormulaArray(List formulaList) { if (formulaList == null || formulaList.size() == 0) { return EmptyFormulaArray; } else { return formulaList.toArray(new Formula[formulaList.size()]); } } static MemberProperty[] toMemberPropertyArray(List mpList) { if (mpList == null || mpList.size() == 0) { return EmptyMemberPropertyArray; } else { return mpList.toArray(new MemberProperty[mpList.size()]); } } static QueryPart[] toQueryPartArray(List qpList) { if (qpList == null || qpList.size() == 0) { return EmptyQueryPartArray; } else { return qpList.toArray(new QueryPart[qpList.size()]); } } static QueryAxis[] toQueryAxisArray(List qpList) { if (qpList == null || qpList.size() == 0) { return EmptyQueryAxisArray; } else { return qpList.toArray(new QueryAxis[qpList.size()]); } } private static final MemberProperty[] EmptyMemberPropertyArray = new MemberProperty[0]; private static final Exp[] EmptyExpArray = new Exp[0]; private static final Formula[] EmptyFormulaArray = new Formula[0]; private static final Id[] EmptyIdArray = new Id[0]; private static final QueryPart[] EmptyQueryPartArray = new QueryPart[0]; private static final QueryAxis[] EmptyQueryAxisArray = new QueryAxis[0]; :}; init with {: scanner.init(); :}; scan with {: return scanner.next_token(); :}; // Terminals (tokens returned by the scanner). // a. Keywords. terminal AND, AS, AXIS, CASE, CAST, CELL, CHAPTERS, COLUMNS, DIMENSION, DRILLTHROUGH, ELSE, EMPTY, END, EXPLAIN, FIRSTROWSET, FOR, FROM, IN, IS, MATCHES, MAXROWS, MEMBER, NON, NOT, NULL, ON, OR, PAGES, PLAN, PROPERTIES, RETURN, ROWS, SECTIONS, SELECT, SET, THEN, WHEN, WHERE, XOR, WITH, _VALUE_EXPRESSION; // b. Symbols terminal ASTERISK, // * BANG, // ! COLON, // : COMMA, // , CONCAT, // || DOT, // . EQ, // = GE, // >= GT, // > LBRACE, // { LE, // <= LPAREN, // ( LT, // < MINUS, // - NE, // <> PLUS, // + RBRACE, // } RPAREN, //) SOLIDUS; // / // c. Typed terminals terminal BigDecimal NUMBER; terminal String ID; terminal String QUOTED_ID; terminal String AMP_QUOTED_ID; terminal String STRING; terminal String FORMULA_STRING; terminal String UNKNOWN; // a token the lexer doesn't like! // Non terminals non terminal QueryAxis axis_specification; non terminal UnresolvedFunCall aliasedExpression; non terminal Exp case_expression, else_clause_opt, expression, expression_or_empty, factor, slicer_specification, term, term2, term3, term4, term5, return_item, value_expression, value_expression_opt, value_expression_primary, where_clause_opt; non terminal Query select_statement; non terminal QueryPart statement, select_or_drillthrough_statement, drillthrough_statement, explain_statement; non terminal Id bang_compound_id, cell_property, compound_id, cube_name, cube_specification, member_name, set_name; non terminal AxisOrdinal.StandardAxisOrdinal axis_name; non terminal String comp_op, keyword; non terminal Id.NameSegment identifier, quoted_identifier, unquoted_identifier, amp_quoted_identifier; non terminal Formula member_specification, set_specification, single_formula_specification; non terminal MemberProperty member_property_definition; non terminal cell_opt, dimension_opt, property; non terminal Boolean non_empty_opt; non terminal List axis_specification_list, axis_specification_list_opt, cell_props, cell_props_opt, comma_member_property_def_list_opt, dim_props, dim_props_opt, exp_list, exp_list_opt, formula_specification, member_property_def_list, property_list, cell_property_list, return_opt, return_item_list, when_list, with_formula_specification_opt; non terminal Exp[] when_clause; non terminal BigDecimal axis_number; non terminal Number maxrows_opt, firstrowset_opt; // Start symbol start with statement; // ---------------------------------------------------------------------------- // Elements // // // ::= | quoted_identifier ::= QUOTED_ID:i {: RESULT = new Id.NameSegment(i, Id.Quoting.QUOTED); :} ; amp_quoted_identifier ::= AMP_QUOTED_ID:i {: RESULT = new Id.NameSegment(i, Id.Quoting.KEY); // yuck :} ; unquoted_identifier ::= ID:i {: RESULT = new Id.NameSegment(i, Id.Quoting.UNQUOTED); :} | keyword:i {: RESULT = new Id.NameSegment(i, Id.Quoting.UNQUOTED); :} ; identifier ::= unquoted_identifier | quoted_identifier ; // a keyword (unlike a reserved word) can be converted back into an // identifier in some contexts keyword ::= DIMENSION {: RESULT = "Dimension"; :} | PROPERTIES {: RESULT = "Properties"; :} ; compound_id ::= identifier:i {: RESULT = new Id(i); :} | compound_id:hd DOT identifier:tl {: RESULT = hd.append(tl); :} ; bang_compound_id ::= identifier:i {: RESULT = new Id(i); :} | bang_compound_id:hd BANG identifier:tl {: RESULT = hd.append(tl); :} ; // // ::= [{ | // | }...] // // ::= // { | } // [{ | }...] // // // ::= // // ::= // // ::= end_delimiter> // // ::= !! // // ::= [ [ [ ] ] [].] // cube_name ::= compound_id ; // // ::= // // ::= // // ::= // // ::= [.] // | [[.]< dimension_name>.] // // jhyde: Need more lookahead for this to work... just use id in place of // dim_hier. // dim_hier ::= id; // // ::= // | .DIMENSION // | .DIMENSION // | .DIMENSION // // ::= // | < member>.HIERARCHY // | .HIERARCHY // // ::= [.]< identifier> // | .LEVELS() // | .LEVEL // // Note: The first production is for the case when named levels are // supported. The second production is for the case when named levels are not // supported. // // // ::= [.] // | . // | . // | // // Note: The . recognizes the fact that members may // sometimes need to be qualified by their parent names. For example, // "Portland" is a city in Oregon, and also in Maine. So a reference to // Portland will be either Oregon.Portland or Maine.Portland. // // // ::= | // // ::= CATALOG_NAME // | SCHEMA_NAME // | CUBE_NAME // | DIMENSION_UNIQUE_NAME // | HIERARCHY_UNIQUE_NAME // | LEVEL_UNIQUE_NAME // | LEVEL_NUMBER // | MEMBER_UNIQUE_NAME // | MEMBER_NAME // | MEMBER_TYPE // | MEMBER_GUID // | MEMBER_CAPTION // | MEMBER_ORDINAL // | CHILDREN_CARDINALITY // | PARENT_LEVEL // | PARENT_UNIQUE_NAME // | PARENT_COUNT // | DESCRIPTION // // ::= . // | . // | . // // Note: The three productions recognize the fact that a property can apply to // all the members of a dimension, or all the members of a level, or just to a // member. // // // ::= // | ( [, ...]) // | // // Note: Each member must be from a different dimension or from a different // hierarchy. // // // ::= : // // Note: Each member must be from the same hierarchy and the same level. // // // | // | [| [, |...]] // // Note: Duplicates (if any) are always retained when specifying sets in this // fashion. // // // | () // // ::= { // // ::= } // // ::= [ // // ::= ] // // ::= _ // // ::= a | b | c | ...| z | A | B | C | ... | Z // // ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 // // Leveling Rules for Elements // // The ability to qualify a cube name by one or more of , // , or is optional. Consumers can check the value // of the property MDPROP_MDX_OBJQUALIFICATION to see whether a provider // supports cube qualification. // // // The ability to qualify a dimension name by a cube name is // optional. Consumers can check the value of the property // MDPROP_MDX_OBJQUALIFICATION to see whether a provider supports dimension // qualification. // // // The ability to qualify a hierarchy name by a dimension name or by cube name // and dimension name is optional. Consumers can check the value of the // property MDPROP_MDX_OBJQUALIFICATION to see whether a provider supports // hierarchy qualification. // // // The provider need support only one of the two productions for . If it // supports // // ::= [.] // // then the ability to qualify by is optional. // // Consumers can check the value of the property MDPROP_NAMED_LEVELS to see if // the provider supports named levels. If it does, then the consumer can check // MDPROP_MDX_OBJQUALIFICATION to see whether named levels can be qualified by // . // // The ability to qualify a member by a level, a member, or is // optional. Consumers can check the value of the property // MDPROP_MDX_OBJQUALIFICATION to see whether a provider supports member // qualification. // // Note: Several leveling rules above make it optional to qualify // multidimensional schema object names. However, this does not imply that the // ability to generate unique names for members, levels, dimensions, and // hierarchies is optional. Providers are required to furnish unique names in // the schema rowsets for these objects. If providers generate unique names by // means other than qualification, then the ability to qualify is optional. For // more information, see 'Provider Implementation Considerations for Unique // Names' in Chapter 2. // // // ---------------------------------------------------------------------------- // // // Expressions // // Note: The syntax of is generally the same as SQL-92, // subclause 6.11, . Differences are: // // [.VALUE], [.VALUE], and are new // values for . // // // There are new values for , mainly for statistical // analysis. // // // The BNF for , , and // have been shortened by eliminating several // intermediate nonterminals. // // ::= // | // // ::= // | { | } value_expression ::= term5 | value_expression:x OR term5:y {: RESULT = new UnresolvedFunCall("OR", Syntax.Infix, new Exp[] {x, y}); :} | value_expression:x XOR term5:y {: RESULT = new UnresolvedFunCall("XOR", Syntax.Infix, new Exp[] {x, y}); :} ; term5 ::= term4 | term5:x AND term4:y {: RESULT = new UnresolvedFunCall("AND", Syntax.Infix, new Exp[] {x, y}); :} ; term4 ::= term3 | NOT term4:p {: RESULT = new UnresolvedFunCall("NOT", Syntax.Prefix, new Exp[] {p}); :} ; term3 ::= term2 | term3:x comp_op:op term2:y {: // e.g. "1 < 5" RESULT = new UnresolvedFunCall(op, Syntax.Infix, new Exp[] {x, y}); :} | // We expect a shift-reduce conflict here, because NULL is a literal and // so is a valid argument to the IS operator. JavaCUP resolves the // conflict by shifting, which is what we want. Compile with expect=61 // to ignore the conflicts and continue. term3:x IS NULL {: RESULT = new UnresolvedFunCall("IS NULL", Syntax.Postfix, new Exp[] {x}); :} | term3:x IS term2:y {: // e.g. "x IS y"; but "x IS NULL" is handled elsewhere RESULT = new UnresolvedFunCall("IS", Syntax.Infix, new Exp[] {x, y}); :} | term3:x IS EMPTY {: RESULT = new UnresolvedFunCall( "IS EMPTY", Syntax.Postfix, new Exp[] {x}); :} | term3:x MATCHES term2:y {: RESULT = new UnresolvedFunCall( "MATCHES", Syntax.Infix, new Exp[] {x, y}); :} | term3:x NOT MATCHES term2:y {: RESULT = new UnresolvedFunCall( "NOT", Syntax.Prefix, new Exp[] { new UnresolvedFunCall( "MATCHES", Syntax.Infix, new Exp[] {x, y})}); :} | term3:x IN term2:y {: RESULT = new UnresolvedFunCall("IN", Syntax.Infix, new Exp[] {x, y}); :} | term3:x NOT IN term2:y {: RESULT = new UnresolvedFunCall( "NOT", Syntax.Prefix, new Exp[] { new UnresolvedFunCall( "IN", Syntax.Infix, new Exp[] {x, y})}); :} ; term2 ::= term | term2:x PLUS term:y {: RESULT = new UnresolvedFunCall("+", Syntax.Infix, new Exp[] {x, y}); :} | term2:x MINUS term:y {: RESULT = new UnresolvedFunCall("-", Syntax.Infix, new Exp[] {x, y}); :} | term2:x CONCAT term:y {: RESULT = new UnresolvedFunCall("||", Syntax.Infix, new Exp[] {x, y}); :} ; // // ::= | { | } term ::= factor | term:x ASTERISK factor:y {: RESULT = new UnresolvedFunCall("*", Syntax.Infix, new Exp[] {x, y}); :} | term:x SOLIDUS factor:y {: RESULT = new UnresolvedFunCall("/", Syntax.Infix, new Exp[] {x, y}); :} ; // // ::= [] // factor ::= value_expression_primary | PLUS value_expression_primary:p {: RESULT = p; :} | MINUS value_expression_primary:p {: RESULT = new UnresolvedFunCall("-", Syntax.Prefix, new Exp[] {p}); :} ; // ::= + | - // // ::= + // // ::= - // // ::= * // // ::= / // // ::= // | // // Note: The data type of in the above production // shall be numeric. // // // ::= // | () // | // | [.][.VALUE] // | [.VALUE] // | value_expression_primary ::= STRING:s {: RESULT = Literal.createString(s); :} | NUMBER:d {: RESULT = Literal.create(d); :} | identifier:i {: RESULT = new Id(i); :} | value_expression_primary:i DOT unquoted_identifier:j {: if (i instanceof Id && !parser.isFunCall(j.name)) { RESULT = ((Id) i).append(j); } else { RESULT = new UnresolvedFunCall( j.name, Syntax.Property, new Exp[] {i}); } :} | value_expression_primary:i DOT quoted_identifier:j {: if (i instanceof Id) { RESULT = ((Id) i).append(j); } else { RESULT = new UnresolvedFunCall( j.name, Syntax.QuotedProperty, new Exp[] {i}); } :} | value_expression_primary:i DOT amp_quoted_identifier:j {: if (i instanceof Id) { RESULT = ((Id) i).append(j); } else { RESULT = new UnresolvedFunCall( j.name, Syntax.AmpersandQuotedProperty, new Exp[] {i}); } :} | value_expression_primary:i DOT identifier:j LPAREN exp_list_opt:lis RPAREN {: lis.add(0, i); RESULT = new UnresolvedFunCall( j.name, Syntax.Method, Parser.toExpArray(lis)); :} | bang_compound_id:i LPAREN exp_list_opt:lis RPAREN {: RESULT = new UnresolvedFunCall( ((Id.NameSegment) Util.last(i.getSegments())).name, Syntax.Function, Parser.toExpArray(lis)); :} | CAST LPAREN aliasedExpression:ae RPAREN {: assert ae.getArgCount() == 2; Exp e = ae.getArg(0); Id.NameSegment t = (Id.NameSegment) ((Id) ae.getArg(1)).getSegments().get(0); RESULT = new UnresolvedFunCall( "CAST", Syntax.Cast, new Exp[] { e, Literal.createSymbol(t.name)}); :} | LPAREN exp_list:lis RPAREN {: // Whereas ([Sales],[Time]) and () are tuples, ([Sales]) and (5) // are just expressions. RESULT = new UnresolvedFunCall( "()", Syntax.Parentheses, Parser.toExpArray(lis)); :} | LBRACE exp_list_opt:lis RBRACE {: // set built from sets/tuples RESULT = new UnresolvedFunCall( "{}", Syntax.Braces, Parser.toExpArray(lis)); :} | NULL {: RESULT = Literal.nullValue; :} | case_expression ; case_expression ::= CASE value_expression_opt:x when_list:y else_clause_opt:z END {: List v = new ArrayList(); if (x != null) { v.add(x); } for (int i = 0; i < y.size(); i++) { Exp[] exps = (Exp[]) y.get(i); Util.assertTrue(exps.length == 2); v.add(exps[0]); v.add(exps[1]); } if (z != null) { v.add(z); } if (x == null) { RESULT = new UnresolvedFunCall( "_CaseTest", Syntax.Case, Parser.toExpArray(v)); } else { RESULT = new UnresolvedFunCall( "_CaseMatch", Syntax.Case, Parser.toExpArray(v)); } :} ; value_expression_opt ::= /* empty */ | value_expression ; when_list ::= /* empty */ {: RESULT = new ArrayList(); :} | when_list:x when_clause:y {: RESULT = x; x.add(y); :} ; when_clause ::= WHEN value_expression:x THEN value_expression:y {: RESULT = new Exp[] {x, y}; :} ; else_clause_opt ::= /* empty */ | ELSE value_expression:x {: RESULT = x; :} ; // // ::= | // // ::= iif(, , ) // // ::= // // ::= // // ::= | | // // ::= CASE // ... // [] // END // // ::= CASE // ... // [] // END // // ::= WHEN THEN // // ::= WHEN THEN // // ::= ELSE // // ::= // // ::= // // ::= // // ::= COALESCEEMPTY ( // {, }...) // // ::= [] // // ::= // | // // ::= [.] // | . // | . // // ::= {}... // // ::= E // // ::= < exact_numeric_literal> // // ::= [] // // ::= // | // // // // Note: The data type of in the above production // shall be a character string. // // // ::= [...] // // // ::= | // // ::= !! // // // ::= // // ::= ' // // ::= || // // Leveling Rules for Expressions // // The following productions for are optional: // // The ability to qualify [.VALUE] by in a value expression // primary is optional. Consumers can check the value of the property // MDPROP_MDX_OUTERREFERENCE to see whether a provider supports this feature. // // // [.VALUE]. Consumers can check the value of the property // MDPROP_MDX_QUERYBYPROPERTY to see whether a provider supports this feature. // // // , . Consumers can check the value of the // property MDPROP_MDX_CASESUPPORT to see whether a provider supports this // feature. // // ---------------------------------------------------------------------------- // Search Condition // // ::= // | {OR | XOR} // // ::= | AND // // ::= [NOT] // // ::= // | ISEMPTY() // | IS EMPTY // | () // ::= // | // | // | // | // | // "IS" is not a comp_op because of conflict with " IS EMPTY" comp_op ::= EQ {: RESULT = "="; :} | NE {: RESULT = "<>"; :} | LT {: RESULT = "<"; :} | GT {: RESULT = ">"; :} | LE {: RESULT = "<="; :} | GE {: RESULT = ">="; :} ; // // ::= = // // ::= <> // // ::= > // // ::= < // // ::= >= // // ::= <= // // Leveling Rules for Search Condition // // If in a value is a string value // expression, then support for values other than // and is optional. Consumers can check the value of the // property MDPROP_MDX_STRING_COMPOP to see whether a provider supports this // feature. // ---------------------------------------------------------------------------- // Set Value Expression // // ::= // // Note: denotes an integer argument. If an arbitrary // appears here, then it is truncated to the nearest // integer. // // // ::= // // ::= .MEMBERS // | .MEMBERS // | .CHILDREN // | BOTTOMCOUNT(, // [, ]) // | BOTTOMPERCENT(, , // ) // | BOTTOMSUM(, , // ) // | CROSSJOIN(, ) // | DESCENDANTS(, [,]) // // Note: In the absence of explicit specification, SELF is the // default. // // | DISTINCT() // | DRILLDOWNLEVEL( [, ]]) // | DRILLDOWNLEVELBOTTOM(, // [,[] [, ]]) // | DRILLDOWNLEVELTOP(, [, [] // [, ]]) // | DRILLDOWNMEMBER(, [, RECURSIVE]) // | DRILLDOWNMEMBERBOTTOM(, , // [, ][, RECURSIVE]]) // | DRILLDOWNMEMBERTOP(, , // [, [][, RECURSIVE]]) // | DRILLUPLEVEL([, ]]) // | DRILLUPMEMBER(, ) // | EXCEPT(, [, ALL]) // | EXTRACT(, [, ...]) // | FILTER(, ) // | GENERATE(, [, ALL]) // | HIERARCHIZE() // | INTERSECT(, [, ALL]) // | LASTPERIODS( [, ]) // | MTD([]) // | ORDER(, // [, ASC | DESC | BASC | BDESC]) // // Note: In the absence of explicit specification, ASC is the default. // // // | PERIODSTODATE([[, ]]) // | QTD([]) // | TOGGLEDRILLSTATE(, [, RECURSIVE]) // // Note: With the exception of CROSSJOIN, all set functions that take more than // one argument require that the two set arguments have tuples of the // same dimensionality. // // // | TOPCOUNT(, // [, ]) // | TOPPERCENT(, , // ) // | TOPSUM(, , // ) // | UNION(, [, ALL]) // | WTD([]) // | YTD() // // ::= SELF // | AFTER // | BEFORE // | BEFORE_AND_AFTER // | SELF_AND_AFTER // | SELF_AND_BEFORE // | SELF_BEFORE_AFTER // // ---------------------------------------------------------------------------- // Member Value Expression // // ::= .{PARENT | FIRSTCHILD | LASTCHILD // | PREVMEMBER | NEXTMEMBER} // | .LEAD() // | .LAG() // // Note: LAG() is the same as LEAD(-) // // // | .{FIRSTSIBLING | LASTSIBLING} // | .[CURRENTMEMBER] // | .DEFAULTMEMBER // | .DEFAULTMEMBER // | ANCESTOR(, ) // | CLOSINGPERIOD([[, ]) // | COUSIN(, ) // | OPENINGPERIOD([[, ]) // | PARALLELPERIOD([[, // [, ]]]) expression ::= expression:x COLON value_expression:y {: // range yields set RESULT = new UnresolvedFunCall(":", Syntax.Infix, new Exp[] {x, y}); :} | aliasedExpression | value_expression ; expression_or_empty ::= expression | /* empty */ {: RESULT = new UnresolvedFunCall("", Syntax.Empty, new Exp[] {}); :} ; exp_list_opt ::= /* empty */ {: RESULT = new LinkedList(); :} | exp_list ; exp_list ::= expression:e {: RESULT = new LinkedList(); RESULT.add(e); :} | expression_or_empty:e COMMA exp_list:list {: list.add(0, e); RESULT = list; :} ; aliasedExpression ::= expression:x AS identifier:i {: Id id = new Id(i); RESULT = new UnresolvedFunCall("AS", Syntax.Infix, new Exp[] {x, id}); :} ; // // Leveling Rules for Member Value Expression // // The following member functions are optional: COUSIN, PARALLELPERIOD, // OPENINGPERIOD, CLOSINGPERIOD. Consumers can check the value of the property // MDPROP_MDX_MEMBER_FUNCTIONS to see whether a provider supports this feature. // // // * Tuple Value Expression // // ::= .CURRENTMEMBER // | [.ITEM]( // [, ...] | ) // // // * Numeric Value Function // // ::= // AGGREGATE( [, ]) // | AVG([, ]) // | CORRELATION( [, ] // [, ]) // | COVARIANCE([, // [, ]) // | COUNT([, INCLUDEEMPTY]) // | LINREGINTERCEPT([, // // // Leveling Rules for Numeric Value Function // // The following numeric functions are optional: MEDIAN, VAR, STDEV, RANK, // AGGREGATE, COVARIANCE, CORRELATION, LINREGSLOPE, LINREGVARIANCE, LINREGR2, // LINREGPOINT. Consumers can check the value of the property // MDPROP_MDX_NUMERIC_FUNCTIONS to see whether a provider supports this // feature. // // ---------------------------------------------------------------------------- // MDX Statement // // ::= // | // | // | // | // // ::= [WITH ] // SELECT [ // [, ...]] // FROM [] // [WHERE ] // [] // // ::= // DRILLTHROUGH // [ MAXROWS ] // [ FIRSTROWSET ] // // [ RETURN [, ...] ] // // ::= // EXPLAIN PLAN FOR // ( | ) statement ::= select_statement | drillthrough_statement | explain_statement | _VALUE_EXPRESSION expression:e {: RESULT = (QueryPart) e; :} ; select_statement ::= with_formula_specification_opt:f SELECT axis_specification_list_opt:a FROM cube_specification:c where_clause_opt:w cell_props_opt:cp {: Parser parser = (Parser) CUP$Parser$parser; // We want 'Sales', not '[Sales]', and can't handle 'Schema.Sales' // yet. String cubeName = ((Id.NameSegment) c.getElement(0)).name; RESULT = parser.factory.makeQuery( parser.statement, Parser.toFormulaArray(f), Parser.toQueryAxisArray(a), cubeName, w, Parser.toQueryPartArray(cp), parser.strictValidation); :}; with_formula_specification_opt ::= /* empty */ {: RESULT = new LinkedList(); :} | WITH formula_specification:f {: RESULT = f; :} ; axis_specification_list_opt ::= /* empty */ {: RESULT = new LinkedList(); :} | axis_specification_list ; axis_specification_list ::= axis_specification:i {: RESULT = new LinkedList(); RESULT.add(i); :} | axis_specification:e COMMA axis_specification_list:list {: list.add(0, e); RESULT = list; :} ; where_clause_opt ::= /* empty */ | WHERE slicer_specification:s {: RESULT = s; :} ; cell_props_opt ::= /* empty */ {: RESULT = new LinkedList(); :} | cell_props; // // ::= // [...] // formula_specification ::= single_formula_specification:e {: RESULT = new LinkedList(); RESULT.add(e); :} | single_formula_specification:hd formula_specification:tl {: tl.add(0, hd); RESULT = tl; :} ; // ::= // | // single_formula_specification ::= member_specification | set_specification ; // // ::= MEMBER AS // [, ] // [, ...] member_specification ::= MEMBER member_name:m AS FORMULA_STRING:s comma_member_property_def_list_opt:l {: Exp e = parser.recursivelyParseExp(s); RESULT = new Formula( m, e, Parser.toMemberPropertyArray(l)); :} | MEMBER member_name:m AS value_expression:e comma_member_property_def_list_opt:l {: RESULT = new Formula( m, e, Parser.toMemberPropertyArray(l)); :} ; comma_member_property_def_list_opt ::= /* empty */ {: RESULT = new LinkedList(); :} | COMMA member_property_def_list:l {: RESULT = l; :} ; member_property_def_list ::= member_property_definition:m {: RESULT = new LinkedList(); RESULT.add(m); :} | member_property_definition:hd COMMA member_property_def_list:tl {: RESULT = tl; RESULT.add(0, hd); :} ; // // ::= . // | .. // member_name ::= compound_id; // // Note: // // The identifier defines a new member. The qualification member has enough // information to specify the dimension, and the level in the dimension that // this new member should be on. // // // If is part of a member specification that appears in a create // formula statement or is part of a drop formula statement, then it must be // qualified by a cube name, as in the second production above. // // ::= SOLVE_ORDER = // // ::= = member_property_definition ::= identifier:id EQ value_expression:e {: RESULT = new MemberProperty(id.name, e); :} ; // // Note: Since the property definition appears in the context of a member // definition, there is enough information to associate the identifier (which // is the property name) in the above production with a member. // // // ::= SET AS set_specification ::= SET set_name:n AS FORMULA_STRING:s {: Exp e = parser.recursivelyParseExp(s); RESULT = new Formula(n, e); :} | SET set_name:n AS expression:e {: RESULT = new Formula(n, e); :} ; // // ::= | . set_name ::= compound_id ; // // Note: If is part of a set specification that appears in a create // formula statement or is part of a drop formula statement, then it must be // qualified by a cube name, as in the second production above. // // // ::= [NON EMPTY] [] ON axis_specification ::= non_empty_opt:b expression:s dim_props_opt:dp ON axis_name:a {: RESULT = new QueryAxis( b.booleanValue(), s, a, QueryAxis.SubtotalVisibility.Undefined, Parser.toIdArray(dp)); :} | non_empty_opt:b expression:s dim_props_opt:dp ON axis_number:n {: double d = n.doubleValue(); int index = n.intValue(); // AxisOrdinal values go from -2 to 4 for standard axis, but higher // ordinals are allowed. The negative values represent // special cases, so are ignored. if (index < 0 || index != d) { throw MondrianResource.instance().InvalidAxis.ex( d); } AxisOrdinal axis = AxisOrdinal.StandardAxisOrdinal.forLogicalOrdinal(index); RESULT = new QueryAxis( b.booleanValue(), s, axis, QueryAxis.SubtotalVisibility.Undefined, Parser.toIdArray(dp)); :} ; non_empty_opt ::= /* empty */ {: RESULT = Boolean.FALSE; :} | NON EMPTY {: RESULT = Boolean.TRUE; :} ; dim_props_opt ::= /* empty */ | dim_props ; // // ::= COLUMNS // | ROWS // | PAGES // | CHAPTERS // | SECTIONS // | AXIS() axis_name ::= COLUMNS {: RESULT = AxisOrdinal.StandardAxisOrdinal.COLUMNS; :} | ROWS {: RESULT = AxisOrdinal.StandardAxisOrdinal.ROWS; :} | PAGES {: RESULT = AxisOrdinal.StandardAxisOrdinal.PAGES; :} | SECTIONS {: RESULT = AxisOrdinal.StandardAxisOrdinal.SECTIONS; :} | CHAPTERS {: RESULT = AxisOrdinal.StandardAxisOrdinal.CHAPTERS; :} ; axis_number ::= NUMBER | AXIS LPAREN NUMBER:n RPAREN {: RESULT = n; :} ; // // ::= [DIMENSION] PROPERTIES [, ...] dim_props ::= dimension_opt PROPERTIES property_list:pl {: RESULT = pl; :} ; dimension_opt ::= /* empty */ | DIMENSION ; property_list ::= property:p {: RESULT = new LinkedList(); RESULT.add(p); :} | property:p COMMA property_list:pl {: pl.add(0, p); RESULT = pl; :} ; property ::= compound_id ; // // ::= [] [, ] // jhyde: In this implementation, you must supply EXACTLY one cube. cube_specification ::= cube_name; // // ::= { | } slicer_specification ::= expression; // // ::= [CELL] PROPERTIES [, ...] cell_props ::= cell_opt PROPERTIES cell_property_list:p1 {: RESULT = p1; :} ; cell_opt ::= /* empty */ | CELL ; cell_property_list ::= cell_property:p {: RESULT = new LinkedList(); RESULT.add(new CellProperty(p.getSegments())); :} | cell_property:p COMMA cell_property_list:p1 {: p1.add(0, new CellProperty(p.getSegments())); RESULT = p1; :} ; // ::= FORMAT_STRING // | FORMATTED_VALUE // | FORE_COLOR // | BACK_COLOR // | FONT_NAME // | FONT_SIZE // | FONT_FLAGS // | CELL_ORDINAL // | VALUE cell_property ::= compound_id; drillthrough_statement ::= DRILLTHROUGH maxrows_opt:m firstrowset_opt:f select_statement:s return_opt:r {: RESULT = parser.factory.makeDrillThrough( s, m == null ? 0 : m.intValue(), f == null ? 0 : f.intValue(), r); :} ; maxrows_opt ::= MAXROWS NUMBER:n {: RESULT = n; :} | {: RESULT = null; :} ; firstrowset_opt ::= FIRSTROWSET NUMBER:n {: RESULT = n; :} | {: RESULT = null; :} ; return_opt ::= RETURN return_item_list:rl {: RESULT = rl; :} | {: RESULT = null; :} ; return_item_list ::= return_item:i {: RESULT = new LinkedList(); RESULT.add(i); :} | return_item:i COMMA return_item_list:list {: list.add(0, i); RESULT = list; :} ; return_item ::= compound_id:i // TODO: allow NAME(id) etc. ; select_or_drillthrough_statement ::= select_statement | drillthrough_statement ; explain_statement ::= EXPLAIN PLAN FOR select_or_drillthrough_statement:s {: RESULT = parser.factory.makeExplain( s); :} ; // // ::= CREATE [] // // ::= // | // // ::= DROP MEMBER // [, ...] // // ::= DROP SET [, ...] // // := GLOBAL | SESSION // // Leveling Rules for MDX Statement // // Support for is optional. Consumers can check the // value of the property MDPROP_MDX_FORMULAS to see whether a provider supports // this feature. // // // Support for in is optional. Consumers can check // the value of the property MDPROP_MDX_SLICER to see whether a provider // supports this feature. // // // Support for more than one cube name in is // optional. Support for having no cube name in the FROM clause (that is, the // cube is implicitly defined by the axis and slicer dimensions) is also // optional. Consumers can check the value of the property MDPROP_MDX_JOINCUBES // to see whether a provider supports this feature. // // // The axis names CHAPTERS and SECTIONS are optional. Consumers can check the // value of the property MDPROP_AXES to see whether a provider supports this // feature. // // // Support for > 2 in the AXIS() function is optional. Consumers // can check the value of the property MDPROP_AXES to see whether a provider // supports this feature. // // // Support for is optional. Consumers can check the // value of the property MDPROP_MDX_FORMULAS to see whether a provider supports // this feature. // // // Support for of GLOBAL is optional. Consumers can check the value of // the property MDPROP_MDX_FORMULAS to see whether a provider supports this // feature. // // End Parser.cup mondrian-3.11.0.1-R/src/main/mondrian/olap/Position.java000066400000000000000000000012251261646570300226770ustar00rootroot00000000000000/* // This software is subject to the terms of the Eclipse Public License v1.0 // Agreement, available at the following URL: // http://www.eclipse.org/legal/epl-v10.html. // You must accept the terms of that agreement to use this software. // // Copyright (C) 2001-2005 Julian Hyde // Copyright (C) 2005-2007 Pentaho and others // All Rights Reserved. // // jhyde, 6 August, 2001 */ package mondrian.olap; import java.util.List; /** * A Position is an item on an {@link Axis}. It contains * one or more {@link Member}s. * * @author jhyde * @since 6 August, 2001 */ public interface Position extends List { } // End Position.java mondrian-3.11.0.1-R/src/main/mondrian/olap/Property.java000066400000000000000000001001001261646570300227070ustar00rootroot00000000000000/* // This software is subject to the terms of the Eclipse Public License v1.0 // Agreement, available at the following URL: // http://www.eclipse.org/legal/epl-v10.html. // You must accept the terms of that agreement to use this software. // // Copyright (C) 2001-2005 Julian Hyde // Copyright (C) 2005-2013 Pentaho and others // All Rights Reserved. // // jhyde, 12 September, 2002 */ package mondrian.olap; import mondrian.spi.PropertyFormatter; import java.util.*; /** * Property is the definition of a member property. * *

The following properties are mandatory for members:

    *
  • {@link #CATALOG_NAME}
  • *
  • {@link #SCHEMA_NAME}
  • *
  • {@link #CUBE_NAME}
  • *
  • {@link #DIMENSION_UNIQUE_NAME}
  • *
  • {@link #HIERARCHY_UNIQUE_NAME}
  • *
  • {@link #LEVEL_UNIQUE_NAME}
  • *
  • {@link #LEVEL_NUMBER}
  • *
  • {@link #MEMBER_UNIQUE_NAME}
  • *
  • {@link #MEMBER_NAME}
  • *
  • {@link #MEMBER_TYPE}
  • *
  • {@link #MEMBER_GUID}
  • *
  • {@link #MEMBER_CAPTION}
  • *
  • {@link #MEMBER_ORDINAL}
  • *
  • {@link #CHILDREN_CARDINALITY}
  • *
  • {@link #PARENT_LEVEL}
  • *
  • {@link #PARENT_UNIQUE_NAME}
  • *
  • {@link #PARENT_COUNT}
  • *
  • {@link #DESCRIPTION}
  • *
* * The following propertiess are mandatory for cells:
    *
  • {@link #BACK_COLOR}
  • *
  • {@link #CELL_EVALUATION_LIST}
  • *
  • {@link #CELL_ORDINAL}
  • *
  • {@link #FORE_COLOR}
  • *
  • {@link #FONT_NAME}
  • *
  • {@link #FONT_SIZE}
  • *
  • {@link #FONT_FLAGS}
  • *
  • {@link #FORMAT_STRING}
  • *
  • {@link #FORMATTED_VALUE}
  • *
  • {@link #NON_EMPTY_BEHAVIOR}
  • *
  • {@link #SOLVE_ORDER}
  • *
  • {@link #VALUE}
  • *
* * @author jhyde */ public class Property extends EnumeratedValues.BasicValue { public enum Datatype { TYPE_STRING, TYPE_NUMERIC, TYPE_BOOLEAN, TYPE_DATE, TYPE_TIME, TYPE_TIMESTAMP, TYPE_OTHER } /** * For properties which have synonyms, maps from the synonym to the * property. */ private static final Map synonyms = new HashMap(); /** * Map of upper-case names to property definitions, for case-insensitive * match. Also contains synonyms. */ public static final Map mapUpperNameToProperties = new HashMap(); public static final int FORMAT_EXP_PARSED_ORDINAL = 0; /** * Definition of the internal property which * holds the parsed format string (an object of type {@link Exp}). */ public static final Property FORMAT_EXP_PARSED = new Property( "$format_exp", Datatype.TYPE_OTHER, FORMAT_EXP_PARSED_ORDINAL, true, false, false, null); public static final int AGGREGATION_TYPE_ORDINAL = 1; /** * Definition of the internal property which * holds the aggregation type. This is automatically set for stored * measures, based upon their SQL aggregation. */ public static final Property AGGREGATION_TYPE = new Property( "$aggregation_type", Datatype.TYPE_OTHER, AGGREGATION_TYPE_ORDINAL, true, false, false, null); public static final int NAME_ORDINAL = 2; /** * Definition of the internal property which * holds a member's name. */ public static final Property NAME = new Property( "$name", Datatype.TYPE_STRING, NAME_ORDINAL, true, false, false, null); public static final int CAPTION_ORDINAL = 3; /** * Definition of the internal property which * holds a member's caption. */ public static final Property CAPTION = new Property( "$caption", Datatype.TYPE_STRING, CAPTION_ORDINAL, true, false, false, null); public static final int CONTRIBUTING_CHILDREN_ORDINAL = 4; /** * Definition of the internal property which * holds, for a member of a parent-child hierarchy, a * {@link java.util.List} containing the member's data * member and all of its children (including non-visible children). * * @deprecated Property is not used and will be removed in mondrian-4.0; * use {@link mondrian.olap.SchemaReader#getParentChildContributingChildren} */ public static final Property CONTRIBUTING_CHILDREN = new Property( "$contributingChildren", Datatype.TYPE_OTHER, CONTRIBUTING_CHILDREN_ORDINAL, true, false, false, null); public static final int FORMULA_ORDINAL = 5; /** * Definition of the internal property which * returns a calculated member's {@link Formula} object. */ public static final Property FORMULA = new Property( "$formula", Datatype.TYPE_OTHER, FORMULA_ORDINAL, true, false, false, null); public static final int MEMBER_SCOPE_ORDINAL = 6; /** * Definition of the internal property which * describes whether a calculated member belongs to a query or a cube. */ public static final Property MEMBER_SCOPE = new Property( "$member_scope", Datatype.TYPE_OTHER, MEMBER_SCOPE_ORDINAL, true, true, false, null); public static final int CATALOG_NAME_ORDINAL = 10; /** * Definition of the property which * holds the name of the current catalog. */ public static final Property CATALOG_NAME = new Property( "CATALOG_NAME", Datatype.TYPE_STRING, CATALOG_NAME_ORDINAL, false, true, false, "Optional. The name of the catalog to which this member belongs. " + "NULL if the provider does not support catalogs."); public static final int SCHEMA_NAME_ORDINAL = 11; /** * Definition of the property which * holds the name of the current schema. */ public static final Property SCHEMA_NAME = new Property( "SCHEMA_NAME", Datatype.TYPE_STRING, SCHEMA_NAME_ORDINAL, false, true, false, "Optional. The name of the schema to which this member belongs. " + "NULL if the provider does not support schemas."); public static final int CUBE_NAME_ORDINAL = 12; /** * Definition of the property which * holds the name of the current cube. */ public static final Property CUBE_NAME = new Property( "CUBE_NAME", Datatype.TYPE_STRING, CUBE_NAME_ORDINAL, false, true, false, "Required. Name of the cube to which this member belongs."); public static final int DIMENSION_UNIQUE_NAME_ORDINAL = 13; /** * Definition of the property which * holds the unique name of the current dimension. */ public static final Property DIMENSION_UNIQUE_NAME = new Property( "DIMENSION_UNIQUE_NAME", Datatype.TYPE_STRING, DIMENSION_UNIQUE_NAME_ORDINAL, false, true, false, "Required. Unique name of the dimension to which this member " + "belongs. For providers that generate unique names by " + "qualification, each component of this name is delimited."); public static final int HIERARCHY_UNIQUE_NAME_ORDINAL = 14; /** * Definition of the property which * holds the unique name of the current hierarchy. */ public static final Property HIERARCHY_UNIQUE_NAME = new Property( "HIERARCHY_UNIQUE_NAME", Datatype.TYPE_STRING, HIERARCHY_UNIQUE_NAME_ORDINAL, false, true, false, "Required. Unique name of the hierarchy. If the member belongs " + "to more than one hierarchy, there is one row for each hierarchy " + "to which it belongs. For providers that generate unique names " + "by qualification, each component of this name is delimited."); public static final int LEVEL_UNIQUE_NAME_ORDINAL = 15; /** * Definition of the property which * holds the unique name of the current level. */ public static final Property LEVEL_UNIQUE_NAME = new Property( "LEVEL_UNIQUE_NAME", Datatype.TYPE_STRING, LEVEL_UNIQUE_NAME_ORDINAL, false, true, false, "Required. Unique name of the level to which the member belongs. " + "For providers that generate unique names by qualification, " + "each component of this name is delimited."); public static final int LEVEL_NUMBER_ORDINAL = 16; /** * Definition of the property which * holds the ordinal of the current level. */ public static final Property LEVEL_NUMBER = new Property( "LEVEL_NUMBER", Datatype.TYPE_STRING, LEVEL_NUMBER_ORDINAL, false, true, false, "Required. The distance of the member from the root of the " + "hierarchy. The root level is zero."); public static final int MEMBER_ORDINAL_ORDINAL = 17; /** * Definition of the property which * holds the ordinal of the current member. */ public static final Property MEMBER_ORDINAL = new Property( "MEMBER_ORDINAL", Datatype.TYPE_NUMERIC, MEMBER_ORDINAL_ORDINAL, false, true, false, "Required. Ordinal number of the member. Sort rank of the member " + "when members of this dimension are sorted in their natural sort " + "order. If providers do not have the concept of natural " + "ordering, this should be the rank when sorted by MEMBER_NAME."); public static final int MEMBER_NAME_ORDINAL = 18; /** * Definition of the property which * holds the name of the current member. */ public static final Property MEMBER_NAME = new Property( "MEMBER_NAME", Datatype.TYPE_STRING, MEMBER_NAME_ORDINAL, false, true, false, "Required. Name of the member."); public static final int MEMBER_UNIQUE_NAME_ORDINAL = 19; /** * Definition of the property which * holds the unique name of the current member. */ public static final Property MEMBER_UNIQUE_NAME = new Property( "MEMBER_UNIQUE_NAME", Datatype.TYPE_STRING, MEMBER_UNIQUE_NAME_ORDINAL, false, true, false, "Required. Unique name of the member. For providers that " + "generate unique names by qualification, each component of " + "this name is delimited."); public static final int MEMBER_TYPE_ORDINAL = 20; /** * Definition of the property which * holds the type of the member. */ public static final Property MEMBER_TYPE = new Property( "MEMBER_TYPE", Datatype.TYPE_NUMERIC, MEMBER_TYPE_ORDINAL, false, true, false, "Required. Type of the member. Can be one of the following values: " + "MDMEMBER_TYPE_REGULAR, MDMEMBER_TYPE_ALL, " + "MDMEMBER_TYPE_FORMULA, MDMEMBER_TYPE_MEASURE, " + "MDMEMBER_TYPE_UNKNOWN. MDMEMBER_TYPE_FORMULA takes precedence " + "over MDMEMBER_TYPE_MEASURE. Therefore, if there is a formula " + "(calculated) member on the Measures dimension, it is listed as " + "MDMEMBER_TYPE_FORMULA."); public static final int MEMBER_GUID_ORDINAL = 21; /** * Definition of the property which * holds the GUID of the member */ public static final Property MEMBER_GUID = new Property( "MEMBER_GUID", Datatype.TYPE_STRING, MEMBER_GUID_ORDINAL, false, true, false, "Optional. Member GUID. NULL if no GUID exists."); public static final int MEMBER_CAPTION_ORDINAL = 22; /** * Definition of the property which * holds the label or caption associated with the member, or the * member's name if no caption is defined. * *

"CAPTION" is a synonym for this property. */ public static final Property MEMBER_CAPTION = new Property( "MEMBER_CAPTION", Datatype.TYPE_STRING, MEMBER_CAPTION_ORDINAL, false, true, false, "Required. A label or caption associated with the member. Used " + "primarily for display purposes. If a caption does not exist, " + "MEMBER_NAME is returned."); public static final int CHILDREN_CARDINALITY_ORDINAL = 23; /** * Definition of the property which holds the * number of children this member has. */ public static final Property CHILDREN_CARDINALITY = new Property( "CHILDREN_CARDINALITY", Datatype.TYPE_NUMERIC, CHILDREN_CARDINALITY_ORDINAL, false, true, false, "Required. Number of children that the member has. This can be an " + "estimate, so consumers should not rely on this to be the exact " + "count. Providers should return the best estimate possible."); public static final int PARENT_LEVEL_ORDINAL = 24; /** * Definition of the property which holds the * distance from the root of the hierarchy of this member's parent. */ public static final Property PARENT_LEVEL = new Property( "PARENT_LEVEL", Datatype.TYPE_NUMERIC, PARENT_LEVEL_ORDINAL, false, true, false, "Required. The distance of the member's parent from the root level " + "of the hierarchy. The root level is zero."); public static final int PARENT_UNIQUE_NAME_ORDINAL = 25; /** * Definition of the property which holds the * Name of the current catalog. */ public static final Property PARENT_UNIQUE_NAME = new Property( "PARENT_UNIQUE_NAME", Datatype.TYPE_STRING, PARENT_UNIQUE_NAME_ORDINAL, false, true, false, "Required. Unique name of the member's parent. NULL is returned " + "for any members at the root level. For providers that generate " + "unique names by qualification, each component of this name is " + "delimited."); public static final int PARENT_COUNT_ORDINAL = 26; /** * Definition of the property which holds the * number of parents that this member has. Generally 1, or 0 for root * members. */ public static final Property PARENT_COUNT = new Property( "PARENT_COUNT", Datatype.TYPE_NUMERIC, PARENT_COUNT_ORDINAL, false, true, false, "Required. Number of parents that this member has."); public static final int DESCRIPTION_ORDINAL = 27; /** * Definition of the property which holds the * description of this member. */ public static final Property DESCRIPTION = new Property( "DESCRIPTION", Datatype.TYPE_STRING, DESCRIPTION_ORDINAL, false, true, false, "Optional. A human-readable description of the member."); public static final int VISIBLE_ORDINAL = 28; /** * Definition of the internal property which holds the * name of the system property which determines whether to show a member * (especially a measure or calculated member) in a user interface such as * JPivot. */ public static final Property VISIBLE = new Property( "$visible", Datatype.TYPE_BOOLEAN, VISIBLE_ORDINAL, true, false, false, null); public static final int CELL_FORMATTER_ORDINAL = 29; /** * Definition of the property which holds the * name of the class which formats cell values of this member. * *

The class must implement the {@link mondrian.spi.CellFormatter} * interface. * *

Despite its name, this is a member property. */ public static final Property CELL_FORMATTER = new Property( "CELL_FORMATTER", Datatype.TYPE_STRING, CELL_FORMATTER_ORDINAL, false, true, false, "Name of the class which formats cell values of this member."); public static final int CELL_FORMATTER_SCRIPT_LANGUAGE_ORDINAL = 51; /** * Definition of the property which holds the * name of the scripting language in which a scripted cell formatter is * implemented, e.g. 'JavaScript'. * *

Despite its name, this is a member property. */ public static final Property CELL_FORMATTER_SCRIPT_LANGUAGE = new Property( "CELL_FORMATTER_SCRIPT_LANGUAGE", Datatype.TYPE_STRING, CELL_FORMATTER_SCRIPT_LANGUAGE_ORDINAL, false, true, false, "Name of the scripting language in which a scripted cell formatter" + "is implemented, e.g. 'JavaScript'."); public static final int CELL_FORMATTER_SCRIPT_ORDINAL = 52; /** * Definition of the property which holds the * script with which to format cell values of this member. * *

Despite its name, this is a member property. */ public static final Property CELL_FORMATTER_SCRIPT = new Property( "CELL_FORMATTER_SCRIPT", Datatype.TYPE_STRING, CELL_FORMATTER_SCRIPT_ORDINAL, false, true, false, "Name of the class which formats cell values of this member."); // Cell properties public static final int BACK_COLOR_ORDINAL = 30; public static final Property BACK_COLOR = new Property( "BACK_COLOR", Datatype.TYPE_STRING, BACK_COLOR_ORDINAL, false, false, true, "The background color for displaying the VALUE or FORMATTED_VALUE " + "property. For more information, see FORE_COLOR and BACK_COLOR " + "Contents."); public static final int CELL_EVALUATION_LIST_ORDINAL = 31; public static final Property CELL_EVALUATION_LIST = new Property( "CELL_EVALUATION_LIST", Datatype.TYPE_STRING, CELL_EVALUATION_LIST_ORDINAL, false, false, true, "The semicolon-delimited list of evaluated formulas applicable to " + "the cell, in order from lowest to highest solve order. For more " + "information about solve order, see Understanding Pass Order and " + "Solve Order"); public static final int CELL_ORDINAL_ORDINAL = 32; public static final Property CELL_ORDINAL = new Property( "CELL_ORDINAL", Datatype.TYPE_NUMERIC, CELL_ORDINAL_ORDINAL, false, false, true, "The ordinal number of the cell in the dataset."); public static final int FORE_COLOR_ORDINAL = 33; public static final Property FORE_COLOR = new Property( "FORE_COLOR", Datatype.TYPE_STRING, FORE_COLOR_ORDINAL, false, false, true, "The foreground color for displaying the VALUE or FORMATTED_VALUE " + "property. For more information, see FORE_COLOR and BACK_COLOR " + "Contents."); public static final int FONT_NAME_ORDINAL = 34; public static final Property FONT_NAME = new Property( "FONT_NAME", Datatype.TYPE_STRING, FONT_NAME_ORDINAL, false, false, true, "The font to be used to display the VALUE or FORMATTED_VALUE " + "property."); public static final int FONT_SIZE_ORDINAL = 35; public static final Property FONT_SIZE = new Property( "FONT_SIZE", Datatype.TYPE_STRING, FONT_SIZE_ORDINAL, false, false, true, "Font size to be used to display the VALUE or FORMATTED_VALUE " + "property."); public static final int FONT_FLAGS_ORDINAL = 36; public static final Property FONT_FLAGS = new Property( "FONT_FLAGS", Datatype.TYPE_NUMERIC, FONT_FLAGS_ORDINAL, false, false, true, "The bitmask detailing effects on the font. The value is the " + "result of a bitwise OR operation of one or more of the " + "following constants: MDFF_BOLD = 1, MDFF_ITALIC = 2, " + "MDFF_UNDERLINE = 4, MDFF_STRIKEOUT = 8. For example, the value " + "5 represents the combination of bold (MDFF_BOLD) and underline " + "(MDFF_UNDERLINE) font effects."); public static final int FORMATTED_VALUE_ORDINAL = 37; /** * Definition of the property which * holds the formatted value of a cell. */ public static final Property FORMATTED_VALUE = new Property( "FORMATTED_VALUE", Datatype.TYPE_STRING, FORMATTED_VALUE_ORDINAL, false, false, true, "The character string that represents a formatted display of the " + "VALUE property."); public static final int FORMAT_STRING_ORDINAL = 38; /** * Definition of the property which * holds the format string used to format cell values. */ public static final Property FORMAT_STRING = new Property( "FORMAT_STRING", Datatype.TYPE_STRING, FORMAT_STRING_ORDINAL, false, false, true, "The format string used to create the FORMATTED_VALUE property " + "value. For more information, see FORMAT_STRING Contents."); public static final int NON_EMPTY_BEHAVIOR_ORDINAL = 39; public static final Property NON_EMPTY_BEHAVIOR = new Property( "NON_EMPTY_BEHAVIOR", Datatype.TYPE_STRING, NON_EMPTY_BEHAVIOR_ORDINAL, false, false, true, "The measure used to determine the behavior of calculated members " + "when resolving empty cells."); public static final int SOLVE_ORDER_ORDINAL = 40; /** * Definition of the property which * determines the solve order of a calculated member with respect to other * calculated members. */ public static final Property SOLVE_ORDER = new Property( "SOLVE_ORDER", Datatype.TYPE_NUMERIC, SOLVE_ORDER_ORDINAL, false, false, true, "The solve order of the cell."); public static final int VALUE_ORDINAL = 41; /** * Definition of the property which * holds the value of a cell. Is usually numeric (since most measures are * numeric) but is occasionally another type. * *

It is also applicable to members. */ public static final Property VALUE = new Property( "VALUE", Datatype.TYPE_NUMERIC, VALUE_ORDINAL, false, true, true, "The unformatted value of the cell."); public static final int DATATYPE_ORDINAL = 42; /** * Definition of the property which * holds the datatype of a cell. Valid values are "String", * "Numeric", "Integer". The property's value derives from the * "datatype" attribute of the "Measure" element; if the datatype attribute * is not specified, the datatype is "Numeric" by default, except measures * whose aggregator is "Count", whose datatype is "Integer". */ public static final Property DATATYPE = new Property( "DATATYPE", Datatype.TYPE_STRING, DATATYPE_ORDINAL, false, false, true, "The datatype of the cell."); public static final int DEPTH_ORDINAL = 43; /** * Definition of the property which * holds the level depth of a member. * *

Caution: Level depth of members in parent-child hierarchy isn't from * their levels. It's calculated from the underlying data dynamically. */ public static final Property DEPTH = new Property( "DEPTH", Datatype.TYPE_NUMERIC, DEPTH_ORDINAL, true, true, false, "The level depth of a member"); public static final int DISPLAY_INFO_ORDINAL = 44; /** * Definition of the property which * holds the DISPLAY_INFO required by XML/A. * Caution: This property's value is calculated based on a specified MDX * query, so it's value is dynamic at runtime. */ public static final Property DISPLAY_INFO = new Property( "DISPLAY_INFO", Datatype.TYPE_NUMERIC, DISPLAY_INFO_ORDINAL, false, true, false, "Display instruction of a member for XML/A"); public static final int MEMBER_KEY_ORDINAL = 45; /** * Definition of the property which * holds the member key of the current member. */ public static final Property MEMBER_KEY = new Property( "MEMBER_KEY", Datatype.TYPE_STRING, MEMBER_KEY_ORDINAL, false, true, false, "Member key."); public static final int KEY_ORDINAL = 46; /** * Definition of the property which * holds the key of the current member. */ public static final Property KEY = new Property( "KEY", Datatype.TYPE_STRING, KEY_ORDINAL, false, true, false, "Key."); public static final int SCENARIO_ORDINAL = 48; /** * Definition of the internal property which * holds the scenario object underlying a member of the scenario hierarchy. */ public static final Property SCENARIO = new Property( "$scenario", Datatype.TYPE_OTHER, SCENARIO_ORDINAL, true, true, false, null); public static final int DISPLAY_FOLDER_ORDINAL = 49; /** * Definition of the property which * holds the DISPLAY_FOLDER. For measures, a client tool may use this * folder to display measures in groups. This property has no meaning for * other members. */ public static final Property DISPLAY_FOLDER = new Property( "DISPLAY_FOLDER", Datatype.TYPE_STRING, DISPLAY_FOLDER_ORDINAL, false, true, false, "Folder in which to display a measure"); public static final int LANGUAGE_ORDINAL = 50; /** * Definition of the property which * holds the translation expressed as an LCID. * Only valid for property translations. */ public static final Property LANGUAGE = new Property( "LANGUAGE", Datatype.TYPE_NUMERIC, LANGUAGE_ORDINAL, false, false, true, "The translation expressed as an LCID. Only valid for property translations."); public static final int FORMAT_EXP_ORDINAL = 53; /** * Definition of the property which * holds the format string. */ public static final Property FORMAT_EXP = new Property( "FORMAT_EXP", Datatype.TYPE_STRING, FORMAT_EXP_ORDINAL, true, true, false, null); public static final int ACTION_TYPE_ORDINAL = 54; /** * Definition of the property which * holds the format string. */ public static final Property ACTION_TYPE = new Property( "ACTION_TYPE", Datatype.TYPE_NUMERIC, ACTION_TYPE_ORDINAL, false, false, true, null); public static final int DRILLTHROUGH_COUNT_ORDINAL = 55; /** * Definition of the property that * holds the number of fact rows that contributed to this cell. * If the cell is not drillable, returns -1. * *

Note that this property may be expensive to compute for some * cubes.

*/ public static final Property DRILLTHROUGH_COUNT = new Property( "DRILLTHROUGH_COUNT", Datatype.TYPE_NUMERIC, DRILLTHROUGH_COUNT_ORDINAL, false, false, true, "Number of fact rows that contributed to this cell. If the cell is " + "not drillable, value is -1."); /** * The various property names which define a format string. */ static final Set FORMAT_PROPERTIES = new HashSet( Arrays.asList( "format", "format_string", "FORMAT", FORMAT_STRING.name)); // ~ Data members --------------------------------------------------------- /** * The datatype of the property. */ private final Datatype type; /** * Whether the property is internal. */ private final boolean internal; private final boolean member; private final boolean cell; private static int nextOrdinal = 100; // ~ Methods -------------------------------------------------------------- /** * Creates a property definition. If ordinal is negative, generates a * unique positive ordinal. */ protected Property( String name, Datatype type, int ordinal, boolean internal, boolean member, boolean cell, String description) { super(name, ordinal < 0 ? nextOrdinal++ : ordinal, description); this.type = type; this.internal = internal; this.member = member; this.cell = cell; } /** * Returns the datatype of the property. */ public Datatype getType() { return type; } public PropertyFormatter getFormatter() { return null; } /** * Returns the caption of this property. */ public String getCaption() { return name; } /** * Returns whether this property is for system use only. */ public boolean isInternal() { return internal; } /** * Returns whether this property is a standard member property. */ public boolean isMemberProperty() { return member; } /** * Returns whether this property is a standard cell property. */ public boolean isCellProperty() { return cell && isStandard(); } /** * Returns whether this property is standard. */ public boolean isStandard() { return ordinal < MAX_ORDINAL; } public static final EnumeratedValues enumeration = new EnumeratedValues( new Property[] { FORMAT_EXP_PARSED, AGGREGATION_TYPE, NAME, CAPTION, CONTRIBUTING_CHILDREN, FORMULA, CATALOG_NAME, SCHEMA_NAME, CUBE_NAME, DIMENSION_UNIQUE_NAME, HIERARCHY_UNIQUE_NAME, LEVEL_UNIQUE_NAME, LEVEL_NUMBER, MEMBER_UNIQUE_NAME, MEMBER_NAME, MEMBER_TYPE, MEMBER_GUID, MEMBER_CAPTION, MEMBER_ORDINAL, CHILDREN_CARDINALITY, PARENT_LEVEL, PARENT_UNIQUE_NAME, PARENT_COUNT, DESCRIPTION, VISIBLE, CELL_FORMATTER, CELL_FORMATTER_SCRIPT, CELL_FORMATTER_SCRIPT_LANGUAGE, BACK_COLOR, CELL_EVALUATION_LIST, CELL_ORDINAL, FORE_COLOR, FONT_NAME, FONT_SIZE, FONT_FLAGS, FORMAT_STRING, FORMATTED_VALUE, NON_EMPTY_BEHAVIOR, SOLVE_ORDER, VALUE, DATATYPE, MEMBER_KEY, KEY, SCENARIO, DISPLAY_FOLDER, FORMAT_EXP, ACTION_TYPE, DRILLTHROUGH_COUNT, }); private static final int MAX_ORDINAL = 56; static { // Populate synonyms. synonyms.put("CAPTION", MEMBER_CAPTION); synonyms.put("FORMAT", FORMAT_STRING); // Populate map of upper-case property names. for (String propertyName : enumeration.getNames()) { final Property property = enumeration.getValue(propertyName, true); mapUpperNameToProperties.put( propertyName.toUpperCase(), property); assert property.getOrdinal() < MAX_ORDINAL; } // Add synonyms. for (Map.Entry entry : synonyms.entrySet()) { mapUpperNameToProperties.put( entry.getKey().toUpperCase(), entry.getValue()); } } /** * Looks up a Property with a given ordinal. * Returns null if not found. */ public static Property lookup(int ordinal) { return enumeration.getValue(ordinal); } /** * Looks up a Property with a given name. * * @param name Name of property * @param matchCase Whether to perform case-sensitive match * @return Property with given name, or null if not found. */ public static Property lookup(String name, boolean matchCase) { if (matchCase) { Property property = enumeration.getValue(name, false); if (property != null) { return property; } return synonyms.get(name); } else { // No need to check synonyms separately - the map contains them. return mapUpperNameToProperties.get(name.toUpperCase()); } } } // End Property.java mondrian-3.11.0.1-R/src/main/mondrian/olap/PropertyFormatter.java000066400000000000000000000013141261646570300246020ustar00rootroot00000000000000/* // This software is subject to the terms of the Eclipse Public License v1.0 // Agreement, available at the following URL: // http://www.eclipse.org/legal/epl-v10.html. // You must accept the terms of that agreement to use this software. // // Copyright (C) 2004-2005 TONBELLER AG // Copyright (C) 2006-2011 Pentaho and others // All Rights Reserved. */ package mondrian.olap; /** * SPI to redefine a member property display string. * * @deprecated Use {@link mondrian.spi.PropertyFormatter}. This interface * exists for temporary backwards compatibility and will be removed * in mondrian-4.0. */ public interface PropertyFormatter extends mondrian.spi.PropertyFormatter { } // End PropertyFormatter.java mondrian-3.11.0.1-R/src/main/mondrian/olap/Query.java000066400000000000000000002115331261646570300222050ustar00rootroot00000000000000/* // This software is subject to the terms of the Eclipse Public License v1.0 // Agreement, available at the following URL: // http://www.eclipse.org/legal/epl-v10.html. // You must accept the terms of that agreement to use this software. // // Copyright (C) 1998-2005 Julian Hyde // Copyright (C) 2005-2015 Pentaho and others // All Rights Reserved. */ package mondrian.olap; import mondrian.calc.*; import mondrian.mdx.*; import mondrian.olap.fun.ParameterFunDef; import mondrian.olap.type.*; import mondrian.resource.MondrianResource; import mondrian.rolap.*; import mondrian.server.*; import mondrian.spi.ProfileHandler; import mondrian.util.ArrayStack; import org.apache.commons.collections.collection.CompositeCollection; import org.olap4j.impl.*; import org.olap4j.mdx.IdentifierSegment; import java.io.PrintWriter; import java.sql.SQLException; import java.util.*; /** * Query is an MDX query. * *

It is created by calling {@link Connection#parseQuery}, * and executed by calling {@link Connection#execute}, * to return a {@link Result}.

* *

Query control

* *

Most queries are model citizens, executing quickly (often using cached * results from previous queries), but som queries take more time, or more * database resources, or more results, than is reasonable. Mondrian offers * three ways to control rogue queries:

    * *
  • You can set a query timeout by setting the * {@link MondrianProperties#QueryTimeout} parameter. If the query * takes longer to execute than the value of this parameter, the system * will kill it.
  • * *
  • The {@link MondrianProperties#QueryLimit} parameter limits the number * of cells returned by a query.
  • * *
  • At any time while a query is executing, another thread can cancel the * query by calling * {@link #getStatement()}.{@link Statement#cancel() cancel()}. * The call to {@link Connection#execute(Query)} * will throw an exception.
  • * *
* * @author jhyde, 20 January, 1999 */ public class Query extends QueryPart { private Formula[] formulas; /** * public-private: This must be public because it is still accessed in * rolap.RolapConnection */ public QueryAxis[] axes; private QueryAxis slicerAxis; /** * Definitions of all parameters used in this query. */ private final List parameters = new ArrayList(); private final Map parametersByName = new HashMap(); /** * Cell properties. Not currently used. */ private final QueryPart[] cellProps; /** * Cube this query belongs to. */ private final Cube cube; private final Statement statement; public Calc[] axisCalcs; public Calc slicerCalc; /** * Set of FunDefs for which alerts about non-native evaluation * have already been posted. */ Set alertedNonNativeFunDefs; /** * Unique list of members referenced from the measures dimension. * Will be used to determine if cross joins can be processed natively * for virtual cubes. */ private Set measuresMembers; /** * If true, virtual cubes can be processed using native cross joins. * It defaults to true, unless functions are applied on measures. */ private boolean nativeCrossJoinVirtualCube; /** * Used for virtual cubes. * Comtains a list of base cubes related to a virtual cube */ private List baseCubes; /** * If true, enforce validation even when ignoreInvalidMembers is set. */ private boolean strictValidation; /** * How should the query be returned? Valid values are: * ResultStyle.ITERABLE * ResultStyle.LIST * ResultStyle.MUTABLE_LIST * For java4, use LIST */ private ResultStyle resultStyle = Util.Retrowoven ? ResultStyle.LIST : ResultStyle.ITERABLE; private Map evalCache = new HashMap(); /** * List of aliased expressions defined in this query, and where they are * defined. There might be more than one aliased expression with the same * name. */ private final List scopedNamedSets = new ArrayList(); private boolean ownStatement; /** * Creates a Query. */ public Query( Statement statement, Formula[] formulas, QueryAxis[] axes, String cube, QueryAxis slicerAxis, QueryPart[] cellProps, boolean strictValidation) { this( statement, Util.lookupCube(statement.getSchemaReader(), cube, true), formulas, axes, slicerAxis, cellProps, new Parameter[0], strictValidation); } /** * Creates a Query. */ public Query( Statement statement, Cube mdxCube, Formula[] formulas, QueryAxis[] axes, QueryAxis slicerAxis, QueryPart[] cellProps, Parameter[] parameters, boolean strictValidation) { this.statement = statement; this.cube = mdxCube; this.formulas = formulas; this.axes = axes; normalizeAxes(); this.slicerAxis = slicerAxis; this.cellProps = cellProps; this.parameters.addAll(Arrays.asList(parameters)); this.measuresMembers = new HashSet(); // assume, for now, that cross joins on virtual cubes can be // processed natively; as we parse the query, we'll know otherwise this.nativeCrossJoinVirtualCube = true; this.strictValidation = strictValidation; this.alertedNonNativeFunDefs = new HashSet(); statement.setQuery(this); resolve(); if (RolapUtil.PROFILE_LOGGER.isDebugEnabled() && statement.getProfileHandler() == null) { statement.enableProfiling( new ProfileHandler() { public void explain(String plan, QueryTiming timing) { if (timing != null) { plan += "\n" + timing; } RolapUtil.PROFILE_LOGGER.debug(plan); } } ); } } /** * Sets the timeout in milliseconds of this Query. * *

Zero means no timeout. * * @param queryTimeoutMillis Timeout in milliseconds * * @deprecated This method will be removed in mondrian-4.0 */ public void setQueryTimeoutMillis(long queryTimeoutMillis) { statement.setQueryTimeoutMillis(queryTimeoutMillis); } /** * Checks whether the property name is present in the query. */ public boolean hasCellProperty(String propertyName) { for (QueryPart cellProp : cellProps) { if (((CellProperty)cellProp).isNameEquals(propertyName)) { return true; } } return false; } /** * Checks whether any cell property present in the query */ public boolean isCellPropertyEmpty() { return cellProps.length == 0; } /** * Adds a new formula specifying a set * to an existing query. */ public void addFormula(Id id, Exp exp) { addFormula( new Formula(false, id, exp, new MemberProperty[0], null, null)); } /** * Adds a new formula specifying a member * to an existing query. * * @param id Name of member * @param exp Expression for member * @param memberProperties Properties of member */ public void addFormula( Id id, Exp exp, MemberProperty[] memberProperties) { addFormula(new Formula(true, id, exp, memberProperties, null, null)); } /** * Adds a new formula specifying a member or a set * to an existing query; resolve is called after * the formula has been added. * * @param formula Formula to add to query */ public void addFormula(Formula formula) { formulas = Util.append(formulas, formula); resolve(); } /** * Adds some number of new formulas specifying members * or sets to an existing query; resolve is only called * once, after all the new members have been added to * the query. * * @param additions Formulas to add to query */ public void addFormulas(Formula... additions) { formulas = Util.appendArrays(formulas, additions); resolve(); } /** * Creates a validator for this query. * * @return Validator */ public Validator createValidator() { return createValidator( statement.getSchema().getFunTable(), false, new HashMap()); } public Validator createValidator( Map resolvedIdentifiers) { return createValidator( statement.getSchema().getFunTable(), false, resolvedIdentifiers); } /** * Creates a validator for this query that uses a given function table and * function validation policy. * * @param functionTable Function table * @param alwaysResolveFunDef Whether to always resolve function * definitions (see {@link Validator#alwaysResolveFunDef()}) * @return Validator */ public Validator createValidator( FunTable functionTable, boolean alwaysResolveFunDef) { return new QueryValidator( functionTable, alwaysResolveFunDef, Query.this, new HashMap()); } public Validator createValidator( FunTable functionTable, boolean alwaysResolveFunDef, Map resolvedIdentifiers) { return new QueryValidator( functionTable, alwaysResolveFunDef, Query.this, resolvedIdentifiers); } /** * @deprecated Please use {@link #clone}; this method will be removed in * mondrian-4.0 */ public Query safeClone() { return clone(); } @SuppressWarnings({ "CloneDoesntCallSuperClone", "CloneDoesntDeclareCloneNotSupportedException" }) public Query clone() { return new Query( statement, cube, Formula.cloneArray(formulas), QueryAxis.cloneArray(axes), (slicerAxis == null) ? null : (QueryAxis) slicerAxis.clone(), cellProps, parameters.toArray(new Parameter[parameters.size()]), strictValidation); } public Connection getConnection() { return statement.getMondrianConnection(); } /** * Issues a cancel request on this Query object. Once the thread * running the query detects the cancel request, the query execution will * throw an exception. See BasicQueryTest.testCancel for an * example of usage of this method. * * @deprecated This method is deprecated and will be removed in mondrian-4.0 */ public void cancel() { try { statement.cancel(); } catch (SQLException e) { throw new RuntimeException(e); } } /** * Checks if either a cancel request has been issued on the query or * the execution time has exceeded the timeout value (if one has been * set). Exceptions are raised if either of these two conditions are * met. This method should be called periodically during query execution * to ensure timely detection of these events, particularly before/after * any potentially long running operations. * * @deprecated This method will be removed in mondrian-4.0 */ public void checkCancelOrTimeout() { final Execution execution0 = statement.getCurrentExecution(); if (execution0 == null) { return; } execution0.checkCancelOrTimeout(); } /** * Gets the query start time * @return start time * * @deprecated Use {@link Execution#getStartTime}. This method is deprecated * and will be removed in mondrian-4.0 */ public long getQueryStartTime() { final Execution currentExecution = statement.getCurrentExecution(); return currentExecution == null ? 0 : currentExecution.getStartTime(); } /** * Determines whether an alert for non-native evaluation needs * to be posted. * * @param funDef function type to alert for * * @return true if alert should be raised */ public boolean shouldAlertForNonNative(FunDef funDef) { return alertedNonNativeFunDefs.add(funDef); } private void normalizeAxes() { for (int i = 0; i < axes.length; i++) { AxisOrdinal correctOrdinal = AxisOrdinal.StandardAxisOrdinal.forLogicalOrdinal(i); if (axes[i].getAxisOrdinal() != correctOrdinal) { for (int j = i + 1; j < axes.length; j++) { if (axes[j].getAxisOrdinal() == correctOrdinal) { // swap axes QueryAxis temp = axes[i]; axes[i] = axes[j]; axes[j] = temp; break; } } } } } /** * Performs type-checking and validates internal consistency of a query, * using the default resolver. * *

This method is called automatically when a query is created; you need * to call this method manually if you have modified the query's expression * tree in any way. */ public void resolve() { // Before commencing validation, create all calculated members // and calculated sets createFormulaElements(); Map resolvedIdentifiers = new IdBatchResolver(this).resolve(); final Validator validator = createValidator(resolvedIdentifiers); resolve(validator); // resolve self and children // Create a dummy result so we can use its evaluator final Evaluator evaluator = RolapUtil.createEvaluator(statement); ExpCompiler compiler = createCompiler( evaluator, validator, Collections.singletonList(resultStyle)); compile(compiler); } private void createFormulaElements() { if (formulas != null) { // Resolving of formulas should be done in two parts // because formulas might depend on each other, so all calculated // mdx elements have to be defined during resolve. for (Formula formula : formulas) { formula.createElement(this); } } } /** * @return true if the relevant property for ignoring invalid members is * set to true for this query's environment (a different property is * checked depending on whether environment is schema load vs query * validation) */ public boolean ignoreInvalidMembers() { MondrianProperties props = MondrianProperties.instance(); final boolean load = ((RolapCube) getCube()).isLoadInProgress(); return !strictValidation && (load ? props.IgnoreInvalidMembers.get() : props.IgnoreInvalidMembersDuringQuery.get()); } /** * A Query's ResultStyle can only be one of the following: * ResultStyle.ITERABLE * ResultStyle.LIST * ResultStyle.MUTABLE_LIST */ public void setResultStyle(ResultStyle resultStyle) { switch (resultStyle) { case ITERABLE: // For java4, use LIST this.resultStyle = (Util.Retrowoven) ? ResultStyle.LIST : ResultStyle.ITERABLE; break; case LIST: case MUTABLE_LIST: this.resultStyle = resultStyle; break; default: throw ResultStyleException.generateBadType( ResultStyle.ITERABLE_LIST_MUTABLELIST, resultStyle); } } public ResultStyle getResultStyle() { return resultStyle; } /** * Generates compiled forms of all expressions. * * @param compiler Compiler */ private void compile(ExpCompiler compiler) { if (formulas != null) { for (Formula formula : formulas) { formula.compile(); } } if (axes != null) { axisCalcs = new Calc[axes.length]; for (int i = 0; i < axes.length; i++) { axisCalcs[i] = axes[i].compile(compiler, resultStyle); } } if (slicerAxis != null) { slicerCalc = slicerAxis.compile(compiler, resultStyle); } } /** * Performs type-checking and validates internal consistency of a query. * * @param validator Validator */ public void resolve(Validator validator) { // Register all parameters. parameters.clear(); parametersByName.clear(); accept(new ParameterFinder()); // Register all aliased expressions ('expr AS alias') as named sets. accept(new AliasedExpressionFinder()); // Validate formulas. if (formulas != null) { for (Formula formula : formulas) { validator.validate(formula); } } // Validate axes. if (axes != null) { Set axisNames = new HashSet(); for (QueryAxis axis : axes) { validator.validate(axis); if (!axisNames.add(axis.getAxisOrdinal().logicalOrdinal())) { throw MondrianResource.instance().DuplicateAxis.ex( axis.getAxisName()); } } // Make sure that there are no gaps. If there are N axes, then axes // 0 .. N-1 should exist. int seekOrdinal = AxisOrdinal.StandardAxisOrdinal.COLUMNS.logicalOrdinal(); for (QueryAxis axis : axes) { if (!axisNames.contains(seekOrdinal)) { AxisOrdinal axisName = AxisOrdinal.StandardAxisOrdinal.forLogicalOrdinal( seekOrdinal); throw MondrianResource.instance().NonContiguousAxis.ex( seekOrdinal, axisName.name()); } ++seekOrdinal; } } if (slicerAxis != null) { slicerAxis.validate(validator); } // Make sure that no hierarchy is used on more than one axis. for (Hierarchy hierarchy : ((RolapCube) getCube()).getHierarchies()) { int useCount = 0; for (QueryAxis axis : allAxes()) { if (axis.getSet().getType().usesHierarchy(hierarchy, true)) { ++useCount; } } if (useCount > 1) { throw MondrianResource.instance().HierarchyInIndependentAxes.ex( hierarchy.getUniqueName()); } } } @Override public void explain(PrintWriter pw) { final boolean profiling = getStatement().getProfileHandler() != null; final CalcWriter calcWriter = new CalcWriter(pw, profiling); for (Formula formula : formulas) { formula.getMdxMember(); // TODO: } if (slicerCalc != null) { pw.println("Axis (FILTER):"); slicerCalc.accept(calcWriter); pw.println(); } int i = -1; for (QueryAxis axis : axes) { ++i; pw.println("Axis (" + axis.getAxisName() + "):"); axisCalcs[i].accept(calcWriter); pw.println(); } pw.flush(); } /** * Returns a collection of all axes, including the slicer as the first * element, if there is a slicer. * * @return Collection of all axes including slicer */ private Collection allAxes() { if (slicerAxis == null) { return Arrays.asList(axes); } else { //noinspection unchecked return new CompositeCollection( new Collection[] { Collections.singletonList(slicerAxis), Arrays.asList(axes)}); } } public void unparse(PrintWriter pw) { if (formulas != null) { for (int i = 0; i < formulas.length; i++) { if (i == 0) { pw.print("with "); } else { pw.print(" "); } formulas[i].unparse(pw); pw.println(); } } pw.print("select "); if (axes != null) { for (int i = 0; i < axes.length; i++) { axes[i].unparse(pw); if (i < axes.length - 1) { pw.println(","); pw.print(" "); } else { pw.println(); } } } if (cube != null) { pw.println("from [" + cube.getName() + "]"); } if (slicerAxis != null) { pw.print("where "); slicerAxis.unparse(pw); pw.println(); } } /** Returns the MDX query string. */ public String toString() { resolve(); return Util.unparse(this); } public Object[] getChildren() { // Chidren are axes, slicer, and formulas (in that order, to be // consistent with replaceChild). List list = new ArrayList(); list.addAll(Arrays.asList(axes)); if (slicerAxis != null) { list.add(slicerAxis); } list.addAll(Arrays.asList(formulas)); return list.toArray(); } public QueryAxis getSlicerAxis() { return slicerAxis; } public void setSlicerAxis(QueryAxis axis) { this.slicerAxis = axis; } /** * Adds a level to an axis expression. */ public void addLevelToAxis(AxisOrdinal axis, Level level) { assert axis != null; axes[axis.logicalOrdinal()].addLevel(level); } /** * Returns the hierarchies in an expression. * *

If the expression's type is a dimension with several hierarchies, * assumes that the expression yields a member of the first (default) * hierarchy of the dimension. * *

For example, the expression *

Crossjoin( * Hierarchize( * Union( * {[Time].LastSibling}, [Time].LastSibling.Children)), * {[Measures].[Unit Sales], [Measures].[Store Cost]}) *
* * has type {[Time.Monthly], [Measures]} even though * [Time].LastSibling might return a member of either * [Time.Monthly] or [Time.Weekly]. */ private Hierarchy[] collectHierarchies(Exp queryPart) { Type exprType = queryPart.getType(); if (exprType instanceof SetType) { exprType = ((SetType) exprType).getElementType(); } if (exprType instanceof TupleType) { final Type[] types = ((TupleType) exprType).elementTypes; ArrayList hierarchyList = new ArrayList(); for (Type type : types) { hierarchyList.add(getTypeHierarchy(type)); } return hierarchyList.toArray(new Hierarchy[hierarchyList.size()]); } return new Hierarchy[] {getTypeHierarchy(exprType)}; } private Hierarchy getTypeHierarchy(final Type type) { Hierarchy hierarchy = type.getHierarchy(); if (hierarchy != null) { return hierarchy; } final Dimension dimension = type.getDimension(); if (dimension != null) { return dimension.getHierarchy(); } return null; } /** * Assigns a value to the parameter with a given name. * * @throws RuntimeException if there is not parameter with the given name */ public void setParameter(final String parameterName, final Object value) { // Need to resolve query before we set parameters, in order to create // slots to store them in. (This code will go away when parameters // belong to prepared statements.) if (parameters.isEmpty()) { resolve(); } final Parameter param = getSchemaReader(false).getParameter(parameterName); if (param == null) { throw MondrianResource.instance().UnknownParameter.ex( parameterName); } if (!param.isModifiable()) { throw MondrianResource.instance().ParameterIsNotModifiable.ex( parameterName, param.getScope().name()); } final Object value2 = Locus.execute( new Execution(statement, 0), "Query.quickParse", new Locus.Action() { public Object execute() { return quickParse( parameterName, param.getType(), value, Query.this); } } ); param.setValue(value2); } /** * Converts a value into something appropriate for a given type. * *

Viz: *

    *
  • For numerics, takes number or string and returns a {@link Number}. *
  • For strings, takes string, or calls {@link Object#toString()} on any * other type *
  • For members, takes member or string *
  • For sets of members, requires a list of members or strings and * converts each element to a member. *
* * @param type Type * @param value Value * @param query Query * @return Value of appropriate type * @throws NumberFormatException If value needs to be a number but isn't */ private static Object quickParse( String parameterName, Type type, Object value, Query query) throws NumberFormatException { int category = TypeUtil.typeToCategory(type); switch (category) { case Category.Numeric: if (value instanceof Number || value == null) { return value; } if (value instanceof String) { String s = (String) value; try { return new Integer(s); } catch (NumberFormatException e) { return new Double(s); } } throw Util.newInternal( "Invalid value '" + value + "' for parameter '" + parameterName + "', type " + type); case Category.String: if (value == null) { return null; } return value.toString(); case Category.Set: if (value instanceof String) { value = IdentifierParser.parseIdentifierList((String) value); } if (!(value instanceof List)) { throw Util.newInternal( "Invalid value '" + value + "' for parameter '" + parameterName + "', type " + type); } List expList = new ArrayList(); final List list = (List) value; final SetType setType = (SetType) type; final Type elementType = setType.getElementType(); for (Object o : list) { // In keeping with MDX semantics, null members are omitted from // lists. if (o == null) { continue; } final Member member = (Member) quickParse(parameterName, elementType, o, query); expList.add(member); } return expList; case Category.Member: if (value == null) { // Setting a member parameter to null is the same as setting to // the null member of the hierarchy. May not be equivalent to // the default value of the parameter, nor the same as the all // member. if (type.getHierarchy() != null) { value = type.getHierarchy().getNullMember(); } else if (type.getDimension() != null) { value = type.getDimension().getHierarchy().getNullMember(); } } if (value instanceof String) { value = Util.parseIdentifier((String) value); } if (value instanceof List && Util.canCast((List) value, Id.Segment.class)) { final List segmentList = Util.cast((List) value); final OlapElement olapElement = Util.lookup(query, segmentList); if (olapElement instanceof Member) { value = olapElement; } } if (value instanceof List && Util.canCast((List) value, IdentifierSegment.class)) { final List olap4jSegmentList = Util.cast((List) value); final List segmentList = Util.convert(olap4jSegmentList); final OlapElement olapElement = Util.lookup(query, segmentList); if (olapElement instanceof Member) { value = olapElement; } } if (value instanceof Member) { if (type.isInstance(value)) { return value; } } throw Util.newInternal( "Invalid value '" + value + "' for parameter '" + parameterName + "', type " + type); default: throw Category.instance.badValue(category); } } /** * Swaps the x- and y- axes. * Does nothing if the number of axes != 2. */ public void swapAxes() { if (axes.length == 2) { Exp e0 = axes[0].getSet(); boolean nonEmpty0 = axes[0].isNonEmpty(); Exp e1 = axes[1].getSet(); boolean nonEmpty1 = axes[1].isNonEmpty(); axes[1].setSet(e0); axes[1].setNonEmpty(nonEmpty0); axes[0].setSet(e1); axes[0].setNonEmpty(nonEmpty1); // showSubtotals ??? } } /** * Returns the parameters defined in this query. */ public Parameter[] getParameters() { return parameters.toArray(new Parameter[parameters.size()]); } public Cube getCube() { return cube; } /** * Returns a schema reader. * * @param accessControlled If true, schema reader returns only elements * which are accessible to the statement's current role * * @return schema reader */ public SchemaReader getSchemaReader(boolean accessControlled) { final Role role; if (accessControlled) { // full access control role = getConnection().getRole(); } else { role = null; } final SchemaReader cubeSchemaReader = cube.getSchemaReader(role); return new QuerySchemaReader(cubeSchemaReader, Query.this); } /** * Looks up a member whose unique name is memberUniqueName * from cache. If the member is not in cache, returns null. */ public Member lookupMemberFromCache(String memberUniqueName) { // first look in defined members for (Member member : getDefinedMembers()) { if (Util.equalName(member.getUniqueName(), memberUniqueName) || Util.equalName( getUniqueNameWithoutAll(member), memberUniqueName)) { return member; } } return null; } private String getUniqueNameWithoutAll(Member member) { // build unique string Member parentMember = member.getParentMember(); if ((parentMember != null) && !parentMember.isAll()) { return Util.makeFqName( getUniqueNameWithoutAll(parentMember), member.getName()); } else { return Util.makeFqName(member.getHierarchy(), member.getName()); } } /** * Looks up a named set. */ private NamedSet lookupNamedSet(Id.Segment segment) { if (!(segment instanceof Id.NameSegment)) { return null; } Id.NameSegment nameSegment = (Id.NameSegment) segment; for (Formula formula : formulas) { if (!formula.isMember() && formula.getElement() != null && formula.getName().equals(nameSegment.getName())) { return (NamedSet) formula.getElement(); } } return null; } /** * Creates a named set defined by an alias. */ public ScopedNamedSet createScopedNamedSet( String name, QueryPart scope, Exp expr) { final ScopedNamedSet scopedNamedSet = new ScopedNamedSet( name, scope, expr); scopedNamedSets.add(scopedNamedSet); return scopedNamedSet; } /** * Looks up a named set defined by an alias. * * @param nameParts Multi-part identifier for set * @param scopeList Parse tree node where name is used (last in list) and */ ScopedNamedSet lookupScopedNamedSet( List nameParts, ArrayStack scopeList) { if (nameParts.size() != 1) { return null; } if (!(nameParts.get(0) instanceof Id.NameSegment)) { return null; } String name = ((Id.NameSegment) nameParts.get(0)).getName(); ScopedNamedSet bestScopedNamedSet = null; int bestScopeOrdinal = -1; for (ScopedNamedSet scopedNamedSet : scopedNamedSets) { if (Util.equalName(scopedNamedSet.name, name)) { int scopeOrdinal = scopeList.indexOf(scopedNamedSet.scope); if (scopeOrdinal > bestScopeOrdinal) { bestScopedNamedSet = scopedNamedSet; bestScopeOrdinal = scopeOrdinal; } } } return bestScopedNamedSet; } /** * Returns an array of the formulas used in this query. */ public Formula[] getFormulas() { return formulas; } /** * Returns an array of this query's axes. */ public QueryAxis[] getAxes() { return axes; } /** * Remove a formula from the query. If failIfUsedInQuery is * true, checks and throws an error if formula is used somewhere in the * query. */ public void removeFormula(String uniqueName, boolean failIfUsedInQuery) { Formula formula = findFormula(uniqueName); if (failIfUsedInQuery && formula != null) { OlapElement mdxElement = formula.getElement(); // search the query tree to see if this formula expression is used // anywhere (on the axes or in another formula) Walker walker = new Walker(this); while (walker.hasMoreElements()) { Object queryElement = walker.nextElement(); if (!queryElement.equals(mdxElement)) { continue; } // mdxElement is used in the query. lets find on on which axis // or formula String formulaType = formula.isMember() ? MondrianResource.instance().CalculatedMember.str() : MondrianResource.instance().CalculatedSet.str(); int i = 0; Object parent = walker.getAncestor(i); Object grandParent = walker.getAncestor(i + 1); while ((parent != null) && (grandParent != null)) { if (grandParent instanceof Query) { if (parent instanceof Axis) { throw MondrianResource.instance() .MdxCalculatedFormulaUsedOnAxis.ex( formulaType, uniqueName, ((QueryAxis) parent).getAxisName()); } else if (parent instanceof Formula) { String parentFormulaType = ((Formula) parent).isMember() ? MondrianResource.instance() .CalculatedMember.str() : MondrianResource.instance() .CalculatedSet.str(); throw MondrianResource.instance() .MdxCalculatedFormulaUsedInFormula.ex( formulaType, uniqueName, parentFormulaType, ((Formula) parent).getUniqueName()); } else { throw MondrianResource.instance() .MdxCalculatedFormulaUsedOnSlicer.ex( formulaType, uniqueName); } } ++i; parent = walker.getAncestor(i); grandParent = walker.getAncestor(i + 1); } throw MondrianResource.instance() .MdxCalculatedFormulaUsedInQuery.ex( formulaType, uniqueName, Util.unparse(this)); } } // remove formula from query List formulaList = new ArrayList(); for (Formula formula1 : formulas) { if (!formula1.getUniqueName().equalsIgnoreCase(uniqueName)) { formulaList.add(formula1); } } // it has been found and removed this.formulas = formulaList.toArray(new Formula[formulaList.size()]); } /** * Returns whether a formula can safely be removed from the query. It can be * removed if the member or set it defines it not used anywhere else in the * query, including in another formula. * * @param uniqueName Unique name of the member or set defined by the formula * @return whether the formula can safely be removed */ public boolean canRemoveFormula(String uniqueName) { Formula formula = findFormula(uniqueName); if (formula == null) { return false; } OlapElement mdxElement = formula.getElement(); // Search the query tree to see if this formula expression is used // anywhere (on the axes or in another formula). Walker walker = new Walker(this); while (walker.hasMoreElements()) { Object queryElement = walker.nextElement(); if (queryElement instanceof MemberExpr && ((MemberExpr) queryElement).getMember().equals(mdxElement)) { return false; } if (queryElement instanceof NamedSetExpr && ((NamedSetExpr) queryElement).getNamedSet().equals( mdxElement)) { return false; } } return true; } /** * Looks up a calculated member or set defined in this Query. * * @param uniqueName Unique name of calculated member or set * @return formula defining calculated member, or null if not found */ public Formula findFormula(String uniqueName) { for (Formula formula : formulas) { if (formula.getUniqueName().equalsIgnoreCase(uniqueName)) { return formula; } } return null; } /** * Finds formula by name and renames it to new name. */ public void renameFormula(String uniqueName, String newName) { Formula formula = findFormula(uniqueName); if (formula == null) { throw MondrianResource.instance().MdxFormulaNotFound.ex( "formula", uniqueName, Util.unparse(this)); } formula.rename(newName); } List getDefinedMembers() { List definedMembers = new ArrayList(); for (final Formula formula : formulas) { if (formula.isMember() && formula.getElement() != null && getConnection().getRole().canAccess(formula.getElement())) { definedMembers.add((Member) formula.getElement()); } } return definedMembers; } /** * Finds axis by index and sets flag to show empty cells on that axis. */ public void setAxisShowEmptyCells(int axis, boolean showEmpty) { if (axis >= axes.length) { throw MondrianResource.instance().MdxAxisShowSubtotalsNotSupported .ex(axis); } axes[axis].setNonEmpty(!showEmpty); } /** * Returns Hierarchy[] used on axis. It calls * {@link #collectHierarchies}. */ public Hierarchy[] getMdxHierarchiesOnAxis(AxisOrdinal axis) { if (axis.logicalOrdinal() >= axes.length) { throw MondrianResource.instance().MdxAxisShowSubtotalsNotSupported .ex(axis.logicalOrdinal()); } QueryAxis queryAxis = axis.isFilter() ? slicerAxis : axes[axis.logicalOrdinal()]; return collectHierarchies(queryAxis.getSet()); } /** * Compiles an expression, using a cached compiled expression if available. * * @param exp Expression * @param scalar Whether expression is scalar * @param resultStyle Preferred result style; if null, use query's default * result style; ignored if expression is scalar * @return compiled expression */ public Calc compileExpression( Exp exp, boolean scalar, ResultStyle resultStyle) { // REVIEW: Set query on a connection's shared internal statement is // not re-entrant. statement.setQuery(this); Evaluator evaluator = RolapEvaluator.create(statement); final Validator validator = createValidator(); List resultStyleList; resultStyleList = Collections.singletonList( resultStyle != null ? resultStyle : this.resultStyle); final ExpCompiler compiler = createCompiler( evaluator, validator, resultStyleList); if (scalar) { return compiler.compileScalar(exp, false); } else { return compiler.compile(exp); } } public ExpCompiler createCompiler() { // REVIEW: Set query on a connection's shared internal statement is // not re-entrant. statement.setQuery(this); Evaluator evaluator = RolapEvaluator.create(statement); Validator validator = createValidator(); return createCompiler( evaluator, validator, Collections.singletonList(resultStyle)); } private ExpCompiler createCompiler( final Evaluator evaluator, final Validator validator, List resultStyleList) { ExpCompiler compiler = ExpCompiler.Factory.getExpCompiler( evaluator, validator, resultStyleList); final int expDeps = MondrianProperties.instance().TestExpDependencies.get(); final ProfileHandler profileHandler = statement.getProfileHandler(); if (profileHandler != null) { // Cannot test dependencies and profile at the same time. Profiling // trumps. compiler = RolapUtil.createProfilingCompiler(compiler); } else if (expDeps > 0) { compiler = RolapUtil.createDependencyTestingCompiler(compiler); } return compiler; } /** * Keeps track of references to members of the measures dimension * * @param olapElement potential measure member */ public void addMeasuresMembers(OlapElement olapElement) { if (olapElement instanceof Member) { Member member = (Member) olapElement; if (member.isMeasure()) { measuresMembers.add(member); } } } /** * @return set of members from the measures dimension referenced within * this query */ public Set getMeasuresMembers() { return Collections.unmodifiableSet(measuresMembers); } /** * Indicates that the query cannot use native cross joins to process * this virtual cube */ public void setVirtualCubeNonNativeCrossJoin() { nativeCrossJoinVirtualCube = false; } /** * @return true if the query can use native cross joins on a virtual * cube */ public boolean nativeCrossJoinVirtualCube() { return nativeCrossJoinVirtualCube; } /** * Saves away the base cubes related to the virtual cube * referenced in this query * * @param baseCubes set of base cubes */ public void setBaseCubes(List baseCubes) { this.baseCubes = baseCubes; } /** * return the set of base cubes associated with the virtual cube referenced * in this query * * @return set of base cubes */ public List getBaseCubes() { return baseCubes; } public Object accept(MdxVisitor visitor) { Object o = visitor.visit(this); if (visitor.shouldVisitChildren()) { // visit formulas for (Formula formula : formulas) { formula.accept(visitor); } // visit axes for (QueryAxis axis : axes) { axis.accept(visitor); } if (slicerAxis != null) { slicerAxis.accept(visitor); } } return o; } /** * Put an Object value into the evaluation cache with given key. * This is used by Calc's to store information between iterations * (rather than re-generate each time). * * @param key the cache key * @param value the cache value */ public void putEvalCache(String key, Object value) { evalCache.put(key, value); } /** * Gets the Object associated with the value. * * @param key the cache key * @return the cached value or null. */ public Object getEvalCache(String key) { return evalCache.get(key); } /** * Remove all entries in the evaluation cache */ public void clearEvalCache() { evalCache.clear(); } /** * Closes this query. * *

Releases any resources held. Writes statistics to log if profiling * is enabled. * *

This method is idempotent. * * @deprecated This method will be removed in mondrian-4.0. */ public void close() { if (ownStatement) { statement.close(); } } public Statement getStatement() { return statement; } /** * Sets that the query owns its statement; therefore it will need to * close it when the query is closed. * * @param ownStatement Whether the statement belongs to the query */ public void setOwnStatement(boolean ownStatement) { this.ownStatement = ownStatement; } /** * Source of metadata within the scope of a query. * *

Note especially that {@link #getCalculatedMember(java.util.List)} * returns the calculated members defined in this query. It does not * perform access control; all calculated members defined in a query are * visible to everyone. */ private static class QuerySchemaReader extends DelegatingSchemaReader implements NameResolver.Namespace { private final Query query; public QuerySchemaReader(SchemaReader cubeSchemaReader, Query query) { super(cubeSchemaReader); this.query = query; } public SchemaReader withoutAccessControl() { return new QuerySchemaReader( schemaReader.withoutAccessControl(), query); } public Member getMemberByUniqueName( List uniqueNameParts, boolean failIfNotFound, MatchType matchType) { final String uniqueName = Util.implode(uniqueNameParts); Member member = query.lookupMemberFromCache(uniqueName); if (member == null) { // Not a calculated member in the query, so go to the cube. member = schemaReader.getMemberByUniqueName( uniqueNameParts, failIfNotFound, matchType); } if (!failIfNotFound && member == null) { return null; } if (getRole().canAccess(member)) { return member; } else { return null; } } public List getLevelMembers( Level level, boolean includeCalculated) { List members = super.getLevelMembers(level, false); if (includeCalculated) { members = Util.addLevelCalculatedMembers(this, level, members); } return members; } public Member getCalculatedMember(List nameParts) { for (final Formula formula : query.formulas) { if (!formula.isMember()) { continue; } Member member = (Member) formula.getElement(); if (member == null) { continue; } if (!Util.matches(member, nameParts)) { continue; } if (!query.getConnection().getRole().canAccess(member)) { continue; } return member; } return null; } public List getCalculatedMembers(Hierarchy hierarchy) { List result = new ArrayList(); // Add calculated members in the cube. final List calculatedMembers = super.getCalculatedMembers(hierarchy); result.addAll(calculatedMembers); // Add calculated members defined in the query. for (Member member : query.getDefinedMembers()) { if (member.getHierarchy().equals(hierarchy)) { result.add(member); } } return result; } public List getCalculatedMembers(Level level) { List hierarchyMembers = getCalculatedMembers(level.getHierarchy()); List result = new ArrayList(); for (Member member : hierarchyMembers) { if (member.getLevel().equals(level)) { result.add(member); } } return result; } public List getCalculatedMembers() { return query.getDefinedMembers(); } public OlapElement getElementChild(OlapElement parent, Id.Segment s) { return getElementChild(parent, s, MatchType.EXACT); } public OlapElement getElementChild( OlapElement parent, Id.Segment s, MatchType matchType) { // first look in cube OlapElement mdxElement = schemaReader.getElementChild(parent, s, matchType); if (mdxElement != null) { return mdxElement; } // then look in defined members (fixes MONDRIAN-77) // then in defined sets if (!(s instanceof Id.NameSegment)) { return null; } String name = ((Id.NameSegment) s).getName(); for (Formula formula : query.formulas) { if (formula.isMember()) { continue; // have already done these } Id id = formula.getIdentifier(); if (id.getSegments().size() == 1 && id.getSegments().get(0).matches(name)) { return formula.getNamedSet(); } } return mdxElement; } @Override public OlapElement lookupCompoundInternal( OlapElement parent, List names, boolean failIfNotFound, int category, MatchType matchType) { if (matchType == MatchType.EXACT) { OlapElement oe = lookupCompound( parent, names, failIfNotFound, category, MatchType.EXACT_SCHEMA); if (oe != null) { return oe; } } // First look to ourselves. switch (category) { case Category.Unknown: case Category.Member: if (parent == query.cube) { final Member calculatedMember = getCalculatedMember(names); if (calculatedMember != null) { return calculatedMember; } } } switch (category) { case Category.Unknown: case Category.Set: if (parent == query.cube) { final NamedSet namedSet = getNamedSet(names); if (namedSet != null) { return namedSet; } } } // Then delegate to the next reader. OlapElement olapElement = super.lookupCompoundInternal( parent, names, failIfNotFound, category, matchType); if (olapElement instanceof Member) { Member member = (Member) olapElement; final Formula formula = (Formula) member.getPropertyValue(Property.FORMULA.name); if (formula != null) { // This is a calculated member defined against the cube. // Create a free-standing formula using the same // expression, then use the member defined in that formula. final Formula formulaClone = (Formula) formula.clone(); formulaClone.createElement(query); formulaClone.accept(query.createValidator()); olapElement = formulaClone.getMdxMember(); } } return olapElement; } public NamedSet getNamedSet(List nameParts) { if (nameParts.size() != 1) { return null; } return query.lookupNamedSet(nameParts.get(0)); } public Parameter getParameter(String name) { // Look for a parameter defined in the query. for (Parameter parameter : query.parameters) { if (parameter.getName().equals(name)) { return parameter; } } // Look for a parameter defined in this statement. if (Util.lookup(RolapConnectionProperties.class, name) != null) { Object value = query.statement.getProperty(name); // TODO: Don't assume it's a string. // TODO: Create expression which will get the value from the // statement at the time the query is executed. Literal defaultValue = Literal.createString(String.valueOf(value)); return new ConnectionParameterImpl(name, defaultValue); } return super.getParameter(name); } public OlapElement lookupChild( OlapElement parent, IdentifierSegment segment, MatchType matchType) { // ignore matchType return lookupChild(parent, segment); } public OlapElement lookupChild( OlapElement parent, IdentifierSegment segment) { // Only look for calculated members and named sets defined in the // query. for (Formula formula : query.getFormulas()) { if (NameResolver.matches(formula, parent, segment)) { return formula.getElement(); } } return null; } public List getNamespaces() { final List list = new ArrayList(); list.add(this); list.addAll(super.getNamespaces()); return list; } } private static class ConnectionParameterImpl extends ParameterImpl { public ConnectionParameterImpl(String name, Literal defaultValue) { super(name, defaultValue, "Connection property", new StringType()); } public Scope getScope() { return Scope.Connection; } public void setValue(Object value) { throw MondrianResource.instance().ParameterIsNotModifiable.ex( getName(), getScope().name()); } } /** * Implementation of {@link mondrian.olap.Validator} that works within a * particular query. * *

It's unlikely that we would want a validator that is * NOT within a particular query, but by organizing the code this way, with * the majority of the code in {@link mondrian.olap.ValidatorImpl}, the * dependencies between Validator and Query are explicit. */ private static class QueryValidator extends ValidatorImpl { private final boolean alwaysResolveFunDef; private Query query; private final SchemaReader schemaReader; /** * Creates a QueryValidator. * * @param functionTable Function table * @param alwaysResolveFunDef Whether to always resolve function * definitions (see {@link #alwaysResolveFunDef()}) * @param query Query */ public QueryValidator( FunTable functionTable, boolean alwaysResolveFunDef, Query query, Map resolvedIdentifiers) { super(functionTable, resolvedIdentifiers); this.alwaysResolveFunDef = alwaysResolveFunDef; this.query = query; this.schemaReader = new ScopedSchemaReader(this, true); } public SchemaReader getSchemaReader() { return schemaReader; } protected void defineParameter(Parameter param) { final String name = param.getName(); query.parameters.add(param); query.parametersByName.put(name, param); } public Query getQuery() { return query; } public boolean alwaysResolveFunDef() { return alwaysResolveFunDef; } public ArrayStack getScopeStack() { return stack; } } /** * Schema reader that depends on the current scope during the validation * of a query. Depending on the scope, different calculated sets may be * visible. The scope is represented by the expression stack inside the * validator. */ private static class ScopedSchemaReader extends DelegatingSchemaReader implements NameResolver.Namespace { private final QueryValidator queryValidator; private final boolean accessControlled; /** * Creates a ScopedSchemaReader. * * @param queryValidator Validator that is being used to validate the * query * @param accessControlled Access controlled */ private ScopedSchemaReader( QueryValidator queryValidator, boolean accessControlled) { super(queryValidator.getQuery().getSchemaReader(accessControlled)); this.queryValidator = queryValidator; this.accessControlled = accessControlled; } public SchemaReader withoutAccessControl() { if (!accessControlled) { return this; } return new ScopedSchemaReader(queryValidator, false); } public List getNamespaces() { final List list = new ArrayList(); list.add(this); list.addAll(super.getNamespaces()); return list; } @Override public OlapElement lookupCompoundInternal( OlapElement parent, final List names, boolean failIfNotFound, int category, MatchType matchType) { switch (category) { case Category.Set: case Category.Unknown: final ScopedNamedSet namedSet = queryValidator.getQuery().lookupScopedNamedSet( names, queryValidator.getScopeStack()); if (namedSet != null) { return namedSet; } } return super.lookupCompoundInternal( parent, names, failIfNotFound, category, matchType); } public OlapElement lookupChild( OlapElement parent, IdentifierSegment segment, MatchType matchType) { // ignore matchType return lookupChild(parent, segment); } public OlapElement lookupChild( OlapElement parent, IdentifierSegment segment) { if (!(parent instanceof Cube)) { return null; } return queryValidator.getQuery().lookupScopedNamedSet( Collections.singletonList(Util.convert(segment)), queryValidator.getScopeStack()); } } public static class ScopedNamedSet implements NamedSet { private final String name; private final QueryPart scope; private Exp expr; /** * Creates a ScopedNamedSet. * * @param name Name * @param scope Scope of named set (the function call that encloses * the 'expr AS name', often GENERATE or FILTER) * @param expr Expression that defines the set */ private ScopedNamedSet(String name, QueryPart scope, Exp expr) { this.name = name; this.scope = scope; this.expr = expr; } public String getName() { return name; } public String getNameUniqueWithinQuery() { return System.identityHashCode(this) + ""; } public boolean isDynamic() { return true; } public Exp getExp() { return expr; } public void setExp(Exp expr) { this.expr = expr; } public void setName(String newName) { throw new UnsupportedOperationException(); } public Type getType() { return expr.getType(); } public Map getAnnotationMap() { return Collections.emptyMap(); } public NamedSet validate(Validator validator) { Exp newExpr = expr.accept(validator); final Type type = newExpr.getType(); if (type instanceof MemberType || type instanceof TupleType) { newExpr = new UnresolvedFunCall( "{}", Syntax.Braces, new Exp[] {newExpr}) .accept(validator); } this.expr = newExpr; return this; } public String getUniqueName() { return name; } public String getDescription() { throw new UnsupportedOperationException(); } public OlapElement lookupChild( SchemaReader schemaReader, Id.Segment s, MatchType matchType) { throw new UnsupportedOperationException(); } public String getQualifiedName() { throw new UnsupportedOperationException(); } public String getCaption() { throw new UnsupportedOperationException(); } public boolean isVisible() { throw new UnsupportedOperationException(); } public Hierarchy getHierarchy() { throw new UnsupportedOperationException(); } public Dimension getDimension() { throw new UnsupportedOperationException(); } public String getLocalized(LocalizedProperty prop, Locale locale) { throw new UnsupportedOperationException(); } } /** * Visitor that locates and registers parameters. */ private class ParameterFinder extends MdxVisitorImpl { public Object visit(ParameterExpr parameterExpr) { Parameter parameter = parameterExpr.getParameter(); if (!parameters.contains(parameter)) { parameters.add(parameter); parametersByName.put(parameter.getName(), parameter); } return null; } public Object visit(UnresolvedFunCall call) { if (call.getFunName().equals("Parameter")) { // Is there already a parameter with this name? String parameterName = ParameterFunDef.getParameterName(call.getArgs()); if (parametersByName.get(parameterName) != null) { throw MondrianResource.instance() .ParameterDefinedMoreThanOnce.ex(parameterName); } Type type = ParameterFunDef.getParameterType(call.getArgs()); // Create a temporary parameter. We don't know its // type yet. The default of NULL is temporary. Parameter parameter = new ParameterImpl( parameterName, Literal.nullValue, null, type); parameters.add(parameter); parametersByName.put(parameterName, parameter); } return null; } } /** * Visitor that locates and registers all aliased expressions * ('expr AS alias') as named sets. The resulting named sets have scope, * therefore they can only be seen and used within that scope. */ private class AliasedExpressionFinder extends MdxVisitorImpl { @Override public Object visit(QueryAxis queryAxis) { registerAlias(queryAxis, queryAxis.getSet()); return super.visit(queryAxis); } public Object visit(UnresolvedFunCall call) { registerAliasArgs(call); return super.visit(call); } public Object visit(ResolvedFunCall call) { registerAliasArgs(call); return super.visit(call); } /** * Registers all arguments of a function that are named sets. * * @param call Function call */ private void registerAliasArgs(FunCall call) { for (Exp exp : call.getArgs()) { registerAlias((QueryPart) call, exp); } } /** * Registers a named set if an expression is of the form "expr AS * alias". * * @param parent Parent node * @param exp Expression that may be an "AS" */ private void registerAlias(QueryPart parent, Exp exp) { if (exp instanceof FunCall) { FunCall call2 = (FunCall) exp; if (call2.getSyntax() == Syntax.Infix && call2.getFunName().equals("AS")) { // Scope is the function enclosing the 'AS' expression. // For example, in // Filter(Time.Children AS s, x > y) // the scope of the set 's' is the Filter function. assert call2.getArgCount() == 2; if (call2.getArg(1) instanceof Id) { final Id id = (Id) call2.getArg(1); createScopedNamedSet( ((Id.NameSegment) id.getSegments().get(0)) .getName(), parent, call2.getArg(0)); } else if (call2.getArg(1) instanceof NamedSetExpr) { NamedSetExpr set = (NamedSetExpr) call2.getArg(1); createScopedNamedSet( set.getNamedSet().getName(), parent, call2.getArg(0)); } } } } } } // End Query.java mondrian-3.11.0.1-R/src/main/mondrian/olap/QueryAxis.java000066400000000000000000000216501261646570300230310ustar00rootroot00000000000000/* // This software is subject to the terms of the Eclipse Public License v1.0 // Agreement, available at the following URL: // http://www.eclipse.org/legal/epl-v10.html. // You must accept the terms of that agreement to use this software. // // Copyright (C) 1998-2005 Julian Hyde // Copyright (C) 2005-2009 Pentaho and others // All Rights Reserved. */ package mondrian.olap; import mondrian.calc.*; import mondrian.mdx.*; import mondrian.olap.type.DimensionType; import mondrian.olap.type.*; import mondrian.resource.MondrianResource; import java.io.PrintWriter; /** * An axis in an MDX query. For example, the typical MDX query has two axes, * which appear as the "ON COLUMNS" and "ON ROWS" clauses. * * @author jhyde, 20 January, 1999 */ public class QueryAxis extends QueryPart { private boolean nonEmpty; private boolean ordered; private Exp exp; private final AxisOrdinal axisOrdinal; /** * Whether to show subtotals on this axis. * The "(show\hide)Subtotals" operation changes its valud. */ private SubtotalVisibility subtotalVisibility; private final Id[] dimensionProperties; /** * Creates an axis. * * @param nonEmpty Whether to filter out members of this axis whose cells * are all empty * @param set Expression to populate the axis * @param axisOrdinal Which axis (ROWS, COLUMNS, etc.) * @param subtotalVisibility Whether to show subtotals * @param dimensionProperties List of dimension properties */ public QueryAxis( boolean nonEmpty, Exp set, AxisOrdinal axisOrdinal, SubtotalVisibility subtotalVisibility, Id[] dimensionProperties) { assert dimensionProperties != null; assert axisOrdinal != null; this.nonEmpty = nonEmpty || (MondrianProperties.instance().EnableNonEmptyOnAllAxis.get() && !axisOrdinal.isFilter()); this.exp = set; this.axisOrdinal = axisOrdinal; this.subtotalVisibility = subtotalVisibility; this.dimensionProperties = dimensionProperties; this.ordered = false; } /** * Creates an axis with no dimension properties. * * @see #QueryAxis(boolean,Exp,AxisOrdinal,mondrian.olap.QueryAxis.SubtotalVisibility,Id[]) */ public QueryAxis( boolean nonEmpty, Exp set, AxisOrdinal axisOrdinal, SubtotalVisibility subtotalVisibility) { this(nonEmpty, set, axisOrdinal, subtotalVisibility, new Id[0]); } public Object clone() { return new QueryAxis( nonEmpty, exp.clone(), axisOrdinal, subtotalVisibility, dimensionProperties.clone()); } static QueryAxis[] cloneArray(QueryAxis[] a) { QueryAxis[] a2 = new QueryAxis[a.length]; for (int i = 0; i < a.length; i++) { a2[i] = (QueryAxis) a[i].clone(); } return a2; } public Object accept(MdxVisitor visitor) { final Object o = visitor.visit(this); if (visitor.shouldVisitChildren()) { // visit the expression which forms the axis exp.accept(visitor); } return o; } public Calc compile(ExpCompiler compiler, ResultStyle resultStyle) { Exp exp = this.exp; if (axisOrdinal.isFilter()) { exp = normalizeSlicerExpression(exp); exp = exp.accept(compiler.getValidator()); } switch (resultStyle) { case LIST: return compiler.compileList(exp, false); case MUTABLE_LIST: return compiler.compileList(exp, true); case ITERABLE: return compiler.compileIter(exp); default: throw Util.unexpected(resultStyle); } } private static Exp normalizeSlicerExpression(Exp exp) { Exp slicer = exp; if (slicer instanceof LevelExpr || slicer instanceof HierarchyExpr || slicer instanceof DimensionExpr) { slicer = new UnresolvedFunCall( "DefaultMember", Syntax.Property, new Exp[] { slicer}); } if (slicer == null) { ; } else if (slicer instanceof FunCall && ((FunCall) slicer).getSyntax() == Syntax.Parentheses) { slicer = new UnresolvedFunCall( "{}", Syntax.Braces, new Exp[] {slicer}); } else { slicer = new UnresolvedFunCall( "{}", Syntax.Braces, new Exp[] { new UnresolvedFunCall( "()", Syntax.Parentheses, new Exp[] { slicer})}); } return slicer; } public String getAxisName() { return axisOrdinal.name(); } /** * Returns the ordinal of this axis, for example * {@link mondrian.olap.AxisOrdinal.StandardAxisOrdinal#ROWS}. */ public AxisOrdinal getAxisOrdinal() { return axisOrdinal; } /** * Returns whether the axis has the NON EMPTY property set. */ public boolean isNonEmpty() { return nonEmpty; } /** * Sets whether the axis has the NON EMPTY property set. * See {@link #isNonEmpty()}. */ public void setNonEmpty(boolean nonEmpty) { this.nonEmpty = nonEmpty; } /** * Returns whether the axis has the ORDER property set. */ public boolean isOrdered() { return ordered; } /** * Sets whether the axis has the ORDER property set. */ public void setOrdered(boolean ordered) { this.ordered = ordered; } /** * Returns the expression which is used to compute the value of this axis. */ public Exp getSet() { return exp; } /** * Sets the expression which is used to compute the value of this axis. * See {@link #getSet()}. */ public void setSet(Exp set) { this.exp = set; } public void resolve(Validator validator) { exp = validator.validate(exp, false); final Type type = exp.getType(); if (!TypeUtil.isSet(type)) { // If expression is a member or a tuple, implicitly convert it // into a set. Dimensions and hierarchies can be converted to // members, thence to sets. if (type instanceof MemberType || type instanceof TupleType || type instanceof DimensionType || type instanceof HierarchyType) { exp = new UnresolvedFunCall( "{}", Syntax.Braces, new Exp[] {exp}); exp = validator.validate(exp, false); } else { throw MondrianResource.instance().MdxAxisIsNotSet.ex( axisOrdinal.name()); } } } public Object[] getChildren() { return new Object[] {exp}; } public void unparse(PrintWriter pw) { if (nonEmpty) { pw.print("NON EMPTY "); } if (exp != null) { exp.unparse(pw); } if (dimensionProperties.length > 0) { pw.print(" DIMENSION PROPERTIES "); for (int i = 0; i < dimensionProperties.length; i++) { Id dimensionProperty = dimensionProperties[i]; if (i > 0) { pw.print(", "); } dimensionProperty.unparse(pw); } } if (!axisOrdinal.isFilter()) { pw.print(" ON " + axisOrdinal.name()); } } public void addLevel(Level level) { Util.assertTrue(level != null, "addLevel needs level"); exp = new UnresolvedFunCall( "Crossjoin", Syntax.Function, new Exp[] { exp, new UnresolvedFunCall( "Members", Syntax.Property, new Exp[] { new LevelExpr(level)})}); } void setSubtotalVisibility(boolean bShowSubtotals) { subtotalVisibility = bShowSubtotals ? SubtotalVisibility.Show : SubtotalVisibility.Hide; } public SubtotalVisibility getSubtotalVisibility() { return subtotalVisibility; } public void resetSubtotalVisibility() { this.subtotalVisibility = SubtotalVisibility.Undefined; } public void validate(Validator validator) { if (axisOrdinal.isFilter()) { if (exp != null) { exp = validator.validate(exp, false); } } } public Id[] getDimensionProperties() { return dimensionProperties; } /** * SubtotalVisibility enumerates the allowed values of * whether subtotals are visible. */ public enum SubtotalVisibility { Undefined, Hide, Show; } } // End QueryAxis.java mondrian-3.11.0.1-R/src/main/mondrian/olap/QueryCanceledException.java000066400000000000000000000016111261646570300254750ustar00rootroot00000000000000/* // This software is subject to the terms of the Eclipse Public License v1.0 // Agreement, available at the following URL: // http://www.eclipse.org/legal/epl-v10.html. // You must accept the terms of that agreement to use this software. // // Copyright (C) 2004-2005 TONBELLER AG // Copyright (C) 2005-2007 Pentaho and others // All Rights Reserved. */ package mondrian.olap; /** * Exception which indicates that a query was canceled by an end-user. * *

See also {@link mondrian.olap.QueryTimeoutException}, which indicates that * a query was canceled automatically due to a timeout. */ public class QueryCanceledException extends ResultLimitExceededException { /** * Creates a QueryCanceledException. * * @param message Localized error message */ public QueryCanceledException(String message) { super(message); } } // End QueryCanceledException.java mondrian-3.11.0.1-R/src/main/mondrian/olap/QueryPart.java000066400000000000000000000025151261646570300230320ustar00rootroot00000000000000/* // This software is subject to the terms of the Eclipse Public License v1.0 // Agreement, available at the following URL: // http://www.eclipse.org/legal/epl-v10.html. // You must accept the terms of that agreement to use this software. // // Copyright (C) 1998-2005 Julian Hyde // Copyright (C) 2005-2011 Pentaho and others // All Rights Reserved. */ package mondrian.olap; import java.io.PrintWriter; /** * Component of an MDX query (derived classes include Query, Axis, Exp, Level). * * @author jhyde, 23 January, 1999 */ public abstract class QueryPart implements Walkable { /** * Creates a QueryPart. */ QueryPart() { } /** * Writes a string representation of this parse tree * node to the given writer. * * @param pw writer */ public void unparse(PrintWriter pw) { pw.print(toString()); } // implement Walkable public Object[] getChildren() { // By default, a QueryPart is atomic (has no children). return null; } /** * Returns the plan that Mondrian intends to use to execute this query. * * @param pw Print writer */ public void explain(PrintWriter pw) { throw new UnsupportedOperationException( "explain not implemented for " + this + " (" + getClass() + ")"); } } // End QueryPart.java mondrian-3.11.0.1-R/src/main/mondrian/olap/QueryTimeoutException.java000066400000000000000000000014511261646570300254270ustar00rootroot00000000000000/* // This software is subject to the terms of the Eclipse Public License v1.0 // Agreement, available at the following URL: // http://www.eclipse.org/legal/epl-v10.html. // You must accept the terms of that agreement to use this software. // // Copyright (C) 2004-2005 TONBELLER AG // Copyright (C) 2005-2007 Pentaho and others // All Rights Reserved. */ package mondrian.olap; /** * Exception which indicates that a query executed for longer than its allowed * time and was automatically canceled. */ public class QueryTimeoutException extends ResultLimitExceededException { /** * Creates a QueryTimeoutException. * * @param message Localized error message */ public QueryTimeoutException(String message) { super(message); } } // End QueryTimeoutException.java mondrian-3.11.0.1-R/src/main/mondrian/olap/QueryTiming.java000066400000000000000000000155661261646570300233650ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.olap; import mondrian.util.ArrayStack; import java.util.*; /** * Provides hooks for recording timing information of components of Query * execution. * *

NOTE: This class is experimental and subject to change/removal * without notice. * *

Code that executes as part of a Query can call * {@link QueryTiming#markStart(String)} * before executing, and {@link QueryTiming#markEnd(String)} afterwards, or can * track execution times manually and call * {@link QueryTiming#markFull(String, long)}. * *

To read timing information, add a handler to the statement using * {@link mondrian.server.Statement#enableProfiling} and implement the * {@link mondrian.spi.ProfileHandler#explain(String, QueryTiming)} method. * * @author jbarnett */ public class QueryTiming { private boolean enabled; private final ArrayStack currentTimings = new ArrayStack(); private final Map> timings = new HashMap>(); private final Map fullTimings = new HashMap(); /** * Initializes (or re-initializes) a query timing, also setting whether * enabled. All previous stats are removed. * * @param enabled Whether to collect stats in future */ public synchronized void init(boolean enabled) { this.enabled = enabled; currentTimings.clear(); timings.clear(); fullTimings.clear(); } public void done() { } /** * Marks the start of a Query component's execution. * * @param name Name of the component */ public synchronized final void markStart(String name) { if (enabled) { markStartInternal(name); } } /** * Marks the end of a Query component's execution. * * @param name Name of the component */ public synchronized final void markEnd(String name) { if (enabled) { long tstamp = System.currentTimeMillis(); markEndInternal(name, tstamp); } } /** * Marks the duration of a Query component's execution. * * @param name Name of the component * @param duration Duration of the execution */ public synchronized final void markFull(String name, long duration) { if (enabled) { markFullInternal(name, duration); } } private void markStartInternal(String name) { currentTimings.push(new TimingInfo(name)); } private void markEndInternal(String name, long tstamp) { if (currentTimings.isEmpty() || !currentTimings.peek().name.equals(name)) { throw new IllegalStateException("end but no start for " + name); } TimingInfo finished = currentTimings.pop(); assert finished.name.equals(name); finished.markEnd(tstamp); List timingList = timings.get(finished.name); if (timingList == null) { timingList = new ArrayList(); timings.put(finished.name, timingList); } timingList.add(new StartEnd(finished.startTime, finished.endTime)); } private void markFullInternal(String name, long duration) { DurationCount p = fullTimings.get(name); if (p == null) { p = new DurationCount(); fullTimings.put(name, p); } p.count++; p.duration += duration; } public synchronized String toString() { StringBuilder sb = new StringBuilder(); for (Map.Entry> entry : timings.entrySet()) { if (sb.length() > 0) { sb.append(Util.nl); } long total = 0; for (StartEnd durection : entry.getValue()) { total += (durection.endTime - durection.startTime); } int count = entry.getValue().size(); sb.append(entry.getKey()) .append(" invoked ") .append(count) .append(" times for total of ") .append(total) .append("ms. (Avg. ") .append(total / count) .append("ms/invocation)"); } for (Map.Entry entry : fullTimings.entrySet()) { if (sb.length() > 0) { sb.append(Util.nl); } sb.append(entry.getKey()) .append(" invoked ") .append(entry.getValue().count) .append(" times for total of ") .append(entry.getValue().duration) .append("ms. (Avg. ") .append(entry.getValue().duration / entry.getValue().count) .append("ms/invocation)"); } return sb.toString(); } /** * @return a collection of all Query component names */ public synchronized Collection getTimingKeys() { Set keys = new HashSet(); keys.addAll(timings.keySet()); keys.addAll(fullTimings.keySet()); return keys; } /** * @param key Name of the Query component to get timing information on * @return a List of durations */ public synchronized List getTimings(String key) { List timingList = new ArrayList(); List regTime = timings.get(key); if (regTime != null) { for (StartEnd timing : regTime) { timingList.add(timing.endTime - timing.startTime); } } DurationCount qTime = fullTimings.get(key); if (qTime != null) { final Long duration = qTime.duration; for (int i = 0; i < qTime.count; i++) { timingList.add(duration); } } return timingList; } private static class TimingInfo { private final String name; private final long startTime; private long endTime; private TimingInfo(String name) { this.name = name; this.startTime = System.currentTimeMillis(); } private void markEnd(long tstamp) { this.endTime = tstamp; } } private static class StartEnd { final long startTime; final long endTime; public StartEnd(long startTime, long endTime) { this.startTime = startTime; this.endTime = endTime; } } private static class DurationCount { long duration; long count; } } // End QueryTiming.java mondrian-3.11.0.1-R/src/main/mondrian/olap/ResourceLimitExceededException.java000066400000000000000000000014221261646570300271660ustar00rootroot00000000000000/* // This software is subject to the terms of the Eclipse Public License v1.0 // Agreement, available at the following URL: // http://www.eclipse.org/legal/epl-v10.html. // You must accept the terms of that agreement to use this software. // // Copyright (C) 2004-2005 TONBELLER AG // Copyright (C) 2006-2009 Pentaho and others // All Rights Reserved. */ package mondrian.olap; /** * Exception which indicates some resource limit was exceeded. */ public class ResourceLimitExceededException extends ResultLimitExceededException { /** * Creates a ResourceLimitExceededException * * @param message Localized message */ public ResourceLimitExceededException(String message) { super(message); } } // End ResourceLimitExceededException.java mondrian-3.11.0.1-R/src/main/mondrian/olap/Result.java000066400000000000000000000021251261646570300223510ustar00rootroot00000000000000/* // This software is subject to the terms of the Eclipse Public License v1.0 // Agreement, available at the following URL: // http://www.eclipse.org/legal/epl-v10.html. // You must accept the terms of that agreement to use this software. // // Copyright (C) 2001-2005 Julian Hyde // Copyright (C) 2005-2011 Pentaho and others // All Rights Reserved. */ package mondrian.olap; import java.io.PrintWriter; /** * A Result is the result of running an MDX query. See {@link * Connection#execute}. * * @author jhyde * @since 6 August, 2001 */ public interface Result { /** Returns the query which generated this result. */ Query getQuery(); /** Returns the non-slicer axes. */ Axis[] getAxes(); /** Returns the slicer axis. */ Axis getSlicerAxis(); /** Returns the cell at a given set of coordinates. For example, in a result * with 4 columns and 6 rows, the top-left cell has coordinates [0, 0], * and the bottom-right cell has coordinates [3, 5]. */ Cell getCell(int[] pos); void print(PrintWriter pw); void close(); } // End Result.java mondrian-3.11.0.1-R/src/main/mondrian/olap/ResultBase.java000066400000000000000000000106441261646570300231510ustar00rootroot00000000000000/* // This software is subject to the terms of the Eclipse Public License v1.0 // Agreement, available at the following URL: // http://www.eclipse.org/legal/epl-v10.html. // You must accept the terms of that agreement to use this software. // // Copyright (C) 2001-2005 Julian Hyde // Copyright (C) 2005-2011 Pentaho and others // All Rights Reserved. */ package mondrian.olap; import mondrian.server.Execution; import mondrian.server.Statement; import org.apache.log4j.Logger; import java.io.PrintWriter; import java.util.List; /** * Skeleton implementation of {@link Result}. * * @author jhyde * @since 10 August, 2001 */ public abstract class ResultBase implements Result { protected final Execution execution; protected final Statement statement; protected final Query query; protected final Axis[] axes; protected Axis slicerAxis; protected ResultBase(Execution execution, Axis[] axes) { this.execution = execution; this.statement = execution.getMondrianStatement(); this.query = statement.getQuery(); assert query != null; this.axes = axes == null ? new Axis[query.getAxes().length] : axes; } protected abstract Logger getLogger(); public Query getQuery() { return statement.getQuery(); } // implement Result public Axis[] getAxes() { return axes; } // implement Result public Axis getSlicerAxis() { return slicerAxis; } // implement Result public void print(PrintWriter pw) { for (int i = -1; i < axes.length; i++) { pw.println("Axis #" + (i + 1) + ":"); printAxis(pw, i < 0 ? slicerAxis : axes[i]); } // Usually there are 3 axes: {slicer, columns, rows}. Position is a // {column, row} pair. We call printRows with axis=2. When it recurses // to axis=-1, it prints. int[] pos = new int[axes.length]; printRows(pw, axes.length - 1, pos); } private void printRows(PrintWriter pw, int axis, int[] pos) { if (axis < 0) { printCell(pw, pos); } else { Axis _axis = axes[axis]; List positions = _axis.getPositions(); for (int i = 0; i < positions.size(); i++) { pos[axis] = i; if (axis == 0) { int row = axis + 1 < pos.length ? pos[axis + 1] : 0; pw.print("Row #" + row + ": "); } printRows(pw, axis - 1, pos); if (axis == 0) { pw.println(); } } } } private void printAxis(PrintWriter pw, Axis axis) { List positions = axis.getPositions(); for (Position position : positions) { boolean firstTime = true; pw.print("{"); for (Member member : position) { if (member.getDimension().isHighCardinality()) { pw.println(" -- High cardinality dimension --}"); return; } if (! firstTime) { pw.print(", "); } pw.print(member.getUniqueName()); firstTime = false; } pw.println("}"); } } private void printCell(PrintWriter pw, int[] pos) { Cell cell = getCell(pos); pw.print(cell.getFormattedValue()); } /** * Returns the current member of a given hierarchy at a given location. * * @param pos Coordinates in cell set * @param hierarchy Hierarchy * @return current member of given hierarchy */ public Member getMember(int[] pos, Hierarchy hierarchy) { for (int i = -1; i < axes.length; i++) { Axis axis = slicerAxis; int index = 0; if (i >= 0) { axis = axes[i]; index = pos[i]; } List positions = axis.getPositions(); Position position = positions.get(index); for (Member member : position) { if (member.getHierarchy() == hierarchy) { return member; } } } return hierarchy.getHierarchy().getDefaultMember(); } public void close() { } } // End ResultBase.java mondrian-3.11.0.1-R/src/main/mondrian/olap/ResultLimitExceededException.java000066400000000000000000000014241261646570300266570ustar00rootroot00000000000000/* // This software is subject to the terms of the Eclipse Public License v1.0 // Agreement, available at the following URL: // http://www.eclipse.org/legal/epl-v10.html. // You must accept the terms of that agreement to use this software. // // Copyright (C) 2004-2005 TONBELLER AG // Copyright (C) 2005-2007 Pentaho and others // All Rights Reserved. */ package mondrian.olap; /** * Abstract base class for exceptions that indicate some limit was exceeded. */ public abstract class ResultLimitExceededException extends MondrianException { /** * Creates a ResultLimitExceededException. * * @param message Localized message */ public ResultLimitExceededException(String message) { super(message); } } // End ResultLimitExceededException.java mondrian-3.11.0.1-R/src/main/mondrian/olap/ResultStyleException.java000066400000000000000000000041301261646570300252470ustar00rootroot00000000000000/* // This software is subject to the terms of the Eclipse Public License v1.0 // Agreement, available at the following URL: // http://www.eclipse.org/legal/epl-v10.html. // You must accept the terms of that agreement to use this software. // // Copyright (C) 2004-2005 TONBELLER AG // Copyright (C) 2006-2011 Pentaho and others // All Rights Reserved. */ package mondrian.olap; import mondrian.calc.ResultStyle; import java.util.List; /** * Exception that indicates a compiler could not implement an expression in any * of the result styles requested by the client. * * @author Richard Emberson */ public class ResultStyleException extends MondrianException { public static ResultStyleException generate( List producer, List consumer) { StringBuilder buf = new StringBuilder(); buf.append("Producer expected ResultStyles: "); buf.append('{'); for (int i = 0; i < producer.size(); i++) { if (i > 0) { buf.append(','); } buf.append(producer.get(i)); } buf.append('}'); buf.append(" but Consumer wanted: "); buf.append('{'); for (int i = 0; i < consumer.size(); i++) { if (i > 0) { buf.append(','); } buf.append(consumer.get(i)); } buf.append('}'); throw new ResultStyleException(buf.toString()); } public static ResultStyleException generateBadType( List wanted, ResultStyle got) { StringBuilder buf = new StringBuilder(); buf.append("Wanted ResultStyles: "); buf.append('{'); for (int i = 0; i < wanted.size(); i++) { if (i > 0) { buf.append(','); } buf.append(wanted.get(i)); } buf.append('}'); buf.append(" but got: "); buf.append(got); return new ResultStyleException(buf.toString()); } public ResultStyleException(String message) { super(message); } } // End ResultStyleException.java mondrian-3.11.0.1-R/src/main/mondrian/olap/Role.java000066400000000000000000000130511261646570300217740ustar00rootroot00000000000000/* // This software is subject to the terms of the Eclipse Public License v1.0 // Agreement, available at the following URL: // http://www.eclipse.org/legal/epl-v10.html. // You must accept the terms of that agreement to use this software. // // Copyright (C) 2002-2005 Julian Hyde // Copyright (C) 2005-2009 Pentaho and others // All Rights Reserved. // // jhyde, Oct 5, 2002 */ package mondrian.olap; /** * A Role is a collection of access rights to cubes, permissions, * and so forth. * *

At present, the only way to create a role is programmatically. You then * add appropriate permissions, and associate the role with a connection. * Queries executed for the duration of the connection will be using the role * for security control. * *

Mondrian does not have any notion of a 'user'. It is the client * application's responsibility to create a role appropriate for the user who * is establishing the connection. * * @author jhyde * @since Oct 5, 2002 */ public interface Role { /** * Returns the access this role has to a given schema. * * @pre schema != null * @post return == Access.ALL * || return == Access.NONE * || return == Access.ALL_DIMENSIONS */ Access getAccess(Schema schema); /** * Returns the access this role has to a given cube. * * @pre cube != null * @post return == Access.ALL || return == Access.NONE */ Access getAccess(Cube cube); /** * Represents the access that a role has to a particular hierarchy. */ public interface HierarchyAccess { /** * Returns the access the current role has to a given member. * *

Visibility is:

    *
  • {@link Access#NONE} if member is not visible, *
  • {@link Access#ALL} if member and all children are visible, *
  • {@link Access#CUSTOM} if some of the children are not visible. *

* *

For these purposes, children which are below the bottom level are * regarded as visible.

* * @param member Member. * @return Return current role's access to member. */ Access getAccess(Member member); /** * Returns the depth of the highest level to which the current Role has * access. The 'all' level, if present, has a depth of zero. * * @return Returns depth of the highest accessible level. */ int getTopLevelDepth(); /** * Returns the depth of the lowest level to which the current Role has * access. The 'all' level, if present, has a depth of zero. * * @return Returns depth of the lowest accessible level. */ int getBottomLevelDepth(); /** * Returns the policy by which cell values are calculated if not all * of a member's children are visible. * * @return Returns rollup policy. */ RollupPolicy getRollupPolicy(); /** * Returns true if at least one of the descendants of the * given Member is inaccessible to this Role. * *

Descendants which are inaccessible because they are below the * bottom level are ignored. * * @param member Member * @return Returns whether a descendant is inaccessible. */ boolean hasInaccessibleDescendants(Member member); } /** * Returns the access this role has to a given dimension. * * @pre dimension != null * @post Access.instance().isValid(return) */ Access getAccess(Dimension dimension); /** * Returns the access this role has to a given hierarchy. * * @pre hierarchy != null * @post return == Access.NONE * || return == Access.ALL * || return == Access.CUSTOM */ Access getAccess(Hierarchy hierarchy); /** * Returns the details of this hierarchy's access, or null if the hierarchy * has not been given explicit access. * * @pre hierarchy != null */ HierarchyAccess getAccessDetails(Hierarchy hierarchy); /** * Returns the access this role has to a given level. * * @pre level != null * @post Access.instance().isValid(return) */ Access getAccess(Level level); /** * Returns the access this role has to a given member. * * @pre member != null * @pre isMutable() * @post return == Access.NONE * || return == Access.ALL * || return == Access.CUSTOM */ Access getAccess(Member member); /** * Returns the access this role has to a given named set. * * @pre set != null * @pre isMutable() * @post return == Access.NONE || return == Access.ALL */ Access getAccess(NamedSet set); /** * Returns whether this role is allowed to see a given element. * @pre olapElement != null */ boolean canAccess(OlapElement olapElement); /** * Enumeration of the policies by which a cell is calculated if children * of a member are not accessible. */ enum RollupPolicy { /** * The value of the cell is null if any of the children are * inaccessible. */ HIDDEN, /** * The value of the cell is obtained by rolling up the values of * accessible children. */ PARTIAL, /** * The value of the cell is obtained by rolling up the values of all * children. */ FULL, } } // End Role.java mondrian-3.11.0.1-R/src/main/mondrian/olap/RoleImpl.java000066400000000000000000001276271261646570300226350ustar00rootroot00000000000000/* // This software is subject to the terms of the Eclipse Public License v1.0 // Agreement, available at the following URL: // http://www.eclipse.org/legal/epl-v10.html. // You must accept the terms of that agreement to use this software. // // Copyright (C) 2002-2005 Julian Hyde // Copyright (C) 2005-2015 Pentaho and others // All Rights Reserved. */ package mondrian.olap; import mondrian.rolap.RolapCube; import mondrian.rolap.RolapCubeDimension; import org.apache.log4j.Logger; import java.util.*; /** * Default implementation of the {@link Role} interface. * * @author jhyde, lucboudreau * @since Oct 5, 2002 */ public class RoleImpl implements Role { private boolean mutable = true; private final Map schemaGrants = new HashMap(); private final Map cubeGrants = new HashMap(); private final Map dimensionGrants = new HashMap(); private final Map hierarchyGrants = new HashMap(); private static final Logger LOGGER = Logger.getLogger(RoleImpl.class); private final List hashCache = new ArrayList(); private int hash = 0; /** * Creates a role with no permissions. */ public RoleImpl() { } public int hashCode() { // Although this code isn't entirely thread safe, it is good enough. // The implementations of Role are not expected to be thread safe, // but are only to be immutable once isMutable() returns true. // // Role objects are only often hashed for tuple list caches and only // once per mondrian schema per mondrian instance. If heavier usage // is added, this should probably be refactored into something more // thread safe with a ReentrantReadWriteLock. if (hash == 0) { int tmpHash = 7; for (Object obj : hashCache) { tmpHash = Util.hash(tmpHash, obj); } hash = tmpHash; } return hash; } public boolean equals(Object obj) { if (obj == null) { return false; } if (!(obj instanceof RoleImpl)) { return false; } final RoleImpl r = (RoleImpl) obj; return r.hashCache.equals(this.hashCache); } protected RoleImpl clone() { RoleImpl role = new RoleImpl(); role.mutable = mutable; role.schemaGrants.putAll(schemaGrants); role.cubeGrants.putAll(cubeGrants); role.dimensionGrants.putAll(dimensionGrants); role.hashCache.addAll(hashCache); for (Map.Entry entry : hierarchyGrants.entrySet()) { role.hierarchyGrants.put( entry.getKey(), (HierarchyAccessImpl) entry.getValue().clone()); } return role; } /** * Returns a copy of this Role which can be modified. */ public RoleImpl makeMutableClone() { RoleImpl role = clone(); role.mutable = true; return role; } /** * Prevents any further modifications. * @post !isMutable() */ public void makeImmutable() { mutable = false; } /** * Returns whether modifications are possible. */ public boolean isMutable() { return mutable; } /** * Defines access to all cubes and dimensions in a schema. * * @param schema Schema whose access to grant/deny. * @param access An {@link Access access code} * * @pre schema != null * @pre access == Access.ALL || access == Access.NONE * || access == Access.ALL_DIMENSIONS * @pre isMutable() */ public void grant(Schema schema, Access access) { assert schema != null; assert isMutable(); schemaGrants.put(schema, access); hashCache.add( new Object[] { schema.getId(), access.name()}); hash = 0; } public Access getAccess(Schema schema) { assert schema != null; final Access schemaAccess = schemaGrants.get(schema); if (schemaAccess == null) { // No specific rules means full access. return Access.CUSTOM; } else { return schemaAccess; } } /** * Converts a null Access object to {@link Access#NONE}. * * @param access Access object or null * @return Access object, never null */ private static Access toAccess(Access access) { return access == null ? Access.NONE : access; } /** * Defines access to a cube. * * @param cube Cube whose access to grant/deny. * @param access An {@link Access access code} * * @pre cube != null * @pre access == Access.ALL || access == Access.NONE * @pre isMutable() */ public void grant(Cube cube, Access access) { Util.assertPrecondition(cube != null, "cube != null"); assert access == Access.ALL || access == Access.NONE || access == Access.CUSTOM; Util.assertPrecondition(isMutable(), "isMutable()"); LOGGER.trace( "Grant " + access + " on cube " + cube.getName()); cubeGrants.put(cube, access); // Set the schema's access to 'custom' if no rules already exist. final Access schemaAccess = getAccess(cube.getSchema()); if (schemaAccess == Access.NONE) { LOGGER.trace( "Cascading grant " + Access.CUSTOM + " on schema " + cube.getSchema().getName()); grant(cube.getSchema(), Access.CUSTOM); } hashCache.add( new Object[] { cube.getClass().getName(), cube.getName(), access.name()}); hash = 0; } public Access getAccess(Cube cube) { assert cube != null; // Check for explicit rules. // Both 'custom' and 'all' are good enough Access access = cubeGrants.get(cube); if (access != null) { LOGGER.trace( "Access level " + access + " granted to cube " + cube.getName()); return access; } // Check for inheritance from the parent schema // 'All Dimensions' and 'custom' are not good enough access = schemaGrants.get(cube.getSchema()); if (access == Access.ALL) { LOGGER.trace( "Access level " + access + " granted to cube " + cube.getName() + " because of the grant to schema " + cube.getSchema().getName()); return Access.ALL; } // Deny access LOGGER.trace( "Access denided to cube" + cube.getName()); return Access.NONE; } /** * Defines access to a dimension. * * @param dimension Dimension whose access to grant/deny. * @param access An Access instance * * @pre dimension != null * @pre access == Access.ALL || access == Access.CUSTOM * || access == Access.NONE * @pre isMutable() */ public void grant(Dimension dimension, Access access) { assert dimension != null; assert access == Access.ALL || access == Access.NONE || access == Access.CUSTOM; Util.assertPrecondition(isMutable(), "isMutable()"); LOGGER.trace( "Grant " + access + " on dimension " + dimension.getUniqueName()); dimensionGrants.put(dimension, access); // Dimension grants do not cascade to the parent cube automatically. // We always figure out the inheritance at runtime since the place // where the dimension is used (either inside of a virtual cube, // a shared dimension or a cube) will influence on the decision. hashCache.add( new Object[] { dimension.getClass().getName(), dimension.getName(), access.name()}); hash = 0; } public Access getAccess(Dimension dimension) { assert dimension != null; // Check for explicit rules. Access access = getDimensionGrant(dimension); if (access == Access.CUSTOM) { // For legacy reasons, if there are no accessible hierarchies // and the dimension has an access level of custom, we deny. // TODO Remove for Mondrian 4.0 boolean canAccess = false; for (Hierarchy hierarchy : dimension.getHierarchies()) { final HierarchyAccessImpl hierarchyAccess = hierarchyGrants.get(hierarchy); if (hierarchyAccess != null && hierarchyAccess.access != Access.NONE) { canAccess = true; } } if (canAccess) { LOGGER.trace( "Access level " + access + " granted to dimension " + dimension.getUniqueName() + " because of the grant to one of its hierarchy."); return Access.CUSTOM; } else { LOGGER.trace( "Access denided to dimension " + dimension.getUniqueName() + " because there are no hierarchies accessible."); return Access.NONE; } } else if (access != null) { LOGGER.trace( "Access level " + access + " granted to dimension " + dimension.getUniqueName() + " because of explicit access rights."); return access; } // Check if this dimension inherits the cube's access rights. // 'Custom' level is not good enough for inherited access. access = checkDimensionAccessByCubeInheritance(dimension); if (access != Access.NONE) { LOGGER.trace( "Access level " + access + " granted to dimension " + dimension.getUniqueName() + " because of the grant to its parent cube."); return access; } // Check access at the schema level. // Levels of 'custom' and 'none' are not good enough. switch (getAccess(dimension.getSchema())) { case ALL: LOGGER.trace( "Access level ALL " + " granted to dimension " + dimension.getUniqueName() + " because of the grant to schema " + dimension.getSchema().getName()); return Access.ALL; case ALL_DIMENSIONS: // For all_dimensions to work, the cube access must be // at least 'custom' level if (access != Access.NONE) { return Access.ALL; } else { return Access.NONE; } default: LOGGER.trace( "Access denided to dimension " + dimension.getUniqueName() + " because of the access level of schema " + dimension.getSchema().getName()); return Access.NONE; } } private Access getDimensionGrant(final Dimension dimension) { if (dimension.isMeasures()) { for (Dimension key : dimensionGrants.keySet()) { if (key == dimension) { return dimensionGrants.get(key); } } return null; } else { return dimensionGrants.get(dimension); } } /** * This method is used to check if the access rights over a dimension * that might be inherited from the parent cube. *

It only checks for inherited access, and it presumes that there * are no dimension grants currently given to the dimension passed as an * argument. */ private Access checkDimensionAccessByCubeInheritance(Dimension dimension) { assert dimensionGrants.containsKey(dimension) == false || dimension.isMeasures(); for (Map.Entry cubeGrant : cubeGrants.entrySet()) { final Access access = toAccess(cubeGrant.getValue()); // The 'none' and 'custom' access level are not good enough if (access == Access.NONE || access == Access.CUSTOM) { continue; } final Dimension[] dimensions = cubeGrant.getKey().getDimensions(); for (Dimension dimension1 : dimensions) { // If the dimensions have the same identity, // we found an access rule. if (dimension == dimension1) { return cubeGrant.getValue(); } // If the passed dimension argument is of class // RolapCubeDimension, we must validate the cube // assignment and make sure the cubes are the same. // If not, skip to the next grant. if (dimension instanceof RolapCubeDimension && dimension.equals(dimension1) && !((RolapCubeDimension)dimension1) .getCube() .equals(cubeGrant.getKey())) { continue; } // Last thing is to allow for equality correspondences // to work with virtual cubes. if (cubeGrant.getKey() instanceof RolapCube && ((RolapCube)cubeGrant.getKey()).isVirtual() && dimension.equals(dimension1)) { return cubeGrant.getValue(); } } } return Access.NONE; } /** * Defines access to a hierarchy. * * @param hierarchy Hierarchy whose access to grant/deny. * @param access An {@link Access access code} * @param topLevel Top-most level which can be accessed, or null if the * highest level. May only be specified if access is * {@link mondrian.olap.Access#CUSTOM}. * @param bottomLevel Bottom-most level which can be accessed, or null if * the lowest level. May only be specified if access is * {@link mondrian.olap.Access#CUSTOM}. * * @param rollupPolicy Rollup policy * * @pre hierarchy != null * @pre Access.instance().isValid(access) * @pre (access == Access.CUSTOM) * || (topLevel == null && bottomLevel == null) * @pre topLevel == null || topLevel.getHierarchy() == hierarchy * @pre bottomLevel == null || bottomLevel.getHierarchy() == hierarchy * @pre isMutable() */ public void grant( Hierarchy hierarchy, Access access, Level topLevel, Level bottomLevel, RollupPolicy rollupPolicy) { assert hierarchy != null; assert access != null; assert (access == Access.CUSTOM) || (topLevel == null && bottomLevel == null); assert topLevel == null || topLevel.getHierarchy() == hierarchy; assert bottomLevel == null || bottomLevel.getHierarchy() == hierarchy; assert isMutable(); assert rollupPolicy != null; LOGGER.trace( "Granting access " + access + " on hierarchy " + hierarchy.getUniqueName()); hierarchyGrants.put( hierarchy, new HierarchyAccessImpl( this, hierarchy, access, topLevel, bottomLevel, rollupPolicy)); // Cascade the access right to 'custom' on the parent dim if necessary final Access dimAccess = toAccess(dimensionGrants.get(hierarchy.getDimension())); if (dimAccess == Access.NONE) { LOGGER.trace( "Cascading grant CUSTOM on dimension " + hierarchy.getDimension().getUniqueName() + " because of the grant to hierarchy" + hierarchy.getUniqueName()); grant(hierarchy.getDimension(), Access.CUSTOM); } hashCache.add( new Object[] { hierarchy.getClass().getName(), hierarchy.getName(), access.name()}); hash = 0; } public Access getAccess(Hierarchy hierarchy) { assert hierarchy != null; HierarchyAccessImpl hierarchyAccess = hierarchyGrants.get(hierarchy); if (hierarchyAccess != null) { LOGGER.trace( "Access level " + hierarchyAccess.access + " granted to dimension " + hierarchy.getUniqueName()); return hierarchyAccess.access; } // There was no explicit rule for this particular hierarchy. // Let's check the parent dimension. Access access = getAccess(hierarchy.getDimension()); if (access == Access.ALL) { // Access levels of 'none' and 'custom' are not enough. LOGGER.trace( "Access level ALL " + " granted to hierarchy " + hierarchy.getUniqueName() + " because of the grant to dimension " + hierarchy.getDimension().getUniqueName()); return Access.ALL; } // Access denied, since we know that the dimension check has // checked for its parents as well. LOGGER.trace( "Access denided to hierarchy " + hierarchy.getUniqueName()); return Access.NONE; } public HierarchyAccess getAccessDetails(Hierarchy hierarchy) { Util.assertPrecondition(hierarchy != null, "hierarchy != null"); if (hierarchyGrants.containsKey(hierarchy)) { return hierarchyGrants.get(hierarchy); } final Access hierarchyAccess; final Access schemaGrant = schemaGrants.get(hierarchy.getDimension().getSchema()); if (schemaGrant != null) { if (schemaGrant == Access.ALL) { hierarchyAccess = Access.ALL; } else { hierarchyAccess = Access.NONE; } } else { hierarchyAccess = Access.ALL; } return new HierarchyAccessImpl( this, hierarchy, hierarchyAccess, null, null, RollupPolicy.HIDDEN); } public Access getAccess(Level level) { assert level != null; HierarchyAccessImpl hierarchyAccess = hierarchyGrants.get(level.getHierarchy()); if (hierarchyAccess != null && hierarchyAccess.access != Access.NONE) { if (checkLevelIsOkWithRestrictions( hierarchyAccess, level)) { // We're good. Let it through. LOGGER.trace( "Access level " + hierarchyAccess.access + " granted to level " + level.getUniqueName() + " because of the grant to hierarchy " + level.getHierarchy().getUniqueName()); return hierarchyAccess.access; } } // No information could be deducted from the parent hierarchy. // Let's use the parent dimension. Access access = getAccess(level.getDimension()); LOGGER.trace( "Access level " + access + " granted to level " + level.getUniqueName() + " because of the grant to dimension " + level.getDimension().getUniqueName()); return access; } private static boolean checkLevelIsOkWithRestrictions( HierarchyAccessImpl hierarchyAccess, Level level) { // Check if this level is explicitly excluded by top/bototm // level restrictions. if (level.getDepth() < hierarchyAccess.topLevel.getDepth()) { return false; } if (level.getDepth() > hierarchyAccess.bottomLevel.getDepth()) { return false; } return true; } /** * Defines access to a member in a hierarchy. * *

Notes:

    *
  1. The order of grants matters. If you grant/deny access to a * member, previous grants/denials to its descendants are ignored.
  2. *
  3. Member grants do not supersde top/bottom levels set using * {@link #grant(Hierarchy, Access, Level, Level, mondrian.olap.Role.RollupPolicy)}. *
  4. If you have access to a member, then you can see its ancestors * even those explicitly denied, up to the top level. *
* * @pre member != null * @pre isMutable() * @pre getAccess(member.getHierarchy()) == Access.CUSTOM */ public void grant(Member member, Access access) { Util.assertPrecondition(member != null, "member != null"); assert isMutable(); assert getAccess(member.getHierarchy()) == Access.CUSTOM; HierarchyAccessImpl hierarchyAccess = hierarchyGrants.get(member.getHierarchy()); assert hierarchyAccess != null; assert hierarchyAccess.access == Access.CUSTOM; hierarchyAccess.grant(this, member, access); hashCache.add( new Object[] { member.getClass().getName(), member.getName(), access.name()}); hash = 0; } public Access getAccess(Member member) { assert member != null; // Always allow access to calculated members. if (member.isCalculatedInQuery()) { return Access.ALL; } // Check if the parent hierarchy has any access // rules for this. final HierarchyAccessImpl hierarchyAccess = hierarchyGrants.get(member.getHierarchy()); if (hierarchyAccess != null) { return hierarchyAccess.getAccess(member); } // Then let's check ask the parent level. Access access = getAccess(member.getLevel()); LOGGER.trace( "Access level " + access + " granted to level " + member.getUniqueName() + " because of the grant to level " + member.getLevel().getUniqueName()); return access; } public Access getAccess(NamedSet set) { Util.assertPrecondition(set != null, "set != null"); // TODO Named sets cannot be secured at the moment. LOGGER.trace( "Access level ALL " + " granted to NamedSet " + set.getUniqueName() + " because I said so."); return Access.ALL; } public boolean canAccess(OlapElement olapElement) { Util.assertPrecondition(olapElement != null, "olapElement != null"); if (olapElement instanceof Member) { return getAccess((Member) olapElement) != Access.NONE; } else if (olapElement instanceof Level) { return getAccess((Level) olapElement) != Access.NONE; } else if (olapElement instanceof NamedSet) { return getAccess((NamedSet) olapElement) != Access.NONE; } else if (olapElement instanceof Hierarchy) { return getAccess((Hierarchy) olapElement) != Access.NONE; } else if (olapElement instanceof Cube) { return getAccess((Cube) olapElement) != Access.NONE; } else if (olapElement instanceof Dimension) { return getAccess((Dimension) olapElement) != Access.NONE; } else { return false; } } /** * Creates an element which represents all access to a hierarchy. * * @param hierarchy Hierarchy * @return element representing all access to a given hierarchy */ public static HierarchyAccess createAllAccess(Hierarchy hierarchy) { return new HierarchyAccessImpl( Util.createRootRole(hierarchy.getDimension().getSchema()), hierarchy, Access.ALL, null, null, Role.RollupPolicy.FULL); } /** * Returns a role that is the union of the given roles. * * @param roleList List of roles * @return Union role */ public static Role union(final List roleList) { assert roleList.size() > 0; return new UnionRoleImpl(roleList); } // ~ Inner classes -------------------------------------------------------- /** * Represents the access that a role has to a particular hierarchy. */ private static class HierarchyAccessImpl implements Role.HierarchyAccess { private final Hierarchy hierarchy; private final Level topLevel; private final Access access; private final Level bottomLevel; private final Map memberGrants = new HashMap(); private final RollupPolicy rollupPolicy; private final Role role; /** * Creates a HierarchyAccessImpl. * @param role A role this access belongs to. * @param hierarchy A hierarchy this object describes. * @param access The access granted to this role for this hierarchy. * @param topLevel The top level to restrict the role to, or null to * grant access up top the top level of the hierarchy parameter. * @param bottomLevel The bottom level to restrict the role to, or null * to grant access down to the bottom level of the hierarchy parameter. * @param rollupPolicy The rollup policy to apply. */ HierarchyAccessImpl( Role role, Hierarchy hierarchy, Access access, Level topLevel, Level bottomLevel, RollupPolicy rollupPolicy) { assert role != null; assert hierarchy != null; assert access != null; assert rollupPolicy != null; this.role = role; this.hierarchy = hierarchy; this.access = access; this.rollupPolicy = rollupPolicy; this.topLevel = topLevel == null ? hierarchy.getLevels()[0] : topLevel; this.bottomLevel = bottomLevel == null ? hierarchy.getLevels()[hierarchy.getLevels().length - 1] : bottomLevel; } public HierarchyAccess clone() { HierarchyAccessImpl hierarchyAccess = new HierarchyAccessImpl( role, hierarchy, access, topLevel, bottomLevel, rollupPolicy); hierarchyAccess.memberGrants.putAll(memberGrants); return hierarchyAccess; } /** * Grants access to a member. * * @param member Member * @param access Access */ void grant(RoleImpl role, Member member, Access access) { Util.assertTrue(member.getHierarchy() == hierarchy); // Remove any existing grants to descendants of "member" for (Iterator memberIter = memberGrants.values().iterator(); memberIter.hasNext();) { MemberAccess mAccess = memberIter.next(); if (mAccess.member.isChildOrEqualTo(member)) { LOGGER.trace( "Member grant " + mAccess + " removed because a grant on " + member.getUniqueName() + " overrides it."); memberIter.remove(); } } LOGGER.trace( "Granting access " + access + " on member " + member.getUniqueName()); memberGrants.put( member.getUniqueName(), new MemberAccess(member, access)); if (access == Access.NONE) { // Since we're denying access, the ancestor's // access level goes from NONE to CUSTOM // and from ALL to RESTRICTED. for (Member m = member.getParentMember(); m != null; m = m.getParentMember()) { MemberAccess mAccess = memberGrants.get(m.getUniqueName()); final Access parentAccess = mAccess == null ? null : mAccess.access; // If no current access is allowed, upgrade to "custom" // which means nothing unless explicitly allowed. if (parentAccess == Access.NONE && checkLevelIsOkWithRestrictions( this, m.getLevel())) { LOGGER.trace( "Cascading grant CUSTOM on member " + m.getUniqueName() + " because of the grant to member " + member.getUniqueName()); memberGrants.put( m.getUniqueName(), new MemberAccess(m, Access.CUSTOM)); } // If the current parent's access is not defined or // 'all', we switch it to RESTRICTED, meaning // that the user has access to everything unless // explicitly denied. if ((parentAccess == null || parentAccess == Access.ALL) && checkLevelIsOkWithRestrictions( this, m.getLevel())) { LOGGER.trace( "Cascading grant RESTRICTED on member " + m.getUniqueName() + " because of the grant to member " + member.getUniqueName()); memberGrants.put( m.getUniqueName(), new MemberAccess(m, Access.RESTRICTED)); } } } else { // Create 'custom' access for any ancestors of 'member' which // do not have explicit access but which have at least one // child visible. for (Member m = member.getParentMember(); m != null; m = m.getParentMember()) { if (checkLevelIsOkWithRestrictions( this, m.getLevel())) { MemberAccess mAccess = memberGrants.get(m.getUniqueName()); final Access parentAccess = toAccess(mAccess == null ? null : mAccess.access); if (parentAccess == Access.NONE) { LOGGER.trace( "Cascading grant CUSTOM on member " + m.getUniqueName() + " because of the grant to member " + member.getUniqueName()); memberGrants.put( m.getUniqueName(), new MemberAccess(m, Access.CUSTOM)); } } } // Also set custom access for the parent hierarchy. final Access hierarchyAccess = role.getAccess(member.getLevel().getHierarchy()); if (hierarchyAccess == Access.NONE) { LOGGER.trace( "Cascading grant CUSTOM on hierarchy " + hierarchy.getUniqueName() + " because of the grant to member " + member.getUniqueName()); // Upgrade to CUSTOM level. role.grant( hierarchy, Access.CUSTOM, topLevel, bottomLevel, rollupPolicy); } } } public Access getAccess(Member member) { if (this.access != Access.CUSTOM) { return this.access; } MemberAccess mAccess = memberGrants.get(member.getUniqueName()); Access access = mAccess == null ? null : mAccess.access; // Check for an explicit deny. if (access == Access.NONE) { LOGGER.trace( "Access level " + Access.NONE + " granted to member " + member.getUniqueName() + " because it is explicitly denided."); return Access.NONE; } // Check for explicit grant if (access == Access.ALL || access == Access.CUSTOM) { LOGGER.trace( "Access level " + access + " granted to member " + member.getUniqueName()); return access; } // Restricted is ok. This means an explicit grant // followed by a deny of one of the children: so custom. if (access == Access.RESTRICTED) { LOGGER.trace( "Access level " + Access.CUSTOM + " granted to member " + member.getUniqueName() + " because it was RESTRICTED. "); return Access.CUSTOM; } // Check if the member is out of the bounds // defined by topLevel and bottomLevel if (!checkLevelIsOkWithRestrictions(this, member.getLevel())) { LOGGER.trace( "Access denided to member " + member.getUniqueName() + " because its level " + member.getLevel().getUniqueName() + " is out of the permitted bounds of between " + this.topLevel.getUniqueName() + " and " + this.bottomLevel.getUniqueName()); return Access.NONE; } // Nothing was explicitly defined for this member. // Check for grants on its parents for (Member m = member.getParentMember(); m != null; m = m.getParentMember()) { MemberAccess pAccess = memberGrants.get(m.getUniqueName()); final Access parentAccess = pAccess == null ? null : pAccess.access; if (parentAccess == null) { // No explicit rules for this parent continue; } // Check for parent deny if (parentAccess == Access.NONE || parentAccess == Access.CUSTOM) { LOGGER.trace( "Access denided to member " + member.getUniqueName() + " because its parent " + m.getUniqueName() + " is of access level " + parentAccess); return Access.NONE; } // Both RESTRICTED and ALL are OK for parents. LOGGER.trace( "Access level ALL granted to member " + member.getUniqueName() + " because its parent " + m.getUniqueName() + " is of access level " + parentAccess); return Access.ALL; } // Check for inherited access from ancestors. // "Custom" is not good enough. We are looking for "all" access. access = role.getAccess(member.getLevel()); if (access == Access.ALL) { LOGGER.trace( "Access ALL granted to member " + member.getUniqueName() + " because its level " + member.getLevel().getUniqueName() + " is of access level ALL"); return Access.ALL; } // This member might be at a level allowed by the // topLevel/bottomLevel attributes. If there are no explicit // member grants defined at this level but the member fits // those bounds, we give access. if (memberGrants.size() == 0) { LOGGER.trace( "Access level ALL granted to member " + member.getUniqueName() + " because it lies between the permitted level bounds and there are no explicit member grants defined in hierarchy " + member.getHierarchy().getUniqueName()); return Access.ALL; } // No access LOGGER.trace( "Access denided to member " + member.getUniqueName() + " because none of its parents allow access to it."); return Access.NONE; } public final int getTopLevelDepth() { return topLevel.getDepth(); } public final int getBottomLevelDepth() { return bottomLevel.getDepth(); } public RollupPolicy getRollupPolicy() { return rollupPolicy; } /** * Tells whether a given member has some of its children being * restricted by the access controls of this role instance. */ public boolean hasInaccessibleDescendants(Member member) { for (MemberAccess access : memberGrants.values()) { switch (access.access) { case NONE: case CUSTOM: if (access.isSubGrant(member)) { // At least one of the limited member is // part of the descendants of this member. return true; } } } // All descendants are accessible. return false; } } /** * A MemberAccess contains information about a grant applied * to a member for a given role. It is only an internal data * structure and should not be exposed via the API. */ private static class MemberAccess { private final Member member; private final Access access; // We use a weak hash map so that it naturally clears // when more memory is required by other parts. // This cache is useful for optimization, but cannot be // let to grow indefinitely. This would cause problems // on high cardinality dimensions. private final Map parentsCache = new WeakHashMap(); public MemberAccess( Member member, Access access) { this.member = member; this.access = access; } /** * Tells whether the member concerned by this grant object * is a children of a given member. The result of the computation * is cached for faster results, since this might get called * very often. */ private boolean isSubGrant(Member parentMember) { if (parentsCache.containsKey(parentMember.getUniqueName())) { return parentsCache.get(parentMember.getUniqueName()); } for (Member m = member; m != null; m = m.getParentMember()) { if (m.equals(parentMember)) { // We have proved that this granted member is a // descendant of 'member'. Cache it and return. parentsCache.put( parentMember.getUniqueName(), Boolean.TRUE); return true; } } // Not a parent. Cache it and return. if (MondrianProperties.instance() .EnableRolapCubeMemberCache.get()) { parentsCache.put( parentMember.getUniqueName(), Boolean.FALSE); } return false; } public String toString() { return "MemberAccess{" + member.getUniqueName() + " : " + access.toString() + "}"; } } /** * Implementation of {@link mondrian.olap.Role.HierarchyAccess} that * delegates all methods to an underlying hierarchy access. */ public static abstract class DelegatingHierarchyAccess implements HierarchyAccess { protected final HierarchyAccess hierarchyAccess; /** * Creates a DelegatingHierarchyAccess. * * @param hierarchyAccess Underlying hierarchy access */ public DelegatingHierarchyAccess(HierarchyAccess hierarchyAccess) { assert hierarchyAccess != null; this.hierarchyAccess = hierarchyAccess; } public Access getAccess(Member member) { return hierarchyAccess.getAccess(member); } public int getTopLevelDepth() { return hierarchyAccess.getTopLevelDepth(); } public int getBottomLevelDepth() { return hierarchyAccess.getBottomLevelDepth(); } public RollupPolicy getRollupPolicy() { return hierarchyAccess.getRollupPolicy(); } public boolean hasInaccessibleDescendants(Member member) { return hierarchyAccess.hasInaccessibleDescendants(member); } } /** * Implementation of {@link mondrian.olap.Role.HierarchyAccess} that caches * the access of each member and level. * *

This reduces the number of calls to the underlying HierarchyAccess, * which is particularly useful for a union role which is based on many * roles. * *

Caching uses two {@link java.util.WeakHashMap} objects, so should * release resources if memory is scarce. However, it may use up memory and * cause segments etc. to be removed from the cache when GC is triggered. * For this reason, you should only use this wrapper for a HierarchyAccess * which would otherwise have poor performance; currently used for union * roles with 5 or more member roles. */ static class CachingHierarchyAccess extends DelegatingHierarchyAccess { private final Map memberAccessMap = new WeakHashMap(); private RollupPolicy rollupPolicy; private Map inaccessibleDescendantsMap = new WeakHashMap(); private Integer topLevelDepth; private Integer bottomLevelDepth; /** * Creates a CachingHierarchyAccess. * * @param hierarchyAccess Underlying hierarchy access */ public CachingHierarchyAccess(HierarchyAccess hierarchyAccess) { super(hierarchyAccess); } @Override public Access getAccess(Member member) { Access access = memberAccessMap.get(member); if (access != null) { return access; } access = hierarchyAccess.getAccess(member); memberAccessMap.put(member, access); return access; } @Override public int getTopLevelDepth() { if (topLevelDepth == null) { topLevelDepth = hierarchyAccess.getTopLevelDepth(); } return topLevelDepth; } @Override public int getBottomLevelDepth() { if (bottomLevelDepth == null) { bottomLevelDepth = hierarchyAccess.getBottomLevelDepth(); } return bottomLevelDepth; } @Override public RollupPolicy getRollupPolicy() { if (rollupPolicy == null) { rollupPolicy = hierarchyAccess.getRollupPolicy(); } return rollupPolicy; } @Override public boolean hasInaccessibleDescendants(Member member) { Boolean b = inaccessibleDescendantsMap.get(member); if (b == null) { b = hierarchyAccess.hasInaccessibleDescendants(member); inaccessibleDescendantsMap.put(member, b); } return b; } } } // End RoleImpl.java mondrian-3.11.0.1-R/src/main/mondrian/olap/Scanner.java000066400000000000000000000742451261646570300225000ustar00rootroot00000000000000/* // This software is subject to the terms of the Eclipse Public License v1.0 // Agreement, available at the following URL: // http://www.eclipse.org/legal/epl-v10.html. // You must accept the terms of that agreement to use this software. // // Copyright (C) 1998-2005 Julian Hyde // Copyright (C) 2005-2011 Pentaho and others // All Rights Reserved. */ package mondrian.olap; import org.apache.log4j.Logger; import java_cup.runtime.Symbol; import java.io.IOException; import java.math.BigDecimal; import java.util.*; /** * Lexical analyzer for MDX. * * @author jhyde, 20 January, 1999 */ public class Scanner { private static final Logger LOGGER = Logger.getLogger(Scanner.class); /** single lookahead character */ protected int nextChar; /** next lookahead character */ private int lookaheadChars[] = new int[16]; private int firstLookaheadChar = 0; private int lastLookaheadChar = 0; private Hashtable m_resWordsTable; private int iMaxResword; private String m_aResWords[]; protected boolean debug; /** lines[x] is the start of the x'th line */ private List lines; /** number of times advance() has been called */ private int iChar; /** end of previous token */ private int iPrevChar; /** previous symbol returned */ private int previousSymbol; private boolean inFormula; /** * Comment delimiters. Modify this list to support other comment styles. */ private static final String[][] commentDelim = { new String[] {"//", null}, new String[] {"--", null}, new String[] {"/*", "*/"} }; /** * Whether to allow nested comments. */ private static final boolean allowNestedComments = true; /** * The {@link java.math.BigDecimal} value 0. * Note that BigDecimal.ZERO does not exist until JDK 1.5. */ private static final BigDecimal BigDecimalZero = BigDecimal.valueOf(0); /** * Creates a Scanner. * * @param debug Whether to emit debug messages. */ Scanner(boolean debug) { this.debug = debug; } /** * Returns the current nested comments state. */ public static boolean getNestedCommentsState() { return allowNestedComments; } /** * Returns the list of comment delimiters. */ public static String[][] getCommentDelimiters() { return commentDelim; } /** * Advance input by one character, setting {@link #nextChar}. */ private void advance() throws IOException { if (firstLookaheadChar == lastLookaheadChar) { // We have nothing in the lookahead buffer. nextChar = getChar(); } else { // We have called lookahead(); advance to the next character it got. nextChar = lookaheadChars[firstLookaheadChar++]; if (firstLookaheadChar == lastLookaheadChar) { firstLookaheadChar = 0; lastLookaheadChar = 0; } } if (nextChar == '\012') { lines.add(iChar); } iChar++; } /** Peek at the character after {@link #nextChar} without advancing. */ private int lookahead() throws IOException { return lookahead(1); } /** * Peeks at the character n after {@link #nextChar} without advancing. * *

lookahead(0) returns the current char (nextChar). * lookahead(1) returns the next char (was lookaheadChar, same as * lookahead()); */ private int lookahead(int n) throws IOException { if (n == 0) { return nextChar; } else { // if the desired character not in lookahead buffer, read it in if (n > lastLookaheadChar - firstLookaheadChar) { int len = lastLookaheadChar - firstLookaheadChar; int t[]; // make sure we do not go off the end of the buffer if (n + firstLookaheadChar > lookaheadChars.length) { if (n > lookaheadChars.length) { // the array is too small; make it bigger and shift // everything to the beginning. t = new int[n * 2]; } else { // the array is big enough, so just shift everything // to the beginning of it. t = lookaheadChars; } System.arraycopy( lookaheadChars, firstLookaheadChar, t, 0, len); lookaheadChars = t; firstLookaheadChar = 0; lastLookaheadChar = len; } // read ahead enough while (n > lastLookaheadChar - firstLookaheadChar) { lookaheadChars[lastLookaheadChar++] = getChar(); } } return lookaheadChars[n - 1 + firstLookaheadChar]; } } /** Read a character from input, returning -1 if end of input. */ protected int getChar() throws IOException { return System.in.read(); } /** Initialize the scanner */ public void init() throws IOException { initReswords(); lines = new ArrayList(); iChar = iPrevChar = 0; advance(); } /** * Deduces the line and column (0-based) of a symbol. * Called by {@link Parser#syntax_error}. */ void getLocation(Symbol symbol, int[] loc) { int iTarget = symbol.left; int iLine = -1; int iLineEnd = 0; int iLineStart; do { iLine++; iLineStart = iLineEnd; iLineEnd = Integer.MAX_VALUE; if (iLine < lines.size()) { iLineEnd = lines.get(iLine); } } while (iLineEnd < iTarget); loc[0] = iLine; // line loc[1] = iTarget - iLineStart; // column } private Symbol trace(Symbol s) { if (debug) { String name = null; if (s.sym < m_aResWords.length) { name = m_aResWords[s.sym]; } LOGGER.error( "Scanner returns #" + s.sym + (name == null ? "" : ":" + name) + (s.value == null ? "" : "(" + s.value.toString() + ")")); } return s; } private void initResword(int id, String s) { m_resWordsTable.put(s, id); if (id > iMaxResword) { iMaxResword = id; } } /** * Initializes the table of reserved words. */ private void initReswords() { // This list generated by piping the 'terminal' declaration in mdx.cup // through: // grep -list // | // sed -e 's/,//' | // awk '{printf "initResword(%20s,%c%s%c);",$1,34,$1,34}' m_resWordsTable = new Hashtable(); iMaxResword = 0; // initResword(ParserSym.ALL, "ALL"); initResword(ParserSym.AND, "AND"); initResword(ParserSym.AS, "AS"); // initResword(ParserSym.ASC, "ASC"); initResword(ParserSym.AXIS, "AXIS"); // initResword(ParserSym.BACK_COLOR, "BACK_COLOR"); // initResword(ParserSym.BASC, "BASC"); // initResword(ParserSym.BDESC, "BDESC"); // CAST is a mondrian extension initResword(ParserSym.CAST, "CAST"); initResword(ParserSym.CASE, "CASE"); initResword(ParserSym.CELL, "CELL"); // initResword(ParserSym.CELL_ORDINAL, "CELL_ORDINAL"); initResword(ParserSym.CHAPTERS, "CHAPTERS"); // initResword(ParserSym.CHILDREN, "CHILDREN"); initResword(ParserSym.COLUMNS, "COLUMNS"); // initResword(ParserSym.DESC, "DESC"); initResword(ParserSym.DIMENSION, "DIMENSION"); initResword(ParserSym.DRILLTHROUGH, "DRILLTHROUGH"); initResword(ParserSym.ELSE, "ELSE"); initResword(ParserSym.EMPTY, "EMPTY"); initResword(ParserSym.END, "END"); initResword(ParserSym.EXPLAIN, "EXPLAIN"); // initResword(ParserSym.FIRSTCHILD, "FIRSTCHILD"); initResword(ParserSym.FIRSTROWSET, "FIRSTROWSET"); // initResword(ParserSym.FIRSTSIBLING, "FIRSTSIBLING"); // initResword(ParserSym.FONT_FLAGS, "FONT_FLAGS"); // initResword(ParserSym.FONT_NAME, "FONT_NAME"); // initResword(ParserSym.FONT_SIZE, "FONT_SIZE"); // initResword(ParserSym.FORE_COLOR, "FORE_COLOR"); // initResword(ParserSym.FORMATTED_VALUE, "FORMATTED_VALUE"); // initResword(ParserSym.FORMAT_STRING, "FORMAT_STRING"); initResword(ParserSym.FOR, "FOR"); initResword(ParserSym.FROM, "FROM"); initResword(ParserSym.IS, "IS"); initResword(ParserSym.IN, "IN"); // initResword(ParserSym.LAG, "LAG"); // initResword(ParserSym.LASTCHILD, "LASTCHILD"); // initResword(ParserSym.LASTSIBLING, "LASTSIBLING"); // initResword(ParserSym.LEAD, "LEAD"); initResword(ParserSym.MATCHES, "MATCHES"); initResword(ParserSym.MAXROWS, "MAXROWS"); initResword(ParserSym.MEMBER, "MEMBER"); // initResword(ParserSym.MEMBERS, "MEMBERS"); // initResword(ParserSym.NEXTMEMBER, "NEXTMEMBER"); initResword(ParserSym.NON, "NON"); initResword(ParserSym.NOT, "NOT"); initResword(ParserSym.NULL, "NULL"); initResword(ParserSym.ON, "ON"); initResword(ParserSym.OR, "OR"); initResword(ParserSym.PAGES, "PAGES"); // initResword(ParserSym.PARENT, "PARENT"); initResword(ParserSym.PLAN, "PLAN"); // initResword(ParserSym.PREVMEMBER, "PREVMEMBER"); initResword(ParserSym.PROPERTIES, "PROPERTIES"); // initResword(ParserSym.RECURSIVE, "RECURSIVE"); initResword(ParserSym.RETURN, "RETURN"); initResword(ParserSym.ROWS, "ROWS"); initResword(ParserSym.SECTIONS, "SECTIONS"); initResword(ParserSym.SELECT, "SELECT"); initResword(ParserSym.SET, "SET"); // initResword(ParserSym.SOLVE_ORDER, "SOLVE_ORDER"); initResword(ParserSym.THEN, "THEN"); // initResword(ParserSym.VALUE, "VALUE"); initResword(ParserSym.WHEN, "WHEN"); initResword(ParserSym.WHERE, "WHERE"); initResword(ParserSym.WITH, "WITH"); initResword(ParserSym.XOR, "XOR"); m_aResWords = new String[iMaxResword + 1]; Enumeration e = m_resWordsTable.keys(); while (e.hasMoreElements()) { Object o = e.nextElement(); String s = (String) o; int i = (m_resWordsTable.get(s)).intValue(); m_aResWords[i] = s; } } /** return the name of the reserved word whose token code is "i" */ public String lookupReserved(int i) { return m_aResWords[i]; } private Symbol makeSymbol(int id, Object o) { int iPrevPrevChar = iPrevChar; this.iPrevChar = iChar; this.previousSymbol = id; return trace(new Symbol(id, iPrevPrevChar, iChar, o)); } /** * Creates a token representing a numeric literal. * * @param mantissa The digits of the number * @param exponent The base-10 exponent of the number * @return number literal token */ private Symbol makeNumber(BigDecimal mantissa, int exponent) { BigDecimal d = mantissa.movePointRight(exponent); return makeSymbol(ParserSym.NUMBER, d); } private Symbol makeId(String s, boolean quoted, boolean ampersand) { return makeSymbol( quoted && ampersand ? ParserSym.AMP_QUOTED_ID : quoted ? ParserSym.QUOTED_ID : ParserSym.ID, s); } /** * Creates a token representing a reserved word. * * @param i Token code * @return Token */ private Symbol makeRes(int i) { return makeSymbol(i, m_aResWords[i]); } /** * Creates a token. * * @param i Token code * @param s Text of the token * @return Token */ private Symbol makeToken(int i, String s) { return makeSymbol(i, s); } /** * Creates a token representing a string literal. * * @param s String * @return String token */ private Symbol makeString(String s) { if (inFormula) { inFormula = false; return makeSymbol(ParserSym.FORMULA_STRING, s); } else { return makeSymbol(ParserSym.STRING, s); } } /** * Discards all characters until the end of the current line. */ private void skipToEOL() throws IOException { while (nextChar != -1 && nextChar != '\012') { advance(); } } /** * Eats a delimited comment. * The type of delimiters are kept in commentDelim. The current * comment type is indicated by commentType. * end of file terminates a comment without error. */ private void skipComment( final String startDelim, final String endDelim) throws IOException { int depth = 1; // skip the starting delimiter for (int x = 0; x < startDelim.length(); x++) { advance(); } for (;;) { if (nextChar == -1) { return; } else if (checkForSymbol(endDelim)) { // eat the end delimiter for (int x = 0; x < endDelim.length(); x++) { advance(); } if (--depth == 0) { return; } } else if (allowNestedComments && checkForSymbol(startDelim)) { // eat the nested start delimiter for (int x = 0; x < startDelim.length(); x++) { advance(); } depth++; } else { advance(); } } } /** * If the next tokens are comments, skip over them. */ private void searchForComments() throws IOException { // eat all following comments boolean foundComment; do { foundComment = false; for (String[] aCommentDelim : commentDelim) { if (checkForSymbol(aCommentDelim[0])) { if (aCommentDelim[1] == null) { foundComment = true; skipToEOL(); } else { foundComment = true; skipComment(aCommentDelim[0], aCommentDelim[1]); } } } } while (foundComment); } /** * Checks if the next symbol is the supplied string */ private boolean checkForSymbol(final String symb) throws IOException { for (int x = 0; x < symb.length(); x++) { if (symb.charAt(x) != lookahead(x)) { return false; } } return true; } /** * Recognizes and returns the next complete token. */ public Symbol next_token() throws IOException { StringBuilder id; boolean ampersandId = false; for (;;) { searchForComments(); switch (nextChar) { case '.': switch (lookahead()) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': // We're looking at the '.' on the start of a number, // e.g. .1; fall through to parse a number. break; default: advance(); return makeToken(ParserSym.DOT, "."); } // fall through case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': // Parse a number. Valid examples include 1, 1.2, 0.1, .1, // 1e2, 1E2, 1e-2, 1e+2. Invalid examples include e2, 1.2.3, // 1e2e3, 1e2.3. // // Signs preceding numbers (e.g. -1, + 1E-5) are valid, but are // handled by the parser. // BigDecimal n = BigDecimalZero; int digitCount = 0, exponent = 0; boolean positive = true; BigDecimal mantissa = BigDecimalZero; State state = State.leftOfPoint; for (;;) { switch (nextChar) { case '.': switch (state) { case leftOfPoint: state = State.rightOfPoint; mantissa = n; n = BigDecimalZero; digitCount = 0; positive = true; advance(); break; // Error: we are seeing a point in the exponent // (e.g. 1E2.3 or 1.2E3.4) or a second point in the // mantissa (e.g. 1.2.3). Return what we've got // and let the parser raise the error. case rightOfPoint: mantissa = mantissa.add( n.movePointRight(-digitCount)); return makeNumber(mantissa, exponent); case inExponent: if (!positive) { n = n.negate(); } exponent = n.intValue(); return makeNumber(mantissa, exponent); } break; case 'E': case 'e': switch (state) { case inExponent: // Error: we are seeing an 'e' in the exponent // (e.g. 1.2e3e4). Return what we've got and let // the parser raise the error. if (!positive) { n = n.negate(); } exponent = n.intValue(); return makeNumber(mantissa, exponent); case leftOfPoint: mantissa = n; break; default: mantissa = mantissa.add( n.movePointRight(-digitCount)); break; } digitCount = 0; n = BigDecimalZero; positive = true; advance(); state = State.inExponent; break; case'0': case'1': case'2': case'3': case'4': case'5': case'6': case'7': case'8': case'9': n = n.movePointRight(1); n = n.add(BigDecimal.valueOf(nextChar - '0')); digitCount++; advance(); break; case '+': case '-': if (state == State.inExponent && digitCount == 0) { // We're looking at the sign after the 'e'. positive = !positive; advance(); break; } // fall through - end of number default: // Reached end of number. switch (state) { case leftOfPoint: mantissa = n; break; case rightOfPoint: mantissa = mantissa.add( n.movePointRight(-digitCount)); break; default: if (!positive) { n = n.negate(); } exponent = n.intValue(); break; } return makeNumber(mantissa, exponent); } } case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': case 'g': case 'h': case 'i': case 'j': case 'k': case 'l': case 'm': case 'n': case 'o': case 'p': case 'q': case 'r': case 's': case 't': case 'u': case 'v': case 'w': case 'x': case 'y': case 'z': case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': case 'G': case 'H': case 'I': case 'J': case 'K': case 'L': case 'M': case 'N': case 'O': case 'P': case 'Q': case 'R': case 'S': case 'T': case 'U': case 'V': case 'W': case 'X': case 'Y': case 'Z': case '_': case '$': /* parse an identifier */ id = new StringBuilder(); for (;;) { id.append((char)nextChar); advance(); switch (nextChar) { case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': case 'g': case 'h': case 'i': case 'j': case 'k': case 'l': case 'm': case 'n': case 'o': case 'p': case 'q': case 'r': case 's': case 't': case 'u': case 'v': case 'w': case 'x': case 'y': case 'z': case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': case 'G': case 'H': case 'I': case 'J': case 'K': case 'L': case 'M': case 'N': case 'O': case 'P': case 'Q': case 'R': case 'S': case 'T': case 'U': case 'V': case 'W': case 'X': case 'Y': case 'Z': case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': case '_': case '$': break; default: String strId = id.toString(); Integer i = m_resWordsTable.get( strId.toUpperCase()); if (i == null) { // identifier return makeId(strId, false, false); } else { // reserved word return makeRes(i); } } } case '&': advance(); if (nextChar == '[') { ampersandId = true; // fall through } else { return makeToken(ParserSym.UNKNOWN, "&"); } case '[': /* parse a delimited identifier */ id = new StringBuilder(); for (;;) { advance(); switch (nextChar) { case ']': advance(); if (nextChar == ']') { // ] escaped with ] - just take one id.append(']'); break; } else { // end of identifier if (ampersandId) { ampersandId = false; return makeId(id.toString(), true, true); } else { return makeId(id.toString(), true, false); } } case -1: if (ampersandId) { ampersandId = false; return makeId(id.toString(), true, true); } else { return makeId(id.toString(), true, false); } default: id.append((char)nextChar); } } case ':': advance(); return makeToken(ParserSym.COLON, ":"); case ',': advance(); return makeToken(ParserSym.COMMA, ","); case '=': advance(); return makeToken(ParserSym.EQ, "="); case '<': advance(); switch (nextChar) { case '>': advance(); return makeToken(ParserSym.NE, "<>"); case '=': advance(); return makeToken(ParserSym.LE, "<="); default: return makeToken(ParserSym.LT, "<"); } case '>': advance(); switch (nextChar) { case '=': advance(); return makeToken(ParserSym.GE, ">="); default: return makeToken(ParserSym.GT, ">"); } case '{': advance(); return makeToken(ParserSym.LBRACE, "{"); case '(': advance(); return makeToken(ParserSym.LPAREN, "("); case '}': advance(); return makeToken(ParserSym.RBRACE, "}"); case ')': advance(); return makeToken(ParserSym.RPAREN, ")"); case '+': advance(); return makeToken(ParserSym.PLUS, "+"); case '-': advance(); return makeToken(ParserSym.MINUS, "-"); case '*': advance(); return makeToken(ParserSym.ASTERISK, "*"); case '/': advance(); return makeToken(ParserSym.SOLIDUS, "/"); case '!': advance(); return makeToken(ParserSym.BANG, "!"); case '|': advance(); switch (nextChar) { case '|': advance(); return makeToken(ParserSym.CONCAT, "||"); default: return makeToken(ParserSym.UNKNOWN, "|"); } case '"': /* parse a double-quoted string */ id = new StringBuilder(); for (;;) { advance(); switch (nextChar) { case '"': advance(); if (nextChar == '"') { // " escaped with " id.append('"'); break; } else { // end of string return makeString(id.toString()); } case -1: return makeString(id.toString()); default: id.append((char)nextChar); } } case '\'': if (previousSymbol == ParserSym.AS) { inFormula = true; } /* parse a single-quoted string */ id = new StringBuilder(); for (;;) { advance(); switch (nextChar) { case '\'': advance(); if (nextChar == '\'') { // " escaped with " id.append('\''); break; } else { // end of string return makeString(id.toString()); } case -1: return makeString(id.toString()); default: id.append((char)nextChar); } } case -1: // we're done return makeToken(ParserSym.EOF, "EOF"); default: // If it's whitespace, skip over it. // (When we switch to JDK 1.5, use Character.isWhitespace(int); // til then, there's just Character.isWhitespace(char).) if (nextChar <= Character.MAX_VALUE && Character.isWhitespace((char) nextChar)) { // fall through } else { // everything else is an error throw new RuntimeException( "Unexpected character '" + (char) nextChar + "'"); } case ' ': case '\t': case '\n': case '\r': // whitespace can be ignored iPrevChar = iChar; advance(); break; } } } private enum State { leftOfPoint, rightOfPoint, inExponent, } } // End Scanner.java mondrian-3.11.0.1-R/src/main/mondrian/olap/Schema.java000066400000000000000000000050501261646570300222730ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.olap; import java.util.Date; import java.util.List; /** * A Schema is a collection of cubes, shared dimensions, and roles. * * @author jhyde */ public interface Schema extends Annotated { /** * Returns the name of this schema. * @post return != null * @post return.length() > 0 */ String getName(); /** * Returns the uniquely generated id of this schema. */ String getId(); /** * Finds a cube called cube in this schema; if no cube * exists, failIfNotFound controls whether to raise an error * or return null. */ Cube lookupCube(String cube, boolean failIfNotFound); /** * Returns a list of all cubes in this schema. */ Cube[] getCubes(); /** * Returns a list of shared dimensions in this schema. */ Hierarchy[] getSharedHierarchies(); /** * Creates a dimension in the given cube by parsing an XML string. The XML * string must be either a <Dimension> or a <DimensionUsage>. * Returns the dimension created. */ Dimension createDimension(Cube cube, String xml); /** * Creates a cube by parsing an XML string. Returns the cube created. */ Cube createCube(String xml); /** * Removes a cube. * * @return Whether cube was removed */ boolean removeCube(String cubeName); /** * Creates a {@link SchemaReader} without any access control. */ SchemaReader getSchemaReader(); /** * Finds a role with a given name in the current catalog, or returns * null if no such role exists. */ Role lookupRole(String role); /** * Returns this schema's function table. */ FunTable getFunTable(); /** * Returns this schema's parameters. */ Parameter[] getParameters(); /** * Returns when this schema was last loaded. * * @return Date and time when this schema was last loaded */ Date getSchemaLoadDate(); /** * Returns a list of warnings and errors that occurred while loading this * schema. * * @return list of warnings */ List getWarnings(); } // End Schema.java mondrian-3.11.0.1-R/src/main/mondrian/olap/SchemaReader.java000066400000000000000000000424521261646570300234250ustar00rootroot00000000000000/* // This software is subject to the terms of the Eclipse Public License v1.0 // Agreement, available at the following URL: // http://www.eclipse.org/legal/epl-v10.html. // You must accept the terms of that agreement to use this software. // // Copyright (C) 2003-2005 Julian Hyde // Copyright (C) 2005-2015 Pentaho // All Rights Reserved. */ package mondrian.olap; import mondrian.calc.Calc; import mondrian.rolap.RolapHierarchy; import mondrian.rolap.RolapSchema; import java.util.List; import java.util.Map; import javax.sql.DataSource; /** * A SchemaReader queries schema objects ({@link Schema}, * {@link Cube}, {@link Dimension}, {@link Hierarchy}, {@link Level}, * {@link Member}). * *

It is generally created using {@link Connection#getSchemaReader}, * but also via {@link Cube#getSchemaReader(Role)}.

* *

SchemaReader is deprecated for code outside of mondrian. For new code, * use the metadata provided by olap4j, for example * {@link mondrian.olap4j.MondrianOlap4jSchema#getCubes()}. * *

If you use a SchemaReader from outside of a mondrian statement, you may * get a {@link java.util.EmptyStackException} indicating that mondrian cannot * deduce the current locus (statement context). If you get that error, call * {@link #withLocus()} to create a SchemaReader that automatically provides a * locus whenever a call is made.

* * @author jhyde * @since Feb 24, 2003 */ public interface SchemaReader { /** * Returns the schema. * * @return Schema, never null */ RolapSchema getSchema(); /** * Returns the access-control profile that this SchemaReader * is implementing. */ Role getRole(); /** * Returns the accessible dimensions of a cube. * * @pre dimension != null * @post return != null */ List getCubeDimensions(Cube cube); /** * Returns the accessible hierarchies of a dimension. * * @pre dimension != null * @post return != null */ List getDimensionHierarchies(Dimension dimension); /** * Returns an array of the root members of hierarchy. * * @param hierarchy Hierarchy * @see #getCalculatedMembers(Hierarchy) */ List getHierarchyRootMembers(Hierarchy hierarchy); /** * Returns number of children parent of a member, * if the information can be retrieved from cache, otherwise -1. */ int getChildrenCountFromCache(Member member); /** * Returns the number of members in a level, returning an approximation if * acceptable. * * @param level Level * @param approximate Whether an approximation is acceptable * @param materialize Whether to go to disk if no approximation * for the count is available and the members are not in * cache. If false, returns {@link Integer#MIN_VALUE} if value * is not in cache. */ int getLevelCardinality( Level level, boolean approximate, boolean materialize); /** * Substitutes a member with an equivalent member which enforces the * access control policy of this SchemaReader. */ Member substitute(Member member); /** * Returns direct children of member. * @pre member != null * @post return != null */ List getMemberChildren(Member member); /** * Returns direct children of member, optimized * for NON EMPTY. *

* If context == null then * there is no context and all members are returned - then * its identical to {@link #getMemberChildren(Member)}. * If context is not null, the resulting members * may be restricted to those members that have a * non empty row in the fact table for context. * Wether or not optimization is possible depends * on the SchemaReader implementation. */ List getMemberChildren(Member member, Evaluator context); /** * Returns direct children of each element of members. * * @param members Array of members * @return array of child members * * @pre members != null * @post return != null */ List getMemberChildren(List members); /** * Returns direct children of each element of members * which is not empty in context. * * @param members Array of members * @param context Evaluation context * @return array of child members * * @pre members != null * @post return != null */ List getMemberChildren(List members, Evaluator context); /** * Returns a list of contributing children of a member of a parent-child * hierarchy. * * @param dataMember Data member for a member of the parent-child hierarcy * @param hierarchy Hierarchy * @param list List of members to populate */ void getParentChildContributingChildren( Member dataMember, Hierarchy hierarchy, List list); /** * Returns the parent of member. * * @param member Member * @pre member != null * @return null if member is a root member */ Member getMemberParent(Member member); /** * Returns a list of ancestors of member, in depth order. * *

For example, for [Store].[USA].[CA], returns * {[Store].[USA], [Store].[All Stores]}. * * @param member Member * @param ancestorList List of ancestors */ void getMemberAncestors(Member member, List ancestorList); /** * Returns the depth of a member. * *

This may not be the same as * member.{@link Member#getLevel getLevel}(). * {@link Level#getDepth getDepth}() * for three reasons:

    *
  1. Access control. The most senior visible member has * level 0. If the client is not allowed to see the "All" and "Nation" * levels of the "Store" hierarchy, then members of the "State" level will * have depth 0.
  2. *
  3. Parent-child hierarchies. Suppose Fred reports to Wilma, and * Wilma reports to no one. "All Employees" has depth 0, Wilma has depth * 1, and Fred has depth 2. Fred and Wilma are both in the "Employees" * level, which has depth 1.
  4. *
  5. Ragged hierarchies. If Israel has only one, hidden, province * then the depth of Tel Aviv, Israel is 2, whereas the depth of another * city, San Francisco, CA, USA is 3.
  6. *
*/ int getMemberDepth(Member member); /** * Finds a member based upon its unique name. * * @param uniqueNameParts Unique name of member * @param failIfNotFound Whether to throw an error, as opposed to returning * null, if there is no such member. * @param matchType indicates the match mode; if not specified, EXACT * @return The member, or null if not found */ Member getMemberByUniqueName( List uniqueNameParts, boolean failIfNotFound, MatchType matchType); /** * Finds a member based upon its unique name, requiring an exact match. * *

This method is equivalent to calling * {@link #getMemberByUniqueName(java.util.List, boolean, MatchType)} * with {@link MatchType#EXACT}. * * @param uniqueNameParts Unique name of member * @param failIfNotFound Whether to throw an error, as opposed to returning * null, if there is no such member. * @return The member, or null if not found */ Member getMemberByUniqueName( List uniqueNameParts, boolean failIfNotFound); /** * Looks up an MDX object by name, specifying how to * match if no object exactly matches the name. * *

Resolves a name such as * '[Products].[Product Department].[Produce]' by resolving the * components ('Products', and so forth) one at a time. * * @param parent Parent element to search in * @param names Exploded compound name, such as {"Products", * "Product Department", "Produce"} * @param failIfNotFound If the element is not found, determines whether * to return null or throw an error * @param category Type of returned element, a {@link Category} value; * {@link Category#Unknown} if it doesn't matter. * @param matchType indicates the match mode; if not specified, EXACT * * @pre parent != null * @post !(failIfNotFound && return == null) */ OlapElement lookupCompound( OlapElement parent, List names, boolean failIfNotFound, int category, MatchType matchType); /** * Looks up an MDX object by name. * *

Resolves a name such as * '[Products].[Product Department].[Produce]' by resolving the * components ('Products', and so forth) one at a time. * * @param parent Parent element to search in * @param names Exploded compound name, such as {"Products", * "Product Department", "Produce"} * @param failIfNotFound If the element is not found, determines whether * to return null or throw an error * @param category Type of returned element, a {@link Category} value; * {@link Category#Unknown} if it doesn't matter. * * @pre parent != null * @post !(failIfNotFound && return == null) */ OlapElement lookupCompound( OlapElement parent, List names, boolean failIfNotFound, int category); /** * Should only be called by implementations of * {@link #lookupCompound(OlapElement, java.util.List, boolean, int, MatchType)}. * * @param parent Parent element to search in * @param names Exploded compound name, such as {"Products", * "Product Department", "Produce"} * @param failIfNotFound If the element is not found, determines whether * to return null or throw an error * @param category Type of returned element, a {@link Category} value; * {@link Category#Unknown} if it doesn't matter. * @param matchType indicates the match mode; if not specified, EXACT * @return Found element OlapElement lookupCompoundInternal( OlapElement parent, List names, boolean failIfNotFound, int category, MatchType matchType); */ /** * Looks up a calculated member by name. If the name is not found in the * current scope, returns null. */ Member getCalculatedMember(List nameParts); /** * Looks up a set by name. If the name is not found in the current scope, * returns null. */ NamedSet getNamedSet(List nameParts); /** * Appends to list all members between startMember * and endMember (inclusive) which belong to * level. */ void getMemberRange( Level level, Member startMember, Member endMember, List list); /** * Returns a member n further along in the same level from * member. * * @pre member != null */ Member getLeadMember(Member member, int n); /** * Compares a pair of {@link Member}s according to their order in a prefix * traversal. (that is, it * is an ancestor or a earlier), is a sibling, or comes later in a prefix * traversal. * @return A negative integer if m1 is an ancestor, an earlier * sibling of an ancestor, or a descendent of an earlier sibling, of * m2; * zero if m1 is a sibling of m2; * a positive integer if m1 comes later in the prefix * traversal then m2. */ int compareMembersHierarchically(Member m1, Member m2); /** * Looks up the child of parent called name, or * an approximation according to matchType, returning * null if no element is found. * * @param parent Parent element to search in * @param name Compound in compound name, such as "[Product]" or "&[1]" * @param matchType Match type * * @return Element with given name, or null */ OlapElement getElementChild( OlapElement parent, Id.Segment name, MatchType matchType); /** * Looks up the child of parent name, returning * null if no element is found. * *

Always equivalent to * getElementChild(parent, name, MatchType.EXACT). * * @param parent Parent element to search in * @param name Compound in compound name, such as "[Product]" or "&[1]" * * @return Element with given name, or null */ OlapElement getElementChild( OlapElement parent, Id.Segment name); /** * Returns the members of a level, optionally including calculated members. */ List getLevelMembers( Level level, boolean includeCalculated); /** * Returns the members of a level, optionally filtering out members which * are empty. * * @param level Level * @param context Context for filtering * @return Members of this level */ List getLevelMembers( Level level, Evaluator context); /** * Returns the accessible levels of a hierarchy. * * @param hierarchy Hierarchy * * @pre hierarchy != null * @post return.length >= 1 */ List getHierarchyLevels(Hierarchy hierarchy); /** * Returns the default member of a hierarchy. If the default member is in * an inaccessible level, returns the nearest ascendant/descendant member. * * @param hierarchy Hierarchy * * @return Default member of hierarchy */ Member getHierarchyDefaultMember(Hierarchy hierarchy); /** * Returns whether a member has visible children. */ boolean isDrillable(Member member); /** * Returns whether a member is visible. */ boolean isVisible(Member member); /** * Returns the list of accessible cubes. */ Cube[] getCubes(); /** * Returns a list of calculated members in a given hierarchy. */ List getCalculatedMembers(Hierarchy hierarchy); /** * Returns a list of calculated members in a given level. */ List getCalculatedMembers(Level level); /** * Returns the list of calculated members. */ List getCalculatedMembers(); /** * Finds a child of a member with a given name. */ Member lookupMemberChildByName( Member parent, Id.Segment childName, MatchType matchType); /** * Finds a list of child members with the given names. */ List lookupMemberChildrenByNames( Member parent, List childNames, MatchType matchType); /** * Returns an object which can evaluate an expression in native SQL, or * null if this is not possible. * * @param fun Function * @param args Arguments to the function * @param evaluator Evaluator, provides context * @param calc the calc to be natively evaluated */ NativeEvaluator getNativeSetEvaluator( FunDef fun, Exp[] args, Evaluator evaluator, Calc calc); /** * Returns the definition of a parameter with a given name, or null if not * found. */ Parameter getParameter(String name); /** * Returns the data source. * * @return data source */ DataSource getDataSource(); /** * Returns a similar schema reader that has no access control. * * @return Schema reader that has a similar perspective (e.g. cube) but * no access control */ SchemaReader withoutAccessControl(); /** * Returns the default cube in which to look for dimensions etc. * * @return Default cube */ Cube getCube(); /** * Returns a schema reader that automatically assigns a locus to each * operation. * *

It is less efficient; use this only if the operation is occurring * outside the context of a statement. If you get the internal error * "no locus", that's a sign you should use this method.

* * @return Schema reader that assigns a locus to each operation */ SchemaReader withLocus(); /** * Returns a list of namespaces to search when resolving elements by name. * *

For example, a schema reader from the perspective of a cube will * return cube and schema namespaces.

* * @return List of namespaces */ List getNamespaces(); /** * Similar to {@link #getMemberChildren(Member, Evaluator)} * but returns a map of the grand-children and their access details * and costs more to invoke because of the access controls. * * Called by {@link RolapHierarchy} when determining the lowest access * level of a Role within a hierarchy. */ Map getMemberChildrenWithDetails(Member member, Evaluator evaluator); } // End SchemaReader.java mondrian-3.11.0.1-R/src/main/mondrian/olap/SetBase.java000066400000000000000000000071441261646570300224270ustar00rootroot00000000000000/* // This software is subject to the terms of the Eclipse Public License v1.0 // Agreement, available at the following URL: // http://www.eclipse.org/legal/epl-v10.html. // You must accept the terms of that agreement to use this software. // // Copyright (C) 2001-2005 Julian Hyde // Copyright (C) 2005-2009 Pentaho and others // All Rights Reserved. */ package mondrian.olap; import mondrian.olap.type.*; import org.apache.log4j.Logger; import java.util.Map; /** * Skeleton implementation of {@link NamedSet} interface. * * @author jhyde * @since 6 August, 2001 */ public class SetBase extends OlapElementBase implements NamedSet { private static final Logger LOGGER = Logger.getLogger(SetBase.class); private String name; private Map annotationMap; private String description; private final String uniqueName; private Exp exp; private boolean validated; /** * Creates a SetBase. * * @param name Name * @param caption Caption * @param description Description * @param exp Expression * @param validated Whether has been validated * @param annotationMap Annotations */ SetBase( String name, String caption, String description, Exp exp, boolean validated, Map annotationMap) { this.name = name; this.annotationMap = annotationMap; this.caption = caption; this.description = description; this.exp = exp; this.validated = validated; this.uniqueName = "[" + name + "]"; } public Map getAnnotationMap() { return annotationMap; } public String getNameUniqueWithinQuery() { return System.identityHashCode(this) + ""; } public boolean isDynamic() { return false; } public Object clone() { return new SetBase( name, caption, description, exp.clone(), validated, annotationMap); } protected Logger getLogger() { return LOGGER; } public String getUniqueName() { return uniqueName; } public String getName() { return name; } public String getQualifiedName() { return null; } public String getDescription() { return description; } public Hierarchy getHierarchy() { return exp.getType().getHierarchy(); } public Dimension getDimension() { return getHierarchy().getDimension(); } public OlapElement lookupChild( SchemaReader schemaReader, Id.Segment s, MatchType matchType) { return null; } public void setName(String name) { this.name = name; } public void setDescription(String description) { this.description = description; } public void setAnnotationMap(Map annotationMap) { this.annotationMap = annotationMap; } public Exp getExp() { return exp; } public NamedSet validate(Validator validator) { if (!validated) { exp = validator.validate(exp, false); validated = true; } return this; } public Type getType() { Type type = exp.getType(); if (type instanceof MemberType || type instanceof TupleType) { // You can use a member or tuple as the expression for a set. It is // implicitly converted to a set. The expression may not have been // converted yet, so we wrap the type here. type = new SetType(type); } return type; } } // End SetBase.java mondrian-3.11.0.1-R/src/main/mondrian/olap/SolveOrderMode.java000066400000000000000000000024041261646570300237640ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.olap; /** * Strategies for applying solve order, exposed via the property * {@link MondrianProperties#SolveOrderMode}. */ public enum SolveOrderMode { /** * The SOLVE_ORDER value is absolute regardless of * where it is defined; e.g. a query defined calculated * member with a SOLVE_ORDER of 1 always takes precedence * over a cube defined value of 2. * *

Compatible with Analysis Services 2000, and default behavior * up to mondrian-3.0.3. */ ABSOLUTE, /** * Cube calculated members are resolved before any session * scope calculated members, and session scope members are * resolved before any query defined calculation. The * SOLVE_ORDER value only applies within the scope in which * it was defined. * *

Compatible with Analysis Services 2005, and default behavior * from mondrian-3.0.4 and later. */ SCOPED } // End SolveOrderMode.java mondrian-3.11.0.1-R/src/main/mondrian/olap/StringScanner.java000066400000000000000000000015331261646570300236550ustar00rootroot00000000000000/* // This software is subject to the terms of the Eclipse Public License v1.0 // Agreement, available at the following URL: // http://www.eclipse.org/legal/epl-v10.html. // You must accept the terms of that agreement to use this software. // // Copyright (C) 1998-2005 Julian Hyde // Copyright (C) 2005-2005 Pentaho and others // All Rights Reserved. */ package mondrian.olap; /** * Lexical analyzer whose input is a string. * * @author jhyde, 20 January, 1999 */ public class StringScanner extends Scanner { private final String s; private int i; public StringScanner(String s, boolean debug) { super(debug); this.s = s; i = 0; } // Override Scanner.getChar(). protected int getChar() { return (i >= s.length()) ? -1 : s.charAt(i++); } } // End StringScanner.java mondrian-3.11.0.1-R/src/main/mondrian/olap/Syntax.java000066400000000000000000000254651261646570300223750ustar00rootroot00000000000000/* // This software is subject to the terms of the Eclipse Public License v1.0 // Agreement, available at the following URL: // http://www.eclipse.org/legal/epl-v10.html. // You must accept the terms of that agreement to use this software. // // Copyright (C) 2003-2005 Julian Hyde // Copyright (C) 2005-2009 Pentaho // All Rights Reserved. */ package mondrian.olap; import java.io.PrintWriter; /** * Enumerated values describing the syntax of an expression. * * @author jhyde * @since 21 July, 2003 */ public enum Syntax { /** * Defines syntax for expression invoked FUNCTION() or * FUNCTION(args). */ Function { public void unparse(String fun, Exp[] args, PrintWriter pw) { ExpBase.unparseList(pw, args, fun + "(", ", ", ")"); } }, /** * Defines syntax for expression invoked as object.PROPERTY. */ Property { public void unparse(String fun, Exp[] args, PrintWriter pw) { Util.assertTrue(args.length >= 1); args[0].unparse(pw); // 'this' pw.print("."); pw.print(fun); } public String getSignature( String name, int returnType, int[] argTypes) { // e.g. ".Current" return getTypeDescription(argTypes[0]) + "." + name; } }, /** * Defines syntax for expression invoked invoked as * object.METHOD() or * object.METHOD(args). */ Method { public void unparse(String fun, Exp[] args, PrintWriter pw) { Util.assertTrue(args.length >= 1); args[0].unparse(pw); // 'this' pw.print("."); pw.print(fun); pw.print("("); for (int i = 1; i < args.length; i++) { if (i > 1) { pw.print(", "); } args[i].unparse(pw); } pw.print(")"); } public String getSignature(String name, int returnType, int[] argTypes) { // e.g. ".Lead()" return (returnType == Category.Unknown ? "" : getTypeDescription(returnType) + " ") + getTypeDescription(argTypes[0]) + "." + name + "(" + getTypeDescriptionCommaList(argTypes, 1) + ")"; } }, /** * Defines syntax for expression invoked as arg OPERATOR arg * (like '+' or 'AND'). */ Infix { public void unparse(String fun, Exp[] args, PrintWriter pw) { if (needParen(args)) { ExpBase.unparseList(pw, args, "(", " " + fun + " ", ")"); } else { ExpBase.unparseList(pw, args, "", " " + fun + " ", ""); } } public String getSignature(String name, int returnType, int[] argTypes) { // e.g. " / " return getTypeDescription(argTypes[0]) + " " + name + " " + getTypeDescription(argTypes[1]); } }, /** * Defines syntax for expression invoked as OPERATOR arg * (like unary '-'). */ Prefix { public void unparse(String fun, Exp[] args, PrintWriter pw) { if (needParen(args)) { ExpBase.unparseList(pw, args, "(" + fun + " ", null, ")"); } else { ExpBase.unparseList(pw, args, fun + " ", null, ""); } } public String getSignature(String name, int returnType, int[] argTypes) { // e.g. "- " return name + " " + getTypeDescription(argTypes[0]); } }, /** * Defines syntax for expression invoked as arg OPERATOR * (like IS EMPTY). */ Postfix { public void unparse(String fun, Exp[] args, PrintWriter pw) { if (needParen(args)) { ExpBase.unparseList(pw, args, "(", null, " " + fun + ")"); } else { ExpBase.unparseList(pw, args, "", null, " " + fun); } } public String getSignature(String name, int returnType, int[] argTypes) { // e.g. " IS NULL" return getTypeDescription(argTypes[0]) + " " + name; } }, /** * Defines syntax for expression invoked as * {ARG, ...}; that * is, the set construction operator. */ Braces { public String getSignature(String name, int returnType, int[] argTypes) { return "{" + getTypeDescriptionCommaList(argTypes, 0) + "}"; } public void unparse(String fun, Exp[] args, PrintWriter pw) { ExpBase.unparseList(pw, args, "{", ", ", "}"); } }, /** * Defines syntax for expression invoked as (ARG) or * (ARG, ...); that is, parentheses for grouping * expressions, and the tuple construction operator. */ Parentheses { public String getSignature(String name, int returnType, int[] argTypes) { return "(" + getTypeDescriptionCommaList(argTypes, 0) + ")"; } public void unparse(String fun, Exp[] args, PrintWriter pw) { ExpBase.unparseList(pw, args, "(", ", ", ")"); } }, /** * Defines syntax for expression invoked as CASE ... END. */ Case { public void unparse(String fun, Exp[] args, PrintWriter pw) { if (fun.equals("_CaseTest")) { pw.print("CASE"); int j = 0; int clauseCount = (args.length - j) / 2; for (int i = 0; i < clauseCount; i++) { pw.print(" WHEN "); args[j++].unparse(pw); pw.print(" THEN "); args[j++].unparse(pw); } if (j < args.length) { pw.print(" ELSE "); args[j++].unparse(pw); } Util.assertTrue(j == args.length); pw.print(" END"); } else { Util.assertTrue(fun.equals("_CaseMatch")); pw.print("CASE "); int j = 0; args[j++].unparse(pw); int clauseCount = (args.length - j) / 2; for (int i = 0; i < clauseCount; i++) { pw.print(" WHEN "); args[j++].unparse(pw); pw.print(" THEN "); args[j++].unparse(pw); } if (j < args.length) { pw.print(" ELSE "); args[j++].unparse(pw); } Util.assertTrue(j == args.length); pw.print(" END"); } } public String getSignature(String name, int returnType, int[] argTypes) { String s = getTypeDescription(argTypes[0]); if (argTypes[0] == Category.Logical) { return "CASE WHEN " + s + " THEN ... END"; } else { return "CASE " + s + " WHEN " + s + " THEN ... END"; } } }, /** * Defines syntax for expression generated by the Mondrian system which * cannot be specified syntactically. */ Internal, /** * Defines syntax for a CAST expression * CAST(expression AS type). */ Cast { public void unparse(String fun, Exp[] args, PrintWriter pw) { pw.print("CAST("); args[0].unparse(pw); pw.print(" AS "); args[1].unparse(pw); pw.print(")"); } public String getSignature(String name, int returnType, int[] argTypes) { return "CAST( AS )"; } }, /** * Defines syntax for expression invoked object.&PROPERTY * (a variant of {@link #Property}). */ QuotedProperty, /** * Defines syntax for expression invoked object.[&PROPERTY] * (a variant of {@link #Property}). */ AmpersandQuotedProperty, /** * Defines the syntax for an empty expression. Empty expressions can occur * within function calls, and are denoted by a pair of commas with only * whitespace between them, for example * *

* DrillDownLevelTop({[Product].[All Products]}, 3, , * [Measures].[Unit Sales]) *
*/ Empty { public void unparse(String fun, Exp[] args, PrintWriter pw) { assert args.length == 0; } public String getSignature(String name, int returnType, int[] argTypes) { return ""; }}; /** * Converts a call to a function of this syntax into source code. * * @param fun Function name * @param args Arguments to the function * @param pw Writer */ public void unparse(String fun, Exp[] args, PrintWriter pw) { throw new UnsupportedOperationException(); } /** * Returns a description of the signature of a function call, for * example, "CoalesceEmpty(, )". * * @param name Function name * @param returnType Function's return category * @param argTypes Categories of the function's arguments * @return Function signature */ public String getSignature(String name, int returnType, int[] argTypes) { // e.g. "StripCalculatedMembers()" return (returnType == Category.Unknown ? "" : getTypeDescription(returnType) + " ") + name + "(" + getTypeDescriptionCommaList(argTypes, 0) + ")"; } private static boolean needParen(Exp[] args) { return !(args.length == 1 && args[0] instanceof FunCall && ((FunCall) args[0]).getSyntax() == Syntax.Parentheses); } private static String getTypeDescription(int type) { return "<" + Category.instance.getDescription(type & Category.Mask) + ">"; } private static String getTypeDescriptionCommaList(int[] types, int start) { int initialSize = (types.length - start) * 16; StringBuilder sb = new StringBuilder(initialSize > 0 ? initialSize : 16); for (int i = start; i < types.length; i++) { if (i > start) { sb.append(", "); } sb.append("<") .append( Category.instance.getDescription(types[i] & Category.Mask)) .append(">"); } return sb.toString(); } } // End Syntax.java mondrian-3.11.0.1-R/src/main/mondrian/olap/UnionRoleImpl.java000066400000000000000000000262161261646570300236360ustar00rootroot00000000000000/* // This software is subject to the terms of the Eclipse Public License v1.0 // Agreement, available at the following URL: // http://www.eclipse.org/legal/epl-v10.html. // You must accept the terms of that agreement to use this software. // // Copyright (C) 2002-2015 Pentaho and others // All Rights Reserved. */ package mondrian.olap; import org.apache.log4j.Logger; import java.util.ArrayList; import java.util.List; /** * Implementation of {@link Role} which combines the privileges of several * roles and has the superset of their privileges. * * @see mondrian.olap.RoleImpl#union(java.util.List) * * @author jhyde * @since Nov 26, 2007 */ class UnionRoleImpl implements Role { private static final Logger LOGGER = Logger.getLogger(UnionRoleImpl.class); private final List roleList; /** * Creates a UnionRoleImpl. * * @param roleList List of constituent roles */ UnionRoleImpl(List roleList) { this.roleList = new ArrayList(roleList); } public int hashCode() { int hash = 11; for (Role r : roleList) { hash = Util.hash(hash, r); } return hash; } public boolean equals(Object obj) { if (obj == null) { return false; } if (!(obj instanceof UnionRoleImpl)) { return false; } final UnionRoleImpl r = (UnionRoleImpl) obj; if (r.roleList.size() != this.roleList.size()) { return false; } for (int cpt = 0; cpt < this.roleList.size(); cpt++) { if (!this.roleList.get(cpt).equals(r.roleList.get(cpt))) { return false; } } return true; } public Access getAccess(Schema schema) { Access access = Access.NONE; for (Role role : roleList) { access = max(access, role.getAccess(schema)); if (access == Access.ALL) { break; } } LOGGER.debug( "Access level " + access + " granted to schema " + schema.getName() + " because of a union of roles."); return access; } /** * Returns the larger of two enum values. Useful if the enums are sorted * so that more permissive values come after less permissive values. * * @param t1 First value * @param t2 Second value * @return larger of the two values */ private static > T max(T t1, T t2) { if (t1.ordinal() > t2.ordinal()) { return t1; } else { return t2; } } public Access getAccess(Cube cube) { Access access = Access.NONE; for (Role role : roleList) { access = max(access, role.getAccess(cube)); if (access == Access.ALL) { break; } } LOGGER.debug( "Access level " + access + " granted to cube " + cube.getName() + " because of a union of roles."); return access; } public Access getAccess(Dimension dimension) { Access access = Access.NONE; for (Role role : roleList) { access = max(access, role.getAccess(dimension)); if (access == Access.ALL) { break; } } LOGGER.debug( "Access level " + access + " granted to dimension " + dimension.getUniqueName() + " because of a union of roles."); return access; } public Access getAccess(Hierarchy hierarchy) { Access access = Access.NONE; for (Role role : roleList) { access = max(access, role.getAccess(hierarchy)); if (access == Access.ALL) { break; } } LOGGER.debug( "Access level " + access + " granted to hierarchy " + hierarchy.getUniqueName() + " because of a union of roles."); return access; } public HierarchyAccess getAccessDetails(final Hierarchy hierarchy) { List list = new ArrayList(); for (Role role : roleList) { final HierarchyAccess accessDetails = role.getAccessDetails(hierarchy); if (accessDetails != null) { list.add(accessDetails); } } // If none of the roles call out access details, we shouldn't either. if (list.isEmpty()) { return null; } HierarchyAccess hierarchyAccess = new UnionHierarchyAccessImpl(hierarchy, list); if (list.size() > 5) { hierarchyAccess = new RoleImpl.CachingHierarchyAccess(hierarchyAccess); } return hierarchyAccess; } public Access getAccess(Level level) { Access access = Access.NONE; for (Role role : roleList) { access = max(access, role.getAccess(level)); if (access == Access.ALL) { break; } } LOGGER.debug( "Access level " + access + " granted to level " + level.getUniqueName() + " because of a union of roles."); return access; } public Access getAccess(Member member) { assert member != null; HierarchyAccess hierarchyAccess = getAccessDetails(member.getHierarchy()); if (hierarchyAccess != null) { return hierarchyAccess.getAccess(member); } final Access access = getAccess(member.getDimension()); LOGGER.debug( "Access level " + access + " granted to member " + member.getUniqueName() + " because of a union of roles."); return access; } public Access getAccess(NamedSet set) { Access access = Access.NONE; for (Role role : roleList) { access = max(access, role.getAccess(set)); if (access == Access.ALL) { break; } } LOGGER.debug( "Access level " + access + " granted to set " + set.getUniqueName() + " because of a union of roles."); return access; } public boolean canAccess(OlapElement olapElement) { for (Role role : roleList) { if (role.canAccess(olapElement)) { return true; } } return false; } /** * Implementation of {@link mondrian.olap.Role.HierarchyAccess} that * gives access to an object if any one of the constituent hierarchy * accesses has access to that object. */ private class UnionHierarchyAccessImpl implements HierarchyAccess { private final List list; private final Hierarchy hierarchy; /** * Creates a UnionHierarchyAccessImpl. * * @param hierarchy Hierarchy * @param list List of underlying hierarchy accesses */ UnionHierarchyAccessImpl( Hierarchy hierarchy, List list) { this.hierarchy = hierarchy; this.list = list; } public Access getAccess(Member member) { Access access = Access.NONE; final int roleCount = roleList.size(); for (int i = 0; i < roleCount; i++) { Role role = roleList.get(i); access = max(access, role.getAccess(member)); if (access == Access.ALL) { break; } } LOGGER.debug( "Access level " + access + " granted to member " + member.getUniqueName() + " because of a union of roles."); return access; } public int getTopLevelDepth() { if (!isTopLeveRestricted()) { // We don't restrict the top level. // Return 0 for root. return 0; } int access = Integer.MAX_VALUE; for (HierarchyAccess hierarchyAccess : list) { if (hierarchyAccess.getTopLevelDepth() == 0) { // No restrictions. Skip. continue; } access = Math.min( access, hierarchyAccess.getTopLevelDepth()); if (access == 0) { break; } } return access; } public int getBottomLevelDepth() { if (!isBottomLeveRestricted()) { // We don't restrict the bottom level. return list.get(0).getBottomLevelDepth(); } int access = -1; for (HierarchyAccess hierarchyAccess : list) { if (hierarchyAccess.getBottomLevelDepth() == hierarchy.getLevels().length) { // No restrictions. Skip. continue; } access = Math.max( access, hierarchyAccess.getBottomLevelDepth()); } return access; } public RollupPolicy getRollupPolicy() { RollupPolicy rollupPolicy = RollupPolicy.HIDDEN; for (HierarchyAccess hierarchyAccess : list) { rollupPolicy = max( rollupPolicy, hierarchyAccess.getRollupPolicy()); if (rollupPolicy == RollupPolicy.FULL) { break; } } return rollupPolicy; } public boolean hasInaccessibleDescendants(Member member) { // If any of the roles return all the members, // we assume that all descendants are accessible when // we create a union of these roles. final Access unionAccess = getAccess(member); if (unionAccess == Access.ALL) { return false; } if (unionAccess == Access.NONE) { return true; } for (HierarchyAccess hierarchyAccess : list) { if (hierarchyAccess.getAccess(member) == Access.CUSTOM && !hierarchyAccess.hasInaccessibleDescendants(member)) { return false; } } // All of the roles have restricted the descendants in // some way. return true; } private boolean isTopLeveRestricted() { for (HierarchyAccess hierarchyAccess : list) { if (hierarchyAccess.getTopLevelDepth() > 0) { return true; } } return false; } private boolean isBottomLeveRestricted() { for (HierarchyAccess hierarchyAccess : list) { if (hierarchyAccess.getBottomLevelDepth() == hierarchy.getLevels().length) { return true; } } return false; } } } // End UnionRoleImpl.java mondrian-3.11.0.1-R/src/main/mondrian/olap/Util.java000066400000000000000000004403511261646570300220170ustar00rootroot00000000000000/* // This software is subject to the terms of the Eclipse Public License v1.0 // Agreement, available at the following URL: // http://www.eclipse.org/legal/epl-v10.html. // You must accept the terms of that agreement to use this software. // // Copyright (C) 2001-2005 Julian Hyde // Copyright (C) 2005-2015 Pentaho and others // All Rights Reserved. */ package mondrian.olap; import mondrian.mdx.*; import mondrian.olap.fun.FunUtil; import mondrian.olap.fun.Resolver; import mondrian.olap.type.Type; import mondrian.resource.MondrianResource; import mondrian.rolap.*; import mondrian.spi.UserDefinedFunction; import mondrian.util.*; import org.apache.commons.collections.keyvalue.AbstractMapEntry; import org.apache.commons.io.IOUtils; import org.apache.commons.vfs2.FileContent; import org.apache.commons.vfs2.FileObject; import org.apache.commons.vfs2.FileSystemException; import org.apache.commons.vfs2.FileSystemManager; import org.apache.commons.vfs2.VFS; import org.apache.commons.vfs2.provider.http.HttpFileObject; import org.apache.log4j.Logger; import org.eigenbase.xom.XOMUtil; import org.olap4j.impl.Olap4jUtil; import org.olap4j.mdx.*; import java.io.*; import java.lang.ref.Reference; import java.lang.reflect.*; import java.lang.reflect.Array; import java.math.BigDecimal; import java.net.MalformedURLException; import java.net.URL; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.sql.*; import java.sql.Connection; import java.util.*; import java.util.concurrent.*; import java.util.concurrent.atomic.AtomicInteger; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * Utility functions used throughout mondrian. All methods are static. * * @author jhyde * @since 6 August, 2001 */ public class Util extends XOMUtil { public static final String nl = System.getProperty("line.separator"); private static final Logger LOGGER = Logger.getLogger(Util.class); /** * Placeholder which indicates a value NULL. */ public static final Object nullValue = new Double(FunUtil.DoubleNull); /** * Placeholder which indicates an EMPTY value. */ public static final Object EmptyValue = new Double(FunUtil.DoubleEmpty); /** * Cumulative time spent accessing the database. */ private static long databaseMillis = 0; /** * Random number generator to provide seed for other random number * generators. */ private static final Random metaRandom = createRandom(MondrianProperties.instance().TestSeed.get()); /** Unique id for this JVM instance. Part of a key that ensures that if * two JVMs in the same cluster have a data-source with the same * identity-hash-code, they will be treated as different data-sources, * and therefore caches will not be incorrectly shared. */ public static final UUID JVM_INSTANCE_UUID = UUID.randomUUID(); /** * Whether this is an IBM JVM. */ public static final boolean IBM_JVM = System.getProperties().getProperty("java.vendor").equals( "IBM Corporation"); /** * What version of JDBC? * Returns:
    *
  • 0x0401 in JDK 1.7 and higher
  • *
  • 0x0400 in JDK 1.6
  • *
  • 0x0300 otherwise
  • *
*/ public static final int JdbcVersion = System.getProperty("java.version").compareTo("1.7") >= 0 ? 0x0401 : System.getProperty("java.version").compareTo("1.6") >= 0 ? 0x0400 : 0x0300; /** * Whether the code base has re-engineered using retroweaver. * If this is the case, some functionality is not available, but a lot of * things are available via {@link mondrian.util.UtilCompatible}. * Retroweaver has some problems involving {@link java.util.EnumSet}. */ public static final boolean Retrowoven = Access.class.getSuperclass().getName().equals( "net.sourceforge.retroweaver.runtime.java.lang.Enum"); private static final UtilCompatible compatible; /** * Flag to control expensive debugging. (More expensive than merely * enabling assertions: as we know, a lot of people run with assertions * enabled.) */ public static final boolean DEBUG = false; static { compatible = new UtilCompatibleJdk16(); } public static boolean isNull(Object o) { return o == null || o == nullValue; } /** * Returns whether a list is strictly sorted. * * @param list List * @return whether list is sorted */ public static boolean isSorted(List list) { T prev = null; for (T t : list) { if (prev != null && ((Comparable) prev).compareTo(t) >= 0) { return false; } prev = t; } return true; } /** * Parses a string and returns a SHA-256 checksum of it. * * @param value The source string to parse. * @return A checksum of the source string. */ public static byte[] digestSha256(String value) { final MessageDigest algorithm; try { algorithm = MessageDigest.getInstance("SHA-256"); } catch (NoSuchAlgorithmException e) { throw new RuntimeException(e); } return algorithm.digest(value.getBytes()); } /** * Creates an MD5 hash of a String. * * @param value String to create one way hash upon. * @return MD5 hash. */ public static byte[] digestMd5(final String value) { final MessageDigest algorithm; try { algorithm = MessageDigest.getInstance("MD5"); } catch (NoSuchAlgorithmException e) { throw new RuntimeException(e); } return algorithm.digest(value.getBytes()); } /** * Creates an {@link ExecutorService} object backed by a thread pool. * @param maximumPoolSize Maximum number of concurrent * threads. * @param corePoolSize Minimum number of concurrent * threads to maintain in the pool, even if they are * idle. * @param keepAliveTime Time, in seconds, for which to * keep alive unused threads. * @param name The name of the threads. * @param rejectionPolicy The rejection policy to enforce. * @return An executor service preconfigured. */ public static ExecutorService getExecutorService( int maximumPoolSize, int corePoolSize, long keepAliveTime, final String name, RejectedExecutionHandler rejectionPolicy) { // We must create a factory where the threads // have the right name and are marked as daemon threads. final ThreadFactory factory = new ThreadFactory() { private final AtomicInteger counter = new AtomicInteger(0); public Thread newThread(Runnable r) { final Thread t = Executors.defaultThreadFactory().newThread(r); t.setDaemon(true); t.setName(name + '_' + counter.incrementAndGet()); return t; } }; // Ok, create the executor final ThreadPoolExecutor executor = new ThreadPoolExecutor( corePoolSize, maximumPoolSize > 0 ? maximumPoolSize : Integer.MAX_VALUE, keepAliveTime, TimeUnit.SECONDS, // we use a sync queue. any other type of queue // will prevent the tasks from running concurrently // because the executors API requires blocking queues. // Important to pass true here. This makes the // order of tasks deterministic. // TODO Write a non-blocking queue which implements // the blocking queue API so we can pass that to the // executor. new LinkedBlockingQueue(), factory); // Set the rejection policy if required. if (rejectionPolicy != null) { executor.setRejectedExecutionHandler( rejectionPolicy); } // Done return executor; } /** * Creates an {@link ScheduledExecutorService} object backed by a * thread pool with a fixed number of threads.. * @param maxNbThreads Maximum number of concurrent * threads. * @param name The name of the threads. * @return An scheduled executor service preconfigured. */ public static ScheduledExecutorService getScheduledExecutorService( final int maxNbThreads, final String name) { return Executors.newScheduledThreadPool( maxNbThreads, new ThreadFactory() { final AtomicInteger counter = new AtomicInteger(0); public Thread newThread(Runnable r) { final Thread thread = Executors.defaultThreadFactory().newThread(r); thread.setDaemon(true); thread.setName(name + '_' + counter.incrementAndGet()); return thread; } } ); } /** * Encodes string for MDX (escapes ] as ]] inside a name). * * @deprecated Will be removed in 4.0 */ public static String mdxEncodeString(String st) { StringBuilder retString = new StringBuilder(st.length() + 20); for (int i = 0; i < st.length(); i++) { char c = st.charAt(i); if ((c == ']') && ((i + 1) < st.length()) && (st.charAt(i + 1) != '.')) { retString.append(']'); // escaping character } retString.append(c); } return retString.toString(); } /** * Converts a string into a double-quoted string. */ public static String quoteForMdx(String val) { StringBuilder buf = new StringBuilder(val.length() + 20); quoteForMdx(buf, val); return buf.toString(); } /** * Appends a double-quoted string to a string builder. */ public static StringBuilder quoteForMdx(StringBuilder buf, String val) { buf.append("\""); String s0 = replace(val, "\"", "\"\""); buf.append(s0); buf.append("\""); return buf; } /** * Return string quoted in [...]. For example, "San Francisco" becomes * "[San Francisco]"; "a [bracketed] string" becomes * "[a [bracketed]] string]". */ public static String quoteMdxIdentifier(String id) { StringBuilder buf = new StringBuilder(id.length() + 20); quoteMdxIdentifier(id, buf); return buf.toString(); } public static void quoteMdxIdentifier(String id, StringBuilder buf) { buf.append('['); int start = buf.length(); buf.append(id); replace(buf, start, "]", "]]"); buf.append(']'); } /** * Return identifiers quoted in [...].[...]. For example, {"Store", "USA", * "California"} becomes "[Store].[USA].[California]". */ public static String quoteMdxIdentifier(List ids) { StringBuilder sb = new StringBuilder(64); quoteMdxIdentifier(ids, sb); return sb.toString(); } public static void quoteMdxIdentifier( List ids, StringBuilder sb) { for (int i = 0; i < ids.size(); i++) { if (i > 0) { sb.append('.'); } ids.get(i).toString(sb); } } /** * Quotes a string literal for Java or JavaScript. * * @param s Unquoted literal * @return Quoted string literal */ public static String quoteJavaString(String s) { return s == null ? "null" : "\"" + s.replaceAll("\\\\", "\\\\\\\\") .replaceAll("\\\"", "\\\\\"") + "\""; } /** * Returns true if two objects are equal, or are both null. * * @param s First object * @param t Second object * @return Whether objects are equal or both null */ public static boolean equals(Object s, Object t) { if (s == t) { return true; } if (s == null || t == null) { return false; } return s.equals(t); } /** * Returns true if two strings are equal, or are both null. * *

The result is not affected by * {@link MondrianProperties#CaseSensitive the case sensitive option}; if * you wish to compare names, use {@link #equalName(String, String)}. */ public static boolean equals(String s, String t) { return equals((Object) s, (Object) t); } /** * Returns whether two names are equal. * Takes into account the * {@link MondrianProperties#CaseSensitive case sensitive option}. * Names may be null. */ public static boolean equalName(String s, String t) { if (s == null) { return t == null; } boolean caseSensitive = MondrianProperties.instance().CaseSensitive.get(); return caseSensitive ? s.equals(t) : s.equalsIgnoreCase(t); } /** * Tests two strings for equality, optionally ignoring case. * * @param s First string * @param t Second string * @param matchCase Whether to perform case-sensitive match * @return Whether strings are equal */ public static boolean equal(String s, String t, boolean matchCase) { return matchCase ? s.equals(t) : s.equalsIgnoreCase(t); } /** * Compares two names. if case sensitive flag is false, * apply finer grain difference with case sensitive * Takes into account the {@link MondrianProperties#CaseSensitive case * sensitive option}. * Names must not be null. */ public static int caseSensitiveCompareName(String s, String t) { boolean caseSensitive = MondrianProperties.instance().CaseSensitive.get(); if (caseSensitive) { return s.compareTo(t); } else { int v = s.compareToIgnoreCase(t); // if ignore case returns 0 compare in a case sensitive manner // this was introduced to solve an issue with Member.equals() // and Member.compareTo() not agreeing with each other return v == 0 ? s.compareTo(t) : v; } } /** * Compares two names. * Takes into account the {@link MondrianProperties#CaseSensitive case * sensitive option}. * Names must not be null. */ public static int compareName(String s, String t) { boolean caseSensitive = MondrianProperties.instance().CaseSensitive.get(); return caseSensitive ? s.compareTo(t) : s.compareToIgnoreCase(t); } /** * Generates a normalized form of a name, for use as a key into a map. * Returns the upper case name if * {@link MondrianProperties#CaseSensitive} is true, the name unchanged * otherwise. */ public static String normalizeName(String s) { return MondrianProperties.instance().CaseSensitive.get() ? s : s.toUpperCase(); } /** * Returns the result of ((Comparable) k1).compareTo(k2), with * special-casing for the fact that Boolean only became * comparable in JDK 1.5. * * @see Comparable#compareTo */ public static int compareKey(Object k1, Object k2) { if (k1 instanceof Boolean) { // Luckily, "F" comes before "T" in the alphabet. k1 = k1.toString(); k2 = k2.toString(); } return ((Comparable) k1).compareTo(k2); } /** * Compares integer values. * * @param i0 First integer * @param i1 Second integer * @return Comparison of integers */ public static int compare(int i0, int i1) { return i0 < i1 ? -1 : (i0 == i1 ? 0 : 1); } /** * Returns a string with every occurrence of a seek string replaced with * another. */ public static String replace(String s, String find, String replace) { // let's be optimistic int found = s.indexOf(find); if (found == -1) { return s; } StringBuilder sb = new StringBuilder(s.length() + 20); int start = 0; char[] chars = s.toCharArray(); final int step = find.length(); if (step == 0) { // Special case where find is "". sb.append(s); replace(sb, 0, find, replace); } else { for (;;) { sb.append(chars, start, found - start); if (found == s.length()) { break; } sb.append(replace); start = found + step; found = s.indexOf(find, start); if (found == -1) { found = s.length(); } } } return sb.toString(); } /** * Replaces all occurrences of a string in a buffer with another. * * @param buf String buffer to act on * @param start Ordinal within find to start searching * @param find String to find * @param replace String to replace it with * @return The string buffer */ public static StringBuilder replace( StringBuilder buf, int start, String find, String replace) { // Search and replace from the end towards the start, to avoid O(n ^ 2) // copying if the string occurs very commonly. int findLength = find.length(); if (findLength == 0) { // Special case where the seek string is empty. for (int j = buf.length(); j >= 0; --j) { buf.insert(j, replace); } return buf; } int k = buf.length(); while (k > 0) { int i = buf.lastIndexOf(find, k); if (i < start) { break; } buf.replace(i, i + find.length(), replace); // Step back far enough to ensure that the beginning of the section // we just replaced does not cause a match. k = i - findLength; } return buf; } /** * Parses an MDX identifier such as [Foo].[Bar].Baz.&Key&Key2 * and returns the result as a list of segments. * * @param s MDX identifier * @return List of segments */ public static List parseIdentifier(String s) { return convert( org.olap4j.impl.IdentifierParser.parseIdentifier(s)); } /** * Converts an array of name parts {"part1", "part2"} into a single string * "[part1].[part2]". If the names contain "]" they are escaped as "]]". */ public static String implode(List names) { StringBuilder sb = new StringBuilder(64); for (int i = 0; i < names.size(); i++) { if (i > 0) { sb.append("."); } // FIXME: should be: // names.get(i).toString(sb); // but that causes some tests to fail Id.Segment segment = names.get(i); switch (segment.getQuoting()) { case UNQUOTED: segment = new Id.NameSegment(((Id.NameSegment) segment).name); } segment.toString(sb); } return sb.toString(); } public static String makeFqName(String name) { return quoteMdxIdentifier(name); } public static String makeFqName(OlapElement parent, String name) { if (parent == null) { return Util.quoteMdxIdentifier(name); } else { StringBuilder buf = new StringBuilder(64); buf.append(parent.getUniqueName()); buf.append('.'); Util.quoteMdxIdentifier(name, buf); return buf.toString(); } } public static String makeFqName(String parentUniqueName, String name) { if (parentUniqueName == null) { return quoteMdxIdentifier(name); } else { StringBuilder buf = new StringBuilder(64); buf.append(parentUniqueName); buf.append('.'); Util.quoteMdxIdentifier(name, buf); return buf.toString(); } } public static OlapElement lookupCompound( SchemaReader schemaReader, OlapElement parent, List names, boolean failIfNotFound, int category) { return lookupCompound( schemaReader, parent, names, failIfNotFound, category, MatchType.EXACT); } /** * Resolves a name such as * '[Products].[Product Department].[Produce]' by resolving the * components ('Products', and so forth) one at a time. * * @param schemaReader Schema reader, supplies access-control context * @param parent Parent element to search in * @param names Exploded compound name, such as {"Products", * "Product Department", "Produce"} * @param failIfNotFound If the element is not found, determines whether * to return null or throw an error * @param category Type of returned element, a {@link Category} value; * {@link Category#Unknown} if it doesn't matter. * * @pre parent != null * @post !(failIfNotFound && return == null) * * @see #parseIdentifier(String) */ public static OlapElement lookupCompound( SchemaReader schemaReader, OlapElement parent, List names, boolean failIfNotFound, int category, MatchType matchType) { Util.assertPrecondition(parent != null, "parent != null"); if (LOGGER.isDebugEnabled()) { StringBuilder buf = new StringBuilder(64); buf.append("Util.lookupCompound: "); buf.append("parent.name="); buf.append(parent.getName()); buf.append(", category="); buf.append(Category.instance.getName(category)); buf.append(", names="); quoteMdxIdentifier(names, buf); LOGGER.debug(buf.toString()); } // First look up a member from the cache of calculated members // (cubes and queries both have them). switch (category) { case Category.Member: case Category.Unknown: Member member = schemaReader.getCalculatedMember(names); if (member != null) { return member; } } // Likewise named set. switch (category) { case Category.Set: case Category.Unknown: NamedSet namedSet = schemaReader.getNamedSet(names); if (namedSet != null) { return namedSet; } } // Now resolve the name one part at a time. for (int i = 0; i < names.size(); i++) { OlapElement child; Id.NameSegment name; if (names.get(i) instanceof Id.NameSegment) { name = (Id.NameSegment) names.get(i); child = schemaReader.getElementChild(parent, name, matchType); } else if (parent instanceof RolapLevel && names.get(i) instanceof Id.KeySegment && names.get(i).getKeyParts().size() == 1) { // The following code is for SsasCompatibleNaming=false. // Continues the very limited support for key segments in // mondrian-3.x. To be removed in mondrian-4, when // SsasCompatibleNaming=true is the only option. final Id.KeySegment keySegment = (Id.KeySegment) names.get(i); name = keySegment.getKeyParts().get(0); final List levelMembers = schemaReader.getLevelMembers( (Level) parent, false); child = null; for (Member member : levelMembers) { if (((RolapMember) member).getKey().toString().equals( name.getName())) { child = member; break; } } } else { name = null; child = schemaReader.getElementChild(parent, name, matchType); } // if we're doing a non-exact match, and we find a non-exact // match, then for an after match, return the first child // of each subsequent level; for a before match, return the // last child if (child instanceof Member && !matchType.isExact() && !Util.equalName(child.getName(), name.getName())) { Member bestChild = (Member) child; for (int j = i + 1; j < names.size(); j++) { List childrenList = schemaReader.getMemberChildren(bestChild); FunUtil.hierarchizeMemberList(childrenList, false); if (matchType == MatchType.AFTER) { bestChild = childrenList.get(0); } else { bestChild = childrenList.get(childrenList.size() - 1); } if (bestChild == null) { child = null; break; } } parent = bestChild; break; } if (child == null) { if (LOGGER.isDebugEnabled()) { LOGGER.debug( "Util.lookupCompound: " + "parent.name=" + parent.getName() + " has no child with name=" + name); } if (!failIfNotFound) { return null; } else if (category == Category.Member) { throw MondrianResource.instance().MemberNotFound.ex( quoteMdxIdentifier(names)); } else { throw MondrianResource.instance().MdxChildObjectNotFound .ex(name.toString(), parent.getQualifiedName()); } } parent = child; if (matchType == MatchType.EXACT_SCHEMA) { matchType = MatchType.EXACT; } } if (LOGGER.isDebugEnabled()) { LOGGER.debug( "Util.lookupCompound: " + "found child.name=" + parent.getName() + ", child.class=" + parent.getClass().getName()); } switch (category) { case Category.Dimension: if (parent instanceof Dimension) { return parent; } else if (parent instanceof Hierarchy) { return parent.getDimension(); } else if (failIfNotFound) { throw Util.newError( "Can not find dimension '" + implode(names) + "'"); } else { return null; } case Category.Hierarchy: if (parent instanceof Hierarchy) { return parent; } else if (parent instanceof Dimension) { return parent.getHierarchy(); } else if (failIfNotFound) { throw Util.newError( "Can not find hierarchy '" + implode(names) + "'"); } else { return null; } case Category.Level: if (parent instanceof Level) { return parent; } else if (failIfNotFound) { throw Util.newError( "Can not find level '" + implode(names) + "'"); } else { return null; } case Category.Member: if (parent instanceof Member) { return parent; } else if (failIfNotFound) { throw MondrianResource.instance().MdxCantFindMember.ex( implode(names)); } else { return null; } case Category.Unknown: assertPostcondition(parent != null, "return != null"); return parent; default: throw newInternal("Bad switch " + category); } } public static OlapElement lookup(Query q, List nameParts) { final Exp exp = lookup(q, nameParts, false); if (exp instanceof MemberExpr) { MemberExpr memberExpr = (MemberExpr) exp; return memberExpr.getMember(); } else if (exp instanceof LevelExpr) { LevelExpr levelExpr = (LevelExpr) exp; return levelExpr.getLevel(); } else if (exp instanceof HierarchyExpr) { HierarchyExpr hierarchyExpr = (HierarchyExpr) exp; return hierarchyExpr.getHierarchy(); } else if (exp instanceof DimensionExpr) { DimensionExpr dimensionExpr = (DimensionExpr) exp; return dimensionExpr.getDimension(); } else { throw Util.newInternal("Not an olap element: " + exp); } } /** * Converts an identifier into an expression by resolving its parts into * an OLAP object (dimension, hierarchy, level or member) within the * context of a query. * *

If allowProp is true, also allows property references * from valid members, for example * [Measures].[Unit Sales].FORMATTED_VALUE. * In this case, the result will be a {@link mondrian.mdx.ResolvedFunCall}. * * @param q Query expression belongs to * @param nameParts Parts of the identifier * @param allowProp Whether to allow property references * @return OLAP object or property reference */ public static Exp lookup( Query q, List nameParts, boolean allowProp) { return lookup(q, q.getSchemaReader(true), nameParts, allowProp); } /** * Converts an identifier into an expression by resolving its parts into * an OLAP object (dimension, hierarchy, level or member) within the * context of a query. * *

If allowProp is true, also allows property references * from valid members, for example * [Measures].[Unit Sales].FORMATTED_VALUE. * In this case, the result will be a {@link ResolvedFunCall}. * * @param q Query expression belongs to * @param schemaReader Schema reader * @param segments Parts of the identifier * @param allowProp Whether to allow property references * @return OLAP object or property reference */ public static Exp lookup( Query q, SchemaReader schemaReader, List segments, boolean allowProp) { // First, look for a calculated member defined in the query. final String fullName = quoteMdxIdentifier(segments); // Look for any kind of object (member, level, hierarchy, // dimension) in the cube. Use a schema reader without restrictions. final SchemaReader schemaReaderSansAc = schemaReader.withoutAccessControl().withLocus(); final Cube cube = q.getCube(); OlapElement olapElement = schemaReaderSansAc.lookupCompound( cube, segments, false, Category.Unknown); if (olapElement != null) { Role role = schemaReader.getRole(); if (!role.canAccess(olapElement)) { olapElement = null; } if (olapElement instanceof Member) { olapElement = schemaReader.substitute((Member) olapElement); } } if (olapElement == null) { if (allowProp && segments.size() > 1) { List segmentsButOne = segments.subList(0, segments.size() - 1); final Id.Segment lastSegment = last(segments); final String propertyName = lastSegment instanceof Id.NameSegment ? ((Id.NameSegment) lastSegment).getName() : null; final Member member = (Member) schemaReaderSansAc.lookupCompound( cube, segmentsButOne, false, Category.Member); if (member != null && propertyName != null && isValidProperty(propertyName, member.getLevel())) { return new UnresolvedFunCall( propertyName, Syntax.Property, new Exp[] { createExpr(member)}); } final Level level = (Level) schemaReaderSansAc.lookupCompound( cube, segmentsButOne, false, Category.Level); if (level != null && propertyName != null && isValidProperty(propertyName, level)) { return new UnresolvedFunCall( propertyName, Syntax.Property, new Exp[] { createExpr(level)}); } } // if we're in the middle of loading the schema, the property has // been set to ignore invalid members, and the member is // non-existent, return the null member corresponding to the // hierarchy of the element we're looking for; locate the // hierarchy by incrementally truncating the name of the element if (q.ignoreInvalidMembers()) { int nameLen = segments.size() - 1; olapElement = null; while (nameLen > 0 && olapElement == null) { List partialName = segments.subList(0, nameLen); olapElement = schemaReaderSansAc.lookupCompound( cube, partialName, false, Category.Unknown); nameLen--; } if (olapElement != null) { olapElement = olapElement.getHierarchy().getNullMember(); } else { throw MondrianResource.instance().MdxChildObjectNotFound.ex( fullName, cube.getQualifiedName()); } } else { throw MondrianResource.instance().MdxChildObjectNotFound.ex( fullName, cube.getQualifiedName()); } } // keep track of any measure members referenced; these will be used // later to determine if cross joins on virtual cubes can be // processed natively q.addMeasuresMembers(olapElement); return createExpr(olapElement); } /** * Looks up a cube in a schema reader. * * @param cubeName Cube name * @param fail Whether to fail if not found. * @return Cube, or null if not found */ static Cube lookupCube( SchemaReader schemaReader, String cubeName, boolean fail) { for (Cube cube : schemaReader.getCubes()) { if (Util.compareName(cube.getName(), cubeName) == 0) { return cube; } } if (fail) { throw MondrianResource.instance().MdxCubeNotFound.ex(cubeName); } return null; } /** * Converts an olap element (dimension, hierarchy, level or member) into * an expression representing a usage of that element in an MDX statement. */ public static Exp createExpr(OlapElement element) { if (element instanceof Member) { Member member = (Member) element; return new MemberExpr(member); } else if (element instanceof Level) { Level level = (Level) element; return new LevelExpr(level); } else if (element instanceof Hierarchy) { Hierarchy hierarchy = (Hierarchy) element; return new HierarchyExpr(hierarchy); } else if (element instanceof Dimension) { Dimension dimension = (Dimension) element; return new DimensionExpr(dimension); } else if (element instanceof NamedSet) { NamedSet namedSet = (NamedSet) element; return new NamedSetExpr(namedSet); } else { throw Util.newInternal("Unexpected element type: " + element); } } public static Member lookupHierarchyRootMember( SchemaReader reader, Hierarchy hierarchy, Id.NameSegment memberName) { return lookupHierarchyRootMember( reader, hierarchy, memberName, MatchType.EXACT); } /** * Finds a root member of a hierarchy with a given name. * * @param hierarchy Hierarchy * @param memberName Name of root member * @return Member, or null if not found */ public static Member lookupHierarchyRootMember( SchemaReader reader, Hierarchy hierarchy, Id.NameSegment memberName, MatchType matchType) { // Lookup member at first level. // // Don't use access control. Suppose we cannot see the 'nation' level, // we still want to be able to resolve '[Customer].[USA].[CA]'. List rootMembers = reader.getHierarchyRootMembers(hierarchy); // if doing an inexact search on a non-all hierarchy, create // a member corresponding to the name we're searching for so // we can use it in a hierarchical search Member searchMember = null; if (!matchType.isExact() && !hierarchy.hasAll() && !rootMembers.isEmpty()) { searchMember = hierarchy.createMember( null, rootMembers.get(0).getLevel(), memberName.name, null); } int bestMatch = -1; int k = -1; for (Member rootMember : rootMembers) { ++k; int rc; // when searching on the ALL hierarchy, match must be exact if (matchType.isExact() || hierarchy.hasAll()) { rc = rootMember.getName().compareToIgnoreCase(memberName.name); } else { rc = FunUtil.compareSiblingMembers( rootMember, searchMember); } if (rc == 0) { return rootMember; } if (!hierarchy.hasAll()) { if (matchType == MatchType.BEFORE) { if (rc < 0 && (bestMatch == -1 || FunUtil.compareSiblingMembers( rootMember, rootMembers.get(bestMatch)) > 0)) { bestMatch = k; } } else if (matchType == MatchType.AFTER) { if (rc > 0 && (bestMatch == -1 || FunUtil.compareSiblingMembers( rootMember, rootMembers.get(bestMatch)) < 0)) { bestMatch = k; } } } } if (matchType == MatchType.EXACT_SCHEMA) { return null; } if (matchType != MatchType.EXACT && bestMatch != -1) { return rootMembers.get(bestMatch); } // If the first level is 'all', lookup member at second level. For // example, they could say '[USA]' instead of '[(All // Customers)].[USA]'. return (rootMembers.size() > 0 && rootMembers.get(0).isAll()) ? reader.lookupMemberChildByName( rootMembers.get(0), memberName, matchType) : null; } /** * Finds a named level in this hierarchy. Returns null if there is no * such level. */ public static Level lookupHierarchyLevel(Hierarchy hierarchy, String s) { final Level[] levels = hierarchy.getLevels(); for (Level level : levels) { if (level.getName().equalsIgnoreCase(s)) { return level; } } return null; } /** * Finds the zero based ordinal of a Member among its siblings. */ public static int getMemberOrdinalInParent( SchemaReader reader, Member member) { Member parent = member.getParentMember(); List siblings = (parent == null) ? reader.getHierarchyRootMembers(member.getHierarchy()) : reader.getMemberChildren(parent); for (int i = 0; i < siblings.size(); i++) { if (siblings.get(i).equals(member)) { return i; } } throw Util.newInternal( "could not find member " + member + " amongst its siblings"); } /** * returns the first descendant on the level underneath parent. * If parent = [Time].[1997] and level = [Time].[Month], then * the member [Time].[1997].[Q1].[1] will be returned */ public static Member getFirstDescendantOnLevel( SchemaReader reader, Member parent, Level level) { Member m = parent; while (m.getLevel() != level) { List children = reader.getMemberChildren(m); m = children.get(0); } return m; } /** * Returns whether a string is null or empty. */ public static boolean isEmpty(String s) { return (s == null) || (s.length() == 0); } /** * Encloses a value in single-quotes, to make a SQL string value. Examples: * singleQuoteForSql(null) yields NULL; * singleQuoteForSql("don't") yields 'don''t'. */ public static String singleQuoteString(String val) { StringBuilder buf = new StringBuilder(64); singleQuoteString(val, buf); return buf.toString(); } /** * Encloses a value in single-quotes, to make a SQL string value. Examples: * singleQuoteForSql(null) yields NULL; * singleQuoteForSql("don't") yields 'don''t'. */ public static void singleQuoteString(String val, StringBuilder buf) { buf.append('\''); String s0 = replace(val, "'", "''"); buf.append(s0); buf.append('\''); } /** * Creates a random number generator. * * @param seed Seed for random number generator. * If 0, generate a seed from the system clock and print the value * chosen. (This is effectively non-deterministic.) * If -1, generate a seed from an internal random number generator. * (This is deterministic, but ensures that different tests have * different seeds.) * * @return A random number generator. */ public static Random createRandom(long seed) { if (seed == 0) { seed = new Random().nextLong(); System.out.println("random: seed=" + seed); } else if (seed == -1 && metaRandom != null) { seed = metaRandom.nextLong(); } return new Random(seed); } /** * Returns whether a property is valid for a member of a given level. * It is valid if the property is defined at the level or at * an ancestor level, or if the property is a standard property such as * "FORMATTED_VALUE". * * @param propertyName Property name * @param level Level * @return Whether property is valid */ public static boolean isValidProperty( String propertyName, Level level) { return lookupProperty(level, propertyName) != null; } /** * Finds a member property called propertyName at, or above, * level. */ public static Property lookupProperty( Level level, String propertyName) { do { Property[] properties = level.getProperties(); for (Property property : properties) { if (property.getName().equals(propertyName)) { return property; } } level = level.getParentLevel(); } while (level != null); // Now try a standard property. boolean caseSensitive = MondrianProperties.instance().CaseSensitive.get(); final Property property = Property.lookup(propertyName, caseSensitive); if (property != null && property.isMemberProperty() && property.isStandard()) { return property; } return null; } /** * Insert a call to this method if you want to flag a piece of * undesirable code. * * @deprecated */ public static T deprecated(T reason) { throw new UnsupportedOperationException(reason.toString()); } /** * Insert a call to this method if you want to flag a piece of * undesirable code. * * @deprecated */ public static T deprecated(T reason, boolean fail) { if (fail) { throw new UnsupportedOperationException(reason.toString()); } else { return reason; } } public static List addLevelCalculatedMembers( SchemaReader reader, Level level, List members) { List calcMembers = reader.getCalculatedMembers(level.getHierarchy()); List calcMembersInThisLevel = new ArrayList(); for (Member calcMember : calcMembers) { if (calcMember.getLevel().equals(level)) { calcMembersInThisLevel.add(calcMember); } } if (!calcMembersInThisLevel.isEmpty()) { List newMemberList = new ConcatenableList(); newMemberList.addAll(members); newMemberList.addAll(calcMembersInThisLevel); return newMemberList; } return members; } /** * Returns an exception which indicates that a particular piece of * functionality should work, but a developer has not implemented it yet. */ public static RuntimeException needToImplement(Object o) { throw new UnsupportedOperationException("need to implement " + o); } /** * Returns an exception indicating that we didn't expect to find this value * here. */ public static > RuntimeException badValue( Enum anEnum) { return Util.newInternal( "Was not expecting value '" + anEnum + "' for enumeration '" + anEnum.getDeclaringClass().getName() + "' in this context"); } /** * Converts a list of SQL-style patterns into a Java regular expression. * *

For example, {"Foo_", "Bar%BAZ"} becomes "Foo.|Bar.*BAZ". * * @param wildcards List of SQL-style wildcard expressions * @return Regular expression */ public static String wildcardToRegexp(List wildcards) { StringBuilder buf = new StringBuilder(); for (String value : wildcards) { if (buf.length() > 0) { buf.append('|'); } int i = 0; while (true) { int percent = value.indexOf('%', i); int underscore = value.indexOf('_', i); if (percent == -1 && underscore == -1) { if (i < value.length()) { buf.append(quotePattern(value.substring(i))); } break; } if (underscore >= 0 && (underscore < percent || percent < 0)) { if (i < underscore) { buf.append( quotePattern(value.substring(i, underscore))); } buf.append('.'); i = underscore + 1; } else if (percent >= 0 && (percent < underscore || underscore < 0)) { if (i < percent) { buf.append( quotePattern(value.substring(i, percent))); } buf.append(".*"); i = percent + 1; } else { throw new IllegalArgumentException(); } } } return buf.toString(); } /** * Converts a camel-case name to an upper-case name with underscores. * *

For example, camelToUpper("FooBar") returns "FOO_BAR". * * @param s Camel-case string * @return Upper-case string */ public static String camelToUpper(String s) { StringBuilder buf = new StringBuilder(s.length() + 10); int prevUpper = -1; for (int i = 0; i < s.length(); ++i) { char c = s.charAt(i); if (Character.isUpperCase(c)) { if (i > prevUpper + 1) { buf.append('_'); } prevUpper = i; } else { c = Character.toUpperCase(c); } buf.append(c); } return buf.toString(); } /** * Parses a comma-separated list. * *

If a value contains a comma, escape it with a second comma. For * example, parseCommaList("x,y,,z") returns * {"x", "y,z"}. * * @param nameCommaList List of names separated by commas * @return List of names */ public static List parseCommaList(String nameCommaList) { if (nameCommaList.equals("")) { return Collections.emptyList(); } if (nameCommaList.endsWith(",")) { // Special treatment for list ending in ",", because split ignores // entries after separator. final String zzz = "zzz"; final List list = parseCommaList(nameCommaList + zzz); String last = list.get(list.size() - 1); if (last.equals(zzz)) { list.remove(list.size() - 1); } else { list.set( list.size() - 1, last.substring(0, last.length() - zzz.length())); } return list; } List names = new ArrayList(); final String[] strings = nameCommaList.split(","); for (String string : strings) { final int count = names.size(); if (count > 0 && names.get(count - 1).equals("")) { if (count == 1) { if (string.equals("")) { names.add(""); } else { names.set( 0, "," + string); } } else { names.set( count - 2, names.get(count - 2) + "," + string); names.remove(count - 1); } } else { names.add(string); } } return names; } /** * Returns an annotation of a particular class on a method. Returns the * default value if the annotation is not present, or in JDK 1.4. * * @param method Method containing annotation * @param annotationClassName Name of annotation class to find * @param defaultValue Value to return if annotation is not present * @return value of annotation */ public static T getAnnotation( Method method, String annotationClassName, T defaultValue) { return compatible.getAnnotation( method, annotationClassName, defaultValue); } /** * Closes and cancels a {@link Statement} using the correct methods * available on the current Java runtime. *

If errors are encountered while canceling a statement, * the message is logged in {@link Util}. * @param stmt The statement to cancel. */ public static void cancelStatement(Statement stmt) { compatible.cancelStatement(stmt); } public static MemoryInfo getMemoryInfo() { return compatible.getMemoryInfo(); } /** * Converts a list of a string. * * For example, * commaList("foo", Arrays.asList({"a", "b"})) * returns "foo(a, b)". * * @param s Prefix * @param list List * @return String representation of string */ public static String commaList( String s, List list) { final StringBuilder buf = new StringBuilder(s); buf.append("("); int k = -1; for (T t : list) { if (++k > 0) { buf.append(", "); } buf.append(t); } buf.append(")"); return buf.toString(); } /** * Makes a name distinct from other names which have already been used * and shorter than a length limit, adds it to the list, and returns it. * * @param name Suggested name, may not be unique * @param maxLength Maximum length of generated name * @param nameList Collection of names already used * * @return Unique name */ public static String uniquify( String name, int maxLength, Collection nameList) { assert name != null; if (name.length() > maxLength) { name = name.substring(0, maxLength); } if (nameList.contains(name)) { String aliasBase = name; int j = 0; while (true) { name = aliasBase + j; if (name.length() > maxLength) { aliasBase = aliasBase.substring(0, aliasBase.length() - 1); continue; } if (!nameList.contains(name)) { break; } j++; } } nameList.add(name); return name; } /** * Returns whether a collection contains precisely one distinct element. * Returns false if the collection is empty, or if it contains elements * that are not the same as each other. * * @param collection Collection * @return boolean true if all values are same */ public static boolean areOccurencesEqual( Collection collection) { Iterator it = collection.iterator(); if (!it.hasNext()) { // Collection is empty return false; } T first = it.next(); while (it.hasNext()) { T t = it.next(); if (!t.equals(first)) { return false; } } return true; } /** * Creates a memory-, CPU- and cache-efficient immutable list. * * @param t Array of members of list * @param Element type * @return List containing the given members */ public static List flatList(T... t) { return _flatList(t, false); } /** * Creates a memory-, CPU- and cache-efficient immutable list, * always copying the contents. * * @param t Array of members of list * @param Element type * @return List containing the given members */ public static List flatListCopy(T... t) { return _flatList(t, true); } /** * Creates a memory-, CPU- and cache-efficient immutable list, optionally * copying the list. * * @param copy Whether to always copy the list * @param t Array of members of list * @return List containing the given members */ private static List _flatList(T[] t, boolean copy) { switch (t.length) { case 0: return Collections.emptyList(); case 1: return Collections.singletonList(t[0]); case 2: return new Flat2List(t[0], t[1]); case 3: return new Flat3List(t[0], t[1], t[2]); default: // REVIEW: AbstractList contains a modCount field; we could // write our own implementation and reduce creation overhead a // bit. if (copy) { return Arrays.asList(t.clone()); } else { return Arrays.asList(t); } } } /** * Creates a memory-, CPU- and cache-efficient immutable list from an * existing list. The list is always copied. * * @param t Array of members of list * @param Element type * @return List containing the given members */ public static List flatList(List t) { switch (t.size()) { case 0: return Collections.emptyList(); case 1: return Collections.singletonList(t.get(0)); case 2: return new Flat2List(t.get(0), t.get(1)); case 3: return new Flat3List(t.get(0), t.get(1), t.get(2)); default: // REVIEW: AbstractList contains a modCount field; we could // write our own implementation and reduce creation overhead a // bit. //noinspection unchecked return (List) Arrays.asList(t.toArray()); } } /** * Parses a locale string. * *

The inverse operation of {@link java.util.Locale#toString()}. * * @param localeString Locale string, e.g. "en" or "en_US" * @return Java locale object */ public static Locale parseLocale(String localeString) { String[] strings = localeString.split("_"); switch (strings.length) { case 1: return new Locale(strings[0]); case 2: return new Locale(strings[0], strings[1]); case 3: return new Locale(strings[0], strings[1], strings[2]); default: throw newInternal( "bad locale string '" + localeString + "'"); } } private static final Map TIME_UNITS = Olap4jUtil.mapOf( "ns", "NANOSECONDS", "us", "MICROSECONDS", "ms", "MILLISECONDS", "s", "SECONDS", "m", "MINUTES", "h", "HOURS", "d", "DAYS"); /** * Parses an interval. * *

For example, "30s" becomes (30, {@link TimeUnit#SECONDS}); * "2us" becomes (2, {@link TimeUnit#MICROSECONDS}).

* *

Units m (minutes), h (hours) and d (days) are only available * in JDK 1.6 or later, because the corresponding constants are missing * from {@link TimeUnit} in JDK 1.5.

* * @param s String to parse * @param unit Default time unit; may be null * * @return Pair of value and time unit. Neither pair or its components are * null * * @throws NumberFormatException if unit is not present and there is no * default, or if number is not valid */ public static Pair parseInterval( String s, TimeUnit unit) throws NumberFormatException { final String original = s; for (Map.Entry entry : TIME_UNITS.entrySet()) { final String abbrev = entry.getKey(); if (s.endsWith(abbrev)) { final String full = entry.getValue(); try { unit = TimeUnit.valueOf(full); s = s.substring(0, s.length() - abbrev.length()); break; } catch (IllegalArgumentException e) { // ignore - MINUTES, HOURS, DAYS are not defined in JDK1.5 } } } if (unit == null) { throw new NumberFormatException( "Invalid time interval '" + original + "'. Does not contain a " + "time unit. (Suffix may be ns (nanoseconds), " + "us (microseconds), ms (milliseconds), s (seconds), " + "h (hours), d (days). For example, '20s' means 20 seconds.)"); } try { return Pair.of(new BigDecimal(s).longValue(), unit); } catch (NumberFormatException e) { throw new NumberFormatException( "Invalid time interval '" + original + "'"); } } /** * Converts a list of olap4j-style segments to a list of mondrian-style * segments. * * @param olap4jSegmentList List of olap4j segments * @return List of mondrian segments */ public static List convert( List olap4jSegmentList) { final List list = new ArrayList(); for (IdentifierSegment olap4jSegment : olap4jSegmentList) { list.add(convert(olap4jSegment)); } return list; } /** * Converts an olap4j-style segment to a mondrian-style segment. * * @param olap4jSegment olap4j segment * @return mondrian segment */ public static Id.Segment convert(IdentifierSegment olap4jSegment) { if (olap4jSegment instanceof NameSegment) { return convert((NameSegment) olap4jSegment); } else { return convert((KeySegment) olap4jSegment); } } private static Id.KeySegment convert(final KeySegment keySegment) { return new Id.KeySegment( new AbstractList() { public Id.NameSegment get(int index) { return convert(keySegment.getKeyParts().get(index)); } public int size() { return keySegment.getKeyParts().size(); } }); } private static Id.NameSegment convert(NameSegment nameSegment) { return new Id.NameSegment( nameSegment.getName(), convert(nameSegment.getQuoting())); } private static Id.Quoting convert(Quoting quoting) { switch (quoting) { case QUOTED: return Id.Quoting.QUOTED; case UNQUOTED: return Id.Quoting.UNQUOTED; case KEY: return Id.Quoting.KEY; default: throw Util.unexpected(quoting); } } /** * Applies a collection of filters to an iterable. * * @param iterable Iterable * @param conds Zero or more conditions * @param * @return Iterable that returns only members of underlying iterable for * for which all conditions evaluate to true */ public static Iterable filter( final Iterable iterable, final Functor1... conds) { final Functor1[] conds2 = optimizeConditions(conds); if (conds2.length == 0) { return iterable; } return new Iterable() { public Iterator iterator() { return new Iterator() { final Iterator iterator = iterable.iterator(); T next; boolean hasNext = moveToNext(); private boolean moveToNext() { outer: while (iterator.hasNext()) { next = iterator.next(); for (Functor1 cond : conds2) { if (!cond.apply(next)) { continue outer; } } return true; } return false; } public boolean hasNext() { return hasNext; } public T next() { T t = next; hasNext = moveToNext(); return t; } public void remove() { throw new UnsupportedOperationException(); } }; } }; } private static Functor1[] optimizeConditions( Functor1[] conds) { final List> functor1List = new ArrayList>(Arrays.asList(conds)); for (Iterator> funcIter = functor1List.iterator(); funcIter.hasNext();) { Functor1 booleanTFunctor1 = funcIter.next(); if (booleanTFunctor1 == trueFunctor()) { funcIter.remove(); } } if (functor1List.size() < conds.length) { //noinspection unchecked return functor1List.toArray(new Functor1[functor1List.size()]); } else { return conds; } } /** * Sorts a collection of {@link Comparable} objects and returns a list. * * @param collection Collection * @param Element type * @return Sorted list */ public static List sort( Collection collection) { Object[] a = collection.toArray(new Object[collection.size()]); Arrays.sort(a); return cast(Arrays.asList(a)); } /** * Sorts a collection of objects using a {@link java.util.Comparator} and returns a * list. * * @param collection Collection * @param comparator Comparator * @param Element type * @return Sorted list */ public static List sort( Collection collection, Comparator comparator) { Object[] a = collection.toArray(new Object[collection.size()]); //noinspection unchecked Arrays.sort(a, (Comparator) comparator); return cast(Arrays.asList(a)); } public static List toOlap4j( final List segments) { return new AbstractList() { public IdentifierSegment get(int index) { return toOlap4j(segments.get(index)); } public int size() { return segments.size(); } }; } public static IdentifierSegment toOlap4j(Id.Segment segment) { switch (segment.quoting) { case KEY: return toOlap4j((Id.KeySegment) segment); default: return toOlap4j((Id.NameSegment) segment); } } private static KeySegment toOlap4j(final Id.KeySegment keySegment) { return new KeySegment( new AbstractList() { public NameSegment get(int index) { return toOlap4j(keySegment.subSegmentList.get(index)); } public int size() { return keySegment.subSegmentList.size(); } }); } private static NameSegment toOlap4j(Id.NameSegment nameSegment) { return new NameSegment( null, nameSegment.name, toOlap4j(nameSegment.quoting)); } public static Quoting toOlap4j(Id.Quoting quoting) { return Quoting.valueOf(quoting.name()); } // TODO: move to IdentifierSegment public static boolean matches(IdentifierSegment segment, String name) { switch (segment.getQuoting()) { case KEY: return false; // FIXME case QUOTED: return equalName(segment.getName(), name); case UNQUOTED: return segment.getName().equalsIgnoreCase(name); default: throw unexpected(segment.getQuoting()); } } public static boolean matches( Member member, List nameParts) { if (Util.equalName(Util.implode(nameParts), member.getUniqueName())) { // exact match return true; } Id.Segment segment = nameParts.get(nameParts.size() - 1); while (member.getParentMember() != null) { if (!segment.matches(member.getName())) { return false; } member = member.getParentMember(); nameParts = nameParts.subList(0, nameParts.size() - 1); segment = nameParts.get(nameParts.size() - 1); } if (segment.matches(member.getName())) { return Util.equalName( member.getHierarchy().getUniqueName(), Util.implode(nameParts.subList(0, nameParts.size() - 1))); } else if (member.isAll()) { return Util.equalName( member.getHierarchy().getUniqueName(), Util.implode(nameParts)); } else { return false; } } public static RuntimeException newElementNotFoundException( int category, IdentifierNode identifierNode) { String type; switch (category) { case Category.Member: return MondrianResource.instance().MemberNotFound.ex( identifierNode.toString()); case Category.Unknown: type = "Element"; break; default: type = Category.instance().getDescription(category); } return newError(type + " '" + identifierNode + "' not found"); } /** * Calls {@link java.util.concurrent.Future#get()} and converts any * throwable into a non-checked exception. * * @param future Future * @param message Message to qualify wrapped exception * @param Result type * @return Result */ public static T safeGet(Future future, String message) { try { return future.get(); } catch (InterruptedException e) { throw newError(e, message); } catch (ExecutionException e) { final Throwable cause = e.getCause(); if (cause instanceof RuntimeException) { throw (RuntimeException) cause; } else if (cause instanceof Error) { throw (Error) cause; } else { throw newError(cause, message); } } } public static Set newIdentityHashSetFake() { final HashMap map = new HashMap(); return new Set() { public int size() { return map.size(); } public boolean isEmpty() { return map.isEmpty(); } public boolean contains(Object o) { return map.containsKey(o); } public Iterator iterator() { return map.keySet().iterator(); } public Object[] toArray() { return map.keySet().toArray(); } public T[] toArray(T[] a) { return map.keySet().toArray(a); } public boolean add(T t) { return map.put(t, Boolean.TRUE) == null; } public boolean remove(Object o) { return map.remove(o) == Boolean.TRUE; } public boolean containsAll(Collection c) { return map.keySet().containsAll(c); } public boolean addAll(Collection c) { throw new UnsupportedOperationException(); } public boolean retainAll(Collection c) { throw new UnsupportedOperationException(); } public boolean removeAll(Collection c) { throw new UnsupportedOperationException(); } public void clear() { map.clear(); } }; } /** * Equivalent to {@link Timer#Timer(String, boolean)}. * (Introduced in JDK 1.5.) * * @param name the name of the associated thread * @param isDaemon true if the associated thread should run as a daemon * @return timer */ public static Timer newTimer(String name, boolean isDaemon) { return compatible.newTimer(name, isDaemon); } /** * As Arrays#binarySearch(Object[], int, int, Object), but * available pre-JDK 1.6. */ public static > int binarySearch( T[] ts, int start, int end, T t) { return compatible.binarySearch(ts, start, end, t); } /** * Returns the intersection of two sorted sets. Does not modify either set. * *

Optimized for the case that both sets are {@link ArraySortedSet}.

* * @param set1 First set * @param set2 Second set * @return Intersection of the sets */ public static SortedSet intersect( SortedSet set1, SortedSet set2) { if (set1.isEmpty()) { return set1; } if (set2.isEmpty()) { return set2; } if (!(set1 instanceof ArraySortedSet) || !(set2 instanceof ArraySortedSet)) { final TreeSet set = new TreeSet(set1); set.retainAll(set2); return set; } final Comparable[] result = new Comparable[Math.min(set1.size(), set2.size())]; final Iterator it1 = set1.iterator(); final Iterator it2 = set2.iterator(); int i = 0; E e1 = it1.next(); E e2 = it2.next(); for (;;) { final int compare = e1.compareTo(e2); if (compare == 0) { result[i++] = e1; if (!it1.hasNext() || !it2.hasNext()) { break; } e1 = it1.next(); e2 = it2.next(); } else if (compare == 1) { if (!it2.hasNext()) { break; } e2 = it2.next(); } else { if (!it1.hasNext()) { break; } e1 = it1.next(); } } return new ArraySortedSet(result, 0, i); } /** * Compares two integers using the same algorithm as * {@link Integer#compareTo(Integer)}. * * @param i0 First integer * @param i1 Second integer * @return Comparison */ public static int compareIntegers(int i0, int i1) { return (i0 < i1 ? -1 : (i0 == i1 ? 0 : 1)); } /** * Returns the last item in a list. * * @param list List * @param Element type * @return Last item in the list * @throws IndexOutOfBoundsException if list is empty */ public static T last(List list) { return list.get(list.size() - 1); } /** * Returns the sole item in a list. * *

If the list has 0 or more than one element, throws.

* * @param list List * @param Element type * @return Sole item in the list * @throws IndexOutOfBoundsException if list is empty or has more than 1 elt */ public static T only(List list) { if (list.size() != 1) { throw new IndexOutOfBoundsException( "list " + list + " has " + list.size() + " elements, expected 1"); } return list.get(0); } /** * Closes a JDBC result set, statement, and connection, ignoring any errors. * If any of them are null, that's fine. * *

If any of them throws a {@link SQLException}, returns the first * such exception, but always executes all closes.

* * @param resultSet Result set * @param statement Statement * @param connection Connection */ public static SQLException close( ResultSet resultSet, Statement statement, Connection connection) { SQLException firstException = null; if (resultSet != null) { try { if (statement == null) { statement = resultSet.getStatement(); } resultSet.close(); } catch (Throwable t) { firstException = new SQLException(); firstException.initCause(t); } } if (statement != null) { try { statement.close(); } catch (Throwable t) { if (firstException == null) { firstException = new SQLException(); firstException.initCause(t); } } } if (connection != null) { try { connection.close(); } catch (Throwable t) { if (firstException == null) { firstException = new SQLException(); firstException.initCause(t); } } } return firstException; } /** * Creates a bitset with bits from {@code fromIndex} (inclusive) to * specified {@code toIndex} (exclusive) set to {@code true}. * *

For example, {@code bitSetBetween(0, 3)} returns a bit set with bits * {0, 1, 2} set. * * @param fromIndex Index of the first bit to be set. * @param toIndex Index after the last bit to be set. * @return Bit set */ public static BitSet bitSetBetween(int fromIndex, int toIndex) { final BitSet bitSet = new BitSet(); if (toIndex > fromIndex) { // Avoid http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6222207 // "BitSet internal invariants may be violated" bitSet.set(fromIndex, toIndex); } return bitSet; } public static class ErrorCellValue { public String toString() { return "#ERR"; } } @SuppressWarnings({"unchecked"}) public static T[] genericArray(Class clazz, int size) { return (T[]) Array.newInstance(clazz, size); } /** * Throws an internal error if condition is not true. It would be called * assert, but that is a keyword as of JDK 1.4. */ public static void assertTrue(boolean b) { if (!b) { throw newInternal("assert failed"); } } /** * Throws an internal error with the given messagee if condition is not * true. It would be called assert, but that is a keyword as * of JDK 1.4. */ public static void assertTrue(boolean b, String message) { if (!b) { throw newInternal("assert failed: " + message); } } /** * Creates an internal error with a given message. */ public static RuntimeException newInternal(String message) { return MondrianResource.instance().Internal.ex(message); } /** * Creates an internal error with a given message and cause. */ public static RuntimeException newInternal(Throwable e, String message) { return MondrianResource.instance().Internal.ex(message, e); } /** * Creates a non-internal error. Currently implemented in terms of * internal errors, but later we will create resourced messages. */ public static RuntimeException newError(String message) { return newInternal(message); } /** * Creates a non-internal error. Currently implemented in terms of * internal errors, but later we will create resourced messages. */ public static RuntimeException newError(Throwable e, String message) { return newInternal(e, message); } /** * Returns an exception indicating that we didn't expect to find this value * here. * * @param value Value */ public static RuntimeException unexpected(Enum value) { return Util.newInternal( "Was not expecting value '" + value + "' for enumeration '" + value.getClass().getName() + "' in this context"); } /** * Checks that a precondition (declared using the javadoc @pre * tag) is satisfied. * * @param b The value of executing the condition */ public static void assertPrecondition(boolean b) { assertTrue(b); } /** * Checks that a precondition (declared using the javadoc @pre * tag) is satisfied. For example, * *

void f(String s) {
     *    Util.assertPrecondition(s != null, "s != null");
     *    ...
     * }
* * @param b The value of executing the condition * @param condition The text of the condition */ public static void assertPrecondition(boolean b, String condition) { assertTrue(b, condition); } /** * Checks that a postcondition (declared using the javadoc * @post tag) is satisfied. * * @param b The value of executing the condition */ public static void assertPostcondition(boolean b) { assertTrue(b); } /** * Checks that a postcondition (declared using the javadoc * @post tag) is satisfied. * * @param b The value of executing the condition */ public static void assertPostcondition(boolean b, String condition) { assertTrue(b, condition); } /** * Converts an error into an array of strings, the most recent error first. * * @param e the error; may be null. Errors are chained according to their * {@link Throwable#getCause cause}. */ public static String[] convertStackToString(Throwable e) { List list = new ArrayList(); while (e != null) { String sMsg = getErrorMessage(e); list.add(sMsg); e = e.getCause(); } return list.toArray(new String[list.size()]); } /** * Constructs the message associated with an arbitrary Java error, making * up one based on the stack trace if there is none. As * {@link #getErrorMessage(Throwable,boolean)}, but does not print the * class name if the exception is derived from {@link java.sql.SQLException} * or is exactly a {@link java.lang.Exception}. */ public static String getErrorMessage(Throwable err) { boolean prependClassName = !(err instanceof java.sql.SQLException || err.getClass() == java.lang.Exception.class); return getErrorMessage(err, prependClassName); } /** * Constructs the message associated with an arbitrary Java error, making * up one based on the stack trace if there is none. * * @param err the error * @param prependClassName should the error be preceded by the * class name of the Java exception? defaults to false, unless the error * is derived from {@link java.sql.SQLException} or is exactly a {@link * java.lang.Exception} */ public static String getErrorMessage( Throwable err, boolean prependClassName) { String errMsg = err.getMessage(); if ((errMsg == null) || (err instanceof RuntimeException)) { StringWriter sw = new StringWriter(); PrintWriter pw = new PrintWriter(sw); err.printStackTrace(pw); return sw.toString(); } else { return (prependClassName) ? err.getClass().getName() + ": " + errMsg : errMsg; } } /** * If one of the causes of an exception is of a particular class, returns * that cause. Otherwise returns null. * * @param e Exception * @param clazz Desired class * @param Class * @return Cause of given class, or null */ public static T getMatchingCause(Throwable e, Class clazz) { for (;;) { if (clazz.isInstance(e)) { return clazz.cast(e); } final Throwable cause = e.getCause(); if (cause == null || cause == e) { return null; } e = cause; } } /** * Converts an expression to a string. */ public static String unparse(Exp exp) { StringWriter sw = new StringWriter(); PrintWriter pw = new PrintWriter(sw); exp.unparse(pw); return sw.toString(); } /** * Converts an query to a string. */ public static String unparse(Query query) { StringWriter sw = new StringWriter(); PrintWriter pw = new QueryPrintWriter(sw); query.unparse(pw); return sw.toString(); } /** * Creates a file-protocol URL for the given file. */ public static URL toURL(File file) throws MalformedURLException { String path = file.getAbsolutePath(); // This is a bunch of weird code that is required to // make a valid URL on the Windows platform, due // to inconsistencies in what getAbsolutePath returns. String fs = System.getProperty("file.separator"); if (fs.length() == 1) { char sep = fs.charAt(0); if (sep != '/') { path = path.replace(sep, '/'); } if (path.charAt(0) != '/') { path = '/' + path; } } path = "file://" + path; return new URL(path); } /** * PropertyList is an order-preserving list of key-value * pairs. Lookup is case-insensitive, but the case of keys is preserved. */ public static class PropertyList implements Iterable>, Serializable { List> list = new ArrayList>(); public PropertyList() { this.list = new ArrayList>(); } private PropertyList(List> list) { this.list = list; } @SuppressWarnings({"CloneDoesntCallSuperClone"}) @Override public PropertyList clone() { return new PropertyList(new ArrayList>(list)); } public String get(String key) { return get(key, null); } public String get(String key, String defaultValue) { for (int i = 0, n = list.size(); i < n; i++) { Pair pair = list.get(i); if (pair.left.equalsIgnoreCase(key)) { return pair.right; } } return defaultValue; } public String put(String key, String value) { for (int i = 0, n = list.size(); i < n; i++) { Pair pair = list.get(i); if (pair.left.equalsIgnoreCase(key)) { String old = pair.right; if (key.equalsIgnoreCase("Provider")) { // Unlike all other properties, later values of // "Provider" do not supersede } else { pair.right = value; } return old; } } list.add(new Pair(key, value)); return null; } public boolean remove(String key) { boolean found = false; for (int i = 0; i < list.size(); i++) { Pair pair = list.get(i); if (pair.getKey().equalsIgnoreCase(key)) { list.remove(i); found = true; --i; } } return found; } public String toString() { StringBuilder sb = new StringBuilder(64); for (int i = 0, n = list.size(); i < n; i++) { Pair pair = list.get(i); if (i > 0) { sb.append("; "); } sb.append(pair.left); sb.append('='); final String right = pair.right; if (right == null) { sb.append("'null'"); } else { // Quote a property value if is has a semi colon in it // 'xxx;yyy'. Escape any single-quotes by doubling them. final int needsQuote = right.indexOf(';'); if (needsQuote >= 0) { // REVIEW: This logic leaves off the leading/trailing // quote if the property value already has a // leading/trailing quote. Doesn't seem right to me. if (right.charAt(0) != '\'') { sb.append("'"); } sb.append(replace(right, "'", "''")); if (right.charAt(right.length() - 1) != '\'') { sb.append("'"); } } else { sb.append(right); } } } return sb.toString(); } public Iterator> iterator() { return list.iterator(); } } /** * Converts an OLE DB connect string into a {@link PropertyList}. * *

For example, "Provider=MSOLAP; DataSource=LOCALHOST;" * becomes the set of (key, value) pairs {("Provider","MSOLAP"), * ("DataSource", "LOCALHOST")}. Another example is * Provider='sqloledb';Data Source='MySqlServer';Initial * Catalog='Pubs';Integrated Security='SSPI';. * *

This method implements as much as possible of the OLE DB connect string syntax * specification. To find what it actually does, take * a look at the mondrian.olap.UtilTestCase test case. */ public static PropertyList parseConnectString(String s) { return new ConnectStringParser(s).parse(); } private static class ConnectStringParser { private final String s; private final int n; private int i; private final StringBuilder nameBuf; private final StringBuilder valueBuf; private ConnectStringParser(String s) { this.s = s; this.i = 0; this.n = s.length(); this.nameBuf = new StringBuilder(64); this.valueBuf = new StringBuilder(64); } PropertyList parse() { PropertyList list = new PropertyList(); while (i < n) { parsePair(list); } return list; } /** * Reads "name=value;" or "name=value". */ void parsePair(PropertyList list) { String name = parseName(); if (name == null) { return; } String value; if (i >= n) { value = ""; } else if (s.charAt(i) == ';') { i++; value = ""; } else { value = parseValue(); } list.put(name, value); } /** * Reads "name=". Name can contain equals sign if equals sign is * doubled. Returns null if there is no name to read. */ String parseName() { nameBuf.setLength(0); while (true) { char c = s.charAt(i); switch (c) { case '=': i++; if (i < n && (c = s.charAt(i)) == '=') { // doubled equals sign; take one of them, and carry on i++; nameBuf.append(c); break; } String name = nameBuf.toString(); name = name.trim(); return name; case ' ': if (nameBuf.length() == 0) { // ignore preceding spaces i++; if (i >= n) { // there is no name, e.g. trailing spaces after // semicolon, 'x=1; y=2; ' return null; } break; } else { // fall through } default: nameBuf.append(c); i++; if (i >= n) { return nameBuf.toString().trim(); } } } } /** * Reads "value;" or "value" */ String parseValue() { char c; // skip over leading white space while ((c = s.charAt(i)) == ' ') { i++; if (i >= n) { return ""; } } if (c == '"' || c == '\'') { String value = parseQuoted(c); // skip over trailing white space while (i < n && (c = s.charAt(i)) == ' ') { i++; } if (i >= n) { return value; } else if (s.charAt(i) == ';') { i++; return value; } else { throw new RuntimeException( "quoted value ended too soon, at position " + i + " in '" + s + "'"); } } else { String value; int semi = s.indexOf(';', i); if (semi >= 0) { value = s.substring(i, semi); i = semi + 1; } else { value = s.substring(i); i = n; } return value.trim(); } } /** * Reads a string quoted by a given character. Occurrences of the * quoting character must be doubled. For example, * parseQuoted('"') reads "a ""new"" string" * and returns a "new" string. */ String parseQuoted(char q) { char c = s.charAt(i++); Util.assertTrue(c == q); valueBuf.setLength(0); while (i < n) { c = s.charAt(i); if (c == q) { i++; if (i < n) { c = s.charAt(i); if (c == q) { valueBuf.append(c); i++; continue; } } return valueBuf.toString(); } else { valueBuf.append(c); i++; } } throw new RuntimeException( "Connect string '" + s + "' contains unterminated quoted value '" + valueBuf.toString() + "'"); } } /** * Combines two integers into a hash code. */ public static int hash(int i, int j) { return (i << 4) ^ j; } /** * Computes a hash code from an existing hash code and an object (which * may be null). */ public static int hash(int h, Object o) { int k = (o == null) ? 0 : o.hashCode(); return ((h << 4) | h) ^ k; } /** * Computes a hash code from an existing hash code and an array of objects * (which may be null). */ public static int hashArray(int h, Object [] a) { // The hashcode for a null array and an empty array should be different // than h, so use magic numbers. if (a == null) { return hash(h, 19690429); } if (a.length == 0) { return hash(h, 19690721); } for (Object anA : a) { h = hash(h, anA); } return h; } /** * Concatenates one or more arrays. * *

Resulting array has same element type as first array. Each arrays may * be empty, but must not be null. * * @param a0 First array * @param as Zero or more subsequent arrays * @return Array containing all elements */ public static T[] appendArrays( T[] a0, T[]... as) { int n = a0.length; for (T[] a : as) { n += a.length; } T[] copy = Util.copyOf(a0, n); n = a0.length; for (T[] a : as) { System.arraycopy(a, 0, copy, n, a.length); n += a.length; } return copy; } /** * Adds an object to the end of an array. The resulting array is of the * same type (e.g. String[]) as the input array. * * @param a Array * @param o Element * @return New array containing original array plus element * * @see #appendArrays */ public static T[] append(T[] a, T o) { T[] a2 = Util.copyOf(a, a.length + 1); a2[a.length] = o; return a2; } /** * Like {@link java.util.Arrays}.copyOf(double[], int), but * exists prior to JDK 1.6. * * @param original the array to be copied * @param newLength the length of the copy to be returned * @return a copy of the original array, truncated or padded with zeros * to obtain the specified length */ public static double[] copyOf(double[] original, int newLength) { double[] copy = new double[newLength]; System.arraycopy( original, 0, copy, 0, Math.min(original.length, newLength)); return copy; } /** * Like {@link java.util.Arrays}.copyOf(int[], int), but * exists prior to JDK 1.6. * * @param original the array to be copied * @param newLength the length of the copy to be returned * @return a copy of the original array, truncated or padded with zeros * to obtain the specified length */ public static int[] copyOf(int[] original, int newLength) { int[] copy = new int[newLength]; System.arraycopy( original, 0, copy, 0, Math.min(original.length, newLength)); return copy; } /** * Like {@link java.util.Arrays}.copyOf(long[], int), but * exists prior to JDK 1.6. * * @param original the array to be copied * @param newLength the length of the copy to be returned * @return a copy of the original array, truncated or padded with zeros * to obtain the specified length */ public static long[] copyOf(long[] original, int newLength) { long[] copy = new long[newLength]; System.arraycopy( original, 0, copy, 0, Math.min(original.length, newLength)); return copy; } /** * Like {@link java.util.Arrays}.copyOf(Object[], int), but * exists prior to JDK 1.6. * * @param original the array to be copied * @param newLength the length of the copy to be returned * @return a copy of the original array, truncated or padded with zeros * to obtain the specified length */ public static T[] copyOf(T[] original, int newLength) { //noinspection unchecked return (T[]) copyOf(original, newLength, original.getClass()); } /** * Copies the specified array. * * @param original the array to be copied * @param newLength the length of the copy to be returned * @param newType the class of the copy to be returned * @return a copy of the original array, truncated or padded with nulls * to obtain the specified length */ public static T[] copyOf( U[] original, int newLength, Class newType) { @SuppressWarnings({"unchecked", "RedundantCast"}) T[] copy = ((Object)newType == (Object)Object[].class) ? (T[]) new Object[newLength] : (T[]) Array.newInstance(newType.getComponentType(), newLength); //noinspection SuspiciousSystemArraycopy System.arraycopy( original, 0, copy, 0, Math.min(original.length, newLength)); return copy; } /** * Returns the cumulative amount of time spent accessing the database. * * @deprecated Use {@link mondrian.server.monitor.Monitor#getServer()} and * {@link mondrian.server.monitor.ServerInfo#sqlStatementExecuteNanos}; * will be removed in 4.0. */ public static long dbTimeMillis() { return databaseMillis; } /** * Adds to the cumulative amount of time spent accessing the database. * * @deprecated Will be removed in 4.0. */ public static void addDatabaseTime(long millis) { databaseMillis += millis; } /** * Returns the system time less the time spent accessing the database. * Use this method to figure out how long an operation took: call this * method before an operation and after an operation, and the difference * is the amount of non-database time spent. * * @deprecated Will be removed in 4.0. */ public static long nonDbTimeMillis() { final long systemMillis = System.currentTimeMillis(); return systemMillis - databaseMillis; } /** * Creates a very simple implementation of {@link Validator}. (Only * useful for resolving trivial expressions.) */ public static Validator createSimpleValidator(final FunTable funTable) { return new Validator() { public Query getQuery() { return null; } public SchemaReader getSchemaReader() { throw new UnsupportedOperationException(); } public Exp validate(Exp exp, boolean scalar) { return exp; } public void validate(ParameterExpr parameterExpr) { } public void validate(MemberProperty memberProperty) { } public void validate(QueryAxis axis) { } public void validate(Formula formula) { } public FunDef getDef(Exp[] args, String name, Syntax syntax) { // Very simple resolution. Assumes that there is precisely // one resolver (i.e. no overloading) and no argument // conversions are necessary. List resolvers = funTable.getResolvers(name, syntax); final Resolver resolver = resolvers.get(0); final List conversionList = new ArrayList(); final FunDef def = resolver.resolve(args, this, conversionList); assert conversionList.isEmpty(); return def; } public boolean alwaysResolveFunDef() { return false; } public boolean canConvert( int ordinal, Exp fromExp, int to, List conversions) { return true; } public boolean requiresExpression() { return false; } public FunTable getFunTable() { return funTable; } public Parameter createOrLookupParam( boolean definition, String name, Type type, Exp defaultExp, String description) { return null; } }; } /** * Reads a Reader until it returns EOF and returns the contents as a String. * * @param rdr Reader to Read. * @param bufferSize size of buffer to allocate for reading. * @return content of Reader as String * @throws IOException on I/O error */ public static String readFully(final Reader rdr, final int bufferSize) throws IOException { if (bufferSize <= 0) { throw new IllegalArgumentException( "Buffer size must be greater than 0"); } final char[] buffer = new char[bufferSize]; final StringBuilder buf = new StringBuilder(bufferSize); int len; while ((len = rdr.read(buffer)) != -1) { buf.append(buffer, 0, len); } return buf.toString(); } /** * Reads an input stream until it returns EOF and returns the contents as an * array of bytes. * * @param in Input stream * @param bufferSize size of buffer to allocate for reading. * @return content of stream as an array of bytes * @throws IOException on I/O error */ public static byte[] readFully(final InputStream in, final int bufferSize) throws IOException { if (bufferSize <= 0) { throw new IllegalArgumentException( "Buffer size must be greater than 0"); } final byte[] buffer = new byte[bufferSize]; final ByteArrayOutputStream baos = new ByteArrayOutputStream(bufferSize); int len; while ((len = in.read(buffer)) != -1) { baos.write(buffer, 0, len); } return baos.toByteArray(); } /** * Returns the contents of a URL, substituting tokens. * *

Replaces the tokens "${key}" if the map is not null and "key" occurs * in the key-value map. * *

If the URL string starts with "inline:" the contents are the * rest of the URL. * * @param urlStr URL string * @param map Key/value map * @return Contents of URL with tokens substituted * @throws IOException on I/O error */ public static String readURL(final String urlStr, Map map) throws IOException { if (urlStr.startsWith("inline:")) { String content = urlStr.substring("inline:".length()); if (map != null) { content = Util.replaceProperties(content, map); } return content; } else { final URL url = new URL(urlStr); return readURL(url, map); } } /** * Returns the contents of a URL. * * @param url URL * @return Contents of URL * @throws IOException on I/O error */ public static String readURL(final URL url) throws IOException { return readURL(url, null); } /** * Returns the contents of a URL, substituting tokens. * *

Replaces the tokens "${key}" if the map is not null and "key" occurs * in the key-value map. * * @param url URL * @param map Key/value map * @return Contents of URL with tokens substituted * @throws IOException on I/O error */ public static String readURL( final URL url, Map map) throws IOException { final Reader r = new BufferedReader(new InputStreamReader(url.openStream())); final int BUF_SIZE = 8096; try { String xmlCatalog = readFully(r, BUF_SIZE); xmlCatalog = Util.replaceProperties(xmlCatalog, map); return xmlCatalog; } finally { r.close(); } } /** * Gets content via Apache VFS. File must exist and have content * * @param url String * @return Apache VFS FileContent for further processing * @throws FileSystemException on error */ public static InputStream readVirtualFile(String url) throws FileSystemException { // Treat catalogUrl as an Apache VFS (Virtual File System) URL. // VFS handles all of the usual protocols (http:, file:) // and then some. FileSystemManager fsManager = VFS.getManager(); if (fsManager == null) { throw newError("Cannot get virtual file system manager"); } // Workaround VFS bug. if (url.startsWith("file://localhost")) { url = url.substring("file://localhost".length()); } if (url.startsWith("file:")) { url = url.substring("file:".length()); } // work around for VFS bug not closing http sockets // (Mondrian-585) if (url.startsWith("http")) { try { return new URL(url).openStream(); } catch (IOException e) { throw newError( "Could not read URL: " + url); } } File userDir = new File("").getAbsoluteFile(); FileObject file = fsManager.resolveFile(userDir, url); FileContent fileContent = null; try { // Because of VFS caching, make sure we refresh to get the latest // file content. This refresh may possibly solve the following // workaround for defect MONDRIAN-508, but cannot be tested, so we // will leave the work around for now. file.refresh(); // Workaround to defect MONDRIAN-508. For HttpFileObjects, verifies // the URL of the file retrieved matches the URL passed in. A VFS // cache bug can cause it to treat URLs with different parameters // as the same file (e.g. http://blah.com?param=A, // http://blah.com?param=B) if (file instanceof HttpFileObject && !file.getName().getURI().equals(url)) { fsManager.getFilesCache().removeFile( file.getFileSystem(), file.getName()); file = fsManager.resolveFile(userDir, url); } if (!file.isReadable()) { throw newError( "Virtual file is not readable: " + url); } fileContent = file.getContent(); } finally { file.close(); } if (fileContent == null) { throw newError( "Cannot get virtual file content: " + url); } return fileContent.getInputStream(); } public static String readVirtualFileAsString( String catalogUrl) throws IOException { InputStream in = readVirtualFile(catalogUrl); try { return IOUtils.toString(in); } finally { IOUtils.closeQuietly(in); } } /** * Converts a {@link Properties} object to a string-to-string {@link Map}. * * @param properties Properties * @return String-to-string map */ public static Map toMap(final Properties properties) { return new AbstractMap() { @SuppressWarnings({"unchecked"}) public Set> entrySet() { return (Set) properties.entrySet(); } }; } /** * Replaces tokens in a string. * *

Replaces the tokens "${key}" if "key" occurs in the key-value map. * Otherwise "${key}" is left in the string unchanged. * * @param text Source string * @param env Map of key-value pairs * @return String with tokens substituted */ public static String replaceProperties( String text, Map env) { // As of JDK 1.5, cannot use StringBuilder - appendReplacement requires // the antediluvian StringBuffer. StringBuffer buf = new StringBuffer(text.length() + 200); Pattern pattern = Pattern.compile("\\$\\{([^${}]+)\\}"); Matcher matcher = pattern.matcher(text); while (matcher.find()) { String varName = matcher.group(1); String varValue = env.get(varName); if (varValue != null) { matcher.appendReplacement(buf, varValue); } else { matcher.appendReplacement(buf, "\\${$1}"); } } matcher.appendTail(buf); return buf.toString(); } public static String printMemory() { return printMemory(null); } public static String printMemory(String msg) { final Runtime rt = Runtime.getRuntime(); final long freeMemory = rt.freeMemory(); final long totalMemory = rt.totalMemory(); final StringBuilder buf = new StringBuilder(64); buf.append("FREE_MEMORY:"); if (msg != null) { buf.append(msg); buf.append(':'); } buf.append(' '); buf.append(freeMemory / 1024); buf.append("kb "); long hundredths = (freeMemory * 10000) / totalMemory; buf.append(hundredths / 100); hundredths %= 100; if (hundredths >= 10) { buf.append('.'); } else { buf.append(".0"); } buf.append(hundredths); buf.append('%'); return buf.toString(); } /** * Casts a Set to a Set with a different element type. * * @param set Set * @return Set of desired type */ @SuppressWarnings({"unchecked"}) public static Set cast(Set set) { return (Set) set; } /** * Casts a List to a List with a different element type. * * @param list List * @return List of desired type */ @SuppressWarnings({"unchecked"}) public static List cast(List list) { return (List) list; } /** * Returns whether it is safe to cast a collection to a collection with a * given element type. * * @param collection Collection * @param clazz Target element type * @param Element type * @return Whether all not-null elements of the collection are instances of * element type */ public static boolean canCast( Collection collection, Class clazz) { for (Object o : collection) { if (o != null && !clazz.isInstance(o)) { return false; } } return true; } /** * Casts a collection to iterable. * * Under JDK 1.4, {@link Collection} objects do not implement * {@link Iterable}, so this method inserts a casting wrapper. (Since * Iterable does not exist under JDK 1.4, they will have been compiled * under JDK 1.5 or later, then retrowoven to 1.4 class format. References * to Iterable will have been replaced with references to * com.rc.retroweaver.runtime.Retroweaver_. * *

Under later JDKs this method is trivial. This method can be deleted * when we discontinue support for JDK 1.4. * * @param iterable Object which ought to be iterable * @param Element type * @return Object cast to Iterable */ public static Iterable castToIterable( final Object iterable) { if (Util.Retrowoven && !(iterable instanceof Iterable)) { return new Iterable() { public Iterator iterator() { return ((Collection) iterable).iterator(); } }; } return (Iterable) iterable; } /** * Looks up an enumeration by name, returning null if null or not valid. * * @param clazz Enumerated type * @param name Name of constant */ public static > E lookup(Class clazz, String name) { return lookup(clazz, name, null); } /** * Looks up an enumeration by name, returning a given default value if null * or not valid. * * @param clazz Enumerated type * @param name Name of constant * @param defaultValue Default value if constant is not found * @return Value, or null if name is null or value does not exist */ public static > E lookup( Class clazz, String name, E defaultValue) { if (name == null) { return defaultValue; } try { return Enum.valueOf(clazz, name); } catch (IllegalArgumentException e) { return defaultValue; } } /** * Make a BigDecimal from a double. On JDK 1.5 or later, the BigDecimal * precision reflects the precision of the double while with JDK 1.4 * this is not the case. * * @param d the input double * @return the BigDecimal */ public static BigDecimal makeBigDecimalFromDouble(double d) { return compatible.makeBigDecimalFromDouble(d); } /** * Returns a literal pattern String for the specified String. * *

Specification as for {@link Pattern#quote(String)}, which was * introduced in JDK 1.5. * * @param s The string to be literalized * @return A literal string replacement */ public static String quotePattern(String s) { return compatible.quotePattern(s); } /** * Generates a unique id. * *

From JDK 1.5 onwards, uses a {@code UUID}. * * @return A unique id */ public static String generateUuidString() { return compatible.generateUuidString(); } /** * Compiles a script to yield a Java interface. * *

Only valid JDK 1.6 and higher; fails on JDK 1.5 and earlier.

* * @param iface Interface script should implement * @param script Script code * @param engineName Name of engine (e.g. "JavaScript") * @param Interface * @return Object that implements given interface */ public static T compileScript( Class iface, String script, String engineName) { return compatible.compileScript(iface, script, engineName); } /** * Removes a thread local from the current thread. * *

From JDK 1.5 onwards, calls {@link ThreadLocal#remove()}; before * that, no-ops.

* * @param threadLocal Thread local * @param Type */ public static void threadLocalRemove(ThreadLocal threadLocal) { compatible.threadLocalRemove(threadLocal); } /** * Creates a hash set that, like {@link java.util.IdentityHashMap}, * compares keys using identity. * * @param Element type * @return Set */ public static Set newIdentityHashSet() { return compatible.newIdentityHashSet(); } /** * Creates a new udf instance from the given udf class. * * @param udfClass the class to create new instance for * @param functionName Function name, or null * @return an instance of UserDefinedFunction */ public static UserDefinedFunction createUdf( Class udfClass, String functionName) { // Instantiate class with default constructor. UserDefinedFunction udf; String className = udfClass.getName(); String functionNameOrEmpty = functionName == null ? "" : functionName; // Find a constructor. Constructor constructor; Object[] args = {}; // 0. Check that class is public and top-level or static. if (!Modifier.isPublic(udfClass.getModifiers()) || (udfClass.getEnclosingClass() != null && !Modifier.isStatic(udfClass.getModifiers()))) { throw MondrianResource.instance().UdfClassMustBePublicAndStatic.ex( functionName, className); } // 1. Look for a constructor "public Udf(String name)". try { constructor = udfClass.getConstructor(String.class); if (Modifier.isPublic(constructor.getModifiers())) { args = new Object[] {functionName}; } else { constructor = null; } } catch (NoSuchMethodException e) { constructor = null; } // 2. Otherwise, look for a constructor "public Udf()". if (constructor == null) { try { constructor = udfClass.getConstructor(); if (Modifier.isPublic(constructor.getModifiers())) { args = new Object[] {}; } else { constructor = null; } } catch (NoSuchMethodException e) { constructor = null; } } // 3. Else, no constructor suitable. if (constructor == null) { throw MondrianResource.instance().UdfClassWrongIface.ex( functionNameOrEmpty, className, UserDefinedFunction.class.getName()); } // Instantiate class. try { udf = (UserDefinedFunction) constructor.newInstance(args); } catch (InstantiationException e) { throw MondrianResource.instance().UdfClassWrongIface.ex( functionNameOrEmpty, className, UserDefinedFunction.class.getName()); } catch (IllegalAccessException e) { throw MondrianResource.instance().UdfClassWrongIface.ex( functionName, className, UserDefinedFunction.class.getName()); } catch (ClassCastException e) { throw MondrianResource.instance().UdfClassWrongIface.ex( functionNameOrEmpty, className, UserDefinedFunction.class.getName()); } catch (InvocationTargetException e) { throw MondrianResource.instance().UdfClassWrongIface.ex( functionName, className, UserDefinedFunction.class.getName()); } return udf; } /** * Check the resultSize against the result limit setting. Throws * LimitExceededDuringCrossjoin exception if limit exceeded. * * When it is called from RolapNativeSet.checkCrossJoin(), it is only * possible to check the known input size, because the final CJ result * will come from the DB(and will be checked against the limit when * fetching from the JDBC result set, in SqlTupleReader.prepareTuples()) * * @param resultSize Result limit * @throws ResourceLimitExceededException */ public static void checkCJResultLimit(long resultSize) { int resultLimit = MondrianProperties.instance().ResultLimit.get(); // Throw an exeption, if the size of the crossjoin exceeds the result // limit. if (resultLimit > 0 && resultLimit < resultSize) { throw MondrianResource.instance().LimitExceededDuringCrossjoin.ex( resultSize, resultLimit); } // Throw an exception if the crossjoin exceeds a reasonable limit. // (Yes, 4 billion is a reasonable limit.) if (resultSize > Integer.MAX_VALUE) { throw MondrianResource.instance().LimitExceededDuringCrossjoin.ex( resultSize, Integer.MAX_VALUE); } } /** * Converts an olap4j connect string into a legacy mondrian connect string. * *

For example, * "jdbc:mondrian:Datasource=jdbc/SampleData;Catalog=foodmart/FoodMart.xml;" * becomes * "Provider=Mondrian; * Datasource=jdbc/SampleData;Catalog=foodmart/FoodMart.xml;" * *

This method is intended to allow legacy applications (such as JPivot * and Mondrian's XMLA server) to continue to create connections using * Mondrian's legacy connection API even when they are handed an olap4j * connect string. * * @param url olap4j connect string * @return mondrian connect string, or null if cannot be converted */ public static String convertOlap4jConnectStringToNativeMondrian( String url) { if (url.startsWith("jdbc:mondrian:")) { return "Provider=Mondrian; " + url.substring("jdbc:mondrian:".length()); } return null; } /** * Checks if a String is whitespace, empty ("") or null.

* *
     * StringUtils.isBlank(null) = true
     * StringUtils.isBlank("") = true
     * StringUtils.isBlank(" ") = true
     * StringUtils.isBlank("bob") = false
     * StringUtils.isBlank(" bob ") = false
     * 
* *

(Copied from commons-lang.) * * @param str the String to check, may be null * @return true if the String is null, empty or whitespace */ public static boolean isBlank(String str) { final int strLen; if (str == null || (strLen = str.length()) == 0) { return true; } for (int i = 0; i < strLen; i++) { if (!Character.isWhitespace(str.charAt(i))) { return false; } } return true; } /** * Returns a role which has access to everything. * @param schema A schema to bind this role to. * @return A role with root access to the schema. */ public static Role createRootRole(Schema schema) { RoleImpl role = new RoleImpl(); role.grant(schema, Access.ALL); role.makeImmutable(); return role; } /** * Tries to find the cube from which a dimension is taken. * It considers private dimensions, shared dimensions and virtual * dimensions. If it can't determine with certitude the origin * of the dimension, it returns null. */ public static Cube getDimensionCube(Dimension dimension) { final Cube[] cubes = dimension.getSchema().getCubes(); for (Cube cube : cubes) { for (Dimension dimension1 : cube.getDimensions()) { // If the dimensions have the same identity, // we found an access rule. if (dimension == dimension1) { return cube; } // If the passed dimension argument is of class // RolapCubeDimension, we must validate the cube // assignment and make sure the cubes are the same. // If not, skip to the next grant. if (dimension instanceof RolapCubeDimension && dimension.equals(dimension1) && !((RolapCubeDimension)dimension1) .getCube() .equals(cube)) { continue; } // Last thing is to allow for equality correspondences // to work with virtual cubes. if (cube instanceof RolapCube && ((RolapCube)cube).isVirtual() && dimension.equals(dimension1)) { return cube; } } } return null; } /** * Similar to {@link ClassLoader#getResource(String)}, except the lookup * is in reverse order.
* i.e. returns the resource from the supplied classLoader or the * one closest to it in the hierarchy, instead of the closest to the root * class loader * @param classLoader The class loader to fetch from * @param name The resource name * @return A URL object for reading the resource, or null if the resource * could not be found or the invoker doesn't have adequate privileges to get * the resource. * @see ClassLoader#getResource(String) * @see ClassLoader#getResources(String) */ public static URL getClosestResource(ClassLoader classLoader, String name) { URL resource = null; try { // The last resource will be from the nearest ClassLoader. Enumeration resourceCandidates = classLoader.getResources(name); while (resourceCandidates.hasMoreElements()) { resource = resourceCandidates.nextElement(); } } catch (IOException ioe) { // ignore exception - it's OK if file is not found // just keep getResource contract and return null Util.discard(ioe); } return resource; } public static abstract class AbstractFlatList implements List, RandomAccess { protected final List asArrayList() { //noinspection unchecked return Arrays.asList((T[]) toArray()); } public Iterator iterator() { return asArrayList().iterator(); } public ListIterator listIterator() { return asArrayList().listIterator(); } public boolean isEmpty() { return false; } public boolean add(Object t) { throw new UnsupportedOperationException(); } public boolean addAll(Collection c) { throw new UnsupportedOperationException(); } public boolean addAll(int index, Collection c) { throw new UnsupportedOperationException(); } public boolean removeAll(Collection c) { throw new UnsupportedOperationException(); } public boolean retainAll(Collection c) { throw new UnsupportedOperationException(); } public void clear() { throw new UnsupportedOperationException(); } public T set(int index, Object element) { throw new UnsupportedOperationException(); } public void add(int index, Object element) { throw new UnsupportedOperationException(); } public T remove(int index) { throw new UnsupportedOperationException(); } public ListIterator listIterator(int index) { return asArrayList().listIterator(index); } public List subList(int fromIndex, int toIndex) { return asArrayList().subList(fromIndex, toIndex); } public boolean contains(Object o) { return indexOf(o) >= 0; } public boolean containsAll(Collection c) { Iterator e = c.iterator(); while (e.hasNext()) { if (!contains(e.next())) { return false; } } return true; } public boolean remove(Object o) { throw new UnsupportedOperationException(); } } /** * List that stores its two elements in the two members of the class. * Unlike {@link java.util.ArrayList} or * {@link java.util.Arrays#asList(Object[])} there is * no array, only one piece of memory allocated, therefore is very compact * and cache and CPU efficient. * *

The list is read-only, cannot be modified or resized, and neither * of the elements can be null. * *

The list is created via {@link Util#flatList(Object[])}. * * @see mondrian.olap.Util.Flat3List * @param */ protected static class Flat2List extends AbstractFlatList { private final T t0; private final T t1; Flat2List(T t0, T t1) { this.t0 = t0; this.t1 = t1; assert t0 != null; assert t1 != null; } public String toString() { return "[" + t0 + ", " + t1 + "]"; } public T get(int index) { switch (index) { case 0: return t0; case 1: return t1; default: throw new IndexOutOfBoundsException("index " + index); } } public int size() { return 2; } public boolean equals(Object o) { if (o instanceof Flat2List) { Flat2List that = (Flat2List) o; return Util.equals(this.t0, that.t0) && Util.equals(this.t1, that.t1); } return Arrays.asList(t0, t1).equals(o); } public int hashCode() { int h = 1; h = h * 31 + t0.hashCode(); h = h * 31 + t1.hashCode(); return h; } public int indexOf(Object o) { if (t0.equals(o)) { return 0; } if (t1.equals(o)) { return 1; } return -1; } public int lastIndexOf(Object o) { if (t1.equals(o)) { return 1; } if (t0.equals(o)) { return 0; } return -1; } @SuppressWarnings({"unchecked"}) public T2[] toArray(T2[] a) { a[0] = (T2) t0; a[1] = (T2) t1; return a; } public Object[] toArray() { return new Object[] {t0, t1}; } } /** * List that stores its three elements in the three members of the class. * Unlike {@link java.util.ArrayList} or * {@link java.util.Arrays#asList(Object[])} there is * no array, only one piece of memory allocated, therefore is very compact * and cache and CPU efficient. * *

The list is read-only, cannot be modified or resized, and none * of the elements can be null. * *

The list is created via {@link Util#flatList(Object[])}. * * @see mondrian.olap.Util.Flat2List * @param */ protected static class Flat3List extends AbstractFlatList { private final T t0; private final T t1; private final T t2; Flat3List(T t0, T t1, T t2) { this.t0 = t0; this.t1 = t1; this.t2 = t2; assert t0 != null; assert t1 != null; assert t2 != null; } public String toString() { return "[" + t0 + ", " + t1 + ", " + t2 + "]"; } public T get(int index) { switch (index) { case 0: return t0; case 1: return t1; case 2: return t2; default: throw new IndexOutOfBoundsException("index " + index); } } public int size() { return 3; } public boolean equals(Object o) { if (o instanceof Flat3List) { Flat3List that = (Flat3List) o; return Util.equals(this.t0, that.t0) && Util.equals(this.t1, that.t1) && Util.equals(this.t2, that.t2); } return o.equals(this); } public int hashCode() { int h = 1; h = h * 31 + t0.hashCode(); h = h * 31 + t1.hashCode(); h = h * 31 + t2.hashCode(); return h; } public int indexOf(Object o) { if (t0.equals(o)) { return 0; } if (t1.equals(o)) { return 1; } if (t2.equals(o)) { return 2; } return -1; } public int lastIndexOf(Object o) { if (t2.equals(o)) { return 2; } if (t1.equals(o)) { return 1; } if (t0.equals(o)) { return 0; } return -1; } @SuppressWarnings({"unchecked"}) public T2[] toArray(T2[] a) { a[0] = (T2) t0; a[1] = (T2) t1; a[2] = (T2) t2; return a; } public Object[] toArray() { return new Object[] {t0, t1, t2}; } } /** * Garbage-collecting iterator. Iterates over a collection of references, * and if any of the references has been garbage-collected, removes it from * the collection. * * @param Element type */ public static class GcIterator implements Iterator { private final Iterator> iterator; private boolean hasNext; private T next; public GcIterator(Iterator> iterator) { this.iterator = iterator; this.hasNext = true; moveToNext(); } /** * Creates an iterator over a collection of references. * * @param referenceIterable Collection of references * @param element type * @return iterable over collection */ public static Iterable over( final Iterable> referenceIterable) { return new Iterable() { public Iterator iterator() { return new GcIterator(referenceIterable.iterator()); } }; } private void moveToNext() { while (iterator.hasNext()) { final Reference ref = iterator.next(); next = ref.get(); if (next != null) { return; } iterator.remove(); } hasNext = false; } public boolean hasNext() { return hasNext; } public T next() { final T next1 = next; moveToNext(); return next1; } public void remove() { throw new UnsupportedOperationException(); } } public static interface Functor1 { RT apply(PT param); } public static Functor1 identityFunctor() { //noinspection unchecked return IDENTITY_FUNCTOR; } private static final Functor1 IDENTITY_FUNCTOR = new Functor1() { public Object apply(Object param) { return param; } }; public static Functor1 trueFunctor() { //noinspection unchecked return TRUE_FUNCTOR; } public static Functor1 falseFunctor() { //noinspection unchecked return FALSE_FUNCTOR; } private static final Functor1 TRUE_FUNCTOR = new Functor1() { public Boolean apply(Object param) { return true; } }; private static final Functor1 FALSE_FUNCTOR = new Functor1() { public Boolean apply(Object param) { return false; } }; /** * Information about memory usage. * * @see mondrian.olap.Util#getMemoryInfo() */ public interface MemoryInfo { Usage get(); public interface Usage { long getUsed(); long getCommitted(); long getMax(); } } /** * A {@link Comparator} implementation which can deal * correctly with {@link RolapUtil#sqlNullValue}. */ public static class SqlNullSafeComparator implements Comparator { public static final SqlNullSafeComparator instance = new SqlNullSafeComparator(); private SqlNullSafeComparator() { } public int compare(Comparable o1, Comparable o2) { if (o1 == RolapUtil.sqlNullValue) { return -1; } if (o2 == RolapUtil.sqlNullValue) { return 1; } return o1.compareTo(o2); } } /** * This class implements the Knuth-Morris-Pratt algorithm * to search within a byte array for a token byte array. */ public static class ByteMatcher { private final int[] matcher; public final byte[] key; public ByteMatcher(byte[] key) { this.key = key; this.matcher = compile(key); } /** * Matches the pre-compiled byte array token against a * byte array variable and returns the index of the key * within the array. * @param a An array of bytes to search for. * @return -1 if not found, or the index (0 based) of the match. */ public int match(byte[] a) { int j = 0; for (int i = 0; i < a.length; i++) { while (j > 0 && key[j] != a[i]) { j = matcher[j - 1]; } if (a[i] == key[j]) { j++; } if (key.length == j) { return i - key.length + 1; } } return -1; } private int[] compile(byte[] key) { int[] matcher = new int[key.length]; int j = 0; for (int i = 1; i < key.length; i++) { while (j > 0 && key[j] != key[i]) { j = matcher[j - 1]; } if (key[i] == key[j]) { j++; } matcher[i] = j; } return matcher; } } /** * Transforms a list into a map for which all the keys return * a null value associated to it. * *

The list passed as an argument will be used to back * the map returned and as many methods are overridden as * possible to make sure that we don't iterate over the backing * list when creating it and when performing operations like * .size(), entrySet() and contains(). * *

The returned map is to be considered immutable. It will * throw an {@link UnsupportedOperationException} if attempts to * modify it are made. */ public static Map toNullValuesMap(List list) { return new NullValuesMap(list); } private static class NullValuesMap extends AbstractMap { private final List list; private NullValuesMap(List list) { super(); this.list = Collections.unmodifiableList(list); } public Set> entrySet() { return new AbstractSet>() { public Iterator> iterator() { return new Iterator>() { private int pt = -1; public void remove() { throw new UnsupportedOperationException(); } @SuppressWarnings("unchecked") public Entry next() { return new AbstractMapEntry( list.get(++pt), null) {}; } public boolean hasNext() { return pt < list.size(); } }; } public int size() { return list.size(); } public boolean contains(Object o) { if (o instanceof Entry) { if (list.contains(((Entry) o).getKey())) { return true; } } return false; } }; } public Set keySet() { return new AbstractSet() { public Iterator iterator() { return new Iterator() { private int pt = -1; public void remove() { throw new UnsupportedOperationException(); } public K next() { return list.get(++pt); } public boolean hasNext() { return pt < list.size(); } }; } public int size() { return list.size(); } public boolean contains(Object o) { return list.contains(o); } }; } public Collection values() { return new AbstractList() { public V get(int index) { return null; } public int size() { return list.size(); } public boolean contains(Object o) { if (o == null && size() > 0) { return true; } else { return false; } } }; } public V get(Object key) { return null; } public boolean containsKey(Object key) { return list.contains(key); } public boolean containsValue(Object o) { if (o == null && size() > 0) { return true; } else { return false; } } } } // End Util.java mondrian-3.11.0.1-R/src/main/mondrian/olap/Validator.java000066400000000000000000000077121261646570300230270ustar00rootroot00000000000000/* // This software is subject to the terms of the Eclipse Public License v1.0 // Agreement, available at the following URL: // http://www.eclipse.org/legal/epl-v10.html. // You must accept the terms of that agreement to use this software. // // Copyright (C) 2005-2005 Julian Hyde // Copyright (C) 2005-2009 Pentaho // All Rights Reserved. */ package mondrian.olap; import mondrian.mdx.ParameterExpr; import mondrian.olap.fun.Resolver; import mondrian.olap.type.Type; import java.util.List; /** * Provides context necessary to resolve identifiers to objects, function * calls to specific functions. * *

An expression calls {@link #validate} on each of its children, * which in turn calls {@link Exp#accept}. * * @author jhyde */ public interface Validator { /** * Returns the {@link Query} which is being validated. */ Query getQuery(); /** * Validates an expression, and returns the expression it resolves to. * * @param exp Expression to validate * @param scalar Whether the context requires that the expression is * evaluated to a value, as opposed to a tuple */ Exp validate(Exp exp, boolean scalar); /** * Validates a usage of a parameter. * *

It must resolve to the same object (although sub-objects may change). */ void validate(ParameterExpr parameterExpr); /** * Validates a child member property. * *

It must resolve to the same object (although sub-objects may change). */ void validate(MemberProperty memberProperty); /** * Validates an axis. * * It must resolve to the same object (although sub-objects may change). */ void validate(QueryAxis axis); /** * Validates a formula. * * It must resolve to the same object (although sub-objects may change). */ void validate(Formula formula); /** * Returns whether the current context requires an expression. */ boolean requiresExpression(); /** * Returns whether we can convert an argument to a parameter type. * * @param ordinal argument ordinal * @param fromExp argument type * @param to parameter type * @param conversions List of conversions performed; * method adds an element for each non-trivial conversion (for * example, converting a member to a level). * @return Whether we can convert an argument to a parameter type */ boolean canConvert( int ordinal, Exp fromExp, int to, List conversions); /** * Returns the table of function and operator definitions. */ FunTable getFunTable(); /** * Creates or retrieves the parameter corresponding to a "Parameter" or * "ParamRef" function call. */ Parameter createOrLookupParam( boolean definition, String name, Type type, Exp defaultExp, String description); /** * Resolves a function call to a particular function. If the function is * overloaded, returns as precise a match to the argument types as * possible. */ FunDef getDef( Exp[] args, String name, Syntax syntax); /** * Whether to resolve function name and arguments to a function definition * each time a node is validated, not just the first time. * *

Default implementation returns {@code false}. * * @return whether to resolve function each time */ boolean alwaysResolveFunDef(); /** * Returns the schema reader with which to resolve names of MDX objects * (dimensions, hierarchies, levels, members, named sets). * *

The schema reader is initially in the context of the query's cube, * and during a traversal it may change if named sets are introduced using * the 'expr AS alias' construct. * * @return Schema reader */ SchemaReader getSchemaReader(); } // End Validator.java mondrian-3.11.0.1-R/src/main/mondrian/olap/ValidatorImpl.java000066400000000000000000000326401261646570300236470ustar00rootroot00000000000000/* // This software is subject to the terms of the Eclipse Public License v1.0 // Agreement, available at the following URL: // http://www.eclipse.org/legal/epl-v10.html. // You must accept the terms of that agreement to use this software. // // Copyright (C) 2002-2015 Pentaho // All Rights Reserved. */ package mondrian.olap; import mondrian.mdx.*; import mondrian.olap.fun.Resolver; import mondrian.olap.type.Type; import mondrian.olap.type.TypeUtil; import mondrian.resource.MondrianResource; import mondrian.util.ArrayStack; import java.util.*; /** * Default implementation of {@link mondrian.olap.Validator}. * *

Uses a stack to help us guess the type of our parent expression * before we've completely resolved our children -- necessary, * unfortunately, when figuring out whether the "*" operator denotes * multiplication or crossjoin. * *

Keeps track of which nodes have already been resolved, so we don't * try to resolve nodes which have already been resolved. (That would not * be wrong, but can cause resolution to be an O(2^N) * operation.) * *

The concrete implementing class needs to implement * {@link #getQuery()} and {@link #defineParameter(Parameter)}. * * @author jhyde */ abstract class ValidatorImpl implements Validator { protected final ArrayStack stack = new ArrayStack(); private final FunTable funTable; private final Map resolvedNodes = new HashMap(); private final QueryPart placeHolder = Literal.zero; private final Map> scopeExprs = new HashMap>(); /** * Creates a ValidatorImpl. * * @param funTable Function table * * @param resolvedIdentifiers map of already resolved Ids * @pre funTable != null */ protected ValidatorImpl( FunTable funTable, Map resolvedIdentifiers) { Util.assertPrecondition(funTable != null, "funTable != null"); this.funTable = funTable; resolvedNodes.putAll(resolvedIdentifiers); } public Exp validate(Exp exp, boolean scalar) { Exp resolved; try { resolved = (Exp) resolvedNodes.get(exp); } catch (ClassCastException e) { // A classcast exception will occur if there is a String // placeholder in the map. This is an internal error -- should // not occur for any query, valid or invalid. throw Util.newInternal( e, "Infinite recursion encountered while validating '" + Util.unparse(exp) + "'"); } if (resolved == null) { try { stack.push((QueryPart) exp); // To prevent recursion, put in a placeholder while we're // resolving. resolvedNodes.put((QueryPart) exp, placeHolder); resolved = exp.accept(this); Util.assertTrue(resolved != null); resolvedNodes.put((QueryPart) exp, (QueryPart) resolved); } finally { stack.pop(); } } if (scalar) { final Type type = resolved.getType(); if (!TypeUtil.canEvaluate(type)) { String exprString = Util.unparse(resolved); throw MondrianResource.instance().MdxMemberExpIsSet.ex( exprString); } } return resolved; } public void validate(ParameterExpr parameterExpr) { ParameterExpr resolved = (ParameterExpr) resolvedNodes.get(parameterExpr); if (resolved != null) { return; // already resolved } try { stack.push(parameterExpr); resolvedNodes.put(parameterExpr, placeHolder); resolved = (ParameterExpr) parameterExpr.accept(this); assert resolved != null; resolvedNodes.put(parameterExpr, resolved); } finally { stack.pop(); } } public void validate(MemberProperty memberProperty) { MemberProperty resolved = (MemberProperty) resolvedNodes.get(memberProperty); if (resolved != null) { return; // already resolved } try { stack.push(memberProperty); resolvedNodes.put(memberProperty, placeHolder); memberProperty.resolve(this); resolvedNodes.put(memberProperty, memberProperty); } finally { stack.pop(); } } public void validate(QueryAxis axis) { final QueryAxis resolved = (QueryAxis) resolvedNodes.get(axis); if (resolved != null) { return; // already resolved } try { stack.push(axis); resolvedNodes.put(axis, placeHolder); axis.resolve(this); resolvedNodes.put(axis, axis); } finally { stack.pop(); } } public void validate(Formula formula) { final Formula resolved = (Formula) resolvedNodes.get(formula); if (resolved != null) { return; // already resolved } try { stack.push(formula); resolvedNodes.put(formula, placeHolder); formula.accept(this); resolvedNodes.put(formula, formula); } finally { stack.pop(); } } public FunDef getDef( Exp[] args, String funName, Syntax syntax) { // Compute signature first. It makes debugging easier. final String signature = syntax.getSignature( funName, Category.Unknown, ExpBase.getTypes(args)); // Resolve function by its upper-case name first. If there is only one // function with that name, stop immediately. If there is more than // function, use some custom method, which generally involves looking // at the type of one of its arguments. List resolvers = funTable.getResolvers(funName, syntax); assert resolvers != null; final List conversionList = new ArrayList(); int minConversionCost = Integer.MAX_VALUE; List matchDefs = new ArrayList(); List matchConversionList = null; for (Resolver resolver : resolvers) { conversionList.clear(); FunDef def = resolver.resolve(args, this, conversionList); if (def != null) { int conversionCost = sumConversionCost(conversionList); if (conversionCost < minConversionCost) { minConversionCost = conversionCost; matchDefs.clear(); matchDefs.add(def); matchConversionList = new ArrayList(conversionList); } else if (conversionCost == minConversionCost) { matchDefs.add(def); } else { // ignore this match -- it required more coercions than // other overloadings we've seen } } } switch (matchDefs.size()) { case 0: throw MondrianResource.instance().NoFunctionMatchesSignature.ex( signature); case 1: break; default: final StringBuilder buf = new StringBuilder(); for (FunDef matchDef : matchDefs) { if (buf.length() > 0) { buf.append(", "); } buf.append(matchDef.getSignature()); } throw MondrianResource.instance() .MoreThanOneFunctionMatchesSignature.ex( signature, buf.toString()); } final FunDef matchDef = matchDefs.get(0); for (Resolver.Conversion conversion : matchConversionList) { conversion.checkValid(); conversion.apply(this, Arrays.asList(args)); } return matchDef; } public boolean alwaysResolveFunDef() { return false; } private int sumConversionCost( List conversionList) { int cost = 0; for (Resolver.Conversion conversion : conversionList) { cost += conversion.getCost(); } return cost; } public boolean canConvert( int ordinal, Exp fromExp, int to, List conversions) { return TypeUtil.canConvert( ordinal, fromExp.getType(), to, conversions); } public boolean requiresExpression() { return requiresExpression(stack.size() - 1); } private boolean requiresExpression(int n) { if (n < 1) { return false; } final Object parent = stack.get(n - 1); if (parent instanceof Formula) { return ((Formula) parent).isMember(); } else if (parent instanceof ResolvedFunCall) { final ResolvedFunCall funCall = (ResolvedFunCall) parent; if (funCall.getFunDef().getSyntax() == Syntax.Parentheses) { return requiresExpression(n - 1); } else { int k = whichArg(funCall, (Exp) stack.get(n)); if (k < 0) { // Arguments of call have mutated since call was placed // on stack. Presumably the call has already been // resolved correctly, so the answer we give here is // irrelevant. return false; } final FunDef funDef = funCall.getFunDef(); final int[] parameterTypes = funDef.getParameterCategories(); return parameterTypes[k] != Category.Set; } } else if (parent instanceof UnresolvedFunCall) { final UnresolvedFunCall funCall = (UnresolvedFunCall) parent; if (funCall.getSyntax() == Syntax.Parentheses || funCall.getFunName().equals("*")) { return requiresExpression(n - 1); } else { int k = whichArg(funCall, (Exp) stack.get(n)); if (k < 0) { // Arguments of call have mutated since call was placed // on stack. Presumably the call has already been // resolved correctly, so the answer we give here is // irrelevant. return false; } return requiresExpression(funCall, k); } } else { return false; } } /** * Returns whether the kth argument to a function call * has to be an expression. */ boolean requiresExpression( UnresolvedFunCall funCall, int k) { // The function call has not been resolved yet. In fact, this method // may have been invoked while resolving the child. Consider this: // CrossJoin([Measures].[Unit Sales] * [Measures].[Store Sales]) // // In order to know whether to resolve '*' to the multiplication // operator (which returns a scalar) or the crossjoin operator // (which returns a set) we have to know what kind of expression is // expected. List resolvers = funTable.getResolvers( funCall.getFunName(), funCall.getSyntax()); for (Resolver resolver2 : resolvers) { if (!resolver2.requiresExpression(k)) { // This resolver accepts a set in this argument position, // therefore we don't REQUIRE a scalar expression. return false; } } return true; } public FunTable getFunTable() { return funTable; } public Parameter createOrLookupParam( boolean definition, String name, Type type, Exp defaultExp, String description) { final SchemaReader schemaReader = getQuery().getSchemaReader(false); Parameter param = schemaReader.getParameter(name); if (definition) { if (param != null) { if (param.getScope() == Parameter.Scope.Statement) { ParameterImpl paramImpl = (ParameterImpl) param; paramImpl.setDescription(description); paramImpl.setDefaultExp(defaultExp); paramImpl.setType(type); } return param; } param = new ParameterImpl( name, defaultExp, description, type); // Append it to the list of known parameters. defineParameter(param); return param; } else { if (param != null) { return param; } throw MondrianResource.instance().UnknownParameter.ex(name); } } private int whichArg(final FunCall node, final Exp arg) { final Exp[] children = node.getArgs(); for (int i = 0; i < children.length; i++) { if (children[i] == arg) { return i; } } return -1; } /** * Defines a parameter. * * @param param Parameter */ protected abstract void defineParameter(Parameter param); } // End ValidatorImpl.java mondrian-3.11.0.1-R/src/main/mondrian/olap/Walkable.java000066400000000000000000000013011261646570300226100ustar00rootroot00000000000000/* // This software is subject to the terms of the Eclipse Public License v1.0 // Agreement, available at the following URL: // http://www.eclipse.org/legal/epl-v10.html. // You must accept the terms of that agreement to use this software. // // Copyright (C) 1999-2005 Julian Hyde // Copyright (C) 2005-2005 Pentaho and others // All Rights Reserved. // // jhyde, 1 March, 1999 */ package mondrian.olap; /** * An object which implements Walkable can be tree-walked by * {@link Walker}. */ interface Walkable { /** * Returns an array of the object's children. Those which are not {@link * Walkable} are ignored. */ Object[] getChildren(); } // End Walkable.java mondrian-3.11.0.1-R/src/main/mondrian/olap/Walker.java000066400000000000000000000230421261646570300223210ustar00rootroot00000000000000/* // This software is subject to the terms of the Eclipse Public License v1.0 // Agreement, available at the following URL: // http://www.eclipse.org/legal/epl-v10.html. // You must accept the terms of that agreement to use this software. // // Copyright (C) 1999-2005 Julian Hyde // Copyright (C) 2005-2013 Pentaho and others // All Rights Reserved. // // jhyde, 1 March, 1999 */ package mondrian.olap; import mondrian.util.ArrayStack; import java.io.PrintWriter; import java.util.Enumeration; /** * Walks over a tree, returning nodes in prefix order. Objects which are an * instance of {@link Walkable} supply their children using * getChildren(); other objects are assumed to have no children. * *

If the tree is modified during the enumeration, strange things may happen. * *

Example use:

 *    Tree t;
 *    Walker w = new Walker(t);
 *    while (w.hasMoreElements()) {
 *      Tree node = (Tree) w.nextNode();
 *      System.out.println(node.toString());
 *    }
 * 
*/ public class Walker implements Enumeration { /** * The active parts of the tree from the root to nextNode are held in a * stack. When the stack is empty, the enumeration finishes. currentFrame * holds the frame of the 'current node' (the node last returned from * nextElement()) because it may no longer be on the stack. */ private final ArrayStack stack; private Frame currentFrame; private Object nextNode; private class Frame { Frame(Frame parent, Object node) { this.parent = parent; this.node = node; this.children = getChildren(node); this.childIndex = -1; // haven't visited first child yet } final Frame parent; final Object node; final Object[] children; int childIndex; } public Walker(Walkable root) { stack = new ArrayStack(); currentFrame = null; visit(null, root); } private void moveToNext() { if (stack.isEmpty()) { return; } currentFrame = (Frame) stack.peek(); // Unwind stack until we find a level we have not completed. do { Frame frame = (Frame) stack.peek(); if (frame.children != null && ++frame.childIndex < frame.children.length) { // Here is an unvisited child. Visit it. visit(frame, frame.children[frame.childIndex]); return; } stack.pop(); } while (!stack.isEmpty()); nextNode = null; } private void visit(Frame parent, Object node) { nextNode = node; stack.add(new Frame(parent, node)); } public boolean hasMoreElements() { return nextNode != null; } public Object nextElement() { moveToNext(); return currentFrame.node; } /** Tell walker that we don't want to visit any (more) children of this * node. The next node visited will be (a return visit to) the node's * parent. Not valid until nextElement() has been called. */ public void prune() { if (currentFrame.children != null) { currentFrame.childIndex = currentFrame.children.length; } // we need to make that next frame on the stack is not a child // of frame we just pruned. if it is, we need to prune it too if (this.hasMoreElements()) { Object nextFrameParentNode = ((Frame)stack.peek()).parent.node; if (nextFrameParentNode != currentFrame.node) { return; } // delete the child of current member from the stack stack.pop(); if (currentFrame.parent != null) { currentFrame = currentFrame.parent; } nextElement(); } } public void pruneSiblings() { prune(); currentFrame = currentFrame.parent; if (currentFrame != null) { prune(); } } /** returns the current object. Not valid until nextElement() has been called. */ public Object currentElement() { return currentFrame.node; } /** returns level in the tree of the current element (that is, last element * returned from nextElement()). The level of the root element is 0. */ public int level() { int i = 0; for (Frame f = currentFrame; f != null; f = f.parent) { i++; } return i; } public final Object getParent() { return getAncestor(1); } public final Object getAncestor(int iDepth) { Frame f = getAncestorFrame(iDepth); return f == null ? null : f.node; } /** returns the iDepthth ancestor of the current element */ private Frame getAncestorFrame(int iDepth) { for (Frame f = currentFrame; f != null; f = f.parent) { if (iDepth-- == 0) { return f; } } return null; } /** get the ordinal within its parent node of the current node. Returns 0 for the root element. Equivalent to getAncestorOrdinal(0). */ public int getOrdinal() { // We can't use currentFrame.parent.iChild because moveToNext() may // have changed it. return currentFrame.parent == null ? 0 : arrayFind(currentFrame.parent.children, currentFrame.node); } /** get the ordinal within its parent node of the iDepthth * ancestor. */ public int getAncestorOrdinal(int iDepth) { Frame f = getAncestorFrame(iDepth); return f == null ? -1 : f.parent == null ? 0 : arrayFind(f.parent.children, f.node); } /** Override this function to prune the tree, or to allow objects which are * not Walkable to have children. */ public Object[] getChildren(Object node) { if (node instanceof Walkable) { return ((Walkable) node).getChildren(); } else { return null; } } private static int arrayFind(Object[] array, Object o) { for (int i = 0; i < array.length; i++) { if (array[i] == o) { return i; } } return -1; } private static class Region implements Walkable { String name; Region[] children; Region(String name, Region[] children) { this.name = name; this.children = children; } public Object[] getChildren() { return children; } public static void walkUntil(Walker walker, String name) { while (walker.hasMoreElements()) { Region region = (Region) walker.nextElement(); if (region.name.equals(name)) { break; } } } }; public static void main(String[] args) { PrintWriter pw = new PrintWriter(System.out); Region usa = new Region( "USA", new Region[] { new Region( "CA", new Region[] { new Region( "San Francisco", new Region[] { new Region( "WesternAddition", new Region[] { new Region("Haight", null)}), new Region("Soma", null) }), new Region("Los Angeles", null)}), new Region( "WA", new Region[] { new Region("Seattle", null), new Region("Tacoma", null)})}); Walker walker = new Walker(usa); if (false) { while (walker.hasMoreElements()) { Region region = (Region) walker.nextElement(); pw.println(region.name); pw.flush(); } } Region.walkUntil(walker, "CA"); walker.prune(); Region region = (Region) walker.nextElement(); // should be WA pw.println(region.name); pw.flush(); walker = new Walker(usa); Region.walkUntil(walker, "USA"); walker.prune(); region = (Region) walker.nextElement(); // should be null if (region == null) { pw.println("null"); } pw.flush(); walker = new Walker(usa); Region.walkUntil(walker, "Los Angeles"); walker.prune(); region = (Region) walker.nextElement(); // should be WA pw.println(region.name); pw.flush(); walker = new Walker(usa); Region.walkUntil(walker, "Haight"); walker.prune(); region = (Region) walker.nextElement(); // should be Soma pw.println(region.name); pw.flush(); walker = new Walker(usa); Region.walkUntil(walker, "Soma"); walker.prune(); region = (Region) walker.nextElement(); // should be Los Angeles pw.println(region.name); pw.flush(); walker = new Walker(usa); Region.walkUntil(walker, "CA"); walker.pruneSiblings(); region = (Region) walker.nextElement(); // should be Los Angeles if (region == null) { pw.println("null"); pw.flush(); } walker = new Walker(usa); Region.walkUntil(walker, "Soma"); walker.pruneSiblings(); region = (Region) walker.nextElement(); // should be Los Angeles if (region == null) { pw.println("null"); pw.flush(); } } } // End Walker.java mondrian-3.11.0.1-R/src/main/mondrian/olap/fun/000077500000000000000000000000001261646570300210205ustar00rootroot00000000000000mondrian-3.11.0.1-R/src/main/mondrian/olap/fun/AbstractAggregateFunDef.java000066400000000000000000000244521261646570300263340ustar00rootroot00000000000000/* // This software is subject to the terms of the Eclipse Public License v1.0 // Agreement, available at the following URL: // http://www.eclipse.org/legal/epl-v10.html. // You must accept the terms of that agreement to use this software. // // Copyright (c) 2002-2014 Pentaho Corporation.. All rights reserved. */ package mondrian.olap.fun; import mondrian.calc.*; import mondrian.calc.impl.DelegatingTupleList; import mondrian.mdx.UnresolvedFunCall; import mondrian.olap.*; import mondrian.resource.MondrianResource; import mondrian.rolap.*; import java.util.*; /** * Abstract base class for all aggregate functions (Aggregate, * Sum, Avg, et cetera). * * @author jhyde * @since 2005/8/14 */ public class AbstractAggregateFunDef extends FunDefBase { public AbstractAggregateFunDef(FunDef dummyFunDef) { super(dummyFunDef); } protected Exp validateArg( Validator validator, Exp[] args, int i, int category) { // If expression cache is enabled, wrap first expression (the set) // in a function which will use the expression cache. if (i == 0) { if (MondrianProperties.instance().EnableExpCache.get()) { Exp arg = args[0]; if (FunUtil.worthCaching(arg)) { final Exp cacheCall = new UnresolvedFunCall( CacheFunDef.NAME, Syntax.Function, new Exp[] {arg}); return validator.validate(cacheCall, false); } } } return super.validateArg(validator, args, i, category); } /** * Evaluates the list of members or tuples used in computing the aggregate. * If the measure for aggregation has to ignore unrelated dimensions * this method will push unrelated dimension members to top level member. * This behaviour is driven by the ignoreUnrelatedDimensions property * on a base cube usage specified in the virtual cube.Keeps track of the * number of iterations that will be required to iterate over the members * or tuples needed to compute the aggregate within the current context. * In doing so, also determines if the cross product of all iterations * across all parent evaluation contexts will exceed the limit set in the * properties file. * * @param listCalc calculator used to evaluate the member list * @param evaluator current evaluation context * @return list of evaluated members or tuples */ protected static TupleList evaluateCurrentList( ListCalc listCalc, Evaluator evaluator) { final int savepoint = evaluator.savepoint(); TupleList tuples; try { evaluator.setNonEmpty(false); tuples = listCalc.evaluateList(evaluator); } finally { evaluator.restore(savepoint); } int currLen = tuples.size(); TupleList dims; try { dims = processUnrelatedDimensions(tuples, evaluator); } finally { evaluator.restore(savepoint); } crossProd(evaluator, currLen); return dims; } protected TupleIterable evaluateCurrentIterable( IterCalc iterCalc, Evaluator evaluator) { final int savepoint = evaluator.savepoint(); int currLen = 0; TupleIterable iterable; try { evaluator.setNonEmpty(false); iterable = iterCalc.evaluateIterable(evaluator); } finally { evaluator.restore(savepoint); } crossProd(evaluator, currLen); return iterable; } private static void crossProd(Evaluator evaluator, int currLen) { long iterationLimit = MondrianProperties.instance().IterationLimit.get(); final int productLen = currLen * evaluator.getIterationLength(); if (iterationLimit > 0) { if (productLen > iterationLimit) { throw MondrianResource.instance() .IterationLimitExceeded.ex(iterationLimit); } } evaluator.setIterationLength(currLen); } /** * Pushes unrelated dimensions to the top level member from the given list * of tuples if the ignoreUnrelatedDimensions property is set on the base * cube usage in the virtual cube. * *

If IgnoreMeasureForNonJoiningDimension is set to true and * ignoreUnrelatedDimensions on CubeUsage is set to false then if a non * joining dimension exists in the aggregation list then return an empty * list else return the original list. * * @param tuplesForAggregation is a list of members or tuples used in * computing the aggregate * @param evaluator Evaluator * @return list of members or tuples */ public static TupleList processUnrelatedDimensions( TupleList tuplesForAggregation, Evaluator evaluator) { if (tuplesForAggregation.size() == 0) { return tuplesForAggregation; } RolapMember measure = getRolapMeasureForUnrelatedDimCheck( evaluator, tuplesForAggregation); if (measure.isCalculated()) { return tuplesForAggregation; } RolapCube virtualCube = (RolapCube) evaluator.getCube(); if (virtualCube.isVirtual()) { // this should be a safe cast since we've eliminated calcs above RolapCube baseCube = ((RolapStoredMeasure)measure).getCube(); if (baseCube == null) { return tuplesForAggregation; } if (virtualCube.shouldIgnoreUnrelatedDimensions(baseCube.getName())) { return ignoreUnrelatedDimensions( tuplesForAggregation, baseCube); } else if (MondrianProperties.instance() .IgnoreMeasureForNonJoiningDimension.get()) { return ignoreMeasureForNonJoiningDimension( tuplesForAggregation, baseCube); } } return tuplesForAggregation; } /** * Returns the measure to use when determining which dimensions * are unrelated. Most of the time this is the measure in context, * except 2 cases: * 1) When a measure is included in a compound slicer * 2) When one or more measures are included in the first parameter * of Aggregate. * e.g. Aggregate( Crossjoin( {Time.[1997]}, {measures.[Unit Sales]}) * In both cases the measure(s) will be present in tuplesForAggregation. */ private static RolapMember getRolapMeasureForUnrelatedDimCheck( Evaluator evaluator, TupleList tuplesForAggregation) { RolapMember measure = (RolapMember)evaluator.getMembers()[0]; if (tuplesForAggregation != null && tuplesForAggregation.size() > 0) { // this looks for the measure in the first tuple, with the // assumption that there is a single measure in all tuples. // This assumption is incorrect in the unusual case where // a set of measures is used as the first param in an aggregate // function. for (Member tupMember : tuplesForAggregation.get(0)) { if (tupMember.isMeasure()) { measure = (RolapMember)tupMember; } } } return measure; } /** * If a non joining dimension exists in the aggregation list then return * an empty list else return the original list. * * @param tuplesForAggregation is a list of members or tuples used in * computing the aggregate * @param baseCube the cube to scan for nonjoining dimensions. * @return list of members or tuples */ private static TupleList ignoreMeasureForNonJoiningDimension( TupleList tuplesForAggregation, RolapCube baseCube) { Set nonJoiningDimensions = nonJoiningDimensions(baseCube, tuplesForAggregation); if (nonJoiningDimensions.size() > 0) { return TupleCollections.emptyList(tuplesForAggregation.getArity()); } return tuplesForAggregation; } /** * Pushes unrelated dimensions to the top level member from the given list * of tuples if the ignoreUnrelatedDimensions property is set on the base * cube usage in the virtual cube. * * @param tuplesForAggregation is a list of members or tuples used in * computing the aggregate * @return list of members or tuples */ private static TupleList ignoreUnrelatedDimensions( TupleList tuplesForAggregation, RolapCube baseCube) { Set nonJoiningDimensions = nonJoiningDimensions(baseCube, tuplesForAggregation); final Set> processedTuples = new LinkedHashSet>(tuplesForAggregation.size()); for (List tuple : tuplesForAggregation) { List tupleCopy = tuple; for (int j = 0; j < tuple.size(); j++) { final Member member = tuple.get(j); if (nonJoiningDimensions.contains(member.getDimension())) { if (tupleCopy == tuple) { // Avoid making a copy until we have to change a tuple. tupleCopy = new ArrayList(tuple); } final Hierarchy hierarchy = member.getDimension().getHierarchy(); if (hierarchy.hasAll()) { tupleCopy.set(j, hierarchy.getAllMember()); } else { tupleCopy.set(j, hierarchy.getDefaultMember()); } } } processedTuples.add(tupleCopy); } return new DelegatingTupleList( tuplesForAggregation.getArity(), new ArrayList>( processedTuples)); } private static Set nonJoiningDimensions( RolapCube baseCube, TupleList tuplesForAggregation) { List tuple = tuplesForAggregation.get(0); return baseCube.nonJoiningDimensions( tuple.toArray(new Member[tuple.size()])); } } // End AbstractAggregateFunDef.java mondrian-3.11.0.1-R/src/main/mondrian/olap/fun/AddCalculatedMembersFunDef.java000066400000000000000000000101411261646570300267350ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.olap.fun; import mondrian.calc.*; import mondrian.calc.impl.AbstractListCalc; import mondrian.calc.impl.UnaryTupleList; import mondrian.mdx.ResolvedFunCall; import mondrian.olap.*; import mondrian.olap.type.*; import java.util.*; /** * Definition of the AddCalculatedMembers MDX function. * *

AddCalculatedMembers adds calculated members that are siblings * of the members in the set. The set is limited to one dimension. * *

Syntax: * *

AddCalculatedMembers(<Set>)
* @author jhyde * @since Mar 23, 2006 */ class AddCalculatedMembersFunDef extends FunDefBase { private static final AddCalculatedMembersFunDef instance = new AddCalculatedMembersFunDef(); public static final Resolver resolver = new ResolverImpl(); private static final String FLAG = "fxx"; private AddCalculatedMembersFunDef() { super( "AddCalculatedMembers", "Adds calculated members to a set.", FLAG); } public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) { final ListCalc listCalc = compiler.compileList(call.getArg(0)); return new AbstractListCalc(call, new Calc[] {listCalc}) { public TupleList evaluateList(Evaluator evaluator) { final TupleList list = listCalc.evaluateList(evaluator); return new UnaryTupleList( addCalculatedMembers(list.slice(0), evaluator)); } }; } private List addCalculatedMembers( List memberList, Evaluator evaluator) { // Determine unique levels in the set final Set levels = new LinkedHashSet(); Hierarchy hierarchy = null; for (Member member : memberList) { if (hierarchy == null) { hierarchy = member.getHierarchy(); } else if (hierarchy != member.getHierarchy()) { throw newEvalException( this, "Only members from the same hierarchy are allowed in the " + "AddCalculatedMembers set: " + hierarchy + " vs " + member.getHierarchy()); } levels.add(member.getLevel()); } // For each level, add the calculated members from both // the schema and the query List workingList = new ArrayList(memberList); final SchemaReader schemaReader = evaluator.getQuery().getSchemaReader(true); for (Level level : levels) { List calcMemberList = schemaReader.getCalculatedMembers(level); workingList.addAll(calcMemberList); } return workingList; } private static class ResolverImpl extends MultiResolver { public ResolverImpl() { super( instance.getName(), instance.getSignature(), instance.getDescription(), new String[] {FLAG}); } protected FunDef createFunDef(Exp[] args, FunDef dummyFunDef) { if (args.length == 1) { Exp arg = args[0]; final Type type1 = arg.getType(); if (type1 instanceof SetType) { SetType type = (SetType) type1; if (type.getElementType() instanceof MemberType) { return instance; } else { throw newEvalException( instance, "Only single dimension members allowed in set for AddCalculatedMembers"); } } } return null; } } } // End AddCalculatedMembersFunDef.java mondrian-3.11.0.1-R/src/main/mondrian/olap/fun/AggregateFunDef.java000066400000000000000000000526721261646570300246550ustar00rootroot00000000000000/* // This software is subject to the terms of the Eclipse Public License v1.0 // Agreement, available at the following URL: // http://www.eclipse.org/legal/epl-v10.html. // You must accept the terms of that agreement to use this software. // // Copyright (c) 2002-2015 Pentaho Corporation.. All rights reserved. */ package mondrian.olap.fun; import mondrian.calc.*; import mondrian.calc.impl.*; import mondrian.mdx.MemberExpr; import mondrian.mdx.ResolvedFunCall; import mondrian.olap.*; import mondrian.olap.Role.RollupPolicy; import mondrian.rolap.RolapAggregator; import mondrian.rolap.RolapEvaluator; import org.apache.log4j.Logger; import org.eigenbase.util.property.IntegerProperty; import java.util.*; /** * Definition of the AGGREGATE MDX function. * * @author jhyde * @since 2005/8/14 */ public class AggregateFunDef extends AbstractAggregateFunDef { private static final String TIMING_NAME = AggregateFunDef.class.getSimpleName(); private static final Logger LOGGER = Logger.getLogger(AggregateFunDef.class); static final ReflectiveMultiResolver resolver = new ReflectiveMultiResolver( "Aggregate", "Aggregate([, ])", "Returns a calculated value using the appropriate aggregate function, based on the context of the query.", new String[]{"fnx", "fnxn"}, AggregateFunDef.class); /** * Creates an AggregateFunDef. * * @param dummyFunDef Dummy function */ public AggregateFunDef(FunDef dummyFunDef) { super(dummyFunDef); } private Member getMember(Exp exp) { if (exp instanceof MemberExpr) { Member m = ((MemberExpr)exp).getMember(); if (m.isMeasure() && !m.isCalculated()) { return m; } } // Since the expression is not a base measure, we won't // attempt to determine the aggregator and will simply sum. LOGGER.warn( "Unable to determine aggregator for non-base measures " + "in 2nd parameter of Aggregate(), summing: " + exp.toString()); return null; } public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) { final ListCalc listCalc = compiler.compileList(call.getArg(0)); final Calc calc = call.getArgCount() > 1 ? compiler.compileScalar(call.getArg(1), true) : new ValueCalc(call); final Member member = call.getArgCount() > 1 ? getMember(call.getArg(1)) : null; return new AggregateCalc(call, listCalc, calc, member); } public static class AggregateCalc extends GenericCalc { private final ListCalc listCalc; private final Calc calc; private final Member member; public AggregateCalc( Exp exp, ListCalc listCalc, Calc calc, Member member) { super(exp, new Calc[]{listCalc, calc}); this.listCalc = listCalc; this.calc = calc; this.member = member; } public AggregateCalc(Exp exp, ListCalc listCalc, Calc calc) { this(exp, listCalc, calc, null); } public Object evaluate(Evaluator evaluator) { evaluator.getTiming().markStart(TIMING_NAME); final int savepoint = evaluator.savepoint(); try { TupleList list = evaluateCurrentList(listCalc, evaluator); if (member != null) { evaluator.setContext(member); } return aggregate(calc, evaluator, list); } finally { evaluator.restore(savepoint); evaluator.getTiming().markEnd(TIMING_NAME); } } /** * Computes an expression for each element of a list, and aggregates * the result according to the evaluation context's current aggregation * strategy. * * @param calc Compiled expression to evaluate a scalar * @param evaluator Evaluation context * @param tupleList List of members or tuples * @return Aggregated result */ public static Object aggregate( Calc calc, Evaluator evaluator, TupleList tupleList) { Aggregator aggregator = (Aggregator) evaluator.getProperty( Property.AGGREGATION_TYPE.name, null); if (aggregator == null) { throw newEvalException( null, "Could not find an aggregator in the current evaluation context"); } Aggregator rollup = aggregator.getRollup(); if (rollup == null) { throw newEvalException( null, "Don't know how to rollup aggregator '" + aggregator + "'"); } if (aggregator != RolapAggregator.DistinctCount && aggregator != RolapAggregator.Avg) { final int savepoint = evaluator.savepoint(); try { evaluator.setNonEmpty(false); final Object o = rollup.aggregate( evaluator, tupleList, calc); return o; } finally { evaluator.restore(savepoint); } } // All that follows is logic for distinct count. It's not like the // other aggregators. if (tupleList.size() == 0) { return DoubleNull; } // Optimize the list // E.g. // List consists of: // (Gender.[All Gender], [Product].[All Products]), // (Gender.[F], [Product].[Drink]), // (Gender.[M], [Product].[Food]) // Can be optimized to: // (Gender.[All Gender], [Product].[All Products]) // // Similar optimization can also be done for list of members. boolean unlimitedIn = false; if (evaluator instanceof RolapEvaluator) { unlimitedIn = ((RolapEvaluator) evaluator).getDialect() .supportsUnlimitedValueList(); } boolean tupleSizeWithinInListSize = tupleList.size() <= MondrianProperties.instance().MaxConstraints.get(); if (unlimitedIn || tupleSizeWithinInListSize) { // If the DBMS does not have an upper limit on IN list // predicate size, then don't attempt any list // optimization, since the current algorithm is // very slow. May want to revisit this if someone // improves the algorithm. } else { tupleList = optimizeTupleList(evaluator, tupleList, true); } // Can't aggregate distinct-count values in the same way // which is used for other types of aggregations. To evaluate a // distinct-count across multiple members, we need to gather // the members together, then evaluate the collection of // members all at once. To do this, we postpone evaluation, // and create a lambda function containing the members. Evaluator evaluator2 = evaluator.pushAggregation(tupleList); // cancel nonEmpty context evaluator2.setNonEmpty(false); return evaluator2.evaluateCurrent(); } /** * Analyzes a list of tuples and determines if the list can * be safely optimized. If a member of the tuple list is on * a hierarchy for which a rollup policy of PARTIAL is set, * it is not safe to optimize that list. */ private static boolean canOptimize( Evaluator evaluator, TupleList tupleList) { // If members of this hierarchy are controlled by a role which // enforces a rollup policy of partial, we cannot safely // optimize the tuples list as it might end up rolling up to // the parent while not all children are actually accessible. if (tupleList.size() > 0) { for (Member member : tupleList.get(0)) { final RollupPolicy policy = evaluator.getSchemaReader().getRole() .getAccessDetails(member.getHierarchy()) .getRollupPolicy(); if (policy == RollupPolicy.PARTIAL) { return false; } } } return true; } public static TupleList optimizeTupleList( Evaluator evaluator, TupleList tupleList, boolean checkSize) { if (!canOptimize(evaluator, tupleList)) { return tupleList; } // FIXME: We remove overlapping tuple entries only to pass // AggregationOnDistinctCountMeasuresTest // .testOptimizeListWithTuplesOfLength3 on Access. Without // the optimization, we generate a statement 7000 // characters long and Access gives "Query is too complex". // The optimization is expensive, so we only want to do it // if the DBMS can't execute the query otherwise. if (false) { tupleList = removeOverlappingTupleEntries(tupleList); } tupleList = optimizeChildren( tupleList, evaluator.getSchemaReader(), evaluator.getMeasureCube()); if (checkSize) { checkIfAggregationSizeIsTooLarge(tupleList); } return tupleList; } /** * In case of distinct count aggregation if a tuple which is a super * set of other tuples in the set exists then the child tuples can be * ignored. * *

For example. A list consisting of: * (Gender.[All Gender], [Product].[All Products]), * (Gender.[F], [Product].[Drink]), * (Gender.[M], [Product].[Food]) * Can be optimized to: * (Gender.[All Gender], [Product].[All Products]) * * @param list List of tuples */ public static TupleList removeOverlappingTupleEntries( TupleList list) { TupleList trimmedList = list.cloneList(list.size()); Member[] tuple1 = new Member[list.getArity()]; Member[] tuple2 = new Member[list.getArity()]; final TupleCursor cursor1 = list.tupleCursor(); while (cursor1.forward()) { cursor1.currentToArray(tuple1, 0); if (trimmedList.isEmpty()) { trimmedList.addTuple(tuple1); } else { boolean ignore = false; final TupleIterator iterator = trimmedList.tupleIterator(); while (iterator.forward()) { iterator.currentToArray(tuple2, 0); if (isSuperSet(tuple1, tuple2)) { iterator.remove(); } else if (isSuperSet(tuple2, tuple1) || isEqual(tuple1, tuple2)) { ignore = true; break; } } if (!ignore) { trimmedList.addTuple(tuple1); } } } return trimmedList; } /** * Returns whether tuple1 is a superset of tuple2. * * @param tuple1 First tuple * @param tuple2 Second tuple * @return boolean Whether tuple1 is a superset of tuple2 */ public static boolean isSuperSet(Member[] tuple1, Member[] tuple2) { int parentLevelCount = 0; for (int i = 0; i < tuple1.length; i++) { Member member1 = tuple1[i]; Member member2 = tuple2[i]; if (!member2.isChildOrEqualTo(member1)) { return false; } if (member1.getLevel().getDepth() < member2.getLevel().getDepth()) { parentLevelCount++; } } return parentLevelCount > 0; } private static void checkIfAggregationSizeIsTooLarge(List list) { final IntegerProperty property = MondrianProperties.instance().MaxConstraints; final int maxConstraints = property.get(); if (list.size() > maxConstraints) { throw newEvalException( null, "Aggregation is not supported over a list" + " with more than " + maxConstraints + " predicates" + " (see property " + property.getPath() + ")"); } } public boolean dependsOn(Hierarchy hierarchy) { if (hierarchy.getDimension().isMeasures()) { return true; } return anyDependsButFirst(getCalcs(), hierarchy); } /** * In distinct Count aggregation, if tuple list is a result * m.children * n.children then it can be optimized to m * n * *

* E.g. * List consist of: * (Gender.[F], [Store].[USA]), * (Gender.[F], [Store].[USA].[OR]), * (Gender.[F], [Store].[USA].[CA]), * (Gender.[F], [Store].[USA].[WA]), * (Gender.[F], [Store].[CANADA]) * (Gender.[M], [Store].[USA]), * (Gender.[M], [Store].[USA].[OR]), * (Gender.[M], [Store].[USA].[CA]), * (Gender.[M], [Store].[USA].[WA]), * (Gender.[M], [Store].[CANADA]) * Can be optimized to: * (Gender.[All Gender], [Store].[USA]) * (Gender.[All Gender], [Store].[CANADA]) * * * @param tuples Tuples * @param reader Schema reader * @param baseCubeForMeasure Cube * @return xxxx */ public static TupleList optimizeChildren( TupleList tuples, SchemaReader reader, Cube baseCubeForMeasure) { Map[] membersOccurencesInTuple = membersVersusOccurencesInTuple(tuples); int tupleLength = tuples.getArity(); //noinspection unchecked Set[] sets = new Set[tupleLength]; boolean optimized = false; for (int i = 0; i < tupleLength; i++) { if (areOccurencesEqual(membersOccurencesInTuple[i].values())) { Set members = membersOccurencesInTuple[i].keySet(); int originalSize = members.size(); sets[i] = optimizeMemberSet( new LinkedHashSet(members), reader, baseCubeForMeasure); if (sets[i].size() != originalSize) { optimized = true; } } else { sets[i] = new LinkedHashSet( membersOccurencesInTuple[i].keySet()); } } if (optimized) { return crossProd(sets); } return tuples; } /** * Finds member occurrences in tuple and generates a map of Members * versus their occurrences in tuples. * * @param tupleList List of tuples * @return Map of the number of occurrences of each member in a tuple */ public static Map[] membersVersusOccurencesInTuple( TupleList tupleList) { int tupleLength = tupleList.getArity(); //noinspection unchecked Map[] counters = new Map[tupleLength]; for (int i = 0; i < counters.length; i++) { counters[i] = new LinkedHashMap(); } for (List tuple : tupleList) { for (int i = 0; i < tuple.size(); i++) { Member member = tuple.get(i); Map map = counters[i]; if (map.containsKey(member)) { Integer count = map.get(member); map.put(member, ++count); } else { map.put(member, 1); } } } return counters; } private static Set optimizeMemberSet( Set members, SchemaReader reader, Cube baseCubeForMeasure) { boolean didOptimize; Set membersToBeOptimized = new LinkedHashSet(); Set optimizedMembers = new LinkedHashSet(); while (members.size() > 0) { Iterator iterator = members.iterator(); Member first = iterator.next(); if (first.isAll()) { optimizedMembers.clear(); optimizedMembers.add(first); return optimizedMembers; } membersToBeOptimized.add(first); iterator.remove(); Member firstParentMember = first.getParentMember(); while (iterator.hasNext()) { Member current = iterator.next(); if (current.isAll()) { optimizedMembers.clear(); optimizedMembers.add(current); return optimizedMembers; } Member currentParentMember = current.getParentMember(); if (firstParentMember == null && currentParentMember == null || (firstParentMember != null && firstParentMember.equals(currentParentMember))) { membersToBeOptimized.add(current); iterator.remove(); } } int childCountOfParent = -1; if (firstParentMember != null) { childCountOfParent = getChildCount(firstParentMember, reader); } if (childCountOfParent != -1 && membersToBeOptimized.size() == childCountOfParent && canOptimize(firstParentMember, baseCubeForMeasure)) { optimizedMembers.add(firstParentMember); didOptimize = true; } else { optimizedMembers.addAll(membersToBeOptimized); didOptimize = false; } membersToBeOptimized.clear(); if (members.size() == 0 && didOptimize) { Set temp = members; members = optimizedMembers; optimizedMembers = temp; } } return optimizedMembers; } /** * Returns whether tuples are equal. They must have the same length. * * @param tuple1 First tuple * @param tuple2 Second tuple * @return whether tuples are equal */ private static boolean isEqual(Member[] tuple1, Member[] tuple2) { for (int i = 0; i < tuple1.length; i++) { if (!tuple1[i].getUniqueName().equals( tuple2[i].getUniqueName())) { return false; } } return true; } private static boolean canOptimize( Member parentMember, Cube baseCube) { return dimensionJoinsToBaseCube( parentMember.getDimension(), baseCube) || !parentMember.isAll(); } private static TupleList crossProd(Set[] sets) { final List tupleLists = new ArrayList(); for (Set set : sets) { tupleLists.add( new UnaryTupleList( new ArrayList(set))); } if (tupleLists.size() == 1) { return tupleLists.get(0); } return CrossJoinFunDef.mutableCrossJoin(tupleLists); } private static boolean dimensionJoinsToBaseCube( Dimension dimension, Cube baseCube) { HashSet dimensions = new HashSet(); dimensions.add(dimension); return baseCube.nonJoiningDimensions(dimensions).size() == 0; } private static int getChildCount( Member parentMember, SchemaReader reader) { int childrenCountFromCache = reader.getChildrenCountFromCache(parentMember); if (childrenCountFromCache != -1) { return childrenCountFromCache; } return reader.getMemberChildren(parentMember).size(); } } } // End AggregateFunDef.java mondrian-3.11.0.1-R/src/main/mondrian/olap/fun/AncestorFunDef.java000066400000000000000000000050531261646570300245340ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.olap.fun; import mondrian.calc.*; import mondrian.calc.impl.AbstractMemberCalc; import mondrian.mdx.ResolvedFunCall; import mondrian.olap.*; import mondrian.olap.type.LevelType; import mondrian.olap.type.Type; /** * Definition of the Ancestor MDX function. * * @author jhyde * @since Mar 23, 2006 */ class AncestorFunDef extends FunDefBase { static final ReflectiveMultiResolver Resolver = new ReflectiveMultiResolver( "Ancestor", "Ancestor(, {|})", "Returns the ancestor of a member at a specified level.", new String[] {"fmml", "fmmn"}, AncestorFunDef.class); public AncestorFunDef(FunDef dummyFunDef) { super(dummyFunDef); } public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) { final MemberCalc memberCalc = compiler.compileMember(call.getArg(0)); final Type type1 = call.getArg(1).getType(); if (type1 instanceof LevelType) { final LevelCalc levelCalc = compiler.compileLevel(call.getArg(1)); return new AbstractMemberCalc( call, new Calc[] {memberCalc, levelCalc}) { public Member evaluateMember(Evaluator evaluator) { Level level = levelCalc.evaluateLevel(evaluator); Member member = memberCalc.evaluateMember(evaluator); int distance = member.getLevel().getDepth() - level.getDepth(); return ancestor(evaluator, member, distance, level); } }; } else { final IntegerCalc distanceCalc = compiler.compileInteger(call.getArg(1)); return new AbstractMemberCalc( call, new Calc[] {memberCalc, distanceCalc}) { public Member evaluateMember(Evaluator evaluator) { int distance = distanceCalc.evaluateInteger(evaluator); Member member = memberCalc.evaluateMember(evaluator); return ancestor(evaluator, member, distance, null); } }; } } } // End AncestorFunDef.java mondrian-3.11.0.1-R/src/main/mondrian/olap/fun/AncestorsFunDef.java000066400000000000000000000064131261646570300247200ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.olap.fun; import mondrian.calc.*; import mondrian.calc.impl.AbstractListCalc; import mondrian.mdx.ResolvedFunCall; import mondrian.olap.*; import mondrian.olap.type.LevelType; import mondrian.olap.type.Type; import java.util.ArrayList; import java.util.List; /** * Definition of the Ancestors MDX function. * * @author lboudreau * @since Nov 27 2012 */ class AncestorsFunDef extends FunDefBase { static final ReflectiveMultiResolver Resolver = new ReflectiveMultiResolver( "Ancestors", "Ancestors(, {|})", "Returns the set of all ancestors of a specified member at a specified level or at a specified distance from the member", new String[] {"fxml", "fxmn"}, AncestorsFunDef.class); public AncestorsFunDef(FunDef dummyFunDef) { super(dummyFunDef); } public int getReturnCategory() { return Category.Set; } public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) { final MemberCalc memberCalc = compiler.compileMember(call.getArg(0)); final Type type1 = call.getArg(1).getType(); if (type1 instanceof LevelType) { final LevelCalc levelCalc = compiler.compileLevel(call.getArg(1)); return new AbstractListCalc( call, new Calc[] {memberCalc, levelCalc}) { public TupleList evaluateList(Evaluator evaluator) { Level level = levelCalc.evaluateLevel(evaluator); Member member = memberCalc.evaluateMember(evaluator); int distance = member.getDepth() - level.getDepth(); List ancestors = new ArrayList(); for (int curDist = 1; curDist <= distance; curDist++) { ancestors.add( ancestor(evaluator, member, curDist, null)); } return TupleCollections.asTupleList(ancestors); } }; } else { final IntegerCalc distanceCalc = compiler.compileInteger(call.getArg(1)); return new AbstractListCalc( call, new Calc[] {memberCalc, distanceCalc}) { public TupleList evaluateList(Evaluator evaluator) { Member member = memberCalc.evaluateMember(evaluator); int distance = distanceCalc.evaluateInteger(evaluator); List ancestors = new ArrayList(); for (int curDist = 1; curDist <= distance; curDist++) { ancestors.add( ancestor(evaluator, member, curDist, null)); } return TupleCollections.asTupleList(ancestors); } }; } } } // End AncestorsFunDef.java mondrian-3.11.0.1-R/src/main/mondrian/olap/fun/AsFunDef.java000066400000000000000000000064071261646570300233250ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.olap.fun; import mondrian.calc.*; import mondrian.calc.impl.AbstractIterCalc; import mondrian.mdx.NamedSetExpr; import mondrian.mdx.ResolvedFunCall; import mondrian.olap.*; import java.util.List; /** * Definition of the AS MDX operator. * *

Using AS, you can define an alias for an MDX expression * anywhere it appears in a query, and use that alias as you would a calculated * yet. * * @author jhyde * @since Oct 7, 2009 */ class AsFunDef extends FunDefBase { public static final Resolver RESOLVER = new ResolverImpl(); private final Query.ScopedNamedSet scopedNamedSet; /** * Creates an AsFunDef. * * @param scopedNamedSet Named set definition */ private AsFunDef(Query.ScopedNamedSet scopedNamedSet) { super( "AS", " AS ", "Assigns an alias to an expression", "ixxn"); this.scopedNamedSet = scopedNamedSet; } public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) { // Argument 0, the definition of the set, has been resolved since the // scoped named set was created. Implicit conversions, like converting // a member to a set, have been performed. Use the new expression. scopedNamedSet.setExp(call.getArg(0)); return new AbstractIterCalc(call, new Calc[0]) { public TupleIterable evaluateIterable( Evaluator evaluator) { final Evaluator.NamedSetEvaluator namedSetEvaluator = evaluator.getNamedSetEvaluator(scopedNamedSet, false); return namedSetEvaluator.evaluateTupleIterable(evaluator); } }; } private static class ResolverImpl extends ResolverBase { public ResolverImpl() { super("AS", null, null, Syntax.Infix); } public FunDef resolve( Exp[] args, Validator validator, List conversions) { final Exp exp = args[0]; if (!validator.canConvert( 0, args[0], Category.Set, conversions)) { return null; } // By the time resolve is called, the id argument has already been // resolved... to a named set, namely itself. That's not pretty. // We'd rather it stayed as an id, and we'd rather that a named set // was not visible in the scope that defines it. But we can work // with this. final String name = ((NamedSetExpr) args[1]).getNamedSet().getName(); final Query.ScopedNamedSet scopedNamedSet = (Query.ScopedNamedSet) ((NamedSetExpr) args[1]).getNamedSet(); // validator.getQuery().createScopedNamedSet( // name, (QueryPart) exp, exp); return new AsFunDef(scopedNamedSet); } } } // End AsFunDef.java mondrian-3.11.0.1-R/src/main/mondrian/olap/fun/AvgFunDef.java000066400000000000000000000041361261646570300234740ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.olap.fun; import mondrian.calc.*; import mondrian.calc.impl.AbstractDoubleCalc; import mondrian.calc.impl.ValueCalc; import mondrian.mdx.ResolvedFunCall; import mondrian.olap.*; /** * Definition of the Avg MDX function. * * @author jhyde * @since Mar 23, 2006 */ class AvgFunDef extends AbstractAggregateFunDef { static final ReflectiveMultiResolver Resolver = new ReflectiveMultiResolver( "Avg", "Avg([, ])", "Returns the average value of a numeric expression evaluated over a set.", new String[]{"fnx", "fnxn"}, AvgFunDef.class); public AvgFunDef(FunDef dummyFunDef) { super(dummyFunDef); } public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) { final ListCalc listCalc = compiler.compileList(call.getArg(0)); final Calc calc = call.getArgCount() > 1 ? compiler.compileScalar(call.getArg(1), true) : new ValueCalc(call); return new AbstractDoubleCalc(call, new Calc[]{listCalc, calc}) { public double evaluateDouble(Evaluator evaluator) { TupleList memberList = evaluateCurrentList(listCalc, evaluator); final int savepoint = evaluator.savepoint(); evaluator.setNonEmpty(false); try { final double avg = (Double) avg( evaluator, memberList, calc); return avg; } finally { evaluator.restore(savepoint); } } public boolean dependsOn(Hierarchy hierarchy) { return anyDependsButFirst(getCalcs(), hierarchy); } }; } } // End AvgFunDef.java mondrian-3.11.0.1-R/src/main/mondrian/olap/fun/BuiltinFunTable.java000066400000000000000000002406431261646570300247230ustar00rootroot00000000000000/* // This software is subject to the terms of the Eclipse Public License v1.0 // Agreement, available at the following URL: // http://www.eclipse.org/legal/epl-v10.html. // You must accept the terms of that agreement to use this software. // // Copyright (C) 2002-2005 Julian Hyde // Copyright (C) 2005-2011 Pentaho and others // All Rights Reserved. */ package mondrian.olap.fun; import mondrian.calc.*; import mondrian.calc.impl.*; import mondrian.mdx.ResolvedFunCall; import mondrian.olap.*; import mondrian.olap.fun.extra.CalculatedChildFunDef; import mondrian.olap.fun.extra.NthQuartileFunDef; import mondrian.olap.fun.vba.Excel; import mondrian.olap.fun.vba.Vba; import mondrian.olap.type.LevelType; import mondrian.olap.type.Type; import java.io.PrintWriter; import java.util.*; /** * BuiltinFunTable contains a list of all built-in MDX functions. * *

Note: Boolean expressions return {@link Boolean#TRUE}, * {@link Boolean#FALSE} or null. null is returned if the expression can not be * evaluated because some values have not been loaded from database yet.

* * @author jhyde * @since 26 February, 2002 */ public class BuiltinFunTable extends FunTableImpl { /** the singleton */ private static BuiltinFunTable instance; /** * Creates a function table containing all of the builtin MDX functions. * This method should only be called from {@link BuiltinFunTable#instance}. */ protected BuiltinFunTable() { super(); } public void defineFunctions(Builder builder) { builder.defineReserved("NULL"); // Empty expression builder.define( new FunDefBase( "", "", "Dummy function representing the empty expression", Syntax.Empty, Category.Empty, new int[0]) { } ); // first char: p=Property, m=Method, i=Infix, P=Prefix // 2nd: // ARRAY FUNCTIONS // "SetToArray([, ]...[, ])" if (false) builder.define(new FunDefBase( "SetToArray", "SetToArray([, ]...[, ])", "Converts one or more sets to an array for use in a user-defined function.", "fa*") { public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) { throw new UnsupportedOperationException(); } }); // // DIMENSION FUNCTIONS builder.define(HierarchyDimensionFunDef.instance); // ".Dimension" builder.define(DimensionDimensionFunDef.INSTANCE); // ".Dimension" builder.define(LevelDimensionFunDef.INSTANCE); // ".Dimension" builder.define(MemberDimensionFunDef.INSTANCE); // "Dimensions()" builder.define(DimensionsNumericFunDef.INSTANCE); // "Dimensions()" builder.define(DimensionsStringFunDef.INSTANCE); // // HIERARCHY FUNCTIONS builder.define(LevelHierarchyFunDef.instance); builder.define(MemberHierarchyFunDef.instance); // // LEVEL FUNCTIONS builder.define(MemberLevelFunDef.instance); // ".Levels()" builder.define( new FunDefBase( "Levels", "Returns the level whose position in a hierarchy is specified by a numeric expression.", "mlhn") { public Type getResultType(Validator validator, Exp[] args) { final Type argType = args[0].getType(); return LevelType.forType(argType); } public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) { final HierarchyCalc hierarchyCalc = compiler.compileHierarchy(call.getArg(0)); final IntegerCalc ordinalCalc = compiler.compileInteger(call.getArg(1)); return new AbstractLevelCalc( call, new Calc[] {hierarchyCalc, ordinalCalc}) { public Level evaluateLevel(Evaluator evaluator) { Hierarchy hierarchy = hierarchyCalc.evaluateHierarchy(evaluator); int ordinal = ordinalCalc.evaluateInteger(evaluator); return nthLevel(hierarchy, ordinal); } }; } Level nthLevel(Hierarchy hierarchy, int n) { Level[] levels = hierarchy.getLevels(); if (n >= levels.length || n < 0) { throw newEvalException( this, "Index '" + n + "' out of bounds"); } return levels[n]; } }); // ".Levels()" builder.define( new FunDefBase( "Levels", "Returns the level whose name is specified by a string expression.", "mlhS") { public Type getResultType(Validator validator, Exp[] args) { final Type argType = args[0].getType(); return LevelType.forType(argType); } public Calc compileCall( final ResolvedFunCall call, ExpCompiler compiler) { final HierarchyCalc hierarchyCalc = compiler.compileHierarchy(call.getArg(0)); final StringCalc nameCalc = compiler.compileString(call.getArg(1)); return new AbstractLevelCalc( call, new Calc[] {hierarchyCalc, nameCalc}) { public Level evaluateLevel(Evaluator evaluator) { Hierarchy hierarchy = hierarchyCalc.evaluateHierarchy(evaluator); String name = nameCalc.evaluateString(evaluator); for (Level level : hierarchy.getLevels()) { if (level.getName().equals(name)) { return level; } } throw newEvalException( call.getFunDef(), "Level '" + name + "' not found in hierarchy '" + hierarchy + "'"); } }; } }); // "Levels()" builder.define( new FunDefBase( "Levels", "Returns the level whose name is specified by a string expression.", "flS") { public Type getResultType(Validator validator, Exp[] args) { final Type argType = args[0].getType(); return LevelType.forType(argType); } public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) { final StringCalc stringCalc = compiler.compileString(call.getArg(0)); return new AbstractLevelCalc(call, new Calc[] {stringCalc}) { public Level evaluateLevel(Evaluator evaluator) { String levelName = stringCalc.evaluateString(evaluator); return findLevel(evaluator, levelName); } }; } Level findLevel(Evaluator evaluator, String s) { Cube cube = evaluator.getCube(); OlapElement o = (s.startsWith("[")) ? evaluator.getSchemaReader().lookupCompound( cube, parseIdentifier(s), false, Category.Level) // lookupCompound barfs if "s" doesn't have matching // brackets, so don't even try : null; if (o instanceof Level) { return (Level) o; } else if (o == null) { throw newEvalException(this, "Level '" + s + "' not found"); } else { throw newEvalException( this, "Levels('" + s + "') found " + o); } } }); // // LOGICAL FUNCTIONS builder.define(IsEmptyFunDef.FunctionResolver); builder.define(IsEmptyFunDef.PostfixResolver); builder.define(IsNullFunDef.Resolver); builder.define(IsFunDef.Resolver); builder.define(AsFunDef.RESOLVER); // // MEMBER FUNCTIONS builder.define(AncestorFunDef.Resolver); builder.define(AncestorsFunDef.Resolver); builder.define( new FunDefBase( "Cousin", " Cousin(, )", "Returns the member with the same relative position under as the member specified.", "fmmm") { public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) { final MemberCalc memberCalc = compiler.compileMember(call.getArg(0)); final MemberCalc ancestorMemberCalc = compiler.compileMember(call.getArg(1)); return new AbstractMemberCalc( call, new Calc[] {memberCalc, ancestorMemberCalc}) { public Member evaluateMember(Evaluator evaluator) { Member member = memberCalc.evaluateMember(evaluator); Member ancestorMember = ancestorMemberCalc.evaluateMember(evaluator); return cousin( evaluator.getSchemaReader(), member, ancestorMember); } }; } }); builder.define(HierarchyCurrentMemberFunDef.instance); builder.define(NamedSetCurrentFunDef.instance); builder.define(NamedSetCurrentOrdinalFunDef.instance); // ".DataMember" builder.define( new FunDefBase( "DataMember", "Returns the system-generated data member that is associated with a nonleaf member of a dimension.", "pmm") { public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) { final MemberCalc memberCalc = compiler.compileMember(call.getArg(0)); return new AbstractMemberCalc(call, new Calc[] {memberCalc}) { public Member evaluateMember(Evaluator evaluator) { Member member = memberCalc.evaluateMember(evaluator); return member.getDataMember(); } }; } }); // ".DefaultMember". The function is implemented using an // implicit cast to hierarchy, and we create a FunInfo for // documentation & backwards compatibility. builder.define( new FunInfo( "DefaultMember", "Returns the default member of a dimension.", "pmd")); // ".DefaultMember" builder.define( new FunDefBase( "DefaultMember", "Returns the default member of a hierarchy.", "pmh") { public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) { final HierarchyCalc hierarchyCalc = compiler.compileHierarchy(call.getArg(0)); return new AbstractMemberCalc( call, new Calc[] {hierarchyCalc}) { public Member evaluateMember(Evaluator evaluator) { Hierarchy hierarchy = hierarchyCalc.evaluateHierarchy(evaluator); return evaluator.getSchemaReader() .getHierarchyDefaultMember(hierarchy); } }; } }); // ".FirstChild" builder.define( new FunDefBase( "FirstChild", "Returns the first child of a member.", "pmm") { public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) { final MemberCalc memberCalc = compiler.compileMember(call.getArg(0)); return new AbstractMemberCalc(call, new Calc[] {memberCalc}) { public Member evaluateMember(Evaluator evaluator) { Member member = memberCalc.evaluateMember(evaluator); return firstChild(evaluator, member); } }; } Member firstChild(Evaluator evaluator, Member member) { List children = evaluator.getSchemaReader() .getMemberChildren(member); return (children.size() == 0) ? member.getHierarchy().getNullMember() : children.get(0); } }); // .FirstSibling builder.define( new FunDefBase( "FirstSibling", "Returns the first child of the parent of a member.", "pmm") { public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) { final MemberCalc memberCalc = compiler.compileMember(call.getArg(0)); return new AbstractMemberCalc(call, new Calc[] {memberCalc}) { public Member evaluateMember(Evaluator evaluator) { Member member = memberCalc.evaluateMember(evaluator); return firstSibling(member, evaluator); } }; } Member firstSibling(Member member, Evaluator evaluator) { Member parent = member.getParentMember(); List children; final SchemaReader schemaReader = evaluator.getSchemaReader(); if (parent == null) { if (member.isNull()) { return member; } children = schemaReader.getHierarchyRootMembers( member.getHierarchy()); } else { children = schemaReader.getMemberChildren(parent); } return children.get(0); } }); builder.define(LeadLagFunDef.LagResolver); // .LastChild builder.define( new FunDefBase( "LastChild", "Returns the last child of a member.", "pmm") { public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) { final MemberCalc memberCalc = compiler.compileMember(call.getArg(0)); return new AbstractMemberCalc(call, new Calc[] {memberCalc}) { public Member evaluateMember(Evaluator evaluator) { Member member = memberCalc.evaluateMember(evaluator); return lastChild(evaluator, member); } }; } Member lastChild(Evaluator evaluator, Member member) { List children = evaluator.getSchemaReader().getMemberChildren(member); return (children.size() == 0) ? member.getHierarchy().getNullMember() : children.get(children.size() - 1); } }); // .LastSibling builder.define( new FunDefBase( "LastSibling", "Returns the last child of the parent of a member.", "pmm") { public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) { final MemberCalc memberCalc = compiler.compileMember(call.getArg(0)); return new AbstractMemberCalc(call, new Calc[] {memberCalc}) { public Member evaluateMember(Evaluator evaluator) { Member member = memberCalc.evaluateMember(evaluator); return firstSibling(member, evaluator); } }; } Member firstSibling(Member member, Evaluator evaluator) { Member parent = member.getParentMember(); List children; final SchemaReader schemaReader = evaluator.getSchemaReader(); if (parent == null) { if (member.isNull()) { return member; } children = schemaReader.getHierarchyRootMembers( member.getHierarchy()); } else { children = schemaReader.getMemberChildren(parent); } return children.get(children.size() - 1); } }); builder.define(LeadLagFunDef.LeadResolver); // Members() builder.define( new FunDefBase( "Members", "Returns the member whose name is specified by a string expression.", "fmS") { public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) { throw new UnsupportedOperationException(); } }); // .NextMember builder.define( new FunDefBase( "NextMember", "Returns the next member in the level that contains a specified member.", "pmm") { public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) { final MemberCalc memberCalc = compiler.compileMember(call.getArg(0)); return new AbstractMemberCalc(call, new Calc[] {memberCalc}) { public Member evaluateMember(Evaluator evaluator) { Member member = memberCalc.evaluateMember(evaluator); return evaluator.getSchemaReader().getLeadMember( member, 1); } }; } }); builder.define(OpeningClosingPeriodFunDef.OpeningPeriodResolver); builder.define(OpeningClosingPeriodFunDef.ClosingPeriodResolver); builder.define(MemberOrderKeyFunDef.instance); builder.define(ParallelPeriodFunDef.Resolver); // .Parent builder.define( new FunDefBase( "Parent", "Returns the parent of a member.", "pmm") { public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) { final MemberCalc memberCalc = compiler.compileMember(call.getArg(0)); return new AbstractMemberCalc(call, new Calc[] {memberCalc}) { public Member evaluateMember(Evaluator evaluator) { Member member = memberCalc.evaluateMember(evaluator); return memberParent(evaluator, member); } }; } Member memberParent(Evaluator evaluator, Member member) { Member parent = evaluator.getSchemaReader().getMemberParent(member); if (parent == null) { parent = member.getHierarchy().getNullMember(); } return parent; } }); // .PrevMember builder.define( new FunDefBase( "PrevMember", "Returns the previous member in the level that contains a specified member.", "pmm") { public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) { final MemberCalc memberCalc = compiler.compileMember(call.getArg(0)); return new AbstractMemberCalc(call, new Calc[] {memberCalc}) { public Member evaluateMember(Evaluator evaluator) { Member member = memberCalc.evaluateMember(evaluator); return evaluator.getSchemaReader().getLeadMember( member, -1); } }; } }); builder.define(StrToMemberFunDef.INSTANCE); builder.define(ValidMeasureFunDef.instance); // // NUMERIC FUNCTIONS builder.define(AggregateFunDef.resolver); // Obsolete?? builder.define( new MultiResolver( "$AggregateChildren", "$AggregateChildren()", "Equivalent to 'Aggregate(.CurrentMember.Children); for internal use.", new String[] {"Inh"}) { protected FunDef createFunDef(Exp[] args, FunDef dummyFunDef) { return new FunDefBase(dummyFunDef) { public void unparse(Exp[] args, PrintWriter pw) { pw.print(getName()); pw.print("("); args[0].unparse(pw); pw.print(")"); } public Calc compileCall( ResolvedFunCall call, ExpCompiler compiler) { final HierarchyCalc hierarchyCalc = compiler.compileHierarchy(call.getArg(0)); final Calc valueCalc = new ValueCalc(call); return new GenericCalc(call) { public Object evaluate(Evaluator evaluator) { Hierarchy hierarchy = hierarchyCalc.evaluateHierarchy(evaluator); return aggregateChildren( evaluator, hierarchy, valueCalc); } public Calc[] getCalcs() { return new Calc[] {hierarchyCalc, valueCalc}; } }; } Object aggregateChildren( Evaluator evaluator, Hierarchy hierarchy, final Calc valueFunCall) { Member member = evaluator.getPreviousContext(hierarchy); List members = new ArrayList(); evaluator.getSchemaReader() .getParentChildContributingChildren( member.getDataMember(), hierarchy, members); Aggregator aggregator = (Aggregator) evaluator.getProperty( Property.AGGREGATION_TYPE.name, null); if (aggregator == null) { throw FunUtil.newEvalException( null, "Could not find an aggregator in the current " + "evaluation context"); } Aggregator rollup = aggregator.getRollup(); if (rollup == null) { throw FunUtil.newEvalException( null, "Don't know how to rollup aggregator '" + aggregator + "'"); } final int savepoint = evaluator.savepoint(); try { final Object o = rollup.aggregate( evaluator, new UnaryTupleList(members), valueFunCall); return o; } finally { evaluator.restore(savepoint); } } }; } }); builder.define(AvgFunDef.Resolver); builder.define(CorrelationFunDef.Resolver); builder.define(CountFunDef.Resolver); // .Count builder.define( new FunDefBase( "Count", "Returns the number of tuples in a set including empty cells.", "pnx") { public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) { final ListCalc listCalc = compiler.compileList(call.getArg(0)); return new AbstractIntegerCalc(call, new Calc[] {listCalc}) { public int evaluateInteger(Evaluator evaluator) { TupleList list = listCalc.evaluateList(evaluator); return count(evaluator, list, true); } }; } }); builder.define(CovarianceFunDef.CovarianceResolver); builder.define(CovarianceFunDef.CovarianceNResolver); builder.define(IifFunDef.STRING_INSTANCE); builder.define(IifFunDef.NUMERIC_INSTANCE); builder.define(IifFunDef.TUPLE_INSTANCE); builder.define(IifFunDef.BOOLEAN_INSTANCE); builder.define(IifFunDef.MEMBER_INSTANCE); builder.define(IifFunDef.LEVEL_INSTANCE); builder.define(IifFunDef.HIERARCHY_INSTANCE); builder.define(IifFunDef.DIMENSION_INSTANCE); builder.define(IifFunDef.SET_INSTANCE); builder.define(LinReg.InterceptResolver); builder.define(LinReg.PointResolver); builder.define(LinReg.R2Resolver); builder.define(LinReg.SlopeResolver); builder.define(LinReg.VarianceResolver); builder.define(MinMaxFunDef.MaxResolver); builder.define(MinMaxFunDef.MinResolver); builder.define(MedianFunDef.Resolver); builder.define(PercentileFunDef.Resolver); // .Ordinal builder.define( new FunDefBase( "Ordinal", "Returns the zero-based ordinal value associated with a level.", "pnl") { public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) { final LevelCalc levelCalc = compiler.compileLevel(call.getArg(0)); return new AbstractIntegerCalc(call, new Calc[] {levelCalc}) { public int evaluateInteger(Evaluator evaluator) { final Level level = levelCalc.evaluateLevel(evaluator); return level.getDepth(); } }; } }); builder.define(RankFunDef.Resolver); builder.define(CacheFunDef.Resolver); builder.define(StdevFunDef.StdevResolver); builder.define(StdevFunDef.StddevResolver); builder.define(StdevPFunDef.StdevpResolver); builder.define(StdevPFunDef.StddevpResolver); builder.define(SumFunDef.Resolver); // .Value builder.define( new FunDefBase( "Value", "Returns the value of a measure.", "pnm") { public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) { final MemberCalc memberCalc = compiler.compileMember(call.getArg(0)); return new GenericCalc(call) { public Object evaluate(Evaluator evaluator) { Member member = memberCalc.evaluateMember(evaluator); final int savepoint = evaluator.savepoint(); evaluator.setContext(member); try { Object value = evaluator.evaluateCurrent(); return value; } finally { evaluator.restore(savepoint); } } public boolean dependsOn(Hierarchy hierarchy) { if (super.dependsOn(hierarchy)) { return true; } if (memberCalc.getType().usesHierarchy( hierarchy, true)) { return false; } return true; } public Calc[] getCalcs() { return new Calc[] {memberCalc}; } }; } }); builder.define(VarFunDef.VarResolver); builder.define(VarFunDef.VarianceResolver); builder.define(VarPFunDef.VariancePResolver); builder.define(VarPFunDef.VarPResolver); // // SET FUNCTIONS builder.define(AddCalculatedMembersFunDef.resolver); // Ascendants() builder.define( new FunDefBase( "Ascendants", "Returns the set of the ascendants of a specified member.", "fxm") { public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) { final MemberCalc memberCalc = compiler.compileMember(call.getArg(0)); return new AbstractListCalc(call, new Calc[] {memberCalc}) { public TupleList evaluateList(Evaluator evaluator) { Member member = memberCalc.evaluateMember(evaluator); return new UnaryTupleList( ascendants(evaluator.getSchemaReader(), member)); } }; } List ascendants(SchemaReader schemaReader, Member member) { if (member.isNull()) { return Collections.emptyList(); } final List result = new ArrayList(); result.add(member); schemaReader.getMemberAncestors(member, result); return result; } }); builder.define(TopBottomCountFunDef.BottomCountResolver); builder.define(TopBottomPercentSumFunDef.BottomPercentResolver); builder.define(TopBottomPercentSumFunDef.BottomSumResolver); builder.define(TopBottomCountFunDef.TopCountResolver); builder.define(TopBottomPercentSumFunDef.TopPercentResolver); builder.define(TopBottomPercentSumFunDef.TopSumResolver); // .Children builder.define( new FunDefBase( "Children", "Returns the children of a member.", "pxm") { public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) { final MemberCalc memberCalc = compiler.compileMember(call.getArg(0)); return new AbstractListCalc( call, new Calc[] {memberCalc}, false) { public TupleList evaluateList(Evaluator evaluator) { // Return the list of children. The list is immutable, // hence 'false' above. Member member = memberCalc.evaluateMember(evaluator); return new UnaryTupleList( getNonEmptyMemberChildren(evaluator, member)); } }; } }); builder.define(CrossJoinFunDef.Resolver); builder.define(NonEmptyCrossJoinFunDef.Resolver); builder.define(CrossJoinFunDef.StarResolver); builder.define(DescendantsFunDef.Resolver); builder.define(DescendantsFunDef.Resolver2); builder.define(DistinctFunDef.instance); builder.define(DrilldownLevelFunDef.Resolver); builder.define(DrilldownLevelTopBottomFunDef.DrilldownLevelTopResolver); builder.define( DrilldownLevelTopBottomFunDef.DrilldownLevelBottomResolver); builder.define(DrilldownMemberFunDef.Resolver); if (false) builder.define( new FunDefBase( "DrilldownMemberBottom", "DrilldownMemberBottom(, , [, [][, RECURSIVE]])", "Like DrilldownMember except that it includes only the bottom N children.", "fx*") { public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) { throw new UnsupportedOperationException(); } }); if (false) builder.define( new FunDefBase( "DrilldownMemberTop", "DrilldownMemberTop(, , [, [][, RECURSIVE]])", "Like DrilldownMember except that it includes only the top N children.", "fx*") { public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) { throw new UnsupportedOperationException(); } }); if (false) builder.define( new FunDefBase( "DrillupLevel", "DrillupLevel([, ])", "Drills up the members of a set that are below a specified level.", "fx*") { public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) { throw new UnsupportedOperationException(); } }); if (false) builder.define( new FunDefBase( "DrillupMember", "DrillupMember(, )", "Drills up the members in a set that are present in a second specified set.", "fx*") { public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) { throw new UnsupportedOperationException(); } }); builder.define(ExceptFunDef.Resolver); builder.define(ExistsFunDef.resolver); builder.define(ExtractFunDef.Resolver); builder.define(FilterFunDef.instance); builder.define(GenerateFunDef.ListResolver); builder.define(GenerateFunDef.StringResolver); builder.define(HeadTailFunDef.HeadResolver); builder.define(HierarchizeFunDef.Resolver); builder.define(IntersectFunDef.resolver); builder.define(LastPeriodsFunDef.Resolver); // .Members is really just shorthand for .Members builder.define( new FunInfo( "Members", "Returns the set of members in a dimension.", "pxd")); // .Members builder.define( new FunDefBase( "Members", "Returns the set of members in a hierarchy.", "pxh") { public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) { final HierarchyCalc hierarchyCalc = compiler.compileHierarchy(call.getArg(0)); return new AbstractListCalc( call, new Calc[] {hierarchyCalc}) { public TupleList evaluateList(Evaluator evaluator) { Hierarchy hierarchy = hierarchyCalc.evaluateHierarchy(evaluator); return hierarchyMembers(hierarchy, evaluator, false); } }; } }); // .AllMembers builder.define( new FunDefBase( "AllMembers", "Returns a set that contains all members, including calculated members, of the specified hierarchy.", "pxh") { public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) { final HierarchyCalc hierarchyCalc = compiler.compileHierarchy(call.getArg(0)); return new AbstractListCalc( call, new Calc[] {hierarchyCalc}) { public TupleList evaluateList(Evaluator evaluator) { Hierarchy hierarchy = hierarchyCalc.evaluateHierarchy(evaluator); return hierarchyMembers(hierarchy, evaluator, true); } }; } }); // .Members builder.define(LevelMembersFunDef.INSTANCE); // .AllMembers builder.define( new FunDefBase( "AllMembers", "Returns a set that contains all members, including calculated members, of the specified level.", "pxl") { public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) { final LevelCalc levelCalc = compiler.compileLevel(call.getArg(0)); return new AbstractListCalc(call, new Calc[] {levelCalc}) { public TupleList evaluateList(Evaluator evaluator) { Level level = levelCalc.evaluateLevel(evaluator); return levelMembers(level, evaluator, true); } }; } }); builder.define(XtdFunDef.MtdResolver); builder.define(OrderFunDef.Resolver); builder.define(UnorderFunDef.Resolver); builder.define(PeriodsToDateFunDef.Resolver); builder.define(XtdFunDef.QtdResolver); // StripCalculatedMembers() builder.define( new FunDefBase( "StripCalculatedMembers", "Removes calculated members from a set.", "fxx") { public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) { final ListCalc listCalc = compiler.compileList(call.getArg(0)); return new AbstractListCalc(call, new Calc[] {listCalc}) { public TupleList evaluateList(Evaluator evaluator) { TupleList list = listCalc.evaluateList(evaluator); return removeCalculatedMembers(list); } }; } }); // .Siblings builder.define( new FunDefBase( "Siblings", "Returns the siblings of a specified member, including the member itself.", "pxm") { public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) { final MemberCalc memberCalc = compiler.compileMember(call.getArg(0)); return new AbstractListCalc(call, new Calc[] {memberCalc}) { public TupleList evaluateList(Evaluator evaluator) { final Member member = memberCalc.evaluateMember(evaluator); return new UnaryTupleList( memberSiblings(member, evaluator)); } }; } List memberSiblings(Member member, Evaluator evaluator) { if (member.isNull()) { // the null member has no siblings -- not even itself return Collections.emptyList(); } Member parent = member.getParentMember(); final SchemaReader schemaReader = evaluator.getSchemaReader(); if (parent == null) { return schemaReader.getHierarchyRootMembers( member.getHierarchy()); } else { return schemaReader.getMemberChildren(parent); } } }); builder.define(StrToSetFunDef.Resolver); builder.define(SubsetFunDef.Resolver); builder.define(HeadTailFunDef.TailResolver); builder.define(ToggleDrillStateFunDef.Resolver); builder.define(UnionFunDef.Resolver); builder.define(VisualTotalsFunDef.Resolver); builder.define(XtdFunDef.WtdResolver); builder.define(XtdFunDef.YtdResolver); builder.define(RangeFunDef.instance); // " : " operator builder.define(SetFunDef.Resolver); // "{ [,...] }" operator builder.define(NativizeSetFunDef.Resolver); // // STRING FUNCTIONS builder.define(FormatFunDef.Resolver); // .Caption builder.define( new FunDefBase( "Caption", "Returns the caption of a dimension.", "pSd") { public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) { final DimensionCalc dimensionCalc = compiler.compileDimension(call.getArg(0)); return new AbstractStringCalc(call, new Calc[] {dimensionCalc}) { public String evaluateString(Evaluator evaluator) { final Dimension dimension = dimensionCalc.evaluateDimension(evaluator); return dimension.getCaption(); } }; } }); // .Caption builder.define( new FunDefBase( "Caption", "Returns the caption of a hierarchy.", "pSh") { public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) { final HierarchyCalc hierarchyCalc = compiler.compileHierarchy(call.getArg(0)); return new AbstractStringCalc(call, new Calc[] {hierarchyCalc}) { public String evaluateString(Evaluator evaluator) { final Hierarchy hierarchy = hierarchyCalc.evaluateHierarchy(evaluator); return hierarchy.getCaption(); } }; } }); // .Caption builder.define( new FunDefBase( "Caption", "Returns the caption of a level.", "pSl") { public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) { final LevelCalc levelCalc = compiler.compileLevel(call.getArg(0)); return new AbstractStringCalc(call, new Calc[] {levelCalc}) { public String evaluateString(Evaluator evaluator) { final Level level = levelCalc.evaluateLevel(evaluator); return level.getCaption(); } }; } }); // .Caption builder.define( new FunDefBase( "Caption", "Returns the caption of a member.", "pSm") { public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) { final MemberCalc memberCalc = compiler.compileMember(call.getArg(0)); return new AbstractStringCalc(call, new Calc[] {memberCalc}) { public String evaluateString(Evaluator evaluator) { final Member member = memberCalc.evaluateMember(evaluator); return member.getCaption(); } }; } }); // .Name builder.define( new FunDefBase( "Name", "Returns the name of a dimension.", "pSd") { public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) { final DimensionCalc dimensionCalc = compiler.compileDimension(call.getArg(0)); return new AbstractStringCalc(call, new Calc[] {dimensionCalc}) { public String evaluateString(Evaluator evaluator) { final Dimension dimension = dimensionCalc.evaluateDimension(evaluator); return dimension.getName(); } }; } }); // .Name builder.define( new FunDefBase( "Name", "Returns the name of a hierarchy.", "pSh") { public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) { final HierarchyCalc hierarchyCalc = compiler.compileHierarchy(call.getArg(0)); return new AbstractStringCalc(call, new Calc[] {hierarchyCalc}) { public String evaluateString(Evaluator evaluator) { final Hierarchy hierarchy = hierarchyCalc.evaluateHierarchy(evaluator); return hierarchy.getName(); } }; } }); // .Name builder.define( new FunDefBase( "Name", "Returns the name of a level.", "pSl") { public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) { final LevelCalc levelCalc = compiler.compileLevel(call.getArg(0)); return new AbstractStringCalc(call, new Calc[] {levelCalc}) { public String evaluateString(Evaluator evaluator) { final Level level = levelCalc.evaluateLevel(evaluator); return level.getName(); } }; } }); // .Name builder.define( new FunDefBase( "Name", "Returns the name of a member.", "pSm") { public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) { final MemberCalc memberCalc = compiler.compileMember(call.getArg(0)); return new AbstractStringCalc(call, new Calc[] {memberCalc}) { public String evaluateString(Evaluator evaluator) { final Member member = memberCalc.evaluateMember(evaluator); return member.getName(); } }; } }); builder.define(SetToStrFunDef.instance); builder.define(TupleToStrFunDef.instance); // .UniqueName builder.define( new FunDefBase( "UniqueName", "Returns the unique name of a dimension.", "pSd") { public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) { final DimensionCalc dimensionCalc = compiler.compileDimension(call.getArg(0)); return new AbstractStringCalc(call, new Calc[] {dimensionCalc}) { public String evaluateString(Evaluator evaluator) { final Dimension dimension = dimensionCalc.evaluateDimension(evaluator); return dimension.getUniqueName(); } }; } }); // .UniqueName builder.define( new FunDefBase( "UniqueName", "Returns the unique name of a hierarchy.", "pSh") { public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) { final HierarchyCalc hierarchyCalc = compiler.compileHierarchy(call.getArg(0)); return new AbstractStringCalc(call, new Calc[] {hierarchyCalc}) { public String evaluateString(Evaluator evaluator) { final Hierarchy hierarchy = hierarchyCalc.evaluateHierarchy(evaluator); return hierarchy.getUniqueName(); } }; } }); // .UniqueName builder.define( new FunDefBase( "UniqueName", "Returns the unique name of a level.", "pSl") { public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) { final LevelCalc levelCalc = compiler.compileLevel(call.getArg(0)); return new AbstractStringCalc(call, new Calc[] {levelCalc}) { public String evaluateString(Evaluator evaluator) { final Level level = levelCalc.evaluateLevel(evaluator); return level.getUniqueName(); } }; } }); // .UniqueName builder.define( new FunDefBase( "UniqueName", "Returns the unique name of a member.", "pSm") { public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) { final MemberCalc memberCalc = compiler.compileMember(call.getArg(0)); return new AbstractStringCalc(call, new Calc[] {memberCalc}) { public String evaluateString(Evaluator evaluator) { final Member member = memberCalc.evaluateMember(evaluator); return member.getUniqueName(); } }; } }); // // TUPLE FUNCTIONS // .Current if (false) builder.define( new FunDefBase( "Current", "Returns the current tuple from a set during an iteration.", "ptx") { public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) { throw new UnsupportedOperationException(); } }); builder.define(SetItemFunDef.intResolver); builder.define(SetItemFunDef.stringResolver); builder.define(TupleItemFunDef.instance); builder.define(StrToTupleFunDef.Resolver); // special resolver for "()" builder.define(TupleFunDef.Resolver); // // GENERIC VALUE FUNCTIONS builder.define(CoalesceEmptyFunDef.Resolver); builder.define(CaseTestFunDef.Resolver); builder.define(CaseMatchFunDef.Resolver); builder.define(PropertiesFunDef.Resolver); // // PARAMETER FUNCTIONS builder.define(new ParameterFunDef.ParameterResolver()); builder.define(new ParameterFunDef.ParamRefResolver()); // // OPERATORS // + builder.define( new FunDefBase( "+", "Adds two numbers.", "innn") { public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) { final DoubleCalc calc0 = compiler.compileDouble(call.getArg(0)); final DoubleCalc calc1 = compiler.compileDouble(call.getArg(1)); return new AbstractDoubleCalc(call, new Calc[] {calc0, calc1}) { public double evaluateDouble(Evaluator evaluator) { final double v0 = calc0.evaluateDouble(evaluator); final double v1 = calc1.evaluateDouble(evaluator); if (v0 == DoubleNull) { if (v1 == DoubleNull) { return DoubleNull; } else { return v1; } } else { if (v1 == DoubleNull) { return v0; } else { return v0 + v1; } } } }; } }); // - builder.define( new FunDefBase( "-", "Subtracts two numbers.", "innn") { public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) { final DoubleCalc calc0 = compiler.compileDouble(call.getArg(0)); final DoubleCalc calc1 = compiler.compileDouble(call.getArg(1)); return new AbstractDoubleCalc(call, new Calc[] {calc0, calc1}) { public double evaluateDouble(Evaluator evaluator) { final double v0 = calc0.evaluateDouble(evaluator); final double v1 = calc1.evaluateDouble(evaluator); if (v0 == DoubleNull) { if (v1 == DoubleNull) { return DoubleNull; } else { return - v1; } } else { if (v1 == DoubleNull) { return v0; } else { return v0 - v1; } } } }; } }); // * builder.define( new FunDefBase( "*", "Multiplies two numbers.", "innn") { public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) { final DoubleCalc calc0 = compiler.compileDouble(call.getArg(0)); final DoubleCalc calc1 = compiler.compileDouble(call.getArg(1)); return new AbstractDoubleCalc(call, new Calc[] {calc0, calc1}) { public double evaluateDouble(Evaluator evaluator) { final double v0 = calc0.evaluateDouble(evaluator); final double v1 = calc1.evaluateDouble(evaluator); // Multiply and divide return null if EITHER arg is // null. if (v0 == DoubleNull || v1 == DoubleNull) { return DoubleNull; } else { return v0 * v1; } } }; } }); // / builder.define( new FunDefBase( "/", "Divides two numbers.", "innn") { public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) { final DoubleCalc calc0 = compiler.compileDouble(call.getArg(0)); final DoubleCalc calc1 = compiler.compileDouble(call.getArg(1)); final boolean isNullDenominatorProducesNull = MondrianProperties.instance().NullDenominatorProducesNull .get(); // If the mondrian property // mondrian.olap.NullOrZeroDenominatorProducesNull // is false(default), Null in denominator with numeric numerator // returns infinity. This is consistent with MSAS. // // If this property is true, Null or zero in denominator returns // Null. This is only used by certain applications and does not // conform to MSAS behavior. if (!isNullDenominatorProducesNull) { return new AbstractDoubleCalc( call, new Calc[] {calc0, calc1}) { public double evaluateDouble(Evaluator evaluator) { final double v0 = calc0.evaluateDouble(evaluator); final double v1 = calc1.evaluateDouble(evaluator); // Null in numerator always returns DoubleNull. // if (v0 == DoubleNull) { return DoubleNull; } else if (v1 == DoubleNull) { // Null only in denominator returns Infinity. return Double.POSITIVE_INFINITY; } else { return v0 / v1; } } }; } else { return new AbstractDoubleCalc( call, new Calc[] {calc0, calc1}) { public double evaluateDouble(Evaluator evaluator) { final double v0 = calc0.evaluateDouble(evaluator); final double v1 = calc1.evaluateDouble(evaluator); // Null in numerator or denominator returns // DoubleNull. if (v0 == DoubleNull || v1 == DoubleNull) { return DoubleNull; } else { return v0 / v1; } } }; } } }); // - builder.define( new FunDefBase( "-", "Returns the negative of a number.", "Pnn") { public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) { final DoubleCalc calc = compiler.compileDouble(call.getArg(0)); return new AbstractDoubleCalc(call, new Calc[] {calc}) { public double evaluateDouble(Evaluator evaluator) { final double v = calc.evaluateDouble(evaluator); if (v == DoubleNull) { return DoubleNull; } else { return - v; } } }; } }); // || builder.define( new FunDefBase( "||", "Concatenates two strings.", "iSSS") { public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) { final StringCalc calc0 = compiler.compileString(call.getArg(0)); final StringCalc calc1 = compiler.compileString(call.getArg(1)); return new AbstractStringCalc(call, new Calc[] {calc0, calc1}) { public String evaluateString(Evaluator evaluator) { final String s0 = calc0.evaluateString(evaluator); final String s1 = calc1.evaluateString(evaluator); return s0 + s1; } }; } }); // AND builder.define( new FunDefBase( "AND", "Returns the conjunction of two conditions.", "ibbb") { public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) { final BooleanCalc calc0 = compiler.compileBoolean(call.getArg(0)); final BooleanCalc calc1 = compiler.compileBoolean(call.getArg(1)); return new AbstractBooleanCalc(call, new Calc[] {calc0, calc1}) { public boolean evaluateBoolean(Evaluator evaluator) { boolean b0 = calc0.evaluateBoolean(evaluator); // don't short-circuit evaluation if we're evaluating // the axes; that way, we can combine all measures // referenced in the AND expression in a single query if (!evaluator.isEvalAxes() && !b0) { return false; } boolean b1 = calc1.evaluateBoolean(evaluator); return b0 && b1; } }; } }); // OR builder.define( new FunDefBase( "OR", "Returns the disjunction of two conditions.", "ibbb") { public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) { final BooleanCalc calc0 = compiler.compileBoolean(call.getArg(0)); final BooleanCalc calc1 = compiler.compileBoolean(call.getArg(1)); return new AbstractBooleanCalc(call, new Calc[] {calc0, calc1}) { public boolean evaluateBoolean(Evaluator evaluator) { boolean b0 = calc0.evaluateBoolean(evaluator); // don't short-circuit evaluation if we're evaluating // the axes; that way, we can combine all measures // referenced in the OR expression in a single query if (!evaluator.isEvalAxes() && b0) { return true; } boolean b1 = calc1.evaluateBoolean(evaluator); return b0 || b1; } }; } }); // XOR builder.define( new FunDefBase( "XOR", "Returns whether two conditions are mutually exclusive.", "ibbb") { public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) { final BooleanCalc calc0 = compiler.compileBoolean(call.getArg(0)); final BooleanCalc calc1 = compiler.compileBoolean(call.getArg(1)); return new AbstractBooleanCalc(call, new Calc[] {calc0, calc1}) { public boolean evaluateBoolean(Evaluator evaluator) { final boolean b0 = calc0.evaluateBoolean(evaluator); final boolean b1 = calc1.evaluateBoolean(evaluator); return b0 != b1; } }; } }); // NOT builder.define( new FunDefBase( "NOT", "Returns the negation of a condition.", "Pbb") { public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) { final BooleanCalc calc = compiler.compileBoolean(call.getArg(0)); return new AbstractBooleanCalc(call, new Calc[] {calc}) { public boolean evaluateBoolean(Evaluator evaluator) { return !calc.evaluateBoolean(evaluator); } }; } }); // = builder.define( new FunDefBase( "=", "Returns whether two expressions are equal.", "ibSS") { public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) { final StringCalc calc0 = compiler.compileString(call.getArg(0)); final StringCalc calc1 = compiler.compileString(call.getArg(1)); return new AbstractBooleanCalc(call, new Calc[] {calc0, calc1}) { public boolean evaluateBoolean(Evaluator evaluator) { final String b0 = calc0.evaluateString(evaluator); final String b1 = calc1.evaluateString(evaluator); if (b0 == null || b1 == null) { return BooleanNull; } return b0.equals(b1); } }; } }); // = builder.define( new FunDefBase( "=", "Returns whether two expressions are equal.", "ibnn") { public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) { final DoubleCalc calc0 = compiler.compileDouble(call.getArg(0)); final DoubleCalc calc1 = compiler.compileDouble(call.getArg(1)); return new AbstractBooleanCalc(call, new Calc[] {calc0, calc1}) { public boolean evaluateBoolean(Evaluator evaluator) { final double v0 = calc0.evaluateDouble(evaluator); final double v1 = calc1.evaluateDouble(evaluator); if (Double.isNaN(v0) || Double.isNaN(v1) || v0 == DoubleNull || v1 == DoubleNull) { return BooleanNull; } return v0 == v1; } }; } }); // <> builder.define( new FunDefBase( "<>", "Returns whether two expressions are not equal.", "ibSS") { public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) { final StringCalc calc0 = compiler.compileString(call.getArg(0)); final StringCalc calc1 = compiler.compileString(call.getArg(1)); return new AbstractBooleanCalc(call, new Calc[] {calc0, calc1}) { public boolean evaluateBoolean(Evaluator evaluator) { final String b0 = calc0.evaluateString(evaluator); final String b1 = calc1.evaluateString(evaluator); if (b0 == null || b1 == null) { return BooleanNull; } return !b0.equals(b1); } }; } }); // <> builder.define( new FunDefBase( "<>", "Returns whether two expressions are not equal.", "ibnn") { public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) { final DoubleCalc calc0 = compiler.compileDouble(call.getArg(0)); final DoubleCalc calc1 = compiler.compileDouble(call.getArg(1)); return new AbstractBooleanCalc(call, new Calc[] {calc0, calc1}) { public boolean evaluateBoolean(Evaluator evaluator) { final double v0 = calc0.evaluateDouble(evaluator); final double v1 = calc1.evaluateDouble(evaluator); if (Double.isNaN(v0) || Double.isNaN(v1) || v0 == DoubleNull || v1 == DoubleNull) { return BooleanNull; } return v0 != v1; } }; } }); // < builder.define( new FunDefBase( "<", "Returns whether an expression is less than another.", "ibnn") { public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) { final DoubleCalc calc0 = compiler.compileDouble(call.getArg(0)); final DoubleCalc calc1 = compiler.compileDouble(call.getArg(1)); return new AbstractBooleanCalc(call, new Calc[] {calc0, calc1}) { public boolean evaluateBoolean(Evaluator evaluator) { final double v0 = calc0.evaluateDouble(evaluator); final double v1 = calc1.evaluateDouble(evaluator); if (Double.isNaN(v0) || Double.isNaN(v1) || v0 == DoubleNull || v1 == DoubleNull) { return BooleanNull; } return v0 < v1; } }; } }); // < builder.define( new FunDefBase( "<", "Returns whether an expression is less than another.", "ibSS") { public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) { final StringCalc calc0 = compiler.compileString(call.getArg(0)); final StringCalc calc1 = compiler.compileString(call.getArg(1)); return new AbstractBooleanCalc(call, new Calc[] {calc0, calc1}) { public boolean evaluateBoolean(Evaluator evaluator) { final String b0 = calc0.evaluateString(evaluator); final String b1 = calc1.evaluateString(evaluator); if (b0 == null || b1 == null) { return BooleanNull; } return b0.compareTo(b1) < 0; } }; } }); // <= builder.define( new FunDefBase( "<=", "Returns whether an expression is less than or equal to another.", "ibnn") { public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) { final DoubleCalc calc0 = compiler.compileDouble(call.getArg(0)); final DoubleCalc calc1 = compiler.compileDouble(call.getArg(1)); return new AbstractBooleanCalc(call, new Calc[] {calc0, calc1}) { public boolean evaluateBoolean(Evaluator evaluator) { final double v0 = calc0.evaluateDouble(evaluator); final double v1 = calc1.evaluateDouble(evaluator); if (Double.isNaN(v0) || Double.isNaN(v1) || v0 == DoubleNull || v1 == DoubleNull) { return BooleanNull; } return v0 <= v1; } }; } }); // <= builder.define( new FunDefBase( "<=", "Returns whether an expression is less than or equal to another.", "ibSS") { public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) { final StringCalc calc0 = compiler.compileString(call.getArg(0)); final StringCalc calc1 = compiler.compileString(call.getArg(1)); return new AbstractBooleanCalc(call, new Calc[] {calc0, calc1}) { public boolean evaluateBoolean(Evaluator evaluator) { final String b0 = calc0.evaluateString(evaluator); final String b1 = calc1.evaluateString(evaluator); if (b0 == null || b1 == null) { return BooleanNull; } return b0.compareTo(b1) <= 0; } }; } }); // > builder.define( new FunDefBase( ">", "Returns whether an expression is greater than another.", "ibnn") { public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) { final DoubleCalc calc0 = compiler.compileDouble(call.getArg(0)); final DoubleCalc calc1 = compiler.compileDouble(call.getArg(1)); return new AbstractBooleanCalc(call, new Calc[] {calc0, calc1}) { public boolean evaluateBoolean(Evaluator evaluator) { final double v0 = calc0.evaluateDouble(evaluator); final double v1 = calc1.evaluateDouble(evaluator); if (Double.isNaN(v0) || Double.isNaN(v1) || v0 == DoubleNull || v1 == DoubleNull) { return BooleanNull; } return v0 > v1; } }; } }); // > builder.define( new FunDefBase( ">", "Returns whether an expression is greater than another.", "ibSS") { public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) { final StringCalc calc0 = compiler.compileString(call.getArg(0)); final StringCalc calc1 = compiler.compileString(call.getArg(1)); return new AbstractBooleanCalc(call, new Calc[] {calc0, calc1}) { public boolean evaluateBoolean(Evaluator evaluator) { final String b0 = calc0.evaluateString(evaluator); final String b1 = calc1.evaluateString(evaluator); if (b0 == null || b1 == null) { return BooleanNull; } return b0.compareTo(b1) > 0; } }; } }); // >= builder.define( new FunDefBase( ">=", "Returns whether an expression is greater than or equal to another.", "ibnn") { public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) { final DoubleCalc calc0 = compiler.compileDouble(call.getArg(0)); final DoubleCalc calc1 = compiler.compileDouble(call.getArg(1)); return new AbstractBooleanCalc(call, new Calc[] {calc0, calc1}) { public boolean evaluateBoolean(Evaluator evaluator) { final double v0 = calc0.evaluateDouble(evaluator); final double v1 = calc1.evaluateDouble(evaluator); if (Double.isNaN(v0) || Double.isNaN(v1) || v0 == DoubleNull || v1 == DoubleNull) { return BooleanNull; } return v0 >= v1; } }; } }); // >= builder.define( new FunDefBase( ">=", "Returns whether an expression is greater than or equal to another.", "ibSS") { public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) { final StringCalc calc0 = compiler.compileString(call.getArg(0)); final StringCalc calc1 = compiler.compileString(call.getArg(1)); return new AbstractBooleanCalc(call, new Calc[] {calc0, calc1}) { public boolean evaluateBoolean(Evaluator evaluator) { final String b0 = calc0.evaluateString(evaluator); final String b1 = calc1.evaluateString(evaluator); if (b0 == null || b1 == null) { return BooleanNull; } return b0.compareTo(b1) >= 0; } }; } }); // NON-STANDARD FUNCTIONS builder.define(NthQuartileFunDef.FirstQResolver); builder.define(NthQuartileFunDef.ThirdQResolver); builder.define(CalculatedChildFunDef.instance); builder.define(CastFunDef.Resolver); // UCase() builder.define( new FunDefBase( "UCase", "Returns a string that has been converted to uppercase", "fSS") { public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) { final Locale locale = compiler.getEvaluator().getConnectionLocale(); final StringCalc stringCalc = compiler.compileString(call.getArg(0)); return new AbstractStringCalc(call, new Calc[]{stringCalc}) { public String evaluateString(Evaluator evaluator) { String value = stringCalc.evaluateString(evaluator); return value.toUpperCase(locale); } }; } }); // Len() builder.define( new FunDefBase( "Len", "Returns the number of characters in a string", "fnS") { public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) { final StringCalc stringCalc = compiler.compileString(call.getArg(0)); return new AbstractIntegerCalc(call, new Calc[] {stringCalc}) { public int evaluateInteger(Evaluator evaluator) { String value = stringCalc.evaluateString(evaluator); if (value == null) { return 0; } return value.length(); } }; } }); // Define VBA functions. for (FunDef funDef : JavaFunDef.scan(Vba.class)) { builder.define(funDef); } // Define Excel functions. for (FunDef funDef : JavaFunDef.scan(Excel.class)) { builder.define(funDef); } } /** * Returns the singleton, creating if necessary. * * @return the singleton */ public static BuiltinFunTable instance() { if (instance == null) { instance = new BuiltinFunTable(); instance.init(); } return instance; } } // End BuiltinFunTable.java mondrian-3.11.0.1-R/src/main/mondrian/olap/fun/CacheFunDef.java000066400000000000000000000070631261646570300237640ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.olap.fun; import mondrian.calc.*; import mondrian.calc.impl.GenericCalc; import mondrian.calc.impl.GenericIterCalc; import mondrian.mdx.ResolvedFunCall; import mondrian.olap.*; import mondrian.olap.type.SetType; import mondrian.olap.type.Type; import java.io.PrintWriter; import java.util.List; /** * Definition of the Cache system function, which is smart enough * to evaluate its argument only once. * * @author jhyde * @since 2005/8/14 */ public class CacheFunDef extends FunDefBase { static final String NAME = "Cache"; private static final String SIGNATURE = "Cache(<>)"; private static final String DESCRIPTION = "Evaluates and returns its sole argument, applying statement-level caching"; private static final Syntax SYNTAX = Syntax.Function; static final CacheFunResolver Resolver = new CacheFunResolver(); CacheFunDef( String name, String signature, String description, Syntax syntax, int category, Type type) { super( name, signature, description, syntax, category, new int[] {category}); Util.discard(type); } public void unparse(Exp[] args, PrintWriter pw) { args[0].unparse(pw); } public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) { final Exp exp = call.getArg(0); final ExpCacheDescriptor cacheDescriptor = new ExpCacheDescriptor(exp, compiler); if (call.getType() instanceof SetType) { return new GenericIterCalc(call) { public Object evaluate(Evaluator evaluator) { return evaluator.getCachedResult(cacheDescriptor); } public Calc[] getCalcs() { return new Calc[] {cacheDescriptor.getCalc()}; } public ResultStyle getResultStyle() { // cached lists are immutable return ResultStyle.LIST; } }; } else { return new GenericCalc(call) { public Object evaluate(Evaluator evaluator) { return evaluator.getCachedResult(cacheDescriptor); } public Calc[] getCalcs() { return new Calc[] {cacheDescriptor.getCalc()}; } public ResultStyle getResultStyle() { return ResultStyle.VALUE; } }; } } public static class CacheFunResolver extends ResolverBase { CacheFunResolver() { super(NAME, SIGNATURE, DESCRIPTION, SYNTAX); } public FunDef resolve( Exp[] args, Validator validator, List conversions) { if (args.length != 1) { return null; } final Exp exp = args[0]; final int category = exp.getCategory(); final Type type = exp.getType(); return new CacheFunDef( NAME, SIGNATURE, DESCRIPTION, SYNTAX, category, type); } public boolean requiresExpression(int k) { return false; } } } // End CacheFunDef.java mondrian-3.11.0.1-R/src/main/mondrian/olap/fun/CaseMatchFunDef.java000066400000000000000000000112121261646570300246000ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.olap.fun; import mondrian.calc.Calc; import mondrian.calc.ExpCompiler; import mondrian.calc.impl.ConstantCalc; import mondrian.calc.impl.GenericCalc; import mondrian.mdx.ResolvedFunCall; import mondrian.olap.*; import java.util.ArrayList; import java.util.List; /** * Definition of the matched CASE MDX operator. * * Syntax is: *
Case <Expression>
 * When <Expression> Then <Expression>
 * [...]
 * [Else <Expression>]
 * End
. * * @see CaseTestFunDef * @author jhyde * @since Mar 23, 2006 */ class CaseMatchFunDef extends FunDefBase { static final ResolverImpl Resolver = new ResolverImpl(); private CaseMatchFunDef(FunDef dummyFunDef) { super(dummyFunDef); } public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) { final Exp[] args = call.getArgs(); final List calcList = new ArrayList(); final Calc valueCalc = compiler.compileScalar(args[0], true); calcList.add(valueCalc); final int matchCount = (args.length - 1) / 2; final Calc[] matchCalcs = new Calc[matchCount]; final Calc[] exprCalcs = new Calc[matchCount]; for (int i = 0, j = 1; i < exprCalcs.length; i++) { matchCalcs[i] = compiler.compileScalar(args[j++], true); calcList.add(matchCalcs[i]); exprCalcs[i] = compiler.compile(args[j++]); calcList.add(exprCalcs[i]); } final Calc defaultCalc = args.length % 2 == 0 ? compiler.compile(args[args.length - 1]) : ConstantCalc.constantNull(call.getType()); calcList.add(defaultCalc); final Calc[] calcs = calcList.toArray(new Calc[calcList.size()]); return new GenericCalc(call) { public Object evaluate(Evaluator evaluator) { Object value = valueCalc.evaluate(evaluator); for (int i = 0; i < matchCalcs.length; i++) { Object match = matchCalcs[i].evaluate(evaluator); if (match.equals(value)) { return exprCalcs[i].evaluate(evaluator); } } return defaultCalc.evaluate(evaluator); } public Calc[] getCalcs() { return calcs; } }; } private static class ResolverImpl extends ResolverBase { private ResolverImpl() { super( "_CaseMatch", "Case When Then [...] [Else ] End", "Evaluates various expressions, and returns the corresponding expression for the first which matches a particular value.", Syntax.Case); } public FunDef resolve( Exp[] args, Validator validator, List conversions) { if (args.length < 3) { return null; } int valueType = args[0].getCategory(); int returnType = args[2].getCategory(); int j = 0; int clauseCount = (args.length - 1) / 2; int mismatchingArgs = 0; if (!validator.canConvert(j, args[j++], valueType, conversions)) { mismatchingArgs++; } for (int i = 0; i < clauseCount; i++) { if (!validator.canConvert(j, args[j++], valueType, conversions)) { mismatchingArgs++; } if (!validator.canConvert( j, args[j++], returnType, conversions)) { mismatchingArgs++; } } if (j < args.length) { if (!validator.canConvert( j, args[j++], returnType, conversions)) { mismatchingArgs++; } } Util.assertTrue(j == args.length); if (mismatchingArgs != 0) { return null; } FunDef dummy = createDummyFunDef(this, returnType, args); return new CaseMatchFunDef(dummy); } public boolean requiresExpression(int k) { return true; } } } // End CaseMatchFunDef.java mondrian-3.11.0.1-R/src/main/mondrian/olap/fun/CaseTestFunDef.java000066400000000000000000000103701261646570300244670ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.olap.fun; import mondrian.calc.*; import mondrian.calc.impl.ConstantCalc; import mondrian.calc.impl.GenericCalc; import mondrian.mdx.ResolvedFunCall; import mondrian.olap.*; import java.util.ArrayList; import java.util.List; /** * Definition of the tested CASE MDX operator. * * Syntax is: *
Case
 * When <Logical Expression> Then <Expression>
 * [...]
 * [Else <Expression>]
 * End
. * * @see CaseMatchFunDef * * @author jhyde * @since Mar 23, 2006 */ class CaseTestFunDef extends FunDefBase { static final ResolverImpl Resolver = new ResolverImpl(); public CaseTestFunDef(FunDef dummyFunDef) { super(dummyFunDef); } public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) { final Exp[] args = call.getArgs(); final BooleanCalc[] conditionCalcs = new BooleanCalc[args.length / 2]; final Calc[] exprCalcs = new Calc[args.length / 2]; final List calcList = new ArrayList(); for (int i = 0, j = 0; i < exprCalcs.length; i++) { conditionCalcs[i] = compiler.compileBoolean(args[j++]); calcList.add(conditionCalcs[i]); exprCalcs[i] = compiler.compile(args[j++]); calcList.add(exprCalcs[i]); } final Calc defaultCalc = args.length % 2 == 1 ? compiler.compileScalar(args[args.length - 1], true) : ConstantCalc.constantNull(call.getType()); calcList.add(defaultCalc); final Calc[] calcs = calcList.toArray(new Calc[calcList.size()]); return new GenericCalc(call) { public Object evaluate(Evaluator evaluator) { for (int i = 0; i < conditionCalcs.length; i++) { if (conditionCalcs[i].evaluateBoolean(evaluator)) { return exprCalcs[i].evaluate(evaluator); } } return defaultCalc.evaluate(evaluator); } public Calc[] getCalcs() { return calcs; } }; } private static class ResolverImpl extends ResolverBase { public ResolverImpl() { super( "_CaseTest", "Case When Then [...] [Else ] End", "Evaluates various conditions, and returns the corresponding expression for the first which evaluates to true.", Syntax.Case); } public FunDef resolve( Exp[] args, Validator validator, List conversions) { if (args.length < 1) { return null; } int j = 0; int clauseCount = args.length / 2; int mismatchingArgs = 0; int returnType = args[1].getCategory(); for (int i = 0; i < clauseCount; i++) { if (!validator.canConvert( j, args[j++], Category.Logical, conversions)) { mismatchingArgs++; } if (!validator.canConvert( j, args[j++], returnType, conversions)) { mismatchingArgs++; } } if (j < args.length) { if (!validator.canConvert( j, args[j++], returnType, conversions)) { mismatchingArgs++; } } Util.assertTrue(j == args.length); if (mismatchingArgs != 0) { return null; } FunDef dummy = createDummyFunDef(this, returnType, args); return new CaseTestFunDef(dummy); } public boolean requiresExpression(int k) { return true; } } } // End CaseTestFunDef.java mondrian-3.11.0.1-R/src/main/mondrian/olap/fun/CastFunDef.java000066400000000000000000000150321261646570300236460ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.olap.fun; import mondrian.calc.Calc; import mondrian.calc.ExpCompiler; import mondrian.calc.impl.GenericCalc; import mondrian.mdx.ResolvedFunCall; import mondrian.olap.*; import mondrian.olap.type.Type; import mondrian.olap.type.TypeUtil; import mondrian.resource.MondrianResource; import java.util.List; /** * Definition of the CAST MDX operator. * *

CAST is a mondrian-specific extension to MDX, because the MDX * standard does not define how values are to be converted from one * type to another. Microsoft Analysis Services, for Resolver, uses the Visual * Basic functions CStr, CInt, etc. * The syntax for this operator was inspired by the CAST operator * in the SQL standard. * *

Examples:

    *
  • CAST(1 + 2 AS STRING)
  • *
  • CAST('12.' || '56' AS NUMERIC)
  • *
  • CAST('tr' || 'ue' AS BOOLEAN)
  • *
* * @author jhyde * @since Sep 3, 2006 */ public class CastFunDef extends FunDefBase { static final ResolverBase Resolver = new ResolverImpl(); private CastFunDef(FunDef dummyFunDef) { super(dummyFunDef); } public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) { final Type targetType = call.getType(); final Exp arg = call.getArg(0); final Calc calc = compiler.compileScalar(arg, false); return new CalcImpl(arg, calc, targetType); } private static RuntimeException cannotConvert( Object o, final Type targetType) { return Util.newInternal( "cannot convert value '" + o + "' to targetType '" + targetType + "'"); } public static int toInt( Object o, final Type targetType) { if (o == null) { return FunUtil.IntegerNull; } if (o instanceof String) { return Integer.parseInt((String) o); } if (o instanceof Number) { return ((Number) o).intValue(); } throw cannotConvert(o, targetType); } private static double toDouble(Object o, final Type targetType) { if (o == null) { return FunUtil.DoubleNull; } if (o instanceof String) { return Double.valueOf((String) o); } if (o instanceof Number) { return ((Number) o).doubleValue(); } throw cannotConvert(o, targetType); } public static boolean toBoolean(Object o, final Type targetType) { if (o == null) { return FunUtil.BooleanNull; } if (o instanceof Boolean) { return (Boolean) o; } if (o instanceof String) { return Boolean.valueOf((String) o); } if (o instanceof Number) { return ((Number) o).doubleValue() > 0; } throw cannotConvert(o, targetType); } /** * Resolves calls to the CAST operator. */ private static class ResolverImpl extends ResolverBase { public ResolverImpl() { super( "Cast", "Cast( AS )", "Converts values to another type.", Syntax.Cast); } public FunDef resolve( Exp[] args, Validator validator, List conversions) { if (args.length != 2) { return null; } if (!(args[1] instanceof Literal)) { return null; } Literal literal = (Literal) args[1]; String typeName = (String) literal.getValue(); int returnCategory; if (typeName.equalsIgnoreCase("String")) { returnCategory = Category.String; } else if (typeName.equalsIgnoreCase("Numeric")) { returnCategory = Category.Numeric; } else if (typeName.equalsIgnoreCase("Boolean")) { returnCategory = Category.Logical; } else if (typeName.equalsIgnoreCase("Integer")) { returnCategory = Category.Integer; } else { throw MondrianResource.instance().CastInvalidType.ex(typeName); } final FunDef dummyFunDef = createDummyFunDef(this, returnCategory, args); return new CastFunDef(dummyFunDef); } } private static class CalcImpl extends GenericCalc { private final Calc calc; private final Type targetType; private final int targetCategory; public CalcImpl(Exp arg, Calc calc, Type targetType) { super(arg); this.calc = calc; this.targetType = targetType; this.targetCategory = TypeUtil.typeToCategory(targetType); } public Calc[] getCalcs() { return new Calc[] {calc}; } public Object evaluate(Evaluator evaluator) { switch (targetCategory) { case Category.String: return evaluateString(evaluator); case Category.Integer: return FunUtil.box(evaluateInteger(evaluator)); case Category.Numeric: return FunUtil.box(evaluateDouble(evaluator)); case Category.DateTime: return evaluateDateTime(evaluator); case Category.Logical: return evaluateBoolean(evaluator); default: throw Util.newInternal("category " + targetCategory); } } public String evaluateString(Evaluator evaluator) { final Object o = calc.evaluate(evaluator); if (o == null) { return null; } return String.valueOf(o); } public int evaluateInteger(Evaluator evaluator) { final Object o = calc.evaluate(evaluator); return toInt(o, targetType); } public double evaluateDouble(Evaluator evaluator) { final Object o = calc.evaluate(evaluator); return toDouble(o, targetType); } public boolean evaluateBoolean(Evaluator evaluator) { final Object o = calc.evaluate(evaluator); return toBoolean(o, targetType); } } } // End CastFunDef.java mondrian-3.11.0.1-R/src/main/mondrian/olap/fun/CoalesceEmptyFunDef.java000066400000000000000000000062561261646570300255210ustar00rootroot00000000000000/* // This software is subject to the terms of the Eclipse Public License v1.0 // Agreement, available at the following URL: // http://www.eclipse.org/legal/epl-v10.html. // You must accept the terms of that agreement to use this software. // // Copyright (C) 2004-2005 Julian Hyde // Copyright (C) 2005-2011 Pentaho and others // All Rights Reserved. */ package mondrian.olap.fun; import mondrian.calc.Calc; import mondrian.calc.ExpCompiler; import mondrian.calc.impl.GenericCalc; import mondrian.mdx.ResolvedFunCall; import mondrian.olap.*; import java.util.List; /** * Definition of the CoalesceEmpty MDX function. * *

It evaluates each of the arguments to the function, returning the * first such argument that does not return a null value. * * @author gjohnson */ public class CoalesceEmptyFunDef extends FunDefBase { static final ResolverBase Resolver = new ResolverImpl(); public CoalesceEmptyFunDef(ResolverBase resolverBase, int type, int[] types) { super(resolverBase, type, types); } public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) { final Exp[] args = call.getArgs(); final Calc[] calcs = new Calc[args.length]; for (int i = 0; i < args.length; i++) { calcs[i] = compiler.compileScalar(args[i], true); } return new GenericCalc(call) { public Object evaluate(Evaluator evaluator) { for (Calc calc : calcs) { final Object o = calc.evaluate(evaluator); if (o != null) { return o; } } return null; } public Calc[] getCalcs() { return calcs; } }; } private static class ResolverImpl extends ResolverBase { public ResolverImpl() { super( "CoalesceEmpty", "CoalesceEmpty([, ...])", "Coalesces an empty cell value to a different value. All of the expressions must be of the same type (number or string).", Syntax.Function); } public FunDef resolve( Exp[] args, Validator validator, List conversions) { if (args.length < 1) { return null; } final int[] types = {Category.Numeric, Category.String}; final int[] argTypes = new int[args.length]; for (int type : types) { int matchingArgs = 0; conversions.clear(); for (int i = 0; i < args.length; i++) { if (validator.canConvert(i, args[i], type, conversions)) { matchingArgs++; } argTypes[i] = type; } if (matchingArgs == args.length) { return new CoalesceEmptyFunDef(this, type, argTypes); } } return null; } public boolean requiresExpression(int k) { return true; } } } // End CoalesceEmptyFunDef.java mondrian-3.11.0.1-R/src/main/mondrian/olap/fun/CorrelationFunDef.java000066400000000000000000000045151261646570300252410ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.olap.fun; import mondrian.calc.*; import mondrian.calc.impl.AbstractDoubleCalc; import mondrian.calc.impl.ValueCalc; import mondrian.mdx.ResolvedFunCall; import mondrian.olap.*; /** * Definition of the Correlation MDX function. * * @author jhyde * @since Mar 23, 2006 */ class CorrelationFunDef extends AbstractAggregateFunDef { static final ReflectiveMultiResolver Resolver = new ReflectiveMultiResolver( "Correlation", "Correlation(, [, ])", "Returns the correlation of two series evaluated over a set.", new String[]{"fnxn", "fnxnn"}, CorrelationFunDef.class); public CorrelationFunDef(FunDef dummyFunDef) { super(dummyFunDef); } public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) { final ListCalc listCalc = compiler.compileList(call.getArg(0)); final Calc calc1 = compiler.compileScalar(call.getArg(1), true); final Calc calc2 = call.getArgCount() > 2 ? compiler.compileScalar(call.getArg(2), true) : new ValueCalc(call); return new AbstractDoubleCalc( call, new Calc[] {listCalc, calc1, calc2}) { public double evaluateDouble(Evaluator evaluator) { final int savepoint = evaluator.savepoint(); try { evaluator.setNonEmpty(false); TupleList list = evaluateCurrentList(listCalc, evaluator); final double correlation = correlation( evaluator, list, calc1, calc2); return correlation; } finally { evaluator.restore(savepoint); } } public boolean dependsOn(Hierarchy hierarchy) { return anyDependsButFirst(getCalcs(), hierarchy); } }; } } // End CorrelationFunDef.java mondrian-3.11.0.1-R/src/main/mondrian/olap/fun/CountFunDef.java000066400000000000000000000113301261646570300240410ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.olap.fun; import mondrian.calc.*; import mondrian.calc.impl.AbstractIntegerCalc; import mondrian.mdx.ResolvedFunCall; import mondrian.olap.*; /** * Definition of the Count MDX function. * * @author jhyde * @since Mar 23, 2006 */ class CountFunDef extends AbstractAggregateFunDef { static final String[] ReservedWords = new String[] {"INCLUDEEMPTY", "EXCLUDEEMPTY"}; static final ReflectiveMultiResolver Resolver = new ReflectiveMultiResolver( "Count", "Count([, EXCLUDEEMPTY | INCLUDEEMPTY])", "Returns the number of tuples in a set, empty cells included unless the optional EXCLUDEEMPTY flag is used.", new String[]{"fnx", "fnxy"}, CountFunDef.class, ReservedWords); public CountFunDef(FunDef dummyFunDef) { super(dummyFunDef); } public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) { final Calc calc = compiler.compileAs( call.getArg(0), null, ResultStyle.ITERABLE_ANY); final boolean includeEmpty = call.getArgCount() < 2 || ((Literal) call.getArg(1)).getValue().equals( "INCLUDEEMPTY"); return new AbstractIntegerCalc( call, new Calc[] {calc}) { public int evaluateInteger(Evaluator evaluator) { final int savepoint = evaluator.savepoint(); try { evaluator.setNonEmpty(false); final int count; if (calc instanceof IterCalc) { IterCalc iterCalc = (IterCalc) calc; TupleIterable iterable = evaluateCurrentIterable(iterCalc, evaluator); count = count(evaluator, iterable, includeEmpty); } else { // must be ListCalc ListCalc listCalc = (ListCalc) calc; TupleList list = evaluateCurrentList(listCalc, evaluator); count = count(evaluator, list, includeEmpty); } return count; } finally { evaluator.restore(savepoint); } } public boolean dependsOn(Hierarchy hierarchy) { // COUNT(, INCLUDEEMPTY) is straightforward -- it // depends only on the dimensions that depends // on. if (super.dependsOn(hierarchy)) { return true; } if (includeEmpty) { return false; } // COUNT(, EXCLUDEEMPTY) depends only on the // dimensions that depends on, plus all // dimensions not masked by the set. return ! calc.getType().usesHierarchy(hierarchy, true); } }; /* RME OLD STUFF final ListCalc memberListCalc = compiler.compileList(call.getArg(0)); final boolean includeEmpty = call.getArgCount() < 2 || ((Literal) call.getArg(1)).getValue().equals( "INCLUDEEMPTY"); return new AbstractIntegerCalc( call, new Calc[] {memberListCalc}) { public int evaluateInteger(Evaluator evaluator) { List memberList = evaluateCurrentList(memberListCalc, evaluator); return count(evaluator, memberList, includeEmpty); } public boolean dependsOn(Dimension dimension) { // COUNT(, INCLUDEEMPTY) is straightforward -- it // depends only on the dimensions that depends // on. if (super.dependsOn(dimension)) { return true; } if (includeEmpty) { return false; } // COUNT(, EXCLUDEEMPTY) depends only on the // dimensions that depends on, plus all // dimensions not masked by the set. if (memberListCalc.getType().usesDimension(dimension, true)) { return false; } return true; } }; */ } } // End CountFunDef.java mondrian-3.11.0.1-R/src/main/mondrian/olap/fun/CovarianceFunDef.java000066400000000000000000000056551261646570300250400ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.olap.fun; import mondrian.calc.*; import mondrian.calc.impl.AbstractDoubleCalc; import mondrian.calc.impl.ValueCalc; import mondrian.mdx.ResolvedFunCall; import mondrian.olap.*; /** * Definition of the Covariance and * CovarianceN MDX functions. * * @author jhyde * @since Mar 23, 2006 */ class CovarianceFunDef extends FunDefBase { static final ReflectiveMultiResolver CovarianceResolver = new ReflectiveMultiResolver( "Covariance", "Covariance(, [, ])", "Returns the covariance of two series evaluated over a set (biased).", new String[]{"fnxn", "fnxnn"}, CovarianceFunDef.class); static final MultiResolver CovarianceNResolver = new ReflectiveMultiResolver( "CovarianceN", "CovarianceN(, [, ])", "Returns the covariance of two series evaluated over a set (unbiased).", new String[]{"fnxn", "fnxnn"}, CovarianceFunDef.class); private final boolean biased; public CovarianceFunDef(FunDef dummyFunDef) { super(dummyFunDef); this.biased = dummyFunDef.getName().equals("Covariance"); } public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) { final ListCalc listCalc = compiler.compileList(call.getArg(0)); final Calc calc1 = compiler.compileScalar(call.getArg(1), true); final Calc calc2 = call.getArgCount() > 2 ? compiler.compileScalar(call.getArg(2), true) : new ValueCalc(call); return new AbstractDoubleCalc(call, new Calc[] {listCalc, calc1, calc2}) { public double evaluateDouble(Evaluator evaluator) { TupleList memberList = listCalc.evaluateList(evaluator); final int savepoint = evaluator.savepoint(); try { evaluator.setNonEmpty(false); final double covariance = (Double) covariance( evaluator, memberList, calc1, calc2, biased); return covariance; } finally { evaluator.restore(savepoint); } } public boolean dependsOn(Hierarchy hierarchy) { return anyDependsButFirst(getCalcs(), hierarchy); } }; } } // End CovarianceFunDef.java mondrian-3.11.0.1-R/src/main/mondrian/olap/fun/CrossJoinFunDef.java000066400000000000000000001205711261646570300246720ustar00rootroot00000000000000/* // This software is subject to the terms of the Eclipse Public License v1.0 // Agreement, available at the following URL: // http://www.eclipse.org/legal/epl-v10.html. // You must accept the terms of that agreement to use this software. // // Copyright (C) 2002-2005 Julian Hyde // Copyright (C) 2005-2015 Pentaho and others // All Rights Reserved. */ package mondrian.olap.fun; import mondrian.calc.*; import mondrian.calc.impl.*; import mondrian.mdx.*; import mondrian.olap.*; import mondrian.olap.type.*; import mondrian.resource.MondrianResource; import mondrian.rolap.RolapEvaluator; import mondrian.util.CartesianProductList; import org.apache.log4j.Logger; import java.util.*; /** * Definition of the CrossJoin MDX function. * * @author jhyde * @since Mar 23, 2006 */ public class CrossJoinFunDef extends FunDefBase { private static final Logger LOGGER = Logger.getLogger(CrossJoinFunDef.class); static final ReflectiveMultiResolver Resolver = new ReflectiveMultiResolver( "Crossjoin", "Crossjoin(, )", "Returns the cross product of two sets.", new String[]{"fxxx"}, CrossJoinFunDef.class); static final StarCrossJoinResolver StarResolver = new StarCrossJoinResolver(); private static int counterTag = 0; // used to tell the difference between crossjoin expressions. private final int ctag = counterTag++; public CrossJoinFunDef(FunDef dummyFunDef) { super(dummyFunDef); } public Type getResultType(Validator validator, Exp[] args) { // CROSSJOIN(,) has type [Hie1] x [Hie2]. List list = new ArrayList(); for (Exp arg : args) { final Type type = arg.getType(); if (type instanceof SetType) { addTypes(type, list); } else if (getName().equals("*")) { // The "*" form of CrossJoin is lenient: args can be either // members/tuples or sets. addTypes(type, list); } else { throw Util.newInternal("arg to crossjoin must be a set"); } } final MemberType[] types = list.toArray(new MemberType[list.size()]); TupleType.checkHierarchies(types); final TupleType tupleType = new TupleType(types); return new SetType(tupleType); } /** * Adds a type to a list of types. If type is a {@link TupleType}, does so * recursively. * * @param type Type to add to list * @param list List of types to add to */ private static void addTypes(final Type type, List list) { if (type instanceof SetType) { SetType setType = (SetType) type; addTypes(setType.getElementType(), list); } else if (type instanceof TupleType) { TupleType tupleType = (TupleType) type; for (Type elementType : tupleType.elementTypes) { addTypes(elementType, list); } } else if (type instanceof MemberType) { list.add((MemberType) type); } else { throw Util.newInternal("Unexpected type: " + type); } } public Calc compileCall(final ResolvedFunCall call, ExpCompiler compiler) { // What is the desired return type? for (ResultStyle r : compiler.getAcceptableResultStyles()) { switch (r) { case ITERABLE: case ANY: // Consumer wants ITERABLE or ANY return compileCallIterable(call, compiler); case LIST: // Consumer wants (immutable) LIST return compileCallImmutableList(call, compiler); case MUTABLE_LIST: // Consumer MUTABLE_LIST return compileCallMutableList(call, compiler); } } throw ResultStyleException.generate( ResultStyle.ITERABLE_LIST_MUTABLELIST_ANY, compiler.getAcceptableResultStyles()); } /////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////// // Iterable /////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////// protected IterCalc compileCallIterable( final ResolvedFunCall call, ExpCompiler compiler) { final Calc calc1 = toIter(compiler, call.getArg(0)); final Calc calc2 = toIter(compiler, call.getArg(1)); Calc[] calcs = new Calc[] {calc1, calc2}; // The Calcs, 1 and 2, can be of type: Member or Member[] and // of ResultStyle: ITERABLE, LIST or MUTABLE_LIST, but // LIST and MUTABLE_LIST are treated the same; so // there are 16 possible combinations - sweet. // Check returned calc ResultStyles checkIterListResultStyles(calc1); checkIterListResultStyles(calc2); return new CrossJoinIterCalc(call, calcs); } private Calc toIter(ExpCompiler compiler, final Exp exp) { // Want iterable, immutable list or mutable list in that order // It is assumed that an immutable list is easier to get than // a mutable list. final Type type = exp.getType(); if (type instanceof SetType) { // this can return an IterCalc or ListCalc return compiler.compileAs( exp, null, ResultStyle.ITERABLE_LIST_MUTABLELIST); } else { // this always returns an IterCalc return new SetFunDef.ExprIterCalc( new DummyExp(new SetType(type)), new Exp[] {exp}, compiler, ResultStyle.ITERABLE_LIST_MUTABLELIST); } } class CrossJoinIterCalc extends AbstractIterCalc { CrossJoinIterCalc(ResolvedFunCall call, Calc[] calcs) { super(call, calcs); } public TupleIterable evaluateIterable(Evaluator evaluator) { ResolvedFunCall call = (ResolvedFunCall) exp; // Use a native evaluator, if more efficient. // TODO: Figure this out at compile time. SchemaReader schemaReader = evaluator.getSchemaReader(); NativeEvaluator nativeEvaluator = schemaReader.getNativeSetEvaluator( call.getFunDef(), call.getArgs(), evaluator, this); if (nativeEvaluator != null) { return (TupleIterable) nativeEvaluator.execute(ResultStyle.ITERABLE); } Calc[] calcs = getCalcs(); IterCalc calc1 = (IterCalc) calcs[0]; IterCalc calc2 = (IterCalc) calcs[1]; TupleIterable o1 = calc1.evaluateIterable(evaluator); if (o1 instanceof TupleList) { TupleList l1 = (TupleList) o1; l1 = nonEmptyOptimizeList(evaluator, l1, call); if (l1.isEmpty()) { return TupleCollections.emptyList(getType().getArity()); } o1 = l1; } TupleIterable o2 = calc2.evaluateIterable(evaluator); if (o2 instanceof TupleList) { TupleList l2 = (TupleList) o2; l2 = nonEmptyOptimizeList(evaluator, l2, call); if (l2.isEmpty()) { return TupleCollections.emptyList(getType().getArity()); } o2 = l2; } return makeIterable(o1, o2); } protected TupleIterable makeIterable( final TupleIterable it1, final TupleIterable it2) { // There is no knowledge about how large either it1 ore it2 // are or how many null members they might have, so all // one can do is iterate across them: // iterate across it1 and for each member iterate across it2 return new AbstractTupleIterable(it1.getArity() + it2.getArity()) { public TupleCursor tupleCursor() { return new AbstractTupleCursor(getArity()) { final TupleCursor i1 = it1.tupleCursor(); final int arity1 = i1.getArity(); TupleCursor i2 = TupleCollections.emptyList(1).tupleCursor(); final Member[] members = new Member[arity]; public boolean forward() { if (i2.forward()) { return true; } while (i1.forward()) { i2 = it2.tupleCursor(); if (i2.forward()) { return true; } } return false; } public List current() { i1.currentToArray(members, 0); i2.currentToArray(members, arity1); return Util.flatList(members); } @Override public Member member(int column) { if (column < arity1) { return i1.member(column); } else { return i2.member(column - arity1); } } @Override public void setContext(Evaluator evaluator) { i1.setContext(evaluator); i2.setContext(evaluator); } @Override public void currentToArray( Member[] members, int offset) { i1.currentToArray(members, offset); i2.currentToArray(members, offset + arity1); } }; } }; } } /////////////////////////////////////////////////////////////////////////// // Immutable List /////////////////////////////////////////////////////////////////////////// protected ListCalc compileCallImmutableList( final ResolvedFunCall call, ExpCompiler compiler) { final ListCalc listCalc1 = toList(compiler, call.getArg(0)); final ListCalc listCalc2 = toList(compiler, call.getArg(1)); Calc[] calcs = new Calc[] {listCalc1, listCalc2}; // The Calcs, 1 and 2, can be of type: Member or Member[] and // of ResultStyle: LIST or MUTABLE_LIST. // Since we want an immutable list as the result, it does not // matter whether the Calc list are of type // LIST and MUTABLE_LIST - they are treated the same; so // there are 4 possible combinations - even sweeter. // Check returned calc ResultStyles checkListResultStyles(listCalc1); checkListResultStyles(listCalc2); return new ImmutableListCalc(call, calcs); } /** * Compiles an expression to list (or mutable list) format. Never returns * null. * * @param compiler Compiler * @param exp Expression * @return Compiled expression that yields a list or mutable list */ private ListCalc toList(ExpCompiler compiler, final Exp exp) { // Want immutable list or mutable list in that order // It is assumed that an immutable list is easier to get than // a mutable list. final Type type = exp.getType(); if (type instanceof SetType) { final Calc calc = compiler.compileAs( exp, null, ResultStyle.LIST_MUTABLELIST); if (calc == null) { return compiler.compileList(exp, false); } return (ListCalc) calc; } else { return new SetFunDef.SetListCalc( new DummyExp(new SetType(type)), new Exp[] {exp}, compiler, ResultStyle.LIST_MUTABLELIST); } } abstract class BaseListCalc extends AbstractListCalc { protected BaseListCalc( ResolvedFunCall call, Calc[] calcs, boolean mutable) { super(call, calcs, mutable); } public TupleList evaluateList(Evaluator evaluator) { ResolvedFunCall call = (ResolvedFunCall) exp; // Use a native evaluator, if more efficient. // TODO: Figure this out at compile time. SchemaReader schemaReader = evaluator.getSchemaReader(); NativeEvaluator nativeEvaluator = schemaReader.getNativeSetEvaluator( call.getFunDef(), call.getArgs(), evaluator, this); if (nativeEvaluator != null) { return (TupleList) nativeEvaluator.execute(ResultStyle.LIST); } Calc[] calcs = getCalcs(); ListCalc listCalc1 = (ListCalc) calcs[0]; ListCalc listCalc2 = (ListCalc) calcs[1]; TupleList l1 = listCalc1.evaluateList(evaluator); TupleList l2 = listCalc2.evaluateList(evaluator); l1 = nonEmptyOptimizeList(evaluator, l1, call); if (l1.isEmpty()) { return TupleCollections.emptyList( l1.getArity() + l2.getArity()); } l2 = nonEmptyOptimizeList(evaluator, l2, call); if (l2.isEmpty()) { return TupleCollections.emptyList( l1.getArity() + l2.getArity()); } return makeList(l1, l2); } protected abstract TupleList makeList(TupleList l1, TupleList l2); } class ImmutableListCalc extends BaseListCalc { ImmutableListCalc( ResolvedFunCall call, Calc[] calcs) { super(call, calcs, false); } protected TupleList makeList(final TupleList l1, final TupleList l2) { final int arity = l1.getArity() + l2.getArity(); return new DelegatingTupleList( arity, new AbstractList>() { final List>> lists = Arrays.>>asList( l1, l2); final Member[] members = new Member[arity]; final CartesianProductList cartesianProductList = new CartesianProductList>( lists); @Override public List get(int index) { cartesianProductList.getIntoArray(index, members); return Util.flatList(members); } @Override public int size() { return cartesianProductList.size(); } }); } } protected ListCalc compileCallMutableList( final ResolvedFunCall call, ExpCompiler compiler) { final ListCalc listCalc1 = toList(compiler, call.getArg(0)); final ListCalc listCalc2 = toList(compiler, call.getArg(1)); Calc[] calcs = new Calc[] {listCalc1, listCalc2}; // The Calcs, 1 and 2, can be of type: Member or Member[] and // of ResultStyle: LIST or MUTABLE_LIST. // Since we want an mutable list as the result, it does not // matter whether the Calc list are of type // LIST and MUTABLE_LIST - they are treated the same, // regardless of type, one must materialize the result list; so // there are 4 possible combinations - even sweeter. // Check returned calc ResultStyles checkListResultStyles(listCalc1); checkListResultStyles(listCalc2); return new MutableListCalc(call, calcs); } class MutableListCalc extends BaseListCalc { MutableListCalc(ResolvedFunCall call, Calc[] calcs) { super(call, calcs, true); } @SuppressWarnings({"unchecked"}) protected TupleList makeList(final TupleList l1, final TupleList l2) { final int arity = l1.getArity() + l2.getArity(); final List members = new ArrayList(arity * l1.size() * l2.size()); for (List ma1 : l1) { for (List ma2 : l2) { members.addAll(ma1); members.addAll(ma2); } } return new ListTupleList(arity, members); } } protected TupleList nonEmptyOptimizeList( Evaluator evaluator, TupleList list, ResolvedFunCall call) { int opSize = MondrianProperties.instance().CrossJoinOptimizerSize.get(); if (list.isEmpty()) { return list; } try { final Object o = list.get(0); if (o instanceof Member) { // Cannot optimize high cardinality dimensions Dimension dimension = ((Member)o).getDimension(); if (dimension.isHighCardinality()) { LOGGER.warn( MondrianResource.instance() .HighCardinalityInDimension.str( dimension.getUniqueName())); return list; } } } catch (IndexOutOfBoundsException ioobe) { return TupleCollections.emptyList(list.getArity()); } int size = list.size(); if (size > opSize && evaluator.isNonEmpty()) { // instead of overflow exception try to further // optimize nonempty(crossjoin(a,b)) == // nonempty(crossjoin(nonempty(a),nonempty(b)) final int missCount = evaluator.getMissCount(); list = nonEmptyList(evaluator, list, call); size = list.size(); // list may be empty after nonEmpty optimization if (size == 0) { return TupleCollections.emptyList(list.getArity()); } final int missCount2 = evaluator.getMissCount(); final int puntMissCountListSize = 1000; if (missCount2 > missCount && size > puntMissCountListSize) { // We've hit some cells which are not in the cache. They // registered as non-empty, but we won't really know until // we've populated the cache. The cartesian product is still // huge, so let's quit now, and try again after the cache // has been loaded. // Return an empty list short circuits higher level // evaluation poping one all the way to the top. return TupleCollections.emptyList(list.getArity()); } } return list; } public static TupleList mutableCrossJoin( TupleList list1, TupleList list2) { return mutableCrossJoin(Arrays.asList(list1, list2)); } public static TupleList mutableCrossJoin( List lists) { long size = 1; int arity = 0; for (TupleList list : lists) { size *= (long) list.size(); arity += list.getArity(); } if (size == 0L) { return TupleCollections.emptyList(arity); } // Optimize nonempty(crossjoin(a,b)) == // nonempty(crossjoin(nonempty(a),nonempty(b)) // FIXME: If we're going to apply a NON EMPTY constraint later, it's // possible that the ultimate result will be much smaller. Util.checkCJResultLimit(size); // Now we can safely cast size to an integer. It still might be very // large - which means we're allocating a huge array which we might // pare down later by applying NON EMPTY constraints - which is a // concern. List result = new ArrayList((int) size * arity); final Member[] partialArray = new Member[arity]; final List partial = Arrays.asList(partialArray); cartesianProductRecurse(0, lists, partial, partialArray, 0, result); return new ListTupleList(arity, result); } private static void cartesianProductRecurse( int i, List lists, List partial, Member[] partialArray, int partialSize, List result) { final TupleList tupleList = lists.get(i); final int partialSizeNext = partialSize + tupleList.getArity(); final int iNext = i + 1; final TupleCursor cursor = tupleList.tupleCursor(); while (cursor.forward()) { cursor.currentToArray(partialArray, partialSize); if (i == lists.size() - 1) { result.addAll(partial); } else { cartesianProductRecurse( iNext, lists, partial, partialArray, partialSizeNext, result); } } } /** * Traverses the function call tree of * the non empty crossjoin function and populates the queryMeasureSet * with base measures */ private static class MeasureVisitor extends MdxVisitorImpl { private final Set queryMeasureSet; private final ResolvedFunCallFinder finder; private final Set activeMeasures = new HashSet(); /** * Creates a MeasureVisitor. * * @param queryMeasureSet Set of measures in query * * @param crossJoinCall Measures referencing this call should be * excluded from the list of measures found */ MeasureVisitor( Set queryMeasureSet, ResolvedFunCall crossJoinCall) { this.queryMeasureSet = queryMeasureSet; this.finder = new ResolvedFunCallFinder(crossJoinCall); } public Object visit(ParameterExpr parameterExpr) { final Parameter parameter = parameterExpr.getParameter(); final Type type = parameter.getType(); if (type instanceof mondrian.olap.type.MemberType) { final Object value = parameter.getValue(); if (value instanceof Member) { final Member member = (Member) value; process(member); } } return null; } public Object visit(MemberExpr memberExpr) { Member member = memberExpr.getMember(); process(member); return null; } private void process(final Member member) { if (member.isMeasure()) { if (member.isCalculated()) { if (activeMeasures.add(member)) { Exp exp = member.getExpression(); finder.found = false; exp.accept(finder); if (! finder.found) { exp.accept(this); } activeMeasures.remove(member); } } else { queryMeasureSet.add(member); } } } } /** * This is the entry point to the crossjoin non-empty optimizer code. * *

What one wants to determine is for each individual Member of the input * parameter list, a 'List-Member', whether across a slice there is any * data. * *

But what data? * *

For Members other than those in the list, the 'non-List-Members', * one wants to consider * all data across the scope of these other Members. For instance, if * Time is not a List-Member, then one wants to consider data * across All Time. Or, if Customer is not a List-Member, then * look at data across All Customers. The theory here, is if there * is no data for a particular Member of the list where all other * Members not part of the list are span their complete hierarchy, then * there is certainly no data for Members of that Hierarchy at a * more specific Level (more on this below). * *

When a Member that is a non-List-Member is part of a Hierarchy * that has an * All Member (hasAll="true"), then its very easy to make sure that * the All Member is used during the optimization. * If a non-List-Member is part of a Hierarchy that does not have * an All Member, then one must, in fact, iterate over all top-level * Members of the Hierarchy!!! - otherwise a List-Member might * be excluded because the optimization code was not looking everywhere. * *

Concerning default Members for those Hierarchies for the * non-List-Members, ignore them. What is wanted is either the * All Member or one must iterate across all top-level Members, what * happens to be the default Member of the Hierarchy is of no relevant. * *

The Measures Hierarchy has special considerations. First, there is * no All Measure. But, certainly one need only involve Measures * that are actually in the query... yes and no. For Calculated Measures * one must also get all of the non-Calculated Measures that make up * each Calculated Measure. Thus, one ends up iterating across all * Calculated and non-Calculated Measures that are explicitly * mentioned in the query as well as all Calculated and non-Calculated * Measures that are used to define the Calculated Measures in * the query. Why all of these? because this represents the total * scope of possible Measures that might yield a non-null value * for the List-Members and that is what we what to find. It might * be a super set, but thats ok; we just do not want to miss anything. * *

For other Members, the default Member is used, but for Measures one * should look for that data for all Measures associated with the query, not * just one Measure. For a dense dataset this may not be a problem or even * apparent, but for a sparse dataset, the first Measure may, in fact, have * not data but other Measures associated with the query might. * Hence, the solution here is to identify all Measures associated with the * query and then for each Member of the list, determine if there is any * data iterating across all Measures until non-null data is found or the * end of the Measures is reached. * *

This is a non-optimistic implementation. This means that an * element of the input parameter List is only not included in the * returned result List if for no combination of Measures, non-All * Members (for Hierarchies that have no All Members) and evaluator * default Members did the element evaluate to non-null. * * @param evaluator Evaluator * * @param list List of members or tuples * * @param call Calling ResolvedFunCall used to determine what Measures * to use * * @return List of elements from the input parameter list that have * evaluated to non-null. */ protected TupleList nonEmptyList( Evaluator evaluator, TupleList list, ResolvedFunCall call) { if (list.isEmpty()) { return list; } TupleList result = TupleCollections.createList( list.getArity(), (list.size() + 2) >> 1); // Get all of the Measures final Query query = evaluator.getQuery(); final String measureSetKey = "MEASURE_SET-" + ctag; Set measureSet = Util.cast((Set) query.getEvalCache(measureSetKey)); final String memberSetKey = "MEMBER_SET-" + ctag; Set memberSet = Util.cast((Set) query.getEvalCache(memberSetKey)); // If not in query cache, then create and place into cache. // This information is used for each iteration so it makes // sense to create and cache it. if (measureSet == null || memberSet == null) { measureSet = new HashSet(); memberSet = new HashSet(); Set queryMeasureSet = query.getMeasuresMembers(); MeasureVisitor measureVisitor = new MeasureVisitor(measureSet, call); // MemberExtractingVisitor will collect the dimension members // referenced within the measures in the query. // One or more measures may conflict with the members in the tuple, // overriding the context of the tuple member when determining // non-emptiness. MemberExtractingVisitor memVisitor = new MemberExtractingVisitor(memberSet, call, false); for (Member m : queryMeasureSet) { if (m.isCalculated()) { Exp exp = m.getExpression(); exp.accept(measureVisitor); exp.accept(memVisitor); } else { measureSet.add(m); } } Formula[] formula = query.getFormulas(); if (formula != null) { for (Formula f : formula) { f.accept(measureVisitor); } } query.putEvalCache(measureSetKey, measureSet); query.putEvalCache(memberSetKey, memberSet); } final String allMemberListKey = "ALL_MEMBER_LIST-" + ctag; List allMemberList = Util.cast((List) query.getEvalCache(allMemberListKey)); final String nonAllMembersKey = "NON_ALL_MEMBERS-" + ctag; Member[][] nonAllMembers = (Member[][]) query.getEvalCache(nonAllMembersKey); if (nonAllMembers == null) { // // Get all of the All Members and those Hierarchies that // do not have All Members. // Member[] evalMembers = evaluator.getMembers().clone(); List listMembers = list.get(0); // Remove listMembers from evalMembers and independentSlicerMembers for (Member lm : listMembers) { Hierarchy h = lm.getHierarchy(); for (int i = 0; i < evalMembers.length; i++) { Member em = evalMembers[i]; if ((em != null) && h.equals(em.getHierarchy())) { evalMembers[i] = null; } } } List slicerMembers = null; if (evaluator instanceof RolapEvaluator) { RolapEvaluator rev = (RolapEvaluator) evaluator; slicerMembers = rev.getSlicerMembers(); } // Iterate the list of slicer members, grouping them by hierarchy Map> mapOfSlicerMembers = new HashMap>(); if (slicerMembers != null) { for (Member slicerMember : slicerMembers) { Hierarchy hierarchy = slicerMember.getHierarchy(); if (!mapOfSlicerMembers.containsKey(hierarchy)) { mapOfSlicerMembers.put( hierarchy, new HashSet()); } mapOfSlicerMembers.get(hierarchy).add(slicerMember); } } // Now we have the non-List-Members, but some of them may not be // All Members (default Member need not be the All Member) and // for some Hierarchies there may not be an All Member. // So we create an array of Objects some elements of which are // All Members and others elements will be an array of all top-level // Members when there is not an All Member. SchemaReader schemaReader = evaluator.getSchemaReader(); allMemberList = new ArrayList(); List nonAllMemberList = new ArrayList(); Member em; boolean isSlicerMember; for (Member evalMember : evalMembers) { em = evalMember; isSlicerMember = slicerMembers != null && slicerMembers.contains(em); if (em == null) { // Above we might have removed some by setting them // to null. These are the CrossJoin axes. continue; } if (em.isMeasure()) { continue; } // // The unconstrained members need to be replaced by the "All" // member based on its usage and property. This is currently // also the behavior of native cross join evaluation. See // SqlConstraintUtils.addContextConstraint() // // on slicer? | calculated? | replace with All? // ----------------------------------------------- // Y | Y | Y always // Y | N | N // N | Y | N // N | N | Y if not "All" // ----------------------------------------------- // if ((isSlicerMember && !em.isCalculated()) || (!isSlicerMember && em.isCalculated())) { // If the slicer contains multiple members from this one's // hierarchy, add them to nonAllMemberList if (isSlicerMember) { Set hierarchySlicerMembers = mapOfSlicerMembers.get(em.getHierarchy()); if (hierarchySlicerMembers.size() > 1) { nonAllMemberList.add( hierarchySlicerMembers.toArray( new Member[hierarchySlicerMembers.size()])); } } continue; } // If the member is not the All member; // or if it is a slicer member, // replace with the "all" member. if (isSlicerMember || !em.isAll()) { Hierarchy h = em.getHierarchy(); final List rootMemberList = schemaReader.getHierarchyRootMembers(h); if (h.hasAll()) { // The Hierarchy has an All member boolean found = false; for (Member m : rootMemberList) { if (m.isAll()) { allMemberList.add(m); found = true; break; } } if (!found) { System.out.println( "CrossJoinFunDef.nonEmptyListNEW: ERROR"); } } else { // The Hierarchy does NOT have an All member Member[] rootMembers = rootMemberList.toArray( new Member[rootMemberList.size()]); nonAllMemberList.add(rootMembers); } } } nonAllMembers = nonAllMemberList.toArray( new Member[nonAllMemberList.size()][]); query.putEvalCache(allMemberListKey, allMemberList); query.putEvalCache(nonAllMembersKey, nonAllMembers); } // // Determine if there is any data. // // Put all of the All Members into Evaluator final int savepoint = evaluator.savepoint(); try { evaluator.setContext(allMemberList); // Iterate over elements of the input list. If for any // combination of // Measure and non-All Members evaluation is non-null, then // add it to the result List. final TupleCursor cursor = list.tupleCursor(); while (cursor.forward()) { cursor.setContext(evaluator); for (Member member : memberSet) { // memberSet contains members referenced within measures. // Make sure that we don't incorrectly assume a context // that will be changed by the measure, so conservatively // push context to [All] for each of the associated // hierarchies. evaluator.setContext(member.getHierarchy().getAllMember()); } if (checkData( nonAllMembers, nonAllMembers.length - 1, measureSet, evaluator)) { result.addCurrent(cursor); } } return result; } finally { evaluator.restore(savepoint); } } /** * Return true if for some combination of Members * from the nonAllMembers array of Member arrays and Measures from * the Set of Measures evaluate to a non-null value. Even if a * particular combination is non-null, all combinations are tested * just to make sure that the data is loaded. * * @param nonAllMembers array of Member arrays of top-level Members * for Hierarchies that have no All Member. * @param cnt which Member array is to be processed. * @param measureSet Set of all that should be tested against. * @param evaluator the Evaluator. * @return True if at least one combination evaluated to non-null. */ private static boolean checkData( Member[][] nonAllMembers, int cnt, Set measureSet, Evaluator evaluator) { if (cnt < 0) { // no measures found, use standard algorithm if (measureSet.isEmpty()) { Object value = evaluator.evaluateCurrent(); if (value != null && !(value instanceof Throwable)) { return true; } } else { // Here we evaluate across all measures just to // make sure that the data is all loaded boolean found = false; for (Member measure : measureSet) { evaluator.setContext(measure); Object value = evaluator.evaluateCurrent(); if (value != null && !(value instanceof Throwable)) { found = true; } } return found; } } else { boolean found = false; for (Member m : nonAllMembers[cnt]) { evaluator.setContext(m); if (checkData(nonAllMembers, cnt - 1, measureSet, evaluator)) { found = true; } } return found; } return false; } private static class StarCrossJoinResolver extends MultiResolver { public StarCrossJoinResolver() { super( "*", " * ", "Returns the cross product of two sets.", new String[]{"ixxx", "ixmx", "ixxm", "ixmm"}); } public FunDef resolve( Exp[] args, Validator validator, List conversions) { // This function only applies in contexts which require a set. // Elsewhere, "*" is the multiplication operator. // This means that [Measures].[Unit Sales] * [Gender].[M] is // well-defined. if (validator.requiresExpression()) { return null; } return super.resolve(args, validator, conversions); } protected FunDef createFunDef(Exp[] args, FunDef dummyFunDef) { return new CrossJoinFunDef(dummyFunDef); } } } // End CrossJoinFunDef.java mondrian-3.11.0.1-R/src/main/mondrian/olap/fun/CustomizedFunctionTable.java000066400000000000000000000036341261646570300264750ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.olap.fun; import mondrian.olap.FunDef; import mondrian.olap.FunTable; import java.util.HashSet; import java.util.Set; /** * Interface to build a customized function table, selecting functions from the * set of supported functions in an instance of {@link BuiltinFunTable}. * * @author Rushan Chen */ public class CustomizedFunctionTable extends FunTableImpl { Set supportedBuiltinFunctions; Set specialFunctions; public CustomizedFunctionTable(Set builtinFunctions) { supportedBuiltinFunctions = builtinFunctions; this.specialFunctions = new HashSet(); } public CustomizedFunctionTable( Set builtinFunctions, Set specialFunctions) { this.supportedBuiltinFunctions = builtinFunctions; this.specialFunctions = specialFunctions; } public void defineFunctions(Builder builder) { final FunTable builtinFunTable = BuiltinFunTable.instance(); // Includes all the keywords form builtin function table for (String reservedWord : builtinFunTable.getReservedWords()) { builder.defineReserved(reservedWord); } // Add supported builtin functions for (Resolver resolver : builtinFunTable.getResolvers()) { if (supportedBuiltinFunctions.contains(resolver.getName())) { builder.define(resolver); } } // Add special function definitions for (FunDef funDef : specialFunctions) { builder.define(funDef); } } } // End CustomizedFunctionTable.java mondrian-3.11.0.1-R/src/main/mondrian/olap/fun/DescendantsFunDef.java000066400000000000000000000402761261646570300252170ustar00rootroot00000000000000/* // This software is subject to the terms of the Eclipse Public License v1.0 // Agreement, available at the following URL: // http://www.eclipse.org/legal/epl-v10.html. // You must accept the terms of that agreement to use this software. // // Copyright (C) 2002-2005 Julian Hyde // Copyright (C) 2005-2011 Pentaho and others // All Rights Reserved. */ package mondrian.olap.fun; import mondrian.calc.*; import mondrian.calc.impl.AbstractListCalc; import mondrian.calc.impl.UnaryTupleList; import mondrian.mdx.*; import mondrian.olap.*; import mondrian.olap.type.*; import mondrian.resource.MondrianResource; import java.util.*; /** * Definition of the Descendants MDX function. * * @author jhyde * @since Mar 23, 2006 */ class DescendantsFunDef extends FunDefBase { static final ReflectiveMultiResolver Resolver = new ReflectiveMultiResolver( "Descendants", "Descendants([, [, ]])", "Returns the set of descendants of a member at a specified level, optionally including or excluding descendants in other levels.", new String[]{"fxm", "fxml", "fxmly", "fxmn", "fxmny", "fxmey"}, DescendantsFunDef.class, Flag.getNames()); static final ReflectiveMultiResolver Resolver2 = new ReflectiveMultiResolver( "Descendants", "Descendants([, [, ]])", "Returns the set of descendants of a set of members at a specified level, optionally including or excluding descendants in other levels.", new String[]{"fxx", "fxxl", "fxxly", "fxxn", "fxxny", "fxxey"}, DescendantsFunDef.class, Flag.getNames()); public DescendantsFunDef(FunDef dummyFunDef) { super(dummyFunDef); } public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) { final Type type0 = call.getArg(0).getType(); if (type0 instanceof SetType) { final SetType setType = (SetType) type0; if (setType.getElementType() instanceof TupleType) { throw MondrianResource.instance() .DescendantsAppliedToSetOfTuples.ex(); } MemberType memberType = (MemberType) setType.getElementType(); final Hierarchy hierarchy = memberType.getHierarchy(); if (hierarchy == null) { throw MondrianResource.instance().CannotDeduceTypeOfSet.ex(); } // Convert // Descendants(, ) // into // Generate(, Descendants(.CurrentMember, )) Exp[] descendantsArgs = call.getArgs().clone(); descendantsArgs[0] = new UnresolvedFunCall( "CurrentMember", Syntax.Property, new Exp[] { new HierarchyExpr(hierarchy) }); final ResolvedFunCall generateCall = (ResolvedFunCall) compiler.getValidator().validate( new UnresolvedFunCall( "Generate", new Exp[] { call.getArg(0), new UnresolvedFunCall( "Descendants", descendantsArgs) }), false); return generateCall.accept(compiler); } final MemberCalc memberCalc = compiler.compileMember(call.getArg(0)); Flag flag = Flag.SELF; if (call.getArgCount() == 1) { flag = Flag.SELF_BEFORE_AFTER; } final boolean depthSpecified = call.getArgCount() >= 2 && call.getArg(1).getType() instanceof NumericType; final boolean depthEmpty = call.getArgCount() >= 2 && call.getArg(1).getType() instanceof EmptyType; if (call.getArgCount() >= 3) { flag = FunUtil.getLiteralArg(call, 2, Flag.SELF, Flag.class); } if (call.getArgCount() >= 2 && depthEmpty) { if (flag != Flag.LEAVES) { throw Util.newError( "depth must be specified unless DESC_FLAG is LEAVES"); } } if ((depthSpecified || depthEmpty) && flag.leaves) { final IntegerCalc depthCalc = depthSpecified ? compiler.compileInteger(call.getArg(1)) : null; return new AbstractListCalc( call, new Calc[] {memberCalc, depthCalc}) { public TupleList evaluateList(Evaluator evaluator) { final Member member = memberCalc.evaluateMember(evaluator); List result = new ArrayList(); int depth = -1; if (depthCalc != null) { depth = depthCalc.evaluateInteger(evaluator); if (depth < 0) { depth = -1; // no limit } } final SchemaReader schemaReader = evaluator.getSchemaReader(); descendantsLeavesByDepth( member, result, schemaReader, depth); hierarchizeMemberList(result, false); return new UnaryTupleList(result); } }; } else if (depthSpecified) { final IntegerCalc depthCalc = compiler.compileInteger(call.getArg(1)); final Flag flag1 = flag; return new AbstractListCalc( call, new Calc[] {memberCalc, depthCalc}) { public TupleList evaluateList(Evaluator evaluator) { final Member member = memberCalc.evaluateMember(evaluator); List result = new ArrayList(); final int depth = depthCalc.evaluateInteger(evaluator); final SchemaReader schemaReader = evaluator.getSchemaReader(); descendantsByDepth( member, result, schemaReader, depth, flag1.before, flag1.self, flag1.after, evaluator); hierarchizeMemberList(result, false); return new UnaryTupleList(result); } }; } else { final LevelCalc levelCalc = call.getArgCount() > 1 ? compiler.compileLevel(call.getArg(1)) : null; final Flag flag2 = flag; return new AbstractListCalc( call, new Calc[] {memberCalc, levelCalc}) { public TupleList evaluateList(Evaluator evaluator) { final Evaluator context = evaluator.isNonEmpty() ? evaluator : null; final Member member = memberCalc.evaluateMember(evaluator); List result = new ArrayList(); final SchemaReader schemaReader = evaluator.getSchemaReader(); final Level level = levelCalc != null ? levelCalc.evaluateLevel(evaluator) : member.getLevel(); descendantsByLevel( schemaReader, member, level, result, flag2.before, flag2.self, flag2.after, flag2.leaves, context); hierarchizeMemberList(result, false); return new UnaryTupleList(result); } }; } } private static void descendantsByDepth( Member member, List result, final SchemaReader schemaReader, final int depthLimitFinal, final boolean before, final boolean self, final boolean after, final Evaluator context) { List children = new ArrayList(); children.add(member); for (int depth = 0;; ++depth) { if (depth == depthLimitFinal) { if (self) { result.addAll(children); } if (!after) { break; // no more results after this level } } else if (depth < depthLimitFinal) { if (before) { result.addAll(children); } } else { if (after) { result.addAll(children); } else { break; // no more results after this level } } children = schemaReader.getMemberChildren(children, context); if (children.size() == 0) { break; } } } /** * Populates 'result' with the descendants at the leaf level at depth * 'depthLimit' or less. If 'depthLimit' is -1, does not apply a depth * constraint. */ private static void descendantsLeavesByDepth( final Member member, final List result, final SchemaReader schemaReader, final int depthLimit) { if (!schemaReader.isDrillable(member)) { if (depthLimit >= 0) { result.add(member); } return; } List children = new ArrayList(); children.add(member); for (int depth = 0; depthLimit == -1 || depth <= depthLimit; ++depth) { children = schemaReader.getMemberChildren(children); if (children.size() == 0) { throw Util.newInternal("drillable member must have children"); } List nextChildren = new ArrayList(); for (Member child : children) { // TODO: Implement this more efficiently. The current // implementation of isDrillable for a parent-child hierarchy // simply retrieves the children sees whether there are any, // so we end up fetching each member's children twice. if (schemaReader.isDrillable(child)) { nextChildren.add(child); } else { result.add(child); } } if (nextChildren.isEmpty()) { return; } children = nextChildren; } } /** * Finds all descendants of a member which are before/at/after a level, * and/or are leaves (have no descendants) and adds them to a result list. * * @param schemaReader Member reader * @param ancestor Member to find descendants of * @param level Level relative to which to filter, must not be null * @param result Result list * @param before Whether to output members above level * @param self Whether to output members at level * @param after Whether to output members below level * @param leaves Whether to output members which are leaves * @param context Evaluation context; determines criteria by which the * result set should be filtered */ static void descendantsByLevel( SchemaReader schemaReader, Member ancestor, Level level, List result, boolean before, boolean self, boolean after, boolean leaves, Evaluator context) { // We find the descendants of a member by making breadth-first passes // down the hierarchy. Initially the list just contains the ancestor. // Then we find its children. We add those children to the result if // they fulfill the before/self/after conditions relative to the level. // // We add a child to the "fertileMembers" list if some of its children // might be in the result. Again, this depends upon the // before/self/after conditions. // // Note that for some member readers -- notably the // RestrictedMemberReader, when it is reading a ragged hierarchy -- the // children of a member do not always belong to the same level. For // example, the children of USA include WA (a state) and Washington // (a city). This is why we repeat the before/self/after logic for // each member. final int levelDepth = level.getDepth(); List members = Collections.singletonList(ancestor); // Each pass, "fertileMembers" has the same contents as "members", // except that we omit members whose children we are not interested // in. We allocate it once, and clear it each pass, to save a little // memory allocation. if (leaves) { assert !before && !self && !after; do { List nextMembers = new ArrayList(); for (Member member : members) { final int currentDepth = member.getLevel().getDepth(); List childMembers = schemaReader.getMemberChildren(member, context); if (childMembers.size() == 0) { // this member is a leaf -- add it if (currentDepth == levelDepth) { result.add(member); } } else { // this member is not a leaf -- add its children // to the list to be considered next iteration if (currentDepth <= levelDepth) { nextMembers.addAll(childMembers); } } } members = nextMembers; } while (members.size() > 0); } else { List fertileMembers = new ArrayList(); do { fertileMembers.clear(); for (Member member : members) { final int currentDepth = member.getLevel().getDepth(); if (currentDepth == levelDepth) { if (self) { result.add(member); } if (after) { // we are interested in member's children fertileMembers.add(member); } } else if (currentDepth < levelDepth) { if (before) { result.add(member); } fertileMembers.add(member); } else { if (after) { result.add(member); fertileMembers.add(member); } } } members = schemaReader.getMemberChildren(fertileMembers, context); } while (members.size() > 0); } } /** * Enumeration of the flags allowed to the DESCENDANTS * function. */ enum Flag { SELF(true, false, false, false), AFTER(false, true, false, false), BEFORE(false, false, true, false), BEFORE_AND_AFTER(false, true, true, false), SELF_AND_AFTER(true, true, false, false), SELF_AND_BEFORE(true, false, true, false), SELF_BEFORE_AFTER(true, true, true, false), LEAVES(false, false, false, true); private final boolean self; private final boolean after; private final boolean before; private final boolean leaves; Flag(boolean self, boolean after, boolean before, boolean leaves) { this.self = self; this.after = after; this.before = before; this.leaves = leaves; } public static String[] getNames() { List names = new ArrayList(); for (Flag flags : Flag.class.getEnumConstants()) { names.add(flags.name()); } return names.toArray(new String[names.size()]); } } } // End DescendantsFunDef.java mondrian-3.11.0.1-R/src/main/mondrian/olap/fun/DimensionDimensionFunDef.java000066400000000000000000000025211261646570300265460ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.olap.fun; import mondrian.calc.Calc; import mondrian.calc.ExpCompiler; import mondrian.calc.impl.ConstantCalc; import mondrian.mdx.DimensionExpr; import mondrian.mdx.ResolvedFunCall; import mondrian.olap.Dimension; import mondrian.olap.type.DimensionType; /** * Definition of the <Dimension>.Dimension * MDX builtin function. * * @author jhyde * @since Jul 20, 2009 */ class DimensionDimensionFunDef extends FunDefBase { public static final FunDefBase INSTANCE = new DimensionDimensionFunDef(); private DimensionDimensionFunDef() { super( "Dimension", "Returns the dimension that contains a specified hierarchy.", "pdd"); } public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) { Dimension dimension = ((DimensionExpr) call.getArg(0)).getDimension(); return new ConstantCalc( DimensionType.forDimension(dimension), dimension); } } // End DimensionDimensionFunDef.java mondrian-3.11.0.1-R/src/main/mondrian/olap/fun/DimensionsNumericFunDef.java000066400000000000000000000043151261646570300264110ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.olap.fun; import mondrian.calc.*; import mondrian.calc.impl.AbstractHierarchyCalc; import mondrian.mdx.ResolvedFunCall; import mondrian.olap.*; import mondrian.olap.type.HierarchyType; import mondrian.olap.type.Type; import mondrian.rolap.RolapCube; import mondrian.rolap.RolapHierarchy; import java.util.List; /** * Definition of the Dimensions(<Numeric Expression>) * MDX builtin function. * *

NOTE: Actually returns a hierarchy. This is consistent with Analysis * Services. * * @author jhyde * @since Jul 20, 2009 */ class DimensionsNumericFunDef extends FunDefBase { public static final FunDefBase INSTANCE = new DimensionsNumericFunDef(); private DimensionsNumericFunDef() { super( "Dimensions", "Returns the hierarchy whose zero-based position within the cube " + "is specified by a numeric expression.", "fhn"); } public Type getResultType(Validator validator, Exp[] args) { return HierarchyType.Unknown; } public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) { final IntegerCalc integerCalc = compiler.compileInteger(call.getArg(0)); return new AbstractHierarchyCalc(call, new Calc[] {integerCalc}) { public Hierarchy evaluateHierarchy(Evaluator evaluator) { int n = integerCalc.evaluateInteger(evaluator); return nthHierarchy(evaluator, n); } }; } RolapHierarchy nthHierarchy(Evaluator evaluator, int n) { RolapCube cube = (RolapCube) evaluator.getCube(); List hierarchies = cube.getHierarchies(); if (n >= hierarchies.size() || n < 0) { throw newEvalException( this, "Index '" + n + "' out of bounds"); } return hierarchies.get(n); } } // End DimensionsNumericFunDef.java mondrian-3.11.0.1-R/src/main/mondrian/olap/fun/DimensionsStringFunDef.java000066400000000000000000000050751261646570300262610ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.olap.fun; import mondrian.calc.*; import mondrian.calc.impl.AbstractHierarchyCalc; import mondrian.mdx.ResolvedFunCall; import mondrian.olap.*; import mondrian.olap.type.HierarchyType; import mondrian.olap.type.Type; /** * Definition of the Dimensions(<String Expression>) * MDX builtin function. * *

NOTE: Actually returns a hierarchy. This is consistent with Analysis * Services. * * @author jhyde * @since Jul 20, 2009 */ class DimensionsStringFunDef extends FunDefBase { public static final FunDefBase INSTANCE = new DimensionsStringFunDef(); private DimensionsStringFunDef() { super( "Dimensions", "Returns the hierarchy whose name is specified by a string.", "fhS"); } public Type getResultType(Validator validator, Exp[] args) { return HierarchyType.Unknown; } public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) { final StringCalc stringCalc = compiler.compileString(call.getArg(0)); return new AbstractHierarchyCalc(call, new Calc[] {stringCalc}) { public Hierarchy evaluateHierarchy(Evaluator evaluator) { String dimensionName = stringCalc.evaluateString(evaluator); return findHierarchy(dimensionName, evaluator); } }; } /** * Looks up a hierarchy in the current cube with a given name. * * @param name Hierarchy name * @param evaluator Evaluator * @return Hierarchy */ Hierarchy findHierarchy(String name, Evaluator evaluator) { if (name.indexOf("[") == -1) { name = Util.quoteMdxIdentifier(name); } OlapElement o = evaluator.getSchemaReader().lookupCompound( evaluator.getCube(), parseIdentifier(name), false, Category.Hierarchy); if (o instanceof Hierarchy) { return (Hierarchy) o; } else if (o == null) { throw newEvalException( this, "Hierarchy '" + name + "' not found"); } else { throw newEvalException( this, "Hierarchy(" + name + ") found " + o); } } } // End DimensionsStringFunDef.java mondrian-3.11.0.1-R/src/main/mondrian/olap/fun/DistinctFunDef.java000066400000000000000000000036301261646570300245360ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.olap.fun; import mondrian.calc.*; import mondrian.calc.impl.AbstractListCalc; import mondrian.mdx.ResolvedFunCall; import mondrian.olap.Evaluator; import mondrian.olap.Member; import java.util.*; /** * Definition of the Distinct MDX function. * *

Syntax: *

Distinct(<Set>)
* * @author jhyde * @since Jun 10, 2007 */ class DistinctFunDef extends FunDefBase { public static final DistinctFunDef instance = new DistinctFunDef(); private DistinctFunDef() { super( "Distinct", "Eliminates duplicate tuples from a set.", "fxx"); } public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) { final ListCalc listCalc = compiler.compileList(call.getArg(0)); return new CalcImpl(call, listCalc); } static class CalcImpl extends AbstractListCalc { private final ListCalc listCalc; public CalcImpl(ResolvedFunCall call, ListCalc listCalc) { super(call, new Calc[]{listCalc}); this.listCalc = listCalc; } public TupleList evaluateList(Evaluator evaluator) { TupleList list = listCalc.evaluateList(evaluator); Set> set = new HashSet>(list.size()); TupleList result = list.cloneList(list.size()); for (List element : list) { if (set.add(element)) { result.add(element); } } return result; } } } // End DistinctFunDef.java mondrian-3.11.0.1-R/src/main/mondrian/olap/fun/DrilldownLevelFunDef.java000066400000000000000000000131661261646570300257100ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.olap.fun; import mondrian.calc.*; import mondrian.calc.impl.AbstractListCalc; import mondrian.calc.impl.UnaryTupleList; import mondrian.mdx.ResolvedFunCall; import mondrian.olap.*; import java.util.ArrayList; import java.util.List; /** * Definition of the DrilldownLevel MDX function. * *

Syntax: * *

 * DrilldownLevel(Set_Expression[, Level_Expression])
 * DrilldownLevel(Set_Expression, , Numeric_Expression)
 * 
* * @author jhyde * @since Mar 23, 2006 */ class DrilldownLevelFunDef extends FunDefBase { static final ReflectiveMultiResolver Resolver = new ReflectiveMultiResolver( "DrilldownLevel", "DrilldownLevel([, ]) or DrilldownLevel(, , )", "Drills down the members of a set, at a specified level, to one level below. Alternatively, drills down on a specified dimension in the set.", new String[]{"fxx", "fxxl", "fxxen"}, DrilldownLevelFunDef.class); public DrilldownLevelFunDef(FunDef dummyFunDef) { super(dummyFunDef); } public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) { final ListCalc listCalc = compiler.compileList(call.getArg(0)); final LevelCalc levelCalc = call.getArgCount() > 1 && call.getArg(1).getType() instanceof mondrian.olap.type.LevelType ? compiler.compileLevel(call.getArg(1)) : null; final IntegerCalc indexCalc = call.getArgCount() > 2 ? compiler.compileInteger(call.getArg(2)) : null; final int arity = listCalc.getType().getArity(); if (indexCalc == null) { return new AbstractListCalc(call, new Calc[] {listCalc, levelCalc}) { public TupleList evaluateList(Evaluator evaluator) { TupleList list = listCalc.evaluateList(evaluator); if (list.size() == 0) { return list; } int searchDepth = -1; if (levelCalc != null) { Level level = levelCalc.evaluateLevel(evaluator); searchDepth = level.getDepth(); } return new UnaryTupleList( drill(searchDepth, list.slice(0), evaluator)); } }; } else { return new AbstractListCalc(call, new Calc[] {listCalc, indexCalc}) { public TupleList evaluateList(Evaluator evaluator) { TupleList list = listCalc.evaluateList(evaluator); if (list.isEmpty()) { return list; } final int index = indexCalc.evaluateInteger(evaluator); if (index < 0 || index >= arity) { return list; } TupleList result = TupleCollections.createList(arity); final SchemaReader schemaReader = evaluator.getSchemaReader(); final Member[] tupleClone = new Member[arity]; for (List tuple : list) { result.add(tuple); final List children = schemaReader.getMemberChildren(tuple.get(index)); for (Member child : children) { tuple.toArray(tupleClone); tupleClone[index] = child; result.addTuple(tupleClone); } } return result; } }; } } List drill(int searchDepth, List list, Evaluator evaluator) { if (searchDepth == -1) { searchDepth = list.get(0).getLevel().getDepth(); for (int i = 1, m = list.size(); i < m; i++) { Member member = list.get(i); int memberDepth = member.getLevel().getDepth(); if (memberDepth > searchDepth) { searchDepth = memberDepth; } } } List drilledSet = new ArrayList(); for (int i = 0, m = list.size(); i < m; i++) { Member member = list.get(i); drilledSet.add(member); Member nextMember = i == (m - 1) ? null : list.get(i + 1); // // This member is drilled if it's at the correct depth // and if it isn't drilled yet. A member is considered // to be "drilled" if it is immediately followed by // at least one descendant // if (member.getLevel().getDepth() == searchDepth && !FunUtil.isAncestorOf(member, nextMember, true)) { final List childMembers = evaluator.getSchemaReader().getMemberChildren(member); for (Member childMember : childMembers) { drilledSet.add(childMember); } } } return drilledSet; } } // End DrilldownLevelFunDef.java mondrian-3.11.0.1-R/src/main/mondrian/olap/fun/DrilldownLevelTopBottomFunDef.java000066400000000000000000000144401261646570300275540ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.olap.fun; import mondrian.calc.*; import mondrian.calc.impl.*; import mondrian.mdx.ResolvedFunCall; import mondrian.olap.*; import mondrian.olap.type.ScalarType; import java.util.ArrayList; import java.util.List; /** * Definition of the DrilldownLevelTop and * DrilldownLevelBottom MDX builtin functions. * *

Syntax: * *

* DrilldownLevelTop(Set_Expression, Count [, [Level_Expression][, * Numeric_Expression]])
* DrilldownLevelBottom(Set_Expression, Count [, [Level_Expression][, * Numeric_Expression]]) *
* * @author jhyde * @since Oct 18, 2007 */ class DrilldownLevelTopBottomFunDef extends FunDefBase { final boolean top; static final MultiResolver DrilldownLevelTopResolver = new MultiResolver( "DrilldownLevelTop", "DrilldownLevelTop(Set_Expression, Count [, [Level_Expression][, Numeric_Expression]])", "Drills down the topmost members of a set, at a specified level, to one level below.", new String[] {"fxxn", "fxxnl", "fxxnln", "fxxnen"}) { protected FunDef createFunDef(Exp[] args, FunDef dummyFunDef) { return new DrilldownLevelTopBottomFunDef(dummyFunDef, true); } }; static final MultiResolver DrilldownLevelBottomResolver = new MultiResolver( "DrilldownLevelBottom", "DrilldownLevelBottom(Set_Expression, Count [, [Level_Expression][, Numeric_Expression]])", "Drills down the bottommost members of a set, at a specified level, to one level below.", new String[] {"fxxn", "fxxnl", "fxxnln", "fxxnen"}) { protected FunDef createFunDef(Exp[] args, FunDef dummyFunDef) { return new DrilldownLevelTopBottomFunDef(dummyFunDef, false); } }; public DrilldownLevelTopBottomFunDef( FunDef dummyFunDef, final boolean top) { super(dummyFunDef); this.top = top; } public Calc compileCall(final ResolvedFunCall call, ExpCompiler compiler) { // Compile the member list expression. Ask for a mutable list, because // we're going to insert members into it later. final ListCalc listCalc = compiler.compileList(call.getArg(0), true); final IntegerCalc integerCalc = compiler.compileInteger(call.getArg(1)); final LevelCalc levelCalc = call.getArgCount() > 2 && call.getArg(2).getCategory() != Category.Empty ? compiler.compileLevel(call.getArg(2)) : null; final Calc orderCalc = call.getArgCount() > 3 ? compiler.compileScalar(call.getArg(3), true) : new ValueCalc( new DummyExp( new ScalarType())); return new AbstractListCalc( call, new Calc[] {listCalc, integerCalc, orderCalc}) { public TupleList evaluateList(Evaluator evaluator) { // Use a native evaluator, if more efficient. // TODO: Figure this out at compile time. SchemaReader schemaReader = evaluator.getSchemaReader(); NativeEvaluator nativeEvaluator = schemaReader.getNativeSetEvaluator( call.getFunDef(), call.getArgs(), evaluator, this); if (nativeEvaluator != null) { return (TupleList) nativeEvaluator.execute(ResultStyle.LIST); } TupleList list = listCalc.evaluateList(evaluator); int n = integerCalc.evaluateInteger(evaluator); if (n == FunUtil.IntegerNull || n <= 0) { return list; } Level level; if (levelCalc == null) { level = null; } else { level = levelCalc.evaluateLevel(evaluator); } List result = new ArrayList(); assert list.getArity() == 1; for (Member member : list.slice(0)) { result.add(member); if (level != null && member.getLevel() != level) { if (level.getDimension() != member.getDimension()) { throw newEvalException( DrilldownLevelTopBottomFunDef.this, "Level '" + level.getUniqueName() + "' not compatible with member '" + member.getUniqueName() + "'"); } continue; } List children = schemaReader.getMemberChildren(member); final int savepoint = evaluator.savepoint(); List sortedChildren; try { evaluator.setNonEmpty(false); sortedChildren = sortMembers( evaluator, children, children, orderCalc, top, true); } finally { evaluator.restore(savepoint); } int x = Math.min(n, sortedChildren.size()); for (int i = 0; i < x; i++) { result.add(sortedChildren.get(i)); } } return new UnaryTupleList(result); } public boolean dependsOn(Hierarchy hierarchy) { return anyDependsButFirst(getCalcs(), hierarchy); } }; } } // End DrilldownLevelTopBottomFunDef.java mondrian-3.11.0.1-R/src/main/mondrian/olap/fun/DrilldownMemberFunDef.java000066400000000000000000000106151261646570300260440ustar00rootroot00000000000000/* // This software is subject to the terms of the Eclipse Public License v1.0 // Agreement, available at the following URL: // http://www.eclipse.org/legal/epl-v10.html. // You must accept the terms of that agreement to use this software. // // Copyright (C) 2004-2005 Julian Hyde // Copyright (C) 2005-2011 Pentaho // All Rights Reserved. */ package mondrian.olap.fun; import mondrian.calc.*; import mondrian.calc.impl.AbstractListCalc; import mondrian.mdx.ResolvedFunCall; import mondrian.olap.*; import java.util.*; /** * Definition of the DrilldownMember MDX function. * * @author Grzegorz Lojek * @since 6 December, 2004 */ class DrilldownMemberFunDef extends FunDefBase { static final String[] reservedWords = new String[] {"RECURSIVE"}; static final ReflectiveMultiResolver Resolver = new ReflectiveMultiResolver( "DrilldownMember", "DrilldownMember(, [, RECURSIVE])", "Drills down the members in a set that are present in a second specified set.", new String[]{"fxxx", "fxxxy"}, DrilldownMemberFunDef.class, reservedWords); public DrilldownMemberFunDef(FunDef funDef) { super(funDef); } public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) { final ListCalc listCalc1 = compiler.compileList(call.getArg(0)); final ListCalc listCalc2 = compiler.compileList(call.getArg(1)); final String literalArg = getLiteralArg(call, 2, "", reservedWords); final boolean recursive = literalArg.equals("RECURSIVE"); return new AbstractListCalc( call, new Calc[] {listCalc1, listCalc2}) { public TupleList evaluateList(Evaluator evaluator) { final TupleList list1 = listCalc1.evaluateList(evaluator); final TupleList list2 = listCalc2.evaluateList(evaluator); return drilldownMember(list1, list2, evaluator); } /** * Drills down an element. * *

Algorithm: If object is present in {@code memberSet} adds to * result children of the object. If flag {@code recursive} is set * then this method is called recursively for the children. * * @param evaluator Evaluator * @param tuple Tuple (may have arity 1) * @param memberSet Set of members * @param resultList Result */ protected void drillDownObj( Evaluator evaluator, Member[] tuple, Set memberSet, TupleList resultList) { for (int k = 0; k < tuple.length; k++) { Member member = tuple[k]; if (memberSet.contains(member)) { List children = evaluator.getSchemaReader().getMemberChildren( member); final Member[] tuple2 = tuple.clone(); for (Member childMember : children) { tuple2[k] = childMember; resultList.addTuple(tuple2); if (recursive) { drillDownObj( evaluator, tuple2, memberSet, resultList); } } break; } } } private TupleList drilldownMember( TupleList v0, TupleList v1, Evaluator evaluator) { assert v1.getArity() == 1; if (v0.isEmpty() || v1.isEmpty()) { return v0; } Set set1 = new HashSet(v1.slice(0)); TupleList result = TupleCollections.createList(v0.getArity()); int i = 0, n = v0.size(); final Member[] members = new Member[v0.getArity()]; while (i < n) { List o = v0.get(i++); o.toArray(members); result.add(o); drillDownObj(evaluator, members, set1, result); } return result; } }; } } // End DrilldownMemberFunDef.java mondrian-3.11.0.1-R/src/main/mondrian/olap/fun/ExceptFunDef.java000066400000000000000000000043411261646570300242050ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.olap.fun; import mondrian.calc.*; import mondrian.calc.impl.AbstractListCalc; import mondrian.calc.impl.ArrayTupleList; import mondrian.mdx.ResolvedFunCall; import mondrian.olap.*; import java.util.*; /** * Definition of the Except MDX function. * * @author jhyde * @since Mar 23, 2006 */ class ExceptFunDef extends FunDefBase { static final ReflectiveMultiResolver Resolver = new ReflectiveMultiResolver( "Except", "Except(, [, ALL])", "Finds the difference between two sets, optionally retaining duplicates.", new String[]{"fxxx", "fxxxy"}, ExceptFunDef.class); public ExceptFunDef(FunDef dummyFunDef) { super(dummyFunDef); } public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) { // todo: implement ALL final ListCalc listCalc0 = compiler.compileList(call.getArg(0)); final ListCalc listCalc1 = compiler.compileList(call.getArg(1)); return new AbstractListCalc(call, new Calc[] {listCalc0, listCalc1}) { public TupleList evaluateList(Evaluator evaluator) { TupleList list0 = listCalc0.evaluateList(evaluator); if (list0.isEmpty()) { return list0; } TupleList list1 = listCalc1.evaluateList(evaluator); if (list1.isEmpty()) { return list0; } final Set> set1 = new HashSet>(list1); final TupleList result = new ArrayTupleList(list0.getArity(), list0.size()); for (List tuple1 : list0) { if (!set1.contains(tuple1)) { result.add(tuple1); } } return result; } }; } } // End ExceptFunDef.java mondrian-3.11.0.1-R/src/main/mondrian/olap/fun/ExistsFunDef.java000066400000000000000000000136641261646570300242440ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.olap.fun; import mondrian.calc.*; import mondrian.calc.impl.AbstractListCalc; import mondrian.mdx.ResolvedFunCall; import mondrian.olap.*; import java.util.ArrayList; import java.util.List; /** * Definition of the EXISTS MDX function. * * @author kvu * @since Mar 23, 2008 */ class ExistsFunDef extends FunDefBase { static final Resolver resolver = new ReflectiveMultiResolver( "Exists", "Exists(, ])", "Returns the the set of tuples of the first set that exist with one or more tuples of the second set.", new String[] {"fxxx"}, ExistsFunDef.class); public ExistsFunDef(FunDef dummyFunDef) { super(dummyFunDef); } public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) { final ListCalc listCalc1 = compiler.compileList(call.getArg(0)); final ListCalc listCalc2 = compiler.compileList(call.getArg(1)); return new AbstractListCalc(call, new Calc[] {listCalc1, listCalc2}) { public TupleList evaluateList(Evaluator evaluator) { TupleList leftTuples = listCalc1.evaluateList(evaluator); if (leftTuples.isEmpty()) { return TupleCollections.emptyList(leftTuples.getArity()); } TupleList rightTuples = listCalc2.evaluateList(evaluator); if (rightTuples.isEmpty()) { return TupleCollections.emptyList(leftTuples.getArity()); } TupleList result = TupleCollections.createList(leftTuples.getArity()); List leftDims = getHierarchies(leftTuples.get(0)); List rightDims = getHierarchies(rightTuples.get(0)); leftLoop: for (List leftTuple : leftTuples) { for (List rightTuple : rightTuples) { if (existsInTuple(leftTuple, rightTuple, leftDims, rightDims)) { result.add(leftTuple); continue leftLoop; } } } return result; } }; } private static boolean isOnSameHierarchyChain(Member mA, Member mB) { return (FunUtil.isAncestorOf(mA, mB, false))|| (FunUtil.isAncestorOf(mB, mA, false)); } /** * Returns true if leftTuple Exists w/in rightTuple * * * * @param leftTuple tuple from arg one of EXISTS() * @param rightTuple tuple from arg two of EXISTS() * @param leftHierarchies list of hierarchies from leftTuple, in the same * order * @param rightHierarchies list of the hiearchies from rightTuple, * in the same order * @return true if each member from leftTuple is somewhere in the * hierarchy chain of the corresponding member from rightTuple, * false otherwise. * If there is no explicit corresponding member from either * right or left, then the default member is used. */ private boolean existsInTuple( final List leftTuple, final List rightTuple, final List leftHierarchies, final List rightHierarchies) { List checkedMembers = new ArrayList(); for (Member leftMember : leftTuple) { Member rightMember = getCorrespondingMember( leftMember, rightTuple, rightHierarchies); checkedMembers.add(rightMember); if (!isOnSameHierarchyChain(leftMember, rightMember)) { return false; } } // this loop handles members in the right tuple not present in left // Such a member could only impact the resulting tuple list if the // default member of the hierarchy is not the all member. for (Member rightMember : rightTuple) { if (checkedMembers.contains(rightMember)) { // already checked in the previous loop continue; } Member leftMember = getCorrespondingMember( rightMember, leftTuple, leftHierarchies); if (!isOnSameHierarchyChain(leftMember, rightMember)) { return false; } } return true; } /** * Returns the corresponding member from tuple, or the default member * for the hierarchy if member is not explicitly contained in the tuple. * * * @param member source member * @param tuple tuple containing the target member * @param tupleHierarchies list of the hierarchies explicitly contained * in the tuple, in the same order. * @return target member */ private Member getCorrespondingMember( final Member member, final List tuple, final List tupleHierarchies) { assert tuple.size() == tupleHierarchies.size(); int dimPos = tupleHierarchies.indexOf(member.getHierarchy()); if (dimPos >= 0) { return tuple.get(dimPos); } else { return member.getHierarchy().getDefaultMember(); } } private static List getHierarchies(final List members) { List hierarchies = new ArrayList(); for (Member member : members) { hierarchies.add(member.getHierarchy()); } return hierarchies; } } // End ExistsFunDef.java mondrian-3.11.0.1-R/src/main/mondrian/olap/fun/ExtractFunDef.java000066400000000000000000000171621261646570300243740ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.olap.fun; import mondrian.calc.*; import mondrian.calc.impl.AbstractListCalc; import mondrian.mdx.*; import mondrian.olap.*; import mondrian.olap.type.*; import java.util.*; /** * Definition of the Extract MDX function. * *

Syntax: *

Extract(<Set>, <Hierarchy>[, * <Hierarchy>...])
* * @author jhyde * @since Jun 10, 2007 */ class ExtractFunDef extends FunDefBase { static final ResolverBase Resolver = new ResolverBase( "Extract", "Extract(, [, ...])", "Returns a set of tuples from extracted hierarchy elements. The opposite of Crossjoin.", Syntax.Function) { public FunDef resolve( Exp[] args, Validator validator, List conversions) { if (args.length < 2) { return null; } if (!validator.canConvert(0, args[0], Category.Set, conversions)) { return null; } for (int i = 1; i < args.length; ++i) { if (!validator.canConvert( 0, args[i], Category.Hierarchy, conversions)) { return null; } } // Find the dimensionality of the set expression. // Form a list of ordinals of the hierarchies being extracted. // For example, in // Extract(X.Members * Y.Members * Z.Members, Z, X) // the hierarchy ordinals are X=0, Y=1, Z=2, and the extracted // ordinals are {2, 0}. // // Each hierarchy extracted must exist in the LHS, // and no hierarchy may be extracted more than once. List extractedOrdinals = new ArrayList(); final List extractedHierarchies = new ArrayList(); findExtractedHierarchies( args, extractedHierarchies, extractedOrdinals); int[] parameterTypes = new int[args.length]; parameterTypes[0] = Category.Set; Arrays.fill( parameterTypes, 1, parameterTypes.length, Category.Hierarchy); return new ExtractFunDef(this, Category.Set, parameterTypes); } }; private ExtractFunDef( Resolver resolver, int returnType, int[] parameterTypes) { super(resolver, returnType, parameterTypes); } public Type getResultType(Validator validator, Exp[] args) { final List extractedHierarchies = new ArrayList(); final List extractedOrdinals = new ArrayList(); findExtractedHierarchies(args, extractedHierarchies, extractedOrdinals); if (extractedHierarchies.size() == 1) { return new SetType( MemberType.forHierarchy( extractedHierarchies.get(0))); } else { List typeList = new ArrayList(); for (Hierarchy extractedHierarchy : extractedHierarchies) { typeList.add( MemberType.forHierarchy( extractedHierarchy)); } return new SetType( new TupleType( typeList.toArray(new Type[typeList.size()]))); } } private static void findExtractedHierarchies( Exp[] args, List extractedHierarchies, List extractedOrdinals) { SetType type = (SetType) args[0].getType(); final List hierarchies; if (type.getElementType() instanceof TupleType) { hierarchies = ((TupleType) type.getElementType()).getHierarchies(); } else { hierarchies = Collections.singletonList(type.getHierarchy()); } for (Hierarchy hierarchy : hierarchies) { if (hierarchy == null) { throw new RuntimeException( "hierarchy of argument not known"); } } for (int i = 1; i < args.length; i++) { Exp arg = args[i]; Hierarchy extractedHierarchy = null; if (arg instanceof HierarchyExpr) { HierarchyExpr hierarchyExpr = (HierarchyExpr) arg; extractedHierarchy = hierarchyExpr.getHierarchy(); } else if (arg instanceof DimensionExpr) { DimensionExpr dimensionExpr = (DimensionExpr) arg; extractedHierarchy = dimensionExpr.getDimension().getHierarchy(); } if (extractedHierarchy == null) { throw new RuntimeException("not a constant hierarchy: " + arg); } int ordinal = hierarchies.indexOf(extractedHierarchy); if (ordinal == -1) { throw new RuntimeException( "hierarchy " + extractedHierarchy.getUniqueName() + " is not a hierarchy of the expression " + args[0]); } if (extractedOrdinals.indexOf(ordinal) >= 0) { throw new RuntimeException( "hierarchy " + extractedHierarchy.getUniqueName() + " is extracted more than once"); } extractedOrdinals.add(ordinal); extractedHierarchies.add(extractedHierarchy); } } private static int[] toIntArray(List integerList) { final int[] ints = new int[integerList.size()]; for (int i = 0; i < ints.length; i++) { ints[i] = integerList.get(i); } return ints; } public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) { List extractedHierarchyList = new ArrayList(); List extractedOrdinalList = new ArrayList(); findExtractedHierarchies( call.getArgs(), extractedHierarchyList, extractedOrdinalList); Util.assertTrue( extractedOrdinalList.size() == extractedHierarchyList.size()); Exp arg = call.getArg(0); final ListCalc listCalc = compiler.compileList(arg, false); int inArity = arg.getType().getArity(); final int outArity = extractedOrdinalList.size(); if (inArity == 1) { // LHS is a set of members, RHS is the same hierarchy. Extract boils // down to eliminating duplicate members. Util.assertTrue(outArity == 1); return new DistinctFunDef.CalcImpl(call, listCalc); } final int[] extractedOrdinals = toIntArray(extractedOrdinalList); return new AbstractListCalc(call, new Calc[]{listCalc}) { public TupleList evaluateList(Evaluator evaluator) { TupleList result = TupleCollections.createList(outArity); TupleList list = listCalc.evaluateList(evaluator); Set> emittedTuples = new HashSet>(); for (List members : list.project(extractedOrdinals)) { if (emittedTuples.add(members)) { result.add(members); } } return result; } }; } } // End ExtractFunDef.java mondrian-3.11.0.1-R/src/main/mondrian/olap/fun/FilterFunDef.java000066400000000000000000000340031261646570300242000ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2015 Pentaho Corporation.. All rights reserved. */ package mondrian.olap.fun; import mondrian.calc.*; import mondrian.calc.impl.*; import mondrian.mdx.ResolvedFunCall; import mondrian.olap.*; import mondrian.server.Locus; import java.util.List; /** * Definition of the Filter MDX function. * *

Syntax: *

Filter(<Set>, <Search * Condition>)
* * @author jhyde * @since Mar 23, 2006 */ class FilterFunDef extends FunDefBase { private static final String TIMING_NAME = FilterFunDef.class.getSimpleName(); static final FilterFunDef instance = new FilterFunDef(); private FilterFunDef() { super( "Filter", "Returns the set resulting from filtering a set based on a search condition.", "fxxb"); } public Calc compileCall(final ResolvedFunCall call, ExpCompiler compiler) { // Ignore the caller's priority. We prefer to return iterable, because // it makes NamedSet.CurrentOrdinal work. List styles = compiler.getAcceptableResultStyles(); if (call.getArg(0) instanceof ResolvedFunCall && ((ResolvedFunCall) call.getArg(0)).getFunName().equals("AS")) { styles = ResultStyle.ITERABLE_ONLY; } if (styles.contains(ResultStyle.ITERABLE) || styles.contains(ResultStyle.ANY)) { return compileCallIterable(call, compiler); } else if (styles.contains(ResultStyle.LIST) || styles.contains(ResultStyle.MUTABLE_LIST)) { return compileCallList(call, compiler); } else { throw ResultStyleException.generate( ResultStyle.ITERABLE_LIST_MUTABLELIST_ANY, styles); } } /** * Returns an IterCalc. * *

Here we would like to get either a IterCalc or ListCalc (mutable) * from the inner expression. For the IterCalc, its Iterator * can be wrapped with another Iterator that filters each element. * For the mutable list, remove all members that are filtered. * * @param call Call * @param compiler Compiler * @return Implementation of this function call in the Iterable result style */ protected IterCalc compileCallIterable( final ResolvedFunCall call, ExpCompiler compiler) { // want iterable, mutable list or immutable list in that order Calc imlcalc = compiler.compileAs( call.getArg(0), null, ResultStyle.ITERABLE_LIST_MUTABLELIST); BooleanCalc bcalc = compiler.compileBoolean(call.getArg(1)); Calc[] calcs = new Calc[] {imlcalc, bcalc}; // check returned calc ResultStyles checkIterListResultStyles(imlcalc); if (imlcalc.getResultStyle() == ResultStyle.ITERABLE) { return new IterIterCalc(call, calcs); } else if (imlcalc.getResultStyle() == ResultStyle.LIST) { return new ImmutableIterCalc(call, calcs); } else { return new MutableIterCalc(call, calcs); } } private static abstract class BaseIterCalc extends AbstractIterCalc { protected BaseIterCalc(ResolvedFunCall call, Calc[] calcs) { super(call, calcs); } public TupleIterable evaluateIterable(Evaluator evaluator) { evaluator.getTiming().markStart(TIMING_NAME); try { ResolvedFunCall call = (ResolvedFunCall) exp; // Use a native evaluator, if more efficient. // TODO: Figure this out at compile time. SchemaReader schemaReader = evaluator.getSchemaReader(); NativeEvaluator nativeEvaluator = schemaReader.getNativeSetEvaluator( call.getFunDef(), call.getArgs(), evaluator, this); if (nativeEvaluator != null) { return (TupleIterable) nativeEvaluator.execute(ResultStyle.ITERABLE); } else { return makeIterable(evaluator); } } finally { evaluator.getTiming().markEnd(TIMING_NAME); } } protected abstract TupleIterable makeIterable(Evaluator evaluator); public boolean dependsOn(Hierarchy hierarchy) { return anyDependsButFirst(getCalcs(), hierarchy); } } private static class MutableIterCalc extends BaseIterCalc { MutableIterCalc(ResolvedFunCall call, Calc[] calcs) { super(call, calcs); assert calcs[0] instanceof ListCalc; assert calcs[1] instanceof BooleanCalc; } protected TupleIterable makeIterable(Evaluator evaluator) { evaluator.getTiming().markStart(TIMING_NAME); final int savepoint = evaluator.savepoint(); try { Calc[] calcs = getCalcs(); ListCalc lcalc = (ListCalc) calcs[0]; BooleanCalc bcalc = (BooleanCalc) calcs[1]; TupleList list = lcalc.evaluateList(evaluator); // make list mutable; guess selectivity .5 TupleList result = TupleCollections.createList( list.getArity(), list.size() / 2); evaluator.setNonEmpty(false); TupleCursor cursor = list.tupleCursor(); while (cursor.forward()) { cursor.setContext(evaluator); if (bcalc.evaluateBoolean(evaluator)) { result.addCurrent(cursor); } } return result; } finally { evaluator.restore(savepoint); evaluator.getTiming().markEnd(TIMING_NAME); } } } private static class ImmutableIterCalc extends BaseIterCalc { ImmutableIterCalc(ResolvedFunCall call, Calc[] calcs) { super(call, calcs); assert calcs[0] instanceof ListCalc; assert calcs[1] instanceof BooleanCalc; } protected TupleIterable makeIterable(Evaluator evaluator) { Calc[] calcs = getCalcs(); ListCalc lcalc = (ListCalc) calcs[0]; BooleanCalc bcalc = (BooleanCalc) calcs[1]; TupleList members = lcalc.evaluateList(evaluator); // Not mutable, must create new list TupleList result = members.cloneList(members.size() / 2); final int savepoint = evaluator.savepoint(); try { evaluator.setNonEmpty(false); TupleCursor cursor = members.tupleCursor(); while (cursor.forward()) { cursor.setContext(evaluator); if (bcalc.evaluateBoolean(evaluator)) { result.addCurrent(cursor); } } return result; } finally { evaluator.restore(savepoint); } } } private static class IterIterCalc extends BaseIterCalc { IterIterCalc(ResolvedFunCall call, Calc[] calcs) { super(call, calcs); assert calcs[0] instanceof IterCalc; assert calcs[1] instanceof BooleanCalc; } protected TupleIterable makeIterable(Evaluator evaluator) { Calc[] calcs = getCalcs(); IterCalc icalc = (IterCalc) calcs[0]; final BooleanCalc bcalc = (BooleanCalc) calcs[1]; // This does dynamics, just in time, // as needed filtering final TupleIterable iterable = icalc.evaluateIterable(evaluator); final Evaluator evaluator2 = evaluator.push(); evaluator2.setNonEmpty(false); final int checkCancelPeriod = MondrianProperties.instance().CancelPhaseInterval.get(); return new AbstractTupleIterable(iterable.getArity()) { public TupleCursor tupleCursor() { return new AbstractTupleCursor(iterable.getArity()) { final TupleCursor cursor = iterable.tupleCursor(); public boolean forward() { int rowCount = -1; while (cursor.forward()) { rowCount++; if (checkCancelPeriod > 0 && rowCount % checkCancelPeriod == 0) { Locus.peek().execution .checkCancelOrTimeout(); } cursor.setContext(evaluator2); if (bcalc.evaluateBoolean(evaluator2)) { return true; } } return false; } public List current() { return cursor.current(); } }; } }; } } /** * Returns a ListCalc. * * @param call Call * @param compiler Compiler * @return Implementation of this function call in the List result style */ protected ListCalc compileCallList( final ResolvedFunCall call, ExpCompiler compiler) { Calc ilcalc = compiler.compileList(call.getArg(0), false); BooleanCalc bcalc = compiler.compileBoolean(call.getArg(1)); Calc[] calcs = new Calc[] {ilcalc, bcalc}; // Note that all of the ListCalc's return will be mutable switch (ilcalc.getResultStyle()) { case LIST: return new ImmutableListCalc(call, calcs); case MUTABLE_LIST: return new MutableListCalc(call, calcs); } throw ResultStyleException.generateBadType( ResultStyle.MUTABLELIST_LIST, ilcalc.getResultStyle()); } private static abstract class BaseListCalc extends AbstractListCalc { protected BaseListCalc(ResolvedFunCall call, Calc[] calcs) { super(call, calcs); } public TupleList evaluateList(Evaluator evaluator) { ResolvedFunCall call = (ResolvedFunCall) exp; // Use a native evaluator, if more efficient. // TODO: Figure this out at compile time. SchemaReader schemaReader = evaluator.getSchemaReader(); NativeEvaluator nativeEvaluator = schemaReader.getNativeSetEvaluator( call.getFunDef(), call.getArgs(), evaluator, this); if (nativeEvaluator != null) { return (TupleList) nativeEvaluator.execute( ResultStyle.ITERABLE); } else { return makeList(evaluator); } } protected abstract TupleList makeList(Evaluator evaluator); public boolean dependsOn(Hierarchy hierarchy) { return anyDependsButFirst(getCalcs(), hierarchy); } } private static class MutableListCalc extends BaseListCalc { MutableListCalc(ResolvedFunCall call, Calc[] calcs) { super(call, calcs); assert calcs[0] instanceof ListCalc; assert calcs[1] instanceof BooleanCalc; } protected TupleList makeList(Evaluator evaluator) { Calc[] calcs = getCalcs(); ListCalc lcalc = (ListCalc) calcs[0]; BooleanCalc bcalc = (BooleanCalc) calcs[1]; TupleList members0 = lcalc.evaluateList(evaluator); // make list mutable; // for capacity planning, guess selectivity = .5 TupleList result = members0.cloneList(members0.size() / 2); final int savepoint = evaluator.savepoint(); try { evaluator.setNonEmpty(false); final TupleCursor cursor = members0.tupleCursor(); while (cursor.forward()) { cursor.setContext(evaluator); if (bcalc.evaluateBoolean(evaluator)) { result.addCurrent(cursor); } } return result; } finally { evaluator.restore(savepoint); } } } private static class ImmutableListCalc extends BaseListCalc { ImmutableListCalc(ResolvedFunCall call, Calc[] calcs) { super(call, calcs); assert calcs[0] instanceof ListCalc; assert calcs[1] instanceof BooleanCalc; } protected TupleList makeList(Evaluator evaluator) { evaluator.getTiming().markStart(TIMING_NAME); final int savepoint = evaluator.savepoint(); try { Calc[] calcs = getCalcs(); ListCalc lcalc = (ListCalc) calcs[0]; BooleanCalc bcalc = (BooleanCalc) calcs[1]; TupleList members0 = lcalc.evaluateList(evaluator); // Not mutable, must create new list; // for capacity planning, guess selectivity = .5 TupleList result = members0.cloneList(members0.size() / 2); evaluator.setNonEmpty(false); final TupleCursor cursor = members0.tupleCursor(); while (cursor.forward()) { cursor.setContext(evaluator); if (bcalc.evaluateBoolean(evaluator)) { result.addCurrent(cursor); } } return result; } finally { evaluator.restore(savepoint); evaluator.getTiming().markEnd(TIMING_NAME); } } } } // End FilterFunDef.java mondrian-3.11.0.1-R/src/main/mondrian/olap/fun/FormatFunDef.java000066400000000000000000000050471261646570300242110ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.olap.fun; import mondrian.calc.*; import mondrian.calc.impl.AbstractStringCalc; import mondrian.mdx.ResolvedFunCall; import mondrian.olap.*; import mondrian.util.Format; import java.util.Locale; /** * Definition of the Format MDX function. * * @author jhyde * @since Mar 23, 2006 */ class FormatFunDef extends FunDefBase { static final ReflectiveMultiResolver Resolver = new ReflectiveMultiResolver( "Format", "Format(, )", "Formats a number or date to a string.", new String[] { "fSmS", "fSnS", "fSDS" }, FormatFunDef.class); public FormatFunDef(FunDef dummyFunDef) { super(dummyFunDef); } public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) { final Exp[] args = call.getArgs(); final Calc calc = compiler.compileScalar(call.getArg(0), true); final Locale locale = compiler.getEvaluator().getConnectionLocale(); if (args[1] instanceof Literal) { // Constant string expression: optimize by // compiling format string. String formatString = (String) ((Literal) args[1]).getValue(); final Format format = new Format(formatString, locale); return new AbstractStringCalc(call, new Calc[] {calc}) { public String evaluateString(Evaluator evaluator) { final Object o = calc.evaluate(evaluator); return format.format(o); } }; } else { // Variable string expression final StringCalc stringCalc = compiler.compileString(call.getArg(1)); return new AbstractStringCalc(call, new Calc[] {calc, stringCalc}) { public String evaluateString(Evaluator evaluator) { final Object o = calc.evaluate(evaluator); final String formatString = stringCalc.evaluateString(evaluator); final Format format = new Format(formatString, locale); return format.format(o); } }; } } } // End FormatFunDef.java mondrian-3.11.0.1-R/src/main/mondrian/olap/fun/FunDefBase.java000066400000000000000000000333501261646570300236310ustar00rootroot00000000000000/* // This software is subject to the terms of the Eclipse Public License v1.0 // Agreement, available at the following URL: // http://www.eclipse.org/legal/epl-v10.html. // You must accept the terms of that agreement to use this software. // // Copyright (C) 2002-2005 Julian Hyde // Copyright (C) 2005-2009 Pentaho and others // All Rights Reserved. */ package mondrian.olap.fun; import mondrian.calc.Calc; import mondrian.calc.ExpCompiler; import mondrian.mdx.ResolvedFunCall; import mondrian.olap.*; import mondrian.olap.type.*; import mondrian.olap.type.DimensionType; import mondrian.olap.type.LevelType; import java.io.PrintWriter; /** * FunDefBase is the default implementation of {@link FunDef}. * *

Signatures

* *

A function is defined by the following:

* * * * * * * * * * * * * * * * * * * * *
ParameterMeaningExample
nameName of the function"Members"
signatureSignature of the function"<Dimension>.Members"
descriptionDescription of the function"Returns the set of all members in a dimension."
flagsEncoding of the syntactic type, return type, and parameter * types of this operator. The encoding is described below."pxd"
* * The flags field is an string which encodes * the syntactic type, return type, and parameter types of this operator. *
    *
  • The first character determines the syntactic type, as described by * {@link FunUtil#decodeSyntacticType(String)}. *
  • The second character determines the return type, as described by * {@link FunUtil#decodeReturnCategory(String)}. *
  • The third and subsequence characters determine the types of the * arguments arguments, as described by * {@link FunUtil#decodeParameterCategories(String)}. *

* * For example, "pxd" means "an operator with * {@link Syntax#Property property} syntax (p) which returns a set * (x) and takes a dimension (d) as its argument".

* * The arguments are always read from left to right, regardless of the * syntactic type of the operator. For example, the * "<Set>.Item(<Index>)" operator * (signature "mmxn") has the * syntax of a method-call, and takes two parameters: * a set (x) and a numeric (n).

* * @author jhyde * @since 26 February, 2002 */ public abstract class FunDefBase extends FunUtil implements FunDef { protected final int flags; private final String name; final String signature; private final String description; protected final int returnCategory; protected final int[] parameterCategories; /** * Creates an operator. * * @param name Name of the function, for example "Members". * @param signature Signature of the function, for example * "<Dimension>.Members". * @param description Description of the function, for example * "Returns the set of all members in a dimension." * @param syntax Syntactic type of the operator (for * example, function, method, infix operator) * @param returnCategory The {@link Category} of the value returned by this * operator. * @param parameterCategories An array of {@link Category} codes, one for * each parameter. */ FunDefBase( String name, String signature, String description, Syntax syntax, int returnCategory, int[] parameterCategories) { assert name != null; assert syntax != null; this.name = name; this.signature = signature; this.description = description; this.flags = syntax.ordinal(); this.returnCategory = returnCategory; this.parameterCategories = parameterCategories; } /** * Creates an operator. * * @param name Name of the function, for example "Members". * @param description Description of the function, for example * "Returns the set of all members in a dimension." * @param flags Encoding of the syntactic type, return type, * and parameter types of this operator. The * "Members" operator has a syntactic type * "pxd" which means "an operator with * {@link Syntax#Property property} syntax (p) which * returns a set (x) and takes a dimension (d) as its * argument". * See {@link FunUtil#decodeSyntacticType(String)}, * {@link FunUtil#decodeReturnCategory(String)}, * {@link FunUtil#decodeParameterCategories(String)}. */ protected FunDefBase( String name, String description, String flags) { this( name, null, description, decodeSyntacticType(flags), decodeReturnCategory(flags), decodeParameterCategories(flags)); } /** * Creates an operator with an explicit signature. * *

In most cases, the signature can be generated automatically, and * you should use the constructor which creates an implicit signature, * {@link #FunDefBase(String, String, String, String)} * instead. * * @param name Name of the function, for example "Members". * @param signature Signature of the function, for example * "<Dimension>.Members". * @param description Description of the function, for example * "Returns the set of all members in a dimension." * @param flags Encoding of the syntactic type, return type, and * parameter types of this operator. The "Members" * operator has a syntactic type "pxd" which means "an * operator with {@link Syntax#Property property} syntax * (p) which returns a set (x) and takes a dimension (d) * as its argument". See * {@link FunUtil#decodeSyntacticType(String)}, * {@link FunUtil#decodeReturnCategory(String)}, * {@link FunUtil#decodeParameterCategories(String)}. */ protected FunDefBase( String name, String signature, String description, String flags) { this( name, signature, description, decodeSyntacticType(flags), decodeReturnCategory(flags), decodeParameterCategories(flags)); } /** * Convenience constructor when we are created by a {@link Resolver}. * * @param resolver Resolver * @param returnType Return type * @param parameterTypes Parameter types */ FunDefBase(Resolver resolver, int returnType, int[] parameterTypes) { this( resolver.getName(), null, null, resolver.getSyntax(), returnType, parameterTypes); } /** * Copy constructor. * * @param funDef Function definition to copy */ FunDefBase(FunDef funDef) { this( funDef.getName(), funDef.getSignature(), funDef.getDescription(), funDef.getSyntax(), funDef.getReturnCategory(), funDef.getParameterCategories()); } public String getName() { return name; } public String getDescription() { return description; } public Syntax getSyntax() { return Syntax.class.getEnumConstants()[flags]; } public int getReturnCategory() { return returnCategory; } public int[] getParameterCategories() { return parameterCategories; } public Exp createCall(Validator validator, Exp[] args) { int[] categories = getParameterCategories(); Util.assertTrue(categories.length == args.length); for (int i = 0; i < args.length; i++) { args[i] = validateArg(validator, args, i, categories[i]); } final Type type = getResultType(validator, args); if (type == null) { throw Util.newInternal("could not derive type"); } return new ResolvedFunCall(this, args, type); } /** * Validates an argument to a call to this function. * *

The default implementation of this method adds an implicit * conversion to the correct type. Derived classes may override. * * @param validator Validator * @param args Arguments to this function * @param i Ordinal of argument * @param category Expected {@link Category category} of argument * @return Validated argument */ protected Exp validateArg( Validator validator, Exp[] args, int i, int category) { return args[i]; } /** * Converts a type to a different category, maintaining as much type * information as possible. * * For example, given LevelType(dimension=Time, hierarchy=unknown, * level=unkown) and category=Hierarchy, returns * HierarchyType(dimension=Time). * * @param type Type * @param category Desired category * @return Type after conversion to desired category */ static Type castType(Type type, int category) { switch (category) { case Category.Logical: return new BooleanType(); case Category.Numeric: return new NumericType(); case Category.Numeric | Category.Integer: return new DecimalType(Integer.MAX_VALUE, 0); case Category.String: return new StringType(); case Category.DateTime: return new DateTimeType(); case Category.Symbol: return new SymbolType(); case Category.Value: return new ScalarType(); case Category.Cube: if (type instanceof Cube) { return new CubeType((Cube) type); } return null; case Category.Dimension: if (type != null) { return DimensionType.forType(type); } return null; case Category.Hierarchy: if (type != null) { return HierarchyType.forType(type); } return null; case Category.Level: if (type != null) { return LevelType.forType(type); } return null; case Category.Member: if (type != null) { final MemberType memberType = TypeUtil.toMemberType(type); if (memberType != null) { return memberType; } } // Take a wild guess. return MemberType.Unknown; case Category.Tuple: if (type != null) { final Type memberType = TypeUtil.toMemberOrTupleType(type); if (memberType != null) { return memberType; } } return null; case Category.Set: if (type != null) { final Type memberType = TypeUtil.toMemberOrTupleType(type); if (memberType != null) { return new SetType(memberType); } } return null; case Category.Empty: return new EmptyType(); default: throw Category.instance.badValue(category); } } /** * Returns the type of a call to this function with a given set of * arguments.

* * The default implementation makes the coarse assumption that the return * type is in some way related to the type of the first argument. * Operators whose arguments don't follow the requirements of this * implementation should override this method.

* * If the function definition says it returns a literal type (numeric, * string, symbol) then it's a fair guess that the function call * returns the same kind of value.

* * If the function definition says it returns an object type (cube, * dimension, hierarchy, level, member) then we check the first * argument of the function. Suppose that the function definition says * that it returns a hierarchy, and the first argument of the function * happens to be a member. Then it's reasonable to assume that this * function returns a member. * * @param validator Validator * @param args Arguments to the call to this operator * @return result type of a call this function */ public Type getResultType(Validator validator, Exp[] args) { Type firstArgType = args.length > 0 ? args[0].getType() : null; Type type = castType(firstArgType, getReturnCategory()); if (type != null) { return type; } throw Util.newInternal( "Cannot deduce type of call to function '" + this.name + "'"); } public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) { throw Util.newInternal( "function '" + getSignature() + "' has not been implemented"); } public String getSignature() { return getSyntax().getSignature( getName(), getReturnCategory(), getParameterCategories()); } public void unparse(Exp[] args, PrintWriter pw) { getSyntax().unparse(getName(), args, pw); } } // End FunDefBase.java mondrian-3.11.0.1-R/src/main/mondrian/olap/fun/FunInfo.java000066400000000000000000000152031261646570300232300ustar00rootroot00000000000000/* // This software is subject to the terms of the Eclipse Public License v1.0 // Agreement, available at the following URL: // http://www.eclipse.org/legal/epl-v10.html. // You must accept the terms of that agreement to use this software. // // Copyright (C) 2005-2005 Julian Hyde // Copyright (C) 2005-2011 Pentaho and others // All Rights Reserved. */ package mondrian.olap.fun; import mondrian.olap.*; import java.lang.reflect.Array; import java.util.ArrayList; import java.util.List; /** * Support class for the {@link mondrian.tui.CmdRunner} allowing one to view * available functions and their syntax. * * @author Richard M. Emberson */ public class FunInfo implements Comparable { private final Syntax syntax; private final String name; private final String description; private final int[] returnTypes; private final int[][] parameterTypes; private String[] sigs; static FunInfo make(Resolver resolver) { FunDef funDef = resolver.getFunDef(); if (funDef != null) { return new FunInfo(funDef); } else if (resolver instanceof MultiResolver) { return new FunInfo((MultiResolver) resolver); } else { return new FunInfo(resolver); } } FunInfo(FunDef funDef) { this.syntax = funDef.getSyntax(); this.name = funDef.getName(); assert name != null; assert syntax != null; this.returnTypes = new int[] { funDef.getReturnCategory() }; this.parameterTypes = new int[][] { funDef.getParameterCategories() }; // use explicit signature if it has one, otherwise generate a set this.sigs = funDef instanceof FunDefBase && ((FunDefBase) funDef).signature != null ? new String[] {((FunDefBase) funDef).signature} : makeSigs(syntax, name, returnTypes, parameterTypes); this.description = funDef.getDescription(); } FunInfo(MultiResolver multiResolver) { this.syntax = multiResolver.getSyntax(); this.name = multiResolver.getName(); assert name != null; assert syntax != null; this.description = multiResolver.getDescription(); String[] signatures = multiResolver.getSignatures(); this.returnTypes = new int[signatures.length]; this.parameterTypes = new int[signatures.length][]; for (int i = 0; i < signatures.length; i++) { returnTypes[i] = FunUtil.decodeReturnCategory(signatures[i]); parameterTypes[i] = FunUtil.decodeParameterCategories(signatures[i]); } this.sigs = makeSigs(syntax, name, returnTypes, parameterTypes); } FunInfo(Resolver resolver) { this.syntax = resolver.getSyntax(); this.name = resolver.getName(); assert name != null; assert syntax != null; this.description = resolver.getDescription(); this.returnTypes = null; this.parameterTypes = null; final String signature = resolver.getSignature(); this.sigs = signature == null ? new String[0] : new String[] {signature}; } FunInfo( String name, String description, String flags) { this.name = name; this.description = description; this.syntax = FunUtil.decodeSyntacticType(flags); this.returnTypes = new int[] {FunUtil.decodeReturnCategory(flags)}; this.parameterTypes = new int[][] {FunUtil.decodeParameterCategories(flags)}; } public String[] getSignatures() { return sigs; } private static String[] makeSigs( Syntax syntax, String name, int[] returnTypes, int[][] parameterTypes) { if (parameterTypes == null) { return null; } String[] sigs = new String[parameterTypes.length]; for (int i = 0; i < sigs.length; i++) { sigs[i] = syntax.getSignature( name, returnTypes[i], parameterTypes[i]); } return sigs; } /** * Returns the syntactic type of the function. */ public Syntax getSyntax() { return this.syntax; } /** * Returns the name of this function. */ public String getName() { return this.name; } /** * Returns the description of this function. */ public String getDescription() { return this.description; } /** * Returns the type of value returned by this function. Values are the same * as those returned by {@link mondrian.olap.Exp#getCategory()}. */ public int[] getReturnCategories() { return this.returnTypes; } /** * Returns the types of the arguments of this function. Values are the same * as those returned by {@link mondrian.olap.Exp#getCategory()}. The * 0th argument of methods and properties are the object they * are applied to. Infix operators have two arguments, and prefix operators * have one argument. */ public int[][] getParameterCategories() { return this.parameterTypes; } public int compareTo(FunInfo fi) { int c = this.name.compareTo(fi.name); if (c != 0) { return c; } final List pcList = toList(this.getParameterCategories()); final String pc = pcList.toString(); final List otherPcList = toList(fi.getParameterCategories()); final String otherPc = otherPcList.toString(); return pc.compareTo(otherPc); } public boolean equals(Object obj) { if (obj instanceof FunInfo) { final FunInfo that = (FunInfo) obj; if (!name.equals(that.name)) { return false; } final List pcList = toList(this.getParameterCategories()); final List pcList2 = toList(that.getParameterCategories()); return pcList.equals(pcList2); } else { return false; } } public int hashCode() { int h = name.hashCode(); final List pcList = toList(this.getParameterCategories()); return Util.hash(h, pcList); } private static List toList(Object a) { final List list = new ArrayList(); if (a == null) { return list; } final int length = Array.getLength(a); for (int i = 0; i < length; i++) { final Object o = Array.get(a, i); if (o.getClass().isArray()) { list.add(toList(o)); } else { list.add(o); } } return list; } } // End FunInfo.java mondrian-3.11.0.1-R/src/main/mondrian/olap/fun/FunTableImpl.java000066400000000000000000000147161261646570300242160ustar00rootroot00000000000000/* // This software is subject to the terms of the Eclipse Public License v1.0 // Agreement, available at the following URL: // http://www.eclipse.org/legal/epl-v10.html. // You must accept the terms of that agreement to use this software. // // Copyright (C) 2002-2005 Julian Hyde // Copyright (C) 2005-2009 Pentaho // All Rights Reserved. */ package mondrian.olap.fun; import mondrian.olap.*; import mondrian.util.Pair; import java.util.*; /** * Abstract implementation of {@link FunTable}. * *

The derived class must implement * {@link #defineFunctions(mondrian.olap.FunTable.Builder)} to define * each function which will be recognized by this table. This method is called * from the constructor, after which point, no further functions can be added. */ public abstract class FunTableImpl implements FunTable { /** * Maps the upper-case name of a function plus its * {@link mondrian.olap.Syntax} to an array of * {@link Resolver} objects for that name. */ private Map, List> mapNameToResolvers; private Set reservedWordSet; private List reservedWordList; private Set propertyWords; private List funInfoList; /** * Creates a FunTableImpl. */ protected FunTableImpl() { } /** * Initializes the function table. */ public final void init() { final BuilderImpl builder = new BuilderImpl(); defineFunctions(builder); builder.organizeFunctions(); // Copy information out of builder into this. this.funInfoList = Collections.unmodifiableList(builder.funInfoList); this.mapNameToResolvers = Collections.unmodifiableMap(builder.mapNameToResolvers); this.reservedWordSet = builder.reservedWords; final String[] reservedWords = builder.reservedWords.toArray( new String[builder.reservedWords.size()]); Arrays.sort(reservedWords); this.reservedWordList = Collections.unmodifiableList(Arrays.asList(reservedWords)); this.propertyWords = Collections.unmodifiableSet(builder.propertyWords); } /** * Creates a key to look up an operator in the resolver map. The key * consists of the uppercase function name and the syntax. * * @param name Function/operator name * @param syntax Syntax * @return Key */ private static Pair makeResolverKey( String name, Syntax syntax) { return new Pair(name.toUpperCase(), syntax); } public List getReservedWords() { return reservedWordList; } public boolean isReserved(String s) { return reservedWordSet.contains(s.toUpperCase()); } public List getResolvers() { final List list = new ArrayList(); for (List resolvers : mapNameToResolvers.values()) { list.addAll(resolvers); } return list; } public boolean isProperty(String s) { return propertyWords.contains(s.toUpperCase()); } public List getFunInfoList() { return funInfoList; } public List getResolvers(String name, Syntax syntax) { Pair key = makeResolverKey(name, syntax); List resolvers = mapNameToResolvers.get(key); if (resolvers == null) { resolvers = Collections.emptyList(); } return resolvers; } /** * Implementation of {@link mondrian.olap.FunTable.Builder}. * Functions are added to lists each time {@link #define(Resolver)} is * called, then {@link #organizeFunctions()} sorts and indexes the map. */ private class BuilderImpl implements Builder { private final List resolverList = new ArrayList(); private final List funInfoList = new ArrayList(); private final Map, List> mapNameToResolvers = new HashMap, List>(); private final Set reservedWords = new HashSet(); private final Set propertyWords = new HashSet(); public void define(FunDef funDef) { define(new SimpleResolver(funDef)); } public void define(Resolver resolver) { funInfoList.add(FunInfo.make(resolver)); if (resolver.getSyntax() == Syntax.Property) { propertyWords.add(resolver.getName().toUpperCase()); } resolverList.add(resolver); final String[] reservedWords = resolver.getReservedWords(); for (String reservedWord : reservedWords) { defineReserved(reservedWord); } } public void define(FunInfo funInfo) { funInfoList.add(funInfo); } public void defineReserved(String s) { reservedWords.add(s.toUpperCase()); } /** * Indexes the collection of functions. */ protected void organizeFunctions() { Collections.sort(funInfoList); // Map upper-case function names to resolvers. final List> nonSingletonResolverLists = new ArrayList>(); for (Resolver resolver : resolverList) { Pair key = makeResolverKey( resolver.getName(), resolver.getSyntax()); List list = mapNameToResolvers.get(key); if (list == null) { list = new ArrayList(); mapNameToResolvers.put(key, list); } list.add(resolver); if (list.size() == 2) { nonSingletonResolverLists.add(list); } } // Sort lists by signature (skipping singleton lists) final Comparator comparator = new Comparator() { public int compare(Resolver o1, Resolver o2) { return o1.getSignature().compareTo(o2.getSignature()); } }; for (List resolverList : nonSingletonResolverLists) { Collections.sort(resolverList, comparator); } } } } // End FunTableImpl.java mondrian-3.11.0.1-R/src/main/mondrian/olap/fun/FunUtil.java000066400000000000000000003601131261646570300232550ustar00rootroot00000000000000/* // This software is subject to the terms of the Eclipse Public License v1.0 // Agreement, available at the following URL: // http://www.eclipse.org/legal/epl-v10.html. // You must accept the terms of that agreement to use this software. // // Copyright (C) 2002-2005 Julian Hyde // Copyright (C) 2005-2015 Pentaho and others // All Rights Reserved. */ package mondrian.olap.fun; import mondrian.calc.*; import mondrian.calc.impl.*; import mondrian.mdx.*; import mondrian.olap.*; import mondrian.olap.type.*; import mondrian.resource.MondrianResource; import mondrian.rolap.*; import mondrian.util.*; import org.apache.commons.collections.ComparatorUtils; import org.apache.commons.collections.comparators.ComparatorChain; import org.apache.log4j.Logger; import java.util.*; /** * {@code FunUtil} contains a set of methods useful within the {@code * mondrian.olap.fun} package. * * @author jhyde * @since 1.0 */ public class FunUtil extends Util { private static final Logger LOGGER = Logger.getLogger(FunUtil.class); private static final String SORT_TIMING_NAME = "Sort"; private static final String SORT_EVAL_TIMING_NAME = "EvalForSort"; static final String[] emptyStringArray = new String[0]; private static final boolean debug = false; public static final NullMember NullMember = new NullMember(); /** * Special value which indicates that a {@code double} computation * has returned the MDX null value. See {@link DoubleCalc}. */ public static final double DoubleNull = 0.000000012345; /** * Special value which indicates that a {@code double} computation * has returned the MDX EMPTY value. See {@link DoubleCalc}. */ public static final double DoubleEmpty = -0.000000012345; /** * Special value which indicates that an {@code int} computation * has returned the MDX null value. See {@link mondrian.calc.IntegerCalc}. */ public static final int IntegerNull = Integer.MIN_VALUE + 1; /** * Null value in three-valued boolean logic. * Actually, a placeholder until we actually implement 3VL. */ public static final boolean BooleanNull = false; /** * Creates an exception which indicates that an error has occurred while * executing a given function. * * @param funDef Function being executed * @param message Explanatory message * @return Exception that can be used as a cell result */ public static RuntimeException newEvalException( FunDef funDef, String message) { Util.discard(funDef); // TODO: use this return new MondrianEvaluationException(message); } /** * Creates an exception which indicates that an error has occurred while * executing a given function. * * @param throwable Exception * @return Exception that can be used as a cell result */ public static RuntimeException newEvalException(Throwable throwable) { return new MondrianEvaluationException( throwable.getClass().getName() + ": " + throwable.getMessage()); } /** * Creates an exception which indicates that an error has occurred while * executing a given function. * * @param message Explanatory message * @param throwable Exception * @return Exception that can be used as a cell result */ public static RuntimeException newEvalException( String message, Throwable throwable) { return new MondrianEvaluationException( message + ": " + Util.getErrorMessage(throwable)); } public static void checkIterListResultStyles(Calc calc) { switch (calc.getResultStyle()) { case ITERABLE: case LIST: case MUTABLE_LIST: break; default: throw ResultStyleException.generateBadType( ResultStyle.ITERABLE_LIST_MUTABLELIST, calc.getResultStyle()); } } public static void checkListResultStyles(Calc calc) { switch (calc.getResultStyle()) { case LIST: case MUTABLE_LIST: break; default: throw ResultStyleException.generateBadType( ResultStyle.LIST_MUTABLELIST, calc.getResultStyle()); } } /** * Returns an argument whose value is a literal. */ static String getLiteralArg( ResolvedFunCall call, int i, String defaultValue, String[] allowedValues) { if (i >= call.getArgCount()) { if (defaultValue == null) { throw newEvalException( call.getFunDef(), "Required argument is missing"); } else { return defaultValue; } } Exp arg = call.getArg(i); if (!(arg instanceof Literal) || arg.getCategory() != Category.Symbol) { throw newEvalException( call.getFunDef(), "Expected a symbol, found '" + arg + "'"); } String s = (String) ((Literal) arg).getValue(); StringBuilder sb = new StringBuilder(64); for (int j = 0; j < allowedValues.length; j++) { String allowedValue = allowedValues[j]; if (allowedValue.equalsIgnoreCase(s)) { return allowedValue; } if (j > 0) { sb.append(", "); } sb.append(allowedValue); } throw newEvalException( call.getFunDef(), "Allowed values are: {" + sb + "}"); } /** * Returns the ordinal of a literal argument. If the argument does not * belong to the supplied enumeration, returns -1. */ static > E getLiteralArg( ResolvedFunCall call, int i, E defaultValue, Class allowedValues) { if (i >= call.getArgCount()) { if (defaultValue == null) { throw newEvalException( call.getFunDef(), "Required argument is missing"); } else { return defaultValue; } } Exp arg = call.getArg(i); if (!(arg instanceof Literal) || arg.getCategory() != Category.Symbol) { throw newEvalException( call.getFunDef(), "Expected a symbol, found '" + arg + "'"); } String s = (String) ((Literal) arg).getValue(); for (E e : allowedValues.getEnumConstants()) { if (e.name().equalsIgnoreCase(s)) { return e; } } StringBuilder buf = new StringBuilder(64); int k = 0; for (E e : allowedValues.getEnumConstants()) { if (k++ > 0) { buf.append(", "); } buf.append(e.name()); } throw newEvalException( call.getFunDef(), "Allowed values are: {" + buf + "}"); } /** * Throws an error if the expressions don't have the same hierarchy. * @throws MondrianEvaluationException if expressions don't have the same * hierarchy */ static void checkCompatible(Exp left, Exp right, FunDef funDef) { final Type leftType = TypeUtil.stripSetType(left.getType()); final Type rightType = TypeUtil.stripSetType(right.getType()); if (!TypeUtil.isUnionCompatible(leftType, rightType)) { throw newEvalException( funDef, "Expressions must have the same hierarchy"); } } /** * Adds every element of {@code right} which is not in {@code set} * to both {@code set} and {@code left}. */ static void addUnique( TupleList left, TupleList right, Set> set) { assert left != null; assert right != null; if (right.isEmpty()) { return; } for (int i = 0, n = right.size(); i < n; i++) { List o = right.get(i); if (set.add(o)) { left.add(o); } } } /** * Returns the default hierarchy of a dimension, or null if there is no * default. * * @see MondrianResource#CannotImplicitlyConvertDimensionToHierarchy * * @param dimension Dimension * @return Default hierarchy, or null */ public static Hierarchy getDimensionDefaultHierarchy(Dimension dimension) { final Hierarchy[] hierarchies = dimension.getHierarchies(); if (hierarchies.length == 1) { return hierarchies[0]; } if (MondrianProperties.instance().SsasCompatibleNaming.get()) { // In SSAS 2005, dimensions with more than one hierarchy do not have // a default hierarchy. return null; } for (Hierarchy hierarchy : hierarchies) { if (hierarchy.getName() == null || hierarchy.getUniqueName().equals(dimension.getUniqueName())) { return hierarchy; } } return null; } static List addMembers( final SchemaReader schemaReader, final List members, final Hierarchy hierarchy) { // only add accessible levels for (Level level : schemaReader.getHierarchyLevels(hierarchy)) { addMembers(schemaReader, members, level); } return members; } static List addMembers( SchemaReader schemaReader, List members, Level level) { List levelMembers = schemaReader.getLevelMembers(level, true); members.addAll(levelMembers); return members; } /** * Removes every member from a list which is calculated. * The list must not be null, and must consist only of members. * * @param memberList Member list * @return List of non-calculated members */ static List removeCalculatedMembers(List memberList) { List clone = new ArrayList(); for (Member member : memberList) { if (member.isCalculated() && !member.isParentChildPhysicalMember()) { continue; } clone.add(member); } return clone; } /** * Removes every tuple from a list which is calculated. * The list must not be null, and must consist only of members. * * @param memberList Member list * @return List of non-calculated members */ static TupleList removeCalculatedMembers(TupleList memberList) { if (memberList.getArity() == 1) { return new UnaryTupleList( removeCalculatedMembers( memberList.slice(0))); } else { final TupleList clone = memberList.cloneList(memberList.size()); outer: for (List members : memberList) { for (Member member : members) { if (member.isCalculated() && !member.isParentChildPhysicalMember()) { continue outer; } } clone.add(members); } return clone; } } /** * Returns whether {@code m0} is an ancestor of {@code m1}. * * @param strict if true, a member is not an ancestor of itself */ static boolean isAncestorOf(Member m0, Member m1, boolean strict) { if (strict) { if (m1 == null) { return false; } m1 = m1.getParentMember(); } while (m1 != null) { if (m1.equals(m0)) { return true; } m1 = m1.getParentMember(); } return false; } /** * For each member in a list, evaluates an expression and creates a map * from members to values. * *

If the list contains tuples, use * {@link #evaluateTuples(mondrian.olap.Evaluator, mondrian.calc.Calc, mondrian.calc.TupleList)}. * * @param evaluator Evaluation context * @param exp Expression to evaluate * @param memberIter Iterable over the collection of members * @param memberList List to be populated with members, or null * @param parentsToo If true, evaluate the expression for all ancestors * of the members as well * * @pre exp != null * @pre exp.getType() instanceof ScalarType */ static Map evaluateMembers( Evaluator evaluator, Calc exp, Iterable memberIter, List memberList, boolean parentsToo) { final int savepoint = evaluator.savepoint(); try { assert exp.getType() instanceof ScalarType; Map mapMemberToValue = new HashMap(); for (Member member : memberIter) { if (memberList != null) { memberList.add(member); } while (true) { evaluator.setContext(member); Object result = exp.evaluate(evaluator); if (result == null) { result = Util.nullValue; } mapMemberToValue.put(member, result); if (!parentsToo) { break; } member = member.getParentMember(); if (member == null) { break; } if (mapMemberToValue.containsKey(member)) { break; } } } return mapMemberToValue; } finally { evaluator.restore(savepoint); } } /** * For each tuple in a list, evaluates an expression and creates a map * from tuples to values. * * @param evaluator Evaluation context * @param exp Expression to evaluate * @param tuples List of tuples * * @pre exp != null * @pre exp.getType() instanceof ScalarType */ static Map, Object> evaluateTuples( Evaluator evaluator, Calc exp, TupleList tuples) { final int savepoint = evaluator.savepoint(); try { assert exp.getType() instanceof ScalarType; final Map, Object> mapMemberToValue = new HashMap, Object>(); for (int i = 0, count = tuples.size(); i < count; i++) { List tuple = tuples.get(i); evaluator.setContext(tuple); Object result = exp.evaluate(evaluator); if (result == null) { result = Util.nullValue; } mapMemberToValue.put(tuple, result); } return mapMemberToValue; } finally { evaluator.restore(savepoint); } } /** * Helper function to sort a list of members according to an expression. * *

NOTE: This function does not preserve the contents of the validator. * *

If you do not specify {@code memberList}, the method * will build its own member list as it iterates over {@code memberIter}. * It is acceptable if {@code memberList} and {@code memberIter} are the * same list object. * *

If you specify {@code memberList}, the list is sorted in place, and * memberList is returned. * * @param evaluator Evaluator * @param memberIter Iterable over members * @param memberList List of members * @param exp Expression to sort on * @param desc Whether to sort descending * @param brk Whether to break * @return sorted list (never null) */ static List sortMembers( Evaluator evaluator, Iterable memberIter, List memberList, Calc exp, boolean desc, boolean brk) { if ((memberList != null) && (memberList.size() <= 1)) { return memberList; } evaluator.getTiming().markStart(SORT_EVAL_TIMING_NAME); boolean timingEval = true; boolean timingSort = false; try { // REVIEW mberkowitz 1/09: test whether precomputing // values saves time. Map mapMemberToValue; final boolean parentsToo = !brk; if (memberList == null) { memberList = new ArrayList(); mapMemberToValue = evaluateMembers( evaluator, exp, memberIter, memberList, parentsToo); } else { mapMemberToValue = evaluateMembers( evaluator, exp, memberIter, null, parentsToo); } MemberComparator comp; if (brk) { comp = new BreakMemberComparator(evaluator, exp, desc); } else { comp = new HierarchicalMemberComparator(evaluator, exp, desc); } comp.preloadValues(mapMemberToValue); evaluator.getTiming().markEnd(SORT_EVAL_TIMING_NAME); timingEval = false; evaluator.getTiming().markStart(SORT_TIMING_NAME); timingSort = true; Collections.sort(memberList, comp.wrap()); return memberList; } finally { if (timingEval) { evaluator.getTiming().markEnd(SORT_EVAL_TIMING_NAME); } else if (timingSort) { evaluator.getTiming().markEnd(SORT_TIMING_NAME); } } } /** * Sorts a list of members according to a list of SortKeySpecs. * An in-place, Stable sort. * Helper function for MDX OrderSet function. * *

NOTE: Does not preserve the contents of the validator. */ static List sortMembers( Evaluator evaluator, Iterable memberIter, List memberList, List keySpecList) { if ((memberList != null) && (memberList.size() <= 1)) { return memberList; } if (memberList == null) { memberList = new ArrayList(); for (Member member : memberIter) { memberList.add(member); } if (memberList.size() <= 1) { return memberList; } } ComparatorChain chain = new ComparatorChain(); for (SortKeySpec key : keySpecList) { boolean brk = key.direction.brk; MemberComparator comp; if (brk) { comp = new BreakMemberComparator( evaluator, key.key, key.direction.descending); } else { comp = new HierarchicalMemberComparator( evaluator, key.key, key.direction.descending); } comp.preloadValues(memberList); chain.addComparator(comp.wrap(), false); } Collections.sort(memberList, chain); return memberList; } /** * Sorts a list of Tuples by the value of an applied expression. Stable * sort. * *

Helper function for MDX functions TopCount, TopSum, TopPercent, * BottomCount, BottomSum, BottomPercent, but not the MDX function Order. * *

NOTE: This function does not preserve the contents of the validator. * *

If you specify {@code tupleList}, the list is sorted in place, and * tupleList is returned. * * @param evaluator Evaluator * @param tupleIterable Iterator over tuples * @param tupleList List of tuples, if known, otherwise null * @param exp Expression to sort on * @param desc Whether to sort descending * @param brk Whether to break * @param arity Number of members in each tuple * @return sorted list (never null) */ public static TupleList sortTuples( Evaluator evaluator, TupleIterable tupleIterable, TupleList tupleList, Calc exp, boolean desc, boolean brk, int arity) { // NOTE: This method does not implement the iterable/list concept // as fully as sortMembers. This is because sortMembers evaluates all // sort expressions up front. There, it is efficient to unravel the // iterator and evaluate the sort expressions at the same time. List> tupleArrayList; if (tupleList == null) { tupleArrayList = new ArrayList>(); final TupleCursor cursor = tupleIterable.tupleCursor(); while (cursor.forward()) { tupleArrayList.add(cursor.current()); } if (tupleArrayList.size() <= 1) { return new DelegatingTupleList( tupleIterable.getArity(), tupleArrayList); } } else { if (tupleList.size() <= 1) { return tupleList; } tupleArrayList = tupleList; } @SuppressWarnings({"unchecked"}) List[] tuples = tupleArrayList.toArray(new List[tupleArrayList.size()]); final DelegatingTupleList result = new DelegatingTupleList( tupleIterable.getArity(), Arrays.asList(tuples)); Comparator> comparator; if (brk) { comparator = new BreakTupleComparator(evaluator, exp, arity); if (desc) { comparator = Collections.reverseOrder(comparator); } } else { comparator = new HierarchicalTupleComparator(evaluator, exp, arity, desc); } Arrays.sort(tuples, comparator); if (LOGGER.isDebugEnabled()) { StringBuilder sb = new StringBuilder("FunUtil.sortTuples returned:"); for (List tuple : tuples) { sb.append("\n"); sb.append(tuple.toString()); } LOGGER.debug(sb.toString()); } return result; } /** * Partially sorts a list of Members by the value of an applied expression. * *

Avoids sorting the whole list, finds only the ntop (or bottom) * valued Members, and returns them as a new List. Helper function for MDX * functions TopCount and BottomCount.

* *

NOTE: Does not preserve the contents of the validator.

* * @param list a list of members * @param exp a Calc applied to each member to find its sort-key * @param evaluator Evaluator * @param limit maximum count of members to return. * @param desc true to sort descending (and find TopCount), false to sort * ascending (and find BottomCount). * @return the top or bottom members, as a new list. */ public static List partiallySortMembers( Evaluator evaluator, List list, Calc exp, int limit, boolean desc) { assert list.size() > 0; assert limit <= list.size(); evaluator.getTiming().markStart(SORT_EVAL_TIMING_NAME); boolean timingEval = true; boolean timingSort = false; try { MemberComparator comp = new BreakMemberComparator(evaluator, exp, desc); Map valueMap = evaluateMembers(evaluator, exp, list, null, false); evaluator.getTiming().markEnd(SORT_EVAL_TIMING_NAME); timingEval = false; evaluator.getTiming().markStart(SORT_TIMING_NAME); timingSort = true; comp.preloadValues(valueMap); return stablePartialSort(list, comp.wrap(), limit); } finally { if (timingEval) { evaluator.getTiming().markEnd(SORT_EVAL_TIMING_NAME); } else if (timingSort) { evaluator.getTiming().markEnd(SORT_TIMING_NAME); } } } /** * Helper function to sort a list of tuples according to a list * of expressions and a list of sorting flags. * *

NOTE: This function does not preserve the contents of the validator. */ static TupleList sortTuples( Evaluator evaluator, TupleIterable tupleIter, TupleList tupleList, List keySpecList, int arity) { if (tupleList == null) { tupleList = TupleCollections.createList(arity); TupleCursor cursor = tupleIter.tupleCursor(); while (cursor.forward()) { tupleList.addCurrent(cursor); } } if (tupleList.size() <= 1) { return tupleList; } ComparatorChain chain = new ComparatorChain(); for (SortKeySpec key : keySpecList) { boolean brk = key.direction.brk; boolean orderByKey = key.key.isWrapperFor(MemberOrderKeyFunDef.CalcImpl.class); if (brk) { TupleExpMemoComparator comp = new BreakTupleComparator(evaluator, key.key, arity); comp.preloadValues(tupleList); chain.addComparator(comp, key.direction.descending); } else if (orderByKey) { TupleExpMemoComparator comp = new HierarchicalTupleKeyComparator( evaluator, key.key, arity); comp.preloadValues(tupleList); chain.addComparator(comp, key.direction.descending); } else { TupleExpComparator comp = new HierarchicalTupleComparator( evaluator, key.key, arity, key.direction.descending); chain.addComparator(comp, false); } } Collections.sort(tupleList, chain); if (LOGGER.isDebugEnabled()) { StringBuilder sb = new StringBuilder("FunUtil.sortTuples returned:"); for (List tuple : tupleList) { sb.append("\n"); sb.append(tuple.toString()); } LOGGER.debug(sb.toString()); } return tupleList; } /** * Partially sorts a list of Tuples by the value of an applied expression. * *

Avoids sorting the whole list, finds only the n top (or bottom) * valued Tuples, and returns them as a new List. Helper function for MDX * functions TopCount and BottomCount. * *

NOTE: Does not preserve the contents of the validator. The returned * list is immutable. * * @param evaluator Evaluator * @param list a list of tuples * @param exp a Calc applied to each tuple to find its sort-key * @param limit maximum count of tuples to return. * @param desc true to sort descending (and find TopCount), * false to sort ascending (and find BottomCount). * @return the top or bottom tuples, as a new list. */ public static List> partiallySortTuples( Evaluator evaluator, TupleList list, Calc exp, int limit, boolean desc) { assert list.size() > 0; assert limit <= list.size(); Comparator> comp = new BreakTupleComparator(evaluator, exp, list.getArity()); if (desc) { comp = Collections.reverseOrder(comp); } return stablePartialSort(list, comp, limit); } /** * Sorts a list of members into hierarchical order. The members must belong * to the same dimension. * * @param memberList List of members * @param post Whether to sort in post order; if false, sorts in pre order * * @see #hierarchizeTupleList(mondrian.calc.TupleList, boolean) */ public static void hierarchizeMemberList( List memberList, boolean post) { if (memberList.size() <= 1) { return; } Dimension dimension = memberList.get(0).getDimension(); if (dimension.isHighCardinality()) { LOGGER.warn( MondrianResource.instance() .HighCardinalityInDimension.str( dimension.getUniqueName())); return; } Comparator comparator = new HierarchizeComparator(post); Collections.sort(memberList, comparator); } /** * Sorts a list of tuples into hierarchical order. * * @param tupleList List of tuples * @param post Whether to sort in post order; if false, sorts in pre order * * @see #hierarchizeMemberList(java.util.List, boolean) */ public static TupleList hierarchizeTupleList( TupleList tupleList, boolean post) { if (tupleList.isEmpty()) { TupleCollections.emptyList(tupleList.getArity()); } final TupleList fixedList = tupleList.fix(); if (tupleList.getArity() == 1) { hierarchizeMemberList(fixedList.slice(0), post); return fixedList; } Comparator> comparator = new HierarchizeTupleComparator(fixedList.getArity(), post); Collections.sort(fixedList, comparator); if (LOGGER.isDebugEnabled()) { StringBuilder sb = new StringBuilder("FunUtil.hierarchizeTupleList returned:"); for (List tuple : fixedList) { sb.append("\n"); sb.append(tuple.toString()); } } return fixedList; } /** * Compares double-precision values according to MDX semantics. * *

MDX requires a total order: *

* -inf < NULL < ... < -1 < ... < 0 < ... < NaN < * +inf *
* but this is different than Java semantics, specifically with regard * to {@link Double#NaN}. */ public static int compareValues(double d1, double d2) { if (Double.isNaN(d1)) { if (d2 == Double.POSITIVE_INFINITY) { return -1; } else if (Double.isNaN(d2)) { return 0; } else { return 1; } } else if (Double.isNaN(d2)) { if (d1 == Double.POSITIVE_INFINITY) { return 1; } else { return -1; } } else if (d1 == d2) { return 0; } else if (d1 == FunUtil.DoubleNull) { if (d2 == Double.NEGATIVE_INFINITY) { return 1; } else { return -1; } } else if (d2 == FunUtil.DoubleNull) { if (d1 == Double.NEGATIVE_INFINITY) { return -1; } else { return 1; } } else if (d1 < d2) { return -1; } else { return 1; } } /** * Compares two cell values. * *

Nulls compare last, exceptions (including the * object which indicates the the cell is not in the cache yet) next, * then numbers and strings are compared by value. * * @param value0 First cell value * @param value1 Second cell value * @return -1, 0, or 1, depending upon whether first cell value is less * than, equal to, or greater than the second */ public static int compareValues(Object value0, Object value1) { if (value0 == value1) { return 0; } // null is less than anything else if (value0 == null) { return -1; } if (value1 == null) { return 1; } if (value0 == RolapUtil.valueNotReadyException) { // the left value is not in cache; continue as best as we can return -1; } else if (value1 == RolapUtil.valueNotReadyException) { // the right value is not in cache; continue as best as we can return 1; } else if (value0 == Util.nullValue) { return -1; // null == -infinity } else if (value1 == Util.nullValue) { return 1; // null == -infinity } else if (value0 instanceof String) { return ((String) value0).compareToIgnoreCase((String) value1); } else if (value0 instanceof Number) { return FunUtil.compareValues( ((Number) value0).doubleValue(), ((Number) value1).doubleValue()); } else if (value0 instanceof Date) { return ((Date) value0).compareTo((Date) value1); } else if (value0 instanceof OrderKey) { return ((OrderKey) value0).compareTo(value1); } else { throw Util.newInternal("cannot compare " + value0); } } /** * Turns the mapped values into relative values (percentages) for easy * use by the general topOrBottom function. This might also be a useful * function in itself. */ static void toPercent( TupleList members, Map, Object> mapMemberToValue) { double total = 0; int memberCount = members.size(); for (int i = 0; i < memberCount; i++) { final List key = members.get(i); final Object o = mapMemberToValue.get(key); if (o instanceof Number) { total += ((Number) o).doubleValue(); } } for (int i = 0; i < memberCount; i++) { final List key = members.get(i); final Object o = mapMemberToValue.get(key); if (o instanceof Number) { double d = ((Number) o).doubleValue(); mapMemberToValue.put( key, d / total * (double) 100); } } } /** * Decodes the syntactic type of an operator. * * @param flags A encoded string which represents an operator signature, * as used by the {@code flags} parameter used to construct a * {@link FunDefBase}. * * @return A {@link Syntax} */ public static Syntax decodeSyntacticType(String flags) { char c = flags.charAt(0); switch (c) { case 'p': return Syntax.Property; case 'f': return Syntax.Function; case 'm': return Syntax.Method; case 'i': return Syntax.Infix; case 'P': return Syntax.Prefix; case 'Q': return Syntax.Postfix; case 'I': return Syntax.Internal; default: throw newInternal( "unknown syntax code '" + c + "' in string '" + flags + "'"); } } /** * Decodes the signature of a function into a category code which describes * the return type of the operator. * *

For example, decodeReturnType("fnx") returns * {@link Category#Numeric}, indicating this function has a * numeric return value. * * @param flags The signature of an operator, * as used by the {@code flags} parameter used to construct a * {@link FunDefBase}. * * @return An array {@link Category} codes. */ public static int decodeReturnCategory(String flags) { final int returnCategory = decodeCategory(flags, 1); if ((returnCategory & Category.Mask) != returnCategory) { throw newInternal("bad return code flag in flags '" + flags + "'"); } return returnCategory; } /** * Decodes the {@code offset}th character of an encoded method * signature into a type category. * *

The codes are: * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
a{@link Category#Array}
d{@link Category#Dimension}
h{@link Category#Hierarchy}
l{@link Category#Level}
b{@link Category#Logical}
m{@link Category#Member}
NConstant {@link Category#Numeric}
n{@link Category#Numeric}
x{@link Category#Set}
#Constant {@link Category#String}
S{@link Category#String}
t{@link Category#Tuple}
v{@link Category#Value}
y{@link Category#Symbol}
* * @param flags Encoded signature string * @param offset 0-based offset of character within string * @return A {@link Category} */ public static int decodeCategory(String flags, int offset) { char c = flags.charAt(offset); switch (c) { case 'a': return Category.Array; case 'd': return Category.Dimension; case 'h': return Category.Hierarchy; case 'l': return Category.Level; case 'b': return Category.Logical; case 'm': return Category.Member; case 'N': return Category.Numeric | Category.Constant; case 'n': return Category.Numeric; case 'I': return Category.Numeric | Category.Integer | Category.Constant; case 'i': return Category.Numeric | Category.Integer; case 'x': return Category.Set; case '#': return Category.String | Category.Constant; case 'S': return Category.String; case 't': return Category.Tuple; case 'v': return Category.Value; case 'y': return Category.Symbol; case 'U': return Category.Null; case 'e': return Category.Empty; case 'D': return Category.DateTime; default: throw newInternal( "unknown type code '" + c + "' in string '" + flags + "'"); } } /** * Decodes a string of parameter types into an array of type codes. * *

Each character is decoded using {@link #decodeCategory(String, int)}. * For example, decodeParameterTypes("nx") returns * {{@link Category#Numeric}, {@link Category#Set}}. * * @param flags The signature of an operator, * as used by the {@code flags} parameter used to construct a * {@link FunDefBase}. * * @return An array {@link Category} codes. */ public static int[] decodeParameterCategories(String flags) { int[] parameterCategories = new int[flags.length() - 2]; for (int i = 0; i < parameterCategories.length; i++) { parameterCategories[i] = decodeCategory(flags, i + 2); } return parameterCategories; } /** * Converts a double (primitive) value to a Double. {@link #DoubleNull} * becomes null. */ public static Double box(double d) { return d == DoubleNull ? null : d; } /** * Converts an int (primitive) value to an Integer. {@link #IntegerNull} * becomes null. */ public static Integer box(int n) { return n == IntegerNull ? null : n; } static double percentile( Evaluator evaluator, TupleList members, Calc exp, double p) { SetWrapper sw = evaluateSet(evaluator, members, exp); if (sw.errorCount > 0) { return Double.NaN; } else if (sw.v.size() == 0) { return FunUtil.DoubleNull; } double[] asArray = new double[sw.v.size()]; for (int i = 0; i < asArray.length; i++) { asArray[i] = (Double) sw.v.get(i); } Arrays.sort(asArray); // The median is defined as the value that has exactly the same // number of entries before it in the sorted list as after. // So, if the number of entries in the list is odd, the // median is the entry at (length-1)/2 (using zero-based indexes). // If the number of entries is even, the median is defined as the // arithmetic mean of the two numbers in the middle of the list, or // (entries[length/2 - 1] + entries[length/2]) / 2. int length = asArray.length; if (length == 1) { // if array contains a single element return it return asArray[0]; } if (p <= 0.0) { return asArray[0]; } else if (p >= 1.0) { return asArray[length - 1]; } else if (length == 1) { return asArray[0]; } else if (p == 0.5) { // Special case for median. if ((length & 1) == 1) { // The length is odd. Note that length/2 is an integer // expression, and it's positive so we save ourselves a divide. return asArray[length >> 1]; } else { return (asArray[(length >> 1) - 1] + asArray[length >> 1]) / 2.0; } } else { final double rank = ((length - 1) * p) + 1; final int integerPart = (int) Math.floor(rank); assert integerPart >= 1; final double decimalPart = rank - integerPart; assert decimalPart >= 0; assert decimalPart <= 1; int indexForFormula = integerPart - 1; double percentile = asArray[indexForFormula] + ((asArray[indexForFormula + 1] - asArray[indexForFormula]) * decimalPart); return percentile; } } /** * Returns the member which lies upon a particular quartile according to a * given expression. * * @param evaluator Evaluator * @param members List of members * @param exp Expression to rank members * @param range Quartile (1, 2 or 3) * * @pre range >= 1 && range <= 3 */ protected static double quartile( Evaluator evaluator, TupleList members, Calc exp, int range) { assert range >= 1 && range <= 3; SetWrapper sw = evaluateSet(evaluator, members, exp); if (sw.errorCount > 0) { return Double.NaN; } else if (sw.v.size() == 0) { return DoubleNull; } double[] asArray = new double[sw.v.size()]; for (int i = 0; i < asArray.length; i++) { asArray[i] = ((Double) sw.v.get(i)).doubleValue(); } Arrays.sort(asArray); // get a quartile, median is a second q double dm = 0.25 * asArray.length * range; int median = (int) Math.floor(dm); return dm == median && median < asArray.length - 1 ? (asArray[median] + asArray[median + 1]) / 2 : asArray[median]; } public static Object min( Evaluator evaluator, TupleList members, Calc calc) { SetWrapper sw = evaluateSet(evaluator, members, calc); if (sw.errorCount > 0) { return Double.NaN; } else { final int size = sw.v.size(); if (size == 0) { return Util.nullValue; } else { Double min = ((Number) sw.v.get(0)).doubleValue(); for (int i = 1; i < size; i++) { Double iValue = ((Number) sw.v.get(i)).doubleValue(); if (iValue < min) { min = iValue; } } return min; } } } public static Object max( Evaluator evaluator, TupleList members, Calc exp) { SetWrapper sw = evaluateSet(evaluator, members, exp); if (sw.errorCount > 0) { return Double.NaN; } else { final int size = sw.v.size(); if (size == 0) { return Util.nullValue; } else { Double max = ((Number) sw.v.get(0)).doubleValue(); for (int i = 1; i < size; i++) { Double iValue = ((Number) sw.v.get(i)).doubleValue(); if (iValue > max) { max = iValue; } } return max; } } } static Object var( Evaluator evaluator, TupleList members, Calc exp, boolean biased) { SetWrapper sw = evaluateSet(evaluator, members, exp); return _var(sw, biased); } private static Object _var(SetWrapper sw, boolean biased) { if (sw.errorCount > 0) { return new Double(Double.NaN); } else if (sw.v.size() == 0) { return Util.nullValue; } else { double stdev = 0.0; double avg = _avg(sw); for (int i = 0; i < sw.v.size(); i++) { stdev += Math.pow((((Number) sw.v.get(i)).doubleValue() - avg), 2); } int n = sw.v.size(); if (!biased) { n--; } return new Double(stdev / (double) n); } } static double correlation( Evaluator evaluator, TupleList memberList, Calc exp1, Calc exp2) { SetWrapper sw1 = evaluateSet(evaluator, memberList, exp1); SetWrapper sw2 = evaluateSet(evaluator, memberList, exp2); Object covar = _covariance(sw1, sw2, false); Object var1 = _var(sw1, false); // this should be false, yes? Object var2 = _var(sw2, false); return ((Number) covar).doubleValue() / Math.sqrt( ((Number) var1).doubleValue() * ((Number) var2).doubleValue()); } static Object covariance( Evaluator evaluator, TupleList members, Calc exp1, Calc exp2, boolean biased) { final int savepoint = evaluator.savepoint(); SetWrapper sw1; try { sw1 = evaluateSet(evaluator, members, exp1); } finally { evaluator.restore(savepoint); } SetWrapper sw2; try { sw2 = evaluateSet(evaluator, members, exp2); } finally { evaluator.restore(savepoint); } // todo: because evaluateSet does not add nulls to the SetWrapper, this // solution may lead to mismatched lists and is therefore not robust return _covariance(sw1, sw2, biased); } private static Object _covariance( SetWrapper sw1, SetWrapper sw2, boolean biased) { if (sw1.v.size() != sw2.v.size()) { return Util.nullValue; } double avg1 = _avg(sw1); double avg2 = _avg(sw2); double covar = 0.0; for (int i = 0; i < sw1.v.size(); i++) { // all of this casting seems inefficient - can we make SetWrapper // contain an array of double instead? double diff1 = (((Number) sw1.v.get(i)).doubleValue() - avg1); double diff2 = (((Number) sw2.v.get(i)).doubleValue() - avg2); covar += (diff1 * diff2); } int n = sw1.v.size(); if (!biased) { n--; } return new Double(covar / (double) n); } static Object stdev( Evaluator evaluator, TupleList members, Calc exp, boolean biased) { Object o = var(evaluator, members, exp, biased); return (o instanceof Double) ? new Double(Math.sqrt(((Number) o).doubleValue())) : o; } public static Object avg( Evaluator evaluator, TupleList members, Calc calc) { SetWrapper sw = evaluateSet(evaluator, members, calc); return (sw.errorCount > 0) ? new Double(Double.NaN) : (sw.v.size() == 0) ? Util.nullValue : new Double(_avg(sw)); } // TODO: parameterize inclusion of nulls; also, maybe make _avg a method of // setwrapper, so we can cache the result (i.e. for correl) private static double _avg(SetWrapper sw) { double sum = 0.0; for (int i = 0; i < sw.v.size(); i++) { sum += ((Number) sw.v.get(i)).doubleValue(); } // TODO: should look at context and optionally include nulls return sum / (double) sw.v.size(); } public static Object sum( Evaluator evaluator, TupleList members, Calc exp) { double d = sumDouble(evaluator, members, exp); return d == DoubleNull ? Util.nullValue : new Double(d); } public static double sumDouble( Evaluator evaluator, TupleList members, Calc exp) { SetWrapper sw = evaluateSet(evaluator, members, exp); if (sw.errorCount > 0) { return Double.NaN; } else if (sw.v.size() == 0) { return DoubleNull; } else { double sum = 0.0; for (int i = 0; i < sw.v.size(); i++) { sum += ((Number) sw.v.get(i)).doubleValue(); } return sum; } } public static double sumDouble( Evaluator evaluator, TupleIterable iterable, Calc exp) { SetWrapper sw = evaluateSet(evaluator, iterable, exp); if (sw.errorCount > 0) { return Double.NaN; } else if (sw.v.size() == 0) { return DoubleNull; } else { double sum = 0.0; for (int i = 0; i < sw.v.size(); i++) { sum += ((Number) sw.v.get(i)).doubleValue(); } return sum; } } public static int count( Evaluator evaluator, TupleIterable iterable, boolean includeEmpty) { if (iterable == null) { return 0; } if (includeEmpty) { if (iterable instanceof TupleList) { return ((TupleList) iterable).size(); } else { int retval = 0; TupleCursor cursor = iterable.tupleCursor(); while (cursor.forward()) { retval++; } return retval; } } else { int retval = 0; TupleCursor cursor = iterable.tupleCursor(); while (cursor.forward()) { cursor.setContext(evaluator); if (!evaluator.currentIsEmpty()) { retval++; } } return retval; } } /** * Evaluates {@code exp} (if defined) over {@code members} to * generate a {@link List} of {@link SetWrapper} objects, which contains * a {@link Double} value and meta information, unlike * {@link #evaluateMembers}, which only produces values. * * @pre exp != null */ static SetWrapper evaluateSet( Evaluator evaluator, TupleIterable members, Calc calc) { assert members != null; assert calc != null; assert calc.getType() instanceof ScalarType; // todo: treat constant exps as evaluateMembers() does SetWrapper retval = new SetWrapper(); final TupleCursor cursor = members.tupleCursor(); while (cursor.forward()) { cursor.setContext(evaluator); Object o = calc.evaluate(evaluator); if (o == null || o == Util.nullValue) { retval.nullCount++; } else if (o == RolapUtil.valueNotReadyException) { // Carry on summing, so that if we are running in a // BatchingCellReader, we find out all the dependent cells we // need retval.errorCount++; } else if (o instanceof Number) { retval.v.add(((Number) o).doubleValue()); } else { retval.v.add(o); } } return retval; } /** * Evaluates one or more expressions against the member list returning * a SetWrapper array. Where this differs very significantly from the * above evaluateSet methods is how it count null values and Throwables; * this method adds nulls to the SetWrapper Vector rather than not adding * anything - as the above method does. The impact of this is that if, for * example, one was creating a list of x,y values then each list will have * the same number of values (though some might be null) - this allows * higher level code to determine how to handle the lack of data rather than * having a non-equal number (if one is plotting x,y values it helps to * have the same number and know where a potential gap is the data is. */ static SetWrapper[] evaluateSet( Evaluator evaluator, TupleList list, DoubleCalc[] calcs) { Util.assertPrecondition(calcs != null, "calcs != null"); // todo: treat constant exps as evaluateMembers() does SetWrapper[] retvals = new SetWrapper[calcs.length]; for (int i = 0; i < calcs.length; i++) { retvals[i] = new SetWrapper(); } final TupleCursor cursor = list.tupleCursor(); while (cursor.forward()) { cursor.setContext(evaluator); for (int i = 0; i < calcs.length; i++) { DoubleCalc calc = calcs[i]; SetWrapper retval = retvals[i]; double o = calc.evaluateDouble(evaluator); if (o == FunUtil.DoubleNull) { retval.nullCount++; retval.v.add(null); } else { retval.v.add(o); } // TODO: If the expression yielded an error, carry on // summing, so that if we are running in a // BatchingCellReader, we find out all the dependent cells // we need } } return retvals; } static List periodsToDate( Evaluator evaluator, Level level, Member member) { if (member == null) { member = evaluator.getContext(level.getHierarchy()); } Member m = member; while (m != null) { if (m.getLevel() == level) { break; } m = m.getParentMember(); } // If m == null, then "level" was lower than member's level. // periodsToDate([Time].[Quarter], [Time].[1997] is valid, // but will return an empty List List members = new ArrayList(); if (m != null) { // e.g. m is [Time].[1997] and member is [Time].[1997].[Q1].[3] // we now have to make m to be the first member of the range, // so m becomes [Time].[1997].[Q1].[1] SchemaReader reader = evaluator.getSchemaReader(); m = Util.getFirstDescendantOnLevel(reader, m, member.getLevel()); reader.getMemberRange(level, m, member, members); } return members; } static List memberRange( Evaluator evaluator, Member startMember, Member endMember) { final Level level = startMember.getLevel(); assertTrue(level == endMember.getLevel()); List members = new ArrayList(); evaluator.getSchemaReader().getMemberRange( level, startMember, endMember, members); if (members.isEmpty()) { // The result is empty, so maybe the members are reversed. This is // cheaper than comparing the members before we call getMemberRange. evaluator.getSchemaReader().getMemberRange( level, endMember, startMember, members); } return members; } /** * Returns the member under ancestorMember having the same relative position * under member's parent. *

For exmaple, cousin([Feb 2001], [Q3 2001]) is [August 2001]. * @param schemaReader The reader to use * @param member The member for which we'll find the cousin. * @param ancestorMember The cousin's ancestor. * * @return The child of {@code ancestorMember} in the same position * under {@code ancestorMember} as {@code member} is under its * parent. */ static Member cousin( SchemaReader schemaReader, Member member, Member ancestorMember) { if (ancestorMember.isNull()) { return ancestorMember; } if (member.getHierarchy() != ancestorMember.getHierarchy()) { throw MondrianResource.instance().CousinHierarchyMismatch.ex( member.getUniqueName(), ancestorMember.getUniqueName()); } if (member.getLevel().getDepth() < ancestorMember.getLevel().getDepth()) { return member.getHierarchy().getNullMember(); } Member cousin = cousin2(schemaReader, member, ancestorMember); if (cousin == null) { cousin = member.getHierarchy().getNullMember(); } return cousin; } private static Member cousin2( SchemaReader schemaReader, Member member1, Member member2) { if (member1.getLevel() == member2.getLevel()) { return member2; } Member uncle = cousin2(schemaReader, member1.getParentMember(), member2); if (uncle == null) { return null; } int ordinal = Util.getMemberOrdinalInParent(schemaReader, member1); List cousins = schemaReader.getMemberChildren(uncle); if (cousins.size() <= ordinal) { return null; } return cousins.get(ordinal); } /** * Returns the ancestor of {@code member} at the given level * or distance. It is assumed that any error checking required * has been done prior to calling this function. * *

This method takes into consideration the fact that there * may be intervening hidden members between {@code member} * and the ancestor. If {@code targetLevel} is not null, then * the method will only return a member if the level at * {@code distance} from the member is actually the * {@code targetLevel} specified. * * @param evaluator The evaluation context * @param member The member for which the ancestor is to be found * @param distance The distance up the chain the ancestor is to * be found. * * @param targetLevel The desired targetLevel of the ancestor. If * {@code null}, then the distance completely determines the desired * ancestor. * * @return The ancestor member, or {@code null} if no such * ancestor exists. */ static Member ancestor( Evaluator evaluator, Member member, int distance, Level targetLevel) { if ((targetLevel != null) && (member.getHierarchy() != targetLevel.getHierarchy())) { throw MondrianResource.instance().MemberNotInLevelHierarchy.ex( member.getUniqueName(), targetLevel.getUniqueName()); } if (distance == 0) { // Shortcut if there's nowhere to go. return member; } else if (distance < 0) { // Can't go backwards. return member.getHierarchy().getNullMember(); } final List ancestors = new ArrayList(); final SchemaReader schemaReader = evaluator.getSchemaReader(); schemaReader.getMemberAncestors(member, ancestors); Member result = member.getHierarchy().getNullMember(); searchLoop: for (int i = 0; i < ancestors.size(); i++) { final Member ancestorMember = ancestors.get(i); if (targetLevel != null) { if (ancestorMember.getLevel() == targetLevel) { if (schemaReader.isVisible(ancestorMember)) { result = ancestorMember; break; } else { result = member.getHierarchy().getNullMember(); break; } } } else { if (schemaReader.isVisible(ancestorMember)) { distance--; // Make sure that this ancestor is really on the right // targetLevel. If a targetLevel was specified and at least // one of the ancestors was hidden, this this algorithm goes // too far up the ancestor list. It's not a problem, except // that we need to check if it's happened and return the // hierarchy's null member instead. // // For example, consider what happens with // Ancestor([Store].[Israel].[Haifa], [Store].[Store // State]). The distance from [Haifa] to [Store State] is // 1, but that lands us at the country targetLevel, which is // clearly wrong. if (distance == 0) { result = ancestorMember; break; } } } } return result; } /** * Compares a pair of members according to their positions in a * prefix-order (or postfix-order, if {@code post} is true) walk * over a hierarchy. * * @param m1 First member * @param m2 Second member * * @param post Whether to sortMembers in postfix order. If true, a parent * will sortMembers immediately after its last child. If false, a parent * will sortMembers immediately before its first child. * * @return -1 if m1 collates before m2, * 0 if m1 equals m2, * 1 if m1 collates after m2 */ public static int compareHierarchically( Member m1, Member m2, boolean post) { // Strip away the LimitedRollupMember wrapper, if it exists. The // wrapper does not implement equals and comparisons correctly. This // is safe this method has no side-effects: it just returns an int. m1 = unwrapLimitedRollupMember(m1); m2 = unwrapLimitedRollupMember(m2); if (equals(m1, m2)) { return 0; } while (true) { int depth1 = m1.getDepth(); int depth2 = m2.getDepth(); if (depth1 < depth2) { m2 = m2.getParentMember(); if (equals(m1, m2)) { return post ? 1 : -1; } } else if (depth1 > depth2) { m1 = m1.getParentMember(); if (equals(m1, m2)) { return post ? -1 : 1; } } else { Member prev1 = m1; Member prev2 = m2; m1 = unwrapLimitedRollupMember(m1.getParentMember()); m2 = unwrapLimitedRollupMember(m2.getParentMember()); if (equals(m1, m2)) { final int c = compareSiblingMembers(prev1, prev2); // compareHierarchically needs to impose a total order; // cannot return 0 for non-equal members assert c != 0 : "Members " + prev1 + ", " + prev2 + " are not equal, but compare returned 0."; return c; } } } } private static Member unwrapLimitedRollupMember(Member m) { if (m instanceof RolapHierarchy.LimitedRollupMember) { return ((RolapHierarchy.LimitedRollupMember) m).member; } return m; } /** * Compares two members which are known to have the same parent. * * First, compare by ordinal. * This is only valid now we know they're siblings, because * ordinals are only unique within a parent. * If the dimension does not use ordinals, both ordinals * will be -1. * *

If the ordinals do not differ, compare using regular member * comparison. * * @param m1 First member * @param m2 Second member * @return -1 if m1 collates less than m2, * 1 if m1 collates after m2, * 0 if m1 == m2. */ public static int compareSiblingMembers(Member m1, Member m2) { // calculated members collate after non-calculated final boolean calculated1 = m1.isCalculatedInQuery(); final boolean calculated2 = m2.isCalculatedInQuery(); if (calculated1) { if (!calculated2) { return 1; } } else { if (calculated2) { return -1; } } final Comparable k1 = m1.getOrderKey(); final Comparable k2 = m2.getOrderKey(); if ((k1 != null) && (k2 != null)) { return k1.compareTo(k2); } else { final int ordinal1 = m1.getOrdinal(); final int ordinal2 = m2.getOrdinal(); return (ordinal1 == ordinal2) ? m1.compareTo(m2) : (ordinal1 < ordinal2) ? -1 : 1; } } /** * Returns whether one of the members in a tuple is null. */ public static boolean tupleContainsNullMember(Member[] tuple) { for (Member member : tuple) { if (member.isNull()) { return true; } } return false; } /** * Returns whether one of the members in a tuple is null. */ public static boolean tupleContainsNullMember(List tuple) { for (Member member : tuple) { if (member.isNull()) { return true; } } return false; } public static Member[] makeNullTuple(final TupleType tupleType) { final Type[] elementTypes = tupleType.elementTypes; Member[] members = new Member[elementTypes.length]; for (int i = 0; i < elementTypes.length; i++) { MemberType type = (MemberType) elementTypes[i]; members[i] = makeNullMember(type); } return members; } static Member makeNullMember(MemberType memberType) { Hierarchy hierarchy = memberType.getHierarchy(); if (hierarchy == null) { return NullMember; } return hierarchy.getNullMember(); } /** * Validates the arguments to a function and resolves the function. * * @param validator Validator used to validate function arguments and * resolve the function * @param funDef Function definition, or null to deduce definition from * name, syntax and argument types * @param args Arguments to the function * @param newArgs Output parameter for the resolved arguments * @param name Function name * @param syntax Syntax style used to invoke function * @return resolved function definition */ public static FunDef resolveFunArgs( Validator validator, FunDef funDef, Exp[] args, Exp[] newArgs, String name, Syntax syntax) { for (int i = 0; i < args.length; i++) { newArgs[i] = validator.validate(args[i], false); } if (funDef == null || validator.alwaysResolveFunDef()) { funDef = validator.getDef(newArgs, name, syntax); } checkNativeCompatible(validator, funDef, newArgs); return funDef; } /** * Functions that dynamically return one or more members of the measures * dimension prevent us from using native evaluation. * * @param validator Validator used to validate function arguments and * resolve the function * @param funDef Function definition, or null to deduce definition from * name, syntax and argument types * @param args Arguments to the function */ private static void checkNativeCompatible( Validator validator, FunDef funDef, Exp[] args) { // If the first argument to a function is either: // 1) the measures dimension or // 2) a measures member where the function returns another member or // a set, // then these are functions that dynamically return one or more // members of the measures dimension. In that case, we cannot use // native cross joins because the functions need to be executed to // determine the resultant measures. // // As a result, we disallow functions like AllMembers applied on the // Measures dimension as well as functions like the range operator, // siblings, and lag, when the argument is a measure member. // However, we do allow functions like isEmpty, rank, and topPercent. // // Also, the Set and Parentheses functions are ok since they're // essentially just containers. Query query = validator.getQuery(); if (!(funDef instanceof SetFunDef) && !(funDef instanceof ParenthesesFunDef) && query != null && query.nativeCrossJoinVirtualCube()) { int[] paramCategories = funDef.getParameterCategories(); if (paramCategories.length > 0) { final int cat0 = paramCategories[0]; final Exp arg0 = args[0]; switch (cat0) { case Category.Dimension: case Category.Hierarchy: if (arg0 instanceof DimensionExpr && ((DimensionExpr) arg0).getDimension().isMeasures() && !(funDef instanceof HierarchyCurrentMemberFunDef)) { query.setVirtualCubeNonNativeCrossJoin(); } break; case Category.Member: if (arg0 instanceof MemberExpr && ((MemberExpr) arg0).getMember().isMeasure() && isMemberOrSet(funDef.getReturnCategory())) { query.setVirtualCubeNonNativeCrossJoin(); } break; } } } } private static boolean isMemberOrSet(int category) { return category == Category.Member || category == Category.Set; } static void appendTuple(StringBuilder buf, Member[] members) { buf.append("("); for (int j = 0; j < members.length; j++) { if (j > 0) { buf.append(", "); } Member member = members[j]; buf.append(member.getUniqueName()); } buf.append(")"); } /** * Returns whether two tuples are equal. * *

The members are allowed to be in different positions. For example, * ([Gender].[M], [Store].[USA]) IS ([Store].[USA], * [Gender].[M]) returns {@code true}. */ static boolean equalTuple(Member[] members0, Member[] members1) { final int count = members0.length; if (count != members1.length) { return false; } outer: for (int i = 0; i < count; i++) { // First check the member at the corresponding ordinal. It is more // likely to be there. final Member member0 = members0[i]; if (member0.equals(members1[i])) { continue; } // Look for this member in other positions. // We can assume that the members in members0 are distinct (because // they belong to different dimensions), so this test is valid. for (int j = 0; j < count; j++) { if (i != j && member0.equals(members1[j])) { continue outer; } } // This member of members0 does not occur in any position of // members1. The tuples are not equal. return false; } return true; } static FunDef createDummyFunDef( Resolver resolver, int returnCategory, Exp[] args) { final int[] argCategories = ExpBase.getTypes(args); return new FunDefBase(resolver, returnCategory, argCategories) { }; } public static List getNonEmptyMemberChildren( Evaluator evaluator, Member member) { SchemaReader sr = evaluator.getSchemaReader(); if (evaluator.isNonEmpty()) { return sr.getMemberChildren(member, evaluator); } else { return sr.getMemberChildren(member); } } public static Map getNonEmptyMemberChildrenWithDetails( Evaluator evaluator, Member member) { SchemaReader sr = evaluator.getSchemaReader(); if (evaluator.isNonEmpty()) { return (Map) sr.getMemberChildrenWithDetails(member, evaluator); } else { return (Map) sr.getMemberChildrenWithDetails(member, null); } } /** * Returns members of a level which are not empty (according to the * criteria expressed by the evaluator). * * @param evaluator Evaluator, determines non-empty criteria * @param level Level * @param includeCalcMembers Whether to include calculated members */ static List getNonEmptyLevelMembers( final Evaluator evaluator, final Level level, final boolean includeCalcMembers) { SchemaReader sr = evaluator.getSchemaReader(); if (evaluator.isNonEmpty()) { List members = sr.getLevelMembers(level, evaluator); if (includeCalcMembers) { return addLevelCalculatedMembers(sr, level, members); } return members; } return sr.getLevelMembers(level, includeCalcMembers); } static TupleList levelMembers( final Level level, final Evaluator evaluator, final boolean includeCalcMembers) { List memberList = getNonEmptyLevelMembers(evaluator, level, includeCalcMembers); TupleList tupleList; if (!includeCalcMembers) { memberList = removeCalculatedMembers(memberList); } final List memberListClone = new ArrayList(memberList); tupleList = new UnaryTupleList(memberListClone); return hierarchizeTupleList(tupleList, false); } static TupleList hierarchyMembers( Hierarchy hierarchy, Evaluator evaluator, final boolean includeCalcMembers) { TupleList tupleList = new UnaryTupleList(); final List memberList = tupleList.slice(0); if (evaluator.isNonEmpty()) { // Allow the SQL generator to generate optimized SQL since we know // we're only interested in non-empty members of this level. for (Level level : hierarchy.getLevels()) { List members = getNonEmptyLevelMembers( evaluator, level, includeCalcMembers); memberList.addAll(members); } } else { final List memberList1 = addMembers( evaluator.getSchemaReader(), new ConcatenableList(), hierarchy); if (includeCalcMembers) { memberList.addAll(memberList1); } else { // Same effect as calling removeCalculatedMembers(tupleList) // but one fewer copy of the list. for (Member member1 : memberList1) { if (!member1.isCalculated()) { memberList.add(member1); } } } } return hierarchizeTupleList(tupleList, false); } /** * Partial Sort: sorts in place an array of Objects using a given Comparator, * but only enough so that the N biggest (or smallest) items are at the start * of the array. Not a stable sort, unless the Comparator is so contrived. * * @param items will be partially-sorted in place * @param comp a Comparator; null means use natural comparison */ static void partialSort(T[] items, Comparator comp, int limit) { if (comp == null) { //noinspection unchecked comp = (Comparator) ComparatorUtils.naturalComparator(); } new Quicksorter(items, comp).partialSort(limit); } /** * Stable partial sort of a list. Returns the desired head of the list. */ public static List stablePartialSort( final List list, final Comparator comp, int limit) { return stablePartialSort(list, comp, limit, 0); } /** * Stable partial sort of a list, using a specified algorithm. */ public static List stablePartialSort( final List list, final Comparator comp, int limit, int algorithm) { assert limit <= list.size(); assert list.size() > 0; for (;;) { switch (algorithm) { case 0: float ratio = (float) limit / (float) list.size(); if (ratio <= .05) { algorithm = 4; // julian's algorithm } else if (ratio <= .35) { algorithm = 2; // marc's algorithm } else { algorithm = 1; // array sort } break; case 1: return stablePartialSortArray(list, comp, limit); case 2: return stablePartialSortMarc(list, comp, limit); case 3: return stablePartialSortPedro(list, comp, limit); case 4: return stablePartialSortJulian(list, comp, limit); default: throw new RuntimeException(); } } } /** * Partial sort an array by sorting it and returning the first {@code limit} * elements. Fastest approach if limit is a significant fraction of the * list. */ public static List stablePartialSortArray( final List list, final Comparator comp, int limit) { ArrayList list2 = new ArrayList(list); Collections.sort(list2, comp); return list2.subList(0, limit); } /** * Marc's original algorithm for stable partial sort of a list. * Now superseded by {@link #stablePartialSortJulian}. */ public static List stablePartialSortMarc( final List list, final Comparator comp, int limit) { assert limit >= 0; // Load an array of pairs {list-item, list-index}. // List-index is a secondary sort key, to give a stable sort. // REVIEW Can we use a simple T[], with the index implied? // REVIEW When limit is big relative to list size, faster to // mergesort. Test for this. int n = list.size(); // O(n) to scan list @SuppressWarnings({"unchecked"}) final ObjIntPair[] pairs = new ObjIntPair[n]; int i = 0; for (T item : list) { // O(n) to scan list pairs[i] = new ObjIntPair(item, i); ++i; } Comparator> pairComp = new Comparator>() { public int compare(ObjIntPair x, ObjIntPair y) { int val = comp.compare(x.t, y.t); if (val == 0) { val = x.i - y.i; } return val; } }; final int length = Math.min(limit, n); // O(n + limit * log(limit)) to quicksort partialSort(pairs, pairComp, length); // Use an abstract list to avoid doing a copy. The result is immutable. return new AbstractList() { @Override public T get(int index) { return pairs[index].t; } @Override public int size() { return length; } }; } /** * Pedro's algorithm for stably sorting the top {@code limit} items in * a list. */ public static List stablePartialSortPedro( final List list, final Comparator comp, int limit) { final ObjIntPair[] pairs = new ObjIntPair[limit]; Comparator> pairComp = new Comparator>() { public int compare(ObjIntPair x, ObjIntPair y) { int val = comp.compare(x.t, y.t); if (val == 0) { val = x.i - y.i; } return val; } }; int filled = 0; T maximum = null; int maximumIndex = 0; int originalIndex = 0; for (T item : list) { // O(n) to scan list switch (filled) { case 0: maximum = item; pairs[0] = new ObjIntPair(item, originalIndex); filled++; break; default: if (filled < limit) { pairs[filled] = new ObjIntPair(item, originalIndex); if (comp.compare(item, maximum) > 0) { maximum = item; maximumIndex = filled; } filled++; } else { if (comp.compare(item, maximum) < 0) { pairs[maximumIndex] = new ObjIntPair(item, originalIndex); maximum = pairs[0].t; maximumIndex = 0; for (int i = 0; i < filled; i++) { if (comp.compare(pairs[i].t, maximum) > 0) { maximum = pairs[i].t; maximumIndex = i; } } } } } originalIndex++; } Arrays.sort(pairs, pairComp); if (false) for (int i = 0; i < limit; i++) { T item = pairs[i].t; T originalItem = list.get(i); int itemIndex = pairs[i].i; if (itemIndex < i) { if (pairs[itemIndex].i > i) { list.set(pairs[itemIndex].i, originalItem); } } else { list.set(itemIndex, originalItem); } list.set(i, item); } List result = new ArrayList(limit); for (int i = 0; i < limit; i++) { result.add(list.get(pairs[i].i)); } return result; } /** * Julian's algorithm for stable partial sort. Improves Pedro's algorithm * by using a heap (priority queue) for the top {@code limit} items seen. * The items on the priority queue have an ordinal field, so the queue * can be used to generate a list of stably sorted items. (Heap sort is * not normally stable.) * * @param list List to sort * @param comp Comparator * @param limit Maximum number of items to return * @param Element type * @return Sorted list, containing at most limit items */ public static List stablePartialSortJulian( final List list, final Comparator comp, int limit) { final Comparator> comp2 = new Comparator>() { public int compare(ObjIntPair o1, ObjIntPair o2) { int c = comp.compare(o1.t, o2.t); if (c == 0) { c = Util.compare(o1.i, o2.i); } return -c; } }; int filled = 0; final PriorityQueue> queue = new PriorityQueue>(limit, comp2); for (T element : list) { if (filled < limit) { queue.offer(new ObjIntPair(element, filled++)); } else { ObjIntPair head = queue.element(); if (comp.compare(element, head.t) <= 0) { ObjIntPair item = new ObjIntPair(element, filled++); if (comp2.compare(item, head) >= 0) { ObjIntPair poll = queue.remove(); Util.discard(poll); queue.offer(item); } } } } int n = queue.size(); final Object[] elements = new Object[n]; while (n > 0) { elements[--n] = queue.poll().t; } assert queue.isEmpty(); //noinspection unchecked return Arrays.asList((T[]) elements); } static TupleList parseTupleList( Evaluator evaluator, String string, List hierarchies) { final IdentifierParser.TupleListBuilder builder = new IdentifierParser.TupleListBuilder( evaluator.getSchemaReader(), evaluator.getCube(), hierarchies); IdentifierParser.parseTupleList(builder, string); return builder.tupleList; } /** * Parses a tuple, of the form '(member, member, ...)'. * There must be precisely one member for each hierarchy. * * * @param evaluator Evaluator, provides a {@link mondrian.olap.SchemaReader} * and {@link mondrian.olap.Cube} * @param string String to parse * @param i Position to start parsing in string * @param members Output array of members * @param hierarchies Hierarchies of the members * @return Position where parsing ended in string */ private static int parseTuple( final Evaluator evaluator, String string, int i, final Member[] members, List hierarchies) { final IdentifierParser.Builder builder = new IdentifierParser.TupleBuilder( evaluator.getSchemaReader(), evaluator.getCube(), hierarchies) { public void tupleComplete() { super.tupleComplete(); memberList.toArray(members); } }; return IdentifierParser.parseTuple(builder, string, i); } /** * Parses a tuple, such as "([Gender].[M], [Marital Status].[S])". * * @param evaluator Evaluator, provides a {@link mondrian.olap.SchemaReader} * and {@link mondrian.olap.Cube} * @param string String to parse * @param hierarchies Hierarchies of the members * @return Tuple represented as array of members */ static Member[] parseTuple( Evaluator evaluator, String string, List hierarchies) { final Member[] members = new Member[hierarchies.size()]; int i = parseTuple(evaluator, string, 0, members, hierarchies); // todo: check for garbage at end of string if (FunUtil.tupleContainsNullMember(members)) { return null; } return members; } static List parseMemberList( Evaluator evaluator, String string, Hierarchy hierarchy) { IdentifierParser.MemberListBuilder builder = new IdentifierParser.MemberListBuilder( evaluator.getSchemaReader(), evaluator.getCube(), hierarchy); IdentifierParser.parseMemberList(builder, string); return builder.memberList; } private static int parseMember( Evaluator evaluator, String string, int i, final Member[] members, Hierarchy hierarchy) { IdentifierParser.MemberListBuilder builder = new IdentifierParser.MemberListBuilder( evaluator.getSchemaReader(), evaluator.getCube(), hierarchy) { @Override public void memberComplete() { members[0] = resolveMember(hierarchyList.get(0)); segmentList.clear(); } }; return IdentifierParser.parseMember(builder, string, i); } static Member parseMember( Evaluator evaluator, String string, Hierarchy hierarchy) { Member[] members = {null}; int i = parseMember(evaluator, string, 0, members, hierarchy); // todo: check for garbage at end of string final Member member = members[0]; if (member == null) { throw MondrianResource.instance().MdxChildObjectNotFound.ex( string, evaluator.getCube().getQualifiedName()); } return member; } /** * Returns whether an expression is worth wrapping in "Cache( ... )". * * @param exp Expression * @return Whether worth caching */ public static boolean worthCaching(Exp exp) { // Literal is not worth caching. if (exp instanceof Literal) { return false; } // Member, hierarchy, level, or dimension expression is not worth // caching. if (exp instanceof MemberExpr || exp instanceof LevelExpr || exp instanceof HierarchyExpr || exp instanceof DimensionExpr) { return false; } if (exp instanceof ResolvedFunCall) { ResolvedFunCall call = (ResolvedFunCall) exp; // A set of literals is not worth caching. if (call.getFunDef() instanceof SetFunDef) { for (Exp setArg : call.getArgs()) { if (worthCaching(setArg)) { return true; } } return false; } } return true; } // ~ Inner classes --------------------------------------------------------- /** * A functional for {@link FunUtil#partialSort}. * Sorts or partially sorts an array in ascending order, using a Comparator. * *

Algorithm: quicksort, or partial quicksort (alias * "quickselect"), Hoare/Singleton. Partial quicksort is * quicksort that recurs only on one side, which is thus * tail-recursion. Picks pivot as median of three; falls back on * insertion sort for small "subfiles". Partial quicksort is O(n * + m log m), instead of O(n log n), where n is the input size, * and m is the desired output size. * *

See D Knuth, Art of Computer Programming, 5.2.2 (Algorithm * Q); R. Sedgewick, Algorithms in C, ch 5. Good summary in * http://en.wikipedia.org/wiki/Selection_algorithm * *

TODO: What is the time-cost of this functor and of the nested * Comparators? */ static class Quicksorter { // size of smallest set worth a quicksort public final int TOO_SMALL = 8; private static final Logger LOGGER = Logger.getLogger(Quicksorter.class); private final T[] vec; private final Comparator comp; private final boolean traced; private long partitions, comparisons, exchanges; // stats public Quicksorter(T[] vec, Comparator comp) { this.vec = vec; this.comp = comp; partitions = comparisons = exchanges = 0; traced = LOGGER.isDebugEnabled(); } private void traceStats(String prefix) { StringBuilder sb = new StringBuilder(prefix); sb.append(": "); sb.append(partitions).append(" partitions, "); sb.append(comparisons).append(" comparisons, "); sb.append(exchanges).append(" exchanges."); LOGGER.debug(sb.toString()); } // equivalent to operator < private boolean less(T x, T y) { comparisons++; return comp.compare(x, y) < 0; } // equivalent to operator > private boolean more(T x, T y) { comparisons++; return comp.compare(x, y) > 0; } // equivalent to operator > private boolean equal(T x, T y) { comparisons++; return comp.compare(x, y) == 0; } // swaps two items (identified by index in vec[]) private void swap(int i, int j) { exchanges++; T temp = vec[i]; vec[i] = vec[j]; vec[j] = temp; } // puts into ascending order three items // (identified by index in vec[]) // REVIEW: use only 2 comparisons?? private void order3(int i, int j, int k) { if (more(vec[i], vec[j])) { swap(i, j); } if (more(vec[i], vec[k])) { swap(i, k); } if (more(vec[j], vec[k])) { swap(j, k); } } // runs a selection sort on the array segment VEC[START .. END] private void selectionSort(int start, int end) { for (int i = start; i < end; ++i) { // pick the min of vec[i, end] int pmin = i; for (int j = i + 1; j <= end; ++j) { if (less(vec[j], vec[pmin])) { pmin = j; } } if (pmin != i) { swap(i, pmin); } } } /** * Runs one pass of quicksort on array segment VEC[START .. END], * dividing it into two parts, the left side VEC[START .. P] none * greater than the pivot value VEC[P], and the right side VEC[P+1 * .. END] none less than the pivot value. Returns P, the index of the * pivot element in VEC[]. */ private int partition(int start, int end) { partitions++; assert start <= end; // Find median of three (both ends and the middle). // TODO: use pseudo-median of nine when array segment is big enough. int mid = (start + end) / 2; order3(start, mid, end); if (end - start <= 2) { return mid; // sorted! } // Now the left and right ends are in place (ie in the correct // partition), and will serve as sentinels for scanning. Pick middle // as pivot and set it aside, in penultimate position. final T pivot = vec[mid]; swap(mid, end - 1); // Scan inward from both ends, swapping misplaced items. int left = start + 1; // vec[start] is in place int right = end - 2; // vec[end - 1] is pivot while (left < right) { // scan past items in correct place, but stop at a pivot value // (Sedgewick's idea). while (less(vec[left], pivot)) { ++left; } while (less(pivot, vec[right])) { --right; } if (debug) { assert (left <= end) && (right >= start); } if (left < right) { // found a misplaced pair swap(left, right); ++left; --right; } } if ((left == right) && less(vec[left], pivot)) { ++left; } // All scanned. Restore pivot to its rightful place. swap(left, end - 1); if (debug) { for (int i = start; i < left; i++) { assert !more(vec[i], pivot); } assert equal(vec[left], pivot); for (int i = left + 1; i <= end; i++) { assert !less(vec[i], pivot); } } return left; } // Runs quicksort on VEC[START, END]. Recursive version, // TODO: exploit tail recursion private void sort(int start, int end) { if (end - start < TOO_SMALL) { selectionSort(start, end); return; } // Split data, so that left side dominates the right side // (but neither is sorted): int mid = partition(start, end); sort(start, mid - 1); sort(mid + 1, end); } // Runs quickselect(LIMIT) on VEC[START, END]. Recursive version, // TODO: exploit tail recursion, unfold. private void select(int limit, int start, int end) { if (limit == 0) { return; } if (end - start < TOO_SMALL) { selectionSort(start, end); return; } int mid = partition(start, end); int leftSize = mid - start + 1; if (limit < leftSize) { // work on the left side, and ignore the right side select(limit, start, mid); } else { limit -= leftSize; // work on the right side, but keep the left side select(limit, mid + 1, end); } } public void sort() { int n = vec.length - 1; sort(0, n); if (traced) { traceStats("quicksort on " + n + "items"); } } /** puts the LIMIT biggest items at the head, not sorted */ public void select(int limit) { int n = vec.length - 1; select(limit, 0, n); if (traced) { traceStats("quickselect for " + limit + " from" + n + "items"); } } public void partialSort(int limit) { int n = vec.length - 1; select(limit, 0, n); if (traced) { traceStats( "partial sort: quickselect phase for " + limit + "from " + n + "items"); } sort(0, limit - 1); if (traced) { traceStats("partial sort: quicksort phase on " + n + "items"); } } } /** * Comparator for members. * *

Could genericize this to class<T> MemorizingComparator * implements Comparator<T>, but not if it adds a run time * cost, since the comparator is at the heart of the sort algorithms. */ private static abstract class MemberComparator implements Comparator { private static final Logger LOGGER = Logger.getLogger(MemberComparator.class); final Evaluator evaluator; final Calc exp; private final int descMask; private final Map valueMap; MemberComparator(Evaluator evaluator, Calc exp, boolean desc) { this.evaluator = evaluator; this.exp = exp; this.descMask = desc ? -1 : 1; this.valueMap = new HashMap(); } private int maybeNegate(int c) { return descMask * c; } // applies the Calc to a member, memorizing results protected Object eval(Member m) { Object val = valueMap.get(m); if (val == null) { evaluator.setContext(m); val = exp.evaluate(evaluator); if (val == null) { val = Util.nullValue; } valueMap.put(m, val); } return val; } // wraps comparison with tracing Comparator wrap() { final MemberComparator comparator = this; if (LOGGER.isDebugEnabled()) { return new Comparator() { public int compare(Member m1, Member m2) { final int c = comparator.compare(m1, m2); // here guaranteed that eval(m) finds a memorized value LOGGER.debug( "compare " + m1.getUniqueName() + "(" + eval(m1) + "), " + m2.getUniqueName() + "(" + eval(m2) + ")" + " yields " + c); return c; } }; } else { return this; } } // Preloads the value map with precomputed members (supplied as a map). void preloadValues(Map map) { valueMap.putAll(map); } // Preloads the value map by applying the expression to a Collection of // members. void preloadValues(Collection members) { for (Member m : members) { eval(m); } } protected final int compareByValue(Member m1, Member m2) { final int c = FunUtil.compareValues(eval(m1), eval(m2)); return maybeNegate(c); } protected final int compareHierarchicallyButSiblingsByValue( Member m1, Member m2) { if (FunUtil.equals(m1, m2)) { return 0; } while (true) { int depth1 = m1.getDepth(), depth2 = m2.getDepth(); if (depth1 < depth2) { m2 = m2.getParentMember(); if (Util.equals(m1, m2)) { return -1; } } else if (depth1 > depth2) { m1 = m1.getParentMember(); if (Util.equals(m1, m2)) { return 1; } } else { Member prev1 = m1, prev2 = m2; m1 = m1.getParentMember(); m2 = m2.getParentMember(); if (Util.equals(m1, m2)) { // including case where both parents are null int c = compareByValue(prev1, prev2); if (c != 0) { return c; } // prev1 and prev2 are siblings. Order according to // hierarchy, if the values do not differ. Needed to // have a consistent sortMembers if members with equal // (null!) values are compared. c = FunUtil.compareSiblingMembers(prev1, prev2); // Do not negate c, even if we are sorting descending. // This comparison is to achieve the 'natural order'. return c; } } } } } private static class HierarchicalMemberComparator extends MemberComparator { HierarchicalMemberComparator( Evaluator evaluator, Calc exp, boolean desc) { super(evaluator, exp, desc); } public int compare(Member m1, Member m2) { return compareHierarchicallyButSiblingsByValue(m1, m2); } } private static class BreakMemberComparator extends MemberComparator { BreakMemberComparator(Evaluator evaluator, Calc exp, boolean desc) { super(evaluator, exp, desc); } public final int compare(Member m1, Member m2) { return compareByValue(m1, m2); } } /** * Compares tuples, which are represented as lists of {@link Member}s. */ private static abstract class TupleComparator implements Comparator> { final int arity; TupleComparator(int arity) { this.arity = arity; } } /** * Extension to {@link TupleComparator} which compares tuples by evaluating * an expression. */ private static abstract class TupleExpComparator extends TupleComparator { Evaluator evaluator; final Calc calc; TupleExpComparator(Evaluator evaluator, Calc calc, int arity) { super(arity); this.evaluator = evaluator; this.calc = calc; } } private static class HierarchicalTupleComparator extends TupleExpComparator { private final boolean desc; HierarchicalTupleComparator( Evaluator evaluator, Calc calc, int arity, boolean desc) { super(evaluator, calc, arity); this.desc = desc; } public int compare(List a1, List a2) { int c = 0; final int savepoint = evaluator.savepoint(); try { for (int i = 0; i < arity; i++) { Member m1 = a1.get(i), m2 = a2.get(i); c = compareHierarchicallyButSiblingsByValue(m1, m2); if (c != 0) { break; } // compareHierarchicallyButSiblingsByValue imposes a // total order assert m1.equals(m2); evaluator.setContext(m1); } } finally { evaluator.restore(savepoint); } return c; } protected int compareHierarchicallyButSiblingsByValue( Member m1, Member m2) { if (FunUtil.equals(m1, m2)) { return 0; } while (true) { int depth1 = m1.getDepth(), depth2 = m2.getDepth(); if (depth1 < depth2) { m2 = m2.getParentMember(); if (FunUtil.equals(m1, m2)) { return -1; } } else if (depth1 > depth2) { m1 = m1.getParentMember(); if (FunUtil.equals(m1, m2)) { return 1; } } else { Member prev1 = m1, prev2 = m2; m1 = m1.getParentMember(); m2 = m2.getParentMember(); if (FunUtil.equals(m1, m2)) { // including case where both parents are null int c = compareByValue(prev1, prev2); if (c == 0) { c = FunUtil.compareSiblingMembers(prev1, prev2); } return desc ? -c : c; } } } } private int compareByValue(Member m1, Member m2) { int c; final int savepoint = evaluator.savepoint(); try { evaluator.setContext(m1); Object v1 = calc.evaluate(evaluator); evaluator.setContext(m2); Object v2 = calc.evaluate(evaluator); c = FunUtil.compareValues(v1, v2); return c; } finally { // important to restore the evaluator state evaluator.restore(savepoint); } } } // almost the same as MemberComparator static abstract class TupleExpMemoComparator extends TupleExpComparator { private final Map, Object> valueMap = new HashMap, Object>(); TupleExpMemoComparator(Evaluator e, Calc calc, int arity) { super(e, calc, arity); } // applies the Calc to a tuple, memorizing results protected Object eval(List t) { Object val = valueMap.get(t); if (val != null) { return val; } return compute(t); } private Object compute(List key) { evaluator.setContext(key); Object val = calc.evaluate(evaluator); if (val == null) { val = Util.nullValue; } valueMap.put(key, val); return val; } // Preloads the value map by applying the expression to a Collection of // members. void preloadValues(TupleList tuples) { for (List t : tuples) { compute(t); } } } private static class BreakTupleComparator extends TupleExpMemoComparator { BreakTupleComparator(Evaluator e, Calc calc, int arity) { super(e, calc, arity); } public int compare(List a1, List a2) { return FunUtil.compareValues(eval(a1), eval(a2)); } } private static class HierarchicalTupleKeyComparator extends TupleExpMemoComparator { HierarchicalTupleKeyComparator(Evaluator e, Calc calc, int arity) { super(e, calc, arity); } public int compare(List a1, List a2) { OrderKey k1 = (OrderKey) eval(a1); OrderKey k2 = (OrderKey) eval(a2); return compareMemberOrderKeysHierarchically(k1, k2); } private int compareMemberOrderKeysHierarchically( OrderKey k1, OrderKey k2) { // null is less than anything else if (k1 == Util.nullValue) { return -1; } if (k2 == Util.nullValue) { return 1; } Member m1 = k1.member; Member m2 = k2.member; if (FunUtil.equals(m1, m2)) { return 0; } while (true) { int depth1 = m1.getDepth(), depth2 = m2.getDepth(); if (depth1 < depth2) { m2 = m2.getParentMember(); if (FunUtil.equals(m1, m2)) { return -1; } } else if (depth1 > depth2) { m1 = m1.getParentMember(); if (FunUtil.equals(m1, m2)) { return 1; } } else { Member prev1 = m1, prev2 = m2; m1 = m1.getParentMember(); m2 = m2.getParentMember(); if (FunUtil.equals(m1, m2)) { OrderKey pk1 = new OrderKey(prev1); OrderKey pk2 = new OrderKey(prev2); return FunUtil.compareValues(pk1, pk2); } } } } } /** * Compares lists of {@link Member}s so as to convert them into hierarchical * order. Applies lexicographic order to the array. */ private static class HierarchizeTupleComparator extends TupleComparator { private final boolean post; HierarchizeTupleComparator(int arity, boolean post) { super(arity); this.post = post; } public int compare(List a1, List a2) { for (int i = 0; i < arity; i++) { Member m1 = a1.get(i), m2 = a2.get(i); int c = FunUtil.compareHierarchically(m1, m2, post); if (c != 0) { return c; } } return 0; } } /** * Compares {@link Member}s so as to arrage them in prefix or postfix * hierarchical order. */ private static class HierarchizeComparator implements Comparator { private final boolean post; HierarchizeComparator(boolean post) { this.post = post; } public int compare(Member m1, Member m2) { return FunUtil.compareHierarchically(m1, m2, post); } } static class SetWrapper { List v = new ArrayList(); public int errorCount = 0, nullCount = 0; // private double avg = Double.NaN; // TODO: parameterize inclusion of nulls // by making this a method of the SetWrapper, we can cache the result // this allows its reuse in Correlation // public double getAverage() { // if (avg == Double.NaN) { // double sum = 0.0; // for (int i = 0; i < resolvers.size(); i++) { // sum += ((Number) resolvers.elementAt(i)).doubleValue(); // } // // TODO: should look at context and optionally include nulls // avg = sum / (double) resolvers.size(); // } // return avg; // } } /** * Compares cell values, so that larger values compare first. * *

Nulls compare last, exceptions (including the * object which indicates the the cell is not in the cache yet) next, * then numbers and strings are compared by value. */ public static class DescendingValueComparator implements Comparator { /** * The singleton. */ static final DescendingValueComparator instance = new DescendingValueComparator(); public int compare(Object o1, Object o2) { return - compareValues(o1, o2); } } /** * Null member of unknown hierarchy. */ private static class NullMember implements Member { public Member getParentMember() { throw new UnsupportedOperationException(); } public Level getLevel() { throw new UnsupportedOperationException(); } public Hierarchy getHierarchy() { throw new UnsupportedOperationException(); } public String getParentUniqueName() { throw new UnsupportedOperationException(); } public MemberType getMemberType() { throw new UnsupportedOperationException(); } public boolean isParentChildLeaf() { return false; } public boolean isParentChildPhysicalMember() { return false; } public void setName(String name) { throw new UnsupportedOperationException(); } public boolean isAll() { return false; } public boolean isMeasure() { throw new UnsupportedOperationException(); } public boolean isNull() { return true; } public boolean isChildOrEqualTo(Member member) { throw new UnsupportedOperationException(); } public boolean isCalculated() { throw new UnsupportedOperationException(); } public boolean isEvaluated() { throw new UnsupportedOperationException(); } public int getSolveOrder() { throw new UnsupportedOperationException(); } public Exp getExpression() { throw new UnsupportedOperationException(); } public List getAncestorMembers() { throw new UnsupportedOperationException(); } public boolean isCalculatedInQuery() { throw new UnsupportedOperationException(); } public Object getPropertyValue(String propertyName) { throw new UnsupportedOperationException(); } public Object getPropertyValue(String propertyName, boolean matchCase) { throw new UnsupportedOperationException(); } public String getPropertyFormattedValue(String propertyName) { throw new UnsupportedOperationException(); } public void setProperty(String name, Object value) { throw new UnsupportedOperationException(); } public Property[] getProperties() { throw new UnsupportedOperationException(); } public int getOrdinal() { throw new UnsupportedOperationException(); } public Comparable getOrderKey() { throw new UnsupportedOperationException(); } public boolean isHidden() { throw new UnsupportedOperationException(); } public int getDepth() { throw new UnsupportedOperationException(); } public Member getDataMember() { throw new UnsupportedOperationException(); } public String getUniqueName() { throw new UnsupportedOperationException(); } public String getName() { throw new UnsupportedOperationException(); } public String getDescription() { throw new UnsupportedOperationException(); } public OlapElement lookupChild( SchemaReader schemaReader, Id.Segment s, MatchType matchType) { throw new UnsupportedOperationException(); } public String getQualifiedName() { throw new UnsupportedOperationException(); } public String getCaption() { throw new UnsupportedOperationException(); } public String getLocalized(LocalizedProperty prop, Locale locale) { throw new UnsupportedOperationException(); } public boolean isVisible() { throw new UnsupportedOperationException(); } public Dimension getDimension() { throw new UnsupportedOperationException(); } public Map getAnnotationMap() { throw new UnsupportedOperationException(); } public int compareTo(Object o) { throw new UnsupportedOperationException(); } public boolean equals(Object obj) { throw new UnsupportedOperationException(); } public int hashCode() { throw new UnsupportedOperationException(); } } /** * Enumeration of the flags allowed to the {@code ORDER} MDX function. */ enum Flag { ASC(false, false), DESC(true, false), BASC(false, true), BDESC(true, true); final boolean descending; final boolean brk; Flag(boolean descending, boolean brk) { this.descending = descending; this.brk = brk; } public static String[] getNames() { List names = new ArrayList(); for (Flag flags : Flag.class.getEnumConstants()) { names.add(flags.name()); } return names.toArray(new String[names.size()]); } } static class SortKeySpec { private final Calc key; private final Flag direction; SortKeySpec(Calc key, Flag dir) { this.key = key; this.direction = dir; } Calc getKey() { return this.key; } Flag getDirection() { return this.direction; } } public static class OrderKey implements Comparable { private final Member member; public OrderKey(Member member) { super(); this.member = member; } public int compareTo(Object o) { assert o instanceof OrderKey; Member otherMember = ((OrderKey) o).member; final boolean thisCalculated = this.member.isCalculatedInQuery(); final boolean otherCalculated = otherMember.isCalculatedInQuery(); if (thisCalculated) { if (!otherCalculated) { return 1; } } else { if (otherCalculated) { return -1; } } final Comparable thisKey = this.member.getOrderKey(); final Comparable otherKey = otherMember.getOrderKey(); if ((thisKey != null) && (otherKey != null)) { return thisKey.compareTo(otherKey); } else { return this.member.compareTo(otherMember); } } } /** * Tuple consisting of an object and an integer. * *

Similar to {@link Pair}, but saves boxing overhead of converting * {@code int} to {@link Integer}. */ public static class ObjIntPair { final T t; final int i; public ObjIntPair(T t, int i) { this.t = t; this.i = i; } public int hashCode() { return Util.hash(i, t); } public boolean equals(Object obj) { return this == obj || obj instanceof ObjIntPair && this.i == ((ObjIntPair) obj).i && Util.equals(this.t, ((ObjIntPair) obj).t); } public String toString() { return "<" + t + ", " + i + ">"; } } } // End FunUtil.java mondrian-3.11.0.1-R/src/main/mondrian/olap/fun/GenerateFunDef.java000066400000000000000000000176141261646570300245160ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2015 Pentaho Corporation.. All rights reserved. */ package mondrian.olap.fun; import mondrian.calc.*; import mondrian.calc.impl.*; import mondrian.mdx.ResolvedFunCall; import mondrian.olap.*; import mondrian.olap.type.*; import mondrian.server.Locus; import java.util.*; /** * Definition of the Generate MDX function. * * @author jhyde * @since Mar 23, 2006 */ class GenerateFunDef extends FunDefBase { static final ReflectiveMultiResolver ListResolver = new ReflectiveMultiResolver( "Generate", "Generate(, [, ALL])", "Applies a set to each member of another set and joins the resulting sets by union.", new String[] {"fxxx", "fxxxy"}, GenerateFunDef.class); static final ReflectiveMultiResolver StringResolver = new ReflectiveMultiResolver( "Generate", "Generate(, [, ])", "Applies a set to a string expression and joins resulting sets by string concatenation.", new String[] {"fSxS", "fSxSS"}, GenerateFunDef.class); private static final String[] ReservedWords = new String[] {"ALL"}; public GenerateFunDef(FunDef dummyFunDef) { super(dummyFunDef); } public Type getResultType(Validator validator, Exp[] args) { final Type type = args[1].getType(); if (type instanceof StringType) { // Generate(, [, ]) return type; } else { final Type memberType = TypeUtil.toMemberOrTupleType(type); return new SetType(memberType); } } public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) { final IterCalc iterCalc = compiler.compileIter(call.getArg(0)); if (call.getArg(1).getType() instanceof StringType) { final StringCalc stringCalc = compiler.compileString(call.getArg(1)); final StringCalc delimCalc; if (call.getArgCount() == 3) { delimCalc = compiler.compileString(call.getArg(2)); } else { delimCalc = ConstantCalc.constantString(""); } return new GenerateStringCalcImpl( call, (IterCalc) iterCalc, stringCalc, delimCalc); } else { final ListCalc listCalc2 = compiler.compileList(call.getArg(1)); final String literalArg = getLiteralArg(call, 2, "", ReservedWords); final boolean all = literalArg.equalsIgnoreCase("ALL"); final int arityOut = call.getType().getArity(); return new GenerateListCalcImpl( call, iterCalc, listCalc2, arityOut, all); } } private static class GenerateListCalcImpl extends AbstractListCalc { private final IterCalc iterCalc1; private final ListCalc listCalc2; private final int arityOut; private final boolean all; public GenerateListCalcImpl( ResolvedFunCall call, IterCalc iterCalc, ListCalc listCalc2, int arityOut, boolean all) { super(call, new Calc[]{iterCalc, listCalc2}); this.iterCalc1 = iterCalc; this.listCalc2 = listCalc2; this.arityOut = arityOut; this.all = all; } public TupleList evaluateList(Evaluator evaluator) { final int savepoint = evaluator.savepoint(); final int checkCancelPeriod = MondrianProperties.instance().CancelPhaseInterval.get(); try { evaluator.setNonEmpty(false); final TupleIterable iterable1 = iterCalc1.evaluateIterable(evaluator); evaluator.restore(savepoint); TupleList result = TupleCollections.createList(arityOut); if (all) { final TupleCursor cursor = iterable1.tupleCursor(); int rowCount = -1; while (cursor.forward()) { rowCount++; if (checkCancelPeriod > 0 && rowCount % checkCancelPeriod == 0) { Locus.peek().execution.checkCancelOrTimeout(); } cursor.setContext(evaluator); final TupleList result2 = listCalc2.evaluateList(evaluator); result.addAll(result2); } } else { final Set> emitted = new HashSet>(); final TupleCursor cursor = iterable1.tupleCursor(); int rowCount = -1; while (cursor.forward()) { rowCount++; if (checkCancelPeriod > 0 && rowCount % checkCancelPeriod == 0) { Locus.peek().execution.checkCancelOrTimeout(); } cursor.setContext(evaluator); final TupleList result2 = listCalc2.evaluateList(evaluator); addDistinctTuples(result, result2, emitted); } } return result; } finally { evaluator.restore(savepoint); } } private static void addDistinctTuples( TupleList result, TupleList result2, Set> emitted) { for (List row : result2) { // wrap array for correct distinctness test if (emitted.add(row)) { result.add(row); } } } public boolean dependsOn(Hierarchy hierarchy) { return anyDependsButFirst(getCalcs(), hierarchy); } } private static class GenerateStringCalcImpl extends AbstractStringCalc { private final IterCalc iterCalc; private final StringCalc stringCalc; private final StringCalc sepCalc; public GenerateStringCalcImpl( ResolvedFunCall call, IterCalc iterCalc, StringCalc stringCalc, StringCalc sepCalc) { super(call, new Calc[]{iterCalc, stringCalc}); this.iterCalc = iterCalc; this.stringCalc = stringCalc; this.sepCalc = sepCalc; } public String evaluateString(Evaluator evaluator) { final int savepoint = evaluator.savepoint(); try { StringBuilder buf = new StringBuilder(); int k = 0; final TupleIterable iter11 = iterCalc.evaluateIterable(evaluator); final TupleCursor cursor = iter11.tupleCursor(); while (cursor.forward()) { cursor.setContext(evaluator); if (k++ > 0) { String sep = sepCalc.evaluateString(evaluator); buf.append(sep); } final String result2 = stringCalc.evaluateString(evaluator); buf.append(result2); } return buf.toString(); } finally { evaluator.restore(savepoint); } } public boolean dependsOn(Hierarchy hierarchy) { return anyDependsButFirst(getCalcs(), hierarchy); } } } // End GenerateFunDef.java mondrian-3.11.0.1-R/src/main/mondrian/olap/fun/GlobalFunTable.java000066400000000000000000000103401261646570300245020ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.olap.fun; import mondrian.olap.*; import mondrian.olap.type.Type; import mondrian.spi.UserDefinedFunction; import mondrian.util.ServiceDiscovery; import java.util.List; /** * Global function table contains builtin functions and global user-defined * functions. * * @author Gang Chen */ public class GlobalFunTable extends FunTableImpl { private static GlobalFunTable instance = new GlobalFunTable(); static { instance.init(); } public static GlobalFunTable instance() { return instance; } private GlobalFunTable() { } public void defineFunctions(Builder builder) { final FunTable builtinFunTable = BuiltinFunTable.instance(); final List reservedWords = builtinFunTable.getReservedWords(); for (String reservedWord : reservedWords) { builder.defineReserved(reservedWord); } final List resolvers = builtinFunTable.getResolvers(); for (Resolver resolver : resolvers) { builder.define(resolver); } for (Class udfClass : lookupUdfImplClasses()) { defineUdf( builder, new UdfResolver.ClassUdfFactory(udfClass, null)); } } private List> lookupUdfImplClasses() { final ServiceDiscovery serviceDiscovery = ServiceDiscovery.forClass(UserDefinedFunction.class); return serviceDiscovery.getImplementor(); } /** * Defines a user-defined function in this table. * *

If the function is not valid, throws an error. * * @param builder Builder * @param udfFactory Factory for UDF */ private void defineUdf( Builder builder, UdfResolver.UdfFactory udfFactory) { // Instantiate class with default constructor. final UserDefinedFunction udf = udfFactory.create(); // Validate function. validateFunction(udf); // Define function. builder.define(new UdfResolver(udfFactory)); } /** * Throws an error if a user-defined function does not adhere to the * API. * * @param udf User defined function */ private void validateFunction(final UserDefinedFunction udf) { // Check that the name is not null or empty. final String udfName = udf.getName(); if (udfName == null || udfName.equals("")) { throw Util.newInternal( "User-defined function defined by class '" + udf.getClass() + "' has empty name"); } // It's OK for the description to be null. //final String description = udf.getDescription(); final Type[] parameterTypes = udf.getParameterTypes(); for (int i = 0; i < parameterTypes.length; i++) { Type parameterType = parameterTypes[i]; if (parameterType == null) { throw Util.newInternal( "Invalid user-defined function '" + udfName + "': parameter type #" + i + " is null"); } } // It's OK for the reserved words to be null or empty. //final String[] reservedWords = udf.getReservedWords(); // Test that the function returns a sensible type when given the FORMAL // types. It may still fail when we give it the ACTUAL types, but it's // impossible to check that now. final Type returnType = udf.getReturnType(parameterTypes); if (returnType == null) { throw Util.newInternal( "Invalid user-defined function '" + udfName + "': return type is null"); } final Syntax syntax = udf.getSyntax(); if (syntax == null) { throw Util.newInternal( "Invalid user-defined function '" + udfName + "': syntax is null"); } } } // End GlobalFunTable.java mondrian-3.11.0.1-R/src/main/mondrian/olap/fun/HeadTailFunDef.java000066400000000000000000000075031261646570300244330ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.olap.fun; import mondrian.calc.*; import mondrian.calc.impl.AbstractListCalc; import mondrian.calc.impl.ConstantCalc; import mondrian.mdx.ResolvedFunCall; import mondrian.olap.Evaluator; import mondrian.olap.FunDef; /** * Definition of the Head and Tail * MDX builtin functions. * * @author jhyde * @since Mar 23, 2006 */ class HeadTailFunDef extends FunDefBase { static final Resolver TailResolver = new ReflectiveMultiResolver( "Tail", "Tail([, ])", "Returns a subset from the end of a set.", new String[] {"fxx", "fxxn"}, HeadTailFunDef.class); static final Resolver HeadResolver = new ReflectiveMultiResolver( "Head", "Head([, < Numeric Expression >])", "Returns the first specified number of elements in a set.", new String[] {"fxx", "fxxn"}, HeadTailFunDef.class); private final boolean head; public HeadTailFunDef(FunDef dummyFunDef) { super(dummyFunDef); head = dummyFunDef.getName().equals("Head"); } public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) { final ListCalc listCalc = compiler.compileList(call.getArg(0)); final IntegerCalc integerCalc = call.getArgCount() > 1 ? compiler.compileInteger(call.getArg(1)) : ConstantCalc.constantInteger(1); if (head) { return new AbstractListCalc( call, new Calc[] {listCalc, integerCalc}) { public TupleList evaluateList(Evaluator evaluator) { final int savepoint = evaluator.savepoint(); try { evaluator.setNonEmpty(false); TupleList list = listCalc.evaluateList(evaluator); int count = integerCalc.evaluateInteger(evaluator); return head(count, list); } finally { evaluator.restore(savepoint); } } }; } else { return new AbstractListCalc( call, new Calc[] {listCalc, integerCalc}) { public TupleList evaluateList(Evaluator evaluator) { final int savepoint = evaluator.savepoint(); try { evaluator.setNonEmpty(false); TupleList list = listCalc.evaluateList(evaluator); int count = integerCalc.evaluateInteger(evaluator); return tail(count, list); } finally { evaluator.restore(savepoint); } } }; } } static TupleList tail(final int count, final TupleList members) { assert members != null; final int memberCount = members.size(); if (count >= memberCount) { return members; } if (count <= 0) { return TupleCollections.emptyList(members.getArity()); } return members.subList(members.size() - count, members.size()); } static TupleList head(final int count, final TupleList members) { assert members != null; if (count <= 0) { return TupleCollections.emptyList(members.getArity()); } return members.subList(0, Math.min(count, members.size())); } } // End HeadTailFunDef.java mondrian-3.11.0.1-R/src/main/mondrian/olap/fun/HierarchizeFunDef.java000066400000000000000000000032671261646570300252200ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.olap.fun; import mondrian.calc.*; import mondrian.calc.impl.AbstractListCalc; import mondrian.mdx.ResolvedFunCall; import mondrian.olap.Evaluator; import mondrian.olap.FunDef; /** * Definition of the Hierarchize MDX function. * * @author jhyde * @since Mar 23, 2006 */ class HierarchizeFunDef extends FunDefBase { static final String[] prePost = {"PRE", "POST"}; static final ReflectiveMultiResolver Resolver = new ReflectiveMultiResolver( "Hierarchize", "Hierarchize([, POST])", "Orders the members of a set in a hierarchy.", new String[] {"fxx", "fxxy"}, HierarchizeFunDef.class, prePost); public HierarchizeFunDef(FunDef dummyFunDef) { super(dummyFunDef); } public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) { final ListCalc listCalc = compiler.compileList(call.getArg(0), true); String order = getLiteralArg(call, 1, "PRE", prePost); final boolean post = order.equals("POST"); return new AbstractListCalc(call, new Calc[] {listCalc}) { public TupleList evaluateList(Evaluator evaluator) { TupleList list = listCalc.evaluateList(evaluator); return hierarchizeTupleList(list, post); } }; } } // End HierarchizeFunDef.java mondrian-3.11.0.1-R/src/main/mondrian/olap/fun/HierarchyCurrentMemberFunDef.java000066400000000000000000000065401261646570300273710ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.olap.fun; import mondrian.calc.*; import mondrian.calc.impl.AbstractMemberCalc; import mondrian.mdx.ResolvedFunCall; import mondrian.olap.*; import mondrian.rolap.RolapHierarchy; import java.util.Map; /** * Definition of the <Hierarchy>.CurrentMember MDX * builtin function. * * @author jhyde * @since Mar 23, 2006 */ public class HierarchyCurrentMemberFunDef extends FunDefBase { static final HierarchyCurrentMemberFunDef instance = new HierarchyCurrentMemberFunDef(); private HierarchyCurrentMemberFunDef() { super( "CurrentMember", "Returns the current member along a hierarchy during an iteration.", "pmh"); } public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) { final HierarchyCalc hierarchyCalc = compiler.compileHierarchy(call.getArg(0)); final Hierarchy hierarchy = hierarchyCalc.getType().getHierarchy(); if (hierarchy != null) { return new FixedCalcImpl(call, hierarchy); } else { return new CalcImpl(call, hierarchyCalc); } } /** * Compiled implementation of the Hierarchy.CurrentMember function that * evaluates the hierarchy expression first. */ public static class CalcImpl extends AbstractMemberCalc { private final HierarchyCalc hierarchyCalc; public CalcImpl(Exp exp, HierarchyCalc hierarchyCalc) { super(exp, new Calc[] {hierarchyCalc}); this.hierarchyCalc = hierarchyCalc; } protected String getName() { return "CurrentMember"; } public Member evaluateMember(Evaluator evaluator) { Hierarchy hierarchy = hierarchyCalc.evaluateHierarchy(evaluator); return evaluator.getContext(hierarchy); } public boolean dependsOn(Hierarchy hierarchy) { return hierarchyCalc.getType().usesHierarchy(hierarchy, false); } } /** * Compiled implementation of the Hierarchy.CurrentMember function that * uses a fixed hierarchy. */ public static class FixedCalcImpl extends AbstractMemberCalc { // getContext works faster if we give RolapHierarchy rather than // Hierarchy private final RolapHierarchy hierarchy; public FixedCalcImpl(Exp exp, Hierarchy hierarchy) { super(exp, new Calc[] {}); assert hierarchy != null; this.hierarchy = (RolapHierarchy) hierarchy; } protected String getName() { return "CurrentMemberFixed"; } public Member evaluateMember(Evaluator evaluator) { return evaluator.getContext(hierarchy); } public boolean dependsOn(Hierarchy hierarchy) { return this.hierarchy == hierarchy; } public void collectArguments(Map arguments) { arguments.put("hierarchy", hierarchy); super.collectArguments(arguments); } } } // End HierarchyCurrentMemberFunDef.java mondrian-3.11.0.1-R/src/main/mondrian/olap/fun/HierarchyDimensionFunDef.java000066400000000000000000000033131261646570300265370ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.olap.fun; import mondrian.calc.*; import mondrian.calc.impl.AbstractDimensionCalc; import mondrian.mdx.ResolvedFunCall; import mondrian.olap.*; /** * Definition of the <Hierarchy>.Dimension MDX * builtin function. * * @author jhyde * @since Mar 23, 2006 */ public class HierarchyDimensionFunDef extends FunDefBase { static final HierarchyDimensionFunDef instance = new HierarchyDimensionFunDef(); private HierarchyDimensionFunDef() { super( "Dimension", "Returns the dimension that contains a specified hierarchy.", "pdh"); } public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) { final HierarchyCalc hierarchyCalc = compiler.compileHierarchy(call.getArg(0)); return new CalcImpl(call, hierarchyCalc); } public static class CalcImpl extends AbstractDimensionCalc { private final HierarchyCalc hierarchyCalc; public CalcImpl(Exp exp, HierarchyCalc hierarchyCalc) { super(exp, new Calc[] {hierarchyCalc}); this.hierarchyCalc = hierarchyCalc; } public Dimension evaluateDimension(Evaluator evaluator) { Hierarchy hierarchy = hierarchyCalc.evaluateHierarchy(evaluator); return hierarchy.getDimension(); } } } // End HierarchyDimensionFunDef.java mondrian-3.11.0.1-R/src/main/mondrian/olap/fun/IifFunDef.java000066400000000000000000000225731261646570300234730ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.olap.fun; import mondrian.calc.*; import mondrian.calc.impl.*; import mondrian.mdx.ResolvedFunCall; import mondrian.olap.*; import mondrian.olap.type.*; /** * Definition of the Iif MDX function. * * @author jhyde * @since Jan 17, 2008 */ public class IifFunDef extends FunDefBase { /** * Creates an IifFunDef. * * @param name Name of the function, for example "Members". * @param description Description of the function * @param flags Encoding of the syntactic, return, and parameter types */ protected IifFunDef( String name, String description, String flags) { super(name, description, flags); } public Type getResultType(Validator validator, Exp[] args) { // This is messy. We have already decided which variant of Iif to use, // and that involves some upcasts. For example, Iif(b, n, NULL) resolves // to the type of n. We don't want to throw it away and take the most // general type. So, for scalar types we create a type based on // returnCategory. // // But for dimensional types (member, level, hierarchy, dimension, // tuple) we want to preserve as much type information as possible, so // we recompute the type based on the common types of all args. // // FIXME: We should pass more info into this method, such as the list // of conversions computed while resolving overloadings. switch (returnCategory) { case Category.Numeric: return new NumericType(); case Category.String: return new StringType(); case Category.Logical: return new BooleanType(); default: return TypeUtil.computeCommonType( true, args[1].getType(), args[2].getType()); } } public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) { final BooleanCalc booleanCalc = compiler.compileBoolean(call.getArg(0)); final Calc calc1 = compiler.compileAs( call.getArg(1), call.getType(), ResultStyle.ANY_LIST); final Calc calc2 = compiler.compileAs( call.getArg(2), call.getType(), ResultStyle.ANY_LIST); if (call.getType() instanceof SetType) { return new GenericIterCalc(call) { public Object evaluate(Evaluator evaluator) { final boolean b = booleanCalc.evaluateBoolean(evaluator); Calc calc = b ? calc1 : calc2; return calc.evaluate(evaluator); } public Calc[] getCalcs() { return new Calc[] {booleanCalc, calc1, calc2}; } }; } else { return new GenericCalc(call) { public Object evaluate(Evaluator evaluator) { final boolean b = booleanCalc.evaluateBoolean(evaluator); Calc calc = b ? calc1 : calc2; return calc.evaluate(evaluator); } public Calc[] getCalcs() { return new Calc[] {booleanCalc, calc1, calc2}; } }; } } // IIf(, , ) static final FunDefBase STRING_INSTANCE = new FunDefBase( "IIf", "Returns one of two string values determined by a logical test.", "fSbSS") { public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) { final BooleanCalc booleanCalc = compiler.compileBoolean(call.getArg(0)); final StringCalc calc1 = compiler.compileString(call.getArg(1)); final StringCalc calc2 = compiler.compileString(call.getArg(2)); return new AbstractStringCalc( call, new Calc[] {booleanCalc, calc1, calc2}) { public String evaluateString(Evaluator evaluator) { final boolean b = booleanCalc.evaluateBoolean(evaluator); StringCalc calc = b ? calc1 : calc2; return calc.evaluateString(evaluator); } }; } }; // IIf(, , ) static final FunDefBase NUMERIC_INSTANCE = new IifFunDef( "IIf", "Returns one of two numeric values determined by a logical test.", "fnbnn") { public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) { final BooleanCalc booleanCalc = compiler.compileBoolean(call.getArg(0)); final Calc calc1 = compiler.compileScalar(call.getArg(1), true); final Calc calc2 = compiler.compileScalar(call.getArg(2), true); return new GenericCalc(call) { public Object evaluate(Evaluator evaluator) { final boolean b = booleanCalc.evaluateBoolean(evaluator); Calc calc = b ? calc1 : calc2; return calc.evaluate(evaluator); } public Calc[] getCalcs() { return new Calc[] {booleanCalc, calc1, calc2}; } }; } }; // IIf(, , ) static final FunDefBase TUPLE_INSTANCE = new IifFunDef( "IIf", "Returns one of two tuples determined by a logical test.", "ftbtt") { public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) { final BooleanCalc booleanCalc = compiler.compileBoolean(call.getArg(0)); final Calc calc1 = compiler.compileTuple(call.getArg(1)); final Calc calc2 = compiler.compileTuple(call.getArg(2)); return new GenericCalc(call) { public Object evaluate(Evaluator evaluator) { final boolean b = booleanCalc.evaluateBoolean(evaluator); Calc calc = b ? calc1 : calc2; return calc.evaluate(evaluator); } public Calc[] getCalcs() { return new Calc[] {booleanCalc, calc1, calc2}; } }; } }; // IIf(, , ) static final FunDefBase BOOLEAN_INSTANCE = new FunDefBase( "IIf", "Returns boolean determined by a logical test.", "fbbbb") { public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) { final BooleanCalc booleanCalc = compiler.compileBoolean(call.getArg(0)); final BooleanCalc booleanCalc1 = compiler.compileBoolean(call.getArg(1)); final BooleanCalc booleanCalc2 = compiler.compileBoolean(call.getArg(2)); Calc[] calcs = {booleanCalc, booleanCalc1, booleanCalc2}; return new AbstractBooleanCalc(call, calcs) { public boolean evaluateBoolean(Evaluator evaluator) { final boolean condition = booleanCalc.evaluateBoolean(evaluator); if (condition) { return booleanCalc1.evaluateBoolean(evaluator); } else { return booleanCalc2.evaluateBoolean(evaluator); } } }; } }; // IIf(, , ) static final IifFunDef MEMBER_INSTANCE = new IifFunDef( "IIf", "Returns one of two member values determined by a logical test.", "fmbmm"); // IIf(, , ) static final IifFunDef LEVEL_INSTANCE = new IifFunDef( "IIf", "Returns one of two level values determined by a logical test.", "flbll"); // IIf(, , ) static final IifFunDef HIERARCHY_INSTANCE = new IifFunDef( "IIf", "Returns one of two hierarchy values determined by a logical test.", "fhbhh"); // IIf(, , ) static final IifFunDef DIMENSION_INSTANCE = new IifFunDef( "IIf", "Returns one of two dimension values determined by a logical test.", "fdbdd"); // IIf(, , ) static final IifFunDef SET_INSTANCE = new IifFunDef( "IIf", "Returns one of two set values determined by a logical test.", "fxbxx"); } // End IifFunDef.java mondrian-3.11.0.1-R/src/main/mondrian/olap/fun/IntersectFunDef.java000066400000000000000000000151161261646570300247170ustar00rootroot00000000000000/* // This software is subject to the terms of the Eclipse Public License v1.0 // Agreement, available at the following URL: // http://www.eclipse.org/legal/epl-v10.html. // You must accept the terms of that agreement to use this software. // // Copyright (C) 2004-2005 Julian Hyde // Copyright (C) 2005-2011 Pentaho and others // All Rights Reserved. */ package mondrian.olap.fun; import mondrian.calc.*; import mondrian.calc.impl.AbstractListCalc; import mondrian.mdx.ResolvedFunCall; import mondrian.olap.*; import java.util.*; /** * Definition of the INTERSECT MDX function. * * @author jhyde * @since Mar 23, 2006 */ class IntersectFunDef extends FunDefBase { private static final String[] ReservedWords = new String[] {"ALL"}; static final Resolver resolver = new ReflectiveMultiResolver( "Intersect", "Intersect(, [, ALL])", "Returns the intersection of two input sets, optionally retaining duplicates.", new String[] {"fxxxy", "fxxx"}, IntersectFunDef.class, ReservedWords); public IntersectFunDef(FunDef dummyFunDef) { super(dummyFunDef); } public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) { final String literalArg = getLiteralArg(call, 2, "", ReservedWords); final boolean all = literalArg.equalsIgnoreCase("ALL"); final int arity = call.getType().getArity(); final ListCalc listCalc1 = compiler.compileList(call.getArg(0)); final ListCalc listCalc2 = compiler.compileList(call.getArg(1)); return new AbstractListCalc( call, new Calc[] {listCalc1, listCalc2}) { public TupleList evaluateList(Evaluator evaluator) { TupleList leftList = listCalc1.evaluateList(evaluator); if (leftList.isEmpty()) { return leftList; } final TupleList rightList = listCalc2.evaluateList(evaluator); if (rightList.isEmpty()) { return rightList; } // Set of members from the right side of the intersect. // We use a RetrievableSet because distinct keys // (regular members and visual totals members) compare // identical using hashCode and equals, we want to retrieve // the actual key, and java.util.Set only has containsKey. RetrievableSet> rightSet = new RetrievableHashSet>( rightList.size() * 3 / 2); for (List tuple : rightList) { rightSet.add(tuple); } final TupleList result = TupleCollections.createList( arity, Math.min(leftList.size(), rightList.size())); final Set> resultSet = all ? null : new HashSet>(); for (List leftTuple : leftList) { List rightKey = rightSet.getKey(leftTuple); if (rightKey == null) { continue; } if (resultSet != null && !resultSet.add(leftTuple)) { continue; } result.add( copyTupleWithVisualTotalsMembersOverriding( leftTuple, rightKey)); } return result; } /** * Constructs a tuple consisting of members from * {@code leftTuple}, but overridden by any corresponding * members from {@code rightKey} that happen to be visual totals * members. * *

Returns the original tuple if there are no visual totals * members on the RHS. * * @param leftTuple Original tuple * @param rightKey Right tuple * @return Copy of original tuple, with any VisualTotalMembers * from right tuple overriding */ private List copyTupleWithVisualTotalsMembersOverriding( List leftTuple, List rightKey) { List tuple = leftTuple; for (int i = 0; i < rightKey.size(); i++) { Member member = rightKey.get(i); if (!(tuple.get(i) instanceof VisualTotalsFunDef.VisualTotalMember) && member instanceof VisualTotalsFunDef.VisualTotalMember) { if (tuple == leftTuple) { // clone on first VisualTotalMember -- to avoid // alloc/copy in the common case where there are // no VisualTotalMembers tuple = new ArrayList(leftTuple); } tuple.set(i, member); } } return tuple; } }; } /** * Interface similar to the Set interface that allows key values to be * returned. * *

Useful if multiple objects can compare equal (using * {@link Object#equals(Object)} and {@link Object#hashCode()}, per the * set contract) and you wish to distinguish them after they have been added * to the set. * * @param element type */ private interface RetrievableSet { /** * Returns the key in this set that compares equal to a given object, * or null if there is no such key. * * @param e Key value * @return Key in the set equal to given key value */ E getKey(E e); /** * Analogous to {@link Set#add(Object)}. * * @param e element to be added to this set * @return true if this set did not already contain the * specified element */ boolean add(E e); } private static class RetrievableHashSet extends HashMap implements RetrievableSet { public RetrievableHashSet(int initialCapacity) { super(initialCapacity); } public E getKey(E e) { return super.get(e); } public boolean add(E e) { return super.put(e, e) == null; } } } // End IntersectFunDef.java mondrian-3.11.0.1-R/src/main/mondrian/olap/fun/IsEmptyFunDef.java000066400000000000000000000034541261646570300243530ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.olap.fun; import mondrian.calc.Calc; import mondrian.calc.ExpCompiler; import mondrian.calc.impl.AbstractBooleanCalc; import mondrian.mdx.ResolvedFunCall; import mondrian.olap.Evaluator; import mondrian.olap.FunDef; /** * Definition of the IsEmpty MDX function. * * @author jhyde * @since Mar 23, 2006 */ class IsEmptyFunDef extends FunDefBase { static final ReflectiveMultiResolver FunctionResolver = new ReflectiveMultiResolver( "IsEmpty", "IsEmpty()", "Determines if an expression evaluates to the empty cell value.", new String[] {"fbS", "fbn"}, IsEmptyFunDef.class); static final ReflectiveMultiResolver PostfixResolver = new ReflectiveMultiResolver( "IS EMPTY", " IS EMPTY", "Determines if an expression evaluates to the empty cell value.", new String[] {"Qbm", "Qbt"}, IsEmptyFunDef.class); public IsEmptyFunDef(FunDef dummyFunDef) { super(dummyFunDef); } public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) { final Calc calc = compiler.compileScalar(call.getArg(0), true); return new AbstractBooleanCalc(call, new Calc[] {calc}) { public boolean evaluateBoolean(Evaluator evaluator) { Object o = calc.evaluate(evaluator); return o == null; } }; } } // End IsEmptyFunDef.java mondrian-3.11.0.1-R/src/main/mondrian/olap/fun/IsFunDef.java000066400000000000000000000044711261646570300233340ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.olap.fun; import mondrian.calc.*; import mondrian.calc.impl.AbstractBooleanCalc; import mondrian.mdx.ResolvedFunCall; import mondrian.olap.*; /** * Definition of the IS MDX function. * * @see IsNullFunDef * @author jhyde * @since Mar 23, 2006 */ class IsFunDef extends FunDefBase { static final ReflectiveMultiResolver Resolver = new ReflectiveMultiResolver( "IS", " IS ", "Returns whether two objects are the same", new String[] {"ibmm", "ibll", "ibhh", "ibdd", "ibtt"}, IsFunDef.class); public IsFunDef(FunDef dummyFunDef) { super(dummyFunDef); } public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) { final int category = call.getArg(0).getCategory(); switch (category) { case Category.Tuple: final TupleCalc tupleCalc0 = compiler.compileTuple(call.getArg(0)); final TupleCalc tupleCalc1 = compiler.compileTuple(call.getArg(1)); return new AbstractBooleanCalc( call, new Calc[] {tupleCalc0, tupleCalc1}) { public boolean evaluateBoolean(Evaluator evaluator) { Member[] o0 = tupleCalc0.evaluateTuple(evaluator); Member[] o1 = tupleCalc1.evaluateTuple(evaluator); return equalTuple(o0, o1); } }; default: assert category == call.getArg(1).getCategory(); final Calc calc0 = compiler.compile(call.getArg(0)); final Calc calc1 = compiler.compile(call.getArg(1)); return new AbstractBooleanCalc(call, new Calc[] {calc0, calc1}) { public boolean evaluateBoolean(Evaluator evaluator) { Object o0 = calc0.evaluate(evaluator); Object o1 = calc1.evaluate(evaluator); return o0.equals(o1); } }; } } } // End IsFunDef.java mondrian-3.11.0.1-R/src/main/mondrian/olap/fun/IsNullFunDef.java000066400000000000000000000030421261646570300241600ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.olap.fun; import mondrian.calc.*; import mondrian.calc.impl.AbstractBooleanCalc; import mondrian.mdx.ResolvedFunCall; import mondrian.olap.*; /** * Definition of the IS NULL MDX function. * * @author medstat * @since Aug 21, 2006 */ class IsNullFunDef extends FunDefBase { /** * Resolves calls to the IS NULL postfix operator. */ static final ReflectiveMultiResolver Resolver = new ReflectiveMultiResolver( "IS NULL", " IS NULL", "Returns whether an object is null", new String[]{"Qbm", "Qbl", "Qbh", "Qbd"}, IsNullFunDef.class); public IsNullFunDef(FunDef dummyFunDef) { super(dummyFunDef); } public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) { assert call.getArgCount() == 1; final MemberCalc memberCalc = compiler.compileMember(call.getArg(0)); return new AbstractBooleanCalc(call, new Calc[]{memberCalc}) { public boolean evaluateBoolean(Evaluator evaluator) { Member member = memberCalc.evaluateMember(evaluator); return member.isNull(); } }; } } // End IsNullFunDef.java mondrian-3.11.0.1-R/src/main/mondrian/olap/fun/JavaFunDef.java000066400000000000000000000335131261646570300236410ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.olap.fun; import mondrian.calc.*; import mondrian.calc.impl.AbstractCalc; import mondrian.calc.impl.GenericCalc; import mondrian.mdx.ResolvedFunCall; import mondrian.olap.*; import java.lang.annotation.*; import java.lang.reflect.*; import java.util.*; /** * MDX function which is implemented by a Java method. When the function is * executed, the method is invoked via reflection. * * @author wgorman, jhyde * @since Jan 5, 2008 */ public class JavaFunDef extends FunDefBase { private static final Map mapClazzToCategory = new HashMap(); private static final String className = JavaFunDef.class.getName(); static { mapClazzToCategory.put(String.class, Category.String); mapClazzToCategory.put(Double.class, Category.Numeric); mapClazzToCategory.put(double.class, Category.Numeric); mapClazzToCategory.put(Integer.class, Category.Integer); mapClazzToCategory.put(int.class, Category.Integer); mapClazzToCategory.put(boolean.class, Category.Logical); mapClazzToCategory.put(Object.class, Category.Value); mapClazzToCategory.put(Date.class, Category.DateTime); mapClazzToCategory.put(float.class, Category.Numeric); mapClazzToCategory.put(long.class, Category.Numeric); mapClazzToCategory.put(double[].class, Category.Array); mapClazzToCategory.put(char.class, Category.String); mapClazzToCategory.put(byte.class, Category.Integer); } private final Method method; /** * Creates a JavaFunDef. * * @param name Name * @param desc Description * @param syntax Syntax * @param returnCategory Return type * @param paramCategories Parameter types * @param method Java method which implements this function */ public JavaFunDef( String name, String desc, Syntax syntax, int returnCategory, int[] paramCategories, Method method) { super(name, null, desc, syntax, returnCategory, paramCategories); this.method = method; } public Calc compileCall( ResolvedFunCall call, ExpCompiler compiler) { final Calc[] calcs = new Calc[parameterCategories.length]; final Class[] parameterTypes = method.getParameterTypes(); for (int i = 0; i < calcs.length;i++) { calcs[i] = compileTo( compiler, call.getArgs()[i], parameterTypes[i]); } return new JavaMethodCalc(call, calcs, method); } private static int getCategory(Class clazz) { return mapClazzToCategory.get(clazz); } private static int getReturnCategory(Method m) { return getCategory(m.getReturnType()); } private static int[] getParameterCategories(Method m) { int arr[] = new int[m.getParameterTypes().length]; for (int i = 0; i < m.getParameterTypes().length; i++) { arr[i] = getCategory(m.getParameterTypes()[i]); } return arr; } private static FunDef generateFunDef(final Method method) { String name = getAnnotation( method, className + "$FunctionName", method.getName()); String desc = getAnnotation( method, className + "$Description", ""); Syntax syntax = getAnnotation( method, className + "$SyntaxDef", Syntax.Function); int returnCategory = getReturnCategory(method); int paramCategories[] = getParameterCategories(method); return new JavaFunDef( name, desc, syntax, returnCategory, paramCategories, method); } /** * Scans a java class and returns a list of function definitions, one for * each static method which is suitable to become an MDX function. * * @param clazz Class * @return List of function definitions */ public static List scan(Class clazz) { List list = new ArrayList(); Method[] methods = clazz.getMethods(); for (Method method : methods) { if (Modifier.isStatic(method.getModifiers()) && !method.getName().equals("main")) { list.add(generateFunDef(method)); } } return list; } /** * Compiles an expression to a calc of the required result type. * *

Since the result of evaluating the calc will be passed to the method * using reflection, it is important that the calc returns * precisely the correct type: if a method requires an * int, you can pass an {@link Integer} but not a {@link Long} * or {@link Float}. * *

If it can be determined that the underlying calc will never return * null, generates an optimal form with one fewer object instantiation. * * @param compiler Compiler * @param exp Expression to compile * @param clazz Desired class * @return compiled expression */ private static Calc compileTo(ExpCompiler compiler, Exp exp, Class clazz) { if (clazz == String.class) { return compiler.compileString(exp); } else if (clazz == Date.class) { return compiler.compileDateTime(exp); } else if (clazz == boolean.class) { return compiler.compileBoolean(exp); } else if (clazz == byte.class) { final IntegerCalc integerCalc = compiler.compileInteger(exp); if (integerCalc.getResultStyle() == ResultStyle.VALUE_NOT_NULL) { // We know that the calculation will never return a null value, // so generate optimized code. return new AbstractCalc2(exp, integerCalc) { public Object evaluate(Evaluator evaluator) { return (byte) integerCalc.evaluateInteger(evaluator); } }; } else { return new AbstractCalc2(exp, integerCalc) { public Object evaluate(Evaluator evaluator) { Integer i = (Integer) integerCalc.evaluate(evaluator); return i == null ? null : (byte) i.intValue(); } }; } } else if (clazz == char.class) { final StringCalc stringCalc = compiler.compileString(exp); return new AbstractCalc2(exp, stringCalc) { public Object evaluate(Evaluator evaluator) { final String string = stringCalc.evaluateString(evaluator); return Character.valueOf( string == null || string.length() < 1 ? (char) 0 : string.charAt(0)); } }; } else if (clazz == short.class) { final IntegerCalc integerCalc = compiler.compileInteger(exp); if (integerCalc.getResultStyle() == ResultStyle.VALUE_NOT_NULL) { return new AbstractCalc2(exp, integerCalc) { public Object evaluate(Evaluator evaluator) { return (short) integerCalc.evaluateInteger(evaluator); } }; } else { return new AbstractCalc2(exp, integerCalc) { public Object evaluate(Evaluator evaluator) { Integer i = (Integer) integerCalc.evaluate(evaluator); return i == null ? null : (short) i.intValue(); } }; } } else if (clazz == int.class) { return compiler.compileInteger(exp); } else if (clazz == long.class) { final IntegerCalc integerCalc = compiler.compileInteger(exp); if (integerCalc.getResultStyle() == ResultStyle.VALUE_NOT_NULL) { return new AbstractCalc2(exp, integerCalc) { public Object evaluate(Evaluator evaluator) { return (long) integerCalc.evaluateInteger(evaluator); } }; } else { return new AbstractCalc2(exp, integerCalc) { public Object evaluate(Evaluator evaluator) { Integer i = (Integer) integerCalc.evaluate(evaluator); return i == null ? null : (long) i.intValue(); } }; } } else if (clazz == float.class) { final DoubleCalc doubleCalc = compiler.compileDouble(exp); if (doubleCalc.getResultStyle() == ResultStyle.VALUE_NOT_NULL) { return new AbstractCalc2(exp, doubleCalc) { public Object evaluate(Evaluator evaluator) { Double v = (Double) doubleCalc.evaluate(evaluator); return v == null ? null : v.floatValue(); } }; } else { return new AbstractCalc2(exp, doubleCalc) { public Object evaluate(Evaluator evaluator) { return (float) doubleCalc.evaluateDouble(evaluator); } }; } } else if (clazz == double.class) { return compiler.compileDouble(exp); } else if (clazz == Object.class) { return compiler.compileScalar(exp, false); } else { throw newInternal("expected primitive type, got " + clazz); } } /** * Annotation which allows you to tag a Java method with the name of the * MDX function it implements. */ @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface FunctionName { public abstract String value(); } /** * Annotation which allows you to tag a Java method with the description * of the MDX function it implements. */ @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface Description { public abstract String value(); } /** * Annotation which allows you to tag a Java method with the signature of * the MDX function it implements. */ @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface Signature { public abstract String value(); } /** * Annotation which allows you to tag a Java method with the syntax of the * MDX function it implements. */ @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface SyntaxDef { public abstract Syntax value(); } /** * Base class for adapter calcs that convert arguments into the precise * type needed. */ private static abstract class AbstractCalc2 extends AbstractCalc { /** * Creates an AbstractCalc2. * * @param exp Source expression * @param calc Child compiled expression */ protected AbstractCalc2(Exp exp, Calc calc) { super(exp, new Calc[] {calc}); } } /** * Calc which calls a Java method. */ private static class JavaMethodCalc extends GenericCalc { private final Method method; private final Object[] args; /** * Creates a JavaMethodCalc. * * @param call Function call being implemented * @param calcs Calcs for arguments of function call * @param method Method to call */ public JavaMethodCalc( ResolvedFunCall call, Calc[] calcs, Method method) { super(call, calcs); this.method = method; this.args = new Object[calcs.length]; } public Object evaluate(Evaluator evaluator) { final Calc[] calcs = getCalcs(); for (int i = 0; i < args.length; i++) { args[i] = calcs[i].evaluate(evaluator); if (args[i] == null) { return nullValue; } } try { return method.invoke(null, args); } catch (IllegalAccessException e) { throw newEvalException(e); } catch (InvocationTargetException e) { throw newEvalException(e.getCause()); } catch (IllegalArgumentException e) { if (e.getMessage().equals("argument type mismatch")) { StringBuilder buf = new StringBuilder( "argument type mismatch: parameters ("); int k = 0; for (Class parameterType : method.getParameterTypes()) { if (k++ > 0) { buf.append(", "); } buf.append(parameterType.getName()); } buf.append("), actual ("); k = 0; for (Object arg : args) { if (k++ > 0) { buf.append(", "); } buf.append( arg == null ? "null" : arg.getClass().getName()); } buf.append(")"); throw newInternal(buf.toString()); } else { throw e; } } } } } // End JavaFunDef.java mondrian-3.11.0.1-R/src/main/mondrian/olap/fun/LastPeriodsFunDef.java000066400000000000000000000117331261646570300252110ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.olap.fun; import mondrian.calc.*; import mondrian.calc.impl.AbstractListCalc; import mondrian.calc.impl.UnaryTupleList; import mondrian.mdx.ResolvedFunCall; import mondrian.olap.*; import mondrian.olap.type.*; import mondrian.rolap.RolapCube; import mondrian.rolap.RolapHierarchy; import java.util.*; /** * Definition of the LastPeriods MDX function. * * @author jhyde * @since Mar 23, 2006 */ class LastPeriodsFunDef extends FunDefBase { static final ReflectiveMultiResolver Resolver = new ReflectiveMultiResolver( "LastPeriods", "LastPeriods( [, ])", "Returns a set of members prior to and including a specified member.", new String[] {"fxn", "fxnm"}, LastPeriodsFunDef.class); public LastPeriodsFunDef(FunDef dummyFunDef) { super(dummyFunDef); } public Type getResultType(Validator validator, Exp[] args) { if (args.length == 1) { // If Member is not specified, // it is Time.CurrentMember. RolapHierarchy defaultTimeHierarchy = ((RolapCube) validator.getQuery().getCube()).getTimeHierarchy( getName()); return new SetType(MemberType.forHierarchy(defaultTimeHierarchy)); } else { Type type = args[1].getType(); Type memberType = TypeUtil.toMemberOrTupleType(type); return new SetType(memberType); } } public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) { // Member defaults to [Time].currentmember Exp[] args = call.getArgs(); final MemberCalc memberCalc; if (args.length == 1) { final RolapHierarchy timeHierarchy = ((RolapCube) compiler.getEvaluator().getCube()) .getTimeHierarchy(getName()); memberCalc = new HierarchyCurrentMemberFunDef.FixedCalcImpl( call, timeHierarchy); } else { memberCalc = compiler.compileMember(args[1]); } // Numeric Expression. final IntegerCalc indexValueCalc = compiler.compileInteger(args[0]); return new AbstractListCalc( call, new Calc[] {memberCalc, indexValueCalc}) { public TupleList evaluateList(Evaluator evaluator) { Member member = memberCalc.evaluateMember(evaluator); int indexValue = indexValueCalc.evaluateInteger(evaluator); return new UnaryTupleList( lastPeriods(member, evaluator, indexValue)); } }; } /** * If Index is positive, returns the set of Index * members ending with Member and starting with the * member lagging Index - 1 from Member. * *

If Index is negative, returns the set of (- Index) * members starting with Member and ending with the * member leading (- Index - 1) from Member. * *

If Index is zero, the empty set is returned. */ List lastPeriods( Member member, Evaluator evaluator, int indexValue) { // empty set if ((indexValue == 0) || member.isNull()) { return Collections.emptyList(); } List list = new ArrayList(); // set with just member if ((indexValue == 1) || (indexValue == -1)) { list.add(member); return list; } // When null is found, getting the first/last // member at a given level is not particularly // fast. Member startMember; Member endMember; if (indexValue > 0) { startMember = evaluator.getSchemaReader() .getLeadMember(member, - (indexValue - 1)); endMember = member; if (startMember.isNull()) { List members = evaluator.getSchemaReader() .getLevelMembers(member.getLevel(), false); startMember = members.get(0); } } else { startMember = member; endMember = evaluator.getSchemaReader() .getLeadMember(member, -(indexValue + 1)); if (endMember.isNull()) { List members = evaluator.getSchemaReader() .getLevelMembers(member.getLevel(), false); endMember = members.get(members.size() - 1); } } evaluator.getSchemaReader().getMemberRange( member.getLevel(), startMember, endMember, list); return list; } } // End LastPeriodsFunDef.java mondrian-3.11.0.1-R/src/main/mondrian/olap/fun/LeadLagFunDef.java000066400000000000000000000047741261646570300242600ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.olap.fun; import mondrian.calc.*; import mondrian.calc.impl.AbstractMemberCalc; import mondrian.mdx.ResolvedFunCall; import mondrian.olap.*; /** * Definition of the Lead and Lag MDX functions. * * @author jhyde * @since Mar 23, 2006 */ class LeadLagFunDef extends FunDefBase { static final ReflectiveMultiResolver LagResolver = new ReflectiveMultiResolver( "Lag", ".Lag()", "Returns a member further along the specified member's dimension.", new String[]{"mmmn"}, LeadLagFunDef.class); static final ReflectiveMultiResolver LeadResolver = new ReflectiveMultiResolver( "Lead", ".Lead()", "Returns a member further along the specified member's dimension.", new String[]{"mmmn"}, LeadLagFunDef.class); public LeadLagFunDef(FunDef dummyFunDef) { super(dummyFunDef); } public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) { final MemberCalc memberCalc = compiler.compileMember(call.getArg(0)); final IntegerCalc integerCalc = compiler.compileInteger(call.getArg(1)); final boolean lag = call.getFunName().equals("Lag"); return new AbstractMemberCalc( call, new Calc[] {memberCalc, integerCalc}) { public Member evaluateMember(Evaluator evaluator) { Member member = memberCalc.evaluateMember(evaluator); int n = integerCalc.evaluateInteger(evaluator); if (lag) { if (n == Integer.MIN_VALUE) { // Bump up lagValue by one, otherwise -n (used // in the getLeadMember call below) is out of // range because Integer.MAX_VALUE == // -(Integer.MIN_VALUE + 1). n += 1; } n = -n; } return evaluator.getSchemaReader().getLeadMember(member, n); } }; } } // End LeadLagFunDef.java mondrian-3.11.0.1-R/src/main/mondrian/olap/fun/LevelDimensionFunDef.java000066400000000000000000000025441261646570300256750ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.olap.fun; import mondrian.calc.*; import mondrian.calc.impl.AbstractDimensionCalc; import mondrian.mdx.ResolvedFunCall; import mondrian.olap.*; /** * Definition of the <Level>.Dimension * MDX builtin function. * * @author jhyde * @since Jul 20, 2009 */ class LevelDimensionFunDef extends FunDefBase { public static final FunDefBase INSTANCE = new LevelDimensionFunDef(); public LevelDimensionFunDef() { super( "Dimension", "Returns the dimension that contains a specified level.", "pdl"); } public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) { final LevelCalc levelCalc = compiler.compileLevel(call.getArg(0)); return new AbstractDimensionCalc(call, new Calc[] {levelCalc}) { public Dimension evaluateDimension(Evaluator evaluator) { Level level = levelCalc.evaluateLevel(evaluator); return level.getDimension(); } }; } } // End LevelDimensionFunDef.java mondrian-3.11.0.1-R/src/main/mondrian/olap/fun/LevelHierarchyFunDef.java000066400000000000000000000030211261646570300256550ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.olap.fun; import mondrian.calc.*; import mondrian.calc.impl.AbstractHierarchyCalc; import mondrian.mdx.ResolvedFunCall; import mondrian.olap.*; /** * Definition of the <Level>.Hierarchy MDX builtin function. * * @author jhyde * @since Mar 23, 2006 */ public class LevelHierarchyFunDef extends FunDefBase { static final LevelHierarchyFunDef instance = new LevelHierarchyFunDef(); private LevelHierarchyFunDef() { super("Hierarchy", "Returns a level's hierarchy.", "phl"); } public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) { final LevelCalc levelCalc = compiler.compileLevel(call.getArg(0)); return new CalcImpl(call, levelCalc); } public static class CalcImpl extends AbstractHierarchyCalc { private final LevelCalc levelCalc; public CalcImpl(Exp exp, LevelCalc levelCalc) { super(exp, new Calc[] {levelCalc}); this.levelCalc = levelCalc; } public Hierarchy evaluateHierarchy(Evaluator evaluator) { Level level = levelCalc.evaluateLevel(evaluator); return level.getHierarchy(); } } } // End LevelHierarchyFunDef.java mondrian-3.11.0.1-R/src/main/mondrian/olap/fun/LevelMembersFunDef.java000066400000000000000000000025251261646570300253410ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.olap.fun; import mondrian.calc.*; import mondrian.calc.impl.AbstractListCalc; import mondrian.mdx.ResolvedFunCall; import mondrian.olap.Evaluator; import mondrian.olap.Level; /** * Definition of the <Level>.Members MDX function. * * @author jhyde * @since Jan 17, 2009 */ public class LevelMembersFunDef extends FunDefBase { public static final LevelMembersFunDef INSTANCE = new LevelMembersFunDef(); private LevelMembersFunDef() { super("Members", "Returns the set of members in a level.", "pxl"); } public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) { final LevelCalc levelCalc = compiler.compileLevel(call.getArg(0)); return new AbstractListCalc(call, new Calc[] {levelCalc}) { public TupleList evaluateList(Evaluator evaluator) { Level level = levelCalc.evaluateLevel(evaluator); return levelMembers(level, evaluator, false); } }; } } // End LevelMembersFunDef.java mondrian-3.11.0.1-R/src/main/mondrian/olap/fun/LinReg.java000066400000000000000000000462431261646570300230540ustar00rootroot00000000000000/* // This software is subject to the terms of the Eclipse Public License v1.0 // Agreement, available at the following URL: // http://www.eclipse.org/legal/epl-v10.html. // You must accept the terms of that agreement to use this software. // // Copyright (C) 2005-2005 Julian Hyde // Copyright (C) 2005-2011 Pentaho // All Rights Reserved. */ package mondrian.olap.fun; import mondrian.calc.*; import mondrian.calc.impl.AbstractDoubleCalc; import mondrian.calc.impl.ValueCalc; import mondrian.mdx.ResolvedFunCall; import mondrian.olap.*; import java.util.*; /** * Abstract base class for definitions of linear regression functions. * * @see InterceptFunDef * @see PointFunDef * @see R2FunDef * @see SlopeFunDef * @see VarianceFunDef * *

Correlation coefficient

*

Correlation coefficient

* *

The correlation coefficient, r, ranges from -1 to + 1. The * nonparametric Spearman correlation coefficient, abbreviated rs, has * the same range.

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
Value of r (or rs)Interpretation
r= 0The two variables do not vary together at all.
0 > r > 1 *

The two variables tend to increase or decrease together.

*
r = 1.0 *

Perfect correlation.

*
-1 > r > 0 *

One variable increases as the other decreases.

*
r = -1.0 *

*

Perfect negative or inverse correlation.

*
* *

If r or rs is far from zero, there are four possible explanations:

*

The X variable helps determine the value of the Y variable.

*
    *
  • The Y variable helps determine the value of the X variable. *
  • Another variable influences both X and Y. *
  • X and Y don't really correlate at all, and you just * happened to observe such a strong correlation by chance. The P value * determines how often this could occur. *
*

r2

* *

Perhaps the best way to interpret the value of r is to square it to * calculate r2. Statisticians call this quantity the coefficient of * determination, but scientists call it r squared. It is has a value * that ranges from zero to one, and is the fraction of the variance in * the two variables that is shared. For example, if r2=0.59, then 59% of * the variance in X can be explained by variation in Y.  Likewise, * 59% of the variance in Y can be explained by (or goes along with) * variation in X. More simply, 59% of the variance is shared between X * and Y.

* *

(Source). * *

Also see: least squares fitting. */ public abstract class LinReg extends FunDefBase { /** Code for the specific function. */ final int regType; public static final int Point = 0; public static final int R2 = 1; public static final int Intercept = 2; public static final int Slope = 3; public static final int Variance = 4; static final Resolver InterceptResolver = new ReflectiveMultiResolver( "LinRegIntercept", "LinRegIntercept(, [, ])", "Calculates the linear regression of a set and returns the value of b in the regression line y = ax + b.", new String[]{"fnxn", "fnxnn"}, InterceptFunDef.class); static final Resolver PointResolver = new ReflectiveMultiResolver( "LinRegPoint", "LinRegPoint(, , [, ])", "Calculates the linear regression of a set and returns the value of y in the regression line y = ax + b.", new String[]{"fnnxn", "fnnxnn"}, PointFunDef.class); static final Resolver SlopeResolver = new ReflectiveMultiResolver( "LinRegSlope", "LinRegSlope(, [, ])", "Calculates the linear regression of a set and returns the value of a in the regression line y = ax + b.", new String[]{"fnxn", "fnxnn"}, SlopeFunDef.class); static final Resolver R2Resolver = new ReflectiveMultiResolver( "LinRegR2", "LinRegR2(, [, ])", "Calculates the linear regression of a set and returns R2 (the coefficient of determination).", new String[]{"fnxn", "fnxnn"}, R2FunDef.class); static final Resolver VarianceResolver = new ReflectiveMultiResolver( "LinRegVariance", "LinRegVariance(, [, ])", "Calculates the linear regression of a set and returns the variance associated with the regression line y = ax + b.", new String[]{"fnxn", "fnxnn"}, VarianceFunDef.class); public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) { final ListCalc listCalc = compiler.compileList(call.getArg(0)); final DoubleCalc yCalc = compiler.compileDouble(call.getArg(1)); final DoubleCalc xCalc = call.getArgCount() > 2 ? compiler.compileDouble(call.getArg(2)) : new ValueCalc(call); return new LinRegCalc(call, listCalc, yCalc, xCalc, regType); } ///////////////////////////////////////////////////////////////////////// // // Helper // ///////////////////////////////////////////////////////////////////////// static class Value { private List xs; private List ys; /** * The intercept for the linear regression model. Initialized * following a call to accuracy. */ double intercept; /** * The slope for the linear regression model. Initialized following a * call to accuracy. */ double slope; /** the coefficient of determination */ double rSquared = Double.MAX_VALUE; /** variance = sum square diff mean / n - 1 */ double variance = Double.MAX_VALUE; Value(double intercept, double slope, List xs, List ys) { this.intercept = intercept; this.slope = slope; this.xs = xs; this.ys = ys; } public double getIntercept() { return this.intercept; } public double getSlope() { return this.slope; } public double getRSquared() { return this.rSquared; } /** * strength of the correlation * * @param rSquared Strength of the correlation */ public void setRSquared(double rSquared) { this.rSquared = rSquared; } public double getVariance() { return this.variance; } public void setVariance(double variance) { this.variance = variance; } public String toString() { return "LinReg.Value: slope of " + slope + " and an intercept of " + intercept + ". That is, y=" + intercept + (slope > 0.0 ? " +" : " ") + slope + " * x."; } } /** * Definition of the LinRegIntercept MDX function. * *

Synopsis: * *

LinRegIntercept(<Numeric Expression>, * <Set>, <Numeric Expression>[, <Numeric * Expression>])
*/ public static class InterceptFunDef extends LinReg { public InterceptFunDef(FunDef funDef) { super(funDef, Intercept); } } /** * Definition of the LinRegPoint MDX function. * *

Synopsis: * *

LinRegPoint(<Numeric Expression>, * <Set>, <Numeric Expression>[, <Numeric * Expression>])
*/ public static class PointFunDef extends LinReg { public PointFunDef(FunDef funDef) { super(funDef, Point); } public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) { final DoubleCalc xPointCalc = compiler.compileDouble(call.getArg(0)); final ListCalc listCalc = compiler.compileList(call.getArg(1)); final DoubleCalc yCalc = compiler.compileDouble(call.getArg(2)); final DoubleCalc xCalc = call.getArgCount() > 3 ? compiler.compileDouble(call.getArg(3)) : new ValueCalc(call); return new PointCalc( call, xPointCalc, listCalc, yCalc, xCalc); } } private static class PointCalc extends AbstractDoubleCalc { private final DoubleCalc xPointCalc; private final ListCalc listCalc; private final DoubleCalc yCalc; private final DoubleCalc xCalc; public PointCalc( ResolvedFunCall call, DoubleCalc xPointCalc, ListCalc listCalc, DoubleCalc yCalc, DoubleCalc xCalc) { super(call, new Calc[]{xPointCalc, listCalc, yCalc, xCalc}); this.xPointCalc = xPointCalc; this.listCalc = listCalc; this.yCalc = yCalc; this.xCalc = xCalc; } public double evaluateDouble(Evaluator evaluator) { double xPoint = xPointCalc.evaluateDouble(evaluator); Value value = process(evaluator, listCalc, yCalc, xCalc); if (value == null) { return FunUtil.DoubleNull; } // use first arg to generate y position double yPoint = xPoint * value.getSlope() + value.getIntercept(); return yPoint; } } /** * Definition of the LinRegSlope MDX function. * *

Synopsis: * *

LinRegSlope(<Numeric Expression>, * <Set>, <Numeric Expression>[, <Numeric * Expression>])
*/ public static class SlopeFunDef extends LinReg { public SlopeFunDef(FunDef funDef) { super(funDef, Slope); } } /** * Definition of the LinRegR2 MDX function. * *

Synopsis: * *

LinRegR2(<Numeric Expression>, * <Set>, <Numeric Expression>[, <Numeric * Expression>])
*/ public static class R2FunDef extends LinReg { public R2FunDef(FunDef funDef) { super(funDef, R2); } } /** * Definition of the LinRegVariance MDX function. * *

Synopsis: * *

LinRegVariance(<Numeric Expression>, * <Set>, <Numeric Expression>[, <Numeric * Expression>])
*/ public static class VarianceFunDef extends LinReg { public VarianceFunDef(FunDef funDef) { super(funDef, Variance); } } protected static void debug(String type, String msg) { // comment out for no output // RME //System.out.println(type + ": " +msg); } protected LinReg(FunDef funDef, int regType) { super(funDef); this.regType = regType; } protected static LinReg.Value process( Evaluator evaluator, ListCalc listCalc, DoubleCalc yCalc, DoubleCalc xCalc) { final int savepoint = evaluator.savepoint(); TupleList members; try { evaluator.setNonEmpty(false); members = listCalc.evaluateList(evaluator); } finally { evaluator.restore(savepoint); } SetWrapper[] sws; try { sws = evaluateSet( evaluator, members, new DoubleCalc[] {yCalc, xCalc}); } finally { evaluator.restore(savepoint); } SetWrapper swY = sws[0]; SetWrapper swX = sws[1]; if (swY.errorCount > 0) { debug("LinReg.process", "ERROR error(s) count =" + swY.errorCount); // TODO: throw exception return null; } else if (swY.v.size() == 0) { return null; } return linearReg(swX.v, swY.v); } public static LinReg.Value accuracy(LinReg.Value value) { // for variance double sumErrSquared = 0.0; double sumErr = 0.0; // for r2 // data double sumSquaredY = 0.0; double sumY = 0.0; // predicted double sumSquaredYF = 0.0; double sumYF = 0.0; // Obtain the forecast values for this model List yfs = forecast(value); // Calculate the Sum of the Absolute Errors Iterator ity = value.ys.iterator(); Iterator ityf = yfs.iterator(); while (ity.hasNext()) { // Get next data point Double dy = (Double) ity.next(); if (dy == null) { continue; } Double dyf = (Double) ityf.next(); if (dyf == null) { continue; } double y = dy.doubleValue(); double yf = dyf.doubleValue(); // Calculate error in forecast, and update sums appropriately // the y residual or error double error = yf - y; sumErr += error; sumErrSquared += error * error; sumY += y; sumSquaredY += (y * y); sumYF =+ yf; sumSquaredYF =+ (yf * yf); } // Initialize the accuracy indicators int n = value.ys.size(); // Variance // The estimate the value of the error variance is a measure of // variability of the y values about the estimated line. // http://home.ubalt.edu/ntsbarsh/Business-stat/opre504.htm // s2 = SSE/(n-2) = sum (y - yf)2 /(n-2) if (n > 2) { double variance = sumErrSquared / (n - 2); value.setVariance(variance); } // R2 // R2 = 1 - (SSE/SST) // SSE = sum square error = Sum((error-MSE)*(error-MSE)) // MSE = mean error = Sum(error)/n // SST = sum square y diff = Sum((y-MST)*(y-MST)) // MST = mean y = Sum(y)/n double MSE = sumErr / n; double MST = sumY / n; double SSE = 0.0; double SST = 0.0; ity = value.ys.iterator(); ityf = yfs.iterator(); while (ity.hasNext()) { // Get next data point Double dy = (Double) ity.next(); if (dy == null) { continue; } Double dyf = (Double) ityf.next(); if (dyf == null) { continue; } double y = dy.doubleValue(); double yf = dyf.doubleValue(); double error = yf - y; SSE += (error - MSE) * (error - MSE); SST += (y - MST) * (y - MST); } if (SST != 0.0) { double rSquared = 1 - (SSE / SST); value.setRSquared(rSquared); } return value; } public static LinReg.Value linearReg(List xlist, List ylist) { // y and x have same number of points int size = ylist.size(); double sumX = 0.0; double sumY = 0.0; double sumXX = 0.0; double sumXY = 0.0; debug("LinReg.linearReg", "ylist.size()=" + ylist.size()); debug("LinReg.linearReg", "xlist.size()=" + xlist.size()); int n = 0; for (int i = 0; i < size; i++) { Object yo = ylist.get(i); Object xo = xlist.get(i); if ((yo == null) || (xo == null)) { continue; } n++; double y = ((Double) yo).doubleValue(); double x = ((Double) xo).doubleValue(); debug("LinReg.linearReg", " " + i + " (" + x + "," + y + ")"); sumX += x; sumY += y; sumXX += x * x; sumXY += x * y; } double xMean = sumX / n; double yMean = sumY / n; debug("LinReg.linearReg", "yMean=" + yMean); debug( "LinReg.linearReg", "(n*sumXX - sumX*sumX)=" + (n * sumXX - sumX * sumX)); // The regression line is the line that minimizes the variance of the // errors. The mean error is zero; so, this means that it minimizes the // sum of the squares errors. double slope = (n * sumXY - sumX * sumY) / (n * sumXX - sumX * sumX); double intercept = yMean - slope * xMean; LinReg.Value value = new LinReg.Value(intercept, slope, xlist, ylist); debug("LinReg.linearReg", "value=" + value); return value; } public static List forecast(LinReg.Value value) { List yfs = new ArrayList(value.xs.size()); Iterator it = value.xs.iterator(); while (it.hasNext()) { Double d = (Double) it.next(); // If the value is missing we still must put a place // holder in the y axis, otherwise there is a discontinuity // between the data and the fit. if (d == null) { yfs.add(null); } else { double x = d.doubleValue(); double yf = value.intercept + value.slope * x; yfs.add(new Double(yf)); } } return yfs; } private static class LinRegCalc extends AbstractDoubleCalc { private final ListCalc listCalc; private final DoubleCalc yCalc; private final DoubleCalc xCalc; private final int regType; public LinRegCalc( ResolvedFunCall call, ListCalc listCalc, DoubleCalc yCalc, DoubleCalc xCalc, int regType) { super(call, new Calc[]{listCalc, yCalc, xCalc}); this.listCalc = listCalc; this.yCalc = yCalc; this.xCalc = xCalc; this.regType = regType; } public double evaluateDouble(Evaluator evaluator) { Value value = process(evaluator, listCalc, yCalc, xCalc); if (value == null) { return FunUtil.DoubleNull; } switch (regType) { case Intercept: return value.getIntercept(); case Slope: return value.getSlope(); case Variance: return value.getVariance(); case R2: return value.getRSquared(); default: case Point: throw Util.newInternal("unexpected value " + regType); } } } } // End LinReg.java mondrian-3.11.0.1-R/src/main/mondrian/olap/fun/MedianFunDef.java000066400000000000000000000042351261646570300241540ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.olap.fun; import mondrian.calc.*; import mondrian.calc.impl.AbstractDoubleCalc; import mondrian.calc.impl.ValueCalc; import mondrian.mdx.ResolvedFunCall; import mondrian.olap.*; /** * Definition of the Median MDX functions. * * @author jhyde * @since Mar 23, 2006 */ class MedianFunDef extends AbstractAggregateFunDef { static final ReflectiveMultiResolver Resolver = new ReflectiveMultiResolver( "Median", "Median([, ])", "Returns the median value of a numeric expression evaluated over a set.", new String[]{"fnx", "fnxn"}, MedianFunDef.class); public MedianFunDef(FunDef dummyFunDef) { super(dummyFunDef); } public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) { final ListCalc listCalc = compiler.compileList(call.getArg(0)); final Calc calc = call.getArgCount() > 1 ? compiler.compileScalar(call.getArg(1), true) : new ValueCalc(call); return new AbstractDoubleCalc(call, new Calc[] {listCalc, calc}) { public double evaluateDouble(Evaluator evaluator) { final int savepoint = evaluator.savepoint(); try { evaluator.setNonEmpty(false); TupleList list = evaluateCurrentList(listCalc, evaluator); final double percentile = percentile( evaluator, list, calc, 0.5); return percentile; } finally { evaluator.restore(savepoint); } } public boolean dependsOn(Hierarchy hierarchy) { return anyDependsButFirst(getCalcs(), hierarchy); } }; } } // End MedianFunDef.java mondrian-3.11.0.1-R/src/main/mondrian/olap/fun/MemberDimensionFunDef.java000066400000000000000000000025741261646570300260400ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.olap.fun; import mondrian.calc.*; import mondrian.calc.impl.AbstractDimensionCalc; import mondrian.mdx.ResolvedFunCall; import mondrian.olap.*; /** * Definition of the <Measure>.Dimension * MDX builtin function. * * @author jhyde * @since Jul 20, 2009 */ class MemberDimensionFunDef extends FunDefBase { public static final FunDefBase INSTANCE = new MemberDimensionFunDef(); private MemberDimensionFunDef() { super( "Dimension", "Returns the dimension that contains a specified member.", "pdm"); } public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) { final MemberCalc memberCalc = compiler.compileMember(call.getArg(0)); return new AbstractDimensionCalc(call, new Calc[] {memberCalc}) { public Dimension evaluateDimension(Evaluator evaluator) { Member member = memberCalc.evaluateMember(evaluator); return member.getDimension(); } }; } } // End MemberDimensionFunDef.java mondrian-3.11.0.1-R/src/main/mondrian/olap/fun/MemberExtractingVisitor.java000066400000000000000000000117501261646570300265070ustar00rootroot00000000000000/* // This software is subject to the terms of the Eclipse Public License v1.0 // Agreement, available at the following URL: // http://www.eclipse.org/legal/epl-v10.html. // You must accept the terms of that agreement to use this software. // // Copyright (c) 2002-2015 Pentaho Corporation.. All rights reserved. */ package mondrian.olap.fun; import mondrian.mdx.*; import mondrian.olap.*; import mondrian.olap.type.Type; import java.util.*; /** * Visitor which collects any non-measure base members encountered while * traversing an expression. * *

This Visitor is used by the native set classes as well as the crossjoin * optimizer (CrossjoinFunDef.nonEmptyList) to identify members within * an expression which may conflict with members used as a constraint.

* *

If the boolean mapToAllMember is true, then any occurrences of * a Dimension/Hierarchy/Level will result in the corresponding [All] member * being added to the collection. Likewise if a specific member is * visited, the [All] member of it's corresponding hierarchy will be * added.

* *

The mapToAllMember behavior will be used for any subexpression under * one of the functions in the blacklist collection below.

*/ public class MemberExtractingVisitor extends MdxVisitorImpl { private final Set memberSet; private final ResolvedFunCallFinder finder; private final Set activeMembers = new HashSet(); private final ResolvedFunCall call; private final boolean mapToAllMember; /** * This list of functions are "blacklisted" because * occurrence of a member/dim/level/hierarchy within * one of these expressions would result in a set of members * that cannot be determined from the expression itself. */ private static final String[] unsafeFuncNames = new String[] { "Ytd", "Mtd", "Qtd", "Wtd", "BottomCount", "TopCount", "ClosingPeriod", "Cousin", "FirstChild", "FirstSibling", "LastChild", "LastPeriods", "LastSibling", "ParallelPeriod", "PeriodsToDate", "Parent", "PrevMember", "NextMember", "Ancestor", "Ancestors" }; private static final List blacklist = Collections.unmodifiableList( Arrays.asList(unsafeFuncNames)); public MemberExtractingVisitor( Set memberSet, ResolvedFunCall call, boolean mapToAllMember) { this.memberSet = memberSet; this.finder = new ResolvedFunCallFinder(call); this.call = call; this.mapToAllMember = mapToAllMember; } public Object visit(ParameterExpr parameterExpr) { final Parameter parameter = parameterExpr.getParameter(); final Type type = parameter.getType(); if (type instanceof mondrian.olap.type.MemberType) { final Object value = parameter.getValue(); if (value instanceof Member) { final Member member = (Member) value; if (!member.isMeasure() && !member.isCalculated()) { addMember(member); } } else { parameter.getDefaultExp().accept(this); } } return null; } public Object visit(MemberExpr memberExpr) { Member member = memberExpr.getMember(); if (!member.isMeasure() && !member.isCalculated()) { addMember(member); } else if (member.isCalculated()) { if (activeMembers.add(member)) { Exp exp = member.getExpression(); finder.found = false; exp.accept(finder); if (! finder.found) { exp.accept(this); } activeMembers.remove(member); } } return null; } public Object visit(DimensionExpr dimensionExpr) { // add the default hierarchy addToDimMemberSet(dimensionExpr.getDimension().getHierarchy()); return null; } public Object visit(HierarchyExpr hierarchyExpr) { addToDimMemberSet(hierarchyExpr.getHierarchy()); return null; } public Object visit(LevelExpr levelExpr) { addToDimMemberSet(levelExpr.getLevel().getHierarchy()); return null; } public Object visit(ResolvedFunCall funCall) { if (funCall == call) { turnOffVisitChildren(); } else if (blacklist.contains(funCall.getFunName())) { for (Exp arg : funCall.getArgs()) { arg.accept(new MemberExtractingVisitor(memberSet, call, true)); } turnOffVisitChildren(); } return null; } private void addMember(Member member) { if (!mapToAllMember) { memberSet.add(member); } else { memberSet.add(member.getHierarchy().getAllMember()); } } private void addToDimMemberSet(Hierarchy hierarchy) { if (mapToAllMember && !hierarchy.getDimension().isMeasures()) { memberSet.add(hierarchy.getAllMember()); } } } // End MemberExtractingVisitor.java mondrian-3.11.0.1-R/src/main/mondrian/olap/fun/MemberHierarchyFunDef.java000066400000000000000000000030501261646570300260170ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.olap.fun; import mondrian.calc.*; import mondrian.calc.impl.AbstractHierarchyCalc; import mondrian.mdx.ResolvedFunCall; import mondrian.olap.*; /** * Definition of the <Member>.Hierarchy MDX builtin function. * * @author jhyde * @since Mar 23, 2006 */ public class MemberHierarchyFunDef extends FunDefBase { static final MemberHierarchyFunDef instance = new MemberHierarchyFunDef(); private MemberHierarchyFunDef() { super("Hierarchy", "Returns a member's hierarchy.", "phm"); } public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) { final MemberCalc memberCalc = compiler.compileMember(call.getArg(0)); return new CalcImpl(call, memberCalc); } public static class CalcImpl extends AbstractHierarchyCalc { private final MemberCalc memberCalc; public CalcImpl(Exp exp, MemberCalc memberCalc) { super(exp, new Calc[] {memberCalc}); this.memberCalc = memberCalc; } public Hierarchy evaluateHierarchy(Evaluator evaluator) { Member member = memberCalc.evaluateMember(evaluator); return member.getHierarchy(); } } } // End MemberHierarchyFunDef.java mondrian-3.11.0.1-R/src/main/mondrian/olap/fun/MemberLevelFunDef.java000066400000000000000000000033341261646570300251550ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.olap.fun; import mondrian.calc.*; import mondrian.calc.impl.AbstractLevelCalc; import mondrian.mdx.ResolvedFunCall; import mondrian.olap.*; import mondrian.olap.type.LevelType; import mondrian.olap.type.Type; /** * Definition of the <Member>.Level MDX builtin function. * * @author jhyde * @since Mar 23, 2006 */ public class MemberLevelFunDef extends FunDefBase { static final MemberLevelFunDef instance = new MemberLevelFunDef(); private MemberLevelFunDef() { super("Level", "Returns a member's level.", "plm"); } public Type getResultType(Validator validator, Exp[] args) { final Type argType = args[0].getType(); return LevelType.forType(argType); } public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) { final MemberCalc memberCalc = compiler.compileMember(call.getArg(0)); return new CalcImpl(call, memberCalc); } public static class CalcImpl extends AbstractLevelCalc { private final MemberCalc memberCalc; public CalcImpl(Exp exp, MemberCalc memberCalc) { super(exp, new Calc[] {memberCalc}); this.memberCalc = memberCalc; } public Level evaluateLevel(Evaluator evaluator) { Member member = memberCalc.evaluateMember(evaluator); return member.getLevel(); } } } // End MemberLevelFunDef.java mondrian-3.11.0.1-R/src/main/mondrian/olap/fun/MemberOrderKeyFunDef.java000066400000000000000000000036611261646570300256350ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.olap.fun; import mondrian.calc.*; import mondrian.calc.impl.AbstractCalc; import mondrian.mdx.ResolvedFunCall; import mondrian.olap.Evaluator; import mondrian.olap.Exp; /** * Definition of the <Member>.OrderKey MDX builtin * function. * *

Syntax: *

<Member>.OrderKey
* * @author kvu * @since Nov 10, 2008 */ public final class MemberOrderKeyFunDef extends FunDefBase { static final MemberOrderKeyFunDef instance = new MemberOrderKeyFunDef(); /** * Creates the singleton MemberOrderKeyFunDef. */ private MemberOrderKeyFunDef() { super( "OrderKey", "Returns the member order key.", "pvm"); } public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) { final MemberCalc memberCalc = compiler.compileMember(call.getArg(0)); return new CalcImpl(call, memberCalc); } public static class CalcImpl extends AbstractCalc { private final MemberCalc memberCalc; /** * Creates a CalcImpl. * * @param exp Source expression * @param memberCalc Compiled expression to calculate member */ public CalcImpl(Exp exp, MemberCalc memberCalc) { super(exp, new Calc[] {memberCalc}); this.memberCalc = memberCalc; } public OrderKey evaluate(Evaluator evaluator) { return new OrderKey(memberCalc.evaluateMember(evaluator)); } protected String getName() { return "OrderKey"; } } } // End MemberOrderKeyFunDef.java mondrian-3.11.0.1-R/src/main/mondrian/olap/fun/MinMaxFunDef.java000066400000000000000000000051431261646570300241470ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.olap.fun; import mondrian.calc.*; import mondrian.calc.impl.AbstractDoubleCalc; import mondrian.calc.impl.ValueCalc; import mondrian.mdx.ResolvedFunCall; import mondrian.olap.*; /** * Definition of the Min and Max MDX functions. * * @author jhyde * @since Mar 23, 2006 */ class MinMaxFunDef extends AbstractAggregateFunDef { static final ReflectiveMultiResolver MinResolver = new ReflectiveMultiResolver( "Min", "Min([, ])", "Returns the minimum value of a numeric expression evaluated over a set.", new String[]{"fnx", "fnxn"}, MinMaxFunDef.class); static final MultiResolver MaxResolver = new ReflectiveMultiResolver( "Max", "Max([, ])", "Returns the maximum value of a numeric expression evaluated over a set.", new String[]{"fnx", "fnxn"}, MinMaxFunDef.class); private final boolean max; public MinMaxFunDef(FunDef dummyFunDef) { super(dummyFunDef); this.max = dummyFunDef.getName().equals("Max"); } public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) { final ListCalc listCalc = compiler.compileList(call.getArg(0)); final Calc calc = call.getArgCount() > 1 ? compiler.compileScalar(call.getArg(1), true) : new ValueCalc(call); return new AbstractDoubleCalc(call, new Calc[] {listCalc, calc}) { public double evaluateDouble(Evaluator evaluator) { TupleList memberList = evaluateCurrentList(listCalc, evaluator); final int savepoint = evaluator.savepoint(); try { evaluator.setNonEmpty(false); final Double d = (Double) (max ? max(evaluator, memberList, calc) : min(evaluator, memberList, calc)); return d; } finally { evaluator.restore(savepoint); } } public boolean dependsOn(Hierarchy hierarchy) { return anyDependsButFirst(getCalcs(), hierarchy); } }; } } // End MinMaxFunDef.java mondrian-3.11.0.1-R/src/main/mondrian/olap/fun/MondrianEvaluationException.java000066400000000000000000000013031261646570300273360ustar00rootroot00000000000000/* // This software is subject to the terms of the Eclipse Public License v1.0 // Agreement, available at the following URL: // http://www.eclipse.org/legal/epl-v10.html. // You must accept the terms of that agreement to use this software. // // Copyright (C) 2002-2005 Julian Hyde // Copyright (C) 2005-2005 Pentaho and others // All Rights Reserved. */ package mondrian.olap.fun; /** * Thrown while evaluating a cell expression * * @author jhyde, 14 June, 2002 */ public class MondrianEvaluationException extends RuntimeException { public MondrianEvaluationException() { } public MondrianEvaluationException(String s) { super(s); } } // End MondrianEvaluationException.java mondrian-3.11.0.1-R/src/main/mondrian/olap/fun/MultiResolver.java000066400000000000000000000077561261646570300245160ustar00rootroot00000000000000/* // This software is subject to the terms of the Eclipse Public License v1.0 // Agreement, available at the following URL: // http://www.eclipse.org/legal/epl-v10.html. // You must accept the terms of that agreement to use this software. // // Copyright (C) 2002-2005 Julian Hyde and others // Copyright (C) 2005-2011 Pentaho and others // All Rights Reserved. */ package mondrian.olap.fun; import mondrian.olap.*; import java.util.List; /** * A MultiResolver considers several overloadings of the same * function. If one of these overloadings matches the actual arguments, it * calls the factory method {@link #createFunDef}. * * @author jhyde * @since Feb 12, 2003 */ public abstract class MultiResolver extends FunUtil implements Resolver { private final String name; private final String signature; private final String description; private final String[] signatures; private final Syntax syntax; /** * Creates a MultiResolver. * * @param name Name of function or operator * @param signature Signature of function or operator * @param description Description of function or operator * @param signatures Array of possible signatures, each of which is an * encoding of the syntactic type, return type, and parameter * types of this operator. The "Members" operator has a syntactic * type "pxd" which means "an operator with * {@link Syntax#Property property} syntax (p) which returns a set * (x) and takes a dimension (d) as its argument". * See {@link FunUtil#decodeSyntacticType(String)}, * {@link FunUtil#decodeReturnCategory(String)}, * {@link FunUtil#decodeParameterCategories(String)}. */ protected MultiResolver( String name, String signature, String description, String[] signatures) { this.name = name; this.signature = signature; this.description = description; this.signatures = signatures; Util.assertTrue(signatures.length > 0); this.syntax = decodeSyntacticType(signatures[0]); for (int i = 1; i < signatures.length; i++) { Util.assertTrue(decodeSyntacticType(signatures[i]) == syntax); } } public String getName() { return name; } public String getDescription() { return description; } public String getSignature() { return signature; } public Syntax getSyntax() { return syntax; } public String[] getReservedWords() { return emptyStringArray; } public String[] getSignatures() { return signatures; } public FunDef getFunDef() { return null; } public FunDef resolve( Exp[] args, Validator validator, List conversions) { outer: for (String signature : signatures) { int[] parameterTypes = decodeParameterCategories(signature); if (parameterTypes.length != args.length) { continue; } conversions.clear(); for (int i = 0; i < args.length; i++) { if (!validator.canConvert( i, args[i], parameterTypes[i], conversions)) { continue outer; } } int returnType = decodeReturnCategory(signature); FunDef dummy = createDummyFunDef(this, returnType, args); return createFunDef(args, dummy); } return null; } public boolean requiresExpression(int k) { for (String signature : signatures) { int[] parameterTypes = decodeParameterCategories(signature); if ((k < parameterTypes.length) && parameterTypes[k] == Category.Set) { return false; } } return true; } protected abstract FunDef createFunDef(Exp[] args, FunDef dummyFunDef); } // End MultiResolver.java mondrian-3.11.0.1-R/src/main/mondrian/olap/fun/NamedSetCurrentFunDef.java000066400000000000000000000042751261646570300260260ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.olap.fun; import mondrian.calc.Calc; import mondrian.calc.ExpCompiler; import mondrian.calc.impl.AbstractMemberCalc; import mondrian.calc.impl.AbstractTupleCalc; import mondrian.mdx.NamedSetExpr; import mondrian.mdx.ResolvedFunCall; import mondrian.olap.*; import mondrian.resource.MondrianResource; /** * Definition of the <Named Set>.Current MDX * builtin function. * * @author jhyde * @since Oct 19, 2008 */ public class NamedSetCurrentFunDef extends FunDefBase { static final NamedSetCurrentFunDef instance = new NamedSetCurrentFunDef(); private NamedSetCurrentFunDef() { super( "Current", "Returns the current member or tuple of a named set.", "ptx"); } public Exp createCall(Validator validator, Exp[] args) { assert args.length == 1; final Exp arg0 = args[0]; if (!(arg0 instanceof NamedSetExpr)) { throw MondrianResource.instance().NotANamedSet.ex(); } return super.createCall(validator, args); } public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) { final Exp arg0 = call.getArg(0); assert arg0 instanceof NamedSetExpr : "checked this in createCall"; final NamedSetExpr namedSetExpr = (NamedSetExpr) arg0; if (arg0.getType().getArity() == 1) { return new AbstractMemberCalc(call, new Calc[0]) { public Member evaluateMember(Evaluator evaluator) { return namedSetExpr.getEval(evaluator).currentMember(); } }; } else { return new AbstractTupleCalc(call, new Calc[0]) { public Member[] evaluateTuple(Evaluator evaluator) { return namedSetExpr.getEval(evaluator).currentTuple(); } }; } } } // End NamedSetCurrentFunDef.java mondrian-3.11.0.1-R/src/main/mondrian/olap/fun/NamedSetCurrentOrdinalFunDef.java000066400000000000000000000036041261646570300273320ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.olap.fun; import mondrian.calc.Calc; import mondrian.calc.ExpCompiler; import mondrian.calc.impl.AbstractIntegerCalc; import mondrian.mdx.NamedSetExpr; import mondrian.mdx.ResolvedFunCall; import mondrian.olap.*; import mondrian.resource.MondrianResource; /** * Definition of the <Named Set>.CurrentOrdinal MDX builtin * function. * * @author jhyde * @since Oct 19, 2008 */ public class NamedSetCurrentOrdinalFunDef extends FunDefBase { static final NamedSetCurrentOrdinalFunDef instance = new NamedSetCurrentOrdinalFunDef(); private NamedSetCurrentOrdinalFunDef() { super( "CurrentOrdinal", "Returns the ordinal of the current iteration through a named set.", "pix"); } public Exp createCall(Validator validator, Exp[] args) { assert args.length == 1; final Exp arg0 = args[0]; if (!(arg0 instanceof NamedSetExpr)) { throw MondrianResource.instance().NotANamedSet.ex(); } return super.createCall(validator, args); } public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) { final Exp arg0 = call.getArg(0); assert arg0 instanceof NamedSetExpr : "checked this in createCall"; final NamedSetExpr namedSetExpr = (NamedSetExpr) arg0; return new AbstractIntegerCalc(call, new Calc[0]) { public int evaluateInteger(Evaluator evaluator) { return namedSetExpr.getEval(evaluator).currentOrdinal(); } }; } } // End NamedSetCurrentOrdinalFunDef.java mondrian-3.11.0.1-R/src/main/mondrian/olap/fun/NativizeSetFunDef.java000066400000000000000000001522661261646570300252340ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.olap.fun; import mondrian.calc.*; import mondrian.calc.impl.AbstractListCalc; import mondrian.calc.impl.DelegatingTupleList; import mondrian.mdx.*; import mondrian.olap.*; import mondrian.olap.type.Type; import mondrian.resource.MondrianResource; import org.apache.log4j.Logger; import org.olap4j.impl.Olap4jUtil; import java.util.*; import static mondrian.olap.fun.NativizeSetFunDef.NativeElementType.*; /** * Definition of the NativizeSet MDX function. * * @author jrand * @since Oct 14, 2009 */ public class NativizeSetFunDef extends FunDefBase { /* * Static final fields. */ protected static final Logger LOGGER = Logger.getLogger(NativizeSetFunDef.class); private static final String SENTINEL_PREFIX = "_Nativized_Sentinel_"; private static final String MEMBER_NAME_PREFIX = "_Nativized_Member_"; private static final String SET_NAME_PREFIX = "_Nativized_Set_"; private static final List> functionWhitelist = Arrays.>asList( CacheFunDef.class, SetFunDef.class, CrossJoinFunDef.class, NativizeSetFunDef.class); static final ReflectiveMultiResolver Resolver = new ReflectiveMultiResolver( "NativizeSet", "NativizeSet()", "Tries to natively evaluate .", new String[] {"fxx"}, NativizeSetFunDef.class); /* * Instance final fields. */ private final SubstitutionMap substitutionMap = new SubstitutionMap(); private final HashSet dimensions = new LinkedHashSet(); private boolean isFirstCompileCall = true; /* * Instance non-final fields. */ private Exp originalExp; private static final String ESTIMATE_MESSAGE = "isHighCardinality=%b: estimate=%,d threshold=%,d"; private static final String PARTIAL_ESTIMATE_MESSAGE = "isHighCardinality=%b: partial estimate=%,d threshold=%,d"; public NativizeSetFunDef(FunDef dummyFunDef) { super(dummyFunDef); LOGGER.debug("---- NativizeSetFunDef constructor"); } public Exp createCall(Validator validator, Exp[] args) { LOGGER.debug("NativizeSetFunDef createCall"); ResolvedFunCall call = (ResolvedFunCall) super.createCall(validator, args); call.accept(new FindLevelsVisitor(substitutionMap, dimensions)); return call; } public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) { LOGGER.debug("NativizeSetFunDef compileCall"); Exp funArg = call.getArg(0); if (MondrianProperties.instance().UseAggregates.get() || MondrianProperties.instance().ReadAggregates.get()) { return funArg.accept(compiler); } final Calc[] calcs = {compiler.compileList(funArg, true)}; final int arity = calcs[0].getType().getArity(); assert arity >= 0; if (arity == 1 || substitutionMap.isEmpty()) { IterCalc calc = (IterCalc) funArg.accept(compiler); final boolean highCardinality = arity == 1 && isHighCardinality(funArg, compiler.getEvaluator()); if (calc == null) { // This can happen under JDK1.4: caller wants iterator // implementation, but compiler can only provide list. // Fall through and use native. } else if (calc instanceof ListCalc) { return new NonNativeListCalc((ListCalc) calc, highCardinality); } else { return new NonNativeIterCalc(calc, highCardinality); } } if (isFirstCompileCall) { isFirstCompileCall = false; originalExp = funArg.clone(); Query query = compiler.getEvaluator().getQuery(); call.accept( new AddFormulasVisitor(query, substitutionMap, dimensions)); call.accept(new TransformToFormulasVisitor(query)); query.resolve(); } return new NativeListCalc( call, calcs, compiler, substitutionMap, originalExp); } private boolean isHighCardinality(Exp funArg, Evaluator evaluator) { Level level = findLevel(funArg); if (level != null) { int cardinality = evaluator.getSchemaReader() .getLevelCardinality(level, false, true); final int minThreshold = MondrianProperties.instance() .NativizeMinThreshold.get(); final boolean isHighCard = cardinality > minThreshold; logHighCardinality( ESTIMATE_MESSAGE, minThreshold, cardinality, isHighCard); return isHighCard; } return false; } private Level findLevel(Exp exp) { exp.accept(new FindLevelsVisitor(substitutionMap, dimensions)); final Collection levels = substitutionMap.values(); if (levels.size() == 1) { return levels.iterator().next(); } return null; } private static void logHighCardinality( final String estimateMessage, long nativizeMinThreshold, long estimatedCardinality, boolean highCardinality) { LOGGER.debug( String.format( estimateMessage, highCardinality, estimatedCardinality, nativizeMinThreshold)); } static class NonNativeCalc implements Calc { final Calc parent; final boolean nativeEnabled; protected NonNativeCalc(Calc parent, final boolean nativeEnabled) { assert parent != null; this.parent = parent; this.nativeEnabled = nativeEnabled; } public Object evaluate(final Evaluator evaluator) { evaluator.setNativeEnabled(nativeEnabled); return parent.evaluate(evaluator); } public boolean dependsOn(final Hierarchy hierarchy) { return parent.dependsOn(hierarchy); } public Type getType() { return parent.getType(); } public void accept(final CalcWriter calcWriter) { parent.accept(calcWriter); } public ResultStyle getResultStyle() { return parent.getResultStyle(); } /** * {@inheritDoc} * * Default implementation just does 'instanceof TargetClass'. Subtypes * that are wrappers should override. */ public boolean isWrapperFor(Class iface) { return iface.isInstance(this); } /** * {@inheritDoc} * * Default implementation just casts to TargetClass. * Subtypes that are wrappers should override. */ public T unwrap(Class iface) { return iface.cast(this); } } static class NonNativeIterCalc extends NonNativeCalc implements IterCalc { protected NonNativeIterCalc(IterCalc parent, boolean highCardinality) { super(parent, highCardinality); } IterCalc parent() { return (IterCalc) parent; } public TupleIterable evaluateIterable(Evaluator evaluator) { evaluator.setNativeEnabled(nativeEnabled); return parent().evaluateIterable(evaluator); } } static class NonNativeListCalc extends NonNativeCalc implements ListCalc { protected NonNativeListCalc(ListCalc parent, boolean highCardinality) { super(parent, highCardinality); } ListCalc parent() { return (ListCalc) parent; } public TupleList evaluateList(Evaluator evaluator) { evaluator.setNativeEnabled(nativeEnabled); return parent().evaluateList(evaluator); } public TupleIterable evaluateIterable(Evaluator evaluator) { return evaluateList(evaluator); } } public static class NativeListCalc extends AbstractListCalc { private final SubstitutionMap substitutionMap; private final ListCalc simpleCalc; private final ExpCompiler compiler; private final Exp originalExp; protected NativeListCalc( ResolvedFunCall call, Calc[] calcs, ExpCompiler compiler, SubstitutionMap substitutionMap, Exp originalExp) { super(call, calcs); LOGGER.debug("---- NativeListCalc constructor"); this.substitutionMap = substitutionMap; this.simpleCalc = (ListCalc) calcs[0]; this.compiler = compiler; this.originalExp = originalExp; } public TupleList evaluateList(Evaluator evaluator) { return computeTuples(evaluator); } public TupleList computeTuples(Evaluator evaluator) { TupleList simplifiedList = evaluateSimplifiedList(evaluator); if (simplifiedList.isEmpty()) { return simplifiedList; } if (!isHighCardinality(evaluator, simplifiedList)) { return evaluateNonNative(evaluator); } return evaluateNative(evaluator, simplifiedList); } private TupleList evaluateSimplifiedList(Evaluator evaluator) { final int savepoint = evaluator.savepoint(); try { evaluator.setNonEmpty(false); evaluator.setNativeEnabled(false); TupleList simplifiedList = simpleCalc.evaluateList(evaluator); dumpListToLog("simplified list", simplifiedList); return simplifiedList; } finally { evaluator.restore(savepoint); } } private TupleList evaluateNonNative(Evaluator evaluator) { LOGGER.debug( "Disabling native evaluation. originalExp=" + originalExp); ListCalc calc = compiler.compileList(getOriginalExp(evaluator.getQuery())); final int savepoint = evaluator.savepoint(); try { evaluator.setNonEmpty(true); evaluator.setNativeEnabled(false); TupleList members = calc.evaluateList(evaluator); return members; } finally { evaluator.restore(savepoint); } } private TupleList evaluateNative( Evaluator evaluator, TupleList simplifiedList) { CrossJoinAnalyzer analyzer = new CrossJoinAnalyzer(simplifiedList, substitutionMap); String crossJoin = analyzer.getCrossJoinExpression(); // If the crossjoin expression is empty, then the simplified list // already contains the fully evaluated tuple list, so we can // return it now without any additional work. if (crossJoin.length() == 0) { return simplifiedList; } // Force non-empty to true to create the native list. LOGGER.debug( "crossjoin reconstituted from simplified list: " + String.format( "%n" + crossJoin.replaceAll(",", "%n, "))); final int savepoint = evaluator.savepoint(); try { evaluator.setNonEmpty(true); evaluator.setNativeEnabled(true); TupleList members = analyzer.mergeCalcMembers( evaluateJoinExpression(evaluator, crossJoin)); return members; } finally { evaluator.restore(savepoint); } } private Exp getOriginalExp(final Query query) { originalExp.accept( new TransformFromFormulasVisitor(query, compiler)); if (originalExp instanceof NamedSetExpr) { //named sets get their evaluator cached in RolapResult. //We do not want to use the cached evaluator, so pass along the //expression instead. return ((NamedSetExpr) originalExp).getNamedSet().getExp(); } return originalExp; } private boolean isHighCardinality( Evaluator evaluator, TupleList simplifiedList) { Util.assertTrue(!simplifiedList.isEmpty()); SchemaReader schema = evaluator.getSchemaReader(); List tuple = simplifiedList.get(0); long nativizeMinThreshold = MondrianProperties.instance().NativizeMinThreshold.get(); long estimatedCardinality = simplifiedList.size(); for (Member member : tuple) { String memberName = member.getName(); if (memberName.startsWith(MEMBER_NAME_PREFIX)) { Level level = member.getLevel(); Dimension dimension = level.getDimension(); Hierarchy hierarchy = dimension.getHierarchy(); String levelName = getLevelNameFromMemberName(memberName); Level hierarchyLevel = Util.lookupHierarchyLevel(hierarchy, levelName); long levelCardinality = getLevelCardinality(schema, hierarchyLevel); estimatedCardinality *= levelCardinality; if (estimatedCardinality >= nativizeMinThreshold) { logHighCardinality( PARTIAL_ESTIMATE_MESSAGE, nativizeMinThreshold, estimatedCardinality, true); return true; } } } boolean isHighCardinality = (estimatedCardinality >= nativizeMinThreshold); logHighCardinality( ESTIMATE_MESSAGE, nativizeMinThreshold, estimatedCardinality, isHighCardinality); return isHighCardinality; } private long getLevelCardinality(SchemaReader schema, Level level) { if (cardinalityIsKnown(level)) { return level.getApproxRowCount(); } return schema.getLevelCardinality(level, false, true); } private boolean cardinalityIsKnown(Level level) { return level.getApproxRowCount() > 0; } private TupleList evaluateJoinExpression( Evaluator evaluator, String crossJoinExpression) { Exp unresolved = evaluator.getQuery().getConnection() .parseExpression(crossJoinExpression); Exp resolved = compiler.getValidator().validate(unresolved, false); ListCalc calc = compiler.compileList(resolved); return calc.evaluateList(evaluator); } } static class FindLevelsVisitor extends MdxVisitorImpl { private final SubstitutionMap substitutionMap; private final Set dimensions; public FindLevelsVisitor( SubstitutionMap substitutionMap, HashSet dimensions) { this.substitutionMap = substitutionMap; this.dimensions = dimensions; } @Override public Object visit(ResolvedFunCall call) { if (call.getFunDef() instanceof LevelMembersFunDef) { if (call.getArg(0) instanceof LevelExpr) { Level level = ((LevelExpr) call.getArg(0)).getLevel(); substitutionMap.put(createMemberId(level), level); dimensions.add(level.getDimension()); } } else if ( functionWhitelist.contains(call.getFunDef().getClass())) { for (Exp arg : call.getArgs()) { arg.accept(this); } } turnOffVisitChildren(); return null; } @Override public Object visit(MemberExpr member) { dimensions.add(member.getMember().getDimension()); return null; } } static class AddFormulasVisitor extends MdxVisitorImpl { private final Query query; private final Collection levels; private final Set dimensions; public AddFormulasVisitor( Query query, SubstitutionMap substitutionMap, Set dimensions) { LOGGER.debug("---- AddFormulasVisitor constructor"); this.query = query; this.levels = substitutionMap.values(); this.dimensions = dimensions; } @Override public Object visit(ResolvedFunCall call) { if (call.getFunDef() instanceof NativizeSetFunDef) { addFormulasToQuery(); } turnOffVisitChildren(); return null; } private void addFormulasToQuery() { LOGGER.debug("FormulaResolvingVisitor addFormulas"); List formulas = new ArrayList(); for (Level level : levels) { Formula memberFormula = createDefaultMemberFormula(level); formulas.add(memberFormula); formulas.add(createNamedSetFormula(level, memberFormula)); } for (Dimension dim : dimensions) { Level level = dim.getHierarchy().getLevels()[0]; formulas.add(createSentinelFormula(level)); } query.addFormulas(formulas.toArray(new Formula[formulas.size()])); } private Formula createSentinelFormula(Level level) { Id memberId = createSentinelId(level); Exp memberExpr = query.getConnection() .parseExpression("101010"); LOGGER.debug( "createSentinelFormula memberId=" + memberId + " memberExpr=" + memberExpr); return new Formula(memberId, memberExpr, new MemberProperty[0]); } private Formula createDefaultMemberFormula(Level level) { Id memberId = createMemberId(level); Exp memberExpr = new UnresolvedFunCall( "DEFAULTMEMBER", Syntax.Property, new Exp[] {hierarchyId(level)}); LOGGER.debug( "createLevelMembersFormulas memberId=" + memberId + " memberExpr=" + memberExpr); return new Formula(memberId, memberExpr, new MemberProperty[0]); } private Formula createNamedSetFormula( Level level, Formula memberFormula) { Id setId = createSetId(level); Exp setExpr = query.getConnection() .parseExpression( "{" + memberFormula.getIdentifier().toString() + "}"); LOGGER.debug( "createNamedSetFormula setId=" + setId + " setExpr=" + setExpr); return new Formula(setId, setExpr); } } static class TransformToFormulasVisitor extends MdxVisitorImpl { private final Query query; public TransformToFormulasVisitor(Query query) { LOGGER.debug("---- TransformToFormulasVisitor constructor"); this.query = query; } @Override public Object visit(ResolvedFunCall call) { LOGGER.debug("visit " + call); Object result = null; if (call.getFunDef() instanceof LevelMembersFunDef) { result = replaceLevelMembersReferences(call); } else if ( functionWhitelist.contains(call.getFunDef().getClass())) { result = visitCallArguments(call); } turnOffVisitChildren(); return result; } private Object replaceLevelMembersReferences(ResolvedFunCall call) { LOGGER.debug("replaceLevelMembersReferences " + call); Level level = ((LevelExpr) call.getArg(0)).getLevel(); Id setId = createSetId(level); Formula formula = query.findFormula(setId.toString()); Exp exp = Util.createExpr(formula.getNamedSet()); return query.createValidator().validate(exp, false); } private Object visitCallArguments(ResolvedFunCall call) { Exp[] exps = call.getArgs(); LOGGER.debug("visitCallArguments " + call); for (int i = 0; i < exps.length; i++) { Exp transformedExp = (Exp) exps[i].accept(this); if (transformedExp != null) { exps[i] = transformedExp; } } if (exps.length > 1 && call.getFunDef() instanceof SetFunDef) { return flattenSetFunDef(call); } return null; } private Object flattenSetFunDef(ResolvedFunCall call) { List newArgs = new ArrayList(); flattenSetMembers(newArgs, call.getArgs()); addSentinelMembers(newArgs); if (newArgs.size() != call.getArgCount()) { return new ResolvedFunCall( call.getFunDef(), newArgs.toArray(new Exp[newArgs.size()]), call.getType()); } return null; } private void flattenSetMembers(List result, Exp[] args) { for (Exp arg : args) { if (arg instanceof ResolvedFunCall && ((ResolvedFunCall)arg).getFunDef() instanceof SetFunDef) { flattenSetMembers(result, ((ResolvedFunCall)arg).getArgs()); } else { result.add(arg); } } } private void addSentinelMembers(List args) { Exp prev = args.get(0); for (int i = 1; i < args.size(); i++) { Exp curr = args.get(i); if (prev.toString().equals(curr.toString())) { OlapElement element = null; if (curr instanceof NamedSetExpr) { element = ((NamedSetExpr) curr).getNamedSet(); } else if (curr instanceof MemberExpr) { element = ((MemberExpr) curr).getMember(); } if (element != null) { Level level = element.getHierarchy().getLevels()[0]; Id memberId = createSentinelId(level); Formula formula = query.findFormula(memberId.toString()); args.add(i++, Util.createExpr(formula.getMdxMember())); } } prev = curr; } } } static class TransformFromFormulasVisitor extends MdxVisitorImpl { private final Query query; private final ExpCompiler compiler; public TransformFromFormulasVisitor(Query query, ExpCompiler compiler) { LOGGER.debug("---- TransformFromFormulasVisitor constructor"); this.query = query; this.compiler = compiler; } @Override public Object visit(ResolvedFunCall call) { LOGGER.debug("visit " + call); Object result; result = visitCallArguments(call); turnOffVisitChildren(); return result; } @Override public Object visit(NamedSetExpr namedSetExpr) { String exprName = namedSetExpr.getNamedSet().getName(); Exp membersExpr; if (exprName.contains(SET_NAME_PREFIX)) { String levelMembers = exprName.replaceAll( SET_NAME_PREFIX, "\\[") .replaceAll("_$", "\\]") .replaceAll("_", "\\]\\.\\[") + ".members"; membersExpr = query.getConnection().parseExpression(levelMembers); membersExpr = compiler.getValidator().validate(membersExpr, false); } else { membersExpr = namedSetExpr.getNamedSet().getExp(); } return membersExpr; } private Object visitCallArguments(ResolvedFunCall call) { Exp[] exps = call.getArgs(); LOGGER.debug("visitCallArguments " + call); for (int i = 0; i < exps.length; i++) { Exp transformedExp = (Exp) exps[i].accept(this); if (transformedExp != null) { exps[i] = transformedExp; } } return null; } } private static class SubstitutionMap { private final Map map = new HashMap(); public boolean isEmpty() { return map.isEmpty(); } public boolean contains(Member member) { return map.containsKey(toKey(member)); } public Level get(Member member) { return map.get(toKey(member)); } public Level put(Id id, Level level) { return map.put(toKey(id), level); } public Collection values() { return map.values(); } @Override public String toString() { return map.toString(); } private String toKey(Id id) { return id.toString(); } private String toKey(Member member) { return member.getUniqueName(); } } public static class CrossJoinAnalyzer { private final int arity; private final Member[] tempTuple; private final List tempTupleAsList; private final int[] nativeIndices; private final int resultLimit; private final List> nativeMembers; private final ReassemblyGuide reassemblyGuide; private final TupleList resultList; public CrossJoinAnalyzer( TupleList simplifiedList, SubstitutionMap substitutionMap) { long nativizeMaxResults = MondrianProperties.instance().NativizeMaxResults.get(); arity = simplifiedList.getArity(); tempTuple = new Member[arity]; tempTupleAsList = Arrays.asList(tempTuple); resultLimit = nativizeMaxResults <= 0 ? Integer.MAX_VALUE : (int) Math.min(nativizeMaxResults, Integer.MAX_VALUE); resultList = TupleCollections.createList(arity); reassemblyGuide = classifyMembers(simplifiedList, substitutionMap); nativeMembers = findNativeMembers(); nativeIndices = findNativeIndices(); } public ReassemblyGuide classifyMembers( TupleList simplifiedList, SubstitutionMap substitutionMap) { ReassemblyGuide guide = new ReassemblyGuide(0); List cmdTuple = new ArrayList(arity); for (List srcTuple : simplifiedList) { cmdTuple.clear(); for (Member mbr : srcTuple) { cmdTuple.add(zz(substitutionMap, mbr)); } guide.addCommandTuple(cmdTuple); } return guide; } private ReassemblyCommand zz( SubstitutionMap substitutionMap, Member mbr) { ReassemblyCommand c; if (substitutionMap.contains(mbr)) { c = new ReassemblyCommand( substitutionMap.get(mbr), LEVEL_MEMBERS); } else if (mbr.getName().startsWith(SENTINEL_PREFIX)) { c = new ReassemblyCommand(mbr, SENTINEL); } else { NativeElementType nativeType = !isNativeCompatible(mbr) ? NON_NATIVE : mbr.getMemberType() == Member.MemberType.REGULAR ? ENUMERATED_VALUE : OTHER_NATIVE; c = new ReassemblyCommand(mbr, nativeType); } return c; } private List> findNativeMembers() { List> nativeMembers = new ArrayList>(arity); for (int i = 0; i < arity; i++) { nativeMembers.add(new LinkedHashSet()); } findNativeMembers(reassemblyGuide, nativeMembers); return nativeMembers; } private void findNativeMembers( ReassemblyGuide guide, List> nativeMembers) { List commands = guide.getCommands(); Set typesToAdd = ReassemblyCommand.getMemberTypes(commands); if (typesToAdd.contains(LEVEL_MEMBERS)) { typesToAdd.remove(ENUMERATED_VALUE); } int index = guide.getIndex(); for (ReassemblyCommand command : commands) { NativeElementType type = command.getMemberType(); if (type.isNativeCompatible() && typesToAdd.contains(type)) { nativeMembers.get(index).add(command.getElementName()); } if (command.hasNextGuide()) { findNativeMembers(command.forNextCol(), nativeMembers); } } } private int[] findNativeIndices() { int[] indices = new int[arity]; int nativeColCount = 0; for (int i = 0; i < arity; i++) { Collection natives = nativeMembers.get(i); if (!natives.isEmpty()) { indices[nativeColCount++] = i; } } if (nativeColCount == arity) { return indices; } int[] result = new int[nativeColCount]; System.arraycopy(indices, 0, result, 0, nativeColCount); return result; } private boolean isNativeCompatible(Member member) { return member.isParentChildLeaf() || (!member.isMeasure() && !member.isCalculated() && !member.isAll()); } private String getCrossJoinExpression() { return formatCrossJoin(nativeMembers); } private String formatCrossJoin(List> memberLists) { StringBuilder buf = new StringBuilder(); String left = toCsv(memberLists.get(0)); String right = memberLists.size() == 1 ? "" : formatCrossJoin(memberLists.subList(1, memberLists.size())); if (left.length() == 0) { buf.append(right); } else { if (right.length() == 0) { buf.append("{").append(left).append("}"); } else { buf.append("CrossJoin(") .append("{").append(left).append("},") .append(right).append(")"); } } return buf.toString(); } private TupleList mergeCalcMembers(TupleList nativeValues) { TupleList nativeList = adaptList(nativeValues, arity, nativeIndices); dumpListToLog("native list", nativeList); mergeCalcMembers(reassemblyGuide, new Range(nativeList), null); dumpListToLog("result list", resultList); return resultList; } private void mergeCalcMembers( ReassemblyGuide guide, Range range, Set> history) { int col = guide.getIndex(); if (col == arity - 1) { if (history == null) { appendMembers(guide, range); } else { appendMembers(guide, range, history); } return; } for (ReassemblyCommand command : guide.getCommands()) { ReassemblyGuide nextGuide = command.forNextCol(); tempTuple[col] = null; switch (command.getMemberType()) { case NON_NATIVE: tempTuple[col] = command.getMember(); mergeCalcMembers( nextGuide, range, (history == null ? new HashSet>() : history)); break; case ENUMERATED_VALUE: Member value = command.getMember(); Range valueRange = range.subRangeForValue(value, col); if (!valueRange.isEmpty()) { mergeCalcMembers(nextGuide, valueRange, history); } break; case LEVEL_MEMBERS: Level level = command.getLevel(); Range levelRange = range.subRangeForValue(level, col); for (Range subRange : levelRange.subRanges(col)) { mergeCalcMembers(nextGuide, subRange, history); } break; case OTHER_NATIVE: for (Range subRange : range.subRanges(col)) { mergeCalcMembers(nextGuide, subRange, history); } break; default: throw Util.unexpected(command.getMemberType()); } } } private void appendMembers(ReassemblyGuide guide, Range range) { int col = guide.getIndex(); for (ReassemblyCommand command : guide.getCommands()) { switch (command.getMemberType()) { case NON_NATIVE: tempTuple[col] = command.getMember(); appendTuple(range.getTuple(), tempTupleAsList); break; case ENUMERATED_VALUE: Member value = command.getMember(); Range valueRange = range.subRangeForValue(value, col); if (!valueRange.isEmpty()) { appendTuple(valueRange.getTuple()); } break; case LEVEL_MEMBERS: case OTHER_NATIVE: for (List tuple : range.getTuples()) { appendTuple(tuple); } break; default: throw Util.unexpected(command.getMemberType()); } } } private void appendMembers( ReassemblyGuide guide, Range range, Set> history) { int col = guide.getIndex(); for (ReassemblyCommand command : guide.getCommands()) { switch (command.getMemberType()) { case NON_NATIVE: tempTuple[col] = command.getMember(); if (range.isEmpty()) { appendTuple(tempTupleAsList, history); } else { appendTuple(range.getTuple(), tempTupleAsList, history); } break; case ENUMERATED_VALUE: Member value = command.getMember(); Range valueRange = range.subRangeForValue(value, col); if (!valueRange.isEmpty()) { appendTuple( valueRange.getTuple(), tempTupleAsList, history); } break; case LEVEL_MEMBERS: case OTHER_NATIVE: tempTuple[col] = null; for (List tuple : range.getTuples()) { appendTuple(tuple, tempTupleAsList, history); } break; default: throw Util.unexpected(command.getMemberType()); } } } private void appendTuple( List nonNatives, Set> history) { if (history.add(nonNatives)) { appendTuple(nonNatives); } } private void appendTuple( List natives, List nonNatives, Set> history) { List copy = copyOfTuple(natives, nonNatives); if (history.add(copy)) { appendTuple(copy); } } private void appendTuple( List natives, List nonNatives) { appendTuple(copyOfTuple(natives, nonNatives)); } private void appendTuple(List tuple) { resultList.add(tuple); checkNativeResultLimit(resultList.size()); } private List copyOfTuple( List natives, List nonNatives) { Member[] copy = new Member[arity]; for (int i = 0; i < arity; i++) { copy[i] = (nonNatives.get(i) == null) ? natives.get(i) : nonNatives.get(i); } return Arrays.asList(copy); } /** * Check the resultSize against the result limit setting. Throws * LimitExceededDuringCrossjoin exception if limit exceeded. *

* It didn't seem appropriate to use the existing Mondrian * ResultLimit property, since the meaning and use of that * property seems to be a bit ambiguous, otherwise we could * simply call Util.checkCJResultLimit. * * @param resultSize Result limit * @throws mondrian.olap.ResourceLimitExceededException * */ private void checkNativeResultLimit(int resultSize) { // Throw an exeption if the size of the crossjoin exceeds the result // limit. if (resultLimit < resultSize) { throw MondrianResource.instance() .LimitExceededDuringCrossjoin.ex(resultSize, resultLimit); } } public TupleList adaptList( final TupleList sourceList, final int destSize, final int[] destIndices) { if (sourceList.isEmpty()) { return TupleCollections.emptyList(destIndices.length); } checkNativeResultLimit(sourceList.size()); TupleList destList = new DelegatingTupleList( destSize, new AbstractList>() { @Override public List get(int index) { final List sourceTuple = sourceList.get(index); final Member[] members = new Member[destSize]; for (int i = 0; i < destIndices.length; i++) { members[destIndices[i]] = sourceTuple.get(i); } return Arrays.asList(members); } @Override public int size() { return sourceList.size(); } } ); // The mergeCalcMembers method in this file assumes that the // resultList is random access - that calls to get(n) are constant // cost, regardless of n. Unfortunately, the TraversalList objects // created by HighCardSqlTupleReader are implemented using linked // lists, leading to pathologically long run times. // This presumes that the ResultStyle is LIST if (LOGGER.isDebugEnabled()) { String sourceListType = sourceList.getClass().getSimpleName(); String sourceElementType = String.format("Member[%d]", destSize); LOGGER.debug( String.format( "returning native %s<%s> without copying to new list.", sourceListType, sourceElementType)); } return destList; } } // REVIEW: Can we remove this class, and simply use TupleList? static class Range { private final TupleList list; private final int from; private final int to; public Range(TupleList list) { this(list, 0, list.size()); } private Range(TupleList list, int from, int to) { if (from < 0) { throw new IllegalArgumentException("from is must be >= 0"); } if (to > list.size()) { throw new IllegalArgumentException( "to must be <= to list size"); } if (from > to) { throw new IllegalArgumentException("from must be <= to"); } this.list = list; this.from = from; this.to = to; } public boolean isEmpty() { return size() == 0; } public int size() { return to - from; } public List getTuple() { if (from >= list.size()) { throw new NoSuchElementException(); } return list.get(from); } public List> getTuples() { if (from == 0 && to == list.size()) { return list; } return list.subList(from, to); } public Member getMember(int cursor, int col) { return list.get(cursor).get(col); } public String toString() { return "[" + from + " : " + to + "]"; } private Range subRange(int fromRow, int toRow) { return new Range(list, fromRow, toRow); } public Range subRangeForValue(Member value, int col) { int startAt = nextMatching(value, from, col); int endAt = nextNonMatching(value, startAt + 1, col); return subRange(startAt, endAt); } public Range subRangeForValue(Level level, int col) { int startAt = nextMatching(level, from, col); int endAt = nextNonMatching(level, startAt + 1, col); return subRange(startAt, endAt); } public Range subRangeStartingAt(int startAt, int col) { Member value = list.get(startAt).get(col); int endAt = nextNonMatching(value, startAt + 1, col); return subRange(startAt, endAt); } private int nextMatching(Member value, int startAt, int col) { for (int cursor = startAt; cursor < to; cursor++) { if (value.equals(list.get(cursor).get(col))) { return cursor; } } return to; } private int nextMatching(Level level, int startAt, int col) { for (int cursor = startAt; cursor < to; cursor++) { if (level.equals(list.get(cursor).get(col).getLevel())) { return cursor; } } return to; } private int nextNonMatching(Member value, int startAt, int col) { if (value == null) { return nextNonNull(startAt, col); } for (int cursor = startAt; cursor < to; cursor++) { if (!value.equals(list.get(cursor).get(col))) { return cursor; } } return to; } private int nextNonMatching(Level level, int startAt, int col) { if (level == null) { return nextNonNull(startAt, col); } for (int cursor = startAt; cursor < to; cursor++) { if (!level.equals(list.get(cursor).get(col).getLevel())) { return cursor; } } return to; } private int nextNonNull(int startAt, int col) { for (int cursor = startAt; cursor < to; cursor++) { if (list.get(cursor).get(col) != null) { return cursor; } } return to; } public Iterable subRanges(final int col) { final Range parent = this; return new Iterable() { final int rangeCol = col; public Iterator iterator() { return new RangeIterator(parent, rangeCol); } }; } public Iterable getMembers(final int col) { return new Iterable() { public Iterator iterator() { return new Iterator() { private int cursor = from; public boolean hasNext() { return cursor < to; } public Member next() { if (!hasNext()) { throw new NoSuchElementException(); } return getMember(cursor++, col); } public void remove() { throw new UnsupportedOperationException(); } }; } }; } } public static class RangeIterator implements Iterator { private final Range parent; private final int col; private Range precomputed; public RangeIterator(Range parent, int col) { this.parent = parent; this.col = col; precomputed = next(parent.from); } public boolean hasNext() { return precomputed != null; } private Range next(int cursor) { return (cursor >= parent.to) ? null : parent.subRangeStartingAt(cursor, col); } public Range next() { if (precomputed == null) { throw new NoSuchElementException(); } Range it = precomputed; precomputed = next(precomputed.to); return it; } public void remove() { throw new UnsupportedOperationException(); } } private static class ReassemblyGuide { private final int index; private final List commands = new ArrayList(); public ReassemblyGuide(int index) { this.index = index; } public int getIndex() { return index; } public List getCommands() { return Collections.unmodifiableList(commands); } private void addCommandTuple(List commandTuple) { ReassemblyCommand curr = currentCommand(commandTuple); if (index < commandTuple.size() - 1) { curr.forNextCol(index + 1).addCommandTuple(commandTuple); } } private ReassemblyCommand currentCommand( List commandTuple) { ReassemblyCommand curr = commandTuple.get(index); ReassemblyCommand prev = commands.isEmpty() ? null : commands.get(commands.size() - 1); if (prev != null && prev.getMemberType() == SENTINEL) { commands.set(commands.size() - 1, curr); } else if (prev == null || !prev.getElement().equals(curr.getElement())) { commands.add(curr); } else { curr = prev; } return curr; } public String toString() { return "" + index + ":" + commands.toString() .replaceAll("=null", "").replaceAll("=", " ") + " "; } } private static class ReassemblyCommand { private final OlapElement element; private final String elementName; private final NativeElementType memberType; private ReassemblyGuide nextColGuide; public ReassemblyCommand( Member member, NativeElementType memberType) { this.element = member; this.memberType = memberType; this.elementName = member.toString(); } public ReassemblyCommand( Level level, NativeElementType memberType) { this.element = level; this.memberType = memberType; this.elementName = level.toString() + ".members"; } public OlapElement getElement() { return element; } public String getElementName() { return elementName; } public Member getMember() { return (Member) element; } public Level getLevel() { return (Level) element; } public boolean hasNextGuide() { return nextColGuide != null; } public ReassemblyGuide forNextCol() { return nextColGuide; } public ReassemblyGuide forNextCol(int index) { if (nextColGuide == null) { nextColGuide = new ReassemblyGuide(index); } return nextColGuide; } public NativeElementType getMemberType() { return memberType; } public static Set getMemberTypes( Collection commands) { Set types = Olap4jUtil.enumSetNoneOf(NativeElementType.class); for (ReassemblyCommand command : commands) { types.add(command.getMemberType()); } return types; } @Override public String toString() { return memberType.toString() + ": " + getElementName(); } } enum NativeElementType { LEVEL_MEMBERS(true), ENUMERATED_VALUE(true), OTHER_NATIVE(true), NON_NATIVE(false), SENTINEL(false); private final boolean isNativeCompatible; private NativeElementType(boolean isNativeCompatible) { this.isNativeCompatible = isNativeCompatible; } public boolean isNativeCompatible() { return isNativeCompatible; } } private static Id createSentinelId(Level level) { return hierarchyId(level) .append(q(createMangledName(level, SENTINEL_PREFIX))); } private static Id createMemberId(Level level) { return hierarchyId(level) .append(q(createMangledName(level, MEMBER_NAME_PREFIX))); } private static Id createSetId(Level level) { return new Id( q(createMangledName(level, SET_NAME_PREFIX))); } private static Id hierarchyId(Level level) { Id id = new Id(q(level.getDimension().getName())); if (MondrianProperties.instance().SsasCompatibleNaming.get()) { id = id.append(q(level.getHierarchy().getName())); } return id; } private static Id.Segment q(String s) { return new Id.NameSegment(s); } private static String createMangledName(Level level, String prefix) { return prefix + level.getUniqueName().replaceAll("[\\[\\]]", "") .replaceAll("\\.", "_") + "_"; } private static void dumpListToLog( String heading, TupleList list) { if (LOGGER.isDebugEnabled()) { LOGGER.debug( String.format( "%s created with %,d rows.", heading, list.size())); StringBuilder buf = new StringBuilder(Util.nl); for (List element : list) { buf.append(Util.nl); buf.append(element); } LOGGER.debug(buf.toString()); } } private static String toCsv(Collection list) { StringBuilder buf = new StringBuilder(); String sep = ""; for (T element : list) { buf.append(sep).append(element); sep = ", "; } return buf.toString(); } private static String getLevelNameFromMemberName(String memberName) { // we assume that the last token is the level name String tokens[] = memberName.split("_"); return tokens[tokens.length - 1]; } } // End NativizeSetFunDef.java mondrian-3.11.0.1-R/src/main/mondrian/olap/fun/NonEmptyCrossJoinFunDef.java000066400000000000000000000113461261646570300263630ustar00rootroot00000000000000/* // This software is subject to the terms of the Eclipse Public License v1.0 // Agreement, available at the following URL: // http://www.eclipse.org/legal/epl-v10.html. // You must accept the terms of that agreement to use this software. // // Copyright (C) 2005-2005 Julian Hyde // Copyright (C) 2005-2011 Pentaho and others // Copyright (C) 2004-2005 SAS Institute, Inc. // All Rights Reserved. */ package mondrian.olap.fun; import mondrian.calc.*; import mondrian.calc.impl.AbstractListCalc; import mondrian.mdx.ResolvedFunCall; import mondrian.olap.*; import mondrian.rolap.RolapEvaluator; /** * Definition of the NonEmptyCrossJoin MDX function. * * @author jhyde * @since Mar 23, 2006 * * author 16 December, 2004 */ public class NonEmptyCrossJoinFunDef extends CrossJoinFunDef { static final ReflectiveMultiResolver Resolver = new ReflectiveMultiResolver( "NonEmptyCrossJoin", "NonEmptyCrossJoin(, )", "Returns the cross product of two sets, excluding empty tuples and tuples without associated fact table data.", new String[]{"fxxx"}, NonEmptyCrossJoinFunDef.class); public NonEmptyCrossJoinFunDef(FunDef dummyFunDef) { super(dummyFunDef); } public Calc compileCall(final ResolvedFunCall call, ExpCompiler compiler) { final ListCalc listCalc1 = compiler.compileList(call.getArg(0)); final ListCalc listCalc2 = compiler.compileList(call.getArg(1)); return new AbstractListCalc( call, new Calc[] {listCalc1, listCalc2}, false) { public TupleList evaluateList(Evaluator evaluator) { SchemaReader schemaReader = evaluator.getSchemaReader(); // Evaluate the arguments in non empty mode, but remove from // the slicer any members that will be overridden by args to // the NonEmptyCrossjoin function. For example, in // // SELECT NonEmptyCrossJoin( // [Store].[USA].Children, // [Product].[Beer].Children) // FROM [Sales] // WHERE [Store].[Mexico] // // we want all beers, not just those sold in Mexico. final int savepoint = evaluator.savepoint(); try { evaluator.setNonEmpty(true); for (Member member : ((RolapEvaluator) evaluator).getSlicerMembers()) { if (getType().getElementType().usesHierarchy( member.getHierarchy(), true)) { evaluator.setContext( member.getHierarchy().getAllMember()); } } NativeEvaluator nativeEvaluator = schemaReader.getNativeSetEvaluator( call.getFunDef(), call.getArgs(), evaluator, this); if (nativeEvaluator != null) { evaluator.restore(savepoint); return (TupleList) nativeEvaluator.execute( ResultStyle.LIST); } final TupleList list1 = listCalc1.evaluateList(evaluator); if (list1.isEmpty()) { evaluator.restore(savepoint); return list1; } final TupleList list2 = listCalc2.evaluateList(evaluator); TupleList result = mutableCrossJoin(list1, list2); // remove any remaining empty crossings from the result result = nonEmptyList(evaluator, result, call); return result; } finally { evaluator.restore(savepoint); } } public boolean dependsOn(Hierarchy hierarchy) { if (super.dependsOn(hierarchy)) { return true; } // Member calculations generate members, which mask the actual // expression from the inherited context. if (listCalc1.getType().usesHierarchy(hierarchy, true)) { return false; } if (listCalc2.getType().usesHierarchy(hierarchy, true)) { return false; } // The implicit value expression, executed to figure out // whether a given tuple is empty, depends upon all dimensions. return true; } }; } } // End NonEmptyCrossJoinFunDef.java mondrian-3.11.0.1-R/src/main/mondrian/olap/fun/OpeningClosingPeriodFunDef.java000066400000000000000000000171001261646570300270330ustar00rootroot00000000000000/* // This software is subject to the terms of the Eclipse Public License v1.0 // Agreement, available at the following URL: // http://www.eclipse.org/legal/epl-v10.html. // You must accept the terms of that agreement to use this software. // // Copyright (C) 2002-2005 Julian Hyde // Copyright (C) 2005-2009 Pentaho and others // All Rights Reserved. */ package mondrian.olap.fun; import mondrian.calc.*; import mondrian.calc.impl.AbstractMemberCalc; import mondrian.mdx.ResolvedFunCall; import mondrian.olap.*; import mondrian.olap.type.MemberType; import mondrian.olap.type.Type; import mondrian.resource.MondrianResource; import mondrian.rolap.RolapCube; import mondrian.rolap.RolapHierarchy; import java.util.List; /** * Definition of the OpeningPeriod and ClosingPeriod * builtin functions. * * @author jhyde * @since 2005/8/14 */ class OpeningClosingPeriodFunDef extends FunDefBase { private final boolean opening; static final Resolver OpeningPeriodResolver = new MultiResolver( "OpeningPeriod", "OpeningPeriod([[, ]])", "Returns the first descendant of a member at a level.", new String[] {"fm", "fml", "fmlm"}) { protected FunDef createFunDef(Exp[] args, FunDef dummyFunDef) { return new OpeningClosingPeriodFunDef(dummyFunDef, true); } }; static final Resolver ClosingPeriodResolver = new MultiResolver( "ClosingPeriod", "ClosingPeriod([[, ]])", "Returns the last descendant of a member at a level.", new String[] {"fm", "fml", "fmlm", "fmm"}) { protected FunDef createFunDef(Exp[] args, FunDef dummyFunDef) { return new OpeningClosingPeriodFunDef(dummyFunDef, false); } }; public OpeningClosingPeriodFunDef( FunDef dummyFunDef, boolean opening) { super(dummyFunDef); this.opening = opening; } public Type getResultType(Validator validator, Exp[] args) { if (args.length == 0) { // With no args, the default implementation cannot // guess the hierarchy, so we supply the Time // dimension. RolapHierarchy defaultTimeHierarchy = ((RolapCube) validator.getQuery().getCube()).getTimeHierarchy( getName()); return MemberType.forHierarchy(defaultTimeHierarchy); } return super.getResultType(validator, args); } public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) { final Exp[] args = call.getArgs(); final LevelCalc levelCalc; final MemberCalc memberCalc; RolapHierarchy defaultTimeHierarchy = null; switch (args.length) { case 0: defaultTimeHierarchy = ((RolapCube) compiler.getEvaluator().getCube()) .getTimeHierarchy(getName()); memberCalc = new HierarchyCurrentMemberFunDef.FixedCalcImpl( new DummyExp( MemberType.forHierarchy(defaultTimeHierarchy)), defaultTimeHierarchy); levelCalc = null; break; case 1: defaultTimeHierarchy = ((RolapCube) compiler.getEvaluator().getCube()) .getTimeHierarchy(getName()); levelCalc = compiler.compileLevel(call.getArg(0)); memberCalc = new HierarchyCurrentMemberFunDef.FixedCalcImpl( new DummyExp( MemberType.forHierarchy(defaultTimeHierarchy)), defaultTimeHierarchy); break; default: levelCalc = compiler.compileLevel(call.getArg(0)); memberCalc = compiler.compileMember(call.getArg(1)); break; } // Make sure the member and the level come from the same dimension. if (levelCalc != null) { final Dimension memberDimension = memberCalc.getType().getDimension(); final Dimension levelDimension = levelCalc.getType().getDimension(); if (!memberDimension.equals(levelDimension)) { throw MondrianResource.instance() .FunctionMbrAndLevelHierarchyMismatch.ex( opening ? "OpeningPeriod" : "ClosingPeriod", levelDimension.getUniqueName(), memberDimension.getUniqueName()); } } return new AbstractMemberCalc( call, new Calc[] {levelCalc, memberCalc}) { public Member evaluateMember(Evaluator evaluator) { Member member = memberCalc.evaluateMember(evaluator); // If the level argument is present, use it. Otherwise use the // level immediately after that of the member argument. Level level; if (levelCalc == null) { int targetDepth = member.getLevel().getDepth() + 1; Level[] levels = member.getHierarchy().getLevels(); if (levels.length <= targetDepth) { return member.getHierarchy().getNullMember(); } level = levels[targetDepth]; } else { level = levelCalc.evaluateLevel(evaluator); } // Shortcut if the level is above the member. if (level.getDepth() < member.getLevel().getDepth()) { return member.getHierarchy().getNullMember(); } // Shortcut if the level is the same as the member if (level == member.getLevel()) { return member; } return getDescendant( evaluator.getSchemaReader(), member, level, opening); } }; } /** * Returns the first or last descendant of the member at the target level. * This method is the implementation of both OpeningPeriod and * ClosingPeriod. * * @param schemaReader The schema reader to use to evaluate the function. * @param member The member from which the descendant is to be found. * @param targetLevel The level to stop at. * @param returnFirstDescendant Flag indicating whether to return the first * or last descendant of the member. * @return A member. * @pre member.getLevel().getDepth() < level.getDepth(); */ static Member getDescendant( SchemaReader schemaReader, Member member, Level targetLevel, boolean returnFirstDescendant) { List children; final int targetLevelDepth = targetLevel.getDepth(); assertPrecondition(member.getLevel().getDepth() < targetLevelDepth, "member.getLevel().getDepth() < targetLevel.getDepth()"); for (;;) { children = schemaReader.getMemberChildren(member); if (children.size() == 0) { return targetLevel.getHierarchy().getNullMember(); } final int index = returnFirstDescendant ? 0 : (children.size() - 1); member = children.get(index); if (member.getLevel().getDepth() == targetLevelDepth) { if (member.isHidden()) { return member.getHierarchy().getNullMember(); } else { return member; } } } } } // End OpeningClosingPeriodFunDef.java mondrian-3.11.0.1-R/src/main/mondrian/olap/fun/OrderFunDef.java000066400000000000000000000414351261646570300240350ustar00rootroot00000000000000/* // This software is subject to the terms of the Eclipse Public License v1.0 // Agreement, available at the following URL: // http://www.eclipse.org/legal/epl-v10.html. // You must accept the terms of that agreement to use this software. // // Copyright (C) 2004-2005 Julian Hyde // Copyright (C) 2005-2011 Pentaho // All Rights Reserved. */ package mondrian.olap.fun; import mondrian.calc.*; import mondrian.calc.impl.*; import mondrian.mdx.ResolvedFunCall; import mondrian.olap.*; import java.util.*; /** * Definition of the Order MDX function. * * @author jhyde * @since Mar 23, 2006 */ class OrderFunDef extends FunDefBase { static final ResolverImpl Resolver = new ResolverImpl(); public OrderFunDef(ResolverBase resolverBase, int type, int[] types) { super(resolverBase, type, types); } public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) { final IterCalc listCalc = compiler.compileIter(call.getArg(0)); List keySpecList = new ArrayList(); buildKeySpecList(keySpecList, call, compiler); final int keySpecCount = keySpecList.size(); Calc[] calcList = new Calc[keySpecCount + 1]; // +1 for the listCalc calcList[0] = listCalc; assert keySpecCount >= 1; final Calc expCalc = keySpecList.get(0).getKey(); calcList[1] = expCalc; if (keySpecCount == 1) { if (expCalc.isWrapperFor(MemberValueCalc.class) || expCalc.isWrapperFor(MemberArrayValueCalc.class)) { List constantList = new ArrayList(); List variableList = new ArrayList(); final MemberCalc[] calcs = (MemberCalc[]) ((AbstractCalc) expCalc).getCalcs(); for (MemberCalc memberCalc : calcs) { if (memberCalc.isWrapperFor(ConstantCalc.class) && !listCalc.dependsOn( memberCalc.getType().getHierarchy())) { constantList.add(memberCalc); } else { variableList.add(memberCalc); } } if (constantList.isEmpty()) { // All members are non-constant -- cannot optimize } else if (variableList.isEmpty()) { // All members are constant. Optimize by setting entire // context first. calcList[1] = new ValueCalc( new DummyExp(expCalc.getType())); return new ContextCalc( calcs, new CalcImpl( call, calcList, keySpecList)); } else { // Some members are constant. Evaluate these before // evaluating the list expression. calcList[1] = MemberValueCalc.create( new DummyExp(expCalc.getType()), variableList.toArray( new MemberCalc[variableList.size()]), compiler.getEvaluator() .mightReturnNullForUnrelatedDimension()); return new ContextCalc( constantList.toArray( new MemberCalc[constantList.size()]), new CalcImpl( call, calcList, keySpecList)); } } } for (int i = 1; i < keySpecCount; i++) { final Calc expCalcs = keySpecList.get(i).getKey(); calcList[i + 1] = expCalcs; } return new CalcImpl(call, calcList, keySpecList); } private void buildKeySpecList( List keySpecList, ResolvedFunCall call, ExpCompiler compiler) { final int argCount = call.getArgs().length; int j = 1; // args[0] is the input set Calc key; Flag dir; Exp arg; while (j < argCount) { arg = call.getArg(j); key = compiler.compileScalar(arg, true); j++; if ((j >= argCount) || (call.getArg(j).getCategory() != Category.Symbol)) { dir = Flag.ASC; } else { dir = getLiteralArg(call, j, Flag.ASC, Flag.class); j++; } keySpecList.add(new SortKeySpec(key, dir)); } } private interface CalcWithDual extends Calc { public TupleList evaluateDual( Evaluator rootEvaluator, Evaluator subEvaluator); } private static class CalcImpl extends AbstractListCalc implements CalcWithDual { private final IterCalc iterCalc; private final Calc sortKeyCalc; private final List keySpecList; private final int originalKeySpecCount; private final int arity; public CalcImpl( ResolvedFunCall call, Calc[] calcList, List keySpecList) { super(call, calcList); // assert iterCalc.getResultStyle() == ResultStyle.MUTABLE_LIST; this.iterCalc = (IterCalc) calcList[0]; this.sortKeyCalc = calcList[1]; this.keySpecList = keySpecList; this.originalKeySpecCount = keySpecList.size(); this.arity = getType().getArity(); } public TupleList evaluateDual( Evaluator rootEvaluator, Evaluator subEvaluator) { assert originalKeySpecCount == 1; final TupleIterable iterable = iterCalc.evaluateIterable(rootEvaluator); // REVIEW: If iterable happens to be a list, we'd like to pass it, // but we cannot yet guarantee that it is mutable. final TupleList list = iterable instanceof TupleList && false ? (TupleList) iterable : null; Util.discard(iterCalc.getResultStyle()); Flag sortKeyDir = keySpecList.get(0).getDirection(); final TupleList tupleList; final int savepoint = subEvaluator.savepoint(); try { subEvaluator.setNonEmpty(false); if (arity == 1) { tupleList = new UnaryTupleList( sortMembers( subEvaluator, iterable.slice(0), list == null ? null : list.slice(0), sortKeyCalc, sortKeyDir.descending, sortKeyDir.brk)); } else { tupleList = sortTuples( subEvaluator, iterable, list, sortKeyCalc, sortKeyDir.descending, sortKeyDir.brk, arity); } return tupleList; } finally { subEvaluator.restore(savepoint); } } public TupleList evaluateList(Evaluator evaluator) { final TupleIterable iterable = iterCalc.evaluateIterable(evaluator); // REVIEW: If iterable happens to be a list, we'd like to pass it, // but we cannot yet guarantee that it is mutable. final TupleList list = iterable instanceof TupleList && false ? (TupleList) iterable : null; // go by size of keySpecList before purging if (originalKeySpecCount == 1) { Flag sortKeyDir = keySpecList.get(0).getDirection(); final TupleList tupleList; final int savepoint = evaluator.savepoint(); try { evaluator.setNonEmpty(false); if (arity == 1) { tupleList = new UnaryTupleList( sortMembers( evaluator, iterable.slice(0), list == null ? null : list.slice(0), sortKeyCalc, sortKeyDir.descending, sortKeyDir.brk)); } else { tupleList = sortTuples( evaluator, iterable, list, sortKeyCalc, sortKeyDir.descending, sortKeyDir.brk, arity); } return tupleList; } finally { evaluator.restore(savepoint); } } else { purgeKeySpecList(keySpecList, list); if (keySpecList.isEmpty()) { return list; } final TupleList tupleList; final int savepoint = evaluator.savepoint(); try { evaluator.setNonEmpty(false); if (arity == 1) { tupleList = new UnaryTupleList( sortMembers( evaluator, iterable.slice(0), list == null ? null : list.slice(0), keySpecList)); } else { tupleList = sortTuples( evaluator, iterable, list, keySpecList, arity); } return tupleList; } finally { evaluator.restore(savepoint); } } } public void collectArguments(Map arguments) { super.collectArguments(arguments); // only good for original Order syntax assert originalKeySpecCount == 1; Flag sortKeyDir = keySpecList.get(0).getDirection(); arguments.put( "direction", (sortKeyDir.descending ? (sortKeyDir.brk ? Flag.BDESC : Flag.DESC) : (sortKeyDir.brk ? Flag.BASC : Flag.ASC))); } public boolean dependsOn(Hierarchy hierarchy) { return anyDependsButFirst(getCalcs(), hierarchy); } private void purgeKeySpecList( List keySpecList, TupleList list) { if (list == null || list.isEmpty()) { return; } if (keySpecList.size() == 1) { return; } List listHierarchies = new ArrayList(list.getArity()); for (Member member : list.get(0)) { listHierarchies.add(member.getHierarchy()); } // do not sort (remove sort key spec from the list) if // 1. evaluates to a member from a // level/dimension which is not used in the first argument // 2. evaluates to the same member for // all cells; for example, a report showing all quarters of // year 1998 will not be sorted if the sort key is on the constant // member [1998].[Q1] ListIterator iter = keySpecList.listIterator(); while (iter.hasNext()) { SortKeySpec key = iter.next(); Calc expCalc = key.getKey(); if (expCalc instanceof MemberOrderKeyFunDef.CalcImpl) { Calc[] calcs = ((MemberOrderKeyFunDef.CalcImpl) expCalc).getCalcs(); MemberCalc memberCalc = (MemberCalc) calcs[0]; if (memberCalc instanceof ConstantCalc || !listHierarchies.contains( memberCalc.getType().getHierarchy())) { iter.remove(); } } } } } private static class ContextCalc extends GenericIterCalc { private final MemberCalc[] memberCalcs; private final CalcWithDual calc; private final Member[] members; // workspace protected ContextCalc(MemberCalc[] memberCalcs, CalcWithDual calc) { super(new DummyExp(calc.getType()), xx(memberCalcs, calc)); this.memberCalcs = memberCalcs; this.calc = calc; this.members = new Member[memberCalcs.length]; } private static Calc[] xx( MemberCalc[] memberCalcs, CalcWithDual calc) { Calc[] calcs = new Calc[memberCalcs.length + 1]; System.arraycopy(memberCalcs, 0, calcs, 0, memberCalcs.length); calcs[calcs.length - 1] = calc; return calcs; } public Object evaluate(Evaluator evaluator) { // Evaluate each of the members, and set as context in the // sub-evaluator. for (int i = 0; i < memberCalcs.length; i++) { members[i] = memberCalcs[i].evaluateMember(evaluator); } final Evaluator subEval = evaluator.push(members); // Evaluate the expression in the new context. return calc.evaluateDual(evaluator, subEval); } public boolean dependsOn(Hierarchy hierarchy) { if (anyDepends(memberCalcs, hierarchy)) { return true; } // Member calculations generate members, which mask the actual // expression from the inherited context. for (MemberCalc memberCalc : memberCalcs) { if (memberCalc.getType().usesHierarchy(hierarchy, true)) { return false; } } return calc.dependsOn(hierarchy); } public ResultStyle getResultStyle() { return calc.getResultStyle(); } } private static class ResolverImpl extends ResolverBase { private final String[] reservedWords; static int[] argTypes; private ResolverImpl() { super( "Order", "Order( {, }...)", "Arranges members of a set, optionally preserving or breaking the hierarchy.", Syntax.Function); this.reservedWords = Flag.getNames(); } public FunDef resolve( Exp[] args, Validator validator, List conversions) { argTypes = new int[args.length]; if (args.length < 2) { return null; } // first arg must be a set if (!validator.canConvert(0, args[0], Category.Set, conversions)) { return null; } argTypes[0] = Category.Set; // after fist args, should be: value [, symbol] int i = 1; while (i < args.length) { if (!validator.canConvert( i, args[i], Category.Value, conversions)) { return null; } else { argTypes[i] = Category.Value; i++; } // if symbol is not specified, skip to the next if ((i == args.length)) { //done, will default last arg to ASC } else { if (!validator.canConvert( i, args[i], Category.Symbol, conversions)) { // continue, will default sort flag for prev arg to ASC } else { argTypes[i] = Category.Symbol; i++; } } } return new OrderFunDef(this, Category.Set, argTypes); } public String[] getReservedWords() { if (reservedWords != null) { return reservedWords; } return super.getReservedWords(); } } } // End OrderFunDef.java mondrian-3.11.0.1-R/src/main/mondrian/olap/fun/ParallelPeriodFunDef.java000066400000000000000000000137771261646570300256710ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.olap.fun; import mondrian.calc.*; import mondrian.calc.impl.AbstractMemberCalc; import mondrian.calc.impl.ConstantCalc; import mondrian.mdx.ResolvedFunCall; import mondrian.olap.*; import mondrian.olap.type.MemberType; import mondrian.olap.type.Type; import mondrian.resource.MondrianResource; import mondrian.rolap.RolapCube; import mondrian.rolap.RolapHierarchy; /** * Definition of the ParallelPeriod MDX function. * * @author jhyde * @since Mar 23, 2006 */ class ParallelPeriodFunDef extends FunDefBase { static final ReflectiveMultiResolver Resolver = new ReflectiveMultiResolver( "ParallelPeriod", "ParallelPeriod([[, [, ]]])", "Returns a member from a prior period in the same relative position as a specified member.", new String[] {"fm", "fml", "fmln", "fmlnm"}, ParallelPeriodFunDef.class); public ParallelPeriodFunDef(FunDef dummyFunDef) { super(dummyFunDef); } public Type getResultType(Validator validator, Exp[] args) { if (args.length == 0) { // With no args, the default implementation cannot // guess the hierarchy, so we supply the Time // dimension. RolapHierarchy defaultTimeHierarchy = ((RolapCube) validator.getQuery().getCube()).getTimeHierarchy( getName()); return MemberType.forHierarchy(defaultTimeHierarchy); } return super.getResultType(validator, args); } public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) { // Member defaults to [Time].currentmember Exp[] args = call.getArgs(); // Numeric Expression defaults to 1. final IntegerCalc lagValueCalc = (args.length >= 2) ? compiler.compileInteger(args[1]) : ConstantCalc.constantInteger(1); // If level is not specified, we compute it from // member at runtime. final LevelCalc ancestorLevelCalc = args.length >= 1 ? compiler.compileLevel(args[0]) : null; final MemberCalc memberCalc; switch (args.length) { case 3: memberCalc = compiler.compileMember(args[2]); break; case 1: final Hierarchy hierarchy = args[0].getType().getHierarchy(); if (hierarchy != null) { // For some functions, such as Levels(), // the dimension cannot be determined at compile time. memberCalc = new HierarchyCurrentMemberFunDef.FixedCalcImpl( call, hierarchy); } else { memberCalc = null; } break; default: final RolapHierarchy timeHierarchy = ((RolapCube) compiler.getEvaluator().getCube()) .getTimeHierarchy(getName()); memberCalc = new HierarchyCurrentMemberFunDef.FixedCalcImpl( call, timeHierarchy); break; } return new AbstractMemberCalc( call, new Calc[] {memberCalc, lagValueCalc, ancestorLevelCalc}) { public Member evaluateMember(Evaluator evaluator) { Member member; int lagValue = lagValueCalc.evaluateInteger(evaluator); Level ancestorLevel; if (ancestorLevelCalc != null) { ancestorLevel = ancestorLevelCalc.evaluateLevel(evaluator); if (memberCalc == null) { member = evaluator.getContext(ancestorLevel.getHierarchy()); } else { member = memberCalc.evaluateMember(evaluator); } } else { member = memberCalc.evaluateMember(evaluator); Member parent = member.getParentMember(); if (parent == null) { // This is a root member, // so there is no parallelperiod. return member.getHierarchy().getNullMember(); } ancestorLevel = parent.getLevel(); } return parallelPeriod( member, ancestorLevel, evaluator, lagValue); } }; } Member parallelPeriod( Member member, Level ancestorLevel, Evaluator evaluator, int lagValue) { // Now do some error checking. // The ancestorLevel and the member must be from the // same hierarchy. if (member.getHierarchy() != ancestorLevel.getHierarchy()) { MondrianResource.instance().FunctionMbrAndLevelHierarchyMismatch.ex( "ParallelPeriod", ancestorLevel.getHierarchy().getUniqueName(), member.getHierarchy().getUniqueName()); } if (lagValue == Integer.MIN_VALUE) { // Bump up lagValue by one; otherwise -lagValue (used in // the getleadMember call below) is out of range because // Integer.MAX_VALUE == -(Integer.MIN_VALUE + 1) lagValue += 1; } int distance = member.getLevel().getDepth() - ancestorLevel.getDepth(); Member ancestor = FunUtil.ancestor( evaluator, member, distance, ancestorLevel); Member inLaw = evaluator.getSchemaReader() .getLeadMember(ancestor, -lagValue); return FunUtil.cousin( evaluator.getSchemaReader(), member, inLaw); } } // End ParallelPeriodFunDef.java mondrian-3.11.0.1-R/src/main/mondrian/olap/fun/ParameterFunDef.java000066400000000000000000000262701261646570300247020ustar00rootroot00000000000000/* // This software is subject to the terms of the Eclipse Public License v1.0 // Agreement, available at the following URL: // http://www.eclipse.org/legal/epl-v10.html. // You must accept the terms of that agreement to use this software. // // Copyright (C) 2003-2005 Julian Hyde // Copyright (C) 2005-2009 Pentaho // All Rights Reserved. */ package mondrian.olap.fun; import mondrian.mdx.*; import mondrian.olap.*; import mondrian.olap.type.*; import java.util.ArrayList; import java.util.List; /** * A ParameterFunDef is a pseudo-function describing calls to * Parameter and ParamRef functions. It exists only * fleetingly, and is then converted into a {@link mondrian.olap.Parameter}. * For internal use only. * * @author jhyde * @since Feb 14, 2003 */ public class ParameterFunDef extends FunDefBase { public final String parameterName; private final Type type; public final Exp exp; public final String parameterDescription; ParameterFunDef( FunDef funDef, String parameterName, Type type, int returnCategory, Exp exp, String description) { super( funDef.getName(), funDef.getSignature(), funDef.getDescription(), funDef.getSyntax(), returnCategory, funDef.getParameterCategories()); assertPrecondition( getName().equals("Parameter") || getName().equals("ParamRef")); this.parameterName = parameterName; this.type = type; this.exp = exp; this.parameterDescription = description; } public Exp createCall(Validator validator, Exp[] args) { Parameter parameter = validator.createOrLookupParam( this.getName().equals("Parameter"), parameterName, type, exp, parameterDescription); return new ParameterExpr(parameter); } public Type getResultType(Validator validator, Exp[] args) { return type; } private static boolean isConstant(Exp typeArg) { if (typeArg instanceof LevelExpr) { // e.g. "[Time].[Quarter]" return true; } if (typeArg instanceof HierarchyExpr) { // e.g. "[Time].[By Week]" return true; } if (typeArg instanceof DimensionExpr) { // e.g. "[Time]" return true; } if (typeArg instanceof FunCall) { // e.g. "[Time].CurrentMember.Hierarchy". They probably wrote // "[Time]", and the automatic type conversion did the rest. FunCall hierarchyCall = (FunCall) typeArg; if (hierarchyCall.getFunName().equals("Hierarchy") && hierarchyCall.getArgCount() > 0 && hierarchyCall.getArg(0) instanceof FunCall) { FunCall currentMemberCall = (FunCall) hierarchyCall.getArg(0); if (currentMemberCall.getFunName().equals("CurrentMember") && currentMemberCall.getArgCount() > 0 && currentMemberCall.getArg(0) instanceof DimensionExpr) { return true; } } } return false; } public static String getParameterName(Exp[] args) { if (args[0] instanceof Literal && args[0].getCategory() == Category.String) { return (String) ((Literal) args[0]).getValue(); } else { throw Util.newInternal("Parameter name must be a string constant"); } } /** * Returns an approximate type for a parameter, based upon the 1'th * argument. Does not use the default value expression, so this method * can safely be used before the expression has been validated. */ public static Type getParameterType(Exp[] args) { if (args[1] instanceof Id) { Id id = (Id) args[1]; String[] names = id.toStringArray(); if (names.length == 1) { final String name = names[0]; if (name.equals("NUMERIC")) { return new NumericType(); } if (name.equals("STRING")) { return new StringType(); } } } else if (args[1] instanceof Literal) { final Literal literal = (Literal) args[1]; if (literal.getValue().equals("NUMERIC")) { return new NumericType(); } else if (literal.getValue().equals("STRING")) { return new StringType(); } } else if (args[1] instanceof MemberExpr) { return new MemberType(null, null, null, null); } return new StringType(); } /** * Resolves calls to the Parameter MDX function. */ public static class ParameterResolver extends MultiResolver { private static final String[] SIGNATURES = { // Parameter(string const, symbol, string[, string const]): string "fS#yS#", "fS#yS", // Parameter(string const, symbol, numeric[, string const]): numeric "fn#yn#", "fn#yn", // Parameter(string const, hierarchy constant, member[, string // const[, symbol]]): member "fm#hm#", "fm#hm", // Parameter(string const, hierarchy constant, set[, string // const]): set "fx#hx#", "fx#hx", }; public ParameterResolver() { super( "Parameter", "Parameter(, , , , )", "Returns default value of parameter.", SIGNATURES); } public String[] getReservedWords() { return new String[]{"NUMERIC", "STRING"}; } protected FunDef createFunDef(Exp[] args, FunDef dummyFunDef) { String parameterName = getParameterName(args); Exp typeArg = args[1]; int category; Type type = typeArg.getType(); switch (typeArg.getCategory()) { case Category.Dimension: case Category.Hierarchy: case Category.Level: Dimension dimension = type.getDimension(); if (!isConstant(typeArg)) { throw newEvalException( dummyFunDef, "Invalid parameter '" + parameterName + "'. Type must be a NUMERIC, STRING, or a dimension, " + "hierarchy or level"); } if (dimension == null) { throw newEvalException( dummyFunDef, "Invalid dimension for parameter '" + parameterName + "'"); } type = new MemberType( type.getDimension(), type.getHierarchy(), type.getLevel(), null); category = Category.Member; break; case Category.Symbol: String s = (String) ((Literal) typeArg).getValue(); if (s.equalsIgnoreCase("NUMERIC")) { category = Category.Numeric; type = new NumericType(); break; } else if (s.equalsIgnoreCase("STRING")) { category = Category.String; type = new StringType(); break; } // fall through and throw error default: // Error is internal because the function call has already been // type-checked. throw newEvalException( dummyFunDef, "Invalid type for parameter '" + parameterName + "'; expecting NUMERIC, STRING or a hierarchy"); } // Default value Exp exp = args[2]; Validator validator = createSimpleValidator(BuiltinFunTable.instance()); final List conversionList = new ArrayList(); String typeName = Category.instance.getName(category).toUpperCase(); if (!validator.canConvert(2, exp, category, conversionList)) { throw newEvalException( dummyFunDef, "Default value of parameter '" + parameterName + "' is inconsistent with its type, " + typeName); } if (exp.getCategory() == Category.Set && category == Category.Member) { // Default value is a set; take this an indication that // the type is 'set of '. type = new SetType(type); } if (category == Category.Member) { Type expType = exp.getType(); if (expType instanceof SetType) { expType = ((SetType) expType).getElementType(); } if (distinctFrom(type.getDimension(), expType.getDimension()) || distinctFrom(type.getHierarchy(), expType.getHierarchy()) || distinctFrom(type.getLevel(), expType.getLevel())) { throw newEvalException( dummyFunDef, "Default value of parameter '" + parameterName + "' is not consistent with the parameter type '" + type); } } String parameterDescription = null; if (args.length > 3) { if (args[3] instanceof Literal && args[3].getCategory() == Category.String) { parameterDescription = (String) ((Literal) args[3]).getValue(); } else { throw newEvalException( dummyFunDef, "Description of parameter '" + parameterName + "' must be a string constant"); } } return new ParameterFunDef( dummyFunDef, parameterName, type, category, exp, parameterDescription); } private static boolean distinctFrom(T t1, T t2) { return t1 != null && t2 != null && !t1.equals(t2); } } /** * Resolves calls to the ParamRef MDX function. */ public static class ParamRefResolver extends MultiResolver { public ParamRefResolver() { super( "ParamRef", "ParamRef()", "Returns the current value of this parameter. If it is null, returns the default value.", new String[]{"fv#"}); } protected FunDef createFunDef(Exp[] args, FunDef dummyFunDef) { String parameterName = getParameterName(args); return new ParameterFunDef( dummyFunDef, parameterName, null, Category.Unknown, null, null); } } } // End ParameterFunDef.java mondrian-3.11.0.1-R/src/main/mondrian/olap/fun/ParenthesesFunDef.java000066400000000000000000000035201261646570300252340ustar00rootroot00000000000000/* // This software is subject to the terms of the Eclipse Public License v1.0 // Agreement, available at the following URL: // http://www.eclipse.org/legal/epl-v10.html. // You must accept the terms of that agreement to use this software. // // Copyright (C) 2002-2005 Julian Hyde // Copyright (C) 2005-2009 Pentaho and others // All Rights Reserved. */ package mondrian.olap.fun; import mondrian.calc.Calc; import mondrian.calc.ExpCompiler; import mondrian.mdx.ResolvedFunCall; import mondrian.olap.*; import mondrian.olap.type.Type; import java.io.PrintWriter; /** * ParenthesesFunDef implements the parentheses operator as if it * were a function. * * @author jhyde * @since 3 March, 2002 */ public class ParenthesesFunDef extends FunDefBase { private final int argType; public ParenthesesFunDef(int argType) { super( "()", "()", "Parenthesis enclose an expression and indicate precedence.", Syntax.Parentheses, argType, new int[] {argType}); this.argType = argType; } public void unparse(Exp[] args, PrintWriter pw) { if (args.length != 1) { ExpBase.unparseList(pw, args, "(", ",", ")"); } else { // Don't use parentheses unless necessary. We add parentheses around // expressions because we're not sure of operator precedence, so if // we're not careful, the parentheses tend to multiply ad infinitum. args[0].unparse(pw); } } public Type getResultType(Validator validator, Exp[] args) { Util.assertTrue(args.length == 1); return args[0].getType(); } public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) { return compiler.compile(call.getArg(0)); } } // End ParenthesesFunDef.java mondrian-3.11.0.1-R/src/main/mondrian/olap/fun/PercentileFunDef.java000066400000000000000000000055021261646570300250470ustar00rootroot00000000000000/* // This software is subject to the terms of the Eclipse Public License v1.0 // Agreement, available at the following URL: // http://www.eclipse.org/legal/epl-v10.html. // You must accept the terms of that agreement to use this software. // // Copyright (C) 2002-2005 Julian Hyde // Copyright (C) 2005-2015 Pentaho and others // All Rights Reserved. */ package mondrian.olap.fun; import mondrian.calc.*; import mondrian.calc.impl.AbstractDoubleCalc; import mondrian.mdx.ResolvedFunCall; import mondrian.olap.*; /** * Definition of the Percentile MDX function. *

There is some discussion about what the "right" percentile function is. * Here is a good overview. * Wikipedia also lists * * methods of calculating percentile. *

*

* This class based on MS Excel formulae: *

*
rank = P / 100 * (N - 1) + 1
*
percentile = A[n]+d*(A[n+1]-A[n])
*

Definition can also be found on * Wikipedia

*/ class PercentileFunDef extends AbstractAggregateFunDef { static final ReflectiveMultiResolver Resolver = new ReflectiveMultiResolver( "Percentile", "Percentile(, , )", "Returns the value of the tuple that is at a given percentile of a set.", new String[] {"fnxnn"}, PercentileFunDef.class); public PercentileFunDef(FunDef dummyFunDef) { super(dummyFunDef); } public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) { final ListCalc listCalc = compiler.compileList(call.getArg(0)); final Calc calc = compiler.compileScalar(call.getArg(1), true); final DoubleCalc percentCalc = compiler.compileDouble(call.getArg(2)); return new AbstractDoubleCalc( call, new Calc[] {listCalc, calc, percentCalc}) { public double evaluateDouble(Evaluator evaluator) { TupleList list = evaluateCurrentList(listCalc, evaluator); double percent = percentCalc.evaluateDouble(evaluator) * 0.01; final int savepoint = evaluator.savepoint(); try { evaluator.setNonEmpty(false); final double percentile = percentile(evaluator, list, calc, percent); return percentile; } finally { evaluator.restore(savepoint); } } public boolean dependsOn(Hierarchy hierarchy) { return anyDependsButFirst(getCalcs(), hierarchy); } }; } } // End PercentileFunDef.java mondrian-3.11.0.1-R/src/main/mondrian/olap/fun/PeriodsToDateFunDef.java000066400000000000000000000104131261646570300254600ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.olap.fun; import mondrian.calc.*; import mondrian.calc.impl.AbstractListCalc; import mondrian.calc.impl.UnaryTupleList; import mondrian.mdx.ResolvedFunCall; import mondrian.olap.*; import mondrian.olap.type.*; import mondrian.rolap.RolapCube; import mondrian.rolap.RolapHierarchy; /** * Definition of the PeriodsToDate MDX function. * * @author jhyde * @since Mar 23, 2006 */ class PeriodsToDateFunDef extends FunDefBase { static final ReflectiveMultiResolver Resolver = new ReflectiveMultiResolver( "PeriodsToDate", "PeriodsToDate([[, ]])", "Returns a set of periods (members) from a specified level starting with the first period and ending with a specified member.", new String[]{"fx", "fxl", "fxlm"}, PeriodsToDateFunDef.class); public PeriodsToDateFunDef(FunDef dummyFunDef) { super(dummyFunDef); } public Type getResultType(Validator validator, Exp[] args) { if (args.length == 0) { // With no args, the default implementation cannot // guess the hierarchy. RolapHierarchy defaultTimeHierarchy = ((RolapCube) validator.getQuery().getCube()).getTimeHierarchy( getName()); return new SetType(MemberType.forHierarchy(defaultTimeHierarchy)); } if (args.length >= 2) { Type hierarchyType = args[0].getType(); MemberType memberType = (MemberType) args[1].getType(); if (memberType.getHierarchy() != null && hierarchyType.getHierarchy() != null && memberType.getHierarchy() != hierarchyType.getHierarchy()) { throw Util.newError( "Type mismatch: member must belong to hierarchy " + hierarchyType.getHierarchy().getUniqueName()); } } // If we have at least one arg, it's a level which will // tell us the type. return super.getResultType(validator, args); } public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) { final LevelCalc levelCalc = call.getArgCount() > 0 ? compiler.compileLevel(call.getArg(0)) : null; final MemberCalc memberCalc = call.getArgCount() > 1 ? compiler.compileMember(call.getArg(1)) : null; final RolapHierarchy timeHierarchy = levelCalc == null ? ((RolapCube) compiler.getEvaluator().getCube()).getTimeHierarchy( getName()) : null; return new AbstractListCalc(call, new Calc[] {levelCalc, memberCalc}) { public TupleList evaluateList(Evaluator evaluator) { final Member member; final Level level; if (levelCalc == null) { member = evaluator.getContext(timeHierarchy); level = member.getLevel().getParentLevel(); } else { level = levelCalc.evaluateLevel(evaluator); if (memberCalc == null) { member = evaluator.getContext(level.getHierarchy()); } else { member = memberCalc.evaluateMember(evaluator); } } return new UnaryTupleList( periodsToDate(evaluator, level, member)); } public boolean dependsOn(Hierarchy hierarchy) { if (super.dependsOn(hierarchy)) { return true; } if (memberCalc != null) { return false; } else if (levelCalc != null) { return levelCalc.getType().usesHierarchy(hierarchy, true); } else { return hierarchy == timeHierarchy; } } }; } } // End PeriodsToDateFunDef.java mondrian-3.11.0.1-R/src/main/mondrian/olap/fun/PropertiesFunDef.java000066400000000000000000000127561261646570300251220ustar00rootroot00000000000000/* // This software is subject to the terms of the Eclipse Public License v1.0 // Agreement, available at the following URL: // http://www.eclipse.org/legal/epl-v10.html. // You must accept the terms of that agreement to use this software. // // Copyright (C) 2004-2005 Julian Hyde // Copyright (C) 2005-2012 Pentaho and others // All Rights Reserved. */ package mondrian.olap.fun; import mondrian.calc.*; import mondrian.calc.impl.GenericCalc; import mondrian.mdx.ResolvedFunCall; import mondrian.olap.*; import java.util.List; /** * Definition of the Properties MDX function. * * @author jhyde * @since Mar 23, 2006 */ class PropertiesFunDef extends FunDefBase { static final ResolverImpl Resolver = new ResolverImpl(); public PropertiesFunDef( String name, String signature, String description, Syntax syntax, int returnType, int[] parameterTypes) { super(name, signature, description, syntax, returnType, parameterTypes); } public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) { final MemberCalc memberCalc = compiler.compileMember(call.getArg(0)); final StringCalc stringCalc = compiler.compileString(call.getArg(1)); return new GenericCalc(call) { public Object evaluate(Evaluator evaluator) { return properties( memberCalc.evaluateMember(evaluator), stringCalc.evaluateString(evaluator)); } public Calc[] getCalcs() { return new Calc[] {memberCalc, stringCalc}; } }; } static Object properties(Member member, String s) { boolean matchCase = MondrianProperties.instance().CaseSensitive.get(); Object o = member.getPropertyValue(s, matchCase); if (o == null) { if (!Util.isValidProperty(s, member.getLevel())) { throw new MondrianEvaluationException( "Property '" + s + "' is not valid for member '" + member + "'"); } } return o; } /** * Resolves calls to the PROPERTIES MDX function. */ private static class ResolverImpl extends ResolverBase { private static final int[] PARAMETER_TYPES = { Category.Member, Category.String }; private ResolverImpl() { super( "Properties", ".Properties()", "Returns the value of a member property.", Syntax.Method); } private boolean matches( Exp[] args, int[] parameterTypes, Validator validator, List conversions) { if (parameterTypes.length != args.length) { return false; } for (int i = 0; i < args.length; i++) { if (!validator.canConvert( i, args[i], parameterTypes[i], conversions)) { return false; } } return true; } public FunDef resolve( Exp[] args, Validator validator, List conversions) { if (!matches(args, PARAMETER_TYPES, validator, conversions)) { return null; } int returnType = deducePropertyCategory(args[0], args[1]); return new PropertiesFunDef( getName(), getSignature(), getDescription(), getSyntax(), returnType, PARAMETER_TYPES); } /** * Deduces the category of a property. This is possible only if the * name is a string literal, and the member's hierarchy is unambigous. * If the type cannot be deduced, returns {@link Category#Value}. * * @param memberExp Expression for the member * @param propertyNameExp Expression for the name of the property * @return Category of the property */ private int deducePropertyCategory( Exp memberExp, Exp propertyNameExp) { if (!(propertyNameExp instanceof Literal)) { return Category.Value; } String propertyName = (String) ((Literal) propertyNameExp).getValue(); Hierarchy hierarchy = memberExp.getType().getHierarchy(); if (hierarchy == null) { return Category.Value; } Level[] levels = hierarchy.getLevels(); Property property = lookupProperty( levels[levels.length - 1], propertyName); if (property == null) { // we'll likely get a runtime error return Category.Value; } else { switch (property.getType()) { case TYPE_BOOLEAN: return Category.Logical; case TYPE_NUMERIC: return Category.Numeric; case TYPE_STRING: return Category.String; case TYPE_DATE: case TYPE_TIME: case TYPE_TIMESTAMP: return Category.DateTime; default: throw Util.badValue(property.getType()); } } } public boolean requiresExpression(int k) { return true; } } } // End PropertiesFunDef.java mondrian-3.11.0.1-R/src/main/mondrian/olap/fun/RangeFunDef.java000066400000000000000000000072411261646570300240130ustar00rootroot00000000000000/* // This software is subject to the terms of the Eclipse Public License v1.0 // Agreement, available at the following URL: // http://www.eclipse.org/legal/epl-v10.html. // You must accept the terms of that agreement to use this software. // // Copyright (C) 2002-2005 Julian Hyde // Copyright (C) 2005-2011 Pentaho and others // All Rights Reserved. */ package mondrian.olap.fun; import mondrian.calc.*; import mondrian.calc.impl.*; import mondrian.mdx.ResolvedFunCall; import mondrian.olap.*; import mondrian.olap.type.NullType; import mondrian.resource.MondrianResource; import mondrian.rolap.RolapMember; /** * Definition of the MDX <Member> : <Member> operator, * which returns the set of members between a given pair of members. * * @author jhyde * @since 3 March, 2002 */ class RangeFunDef extends FunDefBase { static final RangeFunDef instance = new RangeFunDef(); private RangeFunDef() { super( ":", " : ", "Infix colon operator returns the set of members between a given pair of members.", "ixmm"); } /** * Returns two membercalc objects, substituting nulls with the hierarchy * null member of the other expression. * * @param exp0 first expression * @param exp1 second expression * * @return two member calcs */ private MemberCalc[] compileMembers( Exp exp0, Exp exp1, ExpCompiler compiler) { MemberCalc[] members = new MemberCalc[2]; if (exp0.getType() instanceof NullType) { members[0] = null; } else { members[0] = compiler.compileMember(exp0); } if (exp1.getType() instanceof NullType) { members[1] = null; } else { members[1] = compiler.compileMember(exp1); } // replace any null types with hierachy null member // if both objects are null, throw exception if (members[0] == null && members[1] == null) { throw MondrianResource.instance().TwoNullsNotSupported.ex(); } else if (members[0] == null) { Member nullMember = ((RolapMember) members[1].evaluate(null)).getHierarchy() .getNullMember(); members[0] = (MemberCalc)ConstantCalc.constantMember(nullMember); } else if (members[1] == null) { Member nullMember = ((RolapMember) members[0].evaluate(null)).getHierarchy() .getNullMember(); members[1] = (MemberCalc)ConstantCalc.constantMember(nullMember); } return members; } public Calc compileCall(final ResolvedFunCall call, ExpCompiler compiler) { final MemberCalc[] memberCalcs = compileMembers(call.getArg(0), call.getArg(1), compiler); return new AbstractListCalc( call, new Calc[] {memberCalcs[0], memberCalcs[1]}) { public TupleList evaluateList(Evaluator evaluator) { final Member member0 = memberCalcs[0].evaluateMember(evaluator); final Member member1 = memberCalcs[1].evaluateMember(evaluator); if (member0.isNull() || member1.isNull()) { return TupleCollections.emptyList(1); } if (member0.getLevel() != member1.getLevel()) { throw evaluator.newEvalException( call.getFunDef(), "Members must belong to the same level"); } return new UnaryTupleList( FunUtil.memberRange(evaluator, member0, member1)); } }; } } // End RangeFunDef.java mondrian-3.11.0.1-R/src/main/mondrian/olap/fun/RankFunDef.java000066400000000000000000000626641261646570300236640ustar00rootroot00000000000000/* // This software is subject to the terms of the Eclipse Public License v1.0 // Agreement, available at the following URL: // http://www.eclipse.org/legal/epl-v10.html. // You must accept the terms of that agreement to use this software. // // Copyright (C) 2005-2005 Julian Hyde // Copyright (C) 2005-2013 Pentaho // All Rights Reserved. */ package mondrian.olap.fun; import mondrian.calc.*; import mondrian.calc.impl.*; import mondrian.mdx.ResolvedFunCall; import mondrian.olap.*; import mondrian.olap.type.TupleType; import mondrian.olap.type.Type; import mondrian.rolap.RolapUtil; import java.io.PrintWriter; import java.util.*; /** * Definition of the RANK MDX function. * * @author Richard Emberson * @since 17 January, 2005 */ public class RankFunDef extends FunDefBase { static final boolean debug = false; static final ReflectiveMultiResolver Resolver = new ReflectiveMultiResolver( "Rank", "Rank(, [, ])", "Returns the one-based rank of a tuple in a set.", new String[]{"fitx", "fitxn", "fimx", "fimxn"}, RankFunDef.class); public RankFunDef(FunDef dummyFunDef) { super(dummyFunDef); } public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) { switch (call.getArgCount()) { case 2: return compileCall2(call, compiler); case 3: return compileCall3(call, compiler); default: throw Util.newInternal("invalid arg count " + call.getArgCount()); } } public Calc compileCall3(ResolvedFunCall call, ExpCompiler compiler) { final Type type0 = call.getArg(0).getType(); final ListCalc listCalc = compiler.compileList(call.getArg(1)); final Calc keyCalc = compiler.compileScalar(call.getArg(2), true); Calc sortedListCalc = new SortedListCalc(call, listCalc, keyCalc); final ExpCacheDescriptor cacheDescriptor = new ExpCacheDescriptor( call, sortedListCalc, compiler.getEvaluator()); if (type0 instanceof TupleType) { final TupleCalc tupleCalc = compiler.compileTuple(call.getArg(0)); return new Rank3TupleCalc( call, tupleCalc, keyCalc, cacheDescriptor); } else { final MemberCalc memberCalc = compiler.compileMember(call.getArg(0)); return new Rank3MemberCalc( call, memberCalc, keyCalc, cacheDescriptor); } } public Calc compileCall2(ResolvedFunCall call, ExpCompiler compiler) { final boolean tuple = call.getArg(0).getType() instanceof TupleType; final Exp listExp = call.getArg(1); final ListCalc listCalc0 = compiler.compileList(listExp); Calc listCalc1 = new RankedListCalc(listCalc0, tuple); final Calc listCalc; if (MondrianProperties.instance().EnableExpCache.get()) { final ExpCacheDescriptor key = new ExpCacheDescriptor( listExp, listCalc1, compiler.getEvaluator()); listCalc = new CacheCalc(listExp, key); } else { listCalc = listCalc1; } if (tuple) { final TupleCalc tupleCalc = compiler.compileTuple(call.getArg(0)); return new Rank2TupleCalc(call, tupleCalc, listCalc); } else { final MemberCalc memberCalc = compiler.compileMember(call.getArg(0)); return new Rank2MemberCalc(call, memberCalc, listCalc); } } private static class Rank2TupleCalc extends AbstractIntegerCalc { private final TupleCalc tupleCalc; private final Calc listCalc; public Rank2TupleCalc( ResolvedFunCall call, TupleCalc tupleCalc, Calc listCalc) { super(call, new Calc[] {tupleCalc, listCalc}); this.tupleCalc = tupleCalc; this.listCalc = listCalc; } public int evaluateInteger(Evaluator evaluator) { // Get member or tuple. // If the member is null (or the tuple contains a null member) // the result is null (even if the list is null). final Member[] members = tupleCalc.evaluateTuple(evaluator); if (members == null) { return IntegerNull; } assert !tupleContainsNullMember(members); // Get the set of members/tuples. // If the list is empty, MSAS cannot figure out the type of the // list, so returns an error "Formula error - dimension count is // not valid - in the Rank function". We will naturally return 0, // which I think is better. final RankedTupleList rankedTupleList = (RankedTupleList) listCalc.evaluate(evaluator); if (rankedTupleList == null) { return 0; } // Find position of member in list. -1 signifies not found. final List memberList = Arrays.asList(members); final int i = rankedTupleList.indexOf(memberList); // Return 1-based rank. 0 signifies not found. return i + 1; } } private static class Rank2MemberCalc extends AbstractIntegerCalc { private final MemberCalc memberCalc; private final Calc listCalc; public Rank2MemberCalc( ResolvedFunCall call, MemberCalc memberCalc, Calc listCalc) { super(call, new Calc[] {memberCalc, listCalc}); this.memberCalc = memberCalc; this.listCalc = listCalc; } public int evaluateInteger(Evaluator evaluator) { // Get member or tuple. // If the member is null (or the tuple contains a null member) // the result is null (even if the list is null). final Member member = memberCalc.evaluateMember(evaluator); if (member == null || member.isNull()) { return IntegerNull; } // Get the set of members/tuples. // If the list is empty, MSAS cannot figure out the type of the // list, so returns an error "Formula error - dimension count is // not valid - in the Rank function". We will naturally return 0, // which I think is better. RankedMemberList rankedMemberList = (RankedMemberList) listCalc.evaluate(evaluator); if (rankedMemberList == null) { return 0; } // Find position of member in list. -1 signifies not found. final int i = rankedMemberList.indexOf(member); // Return 1-based rank. 0 signifies not found. return i + 1; } } private static class Rank3TupleCalc extends AbstractIntegerCalc { private final TupleCalc tupleCalc; private final Calc sortCalc; private final ExpCacheDescriptor cacheDescriptor; public Rank3TupleCalc( ResolvedFunCall call, TupleCalc tupleCalc, Calc sortCalc, ExpCacheDescriptor cacheDescriptor) { super(call, new Calc[] {tupleCalc, sortCalc}); this.tupleCalc = tupleCalc; this.sortCalc = sortCalc; this.cacheDescriptor = cacheDescriptor; } public int evaluateInteger(Evaluator evaluator) { Member[] members = tupleCalc.evaluateTuple(evaluator); if (members == null) { return IntegerNull; } assert !tupleContainsNullMember(members); // Evaluate the list (or retrieve from cache). // If there is an exception while calculating the // list, propagate it up. final TupleSortResult sortResult = (TupleSortResult) evaluator.getCachedResult(cacheDescriptor); if (debug) { sortResult.print(new PrintWriter(System.out)); } if (sortResult.isEmpty()) { // If list is empty, the rank is null. return IntegerNull; } // First try to find the member in the cached SortResult Integer rank = sortResult.rankOf(members); if (rank != null) { return rank; } // member is not seen before, now compute the value of the tuple. final int savepoint = evaluator.savepoint(); Object value; try { evaluator.setContext(members); value = sortCalc.evaluate(evaluator); } finally { evaluator.restore(savepoint); } if (valueNotReady(value)) { // The value wasn't ready, so quit now... we'll be back. return 0; } // If value is null, it won't be in the values array. if (value == Util.nullValue || value == null) { return sortResult.values.length + 1; } value = coerceValue(sortResult.values, value); // Look for the ranked value in the array. int j = Arrays.binarySearch( sortResult.values, value, Collections.reverseOrder()); if (j < 0) { // Value not found. Flip the result to find the // insertion point. j = -(j + 1); } return j + 1; // 1-based } } private static class Rank3MemberCalc extends AbstractIntegerCalc { private final MemberCalc memberCalc; private final Calc sortCalc; private final ExpCacheDescriptor cacheDescriptor; public Rank3MemberCalc( ResolvedFunCall call, MemberCalc memberCalc, Calc sortCalc, ExpCacheDescriptor cacheDescriptor) { super(call, new Calc[] {memberCalc, sortCalc}); this.memberCalc = memberCalc; this.sortCalc = sortCalc; this.cacheDescriptor = cacheDescriptor; } public int evaluateInteger(Evaluator evaluator) { Member member = memberCalc.evaluateMember(evaluator); if (member == null || member.isNull()) { return IntegerNull; } // Evaluate the list (or retrieve from cache). // If there was an exception while calculating the // list, propagate it up. final MemberSortResult sortResult = (MemberSortResult) evaluator.getCachedResult(cacheDescriptor); if (debug) { sortResult.print(new PrintWriter(System.out)); } if (sortResult.isEmpty()) { // If list is empty, the rank is null. return IntegerNull; } // First try to find the member in the cached SortResult Integer rank = sortResult.rankOf(member); if (rank != null) { return rank; } // member is not seen before, now compute the value of the tuple. final int savepoint = evaluator.savepoint(); evaluator.setContext(member); Object value; try { value = sortCalc.evaluate(evaluator); } finally { evaluator.restore(savepoint); } if (valueNotReady(value)) { // The value wasn't ready, so quit now... we'll be back. return 0; } // If value is null, it won't be in the values array. if (value == Util.nullValue || value == null) { return sortResult.values.length + 1; } value = coerceValue(sortResult.values, value); // Look for the ranked value in the array. int j = Arrays.binarySearch( sortResult.values, value, Collections.reverseOrder()); if (j < 0) { // Value not found. Flip the result to find the // insertion point. j = -(j + 1); } return j + 1; // 1-based } } private static Object coerceValue(Object[] values, Object value) { if (values.length > 0) { final Object firstValue = values[0]; if (firstValue instanceof Integer && value instanceof Double) { return ((Double) value).intValue(); } } return value; } private static boolean valueNotReady(Object value) { return value == RolapUtil.valueNotReadyException || value == new Double(Double.NaN); } /** * Calc which evaluates an expression to form a list of tuples, * evaluates a scalar expression at each tuple, then sorts the list of * values. The result is a value of type {@link SortResult}, and can be * used to implement the Rank function efficiently. */ private static class SortedListCalc extends AbstractCalc { private final ListCalc listCalc; private final Calc keyCalc; private static final Integer ONE = 1; /** * Creates a SortCalc. * * @param exp Source expression * @param listCalc Compiled expression to compute the list * @param keyCalc Compiled expression to compute the sort key */ public SortedListCalc( Exp exp, ListCalc listCalc, Calc keyCalc) { super(exp, new Calc[] {listCalc, keyCalc}); this.listCalc = listCalc; this.keyCalc = keyCalc; } public boolean dependsOn(Hierarchy hierarchy) { return anyDependsButFirst(getCalcs(), hierarchy); } public Object evaluate(Evaluator evaluator) { // Save the state of the evaluator. final int savepoint = evaluator.savepoint(); RuntimeException exception = null; final Map memberValueMap; final Map, Object> tupleValueMap; final int numValues; //noinspection unchecked final Map uniqueValueCounterMap = new TreeMap( FunUtil.DescendingValueComparator.instance); TupleList list; try { evaluator.setNonEmpty(false); // Construct an array containing the value of the expression // for each member. list = listCalc.evaluateList(evaluator); assert list != null; if (list.isEmpty()) { return list.getArity() == 1 ? new MemberSortResult( new Object[0], Collections.emptyMap()) : new TupleSortResult( new Object[0], Collections., Integer>emptyMap()); } if (list.getArity() == 1) { memberValueMap = new HashMap(); tupleValueMap = null; for (Member member : list.slice(0)) { evaluator.setContext(member); final Object keyValue = keyCalc.evaluate(evaluator); if (keyValue instanceof RuntimeException) { if (exception == null) { exception = (RuntimeException) keyValue; } } else if (Util.isNull(keyValue)) { // nothing to do } else { // Assume it's the first time seeing this keyValue. Integer valueCounter = uniqueValueCounterMap.put(keyValue, ONE); if (valueCounter != null) { // Update the counter on how many times this // keyValue has been seen. uniqueValueCounterMap.put( keyValue, valueCounter + 1); } memberValueMap.put(member, keyValue); } } numValues = memberValueMap.keySet().size(); } else { tupleValueMap = new HashMap, Object>(); memberValueMap = null; for (List tuple : list) { evaluator.setContext(tuple); final Object keyValue = keyCalc.evaluate(evaluator); if (keyValue instanceof RuntimeException) { if (exception == null) { exception = (RuntimeException) keyValue; } } else if (Util.isNull(keyValue)) { // nothing to do } else { // Assume it's the first time seeing this keyValue. Integer valueCounter = uniqueValueCounterMap.put( keyValue, ONE); if (valueCounter != null) { // Update the counter on how many times this // keyValue has been seen. uniqueValueCounterMap.put( keyValue, valueCounter + 1); } tupleValueMap.put(tuple, keyValue); } } numValues = tupleValueMap.keySet().size(); } } finally { evaluator.restore(savepoint); } // If there were exceptions, quit now... we'll be back. if (exception != null) { return exception; } final Object[] allValuesSorted = new Object[numValues]; // Now build the sorted array containing all keyValues // And update the counter to the rank int currentOrdinal = 0; //noinspection unchecked final Map uniqueValueRankMap = new TreeMap( Collections.reverseOrder()); for (Map.Entry entry : uniqueValueCounterMap.entrySet()) { Object keyValue = entry.getKey(); Integer valueCount = entry.getValue(); // Because uniqueValueCounterMap is already sorted, so the // reconstructed allValuesSorted is guaranteed to be sorted. for (int i = 0; i < valueCount; i ++) { allValuesSorted[currentOrdinal + i] = keyValue; } uniqueValueRankMap.put(keyValue, currentOrdinal + 1); currentOrdinal += valueCount; } // Build a member/tuple to rank map if (list.getArity() == 1) { final Map rankMap = new HashMap(); for (Map.Entry entry : memberValueMap.entrySet()) { int oneBasedRank = uniqueValueRankMap.get(entry.getValue()); rankMap.put(entry.getKey(), oneBasedRank); } return new MemberSortResult(allValuesSorted, rankMap); } else { final Map, Integer> rankMap = new HashMap, Integer>(); for (Map.Entry, Object> entry : tupleValueMap.entrySet()) { int oneBasedRank = uniqueValueRankMap.get(entry.getValue()); rankMap.put(entry.getKey(), oneBasedRank); } return new TupleSortResult(allValuesSorted, rankMap); } } } /** * Holder for the result of sorting a set of values. * It provides simple interface to look up the rank for a member or a tuple. */ private static abstract class SortResult { /** * All values in sorted order; Duplicates are not removed. * E.g. Set (15,15,5,0) * 10 should be ranked 3. * *

Null values are not present: they would be at the end, anyway. */ final Object[] values; public SortResult(Object[] values) { this.values = values; } public boolean isEmpty() { return values == null; } public void print(PrintWriter pw) { if (values == null) { pw.println("SortResult: empty"); } else { pw.println("SortResult {"); for (int i = 0; i < values.length; i++) { if (i > 0) { pw.println(","); } Object value = values[i]; pw.print(value); } pw.println("}"); } pw.flush(); } } private static class MemberSortResult extends SortResult { /** * The precomputed rank associated with all members */ final Map rankMap; public MemberSortResult( Object[] values, Map rankMap) { super(values); this.rankMap = rankMap; } public Integer rankOf(Member member) { return rankMap.get(member); } } private static class TupleSortResult extends SortResult { /** * The precomputed rank associated with all tuples */ final Map, Integer> rankMap; public TupleSortResult( Object[] values, Map, Integer> rankMap) { super(values); this.rankMap = rankMap; } public Integer rankOf(Member[] tuple) { return rankMap.get(Arrays.asList(tuple)); } } /** * Expression which evaluates an expression to form a list of tuples. * *

The result is a value of type * {@link mondrian.olap.fun.RankFunDef.RankedMemberList} or * {@link mondrian.olap.fun.RankFunDef.RankedTupleList}, or * null if the list is empty. */ private static class RankedListCalc extends AbstractCalc { private final ListCalc listCalc; private final boolean tuple; /** * Creates a RankedListCalc. * * @param listCalc Compiled expression to compute the list * @param tuple Whether elements of the list are tuples (as opposed to * members) */ public RankedListCalc(ListCalc listCalc, boolean tuple) { super(new DummyExp(listCalc.getType()), new Calc[] {listCalc}); this.listCalc = listCalc; this.tuple = tuple; } public Object evaluate(Evaluator evaluator) { // Construct an array containing the value of the expression // for each member. TupleList tupleList = listCalc.evaluateList(evaluator); assert tupleList != null; if (tuple) { return new RankedTupleList(tupleList); } else { return new RankedMemberList(tupleList.slice(0)); } } } /** * Data structure which contains a list and can return the position of an * element in the list in O(log N). */ static class RankedMemberList { Map map = new HashMap(); RankedMemberList(List members) { int i = -1; for (final Member member : members) { ++i; final Integer value = map.put(member, i); if (value != null) { // The list already contained a value for this key -- put // it back. map.put(member, value); } } } int indexOf(Member m) { Integer integer = map.get(m); if (integer == null) { return -1; } else { return integer; } } } /** * Data structure which contains a list and can return the position of an * element in the list in O(log N). */ static class RankedTupleList { final Map, Integer> map = new HashMap, Integer>(); RankedTupleList(TupleList tupleList) { int i = -1; for (final List tupleMembers : tupleList.fix()) { ++i; final Integer value = map.put(tupleMembers, i); if (value != null) { // The list already contained a value for this key -- put // it back. map.put(tupleMembers, value); } } } int indexOf(List tupleMembers) { Integer integer = map.get(tupleMembers); if (integer == null) { return -1; } else { return integer; } } } } // End RankFunDef.java mondrian-3.11.0.1-R/src/main/mondrian/olap/fun/ReflectiveMultiResolver.java000066400000000000000000000047011261646570300265120ustar00rootroot00000000000000/* // This software is subject to the terms of the Eclipse Public License v1.0 // Agreement, available at the following URL: // http://www.eclipse.org/legal/epl-v10.html. // You must accept the terms of that agreement to use this software. // // Copyright (C) 2002-2005 Julian Hyde // Copyright (C) 2005-2009 Pentaho and others // All Rights Reserved. */ package mondrian.olap.fun; import mondrian.olap.*; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; /** * Resolver which uses reflection to instantiate a {@link FunDef}. * This reduces the amount of anonymous classes. * * @author jhyde * @since Mar 23, 2006 */ public class ReflectiveMultiResolver extends MultiResolver { private final Constructor constructor; private final String[] reservedWords; public ReflectiveMultiResolver( String name, String signature, String description, String[] signatures, Class clazz) { this(name, signature, description, signatures, clazz, null); } public ReflectiveMultiResolver( String name, String signature, String description, String[] signatures, Class clazz, String[] reservedWords) { super(name, signature, description, signatures); try { this.constructor = clazz.getConstructor(new Class[] {FunDef.class}); } catch (NoSuchMethodException e) { throw Util.newInternal( e, "Error while registering resolver class " + clazz); } this.reservedWords = reservedWords; } protected FunDef createFunDef(Exp[] args, FunDef dummyFunDef) { try { return (FunDef) constructor.newInstance(new Object[] {dummyFunDef}); } catch (InstantiationException e) { throw Util.newInternal( e, "Error while instantiating FunDef '" + getSignature() + "'"); } catch (IllegalAccessException e) { throw Util.newInternal( e, "Error while instantiating FunDef '" + getSignature() + "'"); } catch (InvocationTargetException e) { throw Util.newInternal( e, "Error while instantiating FunDef '" + getSignature() + "'"); } } public String[] getReservedWords() { if (reservedWords != null) { return reservedWords; } return super.getReservedWords(); } } // End ReflectiveMultiResolver.java mondrian-3.11.0.1-R/src/main/mondrian/olap/fun/ResolvedFunCallFinder.java000066400000000000000000000025421261646570300260460ustar00rootroot00000000000000/* // This software is subject to the terms of the Eclipse Public License v1.0 // Agreement, available at the following URL: // http://www.eclipse.org/legal/epl-v10.html. // You must accept the terms of that agreement to use this software. // // Copyright (c) 2002-2014 Pentaho Corporation.. All rights reserved. */ package mondrian.olap.fun; import mondrian.mdx.*; import mondrian.olap.*; import java.util.*; /** * Visitor class used to locate a resolved function call within an * expression */ public class ResolvedFunCallFinder extends MdxVisitorImpl { private final ResolvedFunCall call; public boolean found; private final Set activeMembers = new HashSet(); public ResolvedFunCallFinder(ResolvedFunCall call) { this.call = call; found = false; } public Object visit(ResolvedFunCall funCall) { if (funCall == call) { found = true; } return null; } public Object visit(MemberExpr memberExpr) { Member member = memberExpr.getMember(); if (member.isCalculated()) { if (activeMembers.add(member)) { Exp memberExp = member.getExpression(); memberExp.accept(this); activeMembers.remove(member); } } return null; } } // End ResolvedFunCallFinder.javamondrian-3.11.0.1-R/src/main/mondrian/olap/fun/Resolver.java000066400000000000000000000075101261646570300234670ustar00rootroot00000000000000/* // This software is subject to the terms of the Eclipse Public License v1.0 // Agreement, available at the following URL: // http://www.eclipse.org/legal/epl-v10.html. // You must accept the terms of that agreement to use this software. // // Copyright (C) 2002-2005 Julian Hyde // Copyright (C) 2005-2009 Pentaho and others // All Rights Reserved. */ package mondrian.olap.fun; import mondrian.olap.*; import java.util.List; /** * A Resolver converts a function name, invocation type, and set * of arguments into a {@link FunDef}. * * @author jhyde * @since 3 March, 2002 */ public interface Resolver { /** * Returns the name of the function or operator. */ String getName(); /** * Returns the description of the function or operator. */ String getDescription(); /** * Returns the syntax with which the function or operator was invoked. */ Syntax getSyntax(); /** * Given a particular set of arguments the function is applied to, returns * the correct overloaded form of the function. * *

The method adds an item to conversions every * time it performs an implicit type-conversion. If there are several * candidate functions with the same signature, the validator will choose * the one which used the fewest implicit conversions.

* * @param args Expressions which this function call is applied to. * @param validator Validator * @param conversions List of implicit conversions performed (out) * * @return The function definition which matches these arguments, or null * if no function definition that this resolver knows about matches. */ FunDef resolve( Exp[] args, Validator validator, List conversions); /** * Returns whether a particular argument must be a scalar expression. * Returns false if any of the variants of this resolver * allows a set as its kth argument; true otherwise. */ boolean requiresExpression(int k); /** * Returns an array of symbolic constants which can appear as arguments * to this function. * *

For example, the DrilldownMember may take the symbol * RECURSIVE as an argument. Most functions do not define * any symbolic constants. * * @return An array of the names of the symbolic constants */ String[] getReservedWords(); /** * Returns a string describing the syntax of this function, for example *

StrToSet()
*/ String getSignature(); /** * Returns a representative example of the function which this Resolver * can produce, for purposes of describing the function set. May return * null if there is no representative function, or if the Resolver has * a way to describe itself in more detail. */ FunDef getFunDef(); /** * Description of an implicit conversion that occurred while resolving an * operator call. */ public interface Conversion { /** * Returns the cost of the conversion. If there are several matching * overloads, the one with the lowest overall cost will be preferred. * * @return Cost of conversion */ int getCost(); /** * Checks the viability of implicit conversions. Converting from a * dimension to a hierarchy is valid if is only one hierarchy. */ void checkValid(); /** * Applies this conversion to its argument, modifying the argument list * in place. * * @param validator Validator * @param args Argument list */ void apply(Validator validator, List args); } } // End Resolver.java mondrian-3.11.0.1-R/src/main/mondrian/olap/fun/ResolverBase.java000066400000000000000000000030471261646570300242630ustar00rootroot00000000000000/* // This software is subject to the terms of the Eclipse Public License v1.0 // Agreement, available at the following URL: // http://www.eclipse.org/legal/epl-v10.html. // You must accept the terms of that agreement to use this software. // // Copyright (C) 2002-2005 Julian Hyde // Copyright (C) 2005-2006 Pentaho and others // All Rights Reserved. */ package mondrian.olap.fun; import mondrian.olap.FunDef; import mondrian.olap.Syntax; /** * ResolverBase provides a skeleton implementation of * interface {@link Resolver} * * @author jhyde * @since 3 March, 2002 */ abstract class ResolverBase extends FunUtil implements Resolver { private final String name; private final String signature; private final String description; private final Syntax syntax; ResolverBase( String name, String signature, String description, Syntax syntax) { this.name = name; this.signature = signature; this.description = description; this.syntax = syntax; } public String getName() { return name; } public String getSignature() { return signature; } public FunDef getFunDef() { return null; } public String getDescription() { return description; } public Syntax getSyntax() { return syntax; } public boolean requiresExpression(int k) { return false; } public String[] getReservedWords() { return emptyStringArray; } } // End ResolverBase.java mondrian-3.11.0.1-R/src/main/mondrian/olap/fun/SetFunDef.java000066400000000000000000000417231261646570300235150ustar00rootroot00000000000000/* // This software is subject to the terms of the Eclipse Public License v1.0 // Agreement, available at the following URL: // http://www.eclipse.org/legal/epl-v10.html. // You must accept the terms of that agreement to use this software. // // Copyright (C) 2002-2005 Julian Hyde // Copyright (C) 2005-2011 Pentaho and others // All Rights Reserved. */ package mondrian.olap.fun; import mondrian.calc.*; import mondrian.calc.impl.*; import mondrian.mdx.ResolvedFunCall; import mondrian.olap.*; import mondrian.olap.type.*; import mondrian.resource.MondrianResource; import java.io.PrintWriter; import java.util.*; /** * SetFunDef implements the 'set' function (whose syntax is the * brace operator, { ... }). * * @author jhyde * @since 3 March, 2002 */ public class SetFunDef extends FunDefBase { static final ResolverImpl Resolver = new ResolverImpl(); SetFunDef(Resolver resolver, int[] argTypes) { super(resolver, Category.Set, argTypes); } public void unparse(Exp[] args, PrintWriter pw) { ExpBase.unparseList(pw, args, "{", ", ", "}"); } public Type getResultType(Validator validator, Exp[] args) { // All of the members in {[,]...} must have the same // Hierarchy. But if there are no members, we can't derive a // hierarchy. Type type0 = null; if (args.length == 0) { // No members to go on, so we can't guess the hierarchy. type0 = MemberType.Unknown; } else { for (int i = 0; i < args.length; i++) { Exp arg = args[i]; Type type = arg.getType(); type = TypeUtil.toMemberOrTupleType(type); if (i == 0) { type0 = type; } else { if (!TypeUtil.isUnionCompatible(type0, type)) { throw MondrianResource.instance() .ArgsMustHaveSameHierarchy.ex(getName()); } } } } return new SetType(type0); } public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) { final Exp[] args = call.getArgs(); if (args.length == 0) { // Special treatment for empty set, because we don't know whether it // is a set of members or tuples, and so we need it to implement // both MemberListCalc and ListCalc. return new EmptyListCalc(call); } if (args.length == 1 && args[0].getType() instanceof SetType) { // Optimized case when there is only one argument. This occurs quite // often, because people write '{Foo.Children} on 1' when they could // write 'Foo.Children on 1'. return args[0].accept(compiler); } return new SetListCalc( call, args, compiler, ResultStyle.LIST_MUTABLELIST); } /** * Compiled expression to implement the MDX set function, { ... * }, applied to a set of tuples, as a list. * *

The set function can contain expressions which yield sets together * with expressions which yield individual tuples, provided that * they all have the same type. It automatically removes null * or partially-null tuples from the list. * *

Also, does not process high-cardinality dimensions specially. */ public static class SetListCalc extends AbstractListCalc { private TupleList result; private final VoidCalc[] voidCalcs; public SetListCalc( Exp exp, Exp[] args, ExpCompiler compiler, List resultStyles) { super(exp, null); voidCalcs = compileSelf(args, compiler, resultStyles); result = TupleCollections.createList(getType().getArity()); } public Calc[] getCalcs() { return voidCalcs; } private VoidCalc[] compileSelf( Exp[] args, ExpCompiler compiler, List resultStyles) { VoidCalc[] voidCalcs = new VoidCalc[args.length]; for (int i = 0; i < args.length; i++) { voidCalcs[i] = createCalc(args[i], compiler, resultStyles); } return voidCalcs; } private VoidCalc createCalc( Exp arg, ExpCompiler compiler, List resultStyles) { final Type type = arg.getType(); if (type instanceof SetType) { // TODO use resultStyles final ListCalc listCalc = compiler.compileList(arg); return new AbstractVoidCalc(arg, new Calc[] {listCalc}) { public void evaluateVoid(Evaluator evaluator) { TupleList list = listCalc.evaluateList(evaluator); // Add only tuples which are not null. Tuples with // any null members are considered null. outer: for (List members : list) { for (Member member : members) { if (member == null || member.isNull()) { continue outer; } } result.add(members); } } protected String getName() { return "Sublist"; } }; } else if (type.getArity() == 1) { final MemberCalc memberCalc = compiler.compileMember(arg); return new AbstractVoidCalc(arg, new Calc[]{memberCalc}) { final Member[] members = {null}; public void evaluateVoid(Evaluator evaluator) { // Don't add null or partially null tuple to result. Member member = memberCalc.evaluateMember(evaluator); if (member == null || member.isNull()) { return; } members[0] = member; result.addTuple(members); } }; } else { final TupleCalc tupleCalc = compiler.compileTuple(arg); return new AbstractVoidCalc(arg, new Calc[]{tupleCalc}) { public void evaluateVoid(Evaluator evaluator) { // Don't add null or partially null tuple to result. Member[] members = tupleCalc.evaluateTuple(evaluator); if (members == null || tupleContainsNullMember(members)) { return; } result.addTuple(members); } }; } } public TupleList evaluateList(final Evaluator evaluator) { result.clear(); for (VoidCalc voidCalc : voidCalcs) { voidCalc.evaluateVoid(evaluator); } return result.cloneList(-1); } } private static List compileSelf( Exp[] args, ExpCompiler compiler, List resultStyles) { List calcs = new ArrayList(args.length); for (Exp arg : args) { calcs.add(createCalc(arg, compiler, resultStyles)); } return calcs; } private static IterCalc createCalc( Exp arg, ExpCompiler compiler, List resultStyles) { final Type type = arg.getType(); if (type instanceof SetType) { final Calc calc = compiler.compileAs(arg, null, resultStyles); switch (calc.getResultStyle()) { case ITERABLE: final IterCalc iterCalc = (IterCalc) calc; return new AbstractIterCalc(arg, new Calc[]{calc}) { public TupleIterable evaluateIterable( Evaluator evaluator) { return iterCalc.evaluateIterable(evaluator); } protected String getName() { return "Sublist"; } }; case LIST: case MUTABLE_LIST: final ListCalc listCalc = (ListCalc) calc; return new AbstractIterCalc(arg, new Calc[]{calc}) { public TupleIterable evaluateIterable( Evaluator evaluator) { TupleList list = listCalc.evaluateList( evaluator); TupleList result = list.cloneList(list.size()); // Add only tuples which are not null. Tuples with // any null members are considered null. list: for (List members : list) { for (Member member : members) { if (member == null || member.isNull()) { continue list; } } result.add(members); } return result; } protected String getName() { return "Sublist"; } }; } throw ResultStyleException.generateBadType( ResultStyle.ITERABLE_LIST_MUTABLELIST, calc.getResultStyle()); } else if (TypeUtil.couldBeMember(type)) { final MemberCalc memberCalc = compiler.compileMember(arg); final ResolvedFunCall call = wrapAsSet(arg); return new AbstractIterCalc(call, new Calc[] {memberCalc}) { public TupleIterable evaluateIterable( Evaluator evaluator) { final Member member = memberCalc.evaluateMember(evaluator); return member == null ? TupleCollections.createList(1) : new UnaryTupleList(Collections.singletonList(member)); } protected String getName() { return "Sublist"; } }; } else { final TupleCalc tupleCalc = compiler.compileTuple(arg); final ResolvedFunCall call = wrapAsSet(arg); return new AbstractIterCalc(call, new Calc[] {tupleCalc}) { public TupleIterable evaluateIterable( Evaluator evaluator) { final Member[] members = tupleCalc.evaluateTuple(evaluator); return new ListTupleList( tupleCalc.getType().getArity(), Arrays.asList(members)); } protected String getName() { return "Sublist"; } }; } } /** * Creates a call to the set operator with a given collection of * expressions. * *

There must be at least one expression. Each expression may be a set of * members/tuples, or may be a member/tuple, but method assumes that * expressions have compatible types. * * @param args Expressions * @return Call to set operator */ public static ResolvedFunCall wrapAsSet(Exp... args) { assert args.length > 0; final int[] categories = new int[args.length]; Type type = null; for (int i = 0; i < args.length; i++) { final Exp arg = args[i]; categories[i] = arg.getCategory(); final Type argType = arg.getType(); if (argType instanceof SetType) { type = ((SetType) argType).getElementType(); } else { type = argType; } } return new ResolvedFunCall( new SetFunDef(Resolver, categories), args, new SetType(type)); } /** * Compiled expression that evaluates one or more expressions, each of which * yields a tuple or a set of tuples, and returns the result as a tuple * iterator. */ public static class ExprIterCalc extends AbstractIterCalc { private final IterCalc[] iterCalcs; public ExprIterCalc( Exp exp, Exp[] args, ExpCompiler compiler, List resultStyles) { super(exp, null); final List calcList = compileSelf(args, compiler, resultStyles); iterCalcs = calcList.toArray(new IterCalc[calcList.size()]); } // override return type public IterCalc[] getCalcs() { return iterCalcs; } public TupleIterable evaluateIterable( final Evaluator evaluator) { return new AbstractTupleIterable(getType().getArity()) { public TupleCursor tupleCursor() { return new AbstractTupleCursor(arity) { Iterator calcIterator = Arrays.asList(iterCalcs).iterator(); TupleCursor currentCursor = TupleCollections.emptyList(1).tupleCursor(); public boolean forward() { while (true) { if (currentCursor.forward()) { return true; } if (!calcIterator.hasNext()) { return false; } currentCursor = calcIterator.next() .evaluateIterable(evaluator) .tupleCursor(); } } public List current() { return currentCursor.current(); } @Override public void setContext(Evaluator evaluator) { currentCursor.setContext(evaluator); } @Override public void currentToArray( Member[] members, int offset) { currentCursor.currentToArray(members, offset); } @Override public Member member(int column) { return currentCursor.member(column); } }; } }; } } private static class ResolverImpl extends ResolverBase { public ResolverImpl() { super( "{}", "{ [, ...]}", "Brace operator constructs a set.", Syntax.Braces); } public FunDef resolve( Exp[] args, Validator validator, List conversions) { int[] parameterTypes = new int[args.length]; for (int i = 0; i < args.length; i++) { if (validator.canConvert( i, args[i], Category.Member, conversions)) { parameterTypes[i] = Category.Member; continue; } if (validator.canConvert( i, args[i], Category.Tuple, conversions)) { parameterTypes[i] = Category.Tuple; continue; } if (validator.canConvert( i, args[i], Category.Set, conversions)) { parameterTypes[i] = Category.Set; continue; } return null; } return new SetFunDef(this, parameterTypes); } } /** * Compiled expression that returns an empty list of members or tuples. */ private static class EmptyListCalc extends AbstractListCalc { private final TupleList list; /** * Creates an EmptyListCalc. * * @param call Expression which was compiled */ EmptyListCalc(ResolvedFunCall call) { super(call, new Calc[0]); list = TupleCollections.emptyList(call.getType().getArity()); } public TupleList evaluateList(Evaluator evaluator) { return list; } } } // End SetFunDef.java mondrian-3.11.0.1-R/src/main/mondrian/olap/fun/SetItemFunDef.java000066400000000000000000000244011261646570300243260ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.olap.fun; import mondrian.calc.*; import mondrian.calc.impl.AbstractMemberCalc; import mondrian.calc.impl.AbstractTupleCalc; import mondrian.mdx.ResolvedFunCall; import mondrian.olap.*; import mondrian.olap.type.*; import java.util.ArrayList; import java.util.List; /** * Definition of the <Set>.Item MDX function. * *

Syntax: *

* <Set>.Item(<Index>)
* <Set>.Item(<String Expression> [, ...]) *
* * @author jhyde * @since Mar 23, 2006 */ class SetItemFunDef extends FunDefBase { static final Resolver intResolver = new ReflectiveMultiResolver( "Item", ".Item()", "Returns a tuple from the set specified in . The tuple to be returned is specified by the zero-based position of the tuple in the set in .", new String[] {"mmxn"}, SetItemFunDef.class); static final Resolver stringResolver = new ResolverBase( "Item", ".Item( [, ...])", "Returns a tuple from the set specified in . The tuple to be returned is specified by the member name (or names) in .", Syntax.Method) { public FunDef resolve( Exp[] args, Validator validator, List conversions) { if (args.length < 1) { return null; } final Exp setExp = args[0]; if (!(setExp.getType() instanceof SetType)) { return null; } final SetType setType = (SetType) setExp.getType(); final int arity = setType.getArity(); // All args must be strings. for (int i = 1; i < args.length; i++) { if (!validator.canConvert( i, args[i], Category.String, conversions)) { return null; } } if (args.length - 1 != arity) { throw Util.newError( "Argument count does not match set's cardinality " + arity); } final int category = arity == 1 ? Category.Member : Category.Tuple; FunDef dummy = createDummyFunDef(this, category, args); return new SetItemFunDef(dummy); } }; public SetItemFunDef(FunDef dummyFunDef) { super(dummyFunDef); } public Type getResultType(Validator validator, Exp[] args) { SetType setType = (SetType) args[0].getType(); return setType.getElementType(); } public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) { final ListCalc listCalc = compiler.compileList(call.getArg(0)); final Type elementType = ((SetType) listCalc.getType()).getElementType(); final boolean isString = call.getArgCount() < 2 || call.getArg(1).getType() instanceof StringType; final IntegerCalc indexCalc; final StringCalc[] stringCalcs; List calcList = new ArrayList(); calcList.add(listCalc); if (isString) { indexCalc = null; stringCalcs = new StringCalc[call.getArgCount() - 1]; for (int i = 0; i < stringCalcs.length; i++) { stringCalcs[i] = compiler.compileString(call.getArg(i + 1)); calcList.add(stringCalcs[i]); } } else { stringCalcs = null; indexCalc = compiler.compileInteger(call.getArg(1)); calcList.add(indexCalc); } Calc[] calcs = calcList.toArray(new Calc[calcList.size()]); if (elementType instanceof TupleType) { final TupleType tupleType = (TupleType) elementType; final Member[] nullTuple = makeNullTuple(tupleType); if (isString) { return new AbstractTupleCalc(call, calcs) { public Member[] evaluateTuple(Evaluator evaluator) { final int savepoint = evaluator.savepoint(); final TupleList list; try { evaluator.setNonEmpty(false); list = listCalc.evaluateList(evaluator); assert list != null; } finally { evaluator.restore(savepoint); } try { String[] results = new String[stringCalcs.length]; for (int i = 0; i < stringCalcs.length; i++) { results[i] = stringCalcs[i].evaluateString(evaluator); } listLoop: for (List members : list) { for (int j = 0; j < results.length; j++) { String result = results[j]; final Member member = members.get(j); if (!matchMember(member, result)) { continue listLoop; } } // All members match. Return the current one. return members.toArray( new Member[members.size()]); } } finally { evaluator.restore(savepoint); } // We use 'null' to represent the null tuple. Don't // know why. return null; } }; } else { return new AbstractTupleCalc(call, calcs) { public Member[] evaluateTuple(Evaluator evaluator) { final int savepoint = evaluator.savepoint(); final TupleList list; try { evaluator.setNonEmpty(false); list = listCalc.evaluateList(evaluator); } finally { evaluator.restore(savepoint); } assert list != null; try { final int index = indexCalc.evaluateInteger(evaluator); int listSize = list.size(); if (index >= listSize || index < 0) { return nullTuple; } else { final List members = list.get(index); return members.toArray( new Member[members.size()]); } } finally { evaluator.restore(savepoint); } } }; } } else { final MemberType memberType = (MemberType) elementType; final Member nullMember = makeNullMember(memberType); if (isString) { return new AbstractMemberCalc(call, calcs) { public Member evaluateMember(Evaluator evaluator) { final int savepoint = evaluator.savepoint(); final List list; try { evaluator.setNonEmpty(false); list = listCalc.evaluateList(evaluator).slice(0); assert list != null; } finally { evaluator.restore(savepoint); } try { final String result = stringCalcs[0].evaluateString(evaluator); for (Member member : list) { if (matchMember(member, result)) { return member; } } return nullMember; } finally { evaluator.restore(savepoint); } } }; } else { return new AbstractMemberCalc(call, calcs) { public Member evaluateMember(Evaluator evaluator) { final int savepoint = evaluator.savepoint(); final List list; try { evaluator.setNonEmpty(false); list = listCalc.evaluateList(evaluator).slice(0); assert list != null; } finally { evaluator.restore(savepoint); } try { final int index = indexCalc.evaluateInteger(evaluator); int listSize = list.size(); if (index >= listSize || index < 0) { return nullMember; } else { return list.get(index); } } finally { evaluator.restore(savepoint); } } }; } } } private static boolean matchMember(final Member member, String name) { return member.getName().equals(name); } } // End SetItemFunDef.java mondrian-3.11.0.1-R/src/main/mondrian/olap/fun/SetToStrFunDef.java000066400000000000000000000044601261646570300245060ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.olap.fun; import mondrian.calc.*; import mondrian.calc.impl.AbstractStringCalc; import mondrian.mdx.ResolvedFunCall; import mondrian.olap.*; import java.util.List; /** * Definition of the SetToStr MDX function. * * @author jhyde * @since Aug 3, 2006 */ class SetToStrFunDef extends FunDefBase { public static final FunDefBase instance = new SetToStrFunDef(); private SetToStrFunDef() { super("SetToStr", "Constructs a string from a set.", "fSx"); } public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) { Exp arg = call.getArg(0); final ListCalc listCalc = compiler.compileList(arg); return new AbstractStringCalc(call, new Calc[]{listCalc}) { public String evaluateString(Evaluator evaluator) { final TupleList list = listCalc.evaluateList(evaluator); if (list.getArity() == 1) { return memberSetToStr(list.slice(0)); } else { return tupleSetToStr(list); } } }; } static String memberSetToStr(List list) { StringBuilder buf = new StringBuilder(); buf.append("{"); int k = 0; for (Member member : list) { if (k++ > 0) { buf.append(", "); } buf.append(member.getUniqueName()); } buf.append("}"); return buf.toString(); } static String tupleSetToStr(TupleList list) { StringBuilder buf = new StringBuilder(); buf.append("{"); int k = 0; Member[] members = new Member[list.getArity()]; final TupleCursor cursor = list.tupleCursor(); while (cursor.forward()) { if (k++ > 0) { buf.append(", "); } cursor.currentToArray(members, 0); appendTuple(buf, members); } buf.append("}"); return buf.toString(); } } // End SetToStrFunDef.java mondrian-3.11.0.1-R/src/main/mondrian/olap/fun/SimpleResolver.java000066400000000000000000000036171261646570300246450ustar00rootroot00000000000000/* // This software is subject to the terms of the Eclipse Public License v1.0 // Agreement, available at the following URL: // http://www.eclipse.org/legal/epl-v10.html. // You must accept the terms of that agreement to use this software. // // Copyright (C) 2002-2005 Julian Hyde // Copyright (C) 2005-2011 Pentaho and others // All Rights Reserved. */ package mondrian.olap.fun; import mondrian.olap.*; import java.util.List; /** * A SimpleResolver resolves a single, non-overloaded function. * * @author jhyde * @since 3 March, 2002 */ class SimpleResolver implements Resolver { private final FunDef funDef; SimpleResolver(FunDef funDef) { this.funDef = funDef; } public FunDef getFunDef() { return funDef; } public String getName() { return funDef.getName(); } public String getDescription() { return funDef.getDescription(); } public String getSignature() { return funDef.getSignature(); } public Syntax getSyntax() { return funDef.getSyntax(); } public String[] getReservedWords() { return FunUtil.emptyStringArray; } public FunDef resolve( Exp[] args, Validator validator, List conversions) { int[] parameterTypes = funDef.getParameterCategories(); if (parameterTypes.length != args.length) { return null; } for (int i = 0; i < args.length; i++) { if (!validator.canConvert( i, args[i], parameterTypes[i], conversions)) { return null; } } return funDef; } public boolean requiresExpression(int k) { int[] parameterTypes = funDef.getParameterCategories(); return (k >= parameterTypes.length) || (parameterTypes[k] != Category.Set); } } // End SimpleResolver.java mondrian-3.11.0.1-R/src/main/mondrian/olap/fun/StdevFunDef.java000066400000000000000000000047711261646570300240510ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.olap.fun; import mondrian.calc.*; import mondrian.calc.impl.AbstractDoubleCalc; import mondrian.calc.impl.ValueCalc; import mondrian.mdx.ResolvedFunCall; import mondrian.olap.*; /** * Definition of the Stdev builtin MDX function, and its alias * Stddev. * * @author jhyde * @since Mar 23, 2006 */ class StdevFunDef extends AbstractAggregateFunDef { static final ReflectiveMultiResolver StdevResolver = new ReflectiveMultiResolver( "Stdev", "Stdev([, ])", "Returns the standard deviation of a numeric expression evaluated over a set (unbiased).", new String[]{"fnx", "fnxn"}, StdevFunDef.class); static final ReflectiveMultiResolver StddevResolver = new ReflectiveMultiResolver( "Stddev", "Stddev([, ])", "Alias for Stdev.", new String[]{"fnx", "fnxn"}, StdevFunDef.class); public StdevFunDef(FunDef dummyFunDef) { super(dummyFunDef); } public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) { final ListCalc listCalc = compiler.compileList(call.getArg(0)); final Calc calc = call.getArgCount() > 1 ? compiler.compileScalar(call.getArg(1), true) : new ValueCalc(call); return new AbstractDoubleCalc(call, new Calc[] {listCalc, calc}) { public double evaluateDouble(Evaluator evaluator) { TupleList memberList = evaluateCurrentList(listCalc, evaluator); final int savepoint = evaluator.savepoint(); try { evaluator.setNonEmpty(false); final double stdev = (Double) stdev( evaluator, memberList, calc, false); return stdev; } finally { evaluator.restore(savepoint); } } public boolean dependsOn(Hierarchy hierarchy) { return anyDependsButFirst(getCalcs(), hierarchy); } }; } } // End StdevFunDef.java mondrian-3.11.0.1-R/src/main/mondrian/olap/fun/StdevPFunDef.java000066400000000000000000000047371261646570300241730ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.olap.fun; import mondrian.calc.*; import mondrian.calc.impl.AbstractDoubleCalc; import mondrian.calc.impl.ValueCalc; import mondrian.mdx.ResolvedFunCall; import mondrian.olap.*; /** * Definition of the StdevP builtin MDX function, and its alias * StddevP. * * @author jhyde * @since Mar 23, 2006 */ class StdevPFunDef extends AbstractAggregateFunDef { static final Resolver StdevpResolver = new ReflectiveMultiResolver( "StdevP", "StdevP([, ])", "Returns the standard deviation of a numeric expression evaluated over a set (biased).", new String[]{"fnx", "fnxn"}, StdevPFunDef.class); static final Resolver StddevpResolver = new ReflectiveMultiResolver( "StddevP", "StddevP([, ])", "Alias for StdevP.", new String[]{"fnx", "fnxn"}, StdevPFunDef.class); public StdevPFunDef(FunDef dummyFunDef) { super(dummyFunDef); } public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) { final ListCalc listCalc = compiler.compileList(call.getArg(0)); final Calc calc = call.getArgCount() > 1 ? compiler.compileScalar(call.getArg(1), true) : new ValueCalc(call); return new AbstractDoubleCalc(call, new Calc[] {listCalc, calc}) { public double evaluateDouble(Evaluator evaluator) { final int savepoint = evaluator.savepoint(); try { evaluator.setNonEmpty(false); TupleList list = evaluateCurrentList(listCalc, evaluator); final double stdev = (Double) stdev( evaluator, list, calc, true); return stdev; } finally { evaluator.restore(savepoint); } } public boolean dependsOn(Hierarchy hierarchy) { return anyDependsButFirst(getCalcs(), hierarchy); } }; } } // End StdevPFunDef.java mondrian-3.11.0.1-R/src/main/mondrian/olap/fun/StrToMemberFunDef.java000066400000000000000000000032201261646570300251530ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.olap.fun; import mondrian.calc.*; import mondrian.calc.impl.AbstractMemberCalc; import mondrian.mdx.ResolvedFunCall; import mondrian.olap.*; import mondrian.resource.MondrianResource; /** * Definition of the StrToMember MDX function. * *

Syntax: *

StrToMember(<String Expression>) *
*/ class StrToMemberFunDef extends FunDefBase { public static final FunDef INSTANCE = new StrToMemberFunDef(); private StrToMemberFunDef() { super( "StrToMember", "Returns a member from a unique name String in MDX format.", "fmS"); } public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) { final StringCalc memberNameCalc = compiler.compileString(call.getArg(0)); return new AbstractMemberCalc(call, new Calc[] {memberNameCalc}) { public Member evaluateMember(Evaluator evaluator) { String memberName = memberNameCalc.evaluateString(evaluator); if (memberName == null) { throw newEvalException( MondrianResource.instance().NullValue.ex()); } return parseMember(evaluator, memberName, null); } }; } } // End StrToMemberFunDef.java mondrian-3.11.0.1-R/src/main/mondrian/olap/fun/StrToSetFunDef.java000066400000000000000000000144611261646570300245100ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.olap.fun; import mondrian.calc.*; import mondrian.calc.impl.AbstractListCalc; import mondrian.calc.impl.UnaryTupleList; import mondrian.mdx.*; import mondrian.olap.*; import mondrian.olap.type.*; import mondrian.resource.MondrianResource; import java.util.ArrayList; import java.util.List; /** * Definition of the StrToSet MDX builtin function. * * @author jhyde * @since Mar 23, 2006 */ class StrToSetFunDef extends FunDefBase { static final ResolverImpl Resolver = new ResolverImpl(); private StrToSetFunDef(int[] parameterTypes) { super( "StrToSet", " StrToSet([, ...])", "Constructs a set from a string expression.", Syntax.Function, Category.Set, parameterTypes); } public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) { final StringCalc stringCalc = compiler.compileString(call.getArg(0)); SetType type = (SetType) call.getType(); Type elementType = type.getElementType(); if (elementType instanceof MemberType) { final Hierarchy hierarchy = elementType.getHierarchy(); return new AbstractListCalc(call, new Calc[] {stringCalc}) { public TupleList evaluateList(Evaluator evaluator) { String string = stringCalc.evaluateString(evaluator); if (string == null) { throw newEvalException( MondrianResource.instance().NullValue.ex()); } return new UnaryTupleList( parseMemberList(evaluator, string, hierarchy)); } }; } else { TupleType tupleType = (TupleType) elementType; final List hierarchyList = tupleType.getHierarchies(); return new AbstractListCalc(call, new Calc[] {stringCalc}) { public TupleList evaluateList(Evaluator evaluator) { String string = stringCalc.evaluateString(evaluator); if (string == null) { throw newEvalException( MondrianResource.instance().NullValue.ex()); } return parseTupleList(evaluator, string, hierarchyList); } }; } } public Exp createCall(Validator validator, Exp[] args) { final int argCount = args.length; if (argCount <= 1) { throw MondrianResource.instance().MdxFuncArgumentsNum.ex(getName()); } for (int i = 1; i < argCount; i++) { final Exp arg = args[i]; if (arg instanceof DimensionExpr) { // if arg is a dimension, switch to dimension's default // hierarchy DimensionExpr dimensionExpr = (DimensionExpr) arg; Dimension dimension = dimensionExpr.getDimension(); args[i] = new HierarchyExpr(dimension.getHierarchy()); } else if (arg instanceof HierarchyExpr) { // nothing } else { throw MondrianResource.instance().MdxFuncNotHier.ex( i + 1, getName()); } } return super.createCall(validator, args); } public Type getResultType(Validator validator, Exp[] args) { switch (args.length) { case 1: // This is a call to the standard version of StrToSet, // which doesn't give us any hints about type. return new SetType(null); case 2: { final Type argType = args[1].getType(); return new SetType( new MemberType( argType.getDimension(), argType.getHierarchy(), argType.getLevel(), null)); } default: { // This is a call to Mondrian's extended version of // StrToSet, of the form // StrToSet(s, , ... , ) // // The result is a set of tuples // (, ... , ) final List list = new ArrayList(); for (int i = 1; i < args.length; i++) { Exp arg = args[i]; final Type argType = arg.getType(); list.add(TypeUtil.toMemberType(argType)); } final MemberType[] types = list.toArray(new MemberType[list.size()]); TupleType.checkHierarchies(types); return new SetType(new TupleType(types)); } } } private static class ResolverImpl extends ResolverBase { ResolverImpl() { super( "StrToSet", "StrToSet()", "Constructs a set from a string expression.", Syntax.Function); } public FunDef resolve( Exp[] args, Validator validator, List conversions) { if (args.length < 1) { return null; } Type type = args[0].getType(); if (!(type instanceof StringType) && !(type instanceof NullType)) { return null; } for (int i = 1; i < args.length; i++) { Exp exp = args[i]; if (!(exp instanceof DimensionExpr || exp instanceof HierarchyExpr)) { return null; } } int[] argTypes = new int[args.length]; argTypes[0] = Category.String; for (int i = 1; i < argTypes.length; i++) { argTypes[i] = Category.Hierarchy; } return new StrToSetFunDef(argTypes); } public FunDef getFunDef() { return new StrToSetFunDef(new int[] {Category.String}); } } } // End StrToSetFunDef.java mondrian-3.11.0.1-R/src/main/mondrian/olap/fun/StrToTupleFunDef.java000066400000000000000000000140721261646570300250440ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.olap.fun; import mondrian.calc.*; import mondrian.calc.impl.AbstractMemberCalc; import mondrian.calc.impl.AbstractTupleCalc; import mondrian.mdx.*; import mondrian.olap.*; import mondrian.olap.type.*; import mondrian.resource.MondrianResource; import java.util.ArrayList; import java.util.List; /** * Definition of the StrToTuple MDX function. * * @author jhyde * @since Mar 23, 2006 */ class StrToTupleFunDef extends FunDefBase { static final ResolverImpl Resolver = new ResolverImpl(); private StrToTupleFunDef(int[] parameterTypes) { super( "StrToTuple", null, "Constructs a tuple from a string.", Syntax.Function, Category.Tuple, parameterTypes); } public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) { final StringCalc stringCalc = compiler.compileString(call.getArg(0)); Type elementType = call.getType(); if (elementType instanceof MemberType) { final Hierarchy hierarchy = elementType.getHierarchy(); return new AbstractMemberCalc(call, new Calc[] {stringCalc}) { public Member evaluateMember(Evaluator evaluator) { String string = stringCalc.evaluateString(evaluator); if (string == null) { throw newEvalException( MondrianResource.instance().NullValue.ex()); } return parseMember(evaluator, string, hierarchy); } }; } else { TupleType tupleType = (TupleType) elementType; final List hierarchies = tupleType.getHierarchies(); return new AbstractTupleCalc(call, new Calc[] {stringCalc}) { public Member[] evaluateTuple(Evaluator evaluator) { String string = stringCalc.evaluateString(evaluator); if (string == null) { throw newEvalException( MondrianResource.instance().NullValue.ex()); } return parseTuple(evaluator, string, hierarchies); } }; } } public Exp createCall(Validator validator, Exp[] args) { final int argCount = args.length; if (argCount <= 1) { throw MondrianResource.instance().MdxFuncArgumentsNum.ex(getName()); } for (int i = 1; i < argCount; i++) { final Exp arg = args[i]; if (arg instanceof DimensionExpr) { // if arg is a dimension, switch to dimension's default // hierarchy DimensionExpr dimensionExpr = (DimensionExpr) arg; Dimension dimension = dimensionExpr.getDimension(); args[i] = new HierarchyExpr(dimension.getHierarchy()); } else if (arg instanceof HierarchyExpr) { // nothing } else { throw MondrianResource.instance().MdxFuncNotHier.ex( i + 1, getName()); } } return super.createCall(validator, args); } public Type getResultType(Validator validator, Exp[] args) { switch (args.length) { case 1: // This is a call to the standard version of StrToTuple, // which doesn't give us any hints about type. return new TupleType(null); case 2: final Type argType = args[1].getType(); return new MemberType( argType.getDimension(), argType.getHierarchy(), argType.getLevel(), null); default: { // This is a call to Mondrian's extended version of // StrToTuple, of the form // StrToTuple(s, , ... , ) // // The result is a tuple // (, ... , ) final List list = new ArrayList(); for (int i = 1; i < args.length; i++) { Exp arg = args[i]; final Type type = arg.getType(); list.add(TypeUtil.toMemberType(type)); } final MemberType[] types = list.toArray(new MemberType[list.size()]); TupleType.checkHierarchies(types); return new TupleType(types); } } } private static class ResolverImpl extends ResolverBase { ResolverImpl() { super( "StrToTuple", "StrToTuple()", "Constructs a tuple from a string.", Syntax.Function); } public FunDef resolve( Exp[] args, Validator validator, List conversions) { if (args.length < 1) { return null; } Type type = args[0].getType(); if (!(type instanceof StringType) && !(type instanceof NullType)) { return null; } for (int i = 1; i < args.length; i++) { Exp exp = args[i]; if (!(exp instanceof DimensionExpr || exp instanceof HierarchyExpr)) { return null; } } int[] argTypes = new int[args.length]; argTypes[0] = Category.String; for (int i = 1; i < argTypes.length; i++) { argTypes[i] = Category.Hierarchy; } return new StrToTupleFunDef(argTypes); } public FunDef getFunDef() { return new StrToTupleFunDef(new int[] {Category.String}); } } } // End StrToTupleFunDef.java mondrian-3.11.0.1-R/src/main/mondrian/olap/fun/SubsetFunDef.java000066400000000000000000000055141261646570300242250ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.olap.fun; import mondrian.calc.*; import mondrian.calc.impl.AbstractListCalc; import mondrian.mdx.ResolvedFunCall; import mondrian.olap.Evaluator; import mondrian.olap.FunDef; /** * Definition of the Subset MDX function. * * @author jhyde * @since Mar 23, 2006 */ class SubsetFunDef extends FunDefBase { static final ReflectiveMultiResolver Resolver = new ReflectiveMultiResolver( "Subset", "Subset(, [, ])", "Returns a subset of elements from a set.", new String[] {"fxxn", "fxxnn"}, SubsetFunDef.class); public SubsetFunDef(FunDef dummyFunDef) { super(dummyFunDef); } public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) { final ListCalc listCalc = compiler.compileList(call.getArg(0)); final IntegerCalc startCalc = compiler.compileInteger(call.getArg(1)); final IntegerCalc countCalc = call.getArgCount() > 2 ? compiler.compileInteger(call.getArg(2)) : null; return new AbstractListCalc( call, new Calc[] {listCalc, startCalc, countCalc}) { public TupleList evaluateList(Evaluator evaluator) { final int savepoint = evaluator.savepoint(); try { evaluator.setNonEmpty(false); final TupleList list = listCalc.evaluateList(evaluator); final int start = startCalc.evaluateInteger(evaluator); int end; if (countCalc != null) { final int count = countCalc.evaluateInteger(evaluator); end = start + count; } else { end = list.size(); } if (end > list.size()) { end = list.size(); } if (start >= end || start < 0) { return TupleCollections.emptyList(list.getArity()); } if (start == 0 && end == list.size()) { return list; } assert 0 <= start; assert start < end; assert end <= list.size(); return list.subList(start, end); } finally { evaluator.restore(savepoint); } } }; } } // End SubsetFunDef.java mondrian-3.11.0.1-R/src/main/mondrian/olap/fun/SumFunDef.java000066400000000000000000000113011261646570300235130ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.olap.fun; import mondrian.calc.*; import mondrian.calc.impl.AbstractDoubleCalc; import mondrian.calc.impl.ValueCalc; import mondrian.mdx.ResolvedFunCall; import mondrian.olap.*; /** * Definition of the Sum MDX function. * * @author jhyde * @since Mar 23, 2006 */ class SumFunDef extends AbstractAggregateFunDef { static final ReflectiveMultiResolver Resolver = new ReflectiveMultiResolver( "Sum", "Sum([, ])", "Returns the sum of a numeric expression evaluated over a set.", new String[]{"fnx", "fnxn"}, SumFunDef.class); public SumFunDef(FunDef dummyFunDef) { super(dummyFunDef); } public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) { // What is the desired type to use to get the underlying values for (ResultStyle r : compiler.getAcceptableResultStyles()) { Calc calc; switch (r) { case ITERABLE: case ANY: // Consumer wants ITERABLE or ANY to be used //return compileCallIterable(call, compiler); calc = compileCall(call, compiler, ResultStyle.ITERABLE); if (calc != null) { return calc; } break; case MUTABLE_LIST: // Consumer wants MUTABLE_LIST calc = compileCall(call, compiler, ResultStyle.MUTABLE_LIST); if (calc != null) { return calc; } break; case LIST: // Consumer wants LIST to be used //return compileCallList(call, compiler); calc = compileCall(call, compiler, ResultStyle.LIST); if (calc != null) { return calc; } break; } } throw ResultStyleException.generate( ResultStyle.ITERABLE_LIST_MUTABLELIST_ANY, compiler.getAcceptableResultStyles()); } protected Calc compileCall( final ResolvedFunCall call, ExpCompiler compiler, ResultStyle resultStyle) { final Calc ncalc = compiler.compileIter(call.getArg(0)); if (ncalc == null) { return null; } final Calc calc = call.getArgCount() > 1 ? compiler.compileScalar(call.getArg(1), true) : new ValueCalc(call); // we may have asked for one sort of Calc, but here's what we got. if (ncalc instanceof ListCalc) { return genListCalc(call, (ListCalc) ncalc, calc); } else { return genIterCalc(call, (IterCalc) ncalc, calc); } } protected Calc genIterCalc( final ResolvedFunCall call, final IterCalc iterCalc, final Calc calc) { return new AbstractDoubleCalc(call, new Calc[] {iterCalc, calc}) { public double evaluateDouble(Evaluator evaluator) { TupleIterable iterable = evaluateCurrentIterable(iterCalc, evaluator); final int savepoint = evaluator.savepoint(); try { return sumDouble(evaluator, iterable, calc); } finally { evaluator.restore(savepoint); } } public boolean dependsOn(Hierarchy hierarchy) { return anyDependsButFirst(getCalcs(), hierarchy); } }; } protected Calc genListCalc( final ResolvedFunCall call, final ListCalc listCalc, final Calc calc) { return new AbstractDoubleCalc(call, new Calc[] {listCalc, calc}) { public double evaluateDouble(Evaluator evaluator) { TupleList memberList = evaluateCurrentList(listCalc, evaluator); final int savepoint = evaluator.savepoint(); try { evaluator.setNonEmpty(false); return sumDouble( evaluator, memberList, calc); } finally { evaluator.restore(savepoint); } } public boolean dependsOn(Hierarchy hierarchy) { return anyDependsButFirst(getCalcs(), hierarchy); } }; } } // End SumFunDef.java mondrian-3.11.0.1-R/src/main/mondrian/olap/fun/ToggleDrillStateFunDef.java000066400000000000000000000103041261646570300261620ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.olap.fun; import mondrian.calc.*; import mondrian.calc.impl.AbstractListCalc; import mondrian.mdx.ResolvedFunCall; import mondrian.olap.*; import mondrian.resource.MondrianResource; import java.util.*; /** * Definition of the ToggleDrillState MDX function. * * @author jhyde * @since Mar 23, 2006 */ class ToggleDrillStateFunDef extends FunDefBase { static final String[] ReservedWords = new String[] {"RECURSIVE"}; static final ReflectiveMultiResolver Resolver = new ReflectiveMultiResolver( "ToggleDrillState", "ToggleDrillState(, [, RECURSIVE])", "Toggles the drill state of members. This function is a combination of DrillupMember and DrilldownMember.", new String[]{"fxxx", "fxxxy"}, ToggleDrillStateFunDef.class, ReservedWords); public ToggleDrillStateFunDef(FunDef dummyFunDef) { super(dummyFunDef); } public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) { if (call.getArgCount() > 2) { throw MondrianResource.instance() .ToggleDrillStateRecursiveNotSupported.ex(); } final ListCalc listCalc0 = compiler.compileList(call.getArg(0)); final ListCalc listCalc1 = compiler.compileList(call.getArg(1)); return new AbstractListCalc(call, new Calc[]{listCalc0, listCalc1}) { public TupleList evaluateList(Evaluator evaluator) { final TupleList list0 = listCalc0.evaluateList(evaluator); final TupleList list1 = listCalc1.evaluateList(evaluator); return toggleDrillStateTuples(evaluator, list0, list1); } }; } TupleList toggleDrillStateTuples( Evaluator evaluator, TupleList v0, TupleList list1) { assert list1.getArity() == 1; if (list1.isEmpty()) { return v0; } if (v0.isEmpty()) { return v0; } final Member[] members = new Member[v0.getArity()]; // tuple workspace final Set set = new HashSet(list1.slice(0)); TupleList result = v0.cloneList((v0.size() * 3) / 2 + 1); // allow 50% int i = 0, n = v0.size(); while (i < n) { List o = v0.get(i++); result.add(o); Member m = null; int k = -1; for (int j = 0; j < o.size(); j++) { Member member = o.get(j); if (set.contains(member)) { k = j; m = member; break; } } if (k == -1) { continue; } boolean isDrilledDown = false; if (i < n) { List next = v0.get(i); Member nextMember = next.get(k); boolean strict = true; if (FunUtil.isAncestorOf(m, nextMember, strict)) { isDrilledDown = true; } } if (isDrilledDown) { // skip descendants of this member do { List next = v0.get(i); Member nextMember = next.get(k); boolean strict = true; if (FunUtil.isAncestorOf(m, nextMember, strict)) { i++; } else { break; } } while (i < n); } else { List children = evaluator.getSchemaReader().getMemberChildren(m); for (Member child : children) { o.toArray(members); members[k] = child; result.addTuple(members); } } } return result; } } // End ToggleDrillStateFunDef.java mondrian-3.11.0.1-R/src/main/mondrian/olap/fun/TopBottomCountFunDef.java000066400000000000000000000154361261646570300257240ustar00rootroot00000000000000/* // This software is subject to the terms of the Eclipse Public License v1.0 // Agreement, available at the following URL: // http://www.eclipse.org/legal/epl-v10.html. // You must accept the terms of that agreement to use this software. // // Copyright (C) 2002-2005 Julian Hyde // Copyright (C) 2005-2012 Pentaho and others // All Rights Reserved. */ package mondrian.olap.fun; import mondrian.calc.*; import mondrian.calc.impl.*; import mondrian.mdx.ResolvedFunCall; import mondrian.olap.*; import java.util.AbstractList; import java.util.List; /** * Definition of the TopCount and BottomCount * MDX builtin functions. * * @author jhyde * @since Mar 23, 2006 */ class TopBottomCountFunDef extends FunDefBase { boolean top; static final MultiResolver TopCountResolver = new MultiResolver( "TopCount", "TopCount(, [, ])", "Returns a specified number of items from the top of a set, optionally ordering the set first.", new String[]{"fxxnn", "fxxn"}) { protected FunDef createFunDef(Exp[] args, FunDef dummyFunDef) { return new TopBottomCountFunDef(dummyFunDef, true); } }; static final MultiResolver BottomCountResolver = new MultiResolver( "BottomCount", "BottomCount(, [, ])", "Returns a specified number of items from the bottom of a set, optionally ordering the set first.", new String[]{"fxxnn", "fxxn"}) { protected FunDef createFunDef(Exp[] args, FunDef dummyFunDef) { return new TopBottomCountFunDef(dummyFunDef, false); } }; public TopBottomCountFunDef(FunDef dummyFunDef, final boolean top) { super(dummyFunDef); this.top = top; } public Calc compileCall(final ResolvedFunCall call, ExpCompiler compiler) { // Compile the member list expression. Ask for a mutable list, because // we're going to sort it later. final ListCalc listCalc = compiler.compileList(call.getArg(0), true); final IntegerCalc integerCalc = compiler.compileInteger(call.getArg(1)); final Calc orderCalc = call.getArgCount() > 2 ? compiler.compileScalar(call.getArg(2), true) : null; final int arity = call.getType().getArity(); return new AbstractListCalc( call, new Calc[]{listCalc, integerCalc, orderCalc}) { public TupleList evaluateList(Evaluator evaluator) { // Use a native evaluator, if more efficient. // TODO: Figure this out at compile time. SchemaReader schemaReader = evaluator.getSchemaReader(); NativeEvaluator nativeEvaluator = schemaReader.getNativeSetEvaluator( call.getFunDef(), call.getArgs(), evaluator, this); if (nativeEvaluator != null) { return (TupleList) nativeEvaluator.execute(ResultStyle.LIST); } int n = integerCalc.evaluateInteger(evaluator); if (n == 0 || n == mondrian.olap.fun.FunUtil.IntegerNull) { return TupleCollections.emptyList(arity); } TupleList list = listCalc.evaluateList(evaluator); assert list.getArity() == arity; if (list.isEmpty()) { return list; } if (orderCalc == null) { // REVIEW: Why require "instanceof AbstractList"? if (list instanceof AbstractList && list.size() <= n) { return list; } else { return list.subList(0, n); } } return partiallySortList( evaluator, list, hasHighCardDimension(list), Math.min(n, list.size())); } private TupleList partiallySortList( Evaluator evaluator, TupleList list, boolean highCard, int n) { assert list.size() > 0; assert n <= list.size(); if (highCard) { // sort list in chunks, collect the results final int chunkSize = 6400; // what is this really? TupleList allChunkResults = TupleCollections.createList( arity); for (int i = 0, next; i < list.size(); i = next) { next = Math.min(i + chunkSize, list.size()); final TupleList chunk = list.subList(i, next); TupleList chunkResult = partiallySortList( evaluator, chunk, false, n); allChunkResults.addAll(chunkResult); } // one last sort, to merge and cull return partiallySortList( evaluator, allChunkResults, false, n); } // normal case: no need for chunks final int savepoint = evaluator.savepoint(); try { switch (list.getArity()) { case 1: final List members = partiallySortMembers( evaluator.push(), list.slice(0), orderCalc, n, top); return new UnaryTupleList(members); default: final List> tuples = partiallySortTuples( evaluator.push(), list, orderCalc, n, top); return new DelegatingTupleList( list.getArity(), tuples); } } finally { evaluator.restore(savepoint); } } public boolean dependsOn(Hierarchy hierarchy) { return anyDependsButFirst(getCalcs(), hierarchy); } private boolean hasHighCardDimension(TupleList l) { final List trial = l.get(0); for (Member m : trial) { if (m.getHierarchy().getDimension().isHighCardinality()) { return true; } } return false; } }; } } // End TopBottomCountFunDef.java mondrian-3.11.0.1-R/src/main/mondrian/olap/fun/TopBottomPercentSumFunDef.java000066400000000000000000000145271261646570300267210ustar00rootroot00000000000000/* // This software is subject to the terms of the Eclipse Public License v1.0 // Agreement, available at the following URL: // http://www.eclipse.org/legal/epl-v10.html. // You must accept the terms of that agreement to use this software. // // Copyright (C) 2002-2005 Julian Hyde // Copyright (C) 2005-2015 Pentaho and others // All Rights Reserved. */ package mondrian.olap.fun; import mondrian.calc.*; import mondrian.calc.impl.AbstractListCalc; import mondrian.mdx.ResolvedFunCall; import mondrian.olap.*; import java.util.List; import java.util.Map; /** * Definition of the TopPercent, BottomPercent, * TopSum and BottomSum MDX builtin functions. * * @author jhyde * @since Mar 23, 2006 */ class TopBottomPercentSumFunDef extends FunDefBase { /** * Whether to calculate top (as opposed to bottom). */ final boolean top; /** * Whether to calculate percent (as opposed to sum). */ final boolean percent; static final ResolverImpl TopPercentResolver = new ResolverImpl( "TopPercent", "TopPercent(, , )", "Sorts a set and returns the top N elements whose cumulative total is at least a specified percentage.", new String[]{"fxxnn"}, true, true); static final ResolverImpl BottomPercentResolver = new ResolverImpl( "BottomPercent", "BottomPercent(, , )", "Sorts a set and returns the bottom N elements whose cumulative total is at least a specified percentage.", new String[]{"fxxnn"}, false, true); static final ResolverImpl TopSumResolver = new ResolverImpl( "TopSum", "TopSum(, , )", "Sorts a set and returns the top N elements whose cumulative total is at least a specified value.", new String[]{"fxxnn"}, true, false); static final ResolverImpl BottomSumResolver = new ResolverImpl( "BottomSum", "BottomSum(, , )", "Sorts a set and returns the bottom N elements whose cumulative total is at least a specified value.", new String[]{"fxxnn"}, false, false); public TopBottomPercentSumFunDef( FunDef dummyFunDef, boolean top, boolean percent) { super(dummyFunDef); this.top = top; this.percent = percent; } public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) { final ListCalc listCalc = compiler.compileList(call.getArg(0), true); final DoubleCalc doubleCalc = compiler.compileDouble(call.getArg(1)); final Calc calc = compiler.compileScalar(call.getArg(2), true); return new CalcImpl(call, listCalc, doubleCalc, calc); } private static class ResolverImpl extends MultiResolver { private final boolean top; private final boolean percent; public ResolverImpl( final String name, final String signature, final String description, final String[] signatures, boolean top, boolean percent) { super(name, signature, description, signatures); this.top = top; this.percent = percent; } protected FunDef createFunDef(Exp[] args, FunDef dummyFunDef) { return new TopBottomPercentSumFunDef(dummyFunDef, top, percent); } } private class CalcImpl extends AbstractListCalc { private final ListCalc listCalc; private final DoubleCalc doubleCalc; private final Calc calc; public CalcImpl( ResolvedFunCall call, ListCalc listCalc, DoubleCalc doubleCalc, Calc calc) { super(call, new Calc[]{listCalc, doubleCalc, calc}); this.listCalc = listCalc; this.doubleCalc = doubleCalc; this.calc = calc; } public TupleList evaluateList(Evaluator evaluator) { TupleList list = listCalc.evaluateList(evaluator); double target = doubleCalc.evaluateDouble(evaluator); if (list.isEmpty()) { return list; } Map, Object> mapMemberToValue = evaluateTuples(evaluator, calc, list); final int savepoint = evaluator.savepoint(); try { evaluator.setNonEmpty(false); list = sortTuples( evaluator, list, list, calc, top, true, getType().getArity()); } finally { evaluator.restore(savepoint); } if (percent) { toPercent(list, mapMemberToValue); } double runningTotal = 0; int memberCount = list.size(); int nullCount = 0; for (int i = 0; i < memberCount; i++) { if (runningTotal >= target) { list = list.subList(0, i); break; } final List key = list.get(i); final Object o = mapMemberToValue.get(key); if (o == Util.nullValue) { nullCount++; } else if (o instanceof Number) { runningTotal += ((Number) o).doubleValue(); } else if (o instanceof Exception) { // ignore the error } else { throw Util.newInternal( "got " + o + " when expecting Number"); } } // MSAS exhibits the following behavior. If the value of all members // is null, then the first (or last) member of the set is returned // for percent operations. if (memberCount > 0 && percent && nullCount == memberCount) { return top ? list.subList(0, 1) : list.subList(memberCount - 1, memberCount); } return list; } public boolean dependsOn(Hierarchy hierarchy) { return anyDependsButFirst(getCalcs(), hierarchy); } } } // End TopBottomPercentSumFunDef.java mondrian-3.11.0.1-R/src/main/mondrian/olap/fun/TupleFunDef.java000066400000000000000000000120021261646570300240370ustar00rootroot00000000000000/* // This software is subject to the terms of the Eclipse Public License v1.0 // Agreement, available at the following URL: // http://www.eclipse.org/legal/epl-v10.html. // You must accept the terms of that agreement to use this software. // // Copyright (C) 2002-2005 Julian Hyde // Copyright (C) 2005-2011 Pentaho and others // All Rights Reserved. */ package mondrian.olap.fun; import mondrian.calc.*; import mondrian.calc.impl.AbstractTupleCalc; import mondrian.mdx.ResolvedFunCall; import mondrian.olap.*; import mondrian.olap.type.*; import java.io.PrintWriter; import java.util.List; /** * TupleFunDef implements the '(...)' operator which builds * tuples, as in ([Time].CurrentMember, * [Stores].[USA].[California]). * * @author jhyde * @since 3 March, 2002 */ public class TupleFunDef extends FunDefBase { private final int[] argTypes; static final ResolverImpl Resolver = new ResolverImpl(); private TupleFunDef(int[] argTypes) { super( "()", "( [, ]...)", "Parenthesis operator constructs a tuple. If there is only one member, the expression is equivalent to the member expression.", Syntax.Parentheses, Category.Tuple, argTypes); this.argTypes = argTypes; } public int getReturnCategory() { return Category.Tuple; } public int[] getParameterCategories() { return argTypes; } public void unparse(Exp[] args, PrintWriter pw) { ExpBase.unparseList(pw, args, "(", ", ", ")"); } public Type getResultType(Validator validator, Exp[] args) { // _Tuple([,]...), which is written // ([,]...), has type [Hie1] x ... x [HieN]. // // If there is only one member, it merely represents a parenthesized // expression, whose Hierarchy is that of the member. if (args.length == 1) { return TypeUtil.toMemberType(args[0].getType()); } else { MemberType[] types = new MemberType[args.length]; for (int i = 0; i < args.length; i++) { Exp arg = args[i]; types[i] = TypeUtil.toMemberType(arg.getType()); } TupleType.checkHierarchies(types); return new TupleType(types); } } public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) { final Exp[] args = call.getArgs(); final MemberCalc[] memberCalcs = new MemberCalc[args.length]; for (int i = 0; i < args.length; i++) { memberCalcs[i] = compiler.compileMember(args[i]); } return new CalcImpl(call, memberCalcs); } public static class CalcImpl extends AbstractTupleCalc { private final MemberCalc[] memberCalcs; public CalcImpl(ResolvedFunCall call, MemberCalc[] memberCalcs) { super(call, memberCalcs); this.memberCalcs = memberCalcs; } public Member[] evaluateTuple(Evaluator evaluator) { final Member[] members = new Member[memberCalcs.length]; for (int i = 0; i < members.length; i++) { final Member member = members[i] = memberCalcs[i].evaluateMember(evaluator); if (member == null || member.isNull()) { return null; } } return members; } public MemberCalc[] getMemberCalcs() { return memberCalcs; } } private static class ResolverImpl extends ResolverBase { public ResolverImpl() { super("()", null, null, Syntax.Parentheses); } public FunDef resolve( Exp[] args, Validator validator, List conversions) { // Compare with TupleFunDef.getReturnCategory(). For example, // ([Gender].members) is a set, // ([Gender].[M]) is a member, // (1 + 2) is a numeric, // but // ([Gender].[M], [Marital Status].[S]) is a tuple. if (args.length == 1) { return new ParenthesesFunDef(args[0].getCategory()); } else { final int[] argTypes = new int[args.length]; for (int i = 0; i < args.length; i++) { // Arg must be a member: // OK: ([Gender].[S], [Time].[1997]) (member, member) // OK: ([Gender], [Time]) (dimension, dimension) // Not OK: // ([Gender].[S], [Store].[Store City]) (member, level) if (!validator.canConvert( i, args[i], Category.Member, conversions)) { return null; } argTypes[i] = Category.Member; } return new TupleFunDef(argTypes); } } } } // End TupleFunDef.java mondrian-3.11.0.1-R/src/main/mondrian/olap/fun/TupleItemFunDef.java000066400000000000000000000067221261646570300246720ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.olap.fun; import mondrian.calc.*; import mondrian.calc.impl.AbstractMemberCalc; import mondrian.mdx.ResolvedFunCall; import mondrian.olap.*; import mondrian.olap.type.*; /** * Definition of the <Tuple>.Item MDX function. * *

Syntax: *

* <Tuple>.Item(<Index>)
*
* * @author jhyde * @since Mar 23, 2006 */ class TupleItemFunDef extends FunDefBase { static final TupleItemFunDef instance = new TupleItemFunDef(); private TupleItemFunDef() { super( "Item", "Returns a member from the tuple specified in . The member to be returned is specified by the zero-based position of the member in the set in .", "mmtn"); } public Type getResultType(Validator validator, Exp[] args) { // Suppose we are called as follows: // ([Gender].CurrentMember, [Store].CurrentMember).Item(n) // // We know that our result is a member type, but we don't // know which dimension. return MemberType.Unknown; } public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) { final Type type = call.getArg(0).getType(); if (type instanceof MemberType) { final MemberCalc memberCalc = compiler.compileMember(call.getArg(0)); final IntegerCalc indexCalc = compiler.compileInteger(call.getArg(1)); return new AbstractMemberCalc( call, new Calc[] {memberCalc, indexCalc}) { public Member evaluateMember(Evaluator evaluator) { final Member member = memberCalc.evaluateMember(evaluator); final int index = indexCalc.evaluateInteger(evaluator); if (index != 0) { return null; } return member; } }; } else { final TupleCalc tupleCalc = compiler.compileTuple(call.getArg(0)); final IntegerCalc indexCalc = compiler.compileInteger(call.getArg(1)); return new AbstractMemberCalc( call, new Calc[] {tupleCalc, indexCalc}) { final Member[] nullTupleMembers = makeNullTuple((TupleType) tupleCalc.getType()); public Member evaluateMember(Evaluator evaluator) { final Member[] members = tupleCalc.evaluateTuple(evaluator); assert members == null || members.length == nullTupleMembers.length; final int index = indexCalc.evaluateInteger(evaluator); if (members == null) { return nullTupleMembers[index]; } if (index >= members.length || index < 0) { return null; } return members[index]; } }; } } } // End TupleItemFunDef.java mondrian-3.11.0.1-R/src/main/mondrian/olap/fun/TupleToStrFunDef.java000066400000000000000000000046501261646570300250450ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.olap.fun; import mondrian.calc.*; import mondrian.calc.impl.AbstractStringCalc; import mondrian.mdx.ResolvedFunCall; import mondrian.olap.Evaluator; import mondrian.olap.Member; import mondrian.olap.type.TypeUtil; /** * Definition of the TupleToStr MDX function. * *

Syntax: *

* TupleToStr(<Tuple>) *
* * @author jhyde * @since Aug 3, 2006 */ class TupleToStrFunDef extends FunDefBase { static final TupleToStrFunDef instance = new TupleToStrFunDef(); private TupleToStrFunDef() { super("TupleToStr", "Constructs a string from a tuple.", "fSt"); } public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) { if (TypeUtil.couldBeMember(call.getArg(0).getType())) { final MemberCalc memberCalc = compiler.compileMember(call.getArg(0)); return new AbstractStringCalc(call, new Calc[] {memberCalc}) { public String evaluateString(Evaluator evaluator) { final Member member = memberCalc.evaluateMember(evaluator); if (member.isNull()) { return ""; } StringBuilder buf = new StringBuilder(); buf.append(member.getUniqueName()); return buf.toString(); } }; } else { final TupleCalc tupleCalc = compiler.compileTuple(call.getArg(0)); return new AbstractStringCalc(call, new Calc[] {tupleCalc}) { public String evaluateString(Evaluator evaluator) { final Member[] members = tupleCalc.evaluateTuple(evaluator); if (members == null) { return ""; } StringBuilder buf = new StringBuilder(); SetToStrFunDef.appendTuple(buf, members); return buf.toString(); } }; } } } // End TupleToStrFunDef.java mondrian-3.11.0.1-R/src/main/mondrian/olap/fun/UdfResolver.java000066400000000000000000000333761261646570300241370ustar00rootroot00000000000000/* // This software is subject to the terms of the Eclipse Public License v1.0 // Agreement, available at the following URL: // http://www.eclipse.org/legal/epl-v10.html. // You must accept the terms of that agreement to use this software. // // Copyright (C) 2005-2005 Julian Hyde // Copyright (C) 2005-2015 Pentaho // All Rights Reserved. */ package mondrian.olap.fun; import mondrian.calc.*; import mondrian.calc.impl.*; import mondrian.mdx.ResolvedFunCall; import mondrian.olap.*; import mondrian.olap.type.*; import mondrian.rolap.agg.CellRequestQuantumExceededException; import mondrian.spi.UserDefinedFunction; import java.util.*; /** * Resolver for user-defined functions. * * @author jhyde * @since 2.0 */ public class UdfResolver implements Resolver { private final UdfFactory factory; private final UserDefinedFunction udf; private static final String[] emptyStringArray = new String[0]; public UdfResolver(UdfFactory factory) { this.factory = factory; this.udf = factory.create(); } public String getName() { return udf.getName(); } public String getDescription() { return udf.getDescription(); } public String getSignature() { Type[] parameterTypes = udf.getParameterTypes(); int[] parameterCategories = new int[parameterTypes.length]; for (int i = 0; i < parameterCategories.length; i++) { parameterCategories[i] = TypeUtil.typeToCategory(parameterTypes[i]); } Type returnType = udf.getReturnType(parameterTypes); int returnCategory = TypeUtil.typeToCategory(returnType); return getSyntax().getSignature( getName(), returnCategory, parameterCategories); } public Syntax getSyntax() { return udf.getSyntax(); } public FunDef getFunDef() { Type[] parameterTypes = udf.getParameterTypes(); int[] parameterCategories = new int[parameterTypes.length]; for (int i = 0; i < parameterCategories.length; i++) { parameterCategories[i] = TypeUtil.typeToCategory(parameterTypes[i]); } Type returnType = udf.getReturnType(parameterTypes); return new UdfFunDef(parameterCategories, returnType); } public FunDef resolve( Exp[] args, Validator validator, List conversions) { final Type[] parameterTypes = udf.getParameterTypes(); if (args.length != parameterTypes.length) { return null; } int[] parameterCategories = new int[parameterTypes.length]; Type[] castArgTypes = new Type[parameterTypes.length]; for (int i = 0; i < parameterTypes.length; i++) { Type parameterType = parameterTypes[i]; final Exp arg = args[i]; final Type argType = arg.getType(); final int parameterCategory = TypeUtil.typeToCategory(parameterType); if (!validator.canConvert( i, arg, parameterCategory, conversions)) { return null; } parameterCategories[i] = parameterCategory; if (!parameterType.equals(argType)) { castArgTypes[i] = FunDefBase.castType(argType, parameterCategory); } } final Type returnType = udf.getReturnType(castArgTypes); return new UdfFunDef(parameterCategories, returnType); } public boolean requiresExpression(int k) { return false; } public String[] getReservedWords() { final String[] reservedWords = udf.getReservedWords(); return reservedWords == null ? emptyStringArray : reservedWords; } /** * Adapter which converts a {@link UserDefinedFunction} into a * {@link FunDef}. */ private class UdfFunDef extends FunDefBase { private Type returnType; public UdfFunDef(int[] parameterCategories, Type returnType) { super( UdfResolver.this, TypeUtil.typeToCategory(returnType), parameterCategories); this.returnType = returnType; } public Type getResultType(Validator validator, Exp[] args) { return returnType; } public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) { final Exp[] args = call.getArgs(); Calc[] calcs = new Calc[args.length]; UserDefinedFunction.Argument[] expCalcs = new UserDefinedFunction.Argument[args.length]; for (int i = 0; i < args.length; i++) { Exp arg = args[i]; final Calc calc = calcs[i] = compiler.compileAs( arg, castType(arg.getType(), parameterCategories[i]), ResultStyle.ANY_LIST); calcs[i] = calc; final Calc scalarCalc = compiler.compileScalar(arg, true); final ListCalc listCalc; final IterCalc iterCalc; if (arg.getType() instanceof SetType) { listCalc = compiler.compileList(arg, true); iterCalc = compiler.compileIter(arg); } else { listCalc = null; iterCalc = null; } expCalcs[i] = new CalcExp(calc, scalarCalc, listCalc, iterCalc); } // Create a new instance of the UDF, because some UDFs use member // variables as state. UserDefinedFunction udf2 = factory.create(); if (call.getType() instanceof SetType) { return new ListCalcImpl(call, calcs, udf2, expCalcs); } else { return new ScalarCalcImpl(call, calcs, udf2, expCalcs); } } } /** * Expression that evaluates a scalar user-defined function. */ private static class ScalarCalcImpl extends GenericCalc { private final Calc[] calcs; private final UserDefinedFunction udf; private final UserDefinedFunction.Argument[] args; public ScalarCalcImpl( ResolvedFunCall call, Calc[] calcs, UserDefinedFunction udf, UserDefinedFunction.Argument[] args) { super(call); this.calcs = calcs; this.udf = udf; this.args = args; } public Calc[] getCalcs() { return calcs; } public Object evaluate(Evaluator evaluator) { try { return udf.execute(evaluator, args); } catch (CellRequestQuantumExceededException e) { // Is assumed will be processed in mondrian.rolap.RolapResult throw e; } catch (Exception e) { return FunUtil.newEvalException( "Exception while executing function " + udf.getName(), e); } } public boolean dependsOn(Hierarchy hierarchy) { // Be pessimistic. This effectively disables expression caching. return true; } } /** * Expression that evaluates a list user-defined function. */ private static class ListCalcImpl extends AbstractListCalc { private final UserDefinedFunction udf; private final UserDefinedFunction.Argument[] args; public ListCalcImpl( ResolvedFunCall call, Calc[] calcs, UserDefinedFunction udf, UserDefinedFunction.Argument[] args) { super(call, calcs); this.udf = udf; this.args = args; } public TupleList evaluateList(Evaluator evaluator) { final List list = (List) udf.execute(evaluator, args); // If arity is 1, assume they have returned a list of members. // For other arity, assume a list of member arrays. if (getType().getArity() == 1) { //noinspection unchecked return new UnaryTupleList((List) list); } else { // Use an adapter to make a list of member arrays look like // a list of members laid end-to-end. final int arity = getType().getArity(); //noinspection unchecked final List memberArrayList = (List) list; return new ListTupleList( arity, new AbstractList() { @Override public Member get(int index) { return memberArrayList.get(index / arity) [index % arity]; } @Override public int size() { return memberArrayList.size() * arity; } } ); } } @Override public boolean dependsOn(Hierarchy hierarchy) { // Be pessimistic. This effectively disables expression caching. return true; } } /** * Wrapper around a {@link Calc} to make it appear as an {@link Exp}. * Only the {@link #evaluate(mondrian.olap.Evaluator)} * and {@link #evaluateScalar(mondrian.olap.Evaluator)} methods are * supported. */ private static class CalcExp implements UserDefinedFunction.Argument { private final Calc calc; private final Calc scalarCalc; private final IterCalc iterCalc; private final ListCalc listCalc; /** * Creates a CalcExp. * * @param calc Compiled expression * @param scalarCalc Compiled expression that evaluates to a scalar * @param listCalc Compiled expression that evaluates an MDX set to * a java list * @param iterCalc Compiled expression that evaluates an MDX set to */ public CalcExp( Calc calc, Calc scalarCalc, ListCalc listCalc, IterCalc iterCalc) { this.calc = calc; this.scalarCalc = scalarCalc; this.listCalc = listCalc; this.iterCalc = iterCalc; } public Type getType() { return calc.getType(); } public Object evaluate(Evaluator evaluator) { return adapt(calc.evaluate(evaluator)); } public Object evaluateScalar(Evaluator evaluator) { return scalarCalc.evaluate(evaluator); } public List evaluateList(Evaluator eval) { if (listCalc == null) { throw new RuntimeException("Expression is not a set"); } return adaptList(listCalc.evaluateList(eval)); } public Iterable evaluateIterable(Evaluator eval) { if (iterCalc == null) { throw new RuntimeException("Expression is not a set"); } return adaptIterable(iterCalc.evaluateIterable(eval)); } /** * Adapts the output of {@link TupleList} and {@link TupleIterable} * calculator expressions to the old style, that returned either members * or arrays of members. * * @param o Output of calc * @return Output in new format (lists and iterables over lists of * members) */ private Object adapt(Object o) { if (o instanceof TupleIterable) { return adaptIterable((TupleIterable) o); } return o; } private List adaptList(final TupleList tupleList) { // List is required to be mutable -- so make a copy. if (tupleList.getArity() == 1) { return new ArrayList(tupleList.slice(0)); } else { return new ArrayList( TupleCollections.asMemberArrayList(tupleList)); } } private Iterable adaptIterable(final TupleIterable tupleIterable) { if (tupleIterable instanceof TupleList) { return adaptList((TupleList) tupleIterable); } if (tupleIterable.getArity() == 1) { return tupleIterable.slice(0); } else { return TupleCollections.asMemberArrayIterable(tupleIterable); } } } /** * Factory for {@link UserDefinedFunction}. * *

This factory is required because a user-defined function is allowed * to store state in itself. Therefore it is unsanitary to use the same * UDF in the function table for validation and runtime. In the function * table there is a factory. We use one instance of instance of the UDF to * validate, and create another for the runtime plan.

*/ public interface UdfFactory { /** * Creates a UDF. * * @return UDF */ UserDefinedFunction create(); } /** * Implementation of {@link UdfFactory} that instantiates a given class * using a public default constructor. */ public static class ClassUdfFactory implements UdfResolver.UdfFactory { private final Class clazz; private final String name; /** * Creates a ClassUdfFactory. * * @param clazz Class to instantiate * @param name Name */ public ClassUdfFactory( Class clazz, String name) { this.clazz = clazz; this.name = name; assert clazz != null; } public UserDefinedFunction create() { return Util.createUdf(clazz, name); } } } // End UdfResolver.java mondrian-3.11.0.1-R/src/main/mondrian/olap/fun/UnionFunDef.java000066400000000000000000000053601261646570300240470ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.olap.fun; import mondrian.calc.*; import mondrian.calc.impl.AbstractListCalc; import mondrian.mdx.ResolvedFunCall; import mondrian.olap.*; import java.util.*; /** * Definition of the Union MDX function. * * @author jhyde * @since Mar 23, 2006 */ class UnionFunDef extends FunDefBase { static final String[] ReservedWords = new String[] {"ALL", "DISTINCT"}; static final ReflectiveMultiResolver Resolver = new ReflectiveMultiResolver( "Union", "Union(, [, ALL])", "Returns the union of two sets, optionally retaining duplicates.", new String[] {"fxxx", "fxxxy"}, UnionFunDef.class, ReservedWords); public UnionFunDef(FunDef dummyFunDef) { super(dummyFunDef); } public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) { String allString = getLiteralArg(call, 2, "DISTINCT", ReservedWords); final boolean all = allString.equalsIgnoreCase("ALL"); // todo: do at validate time checkCompatible(call.getArg(0), call.getArg(1), null); final ListCalc listCalc0 = compiler.compileList(call.getArg(0)); final ListCalc listCalc1 = compiler.compileList(call.getArg(1)); return new AbstractListCalc(call, new Calc[] {listCalc0, listCalc1}) { public TupleList evaluateList(Evaluator evaluator) { TupleList list0 = listCalc0.evaluateList(evaluator); TupleList list1 = listCalc1.evaluateList(evaluator); return union(list0, list1, all); } }; } TupleList union(TupleList list0, TupleList list1, final boolean all) { assert list0 != null; assert list1 != null; if (all) { if (list0.isEmpty()) { return list1; } if (list1.isEmpty()) { return list0; } TupleList result = TupleCollections.createList(list0.getArity()); result.addAll(list0); result.addAll(list1); return result; } else { Set> added = new HashSet>(); TupleList result = TupleCollections.createList(list0.getArity()); FunUtil.addUnique(result, list0, added); FunUtil.addUnique(result, list1, added); return result; } } } // End UnionFunDef.java mondrian-3.11.0.1-R/src/main/mondrian/olap/fun/UnorderFunDef.java000066400000000000000000000026121261646570300243720ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.olap.fun; import mondrian.calc.Calc; import mondrian.calc.ExpCompiler; import mondrian.mdx.ResolvedFunCall; import mondrian.olap.FunDef; /** * Definition of the Unorder MDX function. * * @author jhyde * @since Sep 06, 2008 */ class UnorderFunDef extends FunDefBase { static final ReflectiveMultiResolver Resolver = new ReflectiveMultiResolver( "Unorder", "Unorder()", "Removes any enforced ordering from a specified set.", new String[]{"fxx"}, UnorderFunDef.class); public UnorderFunDef(FunDef dummyFunDef) { super(dummyFunDef); } public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) { // Currently Unorder has no effect. In future, we may use the function // as a marker to weaken the ordering required from an expression and // therefore allow the compiler to use a more efficient implementation // that does not return a strict order. return compiler.compile(call.getArg(0)); } } // End UnorderFunDef.java mondrian-3.11.0.1-R/src/main/mondrian/olap/fun/ValidMeasureFunDef.java000066400000000000000000000157221261646570300253430ustar00rootroot00000000000000/* // This software is subject to the terms of the Eclipse Public License v1.0 // Agreement, available at the following URL: // http://www.eclipse.org/legal/epl-v10.html. // You must accept the terms of that agreement to use this software. // // Copyright (C) 2002-2015 Pentaho and others // All Rights Reserved. */ package mondrian.olap.fun; import mondrian.calc.*; import mondrian.calc.impl.GenericCalc; import mondrian.mdx.ResolvedFunCall; import mondrian.olap.*; import mondrian.olap.type.TypeUtil; import mondrian.resource.MondrianResource; import mondrian.rolap.*; import java.util.*; /** * Definition of the ValidMeasure MDX function. * *

Returns a valid measure in a virtual cube by forcing inapplicable * dimensions to their top level. * *

Syntax: *

* ValidMeasure(<Tuple>) *
* * @author kwalker, mpflug */ public class ValidMeasureFunDef extends FunDefBase { static final ValidMeasureFunDef instance = new ValidMeasureFunDef(); private ValidMeasureFunDef() { super( "ValidMeasure", "Returns a valid measure in a virtual cube by forcing inapplicable dimensions to their top level.", "fnt"); } public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) { final Calc calc; final Exp arg = call.getArg(0); if (TypeUtil.couldBeMember(arg.getType())) { calc = compiler.compileMember(arg); } else { calc = compiler.compileTuple(arg); } return new CalcImpl(call, calc); } private static class CalcImpl extends GenericCalc { private final Calc calc; public CalcImpl(ResolvedFunCall call, Calc calc) { super(call); this.calc = calc; } public Object evaluate(Evaluator evaluator) { RolapCube baseCube; RolapCube virtualCube = (RolapCube) evaluator.getCube(); final List memberList = getCalcsMembers(evaluator); if (!virtualCube.isVirtual()) { // this is not a virtual cube, // there's nothing for ValidMeasure to do. // just evaluate sub-expression evaluator.setContext(memberList.toArray( new Member[memberList.size()])); return evaluator.evaluateCurrent(); } // find the measure in the tuple int measurePosition = -1; for (int i = 0; i < memberList.size(); i++) { if (memberList.get(i).getDimension().isMeasures()) { measurePosition = i; break; } } final Member vcMeasure = memberList.get(measurePosition); if (!RolapVirtualCubeMeasure.class .isAssignableFrom(vcMeasure.getClass())) { // Cannot use calculated members in ValidMeasure. throw MondrianResource.instance() .ValidMeasureUsingCalculatedMember .ex(vcMeasure.getUniqueName()); } baseCube = ((RolapVirtualCubeMeasure)vcMeasure).getCube(); List vMinusBDimensions = getDimensionsToForceToAllLevel( virtualCube, baseCube, memberList); // declare members array and fill in with all needed members final List validMeasureMembers = new ArrayList(memberList); // start adding to validMeasureMembers at right place for (Dimension vMinusBDimension : vMinusBDimensions) { // add default|all member for each hierarchy for (final Hierarchy hierarchy : vMinusBDimension.getHierarchies()) { if (hierarchy.hasAll()) { validMeasureMembers.add(hierarchy.getAllMember()); } else { validMeasureMembers.add(hierarchy.getDefaultMember()); } } } // this needs to be done before validmeasuremembers are set on the // context since calculated members defined on a non joining // dimension might have been pulled to default member List calculatedMembers = getCalculatedMembersFromContext(evaluator); evaluator.setContext(validMeasureMembers); evaluator.setContext(calculatedMembers); return evaluator.evaluateCurrent(); } private List getCalcsMembers(Evaluator evaluator) { List memberList; if (calc.isWrapperFor(MemberCalc.class)) { memberList = Collections.singletonList( calc.unwrap(MemberCalc.class).evaluateMember(evaluator)); } else { final Member[] tupleMembers = calc.unwrap((TupleCalc.class)).evaluateTuple(evaluator); memberList = Arrays.asList(tupleMembers); } return memberList; } private List getCalculatedMembersFromContext( Evaluator evaluator) { Member[] currentMembers = evaluator.getMembers(); List calculatedMembers = new ArrayList(); for (Member currentMember : currentMembers) { if (currentMember.isCalculated()) { calculatedMembers.add(currentMember); } } return calculatedMembers; } public Calc[] getCalcs() { return new Calc[]{calc}; } private List getDimensionsToForceToAllLevel( RolapCube virtualCube, RolapCube baseCube, List memberList) { List vMinusBDimensions = new ArrayList(); Set virtualCubeDims = new HashSet(); virtualCubeDims.addAll(Arrays.asList(virtualCube.getDimensions())); Set nonJoiningDims = baseCube.nonJoiningDimensions(virtualCubeDims); for (Dimension nonJoiningDim : nonJoiningDims) { if (!isDimInMembersList(memberList, nonJoiningDim)) { vMinusBDimensions.add(nonJoiningDim); } } return vMinusBDimensions; } private boolean isDimInMembersList( List members, Dimension dimension) { for (Member member : members) { if (member.getName().equalsIgnoreCase(dimension.getName())) { return true; } } return false; } public boolean dependsOn(Hierarchy hierarchy) { // depends on all hierarchies return butDepends(getCalcs(), hierarchy); } } } // End ValidMeasureFunDef.java mondrian-3.11.0.1-R/src/main/mondrian/olap/fun/ValueFunDef.java000066400000000000000000000025631261646570300240350ustar00rootroot00000000000000/* // This software is subject to the terms of the Eclipse Public License v1.0 // Agreement, available at the following URL: // http://www.eclipse.org/legal/epl-v10.html. // You must accept the terms of that agreement to use this software. // // Copyright (C) 2002-2005 Julian Hyde // Copyright (C) 2005-2006 Pentaho and others // All Rights Reserved. */ package mondrian.olap.fun; import mondrian.olap.*; import mondrian.olap.type.Type; import java.io.PrintWriter; /** * A ValueFunDef is a pseudo-function to evaluate a member or * a tuple. Similar to {@link TupleFunDef}. * * @author jhyde * @since Jun 14, 2002 */ class ValueFunDef extends FunDefBase { private final int[] argTypes; ValueFunDef(int[] argTypes) { super( "_Value()", "_Value([, ...])", "Pseudo-function which evaluates a tuple.", Syntax.Parentheses, Category.Numeric, argTypes); this.argTypes = argTypes; } public int getReturnCategory() { return Category.Tuple; } public int[] getParameterCategories() { return argTypes; } public void unparse(Exp[] args, PrintWriter pw) { ExpBase.unparseList(pw, args, "(", ", ", ")"); } public Type getResultType(Validator validator, Exp[] args) { return null; } } // End ValueFunDef.java mondrian-3.11.0.1-R/src/main/mondrian/olap/fun/VarFunDef.java000066400000000000000000000046721261646570300235140ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.olap.fun; import mondrian.calc.*; import mondrian.calc.impl.AbstractDoubleCalc; import mondrian.calc.impl.ValueCalc; import mondrian.mdx.ResolvedFunCall; import mondrian.olap.*; /** * Definition of the Var MDX builtin function * (and its synonym Variance). * * @author jhyde * @since Mar 23, 2006 */ class VarFunDef extends AbstractAggregateFunDef { static final Resolver VarResolver = new ReflectiveMultiResolver( "Var", "Var([, ])", "Returns the variance of a numeric expression evaluated over a set (unbiased).", new String[]{"fnx", "fnxn"}, VarFunDef.class); static final Resolver VarianceResolver = new ReflectiveMultiResolver( "Variance", "Variance([, ])", "Alias for Var.", new String[]{"fnx", "fnxn"}, VarFunDef.class); public VarFunDef(FunDef dummyFunDef) { super(dummyFunDef); } public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) { final ListCalc listCalc = compiler.compileList(call.getArg(0)); final Calc calc = call.getArgCount() > 1 ? compiler.compileScalar(call.getArg(1), true) : new ValueCalc(call); return new AbstractDoubleCalc(call, new Calc[] {listCalc, calc}) { public double evaluateDouble(Evaluator evaluator) { final int savepoint = evaluator.savepoint(); try { evaluator.setNonEmpty(false); TupleList list = evaluateCurrentList(listCalc, evaluator); final double var = (Double) var( evaluator, list, calc, false); return var; } finally { evaluator.restore(savepoint); } } public boolean dependsOn(Hierarchy hierarchy) { return anyDependsButFirst(getCalcs(), hierarchy); } }; } } // End VarFunDef.java mondrian-3.11.0.1-R/src/main/mondrian/olap/fun/VarPFunDef.java000066400000000000000000000046041261646570300236270ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.olap.fun; import mondrian.calc.*; import mondrian.calc.impl.AbstractDoubleCalc; import mondrian.calc.impl.ValueCalc; import mondrian.mdx.ResolvedFunCall; import mondrian.olap.*; /** * Definition of the VarP MDX builtin function * (and its synonym VarianceP). * * @author jhyde * @since Mar 23, 2006 */ class VarPFunDef extends AbstractAggregateFunDef { static final Resolver VariancePResolver = new ReflectiveMultiResolver( "VarianceP", "VarianceP([, ])", "Alias for VarP.", new String[]{"fnx", "fnxn"}, VarPFunDef.class); static final Resolver VarPResolver = new ReflectiveMultiResolver( "VarP", "VarP([, ])", "Returns the variance of a numeric expression evaluated over a set (biased).", new String[]{"fnx", "fnxn"}, VarPFunDef.class); public VarPFunDef(FunDef dummyFunDef) { super(dummyFunDef); } public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) { final ListCalc listCalc = compiler.compileList(call.getArg(0)); final Calc calc = call.getArgCount() > 1 ? compiler.compileScalar(call.getArg(1), true) : new ValueCalc(call); return new AbstractDoubleCalc(call, new Calc[] {listCalc, calc}) { public double evaluateDouble(Evaluator evaluator) { TupleList memberList = evaluateCurrentList(listCalc, evaluator); final int savepoint = evaluator.savepoint(); try { evaluator.setNonEmpty(false); return (Double) var(evaluator, memberList, calc, true); } finally { evaluator.restore(savepoint); } } public boolean dependsOn(Hierarchy hierarchy) { return anyDependsButFirst(getCalcs(), hierarchy); } }; } } // End VarPFunDef.java mondrian-3.11.0.1-R/src/main/mondrian/olap/fun/VisualTotalsFunDef.java000066400000000000000000000321361261646570300254120ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.olap.fun; import mondrian.calc.*; import mondrian.calc.impl.AbstractListCalc; import mondrian.calc.impl.UnaryTupleList; import mondrian.mdx.*; import mondrian.olap.*; import mondrian.olap.type.*; import mondrian.resource.MondrianResource; import mondrian.rolap.*; import java.util.ArrayList; import java.util.List; /** * Definition of the VisualTotals MDX function. * * @author jhyde * @since Jan 16, 2006 */ public class VisualTotalsFunDef extends FunDefBase { static final Resolver Resolver = new ReflectiveMultiResolver( "VisualTotals", "VisualTotals([, ])", "Dynamically totals child members specified in a set using a pattern for the total label in the result set.", new String[] {"fxx", "fxxS"}, VisualTotalsFunDef.class); public VisualTotalsFunDef(FunDef dummyFunDef) { super(dummyFunDef); } protected Exp validateArg( Validator validator, Exp[] args, int i, int category) { final Exp validatedArg = super.validateArg(validator, args, i, category); if (i == 0) { // The function signature guarantees that we have a set of members // or a set of tuples. final SetType setType = (SetType) validatedArg.getType(); final Type elementType = setType.getElementType(); if (!(elementType instanceof MemberType)) { throw MondrianResource.instance().VisualTotalsAppliedToTuples .ex(); } } return validatedArg; } public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) { final ListCalc listCalc = compiler.compileList(call.getArg(0)); final StringCalc stringCalc = call.getArgCount() > 1 ? compiler.compileString(call.getArg(1)) : null; return new CalcImpl(call, listCalc, stringCalc); } /** * Calc implementation of the VisualTotals function. */ private static class CalcImpl extends AbstractListCalc { private final ListCalc listCalc; private final StringCalc stringCalc; public CalcImpl( ResolvedFunCall call, ListCalc listCalc, StringCalc stringCalc) { super(call, new Calc[] {listCalc, stringCalc}); this.listCalc = listCalc; this.stringCalc = stringCalc; } public TupleList evaluateList(Evaluator evaluator) { final List list = listCalc.evaluateList(evaluator).slice(0); final List resultList = new ArrayList(list); final int memberCount = list.size(); for (int i = memberCount - 1; i >= 0; --i) { Member member = list.get(i); if (i + 1 < memberCount) { Member nextMember = resultList.get(i + 1); if (nextMember != member && nextMember.isChildOrEqualTo(member)) { resultList.set( i, createMember(member, i, resultList, evaluator)); } } } return new UnaryTupleList(resultList); } private VisualTotalMember createMember( Member member, int i, final List list, Evaluator evaluator) { final String name; final String caption; if (stringCalc != null) { final String namePattern = stringCalc.evaluateString(evaluator); name = substitute(namePattern, member.getName()); caption = name; } else { name = member.getName(); caption = member.getCaption(); } final List childMemberList = followingDescendants(member, i + 1, list); final Exp exp = makeExpr(childMemberList); final Validator validator = evaluator.getQuery().createValidator(); final Exp validatedExp = exp.accept(validator); return new VisualTotalMember(member, name, caption, validatedExp); } private List followingDescendants( Member member, int i, final List list) { List childMemberList = new ArrayList(); while (i < list.size()) { Member descendant = list.get(i); if (descendant.equals(member)) { // strict descendants only break; } if (!descendant.isChildOrEqualTo(member)) { break; } if (descendant instanceof VisualTotalMember) { // Add the visual total member, but skip over its children. VisualTotalMember visualTotalMember = (VisualTotalMember) descendant; childMemberList.add(visualTotalMember); i = lastChildIndex(visualTotalMember.member, i, list); continue; } childMemberList.add(descendant); ++i; } return childMemberList; } private int lastChildIndex(Member member, int start, List list) { int i = start; while (true) { ++i; if (i >= list.size()) { break; } Member descendant = (Member) list.get(i); if (descendant.equals(member)) { // strict descendants only break; } if (!descendant.isChildOrEqualTo(member)) { break; } } return i; } private Exp makeExpr(final List childMemberList) { Exp[] memberExprs = new Exp[childMemberList.size()]; for (int i = 0; i < childMemberList.size(); i++) { final Member childMember = (Member) childMemberList.get(i); memberExprs[i] = new MemberExpr(childMember); } return new UnresolvedFunCall( "Aggregate", new Exp[] { new UnresolvedFunCall( "{}", Syntax.Braces, memberExprs) }); } } /** * Calculated member for VisualTotals function. * *

It corresponds to a real member, and most of its properties are * similar. The main differences are:

    *
  • its name is derived from the VisualTotals pattern, e.g. * "*Subtotal - Dairy" as opposed to "Dairy" *
  • its value is a calculation computed by aggregating all of the * members which occur following it in the list

*/ public static class VisualTotalMember extends RolapMemberBase { private final Member member; private Exp exp; private String caption; VisualTotalMember( Member member, String name, String caption, final Exp exp) { super( (RolapMember) member.getParentMember(), (RolapLevel) member.getLevel(), RolapUtil.sqlNullValue, name, MemberType.FORMULA); this.member = member; this.caption = caption; this.exp = exp; } @Override public boolean equals(Object o) { // A visual total member must compare equal to the member it wraps // (for purposes of the MDX Intersect function, for instance). return o instanceof VisualTotalMember && this.member.equals(((VisualTotalMember) o).member) && this.exp.equals(((VisualTotalMember) o).exp) || o instanceof Member && this.member.equals(o); } @Override public int compareTo(Object o) { if (o instanceof VisualTotalMember) { // VisualTotals members are a special case. We have // to compare the delegate member. return this.getMember().compareTo( ((VisualTotalMember) o).getMember()); } else { return super.compareTo(o); } } @Override public int hashCode() { return member.hashCode(); } @Override public String getCaption() { return caption; } protected boolean computeCalculated(final MemberType memberType) { return true; } public int getSolveOrder() { // high solve order, so it is expanded after other calculations // REVIEW: 99...really?? I've seen many queries with higher SO. // I don't think we should be abusing arbitrary constants // like this. return 99; } public Exp getExpression() { return exp; } public void setExpression(Exp exp) { this.exp = exp; } public void setExpression( Evaluator evaluator, List childMembers) { final Exp exp = makeExpr(childMembers); final Validator validator = evaluator.getQuery().createValidator(); final Exp validatedExp = exp.accept(validator); setExpression(validatedExp); } private Exp makeExpr(final List childMemberList) { Exp[] memberExprs = new Exp[childMemberList.size()]; for (int i = 0; i < childMemberList.size(); i++) { final Member childMember = (Member) childMemberList.get(i); memberExprs[i] = new MemberExpr(childMember); } return new UnresolvedFunCall( "Aggregate", new Exp[] { new UnresolvedFunCall( "{}", Syntax.Braces, memberExprs) }); } public int getOrdinal() { return member.getOrdinal(); } public Member getDataMember() { return member; } public String getQualifiedName() { throw new UnsupportedOperationException(); } public Member getMember() { return member; } public Object getPropertyValue(String propertyName, boolean matchCase) { Property property = Property.lookup(propertyName, matchCase); if (property == null) { return null; } switch (property.ordinal) { case Property.CHILDREN_CARDINALITY_ORDINAL: return member.getPropertyValue(propertyName, matchCase); default: return super.getPropertyValue(propertyName, matchCase); } } } /** * Substitutes a name into a pattern.

* * Asterisks are replaced with the name, * double-asterisks are replaced with a single asterisk. * For example, * *

substitute("** Subtotal - *", * "Dairy")
* * returns * *
"* Subtotal - Dairy"
* * @param namePattern Pattern * @param name Name to substitute into pattern * @return Substituted pattern */ static String substitute(String namePattern, String name) { final StringBuilder buf = new StringBuilder(256); final int namePatternLen = namePattern.length(); int startIndex = 0; while (true) { int endIndex = namePattern.indexOf('*', startIndex); if (endIndex == -1) { // No '*' left // append the rest of namePattern from startIndex onwards buf.append(namePattern.substring(startIndex)); break; } // endIndex now points to the '*'; check for '**' ++endIndex; if (endIndex < namePatternLen && namePattern.charAt(endIndex) == '*') { // Found '**', replace with '*' // Include first '*'. buf.append(namePattern.substring(startIndex, endIndex)); // Skip over 2nd '*' ++endIndex; } else { // Found single '*' - substitute (omitting the '*') // Exclude '*' buf.append(namePattern.substring(startIndex, endIndex - 1)); buf.append(name); } startIndex = endIndex; } return buf.toString(); } } // End VisualTotalsFunDef.java mondrian-3.11.0.1-R/src/main/mondrian/olap/fun/XtdFunDef.java000066400000000000000000000124761261646570300235240ustar00rootroot00000000000000/* // This software is subject to the terms of the Eclipse Public License v1.0 // Agreement, available at the following URL: // http://www.eclipse.org/legal/epl-v10.html. // You must accept the terms of that agreement to use this software. // // Copyright (C) 2005-2005 Julian Hyde // Copyright (C) 2005-2011 Pentaho // All Rights Reserved. */ package mondrian.olap.fun; import mondrian.calc.*; import mondrian.calc.impl.AbstractListCalc; import mondrian.calc.impl.UnaryTupleList; import mondrian.mdx.ResolvedFunCall; import mondrian.olap.DimensionType; import mondrian.olap.*; import mondrian.olap.LevelType; import mondrian.olap.type.*; import mondrian.resource.MondrianResource; import mondrian.rolap.RolapCube; import mondrian.rolap.RolapHierarchy; /** * Definition of Ytd, Qtd, Mtd, * and Wtd MDX builtin functions. * * @author jhyde * @since Mar 23, 2006 */ class XtdFunDef extends FunDefBase { private final LevelType levelType; static final ResolverImpl MtdResolver = new ResolverImpl( "Mtd", "Mtd([])", "A shortcut function for the PeriodsToDate function that specifies the level to be Month.", new String[]{"fx", "fxm"}, LevelType.TimeMonths); static final ResolverImpl QtdResolver = new ResolverImpl( "Qtd", "Qtd([])", "A shortcut function for the PeriodsToDate function that specifies the level to be Quarter.", new String[]{"fx", "fxm"}, LevelType.TimeQuarters); static final ResolverImpl WtdResolver = new ResolverImpl( "Wtd", "Wtd([])", "A shortcut function for the PeriodsToDate function that specifies the level to be Week.", new String[]{"fx", "fxm"}, LevelType.TimeWeeks); static final ResolverImpl YtdResolver = new ResolverImpl( "Ytd", "Ytd([])", "A shortcut function for the PeriodsToDate function that specifies the level to be Year.", new String[]{"fx", "fxm"}, LevelType.TimeYears); public XtdFunDef(FunDef dummyFunDef, LevelType levelType) { super(dummyFunDef); this.levelType = levelType; } public Type getResultType(Validator validator, Exp[] args) { if (args.length == 0) { // With no args, the default implementation cannot // guess the hierarchy. RolapHierarchy defaultTimeHierarchy = ((RolapCube) validator.getQuery().getCube()).getTimeHierarchy( getName()); return new SetType(MemberType.forHierarchy(defaultTimeHierarchy)); } final Type type = args[0].getType(); if (type.getDimension().getDimensionType() != DimensionType.TimeDimension) { throw MondrianResource.instance().TimeArgNeeded.ex(getName()); } return super.getResultType(validator, args); } private Level getLevel(Evaluator evaluator) { switch (levelType) { case TimeYears: return evaluator.getCube().getYearLevel(); case TimeQuarters: return evaluator.getCube().getQuarterLevel(); case TimeMonths: return evaluator.getCube().getMonthLevel(); case TimeWeeks: return evaluator.getCube().getWeekLevel(); case TimeDays: return evaluator.getCube().getWeekLevel(); default: throw Util.badValue(levelType); } } public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) { final Level level = getLevel(compiler.getEvaluator()); switch (call.getArgCount()) { case 0: return new AbstractListCalc(call, new Calc[0]) { public TupleList evaluateList(Evaluator evaluator) { return new UnaryTupleList( periodsToDate(evaluator, level, null)); } public boolean dependsOn(Hierarchy hierarchy) { return hierarchy.getDimension().getDimensionType() == mondrian.olap.DimensionType.TimeDimension; } }; default: final MemberCalc memberCalc = compiler.compileMember(call.getArg(0)); return new AbstractListCalc(call, new Calc[] {memberCalc}) { public TupleList evaluateList(Evaluator evaluator) { return new UnaryTupleList( periodsToDate( evaluator, level, memberCalc.evaluateMember(evaluator))); } }; } } private static class ResolverImpl extends MultiResolver { private final LevelType levelType; public ResolverImpl( String name, String signature, String description, String[] signatures, LevelType levelType) { super(name, signature, description, signatures); this.levelType = levelType; } protected FunDef createFunDef(Exp[] args, FunDef dummyFunDef) { return new XtdFunDef(dummyFunDef, levelType); } } } // End XtdFunDef.java mondrian-3.11.0.1-R/src/main/mondrian/olap/fun/extra/000077500000000000000000000000001261646570300221435ustar00rootroot00000000000000mondrian-3.11.0.1-R/src/main/mondrian/olap/fun/extra/CalculatedChildFunDef.java000066400000000000000000000052061261646570300271060ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.olap.fun.extra; import mondrian.calc.*; import mondrian.calc.impl.AbstractMemberCalc; import mondrian.mdx.ResolvedFunCall; import mondrian.olap.*; import mondrian.olap.fun.FunDefBase; import java.util.List; /** * Definition of the CalculatedChild MDX function. * *

Syntax: *

<Member> * CalculatedChild(<String>)
* * @author bchow * @since 2006/4/12 */ public class CalculatedChildFunDef extends FunDefBase { public static final CalculatedChildFunDef instance = new CalculatedChildFunDef(); CalculatedChildFunDef() { super( "CalculatedChild", "Returns an existing calculated child member with name from the specified .", "mmmS"); } public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) { final MemberCalc memberCalc = compiler.compileMember(call.getArg(0)); final StringCalc stringCalc = compiler.compileString(call.getArg(1)); return new AbstractMemberCalc( call, new Calc[] {memberCalc, stringCalc}) { public Member evaluateMember(Evaluator evaluator) { Member member = memberCalc.evaluateMember(evaluator); String name = stringCalc.evaluateString(evaluator); return getCalculatedChild(member, name, evaluator); } }; } private Member getCalculatedChild( Member parent, String childName, Evaluator evaluator) { final SchemaReader schemaReader = evaluator.getQuery().getSchemaReader(true); Level childLevel = parent.getLevel().getChildLevel(); if (childLevel == null) { return parent.getHierarchy().getNullMember(); } List calcMemberList = schemaReader.getCalculatedMembers(childLevel); for (Member child : calcMemberList) { // the parent check is required in case there are parallel children // with the same names if (child.getParentMember().equals(parent) && child.getName().equals(childName)) { return child; } } return parent.getHierarchy().getNullMember(); } } // End CalculatedChildFunDef.java mondrian-3.11.0.1-R/src/main/mondrian/olap/fun/extra/NthQuartileFunDef.java000066400000000000000000000053471261646570300263470ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.olap.fun.extra; import mondrian.calc.*; import mondrian.calc.impl.AbstractDoubleCalc; import mondrian.calc.impl.ValueCalc; import mondrian.mdx.ResolvedFunCall; import mondrian.olap.*; import mondrian.olap.fun.*; /** * Definition of the FirstQ and ThirdQ MDX extension * functions. * *

These functions are not standard MDX. * * @author jhyde * @since Mar 23, 2006 */ public class NthQuartileFunDef extends AbstractAggregateFunDef { private final int range; public static final MultiResolver ThirdQResolver = new ReflectiveMultiResolver( "ThirdQ", "ThirdQ([, ])", "Returns the 3rd quartile value of a numeric expression evaluated over a set.", new String[]{"fnx", "fnxn"}, NthQuartileFunDef.class); public static final MultiResolver FirstQResolver = new ReflectiveMultiResolver( "FirstQ", "FirstQ([, ])", "Returns the 1st quartile value of a numeric expression evaluated over a set.", new String[]{"fnx", "fnxn"}, NthQuartileFunDef.class); public NthQuartileFunDef(FunDef dummyFunDef) { super(dummyFunDef); this.range = dummyFunDef.getName().equals("FirstQ") ? 1 : 3; } public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) { final ListCalc listCalc = compiler.compileList(call.getArg(0)); final DoubleCalc doubleCalc = call.getArgCount() > 1 ? compiler.compileDouble(call.getArg(1)) : new ValueCalc(call); return new AbstractDoubleCalc(call, new Calc[] {listCalc, doubleCalc}) { public double evaluateDouble(Evaluator evaluator) { final int savepoint = evaluator.savepoint(); try { evaluator.setNonEmpty(false); TupleList members = evaluateCurrentList(listCalc, evaluator); return quartile( evaluator, members, doubleCalc, range); } finally { evaluator.restore(savepoint); } } public boolean dependsOn(Hierarchy hierarchy) { return anyDependsButFirst(getCalcs(), hierarchy); } }; } } // End NthQuartileFunDef.java mondrian-3.11.0.1-R/src/main/mondrian/olap/fun/extra/package.html000066400000000000000000000002651261646570300244270ustar00rootroot00000000000000 Defines MDX extension functions.

These are not in the MDX standard, but are part of Mondrian because we consider them to be generally useful.

mondrian-3.11.0.1-R/src/main/mondrian/olap/fun/package.html000066400000000000000000000001121261646570300232730ustar00rootroot00000000000000 Defines the set of MDX built-in functions. mondrian-3.11.0.1-R/src/main/mondrian/olap/fun/vba/000077500000000000000000000000001261646570300215705ustar00rootroot00000000000000mondrian-3.11.0.1-R/src/main/mondrian/olap/fun/vba/Excel.java000066400000000000000000001367111261646570300235040ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.olap.fun.vba; import mondrian.olap.InvalidArgumentException; import mondrian.olap.fun.JavaFunDef; import static mondrian.olap.fun.JavaFunDef.Description; import static mondrian.olap.fun.JavaFunDef.FunctionName; /** * Implementations of functions in the Excel worksheet library. * *

Functions are loaded into the function table by reflection. * * @author jhyde * @since Dec 31, 2007 */ public abstract class Excel { // There follows a list of all functions defined in Excel. Functions are // marked 'todo:' if they still need to be implemented; 'skip:' if they // are implemented elsewhere, such as in Vba or there there is an explicit // implementation of FunDef for them. A FunDef typically allows a more // efficient implementation. // AccrInt Returns the accrued interest for a security that pays periodic // interest. // AccrIntM Returns the accrued interest for a security that pays interest // at maturity. @FunctionName("Acos") @JavaFunDef.Signature("Acos(number)") @Description( "Returns the arccosine, or inverse cosine, of a number. The arccosine " + "is the angle whose cosine is Arg1. The returned angle is given in " + "radians in the range 0 (zero) to pi.") public static double acos(double number) { return Math.acos(number); } @FunctionName("Acosh") @JavaFunDef.Signature("Acosh(number)") @Description( "Returns the inverse hyperbolic cosine of a number. Number must be " + "greater than or equal to 1. The inverse hyperbolic cosine is the " + "value whose hyperbolic cosine is Arg1, so Acosh(Cosh(number)) " + "equals Arg1.") public static double acosh(double x) { return Math.log(x + Math.sqrt((x * x) - 1.0)); } // Todo: AmorDegrc Returns the depreciation for each accounting // period. This function is provided for the French accounting // system. // Todo: AmorLinc Returns the depreciation for each accounting // period. This function is provided for the French accounting // system. // Skip: And Returns TRUE if all its arguments are TRUE; returns // FALSE if one or more argument is FALSE. // Todo: Asc For Double-byte character set (DBCS) languages, // changes full-width (double-byte) characters to half-width // (single-byte) characters. @FunctionName("Asin") @JavaFunDef.Signature("Asin(number)") @Description( "Returns the arcsine, or inverse sine, of a number. The arcsine is the " + "angle whose sine is Arg1. The returned angle is given in radians in " + "the range -pi/2 to pi/2.") public static double asin(double number) { return Math.asin(number); } @FunctionName("Asinh") @JavaFunDef.Signature("Asinh(number)") @Description( "Returns the inverse hyperbolic sine of a number. The inverse " + "hyperbolic sine is the value whose hyperbolic sine is Arg1, " + "so Asinh(Sinh(number)) equals Arg1.") public static double asinh(double x) { return Math.log(x + Math.sqrt(1.0 + (x * x))); } @FunctionName("Atan2") @JavaFunDef.Signature("Atan2(x, y)") @Description( "Returns the arctangent, or inverse tangent, of the specified x- and " + "y-coordinates. The arctangent is the angle from the x-axis to a " + "line containing the origin (0, 0) and a point with coordinates " + "(x_num, y_num). The angle is given in radians between -pi and pi, " + "excluding -pi.") public static double atan2(double y, double x) { return Math.atan2(y, x); } @FunctionName("Atanh") @JavaFunDef.Signature("Atanh(number)") @Description( "Returns the inverse hyperbolic tangent of a number. Number " + "must be between -1 and 1 (excluding -1 and 1).") public static double atanh(double x) { return .5 * Math.log((1.0 + x) / (1.0 - x)); } // Todo: AveDev Returns the average of the absolute deviations of data // points from their mean. AveDev is a measure of the variability in a data // set. // Todo: Average Returns the average (arithmetic mean) of the arguments. // Todo: AverageIf Returns the average (arithmetic mean) of all the cells in // a range that meet a given criteria. // Todo: AverageIfs Returns the average (arithmetic mean) of all cells that // meet multiple criteria. // Todo: BahtText Converts a number to Thai text and adds a suffix of // "Baht." // Todo: BesselI Returns the modified Bessel function, which is equivalent // to the Bessel function evaluated for purely imaginary arguments. // Todo: BesselJ Returns the Bessel function. // Todo: BesselK Returns the modified Bessel function, which is equivalent // to the Bessel functions evaluated for purely imaginary arguments. // Todo: BesselY Returns the Bessel function, which is also called the Weber // function or the Neumann function. // Todo: BetaDist Returns the beta cumulative distribution function. // Todo: BetaInv Returns the inverse of the cumulative distribution function // for a specified beta distribution. That is, if probability = // BetaDist(x,...), then BetaInv(probability,...) = x. // Todo: Bin2Dec Converts a binary number to decimal. // Todo: Bin2Hex Converts a binary number to hexadecimal. // Todo: Bin2Oct Converts a binary number to octal. // Todo: BinomDist Returns the individual term binomial distribution // probability. // Todo: Ceiling Returns number rounded up, away from zero, to the nearest // multiple of significance. // Todo: ChiDist Returns the one-tailed probability of the chi-squared // distribution. // Todo: ChiInv Returns the inverse of the one-tailed probability of the // chi-squared distribution. // Todo: ChiTest Returns the test for independence. // Todo: Choose Uses Arg1 as the index to return a value from the list of // value arguments. // Todo: Clean Removes all nonprintable characters from text. // Todo: Combin Returns the number of combinations for a given number of // items. Use Combin to determine the total possible number of groups for a // given number of items. // Todo: Complex Converts real and imaginary coefficients into a complex // number of the form x + yi or x + yj. // Todo: Confidence Returns a value that you can use to construct a // confidence interval for a population mean. // Todo: Convert Converts a number from one measurement system to // another. For example, Convert can translate a table of distances in miles // to a table of distances in kilometers. // Todo: Correl Returns the correlation coefficient of the Arg1 and Arg2 // cell ranges. @FunctionName("Cosh") @Description("Returns the hyperbolic cosine of a number.") public static double cosh(double number) { return Math.cosh(number); } // Todo: Count Counts the number of cells that contain numbers and counts // numbers within the list of arguments. // Todo: CountA Counts the number of cells that are not empty and the values // within the list of arguments. // Todo: CountBlank Counts empty cells in a specified range of cells. // Todo: CountIf Counts the number of cells within a range that meet the // given criteria. // Todo: CountIfs Counts the number of cells within a range that meet // multiple criteria. // Todo: CoupDayBs Returns the number of days from the beginning of the // coupon period to the settlement date. // Todo: CoupDays Returns the number of days in the coupon period that // contains the settlement date. // Todo: CoupDaysNc Returns the number of days from the settlement date to // the next coupon date. // Todo: CoupNcd Returns a number that represents the next coupon date after // the settlement date. // Todo: CoupNum Returns the number of coupons payable between the // settlement date and maturity date, rounded up to the nearest whole // coupon. // Todo: CoupPcd The description for this item will appear in the final // release of Office 2007. // Todo: Covar Returns covariance, the average of the products of deviations // for each data point pair. // Todo: CritBinom Returns the smallest value for which the cumulative // binomial distribution is greater than or equal to a criterion value. // Todo: CumIPmt Returns the cumulative interest paid on a loan between // start_period and end_period. // Todo: CumPrinc Returns the cumulative principal paid on a loan between // start_period and end_period. // Todo: DAverage Averages the values in a column of a list or database that // match conditions you specify. // Todo: Days360 Returns the number of days between two dates based on a // 360-day year (twelve 30-day months), which is used in some accounting // calculations. // Todo: Db Returns the depreciation of an asset for a specified period // using the fixed-declining balance method. // Todo: Dbcs The description for this item will appear in the final release // of Office 2007. // Todo: DCount Counts the cells that contain numbers in a column of a list // or database that match conditions that you specify. // Todo: DCountA Counts the nonblank cells in a column of a list or database // that match conditions that you specify. // Todo: Ddb Returns the depreciation of an asset for a specified period // using the double-declining balance method or some other method you // specify. // Todo: Dec2Bin Converts a decimal number to binary. // Todo: Dec2Hex Converts a decimal number to hexadecimal. // Todo: Dec2Oct Converts a decimal number to octal. // Todo: Degrees Converts radians into degrees. @FunctionName("Degrees") @Description("Converts radians to degrees.") public static double degrees(double number) { // 180 degrees = Pi radians return number * 180.0 / Math.PI; } // Todo: Delta Tests whether two values are equal. Returns 1 if number1 = // number2; returns 0 otherwise. // Todo: DevSq Returns the sum of squares of deviations of data points from // their sample mean. // Todo: DGet Extracts a single value from a column of a list or database // that matches conditions that you specify. // Todo: Disc Returns the discount rate for a security. // Todo: DMax Returns the largest number in a column of a list or database // that matches conditions you that specify. // Todo: DMin Returns the smallest number in a column of a list or database // that matches conditions that you specify. // Todo: Dollar The function described in this Help topic converts a number // to text format and applies a currency symbol. The name of the function // (and the symbol that it applies) depends upon your language settings. // Todo: DollarDe Converts a dollar price expressed as a fraction into a // dollar price expressed as a decimal number. Use DOLLARDE to convert // fractional dollar numbers, such as securities prices, to decimal numbers. // Todo: DollarFr Converts a dollar price expressed as a decimal number into // a dollar price expressed as a fraction. Use DOLLARFR to convert decimal // numbers to fractional dollar numbers, such as securities prices. // Todo: DProduct Multiplies the values in a column of a list or database // that match conditions that you specify. // Todo: DStDev Estimates the standard deviation of a population based on a // sample by using the numbers in a column of a list or database that match // conditions that you specify. // Todo: DStDevP Calculates the standard deviation of a population based on // the entire population by using the numbers in a column of a list or // database that match conditions that you specify. // Todo: DSum Adds the numbers in a column of a list or database that match // conditions that you specify. // Todo: Duration Returns the Macauley duration for an assumed par value of // $100. Duration is defined as the weighted average of the present value of // the cash flows and is used as a measure of a bond price's response to // changes in yield. // Todo: DVar Estimates the variance of a population based on a sample by // using the numbers in a column of a list or database that match conditions // that you specify. // Todo: DVarP Calculates the variance of a population based on the entire // population by using the numbers in a column of a list or database that // match conditions that you specify. // Todo: EDate Returns the serial number that represents the date that is // the indicated number of months before or after a specified date (the // start_date). Use EDATE to calculate maturity dates or due dates that fall // on the same day of the month as the date of issue. // Todo: Effect Returns the effective annual interest rate, given the // nominal annual interest rate and the number of compounding periods per // year. // Todo: EoMonth Returns the serial number for the last day of the month // that is the indicated number of months before or after start_date. Use // EOMONTH to calculate maturity dates or due dates that fall on the last // day of the month. // Todo: Erf Returns the error function integrated between lower_limit and // upper_limit. // Todo: ErfC The description for this item will appear in the final release // of Office 2007. // Todo: Even Returns number rounded up to the nearest even integer. You can // use this function for processing items that come in twos. For example, a // packing crate accepts rows of one or two items. The crate is full when // the number of items, rounded up to the nearest two, matches the crate's // capacity. // Todo: ExponDist Returns the exponential distribution. Use EXPONDIST to // model the time between events, such as how long an automated bank teller // takes to deliver cash. For example, you can use EXPONDIST to determine // the probability that the process takes at most 1 minute. // Todo: Fact Returns the factorial of a number. The factorial of a number // is equal to 1*2*3*...* number. // Todo: FactDouble Returns the double factorial of a number. // Todo: FDist Returns the F probability distribution. You can use this // function to determine whether two data sets have different degrees of // diversity. For example, you can examine the test scores of men and women // entering high school and determine if the variability in the females is // different from that found in the males. // Todo: Find Finds specific information in a worksheet. // Todo: FindB FIND and FINDB locate one text string within a second text // string, and return the number of the starting position of the first text // string from the first character of the second text string. // Todo: FInv Returns the inverse of the F probability distribution. If p = // FDIST(x,...), then FINV(p,...) = x. // Todo: Fisher Returns the Fisher transformation at x. This transformation // produces a function that is normally distributed rather than skewed. Use // this function to perform hypothesis testing on the correlation // coefficient. // Todo: FisherInv Returns the inverse of the Fisher transformation. Use // this transformation when analyzing correlations between ranges or arrays // of data. If y = FISHER(x), then FISHERINV(y) = x. // Todo: Fixed Rounds a number to the specified number of decimals, formats // the number in decimal format using a period and commas, and returns the // result as text. // Todo: Floor Rounds number down, toward zero, to the nearest multiple of // significance. // Todo: Forecast Calculates, or predicts, a future value by using existing // values. The predicted value is a y-value for a given x-value. The known // values are existing x-values and y-values, and the new value is predicted // by using linear regression. You can use this function to predict future // sales, inventory requirements, or consumer trends. // Todo: Frequency Calculates how often values occur within a range of // values, and then returns a vertical array of numbers. For example, use // FREQUENCY to count the number of test scores that fall within ranges of // scores. Because FREQUENCY returns an array, it must be entered as an // array formula. // Todo: FTest Returns the result of an F-test. An F-test returns the // two-tailed probability that the variances in array1 and array2 are not // significantly different. Use this function to determine whether two // samples have different variances. For example, given test scores from // public and private schools, you can test whether these schools have // different levels of test score diversity. // Todo: Fv Returns the future value of an investment based on periodic, // constant payments and a constant interest rate. // Todo: FVSchedule Returns the future value of an initial principal after // applying a series of compound interest rates. Use FVSCHEDULE to calculate // the future value of an investment with a variable or adjustable rate. // Todo: GammaDist Returns the gamma distribution. You can use this function // to study variables that may have a skewed distribution. The gamma // distribution is commonly used in queuing analysis. // Todo: GammaInv Returns the inverse of the gamma cumulative // distribution. If p = GAMMADIST(x,...), then GAMMAINV(p,...) = x. // Todo: GammaLn Returns the natural logarithm of the gamma function, ?(x). // Todo: Gcd Returns the greatest common divisor of two or more // integers. The greatest common divisor is the largest integer that divides // both number1 and number2 without a remainder. // Todo: GeoMean Returns the geometric mean of an array or range of positive // data. For example, you can use GEOMEAN to calculate average growth rate // given compound interest with variable rates. // Todo: GeStep Returns 1 if number ? step; returns 0 (zero) otherwise. Use // this function to filter a set of values. For example, by summing several // GESTEP functions you calculate the count of values that exceed a // threshold. // Todo: Growth Calculates predicted exponential growth by using existing // data. GROWTH returns the y-values for a series of new x-values that you // specify by using existing x-values and y-values. You can also use the // GROWTH worksheet function to fit an exponential curve to existing // x-values and y-values. // Todo: HarMean Returns the harmonic mean of a data set. The harmonic mean // is the reciprocal of the arithmetic mean of reciprocals. // Todo: Hex2Bin Converts a hexadecimal number to binary. // Todo: Hex2Dec Converts a hexadecimal number to decimal. // Todo: Hex2Oct Converts a hexadecimal number to octal. // Todo: HLookup Searches for a value in the top row of a table or an array // of values, and then returns a value in the same column from a row you // specify in the table or array. Use HLOOKUP when your comparison values // are located in a row across the top of a table of data, and you want to // look down a specified number of rows. Use VLOOKUP when your comparison // values are located in a column to the left of the data you want to find. // Todo: HypGeomDist Returns the hypergeometric distribution. HYPGEOMDIST // returns the probability of a given number of sample successes, given the // sample size, population successes, and population size. Use HYPGEOMDIST // for problems with a finite population, where each observation is either a // success or a failure, and where each subset of a given size is chosen // with equal likelihood. // Todo: IfError Returns a value you specify if a formula evaluates to an // error; otherwise, returns the result of the formula. Use the IFERROR // function to trap and handle errors in a formula. // Todo: ImAbs Returns the absolute value (modulus) of a complex number in x // + yi or x + yj text format. // Todo: Imaginary Returns the imaginary coefficient of a complex number in // x + yi or x + yj text format. // Todo: ImArgument Returns the argument (theta), an angle expressed in // radians, such that: // Todo: ImConjugate Returns the complex conjugate of a complex number in x // + yi or x + yj text format. // Todo: ImCos Returns the cosine of a complex number in x + yi or x + yj // text format. // Todo: ImDiv Returns the quotient of two complex numbers in x + yi or x + // yj text format. // Todo: ImExp Returns the exponential of a complex number in x + yi or x + // yj text format. // Todo: ImLn Returns the natural logarithm of a complex number in x + yi or // x + yj text format. // Todo: ImLog10 Returns the common logarithm (base 10) of a complex number // in x + yi or x + yj text format. // Todo: ImLog2 Returns the base-2 logarithm of a complex number in x + yi // or x + yj text format. // Todo: ImPower Returns a complex number in x + yi or x + yj text format // raised to a power. // Todo: ImProduct Returns the product of 2 to 29 complex numbers in x + yi // or x + yj text format. // Todo: ImReal Returns the real coefficient of a complex number in x + yi // or x + yj text format. // Todo: ImSin Returns the sine of a complex number in x + yi or x + yj text // format. // Todo: ImSqrt Returns the square root of a complex number in x + yi or x + // yj text format. // Todo: ImSub Returns the difference of two complex numbers in x + yi or x // + yj text format. // Todo: ImSum Returns the sum of two or more complex numbers in x + yi or x // + yj text format. // Todo: Index Returns a value or the reference to a value from within a // table or range. There are two forms of the INDEX function: the array form // and the reference form. // Todo: Intercept Calculates the point at which a line will intersect the // y-axis by using existing x-values and y-values. The intercept point is // based on a best-fit regression line plotted through the known x-values // and known y-values. Use the INTERCEPT function when you want to determine // the value of the dependent variable when the independent variable is 0 // (zero). For example, you can use the INTERCEPT function to predict a // metal's electrical resistance at 0C when your data points were taken at // room temperature and higher. // Todo: IntRate Returns the interest rate for a fully invested security. // Todo: Ipmt Returns the interest payment for a given period for an // investment based on periodic, constant payments and a constant interest // rate. // Todo: Irr Returns the internal rate of return for a series of cash flows // represented by the numbers in values. These cash flows do not have to be // even, as they would be for an annuity. However, the cash flows must occur // at regular intervals, such as monthly or annually. The internal rate of // return is the interest rate received for an investment consisting of // payments (negative values) and income (positive values) that occur at // regular periods. // Todo: IsErr Checks the type of value and returns TRUE or FALSE depending // if the value refers to any error value except #N/A. // Todo: IsError Checks the type of value and returns TRUE or FALSE // depending if the value refers to any error value (#N/A, #VALUE!, #REF!, // #DIV/0!, #NUM!, #NAME?, or #NULL!). // Todo: IsEven Checks the type of value and returns TRUE or FALSE depending // if the value is even. // Todo: IsLogical Checks the type of value and returns TRUE or FALSE // depending if the value refers to a logical value. // Todo: IsNA Checks the type of value and returns TRUE or FALSE depending // if the value refers to the #N/A (value not available) error value. // Todo: IsNonText Checks the type of value and returns TRUE or FALSE // depending if the value refers to any item that is not text. (Note that // this function returns TRUE if value refers to a blank cell.) // Todo: IsNumber Checks the type of value and returns TRUE or FALSE // depending if the value refers to a number. // Todo: IsOdd Checks the type of value and returns TRUE or FALSE depending // if the value is odd. // Todo: Ispmt Calculates the interest paid during a specific period of an // investment. This function is provided for compatibility with Lotus 1-2-3. // Todo: IsText Checks the type of value and returns TRUE or FALSE depending // if the value refers to text. // Todo: Kurt Returns the kurtosis of a data set. Kurtosis characterizes the // relative peakedness or flatness of a distribution compared with the // normal distribution. Positive kurtosis indicates a relatively peaked // distribution. Negative kurtosis indicates a relatively flat distribution. // Todo: Large Returns the k-th largest value in a data set. You can use // this function to select a value based on its relative standing. For // example, you can use LARGE to return the highest, runner-up, or // third-place score. // Todo: Lcm Returns the least common multiple of integers. The least common // multiple is the smallest positive integer that is a multiple of all // integer arguments number1, number2, and so on. Use LCM to add fractions // with different denominators. // Todo: LinEst Calculates the statistics for a line by using the "least // squares" method to calculate a straight line that best fits your data, // and returns an array that describes the line. Because this function // returns an array of values, it must be entered as an array formula. // Todo: Ln Returns the natural logarithm of a number. Natural logarithms // are based on the constant e (2.71828182845904). // See Vba // Skip: Log Returns the logarithm of a number to the base you specify. @FunctionName("Log10") @Description("Returns the base-10 logarithm of a number.") public static double log10(double number) { return Math.log10(number); } // Todo: LogEst In regression analysis, calculates an exponential curve that // fits your data and returns an array of values that describes the // curve. Because this function returns an array of values, it must be // entered as an array formula. // Todo: LogInv Use the lognormal distribution to analyze logarithmically // transformed data. // Todo: LogNormDist Returns the cumulative lognormal distribution of x, // where ln(x) is normally distributed with parameters mean and // standard_dev. Use this function to analyze data that has been // logarithmically transformed. // Todo: Lookup Returns a value either from a one-row or one-column range or // from an array. The LOOKUP function has two syntax forms: the vector form // and the array form. // Todo: Match Returns the relative position of an item in an array that // matches a specified value in a specified order. Use MATCH instead of one // of the LOOKUP functions when you need the position of an item in a range // instead of the item itself. // Skip: Max Returns the largest value in a set of values. Todo: MDeterm // Returns the matrix determinant of an array. /** * The MOD function. Not technically in the Excel package, but this seemed * like a good place to put it, since Excel has a MOD function. * * @param first First * @param second Second * @return First modulo second */ @FunctionName("Mod") @JavaFunDef.Signature("Mod(n, d)") @Description("Returns the remainder of dividing n by d.") public static double mod( Object first, Object second) { double iFirst; if (!(first instanceof Number)) { throw new InvalidArgumentException( "Invalid parameter. " + "first parameter " + first + " of Mod function must be of type number"); } else { iFirst = ((Number) first).doubleValue(); } double iSecond; if (!(second instanceof Number)) { throw new InvalidArgumentException( "Invalid parameter. " + "second parameter " + second + " of Mod function must be of type number"); } else { iSecond = ((Number) second).doubleValue(); } // Use formula "mod(n, d) = n - d * int(n / d)". if (iSecond == 0) { throw new ArithmeticException("/ by zero"); } return iFirst - iSecond * Vba.intNative(iFirst / iSecond); } // Todo: MDuration Returns the modified Macauley duration for a security // with an assumed par value of $100. // Skip: Median Returns the median of the given numbers. The median is the // number in the middle of a set of numbers. Skip: Min Returns the smallest // number in a set of values. Todo: MInverse Returns the inverse matrix for // the matrix stored in an array. // Todo: MIrr Returns the modified internal rate of return for a series of // periodic cash flows. MIRR considers both the cost of the investment and // the interest received on reinvestment of cash. // Todo: MMult Returns the matrix product of two arrays. The result is an // array with the same number of rows as array1 and the same number of // columns as array2. // Todo: Mode Returns the most frequently occurring, or repetitive, value in // an array or range of data. // Todo: MRound Returns a number rounded to the desired multiple. // Todo: MultiNomial Returns the ratio of the factorial of a sum of values // to the product of factorials. // Todo: NegBinomDist Returns the negative binomial // distribution. NEGBINOMDIST returns the probability that there will be // number_f failures before the number_s-th success, when the constant // probability of a success is probability_s. This function is similar to // the binomial distribution, except that the number of successes is fixed, // and the number of trials is variable. Like the binomial, trials are // assumed to be independent. // Todo: NetworkDays Returns the number of whole working days between // start_date and end_date. Working days exclude weekends and any dates // identified in holidays. Use NETWORKDAYS to calculate employee benefits // that accrue based on the number of days worked during a specific term. // Todo: Nominal Returns the nominal annual interest rate, given the // effective rate and the number of compounding periods per year. // Todo: NormDist Returns the normal distribution for the specified mean and // standard deviation. This function has a very wide range of applications // in statistics, including hypothesis testing. // Todo: NormInv Returns the inverse of the normal cumulative distribution // for the specified mean and standard deviation. // Todo: NormSDist Returns the standard normal cumulative distribution // function. The distribution has a mean of 0 (zero) and a standard // deviation of one. Use this function in place of a table of standard // normal curve areas. // Todo: NormSInv Returns the inverse of the standard normal cumulative // distribution. The distribution has a mean of zero and a standard // deviation of one. // Todo: NPer Returns the number of periods for an investment based on // periodic, constant payments and a constant interest rate. // Todo: Npv Calculates the net present value of an investment by using a // discount rate and a series of future payments (negative values) and // income (positive values). // Todo: Oct2Bin Converts an octal number to binary. // Todo: Oct2Dec Converts an octal number to decimal. // Todo: Oct2Hex Converts an octal number to hexadecimal. // Todo: Odd Returns number rounded up to the nearest odd integer. // Todo: OddFPrice Returns the price per $100 face value of a security // having an odd (short or long) first period. // Todo: OddFYield Returns the yield of a security that has an odd (short or // long) first period. // Todo: OddLPrice Returns the price per $100 face value of a security // having an odd (short or long) last coupon period. // Todo: OddLYield Returns the yield of a security that has an odd (short or // long) last period. // Skip: Or Returns TRUE if any argument is TRUE; returns FALSE if all // arguments are FALSE. Todo: Pearson Returns the Pearson product moment // correlation coefficient, r, a dimensionless index that ranges from -1.0 // to 1.0 inclusive and reflects the extent of a linear relationship between // two data sets. // We have a more efficient implementation of percentile // Skip: Percentile Returns the k-th percentile of values in a range. You // can use this function to establish a threshold of acceptance. For // example, you can decide to examine candidates who score above the 90th // percentile. // Todo: PercentRank Returns the rank of a value in a data set as a // percentage of the data set. This function can be used to evaluate the // relative standing of a value within a data set. For example, you can use // PERCENTRANK to evaluate the standing of an aptitude test score among all // scores for the test. // Todo: Permut Returns the number of permutations for a given number of // objects that can be selected from number objects. A permutation is any // set or subset of objects or events where internal order is // significant. Permutations are different from combinations, for which the // internal order is not significant. Use this function for lottery-style // probability calculations. // Todo: Phonetic Extracts the phonetic (furigana) characters from a text // string. @FunctionName("Pi") @Description( "Returns the number 3.14159265358979, the mathematical constant pi, " + "accurate to 15 digits.") public static double pi() { return Math.PI; } // Todo: Pmt Calculates the payment for a loan based on constant payments // and a constant interest rate. // Todo: Poisson Returns the Poisson distribution. A common application of // the Poisson distribution is predicting the number of events over a // specific time, such as the number of cars arriving at a toll plaza in 1 // minute. @FunctionName("Power") @Description("Returns the result of a number raised to a power.") public static double power(double x, double y) { return Math.pow(x, y); } // Todo: Ppmt Returns the payment on the principal for a given period for an // investment based on periodic, constant payments and a constant interest // rate. // Todo: Price Returns the price per $100 face value of a security that pays // periodic interest. // Todo: PriceDisc Returns the price per $100 face value of a discounted // security. // Todo: PriceMat Returns the price per $100 face value of a security that // pays interest at maturity. // Todo: Prob Returns the probability that values in a range are between two // limits. If upper_limit is not supplied, returns the probability that // values in x_range are equal to lower_limit. // Todo: Product Multiplies all the numbers given as arguments and returns // the product. // Todo: Proper Capitalizes the first letter in a text string and any other // letters in text that follow any character other than a letter. Converts // all other letters to lowercase letters. // Todo: Pv Returns the present value of an investment. The present value is // the total amount that a series of future payments is worth now. For // example, when you borrow money, the loan amount is the present value to // the lender. // Todo: Quartile Returns the quartile of a data set. Quartiles often are // used in sales and survey data to divide populations into groups. For // example, you can use QUARTILE to find the top 25 percent of incomes in a // population. // Todo: Quotient Returns the integer portion of a division. Use this // function when you want to discard the remainder of a division. @FunctionName("Radians") @Description("Converts degrees to radians.") public static double radians(double number) { // 180 degrees = Pi radians return number / 180.0 * Math.PI; } // Todo: RandBetween Returns a random integer number between the numbers you // specify. A new random integer number is returned every time the worksheet // is calculated. // Skip: Rank Returns the rank of a number in a list of numbers. The rank of // a number is its size relative to other values in a list. (If you were to // sort the list, the rank of the number would be its position.) Todo: Rate // Returns the interest rate per period of an annuity. RATE is calculated by // iteration and can have zero or more solutions. If the successive results // of RATE do not converge to within 0.0000001 after 20 iterations, RATE // returns the #NUM! error value. // Todo: Received Returns the amount received at maturity for a fully // invested security. // Todo: Replace Replaces part of a text string, based on the number of // characters you specify, with a different text string. // Todo: ReplaceB REPLACEB replaces part of a text string, based on the // number of bytes you specify, with a different text string. // Todo: Rept Repeats text a given number of times. Use REPT to fill a cell // with a number of instances of a text string. // Todo: Roman Converts an arabic numeral to roman, as text. // Todo: Round Rounds a number to a specified number of digits. // Todo: RoundDown Rounds a number down, toward zero. // Todo: RoundUp Rounds a number up, away from 0 (zero). // Todo: RSq Returns the square of the Pearson product moment correlation // coefficient through data points in known_y's and known_x's. For more // information, see PEARSON. The r-squared value can be interpreted as the // proportion of the variance in y attributable to the variance in x. // Todo: RTD This method connects to a source to receive real-time data. // Todo: Search SEARCH and SEARCHB locate one text string within a second // text string, and return the number of the starting position of the first // text string from the first character of the second text string. // Todo: SearchB SEARCH and SEARCHB locate one text string within a second // text string, and return the number of the starting position of the first // text string from the first character of the second text string. // Todo: SeriesSum Returns the sum of a power series based on the formula: // Todo: Sinh Returns the hyperbolic sine of a number. @FunctionName("Sinh") @Description("Returns the hyperbolic sine of a number.") public static double sinh(double number) { return Math.sinh(number); } // Todo: Skew Returns the skewness of a distribution. Skewness characterizes // the degree of asymmetry of a distribution around its mean. Positive // skewness indicates a distribution with an asymmetric tail extending // toward more positive values. Negative skewness indicates a distribution // with an asymmetric tail extending toward more negative values. // Todo: Sln Returns the straight-line depreciation of an asset for one // period. // Todo: Slope Returns the slope of the linear regression line through data // points in known_y's and known_x's. The slope is the vertical distance // divided by the horizontal distance between any two points on the line, // which is the rate of change along the regression line. // Todo: Small Returns the k-th smallest value in a data set. Use this // function to return values with a particular relative standing in a data // set. @FunctionName("SqrtPi") @Description("Returns the square root of (number * pi).") public static double sqrtPi(double number) { return Math.sqrt(number * Math.PI); } // Todo: Standardize Returns a normalized value from a distribution // characterized by mean and standard_dev. // Todo: StDev Estimates standard deviation based on a sample. The standard // deviation is a measure of how widely values are dispersed from the // average value (the mean). // Todo: StDevP Calculates standard deviation based on the entire population // given as arguments. The standard deviation is a measure of how widely // values are dispersed from the average value (the mean). // Todo: StEyx Returns the standard error of the predicted y-value for each // x in the regression. The standard error is a measure of the amount of // error in the prediction of y for an individual x. // Todo: Substitute Substitutes new_text for old_text in a text string. Use // SUBSTITUTE when you want to replace specific text in a text string; use // REPLACE when you want to replace any text that occurs in a specific // location in a text string. // Todo: Subtotal Creates subtotals. // Todo: Sum Adds all the numbers in a range of cells. // Todo: SumIf Adds the cells specified by a given criteria. // Todo: SumIfs Adds the cells in a range that meet multiple criteria. // Todo: SumProduct Multiplies corresponding components in the given arrays, // and returns the sum of those products. // Todo: SumSq Returns the sum of the squares of the arguments. // Todo: SumX2MY2 Returns the sum of the difference of squares of // corresponding values in two arrays. // Todo: SumX2PY2 Returns the sum of the sum of squares of corresponding // values in two arrays. The sum of the sum of squares is a common term in // many statistical calculations. // Todo: SumXMY2 Returns the sum of squares of differences of corresponding // values in two arrays. // Todo: Syd Returns the sum-of-years' digits depreciation of an asset for a // specified period. @FunctionName("Tanh") @Description("Returns the hyperbolic tangent of a number.") public static double tanh(double number) { return Math.tanh(number); } // Todo: TBillEq Returns the bond-equivalent yield for a Treasury bill. // Todo: TBillPrice Returns the price per $100 face value for a Treasury // bill. // Todo: TBillYield Returns the yield for a Treasury bill. // Todo: TDist Returns the Percentage Points (probability) for the Student // t-distribution where a numeric value (x) is a calculated value of t for // which the Percentage Points are to be computed. The t-distribution is // used in the hypothesis testing of small sample data sets. Use this // function in place of a table of critical values for the t-distribution. // Todo: Text Converts a value to text in a specific number format. // Todo: TInv Returns the t-value of the Student's t-distribution as a // function of the probability and the degrees of freedom. // Todo: Transpose Returns a vertical range of cells as a horizontal range, // or vice versa. TRANSPOSE must be entered as an array formula in a range // that has the same number of rows and columns, respectively, as an array // has columns and rows. Use TRANSPOSE to shift the vertical and horizontal // orientation of an array on a worksheet. // Todo: Trend Returns values along a linear trend. Fits a straight line // (using the method of least squares) to the arrays known_y's and // known_x's. Returns the y-values along that line for the array of new_x's // that you specify. // Todo: Trim Removes all spaces from text except for single spaces between // words. Use TRIM on text that you have received from another application // that may have irregular spacing. // Todo: TrimMean Returns the mean of the interior of a data set. TRIMMEAN // calculates the mean taken by excluding a percentage of data points from // the top and bottom tails of a data set. You can use this function when // you wish to exclude outlying data from your analysis. // Todo: TTest Returns the probability associated with a Student's // t-Test. Use TTEST to determine whether two samples are likely to have // come from the same two underlying populations that have the same mean. // Todo: USDollar The description for this item will appear in the final // release of Office 2007. // Todo: Var Estimates variance based on a sample. // Todo: VarP Calculates variance based on the entire population. // Todo: Vdb Returns the depreciation of an asset for any period you // specify, including partial periods, using the double-declining balance // method or some other method you specify. VDB stands for variable // declining balance. // Todo: VLookup Searches for a value in the first column of a table array // and returns a value in the same row from another column in the table // array. // Todo: Weekday Returns the day of the week corresponding to a date. The // day is given as an integer, ranging from 1 (Sunday) to 7 (Saturday), by // default. // Todo: WeekNum Returns a number that indicates where the week falls // numerically within a year. // Todo: Weibull Returns the Weibull distribution. Use this distribution in // reliability analysis, such as calculating a device's mean time to // failure. // Todo: WorkDay Returns a number that represents a date that is the // indicated number of working days before or after a date (the starting // date). Working days exclude weekends and any dates identified as // holidays. Use WORKDAY to exclude weekends or holidays when you calculate // invoice due dates, expected delivery times, or the number of days of work // performed. // Todo: Xirr Returns the internal rate of return for a schedule of cash // flows that is not necessarily periodic. To calculate the internal rate of // return for a series of periodic cash flows, use the IRR function. // Todo: Xnpv The description for this item will appear in the final release // of Office 2007. // Todo: YearFrac Calculates the fraction of the year represented by the // number of whole days between two dates (the start_date and the // end_date). Use the YEARFRAC worksheet function to identify the proportion // of a whole year's benefits or obligations to assign to a specific term. // Todo: YieldDisc Returns the annual yield for a discounted security. // Todo: YieldMat Returns the annual yield of a security that pays interest // at maturity. // Todo: ZTest Returns the one-tailed probability-value of a z-test. For a // given hypothesized population mean, ZTEST returns the probability that // the sample mean would be greater than the average of observations in the // data set (array) -- that is, the observed sample mean. } // End Excel.java mondrian-3.11.0.1-R/src/main/mondrian/olap/fun/vba/Vba.java000066400000000000000000002571201261646570300231520ustar00rootroot00000000000000/* // This software is subject to the terms of the Eclipse Public License v1.0 // Agreement, available at the following URL: // http://www.eclipse.org/legal/epl-v10.html. // You must accept the terms of that agreement to use this software. // // Copyright (c) 2002-2015 Pentaho Corporation.. All rights reserved. */ package mondrian.olap.fun.vba; import mondrian.olap.InvalidArgumentException; import mondrian.olap.Util; import java.text.*; import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; import static mondrian.olap.fun.JavaFunDef.*; /** * Implementations of functions in the Visual Basic for Applications (VBA) * specification. * *

The functions are defined in * MSDN * . * * @author jhyde * @since Dec 31, 2007 */ public class Vba { private static final long MILLIS_IN_A_DAY = 24 * 60 * 60 * 1000; private static final DateFormatSymbols DATE_FORMAT_SYMBOLS = new DateFormatSymbols(Locale.getDefault()); // Conversion @FunctionName("CBool") @Signature("CBool(expression)") @Description( "Returns an expression that has been converted to a Variant of subtype " + "Boolean.") public static boolean cBool(Object expression) { if (expression instanceof Boolean) { return (Boolean) expression; } else { int i = cInt(expression); return i != 0; } } // Conversion functions @FunctionName("CByte") @Signature("CByte(expression)") @Description( "Returns an expression that has been converted to a Variant of subtype " + "Byte.") public static byte cByte(Object expression) { if (expression instanceof Byte) { return (Byte) expression; } else { int i = cInt(expression); return (byte) i; } } // public Currency cCur(Object expression) @FunctionName("CDate") @Signature("CDate(date)") @Description( "Returns an expression that has been converted to a Variant of subtype " + "Date.") public static Date cDate(Object expression) { String str = String.valueOf(expression); if (expression instanceof Date) { return (Date) expression; } else if (expression == null) { return null; } else { // note that this currently only supports a limited set of dates and // times // "October 19, 1962" // "4:35:47 PM" try { return DateFormat.getTimeInstance().parse(str); } catch (ParseException ex0) { try { return DateFormat.getDateTimeInstance().parse(str); } catch (ParseException ex1) { try { return DateFormat.getDateInstance().parse(str); } catch (ParseException ex2) { throw new InvalidArgumentException( "Invalid parameter. " + "expression parameter of CDate function must be " + "formatted correctly (" + String.valueOf(expression) + ")"); } } } } } @FunctionName("CDbl") @Signature("CDbl(expression)") @Description( "Returns an expression that has been converted to a Variant of subtype " + "Double.") public static double cDbl(Object expression) { if (expression instanceof Number) { Number number = (Number) expression; return number.doubleValue(); } else { final String s = String.valueOf(expression); return new Double(s).intValue(); } } @FunctionName("CInt") @Signature("CInt(expression)") @Description( "Returns an expression that has been converted to a Variant of subtype " + "Integer.") public static int cInt(Object expression) { if (expression instanceof Number) { Number number = (Number) expression; final int intValue = number.intValue(); if (number instanceof Float || number instanceof Double) { final double doubleValue = number.doubleValue(); if (doubleValue == (double) intValue) { // Number is already an integer return intValue; } final double doubleDouble = doubleValue * 2d; if (doubleDouble == Math.floor(doubleDouble)) { // Number ends in .5 - round towards even required return (int) Math.round(doubleValue / 2d) * 2; } return (int) Math.round(doubleValue); } return intValue; } else { // Try to parse as integer before parsing as double. More // efficient, and avoids loss of precision. final String s = String.valueOf(expression); try { return Integer.parseInt(s); } catch (NumberFormatException e) { return new Double(s).intValue(); } } } // public int cLng(Object expression) // public float cSng(Object expression) // public String cStr(Object expression) // public Object cVDate(Object expression) // public Object cVErr(Object expression) // public Object cVar(Object expression) // public String error$(Object errorNumber) // public Object error(Object errorNumber) @FunctionName("Fix") @Signature("Fix(number)") @Description( "Returns the integer portion of a number. If negative, returns the " + "negative number greater than or equal to the number.") public static int fix(Object number) { if (number instanceof Number) { int v = ((Number) number).intValue(); double dv = ((Number) number).doubleValue(); if (v < 0 && v < dv) { v++; } return v; } else { throw new InvalidArgumentException( "Invalid parameter. " + "number parameter " + number + " of Int function must be " + "of type number"); } } @FunctionName("Hex") @Signature("Hex(number)") @Description( "Returns a String representing the hexadecimal value of a number.") public static String hex(Object number) { if (number instanceof Number) { return Integer.toHexString(((Number) number).intValue()) .toUpperCase(); } else { throw new InvalidArgumentException( "Invalid parameter. " + "number parameter " + number + " of Hex function must be " + "of type number"); } } @FunctionName("Int") @Signature("Int(number)") @Description( "Returns the integer portion of a number. If negative, returns the " + "negative number less than or equal to the number.") public static int int_(Object number) { if (number instanceof Number) { int v = ((Number) number).intValue(); double dv = ((Number) number).doubleValue(); if (v < 0 && v > dv) { v--; } return v; } else { throw new InvalidArgumentException( "Invalid parameter. " + "number parameter " + number + " of Int function must be " + "of type number"); } } /** * Equivalent of the {@link #int_} function on the native 'double' type. * Not an MDX function. * * @param dv Double value * @return Value rounded towards negative infinity */ static int intNative(double dv) { int v = (int) dv; if (v < 0 && v > dv) { v--; } return v; } // public String oct$(Object number) @FunctionName("Oct") @Signature("Oct(number)") @Description( "Returns a Variant (String) representing the octal value of a number.") public static String oct(Object number) { if (number instanceof Number) { return Integer.toOctalString(((Number) number).intValue()); } else { throw new InvalidArgumentException( "Invalid parameter. " + "number parameter " + number + " of Oct function must be " + "of type number"); } } // public String str$(Object number) @FunctionName("Str") @Signature("Str(number)") @Description("Returns a Variant (String) representation of a number.") public static String str(Object number) { // When numbers are converted to strings, a leading space is always // reserved for the sign of number. If number is positive, the returned // string contains a leading space and the plus sign is implied. // // Use the Format function to convert numeric values you want formatted // as dates, times, or currency or in other user-defined formats. // Unlike Str, the Format function doesn't include a leading space for // the sign of number. // // Note The Str function recognizes only the period (.) as a valid // decimal separator. When different decimal separators may be used // (for example, in international applications), use CStr to convert a // number to a string. if (number instanceof Number) { if (((Number) number).doubleValue() >= 0) { return " " + number.toString(); } else { return number.toString(); } } else { throw new InvalidArgumentException( "Invalid parameter. " + "number parameter " + number + " of Str function must be " + "of type number"); } } @FunctionName("Val") @Signature("Val(string)") @Description( "Returns the numbers contained in a string as a numeric value of " + "appropriate type.") public static double val(String string) { // The Val function stops reading the string at the first character it // can't recognize as part of a number. Symbols and characters that are // often considered parts of numeric values, such as dollar signs and // commas, are not recognized. However, the function recognizes the // radix prefixes &O (for octal) and &H (for hexadecimal). Blanks, // tabs, and linefeed characters are stripped from the argument. // // The following returns the value 1615198: // // Val(" 1615 198th Street N.E.") // In the code below, Val returns the decimal value -1 for the // hexadecimal value shown: // // Val("&HFFFF") // Note The Val function recognizes only the period (.) as a valid // decimal separator. When different decimal separators are used, as in // international applications, use CDbl instead to convert a string to // a number. string = string.replaceAll("\\s", ""); // remove all whitespace if (string.startsWith("&H")) { string = string.substring(2); Pattern p = Pattern.compile("[0-9a-fA-F]*"); Matcher m = p.matcher(string); m.find(); return Integer.parseInt(m.group(), 16); } else if (string.startsWith("&O")) { string = string.substring(2); Pattern p = Pattern.compile("[0-7]*"); Matcher m = p.matcher(string); m.find(); return Integer.parseInt(m.group(), 8); } else { // find the first number Pattern p = Pattern.compile("-?[0-9]*[.]?[0-9]*"); Matcher m = p.matcher(string); m.find(); return Double.parseDouble(m.group()); } } // DateTime // public Calendar calendar() // public void calendar(Calendar val) // public String date$() // public void date$(String val) @FunctionName("DateAdd") @Signature("DateAdd(interval, number, date)") @Description( "Returns a Variant (Date) containing a date to which a specified time " + "interval has been added.") public static Date dateAdd(String intervalName, double number, Date date) { Interval interval = Interval.valueOf(intervalName); final double floor = Math.floor(number); // We use the local calendar here. This method will therefore return // different results in different locales: it depends whether the // initial date and the final date are in DST. Calendar calendar = Calendar.getInstance(); calendar.setTime(date); if (floor != number) { final double ceil = Math.ceil(number); interval.add(calendar, (int) ceil); final long ceilMillis = calendar.getTimeInMillis(); calendar.setTime(date); interval.add(calendar, (int) floor); final long floorMillis = calendar.getTimeInMillis(); final long amount = (long) (((double) (ceilMillis - floorMillis)) * (number - floor)); calendar.add( Calendar.DAY_OF_YEAR, (int) (amount / MILLIS_IN_A_DAY)); calendar.add( Calendar.MILLISECOND, (int) (amount % MILLIS_IN_A_DAY)); } else { interval.add(calendar, (int) floor); } return calendar.getTime(); } @FunctionName("DateDiff") @Signature( "DateDiff(interval, date1, date2[, firstdayofweek[, firstweekofyear]])") @Description( "Returns a Variant (Long) specifying the number of time intervals " + "between two specified dates.") public static long dateDiff(String interval, Date date1, Date date2) { return _dateDiff( interval, date1, date2, Calendar.SUNDAY, FirstWeekOfYear.vbFirstJan1); } @FunctionName("DateDiff") @Signature( "DateDiff(interval, date1, date2[, firstdayofweek[, firstweekofyear]])") @Description( "Returns a Variant (Long) specifying the number of time intervals " + "between two specified dates.") public static long dateDiff( String interval, Date date1, Date date2, int firstDayOfWeek) { return _dateDiff( interval, date1, date2, firstDayOfWeek, FirstWeekOfYear.vbFirstJan1); } @FunctionName("DateDiff") @Signature( "DateDiff(interval, date1, date2[, firstdayofweek[, firstweekofyear]])") @Description( "Returns a Variant (Long) specifying the number of time intervals " + "between two specified dates.") public static long dateDiff( String interval, Date date1, Date date2, int firstDayOfWeek, int firstWeekOfYear) { return _dateDiff( interval, date1, date2, firstDayOfWeek, FirstWeekOfYear.values()[firstWeekOfYear]); } private static long _dateDiff( String intervalName, Date date1, Date date2, int firstDayOfWeek, FirstWeekOfYear firstWeekOfYear) { Interval interval = Interval.valueOf(intervalName); if (interval == Interval.d) { // MONDRIAN-2319 interval = Interval.y; } Calendar calendar1 = Calendar.getInstance(); firstWeekOfYear.apply(calendar1); calendar1.setTime(date1); Calendar calendar2 = Calendar.getInstance(); firstWeekOfYear.apply(calendar2); calendar2.setTime(date2); return interval.diff(calendar1, calendar2, firstDayOfWeek); } @FunctionName("DatePart") @Signature("DatePart(interval, date[,firstdayofweek[, firstweekofyear]])") @Description( "Returns a Variant (Integer) containing the specified part of a given " + "date.") public static int datePart(String interval, Date date) { return _datePart( interval, date, Calendar.SUNDAY, FirstWeekOfYear.vbFirstJan1); } @FunctionName("DatePart") @Signature("DatePart(interval, date[,firstdayofweek[, firstweekofyear]])") @Description( "Returns a Variant (Integer) containing the specified part of a given " + "date.") public static int datePart(String interval, Date date, int firstDayOfWeek) { return _datePart( interval, date, firstDayOfWeek, FirstWeekOfYear.vbFirstJan1); } @FunctionName("DatePart") @Signature("DatePart(interval, date[,firstdayofweek[, firstweekofyear]])") @Description( "Returns a Variant (Integer) containing the specified part of a given " + "date.") public static int datePart( String interval, Date date, int firstDayOfWeek, int firstWeekOfYear) { return _datePart( interval, date, firstDayOfWeek, FirstWeekOfYear.values()[firstWeekOfYear]); } private static int _datePart( String intervalName, Date date, int firstDayOfWeek, FirstWeekOfYear firstWeekOfYear) { Interval interval = Interval.valueOf(intervalName); Calendar calendar = Calendar.getInstance(); calendar.setTime(date); switch (interval) { case w: case ww: // firstWeekOfYear and firstDayOfWeek only matter for 'w' and 'ww' firstWeekOfYear.apply(calendar); calendar.setFirstDayOfWeek(firstDayOfWeek); break; } return interval.datePart(calendar); } @FunctionName("Date") @Signature("Date") @Description("Returns a Variant (Date) containing the current system date.") public static Date date() { Calendar calendar = Calendar.getInstance(); calendar.clear(); calendar.set(Calendar.HOUR_OF_DAY, 0); calendar.set(Calendar.MINUTE, 0); calendar.set(Calendar.SECOND, 0); calendar.set(Calendar.MILLISECOND, 0); return calendar.getTime(); } // public void date(Object val) @FunctionName("DateSerial") @Signature("DateSerial(year, month, day)") @Description( "Returns a Variant (Date) for a specified year, month, and day.") public static Date dateSerial(int year, int month, int day) { Calendar calendar = Calendar.getInstance(); calendar.clear(); calendar.set(year, month - 1, day); return calendar.getTime(); } @FunctionName("DateValue") @Signature("DateValue(date)") @Description("Returns a Variant (Date).") public static Date dateValue(Date date) { final Calendar calendar = Calendar.getInstance(); calendar.clear(); calendar.setTime(date); calendar.set(Calendar.HOUR_OF_DAY, 0); calendar.set(Calendar.MINUTE, 0); calendar.set(Calendar.SECOND, 0); calendar.set(Calendar.MILLISECOND, 0); return calendar.getTime(); } @FunctionName("Day") @Signature("Day(date)") @Description( "Returns a Variant (Integer) specifying a whole number between 1 and " + "31, inclusive, representing the day of the month.") public static int day(Date date) { final Calendar calendar = Calendar.getInstance(); calendar.setTime(date); return calendar.get(Calendar.DAY_OF_MONTH); } @FunctionName("Hour") @Signature("Hour(time)") @Description( "Returns a Variant (Integer) specifying a whole number between 0 and " + "23, inclusive, representing the hour of the day.") public static int hour(Date time) { final Calendar calendar = Calendar.getInstance(); calendar.setTime(time); return calendar.get(Calendar.HOUR_OF_DAY); } @FunctionName("Minute") @Signature("Minute(time)") @Description( "Returns a Variant (Integer) specifying a whole number between 0 and " + "59, inclusive, representing the minute of the hour.") public static int minute(Date time) { final Calendar calendar = Calendar.getInstance(); calendar.setTime(time); return calendar.get(Calendar.MINUTE); } @FunctionName("Month") @Signature("Month(date)") @Description( "Returns a Variant (Integer) specifying a whole number between 1 and " + "12, inclusive, representing the month of the year.") public static int month(Date date) { final Calendar calendar = Calendar.getInstance(); calendar.setTime(date); final int month = calendar.get(Calendar.MONTH); return month + 1; // convert from 0- to 1-based } @FunctionName("Now") @Signature("Now()") @Description( "Returns a Variant (Date) specifying the current date and time " + "according your computer's system date and time.") public static Date now() { return new Date(); } @FunctionName("Second") @Signature("Second(time)") @Description( "Returns a Variant (Integer) specifying a whole number between 0 and " + "59, inclusive, representing the second of the minute.") public static int second(Date time) { final Calendar calendar = Calendar.getInstance(); calendar.setTime(time); return calendar.get(Calendar.SECOND); } // public String time$() // public void time$(String val) @FunctionName("Time") @Signature("Time()") @Description("Returns a Variant (Date) indicating the current system time.") public static Date time() { return new Date(); } // public void time(Object val) @FunctionName("TimeSerial") @Signature("TimeSerial(hour, minute, second)") @Description( "Returns a Variant (Date) containing the time for a specific hour, " + "minute, and second.") public static Date timeSerial(int hour, int minute, int second) { final Calendar calendar = Calendar.getInstance(); calendar.clear(); calendar.set(Calendar.HOUR_OF_DAY, hour); calendar.set(Calendar.MINUTE, minute); calendar.set(Calendar.SECOND, second); return calendar.getTime(); } @FunctionName("TimeValue") @Signature("TimeValue(time)") @Description("Returns a Variant (Date) containing the time.") public static Date timeValue(Date time) { final Calendar calendar = Calendar.getInstance(); calendar.clear(); calendar.setTime(time); calendar.set(1970, 0, 1); return calendar.getTime(); } @FunctionName("Timer") @Signature("Timer()") @Description( "Returns a Single representing the number of seconds elapsed since " + "midnight.") public static float timer() { final Calendar calendar = Calendar.getInstance(); final long now = calendar.getTimeInMillis(); calendar.set(Calendar.HOUR_OF_DAY, 0); calendar.set(Calendar.MINUTE, 0); calendar.set(Calendar.SECOND, 0); calendar.set(Calendar.MILLISECOND, 0); final long midnight = calendar.getTimeInMillis(); return ((float) (now - midnight)) / 1000f; } @FunctionName("Weekday") @Signature("Weekday(date[, firstDayOfWeek])") @Description( "Returns a Variant (Integer) containing a whole number representing " + "the day of the week.") public static int weekday(Date date) { return weekday(date, Calendar.SUNDAY); } @FunctionName("Weekday") @Signature("Weekday(date[, firstDayOfWeek])") @Description( "Returns a Variant (Integer) containing a whole number representing " + "the day of the week.") public static int weekday(Date date, int firstDayOfWeek) { final Calendar calendar = Calendar.getInstance(); calendar.setTime(date); int weekday = calendar.get(Calendar.DAY_OF_WEEK); // adjust for start of week weekday -= (firstDayOfWeek - 1); // bring into range 1..7 weekday = (weekday + 6) % 7 + 1; return weekday; } @FunctionName("Year") @Signature("Year(date)") @Description( "Returns a Variant (Integer) containing a whole number representing " + "the year.") public static int year(Date date) { final Calendar calendar = Calendar.getInstance(); calendar.setTime(date); return calendar.get(Calendar.YEAR); } // // /* FileSystem */ // public void chDir(String path) // public void chDrive(String drive) // public String curDir$(Object drive) // public Object curDir(Object drive) // public String dir(Object pathName, FileAttribute attributes // default // FileAttribute.Normal //) // public boolean EOF(int fileNumber) // public int fileAttr(int fileNumber, int returnType /* default 1 */) // public void fileCopy(String source, String destination) // public Object fileDateTime(String pathName) // public int fileLen(String pathName) // public int freeFile(Object rangeNumber) // public FileAttribute getAttr(String pathName) // public void kill(Object pathName) // public int LOF(int fileNumber) // public int loc(int fileNumber) // public void mkDir(String path) // public void reset() // public void rmDir(String path) // public int seek(int fileNumber) // public void setAttr(String pathName, FileAttribute attributes) // // Financial @FunctionName("DDB") @Signature("DDB(cost, salvage, life, period[, factor])") @Description( "Returns a Double specifying the depreciation of an asset for a " + "specific time period using the double-declining balance method or " + "some other method you specify.") public static double dDB( double cost, double salvage, double life, double period) { return dDB(cost, salvage, life, period, 2.0); } @FunctionName("DDB") @Signature("DDB(cost, salvage, life, period[, factor])") @Description( "Returns a Double specifying the depreciation of an asset for a " + "specific time period using the double-declining balance method or " + "some other method you specify.") public static double dDB( double cost, double salvage, double life, double period, double factor) { return (((cost - salvage) * factor) / life) * period; } @FunctionName("FV") @Signature("FV(rate, nper, pmt[, pv[, type]])") @Description( "Returns a Double specifying the future value of an annuity based on " + "periodic, fixed payments and a fixed interest rate.") public static double fV(double rate, double nPer, double pmt) { return fV(rate, nPer, pmt, 0d, false); } @FunctionName("FV") @Signature("FV(rate, nper, pmt[, pv[, type]])") @Description( "Returns a Double specifying the future value of an annuity based on " + "periodic, fixed payments and a fixed interest rate.") public static double fV(double rate, double nPer, double pmt, double pv) { return fV(rate, nPer, pmt, pv, false); } @FunctionName("FV") @Signature("FV(rate, nper, pmt[, pv[, type]])") @Description( "Returns a Double specifying the future value of an annuity based on " + "periodic, fixed payments and a fixed interest rate.") public static double fV( double rate, double nPer, double pmt, double pv, boolean type) { if (rate == 0) { return -(pv + (nPer * pmt)); } else { double r1 = rate + 1; return ((1 - Math.pow(r1, nPer)) * (type ? r1 : 1) * pmt) / rate - pv * Math.pow(r1, nPer); } } @FunctionName("IPmt") @Signature("IPmt(rate, per, nper, pv[, fv[, type]])") @Description( "Returns a Double specifying the interest payment for a given period " + "of an annuity based on periodic, fixed payments and a fixed " + "interest rate.") public static double iPmt(double rate, double per, double nPer, double PV) { return iPmt(rate, per, nPer, PV, 0); } @FunctionName("IPmt") @Signature("IPmt(rate, per, nper, pv[, fv[, type]])") @Description( "Returns a Double specifying the interest payment for a given period " + "of an annuity based on periodic, fixed payments and a fixed " + "interest rate.") public static double iPmt( double rate, double per, double nPer, double PV, double fv) { return iPmt(rate, per, nPer, PV, fv, false); } @FunctionName("IPmt") @Signature("IPmt(rate, per, nper, pv[, fv[, type]])") @Description( "Returns a Double specifying the interest payment for a given period " + "of an annuity based on periodic, fixed payments and a fixed " + "interest rate.") public static double iPmt( double rate, double per, double nPer, double PV, double fv, boolean due) { double pmtVal = pmt(rate, nPer, PV, fv, due); double pValm1 = PV - pV(rate, per - 1, pmtVal, fv, due); return - pValm1 * rate; } @FunctionName("IRR") @Signature("IRR(values()[, guess])") @Description( "Returns a Double specifying the internal rate of return for a series " + "of periodic cash flows (payments and receipts).") public static double IRR(double[] valueArray) { return IRR(valueArray, 0.10); } @FunctionName("IRR") @Signature("IRR(values()[, guess])") @Description( "Returns a Double specifying the internal rate of return for a series " + "of periodic cash flows (payments and receipts).") public static double IRR(double[] valueArray, double guess) { // calc pV of stream (sum of pV's for valueArray) ((1 + guess) ^ index) double minGuess = 0.0; double maxGuess = 1.0; // i'm not certain int r = 1; if (valueArray[0] > 0) { r = -1; } for (int i = 0; i < 30; i++) { // first calculate overall return based on guess double totalPv = 0; for (int j = 0; j < valueArray.length; j++) { totalPv += valueArray[j] / Math.pow(1.0 + guess, j); } if ((maxGuess - minGuess) < 0.0000001) { return guess; } else if (totalPv * r < 0) { maxGuess = guess; } else { minGuess = guess; } // avg max min to determine next step guess = (maxGuess + minGuess) / 2; } // unable to find a match return -1; } @FunctionName("MIRR") @Signature("MIRR(values(), finance_rate, reinvest_rate)") @Description( "Returns a Double specifying the modified internal rate of return for " + "a series of periodic cash flows (payments and receipts).") public static double MIRR( double valueArray[], double financeRate, double reinvestRate) { // based on // http://en.wikipedia.org/wiki/Modified_Internal_Rate_of_Return double reNPV = 0.0; double fiNPV = 0.0; for (int j = 0; j < valueArray.length; j++) { if (valueArray[j] > 0) { reNPV += valueArray[j] / Math.pow(1.0 + reinvestRate, j); } else { fiNPV += valueArray[j] / Math.pow(1.0 + financeRate, j); } } double ratio = (- reNPV * Math.pow(1 + reinvestRate, valueArray.length)) / (fiNPV * (1 + financeRate)); return Math.pow(ratio, 1.0 / (valueArray.length - 1)) - 1.0; } @FunctionName("NPer") @Signature("NPer(rate, pmt, pv[, fv[, type]])") @Description( "Returns a Double specifying the number of periods for an annuity " + "based on periodic, fixed payments and a fixed interest rate.") public static double nPer( double rate, double pmt, double pv, double fv, boolean due) { if (rate == 0) { return -(fv + pv) / pmt; } else { double r1 = rate + 1; double ryr = (due ? r1 : 1) * pmt / rate; double a1 = ((ryr - fv) < 0) ? Math.log(fv - ryr) : Math.log(ryr - fv); double a2 = ((ryr - fv) < 0) ? Math.log(-pv - ryr) : Math.log(pv + ryr); double a3 = Math.log(r1); return (a1 - a2) / a3; } } @FunctionName("NPV") @Signature("NPV(rate, values())") @Description( "Returns a Double specifying the net present value of an investment " + "based on a series of periodic cash flows (payments and receipts) " + "and a discount rate.") public static double nPV(double r, double[] cfs) { double npv = 0; double r1 = r + 1; double trate = r1; for (int i = 0, iSize = cfs.length; i < iSize; i++) { npv += cfs[i] / trate; trate *= r1; } return npv; } @FunctionName("PPmt") @Signature("PPmt(rate, per, nper, pv[, fv[, type]])") @Description( "Returns a Double specifying the principal payment for a given period " + "of an annuity based on periodic, fixed payments and a fixed " + "interest rate.") public static double pPmt(double rate, double per, double nPer, double PV) { return pPmt(rate, per, nPer, PV, 0); } @FunctionName("PPmt") @Signature("PPmt(rate, per, nper, pv[, fv[, type]])") @Description( "Returns a Double specifying the principal payment for a given period " + "of an annuity based on periodic, fixed payments and a fixed " + "interest rate.") public static double pPmt( double rate, double per, double nPer, double PV, double fv) { return pPmt(rate, per, nPer, PV, fv, false); } @FunctionName("PPmt") @Signature("PPmt(rate, per, nper, pv[, fv[, type]])") @Description( "Returns a Double specifying the principal payment for a given period " + "of an annuity based on periodic, fixed payments and a fixed " + "interest rate.") public static double pPmt( double rate, double per, double nPer, double PV, double fv, boolean due) { return pmt(rate, nPer, PV, fv, due) - iPmt(rate, per, nPer, PV, fv, due); } @FunctionName("Pmt") @Signature("Pmt(rate, nper, pv[, fv[, type]])") @Description( "Returns a Double specifying the payment for an annuity based on " + "periodic, fixed payments and a fixed interest rate.") public static double pmt( double rate, double nPer, double pv, double fv, boolean due) { if (rate == 0) { return -(fv + pv) / nPer; } else { double r1 = rate + 1; return (fv + pv * Math.pow(r1, nPer)) * rate / ((due ? r1 : 1) * (1 - Math.pow(r1, nPer))); } } @FunctionName("PV") @Signature("PV(rate, nper, pmt[, fv[, type]])") @Description( "Returns a Double specifying the present value of an annuity based on " + "periodic, fixed payments to be paid in the future and a fixed " + "interest rate.") public static double pV( double rate, double nper, double pmt, double fv, boolean due) { if (rate == 0) { return -((nper * pmt) + fv); } else { double r1 = rate + 1; return (((1 - Math.pow(r1, nper)) / rate) * (due ? r1 : 1) * pmt - fv) / Math.pow(r1, nper); } } @FunctionName("Rate") @Signature("Rate(nper, pmt, pv[, fv[, type[, guess]]])") @Description( "Returns a Double specifying the interest rate per period for an " + "annuity.") public static double rate( double nPer, double pmt, double PV) { return rate(nPer, pmt, PV, 0); } @FunctionName("Rate") @Signature("Rate(nper, pmt, pv[, fv[, type[, guess]]])") @Description( "Returns a Double specifying the interest rate per period for an " + "annuity.") public static double rate( double nPer, double pmt, double PV, double fv) { return rate(nPer, pmt, PV, fv, false); } @FunctionName("Rate") @Signature("Rate(nper, pmt, pv[, fv[, type[, guess]]])") @Description( "Returns a Double specifying the interest rate per period for an " + "annuity.") public static double rate( double nPer, double pmt, double PV, double fv, boolean type) { return rate(nPer, pmt, PV, fv, type, 0.1); } @FunctionName("Rate") @Signature("Rate(nper, pmt, pv[, fv[, type[, guess]]])") @Description( "Returns a Double specifying the interest rate per period for an " + "annuity.") public static double rate( double nPer, // specifies the number of payment periods double pmt, // payment per period of annuity double PV, // the present value of the annuity (0 if a loan) double fv, // the future value of the annuity ($ if savings) boolean due, double guess) { if (nPer <= 0) { throw new InvalidArgumentException( "number of payment periods must be larger than 0"); } double minGuess = 0.0; double maxGuess = 1.0; // converge on the correct answer should use Newton's Method // for now use a binary search int r = 1; if (PV < fv) { r = -1; } // the vb method uses 20 iterations, but they also probably use newton's // method, // so i've bumped it up to 30 iterations. for (int n = 0; n < 30; n++) { double gFV = fV(guess, nPer, pmt, PV, due); double diff = gFV - fv; if ((maxGuess - minGuess) < 0.0000001) { return guess; } else { if (diff * r < 0) { maxGuess = guess; } else { minGuess = guess; } guess = (maxGuess + minGuess) / 2; } } // fail, not sure how VB fails return -1; } @FunctionName("SLN") @Signature("SLN(cost, salvage, life)") @Description( "Returns a Double specifying the straight-line depreciation of an " + "asset for a single period.") public static double sLN(double cost, double salvage, double life) { return (cost - salvage) / life; } @FunctionName("SYD") @Signature("SYD(cost, salvage, life, period)") @Description( "Returns a Double specifying the sum-of-years' digits depreciation of " + "an asset for a specified period.") public static double sYD( double cost, double salvage, double life, double period) { return (cost - salvage) * (life / (period * (period + 1) / 2)); } // Information // public Throwable err() // public Object iMEStatus() @FunctionName("IsArray") @Signature("IsArray(varname)") @Description( "Returns a Boolean value indicating whether a variable is an array.") public boolean isArray(Object varName) { // arrays are not supported at present return false; } @FunctionName("IsDate") @Signature("IsDate(varname)") @Description( "Returns a Boolean value indicating whether an expression can be " + "converted to a date.") public static boolean isDate(Object expression) { // IsDate returns True if Expression represents a valid date, a valid // time, or a valid date and time. try { Date val = cDate(expression); return (val != null); } catch (InvalidArgumentException e) { return false; } } // use mondrian's implementation of IsEmpty // public boolean isEmpty(Object expression) @FunctionName("IsError") @Signature("IsError(varname)") @Description( "Returns a Boolean value indicating whether an expression is an error " + "value.") public boolean isError(Object expression) { return expression instanceof Throwable; } @FunctionName("IsMissing") @Signature("IsMissing(varname)") @Description( "Returns a Boolean value indicating whether an optional Variant " + "argument has been passed to a procedure.") public boolean isMissing(Object argName) { // We have no way to detect missing arguments. return false; } @FunctionName("IsNull") @Signature("IsNull(varname)") @Description( "Returns a Boolean value that indicates whether an expression " + "contains no valid data (Null).") public boolean isNull(Object expression) { return expression == null; } @FunctionName("IsNumeric") @Signature("IsNumeric(varname)") @Description( "Returns a Boolean value indicating whether an expression can be " + "evaluated as a number.") public boolean isNumeric(Object expression) { return expression instanceof Number; } @FunctionName("IsObject") @Signature("IsObject(varname)") @Description( "Returns a Boolean value indicating whether an identifier represents " + "an object variable.") public boolean isObject(Object expression) { return false; } // public int qBColor(int color) // public int RGB(int red, int green, int blue) @FunctionName("TypeName") @Signature("TypeName(varname)") @Description("Returns a String that provides information about a variable.") public static String typeName(Object varName) { // The string returned by TypeName can be any one of the following: // // String returned Variable // object type An object whose type is objecttype // Byte Byte value // Integer Integer // Long Long integer // Single Single-precision floating-point number // Double Double-precision floating-point number // Currency Currency value // Decimal Decimal value // Date Date value // String String // Boolean Boolean value // Error An error value // Empty Uninitialized // Null No valid data // Object An object // Unknown An object whose type is unknown // Nothing Object variable that doesn't refer to an object if (varName == null) { return "NULL"; } else { // strip off the package information String name = varName.getClass().getName(); if (name.lastIndexOf(".") >= 0) { name = name.substring(name.lastIndexOf(".") + 1); } return name; } } // public VarType varType(Object varName) // Interaction // public void appActivate(Object title, Object wait) // public void beep() // public Object callByName(Object object, String procName, CallType // callType, Object args, int lcid) // public Object choose(float index, Object choice) // public String command$() // public Object command() // public Object createObject(String Class, String serverName) // public int doEvents() // public String environ$(Object expression) // public Object environ(Object expression) // public Object getAllSettings(String appName, String section) // public Object getObject(Object pathName, Object Class) // public String getSetting(String appName, String section, String key, // Object Default) // public Object iIf(Object expression, Object truePart, Object falsePart) // public String inputBox(Object prompt, Object title, Object Default, // Object xPos, Object yPos, Object helpFile, Object context) // public String macScript(String script) // public MsgBoxResult msgBox(Object prompt, MsgBoxStyle buttons // default // MsgBoxStyle.OKOnly //, Object title, Object helpFile, Object context) // public Object partition(Object number, Object start, Object stop, Object // interval) // public void saveSetting(String appName, String section, String key, // String setting) // public void sendKeys(String string, Object wait) // public double shell(Object pathName, AppWinStyle windowStyle // default // AppWinStyle.MinimizedFocus //) // public Object Switch(Object varExpr) // Mathematical @FunctionName("Abs") @Signature("Abs(number)") @Description( "Returns a value of the same type that is passed to it specifying the " + "absolute value of a number.") public static double abs(double number) { return Math.abs(number); } @FunctionName("Atn") @Signature("Atn(number)") @Description("Returns a Double specifying the arctangent of a number.") public static double atn(double number) { return Math.atan(number); } @FunctionName("Cos") @Signature("Cos(number)") @Description("Returns a Double specifying the cosine of an angle.") public static double cos(double number) { return Math.cos(number); } @FunctionName("Exp") @Signature("Exp(number)") @Description( "Returns a Double specifying e (the base of natural logarithms) " + "raised to a power.") public static double exp(double number) { return Math.exp(number); } @FunctionName("Log") @Signature("Log(number)") @Description( "Returns a Double specifying the natural logarithm of a number.") public static double log(double number) { return Math.log(number); } // Cannot implement randomize and rnd - we require context to hold the // seed // public void randomize(Object number) // public float rnd(Object number) @FunctionName("Round") @Signature("Round(number[, numDigitsAfterDecimal])") @Description( "Returns a number rounded to a specified number of decimal places.") public static double round(double number) { return Math.round(number); } @FunctionName("Round") @Signature("Round(number[, numDigitsAfterDecimal])") @Description( "Returns a number rounded to a specified number of decimal places.") public static double round(double number, int numDigitsAfterDecimal) { if (numDigitsAfterDecimal == 0) { return Math.round(number); } final double shift = Math.pow(10d, numDigitsAfterDecimal); double numberScaled = number * shift; double resultScaled = Math.round(numberScaled); return resultScaled / shift; } @FunctionName("Sgn") @Signature("Sgn(number)") @Description("Returns a Variant (Integer) indicating the sign of a number.") public static int sgn(double number) { // We could use Math.signum(double) from JDK 1.5 onwards. return number < 0.0d ? -1 : number > 0.0d ? 1 : 0; } @FunctionName("Sin") @Signature("Sin(number)") @Description("Returns a Double specifying the sine of an angle.") public static double sin(double number) { return Math.sin(number); } @FunctionName("Sqr") @Signature("Sqr(number)") @Description("Returns a Double specifying the square root of a number.") public static double sqr(double number) { return Math.sqrt(number); } @FunctionName("Tan") @Signature("Tan(number)") @Description("Returns a Double specifying the tangent of an angle.") public static double tan(double number) { return Math.tan(number); } // Strings @FunctionName("Asc") @Signature("Asc(string)") @Description( "Returns an Integer representing the character code corresponding to " + "the first letter in a string.") public static int asc(String string) { return string.charAt(0); } @FunctionName("AscB") @Signature("AscB(string)") @Description("See Asc.") public static int ascB(String string) { return (byte) string.charAt(0); } @FunctionName("AscW") @Signature("AscW(string)") @Description("See Asc.") public static int ascW(String string) { return asc(string); } // public String chr$(int charCode) // public String chrB$(int charCode) @FunctionName("Chr") @Signature("Chr(charcode)") @Description( "Returns a String containing the character associated with the " + "specified character code.") public static String chr(int charCode) { return new String(new char[] { (char) charCode }); } @FunctionName("ChrB") @Signature("ChrB(charcode)") @Description("See Chr.") public static String chrB(int charCode) { return new String(new byte[] { (byte) charCode }); } // public String chrW$(int charCode) @FunctionName("ChrW") @Signature("ChrW(charcode)") @Description("See Chr.") public static String chrW(int charCode) { return new String(new char[] { (char) charCode }); } // public Object filter(Object sourceArray, String match, boolean include // // default 1 //, int compare // default BinaryCompare //) // public String format$(Object expression, Object format, int // firstDayOfWeek // default Sunday //, int firstWeekOfYear // default // FirstJan1 //) @FunctionName("FormatCurrency") @Signature( "FormatCurrency(Expression[,NumDigitsAfterDecimal " + "[,IncludeLeadingDigit [,UseParensForNegativeNumbers " + "[,GroupDigits]]]])") @Description( "Returns an expression formatted as a currency value using the " + "currency symbol defined in the system control panel.") public static String formatCurrency(Object expression) { return formatCurrency(expression, -1, -2, -2, -2); } @FunctionName("FormatCurrency") @Signature( "FormatCurrency(Expression[,NumDigitsAfterDecimal " + "[,IncludeLeadingDigit [,UseParensForNegativeNumbers " + "[,GroupDigits]]]])") @Description( "Returns an expression formatted as a currency value using the " + "currency symbol defined in the system control panel.") public static String formatCurrency( Object expression, int numDigitsAfterDecimal) { return formatCurrency(expression, numDigitsAfterDecimal, -2, -2, -2); } @FunctionName("FormatCurrency") @Signature( "FormatCurrency(Expression[,NumDigitsAfterDecimal " + "[,IncludeLeadingDigit [,UseParensForNegativeNumbers " + "[,GroupDigits]]]])") @Description( "Returns an expression formatted as a currency value using the " + "currency symbol defined in the system control panel.") public static String formatCurrency( Object expression, int numDigitsAfterDecimal, int includeLeadingDigit) { return formatCurrency( expression, numDigitsAfterDecimal, includeLeadingDigit, -2, -2); } @FunctionName("FormatCurrency") @Signature( "FormatCurrency(Expression[,NumDigitsAfterDecimal " + "[,IncludeLeadingDigit [,UseParensForNegativeNumbers " + "[,GroupDigits]]]])") @Description( "Returns an expression formatted as a currency value using the " + "currency symbol defined in the system control panel.") public static String formatCurrency( Object expression, int numDigitsAfterDecimal, int includeLeadingDigit, int useParensForNegativeNumbers) { return formatCurrency( expression, numDigitsAfterDecimal, includeLeadingDigit, useParensForNegativeNumbers, -2); } @FunctionName("FormatCurrency") @Signature( "FormatCurrency(Expression[,NumDigitsAfterDecimal " + "[,IncludeLeadingDigit [,UseParensForNegativeNumbers " + "[,GroupDigits]]]])") @Description( "Returns an expression formatted as a currency value using the " + "currency symbol defined in the system control panel.") public static String formatCurrency( Object expression, int numDigitsAfterDecimal, int includeLeadingDigit, int useParensForNegativeNumbers, int groupDigits) { DecimalFormat format = (DecimalFormat) NumberFormat.getCurrencyInstance(); if (numDigitsAfterDecimal != -1) { format.setMaximumFractionDigits(numDigitsAfterDecimal); format.setMinimumFractionDigits(numDigitsAfterDecimal); } if (includeLeadingDigit != -2) { if (includeLeadingDigit != 0) { format.setMinimumIntegerDigits(1); } else { format.setMinimumIntegerDigits(0); } } if (useParensForNegativeNumbers != -2) { // todo: implement. // This will require tweaking of the currency expression } if (groupDigits != -2) { if (groupDigits != 0) { format.setGroupingUsed(false); } else { format.setGroupingUsed(true); } } return format.format(expression); } @FunctionName("FormatDateTime") @Signature("FormatDateTime(Date[,NamedFormat])") @Description("Returns an expression formatted as a date or time.") public static String formatDateTime(Date date) { return formatDateTime(date, 0); } @FunctionName("FormatDateTime") @Signature("FormatDateTime(Date[,NamedFormat])") @Description("Returns an expression formatted as a date or time.") public static String formatDateTime( Date date, int namedFormat /* default 0, GeneralDate */) { // todo: test // todo: how do we support VB Constants? Strings or Ints? switch (namedFormat) { // vbLongDate, 1 // Display a date using the long date format specified in your // computer's regional settings. case 1: return DateFormat.getDateInstance(DateFormat.LONG).format(date); // vbShortDate, 2 // Display a date using the short date format specified in your // computer's regional settings. case 2: return DateFormat.getDateInstance(DateFormat.SHORT).format(date); // vbLongTime, 3 // Display a time using the time format specified in your computer's // regional settings. case 3: return DateFormat.getTimeInstance(DateFormat.LONG).format(date); // vbShortTime, 4 // Display a time using the 24-hour format (hh:mm). case 4: return DateFormat.getTimeInstance(DateFormat.SHORT).format(date); // vbGeneralDate, 0 // Display a date and/or time. If there is a date part, // display it as a short date. If there is a time part, // display it as a long time. If present, both parts are // displayed. // // todo: how do we determine if there is a "time part" in java? case 0: default: return DateFormat.getDateTimeInstance().format(date); } } // Format is implemented with FormatFunDef, third and fourth params are not // supported // @FunctionName("Format") // @Signature("Format(expression[, format[, firstdayofweek[, // firstweekofyear]]])") // @Description("Returns a Variant (String) containing an expression // formatted according to instructions contained in a format expression.") @FunctionName("FormatNumber") @Signature( "FormatNumber(Expression[,NumDigitsAfterDecimal [,IncludeLeadingDigit " + "[,UseParensForNegativeNumbers [,GroupDigits]]]])") @Description("Returns an expression formatted as a number.") public static String formatNumber(Object expression) { return formatNumber(expression, -1); } @FunctionName("FormatNumber") @Signature( "FormatNumber(Expression[,NumDigitsAfterDecimal [,IncludeLeadingDigit " + "[,UseParensForNegativeNumbers [,GroupDigits]]]])") @Description("Returns an expression formatted as a number.") public static String formatNumber( Object expression, int numDigitsAfterDecimal) { return formatNumber(expression, numDigitsAfterDecimal, -1); } @FunctionName("FormatNumber") @Signature( "FormatNumber(Expression[,NumDigitsAfterDecimal [,IncludeLeadingDigit " + "[,UseParensForNegativeNumbers [,GroupDigits]]]])") @Description("Returns an expression formatted as a number.") public static String formatNumber( Object expression, int numDigitsAfterDecimal, int includeLeadingDigit) { return formatNumber( expression, numDigitsAfterDecimal, includeLeadingDigit, -1); } @FunctionName("FormatNumber") @Signature( "FormatNumber(Expression[,NumDigitsAfterDecimal [,IncludeLeadingDigit " + "[,UseParensForNegativeNumbers [,GroupDigits]]]])") @Description("Returns an expression formatted as a number.") public static String formatNumber( Object expression, int numDigitsAfterDecimal, int includeLeadingDigit, int useParensForNegativeNumbers) { return formatNumber( expression, numDigitsAfterDecimal, includeLeadingDigit, useParensForNegativeNumbers, -1); } @FunctionName("FormatNumber") @Signature( "FormatNumber(Expression[,NumDigitsAfterDecimal [,IncludeLeadingDigit " + "[,UseParensForNegativeNumbers [,GroupDigits]]]])") @Description("Returns an expression formatted as a number.") public static String formatNumber( Object expression, int numDigitsAfterDecimal /* default -1 */, int includeLeadingDigit /* default usedefault */, int useParensForNegativeNumbers /* default UseDefault */, int groupDigits /* default UseDefault */) { NumberFormat format = NumberFormat.getNumberInstance(); if (numDigitsAfterDecimal != -1) { format.setMaximumFractionDigits(numDigitsAfterDecimal); format.setMinimumFractionDigits(numDigitsAfterDecimal); } if (includeLeadingDigit != -1) { if (includeLeadingDigit != 0) { // true format.setMinimumIntegerDigits(1); } else { format.setMinimumIntegerDigits(0); } } if (useParensForNegativeNumbers != -1) { if (useParensForNegativeNumbers != 0) { DecimalFormat dformat = (DecimalFormat)format; dformat.setNegativePrefix("("); dformat.setNegativeSuffix(")"); } else { DecimalFormat dformat = (DecimalFormat)format; dformat.setNegativePrefix( "" + dformat.getDecimalFormatSymbols().getMinusSign()); dformat.setNegativeSuffix(""); } } if (groupDigits != -1) { format.setGroupingUsed(groupDigits != 0); } return format.format(expression); } @FunctionName("FormatPercent") @Signature( "FormatPercent(Expression[,NumDigitsAfterDecimal " + "[,IncludeLeadingDigit [,UseParensForNegativeNumbers " + "[,GroupDigits]]]])") @Description( "Returns an expression formatted as a percentage (multipled by 100) " + "with a trailing % character.") public static String formatPercent(Object expression) { return formatPercent(expression, -1); } @FunctionName("FormatPercent") @Signature( "FormatPercent(Expression[,NumDigitsAfterDecimal " + "[,IncludeLeadingDigit [,UseParensForNegativeNumbers " + "[,GroupDigits]]]])") @Description( "Returns an expression formatted as a percentage (multipled by 100) " + "with a trailing % character.") public static String formatPercent( // todo: impl & test Object expression, int numDigitsAfterDecimal /* default -1 */) { return formatPercent(expression, numDigitsAfterDecimal, -1); } @FunctionName("FormatPercent") @Signature( "FormatPercent(Expression[,NumDigitsAfterDecimal " + "[,IncludeLeadingDigit [,UseParensForNegativeNumbers " + "[,GroupDigits]]]])") @Description( "Returns an expression formatted as a percentage (multipled by 100) " + "with a trailing % character.") public static String formatPercent( // todo: impl & test Object expression, int numDigitsAfterDecimal /* default -1 */, int includeLeadingDigit /* default UseDefault */) { return formatPercent( expression, numDigitsAfterDecimal, includeLeadingDigit, -1); } @FunctionName("FormatPercent") @Signature( "FormatPercent(Expression[,NumDigitsAfterDecimal " + "[,IncludeLeadingDigit [,UseParensForNegativeNumbers " + "[,GroupDigits]]]])") @Description( "Returns an expression formatted as a percentage (multipled by 100) " + "with a trailing % character.") public static String formatPercent( // todo: impl & test Object expression, int numDigitsAfterDecimal /* default -1 */, int includeLeadingDigit /* default UseDefault */, int useParensForNegativeNumbers /* default UseDefault */) { return formatPercent( expression, numDigitsAfterDecimal, includeLeadingDigit, useParensForNegativeNumbers, -1); } @FunctionName("FormatPercent") @Signature( "FormatPercent(Expression[,NumDigitsAfterDecimal " + "[,IncludeLeadingDigit [,UseParensForNegativeNumbers " + "[,GroupDigits]]]])") @Description( "Returns an expression formatted as a percentage (multipled by 100) " + "with a trailing % character.") public static String formatPercent( Object expression, int numDigitsAfterDecimal /* default -1 */, int includeLeadingDigit /* default UseDefault */, int useParensForNegativeNumbers /* default UseDefault */, int groupDigits /* default UseDefault */) { NumberFormat format = NumberFormat.getPercentInstance(); if (numDigitsAfterDecimal != -1) { format.setMaximumFractionDigits(numDigitsAfterDecimal); format.setMinimumFractionDigits(numDigitsAfterDecimal); } if (includeLeadingDigit != -1) { if (includeLeadingDigit != 0) { // true format.setMinimumIntegerDigits(1); } else { format.setMinimumIntegerDigits(0); } } if (useParensForNegativeNumbers != -1) { if (useParensForNegativeNumbers != 0) { DecimalFormat dformat = (DecimalFormat)format; dformat.setNegativePrefix("("); dformat.setNegativeSuffix( "" + dformat.getDecimalFormatSymbols().getPercent() + ")"); } else { DecimalFormat dformat = (DecimalFormat)format; dformat.setNegativePrefix( "" + dformat.getDecimalFormatSymbols().getMinusSign()); dformat.setNegativeSuffix( "" + dformat.getDecimalFormatSymbols().getPercent()); } } if (groupDigits != -1) { format.setGroupingUsed(groupDigits != 0); } return format.format(expression); } // public Object inStrB(Object start, Object string1, Object string2, int // compare /* default BinaryCompare */) @FunctionName("InStr") @Signature("InStr([start, ]stringcheck, stringmatch[, compare])") @Description( "Returns a Variant (Long) specifying the position of the first " + "occurrence of one string within another.") public static int inStr(String stringCheck, String stringMatch) { return inStr(1, stringCheck, stringMatch, 0); } @FunctionName("InStr") @Signature("InStr([start, ]stringcheck, stringmatch[, compare])") @Description( "Returns the position of an occurrence of one string within " + "another.") public static int inStr( int start /* default 1 */, String stringCheck, String stringMatch) { return inStr(start, stringCheck, stringMatch, 0); } @FunctionName("InStr") @Signature("InStr([start, ]stringcheck, stringmatch[, compare])") @Description( "Returns the position of an occurrence of one string within " + "another.") public static int inStr( int start /* default 1 */, String stringCheck, String stringMatch, int compare /* default BinaryCompare */) { // todo: implement binary vs. text compare if (start == 0 || start < -1) { throw new InvalidArgumentException( "start must be -1 or a location in the string to start"); } if (start != -1) { return stringCheck.indexOf(stringMatch, start - 1) + 1; } else { return stringCheck.indexOf(stringMatch) + 1; } } @FunctionName("InStrRev") @Signature("InStrRev(stringcheck, stringmatch[, start[, compare]])") @Description( "Returns the position of an occurrence of one string within another, " + "from the end of string.") public static int inStrRev(String stringCheck, String stringMatch) { return inStrRev(stringCheck, stringMatch, -1); } @FunctionName("InStrRev") @Signature("InStrRev(stringcheck, stringmatch[, start[, compare]])") @Description( "Returns the position of an occurrence of one string within another, " + "from the end of string.") public static int inStrRev( String stringCheck, String stringMatch, int start /* default -1 */) { return inStrRev(stringCheck, stringMatch, start, 0); } @FunctionName("InStrRev") @Signature("InStrRev(stringcheck, stringmatch[, start[, compare]])") @Description( "Returns the position of an occurrence of one string within another, " + "from the end of string.") public static int inStrRev( String stringCheck, String stringMatch, int start /* default -1 */, int compare /* default BinaryCompare */) { // todo: implement binary vs. text compare if (start == 0 || start < -1) { throw new InvalidArgumentException( "start must be -1 or a location in the string to start"); } if (start != -1) { return stringCheck.lastIndexOf(stringMatch, start - 1) + 1; } else { return stringCheck.lastIndexOf(stringMatch) + 1; } } // public String join(Object sourceArray, Object delimiter) @FunctionName("LCase") @Signature("LCase(string)") @Description("Returns a String that has been converted to lowercase.") public static String lCase(String string) { return string.toLowerCase(); } // public Object lCase$(Object string) // public String lTrim$(String string) @FunctionName("LTrim") @Signature("LTrim(string)") @Description( "Returns a Variant (String) containing a copy of a specified string " + "without leading spaces.") public static String lTrim(String string) { int i = 0, n = string.length(); while (i < n) { if (string.charAt(i) > ' ') { break; } i++; } return string.substring(i); } // public String left$(String string, int length) // public String leftB$(String string, int length) // public Object leftB(Object string, int length) @FunctionName("Left") @Signature("Left(string, length)") @Description( "Returns a specified number of characters from the left side of a " + "string.") public static String left(String string, int length) { final int stringLength = string.length(); if (length >= stringLength) { return string; } return string.substring(0, length); } // public Object lenB(Object expression) // len is already implemented in BuiltinFunTable... defer // @FunctionName("Len") // @Signature("Len(String)") // @Description("Returns a Long containing the number of characters in a // string.") // public static int len(String expression) { // return expression.length(); // } // public String mid$(String string, int start, Object length) // public String midB$(String string, int start, Object length) // public Object midB(Object string, int start, Object length) @FunctionName("Mid") @Signature("Mid(value, beginIndex[, length])") @Description("Returns a specified number of characters from a string.") public static String mid(String value, int beginIndex) { // If we used 'value.length() - beginIndex' as the default value for // length, we'd have problems if beginIndex is huge; // so 'value.length()' looks like an overestimate - but will always // return the correct result. final int length = value.length(); return mid(value, beginIndex, length); } @FunctionName("Mid") @Signature("Mid(value, beginIndex[, length])") @Description("Returns a specified number of characters from a string.") public static String mid(String value, int beginIndex, int length) { // Arguments are 1-based. Spec says that the function gives an error if // Start <= 0 or Length < 0. if (beginIndex <= 0) { throw new InvalidArgumentException( "Invalid parameter. " + "Start parameter of Mid function must be positive"); } if (length < 0) { throw new InvalidArgumentException( "Invalid parameter. " + "Length parameter of Mid function must be non-negative"); } if (beginIndex > value.length()) { return ""; } // Shift from 1-based to 0-based. --beginIndex; int endIndex = beginIndex + length; return endIndex >= value.length() ? value.substring(beginIndex) : value .substring(beginIndex, endIndex); } @FunctionName("MonthName") @Signature("MonthName(month, abbreviate)") @Description("Returns a string indicating the specified month.") public static String monthName(int month, boolean abbreviate) { // VB months are 1-based, Java months are 0-based --month; return (abbreviate ? getDateFormatSymbols().getShortMonths() : getDateFormatSymbols().getMonths())[month]; } /** * Returns an instance of {@link DateFormatSymbols} for the current locale. * *

* Todo: inherit locale from connection. * * @return a DateFormatSymbols object */ private static DateFormatSymbols getDateFormatSymbols() { // We would use DataFormatSymbols.getInstance(), but it is only // available from JDK 1.6 onwards. return DATE_FORMAT_SYMBOLS; } // public String rTrim$(String string) @FunctionName("RTrim") @Signature("RTrim(string)") @Description( "Returns a Variant (String) containing a copy of a specified string " + "without trailing spaces.") public static String rTrim(String string) { int i = string.length() - 1; while (i >= 0) { if (string.charAt(i) > ' ') { break; } i--; } return string.substring(0, i + 1); } @FunctionName("Replace") @Signature( "Replace(expression, find, replace[, start[, count[, compare]]])") @Description( "Returns a string in which a specified substring has been replaced " + "with another substring a specified number of times.") public static String replace( String expression, String find, String replace, int start, int count, int compare) { // compare is currently ignored Util.discard(compare); return _replace(expression, find, replace, start, count); } @FunctionName("Replace") @Signature( "Replace(expression, find, replace[, start[, count[, compare]]])") @Description( "Returns a string in which a specified substring has been replaced " + "with another substring a specified number of times.") public static String replace( String expression, String find, String replace, int start, int count) { return _replace(expression, find, replace, start, count); } @FunctionName("Replace") @Signature( "Replace(expression, find, replace[, start[, count[, compare]]])") @Description( "Returns a string in which a specified substring has been replaced " + "with another substring a specified number of times.") public static String replace( String expression, String find, String replace, int start) { return _replace(expression, find, replace, start, -1); } @FunctionName("Replace") @Signature( "Replace(expression, find, replace[, start[, count[, compare]]])") @Description("") public static String replace( String expression, String find, String replace) { // compare is currently ignored return _replace(expression, find, replace, 1, -1); } private static String _replace( String expression, String find, String replace, int start /* default 1 */, int count /* default -1 */) { final StringBuilder buf = new StringBuilder(expression); int i = 0; int pos = start - 1; while (true) { if (i++ == count) { break; } final int j = buf.indexOf(find, pos); if (j == -1) { break; } buf.replace(j, j + find.length(), replace); pos = j + replace.length(); } return buf.toString(); } // public String right$(String string, int length) // public String rightB$(String string, int length) // public Object rightB(Object string, int length) @FunctionName("Right") @Signature("Right(string, length)") @Description( "Returns a Variant (String) containing a specified number of " + "characters from the right side of a string.") public static String right(String string, int length) { final int stringLength = string.length(); if (length >= stringLength) { return string; } return string.substring(stringLength - length, stringLength); } // public String space$(int number) @FunctionName("Space") @Signature("Space(number)") @Description( "Returns a Variant (String) consisting of the specified number of " + "spaces.") public static String space(int number) { return string(number, ' '); } // public Object split(String expression, Object delimiter, int limit // // default -1 //, int compare // default BinaryCompare //) @FunctionName("StrComp") @Signature("StrComp(string1, string2[, compare])") @Description( "Returns a Variant (Integer) indicating the result of a string " + "comparison.") public static int strComp(String string1, String string2) { return strComp(string1, string2, 0); } @FunctionName("StrComp") @Signature("StrComp(string1, string2[, compare])") @Description( "Returns a Variant (Integer) indicating the result of a string " + "comparison.") public static int strComp( String string1, String string2, int compare /* default BinaryCompare */) { // Note: compare is currently ignored // Wrapper already checked whether args are null assert string1 != null; assert string2 != null; return string1.compareTo(string2); } // public Object strConv(Object string, StrConv conversion, int localeID) @FunctionName("StrReverse") @Signature("StrReverse(string)") @Description( "Returns a string in which the character order of a specified string " + "is reversed.") public static String strReverse(String expression) { final char[] chars = expression.toCharArray(); for (int i = 0, j = chars.length - 1; i < j; i++, j--) { char c = chars[i]; chars[i] = chars[j]; chars[j] = c; } return new String(chars); } // public String string$(int number, Object character) @FunctionName("String") @Signature("String(number, character)") @Description("") public static String string(int number, char character) { if (character == 0) { return ""; } final char[] chars = new char[number]; Arrays.fill(chars, (char) (character % 256)); return new String(chars); } // public String trim$(String string) @FunctionName("Trim") @Signature("Trim(string)") @Description( "Returns a Variant (String) containing a copy of a specified string " + "without leading and trailing spaces.") public static String trim(String string) { // JDK has a method for trim, but not ltrim or rtrim return string.trim(); } // ucase is already implemented in BuiltinFunTable... defer // public String uCase$(String string) // @FunctionName("UCase") // @Signature("UCase(string)") // @Description("Returns a String that has been converted to uppercase.") // public String uCase(String string) { // return string.toUpperCase(); // } // TODO: should use connection's locale to determine first day of week, // not the JVM's default @FunctionName("WeekdayName") @Signature("WeekdayName(weekday, abbreviate, firstdayofweek)") @Description("Returns a string indicating the specified day of the week.") public static String weekdayName( int weekday, boolean abbreviate, int firstDayOfWeek) { // Java and VB agree: SUNDAY = 1, ... SATURDAY = 7 final Calendar calendar = Calendar.getInstance(); if (firstDayOfWeek == 0) { firstDayOfWeek = calendar.getFirstDayOfWeek(); } // compensate for start of week weekday += (firstDayOfWeek - 1); // bring into range 1..7 weekday = (weekday - 1) % 7 + 1; if (weekday <= 0) { // negative numbers give negative modulo weekday += 7; } return (abbreviate ? getDateFormatSymbols().getShortWeekdays() : getDateFormatSymbols().getWeekdays()) [weekday]; } // Misc // public Object array(Object argList) // public String input$(int number, int fileNumber) // public String inputB$(int number, int fileNumber) // public Object inputB(int number, int fileNumber) // public Object input(int number, int fileNumber) // public void width(int fileNumber, int width) /** * This function tries to emulate the behaviour of DateDiff function * from VBA. See a table of its results * here. * @param cal1 calendar, representing the first instant * @param cal2 calendar, representing the second instant * @return difference in days with respect to the behaviour of * DateDiff function */ static int computeDiffInDays(Calendar cal1, Calendar cal2) { boolean inverse; // first, put preceding instant to the second side // so, that cal2 >= cal1 if (cal2.getTimeInMillis() >= cal1.getTimeInMillis()) { inverse = false; } else { inverse = true; Calendar tmp = cal1; cal1 = cal2; cal2 = tmp; } // compute the difference in days by normalising input values // and calculate the difference between their Julian day numbers Calendar floored2 = Interval.y.floor(cal2); Calendar ceiled1 = Interval.y.floor(cal1); if (ceiled1.getTimeInMillis() != cal1.getTimeInMillis()) { ceiled1.add(Calendar.DATE, 1); } int delta = computeJdn(floored2) - computeJdn(ceiled1); // take care of the rest of data, as we get 5 p.m. for instance int rest1 = computeDelta(cal2, floored2); int rest2 = computeDelta(ceiled1, cal1); if ((rest1 + rest2) / MILLIS_IN_A_DAY >= 1) { delta++; } return inverse ? -delta : delta; } /** * Returns the Julian Day Number from a Gregorian day. * The algorithm is taken from Wikipedia: Julian Day * * @param calendar calendar * @return the Julian day number */ private static int computeJdn(Calendar calendar) { final int year = calendar.get(Calendar.YEAR); final int month = calendar.get(Calendar.MONTH) + 1; final int day = calendar.get(Calendar.DAY_OF_MONTH); int a = (14 - month) / 12; int y = year + 4800 - a; int m = month + 12 * a - 3; int jdn = day + (153 * m + 2) / 5 + 365 * y + y / 4 - y / 100 + y / 400 - 32045; return jdn; } /** * Computes the difference in milliseconds between two instants, that * have not more than 24 hours difference * @param after following instant * @param before preceding step * @return difference in milliseconds */ private static int computeDelta(Calendar after, Calendar before) { int hAfter = after.get(Calendar.HOUR_OF_DAY); int hBefore = before.get(Calendar.HOUR_OF_DAY); if (after.get(Calendar.DATE) > before.get(Calendar.DATE)) { hAfter += 24; } long result = (1000L * 60 * 60) * (hAfter - hBefore); result += (1000L * 60) * (after.get(Calendar.MINUTE) - before.get(Calendar.MINUTE)); result += 1000L * (after.get(Calendar.SECOND) - before.get(Calendar.SECOND)); result += after.get(Calendar.MILLISECOND) - before.get(Calendar.MILLISECOND); assert (result <= MILLIS_IN_A_DAY); return (int) result; } // ~ Inner classes private enum Interval { yyyy("Year", Calendar.YEAR), q("Quarter", -1), m("Month", Calendar.MONTH), y("Day of year", Calendar.DAY_OF_YEAR), d("Day", Calendar.DAY_OF_MONTH), w("Weekday", Calendar.DAY_OF_WEEK), ww("Week", Calendar.WEEK_OF_YEAR), h("Hour", Calendar.HOUR_OF_DAY), n("Minute", Calendar.MINUTE), s("Second", Calendar.SECOND); private final int dateField; Interval(String desc, int dateField) { Util.discard(desc); this.dateField = dateField; } void add(Calendar calendar, int amount) { switch (this) { case q: calendar.add(Calendar.MONTH, amount * 3); break; default: calendar.add(dateField, amount); break; } } Calendar floor(Calendar calendar) { Calendar calendar2 = Calendar.getInstance(); calendar2.setTime(calendar.getTime()); floorInplace(calendar2); return calendar2; } private void floorInplace(Calendar calendar) { switch (this) { case yyyy: calendar.set(Calendar.DAY_OF_YEAR, 1); d.floorInplace(calendar); break; case q: int month = calendar.get(Calendar.MONTH); month -= month % 3; calendar.set(Calendar.MONTH, month); calendar.set(Calendar.DAY_OF_MONTH, 1); d.floorInplace(calendar); break; case m: calendar.set(Calendar.DAY_OF_MONTH, 1); d.floorInplace(calendar); break; case w: final int dow = calendar.get(Calendar.DAY_OF_WEEK); final int firstDayOfWeek = calendar.getFirstDayOfWeek(); if (dow == firstDayOfWeek) { // nothing to do } else if (dow > firstDayOfWeek) { final int roll = firstDayOfWeek - dow; assert roll < 0; calendar.roll(Calendar.DAY_OF_WEEK, roll); } else { final int roll = firstDayOfWeek - dow - 7; assert roll < 0; calendar.roll(Calendar.DAY_OF_WEEK, roll); } d.floorInplace(calendar); break; case y: case d: calendar.set(Calendar.HOUR_OF_DAY, 0); calendar.set(Calendar.MINUTE, 0); calendar.set(Calendar.SECOND, 0); calendar.set(Calendar.MILLISECOND, 0); break; case h: calendar.set(Calendar.MINUTE, 0); calendar.set(Calendar.SECOND, 0); calendar.set(Calendar.MILLISECOND, 0); break; case n: calendar.set(Calendar.SECOND, 0); calendar.set(Calendar.MILLISECOND, 0); break; case s: calendar.set(Calendar.MILLISECOND, 0); break; } } int diff(Calendar calendar1, Calendar calendar2, int firstDayOfWeek) { switch (this) { case q: return m.diff(calendar1, calendar2, firstDayOfWeek) / 3; case y: return computeDiffInDays(calendar1, calendar2); default: return floor(calendar1).get(dateField) - floor(calendar2).get(dateField); } } int datePart(Calendar calendar) { switch (this) { case q: return (m.datePart(calendar) + 2) / 3; case m: return calendar.get(dateField) + 1; case w: int dayOfWeek = calendar.get(dateField); dayOfWeek -= (calendar.getFirstDayOfWeek() - 1); dayOfWeek = dayOfWeek % 7; if (dayOfWeek <= 0) { dayOfWeek += 7; } return dayOfWeek; default: return calendar.get(dateField); } } } private enum FirstWeekOfYear { vbUseSystem( 0, "Use the NLS API setting."), vbFirstJan1( 1, "Start with week in which January 1 occurs (default)."), vbFirstFourDays( 2, "Start with the first week that has at least four days in the new year."), vbFirstFullWeek( 3, "Start with first full week of the year."); FirstWeekOfYear(int code, String desc) { assert code == ordinal(); assert desc != null; } void apply(Calendar calendar) { switch (this) { case vbUseSystem: break; case vbFirstJan1: calendar.setMinimalDaysInFirstWeek(1); break; case vbFirstFourDays: calendar.setMinimalDaysInFirstWeek(4); break; case vbFirstFullWeek: calendar.setMinimalDaysInFirstWeek(7); break; } } } } // End Vba.java mondrian-3.11.0.1-R/src/main/mondrian/olap/fun/vba/package.html000066400000000000000000000002011261646570300240420ustar00rootroot00000000000000 Implements the set of functions defined by the Visual Basic for Applications (VBA) specification. mondrian-3.11.0.1-R/src/main/mondrian/olap/package.html000066400000000000000000000002201261646570300225030ustar00rootroot00000000000000 Mondrian's core package, this defines connections and the catalog metamodel, and allows you to execute queries. mondrian-3.11.0.1-R/src/main/mondrian/olap/type/000077500000000000000000000000001261646570300212115ustar00rootroot00000000000000mondrian-3.11.0.1-R/src/main/mondrian/olap/type/BooleanType.java000066400000000000000000000014701261646570300242770ustar00rootroot00000000000000/* // This software is subject to the terms of the Eclipse Public License v1.0 // Agreement, available at the following URL: // http://www.eclipse.org/legal/epl-v10.html. // You must accept the terms of that agreement to use this software. // // Copyright (C) 2005-2005 Julian Hyde // Copyright (C) 2005-2009 Pentaho // All Rights Reserved. */ package mondrian.olap.type; /** * The type of a boolean expression. * * @author jhyde * @since Feb 17, 2005 */ public class BooleanType extends ScalarType { /** * Creates a BooleanType. */ public BooleanType() { super("BOOLEAN"); } public boolean equals(Object obj) { return obj instanceof BooleanType; } public boolean isInstance(Object value) { return value instanceof Boolean; } } // End BooleanType.java mondrian-3.11.0.1-R/src/main/mondrian/olap/type/CubeType.java000066400000000000000000000036361261646570300236040ustar00rootroot00000000000000/* // This software is subject to the terms of the Eclipse Public License v1.0 // Agreement, available at the following URL: // http://www.eclipse.org/legal/epl-v10.html. // You must accept the terms of that agreement to use this software. // // Copyright (C) 2005-2005 Julian Hyde // Copyright (C) 2005-2011 Pentaho // All Rights Reserved. */ package mondrian.olap.type; import mondrian.olap.*; /** * The type of an expression which represents a Cube or Virtual Cube. * * @author jhyde * @since Feb 17, 2005 */ public class CubeType implements Type { private final Cube cube; /** * Creates a type representing a cube. */ public CubeType(Cube cube) { this.cube = cube; } /** * Returns the cube. * * @return Cube */ public Cube getCube() { return cube; } public boolean usesDimension(Dimension dimension, boolean definitely) { return false; } public boolean usesHierarchy(Hierarchy hierarchy, boolean definitely) { return false; } public Dimension getDimension() { return null; } public Hierarchy getHierarchy() { return null; } public Level getLevel() { return null; } public int hashCode() { return cube.hashCode(); } public boolean equals(Object obj) { if (obj instanceof CubeType) { CubeType that = (CubeType) obj; return this.cube.equals(that.cube); } else { return false; } } public Type computeCommonType(Type type, int[] conversionCount) { return this.equals(type) ? this : null; } public boolean isInstance(Object value) { return value instanceof Cube; } public int getArity() { // not meaningful; cube cannot be used in an expression throw new UnsupportedOperationException(); } } // End CubeType.java mondrian-3.11.0.1-R/src/main/mondrian/olap/type/DateTimeType.java000066400000000000000000000015041261646570300244120ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.olap.type; /** * The type of an expression representing a date, time or timestamp. * * @author jhyde * @since Jan 2, 2008 */ public class DateTimeType extends ScalarType { /** * Creates a DateTime type. */ public DateTimeType() { super("DATETIME"); } public boolean equals(Object obj) { return obj instanceof DateTimeType; } public boolean isInstance(Object value) { return value instanceof java.util.Date; } } // End DateTimeType.java mondrian-3.11.0.1-R/src/main/mondrian/olap/type/DecimalType.java000066400000000000000000000045351261646570300242630ustar00rootroot00000000000000/* // This software is subject to the terms of the Eclipse Public License v1.0 // Agreement, available at the following URL: // http://www.eclipse.org/legal/epl-v10.html. // You must accept the terms of that agreement to use this software. // // Copyright (C) 2005-2005 Julian Hyde // Copyright (C) 2005-2009 Pentaho // All Rights Reserved. */ package mondrian.olap.type; import mondrian.olap.Util; /** * Subclass of {@link NumericType} which guarantees fixed number of decimal * places. In particular, a decimal with zero scale is an integer. * * @author jhyde * @since May 3, 2005 */ public class DecimalType extends NumericType { private final int precision; private final int scale; /** * Creates a decimal type with precision and scale. * *

Examples:

    *
  • 123.45 has precision 5, scale 2. *
  • 12,345,000 has precision 5, scale -3. *
* *

The largest value is 10 ^ (precision - scale). Hence the largest * DECIMAL(5, -3) value is 10 ^ 8. * * @param precision Maximum number of decimal digits which a value of * this type can have. * Must be greater than zero. * Use {@link Integer#MAX_VALUE} if the precision is unbounded. * @param scale Number of digits to the right of the decimal point. */ public DecimalType(int precision, int scale) { super( precision == Integer.MAX_VALUE ? "DecimalType(" + scale + ")" : "DecimalType(" + precision + ", " + scale + ")"); Util.assertPrecondition(precision > 0, "precision > 0"); this.precision = precision; this.scale = scale; } /** * Returns the maximum number of decimal digits which a value of * this type can have. * * @return precision of this type */ public int getPrecision() { return precision; } /** * Returns the number of digits to the right of the decimal point. * * @return scale of this type */ public int getScale() { return scale; } public boolean equals(Object obj) { if (obj instanceof DecimalType) { DecimalType that = (DecimalType) obj; return this.precision == that.precision && this.scale == that.scale; } return false; } } // End DecimalType.java mondrian-3.11.0.1-R/src/main/mondrian/olap/type/DimensionType.java000066400000000000000000000071411261646570300246460ustar00rootroot00000000000000/* // This software is subject to the terms of the Eclipse Public License v1.0 // Agreement, available at the following URL: // http://www.eclipse.org/legal/epl-v10.html. // You must accept the terms of that agreement to use this software. // // Copyright (C) 2005-2005 Julian Hyde // Copyright (C) 2005-2011 Pentaho // All Rights Reserved. */ package mondrian.olap.type; import mondrian.olap.*; /** * The type of an expression which represents a Dimension. * * @author jhyde * @since Feb 17, 2005 */ public class DimensionType implements Type { private final Dimension dimension; private final String digest; public static final DimensionType Unknown = new DimensionType(null); /** * Creates a type representing a dimension. * * @param dimension Dimension that values of this type must belong to, or * null if the dimension is unknown */ public DimensionType(Dimension dimension) { this.dimension = dimension; StringBuilder buf = new StringBuilder("DimensionType<"); if (dimension != null) { buf.append("dimension=").append(dimension.getUniqueName()); } buf.append(">"); this.digest = buf.toString(); } public static DimensionType forDimension(Dimension dimension) { return new DimensionType(dimension); } public static DimensionType forType(Type type) { return new DimensionType(type.getDimension()); } public boolean usesDimension(Dimension dimension, boolean definitely) { // REVIEW: Should be '!definitely'? return this.dimension == dimension || (definitely && this.dimension == null); } public boolean usesHierarchy(Hierarchy hierarchy, boolean definitely) { // If hierarchy belongs to this type's dimension, we might use it. return hierarchy.getDimension() == this.dimension && !definitely; } public Hierarchy getHierarchy() { return dimension == null ? null : dimension.getHierarchies().length > 1 ? null : dimension.getHierarchies()[0]; } public Level getLevel() { return null; } public Dimension getDimension() { return dimension; } public int hashCode() { return digest.hashCode(); } public boolean equals(Object obj) { if (obj instanceof DimensionType) { DimensionType that = (DimensionType) obj; return Util.equals(this.getDimension(), that.getDimension()); } return false; } public String toString() { return digest; } public Type computeCommonType(Type type, int[] conversionCount) { if (conversionCount != null && type instanceof HierarchyType) { HierarchyType hierarchyType = (HierarchyType) type; if (Util.equals(hierarchyType.getDimension(), dimension)) { ++conversionCount[0]; return this; } return null; } if (!(type instanceof DimensionType)) { return null; } DimensionType that = (DimensionType) type; if (this.getDimension() != null && this.getDimension().equals(that.getDimension())) { return new DimensionType( this.getDimension()); } return DimensionType.Unknown; } public boolean isInstance(Object value) { return value instanceof Dimension && (dimension == null || value.equals(dimension)); } public int getArity() { return 1; } } // End DimensionType.java mondrian-3.11.0.1-R/src/main/mondrian/olap/type/EmptyType.java000066400000000000000000000015371261646570300240220ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.olap.type; /** * The type of a empty expression. * *

An example of an empty expression is the third argument to the call * DrilldownLevelTop({[Store].[USA]}, 2, , [Measures].[Unit * Sales]). *

* * @author medstat * @since Jan 26, 2009 */ public class EmptyType extends ScalarType { /** * Creates an empty type. */ public EmptyType() { super(""); } public boolean equals(Object obj) { return obj instanceof EmptyType; } } // End EmptyType.java mondrian-3.11.0.1-R/src/main/mondrian/olap/type/HierarchyType.java000066400000000000000000000075511261646570300246440ustar00rootroot00000000000000/* // This software is subject to the terms of the Eclipse Public License v1.0 // Agreement, available at the following URL: // http://www.eclipse.org/legal/epl-v10.html. // You must accept the terms of that agreement to use this software. // // Copyright (C) 2005-2005 Julian Hyde // Copyright (C) 2005-2011 Pentaho // All Rights Reserved. */ package mondrian.olap.type; import mondrian.olap.*; /** * The type of an expression which represents a hierarchy. * * @author jhyde * @since Feb 17, 2005 */ public class HierarchyType implements Type { private final Dimension dimension; private final Hierarchy hierarchy; private final String digest; public static final HierarchyType Unknown = new HierarchyType(null, null); /** * Creates a type representing a hierarchy. * * @param dimension Dimension that values of this type must belong to, or * null if the dimension is unknown * @param hierarchy Hierarchy that values of this type must belong to, * null if the hierarchy is unknown */ public HierarchyType(Dimension dimension, Hierarchy hierarchy) { this.dimension = dimension; this.hierarchy = hierarchy; StringBuilder buf = new StringBuilder("HierarchyType<"); if (hierarchy != null) { buf.append("hierarchy=").append(hierarchy.getUniqueName()); } else if (dimension != null) { buf.append("dimension=").append(dimension.getUniqueName()); } buf.append(">"); this.digest = buf.toString(); } public static HierarchyType forHierarchy(Hierarchy hierarchy) { return new HierarchyType(hierarchy.getDimension(), hierarchy); } public static HierarchyType forType(Type type) { return new HierarchyType(type.getDimension(), type.getHierarchy()); } public boolean usesDimension(Dimension dimension, boolean definitely) { return this.dimension == dimension || (!definitely && this.dimension == null); } public boolean usesHierarchy(Hierarchy hierarchy, boolean definitely) { return this.hierarchy == hierarchy || (!definitely && this.hierarchy == null && (this.dimension == null || this.dimension == hierarchy.getDimension())); } public Dimension getDimension() { return dimension; } public Hierarchy getHierarchy() { return hierarchy; } public Level getLevel() { return null; } public String toString() { return digest; } public int hashCode() { return digest.hashCode(); } public boolean equals(Object obj) { if (obj instanceof HierarchyType) { HierarchyType that = (HierarchyType) obj; return Util.equals(this.hierarchy, that.hierarchy) && Util.equals(this.dimension, that.dimension); } return false; } public Type computeCommonType(Type type, int[] conversionCount) { if (!(type instanceof HierarchyType)) { return null; } HierarchyType that = (HierarchyType) type; if (this.getHierarchy() != null && this.getHierarchy().equals(that.getHierarchy())) { return this; } if (this.getDimension() != null && this.getDimension().equals(that.getDimension())) { return new HierarchyType( this.getDimension(), null); } return HierarchyType.Unknown; } public boolean isInstance(Object value) { return value instanceof Hierarchy && (hierarchy == null || value.equals(hierarchy)) && (dimension == null || ((Hierarchy) value).getDimension().equals(dimension)); } public int getArity() { return 1; } } // End HierarchyType.java mondrian-3.11.0.1-R/src/main/mondrian/olap/type/LevelType.java000066400000000000000000000120061261646570300237640ustar00rootroot00000000000000/* // This software is subject to the terms of the Eclipse Public License v1.0 // Agreement, available at the following URL: // http://www.eclipse.org/legal/epl-v10.html. // You must accept the terms of that agreement to use this software. // // Copyright (C) 2005-2005 Julian Hyde // Copyright (C) 2005-2011 Pentaho // All Rights Reserved. */ package mondrian.olap.type; import mondrian.olap.*; /** * The type of an expression which represents a level. * * @author jhyde * @since Feb 17, 2005 */ public class LevelType implements Type { private final Dimension dimension; private final Hierarchy hierarchy; private final Level level; private final String digest; public static final LevelType Unknown = new LevelType(null, null, null); /** * Creates a type representing a level. * * @param dimension Dimension which values of this type must belong to, or * null if not known * @param hierarchy Hierarchy which values of this type must belong to, or * null if not known * @param level Level which values of this type must belong to, or null if */ public LevelType(Dimension dimension, Hierarchy hierarchy, Level level) { this.dimension = dimension; this.hierarchy = hierarchy; this.level = level; if (level != null) { Util.assertPrecondition(hierarchy != null, "hierarchy != null"); Util.assertPrecondition( level.getHierarchy() == hierarchy, "level.getHierarchy() == hierarchy"); } if (hierarchy != null) { Util.assertPrecondition(dimension != null, "dimension != null"); Util.assertPrecondition( hierarchy.getDimension() == dimension, "hierarchy.getDimension() == dimension"); } StringBuilder buf = new StringBuilder("LevelType<"); if (level != null) { buf.append("level=").append(level.getUniqueName()); } else if (hierarchy != null) { buf.append("hierarchy=").append(hierarchy.getUniqueName()); } else if (dimension != null) { buf.append("dimension=").append(dimension.getUniqueName()); } buf.append(">"); this.digest = buf.toString(); } public static LevelType forType(Type type) { return new LevelType( type.getDimension(), type.getHierarchy(), type.getLevel()); } public static LevelType forLevel(Level level) { return new LevelType( level.getDimension(), level.getHierarchy(), level); } public boolean usesDimension(Dimension dimension, boolean definitely) { return this.dimension == dimension || (!definitely && this.dimension == null); } public boolean usesHierarchy(Hierarchy hierarchy, boolean definitely) { return this.hierarchy == hierarchy || (!definitely && this.hierarchy == null && (this.dimension == null || this.dimension == hierarchy.getDimension())); } public Dimension getDimension() { return dimension; } public Hierarchy getHierarchy() { return hierarchy; } public Level getLevel() { return level; } public String toString() { return digest; } public int hashCode() { return digest.hashCode(); } public boolean equals(Object obj) { if (obj instanceof LevelType) { LevelType that = (LevelType) obj; return Util.equals(this.level, that.level) && Util.equals(this.hierarchy, that.hierarchy) && Util.equals(this.dimension, that.dimension); } return false; } public Type computeCommonType(Type type, int[] conversionCount) { if (!(type instanceof LevelType)) { return null; } LevelType that = (LevelType) type; if (this.getLevel() != null && this.getLevel().equals(that.getLevel())) { return this; } if (this.getHierarchy() != null && this.getHierarchy().equals(that.getHierarchy())) { return new LevelType( this.getDimension(), this.getHierarchy(), null); } if (this.getDimension() != null && this.getDimension().equals(that.getDimension())) { return new LevelType( this.getDimension(), null, null); } return LevelType.Unknown; } public boolean isInstance(Object value) { return value instanceof Level && (level == null || value.equals(level)) && (hierarchy == null || ((Level) value).getHierarchy().equals(hierarchy)) && (dimension == null || ((Level) value).getDimension().equals(dimension)); } public int getArity() { return 1; } } // End LevelType.java mondrian-3.11.0.1-R/src/main/mondrian/olap/type/MemberType.java000066400000000000000000000156761261646570300241440ustar00rootroot00000000000000/* // This software is subject to the terms of the Eclipse Public License v1.0 // Agreement, available at the following URL: // http://www.eclipse.org/legal/epl-v10.html. // You must accept the terms of that agreement to use this software. // // Copyright (C) 2005-2005 Julian Hyde // Copyright (C) 2005-2011 Pentaho // All Rights Reserved. */ package mondrian.olap.type; import mondrian.olap.*; /** * The type of an expression which represents a member. * * @author jhyde * @since Feb 17, 2005 */ public class MemberType implements Type { private final Hierarchy hierarchy; private final Dimension dimension; private final Level level; private final Member member; private final String digest; public static final MemberType Unknown = new MemberType(null, null, null, null); /** * Creates a type representing a member. * * @param dimension Dimension the member belongs to, or null if not known * @param hierarchy Hierarchy the member belongs to, or null if not known * @param level Level the member belongs to, or null if not known * @param member The precise member, or null if not known */ public MemberType( Dimension dimension, Hierarchy hierarchy, Level level, Member member) { this.dimension = dimension; this.hierarchy = hierarchy; this.level = level; this.member = member; if (member != null) { Util.assertPrecondition(level != null); Util.assertPrecondition(member.getLevel() == level); } if (level != null) { Util.assertPrecondition(hierarchy != null); Util.assertPrecondition(level.getHierarchy() == hierarchy); } if (hierarchy != null) { Util.assertPrecondition(dimension != null); Util.assertPrecondition(hierarchy.getDimension() == dimension); } StringBuilder buf = new StringBuilder("MemberType<"); if (member != null) { buf.append("member=").append(member.getUniqueName()); } else if (level != null) { buf.append("level=").append(level.getUniqueName()); } else if (hierarchy != null) { buf.append("hierarchy=").append(hierarchy.getUniqueName()); } else if (dimension != null) { buf.append("dimension=").append(dimension.getUniqueName()); } buf.append(">"); this.digest = buf.toString(); } public static MemberType forDimension(Dimension dimension) { return new MemberType(dimension, null, null, null); } public static MemberType forHierarchy(Hierarchy hierarchy) { final Dimension dimension; if (hierarchy == null) { dimension = null; } else { dimension = hierarchy.getDimension(); } return new MemberType(dimension, hierarchy, null, null); } public static MemberType forLevel(Level level) { final Dimension dimension; final Hierarchy hierarchy; if (level == null) { dimension = null; hierarchy = null; } else { dimension = level.getDimension(); hierarchy = level.getHierarchy(); } return new MemberType(dimension, hierarchy, level, null); } public static MemberType forMember(Member member) { final Dimension dimension; final Hierarchy hierarchy; final Level level; if (member == null) { dimension = null; hierarchy = null; level = null; } else { dimension = member.getDimension(); hierarchy = member.getHierarchy(); level = member.getLevel(); } return new MemberType(dimension, hierarchy, level, member); } public String toString() { return digest; } public Hierarchy getHierarchy() { return hierarchy; } public Level getLevel() { return level; } public Member getMember() { return member; } public boolean usesDimension(Dimension dimension, boolean definitely) { return this.dimension == dimension || (!definitely && this.dimension == null); } public boolean usesHierarchy(Hierarchy hierarchy, boolean definitely) { return this.hierarchy == hierarchy || (!definitely && this.hierarchy == null && (this.dimension == null || this.dimension == hierarchy.getDimension())); } public Type getValueType() { // todo: when members have more type information (double vs. integer // vs. string), return better type if member != null. return new ScalarType(); } public Dimension getDimension() { return dimension; } public static MemberType forType(Type type) { if (type instanceof MemberType) { return (MemberType) type; } else { return new MemberType( type.getDimension(), type.getHierarchy(), type.getLevel(), null); } } public Type computeCommonType(Type type, int[] conversionCount) { if (type instanceof ScalarType) { return getValueType().computeCommonType(type, conversionCount); } if (type instanceof TupleType) { return type.computeCommonType(this, conversionCount); } if (!(type instanceof MemberType)) { return null; } MemberType that = (MemberType) type; if (this.getMember() != null && this.getMember().equals(that.getMember())) { return this; } if (this.getLevel() != null && this.getLevel().equals(that.getLevel())) { return new MemberType( this.getDimension(), this.getHierarchy(), this.getLevel(), null); } if (this.getHierarchy() != null && this.getHierarchy().equals(that.getHierarchy())) { return new MemberType( this.getDimension(), this.getHierarchy(), null, null); } if (this.getDimension() != null && this.getDimension().equals(that.getDimension())) { return new MemberType( this.getDimension(), null, null, null); } return MemberType.Unknown; } public boolean isInstance(Object value) { return value instanceof Member && (level == null || ((Member) value).getLevel().equals(level)) && (hierarchy == null || ((Member) value).getHierarchy().equals(hierarchy)) && (dimension == null || ((Member) value).getDimension().equals(dimension)); } public int getArity() { return 1; } } // End MemberType.java mondrian-3.11.0.1-R/src/main/mondrian/olap/type/NullType.java000066400000000000000000000013221261646570300236260ustar00rootroot00000000000000/* // This software is subject to the terms of the Eclipse Public License v1.0 // Agreement, available at the following URL: // http://www.eclipse.org/legal/epl-v10.html. // You must accept the terms of that agreement to use this software. // // Copyright (C) 2005-2005 Julian Hyde // Copyright (C) 2005-2009 Pentaho // All Rights Reserved. */ package mondrian.olap.type; /** * The type of a null expression. * * @author medstat * @since Aug 21, 2006 */ public class NullType extends ScalarType { /** * Creates a null type. */ public NullType() { super(""); } public boolean equals(Object obj) { return obj instanceof NullType; } } // End NullType.java mondrian-3.11.0.1-R/src/main/mondrian/olap/type/NumericType.java000066400000000000000000000017341261646570300243250ustar00rootroot00000000000000/* // This software is subject to the terms of the Eclipse Public License v1.0 // Agreement, available at the following URL: // http://www.eclipse.org/legal/epl-v10.html. // You must accept the terms of that agreement to use this software. // // Copyright (C) 2005-2005 Julian Hyde // Copyright (C) 2005-2009 Pentaho // All Rights Reserved. */ package mondrian.olap.type; /** * The type of a numeric expression. * * @author jhyde * @since Feb 17, 2005 */ public class NumericType extends ScalarType { /** * Creates a numeric type. */ public NumericType() { this("NUMERIC"); } protected NumericType(String digest) { super(digest); } public boolean equals(Object obj) { return obj instanceof NumericType && toString().equals(obj.toString()); } public boolean isInstance(Object value) { return value instanceof Number || value instanceof Character; } } // End NumericType.java mondrian-3.11.0.1-R/src/main/mondrian/olap/type/ScalarType.java000066400000000000000000000057361261646570300241360ustar00rootroot00000000000000/* // This software is subject to the terms of the Eclipse Public License v1.0 // Agreement, available at the following URL: // http://www.eclipse.org/legal/epl-v10.html. // You must accept the terms of that agreement to use this software. // // Copyright (C) 2005-2005 Julian Hyde // Copyright (C) 2005-2011 Pentaho // All Rights Reserved. */ package mondrian.olap.type; import mondrian.olap.*; /** * Base class for types which represent scalar values. * *

An instance of this class means a scalar value of unknown type. * Usually one of the derived classes {@link NumericType}, * {@link StringType}, {@link BooleanType} is used instead. * * @author jhyde * @since Feb 17, 2005 */ public class ScalarType implements Type { private final String digest; /** * Creates a ScalarType. */ public ScalarType() { this("SCALAR"); } /** * Creates a ScalarType (or subtype) with a given digest. * *

The digest is used for {@link #toString()} and {@link #hashCode()}. * * @param digest Description of this type */ protected ScalarType(String digest) { this.digest = digest; } public int hashCode() { return digest.hashCode(); } public boolean equals(Object obj) { return obj != null && obj.getClass() == ScalarType.class; } public String toString() { return digest; } public boolean usesDimension(Dimension dimension, boolean definitely) { return false; } public boolean usesHierarchy(Hierarchy hierarchy, boolean definitely) { return false; } public Hierarchy getHierarchy() { return null; } public Level getLevel() { return null; } public Type computeCommonType(Type type, int[] conversionCount) { if (this.equals(type)) { return this; } else if (type instanceof NullType) { return this; } else if (this instanceof NullType && type instanceof ScalarType) { return type; } else if (this.getClass() == ScalarType.class && type instanceof ScalarType) { return this; } else if (type.getClass() == ScalarType.class) { return type; } else if (type instanceof ScalarType) { return new ScalarType(); } else if (type instanceof MemberType) { return computeCommonType( ((MemberType) type).getValueType(), conversionCount); } else if (type instanceof TupleType) { return computeCommonType( ((TupleType) type).getValueType(), conversionCount); } else { return null; } } public Dimension getDimension() { return null; } public boolean isInstance(Object value) { // Somewhat pessimistic. return false; } public int getArity() { return 1; } } // End ScalarType.java mondrian-3.11.0.1-R/src/main/mondrian/olap/type/SetType.java000066400000000000000000000065111261646570300234540ustar00rootroot00000000000000/* // This software is subject to the terms of the Eclipse Public License v1.0 // Agreement, available at the following URL: // http://www.eclipse.org/legal/epl-v10.html. // You must accept the terms of that agreement to use this software. // // Copyright (C) 2005-2005 Julian Hyde // Copyright (C) 2005-2011 Pentaho // All Rights Reserved. */ package mondrian.olap.type; import mondrian.olap.*; import java.util.List; /** * Set type. * * @author jhyde * @since Feb 17, 2005 */ public class SetType implements Type { private final Type elementType; private final String digest; /** * Creates a type representing a set of elements of a given type. * * @param elementType The type of the elements in the set, or null if not * known */ public SetType(Type elementType) { if (elementType != null) { assert elementType instanceof MemberType || elementType instanceof TupleType; } this.elementType = elementType; this.digest = "SetType<" + elementType + ">"; } public int hashCode() { return digest.hashCode(); } public boolean equals(Object obj) { if (obj instanceof SetType) { SetType that = (SetType) obj; return Util.equals(this.elementType, that.elementType); } else { return false; } } public String toString() { return digest; } /** * Returns the type of the elements of this set. * * @return the type of the elements in this set */ public Type getElementType() { return elementType; } public boolean usesDimension(Dimension dimension, boolean definitely) { if (elementType == null) { return definitely; } return elementType.usesDimension(dimension, definitely); } public boolean usesHierarchy(Hierarchy hierarchy, boolean definitely) { if (elementType == null) { return definitely; } return elementType.usesHierarchy(hierarchy, definitely); } public Dimension getDimension() { return elementType == null ? null : elementType.getDimension(); } public Hierarchy getHierarchy() { return elementType == null ? null : elementType.getHierarchy(); } public Level getLevel() { return elementType == null ? null : elementType.getLevel(); } public int getArity() { return elementType.getArity(); } public Type computeCommonType(Type type, int[] conversionCount) { if (!(type instanceof SetType)) { return null; } SetType that = (SetType) type; final Type mostGeneralElementType = this.getElementType().computeCommonType( that.getElementType(), conversionCount); if (mostGeneralElementType == null) { return null; } return new SetType(mostGeneralElementType); } public boolean isInstance(Object value) { if (!(value instanceof List)) { return false; } List list = (List) value; for (Object o : list) { if (!elementType.isInstance(o)) { return false; } } return true; } } // End SetType.java mondrian-3.11.0.1-R/src/main/mondrian/olap/type/StringType.java000066400000000000000000000014621261646570300241670ustar00rootroot00000000000000/* // This software is subject to the terms of the Eclipse Public License v1.0 // Agreement, available at the following URL: // http://www.eclipse.org/legal/epl-v10.html. // You must accept the terms of that agreement to use this software. // // Copyright (C) 2005-2005 Julian Hyde // Copyright (C) 2005-2009 Pentaho // All Rights Reserved. */ package mondrian.olap.type; /** * The type of a string expression. * * @author jhyde * @since Feb 17, 2005 */ public class StringType extends ScalarType { /** * Creates a string type. */ public StringType() { super("STRING"); } public boolean equals(Object obj) { return obj instanceof StringType; } public boolean isInstance(Object value) { return value instanceof String; } } // End StringType.java mondrian-3.11.0.1-R/src/main/mondrian/olap/type/SymbolType.java000066400000000000000000000011761261646570300241700ustar00rootroot00000000000000/* // This software is subject to the terms of the Eclipse Public License v1.0 // Agreement, available at the following URL: // http://www.eclipse.org/legal/epl-v10.html. // You must accept the terms of that agreement to use this software. // // Copyright (C) 2005-2005 Julian Hyde // Copyright (C) 2005-2009 Pentaho // All Rights Reserved. */ package mondrian.olap.type; /** * The type of a symbolic expression. * * @author jhyde * @since Feb 17, 2005 */ public class SymbolType extends ScalarType { /** * Creates a symbol type. */ public SymbolType() { super("SYMBOL"); } } // End SymbolType.java mondrian-3.11.0.1-R/src/main/mondrian/olap/type/TupleType.java000066400000000000000000000144051261646570300240130ustar00rootroot00000000000000/* // This software is subject to the terms of the Eclipse Public License v1.0 // Agreement, available at the following URL: // http://www.eclipse.org/legal/epl-v10.html. // You must accept the terms of that agreement to use this software. // // Copyright (C) 2005-2005 Julian Hyde // Copyright (C) 2005-2011 Pentaho // All Rights Reserved. */ package mondrian.olap.type; import mondrian.olap.*; import mondrian.resource.MondrianResource; import java.util.*; /** * Tuple type. * * @author jhyde * @since Feb 17, 2005 */ public class TupleType implements Type { public final Type[] elementTypes; private final String digest; /** * Creates a type representing a tuple whose fields are the given types. * * @param elementTypes Array of types of the members in this tuple */ public TupleType(Type[] elementTypes) { assert elementTypes != null; this.elementTypes = elementTypes.clone(); final StringBuilder buf = new StringBuilder(); buf.append("TupleType<"); int k = 0; for (Type elementType : elementTypes) { if (k++ > 0) { buf.append(", "); } buf.append(elementType); } buf.append(">"); digest = buf.toString(); } public String toString() { return digest; } public boolean equals(Object obj) { if (obj instanceof TupleType) { TupleType that = (TupleType) obj; return Arrays.equals(this.elementTypes, that.elementTypes); } else { return false; } } public int hashCode() { return digest.hashCode(); } public boolean usesDimension(Dimension dimension, boolean definitely) { for (Type elementType : elementTypes) { if (elementType.usesDimension(dimension, definitely)) { return true; } } return false; } public boolean usesHierarchy(Hierarchy hierarchy, boolean definitely) { for (Type elementType : elementTypes) { if (elementType.usesHierarchy(hierarchy, definitely)) { return true; } } return false; } public List getHierarchies() { final List hierarchies = new ArrayList(elementTypes.length); for (Type elementType : elementTypes) { hierarchies.add(elementType.getHierarchy()); } return hierarchies; } public int getArity() { return elementTypes.length; } public Dimension getDimension() { throw new UnsupportedOperationException(); } public Hierarchy getHierarchy() { throw new UnsupportedOperationException(); } public Level getLevel() { throw new UnsupportedOperationException(); } public Type getValueType() { for (Type elementType : elementTypes) { if (elementType instanceof MemberType) { MemberType memberType = (MemberType) elementType; Dimension dimension = memberType.getDimension(); if (dimension != null && dimension.isMeasures()) { return memberType.getValueType(); } } } return new ScalarType(); } public Type computeCommonType(Type type, int[] conversionCount) { if (type instanceof ScalarType) { return getValueType().computeCommonType(type, conversionCount); } if (type instanceof MemberType) { return commonTupleType( new TupleType(new Type[]{type}), conversionCount); } if (!(type instanceof TupleType)) { return null; } return commonTupleType(type, conversionCount); } public boolean isInstance(Object value) { if (!(value instanceof Object[])) { return false; } Object[] objects = (Object[]) value; if (objects.length != elementTypes.length) { return false; } for (int i = 0; i < objects.length; i++) { if (!elementTypes[i].isInstance(objects[i])) { return false; } } return true; } private Type commonTupleType(Type type, int[] conversionCount) { TupleType that = (TupleType) type; if (this.elementTypes.length < that.elementTypes.length) { return createCommonTupleType(that, conversionCount); } return that.createCommonTupleType(this, conversionCount); } private Type createCommonTupleType(TupleType that, int[] conversionCount) { final List elementTypes = new ArrayList(); for (int i = 0; i < this.elementTypes.length; i++) { Type commonType = this.elementTypes[i].computeCommonType( that.elementTypes[i], conversionCount); elementTypes.add(commonType); if (commonType == null) { return null; } } if (elementTypes.size() < that.elementTypes.length) { for (int i = elementTypes.size(); i < that.elementTypes.length; i++) { elementTypes.add(new ScalarType()); } } return new TupleType( elementTypes.toArray(new Type[elementTypes.size()])); } /** * Checks that there are no duplicate dimensions in a list of member types. * If so, the member types will form a valid tuple type. * If not, throws {@link mondrian.olap.MondrianException}. * * @param memberTypes Array of member types */ public static void checkHierarchies(MemberType[] memberTypes) { for (int i = 0; i < memberTypes.length; i++) { MemberType memberType = memberTypes[i]; for (int j = 0; j < i; j++) { MemberType member1 = memberTypes[j]; final Hierarchy hierarchy = memberType.getHierarchy(); final Hierarchy hierarchy1 = member1.getHierarchy(); if (hierarchy != null && hierarchy == hierarchy1) { throw MondrianResource.instance().DupHierarchiesInTuple.ex( hierarchy.getUniqueName()); } } } } } // End TupleType.java mondrian-3.11.0.1-R/src/main/mondrian/olap/type/Type.java000066400000000000000000000135001261646570300227740ustar00rootroot00000000000000/* // This software is subject to the terms of the Eclipse Public License v1.0 // Agreement, available at the following URL: // http://www.eclipse.org/legal/epl-v10.html. // You must accept the terms of that agreement to use this software. // // Copyright (C) 2005-2005 Julian Hyde // Copyright (C) 2005-2011 Pentaho // All Rights Reserved. */ package mondrian.olap.type; import mondrian.olap.*; /** * Type of an MDX expression. * * @author jhyde * @since Feb 17, 2005 */ public interface Type { /** * Returns whether this type contains a given dimension.

* * For example: *

    *
  • DimensionType([Gender]) uses only the * [Gender] dimension.
  • *
  • TupleType(MemberType([Gender]), MemberType([Store])) * uses [Gender] and [Store] * dimensions.
  • *

* * The definitely parameter comes into play when the * dimensional information is incomplete. For example, when applied to * TupleType(MemberType(null), MemberType([Store])), * usesDimension([Gender], false) returns true because it * is possible that the expression returns a member of the * [Gender] dimension; but * usesDimension([Gender], true) returns true because it * is possible that the expression returns a member of the * [Gender] dimension. * * @param dimension Dimension * @param definitely If true, returns true only if this type definitely * uses the dimension * * @return whether this Type uses the given Dimension */ boolean usesDimension(Dimension dimension, boolean definitely); /** * Returns whether this type contains a given hierarchy.

* * For example: *

    *
  • HierarchyType([Customer].[Gender]) uses only the * [Customer].[Gender] hierarchy.
  • *
  • TupleType(MemberType([Customer].[Gender]), * MemberType([Store].[Store])) * uses [Gender] and [Store] * dimensions.
  • *

* * The definitely parameter comes into play when the * dimensional information is incomplete. For example, when applied to * TupleType(MemberType([Customer]), MemberType([Store])), * usesDimension([Customer].[Gender], false) returns true * because the expression returns a member of one hierarchy of the * [Customer] dimension and that might be a member of the * [Customer].[Gender] hierarchy; but * usesDimension([Customer].[Gender], true) returns false * because might return a member of a different hierarchy, such as * [Customer].[State]. * * @param hierarchy Hierarchy * @param definitely If true, returns true only if this type definitely * uses the hierarchy * * @return whether this Type uses the given Hierarchy */ boolean usesHierarchy(Hierarchy hierarchy, boolean definitely); /** * Returns the Dimension of this Type, or null if not known. * If not applicable, throws. * * @return the Dimension of this Type, or null if not known. */ Dimension getDimension(); /** * Returns the Hierarchy of this Type, or null if not known. * If not applicable, throws. * * @return the Hierarchy of this type, or null if not known */ Hierarchy getHierarchy(); /** * Returns the Level of this Type, or null if not known. * If not applicable, throws. * * @return the Level of this Type */ Level getLevel(); /** * Returns a Type which is more general than this and the given Type. * The type returned is broad enough to hold any value of either type, * but no broader. If there is no such type, returns null. * *

Some examples:

    *
  • The common type for StringType and NumericType is ScalarType. *
  • The common type for NumericType and DecimalType(4, 2) is * NumericType. *
  • DimensionType and NumericType have no common type. *

* *

If conversionCount is not null, implicit conversions * such as HierarchyType to DimensionType are considered; the parameter * is incremented by the number of conversions performed. * *

Some examples:

    *
  • The common type for HierarchyType(hierarchy=Time.Weekly) * and LevelType(dimension=Time), if conversions are allowed, is * HierarchyType(dimension=Time). *
* *

One use of common types is to determine the types of the arguments * to the Iif function. For example, the call * *

Iif(1 > 2, [Measures].[Unit Sales], * 5)
* * has type ScalarType, because DecimalType(-1, 0) is a subtype of * ScalarType, and MeasureType can be converted implicitly to ScalarType. * * @param type Type * * @param conversionCount Number of conversions; output parameter that is * incremented each time a conversion is performed; if null, conversions * are not considered * * @return More general type */ Type computeCommonType(Type type, int[] conversionCount); /** * Returns whether a value is valid for a type. * * @param value Value * @return Whether value is valid for this type */ boolean isInstance(Object value); /** * Returns the number of fields in a tuple type, or a set of tuples. * For most other types, in particular member type, returns 1. * * @return Arity of type */ int getArity(); } // End Type.java mondrian-3.11.0.1-R/src/main/mondrian/olap/type/TypeUtil.java000066400000000000000000000510711261646570300236370ustar00rootroot00000000000000/* // This software is subject to the terms of the Eclipse Public License v1.0 // Agreement, available at the following URL: // http://www.eclipse.org/legal/epl-v10.html. // You must accept the terms of that agreement to use this software. // // Copyright (C) 2005-2005 Julian Hyde // Copyright (C) 2005-2013 Pentaho // All Rights Reserved. */ package mondrian.olap.type; import mondrian.mdx.UnresolvedFunCall; import mondrian.olap.*; import mondrian.olap.fun.Resolver; import java.util.*; /** * Utility methods relating to types. * * @author jhyde * @since Feb 17, 2005 */ public class TypeUtil { /** * Given a set type, returns the element type. Or its element type, if it * is a set type. And so on. * * @param type Type * @return underlying element type which is not a set type */ public static Type stripSetType(Type type) { while (type instanceof SetType) { type = ((SetType) type).getElementType(); } return type; } /** * Converts a type to a member or tuple type. * If it cannot, returns null. * * @param type Type * @return member or tuple type */ public static Type toMemberOrTupleType(Type type) { type = stripSetType(type); if (type instanceof TupleType) { return type; } else { return toMemberType(type); } } /** * Converts a type to a member type. * If it is a set, strips the set. * If it is a member type, returns the type unchanged. * If it is a dimension, hierarchy or level type, converts it to * a member type. * If it is a tuple, number, string, or boolean, returns null. * * @param type Type * @return type as a member type */ public static MemberType toMemberType(Type type) { type = stripSetType(type); if (type instanceof MemberType) { return (MemberType) type; } else if (type instanceof DimensionType || type instanceof HierarchyType || type instanceof LevelType) { return MemberType.forType(type); } else { return null; } } /** * Returns whether this type is union-compatible with another. * In general, to be union-compatible, types must have the same * dimensionality. * * @param type1 First type * @param type2 Second type * @return whether types are union-compatible */ public static boolean isUnionCompatible(Type type1, Type type2) { if (type1 instanceof TupleType) { TupleType tupleType1 = (TupleType) type1; if (type2 instanceof TupleType) { TupleType tupleType2 = (TupleType) type2; if (tupleType1.elementTypes.length == tupleType2.elementTypes.length) { for (int i = 0; i < tupleType1.elementTypes.length; i++) { if (!isUnionCompatible( tupleType1.elementTypes[i], tupleType2.elementTypes[i])) { return false; } } return true; } } return false; } else { final MemberType memberType1 = toMemberType(type1); if (memberType1 == null) { return false; } final MemberType memberType2 = toMemberType(type2); if (memberType2 == null) { return false; } final Hierarchy hierarchy1 = memberType1.getHierarchy(); final Hierarchy hierarchy2 = memberType2.getHierarchy(); return equal(hierarchy1, hierarchy2); } } /** * Returns whether two hierarchies are equal. * * @param hierarchy1 First hierarchy * @param hierarchy2 Second hierarchy * @return Whether hierarchies are equal */ private static boolean equal( final Hierarchy hierarchy1, final Hierarchy hierarchy2) { return hierarchy1 == null || hierarchy2 == null || hierarchy2.getUniqueName().equals( hierarchy1.getUniqueName()); } /** * Returns whether a value of a given type can be evaluated to a scalar * value. * *

The rules are as follows:

    *
  • Clearly boolean, numeric and string expressions can be evaluated. *
  • Member and tuple expressions can be interpreted as a scalar value. * The expression is evaluated to establish the context where a measure * can be evaluated. *
  • Hierarchy and dimension expressions are implicitly * converted into the current member, and evaluated as above. *
  • Level expressions cannot be evaluated *
  • Cube and Set (even sets with a single member) cannot be evaluated. *
* * @param type Type * @return Whether an expression of this type can be evaluated to yield a * scalar value. */ public static boolean canEvaluate(Type type) { return ! (type instanceof SetType || type instanceof CubeType || type instanceof LevelType); } /** * Returns whether a type is a set type. * * @param type Type * @return Whether a value of this type can be evaluated to yield a set. */ public static boolean isSet(Type type) { return type instanceof SetType; } public static boolean couldBeMember(Type type) { return type instanceof MemberType || type instanceof HierarchyType || type instanceof DimensionType; } /** * Converts a {@link Type} value to a {@link Category} ordinal. * * @param type Type * @return category ordinal */ public static int typeToCategory(Type type) { if (type instanceof NullType) { return Category.Null; } else if (type instanceof EmptyType) { return Category.Empty; } else if (type instanceof DateTimeType) { return Category.DateTime; } else if (type instanceof DecimalType && ((DecimalType)type).getScale() == 0) { return Category.Integer; } else if (type instanceof NumericType) { return Category.Numeric; } else if (type instanceof BooleanType) { return Category.Logical; } else if (type instanceof DimensionType) { return Category.Dimension; } else if (type instanceof HierarchyType) { return Category.Hierarchy; } else if (type instanceof MemberType) { return Category.Member; } else if (type instanceof LevelType) { return Category.Level; } else if (type instanceof SymbolType) { return Category.Symbol; } else if (type instanceof StringType) { return Category.String; } else if (type instanceof ScalarType) { return Category.Value; } else if (type instanceof SetType) { return Category.Set; } else if (type instanceof TupleType) { return Category.Tuple; } else { throw Util.newInternal("Unknown type " + type); } } /** * Returns a type sufficiently broad to hold any value of several types, * but as narrow as possible. If there is no such type, returns null. * *

The result is equivalent to calling * {@link Type#computeCommonType(Type, int[])} pairwise. * * @param allowConversions Whether to allow implicit conversions * @param types Array of types * @return Most general type which encompases all types */ public static Type computeCommonType( boolean allowConversions, Type... types) { if (types.length == 0) { return null; } Type type = types[0]; int[] conversionCount = allowConversions ? new int[] {0} : null; for (int i = 1; i < types.length; ++i) { if (type == null) { return null; } type = type.computeCommonType(types[i], conversionCount); } return type; } /** * Returns whether we can convert an argument of a given category to a * given parameter category. * * @param ordinal argument ordinal * @param fromType actual argument type * @param to formal parameter category * @param conversions list of implicit conversions required (out) * @return whether can convert from 'from' to 'to' */ public static boolean canConvert( int ordinal, Type fromType, int to, List conversions) { final int from = typeToCategory(fromType); if (from == to) { return true; } RuntimeException e = null; switch (from) { case Category.Array: return false; case Category.Dimension: // We can go from Dimension to Hierarchy if the dimension has a // default hierarchy. From there, we can go to Member or Tuple. // Even if the dimension does not have a default hierarchy, we claim // now that we can do the conversion, to prevent other overloads // from being chosen; we will hit an error either at compile time or // at run time. switch (to) { case Category.Member: case Category.Tuple: case Category.Hierarchy: // It is more difficult to convert dimension->hierarchy than // hierarchy->dimension conversions.add(new ConversionImpl(from, to, ordinal, 2, e)); return true; case Category.Level: // It is more difficult to convert dimension->level than // dimension->member or dimension->hierarchy->member. conversions.add(new ConversionImpl(from, to, ordinal, 3, null)); return true; default: return false; } case Category.Hierarchy: // Seems funny that you can 'downcast' from a hierarchy, doesn't // it? But we add an implicit 'CurrentMember', for example, // '[Product].PrevMember' actually means // '[Product].CurrentMember.PrevMember'. switch (to) { case Category.Dimension: case Category.Member: case Category.Tuple: conversions.add(new ConversionImpl(from, to, ordinal, 1, null)); return true; default: return false; } case Category.Level: switch (to) { case Category.Dimension: // It's more difficult to convert to a dimension than a // hierarchy. For example, we want '[Store City].CurrentMember' // to resolve to .CurrentMember rather than // .CurrentMember. conversions.add(new ConversionImpl(from, to, ordinal, 2, null)); return true; case Category.Hierarchy: conversions.add(new ConversionImpl(from, to, ordinal, 1, null)); return true; default: return false; } case Category.Logical: switch (to) { case Category.Value: return true; default: return false; } case Category.Member: switch (to) { case Category.Dimension: case Category.Hierarchy: case Category.Level: case Category.Tuple: conversions.add(new ConversionImpl(from, to, ordinal, 1, null)); return true; case Category.Set: // It is more expensive to convert from Member->Set (cost=2) // than Member->Tuple (cost=1). In particular, m.Tuple(n) should // resolve to .Item() rather than // .Item(). conversions.add(new ConversionImpl(from, to, ordinal, 2, null)); return true; case Category.Numeric: // It is more expensive to convert from Member->Scalar (cost=3) // than Member->Set (cost=2). In particular, we want 'member * // set' to resolve to the crossjoin operator, '{m} * set'. conversions.add(new ConversionImpl(from, to, ordinal, 3, null)); return true; case Category.Value: case Category.String: // We assume that measures are numeric, so a cast to a string or // general value expression is more expensive (cost=4) than a // conversion to a numeric expression (cost=3). conversions.add(new ConversionImpl(from, to, ordinal, 4, null)); return true; default: return false; } case Category.Numeric | Category.Constant: switch (to) { case Category.Value: case Category.Numeric: return true; default: return false; } case Category.Numeric: switch (to) { case Category.Logical: conversions.add(new ConversionImpl(from, to, ordinal, 2, null)); return true; case Category.Value: case Category.Integer: case (Category.Integer | Category.Constant): case (Category.Numeric | Category.Constant): return true; default: return false; } case Category.Integer: switch (to) { case Category.Value: case (Category.Integer | Category.Constant): case Category.Numeric: case (Category.Numeric | Category.Constant): return true; default: return false; } case Category.Set: return false; case Category.String | Category.Constant: switch (to) { case Category.Value: case Category.String: return true; default: return false; } case Category.String: switch (to) { case Category.Value: case (Category.String | Category.Constant): return true; default: return false; } case Category.DateTime | Category.Constant: switch (to) { case Category.Value: case Category.DateTime: return true; default: return false; } case Category.DateTime: switch (to) { case Category.Value: case (Category.DateTime | Category.Constant): return true; default: return false; } case Category.Tuple: switch (to) { case Category.Set: conversions.add(new ConversionImpl(from, to, ordinal, 2, null)); return true; case Category.Numeric: // It is more expensive to convert from Tuple->Scalar (cost=4) // than Tuple->Set (cost=3). In particular, we want 'tuple * // set' to resolve to the crossjoin operator, '{tuple} * set'. // This is analogous to Member->Numeric conversion. conversions.add(new ConversionImpl(from, to, ordinal, 3, null)); return true; case Category.String: case Category.Value: // We assume that measures are numeric, so a cast to a string or // general value expression is more expensive (cost=4) than a // conversion to a numeric expression (cost=3). conversions.add(new ConversionImpl(from, to, ordinal, 4, null)); return true; default: return false; } case Category.Value: // We can implicitly cast from value to a more specific scalar type, // but the cost is significant. switch (to) { case Category.String: case Category.Numeric: case Category.Logical: conversions.add(new ConversionImpl(from, to, ordinal, 2, null)); return true; default: return false; } case Category.Symbol: return false; case Category.Null: // now null supports members as well as scalars; but scalar is // preferred if (Category.isScalar(to)) { return true; } else if (to == Category.Member) { conversions.add(new ConversionImpl(from, to, ordinal, 2, null)); return true; } else { return false; } case Category.Empty: return false; default: throw Util.newInternal( "unknown category " + from + " for type " + fromType); } } static T neq(T t1, T t2) { return t1 == null ? t2 : t2 == null ? t1 : t1.equals(t2) ? t1 : null; } /** * Returns the hierarchies in a set, member, or tuple type. * * @param type Type * @return List of hierarchies */ public static List getHierarchies(Type type) { if (type instanceof SetType) { type = ((SetType) type).getElementType(); } if (type instanceof TupleType) { final TupleType tupleType = (TupleType) type; List hierarchyList = new ArrayList(); for (Type elementType : tupleType.elementTypes) { hierarchyList.add(elementType.getHierarchy()); } return hierarchyList; } else { return Collections.singletonList(type.getHierarchy()); } } /** * Implementation of {@link mondrian.olap.fun.Resolver.Conversion}. */ private static class ConversionImpl implements Resolver.Conversion { final int from; final int to; /** * Which argument. Arguments are 0-based, and in particular the 'this' * of a call of member or method call syntax is argument 0. Argument -1 * is the return. */ final int ordinal; /** * Score of the conversion. A higher value is more onerous and therefore * a call using such a conversion is less likly to be chosen. */ final int cost; final RuntimeException e; /** * Creates a conversion. * * @param from From type * @param to To type * @param ordinal Ordinal of argument * @param cost Cost of conversion * @param e Exception */ public ConversionImpl( int from, int to, int ordinal, int cost, RuntimeException e) { this.from = from; this.to = to; this.ordinal = ordinal; this.cost = cost; this.e = e; } public int getCost() { return cost; } public void checkValid() { if (e != null) { throw e; } } public void apply(Validator validator, List args) { final Exp arg = args.get(ordinal); switch (from) { case Category.Member: case Category.Tuple: switch (to) { case Category.Set: final Exp newArg = validator.validate( new UnresolvedFunCall( "{}", Syntax.Braces, new Exp[]{arg}), false); args.set(ordinal, newArg); break; default: // do nothing } default: // do nothing } } // for debug public String toString() { return "Conversion(from=" + Category.instance().getName(from) + ", to=" + Category.instance().getName(to) + ", ordinal=" + ordinal + ", cost=" + cost + ", e=" + e + ")"; } } } // End TypeUtil.java mondrian-3.11.0.1-R/src/main/mondrian/olap/type/package.html000066400000000000000000000000771261646570300234760ustar00rootroot00000000000000 Type system for MDX expessions. mondrian-3.11.0.1-R/src/main/mondrian/olap4j/000077500000000000000000000000001261646570300204665ustar00rootroot00000000000000mondrian-3.11.0.1-R/src/main/mondrian/olap4j/CatalogFinder.java000066400000000000000000000032371261646570300240400ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.olap4j; import mondrian.rolap.RolapConnection; import mondrian.rolap.RolapSchema; import java.util.List; import java.util.Map; /** * Strategy to locate schemas and catalogs. Allows different * {@link mondrian.olap.MondrianServer servers} to do things differently. * * @author jhyde * @since 2010/11/12 */ public interface CatalogFinder { /** * Returns a list of catalogs. * *

The catalog names occur in the natural order of the repository. * * @param connection Connection to mondrian * we want the catalog children. * @return List of catalogs */ List getCatalogNames( RolapConnection connection); /** * Returns a list of (schema name, schema) pairs in a catalog of a * particular name. * *

The name of the schema may not be the same as the value returned by * {@link mondrian.rolap.RolapSchema#getName()}. In fact, a given schema * may occur multiple times in the same catalog with different names. * *

The schemas occur in the natural order of the repository. * * @param connection Connection to mondrian * @param catalogName Name of catalog * @return List of catalogs */ Map getRolapSchemas( RolapConnection connection, String catalogName); } // End CatalogFinder.java mondrian-3.11.0.1-R/src/main/mondrian/olap4j/EmptyResultSet.java000066400000000000000000000574601261646570300243160ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.olap4j; import org.olap4j.OlapWrapper; import java.io.InputStream; import java.io.Reader; import java.math.BigDecimal; import java.net.URL; import java.sql.*; import java.sql.Date; import java.util.*; import javax.sql.rowset.RowSetMetaDataImpl; /** * Implementation of {@link ResultSet} which returns 0 rows. * *

This class is used to implement {@link java.sql.DatabaseMetaData} * methods for querying object types where those object types never have * any instances for this particular driver.

* *

This class has sub-classes which implement JDBC 3.0 and JDBC 4.0 APIs; * it is instantiated using {@link Factory#newEmptyResultSet}.

* * @author jhyde * @since May 24, 2007 */ abstract class EmptyResultSet implements ResultSet, OlapWrapper { final MondrianOlap4jConnection olap4jConnection; private final List headerList; private final List> rowList; private int rowOrdinal = -1; private final RowSetMetaDataImpl metaData = new RowSetMetaDataImpl(); EmptyResultSet( MondrianOlap4jConnection olap4jConnection, List headerList, List> rowList) { this.olap4jConnection = olap4jConnection; this.headerList = headerList; this.rowList = rowList; try { metaData.setColumnCount(headerList.size()); for (int i = 0; i < headerList.size(); i++) { metaData.setColumnName(i + 1, headerList.get(i)); deduceType(rowList, i); } } catch (SQLException e) { throw new RuntimeException(e); } } protected void deduceType(List> rowList, int column) throws SQLException { int nullability = ResultSetMetaData.columnNoNulls; int type = Types.OTHER; int maxLen = 0; for (List objects : rowList) { final Object o = objects.get(column); if (o == null) { nullability = ResultSetMetaData.columnNullable; } else { if (type == Types.OTHER) { type = deduceColumnType(o); } if (o instanceof String) { maxLen = Math.max(maxLen, ((String) o).length()); } } } metaData.setNullable(column + 1, nullability); metaData.setColumnType(column + 1, type); if (maxLen > 0) { metaData.setPrecision(column + 1, maxLen); } } private int deduceColumnType(Object o) { if (o instanceof String) { return Types.VARCHAR; } else if (o instanceof Integer) { return Types.INTEGER; } else if (o instanceof Long) { return Types.BIGINT; } else if (o instanceof Double) { return Types.DOUBLE; } else if (o instanceof Float) { return Types.FLOAT; } else if (o instanceof Boolean) { return Types.BOOLEAN; } else { return Types.VARCHAR; } } // helper methods /** * Returns the value of a given column * @param columnOrdinal 0-based ordinal * @return Value */ private Object getColumn(int columnOrdinal) { return rowList.get(rowOrdinal).get(columnOrdinal); } private Object getColumn(String columnLabel) throws SQLException { int column = headerList.indexOf(columnLabel); if (column < 0) { throw new SQLException("Column not found: " + columnLabel); } return rowList.get(rowOrdinal).get(column); } // implement ResultSet public boolean next() throws SQLException { // note that if rowOrdinal == rowList.size - 1, we move but then return // false if (rowOrdinal < rowList.size()) { ++rowOrdinal; } return rowOrdinal < rowList.size(); } public void close() throws SQLException { } public boolean wasNull() throws SQLException { throw new UnsupportedOperationException(); } public String getString(int columnIndex) throws SQLException { final Object result = getColumn(columnIndex - 1); return result == null ? null : String.valueOf(result); } public boolean getBoolean(int columnIndex) throws SQLException { Object o = getColumn(columnIndex - 1); if (o instanceof Boolean) { return (Boolean) o; } else if (o instanceof String) { return Boolean.valueOf((String) o); } else { return !o.equals(0); } } public byte getByte(int columnIndex) throws SQLException { Object o = getColumn(columnIndex - 1); return ((Number) o).byteValue(); } public short getShort(int columnIndex) throws SQLException { Object o = getColumn(columnIndex - 1); return ((Number) o).shortValue(); } public int getInt(int columnIndex) throws SQLException { Object o = getColumn(columnIndex - 1); return ((Number) o).intValue(); } public long getLong(int columnIndex) throws SQLException { Object o = getColumn(columnIndex - 1); return ((Number) o).longValue(); } public float getFloat(int columnIndex) throws SQLException { Object o = getColumn(columnIndex - 1); return ((Number) o).floatValue(); } public double getDouble(int columnIndex) throws SQLException { Object o = getColumn(columnIndex - 1); return ((Number) o).doubleValue(); } public BigDecimal getBigDecimal( int columnIndex, int scale) throws SQLException { throw new UnsupportedOperationException(); } public byte[] getBytes(int columnIndex) throws SQLException { Object o = getColumn(columnIndex - 1); return (byte[]) o; } public Date getDate(int columnIndex) throws SQLException { Object o = getColumn(columnIndex - 1); return (Date) o; } public Time getTime(int columnIndex) throws SQLException { Object o = getColumn(columnIndex - 1); return (Time) o; } public Timestamp getTimestamp(int columnIndex) throws SQLException { Object o = getColumn(columnIndex - 1); return (Timestamp) o; } public InputStream getAsciiStream(int columnIndex) throws SQLException { throw new UnsupportedOperationException(); } public InputStream getUnicodeStream(int columnIndex) throws SQLException { throw new UnsupportedOperationException(); } public InputStream getBinaryStream(int columnIndex) throws SQLException { throw new UnsupportedOperationException(); } public String getString(String columnLabel) throws SQLException { final Object result = getColumn(columnLabel); return result == null ? null : String.valueOf(result); } public boolean getBoolean(String columnLabel) throws SQLException { Object o = getColumn(columnLabel); if (o instanceof Boolean) { return (Boolean) o; } else if (o instanceof String) { return Boolean.valueOf((String) o); } else { return !o.equals(0); } } public byte getByte(String columnLabel) throws SQLException { Object o = getColumn(columnLabel); return ((Number) o).byteValue(); } public short getShort(String columnLabel) throws SQLException { Object o = getColumn(columnLabel); return ((Number) o).shortValue(); } public int getInt(String columnLabel) throws SQLException { Object o = getColumn(columnLabel); return ((Number) o).intValue(); } public long getLong(String columnLabel) throws SQLException { Object o = getColumn(columnLabel); return ((Number) o).longValue(); } public float getFloat(String columnLabel) throws SQLException { Object o = getColumn(columnLabel); return ((Number) o).floatValue(); } public double getDouble(String columnLabel) throws SQLException { Object o = getColumn(columnLabel); return ((Number) o).doubleValue(); } public BigDecimal getBigDecimal( String columnLabel, int scale) throws SQLException { throw new UnsupportedOperationException(); } public byte[] getBytes(String columnLabel) throws SQLException { Object o = getColumn(columnLabel); return (byte[]) o; } public Date getDate(String columnLabel) throws SQLException { Object o = getColumn(columnLabel); return (Date) o; } public Time getTime(String columnLabel) throws SQLException { Object o = getColumn(columnLabel); return (Time) o; } public Timestamp getTimestamp(String columnLabel) throws SQLException { Object o = getColumn(columnLabel); return (Timestamp) o; } public InputStream getAsciiStream(String columnLabel) throws SQLException { throw new UnsupportedOperationException(); } public InputStream getUnicodeStream(String columnLabel) throws SQLException { throw new UnsupportedOperationException(); } public InputStream getBinaryStream(String columnLabel) throws SQLException { throw new UnsupportedOperationException(); } public SQLWarning getWarnings() throws SQLException { throw new UnsupportedOperationException(); } public void clearWarnings() throws SQLException { throw new UnsupportedOperationException(); } public String getCursorName() throws SQLException { throw new UnsupportedOperationException(); } public ResultSetMetaData getMetaData() throws SQLException { return metaData; } public Object getObject(int columnIndex) throws SQLException { throw new UnsupportedOperationException(); } public Object getObject(String columnLabel) throws SQLException { throw new UnsupportedOperationException(); } public int findColumn(String columnLabel) throws SQLException { throw new UnsupportedOperationException(); } public Reader getCharacterStream(int columnIndex) throws SQLException { throw new UnsupportedOperationException(); } public Reader getCharacterStream(String columnLabel) throws SQLException { throw new UnsupportedOperationException(); } public BigDecimal getBigDecimal(int columnIndex) throws SQLException { throw new UnsupportedOperationException(); } public BigDecimal getBigDecimal(String columnLabel) throws SQLException { throw new UnsupportedOperationException(); } public boolean isBeforeFirst() throws SQLException { return rowOrdinal < 0; } public boolean isAfterLast() throws SQLException { return rowOrdinal >= rowList.size(); } public boolean isFirst() throws SQLException { return rowOrdinal == 0; } public boolean isLast() throws SQLException { return rowOrdinal == rowList.size() - 1; } public void beforeFirst() throws SQLException { rowOrdinal = -1; } public void afterLast() throws SQLException { rowOrdinal = rowList.size(); } public boolean first() throws SQLException { if (rowList.size() == 0) { return false; } else { rowOrdinal = 0; return true; } } public boolean last() throws SQLException { if (rowList.size() == 0) { return false; } else { rowOrdinal = rowList.size() - 1; return true; } } public int getRow() throws SQLException { return rowOrdinal + 1; // 1-based } public boolean absolute(int row) throws SQLException { int newRowOrdinal = row - 1;// convert to 0-based if (newRowOrdinal >= 0 && newRowOrdinal < rowList.size()) { rowOrdinal = newRowOrdinal; return true; } else { return false; } } public boolean relative(int rows) throws SQLException { int newRowOrdinal = rowOrdinal + (rows - 1); if (newRowOrdinal >= 0 && newRowOrdinal < rowList.size()) { rowOrdinal = newRowOrdinal; return true; } else { return false; } } public boolean previous() throws SQLException { // converse of next(); note that if rowOrdinal == 0, we decrement // but return false if (rowOrdinal >= 0) { --rowOrdinal; } return rowOrdinal >= 0; } public void setFetchDirection(int direction) throws SQLException { throw new UnsupportedOperationException(); } public int getFetchDirection() throws SQLException { throw new UnsupportedOperationException(); } public void setFetchSize(int rows) throws SQLException { throw new UnsupportedOperationException(); } public int getFetchSize() throws SQLException { throw new UnsupportedOperationException(); } public int getType() throws SQLException { throw new UnsupportedOperationException(); } public int getConcurrency() throws SQLException { throw new UnsupportedOperationException(); } public boolean rowUpdated() throws SQLException { throw new UnsupportedOperationException(); } public boolean rowInserted() throws SQLException { throw new UnsupportedOperationException(); } public boolean rowDeleted() throws SQLException { throw new UnsupportedOperationException(); } public void updateNull(int columnIndex) throws SQLException { throw new UnsupportedOperationException(); } public void updateBoolean(int columnIndex, boolean x) throws SQLException { throw new UnsupportedOperationException(); } public void updateByte(int columnIndex, byte x) throws SQLException { throw new UnsupportedOperationException(); } public void updateShort(int columnIndex, short x) throws SQLException { throw new UnsupportedOperationException(); } public void updateInt(int columnIndex, int x) throws SQLException { throw new UnsupportedOperationException(); } public void updateLong(int columnIndex, long x) throws SQLException { throw new UnsupportedOperationException(); } public void updateFloat(int columnIndex, float x) throws SQLException { throw new UnsupportedOperationException(); } public void updateDouble(int columnIndex, double x) throws SQLException { throw new UnsupportedOperationException(); } public void updateBigDecimal( int columnIndex, BigDecimal x) throws SQLException { throw new UnsupportedOperationException(); } public void updateString(int columnIndex, String x) throws SQLException { throw new UnsupportedOperationException(); } public void updateBytes(int columnIndex, byte x[]) throws SQLException { throw new UnsupportedOperationException(); } public void updateDate(int columnIndex, Date x) throws SQLException { throw new UnsupportedOperationException(); } public void updateTime(int columnIndex, Time x) throws SQLException { throw new UnsupportedOperationException(); } public void updateTimestamp( int columnIndex, Timestamp x) throws SQLException { throw new UnsupportedOperationException(); } public void updateAsciiStream( int columnIndex, InputStream x, int length) throws SQLException { throw new UnsupportedOperationException(); } public void updateBinaryStream( int columnIndex, InputStream x, int length) throws SQLException { throw new UnsupportedOperationException(); } public void updateCharacterStream( int columnIndex, Reader x, int length) throws SQLException { throw new UnsupportedOperationException(); } public void updateObject( int columnIndex, Object x, int scaleOrLength) throws SQLException { throw new UnsupportedOperationException(); } public void updateObject(int columnIndex, Object x) throws SQLException { throw new UnsupportedOperationException(); } public void updateNull(String columnLabel) throws SQLException { throw new UnsupportedOperationException(); } public void updateBoolean( String columnLabel, boolean x) throws SQLException { throw new UnsupportedOperationException(); } public void updateByte(String columnLabel, byte x) throws SQLException { throw new UnsupportedOperationException(); } public void updateShort(String columnLabel, short x) throws SQLException { throw new UnsupportedOperationException(); } public void updateInt(String columnLabel, int x) throws SQLException { throw new UnsupportedOperationException(); } public void updateLong(String columnLabel, long x) throws SQLException { throw new UnsupportedOperationException(); } public void updateFloat(String columnLabel, float x) throws SQLException { throw new UnsupportedOperationException(); } public void updateDouble(String columnLabel, double x) throws SQLException { throw new UnsupportedOperationException(); } public void updateBigDecimal( String columnLabel, BigDecimal x) throws SQLException { throw new UnsupportedOperationException(); } public void updateString(String columnLabel, String x) throws SQLException { throw new UnsupportedOperationException(); } public void updateBytes(String columnLabel, byte x[]) throws SQLException { throw new UnsupportedOperationException(); } public void updateDate(String columnLabel, Date x) throws SQLException { throw new UnsupportedOperationException(); } public void updateTime(String columnLabel, Time x) throws SQLException { throw new UnsupportedOperationException(); } public void updateTimestamp( String columnLabel, Timestamp x) throws SQLException { throw new UnsupportedOperationException(); } public void updateAsciiStream( String columnLabel, InputStream x, int length) throws SQLException { throw new UnsupportedOperationException(); } public void updateBinaryStream( String columnLabel, InputStream x, int length) throws SQLException { throw new UnsupportedOperationException(); } public void updateCharacterStream( String columnLabel, Reader reader, int length) throws SQLException { throw new UnsupportedOperationException(); } public void updateObject( String columnLabel, Object x, int scaleOrLength) throws SQLException { throw new UnsupportedOperationException(); } public void updateObject(String columnLabel, Object x) throws SQLException { throw new UnsupportedOperationException(); } public void insertRow() throws SQLException { throw new UnsupportedOperationException(); } public void updateRow() throws SQLException { throw new UnsupportedOperationException(); } public void deleteRow() throws SQLException { throw new UnsupportedOperationException(); } public void refreshRow() throws SQLException { throw new UnsupportedOperationException(); } public void cancelRowUpdates() throws SQLException { throw new UnsupportedOperationException(); } public void moveToInsertRow() throws SQLException { throw new UnsupportedOperationException(); } public void moveToCurrentRow() throws SQLException { throw new UnsupportedOperationException(); } public Statement getStatement() throws SQLException { throw new UnsupportedOperationException(); } public Object getObject( int columnIndex, Map> map) throws SQLException { throw new UnsupportedOperationException(); } public Ref getRef(int columnIndex) throws SQLException { throw new UnsupportedOperationException(); } public Blob getBlob(int columnIndex) throws SQLException { throw new UnsupportedOperationException(); } public Clob getClob(int columnIndex) throws SQLException { throw new UnsupportedOperationException(); } public Array getArray(int columnIndex) throws SQLException { throw new UnsupportedOperationException(); } public Object getObject( String columnLabel, Map> map) throws SQLException { throw new UnsupportedOperationException(); } public Ref getRef(String columnLabel) throws SQLException { throw new UnsupportedOperationException(); } public Blob getBlob(String columnLabel) throws SQLException { throw new UnsupportedOperationException(); } public Clob getClob(String columnLabel) throws SQLException { throw new UnsupportedOperationException(); } public Array getArray(String columnLabel) throws SQLException { throw new UnsupportedOperationException(); } public Date getDate(int columnIndex, Calendar cal) throws SQLException { throw new UnsupportedOperationException(); } public Date getDate(String columnLabel, Calendar cal) throws SQLException { throw new UnsupportedOperationException(); } public Time getTime(int columnIndex, Calendar cal) throws SQLException { throw new UnsupportedOperationException(); } public Time getTime(String columnLabel, Calendar cal) throws SQLException { throw new UnsupportedOperationException(); } public Timestamp getTimestamp( int columnIndex, Calendar cal) throws SQLException { throw new UnsupportedOperationException(); } public Timestamp getTimestamp( String columnLabel, Calendar cal) throws SQLException { throw new UnsupportedOperationException(); } public URL getURL(int columnIndex) throws SQLException { throw new UnsupportedOperationException(); } public URL getURL(String columnLabel) throws SQLException { throw new UnsupportedOperationException(); } public void updateRef(int columnIndex, Ref x) throws SQLException { throw new UnsupportedOperationException(); } public void updateRef(String columnLabel, Ref x) throws SQLException { throw new UnsupportedOperationException(); } public void updateBlob(int columnIndex, Blob x) throws SQLException { throw new UnsupportedOperationException(); } public void updateBlob(String columnLabel, Blob x) throws SQLException { throw new UnsupportedOperationException(); } public void updateClob(int columnIndex, Clob x) throws SQLException { throw new UnsupportedOperationException(); } public void updateClob(String columnLabel, Clob x) throws SQLException { throw new UnsupportedOperationException(); } public void updateArray(int columnIndex, Array x) throws SQLException { throw new UnsupportedOperationException(); } public void updateArray(String columnLabel, Array x) throws SQLException { throw new UnsupportedOperationException(); } // implement Wrapper public T unwrap(Class iface) throws SQLException { if (iface.isInstance(this)) { return iface.cast(this); } throw olap4jConnection.helper.createException("cannot cast"); } public boolean isWrapperFor(Class iface) throws SQLException { return iface.isInstance(this); } } // End EmptyResultSet.java mondrian-3.11.0.1-R/src/main/mondrian/olap4j/Factory.java000066400000000000000000000055031261646570300227430ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.olap4j; import mondrian.rolap.RolapConnection; import org.olap4j.OlapException; import java.sql.*; import java.util.List; import java.util.Properties; /** * Instantiates classes to implement the olap4j API against the * Mondrian OLAP engine. * *

There are implementations for JDBC 3.0 (which occurs in JDK 1.5) * and JDBC 4.0 (which occurs in JDK 1.6). * * @author jhyde * @since Jun 14, 2007 */ interface Factory { /** * Creates a connection. * * @param driver Driver * @param url URL of server * @param info Properties defining the connection * @return Connection * @throws SQLException on error */ Connection newConnection( MondrianOlap4jDriver driver, String url, Properties info) throws SQLException; /** * Creates an empty result set. * * @param olap4jConnection Connection * @return Result set */ EmptyResultSet newEmptyResultSet( MondrianOlap4jConnection olap4jConnection); /** * Creates a result set with a fixed set of rows. * * @param olap4jConnection Connection * @param headerList Column headers * @param rowList Row values * @return Result set */ ResultSet newFixedResultSet( MondrianOlap4jConnection olap4jConnection, List headerList, List> rowList); /** * Creates a cell set. * * * @param olap4jStatement Statement * @return Cell set */ MondrianOlap4jCellSet newCellSet( MondrianOlap4jStatement olap4jStatement); /** * Creates a statement. * * @param olap4jConnection Connection * @return Statement */ MondrianOlap4jStatement newStatement( MondrianOlap4jConnection olap4jConnection); /** * Creates a prepared statement. * * @param mdx MDX query text * @param olap4jConnection Connection * @return Prepared statement * @throws org.olap4j.OlapException on database error */ MondrianOlap4jPreparedStatement newPreparedStatement( String mdx, MondrianOlap4jConnection olap4jConnection) throws OlapException; /** * Creates a metadata object. * * @param olap4jConnection Connection * @param mondrianConnection Mondrian connection * @return Metadata object */ MondrianOlap4jDatabaseMetaData newDatabaseMetaData( MondrianOlap4jConnection olap4jConnection, RolapConnection mondrianConnection); } // End Factory.java mondrian-3.11.0.1-R/src/main/mondrian/olap4j/FactoryJdbc41Impl.java000066400000000000000000000145011261646570300245130ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.olap4j; import mondrian.rolap.RolapConnection; import org.olap4j.OlapException; import java.sql.*; import java.util.*; import java.util.concurrent.Executor; /** * Implementation of {@link mondrian.olap4j.Factory} for JDBC 4.1. * * @author jhyde */ class FactoryJdbc41Impl implements Factory { public Connection newConnection( MondrianOlap4jDriver driver, String url, Properties info) throws SQLException { return new MondrianOlap4jConnectionJdbc41(this, driver, url, info); } public EmptyResultSet newEmptyResultSet( MondrianOlap4jConnection olap4jConnection) { List headerList = Collections.emptyList(); List> rowList = Collections.emptyList(); return new EmptyResultSetJdbc41( olap4jConnection, headerList, rowList); } public ResultSet newFixedResultSet( MondrianOlap4jConnection olap4jConnection, List headerList, List> rowList) { return new EmptyResultSetJdbc41( olap4jConnection, headerList, rowList); } public MondrianOlap4jCellSet newCellSet( MondrianOlap4jStatement olap4jStatement) { return new MondrianOlap4jCellSetJdbc41(olap4jStatement); } public MondrianOlap4jStatement newStatement( MondrianOlap4jConnection olap4jConnection) { return new MondrianOlap4jStatementJdbc41(olap4jConnection); } public MondrianOlap4jPreparedStatement newPreparedStatement( String mdx, MondrianOlap4jConnection olap4jConnection) throws OlapException { return new MondrianOlap4jPreparedStatementJdbc41(olap4jConnection, mdx); } public MondrianOlap4jDatabaseMetaData newDatabaseMetaData( MondrianOlap4jConnection olap4jConnection, RolapConnection mondrianConnection) { return new MondrianOlap4jDatabaseMetaDataJdbc41( olap4jConnection, mondrianConnection); } // Inner classes private static class EmptyResultSetJdbc41 extends FactoryJdbc4Plus.AbstractEmptyResultSet { EmptyResultSetJdbc41( MondrianOlap4jConnection olap4jConnection, List headerList, List> rowList) { super(olap4jConnection, headerList, rowList); } public T getObject( int columnIndex, Class type) throws SQLException { throw new UnsupportedOperationException(); } public T getObject( String columnLabel, Class type) throws SQLException { throw new UnsupportedOperationException(); } } private static class MondrianOlap4jConnectionJdbc41 extends FactoryJdbc4Plus.AbstractConnection { MondrianOlap4jConnectionJdbc41( Factory factory, MondrianOlap4jDriver driver, String url, Properties info) throws SQLException { super(factory, driver, url, info); } public void abort(Executor executor) throws SQLException { throw new UnsupportedOperationException(); } public void setNetworkTimeout( Executor executor, int milliseconds) throws SQLException { throw new UnsupportedOperationException(); } public int getNetworkTimeout() throws SQLException { throw new UnsupportedOperationException(); } } private static class MondrianOlap4jCellSetJdbc41 extends FactoryJdbc4Plus.AbstractCellSet { public MondrianOlap4jCellSetJdbc41( MondrianOlap4jStatement olap4jStatement) { super(olap4jStatement); } public T getObject( int columnIndex, Class type) throws SQLException { throw new UnsupportedOperationException(); } public T getObject( String columnLabel, Class type) throws SQLException { throw new UnsupportedOperationException(); } } private static class MondrianOlap4jStatementJdbc41 extends MondrianOlap4jStatement { public MondrianOlap4jStatementJdbc41( MondrianOlap4jConnection olap4jConnection) { super(olap4jConnection); } public void closeOnCompletion() throws SQLException { closeOnCompletion = true; } public boolean isCloseOnCompletion() throws SQLException { return closeOnCompletion; } } private static class MondrianOlap4jPreparedStatementJdbc41 extends FactoryJdbc4Plus.AbstractPreparedStatement { public MondrianOlap4jPreparedStatementJdbc41( MondrianOlap4jConnection olap4jConnection, String mdx) throws OlapException { super(olap4jConnection, mdx); } public void closeOnCompletion() throws SQLException { closeOnCompletion = true; } public boolean isCloseOnCompletion() throws SQLException { return closeOnCompletion; } } private static class MondrianOlap4jDatabaseMetaDataJdbc41 extends FactoryJdbc4Plus.AbstractDatabaseMetaData { public MondrianOlap4jDatabaseMetaDataJdbc41( MondrianOlap4jConnection olap4jConnection, RolapConnection mondrianConnection) { super(olap4jConnection, mondrianConnection); } public ResultSet getPseudoColumns( String catalog, String schemaPattern, String tableNamePattern, String columnNamePattern) throws SQLException { throw new UnsupportedOperationException(); } public boolean generatedKeyAlwaysReturned() throws SQLException { throw new UnsupportedOperationException(); } } } // End FactoryJdbc41Impl.java mondrian-3.11.0.1-R/src/main/mondrian/olap4j/FactoryJdbc4Plus.java000066400000000000000000000626251261646570300244660ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.olap4j; import mondrian.rolap.RolapConnection; import org.olap4j.*; import java.io.InputStream; import java.io.Reader; import java.sql.*; import java.util.*; /** * Abstract JDBC classes, for JDBC 4.0 and 4.1. * * @author jhyde * @since Jun 14, 2007 */ class FactoryJdbc4Plus { // Inner classes protected static abstract class AbstractEmptyResultSet extends EmptyResultSet { AbstractEmptyResultSet( MondrianOlap4jConnection olap4jConnection, List headerList, List> rowList) { super(olap4jConnection, headerList, rowList); } // implement java.sql.ResultSet methods // introduced in JDBC 4.0/JDK 1.6 public RowId getRowId(int columnIndex) throws SQLException { throw new UnsupportedOperationException(); } public RowId getRowId(String columnLabel) throws SQLException { throw new UnsupportedOperationException(); } public void updateRowId(int columnIndex, RowId x) throws SQLException { throw new UnsupportedOperationException(); } public void updateRowId(String columnLabel, RowId x) throws SQLException { throw new UnsupportedOperationException(); } public int getHoldability() throws SQLException { throw new UnsupportedOperationException(); } public boolean isClosed() throws SQLException { throw new UnsupportedOperationException(); } public void updateNString( int columnIndex, String nString) throws SQLException { throw new UnsupportedOperationException(); } public void updateNString( String columnLabel, String nString) throws SQLException { throw new UnsupportedOperationException(); } public void updateNClob(int columnIndex, NClob nClob) throws SQLException { throw new UnsupportedOperationException(); } public void updateNClob( String columnLabel, NClob nClob) throws SQLException { throw new UnsupportedOperationException(); } public NClob getNClob(int columnIndex) throws SQLException { throw new UnsupportedOperationException(); } public NClob getNClob(String columnLabel) throws SQLException { throw new UnsupportedOperationException(); } public SQLXML getSQLXML(int columnIndex) throws SQLException { throw new UnsupportedOperationException(); } public SQLXML getSQLXML(String columnLabel) throws SQLException { throw new UnsupportedOperationException(); } public void updateSQLXML( int columnIndex, SQLXML xmlObject) throws SQLException { throw new UnsupportedOperationException(); } public void updateSQLXML( String columnLabel, SQLXML xmlObject) throws SQLException { throw new UnsupportedOperationException(); } public String getNString(int columnIndex) throws SQLException { throw new UnsupportedOperationException(); } public String getNString(String columnLabel) throws SQLException { throw new UnsupportedOperationException(); } public Reader getNCharacterStream(int columnIndex) throws SQLException { throw new UnsupportedOperationException(); } public Reader getNCharacterStream(String columnLabel) throws SQLException { throw new UnsupportedOperationException(); } public void updateNCharacterStream( int columnIndex, Reader x, long length) throws SQLException { throw new UnsupportedOperationException(); } public void updateNCharacterStream( String columnLabel, Reader reader, long length) throws SQLException { throw new UnsupportedOperationException(); } public void updateAsciiStream( int columnIndex, InputStream x, long length) throws SQLException { throw new UnsupportedOperationException(); } public void updateBinaryStream( int columnIndex, InputStream x, long length) throws SQLException { throw new UnsupportedOperationException(); } public void updateCharacterStream( int columnIndex, Reader x, long length) throws SQLException { throw new UnsupportedOperationException(); } public void updateAsciiStream( String columnLabel, InputStream x, long length) throws SQLException { throw new UnsupportedOperationException(); } public void updateBinaryStream( String columnLabel, InputStream x, long length) throws SQLException { throw new UnsupportedOperationException(); } public void updateCharacterStream( String columnLabel, Reader reader, long length) throws SQLException { throw new UnsupportedOperationException(); } public void updateBlob( int columnIndex, InputStream inputStream, long length) throws SQLException { throw new UnsupportedOperationException(); } public void updateBlob( String columnLabel, InputStream inputStream, long length) throws SQLException { throw new UnsupportedOperationException(); } public void updateClob( int columnIndex, Reader reader, long length) throws SQLException { throw new UnsupportedOperationException(); } public void updateClob( String columnLabel, Reader reader, long length) throws SQLException { throw new UnsupportedOperationException(); } public void updateNClob( int columnIndex, Reader reader, long length) throws SQLException { throw new UnsupportedOperationException(); } public void updateNClob( String columnLabel, Reader reader, long length) throws SQLException { throw new UnsupportedOperationException(); } public void updateNCharacterStream( int columnIndex, Reader x) throws SQLException { throw new UnsupportedOperationException(); } public void updateNCharacterStream( String columnLabel, Reader reader) throws SQLException { throw new UnsupportedOperationException(); } public void updateAsciiStream( int columnIndex, InputStream x) throws SQLException { throw new UnsupportedOperationException(); } public void updateBinaryStream( int columnIndex, InputStream x) throws SQLException { throw new UnsupportedOperationException(); } public void updateCharacterStream( int columnIndex, Reader x) throws SQLException { throw new UnsupportedOperationException(); } public void updateAsciiStream( String columnLabel, InputStream x) throws SQLException { throw new UnsupportedOperationException(); } public void updateBinaryStream( String columnLabel, InputStream x) throws SQLException { throw new UnsupportedOperationException(); } public void updateCharacterStream( String columnLabel, Reader reader) throws SQLException { throw new UnsupportedOperationException(); } public void updateBlob( int columnIndex, InputStream inputStream) throws SQLException { throw new UnsupportedOperationException(); } public void updateBlob( String columnLabel, InputStream inputStream) throws SQLException { throw new UnsupportedOperationException(); } public void updateClob(int columnIndex, Reader reader) throws SQLException { throw new UnsupportedOperationException(); } public void updateClob( String columnLabel, Reader reader) throws SQLException { throw new UnsupportedOperationException(); } public void updateNClob( int columnIndex, Reader reader) throws SQLException { throw new UnsupportedOperationException(); } public void updateNClob( String columnLabel, Reader reader) throws SQLException { throw new UnsupportedOperationException(); } } static abstract class AbstractConnection extends MondrianOlap4jConnection implements OlapConnection { AbstractConnection( Factory factory, MondrianOlap4jDriver driver, String url, Properties info) throws SQLException { super(factory, driver, url, info); } public OlapStatement createStatement() { return super.createStatement(); } public OlapDatabaseMetaData getMetaData() { return super.getMetaData(); } // implement java.sql.Connection methods // introduced in JDBC 4.0/JDK 1.6 public Clob createClob() throws SQLException { throw new UnsupportedOperationException(); } public Blob createBlob() throws SQLException { throw new UnsupportedOperationException(); } public NClob createNClob() throws SQLException { throw new UnsupportedOperationException(); } public SQLXML createSQLXML() throws SQLException { throw new UnsupportedOperationException(); } public boolean isValid(int timeout) throws SQLException { return !isClosed(); } public void setClientInfo( String name, String value) throws SQLClientInfoException { throw new UnsupportedOperationException(); } public void setClientInfo(Properties properties) throws SQLClientInfoException { throw new UnsupportedOperationException(); } public String getClientInfo(String name) throws SQLException { throw new UnsupportedOperationException(); } public Properties getClientInfo() throws SQLException { throw new UnsupportedOperationException(); } public Array createArrayOf( String typeName, Object[] elements) throws SQLException { throw new UnsupportedOperationException(); } public Struct createStruct( String typeName, Object[] attributes) throws SQLException { throw new UnsupportedOperationException(); } } static abstract class AbstractCellSet extends MondrianOlap4jCellSet { public AbstractCellSet( MondrianOlap4jStatement olap4jStatement) { super(olap4jStatement); } // implement java.sql.CellSet methods // introduced in JDBC 4.0/JDK 1.6 public RowId getRowId(int columnIndex) throws SQLException { throw new UnsupportedOperationException(); } public RowId getRowId(String columnLabel) throws SQLException { throw new UnsupportedOperationException(); } public void updateRowId(int columnIndex, RowId x) throws SQLException { throw new UnsupportedOperationException(); } public void updateRowId(String columnLabel, RowId x) throws SQLException { throw new UnsupportedOperationException(); } public int getHoldability() throws SQLException { throw new UnsupportedOperationException(); } public boolean isClosed() throws SQLException { return closed; } public void updateNString( int columnIndex, String nString) throws SQLException { throw new UnsupportedOperationException(); } public void updateNString( String columnLabel, String nString) throws SQLException { throw new UnsupportedOperationException(); } public void updateNClob(int columnIndex, NClob nClob) throws SQLException { throw new UnsupportedOperationException(); } public void updateNClob( String columnLabel, NClob nClob) throws SQLException { throw new UnsupportedOperationException(); } public NClob getNClob(int columnIndex) throws SQLException { throw new UnsupportedOperationException(); } public NClob getNClob(String columnLabel) throws SQLException { throw new UnsupportedOperationException(); } public SQLXML getSQLXML(int columnIndex) throws SQLException { throw new UnsupportedOperationException(); } public SQLXML getSQLXML(String columnLabel) throws SQLException { throw new UnsupportedOperationException(); } public void updateSQLXML( int columnIndex, SQLXML xmlObject) throws SQLException { throw new UnsupportedOperationException(); } public void updateSQLXML( String columnLabel, SQLXML xmlObject) throws SQLException { throw new UnsupportedOperationException(); } public String getNString(int columnIndex) throws SQLException { throw new UnsupportedOperationException(); } public String getNString(String columnLabel) throws SQLException { throw new UnsupportedOperationException(); } public Reader getNCharacterStream(int columnIndex) throws SQLException { throw new UnsupportedOperationException(); } public Reader getNCharacterStream( String columnLabel) throws SQLException { throw new UnsupportedOperationException(); } public void updateNCharacterStream( int columnIndex, Reader x, long length) throws SQLException { throw new UnsupportedOperationException(); } public void updateNCharacterStream( String columnLabel, Reader reader, long length) throws SQLException { throw new UnsupportedOperationException(); } public void updateAsciiStream( int columnIndex, InputStream x, long length) throws SQLException { throw new UnsupportedOperationException(); } public void updateBinaryStream( int columnIndex, InputStream x, long length) throws SQLException { throw new UnsupportedOperationException(); } public void updateCharacterStream( int columnIndex, Reader x, long length) throws SQLException { throw new UnsupportedOperationException(); } public void updateAsciiStream( String columnLabel, InputStream x, long length) throws SQLException { throw new UnsupportedOperationException(); } public void updateBinaryStream( String columnLabel, InputStream x, long length) throws SQLException { throw new UnsupportedOperationException(); } public void updateCharacterStream( String columnLabel, Reader reader, long length) throws SQLException { throw new UnsupportedOperationException(); } public void updateBlob( int columnIndex, InputStream inputStream, long length) throws SQLException { throw new UnsupportedOperationException(); } public void updateBlob( String columnLabel, InputStream inputStream, long length) throws SQLException { throw new UnsupportedOperationException(); } public void updateClob( int columnIndex, Reader reader, long length) throws SQLException { throw new UnsupportedOperationException(); } public void updateClob( String columnLabel, Reader reader, long length) throws SQLException { throw new UnsupportedOperationException(); } public void updateNClob( int columnIndex, Reader reader, long length) throws SQLException { throw new UnsupportedOperationException(); } public void updateNClob( String columnLabel, Reader reader, long length) throws SQLException { throw new UnsupportedOperationException(); } public void updateNCharacterStream( int columnIndex, Reader x) throws SQLException { throw new UnsupportedOperationException(); } public void updateNCharacterStream( String columnLabel, Reader reader) throws SQLException { throw new UnsupportedOperationException(); } public void updateAsciiStream( int columnIndex, InputStream x) throws SQLException { throw new UnsupportedOperationException(); } public void updateBinaryStream( int columnIndex, InputStream x) throws SQLException { throw new UnsupportedOperationException(); } public void updateCharacterStream( int columnIndex, Reader x) throws SQLException { throw new UnsupportedOperationException(); } public void updateAsciiStream( String columnLabel, InputStream x) throws SQLException { throw new UnsupportedOperationException(); } public void updateBinaryStream( String columnLabel, InputStream x) throws SQLException { throw new UnsupportedOperationException(); } public void updateCharacterStream( String columnLabel, Reader reader) throws SQLException { throw new UnsupportedOperationException(); } public void updateBlob( int columnIndex, InputStream inputStream) throws SQLException { throw new UnsupportedOperationException(); } public void updateBlob( String columnLabel, InputStream inputStream) throws SQLException { throw new UnsupportedOperationException(); } public void updateClob( int columnIndex, Reader reader) throws SQLException { throw new UnsupportedOperationException(); } public void updateClob( String columnLabel, Reader reader) throws SQLException { throw new UnsupportedOperationException(); } public void updateNClob( int columnIndex, Reader reader) throws SQLException { throw new UnsupportedOperationException(); } public void updateNClob( String columnLabel, Reader reader) throws SQLException { throw new UnsupportedOperationException(); } } // No need for an "AbstractStatement" class. Statement API is the same // JDBC 3 and JDBC 4. static abstract class AbstractPreparedStatement extends MondrianOlap4jPreparedStatement { public AbstractPreparedStatement( MondrianOlap4jConnection olap4jConnection, String mdx) throws OlapException { super(olap4jConnection, mdx); } public CellSetMetaData getMetaData() { return super.getMetaData(); } // implement java.sql.PreparedStatement methods // introduced in JDBC 4.0/JDK 1.6 public void setRowId(int parameterIndex, RowId x) throws SQLException { throw new UnsupportedOperationException(); } public void setNString( int parameterIndex, String value) throws SQLException { throw new UnsupportedOperationException(); } public void setNCharacterStream( int parameterIndex, Reader value, long length) throws SQLException { throw new UnsupportedOperationException(); } public void setNClob( int parameterIndex, NClob value) throws SQLException { throw new UnsupportedOperationException(); } public void setClob( int parameterIndex, Reader reader, long length) throws SQLException { throw new UnsupportedOperationException(); } public void setBlob( int parameterIndex, InputStream inputStream, long length) throws SQLException { throw new UnsupportedOperationException(); } public void setNClob( int parameterIndex, Reader reader, long length) throws SQLException { throw new UnsupportedOperationException(); } public void setSQLXML( int parameterIndex, SQLXML xmlObject) throws SQLException { throw new UnsupportedOperationException(); } public void setAsciiStream( int parameterIndex, InputStream x, long length) throws SQLException { throw new UnsupportedOperationException(); } public void setBinaryStream( int parameterIndex, InputStream x, long length) throws SQLException { throw new UnsupportedOperationException(); } public void setCharacterStream( int parameterIndex, Reader reader, long length) throws SQLException { throw new UnsupportedOperationException(); } public void setAsciiStream( int parameterIndex, InputStream x) throws SQLException { throw new UnsupportedOperationException(); } public void setBinaryStream( int parameterIndex, InputStream x) throws SQLException { throw new UnsupportedOperationException(); } public void setCharacterStream( int parameterIndex, Reader reader) throws SQLException { throw new UnsupportedOperationException(); } public void setNCharacterStream( int parameterIndex, Reader value) throws SQLException { throw new UnsupportedOperationException(); } public void setClob( int parameterIndex, Reader reader) throws SQLException { throw new UnsupportedOperationException(); } public void setBlob( int parameterIndex, InputStream inputStream) throws SQLException { throw new UnsupportedOperationException(); } public void setNClob( int parameterIndex, Reader reader) throws SQLException { throw new UnsupportedOperationException(); } } static abstract class AbstractDatabaseMetaData extends MondrianOlap4jDatabaseMetaData { public AbstractDatabaseMetaData( MondrianOlap4jConnection olap4jConnection, RolapConnection mondrianConnection) { super(olap4jConnection, mondrianConnection); } public OlapConnection getConnection() { return super.getConnection(); } // implement java.sql.DatabaseMetaData methods // introduced in JDBC 4.0/JDK 1.6 public RowIdLifetime getRowIdLifetime() throws SQLException { throw new UnsupportedOperationException(); } public ResultSet getSchemas( String catalog, String schemaPattern) throws SQLException { throw new UnsupportedOperationException(); } public boolean supportsStoredFunctionsUsingCallSyntax() throws SQLException { throw new UnsupportedOperationException(); } public boolean autoCommitFailureClosesAllResultSets() throws SQLException { throw new UnsupportedOperationException(); } public ResultSet getClientInfoProperties() throws SQLException { throw new UnsupportedOperationException(); } public ResultSet getFunctions( String catalog, String schemaPattern, String functionNamePattern) throws SQLException { throw new UnsupportedOperationException(); } public ResultSet getFunctionColumns( String catalog, String schemaPattern, String functionNamePattern, String columnNamePattern) throws SQLException { throw new UnsupportedOperationException(); } } } // End FactoryJdbc4Plus.java mondrian-3.11.0.1-R/src/main/mondrian/olap4j/IMondrianOlap4jProperty.java000066400000000000000000000013661261646570300260360ustar00rootroot00000000000000/* // This software is subject to the terms of the Eclipse Public License v1.0 // Agreement, available at the following URL: // http://www.eclipse.org/legal/epl-v10.html. // You must accept the terms of that agreement to use this software. // // Copyright (C) 2005-2015 Pentaho and others // All Rights Reserved. */ package mondrian.olap4j; import mondrian.olap.Level; import org.olap4j.metadata.Property; /** * Wraps {@org.olap4j.metadata.Propery} to provide * information about level that contains current property * * @author Yury_Bakhmutski * @since Apr 17, 2015 * */ public interface IMondrianOlap4jProperty extends Property { /** * @return {@mondrian.olap.Level} */ Level getLevel(); } // End IMondrianOlap4jProperty.javamondrian-3.11.0.1-R/src/main/mondrian/olap4j/MondrianOlap4jCatalog.java000066400000000000000000000064231261646570300254520ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.olap4j; import mondrian.olap.Access; import mondrian.olap.OlapElement; import mondrian.rolap.RolapSchema; import org.olap4j.OlapDatabaseMetaData; import org.olap4j.OlapException; import org.olap4j.impl.*; import org.olap4j.metadata.*; import java.util.Map; /** * Implementation of {@link Catalog} * for the Mondrian OLAP engine. * * @author jhyde * @since May 23, 2007 */ class MondrianOlap4jCatalog extends MondrianOlap4jMetadataElement implements Catalog, Named { final MondrianOlap4jDatabaseMetaData olap4jDatabaseMetaData; final String name; final Map schemaMap; final MondrianOlap4jDatabase olap4jDatabase; MondrianOlap4jCatalog( MondrianOlap4jDatabaseMetaData olap4jDatabaseMetaData, String name, MondrianOlap4jDatabase database, Map schemaMap) { assert database != null; this.olap4jDatabaseMetaData = olap4jDatabaseMetaData; this.name = name; this.olap4jDatabase = database; this.schemaMap = schemaMap; // Make sure to register the schemas. for (Map.Entry entry : schemaMap.entrySet()) { String schemaName = entry.getKey(); final mondrian.olap.Schema schema = entry.getValue(); if (schemaName == null) { schemaName = schema.getName(); } MondrianOlap4jSchema olap4jSchema = new MondrianOlap4jSchema( this, schemaName, schema); olap4jDatabaseMetaData.olap4jConnection.schemaMap.put( schema, olap4jSchema); } } public NamedList getSchemas() throws OlapException { final NamedList list = new NamedListImpl(); for (Map.Entry entry : schemaMap.entrySet()) { String schemaName = entry.getKey(); final mondrian.olap.Schema schema = entry.getValue(); final MondrianOlap4jConnection oConn = ((MondrianOlap4jConnection)olap4jDatabase .getOlapConnection()); if (oConn .getMondrianConnection().getRole().getAccess(schema) != Access.NONE) { if (schemaName == null) { schemaName = schema.getName(); } MondrianOlap4jSchema olap4jSchema = new MondrianOlap4jSchema( this, schemaName, schema); list.add(olap4jSchema); } } return Olap4jUtil.cast(list); } public String getName() { return name; } public OlapDatabaseMetaData getMetaData() { return olap4jDatabaseMetaData; } public Database getDatabase() { return olap4jDatabase; } protected OlapElement getOlapElement() { return null; } } // End MondrianOlap4jCatalog.java mondrian-3.11.0.1-R/src/main/mondrian/olap4j/MondrianOlap4jCell.java000066400000000000000000000123601261646570300247540ustar00rootroot00000000000000/* // This software is subject to the terms of the Eclipse Public License v1.0 // Agreement, available at the following URL: // http://www.eclipse.org/legal/epl-v10.html. // You must accept the terms of that agreement to use this software. // // Copyright (c) 2002-2015 Pentaho Corporation.. All rights reserved. */ package mondrian.olap4j; import mondrian.olap.*; import mondrian.rolap.RolapCell; import mondrian.rolap.SqlStatement; import org.apache.log4j.Logger; import org.olap4j.*; import org.olap4j.Cell; import org.olap4j.metadata.Property; import java.sql.ResultSet; import java.util.ArrayList; import java.util.List; /** * Implementation of {@link Cell} * for the Mondrian OLAP engine. * * @author jhyde * @since May 24, 2007 */ class MondrianOlap4jCell implements Cell { private final int[] coordinates; private final MondrianOlap4jCellSet olap4jCellSet; final RolapCell cell; /** * Creates a MondrianOlap4jCell. * * @param coordinates Coordinates * @param olap4jCellSet Cell set * @param cell Cell in native Mondrian representation */ MondrianOlap4jCell( int[] coordinates, MondrianOlap4jCellSet olap4jCellSet, RolapCell cell) { assert coordinates != null; assert olap4jCellSet != null; assert cell != null; this.coordinates = coordinates; this.olap4jCellSet = olap4jCellSet; this.cell = cell; } public CellSet getCellSet() { return olap4jCellSet; } public int getOrdinal() { return (Integer) cell.getPropertyValue( mondrian.olap.Property.CELL_ORDINAL.name); } public List getCoordinateList() { ArrayList list = new ArrayList(coordinates.length); for (int coordinate : coordinates) { list.add(coordinate); } return list; } public Object getPropertyValue(Property property) { // We assume that mondrian properties have the same name as olap4j // properties. return cell.getPropertyValue(property.getName()); } public boolean isEmpty() { // FIXME return cell.isNull(); } public boolean isError() { return cell.isError(); } public boolean isNull() { return cell.isNull(); } public double getDoubleValue() throws OlapException { Object o = cell.getValue(); if (o instanceof Number) { Number number = (Number) o; return number.doubleValue(); } throw olap4jCellSet.olap4jStatement.olap4jConnection.helper .createException(this, "not a number"); } public String getErrorText() { Object o = cell.getValue(); if (o instanceof Throwable) { return ((Throwable) o).getMessage(); } else { return null; } } public Object getValue() { return cell.getValue(); } public String getFormattedValue() { return cell.getFormattedValue(); } public ResultSet drillThrough() throws OlapException { return drillThroughInternal( -1, -1, new ArrayList(), false, null, null); } /** * Executes drill-through on this cell. * *

Not a part of the public API. Package-protected because this method * also implements the DRILLTHROUGH statement. * * @param maxRowCount Maximum number of rows to retrieve, <= 0 if unlimited * @param firstRowOrdinal Ordinal of row to skip to (1-based), or 0 to * start from beginning * @param fields List of fields to return, expressed as MDX * expressions. * @param extendedContext If true, add non-constraining columns to the * query for levels below each current member. * This additional context makes the drill-through * queries easier for humans to understand. * @param logger Logger. If not null and debug is enabled, log SQL here * @param rowCountSlot Slot into which the number of fact rows is written * @return Result set * @throws OlapException on error */ ResultSet drillThroughInternal( int maxRowCount, int firstRowOrdinal, List fields, boolean extendedContext, Logger logger, int[] rowCountSlot) throws OlapException { if (!cell.canDrillThrough()) { return null; } if (rowCountSlot != null) { rowCountSlot[0] = cell.getDrillThroughCount(); } final SqlStatement sqlStmt = cell.drillThroughInternal( maxRowCount, firstRowOrdinal, fields, extendedContext, logger); return sqlStmt.getWrappedResultSet(); } public void setValue( Object newValue, AllocationPolicy allocationPolicy, Object... allocationArgs) throws OlapException { Scenario scenario = olap4jCellSet.olap4jStatement.olap4jConnection.getScenario(); cell.setValue(scenario, newValue, allocationPolicy, allocationArgs); } } // End MondrianOlap4jCell.java mondrian-3.11.0.1-R/src/main/mondrian/olap4j/MondrianOlap4jCellSet.java000066400000000000000000000646711261646570300254440ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.olap4j; import mondrian.olap.Axis; import mondrian.olap.*; import mondrian.rolap.RolapAxis; import mondrian.rolap.RolapCell; import mondrian.server.Execution; import mondrian.spi.ProfileHandler; import org.olap4j.Cell; import org.olap4j.*; import org.olap4j.Position; import java.io.*; import java.math.BigDecimal; import java.net.URL; import java.sql.*; import java.sql.Date; import java.util.*; /** * Implementation of {@link CellSet} * for the Mondrian OLAP engine. * *

This class has sub-classes which implement JDBC 3.0 and JDBC 4.0 APIs; * it is instantiated using {@link Factory#newCellSet}.

* * @author jhyde * @since May 24, 2007 */ abstract class MondrianOlap4jCellSet extends Execution implements CellSet { final MondrianOlap4jStatement olap4jStatement; final Query query; private Result result; protected boolean closed; private final MondrianOlap4jCellSetMetaData metaData; private final List axisList = new ArrayList(); private CellSetAxis filterAxis; /** * Creates a MondrianOlap4jCellSet. * * @param olap4jStatement Statement */ public MondrianOlap4jCellSet( MondrianOlap4jStatement olap4jStatement) { super(olap4jStatement, olap4jStatement.getQueryTimeoutMillis()); this.olap4jStatement = olap4jStatement; this.query = olap4jStatement.getQuery(); assert query != null; this.closed = false; if (olap4jStatement instanceof MondrianOlap4jPreparedStatement) { this.metaData = ((MondrianOlap4jPreparedStatement) olap4jStatement) .cellSetMetaData; } else { this.metaData = new MondrianOlap4jCellSetMetaData( olap4jStatement, query); } } /** * Executes a query. Not part of the olap4j API; internal to the mondrian * driver. * *

This method may take some time. While it is executing, a client may * execute {@link MondrianOlap4jStatement#cancel()}. * * @throws org.olap4j.OlapException on error */ void execute() throws OlapException { result = olap4jStatement.olap4jConnection.getMondrianConnection().execute( this); // initialize axes mondrian.olap.Axis[] axes = result.getAxes(); QueryAxis[] queryAxes = result.getQuery().getAxes(); assert axes.length == queryAxes.length; for (int i = 0; i < axes.length; i++) { Axis axis = axes[i]; QueryAxis queryAxis = queryAxes[i]; axisList.add( new MondrianOlap4jCellSetAxis( this, queryAxis, (RolapAxis) axis)); } // initialize filter axis QueryAxis queryAxis = result.getQuery().getSlicerAxis(); final Axis axis = result.getSlicerAxis(); if (queryAxis == null) { // Dummy slicer axis. queryAxis = new QueryAxis( false, null, AxisOrdinal.StandardAxisOrdinal.SLICER, QueryAxis.SubtotalVisibility.Undefined); } filterAxis = new MondrianOlap4jCellSetAxis(this, queryAxis, (RolapAxis) axis); } public CellSetMetaData getMetaData() { return metaData; } public List getAxes() { return axisList; } public CellSetAxis getFilterAxis() { return filterAxis; } public Cell getCell(List coordinates) { int[] coords = new int[coordinates.size()]; for (int i = 0; i < coords.length; i++) { coords[i] = coordinates.get(i); } return getCellInternal(coords); } public Cell getCell(int ordinal) { final int[] pos = ordinalToCoordinateArray(ordinal); return getCellInternal(pos); } private int[] ordinalToCoordinateArray(int ordinal) { Axis[] axes = result.getAxes(); final int[] pos = new int[axes.length]; int modulo = 1; for (int i = 0; i < axes.length; i++) { int prevModulo = modulo; modulo *= axes[i].getPositions().size(); pos[i] = (ordinal % modulo) / prevModulo; } if (ordinal < 0 || ordinal >= modulo) { throw new IndexOutOfBoundsException( "Cell ordinal " + ordinal + ") lies outside CellSet bounds (" + getBoundsAsString() + ")"); } return pos; } public Cell getCell(Position... positions) { int[] coords = new int[positions.length]; for (int i = 0; i < coords.length; i++) { coords[i] = positions[i].getOrdinal(); } return getCellInternal(coords); } private Cell getCellInternal(int[] pos) { RolapCell cell; try { cell = (RolapCell) result.getCell(pos); } catch (MondrianException e) { if (e.getMessage().indexOf("coordinates out of range") >= 0) { int[] dimensions = new int[getAxes().size()]; for (int i = 0; i < axisList.size(); i++) { dimensions[i] = axisList.get(i).getPositions().size(); } throw new IndexOutOfBoundsException( "Cell coordinates (" + getCoordsAsString(pos) + ") fall outside CellSet bounds (" + getCoordsAsString(dimensions) + ")"); } else if (e.getMessage().indexOf( "coordinates should have dimension") >= 0) { throw new IllegalArgumentException( "Cell coordinates should have dimension " + axisList.size()); } else { throw e; } } return new MondrianOlap4jCell(pos, this, cell); } private String getBoundsAsString() { StringBuilder buf = new StringBuilder(); Axis[] axes = result.getAxes(); for (int i = 0; i < axes.length; i++) { if (i > 0) { buf.append(", "); } buf.append(axes[i].getPositions().size()); } return buf.toString(); } private static String getCoordsAsString(int[] pos) { StringBuilder buf = new StringBuilder(); for (int i = 0; i < pos.length; i++) { int po = pos[i]; if (i > 0) { buf.append(", "); } buf.append(po); } return buf.toString(); } public List ordinalToCoordinates(int ordinal) { final int[] ints = ordinalToCoordinateArray(ordinal); final List list = new ArrayList(ints.length); for (int i : ints) { list.add(i); } return list; } public int coordinatesToOrdinal(List coordinates) { List axes = getAxes(); if (coordinates.size() != axes.size()) { throw new IllegalArgumentException( "Coordinates have different dimension " + coordinates.size() + " than axes " + axes.size()); } int modulo = 1; int ordinal = 0; int k = 0; for (CellSetAxis axis : axes) { final Integer coordinate = coordinates.get(k++); if (coordinate < 0 || coordinate >= axis.getPositionCount()) { throw new IndexOutOfBoundsException( "Coordinate " + coordinate + " of axis " + k + " is out of range (" + getBoundsAsString() + ")"); } ordinal += coordinate * modulo; modulo *= axis.getPositionCount(); } return ordinal; } public boolean next() throws SQLException { throw new UnsupportedOperationException(); } public void close() { if (closed) { return; } this.closed = true; final ProfileHandler profileHandler = olap4jStatement.getProfileHandler(); if (profileHandler != null) { final StringWriter stringWriter = new StringWriter(); final PrintWriter printWriter = new PrintWriter(stringWriter); olap4jStatement.getQuery().explain(printWriter); printWriter.close(); profileHandler.explain(stringWriter.toString(), getQueryTiming()); } if (this.result != null) { this.result.close(); } olap4jStatement.onResultSetClose(this); } public boolean wasNull() throws SQLException { throw new UnsupportedOperationException(); } public String getString(int columnIndex) throws SQLException { throw new UnsupportedOperationException(); } public boolean getBoolean(int columnIndex) throws SQLException { throw new UnsupportedOperationException(); } public byte getByte(int columnIndex) throws SQLException { throw new UnsupportedOperationException(); } public short getShort(int columnIndex) throws SQLException { throw new UnsupportedOperationException(); } public int getInt(int columnIndex) throws SQLException { throw new UnsupportedOperationException(); } public long getLong(int columnIndex) throws SQLException { throw new UnsupportedOperationException(); } public float getFloat(int columnIndex) throws SQLException { throw new UnsupportedOperationException(); } public double getDouble(int columnIndex) throws SQLException { throw new UnsupportedOperationException(); } public BigDecimal getBigDecimal( int columnIndex, int scale) throws SQLException { throw new UnsupportedOperationException(); } public byte[] getBytes(int columnIndex) throws SQLException { throw new UnsupportedOperationException(); } public Date getDate(int columnIndex) throws SQLException { throw new UnsupportedOperationException(); } public Time getTime(int columnIndex) throws SQLException { throw new UnsupportedOperationException(); } public Timestamp getTimestamp(int columnIndex) throws SQLException { throw new UnsupportedOperationException(); } public InputStream getAsciiStream(int columnIndex) throws SQLException { throw new UnsupportedOperationException(); } public InputStream getUnicodeStream(int columnIndex) throws SQLException { throw new UnsupportedOperationException(); } public InputStream getBinaryStream(int columnIndex) throws SQLException { throw new UnsupportedOperationException(); } public String getString(String columnLabel) throws SQLException { throw new UnsupportedOperationException(); } public boolean getBoolean(String columnLabel) throws SQLException { throw new UnsupportedOperationException(); } public byte getByte(String columnLabel) throws SQLException { throw new UnsupportedOperationException(); } public short getShort(String columnLabel) throws SQLException { throw new UnsupportedOperationException(); } public int getInt(String columnLabel) throws SQLException { throw new UnsupportedOperationException(); } public long getLong(String columnLabel) throws SQLException { throw new UnsupportedOperationException(); } public float getFloat(String columnLabel) throws SQLException { throw new UnsupportedOperationException(); } public double getDouble(String columnLabel) throws SQLException { throw new UnsupportedOperationException(); } public BigDecimal getBigDecimal( String columnLabel, int scale) throws SQLException { throw new UnsupportedOperationException(); } public byte[] getBytes(String columnLabel) throws SQLException { throw new UnsupportedOperationException(); } public Date getDate(String columnLabel) throws SQLException { throw new UnsupportedOperationException(); } public Time getTime(String columnLabel) throws SQLException { throw new UnsupportedOperationException(); } public Timestamp getTimestamp(String columnLabel) throws SQLException { throw new UnsupportedOperationException(); } public InputStream getAsciiStream(String columnLabel) throws SQLException { throw new UnsupportedOperationException(); } public InputStream getUnicodeStream( String columnLabel) throws SQLException { throw new UnsupportedOperationException(); } public InputStream getBinaryStream(String columnLabel) throws SQLException { throw new UnsupportedOperationException(); } public SQLWarning getWarnings() throws SQLException { throw new UnsupportedOperationException(); } public void clearWarnings() throws SQLException { throw new UnsupportedOperationException(); } public String getCursorName() throws SQLException { throw new UnsupportedOperationException(); } public Object getObject(int columnIndex) throws SQLException { throw new UnsupportedOperationException(); } public Object getObject(String columnLabel) throws SQLException { throw new UnsupportedOperationException(); } public int findColumn(String columnLabel) throws SQLException { throw new UnsupportedOperationException(); } public Reader getCharacterStream(int columnIndex) throws SQLException { throw new UnsupportedOperationException(); } public Reader getCharacterStream(String columnLabel) throws SQLException { throw new UnsupportedOperationException(); } public BigDecimal getBigDecimal(int columnIndex) throws SQLException { throw new UnsupportedOperationException(); } public BigDecimal getBigDecimal(String columnLabel) throws SQLException { throw new UnsupportedOperationException(); } public boolean isBeforeFirst() throws SQLException { throw new UnsupportedOperationException(); } public boolean isAfterLast() throws SQLException { throw new UnsupportedOperationException(); } public boolean isFirst() throws SQLException { throw new UnsupportedOperationException(); } public boolean isLast() throws SQLException { throw new UnsupportedOperationException(); } public void beforeFirst() throws SQLException { throw new UnsupportedOperationException(); } public void afterLast() throws SQLException { throw new UnsupportedOperationException(); } public boolean first() throws SQLException { throw new UnsupportedOperationException(); } public boolean last() throws SQLException { throw new UnsupportedOperationException(); } public int getRow() throws SQLException { throw new UnsupportedOperationException(); } public boolean absolute(int row) throws SQLException { throw new UnsupportedOperationException(); } public boolean relative(int rows) throws SQLException { throw new UnsupportedOperationException(); } public boolean previous() throws SQLException { throw new UnsupportedOperationException(); } public void setFetchDirection(int direction) throws SQLException { throw new UnsupportedOperationException(); } public int getFetchDirection() throws SQLException { throw new UnsupportedOperationException(); } public void setFetchSize(int rows) throws SQLException { throw new UnsupportedOperationException(); } public int getFetchSize() throws SQLException { throw new UnsupportedOperationException(); } public int getType() throws SQLException { throw new UnsupportedOperationException(); } public int getConcurrency() throws SQLException { throw new UnsupportedOperationException(); } public boolean rowUpdated() throws SQLException { throw new UnsupportedOperationException(); } public boolean rowInserted() throws SQLException { throw new UnsupportedOperationException(); } public boolean rowDeleted() throws SQLException { throw new UnsupportedOperationException(); } public void updateNull(int columnIndex) throws SQLException { throw new UnsupportedOperationException(); } public void updateBoolean(int columnIndex, boolean x) throws SQLException { throw new UnsupportedOperationException(); } public void updateByte(int columnIndex, byte x) throws SQLException { throw new UnsupportedOperationException(); } public void updateShort(int columnIndex, short x) throws SQLException { throw new UnsupportedOperationException(); } public void updateInt(int columnIndex, int x) throws SQLException { throw new UnsupportedOperationException(); } public void updateLong(int columnIndex, long x) throws SQLException { throw new UnsupportedOperationException(); } public void updateFloat(int columnIndex, float x) throws SQLException { throw new UnsupportedOperationException(); } public void updateDouble(int columnIndex, double x) throws SQLException { throw new UnsupportedOperationException(); } public void updateBigDecimal( int columnIndex, BigDecimal x) throws SQLException { throw new UnsupportedOperationException(); } public void updateString(int columnIndex, String x) throws SQLException { throw new UnsupportedOperationException(); } public void updateBytes(int columnIndex, byte x[]) throws SQLException { throw new UnsupportedOperationException(); } public void updateDate(int columnIndex, Date x) throws SQLException { throw new UnsupportedOperationException(); } public void updateTime(int columnIndex, Time x) throws SQLException { throw new UnsupportedOperationException(); } public void updateTimestamp( int columnIndex, Timestamp x) throws SQLException { throw new UnsupportedOperationException(); } public void updateAsciiStream( int columnIndex, InputStream x, int length) throws SQLException { throw new UnsupportedOperationException(); } public void updateBinaryStream( int columnIndex, InputStream x, int length) throws SQLException { throw new UnsupportedOperationException(); } public void updateCharacterStream( int columnIndex, Reader x, int length) throws SQLException { throw new UnsupportedOperationException(); } public void updateObject( int columnIndex, Object x, int scaleOrLength) throws SQLException { throw new UnsupportedOperationException(); } public void updateObject(int columnIndex, Object x) throws SQLException { throw new UnsupportedOperationException(); } public void updateNull(String columnLabel) throws SQLException { throw new UnsupportedOperationException(); } public void updateBoolean( String columnLabel, boolean x) throws SQLException { throw new UnsupportedOperationException(); } public void updateByte(String columnLabel, byte x) throws SQLException { throw new UnsupportedOperationException(); } public void updateShort(String columnLabel, short x) throws SQLException { throw new UnsupportedOperationException(); } public void updateInt(String columnLabel, int x) throws SQLException { throw new UnsupportedOperationException(); } public void updateLong(String columnLabel, long x) throws SQLException { throw new UnsupportedOperationException(); } public void updateFloat(String columnLabel, float x) throws SQLException { throw new UnsupportedOperationException(); } public void updateDouble(String columnLabel, double x) throws SQLException { throw new UnsupportedOperationException(); } public void updateBigDecimal( String columnLabel, BigDecimal x) throws SQLException { throw new UnsupportedOperationException(); } public void updateString(String columnLabel, String x) throws SQLException { throw new UnsupportedOperationException(); } public void updateBytes(String columnLabel, byte x[]) throws SQLException { throw new UnsupportedOperationException(); } public void updateDate(String columnLabel, Date x) throws SQLException { throw new UnsupportedOperationException(); } public void updateTime(String columnLabel, Time x) throws SQLException { throw new UnsupportedOperationException(); } public void updateTimestamp( String columnLabel, Timestamp x) throws SQLException { throw new UnsupportedOperationException(); } public void updateAsciiStream( String columnLabel, InputStream x, int length) throws SQLException { throw new UnsupportedOperationException(); } public void updateBinaryStream( String columnLabel, InputStream x, int length) throws SQLException { throw new UnsupportedOperationException(); } public void updateCharacterStream( String columnLabel, Reader reader, int length) throws SQLException { throw new UnsupportedOperationException(); } public void updateObject( String columnLabel, Object x, int scaleOrLength) throws SQLException { throw new UnsupportedOperationException(); } public void updateObject(String columnLabel, Object x) throws SQLException { throw new UnsupportedOperationException(); } public void insertRow() throws SQLException { throw new UnsupportedOperationException(); } public void updateRow() throws SQLException { throw new UnsupportedOperationException(); } public void deleteRow() throws SQLException { throw new UnsupportedOperationException(); } public void refreshRow() throws SQLException { throw new UnsupportedOperationException(); } public void cancelRowUpdates() throws SQLException { throw new UnsupportedOperationException(); } public void moveToInsertRow() throws SQLException { throw new UnsupportedOperationException(); } public void moveToCurrentRow() throws SQLException { throw new UnsupportedOperationException(); } public OlapStatement getStatement() { return olap4jStatement; } public Object getObject( int columnIndex, Map> map) throws SQLException { throw new UnsupportedOperationException(); } public Ref getRef(int columnIndex) throws SQLException { throw new UnsupportedOperationException(); } public Blob getBlob(int columnIndex) throws SQLException { throw new UnsupportedOperationException(); } public Clob getClob(int columnIndex) throws SQLException { throw new UnsupportedOperationException(); } public Array getArray(int columnIndex) throws SQLException { throw new UnsupportedOperationException(); } public Object getObject( String columnLabel, Map> map) throws SQLException { throw new UnsupportedOperationException(); } public Ref getRef(String columnLabel) throws SQLException { throw new UnsupportedOperationException(); } public Blob getBlob(String columnLabel) throws SQLException { throw new UnsupportedOperationException(); } public Clob getClob(String columnLabel) throws SQLException { throw new UnsupportedOperationException(); } public Array getArray(String columnLabel) throws SQLException { throw new UnsupportedOperationException(); } public Date getDate(int columnIndex, Calendar cal) throws SQLException { throw new UnsupportedOperationException(); } public Date getDate(String columnLabel, Calendar cal) throws SQLException { throw new UnsupportedOperationException(); } public Time getTime(int columnIndex, Calendar cal) throws SQLException { throw new UnsupportedOperationException(); } public Time getTime(String columnLabel, Calendar cal) throws SQLException { throw new UnsupportedOperationException(); } public Timestamp getTimestamp( int columnIndex, Calendar cal) throws SQLException { throw new UnsupportedOperationException(); } public Timestamp getTimestamp( String columnLabel, Calendar cal) throws SQLException { throw new UnsupportedOperationException(); } public URL getURL(int columnIndex) throws SQLException { throw new UnsupportedOperationException(); } public URL getURL(String columnLabel) throws SQLException { throw new UnsupportedOperationException(); } public void updateRef(int columnIndex, Ref x) throws SQLException { throw new UnsupportedOperationException(); } public void updateRef(String columnLabel, Ref x) throws SQLException { throw new UnsupportedOperationException(); } public void updateBlob(int columnIndex, Blob x) throws SQLException { throw new UnsupportedOperationException(); } public void updateBlob(String columnLabel, Blob x) throws SQLException { throw new UnsupportedOperationException(); } public void updateClob(int columnIndex, Clob x) throws SQLException { throw new UnsupportedOperationException(); } public void updateClob(String columnLabel, Clob x) throws SQLException { throw new UnsupportedOperationException(); } public void updateArray(int columnIndex, Array x) throws SQLException { throw new UnsupportedOperationException(); } public void updateArray(String columnLabel, Array x) throws SQLException { throw new UnsupportedOperationException(); } // implement Wrapper public T unwrap(Class iface) throws SQLException { throw new UnsupportedOperationException(); } public boolean isWrapperFor(Class iface) throws SQLException { throw new UnsupportedOperationException(); } } // End MondrianOlap4jCellSet.java mondrian-3.11.0.1-R/src/main/mondrian/olap4j/MondrianOlap4jCellSetAxis.java000066400000000000000000000070561261646570300262630ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.olap4j; import mondrian.calc.TupleList; import mondrian.olap.AxisOrdinal; import mondrian.rolap.RolapAxis; import org.olap4j.*; import org.olap4j.metadata.Member; import java.util.*; /** * Implementation of {@link org.olap4j.CellSetAxis} * for the Mondrian OLAP engine. * * @author jhyde * @since May 24, 2007 */ class MondrianOlap4jCellSetAxis implements CellSetAxis { private final MondrianOlap4jCellSet olap4jCellSet; private final mondrian.olap.QueryAxis queryAxis; private final RolapAxis axis; /** * Creates a MondrianOlap4jCellSetAxis. * * @param olap4jCellSet Cell set * @param queryAxis Query axis * @param axis Axis */ MondrianOlap4jCellSetAxis( MondrianOlap4jCellSet olap4jCellSet, mondrian.olap.QueryAxis queryAxis, RolapAxis axis) { assert olap4jCellSet != null; assert queryAxis != null; assert axis != null; this.olap4jCellSet = olap4jCellSet; this.queryAxis = queryAxis; this.axis = axis; } public Axis getAxisOrdinal() { return Axis.Factory.forOrdinal( queryAxis.getAxisOrdinal().logicalOrdinal()); } public CellSet getCellSet() { return olap4jCellSet; } public CellSetAxisMetaData getAxisMetaData() { final AxisOrdinal axisOrdinal = queryAxis.getAxisOrdinal(); if (axisOrdinal.isFilter()) { return olap4jCellSet.getMetaData().getFilterAxisMetaData(); } else { return olap4jCellSet.getMetaData().getAxesMetaData().get( axisOrdinal.logicalOrdinal()); } } public List getPositions() { return new AbstractList() { public Position get(final int index) { return new MondrianOlap4jPosition(axis.getTupleList(), index); } public int size() { return axis.getTupleList().size(); } }; } public int getPositionCount() { return getPositions().size(); } public ListIterator iterator() { return getPositions().listIterator(); } private class MondrianOlap4jPosition implements Position { private final TupleList tupleList; private final int index; /** * Creates a MondrianOlap4jPosition. * * @param tupleList Tuple list * @param index Index of tuple */ public MondrianOlap4jPosition( TupleList tupleList, int index) { this.tupleList = tupleList; this.index = index; } public List getMembers() { return new AbstractList() { public Member get(int slice) { final mondrian.olap.Member mondrianMember = tupleList.get(slice, index); return olap4jCellSet.olap4jStatement.olap4jConnection .toOlap4j(mondrianMember); } public int size() { return tupleList.getArity(); } }; } public int getOrdinal() { return index; } } } // End MondrianOlap4jCellSetAxis.java mondrian-3.11.0.1-R/src/main/mondrian/olap4j/MondrianOlap4jCellSetAxisMetaData.java000066400000000000000000000073071261646570300276630ustar00rootroot00000000000000/* // This software is subject to the terms of the Eclipse Public License v1.0 // Agreement, available at the following URL: // http://www.eclipse.org/legal/epl-v10.html. // You must accept the terms of that agreement to use this software. // // Copyright (C) 2003-2005 Julian Hyde // Copyright (C) 2005-2015 Pentaho // All Rights Reserved. */ package mondrian.olap4j; import mondrian.mdx.LevelExpr; import mondrian.mdx.UnresolvedFunCall; import mondrian.olap.*; import mondrian.olap.type.TypeUtil; import org.olap4j.Axis; import org.olap4j.CellSetAxisMetaData; import org.olap4j.metadata.Hierarchy; import org.olap4j.metadata.Property; import java.util.*; /** * Implementation of {@link org.olap4j.CellSetMetaData} * for the Mondrian OLAP engine. * * @author jhyde @since Nov 17, 2007 */ class MondrianOlap4jCellSetAxisMetaData implements CellSetAxisMetaData { private final QueryAxis queryAxis; private final MondrianOlap4jCellSetMetaData cellSetMetaData; private final List propertyList = new ArrayList(); /** * Creates a MondrianOlap4jCellSetAxisMetaData. * * @param cellSetMetaData Cell set axis metadata * @param queryAxis Query axis */ MondrianOlap4jCellSetAxisMetaData( MondrianOlap4jCellSetMetaData cellSetMetaData, QueryAxis queryAxis) { if (queryAxis == null) { queryAxis = new QueryAxis( false, null, AxisOrdinal.StandardAxisOrdinal.SLICER, QueryAxis.SubtotalVisibility.Undefined); } this.queryAxis = queryAxis; this.cellSetMetaData = cellSetMetaData; // populate property list for (Id id : queryAxis.getDimensionProperties()) { final String[] names = id.toStringArray(); Property olap4jProperty = null; if (names.length == 1) { olap4jProperty = Util.lookup( Property.StandardMemberProperty.class, names[0]); if (olap4jProperty == null) { olap4jProperty = MondrianOlap4jProperty.MEMBER_EXTENSIONS.get(names[0]); } } if (olap4jProperty == null) { final UnresolvedFunCall call = (UnresolvedFunCall) Util.lookup( cellSetMetaData.query, id.getSegments(), true); Level level = ((LevelExpr) call.getArg(0)).getLevel(); olap4jProperty = new MondrianOlap4jProperty( Util.lookupProperty(level, call.getFunName()), level); } propertyList.add(olap4jProperty); } } public Axis getAxisOrdinal() { return Axis.Factory.forOrdinal( queryAxis.getAxisOrdinal().logicalOrdinal()); } public List getHierarchies() { return getHierarchiesNonFilter(); } /** * Returns the hierarchies on a non-filter axis. * * @return List of hierarchies, never null */ private List getHierarchiesNonFilter() { final Exp exp = queryAxis.getSet(); if (exp == null) { return Collections.emptyList(); } List hierarchyList = new ArrayList(); for (mondrian.olap.Hierarchy hierarchy : TypeUtil.getHierarchies(exp.getType())) { hierarchyList.add( cellSetMetaData.olap4jStatement.olap4jConnection.toOlap4j( hierarchy)); } return hierarchyList; } public List getProperties() { return propertyList; } } // End MondrianOlap4jCellSetAxisMetaData.java mondrian-3.11.0.1-R/src/main/mondrian/olap4j/MondrianOlap4jCellSetMetaData.java000066400000000000000000000135221261646570300270320ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.olap4j; import mondrian.olap.*; import org.olap4j.CellSetAxisMetaData; import org.olap4j.CellSetMetaData; import org.olap4j.impl.ArrayNamedListImpl; import org.olap4j.metadata.*; import org.olap4j.metadata.Cube; import org.olap4j.metadata.Property; import java.sql.SQLException; /** * Implementation of {@link org.olap4j.CellSetMetaData} * for the Mondrian OLAP engine. * * @author jhyde * @since Jun 13, 2007 */ class MondrianOlap4jCellSetMetaData implements CellSetMetaData { final MondrianOlap4jStatement olap4jStatement; final Query query; private final NamedList axesMetaData = new ArrayNamedListImpl() { public String getName(Object axisMetaData) { return ((CellSetAxisMetaData)axisMetaData) .getAxisOrdinal().name(); } }; private final MondrianOlap4jCellSetAxisMetaData filterAxisMetaData; MondrianOlap4jCellSetMetaData( MondrianOlap4jStatement olap4jStatement, Query query) { this.olap4jStatement = olap4jStatement; this.query = query; for (final QueryAxis queryAxis : query.getAxes()) { axesMetaData.add( new MondrianOlap4jCellSetAxisMetaData( this, queryAxis)); } filterAxisMetaData = new MondrianOlap4jCellSetAxisMetaData( this, query.getSlicerAxis()); } // implement CellSetMetaData public NamedList getCellProperties() { final ArrayNamedListImpl list = new ArrayNamedListImpl() { public String getName(Object property) { return ((Property)property).getName(); } }; for (Property property : Property.StandardCellProperty.values()) { if (query.hasCellProperty(property.getName())) { list.add(property); } } for (Property property : MondrianOlap4jProperty.CELL_EXTENSIONS.values()) { if (query.hasCellProperty(property.getName())) { list.add(property); } } return list; } public Cube getCube() { return olap4jStatement.olap4jConnection.toOlap4j(query.getCube()); } public NamedList getAxesMetaData() { return axesMetaData; } public CellSetAxisMetaData getFilterAxisMetaData() { return filterAxisMetaData; } // implement ResultSetMetaData public int getColumnCount() throws SQLException { throw new UnsupportedOperationException(); } public boolean isAutoIncrement(int column) throws SQLException { throw new UnsupportedOperationException(); } public boolean isCaseSensitive(int column) throws SQLException { throw new UnsupportedOperationException(); } public boolean isSearchable(int column) throws SQLException { throw new UnsupportedOperationException(); } public boolean isCurrency(int column) throws SQLException { throw new UnsupportedOperationException(); } public int isNullable(int column) throws SQLException { throw new UnsupportedOperationException(); } public boolean isSigned(int column) throws SQLException { throw new UnsupportedOperationException(); } public int getColumnDisplaySize(int column) throws SQLException { throw new UnsupportedOperationException(); } public String getColumnLabel(int column) throws SQLException { throw new UnsupportedOperationException(); } public String getColumnName(int column) throws SQLException { throw new UnsupportedOperationException(); } public String getSchemaName(int column) throws SQLException { throw new UnsupportedOperationException(); } public int getPrecision(int column) throws SQLException { throw new UnsupportedOperationException(); } public int getScale(int column) throws SQLException { throw new UnsupportedOperationException(); } public String getTableName(int column) throws SQLException { throw new UnsupportedOperationException(); } public String getCatalogName(int column) throws SQLException { throw new UnsupportedOperationException(); } public int getColumnType(int column) throws SQLException { throw new UnsupportedOperationException(); } public String getColumnTypeName(int column) throws SQLException { throw new UnsupportedOperationException(); } public boolean isReadOnly(int column) throws SQLException { throw new UnsupportedOperationException(); } public boolean isWritable(int column) throws SQLException { throw new UnsupportedOperationException(); } public boolean isDefinitelyWritable(int column) throws SQLException { throw new UnsupportedOperationException(); } public String getColumnClassName(int column) throws SQLException { throw new UnsupportedOperationException(); } // implement Wrapper public T unwrap(Class iface) throws SQLException { if (iface.isInstance(this)) { return iface.cast(this); } throw this.olap4jStatement.olap4jConnection.helper.createException( "does not implement '" + iface + "'"); } public boolean isWrapperFor(Class iface) throws SQLException { return iface.isInstance(this); } } // End MondrianOlap4jCellSetMetaData.java mondrian-3.11.0.1-R/src/main/mondrian/olap4j/MondrianOlap4jConnection.java000066400000000000000000001144171261646570300262020ustar00rootroot00000000000000/* // This software is subject to the terms of the Eclipse Public License v1.0 // Agreement, available at the following URL: // http://www.eclipse.org/legal/epl-v10.html. // You must accept the terms of that agreement to use this software. // // Copyright (C) 2002-2014 Pentaho and others // All Rights Reserved. */ package mondrian.olap4j; import mondrian.mdx.*; import mondrian.olap.*; import mondrian.olap.Member; import mondrian.olap.fun.MondrianEvaluationException; import mondrian.rolap.*; import mondrian.util.Bug; import mondrian.xmla.XmlaHandler; import org.apache.log4j.Logger; import org.olap4j.Axis; import org.olap4j.Cell; import org.olap4j.*; import org.olap4j.impl.*; import org.olap4j.mdx.*; import org.olap4j.mdx.parser.*; import org.olap4j.mdx.parser.impl.DefaultMdxParserImpl; import org.olap4j.metadata.*; import org.olap4j.metadata.Database.AuthenticationMode; import org.olap4j.metadata.Database.ProviderType; import org.olap4j.metadata.Schema; import org.olap4j.type.*; import org.olap4j.type.DimensionType; import java.io.PrintWriter; import java.io.StringWriter; import java.math.BigDecimal; import java.math.BigInteger; import java.sql.*; import java.util.*; import java.util.concurrent.atomic.AtomicBoolean; /** * Implementation of {@link org.olap4j.OlapConnection} * for the Mondrian OLAP engine. * *

This class has sub-classes which implement JDBC 3.0 and JDBC 4.0 APIs; * it is instantiated using * {@link Factory#newConnection(MondrianOlap4jDriver, String, java.util.Properties)}.

* *

This class is public, to allow access to the * {@link #setRoleNames(java.util.List)} method before it is added to olap4j * version 2.0. This may change without notice. Code should not rely on * this class being public.

* * @author jhyde * @since May 23, 2007 */ public abstract class MondrianOlap4jConnection implements OlapConnection { static { Bug.olap4jUpgrade( "Make this class package-protected when we upgrade to olap4j 2.0. " + "The setRoleNames method will then be available through the " + "olap4j API"); } private static final Logger LOGGER = Logger.getLogger(MondrianOlap4jConnection.class); /** * Handler for errors. */ final Helper helper = new Helper(); /** * Underlying mondrian connection. Set on creation, cleared on close. * Developers, please keep this member private. Access it via * {@link #getMondrianConnection()} or {@link #getMondrianConnection2()}, * and these will throw if the connection has been closed. */ private RolapConnection mondrianConnection; private final AtomicBoolean isClosed = new AtomicBoolean(false); /** * Map from mondrian schema objects to olap4j schemas. * *

REVIEW: This assumes that a RolapSchema occurs at most once in a * catalog. It is possible for a schema to be mapped more than once, with * different names; the same RolapSchema object will be used. */ final Map schemaMap = new HashMap(); private final MondrianOlap4jDatabaseMetaData olap4jDatabaseMetaData; private static final String CONNECT_STRING_PREFIX = "jdbc:mondrian:"; private static final String ENGINE_CONNECT_STRING_PREFIX = "jdbc:mondrian:engine:"; final Factory factory; final MondrianOlap4jDriver driver; private String roleName; /** List of role names. Empty if role is the 'all' role. Value must always * be an unmodifiable list, because {@link #getRoleNames()} returns the * value directly. */ private List roleNames = Collections.emptyList(); private boolean autoCommit; private boolean readOnly; boolean preferList; final MondrianServer mondrianServer; private final MondrianOlap4jSchema olap4jSchema; private final NamedList olap4jDatabases; /** * Creates an Olap4j connection to Mondrian. * *

This method is intentionally package-protected. The public API * uses the traditional JDBC {@link java.sql.DriverManager}. * See {@link mondrian.olap4j.MondrianOlap4jDriver} for more details. * * @param factory Factory * @param driver Driver * @param url Connect-string URL * @param info Additional properties * @throws SQLException if there is an error */ MondrianOlap4jConnection( Factory factory, MondrianOlap4jDriver driver, String url, Properties info) throws SQLException { // Required for the logic below to work. assert ENGINE_CONNECT_STRING_PREFIX.startsWith(CONNECT_STRING_PREFIX); this.factory = factory; this.driver = driver; String x; if (url.startsWith(ENGINE_CONNECT_STRING_PREFIX)) { x = url.substring(ENGINE_CONNECT_STRING_PREFIX.length()); } else if (url.startsWith(CONNECT_STRING_PREFIX)) { x = url.substring(CONNECT_STRING_PREFIX.length()); } else { // This is not a URL we can handle. // DriverManager should not have invoked us. throw new AssertionError( "does not start with '" + CONNECT_STRING_PREFIX + "'"); } Util.PropertyList list = Util.parseConnectString(x); final Map map = Util.toMap(info); for (Map.Entry entry : map.entrySet()) { list.put(entry.getKey(), entry.getValue()); } this.mondrianConnection = (RolapConnection) mondrian.olap.DriverManager .getConnection(list, null); this.olap4jDatabaseMetaData = factory.newDatabaseMetaData(this, mondrianConnection); this.mondrianServer = MondrianServer.forConnection(mondrianConnection); final CatalogFinder catalogFinder = (CatalogFinder) mondrianServer; NamedList olap4jCatalogs = new NamedListImpl(); this.olap4jDatabases = new NamedListImpl(); List> dbpropsMaps = mondrianServer.getDatabases(mondrianConnection); if (dbpropsMaps.size() != 1) { throw new AssertionError(); } Map dbpropsMap = dbpropsMaps.get(0); StringTokenizer st = new StringTokenizer( String.valueOf(dbpropsMap.get("ProviderType")), ","); List pTypes = new ArrayList(); while (st.hasMoreTokens()) { pTypes.add(ProviderType.valueOf(st.nextToken())); } st = new StringTokenizer( String.valueOf(dbpropsMap.get("AuthenticationMode")), ","); List aModes = new ArrayList(); while (st.hasMoreTokens()) { aModes.add(AuthenticationMode.valueOf(st.nextToken())); } final MondrianOlap4jDatabase database = new MondrianOlap4jDatabase( this, olap4jCatalogs, String.valueOf(dbpropsMap.get("DataSourceName")), String.valueOf(dbpropsMap.get("DataSourceDescription")), String.valueOf(dbpropsMap.get("ProviderName")), String.valueOf(dbpropsMap.get("URL")), String.valueOf(dbpropsMap.get("DataSourceInfo")), pTypes, aModes); this.olap4jDatabases.add(database); for (String catalogName : catalogFinder.getCatalogNames(mondrianConnection)) { final Map schemaMap; try { schemaMap = catalogFinder.getRolapSchemas( mondrianConnection, catalogName); } catch (Exception e) { LOGGER.warn( "Can't get Rolap Schemas for catalog:" + catalogName + ". Skipping...", e); continue; } olap4jCatalogs.add( new MondrianOlap4jCatalog( olap4jDatabaseMetaData, catalogName, database, schemaMap)); } this.olap4jSchema = toOlap4j(mondrianConnection.getSchema()); } static boolean acceptsURL(String url) { return url.startsWith(CONNECT_STRING_PREFIX); } public OlapStatement createStatement() { final MondrianOlap4jStatement statement = factory.newStatement(this); mondrianServer.addStatement(statement); return statement; } public ScenarioImpl createScenario() throws OlapException { return getMondrianConnection().createScenario(); } public void setScenario(Scenario scenario) throws OlapException { getMondrianConnection().setScenario(scenario); } public Scenario getScenario() throws OlapException { return getMondrianConnection().getScenario(); } public PreparedStatement prepareStatement(String sql) throws SQLException { throw new UnsupportedOperationException(); } public CallableStatement prepareCall(String sql) throws SQLException { throw new UnsupportedOperationException(); } public String nativeSQL(String sql) throws SQLException { throw new UnsupportedOperationException(); } public void setAutoCommit(boolean autoCommit) throws SQLException { this.autoCommit = autoCommit; } public boolean getAutoCommit() throws SQLException { return autoCommit; } public void commit() throws SQLException { throw new UnsupportedOperationException(); } public void rollback() throws SQLException { throw new UnsupportedOperationException(); } public void close() throws SQLException { if (isClosed.get() == false) { mondrianConnection.close(); isClosed.set(true); } } public boolean isClosed() throws SQLException { return isClosed.get(); } public OlapDatabaseMetaData getMetaData() { return olap4jDatabaseMetaData; } public void setReadOnly(boolean readOnly) throws SQLException { this.readOnly = readOnly; } public boolean isReadOnly() throws SQLException { return readOnly; } public void setSchema(String schemaName) throws OlapException { // no op. } public String getSchema() throws OlapException { return olap4jSchema.getName(); } public Schema getOlapSchema() throws OlapException { return olap4jSchema; } public NamedList getOlapSchemas() throws OlapException { return getOlapCatalog().getSchemas(); } public void setCatalog(String catalogName) throws OlapException { // no op } public String getCatalog() throws OlapException { return olap4jSchema.olap4jCatalog.getName(); } public Catalog getOlapCatalog() throws OlapException { return olap4jSchema.olap4jCatalog; } public NamedList getOlapCatalogs() throws OlapException { return getOlapDatabase().getCatalogs(); } public void setDatabase(String databaseName) throws OlapException { // no op. } public String getDatabase() throws OlapException { return getOlapDatabase().getName(); } public Database getOlapDatabase() throws OlapException { // It is assumed that Mondrian supports only a single // database. return this.olap4jDatabases.get(0); } public NamedList getOlapDatabases() throws OlapException { return Olap4jUtil.cast(this.olap4jDatabases); } public void setTransactionIsolation(int level) throws SQLException { throw new UnsupportedOperationException(); } public int getTransactionIsolation() throws SQLException { return TRANSACTION_NONE; } public SQLWarning getWarnings() throws SQLException { throw new UnsupportedOperationException(); } public void clearWarnings() throws SQLException { } public Statement createStatement( int resultSetType, int resultSetConcurrency) throws SQLException { throw new UnsupportedOperationException(); } public PreparedStatement prepareStatement( String sql, int resultSetType, int resultSetConcurrency) throws SQLException { throw new UnsupportedOperationException(); } public CallableStatement prepareCall( String sql, int resultSetType, int resultSetConcurrency) throws SQLException { throw new UnsupportedOperationException(); } public Map> getTypeMap() throws SQLException { throw new UnsupportedOperationException(); } public void setTypeMap(Map> map) throws SQLException { throw new UnsupportedOperationException(); } public void setHoldability(int holdability) throws SQLException { throw new UnsupportedOperationException(); } public int getHoldability() throws SQLException { throw new UnsupportedOperationException(); } public Savepoint setSavepoint() throws SQLException { throw new UnsupportedOperationException(); } public Savepoint setSavepoint(String name) throws SQLException { throw new UnsupportedOperationException(); } public void rollback(Savepoint savepoint) throws SQLException { throw new UnsupportedOperationException(); } public void releaseSavepoint(Savepoint savepoint) throws SQLException { throw new UnsupportedOperationException(); } public Statement createStatement( int resultSetType, int resultSetConcurrency, int resultSetHoldability) throws SQLException { throw new UnsupportedOperationException(); } public PreparedStatement prepareStatement( String sql, int resultSetType, int resultSetConcurrency, int resultSetHoldability) throws SQLException { throw new UnsupportedOperationException(); } public CallableStatement prepareCall( String sql, int resultSetType, int resultSetConcurrency, int resultSetHoldability) throws SQLException { throw new UnsupportedOperationException(); } public PreparedStatement prepareStatement( String sql, int autoGeneratedKeys) throws SQLException { throw new UnsupportedOperationException(); } public PreparedStatement prepareStatement( String sql, int columnIndexes[]) throws SQLException { throw new UnsupportedOperationException(); } public PreparedStatement prepareStatement( String sql, String columnNames[]) throws SQLException { throw new UnsupportedOperationException(); } // implement Wrapper public T unwrap(Class iface) throws SQLException { if (iface.isInstance(this)) { return iface.cast(this); } else if (iface.isInstance(mondrianConnection)) { return iface.cast(mondrianConnection); } if (iface == XmlaHandler.XmlaExtra.class) { return iface.cast(MondrianOlap4jExtra.INSTANCE); } throw helper.createException("does not implement '" + iface + "'"); } public boolean isWrapperFor(Class iface) throws SQLException { return iface.isInstance(this) || iface.isInstance(mondrianConnection); } // implement OlapConnection public PreparedOlapStatement prepareOlapStatement( String mdx) throws OlapException { final MondrianOlap4jPreparedStatement preparedStatement = factory.newPreparedStatement(mdx, this); mondrianServer.addStatement(preparedStatement); return preparedStatement; } public MdxParserFactory getParserFactory() { return new MdxParserFactory() { public MdxParser createMdxParser(OlapConnection connection) { return new DefaultMdxParserImpl(); } public MdxValidator createMdxValidator(OlapConnection connection) { return new MondrianOlap4jMdxValidator(connection); } }; } MondrianOlap4jCube toOlap4j(mondrian.olap.Cube cube) { MondrianOlap4jSchema schema = toOlap4j(cube.getSchema()); return new MondrianOlap4jCube(cube, schema); } MondrianOlap4jDimension toOlap4j(mondrian.olap.Dimension dimension) { if (dimension == null) { return null; } return new MondrianOlap4jDimension( toOlap4j(dimension.getSchema()), dimension); } synchronized MondrianOlap4jSchema toOlap4j( mondrian.olap.Schema schema) { MondrianOlap4jSchema olap4jSchema = schemaMap.get(schema); if (olap4jSchema == null) { throw new RuntimeException("schema not registered: " + schema); } return olap4jSchema; } Type toOlap4j(mondrian.olap.type.Type type) { if (type instanceof mondrian.olap.type.BooleanType) { return new BooleanType(); } else if (type instanceof mondrian.olap.type.CubeType) { final mondrian.olap.Cube mondrianCube = ((mondrian.olap.type.CubeType) type).getCube(); return new CubeType(toOlap4j(mondrianCube)); } else if (type instanceof mondrian.olap.type.DecimalType) { mondrian.olap.type.DecimalType decimalType = (mondrian.olap.type.DecimalType) type; return new DecimalType( decimalType.getPrecision(), decimalType.getScale()); } else if (type instanceof mondrian.olap.type.DimensionType) { mondrian.olap.type.DimensionType dimensionType = (mondrian.olap.type.DimensionType) type; return new DimensionType( toOlap4j(dimensionType.getDimension())); } else if (type instanceof mondrian.olap.type.HierarchyType) { return new BooleanType(); } else if (type instanceof mondrian.olap.type.LevelType) { return new BooleanType(); } else if (type instanceof mondrian.olap.type.MemberType) { final mondrian.olap.type.MemberType memberType = (mondrian.olap.type.MemberType) type; return new MemberType( toOlap4j(memberType.getDimension()), toOlap4j(memberType.getHierarchy()), toOlap4j(memberType.getLevel()), toOlap4j(memberType.getMember())); } else if (type instanceof mondrian.olap.type.NullType) { return new NullType(); } else if (type instanceof mondrian.olap.type.NumericType) { return new NumericType(); } else if (type instanceof mondrian.olap.type.SetType) { final mondrian.olap.type.SetType setType = (mondrian.olap.type.SetType) type; return new SetType(toOlap4j(setType.getElementType())); } else if (type instanceof mondrian.olap.type.StringType) { return new StringType(); } else if (type instanceof mondrian.olap.type.TupleType) { mondrian.olap.type.TupleType tupleType = (mondrian.olap.type.TupleType) type; final Type[] types = toOlap4j(tupleType.elementTypes); return new TupleType(types); } else if (type instanceof mondrian.olap.type.SymbolType) { return new SymbolType(); } else { throw new UnsupportedOperationException(); } } MondrianOlap4jMember toOlap4j(mondrian.olap.Member member) { if (member == null) { return null; } if (member instanceof RolapMeasure) { RolapMeasure measure = (RolapMeasure) member; return new MondrianOlap4jMeasure( toOlap4j(member.getDimension().getSchema()), measure); } return new MondrianOlap4jMember( toOlap4j(member.getDimension().getSchema()), member); } MondrianOlap4jLevel toOlap4j(mondrian.olap.Level level) { if (level == null) { return null; } return new MondrianOlap4jLevel( toOlap4j(level.getDimension().getSchema()), level); } MondrianOlap4jHierarchy toOlap4j(mondrian.olap.Hierarchy hierarchy) { if (hierarchy == null) { return null; } return new MondrianOlap4jHierarchy( toOlap4j(hierarchy.getDimension().getSchema()), hierarchy); } Type[] toOlap4j(mondrian.olap.type.Type[] mondrianTypes) { final Type[] types = new Type[mondrianTypes.length]; for (int i = 0; i < types.length; i++) { types[i] = toOlap4j(mondrianTypes[i]); } return types; } NamedList toOlap4j( final List memberList) { return new AbstractNamedList() { public String getName(Object olap4jMember) { return ((MondrianOlap4jMember)olap4jMember).getName(); } public MondrianOlap4jMember get(int index) { return toOlap4j(memberList.get(index)); } public int size() { return memberList.size(); } }; } MondrianOlap4jNamedSet toOlap4j( mondrian.olap.Cube cube, mondrian.olap.NamedSet namedSet) { if (namedSet == null) { return null; } return new MondrianOlap4jNamedSet( toOlap4j(cube), namedSet); } ParseTreeNode toOlap4j(Exp exp) { return new MondrianToOlap4jNodeConverter(this).toOlap4j(exp); } SelectNode toOlap4j(Query query) { return new MondrianToOlap4jNodeConverter(this).toOlap4j(query); } public void setLocale(Locale locale) { mondrianConnection.setLocale(locale); } public Locale getLocale() { return mondrianConnection.getLocale(); } public void setRoleName(String roleName) throws OlapException { if (roleName == null) { final RolapConnection connection1 = getMondrianConnection(); final Role role = Util.createRootRole(connection1.getSchema()); assert role != null; this.roleName = roleName; this.roleNames = Collections.emptyList(); connection1.setRole(role); } else { setRoleNames(Collections.singletonList(roleName)); } } /** *

Set the active role(s) in this connection based on a list of role * names.

* *

The list may be not be empty. Each role name must be not-null and the * name of a valid role for the current user.

* *

This method is not part of the olap4j-1.x API. It may be included * in olap4j-2.0. If you want to call this method on a * {@link OlapConnection}, use {@link #unwrap} to get the underlying * Mondrian connection.

* * @param roleNames List of role names * * @see #getRoleNames() */ public void setRoleNames(List roleNames) throws OlapException { final RolapConnection connection1 = getMondrianConnection(); final List roleList = new ArrayList(); for (String roleName : roleNames) { if (roleName == null) { throw new NullPointerException("null role name"); } final Role role = connection1.getSchema().lookupRole(roleName); if (role == null) { throw helper.createException("Unknown role '" + roleName + "'"); } roleList.add(role); } // Remember the name of the role, because mondrian roles don't know // their own name. Role role; switch (roleList.size()) { case 0: throw helper.createException("Empty list of role names"); case 1: role = roleList.get(0); this.roleName = roleNames.get(0); this.roleNames = Collections.singletonList(roleName); break; default: role = RoleImpl.union(roleList); this.roleNames = Collections.unmodifiableList(new ArrayList(roleNames)); this.roleName = this.roleNames.toString(); break; } connection1.setRole(role); } public String getRoleName() { return roleName; } /** * Returns a list of the current role names. * *

This method is not part of the olap4j-1.x API. It may be included * in olap4j-2.0. If you want to call this method on a * {@link OlapConnection}, use {@link #unwrap} to get the underlying * Mondrian connection.

* * @return List of the current role names */ public List getRoleNames() { return roleNames; } public List getAvailableRoleNames() throws OlapException { return UnmodifiableArrayList.of( getMondrianConnection().getSchema().roleNames()); } public void setPreferList(boolean preferList) { this.preferList = preferList; } /** * Cop-out version of {@link #getMondrianConnection()} that doesn't throw * a checked exception. For those situations where the olap4j API doesn't * declare 'throws OlapException', but we need an open connection anyway. * Use {@link #getMondrianConnection()} where possible. * * @return Mondrian connection * @throws RuntimeException if connection is closed */ RolapConnection getMondrianConnection2() throws RuntimeException { try { return getMondrianConnection(); } catch (OlapException e) { // Demote from checked to unchecked exception. throw new RuntimeException(e); } } RolapConnection getMondrianConnection() throws OlapException { final RolapConnection connection1 = mondrianConnection; if (connection1 == null) { throw helper.createException("Connection is closed."); } return connection1; } // inner classes /** * Package-private helper class which encapsulates policies which are * common throughout the driver. These policies include exception handling * and factory methods. */ static class Helper { OlapException createException(String msg) { return new OlapException(msg); } /** * Creates an exception in the context of a particular Cell. * * @param context Cell context for exception * @param msg Message * @return New exception */ OlapException createException(Cell context, String msg) { OlapException exception = new OlapException(msg); exception.setContext(context); return exception; } /** * Creates an exception in the context of a particular Cell and with * a given cause. * * @param context Cell context for exception * @param msg Message * @param cause Causing exception * @return New exception */ OlapException createException( Cell context, String msg, Throwable cause) { OlapException exception = createException(msg, cause); exception.setContext(context); return exception; } /** * Creates an exception with a given cause. * * @param msg Message * @param cause Causing exception * @return New exception */ OlapException createException( String msg, Throwable cause) { String sqlState = deduceSqlState(cause); assert !mondrian.util.Bug.olap4jUpgrade( "use OlapException(String, String, Throwable) ctor"); final OlapException e = new OlapException(msg, sqlState); e.initCause(cause); return e; } private String deduceSqlState(Throwable cause) { if (cause == null) { return null; } if (cause instanceof ResourceLimitExceededException) { return "ResourceLimitExceeded"; } if (cause instanceof QueryTimeoutException) { return "QueryTimeout"; } if (cause instanceof MondrianEvaluationException) { return "EvaluationException"; } if (cause instanceof QueryCanceledException) { return "QueryCanceledException"; } return null; } /** * Converts a SQLException to an OlapException. Casts the exception * if it is already an OlapException, wraps otherwise. * *

This method is typically used as an adapter for SQLException * instances coming from a base class, where derived interface declares * that it throws the more specific OlapException. * * @param e Exception * @return Exception as an OlapException */ public OlapException toOlapException(SQLException e) { if (e instanceof OlapException) { return (OlapException) e; } else { return new OlapException(null, e); } } } private static class MondrianOlap4jMdxValidator implements MdxValidator { private final MondrianOlap4jConnection connection; public MondrianOlap4jMdxValidator(OlapConnection connection) { this.connection = (MondrianOlap4jConnection) connection; } public SelectNode validateSelect(SelectNode selectNode) throws OlapException { try { // A lot of mondrian's validation happens during parsing. // Therefore to do effective validation, we need to go back to // the MDX string. Someday we will reshape mondrian's // parse/validation process to fit the olap4j model better. StringWriter sw = new StringWriter(); selectNode.unparse(new ParseTreeWriter(new PrintWriter(sw))); String mdx = sw.toString(); Query query = connection.mondrianConnection .parseQuery(mdx); query.resolve(); return connection.toOlap4j(query); } catch (MondrianException e) { throw connection.helper.createException("Validation error", e); } } } private static class MondrianToOlap4jNodeConverter { private final MondrianOlap4jConnection olap4jConnection; MondrianToOlap4jNodeConverter( MondrianOlap4jConnection olap4jConnection) { this.olap4jConnection = olap4jConnection; } public SelectNode toOlap4j(Query query) { List list = Collections.emptyList(); return new SelectNode( null, toOlap4j(query.getFormulas()), toOlap4j(query.getAxes()), new CubeNode( null, olap4jConnection.toOlap4j(query.getCube())), query.getSlicerAxis() == null ? null : toOlap4j(query.getSlicerAxis()), list); } private AxisNode toOlap4j(QueryAxis axis) { return new AxisNode( null, axis.isNonEmpty(), Axis.Factory.forOrdinal( axis.getAxisOrdinal().logicalOrdinal()), toOlap4j(axis.getDimensionProperties()), toOlap4j(axis.getSet())); } private List toOlap4j(Id[] dimensionProperties) { final List list = new ArrayList(); for (Id property : dimensionProperties) { list.add(toOlap4j(property)); } return list; } private ParseTreeNode toOlap4j(Exp exp) { if (exp instanceof Id) { Id id = (Id) exp; return toOlap4j(id); } if (exp instanceof ResolvedFunCall) { ResolvedFunCall call = (ResolvedFunCall) exp; return toOlap4j(call); } if (exp instanceof DimensionExpr) { DimensionExpr dimensionExpr = (DimensionExpr) exp; return new DimensionNode( null, olap4jConnection.toOlap4j(dimensionExpr.getDimension())); } if (exp instanceof HierarchyExpr) { HierarchyExpr hierarchyExpr = (HierarchyExpr) exp; return new HierarchyNode( null, olap4jConnection.toOlap4j(hierarchyExpr.getHierarchy())); } if (exp instanceof LevelExpr) { LevelExpr levelExpr = (LevelExpr) exp; return new LevelNode( null, olap4jConnection.toOlap4j(levelExpr.getLevel())); } if (exp instanceof MemberExpr) { MemberExpr memberExpr = (MemberExpr) exp; return new MemberNode( null, olap4jConnection.toOlap4j(memberExpr.getMember())); } if (exp instanceof Literal) { Literal literal = (Literal) exp; final Object value = literal.getValue(); if (literal.getCategory() == Category.Symbol) { return LiteralNode.createSymbol( null, (String) literal.getValue()); } else if (value instanceof Number) { Number number = (Number) value; BigDecimal bd = bigDecimalFor(number); return LiteralNode.createNumeric(null, bd, false); } else if (value instanceof String) { return LiteralNode.createString(null, (String) value); } else if (value == null) { return LiteralNode.createNull(null); } else { throw new RuntimeException("unknown literal " + literal); } } throw Util.needToImplement(exp.getClass()); } /** * Converts a number to big decimal, non-lossy if possible. * * @param number Number * @return BigDecimal */ private static BigDecimal bigDecimalFor(Number number) { if (number instanceof BigDecimal) { return (BigDecimal) number; } else if (number instanceof BigInteger) { return new BigDecimal((BigInteger) number); } else if (number instanceof Integer) { return new BigDecimal((Integer) number); } else if (number instanceof Double) { return new BigDecimal((Double) number); } else if (number instanceof Float) { return new BigDecimal((Float) number); } else if (number instanceof Long) { return new BigDecimal((Long) number); } else if (number instanceof Short) { return new BigDecimal((Short) number); } else if (number instanceof Byte) { return new BigDecimal((Byte) number); } else { return new BigDecimal(number.doubleValue()); } } private ParseTreeNode toOlap4j(ResolvedFunCall call) { final CallNode callNode = new CallNode( null, call.getFunName(), toOlap4j(call.getSyntax()), toOlap4j(Arrays.asList(call.getArgs()))); if (call.getType() != null) { callNode.setType(olap4jConnection.toOlap4j(call.getType())); } return callNode; } private List toOlap4j(List exprList) { final List result = new ArrayList(); for (Exp expr : exprList) { result.add(toOlap4j(expr)); } return result; } private org.olap4j.mdx.Syntax toOlap4j(mondrian.olap.Syntax syntax) { return org.olap4j.mdx.Syntax.valueOf(syntax.name()); } private List toOlap4j(QueryAxis[] axes) { final ArrayList axisList = new ArrayList(); for (QueryAxis axis : axes) { axisList.add(toOlap4j(axis)); } return axisList; } private List toOlap4j(Formula[] formulas) { final List list = new ArrayList(); for (Formula formula : formulas) { if (formula.isMember()) { List memberPropertyList = new ArrayList(); for (Object child : formula.getChildren()) { if (child instanceof MemberProperty) { MemberProperty memberProperty = (MemberProperty) child; memberPropertyList.add( new PropertyValueNode( null, memberProperty.getName(), toOlap4j(memberProperty.getExp()))); } } list.add( new WithMemberNode( null, toOlap4j(formula.getIdentifier()), toOlap4j(formula.getExpression()), memberPropertyList)); } } return list; } private static IdentifierNode toOlap4j(Id id) { List list = Util.toOlap4j(id.getSegments()); return new IdentifierNode( list.toArray( new IdentifierSegment[list.size()])); } } } // End MondrianOlap4jConnection.java mondrian-3.11.0.1-R/src/main/mondrian/olap4j/MondrianOlap4jCube.java000066400000000000000000000267201261646570300247600ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.olap4j; import mondrian.olap.*; import org.olap4j.OlapException; import org.olap4j.impl.*; import org.olap4j.mdx.IdentifierSegment; import org.olap4j.metadata.Cube; import org.olap4j.metadata.Dimension; import org.olap4j.metadata.Hierarchy; import org.olap4j.metadata.*; import org.olap4j.metadata.Member; import org.olap4j.metadata.NamedSet; import org.olap4j.metadata.Schema; import java.util.*; /** * Implementation of {@link Cube} * for the Mondrian OLAP engine. * * @author jhyde * @since May 24, 2007 */ class MondrianOlap4jCube extends MondrianOlap4jMetadataElement implements Cube, Named { final mondrian.olap.Cube cube; final MondrianOlap4jSchema olap4jSchema; MondrianOlap4jCube( mondrian.olap.Cube cube, MondrianOlap4jSchema olap4jSchema) { this.cube = cube; this.olap4jSchema = olap4jSchema; } public Schema getSchema() { return olap4jSchema; } public int hashCode() { return olap4jSchema.hashCode() ^ cube.hashCode(); } public boolean equals(Object obj) { if (obj instanceof MondrianOlap4jCube) { MondrianOlap4jCube that = (MondrianOlap4jCube) obj; return this.olap4jSchema == that.olap4jSchema && this.cube.equals(that.cube); } return false; } public NamedList getDimensions() { NamedList list = new NamedListImpl(); final MondrianOlap4jConnection olap4jConnection = olap4jSchema.olap4jCatalog.olap4jDatabaseMetaData.olap4jConnection; final mondrian.olap.SchemaReader schemaReader = olap4jConnection.getMondrianConnection2().getSchemaReader() .withLocus(); for (mondrian.olap.Dimension dimension : schemaReader.getCubeDimensions(cube)) { list.add( new MondrianOlap4jDimension( olap4jSchema, dimension)); } return Olap4jUtil.cast(list); } public NamedList getHierarchies() { NamedList list = new NamedListImpl(); final MondrianOlap4jConnection olap4jConnection = olap4jSchema.olap4jCatalog.olap4jDatabaseMetaData.olap4jConnection; final mondrian.olap.SchemaReader schemaReader = olap4jConnection.getMondrianConnection2().getSchemaReader() .withLocus(); for (mondrian.olap.Dimension dimension : schemaReader.getCubeDimensions(cube)) { for (mondrian.olap.Hierarchy hierarchy : schemaReader.getDimensionHierarchies(dimension)) { list.add( new MondrianOlap4jHierarchy( olap4jSchema, hierarchy)); } } return Olap4jUtil.cast(list); } public List getMeasures() { final Dimension dimension = getDimensions().get("Measures"); if (dimension == null) { return Collections.emptyList(); } final MondrianOlap4jConnection olap4jConnection = olap4jSchema.olap4jCatalog.olap4jDatabaseMetaData.olap4jConnection; try { final mondrian.olap.SchemaReader schemaReader = olap4jConnection.getMondrianConnection().getSchemaReader() .withLocus(); final MondrianOlap4jLevel measuresLevel = (MondrianOlap4jLevel) dimension.getDefaultHierarchy() .getLevels().get(0); final List measures = new ArrayList(); List levelMembers = schemaReader.getLevelMembers( measuresLevel.level, true); for (mondrian.olap.Member member : levelMembers) { // This corrects MONDRIAN-1123, a ClassCastException (see below) // that occurs when you create a calculated member on a // dimension other than Measures: // java.lang.ClassCastException: // mondrian.olap4j.MondrianOlap4jMember cannot be cast to // org.olap4j.metadata.Measure MondrianOlap4jMember olap4jMember = olap4jConnection.toOlap4j( member); if (olap4jMember instanceof Measure) { measures.add((Measure) olap4jMember); } } return measures; } catch (OlapException e) { // OlapException not possible, since measures are stored in memory. // Demote from checked to unchecked exception. throw new RuntimeException(e); } } public NamedList getSets() { final NamedListImpl list = new NamedListImpl(); final MondrianOlap4jConnection olap4jConnection = olap4jSchema.olap4jCatalog.olap4jDatabaseMetaData.olap4jConnection; for (mondrian.olap.NamedSet namedSet : cube.getNamedSets()) { list.add(olap4jConnection.toOlap4j(cube, namedSet)); } return Olap4jUtil.cast(list); } public Collection getSupportedLocales() { throw new UnsupportedOperationException(); } public String getName() { return cube.getName(); } public String getUniqueName() { return cube.getUniqueName(); } public String getCaption() { return cube.getLocalized( OlapElement.LocalizedProperty.CAPTION, olap4jSchema.getLocale()); } public String getDescription() { return cube.getLocalized( OlapElement.LocalizedProperty.DESCRIPTION, olap4jSchema.getLocale()); } public boolean isVisible() { return cube.isVisible(); } public MondrianOlap4jMember lookupMember( List nameParts) throws OlapException { final MondrianOlap4jConnection olap4jConnection = olap4jSchema.olap4jCatalog.olap4jDatabaseMetaData.olap4jConnection; final Role role = olap4jConnection.getMondrianConnection().getRole(); final SchemaReader schemaReader = cube.getSchemaReader(role).withLocus(); return lookupMember(schemaReader, nameParts); } private MondrianOlap4jMember lookupMember( SchemaReader schemaReader, List nameParts) { final List segmentList = new ArrayList(); for (IdentifierSegment namePart : nameParts) { segmentList.add(Util.convert(namePart)); } final mondrian.olap.Member member = schemaReader.getMemberByUniqueName(segmentList, false); if (member == null) { return null; } return olap4jSchema.olap4jCatalog.olap4jDatabaseMetaData .olap4jConnection.toOlap4j(member); } public List lookupMembers( Set treeOps, List nameParts) throws OlapException { final MondrianOlap4jConnection olap4jConnection = olap4jSchema.olap4jCatalog.olap4jDatabaseMetaData.olap4jConnection; final Role role = olap4jConnection.getMondrianConnection().getRole(); final SchemaReader schemaReader = cube.getSchemaReader(role).withLocus(); final MondrianOlap4jMember member = lookupMember(schemaReader, nameParts); if (member == null) { return Collections.emptyList(); } // Add ancestors and/or the parent. Ancestors are prepended, to ensure // hierarchical order. final List list = new ArrayList(); if (treeOps.contains(Member.TreeOp.ANCESTORS)) { for (MondrianOlap4jMember m = member.getParentMember(); m != null; m = m.getParentMember()) { list.add(0, m); } } else if (treeOps.contains(Member.TreeOp.PARENT)) { final MondrianOlap4jMember parentMember = member.getParentMember(); if (parentMember != null) { list.add(parentMember); } } // Add siblings. Siblings which occur after the member are deferred, // because they occur after children and descendants in the // hierarchical ordering. List remainingSiblingsList = null; if (treeOps.contains(Member.TreeOp.SIBLINGS)) { final MondrianOlap4jMember parentMember = member.getParentMember(); NamedList siblingMembers; if (parentMember != null) { siblingMembers = olap4jConnection.toOlap4j( schemaReader.getMemberChildren(parentMember.member)); } else { siblingMembers = olap4jConnection.toOlap4j( schemaReader.getHierarchyRootMembers( member.member.getHierarchy())); } List targetList = list; for (MondrianOlap4jMember siblingMember : siblingMembers) { if (siblingMember.equals(member)) { targetList = remainingSiblingsList = new ArrayList(); } else { targetList.add(siblingMember); } } } // Add the member itself. if (treeOps.contains(Member.TreeOp.SELF)) { list.add(member); } // Add descendants and/or children. if (treeOps.contains(Member.TreeOp.DESCENDANTS)) { addDescendants(list, schemaReader, olap4jConnection, member, true); } else if (treeOps.contains(Member.TreeOp.CHILDREN)) { addDescendants(list, schemaReader, olap4jConnection, member, false); } // Lastly, add siblings which occur after the member itself. They // occur after all of the descendants in the hierarchical ordering. if (remainingSiblingsList != null) { list.addAll(remainingSiblingsList); } return Olap4jUtil.cast(list); } private void addDescendants( List list, SchemaReader schemaReader, MondrianOlap4jConnection olap4jConnection, MondrianOlap4jMember member, boolean recurse) { for (mondrian.olap.Member m : schemaReader.getMemberChildren(member.member)) { MondrianOlap4jMember childMember = olap4jConnection.toOlap4j(m); list.add(childMember); if (recurse) { addDescendants( list, schemaReader, olap4jConnection, childMember, recurse); } } } public boolean isDrillThroughEnabled() { return true; } protected OlapElement getOlapElement() { return cube; } } // End MondrianOlap4jCube.java mondrian-3.11.0.1-R/src/main/mondrian/olap4j/MondrianOlap4jDatabase.java000066400000000000000000000067701261646570300256110ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.olap4j; import mondrian.olap.OlapElement; import org.olap4j.OlapConnection; import org.olap4j.OlapException; import org.olap4j.impl.Named; import org.olap4j.impl.Olap4jUtil; import org.olap4j.metadata.*; import java.util.Collections; import java.util.List; /** * Implementation of {@link org.olap4j.metadata.Database} * for the Mondrian OLAP engine. * * @author LBoudreau */ class MondrianOlap4jDatabase extends MondrianOlap4jMetadataElement implements Database, Named { private final NamedList catalogs; private final MondrianOlap4jConnection olap4jConnection; private final String name; private final String description; private final String providerName; private final String url; private final String dataSourceInfo; private final List providerType; private final List authenticationMode; /** * Creates a MondrianOlap4jDatabase. * * @param olap4jConnection Connection * @param catalogs List of catalogs * @param name Name of database * @param description Description of database * @param providerName Provider name * @param url URL of provider * @param dataSourceInfo Data source info * @param providerType List of provider types supported by this database * @param authenticationMode Authentication modes */ MondrianOlap4jDatabase( MondrianOlap4jConnection olap4jConnection, NamedList catalogs, String name, String description, String providerName, String url, String dataSourceInfo, List providerType, List authenticationMode) { this.olap4jConnection = olap4jConnection; this.name = name; this.description = description; this.providerName = providerName; this.url = url; this.dataSourceInfo = dataSourceInfo; this.providerType = Collections.unmodifiableList(providerType); this.authenticationMode = Collections.unmodifiableList(authenticationMode); this.catalogs = Olap4jUtil.unmodifiableNamedList(catalogs); } public List getAuthenticationModes() throws OlapException { return authenticationMode; } public NamedList getCatalogs() throws OlapException { return Olap4jUtil.cast(catalogs); } public String getDescription() throws OlapException { return this.description; } public String getName() { return this.name; } public OlapConnection getOlapConnection() { return this.olap4jConnection; } public String getProviderName() throws OlapException { return this.providerName; } public List getProviderTypes() throws OlapException { return this.providerType; } public String getURL() throws OlapException { return this.url; } public String getDataSourceInfo() throws OlapException { return this.dataSourceInfo; } protected OlapElement getOlapElement() { return null; } } // End MondrianOlap4jDatabase.java mondrian-3.11.0.1-R/src/main/mondrian/olap4j/MondrianOlap4jDatabaseMetaData.java000066400000000000000000001046711261646570300272110ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.olap4j; import mondrian.olap.Util; import mondrian.rolap.RolapConnection; import mondrian.xmla.XmlaUtil; import org.olap4j.*; import org.olap4j.metadata.*; import java.sql.ResultSet; import java.sql.SQLException; import java.util.*; /** * Implementation of {@link org.olap4j.OlapDatabaseMetaData} * for the Mondrian OLAP engine. * *

This class has sub-classes which implement JDBC 3.0 and JDBC 4.0 APIs; * it is instantiated using {@link Factory#newDatabaseMetaData}.

* * @author jhyde * @since May 23, 2007 */ abstract class MondrianOlap4jDatabaseMetaData implements OlapDatabaseMetaData { final MondrianOlap4jConnection olap4jConnection; private static final Comparator CATALOG_COMP = new Comparator() { public int compare(Catalog o1, Catalog o2) { return o1.getName().compareTo(o2.getName()); } }; private static final Comparator SCHEMA_COMP = new Comparator() { public int compare(Schema o1, Schema o2) { return o1.getName().compareTo(o2.getName()); } }; /** * Creates a MondrianOlap4jDatabaseMetaData. * * @param olap4jConnection Connection * @param mondrianConnection Mondrian connection */ MondrianOlap4jDatabaseMetaData( MondrianOlap4jConnection olap4jConnection, RolapConnection mondrianConnection) { this.olap4jConnection = olap4jConnection; } // helpers /** * Executes a metadata query and returns the result as a JDBC * {@link ResultSet}. * *

The XMLA specification usually specifies that the returned list is * ordered by particular attributes. XMLA notwithstanding, the result from * this method is always ordered. * * @param methodName Name of the metadata request. Corresponds to the XMLA * method name, e.g. "MDSCHEMA_CUBES" * * @param patternValues Array of alternating parameter name and value * pairs. If the parameter value is null, it is ignored. * * @return Result set of metadata * * @throws org.olap4j.OlapException on error */ private ResultSet getMetadata( String methodName, Object... patternValues) throws OlapException { Map restrictionMap = new HashMap(); assert patternValues.length % 2 == 0; for (int i = 0; i < patternValues.length / 2; ++i) { final String key = (String) patternValues[i * 2]; Object value = patternValues[i * 2 + 1]; if (value != null) { if (value instanceof String) { value = Collections.singletonList((String) value); } restrictionMap.put(key, value); } } XmlaUtil.MetadataRowset rowset = XmlaUtil.getMetadataRowset( olap4jConnection, methodName, restrictionMap); return olap4jConnection.factory.newFixedResultSet( olap4jConnection, rowset.headerList, rowset.rowList); } /** * Wraps a string in an object that indicates that it is to be treated as * a wildcard pattern, not a literal match. * * @param pattern Pattern * @return Wildcard, or null if pattern is null */ private XmlaUtil.Wildcard wildcard(String pattern) { return pattern == null ? null : new XmlaUtil.Wildcard(pattern); } // implement DatabaseMetaData public boolean allProceduresAreCallable() throws SQLException { throw new UnsupportedOperationException(); } public boolean allTablesAreSelectable() throws SQLException { throw new UnsupportedOperationException(); } public String getURL() throws SQLException { return olap4jConnection.getMondrianConnection().getConnectString(); } public String getUserName() throws SQLException { // mondrian does not support a user name property return null; } public boolean isReadOnly() throws SQLException { // all mondrian databases are read-only return true; } public boolean nullsAreSortedHigh() throws SQLException { throw new UnsupportedOperationException(); } public boolean nullsAreSortedLow() throws SQLException { throw new UnsupportedOperationException(); } public boolean nullsAreSortedAtStart() throws SQLException { throw new UnsupportedOperationException(); } public boolean nullsAreSortedAtEnd() throws SQLException { throw new UnsupportedOperationException(); } public String getDatabaseProductName() throws SQLException { return olap4jConnection.mondrianServer.getVersion().getProductName(); } public String getDatabaseProductVersion() throws SQLException { return olap4jConnection.mondrianServer.getVersion().getVersionString(); } public String getDriverName() throws SQLException { return olap4jConnection.driver.getName(); } public String getDriverVersion() throws SQLException { return olap4jConnection.driver.getVersion(); } public int getDriverMajorVersion() { return olap4jConnection.driver.getMajorVersion(); } public int getDriverMinorVersion() { return olap4jConnection.driver.getMinorVersion(); } public boolean usesLocalFiles() throws SQLException { throw new UnsupportedOperationException(); } public boolean usesLocalFilePerTable() throws SQLException { throw new UnsupportedOperationException(); } public boolean supportsMixedCaseIdentifiers() throws SQLException { throw new UnsupportedOperationException(); } public boolean storesUpperCaseIdentifiers() throws SQLException { throw new UnsupportedOperationException(); } public boolean storesLowerCaseIdentifiers() throws SQLException { throw new UnsupportedOperationException(); } public boolean storesMixedCaseIdentifiers() throws SQLException { throw new UnsupportedOperationException(); } public boolean supportsMixedCaseQuotedIdentifiers() throws SQLException { throw new UnsupportedOperationException(); } public boolean storesUpperCaseQuotedIdentifiers() throws SQLException { throw new UnsupportedOperationException(); } public boolean storesLowerCaseQuotedIdentifiers() throws SQLException { throw new UnsupportedOperationException(); } public boolean storesMixedCaseQuotedIdentifiers() throws SQLException { throw new UnsupportedOperationException(); } public String getIdentifierQuoteString() throws SQLException { throw new UnsupportedOperationException(); } public String getSQLKeywords() throws SQLException { throw new UnsupportedOperationException(); } public String getNumericFunctions() throws SQLException { throw new UnsupportedOperationException(); } public String getStringFunctions() throws SQLException { throw new UnsupportedOperationException(); } public String getSystemFunctions() throws SQLException { throw new UnsupportedOperationException(); } public String getTimeDateFunctions() throws SQLException { throw new UnsupportedOperationException(); } public String getSearchStringEscape() throws SQLException { throw new UnsupportedOperationException(); } public String getExtraNameCharacters() throws SQLException { throw new UnsupportedOperationException(); } public boolean supportsAlterTableWithAddColumn() throws SQLException { throw new UnsupportedOperationException(); } public boolean supportsAlterTableWithDropColumn() throws SQLException { throw new UnsupportedOperationException(); } public boolean supportsColumnAliasing() throws SQLException { throw new UnsupportedOperationException(); } public boolean nullPlusNonNullIsNull() throws SQLException { throw new UnsupportedOperationException(); } public boolean supportsConvert() throws SQLException { throw new UnsupportedOperationException(); } public boolean supportsConvert( int fromType, int toType) throws SQLException { throw new UnsupportedOperationException(); } public boolean supportsTableCorrelationNames() throws SQLException { throw new UnsupportedOperationException(); } public boolean supportsDifferentTableCorrelationNames() throws SQLException { throw new UnsupportedOperationException(); } public boolean supportsExpressionsInOrderBy() throws SQLException { throw new UnsupportedOperationException(); } public boolean supportsOrderByUnrelated() throws SQLException { throw new UnsupportedOperationException(); } public boolean supportsGroupBy() throws SQLException { throw new UnsupportedOperationException(); } public boolean supportsGroupByUnrelated() throws SQLException { throw new UnsupportedOperationException(); } public boolean supportsGroupByBeyondSelect() throws SQLException { throw new UnsupportedOperationException(); } public boolean supportsLikeEscapeClause() throws SQLException { throw new UnsupportedOperationException(); } public boolean supportsMultipleResultSets() throws SQLException { throw new UnsupportedOperationException(); } public boolean supportsMultipleTransactions() throws SQLException { throw new UnsupportedOperationException(); } public boolean supportsNonNullableColumns() throws SQLException { throw new UnsupportedOperationException(); } public boolean supportsMinimumSQLGrammar() throws SQLException { throw new UnsupportedOperationException(); } public boolean supportsCoreSQLGrammar() throws SQLException { throw new UnsupportedOperationException(); } public boolean supportsExtendedSQLGrammar() throws SQLException { throw new UnsupportedOperationException(); } public boolean supportsANSI92EntryLevelSQL() throws SQLException { throw new UnsupportedOperationException(); } public boolean supportsANSI92IntermediateSQL() throws SQLException { throw new UnsupportedOperationException(); } public boolean supportsANSI92FullSQL() throws SQLException { throw new UnsupportedOperationException(); } public boolean supportsIntegrityEnhancementFacility() throws SQLException { throw new UnsupportedOperationException(); } public boolean supportsOuterJoins() throws SQLException { throw new UnsupportedOperationException(); } public boolean supportsFullOuterJoins() throws SQLException { throw new UnsupportedOperationException(); } public boolean supportsLimitedOuterJoins() throws SQLException { throw new UnsupportedOperationException(); } public String getSchemaTerm() throws SQLException { throw new UnsupportedOperationException(); } public String getProcedureTerm() throws SQLException { throw new UnsupportedOperationException(); } public String getCatalogTerm() throws SQLException { throw new UnsupportedOperationException(); } public boolean isCatalogAtStart() throws SQLException { throw new UnsupportedOperationException(); } public String getCatalogSeparator() throws SQLException { throw new UnsupportedOperationException(); } public boolean supportsSchemasInDataManipulation() throws SQLException { throw new UnsupportedOperationException(); } public boolean supportsSchemasInProcedureCalls() throws SQLException { throw new UnsupportedOperationException(); } public boolean supportsSchemasInTableDefinitions() throws SQLException { throw new UnsupportedOperationException(); } public boolean supportsSchemasInIndexDefinitions() throws SQLException { throw new UnsupportedOperationException(); } public boolean supportsSchemasInPrivilegeDefinitions() throws SQLException { throw new UnsupportedOperationException(); } public boolean supportsCatalogsInDataManipulation() throws SQLException { throw new UnsupportedOperationException(); } public boolean supportsCatalogsInProcedureCalls() throws SQLException { throw new UnsupportedOperationException(); } public boolean supportsCatalogsInTableDefinitions() throws SQLException { throw new UnsupportedOperationException(); } public boolean supportsCatalogsInIndexDefinitions() throws SQLException { throw new UnsupportedOperationException(); } public boolean supportsCatalogsInPrivilegeDefinitions() throws SQLException { throw new UnsupportedOperationException(); } public boolean supportsPositionedDelete() throws SQLException { throw new UnsupportedOperationException(); } public boolean supportsPositionedUpdate() throws SQLException { throw new UnsupportedOperationException(); } public boolean supportsSelectForUpdate() throws SQLException { throw new UnsupportedOperationException(); } public boolean supportsStoredProcedures() throws SQLException { throw new UnsupportedOperationException(); } public boolean supportsSubqueriesInComparisons() throws SQLException { throw new UnsupportedOperationException(); } public boolean supportsSubqueriesInExists() throws SQLException { throw new UnsupportedOperationException(); } public boolean supportsSubqueriesInIns() throws SQLException { throw new UnsupportedOperationException(); } public boolean supportsSubqueriesInQuantifieds() throws SQLException { throw new UnsupportedOperationException(); } public boolean supportsCorrelatedSubqueries() throws SQLException { throw new UnsupportedOperationException(); } public boolean supportsUnion() throws SQLException { throw new UnsupportedOperationException(); } public boolean supportsUnionAll() throws SQLException { throw new UnsupportedOperationException(); } public boolean supportsOpenCursorsAcrossCommit() throws SQLException { throw new UnsupportedOperationException(); } public boolean supportsOpenCursorsAcrossRollback() throws SQLException { throw new UnsupportedOperationException(); } public boolean supportsOpenStatementsAcrossCommit() throws SQLException { throw new UnsupportedOperationException(); } public boolean supportsOpenStatementsAcrossRollback() throws SQLException { throw new UnsupportedOperationException(); } public int getMaxBinaryLiteralLength() throws SQLException { throw new UnsupportedOperationException(); } public int getMaxCharLiteralLength() throws SQLException { throw new UnsupportedOperationException(); } public int getMaxColumnNameLength() throws SQLException { throw new UnsupportedOperationException(); } public int getMaxColumnsInGroupBy() throws SQLException { throw new UnsupportedOperationException(); } public int getMaxColumnsInIndex() throws SQLException { throw new UnsupportedOperationException(); } public int getMaxColumnsInOrderBy() throws SQLException { throw new UnsupportedOperationException(); } public int getMaxColumnsInSelect() throws SQLException { throw new UnsupportedOperationException(); } public int getMaxColumnsInTable() throws SQLException { throw new UnsupportedOperationException(); } public int getMaxConnections() throws SQLException { throw new UnsupportedOperationException(); } public int getMaxCursorNameLength() throws SQLException { throw new UnsupportedOperationException(); } public int getMaxIndexLength() throws SQLException { throw new UnsupportedOperationException(); } public int getMaxSchemaNameLength() throws SQLException { throw new UnsupportedOperationException(); } public int getMaxProcedureNameLength() throws SQLException { throw new UnsupportedOperationException(); } public int getMaxCatalogNameLength() throws SQLException { throw new UnsupportedOperationException(); } public int getMaxRowSize() throws SQLException { throw new UnsupportedOperationException(); } public boolean doesMaxRowSizeIncludeBlobs() throws SQLException { throw new UnsupportedOperationException(); } public int getMaxStatementLength() throws SQLException { throw new UnsupportedOperationException(); } public int getMaxStatements() throws SQLException { throw new UnsupportedOperationException(); } public int getMaxTableNameLength() throws SQLException { throw new UnsupportedOperationException(); } public int getMaxTablesInSelect() throws SQLException { throw new UnsupportedOperationException(); } public int getMaxUserNameLength() throws SQLException { throw new UnsupportedOperationException(); } public int getDefaultTransactionIsolation() throws SQLException { throw new UnsupportedOperationException(); } public boolean supportsTransactions() throws SQLException { throw new UnsupportedOperationException(); } public boolean supportsTransactionIsolationLevel(int level) throws SQLException { throw new UnsupportedOperationException(); } public boolean supportsDataDefinitionAndDataManipulationTransactions() throws SQLException { throw new UnsupportedOperationException(); } public boolean supportsDataManipulationTransactionsOnly() throws SQLException { throw new UnsupportedOperationException(); } public boolean dataDefinitionCausesTransactionCommit() throws SQLException { throw new UnsupportedOperationException(); } public boolean dataDefinitionIgnoredInTransactions() throws SQLException { throw new UnsupportedOperationException(); } public ResultSet getProcedures( String catalog, String schemaPattern, String procedureNamePattern) throws SQLException { throw new UnsupportedOperationException(); } public ResultSet getProcedureColumns( String catalog, String schemaPattern, String procedureNamePattern, String columnNamePattern) throws SQLException { throw new UnsupportedOperationException(); } public ResultSet getTables( String catalog, String schemaPattern, String tableNamePattern, String types[]) throws SQLException { throw new UnsupportedOperationException(); } public ResultSet getSchemas() throws OlapException { if (false) { // Do not use DBSCHEMA_SCHEMATA: it has different columns than the // JDBC spec requires return getMetadata("DBSCHEMA_SCHEMATA"); } List headerList = Arrays.asList("TABLE_SCHEM", "TABLE_CAT"); List> rowList = new ArrayList>(); for (Catalog catalog : Util.sort( olap4jConnection.getOlapCatalogs(), CATALOG_COMP)) { for (Schema schema : Util.sort( catalog.getSchemas(), SCHEMA_COMP)) { rowList.add( Arrays.asList( schema.getName(), catalog.getName())); } } return olap4jConnection.factory.newFixedResultSet( olap4jConnection, headerList, rowList); } public ResultSet getCatalogs() throws OlapException { if (false) { // Do not use DBSCHEMA_CATALOGS: it has different columns than the // JDBC spec requires return getMetadata("DBSCHEMA_CATALOGS"); } List headerList = Arrays.asList("TABLE_CAT"); List> rowList = new ArrayList>(); for (Catalog catalog : Util.sort( olap4jConnection.getOlapCatalogs(), CATALOG_COMP)) { rowList.add( Collections.singletonList(catalog.getName())); } return olap4jConnection.factory.newFixedResultSet( olap4jConnection, headerList, rowList); } public ResultSet getTableTypes() throws SQLException { throw new UnsupportedOperationException(); } public ResultSet getColumns( String catalog, String schemaPattern, String tableNamePattern, String columnNamePattern) throws SQLException { throw new UnsupportedOperationException(); } public ResultSet getColumnPrivileges( String catalog, String schema, String table, String columnNamePattern) throws SQLException { throw new UnsupportedOperationException(); } public ResultSet getTablePrivileges( String catalog, String schemaPattern, String tableNamePattern) throws SQLException { throw new UnsupportedOperationException(); } public ResultSet getBestRowIdentifier( String catalog, String schema, String table, int scope, boolean nullable) throws SQLException { throw new UnsupportedOperationException(); } public ResultSet getVersionColumns( String catalog, String schema, String table) throws SQLException { throw new UnsupportedOperationException(); } public ResultSet getPrimaryKeys( String catalog, String schema, String table) throws SQLException { throw new UnsupportedOperationException(); } public ResultSet getImportedKeys( String catalog, String schema, String table) throws SQLException { throw new UnsupportedOperationException(); } public ResultSet getExportedKeys( String catalog, String schema, String table) throws SQLException { throw new UnsupportedOperationException(); } public ResultSet getCrossReference( String parentCatalog, String parentSchema, String parentTable, String foreignCatalog, String foreignSchema, String foreignTable) throws SQLException { throw new UnsupportedOperationException(); } public ResultSet getTypeInfo() throws SQLException { throw new UnsupportedOperationException(); } public ResultSet getIndexInfo( String catalog, String schema, String table, boolean unique, boolean approximate) throws SQLException { throw new UnsupportedOperationException(); } public boolean supportsResultSetType(int type) throws SQLException { throw new UnsupportedOperationException(); } public boolean supportsResultSetConcurrency( int type, int concurrency) throws SQLException { throw new UnsupportedOperationException(); } public boolean ownUpdatesAreVisible(int type) throws SQLException { throw new UnsupportedOperationException(); } public boolean ownDeletesAreVisible(int type) throws SQLException { throw new UnsupportedOperationException(); } public boolean ownInsertsAreVisible(int type) throws SQLException { throw new UnsupportedOperationException(); } public boolean othersUpdatesAreVisible(int type) throws SQLException { throw new UnsupportedOperationException(); } public boolean othersDeletesAreVisible(int type) throws SQLException { throw new UnsupportedOperationException(); } public boolean othersInsertsAreVisible(int type) throws SQLException { throw new UnsupportedOperationException(); } public boolean updatesAreDetected(int type) throws SQLException { throw new UnsupportedOperationException(); } public boolean deletesAreDetected(int type) throws SQLException { throw new UnsupportedOperationException(); } public boolean insertsAreDetected(int type) throws SQLException { throw new UnsupportedOperationException(); } public boolean supportsBatchUpdates() throws SQLException { throw new UnsupportedOperationException(); } public ResultSet getUDTs( String catalog, String schemaPattern, String typeNamePattern, int[] types) throws SQLException { throw new UnsupportedOperationException(); } public OlapConnection getConnection() { return olap4jConnection; } public boolean supportsSavepoints() throws SQLException { throw new UnsupportedOperationException(); } public boolean supportsNamedParameters() throws SQLException { throw new UnsupportedOperationException(); } public boolean supportsMultipleOpenResults() throws SQLException { throw new UnsupportedOperationException(); } public boolean supportsGetGeneratedKeys() throws SQLException { throw new UnsupportedOperationException(); } public ResultSet getSuperTypes( String catalog, String schemaPattern, String typeNamePattern) throws SQLException { throw new UnsupportedOperationException(); } public ResultSet getSuperTables( String catalog, String schemaPattern, String tableNamePattern) throws SQLException { throw new UnsupportedOperationException(); } public ResultSet getAttributes( String catalog, String schemaPattern, String typeNamePattern, String attributeNamePattern) throws SQLException { throw new UnsupportedOperationException(); } public boolean supportsResultSetHoldability(int holdability) throws SQLException { throw new UnsupportedOperationException(); } public int getResultSetHoldability() throws SQLException { throw new UnsupportedOperationException(); } public int getDatabaseMajorVersion() throws SQLException { return olap4jConnection.mondrianServer.getVersion().getMajorVersion(); } public int getDatabaseMinorVersion() throws SQLException { return olap4jConnection.mondrianServer.getVersion().getMinorVersion(); } public int getJDBCMajorVersion() throws SQLException { // mondrian olap4j supports jdbc 4.0 return 4; } public int getJDBCMinorVersion() throws SQLException { // mondrian olap4j supports jdbc 4.0 return 0; } public int getSQLStateType() throws SQLException { throw new UnsupportedOperationException(); } public boolean locatorsUpdateCopy() throws SQLException { throw new UnsupportedOperationException(); } public boolean supportsStatementPooling() throws SQLException { throw new UnsupportedOperationException(); } // implement java.sql.Wrapper // straightforward implementation of unwrap and isWrapperFor, since this // class already implements the interface they most likely require: // DatabaseMetaData and OlapDatabaseMetaData public T unwrap(Class iface) throws SQLException { if (iface.isInstance(this)) { return iface.cast(this); } throw olap4jConnection.helper.createException( "does not implement '" + iface + "'"); } public boolean isWrapperFor(Class iface) throws SQLException { return iface.isInstance(this); } // implement OlapDatabaseMetaData public Set getSupportedCellSetListenerGranularities() throws OlapException { // Cell set listener API not supported in this version of mondrian. return Collections.emptySet(); } public ResultSet getActions( String catalog, String schemaPattern, String cubeNamePattern, String actionNamePattern) throws OlapException { return getMetadata( "MDSCHEMA_ACTIONS", "SCHEMA_NAME", wildcard(schemaPattern), "CUBE_NAME", wildcard(cubeNamePattern), "ACTION_NAME", wildcard(actionNamePattern)); } public ResultSet getDatabases() throws OlapException { return getMetadata("DISCOVER_DATASOURCES"); } public ResultSet getLiterals() throws OlapException { return getMetadata("DISCOVER_LITERALS"); } public ResultSet getDatabaseProperties( String dataSourceName, String propertyNamePattern) throws OlapException { return getMetadata("DISCOVER_PROPERTIES"); } public ResultSet getProperties( String catalog, String schemaPattern, String cubeNamePattern, String dimensionUniqueName, String hierarchyUniqueName, String levelUniqueName, String memberUniqueName, String propertyNamePattern) throws OlapException { return getMetadata( "MDSCHEMA_PROPERTIES", "CATALOG_NAME", catalog, "SCHEMA_NAME", wildcard(schemaPattern), "CUBE_NAME", wildcard(cubeNamePattern), "DIMENSION_UNIQUE_NAME", dimensionUniqueName, "HIERARCHY_UNIQUE_NAME", hierarchyUniqueName, "LEVEL_UNIQUE_NAME", levelUniqueName, "MEMBER_UNIQUE_NAME", memberUniqueName, "PROPERTY_NAME", wildcard(propertyNamePattern)); } public String getMdxKeywords() throws OlapException { StringBuilder buf = new StringBuilder(); for (String keyword : olap4jConnection.mondrianServer.getKeywords()) { if (buf.length() > 0) { buf.append(','); } buf.append(keyword); } return buf.toString(); } public ResultSet getCubes( String catalog, String schemaPattern, String cubeNamePattern) throws OlapException { return getMetadata( "MDSCHEMA_CUBES", "CATALOG_NAME", catalog, "SCHEMA_NAME", wildcard(schemaPattern), "CUBE_NAME", wildcard(cubeNamePattern)); } public ResultSet getDimensions( String catalog, String schemaPattern, String cubeNamePattern, String dimensionNamePattern) throws OlapException { return getMetadata( "MDSCHEMA_DIMENSIONS", "SCHEMA_NAME", wildcard(schemaPattern), "CUBE_NAME", wildcard(cubeNamePattern), "DIMENSION_NAME", wildcard(dimensionNamePattern)); } public ResultSet getOlapFunctions( String functionNamePattern) throws OlapException { return getMetadata( "MDSCHEMA_FUNCTIONS", "FUNCTION_NAME", wildcard(functionNamePattern)); } public ResultSet getHierarchies( String catalog, String schemaPattern, String cubeNamePattern, String dimensionUniqueName, String hierarchyNamePattern) throws OlapException { return getMetadata( "MDSCHEMA_HIERARCHIES", "CATALOG_NAME", catalog, "SCHEMA_NAME", wildcard(schemaPattern), "CUBE_NAME", wildcard(cubeNamePattern), "DIMENSION_UNIQUE_NAME", dimensionUniqueName, "HIERARCHY_NAME", wildcard(hierarchyNamePattern)); } public ResultSet getMeasures( String catalog, String schemaPattern, String cubeNamePattern, String measureNamePattern, String measureUniqueName) throws OlapException { return getMetadata( "MDSCHEMA_MEASURES", "CATALOG_NAME", catalog, "SCHEMA_NAME", wildcard(schemaPattern), "CUBE_NAME", wildcard(cubeNamePattern), "MEASURE_NAME", wildcard(measureNamePattern), "MEASURE_UNIQUE_NAME", measureUniqueName); } public ResultSet getMembers( String catalog, String schemaPattern, String cubeNamePattern, String dimensionUniqueName, String hierarchyUniqueName, String levelUniqueName, String memberUniqueName, Set treeOps) throws OlapException { String treeOpString; if (treeOps != null) { final int mask = Member.TreeOp.getDictionary().toMask(treeOps); treeOpString = String.valueOf(mask); } else { treeOpString = null; } return getMetadata( "MDSCHEMA_MEMBERS", "CATALOG_NAME", catalog, "SCHEMA_NAME", wildcard(schemaPattern), "CUBE_NAME", wildcard(cubeNamePattern), "DIMENSION_UNIQUE_NAME", dimensionUniqueName, "HIERARCHY_UNIQUE_NAME", hierarchyUniqueName, "LEVEL_UNIQUE_NAME", levelUniqueName, "MEMBER_UNIQUE_NAME", memberUniqueName, "TREE_OP", treeOpString); } public ResultSet getLevels( String catalog, String schemaPattern, String cubeNamePattern, String dimensionUniqueName, String hierarchyUniqueName, String levelNamePattern) throws OlapException { return getMetadata( "MDSCHEMA_LEVELS", "CATALOG_NAME", catalog, "SCHEMA_NAME", wildcard(schemaPattern), "CUBE_NAME", wildcard(cubeNamePattern), "DIMENSION_UNIQUE_NAME", dimensionUniqueName, "HIERARCHY_UNIQUE_NAME", hierarchyUniqueName, "LEVEL_NAME", wildcard(levelNamePattern)); } public ResultSet getSets( String catalog, String schemaPattern, String cubeNamePattern, String setNamePattern) throws OlapException { return getMetadata( "MDSCHEMA_SETS", "CATALOG_NAME", catalog, "SCHEMA_NAME", wildcard(schemaPattern), "CUBE_NAME", wildcard(cubeNamePattern), "SET_NAME", wildcard(setNamePattern)); } } // End MondrianOlap4jDatabaseMetaData.java mondrian-3.11.0.1-R/src/main/mondrian/olap4j/MondrianOlap4jDimension.java000066400000000000000000000062711261646570300260260ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.olap4j; import mondrian.olap.*; import org.olap4j.OlapException; import org.olap4j.impl.*; import org.olap4j.metadata.Dimension; import org.olap4j.metadata.Hierarchy; import org.olap4j.metadata.*; /** * Implementation of {@link org.olap4j.metadata.Dimension} * for the Mondrian OLAP engine. * * @author jhyde * @since May 24, 2007 */ class MondrianOlap4jDimension extends MondrianOlap4jMetadataElement implements Dimension, Named { private final MondrianOlap4jSchema olap4jSchema; private final mondrian.olap.Dimension dimension; MondrianOlap4jDimension( MondrianOlap4jSchema olap4jSchema, mondrian.olap.Dimension dimension) { this.olap4jSchema = olap4jSchema; this.dimension = dimension; } public boolean equals(Object obj) { return obj instanceof MondrianOlap4jDimension && dimension.equals(((MondrianOlap4jDimension) obj).dimension); } public int hashCode() { return dimension.hashCode(); } public NamedList getHierarchies() { final NamedList list = new NamedListImpl(); final MondrianOlap4jConnection olap4jConnection = olap4jSchema.olap4jCatalog.olap4jDatabaseMetaData.olap4jConnection; final mondrian.olap.SchemaReader schemaReader = olap4jConnection.getMondrianConnection2().getSchemaReader() .withLocus(); for (mondrian.olap.Hierarchy hierarchy : schemaReader.getDimensionHierarchies(dimension)) { list.add(olap4jConnection.toOlap4j(hierarchy)); } return Olap4jUtil.cast(list); } public Hierarchy getDefaultHierarchy() { return getHierarchies().get(0); } public Type getDimensionType() throws OlapException { final DimensionType dimensionType = dimension.getDimensionType(); switch (dimensionType) { case StandardDimension: return Type.OTHER; case MeasuresDimension: return Type.MEASURE; case TimeDimension: return Type.TIME; default: throw Util.unexpected(dimensionType); } } public String getName() { return dimension.getName(); } public String getUniqueName() { return dimension.getUniqueName(); } public String getCaption() { return dimension.getLocalized( OlapElement.LocalizedProperty.CAPTION, olap4jSchema.getLocale()); } public String getDescription() { return dimension.getLocalized( OlapElement.LocalizedProperty.DESCRIPTION, olap4jSchema.getLocale()); } public boolean isVisible() { return dimension.isVisible(); } protected OlapElement getOlapElement() { return dimension; } } // End MondrianOlap4jDimension.java mondrian-3.11.0.1-R/src/main/mondrian/olap4j/MondrianOlap4jDriver.java000066400000000000000000000113221261646570300253250ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.olap4j; import mondrian.rolap.RolapConnectionProperties; import java.sql.*; import java.util.*; import java.util.logging.Logger; /** * Olap4j driver for Mondrian. * *

Since olap4j is a superset of JDBC, you register this driver as you would * any JDBC driver: * *

* Class.forName("mondrian.olap4j.MondrianOlap4jDriver"); *
* *

Then create a connection using a URL with the prefix "jdbc:mondrian:". * For example, * *

* import java.sql.Connection;
* import java.sql.DriverManager;
* import org.olap4j.OlapConnection;
*
* Connection connection =
*   DriverManager.getConnection(
*     "jdbc:mondrian:Jdbc=jdbc:odbc:MondrianFoodMart; * Catalog=file:/mondrian/demo/FoodMart.xml; * JdbcDrivers=sun.jdbc.odbc.JdbcOdbcDriver");
* OlapConnection olapConnection =
*   connection.unwrap(OlapConnection.class);
*
* *

Note how we use the {@link Connection#unwrap(Class)} method to down-cast * the JDBC connection object to the extension {@link org.olap4j.OlapConnection} * object. This method is only available in the JDBC 4.0 (JDK 1.6 onwards). * *

Connection properties

* *

The driver supports the same set of properties as a traditional mondrian * connection. See {@link mondrian.rolap.RolapConnectionProperties}. * *

Catalogs and schemas

* *

Mondrian has a sole catalog, called "LOCALDB". You will get an error * if you attempt to use {@link java.sql.Connection#setCatalog(String)} to set * it to anything else. * * @author jhyde * @since May 22, 2007 */ public class MondrianOlap4jDriver implements Driver { protected final Factory factory; static { try { register(); } catch (SQLException e) { e.printStackTrace(); } } /** * Creates a MondrianOlap4jDriver. */ public MondrianOlap4jDriver() { this.factory = new FactoryJdbc41Impl(); } /** * Registers an instance of MondrianOlap4jDriver. * *

Called implicitly on class load, and implements the traditional * 'Class.forName' way of registering JDBC drivers. * * @throws SQLException on error */ private static void register() throws SQLException { DriverManager.registerDriver(new MondrianOlap4jDriver()); } public Connection connect(String url, Properties info) throws SQLException { if (!MondrianOlap4jConnection.acceptsURL(url)) { return null; } return factory.newConnection(this, url, info); } public boolean acceptsURL(String url) throws SQLException { return MondrianOlap4jConnection.acceptsURL(url); } public DriverPropertyInfo[] getPropertyInfo( String url, Properties info) throws SQLException { List list = new ArrayList(); // First, add the contents of info for (Map.Entry entry : info.entrySet()) { list.add( new DriverPropertyInfo( (String) entry.getKey(), (String) entry.getValue())); } // Next, add property defns not mentioned in info for (RolapConnectionProperties p : RolapConnectionProperties.values()) { if (info.containsKey(p.name())) { continue; } list.add( new DriverPropertyInfo( p.name(), null)); } return list.toArray(new DriverPropertyInfo[list.size()]); } // JDBC 4.1 support (JDK 1.7 and higher) public Logger getParentLogger() { return Logger.getLogger(""); } /** * Returns the driver name. Not in the JDBC API. * @return Driver name */ String getName() { return MondrianOlap4jDriverVersion.NAME; } /** * Returns the driver version. Not in the JDBC API. * @return Driver version */ String getVersion() { return MondrianOlap4jDriverVersion.VERSION; } public int getMajorVersion() { return MondrianOlap4jDriverVersion.MAJOR_VERSION; } public int getMinorVersion() { return MondrianOlap4jDriverVersion.MINOR_VERSION; } public boolean jdbcCompliant() { return false; } } // End MondrianOlap4jDriver.java mondrian-3.11.0.1-R/src/main/mondrian/olap4j/MondrianOlap4jExtra.java000066400000000000000000000331171261646570300251630ustar00rootroot00000000000000/* // This software is subject to the terms of the Eclipse Public License v1.0 // Agreement, available at the following URL: // http://www.eclipse.org/legal/epl-v10.html. // You must accept the terms of that agreement to use this software. // // Copyright (C) 2002-2014 Pentaho and others // All Rights Reserved. */ package mondrian.olap4j; import mondrian.olap.*; import mondrian.olap.Property; import mondrian.olap.Util.PropertyList; import mondrian.olap.fun.FunInfo; import mondrian.rolap.*; import mondrian.xmla.RowsetDefinition; import mondrian.xmla.XmlaHandler; import org.olap4j.*; import org.olap4j.Cell; import org.olap4j.metadata.*; import org.olap4j.metadata.Cube; import org.olap4j.metadata.Hierarchy; import org.olap4j.metadata.Level; import org.olap4j.metadata.Member; import org.olap4j.metadata.Schema; import java.sql.ResultSet; import java.sql.SQLException; import java.util.*; import java.util.Map.Entry; /** * Provides access to internals of mondrian's olap4j driver that are not part * of the olap4j API. * * @author jhyde * @since Nov 12, 2010 */ class MondrianOlap4jExtra implements XmlaHandler.XmlaExtra { static final MondrianOlap4jExtra INSTANCE = new MondrianOlap4jExtra(); public ResultSet executeDrillthrough( OlapStatement olapStatement, String mdx, boolean advanced, String tabFields, int[] rowCountSlot) throws SQLException { return ((MondrianOlap4jStatement) olapStatement).executeQuery2( mdx, advanced, tabFields, rowCountSlot); } public void setPreferList(OlapConnection connection) { ((MondrianOlap4jConnection) connection).setPreferList(true); } public Date getSchemaLoadDate(Schema schema) { return ((MondrianOlap4jSchema) schema).schema.getSchemaLoadDate(); } public int getLevelCardinality(Level level) throws OlapException { if (level instanceof MondrianOlap4jLevel) { // Improved implementation if the provider is mondrian. final MondrianOlap4jLevel olap4jLevel = (MondrianOlap4jLevel) level; final mondrian.olap.SchemaReader schemaReader = olap4jLevel.olap4jSchema.olap4jCatalog.olap4jDatabaseMetaData .olap4jConnection.getMondrianConnection().getSchemaReader() .withLocus(); return schemaReader.getLevelCardinality( olap4jLevel.level, true, true); } else { return level.getCardinality(); } } public void getSchemaFunctionList( List funDefs, Schema schema, Util.Functor1 functionFilter) { final FunTable funTable = ((MondrianOlap4jSchema) schema).schema.getFunTable(); StringBuilder buf = new StringBuilder(50); for (FunInfo fi : funTable.getFunInfoList()) { switch (fi.getSyntax()) { case Empty: case Internal: case Parentheses: continue; } final Boolean passes = functionFilter.apply(fi.getName()); if (passes == null || !passes) { continue; } int[][] paramCategories = fi.getParameterCategories(); int[] returnCategories = fi.getReturnCategories(); // Convert Windows newlines in 'description' to UNIX format. String description = fi.getDescription(); if (description != null) { description = Util.replace( fi.getDescription(), "\r", ""); } if ((paramCategories == null) || (paramCategories.length == 0)) { funDefs.add( new FunctionDefinition( fi.getName(), description, "(none)", 1, 1, // TODO WHAT VALUE should this have "", fi.getName())); } else { for (int i = 0; i < paramCategories.length; i++) { int[] pc = paramCategories[i]; int returnCategory = returnCategories[i]; buf.setLength(0); for (int j = 0; j < pc.length; j++) { int v = pc[j]; if (j > 0) { buf.append(", "); } buf.append( Category.instance.getDescription( v & Category.Mask)); } RowsetDefinition.MdschemaFunctionsRowset.VarType varType = RowsetDefinition.MdschemaFunctionsRowset.VarType .forCategory(returnCategory); funDefs.add( new FunctionDefinition( fi.getName(), description, buf.toString(), // TODO: currently FunInfo can not tell us which // functions are MDX and which are UDFs. varType.ordinal(), 1, // TODO: Name of the interface for UDF and Group // name for the MDX functions. // TODO WHAT VALUE should this have "", fi.getName())); } } } } public int getHierarchyCardinality(Hierarchy hierarchy) throws OlapException { final MondrianOlap4jHierarchy olap4jHierarchy = (MondrianOlap4jHierarchy) hierarchy; final mondrian.olap.SchemaReader schemaReader = olap4jHierarchy.olap4jSchema.olap4jCatalog.olap4jDatabaseMetaData .olap4jConnection.getMondrianConnection().getSchemaReader() .withLocus(); return RolapMemberBase.getHierarchyCardinality( schemaReader, olap4jHierarchy.hierarchy); } public int getHierarchyStructure(Hierarchy hierarchy) { final MondrianOlap4jHierarchy olap4jHierarchy = (MondrianOlap4jHierarchy) hierarchy; return ((HierarchyBase) olap4jHierarchy.hierarchy).isRagged() ? 1 : 0; } public boolean isHierarchyParentChild(Hierarchy hierarchy) { Level nonAllFirstLevel = hierarchy.getLevels().get(0); if (nonAllFirstLevel.getLevelType() == Level.Type.ALL) { nonAllFirstLevel = hierarchy.getLevels().get(1); } MondrianOlap4jLevel olap4jLevel = (MondrianOlap4jLevel) nonAllFirstLevel; return ((RolapLevel) olap4jLevel.level).isParentChild(); } public int getMeasureAggregator(Member member) { MondrianOlap4jMeasure olap4jMeasure = (MondrianOlap4jMeasure) member; Object aggProp = olap4jMeasure.member.getPropertyValue( Property.AGGREGATION_TYPE.name); if (aggProp == null) { return RowsetDefinition.MdschemaMeasuresRowset .MDMEASURE_AGGR_CALCULATED; } RolapAggregator agg = (RolapAggregator) aggProp; if (agg == RolapAggregator.Sum) { return RowsetDefinition.MdschemaMeasuresRowset.MDMEASURE_AGGR_SUM; } else if (agg == RolapAggregator.Count) { return RowsetDefinition.MdschemaMeasuresRowset.MDMEASURE_AGGR_COUNT; } else if (agg == RolapAggregator.Min) { return RowsetDefinition.MdschemaMeasuresRowset.MDMEASURE_AGGR_MIN; } else if (agg == RolapAggregator.Max) { return RowsetDefinition.MdschemaMeasuresRowset.MDMEASURE_AGGR_MAX; } else if (agg == RolapAggregator.Avg) { return RowsetDefinition.MdschemaMeasuresRowset.MDMEASURE_AGGR_AVG; } else { // TODO: what are VAR and STD return RowsetDefinition.MdschemaMeasuresRowset .MDMEASURE_AGGR_UNKNOWN; } } public void checkMemberOrdinal(Member member) throws OlapException { if (member.getOrdinal() == -1) { MondrianOlap4jMember olap4jMember = (MondrianOlap4jMember) member; final mondrian.olap.SchemaReader schemaReader = olap4jMember.olap4jSchema.olap4jCatalog.olap4jDatabaseMetaData .olap4jConnection.getMondrianConnection().getSchemaReader() .withLocus(); RolapMemberBase.setOrdinals(schemaReader, olap4jMember.member); } } public boolean shouldReturnCellProperty( CellSet cellSet, org.olap4j.metadata.Property cellProperty, boolean evenEmpty) { MondrianOlap4jCellSet olap4jCellSet = (MondrianOlap4jCellSet) cellSet; Query query = olap4jCellSet.query; return (evenEmpty && query.isCellPropertyEmpty()) || query.hasCellProperty(cellProperty.getName()); } public List getSchemaRoleNames(Schema schema) { MondrianOlap4jSchema olap4jSchema = (MondrianOlap4jSchema) schema; // TODO: this returns ALL roles, no the current user's roles return new ArrayList( ((RolapSchema) olap4jSchema.schema).roleNames()); } public String getSchemaId(Schema schema) { return ((MondrianOlap4jSchema)schema).schema.getId(); } public String getCubeType(Cube cube) { return (cube instanceof MondrianOlap4jCube) && ((RolapCube) ((MondrianOlap4jCube) cube).cube).isVirtual() ? RowsetDefinition.MdschemaCubesRowset.MD_CUBTYPE_VIRTUAL_CUBE : RowsetDefinition.MdschemaCubesRowset.MD_CUBTYPE_CUBE; } public boolean isLevelUnique(Level level) { MondrianOlap4jLevel olap4jLevel = (MondrianOlap4jLevel) level; return (olap4jLevel.level instanceof RolapLevel) && ((RolapLevel) olap4jLevel.level).isUnique(); } public List getLevelProperties(Level level) { MondrianOlap4jLevel olap4jLevel = (MondrianOlap4jLevel) level; return olap4jLevel.getProperties(false); } public boolean isPropertyInternal(org.olap4j.metadata.Property property) { MondrianOlap4jProperty olap4jProperty = (MondrianOlap4jProperty) property; return olap4jProperty.property.isInternal(); } public List> getDataSources(OlapConnection connection) throws OlapException { MondrianOlap4jConnection olap4jConnection = (MondrianOlap4jConnection) connection; MondrianServer server = MondrianServer.forConnection( olap4jConnection.getMondrianConnection()); final List> databases = server.getDatabases(olap4jConnection.getMondrianConnection()); // We can't let JdbcPassword leak out of the public API, so we remove // it here. This is only called by the XMLA servlets. for (Map db : databases) { String dsi = (String) db.get("DataSourceInfo"); if (dsi == null) { break; } PropertyList pl = Util.parseConnectString(dsi); boolean removed = pl.remove(RolapConnectionProperties.Jdbc.name()); removed |= pl.remove(RolapConnectionProperties.JdbcUser.name()); removed |= pl.remove(RolapConnectionProperties.JdbcPassword.name()); if (removed) { db.put("DataSourceInfo", pl.toString()); } } return databases; } public Map getAnnotationMap(MetadataElement element) throws SQLException { if (element instanceof OlapWrapper) { OlapWrapper wrapper = (OlapWrapper) element; if (wrapper.isWrapperFor(Annotated.class)) { final Annotated annotated = wrapper.unwrap(Annotated.class); final Map map = new HashMap(); for (Map.Entry entry : annotated.getAnnotationMap().entrySet()) { map.put(entry.getKey(), entry.getValue().getValue()); } return map; } } return Collections.emptyMap(); } public boolean canDrillThrough(Cell cell) { return ((MondrianOlap4jCell)cell).cell.canDrillThrough(); } public int getDrillThroughCount(Cell cell) { return ((MondrianOlap4jCell)cell).cell.getDrillThroughCount(); } public void flushSchemaCache(OlapConnection conn) throws OlapException { try { RolapConnection rConn = conn.unwrap(RolapConnection.class); rConn.getCacheControl(null).flushSchema( rConn.getSchema()); } catch (SQLException e) { throw new OlapException(e); } } public Object getMemberKey(Member m) throws OlapException { try { return ((MondrianOlap4jMember)m) .unwrap(RolapMemberBase.class).getKey(); } catch (SQLException e) { throw new OlapException(e); } } public Object getOrderKey(Member m) throws OlapException { try { return ((MondrianOlap4jMember)m) .unwrap(RolapMemberBase.class).getOrderKey(); } catch (SQLException e) { throw new OlapException(e); } } } // End MondrianOlap4jExtra.java mondrian-3.11.0.1-R/src/main/mondrian/olap4j/MondrianOlap4jHierarchy.java000066400000000000000000000101461261646570300260130ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.olap4j; import mondrian.olap.OlapElement; import org.olap4j.OlapException; import org.olap4j.impl.*; import org.olap4j.metadata.*; import java.util.List; /** * Implementation of {@link org.olap4j.metadata.Hierarchy} * for the Mondrian OLAP engine. * * @author jhyde * @since May 25, 2007 */ class MondrianOlap4jHierarchy extends MondrianOlap4jMetadataElement implements Hierarchy, Named { final MondrianOlap4jSchema olap4jSchema; final mondrian.olap.Hierarchy hierarchy; MondrianOlap4jHierarchy( MondrianOlap4jSchema olap4jSchema, mondrian.olap.Hierarchy hierarchy) { this.olap4jSchema = olap4jSchema; this.hierarchy = hierarchy; } public boolean equals(Object obj) { return obj instanceof MondrianOlap4jHierarchy && hierarchy.equals(((MondrianOlap4jHierarchy) obj).hierarchy); } public int hashCode() { return hierarchy.hashCode(); } public Dimension getDimension() { return new MondrianOlap4jDimension( olap4jSchema, hierarchy.getDimension()); } public NamedList getLevels() { final NamedList list = new NamedListImpl(); final MondrianOlap4jConnection olap4jConnection = olap4jSchema.olap4jCatalog.olap4jDatabaseMetaData.olap4jConnection; final mondrian.olap.SchemaReader schemaReader = olap4jConnection.getMondrianConnection2().getSchemaReader() .withLocus(); for (mondrian.olap.Level level : schemaReader.getHierarchyLevels(hierarchy)) { list.add(olap4jConnection.toOlap4j(level)); } return Olap4jUtil.cast(list); } public boolean hasAll() { return hierarchy.hasAll(); } public Member getDefaultMember() throws OlapException { final MondrianOlap4jConnection olap4jConnection = olap4jSchema.olap4jCatalog.olap4jDatabaseMetaData.olap4jConnection; final mondrian.olap.SchemaReader schemaReader = olap4jConnection.getMondrianConnection() .getSchemaReader().withLocus(); return olap4jConnection.toOlap4j( schemaReader.getHierarchyDefaultMember(hierarchy)); } public NamedList getRootMembers() throws OlapException { final MondrianOlap4jConnection olap4jConnection = olap4jSchema.olap4jCatalog.olap4jDatabaseMetaData.olap4jConnection; final List levelMembers = olap4jConnection.getMondrianConnection().getSchemaReader() .withLocus() .getLevelMembers( hierarchy.getLevels()[0], true); return new AbstractNamedList() { public String getName(Object member) { return ((Member)member).getName(); } public Member get(int index) { return olap4jConnection.toOlap4j(levelMembers.get(index)); } public int size() { return levelMembers.size(); } }; } public String getName() { return hierarchy.getName(); } public String getUniqueName() { return hierarchy.getUniqueName(); } public String getCaption() { return hierarchy.getLocalized( OlapElement.LocalizedProperty.CAPTION, olap4jSchema.getLocale()); } public String getDescription() { return hierarchy.getLocalized( OlapElement.LocalizedProperty.DESCRIPTION, olap4jSchema.getLocale()); } public boolean isVisible() { return hierarchy.isVisible(); } protected OlapElement getOlapElement() { return hierarchy; } } // End MondrianOlap4jHierarchy.java mondrian-3.11.0.1-R/src/main/mondrian/olap4j/MondrianOlap4jLevel.java000066400000000000000000000145171261646570300251520ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.olap4j; import mondrian.olap.*; import mondrian.rolap.RolapConnection; import mondrian.server.Locus; import org.olap4j.OlapException; import org.olap4j.impl.ArrayNamedListImpl; import org.olap4j.impl.Named; import org.olap4j.metadata.Dimension; import org.olap4j.metadata.Hierarchy; import org.olap4j.metadata.Level; import org.olap4j.metadata.Member; import org.olap4j.metadata.*; import org.olap4j.metadata.Property; import java.util.*; /** * Implementation of {@link Level} * for the Mondrian OLAP engine. * * @author jhyde * @since May 25, 2007 */ class MondrianOlap4jLevel extends MondrianOlap4jMetadataElement implements Level, Named { final MondrianOlap4jSchema olap4jSchema; final mondrian.olap.Level level; /** * Creates a MondrianOlap4jLevel. * * @param olap4jSchema Schema * @param level Mondrian level */ MondrianOlap4jLevel( MondrianOlap4jSchema olap4jSchema, mondrian.olap.Level level) { this.olap4jSchema = olap4jSchema; this.level = level; } public boolean equals(Object obj) { return obj instanceof MondrianOlap4jLevel && level.equals(((MondrianOlap4jLevel) obj).level); } public int hashCode() { return level.hashCode(); } public int getDepth() { return level.getDepth() - getDepthOffset(); } private int getDepthOffset() { final Role.HierarchyAccess accessDetails = olap4jSchema.olap4jCatalog.olap4jDatabaseMetaData.olap4jConnection .getMondrianConnection2().getRole().getAccessDetails( level.getHierarchy()); if (accessDetails == null) { return 0; } return accessDetails.getTopLevelDepth(); } public Hierarchy getHierarchy() { return new MondrianOlap4jHierarchy(olap4jSchema, level.getHierarchy()); } public Dimension getDimension() { return new MondrianOlap4jDimension(olap4jSchema, level.getDimension()); } public boolean isCalculated() { return false; } public Type getLevelType() { if (level.isAll()) { return Type.ALL; } switch (level.getLevelType()) { case Regular: return Type.REGULAR; case TimeDays: return Type.TIME_DAYS; case TimeHalfYears: return Type.TIME_HALF_YEAR; case TimeHours: return Type.TIME_HOURS; case TimeMinutes: return Type.TIME_MINUTES; case TimeMonths: return Type.TIME_MONTHS; case TimeQuarters: return Type.TIME_QUARTERS; case TimeSeconds: return Type.TIME_SECONDS; case TimeUndefined: return Type.TIME_UNDEFINED; case TimeWeeks: return Type.TIME_WEEKS; case TimeYears: return Type.TIME_YEARS; case Null: default: throw Util.unexpected(level.getLevelType()); } } public NamedList getProperties() { return getProperties(true); } /** * Returns a list of this level's properties, optionally including standard * properties that are available on every level. * *

NOTE: Not part of the olap4j API. * * @param includeStandard Whether to include standard properties * @return List of properties */ NamedList getProperties(boolean includeStandard) { final NamedList list = new ArrayNamedListImpl() { public String getName(Object property) { return ((Property)property).getName(); } }; // standard properties first if (includeStandard) { list.addAll( Arrays.asList(Property.StandardMemberProperty.values())); list.addAll(MondrianOlap4jProperty.MEMBER_EXTENSIONS.values()); } // then level-specific properties for (mondrian.olap.Property property : level.getProperties()) { list.add(new MondrianOlap4jProperty(property)); } return list; } public List getMembers() throws OlapException { final MondrianOlap4jConnection olap4jConnection = olap4jSchema.olap4jCatalog.olap4jDatabaseMetaData.olap4jConnection; final RolapConnection mondrianConnection = olap4jConnection.getMondrianConnection(); return Locus.execute( mondrianConnection, "Reading members of level", new Locus.Action>() { public List execute() { final mondrian.olap.SchemaReader schemaReader = mondrianConnection.getSchemaReader().withLocus(); final List levelMembers = schemaReader.getLevelMembers(level, true); return new AbstractList() { public Member get(int index) { return olap4jConnection.toOlap4j( levelMembers.get(index)); } public int size() { return levelMembers.size(); } }; } }); } public String getName() { return level.getName(); } public String getUniqueName() { return level.getUniqueName(); } public String getCaption() { return level.getLocalized( OlapElement.LocalizedProperty.CAPTION, olap4jSchema.getLocale()); } public String getDescription() { return level.getLocalized( OlapElement.LocalizedProperty.DESCRIPTION, olap4jSchema.getLocale()); } public int getCardinality() { return level.getApproxRowCount(); } public boolean isVisible() { return level.isVisible(); } protected OlapElement getOlapElement() { return level; } } // End MondrianOlap4jLevel.java mondrian-3.11.0.1-R/src/main/mondrian/olap4j/MondrianOlap4jMeasure.java000066400000000000000000000043211261646570300254740ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.olap4j; import mondrian.olap.Property; import mondrian.rolap.*; import org.olap4j.metadata.Datatype; import org.olap4j.metadata.Measure; /** * Implementation of {@link org.olap4j.metadata.Measure} * for the Mondrian OLAP engine, * as a wrapper around a mondrian * {@link mondrian.rolap.RolapStoredMeasure}. * * @author jhyde * @since Dec 10, 2007 */ class MondrianOlap4jMeasure extends MondrianOlap4jMember implements Measure { MondrianOlap4jMeasure( MondrianOlap4jSchema olap4jSchema, RolapMeasure measure) { super(olap4jSchema, measure); } public Aggregator getAggregator() { if (!(member instanceof RolapStoredMeasure)) { return Aggregator.UNKNOWN; } final RolapAggregator aggregator = ((RolapStoredMeasure) member).getAggregator(); if (aggregator == RolapAggregator.Avg) { return Aggregator.AVG; } else if (aggregator == RolapAggregator.Count) { return Aggregator.COUNT; } else if (aggregator == RolapAggregator.DistinctCount) { return Aggregator.UNKNOWN; } else if (aggregator == RolapAggregator.Max) { return Aggregator.MAX; } else if (aggregator == RolapAggregator.Min) { return Aggregator.MIN; } else if (aggregator == RolapAggregator.Sum) { return Aggregator.SUM; } else { return Aggregator.UNKNOWN; } } public Datatype getDatatype() { final String datatype = (String) member.getPropertyValue(Property.DATATYPE.getName()); if (datatype != null) { if (datatype.equals("Integer")) { return Datatype.INTEGER; } else if (datatype.equals("Numeric")) { return Datatype.DOUBLE; } } return Datatype.STRING; } } // End MondrianOlap4jMeasure.java mondrian-3.11.0.1-R/src/main/mondrian/olap4j/MondrianOlap4jMember.java000066400000000000000000000165161261646570300253130ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.olap4j; import mondrian.olap.OlapElement; import mondrian.rolap.RolapConnection; import mondrian.rolap.RolapMeasure; import mondrian.server.Locus; import org.olap4j.OlapException; import org.olap4j.impl.AbstractNamedList; import org.olap4j.impl.Named; import org.olap4j.mdx.ParseTreeNode; import org.olap4j.metadata.*; import java.util.ArrayList; import java.util.List; /** * Implementation of {@link Member} * for the Mondrian OLAP engine, * as a wrapper around a mondrian * {@link mondrian.olap.Member}. * * @author jhyde * @since May 25, 2007 */ class MondrianOlap4jMember extends MondrianOlap4jMetadataElement implements Member, Named { final mondrian.olap.Member member; final MondrianOlap4jSchema olap4jSchema; MondrianOlap4jMember( MondrianOlap4jSchema olap4jSchema, mondrian.olap.Member mondrianMember) { assert mondrianMember != null; assert mondrianMember instanceof RolapMeasure == this instanceof MondrianOlap4jMeasure; this.olap4jSchema = olap4jSchema; this.member = mondrianMember; } public boolean equals(Object obj) { return obj instanceof MondrianOlap4jMember && member.equals(((MondrianOlap4jMember) obj).member); } public int hashCode() { return member.hashCode(); } public String toString() { return getUniqueName(); } public NamedList getChildMembers() throws OlapException { final RolapConnection conn = olap4jSchema.olap4jCatalog.olap4jDatabaseMetaData .olap4jConnection.getMondrianConnection(); final List children = Locus.execute( conn, "MondrianOlap4jMember.getChildMembers", new Locus.Action>() { public List execute() { return conn.getSchemaReader() .getMemberChildren(member); } }); return new AbstractNamedList() { public String getName(Object member) { return ((MondrianOlap4jMember)member).getName(); } public MondrianOlap4jMember get(int index) { return new MondrianOlap4jMember( olap4jSchema, children.get(index)); } public int size() { return children.size(); } }; } public int getChildMemberCount() throws OlapException { final RolapConnection conn = olap4jSchema.olap4jCatalog.olap4jDatabaseMetaData .olap4jConnection.getMondrianConnection(); return Locus.execute( conn, "MondrianOlap4jMember.getChildMemberCount", new Locus.Action() { public Integer execute() { return conn.getSchemaReader() .getMemberChildren(member).size(); } }); } public MondrianOlap4jMember getParentMember() { final mondrian.olap.Member parentMember = member.getParentMember(); if (parentMember == null) { return null; } final RolapConnection conn = olap4jSchema.olap4jCatalog.olap4jDatabaseMetaData .olap4jConnection.getMondrianConnection2(); final boolean isVisible = Locus.execute( conn, "MondrianOlap4jMember.getParentMember", new Locus.Action() { public Boolean execute() { return conn.getSchemaReader() .isVisible(parentMember); } }); if (!isVisible) { return null; } return new MondrianOlap4jMember(olap4jSchema, parentMember); } public Level getLevel() { return new MondrianOlap4jLevel(olap4jSchema, member.getLevel()); } public Hierarchy getHierarchy() { return new MondrianOlap4jHierarchy( olap4jSchema, member.getHierarchy()); } public Dimension getDimension() { return new MondrianOlap4jDimension( olap4jSchema, member.getDimension()); } public Type getMemberType() { return Type.valueOf(member.getMemberType().name()); } public boolean isAll() { return member.isAll(); } public boolean isChildOrEqualTo(Member member) { throw new UnsupportedOperationException(); } public boolean isCalculated() { return getMemberType() == Type.FORMULA; } public int getSolveOrder() { return member.getSolveOrder(); } public ParseTreeNode getExpression() { throw new UnsupportedOperationException(); } public List getAncestorMembers() { final List list = new ArrayList(); MondrianOlap4jMember m = getParentMember(); while (m != null) { list.add(m); m = m.getParentMember(); } return list; } public boolean isCalculatedInQuery() { return member.isCalculatedInQuery(); } public Object getPropertyValue(Property property) { return member.getPropertyValue(property.getName()); } public String getPropertyFormattedValue(Property property) { return member.getPropertyFormattedValue(property.getName()); } public void setProperty(Property property, Object value) throws OlapException { member.setProperty(property.getName(), value); } public NamedList getProperties() { return getLevel().getProperties(); } public int getOrdinal() { final Number ordinal = (Number) member.getPropertyValue( Property.StandardMemberProperty.MEMBER_ORDINAL.getName()); return ordinal.intValue(); } public boolean isHidden() { return member.isHidden(); } public int getDepth() { return member.getDepth(); } public Member getDataMember() { final mondrian.olap.Member dataMember = member.getDataMember(); if (dataMember == null) { return null; } return new MondrianOlap4jMember(olap4jSchema, dataMember); } public String getName() { return member.getName(); } public String getUniqueName() { return member.getUniqueName(); } public String getCaption() { return member.getCaption(); } public String getDescription() { return member.getDescription(); } public boolean isVisible() { return (Boolean) member.getPropertyValue( mondrian.olap.Property.VISIBLE.getName()); } protected OlapElement getOlapElement() { return member; } } // End MondrianOlap4jMember.java mondrian-3.11.0.1-R/src/main/mondrian/olap4j/MondrianOlap4jMetadataElement.java000066400000000000000000000033411261646570300271260ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.olap4j; import mondrian.olap.OlapElement; import org.olap4j.OlapWrapper; import java.sql.SQLException; /** * Basic features of metadata elements in Mondrian's olap4j driver. * * @author jhyde */ abstract class MondrianOlap4jMetadataElement implements OlapWrapper { /** * Helper for {@link #unwrap(Class)} and {@link #isWrapperFor(Class)}. * * @param iface Desired interface * @param Type * @return This as desired interface, or null */ protected T unwrapImpl(Class iface) { if (iface.isInstance(this)) { return iface.cast(this); } final OlapElement element = getOlapElement(); if (element != null && iface.isInstance(element)) { return iface.cast(element); } else { return null; } } /** * Returns the Mondrian metadata element inside this wrapper, or null if * there is none. * * @return The Mondrian metadata element, if any */ protected abstract OlapElement getOlapElement(); public T unwrap(Class iface) throws SQLException { final T t = unwrapImpl(iface); if (t == null) { throw new SQLException("not a wrapper for " + iface); } return t; } public boolean isWrapperFor(Class iface) { return unwrapImpl(iface) != null; } } // End MondrianOlap4jMetadataElement.java mondrian-3.11.0.1-R/src/main/mondrian/olap4j/MondrianOlap4jNamedSet.java000066400000000000000000000040611261646570300255740ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.olap4j; import mondrian.olap.OlapElement; import org.olap4j.impl.Named; import org.olap4j.mdx.ParseTreeNode; import org.olap4j.metadata.Cube; import org.olap4j.metadata.NamedSet; /** * Implementation of {@link org.olap4j.metadata.NamedSet} * for the Mondrian OLAP engine. * * @author jhyde * @since Nov 12, 2007 */ class MondrianOlap4jNamedSet extends MondrianOlap4jMetadataElement implements NamedSet, Named { private final MondrianOlap4jCube olap4jCube; private mondrian.olap.NamedSet namedSet; MondrianOlap4jNamedSet( MondrianOlap4jCube olap4jCube, mondrian.olap.NamedSet namedSet) { this.olap4jCube = olap4jCube; this.namedSet = namedSet; } public Cube getCube() { return olap4jCube; } public ParseTreeNode getExpression() { final MondrianOlap4jConnection olap4jConnection = olap4jCube.olap4jSchema.olap4jCatalog.olap4jDatabaseMetaData .olap4jConnection; return olap4jConnection.toOlap4j(namedSet.getExp()); } public String getName() { return namedSet.getName(); } public String getUniqueName() { return namedSet.getUniqueName(); } public String getCaption() { return namedSet.getLocalized( OlapElement.LocalizedProperty.CAPTION, olap4jCube.olap4jSchema.getLocale()); } public String getDescription() { return namedSet.getLocalized( OlapElement.LocalizedProperty.DESCRIPTION, olap4jCube.olap4jSchema.getLocale()); } public boolean isVisible() { return namedSet.isVisible(); } protected OlapElement getOlapElement() { return namedSet; } } // End MondrianOlap4jNamedSet.java mondrian-3.11.0.1-R/src/main/mondrian/olap4j/MondrianOlap4jPreparedStatement.java000066400000000000000000000344301261646570300275260ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.olap4j; import mondrian.olap.*; import mondrian.util.Pair; import org.olap4j.*; import org.olap4j.metadata.Cube; import org.olap4j.metadata.Dimension; import org.olap4j.metadata.Hierarchy; import org.olap4j.metadata.Level; import org.olap4j.metadata.Member; import org.olap4j.type.*; import org.olap4j.type.DimensionType; import org.olap4j.type.LevelType; import java.io.InputStream; import java.io.Reader; import java.math.BigDecimal; import java.net.URL; import java.sql.*; import java.util.Calendar; /** * Implementation of {@link PreparedOlapStatement} * for the Mondrian OLAP engine. * *

This class has sub-classes which implement JDBC 3.0 and JDBC 4.0 APIs; * it is instantiated using {@link Factory#newPreparedStatement}.

* * @author jhyde * @since Jun 12, 2007 */ abstract class MondrianOlap4jPreparedStatement extends MondrianOlap4jStatement implements PreparedOlapStatement, OlapParameterMetaData { private final String mdx; // for debug MondrianOlap4jCellSetMetaData cellSetMetaData; /** * Creates a MondrianOlap4jPreparedStatement. * * @param olap4jConnection Connection * @param mdx MDX query string * * @throws OlapException if database error occurs */ protected MondrianOlap4jPreparedStatement( MondrianOlap4jConnection olap4jConnection, String mdx) throws OlapException { super(olap4jConnection); this.mdx = mdx; final Pair pair = parseQuery(mdx); this.query = pair.left; this.cellSetMetaData = pair.right; } // implement PreparedOlapStatement public CellSet executeQuery() throws OlapException { return executeOlapQueryInternal(query, cellSetMetaData); } public OlapParameterMetaData getParameterMetaData() throws OlapException { return this; } public Cube getCube() { return cellSetMetaData.getCube(); } // implement PreparedStatement public int executeUpdate() throws SQLException { throw new UnsupportedOperationException(); } public void setNull(int parameterIndex, int sqlType) throws SQLException { getParameter(parameterIndex).setValue(null); } public void setBoolean(int parameterIndex, boolean x) throws SQLException { getParameter(parameterIndex).setValue(x); } public void setByte(int parameterIndex, byte x) throws SQLException { getParameter(parameterIndex).setValue(x); } public void setShort(int parameterIndex, short x) throws SQLException { getParameter(parameterIndex).setValue(x); } public void setInt(int parameterIndex, int x) throws SQLException { getParameter(parameterIndex).setValue(x); } public void setLong(int parameterIndex, long x) throws SQLException { getParameter(parameterIndex).setValue(x); } public void setFloat(int parameterIndex, float x) throws SQLException { getParameter(parameterIndex).setValue(x); } public void setDouble(int parameterIndex, double x) throws SQLException { getParameter(parameterIndex).setValue(x); } public void setBigDecimal( int parameterIndex, BigDecimal x) throws SQLException { getParameter(parameterIndex).setValue(x); } public void setString(int parameterIndex, String x) throws SQLException { getParameter(parameterIndex).setValue(x); } public void setBytes(int parameterIndex, byte x[]) throws SQLException { getParameter(parameterIndex).setValue(x); } public void setDate(int parameterIndex, Date x) throws SQLException { getParameter(parameterIndex).setValue(x); } public void setTime(int parameterIndex, Time x) throws SQLException { getParameter(parameterIndex).setValue(x); } public void setTimestamp( int parameterIndex, Timestamp x) throws SQLException { getParameter(parameterIndex).setValue(x); } public void setAsciiStream( int parameterIndex, InputStream x, int length) throws SQLException { getParameter(parameterIndex).setValue(x); } public void setUnicodeStream( int parameterIndex, InputStream x, int length) throws SQLException { getParameter(parameterIndex).setValue(x); } public void setBinaryStream( int parameterIndex, InputStream x, int length) throws SQLException { getParameter(parameterIndex).setValue(x); } public void clearParameters() throws SQLException { throw new UnsupportedOperationException(); } public void setObject( int parameterIndex, Object x, int targetSqlType) throws SQLException { getParameter(parameterIndex).setValue(x); } public void setObject(int parameterIndex, Object x) throws SQLException { final Parameter parameter = getParameter(parameterIndex); if (x instanceof MondrianOlap4jMember) { MondrianOlap4jMember mondrianOlap4jMember = (MondrianOlap4jMember) x; x = mondrianOlap4jMember.member; } parameter.setValue(x); } public boolean execute() throws SQLException { throw new UnsupportedOperationException(); } public void addBatch() throws SQLException { throw new UnsupportedOperationException(); } public void setCharacterStream( int parameterIndex, Reader reader, int length) throws SQLException { throw new UnsupportedOperationException(); } public void setRef(int parameterIndex, Ref x) throws SQLException { throw new UnsupportedOperationException(); } public void setBlob(int parameterIndex, Blob x) throws SQLException { throw new UnsupportedOperationException(); } public void setClob(int parameterIndex, Clob x) throws SQLException { throw new UnsupportedOperationException(); } public void setArray(int parameterIndex, Array x) throws SQLException { throw new UnsupportedOperationException(); } public CellSetMetaData getMetaData() { return cellSetMetaData; } public void setDate( int parameterIndex, Date x, Calendar cal) throws SQLException { throw new UnsupportedOperationException(); } public void setTime( int parameterIndex, Time x, Calendar cal) throws SQLException { throw new UnsupportedOperationException(); } public void setTimestamp( int parameterIndex, Timestamp x, Calendar cal) throws SQLException { throw new UnsupportedOperationException(); } public void setNull( int parameterIndex, int sqlType, String typeName) throws SQLException { throw new UnsupportedOperationException(); } public void setURL(int parameterIndex, URL x) throws SQLException { throw new UnsupportedOperationException(); } public void setObject( int parameterIndex, Object x, int targetSqlType, int scaleOrLength) throws SQLException { throw new UnsupportedOperationException(); } // implement OlapParameterMetaData public String getParameterName(int param) throws OlapException { Parameter paramDef = getParameter(param); return paramDef.getName(); } private Parameter getParameter(int param) throws OlapException { final Parameter[] parameters = query.getParameters(); if (param < 1 || param > parameters.length) { //noinspection ThrowableResultOfMethodCallIgnored throw this.olap4jConnection.helper.toOlapException( this.olap4jConnection.helper.createException( "parameter ordinal " + param + " out of range")); } return parameters[param - 1]; } public Type getParameterOlapType(int param) throws OlapException { Parameter paramDef = getParameter(param); return olap4jConnection.toOlap4j(paramDef.getType()); } public int getParameterCount() { return query.getParameters().length; } public int isNullable(int param) throws SQLException { return ParameterMetaData.parameterNullableUnknown; } public boolean isSigned(int param) throws SQLException { final Type type = getParameterOlapType(param); return type instanceof NumericType; } public int getPrecision(int param) throws SQLException { final Type type = getParameterOlapType(param); if (type instanceof NumericType) { return 0; // precision not applicable } if (type instanceof StringType) { return Integer.MAX_VALUE; } return 0; } public int getScale(int param) throws SQLException { return 0; // scale not applicable } public int getParameterType(int param) throws SQLException { final Type type = getParameterOlapType(param); if (type instanceof NumericType) { return Types.NUMERIC; } else if (type instanceof StringType) { return Types.VARCHAR; } else if (type instanceof NullType) { return Types.NULL; } else { return Types.OTHER; } } public String getParameterTypeName(int param) throws SQLException { final Type type = getParameterOlapType(param); return type.toString(); } public String getParameterClassName(int param) throws SQLException { final Type type = getParameterOlapType(param); return foo( new TypeHelper() { public Class booleanType(BooleanType type) { return Boolean.class; } public Class cubeType(CubeType cubeType) { return Cube.class; } public Class decimalType(DecimalType decimalType) { return Number.class; } public Class dimensionType( DimensionType dimensionType) { return Dimension.class; } public Class hierarchyType( HierarchyType hierarchyType) { return Hierarchy.class; } public Class levelType(LevelType levelType) { return Level.class; } public Class memberType(MemberType memberType) { return Member.class; } public Class nullType(NullType nullType) { return Void.class; } public Class numericType(NumericType numericType) { return Number.class; } public Class setType(SetType setType) { return Iterable.class; } public Class stringType(StringType stringType) { return String.class; } public Class tupleType(TupleType tupleType) { return Member[].class; } public Class symbolType(SymbolType symbolType) { // parameters cannot be of this type throw new UnsupportedOperationException(); } }, type).getName(); } public int getParameterMode(int param) throws SQLException { Parameter paramDef = getParameter(param); // forces param range check Util.discard(paramDef); return ParameterMetaData.parameterModeIn; } public boolean isSet(int parameterIndex) throws SQLException { return getParameter(parameterIndex).isSet(); } public void unset(int parameterIndex) throws SQLException { getParameter(parameterIndex).unsetValue(); } // Helper classes private interface TypeHelper { T booleanType(BooleanType type); T cubeType(CubeType cubeType); T decimalType(DecimalType decimalType); T dimensionType(DimensionType dimensionType); T hierarchyType(HierarchyType hierarchyType); T levelType(LevelType levelType); T memberType(MemberType memberType); T nullType(NullType nullType); T numericType(NumericType numericType); T setType(SetType setType); T stringType(StringType stringType); T tupleType(TupleType tupleType); T symbolType(SymbolType symbolType); } T foo(TypeHelper helper, Type type) { if (type instanceof BooleanType) { return helper.booleanType((BooleanType) type); } else if (type instanceof CubeType) { return helper.cubeType((CubeType) type); } else if (type instanceof DecimalType) { return helper.decimalType((DecimalType) type); } else if (type instanceof DimensionType) { return helper.dimensionType((DimensionType) type); } else if (type instanceof HierarchyType) { return helper.hierarchyType((HierarchyType) type); } else if (type instanceof LevelType) { return helper.levelType((LevelType) type); } else if (type instanceof MemberType) { return helper.memberType((MemberType) type); } else if (type instanceof NullType) { return helper.nullType((NullType) type); } else if (type instanceof NumericType) { return helper.numericType((NumericType) type); } else if (type instanceof SetType) { return helper.setType((SetType) type); } else if (type instanceof StringType) { return helper.stringType((StringType) type); } else if (type instanceof TupleType) { return helper.tupleType((TupleType) type); } else if (type instanceof SymbolType) { return helper.symbolType((SymbolType) type); } else { throw new UnsupportedOperationException(); } } } // End MondrianOlap4jPreparedStatement.java mondrian-3.11.0.1-R/src/main/mondrian/olap4j/MondrianOlap4jProperty.java000066400000000000000000000076701261646570300257310ustar00rootroot00000000000000/* // This software is subject to the terms of the Eclipse Public License v1.0 // Agreement, available at the following URL: // http://www.eclipse.org/legal/epl-v10.html. // You must accept the terms of that agreement to use this software. // // Copyright (C) 2003-2005 Julian Hyde // Copyright (C) 2005-2015 Pentaho // All Rights Reserved. */ package mondrian.olap4j; import org.olap4j.impl.Named; import org.olap4j.metadata.Datatype; import org.olap4j.metadata.Property; import java.util.HashSet; import java.util.LinkedHashMap; import java.util.Map; import java.util.Set; /** * Implementation of {@link org.olap4j.metadata.Property} * for the Mondrian OLAP engine, * as a wrapper around a mondrian * {@link mondrian.olap.Property}. * * @author jhyde * @since Nov 12, 2007 */ class MondrianOlap4jProperty implements IMondrianOlap4jProperty, Named { /** * Map of member properties that are built into Mondrian but are not in the * olap4j standard. */ static final Map MEMBER_EXTENSIONS = new LinkedHashMap(); /** * Map of cell properties that are built into Mondrian but are not in the * olap4j standard. */ static final Map CELL_EXTENSIONS = new LinkedHashMap(); static { // Build set of names of olap4j standard member properties. final Set memberNames = new HashSet(); for (Property property : Property.StandardMemberProperty.values()) { memberNames.add(property.getName()); } final Set cellNames = new HashSet(); for (Property property : StandardCellProperty.values()) { cellNames.add(property.getName()); } for (mondrian.olap.Property o : mondrian.olap.Property.enumeration.getValuesSortedByName()) { if (o.isMemberProperty() && !memberNames.contains(o.getName())) { MEMBER_EXTENSIONS.put( o.getName(), new MondrianOlap4jProperty(o)); } if (o.isCellProperty() && !cellNames.contains(o.getName())) { CELL_EXTENSIONS.put( o.getName(), new MondrianOlap4jProperty(o)); } } } final mondrian.olap.Property property; MondrianOlap4jProperty(mondrian.olap.Property property) { this.property = property; } mondrian.olap.Level level; MondrianOlap4jProperty (mondrian.olap.Property property, mondrian.olap.Level level) { this(property); this.level = level; } public Datatype getDatatype() { switch (property.getType()) { case TYPE_BOOLEAN: return Datatype.BOOLEAN; case TYPE_NUMERIC: return Datatype.UNSIGNED_INTEGER; case TYPE_STRING: return Datatype.STRING; case TYPE_OTHER: return Datatype.VARIANT; default: throw new RuntimeException("unexpected: " + property.getType()); } } public Set getType() { return property.isCellProperty() ? TypeFlag.CELL_TYPE_FLAG : TypeFlag.MEMBER_TYPE_FLAG; } public String getName() { return property.name; } public String getUniqueName() { return property.name; } public String getCaption() { // todo: i18n return property.getCaption(); } public String getDescription() { // todo: i18n return property.getDescription(); } public boolean isVisible() { return !property.isInternal(); } public ContentType getContentType() { return ContentType.REGULAR; } public mondrian.olap.Level getLevel() { return level; } } // End MondrianOlap4jProperty.java mondrian-3.11.0.1-R/src/main/mondrian/olap4j/MondrianOlap4jSchema.java000066400000000000000000000076261261646570300253060ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.olap4j; import mondrian.olap.Hierarchy; import mondrian.olap.OlapElement; import mondrian.olap.Role; import org.olap4j.OlapException; import org.olap4j.impl.*; import org.olap4j.metadata.*; import java.util.*; /** * Implementation of {@link org.olap4j.metadata.Schema} * for the Mondrian OLAP engine. * * @author jhyde * @since May 24, 2007 */ class MondrianOlap4jSchema extends MondrianOlap4jMetadataElement implements Schema, Named { final MondrianOlap4jCatalog olap4jCatalog; final String schemaName; final mondrian.olap.Schema schema; /** * Creates a MondrianOlap4jSchema. * *

The name of the schema is not necessarily the same as * schema.getName(). If schema was loaded in a datasources.xml file, the * name it was given there (in the <Catalog> element) trumps the name * in the catalog.xml file. * * @param olap4jCatalog Catalog containing schema * @param schemaName Name of schema * @param schema Mondrian schema */ MondrianOlap4jSchema( MondrianOlap4jCatalog olap4jCatalog, String schemaName, mondrian.olap.Schema schema) { this.olap4jCatalog = olap4jCatalog; this.schemaName = schemaName; this.schema = schema; } public Catalog getCatalog() { return olap4jCatalog; } public NamedList getCubes() throws OlapException { NamedList list = new NamedListImpl(); final MondrianOlap4jConnection olap4jConnection = olap4jCatalog.olap4jDatabaseMetaData.olap4jConnection; for (mondrian.olap.Cube cube : olap4jConnection.getMondrianConnection() .getSchemaReader().getCubes()) { list.add(olap4jConnection.toOlap4j(cube)); } return Olap4jUtil.cast(list); } public NamedList getSharedDimensions() throws OlapException { final MondrianOlap4jConnection olap4jConnection = olap4jCatalog.olap4jDatabaseMetaData.olap4jConnection; final SortedSet dimensions = new TreeSet( new Comparator() { public int compare( MondrianOlap4jDimension o1, MondrianOlap4jDimension o2) { return o1.getName().compareTo(o2.getName()); } } ); final Role role = olap4jConnection.getMondrianConnection().getRole(); for (Hierarchy hierarchy : schema.getSharedHierarchies()) { if (role.canAccess(hierarchy)) { dimensions.add( olap4jConnection.toOlap4j(hierarchy.getDimension())); } } NamedList list = new NamedListImpl(); list.addAll(dimensions); return Olap4jUtil.cast(list); } public Collection getSupportedLocales() throws OlapException { return Collections.emptyList(); } public String getName() { return schemaName; } /** * Shorthand for catalog.database.connection.getLocale(). * Not part of the olap4j api; do not make public. * * @return Locale of current connection */ final Locale getLocale() { return olap4jCatalog.olap4jDatabase.getOlapConnection().getLocale(); } protected OlapElement getOlapElement() { return null; } } // End MondrianOlap4jSchema.java mondrian-3.11.0.1-R/src/main/mondrian/olap4j/MondrianOlap4jStatement.java000066400000000000000000000362771261646570300260560ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.olap4j; import mondrian.calc.ResultStyle; import mondrian.olap.*; import mondrian.rolap.RolapConnection; import mondrian.server.*; import mondrian.util.Pair; import org.olap4j.*; import org.olap4j.layout.RectangularCellSetFormatter; import org.olap4j.mdx.*; import java.io.PrintWriter; import java.io.StringWriter; import java.sql.*; import java.util.Collections; import java.util.List; /** * Implementation of {@link org.olap4j.OlapStatement} * for the Mondrian OLAP engine. * * @author jhyde * @since May 24, 2007 */ abstract class MondrianOlap4jStatement extends StatementImpl implements OlapStatement, mondrian.server.Statement { final MondrianOlap4jConnection olap4jConnection; private boolean closed; /** * Support for {@link #closeOnCompletion()} method. */ protected boolean closeOnCompletion; /** * Current cell set, or null if the statement is not executing anything. * Any method which modifies this member must synchronize * on the MondrianOlap4jStatement. */ MondrianOlap4jCellSet openCellSet; MondrianOlap4jStatement( MondrianOlap4jConnection olap4jConnection) { assert olap4jConnection != null; this.olap4jConnection = olap4jConnection; this.closed = false; } // implement Statement public ResultSet executeQuery(String mdx) throws SQLException { return executeQuery2(mdx, false, null, null); } ResultSet executeQuery2( String mdx, boolean advanced, String tabFields, int[] rowCountSlot) throws SQLException { if (advanced) { // REVIEW: I removed 'executeDrillThroughAdvanced' in the cleanup. // Do we still need it? throw new UnsupportedOperationException(); } QueryPart parseTree; try { parseTree = olap4jConnection.getMondrianConnection().parseStatement(mdx); } catch (MondrianException e) { throw olap4jConnection.helper.createException( "mondrian gave exception while parsing query", e); } if (parseTree instanceof DrillThrough) { DrillThrough drillThrough = (DrillThrough) parseTree; final Query query = drillThrough.getQuery(); query.setResultStyle(ResultStyle.LIST); setQuery(query); CellSet cellSet = executeOlapQueryInternal(query, null); final List coords = Collections.nCopies( cellSet.getAxes().size(), 0); final MondrianOlap4jCell cell = (MondrianOlap4jCell) cellSet.getCell(coords); ResultSet resultSet = cell.drillThroughInternal( drillThrough.getMaxRowCount(), drillThrough.getFirstRowOrdinal(), drillThrough.getReturnList(), true, null, rowCountSlot); if (resultSet == null) { throw new OlapException( "Cannot do DrillThrough operation on the cell"); } return resultSet; } else if (parseTree instanceof Explain) { String plan = explainInternal(((Explain) parseTree).getQuery()); return olap4jConnection.factory.newFixedResultSet( olap4jConnection, Collections.singletonList("PLAN"), Collections.singletonList( Collections.singletonList(plan))); } else { throw olap4jConnection.helper.createException( "Query does not have relational result. Use a DRILLTHROUGH " + "query, or execute using the executeOlapQuery method."); } } private String explainInternal(QueryPart query) { final StringWriter sw = new StringWriter(); final PrintWriter pw = new PrintWriter(sw); query.explain(pw); pw.flush(); return sw.toString(); } public int executeUpdate(String sql) throws SQLException { throw new UnsupportedOperationException(); } public synchronized void close() { if (!closed) { closed = true; olap4jConnection.mondrianServer.removeStatement(this); if (openCellSet != null) { MondrianOlap4jCellSet c = openCellSet; openCellSet = null; c.close(); } } } public int getMaxFieldSize() throws SQLException { throw new UnsupportedOperationException(); } public void setMaxFieldSize(int max) throws SQLException { throw new UnsupportedOperationException(); } public int getMaxRows() throws SQLException { throw new UnsupportedOperationException(); } public void setMaxRows(int max) throws SQLException { throw new UnsupportedOperationException(); } public void setEscapeProcessing(boolean enable) throws SQLException { throw new UnsupportedOperationException(); } public int getQueryTimeout() throws SQLException { long timeoutSeconds = getQueryTimeoutMillis() / 1000; if (timeoutSeconds > Integer.MAX_VALUE) { return Integer.MAX_VALUE; } if (timeoutSeconds == 0 && getQueryTimeoutMillis() > 0) { // Don't return timeout=0 if e.g. timeoutMillis=500. 0 is special. return 1; } return (int) timeoutSeconds; } public void setQueryTimeout(int seconds) throws SQLException { if (seconds < 0) { throw olap4jConnection.helper.createException( "illegal timeout value " + seconds); } setQueryTimeoutMillis(seconds * 1000); } public synchronized void cancel() throws SQLException { if (openCellSet != null) { openCellSet.cancel(); } } public SQLWarning getWarnings() throws SQLException { throw new UnsupportedOperationException(); } public void clearWarnings() throws SQLException { throw new UnsupportedOperationException(); } public void setCursorName(String name) throws SQLException { throw new UnsupportedOperationException(); } public boolean execute(String sql) throws SQLException { throw new UnsupportedOperationException(); } public ResultSet getResultSet() throws SQLException { // NOTE: cell set becomes visible in this member while // executeOlapQueryInternal is still in progress, and before it has // finished executing. Its internal state may not be ready for API // calls. JDBC never claims to be thread-safe! (Except for calls to the // cancel method.) It is not possible to synchronize, because it would // block 'cancel'. return openCellSet; } public int getUpdateCount() throws SQLException { throw new UnsupportedOperationException(); } public boolean getMoreResults() throws SQLException { throw new UnsupportedOperationException(); } public void setFetchDirection(int direction) throws SQLException { throw new UnsupportedOperationException(); } public int getFetchDirection() throws SQLException { throw new UnsupportedOperationException(); } public void setFetchSize(int rows) throws SQLException { throw new UnsupportedOperationException(); } public int getFetchSize() throws SQLException { throw new UnsupportedOperationException(); } public int getResultSetConcurrency() throws SQLException { throw new UnsupportedOperationException(); } public int getResultSetType() throws SQLException { throw new UnsupportedOperationException(); } public void addBatch(String sql) throws SQLException { throw new UnsupportedOperationException(); } public void clearBatch() throws SQLException { throw new UnsupportedOperationException(); } public int[] executeBatch() throws SQLException { throw new UnsupportedOperationException(); } public OlapConnection getConnection() { return olap4jConnection; } public boolean getMoreResults(int current) throws SQLException { throw new UnsupportedOperationException(); } public ResultSet getGeneratedKeys() throws SQLException { throw new UnsupportedOperationException(); } public int executeUpdate( String sql, int autoGeneratedKeys) throws SQLException { throw new UnsupportedOperationException(); } public int executeUpdate( String sql, int columnIndexes[]) throws SQLException { throw new UnsupportedOperationException(); } public int executeUpdate( String sql, String columnNames[]) throws SQLException { throw new UnsupportedOperationException(); } public boolean execute( String sql, int autoGeneratedKeys) throws SQLException { throw new UnsupportedOperationException(); } public boolean execute( String sql, int columnIndexes[]) throws SQLException { throw new UnsupportedOperationException(); } public boolean execute( String sql, String columnNames[]) throws SQLException { throw new UnsupportedOperationException(); } public int getResultSetHoldability() throws SQLException { throw new UnsupportedOperationException(); } public boolean isClosed() throws SQLException { return closed; } public void setPoolable(boolean poolable) throws SQLException { throw new UnsupportedOperationException(); } public boolean isPoolable() throws SQLException { throw new UnsupportedOperationException(); } // implement Wrapper public T unwrap(Class iface) throws SQLException { if (iface.isInstance(this)) { return iface.cast(this); } throw olap4jConnection.helper.createException( "does not implement '" + iface + "'"); } public boolean isWrapperFor(Class iface) throws SQLException { return iface.isInstance(this); } // implement OlapStatement public CellSet executeOlapQuery(final String mdx) throws OlapException { final Pair pair = parseQuery(mdx); return executeOlapQueryInternal(pair.left, pair.right); } protected Pair parseQuery(final String mdx) throws OlapException { try { final RolapConnection mondrianConnection = getMondrianConnection(); return Locus.execute( mondrianConnection, "Parsing query", new Locus.Action>() { public Pair execute() { final Query query = (Query) mondrianConnection.parseStatement( MondrianOlap4jStatement.this, mdx, null, false); final MondrianOlap4jCellSetMetaData cellSetMetaData = new MondrianOlap4jCellSetMetaData( MondrianOlap4jStatement.this, query); return Pair.of(query, cellSetMetaData); } }); } catch (MondrianException e) { throw olap4jConnection.helper.createException( "mondrian gave exception while parsing query", e); } } /** * Executes a parsed query, closing any previously open cellset. * * * @param query Parsed query * @param cellSetMetaData Cell set metadata * @return Cell set * @throws OlapException if a database error occurs */ protected CellSet executeOlapQueryInternal( Query query, MondrianOlap4jCellSetMetaData cellSetMetaData) throws OlapException { // Close the previous open CellSet, if there is one. synchronized (this) { if (openCellSet != null) { final MondrianOlap4jCellSet cs = openCellSet; openCellSet = null; try { cs.close(); } catch (Exception e) { throw olap4jConnection.helper.createException( null, "Error while closing previous CellSet", e); } } if (olap4jConnection.preferList) { query.setResultStyle(ResultStyle.LIST); } this.query = query; openCellSet = olap4jConnection.factory.newCellSet(this); } // Release the monitor before executing, to give another thread the // opportunity to call cancel. try { openCellSet.execute(); } catch (QueryCanceledException e) { throw olap4jConnection.helper.createException( "Query canceled", e); } catch (QueryTimeoutException e) { throw olap4jConnection.helper.createException( e.getMessage(), e); } catch (MondrianException e) { throw olap4jConnection.helper.createException( "mondrian gave exception while executing query", e); } return openCellSet; } @Override public void start(Execution execution) { super.start(openCellSet); } public CellSet executeOlapQuery(SelectNode selectNode) throws OlapException { final String mdx = toString(selectNode); return executeOlapQuery(mdx); } public void addListener( CellSetListener.Granularity granularity, CellSetListener cellSetListener) throws OlapException { // Cell set listener API not supported in this version of mondrian. throw new UnsupportedOperationException(); } /** * Converts a {@link org.olap4j.mdx.ParseTreeNode} to MDX string. * * @param node Parse tree node * @return MDX text */ private static String toString(ParseTreeNode node) { StringWriter sw = new StringWriter(); PrintWriter pw = new PrintWriter(sw); ParseTreeWriter parseTreeWriter = new ParseTreeWriter(pw); node.unparse(parseTreeWriter); pw.flush(); return sw.toString(); } public RolapConnection getMondrianConnection() { try { return olap4jConnection.getMondrianConnection(); } catch (OlapException e) { throw new RuntimeException(e); } } /** * Called by each child result set (most likely a cell set) when it is * closed. * * @param resultSet Result set or cell set */ void onResultSetClose(ResultSet resultSet) { if (closeOnCompletion) { close(); } } } // End MondrianOlap4jStatement.java mondrian-3.11.0.1-R/src/main/mondrian/olap4j/Unsafe.java000066400000000000000000000024041261646570300225520ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.olap4j; import mondrian.olap.QueryTiming; import mondrian.spi.ProfileHandler; import org.olap4j.OlapStatement; import java.io.PrintWriter; /** * Access to non-public methods in the package of the mondrian olap4j driver. * *

All methods in this class are subject to change without notice. * * @author jhyde * @since October, 2010 */ public final class Unsafe { public static final Unsafe INSTANCE = new Unsafe(); private Unsafe() { } public void setStatementProfiling( OlapStatement statement, final PrintWriter pw) { ((MondrianOlap4jStatement) statement).enableProfiling( new ProfileHandler() { public void explain(String plan, QueryTiming timing) { pw.println(plan); if (timing != null) { pw.println(timing); } } } ); } } // End Unsafe.java mondrian-3.11.0.1-R/src/main/mondrian/olap4j/package.html000066400000000000000000000001121261646570300227410ustar00rootroot00000000000000 olap4j driver for the Mondrian OLAP engine. mondrian-3.11.0.1-R/src/main/mondrian/parser/000077500000000000000000000000001261646570300205715ustar00rootroot00000000000000mondrian-3.11.0.1-R/src/main/mondrian/parser/JavaccParserValidatorImpl.java000066400000000000000000000062441261646570300264760ustar00rootroot00000000000000/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.parser; import mondrian.olap.*; import mondrian.server.Statement; /** * Default implementation of {@link MdxParserValidator}, using the * JavaCC parser generator. * * @author jhyde */ public class JavaccParserValidatorImpl implements MdxParserValidator { private final QueryPartFactory factory; /** * Creates a JavaccParserValidatorImpl. */ public JavaccParserValidatorImpl() { this(new Parser.FactoryImpl()); } /** * Creates a JavaccParserValidatorImpl with an explicit factory for parse * tree nodes. * * @param factory Factory for parse tree nodes */ public JavaccParserValidatorImpl(QueryPartFactory factory) { this.factory = factory; } public QueryPart parseInternal( Statement statement, String queryString, boolean debug, FunTable funTable, boolean strictValidation) { final MdxParserImpl mdxParser = new MdxParserImpl( factory, statement, queryString, debug, funTable, strictValidation); try { return mdxParser.statementEof(); } catch (ParseException e) { throw convertException(queryString, e); } } public Exp parseExpression( Statement statement, String queryString, boolean debug, FunTable funTable) { final MdxParserImpl mdxParser = new MdxParserImpl( factory, statement, queryString, debug, funTable, false); try { return mdxParser.expressionEof(); } catch (ParseException e) { throw convertException(queryString, e); } } /** * Converts the exception so that it looks like the exception produced by * JavaCUP. (Not that that format is ideal, but it minimizes test output * changes during the transition from JavaCUP to JavaCC.) * * @param queryString MDX query string * @param pe JavaCC parse exception * @return Wrapped exception */ private RuntimeException convertException( String queryString, ParseException pe) { Exception e; if (pe.getMessage().startsWith("Encountered ")) { e = new MondrianException( "Syntax error at line " + pe.currentToken.next.beginLine + ", column " + pe.currentToken.next.beginColumn + ", token '" + pe.currentToken.next.image + "'"); } else { e = pe; } return Util.newError(e, "While parsing " + queryString); } } // End JavaccParserValidatorImpl.java mondrian-3.11.0.1-R/src/main/mondrian/parser/MdxParser.jj000066400000000000000000000666721261646570300230440ustar00rootroot00000000000000/* // This software is subject to the terms of the Eclipse Public License v1.0 // Agreement, available at the following URL: // http://www.eclipse.org/legal/epl-v10.html. // You must accept the terms of that agreement to use this software. // // Copyright (C) 2010-2011 Pentaho // All Rights Reserved. */ options { STATIC = false; IGNORE_CASE = true; UNICODE_INPUT = true; } PARSER_BEGIN(MdxParserImpl) package mondrian.parser; import java.util.*; import java.io.StringReader; import java.math.BigDecimal; import mondrian.olap.*; import mondrian.mdx.*; import mondrian.parser.*; import mondrian.resource.MondrianResource; import mondrian.server.Statement; /** * MDX parser, generated from MdxParser.jj. * *

The public wrapper for this parser is {@link JavaccParserValidatorImpl}. * * @author jhyde * @since Dec 14, 2010 */ @SuppressWarnings({ "ConstantIfStatement", "UnnecessarySemicolon", "UnnecessaryLabelOnBreakStatement", "RedundantIfStatement" }) public class MdxParserImpl { private MdxParserValidator.QueryPartFactory factory; private Statement statement; private FunTable funTable; private boolean strictValidation; public MdxParserImpl( MdxParserValidator.QueryPartFactory factory, Statement statement, String queryString, boolean debug, FunTable funTable, boolean strictValidation) { this(new StringReader(term(queryString))); this.factory = factory; this.statement = statement; this.funTable = funTable; this.strictValidation = strictValidation; } private static String term(String s) { return s.endsWith("\n") ? s : (s + "\n"); } public void setTabSize(int tabSize) { jj_input_stream.setTabSize(tabSize); } Exp recursivelyParseExp(String s) throws ParseException { MdxParserImpl parser = new MdxParserImpl( factory, statement, s, false, funTable, strictValidation); return parser.expression(); } static Id[] toIdArray(List idList) { if (idList == null || idList.size() == 0) { return EmptyIdArray; } else { return idList.toArray(new Id[idList.size()]); } } static Exp[] toExpArray(List expList) { if (expList == null || expList.size() == 0) { return EmptyExpArray; } else { return expList.toArray(new Exp[expList.size()]); } } static Formula[] toFormulaArray(List formulaList) { if (formulaList == null || formulaList.size() == 0) { return EmptyFormulaArray; } else { return formulaList.toArray(new Formula[formulaList.size()]); } } static MemberProperty[] toMemberPropertyArray(List mpList) { if (mpList == null || mpList.size() == 0) { return EmptyMemberPropertyArray; } else { return mpList.toArray(new MemberProperty[mpList.size()]); } } static QueryPart[] toQueryPartArray(List qpList) { if (qpList == null || qpList.size() == 0) { return EmptyQueryPartArray; } else { return qpList.toArray(new QueryPart[qpList.size()]); } } static QueryAxis[] toQueryAxisArray(List qpList) { if (qpList == null || qpList.size() == 0) { return EmptyQueryAxisArray; } else { return qpList.toArray(new QueryAxis[qpList.size()]); } } private static final MemberProperty[] EmptyMemberPropertyArray = new MemberProperty[0]; private static final Exp[] EmptyExpArray = new Exp[0]; private static final Formula[] EmptyFormulaArray = new Formula[0]; private static final Id[] EmptyIdArray = new Id[0]; private static final QueryPart[] EmptyQueryPartArray = new QueryPart[0]; private static final QueryAxis[] EmptyQueryAxisArray = new QueryAxis[0]; private static final String DQ = '"' + ""; private static final String DQDQ = DQ + DQ; private static String stripQuotes( String s, String prefix, String suffix, String quoted) { assert s.startsWith(prefix) && s.endsWith(suffix); s = s.substring(prefix.length(), s.length() - suffix.length()); s = Util.replace(s, quoted, suffix); return s; } private Exp createCall( Exp left, Id.Segment segment, List argList) { final String name = segment instanceof Id.NameSegment ? ((Id.NameSegment) segment).name : null; if (argList != null) { if (left != null) { // Method syntax: "x.foo(arg1, arg2)" or "x.foo()" argList.add(0, left); return new UnresolvedFunCall( name, Syntax.Method, toExpArray(argList)); } else { // Function syntax: "foo(arg1, arg2)" or "foo()" return new UnresolvedFunCall( name, Syntax.Function, toExpArray(argList)); } } else { // Member syntax: "foo.bar" // or property syntax: "foo.RESERVED_WORD" Syntax syntax; boolean call = false; switch (segment.quoting) { case UNQUOTED: syntax = Syntax.Property; call = funTable.isProperty(name); break; case QUOTED: syntax = Syntax.QuotedProperty; break; default: syntax = Syntax.AmpersandQuotedProperty; break; } if (left instanceof Id && !call) { return ((Id) left).append(segment); } else if (left == null) { return new Id(segment); } else { return new UnresolvedFunCall( name, syntax, new Exp[] {left}); } } } } PARSER_END(MdxParserImpl) // ---------------------------------------------------------------------------- // Keywords and reserved words. TOKEN : { | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | } // White space SKIP : { " " | "\t" | "\n" | "\r" | "\f" } // Comments MORE : { <"/**" ~["/"]> : IN_FORMAL_COMMENT } MORE : { "//" : IN_SINGLE_LINE_COMMENT | "--" : IN_SINGLE_LINE_COMMENT | "/*" : IN_MULTI_LINE_COMMENT } SPECIAL_TOKEN : { : DEFAULT } SPECIAL_TOKEN : { : DEFAULT } SPECIAL_TOKEN : { : DEFAULT } MORE : { < ~[] > } // Operators and other symbols TOKEN : { < ASTERISK: "*" > | < BANG: "!" > | < COLON : ":" > | < COMMA : "," > | < CONCAT : "||" > | < DOT : "." > | < EQ : "=" > | < GE : ">=" > | < GT : ">" > | < LBRACE : "{" > | < LE : "<=" > | < LPAREN : "(" > | < LT : "<" > | < MINUS : "-" > | < NE : "<>" > | < PLUS : "+" > | < RBRACE : "}" > | < RPAREN : ")" > | < SOLIDUS : "/" > } // Literals TOKEN : { < UNSIGNED_INTEGER_LITERAL: (["0"-"9"])+ > | < APPROX_NUMERIC_LITERAL: ( | ) > | < DECIMAL_NUMERIC_LITERAL: (["0"-"9"])+(".")?(["0"-"9"])* | "."(["0"-"9"])+ > | < #EXPONENT: ["e","E"] (["+","-"])? (["0"-"9"])+ > | < SINGLE_QUOTED_STRING: "'" ( (~["'"]) | ("''"))* "'" > | < DOUBLE_QUOTED_STRING: "\"" ( (~["\""]) | ("\"\""))* "\"" > | < #WHITESPACE: [ " ","\t","\n","\r","\f" ] > } // Identifiers TOKEN : { < ID: ( | )* > | < QUOTED_ID: "[" ( (~["]","\n","\r"]) | ("]]") )* "]" > | < AMP_QUOTED_ID: "&" > | < AMP_UNQUOTED_ID: "&" ["a"-"z","A"-"Z"] ( | )* > | < #LETTER: [ "\u0024", "\u0041"-"\u005a", "\u005f", "\u0061"-"\u007a", "\u00c0"-"\u00d6", "\u00d8"-"\u00f6", "\u00f8"-"\u00ff", "\u0100"-"\u1fff", "\u3040"-"\u318f", "\u3300"-"\u337f", "\u3400"-"\u3d2d", "\u4e00"-"\u9fff", "\uf900"-"\ufaff" ] > | < #DIGIT: [ "\u0030"-"\u0039", "\u0660"-"\u0669", "\u06f0"-"\u06f9", "\u0966"-"\u096f", "\u09e6"-"\u09ef", "\u0a66"-"\u0a6f", "\u0ae6"-"\u0aef", "\u0b66"-"\u0b6f", "\u0be7"-"\u0bef", "\u0c66"-"\u0c6f", "\u0ce6"-"\u0cef", "\u0d66"-"\u0d6f", "\u0e50"-"\u0e59", "\u0ed0"-"\u0ed9", "\u1040"-"\u1049" ] > } // ---------------------------------------------------------------------------- // Entry points QueryPart statementEof() : { QueryPart qp; } { qp = statement() { return qp; } } Exp expressionEof() : { Exp e; } { e = expression() { return e; } } // ---------------------------------------------------------------------------- // Elements // // // ::= | Id.Segment identifier() : { Id.Segment segment; } { ( segment = nameSegment() | segment = keyIdentifier() ) { return segment; } } Id.NameSegment nameSegment() : { String id; } { id = keyword() { // Allow a non-reserved keyword to be converted back into an identifier // if it is not in a context where it is meaningful. return new Id.NameSegment(id, Id.Quoting.UNQUOTED); } | { return new Id.NameSegment(token.image, Id.Quoting.UNQUOTED); } | { return new Id.NameSegment( stripQuotes(token.image, "[", "]", "]]"), Id.Quoting.QUOTED); } } // for example '&foo&[1]&bar' in '[x].&foo&[1]&bar.[y]' Id.KeySegment keyIdentifier() : { List list = new ArrayList(); Id.NameSegment key; } { ( key = ampId() { list.add(key); } )+ { return new Id.KeySegment(list); } } Id.NameSegment ampId() : { } { { return new Id.NameSegment( stripQuotes(token.image, "&[", "]", "]]"), Id.Quoting.QUOTED); } | { return new Id.NameSegment( token.image.substring(1), Id.Quoting.UNQUOTED); } } // a keyword (unlike a reserved word) can be converted back into an // identifier in some contexts String keyword() : { } { { return "Dimension"; } | { return "Properties"; } } Id compoundId() : { Id.Segment i; List list = new ArrayList(); } { i = identifier() { list.add(i); } ( LOOKAHEAD() i = identifier() { list.add(i); } )* { return new Id(list); } } // ---------------------------------------------------------------------------- // Expressions Exp unaliasedExpression() : { Exp x, y; } { x = term5() ( y = term5() { x = new UnresolvedFunCall("OR", Syntax.Infix, new Exp[] {x, y}); } | y = term5() { x = new UnresolvedFunCall("XOR", Syntax.Infix, new Exp[] {x, y}); } | // range 'm1 : m2' yields set of members y = term5() { x = new UnresolvedFunCall(":", Syntax.Infix, new Exp[] {x, y}); } )* { return x; } } Exp term5() : { Exp x, y; } { x = term4() ( y = term4() { x = new UnresolvedFunCall("AND", Syntax.Infix, new Exp[] {x, y}); } )* { return x; } } Exp term4() : { Exp x; } { x = term3() { return x; } | x = term4() { return new UnresolvedFunCall("NOT", Syntax.Prefix, new Exp[] {x}); } } Exp term3() : { Exp x, y; Token op; } { x = term2() ( // e.g. "1 < 5" ( { op = token; } | { op = token; } | { op = token; } | { op = token; } | { op = token; } | { op = token; } ) y = term2() { x = new UnresolvedFunCall(op.image, Syntax.Infix, new Exp[] {x, y}); } | // We expect a shift-reduce conflict here, because NULL is a literal and // so is a valid argument to the IS operator. We want to shift. LOOKAHEAD(2) { x = new UnresolvedFunCall("IS NULL", Syntax.Postfix, new Exp[] {x}); } | // e.g. "x IS y"; but "x IS NULL" is handled elsewhere LOOKAHEAD(2) y = term2() { x = new UnresolvedFunCall("IS", Syntax.Infix, new Exp[] {x, y}); } | { x = new UnresolvedFunCall( "IS EMPTY", Syntax.Postfix, new Exp[] {x}); } | y = term2() { x = new UnresolvedFunCall("MATCHES", Syntax.Infix, new Exp[] {x, y}); } | LOOKAHEAD(2) y = term2() { x = new UnresolvedFunCall( "NOT", Syntax.Prefix, new Exp[] { new UnresolvedFunCall( "MATCHES", Syntax.Infix, new Exp[] {x, y})}); } | y = term2() { x = new UnresolvedFunCall("IN", Syntax.Infix, new Exp[] {x, y}); } | y = term2() { x = new UnresolvedFunCall( "NOT", Syntax.Prefix, new Exp[] { new UnresolvedFunCall( "IN", Syntax.Infix, new Exp[] {x, y})}); } )* { return x; } } Exp term2() : { Exp x, y; } { x = term() ( y = term() { x = new UnresolvedFunCall("+", Syntax.Infix, new Exp[] {x, y}); } | y = term() { x = new UnresolvedFunCall("-", Syntax.Infix, new Exp[] {x, y}); } | y = term() { x = new UnresolvedFunCall("||", Syntax.Infix, new Exp[] {x, y}); } )* { return x; } } Exp term() : { Exp x, y; } { x = factor() ( y = factor() { x = new UnresolvedFunCall("*", Syntax.Infix, new Exp[] {x, y}); } | y = factor() { x = new UnresolvedFunCall("/", Syntax.Infix, new Exp[] {x, y}); } )* { return x; } } Exp factor() : { Exp p; } { p = primary() { return p; } | p = primary() { return p; } | p = primary() { return new UnresolvedFunCall("-", Syntax.Prefix, new Exp[] {p}); } } Exp primary() : { Exp e; } { e = atom() ( e = segmentOrFuncall(e) )* { return e; } } Exp segmentOrFuncall(Exp left) : { Id.Segment segment; List argList = null; } { segment = identifier() ( ( LOOKAHEAD() { argList = Collections.emptyList(); } | argList = expOrEmptyList() ) )? { return createCall(left, segment, argList); } } Literal numericLiteral() : { } { { return Literal.create(new BigDecimal(token.image)); } | { return Literal.create(new BigDecimal(token.image)); } | { return Literal.create(new BigDecimal(token.image)); } } Exp atom() : { Exp e; Id.NameSegment segment; List lis; } { { return Literal.createString(stripQuotes(token.image, "'", "'", "''")); } | { return Literal.createString(stripQuotes(token.image, DQ, DQ, DQDQ)); } | e = numericLiteral() { return e; } | { return Literal.nullValue; } | e = unaliasedExpression() segment = nameSegment() { return new UnresolvedFunCall( "CAST", Syntax.Cast, new Exp[] { e, Literal.createSymbol(segment.name)}); } | lis = expList() { // Whereas ([Sales],[Time]) and () are tuples, ([Sales]) and (5) // are just expressions. return new UnresolvedFunCall( "()", Syntax.Parentheses, toExpArray(lis)); } | // set built from sets/tuples ( LOOKAHEAD() { lis = Collections.emptyList(); } | lis = expList() ) { return new UnresolvedFunCall( "{}", Syntax.Braces, toExpArray(lis)); } | e = caseExpression() { return e; } | // Function call "foo(a, b)" or "whiz!bang!foo(a, b)". // Properties "x.PROP" and methods "exp.meth(a)" are in primary(). segment = nameSegment() ( segment = nameSegment() { // We support the syntax for qualifying function names with package // names separated by bang ('!'), e.g. 'whiz!bang!foo(a, b)' // but currently we ignore the qualifiers. The previous example is // equivalent to 'foo(a, b)'. } )* ( ( LOOKAHEAD() { lis = Collections.emptyList(); } | lis = expOrEmptyList() ) | /* empty */ { lis = null; } ) { return createCall(null, segment, lis); } } Exp caseExpression() : { Exp e, e2; List list = new ArrayList(); boolean match = false; } { ( e = expression() { match = true; list.add(e); } )? ( e = expression() e2 = expression() { list.add(e); list.add(e2); } )* ( e = expression() { list.add(e); } )? { if (match) { return new UnresolvedFunCall( "_CaseMatch", Syntax.Case, toExpArray(list)); } else { return new UnresolvedFunCall( "_CaseTest", Syntax.Case, toExpArray(list)); } } } // ---------------------------------------------------------------------------- // Member Value Expression Exp expression() : { Exp e; Id.Segment i; } { e = unaliasedExpression() ( i = identifier() { Id id = new Id(i); e = new UnresolvedFunCall("AS", Syntax.Infix, new Exp[] {e, id}); } )* { return e; } } Exp expressionOrEmpty() : { Exp e; } { e = expression() { return e; } | /* empty */ { return new UnresolvedFunCall("", Syntax.Empty, new Exp[] {}); } } // Comma-separated list of expressions, some of which may be empty. Used // for functions. List expOrEmptyList() : { Exp e; List list = new LinkedList(); } { e = expressionOrEmpty() { list.add(e); } ( e = expressionOrEmpty() { list.add(e); } )* { return list; } } // List of expressions, none of which may be empty. List expList() : { Exp e; List list = new LinkedList(); } { e = expression() { list.add(e); } ( e = expression() { list.add(e); } )* { return list; } } // ---------------------------------------------------------------------------- // MDX Statement // // ::= // | // | // // ::= [WITH ] // SELECT [ // [, ...]] // FROM [] // [WHERE ] // [] // // ::= // DRILLTHROUGH // [ MAXROWS ] // [ FIRSTROWSET ] // // [ RETURN [, ...] ] // // ::= // EXPLAIN PLAN FOR ( | ) // QueryPart statement() : { QueryPart qp; } { ( qp = selectStatement() | qp = drillthroughStatement() | qp = explainStatement() ) { return qp; } } QueryPart selectOrDrillthroughStatement() : { QueryPart qp; } { qp = selectStatement() { return qp; } | qp = drillthroughStatement() { return qp; } } Query selectStatement() : { Formula e; List f = new ArrayList(); Exp w = null; QueryAxis i; List a = new ArrayList(); Id c, p; List cellPropList = new ArrayList(); } { ( ( e = memberSpecification() { f.add(e); } | e = setSpecification() { f.add(e); } )+ )?

Now it's time to look at the architecture of an OLAP system. See Mondrian architecture.