rvirding-luerl-772b25e/0000775000232200023220000000000015114130670015364 5ustar debalancedebalancervirding-luerl-772b25e/get_comp_opts.escript0000664000232200023220000000474415114130670021632 0ustar debalancedebalance#! /usr/bin/env escript %% -*- mode: erlang; indent-tabs-mode: nil -*- %% Define a number of compiler options. We first work out the current %% Erlang version and from the we can define the various options. %% Define the makefile variables HAS_MAPS, HAS_FULL_KEYS, %% NEW_REC_CORE, NEW_RAND, HAS_FLOOR, HAS_CEIL and NEW_STACKTRACE %% depending on version of Erlang. main(_) -> Version = otp_release(), CompOpts = comp_opts(Version), file:write_file("comp_opts.mk", "COMP_OPTS = " ++ CompOpts ++ "\n"). %% Get the release number. %% We have stolen the idea and most of the code from rebar3. otp_release() -> case erlang:system_info(otp_release) of [$R,N1|Rest] when is_integer(N1) -> %% If OTP <= R16, take the digits. [N1|Rest]; Rel -> %% If OTP >= 17.x, erlang:system_info(otp_release) returns %% just the major version number. File = filename:join([code:root_dir(),"releases",Rel,"OTP_VERSION"]), case file:read_file(File) of {error, _} -> Rel; {ok, Vsn} -> Size = byte_size(Vsn), %% The shortest vsn string consists of at least %% two digits followed by "\n". Therefore, it's %% safe to assume Size >= 3. case binary:part(Vsn, {Size, -3}) of <<"**\n">> -> binary:bin_to_list(Vsn, {0, Size - 3}); _ -> binary:bin_to_list(Vsn, {0, Size - 1}) end end end. comp_opts(Version) -> Copts0 = "-DERLANG_VERSION=\\\"" ++ Version ++ "\\\"" ++ " ", Copts0 ++ append_copts(Version, [{"17","HAS_MAPS"}, {"18","HAS_FULL_KEYS"}, {"19","NEW_REC_CORE"}, {"19","NEW_RAND"}, {"20","NEW_BOOL_GUARD"}, {"20","HAS_FLOOR"}, {"20","HAS_CEIL"}, {"21","NEW_STACKTRACE"}, {"23","EEP48"}, {"27","OTP27_MAYBE"}]). append_copts(Version, [{Ver,Opt}|Opts]) -> Rest = append_copts(Version, Opts), if Version >= Ver -> "-D" ++ Opt ++ "=true" ++ " " ++ Rest; true -> Rest end; append_copts(_Version, []) -> []. rvirding-luerl-772b25e/include/0000775000232200023220000000000015114130670017007 5ustar debalancedebalancervirding-luerl-772b25e/include/luerl.hrl0000664000232200023220000002163315114130670020646 0ustar debalancedebalance%% Copyright (c) 2013-2025 Robert Virding %% %% Licensed under the Apache License, Version 2.0 (the "License"); %% you may not use this file except in compliance with the License. %% You may obtain a copy of the License at %% %% http://www.apache.org/licenses/LICENSE-2.0 %% %% Unless required by applicable law or agreed to in writing, software %% distributed under the License is distributed on an "AS IS" BASIS, %% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. %% See the License for the specific language governing permissions and %% limitations under the License. %% File : luerl.hrl %% Author : Robert Virding %% Purpose : The basic macros/records for Luerl. %% We include the whole environment in one structure even if fields %% come from logically different parts. This make it easier to pass %% around but does mean that there will be more explicit fiddleling to %% get it right. See block/2 and functioncall/4 for examples of this. -record(luerl, {tabs, %Table table envs, %Environment table usds, %Userdata table fncs, %Function table g, %Global table %% stk=[], %Current stack cs=[], %Current call stack %% meta=[], %Data type metatables rand, %Random state tag, %Unique tag trace_func=none, %Trace function trace_data, %Trace data private=#{} }). %% Table structure. -record(tstruct, {data, %Data table/array free, %Index free list next %Next index }). %% Metatables for atomic datatypes. -record(meta, {nil=nil, boolean=nil, number=nil, string=nil }). %% Frames for the call stack. %% Call return frame -record(call_frame, {func,args, %Function, arguments lvs, %Local variables env, %Environment is=[], %Instructions cont=[] %Continuation }). %% Loop break frame -record(loop_frame, {lvs, %Local variables stk, %Stack env, %Environment is=[], %Instructions cont=[] %Continuation }). %% Current line -record(current_line, {line, %Line file %File name }). %% Return -record(return, {rets %Return values }). %% Data types. -record(tref, {i}). %Table reference, index -define(IS_TREF(T), is_record(T, tref)). -record(table, {a,d=[],meta=nil}). %Table type, array, dict, meta -record(eref, {i}). %Environment reference, index -define(IS_EREF(E), is_record(E, eref)). -record(usdref, {i}). %Userdata reference, index -define(IS_USDREF(U), is_record(U, usdref)). -record(userdata, {d,meta=nil}). %Userdata type, data and meta -record(thread, {}). %Thread type %% There are two function types, the Lua one, and the Erlang one. %% The environment with upvalues is defined when the function is %% referenced and can vary if the function is referenced many %% times. Hence it is in the reference not in the the definition. -record(funref, {i,env=[]}). %Function reference -define(IS_FUNREF(F), is_record(F, funref)). -record(lua_func,{anno=[], %Annotation funrefs=[], %Functions directly referenced lsz, %Local var size %% loc=not_used, %Local var block template esz, %Env var size %% env=not_used, %Local env block template pars, %Parameter types body}). %Code block -define(IS_LUAFUNC(F), is_record(F, lua_func)). -record(erl_func,{code}). %Erlang code (fun) -define(IS_ERLFUNC(F), is_record(F, erl_func)). -record(erl_mfa,{m,f,a}). %Erlang code (MFA) -define(IS_ERLMFA(F), is_record(F, erl_mfa)). %% Test if it a function, of either sort. -define(IS_FUNCTION(F), (?IS_FUNREF(F) orelse ?IS_ERLFUNC(F) orelse ?IS_ERLMFA(F))). %% Testing for integers/integer floats or booleans. -define(IS_FLOAT_INT(N), (round(N) == N)). -define(IS_FLOAT_INT(N,I), ((I=round(N)) == N)). -define(IS_TRUE(X), (((X) =/= nil) and ((X) =/= false))). %% %% Global type specifications. %% %% The basic Luerl state. -type luerlstate() :: #luerl{}. %% Luerl data. -type luerldata() :: nil | boolean() | binary() | number() | #tref{} | %Table reference #usdref{} | %Userdata reference #eref{} | %Environment reference #funref{} | %Lua function reference #erl_func{} | %Erlang function #erl_mfa{}. %Erlang Mod, Func, Arg. %% Different methods for storing tables in the global data #luerl{}. %% Access through macros to allow testing with different storage %% methods. This is inefficient with ETS tables where it would %% probably be better to use bags and access with match/select. %% Set which table store to use. We check if we have full maps before %% we use them just to protect ourselves. -ifdef(HAS_FULL_KEYS). -define(TS_USE_MAPS, true). -else. -define(TS_USE_ARRAY, true). -endif. %% -define(TS_USE_ARRAY, true). -ifdef(TS_USE_MAPS). -define(MAKE_TABLE(), maps:new()). -define(GET_TABLE(N, Ts), maps:get(N, Ts)). -define(SET_TABLE(N, T, Ts), maps:put(N, T, Ts)). -define(UPD_TABLE(N, Upd, Ts), maps:update_with(N, Upd, Ts)). -define(DEL_TABLE(N, Ts), maps:remove(N, Ts)). -define(CHK_TABLE(N, Ts), maps:is_key(N, Ts)). -define(FILTER_TABLES(Pred, Ts), maps:filter(Pred, Ts)). -define(FOLD_TABLES(Fun, Acc, Ts), maps:fold(Fun, Acc, Ts)). -endif. -ifdef(TS_USE_ARRAY). %% Use arrays to handle tables. We leave the default value as undefined. -define(MAKE_TABLE(), array:new()). -define(GET_TABLE(N, Ar), array:get(N, Ar)). -define(SET_TABLE(N, T, Ar), array:set(N, T, Ar)). -define(UPD_TABLE(N, Upd, Ar), array:set(N, (Upd)(array:get(N, Ar)), Ar)). -define(DEL_TABLE(N, Ar), array:reset(N, Ar)). -define(CHK_TABLE(N, Ar), ((N >= 0) andalso (array:get(N, Ar) =/= undefined))). -define(FILTER_TABLES(Pred, Ar), ((fun (___Def) -> ___Fil = fun (___K, ___V) -> case Pred(___K, ___V) of true -> ___V; false -> ___Def end end, array:sparse_map(___Fil, Ar) end)(array:default(Ar)))). -define(FOLD_TABLES(Fun, Acc, Ar), array:sparse_foldl(Fun, Acc, Ar)). -endif. -ifdef(TS_USE_ORDDICT). %% Using orddict to handle tables. -define(MAKE_TABLE(), orddict:new()). -define(GET_TABLE(N, Ts), orddict:fetch(N, Ts)). -define(SET_TABLE(N, T, Ts), orddict:store(N, T, Ts)). -define(UPD_TABLE(N, Upd, Ts), orddict:update(N, Upd, Ts)). -define(DEL_TABLE(N, Ts), orddict:erase(N, Ts)). -define(CHK_TABLE(N, Ts), orddict:is_key(N, Ts)). -define(FILTER_TABLES(Pred, Ts), orddict:filter(Pred, Ts)). -define(FOLD_TABLES(Fun, Acc, Ts), orddict:fold(Fun, Acc, Ts)). -endif. -ifdef(TS_USE_PD). %% Use the process dictionary to handle tables. -define(MAKE_TABLE(), ok). -define(GET_TABLE(N, Pd), get(N)). -define(SET_TABLE(N, T, Pd), put(N, T)). -define(UPD_TABLE(N, Upd, Pd), put(N, (Upd)(get(N)))). -define(DEL_TABLE(N, Pd), erase(N)). -define(CHK_TABLE(N, Pd), (get(N) =/= undefined)). -define(FILTER_TABLES(Pred, Pd), Pd). %This needs work -define(FOLD_TABLES(Fun, Acc, Pd), Pd). %This needs work -endif. -ifdef(TS_USE_ETS). %% Use ETS to handle tables. Must get return values right! -define(MAKE_TABLE(),ets:new(luerl_tables, [set])). -define(GET_TABLE(N, E), ets:lookup_element(E, N, 2)). -define(SET_TABLE(N, T, E), begin ets:insert(E, {N,T}), E end). -define(UPD_TABLE(N, Upd, E), begin ets:update_element(E, N, {2,(Upd)(ets:lookup_element(E, N, 2))}), E end). -define(DEL_TABLE(N, E), begin ets:delete(E, N), E end). -define(FILTER_TABLES(Pred, E), E). %This needs work -define(FOLD_TABLES(Fun, Acc, E), ets:foldl(fun ({___K, ___T}, ___Acc) -> Fun(___K, ___T, ___Acc) end, Acc, E)). -endif. %% Define CATCH to handle deprecated get_stacktrace/0 -ifdef(NEW_STACKTRACE). -define(CATCH(C, E, S), C:E:S ->). -else. -define(CATCH(C, E, S), C:E -> S = erlang:get_stacktrace(),). -endif. %% Define MODULEDOC and DOC to handle module and function documentation. -if(?OTP_RELEASE >= 27). -define(MODULEDOC(Str), -moduledoc(Str)). -define(DOC(Str), -doc(Str)). -else. -define(MODULEDOC(Str), -compile([])). -define(DOC(Str), -compile([])). -endif. rvirding-luerl-772b25e/README.md0000664000232200023220000000437515114130670016654 0ustar debalancedebalance# Luerl *An implementation of Lua in Erlang* [![Build Status](https://github.com/rvirding/luerl/workflows/Test/badge.svg)](https://github.com/rvirding/luerl/actions) [![Luerl Versions](https://img.shields.io/badge/luerl-1.1-blue.svg)](https://github.com/rvirding/luerl) [![Erlang Versions](https://img.shields.io/badge/erlang-24%20to%2026-blue.svg)](https://github.com/rvirding/luerl/blob/master/.github/workflows/ci.yml) [![Tag](https://img.shields.io/github/tag/rvirding/luerl.svg)](https://github.com/rvirding/luerl/tags) [![Project Logo]( https://github.com/rvirding/luerl/blob/develop/priv/images/logo.png?raw=true)](https://github.com/rvirding/luerl/priv/images/logo-large.png) **Alert**: The migration from Lua 5.2 to 5.3 is very much Work-In-Progress. Please test it but there are as yet no guarantees. ## About Luerl is an implementation of standard Lua 5.3 written in Erlang/OTP. Lua is a powerful, efficient, lightweight, embeddable scripting language common in games, IoT devices, AI bots, machine learning and scientific computing research. It supports procedural, object-oriented, functional, data-driven, reactive, organizational programming and data description. Being an extension language, Lua has no notion of a "main" program: it works as a library embedded in a host simple called the embedding program. The host program can invoke functions to execute a piece of Lua code, can write and read Lua variables, and can call Erlang functions by Lua code. Through the use of Erlang functions, Luerl can be augmented to cope with a wide range of different domains, creating a customized language sharing a syntactical framework. Luerl is implemented as a library, written in clean Erlang/OTP. For more information, read the [documentation](https://github.com/rvirding/luerl/wiki) and follow the [get started](https://github.com/rvirding/luerl/wiki/0.2-Getting-started) tutorial. You may also browse the [examples](https://github.com/rvirding/luerl/tree/develop/examples). ## Join the Community [Luerl on Discord](https://discord.gg/Y9Ww5wBhZh) [Luerl Forum - Erlang Forums](https://erlangforums.com/luerl) Luerl embraces both [#Erlang](https://twitter.com/hashtag/erlang?src=hash) and [#LuaLang](https://twitter.com/hashtag/lualang?src=hash) communities and ecosystems. rvirding-luerl-772b25e/rebar.config0000664000232200023220000000251115114130670017645 0ustar debalancedebalance%% -*- mode: erlang; indent-tabs-mode: nil -*- {erl_opts, [{debug_info, true}]}. {deps, []}. {shell, [ % {config, "config/sys.config"}, {apps, [luerl]} ]}. {relx, [{release, {luerl, "1.5.1"}, [kernel, stdlib, sasl, inets, luerl]}, {dev_mode, false}, {include_erts, true}, {extended_start_script, true}]}. {profiles, [ {test, [ {dist_node, [ {setcookie, 'ct'}, {sname, 'ct'} ]}, {ct_opts, [{logdir, "logs"}]} ]}, {otp_24, [ {xrl_opts, []}, {yrl_opts, []} ]}, {default, [ {xrl_opts, [{deterministic, true}]}, {yrl_opts, [{deterministic, true}]} ]} ]}. {project_plugins, [ rebar3_hex, {rebar3_ex_doc, "0.2.28"} ]}. {hex, [ {doc, #{provider => ex_doc}} ]}. {ex_doc, [ {source_url, <<"https://github.com/rvirding/luerl">>}, {extras, ["README.md", "CHANGELOG.md", "LICENSE"]}, {main, "readme"}, {logo, "priv/images/logo.png"}, {skip_undefined_reference_warnings_on, ["luerl_parse", "luerl_scan"]}, {groups_for_modules, [ {"Core API", [ luerl, %% luerl_old, luerl_sandbox ]}, {"Elixir API", [ 'Elixir.Luerl' %% 'Elixir.Luerl.Old' ]} ]} ]}. rvirding-luerl-772b25e/LICENSE0000664000232200023220000002613615114130670016401 0ustar debalancedebalance Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) 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. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright [yyyy] [name of copyright owner] Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. rvirding-luerl-772b25e/CHANGELOG.md0000664000232200023220000000355715114130670017207 0ustar debalancedebalance# Changelog All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ## Unreleased ## [1.5.1] ### Fixed - badges and logo in documentation - illegal_token displaying integer value instead of characters ## [1.5.0] ### Changed - luerl_io with some basic io functions added - main Luerl discussions moved from slack to discord - tostring can now handle __tostring and __name metakeys - add ex_doc and move current docs to doc_legacy to avoid collisions ### Fixed - luerl_scan is now Lua compliant and doesn't do utf-8 encoding - cleanup parser and fix handling of local functions - scanner now does Lua compliant numbers and strings - improve handling of string.format - add attributes for local variables - add typespecs to make dialyzer happy - improve documentation info in files - README now links to discord instead - fix pcall error messages ## [1.4.1] ### Fixed - Move `doc/` folder to `doc_legacy/` so it doesn't collide with `ex_doc` artificats ## [1.4.0] This version was not released to Hex.pm due to a build issue ### Changed - (breaking) `luerl:get_private` returns `{ok, Val} | error` tuple ### Fixed - files with only comments can now be loaded - atoms are now decoded as strings - Erlang functions that return errors are now properly propagated upward and state is updated - binary error messages captured in pcall are not formatted [unreleased]: https://github.com/olivierlacan/keep-a-changelog/compare/v1.4.1...HEAD [1.3.0]: https://github.com/rvirding/luerl/compare/v1.4.0...v1.4.1 [1.3.0]: https://github.com/rvirding/luerl/compare/v1.3.0...v1.4.0 [1.3.0]: https://github.com/rvirding/luerl/compare/v1.2.3...v1.3.0 [1.2.3]: https://github.com/rvirding/luerl/compare/v1.2.2...v1.2.3 rvirding-luerl-772b25e/VERSION0000664000232200023220000000000615114130670016430 0ustar debalancedebalance1.5.1 rvirding-luerl-772b25e/test/0000775000232200023220000000000015114130670016343 5ustar debalancedebalancervirding-luerl-772b25e/test/luerl_funcall_tests.erl0000664000232200023220000001740015114130670023122 0ustar debalancedebalance%%% @author Hans-Christian Esperer %%% @copyright (C) 2015, Hans-Christian Esperer %%% Licensed under the Apache License, Version 2.0 (the "License"); %%% you may not use this file except in compliance with the License. %%% You may obtain a copy of the License at %%% %%% http://www.apache.org/licenses/LICENSE-2.0 %%% %%% Unless required by applicable law or agreed to in writing, %%% software distributed under the License is distributed on an "AS %%% IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either %%% express or implied. See the License for the specific language %%% governing permissions and limitations under the License. %%% %%% @doc %% %%% @end %%% Created : 11 Jan 2015 by Hans-Christian Esperer -module(luerl_funcall_tests). -include_lib("eunit/include/eunit.hrl"). -import(luerl_lib, [lua_error/2]). -export([bad_return_value/3]). external_fun_test() -> State = luerl:init(), F = fun(Args, S) -> %% Must decode the args and encode the return value. [A] = luerl:decode_list(Args, S), luerl:encode_list([A + 2, [A + 3, A + 4]], S) end, {ok, State1} = luerl:set_table_keys_dec([<<"testFun">>], F, State), Chunk = <<"function test(i)\n" " local a, b = testFun(i)\n" " return (a == i + 2), (b[1] == i + 3), (b[2] == i + 4)\n" "end\n">>, {ok, _, State2} = luerl:do(Chunk, State1), {ok, Res, _State3} = luerl:call_function_dec([test], [2], State2), [BoolVal, BoolVal2, BoolVal3] = Res = [true,true,true], ?assertEqual(true, BoolVal), ?assertEqual(true, BoolVal2), ?assertEqual(true, BoolVal3). %% If an error happens in a function call inside Erlang, %% allow the user to propagate it up external_error_test() -> State = luerl:init(), F = fun([Func], S) -> case luerl:call(Func, [], S) of {ok, Ret, S1} -> {Ret, S1}; Error -> Error end end, {ok, State1} = luerl:set_table_keys_dec([<<"foo">>], F, State), Chunk = <<"global = 1\n" "local success, message =\n" " pcall(function()\n" " return foo(function()\n" " global = 2\n" " error(\"whoopsie\")\n" " return \"yay\"\n" " end)\n" "end)\n" "return global, success, message\n">>, {ok, [Global, Success, Message], _State2} = luerl:do(Chunk, State1), ?assertEqual(Global, 2), ?assertEqual(Success, false), ?assertEqual(Message, <<"whoopsie">>). pcall_error_test() -> State = luerl:init(), F = fun([Message], S) -> lua_error(Message, S) end, {ok, State1} = luerl:set_table_keys_dec([<<"foo">>], F, State), ?assertMatch({lua_error, <<"one">>, _State}, luerl:call_function_dec([foo], [<<"one">>], State1)), ?assertMatch({lua_error, <<"two">>, _State}, luerl:do(<<"return foo(\"two\")">>, State1)), ?assertMatch({ok, [false, <<"three!">>], _State}, luerl:do(<<"return pcall(function()\nreturn foo(\"three\")\nend)\n">>, State1)). bad_return_value_test() -> State = luerl:init(), F = fun(_Args, S) -> {bad_value, S} end, {ok, State1} = luerl:set_table_keys_dec([<<"foo">>], F, State), ?assertMatch({lua_error, illegal_return_value, _State}, luerl:call_function_dec([foo], [], State1)), Chunk = <<"return foo();">>, ?assertMatch({lua_error, illegal_return_value, _State}, luerl:do_dec(Chunk, State1)). propagate_error_mfa_pcall_test() -> State = luerl:init(), {ok, State1} = luerl:set_table_keys_dec([<<"foo">>], {luerl_funcall_tests, bad_return_value, []}, State), ?assertMatch({lua_error, something_bad_happened, _State}, luerl:call_function_dec([foo], [], State1)), Chunk = <<"global = 1\n" "local success, message =\n" "pcall(function()\n" " global = 2\n" " return foo();\n" "end)\n" "return global, success, message\n">>, ?assertMatch({ok, [2, false, <<"something_bad_happened!">>], _State}, luerl:do_dec(Chunk, State1)). bad_return_value_pcall_test() -> State = luerl:init(), F = fun(_Args, S) -> {bad_value, S} end, {ok, State1} = luerl:set_table_keys_dec([<<"foo">>], F, State), ?assertMatch({lua_error, illegal_return_value, _State}, luerl:call_function_dec([foo], [], State1)), Chunk = <<"global = 1\n" "local success, message =\n" "pcall(function()\n" " global = 2\n" " return foo();\n" "end)\n" "return global, success, message\n">>, ?assertMatch({ok, [2, false, <<"illegal format of return value">>], _State}, luerl:do_dec(Chunk, State1)). return_lib_function_test() -> State = luerl:init(), {ok, _, State1} = luerl:do(<<"function test()\n return string.find end\n">>, State), {ok, [{M,F,A}], _State2} = luerl:call_function_dec([test], [1], State1), {Res, _State3} = apply(M, F, [A, [<<"barfooblafasel">>, <<"foo">>], State1]), ?assertEqual([4, 6], Res). define_fun_in_lua_test() -> State = luerl:init(), Chunk = <<"function mkadder(incby)\n" " return function(i)\n" " print(\"Call into Luerl!\")\n" " return i + incby\n" " end\n" "end\n">>, {ok, _, State1} = luerl:do(Chunk, State), {ok, [Fun2], State2} = luerl:call_function_dec([mkadder], [1], State1), {ok, [Fun3], State3} = luerl:call_function_dec([mkadder], [2], State1), %% Should really decode the return value, but it is only a number. ?assertMatch({[5], _}, Fun2([4], State2)), ?assertMatch({[5.0],_}, Fun2([4.0], State2)), ?assertMatch({[6], _}, Fun3([4], State3)). define_fun2_in_lua_test() -> State = luerl:init(), Chunk = <<"function mklist(numentries)\n" " return function(entryval)\n" " local list = {}\n" " for i = 1,numentries do\n" " list[i] = entryval\n" " end\n" " return list\n" " end\n" "end\n">>, {ok, _, State1} = luerl:do(Chunk, State), %% Build a luerl function and safely call it. {Emklist, St2} = luerl:encode_list([mklist], State1), {ok, [Efunc5], St3} = luerl:call_function(Emklist, [5], St2), {ok, Res20, St4} = luerl:call_function(Efunc5, [4], St3), ?assertMatch([[{1,4}, {2,4}, {3,4}, {4,4}, {5,4}]], luerl:decode_list(Res20, St4)), %% Build an Erlang fun and just unsafely call it. {ok, [Fun2], State2} = luerl:call_function_dec([mklist], [5], State1), {Res21,State21} = Fun2([4], State2), ?assertMatch([[{1,4}, {2,4}, {3,4}, {4,4}, {5,4}]], luerl:decode_list(Res21, State21)), {Res22,State22} = Fun2([4.0], State2), ?assertMatch([[{1,4.0}, {2,4.0}, {3,4.0}, {4,4.0}, {5,4.0}]], luerl:decode_list(Res22, State22)), {ok, [Fun3], State3} = luerl:call_function_dec([mklist], [10], State1), {Res3, State31} = Fun3([4], State3), ?assertMatch([[{1,4}, {2,4}, {3,4}, {4,4}, {5,4}, {6,4}, {7,4}, {8,4}, {9,4}, {10,4}]], luerl:decode_list(Res3, State31)). newindex_metamethod_test() -> State = luerl:init(), Chunk = <<"local t = {}\n" "local m = setmetatable({}, {__newindex = function (tab, key, value)\n" "t[key] = value\n" "end})\n\n" "m[123] = 456\n" "return t[123], m[123]">>, {ok, [TVal, MVal], _State1} = luerl:do_dec(Chunk, State), ?assertEqual(456, TVal), ?assertEqual(nil, MVal). bad_return_value(_Arg, _Args, State) -> lua_error(something_bad_happened, State). rvirding-luerl-772b25e/test/luerl_old_funcall_tests.erl0000664000232200023220000000766115114130670023770 0ustar debalancedebalance%%% @author Hans-Christian Esperer %%% @copyright (C) 2015, Hans-Christian Esperer %%% Licensed under the Apache License, Version 2.0 (the "License"); %%% you may not use this file except in compliance with the License. %%% You may obtain a copy of the License at %%% %%% http://www.apache.org/licenses/LICENSE-2.0 %%% %%% Unless required by applicable law or agreed to in writing, %%% software distributed under the License is distributed on an "AS %%% IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either %%% express or implied. See the License for the specific language %%% governing permissions and limitations under the License. %%% %%% @doc %% %%% @end %%% Created : 11 Jan 2015 by Hans-Christian Esperer -module(luerl_old_funcall_tests). -include_lib("eunit/include/eunit.hrl"). external_fun_test() -> State = luerl_old:init(), F = fun([A], S) -> {[A + 2, [A + 3, A + 4]], S} end, State1 = luerl_old:set_table([<<"testFun">>], F, State), {_, State2} = luerl_old:do(<<"function test(i)\n local a, b = testFun(i)\n return (a == i + 2), (b[1] == i + 3), (b[2] == i + 4) end">>, State1), {Res, _State3} = luerl_old:call_function([test], [2], State2), [BoolVal, BoolVal2, BoolVal3] = Res, ?assertEqual(true, BoolVal), ?assertEqual(true, BoolVal2), ?assertEqual(true, BoolVal3). external_nostate_fun_test() -> State = luerl_old:init(), F = fun([A]) -> [A + 2, [A + 3, A + 4]] end, State1 = luerl_old:set_table([<<"testFun">>], F, State), Chunk = <<"function test(i)\n" " local a, b = testFun(i)\n" " return (a == i + 2), (b[1] == i + 3), (b[2] == i + 4)\n" "end">>, {_, State2} = luerl_old:do(Chunk, State1), {Res, _State3} = luerl_old:call_function([test], [2], State2), [BoolVal, BoolVal2, BoolVal3] = Res, ?assertEqual(true, BoolVal), ?assertEqual(true, BoolVal2), ?assertEqual(true, BoolVal3). return_lib_function_test() -> State = luerl_old:init(), {_, State1} = luerl_old:do(<<"function test()\n return string.find end\n">>, State), {[{M,F,A}], _State2} = luerl_old:call_function([test], [1], State1), {Res, _State3} = apply(M, F, [A, [<<"barfooblafasel">>, <<"foo">>], State1]), ?assertEqual([4, 6], Res). define_fun_in_lua_test() -> State = luerl_old:init(), Chunk = <<"function mkadder(incby)\n" " return function(i)\n" " print(\"Call into Luerl!\")\n" " return i + incby\n" " end\n" "end\n">>, {_, State1} = luerl_old:do(Chunk, State), {[Fun], _State2} = luerl_old:call_function([mkadder], [1], State1), {[Fun2], _State3} = luerl_old:call_function([mkadder], [2], State1), ?assertEqual([5], Fun([4])), ?assertEqual([5.0], Fun([4.0])), ?assertEqual([6], Fun2([4])). define_fun2_in_lua_test() -> State = luerl_old:init(), Chunk = <<"function mklist(numentries)\n" " return function(entryval)\n" " local list = {}\n" " for i = 1,numentries do\n" " list[i] = entryval\n" " end\n" " return list\n" " end\n" "end\n">>, {_, State1} = luerl_old:do(Chunk, State), {[Fun], _State2} = luerl_old:call_function([mklist], [5], State1), {[Fun2], _State3} = luerl_old:call_function([mklist], [10], State1), ?assertEqual([[{1,4}, {2,4}, {3,4}, {4,4}, {5,4}]], Fun([4])), ?assertEqual([[{1,4.0}, {2,4.0}, {3,4.0}, {4,4.0}, {5,4.0}]], Fun([4.0])), ?assertEqual([[{1,4}, {2,4}, {3,4}, {4,4}, {5,4}, {6,4}, {7,4}, {8,4}, {9,4}, {10,4}]], Fun2([4])). newindex_metamethod_test() -> State = luerl_old:init(), Chunk = <<"local t = {}\n" "local m = setmetatable({}, {__newindex = function (tab, key, value)\n" "t[key] = value\n" "end})\n\n" "m[123] = 456\n" "return t[123], m[123]">>, {[TVal, MVal], _State1} = luerl_old:do(Chunk, State), ?assertEqual(456, TVal), ?assertEqual(nil, MVal). rvirding-luerl-772b25e/test/Elixir.Luerl_tests.erl0000664000232200023220000000207215114130670022610 0ustar debalancedebalance%% Copyright (C) 2024 Robert Virding %% %% Licensed under the Apache License, Version 2.0 (the "License"); %% you may not use this file except in compliance with the License. %% You may obtain a copy of the License at %% %% http://www.apache.org/licenses/LICENSE-2.0 %% %% Unless required by applicable law or agreed to in writing, software %% distributed under the License is distributed on an "AS IS" BASIS, %% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. %% See the License for the specific language governing permissions and %% limitations under the License. -module('Elixir.Luerl_tests'). -include_lib("eunit/include/eunit.hrl"). private_test() -> State1 = 'Elixir.Luerl':init(), State2 = 'Elixir.Luerl':put_private(State1, secret, <<"mysecret">>), ?assertMatch({ok, <<"mysecret">>}, 'Elixir.Luerl':get_private(State2, secret)), ?assertMatch(error, 'Elixir.Luerl':get_private(State2, missing)), State3 = 'Elixir.Luerl':delete_private(State2, secret), ?assertMatch(error, 'Elixir.Luerl':get_private(State3, secret)). rvirding-luerl-772b25e/test/lib_os_SUITE.erl0000664000232200023220000001012115114130670021262 0ustar debalancedebalance%% Copyright (c) 2023 Mark Meeus %% %% Licensed under the Apache License, Version 2.0 (the "License"); %% you may not use this file except in compliance with the License. %% You may obtain a copy of the License at %% %% http://www.apache.org/licenses/LICENSE-2.0 %% %% Unless required by applicable law or agreed to in writing, software %% distributed under the License is distributed on an "AS IS" BASIS, %% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. %% See the License for the specific language governing permissions and %% limitations under the License. -module(lib_os_SUITE). -include_lib("common_test/include/ct.hrl"). -include_lib("eunit/include/eunit.hrl"). -export([all/0, groups/0]). -export([os_date_formatting/1, os_date_table/1, os_date_integrated/1, os_date_integrated_table/1]). all() -> [ {group, date_support}, {group, integrated} ]. groups() -> [ {date_support, [parallel], [os_date_formatting, os_date_table]}, {integrated, [parallel], [os_date_integrated, os_date_integrated_table]} ]. os_date_formatting(_) -> Date = {{2023, 1, 2}, {3, 4, 5}}, ?assertEqual(<<"2023">>, luerl_lib_os_date:format(Date, <<"%Y">>)), ?assertEqual(<<"23">>, luerl_lib_os_date:format(Date, <<"%y">>)), ?assertEqual(<<"02">>, luerl_lib_os_date:format(Date, <<"%d">>)), ?assertEqual(<<"01">>, luerl_lib_os_date:format(Date, <<"%m">>)), ?assertEqual(<<"03">>, luerl_lib_os_date:format(Date, <<"%H">>)), ?assertEqual(<<"04">>, luerl_lib_os_date:format(Date, <<"%M">>)), ?assertEqual(<<"05">>, luerl_lib_os_date:format(Date, <<"%S">>)), ?assertEqual(<<"01/02/23">>, luerl_lib_os_date:format(Date, <<"%x">>)), ?assertEqual(<<"03:04:05">>, luerl_lib_os_date:format(Date, <<"%X">>)), ?assertEqual(<<"1">>, luerl_lib_os_date:format(Date, <<"%w">>)), %% Day of week %% Hour in 12H ?assertEqual(<<"12">>, luerl_lib_os_date:format({{2023, 1, 2},{0,0,0}}, <<"%I">>)), ?assertEqual(<<"12">>, luerl_lib_os_date:format({{2023, 1, 2},{0,59,0}}, <<"%I">>)), ?assertEqual(<<"01">>, luerl_lib_os_date:format({{2023, 1, 2},{1,00,0}}, <<"%I">>)), ?assertEqual(<<"12">>, luerl_lib_os_date:format({{2023, 1, 2},{12,00,0}}, <<"%I">>)), ?assertEqual(<<"11">>, luerl_lib_os_date:format({{2023, 1, 2},{23,00,0}}, <<"%I">>)), ?assertEqual(<<"AM">>, luerl_lib_os_date:format({{2023, 1, 2},{0,0,0}}, <<"%p">>)), ?assertEqual(<<"AM">>, luerl_lib_os_date:format({{2023, 1, 2},{11, 59,0}}, <<"%p">>)), ?assertEqual(<<"PM">>, luerl_lib_os_date:format({{2023, 1, 2},{12,0,0}}, <<"%p">>)), ?assertEqual(<<"PM">>, luerl_lib_os_date:format({{2023, 1, 2},{23,59,0}}, <<"%p">>)), ?assertEqual(<<"09">>, luerl_lib_os_date:format({{2023, 1, 2},{9,0,0}}, <<"%I">>)), %% Hour in 12H ?assertEqual(<<"01">>, luerl_lib_os_date:format(Date, <<"%W">>)), %% ISO Week number ?assertEqual(<<"Jan">>, luerl_lib_os_date:format(Date, <<"%b">>)), ?assertEqual(<<"January">>, luerl_lib_os_date:format(Date, <<"%B">>)), ?assertEqual(<<"Mon">>, luerl_lib_os_date:format(Date, <<"%a">>)), ?assertEqual(<<"Monday">>, luerl_lib_os_date:format(Date, <<"%A">>)), ?assertEqual(<<"%">>, luerl_lib_os_date:format(Date, <<"%%">>)), ?assertEqual(<<"2023-01-02 03:04:05">>, luerl_lib_os_date:format(Date, <<"%Y-%m-%d %H:%M:%S">>)). os_date_table(_) -> Date = {{2023, 1, 2}, {3, 4, 5}}, ?assertEqual([ {<<"year">>, 2023}, {<<"month">>, 1}, {<<"day">>, 2}, {<<"hour">>, 3}, {<<"min">>, 4}, {<<"sec">>, 5}, {<<"wday">>, 2} ], luerl_lib_os_date:format(Date, <<"*t">>)). os_date_integrated(_) -> State = luerl:init(), Chunk = <<"return os.date('noformat'), os.date(), os.date('%c', 1683371767)">>, {ok, [NoFormat, _, FromTimeStamp], _State1} = luerl:do(Chunk, State), ?assertEqual(<<"noformat">>, NoFormat), %% Date is "Sat May 6 13:16:07 2023", %% Just check year to avoid test flakiness ?assert(re:run(FromTimeStamp, <<"2023">>) =/= nomatch). os_date_integrated_table(_) -> State = luerl:init(), Chunk = <<"return os.date('*t').year">>, {ok, [Result], _State1} = luerl:do(Chunk, State), {{Year, _, _}, _} = calendar:local_time(), ?assertEqual(Year, Result). rvirding-luerl-772b25e/test/luerl_old_tests.erl0000664000232200023220000000350215114130670022252 0ustar debalancedebalance%% Copyright (C) 2024 Robert Virding %% %% Licensed under the Apache License, Version 2.0 (the "License"); %% you may not use this file except in compliance with the License. %% You may obtain a copy of the License at %% %% http://www.apache.org/licenses/LICENSE-2.0 %% %% Unless required by applicable law or agreed to in writing, software %% distributed under the License is distributed on an "AS IS" BASIS, %% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. %% See the License for the specific language governing permissions and %% limitations under the License. -module(luerl_old_tests). -include_lib("eunit/include/eunit.hrl"). encode_test() -> State = luerl_old:init(), ?assertMatch({nil, _State}, luerl_old:encode(nil, State)), ?assertMatch({false, _State}, luerl_old:encode(false, State)), ?assertMatch({true, _State}, luerl_old:encode(true, State)), ?assertMatch({<<"binary">>, _State}, luerl_old:encode(<<"binary">>, State)), ?assertMatch({<<"atom">>, _State}, luerl_old:encode(atom, State)), ?assertMatch({5, _State}, luerl_old:encode(5, State)), ?assertMatch({{tref, _}, _State}, luerl_old:encode(#{a => 1, b => 2}, State)), ?assertMatch({{tref, _}, _State}, luerl_old:encode([{a,1},{b,2}], State)). encode_error_test() -> State = luerl_old:init(), ?assertException(error, {badarg, _}, luerl_old:encode({a,1}, State)). encode_table_test() -> {Table, State} = luerl_old:encode(#{a => 1}, luerl_old:init()), State1 = luerl_old:set_table1([<<"foo">>], Table, State), ?assertMatch({Table, _State2}, luerl_old:get_table1([<<"foo">>], State1)), ?assertMatch({tref, _}, Table). invalid_value_test() -> State = luerl_old:init(), ?assertException(error, {badarg, {invalid, value}}, luerl_old:encode({invalid, value}, State)). rvirding-luerl-772b25e/test/luerl_scan_tests.erl0000664000232200023220000000151715114130670022424 0ustar debalancedebalance%% Copyright (C) 2025 Robert Virding, Dave Lucia %% %% Licensed under the Apache License, Version 2.0 (the "License"); %% you may not use this file except in compliance with the License. %% You may obtain a copy of the License at %% %% http://www.apache.org/licenses/LICENSE-2.0 %% %% Unless required by applicable law or agreed to in writing, software %% distributed under the License is distributed on an "AS IS" BASIS, %% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. %% See the License for the specific language governing permissions and %% limitations under the License. -module(luerl_scan_tests). -include_lib("eunit/include/eunit.hrl"). syntax_error_test() -> State = luerl:init(), ?assertMatch({error, [{1,luerl_scan, {user,"syntax error near '\"'"}}], []}, luerl:do(<<"print(\"hi)">>, State)). rvirding-luerl-772b25e/test/luerl_time_SUITE.erl0000664000232200023220000000357715114130670022175 0ustar debalancedebalance-module(luerl_time_SUITE). -include_lib("common_test/include/ct.hrl"). -include_lib("eunit/include/eunit.hrl"). -export([all/0]). -export([os_date/1]). -if(?OTP_RELEASE >= 25). -define(START_NODE(Name, Env), (fun(Name, Env) -> case ?CT_PEER(#{name => Name, env => Env}) of {ok, _PeerPid, Node} -> {ok, Node}; Err = {error, _Reason, _NodeName} -> Err end end)(Name, Env)). -else. -define(START_NODE(Name, Env), (fun(Name, Env) -> ct_slave:start(Name, [{env, Env}, {monitor_master, true}]) end)(Name, Env)). -endif. all() -> lists:flatten([windows_tests(), linux_tests()]). os_date(_Config) -> {ok, LusakaNode} = ?START_NODE(africa_lusaka, [{"TZ", "Africa/Lusaka"}]), ok = set_path(LusakaNode), {ok, LondonNode} = ?START_NODE(europe_london, [{"TZ", "Europe/London"}]), ok = set_path(LondonNode), LusakaLocalTime = rpc:call(LusakaNode, calendar, local_time, []), LondonLocalTime = rpc:call(LondonNode, calendar, local_time, []), ?assertNotMatch({badrpc, _}, LusakaLocalTime), ?assertNotMatch({badrpc, _}, LondonLocalTime), ?assert(LusakaLocalTime =/= LondonLocalTime), ?assertMatch({ok,[<<"Sat May 6 13:16:07 2023">>], _St1}, rpc:call(LusakaNode, luerl, do_dec, ["return os.date('%c', 1683371767)", luerl:init()])), ?assertMatch({ok,[<<"Sat May 6 12:16:07 2023">>], _St2}, rpc:call(LondonNode, luerl, do_dec, ["return os.date('%c', 1683371767)", luerl:init()])), ok. windows_tests() -> []. linux_tests() -> [os_date]. set_path(Node) -> [case rpc:call(Node, code, add_path, [Path]) of true -> ok; Err = {error, _} -> throw({badpath, Path, Err}) end || Path <- code:get_path(), filelib:is_dir(Path)], ok. rvirding-luerl-772b25e/test/luerl_return_SUITE.erl0000664000232200023220000000532215114130670022544 0ustar debalancedebalance%% Copyright (c) 2019 Ferenc Boroczki %% %% Licensed under the Apache License, Version 2.0 (the "License"); %% you may not use this file except in compliance with the License. %% You may obtain a copy of the License at %% %% http://www.apache.org/licenses/LICENSE-2.0 %% %% Unless required by applicable law or agreed to in writing, software %% distributed under the License is distributed on an "AS IS" BASIS, %% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. %% See the License for the specific language governing permissions and %% limitations under the License. -module(luerl_return_SUITE). -include_lib("common_test/include/ct.hrl"). -export([all/0, groups/0, init_per_suite/1, end_per_suite/1]). -export([simple_return/1, fun_return/1, use_lib/1, variable_args/1, check_unicode/1, table_tests/1]). init_per_suite(Config) -> DataDir = ?config(data_dir, Config), os:putenv("LUA_PATH", DataDir ++ "?.lua;" ++ DataDir ++ "?/init.lua"), Config. end_per_suite(Config) -> Config. all() -> [ {group, return} ]. groups() -> [ {return, [parallel], [simple_return, fun_return, use_lib, variable_args, check_unicode, table_tests]} ]. simple_return(Config) -> Tests = [ {"simple_return_1.lua", [1]}, {"simple_return_multi.lua", [1, <<"string 2">>, 3.4]} ], run_tests(Config, Tests). fun_return(Config) -> run_and_check(Config, "fun_return_multi.lua", [7, <<"str 1">>, 5.5, 11.0]). use_lib(Config) -> LuaDecimal = fun(B, E) -> [{<<"b">>, B}, {<<"e">>, E}] end, Expected = [LuaDecimal(B, E) || {B, E} <- [{13, 1}, {7, 1}, {3, 3}]], run_and_check(Config, "decimal_test.lua", Expected). variable_args(Config) -> run_tests(Config, [ {"variable_args_1.lua", [99, 88, 77]}, {"variable_args_multi.lua", [9, <<"banana">>, 8]} ]). check_unicode(Config) -> St = run_and_check(Config, "check_unicode.lua", []), check_unicode_call_fun(<<"árvíztűrÅ‘ tükörfúrógép"/utf8>>, 31, check_hun, St), check_unicode_call_fun(<<"λ"/utf8>>, 2, check_lambda, St), check_unicode_call_fun(<<9810/utf8>>, 3, check_aquarius, St). check_unicode_call_fun(Input, Length, LuaFun, St) -> {ok, [Input, Input, true, Length, Length], _} = luerl:call_function_dec([LuaFun], [Input], St). table_tests(Config) -> run_and_check(Config, "table_indexed_table.lua", [111, 222, 333]). run_tests(Config, Tests) -> [run_and_check(Config, Script, Expected) || {Script, Expected} <- Tests]. run_and_check(Config, Script, Expected) -> DataDir = ?config(data_dir, Config), ScriptFile = DataDir ++ Script, {ok, Result, St} = luerl:dofile_dec(ScriptFile, luerl:init()), {true, {expected, Expected}, {result, Result}} = {Result =:= Expected, {expected, Expected}, {result, Result}}, St. rvirding-luerl-772b25e/test/luerl_tests.erl0000664000232200023220000000447715114130670021430 0ustar debalancedebalance%% Copyright (C) 2024 Robert Virding %% %% Licensed under the Apache License, Version 2.0 (the "License"); %% you may not use this file except in compliance with the License. %% You may obtain a copy of the License at %% %% http://www.apache.org/licenses/LICENSE-2.0 %% %% Unless required by applicable law or agreed to in writing, software %% distributed under the License is distributed on an "AS IS" BASIS, %% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. %% See the License for the specific language governing permissions and %% limitations under the License. -module(luerl_tests). -include_lib("eunit/include/eunit.hrl"). encode_test() -> State = luerl:init(), ?assertMatch({nil, _State}, luerl:encode(nil, State)), ?assertMatch({false, _State}, luerl:encode(false, State)), ?assertMatch({true, _State}, luerl:encode(true, State)), ?assertMatch({<<"binary">>, _State}, luerl:encode(<<"binary">>, State)), ?assertMatch({<<"atom">>, _State}, luerl:encode(atom, State)), ?assertMatch({5, _State}, luerl:encode(5, State)), ?assertMatch({{tref, _}, _State}, luerl:encode(#{a => 1, b => 2}, State)), ?assertMatch({{tref, _}, _State}, luerl:encode([{a,1},{b,2}], State)). encode_error_test() -> State = luerl:init(), ?assertException(error, {badarg, _}, luerl:encode({a,1}, State)). encode_table_test() -> {Table, State} = luerl:encode(#{a => 1}, luerl:init()), {ok, State1} = luerl:set_table_keys([<<"foo">>], Table, State), ?assertMatch({ok, Table, _State2}, luerl:get_table_keys([<<"foo">>], State1)), ?assertMatch({tref, _}, Table). invalid_value_test() -> State = luerl:init(), ?assertException(error, {badarg, {invalid, value}}, luerl:encode({invalid, value}, State)). private_test() -> State1 = luerl:init(), State2 = luerl:put_private(secret, <<"mysecret">>, State1), ?assertMatch(<<"mysecret">>, luerl:get_private(secret, State2)), ?assertException(error, {badkey, missing}, luerl:get_private(missing, State2)), State3 = luerl:delete_private(secret, State2), ?assertException(error, {badkey, secret}, luerl:get_private(secret, State3)). loadfile_only_comments_test() -> State1 = luerl:init(), ?assertMatch({ok, _, _}, luerl:loadfile("./test/luerl_return_SUITE_data/only_comments.lua", State1)). rvirding-luerl-772b25e/test/luerl_return_SUITE_data/0000775000232200023220000000000015114130670023027 5ustar debalancedebalancervirding-luerl-772b25e/test/luerl_return_SUITE_data/simple_return_1.lua0000664000232200023220000000001115114130670026632 0ustar debalancedebalancereturn 1 rvirding-luerl-772b25e/test/luerl_return_SUITE_data/decimal_test.lua0000664000232200023220000000133415114130670026170 0ustar debalancedebalancelocal d = require("decimal") a = d.new(1, 2) -- 100 b = d.new(3, 1) -- 30 print(a, "+", b, "=", a + b) print(a, "-", b, "=", a - b) print(a, "*", b, "=", a * b) print(a, "/", b, "=", a / b) x1 = d.new(1, 2) x2 = d.new(2, 2) x3 = d.new(2, 1) x4 = d.new(10, 1) x5 = d.new(10, 2) print(a, "==", b, "=", a == b) print(a, "==", x1, "=", a == x1) print(a, "==", x2, "=", a == x2) print(a, "==", x3, "=", a == x3) print(a, "==", x4, "=", a == x4) print(a, "==", x5, "=", a == x5) assert(a + b == d.new(130, 0)) assert(a + b == d.new(13, 1)) assert(a - b == d.new(70, 0)) assert(a - b == d.new(7, 1)) assert(a * b == d.new(3000, 0)) assert(a * b == d.new(3, 3)) --assert(a / b == d.new(33333333333333, -15)) return a + b, a - b, a * b rvirding-luerl-772b25e/test/luerl_return_SUITE_data/decimal.lua0000664000232200023220000000220415114130670025126 0ustar debalancedebalancelocal Decimal = {} Decimal.mt = { __tostring = function(d) return d.b .. "e" .. d.e end, __add = function(a, b) a, b = Decimal.same_e(a, b) if a.e == b.e then return Decimal.new(a.b + b.b, a.e) end end, __sub = function(a, b) return a + Decimal.new(-b.b, b.e) end, __mul = function(a, b) return Decimal.new(a.b * b.b, a.e + b.e) end, __div = function(a, b) -- @todo fix return Decimal.new(a.b / b.b, a.e - b.e) end, __eq = function(a, b) a, b = Decimal.same_e(a, b) return a.b == b.b and a.e == b.e end } Decimal.new = function(b, e) local d = { b = b, e = e } setmetatable(d, Decimal.mt) return d end Decimal.change_e = function(d, e) if d.e == e then return d end if d.e > e then return Decimal.change_e(Decimal.new(10 * d.b, d.e - 1), e) end error("can't increment exponential") end Decimal.same_e = function(a, b) local min_e = math.min(a.e, b.e) return Decimal.change_e(a, min_e), Decimal.change_e(b, min_e) end return Decimal rvirding-luerl-772b25e/test/luerl_return_SUITE_data/only_comments.lua0000664000232200023220000000003215114130670026413 0ustar debalancedebalance-- No code, just comments rvirding-luerl-772b25e/test/luerl_return_SUITE_data/table_indexed_table.lua0000664000232200023220000000015215114130670027466 0ustar debalancedebalancetk1 = { a = 1 } tk2 = { b = 2 } t = {} t[tk1] = 111 t[tk2] = 222 t[t] = 333 return t[tk1], t[tk2], t[t] rvirding-luerl-772b25e/test/luerl_return_SUITE_data/variable_args_multi.lua0000664000232200023220000000054115114130670027545 0ustar debalancedebalancefunction make_table(...) local t = {} for i = 1, select('#', ...), 2 do k = select(i, ...) v = select(i + 1, ...) t[k] = v end return t end print(make_table) local tab = make_table("x", 9, 7, "banana", "z", 8) assert(tab["x"] == 9) assert(tab[7] == "banana") assert(tab.z == 8) return tab["x"], tab[7], tab.z rvirding-luerl-772b25e/test/luerl_return_SUITE_data/variable_args_1.lua0000664000232200023220000000053715114130670026560 0ustar debalancedebalancefunction get_from_table(Map, Key, ...) local Value = Map[Key] if select('#', ...) > 0 then return get_from_table(Value, ...) else return Value end end local tab = { a = { x1 = { x2 = 99 } }, b = 88, c = { d = 77 } } return get_from_table(tab, "a", "x1", "x2"), get_from_table(tab, "b"), get_from_table(tab, "c", "d") rvirding-luerl-772b25e/test/luerl_return_SUITE_data/check_unicode.lua0000664000232200023220000000125015114130670026313 0ustar debalancedebalancefunction check_hun(erl_str) local lua_str = "árvíztűrÅ‘ tükörfúrógép" return check_values(erl_str, lua_str, 31) end function check_lambda(erl_str) local lua_str = "λ" return check_values(erl_str, lua_str, 2) end function check_aquarius(erl_str) local lua_str = utf8.char(9810) return check_values(erl_str, lua_str, 3) end function check_values(erl_str, lua_str, length) assert(string.len(lua_str) == length, "invalid lua length") assert(string.len(erl_str) == length, "invalid erl length") assert(lua_str == erl_str, "different values") return erl_str, lua_str, erl_str == lua_str, string.len(erl_str), string.len(lua_str) end rvirding-luerl-772b25e/test/luerl_return_SUITE_data/fun_return_multi.lua0000664000232200023220000000022615114130670027133 0ustar debalancedebalancefunction retfun(value) return value end function retfun2(value) return value, 2 * value end return retfun(7), retfun("str 1"), retfun2(5.5) rvirding-luerl-772b25e/test/luerl_return_SUITE_data/simple_return_multi.lua0000664000232200023220000000003215114130670027627 0ustar debalancedebalancereturn 1, "string 2", 3.4 rvirding-luerl-772b25e/Emakefile0000664000232200023220000000006315114130670017170 0ustar debalancedebalance%% -*- erlang -*- {'src/luerl*',[{outdir,ebin}]}. rvirding-luerl-772b25e/ebin/0000775000232200023220000000000015114130670016301 5ustar debalancedebalancervirding-luerl-772b25e/ebin/luerl.app0000664000232200023220000000254715114130670020136 0ustar debalancedebalance{application,luerl, [{description,"Luerl - an implementation of Lua on Erlang"}, {vsn,"1.5.1"}, {modules,['Elixir.Luerl.New','Elixir.Luerl',luerl,luerl_anno, luerl_app,luerl_comp,luerl_comp_cg,luerl_comp_env, luerl_comp_lint,luerl_comp_locf,luerl_comp_normalise, luerl_comp_peep,luerl_comp_vars,luerl_emul,luerl_heap, luerl_lib,luerl_lib_basic,luerl_lib_bit32, luerl_lib_debug,luerl_lib_io,luerl_lib_math, luerl_lib_os,luerl_lib_os_date,luerl_lib_package, luerl_lib_string,luerl_lib_string_format, luerl_lib_table,luerl_lib_utf8,luerl_new,luerl_old, luerl_parse,luerl_sandbox,luerl_scan,luerl_sup, luerl_util,ttdict,ttsets]}, {registered,[]}, {applications,[kernel,stdlib]}, {env,[]}, {mod,{luerl_app,[]}}, {licenses,["Apache-2.0"]}, {links,[{"Github","https://github.com/rvirding/luerl"}]}, {files,["README.md","LICENSE","VERSION","src","doc", "ebin/luerl.app","include","rebar.*","*akefile", "*.escript"]}, {exclude_files,["priv/images/*"]}]}. rvirding-luerl-772b25e/Makefile0000664000232200023220000001165615114130670017035 0ustar debalancedebalance# Copyright (c) 2016-2023 Robert Virding # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # Makefile for Luerl # Building from .xrl, .yrl and .erl # Intermediaries from leex and yecc stay in ./src BINDIR = ./bin EBINDIR = ./ebin SRCDIR = ./src LIB = luerl # To run erl as bash FINISH = -run init stop -noshell # Scripts to be evaluated GET_VERSION = '{ok,[App]}=file:consult("src/$(LIB).app.src"), \ V=proplists:get_value(vsn,element(3,App)), \ io:format("~p~n",[V])' \ $(FINISH) ## The .erl, .xrl, .yrl and .beam files ESRCS := $(notdir $(wildcard $(SRCDIR)/*.erl)) XSRCS := $(notdir $(wildcard $(SRCDIR)/*.xrl)) YSRCS := $(notdir $(wildcard $(SRCDIR)/*.yrl)) EBINS = $(ESRCS:.erl=.beam) $(XSRCS:.xrl=.beam) $(YSRCS:.yrl=.beam) ERLCFLAGS = -W1 +debug_info ERLC ?= erlc all: compile .PHONY: all compile clean echo examples debug docs compile: comp_opts.mk $(addprefix $(EBINDIR)/, $(EBINS)) $(EBINDIR)/%.beam: $(SRCDIR)/%.erl $(SRCDIR)/luerl.hrl comp_opts.mk @ mkdir -p $(EBINDIR) $(ERLC) $(ERLCFLAGS) -o $(EBINDIR) $(COMP_OPTS) $(ERLCFLAGS) $< %.erl: %.xrl $(ERLC) -o $(SRCDIR) $< %.erl: %.yrl $(ERLC) -o $(SRCDIR) $< comp_opts.mk: get_comp_opts.escript escript get_comp_opts.escript -include comp_opts.mk clean: @ rm -f $(EBINDIR)/*.beam @ rm -f *.beam @ rm -f erl_crash.dump @ rm comp_opts.mk $(MAKE) -C examples clean clean-all: clean rm -rf _build echo: echo $(OBJECTS) get-version: @echo @echo "Getting version info ..." @echo @echo -n app.src: '' @erl -eval $(GET_VERSION) examples: all $(MAKE) -C examples debug: ERLCFLAGS="+debug_info" make all ############### ### TESTING ### ############### # XXX for some reason, the first pass of eunit doesn't run the tests?! eunit: @rebar3 as test do compile,eunit,eunit common-test: @rebar3 as test do compile,ct ct: common-test tests: @rebar3 as test do compile,eunit,eunit,ct # this protects the intermediate .erl files from make's auto deletion #.SECONDARY: $(XRL_INTERM) $(YRL_INTERM) ##################### ### DOCUMENTATION ### ##################### # Targets for generating docs and man pages DOCDIR = doc_legacy DOCSRC = $(DOCDIR)/src MANDIR = $(DOCDIR)/man PDFDIR = $(DOCDIR)/pdf EPUBDIR = $(DOCDIR)/epub MANINSTDIR ?= $(PREFIX)/share/man MAN1_SRCS = $(notdir $(wildcard $(DOCSRC)/*1.md)) MAN1S = $(MAN1_SRCS:.1.md=.1) TXT1S = $(MAN1_SRCS:.1.md=.txt) PDF1S = $(MAN1_SRCS:.1.md=.pdf) MAN3_SRCS = $(notdir $(wildcard $(DOCSRC)/*3.md)) MAN3S = $(MAN3_SRCS:.3.md=.3) PDF3S = $(MAN3_SRCS:.3.md=.pdf) TXT3S = $(MAN3_SRCS:.3.md=.txt) MAN7_SRCS = $(notdir $(wildcard $(DOCSRC)/*7.md)) MAN7S = $(MAN7_SRCS:.7.md=.7) TXT7S = $(MAN7_SRCS:.7.md=.txt) PDF7S = $(MAN7_SRCS:.7.md=.pdf) # For pandoc for generating PDFs as it omly accepts a few options. # xelatex is a reasonable default or wkhtmltopdf. PANDOCPDF ?= xelatex # Just generate the docs that are tracked in git docs: docs-txt docs-man: \ $(addprefix $(MANDIR)/, $(MAN1S)) \ $(addprefix $(MANDIR)/, $(MAN3S)) \ $(addprefix $(MANDIR)/, $(MAN7S)) $(MANDIR)/%.1: $(DOCSRC)/%.1.md pandoc -f markdown -s -t man -o $@ $< $(MANDIR)/%.3: $(DOCSRC)/%.3.md pandoc -f markdown -s -t man -o $@ $< $(MANDIR)/%.7: $(DOCSRC)/%.7.md pandoc -f markdown -s -t man -o $@ $< clean-docs: rm -f $(DOCDIR)/*.txt $(MANDIR)/*.[0-9] $(PDFDIR)/*.pdf $(EPUBDIR)/*.epub docs-txt: docs-man \ $(addprefix $(DOCDIR)/, $(TXT1S)) \ $(addprefix $(DOCDIR)/, $(TXT3S)) \ $(addprefix $(DOCDIR)/, $(TXT7S)) @if [ -f $(DOCDIR)/luerl_guide.txt ]; then \ cp $(DOCDIR)/luerl_guide.txt $(DOCDIR)/user_guide.txt ; \ fi $(DOCDIR)/%.txt: export GROFF_NO_SGR=1 $(DOCDIR)/%.txt: $(MANDIR)/%.1 groff -t -e -mandoc -Tutf8 $< | col -bx > $@ $(DOCDIR)/%.txt: $(MANDIR)/%.3 groff -t -e -mandoc -Tutf8 $< | col -bx > $@ $(DOCDIR)/%.txt: $(MANDIR)/%.7 groff -t -e -mandoc -Tutf8 $< | col -bx > $@ $(PDFDIR): @$(INSTALL_DIR) $(PDFDIR) docs-pdf: $(PDFDIR) \ $(addprefix $(PDFDIR)/, $(PDF1S)) \ $(addprefix $(PDFDIR)/, $(PDF3S)) \ $(addprefix $(PDFDIR)/, $(PDF7S)) $(PDFDIR)/%.pdf: $(DOCSRC)/%.1.md pandoc -f markdown --pdf-engine=$(PANDOCPDF) -o $@ $< $(PDFDIR)/%.pdf: $(DOCSRC)/%.3.md pandoc -f markdown --pdf-engine=$(PANDOCPDF) -o $@ $< $(PDFDIR)/%.pdf: $(DOCSRC)/%.7.md pandoc -f markdown --pdf-engine=$(PANDOCPDF) -o $@ $< ################ ### RELEASES ### ################ hex-publish: clean-all compile rebar3 hex publish package tags: git tag $(shell erl -eval $(GET_VERSION)|tr -d '"') git tag v$(shell erl -eval $(GET_VERSION)|tr -d '"') git push --tags rvirding-luerl-772b25e/rebar.config.script0000664000232200023220000001025415114130670021153 0ustar debalancedebalance%% -*- mode: erlang; indent-tabs-mode: nil -*- Conf0 = CONFIG, %The original config %% Do a deep set stepping down a list of keys replacing/adding last %% with value. Named funs would be nicer but not always available. SetConf = fun ([K], Val, Ps, _F) -> %% Replace the whole K field with Val. [Val|proplists:delete(K, Ps)]; ([K|Ks], Val, Ps, F) -> %% Step down and build coming up. case lists:keyfind(K, 1, Ps) of {K,Kps} -> lists:keyreplace(K, 1, Ps, {K,F(Ks, Val, Kps, F)}); false -> Ps ++ [{K,F(Ks, Val, [], F)}] end end, %% Get the release number. %% We have stolen the idea and most of the code from rebar3. OTPRelease = fun () -> case erlang:system_info(otp_release) of [$R,N1|Rest] when is_integer(N1) -> %% If OTP <= R16, take the digits. [N1|Rest]; Rel -> %% If OTP >= 17.x, erlang:system_info(otp_release) returns %% just the major version number. File = filename:join([code:root_dir(),"releases",Rel,"OTP_VERSION"]), case file:read_file(File) of {error, _} -> Rel; {ok, Vsn} -> Size = byte_size(Vsn), %% The shortest vsn string consists of at least %% two digits followed by "\n". Therefore, it's %% safe to assume Size >= 3. case binary:part(Vsn, {Size, -3}) of <<"**\n">> -> binary:bin_to_list(Vsn, {0, Size - 3}); _ -> binary:bin_to_list(Vsn, {0, Size - 1}) end end end end, Version = OTPRelease(), %% Collect the macro definitions we will add to the compiler options. %% Named funs would be nicer but not always available. AppendCopts = fun (Version, [{Ver,Opt}|Opts], F) -> Rest = F(Version, Opts, F), if Version >= Ver -> [{d,Opt,true}|Rest]; true -> Rest end; (_Version, [], _F) -> [] end, Copts0 = [{d,'ERLANG_VERSION',Version}], Copts = Copts0 ++ AppendCopts(Version, [{"17",'HAS_MAPS'}, {"18",'HAS_FULL_KEYS'}, {"19",'NEW_REC_CORE'}, {"19",'NEW_RAND'}, {"20",'NEW_BOOL_GUARD'}, {"20",'HAS_FLOOR'}, {"20",'HAS_CEIL'}, {"21",'NEW_STACKTRACE'}, {"23",'EEP48'}, {"27",'OTP27_MAYBE'}], AppendCopts), %% Ensure they are in erl_opts. %% Make sure debug_info is always included for documentation AllOpts = [{debug_info, true} | Copts], Conf1 = case lists:keyfind(erl_opts, 1, Conf0) of {erl_opts,Opts} -> %Existing erl_opts %% Make sure debug_info is included in the final options OptsWithDebug = case lists:member(debug_info, Opts) of true -> lists:delete(debug_info, Opts) ++ [{debug_info, true}]; false -> Opts ++ [{debug_info, true}] end, NewOpts = {erl_opts, OptsWithDebug ++ Copts}, lists:keyreplace(erl_opts, 1, Conf0, NewOpts); false -> %No erl_opts Conf0 ++ [{erl_opts, AllOpts}] end, %% TestConfig = [{cover_enabled, true}, {cover_opts, [verbose]}], %% Aliases = [{alias, [ %% {test, [eunit, {ct, "--cover"}, cover]} %% ]}], %% Conf1 ++ TestConfig ++ Aliases. %% Conf1. rvirding-luerl-772b25e/examples/0000775000232200023220000000000015114130670017202 5ustar debalancedebalancervirding-luerl-772b25e/examples/benchmark/0000775000232200023220000000000015114130670021134 5ustar debalancedebalancervirding-luerl-772b25e/examples/benchmark/benchmarks.erl0000664000232200023220000000314115114130670023754 0ustar debalancedebalance%% File : benchmarks.erl %% Purpose : Benchmarks runner for luerl %% Use: erlc -I ../src benchmark.erl && erl -pa ../ebin -s benchmark run -s init stop -noshell %% Or: make -module(benchmarks). -export([run/0, run/1]). -export([benchmarks/1, do_benchmark/2, do_iteration/3]). -define(DEFAULT_ITER, 1000). run() -> Files = filelib:wildcard("suites/*.lua"), [ run(File) || File <- Files ] , ok. run(File) -> Lua0 = luerl:init(), {ok, _Resp, Lua2} = luerl:dofile(File, Lua0), report_file(File), [ do_benchmark(Benchmark, Lua2) || Benchmark <- benchmarks(Lua2) ], {ok, Lua2}. do_benchmark(Benchmark, Lua) -> Iter = num_iterations(Lua), report_benchmark(Benchmark), {Time, _Resp} = timer:tc(?MODULE, do_iteration, [Iter, Benchmark, Lua]), report_time(Time), ok. do_iteration(0, _Benchmark, _Lua) -> ok; do_iteration(Iter, Benchmark, Lua) -> luerl:call_method([<<"bench">>], Benchmark, [], Lua), do_iteration(Iter - 1, Benchmark, Lua). num_iterations(Lua) -> case luerl:do("return NUM_ITERATIONS", Lua) of {ok, [Iter], _} when is_number(Iter) -> round(Iter); _Any -> ?DEFAULT_ITER end. benchmarks(Lua0) -> io:format("benchmarks\n", []), {ok, [Benchmarks], _} = luerl:dofile_dec("util/extract_bench_keys.lua", Lua0), [ Key || {_Index, Key} <- Benchmarks ]. report_file(File) -> io:format("~n~s ms~n", [string:left(File, 26)]). report_benchmark(Benchmark) -> io:format(" ~s", [string:left(binary_to_list(Benchmark), 24, $.)]). report_time(Time) -> io:format(" ~p~n", [Time / 1000]). rvirding-luerl-772b25e/examples/benchmark/util/0000775000232200023220000000000015114130670022111 5ustar debalancedebalancervirding-luerl-772b25e/examples/benchmark/util/extract_bench_keys.lua0000664000232200023220000000013015114130670026452 0ustar debalancedebalancelocal list = {} for key, func in pairs(bench) do list[#list+1] = key end return list rvirding-luerl-772b25e/examples/benchmark/Makefile0000664000232200023220000000044615114130670022600 0ustar debalancedebalanceEXAMPLES = benchmarks ROOTDIR = ../.. SRCDIR = $(ROOTDIR)/src BEAMDIR = $(ROOTDIR)/ebin all: $(EXAMPLES) clean: rm -f *.beam erl_crash.dump .SECONDARY: %.beam: %.erl $(SRCDIR)/*.hrl erlc -I $(SRCDIR) $< %: %.beam erl -pa $(BEAMDIR) -s $@ run -s init stop -noshell .PHONY: all clean rvirding-luerl-772b25e/examples/benchmark/suites/0000775000232200023220000000000015114130670022450 5ustar debalancedebalancervirding-luerl-772b25e/examples/benchmark/suites/chaincall.lua0000664000232200023220000000173515114130670025077 0ustar debalancedebalancebench = {} local function chain() return chain end local function plain() -- No-op end bench.chain_upval = function() chain () () () () () () () () () () -- 10 calls end bench.plain_upval = function() plain () plain () plain () plain () plain () plain () plain () plain () plain () plain () -- 10 calls end bench.plain_chain_upval = function() chain () chain () chain () chain () chain () chain () chain () chain () chain () chain () -- 10 calls end bench.chain_local = function() local chain = chain chain () () () () () () () () () () -- 10 calls end bench.plain_local = function() local plain = plain plain () plain () plain () plain () plain () plain () plain () plain () plain () plain () -- 10 calls end bench.plain_chain_local = function() local chain = chain chain () chain () chain () chain () chain () chain () chain () chain () chain () chain () -- 10 calls end return bench rvirding-luerl-772b25e/examples/benchmark/suites/return.lua0000664000232200023220000000063115114130670024472 0ustar debalancedebalancebench = {} local function no_ret() end local function ret_nil() return nil end local function ret_true() return true end local function ret_self() return ret_self end bench.no_ret = function() local a = no_ret() end bench.ret_nil = function() local a = ret_nil() end bench.ret_true = function() local a = ret_true() end bench.ret_self = function() local a = ret_self() end return bench rvirding-luerl-772b25e/examples/benchmark/suites/callmap1.lua0000664000232200023220000000142115114130670024643 0ustar debalancedebalancelocal noop = function() end local plain_call = function(a) noop() end local if_call = function(a) if a == "a1" then noop() elseif a == "a2" then noop() elseif a == "a3" then noop() elseif a == "a4" then noop() elseif a == "a5" then noop() elseif a == "a6" then noop() elseif a == "a7" then noop() elseif a == "a8" then noop() elseif a == "a9" then noop() elseif a == "a10" then noop() end end local map = { } for i = 1, 10 do map["a"..i] = noop end local map_call = function(a) map[a]() end local do_bench = function(fn) return function() fn("a"..1) end end bench = { noop = do_bench(noop); plain_call = do_bench(plain_call); if_call = do_bench(if_call); map_call = do_bench(map_call); } return bench rvirding-luerl-772b25e/examples/benchmark/suites/get.lua0000664000232200023220000000164415114130670023737 0ustar debalancedebalancelocal rawget = rawget local t = { true, a = true } local get = function(t, k) return t[k] end bench = { } bench.nonnil_num_plain = function() return t[1] end bench.nonnil_num_get = function() return get(t, 1) end bench.nonnil_num_rawget = function() return rawget(t, 1) end bench.nonnil_str_plain = function() return t["a"] end bench.nonnil_str_sugar = function() return t.a end bench.nonnil_str_get = function() return get(t, "a") end bench.nonnil_str_rawget = function() return rawget(t, "a") end bench.nil_num_plain = function() return t[2] end bench.nil_num_get = function() return get(t, 2) end bench.nil_num_rawget = function() return rawget(t, 2) end bench.nil_str_plain = function() return t["b"] end bench.nil_str_sugar = function() return t.b end bench.nil_str_get = function() return get(t, "b") end bench.nil_str_rawget = function() return rawget(t, "b") end return bench rvirding-luerl-772b25e/examples/benchmark/suites/mtvsclosure.lua0000664000232200023220000000106415114130670025542 0ustar debalancedebalancelocal setmetatable = setmetatable local mt = { __call = function(t, v) t[#t + 1] = v end } local call_setmetatable = function() return setmetatable({ }, mt) end local create_closure = function() local t = {} return function(v) t[#t + 1] = v end end local mt_obj = call_setmetatable() local fn_obj = create_closure() bench = { } bench.call_setmetatable = call_setmetatable bench.create_closure = create_closure -- bench.use_setmetatable = function() -- mt_obj("boo!") -- end bench.use_closure = function() fn_obj("boo!") end return bench rvirding-luerl-772b25e/examples/benchmark/suites/concat.lua0000664000232200023220000000175715114130670024434 0ustar debalancedebalancelocal table_concat, table_insert = table.concat, table.insert NUM_ITERATIONS = 1 bench = {} bench.raw_concat = function() local self = "string 0\n" for i = 1, 1000 do self = self .. "string " .. i .. "\n" end return self end bench.raw_plus_1 = function() local self = { "string 0\n" } for i = 1, 1000 do self[#self + 1] = "string " self[#self + 1] = i self[#self + 1] = "\n" end return table_concat(self) end bench.raw_insert = function() local self = { "string 0\n" } for i = 1, 1000 do table_insert(self, "string ") table_insert(self, i ) table_insert(self, "\n" ) end return table_concat(self) end bench.mixed_plus_1 = function() local self = {"string 0\n"} for i = 1,1000 do self[#self + 1] = "string " .. i .. "\n" end return table_concat(self) end bench.mixed_insert = function() local self = {"string 0\n"} for i = 1, 1000 do table_insert(self, "string " .. i .. "\n") end return table_concat(self) end return bench rvirding-luerl-772b25e/examples/benchmark/suites/callmap10.lua0000664000232200023220000000146015114130670024726 0ustar debalancedebalancelocal noop = function() end local plain_call = function(a) noop() end local if_call = function(a) if a == "a1" then noop() elseif a == "a2" then noop() elseif a == "a3" then noop() elseif a == "a4" then noop() elseif a == "a5" then noop() elseif a == "a6" then noop() elseif a == "a7" then noop() elseif a == "a8" then noop() elseif a == "a9" then noop() elseif a == "a10" then noop() end end local map = { } for i = 1, 10 do map["a"..i] = noop end local map_call = function(a) map[a]() end local do_bench = function(fn) return function() for i = 1, 10 do fn("a"..i) end end end bench = { noop = do_bench(noop); plain_call = do_bench(plain_call); if_call = do_bench(if_call); map_call = do_bench(map_call); } return bench rvirding-luerl-772b25e/examples/benchmark/suites/nloop_simple.lua0000664000232200023220000000521615114130670025657 0ustar debalancedebalancelocal ipairs = ipairs local t5, t25, t50 = {}, {}, {} do for i = 1, 10 do t5[i] = i end t5[6] = nil for i = 1, 30 do t25[i] = i end t25[26] = nil for i = 1, 55 do t50[i] = i end t50[51] = nil end local do_nothing = function() end bench = {} local do_loop_ipairs = function(t) for i, v in ipairs(t) do end end local do_loop_numfor = function(t) for i = 1, #t do if t[i] == nil then break end end end local do_loop_while = function(t) local i = 1 while t[i] ~= nil do i = i + 1 end end bench.loop_ipairs_50 = function() do_loop_ipairs(t50) do_nothing(t50) -- Padding to get equivalent number of function calls. do_nothing(t50) do_nothing(t50) do_nothing(t50) do_nothing(t50) do_nothing(t50) do_nothing(t50) do_nothing(t50) do_nothing(t50) end bench.loop_numfor_50 = function() do_loop_numfor(t50) do_nothing(t50) do_nothing(t50) do_nothing(t50) do_nothing(t50) do_nothing(t50) do_nothing(t50) do_nothing(t50) do_nothing(t50) do_nothing(t50) end bench.loop_while_50 = function() do_loop_while(t50) do_nothing(t50) do_nothing(t50) do_nothing(t50) do_nothing(t50) do_nothing(t50) do_nothing(t50) do_nothing(t50) do_nothing(t50) do_nothing(t50) end bench.loop_ipairs_25 = function() do_loop_ipairs(t25) do_loop_ipairs(t25) do_nothing(t25) do_nothing(t25) do_nothing(t25) do_nothing(t25) do_nothing(t25) do_nothing(t25) do_nothing(t25) do_nothing(t25) end bench.loop_numfor_25 = function() do_loop_numfor(t25) do_loop_numfor(t25) do_nothing(t25) do_nothing(t25) do_nothing(t25) do_nothing(t25) do_nothing(t25) do_nothing(t25) do_nothing(t25) do_nothing(t25) end bench.loop_while_25 = function() do_loop_while(t25) do_loop_while(t25) do_nothing(t25) do_nothing(t25) do_nothing(t25) do_nothing(t25) do_nothing(t25) do_nothing(t25) do_nothing(t25) do_nothing(t25) end bench.loop_ipairs_5 = function() do_loop_ipairs(t5) do_loop_ipairs(t5) do_loop_ipairs(t5) do_loop_ipairs(t5) do_loop_ipairs(t5) do_loop_ipairs(t5) do_loop_ipairs(t5) do_loop_ipairs(t5) do_loop_ipairs(t5) do_loop_ipairs(t5) end bench.loop_numfor_5 = function() do_loop_numfor(t5) do_loop_numfor(t5) do_loop_numfor(t5) do_loop_numfor(t5) do_loop_numfor(t5) do_loop_numfor(t5) do_loop_numfor(t5) do_loop_numfor(t5) do_loop_numfor(t5) do_loop_numfor(t5) end bench.loop_while_5 = function() do_loop_while(t5) do_loop_while(t5) do_loop_while(t5) do_loop_while(t5) do_loop_while(t5) do_loop_while(t5) do_loop_while(t5) do_loop_while(t5) do_loop_while(t5) do_loop_while(t5) end return bench rvirding-luerl-772b25e/examples/benchmark/suites/accum.lua0000664000232200023220000000516715114130670024254 0ustar debalancedebalancelocal assert, loadstring = assert, loadstring local pairs, ipairs, next = pairs, ipairs, next local table_concat = table.concat -------------------------------------------------------------------------------- local DATA = { 006.635; 009.210; 011.345; 013.277; 015.086; 016.812; 018.475; 020.090; 021.666; 023.209; 024.725; 026.217; 027.688; 029.141; 030.578; 032.000; 033.409; 034.805; 036.191; 037.566; 038.932; 040.289; 041.638; 042.980; 044.314; 045.642; 046.963; 048.278; 049.588; 050.892; 052.191; 053.486; 054.776; 056.061; 057.342; 058.619; 059.893; 061.162; 062.428; 063.691; 064.950; 066.206; 067.459; 068.710; 069.957; 071.201; 072.443; 073.683; 074.919; 076.154; 077.386; 078.616; 079.843; 081.069; 082.292; 083.513; 084.733; 085.950; 087.166; 088.379; 089.591; 090.802; 092.010; 093.217; 094.422; 095.626; 096.828; 098.028; 099.228; 100.425; 101.621; 102.816; 104.010; 105.202; 106.393; 107.583; 108.771; 109.958; 111.144; 112.329; 113.512; 114.695; 115.876; 117.057; 118.236; 119.414; 120.591; 121.767; 122.942; 124.116; 125.289; 126.462; 127.633; 128.803; 129.973; 131.141; 132.309; 133.476; 134.642; } local DATA_SIZE = #DATA -------------------------------------------------------------------------------- local accum_unrolled do local buf = { "return function(t, c) c = c or 0; " } for i = 1, DATA_SIZE do buf[#buf + 1] = "c = c + t["..i.."]; " end buf[#buf + 1] = "return c; end" local fn = assert(loadstring(table_concat(buf))) accum_unrolled = assert(fn()) end local accum_numeric_for = function(t, c) c = c or 0 for i = 1, #t do c = c + t[i] end return c end local accum_numeric_while = function(t, c) c = c or 0 local i = 1 local v = t[i] while v ~= nil do c = c + v i = i + 1 v = t[i] end return c end local accum_ipairs = function(t, c) c = c or 0 for _, v in ipairs(t) do c = c + v end return c end local accum_pairs = function(t, c) c = c or 0 for _, v in pairs(t) do c = c + v end return c end local accum_next = function(t, c) c = c or 0 local k, v = next(t) while k ~= nil do c = c + v k, v = next(t, k) end return c end -------------------------------------------------------------------------------- bench = { } bench.unrolled = function() return accum_unrolled(DATA) end bench.numeric_while = function() return accum_numeric_while(DATA) end bench.numeric_for = function() return accum_numeric_for(DATA) end bench.ipairs = function() return accum_ipairs(DATA) end bench.pairs = function() return accum_pairs(DATA) end bench.next = function() return accum_next(DATA) end return table.pack(bench) rvirding-luerl-772b25e/examples/benchmark/suites/str_is_empty.lua0000664000232200023220000000110215114130670025666 0ustar debalancedebalancelocal empty_string = "" bench = { } bench.noop = function() local a = "" return true end bench.empty_constant = function() local a = "" return a == "" end bench.empty_upvalue = function() local a = "" return a == empty_string end bench.empty_size = function() local a = "" return #a == 0 end bench.nonempty_constant = function() local a = "nonempty" return a == "" end bench.nonempty_upvalue = function() local a = "nonempty" return a == empty_string end bench.nonempty_size = function() local a = "nonempty" return #a == 0 end return bench rvirding-luerl-772b25e/examples/benchmark/suites/factory.lua0000664000232200023220000000622615114130670024630 0ustar debalancedebalancelocal pairs, setmetatable = pairs, setmetatable local clone_table = function(t) local r = {} for k, v in pairs(t) do r[k] = v end return r end local inplace = function() local factory do factory = function() return { method1 = function(self) end; method2 = function(self) end; method3 = function(self) end; method4 = function(self) end; method5 = function(self) end; method6 = function(self) end; method7 = function(self) end; method8 = function(self) end; method9 = function(self) end; method10 = function(self) end; } end end return factory end local plain = function() local factory do local method1 = function(self) end local method2 = function(self) end local method3 = function(self) end local method4 = function(self) end local method5 = function(self) end local method6 = function(self) end local method7 = function(self) end local method8 = function(self) end local method9 = function(self) end local method10 = function(self) end factory = function() return { method1 = method1; method2 = method2; method3 = method3; method4 = method4; method5 = method5; method6 = method6; method7 = method7; method8 = method8; method9 = method9; method10 = method10; } end end return factory end local mt = function() local factory do local mt = { __index = { method1 = function(self) end; method2 = function(self) end; method3 = function(self) end; method4 = function(self) end; method5 = function(self) end; method6 = function(self) end; method7 = function(self) end; method8 = function(self) end; method9 = function(self) end; method10 = function(self) end; }; } factory = function() return setmetatable({}, mt) end end return factory end local clone = function() local factory do local proto = { method1 = function(self) end; method2 = function(self) end; method3 = function(self) end; method4 = function(self) end; method5 = function(self) end; method6 = function(self) end; method7 = function(self) end; method8 = function(self) end; method9 = function(self) end; method10 = function(self) end; } factory = function() return clone_table(proto) end end return factory end local invoker = function(factory) local obj = factory() return function() obj:method1() obj:method2() obj:method3() obj:method4() obj:method5() obj:method6() obj:method7() obj:method8() obj:method9() obj:method10() end end bench = { inplace_init = inplace; plain_init = plain; metatable_init = mt; clone_init = clone; inplace_call = inplace(); plain_call = plain(); metatable_call = mt(); clone_call = clone(); inplace_method = invoker(inplace()); plain_method = invoker(plain()); metatable_method = invoker(mt()); clone_method = invoker(clone()); } return bench rvirding-luerl-772b25e/examples/benchmark/suites/arguments.lua0000664000232200023220000001635115114130670025166 0ustar debalancedebalancelocal select, tostring, assert, type, error = select, tostring, assert, type, error -------------------------------------------------------------------------------- local run_plain_assert = function(a, b, c) assert(type(a) == "number") assert(type(b) == "boolean") assert(type(c) == "string") end -------------------------------------------------------------------------------- local run_assert_is do local make_assert_is = function(typename) return function(v, msg) if type(v) == typename then return v end error( (msg or "assertion failed") .. ": expected `" .. typename .. "', got `" .. type(v) .. "'", 3 ) end end local assert_is_number = make_assert_is("number") local assert_is_boolean = make_assert_is("boolean") local assert_is_string = make_assert_is("string") run_assert_is = function(a, b, c) assert_is_number(a) assert_is_boolean(b) assert_is_string(c) end end -------------------------------------------------------------------------------- local run_arguments_select_simple do local arguments_select = function(...) local nargs = select("#", ...) for i = 1, nargs, 2 do local expected_type, value = select(i, ...) if type(value) ~= expected_type then error( "bad argument #" .. ((i + 1) / 2) .. " type: expected `" .. expected_type .. "', got `" .. type(value) .. "'", 3 ) end end end run_arguments_select_simple = function(a, b, c) arguments_select( "number", a, "boolean", b, "string", c ) end end -------------------------------------------------------------------------------- local run_arguments_recursive_simple do -- Simplified lua-nucleo version, equivalent to the others. local function impl(arg_n, expected_type, value, ...) -- Points error on function, calling function which calls *arguments() if type(value) ~= expected_type then error( "argument #"..arg_n..": expected `"..tostring(expected_type) .. "', got `"..type(value).."'", 3 + arg_n ) end -- If have at least one more type, check it return ((...) ~= nil) and impl(arg_n + 1, ...) or true end local arguments_recursive = function(...) local nargs = select('#', ...) return (nargs > 0) and impl(1, ...) or true end run_arguments_recursive_simple = function(a, b, c) arguments_recursive( "number", a, "boolean", b, "string", c ) end end -------------------------------------------------------------------------------- local run_arguments_recursive_lua_nucleo do -- Taken directly from lua-nucleo local lua51_types = { ["nil"] = true; ["boolean"] = true; ["number"] = true; ["string"] = true; ["table"] = true; ["function"] = true; ["thread"] = true; ["userdata"] = true; } local function impl(is_optional, arg_n, expected_type, value, ...) -- Points error on function, calling function which calls *arguments() if type(value) ~= expected_type then if not lua51_types[expected_type] then error( "argument #"..arg_n..": bad expected type `"..tostring(expected_type).."'", 3 + arg_n ) end if not is_optional or value ~= nil then error( (is_optional and "optional" or "") .. "argument #"..arg_n..": expected `"..tostring(expected_type) .. "', got `"..type(value).."'", 3 + arg_n ) end end -- If have at least one more type, check it return ((...) ~= nil) and impl(is_optional, arg_n + 1, ...) or true end local arguments_recursive = function(...) local nargs = select('#', ...) return (nargs > 0) and ( (nargs % 2 == 0) and impl(false, 1, ...) -- Not optional or error("arguments: bad call, dangling argument detected") ) or true end run_arguments_recursive_lua_nucleo = function(a, b, c) arguments_recursive( "number", a, "boolean", b, "string", c ) end end -------------------------------------------------------------------------------- -- TODO: Add a version with full-blown validation. local run_arguments_unroll_simple do -- TODO: Put a code-generation metatable over cache -- and pre-populate it for cases with (1-10) * 2 arguments. -- If __index sees odd number, it should crash -- with dangling argument error. local arguments_cache = { [6] = function(t1, v1, t2, v2, t3, v3) if type(v1) ~= t1 then error( "argument #1: expected `"..tostring(t1) .. "', got `"..type(v1).."'", 4 ) end if type(v2) ~= t2 then error( "argument #2: expected `"..tostring(t2) .. "', got `"..type(v2).."'", 4 ) end if type(v3) ~= t3 then error( "argument #3: expected `"..tostring(t3) .. "', got `"..type(v3).."'", 4 ) end end; } local arguments = function(...) local n = select("#", ...) -- Assuming cache is pre-populated for all possible use-cases return assert(arguments_cache[n])(...) end run_arguments_unroll_simple = function(a, b, c) arguments( "number", a, "boolean", b, "string", c ) end end -------------------------------------------------------------------------------- local run_arguments_hardcoded_simple do -- Not much real-word meaning, just for comparison with -- run_arguments_unroll_simple. local hardcoded_arguments_6 = function(t1, v1, t2, v2, t3, v3) if type(v1) ~= t1 then error( "argument #1: expected `"..tostring(t1) .. "', got `"..type(v1).."'", 2 ) end if type(v2) ~= t2 then error( "argument #2: expected `"..tostring(t2) .. "', got `"..type(v2).."'", 2 ) end if type(v3) ~= t3 then error( "argument #3: expected `"..tostring(t3) .. "', got `"..type(v3).."'", 2 ) end end run_arguments_hardcoded_simple = function(a, b, c) hardcoded_arguments_6( "number", a, "boolean", b, "string", c ) end end -------------------------------------------------------------------------------- bench = { } bench.plain_assert = function() run_plain_assert(42, true, "aaa") end bench.assert_is = function() run_assert_is(42, true, "aaa") end bench.assert_is_alloc = function() -- Imitating args table allocation. -- Needed to compensate plain Lua interpreter -- compatibility mode. local a, b, c = { }, { }, { } run_assert_is(42, true, "aaa") end bench.args_select_simple = function() run_arguments_select_simple(42, true, "aaa") end bench.args_recursive_simp = function() run_arguments_recursive_simple(42, true, "aaa") end bench.args_recursive_ln = function() run_arguments_recursive_lua_nucleo(42, true, "aaa") end bench.args_unroll_simple = function() run_arguments_unroll_simple(42, true, "aaa") end bench.args_hard_simple = function() run_arguments_hardcoded_simple(42, true, "aaa") end return bench rvirding-luerl-772b25e/examples/benchmark/suites/sort-simple.lua0000664000232200023220000000326615114130670025440 0ustar debalancedebalancelocal table_sort = table.sort local math_random, math_randomseed = math.random, math.randomseed -------------------------------------------------------------------------------- math_randomseed(12345) -------------------------------------------------------------------------------- -- TODO: Benchmark some pure-lua qsort local DATA_SIZE = 1e1 local generate_data = function() local t = { } for i = 1, DATA_SIZE do t[i] = math_random() end return t end local less = function(lhs, rhs) return lhs < rhs end local bubble_sort = function(t) for i = 2, #t do local switched = false for j = #t, i, -1 do if t[j] < t[j - 1] then t[j], t[j - 1] = t[j - 1], t[j] switched = true end end if switched == false then return t end end return t end local bubble_sort_cb = function(t, less) for i = 2, #t do local switched = false for j = #t, i, -1 do if less(t[j], t[j - 1]) then t[j], t[j - 1] = t[j - 1], t[j] switched = true end end if switched == false then return t end end return t end -------------------------------------------------------------------------------- bench = { } bench.generate_only = function() local data = generate_data() return true end bench.tsort_nocallback = function() local data = generate_data() return table_sort(data) end bench.tsort_callback = function() local data = generate_data() return table_sort(data, less) end bench.bubble_nocallback = function() local data = generate_data() return bubble_sort(data) end bench.bubble_callback = function() local data = generate_data() return bubble_sort_cb(data, less) end return bench rvirding-luerl-772b25e/examples/benchmark/suites/vararg.lua0000664000232200023220000000223415114130670024436 0ustar debalancedebalancelocal noop = function() end local vararg_callback = function(...) end local call_noargs = function(fn) fn() end local call_vararg = function(fn, ...) fn(...) end local call_3 = function(fn, a, b, c) fn(a, b, c) end NUM_ITER = 1000 bench = { } bench.noop = noop bench.vararg_callback = vararg_callback bench.call_noargs_noop_nil = function() call_noargs(noop) end bench.call_noargs_vararg_nil = function() call_noargs(vararg_callback) end bench.call_vararg_noop_nil = function() call_noargs(noop) end bench.call_vararg_vararg_nil = function() call_noargs(vararg_callback) end bench.call_3_noop_nil = function() call_3(noop) end bench.call_3_vararg_nil = function() call_3(vararg_callback) end bench.call_noargs_noop_3 = function() call_noargs(noop, 1, 2, 3) end bench.call_noargs_vararg_3 = function() call_noargs(vararg_callback, 1, 2, 3) end bench.call_vararg_noop_3 = function() call_noargs(noop, 1, 2, 3) end bench.call_vararg_vararg_3 = function() call_noargs(vararg_callback, 1, 2, 3) end bench.call_3_noop_3 = function() call_3(noop, 1, 2, 3) end bench.call_3_vararg_3 = function() call_3(vararg_callback, 1, 2, 3) end return bench rvirding-luerl-772b25e/examples/benchmark/suites/elseif_large.lua0000664000232200023220000000265615114130670025605 0ustar debalancedebalance-- TODO: ?! Is this benchmark still relevant? local tostring, assert, loadstring, ipairs = tostring, assert, loadstring, ipairs local table_concat = table.concat local math_floor = math.floor local noop = function() end local plain_call = function(a) noop() end local make_plain_call = function() return plain_call end local make_elseifs = function(n) local buf = { } local _ = function(v) buf[#buf + 1] = tostring(v) end _ "local noop = function() end " _ "return function(a)" _ " if a == 'a" _(1) _"' then noop()" for i = 2, n do _ " elseif a == 'a" _(i) _"' then noop()" end _ " else error('unknown param') end" _ " end" return assert(loadstring(table_concat(buf)))() end local make_callmaps = function(n) local buf = { } local _ = function(v) buf[#buf + 1] = tostring(v) end _ "local noop = function() end " _ "local map = {" for i = 1, n do _ "a" _(i) _ " = noop;" end _ "} " _ "return function(a) assert(map[a])() end" return assert(loadstring(table_concat(buf)))() end local bench_fn = function(fn, n) return function() fn("a" .. math_floor(n / 2 + 0.5)) end end local mark_fn = function(make, n) return bench_fn(make(n), n) end bench = { } for _, i in ipairs { 1, 5, 10, 15, 20, 100, 250, 500, 1000 } do bench["plain_"..i] = mark_fn(make_plain_call, i) bench["callmap_"..i] = mark_fn(make_callmaps, i) bench["elseif_"..i] = mark_fn(make_elseifs, i) end return bench rvirding-luerl-772b25e/examples/benchmark/suites/tailcall.lua0000664000232200023220000000064715114130670024747 0ustar debalancedebalancelocal ret = function(t) t[1] = true return t end local noret = function(t) t[1] = true end bench = { } bench.tailcall_local = function() local t = {} return ret(t) end bench.tailcall_nolocal = function() return ret({}) end bench.notailcall_return = function() local t = {} ret(t) return t end bench.notailcall_noreturn = function() local t = {} noret(t) return t end return table.pack(bench) rvirding-luerl-772b25e/examples/benchmark/suites/nloop.lua0000664000232200023220000000120015114130670024273 0ustar debalancedebalancelocal ipairs = ipairs local t = {} for i = 1, 55 do t[i] = i end t[51] = nil -- A hole bench = {} -- Bench function does: -- 1. Set all table elements to 0 until the first hole. -- 2. Return hole position. bench.loop_ipairs = function() local j for i, v in ipairs(t) do t[i] = 0 j = i end return j + 1 end bench.loop_for = function() local n = #t local j = n for i = 1, n do local v = t[i] if v == nil then j = i break end t[i] = 0 end return j end bench.loop_while = function() local i = 1 while t[i] ~= nil do t[i] = 0 i = i + 1 end return i end return bench rvirding-luerl-772b25e/examples/benchmark/suites/inf.lua0000664000232200023220000000047615114130670023736 0ustar debalancedebalancelocal tonumber = tonumber local math_huge = math.huge bench = {} -- bench.e309 = function() -- local inf = 1e309 -- end bench.huge = function() local inf = math_huge end -- bench.divide = function() -- local inf = 1/0 -- end -- bench.tonumber = function() -- local inf = tonumber("inf") -- end return bench rvirding-luerl-772b25e/examples/benchmark/suites/COPYRIGHT0000664000232200023220000000264615114130670023753 0ustar debalancedebalanceLuamarca is licensed under the terms of the MIT license reproduced below. This means that Luamarca is free software and can be used for both academic and commercial purposes at absolutely no cost. =============================================================================== Copyright (C) 2008-2009 Luamarca authors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. =============================================================================== (end of COPYRIGHT) rvirding-luerl-772b25e/examples/benchmark/suites/selectvstable.lua0000664000232200023220000000106115114130670026011 0ustar debalancedebalancelocal select = select local select_test = function(...) local nargs = select("#", ...) local r = { } for i = 1, nargs do r[#r + 1] = select(i, ...) * 2 end return r end local table_test = function(...) local nargs = select("#", ...) -- Still have to do this in case of nils local args = { ... } local r = { } for i = 1, nargs do r[#r + 1] = args[i] * 2 end return r end bench = { } bench.select = function() return select_test(3, 5, 1, 9, 7) end bench.table = function() return table_test(3, 5, 1, 9, 7) end return bench rvirding-luerl-772b25e/examples/benchmark/suites/tclone.lua0000664000232200023220000001455415114130670024450 0ustar debalancedebalance-------------------------------------------------------------------------------- -- tclone.lua: tclone benchmark -------------------------------------------------------------------------------- local type, pairs, assert, error, unpack, next, newproxy = type, pairs, assert, error, unpack, next, newproxy local math_randomseed, math_random = math.randomseed, math.random local string_char = string.char local table_concat = table.concat -- local coroutine_create = coroutine.create -------------------------------------------------------------------------------- math_randomseed(123456) -------------------------------------------------------------------------------- -- -- Current lua-nucleo version (a166af) -- local tclone_nucleo do local function impl(t, visited) local t_type = type(t) if t_type ~= "table" then return t end assert(not visited[t], "recursion detected") visited[t] = true local r = { } for k, v in pairs(t) do r[impl(k, visited)] = impl(v, visited) end visited[t] = nil return r end tclone_nucleo = function(t) return impl(t, { }) end end -- -- tclone2 by Dimiter "malkia" Stanev -- http://article.gmane.org/gmane.comp.lang.lua.general/82378 -- local tclone2 do local function impl(t, visited, rtimes) local t_type = type(t) if t_type ~= "table" then return t end -- Don't remember all visited[t] levels -- Just remember every once in a 128 times -- If there is a recursion it'll still be detected -- But 128 stack levels deeper assert(not visited[t], "recursion detected (with some latency)") if rtimes == 128 then rtimes = 1 visited[t] = t end local r = { } for k, v in pairs(t) do r[impl(k, visited, rtimes + 1)] = impl(v, visited, rtimes + 1) end if rtimes == 1 then visited[t] = nil end return r end tclone2 = function(t) return impl(t, { }, 1) end end -- -- tclone5 by Dimiter "malkia" Stanev -- http://article.gmane.org/gmane.comp.lang.lua.general/82379 -- local tclone5 do local function impl(t, visited, rtimes) if visited[t] then error("recursion detected") end if rtimes == 128 then rtimes = 1 visited[t] = true end local r = { } for k, v in pairs(t) do if type(k) == "table" then if type(v) == "table" then r[impl(k, visited, rtimes + 1)] = impl(v, visited, rtimes + 1) else r[impl(k, visited, rtimes + 1)] = v end elseif type(v) == "table" then r[k] = impl(v, visited, rtimes + 1) else r[k] = v end end if rtimes == 1 then visited[t] = nil end return r end tclone5 = function(t) if type(t) == "table" then return impl(t, { }, 1) end return t end end -- -- tclone6 by Dimiter "malkia" Stanev -- http://article.gmane.org/gmane.comp.lang.lua.general/82601 -- With a fix in while condition -- local tclone6 do local function impl(t, visited, rtimes) if visited[t] then error("recursion detected") end if rtimes == 128 then rtimes = 1 visited[t] = true end local r = { } local k, v = next(t) while k ~= nil do if type(k) == "table" then if type(v) == "table" then r[impl(k, visited, rtimes + 1)] = impl(v, visited, rtimes + 1) else r[impl(k, visited, rtimes + 1)] = v end elseif type(v) == "table" then r[k] = impl(v, visited, rtimes + 1) else r[k] = v end k, v = next(t, k) end if rtimes == 1 then visited[t] = nil end return r end tclone6 = function(t) if type(t) == "table" then return impl(t, { }, 1) end return t end end -------------------------------------------------------------------------------- -- TODO: From lua-nucleo/test/table.lua. -- Make that available to other projects and reuse. local function gen_random_dataset(num, nesting, visited, random) random = random or math_random nesting = nesting or 1 visited = visited or {} num = num or random(0, 10) local gen_str = function() local len = random(1, 64) local t = {} for i = 1, len do t[i] = string_char(random(0, 255)) end return table_concat(t) end local gen_bool = function() return random() >= 0.5 end local gen_udata = function() return newproxy() end local gen_func = function() return function() end end -- local gen_thread = function() return coroutine_create(function() end) end local gen_nil = function() return nil end local gen_visited_link = function() if #visited > 1 then return visited[random(1, #visited)] else return gen_str() end end local generators = { gen_bool; gen_bool; gen_bool; function() return random(-10, 10) end; gen_str; gen_str; gen_str; --[[ gen_thread; gen_thread; gen_func; gen_func; gen_udata; gen_udata;--]] --gen_visited_link; function() if nesting >= 10 then return nil end local t = { } visited[#visited + 1] = t local n = random(0, 10 - nesting) for i = 1, n do local k = gen_random_dataset(1, nesting + 1, visited, random) if k == nil then k = "(nil)" end t[k] = gen_random_dataset(1, nesting + 1, visited, random) end return t end } local t = {} visited[#visited + 1] = t for i = 1, num do local n = random(1, #generators) t[i] = generators[n]() end return unpack(t, 1, num) end -------------------------------------------------------------------------------- local DATA = { gen_random_dataset(20) } -------------------------------------------------------------------------------- bench = { } -------------------------------------------------------------------------------- bench.lua_nucleo = function() local data = tclone_nucleo(DATA) assert(data ~= DATA) -- TODO: Check equality. end bench.tclone2 = function() local data = tclone2(DATA) assert(data ~= DATA) -- TODO: Check equality. end bench.tclone5 = function() local data = tclone5(DATA) assert(data ~= DATA) -- TODO: Check equality. end bench.tclone6 = function() local data = tclone5(DATA) assert(data ~= DATA) -- TODO: Check equality. end -------------------------------------------------------------------------------- return bench rvirding-luerl-772b25e/examples/benchmark/suites/is_integer.lua0000664000232200023220000000300515114130670025301 0ustar debalancedebalancelocal math_floor = math.floor bench = {} local integer, noninteger = 12345, 12345.67 local noop = function(a) return a end local isint_floor = function(a) if a == math_floor(a) then return true end return false end local isint_floor_direct = function(a) return (a == math_floor(a)) end local isint_mod = function(a) if a % 1 == 0 then return true end return false end local isint_mod_direct = function(a) return (a % 1 == 0) end local isint_bits = function(a) if (a + 2^52) - 2^52 == a then return true end return false end local isint_bits_direct = function(a) return (a + 2^52) - 2^52 == a end bench.noop_int = function() noop(integer) end bench.noop_nonint = function() noop(noninteger) end bench.floor_int = function() isint_floor(integer) end bench.floor_nonint = function() isint_floor(noninteger) end bench.floor_int_direct = function() isint_floor_direct(integer) end bench.floor_nonint_direct = function() isint_floor_direct(noninteger) end bench.mod_int = function() isint_mod(integer) end bench.mod_nonint = function() isint_mod(noninteger) end bench.mod_int_direct = function() isint_mod_direct(integer) end bench.mod_nonint_direct = function() isint_mod_direct(noninteger) end bench.bits_int = function() isint_bits(integer) end bench.bits_nonint = function() isint_bits(noninteger) end bench.bits_int_direct = function() isint_bits_direct(integer) end bench.bits_nonint_direct = function() isint_bits_direct(noninteger) end return bench rvirding-luerl-772b25e/examples/benchmark/suites/next_vs_pairs.lua0000664000232200023220000000057215114130670026043 0ustar debalancedebalancelocal pairs, next = pairs, next local t = {} for i = 1, 50 do t[i] = i -- Array part t[i * 256] = i -- Hash part end bench = {} bench.pairs = function() local sum = 0 for k, v in pairs(t) do sum = sum + v end end bench.next = function() local sum = 0 local k, v = next(t) while k ~= nil do sum = sum + v k, v = next(t, k) end end return bench rvirding-luerl-772b25e/examples/minibench/0000775000232200023220000000000015114130670021136 5ustar debalancedebalancervirding-luerl-772b25e/examples/minibench/minibench2.erl0000664000232200023220000001463715114130670023673 0ustar debalancedebalance%% File : minibench2.erl %% Author : Henning Diedrich %% File : luerl/examples/minibench/minibench.erl %% Purpose : Benchmark for frequent calls to small Luerl scripts %% Author : Henning Diedrich %% Use $ cd ./examples/minibench %% $ erlc minibench.erl %% $ erl -pa ../../ebin -s minibench run -s init stop -noshell %% Or $ make minibench -module(minibench2). -export([run/0]). run() -> io:format("----------------------------------------------------------~n"), io:format("This is a benchmark of frequent fast calls into Luerl.~n"), % I. eval and execute DoStr1 = "a = 7.33; b = 9000; c = (33 * a / b) ^ 15 * a + b; return c", io:format("----------------------------------------------------------~n"), io:format("Init state, parse and execute '~s'~n", [DoStr1]), I1 = 10000, {T1,_State} = timer:tc(fun() -> do_loop(I1, DoStr1) end), io:format("Adding Up: ~p microseconds for ~p x calling Lua and returning the result of '~s'.~n", [T1,I1,DoStr1]), io:format("Per call: ~p microseconds.~n", [T1/I1]), % II. eval once, then only execute DoStr2 = "a = 7.33; b = 9000; c = (33 * a / b) ^ 15 * a + b; return c", io:format("----------------------------------------------------------~n"), io:format("Init state, and execute pre-parsed '~s'~n", [DoStr2]), I2 = 10000, {ok, Chunk2, State2} = luerl:load(DoStr2, luerl:init()), {T2,_State21} = timer:tc(fun() -> do_loop_state(I2, Chunk2, State2) end), io:format("Adding Up: ~p microseconds for ~p x calling Lua and returning the result of '~s'.~n", [T2,I2,DoStr2]), io:format("Per call: ~p microseconds.~n", [T2/I2]), % III. eval once, then only execute DoStr3 = "a = 7.33; b = 9000; c = (33 * a / b) ^ 15 * a + b; return c", io:format("----------------------------------------------------------~n"), io:format("Execute pre-parse execute '~s', re-using same state~n", [DoStr3]), I3 = 10000, {ok, Chunk3, State3} = luerl:load(DoStr3, luerl:init()), {T3,_State31} = timer:tc(fun() -> do_loop_state(I3, Chunk3, State3) end), io:format("Adding Up: ~p microseconds for ~p x calling Lua and returning the result of '~s'.~n", [T3,I3,DoStr3]), io:format("Per call: ~p microseconds.~n", [T3/I3]), % IV. measure but state initialization io:format("----------------------------------------------------------~n"), io:format("Pure initialization of Lua state~n"), I4 = 10000, {T4,_State41} = timer:tc(fun() -> [luerl:init() || _ <- lists:seq(1,I4)] end), io:format("Adding Up: ~p microseconds for ~p x initializing a Lua state.~n", [T4,I4]), io:format("Per call: ~p microseconds.~n", [T4/I4]), % V. eval once, then only execute, re-use previous state DoStr5 = "a = 7.33; b = 9000; c = (33 * a / b) ^ 15 * a + b; return c", io:format("----------------------------------------------------------~n"), io:format("Execute pre-parsed '~s', re-using state from last result~n", [DoStr5]), I5 = 10000, {ok, Chunk5, State5} = luerl:load(DoStr5, luerl:init()), {T5,_State51} = timer:tc(fun() -> do_loop_chain(I5, Chunk5, State5) end), io:format("Adding Up: ~p microseconds for ~p x calling Lua and returning the result of '~s'.~n", [T5,I5,DoStr5]), io:format("Per call: ~p microseconds.~n", [T5/I5]), % Vb. function call, re-use previous state DoStr5b = "function OneAndOne() a = 7.33; b = 9000; c = (33 * a / b) ^ 15 * a + b; return c end", io:format("----------------------------------------------------------~n"), io:format("Execute pre-parsed function '~s', re-using state from last result~n", [DoStr5b]), I5b = 10000, State5b = luerl:init(), {ok,[],State5b1} = luerl:do(DoStr5b, State5b), io:format("-"), {T5b,_State5b1} = timer:tc(fun() -> do_loop_do(I5b, "return OneAndOne()", State5b1) end), io:format("Adding Up: ~p microseconds for ~p x calling Lua and returning the result of '~s'.~n", [T5b,I5b,DoStr5b]), io:format("Per call: ~p microseconds.~n", [T5b/I5b]), % Vc. empty function call, re-use previous state DoStr5c = "function EmptyFunc() end", io:format("----------------------------------------------------------~n"), io:format("Execute empty function, re-using state from last result~n"), I5c = 10000, State5c = luerl:init(), {ok,[],State5c1} = luerl:do(DoStr5c, State5c), io:format("-"), {T5c,_State5c1} = timer:tc(fun() -> do_loop_do(I5c, "EmptyFunc()", State5c1) end), io:format("Adding Up: ~p microseconds for ~p x calling empty function.~n", [T5c,I5c]), io:format("Per call: ~p microseconds.~n", [T5c/I5c]), % VI. measure but parsing DoStr6 = "a = 7.33; b = 9000; c = (33 * a / b) ^ 15 * a + b; return c", io:format("----------------------------------------------------------~n"), io:format("Pure parsing~n"), I6 = 10000, {T6,_State61} = timer:tc(fun() -> [luerl:load(DoStr6, luerl:init()) || _ <- lists:seq(1,I6)] end), io:format("Adding Up: ~p microseconds for ~p x calling Lua and returning the result of '~s'.~n", [T6,I6,DoStr6]), io:format("Per call: ~p microseconds.~n", [T6/I6]), % VII. Parse and execute DoStr7 = "a = 7.33; b = 9000; c = (33 * a / b) ^ 15 * a + b; return c", io:format("----------------------------------------------------------~n"), io:format("Parse and execute 'a = 7.33; b = 9000; c = (33 * a / b) ^ 15 * a + b', re-using state~n"), I7 = 10000, State7 = luerl:init(), {T7,_State71} = timer:tc(fun() -> do_loop_do(I7, DoStr7, State7) end), io:format("Adding Up: ~p microseconds for ~p x calling Lua and returning the result of '~s'.~n", [T7,I7,DoStr7]), io:format("Per call: ~p microseconds.~n", [T7/I7]), done. % helper do_loop(N, Chunk) when N > 0 -> luerl:do(Chunk, luerl:init()), do_loop(N-1, Chunk); do_loop(0, _) -> ok. do_loop_state(N, Chunk, State) when N > 0 -> luerl:call_chunk(Chunk, [], State), do_loop_state(N-1, Chunk, State); do_loop_state(0, _, _) -> ok. do_loop_do(N, String, State) when N > 0 -> {ok,_,State1} = luerl:do(String, State), do_loop_do(N-1, String, State1); do_loop_do(0, _, _) -> ok. do_loop_chain(N, Chunk, State0) when N > 0 -> {ok,_,State1} = luerl:call_chunk(Chunk, State0), do_loop_chain(N-1, Chunk, State1); do_loop_chain(0, _, _) -> ok. rvirding-luerl-772b25e/examples/minibench/minibench.erl0000664000232200023220000001112015114130670023571 0ustar debalancedebalance%% File : mini.erl %% Author : Henning Diedrich %% File : luerl/examples/minibench/minibench.erl %% Purpose : Benchmark for frequent calls to small Luerl scripts %% Author : Henning Diedrich %% Use $ cd ./examples/minibench %% $ erlc minibench.erl %% $ erl -pa ../../ebin -s minibench run -s init stop -noshell %% Or $ make minibench -module(minibench). -export([run/0]). run() -> io:format("----------------------------------------------------------~n"), io:format("This is a benchmark of frequent fast calls into Luerl.~n"), % I. eval and execute io:format("----------------------------------------------------------~n"), io:format("Init state, parse and execute '1 + 1'~n"), I1 = 100000, {T1,_State} = timer:tc(fun() -> do_loop(I1, "return 1 + 1") end), io:format("Adding Up: ~p microseconds for ~p x calling Lua and returning the result of 1 + 1.~n", [T1,I1]), io:format("Per call: ~p microseconds.~n", [T1/I1]), % II. eval once, then only execute io:format("----------------------------------------------------------~n"), io:format("Init state, and execute pre-parsed '1 + 1'~n"), I2 = 100000, {ok, Chunk2, State2} = luerl:load("return 1 + 1", luerl:init()), {T2,_State21} = timer:tc(fun() -> do_loop_state(I2, Chunk2, State2) end), io:format("Adding Up: ~p microseconds for ~p x calling Lua and returning the result of 1 + 1.~n", [T2,I2]), io:format("Per call: ~p microseconds.~n", [T2/I2]), % III. eval once, then only execute io:format("----------------------------------------------------------~n"), io:format("Execute pre-parse execute '1 + 1', re-using same state~n"), I3 = 100000, State3 = luerl:init(), {ok, Chunk3, State31} = luerl:load("return 1 + 1", State3), {T3,_State31} = timer:tc(fun() -> do_loop_state(I3, Chunk3, State31) end), io:format("Adding Up: ~p microseconds for ~p x calling Lua and returning the result of 1 + 1.~n", [T3,I3]), io:format("Per call: ~p microseconds.~n", [T3/I3]), % IV. measure but state initialization io:format("----------------------------------------------------------~n"), io:format("Pure initialization of Lua state~n"), I4 = 100000, {T4,_State41} = timer:tc(fun() -> [luerl:init() || _ <- lists:seq(1,I4)] end), io:format("Adding Up: ~p microseconds for ~p x initializing Lua state.~n", [T4,I4]), io:format("Per call: ~p microseconds.~n", [T4/I4]), % V. eval once, then only execute, re-use previous state io:format("----------------------------------------------------------~n"), io:format("Execute pre-parsed '1 + 1', re-using state from last result~n"), I5 = 100000, State5 = luerl:init(), {ok, Chunk5, State51} = luerl:load("return 1 + 1", State5), {T5,_State51} = timer:tc(fun() -> do_loop_chain(I5, Chunk5, State51) end), io:format("Adding Up: ~p microseconds for ~p x calling Lua and returning the result of 1 + 1.~n", [T5,I5]), io:format("Per call: ~p microseconds.~n", [T5/I5]), % VI. measure but parsing io:format("----------------------------------------------------------~n"), io:format("Pure parsing~n"), I6 = 100000, {T6,_State61} = timer:tc(fun() -> [luerl:load("return 1 + 1", luerl:init()) || _ <- lists:seq(1,I6)] end), io:format("Adding Up: ~p microseconds for ~p x calling Lua and returning the result of 1 + 1.~n", [T6,I6]), io:format("Per call: ~p microseconds.~n", [T6/I6]), % VII. Parse and execute io:format("----------------------------------------------------------~n"), io:format("Parse and execute '1 + 1', re-using state~n"), I7 = 100000, State7 = luerl:init(), {T7,_State71} = timer:tc(fun() -> do_loop_do(I7, "return 1 + 1", State7) end), io:format("Adding Up: ~p microseconds for ~p x calling Lua and returning the result of 1 + 1.~n", [T7,I7]), io:format("Per call: ~p microseconds.~n", [T7/I7]), done. % helper do_loop(N, Chunk) when N > 0 -> luerl:do(Chunk, luerl:init()), do_loop(N-1, Chunk); do_loop(0, _) -> ok. do_loop_state(N, Chunk, State) when N > 0 -> luerl:call_chunk(Chunk, [], State), do_loop_state(N-1, Chunk, State); do_loop_state(0, _, _) -> ok. do_loop_do(N, String, State) when N > 0 -> luerl:do(String, State), do_loop_do(N-1, String, State); do_loop_do(0, _, _) -> ok. do_loop_chain(N, Chunk, State0) when N > 0 -> {ok,_,State1} = luerl:call_chunk(Chunk, [], State0), do_loop_chain(N-1, Chunk, State1); do_loop_chain(0, _, _) -> ok. rvirding-luerl-772b25e/examples/minibench/Makefile0000664000232200023220000000046515114130670022603 0ustar debalancedebalanceEXAMPLES = minibench \ minibench2 ROOTDIR = ../.. SRCDIR = $(ROOTDIR)/src BEAMDIR = $(ROOTDIR)/ebin all: $(EXAMPLES) clean: rm -f *.beam erl_crash.dump .SECONDARY: %.beam: %.erl $(SRCDIR)/*.hrl erlc -I $(SRCDIR) $< %: %.beam erl -pa $(BEAMDIR) -s $@ run -s init stop -noshell .PHONY: all clean rvirding-luerl-772b25e/examples/Makefile0000664000232200023220000000024215114130670020640 0ustar debalancedebalanceSUBDIRS ?= hello all clean: @for subdir in $(SUBDIRS); do \ echo $(MAKE) -C $$subdir $@; \ $(MAKE) -C $$subdir $@; \ done .PHONY: all clean rvirding-luerl-772b25e/examples/hello/0000775000232200023220000000000015114130670020305 5ustar debalancedebalancervirding-luerl-772b25e/examples/hello/hello2-6.lua0000664000232200023220000000025315114130670022340 0ustar debalancedebalance-- File : hello2-6.lua -- Purpose : Demonstration of Luerl interface. -- See : ./examples/hello/hello2.erl a = 'new contents of a' print('(27) (a) ' .. a) return arvirding-luerl-772b25e/examples/hello/hello_table.erl0000664000232200023220000000210415114130670023260 0ustar debalancedebalance%% File : hello_table.erl %% Purpose : Brief demonstration of Luerl table access. %% Use $ erlc hello_table_new.erl && erl -pa ../../ebin -s hello_table_new run -s init stop -noshell -module(hello_table). -export([run/0]). run() -> LuaScript = <<"hello_table = { hello=\"world\" }; return hello_table">>, {ok, [_Table], Lua0} = luerl:do(LuaScript, luerl:init()), {ok,World,Lua1} = luerl:get_table_keys_dec([hello_table, hello], Lua0), {ok,Lua2} = luerl:set_table_keys_dec([hello_table, hello], there, Lua1), {ok,HelloDict,Lua3} = luerl:get_table_keys_dec([hello_table], Lua2), {ok,There, Lua4} = luerl:get_table_keys_dec([hello_table, hello], Lua3), io:format("(1) hello ~s ~s - ~p~n", [There, World, HelloDict]), {ok,Lua5} = luerl:set_table_keys([<<"hello_table">>, <<"goodbye">>], <<"bye">>, Lua4), {ok, Bye, Lua6} = luerl:get_table_keys([<<"hello_table">>, <<"goodbye">>], Lua5), {ok, HelloTab, _Lua7} = luerl:get_table_keys([<<"hello_table">>], Lua6), io:format("(2) ~s - ~p~n", [Bye, HelloTab]), done. rvirding-luerl-772b25e/examples/hello/hello_userdata.erl0000664000232200023220000000151715114130670024010 0ustar debalancedebalance%% File : hello_userdata.erl %% Purpose : Brief demonstration of Luerl userdata access. %% Use $ erlc hello_userdata_new.erl && erl -pa ../../ebin -s hello_userdata_new run -s init stop -noshell -module(hello_userdata). -export([run/0]). run() -> St0 = luerl:init(), U42 = {userdata,42}, %The original decoded data {Uref,St1} = luerl:encode(U42, St0), {ok,St2} = luerl:set_table_keys([<<"u1">>], Uref, St1), {ok,St3} = luerl:set_table_keys([<<"u2">>], Uref, St2), %% This call wraps the actual data for us. St4 = luerl_heap:set_userdata_data(Uref, 84, St3), {ok,Uref,St5} = luerl:get_table_keys([<<"u1">>], St4), {ok,Uref,St6} = luerl:get_table_keys([<<"u2">>], St5), U84 = {userdata,84}, %New decoded data U84 = luerl:decode(Uref, St6), St6. rvirding-luerl-772b25e/examples/hello/hello2-3.lua0000664000232200023220000000031215114130670022331 0ustar debalancedebalance-- File : hello2-3.lua -- Purpose : Demonstration of Luerl interface. -- See : ./examples/hello/hello2.erl function no() print("(16) No!") end print("(15) Maybe ...") return "(X) Yes!"rvirding-luerl-772b25e/examples/hello/hello_funcalls.erl0000664000232200023220000000234015114130670024002 0ustar debalancedebalance%% File : hello_funcalls.erl %% Purpose : Demonstration of various ways to expose Erlang functions to Luerl. %% Use $ erlc hello_funcalls.erl && erl -pa ../../ebin -s hello_funcalls run -s init stop -noshell -module(hello_funcalls). -include("luerl.hrl"). -export([run/0,mfa_function/3]). regular_function(Args, St) -> io:format("regular_function(~p)\n", [Args]), {[42], St}. mfa_function(StaticArgs, DynamicArgs, St) -> io:format("mfa_function(~p, ~p)\n", [StaticArgs, DynamicArgs]), {[42], St}. run() -> LuaScript = <<"return hello_funcall(4, 5, 6)">>, Lua = luerl:init(), {ok,Lua1} = luerl:set_table_keys_dec([<<"hello_funcall">>], fun regular_function/2, Lua), % The argument part of {M,F,A} won't get encoded, so that is why % we can get away with passing a tuple here. {ok,Lua2} = luerl:set_table_keys_dec([<<"hello_funcall">>], {hello_funcalls,mfa_function,{1,2}}, Lua), {ok,Res1, _} = luerl:do(LuaScript, Lua1), io:format("regular_function got ~p~n", Res1), {ok,Res2, _} = luerl:do(LuaScript, Lua2), io:format("mfa_function got ~p~n", Res2). rvirding-luerl-772b25e/examples/hello/hello2-5.lua0000664000232200023220000000024015114130670022333 0ustar debalancedebalance-- File : hello2-5.lua -- Purpose : Demonstration of Luerl interface. -- See : ./examples/hello/hello2.erl print ("(26) hello2-5.lua talking. a: " .. a)rvirding-luerl-772b25e/examples/hello/hello_sandbox.erl0000664000232200023220000000416515114130670023640 0ustar debalancedebalance%% File : hello_sandbox.erl %% Purpose : Brief demonstration of Luerl sandbox basics. %% Use $ erlc hello_sandbox.erl && erl -pa ./ebin -s hello_sandbox run -s init stop -noshell %% Or $ make hello_sandbox -module(hello_sandbox). -export([run/0]). run() -> %% Default sandboxed state. SbSt = luerl_sandbox:init(), io:format("inited\n"), %% Sandboxing globals %% {error, {lua_error, Reason, _}} = {lua_error, Reason, _} = luerl_sandbox:run("return os.getenv(\"HOME\")", [], SbSt), io:format("os.getenv with sandbox: ~p~n",[Reason]), %% Customizing sandbox %% first with default Luerl state. {ok,[<<"number">>], _} = luerl_sandbox:run("return type(1)", luerl:init()), %% then with sandboxed type function {lua_error, _, _} = luerl_sandbox:run("return type(1)", luerl_sandbox:init([['_G', type]])), %% Using sandboxed state outside of runner try luerl:do("return os.getenv(\"HOME\")", SbSt) catch _:_ -> io:format("catch error with os.getenv(\"HOME\") with sandbox~n", []) end, %% Setting values. MaxReductions = 100, SpawnOpts = [{priority, low}], Timeout = 1000, %% Script runner with reduction counting. Flags0 = #{max_reductions => MaxReductions}, {error, {reductions, R0}} = luerl_sandbox:run("a={}; for i=1,1000000 do a[i] = 5 end", Flags0, SbSt), io:format("killed process with reductions ~p > 100~n",[R0]), %% Sandboxed run with default Luerl state. Flags1 = #{max_reductions => MaxReductions, spawn_opts => SpawnOpts, max_time => Timeout}, {error, {reductions, R1}} = luerl_sandbox:run("x = 'a'; while true do x = x .. x end", Flags1, luerl:init()), io:format("killed process with reductions ~p > 100~n",[R1]), %% Unlimited reductions Flags3 = #{max_reductions => none}, {ok, [], _} = luerl_sandbox:run("a={}; for i=1,10 do a[i] = 5 end", Flags3, SbSt), io:format("Finished running with unlimited reductions ~n",[]), done. rvirding-luerl-772b25e/examples/hello/hello2-9.lua0000664000232200023220000000027415114130670022346 0ustar debalancedebalance-- File : hello2-9.lua -- Purpose : Demonstration of Luerl interface. -- See : ./examples/hello/hello2.erl function confirm(p) return p .. ' (it really is)' end return confirm(a)rvirding-luerl-772b25e/examples/hello/Makefile0000664000232200023220000000057515114130670021754 0ustar debalancedebalanceEXAMPLES = hello \ hello2 \ hello_table \ hello_userdata \ hello_sandbox \ hello_funcalls ROOTDIR = ../.. SRCDIR = $(ROOTDIR)/src BEAMDIR = $(ROOTDIR)/ebin all: $(EXAMPLES) clean: rm -f *.beam erl_crash.dump .SECONDARY: %.beam: %.erl $(SRCDIR)/*.hrl erlc -I $(SRCDIR) $< %: %.beam erl -pa $(BEAMDIR) -s $@ run -s init stop -noshell .PHONY: all clean rvirding-luerl-772b25e/examples/hello/hello.erl0000664000232200023220000000111015114130670022105 0ustar debalancedebalance%% File : hello.erl %% Purpose : Brief demonstration of Luerl basics. %% Use $ erlc hello.erl && erl -pa ./ebin -s hello run -s init stop -noshell %% Or $ make hello -module(hello). -export([run/0]). run() -> % execute a string luerl:do("print(\"Hello, Robert(o)!\")", luerl:init()), % execute a file luerl:dofile("./hello.lua", luerl:init()), % separately parse, then execute State0 = luerl:init(), {ok, Chunk, State1} = luerl:load("print(\"Hello, Chunk!\")", State0), {ok,_Ret, _NewState} = luerl:call(Chunk, [], State1), done. rvirding-luerl-772b25e/examples/hello/hello2-2.lua0000664000232200023220000000020315114130670022327 0ustar debalancedebalance-- File : hello2-2.lua -- Purpose : Demonstration of Luerl interface. -- See : ./examples/hello/hello2.erl return 2137 * 42rvirding-luerl-772b25e/examples/hello/hello2-4.lua0000664000232200023220000000023215114130670022333 0ustar debalancedebalance-- File : hello2-4.lua -- Purpose : Demonstration of Luerl interface. -- See : ./examples/hello/hello2.erl return "'(18b) Evidently, Mr. Watson.'"rvirding-luerl-772b25e/examples/hello/hello2-8.lua0000664000232200023220000000025215114130670022341 0ustar debalancedebalance-- File : hello2-8.lua -- Purpose : Demonstration of Luerl interface. -- See : ./examples/hello/hello2.erl function old() print "(33) old" end print "(32) News!"rvirding-luerl-772b25e/examples/hello/hello2-7.lua0000664000232200023220000000027015114130670022340 0ustar debalancedebalance-- File : hello2-7.lua -- Purpose : Demonstration of Luerl interface. -- See : ./examples/hello/hello2.erl a = "(28a) οἶδα οá½�κ εἰδώς, oîda ouk eidÅ�s" return a rvirding-luerl-772b25e/examples/hello/hello.lua0000664000232200023220000000021615114130670022112 0ustar debalancedebalance-- File : hello.lua -- Purpose : Brief demonstration of Luerl basics - execution of a file. -- See : ./hello.erl print("Hello, File!")rvirding-luerl-772b25e/examples/hello/hello2-10.lua0000664000232200023220000000021215114130670022406 0ustar debalancedebalance-- File : hello2-10.lua -- Purpose : Returning lua dicts -- See : ./examples/hello/hello2.erl return {1,2,{3,'Hello World!'}} rvirding-luerl-772b25e/examples/hello/hello2-1.lua0000664000232200023220000000022715114130670022334 0ustar debalancedebalance-- File : hello2-1.lua -- Purpose : Demonstration of Luerl interface. -- See : ./examples/hello/hello2.erl print("(6) Hello, File 'hello2-1'!")rvirding-luerl-772b25e/examples/hello/hello2.erl0000664000232200023220000001455115114130670022204 0ustar debalancedebalance%% File : hello2.erl %% File : luerl/examples/hello/hello2.erl %% Purpose : Demonstration of the Luerl interface. %% Author : Henning Diedrich %% Use : $ cd examples/hello && erlc hello2.erl && erl -pa ../../ebin -s hello2 run -s init stop -noshell %% Or : $ make examples -module(hello2). -export([run/0]). run() -> io:format("-------------------------------------------~n"), io:format("This is an assortment of samples and tests.~n"), io:format("-------------------------------------------~n"), io:format("It's a comprehensive demo of the interface.~n"), io:format("Please check out the source to learn more.~n"), St0A = luerl:init(), % execute a string luerl:do("print(\"(1) Hello, Robert!\")", St0A), luerl:do(<<"print(\"(2) Hello, Roberto!\")">>, St0A), % execute a string, get a result {ok,A,_} = luerl:do("return 1 + 1", St0A), {ok,A,_} = luerl:do(<<"return 1 + 1">>, St0A), io:format("(5) 1 + 1 = ~p!~n", [A]), % execute a file luerl:dofile("./hello2-1.lua", St0A), % execute a file, get a result {ok,B,_} = luerl:dofile("./hello2-2.lua", St0A), io:format("(7) 2137 * 42 = ~p?~n", [B]), % execute a standard function luerl:call_function_dec([print], [<<"(8) Hello, standard print function!">>], St0A), luerl:call_function_dec([print], [<<"(9) Hello, standard print function!">>], St0A), {ok,Result1,_} = luerl:call_function_dec([table,pack], [<<"a">>,<<"b">>,42], St0A), {ok,Result1,_} = luerl:call_function_dec([table,pack], [<<"a">>,<<"b">>,42], St0A), io:format("(10) ~p?~n", [Result1]), % separately parse, then execute (doubles (11) and Chunk1 as assertion) St1A = luerl:init(), {ok,Chunk1,St1B} = luerl:load("print(\"(11) Hello, Chunk 1!\")", St1A), {ok,Chunk1,_} = luerl:load(<<"print(\"(11) Hello, Chunk 1!\")">>, St1A), luerl:call_chunk(Chunk1, [], St1B), % separately parse, then execute (doubles (12) and Chunk2 as assertion) St2A = luerl:init(), {ok,Chunk2,St2B} = luerl:load("function chunk2() print(\"(12) Hello, Chunk 2!\") end", St2A), {ok,Chunk2,_} = luerl:load(<<"function chunk2() print(\"(12) Hello, Chunk 2!\") end">>, St2A), {ok,Result2,St2C} = luerl:call_chunk(Chunk2, [], St2B), {ok,Result2,St2D} = luerl:do(<<"function chunk2() print(\"(12) Hello, Chunk 2!\") end">>, St2A), luerl:call_function_dec([chunk2], [], St2C), luerl:call_function_dec([chunk2], [], St2D), % separately parse, then execute a file. The file defines a function no() St3A = luerl:init(), {ok,Chunk3,St3B} = luerl:loadfile("./hello2-3.lua", St3A), {ok,_Result3,St3C} = luerl:call_chunk(Chunk3, St3B), {ok,[],_} = luerl:call_function_dec([no], [], St3C), % separately parse, then execute, get a result St4A = luerl:init(), {ok,Chunk4,St4B} = luerl:load("return '(17b) Marvelous wheater today, isn°t it!'", St4A), {ok,Chunk4,_} = luerl:load(<<"return '(17b) Marvelous wheater today, isn°t it!'">>, St4A), {ok,Result4,_} = luerl:call_chunk(Chunk4, [], St4B), io:format("(17) And I say: ~p~n", [Result4]), % separately parse, then execute a file, get a result St5A = luerl:init(), {ok,Chunk5,St5B} = luerl:loadfile("./hello2-4.lua", St5A), {ok,Result5,_} = luerl:call_chunk(Chunk5, St5B), io:format("(18) And he says: ~p~n", [Result5]), % Same as above, passing State in all times. % create state New = luerl:init(), {ok,_,_New2} = luerl:do("print '(19) hello generix'", New), % change state {ok,_,State0} = luerl:do("a = 1000", New), {ok,_,State01} = luerl:do("a = 1000", New), % execute a string, using passed in State0 luerl:do("print('(22) ' .. a+2)", State0), luerl:do(<<"print('(23) ' .. a+3)">>, State0), % execute a string, get a result from passed in State0 {ok,E,_} = luerl:do("return 4 * a", State0), {ok,E,_} = luerl:do(<<"return 4 * a">>, State0), io:format("(24) 4 x a = ~p!~n", [E]), % execute a string, get a result, change State0 {ok,Z,State02} = luerl:do("a = 123; return a * 3", State01), {ok,Z,State03} = luerl:do(<<"return (3 * a)">>, State02), io:format("(25) a = ~p~n", [Z]), % execute a file using passed in state luerl:dofile("./hello2-5.lua", State03), % execute a file that changes the State0 {ok,_,State04} = luerl:dofile("./hello2-6.lua", State03), luerl:do("print('(27) (b) ' .. a)", State04), % execute a file, get a result {ok,F,State05} = luerl:dofile("./hello2-7.lua", State04), io:format("(28) F: ~ts~n", [F]), % execute a file that changes the State0, and get a value back {ok,F,State06} = luerl:dofile("./hello2-7.lua", State05), io:format("(29) F: ~ts = ", [F]), luerl:do("print('(30) F: ' .. a)", State06), % separately parse, then execute {ok,Chunk11,_} = luerl:load("print(\"(31) Hello, \" .. a .. \"!\")", State06), {ok,Chunk11,State07} = luerl:load(<<"print(\"(31) Hello, \" .. a .. \"!\")">>, State06), luerl:call_chunk(Chunk11,State07), % separately parse, then execute a file. The file defines a function old() {ok,Chunk12,St7} = luerl:loadfile("./hello2-8.lua", State07), {ok,_Result12,State07A} = luerl:call_chunk(Chunk12,St7), luerl:call_function_dec([old],[],State07A), % separately parse, then execute, get a result {ok,Chunk13,St8} = luerl:load("a = '(30a)' .. a .. ' (this is Greek)'; return a", State07), {ok,Chunk13,_} = luerl:load(<<"a = '(30a)' .. a .. ' (this is Greek)'; return a">>, State07), {ok,Result07,State08} = luerl:call_chunk(Chunk13, St8), io:format("(34) And again I said: ~ts~n", [Result07]), % separately parse, then execute a file, get a result. The file defines confirm(p) {ok,Chunk14,St9} = luerl:loadfile("./hello2-9.lua", State08), {ok,Result14,State14} = luerl:call_chunk(Chunk14, St9), io:format("(35) And twice: ~ts~n", [Result14]), {ok,Result14A,_} = luerl:call_function_dec([confirm], [<<"Is it?">>], State14), io:format("(36) Well: ~ts~n", [Result14A]), % execute a file, get the decoded result of a table {ok,Result15,_} = luerl:dofile("./hello2-10.lua", State14), io:format("(37) Decoded table: ~p~n", [Result15]), io:format("done~n"). rvirding-luerl-772b25e/examples/euler/0000775000232200023220000000000015114130670020316 5ustar debalancedebalancervirding-luerl-772b25e/examples/euler/problem_001.lua0000664000232200023220000000051215114130670023037 0ustar debalancedebalance-- If we list all the natural numbers below 10 that are multiples of 3 or 5, we get 3, 5, 6 and 9. The sum of these multiples is 23. -- Find the sum of all the multiples of 3 or 5 below 1000. LIMIT = 1000 sum = 0 for ii = 1, (LIMIT-1) do if (ii%3 == 0) or (ii%5 == 0) then sum = sum + ii end end print(sum) return sum rvirding-luerl-772b25e/examples/euler/problem_010.lua0000664000232200023220000000160415114130670023042 0ustar debalancedebalance-- The sum of the primes below 10 is 2 + 3 + 5 + 7 = 17. -- Find the sum of all the primes below two million. -- LIMIT = 2000000 LIMIT = 2000 function primes_below(limit) found_primes = { } local function divisible_by_known_primes(num) for _, v in ipairs(found_primes) do if num % v == 0 then return true end end return false end local function next_prime(found_primes, last_prime) if last_prime == nil then table.insert(found_primes, 2) return 2 end val = found_primes[#found_primes] repeat val = (val == 2) and 3 or val + 2 until(not divisible_by_known_primes(val)) table.insert(found_primes, val) if val > limit then return nil else return val end end return next_prime, found_primes, nil end sum = 0 for ii in primes_below(LIMIT) do sum = sum + ii end print(sum) return sum rvirding-luerl-772b25e/examples/euler/problem_006.lua0000664000232200023220000000116715114130670023053 0ustar debalancedebalance-- The sum of the squares of the first ten natural numbers is, -- 12 + 22 + ... + 102 = 385 -- The square of the sum of the first ten natural numbers is, -- (1 + 2 + ... + 10)2 = 552 = 3025 -- Hence the difference between the sum of the squares of the first ten natural numbers and the square of the sum is 3025 385 = 2640. -- Find the difference between the sum of the squares of the first one hundred natural numbers and the square of the sum. LIMIT = 100 sum, sum_squares = 0, 0 for ii = 1, LIMIT do sum, sum_squares = sum + ii, sum_squares + (ii * ii) end answer = (sum*sum) - sum_squares print(answer) return answer rvirding-luerl-772b25e/examples/euler/problem_008.lua0000664000232200023220000000263715114130670023060 0ustar debalancedebalance-- Find the greatest product of five consecutive digits in the 1000-digit number. -- NUMBER = "7316717653133062491922511967442657474235534919493496983520312774506326239578318016984801869478851843858615607891129494954595017379583319528532088055111254069874715852386305071569329096329522744304355766896648950445244523161731856403098711121722383113622298934233803081353362766142828064444866452387493035890729629049156044077239071381051585930796086670172427121883998797908792274921901699720888093776657273330010533678812202354218097512545405947522435258490771167055601360483958644670632441572215539753697817977846174064955149290862569321978468622482839722413756570560574902614079729686524145351004748216637048440319989000889524345065854122758866688116427171479924442928230863465674813919123162824586178664583591245665294765456828489128831426076900422421902267105562632111110937054421750694165896040807198403850962455444362981230987879927244284909188845801561660979191338754992005240636899125607176060588611646710940507754100225698315520005593572972571636269561882670428252483600823257530420752963450" NUMBER = "11111222221" largest = 0 for ii = 1, (#NUMBER-5) do digits = string.sub(NUMBER, ii, ii+5) sum = string.sub(digits, 1, 1) * string.sub(digits, 2, 2) * string.sub(digits, 3, 3) * string.sub(digits, 4, 4) * string.sub(digits, 5, 5) largest = (sum > largest) and sum or largest end print(largest) return largest rvirding-luerl-772b25e/examples/euler/problem_005.lua0000664000232200023220000000210715114130670023045 0ustar debalancedebalance-- 2520 is the smallest number that can be divided by each of the numbers from 1 to 10 without any remainder. -- What is the smallest positive number that is evenly divisible by all of the numbers from 1 to 20? LIMIT = 20 function prime_factors(n) local function factor(_, val) if n > 1 then while n % val > 0 do val = val + ( val == 2 and 1 or 2) if val * val > n then val = n end end n = n / val return val end end return factor, nil, 2 end function factorize(number) factors = {} for p in prime_factors(number) do factors[p] = factors[p] and factors[p] + 1 or 1 end return factors end function collapse(dict1, dict2) dict = {} for key, val in pairs(dict1) do dict[key] = math.max(val, dict2[key] or 0) end for key, val in pairs(dict2) do dict[key] = math.max(val, dict1[key] or 0) end return dict end factors = {} for ii = 2, LIMIT do factors = collapse(factors, factorize(ii)) end product = 1 for key, val in pairs(factors) do product = product * (key ^ val) end print(product) return product rvirding-luerl-772b25e/examples/euler/problem_003.lua0000664000232200023220000000111115114130670023035 0ustar debalancedebalance-- The prime factors of 13195 are 5, 7, 13 and 29. -- What is the largest prime factor of the number 600851475143 ? -- NUMBER_TO_FACTOR = 600851475143 NUMBER_TO_FACTOR = 13195 limit = math.sqrt(NUMBER_TO_FACTOR) primes = { 3 } function divisible_by_any(val, array) for ii, num in ipairs(array) do if (val % num) == 0 then return true end end return false end for ii = 5, limit, 2 do if not divisible_by_any(ii, primes) then table.insert(primes, ii) if NUMBER_TO_FACTOR % ii == 0 then factor = ii end end end print(factor) return factor rvirding-luerl-772b25e/examples/euler/euler.erl0000664000232200023220000000221115114130670022132 0ustar debalancedebalance%% File : euler.erl %% Purpose : Running complex lua with luerl %% Use: erlc -I ../../src euler.erl && erl -pa ../../ebin -s euler run -s init stop -noshell %% Or: make -module(euler). -export([run/0, run/2]). run() -> run("./problem_001.lua", 233168), run("./problem_002.lua", 4613732), run("./problem_003.lua", 29), run("./problem_004.lua", 36863), run("./problem_005.lua", 232792560), run("./problem_006.lua", 25164150), run("./problem_007.lua", 617), run("./problem_008.lua", 32), run("./problem_009.lua", 31875000), run("./problem_010.lua", 277050.0), ok. run(File, Solution) -> Lua0 = luerl:init(), {ok, Form, Lua1} = luerl:loadfile(File, Lua0), case timer:tc(luerl, call_chunk, [Form, [], Lua1]) of {T, {ok, [Return], _}} when Return == Solution -> io:format("~s (returned ~p in ~pus)~n", [File, Return, T]); {T, {ok, [Return], _}} -> io:format("~s (expected ~p but got ~p in ~pus)~n", [File, Solution, Return, T]); {_, {lua_error, Error, State}} -> io:format("luerl error: ~p~n", [{Error,State}]); {_, {error, Error, State}} -> io:format("Error: ~p~n", [{Error,State}]) end. rvirding-luerl-772b25e/examples/euler/problem_009.lua0000664000232200023220000000063515114130670023055 0ustar debalancedebalance-- A Pythagorean triplet is a set of three natural numbers, a b c, for which, -- a2 + b2 = c2 -- For example, 32 + 42 = 9 + 16 = 25 = 52. -- There exists exactly one Pythagorean triplet for which a + b + c = 1000. -- Find the product abc. for a = 2, 499 do for b = 2, 499 do c = (1000 - a) - b if a^2 + b^2 == c^2 then answer = a*b*c print(answer) return answer end end end rvirding-luerl-772b25e/examples/euler/problem_002.lua0000664000232200023220000000073515114130670023047 0ustar debalancedebalance-- Each new term in the Fibonacci sequence is generated by adding the previous two terms. -- By starting with 1 and 2, the first 10 terms will be: -- 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ... -- By considering the terms in the Fibonacci sequence whose values do not exceed four million, -- find the sum of the even-valued terms. LIMIT = 4000000 a, b, sum = 1, 2, 0 while b <= LIMIT do if b % 2 == 0 then sum = sum + b end a, b = b, a + b end print(sum) return sum rvirding-luerl-772b25e/examples/euler/Makefile0000664000232200023220000000044015114130670021754 0ustar debalancedebalanceEXAMPLES = euler ROOTDIR = ../.. SRCDIR = $(ROOTDIR)/src BEAMDIR = $(ROOTDIR)/ebin all: $(EXAMPLES) clean: rm -f *.beam erl_crash.dump .SECONDARY: %.beam: %.erl $(SRCDIR)/*.hrl erlc -I $(SRCDIR) $< %: %.beam erl -pa $(BEAMDIR) -s $@ run -s init stop -noshell .PHONY: all clean rvirding-luerl-772b25e/examples/euler/problem_007.lua0000664000232200023220000000147015114130670023051 0ustar debalancedebalance-- By listing the first six prime numbers: 2, 3, 5, 7, 11, and 13, we can see that the 6th prime is 13. -- What is the 10 001st prime number? -- LIMIT = 10001 LIMIT = 113 function primes(count) found_primes = { 2 } local function divisible_by_known_primes(num) for _, v in ipairs(found_primes) do if num % v == 0 then return true end end return false end local function next_prime(found_primes, _) val = found_primes[#found_primes] repeat val = (val == 2) and 3 or val + 2 until(not divisible_by_known_primes(val)) table.insert(found_primes, val) if #found_primes > count then return nil else return val end end return next_prime, found_primes, 3 end for ii in primes(LIMIT) do highest = ii end print(highest) return highest rvirding-luerl-772b25e/examples/euler/problem_004.lua0000664000232200023220000000121215114130670023040 0ustar debalancedebalance-- A palindromic number reads the same both ways. The largest palindrome made from the product of two 2-digit numbers is 9009 = 91 99. -- Find the largest palindrome made from the product of two 3-digit numbers. function is_palindrome(number) local str = number .. '' for ii = 1, (#str / 2) do if string.byte(str,ii) ~= string.byte(str, -ii) then return false end end return true end LOW = 100 --HIGH = 999 HIGH = 199 highest = 0 for ii = LOW, HIGH do for jj = LOW, HIGH do num = ii * jj if is_palindrome(num) then highest = (num > highest) and num or highest end end end print(highest) return highest rvirding-luerl-772b25e/src/0000775000232200023220000000000015114130670016153 5ustar debalancedebalancervirding-luerl-772b25e/src/NOTES0000664000232200023220000001335515114130670016775 0ustar debalancedebalance Copyright (c) 2013 Robert Virding Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. Implementation Notes -------------------- Syntax ------ We are almost able to represent the Lua syntax as an LALR(1) grammar. The only place this doesn't work is when a statement can be a function call as it clashes when it can also be a varlist. We get around this by using the more general prefixexp and doing a post-test to check that it is a functioncall. This works together with the varlist. Data ---- For the Lua data types we internally use the corresponding Erlang: nil - nil true/false - true/false strings - binaries numbers - floats tables - #table{} with array for keys 1..n, ordict for rest userdata - #userdata{} function - #function{} or {function,Fun} thread - #thread{} See luerl.hrl for the field names of the records. All tables are combinations of ttdicts and arrays. In each table an array is used for integer keys >= 1 while an ttdict is used for all other keys. We use this information when building/processing tables. Seems like Lua internally stores elements as a (unordered) sequence of key-value elements, except maybe for the table part. Some tests show that using ttdicts for all elements results the system being 10-20% slower and using more memory. So using the array module for positive integer keys seems a reasonable choice. Direct read/write access is fast, but "shifting" access for example in table.insert/remove is not that efficient. Most table functions work after a fashion even in the "undefined" case all the elements don't have keys only in 1..n, but it seems like the order in which elements were added affects the outcome. We don't have any such information available. We do try to do something reasonable that sort of mirrors the Lua functions. Should we or should we be strict? The table table can be either an ordict, an array, use the process dictionary, or an ETS table; these are accessed through macros. To use ETS would need a bigger change as copying the whole table for each access would be very inefficient. Either use bags and have one per table or use sets and have the ETS key as {Tab,Key}. Machine ------- The VM is a hybrid. It uses normal Erlang function calls for Luerl calls and blocks and has a small instruction set for operations inside a block. This should make it not too difficult to compile down to straight Erlang in the future. Blocks keep variables in tuples. There are two variable types depending on how they are defined: - Local variables that are used in this block and sub-blocks, but not used in any functions defined in the blocks. These are kept in a stack of tuples, the LocalVars or Lvs, and referenced by offset in stack and offset in tuple. - Environment variables that are defined in functions which are defined in this block or in sub-blocks. This mean they must be kept around as long as the functions are alive and are stored in the global heap as each invocation can modify them. They are kept in a stack of references, the EnvironmentVars or Evs, to tuples in the global heap and referenced by offset in stack and offset in tuple. A function contains a reference to the stack of environment variables which existed when it was created. Note that the mutable nature of Lua data means that these can be modified and the changes must be visible to every function which references them. There is also a stack containing arguments and temporary values. This is stack is "global" in the sense that it is passed through all calls and blocks. It is also passed as an argument into functions implemented in Erlang. This is so that event of a Lua/Luerl GC the collector uses the stack to determine which data in the global heap is to be saved. The VM is a pure stack machine. To handle multiple return values we always return a list of values. The only place this is not done is in luerl_eval.erl when getting values from the environment where we can only have one value. This means a lot of calls to first_value/1 in luerl_emul.erl, but the consistency is worth it. Similarly all the arguments in a function call are passed in a list. The function then unpacks the list into its arguments, including '...'. All of the predefined libraries have an install/1 function. This is called when initialising Luerl; it does any library specific initialisation necessary and returns a table containing the functions in the library. We create a unique tag which is saved in the environment. This is used so we can implement 'break' with a simple throw. The thrown value includes the tag so we can uniquely catch it and not get confused with a throw/error/exit from the erlang code. Compiler -------- The compiler has state at different levels: - In luerl_comp there is #comp{} containing code, options and errors. - In the #cst{} between the compiler modules for data outside the code. This empty so far. - Inside and local to the compiler modules. All the compiler modules are written so that they chain a status argument through their code, even if it not used. When they are not used we just send the atom 'nil' through and check it comes out "the other end". Lua implementation "features" ----------------------------- When "integers" are wanted then float input values are often "rounded" to the correct float value. So 1.3 --> 1.0 and 3.7 --> 4.0. rvirding-luerl-772b25e/src/luerl_util.erl0000664000232200023220000001105615114130670021042 0ustar debalancedebalance%% Copyright (c) 2019 Robert Virding %% %% Licensed under the Apache License, Version 2.0 (the "License"); %% you may not use this file except in compliance with the License. %% You may obtain a copy of the License at %% %% http://www.apache.org/licenses/LICENSE-2.0 %% %% Unless required by applicable law or agreed to in writing, software %% distributed under the License is distributed on an "AS IS" BASIS, %% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. %% See the License for the specific language governing permissions and %% limitations under the License. %% File : luerl_util.erl %% Purpose : Utility functions for Luer. -module(luerl_util). -include("luerl.hrl"). ?MODULEDOC(false). -export([errname_info/1]). %% Convert error names to errnos and strings. errname_info(Name) -> #{errno => get_errno(Name), errstr => erl_posix_msg:message(Name)}. %% Made using the following command (`errno' from the moreutils package): %% `errno -l | sort -k2 -n | awk '{print "get_errno("tolower($1)") -> "$2";"}'' get_errno(eperm) -> 1; get_errno(enoent) -> 2; get_errno(esrch) -> 3; get_errno(eintr) -> 4; get_errno(eio) -> 5; get_errno(enxio) -> 6; get_errno(e2big) -> 7; get_errno(enoexec) -> 8; get_errno(ebadf) -> 9; get_errno(echild) -> 10; get_errno(eagain) -> 11; get_errno(ewouldblock) -> 11; get_errno(enomem) -> 12; get_errno(eacces) -> 13; get_errno(efault) -> 14; get_errno(enotblk) -> 15; get_errno(ebusy) -> 16; get_errno(eexist) -> 17; get_errno(exdev) -> 18; get_errno(enodev) -> 19; get_errno(enotdir) -> 20; get_errno(eisdir) -> 21; get_errno(einval) -> 22; get_errno(enfile) -> 23; get_errno(emfile) -> 24; get_errno(enotty) -> 25; get_errno(etxtbsy) -> 26; get_errno(efbig) -> 27; get_errno(enospc) -> 28; get_errno(espipe) -> 29; get_errno(erofs) -> 30; get_errno(emlink) -> 31; get_errno(epipe) -> 32; get_errno(edom) -> 33; get_errno(erange) -> 34; get_errno(edeadlk) -> 35; get_errno(edeadlock) -> 35; get_errno(enametoolong) -> 36; get_errno(enolck) -> 37; get_errno(enosys) -> 38; get_errno(enotempty) -> 39; get_errno(eloop) -> 40; get_errno(enomsg) -> 42; get_errno(eidrm) -> 43; get_errno(echrng) -> 44; get_errno(el2nsync) -> 45; get_errno(el3hlt) -> 46; get_errno(el3rst) -> 47; get_errno(elnrng) -> 48; get_errno(eunatch) -> 49; get_errno(enocsi) -> 50; get_errno(el2hlt) -> 51; get_errno(ebade) -> 52; get_errno(ebadr) -> 53; get_errno(exfull) -> 54; get_errno(enoano) -> 55; get_errno(ebadrqc) -> 56; get_errno(ebadslt) -> 57; get_errno(ebfont) -> 59; get_errno(enostr) -> 60; get_errno(enodata) -> 61; get_errno(etime) -> 62; get_errno(enosr) -> 63; get_errno(enonet) -> 64; get_errno(enopkg) -> 65; get_errno(eremote) -> 66; get_errno(enolink) -> 67; get_errno(eadv) -> 68; get_errno(esrmnt) -> 69; get_errno(ecomm) -> 70; get_errno(eproto) -> 71; get_errno(emultihop) -> 72; get_errno(edotdot) -> 73; get_errno(ebadmsg) -> 74; get_errno(eoverflow) -> 75; get_errno(enotuniq) -> 76; get_errno(ebadfd) -> 77; get_errno(eremchg) -> 78; get_errno(elibacc) -> 79; get_errno(elibbad) -> 80; get_errno(elibscn) -> 81; get_errno(elibmax) -> 82; get_errno(elibexec) -> 83; get_errno(eilseq) -> 84; get_errno(erestart) -> 85; get_errno(estrpipe) -> 86; get_errno(eusers) -> 87; get_errno(enotsock) -> 88; get_errno(edestaddrreq) -> 89; get_errno(emsgsize) -> 90; get_errno(eprototype) -> 91; get_errno(enoprotoopt) -> 92; get_errno(eprotonosupport) -> 93; get_errno(esocktnosupport) -> 94; get_errno(enotsup) -> 95; get_errno(eopnotsupp) -> 95; get_errno(epfnosupport) -> 96; get_errno(eafnosupport) -> 97; get_errno(eaddrinuse) -> 98; get_errno(eaddrnotavail) -> 99; get_errno(enetdown) -> 100; get_errno(enetunreach) -> 101; get_errno(enetreset) -> 102; get_errno(econnaborted) -> 103; get_errno(econnreset) -> 104; get_errno(enobufs) -> 105; get_errno(eisconn) -> 106; get_errno(enotconn) -> 107; get_errno(eshutdown) -> 108; get_errno(etoomanyrefs) -> 109; get_errno(etimedout) -> 110; get_errno(econnrefused) -> 111; get_errno(ehostdown) -> 112; get_errno(ehostunreach) -> 113; get_errno(ealready) -> 114; get_errno(einprogress) -> 115; get_errno(estale) -> 116; get_errno(euclean) -> 117; get_errno(enotnam) -> 118; get_errno(enavail) -> 119; get_errno(eisnam) -> 120; get_errno(eremoteio) -> 121; get_errno(edquot) -> 122; get_errno(enomedium) -> 123; get_errno(emediumtype) -> 124; get_errno(ecanceled) -> 125; get_errno(enokey) -> 126; get_errno(ekeyexpired) -> 127; get_errno(ekeyrevoked) -> 128; get_errno(ekeyrejected) -> 129; get_errno(eownerdead) -> 130; get_errno(enotrecoverable) -> 131; get_errno(erfkill) -> 132; get_errno(ehwpoison) -> 133; get_errno(_) -> 0. rvirding-luerl-772b25e/src/luerl_lib_bit32.erl0000664000232200023220000001427215114130670021641 0ustar debalancedebalance%% Copyright (c) 2014-2018 Å�ukasz Biedrycki %% %% Licensed under the Apache License, Version 2.0 (the "License"); %% you may not use this file except in compliance with the License. %% You may obtain a copy of the License at %% %% http://www.apache.org/licenses/LICENSE-2.0 %% %% Unless required by applicable law or agreed to in writing, software %% distributed under the License is distributed on an "AS IS" BASIS, %% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. %% See the License for the specific language governing permissions and %% limitations under the License. %% File : luerl_lib_bit32.erl %% Author : Å�ukasz Biedrycki %% Purpose : The bit32 library for Luerl. %% This library has been deprecated in 5.3 but we still keep it. -module(luerl_lib_bit32). -include("luerl.hrl"). ?MODULEDOC(false). -export([install/1,fband/3,fbnot/3,fbor/3,fbtest/3,fbxor/3,flshift/3,frshift/3, farshift/3,flrotate/3,frrotate/3,fextract/3,freplace/3]). -import(luerl_lib, [badarg_error/3]). %Shorten this -define(MOST_SIGNIFICANT, 16#80000000). -define(LEAST_SIGNIFICANT, 16#00000001). -define(DEFAULT_BAND, 4294967295). -define(DEFAULT_BOR, 0). -define(DEFAULT_BXOR, 0). install(St) -> luerl_heap:alloc_table(table(), St). table() -> [{<<"band">>,#erl_mfa{m=?MODULE,f=fband}}, {<<"bnot">>,#erl_mfa{m=?MODULE,f=fbnot}}, {<<"bor">>,#erl_mfa{m=?MODULE,f=fbor}}, {<<"btest">>,#erl_mfa{m=?MODULE,f=fbtest}}, {<<"bxor">>,#erl_mfa{m=?MODULE,f=fbxor}}, {<<"lshift">>,#erl_mfa{m=?MODULE,f=flshift}}, {<<"rshift">>,#erl_mfa{m=?MODULE,f=frshift}}, {<<"arshift">>,#erl_mfa{m=?MODULE,f=farshift}}, {<<"lrotate">>,#erl_mfa{m=?MODULE,f=flrotate}}, {<<"rrotate">>,#erl_mfa{m=?MODULE,f=frrotate}}, {<<"extract">>,#erl_mfa{m=?MODULE,f=fextract}}, {<<"replace">>,#erl_mfa{m=?MODULE,f=freplace}} ]. fband(_, As, St) -> case luerl_lib:args_to_integers(As) of L when is_list(L) -> {[aband(L)], St}; error -> badarg_error('band', As, St) end. aband([]) -> ?DEFAULT_BAND; aband([X|T]) -> aband(T, checkint32(X)). aband([], A) -> float(A); aband([X|T], A) -> aband(T, checkint32(X) band A). fbnot(_, As, St) -> case luerl_lib:args_to_integers(As) of [N|_] -> NotN = bnot checkint32(N), {[float(NotN)], St}; error -> badarg_error('bnot', As, St) end. fbor(_, As, St) -> case luerl_lib:args_to_integers(As) of L when is_list(L) -> {[abor(L)], St}; error -> badarg_error('bor', As, St) end. abor([]) -> ?DEFAULT_BOR; abor([X|T]) -> abor(T, checkint32(X)). abor([], A) -> float(A); abor([X|T], A) -> abor(T, checkint32(X) bor A). fbtest(_, As, St) -> case luerl_lib:args_to_integers(As) of L when is_list(L) -> {[aband(L) /= 0], St}; error -> badarg_error('btest', As, St) end. fbxor(_, As, St) -> case luerl_lib:args_to_integers(As) of L when is_list(L) -> {[abxor(L)], St}; error -> badarg_error('bxor', As, St) end. abxor([]) -> ?DEFAULT_BXOR; abxor([X|T]) -> abxor(T, checkint32(X)). abxor([], A) -> float(A); abxor([X|T], A) -> abxor(T, checkint32(X) bxor A). flshift(_, As, St) -> case luerl_lib:args_to_integers(As) of [X,Y|_] -> {[float(checkint32(X) bsl trunc(Y))], St}; _ -> badarg_error('lshift', As, St) end. frshift(_, As, St) -> case luerl_lib:args_to_integers(As) of [X,Y|_] -> {[float(checkint32(X) bsr trunc(Y))], St}; _ -> badarg_error('rshift', As, St) end. farshift(_, As, St) -> case luerl_lib:args_to_integers(As) of [X,Y|_] -> Disp = trunc(Y), case Disp > 0 of true -> {[float(checkint32(X) bsr trunc(Y))], St}; false -> {[float(checkint32(X) bsl abs(trunc(Y)))], St} end; _ -> badarg_error('arshift', As, St) end. flrotate(_, As, St) -> case luerl_lib:args_to_integers(As) of [X,Y|_] -> {[float(lrotate(checkint32(X), trunc(Y)))], St}; _ -> badarg_error('lrotate', As, St) end. frrotate(_, As, St) -> case luerl_lib:args_to_integers(As) of [X,Y|_] -> {[float(rrotate(checkint32(X), trunc(Y)))], St}; _ -> badarg_error('rrotate', As, St) end. fextract(_, As, St) -> case luerl_lib:args_to_integers(As) of [N,Field,Width|_] -> {[float(extract(N, Field, Width, As, St))], St}; [N,Field|_] -> {[float(extract(N, Field, 1, As, St))], St}; _ -> badarg_error('extract', As, St) end. freplace(_, As, St) -> case luerl_lib:args_to_integers(As) of [N,V,Field,Width|_] -> {[float(replace(N, V, Field, Width, As, St))], St}; [N,V,Field|_] -> {[float(replace(N, V, Field, 1, As, St))], St}; _ -> badarg_error('replace', As, St) end. %% Internal lrotate(X, Y) when Y < 0 -> rrotate(X, abs(Y)); lrotate(X, Y) when Y == 0 -> X; lrotate(X1, Y) -> Most = X1 band ?MOST_SIGNIFICANT, X2 = uint32(X1 bsl 1), X3 = X2 bor (Most bsr 31), lrotate(X3, Y - 1). rrotate(X, Y) when Y < 0 -> lrotate(X, abs(Y)); rrotate(X, Y) when Y == 0 -> X; rrotate(X1, Y) -> Least = X1 band ?LEAST_SIGNIFICANT, X2 = X1 bsr 1, X3 = X2 bor (Least bsl 31), rrotate(X3, Y - 1). uint32(N) -> <> = <>, Res. checkint32(N) -> uint32(trunc(N)). ge0(N, Where, As, St) -> case N >= 0 of true -> N; false -> badarg_error(Where, As, St) end. gt0(N, Where, As, St) -> case N > 0 of true -> N; false -> badarg_error(Where, As, St) end. le(N, V, Where, As, St) -> case N =< V of true -> N; false -> badarg_error(Where, As, St) end. extract(N1, Field1, Width1, As, St) -> N2 = checkint32(N1), Field2 = trunc(Field1), Width2 = trunc(Width1), _ = ge0(Field2, 'extract', As, St), _ = gt0(Width2, 'extract', As, St), _ = le(Field2 + Width2, 32, 'extract', As, St), trunc(N2 / math:pow(2, Field2)) rem trunc(math:pow(2, Width2)). replace(N1, V1, Field1, Width1, As, St) -> N2 = checkint32(N1), V2 = checkint32(V1), Field2 = trunc(Field1), Width2 = trunc(Width1), _ = ge0(Field2, 'replace', As, St), _ = gt0(Width2, 'replace', As, St), _ = le(Field2 + Width2, 32, 'extract', As, St), Field3 = trunc(math:pow(2, Field2)), Width3 = trunc(math:pow(2, Width2)), FW = Field3 * Width3, (N2 rem Field3) + (V2 rem Width3) * Field3 + trunc(N2 div FW) * FW. rvirding-luerl-772b25e/src/luerl.hrl0000664000232200023220000002163315114130670020012 0ustar debalancedebalance%% Copyright (c) 2013-2025 Robert Virding %% %% Licensed under the Apache License, Version 2.0 (the "License"); %% you may not use this file except in compliance with the License. %% You may obtain a copy of the License at %% %% http://www.apache.org/licenses/LICENSE-2.0 %% %% Unless required by applicable law or agreed to in writing, software %% distributed under the License is distributed on an "AS IS" BASIS, %% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. %% See the License for the specific language governing permissions and %% limitations under the License. %% File : luerl.hrl %% Author : Robert Virding %% Purpose : The basic macros/records for Luerl. %% We include the whole environment in one structure even if fields %% come from logically different parts. This make it easier to pass %% around but does mean that there will be more explicit fiddleling to %% get it right. See block/2 and functioncall/4 for examples of this. -record(luerl, {tabs, %Table table envs, %Environment table usds, %Userdata table fncs, %Function table g, %Global table %% stk=[], %Current stack cs=[], %Current call stack %% meta=[], %Data type metatables rand, %Random state tag, %Unique tag trace_func=none, %Trace function trace_data, %Trace data private=#{} }). %% Table structure. -record(tstruct, {data, %Data table/array free, %Index free list next %Next index }). %% Metatables for atomic datatypes. -record(meta, {nil=nil, boolean=nil, number=nil, string=nil }). %% Frames for the call stack. %% Call return frame -record(call_frame, {func,args, %Function, arguments lvs, %Local variables env, %Environment is=[], %Instructions cont=[] %Continuation }). %% Loop break frame -record(loop_frame, {lvs, %Local variables stk, %Stack env, %Environment is=[], %Instructions cont=[] %Continuation }). %% Current line -record(current_line, {line, %Line file %File name }). %% Return -record(return, {rets %Return values }). %% Data types. -record(tref, {i}). %Table reference, index -define(IS_TREF(T), is_record(T, tref)). -record(table, {a,d=[],meta=nil}). %Table type, array, dict, meta -record(eref, {i}). %Environment reference, index -define(IS_EREF(E), is_record(E, eref)). -record(usdref, {i}). %Userdata reference, index -define(IS_USDREF(U), is_record(U, usdref)). -record(userdata, {d,meta=nil}). %Userdata type, data and meta -record(thread, {}). %Thread type %% There are two function types, the Lua one, and the Erlang one. %% The environment with upvalues is defined when the function is %% referenced and can vary if the function is referenced many %% times. Hence it is in the reference not in the the definition. -record(funref, {i,env=[]}). %Function reference -define(IS_FUNREF(F), is_record(F, funref)). -record(lua_func,{anno=[], %Annotation funrefs=[], %Functions directly referenced lsz, %Local var size %% loc=not_used, %Local var block template esz, %Env var size %% env=not_used, %Local env block template pars, %Parameter types body}). %Code block -define(IS_LUAFUNC(F), is_record(F, lua_func)). -record(erl_func,{code}). %Erlang code (fun) -define(IS_ERLFUNC(F), is_record(F, erl_func)). -record(erl_mfa,{m,f,a}). %Erlang code (MFA) -define(IS_ERLMFA(F), is_record(F, erl_mfa)). %% Test if it a function, of either sort. -define(IS_FUNCTION(F), (?IS_FUNREF(F) orelse ?IS_ERLFUNC(F) orelse ?IS_ERLMFA(F))). %% Testing for integers/integer floats or booleans. -define(IS_FLOAT_INT(N), (round(N) == N)). -define(IS_FLOAT_INT(N,I), ((I=round(N)) == N)). -define(IS_TRUE(X), (((X) =/= nil) and ((X) =/= false))). %% %% Global type specifications. %% %% The basic Luerl state. -type luerlstate() :: #luerl{}. %% Luerl data. -type luerldata() :: nil | boolean() | binary() | number() | #tref{} | %Table reference #usdref{} | %Userdata reference #eref{} | %Environment reference #funref{} | %Lua function reference #erl_func{} | %Erlang function #erl_mfa{}. %Erlang Mod, Func, Arg. %% Different methods for storing tables in the global data #luerl{}. %% Access through macros to allow testing with different storage %% methods. This is inefficient with ETS tables where it would %% probably be better to use bags and access with match/select. %% Set which table store to use. We check if we have full maps before %% we use them just to protect ourselves. -ifdef(HAS_FULL_KEYS). -define(TS_USE_MAPS, true). -else. -define(TS_USE_ARRAY, true). -endif. %% -define(TS_USE_ARRAY, true). -ifdef(TS_USE_MAPS). -define(MAKE_TABLE(), maps:new()). -define(GET_TABLE(N, Ts), maps:get(N, Ts)). -define(SET_TABLE(N, T, Ts), maps:put(N, T, Ts)). -define(UPD_TABLE(N, Upd, Ts), maps:update_with(N, Upd, Ts)). -define(DEL_TABLE(N, Ts), maps:remove(N, Ts)). -define(CHK_TABLE(N, Ts), maps:is_key(N, Ts)). -define(FILTER_TABLES(Pred, Ts), maps:filter(Pred, Ts)). -define(FOLD_TABLES(Fun, Acc, Ts), maps:fold(Fun, Acc, Ts)). -endif. -ifdef(TS_USE_ARRAY). %% Use arrays to handle tables. We leave the default value as undefined. -define(MAKE_TABLE(), array:new()). -define(GET_TABLE(N, Ar), array:get(N, Ar)). -define(SET_TABLE(N, T, Ar), array:set(N, T, Ar)). -define(UPD_TABLE(N, Upd, Ar), array:set(N, (Upd)(array:get(N, Ar)), Ar)). -define(DEL_TABLE(N, Ar), array:reset(N, Ar)). -define(CHK_TABLE(N, Ar), ((N >= 0) andalso (array:get(N, Ar) =/= undefined))). -define(FILTER_TABLES(Pred, Ar), ((fun (___Def) -> ___Fil = fun (___K, ___V) -> case Pred(___K, ___V) of true -> ___V; false -> ___Def end end, array:sparse_map(___Fil, Ar) end)(array:default(Ar)))). -define(FOLD_TABLES(Fun, Acc, Ar), array:sparse_foldl(Fun, Acc, Ar)). -endif. -ifdef(TS_USE_ORDDICT). %% Using orddict to handle tables. -define(MAKE_TABLE(), orddict:new()). -define(GET_TABLE(N, Ts), orddict:fetch(N, Ts)). -define(SET_TABLE(N, T, Ts), orddict:store(N, T, Ts)). -define(UPD_TABLE(N, Upd, Ts), orddict:update(N, Upd, Ts)). -define(DEL_TABLE(N, Ts), orddict:erase(N, Ts)). -define(CHK_TABLE(N, Ts), orddict:is_key(N, Ts)). -define(FILTER_TABLES(Pred, Ts), orddict:filter(Pred, Ts)). -define(FOLD_TABLES(Fun, Acc, Ts), orddict:fold(Fun, Acc, Ts)). -endif. -ifdef(TS_USE_PD). %% Use the process dictionary to handle tables. -define(MAKE_TABLE(), ok). -define(GET_TABLE(N, Pd), get(N)). -define(SET_TABLE(N, T, Pd), put(N, T)). -define(UPD_TABLE(N, Upd, Pd), put(N, (Upd)(get(N)))). -define(DEL_TABLE(N, Pd), erase(N)). -define(CHK_TABLE(N, Pd), (get(N) =/= undefined)). -define(FILTER_TABLES(Pred, Pd), Pd). %This needs work -define(FOLD_TABLES(Fun, Acc, Pd), Pd). %This needs work -endif. -ifdef(TS_USE_ETS). %% Use ETS to handle tables. Must get return values right! -define(MAKE_TABLE(),ets:new(luerl_tables, [set])). -define(GET_TABLE(N, E), ets:lookup_element(E, N, 2)). -define(SET_TABLE(N, T, E), begin ets:insert(E, {N,T}), E end). -define(UPD_TABLE(N, Upd, E), begin ets:update_element(E, N, {2,(Upd)(ets:lookup_element(E, N, 2))}), E end). -define(DEL_TABLE(N, E), begin ets:delete(E, N), E end). -define(FILTER_TABLES(Pred, E), E). %This needs work -define(FOLD_TABLES(Fun, Acc, E), ets:foldl(fun ({___K, ___T}, ___Acc) -> Fun(___K, ___T, ___Acc) end, Acc, E)). -endif. %% Define CATCH to handle deprecated get_stacktrace/0 -ifdef(NEW_STACKTRACE). -define(CATCH(C, E, S), C:E:S ->). -else. -define(CATCH(C, E, S), C:E -> S = erlang:get_stacktrace(),). -endif. %% Define MODULEDOC and DOC to handle module and function documentation. -if(?OTP_RELEASE >= 27). -define(MODULEDOC(Str), -moduledoc(Str)). -define(DOC(Str), -doc(Str)). -else. -define(MODULEDOC(Str), -compile([])). -define(DOC(Str), -compile([])). -endif. rvirding-luerl-772b25e/src/luerl_lib_package.erl0000664000232200023220000001577015114130670022315 0ustar debalancedebalance%% Copyright (c) 2013-2020 Robert Virding %% %% Licensed under the Apache License, Version 2.0 (the "License"); %% you may not use this file except in compliance with the License. %% You may obtain a copy of the License at %% %% http://www.apache.org/licenses/LICENSE-2.0 %% %% Unless required by applicable law or agreed to in writing, software %% distributed under the License is distributed on an "AS IS" BASIS, %% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. %% See the License for the specific language governing permissions and %% limitations under the License. %% File : luerl_lib_package.erl %% Author : Robert Virding %% Purpose : The package library for Luerl. %% These functions sometimes behave strangely in the Lua 5.2 %% libraries, but we try to follow them. Most of these functions KNOW %% that a table is a ttdict! We know that the erlang array has default %% value 'nil'. -module(luerl_lib_package). -include_lib("kernel/include/file.hrl"). -include("luerl.hrl"). ?MODULEDOC(false). %% The basic entry point to set up the function table. -export([install/1,require/3,searchpath/3,preload_searcher/3,lua_searcher/3]). %% Export some functions which can be called from elsewhere. -export([search_path/5]). -import(luerl_lib, [lua_error/2,badarg_error/3]). %Shorten this install(St0) -> St1 = luerl_emul:set_global_key(<<"require">>, #erl_mfa{m=?MODULE,f=require}, St0), {S,St2} = luerl_heap:alloc_table(searchers_table(), St1), {L,St3} = luerl_heap:alloc_table(loaded_table(), St2), {P,St4} = luerl_heap:alloc_table(preload_table(), St3), {T,St5} = luerl_heap:alloc_table(table(S, L, P), St4), {T,St5}. %% table() -> [{FuncName,Function}]. %% meta_table() -> [{TableName,Function}]. %% searchers_table() %% preloaded_table() %% loaded_table() table(S, L, P) -> [{<<"config">>,config()}, {<<"loaded">>,L}, {<<"preload">>,P}, {<<"path">>,path()}, {<<"searchers">>,S}, {<<"searchpath">>,#erl_mfa{m=?MODULE,f=searchpath}} ]. searchers_table() -> [{1.0,#erl_mfa{m=?MODULE,f=preload_searcher}}, {2.0,#erl_mfa{m=?MODULE,f=lua_searcher}}]. preload_table() -> []. loaded_table() -> []. %% meta_table() -> %% [{<<"__index">>,#erl_func{code=fun meta_values/2}} %% ]. %% config() %% path() %% meta_values() %% Generate initial data for tables. config() -> <<"/\n",";\n","?\n","!\n","-\n">>. %The defaults path() -> case os:getenv("LUA_PATH") of false -> <<"./?.lua;./?/init.lua">>; %Default path Path -> list_to_binary(Path) end. %% meta_values([_,<<"bert">>], St) -> %% {[<<"/\n",";\n","?\n","!\n","-\n">>],St}; %% meta_values(_, St) -> {[nil],St}. %Default undefined key %% searchpath(Name, Path [, Sep [, Rep]]) -> [File] | [nil|Files]. searchpath(_, As, St) -> case luerl_lib:conv_list(search_args(As), [lua_string,lua_string,lua_string,lua_string]) of [N,P,S,R] -> %Name, path, sep, rep Ret = case search_path(N, P, S, R, []) of {ok,File} -> [File]; {error,Tried} -> [nil,Tried] end, {Ret,St}; _ -> badarg_error(searchpath, As, St) end. search_args([N,P]) -> [N,P,<<".">>,<<"/">>]; search_args([N,P,S]) -> [N,P,S,<<"/">>]; search_args(As) -> As. %% search_path(Name, Path, Sep, Rep, Tried) -> {ok,File} | {error,Tried}. %% Search for a file in a path. Callable from Erlang. search_path(N0, P, S, R, Tried) -> N1 = binary:replace(N0, S, R, [global]), Ts = binary:split(P, <<";">>, [global]), search_path_loop(N1, Ts, Tried). search_path_loop(Name, [T|Ts], Tried) -> File = binary:replace(T, <<"?">>, Name, [global]), %% Test if file can be opened for reading. case file:read_file_info(File) of {ok,#file_info{access=A}} when A =:= read; A =:= read_write -> {ok,File}; _ -> search_path_loop(Name, Ts, Tried ++ [$',File,$',$\s]) end; search_path_loop(_, [], Tried) -> %Couldn't find it {error,unicode:characters_to_binary(Tried)}. -spec require(_, [_], _) -> {_,_} | no_return(). %To keep dialyzer quiet %% require([File|_], State) ->{Value,State}. %% Main require interface. require(_, As, St) -> case luerl_lib:conv_list(As, [lua_string]) of [Mod] -> do_require(Mod, St); error -> badarg_error(require, As, St) end. do_require(Mod, St0) -> {Pt,St1} = luerl_emul:get_global_key(<<"package">>, St0), case luerl_emul:get_table_keys(Pt, [<<"loaded">>,Mod], St1) of {nil,St2} -> %Not loaded {Ss,St3} = luerl_emul:get_table_key(Pt, <<"searchers">>, St2), {[Ldr|Extra],St4} = search_loaders(Mod, Ss, St3), {Val,St5} = luerl_emul:functioncall(Ldr, [Mod|Extra], St4), require_ret(Mod, Val, Pt, St5); {Val,St2} -> {[Val],St2} %Already loaded end. require_ret(Mod, Val, Pt, St0) -> Res = case luerl_lib:first_value(Val) of nil -> true; %Assign true to loaded entry __tmp -> __tmp end, St1 = luerl_emul:set_table_keys(Pt, [<<"loaded">>,Mod], Res, St0), {[Res],St1}. search_loaders(Mod, Tref, St) -> #table{a=Arr} = luerl_heap:get_table(Tref, St), Ls = array:sparse_to_list(Arr), search_loaders_loop(Mod, Ls, <<>>, St). search_loaders_loop(Mod, [nil|Ls], Estr, St) -> %Could find some of these search_loaders_loop(Mod, Ls, Estr, St); search_loaders_loop(Mod, [L|Ls], Estr, St0) -> %Try the next loader %% Call the searcher function case luerl_emul:functioncall(L, [Mod], St0) of %% Searcher found a loader. {[F|_],_}=Ret when ?IS_FUNCTION(F) -> Ret; %% Searcher found no loader. {[S|_],St1} when is_binary(S) -> Estr1 = <>, %Append new info string search_loaders_loop(Mod, Ls, Estr1, St1); {_,St1} -> %Should be nil or [] search_loaders_loop(Mod, Ls, Estr, St1) end; search_loaders_loop(Mod, [], Estr, St) -> %No successful loader found lua_error({no_module,Mod,Estr}, St). %% preload_searcher() %% lua_searcher() %% Predefined search functions in package.searchers. These must be Lua %% callable functions as they are visible. preload_searcher(_, As, St0) -> case luerl_lib:conv_list(As, [lua_string]) of [Mod] -> {Pre,St1} = luerl_emul:get_table_keys([<<"package">>,<<"preload">>], St0), case luerl_emul:get_table_key(Pre, Mod, St1) of {nil,St2} -> {[],St2}; {Val,St2} -> {[Val],St2} %Return the chunk end; error -> badarg_error(preload_searcher, As, St0) end. lua_searcher(_, As, St0) -> case luerl_lib:conv_list(As, [lua_string]) of [Mod] -> {Path,St1} = luerl_emul:get_table_keys([<<"package">>,<<"path">>], St0), case search_path(Mod, Path, <<".">>, <<"/">>, []) of {ok,File} -> Ret = luerl_comp:file(binary_to_list(File)), lua_searcher_ret(Ret, File, St1); {error,Tried} -> {[Tried],St1} end; error -> badarg_error(lua_searcher, As, St0) end. lua_searcher_ret({ok,Chunk}, File, St0) -> %% Wrap chunk in function to be consistent. {Func,St1} = luerl_emul:load_chunk(Chunk, St0), {[Func,File],St1}; lua_searcher_ret({error,[{_,Mod,E}|_],_}, _, St) -> Msg = unicode:characters_to_binary(Mod:format_error(E)), {[Msg],St}. rvirding-luerl-772b25e/src/luerl_lib_basic.erl0000664000232200023220000003364415114130670022003 0ustar debalancedebalance%% Copyright (c) 2013-2024 Robert Virding %% %% Licensed under the Apache License, Version 2.0 (the "License"); %% you may not use this file except in compliance with the License. %% You may obtain a copy of the License at %% %% http://www.apache.org/licenses/LICENSE-2.0 %% %% Unless required by applicable law or agreed to in writing, software %% distributed under the License is distributed on an "AS IS" BASIS, %% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. %% See the License for the specific language governing permissions and %% limitations under the License. %% File : luerl_lib_basic.erl %% Author : Robert Virding %% Purpose : The basic library for Luerl. -module(luerl_lib_basic). -include("luerl.hrl"). ?MODULEDOC(false). %% The basic entry point to set up the function table. -export([install/1,assert/3,error_call/3,collectgarbage/3,dofile/3, eprint/3,getmetatable/3,ipairs/3,ipairs_next/3, load/3,loadfile/3,loadstring/3, next/3,pairs/3,pcall/3,print/3, rawequal/3,rawget/3,rawlen/3,rawset/3, select/3,setmetatable/3,tonumber/3,tostring/3,type/3,unpack/3]). %% Export some functions which can be called from elsewhere. -export([print/2,type/1]). -import(luerl_lib, [lua_error/2,badarg_error/3]). %Shorten these install(St) -> luerl_heap:alloc_table(table(), St). %% table() -> [{FuncName,Function}]. %% Caller will convert this list to the correct format. table() -> [{<<"_VERSION">>,<<"Lua 5.3">>}, %We are optimistic {<<"assert">>,#erl_mfa{m=?MODULE,f=assert}}, {<<"collectgarbage">>,#erl_mfa{m=?MODULE,f=collectgarbage}}, {<<"dofile">>,#erl_mfa{m=?MODULE,f=dofile}}, {<<"eprint">>,#erl_mfa{m=?MODULE,f=eprint}}, {<<"error">>,#erl_mfa{m=?MODULE,f=error_call}}, {<<"getmetatable">>,#erl_mfa{m=?MODULE,f=getmetatable}}, {<<"ipairs">>,#erl_mfa{m=?MODULE,f=ipairs}}, {<<"load">>,#erl_mfa{m=?MODULE,f=load}}, {<<"loadfile">>,#erl_mfa{m=?MODULE,f=loadfile}}, {<<"loadstring">>,#erl_mfa{m=?MODULE,f=loadstring}}, %For Lua 5.1 compatibility {<<"next">>,#erl_mfa{m=?MODULE,f=next}}, {<<"pairs">>,#erl_mfa{m=?MODULE,f=pairs}}, {<<"pcall">>,#erl_mfa{m=?MODULE,f=pcall}}, {<<"print">>,#erl_mfa{m=?MODULE,f=print}}, {<<"rawequal">>,#erl_mfa{m=?MODULE,f=rawequal}}, {<<"rawget">>,#erl_mfa{m=?MODULE,f=rawget}}, {<<"rawlen">>,#erl_mfa{m=?MODULE,f=rawlen}}, {<<"rawset">>,#erl_mfa{m=?MODULE,f=rawset}}, {<<"select">>,#erl_mfa{m=?MODULE,f=select}}, {<<"setmetatable">>,#erl_mfa{m=?MODULE,f=setmetatable}}, {<<"tonumber">>,#erl_mfa{m=?MODULE,f=tonumber}}, {<<"tostring">>,#erl_mfa{m=?MODULE,f=tostring}}, {<<"type">>,#erl_mfa{m=?MODULE,f=type}}, {<<"unpack">>,#erl_mfa{m=?MODULE,f=unpack}} %For Lua 5.1 compatibility ]. assert(_, As, St) -> case luerl_lib:boolean_value(As) of true -> {As,St}; false -> M = case As of [_,M0|_] -> M0; _ -> <<"assertion failed">> end, lua_error({assert_error,M}, St) end. collectgarbage(_, [], St) -> collectgarbage(nil, [<<"collect">>], St); collectgarbage(_, [<<"collect">>|_], St) -> {[],luerl_heap:gc(St)}; %% {[],St}; %No-op for the moment collectgarbage(_, _, St) -> %Ignore everything else {[],St}. eprint(_, Args, St) -> lists:foreach(fun (#tref{}=Tref) -> Tab = luerl_heap:get_table(Tref, St), io:format("~w ", [Tab]); (A) -> io:format("~w ", [A]) end, Args), io:nl(), {[],St}. -spec error_call(_, _, _) -> no_return(). %% error_call(Args, State) -> no_return(). %% Generate an error with an error string. error_call(_, [{tref, _}=T|_]=As, St0) -> case luerl_heap:get_metamethod(T, <<"__tostring">>, St0) of nil -> lua_error({error_call, As}, St0); Meta -> {Rets, St1} = luerl_emul:functioncall(Meta, [T], St0), lua_error({error_call, Rets}, St1) end; error_call(_, As, St) -> %Never returns! lua_error({error_call, As}, St). %% ipairs(Args, State) -> {[Func,Table,FirstKey],State}. %% Return a function which on successive calls returns successive %% key-value pairs of integer keys. We check that it is a table first %% when we access it. ipairs(_, [Tref|_], St) -> case luerl_heap:get_metamethod(Tref, <<"__ipairs">>, St) of nil -> {[#erl_mfa{m=?MODULE,f=ipairs_next},Tref,0],St}; Meta -> luerl_emul:functioncall(Meta, [Tref], St) end; ipairs(_, As, St) -> badarg_error(ipairs, As, St). ipairs_next(_, [A], St) -> ipairs_next(nil, [A,0], St); ipairs_next(_, [Tref,K|_], St) when ?IS_TREF(Tref), is_integer(K) -> %% Get the table. #table{a=Arr} = luerl_heap:get_table(Tref, St), Next = K + 1, case array:get(Next, Arr) of nil -> {[nil],St}; V -> {[Next,V],St} end; ipairs_next(_, As, St) -> badarg_error(ipairs, As, St). %% pairs(Args, State) -> {[Func,Table,Key],State}. %% Return a function to step over all the key-value pairs in a %% table. We check that it is a table first when we access it. pairs(_, [Tref|_], St) -> case luerl_heap:get_metamethod(Tref, <<"__pairs">>, St) of nil -> {[#erl_mfa{m=?MODULE,f=next},Tref,nil],St}; Meta -> luerl_emul:functioncall(Meta, [Tref], St) end; pairs(_, As, St) -> badarg_error(pairs, As, St). %% next(Args, State) -> {[Key,Value] | [nil], State}. %% Given a table and a key return the next key-value pair in the %% table, or nil if there is no next key. The key 'nil' gives the %% first key-value pair. next(_, [A], St) -> next(nil, [A,nil], St); next(_, [#tref{}=Tref,K|_], St) -> %% Get the table. #table{a=Arr,d=Dict} = luerl_heap:get_table(Tref, St), if K == nil -> %% Find the first, start with the array. next_index(0, Arr, Dict, St); is_integer(K), K >= 1 -> next_index(K, Arr, Dict, St); is_float(K) -> case ?IS_FLOAT_INT(K, I) of true when I >= 1 -> next_index(I, Arr, Dict, St); _NegFalse -> %Not integer or negative next_key(K, Dict, St) end; true -> next_key(K, Dict, St) end; next(_, As, St) -> badarg_error(next, As, St). next_index(I0, Arr, Dict, St) -> case next_index_loop(I0+1, Arr, array:size(Arr)) of {I1,V} -> {[I1,V],St}; none -> %% Nothing in the array, take table instead. first_key(Dict, St) end. next_index_loop(I, Arr, S) when I < S -> case array:get(I, Arr) of nil -> next_index_loop(I+1, Arr, S); V -> {I,V} end; next_index_loop(_, _, _) -> none. first_key(Dict, St) -> case ttdict:first(Dict) of {ok,{K,V}} -> {[K,V],St}; error -> {[nil],St} end. next_key(K, Dict, St) -> case ttdict:next(K, Dict) of {ok,{N,V}} -> {[N,V],St}; error -> {[nil],St} end. %% print(Args, State) -> {[],State}. %% Receives any number of arguments and prints their values to %% stdout, using the tostring function to convert each argument to a %% string. print is not intended for formatted output, but only as a %% quick way to show a value, for instance for debugging. print(_, Args, St0) -> St1 = lists:foldl(fun (A, S0) -> {Str,S1} = luerl_lib:tostring(A, S0), print_arg(Str), S1 end, St0, Args), io:nl(), {[],St1}. print_arg(Str) -> Fun = fun (C, Acc) when C >= 128 -> [$?|Acc]; %Just mark with a ? %% Some special case control characters. (C, Acc) when C =:= $\t ; C =:= $\n ; C =:= $\v ; C =:= $\f ; C =:= $\r -> [C|Acc]; (C, Acc) when C =< 31 -> Acc; %Skip other control characters (C, Acc) -> [C|Acc] %Output the rest end, Chars = lists:foldr(Fun, [], binary_to_list(Str)), io:format("~s ", [Chars]). print(Args, St0) -> print(nil, Args, St0). %% rawequal([Arg,Arg|_], State) -> {[Bool],State}. %% rawlen([Object|_], State) -> {[Length],State}. %% rawget([Table,Key|_], State) -> {[Val],State)}. %% rawset([Table,Key,Value|_]], State) -> {[Table],State)}. rawequal(_, [A1,A2|_], St) -> {[A1 =:= A2],St}; rawequal(_, As, St) -> badarg_error(rawequal, As, St). rawlen(_, [A|_], St) when is_binary(A) -> {[float(byte_size(A))],St}; rawlen(_, [#tref{}=T|_], St) -> {[luerl_lib_table:raw_length(T, St)],St}; rawlen(_, As, St) -> badarg_error(rawlen, As, St). rawget(_, [#tref{}=Tref,Key|_], St) -> Val = luerl_heap:raw_get_table_key(Tref, Key, St), {[Val],St}; rawget(_, As, St) -> badarg_error(rawget, As, St). rawset(_, [Tref,nil=Key,_|_], St) -> lua_error({illegal_index,Tref,Key}, St); rawset(_, [#tref{}=Tref,Key,Val|_], St0) -> St1 = luerl_heap:raw_set_table_key(Tref, Key, Val, St0), {[Tref],St1}; rawset(_, As, St) -> badarg_error(rawset, As, St). %% select(Args, State) -> {[Element],State}. select(_, [<<$#>>|As], St) -> {[float(length(As))],St}; select(_, [A|As], St) -> Len = length(As), case luerl_lib:arg_to_integer(A) of N when is_integer(N), N > 0 -> {select_front(N, As, Len),St}; N when is_integer(N), N < 0 -> {select_back(-N, As, Len),St}; _ -> badarg_error(select, [A|As], St) end; select(_, As, St) -> badarg_error(select, As, St). select_front(N, As, Len) when N =< Len -> lists:nthtail(N-1, As); select_front(_, _, _) -> []. select_back(N, As, Len) when N =< Len -> lists:nthtail(Len-N, As); select_back(_, As, _) -> As. tonumber(_, [Arg], St) -> {[tonumber(luerl_lib:arg_to_number(Arg))],St}; tonumber(_, [Arg,B|_], St) -> {[tonumber(luerl_lib:arg_to_number(Arg, B))],St}; tonumber(_, As, St) -> badarg_error(tonumber, As, St). tonumber(Num) when is_number(Num) -> Num; tonumber(_) -> nil. %% tostring([Arg|_], Stated) -> {String,State}. %% Return the type as a string. tostring(_, [Arg|_], St0) -> {Str,St1} = luerl_lib:tostring(Arg, St0), {[Str],St1}; tostring(_, As, St) -> badarg_error(tostring, As, St). %% type([Data|_], State) -> {Type,State}. %% Return the type of the argument. type(_, [Arg|_], St) -> {[type(Arg)],St}; %Only one return value! type(_, As, St) -> badarg_error(type, As, St). type(nil) -> <<"nil">>; type(N) when is_number(N) -> <<"number">>; type(S) when is_binary(S) -> <<"string">>; type(B) when is_boolean(B) -> <<"boolean">>; type(#tref{}) -> <<"table">>; type(#usdref{}) -> <<"userdata">>; type(#funref{}) -> <<"function">>; %Functions defined in Lua type(#erl_func{}) -> <<"function">>; %Internal functions type(#erl_mfa{}) -> <<"function">>; type(#thread{}) -> <<"thread">>; type(_) -> <<"unknown">>. %% getmetatable([Value|_], State) -> {Table,State}. %% setmetatable([Table,Table|nil|_], State) -> {Table,State}. %% Can only set the metatable of tables here. Return tables for all %% values, for tables and userdata it is the table of the object, %% else the metatable for the type. getmetatable(_, [Obj|_], St) -> case luerl_heap:get_metatable(Obj, St) of #tref{}=Meta -> #table{d=Dict} = luerl_heap:get_table(Meta, St), case ttdict:find(<<"__metatable">>, Dict) of {ok,MM} -> {[MM],St}; error -> {[Meta],St} end; nil -> {[nil],St} end; getmetatable(_, As, St) -> badarg_error(getmetatable, As, St). setmetatable(_, [#tref{}=T,#tref{}=M|_], St) -> do_setmetatable(T, M, St); setmetatable(_, [#tref{}=T,nil|_], St) -> do_setmetatable(T, nil, St); setmetatable(_, As, St) -> badarg_error(setmetatable, As, St). do_setmetatable(#tref{}=Tref, Meta, St0) -> case luerl_heap:get_metamethod(Tref, <<"__metatable">>, St0) of nil -> Upd = fun (Tab) -> Tab#table{meta=Meta} end, St1 = luerl_heap:upd_table(Tref, Upd, St0), {[Tref],St1}; _ -> badarg_error(setmetatable, [Tref], St0) end. %% Do files. dofile(_, As, St) -> case luerl_lib:conv_list(As, [erl_string]) of [File] -> %% Compile the file so it returns errors. Ret = luerl_comp:file(File, [verbose,return]), dofile_ret(Ret, As, St); _ -> badarg_error(dofile, As, St) end. dofile_ret({ok,Chunk}, _, St0) -> {Func,St1} = luerl_emul:load_chunk(Chunk, St0), luerl_emul:call(Func, [], St1); dofile_ret({error,[{_,Mod,E}|_],_}, _As, St) -> Msg = unicode:characters_to_binary(Mod:format_error(E)), lua_error({error_message,Msg}, St). %% Load string and files. load(_, As, St) -> case luerl_lib:conv_list(As, [erl_string,lua_string,lua_string,lua_any]) of [S|_] -> %% Compile the string so it returns errors. Ret = luerl_comp:string(S, [verbose,return]), load_ret(Ret, St); error -> badarg_error(load, As, St) end. loadfile(_, As, St) -> case luerl_lib:conv_list(As, [erl_string,lua_string,lua_any]) of [F|_] -> %% Compile the file so it returns errors. Ret = luerl_comp:file(F, [verbose,return]), load_ret(Ret, St); error -> badarg_error(loadfile, As, St) end. loadstring(_, As, St) -> case luerl_lib:conv_list(As, [erl_string]) of [S] -> %% Compile the string so it returns errors. Ret = luerl_comp:string(S, [verbose,return]), load_ret(Ret, St); error -> badarg_error(loadstring, As, St) end. load_ret({ok,Chunk}, St0) -> {Func,St1} = luerl_emul:load_chunk(Chunk, St0), {[Func],St1}; load_ret({error,[{_,Mod,E}|_],_}, St) -> Msg = unicode:characters_to_binary(Mod:format_error(E)), {[nil,Msg],St}. pcall(_, [F|As], St0) -> try {Rs,St1} = luerl_emul:functioncall(F, As, St0), {[true|Rs],St1} catch %% Only catch Lua errors here, signal system errors. error:{lua_error,{error_call, Eas},St2} -> Msg = case Eas of [E|_] -> {Str,_} = luerl_lib:tostring(E, St2), Str; [] -> <<"nil">> end, {[false,Msg],St2}; error:{lua_error,E,St2} -> Msg = luerl_lib:format_error(E), {[false,Msg],St2} end. %% Lua 5.1 compatibility functions. unpack(_, As, St) -> luerl_lib_table:unpack(As, St). rvirding-luerl-772b25e/src/luerl_lib_math.erl0000664000232200023220000002734715114130670021656 0ustar debalancedebalance%% Copyright (c) 2013-2020 Robert Virding %% %% Licensed under the Apache License, Version 2.0 (the "License"); %% you may not use this file except in compliance with the License. %% You may obtain a copy of the License at %% %% http://www.apache.org/licenses/LICENSE-2.0 %% %% Unless required by applicable law or agreed to in writing, software %% distributed under the License is distributed on an "AS IS" BASIS, %% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. %% See the License for the specific language governing permissions and %% limitations under the License. %% File : luerl_lib_math.erl %% Author : Robert Virding %% Purpose : The math library for Luerl. %% We try to mirror the handling of arguments which occurs in the Lua %% math module. Many functions allow extra arguments but only look at %% the first required ones of the right type and completely ignore the %% rest. %% %% We keep atan2, cosh, sinh tanh, pow, frexp and ldexp even though %% have been deprecated. -module(luerl_lib_math). -include("luerl.hrl"). ?MODULEDOC(false). -export([install/1,abs/3,acos/3,asin/3,atan2/3,atan/3,ceil/3,cos/3,cosh/3,deg/3,exp/3,floor/3, fmod/3,frexp/3,ldexp/3,log/3,log10/3,max/3,min/3,modf/3,pow/3,rad/3,random/3,randomseed/3, sin/3,sinh/3,sqrt/3,tan/3,tanh/3,tointeger/3,type/3]). -export([internalize/1,externalize/1]). -import(luerl_lib, [lua_error/2,badarg_error/3]). %Shorten this %% Use the correct random number module. -ifdef(NEW_RAND). -define(RAND_UNIFORM(S), rand:uniform_s(S)). -define(RAND_UNIFORM(L, S), rand:uniform_s(L, S)). -define(RAND_SEED(), rand:seed_s(exs1024)). -define(RAND_SEED(S1,S2,S3), rand:seed_s(exs1024, {S1,S2,S3})). -define(RAND_EXTERNALIZE(S), rand_externalize(S)). -define(RAND_INTERNALIZE(S), rand_internalize(S)). -else. -define(RAND_UNIFORM(S), random:uniform_s(S)). -define(RAND_UNIFORM(L, S), random:uniform_s(L, S)). -define(RAND_SEED(), random:seed0()). -define(RAND_SEED(S1,S2,S3), %Naughty, copied from source {(abs(S1) rem (30269-1) + 1), %PRIME1 (abs(S2) rem (30307-1) + 1), %PRIME2 (abs(S3) rem (30323-1) + 1)}). %PRIME3 -define(RAND_EXTERNALIZE(S), S). % random has just three integers for state so no special work needed. -define(RAND_INTERNALIZE(S), S). -endif. install(St0) -> St1 = St0#luerl{rand=?RAND_SEED()}, %Default initial random seed luerl_heap:alloc_table(table(), St1). table() -> [{<<"abs">>,#erl_mfa{m=?MODULE,f=abs}}, {<<"acos">>,#erl_mfa{m=?MODULE,f=acos}}, {<<"asin">>,#erl_mfa{m=?MODULE,f=asin}}, {<<"atan">>,#erl_mfa{m=?MODULE,f=atan}}, {<<"atan2">>,#erl_mfa{m=?MODULE,f=atan2}}, %For 5.2 backwards compatibility {<<"ceil">>,#erl_mfa{m=?MODULE,f=ceil}}, {<<"cos">>,#erl_mfa{m=?MODULE,f=cos}}, {<<"cosh">>,#erl_mfa{m=?MODULE,f=cosh}}, %For 5.2 backwards compatibility {<<"deg">>,#erl_mfa{m=?MODULE,f=deg}}, {<<"exp">>,#erl_mfa{m=?MODULE,f=exp}}, {<<"floor">>,#erl_mfa{m=?MODULE,f=floor}}, {<<"fmod">>,#erl_mfa{m=?MODULE,f=fmod}}, {<<"frexp">>,#erl_mfa{m=?MODULE,f=frexp}}, %For 5.2 backwards compatibility {<<"huge">>,1.7976931348623157e308}, %From the specs {<<"ldexp">>,#erl_mfa{m=?MODULE,f=ldexp}}, %For 5.2 backwards compatibility {<<"log">>,#erl_mfa{m=?MODULE,f=log}}, {<<"log10">>,#erl_mfa{m=?MODULE,f=log10}}, %For 5.1 backwards compatibility {<<"max">>,#erl_mfa{m=?MODULE,f=max}}, {<<"maxinteger">>,16#7FFFFFFFFFFFFFFF}, %From Lua 5.4.3 {<<"min">>,#erl_mfa{m=?MODULE,f=min}}, {<<"mininteger">>,-16#8000000000000000}, %From Lua 5.4.3 {<<"modf">>,#erl_mfa{m=?MODULE,f=modf}}, {<<"pi">>,math:pi()}, {<<"pow">>,#erl_mfa{m=?MODULE,f=pow}}, {<<"rad">>,#erl_mfa{m=?MODULE,f=rad}}, {<<"random">>,#erl_mfa{m=?MODULE,f=random}}, {<<"randomseed">>,#erl_mfa{m=?MODULE,f=randomseed}}, {<<"sin">>,#erl_mfa{m=?MODULE,f=sin}}, {<<"sinh">>,#erl_mfa{m=?MODULE,f=sinh}}, %For 5.2 backwards compatibility {<<"sqrt">>,#erl_mfa{m=?MODULE,f=sqrt}}, {<<"tan">>,#erl_mfa{m=?MODULE,f=tan}}, {<<"tanh">>,#erl_mfa{m=?MODULE,f=tanh}}, %For 5.2 backwards compatibility {<<"tointeger">>,#erl_mfa{m=?MODULE,f=tointeger}}, {<<"type">>,#erl_mfa{m=?MODULE,f=type}} ]. %% abs(Args, State) -> {[Ret],State}. abs(_, As, St) -> case get_number_args(As) of [N|_] when is_number(N) -> {[abs(N)],St}; _ -> badarg_error(abs, As, St) end. acos(_, As, St) -> case get_number_args(As) of [N|_] when is_number(N) -> {[math:acos(N)],St}; _ -> badarg_error(acos, As, St) end. asin(_, As, St) -> case get_number_args(As) of [N|_] when is_number(N) -> {[math:asin(N)],St}; _ -> badarg_error(asin, As, St) end. atan(_, As, St) -> case get_number_args(As) of [N1,N2|_] when is_number(N1), is_number(N2) -> {[math:atan2(N1, N2)],St}; [N|_] when is_number(N) -> {[math:atan(N)],St}; _ -> badarg_error(atan, As, St) end. atan2(_, As, St) -> %For 5.2 backwards compatibility case get_number_args(As) of [N1,N2|_] when is_number(N1), is_number(N2) -> {[math:atan2(N1, N2)],St}; _ -> badarg_error(atan2, As, St) end. ceil(_, As, St) -> case get_number_args(As) of [N|_] when is_number(N) -> {[ceil(N)],St}; _ -> badarg_error(ceil, As, St) end. -ifndef(HAS_CEIL). %% ceil(Number) -> integer(). %% Ceil does not exist before 20 so we need to do it ourselves. ceil(N) when is_integer(N) -> N; ceil(N) when is_float(N) -> round(N + 0.5). -endif. cos(_, As, St) -> case get_number_args(As) of [N|_] when is_number(N) -> {[math:cos(N)],St}; _ -> badarg_error(cos, As, St) end. cosh(_, As, St) -> %For 5.2 backwards compatibility case get_number_args(As) of [N|_] when is_number(N) -> {[math:cosh(N)],St}; _ -> badarg_error(cosh, As, St) end. deg(_, As, St) -> case get_number_args(As) of [N|_] when is_number(N) -> {[180.0*N/math:pi()],St}; _ -> badarg_error(deg, As, St) end. exp(_, As, St) -> case get_number_args(As) of [N|_] when is_number(N) -> {[math:exp(N)],St}; _ -> badarg_error(exp, As, St) end. floor(_, As, St) -> case get_number_args(As) of [N|_] when is_number(N) -> {[floor(N)],St}; _ -> badarg_error(floor, As, St) end. -ifndef(HAS_FLOOR). %% floor(Number) -> integer(). %% Floor does not exist before 20 so we need to do it ourselves. floor(N) when is_integer(N) -> N; floor(N) when is_float(N) -> round(N - 0.5). -endif. fmod(_, As, St) -> case get_number_args(As) of [X,Y|_] when is_number(X), is_number(Y) -> Div = trunc(X/Y), Rem = X - Div*Y, {[Rem],St}; _ -> badarg_error(fmod, As, St) end. frexp(_, As, St) -> %For 5.2 backwards compatibility %% M,E such that X = M * 2 ^ E. case get_number_args(As) of [X|_] when is_number(X) -> %% The sneaky bit! <> = <<(X+0.0)/float>>, Two52 = 1 bsl 52, Man1 = (Man0 bor Two52)/Two52, %% Bit naughty here, export Man2, Exp1 if Man1 >= 1.0 -> Man2 = Man1/2, Exp1 = Exp0 - 1022; Man1 < 0.5 -> Man2 = Man1*2.0, Exp1 = Exp0 - 1024; true -> Man2 = Man1, Exp1 = Exp0 - 1023 end, Ret = if Sign =:= 1 -> -Man2; true -> Man2 end, {[float(Ret),Exp1],St}; _ -> badarg_error(frexp, As, St) end. ldexp(_, As, St) -> %For 5.2 backwards compatibility case get_number_args(As) of [M,E|_] when is_float(M), is_integer(E) -> {[M*math:pow(2, E)],St}; %% <> = <<0:1,E:11,M:52>>, %% {[X],St}; _ -> badarg_error(ldexp, As, St) end. log(_, As, St) -> case get_number_args(As) of [N1,N2|_] when is_number(N1), N2 == 10 -> {[math:log10(N1)],St}; %Seeing it is builtin [N1,N2|_] when is_number(N1), is_number(N2) -> {[math:log(N1)/math:log(N2)],St}; [N|_] when is_number(N) -> {[math:log(N)],St}; _ -> badarg_error(log, As, St) end. log10(_, As, St) -> %For 5.1 backwards compatibility case get_number_args(As) of [N|_] when N == 0 -> {[-500.0],St}; %Bit hacky [N|_] when is_number(N) -> {[math:log10(N)],St}; _ -> badarg_error(log10, As, St) end. max(_, As, St) -> case luerl_lib:args_to_numbers(As) of [_|_]=Ns -> {[lists:max(Ns)],St}; %At least one number _ -> badarg_error(max, As, St) end. min(_, As, St) -> case luerl_lib:args_to_numbers(As) of [_|_]=Ns -> {[lists:min(Ns)],St}; %At least one number _ -> badarg_error(min, As, St) end. modf(_, As, St) -> case get_number_args(As) of [N|_] when is_integer(N) -> {[N,0.0],St}; [N|_] when is_float(N) -> I = trunc(N), %Integral part {[I,float(N-I)],St}; _ -> badarg_error(modf, As, St) end. pow(_, As, St) -> %For 5.2 backwards compatibility case get_number_args(As) of [N1,N2|_] when is_number(N1) and is_number(N2) -> {[math:pow(N1, N2)],St}; _ -> badarg_error(pow, As, St) end. rad(_, As, St) -> case get_number_args(As) of [N|_] when is_number(N) -> {[math:pi()*N/180.0],St}; _ -> badarg_error(rad, As, St) end. random(_, As, #luerl{rand=S0}=St) -> case luerl_lib:args_to_integers(As) of [] -> %0.0 - 1.0 {R,S1} = ?RAND_UNIFORM(S0), {[R],St#luerl{rand=S1}}; [M] when M >= 1 -> {R,S1} = ?RAND_UNIFORM(M, S0), {[R],St#luerl{rand=S1}}; [M,N] when N >= M -> {R,S1} = ?RAND_UNIFORM(N - M + 1, S0), {[R + M - 1],St#luerl{rand=S1}}; _ -> badarg_error(random, As, St) end. randomseed(_, As, St) -> case get_number_args(As) of [S|_] when is_number(S) -> %% Split integer or float-64 into three integers. <> = <>, {[],St#luerl{rand=?RAND_SEED(A1, A2, A3)}}; _ -> badarg_error(randomseed, As, St) end. sin(_, As, St) -> case get_number_args(As) of [N|_] when is_number(N) -> {[math:sin(N)],St}; _ -> badarg_error(sin, As, St) end. sinh(_, As, St) -> %For 5.2 backwards compatibility case get_number_args(As) of [N|_] when is_number(N) -> {[math:sinh(N)],St}; _ -> badarg_error(sinh, As, St) end. sqrt(_, As, St) -> case get_number_args(As) of [N|_] when is_number(N) -> {[math:sqrt(N)],St}; _ -> badarg_error(sqrt, As, St) end. tan(_, As, St) -> case get_number_args(As) of [N|_] when is_number(N) -> {[math:tan(N)],St}; _ -> badarg_error(tan, As, St) end. tanh(_, As, St) -> %For 5.2 backwards compatibility case get_number_args(As) of [N|_] when is_number(N) -> {[math:tanh(N)],St}; _ -> badarg_error(tanh, As, St) end. tointeger(_, As, St) -> case get_number_args(As) of [N|_] when is_integer(N) -> {[N],St}; [N|_] when is_float(N) -> case trunc(N) of I when I == N -> {[I],St}; _ -> {[nil], St} end; [_|_] -> {[nil],St}; [] -> badarg_error(tointeger, As, St) end. type(_, As, St) -> %% No conversion here. case As of [N|_] when is_integer(N) -> {[<<"integer">>],St}; [N|_] when is_float(N) -> {[<<"float">>],St}; [_|_] -> {[nil],St}; %Not a number [] -> badarg_error(type, As, St) end. %% get_number_args(Args) -> [Number]. %% Convert args to numbers inserting nil when not possible. This %% allows us to disting between no numbers and an empty list. get_number_args(As) -> lists:map(fun luerl_lib:arg_to_number/1, As). %% get_number_args([A|As]) -> %% case luerl_lib:tonumber(A) of %% N when is_number(N) -> %% [N|get_number_args(As)]; %% nil -> [] %% end; %% get_number_args([]) -> []. internalize(S) -> ?RAND_INTERNALIZE(S). externalize(S) -> ?RAND_EXTERNALIZE(S). -ifdef(NEW_RAND). rand_externalize(#luerl{rand=S0}=St) -> St#luerl{rand=rand:export_seed_s(S0)}. rand_internalize(#luerl{rand=S0}=St) -> St#luerl{rand=rand:seed_s(S0)}. -endif. rvirding-luerl-772b25e/src/luerl_lib_table.erl0000664000232200023220000004656715114130670022021 0ustar debalancedebalance%% Copyright (c) 2013-2020 Robert Virding %% %% Licensed under the Apache License, Version 2.0 (the "License"); %% you may not use this file except in compliance with the License. %% You may obtain a copy of the License at %% %% http://www.apache.org/licenses/LICENSE-2.0 %% %% Unless required by applicable law or agreed to in writing, software %% distributed under the License is distributed on an "AS IS" BASIS, %% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. %% See the License for the specific language governing permissions and %% limitations under the License. %% File : luerl_lib_table.erl %% Author : Robert Virding %% Purpose : The table library for Luerl. %% These functions sometimes behave strangely in the Lua 5.2 %% libraries, but we try to follow them. Most of these functions KNOW %% that a table is a ttdict! We know that the erlang array has default %% value 'nil'. -module(luerl_lib_table). -include("luerl.hrl"). ?MODULEDOC(false). %% The basic entry point to set up the function table. -export([install/1,concat/3,insert/3,pack/3,remove/3,sort/3,unpack/3]). %% Export some functions which can be called from elsewhere. -export([concat/4,concat/5,raw_length/2,length/2,unpack/2]). %% Export some test functions. -export([test_concat/1, test_insert/2,test_insert/3, test_remove/2,test_remove/3]). -import(luerl_lib, [lua_error/2,badarg_error/3]). %Shorten this install(St) -> luerl_heap:alloc_table(table(), St). %% table() -> [{FuncName,Function}]. table() -> [{<<"concat">>,#erl_mfa{m=?MODULE,f=concat}}, {<<"insert">>,#erl_mfa{m=?MODULE,f=insert}}, {<<"pack">>,#erl_mfa{m=?MODULE,f=pack}}, {<<"remove">>,#erl_mfa{m=?MODULE,f=remove}}, {<<"sort">>,#erl_mfa{m=?MODULE,f=sort}}, {<<"unpack">>,#erl_mfa{m=?MODULE,f=unpack}} ]. %% concat - concat the elements of a list into a string. concat(_, As, St0) -> try do_concat(As, St0) catch throw:{error,E,St1} -> lua_error(E, St1); throw:{error,E} -> lua_error(E, St0) end. do_concat([#tref{}=Tref|As], St) -> #table{a=Arr,d=Dict} = luerl_heap:get_table(Tref, St), case luerl_lib:conv_list(concat_args(As), [lua_string,lua_integer,lua_integer]) of [Sep,I] -> {[do_concat(Arr, Dict, Sep, I, length_loop(Arr))],St}; [Sep,I,J] -> {[do_concat(Arr, Dict, Sep, I, J)],St}; _ -> throw({error,{badarg,concat,As},St}) end; do_concat(As, St) -> throw({error,{badarg,concat,As},St}). %% concat(Table, Sep, I, State) -> string(). %% concat(Table, Sep, I, J, State) -> string(). %% Concatenate elements in a list into a string. Callable from %% Erlang. concat(Tref, Sep, I, St) -> #table{a=Arr,d=Dict} = luerl_heap:get_table(Tref, St), J = length_loop(Arr), do_concat(Arr, Dict, Sep, I, J). concat(Tref, Sep, I, J, St) -> #table{a=Arr,d=Dict} = luerl_heap:get_table(Tref, St), do_concat(Arr, Dict, Sep, I, J). test_concat(As) -> concat_args(As). concat_args([]) -> concat_args([<<>>]); concat_args([nil|As]) -> concat_args([<<>>|As]); concat_args([Sep]) -> [Sep,1.0]; concat_args([Sep,nil|As]) -> concat_args([Sep,1.0|As]); concat_args([Sep,I]) -> [Sep,I]; concat_args([Sep,I,nil|_]) -> [Sep,I]; concat_args([Sep,I,J|_]) -> [Sep,I,J]. do_concat(Arr, Dict, Sep, I, J) -> Conc = concat_table(Arr, Dict, I, J), concat_join(Conc, Sep). concat_table(Arr, Dict, I, J) -> concat_tab(Arr, Dict, I, J). %% This and unpack_loop are very similar. %% First scan over table up to 0 then the array. We have the indexes %% and limits as integers and explicitly use '==' to compare with %% float values in table. concat_tab(_, _, N, J) when N > J -> []; %Done concat_tab(Arr, _, N, J) when N > 0 -> %Done with table concat_arr(Arr, N, J); concat_tab(Arr, Dict, N, J) -> case ttdict:find(N, Dict) of {ok,V} -> case luerl_lib:arg_to_list(V) of error -> throw({error,{illegal_value,concat,V}}); S -> [S|concat_tab(Arr, Dict, N+1, J)] end; error -> throw({error,{illegal_value,concat,nil}}) end. concat_arr(_, N, J) when N > J -> []; concat_arr(Arr, N, J) -> V = array:get(N, Arr), case luerl_lib:arg_to_list(V) of error -> throw({error,{illegal_value,concat,V}}); S -> [S|concat_arr(Arr, N+1, J)] end. concat_join([E], _) -> list_to_binary(E); concat_join([E1|Es], Sep) -> iolist_to_binary([E1|[ [Sep,E] || E <- Es ]]); concat_join([], _) -> <<>>. %% insert(Table, [Pos,] Value) -> [] %% Insert an element into a list shifting following elements. insert(_, [Tref,V], St) when ?IS_TREF(Tref) -> #table{a=Arr0} = T = luerl_heap:get_table(Tref, St), Arr1 = do_insert_last(Arr0, V), {[],luerl_heap:set_table(Tref, T#table{a=Arr1}, St)}; insert(_, [Tref,P0,V]=As, St) when ?IS_TREF(Tref) -> #table{a=Arr0} = T = luerl_heap:get_table(Tref, St), Size = length_loop(Arr0), case luerl_lib:arg_to_integer(P0) of P1 when P1 >=1, P1 =< Size+1 -> Arr1 = do_insert(Arr0, P1, V), {[],luerl_heap:set_table(Tref, T#table{a=Arr1}, St)}; _ -> badarg_error(insert, As, St) end; insert(_, As, St) -> badarg_error(insert, As, St). test_insert(A, V) -> do_insert_last(A, V). test_insert(A, N, V) -> do_insert(A, N, V). %% do_insert_last(Array, V) -> Array. %% Get the "length" of the first bit and put value in first slot %% after that. do_insert_last(Arr, V) -> Len = length_loop(Arr), %Get "length" array:set(Len+1, V, Arr). %Set the value %% do_insert(Array, P, V) -> Array. %% We only insert elements inside the "proper" 1..n table. do_insert(Arr, P, V) -> %Go to the array part insert_array(Arr, P, V). insert_array(Arr0, N, Here) -> %Put this at N shifting up case array:get(N, Arr0) of nil -> array:set(N, Here, Arr0); %Just fill hole Next -> %Take value for next slot Arr1 = array:set(N, Here, Arr0), insert_array(Arr1, N+1, Next) end. %% remove(Table [,Pos]) -> Value. %% Remove an element from a list shifting following elements. remove(_, [Tref], St) when ?IS_TREF(Tref) -> #table{a=Arr0,d=Dict0} = T = luerl_heap:get_table(Tref, St), {Ret,Arr1,Dict1} = do_remove_last(Arr0, Dict0), {Ret,luerl_heap:set_table(Tref, T#table{a=Arr1,d=Dict1}, St)}; remove(_, [Tref,P0|_]=As, St) when ?IS_TREF(Tref) -> #table{a=Arr0,d=Dict0} = T = luerl_heap:get_table(Tref, St), case luerl_lib:arg_to_integer(P0) of P1 when P1 =/= nil -> case do_remove(Arr0, Dict0, P1) of {Ret,Arr1,Dict1} -> {Ret, luerl_heap:set_table(Tref, T#table{a=Arr1,d=Dict1}, St)}; badarg -> badarg_error(remove, As, St) end; _ -> badarg_error(remove, As, St) %nil or P < 1 end; remove(_, As, St) -> badarg_error(remove, As, St). test_remove(Arr, Dict) -> do_remove_last(Arr, Dict). test_remove(Arr, Dict, N) -> do_remove(Arr, Dict, N). %% do_remove_last(Array, Dict) -> {Return,Array,Dict}. %% Find the length and remove the last element. Return it even if it %% is nil. do_remove_last(Arr0, Dict0) -> case length_loop(Arr0) of 0 -> do_remove_0(Arr0, Dict0); Size -> Val = array:get(Size, Arr0), Arr1 = array:set(Size, nil, Arr0), {[Val],Arr1,Dict0} end. do_remove_0(Arr, Dict0) -> case ttdict:find(0.0, Dict0) of {ok,Val} -> Dict1 = ttdict:erase(0.0, Dict0), {[Val],Arr,Dict1}; error -> {[nil],Arr,Dict0} end. %% do_remove(Array, Dict, P) -> {Return,Array,Dict} | badarg. %% Don't ask, it tries to emulate the "real" Lua, where we can't %% remove elements elements outside of the "proper" 1..n dict. do_remove(Arr, Dict, P) -> do_remove(Arr, Dict, P, length_loop(Arr)). do_remove(Arr, Dict, 0, 0) -> do_remove_0(Arr, Dict); do_remove(Arr, Dict, 1, 0) -> {[nil],Arr,Dict}; do_remove(Arr0, Dict, P, Size) when P >= 1, P =< Size+1 -> Ret = array:get(P, Arr0), Arr1 = remove_array_1(Arr0, P), {[Ret],Arr1,Dict}; do_remove(_, _, _, _) -> badarg. remove_array_1(Arr0, N) -> There = array:get(N+1, Arr0), %Next value Arr1 = array:set(N, There, Arr0), if There =:= nil -> Arr1; %End if next a nil true -> remove_array_1(Arr1, N+1) end. %% pack - pack arguments in to a table. pack(_, As, St0) -> T = pack_loop(As, 0), %Indexes are integers! {Tab,St1} = luerl_heap:alloc_table(T, St0), {[Tab],St1}. pack_loop([E|Es], N) -> [{N+1,E}|pack_loop(Es, N+1)]; pack_loop([], N) -> [{<<"n">>,N}]. %% unpack - unpack table into return values. unpack(_, [#tref{}=Tref|As], St) -> #table{a=Arr,d=Dict} = luerl_heap:get_table(Tref, St), case luerl_lib:args_to_integers(unpack_args(As)) of [I] -> Unp = do_unpack(Arr, Dict, I, length_loop(Arr)), %% io:fwrite("unp: ~p\n", [{Arr,I,Start,Unp}]), {Unp,St}; [I,J] -> Unp = do_unpack(Arr, Dict, I, J), %% io:fwrite("unp: ~p\n", [{Arr,I,J,Start,Unp}]), {Unp,St}; error -> %Not numbers badarg_error(unpack, [Tref|As], St) end; unpack(_, [], St) -> badarg_error(unpack, [], St). unpack(As, St) -> unpack(nil, As, St). %% unpack_args(Args) -> Args. %% Fix args for unpack getting defaults right and handling 'nil'. unpack_args([]) -> unpack_args([1.0]); %Just start from the beginning unpack_args([nil|As]) -> unpack_args([1.0|As]); unpack_args([I]) -> [I]; %Only one argument unpack_args([I,nil|_]) -> [I]; %Goto the default end unpack_args([I,J|_]) -> [I,J]. %Only use two arguments %% This and concat_table are very similar. %% First scan over table up to 0 then the array. We have the indexes %% and limits as integers and explicitly use '==' to compare with %% float values in table. do_unpack(Arr, Dict, I, J) -> unpack_tab(Arr, Dict, I, J). unpack_tab(_, _, N, J) when N > J -> []; %Done unpack_tab(Arr, _, N, J) when N > 0 -> %Done with table unpack_arr(Arr, N, J); unpack_tab(Arr, Dict, N, J) -> E = case ttdict:find(N, Dict) of {ok,V} -> V; error -> nil end, [E|unpack_tab(Arr, Dict, N+1, J)]. unpack_arr(_, N, J) when N > J -> []; unpack_arr(Arr, N, J) -> [array:get(N, Arr)|unpack_arr(Arr, N+1, J)]. %% length(Table, State) -> {Length,State}. %% raw_length(Table, State) -> Length. %% The length of a table is the number of numeric keys in sequence %% from 1. Except if 1 is nil followed by non-nil. Don't ask! length(#tref{}=T, St0) -> Meta = luerl_heap:get_metamethod(T, <<"__len">>, St0), if ?IS_TRUE(Meta) -> {Ret,St1} = luerl_emul:functioncall(Meta, [T], St0), {luerl_lib:first_value(Ret),St1}; true -> {raw_length(T, St0),St0} end. raw_length(Tref, St) -> #table{a=Arr} = luerl_heap:get_table(Tref, St), length_loop(Arr). length_loop(Arr) -> case {array:get(1, Arr),array:get(2, Arr)} of {nil,nil} -> 0; {nil,_} -> length_loop(3, Arr); {_,nil} -> 1; {_,_} -> length_loop(3, Arr) end. length_loop(I, Arr) -> case array:get(I, Arr) of nil -> I-1; _ -> length_loop(I+1, Arr) end. %% sort(Table [,SortFun]) %% Sort the elements of the list after their values. sort(_, [Tref], St0) when ?IS_TREF(Tref) -> Comp = fun (A, B, St) -> lt_comp(A, B, St) end, St1 = do_sort(Comp, St0, Tref), {[],St1}; sort(_, [Tref,Func|_], St0) when ?IS_TREF(Tref) -> Comp = fun (A, B, St) -> luerl_emul:functioncall(Func, [A,B], St) end, St1 = do_sort(Comp, St0, Tref), {[],St1}; sort(_, As, St) -> badarg_error(sort, As, St). do_sort(Comp, St0, Tref) -> #table{a=Arr0} = T = luerl_heap:get_table(Tref, St0), case array:to_list(Arr0) of [] -> St0; %Nothing to do [E0|Es0] -> %% 1st element index 0, skip it and then prepend it again {Es1,St1} = merge_sort(Comp, St0, Es0), Arr2 = array:from_list([E0|Es1], nil), %% io:fwrite("so: ~p\n", [{Arr0,Arr1,Arr2}]), luerl_heap:set_table(Tref, T#table{a=Arr2}, St1) end. %% lt_comp(O1, O2, State) -> {[Bool],State}. %% Proper Lua '<' comparison. lt_comp(O1, O2, St) when is_number(O1), is_number(O2) -> {[O1 =< O2],St}; lt_comp(O1, O2, St) when is_binary(O1), is_binary(O2) -> {[O1 =< O2],St}; lt_comp(O1, O2, St0) -> case luerl_heap:get_metamethod(O1, O2, <<"__lt">>, St0) of nil -> lua_error({illegal_comp,sort}, St0); Meta -> {Ret,St1} = luerl_emul:functioncall(Meta, [O1,O2], St0), {[luerl_lib:boolean_value(Ret)],St1} end. %% sort(A,B,C) -> sort_up(A,B,C). %% sort_up(A,B,[X,Y|L]) -> %% case X =< Y of %% true -> merge_dn([Y,X], sort_dn(A, B, L), []); %% false -> merge_dn([X,Y], sort_dn(A, B, L), []) %% end; %% sort_up(A,B,[X]) -> [X]; %% sort_up(A,B,[]) -> []. %% sort_dn(A,B,[X,Y|L]) -> %% case X =< Y of %% true -> merge_up([X,Y], sort_up(A, B, L), []); %% false -> merge_up([Y,X], sort_up(A, B, L), []) %% end; %% sort_dn(A,B,[X]) -> [X]; %% sort_dn(A,B,[]) -> []. %% merge(A,B,C) -> %% merge_dn(A,B,C). %% %% merge_up(L1, L2, Acc) %% %% L1, L2 increasing, Acc will be decreasing %% merge_up([X|Xs]=Xs0, [Y|Ys]=Ys0, Acc) -> %% case X =< Y of %% true -> merge_up(Xs, Ys0, [X|Acc]); %% false -> merge_up(Xs0, Ys, [Y|Acc]) %% end; %% merge_up([X|Xs], [], Acc) -> merge_up(Xs, [], [X|Acc]); %% merge_up([], [Y|Ys], Acc) -> merge_up([], Ys, [Y|Acc]); %% merge_up([], [], Acc) -> Acc. %% %% merge_dn(L1, L2, Acc) %% %% L1, L2 decreasing, Acc will be increasing %% merge_dn([X|Xs]=Xs0, [Y|Ys]=Ys0, Acc) -> %% case X =< Y of %% true -> merge_dn(Xs0, Ys, [Y|Acc]); %% false -> merge_dn(Xs, Ys0, [X|Acc]) %% end; %% merge_dn([X|Xs], [], Acc) -> merge_dn(Xs, [], [X|Acc]); %% merge_dn([], [Y|Ys], Acc) -> merge_dn([], Ys, [Y|Acc]); %% merge_dn([], [], Acc) -> Acc. %% merge_sort(CompFun, State, List) -> {SortedList,State}. %% The code here has been taken from the sort/2 code in lists.erl and %% converted to chain State through all calls to the comparison %% function. merge_sort(_, St, []) -> {[],St}; merge_sort(_, St, [_] = L) -> {L,St}; merge_sort(Fun, St0, [X, Y|T]) -> {Ret,St1} = Fun(X, Y, St0), case luerl_lib:boolean_value(Ret) of true -> fsplit_1(Y, X, Fun, St1, T, [], []); false -> fsplit_2(Y, X, Fun, St1, T, [], []) end. %% Ascending. fsplit_1(Y, X, Fun, St0, [Z|L], R, Rs) -> {Ret1,St1} = Fun(Y, Z, St0), case luerl_lib:boolean_value(Ret1) of true -> fsplit_1(Z, Y, Fun, St1, L, [X|R], Rs); false -> {Ret2,St2} = Fun(X, Z, St1), case luerl_lib:boolean_value(Ret2) of true -> fsplit_1(Y, Z, Fun, St2, L, [X|R], Rs); false when R == [] -> fsplit_1(Y, X, Fun, St2, L, [Z], Rs); false -> fsplit_1_1(Y, X, Fun, St2, L, R, Rs, Z) end end; fsplit_1(Y, X, Fun, St, [], R, Rs) -> rfmergel([[Y, X|R]|Rs], [], Fun, St, asc). fsplit_1_1(Y, X, Fun, St0, [Z|L], R, Rs, S) -> {Ret1,St1} = Fun(Y, Z, St0), case luerl_lib:boolean_value(Ret1) of true -> fsplit_1_1(Z, Y, Fun, St1, L, [X|R], Rs, S); false -> {Ret2,St2} = Fun(X, Z, St1), case luerl_lib:boolean_value(Ret2) of true -> fsplit_1_1(Y, Z, Fun, St2, L, [X|R], Rs, S); false -> {Ret3,St3} = Fun(S, Z, St2), case luerl_lib:boolean_value(Ret3) of true -> fsplit_1(Z, S, Fun, St3, L, [], [[Y, X|R]|Rs]); false -> fsplit_1(S, Z, Fun, St3, L, [], [[Y, X|R]|Rs]) end end end; fsplit_1_1(Y, X, Fun, St, [], R, Rs, S) -> rfmergel([[S], [Y, X|R]|Rs], [], Fun, St, asc). %% Descending. fsplit_2(Y, X, Fun, St0, [Z|L], R, Rs) -> {Ret1,St1} = Fun(Y, Z, St0), case luerl_lib:boolean_value(Ret1) of false -> fsplit_2(Z, Y, Fun, St1, L, [X|R], Rs); true -> {Ret2,St2} = Fun(X, Z, St1), case luerl_lib:boolean_value(Ret2) of false -> fsplit_2(Y, Z, Fun, St2, L, [X|R], Rs); true when R == [] -> fsplit_2(Y, X, Fun, St2, L, [Z], Rs); true -> fsplit_2_1(Y, X, Fun, St2, L, R, Rs, Z) end end; fsplit_2(Y, X, Fun, St, [], R, Rs) -> fmergel([[Y, X|R]|Rs], [], Fun, St, desc). fsplit_2_1(Y, X, Fun, St0, [Z|L], R, Rs, S) -> {Ret1,St1} = Fun(Y, Z, St0), case luerl_lib:boolean_value(Ret1) of false -> fsplit_2_1(Z, Y, Fun, St1, L, [X|R], Rs, S); true -> {Ret2,St2} = Fun(X, Z, St1), case luerl_lib:boolean_value(Ret2) of false -> fsplit_2_1(Y, Z, Fun, St2, L, [X|R], Rs, S); true -> {Ret3,St3} = Fun(S, Z, St2), case luerl_lib:boolean_value(Ret3) of false -> fsplit_2(Z, S, Fun, St3, L, [], [[Y, X|R]|Rs]); true -> fsplit_2(S, Z, Fun, St3, L, [], [[Y, X|R]|Rs]) end end end; fsplit_2_1(Y, X, Fun, St, [], R, Rs, S) -> fmergel([[S], [Y, X|R]|Rs], [], Fun, St, desc). fmergel([T1, [H2|T2]|L], Acc, Fun, St0, asc) -> {L1,St1} = fmerge2_1(T1, H2, Fun, St0, T2, []), fmergel(L, [L1|Acc], Fun, St1, asc); fmergel([[H2|T2], T1|L], Acc, Fun, St0, desc) -> {L1,St1} = fmerge2_1(T1, H2, Fun, St0, T2, []), fmergel(L, [L1|Acc], Fun, St1, desc); fmergel([L], [], _Fun, St, _O) -> {L,St}; fmergel([L], Acc, Fun, St, O) -> rfmergel([lists:reverse(L, [])|Acc], [], Fun, St, O); fmergel([], Acc, Fun, St, O) -> rfmergel(Acc, [], Fun, St, O). rfmergel([[H2|T2], T1|L], Acc, Fun, St0, asc) -> {L1,St1} = rfmerge2_1(T1, H2, Fun, St0, T2, []), rfmergel(L, [L1|Acc], Fun, St1, asc); rfmergel([T1, [H2|T2]|L], Acc, Fun, St0, desc) -> {L1,St1} = rfmerge2_1(T1, H2, Fun, St0, T2, []), rfmergel(L, [L1|Acc], Fun, St1, desc); rfmergel([L], Acc, Fun, St, O) -> fmergel([lists:reverse(L, [])|Acc], [], Fun, St, O); rfmergel([], Acc, Fun, St, O) -> fmergel(Acc, [], Fun, St, O). %% merge(Fun, T1, [H2 | T2]) when is_function(Fun, 2) -> %% lists:reverse(fmerge2_1(T1, H2, Fun, T2, []), []); %% merge(Fun, T1, []) when is_function(Fun, 2) -> %% T1. %% Elements from the first list are prioritized. fmerge2_1([H1|T1], H2, Fun, St0, T2, M) -> {Ret,St1} = Fun(H1, H2, St0), case luerl_lib:boolean_value(Ret) of true -> fmerge2_1(T1, H2, Fun, St1, T2, [H1|M]); false -> fmerge2_2(H1, T1, Fun, St1, T2, [H2|M]) end; fmerge2_1([], H2, _Fun, St, T2, M) -> {lists:reverse(T2, [H2|M]),St}. fmerge2_2(H1, T1, Fun, St0, [H2|T2], M) -> {Ret,St1} = Fun(H1, H2, St0), case luerl_lib:boolean_value(Ret) of true -> fmerge2_1(T1, H2, Fun, St1, T2, [H1|M]); false -> fmerge2_2(H1, T1, Fun, St1, T2, [H2|M]) end; fmerge2_2(H1, T1, _Fun, St, [], M) -> {lists:reverse(T1, [H1|M]),St}. %% rmerge(Fun, T1, [H2 | T2]) when is_function(Fun, 2) -> %% lists:reverse(rfmerge2_1(T1, H2, Fun, T2, []), []); %% rmerge(Fun, T1, []) when is_function(Fun, 2) -> %% T1. rfmerge2_1([H1|T1], H2, Fun, St0, T2, M) -> {Ret,St1} = Fun(H1, H2, St0), case luerl_lib:boolean_value(Ret) of true -> rfmerge2_2(H1, T1, Fun, St1, T2, [H2|M]); false -> rfmerge2_1(T1, H2, Fun, St1, T2, [H1|M]) end; rfmerge2_1([], H2, _Fun, St, T2, M) -> {lists:reverse(T2, [H2|M]),St}. rfmerge2_2(H1, T1, Fun, St0, [H2|T2], M) -> {Ret,St1} = Fun(H1, H2, St0), case luerl_lib:boolean_value(Ret) of true -> rfmerge2_2(H1, T1, Fun, St1, T2, [H2|M]); false -> rfmerge2_1(T1, H2, Fun, St1, T2, [H1|M]) end; rfmerge2_2(H1, T1, _Fun, St, [], M) -> {lists:reverse(T1, [H1|M]),St}. rvirding-luerl-772b25e/src/ttdict.erl0000664000232200023220000005537415114130670020170 0ustar debalancedebalance%% Copyright (c) 2013 Robert Virding %% %% Licensed under the Apache License, Version 2.0 (the "License"); %% you may not use this file except in compliance with the License. %% You may obtain a copy of the License at %% %% http://www.apache.org/licenses/LICENSE-2.0 %% %% Unless required by applicable law or agreed to in writing, software %% distributed under the License is distributed on an "AS IS" BASIS, %% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. %% See the License for the specific language governing permissions and %% limitations under the License. %% File : ttdict.erl %% Author : Robert Virding %% Purpose : Key-Value dictionary as a 2-3 tree. %% This implementation uses 2-3 trees. The description of the tree %% restructuring which is used comes from Prof. Lyn Turbak's notes for %% CS230 Data Structures at Wellesley College. -module(ttdict). -include("luerl.hrl"). ?MODULEDOC(false). %% Standard interface. -export([new/0,is_key/2,to_list/1,from_list/1,size/1]). -export([fetch/2,find/2,fetch_keys/1,erase/2]). -export([store/3,append/3,append_list/3]). -export([update_val/3,update/3,update/4,update_counter/3]). -export([fold/3,map/2,filter/2,merge/3]). %% Extended interface. -export([foreach/2,mapfold/3]). %% Special interface. -export([first/1,last/1,next/2,prev/2]). %% Deprecated interface. -export([dict_to_list/1,list_to_dict/1]). -deprecated([{dict_to_list,1},{list_to_dict,1}]). -compile({no_auto_import,[size/1]}). %We mean our own size/1 -ifdef(DEBUG). -export([check_depth/1]). -endif. %% Data structure: %% - {Left,Key,Val,Right} %% - {Left,Key,Val,Middle,Key,Val,Right} %% - empty %% %% The term order is an arithmetic total order, so we should not %% test exact equality for the keys. (If we do, then it becomes %% possible that neither `>', `<', nor `=:=' matches.) Testing '<' %% and '>' first is statistically better than testing for %% equality, and also allows us to skip the test completely in the %% remaining case. %% %% In all the functions we test keys from left to right in the %% structure. This might not always be the best choice (is there any %% best choice?) but it makes the code consistent. -type ttdict() :: empty | {ttdict(),any(),any(),ttdict()} | {ttdict(),any(),any(),ttdict(),any(),any(),ttdict()}. -export_type([ttdict/0]). -spec new() -> Dict when Dict :: ttdict(). new() -> empty. %The empty dict -spec is_key(Key, Dict) -> boolean() when Key :: term(), Dict :: ttdict(). is_key(_, empty) -> false; is_key(Key, {L,Xk,_,_}) when Key < Xk -> is_key(Key, L); is_key(Key, {_,Xk,_,R}) when Key > Xk -> is_key(Key, R); is_key(_, {_,_,_,_}) -> true; %Key == Xk is_key(Key, {L,Xk,_,_,_,_,_}) when Key < Xk -> is_key(Key, L); is_key(Key, {_,Xk,_,M,Yk,_,R}) when Key > Xk -> if Key < Yk -> is_key(Key, M); Key > Yk -> is_key(Key, R); true -> true %Key == Yk end; is_key(_, {_,_,_,_,_,_,_}) -> true. %Key == Xk -spec to_list(Dict) -> List when Dict :: ttdict(), List :: [{Key :: term(),Value :: term()}]. to_list(D) -> to_list(D, []). to_list(empty, Tail) -> Tail; to_list({L,Xk,Xv,R}, Tail) -> to_list(L, [{Xk,Xv}|to_list(R, Tail)]); to_list({L,Xk,Xv,M,Yk,Yv,R}, Tail) -> to_list(L, [{Xk,Xv}|to_list(M, [{Yk,Yv}|to_list(R, Tail)])]). -spec from_list(List) -> Dict when List :: [{Key :: term(),Value :: term()}], Dict :: ttdict(). from_list(List) -> lists:foldl(fun ({K,V}, D) -> store(K, V, D) end, new(), List). -spec size(Dict) -> non_neg_integer() when Dict :: ttdict(). size(empty) -> 0; size({L,_,_,R}) -> size(L) + size(R) + 1; size({L,_,_,M,_,_,R}) -> size(L) + size(M) + size(R) + 2. -spec fetch(Key, Dict) -> Value when Key :: term(), Dict :: ttdict(), Value :: term(). fetch(K, {L,Xk,_,_}) when K < Xk -> fetch(K, L); fetch(K, {_,Xk,_,R}) when K > Xk -> fetch(K, R); fetch(_, {_,_,Xv,_}) -> Xv; fetch(K, {L,Xk,_,_,_,_,_}) when K < Xk -> fetch(K, L); fetch(K, {_,Xk,_,M,Yk,Yv,R}) when K > Xk -> if K < Yk -> fetch(K, M); %Middle K > Yk -> fetch(K, R); %Right true -> Yv end; fetch(_, {_,_,Xv,_,_,_,_}) -> Xv; fetch(_, empty) -> error(badarg). -spec find(Key, Dict) -> {ok,Value} | error when Key :: term(), Dict :: ttdict(), Value :: term(). find(K, {L,Xk,_,_}) when K < Xk -> find(K, L); find(K, {_,Xk,_,B}) when K > Xk -> find(K, B); find(_, {_,_,Xv,_}) -> {ok,Xv}; find(K, {L,Xk,_,_,_,_,_}) when K < Xk -> find(K, L); find(K, {_,Xk,_,M,Yk,Yv,R}) when K > Xk -> if K < Yk -> find(K, M); %Middle K > Yk -> find(K, R); %Right true -> {ok,Yv} end; find(_, {_,_,Xv,_,_,_,_}) -> {ok,Xv}; find(_, empty) -> error. -spec fetch_keys(Dict) -> Keys when Dict :: ttdict(), Keys :: [term()]. fetch_keys(D) -> fetch_keys(D, []). fetch_keys(empty, Tail) -> Tail; fetch_keys({L,Xk,_,R}, Tail) -> fetch_keys(L, [Xk|fetch_keys(R, Tail)]); fetch_keys({L,Xk,_,M,Yk,_,R}, Tail) -> fetch_keys(L, [Xk|fetch_keys(M, [Yk|fetch_keys(R, Tail)])]). -spec store(Key, Value, Dict1) -> Dict2 when Key :: term(), Value :: term(), Dict1 :: ttdict(), Dict2 :: ttdict(). store(Key, Val, T) -> %% Store and check for a returned "Up" node. case store_aux(Key, Val, T) of {up,Lu,Ku,Vu,Ru} -> {Lu,Ku,Vu,Ru}; Node -> Node end. store_aux(Key, Val, empty) -> {up,empty,Key,Val,empty}; %"Up" node store_aux(Key, Val, {empty,K,V,empty}) -> %% Special case to avoid creating temporary "up" nodes. %% It helps a little bit, but not much. if Key < K -> {empty,Key,Val,empty,K,V,empty}; Key > K -> {empty,K,V,empty,Key,Val,empty}; true -> {empty,K,Val,empty} end; store_aux(Key, Val, {L,K,V,R}) -> if Key < K -> %Down the left store_up2_l(store_aux(Key, Val, L), K, V, R); Key > K -> %Down the right store_up2_r(L, K, V, store_aux(Key, Val, R)); true -> {L,K,Val,R} %Replace current value end; store_aux(Key, Val, {L,Xk,Xv,M,Yk,Yv,R}) when Key < Xk -> store_up3_l(store_aux(Key, Val, L), Xk, Xv, M, Yk, Yv, R); store_aux(Key, Val, {L,Xk,Xv,M,Yk,Yv,R}) when Key > Xk -> if Key < Yk -> %Down the middle store_up3_m(L, Xk, Xv, store_aux(Key, Val, M), Yk, Yv, R); Key > Yk -> %Down the right store_up3_r(L, Xk, Xv, M, Yk, Yv, store_aux(Key, Val, R)); true -> {L,Xk,Xv,M,Yk,Val,R} end; store_aux(_, Val, {L,Xk,_,M,Yk,Yv,R}) -> %Key == Xk {L,Xk,Val,M,Yk,Yv,R}. -spec append(Key, Value, Dict1) -> Dict2 when Key :: term(), Value :: term(), Dict1 :: ttdict(), Dict2 :: ttdict(). append(Key, Val, T) -> %% Append and check for a returned "Up" node. case append_aux(Key, [Val], T) of {up,Lu,Ku,Vu,Ru} -> {Lu,Ku,Vu,Ru}; Node -> Node end. -spec append_list(Key, Values, Dict1) -> Dict2 when Key :: term(), Values :: [Value :: term()], Dict1 :: ttdict(), Dict2 :: ttdict(). append_list(Key, Val, T) -> %% Append and check for a returned "Up" node. case append_aux(Key, Val, T) of {up,Lu,Ku,Vu,Ru} -> {Lu,Ku,Vu,Ru}; Node -> Node end. append_aux(Key, Val, empty) -> {up,empty,Key,Val,empty}; %"Up" node append_aux(Key, Val, {L,K,V,R}) -> if Key < K -> %Down the left store_up2_l(append_aux(Key, Val, L), K, V, R); Key > K -> %Down the right store_up2_r(L, K, V, append_aux(Key, Val, R)); true -> {L,Key,V ++ Val,R} %Append to current value end; append_aux(Key, Val, {L,Xk,Xv,M,Yk,Yv,R}) when Key < Xk -> store_up3_l(append_aux(Key, Val, L), Xk, Xv, M, Yk, Yv, R); append_aux(Key, Val, {L,Xk,Xv,M,Yk,Yv,R}) when Key > Xk -> if Key < Yk -> store_up3_m(L, Xk, Xv, append_aux(Key, Val, M), Yk, Yv, R); Key > Yk -> store_up3_r(L, Xk, Xv, M, Yk, Yv, append_aux(Key, Val, R)); true -> {L,Xk,Xv,M,Key,Yv ++ Val,R} end; append_aux(Key, Val, {L,_,Xv,M,Yk,Yv,R}) -> {L,Key,Xv ++ Val,M,Yk,Yv,R}. -spec update_val(Key, Value, Dict1) -> Dict2 when Key :: term(), Value :: term(), Dict1 :: ttdict(), Dict2 :: ttdict(). update_val(Key, Val, {L,Xk,Xv,R}) -> if Key < Xk -> {update_val(Key, Val, L),Xk,Xv,R}; Key > Xk -> {L,Xk,Xv,update_val(Key, Val, R)}; true -> {L,Xk,Val,R} end; update_val(Key, Val, {L,Xk,Xv,M,Yk,Yv,R}) when Key < Xk -> {update_val(Key, Val, L),Xk,Xv,M,Yk,Yv,R}; update_val(Key, Val, {L,Xk,Xv,M,Yk,Yv,R}) when Key > Xk -> if Key < Yk -> {L,Xk,Xv,update_val(Key, Val, M),Yk,Yv,R}; Key > Yk -> {L,Xk,Xv,M,Yk,Yv,update_val(Key, Val, R)}; true -> {L,Xk,Xv,M,Yk,Val,R} end; update_val(_, Val, {L,Xk,_,M,Yk,Yv,R}) -> %Key == Xk {L,Xk,Val,M,Yk,Yv,R}. -spec update(Key, Fun, Dict1) -> Dict2 when Key :: term(), Fun :: fun((Value1 :: term()) -> Value2 :: term()), Dict1 :: ttdict(), Dict2 :: ttdict(). update(Key, Fun, {L,Xk,Xv,R}) -> if Key < Xk -> {update(Key, Fun, L),Xk,Xv,R}; Key > Xk -> {L,Xk,Xv,update(Key, Fun, R)}; true -> {L,Xk,Fun(Xv),R} %Key == Xk end; update(Key, Fun, {L,Xk,Xv,M,Yk,Yv,R}) when Key < Xk -> {update(Key, Fun, L),Xk,Xv,M,Yk,Yv,R}; update(Key, Fun, {L,Xk,Xv,M,Yk,Yv,R}) when Key > Xk -> if Key < Yk -> {L,Xk,Xv,update(Key, Fun, M),Yk,Yv,R}; Key > Yk -> {L,Xk,Xv,M,Yk,Yv,update(Key, Fun, R)}; true -> {L,Xk,Xv,M,Yk,Fun(Yv),R} end; update(_, Fun, {L,Xk,Xv,M,Yk,Yv,R}) -> %Key == Xk {L,Xk,Fun(Xv),M,Yk,Yv,R}. -spec update(Key, Fun, Initial, Dict1) -> Dict2 when Key :: term, Initial :: term(), Fun :: fun((Value :: term()) -> Value2 :: term()), Dict1 :: ttdict(), Dict2 :: ttdict(). update(Key, Fun, I, T) -> case update_aux(Key, Fun, I, T) of {up,Lu,Ku,Vu,Ru} -> {Lu,Ku,Vu,Ru}; Node -> Node end. update_aux(Key, _, I, empty) -> {up,empty,Key,I,empty}; update_aux(Key, Fun, I, {L,Xk,Xv,R}) -> if Key < Xk -> store_up2_l(update_aux(Key, Fun, I, L), Xk, Xv, R); Key > Xk -> store_up2_r(L, Xk, Xv, update_aux(Key, Fun, I, R)); true -> {L,Xk,Fun(Xv),R} end; update_aux(Key, Fun, I, {L,Xk,Xv,M,Yk,Yv,R}) when Key < Xk -> store_up3_l(update_aux(Key, Fun, I, L), Xk, Xv, M, Yk, Yv, R); update_aux(Key, Fun, I, {L,Xk,Xv,M,Yk,Yv,R}) when Key > Xk -> if Key < Yk -> store_up3_m(L, Xk, Xv, update_aux(Key, Fun, I, M), Yk, Yv, R); Key > Yk -> store_up3_r(L, Xk, Xv, M, Yk, Yv, update_aux(Key, Fun, I, R)); true -> {L,Xk,Xv,M,Key,Fun(Yv),R} end; update_aux(_, Fun, _, {L,Xk,Xv,M,Yk,Yv,R}) -> %Key == Xk {L,Xk,Fun(Xv),M,Yk,Yv,R}. -spec update_counter(Key, Increment, Dict1) -> Dict2 when Key :: term(), Increment :: number(), Dict1 :: ttdict(), Dict2 :: ttdict(). update_counter(Key, I, T) -> case update_counter_aux(Key, I, T) of {up,Lu,Ku,Vu,Ru} -> {Lu,Ku,Vu,Ru}; Node -> Node end. update_counter_aux(Key, I, empty) -> {up,empty,Key,I,empty}; update_counter_aux(Key, I, {L,Xk,Xv,R}) -> if Key < Xk -> store_up2_l(update_counter_aux(Key, I, L), Xk, Xv, R); Key > Xk -> store_up2_r(L, Xk, Xv, update_counter_aux(Key, I, R)); true -> {L,Xk,Xv+I,R} end; update_counter_aux(Key, I, {L,Xk,Xv,M,Yk,Yv,R}) when Key < Xk -> store_up3_l(update_counter_aux(Key, I, L), Xk, Xv, M, Yk, Yv, R); update_counter_aux(Key, I, {L,Xk,Xv,M,Yk,Yv,R}) when Key > Xk -> if Key < Yk -> store_up3_m(L, Xk, Xv, update_counter_aux(Key, I, M), Yk, Yv, R); Key > Yk -> store_up3_r(L, Xk, Xv, M, Yk, Yv, update_counter_aux(Key, I, R)); true -> {L,Xk,Xv,M,Yk,Yv+I,R} end; update_counter_aux(_, I, {L,Xk,Xv,B,Yk,Yv,R}) -> %Key == Xk {L,Xk,Xv+I,B,Yk,Yv,R}. %% store_up2_l/r(L, K, V, R) -> {L,Xk,Xv,M,Yk,Yv,R} | {L,K,V,R}. store_up2_l({up,Lu,Ku,Vu,Ru}, K, V, R) -> {Lu,Ku,Vu,Ru,K,V,R}; store_up2_l(L, K, V, R) -> {L,K,V,R}. store_up2_r(L, K, V, {up,Lu,Ku,Vu,Ru}) -> {L,K,V,Lu,Ku,Vu,Ru}; store_up2_r(L, K, V, R) -> {L,K,V,R}. %% store_up3_l/m/r(L, Xk, Xv, M, Yk, Yv, R) -> %% {up,L,K,V,R} | {L,Xk,Xv,M,Yk,Yv,R}. store_up3_l({up,Lu,Ku,Vu,Ru}, Xk, Xv, M, Yk, Yv, R) -> {up,{Lu,Ku,Vu,Ru},Xk,Xv,{M,Yk,Yv,R}}; store_up3_l(L, Xk, Xv, M, Yk, Yv, R) -> {L,Xk,Xv,M,Yk,Yv,R}. store_up3_m(L, Xk, Xv, {up,Lu,Ku,Vu,Ru}, Yk, Yv, R) -> {up,{L,Xk,Xv,Lu},Ku,Vu,{Ru,Yk,Yv,R}}; store_up3_m(L, Xk, Xv, M, Yk, Yv, R) -> {L,Xk,Xv,M,Yk,Yv,R}. store_up3_r(L, Xk, Xv, M, Yk, Yv, {up,Lu,Ku,Vu,Ru}) -> {up,{L,Xk,Xv,M},Yk,Yv,{Lu,Ku,Vu,Ru}}; store_up3_r(L, Xk, Xv, M, Yk, Yv, R) -> {L,Xk,Xv,M,Yk,Yv,R}. -spec erase(Key, Dict1) -> Dict2 when Key :: term(), Dict1 :: ttdict(), Dict2 :: ttdict(). erase(Key, T) -> case erase_aux(Key, T) of {up,T1} -> T1; %??? T1 -> T1 end. erase_aux(_, empty) -> empty; %No element erase_aux(Key, {empty,Xk,_,empty}=N) -> if Key < Xk; Key > Xk -> N; %No element true -> {up,empty} end; erase_aux(Key, {L,Xk,Xv,R}) -> if Key < Xk -> %Down the left erase_up2_l(erase_aux(Key, L), Xk, Xv, R); Key > Xk -> %Down the right erase_up2_r(L, Xk, Xv, erase_aux(Key, R)); true -> {{Km,Vm},R1}= erase_min(R), erase_up2_r(L, Km, Vm, R1) end; erase_aux(Key, {empty,Xk,Xv,empty,Yk,Yv,empty}=N) -> if Key < Xk -> N; %No element Key > Xk -> if Key < Yk -> N; %No element Key > Yk -> N; true -> {empty,Xk,Xv,empty} end; true -> {empty,Yk,Yv,empty} end; erase_aux(Key, {L,Xk,Xv,M,Yk,Yv,R}) when Key < Xk -> erase_up3_l(erase_aux(Key, L), Xk, Xv, M, Yk, Yv, R); erase_aux(Key, {L,Xk,Xv,M,Yk,Yv,R}) when Key > Xk -> if Key < Yk -> erase_up3_m(L, Xk, Xv, erase_aux(Key, M), Yk, Yv, R); Key > Yk -> erase_up3_r(L, Xk, Xv, M, Yk, Yv, erase_aux(Key, R)); true -> {{Km,Vm},R1} = erase_min(R), erase_up3_r(L, Xk, Xv, M, Km, Vm, R1) end; erase_aux(_, {L,_,_,M,Yk,Yv,R}) -> {{Km,Vm},M1} = erase_min(M), erase_up3_m(L, Km, Vm, M1, Yk, Yv, R). erase_min(T) -> %%io:format("em: ~p\n-> ~p\n", [T,T1]), erase_min1(T). erase_min1({empty,Xk,Xv,empty}) -> {{Xk,Xv},{up,empty}}; erase_min1({L,Xk,Xv,R}) -> {Min,L1} = erase_min1(L), {Min,erase_up2_l(L1, Xk, Xv, R)}; erase_min1({empty,Xk,Xv,empty,Yk,Yv,empty}) -> {{Xk,Xv},{empty,Yk,Yv,empty}}; erase_min1({L,Xk,Xv,M,Yk,Yv,R}) -> {Min,L1} = erase_min1(L), {Min,erase_up3_l(L1, Xk, Xv, M, Yk, Yv, R)}. %% erase_up2_l/r(L, K, V, R) -> Node | {up,Node}. %% We use the same naming of nodes and keys as in the text. It makes %% checking the rules easier. erase_up2_l({up,L}, Xk, Xv, {M,Yk,Yv,R}) -> %1.1 {up,{L,Xk,Xv,M,Yk,Yv,R}}; erase_up2_l({up,A}, Xk, Xv, {B,Yk,Yv,C,Zk,Zv,D}) -> %2.1 {{A,Xk,Xv,B},Yk,Yv,{C,Zk,Zv,D}}; erase_up2_l(L, K, V, R) -> {L,K,V,R}. erase_up2_r({L,Xk,Xv,M}, Yk, Yv, {up,R}) -> %1.2 {up,{L,Xk,Xv,M,Yk,Yv,R}}; erase_up2_r({A,Xk,Xv,B,Yk,Yv,C}, Zk, Zv, {up,D}) -> %2.2 {{A,Xk,Xv,B},Yk,Yv,{C,Zk,Zv,D}}; erase_up2_r(L, K, V, R) -> {L,K,V,R}. %% erase_up2_r(L, K, V, {up,R}) -> erase_up2_r1(L, K, V, R); %% erase_up2_r(L, K, V, R) -> {L,K,V,R}. %% erase_up2_r1({L,Xk,Xv,M}, Yk, Yv, R) -> %1.2 %% {up,{L,Xk,Xv,M,Yk,Yv,R}}; %% erase_up2_r1({A,Xk,Xv,B,Yk,Yv,C}, Zk, Zv, D) -> %2.2 %% {{A,Xk,Xv,B},Yk,Yv,{C,Zk,Zv,D}}. %% erase_up3_l/m/r(L, Xk, Xv, M, Yk, Yv, R) -> Node | {up,Node}. %% We use the same naming of nodes and keys as in the text. It makes %% checking the rules easier. N.B. there are alternate valid choices %% for the middle case! erase_up3_l({up,A}, Xk, Xv, {B,Yk,Yv,C}, Zk, Zv, D) -> %3a.1 {{A,Xk,Xv,B,Yk,Yv,C},Zk,Zv,D}; erase_up3_l({up,A}, Wk, Wv, {B,Xk,Xv,C,Yk,Yv,D}, Zk, Zv, E) -> %4a.1 {{A,Wk,Wv,B},Xk,Xv,{C,Yk,Yv,D},Zk,Zv,E}; erase_up3_l(A, Xk, Xv, B, Yk, Yv, C) -> {A,Xk,Xv,B,Yk,Yv,C}. erase_up3_m({A,Xk,Xv,B}, Yk, Yv, {up,C}, Zk, Zv, D) -> %3a.2 {{A,Xk,Xv,B,Yk,Yv,C},Zk,Zv,D}; erase_up3_m(A, Xk, Xv, {up,B}, Yk, Yv, {C,Zk,Zv,D}) -> %3b.1 {A,Xk,Xv,{B,Yk,Yv,C,Zk,Zv,D}}; erase_up3_m({A,Wk,Wv,B,Xk,Xv,C}, Yk, Yv, {up,D}, Zk, Zv, E) -> %4a.2 {{A,Wk,Wv,B},Xk,Xv,{C,Yk,Yv,D},Zk,Zv,E}; erase_up3_m(A, Wk, Wv, {up,B}, Xk, Xv, {C,Yk,Yv,D,Zk,Zv,E}) -> %4b.1 {A,Wk,Wv,{B,Xk,Xv,C},Yk,Yv,{D,Zk,Zv,E}}; erase_up3_m(A, Xk, Xv, B, Yk, Yv, C) -> {A,Xk,Xv,B,Yk,Yv,C}. erase_up3_r(A, Xk, Xv, {B,Yk,Yv,C}, Zk, Zv, {up,D}) -> %3b.2 {A,Xk,Xv,{B,Yk,Yv,C,Zk,Zv,D}}; erase_up3_r(A, Wk, Wv, {B,Xk,Xv,C,Yk,Yv,D}, Zk, Zv, {up,E}) -> %4b.2 {A,Wk,Wv,{B,Xk,Xv,C},Yk,Yv,{D,Zk,Zv,E}}; erase_up3_r(A, Xk, Xv, B, Yk, Yv, C) -> {A,Xk,Xv,B,Yk,Yv,C}. -spec fold(Fun, Acc0, Dict) -> Acc1 when Fun :: fun((Key, Value, AccIn) -> AccOut), Key :: term(), Value :: term(), Acc0 :: term(), Acc1 :: term(), AccIn :: term(), AccOut :: term(), Dict :: ttdict(). %% Apply Fun to each element in Dict. Do it left to right, even if %% this is not specified. fold(_, Acc, empty) -> Acc; fold(F, Acc, {L,Xk,Xv,R}) -> fold(F, F(Xk, Xv, fold(F, Acc, R)), L); fold(F, Acc, {L,Xk,Xv,M,Yk,Yv,R}) -> fold(F, F(Xk, Xv, fold(F, F(Yk, Yv, fold(F, Acc, R)), M)), L). -spec map(Fun, Dict1) -> Dict2 when Fun :: fun((Key :: term(), Value1 :: term()) -> Value2 :: term()), Dict1 :: ttdict(), Dict2 :: ttdict(). %% Apply Fun to each element in Dict. Do it left to right, even if %% this is not specified. map(_, empty) -> empty; map(F, {A,Xk,Xv,B}) -> {map(F, A),Xk,F(Xk, Xv),map(F, B)}; map(F, {A,Xk,Xv,B,Yk,Yv,C}) -> {map(F, A),Xk,F(Xk, Xv),map(F, B),Yk,F(Yk, Yv),map(F, C)}. -spec filter(Pred, Dict1) -> Dict2 when Pred :: fun((Key :: term(), Value :: term()) -> boolean()), Dict1 :: ttdict(), Dict2 :: ttdict(). %% Apply Fun to each element in Dict. Do it left to right, even if %% this is not specified. filter(F, D) -> filter(F, D, new()). filter(_, empty, New) -> New; filter(F, {L,Xk,Xv,R}, New0) -> New1 = filter(F, L, New0), New2 = case F(Xk, Xv) of true -> store(Xk, Xv, New1); false -> New1 end, filter(F, R, New2); filter(F, {L,Xk,Xv,M,Yk,Yv,R}, New0) -> New1 = filter(F, L, New0), New2 = case F(Xk, Xv) of true -> store(Xk, Xv, New1); false -> New1 end, New3 = filter(F, M, New2), New4 = case F(Yk, Yv) of true -> store(Yk, Yv, New3); false -> New3 end, filter(F, R, New4). -spec merge(Fun, Dict1, Dict2) -> Dict3 when Fun :: fun((Key :: term(), Value1 :: term(), Value2 :: term()) -> Value :: term()), Dict1 :: ttdict(), Dict2 :: ttdict(), Dict3 :: ttdict(). merge(F, D1, D2) -> fold(fun (K, V2, D) -> update(K, fun(V1) -> F(K, V1, V2) end, V2, D) end, D1, D2). %% Extended interface. -spec foreach(Fun, Dict) -> ok when Fun :: fun((Key :: term(), Value :: term()) -> term()), Dict :: ttdict(). %% Apply Fun to each element in Dict. Do it left to right, even if %% this is not specified. foreach(_, empty) -> ok; foreach(F, {L,Xk,Xv,R}) -> foreach(F, L), F(Xk, Xv), foreach(F, R); foreach(F, {L,Xk,Xv,M,Yk,Yv,R}) -> foreach(F, L), F(Xk, Xv), foreach(F, M), F(Yk, Yv), foreach(F, R). -spec mapfold(Fun, Acc0, Dict1) -> {Dict2,Acc1} when Fun :: fun((Key, Value1, AccIn) -> {Value2,AccOut}), Acc0 :: term(), Acc1 :: term(), Key :: term(), Value1 :: term(), Value2 :: term(), AccIn :: term(), AccOut :: term(), Dict1 :: ttdict(), Dict2 :: ttdict(). %% Apply Fun to each element in Dict. Do it left to right, even if %% this is not specified. mapfold(_, Acc, empty) -> {empty,Acc}; mapfold(F, Acc0, {L0,Xk,Xv0,R0}) -> {L1,Acc1} = mapfold(F, Acc0, L0), {Xv1,Acc2} = F(Xk, Xv0, Acc1), {R1,Acc3} = mapfold(F, Acc2, R0), {{L1,Xk,Xv1,R1},Acc3}; mapfold(F, Acc0, {L0,Xk,Xv0,M0,Yk,Yv0,R0}) -> {L1,Acc1} = mapfold(F, Acc0, L0), {Xv1,Acc2} = F(Xk, Xv0, Acc1), {M1,Acc3} = mapfold(F, Acc2, M0), {Yv1,Acc4} = F(Yk, Yv0, Acc3), {R1,Acc5} = mapfold(F, Acc4, R0), {{L1,Xk,Xv1,M1,Yk,Yv1,R1},Acc5}. %% Special interface. -spec first(Dict) -> error | {ok,{Key1,Value}} when Key1 :: term(), Value :: term(), Dict :: ttdict(). first(empty) -> error; first({L,Xk,Xv,_}) -> case first(L) of error -> {ok,{Xk,Xv}}; First -> First end; first({L,Xk,Xv,_,_,_,_}) -> case first(L) of error -> {ok,{Xk,Xv}}; First -> First end. -spec last(Dict) -> error | {ok,{Key1,Value}} when Key1 :: term(), Value :: term(), Dict :: ttdict(). last(empty) -> error; last({_,Xk,Xv,R}) -> case last(R) of error -> {ok,{Xk,Xv}}; Last -> Last end; last({_,_,_,_,Yk,Yv,R}) -> case last(R) of error -> {ok,{Yk,Yv}}; Last -> Last end. -spec next(Key, Dict) -> error | {ok,{Key1,Value}} when Key :: term(), Key1 :: term(), Value :: term(), Dict :: ttdict(). next(_, empty) -> error; next(K, {L,Xk,Xv,_}) when K < Xk -> case next(K, L) of error -> {ok,{Xk,Xv}}; Next -> Next end; next(K, {_,Xk,_,R}) when K > Xk -> next(K, R); next(_, {_,_,_,R}) -> first(R); %when K == Xk next(K, {L,Xk,Xv,_,_,_,_}) when K < Xk -> case next(K, L) of error -> {ok,{Xk,Xv}}; Next -> Next end; next(K, {_,Xk,_,M,Yk,Yv,R}) when K > Xk -> if K < Yk -> case next(K, M) of error -> {ok,{Yk,Yv}}; Next -> Next end; K > Yk -> next(K, R); true -> first(R) %when K == Yk end; next(_, {_,_,_,M,Yk,Yv,_}) -> %when K == Xk case first(M) of error -> {ok,{Yk,Yv}}; First -> First end. -spec prev(Key, Dict) -> error | {ok,{Key1,Value}} when Key :: term(), Key1 :: term(), Value :: term(), Dict :: ttdict(). %% Go from right to left here as it makes it easier to understand %% what is going on. prev(_, empty) -> error; prev(K, {_,Xk,Xv,R}) when K > Xk -> case prev(K, R) of error -> {ok,{Xk,Xv}}; Prev -> Prev end; prev(K, {L,Xk,_,_}) when K < Xk -> prev(K, L); prev(_, {L,_,_,_}) -> last(L); %when K == Xk prev(K, {_,_,_,_,Yk,Yv,R}) when K > Yk -> case prev(K, R) of error -> {ok,{Yk,Yv}}; Prev -> Prev end; prev(K, {L,Xk,Xv,M,Yk,_,_}) when K < Yk -> if K > Xk -> case prev(K, M) of error -> {ok,{Xk,Xv}}; Prev -> Prev end; K < Xk -> prev(K, L); true -> last(L) %when K == Xk end; prev(_, {_,Xk,Xv,M,_,_,_}) -> %when K == Yk case last(M) of error -> {ok,{Xk,Xv}}; Prev -> Prev end. %% Deprecated interface. %% dict_to_list(Dictionary) -> [{Key,Value}]. dict_to_list(D) -> to_list(D). %% list_to_dict([{Key,Value}]) -> Dictionary. list_to_dict(L) -> from_list(L). -ifdef(DEBUG). %% Check the depth of all the leaves, should all be the same. check_depth(T) -> check_depth(T, 1, orddict:new()). check_depth(empty, D, Dd) -> orddict:update_counter(D, 1, Dd); check_depth({L,_,_,R}, D, Dd0) -> Dd1 = orddict:update_counter(two, 1, Dd0), Dd2 = check_depth(L, D+1, Dd1), check_depth(R, D+1, Dd2); check_depth({L,_,_,M,_,_,R}, D, Dd0) -> Dd1 = orddict:update_counter(three, 1, Dd0), Dd2 = check_depth(L, D+1, Dd1), Dd3 = check_depth(M, D+1, Dd2), check_depth(R, D+1, Dd3). -endif. rvirding-luerl-772b25e/src/luerl_comp_normalise.erl0000664000232200023220000003332115114130670023073 0ustar debalancedebalance%% Copyright (c) 2019 Robert Virding %% %% Licensed under the Apache License, Version 2.0 (the "License"); %% you may not use this file except in compliance with the License. %% You may obtain a copy of the License at %% %% http://www.apache.org/licenses/LICENSE-2.0 %% %% Unless required by applicable law or agreed to in writing, software %% distributed under the License is distributed on an "AS IS" BASIS, %% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. %% See the License for the specific language governing permissions and %% limitations under the License. %% File : luerl_comp_normalise.erl %% Author : Robert Virding %% Purpose : A basic LUA 5.3 compiler for Luerl. %% Here we normalise the code and convert it to an internal form. -module(luerl_comp_normalise). -include("luerl.hrl"). -include("luerl_comp.hrl"). ?MODULEDOC(false). -export([chunk/2]). %% chunk(Code, CompInfo) -> {ok,Code} | {error,Reason}. chunk(Code0, #cinfo{opts=Opts}=Ci0) -> %% The chunk is a function. {Code1,_Ci1} = functiondef(Code0, Ci0), luerl_comp:debug_print(Opts, "cn: ~p\n", [Code1]), {ok,Code1}. stmts([{local,L,{functiondef,Lf,Name,Pars,Block}}|Ss], St) -> %% Need to split this up to handle references to Name in the function. Fdef = {functiondef,Lf,Pars,Block}, stmts([{local, L, {assign, L, [Name], [{nil,L}]}}, {';',L}, {local, Lf, {assign, Lf, [Name], [Fdef]}} | Ss], St); stmts([{';',_}|Ss], St) -> stmts(Ss, St); %No-op so we drop it stmts([S0|Ss0], St0) -> {S1,St1} = stmt(S0, St0), {Ss1,St2} = stmts(Ss0, St1), {[S1|Ss1],St2}; stmts([], St) -> {[],St}. %% stmt(Statement, State) -> {CStat,State}. %% Do a statement. The ';' statement will caught and removed in stmts/2. stmt({assign,Line,Vs,Es}, St) -> assign_stmt(Line, Vs, Es, St); stmt({return,Line,Es}, St) -> return_stmt(Line, Es, St); stmt({break,L}, St) -> %Interesting {#break_stmt{l=L},St}; stmt({block,Line,B}, St) -> block_stmt(Line, B, St); stmt({while,Line,Exp,B}, St) -> while_stmt(Line, Exp, B, St); stmt({repeat,Line,B,Exp}, St) -> repeat_stmt(Line, B, Exp, St); stmt({'if',Line,Tests,Else}, St) -> if_stmt(Line, Tests, Else, St); stmt({for,Line,V,I,L,B}, St) -> %Default step of 1 numfor_stmt(Line, V, I, L, {'NUMERAL',Line,1}, B, St); stmt({for,Line,V,I,L,S,B}, St) -> numfor_stmt(Line, V, I, L, S, B, St); stmt({for,Line,Ns,Gs,B}, St) -> genfor_stmt(Line, Ns, Gs, B, St); stmt({functiondef,Line,Fname,Ps,B}, St) -> fdef_stmt(Line, Fname, Ps, B, St); stmt({local,Line,Local}, St) -> local_stmt(Line, Local, St); stmt(Exp, St) -> %This is really just a call Line = element(2, Exp), call_stmt(Line, Exp, St). %% assign_stmt(Line, Vars, Exps, State) -> {Assign,State}. assign_stmt(Line, Vs, Es, St0) -> {Ces,St1} = explist(Es, St0), {Cvs,St2} = assign_loop(Vs, St1), Anno = line_file_anno(Line, St2), {#assign_stmt{l=Anno,vars=Cvs,exps=Ces},St2}. assign_loop([V|Vs], St0) -> {Cv,St1} = var(V, St0), {Cvs,St2} = assign_loop(Vs, St1), {[Cv|Cvs],St2}; assign_loop([], St) -> {[],St}. %% var(VarExp, State) -> {VarExp,State}. %% Step down the prefixexp sequence evaluating as we go, stop at the %% END and return a key and a table where to put data. This is a %% prefixexp with different tail. Attributes are only allowed in %% local assigns and for now we just ignore them. var({'.',L,Exp,Rest}, St0) -> {Ce,St1} = prefixexp_first(Exp, St0), {Cr,St2} = var_rest(Rest, St1), {dot(L, Ce, Cr),St2}; var({{'NAME',L,N},_Attribute}, St) -> %% For now we ignore attributes. {var_name(L, N),St}; var({'NAME',L,N}, St) -> {var_name(L, N),St}. var_rest({'.',L,Exp,Rest}, St0) -> {Ce,St1} = prefixexp_element(Exp, St0), {Cr,St2} = var_rest(Rest, St1), {dot(L, Ce, Cr),St2}; var_rest(Exp, St) -> var_last(Exp, St). var_last({'NAME',L,N}, St) -> %% Transform this to a key_field with the name string. NO! {#key{l=L,key=lit_name(L, N)},St}; var_last({key_field,L,Exp}, St0) -> {Ce,St1} = exp(Exp, St0), {#key{l=L,key=Ce},St1}. %% call_stmt(Line, Exp, State) -> {Call,State}. call_stmt(Line, Exp, St0) -> {Ce,St1} = exp(Exp, St0), Anno = line_file_anno(Line, St1), {#call_stmt{l=Anno,call=Ce},St1}. %% return_stmt(Line, Exps, State) -> {Return,State}. return_stmt(Line, Es, St0) -> {Ces,St1} = explist(Es, St0), Anno = line_file_anno(Line, St1), {#return_stmt{l=Anno,exps=Ces},St1}. %% block_stmt(Line, Stats, State) -> {Block,Stmte}. block_stmt(Line, Ss0, St0) -> {Ss1,St1} = stmts(Ss0, St0), Anno = line_file_anno(Line, St1), {#block_stmt{l=Anno,body=Ss1},St1}. block(Line, Ss0, St0) -> {Ss1,St1} = stmts(Ss0, St0), {#block{l=Line,body=Ss1},St1}. %% while_stmt(Line, Exp, Block, State) -> {While,State}. while_stmt(Line, Exp, B, St0) -> {Ce,St1} = exp(Exp, St0), {Cb,St2} = block(Line, B, St1), Anno = line_file_anno(Line, St2), {#while_stmt{l=Anno,exp=Ce,body=Cb},St2}. %% repeat_stmt(Line, Block, Exp, State) -> {Repeat,State}. %% Append the test expression into the block as a single value %% expression. repeat_stmt(Line, B, Exp, St0) -> {Cb0,St1} = block(Line, B, St0), {Ce,St2} = expr_stmt(Line, {single,Line,Exp}, St1), Cb1 = Cb0#block{body=Cb0#block.body ++ [Ce]}, Anno = line_file_anno(Line, St2), {#repeat_stmt{l=Anno,body=Cb1},St2}. %% if_stmt(Line, Test, Else, State) -> {If,State}. if_stmt(Line, Tests, Else, St0) -> {Cts,St1} = if_tests(Line, Tests, St0), {Ce,St2} = block(Line, Else, St1), Anno = line_file_anno(Line, St2), {#if_stmt{l=Anno,tests=Cts,else_block=Ce},St2}. if_tests(L, Ts, St) -> Test = fun ({T,B}, S0) -> {Ct,S1} = exp(T, S0), {Cb,S2} = block(L, B, S1), {{Ct,Cb},S2} end, lists:mapfoldl(Test, St, Ts). %% numfor_stmt(Line, Var, Init, Limit, Step, Stmts, State) -> {NumFor,State}. numfor_stmt(Line, {'NAME',Ln,N}, I0, L0, S0, Ss, St0) -> Var = var_name(Ln, N), {[I1,L1,S1],St1} = explist([I0,L0,S0], St0), {B,St2} = block(Line, Ss, St1), Anno = line_file_anno(Line, St2), {#nfor_stmt{l=Anno,var=Var,init=I1,limit=L1,step=S1,body=B},St2}. %% genfor_stmt(Line, Vars, Generators, Stmts, State) -> {GenFor,State}. genfor_stmt(Line, Vs0, Gs0, Ss, St0) -> Vs1 = [ var_name(Ln, N) || {'NAME',Ln,N} <- Vs0 ], {Gs1,St1} = explist(Gs0, St0), {B,St2} = block(Line, Ss, St1), Anno = line_file_anno(Line, St2), {#gfor_stmt{l=Anno,vars=Vs1,gens=Gs1,body=B},St2}. %% fdef_stmt(Line, Name, Pars, Stmts, State) -> {Fdef,State}. %% Transform this to an assign. fdef_stmt(Line, Fname, Ps, B, St0) -> {V,F,St1} = functiondef(Line, Fname, Ps, B, St0), Anno = line_file_anno(Line, St1), {#assign_stmt{l=Anno,vars=[V],exps=[F]},St1}. %% functiondef(FunctionDef, State) -> {CFunc,State}. %% functiondef(Line, Pars, Block, State) -> {CFunc,State}. %% functiondef(Line, Name, Pars, Block, State) -> {Var,CFunc,State}. %% Have to specially handle the case where the function is a %% "method". All this really means is that the function has an extra %% parameter 'self' prepended to the parameter list. functiondef({functiondef,L,Ps,B}, St) -> functiondef(L, Ps, B, St). functiondef(L, Ps, Stmts, St0) -> {Cp,Cb,St1} = function_block(Ps, Stmts, St0), Anno = line_file_anno(L, St1), {#fdef{l=Anno,pars=Cp,body=Cb},St1}. functiondef(L, Name0, Ps0, B, St0) -> %% Check if method and transform method to 'NAME' and add self to vars. case is_method(Name0) of %Export Name1 and Ps1 {yes,Name1} -> Ps1 = [{'NAME',L,<<"self">>}|Ps0]; no -> Name1 = Name0, Ps1 = Ps0 end, {Var,St1} = funcname(Name1, St0), {F0,St2} = functiondef(L, Ps1, B, St1), %% Add the function name to the annotations. Anno = luerl_anno:set(name, flat_funcname(Name1), F0#fdef.l), F1 = F0#fdef{l=Anno}, {Var,F1,St2}. is_method({'NAME',_,_}) -> no; is_method({'.',L,N,Rest0}) -> case is_method(Rest0) of {yes,Rest1} -> {yes,{'.',L,N,Rest1}}; no -> no %No change end; is_method({method,_,{'NAME',_,_}=N}) -> {yes,N}. flat_funcname(Name) -> list_to_binary(flat_funcname(Name, [])). flat_funcname({'NAME',_,N}, Rest) -> [N|Rest]; flat_funcname({'.',_,L,R}, Rest) -> flat_funcname(L, [<<".">>|flat_funcname(R, Rest)]). %% funcname(FuncNameExp, State) -> {CFuncNameExp,State}. funcname({'.',L,Exp,Rest}, St0) -> {Ce,St1} = funcname_first(Exp, St0), {Cr,St2} = funcname_rest(Rest, St1), {dot(L, Ce, Cr),St2}; funcname({'NAME',L,N}, St) -> {var_name(L, N),St}. funcname_first({'NAME',L,N}, St) -> {var_name(L, N),St}. funcname_rest({'.',L,Exp,Rest}, St0) -> {Ce,St1} = funcname_element(Exp, St0), {Cr,St2} = funcname_rest(Rest, St1), {dot(L, Ce, Cr),St2}; funcname_rest(Exp, St) -> funcname_last(Exp, St). funcname_element({'NAME',L,N}, St) -> %% Transform this to key_field with the name string. {#key{l=L,key=lit_name(L, N)},St}. %% Method call has been transformed away funcname_last({'NAME',L,N}, St) -> %% Transform this to key_field with the name string. {#key{l=L,key=lit_name(L, N)},St}. %% local_stmt(Line, Local, State) -> {Assign,State}. %% Create and assign local variables. %% local_stmt(Line, {functiondef,Lf,Name,Ps,B}, St0) -> %% {Var,F,St1} = functiondef(Lf, Name, Ps, B, St0), %% Anno = line_file_anno(Line, St1), %% {#local_fdef_stmt{l=Anno,var=Var,func=F},St1}; local_stmt(Line, {assign,_,Ns,Es}, St0) -> {Ces,St1} = explist(Es, St0), {Cns,St2} = lists:mapfoldl(fun (V, St) -> var(V, St) end, St1, Ns), Anno = line_file_anno(Line, St2), {#local_assign_stmt{l=Anno,vars=Cns,exps=Ces},St2}. %% expr_stmt(Line, Exp, State) -> {Call,State}. %% The expression pseudo statement. This will return a single value. expr_stmt(Line, Exp, St0) -> {Ce,St1} = exp(Exp, St0), Anno = line_file_anno(Line, St1), {#expr_stmt{l=Anno,exp=Ce},St1}. %% explist(Exprs, State) -> {Ins,State}. %% exp(Expression, State) -> {Ins,State}. explist([E|Es], St0) -> {Ce,St1} = exp(E, St0), {Ces,St2} = explist(Es, St1), {[Ce|Ces],St2}; explist([], St) -> {[],St}. %No expressions at all exp({nil,L}, St) -> {#lit{l=L,val=nil},St}; exp({false,L}, St) -> {#lit{l=L,val=false},St}; exp({true,L}, St) -> {#lit{l=L,val=true},St}; exp({'NUMERAL',L,N}, St) -> {#lit{l=L,val=N},St}; exp({'LITERALSTRING',L,S}, St) -> {#lit{l=L,val=S},St}; exp({'...',L}, St) -> {var_name(L, '...'),St}; %% {#lit{l=L,v='...'},St}; exp({functiondef,L,Ps,B}, St0) -> {Cf,St1} = functiondef(L, Ps, B, St0), {Cf,St1}; exp({table,L,Fs}, St0) -> {Cfs,St1} = tableconstructor(Fs, St0), {#tabcon{l=L,fields=Cfs},St1}; exp({op,L,Op,A1,A2}, St0) -> {Ca1,St1} = exp(A1, St0), {Ca2,St2} = exp(A2, St1), {#op{l=L,op=Op,args=[Ca1,Ca2]},St2}; exp({op,L,Op,A}, St0) -> {Ca,St1} = exp(A, St0), {#op{l=L,op=Op,args=[Ca]},St1}; exp(E, St) -> prefixexp(E, St). %% prefixexp(PrefixExp, State) -> {CPrefixExp,State}. prefixexp({'.',L,Exp,Rest}, St0) -> {Ce,St1} = prefixexp_first(Exp, St0), {Cr,St2} = prefixexp_rest(Rest, St1), {dot(L, Ce, Cr),St2}; prefixexp(P, St) -> prefixexp_first(P, St). prefixexp_first({'NAME',L,N}, St) -> {var_name(L, N),St}; prefixexp_first({single,L,E}, St0) -> {Ce,St1} = exp(E, St0), {#single{l=L,exp=Ce},St1}. prefixexp_rest({'.',L,Exp,Rest}, St0) -> {Ce,St1} = prefixexp_element(Exp, St0), {Cr,St2} = prefixexp_rest(Rest, St1), {dot(L, Ce, Cr),St2}; prefixexp_rest(Exp, St) -> prefixexp_element(Exp, St). prefixexp_element({'NAME',L,N}, St) -> %% Transform this to a key_field with the name string {#key{l=L,key=lit_name(L, N)},St}; prefixexp_element({key_field,L,Exp}, St0) -> {Ce,St1} = exp(Exp, St0), {#key{l=L,key=Ce},St1}; prefixexp_element({functioncall,L,Args}, St0) -> {Cas,St1} = explist(Args, St0), Anno = line_file_anno(L, St1), {#fcall{l=Anno,args=Cas},St1}; prefixexp_element({methodcall,Lm,{'NAME',Ln,N},Args}, St0) -> {Args1,St1} = explist(Args, St0), Anno = line_file_anno(Lm, St1), {#mcall{l=Anno,meth=lit_name(Ln, N),args=Args1},St1}. dot(L, Exp, Rest) -> #dot{l=L,exp=Exp,rest=Rest}. function_block(Pars, Stmts, St0)-> {Cps,St1} = make_local_pars(Pars, St0), {Cs,St2} = stmts(Stmts, St1), %% io:format("fb: ~p\n", [{St3#comp.fs}]), {Cps,Cs,St2}. make_local_pars(Ps, St) -> Add = fun ({'NAME',L,N}, S) -> {var_name(L, N),S}; ({'...',L}, S) -> {var_name(L, '...'),S} end, lists:mapfoldl(Add, St, Ps). %% tableconstrutor(Fields, State) -> {Instrs,State}. %% Build the instructions to construct a table. We could be smarter %% here and recognise already uses keys and only actually insert the %% last one. Or we could pre-order the table elements so the keys are %% already sorted. We can't unpack the last field if it is a multiple %% value efield as this must be done at run-time. tableconstructor(Fs, St0) -> %% N.B. this fun is for a MAPFOLDL!! Fun = fun ({exp_field,L,Ve}, S0) -> {Ce,S1} = exp(Ve, S0), %Value {#efield{l=L,val=Ce},S1}; ({name_field,L,{'NAME',Ln,N},Ve}, S0) -> {Ce,S1} = exp(Ve, S0), %Value {#kfield{l=L,key=lit_name(Ln, N),val=Ce},S1}; ({key_field,L,Ke,Ve}, S0) -> {Ck,S1} = exp(Ke, S0), %Key {Cv,S2} = exp(Ve, S1), %Value {#kfield{l=L,key=Ck,val=Cv},S2} end, {Cfs,St1} = lists:mapfoldl(Fun, St0, Fs), {Cfs,St1}. %% var_name(Line, Name) -> #var{}. %% lit_name(Line, Name) -> #lit{}. lit_name(L, N) -> #lit{l=L,val=N}. var_name(L, N) -> #var{l=L,name=N}. %% line_file_anno(Line, State) -> Anno. %% set_anno(KeyList, Anno) -> Anno. line_file_anno(L, St) -> Anno = luerl_anno:new(L), luerl_anno:set(file, St#cinfo.lfile, Anno). %% set_anno(Ps, Anno) -> %% lists:foldl(fun ({Key,Val}, A) -> luerl_anno:set(Key, Val, A) end, %% Anno, Ps). rvirding-luerl-772b25e/src/luerl_lib_string_format.erl0000664000232200023220000003212115114130670023565 0ustar debalancedebalance%% Copyright (c) 2013-2025 Robert Virding %% %% Licensed under the Apache License, Version 2.0 (the "License"); %% you may not use this file except in compliance with the License. %% You may obtain a copy of the License at %% %% http://www.apache.org/licenses/LICENSE-2.0 %% %% Unless required by applicable law or agreed to in writing, software %% distributed under the License is distributed on an "AS IS" BASIS, %% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. %% See the License for the specific language governing permissions and %% limitations under the License. %% File : luerl_lib_string_format.erl %% Author : Robert Virding %% Purpose : The string formatting for Luerl. -module(luerl_lib_string_format). -include("luerl.hrl"). ?MODULEDOC(false). -export([format/3]). -import(luerl_lib, [lua_error/2,badarg_error/3]). %Shorten this %% Luerl definitions of these types. -define(WHITE_SPACE(C), (is_integer(C) andalso C >= $\000 andalso C =< $\s)). -define(UPPER(C), (C >= $A andalso C =< $Z)). -define(LOWER(C), (C >= $a andalso C =< $z)). -define(ASCII(C), (C >= 0 andalso C =< 127)). -define(DIGIT(C), (C >= $0 andalso C =< $9)). -define(HEX(C), (C >= $A andalso C =< $F orelse C >= $a andalso C =< $f orelse ?DIGIT(C))). format(F, As, St0) -> {Str,St1} = format_loop(luerl_lib:arg_to_list(F), As, St0), {[iolist_to_binary(Str)],St1}. format_loop(Fmt, As, St) -> format_loop(Fmt, As, St, []). format_loop([$%|Fmt0], As0, St0, Acc) -> {Format,Fmt1} = collect(Fmt0), {Out,As1,St1} = build(Format, As0, St0), format_loop(Fmt1, As1, St1, [Out|Acc]); format_loop([$\\,C|Fmt], As, St, Acc) -> format_loop(Fmt, As, St, [C|Acc]); format_loop([C|Fmt], As, St, Acc) -> format_loop(Fmt, As, St, [C|Acc]); format_loop([], _, St, Acc) -> %Ignore extra arguments {lists:reverse(Acc),St}. %% collect(Format) -> {{C,Flags,Field,Precision},Format}. %% Collect a conversion specification. %% %[flags][width][.precision][conversion] collect(Fmt0) -> %% io:format("~w\n", [Fmt0]), {Fl,Fmt1} = flags(Fmt0), %The flags characters {Fw,Fmt2} = field_width(Fmt1), %The field width {P,Fmt3} = precision(Fmt2), %The precision {C,Fmt4} = collect_cc(Fmt3), %The control character %% io:format("col C=~c Fl=~.2b Fw=~w P=~w\n", [C,Fl,Fw,P]), {{C,Fl,Fw,P},Fmt4}. %% Handling the flags of a format. %% Yes, we should use a tuple or record, but this is much more fun. -define(FL_NONE, 0). -define(FL_H, 2#00001). %# flag -define(FL_Z, 2#00010). %0 flag -define(FL_M, 2#00100). %- flag -define(FL_S, 2#01000). %space flag -define(FL_P, 2#10000). %+ flag -define(SET_FLAG(FL,B), (FL bor (B))). -define(FLAG_SET(FL, B), ((FL band (B)) =/= 0)). -define(FLAG_CLR(FL, B), ((FL band (B)) =:= 0)). flags(Fmt) -> flags(Fmt, ?FL_NONE). flags([$#|Fmt], Fl) -> flags(Fmt, ?SET_FLAG(Fl, ?FL_H)); flags([$0|Fmt], Fl) -> flags(Fmt, ?SET_FLAG(Fl, ?FL_Z)); flags([$-|Fmt], Fl) -> flags(Fmt, ?SET_FLAG(Fl, ?FL_M)); flags([$\s|Fmt], Fl) -> flags(Fmt, ?SET_FLAG(Fl, ?FL_S)); flags([$+|Fmt], Fl) -> flags(Fmt, ?SET_FLAG(Fl, ?FL_P)); flags(Fmt, Fl) -> {Fl,Fmt}. field_width(Fmt) -> %% io:format("fv ~s\n", [Fmt]), field_value(Fmt). precision([$.|Fmt]) -> field_value(Fmt); precision(Fmt) -> {none,Fmt}. collect_cc([C|Fmt]) -> {C,Fmt}; collect_cc([]) -> {none,[]}. field_value([C|_]=Fmt) when ?DIGIT(C) -> field_value(Fmt, 0); field_value(Fmt) -> {none,Fmt}. field_value([C|Fmt], F) when ?DIGIT(C) -> field_value(Fmt, 10*F + (C - $0)); field_value(Fmt, F) -> {F,Fmt}. %% build({Conversion,Flags,FieldWidth,Precision}, Args) -> {Out,Args}. %% Build a string from the conversion specification. %% Implemented conversions are d,i o,u,x,X e,E f,F g,G c s %. %% No length modifiers, h L l, no conversions n p S C allowed. %% Integer formats. build({$c,Fl,Fw,_P}, [A|As], St) -> N = luerl_lib:arg_to_integer(A), C = N band 255, {adjust_str([C], Fl, Fw),As,St}; build({Conv,Fl,Fw,P}, [A|As], St0) when Conv =:= $d ; Conv =:= $i -> {S,St1} = format_decimal(Fl, Fw, P, A, St0), {S,As,St1}; build({$u,Fl,Fw,P}, [A|As], St0) -> {S,St1} = format_unsigned(Fl, Fw, P, A, St0), {S,As,St1}; build({$o,Fl,Fw,P}, [A|As], St0) -> {S,St1} = format_octal(Fl, Fw, P, A, St0), {S,As,St1}; build({$x,Fl,Fw,P}, [A|As], St0) -> {S,St1} = format_hex(Fl, Fw, P, A, St0), {S,As,St1}; build({$X,Fl,Fw,P}, [A|As], St0) -> {S,St1} = format_HEX(Fl, Fw, P, A, St0), {S,As,St1}; %% Float formats. build({$e,Fl,Fw,P}, [A|As], St) -> {format_e_float(Fl, Fw, P, A),As,St}; build({$E,Fl,Fw,P}, [A|As], St) -> {format_e_float(Fl, Fw, P, A),As,St}; build({$f,Fl,Fw,P}, [A|As], St) -> {format_f_float(Fl, Fw, P, A),As,St}; build({$F,Fl,Fw,P}, [A|As], St) -> {format_f_float(Fl, Fw, P, A),As,St}; build({$g,Fl,Fw,P}, [A|As], St) -> {format_g_float(Fl, Fw, P, A),As,St}; build({$G,Fl,Fw,P}, [A|As], St) -> {format_g_float(Fl, Fw, P, A),As,St}; %% %p build({$q,Fl,Fw,P}, [A|As], St0) -> {S,St1} = format_q(Fl, Fw, P, A, St0), {S,As,St1}; build({$s,Fl,Fw,P}, [A|As], St0) -> {S,St1} = format_s(Fl, Fw, P, A, St0), {S,As,St1}; % Literal % format. build({$%,?FL_NONE,none,none}, As, St) -> %No flags, field or precision! {"%",As,St}. %% format_decimal(Flags, Field, Precision, Argument, State) -> {String,State}. %% format_octal(Flags, Field, Precision, Argument, State) -> {String,State}. %% format_hex(Flags, Field, Precision, Argument, State) -> {String,State}. %% format_HEX(Flags, Field, Precision, Argument, State) -> {String,State}. %% format_unsigned(Flags, Field, Precision, Argument, State) -> {String,State}. %% Print integer Number with base Base. This is a bit messy as we are %% following string.format handling. Could actually generate any %% error here as the error will be caught in the string.format %% call. But to be safe. format_decimal(Fl, _F, _P, A, St) when ?FLAG_SET(Fl, ?FL_H) -> badarg_error(format, ['d',A], St); %Could just generate any error format_decimal(Fl, F, P, A, St) -> I = luerl_lib:arg_to_integer(A), Str = integer_to_list(abs(I), 10), {format_integer(Fl, F, P, I, "", Str),St}. format_octal(Fl, _F, _P, A, St) when ?FLAG_SET(Fl, ?FL_S) -> badarg_error(format, ['o',A], St); %Could just generate any error format_octal(Fl, F, P, A, St) -> I = luerl_lib:arg_to_integer(A), Str = integer_to_list(abs(I), 8), {format_integer(Fl, F, P, I, "0", Str),St}. format_hex(Fl, F, P, A, St) -> I = luerl_lib:arg_to_integer(A), Str = lists:flatten(io_lib:fwrite("~.16b", [abs(I)])), {format_integer(Fl, F, P, I, "0x", Str),St}. format_HEX(Fl, F, P, A, St) -> I = luerl_lib:arg_to_integer(A), Str = lists:flatten(io_lib:fwrite("~.16B", [abs(I)])), {format_integer(Fl, F, P, I, "0X", Str),St}. format_unsigned(Fl, _F, _P, A, St) when ?FLAG_SET(Fl, ?FL_H bor ?FL_S bor ?FL_P) -> badarg_error(format, ['u',A], St); format_unsigned(Fl, F, P, A, St) -> %% We have to make the number always positive so we are assuming %% 124 bit integers which matches Lua 5.3. N = luerl_lib:arg_to_integer(A), I = if N >= 0 -> N; true -> N band 16#FFFFFFFFFFFFFFFF end, Str = integer_to_list(I), {format_integer(Fl, F, P, I, Str),St}. %% format_integer(Flag, Field, Precision, Number, String) -> String. %% format_integer(Flag, Field, Precision, Number, Prefix, String) -> String. %% Do the actual formatting of integers after the checking. format_integer(Fl, F, P, N, Str) -> format_integer(Fl, F, P, N, "", Str). format_integer(Fl, F, P, N, Prefix, Str0) -> %% The # says add the prefix. Str1 = if ?FLAG_SET(Fl, ?FL_H) -> Prefix ++ Str0; true -> Str0 end, Sign = sign(Fl, N), if P =/= none -> Str2 = Sign ++ lists:flatten(adjust_str(Str1, ?FL_Z, P)), adjust_str(Str2, (Fl band ?FL_M), F); ?FLAG_SET(Fl, ?FL_M) -> Str2 = Sign ++ Str1, adjust_str(Str2, Fl, F); ?FLAG_SET(Fl, ?FL_Z) andalso F =/= none -> Str2 = adjust_str(Str1, ?FL_Z, F-length(Sign)), Sign ++ Str2; true -> Str2 = Sign ++ Str1, adjust_str(Str2, Fl, F) end. %% format_e_float(Flags, Field, Precision, Argument) -> String. %% format_f_float(Flags, Field, Precision, Argument) -> String. %% format_g_float(Flags, Field, Precision, Argument) -> String. %% Print float Argument in e/f/g format. format_e_float(Fl, F, P, A) -> format_float(Fl, F, e_float_precision(P), "~.*e", A). format_f_float(Fl, F, P, A) -> format_float(Fl, F, f_float_precision(P), "~.*f", A). format_g_float(Fl, F, P, A) -> format_float(Fl, F, g_float_precision(P), "~.*g", A). %% format_float(Flag, Field, Precision, Format, Argument) -> String format_float(Fl, F, P, Format, A) -> N = luerl_lib:arg_to_float(A), Str0 = lists:flatten(io_lib:format(Format, [P,abs(N)])), Sign = sign(Fl, N), if ?FLAG_SET(Fl, ?FL_M) -> Str1 = Sign ++ Str0, adjust_str(Str1, Fl, F); ?FLAG_SET(Fl, ?FL_Z) andalso (F =/= none) -> Str1 = adjust_str(Str0, ?FL_Z, F-length(Sign)), Sign ++ Str1; true -> Str1 = Sign ++ Str0, adjust_str(Str1, Fl, F) end. e_float_precision(none) -> 7; e_float_precision(P) -> P+1. f_float_precision(none) -> 6; f_float_precision(P) -> P. g_float_precision(none) -> 6; g_float_precision(P) -> P. %% sign(Flags, Number) -> SignString. sign(_, N) when N < 0 -> "-"; %Always sign when N<0 sign(Fl, _) -> if ?FLAG_SET(Fl, ?FL_P) -> "+"; %+ flag has priority ?FLAG_SET(Fl, ?FL_S) -> " "; true -> "" end. %% format_s(Flags, Field, Precision, Argument, State) -> {String,State}. format_s(Fl, Fw, P, A, St0) -> {S0,St1} = luerl_lib:tostring(A, St0), %% If any field and there is a 0 in the string then we have an error. %% Lua wants this. Fargs = (Fl =/= ?FL_NONE) orelse (Fw =/= none) orelse (P =/= none), case Fargs andalso binary:match(S0, <<0>>) =/= nomatch of true -> badarg_error(format, ['s',A], St1); false -> false end, S1 = trim_bin(S0, P), S2 = adjust_bin(S1, Fl, Fw), {S2,St1}. trim_bin(Bin, Prec) when is_integer(Prec), byte_size(Bin) > Prec -> binary:part(Bin, 0, Prec); trim_bin(Bin, _) -> Bin. %% adjust_bin(Binary, Flags, Field) -> iolist(). %% adjust_str(String, Flags, Field) -> iolist(). adjust_bin(Bin, ?FL_NONE, none) -> Bin; adjust_bin(Bin, Fl, F) when is_integer(F), byte_size(Bin) < F -> Size = byte_size(Bin), Padding = lists:duplicate(F-Size, pad_char(Fl, F)), if ?FLAG_SET(Fl, ?FL_M) -> [Bin,Padding]; true -> [Padding,Bin] end; adjust_bin(Bin, _, _) -> Bin. adjust_str(Str, ?FL_NONE, none) -> Str; adjust_str(Str, Fl, F) when is_integer(F), length(Str) < F -> Size = length(Str), Padding = lists:duplicate(F-Size, pad_char(Fl, F)), if ?FLAG_SET(Fl, ?FL_M) -> [Str,Padding]; true -> [Padding,Str] end; adjust_str(Str, _, _) -> Str. %% pad_char(Flags, Field) -> Char. pad_char(Fl, F) -> if ?FLAG_SET(Fl, ?FL_M) -> $\s; %'-' forces padding to " " ?FLAG_SET(Fl, ?FL_Z), F =/= none -> $0; true -> $\s end. %% format_q(Fl, Fw, P, Arg, State) -> {Striing,State}. %% Could actually generate any error here as the error will be caught %% in the string.format call. But to be safe. format_q(?FL_NONE, none, none, Arg, St) -> S = format_q(Arg, St), {S,St}; format_q(_Fl, _Fw, _P, Arg, St) -> badarg_error(format, ['q',Arg], St). %Could just generate any error %% format_q(Arg, State) -> String. %% Build the quote for the right argument types. format_q(S0, _St) when is_binary(S0) -> S1 = format_q_string(S0), [$",S1,$"]; format_q(I, _St) when is_integer(I) -> integer_to_binary(I); format_q(I, _St) when is_float(I) -> float_to_binary(I); format_q(nil, _St) -> <<"nil">>; format_q(true, _St) -> <<"true">>; format_q(false, _St) -> <<"false">>; format_q(Arg, St) -> badarg_error(format, ['q',Arg], St). %% format_q_string(String) -> String. %% Build the quoted string. format_q_string(<<$\\,Q/binary>>) -> [$\\,$\\|format_q_string(Q)]; format_q_string(<<$\",Q/binary>>) -> [$\\,$\"|format_q_string(Q)]; format_q_string(<<$\n,Q/binary>>) -> [$\\,$\n|format_q_string(Q)]; %% Control characters. format_q_string(<>) when C1 >= 0, C1 =< 31 -> format_q_dec(C1, Q); format_q_string(<>) when C1 >= 127, C1 =< 159 -> format_q_dec(C1, Q); format_q_string(<<173,Q/binary>>) -> %% Don't ask me why we do this for 173. [io_lib:format("\\173",[])|format_q_string(Q)]; %% And the rest. format_q_string(<>) -> [C|format_q_string(Q)]; format_q_string(<<>>) -> []. format_q_dec(C1, <<>> = Q) -> [io_lib:format("\\~w", [C1])|format_q_string(Q)]; format_q_dec(C1, <> = Q) when not ?DIGIT(C2) -> [io_lib:format("\\~w", [C1])|format_q_string(Q)]; format_q_dec(C1, Q) -> [io_lib:format("\\~.3.0w",[C1])|format_q_string(Q)]. rvirding-luerl-772b25e/src/luerl_comp_vars.erl0000664000232200023220000003222315114130670022055 0ustar debalancedebalance%% Copyright (c) 2013 Robert Virding %% %% Licensed under the Apache License, Version 2.0 (the "License"); %% you may not use this file except in compliance with the License. %% You may obtain a copy of the License at %% %% http://www.apache.org/licenses/LICENSE-2.0 %% %% Unless required by applicable law or agreed to in writing, software %% distributed under the License is distributed on an "AS IS" BASIS, %% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. %% See the License for the specific language governing permissions and %% limitations under the License. %% File : luerl_comp_vars.erl %% Author : Robert Virding %% Purpose : A basic LUA 5.3 compiler for Luerl. %% Does variable and stack analysis in the compiler -module(luerl_comp_vars). -include("luerl.hrl"). -include("luerl_comp.hrl"). ?MODULEDOC(false). -export([chunk/2]). -import(ordsets, [add_element/2,del_element/2,is_element/2, union/1,union/2,subtract/2,intersection/2]). %% chunk(Code, CompInfo) -> {ok,Code}. chunk(Code0, #cinfo{opts=Opts}=_Ci) -> %% No local state here! {Code1,_,_,nul} = functiondef(Code0, [], nul), luerl_comp:debug_print(Opts, "cv: ~p\n", [Code1]), {ok,Code1}. %% stmts(Stmts, VarData, State) -> %% {Stmts,NewVarData,State}. %% Main problem here is to calculate local/free/used variables in the %% right order. Must do everything going forwards. stmts([S0|Ss0], Vars0, St0) -> {S1,New,Used,Fused,St1} = stmt(S0, nul, St0), Vars1 = update_vars(Vars0, New, Used, Fused), %% io:format("ss1: ~p\n", [Vars0]), %% io:format("ss1> ~p\n", [{New,Used,Fused}]), %% io:format("ss1> ~p\n", [Vars1]), {Ss1,Vars2,St2} = stmts(Ss0, Vars1, St1), {[S1|Ss1],Vars2,St2}; stmts([], Vars, St) -> {[],Vars,St}. update_vars(#vars{local=Lo,free=Fr,used=Us,fused=Fu}, New, Used, Fused) -> Aused = union(Used, Fused), %All used Free = subtract(Aused, Lo), #vars{local=union(New, Lo), free=union(Free, Fr), used=union(Used, Us), fused=union(Fused, Fu)}. %% stmt(Stmt, LocalVars, State) -> {Stmt,NewVars,UsedVars,FusedVars,State}. stmt(#assign_stmt{}=A, Loc, St) -> assign_stmt(A, Loc, St); stmt(#call_stmt{}=C, Loc, St) -> call_stmt(C, Loc, St); stmt(#return_stmt{}=R, Loc, St) -> return_stmt(R, Loc, St); stmt(#break_stmt{}=B, _, St) -> {B,[],[],[],St}; stmt(#block_stmt{}=B, Loc, St) -> block_stmt(B, Loc, St); stmt(#while_stmt{}=W, Loc, St) -> while_stmt(W, Loc, St); stmt(#repeat_stmt{}=R, Loc, St) -> repeat_stmt(R, Loc, St); stmt(#if_stmt{}=If, Loc, St) -> if_stmt(If, Loc, St); stmt(#nfor_stmt{}=For, Loc, St) -> numfor_stmt(For, Loc, St); stmt(#gfor_stmt{}=For, Loc, St) -> genfor_stmt(For, Loc, St); stmt(#local_assign_stmt{}=L, Loc, St) -> local_assign_stmt(L, Loc, St); stmt(#local_fdef_stmt{}=L, Loc, St) -> local_fdef_stmt(L, Loc, St); stmt(#expr_stmt{}=E, Loc, St) -> %Expressions "statement" expr_stmt(E, Loc, St). %% assign_stmt(Assign, LocalVars, State) -> %% {Assign,NewVars,UsedVars,FusedVars,State}. assign_stmt(#assign_stmt{vars=Vs0,exps=Es0}=A, Loc, St0) -> {Vs1,Vused,Vfused,St1} = assign_loop(Vs0, Loc, St0), {Es1,Eused,Efused,St2} = explist(Es0, Loc, St1), Used = union(Vused, Eused), Fused = union(Vfused, Efused), {A#assign_stmt{vars=Vs1,exps=Es1},[],Used,Fused,St2}. assign_loop([V0|Vs0], Loc, St0) -> {V1,Vused,Vfused,St1} = var(V0, Loc, St0), {Vs1,Vsused,Vsfused,St2} = assign_loop(Vs0, Loc, St1), Used = union(Vused, Vsused), Fused = union(Vfused, Vsfused), {[V1|Vs1],Used,Fused,St2}; assign_loop([], _, St) -> {[],[],[],St}. var(#dot{exp=Exp0,rest=Rest0}=D, Loc, St0) -> {Exp1,Eused,Efused,St1} = prefixexp_first(Exp0, Loc, St0), {Rest1,Rused,Rfused,St2} = var_rest(Rest0, Loc, St1), Used = union(Eused, Rused), Fused = union(Efused, Rfused), {D#dot{exp=Exp1,rest=Rest1},Used,Fused,St2}; var(#var{name=N}=V, _, St) -> {V,[N],[],St}. var_rest(#dot{exp=Exp0,rest=Rest0}=D, Loc, St0) -> {Exp1,Eused,Efused,St1} = prefixexp_element(Exp0, Loc, St0), {Rest1,Rused,Rfused,St2} = var_rest(Rest0, Loc, St1), Used = union(Eused, Rused), Fused = union(Efused, Rfused), {D#dot{exp=Exp1,rest=Rest1},Used,Fused,St2}; var_rest(Exp, Loc, St) -> var_last(Exp, Loc, St). var_last(#key{key=Exp0}=K, Loc, St0) -> {Exp1,Used,Fused,St1} = exp(Exp0, Loc, St0), {K#key{key=Exp1},Used,Fused,St1}. %% call_stmt(Call, LocalVars, State) -> %% {Call,NewVars,UsedVars,FusedVars,State}. call_stmt(#call_stmt{call=Exp0}=C, Loc, St0) -> {Exp1,Used,Fused,St1} = exp(Exp0, Loc, St0), {C#call_stmt{call=Exp1},[],Used,Fused,St1}. %% return_stmt(Return, LocalVars, State) -> %% {Return,NewVars,UsedVars,FusedVars,State}. return_stmt(#return_stmt{exps=Es0}=R, Loc, St0) -> {Es1,Used,Fused,St1} = explist(Es0, Loc, St0), {R#return_stmt{exps=Es1},[],Used,Fused,St1}. %% block_stmt(Block, LocalVars, State) -> %% {Block,NewVars,UsedVars,FusedVars,State}. block_stmt(#block_stmt{body=Ss0}=B, _, St0) -> Vars0 = #vars{local=[],free=[],used=[],fused=[]}, {Ss1,Vars1,St1} = stmts(Ss0, Vars0, St0), %% Be careful what we export, adjust Used and Fused for locals. #vars{local=Bloc,used=Bused,fused=Bfused} = Vars1, Used = subtract(Bused, Bloc), Fused = subtract(Bfused, Bloc), {B#block_stmt{body=Ss1,vars=Vars1},[],Used,Fused,St1}. %% do_block(Block, State) -> {Block,UsedVars,FusedVars,State}. %% do_block(Block, LocalVars, State) -> {Block,UsedVars,FusedVars,State}. %% Do_block never returns external new variables as it never exports %% variables. do_block(B, St) -> do_block(B, [], St). do_block(#block{body=Ss0}=B, Loc, St0) -> Vars0 = #vars{local=Loc,free=[],used=[],fused=[]}, {Ss1,Vars1,St1} = stmts(Ss0, Vars0, St0), %% Be careful what we export, adjust Used and Fused for locals. #vars{local=Bloc,used=Bused,fused=Bfused} = Vars1, Used = subtract(Bused, Bloc), Fused = subtract(Bfused, Bloc), {B#block{body=Ss1,vars=Vars1},Used,Fused,St1}. %% while_stmt(While, LocalVars, State) -> %% {While,NewVars,UsedVars,FusedVars,State}. %% While_stmt never returns external new variables. The test %% expression is done in the context of the surrounding block. while_stmt(#while_stmt{exp=E0,body=B0}=W, Loc, St0) -> {E1,Eused,Efused,St1} = exp(E0, Loc, St0), {B1,Bused,Bfused,St2} = do_block(B0, St1), Used = union(Eused, Bused), Fused = union(Efused, Bfused), {W#while_stmt{exp=E1,body=B1},[],Used,Fused,St2}. %% repeat_stmt(Repeat, LocalVars, State) -> %% {Repeat,NewVars,UsedVars,FusedVars,State}. %% Repeat_stmt never returns external new variables. The test %% expression is done in the context of the repeat block and is %% already inside the block. repeat_stmt(#repeat_stmt{body=B0}=R, _, St0) -> {B1,Used,Fused,St1} = do_block(B0, St0), {R#repeat_stmt{body=B1},[],Used,Fused,St1}. %% if_stmt(If, LocalVars, State) -> {If,NewVars,FreeVars,State}. %% The block info includes anything from the test expressions even %% though we keep them separate. if_stmt(#if_stmt{tests=Ts0,else_block=E0}=If, Loc, St0) -> {Ts1,Tused,Tfused,St1} = if_tests(Ts0, Loc, St0), {E1,Eused,Efused,St2} = do_block(E0, St1), Used = union(Tused, Eused), Fused = union(Tfused, Efused), {If#if_stmt{tests=Ts1,else_block=E1},[],Used,Fused,St2}. if_tests([{E0,B0}|Ts0], Loc, St0) -> {E1,Eused,Efused,St1} = exp(E0, Loc, St0), {B1,Bused,Bfused,St2} = do_block(B0, St1), {Ts1,Tsused,Tsfused,St3} = if_tests(Ts0, Loc, St2), Used = union([Eused,Bused,Tsused]), Fused = union([Efused,Bfused,Tsfused]), {[{E1,B1}|Ts1],Used,Fused,St3}; if_tests([], _, St) -> {[],[],[],St}. %% numfor_stmt(For, LocalVars, State) -> %% {For,NewVars,UsedVars,FusedVars,State}. numfor_stmt(#nfor_stmt{var=#var{name=N},init=I0,limit=L0,step=S0,body=B0}=For, Loc, St0) -> {[I1,L1,S1],Esused,Esfused,St1} = explist([I0,L0,S0], Loc, St0), {B1,Bused,Bfused,St2} = do_block(B0, [N], St1), %% Be careful what we export, adjust Used and Fused for N. Used = union(Esused, del_element(N, Bused)), Fused = union(Esfused, del_element(N, Bfused)), {For#nfor_stmt{init=I1,limit=L1,step=S1,body=B1},[],Used,Fused,St2}. %% genfor_stmt(For, LocalVars, State) -> {For,NewVars,FreeVars,State}. genfor_stmt(#gfor_stmt{vars=Vs,gens=Gs0,body=B0}=For, Loc, St0) -> {Gs1,Gused,Gfused,St1} = explist(Gs0, Loc, St0), Ns = lists:foldl(fun (#var{name=N}, Ns) -> add_element(N, Ns) end, [], Vs), {B1,Bused,Bfused,St2} = do_block(B0, Ns, St1), %% Be careful what we export, adjust Used and Fused for Ns. Used = union(Gused, subtract(Bused, Ns)), Fused = union(Gfused, subtract(Bfused, Ns)), {For#gfor_stmt{gens=Gs1,body=B1},[],Used,Fused,St2}. %% local_assign_stmt(Local, LocalVars, State) -> {Local,NewVars,FreeVars,State}. local_assign_stmt(#local_assign_stmt{vars=Vs,exps=Es0}=L, Loc, St0) -> {Es1,Used,Fused,St1} = explist(Es0, Loc, St0), New = lists:foldl(fun (#var{name=N}, Ns) -> add_element(N, Ns) end, [], Vs), {L#local_assign_stmt{exps=Es1},New,Used,Fused,St1}. %% local_fdef_stmt(Local, LocalVars, State) -> %% {Local,NewVars,FreeVars,UsedVars,State}. %% We explicitly handle used variables here as we want the function %% name to be included in Used in recursive function calls. local_fdef_stmt(#local_fdef_stmt{var=#var{name=N},func=F0}=L, _, St0) -> {F1,Used,Fused,St1} = functiondef(F0, nul, St0), New = [N], {L#local_fdef_stmt{func=F1},New,Used,Fused,St1}. %% exp_stmt(Expr, LocalVars, State) -> %% {Expr,NewVars,UsedVars,FusedVars,State}. %% This will return a single value. expr_stmt(#expr_stmt{exp=Exp0}=E, Loc, St0) -> {Exp1,Used,Fused,St1} = exp(Exp0, Loc, St0), {E#expr_stmt{exp=Exp1},[],Used,Fused,St1}. %% explist(Exprs, LocalVars, State) -> {Exprs,UsedVars,FusedVars,State}. %% exp(Expr, LocalVars, State) -> {Expr,UsedVars,FusedVars,State}. %% prefixexp(Expr, LocalVars, State) -> {Expr,UsedVars,FusedVars,State}. %% An expression can never create new local variables. explist([E0|Es0], Loc, St0) -> {E1,Eused,Efused,St1} = exp(E0, Loc, St0), {Es1,Esused,Esfused,St2} = explist(Es0, Loc, St1), Used = union(Eused, Esused), Fused = union(Efused, Esfused), {[E1|Es1],Used,Fused,St2}; explist([], _, St) -> {[],[],[],St}. %No expressions at all exp(#lit{}=L, _, St) -> {L,[],[],St}; %Nothing to do exp(#fdef{}=F, _, St) -> functiondef(F, nul, St); exp(#op{args=Es0}=Op, Loc, St0) -> {Es1,Used,Fused,St1} = explist(Es0, Loc, St0), {Op#op{args=Es1},Used,Fused,St1}; exp(#tabcon{fields=Fs0}=T, Loc, St0) -> {Fs1,Used,Fused,St1} = tableconstructor(Fs0, Loc, St0), {T#tabcon{fields=Fs1},Used,Fused,St1}; exp(E, Loc, St) -> prefixexp(E, Loc, St). prefixexp(#dot{exp=Exp0,rest=Rest0}=D, Loc, St0) -> {Exp1,Eused,Efused,St1} = prefixexp_first(Exp0, Loc, St0), {Rest1,Rused,Rfused,St2} = prefixexp_rest(Rest0, Loc, St1), Used = union(Eused, Rused), Fused = union(Efused, Rfused), {D#dot{exp=Exp1,rest=Rest1},Used,Fused,St2}; prefixexp(Exp, Loc, St) -> prefixexp_first(Exp, Loc, St). prefixexp_first(#single{exp=E0}=S, Loc, St0) -> {E1,Used,Fused,St1} = exp(E0, Loc, St0), {S#single{exp=E1},Used,Fused,St1}; prefixexp_first(#var{name=N}=V, _, St) -> {V,[N],[],St}. prefixexp_rest(#dot{exp=Exp0,rest=Rest0}=D, Loc, St0) -> {Exp1,Eused,Efused,St1} = prefixexp_element(Exp0, Loc, St0), {Rest1,Rused,Rfused,St2} = prefixexp_rest(Rest0, Loc, St1), Used = union(Eused, Rused), Fused = union(Efused, Rfused), {D#dot{exp=Exp1,rest=Rest1},Used,Fused,St2}; prefixexp_rest(Exp, Loc, St) -> prefixexp_element(Exp, Loc, St). prefixexp_element(#key{key=E0}=K, Loc, St0) -> {E1,Used,Fused,St1} = exp(E0, Loc, St0), {K#key{key=E1},Used,Fused,St1}; prefixexp_element(#fcall{args=As0}=F, Loc, St0) -> {As1,Used,Fused,St1} = explist(As0, Loc, St0), {F#fcall{args=As1},Used,Fused,St1}; prefixexp_element(#mcall{meth=#lit{val=N},args=As0}=M, Loc, St0) -> {As1,Used,Fused,St1} = explist(As0, Loc, St0), {M#mcall{args=As1},add_element(N, Used),Fused,St1}. %% functiondef(Func, LocalVars, State) -> {Func,UsedVars,FusedVars,State}. %% All the variables "used" in the function which are not local %% become "fused" externally. functiondef(#fdef{pars=Ps,body=Ss0}=F, _, St0) -> Loc0 = lists:foldl(fun (#var{name=N}, Vs) -> add_element(N, Vs); (_, Vs) -> Vs end, [], Ps), Vars0 = #vars{local=Loc0,free=[],used=[],fused=[]}, {Ss1,Vars1,St1} = stmts(Ss0, Vars0, St0), %% Make all free variables "fused" in outside block. {F#fdef{body=Ss1,vars=Vars1},[],Vars1#vars.free,St1}. %% tableconstructor(Fields, LocalVars, State) -> %% {Fields,UsedVars,FusedVars,State}. tableconstructor(Fs0, Loc, St0) -> Fun = fun (#efield{val=V0}=F, {Used0,Fused0,S0}) -> {V1,Vused,Vfused,S1} = exp(V0, Loc, S0), Used1 = union(Vused, Used0), Fused1 = union(Vfused, Fused0), {F#efield{val=V1},{Used1,Fused1,S1}}; (#kfield{key=K0,val=V0}=F, {Used0,Fused0,S0}) -> {K1,Kused,Kfused,S1} = exp(K0, Loc, S0), {V1,Vused,Vfused,S2} = exp(V0, Loc, S1), Used1 = union([Kused,Vused,Used0]), Fused1 = union([Kfused,Vfused,Fused0]), {F#kfield{key=K1,val=V1},{Used1,Fused1,S2}} end, {Fs1,{Used,Fused,St1}} = lists:mapfoldl(Fun, {[],[],St0}, Fs0), {Fs1,Used,Fused,St1}. rvirding-luerl-772b25e/src/luerl.app.src0000664000232200023220000000226415114130670020572 0ustar debalancedebalance%% -*- mode: erlang; indent-tabs-mode: nil -*- %% Copyright (c) 2013-2024 Robert Virding %% %% Licensed under the Apache License, Version 2.0 (the "License"); %% you may not use this file except in compliance with the License. %% You may obtain a copy of the License at %% %% http://www.apache.org/licenses/LICENSE-2.0 %% %% Unless required by applicable law or agreed to in writing, software %% distributed under the License is distributed on an "AS IS" BASIS, %% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. %% See the License for the specific language governing permissions and %% limitations under the License. {application, luerl, [{description, "Luerl - an implementation of Lua on Erlang"}, {vsn, "1.5.0"}, {modules, []}, {registered, []}, {applications, [kernel, stdlib]}, {env, []}, {mod, {luerl_app, []}}, %% Project metadata {licenses, ["Apache-2.0"]}, {links, [{"Github", "https://github.com/rvirding/luerl"}]}, %% This is used for hex packages. {files, ["README.md", "LICENSE", "VERSION", "src", "doc", "ebin/luerl.app", "include", "rebar.*", "*akefile", "*.escript"]}, {exclude_files, ["priv/images/*"]} ]}. rvirding-luerl-772b25e/src/luerl_scan.xrl0000664000232200023220000004327415114130670021043 0ustar debalancedebalance%% Copyright (c) 2013-2025 Robert Virding %% -*- mode: erlang; indent-tabs-mode: nil -*- %% %% Licensed under the Apache License, Version 2.0 (the "License"); %% you may not use this file except in compliance with the License. %% You may obtain a copy of the License at %% %% http://www.apache.org/licenses/LICENSE-2.0 %% %% Unless required by applicable law or agreed to in writing, software %% distributed under the License is distributed on an "AS IS" BASIS, %% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. %% See the License for the specific language governing permissions and %% limitations under the License. %% File : luerl_scan.xrl %% Author : Robert Virding %% Purpose : Token definitions for LUA. Definitions. D = [0-9] H = [0-9A-Fa-f] U = [A-Z] L = [a-z] NAME = ({U}|{L}|_|{D}) SNAME = ({U}|{L}|_) Rules. %% Names/identifiers. ({U}|{L}|_)({U}|{L}|_|{D})* : name_token(TokenChars, TokenLine). %% Numbers, we parse integers and floats in one go as they can %% interact with each other. %% Hexadecimal numbers, we have separate rule to ensure we don't have %% just a '.'. NOTE THESE MUST COME FIRST TO CATCH 0[xX]!!!! %% %% 0[xX]{H}+\.?{H}+([pP][-+]?{D}+)?{NAME}* : %% 0[xX]{H}+\.?{H}*([pP][-+]?{D}+)?{NAME}* : %% %% 0[xX]{H}*\.{H}*([pP][-+]?{D}+)?{NAME}* : 0[xX]{H}*\.?{H}*([pP][-+]?{D}*)?{NAME}* : %% io:format("h2 ~p\n", [TokenChars]), hex_number_token(TokenChars, TokenLine). %% Decimal numbers, we separate rules to ensure we don't have just a '.'. %% Both integers and floats are handled here. %% %% {D}*\.?{D}*([eE][-+]?{D}+)?{NAME}* %% (({D}+\.?{D*})|(\.{D}+))([eE][-+]?{D}+)?{NAME}* : \.{D}+([eE][-+]?{D}+)?{NAME}* : %% io:format("d1 ~p\n", [TokenChars]), decimal_number_token(TokenChars, TokenLine). {D}+\.?{D}*([eE][-+]?{D}+)?{NAME}* : %% io:format("d2 ~p\n", [TokenChars]), decimal_number_token(TokenChars, TokenLine). %% Strings. %% Handle the illegal newlines in string_token. \"(\\.|\\\n|[^"\\])*\" : string_token(TokenChars, TokenLen, TokenLine). \'(\\.|\\\n|[^'\\])*\' : string_token(TokenChars, TokenLen, TokenLine). %% Handle multi line strings, [[ ]], [=[ ]=], [==[ ]==] %% This gets a bit tedious as we have to each case separately. \[\[([^]]|\][^]])*\]\] : long_string_token(TokenChars, TokenLen, 2, TokenLine). \[=\[([^]]|\](=[^]]|[^=]))*\]=\] : long_string_token(TokenChars, TokenLen, 3, TokenLine). \[==\[([^]]|\](==[^]]|=[^=]|[^=]))*\]==\] : long_string_token(TokenChars, TokenLen, 4, TokenLine). \[===\[([^]]|\](===[^]]|==[^=]|=[^=]|[^=]))*\]===\] : long_string_token(TokenChars, TokenLen, 5, TokenLine). %% \[==\[([^]]|\]==[^]]|\]=[^=]|\][^=])*\]==\] : %% Other known tokens. \+ : {token,{'+',TokenLine}}. \- : {token,{'-',TokenLine}}. \* : {token,{'*',TokenLine}}. \/ : {token,{'/',TokenLine}}. \// : {token,{'//',TokenLine}}. \% : {token,{'%',TokenLine}}. \^ : {token,{'^',TokenLine}}. \& : {token,{'&',TokenLine}}. \| : {token,{'|',TokenLine}}. \~ : {token,{'~',TokenLine}}. \>> : {token,{'>>',TokenLine}}. \<< : {token,{'<<',TokenLine}}. \# : {token,{'#',TokenLine}}. == : {token,{'==',TokenLine}}. ~= : {token,{'~=',TokenLine}}. <= : {token,{'<=',TokenLine}}. >= : {token,{'>=',TokenLine}}. < : {token,{'<',TokenLine}}. > : {token,{'>',TokenLine}}. = : {token,{'=',TokenLine}}. \( : {token,{'(',TokenLine}}. \) : {token,{')',TokenLine}}. \{ : {token,{'{',TokenLine}}. \} : {token,{'}',TokenLine}}. \[ : {token,{'[',TokenLine}}. \] : {token,{']',TokenLine}}. :: : {token,{'::',TokenLine}}. ; : {token,{';',TokenLine}}. : : {token,{':',TokenLine}}. , : {token,{',',TokenLine}}. \. : {token,{'.',TokenLine}}. \.\. : {token,{'..',TokenLine}}. \.\.\. : {token,{'...',TokenLine}}. [\011-\015\s\240]+ : skip_token. %Mirror Lua here %% Comments, either -- or --[[ ]]. %%--(\[([^[\n].*|\[\n|[^[\n].*|\n) : skip_token. --\n : skip_token. --[^[\n].* : skip_token. --\[\n : skip_token. --\[[^[\n].* : skip_token. %% Comment --ab ... yz --ab([^y]|y[^z])*yz --\[\[([^]]|\][^]])*\]\] : skip_token. --\[\[([^]]|\][^]])* : {error,"unfinished long comment"}. %% Catch other illegal tokens. . : illegal_token(TokenChars, TokenLine). Erlang code. -include("luerl.hrl"). ?MODULEDOC(false). -export([is_keyword/1]). -export([string_chars/1,chars/1]). %% Luerl definitions of these types. -define(WHITE_SPACE(C), (C >= $\000 andalso C =< $\s)). -define(ASCII(C), (C >= 0 andalso C =< 127)). -define(DIGIT(C), (C >= $0 andalso C =< $9)). -define(HEX(C), (C >= $A andalso C =< $F orelse C >= $a andalso C =< $f orelse ?DIGIT(C))). -define(CHAR(C), (C >= O andalso C < 16#110000)). -define(UNICODE(C), (is_integer(C) andalso (C >= 0 andalso C < 16#D800 orelse C > 16#DFFF andalso C < 16#FFFE orelse C > 16#FFFF andalso C =< 16#10FFFF))). -define(UNI255(C), (is_integer(C) andalso 0 =< C andalso C =< 16#ff)). %% illegal_token(Chars, Line) -> {error,E}. %% Generate a more Lua compatible error message. illegal_token(Chars, _Line) -> {error,"syntax error near '" ++ Chars ++ "'"}. %% name_token(Chars, Line) -> %% {token,{'NAME',Line,Symbol}} | {Name,Line} | {error,E}. %% Build a name from list of legal characters, else error. name_token(Cs, L) -> case catch {ok,list_to_binary(Cs)} of {ok,Name} -> case is_keyword(Name) of true -> {token,{name_string(Name),L}}; false -> {token,{'NAME',L,Name}} end; _ -> {error,"illegal name"} end. name_string(Name) -> binary_to_atom(Name, latin1). %Only latin1 in Lua %% decimal_number_token(TokenChars, TokenLine) %% {token,{'NUMERAL',TokenLine,Float}} | {error,E}. %% Build either an integer or a float from a decimal number %% string. We first collect the specific number section, then we %% create the number. This makes it easier to keep track of which %% sections we need to make Lua compliant Luerl numbers, as Lua has %% some very "specific" handling. %% %% \.{D}+([eE][-+]?{D}+)?{NAME}* : %% {D}+\.?{D}*([eE][-+]?{D}+)?{NAME}* : decimal_number_token(TokenChars, TokenLine) -> %% io:format("dnt ~p\n", [dec_number_split(TokenChars)]), Result = case dec_number_split(TokenChars) of %% If there is anything after the number sections then %% it is an error! {_,_,_,Rest} when Rest =/= [] -> error; {[],[],[],_Rest} -> error; %Nothing at all {[],[],_Ecs,_Rest} -> error; %No number data {[],".",_Ecs,_Rest} -> error; %Only "empty" fraction {_,_,[_E],_Rest} -> error; %Only "empty" exponent {Hcs,Fcs,Ecs,_Rest} -> DW = list_to_integer("0" ++ Hcs), DF = dec_number_fraction(Fcs, DW), Dnum = dec_number_exponent(Ecs, DF), {ok,Dnum} end, case Result of {ok,Number} -> {token,{'NUMERAL',TokenLine,Number}}; error -> number_token_error(TokenChars) end. number_token_error(Tcs) -> {error,"malformed number near '" ++ Tcs ++ "'"}. dec_number_split(Tcs0) -> Digit = fun (C) -> ?DIGIT(C) end, %% The whole number characters. {Hcs,Tcs1} = lists:splitwith(Digit, Tcs0), %% The fraction characters. {Fcs,Tcs2} = dec_number_split_fraction(Tcs1), %% The exponent characters. {Ecs,Rest} = dec_number_split_exponent(Tcs2), {Hcs,Fcs,Ecs,Rest}. dec_number_split_fraction([$. | Fcs0]) -> {Fcs1,Frest} = lists:splitwith(fun (C) -> ?DIGIT(C) end, Fcs0), {[$.|Fcs1],Frest}; dec_number_split_fraction(Tcs) -> {[],Tcs}. dec_number_split_exponent([P | Pcs0]) when P =:= $e ; P =:= $E -> Digit = fun (C) -> ?DIGIT(C) end, case Pcs0 of [S | Pcs1] when S =:= $+ ; S =:= $- -> {Pcs2,Rest} = lists:splitwith(Digit, Pcs1), {[P,S|Pcs2],Rest}; Pcs1 -> {Pcs2,Rest} = lists:splitwith(Digit, Pcs1), {[P|Pcs2],Rest} end; dec_number_split_exponent(Tcs) -> {[],Tcs}. dec_number_fraction(".", DW) -> float(DW); dec_number_fraction([$. | Fcs], DW) -> DW + list_to_float("0." ++ Fcs); dec_number_fraction([], DW) -> DW. dec_number_exponent([_E | Ecs], DF) -> DF * math:pow(10, list_to_integer(Ecs)); dec_number_exponent([], DF) -> DF. %% hex_number_token(TokenChars, TokenLine) %% {token,{'NUMERAL',TokenLine,Float}} | {error,E}. %% Build either an integer or a float from a hexadecimal number %% string. We first collect the specific number section, then we %% create the number. This makes it easier to keep track of which %% sections we need to make Lua compliant Luerl numbers, as Lua has %% some very "specific" handling. %% %% 0[xX]\.{H}+([pP][-+]?{D}+)?{NAME}* : %% 0[xX]{H}+\.?{H}*([pP][-+]?{D}+)?{NAME}* hex_number_token([$0,X|TokenChars], TokenLine) -> %% io:format("hnt ~p\n", [hex_number_split(TokenChars)]), Result = case hex_number_split(TokenChars) of %% If there is anything after the number sections then %% it is an error! {_,_,_,Rest} when Rest =/= [] -> error; {[],[],[],_Rest} -> error; %Nothing at all {[],[],_Ecs,_Rest} -> error; %No number data {[],".",_Ecs,_Rest} -> error; %Only "empty" fraction {_,_,[_P],_Rest} -> error; %Only "empty" exponent {Hcs,Fcs,Ecs,_Rest} -> HW = list_to_integer("0" ++ Hcs, 16), HF = hex_number_fraction(Fcs, HW), Hnum = hex_number_exponent(Ecs, HF), {ok,Hnum} end, case Result of {ok,Number} -> {token,{'NUMERAL',TokenLine,Number}}; error -> number_token_error([$0,X|TokenChars]) end. hex_number_split(Tcs0) -> Hex = fun (C) -> ?HEX(C) end, %% Digit = fun (C) -> ?DIGIT(C) end, %% The whole number characters. {Hcs,Tcs1} = lists:splitwith(Hex, Tcs0), %% The fraction characters. {Fcs,Tcs2} = hex_number_split_fraction(Tcs1), %% The exponent characters. {Ecs,Rest} = hex_number_split_exponent(Tcs2), {Hcs,Fcs,Ecs,Rest}. hex_number_split_fraction([$. | Fcs0]) -> {Fcs1,Frest} = lists:splitwith(fun (C) -> ?HEX(C) end, Fcs0), {[$.|Fcs1],Frest}; hex_number_split_fraction(Tcs) -> {[],Tcs}. hex_number_split_exponent([P | Pcs0]) when P =:= $p ; P =:= $P -> Digit = fun (C) -> ?DIGIT(C) end, case Pcs0 of [S | Pcs1] when S =:= $+ ; S =:= $- -> {Pcs2,Rest} = lists:splitwith(Digit, Pcs1), {[P,S|Pcs2],Rest}; Pcs1 -> {Pcs2,Rest} = lists:splitwith(Digit, Pcs1), {[P|Pcs2],Rest} end; hex_number_split_exponent(Tcs) -> {[],Tcs}. hex_number_fraction([$. | Fcs], HW) -> {HF,_} = hex_number_fraction(Fcs, 16.0, HW + 0.0), HF; hex_number_fraction([], HW) -> HW. hex_number_exponent([_P | Ecs], HF) -> HF * math:pow(2, list_to_integer(Ecs)); hex_number_exponent([], HF) -> HF. hex_number_fraction([C|Cs], Pow, SoFar) when C >= $0, C =< $9 -> hex_number_fraction(Cs, Pow*16.0, SoFar + (C - $0)/Pow); hex_number_fraction([C|Cs], Pow, SoFar) when C >= $a, C =< $f -> hex_number_fraction(Cs, Pow*16.0, SoFar + (C - $a + 10)/Pow); hex_number_fraction([C|Cs], Pow, SoFar) when C >= $A, C =< $F -> hex_number_fraction(Cs, Pow*16.0, SoFar + (C - $A + 10)/Pow); hex_number_fraction(Cs, _Pow, SoFar) -> {SoFar,Cs}. %% string_token(InputChars, Length, Line) -> %% {token,{'LITERALSTRING',Line,Cs}} | {error,Error}. %% Convert an input string into the corresponding string characters. %% We know that the input string is correct. string_token([Qc|Cs0], _Len, L) -> Cs1 = lists:droplast(Cs0), %Strip trailing quote %% io:format("st1 ~w ~w\n", [length(Cs1),Cs1]), try Bytes = string_chars(Cs1), %The bytes are encoded chars String = iolist_to_binary(Bytes), %% io:format("st2 ~w ~w\n", [byte_size(String),String]), {token,{'LITERALSTRING',L,String}} catch throw:{string_error,What} -> %Specific error message string_token_error(What, Qc); _:_ -> %General error message string_token_error("illegal string", Qc) end. string_token_error(What, Qc) -> {error,What ++ " near '" ++ [Qc] ++ "'"}. %% string_chars(Chars) %% chars(Chars) %% Return a list of UTF-8 encoded binaries and one byte unencoded %% characters. chars/1 is for external backwards compatibilty. chars(Cs) -> string_chars(Cs). string_chars(Cs) -> string_chars(Cs, []). string_chars([$\\ | Cs], Acc) -> string_bq_chars(Cs, Acc); string_chars([$\n | _], _Acc) -> throw(string_error); string_chars([C | Cs], Acc) -> string_chars(Cs, [C | Acc]); %% string_chars([C | Cs], Acc) when ?ASCII(C) -> %% string_chars(Cs, [C | Acc]); %% string_chars([C | Cs], Acc) -> %% case unicode:characters_to_binary([C]) of %% Bin when is_binary(Bin) -> %% string_chars(Cs, [Bin | Acc]); %% _Error -> %% throw(string_error) %% end; string_chars([], Acc) -> lists:reverse(Acc). %% string_bq_chars(Chars, Accumulator) %% Handle the backquotes characters. string_bq_chars([C1|Cs0], Acc) when ?DIGIT(C1) -> %1-3 decimal digits I1 = C1 - $0, %% Note here we "export" Byte and Cs1 (this is Erlang). case Cs0 of [C2,C3|Cs1] when ?DIGIT(C2), ?DIGIT(C3) -> Byte = 100 * I1 + 10 * (C2 - $0) + (C3 - $0), (Byte =< 255) orelse throw(string_error); [C2|Cs1] when ?DIGIT(C2) -> Byte = 10 * I1 + (C2 - $0); Cs1 -> Byte = I1 end, string_chars(Cs1, [Byte | Acc]); string_bq_chars([$x,C1,C2|Cs], Acc) -> %2 hex digits case ?HEX(C1) andalso ?HEX(C2) of true -> Byte = hex_val(C1)*16 + hex_val(C2), string_chars(Cs, [Byte|Acc]); false -> throw({string_error,"hexadecimal digit expected"}) end; string_bq_chars([$u,${|Cs], Acc) -> %Explicit utf-8 character string_bq_chars_utf8(Cs, 0, Acc); string_bq_chars([$z|Cs], Acc) -> %Skip whitespace string_chars(skip_space(Cs), Acc); string_bq_chars([C|Cs], Acc) -> case escape_char(C) of error -> throw({string_error,"invalid escape sequence"}); Esc -> string_chars(Cs, [Esc|Acc]) end; string_bq_chars([], Acc) -> Acc. string_bq_chars_utf8([C|Cs], Uchar, Acc) when ?HEX(C) -> string_bq_chars_utf8(Cs, Uchar*16 + hex_val(C), Acc); string_bq_chars_utf8([$}|Cs], Uchar, Acc) -> case unicode:characters_to_binary([Uchar]) of Bin when is_binary(Bin) -> string_chars(Cs, [Bin|Acc]); _Error -> throw({string_error,"UTF-8 value error"}) end; string_bq_chars_utf8(_Cs, _Uchar, _Acc) -> throw({string_error,"missing '}'"}). skip_space([$\s|Cs]) -> skip_space(Cs); skip_space(Cs) -> Cs. %% long_string_token(InputChars, Length, BracketLength, Line) -> %% {token,{'LITERALSTRING',Line,Cs}} | {error,Error}. long_string_token(Cs0, Len, BrLen, Line) -> %% Strip the brackets and remove first char if a newline. %% Note we "export" Cs1 here, (this is Erlang). case string:substr(Cs0, BrLen+1, Len - 2*BrLen) of [$\n | Cs1] -> Cs1; Cs1 -> Cs1 end, %% io:format("lst1 ~w ~w\n", [length(Cs1),Cs1]), try Bytes = long_string_chars(Cs1, []), %The bytes are encoded chars String = iolist_to_binary(Bytes), %% io:format("lst2 ~w ~w\n", [byte_size(String),String]), {token,{'LITERALSTRING',Line,String}} catch _:_ -> {error,"illegal long string"} end. long_string_chars([C | Cs], Acc) -> long_string_chars(Cs, [C|Acc]); %% long_string_chars([C | Cs], Acc) when ?ASCII(C) -> %% long_string_chars(Cs, [C|Acc]); %% long_string_chars([C | Cs], Acc) -> %This could be unicode %% case unicode:characters_to_binary([C]) of %% Bin when is_binary(Bin) -> %% long_string_chars(Cs, [Bin|Acc]); %% _Error -> %% throw(long_string_error) %% end; long_string_chars([], Acc) -> lists:reverse(Acc). hex_val(C) when C >= $0, C =< $9 -> C - $0; hex_val(C) when C >= $a, C =< $f -> C - $a + 10; hex_val(C) when C >= $A, C =< $F -> C - $A + 10. escape_char($a) -> 7; %\a = BELL escape_char($b) -> $\b; %\b = BS escape_char($f) -> $\f; %\f = FF escape_char($n) -> $\n; %\n = LF escape_char($r) -> $\r; %\r = CR escape_char($t) -> $\t; %\t = TAB escape_char($v) -> $\v; %\v = VT escape_char($\\) -> $\\; %\\ = BACKSLASH escape_char($") -> $"; %\" = STRING QUOTE escape_char($') -> $'; %\' = STRING QUOTE escape_char($\n) -> $\n; %\LF = LF escape_char($\r) -> $\n; %\RET = LF escape_char(_C) -> error. %Illegal %% is_keyword(Name) -> boolean(). %% Test if the name is a keyword. is_keyword(<<"and">>) -> true; is_keyword(<<"break">>) -> true; is_keyword(<<"do">>) -> true; is_keyword(<<"else">>) -> true; is_keyword(<<"elseif">>) -> true; is_keyword(<<"end">>) -> true; is_keyword(<<"false">>) -> true; is_keyword(<<"for">>) -> true; is_keyword(<<"function">>) -> true; is_keyword(<<"goto">>) -> true; is_keyword(<<"if">>) -> true; is_keyword(<<"in">>) -> true; is_keyword(<<"local">>) -> true; is_keyword(<<"nil">>) -> true; is_keyword(<<"not">>) -> true; is_keyword(<<"or">>) -> true; is_keyword(<<"repeat">>) -> true; is_keyword(<<"return">>) -> true; is_keyword(<<"then">>) -> true; is_keyword(<<"true">>) -> true; is_keyword(<<"until">>) -> true; is_keyword(<<"while">>) -> true; is_keyword(_) -> false. rvirding-luerl-772b25e/src/luerl_comp.hrl0000664000232200023220000000736115114130670021032 0ustar debalancedebalance%% Copyright (c) 2013-2019 Robert Virding %% %% Licensed under the Apache License, Version 2.0 (the "License"); %% you may not use this file except in compliance with the License. %% You may obtain a copy of the License at %% %% http://www.apache.org/licenses/LICENSE-2.0 %% %% Unless required by applicable law or agreed to in writing, software %% distributed under the License is distributed on an "AS IS" BASIS, %% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. %% See the License for the specific language governing permissions and %% limitations under the License. %% File : luerl_comp.hrl %% Author : Robert Virding %% Purpose : Internal LUA 5.2 compiler definitions. %% Common compiler information -record(cinfo, {lfile=[], %Lua file name vfile=[], %Virtual file name opts=[] %Compiler options }). %% Some useful macros. -define(IF(Test,True,False), case Test of true -> True; false -> False end). -define(WHEN_OPT(Opt,Opts,Fun), ?IF(member(Opt, Opts), Fun(), ok)). -define(DEBUG_PRINT(Format,Args,Opts), ?WHEN_OPT(debug_print, Opts, fun () -> io:fwrite(Format, Args) end)). %% Variable data. -record(vars, {local=[], %Local variables free=[], %Free variables used=[], %Used in sub blocks fused=[] %Used in sub-functions }). %% Define internal data macros. %% Statements. %% The line number here, 'l', can be a line number or annotation list. -record(assign_stmt, {l,vars,exps}). -record(call_stmt, {l,call}). -record(return_stmt, {l,exps}). -record(break_stmt, {l}). -record(block_stmt, {l, body=[], %Block body statements vars=none, %Variable info lsz=none, %Local frame size loc=not_used, %Local var block template esz=none, %Env frame size env=not_used, %Local env block template %%local=none, %Local variables locf=false}). %Local functions -record(while_stmt, {l,exp,body=[]}). -record(repeat_stmt, {l,body=[]}). -record(nfor_stmt, {l, var, %Loop variable init,limit,step, %The init, limit, step values body=[]}). %Loop body -record(gfor_stmt, {l, vars, %Loop variables gens, %Generators body=[]}). %Loop body -record(if_stmt, {l,tests=[],else_block}). -record(local_assign_stmt, {l,vars,exps}). -record(local_fdef_stmt, {l,var,func}). -record(expr_stmt, {l,exp}). %Pseudo stmt for expressions -record(block, {l, body=[], %Block body statements vars=none, %Variable info lsz=none, %Local frame size loc=not_used, %Local var block template esz=none, %Env frame size env=not_used, %Local env block template locf=false}). %% Expressions. %% The line number here, 'l', can be a line number or annotation list. -record(fdef, {l, pars=[], %Parameters body=[], %Function body statements vars=none, %Variable info lsz=none, %Local frame size loc=not_used, %Local var block template esz=none, %Env frame size env=not_used, %Local env block template %%local=none, %Local variables locf=false}). %Local function -record(lit, {l,val}). %Literal value -record(op, {l,op,args=[]}). -record(dot, {l,exp,rest}). -record(single, {l,exp}). -record(var, {l,name}). -record(fcall, {l,args=[]}). %Function call -record(mcall, {l,meth,args=[]}). %Method call -record(key, {l,key}). -record(tabcon, {l,fields=[]}). %Table constructor -record(efield, {l,val}). -record(kfield, {l,key,val}). %% Variable types. %% The line number here, 'l', can be a line number or annotation list. -record(lvar, {l,n,d,i}). %Local name, depth, index -record(evar, {l,n,d,i}). %Environment name, depth, index -record(gvar, {l,n}). %Global name rvirding-luerl-772b25e/src/luerl_lib_io.erl0000664000232200023220000000257115114130670021324 0ustar debalancedebalance%% Copyright (c) 2013-2020 Robert Virding %% %% Licensed under the Apache License, Version 2.0 (the "License"); %% you may not use this file except in compliance with the License. %% You may obtain a copy of the License at %% %% http://www.apache.org/licenses/LICENSE-2.0 %% %% Unless required by applicable law or agreed to in writing, software %% distributed under the License is distributed on an "AS IS" BASIS, %% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. %% See the License for the specific language governing permissions and %% limitations under the License. %% File : luerl_lib_io.erl %% Author : Robert Virding %% Purpose : The io library for Luerl. %% This is a quick hack to get io working. It will be improved in time. -module(luerl_lib_io). -include("luerl.hrl"). ?MODULEDOC(false). -export([install/1,flush/3,write/3]). -import(luerl_lib, [lua_error/2,badarg_error/3]). %Shorten this install(St) -> luerl_heap:alloc_table(table(), St). %% table() -> [{FuncName,Function}]. table() -> [{<<"flush">>,#erl_mfa{m=?MODULE,f=flush}}, {<<"write">>,#erl_mfa{m=?MODULE,f=write}} ]. flush(_, _, St) -> {[true],St}. write(_, As, St) -> case luerl_lib:args_to_strings(As) of error -> badarg_error(write, As, St); Ss -> lists:foreach(fun (S) -> io:format("~s", [S]) end, Ss), {[#userdata{d=standard_io}],St} end. rvirding-luerl-772b25e/src/luerl_sandbox.erl0000664000232200023220000001715015114130670021524 0ustar debalancedebalance%% Copyright (c) 2013-2025 Robert Virding %% %% Licensed under the Apache License, Version 2.0 (the "License"); %% you may not use this file except in compliance with the License. %% You may obtain a copy of the License at %% %% http://www.apache.org/licenses/LICENSE-2.0 %% %% Unless required by applicable law or agreed to in writing, software %% distributed under the License is distributed on an "AS IS" BASIS, %% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. %% See the License for the specific language governing permissions and %% limitations under the License. %% File : luerl_sandbox.erl %% Authors : Tyler Butchart %% Purpose : Reduction limiting luerl sandbox. -module(luerl_sandbox). -include("luerl.hrl"). ?MODULEDOC( """ Sandboxed execution environment for Luerl with reduction counting. This module provides a way to run Lua code with controlled execution, limiting the number of reductions (computational steps) to prevent excessive resource consumption. The `ControlFlags` is a map or keyword list which can contain the following fields ``` #{max_time => MaxTime, % 100 msecs max_reductions => MaxReds, % none spawn_opts => SpawnOpts} % [] ``` `MaxReds` limits the number of reductions (default no max) and `MaxTime` (default 100 msecs) limits the maximum time to run the string. `SpawnOpts` are spawn options to the process running the evaluation. The default values are shown as comments. Any other fields are ignored. """). -export([init/0,init/1,init/2, run/1,run/2,run/3,run/4,run/5]). -define(LUERL_GLOBAL, '_G'). -define(SANDBOXED_VALUE, sandboxed). -define(SANDBOXED_GLOBALS, [ [?LUERL_GLOBAL, io], [?LUERL_GLOBAL, file], [?LUERL_GLOBAL, os, execute], [?LUERL_GLOBAL, os, exit], [?LUERL_GLOBAL, os, getenv], [?LUERL_GLOBAL, os, remove], [?LUERL_GLOBAL, os, rename], [?LUERL_GLOBAL, os, tmpname], [?LUERL_GLOBAL, package], [?LUERL_GLOBAL, load], [?LUERL_GLOBAL, loadfile], [?LUERL_GLOBAL, require], [?LUERL_GLOBAL, dofile], [?LUERL_GLOBAL, load], [?LUERL_GLOBAL, loadfile], [?LUERL_GLOBAL, loadstring] ]). %% The controlflags for controlling the execition. -type controlflags() :: #{atom() := term()} | [{atom(),term()}]. -type sandboxtable() :: [[atom()]]. -define(MAX_TIME, 100). %% Define IS_MAP/1 macro for is_map/1 bif. -ifdef(HAS_MAPS). -define(IS_MAP(T), is_map(T)). -else. -define(IS_MAP(T), false). -endif. ?DOC( """ Create a new Luerl state with the standard sandboxing. """). -spec init() -> LuaState when LuaState :: luerlstate(). init() -> init(luerl:init()). %% init([, State|TablePaths[, TablePaths]]) -> State ?DOC( """ Take an existing Luerl state and run the default sandboxing on it. Or create a new Luerl state and run a sandboxing table on it. """). -spec init(LuaState) -> LuaState when LuaState :: luerlstate() ; (TablePaths) -> LuaState when LuaState :: luerlstate(), TablePaths :: sandboxtable(). init(TablePaths) when is_list(TablePaths) -> init(luerl:init(), TablePaths); init(St) -> init(St, ?SANDBOXED_GLOBALS). ?DOC( """ Take an existing Luerl state and run the `TablePaths` on it to control the sandboxing. """). -spec init(LuaState, TablePaths) -> LuaState when LuaState :: luerlstate(), TablePaths :: [[atom()]]. init(St, []) -> luerl:gc(St); init(St0, [Path|Tail]) -> {ok,St1} = luerl:set_table_keys_dec(Path, ?SANDBOXED_VALUE, St0), init(St1, Tail). %% The default flags for running the sandboxed process. default_flags() -> [{max_time, ?MAX_TIME}, {max_reductions, none}, {spawn_opts, []}]. %% run(String|Binary) -> {Term,State} | {error,Term}. %% run(String|Binary, State) -> {Term,State} | {error,Term}. %% run(String|Binary, Flags, State) -> {Term,State} | {error,Term}. %% The new interface. ?DOC( """ Run the Lua expression controlled by the default `ControlFlags` in a new `LuaState` with the default sandboxing. """). -spec run(Expression) -> {Reply,LuaState} when Expression :: string(), LuaState :: luerlstate(), Reply :: {ok,Result,LuaState} | Error, Result :: luerldata(), Error :: term(). run(S) -> run(S, init()). ?DOC( """ Run the Lua expression controlled by the default `ControlFlags` in the `LuaState`. """). -spec run(Expression, LuaState) -> {Reply,LuaState} when Expression :: string(), LuaState :: luerlstate(), Reply :: {ok,Result,LuaState} | Error, Result :: luerldata(), Error :: term(). run(S, St) -> do_run(S, default_flags(), St). ?DOC( """ Run the Lua expression controlled by the `ControlFlags` in the `LuaState`. """). -spec run(Expression, ControlFlags, LuaState) -> {Reply,LuaState} when Expression :: string(), ControlFlags :: controlflags(), LuaState :: luerlstate(), Reply :: {ok,Result,LuaState} | Error, Result :: luerldata(), Error :: term(). %% The new interface. run(S, Flags, St) when ?IS_MAP(Flags) -> run(S, maps:to_list(Flags), St); run(S, Flags, #luerl{}=St) when is_list(Flags) -> do_run(S, Flags ++ default_flags(), St); %% The old interface. run(S, St, MaxR) when is_integer(MaxR) -> run(S, St, MaxR, []); run(S, St, Flags) when is_list(Flags) -> run(S, St, 0, Flags). %% run(String|Binary|Form[, State[, MaxReductions|Flags[, Flags[, Timeout]]]]) -> {Term,State}|{error,Term} %% This is the old interface which still works. ?DOC( """ run(String, LuaState, MaxReds, SpawnOpts) """). ?DOC( #{deprecated => "Use `run/3`" } ). run(S, St, MaxR, Flags) -> run(S, St, MaxR, Flags, ?MAX_TIME). ?DOC( """ run(String, LuaState, MaxReds, SpawnOpts, Timeout) """). ?DOC( #{deprecated => "Use `run/3`" } ). run(S, St, 0, Opts, MaxT) -> %% Need to get the old no reductions to the new no reductions. run(S, St, none, Opts, MaxT); run(S, St, MaxR, Opts, MaxT) -> Flags = [{max_time,MaxT},{max_reductions,MaxR},{spawn_opts,Opts}], do_run(S, Flags, St). do_run(S, Flags, St) -> MaxT = proplists:get_value(max_time, Flags), Opts = proplists:get_value(spawn_opts, Flags), Runner = start(self(), S, Opts, St), case proplists:get_value(max_reductions, Flags) of none -> receive_response(Runner, MaxT); MaxR when is_integer(MaxR), MaxR > 0 -> case wait_reductions(Runner, MaxR) of {killed, R} -> {error, {reductions, R}}; ok -> receive_response(Runner, MaxT) end; _Other -> exit(badarg) end. start(Parent, S, Opts, St) -> spawn_opt(fun() -> try Reply = luerl:do(S, St), erlang:send(Parent, {self(), Reply}) catch error:Reason -> erlang:send(Parent, {self(), {error, Reason}}) end end, Opts). wait_reductions(Runner, MaxR) -> case process_info(Runner, reductions) of undefined -> %% The process has died. ok; {reductions, R} when R >= MaxR -> exit(Runner, kill), {killed, R}; {reductions, _} -> %% We only check every default MAX_TIME so we don't %% overload the runner process too much. receive after ?MAX_TIME -> ok end, wait_reductions(Runner, MaxR) end. receive_response(Runner, Timeout) -> receive {Runner, Reply} -> %% The runner has terminated. Reply; {error, Error} -> Error after Timeout -> %% Kill the runner as its time is up. exit(Runner, kill), {error, timeout} end. rvirding-luerl-772b25e/src/luerl_comp_locf.erl0000664000232200023220000002131215114130670022022 0ustar debalancedebalance%% Copyright (c) 2013 Robert Virding %% %% Licensed under the Apache License, Version 2.0 (the "License"); %% you may not use this file except in compliance with the License. %% You may obtain a copy of the License at %% %% http://www.apache.org/licenses/LICENSE-2.0 %% %% Unless required by applicable law or agreed to in writing, software %% distributed under the License is distributed on an "AS IS" BASIS, %% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. %% See the License for the specific language governing permissions and %% limitations under the License. %% File : luerl_comp_locf.erl %% Author : Robert Virding %% Purpose : A basic LUA 5.3 compiler for Luerl. %% Does local function analysis. -module(luerl_comp_locf). -include("luerl.hrl"). -include("luerl_comp.hrl"). ?MODULEDOC(false). -export([chunk/2]). -import(ordsets, [add_element/2,is_element/2,union/1,union/2, subtract/2,intersection/2]). %% chunk(Code, CompInfo) -> %% {ok,Code} | {ok,Code,Warnings} | {error,Error}. chunk(Code0, #cinfo{opts=Opts}=_Ci) -> {Code1,_,nul} = exp(Code0, nul), %No local state here! luerl_comp:debug_print(Opts, "cf: ~p\n", [Code1]), {ok,Code1}. %% stmt(Stmts, State) -> {Stmts,LocalFunc,State}. stmts([S0|Ss0], St0) -> {S1,Slocf,St1} = stmt(S0, St0), {Ss1,Sslocf,St2} = stmts(Ss0, St1), Locf = Slocf or Sslocf, {[S1|Ss1],Locf,St2}; stmts([], St) -> {[],false,St}. %% stmt(Stmt, State) -> {Stmt,LocalFunc,State}. stmt(#assign_stmt{}=A, St) -> assign_stmt(A, St); stmt(#call_stmt{}=C, St) -> call_stmt(C, St); stmt(#return_stmt{}=R, St) -> return_stmt(R, St); stmt(#break_stmt{}=B, St) -> {B,false,St}; stmt(#block_stmt{}=B, St) -> block_stmt(B, St); stmt(#while_stmt{}=W, St) -> while_stmt(W, St); stmt(#repeat_stmt{}=R, St) -> repeat_stmt(R, St); stmt(#if_stmt{}=If, St) -> if_stmt(If, St); stmt(#nfor_stmt{}=For, St) -> numfor_stmt(For, St); stmt(#gfor_stmt{}=For, St) -> genfor_stmt(For, St); stmt(#local_assign_stmt{}=L, St) -> local_assign_stmt(L, St); stmt(#local_fdef_stmt{}=L, St) -> local_fdef_stmt(L, St); stmt(#expr_stmt{}=E, St) -> expr_stmt(E, St). %% assign_stmt(Assign, State) -> {Assign,LocalFunc,State}. assign_stmt(#assign_stmt{vars=Vs0,exps=Es0}=A, St0) -> {Vs1,Vlocf,St1} = assign_loop(Vs0, St0), {Es1,Elocf,St2} = explist(Es0, St1), Locf = Vlocf or Elocf, {A#assign_stmt{vars=Vs1,exps=Es1},Locf,St2}. assign_loop([V0|Vs0], St0) -> {V1,Vlocf,St1} = var(V0, St0), {Vs1,Vslocf,St2} = assign_loop(Vs0, St1), Locf = Vlocf or Vslocf, {[V1|Vs1],Locf,St2}; assign_loop([], St) -> {[],false,St}. var(#dot{exp=Exp0,rest=Rest0}=D, St0) -> {Exp1,Elocf,St1} = prefixexp_first(Exp0, St0), {Rest1,Rlocf,St2} = var_rest(Rest0, St1), {D#dot{exp=Exp1,rest=Rest1},Elocf or Rlocf,St2}; var(V, St) -> {V,false,St}. var_rest(#dot{exp=Exp0,rest=Rest0}=D, St0) -> {Exp1,Elocf,St1} = prefixexp_element(Exp0, St0), {Rest1,Rlocf,St2} = var_rest(Rest0, St1), {D#dot{exp=Exp1,rest=Rest1},Elocf or Rlocf,St2}; var_rest(Exp, St) -> var_last(Exp, St). var_last(#key{key=Exp0}=K, St0) -> {Exp1,Elocf,St1} = exp(Exp0, St0), {K#key{key=Exp1},Elocf,St1}. %% call_stmt(Call, State) -> {Call,LocalFunc,State}. call_stmt(#call_stmt{call=Exp0}=C, St0) -> {Exp1,Locf,St1} = exp(Exp0, St0), {C#call_stmt{call=Exp1},Locf,St1}. %% return_stmt(Return, State) -> {Return,LocalFunc,State}. return_stmt(#return_stmt{exps=Es0}=R, St0) -> {Es1,Locf,St1} = explist(Es0, St0), {R#return_stmt{exps=Es1},Locf,St1}. %% block_stmt(Block, State) -> {Block,LocalFunc,State}. block_stmt(#block_stmt{body=Ss0}=B, St0) -> {Ss1,Sslocf,St1} = stmts(Ss0, St0), {B#block_stmt{body=Ss1,locf=Sslocf},Sslocf,St1}. %% do_block(Block, State) -> {Block,LocalFunc,State}. do_block(#block{body=Ss0}=B, St0) -> {Ss1,Sslocf,St1} = stmts(Ss0, St0), {B#block{body=Ss1,locf=Sslocf},Sslocf,St1}. %% while_stmt(While, State) -> {While,LocalFunc,State}. %% The test expression is done in the context of the surrounding %% block. while_stmt(#while_stmt{exp=E0,body=B0}=W, St0) -> {E1,Elocf,St1} = exp(E0, St0), {B1,Blocf,St2} = do_block(B0, St1), {W#while_stmt{exp=E1,body=B1},Elocf or Blocf,St2}. %% repeat_stmt(Repeat, State) -> {Repeat,LocalFunc,State}. %% The test expression is done in the context of the repeat block. repeat_stmt(#repeat_stmt{body=B0}=R, St0) -> {B1,Blocf,St1} = do_block(B0, St0), {R#repeat_stmt{body=B1},Blocf,St1}. %% if_stmt(If, State) -> {If,LocalFunc,State}. %% The block info includes anything from the test expressions even %% though we keep them separate. if_stmt(#if_stmt{tests=Ts0,else_block=E0}=If, St0) -> {Ts1,Tlocf,St1} = if_tests(Ts0, St0), {E1,Elocf,St2} = do_block(E0, St1), Locf = Tlocf or Elocf, {If#if_stmt{tests=Ts1,else_block=E1},Locf,St2}. if_tests([{E0,B0}|Ts0], St0) -> {E1,Elocf,St1} = exp(E0, St0), {B1,Blocf,St2} = do_block(B0, St1), {Ts1,Tslocf,St3} = if_tests(Ts0, St2), Locf = Elocf or Blocf or Tslocf, {[{E1,B1}|Ts1],Locf,St3}; if_tests([], St) -> {[],false,St}. %% numfor_stmt(For, State) -> {For,LocalFunc,State}. numfor_stmt(#nfor_stmt{init=I0,limit=L0,step=S0,body=B0}=For, St0) -> {[I1,L1,S1],Eslocf,St1} = explist([I0,L0,S0], St0), {B1,Blocf,St2} = do_block(B0, St1), Locf = Eslocf or Blocf, {For#nfor_stmt{init=I1,limit=L1,step=S1,body=B1},Locf,St2}. %% genfor_stmt(For, State) -> {For,LocalFunc,State}. genfor_stmt(#gfor_stmt{gens=Gs0,body=B0}=For, St0) -> {Gs1,Glocf,St1} = explist(Gs0, St0), {B1,Blocf,St2} = do_block(B0, St1), Locf = Glocf or Blocf, {For#gfor_stmt{gens=Gs1,body=B1},Locf,St2}. %% local_assign_stmt(Local, State) -> {Local,LocalFunc,State}. local_assign_stmt(#local_assign_stmt{exps=Es0}=L, St0) -> {Es1,Eslocf,St1} = explist(Es0, St0), {L#local_assign_stmt{exps=Es1},Eslocf,St1}. %% local_fdef_stmt(Local, State) -> {Local,LocalFunc,State}. local_fdef_stmt(#local_fdef_stmt{func=F0}=L, St0) -> {F1,_,St1} = functiondef(F0, St0), %Don't care what's in func {L#local_fdef_stmt{func=F1},true,St1}. %% expr_stmt(Expr, State) -> {Expr,LocalFunc,State}. %% The expression pseudo statement. This will return a single value. expr_stmt(#expr_stmt{exp=Exp0}=E, St0) -> {Exp1,Locf,St1} = exp(Exp0, St0), {E#expr_stmt{exp=Exp1},Locf,St1}. %% explist(Exprs, State) -> {Exprs,LocalFunc,State}. %% exp(Expr, State) -> {Expr,LocalFunc,State}. explist([E0|Es0], St0) -> {E1,Elocf,St1} = exp(E0, St0), {Es1,Eslocf,St2} = explist(Es0, St1), {[E1|Es1],Elocf or Eslocf,St2}; explist([], St) -> {[],false,St}. %No expressions at all exp(#lit{}=L, St) -> {L,false,St}; %Nothing to do exp(#fdef{}=F0, St0) -> {F1,_,St1} = functiondef(F0, St0), %Don't care what's in func {F1,true,St1}; exp(#op{args=Es0}=Op, St0) -> {Es1,Eslocf,St1} = explist(Es0, St0), {Op#op{args=Es1},Eslocf,St1}; exp(#tabcon{fields=Fs0}=T, St0) -> {Fs1,Tlocf,St1} = tableconstructor(Fs0, St0), {T#tabcon{fields=Fs1},Tlocf,St1}; exp(E, St) -> prefixexp(E, St). prefixexp(#dot{exp=Exp0,rest=Rest0}=D, St0) -> {Exp1,Elocf,St1} = prefixexp_first(Exp0, St0), {Rest1,Rlocf,St2} = prefixexp_rest(Rest0, St1), {D#dot{exp=Exp1,rest=Rest1},Elocf or Rlocf,St2}; prefixexp(Exp, St) -> prefixexp_first(Exp, St). prefixexp_first(#single{exp=E0}=S, St0) -> {E1,Elocf,St1} = exp(E0, St0), {S#single{exp=E1},Elocf,St1}; prefixexp_first(V, St) -> {V,false,St}. prefixexp_rest(#dot{exp=Exp0,rest=Rest0}=D, St0) -> {Exp1,Elocf,St1} = prefixexp_element(Exp0, St0), {Rest1,Rlocf,St2} = prefixexp_rest(Rest0, St1), {D#dot{exp=Exp1,rest=Rest1},Elocf or Rlocf,St2}; prefixexp_rest(Exp, St) -> prefixexp_element(Exp, St). prefixexp_element(#key{key=E0}=K, St0) -> {E1,Elocf,St1} = exp(E0, St0), {K#key{key=E1},Elocf,St1}; prefixexp_element(#fcall{args=As0}=F, St0) -> {As1,Aslocf,St1} = explist(As0, St0), {F#fcall{args=As1},Aslocf,St1}; prefixexp_element(#mcall{args=As0}=M, St0) -> {As1,Aslocf,St1} = explist(As0, St0), {M#mcall{args=As1},Aslocf,St1}. %% functiondef(Func, State) -> {Func,LocalFunc,State}. %% We return if there are any internal function definitions within %% the function. functiondef(#fdef{body=Ss0}=F, St0) -> {Ss1,Sslocf,St1} = stmts(Ss0, St0), {F#fdef{body=Ss1,locf=Sslocf},Sslocf,St1}. %% tableconstructor(Fields, State) -> {Fields,LocalFunc,State}. tableconstructor(Fs0, St0) -> Fun = fun (#efield{val=V0}=F, {Locf,S0}) -> {V1,Vlocf,S1} = exp(V0, S0), {F#efield{val=V1},{Locf or Vlocf,S1}}; (#kfield{key=K0,val=V0}=F, {Locf,S0}) -> {K1,Klocf,S1} = exp(K0, S0), {V1,Vlocf,S2} = exp(V0, S1), {F#kfield{key=K1,val=V1},{Locf or Klocf or Vlocf,S2}} end, {Fs1,{Locf,St1}} = lists:mapfoldl(Fun, {false,St0}, Fs0), {Fs1,Locf,St1}. rvirding-luerl-772b25e/src/luerl_instrs.hrl0000664000232200023220000000602015114130670021405 0ustar debalancedebalance%% Copyright (c) 2019 Robert Virding %% %% Licensed under the Apache License, Version 2.0 (the "License"); %% you may not use this file except in compliance with the License. %% You may obtain a copy of the License at %% %% http://www.apache.org/licenses/LICENSE-2.0 %% %% Unless required by applicable law or agreed to in writing, software %% distributed under the License is distributed on an "AS IS" BASIS, %% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. %% See the License for the specific language governing permissions and %% limitations under the License. %% File : luerl_instrs.hrl %% Author : Robert Virding %% Purpose : Internal LUA 5.3 instructions. %% Expression instructions. -define(PUSH_LIT(L), {push_lit,L}). -define(PUSH_LVAR(D,I), {push_lvar,D,I}). -define(PUSH_EVAR(D, I), {push_evar,D,I}). -define(PUSH_GVAR(K), {push_gvar,K}). -define(PUSH_LAST_LIT(L), {push_last_lit,L}). %[?PUSH_LIT,?MULTIPLE] -define(PUSH_LAST_LVAR(D,I), {push_last_lvar,D,I}). -define(PUSH_LAST_EVAR(D, I), {push_last_evar,D,I}). -define(PUSH_LAST_GVAR(K), {push_last_gvar,K}). -define(STORE_LVAR(D, I), {store_lvar,D,I}). -define(STORE_EVAR(D, I), {store_evar,D,I}). -define(STORE_GVAR(K), {store_gvar,K}). -define(GET_KEY, get_key). %Acc = Stk[Acc] -define(GET_LIT_KEY(K), {get_lit_key,K}). %[?PUSH_LIT(K),?GET_KEY] -define(SET_KEY, set_key). %Stk[ -define(SET_LIT_KEY(K), {set_lit_key,K}). %[?PUSH_LIT(K),?SET_KEY] -define(SINGLE, single). %Ensure single value -define(MULTIPLE, multiple). %Ensure multiple value -define(BUILD_TAB(Fc, I), {build_tab,Fc,I}). -define(FCALL, fcall). -define(TAIL_FCALL, tail_fcall). -define(MCALL(M), {mcall,M}). -define(TAIL_MCALL(M), {tail_mcall,M}). -define(OP(Op,Ac), {op,Op,Ac}). -define(PUSH_FDEF(Anno, Lsz, Esz, Pars, Is), {push_fdef,Anno,Lsz,Esz,Pars,Is}). -define(PUSH_FDEF(FnRef), {push_fdef,FnRef}). %% Control instructions. -define(BLOCK(Lsz, Esz, Is), {block,Lsz,Esz,Is}). -define(BLOCK_OPEN(Lsz, Esz), {block_open,Lsz,Esz}). -define(BLOCK_CLOSE, block_close). -define(WHILE(E, B), {while,E,B}). -define(WHILE_LOOP(Eis, Wis), {while_loop,Eis,Wis}). -define(REPEAT(B), {repeat,B}). -define(REPEAT_LOOP(B), {repeat_loop,B}). -define(AND_THEN(T), {and_then,T}). -define(OR_ELSE(T), {or_else,T}). -define(IF_TRUE(T), {if_true,T}). -define(IF(T, F), {'if',T,F}). -define(NFOR(V, B), {nfor,V,B}). -define(NFOR_LOOP(N, Limit, Step, Fis), {nfor_loop,N,Limit,Step,Fis}). -define(GFOR(Vs, B), {gfor,Vs,B}). -define(GFOR_CALL(Func, Data, Val, Fis), {gfor_call,Func,Data,Val,Fis}). -define(GFOR_LOOP(Func, Data, Fis), {gfor_loop,Func,Data,Fis}). -define(BREAK, break). -define(RETURN(Ac), {return,Ac}). %% Stack instructions. -define(PUSH, push). -define(POP, pop). -define(POP2, pop2). -define(SWAP, swap). -define(DUP, dup). -define(PUSH_VALS(Vc), {push_vals,Vc}). -define(POP_VALS(Vc), {pop_vals,Vc}). -define(POP_ARGS(Ac), {pop_args,Ac}). -define(PUSH_ARGS(Al), {push_args,Al}). %% Comment and line instructions. -define(COMMENT(C), {comment,C}). -define(CURRENT_LINE(L, File), {current_line,L,File}). rvirding-luerl-772b25e/src/luerl_io.erl0000664000232200023220000001206215114130670020472 0ustar debalancedebalance%% Copyright (c) 2025 Robert Virding %% %% Licensed under the Apache License, Version 2.0 (the "License"); %% you may not use this file except in compliance with the License. %% You may obtain a copy of the License at %% %% http://www.apache.org/licenses/LICENSE-2.0 %% %% Unless required by applicable law or agreed to in writing, software %% distributed under the License is distributed on an "AS IS" BASIS, %% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. %% See the License for the specific language governing permissions and %% limitations under the License. %% File : luerl_io.erl %% Author : Robert Virding %% Purpose : Some basic i/o functions for Luerl. -module(luerl_io). -include("luerl.hrl"). ?MODULEDOC( """ This module provides a standard of set io functions for Luerl. In the following description, many functions have an optional parameter `IoDevice`. If included, it must be the pid of a process which handles the IO protocols such as the IoDevice returned by `file:open/2`. Also in the functions handling files it can also be the name of the file which will then be opened. Note that Luerl, following Lua, does do any implicit UTF-8 encoding of input strings. """). -export([get_line/0,get_line/1,get_line/2,collect_line/2]). -export([scan_file/1,scan_file/2,parse_file/1,parse_file/2]). %% get_line() -> Data | {error,Error} | eof. %% Reads a line from the standard input (IoDevice), prompting it with %% Prompt. Doing it this way saves the input in history. We also make %% sure that any utf-8 encoding is done before we return the data. ?DOC( #{equiv => get_line(standard_io, '')}). get_line() -> get_line(standard_io, ''). ?DOC( #{equiv => get_line(standard_io, Prompt)}). get_line(Prompt) -> get_line(standard_io, Prompt). ?DOC( """ Read a line of text from `IoDevice` withe the prompt `Prompt`. We make sure that anu UTF-8 encoding is done before we return the data. """). get_line(IoDevice, Prompt) -> Get = io:request(IoDevice, {get_until,latin1,Prompt,luerl_io,collect_line,[]}), %% Make sure unicode codepoints ahve been expanded. case Get of Line when is_list(Line) -> unicode:characters_to_binary(Line); Other -> Other end. %% collect_line(OldStack, Data) -> {done,Result,Rest} | {more,NewStack}. collect_line(Stack, Data) -> case io_lib:collect_line(start, Data, latin1, ignored) of {stop,Result,Rest} -> {done,lists:reverse(Stack, Result),Rest}; MoreStack -> {more,MoreStack ++ Stack} end. %% scan_file(FileName|Fd) -> {ok,[Token]} | {error,Error}. %% scan_file(FileName|Fd, Line) -> {ok,[Token]} | {error,Error}. %% Scan a file returning the tokens found in the file. Handle errors %% consistently. ?DOC( #{equiv => scan_file(FileName, 1)}). scan_file(FileName) -> scan_file(FileName, 1). ?DOC( """ Scan the file `FileName` and return the tokens in it. `FileName` can also be an `IoDevice` of an already opened file. """). scan_file(FileName, Line) -> with_token_file(FileName, fun (Ts, _LastLine) -> {ok,Ts} end, Line). %% parse_file(FileName|Fd) -> {ok,[{Sexpr,Line}]} | {error,Error}. %% parse_file(FileName|Fd, Line) -> {ok,[{Sexpr,Line}]} | {error,Error}. %% Parse a file returning the chunk it contained. Handle errors %% consistently. ?DOC( #{equiv => parse_file(FileName, 1)}). parse_file(FileName) -> parse_file(FileName, 1). ?DOC( """ Parse the file `FileName` and return the chunk in it. `FileName` can also be an `IoDevice` of an already opened file. """). parse_file(FileName, Line) -> with_token_file(FileName, fun (Ts, LastLine) -> parse_tokens(Ts, LastLine) end, Line). parse_tokens(Tokens, _LastLine) -> luerl_parse:chunk(Tokens). %% with_token_file(FileName|Fd, DoFunc, Line) %% Open the file, scan all Luerl tokens and apply DoFunc on them. Note %% that a new file starts at line 1. with_token_file(Fd, Do, Line) when is_pid(Fd) -> with_token_file_fd(Fd, Do, Line); with_token_file(Name, Do, _Line) -> case file:open(Name, [read,{encoding,latin1}]) of {ok,Fd} -> %% Check if first line a script or Windows BOM, if so skip it. case io:get_line(Fd, '') of "#" ++ _ -> ok; %Skip line [239,187,191|_] -> file:position(Fd, 3); %Skip BOM _ -> file:position(Fd, bof) %Get it all end, with_token_file_fd(Fd, Do, 1); %Start at first valid line {error,Error} -> {error,{none,file,Error}} end. with_token_file_fd(Fd, Do, Line) -> %Called with a file descriptor Ret = case io:request(Fd, {get_until,latin1,'',luerl_scan,tokens,[Line]}) of {ok,Ts,LastLine} -> Do(Ts, LastLine); {eof,_}=Eof -> Eof; %This might occur. {error,Error,_} -> {error,Error} end, file:close(Fd), %Close the file Ret. % and return value rvirding-luerl-772b25e/src/Elixir.Luerl.Old.erl0000664000232200023220000001040215114130670021707 0ustar debalancedebalance%% Copyright (c) 2013-2024 Robert Virding %% %% Licensed under the Apache License, Version 2.0 (the "License"); %% you may not use this file except in compliance with the License. %% You may obtain a copy of the License at %% %% http://www.apache.org/licenses/LICENSE-2.0 %% %% Unless required by applicable law or agreed to in writing, software %% distributed under the License is distributed on an "AS IS" BASIS, %% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. %% See the License for the specific language governing permissions and %% limitations under the License. %% File : luerl_ex.erl %% Authors : Cees de Groot %% Purpose : Elixir-style wrappers for luerl_old.erl %% This module just contains functions that forward to luerl_old.erl, %% but place the VM State arguments in the first position rather than %% the last. This better matches Elixir conventions and allows for %% using the Elixir pipe operator '|>' to chain Luerl function calls. -module('Elixir.Luerl.Old'). -include("luerl.hrl"). ?MODULEDOC(""" Legacy Elixir API for Luerl This module provides Elixir-friendly wrappers for the luerl_old module with state as the first argument for better pipe operator usage. New code should use the Luerl module instead. """). -export([eval/2,evalfile/2, do/2,dofile/2, load/2,load/3, loadfile/2,loadfile/3, path_loadfile/2,path_loadfile/3,path_loadfile/4, load_module/3,load_module1/3, call/3,call_chunk/3, call_function/3,call_function1/3,function_list/2, call_method/3,call_method1/3,method_list/2, get_table/2,get_table1/2,set_table/3,set_table1/3,set_table1/4, init/0,stop/1,gc/1, set_trace_func/2,clear_trace_func/1, set_trace_data/2,get_trace_data/1, get_stacktrace/1, externalize/1,internalize/1 ]). %% Encoding and decoding. -export([encode/2,encode_list/2,decode/2,decode_list/2]). eval(St, Chunk) -> luerl_old:eval(Chunk, St). evalfile(St, Path) -> luerl_old:evalfile(Path, St). do(St, S) -> luerl_old:do(S, St). dofile(St, Path) -> luerl_old:dofile(Path, St). load(St, Bin) -> luerl_old:load(Bin, St). load(St, Bin, Opts) -> luerl_old:load(Bin, Opts, St). loadfile(St, Name) -> luerl_old:loadfile(Name, St). loadfile(St, Name, Opts) -> luerl_old:loadfile(Name, Opts, St). path_loadfile(St, Name) -> luerl_old:path_loadfile(Name, St). path_loadfile(St, Dirs, Name) -> luerl_old:path_loadfile(Dirs, Name, St). path_loadfile(St, Dir, Name, Opts) -> luerl_old:path_loadfile(Dir, Name, Opts, St). load_module(St, Fp, Mod) -> luerl_old:load_module(Fp, Mod, St). load_module1(St, Fp, Mod) -> luerl_old:load_module1(Fp, Mod, St). init() -> luerl_old:init(). call(St, C, As) -> luerl_old:call(C, As, St). call_chunk(St, C, As) -> luerl_old:call_chunk(C, As, St). call_function(St, Fp, As) -> luerl_old:call_function(Fp, As, St). call_function1(St, Lfp, Las) -> luerl_old:call_function1(Lfp, Las, St). function_list(St, Ks) -> luerl_old:function_list(Ks, St). call_method(St, Fp, As) -> luerl_old:call_method(Fp, As, St). call_method1(St, Fp, Las) -> luerl_old:call_method1(Fp, Las, St). method_list(St, Ks) -> luerl_old:method_list(Ks, St). get_table(St, Fp) -> luerl_old:get_table(Fp, St). get_table1(St, Fp) -> luerl_old:get_table1(Fp, St). set_table(St, Fp, V) -> luerl_old:set_table(Fp, V, St). set_table1(St, Lfp, Lv) -> luerl_old:set_table1(Lfp, Lv, St). set_table1(St, Tab, Key, Lv) -> luerl_old:set_table1(Tab, Key, Lv, St). stop(St) -> luerl_old:stop(St). gc(St) -> luerl_old:gc(St). set_trace_func(St, Func) -> luerl_old:set_trace_func(Func, St). clear_trace_func(St) -> luerl_old:clear_trace_func(St). get_trace_data(St) -> luerl_old:get_trace_data(St). set_trace_data(St, Tdata) -> luerl_old:set_trace_data(Tdata, St). get_stacktrace(St) -> luerl_old:get_stacktrace(St). encode_list(St, Ts) -> luerl_old:encode_list(Ts, St). encode(St, V) -> luerl_old:encode(V, St). decode_list(St, Lts) -> luerl_old:decode_list(Lts, St). decode(St, V) -> luerl_old:decode(V, St). externalize(St) -> luerl_old:externalize(St). internalize(St) -> luerl_old:internalize(St). rvirding-luerl-772b25e/src/luerl.erl0000664000232200023220000010124515114130670020005 0ustar debalancedebalance%% Copyright (c) 2020-2025 Robert Virding %% %% Licensed under the Apache License, Version 2.0 (the "License"); %% you may not use this file except in compliance with the License. %% You may obtain a copy of the License at %% %% http://www.apache.org/licenses/LICENSE-2.0 %% %% Unless required by applicable law or agreed to in writing, software %% distributed under the License is distributed on an "AS IS" BASIS, %% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. %% See the License for the specific language governing permissions and %% limitations under the License. %% File : luerl.erl %% Authors : Robert Virding %% Purpose : The basic LUA 5.4 interface. -module(luerl). -include("luerl.hrl"). %% Use normal strings as it is easier to use " and make it readable %% with both old and new string parsing. ?MODULEDOC( "Luerl is an implementation of Lua 5.3 written in Erlang. This is the main public API module for interfacing with Luerl. The `LuaState` parameter is the state of a Lua VM instance. It must be created with the `init/0` call and be threaded from one call to the next. Note that Luerl, following Lua, does do any implicit UTF-8 encoding of input strings. This means that all strings given as arguments to the calls or the strings to evaluate with `do/3` or `do_dec/3` need to have already been UTF-8 encoded. This can be quite easily do with the `~` or `~b` sigils. For example `luerl:do(~b\"return 'árvíztűrÅ‘ tükörfúrógép'\", St0)` or `luerl:do(~\"return 'árvíztűrÅ‘ tükörfúrógép'\", St0)`"). %% Basic user API to luerl. -export([init/0,gc/1, load/2,load/3,loadfile/2,loadfile/3, path_loadfile/2,path_loadfile/3,path_loadfile/4, load_module/3,load_module_dec/3, do/2,do_dec/2,do/3,do_dec/3, dofile/2,dofile/3,dofile_dec/2,dofile_dec/3, call/3,call_chunk/2,call_chunk/3, call_function/3,call_function_enc/3,call_function_dec/3, call_method/4,call_method_dec/4, get_table_keys/2,get_table_keys_dec/2, set_table_keys/3,set_table_keys_dec/3, get_table_key/3,set_table_key/4, get_stacktrace/1 ]). %% Tracing. -export([set_trace_func/2,clear_trace_func/1, set_trace_data/2,get_trace_data/1]). %% Encoding and decoding. -export([encode/2,encode_list/2,decode/2,decode_list/2]). %% Helping with storing VM state -export([externalize/1,internalize/1]). %% Storing and retrieving private data -export([put_private/3,get_private/2,delete_private/2]). ?DOC( """ Create a new Lua state which is a fresh Lua VM instance. """). -spec init() -> LuaState when LuaState :: luerlstate(). init() -> luerl_emul:init(). ?DOC( """ Runs the garbage collector on a state and returns the new state. """). -spec gc(LuaState) -> LuaState when LuaState :: luerlstate(). gc(St) -> luerl_heap:gc(St). %% set_trace_func(TraceFunction, State) -> State. %% clear_trace_func(State) -> State. %% get_trace_data(State) -> TraceData. %% set_trace_data(TraceData, State) -> State. %% Set the trace function and access the trace data. ?DOC( """ Set the trace function. """). ?DOC( #{group => <<"Trace Control functions">>} ). -spec set_trace_func(Function, LuaState) -> LuaState when Function :: fun(), LuaState :: luerlstate(). set_trace_func(Tfunc, St) -> St#luerl{trace_func=Tfunc}. ?DOC( """ Clear the trace function. """). ?DOC( #{group => <<"Trace Control functions">>} ). -spec clear_trace_func(LuaState) -> LuaState when LuaState :: luerlstate(). clear_trace_func(St) -> St#luerl{trace_func=none}. ?DOC( """ Get the current trace data. """). ?DOC( #{group => <<"Trace Control functions">>} ). -spec get_trace_data(LuaState) -> TraceData when LuaState :: luerlstate(), TraceData :: term(). get_trace_data(St) -> St#luerl.trace_data. ?DOC( """ Set the trace data. """). ?DOC( #{group => <<"Trace Control functions">>} ). -spec set_trace_data(TraceData, LuaState) -> LuaState when LuaState :: luerlstate(), TraceData :: term(). set_trace_data(Tdata, St) -> St#luerl{trace_data=Tdata}. %% load(String|Binary, State) -> {ok,FuncRef,NewState}. %% load(String|Binary, Options, State) -> {ok,FuncRef,NewState}. ?DOC( #{equiv => load(LuaChunk, [return], LuaState)} ). ?DOC( #{group => <<"Load Code functions">>} ). -spec load(LuaCode, LuaState) -> {ok,Function,LuaState} | CompileError when LuaCode :: binary() | string(), Function :: #funref{}, LuaState :: luerlstate(), CompileError :: {error,[term()],[term()]}. load(Bin, St) -> load(Bin, [return], St). ?DOC( """ Parse Lua chunk code as string or binary, and return a compiled chunk function. """). ?DOC( #{group => <<"Load Code functions">>} ). -spec load(LuaCode, CompileOptions, LuaState) -> {ok,Function,LuaState} | CompileError when LuaCode :: binary() | string(), CompileOptions :: [term()], LuaState :: luerlstate(), Function :: #funref{}, CompileError :: {error,[term()],[term()]}. load(Bin, Opts, St) when is_binary(Bin) -> load(binary_to_list(Bin), Opts, St); load(Str, Opts, St0) -> case luerl_comp:string(Str, Opts) of {ok,Chunk} -> {FunRef,St1} = luerl_emul:load_chunk(Chunk, St0), {ok,FunRef,St1}; Error -> %Compile error Error end. %% loadfile(FileName, State) -> {ok,FuncRef,NewState}. %% loadfile(FileName, Options, State) -> {ok,FuncRef,NewState}. ?DOC( #{equiv => loadfile(FileName, [return], LuaState)}). ?DOC( #{group => <<"Load Code functions">>} ). -spec loadfile(FileName, LuaState) -> {ok,Function,LuaState} | CompileError when FileName :: string(), LuaState :: luerlstate(), Function :: #funref{}, CompileError :: {error,[term()],[term()]}. loadfile(Name, St) -> loadfile(Name, [return], St). ?DOC( """ Parse a Lua file, and return a compiled chunk function. """). ?DOC( #{group => <<"Load Code functions">>} ). -spec loadfile(FileName, CompileOptions, LuaState) -> {ok,Function,LuaState} | CompileError when FileName :: string(), CompileOptions :: [term()], LuaState :: luerlstate(), Function :: #funref{}, CompileError :: {error,[term()],[term()]}. loadfile(Name, Opts, St0) -> case luerl_comp:file(Name, Opts) of {ok,Chunk} -> {Func,St1} = luerl_emul:load_chunk(Chunk, St0), {ok,Func,St1}; Error -> Error end. %% path_loadfile(FileName, State) -> {ok,Function,FullName,State}. %% path_loadfile(Path, FileName, State) -> {ok,Function,FullName,State}. %% path_loadfile(Path, FileName, Options, State) -> %% {ok,Function,FullName,State}. ?DOC( """ Calls `path_loadfile/4` with Path set the value of `LUA_LOAD_PATH` and `CompileOptions` set to `[return]`. """). ?DOC( #{group => <<"Load Code functions">>} ). -spec path_loadfile(FileName, LuaState) -> {ok,Function,FullName,LuaState} | CompileError when FileName :: string(), LuaState :: luerlstate(), Function :: #funref{}, FullName :: string(), CompileError :: {error,[term()],term()}. path_loadfile(Name, St) -> Path = case os:getenv("LUA_LOAD_PATH") of false -> []; %You get what you asked for Env -> %% Get path separator depending on os type. Sep = case os:type() of {win32,_} -> ";"; %Windows _ -> ":" %Unix end, string:tokens(Env, Sep) %Split into path list end, path_loadfile(Path, Name, [return], St). ?DOC( #{equiv => path_loadfile(Path, FileName, [return], LuaState)}). ?DOC( #{group => <<"Load Code functions">>} ). -spec path_loadfile(Path, FileName, LuaState) -> {ok,Function,FullName,LuaState} | CompileError when Path :: [string()], FileName :: string(), LuaState :: luerlstate(), Function :: #funref{}, FullName :: string(), CompileError :: {error,[term()],[term()]}. path_loadfile(Dirs, Name, St) -> path_loadfile(Dirs, Name, [return], St). ?DOC( """ Search down a `Path` to find the Lua file and return a compiled ('form'). """). ?DOC( #{group => <<"Load Code functions">>} ). -spec path_loadfile(Path, FileName, CompileOptions, LuaState) -> {ok,Function,FullName,LuaState} | CompileError when Path :: list(string()), FileName :: string(), FullName :: string(), CompileOptions :: [term()], LuaState :: luerlstate(), Function :: #funref{}, CompileError :: {error,[term()],[term()]}. path_loadfile([Dir|Dirs], Name, Opts, St0) -> Full = filename:join(Dir, Name), case loadfile(Full, Opts, St0) of {ok,Func,St1} -> {ok,Func,Full,St1}; {error,[{_,_,enoent}],_} -> %Couldn't find the file path_loadfile(Dirs, Name, St0); Error -> Error end; path_loadfile([], _, _, _) -> {error,[{none,file,enoent}],[]}. %% load_module(KeyPath, ErlangModule, State) -> State. %% load_module_dec(DecodedTablePath, ModuleName, State) -> State. ?DOC( """ Load `ErlangModule` and install its table at `KeyPath` in the LuaTable which is **NOT** automatically Lua encoded. """). ?DOC( #{group => <<"Load Code functions">>} ). -spec load_module(KeyPath, ErlangModule, LuaState) -> LuaState when KeyPath :: [luerldata()], ErlangModule :: atom(), LuaState :: luerlstate(). load_module([_|_] = Lfp, Mod, St0) -> {Tab,St1} = Mod:install(St0), luerl_emul:set_table_keys(Lfp, Tab, St1); load_module(_, _, _) -> error(badarg). ?DOC( """ Load `ErlangModule` and install its table at `KeyPath` in the LuaTable which is automatically Lua encoded. """). ?DOC( #{group => <<"Load Code functions">>} ). -spec load_module_dec(KeyPath, ErlangModule, LuaState) -> LuaState when KeyPath :: [term()], ErlangModule :: atom(), LuaState :: luerlstate(). load_module_dec([_|_] = Dfp, Mod, St0) -> {Efp,St1} = encode_list(Dfp, St0), load_module(Efp, Mod, St1); load_module_dec(_, _, _) -> error(badarg). %% luerl:do(String|Binary|Form, State) -> %% luerl:do(String|Binary|Form, CompileOptions, State) -> %% {ok,Result,NewState} | {lua_error,Error,State}. ?DOC( #{equiv => do(Expression, [return], LuaState)} ). ?DOC( #{group => <<"Evaluate Code functions">>} ). -spec do(Expression, LuaState) -> {ok,Result,LuaState} | LuaError | CompileError when Expression :: string(), LuaState :: luerlstate(), Result :: [luerldata()], LuaError :: {lua_error,term(),LuaState}, CompileError :: {error,[term()],[term()]}. do(S, St) -> do(S, [return], St). ?DOC( """ Compile a Lua expression string, evaluate it and return its result, which is **NOT** decoded, and the new Lua State. """). ?DOC( #{group => <<"Evaluate Code functions">>} ). -spec do(Expression, CompileOptions, LuaState) -> {ok,Result,LuaState} | LuaError | CompileError when Expression :: string(), CompileOptions :: [term()], LuaState :: luerlstate(), Result :: [luerldata()], LuaError :: {lua_error,term(),LuaState}, CompileError :: {error,[term()],[term()]}. do(S, Opts, St0) -> case load(S, Opts, St0) of {ok,FuncRef,St1} -> call_function(FuncRef, [], St1); Error -> Error end. ?DOC( #{equiv => do_dec(Expression, [return], LuaState)} ). ?DOC( #{group => <<"Evaluate Code functions">>} ). -spec do_dec(Expression, LuaState) -> {ok,Result,LuaState} | LuaError | CompileError when Expression :: string(), Result :: [term()], LuaState :: luerlstate(), LuaError :: {lua_error,term(),LuaState}, CompileError :: {error,[term()],[term()]}. do_dec(S, St) -> do_dec(S, [return], St). ?DOC( """ Compile a Lua expression string, evaluate it and return its result, which is is decoded, and the new Lua State. """). ?DOC( #{group => <<"Evaluate Code functions">>} ). -spec do_dec(Expression, CompileOptions, LuaState) -> {ok,Result,LuaState} | LuaError | CompileError when Expression :: string(), CompileOptions :: [term()], LuaState :: luerlstate(), Result :: [term()], LuaError :: {lua_error,term(),LuaState}, CompileError :: {error,[term()],[term()]}. do_dec(S, Opts, St0) -> case do(S, Opts, St0) of {ok,Eret,St1} -> {ok,decode_list(Eret, St1),St1}; Error -> Error end. %% luerl:dofile(FileName, State) -> %% luerl:dofile(FileName, CompileOptions, State) -> %% {ok,Result,NewState} | {lua_error,Error,State}. ?DOC( #{equiv => dofile(FileName, [return], LuaState)} ). ?DOC( #{group => <<"Evaluate Code functions">>} ). -spec dofile(FileName, LuaState) -> {ok,Result,LuaState} | LuaError | CompileError when FileName :: string(), LuaState :: luerlstate(), Result :: [luerldata()], LuaError :: {lua_error,term(),LuaState}, CompileError :: {error,[term()],[term()]}. dofile(File, St) -> dofile(File, [], St). ?DOC( """ Load and execute the Lua code in the file and return its result which is **NOT** decoded, and the new Lua State. Equivalent to doing luerl:do("return dofile('FileName')"). """). ?DOC( #{group => <<"Evaluate Code functions">>} ). -spec dofile(FileName, CompileOptions, LuaState) -> {ok,Result,LuaState} | LuaError | CompileError when FileName :: string(), CompileOptions :: [term()], LuaState :: luerlstate(), Result :: [luerldata()], LuaError :: {lua_error,term(),LuaState}, CompileError :: {error,[term()],[term()]}. dofile(File, Opts, St0) -> case loadfile(File, Opts, St0) of {ok,Func,St1} -> call_function(Func, [], St1); Error -> Error end. ?DOC( #{equiv => dofile_dec(FileName, [return], LuaState)} ). ?DOC( #{group => <<"Evaluate Code functions">>} ). -spec dofile_dec(FileName, LuaState) -> {ok,Result,LuaState} | LuaError | CompileError when FileName :: string(), Result :: [term()], LuaState :: luerlstate(), LuaError :: {lua_error,term(),LuaState}, CompileError :: {error,[term()],[term()]}. dofile_dec(File, St) -> dofile_dec(File, [], St). ?DOC( """ Load and execute the Lua code in the file and return its result which is Lua decoded, and the new Lua State. Equivalent to doing luerl:do_dec("return dofile('FileName')"). """). ?DOC( #{group => <<"Evaluate Code functions">>} ). -spec dofile_dec(FileName, CompileOptions, LuaState) -> {ok,Result,LuaState} | LuaError | CompileError when FileName :: string(), CompileOptions :: [term()], LuaState :: luerlstate(), Result :: [luerldata()], LuaError :: {lua_error,term(),LuaState}, CompileError :: {error,[term()],[term()]}. dofile_dec(File, Opts, St0) -> case dofile(File, Opts, St0) of {ok,Eret,St1} -> {ok,decode_list(Eret, St1),St1}; Error -> Error end. %% call(FuncRef, Args, State) -> %% call_chunk(FuncRef, State) -> %% call_chunk(FuncRef, Args, State) -> %% {ok,Return,State} | {lua_error,Error,State}. ?DOC( #{equiv => call_function(LuaFuncRef, Args, LuaState)} ). ?DOC( #{group => <<"Function/Method Call functions">>} ). call(LuaFuncRef, Args, LuaState) -> call_function(LuaFuncRef, Args, LuaState). ?DOC( #{equiv => call_function(LuaFuncRef, [], LuaState)} ). ?DOC( #{group => <<"Function/Method Call functions">>} ). call_chunk(LuaFuncRef, LuaState) -> call_function(LuaFuncRef, [], LuaState). ?DOC( #{equiv => call_function(LuaFuncRef, Args, LuaState)} ). ?DOC( #{group => <<"Function/Method Call functions">>} ). call_chunk(LuaFuncRef, Args, LuaState) -> call_function(LuaFuncRef, Args, LuaState). %% call_function(LuaFuncRef | LuaTablePath, Args, State) -> %% {ok,LuaReturn,State} | {lua_error,Error,State}. ?DOC( """ Call a function already defined in the state. `LuaFuncReaf` and `Args` are **NOT** automatically encoded and `Result` is **NOT** automatically decoded. """). ?DOC( #{group => <<"Function/Method Call functions">>} ). -spec call_function(LuaFuncRef, Args, LuaState) -> {ok,Result,LuaState} | LuaError when LuaFuncRef :: [luerldata()] | luerldata(), Args :: [luerldata()], LuaState :: luerlstate(), Result :: [luerldata()], LuaError :: {lua_error,term(),LuaState}. call_function(Epath, Args, St0) when is_list(Epath) -> {ok,Efunc,St1} = get_table_keys(Epath, St0), call_function(Efunc, Args, St1); call_function(Func, Args, St0) -> try {Ret,St1} = luerl_emul:functioncall(Func, Args, St0), {ok,Ret,St1} catch error:{lua_error,_E,_St} = LuaErr -> LuaErr end. %% call_function_enc(DecodedFuncRef, Args, State) -> %% {ok,LuaReturn,State} | {lua_error,Error,State}. ?DOC( """ Call a function already defined in the state. `KeyPath` is a list of keys to the function. `KeyPath` and `Args` are automatically encoded, while `Result` is **NOT** automatically decoded. """). ?DOC( #{group => <<"Function/Method Call functions">>} ). -spec call_function_enc(KeyPath, Args, LuaState) -> {ok,Result,LuaState} | LuaError when KeyPath :: [term()], Args :: [term()], LuaState :: luerlstate(), Result :: [luerldata()], LuaError :: {lua_error,term(),LuaState}. call_function_enc(Dtpath, Dargs, St0) -> {Epath,St1} = encode_list(Dtpath, St0), {Eargs,St2} = encode_list(Dargs, St1), call_function(Epath, Eargs, St2). %% call_function_dec(DecodedFuncRef, Args, State) -> %% {ok,DecodedReturn,State} | {lua_error,Error,State}. ?DOC( """ Call a function already defined in the state. `KeyPath` is a list of keys to the function. `KeyPath` and `Args` are automatically encoded, while `Result` is automatically decoded. """). ?DOC( #{group => <<"Function/Method Call functions">>} ). -spec call_function_dec(KeyPath, Args, LuaState) -> {ok,Result,LuaState} | LuaError when KeyPath :: [term()], Args :: [term()], LuaState :: luerlstate(), Result :: [term()], LuaError :: {lua_error,term(),LuaState}. call_function_dec(Dtpath, Dargs, St0) -> case call_function_enc(Dtpath, Dargs, St0) of {ok,Eret,St1} -> {ok,decode_list(Eret, St1),St1}; LuaError -> LuaError end. %% call_method(LuaObject, Method, Args, State) -> %% {ok,Return,State} | {lua_error,Error,State}. %% call_method_dec(DecodedObject, Method, Args, State) -> %% {ok,DecodedReturn,State} | {lua_error,Error,State}. ?DOC( """ Call the `Method` in the `LuaTable` with the `Args`. The `LuaTable`, `Method` and `Args` are **NOT** automatically encoded and the `Result` is **NOT** automatically decoded """). ?DOC( #{group => <<"Function/Method Call functions">>} ). -spec call_method(LuaTable, Method, Args, LuaState) -> {ok,Result,LuaState} | LuaError when LuaTable :: #tref{}, Method :: luerldata(), Args :: [luerldata()], LuaState :: luerlstate(), Result :: [luerldata()], LuaError :: {lua_error,term(),LuaState}. call_method(Obj, Meth, Args, St0) -> try {Ret,St1} = luerl_emul:methodcall(Obj, Meth, Args, St0), {ok,Ret,St1} catch error:{lua_error,_E,_St} = LuaErr -> LuaErr end. ?DOC( """ Call the `Method` in the `Table` with the `Args`. The `Table`, `Method` and `Args` are automatically encoded and the `Result` is automatically decoded. """). ?DOC( #{group => <<"Function/Method Call functions">>} ). -spec call_method_dec(KeyPath, Method, Args, LuaState) -> {ok,Result,LuaState} | LuaError when KeyPath :: [term()], Method :: term(), Args :: [term()], LuaState :: luerlstate(), Result :: [term()], LuaError :: {lua_error,term(),LuaState}. ?DOC( #{group => <<"Function/Method Call functions">>} ). call_method_dec(Dobj, Dmeth, Dargs, St0) -> {ok,Eobj,St1} = get_table_keys_dec(Dobj, St0), {Emeth,St2} = encode(Dmeth, St1), {Eargs,St3} = encode_list(Dargs, St2), case call_method(Eobj, Emeth, Eargs, St3) of {ok,Eret,St4} -> {ok,decode_list(Eret, St4),St4}; LuaError -> LuaError end. %% get_table_keys(Keys, State) -> %% get_table_keys_dec(DecodedKeys, State) -> %% {ok,Return,State} | {lua_error,Error,State}. %% set_table_keys(Keys, Val, State) -> %% set_table_keys_dec(DecodedKeys, DecodedVal, State) -> %% {ok,State} | {lua_error,Error,State}. ?DOC( """ Gets a value inside the Lua state. `KeyPath` is **NOT** encoded and `Result` is **NOT** decoded. """). ?DOC( #{group => <<"Lua Table Access functions">>} ). -spec get_table_keys(KeyPath, LuaState) -> {ok,Result,LuaState} | LuaError when KeyPath :: [luerldata()], LuaState :: luerlstate(), Result :: luerldata(), LuaError :: {lua_error,term(),LuaState}. get_table_keys(Keys, St0) -> try {Eret,St1} = luerl_emul:get_table_keys(Keys, St0), {ok,Eret,St1} catch error:{lua_error,_E,_St} = LuaErr -> LuaErr end. ?DOC( """ Gets a value inside the Lua state. `KeyPath` is automatically encoded and `Result` is automatically decoded. """). ?DOC( #{group => <<"Lua Table Access functions">>} ). -spec get_table_keys_dec(KeyPath, LuaState) -> {ok,Result,LuaState} | LuaError when KeyPath :: [term()], LuaState :: luerlstate(), Result :: term(), LuaError :: {lua_error,term(),LuaState}. get_table_keys_dec(Dkeys, St0) -> {Ekeys,St1} = encode_list(Dkeys, St0), case get_table_keys(Ekeys, St1) of {ok,Eret,St2} -> {ok,decode(Eret, St2),St2}; LuaError -> LuaError end. ?DOC( """ Sets a value inside the Lua state. `KeyPath` and `Value` are **NOT** encoded. """). ?DOC( #{group => <<"Lua Table Access functions">>} ). -spec set_table_keys(KeyPath, Value, LuaState) -> {ok,LuaState} | LuaError when KeyPath :: [luerldata()], Value :: luerldata(), LuaState :: luerlstate(), LuaError :: {lua_error,term(),LuaState}. set_table_keys(Keys, Val, St0) -> try St1 = luerl_emul:set_table_keys(Keys, Val, St0), {ok,St1} catch error:{lua_error,_E,_St} = LuaErr -> LuaErr end. ?DOC( """ Sets a value inside the Lua state. `KeyPath` and `Value` are automatically encoded. """). ?DOC( #{group => <<"Lua Table Access functions">>} ). -spec set_table_keys_dec(KeyPath, Value, LuaState) -> {ok,LuaState} | LuaError when KeyPath :: [term()], Value :: term(), LuaState :: luerlstate(), LuaError :: {lua_error,term(),LuaState}. set_table_keys_dec(Dkeys, Dval, St0) -> {Ekeys,St1} = encode_list(Dkeys, St0), {Eval,St2} = encode(Dval, St1), set_table_keys(Ekeys, Eval, St2). %% get_table_key(Tab, Key, State) -> %% {ok,Value,State} | {lua_error,Error,State}. %% set_table_key(Tab, Key, Value, State) -> %% {ok,State} | {lua_error,Error,State}. ?DOC( """ Get the value of a key in a table. `Table`, `Key` are **NOT** encoded and the `Result` is **NOT** decoded. """). ?DOC( #{group => <<"Lua Table Access functions">>} ). -spec get_table_key(Table, Key, LuaState) -> {ok,Result,LuaState} | LuaError when Table :: luerldata(), Key :: luerldata(), LuaState :: luerlstate(), Result :: luerldata(), LuaError :: {lua_error,term(),LuaState}. get_table_key(Tab, Key, St0) -> try {Eret,St1} = luerl_emul:get_table_key(Tab, Key, St0), {ok,Eret,St1} catch error:{lua_error,_E,_St} = LuaErr -> LuaErr end. ?DOC( """ Set the value of a key in a table. `Table`, `Key` and `Value` are **NOT** encoded. """). ?DOC( #{group => <<"Lua Table Access functions">>} ). -spec set_table_key(Table, Key, Value, LuaState) -> {ok,LuaState} | LuaError when Table :: luerldata(), Key :: luerldata(), Value :: luerldata(), LuaState :: luerlstate(), LuaError :: {lua_error,term(),LuaState}. set_table_key(Tab, Key, Val, St0) -> try St1 = luerl_emul:set_table_key(Tab, Key, Val, St0), {ok,St1} catch error:{lua_error,_E,_St} = LuaErr -> LuaErr end. %% get_stacktrace(State) -> [{FuncName,[{file,FileName},{line,Line}]}]. ?DOC( """ Return a stack trace of the current call stack in the state. """). -spec get_stacktrace(LuaState) -> [FuncCall] when LuaState :: luerlstate(), FuncCall :: {FuncName,CallArgs,ExtraInfo}, FuncName :: atom(), ExtraInfo :: [{atom(),term()}], CallArgs :: [term()]. get_stacktrace(#luerl{cs=Stack}=St) -> Fun = fun (Frame, Acc) -> do_stackframe(Frame, Acc, St) end, {_,Trace} = lists:foldl(Fun, {1,[]}, Stack), lists:reverse(Trace). do_stackframe(#call_frame{func=Funref,args=Args}, {Line,Trace}, St) -> case Funref of #funref{} -> {Func,_} = luerl_heap:get_funcdef(Funref, St), Anno = Func#lua_func.anno, Name = case luerl_anno:get(name, Anno) of undefined -> <<"-no-name-">>; N -> N end, File = luerl_anno:get(file, Anno), {Line,[{Name,Args,[{file,File},{line,Line}]} | Trace]}; #erl_func{code=Fun} -> {module,Module} = erlang:fun_info(Fun, module), {name,Name} = erlang:fun_info(Fun, name), FileName = get_filename(Module), {Line,[{{Module,Name},Args,[{file,FileName}]} | Trace]}; #erl_mfa{m=M,f=F,a=A} -> FileName = get_filename(M), %% {Line,[{{M,F},{A,Args},[{file,FileName}]} | Trace]}; %% {Line,[{{M,F},[A | Args],[{file,FileName}]} | Trace]}; {Line,[{{M,F,A},Args,[{file,FileName}]} | Trace]}; Other -> {Line,[{Other,Args,[{file,<<"-no-file-">>},{line,Line}]} | Trace]} end; do_stackframe(#current_line{line=Line}, {_,Trace}, _St) -> {Line,Trace}; do_stackframe(#loop_frame{}, Acc, _St) -> %Ignore these Acc. get_filename(Mod) -> Comp = erlang:get_module_info(Mod, compile), case lists:keyfind(source, 1, Comp) of {source,FileName} -> BaseName = filename:basename(FileName), list_to_binary(BaseName); false -> %The compiler doesn't know <<"-no-file-">> end. %% Define IS_MAP/1 macro for is_map/1 bif. -ifdef(HAS_MAPS). -define(IS_MAP(T), is_map(T)). -else. -define(IS_MAP(T), false). -endif. %% encode_list([Term], State) -> {[LuerlTerm],State}. %% encode(Term, State) -> {LuerlTerm,State}. ?DOC( """ Encode a list of Erlang terms into their Luerl representations if possible. """). ?DOC( #{ group => <<"Encode/Decode Data functions">>} ). -spec encode_list([Term], LuaState) -> {[LuerlTerm],LuaState} when LuerlTerm :: term(), Term :: term(), LuaState :: luerlstate(). encode_list(Terms, LuaState) -> lists:mapfoldl(fun encode/2, LuaState, Terms). ?DOC( """ encode(Term, LuaState) Encode an Erlang term into its Luerl representation if possible. """). ?DOC( #{ group => <<"Encode/Decode Data functions">>} ). -spec encode(Term, LuaState) -> {LuerlTerm,LuaState} when LuerlTerm :: luerldata(), Term :: term(), LuaState :: luerlstate(). encode(nil, St) -> {nil,St}; encode(false, St) -> {false,St}; encode(true, St) -> {true,St}; encode(B, St) when is_binary(B) -> {B,St}; encode(A, St) when is_atom(A) -> {atom_to_binary(A, utf8),St}; encode(N, St) when is_number(N) -> {N,St}; %Integers and floats encode(F, St) when ?IS_MAP(F) -> encode(maps:to_list(F), St); encode(L, St0) when is_list(L) -> %% Encode the table elements in the list. EncTab = fun ({K0,V0}, {I,S0}) -> {K1,S1} = encode(K0, S0), {V1,S2} = encode(V0, S1), {{K1,V1},{I,S2}}; (V0, {I,S0}) -> {V1,S1} = encode(V0, S0), {{I,V1},{I+1,S1}} end, {Es,{_,St1}} = lists:mapfoldl(EncTab, {1,St0}, L), {T,St2} = luerl_heap:alloc_table(Es, St1), {T,St2}; %No more to do for now encode(F, St) when is_function(F, 2) -> F1 = fun(Args, State) -> F(Args, State) end, %% io:format("enc ~p\n", [#erl_func{code=F1}]), {#erl_func{code=F1}, St}; encode(F, St) when is_function(F, 1) -> F1 = fun(Args, State) -> Res = F(Args), {Res,State} end, %% io:format("enc ~p\n", [#erl_func{code=F1}]), {#erl_func{code=F1}, St}; encode({M,F,A}, St) when is_atom(M) and is_atom(F) -> %% io:format("enc ~p\n", [#erl_mfa{m=M,f=F,a=A}]), {#erl_mfa{m=M,f=F,a=A}, St}; encode({userdata,Data}, St) -> luerl_heap:alloc_userdata(Data, St); %% % Table refs should not be re-encoded %% encode(#tref{}=T, St) -> %% case luerl_heap:chk_table(T, St) of %% ok -> {T, St}; %% error -> error(badarg) %% end; encode(Term, _) -> error({badarg,Term}). %Can't encode anything else %% decode_list([LuerlTerm], State) -> [Term]. %% decode(LuerlTerm, State) -> Term. ?DOC( """ Decode a list of Luerl terms into their standard Erlang representation. Note that we have to detect recursive references and generate an error when this occurs. """). ?DOC( #{ group => <<"Encode/Decode Data functions">>} ). -spec decode_list([LuerlTerm], LuaState) -> [Term] when LuerlTerm :: luerldata(), Term :: term(), LuaState :: luerlstate(). decode_list(LuerlTerms, LuaState) -> lists:map(fun (Lt) -> decode(Lt, LuaState) end, LuerlTerms). ?DOC( """ Decode a Luerl term into its standard Erlang representation. Note that we have to detect recursive references and generate an error when this occurs. """). ?DOC( #{ group => <<"Encode/Decode Data functions">>} ). -spec decode(LuerlTerm, LuaState) -> Term when LuerlTerm :: luerldata(), Term :: term(), LuaState :: luerlstate(). decode(LT, St) -> decode(LT, St, []). decode(nil, _, _) -> nil; decode(false, _, _) -> false; decode(true, _, _) -> true; decode(B, _, _) when is_binary(B) -> B; decode(N, _, _) when is_number(N) -> N; %Integers and floats decode(#tref{}=T, St, In) -> decode_table(T, St, In); decode(#usdref{}=U, St, In) -> decode_userdata(U, St, In); decode(#funref{}=Fun, St, In) -> decode_luafunc(Fun, St, In); decode(#erl_func{}=Fun, St, In) -> decode_erlfunc(Fun, St, In); decode(#erl_mfa{}=Mfa, St, In) -> decode_erlmfa(Mfa, St, In); decode(Lua, _, _) -> error({badarg,Lua}). %Shouldn't have anything else decode_table(#tref{i=N}=T, St, In0) -> case lists:member(N, In0) of true -> error({recursive_table,T}); %Been here before false -> In1 = [N|In0], %We are in this as well case luerl_heap:get_table(T, St) of #table{a=Arr,d=Dict} -> Fun = fun (K, V, Acc) -> [{decode(K, St, In1),decode(V, St, In1)}|Acc] end, Ts = ttdict:fold(Fun, [], Dict), array:sparse_foldr(Fun, Ts, Arr); _Undefined -> error(badarg) end end. decode_userdata(U, St, _In) -> {#userdata{d=Data},_} = luerl_heap:get_userdata(U, St), {userdata,Data}. decode_luafunc(Fun, _St, _In) -> %% io:format("dec ~p\n", [Fun]), fun(Args, State) -> luerl_emul:functioncall(Fun, Args, State) end. decode_erlfunc(#erl_func{code=Fun}=_Ef, _St, _In) -> %% io:format("dec ~p\n", [Ef]), Fun. %Just the bare fun decode_erlmfa(#erl_mfa{m=Mod,f=Func,a=Arg}=_Mfa, _St, _In) -> %% io:format("mfa ~p\n", [Mfa]), {Mod,Func,Arg}. %% Externalize and Internalize ensure that the VM state passed in %% can be stored externally or can be recreated from external storage. %% Currently very simple: only random state needs special treatment. -spec externalize(LuaState) -> LuaState when LuaState :: luerlstate(). externalize(S) -> luerl_lib_math:externalize(S). -spec internalize(LuaState) -> LuaState when LuaState :: luerlstate(). internalize(S) -> luerl_lib_math:internalize(S). %% put_private(Key, Value, State) -> %% State. %% get_private(Key, State) -> %% Value. %% delete_private(Key, State) -> %% Value. ?DOC( """ Puts a private `Value` under `Key` that is not exposed to the runtime. """). ?DOC( #{group => <<"Private Data functions">>} ). -spec put_private(Key, Value, LuaState) -> LuaState when Key :: term(), Value :: term(), LuaState :: luerlstate(). put_private(Key, Value, St) -> Private = maps:put(Key, Value, St#luerl.private), St#luerl{private=Private}. ?DOC( """ Get the private value for `Key`. """). ?DOC( #{group => <<"Private Data functions">>} ). -spec get_private(Key, LuaState) -> Value when Key :: term(), Value :: term(), LuaState :: luerlstate(). get_private(Key, St) -> maps:get(Key, St#luerl.private). ?DOC( """ Delete the private value for `Key`. """). ?DOC( #{group => <<"Private Data functions">>} ). -spec delete_private(Key, LuaState) -> LuaState when Key :: term(), LuaState :: luerlstate(). delete_private(Key, St) -> Private = maps:remove(Key, St#luerl.private), St#luerl{private=Private}. rvirding-luerl-772b25e/src/luerl_old.erl0000664000232200023220000003421315114130670020643 0ustar debalancedebalance%% Copyright (c) 2013-2024 Robert Virding %% %% Licensed under the Apache License, Version 2.0 (the "License"); %% you may not use this file except in compliance with the License. %% You may obtain a copy of the License at %% %% http://www.apache.org/licenses/LICENSE-2.0 %% %% Unless required by applicable law or agreed to in writing, software %% distributed under the License is distributed on an "AS IS" BASIS, %% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. %% See the License for the specific language governing permissions and %% limitations under the License. %% File : luerl_old.erl %% Authors : Robert Virding, Henning Diedrich %% Purpose : The original basic LUA 5.2 interface. -module(luerl_old). -include("luerl.hrl"). ?MODULEDOC(""" Legacy API for Luerl. This module is provided for backwards compatibility with earlier versions of Luerl. New code should use the luerl module instead. For Elixir users, the `Elixir.Luerl.Old` module provides an idiomatic interface with state as the first argument for better pipe operator usage. """). -export([eval/2,evalfile/2, do/2,dofile/2, load/2,load/3, loadfile/2,loadfile/3, path_loadfile/2,path_loadfile/3,path_loadfile/4, load_module/3,load_module1/3, call/3,call_chunk/3, call_function/3,call_function1/3,function_list/2, call_method/3,call_method1/3,method_list/2, get_table/2,get_table1/2,set_table/3,set_table1/3,set_table1/4, init/0,stop/1,gc/1, set_trace_func/2,clear_trace_func/1, set_trace_data/2,get_trace_data/1, get_stacktrace/1, externalize/1,internalize/1 ]). %% Encoding and decoding. -export([encode/2,encode_list/2,decode/2,decode_list/2]). %% luerl_old:eval(String|Binary|Form, State) -> Result. eval(Chunk, St0) -> try do(Chunk, St0) of {Ret,St1} -> {ok, decode_list(Ret, St1)} catch ?CATCH(_C, E, S) {error, E, S} %{error, {E, R}} ? <- todo: decide end. %% luerl_old:evalfile(Path, State) -> {ok, Result} | {error,Reason}. evalfile(Path, St0) -> try dofile(Path, St0) of {Ret,St1} -> {ok, decode_list(Ret, St1)} catch ?CATCH(_C, E, S) {error, E, S} %{error, {E, R}} ? <- todo: decide end. %% luerl_old:do(String|Binary|Form, State) -> {Result, NewState} do(S, St0) when is_binary(S); is_list(S) -> {ok,Func,St1} = load(S, St0), luerl_emul:call(Func, St1); do(Func, St) -> luerl_emul:call(Func, St). %% luerl_old:dofile(Path, State) -> {Result, NewState}. dofile(Path, St0) -> {ok,Func,St1} = loadfile(Path, St0), luerl_emul:call(Func, St1). %% load(String|Binary, State) -> {ok,Function,NewState}. %% load(String|Binary, Options, State) -> {ok,Function,NewState}. load(Bin, St) -> load(Bin, [return], St). load(Bin, Opts, St) when is_binary(Bin) -> load(binary_to_list(Bin), Opts, St); load(Str, Opts, St0) when is_list(Str) -> case luerl_comp:string(Str, Opts) of {ok,Chunk} -> {Func,St1} = luerl_emul:load_chunk(Chunk, St0), {ok,Func,St1}; {error,_,_}=E -> E end. %% loadfile(FileName, State) -> {ok,Function,NewState}. %% loadfile(FileName, Options, State) -> {ok,Function,NewState}. loadfile(Name, St) -> loadfile(Name, [return], St). loadfile(Name, Opts, St0) -> case luerl_comp:file(Name, Opts) of {ok,Chunk} -> {Func,St1} = luerl_emul:load_chunk(Chunk, St0), {ok,Func,St1}; {error,_,_}=E -> E end. %% path_loadfile(FileName, State) -> {ok,Function,FullName,State}. %% path_loadfile(Path, FileName, State) -> {ok,Function,FullName,State}. %% path_loadfile(Path, FileName, Options, State) -> %% {ok,Function,FullName,State}. %% When no path is given we use the value of LUA_LOAD_PATH. %% We manually step down the path to get the correct handling of %% filenames by the compiler. path_loadfile(Name, St) -> Path = case os:getenv("LUA_LOAD_PATH") of false -> []; %You get what you asked for Env -> %% Get path separator depending on os type. Sep = case os:type() of {win32,_} -> ";"; _ -> ":" %Unix end, string:tokens(Env, Sep) %Split into path list end, path_loadfile(Path, Name, [return], St). path_loadfile(Dirs, Name, St) -> path_loadfile(Dirs, Name, [return], St). path_loadfile([Dir|Dirs], Name, Opts, St0) -> Full = filename:join(Dir, Name), case loadfile(Full, Opts, St0) of {ok,Func,St1} -> {ok,Func,Full,St1}; {error,[{_,_,enoent}],_} -> %Couldn't find the file path_loadfile(Dirs, Name, St0); Error -> Error end; path_loadfile([], _, _, _) -> {error,[{none,file,enoent}],[]}. %% load_module(TablePath, ModuleName, State) -> State. %% load_module1(LuaTablePath, ModuleName, State) -> State. %% Load module and add module table to the path. load_module(Fp, Mod, St0) when is_list(Fp) -> {Lfp,St1} = encode_list(Fp, St0), load_module1(Lfp, Mod, St1); load_module(_, _,_) -> error(badarg). load_module1(Lfp, Mod, St0) -> {Tab,St1} = Mod:install(St0), luerl_emul:set_table_keys(Lfp, Tab, St1). %% init() -> State. init() -> luerl_emul:init(). %% call(Chunk, Args, State) -> {Result,State} call(C, As, St) -> call_chunk(C, As, St). call_chunk(C, As, St0) -> {Las,St1} = encode_list(As, St0), {Lrs,St2} = luerl_emul:call(C, Las, St1), Rs = decode_list(Lrs, St2), {Rs,St2}. %% call_function(TablePath, Args, State) -> {Result,State}. %% call_function1(LuaTablePath | Func, LuaArgs, State) -> {LuaResult,State}. call_function(Fp, As, St0) -> %% Encode the input arguments. {Lfp,St1} = encode_list(Fp, St0), {Las,St2} = encode_list(As, St1), %% Find the function definition and call function. {Lrs,St3} = call_function1(Lfp, Las, St2), Rs = decode_list(Lrs, St3), {Rs,St3}. call_function1(Lfp, Las, St0) when is_list(Lfp) -> {F,St1} = luerl_emul:get_table_keys(Lfp, St0), luerl_emul:functioncall(F, Las, St1); call_function1(F, Las, St) -> luerl_emul:functioncall(F, Las, St). %% function_list(Keys, State) -> {V,State}. %% Go down a list of keys and return final value. function_list(Ks, St) -> luerl_emul:get_table_keys(Ks, St). %% call_method(FuncPath, Args, State) -> {Result,State}. %% call_method1(FuncPath | FuncPath, Args, State) -> {Result,State}. call_method(Fp, As, St0) -> %% Encode the input arguments. {Lfp,St1} = encode_list(Fp, St0), {Las,St2} = encode_list(As, St1), %% Find the object and method definition and call method. {O,M,St3} = method_list(Lfp, St2), {Lrs,St4} = luerl_emul:functioncall(M, [O|Las], St3), Rs = decode_list(Lrs, St4), {Rs,St4}. call_method1(Fp, Las, St0) -> %% Find the object and method definition and call method. {O,M,St1} = method_list(Fp, St0), luerl_emul:functioncall(M, [O|Las], St1). method_list([G|Ks], St0) -> {First,St1} = luerl_emul:get_global_key(G, St0), method_list(First, Ks, St1). method_list(Tab, [K], St0) -> {Func,St1} = luerl_emul:get_table_key(Tab, K, St0), {Tab,Func,St1}; method_list(Tab, [K|Ks], St0) -> {Next,St1} = luerl_emul:get_table_key(Tab, K, St0), method_list(Next, Ks, St1); method_list(_, _, _) -> error(badarg). %% get_table(TablePath, State) -> {Result, State}. %% Go down a list of keys and return decoded final value. get_table(Fp, St0) when is_list(Fp) -> {Lfp,St1} = encode_list(Fp, St0), {V,St2} = luerl_emul:get_table_keys(Lfp, St1), Vd = decode(V, St2), {Vd,St2}; get_table(_,_) -> error(badarg). %% get_table1(LuaTablePath, State) -> {LuaResult, State}. get_table1(Fp, St) when is_list(Fp) -> luerl_emul:get_table_keys(Fp, St); get_table1(_,_) -> error(badarg). %% set_table(TablePath, Value, State) -> State. %% Go down a list of keys and set final key to Value. set_table(Fp, V, St0) when is_list(Fp) -> {Lfp,St1} = encode_list(Fp, St0), {Lv, St2} = encode(V, St1), set_table1(Lfp, Lv, St2); set_table(_,_,_) -> error(badarg). %% set_table1(LuaTablePath, Value, State) -> State. %% Must explicitly read table key to get set_table1(Lfp, Lv, St) -> luerl_emul:set_table_keys(Lfp, Lv, St). %% set_table1(Table, Key, Value, State) -> State. %% Must explicitly read table key to get set_table1(Tab, Key, Lv, St) -> luerl_emul:set_table_key(Tab, Key, Lv, St). %% stop(State) -> GCedState. stop(St) -> luerl_heap:gc(St). %% gc(State) -> State. gc(St) -> luerl_heap:gc(St). %% set_trace_func(TraceFunction, State) -> State. %% clear_trace_func(State) -> State. %% get_trace_data(State) -> TraceData. %% set_trace_data(TraceData, State) -> State. %% Set the trace function and access the trace data. set_trace_func(Tfunc, St) -> St#luerl{trace_func=Tfunc}. clear_trace_func(St) -> St#luerl{trace_func=none}. get_trace_data(St) -> St#luerl.trace_data. set_trace_data(Tdata, St) -> St#luerl{trace_data=Tdata}. %% get_stacktrace(State) -> [{FuncName,[{file,FileName},{line,Line}]}]. get_stacktrace(#luerl{cs=Stack}=St) -> Fun = fun (Frame, Acc) -> do_stackframe(Frame, Acc, St) end, {_,Trace} = lists:foldl(Fun, {1,[]}, Stack), lists:reverse(Trace). do_stackframe(#call_frame{func=Funref,args=Args}, {Line,Trace}, St) -> case Funref of #funref{} -> {Func,_} = luerl_heap:get_funcdef(Funref, St), Anno = Func#lua_func.anno, Name = case luerl_anno:get(name, Anno) of undefined -> <<"-no-name-">>; N -> N end, File = luerl_anno:get(file, Anno), {Line,[{Name,Args,[{file,File},{line,Line}]} | Trace]}; #erl_func{code=Fun} -> {module,Module} = erlang:fun_info(Fun, module), {name,Name} = erlang:fun_info(Fun, name), FileName = get_filename(Module), {Line,[{{Module,Name},Args,[{file,FileName}]} | Trace]}; #erl_mfa{m=M,f=F,a=A} -> FileName = get_filename(M), %% {Line,[{{M,F},{A,Args},[{file,FileName}]} | Trace]}; %% {Line,[{{M,F},[A | Args],[{file,FileName}]} | Trace]}; {Line,[{{M,F,A},Args,[{file,FileName}]} | Trace]}; Other -> {Line,[{Other,Args,[{file,<<"-no-file-">>},{line,Line}]} | Trace]} end; do_stackframe(#current_line{line=Line}, {_,Trace}, _St) -> {Line,Trace}; do_stackframe(#loop_frame{}, Acc, _St) -> %Ignore these Acc. get_filename(Mod) -> Comp = erlang:get_module_info(Mod, compile), case lists:keyfind(source, 1, Comp) of {source,FileName} -> BaseName = filename:basename(FileName), list_to_binary(BaseName); false -> %The compiler doesn't know <<"-no-file-">> end. %% Define IS_MAP/1 macro for is_map/1 bif. -ifdef(HAS_MAPS). -define(IS_MAP(T), is_map(T)). -else. -define(IS_MAP(T), false). -endif. %% encode_list([Term], State) -> {[LuerlTerm],State}. %% encode(Term, State) -> {LuerlTerm,State}. encode_list(Ts, St) -> lists:mapfoldl(fun encode/2, St, Ts). encode(nil, St) -> {nil,St}; encode(false, St) -> {false,St}; encode(true, St) -> {true,St}; encode(B, St) when is_binary(B) -> {B,St}; encode(A, St) when is_atom(A) -> {atom_to_binary(A, utf8),St}; encode(N, St) when is_number(N) -> {N,St}; %Integers and floats encode(F, St) when ?IS_MAP(F) -> encode(maps:to_list(F), St); encode(L, St0) when is_list(L) -> {Es,{_,St1}} = lists:mapfoldl(fun ({K0,V0}, {I,S0}) -> {K1,S1} = encode(K0, S0), {V1,S2} = encode(V0, S1), {{K1,V1},{I,S2}}; (V0, {I,S0}) -> {V1,S1} = encode(V0, S0), {{I,V1},{I+1,S1}} end, {1,St0}, L), {T,St2} = luerl_heap:alloc_table(Es, St1), {T,St2}; %No more to do for now encode(F, St) when is_function(F, 2) -> F1 = fun(Args, State) -> Args1 = decode_list(Args, State), {Res, State1} = F(Args1, State), encode_list(Res, State1) end, {#erl_func{code=F1}, St}; encode(F, St) when is_function(F, 1) -> F1 = fun(Args, State) -> Args1 = decode_list(Args, State), Res = F(Args1), encode_list(Res, State) end, {#erl_func{code=F1}, St}; encode({M,F,A}, St) when is_atom(M) and is_atom(F) -> {#erl_mfa{m=M,f=F,a=A}, St}; encode({userdata,Data}, St) -> luerl_heap:alloc_userdata(Data, St); % Table refs should not be re-encoded encode(#tref{}=T, St) -> case luerl_heap:chk_table(T, St) of ok -> {T, St}; error -> error(badarg) end; encode(Term, _) -> error({badarg,Term}). %Can't encode anything else %% decode_list([LuerlTerm], State) -> [Term]. %% decode(LuerlTerm, State) -> Term. %% In decode we track of which tables we have seen to detect %% recursive references and generate an error when that occurs. decode_list(Lts, St) -> lists:map(fun (Lt) -> decode(Lt, St) end, Lts). decode(LT, St) -> decode(LT, St, []). decode(nil, _, _) -> nil; decode(false, _, _) -> false; decode(true, _, _) -> true; decode(B, _, _) when is_binary(B) -> B; decode(N, _, _) when is_number(N) -> N; %Integers and floats decode(#tref{}=T, St, In) -> decode_table(T, St, In); decode(#usdref{}=U, St, _) -> decode_userdata(U, St); decode(#funref{}=Fun, State, _) -> F = fun(Args) -> {Args1, State1} = encode_list(Args, State), {Ret, State2} = luerl_emul:functioncall(Fun, Args1, State1), decode_list(Ret, State2) end, F; %Just a bare fun decode(#erl_func{code=Fun}, _, _) -> Fun; decode(#erl_mfa{m=M,f=F,a=A}, _, _) -> {M,F,A}; decode(Lua, _, _) -> error({badarg,Lua}). %Shouldn't have anything else decode_table(#tref{i=N}=T, St, In0) -> case lists:member(N, In0) of true -> error({recursive_table,T}); %Been here before false -> In1 = [N|In0], %We are in this as well case luerl_heap:get_table(T, St) of #table{a=Arr,d=Dict} -> Fun = fun (K, V, Acc) -> [{decode(K, St, In1),decode(V, St, In1)}|Acc] end, Ts = ttdict:fold(Fun, [], Dict), array:sparse_foldr(Fun, Ts, Arr); _Undefined -> error(badarg) end end. decode_userdata(U, St) -> {#userdata{d=Data},_} = luerl_heap:get_userdata(U, St), {userdata,Data}. %% Externalize and Internalize ensure that the VM state passed in %% can be stored externally or can be recreated from external storage. %% Currently very simple: only random state needs special treatment. externalize(S) -> luerl_lib_math:externalize(S). internalize(S) -> luerl_lib_math:internalize(S). rvirding-luerl-772b25e/src/luerl_app.erl0000664000232200023220000000175015114130670020645 0ustar debalancedebalance%% Copyright (c) 2013-2021 Robert Virding %% %% Licensed under the Apache License, Version 2.0 (the "License"); %% you may not use this file except in compliance with the License. %% You may obtain a copy of the License at %% %% http://www.apache.org/licenses/LICENSE-2.0 %% %% Unless required by applicable law or agreed to in writing, software %% distributed under the License is distributed on an "AS IS" BASIS, %% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. %% See the License for the specific language governing permissions and %% limitations under the License. -module(luerl_app). -include("luerl.hrl"). ?MODULEDOC(false). -behaviour(application). %% Application callbacks -export([start/2, stop/1]). %% =================================================================== %% Application callbacks %% =================================================================== start(_StartType, _StartArgs) -> luerl_sup:start_link(). stop(_State) -> ok. rvirding-luerl-772b25e/src/luerl_emul.erl0000664000232200023220000014343515114130670021036 0ustar debalancedebalance%% Copyright (c) 2013-2024 Robert Virding %% %% Licensed under the Apache License, Version 2.0 (the "License"); %% you may not use this file except in compliance with the License. %% You may obtain a copy of the License at %% %% http://www.apache.org/licenses/LICENSE-2.0 %% %% Unless required by applicable law or agreed to in writing, software %% distributed under the License is distributed on an "AS IS" BASIS, %% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. %% See the License for the specific language governing permissions and %% limitations under the License. %% File : luerl_emul.erl %% Author : Robert Virding %% Purpose : A basic LUA 5.3 machine emulator. %% First version of emulator. Compiler so far only explicitly handles %% local/global variables. %% %% We explicitly mirror the parser rules which generate the AST and do %% not try to fold similar structures into common code. While this %% means we get more code it also becomes more explicit and clear what %% we are doing. It may also allow for specific optimisations. And %% example is that we DON'T fold 'var' and 'funcname' even though they %% are almost the same. %% %% Issues: how should we handle '...'? Now we treat it as any (local) %% variable. -module(luerl_emul). -include("luerl.hrl"). -include("luerl_comp.hrl"). -include("luerl_instrs.hrl"). ?MODULEDOC(false). %% Basic interface. -export([init/0,gc/1]). -export([call/2,call/3,emul/2]). -export([load_chunk/2,load_chunk/3]). -export([functioncall/3,methodcall/4, set_global_key/3,get_global_key/2, get_table_keys/2,get_table_keys/3, set_table_keys/3,set_table_keys/4, get_table_key/3,set_table_key/4 ]). %% Temporary shadow calls. -export([alloc_table/2,set_userdata/3,get_metamethod/3]). %% For testing. -export([pop_vals/2,push_vals/3]). -import(luerl_lib, [lua_error/2,badarg_error/3]). %% -compile(inline). %For when we are optimising %% -compile({inline,[boolean_value/1,first_value/1]}). %% -define(ITRACE_DO(Expr), ok). -define(ITRACE_DO(Expr), begin (get(luerl_itrace) /= undefined) andalso Expr end). %% Temporary shadow calls. gc(St) -> luerl_heap:gc(St). alloc_table(Itab, St) -> luerl_heap:alloc_table(Itab, St). set_userdata(Ref, Data, St) -> luerl_heap:set_userdata(Ref, Data, St). get_metamethod(Obj, Event, St) -> luerl_heap:get_metamethod(Obj, Event, St). %% init() -> State. %% Initialise the basic state. init() -> St1 = luerl_heap:init(), %% Allocate the _G table and initialise the environment {_G,St2} = luerl_lib_basic:install(St1), %Global environment St3 = St2#luerl{g=_G}, %% Now we can start adding libraries. Package MUST be first! St4 = load_lib(<<"package">>, luerl_lib_package, St3), %% Add the other standard libraries. St5 = load_libs([ {<<"bit32">>,luerl_lib_bit32}, {<<"io">>,luerl_lib_io}, {<<"math">>,luerl_lib_math}, {<<"os">>,luerl_lib_os}, {<<"string">>,luerl_lib_string}, {<<"utf8">>,luerl_lib_utf8}, {<<"table">>,luerl_lib_table}, {<<"debug">>,luerl_lib_debug} ], St4), %% Set _G variable to point to it and add it to packages.loaded. St6 = set_global_key(<<"_G">>, _G, St5), set_table_keys([<<"package">>,<<"loaded">>,<<"_G">>], _G, St6). load_libs(Libs, St) -> Fun = fun ({Key,Mod}, S) -> load_lib(Key, Mod, S) end, lists:foldl(Fun, St, Libs). %% load_lib(Key, Module, State) -> State. load_lib(Key, Mod, St0) -> {Tab,St1} = Mod:install(St0), %% Add key to global and to package.loaded. St2 = set_global_key(Key, Tab, St1), set_table_keys([<<"package">>,<<"loaded">>,Key], Tab, St2). %% set_global_key(Key, Value, State) -> State. %% get_global_key(Key, State) -> {[Val],State}. %% Access elements in the global name table, _G. set_global_key(Key, Val, #luerl{g=G}=St) -> set_table_key(G, Key, Val, St). get_global_key(Key, #luerl{g=G}=St) -> get_table_key(G, Key, St). %% get_table_keys(Keys, State) -> {Value,State}. %% get_table_keys(Tab, Keys, State) -> {Value,State}. %% Search down tables which stops when no more tables. get_table_keys(Keys, St) -> get_table_keys(St#luerl.g, Keys, St). get_table_keys(Tab, [K|Ks], St0) -> {Val,St1} = get_table_key(Tab, K, St0), get_table_keys(Val, Ks, St1); get_table_keys(Val, [], St) -> {Val,St}. %% set_table_keys(Keys, Val, State) -> State. %% set_table_keys(Tab, Keys, Val, State) -> State. %% Setter down tables. set_table_keys(Keys, Val, St) -> set_table_keys(St#luerl.g, Keys, Val, St). set_table_keys(Tab, [K], Val, St) -> set_table_key(Tab, K, Val, St); set_table_keys(Tab0, [K|Ks], Val, St0) -> {Tab1,St1} = get_table_key(Tab0, K, St0), set_table_keys(Tab1, Ks, Val, St1). %% set_table_key(Tref, Key, Value, State) -> State. %% get_table_key(Tref, Key, State) -> {Val,State}. %% Access tables, as opposed to the environment (which are also %% tables). Setting a value to 'nil' will clear it from the array but %% not from the table; however, we won't add a nil value. %% NOTE: WE ALWAYS RETURN A SINGLE VALUE! set_table_key(Tref, Key, Val, St0) -> case luerl_heap:set_table_key(Tref, Key, Val, St0) of {value,_Val,St1} -> St1; {meta,Meth,Args,St1} -> {_Ret,St2} = functioncall(Meth, Args, St1), St2; {error,Error,St1} -> lua_error(Error, St1) end. get_table_key(Tref, Key, St0) -> case luerl_heap:get_table_key(Tref, Key, St0) of {value,Val,St1} -> {Val,St1}; {meta,Meth,Args,St1} -> {Ret,St2} = functioncall(Meth, Args, St1), {first_value(Ret),St2}; {error,Error,St1} -> lua_error(Error, St1) end. %% set_local_var(Depth, Index, Var, Frames) -> Frames. %% get_local_var(Depth, Index, Frames) -> Val. set_local_var(1, I, V, [F|Fs]) -> [setelement(I, F, V)|Fs]; set_local_var(D, I, V, [F|Fs]) -> [F|set_local_var(D-1, I, V, Fs)]. get_local_var(1, I, [F|_]) -> element(I, F); get_local_var(D, I, [_|Fs]) -> get_local_var(D-1, I, Fs). %% set_env_var(Depth, Index, Val, EnvStack, State) -> State. %% get_env_var(Depth, Index, EnvStack, State) -> Val. %% We must have the state as the environments are global in the %% state. set_env_var(D, I, Val, Estk, St) -> St1 = set_env_var_1(D, I, Val, Estk, St), %% io:format("******** SEV DONE ~w ~w ********\n", [D,I]), St1. set_env_var_1(1, I, Val, [Eref|_], St) -> luerl_heap:set_env_var(Eref, I, Val, St); set_env_var_1(2, I, Val, [_,Eref|_], St) -> luerl_heap:set_env_var(Eref, I, Val, St); set_env_var_1(D, I, Val, Env, St) -> luerl_heap:set_env_var(lists:nth(D, Env), I, Val, St). get_env_var(D, I, Env, St) -> Val = get_env_var_1(D, I, Env, St), %% io:format("******** GEV DONE ~w ~w ********\n", [D, I]), Val. get_env_var_1(1, I, [Eref|_], St) -> luerl_heap:get_env_var(Eref, I, St); get_env_var_1(2, I, [_,Eref|_], St) -> luerl_heap:get_env_var(Eref, I, St); get_env_var_1(D, I, Env, St) -> luerl_heap:get_env_var(lists:nth(D, Env), I, St). %% load_chunk(FunctionDefCode, State) -> {Function,State}. %% load_chunk(FunctionDefCode, Env, State) -> {Function,State}. %% Load a chunk from the compiler which is a compiled function %% definition whose instructions define everything. Return a callable %% function reference which defines everything and a updated Luerl %% state. load_chunk(Code, St) -> load_chunk(Code, [], St). load_chunk([Code], [], St0) -> {?PUSH_FDEF(Funref),_,St1} = load_chunk_i(Code, [], St0), {Funref,St1}. %% load_chunk_i(Instr, FuncRefs, Status) -> {Instr,FuncRefs,State}. %% load_chunk_is(Instrs, FuncRefs, Status) -> {Instrs,FuncRefs,State}. %% Load chunk instructions. We keep track of the functions refs and %% save the ones directly accessed in each function. This will make %% gc easier as we will not have to step through the function code at %% gc time. load_chunk_is([I0|Is0], Funrs0, St0) -> {I1,Funrs1,St1} = load_chunk_i(I0, Funrs0, St0), {Is1,Funrs2,St2} = load_chunk_is(Is0, Funrs1, St1), {[I1|Is1],Funrs2,St2}; load_chunk_is([], Funrs, St) -> {[],Funrs,St}. %% First the instructions with nested code. %% We include the dymanmic instructions here even though the compiler %% does not generate them. This should make us more future proof. load_chunk_i(?PUSH_FDEF(Anno, Lsz, Esz, Pars, B0), Funrs0, St0) -> {B1,Funrs,St1} = load_chunk_is(B0, [], St0), Fdef = #lua_func{anno=Anno,funrefs=Funrs,lsz=Lsz,esz=Esz,pars=Pars,body=B1}, {Funref,St2} = luerl_heap:alloc_funcdef(Fdef, St1), Funrs1 = ordsets:add_element(Funref, Funrs0), {?PUSH_FDEF(Funref),Funrs1,St2}; load_chunk_i(?BLOCK(Lsz, Esz, B0), Funrs0, St0) -> {B1,Funrs1,St1} = load_chunk_is(B0, Funrs0, St0), {?BLOCK(Lsz, Esz, B1),Funrs1,St1}; load_chunk_i(?REPEAT(B0), Funrs0, St0) -> {B1,Funrs1,St1} = load_chunk_is(B0, Funrs0, St0), {?REPEAT(B1),Funrs1,St1}; load_chunk_i(?REPEAT_LOOP(B0), Funrs0, St0) -> %This is dynamic {B1,Funrs1,St1} = load_chunk_is(B0, Funrs0, St0), {?REPEAT_LOOP(B1),Funrs1,St1}; load_chunk_i(?WHILE(E0, B0), Funrs0, St0) -> {E1,Funrs1,St1} = load_chunk_is(E0, Funrs0, St0), {B1,Funrs2,St2} = load_chunk_is(B0, Funrs1, St1), {?WHILE(E1, B1),Funrs2,St2}; load_chunk_i(?WHILE_LOOP(E0, B0), Funrs0, St0) -> {E1,Funrs1,St1} = load_chunk_is(E0, Funrs0, St0), {B1,Funrs2,St2} = load_chunk_is(B0, Funrs1, St1), {?WHILE_LOOP(E1, B1),Funrs2,St2}; load_chunk_i(?AND_THEN(T0), Funrs0, St0) -> {T1,Funrs1,St1} = load_chunk_is(T0, Funrs0, St0), {?AND_THEN(T1),Funrs1,St1}; load_chunk_i(?OR_ELSE(T0), Funrs0, St0) -> {T1,Funrs1,St1} = load_chunk_is(T0, Funrs0, St0), {?OR_ELSE(T1),Funrs1,St1}; load_chunk_i(?IF_TRUE(T0), Funrs0, St0) -> {T1,Funrs1,St1} = load_chunk_is(T0, Funrs0, St0), {?IF_TRUE(T1),Funrs1,St1}; load_chunk_i(?IF(T0, F0), Funrs0, St0) -> {T1,Funrs1,St1} = load_chunk_is(T0, Funrs0, St0), {F1,Funrs2,St2} = load_chunk_is(F0, Funrs1, St1), {?IF(T1, F1),Funrs2,St2}; load_chunk_i(?NFOR(V, B0), Funrs0, St0) -> {B1,Funrs1,St1} = load_chunk_is(B0, Funrs0, St0), {?NFOR(V, B1),Funrs1,St1}; load_chunk_i(?NFOR_LOOP(N, L, S, B0), Funrs0, St0) -> %This is dynamic {B1,Funrs1,St1} = load_chunk_is(B0, Funrs0, St0), {?NFOR_LOOP(N, L, S, B1),Funrs1,St1}; load_chunk_i(?GFOR(Vs, B0), Funrs0, St0) -> {B1,Funrs1,St1} = load_chunk_is(B0, Funrs0, St0), {?GFOR(Vs, B1),Funrs1,St1}; load_chunk_i(?GFOR_CALL(F, D, V, B0), Funrs0, St0) -> %This is dynamic {B1,Funrs1,St1} = load_chunk_is(B0, Funrs0, St0), {?GFOR_CALL(F, D, V, B1),Funrs1,St1}; load_chunk_i(?GFOR_LOOP(F, D, B0), Funrs0, St0) -> %This is dynamic {B1,Funrs1,St1} = load_chunk_is(B0, Funrs0, St0), {?GFOR_LOOP(F, D, B1),Funrs1,St1}; %% Then the rest which we don't have to worry about. load_chunk_i(I, Funrs, St) -> {I,Funrs,St}. %% call(Function, State) -> {Return,State}. %% call(Function, Args, State) -> {Return,State}. %% functioncall(Function, Args, State) -> {Return,State}. %% methodcall(Object, Method, Args, State) -> {Return,State}. %% These ares called from the outside and expect everything necessary %% to be in the state. call(Func, St) -> call(Func, [], St). call(#funref{}=Funref, Args, St0) -> %Lua function {Ret,St1} = functioncall(Funref, Args, St0), %% Should do GC here. {Ret,St1}; call(#erl_func{}=Func, Args, St0) -> %Erlang function {Ret,St1} = functioncall(Func, Args, St0), %% Should do GC here. {Ret,St1}; call(#erl_mfa{}=Func, Args, St0) -> %Erlang function as MFA triplet {Ret,St1} = functioncall(Func, Args, St0), {Ret,St1}. functioncall(Func, Args, #luerl{stk=Stk}=St0) -> Fr = #call_frame{func=Func,args=Args,lvs=[],env=[],is=[],cont=[]}, Cs0 = [Fr], {_Lvs,[Ret|_],_Env,Cs1,St1} = call_function(Func, Args, Stk, Cs0, St0), {Ret,St1#luerl{stk=Stk,cs=Cs1}}. %Reset the stacks methodcall(Obj, Meth, Args, St0) -> %% Get the function to call from object and method. case get_table_key(Obj, Meth, St0) of {nil,St1} -> %No method lua_error({undefined_method,Obj,Meth}, St1); {Func,St1} -> functioncall(Func, [Obj|Args], St1) end. %% emul(Instrs, State). %% emul(Instrs, Continuation, LocalVariables, Stack, Env, CallStack, State). %% The cost of checking the itrace process variable is very slight %% compared to everything else. emul(Is, St) -> emul(Is, [], {}, [], [], [], St). %% The faster (yeah sure) version. %% emul(Is, Cont, Lvs, Stk, Env, Cs, St) -> %% emul_1(Is, Cont, Lvs, Stk, Env, Cs, St). %% The tracing versions. emul([I|_]=Is, Cont, Lvs, Stk, Env, Cs, St) -> ?ITRACE_DO(begin io:fwrite("Is: ~p\n", [Is]), io:fwrite("Cnt: ~p\n", [Cont]), io:fwrite("Lvs: ~p\n", [Lvs]), io:fwrite("Env: ~p\n", [Env]), io:fwrite("Stk: ~p\n", [Stk]), io:fwrite("Cs: ~p\n", [Cs]), io:fwrite("I: ~p\n", [I]), io:put_chars("--------\n") end), emul_1(Is, Cont, Lvs, Stk, Env, Cs, St); emul([], Cont, Lvs, Stk, Env, Cs, St) -> ?ITRACE_DO(begin io:fwrite("Is: ~p\n", [[]]), io:fwrite("Cnt: ~p\n", [Cont]), io:fwrite("Lvs: ~p\n", [Lvs]), io:fwrite("Env: ~p\n", [Env]), io:fwrite("Stk: ~p\n", [Stk]), io:fwrite("Cs: ~p\n", [Cs]), io:put_chars("--------\n") end), emul_1([], Cont, Lvs, Stk, Env, Cs, St). %% itrace_print(Format, Args) -> %% ?ITRACE_DO(io:fwrite(Format, Args)). %% Expression instructions. emul_1([?PUSH_LIT(L)|Is], Cont, Lvs, Stk, Env, Cs, St) -> emul(Is, Cont, Lvs, [L|Stk], Env, Cs, St); emul_1([?PUSH_LVAR(D, I)|Is], Cont, Lvs, Stk, Env, Cs, St) -> Val = get_local_var(D, I, Lvs), emul(Is, Cont, Lvs, [Val|Stk], Env, Cs, St); emul_1([?PUSH_EVAR(D, I)|Is], Cont, Lvs, Stk, Env, Cs, St) -> Val = get_env_var(D, I, Env, St), emul(Is, Cont, Lvs, [Val|Stk], Env, Cs, St); emul_1([?PUSH_GVAR(Key)|Is], Cont, Lvs, Stk, Env, Cs, St0) -> %% We must handle the metamethod and error here. case luerl_heap:get_global_key(Key, St0) of {value,Val,St1} -> emul(Is, Cont, Lvs, [Val|Stk], Env, Cs, St1); {meta,Meth,Args,St1} -> emul([?FCALL,?SINGLE|Is], Cont, Lvs, [Args,Meth|Stk], Env, Cs, St1); {error,Error,St1} -> lua_error(Error, St1#luerl{stk=Stk,cs=Cs}) end; emul_1([?PUSH_LAST_LIT(L)|Is], Cont, Lvs, Stk, Env, Cs, St) -> emul(Is, Cont, Lvs, [[L]|Stk], Env, Cs, St); emul_1([?PUSH_LAST_LVAR(D, I)|Is], Cont, Lvs, Stk, Env, Cs, St) -> Val = get_local_var(D, I, Lvs), emul(Is, Cont, Lvs, [[Val]|Stk], Env, Cs, St); emul_1([?PUSH_LAST_EVAR(D, I)|Is], Cont, Lvs, Stk, Env, Cs, St) -> Val = get_env_var(D, I, Env, St), emul(Is, Cont, Lvs, [[Val]|Stk], Env, Cs, St); emul_1([?PUSH_LAST_GVAR(Key)|Is], Cont, Lvs, Stk, Env, Cs, St0) -> %% We must handle the metamethod and error here. case luerl_heap:get_global_key(Key, St0) of {value,Val,St1} -> emul(Is, Cont, Lvs, [[Val]|Stk], Env, Cs, St1); {meta,Meth,Args,St1} -> emul([?FCALL|Is], Cont, Lvs, [Args,Meth|Stk], Env, Cs, St1); {error,Error,St1} -> lua_error(Error, St1#luerl{stk=Stk,cs=Cs}) end; emul_1([?STORE_LVAR(D, I)|Is], Cont, Lvs0, [Val|Stk], Env, Cs, St) -> Lvs1 = set_local_var(D, I, Val, Lvs0), emul(Is, Cont, Lvs1, Stk, Env, Cs, St); emul_1([?STORE_EVAR(D, I)|Is], Cont, Lvs, [Val|Stk], Env, Cs, St0) -> St1 = set_env_var(D, I, Val, Env, St0), emul(Is, Cont, Lvs, Stk, Env, Cs, St1); emul_1([?STORE_GVAR(Key)|Is], Cont, Lvs, [Val|Stk], Env, Cs, St0) -> %% We must handle the metamethod and error here. case luerl_heap:set_global_key(Key, Val, St0) of {value,_,St1} -> emul(Is, Cont, Lvs, Stk, Env, Cs, St1); {meta,Meth,Args,St1} -> emul([?FCALL,?POP|Is], Cont, Lvs, [Args,Meth|Stk], Env, Cs, St1); {error,Error,St1} -> lua_error(Error, St1#luerl{stk=Stk,cs=Cs}) end; emul_1([?GET_KEY|Is], Cont, Lvs, [Key,Tab|Stk], Env, Cs, St) -> do_get_key(Is, Cont, Lvs, Stk, Env, Cs, St, Tab, Key); emul_1([?GET_LIT_KEY(Key)|Is], Cont, Lvs, [Tab|Stk], Env, Cs, St) -> %% [?PUSH_LIT(Key),?GET_KEY] do_get_key(Is, Cont, Lvs, Stk, Env, Cs, St, Tab, Key); emul_1([?SET_KEY|Is], Cont, Lvs, [Key,Tab,Val|Stk], Env, Cs, St) -> do_set_key(Is, Cont, Lvs, Stk, Env, Cs, St, Tab, Key, Val); emul_1([?SET_LIT_KEY(Key)|Is], Cont, Lvs, [Tab,Val|Stk], Env, Cs, St) -> %% [?PUSH_LIT(Key),?SET_KEY] do_set_key(Is, Cont, Lvs, Stk, Env, Cs, St, Tab, Key, Val); emul_1([?SINGLE|Is], Cont, Lvs, [Val|Stk], Env, Cs, St) -> emul(Is, Cont, Lvs, [first_value(Val)|Stk], Env, Cs, St); emul_1([?MULTIPLE|Is], Cont, Lvs, [Val|Stk], Env, Cs, St) -> emul(Is, Cont, Lvs, [multiple_value(Val)|Stk], Env, Cs, St); emul_1([?BUILD_TAB(Fc, I)|Is], Cont, Lvs, Stk0, Env, Cs, St0) -> {Tab,Stk1,St1} = build_tab(Fc, I, Stk0, St0), emul(Is, Cont, Lvs, [Tab|Stk1], Env, Cs, St1); emul_1([?FCALL|Is], Cont, Lvs, Stk, Env, Cs, St) -> do_fcall(Is, Cont, Lvs, Stk, Env, Cs, St); emul_1([?TAIL_FCALL|Is], Cont, Lvs, Stk, Env, Cs, St) -> do_tail_fcall(Is, Cont, Lvs, Stk, Env, Cs, St); emul_1([?MCALL(M)|Is], Cont, Lvs, Stk, Env, Cs, St) -> do_mcall(Is, Cont, Lvs, Stk, Env, Cs, St, M); emul_1([?TAIL_MCALL(M)|Is], Cont, Lvs, Stk, Env, Cs, St) -> do_tail_mcall(Is, Cont, Lvs, Stk, Env, Cs, St, M); emul_1([?OP(Op,1)|Is], Cont, Lvs, Stk, Env, Cs, St) -> do_op1(Is, Cont, Lvs, Stk, Env, Cs, St, Op); emul_1([?OP(Op,2)|Is], Cont, Lvs, Stk, Env, Cs, St) -> do_op2(Is, Cont, Lvs, Stk, Env, Cs, St, Op); emul_1([?PUSH_FDEF(Funref)|Is], Cont, Lvs, Stk, Env, Cs, St0) -> %% Update the env field of the function reference with the current %% environment. Funref1 = Funref#funref{env=Env}, emul(Is, Cont, Lvs, [Funref1|Stk], Env, Cs, St0); %% Control instructions. emul_1([?BLOCK(Lsz, Esz, Bis)|Is], Cont, Lvs, Stk, Env, Cs, St) -> do_block(Is, Cont, Lvs, Stk, Env, Cs, St, Lsz, Esz, Bis); emul_1([?BLOCK_OPEN(Lsz, Esz)|Is], Cont, Lvs, Stk, Env, Cs, St) -> do_block_open(Is, Cont, Lvs, Stk, Env, Cs, St, Lsz, Esz); emul_1([?BLOCK_CLOSE|Is], Cont, Lvs, Stk, Env, Cs, St) -> do_block_close(Is, Cont, Lvs, Stk, Env, Cs, St); emul_1([?WHILE(Eis, Wis)|Is], Cont, Lvs, Stk, Env, Cs, St) -> do_while(Is, Cont, Lvs, Stk, Env, Cs, St, Eis, Wis); emul_1([?WHILE_LOOP(Eis, Wis)|Is], Cont, Lvs, Stk, Env, Cs, St) -> do_while_loop(Is, Cont, Lvs, Stk, Env, Cs, St, Eis, Wis); emul_1([?REPEAT(Ris)|Is], Cont, Lvs, Stk, Env, Cs, St) -> do_repeat(Is, Cont, Lvs, Stk, Env, Cs, St, Ris); emul_1([?REPEAT_LOOP(Ris)|Is], Cont, Lvs, Stk, Env, Cs, St) -> do_repeat_loop(Is, Cont, Lvs, Stk, Env, Cs, St, Ris); emul_1([?AND_THEN(Then)|Is], Cont, Lvs, Stk, Env, Cs, St) -> do_and_then(Is, Cont, Lvs, Stk, Env, Cs, St, Then); emul_1([?OR_ELSE(Else)|Is], Cont, Lvs, Stk, Env, Cs, St) -> do_or_else(Is, Cont, Lvs, Stk, Env, Cs, St, Else); emul_1([?IF_TRUE(True)|Is], Cont, Lvs, Stk, Env, Cs, St) -> do_if_true(Is, Cont, Lvs, Stk, Env, Cs, St, True); emul_1([?IF(True, False)|Is], Cont, Lvs, Stk, Env, Cs, St) -> do_if(Is, Cont, Lvs, Stk, Env, Cs, St, True, False); emul_1([?NFOR(V, Fis)|Is], Cont, Lvs, Stk, Env, Cs, St) -> do_numfor(Is, Cont, Lvs, Stk, Env, Cs, St, V, Fis); emul_1([?NFOR_LOOP(N,L,S,Fis)|Is], Cont, Lvs, Stk, Env, Cs, St) -> do_numfor_loop(Is, Cont, Lvs, Stk, Env, Cs, St, N, L, S, Fis); emul_1([?GFOR(Vs, Fis)|Is], Cont, Lvs, Stk, Env, Cs, St) -> do_genfor(Is, Cont, Lvs, Stk, Env, Cs, St, Vs, Fis); emul_1([?GFOR_CALL(Func, Data, Val, Fis)|Is], Cont, Lvs, Stk, Env, Cs, St) -> do_genfor_call(Is, Cont, Lvs, Stk, Env, Cs, St, Func, Data, Val, Fis); emul_1([?GFOR_LOOP(Func, Data, Fis)|Is], Cont, Lvs, Stk, Env, Cs, St) -> do_genfor_loop(Is, Cont, Lvs, Stk, Env, Cs, St, Func, Data, Fis); emul_1([?BREAK|_], _Cont, Lvs, _Stk, _Env, Cs, St) -> do_break(Lvs, Cs, St); emul_1([?RETURN(Ac)|_], _Cont, _Lvs, Stk, _Env, Cs, St) -> do_return(Ac, Stk, Cs, St); %% Stack instructions emul_1([?POP|Is], Cont, Lvs, [_|Stk], Env, Cs, St) -> emul(Is, Cont, Lvs, Stk, Env, Cs, St); emul_1([?POP2|Is], Cont, Lvs, [_,_|Stk], Env, Cs, St) -> emul(Is, Cont, Lvs, Stk, Env, Cs, St); emul_1([?SWAP|Is], Cont, Lvs, [S1,S2|Stk], Env, Cs, St) -> emul(Is, Cont, Lvs, [S2,S1|Stk], Env, Cs, St); emul_1([?DUP|Is], Cont, Lvs, [V|_]=Stk, Env, Cs, St) -> emul(Is, Cont, Lvs, [V|Stk], Env, Cs, St); emul_1([?PUSH_VALS(Vc)|Is], Cont, Lvs, [Vals|Stk0], Env, Cs, St) -> %% Pop value list off the stack and push Vc vals from it. Stk1 = push_vals(Vc, Vals, Stk0), emul(Is, Cont, Lvs, Stk1, Env, Cs, St); emul_1([?POP_VALS(Vc)|Is], Cont, Lvs, Stk0, Env, Cs, St) -> %% Pop Vc vals off the stack, put in a list and push onto the stack. {Vals,Stk1} = pop_vals(Vc, Stk0), emul(Is, Cont, Lvs, [Vals|Stk1], Env, Cs, St); emul_1([?PUSH_ARGS(Al)|Is], Cont, Lvs, [Args|Stk0], Env, Cs, St) -> %% Pop argument list off the stack and push args onto the stack. Stk1 = push_args(Al, Args, Stk0), emul(Is, Cont, Lvs, Stk1, Env, Cs, St); emul_1([?POP_ARGS(Ac)|Is], Cont, Lvs, Stk0, Env, Cs, St) -> %% Pop Ac args off the stack, put in a list and push onto the stack. {Args,Stk1} = pop_vals(Ac, Stk0), emul(Is, Cont, Lvs, [Args|Stk1], Env, Cs, St); emul_1([?COMMENT(_)|Is], Cont, Lvs, Stk, Env, Cs, St) -> %% This just a comment which is ignored. emul(Is, Cont, Lvs, Stk, Env, Cs, St); emul_1([?CURRENT_LINE(Line,File)|Is], Cont, Lvs, Stk, Env, Cs, St) -> do_current_line(Is, Cont, Lvs, Stk, Env, Cs, St, Line, File); emul_1([], [Is|Cont], Lvs, Stk, Env, Cs, St) -> emul(Is, Cont, Lvs, Stk, Env, Cs, St); emul_1([], [], Lvs, Stk, Env, Cs, St) -> {Lvs,Stk,Env,Cs,St}. %% pop_vals(Count, Stack) -> {ValList,Stack}. %% pop_vals(Count, Stack, ValList) -> {ValList,Stack}. %% Pop Count values off the stack and push onto the value list. %% First value is deepest. Always generates list. pop_vals(0, Stk) -> {[],Stk}; pop_vals(C, [Vtail|Stk]) -> %This a list tail pop_vals(C-1, Stk, Vtail). pop_vals(0, Stk, Vs) -> {Vs,Stk}; pop_vals(1, [V|Stk], Vs) -> {[V|Vs],Stk}; pop_vals(2, [V2,V1|Stk], Vs) -> {[V1,V2|Vs],Stk}; pop_vals(C, [V2,V1|Stk], Vs) -> pop_vals(C-2, Stk, [V1,V2|Vs]). %% push_vals(Count, ValList, Stack) -> Stack. %% Push Count values from ValList onto the stack. First value is %% deepest. Fill with 'nil' if not enough values. push_vals(0, _, Stk) -> Stk; push_vals(C, [V|Vs], Stk) -> push_vals(C-1, Vs, [V|Stk]); push_vals(C, [], Stk) -> push_vals(C-1, [], [nil|Stk]). %% push_args(Varlist, ArgList, Stack) -> Stack. %% Use Varlist to push args from ArgList onto the stack. First arg is %% deepest. Tail of VarList determines whether there are varargs. push_args([_V|Vs], [A|As], Stk) -> push_args(Vs, As, [A|Stk]); push_args([_V|Vs], [], Stk) -> push_args(Vs, [], [nil|Stk]); push_args([], _As, Stk) -> Stk; %Drop the rest push_args(_V, As, Stk) -> %Varargs ... save as list [As|Stk]. %% do_set_key(Instrs, LocalVars, Stack, Env, State, Table, Key, Val) -> %% ReturnFromEmul. %% do_get_key(Instrs, LocalVars, Stack, Env, State, Table, Key) -> %% ReturnFromEmul. do_set_key(Is, Cont, Lvs, Stk, Env, Cs, St0, Tab, Key, Val) -> %% We must handle the metamethod and error here. case luerl_heap:set_table_key(Tab, Key, Val, St0) of {value,_,St1} -> emul(Is, Cont, Lvs, Stk, Env, Cs, St1); {meta,Meth,Args,St1} -> emul([?FCALL,?POP|Is], Cont, Lvs, [Args,Meth|Stk], Env, Cs, St1); {error,Error,St1} -> lua_error(Error, St1#luerl{stk=Stk,cs=Cs}) end. do_get_key(Is, Cont, Lvs, Stk, Env, Cs, St0, Tab, Key) -> %% We must handle the metamethod and error here. case luerl_heap:get_table_key(Tab, Key, St0) of {value,Val,St1} -> emul(Is, Cont, Lvs, [Val|Stk], Env, Cs, St1); {meta,Meth,Args,St1} -> emul([?FCALL,?SINGLE|Is], Cont, Lvs, [Args,Meth|Stk], Env, Cs, St1); {error,Error,St1} -> lua_error(Error, St1#luerl{stk=Stk,cs=Cs}) end. %% do_op1(Instrs, LocalVars, Stack, Env, State, Op) -> ReturnFromEmul. %% do_op2(Instrs, LocalVars, Stack, Env, State, Op) -> ReturnFromEmul. do_op1(Is, Cont, Lvs, [A|Stk], Env, Cs, St0, Op) -> %% We must handle the metamethod and error here. case op(Op, A, St0) of {value,Res,St1} -> emul(Is, Cont, Lvs, [Res|Stk], Env, Cs, St1); {meta,Meth,Args,St1} -> emul([?FCALL,?SINGLE|Is], Cont, Lvs, [Args,Meth|Stk], Env, Cs, St1); {error,Error,St1} -> lua_error(Error, St1#luerl{stk=Stk,cs=Cs}) end. do_op2(Is, Cont, Lvs, [A2,A1|Stk], Env, Cs, St0, Op) -> %% We must handle the metamethod and error here. case op(Op, A1, A2, St0) of {value,Res,St1} -> emul(Is, Cont, Lvs, [Res|Stk], Env, Cs, St1); {meta,Meth,Args,St1} -> emul([?FCALL,?SINGLE|Is], Cont, Lvs, [Args,Meth|Stk], Env, Cs, St1); {error,Error,St1} -> lua_error(Error, St1#luerl{stk=Stk,cs=Cs}) end. %% do_break(LocalVars, CallStack, State) -> . do_break(Lvs0, Cs0, St) -> {Bf,Cs1} = find_loop_frame(Cs0, St), #loop_frame{is=Is,cont=Cont,lvs=Lvs1,stk=Stk,env=Env} = Bf, %% Trim the new local variable stack down to original length. Lvs2 = lists:nthtail(length(Lvs0)-length(Lvs1), Lvs0), emul(Is, Cont, Lvs2, Stk, Env, Cs1, St). %% do_return(ArgCount, Stack, Callstack, State) -> . do_return(Ac, Stk0, Cs0, St0) -> {Cf,Cs1} = find_call_frame(Cs0, St0), %Find the first call frame {Ret,Stk1} = pop_vals(Ac, Stk0), %% When tracing bring the state up to date and call the tracer. Tfunc = St0#luerl.trace_func, St1 = if is_function(Tfunc) -> Tfunc(?RETURN(Ret), St0#luerl{stk=Stk1,cs=Cs1}); true -> St0 end, #call_frame{is=Is,cont=Cont,lvs=Lvs,env=Env} = Cf, emul(Is, Cont, Lvs, [Ret|Stk1], Env, Cs1, St1#luerl{cs=Cs1}). find_call_frame([#call_frame{}=Cf|Cs], _St) -> {Cf,Cs}; find_call_frame([_|Cs], St) -> find_call_frame(Cs, St). find_loop_frame([#current_line{}|Cs], St) -> %Skip current line info find_loop_frame(Cs, St); find_loop_frame([#loop_frame{}=Bf|Cs], _St) -> {Bf,Cs}; find_loop_frame(Cs, St) -> lua_error({illegal_op,break}, St#luerl{cs=Cs}). %% do_current_line(Instrs, Continuation, LocalVars, Stack, Env, Stack, State, %% Line, File). do_current_line(Is, Cont, Lvs, Stk, Env, Cs0, St0, Line, File) -> Cs1 = push_current_line(Cs0, Line, File), %Push onto callstack %% When tracing bring the state up to date and call the tracer. Tfunc = St0#luerl.trace_func, St1 = if is_function(Tfunc) -> Tfunc(?CURRENT_LINE(Line, File), St0#luerl{stk=Stk,cs=Cs1}); true -> St0 end, emul(Is, Cont, Lvs, Stk, Env, Cs1, St1). %% push_current_line(CallStack, CurrLine, FileName) -> CallStack. %% Push the current line info on the stack replacing an existing one %% on the top. push_current_line([#current_line{}|Cs], Line, File) -> [#current_line{line=Line,file=File}|Cs]; push_current_line(Cs, Line, File) -> [#current_line{line=Line,file=File}|Cs]. %% do_fcall(Instrs, LocalVars, Stack, Env, State) -> ReturnFromEmul. %% Pop arg list and function from stack and do call. do_fcall(Is, Cont, Lvs, [Args,Func|Stk], Env, Cs, St) -> functioncall(Is, Cont, Lvs, Stk, Env, Cs, St, Func, Args). %% functioncall(Instrs, Cont, LocalVars, Stk, Env, CallStack, State, Func, Args) -> %% %% This is called from within code and continues with Instrs after %% call. It must move everything into State. functioncall(Is, Cont, Lvs, Stk, Env, Cs0, St, Func, Args) -> Fr = #call_frame{func=Func,args=Args,lvs=Lvs,env=Env,is=Is,cont=Cont}, Cs1 = [Fr|Cs0], call_function(Func, Args, Stk, Cs1, St). %% do_tail_fcall(Instrs, Cont, LocalVars, Stack, Env, State) -> %% ReturnFromEmul. do_tail_fcall(_Is, _Cont, _Lvs, [Args,Func|_Stk], _Env, Cs, St) -> error({tail_fcall,Func,Args,Cs,St}). %% do_mcall(Instrs, Cont, LocalVars, Stack, Env, State, Method) -> do_mcall(Is, Cont, Lvs, [Args,Obj|Stk], Env, Cs, St, M) -> methodcall(Is, Cont, Lvs, Stk, Env, Cs, St, Obj, M, Args). %% methodcall(Instrs, Cont, Var, Stk, Env, State, Object, Method, Args) -> %% %% This is called from within code and continues with Instrs after %% call. It must move everything into State. methodcall(Is, Cont, Lvs, Stk, Env, Cs, St0, Obj, Meth, Args) -> %% Get the function to call from object and method. %% We must handle the metamethod and error here. %% io:format("mc1 ~p ~p ~p\n", [Obj,Meth,Args]), case luerl_heap:get_table_key(Obj, Meth, St0) of {value,Func,St1} -> %% io:format("mc2 ~p\n", [Func]), functioncall(Is, Cont, Lvs, Stk, Env, Cs, St1, Func, [Obj|Args]); {meta,Mmeth,Margs,St1} -> %% io:format("mc3 ~p ~p\n", [Mmeth,Margs]), %% Must first meta method to get function and then call it. %% Need to swap to get arguments for call in right order. Is1 = [?FCALL,?SINGLE,?SWAP,?FCALL|Is], emul(Is1, Cont, Lvs, [Margs,Mmeth,[Obj|Args]|Stk], Env, Cs, St1); {error,_Error,St1} -> %No method lua_error({undefined_method,Obj,Meth}, St1#luerl{stk=Stk,cs=Cs}) end. %% do_tail_mcall(Instrs, Cont, LocalVars, Stack, Env, State, Method) -> %% . do_tail_mcall(_Is, _Cont, _Lvs, [Args,Obj|_Stk], _Env, Cs, St, Meth) -> error({tail_mcall,Obj,Meth,Args,Cs,St}). %% call_function(Function, Args, Stack, CallStack, State) -> {Return,State}. %% Setup environment for function and do the actual call. call_function(#funref{env=Env}=Funref, Args, Stk, Cs, St0) -> St1 = trace_call(Funref, Args, Stk, Cs, St0), %% Here we must save the stack in state as function may need it. {Func,St2} = luerl_heap:get_funcdef(Funref, St1#luerl{stk=Stk}), call_luafunc(Func, Args, Stk, Env, Cs, St2); call_function(#erl_func{code=Func}=Funref, Args, Stk, Cs, St0) -> St1 = trace_call(Funref, Args, Stk, Cs, St0), call_erlfunc(Func, Args, Stk, Cs, St1); call_function(#erl_mfa{m=M,f=F,a=A}=Funref, Args, Stk, Cs, St0) -> St1 = trace_call(Funref, Args, Stk, Cs, St0), call_erlmfa({M,F,A}, Args, Stk, Cs, St1); call_function(Func, Args, Stk, Cs, St) -> case luerl_heap:get_metamethod(Func, <<"__call">>, St) of nil -> lua_error({undefined_function,Func}, St#luerl{stk=Stk,cs=Cs}); Meta -> call_function(Meta, [Func|Args], Stk, Cs, St) end. %% trace_call((Function, Args, Stack, CallStack, State) -> State. %% Trace the function call when required. trace_call(Funref, Args, _Stk, _Cs, St) -> %% When tracing bring the state up to date and call the tracer. Tfunc = St#luerl.trace_func, if is_function(Tfunc) -> Tfunc({fcall,Funref,Args}, St); true -> St end. %% call_luafunc(LuaFunc, Args, Stack, Env, CallStack, State) -> {Return,State}. %% Make the local variable and Env frames and push them onto %% respective stacks and call the function. call_luafunc(#lua_func{lsz=Lsz,esz=Esz,pars=_Pars,body=Fis}, Args, Stk0, Env0, Cs, St0) -> L = make_loc_frame(Lsz), {Eref,St1} = make_env_frame(Esz, St0), Lvs = [L], Stk1 = [Args|Stk0], Env1 = [Eref|Env0], %% Tag = St0#luerl.tag, %% io:fwrite("fc: ~p\n", [{Lvs,Env,St0#luerl.env}]), emul(Fis, [], Lvs, Stk1, Env1, Cs, St1). %% call_erlfunc(ErlFunc, Args, Stack, CallStack, State) -> {Return,State}. %% Here we must save the stacks in state as function may need it. %% Note we leave the call frame to the erlang function on the call %% stack. It is popped when we return. call_erlfunc(Func, Args, Stk, Cs0, #luerl{stk=Stk0}=St0) -> case Func(Args, St0#luerl{stk=Stk,cs=Cs0}) of %% {Ret,#luerl{}=St1} when is_list(Ret) -> {Ret,St1} when is_list(Ret) -> [#call_frame{is=Is,cont=Cont,lvs=Lvs,env=Env}|Cs1] = Cs0, emul(Is, Cont, Lvs, [Ret|Stk], Env, Cs1, St1#luerl{stk=Stk0,cs=Cs1}); {lua_error, Reason, St1} -> lua_error(Reason, St1); _Other -> %% Don't include the erl_func in the call stack. lua_error(illegal_return_value, St0#luerl{stk=Stk0,cs=tl(Cs0)}) end. %% call_erlmfa({M,F,A}, Args, Stack, CallStack, State) -> {Return,State}. %% We have two sets of arguments here: the "configured" ones that always %% get passed to the function (A) and the "runtime" ones that are specific %% to this call (Args). For simplicity, we combine them into a list so you %% get a ternary function receiving (A, Args, State). call_erlmfa({M,F,A}, Args, Stk, Cs0, #luerl{stk=Stk0}=St0) -> case apply(M, F, [A, Args, St0#luerl{stk=Stk,cs=Cs0}]) of {Ret,St1} when is_list(Ret) -> [#call_frame{is=Is,cont=Cont,lvs=Lvs,env=Env}|Cs1] = Cs0, emul(Is, Cont, Lvs, [Ret|Stk], Env, Cs1, St1#luerl{stk=Stk0,cs=Cs1}); {lua_error, Reason, St1} -> lua_error(Reason, St1); _Other -> %% Don't include the erl_func in the call stack. lua_error(illegal_return_value, St0#luerl{stk=Stk0,cs=tl(Cs0)}) end. %% do_block(Instrs, LocalVars, Stack, Env, State, %% LocalSize, EnvSize, BlockInstrs) -> . %% Local vars may have been updated so must continue with returned %% version. We also continue with returned stack. There should be no %% changes in the env. do_block(Is, Cont, Lvs, Stk, Env, Cs, St0, Lsz, Esz, Bis) -> L = make_loc_frame(Lsz), {Eref,St1} = make_env_frame(Esz, St0), emul(Bis, [Is|Cont], [L|Lvs], Stk, [Eref|Env], Cs, St1). %% do_block_open(Instrs, LocalVars, Stack, Env, State, %% LocalSize, EnvSize) -> . %% Local vars may have been updated so must continue with returned %% version. We also continue with returned stack. There should be no %% changes in the env. do_block_open(Is, Cont, Lvs, Stk, Env, Cs, St0, Lsz, Esz) -> L = make_loc_frame(Lsz), {Eref,St1} = make_env_frame(Esz, St0), emul(Is, Cont, [L|Lvs], Stk, [Eref|Env], Cs, St1). %% do_block_close(Instrs, LocalVars, Stack, Env, State, %% LocalSize, EnvSize) -> . %% Pop the block local variables and environment variables. do_block_close(Is, Cont, [_|Lvs], Stk, [_|Env], Cs, St) -> emul(Is, Cont, Lvs, Stk, Env, Cs, St). make_env_frame(0, St) -> {not_used,St}; make_env_frame(Esz, St) -> luerl_heap:alloc_environment(Esz, St). %{Eref,St}. make_loc_frame(0) -> not_used; make_loc_frame(Lsz) -> erlang:make_tuple(Lsz, nil). %% do_while(Instrs, Cont, LocalVars, Stack, Env, State, WhileEis, WhileBis) -> %% do_while(Is, Cont, Lvs, Stk, Env, Cs0, St, Eis, Wis) -> %% Add the break frame to the call stack. Fr = #loop_frame{lvs=Lvs,stk=Stk,env=Env,is=Is,cont=Cont}, Cs1 = [Fr|Cs0], emul(Eis, [[?WHILE_LOOP(Eis, Wis)|Is]|Cont], Lvs, Stk, Env, Cs1, St). do_while_loop(Is, Cont, Lvs, [Val|Stk], Env, Cs, St, Eis, Wis) -> case boolean_value(Val) of true -> emul(Wis, [Eis,[?WHILE_LOOP(Eis, Wis)|Is]|Cont], Lvs, Stk, Env, Cs, St); false -> emul([?BREAK|Is], Cont, Lvs, Stk, Env, Cs, St) end. %% do_repeat(Instrs, Cont, LocalVars, Stack, Env, State, RepeatInstrs) -> %% %% We know that at the end of the repear instructions the test value %% is calculated. do_repeat(Is, Cont, Lvs, Stk, Env, Cs0, St, Ris) -> %% Add the break frame to the call stack. Fr = #loop_frame{lvs=Lvs,stk=Stk,env=Env,is=Is,cont=Cont}, Cs1 = [Fr|Cs0], emul(Ris, [[?REPEAT_LOOP(Ris)|Is]|Cont], Lvs, Stk, Env, Cs1, St). do_repeat_loop(Is, Cont, Lvs, [Val|Stk], Env, Cs, St, Ris) -> case boolean_value(Val) of true -> emul([?BREAK|Is], Cont, Lvs, Stk, Env, Cs, St); false -> emul(Ris, [[?REPEAT_LOOP(Ris)|Is]|Cont], Lvs, Stk, Env, Cs, St) end. %% do_and_then(Instrs, Continuation,LocalVars, Stack, Env, State, ThenInstrs) -> %% . %% do_or_else(Instrs, Continuation,LocalVars, Stack, Env, State, ElseInstrs) -> %% . do_and_then(Is, Cont, Lvs, [Val|Stk1]=Stk0, Env, Cs, St, Then) -> %% This is an expression and must always leave a value on stack. case boolean_value(Val) of true -> emul(Then, [Is|Cont], Lvs, Stk1, Env, Cs, St); false -> %% Non true value left on stack. emul(Is, Cont, Lvs, Stk0, Env, Cs, St) end. do_or_else(Is, Cont, Lvs, [Val|Stk1]=Stk0, Env, Cs, St, Else) -> %% This is an expression and must always leave a value on stack. case boolean_value(Val) of true -> %% Non false value left on stack. emul(Is, Cont, Lvs, Stk0, Env, Cs, St); false -> emul(Else, [Is|Cont], Lvs, Stk1, Env, Cs, St) end. %% do_if(Instrs, Continuation, LocalVars, Stack, Env, State, TrueInstrs) -> %% . %% Test value on stack to choose whether to do True instructions. do_if_true(Is, Cont, Lvs, [Val|Stk], Env, Cs, St, True) -> case boolean_value(Val) of true -> emul(True, [Is|Cont], Lvs, Stk, Env, Cs, St); false -> emul(Is, Cont, Lvs, Stk, Env, Cs, St) end. %% do_if(Instrs, LocalVars, Stack, Env, State, TrueInstrs, FalseInstrs) -> %% . %% Test value on stack to choose either True or False instructions. do_if(Is, Cont, Lvs0, [Val|Stk0], Env0, Cs, St0, True, False) -> case boolean_value(Val) of true -> emul(True, [Is|Cont], Lvs0, Stk0, Env0, Cs, St0); false -> emul(False, [Is|Cont], Lvs0, Stk0, Env0, Cs, St0) end. %% do_if(Blocks, Else, Lvs, Stk, Env, St) -> %% do_if_blocks(Blocks, Else, Lvs, Stk, Env, St). %% do_if_blocks([{T,B}|Ts], Else, Lvs0, Stk0, Env0, St0) -> %% {Lvs1,[Val|Stk1],Env1,St1} = emul(T, Lvs0, Stk0, Env0, St0), %% case boolean_value(Val) of %% true -> emul(B, Lvs1, Stk1, Env1, St1); %% false -> do_if_blocks(Ts, Lvs1, Stk1, Env1, St1) %% end; %% do_if_blocks([], Else, Lvs, Stk, Env, St) -> %% emul(Else, Lvs, Stk, Env, St). %% do_if_block([?BLOCK(Lsz, Esz, Bis)], Lvs0, Stk0, Env0, St0, Is) -> %% {Lvs1,Stk1,Env1,St1} = do_block(Bis, Lvs0, Stk0, Env0, St0, Lsz, Esz), %% emul(Is, Lvs1, Stk1, Env1, St1); %% do_if_block(Bis, Lvs0, Stk0, Env0, St0, Is) -> %% {Lvs1,Stk1,Env1,St1} = emul(Bis, Lvs0, Stk0, Env0, St0), %% emul(Is, Lvs1, Stk1, Env1, St1). %% do_numfor(Instrs, LocalVars, Stack, Env, State, Varname, FromInstrs) -> %% do_numfor(Is, Cont, Lvs, [Step,Limit,Init|Stk], Env, Cs0, St, _, Fis) -> %% First check if we have numbers. case luerl_lib:args_to_numbers([Init,Limit,Step]) of [I,L,S] -> %% Add the break frame to the call stack. Fr = #loop_frame{lvs=Lvs,stk=Stk,env=Env,is=Is,cont=Cont}, Cs1 = [Fr|Cs0], do_numfor_loop(Is, Cont, Lvs, Stk, Env, Cs1, St, I, L, S, Fis); error -> badarg_error(loop, [Init,Limit,Step], St#luerl{cs=Cs0}) end. do_numfor_loop(Is, Cont, Lvs, Stk, Env, Cs, St, N, Limit, Step, Fis) -> %% itrace_print("nl: ~p\n", [{N,Stk}]), %% Leave the current counter at the top of the stack for code to get. if Step > 0, N =< Limit -> %Keep going emul(Fis, [[?NFOR_LOOP(N+Step, Limit, Step, Fis)|Is]|Cont], Lvs, [N|Stk], Env, Cs, St); Step < 0, N >= Limit -> %Keep going emul(Fis, [[?NFOR_LOOP(N+Step, Limit, Step, Fis)|Is]|Cont], Lvs, [N|Stk], Env, Cs, St); true -> %Done! emul([?BREAK|Is], Cont, Lvs, Stk, Env, Cs, St) end. %% do_genfor(Instrs, LocalVars, Stack, Env, %% CallStack, State, Vars, FromInstrs) -> %% The top of the stack will contain the return values from the explist. do_genfor(Is, Cont, Lvs, [Val|Stk], Env, Cs0, St, _, Fis) -> case Val of %Sneaky, export Func, Data, Var [Func] -> Data = nil, Var = nil; [Func,Data] -> Var = nil; [Func,Data,Var|_] -> ok; Func -> Data = nil, Var = nil end, %% Add the break frame to the call stack. Fr = #loop_frame{lvs=Lvs,stk=Stk,env=Env,is=Is,cont=Cont}, Cs1 = [Fr|Cs0], do_genfor_call(Is, Cont, Lvs, Stk, Env, Cs1, St, Func, Data, Var, Fis). do_genfor_call(Is, Cont, Lvs, Stk, Env, Cs, St, Func, Data, Val, Fis) -> emul([?FCALL,?GFOR_LOOP(Func, Data, Fis)|Is], Cont, Lvs, [[Data,Val],Func|Stk], Env, Cs, St). do_genfor_loop(Is, Cont, Lvs, [Vals|Stk], Env, Cs, St, Func, Data, Fis) -> case boolean_value(Vals) of true -> emul(Fis, [[?GFOR_CALL(Func,Data,hd(Vals),Fis)|Is]|Cont], Lvs, [Vals|Stk], Env, Cs, St); false -> emul([?BREAK|Is], Cont, Lvs, Stk, Env, Cs, St) end. %% build_tab(FieldCount, Index, Stack, State) -> {TableRef,Stack,State}. %% FieldCount is how many Key/Value pairs are on the stack, Index is %% the index of the next value in the acc. build_tab(Fc, I, [Last|Stk0], St0) -> Fs0 = build_tab_last(I, Last), {Fs1,Stk1} = build_tab_loop(Fc, Stk0, Fs0), %% io:fwrite("bt: ~p\n", [{Fc,I,Acc,Fs0,Fs1}]), {Tref,St1} = luerl_heap:alloc_table(Fs1, St0), {Tref,Stk1,St1}. build_tab_last(I, [V|Vs]) -> [{I,V}|build_tab_last(I+1, Vs)]; build_tab_last(_, []) -> []; build_tab_last(_, Last) -> error({boom,build_tab_acc,Last}). build_tab_loop(0, Stk, Fs) -> {Fs,Stk}; build_tab_loop(C, [V,K|Stk], Fs) -> build_tab_loop(C-1, Stk, [{K,V}|Fs]). %% op(Op, Arg, State) -> OpReturn. %% op(Op, Arg1, Arg2, State) -> OpReturn. %% %% OpReturn = {value,Ret,State} | %% {meta,Method,Args,State} | %% {error,Error,State}. %% %% The built-in operators. Always return a single value! op('-', A, St) -> numeric_op('-', A, St, <<"__unm">>, fun (N) -> -N end); op('not', A, St) -> {value,not ?IS_TRUE(A),St}; op('~', A, St) -> integer_op('~', A, St, <<"__bnot">>, fun (N) -> bnot(N) end); op('#', A, St) -> length_op('#', A, St); op(Op, A, St) -> {error,{badarg,Op,[A]},St}. %% Numeric operators. op('+', A1, A2, St) -> numeric_op('+', A1, A2, St, <<"__add">>, fun (N1,N2) -> N1+N2 end); op('-', A1, A2, St) -> numeric_op('-', A1, A2, St, <<"__sub">>, fun (N1,N2) -> N1-N2 end); op('*', A1, A2, St) -> numeric_op('*', A1, A2, St, <<"__mul">>, fun (N1,N2) -> N1*N2 end); op('/', A1, A2, St) -> numeric_op('/', A1, A2, St, <<"__div">>, fun (N1,N2) -> N1/N2 end); %% The '//' and '%' operators are specially handled to avoid first %% converting integers to floats and potentially lose precision. op('//', A1, A2, St) -> numeric_op('//', A1, A2, St, <<"__idiv">>, fun (N1,N2) when is_integer(N1), is_integer(N2) -> Idiv = N1 div N2, Irem = N1 rem N2, if Irem =:= 0 -> Idiv; Idiv < 0 -> Idiv - 1; true -> Idiv end; (N1,N2) -> 0.0 + floor(N1/N2) end); op('%', A1, A2, St) -> numeric_op('%', A1, A2, St, <<"__mod">>, fun (N1,N2) when is_integer(N1), is_integer(N2) -> Irem = N1 rem N2, if (Irem < 0) and (N2 >= 0) -> Irem + N2; (Irem > 0) and (N2 < 0) -> Irem + N2; true -> Irem end; %% if Irem < 0 -> %% if N2 < 0 -> Irem; %% true -> Irem + N2 %% end; %% Irem > 0 -> %% if N2 < 0 -> Irem + N2; %% true -> Irem %% end; %% true -> 0 %Irem =:= 0 %% end; (N1,N2) -> N1 - floor(N1/N2)*N2 end); op('^', A1, A2, St) -> numeric_op('^', A1, A2, St, <<"__pow">>, fun (N1,N2) -> math:pow(N1, N2) end); %% Bitwise operators. %% The '>>' is an arithmetic shift as a logical shift implies a word %% size which we don't have. op('&', A1, A2, St) -> integer_op('&', A1, A2, St, <<"__band">>, fun (N1,N2) -> N1 band N2 end); op('|', A1, A2, St) -> integer_op('|', A1, A2, St, <<"__bor">>, fun (N1,N2) -> N1 bor N2 end); op('~', A1, A2, St) -> integer_op('~', A1, A2, St, <<"__bxor">>, fun (N1,N2) -> N1 bxor N2 end); op('<<', A1, A2, St) -> integer_op('<<', A1, A2, St, <<"__shl">>, fun (N1,N2) -> N1 bsl N2 end); op('>>', A1, A2, St) -> integer_op('>>', A1, A2, St, <<"__shr">>, fun (N1,N2) -> N1 bsr N2 end); %% Relational operators, getting close. op('==', A1, A2, St) -> eq_op('==', A1, A2, St); op('~=', A1, A2, St) -> neq_op('~=', A1, A2, St); op('<=', A1, A2, St) -> le_op('<=', A1, A2, St); op('>=', A1, A2, St) -> le_op('>=', A2, A1, St); op('<', A1, A2, St) -> lt_op('<', A1, A2, St); op('>', A1, A2, St) -> lt_op('>', A2, A1, St); %% String operator. op('..', A1, A2, St) -> concat_op(A1, A2, St); %% Bad args here. op(Op, A1, A2, St) -> {error,{badarg,Op,[A1,A2]}, St}. -ifndef(HAS_FLOOR). %% floor(Number) -> integer(). %% Floor does not exist before 20 so we need to do it ourselves. floor(N) when is_integer(N) -> N; floor(N) when is_float(N) -> round(N - 0.5). -endif. %% length_op(Op, Arg, State) -> OpReturn. %% numeric_op(Op, Arg, State, Event, Raw) -> OpReturn. %% numeric_op(Op, Arg, Arg, State, Event, Raw) -> OpReturn. %% integer_op(Op, Arg, State, Event, Raw) -> OpReturn. %% integer_op(Op, Arg, Arg, State, Event, Raw) -> OpReturn. %% eq_op(Op, Arg, Arg, State) -> OpReturn. %% neq_op(Op, Arg, Arg, State) -> OpReturn. %% lt_op(Op, Arg, Arg, State) -> OpReturn. %% le_op(Op, Arg, Arg, State) -> OpReturn. %% concat_op(Arg, Arg, State) -> OpReturn. %% %% OpReturn = {value,Ret,State} | %% {meta,Method,Args,State} | %% {error,Error,State}. %% %% Together with their metas straight out of the reference %% manual. Note that: %% - numeric_op string args are always floats %% - eq/neq metamethods here must return boolean values and the tests %% themselves are type dependent length_op(_Op, A, St) when is_binary(A) -> {value,byte_size(A),St}; length_op(_Op, A, St) -> case luerl_heap:get_metamethod(A, <<"__len">>, St) of nil -> if ?IS_TREF(A) -> {value,luerl_lib_table:raw_length(A, St),St}; true -> {error,{badarg,'#',[A]}, St} end; Meth -> {meta,Meth,[A],St} end. numeric_op(Op, A, St, E, Raw) -> case luerl_lib:arg_to_number(A) of error -> numeric_op_meta(Op, A, E, St); N -> do_numeric_op(Op, [N], St, Raw) end. numeric_op(Op, A1, A2, St, E, Raw) -> case luerl_lib:args_to_numbers(A1, A2) of [_N1,_N2] = Ns -> do_numeric_op(Op, Ns, St, Raw); error -> numeric_op_meta(Op, A1, A2, E, St) end. integer_op(Op, A, St, E, Raw) -> case luerl_lib:arg_to_integer(A) of error -> numeric_op_meta(Op, A, E, St); N -> do_numeric_op(Op, [N], St, Raw) end. integer_op(Op, A1, A2, St, E, Raw) -> case luerl_lib:args_to_integers(A1, A2) of [_N1,_N2] = Ns -> do_numeric_op(Op, Ns, St, Raw); error -> numeric_op_meta(Op, A1, A2, E, St) end. %% do_numeric_op(Op, Numbers, State, Raw) -> %% {value,Value,State) | {error,Error,State}. do_numeric_op(Op, Ns, St, Raw) -> try {value,apply(Raw, Ns),St} catch ?CATCH(_, _, _) {error,{badarith,Op,Ns},St} end. numeric_op_meta(Op, A, E, St) -> case luerl_heap:get_metamethod(A, E, St) of nil -> {error,{badarith,Op,[A]}, St}; Meth -> {meta,Meth,[A],St} end. numeric_op_meta(Op, A1, A2, E, St) -> case luerl_heap:get_metamethod(A1, A2, E, St) of nil -> {error,{badarith,Op,[A1,A2]},St}; Meth -> {meta,Meth,[A1,A2],St} end. eq_op(_Op, A1, A2, St) when A1 == A2 -> {value,true,St}; eq_op(_Op, A1, A2, St) when ?IS_TREF(A1), ?IS_TREF(A2) ; ?IS_USDREF(A1), ?IS_USDREF(A2) -> case get_eqmetamethod(A1, A2, St) of nil -> {value,false,St}; Meth -> Func = fun (Args, St0) -> {Ret,St1} = functioncall(Meth, Args, St0), {[boolean_value(Ret)],St1} end, {meta,#erl_func{code=Func},[A1,A2],St} end; eq_op(_, _, _, St) -> {value,false,St}. neq_op(_Op, A1, A2, St) when A1 == A2 -> {value,false,St}; neq_op(_Op, A1, A2, St) when ?IS_TREF(A1), ?IS_TREF(A2) ; ?IS_USDREF(A1), ?IS_USDREF(A2) -> case get_eqmetamethod(A1, A2, St) of nil -> {value,true,St}; Meth -> Func = fun (Args, St0) -> {Ret,St1} = functioncall(Meth, Args, St0), {[not boolean_value(Ret)],St1} end, {meta,#erl_func{code=Func},[A1,A2],St} end; neq_op(_, _, _, St) -> {value,true,St}. get_eqmetamethod(A1, A2, St) -> %% Must have "same" metamethod here. How do we test? case luerl_heap:get_metamethod(A1, <<"__eq">>, St) of nil -> nil; Meth -> case luerl_heap:get_metamethod(A2, <<"__eq">>, St) of Meth -> Meth; %Must be the same method _ -> nil end end. lt_op(_Op, A1, A2, St) when is_number(A1), is_number(A2) -> {value,A1 < A2,St}; lt_op(_Op, A1, A2, St) when is_binary(A1), is_binary(A2) -> {value,A1 < A2,St}; lt_op(Op, A1, A2, St) -> op_meta(Op, A1, A2, <<"__lt">>, St). le_op(_Op, A1, A2, St) when is_number(A1), is_number(A2) -> {value,A1 =< A2,St}; le_op(_Op, A1, A2, St) when is_binary(A1), is_binary(A2) -> {value,A1 =< A2,St}; le_op(Op, A1, A2, St) -> %% Must check for first __le then __lt metamethods. case luerl_heap:get_metamethod(A1, A2, <<"__le">>, St) of nil -> %% Try for not (Op2 < Op1) instead. case luerl_heap:get_metamethod(A1, A2, <<"__lt">>, St) of nil -> {error,{badarg,Op,[A1,A2]}, St}; Meth -> {meta,Meth,[A2,A1],St} end; Meth -> {meta,Meth,[A1,A2],St} end. concat_op(A1, A2, St) -> case luerl_lib:conv_list([A1,A2], [lua_string,lua_string]) of [S1,S2] -> {value,<>,St}; error -> op_meta('..', A1, A2, <<"__concat">>, St) end. %% op_meta(Op, A, E, St) -> %% case luerl_heap:get_metamethod(A, E, St) of %% nil -> {error,{badarg,Op,[A]}, St}; %% Meth -> {meta,Meth,[A],St} %% end. op_meta(Op, A1, A2, E, St) -> case luerl_heap:get_metamethod(A1, A2, E, St) of nil -> {error,{badarg,Op,[A1,A2]},St}; Meth -> {meta,Meth,[A1,A2],St} end. %% boolean_value(Rets) -> boolean(). %% Return the "boolean" value of a value/function return list. boolean_value([nil|_]) -> false; boolean_value([false|_]) -> false; boolean_value([_|_]) -> true; boolean_value([]) -> false; boolean_value(nil) -> false; boolean_value(false) -> false; boolean_value(_) -> true. %% first_value(Rets) -> Value. %% multiple_value(Value) -> [Value]. first_value([V|_]) -> V; first_value([]) -> nil. multiple_value(V) when not is_list(V) -> [V]. rvirding-luerl-772b25e/src/luerl_lib_os.erl0000664000232200023220000002355415114130670021342 0ustar debalancedebalance%% Copyright (c) 2013-2024 Robert Virding %% %% Licensed under the Apache License, Version 2.0 (the "License"); %% you may not use this file except in compliance with the License. %% You may obtain a copy of the License at %% %% http://www.apache.org/licenses/LICENSE-2.0 %% %% Unless required by applicable law or agreed to in writing, software %% distributed under the License is distributed on an "AS IS" BASIS, %% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. %% See the License for the specific language governing permissions and %% limitations under the License. %% File : luerl_lib_os.erl %% Author : Robert Virding %% Purpose : The os library for Luerl. -module(luerl_lib_os). -include("luerl.hrl"). ?MODULEDOC(false). -export([install/1, clock/3, date/3, difftime/3, execute/3, lua_exit/3, getenv/3, remove/3, rename/3, time/3, tmpname/3]). -import(luerl_lib, [lua_error/2,badarg_error/3]). %Shorten this %% For `remove/2'. -include_lib("kernel/include/file.hrl"). %% For `tmpname/2' in `luerl_lib_os'. -define(TMPNAM_MAXTRIES, 100). -define(TMPNAM_TEMPLATE(S), "/tmp/lua_" ++ S). install(St) -> luerl_heap:alloc_table(table(), St). table() -> [{<<"clock">>,#erl_mfa{m=?MODULE,f=clock}}, {<<"date">>,#erl_mfa{m=?MODULE,f=date}}, {<<"difftime">>,#erl_mfa{m=?MODULE,f=difftime}}, {<<"execute">>,#erl_mfa{m=?MODULE,f=execute}}, {<<"exit">>,#erl_mfa{m=?MODULE,f=lua_exit}}, {<<"getenv">>,#erl_mfa{m=?MODULE,f=getenv}}, {<<"remove">>,#erl_mfa{m=?MODULE,f=remove}}, {<<"rename">>,#erl_mfa{m=?MODULE,f=rename}}, {<<"time">>,#erl_mfa{m=?MODULE,f=time}}, {<<"tmpname">>,#erl_mfa{m=?MODULE,f=tmpname}}]. getenv(_, [<<>>|_], St) -> {[nil],St}; getenv(_, [A|_], St) when is_binary(A) ; is_number(A) -> case os:getenv(luerl_lib:arg_to_list(A)) of Env when is_list(Env) -> {[list_to_binary(Env)],St}; false -> {[nil],St} end; getenv(_, As, St) -> badarg_error(getenv, As, St). %% execute([Command|_], State) -> {[Ret,Type,Stat],State}. %% Execute a command and get the return code. We cannot yet properly %% handle if our command terminated with a signal. execute(_, [], St) -> {true,St}; %We have a shell execute(_, [A|_], St) -> case luerl_lib:arg_to_string(A) of S when is_binary(S) -> Opts = [{arg0,"sh"},{args,["-c", S]}, hide,in,eof,exit_status,use_stdio,stderr_to_stdout], P = open_port({spawn_executable,"/bin/sh"}, Opts), N = execute_handle(P), Ret = if N =:= 0 -> true; %Success true -> nil %Error end, {[Ret,<<"exit">>,N],St}; error -> badarg_error(execute, [A], St) end; execute(_, As, St) -> badarg_error(execute, As, St). execute_handle(P) -> receive {P,{data,D}} -> %% Print stdout/stderr like Lua does. io:put_chars(D), execute_handle(P); {P, {exit_status,N}} -> %% Wait for the eof then close the port. receive {P, eof} -> port_close(P), N end end. %% exit([ExitCode,CloseState|_], State) -> nil. %% Exit the host program. If ExitCode is true, the return code is 0; %% if ExitCode is false, the return code is 1; if ExitCode is a number, the %% return code is this number. The default value for ExitCode is true. %% NOT IMPLEMENTED: %% If the optional second argument CloseState is true, it will close the Lua %% state before exiting. lua_exit(_, [], St) -> lua_exit(nil, [true,false], St); lua_exit(_, [C], St) -> lua_exit(nil, [C,false], St); lua_exit(_, [Co0|_], St) -> %% lua_exit([Co0,Cl0], St) -> Co1 = case luerl_lib:arg_to_number(Co0) of X when is_integer(X) -> X; error -> case Co0 of false -> 1; true -> 0; error -> badarg_error(exit, [Co0], St) end end, %% Uncomment this if you need the second argument to determine whether to %% destroy the Lua state or not. %% Cl1 = case Cl0 of %% true -> true; %% false -> false; %% _ -> badarg_error(exit, [Cl0], St) %% end, erlang:halt(Co1). %% tmpname([], State) %% Faithfully recreates `tmpnam'(3) in lack of a NIF. tmpname(_, [_|_], St) -> %% Discard extra arguments. tmpname(nil, [], St); tmpname(_, [], St) -> Out = tmpname_try(randchar(6, []), 0), %% We make an empty file the programmer will have to close themselves. %% This is done for security reasons. file:write_file(Out, ""), {[list_to_binary(Out)],St}. %% Support function for `tmpname/2' - generates a random filename following a %% template. tmpname_try(_, ?TMPNAM_MAXTRIES) -> %% Exhausted... false; tmpname_try(A, N) -> case file:read_file_info(?TMPNAM_TEMPLATE(A)) of {error,enoent} -> ?TMPNAM_TEMPLATE(A); %% Success, at last! _ -> tmpname_try(randchar(6, []), N+1) end. %% Support function for `tmpname_try/2'. randchar(0, A) -> A; randchar(N, A) -> randchar(N-1, [rand:uniform(26)+96|A]). %% rename([Source,Destination|_], State) %% Renames the file or directory `Source' to `Destination'. If this function %% fails, it returns `nil', plus a string describing the error code and the %% error code. Otherwise, it returns `true'. rename(_, [S,D|_], St) -> case {luerl_lib:arg_to_string(S), luerl_lib:arg_to_string(D)} of {S1,D1} when is_binary(S1) , is_binary(D1) -> case file:rename(S1,D1) of ok -> {[true],St}; {error,R} -> #{errno := En, errstr := Er} = luerl_util:errname_info(R), {[nil,Er,En],St} end; %% These are for throwing a `badmatch' error on the correct argument. {S1,D1} when not is_binary(S1) , not is_binary(D1) -> badarg_error(rename, [S1,D1], St); {S1,D1} when not is_binary(S1) , is_binary(D1) -> badarg_error(rename, [S1], St); {S1,D1} when is_binary(S1) , not is_binary(D1) -> badarg_error(rename, [D1], St) end; rename(_, As, St) -> badarg_error(rename, As, St). %% remove([Path|_], State) %% Deletes the file (or empty directory) with the given `Path'. If this %% function fails, it returns `nil' plus a string describing the error, and the %% error code. Otherwise, it returns `true'. remove(_, [A|_], St) -> case luerl_lib:arg_to_string(A) of A1 when is_binary(A1) -> %% Emulate the underlying call to `remove(3)'. case file:read_file_info(A1) of {ok,#file_info{type=T}} when T == directory ; T == regular -> %% Select the corresponding function. Op = if T == directory -> del_dir; true -> delete end, case file:Op(A) of ok -> {[true],St}; {error,R} -> {remove_geterr(R, A), St} end; {error,R} -> %% Something went wrong. {remove_geterr(R, A), St} end; error -> badarg_error(remove, [A], St) end; remove(_, As, St) -> badarg_error(remove, As, St). %% Utility function to get a preformatted list to return from `remove/2'. remove_geterr(R, F) -> F1 = binary_to_list(F), #{errno := En, errstr := Er} = luerl_util:errname_info(R), [nil, list_to_binary(F1 ++ ": " ++ Er), En]. %% Time and date functions. clock(_, As, St) -> Type = case As of %Choose which we want [<<"runtime">>|_] -> runtime; _ -> wall_clock end, {Tot,_} = erlang:statistics(Type), %Milliseconds {[Tot*1.0e-3],St}. date(ConfArg, [], St) -> date(ConfArg, [<<"%c">>], St); date(ConfArg, [Fmt], St) when is_binary(Fmt) -> date(ConfArg, [Fmt, current_timestamp()], St); date(_, [Fmt, TimeStamp], St) when is_binary(Fmt) and is_number(TimeStamp) -> DateTime = timestamp_to_datetime(TimeStamp), Formatted = luerl_lib_os_date:format(DateTime, Fmt), {Enc, St1} = luerl:encode(Formatted, St), {[Enc],St1}; date(_, As, St) -> badarg_error(date, As, St). difftime(_, [T2,T1|_], St) -> {[T2 - T1],St}; difftime(_, As, St) -> badarg_error(difftime, As, St). time(_, As=[#tref{}=Tref], St) -> L = luerl:decode(Tref, St), compute_time(proplists:to_map(L), As, St); time(_, _, St) -> %Time since 1 Jan 1970 {[current_timestamp()],St}. compute_time(Map=#{<<"year">> := Y, <<"month">> := Mth, <<"day">> := D}, _, St) -> H = maps:get(<<"hour">>, Map, 12), Min = maps:get(<<"min">>, Map, 0), S = maps:get(<<"sec">>, Map, 0), LocalEpoch = calendar:universal_time_to_local_time({{1970,1,1},{0,0,0}}), Result = calendar:datetime_to_gregorian_seconds({{Y, Mth, D}, {H, Min, S}}) - calendar:datetime_to_gregorian_seconds(LocalEpoch), {[Result],St}; compute_time(Map, _As, St) -> MissingArg = lists:foldl(fun(K,Acc=undefined) -> case maps:is_key(K, Map) of false -> K; true -> Acc end; (_,Acc) -> Acc end, undefined, [<<"day">>, <<"month">>, <<"year">>]), badarg_error(time, MissingArg, St). current_timestamp() -> {Mega,Sec,Micro} = os:timestamp(), 1.0e6*Mega+Sec+Micro*1.0e-6. timestamp_to_datetime(Timestamp) -> SecondsSinceEpoch = round(Timestamp), calendar:system_time_to_local_time(SecondsSinceEpoch, second). rvirding-luerl-772b25e/src/luerl_comp_lint.erl0000664000232200023220000001726115114130670022055 0ustar debalancedebalance%% Copyright (c) 2019 Robert Virding %% %% Licensed under the Apache License, Version 2.0 (the "License"); %% you may not use this file except in compliance with the License. %% You may obtain a copy of the License at %% %% http://www.apache.org/licenses/LICENSE-2.0 %% %% Unless required by applicable law or agreed to in writing, software %% distributed under the License is distributed on an "AS IS" BASIS, %% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. %% See the License for the specific language governing permissions and %% limitations under the License. %% File : luerl_lint.erl %% Author : Robert Virding %% Purpose : A basic LUA 5.3 error checker for Luerl. %% There isn't much checking which can be done here as most is allowed %% and generates run-time errors or strangeness. So far all we can %% check is the legal use of varargs ... and warn if assignments have %% different number of variables and expressions. -module(luerl_comp_lint). -include("luerl.hrl"). -include("luerl_comp.hrl"). ?MODULEDOC(false). -export([chunk/2,format_error/1]). -record(lint, {opts=[], %Options pars=[], %Local function parameters errors=[], %Errors warnings=[] %Warnings }). %% format_error(Error) -> String. format_error(illegal_varargs) -> "cannot use '...' outside a vararg function"; format_error(assign_mismatch) -> "assign mismatch variables and expressions". %% chunk(Code, Compinfo) -> {ok,Warnings} | {error,Errors,Warnings}. chunk(Code, #cinfo{opts=Opts}=_Ci) -> St0 = #lint{opts=Opts}, St1 = functiondef(Code, St0), return_status(St1). return_status(#lint{errors=[]}=St) -> {ok,St#lint.warnings}; return_status(#lint{errors=Es,warnings=Ws}) -> {error,Es,Ws}. %% stmts(Stmts, State) -> State. stmts([S|Ss], St0) -> St1 = stmt(S, St0), stmts(Ss, St1); stmts([], St) -> St. %% stmt(Stmt, State) -> State. stmt(#assign_stmt{}=A, St) -> assign_stmt(A, St); stmt(#call_stmt{}=C, St) -> call_stmt(C, St); stmt(#return_stmt{}=R, St) -> return_stmt(R, St); stmt(#break_stmt{}, St) -> St; stmt(#block_stmt{}=B, St) -> block_stmt(B, St); stmt(#while_stmt{}=W, St) -> while_stmt(W, St); stmt(#repeat_stmt{}=R, St) -> repeat_stmt(R, St); stmt(#if_stmt{}=If, St) -> if_stmt(If, St); stmt(#nfor_stmt{}=For, St) -> numfor_stmt(For, St); stmt(#gfor_stmt{}=For, St) -> genfor_stmt(For, St); stmt(#local_assign_stmt{}=For, St) -> local_assign_stmt(For, St); stmt(#local_fdef_stmt{}=For, St) -> local_fdef_stmt(For, St); stmt(#expr_stmt{}=E, St) -> expr_stmt(E, St). %% assign_stmt(Assign, State) -> State. %% call_stmt(Call, State) -> State. %% return_stmt(Return, State) -> State. %% block_stmt(Block, State) -> State. %% while_stmt(While, State) -> State. %% repeat_stmt(Repeat, State) -> State. %% if_stmt(If, State) -> State. %% numfor_stmt(Numfor, State) -> State. %% genfor_stmt(Genfor, State) -> State. %% local_assign_stmt(Assign, State) -> State. %% local_fdef_stmt(Fdef, State) -> State. %% expr_stmt(Expr, State) -> State. assign_stmt(#assign_stmt{vars=Vs,exps=Es}, St0) -> %% Must work more on this to get it right. %% St1 = ?IF(length(Vs) =/= length(Es), %% assign_mismatch_warning(Anno, St0), St0), St1 = St0, St2 = lists:foldl(fun (V, S) -> assign_var(V, S) end, St1, Vs), explist(Es, St2). assign_var(#dot{exp=Exp,rest=Rest}, St0) -> St1 = prefixexp_first(Exp, St0), assign_var_rest(Rest, St1); assign_var(#var{l=Anno,name='...'}, St) -> %% Not allowed to bind ... . illegal_varargs_error(Anno, St); assign_var(_Var, St) -> St. assign_var_rest(#dot{exp=Exp,rest=Rest}, St0) -> St1 = prefixexp_element(Exp, St0), assign_var_rest(Rest, St1); assign_var_rest(Exp, St) -> assign_var_last(Exp, St). assign_var_last(#key{key=Exp}, St) -> exp(Exp, St). call_stmt(#call_stmt{call=Exp}, St) -> exp(Exp, St). return_stmt(#return_stmt{exps=Es}, St) -> explist(Es, St). block_stmt(#block_stmt{body=Ss}, St) -> stmts(Ss, St). while_stmt(#while_stmt{exp=Exp,body=Ss}, St0) -> St1 = exp(Exp, St0), block(Ss, St1). repeat_stmt(#repeat_stmt{body=Ss}, St) -> block(Ss, St). if_stmt(#if_stmt{tests=Ts,else_block=Else}, St0) -> Fun = fun ({E,B}, S0) -> S1 = exp(E, S0), block(B, S1) end, St1 = lists:foldl(Fun, St0, Ts), block(Else, St1). numfor_stmt(#nfor_stmt{init=I,limit=L,step=S,body=B}, St0) -> St1 = explist([I,L,S], St0), block(B, St1). genfor_stmt(#gfor_stmt{gens=Gs,body=B}, St0) -> St1 = explist(Gs, St0), block(B, St1). local_assign_stmt(#local_assign_stmt{exps=Es}, St0) -> %% Must work more on this to get it right. %% St1 = ?IF(length(Vs) =/= length(Es), %% assign_mismatch_warning(Anno, St0), St0), St1 = St0, explist(Es, St1). local_fdef_stmt(#local_fdef_stmt{func=F}, St) -> functiondef(F, St). expr_stmt(#expr_stmt{exp=Exp}, St) -> exp(Exp, St). %% block(Block, State) -> State. block(#block{body=Ss}, St) -> stmts(Ss, St). %% explist(Exprs, State) -> State. %% exp(Expr, State) -> State. %% prefixexp(Expr, State) -> State. explist(Es, St) -> lists:foldl(fun (E, S) -> exp(E, S) end, St, Es). exp(#lit{}, St) -> St; exp(#fdef{}=F, St) -> functiondef(F, St); exp(#op{args=Es}, St) -> explist(Es, St); exp(#tabcon{fields=Fs}, St) -> tableconstructor(Fs, St); exp(E, St) -> prefixexp(E, St). prefixexp(#dot{exp=Exp,rest=Rest}, St0) -> St1 = prefixexp_first(Exp, St0), prefixexp_rest(Rest, St1); prefixexp(Exp, St) -> prefixexp_first(Exp, St). prefixexp_first(#single{exp=Exp}, St) -> exp(Exp, St); prefixexp_first(#var{}=V, St) -> var(V, St). prefixexp_rest(#dot{exp=Exp,rest=Rest}, St0) -> St1 = prefixexp_element(Exp, St0), prefixexp_rest(Rest, St1); prefixexp_rest(Exp, St) -> prefixexp_element(Exp, St). prefixexp_element(#key{key=Exp}, St) -> exp(Exp, St); prefixexp_element(#fcall{args=Es}, St) -> explist(Es, St); prefixexp_element(#mcall{meth=Lit,args=Es}, St0) -> St1 = lit(Lit, St0), explist(Es, St1). %% functiondef(FuncDef, State) -> State. functiondef(#fdef{pars=Ps,body=Ss}, #lint{pars=Pars}=St0) -> St1 = St0#lint{pars=Ps}, %Use current parameters St2 = stmts(Ss, St1), St2#lint{pars=Pars}. %Reset previous parameters %% tableconstructor(Fields, State) -> State. tableconstructor(Fs, St) -> Fun = fun (#efield{val=Exp}, S) -> exp(Exp, S); (#kfield{key=Key,val=Val}, S0) -> S1 = exp(Key, S0), exp(Val, S1) end, lists:foldl(Fun, St, Fs). %% var(Var, State) -> State. var(#var{l=Anno,name='...'}, St) -> case lists:keymember('...', #var.name, St#lint.pars) of true -> St; false -> illegal_varargs_error(Anno, St) end; var(_Var, St) -> St. %% lit(Lit, State) -> State. lit(#lit{l=Anno,val='...'}, St) -> case lists:keymember('...', #var.name, St#lint.pars) of true -> St; false -> illegal_varargs_error(Anno, St) end; lit(_Lit, St) -> St. %% add_error(Annotation, Error, State) -> State. %% add_warning(Annotation, Warning, State) -> State. %% Add errors/warnings to the state. add_error(Anno, E, #lint{errors=Errs}=St) -> L = luerl_anno:line(Anno), St#lint{errors=Errs ++ [{L,?MODULE,E}]}. %% add_warning(Anno, W, #lint{warnings=Warns}=St) -> %% L = luerl_anno:line(Anno), %% St#lint{warnings=Warns ++ [{L,?MODULE,W}]}. illegal_varargs_error(Anno, St) -> add_error(Anno, illegal_varargs, St). %% assign_mismatch_warning(Anno, St) -> %% add_warning(Anno, assign_mismatch, St). rvirding-luerl-772b25e/src/luerl_comp_cg.erl0000664000232200023220000004473515114130670021506 0ustar debalancedebalance%% Copyright (c) 2013 Robert Virding %% %% Licensed under the Apache License, Version 2.0 (the "License"); %% you may not use this file except in compliance with the License. %% You may obtain a copy of the License at %% %% http://www.apache.org/licenses/LICENSE-2.0 %% %% Unless required by applicable law or agreed to in writing, software %% distributed under the License is distributed on an "AS IS" BASIS, %% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. %% See the License for the specific language governing permissions and %% limitations under the License. %% File : luerl_comp_cg.erl %% Author : Robert Virding %% Purpose : A basic LUA 5.3 compiler for Luerl. %% Does code generation in the compiler. In the generated function %% definitions annotations and when we generate the #current_line{} %% instruction we use the virtual filename the compiler has %% generated. This is either the default file name or an explicit one %% given with the {file,FileName} compiler option. -module(luerl_comp_cg). -include("luerl.hrl"). -include("luerl_comp.hrl"). -include("luerl_instrs.hrl"). ?MODULEDOC(false). -export([chunk/2]). -import(ordsets, [add_element/2,is_element/2,union/1,union/2, subtract/2,intersection/2,new/0]). -record(c_cg, {line, %Current line vfile=[] %Current virtual file }). %% chunk(Code, CompInfo) -> {ok,Code}. %% Return a list of instructions to define the chunk function. chunk(Code0, #cinfo{vfile=Vfile,opts=Opts}=_Ci) -> St0 = #c_cg{line=0,vfile=Vfile}, %Get the virtual filename {Code1,_} = functiondef(Code0, St0), luerl_comp:debug_print(Opts, "cg: ~p\n", [Code1]), {ok,Code1}. %% set_var(Var) -> SetIs. %% get_var(Var) -> GetIs. %% These return a LIST of instructions for setting/getting variable. set_var(#lvar{d=D,i=I}) -> [?STORE_LVAR(D, I)]; set_var(#evar{d=D,i=I}) -> [?STORE_EVAR(D, I)]; set_var(#gvar{n=N}) -> [?STORE_GVAR(N)]. get_var(#lvar{d=D,i=I}) -> [?PUSH_LVAR(D, I)]; get_var(#evar{d=D,i=I}) -> [?PUSH_EVAR(D, I)]; get_var(#gvar{n=N}) -> [?PUSH_GVAR(N)]. %% stmt(Stmts, State) -> {Istmts,State}. stmts([S0|Ss0], St0) -> %% We KNOW that the annotation is the second element. Line = luerl_anno:line(element(2, S0)), {CurLine,St1} = add_current_line(Line, St0), {S1,St2} = stmt(S0, nul, St1), %% io:format("ss1: ~p\n", [{Loc0,Free0,Used0}]), {Ss1,St3} = stmts(Ss0, St2), {CurLine ++ S1 ++ Ss1,St3}; stmts([], St) -> {[],St}. %% add_current_line(Line, State) -> {CurLine,State}. %% Return currentline instruction and update state if new line. add_current_line(Line, #c_cg{line=Line}=St) -> {[],St}; add_current_line(Line, #c_cg{vfile=Vfile}=St) -> {[?CURRENT_LINE(Line, Vfile)],St#c_cg{line=Line}}. %% stmt(Stmt, LocalVars, State) -> {Istmt,State}. stmt(#assign_stmt{}=A, _, St) -> assign_stmt(A, St); stmt(#call_stmt{}=C, _, St) -> call_stmt(C, St); stmt(#return_stmt{}=R, _, St) -> return_stmt(R, St); stmt(#break_stmt{}, _, St) -> {[?BREAK],St}; stmt(#block_stmt{}=B, _, St) -> block_stmt(B, St); stmt(#while_stmt{}=W, _, St) -> while_stmt(W, St); stmt(#repeat_stmt{}=R, _, St) -> repeat_stmt(R, St); stmt(#if_stmt{}=I, _, St) -> if_stmt(I, St); stmt(#nfor_stmt{}=F, _, St) -> numfor_stmt(F, St); stmt(#gfor_stmt{}=F, _, St) -> genfor_stmt(F, St); stmt(#local_assign_stmt{}=L, _, St) -> local_assign_stmt(L, St); stmt(#local_fdef_stmt{}=L, _, St) -> local_fdef_stmt(L, St); stmt(#expr_stmt{}=E, _, St) -> expr_stmt(E, St). %% assign_stmt(Assign, State) -> {AssignIs,State}. %% We must evaluate all expressions, even the unneeded ones. assign_stmt(#assign_stmt{vars=Vs,exps=Es}, St) -> assign_loop(Vs, Es, St). %% assign_loop(Vars, Exps, State) -> {Iassigns,State}. %% Must be careful with pushing and popping values here. Make sure %% all non-last values are singleton. %% %% This could most likely be folded together with assign_local_loop/3. assign_loop([V], [E], St0) -> %Remove unnecessary ?PUSH_VALS {Ie,St1} = exp(E, single, St0), %Last argument to one variable {Iv,St2} = assign_prefixexp(V, St1), {Ie ++ Iv,St2}; assign_loop([V|Vs], [E], St0) -> {Ie,St1} = exp(E, multiple, St0), %Last argument to rest of vars {Ias,St2} = assign_loop_var(Vs, St1), {Iv,St3} = assign_prefixexp(V, St2), {Ie ++ Ias ++ Iv,St3}; assign_loop([V|Vs], [E|Es], St0) -> {Ie,St1} = exp(E, single, St0), %Not last argument! {Ias,St2} = assign_loop(Vs, Es, St1), {Iv,St3} = assign_prefixexp(V, St2), {Ie ++ Ias ++ Iv,St3}; assign_loop([], Es, St) -> assign_loop_exp(Es, St). %% assign_loop_var(Vars, State) -> {Iassigns,State}. %% Extract necessary number of values from value list on stack. Pad %% with nil. assign_loop_var(Vs, St) -> assign_loop_var(Vs, 1, St). assign_loop_var([V|Vs], Vc, St0) -> {Ias,St1} = assign_loop_var(Vs, Vc+1, St0), {Iv,St2} = assign_prefixexp(V, St1), {Ias ++ Iv,St2}; assign_loop_var([], Vc, St) -> {[?PUSH_VALS(Vc)],St}. %% assign_loop_exp(Exprs, State) -> {Instrs,State}. %% Evaluate remaining expressions and pop the values from the stack. assign_loop_exp([E|Es], St0) -> {Ie,St1} = exp(E, single, St0), %It will be dropped anyway {Ias,St2} = assign_loop_exp(Es, St1), {Ie ++ Ias ++ [?POP],St2}; %Pop unneeded value off stack assign_loop_exp([], St) -> {[],St}. %% assign_prefixexp(Expr, State) -> {Instrs,State}. %% assign_prefixexp_rest(Expr, State) -> {Instrs,State}. %% assign_prefixexp_element(Expr, State) -> {Instrs,State}. assign_prefixexp(#dot{exp=Exp,rest=Rest}, St0) -> {Ie,St1} = prefixexp_first(Exp, single, St0), {Ir,St2} = assign_prefixexp_rest(Rest, St1), {Ie ++ Ir,St2}; assign_prefixexp(V, St) -> {set_var(V),St}. assign_prefixexp_rest(#dot{exp=Exp,rest=Rest}, St0) -> {Ie,St1} = prefixexp_element(Exp, single, St0), {Ir,St2} = assign_prefixexp_rest(Rest, St1), {Ie ++ Ir,St2}; assign_prefixexp_rest(Exp, St) -> assign_prefixexp_element(Exp, St). assign_prefixexp_element(#key{key=#lit{val=K}}, St) -> {[?SET_LIT_KEY(K)],St}; %[?PUSH_LIT(K),?SET_KEY] assign_prefixexp_element(#key{key=Exp}, St0) -> {Ie,St1} = exp(Exp, single, St0), {Ie ++ [?SET_KEY],St1}. %% call_stmt(Call, State) -> {CallIs,State}. %% Must pop function return value list from stack. call_stmt(#call_stmt{call=Exp}, St0) -> {Ie,St1} = exp(Exp, multiple, St0), {Ie ++ [?POP],St1}. %% return_stmt(Return, State) -> {ReturnIs,State}. %% Can ignore any value left on stack here. return_stmt(#return_stmt{exps=Es}, St0) -> {Ies,St1} = explist(Es, multiple, St0), {Ies ++ [?RETURN(length(Es))],St1}. %% block_stmt(Block, State) -> {BlockIs,State}. block_stmt(#block_stmt{body=Ss,lsz=Lsz,esz=Esz}, St0) -> {Iss,St1} = stmts(Ss, St0), {[?BLOCK_OPEN(Lsz, Esz)] ++ Iss ++ [?BLOCK_CLOSE],St1}. %% do_block(Block, Prefix, Postfix, State) -> {Block,State}. %% do_block(Block, State) -> {Block,State}. %% Do_block never returns external new variables. Fits into stmt(). do_block(Block, St) -> do_block(Block, [], [], St). do_block(#block{body=Ss,lsz=Lsz,esz=Esz}, Pre, Post, St0) -> {Iss,St1} = stmts(Ss, St0), {[?BLOCK_OPEN(Lsz, Esz)] ++ Pre ++ Iss ++ Post ++ [?BLOCK_CLOSE],St1}. %% while_stmt(While, State) -> {WhileIs,State}. while_stmt(#while_stmt{exp=E,body=B}, St0) -> {Ie,St1} = exp(E, single, St0), {Ib,St2} = do_block(B, St1), {[?WHILE(Ie, Ib)],St2}. %% repeat_stmt(Repeat, State) -> {RepeatIs,State}. repeat_stmt(#repeat_stmt{body=B}, St0) -> {Ib,St1} = do_block(B, St0), {[?REPEAT(Ib)],St1}. %% if_stmt(If, State) -> {IfIs,State}. %% We generate code which "steps down" the sequence of %% test-block. This means more nested calls but simpler emulator %% code. if_stmt(#if_stmt{tests=Ts,else_block=E}, St) -> if_tests(Ts, E, St). if_tests([{E,B}], #block{body=[]}, St0) -> Line = luerl_anno:line(element(2, E)), {CurLine,St1} = add_current_line(Line, St0), {Ie,St2} = exp(E, single, St1), {Ib,St3} = do_block(B, St2), {CurLine ++ Ie ++ [?IF_TRUE(Ib)],St3}; if_tests([{E,B}|Ts], Else, St0) -> Line = luerl_anno:line(element(2, E)), {CurLine,St1} = add_current_line(Line, St0), {Ie,St2} = exp(E, single, St1), {Ib,St3} = do_block(B, St2), {Its,St4} = if_tests(Ts, Else, St3), {CurLine ++ Ie ++ [?IF(Ib, Its)],St4}; if_tests([], Else, St0) -> {Ielse,St1} = do_block(Else, St0), {Ielse,St1}. %% numfor_stmt(For, State) -> {ForIs,State}. numfor_stmt(#nfor_stmt{var=V,init=I,limit=L,step=S,body=B}, St0) -> {Ies,St1} = explist([I,L,S], single, St0), {Ib,St2} = do_block(B, set_var(V), [], St1), {Ies ++ [?NFOR(V, Ib)],St2}. %% %% An experiment to put the block *outside* the for loop. %% numfor_stmt(#nfor_stmt{v=V,init=I,limit=L,step=S,b=B}, St0) -> %% {Ies,St1} = explist([I,L,S], single, St0), %% {Ib,St2} = do_block(B, St1), %% [?BLOCK(Lsz, Esz, Is)] = Ib, %% ForBlock = [?BLOCK(Lsz, Esz, [?NFOR(V,set_var(V) ++ Is)])], %% {Ies ++ ForBlock,St2}. %% genfor_stmt(For, State) -> {ForIs,State}. %% Evaluate the explist to return the generator function, data and %% initial value. The handling of setting the pushing and setting the %% vars in the block come from assign_local_loop. genfor_stmt(Gfor, St) -> genfor_stmt_1(Gfor, St). genfor_stmt_1(#gfor_stmt{vars=Vs,gens=Gs,body=B}, St0) -> {Igs,St1} = explist(Gs, multiple, St0), {Ias,St2} = assign_local_loop_var(Vs, 0, St1), {Ib,St3} = do_block(B, Ias, [], St2), {Igs ++ [?POP_VALS(length(Gs))] ++ [?GFOR(Vs, Ib)],St3}. %% local_assign_stmt(Local, State) -> {Ilocal,State}. %% We must evaluate all expressions, even the unneeded ones. %% Have two versions, run both and see that we get the same result. local_assign_stmt(#local_assign_stmt{vars=Vs,exps=Es}, St) -> R = assign_local_test(Vs, Es, St), R = assign_local(Vs, Es, St). assign_local([V|Vs], [], St0) -> {Ias,St1} = assign_local_loop_var(Vs, St0), {[?PUSH_LIT([])] ++ Ias ++ set_var(V),St1}; assign_local(Vs, Es, St) -> assign_local_loop(Vs, Es, St). assign_local_test([V|Vs], [], St0) -> {Ias,St1} = assign_loop_var(Vs, St0), {[?PUSH_LIT([])] ++ Ias ++ set_var(V),St1}; assign_local_test(Vs, Es, St) -> assign_loop(Vs, Es, St). %% assign_local_loop(Vars, Exps, State) -> {Iassigns,State}. %% Must be careful with pushing and popping values here. Make sure %% all non-last values are singleton. %% %% This could most likely be folded together with assign_loop/3. assign_local_loop([V], [E], St0) -> %Remove unnecessary ?PUSH_VALS {Ie,St1} = exp(E, single, St0), %Last argument to one variable! {Ie ++ set_var(V),St1}; assign_local_loop([V|Vs], [E], St0) -> {Ie,St1} = exp(E, multiple, St0), %Last argument to many vars! {Ias,St2} = assign_local_loop_var(Vs, St1), {Ie ++ Ias ++ set_var(V),St2}; assign_local_loop([V|Vs], [E|Es], St0) -> {Ie,St1} = exp(E, single, St0), %Not last argument! {Ias,St2} = assign_local_loop(Vs, Es, St1), {Ie ++ Ias ++ set_var(V),St2}; assign_local_loop([], Es, St) -> assign_local_loop_exp(Es, St). %% assign_local_loop_var(Vars, State) -> {Iassigns,State}. %% Extract necessary number of values from value list on stack. Pad %% with nil. assign_local_loop_var(Vs, St) -> assign_local_loop_var(Vs, 1, St). assign_local_loop_var([V|Vs], Vc, St0) -> {Ias,St1} = assign_local_loop_var(Vs, Vc+1, St0), {Ias ++ set_var(V),St1}; assign_local_loop_var([], Vc, St) -> {[?PUSH_VALS(Vc)],St}. %% assign_local_loop_exp(Exprs, State) -> {Instrs,State}. %% Evaluate remaining expressions and pop the values from the stack. assign_local_loop_exp([E|Es], St0) -> {Ie,St1} = exp(E, single, St0), %It will be dropped anyway {Ias,St2} = assign_local_loop_exp(Es, St1), {Ie ++ Ias ++ [?POP],St2}; %Pop value off stack assign_local_loop_exp([], St) -> {[],St}. %% local_fdef_stmt(Local, State) -> {ILocal,State}. local_fdef_stmt(#local_fdef_stmt{var=V,func=F}, St0) -> {If,St1} = functiondef(F, St0), {If ++ set_var(V),St1}. %% expr_stmt(Expr, State) -> {ExprIs,State}. %% The expression pseudo statement. This will return a single value %% which we leave on the stack. expr_stmt(#expr_stmt{exp=Exp}, St0) -> {Ie,St1} = exp(Exp, single, St0), {Ie,St1}. %% explist(Exprs, Values, State) -> {Instrs,State}. %% exp(Expr, Values, State) -> {Instrs,State}. %% Values determines if we are to only return the first value of a %% list of values. Values multiple makes us a return a list! explist([E], S, St) -> exp(E, S, St); %Append values to output? explist([E|Es], S, St0) -> {Ie,St1} = exp(E, single, St0), {Ies,St2} = explist(Es, S, St1), {Ie ++ Ies,St2}; explist([], _, St) -> {[],St}. %No expressions at all exp(#lit{val=L}, S, St) -> Is = [?PUSH_LIT(L)], {multiple_values(S, Is),St}; exp(#fdef{}=F, S, St0) -> {If,St1} = functiondef(F, St0), {multiple_values(S, If), St1}; exp(#op{op='and',args=[A1,A2]}, S, St0) -> {Ia1,St1} = exp(A1, S, St0), {Ia2,St2} = exp(A2, S, St1), {Ia1 ++ [?AND_THEN(Ia2)],St2}; %Must handle single/multiple exp(#op{op='or',args=[A1,A2]}, S, St0) -> {Ia1,St1} = exp(A1, S, St0), {Ia2,St2} = exp(A2, S, St1), {Ia1 ++ [?OR_ELSE(Ia2)],St2}; %Must handle single/multiple exp(#op{op=Op,args=As}, S, St0) -> {Ias,St1} = explist(As, single, St0), Iop = Ias ++ [?OP(Op,length(As))], {multiple_values(S, Iop),St1}; exp(#tabcon{fields=Fs}, S, St0) -> {Its,Fc,I,St1} = tableconstructor(Fs, St0), {Its ++ multiple_values(S, [?BUILD_TAB(Fc,I)]),St1}; exp(#lvar{n='...'}=V, S, St) -> %Can be either local or frame {single_value(S, get_var(V)),St}; exp(#evar{n='...'}=V, S, St) -> {single_value(S, get_var(V)),St}; exp(E, S, St) -> prefixexp(E, S, St). %% single_value(Values, Instrs) -> Instrs. %% multiple_values(Values, Instrs) -> Instrs. %% Ensure either single value or multiple value. single_value(single, Is) -> Is ++ [?SINGLE]; single_value(multiple, Is) -> Is. multiple_values(single, Is) -> Is; multiple_values(multiple, Is) -> Is ++ [?MULTIPLE]. %% prefixexp(Expr, Values, State) -> {Instrs,State}. %% prefixexp_rest(Expr, Values, State) -> {Instrs,State}. %% prefixexp_first(Expr, Values, State) -> {Instrs,State}. %% prefixexp_element(Expr, Values, State) -> {Instrs,State}. %% Single determines if we are to only return the first value of a %% list of values. Single false makes us a return a list! prefixexp(#dot{exp=Exp,rest=Rest}, S, St0) -> {Ie,St1} = prefixexp_first(Exp, single, St0), {Ir,St2} = prefixexp_rest(Rest, S, St1), {Ie ++ Ir,St2}; prefixexp(Exp, S, St) -> prefixexp_first(Exp, S, St). prefixexp_first(#single{exp=E}, S, St0) -> {Ie,St1} = exp(E, single, St0), %Will make it single {multiple_values(S, Ie),St1}; prefixexp_first(Var, S, St) -> {multiple_values(S, get_var(Var)),St}. prefixexp_rest(#dot{exp=Exp,rest=Rest}, S, St0) -> {Ie,St1} = prefixexp_element(Exp, single, St0), {Ir,St2} = prefixexp_rest(Rest, S, St1), {Ie ++ Ir,St2}; prefixexp_rest(Exp, S, St) -> prefixexp_element(Exp, S, St). prefixexp_element(#key{key=#lit{val=K}}, S, St) -> {multiple_values(S, [?GET_LIT_KEY(K)]),St}; prefixexp_element(#key{key=E}, S, St0) -> {Ie,St1} = exp(E, single, St0), {Ie ++ multiple_values(S, [?GET_KEY]),St1}; %% prefixexp_element(#fcall{args=[]}, S, St) -> %% Ifs = [?FCALL(0)], %% {single_value(S, Ifs),St}; %Function call returns list %% prefixexp_element(#fcall{args=As}, S, St0) -> %% {Ias,St1} = explist(As, multiple, St0), %% Ifs = Ias ++ [?FCALL(length(As))], %% {single_value(S, Ifs),St1}; %Function call returns list prefixexp_element(#fcall{args=As}, S, St0) -> {Ias,St1} = explist(As, multiple, St0), Ifs = Ias ++ [?POP_ARGS(length(As)),?FCALL], {single_value(S, Ifs),St1}; %Function call returns list %% prefixexp_element(#mcall{meth=#lit{val=K},args=[]}, S, St) -> %% Ims = [?MCALL(K, 0)], %% {single_value(S, Ims),St}; %Method call returns list %% prefixexp_element(#mcall{meth=#lit{val=K},args=As}, S, St0) -> %% {Ias,St1} = explist(As, multiple, St0), %% Ims = Ias ++ [?MCALL(K, length(As))], %% {single_value(S, Ims),St1}. %Method call returns list prefixexp_element(#mcall{meth=#lit{val=K},args=As}, S, St0) -> {Ias,St1} = explist(As, multiple, St0), Ims = Ias ++ [?POP_ARGS(length(As)),?MCALL(K)], {single_value(S, Ims),St1}. %Method call returns list %% functiondef(Func, State) -> {Func,State}. %% This will return a single value which we leave on the stack. Set %% the local current line to 0 to get correct line numbers inside the %% function. Reset to the original afterwards. functiondef(#fdef{l=Anno0,pars=Ps0,body=Ss,lsz=Lsz,esz=Esz}, #c_cg{line=Line,vfile=Vfile}=St0) -> St1 = St0#c_cg{line=0}, %Set current line to 0 %% Set the functions file annotation to the virtual file. Anno1 = luerl_anno:set(file, Vfile, Anno0), Ps1 = func_pars(Ps0), {Iss,St2} = stmts(Ss, St1), Iss1 = [?PUSH_ARGS(Ps1)] ++ gen_store(Ps1, Iss ++ [?RETURN(0)]), {[?PUSH_FDEF(Anno1,Lsz,Esz,Ps1,Iss1)],St2#c_cg{line=Line}}. func_pars([#evar{n='...',i=I}]) -> -I; %Tail is index for varargs func_pars([#lvar{n='...',i=I}]) -> I; func_pars([#evar{i=I}|Ps]) -> [-I|func_pars(Ps)]; func_pars([#lvar{i=I}|Ps]) -> [I|func_pars(Ps)]; func_pars([]) -> []. %No varargs %% Experiments testing case where we push the args onto the stack and %% have explicit instructions which pop them and store them in the LVs %% and Upvs. gen_store([V|Vs], Is) when V > 0 -> gen_store(Vs, [?STORE_LVAR(1, V)|Is]); gen_store([V|Vs], Is) when V < 0 -> gen_store(Vs, [?STORE_EVAR(1, -V)|Is]); gen_store([], Is) -> Is; gen_store(V, Is) when V > 0 -> [?STORE_LVAR(1, V)|Is]; gen_store(V, Is) when V < 0 -> [?STORE_LVAR(1, -V)|Is]. %% tableconstructor(Fields, State) -> {Ifields,FieldCount,Index,State}. %% FieldCount is how many Key/Value pairs are on the stack, Index is %% the index of the next value in the last value pushed. Make sure %% that the last value is a multiple. tableconstructor(Fs, St0) -> {Its,Fc,I,St1} = tc_fields(Fs, 0, St0), {Its,Fc,I,St1}. tc_fields([#efield{val=V}], I0, St0) -> I1 = I0 + 1, %Index of next element {Iv,St1} = exp(V, multiple, St0), {Iv,0,I1,St1}; tc_fields([#efield{val=V}|Fs], I0, St0) -> I1 = I0 + 1, %Index of next element {Iv,St1} = exp(V, single, St0), {Ifs,Fc,I2,St2} = tc_fields(Fs, I1, St1), {[?PUSH_LIT(I1)] ++ Iv ++ Ifs,Fc+1,I2,St2}; tc_fields([#kfield{key=K,val=V}|Fs], I0, St0) -> {Ik,St1} = exp(K, single, St0), {Iv,St2} = exp(V, single, St1), {Ifs,Fc,I1,St3} = tc_fields(Fs, I0, St2), {Ik ++ Iv ++ Ifs,Fc+1,I1,St3}; tc_fields([], _, St) -> {[?PUSH_LIT([])],0,1,St}. rvirding-luerl-772b25e/src/luerl_sup.erl0000664000232200023220000000357015114130670020676 0ustar debalancedebalance%% Copyright (c) 2013-2021 Robert Virding %% %% Licensed under the Apache License, Version 2.0 (the "License"); %% you may not use this file except in compliance with the License. %% You may obtain a copy of the License at %% %% http://www.apache.org/licenses/LICENSE-2.0 %% %% Unless required by applicable law or agreed to in writing, software %% distributed under the License is distributed on an "AS IS" BASIS, %% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. %% See the License for the specific language governing permissions and %% limitations under the License. -module(luerl_sup). -include("luerl.hrl"). ?MODULEDOC(false). -behaviour(supervisor). %% API -export([start_link/0]). %% Supervisor callbacks -export([init/1]). -define(SERVER, ?MODULE). %% =================================================================== %% API functions %% =================================================================== start_link() -> supervisor:start_link({local, ?SERVER}, ?MODULE, []). %% =================================================================== %% Supervisor callbacks %% =================================================================== %% sup_flags() = #{strategy => strategy(), % optional %% intensity => non_neg_integer(), % optional %% period => pos_integer()} % optional %% child_spec() = #{id => child_id(), % mandatory %% start => mfargs(), % mandatory %% restart => restart(), % optional %% shutdown => shutdown(), % optional %% type => worker(), % optional %% modules => modules()} % optional init([]) -> SupFlags = #{strategy => one_for_one, intensity => 5, period => 10}, ChildSpecs = [], {ok, {SupFlags, ChildSpecs}}. %% internal functions rvirding-luerl-772b25e/src/luerl_heap.erl0000664000232200023220000006721315114130670021010 0ustar debalancedebalance%% Copyright (c) 2020-2024 Robert Virding %% %% Licensed under the Apache License, Version 2.0 (the "License"); %% you may not use this file except in compliance with the License. %% You may obtain a copy of the License at %% %% http://www.apache.org/licenses/LICENSE-2.0 %% %% Unless required by applicable law or agreed to in writing, software %% distributed under the License is distributed on an "AS IS" BASIS, %% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. %% See the License for the specific language governing permissions and %% limitations under the License. %% File : luerl_heap.erl %% Author : Robert Virding %% Purpose : Implements the heap section of the Luerl state. %% %% Note that here we only handle the data in the heap and never call %% anything in either Luerl or Erlang. Those cases where this could %% happen we return values informing the caller to do it. For example %% in the set_table_key and get_table_key functions. -module(luerl_heap). -include("luerl.hrl"). ?MODULEDOC(false). -export([init/0]). %% External interface. -export([gc/1, alloc_table/1,alloc_table/2,free_table/2, get_table/2,set_table/3,upd_table/3,chk_table/2, get_global_key/2,set_global_key/3, get_table_key/3,set_table_key/4, raw_get_table_key/3,raw_set_table_key/4, alloc_userdata/2,alloc_userdata/3,free_userdata/2, get_userdata/2,set_userdata/3,upd_userdata/3,chk_userdata/2, set_userdata_data/3,get_userdata_data/2, alloc_funcdef/2,get_funcdef/2,set_funcdef/3, alloc_environment/2,get_env_var/3,set_env_var/4, get_metamethod/3,get_metamethod/4, get_metatable/2, set_metatable/3 ]). -import(luerl_lib, [lua_error/2,badarg_error/3]). %% init() -> State %% %% Initialise the heap section of the state and return the state. init() -> St0 = #luerl{meta=#meta{},tag=make_ref()}, init_tables(St0). init_tables(St) -> %% Initialise the table handling. Tst = init_tstruct(), %% Initialise the environment handling. Est = init_tstruct(), %% Initialise the userdata handling. Ust = init_tstruct(), %% Initialise the function def handling. Fst = init_tstruct(), St#luerl{tabs=Tst,envs=Est,usds=Ust,fncs=Fst}. %% init_tstruct() -> #tstruct{}. %% alloc_tstruct(Val, #tstruct{}) -> {Index,#tstruct{}}. %% set_tstruct(Index, Val, #tstruct{}) -> #tstruct{}. %% upd_tstruct(Index, UpdFun, #tstruct{}) -> #tstruct{}. %% del_tstruct(Index, #tstruct{}) -> #tstruct{}. %% chk_tstruct(Index, #tstruct{}) -> ok | error. %% %% Functions for accessing tstructs. init_tstruct() -> #tstruct{data=?MAKE_TABLE(),free=[],next=0}. alloc_tstruct(Val, #tstruct{data=D0,free=[N|Ns]}=Tstr) -> D1 = ?SET_TABLE(N, Val, D0), {N,Tstr#tstruct{data=D1,free=Ns}}; alloc_tstruct(Val, #tstruct{data=D0,free=[],next=N}=Tstr) -> D1 = ?SET_TABLE(N, Val, D0), {N,Tstr#tstruct{data=D1,next=N+1}}. set_tstruct(N, Val, #tstruct{data=D0}=Tstr) -> D1 = ?SET_TABLE(N, Val, D0), Tstr#tstruct{data=D1}. upd_tstruct(N, Upd, #tstruct{data=D0}=Tstr) -> D1 = ?UPD_TABLE(N, Upd, D0), Tstr#tstruct{data=D1}. del_tstruct(N, #tstruct{data=D0,free=Ns}=Tstr) -> D1 = ?DEL_TABLE(N, D0), Tstr#tstruct{data=D1,free=[N|Ns]}. -compile({inline,[get_tstruct/2]}). %Such a simple function get_tstruct(N, Tstr) -> ?GET_TABLE(N, Tstr#tstruct.data). chk_tstruct(N, Tstr) -> case ?CHK_TABLE(N, Tstr#tstruct.data) of true -> ok; false -> error end. %% alloc_table(State) -> {Tref,State} %% %% Allocate an empty table. alloc_table(St) -> alloc_table([], St). %% alloc_table(InitialTable, State) -> {Tref,State} %% %% The InitialTable is [{Key,Value}] or map, there is no longer any %% need to have it as an orddict. alloc_table(Itab, #luerl{tabs=Tst0}=St) -> Tab = create_table(Itab), {N,Tst1} = alloc_tstruct(Tab, Tst0), {#tref{i=N},St#luerl{tabs=Tst1}}. create_table(Itab) when is_map(Itab) -> create_table(maps:to_list(Itab)); create_table(Itab) -> D0 = ttdict:new(), A0 = array:new([{default,nil}]), %Arrays with 'nil' as default Init = fun ({_,nil}, {D,A}) -> {D,A}; %Ignore nil values ({K,V}, {D,A}) when is_integer(K), K >= 1 -> {D,array:set(K, V, A)}; ({K,V}, {D,A}) when is_float(K) -> case ?IS_FLOAT_INT(K, I) of true when I >= 1 -> {D,array:set(I, V, A)}; _NegFalse -> {ttdict:store(K, V, D),A} end; ({K,V}, {D,A}) -> {ttdict:store(K, V, D),A} end, {D1,A1} = lists:foldl(Init, {D0,A0}, Itab), #table{a=A1,d=D1,meta=nil}. %% free_table(Tref, State) -> State %% %% Delete a table freeing its space. free_table(#tref{i=N}, #luerl{tabs=Tst0}=St) -> Tst1 = del_tstruct(N, Tst0), St#luerl{tabs=Tst1}. %% get_table(Tref, State) -> Table %% %% Get the table referred to by Tref. get_table(#tref{i=N}, #luerl{tabs=Tst}) -> get_tstruct(N, Tst). %% set_table(Tref, Table, State) -> State %% %% Set a new table at the location referred to by Tref %% overwriting the existing one. set_table(#tref{i=N}, Tab, #luerl{tabs=Tst0}=St) -> Tst1 = set_tstruct(N, Tab, Tst0), St#luerl{tabs=Tst1}. %% upd_table(Tref, Fun, State) -> State %% %% Update the table at the location referred to by Tref. upd_table(#tref{i=N}, Upd, #luerl{tabs=Tst0}=St) -> Tst1 = upd_tstruct(N, Upd, Tst0), St#luerl{tabs=Tst1}. %% chk_table(Tref, State) -> ok | error. %% %% Check the table referenced by Tref actually exists. chk_table(#tref{i=N}, #luerl{tabs=Tst}) -> chk_tstruct(N, Tst). %% set_global_key(Key, Value, State) -> %% {value,Value,State} | {meta,Method,Args,State} | {error,Error,State} %% %% Set a key in the global name table _G to value. set_global_key(Key, Val, #luerl{g=G}=St) -> set_table_key(G, Key, Val, St). %% get_global_key(Key, State) -> %% {value,Value,State} | {meta,Method,Args,State} | {error,Error,State} %% %% Get the value of a key in the global name table, _G. get_global_key(Key, #luerl{g=G}=St) -> get_table_key(G, Key, St). %% set_table_key(Table, Key, Val, State) -> %% {value,Value,State} | {meta,Method,Args,State} | {error,Error,State} %% %% We don't make calls to meta methods or generate errors but %% return a value indicating this. Setting a value to 'nil' will clear %% it from the table and the array. We won't add a nil value. set_table_key(#tref{}=Tref, Key, Val, St) when is_integer(Key), Key >= 1 -> set_table_key_int(Tref, Key, Key, Val, St); set_table_key(#tref{}=Tref, Key, Val, St) when is_float(Key) -> case ?IS_FLOAT_INT(Key, I) of true when I >= 1 -> set_table_key_int(Tref, Key, I, Val, St); _NegFalse -> set_table_key_key(Tref, Key, Val, St) end; set_table_key(Tab, nil=Key, _, St) -> {error,{illegal_index,Tab,Key},St}; set_table_key(#tref{}=Tref, Key, Val, St) -> set_table_key_key(Tref, Key, Val, St); set_table_key(Other, Key, Val, St) -> Meta = get_metamethod(Other, <<"__newindex">>, St), %% io:format("stk ~p ~p ~p -> ~p\n", [Other,Key,Val,aMeta]), case Meta of nil -> {error,{illegal_index,Other,Key},St}; Meth when ?IS_FUNCTION(Meth) -> {meta,Meth,[Other,Key,Val],St}; Meth -> %Recurse down the metatable set_table_key(Meth, Key, Val, St) end. set_table_key_key(#tref{i=N}=Tab, Key, Val, #luerl{tabs=Tst0}=St) -> Ts0 = Tst0#tstruct.data, #table{d=Dict0,meta=Meta}=T = ?GET_TABLE(N, Ts0), case ttdict:find(Key, Dict0) of {ok,_} -> %Key exists Dict1 = if Val =:= nil -> ttdict:erase(Key, Dict0); true -> ttdict:store(Key, Val, Dict0) end, Ts1 = ?SET_TABLE(N, T#table{d=Dict1}, Ts0), Tst1 = Tst0#tstruct{data=Ts1}, {value,[],St#luerl{tabs=Tst1}}; error -> %Key does not exist case get_metamethod_tab(Meta, <<"__newindex">>, Ts0) of nil -> %% Only add non-nil value. Dict1 = if Val =:= nil -> Dict0; true -> ttdict:store(Key, Val, Dict0) end, Ts1 = ?SET_TABLE(N, T#table{d=Dict1}, Ts0), Tst1 = Tst0#tstruct{data=Ts1}, {value,[],St#luerl{tabs=Tst1}}; Meth when ?IS_FUNCTION(Meth) -> {meta,Meth,[Tab,Key,Val],St}; Meth -> set_table_key(Meth, Key, Val, St) end end. set_table_key_int(#tref{i=N}=Tab, Key, I, Val, #luerl{tabs=Tst0}=St) -> Ts0 = Tst0#tstruct.data, #table{a=Arr0,meta=Meta}=T = ?GET_TABLE(N, Ts0), case array:get(I, Arr0) of nil -> %Key does not exist case get_metamethod_tab(Meta, <<"__newindex">>, Ts0) of nil -> %% Only add non-nil value, slightly faster (?) Arr1 = if Val =:= nil -> Arr0; true -> array:set(I, Val, Arr0) end, Ts1 = ?SET_TABLE(N, T#table{a=Arr1}, Ts0), Tst1 = Tst0#tstruct{data=Ts1}, {value,[],St#luerl{tabs=Tst1}}; Meth when ?IS_FUNCTION(Meth) -> {meta,Meth,[Tab,Key,Val],St}; Meth -> set_table_key(Meth, Key, Val, St) end; _ -> %Key exists %% Can do this as 'nil' is default value of array. Arr1 = array:set(I, Val, Arr0), Ts1 = ?SET_TABLE(N, T#table{a=Arr1}, Ts0), Tst1 = Tst0#tstruct{data=Ts1}, {value,[],St#luerl{tabs=Tst1}} end. %% get_table_key(Table, Key, State) -> %% {value,Value,State} | {meta,Method,Args,State} | {error,Error,State} %% %% We don't make calls to meta methods or generate errors but %% return value indicating this. get_table_key(#tref{}=Tref, Key, St) when is_integer(Key), Key >= 1 -> get_table_key_int(Tref, Key, Key, St); get_table_key(#tref{}=Tref, Key, St) when is_float(Key) -> case ?IS_FLOAT_INT(Key, I) of true when I >= 1 -> get_table_key_int(Tref, Key, I, St); _NegFalse -> get_table_key_key(Tref, Key, St) end; get_table_key(#tref{}=Tref, Key, St) -> get_table_key_key(Tref, Key, St); get_table_key(Other, Key, St) -> %Just find the metamethod Meta = get_metamethod(Other, <<"__index">>, St), %% io:format("gtk ~p ~p -> ~p\n", [Other,Key,Meta]), case Meta of nil -> {error,{illegal_index,Other,Key},St}; Meth when ?IS_FUNCTION(Meth) -> {meta,Meth,[Other,Key],St}; Meth -> %Recurse down the metatable get_table_key(Meth, Key, St) end. get_table_key_key(#tref{i=N}=Tab, Key, #luerl{tabs=#tstruct{data=Ts}}=St) -> #table{d=Dict,meta=Meta} = ?GET_TABLE(N, Ts), case ttdict:find(Key, Dict) of {ok,Val} -> {value,Val,St}; error -> %% Key not present so try metamethod get_table_key_metamethod(Tab, Meta, Key, Ts, St) end. get_table_key_int(#tref{i=N}=T, Key, I, #luerl{tabs=#tstruct{data=Ts}}=St) -> #table{a=A,meta=Meta} = ?GET_TABLE(N, Ts), %Get the table. case array:get(I, A) of nil -> %% Key not present so try metamethod get_table_key_metamethod(T, Meta, Key, Ts, St); Val -> {value,Val,St} end. get_table_key_metamethod(Tab, Meta, Key, Ts, St) -> case get_metamethod_tab(Meta, <<"__index">>, Ts) of nil -> {value,nil,St}; Meth when ?IS_FUNCTION(Meth) -> {meta,Meth,[Tab,Key],St}; Meth -> %Recurse down the metatable get_table_key(Meth, Key, St) end. %% raw_get_table_key(Table, Key, State) -> Value. %% raw_set_table_key(Table, Key, Value, State) -> State. %% %% Get/set key values in tables without metamethods. raw_get_table_key(#tref{i=N}, Key, #luerl{tabs=Tst}) when is_integer(Key), Key >= 1 -> raw_get_table_key_int(N, Key, Tst); raw_get_table_key(#tref{i=N}, Key, #luerl{tabs=Tst}) when is_float(Key) -> case ?IS_FLOAT_INT(Key, I) of true when I >= 1 -> raw_get_table_key_int(N, I, Tst); _NegFalse -> raw_get_table_key_key(N, Key, Tst) end; raw_get_table_key(#tref{i=N}, Key, #luerl{tabs=Tst}) -> raw_get_table_key_key(N, Key, Tst). raw_get_table_key_key(N, Key, Tst) -> #table{d=Dict} = get_tstruct(N, Tst), case ttdict:find(Key, Dict) of {ok,Val} -> Val; error -> nil end. raw_get_table_key_int(N, Key, Tst) -> #table{a=Arr} = get_tstruct(N, Tst), array:get(Key, Arr). raw_set_table_key(#tref{}=Tref, Key, Val, #luerl{tabs=Tst0}=St) when is_integer(Key), Key >= 1 -> Tst1 = raw_set_table_key_int(Tref, Key, Val, Tst0), St#luerl{tabs=Tst1}; raw_set_table_key(#tref{}=Tref, Key, Val, #luerl{tabs=Tst0}=St) when is_float(Key) -> Tst1 = case ?IS_FLOAT_INT(Key, I) of true when I >= 1 -> raw_set_table_key_int(Tref, I, Val, Tst0); _NegFalse -> raw_set_table_key_key(Tref, Key, Val, Tst0) end, St#luerl{tabs=Tst1}; raw_set_table_key(#tref{}=Tref, Key, Val, #luerl{tabs=Tst0}=St) -> Tst1 = raw_set_table_key_key(Tref, Key, Val, Tst0), St#luerl{tabs=Tst1}. raw_set_table_key_key(#tref{i=N}, Key, Val, Tst0) -> Fun = fun (#table{d=Dict0}=Tab) -> Dict1 = if Val =:= nil -> ttdict:erase(Key, Dict0); true -> ttdict:store(Key, Val, Dict0) end, Tab#table{d=Dict1} end, upd_tstruct(N, Fun, Tst0). raw_set_table_key_int(#tref{i=N}, Key, Val, Tst0) -> Fun = fun (#table{a=Arr0}=Tab) -> %% Default array value is nil. Arr1 = array:set(Key, Val, Arr0), Tab#table{a=Arr1} end, upd_tstruct(N, Fun, Tst0). %% alloc_userdata(Data, State) -> {Usdref,State} %% %% Allocate userdata with empty metadata. alloc_userdata(Data, St) -> alloc_userdata(Data, nil, St). %% alloc_userdata(Data, Meta, State) -> {Usdref,State}. %% %% Allocate userdata setting its metadata. alloc_userdata(Data, Meta, #luerl{usds=Ust0}=St) -> Ud = #userdata{d=Data,meta=Meta}, {N,Ust1} = alloc_tstruct(Ud, Ust0), {#usdref{i=N},St#luerl{usds=Ust1}}. %% free_userdata(Usdref, State) -> State %% %% Delete a table freeing its space. free_userdata(#usdref{i=N}, #luerl{usds=Ust0}=St) -> Ust1 = del_tstruct(N, Ust0), St#luerl{usds=Ust1}. %% get_userdata(Usdref, State) -> {UserData,State} %% %% Get the userdata refered to by Usdref, get_userdata(#usdref{i=N}, #luerl{usds=Ust}=St) -> #userdata{} = Udata = get_tstruct(N, Ust), {Udata,St}. %% set_userdata(Usdref, Data, State) -> State %% %% Set a new userdata at the location referred to by Usdref %% overwriting the existing one. set_userdata(#usdref{i=N}, #userdata{}=Udata, #luerl{usds=Ust0}=St) -> Ust1 = set_tstruct(N, Udata, Ust0), St#luerl{usds=Ust1}. %% upd_userdata(Usdref, Fun, State) -> State %% %% Update the data in the userdata referred to by Usdref. upd_userdata(#usdref{i=N}, Upd, #luerl{usds=Ust0}=St) -> Ust1 = upd_tstruct(N, Upd, Ust0), St#luerl{usds=Ust1}. %% chk_userdata(Usdref, State) -> ok | error. %% %% Check the userdata referenced by Tref actually exists. chk_userdata(#usdref{i=N}, #luerl{usds=Ust}) -> chk_tstruct(N, Ust). %% get_userdata_data(Usdref, State) -> {Data,State} %% %% Get the data form the userdata refered to by Usdref. get_userdata_data(#usdref{i=N}, #luerl{usds=Ust}=St) -> Udata = get_tstruct(N, Ust), {Udata#userdata.d,St}. %% set_userdata_data(Usdref, Data, State) -> State %% %% Set a new userdata at the location referred to by Usdref %% overwriting the existing one. set_userdata_data(#usdref{i=N}, Data, #luerl{usds=Ust0}=St) -> Ust1 = upd_tstruct(N, fun (Ud) -> Ud#userdata{d=Data} end, Ust0), St#luerl{usds=Ust1}. %% make_userdata(Data) -> make_userdata(Data, nil). %% make_userdata(Data, Meta) -> #userdata{d=Data,meta=Meta}. %% alloc_funcdef(Def, State) -> {FunRef,State} alloc_funcdef(Func, #luerl{fncs=Fst0}=St) -> {N,Fst1} = alloc_tstruct(Func, Fst0), {#funref{i=N},St#luerl{fncs=Fst1}}. %% get_funcdef(Funref, State) -> {Fdef,State} %% %% Get the function data referred to by Fref. get_funcdef(#funref{i=N}, #luerl{fncs=Fst}=St) -> Fdef = get_tstruct(N, Fst), {Fdef,St}. %% set_funcdef(Funref, Fdef, State) -> State. %% %% Set the function data referred to by Fref. set_funcdef(#funref{i=N}, Func, #luerl{fncs=Fst0}=St) -> Fst1 = set_tstruct(N, Func, Fst0), St#luerl{fncs=Fst1}. %% get_metamethod(Object, Event, State) -> Method | nil %% get_metamethod(Object1, Object2, Event, State) -> Method | nil %% %% Get the metamethod for object(s). get_metamethod(O1, O2, E, St) -> case get_metamethod(O1, E, St) of nil -> get_metamethod(O2, E, St); M -> M end. get_metamethod(O, E, St) -> Meta = get_metatable(O, St), %Can be nil %% io:format("gm ~p ~p -> ~p\n", [O,E,Meta]), get_metamethod_tab(Meta, E, St#luerl.tabs#tstruct.data). get_metamethod_tab(#tref{i=M}, E, Ts) -> #table{d=Mdict} = ?GET_TABLE(M, Ts), case ttdict:find(E, Mdict) of {ok,Mm} -> Mm; error -> nil end; get_metamethod_tab(_, _, _) -> nil. %Other types have no metatables %% get_metatable(Obj, State) -> MetaTable %% %% Get the metatable of an object or its type metatable. get_metatable(#tref{i=T}, #luerl{tabs=Tst}) -> (get_tstruct(T, Tst))#table.meta; get_metatable(#usdref{i=U}, #luerl{usds=Ust}) -> (get_tstruct(U, Ust))#userdata.meta; get_metatable(nil, #luerl{meta=Meta}) -> Meta#meta.nil; get_metatable(B, #luerl{meta=Meta}) when is_boolean(B) -> Meta#meta.boolean; get_metatable(N, #luerl{meta=Meta}) when is_number(N) -> Meta#meta.number; get_metatable(S, #luerl{meta=Meta}) when is_binary(S) -> Meta#meta.string; get_metatable(_, _) -> nil. %Other types have no metatables %% set_metatable(Obj, MetaTable, State) -> State %% %% Set the metatable of an object or its type metatable. set_metatable(#tref{i=N}, M, #luerl{tabs=Tst0}=St) -> Tst1 = upd_tstruct(N, fun (Tab) -> Tab#table{meta=M} end, Tst0), St#luerl{tabs=Tst1}; set_metatable(#usdref{i=N}, M, #luerl{usds=Ust0}=St) -> Ust1 = upd_tstruct(N, fun (Ud) -> Ud#userdata{meta=M} end, Ust0), St#luerl{usds=Ust1}; set_metatable(nil, M, #luerl{meta=Meta0}=St) -> Meta1 = Meta0#meta{nil=M}, St#luerl{meta=Meta1}; set_metatable(B, M, #luerl{meta=Meta0}=St) when is_boolean(B) -> Meta1 = Meta0#meta{boolean=M}, St#luerl{meta=Meta1}; set_metatable(N, M, #luerl{meta=Meta0}=St) when is_number(N) -> Meta1 = Meta0#meta{number=M}, St#luerl{meta=Meta1}; set_metatable(B, M, #luerl{meta=Meta0}=St) when is_binary(B) -> Meta1 = Meta0#meta{string=M}, St#luerl{meta=Meta1}; set_metatable(_, _, St) -> %Do nothing for the rest St. %% alloc_environment(Size, State) -> {Fref,State} %% %% Allocate the environment in the environment table and return %% its eref. alloc_environment(Size, #luerl{envs=Est0}=St) -> Fr = erlang:make_tuple(Size, nil), {N,Est1} = alloc_tstruct(Fr, Est0), {#eref{i=N},St#luerl{envs=Est1}}. %% get_env_var(Eref, Index, State) -> Value. %% set_env_var(Eref, Index, Val, State) -> State. get_env_var(#eref{i=N}, Index, #luerl{envs=Etab}) -> element(Index, get_tstruct(N, Etab)). %% element(Index, ?GET_TABLE(N, Etab#tstruct.data)). set_env_var(#eref{i=N}, Index, Val, #luerl{envs=Est0}=St) -> Est1 = upd_tstruct(N, fun (Fr) -> setelement(Index, Fr, Val) end, Est0), St#luerl{envs=Est1}. %% gc(State) -> State. %% The garbage collector. Its main job is to reclaim unused tables %% and frames. It is a mark/sweep collector which passes over all %% objects and marks tables and frames which it has seen. All unseen %% tables and frames are then freed and their indexes added to the %% free lists. -record(gct, {t,s}). %Gc table info table, seen gc(#luerl{tabs=#tstruct{data=Tt0,free=Tf0}=Tab0, envs=#tstruct{data=Et0,free=Ef0}=Env0, usds=#tstruct{data=Ut0,free=Uf0}=Usd0, fncs=#tstruct{data=Ft0,free=Ff0}=Fnc0, g=G,stk=Stk,cs=Cs,meta=Meta}=St) -> %% The root set consisting of global table and stack. Root = [Meta#meta.nil,Meta#meta.boolean,Meta#meta.number,Meta#meta.string, G|Stk], %% Mark all seen tables and frames, i.e. return them. GcT = #gct{t=Tt0,s=[]}, GcE = #gct{t=Et0,s=[]}, GcU = #gct{t=Ut0,s=[]}, GcF = #gct{t=Ft0,s=[]}, {SeenT,SeenE,SeenU,SeenF} = mark(Root, [Cs], GcT, GcE, GcU, GcF), %% io:format("gc: ~p\n", [{SeenT,SeenF,SeenU}]), %% Free unseen tables and add freed to free list. {Tf1,Tt1} = filter_tables(SeenT, Tf0, Tt0), {Ef1,Et1} = filter_environment(SeenE, Ef0, Et0), {Uf1,Ut1} = filter_userdata(SeenU, Uf0, Ut0), {Ff1,Ft1} = filter_funcdefs(SeenF, Ff0, Ft0), %% And update the tables. Tab1 = Tab0#tstruct{data=Tt1,free=Tf1}, Env1 = Env0#tstruct{data=Et1,free=Ef1}, Usd1 = Usd0#tstruct{data=Ut1,free=Uf1}, Fnc1 = Fnc0#tstruct{data=Ft1,free=Ff1}, St#luerl{tabs=Tab1,envs=Env1,usds=Usd1,fncs=Fnc1}. %% mark(ToDo, MoreTodo, GcTabs, GcEnv, GcUserdata, GcFuncdefs) -> %% {SeenTabs,SeenFrames,SeenUserdata,SeenFuncdefs}. %% Scan over all live objects and mark seen tables by adding them to %% the seen list. mark([{in_table,_}=_T|Todo], More, GcT, GcE, GcU, GcF) -> %%io:format("gc: ~p\n", [_T]), mark(Todo, More, GcT, GcE, GcU, GcF); mark([#tref{i=T}|Todo], More, #gct{t=Tt,s=Ts0}=GcT, GcE, GcU, GcF) -> case ordsets:is_element(T, Ts0) of true -> %Already done mark(Todo, More, GcT, GcE, GcU, GcF); false -> %Mark it and add to todo Ts1 = ordsets:add_element(T, Ts0), #table{a=Arr,d=Dict,meta=Meta} = ?GET_TABLE(T, Tt), %% Have to be careful when adding Tab and Meta as Tab is %% [{Key,Val}], Arr is array and Meta is %% nil|#tref{i=M}. We want lists. Aes = array:sparse_to_list(Arr), Des = ttdict:to_list(Dict), mark([Meta|Todo], [[{in_table,T}],Des,Aes,[{in_table,-T}]|More], GcT#gct{s=Ts1}, GcE, GcU, GcF) end; mark([#eref{i=F}|Todo], More, GcT, #gct{t=Et,s=Es0}=GcE, GcU, GcF) -> %% io:format("eref0: ~p\ ~p ~pn", [F,Et,Es0]), case ordsets:is_element(F, Es0) of true -> %Already done mark(Todo, More, GcT, GcE, GcU, GcF); false -> %Mark it and add to todo Es1 = ordsets:add_element(F, Es0), Ses = tuple_to_list(?GET_TABLE(F, Et)), %% io:format("eref1: ~p ~p\n", [Et,Es1]), mark(Todo, [Ses|More], GcT, GcE#gct{s=Es1}, GcU, GcF) end; mark([#usdref{i=U}|Todo], More, GcT, GcE, #gct{s=Us0}=GcU, GcF) -> case ordsets:is_element(U, Us0) of true -> %Already done mark(Todo, More, GcT, GcE, GcU, GcF); false -> Us1 = ordsets:add_element(U, Us0), mark(Todo, More, GcT, GcE, GcU#gct{s=Us1}, GcF) end; mark([#funref{i=F,env=Erefs}|ToDo], More, GcT, GcE, GcU, #gct{t=Ft0,s=Fs0}=GcF) -> %% io:format("funref0: ~p ~p ~p\n", [F,Fs0,Erefs]), %% Each funref has its own environments but we only need to add %% the function definition once. case ordsets:is_element(F, Fs0) of true -> mark(ToDo, [Erefs|More], GcT, GcE, GcU, GcF); false -> %% And mark the function definition. Fs1 = ordsets:add_element(F, Fs0), Fdef = ?GET_TABLE(F, Ft0), %% io:format("funref1: ~p ~p ~p\n", [F,Fs1,Erefs]), mark([Fdef|ToDo], [Erefs|More], GcT, GcE, GcU, GcF#gct{s=Fs1}) end; mark([#lua_func{funrefs=Funrefs}|Todo], More, GcT, GcE, GcU, GcF) -> %% io:format("push funrefs ~p\n", [Funrefs]), mark(Todo, [Funrefs|More], GcT, GcE, GcU, GcF); %% The call stack. mark([#call_frame{func=Funref,lvs=Lvs,env=Env}|Todo], More0, GcT, GcE, GcU, GcF) -> %% io:format("cf ~p\n", [Funref]), More1 = [ tuple_to_list(Lv) || Lv <- Lvs, is_tuple(Lv) ] ++ [Env|More0], mark([Funref|Todo], More1, GcT, GcE, GcU, GcF); mark([#loop_frame{lvs=Lvs,stk=Stk,env=Env}|Todo], More0, GcT, GcE, GcU, GcF) -> More1 = [ tuple_to_list(Lv) || Lv <- Lvs, is_tuple(Lv) ] ++ [Stk,Env|More0], mark(Todo, More1, GcT, GcE, GcU, GcF); %% Specifically catch these as they would match table key-value pair. mark([#erl_func{}|Todo], More, GcT, GcE, GcU, GcF) -> mark(Todo, More, GcT, GcE, GcU, GcF); mark([#erl_mfa{}|Todo], More, GcT, GcE, GcU, GcF) -> mark(Todo, More, GcT, GcE, GcU, GcF); mark([#thread{}|Todo], More, GcT, GcE, GcU, GcF) -> mark(Todo, More, GcT, GcE, GcU, GcF); mark([#userdata{meta=Meta}|Todo], More, GcT, GcE, GcU, GcF) -> mark([Meta|Todo], More, GcT, GcE, GcU, GcF); mark([{K,V}|Todo], More, GcT, GcE, GcU, GcF) -> %Table key-value pair %% io:format("mt: ~p\n", [{K,V}]), mark([K,V|Todo], More, GcT, GcE, GcU, GcF); mark([_|Todo], More, GcT, GcE, GcU, GcF) -> %% Can ignore everything else. mark(Todo, More, GcT, GcE, GcU, GcF); mark([], [M|More], GcT, GcE, GcU, GcF) -> mark(M, More, GcT, GcE, GcU, GcF); mark([], [], #gct{s=St}, #gct{s=Se}, #gct{s=Su}, #gct{s=Sf}) -> {St,Se,Su,Sf}. %% filter_tables(Seen, Free, Tables) -> {Free,Tables}. %% filter_environment(Seen, Free, Frames) -> {Free,Frames}. %% filter_userdata(Seen, Free, Frames) -> {Free,Frames}. %% filter_funcdefs(Seen, Free, Frames) -> {Free,Frames}. %% Filter tables/frames/userdata/funcdefs and return updated free %% lists and tables/frames. filter_tables(Seen, Tf0, Tt0) -> %% Update the free list. Tf1 = ?FOLD_TABLES(fun (K, _, Free) -> case ordsets:is_element(K, Seen) of true -> Free; false -> [K|Free] end end, Tf0, Tt0), Tt1 = ?FILTER_TABLES(fun (K, _) -> ordsets:is_element(K, Seen) end, Tt0), {Tf1,Tt1}. filter_environment(Seen, Ef0, Et0) -> %% io:format("env0: ~p ~p ~p\n", [Seen,Ef0,Et0]), %% Update the free list. Ef1 = ?FOLD_TABLES(fun (K, _, Free) -> case ordsets:is_element(K, Seen) of true -> Free; false -> [K|Free] end end, Ef0, Et0), Et1 = ?FILTER_TABLES(fun (K, _) -> ordsets:is_element(K, Seen) end, Et0), %% io:format("env1: ~p ~p\n", [Ef1,Et1]), {Ef1,Et1}. filter_userdata(Seen, Uf0, Ut0) -> %% Update the free list. Uf1 = ?FOLD_TABLES(fun (K, _, Free) -> case ordsets:is_element(K, Seen) of true -> Free; false -> [K|Free] end end, Uf0, Ut0), %% Reclaim free table slots. Ut1 = ?FILTER_TABLES(fun (K, _) -> ordsets:is_element(K, Seen) end, Ut0), {Uf1,Ut1}. filter_funcdefs(Seen, Ff0, Ft0) -> %% Update the free list. Ff1 = ?FOLD_TABLES(fun (K, _, Free) -> case ordsets:is_element(K, Seen) of true -> Free; false -> [K|Free] end end, Ff0, Ft0), Ft1 = ?FILTER_TABLES(fun (K, _) -> ordsets:is_element(K, Seen) end, Ft0), {Ff1,Ft1}. rvirding-luerl-772b25e/src/luerl_lib_string.erl0000664000232200023220000006152415114130670022226 0ustar debalancedebalance%% Copyright (c) 2013-2025 Robert Virding %% %% Licensed under the Apache License, Version 2.0 (the "License"); %% you may not use this file except in compliance with the License. %% You may obtain a copy of the License at %% %% http://www.apache.org/licenses/LICENSE-2.0 %% %% Unless required by applicable law or agreed to in writing, software %% distributed under the License is distributed on an "AS IS" BASIS, %% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. %% See the License for the specific language governing permissions and %% limitations under the License. %% File : luerl_lib_string.erl %% Author : Robert Virding %% Purpose : The string library for Luerl. -module(luerl_lib_string). -include("luerl.hrl"). ?MODULEDOC(false). %% The basic entry point to set up the function table. -export([install/1,byte/3,char/3,dump/3,find/3,format/3,gmatch/3,gsub/3,len/3,lower/3, match/3,rep/3,reverse/3,sub/3,upper/3]). %% Export some test functions. -export([test_gsub/3,test_match_pat/3,test_pat/1, test_byte/3,test_do_find/4,test_sub/2,test_sub/3]). -import(luerl_lib, [lua_error/2,badarg_error/3]). %Shorten this %%-compile([bin_opt_info]). %For when we are optimising install(St0) -> {T,St1} = luerl_heap:alloc_table(table(), St0), {M,St2} = luerl_heap:alloc_table(metatable(T), St1), Meta0 = St2#luerl.meta, Meta1 = Meta0#meta{string=M}, {T,St2#luerl{meta=Meta1}}. %% metatable(Table) -> [{TableName,Table}]. %% table() -> [{FuncName,Function}]. metatable(T) -> %String type metatable [{<<"__index">>,T}]. table() -> %String table [{<<"byte">>,#erl_mfa{m=?MODULE,f=byte}}, {<<"char">>,#erl_mfa{m=?MODULE,f=char}}, {<<"dump">>,#erl_mfa{m=?MODULE,f=dump}}, {<<"find">>,#erl_mfa{m=?MODULE,f=find}}, {<<"format">>,#erl_mfa{m=?MODULE,f=format}}, {<<"gmatch">>,#erl_mfa{m=?MODULE,f=gmatch}}, {<<"gsub">>,#erl_mfa{m=?MODULE,f=gsub}}, {<<"len">>,#erl_mfa{m=?MODULE,f=len}}, {<<"lower">>,#erl_mfa{m=?MODULE,f=lower}}, {<<"match">>,#erl_mfa{m=?MODULE,f=match}}, {<<"rep">>,#erl_mfa{m=?MODULE,f=rep}}, {<<"reverse">>,#erl_mfa{m=?MODULE,f=reverse}}, {<<"sub">>,#erl_mfa{m=?MODULE,f=sub}}, {<<"upper">>,#erl_mfa{m=?MODULE,f=upper}} ]. %% byte(String [, I [, J]] ) -> [Code] %% Return numerical codes of string between I and J. byte(_, As, St) -> case luerl_lib:conv_list(As, [lua_string,lua_integer,lua_integer]) of [S|Is] -> Bs = do_byte(S, byte_size(S), Is), {Bs,St}; _ -> badarg_error(byte, As, St) %nil or [] end. test_byte(S, I, J) -> do_byte(S, byte_size(S), I, J). do_byte(_, 0, _) -> [nil]; do_byte(S, Len, []) -> do_byte(S, Len, 1, 1); do_byte(S, Len, [I]) -> do_byte(S, Len, I, I); do_byte(S, Len, [I,J]) -> do_byte(S, Len, I, J). do_byte(S, Len, I0, J0) -> %The same as for sub I1 = do_sub_m(Len, I0), J1 = do_sub_m(Len, J0), do_byte_ij(S, Len, I1, J1). do_byte_ij(S, Len, I, J) when I < 1 -> do_byte_ij(S, Len, 1, J); do_byte_ij(S, Len, I, J) when J > Len -> do_byte_ij(S, Len, I, Len); do_byte_ij(_, _, I, J) when I > J -> [nil]; do_byte_ij(S, _, I, J) -> [ N || N <- binary_to_list(S, I, J) ]. %% char(...) -> String %% Return string of the numerical arguments. char(_, [nil], St) -> {[<<>>],St}; char(_, As, St) -> case luerl_lib:args_to_integers(As) of error -> badarg_error(char, As, St); Bs -> %% Errors here also become lua_error. try String = list_to_binary(Bs), {[String],St} catch _:_ -> badarg_error(char, As, St) end end. %% dump(Function) -> String. %% Return a string with binary representation of Function. -spec dump(_, [_], _) -> no_return(). dump(_, As, St) -> badarg_error(dump, As, St). %% find(String, Pattern [, Init [, Plain]]) -> [Indice]. %% Return first occurrence of Pattern in String. find(_, As, St0) -> try do_find(As, St0) catch throw:{error,E,St1} -> lua_error(E, St1); throw:{error,E} -> lua_error(E, St0) end. do_find([A1,A2], St) -> do_find([A1,A2,1.0], St); do_find([A1,A2,A3], St) -> do_find([A1,A2,A3,nil], St); do_find(As, St) -> case luerl_lib:conv_list(As, [lua_string,lua_string,lua_integer,lua_bool]) of [S,P,I,Pl] -> {do_find(S, byte_size(S), P, I, Pl),St}; _ -> throw({error,{badarg,find,As},St}) %nil, [_] or [] end. test_do_find(S, Pat, I, Pl) -> do_find(S, byte_size(S), Pat, I, Pl). %% do_find(String, Length, Pattern, Start, Plain) -> [Return]. %% Adjust the starting index and find the string. do_find(_, L, _, I, _) when I > L+1 -> [nil]; do_find(S, L, Pat, I, Pl) when I < -L -> do_find(S, L, Pat, 1, Pl); do_find(S, L, Pat, I, Pl) when I < 0 -> do_find(S, L, Pat, L+I+1, Pl); do_find(S, L, Pat, 0, Pl) -> do_find(S, L, Pat, 1, Pl); do_find(S, L, Pat, I, true) -> %Plain text search string case binary:match(S, Pat, [{scope,{I-1,L-I+1}}]) of {Fs,Fl} -> [Fs+1,Fs+Fl]; nomatch -> [nil] end; do_find(S, L, Pat0, I, false) -> %Pattern search string case pat(binary_to_list(Pat0)) of {ok,{Pat1,_},_} -> L1 = L - I + 1, %Length of substring S1 = binary_part(S, I-1, L1), %Start searching from I case match_loop(S1, L1, Pat1, 1) of [{_,P,Len}|Cas] -> %Matches P1 = P + I - 1, %Position in original string [P1,P1+Len-1|match_caps(Cas, S, I)]; [] -> [nil] %No match end; {error,E} -> throw({error,E}) end. %% format([Format|Args], State) -> {[String],State}. %% Format a string. All errors are badarg errors. %% Do all the work in luerl_string_format but generate errors here. format(_, [F|As], St0) -> try %% io:format("format ~w\n", [element(1,luerl_lib_string_format:format(F, As, St0))]), luerl_lib_string_format:format(F, As, St0) catch %% If we have no specific error, default is badarg. throw:{error,E,St1} -> lua_error(E, St1); throw:{error,E} -> lua_error(E, St0); _:_ -> badarg_error(format, [F|As], St0) %% ?CATCH(C, E, Stack) %% error({C,E,Stack}) end; format(_, As, St) -> badarg_error(format, As, St). -spec gmatch(_, [_], _) -> no_return(). %To keep dialyzer quiet %% gmatch(String, Pattern) -> [Function]. gmatch(_, As, St) -> badarg_error(gmatch, As, St). %% gsub(String, Pattern, Repl [, N]) -> [String] gsub(_, As, St0) -> try do_gsub(As, St0) catch throw:{error,E,St1} -> lua_error(E, St1); throw:{error,E} -> lua_error(E, St0) end. do_gsub(As, St) -> case luerl_lib:conv_list(As, [lua_string,lua_string,lua_any,lua_integer]) of [S,P,R,N] when N > 0 -> do_gsub(S, byte_size(S), P, R, N, St); [S,P,R] -> %'all' bigger than any number do_gsub(S, byte_size(S), P, R, all, St); _ -> throw({error,{badarg,gsub,As},St}) end. test_gsub(S, P, N) -> {ok,{Pat,_},_} = pat(binary_to_list(P)), gsub_match_loop(S, byte_size(S), Pat, 1, 1, N). do_gsub(S, L, Pat0, R, N, St0) -> case pat(binary_to_list(Pat0)) of {ok,{Pat1,_},_} -> Fs = gsub_match_loop(S, L, Pat1, 1, 1, N), {Ps,St1} = gsub_repl_loop(Fs, S, 1, L, R, St0), {[iolist_to_binary(Ps),length(Fs)],St1}; {error,E} -> throw({error,E}) end. %% gsub_match_loop(S, L, Pat, I, C, N) -> [Cas]. %% Return the list of Cas's for each match. gsub_match_loop(_, _, _, _, C, N) when C > N -> []; gsub_match_loop(<<>>, _, Pat, I, _, _) -> %It can still match at end! case match_pat(<<>>, Pat, I) of {match,Cas,_,_} -> [Cas]; nomatch -> [] end; gsub_match_loop(S0, L, Pat, I0, C, N) -> case match_pat(S0, Pat, I0) of {match,Cas,_,I0} -> %Zero length match S1 = binary_part(S0, 1, L-I0), [Cas|gsub_match_loop(S1, L, Pat, I0+1, C+1, N)]; {match,Cas,S1,I1} -> [Cas|gsub_match_loop(S1, L, Pat, I1, C+1, N)]; nomatch -> S1 = binary_part(S0, 1, L-I0), gsub_match_loop(S1, L, Pat, I0+1, C, N) end. %% gsub_repl_loop([Cas], String, Index, Length, Reply, State) -> %% {iolist,State}. %% Build the return string as an iolist processing each match and %% filling in with the original string. gsub_repl_loop([[{_,F,Len}|_]=Cas|Fs], S, I, L, R, St0) -> %% io:fwrite("grl: ~p\n", [{Cas,S,R}]), {Rep,St1} = gsub_repl(Cas, S, R, St0), %% io:fwrite("grl->~p\n", [{Rep}]), {Ps,St2} = gsub_repl_loop(Fs, S, F+Len, L, R, St1), {[binary_part(S, I-1, F-I),Rep|Ps],St2}; gsub_repl_loop([], S, I, L, _, St) -> {[binary_part(S, I-1, L-I+1)],St}. gsub_repl(Cas, S, #tref{}=T, St0) -> case Cas of %Export both Ca and Key [Ca] -> Key = match_cap(Ca, S); [Ca,Ca1|_] -> Key = match_cap(Ca1, S) end, {R,St1} = luerl_emul:get_table_key(T, Key, St0), {[gsub_repl_val(S, R, Ca)],St1}; gsub_repl(Cas0, S, Repl, St0) when ?IS_FUNCTION(Repl) -> case Cas0 of %Export both Ca and Args [Ca] -> Args = [match_cap(Ca, S)]; [Ca|Cas] -> Args = match_caps(Cas, S) end, {Rs,St1} = luerl_emul:functioncall(Repl, Args, St0), {[gsub_repl_val(S, luerl_lib:first_value(Rs), Ca)],St1}; gsub_repl(Cas, S, Repl, St) -> %Replace string case luerl_lib:arg_to_list(Repl) of error -> {[],St}; R -> {gsub_repl_str(Cas, S, R),St} end. gsub_repl_str(Cas, S, [$%,$%|R]) -> [$%|gsub_repl_str(Cas, S, R)]; gsub_repl_str(Cas, S, [$%,$0|R]) -> Cstr = luerl_lib:arg_to_string(match_cap(hd(Cas), S)), %Force to string! [Cstr|gsub_repl_str(Cas, S, R)]; gsub_repl_str(Cas, S, [$%,C|R]) when C >= $1, C =< $9 -> case lists:keysearch(C-$0, 1, Cas) of {value,Ca} -> Cstr = luerl_lib:arg_to_string(match_cap(Ca, S)), %Force to string! [Cstr|gsub_repl_str(Cas, S, R)]; false -> throw({error,{illegal_index,capture,C-$0}}) end; gsub_repl_str(Cas, S, [C|R]) -> [C|gsub_repl_str(Cas, S, R)]; gsub_repl_str(_, _, []) -> []. %% Return string or original match. gsub_repl_val(S, Val, Ca) -> case luerl_lib:arg_to_string(Val) of error -> match_cap(Ca, S); %Use original match Str -> Str end. %% len(String) -> Length. len(_, [A|_], St) when is_binary(A) -> {[byte_size(A)],St}; len(_, [A|_], St) when is_number(A) -> {[length(luerl_lib:number_to_list(A))],St}; len(_, As, St) -> badarg_error(len, As, St). %% lower(String) -> String. lower(_, As, St) -> case luerl_lib:conv_list(As, [erl_list]) of [S] -> {[list_to_binary(string:to_lower(S))],St}; _ -> badarg_error(lower, As, St) %nil or [] end. %% match(String, Pattern [, Init]) -> [Match]. match(_, As, St0) -> try do_match(As, St0) catch throw:{error,E,St1} -> lua_error(E, St1); throw:{error,E} -> lua_error(E, St0) end. do_match([A1,A2], St) -> do_match([A1,A2,1.0], St); do_match(As, St) -> case luerl_lib:conv_list(As, [lua_string,lua_string,lua_integer]) of [S,P,I] -> {do_match(S, byte_size(S), P, I),St}; _ -> throw({error,{badarg,match,As},St}) end. %% do_match(String, Length, Pattern, Start) -> [Return]. %% Adjust the starting index and find the match. do_match(_, L, _, I) when I > L -> [nil]; %Shuffle values do_match(S, L, Pat, I) when I < -L -> do_match(S, L, Pat, 1); do_match(S, L, Pat, I) when I < 0 -> do_match(S, L, Pat, L+I+1); do_match(S, L, Pat, 0) -> do_match(S, L, Pat, 1); do_match(S, L, Pat0, I) -> case pat(binary_to_list(Pat0)) of %"Compile" the pattern {ok,{Pat1,_},_} -> L1 = L - I + 1, %Length of substring S1 = binary_part(S, I-1, L1), %Start searching from I case match_loop(S1, L1, Pat1, 1) of [{_,P,Len}] -> %Only top level match P1 = P + I - 1, %Position in original string [binary_part(S, P1-1, Len)]; [_|Cas] -> %Have sub matches match_caps(Cas, S1); [] -> [nil] %No match end; {error,E} -> throw({error,E}) end. %% match_loop(String, Length, Pattern, Index) -> Cas | []. %% Step down the string trying to find a match. match_loop(S, L, Pat, I) when I > L -> %It can still match at end! case match_pat(S, Pat, I) of {match,Cas,_,_} -> Cas; nomatch -> [] %Now we haven't found it end; match_loop(S0, L, Pat, I) -> case match_pat(S0, Pat, I) of {match,Cas,_,_} -> Cas; nomatch -> S1 = binary_part(S0, 1, L-I), match_loop(S1, L, Pat, I+1) end. %% match_cap(Capture, String [, Init]) -> Capture. %% match_caps(Captures, String [, Init]) -> Captures. %% Get the captures. The string is the whole string not just from %% Init. match_cap(Ca, S) -> match_cap(Ca, S, 1). match_cap({_,P,Len}, _, I) when Len < 0 -> %Capture position P+I-1; match_cap({_,P,Len}, S, I) -> %Capture binary_part(S, P+I-2, Len). %Binaries count from 0 match_caps(Cas, S) -> match_caps(Cas, S, 1). match_caps(Cas, S, I) -> [ match_cap(Ca, S, I) || Ca <- Cas ]. %% rep(String, N [, Separator]) -> [String]. rep(_, [A1,A2], St) -> rep(nil, [A1,A2,<<>>], St); rep(_, [_,_,_|_]=As, St) -> case luerl_lib:conv_list(As, [lua_string,lua_integer,lua_string]) of [S,I,Sep] -> Part = [Sep,S], if I > 100 -> %% For many repetitions. I1 = (I-1) div 100, I2 = (I-1) rem 100, D100 = iolist_to_binary(lists:duplicate(100, Part)), {[iolist_to_binary([S, lists:duplicate(I1, D100), lists:duplicate(I2, Part)])], St}; I > 0 -> {[iolist_to_binary([S|lists:duplicate(I-1, Part)])],St}; true -> {[<<>>],St} end; error -> %Error or bad values badarg_error(rep, As, St) end; rep(_, As, St) -> badarg_error(rep, As, St). %% reverse([String], State) -> {[Res],St}. reverse(_, [A|_], St) when is_binary(A) ; is_number(A) -> S = luerl_lib:arg_to_list(A), {[list_to_binary(lists:reverse(S))],St}; reverse(_, As, St) -> badarg_error(reverse, As, St). %% sub([String, I [, J]], State) -> {[Res],State}. sub(_, As, St) -> case luerl_lib:conv_list(As, [lua_string,lua_integer,lua_integer]) of [S,I|Js] -> Len = byte_size(S), Sub = do_sub(S, Len, I, Js), %Just I, or both I and J {[Sub],St}; _ -> badarg_error(sub, As, St) %nil, [_] or [] end. test_sub(S, I) -> do_sub(S, byte_size(S), I, []). test_sub(S, I, J) -> do_sub(S, byte_size(S), I, [J]). do_sub(S, _, 0, []) -> S; %Special case this do_sub(S, Len, I, []) -> do_sub_1(S, Len, I, Len); do_sub(S, Len, I, [J]) -> do_sub_1(S, Len, I, J). do_sub_1(S, Len, I0, J0) -> I1 = do_sub_m(Len, I0), J1 = do_sub_m(Len, J0), do_sub_ij(S, Len, I1, J1). do_sub_m(Len, I) when I < 0 -> Len+I+1; %Negative count from end do_sub_m(_, I) -> I. do_sub_ij(S, Len, I, J) when I < 1 -> do_sub_ij(S, Len, 1, J); do_sub_ij(S, Len, I, J) when J > Len -> do_sub_ij(S, Len, I, Len); do_sub_ij(_, _, I, J) when I > J -> <<>>; do_sub_ij(S, _, I, J) -> binary:part(S, I-1, J-I+1). %Zero-based, yuch! upper(_, [A|_], St) when is_binary(A) ; is_number(A) -> S = luerl_lib:arg_to_list(A), {[list_to_binary(string:to_upper(S))],St}; upper(_, As, St) -> badarg_error(upper, As, St). %% This is the pattern grammar used. It may actually be overkill to %% first parse the pattern as the pattern is relativey simple and we %% should be able to do it in one pass. %% %% pat -> seq : '$1'. %% seq -> single seq : ['$1'|'$2']. %% seq -> single : '$1'. %% single -> "(" seq ")" . %% single -> "[" class "]" : {char_class,char_class('$2')} %% single -> "[" "^" class "]" : {comp_class,char_class('$3')} %% single -> char "*" . %% single -> char "+" . %% single -> char "-" . %% single -> char "?" . %% single -> char . %% char -> "%" class . %% char -> "." . %% char -> char . %% The actual parser is a recursive descent implementation of the %% grammar. We leave ^ $ as normal characters and handle them %% specially in matching. pat(Cs0) -> case catch seq(Cs0, 0, 1, []) of {error,E} -> {error,E}; {P,0,Sn} -> {ok,{P,0},Sn}; {_,_,_} -> {error,invalid_capture} end. test_pat(P) -> pat(P). seq([$^|Cs], Sd, Sn, P) -> single(Cs, Sd, Sn, ['^'|P]); seq([_|_]=Cs, Sd, Sn, P) -> single(Cs, Sd, Sn, P); seq([], Sd, Sn, P) -> {lists:reverse(P),Sd,Sn}. single([$(|Cs], Sd, Sn, P) -> single(Cs, Sd+1, Sn+1, [{'(',Sn}|P]); single([$)|_], 0, _, _) -> throw({error,invalid_capture}); single([$)|Cs], Sd, Sn, P) -> single(Cs, Sd-1, Sn, [')'|P]); single([$[|Cs], Sd, Sn, P) -> char_set(Cs, Sd, Sn, P); single([$.|Cs], Sd, Sn, P) -> singlep(Cs, Sd, Sn, ['.'|P]); single([$%|Cs], Sd, Sn, P) -> char_class(Cs, Sd, Sn, P); single([$$], Sd, Sn, P) -> {lists:reverse(P, ['\$']),Sd,Sn}; single([C|Cs], Sd, Sn, P) -> singlep(Cs, Sd, Sn, [C|P]); single([], Sd, Sn, P) -> {lists:reverse(P),Sd,Sn}. singlep([$*|Cs], Sd, Sn, [Char|P]) -> single(Cs, Sd, Sn, [{kclosure,Char}|P]); singlep([$+|Cs], Sd, Sn, [Char|P]) -> single(Cs, Sd, Sn, [{pclosure,Char}|P]); singlep([$-|Cs], Sd, Sn, [Char|P]) -> single(Cs, Sd, Sn, [{mclosure,Char}|P]); singlep([$?|Cs], Sd, Sn, [Char|P]) -> single(Cs, Sd, Sn, [{optional,Char}|P]); singlep(Cs, Sd, Sn, P) -> single(Cs, Sd, Sn, P). char_set([$^|Cs], Sd, Sn, P) -> char_set(Cs, Sd, Sn, P, comp_set); char_set(Cs, Sd, Sn, P) -> char_set(Cs, Sd, Sn, P, char_set). char_set(Cs0, Sd, Sn, P, Tag) -> case char_set(Cs0) of {Set,[$]|Cs1]} -> singlep(Cs1, Sd, Sn, [{Tag,Set}|P]); {_,_} -> throw({error,invalid_char_set}) end. char_set([$]|Cs]) -> char_set(Cs, [$]]); %Must special case this char_set(Cs) -> char_set(Cs, []). char_set([$]|_]=Cs, Set) -> {Set,Cs}; %We are at the end char_set([$%,C|Cs], Set) -> char_set(Cs, [char_class(C)|Set]); char_set([C1,$-,C2|Cs], Set) when C2 =/= $] -> char_set(Cs, [{C1,C2}|Set]); char_set([C|Cs], Set) -> char_set(Cs, [C|Set]); char_set([], Set) -> {Set,[]}. %We are at the end %% char_class([$f,$[|Cs], Sd, Sn, P) -> %% char_set(Cs, Sd, Sn, [frontier|P]); char_class([$f|_], _, _, _) -> throw({error,invalid_pattern}); char_class([$b,L,R|Cs], Sd, Sn, P) -> singlep(Cs, Sd, Sn, [{balance,L,R}|P]); char_class([C|Cs], Sd, Sn, P) -> singlep(Cs, Sd, Sn, [char_class(C)|P]); char_class([], _, _, _) -> throw({error,invalid_pattern}). char_class($a) -> 'a'; char_class($A) -> 'A'; char_class($c) -> 'c'; char_class($C) -> 'C'; char_class($d) -> 'd'; char_class($D) -> 'D'; char_class($g) -> 'g'; char_class($G) -> 'G'; char_class($l) -> 'l'; char_class($L) -> 'L'; char_class($p) -> 'p'; char_class($P) -> 'P'; char_class($s) -> 's'; char_class($S) -> 'S'; char_class($u) -> 'u'; char_class($U) -> 'U'; char_class($w) -> 'w'; char_class($W) -> 'W'; char_class($x) -> 'x'; char_class($X) -> 'X'; char_class($z) -> 'z'; %Deprecated char_class($Z) -> 'Z'; char_class(C) -> %Only non-alphanum allowed case is_w_char(C) of true -> throw({error,{invalid_char_class,C}}); false -> C end. test_match_pat(S, P, I) -> {ok,{Pat,_},_} = pat(P), io:fwrite("tdm: ~p\n", [{Pat}]), match_pat(S, Pat, I). %% match_pat(String, Pattern, Index) -> {match,[Capture],Rest,Index} | nomatch. %% Try and match the pattern with the string *at the current %% position*. No searching. match_pat(S0, P0, I0) -> case match_pat(P0, S0, I0, [{0,I0}], []) of {match,S1,I1,_,Cas} ->{match,Cas,S1,I1}; {nomatch,_,_,_,_,_} -> nomatch end. match_pat(['\$']=Ps, Cs, I, Ca, Cas) -> %Match only end of string case Cs of <<>> -> match_pat([], <<>>, I, Ca, Cas); _ -> {nomatch,Ps,Cs,I,Ca,Cas} end; match_pat(['^'|Ps]=Ps0, Cs, I, Ca, Cas) -> %Match beginning of string if I =:= 1 -> match_pat(Ps, Cs, 1, Ca, Cas); true -> {nomatch,Ps0,Cs,I,Cs,Cas} end; match_pat([{'(',Sn},')'|P], Cs, I, Ca, Cas) -> match_pat(P, Cs, I, Ca, save_cap(Sn, I, -1, Cas)); match_pat([{'(',Sn}|P], Cs, I, Ca, Cas) -> match_pat(P, Cs, I, [{Sn,I}|Ca], Cas); match_pat([')'|P], Cs, I, [{Sn,S}|Ca], Cas) -> match_pat(P, Cs, I, Ca, save_cap(Sn, S, I-S, Cas)); match_pat([{kclosure,P}=K|Ps], Cs, I, Ca, Cas) -> %%io:fwrite("dm: ~p\n", [{[P,K|Ps],Cs,I,Ca,Cas}]), case match_pat([P,K|Ps], Cs, I, Ca, Cas) of %First try with it {match,_,_,_,_}=M -> M; {nomatch,_,_,_,_,_} -> %Else try without it match_pat(Ps, Cs, I, Ca, Cas) end; match_pat([{pclosure,P}|Ps], Cs, I, Ca, Cas) -> %The easy way match_pat([P,{kclosure,P}|Ps], Cs, I, Ca, Cas); match_pat([{mclosure,P}=K|Ps], Cs, I, Ca, Cas) -> case match_pat(Ps, Cs, I, Ca, Cas) of %First try without it {match,_,_,_,_}=M -> M; {nomatch,_,_,_,_,_} -> %Else try with it match_pat([P,K|Ps], Cs, I, Ca, Cas) end; match_pat([{optional,P}|Ps], Cs, I, Ca, Cas) -> case match_pat([P|Ps], Cs, I, Ca, Cas) of %First try with it {match,_,_,_,_}=M -> M; {nomatch,_,_,_,_,_} -> %Else try without it match_pat(Ps, Cs, I, Ca, Cas) end; match_pat([{char_set,Set}|Ps]=Ps0, <>=Cs0, I, Ca, Cas) -> case match_char_set(Set, C) of true -> match_pat(Ps, Cs, I+1, Ca, Cas); false -> {nomatch,Ps0,Cs0,I,Ca,Cas} end; match_pat([{comp_set,Set}|Ps]=Ps0, <>=Cs0, I, Ca, Cas) -> case match_char_set(Set, C) of true -> {nomatch,Ps0,Cs0,I,Ca,Cas}; false -> match_pat(Ps, Cs, I+1, Ca, Cas) end; match_pat([{balance,L,R}|Ps]=Ps0, <>=Cs0, I0, Ca, Cas) -> case balance(Cs1, I0+1, L, R, 1) of {ok,Cs2,I1} -> match_pat(Ps, Cs2, I1, Ca, Cas); error -> {nomatch,Ps0,Cs0,I0,Ca,Cas} end; match_pat(['.'|Ps], <<_,Cs/binary>>, I, Ca, Cas) -> %Matches anything match_pat(Ps, Cs, I+1, Ca, Cas); match_pat([A|Ps]=Ps0, <>=Cs0, I, Ca, Cas) when is_atom(A) -> case match_class(A, C) of true -> match_pat(Ps, Cs, I+1, Ca, Cas); false -> {nomatch,Ps0,Cs0,I,Ca,Cas} end; match_pat([C|Ps], <>, I, Ca, Cas) -> match_pat(Ps, Cs, I+1, Ca, Cas); match_pat([], Cs, I, [{Sn,S}|Ca], Cas) -> {match,Cs,I,Ca,[{Sn,S,I-S}|Cas]}; match_pat(Ps, Cs, I, Ca, Cas) -> {nomatch,Ps,Cs,I,Ca,Cas}. %% save_cap(N, Position, Length, Captures) -> Captures. %% Add a new capture to the list in the right place, ordered. save_cap(N, P, L, [{N1,_,_}=Ca|Cas]) when N > N1 -> [Ca|save_cap(N, P, L, Cas)]; save_cap(N, P, L, Cas) -> [{N,P,L}|Cas]. %% MUST first check for right char, this in case of L == R! balance(<>, I, L, R, D) -> if D =:= 1 -> {ok,Cs,I+1}; true -> balance(Cs, I+1, L, R, D-1) end; balance(<>, I, L, R, D) -> balance(Cs, I+1, L, R, D+1); balance(<<_,Cs/binary>>, I, L, R, D) -> balance(Cs, I+1, L, R, D); balance(<<>>, _, _, _, _) -> error. match_class('a', C) -> is_a_char(C); match_class('A', C) -> not is_a_char(C); match_class('c', C) -> is_c_char(C); match_class('C', C) -> not is_c_char(C); match_class('d', C) -> is_d_char(C); match_class('D', C) -> not is_d_char(C); match_class('g', C) -> is_g_char(C); match_class('G', C) -> not is_g_char(C); match_class('l', C) -> is_l_char(C); match_class('L', C) -> not is_l_char(C); match_class('p', C) -> is_p_char(C); match_class('P', C) -> not is_p_char(C); match_class('s', C) -> is_s_char(C); match_class('S', C) -> not is_s_char(C); match_class('u', C) -> is_u_char(C); match_class('U', C) -> not is_u_char(C); match_class('w', C) -> is_w_char(C); match_class('W', C) -> not is_w_char(C); match_class('x', C) -> is_x_char(C); match_class('X', C) -> not is_x_char(C); match_class('z', C) -> is_z_char(C); %Deprecated match_class('Z', C) -> not is_z_char(C). match_char_set([{C1,C2}|_], C) when C >= C1, C=< C2 -> true; match_char_set([A|Set], C) when is_atom(A) -> match_class(A, C) orelse match_char_set(Set, C); match_char_set([C|_], C) -> true; match_char_set([_|Set], C) -> match_char_set(Set, C); match_char_set([], _) -> false. %% Test for various character types. is_a_char(C) -> %All letters is_l_char(C) orelse is_u_char(C). is_c_char(C) when C >= 0, C =< 31 -> true; %All control characters is_c_char(C) when C >= 128, C =< 159 -> true; is_c_char(_) -> false. is_d_char(C) -> (C >= $0) and (C =< $9). %All digits is_g_char(C) when C >= 33, C =< 126 -> true; %All printable characters is_g_char(C) when C >= 161, C =< 255 -> true; is_g_char(_) -> false. is_l_char(C) when C >= $a, C =< $z -> true; %All lowercase letters is_l_char(C) when C >= 224, C =< 246 -> true; is_l_char(C) when C >= 248, C =< 255 -> true; is_l_char(_) -> false. is_p_char(C) when C >= 33, C =< 47 -> true; %All punctutation characters is_p_char(C) when C >= 58, C =< 63 -> true; is_p_char(C) when C >= 91, C =< 96 -> true; is_p_char(126) -> true; is_p_char(C) when C >= 161, C =< 191 -> true; is_p_char(215) -> true; is_p_char(247) -> true; is_p_char(_) -> false. is_s_char(C) when C >= 9, C =< 13 -> true; %Space characters is_s_char(32) -> true; is_s_char(160) -> true; is_s_char(_) -> false. is_u_char(C) when C >= $A, C =< $Z -> true; %All uppercase letters is_u_char(C) when C >= 192, C =< 214 -> true; is_u_char(C) when C >= 216, C =< 223 -> true; is_u_char(_) -> false. is_w_char(C) -> %All alphanumeric characters is_a_char(C) orelse is_d_char(C). is_x_char(C) when C >= $a, C =< $f -> true; %All hexadecimal characters is_x_char(C) when C >= $A, C =< $F -> true; is_x_char(C) -> is_d_char(C). is_z_char(C) -> C =:= 0. %The zero character, deprecated %% match_class('a', C) -> (char_table(C) band ?_A) =/= 0; %% match_class('A', C) -> (char_table(C) band ?_A) =:= 0. %% char_table(C) when C >= 0, C =< 31 -> ?_C; %% char_table(C) when C >= 65, C =< 91 -> ?_U bor ?_A; %% char_table(C) when C >= 97, C =< 123 -> ?_L; rvirding-luerl-772b25e/src/luerl_lib_os_date.erl0000664000232200023220000001740515114130670022335 0ustar debalancedebalance%% Copyright (c) 2023-2024 Robert Virding %% %% Licensed under the Apache License, Version 2.0 (the "License"); %% you may not use this file except in compliance with the License. %% You may obtain a copy of the License at %% %% http://www.apache.org/licenses/LICENSE-2.0 %% %% Unless required by applicable law or agreed to in writing, software %% distributed under the License is distributed on an "AS IS" BASIS, %% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. %% See the License for the specific language governing permissions and %% limitations under the License. %% File : lib_date_support.erl %% Author : Mark Meeus %% Purpose : Date Support Module -module(luerl_lib_os_date). -include("luerl.hrl"). ?MODULEDOC(false). -export([format/2]). %% IMPLEMENTED FORMATS: %% %A - Full weekday name (eg. Wednesday) %% %a - Abbreviated weekday name (eg. Wed) %% %B - Full month name (eg. September) %% %b - Abbreviated month name (eg. Sep) %% %c - date and time (e.g. Wed Jan 24 12:27:59 2024) %% %D - date (e.g. 09/16/98) %% %d - Day of month as decimal number (01 - 31) %% %e - Day of month as decimal number ( 1 - 31) %% %F - date (e.g. 2024-01-31) %% %H - Hour in 24-hour format (00 - 23) %% %I - Hour in 12-hour format (01 - 12) %% %M - Minute as decimal number (00 - 59) %% %m - Month as decimal number (01 - 12) %% %n - Newline character %% %P - As %p but lowercase %% %p - Current locale’s A.M./P.M. indicator for 12-hour clock (eg. AM/PM) %% %S - Second as decimal number (00 - 59) %% %T - time (e.g. 23:48:10) %% %t - Tab character %% %u - Weekday as decimal number (1 - 7; Monday is 1) %% %V - IOS week number (01 - 53) %% %W - Week of year as decimal number, with Monday as first day of week 1 (00 - 53) %% %w - Weekday as decimal number (0 - 6; Sunday is 0) %% %X - time (e.g., 23:48:10) %% %x - date (e.g., 09/16/98) %% %Y - Year with century, as decimal number (eg. 2007) %% %y - Year without century, as decimal number (00 - 99) (eg. 07) %% %Z - Time-zone name or abbreviation; no characters if time zone is unknown %% %% - Percent sign %% NOT IMPLEMENTED: %% %j - Day of year as decimal number (001 - 366) %% %U - Week of year as decimal number, with Sunday as first day of week 1 (00 - 53) %% format(DateTime, Format) -> Formatted. %% *t format returns a table with the datetime values. format(DateTime, <<"*t">>) -> {{Ye,Mo,Da}=Date,{Ho,Mi,Sec}} = DateTime, [ {<<"year">>, Ye}, {<<"month">>, Mo}, {<<"day">>, Da}, {<<"hour">>, Ho}, {<<"min">>, Mi}, {<<"sec">>, Sec}, {<<"wday">>, get_day_number(Date)+1} ]; format(DateTime, Format) -> Patterns = [ <<"%A">>, <<"%a">>, <<"%B">>, <<"%b">>, <<"%c">>, <<"%D">>, <<"%d">>, <<"%e">>, <<"%F">>, <<"%H">>, <<"%I">>, <<"%M">>, <<"%m">>, <<"%n">>, <<"%P">>, <<"%p">>, <<"%S">>, <<"%T">>, <<"%t">>, <<"%u">>, <<"%V">>, <<"%W">>, <<"%w">>, <<"%X">>, <<"%x">>, <<"%Y">>, <<"%y">>, <<"%Z">>, <<"%%">> ], lists:foldl(fun(Pat, Str) -> replace_pattern(Str, DateTime, Pat) end, Format, Patterns). replace_pattern(Str, DateTime, Pat) -> case re:run(Str, Pat) of nomatch -> Str; {match, _} -> {Format, Val} = get_pattern_values(Pat, DateTime), Formatted = io_lib:fwrite(Format, Val), re:replace(Str, Pat, Formatted, [{return, binary}, global]) end. %% get_pattern_values(Patters, DateTime) -> {FormatString, Values}. get_pattern_values(<<"%A">>, {Date, _}) -> {"~s", [get_day_name(get_day_number(Date))]}; get_pattern_values(<<"%a">>, {Date, _}) -> {"~s", [get_abbreviated_day_name(get_day_number(Date))]}; get_pattern_values(<<"%B">>, {{_, Mo, _}, _}) -> {"~s", [get_month_name(Mo)]}; get_pattern_values(<<"%b">>, {{_, Mo, _}, _}) -> {"~s", [get_abbreviated_month_name(Mo)]}; get_pattern_values(<<"%c">>, {{Ye, Mo, Da}=Date, {Ho, Mi, Sec}}) -> {"~s ~s ~.2w ~.2.0w:~.2.0w:~.2.0w ~.4.0w", [get_abbreviated_day_name(get_day_number(Date)), get_abbreviated_month_name(Mo),Da, Ho,Mi,Sec, Ye]}; get_pattern_values(<<"%D">>, {{Ye, Mo, Da}, _}) -> {"~.2.0w/~.2.0w/~.2.0w", [Mo, Da, Ye rem 100]}; get_pattern_values(<<"%d">>, {{_, _, Da}, _}) -> {"~.2.0w", [Da]}; get_pattern_values(<<"%e">>, {{_, _, Da}, _}) -> {"~.2w", [Da]}; get_pattern_values(<<"%F">>, {{Ye, Mo, Da}, _}) -> {"~.4.0w-~.2.0w-~.2.0w", [Ye, Mo, Da]}; get_pattern_values(<<"%H">>, {_, {Ho, _, _}}) -> {"~.2.0w", [Ho]}; get_pattern_values(<<"%I">>, {_, {Ho, _, _}}) -> {"~.2.0w", [get_am_pm_hour(Ho)]}; get_pattern_values(<<"%M">>, {_, {_, Mi, _}}) -> {"~.2.0w", [Mi]}; get_pattern_values(<<"%m">>, {{_, Mo, _}, _}) -> {"~.2.0w", [Mo]}; get_pattern_values(<<"%n">>, _) -> {"\n", []}; get_pattern_values(<<"%P">>, {_, {Ho, _, _}}) -> Val = if Ho < 12 -> <<"am">>; true -> <<"pm">> end, {"~s", [Val]}; get_pattern_values(<<"%p">>, {_, {Ho, _, _}}) -> Val = if Ho < 12 -> <<"AM">>; true -> <<"PM">> end, {"~s", [Val]}; get_pattern_values(<<"%S">>, {_, {_, _, Sec}}) -> {"~.2.0w", [Sec]}; get_pattern_values(<<"%T">>, {_, {Ho, Mi, Sec}}) -> {"~.2.0w:~.2.0w:~.2.0w", [Ho, Mi, Sec]}; get_pattern_values(<<"%t">>, _) -> {"\t", []}; get_pattern_values(<<"%u">>, {Date, _}) -> {"~.1.0w", [calendar:day_of_the_week(Date)]}; % Mon = 1 Sun = 7 get_pattern_values(<<"%V">>, {Date, _}) -> {_Year,Week} = calendar:iso_week_number(Date), {"~.2.0w", [Week]}; get_pattern_values(<<"%W">>, {Date, _}) -> {_Year,Week} = calendar:iso_week_number(Date), {"~.2.0w", [Week]}; get_pattern_values(<<"%w">>, {Date, _}) -> {"~.1.0w", [get_day_number(Date)]}; % Sun = 0 Sat = 6 get_pattern_values(<<"%X">>, {_, {Ho, Mi, Sec}}) -> {"~.2.0w:~.2.0w:~.2.0w", [Ho, Mi, Sec]}; get_pattern_values(<<"%x">>, {{Ye, Mo, Da}, _}) -> {"~.2.0w/~.2.0w/~.2.0w", [Mo, Da, Ye rem 100]}; get_pattern_values(<<"%Y">>, {{Ye, _, _}, _}) -> {"~.4.0w", [Ye]}; get_pattern_values(<<"%y">>, {{Ye, _, _}, _}) -> {"~.2.0w", [Ye rem 100]}; get_pattern_values(<<"%Z">>, _) -> {"", []}; get_pattern_values(<<"%%">>, _) -> {"~c", [$%]}. %% get_day_number(Date) -> DayNumber. %% This is US so Sunday is day 1. get_day_number(Date) -> calendar:day_of_the_week(Date) rem 7. get_am_pm_hour(0) -> 12; get_am_pm_hour(H) when H > 12 -> H - 12; get_am_pm_hour(H) -> H. get_month_name(1) -> "January"; get_month_name(2) -> "February"; get_month_name(3) -> "March"; get_month_name(4) -> "April"; get_month_name(5) -> "May"; get_month_name(6) -> "June"; get_month_name(7) -> "July"; get_month_name(8) -> "August"; get_month_name(9) -> "September"; get_month_name(10) -> "October"; get_month_name(11) -> "November"; get_month_name(12) -> "December". get_abbreviated_month_name(1) -> "Jan"; get_abbreviated_month_name(2) -> "Feb"; get_abbreviated_month_name(3) -> "Mar"; get_abbreviated_month_name(4) -> "Apr"; get_abbreviated_month_name(5) -> "May"; get_abbreviated_month_name(6) -> "Jun"; get_abbreviated_month_name(7) -> "Jul"; get_abbreviated_month_name(8) -> "Aug"; get_abbreviated_month_name(9) -> "Sep"; get_abbreviated_month_name(10) -> "Oct"; get_abbreviated_month_name(11) -> "Nov"; get_abbreviated_month_name(12) -> "Dec". get_day_name(0) -> "Sunday"; get_day_name(1) -> "Monday"; get_day_name(2) -> "Tuesday"; get_day_name(3) -> "Wednesday"; get_day_name(4) -> "Thursday"; get_day_name(5) -> "Friday"; get_day_name(6) -> "Saturday". get_abbreviated_day_name(0) -> "Sun"; get_abbreviated_day_name(1) -> "Mon"; get_abbreviated_day_name(2) -> "Tue"; get_abbreviated_day_name(3) -> "Wed"; get_abbreviated_day_name(4) -> "Thu"; get_abbreviated_day_name(5) -> "Fri"; get_abbreviated_day_name(6) -> "Sat". rvirding-luerl-772b25e/src/luerl_lib.erl0000664000232200023220000003416415114130670020640 0ustar debalancedebalance%% Copyright (c) 2013-2025 Robert Virding %% %% Licensed under the Apache License, Version 2.0 (the "License"); %% you may not use this file except in compliance with the License. %% You may obtain a copy of the License at %% %% http://www.apache.org/licenses/LICENSE-2.0 %% %% Unless required by applicable law or agreed to in writing, software %% distributed under the License is distributed on an "AS IS" BASIS, %% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. %% See the License for the specific language governing permissions and %% limitations under the License. %% File : luerl_lib.erl %% Author : Robert Virding %% Purpose : Luerl libraries. %% A collection of useful functions. Those with '_' in their names %% generate Erlang data types while those with generate Lua data types %% (floats and binaries). -module(luerl_lib). -include("luerl.hrl"). ?MODULEDOC(false). -export([lua_error/2,badarg_error/3,badarith_error/3, format_error/1,format_value/1]). -export([boolean_value/1,first_value/1]). -export([number_to_list/1]). -export([arg_to_list/1,args_to_lists/1,args_to_lists/2]). -export([arg_to_number/1,arg_to_number/2,args_to_numbers/1,args_to_numbers/2]). -export([arg_to_integer/1,args_to_integers/1,args_to_integers/2]). -export([arg_to_float/1,args_to_floats/1,args_to_floats/2]). -export([arg_to_string/1,args_to_strings/1,args_to_strings/2]). -export([conv_list/2,conv_list/3]). -export([tostring/2]). -dialyzer({[no_return], [lua_error/2, badarg_error/3, badarith_error/3]}). -spec lua_error(_,_) -> no_return(). -spec badarg_error(_,_,_) -> no_return(). %% lua_error(Error, State) -> no_return(). %% badarg_error(What, Args, State) -> no_return(). %% badarith_error(What, Args, State) -> no_return(). lua_error(E, St) -> error({lua_error,E,St}). badarg_error(What, Args, St) -> lua_error({badarg,What,Args}, St). badarith_error(What, Args, St) -> lua_error({badarith,What,Args}, St). %% format_error(LuaError) -> ErrorString. %% The ErrorString is a UTF-8 encoded binary. The UTF-8 encoded %% codepoints can come from Lua/Luerl strings. Some of these use %% same text as Lua error string, so be careful if modifying them. format_error({badarg,Where,Args}) -> %% Note Args is a list which must be kept as its own list! format_error("bad argument ~ts to ~ts", [Args,Where]); format_error({badarith,Op,Args}) -> %% Note Args is a list which must be kept as its own list! format_error("bad arithmetic ~ts on ~ts", [Op,Args]); format_error({illegal_index,Where,Index}) -> format_error("invalid index in ~ts: ~ts", [Where,Index]); format_error({illegal_value,Where,Val}) -> format_error("invalid value in ~ts: ~ts", [Where,Val]); format_error({illegal_value,Val}) -> format_error("invalid value: ~ts", [Val]); format_error({illegal_comp,Where}) -> format_error(<<"illegal comparison in ~ts">>, [Where]); %% format_error({invalid_order,Where}) -> %Keep text! %% format_error(<<"invalid order function in ~w">>, [Where]); format_error({undefined_function,Name}) -> format_error(<<"undefined function ~ts">>, [Name]); format_error({undefined_method,Object,Name}) -> format_error(<<"undefined method ~ts in ~ts">>, [Name,Object]); format_error(illegal_return_value) -> <<"illegal format of return value">>; format_error({illegal_return_value,Func}) -> format_error(<<"illegal format of return value to ~ts">>, [Func]); %% Pattern errors. format_error(invalid_pattern) -> %Keep text! <<"malformed pattern">>; format_error(invalid_capture) -> %Keep text! <<"malformed pattern">>; format_error({invalid_char_class,C}) -> %Keep text! Msg = io_lib:format("malformed pattern (class ~c)", [C]), unicode:characters_to_binary(Msg); format_error(invalid_char_set) -> %Keep text! <<"malformed pattern (missing ']')">>; %% Illegal or undefined ops. format_error({illegal_op,Op}) -> format_error("illegal op: ~ts", [Op]); format_error({no_module,Mod}) -> %% We know the module name is an atom. Msg = io_lib:format("module '~s' not found", [Mod]), unicode:characters_to_binary(Msg); %% Assertions format_error({assert_error,Obj}) -> if is_binary(Obj) -> <>; true -> Type = luerl_lib_basic:type(Obj), <<"error object is a ",Type/binary,$!>> end; %% We have an error message here already. format_error({error_message,Msg}) -> Msg; %% Error is called. format_error({error_call,Args}) -> format_error_call(Args); %% binary is passed, we treat as an error message format_error(Binary) when is_binary(Binary) -> <>; %% Everything we don't recognise or know about. format_error(Error) -> unicode:characters_to_binary(io_lib:format(<<"~w!">>, [Error])). %% format_error_call(Args) -> ErrorString. %% Just get it more or less equivalent to what Lua does. format_error_call([A|_]) when is_binary(A) -> A; format_error_call([A|_]) when is_number(A) -> iolist_to_binary(format_value(A)); format_error_call(Args) -> Type = case Args of [A|_] -> luerl_lib_basic:type(A); [] -> <<"nil">> end, <<"error object is a ",Type/binary," value">>. %% format_error(FormatString, Values) -> ErrorString. %% Useful when all the values in the list need to be formatted %% separately and will be output separately. format_error(Format, Vals) -> Ps = lists:map(fun format_value/1, Vals), unicode:characters_to_binary(io_lib:format(Format, Ps)). %% format_value(LuerlData) -> Iolist. %% Take an Luerl data and return a "printable" representation suitable %% to use when printing error messages. format_value(nil) -> <<"nil">>; format_value(true) -> <<"true">>; format_value(false) -> <<"false">>; format_value(N) when is_number(N) -> io_lib:write(N); format_value(B) when is_binary(B) -> %% A luerl string which we print with quotes around it. %% Note that the string can contain unicode codepoints. [$\',B,$\']; format_value(#tref{}) -> <<"table">>; format_value(#usdref{}) -> <<"userdata">>; format_value(#funref{}) -> <<"function">>; format_value(#erl_func{code=Fun}) -> {name,Name} = erlang:fun_info(Fun, name), atom_to_binary(Name, utf8); format_value(#erl_mfa{f=Func}) -> atom_to_binary(Func, utf8); format_value(List) when is_list(List) -> Pl = lists:map(fun format_value/1, List), lists:join($\,, Pl); %% Treat atoms as binary strings here, probably just a name. format_value(A) when is_atom(A) -> [$\',atom_to_binary(A, utf8),$\']; %% Everything else just straight through. format_value(_Other) -> <<"unknown stuff">>. %% boolean_value(Rets) -> boolean(). %% first_value(Rets) -> Value | nil. %% Test first value of return list. boolean_value([V|_]) -> ?IS_TRUE(V); boolean_value([]) -> false. first_value([V|_]) -> V; first_value([]) -> nil. %% bin_to_number(Binary) -> {ok,Number} | error. %% str_to_number(String) -> {ok,Number} | error. %% Use the scanner to process all allowed number syntaxes. bin_to_number(B) -> str_to_number(binary_to_list(B)). str_to_number(S) -> case luerl_scan:string(S) of {ok,[{'NUMERAL',_,N}],_} -> {ok,N}; {ok,[{'+',_},{'NUMERAL',_,N}],_} -> {ok,N}; {ok,[{'-',_},{'NUMERAL',_,N}],_} -> {ok,-N}; _ -> error end. number_to_list(N) -> io_lib:write(N). %% case ?IS_FLOAT_INT(N, I) of %Is it an "integer"? %% true -> integer_to_list(I); %% false -> io_lib:write(N) %% end. %% arg_to_list(Arg) -> List | 'error'. %% args_to_lists(Args) -> Lists | 'error'. %% args_to_lists(Args, Acc) -> Lists | 'error'. arg_to_list(N) when is_number(N) -> number_to_list(N); arg_to_list(B) when is_binary(B) -> binary_to_list(B); arg_to_list(_) -> error. args_to_lists(As) -> args_to_lists(As, []). args_to_lists(As, Acc) -> to_loop(As, fun arg_to_list/1, Acc). %% arg_to_number(Arg) -> Number | error. %% arg_to_number(Arg, Base) -> Number | error. %% args_to_numbers(Args) -> Numbers | 'error'. %% args_to_numbers(Arg, Arg) -> Numbers | 'error'. %% Strings always result in floats. %% Arg_to_number/2 only generates "integers". Lua does it like that. arg_to_number(N) when is_number(N) -> N; arg_to_number(B) when is_binary(B) -> case bin_to_number(B) of {ok,N} -> float(N); error -> error end; arg_to_number(_) -> error. arg_to_number(A, B) -> case conv_list([A,B], [erl_list,lua_integer]) of [N0,Base] -> case catch begin [N1] = string:tokens(N0, [9,10,11,12,13,32,160]), {ok,list_to_integer(N1, Base)} end of {ok,I} -> float(I); _ -> error end end. %% arg_to_number(A, B) -> %% case args_to_numbers([A,B]) of %% [N1,N2] when ?IS_FLOAT_INT(N1) -> %% N1 * math:pow(10,N2); %% error -> error %% end. args_to_numbers(A1, A2) -> case luerl_lib:arg_to_number(A1) of error -> error; N1 -> case luerl_lib:arg_to_number(A2) of error -> error; N2 -> [N1,N2] end end. args_to_numbers(As) -> to_loop(As, fun arg_to_number/1, []). %% arg_to_integer(Arg) -> Integer | 'error'. %% args_to_integers(Args) -> Integers | 'error'. %% args_to_integers(Arg, Arg) -> Integers | 'error'. %% Convert arguments to rounded integers. arg_to_integer(A) -> case arg_to_number(A) of N when is_integer(N) -> N; N when ?IS_FLOAT_INT(N) -> round(N); _Other -> error %Other floats are bad here end. args_to_integers(A1, A2) -> case arg_to_integer(A1) of error -> error; N1 -> case arg_to_integer(A2) of error -> error; N2 -> [N1,N2] end end. args_to_integers(As) -> to_loop(As, fun arg_to_integer/1, []). %% arg_to_float(Arg) -> Float | 'error'. %% args_to_floats(Args) -> Floats | 'error'. %% args_to_floats(Arg, Arg) -> Floats | 'error'. %% Convert arguments to rounded floats. arg_to_float(A) -> case arg_to_number(A) of N when is_integer(N) -> float(N); N when is_float(N) -> N; _Other -> error end. args_to_floats(A1, A2) -> case arg_to_float(A1) of error -> error; N1 -> case arg_to_float(A2) of error -> error; N2 -> [N1,N2] end end. args_to_floats(As) -> to_loop(As, fun arg_to_float/1, []). %% arg_to_string(Arg) -> String | error. %% arg_to_strings(Args) -> Strings | error. %% arg_to_strings(Arg, Arg) -> Strings | error. arg_to_string(N) when is_number(N) -> list_to_binary(number_to_list(N)); arg_to_string(B) when is_binary(B) -> B; arg_to_string(_) -> error. args_to_strings(As) -> args_to_strings(As, []). args_to_strings(As, Acc) -> to_loop(As, fun arg_to_string/1, Acc). %% to_loop(List, Convert, Acc) -> List | 'error'. %% Step over list using foldl and return list or 'error'. We assume %% the list won't be very long so appending is ok. to_loop([A|As], Fun, Acc) -> case Fun(A) of error -> error; %Terminate on error E -> to_loop(As, Fun, Acc ++ [E]) end; to_loop([], _Fun, Acc) -> Acc. %% conv_list(Args, ToTypes) -> List | 'error'. %% conv_list(Args, ToTypes, Done) -> List | 'error'. %% Basically a type driven foldl where we return a list or 'error'. conv_list(As, Tos) -> conv_list(As, Tos, []). conv_list(_, _, error) -> error; %Propagate error conv_list([A|As], [To|Tos], Rs) -> %% Get the right value. Ret = case To of %% Erlang types. erl_list -> arg_to_list(A); erl_string -> arg_to_list(A); %% Lua types. lua_any -> A; lua_integer -> arg_to_integer(A); lua_number -> arg_to_number(A); lua_string -> arg_to_string(A); lua_bool -> ?IS_TRUE(A) end, case Ret of error -> error; %Return error Ret -> conv_list(As, Tos, [Ret|Rs]) end; conv_list([], _, Rs) -> lists:reverse(Rs); %No more arguments, done conv_list(_, [], Rs) -> lists:reverse(Rs). %No more conversions, done %% tostring(Data, State) -> {Ret,State} | LuaError %% Convert Data to a string representation using the standard method %% taking into account both the datatype and __tostring and __name %% metakeys. tostring(Data, St) -> case luerl_heap:get_metamethod(Data, <<"__tostring">>, St) of Meta when Meta =/= nil -> tostring_meta(Data, Meta, St); nil -> case luerl_heap:get_metamethod(Data, <<"__name">>, St) of Tag when is_binary(Tag) -> {tostring_tag(Data, Tag),St}; _Other -> %Even nil here {tostring_tag(Data, false),St} end end. %% tostring_meta(Arg, Meta, St0) when ?IS_FUNCTION(Meta) -> tostring_meta(Arg, Meta, St0) -> %% We will be nice here! {[Ret|_],St1} = luerl_emul:functioncall(Meta, [Arg], St0), if is_binary(Ret) -> {Ret,St1}; is_number(Ret) -> {iolist_to_binary(io_lib:write(Ret)),St1}; true -> lua_error({illegal_return_value,tostring}, St1) end. %% tostring_tag(Data, NameTag) -> Binary. %% We ignore the NameTag for the types with untagged values. tostring_tag(nil, _Name) -> <<"nil">>; tostring_tag(false, _Name) -> <<"false">>; tostring_tag(true, _Name) -> <<"true">>; tostring_tag(N, _Name) when is_number(N) -> %% A = abs(N), %% %% Print really big/small "integers" as floats as well. %% S = if ?IS_FLOAT_INT(N), A < 1.0e14 -> %% integer_to_list(round(N)); %% true -> io_lib:write(N) %% end, iolist_to_binary(io_lib:write(N)); tostring_tag(S, _Name) when is_binary(S) -> S; tostring_tag(#tref{i=I}, Name) -> iolist_to_binary([get_tag(Name, <<"table">>),integer_to_list(I)]); tostring_tag(#usdref{i=I}, Name) -> iolist_to_binary([get_tag(Name, <<"userdata">>),integer_to_list(I)]); tostring_tag(#funref{i=I}, Name) -> %Functions defined in Lua iolist_to_binary([get_tag(Name, <<"function">>),integer_to_list(I)]); tostring_tag(#erl_func{code=C}, Name) -> %Erlang functions iolist_to_binary([get_tag(Name, <<"function">>),io_lib:write(C)]); tostring_tag(#erl_mfa{m=M,f=F}, Name) -> %Erlang MFA triplets Tag = get_tag(Name, <<"function">>), iolist_to_binary([Tag,io_lib:write_atom(M),<<":">>,io_lib:write_atom(F)]); tostring_tag(#thread{}, Name) -> get_tag(Name, <<"thread">>); tostring_tag(_, _Name) -> <<"unknown">>. get_tag(Name, Type) -> if is_binary(Name) -> <>; true -> <> end. rvirding-luerl-772b25e/src/luerl_parse.yrl0000664000232200023220000002565215114130670021232 0ustar debalancedebalance%% Copyright (c) 2013-2025 Robert Virding %% -*- mode: erlang; indent-tabs-mode: nil -*- %% %% Licensed under the Apache License, Version 2.0 (the "License"); %% you may not use this file except in compliance with the License. %% You may obtain a copy of the License at %% %% http://www.apache.org/licenses/LICENSE-2.0 %% %% Unless required by applicable law or agreed to in writing, software %% distributed under the License is distributed on an "AS IS" BASIS, %% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. %% See the License for the specific language governing permissions and %% limitations under the License. %% File : luerl_parse.yrl %% Author : Robert Virding %% Purpose : Parser for LUA 5.2. %% The Grammar rules here are taken directly from the LUA 5.2 %% manual. Unfortunately it is not an LALR(1) grammar but I have %% included a fix by Florian Weimer which makes it %% so, but it needs some after processing. Actually his fix was %% unnecessarily complex and all that was needed was to change one %% rule for statements. Expect 2. %Suppress shift/reduce warning Nonterminals chunk block stats stat semi retstat label_stat while_stat repeat_stat if_stat if_elseif if_else for_stat func_stat local_stat local_decl funcname dottedname varlist var namelist attrib attname attnamelist explist exp prefixexp args functioncall functiondef funcbody parlist tableconstructor fieldlist fields field fieldsep binop unop uminus. Terminals NAME NUMERAL LITERALSTRING 'and' 'break' 'do' 'else' 'elseif' 'end' 'false' 'for' 'function' 'goto' 'if' 'in' 'local' 'nil' 'not' 'or' 'repeat' 'return' 'then' 'true' 'until' 'while' '+' '-' '*' '/' '//' '%' '^' '&' '|' '~' '>>' '<<' '#' '==' '~=' '<=' '>=' '<' '>' '=' '(' ')' '{' '}' '[' ']' '::' ';' ':' ',' '.' '..' '...' . Rootsymbol chunk. %% uminus needed for '-' as it has duplicate precedences. Left 100 'or'. Left 200 'and'. Left 300 '<' '>' '<=' '>=' '~=' '=='. Left 400 '|'. Left 500 '~'. Left 600 '&'. Left 700 '<<' '>>'. Right 800 '..'. Left 900 '+' '-'. Left 1000 '*' '/' '//' '%'. Unary 1100 'not' '#' uminus. Right 1200 '^'. chunk -> block : '$1' . %% block ::= {stat} [retstat] block -> stats : '$1' . block -> stats retstat : '$1' ++ ['$2'] . stats -> '$empty' : [] . stats -> stats stat : '$1' ++ ['$2'] . stat -> ';' : '$1' . stat -> varlist '=' explist : {assign,line('$2'),'$1','$3'} . %% Following functioncall rule removed to stop reduce-reduce conflict. %% Replaced with a prefixexp which should give the same. We hope! %%stat -> functioncall : '$1' . stat -> prefixexp : check_functioncall('$1') . stat -> label_stat : '$1' . stat -> 'break' : {break,line('$1')} . stat -> 'goto' NAME : {goto,line('$1'),'$2'} . stat -> 'do' block 'end' : {block,line('$1'),'$2'} . stat -> while_stat : '$1' . stat -> repeat_stat : '$1' . stat -> if_stat : '$1' . stat -> for_stat : '$1' . stat -> func_stat : '$1' . stat -> local_stat : '$1' . %% stat -> local local_decl : {local,line('$1'),'$2'} . %% retstat ::= return [explist] [‘;’] retstat -> return semi : {return,line('$1'),[]} . retstat -> return explist semi : {return,line('$1'),'$2'} . semi -> ';' . %semi is never returned semi -> '$empty' . %% attnamelist ::= Name attrib {‘,’ Name attrib} attnamelist -> attname : ['$1'] . attnamelist -> attnamelist ',' attname : '$1' ++ ['$3'] . attname -> NAME : '$1'. attname -> NAME attrib : {'$1','$2'}. %% attrib ::= [‘<’ Name ‘>’] attrib -> '<' NAME '>' : {attribute,line('$2'),'$2'}. %% label ::= ‘::’ Name ‘::’ label_stat -> '::' NAME '::' : {label,line('$1'),'$2'} . while_stat -> 'while' exp 'do' block 'end' : {while,line('$1'),'$2','$4'} . repeat_stat -> 'repeat' block 'until' exp : {repeat,line('$1'),'$2','$4'} . %% stat ::= if exp then block {elseif exp then block} [else block] end if_stat -> 'if' exp 'then' block if_elseif if_else 'end' : {'if',line('$1'),[{'$2','$4'}|'$5'],'$6'} . if_elseif -> if_elseif 'elseif' exp 'then' block : '$1' ++ [{'$3','$5'}] . if_elseif -> '$empty' : [] . if_else -> 'else' block : '$2' . if_else -> '$empty' : [] . %An empty block %% stat ::= for Name '=' exp ',' exp [',' exp] do block end %% stat ::= for namelist in explist do block end for_stat -> 'for' NAME '=' explist do block end : numeric_for(line('$1'), '$2', '$4', '$6') . for_stat -> 'for' namelist 'in' explist 'do' block 'end' : generic_for(line('$1'), '$2', '$4', '$6') . %% stat ::= function funcname funcbody func_stat -> function funcname funcbody : functiondef(line('$1'),'$2','$3') . %% funcname ::= Name {'.' Name} [':' Name] funcname -> dottedname ':' NAME : dot_append(line('$2'), '$1', {method,line('$2'),'$3'}) . funcname -> dottedname : '$1' . %% stat ::= local function Name funcbody %% stat ::= local attnamelist [‘=’ explist] local_stat -> 'local' local_decl : {local,line('$1'),'$2'} . local_decl -> function NAME funcbody : functiondef(line('$1'),'$2','$3') . local_decl -> attnamelist : {assign,line(hd('$1')),'$1',[]} . local_decl -> attnamelist '=' explist : {assign,line('$2'),'$1','$3'} . dottedname -> NAME : '$1'. dottedname -> dottedname '.' NAME : dot_append(line('$2'), '$1', '$3') . %% varlist ::= var {‘,’ var} varlist -> var : ['$1'] . varlist -> varlist ',' var : '$1' ++ ['$3'] . %% var ::= Name | prefixexp ‘[’ exp ‘]’ | prefixexp ‘.’ Name var -> NAME : '$1' . var -> prefixexp '[' exp ']' : dot_append(line('$2'), '$1', {key_field,line('$2'),'$3'}) . var -> prefixexp '.' NAME : dot_append(line('$2'), '$1', '$3') . %% namelist ::= Name {‘,’ Name} namelist -> NAME : ['$1'] . namelist -> namelist ',' NAME : '$1' ++ ['$3'] . %% explist ::= exp {‘,’ exp} explist -> exp : ['$1'] . explist -> explist ',' exp : '$1' ++ ['$3'] . exp -> 'nil' : '$1' . exp -> 'false' : '$1' . exp -> 'true' : '$1' . exp -> NUMERAL : '$1' . exp -> LITERALSTRING : '$1' . exp -> '...' : '$1' . exp -> functiondef : '$1' . exp -> prefixexp : '$1' . exp -> tableconstructor : '$1' . exp -> binop : '$1' . exp -> unop : '$1' . %% prefixexp ::= var | functioncall | ‘(’ exp ‘)’ prefixexp -> var : '$1' . prefixexp -> functioncall : '$1' . prefixexp -> '(' exp ')' : {single,line('$1'),'$2'} . %% functioncall ::= prefixexp args | prefixexp ‘:’ Name args functioncall -> prefixexp args : dot_append(line('$1'), '$1', {functioncall,line('$1'), '$2'}) . functioncall -> prefixexp ':' NAME args : dot_append(line('$2'), '$1', {methodcall,line('$2'),'$3','$4'}) . %% args ::= ‘(’ [explist] ‘)’ | tableconstructor | LiteralString args -> '(' ')' : [] . args -> '(' explist ')' : '$2' . args -> tableconstructor : ['$1'] . %Syntactic sugar args -> LITERALSTRING : ['$1'] . %Syntactic sugar %% functiondef ::= function funcbody functiondef -> 'function' funcbody : functiondef(line('$1'), '$2'). %% funcbody ::= ‘(’ [parlist] ‘)’ block end funcbody -> '(' ')' block 'end' : {[],'$3'} . funcbody -> '(' parlist ')' block 'end' : {'$2','$4'} . %% parlist ::= namelist [‘,’ ‘...’] | ‘... parlist -> namelist : '$1' . parlist -> namelist ',' '...' : '$1' ++ ['$3'] . parlist -> '...' : ['$1'] . %% tableconstructor ::= ‘{’ [fieldlist] ‘}’ tableconstructor -> '{' '}' : {table,line('$1'),[]} . tableconstructor -> '{' fieldlist '}' : {table,line('$1'),'$2'} . %% fieldlist ::= field {fieldsep field} [fieldsep] fieldlist -> fields : '$1' . fieldlist -> fields fieldsep : '$1' . fields -> field : ['$1'] . fields -> fields fieldsep field : '$1' ++ ['$3'] . %% field ::= ‘[’ exp ‘]’ ‘=’ exp | Name ‘=’ exp | exp field -> '[' exp ']' '=' exp : {key_field,line('$1'),'$2','$5'} . field -> NAME '=' exp : {name_field,line('$1'),'$1','$3'} . field -> exp : {exp_field,line('$1'),'$1'} . fieldsep -> ',' . fieldsep -> ';' . %% fieldsep ::= ‘,’ | ‘;’ %% exp ::= exp binop exp %% exp ::= unop exp %% We have to write them these way for the prioriies to work. binop -> exp '+' exp : {op,line('$2'),cat('$2'),'$1','$3'}. binop -> exp '-' exp : {op,line('$2'),cat('$2'),'$1','$3'}. binop -> exp '*' exp : {op,line('$2'),cat('$2'),'$1','$3'}. binop -> exp '/' exp : {op,line('$2'),cat('$2'),'$1','$3'}. binop -> exp '//' exp : {op,line('$2'),cat('$2'),'$1','$3'}. binop -> exp '%' exp : {op,line('$2'),cat('$2'),'$1','$3'}. binop -> exp '^' exp : {op,line('$2'),cat('$2'),'$1','$3'}. binop -> exp '&' exp : {op,line('$2'),cat('$2'),'$1','$3'}. binop -> exp '|' exp : {op,line('$2'),cat('$2'),'$1','$3'}. binop -> exp '~' exp : {op,line('$2'),cat('$2'),'$1','$3'}. binop -> exp '>>' exp : {op,line('$2'),cat('$2'),'$1','$3'}. binop -> exp '<<' exp : {op,line('$2'),cat('$2'),'$1','$3'}. binop -> exp '==' exp : {op,line('$2'),cat('$2'),'$1','$3'}. binop -> exp '~=' exp : {op,line('$2'),cat('$2'),'$1','$3'}. binop -> exp '<=' exp : {op,line('$2'),cat('$2'),'$1','$3'}. binop -> exp '>=' exp : {op,line('$2'),cat('$2'),'$1','$3'}. binop -> exp '<' exp : {op,line('$2'),cat('$2'),'$1','$3'}. binop -> exp '>' exp : {op,line('$2'),cat('$2'),'$1','$3'}. binop -> exp '..' exp : {op,line('$2'),cat('$2'),'$1','$3'}. binop -> exp 'and' exp : {op,line('$2'),cat('$2'),'$1','$3'}. binop -> exp 'or' exp : {op,line('$2'),cat('$2'),'$1','$3'}. unop -> 'not' exp : {op,line('$1'),cat('$1'),'$2'} . unop -> '#' exp : {op,line('$1'),cat('$1'),'$2'} . unop -> '~' exp : {op,line('$1'),cat('$1'),'$2'} . unop -> uminus : '$1' . uminus -> '-' exp : {op,line('$1'),'-','$2'} . Erlang code. -include("luerl.hrl"). ?MODULEDOC(false). -export([chunk/1]). %% chunk(Tokens) -> FunctionDef | Error. %% Return the parse as a callable nameless function definition. chunk(Ts) -> case parse(Ts) of {error,_}=Error -> Error; {ok,Body} -> {ok,{functiondef,1,[{'...',1}],Body}} end. cat(T) -> element(1, T). line(T) -> element(2, T). %% numeric_for(Line, LoopVar, [Init,Test,Upd], Block). numeric_for(Line, Var, [Init,Limit], Block) -> {for,Line,Var,Init,Limit,Block}; numeric_for(Line, Var, [Init,Limit,Step], Block) -> {for,Line,Var,Init,Limit,Step,Block}; numeric_for(Line, _, _, _) -> %Wrong number of expressions return_error(Line, "illegal for"). %% generic_for(Line, Names, ExpList, Block). generic_for(Line, Names, Exps, Block) -> {for,Line,Names,Exps,Block}. %% functiondef(Line, Name, {Parameters,Body}). %% functiondef(Line, {Parameters,Body}). functiondef(Line, Name, {Pars,Body}) -> {functiondef,Line,Name,Pars,Body}. functiondef(Line, {Pars,Body}) -> {functiondef,Line,Pars,Body}. %% dot_append(Line, DotList, Last) -> DotList. %% Append Last to the end of a dotlist. dot_append(Line, {'.',L,H,T}, Last) -> {'.',L,H,dot_append(Line, T, Last)}; dot_append(Line, H, Last) -> {'.',Line,H,Last}. %% check_functioncall(PrefixExp) -> PrefixExp. %% Check that the PrefixExp is a proper function call/method. check_functioncall({functioncall,_,_}=C) -> C; check_functioncall({methodcall,_,_,_}=M) -> M; check_functioncall({'.',L,H,T}) -> {'.',L,H,check_functioncall(T)}; check_functioncall(Other) -> return_error(line(Other),"illegal call"). rvirding-luerl-772b25e/src/luerl_comp.erl0000664000232200023220000002375115114130670021030 0ustar debalancedebalance%% Copyright (c) 2013-2019 Robert Virding %% %% Licensed under the Apache License, Version 2.0 (the "License"); %% you may not use this file except in compliance with the License. %% You may obtain a copy of the License at %% %% http://www.apache.org/licenses/LICENSE-2.0 %% %% Unless required by applicable law or agreed to in writing, software %% distributed under the License is distributed on an "AS IS" BASIS, %% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. %% See the License for the specific language governing permissions and %% limitations under the License. %% File : luerl_comp.erl %% Author : Robert Virding %% Purpose : A basic LUA 5.3 compiler for Luerl. %% This is the main loop of the Luerl compiler. While we can handle %% errors in this loop they should never occur as Lua basically allows %% almost everything that gets past the parser. The only exception are %% goto's to undefined labels, but we don't handle goto's yet. %% %% We also have the first pass here. It normalises the code and %% converts to an internal form. -module(luerl_comp). -export([file/1,file/2,string/1,string/2,chunk/1,chunk/2]). -export([forms/1,forms/2]). -export([debug_print/3]). -import(lists, [member/2,keysearch/3,mapfoldl/3,foreach/2]). -include_lib("kernel/include/file.hrl"). -include("luerl.hrl"). -include("luerl_comp.hrl"). ?MODULEDOC(false). %% The main Lua compiler state. -record(luacomp, {base="", %Base name ldir="", %Lua file dir lfile="", %Lua file odir=".", %Output directory opts=[], %User options code=none, %Code after last pass. cinfo=none, %Common compiler info errors=[], warnings=[] }). -define(NOFILE, "-no-file-"). %% file(Name) -> %% {ok,Chunk} | {error,Error,Warnings} | error}. %% file(Name, Options) -> %% {ok,Chunk} | {error,Error,Warnings} | error}. file(Name) -> file(Name, [verbose,report]). file(Name, Opts) -> St0 = #luacomp{opts=Opts}, St1 = filenames(Name, St0), do_compile(file_passes(), St1). %% string(String) -> %% {ok,Chunk} | {error,Error,Warnings} | error}. %% string(String, Options) -> %% {ok,Chunk} | {error,Error,Warnings} | error}. string(Str) -> string(Str, [verbose,report]). string(Str, Opts) when is_binary(Str) -> string(binary_to_list(Str), Opts); string(Str, Opts) when is_list(Str) -> St0 = #luacomp{opts=Opts,code=Str}, File = prop(module, Opts, ?NOFILE), St1 = filenames(File, St0), do_compile(list_passes(), St1). %% chunk(Chunk) -> %% {ok,Chunk} | {error,Error,Warnings} | error}. %% chunk(Chunk, Options) -> %% {ok,Chunk} | {error,Error,Warnings} | error}. chunk(Chunk) -> chunk(Chunk, [verbose,report]). chunk(Chunk, Opts) -> St0 = #luacomp{opts=Opts,code=Chunk}, File = prop(module, Opts, ?NOFILE), St1 = filenames(File, St0), do_compile(chunk_passes(), St1). %% forms(Forms) %% forms(Forms, Options) %% The deprecated fuuncttions for compiling a chunk. forms(C) -> chunk(C). forms(C, Opts) -> chunk(C, Opts). %% do_compile(Passes, CompilerState) -> %% {ok,Code} | {error,Error,Warnings} | error. do_compile(Passes, St0) -> %% The compiler state already contains the filenames. Cinfo = compiler_info(St0), %The compiler info St1 = St0#luacomp{cinfo=Cinfo}, case do_passes(Passes, St1) of {ok,St2} -> do_ok_return(St2); {error,St2} -> do_error_return(St2) end. %% filenames(File, State) -> State. %% The default output dir is the current directory unless an %% explicit one has been given in the options. filenames(?NOFILE, St) -> St#luacomp{lfile=?NOFILE}; filenames(File, St) -> Suffix = ".lua", %% Test for explicit outdir. Odir = prop(outdir, St#luacomp.opts, "."), Ldir = filename:dirname(File), Base = filename:basename(File, Suffix), Lfile = luafile(Ldir, Base, Suffix), St#luacomp{base=Base, ldir=Ldir, lfile=Lfile, odir=Odir}. luafile(".", Base, Suffix) -> Base ++ Suffix; luafile(Dir, Base, Suffix) -> filename:join(Dir, Base ++ Suffix). %% prop(Key, PropList, Default) -> Value | Default. %% Find Key, Val from PropList else Default. prop(Key, [{Key,Val}|_], _Def) -> Val; prop(Key, [_|Plist], Def) -> prop(Key, Plist, Def); prop(_Key, [], Def) -> Def. %% compiler_info(State) -> CompInfo. %% Initialise the #cinfo record passed into all compiler passes. compiler_info(#luacomp{lfile=F,opts=Opts}) -> %% The file option may get a binary so we are helpful. Vfile = iolist_to_binary(prop(file, Opts, F)), #cinfo{lfile=F,vfile=Vfile,opts=Opts}. %% file_passes() -> [Pass]. %% list_passes() -> [Pass]. %% chunk_passes() -> [Pass]. %% Build list of passes. file_passes() -> %Reading from file [{do,fun do_scan_file/1}, {when_flag,to_scan,{done,fun(St) -> {ok,St} end}}, {do,fun do_parse/1} | chunk_passes()]. list_passes() -> %Scanning string [{do,fun do_scan_string/1}, {when_flag,to_scan,{done,fun(St) -> {ok,St} end}}, {do,fun do_parse/1} | chunk_passes()]. chunk_passes() -> %Doing the chunk [{when_flag,to_parse,{done,fun(St) -> {ok,St} end}}, {do,fun do_init_comp/1}, {do,fun do_comp_normalise/1}, {when_flag,to_norm,{done,fun(St) -> {ok,St} end}}, {do,fun do_comp_lint/1}, {do,fun do_comp_vars/1}, {when_flag,to_vars,{done,fun(St) -> {ok,St} end}}, %% {do,fun do_comp_locf/1}, {do,fun do_comp_env/1}, {when_flag,to_env,{done,fun(St) -> {ok,St} end}}, {do,fun do_code_gen/1}, {unless_flag,no_iopt,{do,fun do_peep_op/1}}]. %% do_passes(Passes, State) -> {ok,State} | {error,Reason}. %% Interpret the list of commands in a pass. %% %% Commands can be one of: %% %% {when_flag,Flag,Cmd} %% {unless_flag,Flag,Cmd} %% {do,Fun} %% {done,PrintFun,Ext} do_passes([{do,Fun}|Ps], St0) -> case Fun(St0) of {ok,St1} -> do_passes(Ps, St1); {error,St1} -> {error,St1} end; do_passes([{when_flag,Flag,Cmd}|Ps], St) -> case member(Flag, St#luacomp.opts) of true -> do_passes([Cmd|Ps], St); false -> do_passes(Ps, St) end; do_passes([{unless_flag,Flag,Cmd}|Ps], St) -> case member(Flag, St#luacomp.opts) of true -> do_passes(Ps, St); false -> do_passes([Cmd|Ps], St) end; do_passes([{done,Fun}|_], St) -> Fun(St); do_passes([], St) -> {ok,St}. %% do_scan_file(State) -> {ok,State} | {error,State}. %% do_scan_string(State) -> {ok,State} | {error,State}. %% do_parse(State) -> {ok,State} | {error,State}. %% do_init_comp(State) -> {ok,State} | {error,State}. %% do_comp_normalise(State) -> {ok,State} | {error,State}. %% do_comp_lint(State) -> {ok,State} | {error,State}. %% do_comp_vars(State) -> {ok,State} | {error,State}. %% do_comp_env(State) -> {ok,State} | {error,State}. %% do_comp_cg(State) -> {ok,State} | {error,State}. %% do_comp_peep(State) -> {ok,State} | {error,State}. %% The actual compiler passes. do_scan_file(#luacomp{lfile=Name,opts=Opts}=St) -> case luerl_io:scan_file(Name, 1) of {ok,Ts} -> debug_print(Opts, "scan: ~p\n", [Ts]), {ok,St#luacomp{code=Ts}}; {eof,_} -> {ok,St#luacomp{code=[]}}; {error,E} -> {error,St#luacomp{errors=[E]}} end. do_scan_string(#luacomp{code=Str,opts=Opts}=St) -> case luerl_scan:string(Str) of {ok,Ts,_} -> debug_print(Opts, "scan: ~p\n", [Ts]), {ok,St#luacomp{code=Ts}}; {error,E,_} -> {error,St#luacomp{errors=[E]}} end. do_parse(#luacomp{code=Ts,opts=Opts}=St) -> case luerl_parse:chunk(Ts) of {ok,Chunk} -> debug_print(Opts, "parse: ~p\n", [Chunk]), {ok,St#luacomp{code=Chunk}}; {error,E} -> {error,St#luacomp{errors=[E]}} end. do_init_comp(#luacomp{}=St) -> %% Nothing to do here now. {ok,St}. do_comp_normalise(#luacomp{code=Code0,cinfo=Cinfo}=St) -> {ok,Code1} = luerl_comp_normalise:chunk(Code0, Cinfo), {ok,St#luacomp{code=Code1}}. do_comp_lint(#luacomp{code=Code,cinfo=Cinfo}=St) -> case luerl_comp_lint:chunk(Code, Cinfo) of {ok,Ws} -> {ok,St#luacomp{warnings=Ws}}; {error,Es,Ws} -> {error,St#luacomp{errors=Es,warnings=Ws}} end. do_comp_vars(#luacomp{code=Code0,cinfo=Cinfo}=St) -> {ok,Code1} = luerl_comp_vars:chunk(Code0, Cinfo), {ok,St#luacomp{code=Code1}}. %% do_comp_locf(#luacomp{code=Code0,cinfo=Cinfo}=St) -> %% case luerl_comp_locf:chunk(Code0, Cinfo) of %% {ok,Code1} -> {ok,St#luacomp{code=Code1}}; %% {ok,Code1,Ws} -> {ok,St#luacomp{code=Code1,warnings=Ws}}; %% {error,Es} -> {error,St#luacomp{errors=Es}} %% end. do_comp_env(#luacomp{code=Code0,cinfo=Cinfo}=St) -> {ok,Code1} = luerl_comp_env:chunk(Code0, Cinfo), {ok,St#luacomp{code=Code1}}. do_code_gen(#luacomp{code=Code0,cinfo=Cinfo}=St) -> {ok,Code1} = luerl_comp_cg:chunk(Code0, Cinfo), {ok,St#luacomp{code=Code1}}. do_peep_op(#luacomp{code=Code0,cinfo=Cinfo}=St) -> {ok,Code1} = luerl_comp_peep:chunk(Code0, Cinfo), {ok,St#luacomp{code=Code1}}. do_ok_return(#luacomp{lfile=Lfile,opts=Opts,code=C,warnings=Ws}) -> Report = lists:member(report, Opts), ?IF(Report, list_warnings(Lfile, Ws), ok), {ok,C}. do_error_return(#luacomp{lfile=Lfile,opts=Opts,errors=Es,warnings=Ws}) -> Report = lists:member(report, Opts), Return = lists:member(return, Opts), ?IF(Report, begin list_errors(Lfile, Es), list_warnings(Lfile, Ws) end, ok), ?IF(Return, {error,Es,Ws}, error). debug_print(Opts, Format, Args) -> ?DEBUG_PRINT(Format, Args, Opts). list_warnings(F, Ws) -> foreach(fun ({Line,Mod,Warn}) -> Cs = Mod:format_error(Warn), io:format("~s:~w: Warning: ~s\n", [F,Line,Cs]); ({Mod,Warn}) -> Cs = Mod:format_error(Warn), io:format("~s: Warning: ~s\n", [F,Cs]) end, Ws). list_errors(F, Es) -> foreach(fun ({Line,Mod,Error}) -> Cs = Mod:format_error(Error), io:format("~s:~w: ~s\n", [F,Line,Cs]); ({Mod,Error}) -> Cs = Mod:format_error(Error), io:format("~s: ~s\n", [F,Cs]) end, Es). rvirding-luerl-772b25e/src/luerl_anno.erl0000664000232200023220000000507615114130670021025 0ustar debalancedebalance%% Copyright (c) 2019 Robert Virding %% %% Licensed under the Apache License, Version 2.0 (the "License"); %% you may not use this file except in compliance with the License. %% You may obtain a copy of the License at %% %% http://www.apache.org/licenses/LICENSE-2.0 %% %% Unless required by applicable law or agreed to in writing, software %% distributed under the License is distributed on an "AS IS" BASIS, %% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. %% See the License for the specific language governing permissions and %% limitations under the License. %% File : luerl_anno.erl %% Author : Robert Virding %% Purpose : Handle annotations in the Luerl abstract code. %% We keep the same standard as in the Erlang AST: %% %% - annotations with just the line number can be just the integer. %% - in an aonnotation list the line number is just an integer while %% all other annotations have the format {Key,Value}. -module(luerl_anno). -include("luerl.hrl"). ?MODULEDOC(false). -export([new/0,new/1,new/2,set_line/2,line/1,set/3,get/2]). %% new() -> Anno. %% new(Line) -> Anno. %% new(Key, Val) -> Anno. %% Create an empty annotation, one containing Line and one containing %% a general Key/Val. new() -> []. new(Line) -> Line. new(Key, Val) -> set(Key, Val, new()). %% set_line(Line, Anno) -> Anno. %% line(Anno) -> Line | undefined. %% Specific functions for accessing line numbers in the anno. set_line(Line, Anno) when is_integer(Anno) -> Line; set_line(Line, Anno) -> set_line1(Line, Anno). set_line1(Line, [Old|Anno]) when is_integer(Old) -> [Line|Anno]; set_line1(Line, [A|Anno]) -> [A|set_line1(Line, Anno)]; set_line1(Line, []) -> [Line]. line(Anno) when is_integer(Anno) -> Anno; line(Anno) -> line1(Anno). line1([Line|_]) when is_integer(Line) -> Line; line1([_|Anno]) -> line1(Anno); line1([]) -> undefined. %% set(Key, Value, Anno) -> Anno. %% get(Key, Anno) -> Value | undefined. %% Generic accessing functions for the anno. set(line, Val, Anno) -> set_line(Val, Anno); set(Key, Val, Anno) when is_integer(Anno) -> [Anno,{Key,Val}]; set(Key, Val, Anno) -> set1(Key, Val, Anno). set1(Key, Val, [{Key,_Old}|Anno]) -> [{Key,Val}|Anno]; set1(Key, Val, [A|Anno]) -> [A|set1(Key, Val, Anno)]; set1(Key, Val, []) -> [{Key,Val}]. get(line, Anno) -> line(Anno); %This is untagged get(_Key, Anno) when is_integer(Anno) -> %This is untagged so not Key undefined; get(Key, Anno) -> get1(Key, Anno). get1(Key, [{Key,Val}|_Anno]) -> Val; get1(Key, [_|Anno]) -> get1(Key, Anno); get1(_Key, []) -> undefined. rvirding-luerl-772b25e/src/luerl_lib_utf8.erl0000664000232200023220000001151715114130670021603 0ustar debalancedebalance%% Copyright (c) 2013-2020 Robert Virding %% %% Licensed under the Apache License, Version 2.0 (the "License"); %% you may not use this file except in compliance with the License. %% You may obtain a copy of the License at %% %% http://www.apache.org/licenses/LICENSE-2.0 %% %% Unless required by applicable law or agreed to in writing, software %% distributed under the License is distributed on an "AS IS" BASIS, %% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. %% See the License for the specific language governing permissions and %% limitations under the License. %% File : luerl_lib_utf8.erl %% Author : Robert Virding %% Purpose : The utf8 library for Luerl. -module(luerl_lib_utf8). -include("luerl.hrl"). ?MODULEDOC(false). -export([install/1,utf8_char/3,codes/3,codepoint/3,utf8_len/3,offset/3]). -import(luerl_lib, [lua_error/2,badarg_error/3]). %Shorten these install(St) -> luerl_heap:alloc_table(table(), St). table() -> [{<<"char">>,#erl_mfa{m=?MODULE,f=utf8_char}}, {<<"charpattern">>,<<"[\0-\x7F\xC2-\xF4][\x80-\xBF]*">>}, {<<"codes">>,#erl_mfa{m=?MODULE,f=codes}}, {<<"codepoint">>,#erl_mfa{m=?MODULE,f=codepoint}}, {<<"len">>,#erl_mfa{m=?MODULE,f=utf8_len}}, {<<"offset">>,#erl_mfa{m=?MODULE,f=offset}} ]. %% char(...) -> String. %% Receives zero or more integers, converts each one to its %% corresponding UTF-8 byte sequence and returns a string with the %% concatenation of all these sequences. utf8_char(_, As, St) -> case luerl_lib:args_to_integers(As) of Is when is_list(Is) -> Ss = << <> || I <- Is >>, {[Ss],St}; error -> badarg_error(char, As, St) end. %% len(...) -> Integer. %% Returns the number of UTF-8 characters in string s that start %% between positions i and j (both inclusive). The default for i is 1 %% and for j is -1. If it finds any invalid byte sequence, returns a %% false value plus the position of the first invalid byte. utf8_len(_, As, St) -> {Str,I,J} = string_args(As, len, St), StrLen = byte_size(Str), Ret = if I > J -> [0]; %Do the same as Lua true -> Bin = binary_part(Str, I - 1, StrLen - I + 1), case bin_len(Bin, StrLen - J, 0) of {ok,Size} -> [Size]; {error,Rest} -> [nil,StrLen - byte_size(Rest) + 1] end end, {Ret,St}. bin_len(Bin, Last, N) when byte_size(Bin) =< Last -> {ok,N}; bin_len(Bin0, Last, N) -> try <<_/utf8,Bin1/binary>> = Bin0, bin_len(Bin1, Last, N+1) catch _:_ -> {error,Bin0} end. %% codepoint(...) -> [Integer]. %% Returns the codepoints (as integers) from all characters in s that %% start between byte position i and j (both included). The default %% for i is 1 and for j is i. It raises an error if it meets any %% invalid byte sequence. codepoint(_, As, St) -> {Str,I,J} = string_args(As, codepoint, St), StrLen = byte_size(Str), Ret = if I > J -> []; %Do the same as Lua true -> Bin = binary_part(Str, I - 1, StrLen - I + 1), case bin_codepoint(Bin, StrLen - J, []) of {ok,Cps} -> Cps; {error,_} -> badarg_error(codepoint, As, St) end end, {Ret,St}. bin_codepoint(Bin, Last, Cps) when byte_size(Bin) =< Last -> {ok,lists:reverse(Cps)}; bin_codepoint(Bin0, Last, Cps) -> try <> = Bin0, bin_codepoint(Bin1, Last, [C|Cps]) catch _:_ -> {error,Bin0} end. %% codes(String) -> [Fun,String,P]. codes(_, As, St) -> case luerl_lib:conv_list(As, [lua_string]) of error -> badarg_error(codes, As, St); [Str|_] -> {[#erl_func{code=fun codes_next/2},Str,0],St} end. codes_next([A], St) -> codes_next([A,0], St); codes_next([Str,P|_], St) when byte_size(Str) =< P -> {[nil],St}; codes_next([Str,P|_], St) when is_binary(Str) -> <<_:P/binary,C/utf8,Rest/binary>> = Str, P1 = byte_size(Str) - byte_size(Rest), {[P1,C],St}. %% offset(String, N, ...) -> Integer. -spec offset(_, [_], any()) -> no_return(). offset(_, As, St) -> _ = string_args(As, offset, St), %% We don't do anything yet. lua_error({'NYI',offset}, St). %% string_args(Args, Op, St) -> {String,I,J}. %% Return the string, i and j values from the arguments. Generate a %% badarg error on bad values. string_args(As, Op, St) -> %% Get the args. Args = luerl_lib:conv_list(As, [lua_string,lua_integer,lua_integer]), case Args of %Cunning here, export A1,A2,A3 [A1,A2,A3|_] -> ok; [A1,A2] -> A3 = byte_size(A1); [A1] -> A2 = 1, A3 = byte_size(A1); error -> A1 = A2 = A3 = ok, badarg_error(Op, As, St) end, StrLen = byte_size(A1), %% Check args and return Str, I, J. Str = A1, I = if A2 > 0, A2 =< StrLen -> A2; A2 < 0, A2 >= -StrLen -> StrLen + A2 + 1; true -> badarg_error(Op, As, St) end, J = if A3 > 0, A3 =< StrLen -> A3; A3 < 0, A3 >= -StrLen -> StrLen + A3 + 1; true -> badarg_error(Op, As, St) end, {Str,I,J}. rvirding-luerl-772b25e/src/luerl_comp_env.erl0000664000232200023220000003001715114130670021671 0ustar debalancedebalance%% Copyright (c) 2013 Robert Virding %% %% Licensed under the Apache License, Version 2.0 (the "License"); %% you may not use this file except in compliance with the License. %% You may obtain a copy of the License at %% %% http://www.apache.org/licenses/LICENSE-2.0 %% %% Unless required by applicable law or agreed to in writing, software %% distributed under the License is distributed on an "AS IS" BASIS, %% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. %% See the License for the specific language governing permissions and %% limitations under the License. %% File : luerl_comp_env.erl %% Author : Robert Virding %% Purpose : A basic LUA 5.3 compiler for Luerl. %% Does variable and stack analysis in the compiler -module(luerl_comp_env). -include("luerl.hrl"). -include("luerl_comp.hrl"). ?MODULEDOC(false). -export([chunk/2]). -import(ordsets, [is_element/2,intersection/2,subtract/2]). %% Local state. -record(c_env, {lfs=[], %Variable frames efs=[], %Environment frames vars=none, fs=[], locv=false, %Local variables locf %Local frame }). %% chunk(Code, CompInfo) -> {ok,Code}. chunk(Code0, #cinfo{opts=Opts}=_Ci) -> St0 = #c_env{}, %Local state {Code1,_} = functiondef(Code0, St0), luerl_comp:debug_print(Opts, "ce: ~p\n", [Code1]), {ok,Code1}. %% alloc_frame(State) -> State. %% pop_frame(State) -> State. %% get_frame(State) -> Frame. alloc_frame(#c_env{vars=#vars{},fs=Fs}=St) -> F = new_frame(), St#c_env{fs=[F|Fs]}. pop_frame(#c_env{fs=[_|Fs]}=St) -> St#c_env{fs=Fs}. get_frame(#c_env{fs=[F|_]}) -> F. %% new_frame(LocalSize, EnvSize) -> Frame. %% We know frame will be tuples which we index from 1. Also Lua has %% the feature that every time you add a local variable you get a new %% version of it which shadows the old one. We handle this by keeping %% them in reverse order and always pushing variable to front of %% list. %% %% We get the size from the index of the last variable of each type added. %% %% NOTE: We can have empty frames here. The emulator knows about this %% and can handle it. %% %% Frame :: {LocalIndex,EnvIndex,Vars} %% Var :: {Name,Type,Index} new_frame() -> {0,0,[]}. find_frame_var(N, {_,_,Fs}) -> find_frame_var_1(N, Fs). find_frame_var_1(N, [{N,Type,I}|_]) -> {yes,Type,I}; find_frame_var_1(N, [_|F]) -> find_frame_var_1(N, F); find_frame_var_1(_, []) -> no. frame_local_size({Li,_,_}) -> Li. frame_env_size({_,Ei,_}) -> Ei. add_frame_local_var(N, {Li,Ei,Fs}) -> {Li+1,Ei,[{N,lvar,Li+1}|Fs]}. add_frame_env_var(N, {Li,Ei,Fs}) -> {Li,Ei+1,[{N,evar,Ei+1}|Fs]}. %% find_fs_var(Name, FrameStack) -> {yes,Type,Depth,Index} | no. %% Find a variable in the frame stack returning its depth and %% index. find_fs_var(N, Fs) -> find_fs_var(N, Fs, 1, 1). find_fs_var(N, [F|Fs], Ld, Ed) -> case find_frame_var(N, F) of {yes,lvar,Li} -> {yes,lvar,Ld,Li}; {yes,evar,Ei} -> {yes,evar,Ed,Ei}; no -> Ld1 = Ld + 1, Ed1 = Ed + 1, find_fs_var(N, Fs, Ld1, Ed1) end; find_fs_var(_, [], _, _) -> no. %% add_var(Var, State) -> State. %% get_var(Var, State) -> #lvar{} | #evar{} | #gvar{}. add_var(#var{name=N}, St) -> case var_type(N, St) of local -> add_local_var(N, St); env -> add_env_var(N, St) end. add_env_var(V, #c_env{fs=[F0|Fs]}=St) -> F1 = add_frame_env_var(V, F0), St#c_env{fs=[F1|Fs]}. add_local_var(N, #c_env{fs=[F0|Fs]}=St) -> F1 = add_frame_local_var(N, F0), St#c_env{fs=[F1|Fs]}. get_var(#var{l=Line,name=N}, #c_env{fs=Fs}) -> case find_fs_var(N, Fs) of {yes,lvar,Ld,Li} -> #lvar{l=Line,n=N,d=Ld,i=Li}; {yes,evar,Ed,Ei} -> #evar{l=Line,n=N,d=Ed,i=Ei}; no -> #gvar{l=Line,n=N} end. var_type(N, #c_env{vars=#vars{fused=Fused}}) -> case is_element(N, Fused) of true -> env; false -> local end. %% stmt(Stmts, State) -> {Stmts,State}. stmts([S0|Ss0], St0) -> {S1,St1} = stmt(S0, nul, St0), %% io:format("ss1: ~p\n", [{Loc0,Free0,Used0}]), {Ss1,St2} = stmts(Ss0, St1), {[S1|Ss1],St2}; stmts([], St) -> {[],St}. %% stmt(Stmt, State) -> {Stmt,State}. stmt(#assign_stmt{}=A, _, St) -> assign_stmt(A, St); stmt(#call_stmt{}=C, _, St) -> call_stmt(C, St); stmt(#return_stmt{}=R, _, St) -> return_stmt(R, St); stmt(#break_stmt{}=B, _, St) -> {B,St}; stmt(#block_stmt{}=B, _, St) -> block_stmt(B, St); stmt(#while_stmt{}=W, _, St) -> while_stmt(W, St); stmt(#repeat_stmt{}=R, _, St) -> repeat_stmt(R, St); stmt(#if_stmt{}=I, _, St) -> if_stmt(I, St); stmt(#nfor_stmt{}=F, _, St) -> numfor_stmt(F, St); stmt(#gfor_stmt{}=F, _, St) -> genfor_stmt(F, St); stmt(#local_assign_stmt{}=L, _, St) -> local_assign_stmt(L, St); stmt(#local_fdef_stmt{}=L, _, St) -> local_fdef_stmt(L, St); stmt(#expr_stmt{}=E, _, St) -> expr_stmt(E, St). %% assign_stmt(Assign, State) -> {Assign,State}. assign_stmt(#assign_stmt{vars=Vs0,exps=Es0}=A, St0) -> {Vs1,St1} = assign_loop(Vs0, St0), {Es1,St2} = explist(Es0, St1), {A#assign_stmt{vars=Vs1,exps=Es1},St2}. assign_loop([V0|Vs0], St0) -> {V1,St1} = var(V0, St0), {Vs1,St2} = assign_loop(Vs0, St1), {[V1|Vs1],St2}; assign_loop([], St) -> {[],St}. var(#dot{exp=Exp0,rest=Rest0}=D, St0) -> {Exp1,St1} = prefixexp_first(Exp0, St0), {Rest1,St2} = var_rest(Rest0, St1), {D#dot{exp=Exp1,rest=Rest1},St2}; var(#var{}=V0, St) -> V1 = get_var(V0, St), {V1,St}. var_rest(#dot{exp=Exp0,rest=Rest0}=D, St0) -> {Exp1,St1} = prefixexp_element(Exp0, St0), {Rest1,St2} = var_rest(Rest0, St1), {D#dot{exp=Exp1,rest=Rest1},St2}; var_rest(Exp, St) -> var_last(Exp, St). var_last(#key{key=Exp0}=K, St0) -> {Exp1,St1} = exp(Exp0, St0), {K#key{key=Exp1},St1}. %% call_stmt(Call, State) -> {Call,State}. call_stmt(#call_stmt{call=Exp0}=C, St0) -> {Exp1,St1} = exp(Exp0, St0), {C#call_stmt{call=Exp1},St1}. %% return_stmt(Return, State) -> {Return,State}. return_stmt(#return_stmt{exps=Es0}=R, St0) -> {Es1,St1} = explist(Es0, St0), {R#return_stmt{exps=Es1},St1}. %% block_stmt(Block, State) -> {Block,State}. block_stmt(#block_stmt{body=Ss0,vars=Vars}=B, St0) -> Do = fun(S) -> stmts(Ss0, S) end, {Ss1,Fr,St1} = with_block(Do, Vars, St0), Lsz = frame_local_size(Fr), Esz = frame_env_size(Fr), {B#block_stmt{body=Ss1,lsz=Lsz,esz=Esz},St1}. %% do_block(Block, State) -> {Block,State}. do_block(#block{body=Ss0,vars=Vars}=B, St0) -> Do = fun(S) -> stmts(Ss0, S) end, {Ss1,Fr,St1} = with_block(Do, Vars, St0), Lsz = frame_local_size(Fr), Esz = frame_env_size(Fr), {B#block{body=Ss1,lsz=Lsz,esz=Esz},St1}. %% with_block(Do, Vars, State) -> {Ret,State}. %% with_block(Do, Env, Vars, State) -> {Ret,State}. %% Do a block initialising/clearing frames. We always push a local %% frame even if it not used. with_block(Do, Vars, #c_env{vars=OldVars}=St0) -> St1 = alloc_frame(St0#c_env{vars=Vars}), {Ret,St2} = Do(St1), Fr = get_frame(St2), St3 = pop_frame(St2), {Ret,Fr,St3#c_env{vars=OldVars}}. %% while_stmt(While, State) -> {While,State}. while_stmt(#while_stmt{exp=E0,body=B0}=W, St0) -> {E1,St1} = exp(E0, St0), {B1,St2} = do_block(B0, St1), {W#while_stmt{exp=E1,body=B1},St2}. %% repeat_stmt(Repeat, State) -> {Repeat,State}. repeat_stmt(#repeat_stmt{body=B0}=R, St0) -> {B1,St1} = do_block(B0, St0), {R#repeat_stmt{body=B1},St1}. %% if_stmt(If, State) -> {If,State}. if_stmt(#if_stmt{tests=Ts0,else_block=E0}=I, St0) -> {Ts1,St1} = if_tests(Ts0, St0), {E1,St2} = do_block(E0, St1), {I#if_stmt{tests=Ts1,else_block=E1},St2}. if_tests([{E0,B0}|Ts0], St0) -> {E1,St1} = exp(E0, St0), {B1,St2} = do_block(B0, St1), {Ts1,St3} = if_tests(Ts0, St2), {[{E1,B1}|Ts1],St3}; if_tests([], St) -> {[],St}. %% numfor_stmt(For, State) -> {For,State}. numfor_stmt(#nfor_stmt{var=V0,init=I0,limit=L0,step=S0,body=B0}=F, St0) -> {[I1,L1,S1],St1} = explist([I0,L0,S0], St0), {[V1],B1,St2} = for_block([V0], B0, St1), {F#nfor_stmt{var=V1,init=I1,limit=L1,step=S1,body=B1},St2}. %% genfor_stmt(For, State) -> {For,State}. genfor_stmt(#gfor_stmt{vars=Vs0,gens=Gs0,body=B0}=F, St0) -> {Gs1,St1} = explist(Gs0, St0), {Vs1,B1,St2} = for_block(Vs0, B0, St1), {F#gfor_stmt{vars=Vs1,gens=Gs1,body=B1},St2}. for_block(Vs0, #block{body=Ss0,vars=Vars}=B, St0) -> Do = fun (S0) -> Fun = fun (V, Sa) -> Sb = add_var(V, Sa), {get_var(V, Sb),Sb} end, {Vs1,S1} = lists:mapfoldl(Fun, S0, Vs0), {Ss1,S2} = stmts(Ss0, S1), {{Vs1,Ss1},S2} end, {{Vs1,Ss1},Fr,St1} = with_block(Do, Vars, St0), Lsz = frame_local_size(Fr), Esz = frame_env_size(Fr), {Vs1,B#block{body=Ss1,lsz=Lsz,esz=Esz},St1}. %% local_assign_stmt(Local, State) -> {Local,State}. local_assign_stmt(#local_assign_stmt{vars=Vs0,exps=Es0}=L, St0) -> %% io:fwrite("las: ~p\n", [{Es0,St0}]), {Es1,St1} = explist(Es0, St0), %% io:fwrite("las> ~p\n", [{Es1,St1}]), AddVar = fun (V, S0) -> S1 = add_var(V, S0), {get_var(V, S1),S1} end, {Vs1,St2} = lists:mapfoldl(AddVar, St1, Vs0), %% io:fwrite("las> ~p\n", [{Vs1,St2}]), {L#local_assign_stmt{vars=Vs1,exps=Es1},St2}. %% local_fdef_stmt(Local, State) -> {Local,State}. %% Add function name first in case of recursive call. local_fdef_stmt(#local_fdef_stmt{var=V,func=F0}=L, St0) -> St1 = add_var(V, St0), {F1,St2} = functiondef(F0, St1), V1 = get_var(V, St2), %% io:fwrite("lf: ~p\n", [St0]), %% io:fwrite("lf: ~p\n", [St1]), %% io:fwrite("lf: ~p\n", [St2]), {L#local_fdef_stmt{var=V1,func=F1},St2}. %% expr_stmt(Expr, State) -> {Call,State}. %% The expression pseudo statement. This will return a single value. expr_stmt(#expr_stmt{exp=Exp0}=E, St0) -> {Exp1,St1} = exp(Exp0, St0), {E#expr_stmt{exp=Exp1},St1}. %% explist(Exprs, State) -> {Exprs,State}. %% exp(Expr, State) -> {Expr,State}. %% prefixexp(Expr, State) -> {Expr,State}. explist([E0|Es0], St0) -> {E1,St1} = exp(E0, St0), {Es1,St2} = explist(Es0, St1), {[E1|Es1],St2}; explist([], St) -> {[],St}. %No expressions at all exp(#lit{}=L, St) -> {L,St}; %Nothing to do exp(#fdef{}=F, St) -> functiondef(F, St); exp(#op{args=Es0}=Op, St0) -> {Es1,St1} = explist(Es0, St0), {Op#op{args=Es1},St1}; exp(#tabcon{fields=Fs0}=T, St0) -> {Fs1,St1} = tableconstructor(Fs0, St0), {T#tabcon{fields=Fs1},St1}; exp(E, St) -> prefixexp(E, St). prefixexp(#dot{exp=Exp0,rest=Rest0}=D, St0) -> {Exp1,St1} = prefixexp_first(Exp0, St0), {Rest1,St2} = prefixexp_rest(Rest0, St1), {D#dot{exp=Exp1,rest=Rest1},St2}; prefixexp(Exp, St) -> prefixexp_first(Exp, St). prefixexp_first(#single{exp=E0}=S, St0) -> {E1,St1} = exp(E0, St0), {S#single{exp=E1},St1}; prefixexp_first(#var{}=V0, St) -> V1 = get_var(V0, St), {V1,St}. prefixexp_rest(#dot{exp=Exp0,rest=Rest0}=D, St0) -> {Exp1,St1} = prefixexp_element(Exp0, St0), {Rest1,St2} = prefixexp_rest(Rest0, St1), {D#dot{exp=Exp1,rest=Rest1},St2}; prefixexp_rest(Exp, St) -> prefixexp_element(Exp, St). prefixexp_element(#key{key=E0}=K, St0) -> {E1,St1} = exp(E0, St0), {K#key{key=E1},St1}; prefixexp_element(#fcall{args=As0}=F, St0) -> {As1,St1} = explist(As0, St0), {F#fcall{args=As1},St1}; prefixexp_element(#mcall{args=As0}=M, St0) -> {As1,St1} = explist(As0, St0), {M#mcall{args=As1},St1}. %% functiondef(Func, State) -> {Func,State}. functiondef(#fdef{pars=Ps0,body=Ss0,vars=Vars}=F, St0) -> Do = fun (S0) -> Fun = fun (V, Sa) -> Sb = add_var(V, Sa), {get_var(V, Sb),Sb} end, {Ps1,S1} = lists:mapfoldl(Fun, S0, Ps0), {Ss1,S2} = stmts(Ss0, S1), {{Ps1,Ss1},S2} end, {{Ps1,Ss1},Fr,St1} = with_block(Do, Vars, St0), Lsz = frame_local_size(Fr), Esz = frame_env_size(Fr), {F#fdef{pars=Ps1,body=Ss1,lsz=Lsz,esz=Esz},St1}. %% tableconstructor(Fields, State) -> {Fields,State}. tableconstructor(Fs0, St0) -> Fun = fun (#efield{val=V0}=F, S0) -> {V1,S1} = exp(V0, S0), {F#efield{val=V1},S1}; (#kfield{key=K0,val=V0}=F, S0) -> {K1,S1} = exp(K0, S0), {V1,S2} = exp(V0, S1), {F#kfield{key=K1,val=V1},S2} end, {Fs1,St1} = lists:mapfoldl(Fun, St0, Fs0), {Fs1,St1}. rvirding-luerl-772b25e/src/Elixir.Luerl.erl0000664000232200023220000001747015114130670021206 0ustar debalancedebalance%% Copyright (c) 2013-2024 Robert Virding %% %% Licensed under the Apache License, Version 2.0 (the "License"); %% you may not use this file except in compliance with the License. %% You may obtain a copy of the License at %% %% http://www.apache.org/licenses/LICENSE-2.0 %% %% Unless required by applicable law or agreed to in writing, software %% distributed under the License is distributed on an "AS IS" BASIS, %% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. %% See the License for the specific language governing permissions and %% limitations under the License. %% File : luerl_ex.erl %% Authors : Cees de Groot %% Purpose : Elixir-style wrappers for luerl.erl %% This module just contains functions that forward to luerl.erl, but place %% the VM State arguments in the first position rather than the last. This %% better matches Elixir conventions and allows for using the Elixir pipe %% operator '|>' to chain Luerl function calls. -module('Elixir.Luerl'). -include("luerl.hrl"). ?MODULEDOC(""" Elixir API for Luerl, an implementation of Lua 5.3 written in Erlang. This module provides an idiomatic Elixir interface to the Luerl Lua interpreter with state as the first argument for better pipe operator usage. """). %% Basic user API to luerl. -export([init/0,gc/1, load/2,load/3,loadfile/2,loadfile/3, path_loadfile/2,path_loadfile/3,path_loadfile/4, load_module/3,load_module_dec/3, do/2,do_dec/2,do/3,do_dec/3, dofile/2,dofile/3,dofile_dec/2,dofile_dec/3, call/3,call_chunk/2,call_chunk/3, call_function/3,call_function_enc/3,call_function_dec/3, call_method/4,call_method_dec/4, get_table_keys/2,get_table_keys_dec/2, set_table_keys/3,set_table_keys_dec/3, get_table_key/3,set_table_key/4, get_stacktrace/1 ]). %% Tracing. -export([set_trace_func/2,clear_trace_func/1, set_trace_data/2,get_trace_data/1]). %% Encoding and decoding. -export([encode/2,encode_list/2,decode/2,decode_list/2]). %%Helping with storing VM state -export([externalize/1,internalize/1]). %% Storing and retrieving private data -export([put_private/3,get_private/2,delete_private/2]). ?DOC( #{equiv => luerl:init()} ). init() -> luerl:init(). ?DOC( #{equiv => luerl:gc(LuaState)} ). gc(LuaState) -> luerl:gc(LuaState). ?DOC( #{equiv => luerl:set_trace_func(Function, LuaState), group => <<"Trace Control functions">>} ). set_trace_func(LuaState, Function) -> luerl:set_trace_func(Function, LuaState). ?DOC( #{equiv => luerl:clear_trace_func(LuaState), group => <<"Trace Control functions">>} ). clear_trace_func(LuaState) -> luerl:clear_trace_func(LuaState). ?DOC( #{equiv => luerl:get_trace_func(LuaState), group => <<"Trace Control functions">>} ). get_trace_data(LuaState) -> luerl:get_trace_data(LuaState). ?DOC( #{equiv => luerl:set_trace_func(TraceData, LuaState), group => <<"Trace Control functions">>} ). set_trace_data(LuaState, TraceData) -> luerl:set_trace_data(TraceData, LuaState). ?DOC( #{equiv => luerl:load(Chunk, LuaState)} ). load(LuaState, Chunk) -> luerl:load(LuaState, Chunk). ?DOC( #{equiv => luerl:load(Chunk, CompileOptions, LuaState)} ). load(LuaState, Chunk, CompileOptions) -> luerl:load(Chunk, CompileOptions, LuaState). ?DOC( #{equiv => luerl:loadfile(FileName, LuaState)} ). loadfile(LuaState, FileName) -> luerl:loadfile(FileName, LuaState). ?DOC( #{equiv => luerl:loadfile(FileName, CompileOptions, LuaState)} ). loadfile(LuaState, FileName, CompileOptions) -> luerl:loadfile(FileName, CompileOptions, LuaState). ?DOC( #{equiv => luerl:path_loadfile(FileName, LuaState)} ). path_loadfile(LuaState, FileName) -> luerl:path_loadfile(FileName, LuaState). ?DOC( #{equiv => luerl:path_loadfile(Path, FileName, LuaState)} ). path_loadfile(LuaState, Path, FileName) -> luerl:path_loadfile(Path, FileName, LuaState). ?DOC( #{equiv => luerl:path_loadfile(Path, FileName, CompileOptions, LuaState)} ). path_loadfile(LuaState, Path, FileName, CompileOptions) -> luerl:path_loadfile(Path, FileName, CompileOptions, LuaState). ?DOC( #{equiv => luerl:load_module(KeyPath, ErlangModule, LuaState)} ). load_module(LuaState, KeyPath, ErlangModule) -> luerl:load_module(KeyPath, ErlangModule, LuaState). ?DOC( #{equiv => luerl:load_module_dec(KeyPath, ErlangModule, LuaState)} ). load_module_dec(LuaState, KeyPath, ErlangModule) -> luerl:load_module_dec(KeyPath, ErlangModule, LuaState). do(St, S) -> luerl:do(S, St). do(St, S, Opts) -> luerl:do(S, Opts, St). do_dec(St, S) -> luerl:do_dec(S, St). do_dec(St, S, Opts) -> luerl:do_dec(S, Opts, St). dofile(St, Path) -> luerl:dofile(Path, St). dofile(St, Path, Opts) -> luerl:dofile(Path, Opts, St). dofile_dec(St, Path) -> luerl:dofile_dec(Path, St). dofile_dec(St, Path, Opts) -> luerl:dofile_dec(Path, Opts, St). call(St, C, Args) -> luerl:call(C, Args, St). call_chunk(St, C) -> luerl:call_chunk(C, St). call_chunk(St, C, Args) -> luerl:call_chunk(C, Args, St). call_function(St, Fp, Args) -> luerl:call_function(Fp, Args, St). call_function_enc(St, Dfunc, Dargs) -> luerl:call_function_enc(Dfunc, Dargs, St). call_function_dec(St, Dfunc, Dargs) -> luerl:call_function_dec(Dfunc, Dargs, St). call_method(St, Obj, Meth, Args) -> luerl:call_method(Obj, Meth, Args, St). call_method_dec(St, Dobj, Dmeth, Dargs) -> luerl:call_method_dec(Dobj, Dmeth, Dargs, St). get_table_keys(St, Keys) -> luerl:get_table_keys(Keys, St). get_table_keys_dec(St, Dkeys) -> luerl:get_table_keys_dec(Dkeys, St). set_table_keys(St, Keys, Val) -> luerl:set_table_keys(Keys, Val, St). set_table_keys_dec(St, Dkeys, Dval) -> luerl:set_table_keys_dec(Dkeys, Dval, St). get_table_key(St, Tab, Key) -> luerl:get_table_key(Tab, Key, St). set_table_key(St, Tab, Key, Val) -> luerl:set_table_key(Tab, Key, Val, St). get_stacktrace(St) -> luerl:get_stacktrace(St). ?DOC( """ encode(luastate, term) Equivalent to `:luerl.encode(term, luastate)`. """). ?DOC( #{group => <<"Encode/Decode Date functions">>} ). encode(LuaState, Term) -> luerl:encode(Term, LuaState). ?DOC( #{equiv => luerl:encode_list(Terms, LuaState), group => <<"Encode/Decode Date functions">>} ). encode_list(LuaState, Terms) -> luerl:encode_list(Terms, LuaState). ?DOC( #{equiv => luerl:decode(LuerlTerm, LuaState), group => <<"Encode/Decode Date functions">>} ). decode(LuaState, LuerlTerm) -> luerl:decode(LuerlTerm, LuaState). ?DOC( #{equiv => luerl:decode_list(LuerlTerms, LuaState), group => <<"Encode/Decode Date functions">>} ). decode_list(LuaState, LuerlTerms) -> luerl:decode_list(LuerlTerms, LuaState). externalize(St) -> luerl:externalize(St). internalize(St) -> luerl:internalize(St). ?DOC( """ Puts a private `Value` under `Key` that is not exposed to the runtime. """). ?DOC( #{group => <<"Private Data functions">>} ). -spec put_private(LuaState, Key, Value) -> LuaState when Key :: term(), Value :: term(), LuaState :: luerlstate(). put_private(St, K, V) -> luerl:put_private(K, V, St). ?DOC( """ Get the private value for `Key`. """). ?DOC( #{group => <<"Private Data functions">>} ). -spec get_private(LuaState, Key) -> Value when Key :: term(), Value :: term(), LuaState :: luerlstate(). get_private(St, Key) -> try {ok, maps:get(Key, St#luerl.private)} catch error:{badkey, _} -> error end. ?DOC( """ Delete the private value for `Key`. """). ?DOC( #{group => <<"Private Data functions">>} ). -spec delete_private(LuaState, Key) -> LuaState when Key :: term(), LuaState :: luerlstate(). delete_private(St, K) -> try luerl:delete_private(K, St) catch error:{badkey, _} -> St end. rvirding-luerl-772b25e/src/luerl_comp_peep.erl0000664000232200023220000000723715114130670022042 0ustar debalancedebalance%% Copyright (c) 2013-2019 Robert Virding %% %% Licensed under the Apache License, Version 2.0 (the "License"); %% you may not use this file except in compliance with the License. %% You may obtain a copy of the License at %% %% http://www.apache.org/licenses/LICENSE-2.0 %% %% Unless required by applicable law or agreed to in writing, software %% distributed under the License is distributed on an "AS IS" BASIS, %% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. %% See the License for the specific language governing permissions and %% limitations under the License. %% File : luerl_comp_peep.erl %% Author : Robert Virding %% Purpose : A basic LUA 5.3 compiler for Luerl. %% Does peep-hole optimisation in the compiler. -module(luerl_comp_peep). -include("luerl.hrl"). -include("luerl_comp.hrl"). -include("luerl_instrs.hrl"). ?MODULEDOC(false). -export([chunk/2]). %% chunk(Code, CompInfo) -> {ok,Code}. %% A chunk is now a list of instructions to define the function. chunk(Is0, #cinfo{opts=Opts}=_Ci) -> Is1 = instrs(Is0, nil), %No local state luerl_comp:debug_print(Opts, "cp: ~p\n", [Is1]), {ok,Is1}. %% Combining instructions. instrs([?PUSH_LIT(L),?GET_KEY|Is], St) -> instrs([?GET_LIT_KEY(L)|Is], St); instrs([?PUSH_LIT(L),?SET_KEY|Is], St) -> instrs([?SET_LIT_KEY(L)|Is], St); %% Must check these properly, probably seldom used anyway. %% instrs([?STORE_EVAR(D, I),?PUSH_EVAR(D, I)|Is], St) -> %% instrs([?DUP,?STORE_EVAR(D, I)|Is], St); %% instrs([?STORE_LVAR(D, I),?PUSH_LVAR(D, I)|Is], St) -> %% instrs([?DUP,?STORE_LVAR(D, I)|Is], St); %% instrs([?STORE_GVAR(K),?PUSH_GVAR(K)|Is], St) -> %% instrs([?DUP,?STORE_EVAR(D, I)|Is], St); instrs([?PUSH_LIT(L),?MULTIPLE|Is], St) -> instrs([?PUSH_LAST_LIT(L)|Is], St); instrs([?PUSH_LVAR(D, I),?MULTIPLE|Is], St) -> instrs([?PUSH_LAST_LVAR(D, I)|Is], St); instrs([?PUSH_EVAR(D, I),?MULTIPLE|Is], St) -> instrs([?PUSH_LAST_EVAR(D, I)|Is], St); instrs([?PUSH_GVAR(K),?MULTIPLE|Is], St) -> instrs([?PUSH_LAST_GVAR(K)|Is], St); instrs([?POP,?POP|Is], St) -> instrs([?POP2|Is], St); %% Doing sub instructions. instrs([?PUSH_FDEF(Anno,Lsz,Esz,Pars,Fis0)|Is], St) -> Fis1 = instrs(Fis0, St), [?PUSH_FDEF(Anno,Lsz,Esz,Pars,Fis1)|instrs(Is, St)]; instrs([?BLOCK(Lsz,Esz,Bis0)|Is], St) -> Bis1 = instrs(Bis0, St), [?BLOCK(Lsz,Esz,Bis1)|instrs(Is, St)]; instrs([?REPEAT(Ris0)|Is], St) -> Ris1 = instrs(Ris0, St), [?REPEAT(Ris1)|instrs(Is, St)]; instrs([?WHILE(Eis0, Wis0)|Is], St) -> Eis1 = instrs(Eis0, St), Wis1 = instrs(Wis0, St), [?WHILE(Eis1, Wis1)|instrs(Is, St)]; instrs([?AND_THEN(Tis0)|Is], St) -> Tis1 = instrs(Tis0, St), [?AND_THEN(Tis1)|instrs(Is, St)]; instrs([?OR_ELSE(Fis0)|Is], St) -> Fis1 = instrs(Fis0, St), [?OR_ELSE(Fis1)|instrs(Is, St)]; instrs([?IF_TRUE(Tis0)|Is], St) -> Tis1 = instrs(Tis0, St), [?IF_TRUE(Tis1)|instrs(Is, St)]; instrs([?IF(Tis, [])|Is], St) -> instrs([?IF_TRUE(Tis)|Is], St); instrs([?IF(Tis0, Fis0)|Is], St) -> Tis1 = instrs(Tis0, St), Fis1 = instrs(Fis0, St), [?IF(Tis1, Fis1)|instrs(Is, St)]; instrs([?NFOR(V, Fis0)|Is], St) -> Fis1 = instrs(Fis0, St), [?NFOR(V, Fis1)|instrs(Is, St)]; instrs([?GFOR(Vs, Fis0)|Is], St) -> Fis1 = instrs(Fis0, St), [?GFOR(Vs, Fis1)|instrs(Is, St)]; %% Tail calls for when they are implemented in the VM. %% instrs([?FCALL,?POP], _St) -> [?TAIL_FCALL]; %% instrs([?FCALL,?RETURN(_)|_], _St) -> [?TAIL_FCALL]; %% instrs([?MCALL(M),?POP], _St) -> [?TAIL_MCALL(M)]; %% instrs([?MCALL(M),?RETURN(_)|_], _St) -> [?TAIL_MCALL(M)]; %% Nothing to do. instrs([I|Is], St) -> [I|instrs(Is, St)]; instrs([], _) -> []. rvirding-luerl-772b25e/src/luerl_lib_debug.erl0000664000232200023220000000456615114130670022011 0ustar debalancedebalance%% Copyright (c) 2015-2020 Robert Virding %% %% Licensed under the Apache License, Version 2.0 (the "License"); %% you may not use this file except in compliance with the License. %% You may obtain a copy of the License at %% %% http://www.apache.org/licenses/LICENSE-2.0 %% %% Unless required by applicable law or agreed to in writing, software %% distributed under the License is distributed on an "AS IS" BASIS, %% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. %% See the License for the specific language governing permissions and %% limitations under the License. %% File : luerl_lib_debug.erl %% Author : Robert Virding %% Purpose : The debug library for Luerl. %% This is a very rudimentary debug module which contains those %% functions which need no detailed information about the internals. -module(luerl_lib_debug). -include("luerl.hrl"). ?MODULEDOC(false). %% The basic entry point to set up the function table. -export([install/1,getmetatable/3,getuservalue/3,setmetatable/3,setuservalue/3]). -import(luerl_lib, [lua_error/2,badarg_error/3]). %Shorten this install(St) -> luerl_heap:alloc_table(table(), St). %% table() -> [{FuncName,Function}]. table() -> [{<<"getmetatable">>,#erl_mfa{m=?MODULE,f=getmetatable}}, {<<"getuservalue">>,#erl_mfa{m=?MODULE,f=getuservalue}}, {<<"setmetatable">>,#erl_mfa{m=?MODULE,f=setmetatable}}, {<<"setuservalue">>,#erl_mfa{m=?MODULE,f=setuservalue}} ]. %% getmetatable([Value|_], State) -> {[Table],State}. %% setmetatable([Table,Table|nil|_], State) -> {[Table],State}. %% Can set the metatable of all types here. Return tables for all %% values, for tables and userdata it is the table of the object, %% else the metatable for the type. getmetatable(_, [O|_], St) -> {[luerl_heap:get_metatable(O, St)],St}; getmetatable(_, As, St) -> badarg_error(getmetatable, As, St). setmetatable(_, [T,M|_], St0) -> St1 = luerl_heap:set_metatable(T, M, St0), {[T],St1}; setmetatable(_, As, St) -> badarg_error(setmetatable, As, St). %% getuservalue([User|_], State) -> {[Value],State}. %% setuservalue([User,Value|_], State) -> {[User],State}. %% These are basically no-ops. getuservalue(_, [_|_], St) -> {[nil],St}; getuservalue(_, As, St) -> badarg_error(getuservalue, As, St). setuservalue(_, [U,_|_], St) -> {[U],St}; setuservalue(_, As, St) -> badarg_error(setuservalue, As, St). rvirding-luerl-772b25e/src/ttsets.erl0000664000232200023220000002737215114130670020220 0ustar debalancedebalance%% Copyright (c) 2013 Robert Virding %% %% Licensed under the Apache License, Version 2.0 (the "License"); %% you may not use this file except in compliance with the License. %% You may obtain a copy of the License at %% %% http://www.apache.org/licenses/LICENSE-2.0 %% %% Unless required by applicable law or agreed to in writing, software %% distributed under the License is distributed on an "AS IS" BASIS, %% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. %% See the License for the specific language governing permissions and %% limitations under the License. %% File : ttsets.erl %% Author : Robert Virding %% Purpose : Set as a 2-3 tree. %% This implementation uses 2-3 trees. The description of the tree %% restructuring which is used comes from Prof. Lyn Turbak's notes for %% CS230 Data Structures at Wellesley College. -module(ttsets). -include("luerl.hrl"). ?MODULEDOC(false). %% Standard interface. -export([new/0,is_set/1,size/1,to_list/1,from_list/1]). -export([is_element/2,add_element/2,del_element/2]). -export([union/2,union/1,intersection/2,intersection/1]). -export([is_disjoint/2,subtract/2,is_subset/2]). -export([fold/3,filter/2]). %% Extended interface. -export([foreach/2]). -compile({no_auto_import,[size/1]}). %We mean our own size/1 -ifdef(DEBUG). -export([check_depth/1]). -endif. %% Data structure: %% - {Left,Element,Right} %% - {Left,Element,Middle,Element,Right} %% - empty %% %% The term order is an arithmetic total order, so we should not %% test exact equality for the keys. (If we do, then it becomes %% possible that neither `>', `<', nor `=:=' matches.) Testing '<' %% and '>' first is statistically better than testing for %% equality, and also allows us to skip the test completely in the %% remaining case. -type ttset() :: empty | {ttset(),any(),ttset()} | {ttset(),any(),ttset(),any(),ttset()}. -export_type([ttset/0]). -spec new() -> Set::ttset(). %% Return a new empty set. new() -> empty. %The empty set -spec is_set(Set::ttset()) -> boolean(). %% Return 'true' if Set is a set, else 'false'. is_set(empty) -> true; is_set({A,_,B}) -> is_set(A) andalso is_set(B); is_set({A,_,B,_,C}) -> is_set(A) andalso is_set(B) andalso is_set(C); is_set(_) -> false. -spec size(Set::ttset()) -> non_neg_integer(). %% Return the number of elements in Set. size(empty) -> 0; size({A,_,B}) -> size(A) + size(B) + 1; size({A,_,B,_,C}) -> size(A) + size(B) + size(C) + 2. -spec to_list(Set::ttset()) -> [Element::any()]. %% Return the elements in Set as a list. to_list(D) -> to_list(D, []). to_list(empty, Tail) -> Tail; to_list({A,X,B}, Tail) -> to_list(A, [X|to_list(B, Tail)]); to_list({A,X,B,Y,C}, Tail) -> to_list(A, [X|to_list(B, [Y|to_list(C, Tail)])]). -spec from_list([Element::any()]) -> Dict::ttset(). %% Build a set from the elements in list. from_list(List) -> lists:foldl(fun (E, S) -> add_element(E, S) end, new(), List). -spec is_element(Element::any(), Set::ttset()) -> boolean(). %% Return 'true' if Element is an element of Set, else 'false'. is_element(_, empty) -> false; is_element(E, {A,X,_}) when E < X -> is_element(E, A); is_element(E, {_,X,B}) when E > X -> is_element(E, B); is_element(_, {_,_,_}) -> true; is_element(E, {A,X,_,_,_}) when E < X -> is_element(E, A); is_element(E, {_,X,B,Y,C}) when E > X -> if E < Y -> is_element(E, B); %Middle E > Y -> is_element(E, C); %Right true -> true end; is_element(_, {_,_,_,_,_}) -> true. -spec add_element(Element::any(), Set::ttset()) -> Set::ttset(). %% Return Set with Element inserted in it. add_element(E, T) -> %% Store and check for a returned "Up" node. case add_aux(E, T) of {up,Lu,Eu,Ru} -> {Lu,Eu,Ru}; Node -> Node end. add_aux(E, empty) -> {up,empty,E,empty}; %"Up" node add_aux(E, {empty,X,empty}=N) -> %% Special case to avoid creating temporary "up" nodes. %% It helps a little bit, but not much. if E < X -> {empty,E,empty,X,empty}; E > X -> {empty,X,empty,E,empty}; true -> N end; add_aux(E, {A,X,B}=N) -> if E < X -> %Down the left add_up2_l(add_aux(E, A), X, B); E > X -> %Down the right add_up2_r(A, X, add_aux(E, B)); true -> N %Replace current value end; add_aux(E, {A,X,B,Y,C}) when E < X -> add_up3_l(add_aux(E, A), X, B, Y, C); add_aux(E, {A,X,B,Y,C}=N) when E > X -> if E < Y -> %Down the middle add_up3_m(A, X, add_aux(E, B), Y, C); E > Y -> %Down the right add_up3_r(A, X, B, Y, add_aux(E, C)); true -> N end; add_aux(_, {_,_,_,_,_}=N) -> N. %% add_up2_l/r(L, X, R) -> {L,X,M,X,R} | {L,X,R}. add_up2_l({up,Lu,X,Ru}, Y, R) -> {Lu,X,Ru,Y,R}; add_up2_l(L, X, R) -> {L,X,R}. add_up2_r(L, X, {up,Lu,Y,Ru}) -> {L,X,Lu,Y,Ru}; add_up2_r(L, X, R) -> {L,X,R}. %% add_up3_l/m/r(L, X, M, Y, R) -> %% {up,L,X,R} | {L,X,M,Y,R}. add_up3_l({up,Lu,X,Ru}, Y, M, Z, R) -> {up,{Lu,X,Ru},Y,{M,Z,R}}; add_up3_l(L, X, M, Y, R) -> {L,X,M,Y,R}. add_up3_m(L, X, {up,Lu,Y,Ru}, Z, R) -> {up,{L,X,Lu},Y,{Ru,Z,R}}; add_up3_m(L, X, M, Y, R) -> {L,X,M,Y,R}. add_up3_r(L, X, M, Y, {up,Lu,Z,Ru}) -> {up,{L,X,M},Y,{Lu,Z,Ru}}; add_up3_r(L, X, M, Y, R) -> {L,X,M,Y,R}. -spec del_element(Element::any(), Set::ttset()) -> Set::ttset(). %% Return Set but with Element removed. del_element(E, T) -> case del_aux(E, T) of {up,T1} -> T1; T1 -> T1 end. del_aux(_, empty) -> empty; %No element del_aux(E, {empty,X,empty}=N) -> if E < X; E > X -> N; %No element true -> {up,empty} end; del_aux(E, {A,X,B}) -> if E < X -> %Down the left del_up2_l(del_aux(E, A), X, B); E > X -> %Down the right del_up2_r(A, X, del_aux(E, B)); true -> {Bm,B1}= del_min(B), del_up2_r(A, Bm, B1) end; del_aux(E, {empty,X,empty,Y,empty}=N) -> if E < X -> N; %No element E > X -> if E < Y -> N; %No element E > Y -> N; true -> {empty,X,empty} end; true -> {empty,Y,empty} end; del_aux(E, {A,X,B,Y,C}) when E < X -> del_up3_l(del_aux(E, A), X, B, Y, C); del_aux(E, {A,X,B,Y,C}) when E > X -> if E < Y -> del_up3_m(A, X, del_aux(E, B), Y, C); E > Y -> del_up3_r(A, X, B, Y, del_aux(E, C)); true -> {Cm,C1} = del_min(C), del_up3_r(A, X, B, Cm, C1) end; del_aux(_, {A,_,B,Y,C}) -> {Bm,B1} = del_min(B), del_up3_m(A, Bm, B1, Y, C). del_min(T) -> %%io:format("em: ~p\n-> ~p\n", [T,T1]), del_min1(T). del_min1({empty,X,empty}) -> {X,{up,empty}}; del_min1({A,X,B}) -> {Min,A1} = del_min1(A), {Min,del_up2_l(A1, X, B)}; del_min1({empty,X,empty,Y,empty}) -> {X,{empty,Y,empty}}; del_min1({A,X,B,Y,C}) -> {Min,A1} = del_min1(A), {Min,del_up3_l(A1, X, B, Y, C)}. %% del_up2_l/r(L, X, R) -> Node | {up,Node}. %% We use the same naming of nodes and keys as in the text. It makes %% checking the rules easier. del_up2_l({up,L}, X, {M,Y,R}) -> %1.1 {up,{L,X,M,Y,R}}; del_up2_l({up,A}, X, {B,Y,C,Z,D}) -> %2.1 {{A,X,B},Y,{C,Z,D}}; del_up2_l(L, X, R) -> {L,X,R}. del_up2_r({L,X,M}, Y, {up,R}) -> %1.2 {up,{L,X,M,Y,R}}; del_up2_r({A,X,B,Y,C}, Z, {up,D}) -> %2.2 {{A,X,B},Y,{C,Z,D}}; del_up2_r(L, X, R) -> {L,X,R}. %% del_up2_r(L, X, {up,R}) -> del_up2_r1(L, X, R); %% del_up2_r(L, X, R) -> {L,K,V,R}. %% del_up2_r1({L,X,M}, Y, R) -> %1.2 %% {up,{L,X,M,Y,R}}; %% del_up2_r1({A,X,B,Y,C}, Z, D) -> %2.2 %% {{A,X,B},Y,{C,Z,D}}. %% del_up3_l/m/r(L, X, M, Y, R) -> Node | {up,Node}. %% We use the same naming of nodes and keys as in the text. It makes %% checking the rules easier. N.B. there are alternate valid choices %% for the middle case! del_up3_l({up,A}, X, {B,Y,C}, Z, D) -> %3a.1 {{A,X,B,Y,C},Z,D}; del_up3_l({up,A}, W, {B,X,C,Y,D}, Z, E) -> %4a.1 {{A,W,B},X,{C,Y,D},Z,E}; del_up3_l(A, X, B, Y, C) -> {A,X,B,Y,C}. del_up3_m({A,X,B}, Y, {up,C}, Z, D) -> %3a.2 {{A,X,B,Y,C},Z,D}; del_up3_m(A, X, {up,B}, Y, {C,Z,D}) -> %3b.1 {A,X,{B,Y,C,Z,D}}; del_up3_m({A,W,B,X,C}, Y, {up,D}, Z, E) -> %4a.2 {{A,W,B},X,{C,Y,D},Z,E}; del_up3_m(A, W, {up,B}, X, {C,Y,D,Z,E}) -> %4b.1 {A,W,{B,X,C},Y,{D,Z,E}}; del_up3_m(A, X, B, Y, C) -> {A,X,B,Y,C}. del_up3_r(A, X, {B,Y,C}, Z, {up,D}) -> %3b.2 {A,X,{B,Y,C,Z,D}}; del_up3_r(A, W, {B,X,C,Y,D}, Z, {up,E}) -> %4b.2 {A,W,{B,X,C},Y,{D,Z,E}}; del_up3_r(A, X, B, Y, C) -> {A,X,B,Y,C}. -spec union(Set1::ttset(), Set2::ttset()) -> Set::ttset(). %% Return the union of Set1 and Set2. union(S1, S2) -> fold(fun (E, S) -> add_element(E, S) end, S2, S1). -spec union(Sets::[ttset()]) -> Set::ttset(). %% Return the union of the list of sets. union([S1,S2|Ss]) -> %% Do our own unions here to try and fold over smaller set. U0 = union(Ss), U1 = fold(fun (E, S) -> add_element(E, S) end, U0, S2), fold(fun (E, S) -> add_element(E, S) end, U1, S1); union([S]) -> S; union([]) -> empty. -spec intersection(Set1::ttset(), Set2::ttset()) -> Set::ttset(). %% Return the intersection of Set1 and Set2. intersection(S1, S2) -> filter(fun (E) -> is_element(E, S1) end, S2). -spec intersection(Sets::[ttset()]) -> Set::ttset(). %% Return the intersection of the list of sets. intersection([S]) -> S; intersection([S|Ss]) -> lists:foldl(fun (S1, I) -> intersection(S1, I) end, S, Ss). -spec is_disjoint(Set1::ttset(), Set2::ttset()) -> boolean(). %% Check whether Set1 and Set2 are disjoint. is_disjoint(S1, S2) -> fold(fun (E, Dis) -> Dis andalso (not is_element(E, S2)) end, true, S1). -spec subtract(Set1::ttset(), Set2::ttset()) -> Set::ttset(). %% Return all and only the elements in Set1 which are not elements of Set2. subtract(S1, S2) -> filter(fun (E) -> not is_element(E, S2) end, S1). -spec is_subset(Set1::ttset(), Set2::ttset()) -> boolean(). %% Return 'true' when every element of Set1 is also an element of %% Set2, else 'false'. is_subset(S1, S2) -> fold(fun (E, Sub) -> Sub andalso is_element(E, S2) end, true, S1). -spec fold(Fun::fun(), Acc::any(), Set::ttset()) -> any(). %% Apply Fun to each element in Set. Do it left to right, even if %% this is not specified. fold(_, Acc, empty) -> Acc; fold(F, Acc0, {A,X,B}) -> Acc1 = F(X, fold(F, Acc0, A)), fold(F, Acc1, B); fold(F, Acc0, {A,X,B,Y,C}) -> Acc1 = F(X, fold(F, Acc0, A)), Acc2 = F(Y, fold(F, Acc1, B)), fold(F, Acc2, C). -spec filter(Fun::fun(), Set::ttset()) -> Set::ttset(). %% Apply Fun to each element in Dict. Do it left to right, even if %% this is not specified. filter(F, S) -> filter(F, S, new()). filter(_, empty, New) -> New; filter(F, {A,X,B}, New0) -> New1 = filter(F, A, New0), New2 = case F(X) of true -> add_element(X, New1); false -> New1 end, filter(F, B, New2); filter(F, {A,X,B,Y,C}, New0) -> New1 = filter(F, A, New0), New2 = case F(X) of true -> add_element(X, New1); false -> New1 end, New3 = filter(F, B, New2), New4 = case F(Y) of true -> add_element(Y, New3); false -> New3 end, filter(F, C, New4). %% Extended interface. -spec foreach(Fun::fun(), Set::ttset()) -> ok. %% Apply Fun to each element in Set. Do it left to right, even if %% this is not specified. foreach(_, empty) -> ok; foreach(F, {A,X,B}) -> foreach(F, A), F(X), foreach(F, B); foreach(F, {A,X,B,Y,C}) -> foreach(F, A), F(X), foreach(F, B), F(Y), foreach(F, C). -ifdef(DEBUG). %% Check the depth of all the leaves, should all be the same. check_depth(T) -> check_depth(T, 1, orddict:new()). check_depth(empty, D, Dd) -> orddict:update_counter(D, 1, Dd); check_depth({L,_,R}, D, Dd0) -> Dd1 = orddict:update_counter(two, 1, Dd0), Dd2 = check_depth(L, D+1, Dd1), check_depth(R, D+1, Dd2); check_depth({L,_,M,_,R}, D, Dd0) -> Dd1 = orddict:update_counter(three, 1, Dd0), Dd2 = check_depth(L, D+1, Dd1), Dd3 = check_depth(M, D+1, Dd2), check_depth(R, D+1, Dd3). -endif. rvirding-luerl-772b25e/priv/0000775000232200023220000000000015114130670016344 5ustar debalancedebalancervirding-luerl-772b25e/priv/images/0000775000232200023220000000000015114130670017611 5ustar debalancedebalancervirding-luerl-772b25e/priv/images/logo.png0000664000232200023220000005462015114130670021266 0ustar debalancedebalance‰PNG  IHDRúúˆìZ=sRGB®Îé¤eXIfMM*V^(2f‡izHH2024:01:19 08:49:32  ú úìUج pHYs  šœiTXtXML:com.adobe.xmp 1 250 250 250 2 250 1 72 72 LuErl-Logo-14 2024-01-19T08:49:32-06:00 2024-01-19T08:49:32-06:00 Affinity Designer 1.10.8 produced 2024-01-19T08:49:32-06:00 sRGB IEC61966-2.1 3 j'=@IDATxí]|ÅÕ{Eí¤“ÕlYÍ–{ÇÆ\ä5”Ðùhb›ùò™Áà$@HB $š±q‘Ü{ï–muÉVïåÊ~ï�|ÒÝiwnï´wº“f~?év§Ï÷í¼yóÞ8ŽG€#Ààp8ŽG€#Ààp8ŽG€#Ààp8ŽG€#Ààp8ŽG€#Ààp8ŽG€#Ààp8ŽG€#Ààp8ŽG€#Ààp8ŽG€#Ààp8ŽG€#Ààpº ¡ËZæ w�þ÷„YÀ8È â0Aú "EAˆ0ZE1®ã£E¼£±AüÅTð¯¯[E¡c¬õ˜Ø¢Ø €P8 `ÍÌ–Óy›ÿRÙéó º Nè]½â†…Äé âõ&‚ÿ�¨†aiúKÇ?=C$tá4¶Ÿ�-žÖˆô³C›à@öŽ5ŠGÃ3v þzIºdpAÙhÆb]2”OQ3[ÅÙHTã8bx,VÄýøÚ, ÖMz°lÎÉ|»$€ûÛ#»Æ ½ËûbMÊôÊQ¢ÖŠ„-ÌÁîÌÄ¿¨.ïV§: fákDë&„M—gcub§ªä…;…'ôNÁç]á”Ù�'ƒÅr‚?ßþYXK‚w5M©bäL¾BåßùYq[£8€"À ÝOh÷¹ì×}Sóu(,»AŸ‹ÍöTì ‘sùܪ±þ»0sÅÄ�Ïô~x{êËæh© dËg•O­6â¾ #"ýÔp°4“‹ß»ÿh4â¿ó6,ß‹�æDï£'Ç ÝÀ¦d<>H-waÕw"Àý}Є¢*5¸g¦þE†éÀ¡½Vc£&«7ΰúkh´@Ai-´˜º”£>�Ûzïi¬æwùVž¢ÇëQ&NèÁÅÊL³wåõ‚ñRVN5Òb£B`Ì Xš É Q�˜ ɽ�Ð;Öz�ÿ´ C¢Á}9úuDœK˪¡¨¬Ε×ãu”ã}Yu#Þ7@Þ¹:Èί�Ƴ»ª:›NûûïkEËÒÜ�ožíle¼|+œÐ;û&Üt“6µ´ïM¢(þ_Б�­Îµ|œ1¦�ééÉFHŒ7@ßø(A§õ�†°­kvŸÞ›-V8WÑÅeõp*¯öŸ8Û—ÀÙâZœŒUo·íàKQ#,)ذŒÖò®œ6È&gfîA‰5õ-ðÕ†SðæӰûD˜Ì^oí5áóùs‹`~µ4ómµÖÝîIpB—z¤$I?ŸôZj½ŒÉhÚéy˜4,îºrÌš4Œ‘¡žWЃJì9~Þ6Ë¿ù TÖ¶x;ò"Q~[¸1æc¾~ï!'tL’3+ˆÖw0z’K’¢ÛYãúÀ�ó‡Áô é¸ý¥ST†gjE ®Á_ež‚/×�‚½'J½…e—F£½7oÃG¼­ ;–ã„~á©&d<ÚŨ‡ýFy´AM»_WOM�Û.SǦ�V�‚Jw|™ÔÓÜŸõÃ]° ·ë¼Ø£o¾<]�µüMüEΞNèø\¶Ñ,žæÉ+Aþ‹¹á–ˆÂÅÓ<)Êó*DàëÌÓ°ì³=�]à•o‹u‚ù^nßs-¨Z_3ÛZ<ñyÜ›¥=qÅAƒ¥÷_= nš7†¥ww SŰø,cs‹Þýúüý›Ã¨šK“µG¡ ¹´ûò7.ûÆ£RÝ,s��Ñû\òËÞz]È¿ÐX”œ=(ã†ÄËM†1Cû*.Ã3ªƒéâ/ùx|�ûñMHüžÔx§%Dÿä¹5¯¡.}Ï =’Гg>6Uëçø¸“•>ò°P-¼øÀD¸nÎpÕ{´„WÚϧÒ¼ûÓ»`ýî\¿{´?‰ÜØmh»GaSÝ&[O#t!e悸bY‚OP±HüÆ™éðäã!µoÏTr Ô·}Ãî|xõ£ÝpØ3m;3~~U¸qÉdzLè1„~Aªþ7\¯Ý¢ôé&'à•G§ÀLÜ*ã!0 vþîÅ«áÈÙrôÎåÑìþjAVìo{Êž{� ô~3n¬_â`‡+y]IØöÄ­càžŸ��è¨0%Ex?#@J6ÿ^}öÉ…^áV|Np¼Ø¹çÐU½Â€ïÃçb‹öî‚mo4*,´Ùº=¡§Î\0¥êßáR¤áÖ»W¼óLL•´µ»v¼±Ù +3³áÛ Ç¡ºª¢Ã�__ }¡C¢`Óá OöÞ·ZýµE™Kʺ+n4.g¤ºÙHSg,¸ ÍI¿Æa…+ÚŒq‰ðç…3 )AÑ7AI•<� TÕ6û+ÂO[Žƒ1Ä î�Æ(Ø~ª*j”ªÓâ¡¢p%º¥>¥Bw²ŠnKè)3^�ˆ†!J�âÖÑððÍã¹Úª°ü”‡ _Þýê ü°ñ(Ä„[À‡:!z=Tµ„ÂÞìj¥½-G Ãëò2—mVZ ˜òuKBOÉXtònÿÄáv,·ÍÞ~jÌ™20˜ž[·îk-ø{¨ ó}ÖQèê~g� ëöW*õxÓ‚ÂÚ»P¹æß¬:ƒ1­Û:®ÉÆ59ÙŽ» £ÄÀŠ_gÀ ´8·yyß#Ðb²À;_‚¯×†èP„*Þe÷Íh4†ÃèØ²Y‘’ ®öà¶üÌåÄ v›Ð­÷ÈŸB±Ã«JžÎ—‚ßÞ;MH¹T] ^¾Î³i!¼ø·­ ·ÔBT˜ú¯ed¤vžnRºnGëxñ†¢¬ßúzÜþª_}DýÕsçv„䋞òÄê><~ËhXtûDÐ’”–‡.E€öÁŸÿÛv8pä,ôŃžÉPÈW!<,NœÑuµ¢Ý´fQWnX¾ÎWýñg½>„ÕÃH�¹ðYT•x^I‹¿¿g†Ê'Õâ ÏfK®!"À*¦C*ÿdz³ cb:+Oó1kwæÁïÞÚIQ&cò^>îˆLõ¢Þ[Ž*aãá4´h'¡n¼¢/ƒLs]�ó]p…”©�‡ëõ!ÿÅ^3‰œfò�Ÿ›Ã‰¼ ¯mÅ_ýp7ünùZè˜DNð¦Z˜4L‘ ò@Ð[?D‹· £·šc]øžH4½XcÐð)jè_&‘èµâ‰i0oê §8~ã?Ê«›à�‚‡OCJ¬o·ÍÔ•L %ÍìêÕ¿©¥6wÇ&vÆÀJ ª/SÊÌŠ—‘Èotáoï ×Îæ.O÷dBzÝ“+¡®¢zƒcuHžj¢´�0ª”[T_HÊX0×mÆÊOKÎXtµ Šn5•HãíÅGgpe˜.zÉ>øî(¬øt¤Ç£ Ÿ šFZÓiµPT' ÜúR& â¸ÂÌ]µGÍëž>gQ«U\�#3°FGf¦¯=–�>ÝTR’f5ÆÓ: ðgtÜø÷•»aP‚Ðå[g:§0‚ä ½"Дj̬R8KNM�¼ò£ÒÒLEJô¬Ê|� ß\ÁdÿŽ@0ý*I‹†åOÌ‚ˆ0EV©¾ÆµÇÕÿÜ{Ûáó÷ÃàÞš ×:4™Ì02Y‹&ËîæAaju|埃áa»I—�!uæ¢G°�±: Ÿ½x9$õŽfeãi>@€œ°>½b¬ßv$ü¡ "ö¡8yœ.q«?9ºß”ã5¹;Ž(«¹krô�|½Yë^„FÖÄŒ¶Ñ¾~e>Œ®Øss× Ý [5[¬°ðµL8t4Ç&Yï†C!Ôˆ®©Üî±×‹ËÅ…›ß:¨ì'xäÈÅ!HäŸ p²DN þß½ã9‘wÁÛEꬼ´Žï¾DN° ¦:”Ì Q6ƒ Ñ¾KÙé&CÀzuBåóØ8hÓÇ$ÂÜH…‘OÒšÌpºXÎÍ-€¤^ûn«2v«Õ é±"DÜx˜™-xu éƒ3YÀ¼-*ÒÓêpË-¡W(³”( ¿OÉxœ¹eV rb <:¤qxÇ&Û’²?pÝh•‡Ï«c!p¾¢îyn5¤õ2¤ÃVß}™f¶X`â@·\% •ßòe?<©[–°<©¤³yÑ2í*Ü´˜ËªçÿãÜ›²êàiÊ0ã6Úÿ¼ðDj Ò~Ö•÷$0sÖÔÔÀŃÝ:«¸,uÆ¢�0‚.'tÒ€CóÓ%,0$EÁu³¹}9 #µÓÈ­ä\Äw�—VµÇâ«úbÃZ€8MfÄg™é~JìrB¯Ž/ÿ%Ž•é¹ñ¹&¢UZ:óÓCòw3ÛÃßìVF*¾À°©©¦�dÏêÄ©&Ï|lª/Ú÷¤Î.%tšÍqÏü7¬Ͼ8 fNHgeái*"@>¾$ õ^›ráp[UC]5¤õaŸÊ�¨.ŸÕ»”Ыâ+nA$“äÐ$Ë´gî¦SUÜì[ÊUÀã=Fà™·¶€ÆRï“óÏ<îL T#SØ„ŽûïóS3~5¡+‡Ó•„Näû$kð÷]=†ìÃÊÂÓTD`ef6lØyRc»òµPq@~ªªs) lb·ŠB—Îê]öD“g-œ�Ïá"¹gA³ù}׎‘Kæñ*#Pp¾þð×­\)Æ+\E•Æ&tôƒ{MrÆcc½ª^…B]F肞`õÿž+‡@rŸhVž¦d�µhI&vÈ÷˽…´¾¶úÆ1]'€`µ*:í×Û>°Êu ¡“çìÔ•¬ŽÝ:�­°ðQ3íã�Á‰3ç O�¸fVsìjÕEkõ±ýÝ(Ñ «rÒU«MOêéBGÏ1ÌÙü²IÉ|mîÉSìDÞº,Á=óh¬ÁCç¨ÃY=1†­kÙœlçz _Úï„N®›±;wÊw àþkF²’yšŠ¼ñé^<ж ¡œÐ; «mVÀv;…(ß”4þA7Sg{Ò±¼ß ÝdÆnÈ~ö†÷ë“F§tì)�Q�œâøðû#Ð/Îï¯�êc ” êj!!Zöõ¦nFj ¡×û»¿þ~Âd¼r/k�‹nÚ®>8›ÕÁn”öÂû; �‚õn´8»Ñ�}>ò17Öͬ. ÂÝ>ïˆK~%ô䌓±ý4—>´ÝÆCñôÓþm÷üÂwl9P›öæv{玾CP¾f«©Oª‘_ aÊ\¤¿²­~%t�(Ü,žÒpËh0„ó“VX©‘FÛiÏÿm»�eg¼�j4Õ#ëhnn�‘ìÃQYLs‡?Áñ#¡/ÖàûÅ$ôŒñ©þ{�mëÓ5Ç¡ ¤’[¦ùð HŽa»‡FÁÝ]ؼü´¯rßüFèi•—`ße�S7$ÒSâT¯Î:]eé§ûp6÷Û;æÚ… ½'NHih¨¯C˜¼ðÑŽÇ�ùMÿÝo„Žþ°™³ùm—Œ×¥Ï2(ó}»é ÔÖ5@t8't%°ÙŒ®ž[B Q0‚1> ¬¡±PkŠg ~PÇdº?t„ê7¡›¿`�Ä“´›nÒÂy¸‰UdÊhY#6V1žæ!ï®<ÉÝüt!‘ÌÞd£“uQ0~T_¸iÞ0‘×vJlie#<¶d4V—B(ƒ‚Œ!VɺÛ"Eøz‹}2{ÕŠæ¶8]øeFO)Kœ†ýO”ä Ð?9V.™Ç«„ÀÖƒÅp*·œ¯Íxw^k ƒÁCÀ§/_ ‹ºFh'r*šïþþr0iØ>Þkëê 1–©ÿÛØ$mø<ø…ÐE«†ìÎeís9Û. ŽŠ ï®<ˆÛiÜe³¤¨ž Õ¦øýCðê™.ïÕÈ€�.šè–…™ÆV‚ÓXaŽ\ÔŒ÷¡ãV‚x«ÓSFËÊèXÅxšdTÁƽÐ'š¯Í¥`#"¯±`É“ó`Êè¾RY:ÄÍ¿t 4™Ù$¤[:”sŒÀf»¡§Î^0&‹Ü%£û@j_¶ß-G`øµw¼·ò0ŠÜ7» |µæXþÔe¸W¾„�,½FÇTw…††Fw*±Ì}ÐçöØìÏ‘ (žD[Íì5ÈÏgÑw€_"P^Ý+7dÛØv_¶¬u×›ôpÛU£apšgNLT(„„¸Wð”ÄtJ¡1µ„Ïô5v>'tAÓYƒŽÒL|‹À¿~<† SBìÛní´M––šwÌáU'£ ì�*íÁ&3Q#Îöªq ±{àAE²YE�•*†à?S9¡Ëb§RÂʬlHˆâksW8i]nÖáÕE®IŠïÃBåvöJL-Mm[sö8§_Ñ÷ëtŸ:�ŽŠê4(‡›Œ‹ûB8÷×ú—tvÚÄÅ8¡»¢[o…ž�g06Ã/:•WÅeõ®U€­ÕÜòÿžÇdßG]ðÓà®*¯ÓÝ�ÐëªÉüQ{©(Ê1}¬¬Œ®­ò¢Ž|ƒšp±Häþ0^iA6¸Â@�ëÖЄ…è¡©Ùu Mx Y3Dê-~é‡ãøå®Qq bc£á¢!4ɇæ <öúzÈË/…ˆHüçO×:ÍΤ§$ H ƒÂ²FÙ¬f‹8 ?“ÍÐÉŸºU´NgÍ##ùú¼“�Ï}ñï�Ð}Ͷ7š4`ÑFÀ˜a‰ðè-CR¼³—•&üìœân|jࢠ‹]ñà²Ïe¿¦ÏúÅrE. 1F¶Ö�\Y¯ 2`‰ÅC}Á¶Û´Èpïù—·L�çPMTŽÈ{J'v\7s,}jÔ¢r ÕÑ¡Á¬ƒ‡o’}5Ûºô·• R×®ðB�•·‡ÓÕ¸$A¥x¡Åd‚´ÞÌu:ʲûŒ}VqH³‰ö+¤?ñ˜0o·=Wð~t* z‚�NC­A ®×Q‹ìêé=îã�´XþôePoufñ=®ÈË}8L)kza«µ²¶Η×8}$EÐØôÜíÍî:Z `Un�Ò»W;Ëo¯Ãá7¼ïìRŸ…Ï‘ùŒB­"|‡ÀÁSePt¾÷pYRïÚ'výÑ[&°þʵÈ\[”Ú æM ¸¾÷g ."1>Šéê‰úóñG𠺧®éQ¸H:îö° Y{Cˆr|�áì±êDÝ0{Ýjÿ²[îLkV`z�Mgšâe;"°fG®mK�Øe5æ”q¼šÉ]ûñÈMcAÔ±-À\Ëtö¾¾E€ù—`VCËè »r‘ˆ�³¹n—”Õ:ÍøÎ¹;Þ…hÙk^ïXJ�ŸºU`z|¯®aÛÔ�-ðkÙq¸Ä'Î%D}$üæn÷Òj%éQajÚÅ©@¶ß~ ºp˜7¹?³¹`¶4uÜ ‹k§|ÚSonjbÖãšh±°%ôÐߌŽ‰ìŒ¢…¸.ˆs}Ôº7›­pàT)™²Ï[«oÑÀÏç"PV ½g"„²ªF É4+dŒOƒ«–•EÕ4cd8DF´³ßR•oÚW€ç¤9qC‹ㇷ¯ë×ïÊCµ:çRg‹ªÁԂʾcu×½^6—eцҬ¾Í]=ž¦û„6kØ[kÉ ž â4 ­†¶‘§xt‹ü»m3ººCÑâÞóX ½p îW=¾d=4ìÙ€zîkq'@*˜ÍíJ(RéjÅéô!�ܛͺo?T ¢ËÚ»9�Yûµuã'ä^4¢4ûÝ–IæÂíÇA°øÄÝ’O]­²ësŸ8Ï �uÄ�µ«T¬dfWFŸÊ¯‚ªZTËTùtTZI±íË>Ý-õ•n=×{G,±”¨¿82ĹÛn\‡Ûj¨×î´a0{bZ[Ôv÷ÏÛ â…Æ ï"X5>ñ6ãBE Ó$(®—çw¡Óqµ<´"° ÙöH\<2 ¯ ’¤QE;B¸NÙÒÉljbóIçM¨êë@2†þIî=È�¯éðÑ ƒ>±­ï,}”Ê«;š«*í?Ëš“ê1xµâ˜”L拞–”žÏèíh’Fz8R= Éq‡:kQºU�&¨J±ÄÛ9e_ñÙ:îY;eRᦿ%“F²Í¢šÌÆC’ú¤„v™Ò÷[Π֫÷„N’wV@É{{c¬Œ¦ùdFÇCÖ˜„âŶkF§u"­Йça¨e*Á�&©g¶MO]׳¬úHÓìôvcgÀr±¯O•€¯«É4�>ܹ-Ûwâg82¢]O]¢;6Üjj�œHÔ¡ÊïÝW·*«Ñ;¶ûh‘Wcul�Öè!z b)Í !÷äÖÝ'ktya\´=cGP¯ùŒîˆ†ôunq­íEt·…$]š+š[àèÙ §LshË �DÔ"ngÝÝè¶jÉßú‚[Çù_÷&´JÜÙôs2¯Òæ×α~Ao€kÑQ…­ŠÀÔä½α^ãKŒâvG+òàÚG„.ϺG{)æ3ºû§Jës_°íÔr¨Ö _o8éÔ‰ø^á�š‡Ç9Ewú&*2¬ƒñÇåSÓA&Ë(2ÛlB}ìQ{3óì:RŒÊœírÓø‘Im<~w zu�\-#�Ô!ûDŒ>™Ñ°õ ¤Ü"tß ˜Ž>v¶¬Cåo<9 ´á±PÓ¤u{à`‡Â2! wâRÂøP—ªR-jıíÞ‰Ð#v+Ln3Ä¡újp±è|µjº :­¼ ›óÉôûÝèf­$õ (ŽÏèrÈ´ÇçØXwæKÔžÙƒ+Ú½¬kÑ‚[h­JNí�r¿xì;Q ëvæÀÉœ ¨®kDã5œÑųš¶F$pÞü²÷‚ý«Õé¡÷…¹œåU m„Lãí“ÝVæ_?Co3ȶ3'b¹š;Æ7ˬÏ[s ê¬\šõ¡Ëò8M(Ðñ&0 �ï£Û -B­3šyÕ ä±Y ‡ø8#Ü?¤M Ô‘Èíí±OÅHé�I≻ÈÜ�_üt=¾z&©n–yGô8Ó;:Iâë¬á¸UŽëç:×¶³Þö¾Ùú#h�|½9¦Ñ5}¼jëÑïü……l½Y�ß0¶-Ûºg;x›iKôâ‚Iè¢È6ð¢=*¢âkáØÍÌðiK„2<ðÏ›ÀÖŒ“–`zÓN0—©Cõ/ƒ R"ð&\} ОºkR›ú§RlhÂïß×÷ül$¬ß•&”f{jëšlRpW¬¹ÁÊóøÒâÌZoÒBxd/xsÁL›ù裯¬…s…ùxhHÇ–4èûÀÑ×›k޳…5 ZQuîv¡á´rkýh‘²¡¾ýº»–òþ¾ÅÁ“l‡Z"BÅj¹}�såž=t;®ÝO¿n´ ³úìúÈéRørÝ ÉúŸ¼sÎ:�SÈÞ»¢¦ã‡rêè$t´8ñÄÀÎxЦ‰ÔFà‘À±ÏîØ]ÉÁºDš¼°L--xŒTu‡ÓM}çDxè¥ Ô¤àúYƒñC2ºÍHe:…x÷Ó Y¡?L¤ÃÕ``Ú�Û]üû�ÆŒ²±Î3cmÍ»�à‚‰uǯaÑ6¶�èöÓSB—{É©rµ©CG=ˆðLJH?9a$X­†ýR;©ÑŒk×è8xóñY�èÆGÕÿíÆ3ðÙê£x~Z-ZœµØŒQìtaŽMÛ6‰<üê\è Ù"<Ø'$†®à\5H¹M§4wÛröå…¨�‚Çooë�wýγmÓôâšftV°ë.ʳî4HšÑ= RÒ^{öÍ~ß¿Ìþ©´´�û˜ËÜÔŒS3cáK=ª™˜ ¯,šé´]æ”éÂÍÊ §àß±¥gh žE&•K½¸F‹n˜=Dq…ÇpKÏŒg�Kí@Ç’xai#W!z#jÝ=zûÅm*¾ßl<�»ƒêÎæÔ>K¨lëŸ` Ö]¡íjeC®%= r/9Õ„Π0µú';£#¡ÛNÁÍ„aËS‡/õ¥Ûü³Ûgd[‚Ë?ú>ý郰u÷itøˆÂ*YX—¦œnCÃ#`‚ƒke§D‰›¯ÖŸ@—ÞZk±ˆ�âÆ}TEM :¥ˆ‡+PûŽ�ûÓUGеõã)Ѥ×Q‚»L3º¨qú{3£³I¥Ó맇Y3ºZf´rUô!±:[é ¥ÊæP¸nÞh¸ïÚv]r©q“oöE¯­ƒâbôXƒþÞüÈ6ãÒ4'Y-M6í+‚1ƒã!FB…úpv©¬F ýÝù‰{ãÉÙ0´_»gâ¨%ר€æ¨>à\4<±E7™eŽ÷j]{(UÖ¬ˆ¬;˯g yÛó0ÈÍfT�Z3¦‡]rÊîŽC® b݉0‰‰bÍÐ f-L?Ð-‘aÝ÷Â*4%-ƒˆ¶#ƒ�†ë³:gýî«Û…päºiÁ«kál^1 �+žžãÔ6m7ÖÕ7 RŽStÛ� ÕAê䳂ëñÉù|îx¾¼dµaO³ˆ2½�AÔÀi{^5Ù’¯[ XEóQZëi`͘�@謢A® ?™ÿR+rÌ YpõŠ�Gv}’Û®¬øl/ÔVVà,©N¿Ý6x! áúÄGC¬‘D{­áÝ %EE6¿tý’:Ú{ü¸5¯­ö²ô«A‡R\€cÇkrå\V®ž^»cÝtÝÐŒƒdäþ‚‡Ð…AZsä³óq›Ýàeð¤�@èr³- S-Ö]NbkÁ=˨ 6RºDü-Z#¼ùô\æƒúz¦°Vo9…3¹gì:}Ëj[tФ1‚Yß ÄH £•é£4вâ‰;&¶e/8_O ‘ãÇ$„Á­— oK³_üdSO•ÿ ‚ÆéÃa/'÷»ô“=(½ï¨”$—ßÓøê& bD¸pÖÓ:•ä÷ ë^°í�Š”™‹PYQì-Õ‰=¨øái`ÎèrÓ˜§�t"¿Àà™Õú±ft:OŒº@³¢«hênÿúÞIe× ‘'qO/ËDåÚ‹Ô^ê›÷I@›ñkFÃ%%µ}Lˆ­~öíÍ�[p×»ìåÕÓëépœöKïo…𠮦 (T‹tê¹Í#kehÍ"D$tc¤2)"�‰~:�k²¹k™–”E—V³–bAöª(õT?ø„Ð[»)Ç_IB?|ºOW± ­¯rDY3¦Z„Ôx™ýSéC$×(ù\'ã³M¸ýͧ™62Ê3ñÔRwá£ï� �öª6-1wùIÐoÑGÃ[ÏÌElÙjbÁ)míÎ\xý£`ÔÖËʬ¡°øî)mMCó¼Â2ÛV�¶:u\R[šýb j´Y[ð£Äн"\X“„½.ú}û?û@gÅ-57¯¥MUØJ?`,Âu¬�ä'”U3èXÎ8—PïÎGkt[‰Ð%C ò—çðliO‚ÜKNu¨µö¤?®yY/“Z"ÖŒNý¡›fFÇPg �ÇoŸ(K`Žyé:>II »Œ0c|úÇk$‰Ü±Ž¹“úÁ‹¿Ê€ZsûÚÛ1Ý6›ÇÇÀˆôضè—ñ¬=ƒ¶•(LxÀá/.Ö–f¿øjÝI·K ½õW{]ôí8T€Ë{Œôo“Yíï_úJ¸íê P‡ªÃJCxX(*6É/3Pšê“õ9õÏg„Ž"e �.)먳Mñr�E诧Ҍ.Gèö]²ïŽkt" ˜˜h˜<ª¯¬mñu &¨®ÁÙLA .Á„kþwþ÷²6uQwÅ.ÚfM„j¦§Ëzdýÿðà¥mUì8\ ååU6µTŠŒ@¶=µ�³W‚4¯¸=O[a— Gw.IN·ÄAX\\=;eÀ›Fì{bR2|òâÕ0$-nž‹J=Z;áRÙųÒLð:ªÁc ÊõÄV^Jónj鮬tvÿX%•§Éº�c �œ£“Q2Tyô–V•Nw­¬F0+[›×¡Ðì�8C»[ó»¶ùÄ Âƒ³Z{ þüiClf­KüúÇ»pï¾uMOlûØ¡‰í.\‘�7›6\‡ç½«ÀÂ9¹ínãÞ|Њòr›&á�~¶¥ˆýã± oP©¿­wV”°ž‡|„® sF'é®'�9£ÓÓÅ�Ù?•ft¹6ÚftdÝgt:´`ü0I1I´6ãK«dÏœ†b4F¢¶¸uØ#È[¬T �៛…ùÖ}m"øP´)äæqmÙƒëëjðÃÞeÂø­'°Ö£e™h•n§­2¼P*ê‡m-¸‰-jZB`òØÁð'´}·ÐÉ­ökl‡HcÍíRYu½›÷Tc >BÏÉ앇ãlrkÛíþ슶k%r/9• ÖÝRw9 ì3:¹ér\£Gâ¹ãöÙÇÆ•5­\îòÕá |Ç•í -Žùé$ÒŸ?ý5\÷Äpÿó?¢K©ŽD@’󑃑 ¡AˆB˜ö-?zŽýb/Îæí®0ôc?—ܱ-â&7<„Et¤2ÖzΤT·á肸‰K$9 …díÛw”—ä-ï|±�‚j‘ii\_[ï£M÷Ã?o÷¿FùiÛmÓ{·¶Í�G&¶Ÿü€.• IZD=Ü<¯£’ å�GÖ… ßÚÞ&Å;’�§ô6:F1¯‰KpU±u-ðùO'àxv>rnØp—‚úâ,äéíC6»QõÖ‡3:~pEq«·ðP;¥AŽm¥òvÖUi]¾Èçúò;¶¡Ö‡Hûy^ƒRz!¡·¾€‚.L‘´�úYYÓŒë]bÀءŢ…éãR;dzá½­¨´Òñ%6à9ã?n=-©–ëºÒyÿ›C(ÊwÞ‰ÑèBaÄ€ö-7džé£÷à AeSÇ¹Š´ñªÍpÙŒQpËeC‹uê:ÏžÿÇ÷㺼}i¡´Âºfç�£k9Ï&×85ï;¢¤bíZÁ²Á,Ê7±zgüÏõí‚VÓr/9• Bg³îž}ýåp�û˜ØY÷Á©½€Ö˜$�PÇ›\/) ädwIÜfÕ �Hl´ó^8ÍÄäóÜÐq×ÌVŸ=ÍTáZ�¥oN–wßm<…³¤óÇ&ÒÐñ ÇNÎÇSNé#õ¯U‡A#¢p9ÛÇaHoXø‹ñèbËK¿ZŽ�\¸¦mÇBé:~Ð$²wˆ*(“ç<(³É,níPHÅy*T¡‘œÌ·KRf.8‚¯ÝH©ê¶9•Õ -{ÞC[19¶•2¡3ûw�µnŒ—rnˆìã§“SHøÔØ‚/½ Ѱš$BWÐmrœ ¡ÓçÁvæ· ¡JÆË«™„NF4ZšÍIÙìB �”„höúš¸‚Ûç·9Š,CwPM8•HŠ�N]Fõ|E<ðÂ�.Ö*²÷·�Áþ«×é ï/ë—�ü¬çUÚ87çZ/íüåËýè<#?"õNõGâ±Çbs¼ú~&,C”Q†P<¬Â`ã|šÑ‹n%ÕØÐ€2A<R^ìàÚ$óžtX%_cº³€‚UÀË4Ÿ³îÔ/«†½ŸþÏdèÚ†ÅzØö}ä¶Ì]p†‡È}ŒêìZ,�ì�"×è¤bš‚–^äýôÐ)eòªsÁ­C�Œ©½ÍÈPVºœ‘nO#V{XÿX¸cþ¸q›Èëqñþæ¿w»µå657Àî£çìM¸ý]³=n|j%¬ÝD;ÖK²ÜÔOcjÐ#KÞRsrÏœ…²¢|¨«(=jõÑÛ­ŒÈÁmûRް·ã4¢ðo©rjÇù…ÐQèHÂYåöÝÇËàTnslrDD…_tf%>L$Ö=NÂC)5Y[/M žt‡q§ð0@©à*´š66 ªð„кÅÜĨ�ñ0|Pß ë{©VZgû²ŠZIvéұϽ³pî—k4/ùh§,›m¯ý*²Üþûï`ùG›ðä«4Α Ù‹´ýç@Äï‹ÅåÌýóâü>E[|Ѷk�~aÝÉ=NòÌ…Ÿ!ž�¸vÀ~¿�ÔÜ/Þ~ÛáWJÚkÏktêKlT”J¬‹kɇq'CC,wÜ®«3ƒKÇ$Á·xdR\d#lØ“?›>@Që/>2 ýS”—žGgŒ¨y#tx¾À;_€§8™”({Ž�ƒ#§ŠAˈ&ôxs羇I#q?Âv. éöâá,®§É^¢±±"ÐÏÂP¡ÙÊfÛñó9|þ¹4Ð*�Ä/3:õY°Š°úþ·oŽÛÜKÉåa±îR’`¹z|ïºÇlo«†Ï;NçWÊÖàÊÑ\Š~ÛêQ ¦a®Ó•2ìxïÙËaܘAPk‰Ús ä�eÓÞ\Å}Çò´ôxîÝÍå�ig~pˆÅ^¿é |úÍ6xýïëàí�³àÀÁÐT]b3¢‰Ò5µ9©pl¯«¯�åuÜ6tì“Ucù�ã½/¯ýFè›VìÂ�—LqynµÉ%£J§<åú¢ËVâã›E•Dyçëmg£I$)Š"IMÖ¾Ù¼ŽÛk”‰4ä§Æ@m“hóÂR…N•ú þß—À?Ÿ¿.; =ºb=VºL Ü ³- êëЈguOÉKýyèÌ5³ÊÄ^Ó©ÓQaôŠðhdT¢ó /êÉ�óFF ¤’‰{AцømÎ¥|wçO¸èYˆäúG¹á|·9&�N•Lf­Ñ…u7’é¤D¨Â}²šG%I¤º�:„’î-‡å…RR:Z§¯Êª‚ä°:x�UzùW3Ü7ä�ƒ>ÏÞ?ÕC’ì\:•ÖCM}3Tã‡#ÙÅ#«CQÉË×?Ù e¸$ˆðç'ÙÿD’wV@ZÀÙÜfÊÍʦZšßft[�ñ#ü¥ J2|²úTá‡T`²îûÈReýÇ:ãkÕ–3ògt�¼å¾ûõAF2bé(|š†ì{U#±ï€¾Ñ‹¡=¢xhŸ�,ãfŒK†«§ °é—gŒ—þ Kµ±nW¬ßŽŽeÖýRe‚9ŽtÛwŸb{PBÕol;aéWB/Ì\Q€3ú:¹‡HÞa·(�Lfé’KÍh’•ø8ò"t€(²–ÀÖËTO­iQB},�ýÒ«äúõœ:: L�í…p4!}éo[åºæÓøOV…%l±m[ù´¡ª\F{óV�r 6,ÛÉÊ v›¿P»5¬O„p¿d®\ÕËÿsæMhóS5£ŸÇÅã®ÃEŽÙ}r�ÛgC†ièw,­»¤$ïÔ¡?º…)¥ØtÑY�$/¹üûv8’KŠ…îƒˆ\�£ƒt¸%¬ÄóÓúÈ)(ƒ½hÿOÞXýèãóÒß·ÁŽ}gÐ!Eç…‘þè³mÐ6ëþÓn4úø'¶åúmV£yÙ:üNè¦ýJ}s !!i,M*±›Qª›11ݩӬ5:Ã3ñýŒ5{\_øÝý—:õËñ†òu3Òá½o�9F·]ÓËÿûw·ÃŒ1‰p$Ø?¹—Á“=užýµ�þaG~‡ýãHäÃ㌡�‹Â=×@;§Ú®Ï¯}Xj#t’LÿnÅxã×ólŠ-®åÕ¼'ç�‹^[E…ÅhcΜÙÔl6 ê2àae'eUF¨�ͦ––·ýÝY¿ú¹5¯ÕãžúçÈÂß+7Ø×ÿµ¦�ï‡[&í+ ÖŒ.W�ÚñJ–WÏ Ÿ­Í†Z-6êÓFdãéÏ€„;(Ù½QðEkè3ŵhK.Oÿ{ÏDø~óiB'9ê‡;†kg„çßß�ÖSèmŸ´�&<¾d-¼ù›Ëm欎yÕº>”]‹ßÙŒžªy•U«Ý@©çD!SA»)~xnë_Ïû»¿í”äÇ–q§ìuVsûNUÀ¶ýyNYX3ºSFÞ(‘îG¢'Ö_^7RQ/ê›Ìp�§úiO¡�Egù�— †É£“%ÍD©1)]‚^¸Ô˜31JkZ¹DÚ¡¤c‘¼ºòJÜk¦)Ä…LäœáÑ?ýÏ,]cÛÛ¦=üžŒQQp¶„­òjDæ»ï+̺„Ðó3—Fš¯Xƒzã³NvÜÁBè4¦Ë§ ‚».žGicûÂW�¶•‘Ã�ÖèRáçh\r®¶]*OÄ)ÔÁÃ/ý€3ï�ÓŸ—ªK*޼º¼üÏð?‹¿…’›Ð�Ú艡°Jú´a! ße¾)«KÒ–Ï~gÝíc@¡Ü èåû½ëïΣ¥°ã`>L›fK Ö�:Kïù]? tÔó?W�è°Ö¶ Há¿®7£½·�Àµ2ŠÙrËŠÙ8£G„‡¡òL‹Mᄚ%£¦: ·>SW\:BG‹ä-FIh@N„Îiû]<Ÿ/G÷Jè8"ÊC¯¨JÚ ¦<4èØrÐÍîXºd6'»ŒÐ 3—îO�¹ð[üþLî�.ûÏ”P§¢&•Ðö¢ËåõG¼1IµM}¾ã*:F8–ºåÈ«°J•ïÝ+ ¿u*%;%Û Þ)oäÎ`'¯0´V_•u´�ÐíeÉJ+ ê`MÖAX³5Í6Ãк&Žì ã‡÷ÁsÕô@G“];íáßáìR(¯BYjK�5›ÍE´²ïƒ½Ùnù{¾Në¿p㛺jð]Êd¥Î\4Q‘¹ŸøåË—Û´åjQ#ëÛ¬S]…“­Ý„˜Üúàqèqôôy؈&«w­ÍåÂäa p æ„‘I¶©Ì¦½y��Zj®á†9à Œ$náÐé2¸æñ¯aÒ4¥uóÄÉOdúoM¨íKÇ‘ �`E³OÁ&Ô“a*$ZîQFc¬Ú[Å&tA¸³ sÙÇ]…ˆ›Çîûn¥Ì\¸ [¹B®¥ãáã篲½try‚)ž¶žŠÎ×¢›â&¨@ï¨d‰E‡$ôŠ€8ü£}v_„¹�~ BK5ÄGvù#÷Åðº°NòkB ÷SWا®)}Ïžw%Ì„üÓu— ÿ4êØJTÿ©gïsŒs¼Î-©ƒÑ¢a`j¬ctÐ^“'š^xRI_ô¹> %MscQoÜ1Æpô¦*=#«1Xú ¬Gé~ï(Nèjài¯#Ò {Nuä°ìé­¿â³'¶ýÅo,Îm·Þuùêª0ké6Ô’U‹¥nþæ­í82¿˜RcãqÜvÅ0dÇC }ºñ ¤Ó¾ý„ÛmÊ}êšÿ¢N‹Þ×Òå3:u=ºß”Uß+7 ’òjq�8mlª\ï��õÞ­°q_1ÄóYÝ ZÊ’5¡Qp<¿£–¢cií�ëFA£E×v¼rÀw8;e4ÂÞlwÊ1ð×¼ o ”î ¡ ¡â«øs‚ÎïÞÙ %¥î¤œ¬zvùµ»çª�_ÉguoÞ„°°PØtÔ�N¨ýÿyS¿¯Ê¡“·X<ÿö!Ö`É ÿ¥ìtÒƒgåçixàúѸN×I:옛Ǵ# @Q�íäž(/n?_”¹„í¿¼½R¿\„ÔÝq¤59;s£úOé�lüXÇxÇëãhž #õvŒæ× G ::³|'[Çh¢†*£zÁŽãî�ˆÙÑeq÷”–f”0) ft;⢠{ ¯Ëí÷R¿¿yk'—ÂK£0î—7Œ�Fô;Î0›WXSÏÈF‡1d¨p7Xòþqÿ‘#‹Î¥NÀÍè„dmζ†èôIhœ/\'‡,Ù_o9P×ÍrÇöÊ•åñ`3X!¯µßnγy á˜È# Õjá$¾�•un4XEx¥ kÅûò5u]J@:Á�,üc¿É¸àé/OU] œÃ“X/ŸšÞmtáåÆê‹ø‹'ÀÚÝEh�V�–h¸XâA��(8t–-€ÃuùÞèò¸;�e·( Y÷ �­Z�sLÕ£•sàß«fÃŽkÐü¾ºpV x(cÐtÙ¯�BË´Íîc-‚x{ ²ìv°vF§Öæì(�NŸ|/nï°Ô/kÌ™�}â$ýMJáqˆE2MÍÜ[ÄUc]Þ :m%ópž²ÃÖyÁÙ|QaÖ›?º¨Û€&tBª&gÇacÿÉqx9Y9Òš[·»®™Þ"#|cæ)×vwˆŸ€N&¾ÌÌ�ææ&<úˆ³ðôLÃq¿|×™·[i˜õ;\—?èïA ³îmØE—Åþo¶·EH\”àÙm�¼²ªj%Ry :‰åÕ…Óál©h›ÝYy{Bš^¯< *kÝ Ï…ó&SË}ˆ {ÊÐ~F'ŒHÀ•>iµÂ]x!‡[QYäVÂÜIýÐÿYP Mn(~�OŠ7À¹ª&Øs¢b =wV'`åMax=S4Ôú|D¸¹xó[ûýþ°¼h0h¨¡6ggMdú¤}Hìwâ8eßÄì‚(«¬…Œ iN~á½À¦Ç¡3È?Xu ô‚ ]FÉBÜ­q±èÜë±_àU´Ïèr;s¥#h�„Ä~&ºßd3’ùlÖé´‹É—¢ý:÷oÆBÊ9-D¯…þ}�ðÉš3�ˆÇ8õ4ì Ѱñ°[ÓSše>/ÈŠ}E˜ϲ۟pP:uº&wþc¿¦ ˆ6ÓqúÎc¥‰çi�Ñ×>Vþ«��xjê‰üj8žSa;‹\A‘n‘% ]Bý´ß­æŽUÜ-ºëk þäF{&°` :B§¯¨1é’A+Ò–Ó‘ÜÆýÅ�–#&êÞ›ÙRáëMùP_ß=@ O~ßÖì­d{qm}fgÐIÏÜ¢-ËØ6ªø|ƒ�ÐqV/ØÞÓoâ·x»‘…ëj<¬0)&F æ0,œÓÈüœ‰ið�UÙª1CH7^¯G ¡Êš}Jˆ¼Òªfg-ÏsÄ*X®ƒ’Ð ÜêÜ�U‘éÀ•ä­x++‰§¼?¡/u<ÇÆK䪲ˆ‚…gÈMžï ¥ð­§»((TYBpM¾ÙuÒÃpZQ¸ª0kÙ^7ù69h �Eá\Yd¿IkACÄÆB9�"ŠLƒäN;a•ï‰i}qË�´ ¿@erÝ�„sÚðh%Öh­�]î*ظì»`~‚šÐ øÚÜ�%è> Õ‰ØCXcû‘óP‰Ç M›"y «lOM‘‡V[fØz¨»Ø®ã›¢7Â&Òuzæ‚ >[�µü­`þAOèôjs·D ˜¼L±3Çt »Næ–Áìñ©âÂýÅpìÿô±É°íH©í(¨(ÜÉÖ@Ê0-ÚHØ~Ì�óû…ç‘È_°ßó/“(‚i`hsýÃÄm·›±ßLÕ^RªÙq¤ aRÀÎd‚ Ÿõ•Xö¹“ûÁÖçBK êÃëƒ�ØCCôPÖ û²•ùÄ1?…DþGŸ�ê犻 ¡n5¹;ND÷Ÿt ®ð–ù6’ºì×Y§aòðHŒ�ò3ìÁ×)ÓÌB.èýïN�AO.Ï¢¢ °/× 9ìóÑìƒiŇÑPe…=¢;üÑãRwMîÎÃ8³G2¿K0ÇW�Nþ>_w’ãõ0|@—È»�˜<È^4´7|øãiÀƒem笻)ÒåɆ¨hX‹ç–»sèx¡£ÁßU¸qÅ?º¼ã*w€I*·å·êpf?Ò+} é'’+*ÜX“ä’jõލ@!ÝxÜN’;zX¾†ž•’Ò; Æ¡YëG¨&…磣á[@rÿÔ¬‰„�‡*Ñc°¢.¶àîÍÍÈ®®(w�eê–„NÏ :gGº¢Z‰3û•xËÔ £ü$¤[·;.Õbñøbä bŸ2:>Z} !VÜÁ�ÏÛ)á�]*ÀÑ\¶û'‡¾5h@¸&?kY@ŸäÐ/Õ.ì©6.[E8³WD¤MúT#À4\²§º«½¼º þõÓI”l€ÁiqÝjßØÝØ=MOŒ3ÀÌñiðÑOglÚsz-S$âiõ^ç7â)*�ÖCY�;[ò¶&j4‚0?/kYf[L7¼èÖ„NÏ«.ogƒ1éÒ Z‘Œ`Fº{†V«ßmɵmÁ�ÆH¦Ž»êºuz<ªÎAÛÿ�׿¢0ÄÔ¥ª²$Uod®ÂóùÜ«º]x0G­‚u^A抠ÕxSú‚u{B' P7ÞŒVo_û7ÒzýR%àœB ®­9 ixPÄ Ô8®M'ZLT\1µ?|¶>¬æfí‚­7¥l;ÙgKdz)-|Ú,˜¯=—ùV‘Tjw‹ ~Ë�¨&g,ü%*ÖÐÖ‰Ni³—OJ†ßÜ=÷‹WZ¤Çå+«j„ÛŸ]š–*¿™· á�‹Ç|ϯóo®Éž(È\FÚnЧ~Oļ=bFwkvG§O\…kö Œ�sL“»>]X Ÿüx}Ÿ O�çnª$€ŠÓÃϦ€ÿn)‚ÚºŸš·’D]n„Ì#5p¾JñZœz] â•…™Ë¿’B·Žêq„NO‡( :ý:«•}‚’'LÛpYhóݦ3�Þ×i}{ñ}wàhkòš!s•ÖÚ¸déô-ùY?\h�Ã9µJ·Ílm"ëºÖl/+Þ¸âd§;„ôHB§çTz« ]I=`ò~dàæb”¢=5:feÖYز?úõ‰€”Äè |ì¾ë2iÐ]Ÿ1j[ÈÜWÑ(Á]�N:û¬²96U¬üÒÖ¦( /ô)¾¿nÕ?<âñÛ*è*<‚àG¡Æ#‰fQGÚPWx:š«¦¦Âƒ×�‚‹G${Z´ÛçßuôüzézˆÖ5‚ÁË#ŸH}µO’9x¶Z‰Ý¸+¦y¨GñPAæò]zÚ='ôö'.¤Ì\ø+¼ý3þyt }\?£?<ˆ'”ŽÈ=Ù´C PUÛ O.Í‚Óg  o´ò×-** *EdÑk¼!p<`JxݪîÜš×ømvìq÷¼VŽ|÷‡Q¥Íz|¤Õj¡Ù}b‡Dó§¦Á=W ƒI£¹Í»#\ï}}ÞûbôC©Km–<·Üê‰V›c3$Gß!jŇ 7¬8àœÐ³ï8¡K>ÿÅšä•w Ó�—19I2‹›È�ÉQðè�£ cb:$�pðT<¶d<½ÕÁ®]£Ñ€Ï9;{ÞìéV™ªB5JÔŸ)ÌŒ}`±2ív‡ÒÝý’:ã 'd<"êžF�žÂl^©È…‡éà¡k†Â¼)é0fH"£µž‘T×`‚§Vl„#ÇsaXJ$Ô™´pàlÔÔ{ï=7Ã?Ó æÇs2ß.é(z>JNè 0Kš¶( Uh_A°Èƒ�×aâ°¸ýŠ!0ýÖõëÛ3¥õdO°f{.,ûl/–vzù|FÐ�äoX¶Úë‡ÒC rB÷àA'ÍXx n-Å"^­ß›š<"nœ5.Þ†öW¤·ãX<¨® KëlĽq_>dî)Âcˆ;ÇYã žƒ/îËaâÙ«V4]ÔYNè�ë÷™·#pÏbÑÁ—(0np,Ü�1ÀFôtØùUöpº ‰;²öÀŽ£%`Vnhº˜�;/õ®mþdÏžw½çõ-t×$NèÞ>Ù›nÒ¦–&ÿÌ*ZŸDÑ V�`À5ý܉)èS=† ˆzªÜƽ¨Ó!µ´˜,p0» e—‘Óe°å@ à,®b8Ž{l/hâþ ™‹Í*ÖÛcªâ„®Â£N™¾`®ŸD–òçX�ªÓ1 ¤aüИ1Yü~±6ÕÛ¤„Hˆé"â7ã™DDÄGϔۈúØÙ2œ±ÏwJ˜Æx‡Qóø…Â>Å_ÂçŸãÞ8Þ"À Ý[ä$Êõ›ñ«t‹F³÷rïÇd<ßÄw�fù‹�å” )Hø½é°´Öóׯ8­J¥¼’68¡·Aá“ !mÖ‹Ñ9!ùš¿ÿúù¤•à­´»þ9žköAþƘÍ|öö݃ä„î;l]kRf-š$XÅ[pö"Âï©V0´·¶�¸­õ�_íy×·0®˜ò{…pBW”ºÙkÒ2*/±Z­· {#ÖÝWÝú®¶RTO]/ˆšuè þ‡‚õo\»y‡8¡wýRf,„ûÃÓpª›Ž„¶êTÙŸï¡Õà8²P¶·Àº¾`㛇±/ÈÈðÐUpBï*äí’}¼ ´Óð âi‚(NA‹ÙUݶc4ïM2ûDÖá6ãú1fßïöFß•á„î;lU«9þÒ§£Âu�cщÂ@«U3g”䋃°’è»=œB¥ŽÐÚú,®­�‹ëqüÇCŽ›Aw¼(sI™Jmðj|„'të¯ji+OÔi‚U;Њ<ý;?H�"X HŒøks“Eûúd/kÿ¥.VӦנä»ËᯈæžPƒ\D5~Pð×Z¢tÇBÂÌÙ\¯œ ã�#Ààp8ŽG€#Ààp8ŽG€#Ààp8ŽG€#Ààp8ŽG€#Ààp8ŽG€#Ààp8ŽG€#Ààp8ŽG€#Ààp8ŽG€#Ààp8ŽG€#Ààp8ŽG€#à!ÿxŸe‹/øE–IEND®B`‚rvirding-luerl-772b25e/priv/images/logo-large.png0000664000232200023220000165246115114130670022366 0ustar debalancedebalance‰PNG  IHDR ¸ ¸qõysRGB®Îé¤eXIfMM*V^(2f‡izHH2024:01:19 08:41:23   ¸  ¸¤˜âŸ pHYs  šœƒiTXtXML:com.adobe.xmp 1 3000 3000 3000 2 3000 1 72 72 LuErl-Logo-14 2024-01-19T08:41:23-06:00 2024-01-19T08:41:23-06:00 Affinity Designer 1.10.6 produced 2024-01-19T08:41:23-06:00 sRGB IEC61966-2.1 3 ÷Œ�–@IDATxìÝ[p]Wyðµö‘ä‹lˆ� Ƕ’ŽÝ (µÝNm.ŽZ‚g˜¡�¼óÄ0S¡tú¬g†fÒÒNžx÷cgÊĤ­ Ä&5€ÃÅj ‰åÄu"…X·³W¿}2dÒı,Y:çüöÌÊ>g_Ö^ßo9q朿–R² @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ô‹@î—BÕI€ @€ @€=%��ûÜÀ¥”·îJƒ +;ÛíÁ¥Áå¡V=4تË`»”Ájàõ}Iƒuó¾Õl×õPïsªKû8^¢ŸÜ\S•ξ¤<ÐhåGK©Sü£óºŽ÷qCÿH¹.¹ó>ÅÛ¯K‹ã©.u³�÷�{rœ�ëb÷Úùæþæ¾è#W͹8žª¸6ö¥ŠNËRô±½-–VZlÅ>Î/ÄCã¾Åv½¸0¼½^¬W–g&¿çRÜo#@€ @€ @€½! àÞó¨  @€ @€l�‰êÖñËÛ‡SÚÑ®ZÃe¹.Un¥²#ÜÃ¥nG{G¯cÀ�×)Ǿäá*•xŸwD^»s.ÎÇë´-Ú`´¡×÷Íë¦uè±·¥�ø&Ÿ^ßÇë²_,†usZýBnö%¿P§r%µ¢•Ç® Äû™Éo¼×FžÞF€ @€ @€½* àÞ«3«. @€ @€º] ß1~ÿ{—ÒÊH•Fr]ö–TFbµô=±júîGP½ÞÁõ©—©7ûNP½êöÂ�ŸÀ;Īïù…ø3aøû&ß„às'/ÿrN @€ @€ @ KÜ»d¢ “ @€ @€�ÞØâËÛZƒË#+y`¤Êio�ê‘ø 6Z)u‰*GRŽÖìSÚÒU«‚À† üÿ¡øT]*¥ž-9ÍTy6¯T³O�\¼œNŸŽëm @€ @€ °Qî%ï¹ @€ @€ôŽÀøÄÀ�å+·µ[yo•K„Õ«‘úõÐzþF`½ ­¿§w W �žˆuÓsÑ.Å(³ñf›|³Ouš-U5»²´0ûüÙ‘X9~¢¹ÖF€ @€ @€k, à¾Æ º#@€ @€ @ ·öžúÛáÖÒÂ�V�–\�–’V¹>X§üþfÕõö¨xO4Ÿ·öÖÔ«†À; ¬ÄÉ&?ÿ ˜-)ÏV¥ ÄG‹ÕàK»=[ËìÅûÇãšòN9G€ @€ @€oð…Ë›=¼#@€ @€ @ ¯&ª;Æ/ß¶’GKÁõ¯—œ¦TGË£Aûô¾¾"Q,k)°�]jBð©Ä*ð9_Œßêðt$ÞŸªK™¨Wf~óýúm\#¿–êú"@€ @€ @ «Ü»zú ž @€ @€�wØâËÛê­õÁ�¯×^�Õ•FŠô`L^?÷½SÎ @`�æ¢ÿ™’ÊLNÕLÉõSUjÍÔql0ÚÌä7š¼� @€ @€}# àÞ7S­P @€ @€='�÷~äó· n-U×ßX�ý�ðz³úú­=Wµ‚è3�ür,ð>k¼G>?Õ Â·RàËÌ–Öâ̯y(ÎÛ @€ @€ Ð;î½3—*!@€ @€ ЋùÎO|é¶Åº}¨Uòá:åCUI‡cöÃQì¡h;{±h5 @à:šÞgšüø+ÁG ~ëR=óäc6+ÄÛ @€ @€ Ð5î]3UJ€ @€ @ g:+±·¶ ÎíêPªÒá&ÄaÍC%å&È.ÄÞ³S¯0n‚ÀKñŒ_§”§S)r.Ó¹ÊÓ¯.m�¾òèWçoÂó=‚ @€ @€×% à~]\.&@€ @€ @`•¯…Ø†Ň’‡›{`m5öܬÄþžUöë6X½À¥TÒtÊéB.yº�ëéÜ®/Œ\]~jjê¡åÕwëN @€ @€¬^@À}õvî$@€ @€ @àÍo±§®Wug5öX‰]ˆýÍVÞ @`3 ´cp±ê{ºPRàK³ê{ëB^^™~æÑ¸Çã°� @€ @€ë# à¾>®z%@€ @€ ÐÃÕèÉ+£+Uk,×õXÊy,Šý`´X•ÝJì=<ñJ#@€@#ðJNeºNy:G‹¨û…\µ§·\ÍÓO>öà" @€ @€ܨ€€û� ºŸ @€ @€@ï ä}ûÒ�ª*w§\ÆrÙKiÂìåQòpï–­2X¥ÀsqßtÓrŽÕßëôó: œŸýÞן�cV}_%ªÛ @€ @€ô›€€{¿Í¸z  @€ @€¼U ß>~ßíU®ÆR]Æ"�81ÄX™½³*ûη^î¸�ür.é‰È¸Ÿ�»bŸÏ—åê‰gÏ=ðâõôâZ @€ @€úC@À½?æY• @€ @€�<úñûG–[í±ªŽ•ØcUö8ôz+ïED€n²Àl*å|©"ô^Gè½Tç«•ü‹¾_½Éãð8 @€ @€6‘€€û&š C!@€ @€ °V{?òùÛ‡ÆrÎcñ!àÝu)Í>Âìi×Z=C? @`êèóÉøM"çS|ÏÍjï+ç/¾ÿò¯ÒéÓíuxž.  @€ @€Ødî›lB ‡ @€ @€Àu ŒO 쯯| ¤Ö‘\•£±î‡cUö»£�=×Õ�‹  @€ÀæXÈ©ü<†Ø ½w‚ï¹zâÙ`6Ž•Í=t£#@€ @€ @àzܯG˵ @€ @€6PàŽñÏnm§w—R�•Ù�–RŽÄp>mëË£  @€ÀF ¼"îçSNçK�~ÚÞ:ô“çÏ|íw9(Ï&@€ @€ @`õî«·s' @€ @€�uØóѿ۹}pñÃu©�–T‰Uk�ÆÃ>m`ݪc Ðu”ñËhS±¶ûTUå©«iùÇÿ;ùÍWz£ú…÷׃­£U)foVeÏGbD£:*'@€ý)™÷t!~œlª”Ü ½_moyüÊ£_�ïOU @€ @€Øî›cŒ‚ @€ @ ÷òèÉ/ÜÑnµŽæº>Ú¬Ì)º#ñ�ÜÞÞ+UE @ gšÐût´©ÎjïU™ÚújzüÉÇœë™ B€ @€ @`“ ¸oò 2< @€ @€�îØâË»ÓÐòŸ§Ô:+³ŸˆÞþ,F~KwŒÞ(  @€�kDè=O嫽WyjhàÕÇýÈC/_ã§  @€ @€X…€€û*ÐÜB€ @€ Ðçã·§ßÞ�R}¼Jéx)éDˆüqŸ«(Ÿô›ÀÿÄrïSUnV{Ï?¨«©gÏ=pµßÔK€ @€ @`­Ü×ZT @€ @€='pç'¾´w¥.ÇK;O¹�\›ÕÙ‡{®P @€7"°7ÿ8åt6×ù\;µÎÎ~ïëÏÜH‡î%@€ @€ Ð�îý8ëj&@€ @€x[�±±‰¡¹=/}¸¤:Ve¯"ÌÞÚÓ�o{ƒ @€�·¸§Î•”Ϧ\ŸÛ¶-=þä·\|ûË�!@€ @€ @@ÀÝŸ @€ @€�¾¸}ü¾ýЄØ�ç’#ÔžŽEÛÍF€Xk�&Ü>Ur9—su®µ’Ï>ýŸß¸´ÖÑ @€ @€�npïæÙ3v @€ @€�ë¸cü³[—òŽc­vëxË:¡öè  ¸Û @€%ðt‰UÞãK»³9Vy¿m~é'SS-oÔ`<— @€ @€ÀF ¸oô x> @€ @€Àº ì;ù7Zyùc%uVfoímpݨc @€À� \�.~˜rŽUÞ˹¥Å¥sÏŸýçË7Þ­ @€ @€t‡€€{wÌ“Q @€ @€\[ �žüÂu•ï©KuON垸åÎkßæ  @€À¦øUŒ0Vy/gëÜ:w1ÝòDšœXÙô£6@ @€ @€«p_š[ @€ @€6…@Þò‹‡R•îI%Z'ОlŠ‘ @`}^‰îÏ–”&Sª&G^yõGSS-¯ï#õN€ @€ @àæ¸ßgO!@€ @€¸q�X¡ýþ»Vªºh�¶NF—ûn¼[= @€º^àÕ»?šRž,¥Lîza÷�~ö³‰¥®¯J @€ @€}) àÞ—Ó®h @€ @€@7LTûO^KU+í%VhÏh/·uÃÈ�‘ °ÁWãKÀGã·ÜL¶[õä®Ë{~(ð¾Á3âñ @€ @€ïZ@Àý]S¹� @€ @`]>ó™Ö¾çG>”«tO.© ´<ž÷¾u}¦Î  @€ý!p5ÂîgsU&sª&‡¶Õ?|òÛ.öGéª$@€ @€è6÷n›1ã%@€ @€ôŠÀøÄÀ�òÒ‘”Ë=¥hO‹Òné•òÔA€ØÄ ñÄgs*“ñr&·lOÿ%ð¾‰gËÐ @€ @€}& àÞg®\ @€ @€ÀF ;ö¹ÁçvlÿÓ�öT¢¥ôÑh;7j<žK€ ð†@ÞÓ¹&ìžK5¹e¸~Làý / @€ @€n²€€ûM÷8 @€ @€@ äÑ“÷ßÕNõ©”Ó©¨» µ÷QýJ%@€t«@ÞËRÉ“©U&Êüc3“ßjBð6 @€ @€ë. à¾îÄ@€ @€è�}ã_ÙÓJË÷–’>U7¡öýýS½J  @€=+°˜JúA®Ê#¥�Î<;òÜT:}ºÝ³Õ*Œ @€ @`CÜ7”ßà  @€ @€Ý-pèS÷mY¸Ú:‘K}ª¼h?ùÌ©»§Õè  @€×x1þ‡ï‘Rò™:µÎÌ~ïëÏ\ëç  @€ @€¼[_6¾[)× @€ @€4yôäýwµS}*bìÍ íãѶG³ @€ô©@ü ã/rNgR�Î,oúîóg¾ö»>¥P6 @€ @€À¸¯¢. @€ @€½,°oü+{ZiùÞRÒ'£Î&Ô¾¿—ëU @€À ,ÅÏD~?•úL©Z_œ¼å§)MÔ7Ô£›  @€ @€úJ@À½¯¦[± @€ @€�k úÔ}[®¶NäRŸŠÕ8›@ûÑh>Gº6�+ @€Þ"�/§\¾?,ùð`^ùÎÌä7Ÿ{Ë% @€ @€ø_Lþ†— @€ @€�>È£'ï¿«�êScoíãѶ÷©…²  @€ÖWà§©¤3uUJóߟ™üÖÂú>Nï @€ @€Ý& àÞm3f¼ @€ @€�5Ø7þ•=­´|o¬¤ùÉè® µï_ƒnuA€ @àzR)ß-¹z¸UUg~óüžÙ}ãš»®|¶r[Q9 @€ @€ÀK ¸¿”Žc @€ @€�òȦžzþ+‹yœ]Ú©=�ì•å_²  @€�À®tõó<¿!«¯¿aÕ�.Y}@£¹˜ @€ @ ¬ÜËj9C€ @€xy�¦£?8,F >½ÐµK{öútEÓË_å  @€Õ)�Eþó<Ë®/dqýŠ›>óóÔe^��êŠ @€ Pκ$@€ @€*\ å´‹šóŽŽ7dQ8;²üôÔÎ� oIù @€úB`Mô†Rà=Û]¸qÕí—ìì‹IŒI€ @€ Ðwî}gkd @€ @€À,*´.ØøÊ< oÈòüì<²WÀ`.%@€ P‹¥pû�é~}ÖQ¼aåm——Âïn @€ @€e. à^æ ¤< @€ @ všŽþà°1øôBÄÙÙRçSj§{� @€ès�»"�ë‹yáú5·\ú‹4[Þç3š€ @€ @ Çî=&s @€ @ ÷ZN»¨9ïèxC…³#ËOO#é½Ñ�D€ @€À>VgYvC1+^ŸíªÿѪÛ/)íöîF€ @€ Pîe°J @€ @€jK eÁE³£ØñÖÈ oK›FS[Ýë– @€@Ù ìLšþ0�ìúºbvÓ·\úTÙU¨  @€ @€@ ¸×Ðbk• @€8�¦ç\ÙÛò<{kªâÈ�«ÄÌ @€¼„@žåÙ�‹…âµyGákn½lÅKœë @€ @€@¸÷ª!  @€ @€I k]pþ¼<âm‘çi§öl @€*Nà§é·.][謿nÅ­—<^qÕ+˜ @€ P�î¸hJ&@€ @€ÊV kš¿ðȺ,Þ–§ÝÚS•s˶R… @€ ÐS�_¤ÿŸm^ˆëÖÜtÙÃ=½Øù @€ @€Ýpïž“³ @€ @€ûÈZN^xl²·¦J¡ö™û:Ñë @€T�À}‘ÅuéÃÖkW.ùÌý©«ôË›Ü @€ @€zC@À½7�A€ @€Ô˜À¢BÓüMÇïÙ©=JÁö©5 ] @€~-ðHùµ�y\»féâ»ÓËÂî¿¶ñˆ @€ Ðc÷“¹€ @€¨I�sΩkÙ8ù¤èL»´gÙ[’ASM:hš @€�—x""»6ŠÅkWݲøÎt¢°ûKi9F€ @€Ø‹€€û^P¼D€ @€èX°¨¾9ÛtJ!…Úó®P{>‘  @€º'�¯ÌòÂu�u�×®¹iü틊ݻÎY @€ @€�Úp¯íõ×= @€ ð"�yó Ú:aÓiéå·¥½ßœ¾Ž{Ñ)ž @€ @ §OEßÈó¸nu6ö–X²¨£§8Ÿ @€ P+îµ²Òú$@€ @€ö)P µo™°ùÌBäoK�“7¥÷y² @€80� éòÿÊòüº‰;vßt×]W¶Øp®&@€ @€T—€€{u­§n @€ @€�n ,*´žòô‰‘Þ•çù9鲱ݾԉ @€è�Íi˜ëÒÏ%_[µ¤qiÄ¢bï k @€ @€@å ¸WîÚ©œ @€Ø�Öç–ã]‘Åï§Ë§îÇ.!@€ @€@_¬Ž<þ£ùÕk–.¾;M�÷Å$Æ$@€ @€”»€€{¹¯�ú @€ @€�hšÿ¿Z YÇ;Ó@ïJ÷Ãx@ @€ @ oʲükQˆÿXù£Å�õíTF'@€ @€”—€€{y­‡j @€ @€�^˜zÒ‡Æë½-ò¼´[ûü4¬÷AzÉÖ0 @€ô«ÀOÒlW7Ôg_âÆËÖõëÌ&#@€ @€ €€vÝ” @€ @€@ßL_ð‡CÚcä²¼´S{öº4Ë ¾™É¨ @€èw�Îôx˜Gáê¡»‹ß\vÇâmý^�  @€ @€ý àÞȦ @€ @€úPàœsêš7NYÅxWz£ã­i¦Q}8›¡  @€ P»ÒÏ?ÿ…¸zÔú±ß½ÿþEmåP” @€ @€½! àÞŠÆ @€ @€ú[ k:ù£²B±jgš|J`> @€”‰ÀæˆüÚÈê®^µ¤qiÄ¢b™Ô¥  @€ @€À~ ¸ï›‹ @€ @€��˜zÒE3óúŽßÏóì]iþƒ¢s @€ @ ŒVGÿ‘ _[½äÒ{R�yת4 @€ @€À^Ü÷ÊâE @€ @ \&Ÿ¼pBC–½=ÏòjÏN(—ºÔA€ @€�rHÉö Y~uÖQõŠ[/y¼œkU @€ @à…î/Ôð˜ @€( �Ig~lxîö7EW¨=^“Šª+‹ÂA€ @€�ÊøIdÙ×ÚÛv}Ý�¯X_™-¨š @€¨÷ZYi} @€ @€�òÈZN]8?+ÆûòÈÞšÊ^þ%«� @€%Йªý~ú Y_:4®_öÝÅ»+ªzÅ @€ @€5! à^ˬI @€ P¾-§]Ôœwÿ¿,ò÷¥*g•o¥*#@€ @€@U <‘}-ϲ/¯^réÝUÕ™f @€ @€�Šp¯èåS< @€¨L�yó Ú:qóÙQì µŸ•º(Tf'ª&@€ @€@U”î_Êë;¯^}ãgSðÝ� @€ 0pîgof @€ Ps­ Î?,ŠÙûó,wj~|Íh˜ @€å-Ж>@þVÅ/¯š¸îqÍ5�å]®ê @€ @€�jp¯ÆUÕ @€(#�™g|pôî¶Á¿—eÙûSYÇ–QiJ!@€ @€�} ¬‰<¾š;¿¼úÖÏ>²ïÓ!@€ @€ô®€€{ïz� @€èXThY°e~äÅR¨ý­é>  @€T¦@–g·å_ÞÕ9øëoû‡í•Ù…ª  @€ @€�Jp¯”•R' @€¨�æ [ ˜çÙ{S¹3+ d% @€ @€@÷žÍ²¸&ŠÙ—V.½ì–tYʽ» @€ @€zW@À½w=�F€ @€jN`ökÞ¹3ÎN;ú•vk?3ÝSÆÝ� @€ª\à±,˯ê,6|eÍÒ^Yå½j� @€èG÷~Ä6 @€¨&�–ùç½" …÷§ýúÞ�úWM½é… @€º-PÚÅýÒÎî_®‹mß\¾äª]ݾ҉ @€ @€�½¸ïÅK @€ @€ÀÞ¦/¸°±3ï|g…÷¥ßDÌÞÏò* @€Ô¨À–”v¿º�¿¼rÉåw%ƒRøÝ� @€ Ð#÷q9™ @€Ô¢À¢Bóü� ²B µçñÖ$0¤ôL€ @€=¸/�ìK�Å⿯½eñ†]éd @€ @ ¦Ükzù5O€ @€ö-0}Á‡'wFÝò¿bÉe·¥Çvuß'• @€ @€@I@ÀÝ÷ @€ ðB�¬åÔ…óó<>”åYi·öúô˜ @€€À}YW4 Úõï�ÿðÊ­0ŽK  @€ @€�*p¯âÅÕ @€è®ÀìãŽÚ=8ûƒ<‹§kíîuÎ#@€ @€û!ðlºæêb±ðù5·\úóý¸Þ% @€ @€@ ¸Wñâj� @€¼œ@ËÉžeù‡R°ýÒ¹Ã_î|Ç  @€ @€@/ Ü™åù�;vÿ¿5w]Y ¾» @€ @€5. à^ãßÚ'@€ @€�Ú˜ýÚ…ƒwí(¼5½)ðá<ËO¬= @€�½ déë Yº¢¾.¢�¾–nyžwÝ#O�KÏ»^+½^z\:¶ç…½¾žííVš«tëºvÏCÿM€j\ Ûš¾R(¿°â–ÅÔ8†ö  @€ @€@M ¸×ôòkž @€jI`ú‚ §wæÅ¦ðÝRßj©w½ @€@y ”BÞ õ…>¤.Fmˆ‘ÃbôðA]�G kˆ¡éõaƒëcØ�ú2¨.ÝëcpC] zþž^k¨K÷†B J‰ô†Òý¹c¥¯¥sëKIõtÛófxúï=ÿ‰ì¹„ùž/Yz¾Çè…¯——^îúú‚ã¥sKGº¾v½þëÇ¿~}Ïk]s—ÆyÁ5{fÚnßÝÞmíÅØÝÖÏ?Þ•·µ§çÏ}Ýõ‚ÇÏ¿ÖÖÑíÅ®óJç>ÿ¸ëkéXz­í¹ã/|¼»-]“Žïjëˆgw¥ûîÎØ™¾vKñ|7 P&yÜœâŠQÆ~ãþûµ•IUÊ @€ @€úI๷äûi6Ó @€ @€ý,°¨ÐrÊÆ×¤=h?œ&~}º{/ ŸWÀt¨&�ÒîæãFЦñ#bòØ¡1¾qHŒ98F¥PúÐÁué¾'€>¸DOáóA)¼ÞFO�ëë ÏÐë»Bíƒöœ3¸ëký¯æÕäU)½”Âí/ ÔïNáøm;Ú~}fwl}îùÖôxÛ3m]Ï·?»;¶?Óž§×Òñ»Ú£˜Æ²+}¥¬¼:  P Ùúô?,_ª‹â•O.½ü‰J¨X� @€ @€À� øPûÀ �@€ @€ÊN iÁGÇò¶÷¦<û¹©¸™eW ‚ @`ÀJ;‰M�ó±£§ úИ0&ÕG§ zz>fÄà´‹zÚA}Ø ‘vT6tP O_‡w}M�‡ î ¬Xñ&.k�bJ¶—Â殺{)ô¾µô¸ˆ>_úZ Ëw�³çõÒãíéõRXþÙÝ) _Ö-*ŽN ýª‘ì{YW¬œ´æÛqÍ5�WŠ™  @€ @€�¾pïkaã @€ @€�þÈš,<®�LJòÈÞ‘¦ÜS›‰B �ÒêãGë„á{Âê�C£1ÕK;ª�N÷=!õ†‘ëÆ¼ ¬ž‚ê¥]ÖÝ”“@GGñ¹�⟠ŧð{içø®]㟠ÇoIùu›vƆÍÏÆúMÏÆ†-;£=]çF€µ$�¯Ì"û—è(þëÊÛ._SK�ë• @€ÔŠ€€{­¬´>  @€ @ j&�ù±á mmïŒ<>œš<ªjÕjD Pˆ˜”vUŸÓÚÓ&�ˆæ^Ÿ›ÅÀ @€ @€@¿¸÷ ³I @€ @€@/ ,XTßR|ú�Ù‡#‹Ó{iTà @€À TÓSh}fˈh�8"&�ãSX=…ÖG§ûóáõÑ#‡F–y[ö¹]N O::бaËs;À§àûºçvƒß„ß‚/…ãKç”Îu#@€�²Ø�þ�ÒÕQÈ/[}Óâ{ʪ2Å @€ @€ÝðIJ·©œH€ @€N`Ò«Ï�ØÐÐpn ¶ÿqª¢ià*13jO ¾PˆÍ#ãà©£µóz)¼>6íº^ ¯�I¡õÆ´ ûÐÁ µ‡£c5.°iÛ®XÿÜîï«Öo�k}_¹n{Ø ¾Æ¿A´O€À äK²BvéÊñOÝ×\Ó9ÀŘž @€è�€€{°œJ€ @€ú[`ê©Í+æ�EïNsîïùÍG€�Z=bP1{\2­1¦7�ŠIc‡Å¸Ñ{v]o54…؇F]Á[©µð½ G½-ðÌÎö(ÝŸ¾ïy¼-V¤×V­{&vîîèí)�G€¿-ðxžå‹‡îŒ/-»cñ¶ß>ì @€ @ Ü|*Sn+¢ @€ �¶io=õ‚3óbþ¿Æ™@ @àÀ겘Ñ42^1³1f6�Žæ‰#bò¸á1alº�cF;° \M€�ýذyg<¹v[W~eÚýýÉt>¿öéÑYÌ÷sd— @€À^¶§·¿Yañª%—,ÛËq/ @€ @€e" à^& ¡  @€ ÐrÂECcpç»Òní%�C‰ @€@÷J!öYÍ)Ä>kLÌJ!ö¦b/íÄ^ °O7"Ó.ìn¨$�ŽŽb¬ÚðL”‚ï¥ßK»À—Âï]�øôxË3»#—¯¤%U+å#�þú̯O‰^¶zéå7¥²ümZ>k£ @€ Ð% àî� @€ °ÀŒÓ/˜ÔÞNŸ©§{ŒàrLO€�²hhÈbnËè8lf)Ä>ªk'ö‰iö‰¥ ûØ1rø�²­]aèm�gžmï ¾ïÙñ}[W¾‚/…áW­{&vµuôö”Æ#@€@ d¿LñöË¢½põªÛ/ÙY… j‰ @€T¤€€{E.›¢  @€ @ ZæŸ÷Š<+\”~8WêgP5ô¤¨@)Ä~ðÔÆ8lƘ˜Ù<*Z&¤�ØÇ¥]Ø»‚ì#bØP]¨±ë ¨ �õ›ží »?±zk<¼bs<ºbK<²rK¬YÿLmý^ߺ$@ 'ó,¾Ph/~nåm—¯éÉ…Î%@€ @€z_@À½÷M�H€ @€^B`Q¡eþ¦³²,.J¿ýŒ—8Ñ!T­@¡1»¥1Ž>h\ú::Z&�I)À>aLÚ�}܈2¸¡j{×Z`çîŽX–‚î�¤Àû£+7w}}$àW¥�ß;‹éÿ¡º @ ¶:"‹ÿÌò첕7_vgmSèž @€ œ€€ûÀÙ›™ @€jH éèˆþƒ,Ë.Lm\C­k•�˜>yDÿЉiGöq1£)íÈ>iT4M%Ä^ãßÚ'@ üv·uƲU)ôÞµÓûžßKø'ŸÚ�Åò+XEè{�ç‘]º:ó_±dQGßOg @€ @ày÷ç%|%@€ @€} 0íä §tÔ?’åqn~\LaH”…À„Æ!qü¼‰ñŠYccfsÚ•}ÒÈhž8:G -‹úA€û'ÐÞQŒÇJÁ÷®]ß÷ßIÁ÷åk¶E阪_ _‘]mu_\uû%›ª¿_ @€ @€��pø5P @€T¡@ó‚ �,ä�¥ÝÞÞ™Úk¨ÂµD€@� ŒÖÇ<>Ÿ=.fµŒŠÖçvdŸ4nd Þn¬Ño m Pƒ¥]ÝŸH!÷GW¤Ð{ ¿?ü䞯�¯Þmí�5(¢ej@àÙô�׿ZˆÂgž\zéƒ5Я  @€ @€À€ øÄiÀèML€ @€Õ'°¨Ð¼`óë²<ÿ_©·S«¯? PKÇÔż�qäœq1»eô¯‚ìÍ“FÇàAõµD¡Wè�@1Ï»vwáŽï�¦ß—­Ü»Ú:z0’S  PÆyþý(d—®Z2ö‹ü:‹2^*¥ @€ @€@e ¸W溩š @€ÊH`Ò™>h÷î÷¤ÝÚ/LeÍ-£Ò”B€�—ÈÒ;„S'‹ãçMŠC¦7ÆÔÉ#£i¨hž<:G}Ùë�@€º#�rï±bí¶x$íö^ÚõýÁå›â—Ë6Æ«·E)ïF€�JH{=Xˆøô¨�c¿vÿý‹Ú*±5 @€ @€�rp/ÇUQ @€T„@Ëi5g��IhŸ› SE+’�šh¨+ı‡Ž�cžs[£uò¨f“Æ�Œ¬”tw#@€ý,°cW{ÜÿØÓqo »—說O¬Þ�E¡÷~^ Ó p`«³<»dgçà+7ÞöÛl(W @€ @€>µò=@€ @€z(0õÔ‹æ‹�š.{gº×÷ðr§ @ _Æ7‰S_ÙG̳[£ybÚ™}âèÔP×/ó›„ì¯À³»:âþÇ÷„ÝŸ½?¾Jè}=]G€@¿ lÉ"ÿ\}}á3OÜxÙº~�Ùd @€ @ ŠÜ«h1µB€ @€}+ÐrêÇEgþg‘Å›úv&£ @ g£† ŠÓŽž’vgŸM3šc⸑=ÄÙ @ Œö„ÞŸîÚåý¾Çö„ßK¡÷ŽÎbW­4jX`wú IWåQøÇUK.YVÃZ'@€ @€û% à¾_l."@€ @€�Èš,<½�þ,"?­†úÖ*e*0rh}œxø¤8öà‰1wÚ˜˜žÂì­“£®®P¦+‹ô�À®¶ÒNBï÷.ÛØõuÙÊ-Bï}ÃmTöO ˜>�¿.+ħVÜô™»öoW @€ @€�Úp¯½5×1 @€tK`Q¡å”M¥�ÚS°=ŽíÖ%N"@€@/ \Ç2.Ý'Æœ©)ÌÞÔ˜íccè�†^žÉp @ :J¡÷^z/íöþH)ôÞa§÷êXa]¨`�wøÉÍÑn§÷>–7</x<…Ýÿ1o«¿jÕí—ì|Áë @€ @€�šðqYÍ @€ @€@m Ì<ャw·ùpÙ…é7„O¬m Ý ÐW õYwè„8ñ“ã�cczScLM�ö†úº¾šÒ¸ @€@Jáö{Ýw>°.î¼müìÁu±yûîŽâtôT [Ÿåùg²bûçVÜúùÍ=½Úù @€ @ Ü«qUõD€ @€/+0ãô &µ·çFN'�zÙ œ@€�ÌlgÓG̳šcZó˜1lpFp* P�®Ü’ïkSà}]ü4}]¹n{äy9T¦ªPà™ô×Ë•‘å—¬^²xUö§% @€ Ðm÷nS9‘ @€ªA`Êi™VW¬û“Èãý©Ÿ!ÕГX�QÃâ´f?~Þ¤˜;mLÌH�öñcF lQf'@€úD`Ãæ�]A÷çï>±)::‹}2—A ¨Y�ö<²¯Õ‹Ÿ^qËâjVAã @€ PÓî5½üš'@€ @€@íL=yá¡y!þ4}Hüû©ëúÚé\§ô¶@ó„añºZãèƒ'ÅÁ3ÆÅôæ±QWð6[o;�T‚À³»:âç¯O;¼§]ÞX?h}ìØÕ^ ¥«‘� H?e\ßY(~jÍM—ßVå*‘ @€ôš€OÞz�Ò@ @€ PŽ­§\plùŸ¥Ú~·ëSå/0mÒðxmW }bÚ¡}O ½ Ð^þ §B 0�Å<xâéx_—ï{Bïë6=;•˜’�jÈòì¶b!>¹zÉeßN}åÕÔ›^ @€ @€ÀÞÜ÷¦â5 @€¨t�¬yþy§fQøóÈâôJoFýô¯À¬æ‘qÖq-qÔAºíӚƆ@{ÿ®�Ù @€@5 ¬X»½kw÷Ràý§éþØÊ­QÌåS«i�õB ~‘e…¿[¹äÒo¥9ýEÒ�ð¦"@€ @€�þpï_o³ @€ @€@Ÿ ,*´.ØòÆhYé€ @ ¶lßw>¸.~öÀž]Þïytc´µwöÁL†$@ Šî‰Bö‰U7�ù¯ˆEÅ*îSk @€ P£>©«Ñ…×6 @€ªJ`Á¢ú–Øü{‘ç¥`û¡UÕ›fèU�Rný�i£ãÌc[∹ãcδñ1uJ)ÐÞ«ÓŒ Ðm�R¸ýžG7ÄOïO¡÷Rð=ÝK!x7tCà¾ô !>±zéØkÝ»¡å @€¨ÝUÌR)” @€~K Û›‹›Þ•‚©•ŽÍú­ã^ @ æJÁõÃf6ÆïÓ‡ÏÙ³C{Ëd�öšÿÆ@€Ê\à‘›»ïw>°6}]«Ö?Sæ+��x ýì󉕞º&®¹Æ¯„àÅ0= @€¸€€û�� @€ú[àœsêZ64½3íØþ×iê9ý=½ù(_�BJu1»1N?¦%^1{\ÌM;´·Ln,ß‚UF€è†Àk¶Æ­w¯‰¥¿X?¾wMlÛÑÖ�«œB€@ <”Þ+¹xUaÜÆ’E5Ø¿–  @€ @ JÜ«d!µA€ @€�šHÁöÖõ“ßžGö7©ßƒj¢gM ð’¥ÚŸ=&^sl)Ð>>æLÍ“Ú_ÍA @ ¢Šyw?¼!ÞWÇÒtÿùC룽£XÑ=)ž�^x4ϳ‹WÆ\-èÞë¶$@€ @€�~pïdS @€ @€À� ,*´Îß|N1Ëÿ&ý {È�Žæz*[`N˨8û¤iñʃ&tÚ›&Ž®ì†TO€8�gwuÄí¿|jOà=íðþèÊÍiçÐ¥T“Àcé}”¿ŸøÌ®¿ë®+Û«©1½ @€ @€@u ¸W÷úêŽ @€.°¨Ð¼àé·dy׎í‡Ux3Ê'@`?ÆŽo?}fœxø”8xÆø˜<~ä~Žä2 @€@õ ¬ÛôlÜ’vv/íð~ËÝkb}zîF€@Í <YüŸÑÆ~õþûµÕ¼ @€({÷²_" @€ @ &²–SÎsê|Qº^“š&PÃ…BÄ‚W6ÅëO˜G<)f¶Ž‹º‚·±jø[Bë @€À<üäæXšvv/…Þï¸ï©(íøîF€@Í ¬È³ø¿C‡æ_^öÝÅ»kVAã @€ Pö>,û%R  @€jJ k�ÁÙy–ÿmêúÈšê\³j\ uâðxë‚qüa“cÞìIÑ8jh�‹hŸ ÐûÅøÙCëöÞSèý—Ë6Fg1ïý‰ŒH€@¹ ¬Êòød]aÛ¿._rÕ®r/V} @€ P{îµ·æ:&@€ @€@9 dͧ.|]VÌJÁö£Ë±@5 лƒ ñÚã[âÔW6Çás&Ƭ©ã£`—öÞE6 @àe¶>³;n»gM×îî·Ü½&ž|jÛË\á0U&°&õóÉh«ûâªÛ/ÙYe½i‡ @€*X@À½‚Oé @€¨�¬å”óΊ(,J½¼ª úÑûÈÒ»P‡Lo8aj}Ȥ8t–]Ú÷Aåe @€À€ ¬\·ýW»»ßvïšØ²}÷€ÕbbúU`múmzŸÊ·ï¾rÍ]W>Û¯3›Œ @€ìE@À}/(^"@€ @€�>ÈZç/ü�<ëÚ±ýø>ŸÍ ˆÀØ‘ q櫚ãÄç¤@ûĘm—öY“ @€öG Ï#î]¶¡+ð~ëÝ«ãg®�¶öÎýÊ5Tˆ@úc¿®�gŸnÒpźü㎠)[™ @€ P…îU¸¨Z"@€ @€@ dͧžZ¡3ûÛ´3؉e\§ÒØ�Ò.í‡Ï¯=¾%Ž:hb:{r4Žº#¹„ @ Üvîîˆ;î[Ûx_ú‹UñÈŠÍQ Á» P•"�¿¯/lûÂò%WíªÊ5E€ @€e- à^ÖË£8 @€T�@Ë‚ D^üÛÔÑüêéJ' T¯uKœrTS–viŸe—vß @€�šXµn{üàŽñ?w<?¹mttk¢oM¨-�|e–Ç¢•…q_�%‹:j«wÝ @€ @€À@ ¸¤¾¹  @€ P­§,<9�¬l?µÚÕ"�š˜1eD¼uÁŒ8öÐI1oö¤m—öšXwM @€ö%°}G[Üt×Ê®ÀûM?[ÛÒs7ªJà‘ôþjõÒ±×F,ò¯Yªji5C€ @€�òp/ÏuQ @€*^ éÔóN,tþ6²8½â›Ñ�¨+dq櫚ã5ÇO�#æNŒ™-ã¢�^s#@€ ðb�ŽÎbÜqßÚ´³{ÚÝý§OÆŠµÛ_|ŠçT®À/"бêæË¿—ZÈ+· • @€ @€@¹ ø$²ÜWH} @€¨0�¦“/|e!ëü?‘e¯©°Ò•K€À &Ž¿wÆÌ8ñˆ¦8,íÒ>jÄ�õ� @€@÷~rs º§°ûOÆÝoˆbÚÚ��ÊHŠo-Dþç+o^|Kew¢z @€(W÷r]u @€ @ ÂZO[8«Ø™]œ~Ðü½ +]¹<'ðʃÆÇ;ϘÇÌ›³ZǦ§â­#ß @€½'°qËÎøa »ÿ íî~ëÝ«cçîŽÞÜH €@öÝb^ü‹5K§�ÝÝ @€ @€@ï ø”²÷,�D€ @€�š˜qú“ÚÛ‹™’°ç&€úšDÐ4� ("Î8º%Î>yZ;¯)š'�®ÐN”M€ Pi»Û:ci ¹—vv/…Þ7lÞYi-¨—�çRèàšÎ¬ø×k–\þ @€ Ðh  @€Ô Àøÿ÷È! »>y|,µ?¼ ´L "† ª‹7�45ÎxUkuð”˜4~dEö¡h @€�êøÅÃëSؽ´»û“ñÈŠÍ‘çÕÕŸnÔ€@1õxUg]çß=õ£Ï>Yýj‘ @€úP@À½q M€ @€�j˜7oÑ ­ã7ýqêí¯Ò}B5ö¨'Õ&Ð8bPüîüiqÊQMqä!M1®Ñ¿I©¶5Ö @ šV®ÛÞt/Þï¸mtt”r³nTˆ@[DvEC}üŸ'n¼l]…Ô¬L @€(3÷2[å @€ @ |ZOyúyd§g–o�*#@ $0~ôàxÛ©Óãä#šãð´S{ãÈ¡` @€TœÀömñ£Ÿ­L�÷±ä®•±-=w#@ "väY\Ú…\¾äÒ-Q±"  @€ @ lÜËf)B€ @€�²ÈZç/ü�<Ë>™*<ªl«T1iìÐxÇé3âÄÛâðƒ¦Äˆaƒ© @€¨�ŽÎbüä¾µñ?w<™î+¢´Ó»e/°%²ìS탯ûÁ?î(ûjH€ @€e! à^Ë  @€”§@ë‚óŽÉ‹…OF§—g…ª"@ u°xÇ3ã„jÅÜ)1tp @€5!ðÐòM]A÷¤Àû½�nŒbž×Dßš$P¡k³<.õôعÿþE~C….¢²  @€ Ð_îý%m @€T�@ËüóçdY\œ¢o¯ ²•J ff5�Œwœ63ŽESÌ›395ÔÕLï%@€ °7�u›ž�n}<®_úxüüáõ!ë¾7%¯x�ô^ÓòÈcÑêIOý{\sMçÀW¤ @€(G÷r\5 @€ @`€¦/øðäö¼á¯³Èÿ(•P?@e˜–�½2}t¼ãôYqܼ)qȬIQWWØËY^"@€ @`Õúgâ†[�ÿN÷ûÛ(ìî[‚@ ¤ ûƒYžÿ媥‹ÿ+•ç×/”á)‰ @€) à>�úæ&@€ @€@™Ì>ná¨�C²�¥?šJV&e)ƒ@Í 9glœsêÌxÕaSbîô‰Q(x+§æ¿) @€ôH`ùSÛºvu/…Ý~r“°{�ôœL ò¸£XWüèš›.¿­f3 @€Tˆ€OE+d¡”I€ @€�¾˜ýÚ…ƒwíÈÎ�,þ2�?¾/æ0&=8nÞøxÛ‚YqlÚ©}fëøÈ¼{Ó3@g @€؇À£+¶¤]Ý‹ëSØý±U[÷q–— �<®‹BÝÇW-¹dÙ€ÌoR @€(+‘–Õr(† @€ý%°¨Ð²`óïçyþ‰ôƒáôþšÕ<ü¶@)À~Ê‘“ãÍógÄ1‡N‰iÍcû$¯ @€ Ы÷?þtWÐý¿—>+×mïÕ± F€À~ ´§M>—×u~bõ�Ÿ}z¿Gq! @€T¼€€{Å/¡ @€ Ð#�¬eÁù¯‰<>™®:¢GW:™�^8åÈ)ÄŽf+@IDATñöÓg¦P{S4MÝ«cŒ @€�î Üóè†øÖÍ�Ç ·>OmÜÑý �I€@ d[³,¿xðÐ|ñ²ï.ÞÝG“– @€ÊX@À½ŒGi @€èM�–“¾* ñ©ˆlAoŽk,º/pðÔÑñÞ7'Õ­S»¡3  @€è�;Xÿ½ô±øömOĆÍ;ûeN“ °w�¾rée_Og¤§n @€ P+îµ²Òú$@€ @ fZO[8+ïÌJ;¶¿­f4N`&4‰÷½á 8íØ©qÈ̉‘eÞŽÀå05 @€�n ó<~ò˵]a÷ïþxylÚ¶«[×9‰�>ÈãŽB!ûØŠ%—ÝÚ£’ @€ÊPÀ'ªe¸(J"@€ @€@oÌ<ャÛÚ‡þEÚàêÂ4^CoŒi º'0dP]¼ëÌYqÖ Óã¨Cšbð úî]è, @€ÊN ³˜Ç­w¯Žo-}<¾ûòض£­ìjT�ÚȾyþñUK?óhmô«K @€Ô®€€{í®½Î  @€¨V�sΩkY?åý©½‹Ó}Bµ¶©/å&PH;³¿þ„–xó‚™ñªÃZ¢qÔÐr+Q= @€ @{G1–ü|U×Îî?¼cE<³³ýGt9=èˆ,>›×u~bõ�Ÿ}º‡×:� @€*D@À½BJ™ @€èŽ@óüóN˲Â%éÜûs¾s8p�W2>Þù;³ãøÃ[¢erã�h @€*B`w[gÜxçŠv<~ô³•±swGEÔ­HÕ!�mͲüâºØvùò%WíªŽžtA€ @€Ï ¸?/á+ @€*X eÁE³#ïøtDöæ nCé*F`Æ”‘ñž³fljG¶ÄÁ3'EÚ¼Ý� @€�xvWGüÏOÆ·RØýæ´Ã{[{g kh�@ÿ äË YüÙÊ%ŸùÏ4kzêF€ @€Õ àã×jXE= @€ P³3Ïøàè¶¶!™~5ó ¡¡f!4N ÆŒïþ�Y±à˜Ö8òàæÔP׳š‚ @€�Jؾ£-¾wûò¸î¦eqû½OE1—¹­´5ToE ü´�e]±ä²[+²zE @€ @€Ào¸ÿ‡' @€¨�sΩk^7ùY–}"U<¡BªV&�Š2¨.~wþÔxÍñSãØÃZcÔˆ!׃‚  @€8�Uë¶Ç57>_O÷Òc7úZ ûFäùÇW-ýÌ£}=“ñ  @€ @ ïÜûÎÖÈ @€è�æùç�–eu—¦ßºüŠ>™À j\ .ýnóGMŠ7�<#Ž;¼%š&Ž®qí @€ Ð?N»¹ý‡Çwn[;wwôÆ�Æ @`ïéXö¹bVÿ‰5KþiãÞOñ* @€”³€€{9¯ŽÚ @€ ð�–ùçÏIO?Y¼é/{H€@/ Ìmï~Íìxu µ4sb/�j @€ü¦À3;Ûãú¥�§°û#q×CëÒfÓ¿yÜ3zK ÛšeùÅu±íòåK®ÚÕ[£‡ @€ú^@À½ï�Í@€ @€�˜¾àÂÆöèüË,ÏÎO5Ð`.&@à7F mˆ?|Ýì8ýØ©qÄÁMÑP_÷Ç=!@€ @€@_ <¶jk\sã#qí��ƺMÏöåTÆ&P³éß�,/äÙÇW.½ìë Á?)©Ùï� @€ PIî•´Zj%@€ @ ¶,ªo.>ýþ,Ë.N��¯­æuK ï …ˆ7¼zZ¼õÔ™qìa-1røà¾›ÌÈ @€è†@1mã~ó]«ºvuÿÁ+¢­½³W9…� ¤?f‘6�XuËe÷öè:' @€ @€@¿ ¸÷;¹  @€ ðòͧžzVÌ.I›J½âåÏvÝ8læ˜øÀ‰“Žl�IãGvçç @€ @ ß¶>³;¾¹ä±øÏ>÷=¶1RöÝ��Þ(FŸ�Ýu½êöK6õÞ°F"@€ @€�ÞpïMMc @€ @àZæŸ?'ÏòÌ"{ãår’À¨á ñÇo>4^w⌘=Õ/BðMA€ @€@e <´|S×®î߸iY<½uWe¯Zå-ðtžç±zÒÚ/Æ5×ø• å½Vª#@€ @ ÜkpѵL€ @€@ù L_pac{^ü«ôCÚÂT]CùU¨"•%0ÿˆÉñþ7'¤ÝÚ‡öGª²VOµ @€¼X £³7Þ¹2þó‰›îZÅŸâ9û'pw!Ë®XrÙ­ûw¹« @€ @ /ÜûBÕ˜ @€è®À‚EõͱéYŸH—Ø^º»nÎ#°�1#Źi·ö³^=#f¶ŽÛË^"@€ @€@å lܲ3J;º—Âî�¬Ø\ù é€@9dñµ(Ôýéª]²ºÊQ @€j]@À½Ö¿ôO€ @€À€ 4-XxF!Ï.I6`E˜˜@… dé��3ŽiŠw½fnœpÄÔ6tP…w¤| @€t_àžG7tÝÿ{éã±õ™ÝݿЙìM`GdÙÅC†/YöÝÅþ@íMÈk @€è'÷~‚6  @€žh=má¬èÌ.É#Î~þ5_ è™Àä±Cã}o˜g¼jzÌ™>¡g;› @€U&ÐÖÞßÿÉ“]a÷[ï^�Åô®ƒû)�/Ë qáê›{?p @€ €€ûºœ @€Ýh9ᢡ1¸óO#��§kw÷:ç °G ¾.‹××oY0+ŽO»µ�î�‘ï  @€¼Xà©�;âÚ=×üðÑxbÍÖöœ�î |'ïì¼hõ­Ÿ}¤û—8“ @€zC@À½7�A€ @€�—h™þë"‹Åé´™/sªÃ¼H uÂðxÏkgÅ‚c¦ÅÁ3'½è¨§ @€ °/�;XÛµ«û·o}"žÙÙ¾¯Ó¼N€À¾Ú#ËþyWûà¿ßxÛ?lß÷iŽ @€ @€@o ¸÷¦¦± @€ ð"�)§}dZ]gáÒˆìÍ/:ä)/!PȲ8óUMqÎi3ã„#§ÅÈáC^âl‡ @€ @फ़ÝÕß¼yY|å†â�'6½Ô©Ž °w�§RÐý¯ZrÙ×Òá|ï§x• @€zK@À½·$�C€ @€�Ì›·hЖñ›>š~èú«ôòÐò��—7jP¼ÿìƒâôc§Å¡³'¿Ä™ @€ @€ÀþÜùÀºøÊ·ˆïÜöD´w÷gרe�‹……kn¹ô経 w @€ôµ€€{_ Ÿ @€�šhZ°ðŒBž]ž?¨æš×0�ýH›µÇÉGLŠw½fnœxäÔ=Ò¿ ÙF— @€ @ G·ìŒÿøþÃñïß}0ÖlÜÑ£k�L ÆJ;¸ÿK1kø‹5Kþic�[hŸ @€}" àÞ'¬%@€ @ ZN»¨9ëìüçô ×Ûk±=è©Àð¡ ñGoœg�0#�59ý¦ïžŽà| @€8P�bžÇ~òd|õÛÆ­÷¬ŽôÔ��î lIofüÕªsE,YÔѽKœE€ @€ÝðÑqw”œC€ @€�—8úè6¬>ôü<Ë¥ÓF¼Ä© �Ž>x||àìƒã¤£¦Eã(»µû¦ @€ @€@¹<¶jk|õ;Ä57>Ûw´•KYê PæÙ/SÐýüUK.]Ræ…*� @€# à^1K¥P @€ÊQ uþóS°ý³©¶Ãʱ>5(�Áƒêâ}¯ŸgŸ<3›3Åníå²0ê @€ @€À^vîîˆoÜ´,¾rÃñàòM{9ÃK¼X …/¾Þ™×lÍÒ^ùâcž @€ @€@ÏÜ{æål @€t Ì8ý‚Iíù§Ó“?@B€À¾�Þz˼8åèi1fô°}Ÿè @€”¥À�¬�«nx0¾ûã'¢½£X–5*Š@ ìÈòìoVÆ\Ku”Q]J!@€ @€@E ¸WÔr)– @€�8眺– MŠ<.ŽÈGx= P†õuY¼û¬9ñ¶ÓæÄás'§ÝÚ½ýP†Ë¤$ @€ôH`ã–�qõ÷ŠO÷§6îèѵN&Pƒ÷D!ûãU7]vG ö®e @€°€O˜˜Ð @€ÔŠ@ó‚…ǧ˜>—ú=ªVzÖ'�žL�4".|ÇáqÚ«¦Å¸Æá=¹Ô¹ @€ P!�Å<~ð“'ã«ß~ n»wMäy…®Lý/�þxdW4dÙŸ/_ré–þŸÞŒ @€¨\÷Ê];• @€ ÐOM >:¾�·ÿß4ÝúiJÓ¨(�S_99>ðÆyq‘S£¡¾®¢jW, @€ì¿À²U[RÐýÁ¸öG�Æömû?�+ T±@ú7 ë ‘_´òæÅÿ/µéŸ„TñZk� @€�Þpï=K# @€ Pu‹ -§l~úÜé“©µ±Uמ†€@CCxÖœxËisâ°9S`$— @€ @€@¥ <»«#¾qÓ²øJÚÕý¡å›*½õè+�DV÷‘UK.YÖW— @€Õ" à^-+© @€zU`ê©ç],ÆçÒ ¯êÕ� F ÂÆ�ç½å�8ëÄYÑ2¹±Â»Q> @€ô¶ÀOï_›‚îÆwüD´w{{xã¨t�ÝY–_é#s³BÝ•i¿öSʸL¥è7�AõY¼÷õsãM§ÌŽWÌ�Òoóšˆ @€ª[`Ùª-ñÕo?×þèÑØ¾£­º›Õ�î lÊòüOV.]üåt‰Ò}7g @€ PÅîU¼¸Z#@€ @ॎ>úƒ kG ùXúÁèoÒ™ƒ_úlG T¿ÀøÆ!ñ‘·g½zV´Ln¬þ†uH€ @€"ðÌÎö¸ú{Å¿~ë¾X³qÇ€Ô`Re(pK¡˜Ÿ»â–Å”amJ"@€ @€@¿ ¸÷+·É @€(�ÖS.86�ü‹©žÃË¥&u(�Ãf6ƹo>4;3F�2Pe˜— @€jL £³ߺùñøÂ7î�—oª±îµK`¯íYäŸÎÛê/^uû%;÷z†  @€ Pî5°ÈZ$@€ @àדÎüØðúÝm—~º0½Zøõ�Ô–@–þ¼ö¸æx÷kŽã�˜ õuµ [ @€(+�¥¿XW\woÜzÏêÈó²*M1BàñÈâ#«–|æ{1¹9  @€ 0Ðî½æ'@€ @ ßZç/<³˜e_H?Mï·IMD ÌÕgñÞ×Ï�7/˜‡Í™RfÕ)‡ @€j]àþÇŸŽ+ÒŽî7ÜúDttk�Cÿ5.�ÞÇüz¡X¸ðÉ[.}ªÆ)´O€ @€@� ¸×Ø‚k— @€@- 4Ÿþ‘q…ŽÂ?瑽§û×3�’À¤1CâÜß=$Îzõ¬h™Ü… @€”µÀê ÏÄ¿y_ü¿<Ïìl/ëZG �¶eyüùÊIO]×\ÓÙÇsž @€e! à^Ë  @€úH k™Á;#Ë/MãOè£9 K ¬Ÿ9&þøw�ÇΈQ#†”u­Š#@€ @€/ض£-þí;Æ—®¿?ÖozöŇ='PKwóü�×,]ü‹ZjZ¯ @€Ô¦€€{m®»®  @€T½@ÓIL-ÔåŸO�¾®ê›Õ � dé§ý×ßï>ëà8ÑP_÷¢3<%@€ @€•%ÐÞQŒoÜ´,®øÆ½±lå–Ê*^µzO ˜Þö¹lWÖñ×–|î™ÞÖH @€(/÷òZÕ @€ p çœSײ~ʇÓ0ÿ7݇èp®'PI õY¼ïõsãÍ fÇas¦TRéj%@€ @€ÝøáOWtÝzÿÚÈón_æDU#�¾í—çYþGk–,þaÕ4¥ @€¼@@Àý @€ PÙ­ Î?,/Æ#‹ã*»Õè™ÀÈa qáۋן<+š'5öìbg @€ @€� ¸û‘ qÅu÷Æ÷n_�EI÷ ]Feˆ@ÿZ…�-_r©_kp Ž®%@€ @ ìÜËnID€ @€@Of¿váà�Ïf‘~Àùxº¶¡§×;Ÿ@¥ L�4<>öûGÆéÇ͈Q#†Tjê&@€ @€$°bíö¸ò›¿Œ¯ÿÏ#±swÇ�åb(°¦ù¹kn^|}Ö®d @€ìU@À}¯,^$@€ @ RšN=ïÄB±ðÅTïÁ•R³: ¨À¡ÓãOÿà•1ÿèiQ__w Ã¹ž @€T…Àæí»ã+7<WÝp<½uWUô¤ =¸º˜5\°fÉ?mìÁ5N%@€ @€@Y ¸—å²(Š @€�—˜}ÜÂQ;‡>™Eþ¡—;×qÕ"pÔÜqñ'ï:*^}äÔ¨«+TK[ú @€ @€½*°»­3¾~ã#ñ/ÿu_<±fk¯Žm0e.°!Ïã¼ÕK?sMª3/óZ•G€ @€�} ¸ï“Æ @€ÊU uþo̳üs©¾ær­Q]zSà¤#&ÅùçÇÞ…‚å{ÓÖX @€ P½)èß»}y\ñ�{ãç­¯ÞFuFà·òoÖë>üä-—>õ[‡¼@€ @€� ð©x,’  @€Ø#0}Á‡'wæõŸIŸMžÃ„@-œylKœûÖÃâ˜y-‘ù ¾–\� @€ ÐGw>°6>Ý/ãÆŸ®ˆb)ùîF ú¶dY~ÑÊ%‹¿’ZõM_ýë­C @€U%àãñªZNÍ @€¨Z�¬uþÂ÷æYöO©ÃƪíRc’@)Èþ¦“¦ÆûßtXyp @€ @ [µ5®ü¯_Æu7=»Û:{qdC(S�<ÿ~±Xøàš[/[Q¦*‹ @€¿% àþ[$^ @€ @ œZO[8+ï,\™6:­œêR �Þ(ÛßyúÌx÷ë‰WÌ�ÒÛÃ� @€x�ÀÆ-;ãK×ßÿö�cËöÝ/8â!�ªx&‹ü¯¼yÜ"«²CM @€ PUîUµœš!@€ PEçœS׺~Êéwçþ}êjHu¦¿!P_—Å{Κ¿wæÁqȬI¿qÌ @€ @ ožÝÕ_NA÷ҮíêÛÉŒN`à–FV÷þUK.Y6𥨀 @€ûpß·�# @€ �@i×öbgvUú�å¤*Á´ú\`ð B|àõsã-§s§OèóùL@€ @€ì[ tÿÊ·ˆ/|ãÞxz« û¾¥©��YžýÕÊIk.�k®é¬‚~´@€ @€@ ¸Wá¢j‰ @€@å ,*´ž²ùÜ<òO§†Un*'°o�Cêâ�ÞtP¼yÁA1³uܾOt„ @€èw��»SÐý†tO;ºoܲ³ßç7!�~ÈãŽB]ÝûWÜtÉýý6§‰ @€ ÐM÷nB9� @€�¾h:é‚©…Bþ¥Èâô¾�ÉèF`ìÈAñÁl?{þœ˜Ú4v`Š0+ @€ Ð-�RÐý«ß~0®H;º ºw‹ÌI•)ОeùßMܾûSwÝue{e¶ j @€ªQ@À½WUO @€*K k�¿ð½y–]šÊYY¥«–ÀË ŒÙç½åÐxýü¹ÑwbCÃÿÏÞ}€ÙU— Ï�š©é É„ ¨(H‘žk�µ±«|‚Ø Ö$duu×]t? I(.‚€.  vÚfP@:$Ô顦·Ifîý΀.~’�;ÉÌÜö;Ï“'wÎù—÷ýýoò̹÷½ÿ[ûôÇ?åßKKÅ/0´µ.>ÿÞýã�~U jm(þ€EH€ @€ì´@w¡ûÿáÁ8çç÷…B÷�fÔ±xr¹ˆé5ÉÚ/ÛͽxId @€ÊY@�{9¯®Ü @€™@Û1SÞÙ\wqûÐ" M8vZ`ØÀúøÂûˆãÓÂöÖ¦ú�GG @€ @ ô¶líŠKþðÐó…îO>·¡ô1�—x ›Í¼ùMgÞõòÍ\%@€ @€@ï (pï]O£ @€ ° �¶#¦ŽÚìY¹“·qÙ)%)0rЀø·o9j¯hj¨+ÉM€ @€ôŽ@w¡û¥×>g_yo(tïS£�@g’ä¾±$†œíÓ:‹&*� @€ PÖ ÜËzy%G€ @ ð£'Ny[’Ëý(�ddá£�]ØmHC|ùCÅ›�Ø+Ô×ìú€F @€ @€ÊF`kg6.Mwt?ûç÷ÆŠgíè^6 +‘n�[#X:wæ£8 @€ Ð× ÜûZØø @€*T`Ï7žÚÚ±µ~zzÓñá %�v™ ŒÖ_ùðÁñÆÃ÷ŒúÚê2ËN: @€ @€@o tºÿ캇ã¬+î‰å Ý{“ÖX…ؘDò¯KæÌ87 #WØPÌN€ @€@9 (p/çÕ• @€� ì>aÊ›²‘½ "S LK ×† Ó>vHwÔ^Q[£°½×` D€ @€*@ 3-t¿ìú‡ãì+î�eϬ¯€Œ¥X¹ÜµQ]ýÑ¥ÿ3}YEä+I @€ú]@�{¿“›� @€@ù ›øé¦Ú\Í÷’È}ª|³”Y¥´4ÖÄW>tp¼câ«£q@m¥¤-O @€ @ º Ývý#qö•÷ÄÒ§º÷±!û_`U’ħ—´ÏüYÿOmF @€Ê]@�{¹¯°ü @€ô“À˜ñSÆç’Ü…ét{öÓ”¦!Ð'õuÕñÅSö�w½ñ51¨¥¡Oæ0( @€ P™Ý…î—ßðHœuå½±ô©u•‰ ë²H_¾<é¨þôÒ[¦¯,«Ä$C€ @€@A¸”ßä @€J_ íˆ©’šìwÒ72¦¤Ù¸Ç(ý%­Ø j«“˜|âëâ=oÙ'Fm®X‰ @€ @€}/ÐÙ•�+ox4f]qO,QèÞ÷àfèk�é+ÃYÚ>ó}=‘ñ  @€¨ Å'•±Î²$@€ Ð'£'N:<É%§ƒ¿ºO&0(�~¨N Û?þ¶½ã½Çï{ŒÜ3š‚ @€ ð‚@w¡ûÏo|¡Ð}ñ“vt÷¼(m�\$çvÖÕüëS×ýß ¥�‰è  @€(´€÷B¯€ù  @€” À+�ŸT·yC2-Ý•ç iø™LAÈ¢*“Ä{߸g¼ÿ­ûÄk÷A„ @€ P0�®l.~vÝÃ1ýһ⩕ ‡‰ ìº@nA.‰÷/kŸuë®�e @€*U@�{¥®¼¼  @€ì¤Àîã&í“Í$—¦ÝØÉ!t#PP�$½~Û‘£ãcïØ/Ú·­ ±˜œ @€ ð·›·tÆ�®žçþâ¾X·aËß^ò˜@) dÓ"÷Ó>3ø›óçOóD.¥•+ @€�"Pà^$ !  @€% �Œ™0åS¹È}?�µ¾â"�—½ÿðøÌ»ö‹£Ú#’îJw @€ @ V­ëˆ™?»;~ò»cËÖ®"ŒPHò¸;“©zÿâÙÓççÕZ# @€üEÀ»ùž  @€ìP`ä¸IÃj2ɹˆ·ï°±ŠP`¿W Š©'ïÝ3jª«Š0B! @€ @€^*°ôéõñŸ?½#®n,²¹ôÕ9�ÒèHrÉ——Ì4=bZ¶ôÂ1 @€…Pà^us @€(!�1ã'½9—$§!�,¡°…Jày�±#ãó§o9òU1 ¾†  @€ @ $xbeœ~ÑŸcÎ]KC�{I.¡ s1§:“ùÐÂö3 @€ @€ÀޏïHÈu @€*ðÊã'ÕulLNO÷…šZ¡Ò.a�A͵ñÅ´°ýí÷Ž–¦úÎDè @€ @€�þtߊøÎ…Ž{}æÅ“(�ui‘Ê”%sf^”†ì+ JgÝDJ€ @ ß¸÷;¹  @€¿Àîã&í“Í$—¦‘PüÑŠ�À‹õµUñ¹“÷‹wýÃkbØà¦/xD€ @€(#�_ßôxüçOïŒ'–¯)£¬¤R1¹¸fkç–SŸúÓŸ®˜œ%J€ @€@�¸÷ˆKc @€e/�Œ™0铹H~�fjÛë²_îòI°º*‰OžðšxïñûƘ‘Ë'1™ @€ @€¶#ÐÙ•�KÿðPL¿ìîxvõ¦í´rš@Ñ <“�ÜG—Ï™õë¢�P` @€L@�{ÁèML€ @ ¸FŽ›4¬&“\�~/ìÛ‹+2Ñؾ@’ÞÕžò¦½â#ï|]¼jì°í7t… @€ P¦7wÆy¿¼?þëªûbý¦­eš¥´ÊX`Vu²ö Û/Ú\Æ9J� @€� (pï!˜æ @€ÊQ`ÌøIoÎ%ÉÅin#Ë1?9•§À?>&>sâ~±ÿÞ£Ê3AY @€ @€z ðÜšÍqæewÅ%é®î[;³=è©)�‚ ÜW•Ëœ´hî™< @€ P Ü‹bA€ @ 0¯<~R]ÇÆäôt×ö©…‰À¬z.pØ>Ããó§¼>Û÷èÞÁÝA€ @€ ð¢Àâ'×ÅwrGüæ¦Ç#›K_ùs( �M‘Ää¥í3/HÃõÄ-�5% @€�>P Ðg´&@€ PÜ»�›´O6“\šFy@qG*:/¼flk|éÅøC^UU, @€ @€/#pÿcÏÆéÞ7ݳìeZ¹D ¸Ò"–+«’Ì© ÛÏ\]\‘‰† @€�þPàÞŸÚæ"@€ Pɘ “>™‹äi8õÅ’(l_`ÔÐÆøê‡Š7±WÔÕVo¿¡+ @€ @€/˜{÷²8ý¢?ǼǞ{É5'©Àâl.N^>w柊4>a @€ ÐÇ ÜûØð @€ŠI`ä¸IÃj2Éé÷»¾½˜â �m ´4ÔÆW>|`¼c«£±¡n[Mœ#@€ @€ÈSàêöÇâ{?½#–<µ.Ïš(¨@WZÐò�%ÃW|'®¼²« ‘˜œ @€�~PàÞïä&$@€ P�1ã'½9—$§³�,Lf%�Ÿ@u&ÿzÊþqòqûÄ Ö†ü:iE€ @€ °C�ÎÎl\ü»bÖå÷Äsk6ï°½ .�‹9¹Lî}ËÚg--x, @€ @ ß¸÷µ‰ @€Fà•ÇOªëؘœžîÚ>µ0˜•@þ'óŠ˜|Ò�±ÇèÁùwÒ’ @€ @ Gë7m�sq_œõý±qsg�újL +“$óÑ%íg^]€¹MI€ @€@¸Ý” @€úK`÷q“öÉf’KÓùè¯9ÍC`g|õ�øÚGÞ‡¼®mgºëC€ @€ °ϬÚÓ/½+.»þáèÞÝÝA ˜ÒM\ÎI¶T}~é-Ó7sœb#@€ @`׸ﺡ @€£@2f¤Oæ"ùA\}1(&ÝC[ëã›§Çõª¨©®‚B€ @€ P�Ç—­‰ïþäŽøýŸžˆ\ZEì PÄó2™ª“Ïž>¿ˆc @€»( À}u'@€ Pl#ÇMV“I.H߇z{±Å&¨Îdâ ïÛ?Þ{ü¾ÑÚ<௧ýM€ @€ P@�{y&¾yþmqûO0 SØ¡Àæ\S—µÏü¯´¥�dì�K @€¥' À½ôÖLÄ @€¶+0zÂäcÒ_ò/MŒÜn#XàÄc^SN>(ÆŽTàHLO€ @€ °-�kæ<ß¾ðϱâÙ Ûºì�"H®Š-™�/½eúÊ" H @€ô’€÷^‚4  @€�‚ œxbUÛÓ#¿‘|=�#SÐXLN`;¾zh|í#‡Ä!¯kÛN §  @€ @€ŠE`SGg̺âž8ï—÷GÇ–®b Kþ^`i’KNY2wÆÜ¿¿àg @€JW@�{é®�È  @€þ†xËQ¯Œšêªb QL @€ @€ÛXòÔºøÆ�n�ën[¹ôEH�"ÈFÿ±4+Ú§ua|B"@€ @ ‡ Ü{¦9 @€�bh;fÒ„È&—¥1íVLq‰…@·@u&_xßñÞã÷‰ÖæP @€ @€JXà¦{–Å×Ï»%]¼º„³z9 ¤Ÿ¿¸9וœ²üæ‹Ë9O¹ @€¨î•°Êr$@€(C�i™ÑVý[¹ÿH“Ë”a‚R*q��Ý3¦œt`Œ5¨Ä3> @€ @€À_º²¹¸è7óã—Ük7lùëi(&�Õ‘I>¶töŒ_SPb!@€ @ g Ü{æ¥5 @€�‚ Œ7iXu?�$yKÁƒ�¿8hï¡ñµ�ïÛöwWüH€ @€ P.+×nŽï^|G\~ýÃÑ]ôî P„çe×ožºüÎó6alB"@€ @` Üwä2 @€�bØ}┣³¹ÜÏÒ˜FS\b!0|`}|óÔCãÍGî5ÕU@ @€ @€*@`ÞcÏÅ×þëOqûOU@¶R,A�ªr™w/š{æƒ%»�  @€T´€÷Š^~É @€”ŽÀ´LÛøçþ5ݵýÛi̪‡KgáÊ>ÒêL&þíýÄÉÇï-MõeŸ¯  @€ @€^*puûcñí ÿO>·á¥�!PX� ‘KN]:wÆ¥… Ãì @€ôD@�{O´´%@€ P�Ñÿð™!IgÕOÒ©ÿ±Ó›’ÀvÞó{Æä“ŒÝw´Ý6. @€ @€T†ÀÆÍ�qÖ÷ÄyWß[º*#iY–Œ@.’s4d§.øý¬Ž’ Z  @€*X@�{/¾Ô  @€Š_`ÔøÉGf’¸<�´­ø£a¥´÷ÐøÚGßï3ºRR–' @€ @€@ž‹Ÿ\ß8ÿÖ¸þ¶E‘ËåÙI3ý"�ÜQ�$'.l?sa¿Lg @€vZ@�ûNÓéH€ @ O’1'.}èôt–ê>�ÉàòÔ\ßþÄâøq¯ŽêªLž½4#@€ @€¨D�¹w/‹¯ŸwK,X²ºÓ—sñ ¬Ê%É–µÏøMñ†(2 @€¸{ @€(2�¶#¦Nj».J77z{‘…&œ øÄ;_Ÿ|÷ëcè Æ V�: @€ @€@O:»²qÑoˆé—Þk7léIWm ô­@.ÎXšüÕhŸÖÙ·� @€��Pà¾3jú @€è#�¶c¦ÙÜåéðcûh Ãè‘ÀA{�ožzX°÷n=ê§1 @€ @€�¿ <·fsœqñíqÅõ�¤/¦[{8ƒ@.æTå2'/ºéÌÅŽ @€xQ@�û‹ @€(¤@2zâ¤)I.ù^DM!17�n�Æ5ñíO¼!Þ1q﨩®‚B€ @€ @`—î_ðl|í¿n‰;|j—Ç2�ÞH?nñT’dNZÚ~f{oŒg  @€zG@�{ï8… @€ÀN ì~ô§e«ª‘œ°ÓƒèH >üÖ½ã³ÿçõ1|Hs/Žj( @€ @€/\5{A|çÂ?ÇS+7"!P Ù´Ðý+Ëæ þnÄ´l1$ @€•. À½ÒŸò'@€(¨À˜ SÞ��Üé/æ{4“HöÛkp|ë‡ÅAûŒæA€ @€ @ O6n—ß?ºz^lÙÚÕ§sœ@^¹ä·±5ó�¥·L_™W{� @€è3î}Fk` @€/+�´M˜üÙ´Å÷Ó?5/ÛÒE},ÐPWßüøâ„c_uµÕ}<›á  @€ @€¼(°hÅÚøÆ�n�n_¹tm� ,J"9qÉœ·8Ó @€¨hî½ü’'@€(„Àžo<µuË–ú "‰wb~sø[�“ß´WL}ïÁ±Û°–¿=í1 @€ @€�~˜s×Ò˜vÞ­±`éê~�×d¶!°%-rŸš¹Ÿ›^ó±‹m9E€ @ ¯¸÷µ°ñ  @€ü�À¨q§”Éd¯HOíõ7§=$Ðï{ïÞßþäaqØþ»÷ûÜ&$@€ @€ °-�ήl\øëù1ý²»c݆-Ûjâ�~H.ëH¶žúLû9ëûqRS @€ � (p÷4 @€ ÐOmã§|4’Ü9étµý4¥i¼D ®¶*¾þ‘ƒãÝo|m ¨¯yÉu' @€ @€ZàÙÕ›bÚ�n�_Í},röÏ.ôrTôüéÓïÁªlîÝ‹ošõ@ECHž @€@? (pïgpÓ @€TžÀ+�ŸT×±)3#—Ë}¢ò²—q1 ¼kÂ+âsï?8ÆŒXLa‰… @€ @€À6æÜµ4þýì?Æ’§Ömóº“úI`cúI‹S—Î�uI?Íg @€/ À½âŸ @€úR íØ©££«ëçé‡÷å<Æ&ðr{ŽjŽï|êð8êÀ±/×Ì5 @€ @€E'°yKg|ÿ’»âükæEgg¶èâPå$¹øaUfíÔ…ím®œ¬eJ€ @ 0 Ü ãnV @€� Ø}┣»r¹Ÿ§¿t�¨€t¥X„µÕ™øòŒ÷·o4¨-Â…D€ @€ @ ?�žX_˜ySÜûè3ùuЊ@$‘»+“˽{Ñܳžèƒá I€ @€À_¸{* @€è}�¤mâ”Ϥ_Y:=ºº÷‡7"� ¼í¨Ýã‹8$ö=xÇ�µ @€ @€ P¹\Ä…¿žÿùÓ;bý¦­%±ËT`u’K>¸dîŒ_•i~Ò"@€ Ppî_ @€”“@ÛS$µ�?ÌEò�rÊK.¥#0fDSœþ©ÃbüÁ¯ˆÄ_é,œH  @€ @€òXñì†øÊÿ×ݺ(ï>èu�$ùîÒô•hŸÖÙëc� @€@… (w¨ð'€ô  @€zO`·c?3¶º+sUZÜ~Pï�j$ù d2_<åõñþ·íÍ�uùuÒŠ @€ @€@ üá–…ñÕÞO>·¡„³z) ¤E77d«»NZvãÙÏ•rb'@€ Pl Ü‹mEÄC€ P’£�™üI6.OƒR’ º¤ÝgX|û“GÄkö^Òyž @€ @€@OÖoÚg\|{ü÷l®§Ýµ'ÐOD69aéM3îë�ÁŒA€ @€@„wÏ @€»&�´M˜ôùôWë3ÒaÒ=´úO ®¶*¾õñCâŸß¸OÔÖTõßÄf"@€ @€ Pdw?üt|qÖÍñà•E™p*D`cúí®Z6gÆ•’¯4  @€ô©€÷>å58 @€@9 Œxóçk;¶ü8Ýèÿ”sžr+N�ão‹¯|ä°;jPq(* @€ @€ý,ÐÙ•�ó~yœyÙݱ©£³Ÿg7�T g,±â+qå•]< @€Øyî;o§' @€@ ´MœúÊÈuý2%x]3H½­�µñ½ÏÇõªÈdÜÒ` LI€ @€ P䋟\ÿvöÍqÓÝËŠ @€ @€e#pËý+âßϾ9[º¦lr’Hi¤Ÿ«ø�esO‹˜–-�ˆEI€ @ ð Ü ¿" @€(r�±ãO{mW’íÞaeï"Uxe$ðº=ÅŸ9"Ø{Te% @€ @€…ØÚ™�™—ßçüü¾Ø²µ«p�˜¹~S[³ù}�ßpžOXTâêË™ @ Ç Ü{L¦ @€@% ´M˜üOi¾?Iÿ4URÞr-œ@uºmûW?r`¼÷ø×E}]Má13 @€ @€�2xtÉêø·³nŽ?ϲL3”V‘ <œM²',o?ë¡"�OX @€ŠF@�{Ñ,…@ @€ŠJàÄ«Æ<=ò›¹H¾TTq ¦¬Æ02¾ñ‰Ãã•»-ë<%G€ @€ @ .½ö¡øÎ…·ÇšõÅŽ*C`]6r§,Ÿ3ëו‘®,  @€윀÷�sÓ‹ @ ŒÚŽ˜:8j:/�$yK§)µ"h¨«ŠÓ?}X¼câk¢º*SD‘ … @€ @€@y <»zS|ý¼[ã×7=¹\yç*»âH‹u¾¶dÎàoGLËOT"!@€ P< Ü‹g-DB€ P£�™t@’M®JCÙ³ÂBœ0~lüû‡�QÃ[+ [) @€ @€(N�Ùw,‰/�û§XúÔºâ PTe(�»zsç€<ûÇïyÒ•áêJ‰ @`×¸ïšŸÞ @€e$0fü”÷ä’Ü…iJÊ(-©©Àð�õñ½ÏǶWúeE¤° @€ @€T�À¦ŽÎøþ%wÆ×Ì�Î.kWÐÒ2Õ"',�;óÑBan @€Å& Œ¢ØVD< @€˜–i›‡$Ð@IDAT°ê빯`rSV ÀÇßþšøÌ{Œ!+0{) @€ @€(n�ù�?Ÿ8ýÆX´bmq*º2HÖDt�¼tÎY¿/“„¤A€ @`—¸ï2¡ @€JY`ÔÁ§6T5Õ_”‹8±”ó{iì5ºåù]ÛÝoLi,J @€ @€$°aóÖ¸fÎcqÙµǽ�>¹ô…c�~È¥_õù¥¥í3¾›Îç™×Oè¦!@€(^îÅ»6"#@€èc�¶c§ŽŽ®®kÒiîã© _á™LÄ¿œ´|ì„¢±¡®Â5¤O€ @€ @ ¸îzèé¸ìº‡ã×s�î"w�B ¤E â’—p¿ L>qßøä»ŠæF»¶÷+¼É @€ @€lGà�÷.�K¯}8®½uatléÚN«ÿÿt’VV nLb�áõ±zS&[±áÿoà'½/°*É{Ï™q}ïmD @€Å/ À½ø×H„ @€½'�´M˜ôÕˆä½7¤‘¼T`̈¦8sÊQqèþc^zÑ @€ @€úUàé•ãò‰Ë¯$­X›÷Üj"F´fbxKµU/tKÒj÷úÆÖh¿UlíÌæ=–†vB +ݬgÒ’9³Î݉¾º @€(iî%½|‚'@€ÈW íˆ©rµ]?N>)ß>ÚØ��¿cï˜|ò!1°Ù쌟> @€ @€zC ›ËÅ�·/‰ËÒÝÚgß±$:»ò+FϤ/"mJÒÂö$Zl¿¤¢±a@<ñ\Ä#K×÷F¸Æ ð2É̥ɠÏEû´Î—iä @€�²ØþÝXY¥) @€�J;î´Ýº2ÙkRƒ7T²ƒÜûV`·! 1ý´£â¨ÇöíDF'@€ @€ @`»KžZ—]÷p\yãñäs¶Ûîï/4Ö%12Ý©}Xú§:ó÷W·÷s�Í-1gޚؼ¥k{�œ'Ð Éïë7gOZpÛ¬ü¿‚ f5 @€�B (p/”¼y  @€úE`ÔøIf’ä×éd£ûeB“T¤ÀŽ{U|îýoˆÁ­ ™¿¤  @€ @€R`kg6þp˸ôÅŸî[Ý»·çsT¥…ìÚ_(loªßùò‰õu±|mUÌ_´.Ÿiµ!°³óª“ÌÛ¶Ÿ¹pgÐ� @€@©ìüZ©d(N @€�Šh?éŸ#I~š¨:®ØgAß&>´µ>ݵýȘø†=ûv"£ @€ @€ ð�G¯ŽK¯}(®š½ V®Ýü’ëÛ;Ñ’³�hMbhSÝEî½u46·Fûýk¢c«ÝÜ{ËÔ8/�<�‹ä„esμåï¯ø™ @€@9 (p/§Õ”  @€À_’1ã')—Ä·þzÂßz[àÄc÷ŒÿС1lpSom< @€ @€¶#°©£3~5÷ñ¸,-l¿ëá§#ÏÍÚ£º*bDº[{wa{Cmß•J44 ˆÇŸÍÅ‚e¶“�ÓvY #‰Ü‡—Ì™uÙ.�d @€E*ÐwwmEš°° @€Ê[`�‰ªïŒ–ó#§”w¦²+”@kcmü`Ê‘ñ¦#^™~A@¡¢0/ @€ @€�ʸ÷ÑgÒ¢ö‡ãš¹�Åú�[óN~`C#[’œîÖžé§×ó’ô…ÃÚ†–˜3oUtvæòŽUC=ÈÅ´¥sg~3íãIÖ#8�  @€JA ŸnßJ�BŒ @€¥.°ÇÄO�ìÌV_IV깈¿8Þ9nl|壇ÇÈ¡ÍÅ ¨ @€ @€”‘ÀÚ [âªÙ žß­ý�'Væ�Ymuº[{ZÔ>¢%õ5ywëõ†MM 1Yg,yzS¯�m@/$—U'k>²°ý¢ÍD @€”“€÷rZM¹ @€*X`ôÄÓ^Ÿäº~‘Œ©`©÷‘@〚øþ¤#âǽ*ݵÝmT1– @€ @€Àó·Ü¿âùÝÚÿ§…±yKg^*Ý¯Ú nL‹Ú[“”îÚ^,/ãUUe"WÓ7Ï[Ùœ�¶óZL�z*pkMurÂ7Îxª§µ'@€ P¬*3ŠueÄE€ �·À˜‰§��Ëe/I;4äÝICy wx[|ýã‡GÛˆ�yöÐŒ @€ @€�ž <»zS\qÃ#ñ³ë‰'–¯É»{÷í#Ó�Ú‡§;¶wïÜ^¬GssSÜñøæxfuG±†(®ÒX”~¨ãmKÚgÎ+í4DO€ @àîž  @€¥,�´�Ÿô…t+žÓÓ$ün[Ê+Y„±××UÅ÷>}x¼ã˜½£*“)Â…D€ @€ @ ´ºw4o¿séó»µßpûâèìÌæ•P÷îìC›ÒÝÚÓ¢ö�éní¥rÔTWǦ\CÜö𪰙{©¬ZIŹ.rqÒÒ¹3WRQ – @€À6JçNoÁ;E€ P¹¯<~R]ÇÆ8/É*WAæ}%0ñÀÝâ[Ÿ:2ÆŽÔWS— @€ @€@Å <ù܆¸ôÚ‡ãòëŽåÏnÈÛa@mÄn­éníÍITWåÝ­è6·´ÄŸZk6t]l*y�ôS"¹©KçÌš•f’+ùl$@€ P± Ü+vé%N€(]�G~rxMMí/Ó Ž,Ý,D^ŒµÕ™8ýS‡Æ?¿qŸô 2»¶ã‰‰ @€ @ tîzèé¸àWóãwz"ïÝÚ»³ԘĨ�I *¡ÝÚw´Juµµ±rsmÜýØš5u�@�ÒÊös–%ƒ§Dû4Ÿ¢è±ž @€Å  À½VA  @€y ´�›²dr¿J;ŒÍ»“†ò8r¿ñ�O{�’GkM @€ @€ÈG ³+¿ûã϶w¸ç{dÒj†-Ý…í™èÞ¹½\�¦–Ö˜;oMlìè*×åU8�몓Ì{¶Ÿ¹ºp!˜™ @€ÀÎ (pß97½ @€ 0ú˜IoM²ÉÏÒ©› 0½)ËT “nÔþåzÇþQ[S]¦YJ‹ @€ @€@ÿ ¬^×ÿý‡‡â'¿} V<»!ïÉëÒ—èvK‹ÚG¶&‘~ábEêëbÉêªxhɺŠÈW’ý'�îäþ`UWÕÛß<ýñþ›ÕL @€v]@�û®� @ F�Ÿô‰$IÎI§ª�·4úÕ1fDSœýùqqàkGÓ @€ @€ @ ]¼:οf^ü²}AlêèÌ{Ä–Ý»µ'1¤1‰¤"+’ÐÔí÷­Š­]iY²ƒ@ï <›I’ZÜ>ãæÞÒH @€úV "o û–Ôè @€½,�Œ™0ùÛéËùÿÞËã®ÂÞ÷–WÆ>xh ji¨p é @€ @€Øu�o_üj^Ü|ϲÈåYŸÝ]È>¬é…Âö¦zå Ý«ÐØØ?™�…Oæ¿ëý®¯ž*@`KúÏòcËæÌüiä*E @€�2p‡X‹( @€@¹ ì»ï´Ú5ÃVþ8rqJ¹æ(¯þh¨«Š3§Çõª Ý ªÿÍÍH€ @€ Pž7wÆ•7<?þõüx|Ùš¼“¬©ŠÙšÄn­™¨­Î»[Å4Ìd2QUßsï_]ÙøkÓ²»2޾ @€úZ@�{_ Ÿ @`§ö˜xÚÀÎ\öª´ó1;5€N¶!pÔþ#⻟=:ÆŽ´�«N @€ @€ ��ÀÒ§×Ç…iQûÏ®{8ÖnØ’O—çÛ4Ö½°[û°æ$2ªvèÖÜÜw/ìˆ'WnÞa[ ô@àçÙõ›?¸üÎó6ö �¦ @€úUÀ-c¿r›Œ @ �QãÿeL&Ùúûˆdß|ÚkC`Gé†GñåzÇþQ[cK¨y¹N€ @€ @`[žÿdœͼ¸þ¶ÅÑÙ•ÿЃ“=(‰ÖJ¶åúr窫ªbkUcüé�U‘³™ûËQ¹Ö3�Ûkª“·?q㌧zÖMk @€ý#àÍB€ �§Àèc&�d“ߥÍGåÙE3/+0fDSœýùqqàkG¿l;  @€ @€x©@gg6®žûXüøšùqÿcϾ´ÁvÎT¥›NŒhéÞ±=õ5ÛiätÞÍ-ÍqóƒbÝÆ­y÷Ñ�À�\·tîÌGwÐÎe @€ý. À½ßÉMH€ °=�Ý'LyS6r¿H¯7o¯�óz"ð¾·¼2¾ðÁCcPKCOºiK€ @€ @ âž[³9~òÛâ§¿0žYµ)o�îböî¢öîâöî"wGï Ô××Ų5Uñàâu½7¨‘*]àÙÈ$o[:{Æm•! @€�âPà^\ë! @€@Å Œ?ùƒIç§Õ‹ ñ^h¨«Š3§ÇõªHŸW @€ @€òxà‰•qþ5óâWé®í[ºòìÑ: Ý­}Pƒ“ð’\Þl;Ñ0‰ºÆ–h¿oUtes;Ñ_/Ø”n>ôžåsfýú%Wœ @€ P ÷•‚7- @€Àÿ $c&LþJú2ü7ÿ÷ŒvAàÈýFÄ÷&cG Ú…Qt%@€ @€ P9¹ôÚën[ç_=/n›¿"ºÎçèÞ\bxsZØ>0‰Æ:åù˜õV›æ¦¦¸ó‰ÍñôêŽÞÒ8•-�ÍårŸ^6wÖU6ƒì  @€ŠEÀf±¬„8 @€(pðÁ§Ö<Õ\nä⣘¾”{Y “~Ýñ—?xP|èûGm�/èe^à @€ @€”¡ÀúM[ã²kŽ‹~3??¹.ï k«"v˜‰‘­IÔ¤�…¨©®Žu]âŽGV&³–�@.—|kÙÜ_KËóc.eG ! @€�"Pà^$ !  @€@¥ =ê ÍõÕ›¯Hó>®Òr—oï ŒÑg~\øÚѽ?¸  @€ @€”™À¢kãÇ¿žWÜðH¬ß¸5ïìšÒ]ÚG JbhSÕy»õuÃÆ–Öh¿oMtlíê멌_¹H.¹~Ó©wÞy^þÿ9T€‹  @€úWÀ-gÿz›� @ ;î´Ýº2ÙߦB`WNyó^ñŃZvu(ý  @€ @€”µÀï]\3/þçŽ%ѕ̓æî‚öQ“h Ä XŸ ��âáÙXøÔÆb Q\¥$�Ë]Û‘éz÷3íç¬/¥°ÅJ€ P>î>Ëg-eB€( �ÝÇMÚ'›I~—;¶$dÑ 4ÔUÅôÓŽŠã�~u$îlŠv�F€ @€ PX�-é®ÞWÍ^üj~<´peÞÁTg"F´v¶g¢®:ïnP “ÉD®¦)nž¿*rù~¡€›º˜’ÈÝU•t½uaû9Osœb#@€(Oe å¹®²"@€¥@Û1“&D6¹: n`Q(¨’8r¿ñ½IGÇØQƒJ&f� @€ @€èO�§WnŒ‹~û@\ú‡‡â¹5›óžz@m<_Ô>¼9‰ª´ÈÝQzÍ--ñLJÖÇÚ [K/x›Àé¦EÇ/Ÿ=ãáb L< @€å- À½¼×Wv @€�¢3qòIéŽ1§¥o�8ìœ@ºQ|ùƒŇޱÔÖØ6jçõ"@€ @€(g�Ç—­‰³®¼7®n_[;³y§Ú\ŸÄ˜ÁI nTF�7Z7¬¯¯‹k«bþ¢uE¥ÐJDà¹\dÞ¾lΙ·”H¼Â$@€(w¦e°ˆR @€¹@Ò6aÒç#’ïyœÂ+r�1#šâìÏ�‹_;ºÈ# @€ @€�þxpáʘuù=ñ»?>]Ù\Þ´x¡°}`ƒò�¼ÑJ¦aõM­Ñ~ßÊèìÊÿ9Q2é ´?6'™8iÉì™×ôç¤æ"@€¨\w¨•»ö2'@€ô½À‰'Vµ=³ÛŒÈÅgú~23”³À ãÇÆ´S�Œ!Ë9M¹ @€ @€è±ÀÝ?3ÓÂöo_é·hæ} Jwj3(‰–´ÀÝQÞMM�qÏÂŽxrUGy'*»¾Èæ’øÌ²ö™?ì뉌O€ @À�ªç @€@ŸŒ:øÔ†Lcý¥‘Ä;ûdƒV„@&ñ�O'ÿº¨êþÁA€ @€ @€Àó·Ü¿âùÛo¾wY� Û‡6%Ñ68‰¦:å•ôTª©©Žõ�âöGVWRÚrí�$rßY2gÖWÒ¡{ð‘š>Ä� @€e-àŽµ¬—Wr @€�ÂŒ7iXu’ü:-n?¬0˜µFkŒ~qB¼þ5£Ê!9 @€ @€è�Ùw,‰YWÜ·?ðT�ÆÞÜ]Øž‰†ÚuӸ̚ZZ£ýþ5±yKW™e&�þH‹Ü2|}ÇÇî¼ó¼­ý9¯¹ @€*G@�{嬵L  @€ý"Ð6~ò«ÒÂöß§“íÕ/š¤,ÞvÔîñŸ<*†j,Ëü$E€ @€ @ §¿ÿÓÂç Ûï_ðlÞ]“´"`DKZØ>(õ5ywÓ°ÌÄ£Oeã‰'7–y¦Òëc�ë6wÖ¿ûÙ?~o]Ïcx @€� Pà^�‹.e @€@_ ŒwÚA™LöéøÃújã–·@&ñCœò�ûEUUúƒƒ @€ @€@ ds¹¸fÎcqÖ÷Æ#‹Wå-‘I+F¶&1:-l¯«Î»›†$�é~1¶¶)nš·*Ò§™ƒÀÎ Ü]•ͼuÑMg®ØÙô#@€ °-îÛRqŽ @ ÇmO›¹ì¯ÒŽÍ=î¬�T`·! ñÃ/Nˆƒö̓ @€ @€@E tvfãÊ�s~~o,\±6o‹î=#vûKa{MUÞÝ4¬`�––æ¸éÁ ±nãÖ V�ú. ,Ê&Ùã–·ŸõÐ.Ž£; @€�ÿPàþ¿ @€ì¬À˜c&¿3—�ËÓþu;;†~•-püácâÛŸ>*† nªlÙ @€ @€T´@Ç–®¸äÅ]u_,vCÞÕiaû¨t·öQiq{µÂö¼Ý4|A`À€ºxâ¹$,Ëÿ9ÇŽÀß ¬ÌæâíËçÎüÓß�÷# @€��Pà¾Sl: @€üU`ôøÉL’¸ ýÙÛ&EñwÞÝß‚;í£‡Äûß¶úÆ[úƒƒ @€ @€@ lؼ5.þÍñ£«çų«7å-нKûè´°½{×v/¯åͦá62鋵¹š¦¸yþªÈå¶ÑÀ);Øœ$™“—´ŸyõŽ›jA€ @à帿¼�« @€/#0fÂäI_çþþË4q‰ÀvF ª�~qbòº¶í¶q� @€ @€@9 ¬Yßüj~\øëù±z]GÞ©ÖUG´¥…í#ÒÂöŒwýóvÓpÇÍ--Ñ>omlêèÚqc-¼T ›D2iÉœç¼ô’3 @€òp«›¿•– @€/ $c&LúV.’/½xÊ#ù ¼åжøÎgŽŠáCšóï¤% @€ @€�2èÞ¥ý¼_Þ?ý݃±~ÓÖ¼³ª¯‰38ÛÓRïöçí¦aÏă+²±øé�=ë¨5�¿¤ÿ=}mÉœ™ßJô}ž @€;%à–w§Øt"@€T°À‰'V�yfÔÙ¹\î¬ õ�H¿å6¾öáƒãoß?jªÓïOv @€ @€¨ �Ïnˆsq_\víñyKgÞ™7Ô&ia{C›¶ç�¦á. TUUÅæhˆÛZ½Kãè\¹iAÒô´Èýs©€"÷Ê}Èœ °Ó ÜwšNG @€@å ì»ï´ÚµCWþ4}%òÿT^ö2ÞU�áëãÜ/NˆC÷³«CéO€ @€ @ ¤­XgÿüÞøù��ÆÖÎlÞ±7Õ½PØ>$-lw(„@SKkÜxïê=o §9‹S }?éÂeÉàS£}ZþŸè)ÎTDE€ ÐÏî‚ûÜt @€�R6ñÓMu¹ê_¤ñ¿¹TswáÞxȨ8ã³ãbÄÐæÂaf @€ @€ý,ðèâÕ1óŠ»ã77=�]ù¶· x¡°}Pƒ·ôûyÉL· �¦¦Æ¸gÑ–xråæm\uŠÀŽ’«ê²ï]ðûY;jé: @€�¿ ¸þ«„¿  @€¶+ÐvÄÔÁQÛõÛ´ÁáÛmä�md2_þàAñáw5ÕUÛhá @€ @€�ò¸ÿ±gcæÏî‰ën]Ù\º‡qžÇÀ´ }Ìà$ZÓw�b¨©®Ž5[ëã®kŠ),±”ˆ@ú¿àõ[’Î~¦ýœõ%²0  @€ ,ஸÀ `z @€@± ´;uttu^‘ì[챊¯¸†¶Öǹ_‡°{q& @€ @€}$pûOÅÌËïŽ9w-�ÔµÇ�Æ ۛ꽅ßGKcØ^Ð<0fß»2ýF‚ü?¸ÑKS¦ôn�-Uo]zËô•¥ŸŠ  @€úZÀÝq_ Ÿ PÂmã'¿*—Äué/�{”pB/€À±�Š3&» k)Àì¦$@€ @€ п7ݽ,-l¿'n›¿¢G…íÚ“h”Dc�·îûwÅ̶+ÍÍMqÛ‚M±rí–]FßʘW•ͼyÑMg®¨ÌôeM€ �¯€»ä|¥´#@€T˜À艧½>ÉåÒ�ÛsÃ+,uéî¢À—>ðúøè?µ5U»8’î @€ @€Š[àúÛ=_Ø~Ï#Ïäh’¾K?üùÂöL ¨Í»›†ŠJ ®¶6ž\_ó­+ª¸S�Uå²oZ4÷¬'J"ZA @€D@�{AØMJ€(n�1&�ËEò›4JÛo÷RUtÍ 5qÞ¿Mˆ£Ú£¨â  @€ @€�Þ¸îÖEñýKXÙ£¡G¶&1fp&êª{ÔMcE*�DmCK´ß·*²¹\‘Æ(¬"XžÉT½yñìéó‹4>a @€X@�{�Àô @€�b=qÊÛÒ�Û¯Lãª/¶ØÄS¼ûí58ÎùÂÄØcôàâ Rd @€ @€vQàÖy+⌋n�;zºG# mJbì;¶÷Mã’hiiŽ›Úk7l-™˜Z+“HŽ[2gÆíE�  @€ŠJ@�{Q-‡` @€…h›8å}‘Ë]”FQUØHÌ^J'¿i¯øêÇŽˆæFŸ‰(¥u+ @€ @€@þó{.θøö˜{÷Òô%Ôüû lHb�¡I4Õyk>5-KQ`@}]<‘–+/X¶¡ÃsáÖ§ÿ¥¾cÙœ™³ ‚™  @€ŠQÀ]t1®Š˜ @€h›0irD2£S›²D2™ˆï|âÐ8ùøý"“qkQ¢Ë(l @€ @€�—xbùšøÏŸÞ¿½ù‰Èö ²½¹¾{Çö$º Ü*E “¾hœ«iŠ›ç¯êÑA*ÅGžÛèH2ñž%³g^³Ý. @€Tœ€»éŠ[r  @€^"�´M˜2-"÷µ—\q‚Àv5×Åù_š‡î7f;-œ&@€ @€ PºO­Ü?¸ä®¸âÆG¢³3›w" µ‘¶gbH“·âóFÓ°ìš[Zbμµ±±£«ìr“PŸ t¥;¹8ÝÉý§}6ƒ�  @€JJÀ]uI-—`  @€½-0-Ó6þ¹‘$Ÿíí‘�W¾‡¼fhÌúüÄh9°|“” @€ @€@E ¬Yßg]yo\ôëbó–μ êª#vO Û‡·$áMø¼Ù4,c�††ñàŠ®Xòô¦2ÎRj} 0y霙³ú`\C @€”˜€{ë[0á @€zKààƒO­yªiÀÅéÎí'÷Ö˜Æ)�¿uïøâ‡‹ÆéVT @€ @€e"°©£3οz^üðªûbí†-ygUS1fp&F¶&‘ñî{ÞnV†@uuu¬ÝZw-XS ˲WÒÿJ¿¶dÎÌo¥ƒ¥›º; @€*UÀ-v¥®¼¼  @€�Šuð© ™¦?O_<¾¢!$Ÿ·@&ñ?{D¼ûMû¦þçÝMC @€ @€E-ÐÙ™�ÿþÃC1óò»ã™Uùï4]•¾^6zP&FL¢û±ƒ�í Ô5¶Æì{WE6§^yûJ®ü­@’KÎ\2wÐç"¦eÿö¼Ç @€•# 4¥rÖZ¦ @€�ç†õ…æúêÍ¿I�„@>ÃÖÇù_>6|í¨|škC€ @€ @ èºël¯š½ ¾É�±ä©uyÇÛ½KûniQ{[ZÜÞ½{»ƒ�üZZZbμµ±¡£+¿ZU¼@.’‹–%ƒ>íÓ:+ @ ¸Wà¢K™¨\�=ßxjë–­u¿�Hލ\™÷Dà¨ýGÄô©b·a-=é¦- @€ @€�¢¸þÏ‹ã{?¹#Z¸²G1ŽhIb÷!™¨«îQ7� ø‹@cÀ˜·´3–=·™ �<’«ê²ï]ðûYyvÐŒ @ L¸—ÉBJƒ °#�¶#¦ŽÚìµ¹CvÔÖuÝŸü§}â_NyC ¨¯B€ @€ @ än›÷dœqñíqǃOõ(—¡M/¶7Ôö¨›ÆlC ¦¦:VvÔŽ�­ÝÆU§¼T -lºasÒùOÏ´Ÿ³þ¥W�!@€(Wî庲ò"@€ü�À¨‰ŸšÉm½>=õú¿9í!�m Tg21ã_ŽŒwL|Í6¯;I€ @€ @ ”æ?þÜó…ísîZ¹\þ‘lHb�!I4Õ{[=5- ä#�DmCK̾oe�þMæ3²6e+pkl©zëÒ[¦÷ì«7Ê–Cb @€�òp'^þk,C @ Â^ñSFlíÌÞ‘ì[áÒÏC`·¡ qÁ—��ý^52�Öš @€ @€(^�…+ÖÆþôÎøÍM�G¶•íÝíÝ…íÝîúN ¹¥%Úç­�M]}7‰‘ËI`^uÒù¦…íç�Çà @€ @€úRàé•cúewÅÏ®$:;³yO5 6ÒÂöL iò6zÞhØE�ÆÆqß’ÎXñÜæ]I÷ x8éÌ»ä�g-¯�|¥I€¨Xwæ»ô'@€Ê]`ÔÑSvÏTåþ'Ís¯rÏU~».pÚ{^“N:$jkªw}0# @€ @€(€Àšõqö•÷ÆE¿y ݺ3ïêÒ—ÄvO Û‡7'‘x=o7 ô–@Múºôs›êâ¾'ÖöÖ�Æ)k�Ü‚l®æØås°¤¬Ó” @ ÂÜžWø@ú @€@y ŒÿÙWt&™ÿIÙÛ£<3”Uo ÔÕVÅYÿrTwô«{kHã @€ @€èW�îböó¯™?üÅ}±vּ箩Šhœ‰ÝZ“Èxç{Ò!QSí]¼¢]$� @€ @€lSà†?/ŽïýäŽxpáÊm^ßÞÉ-Iì>$uÕÛká<Å$P[SOo¬‰y ×SXb)N�åéæOÇ.Ÿ=ãáâ OT @€;# À}gÔô!@€™À¨q§”Éd¯OÃ\d¡ §ˆª3™8sê‘ñÎc^SDQ … @€ @€ÀŽnàÉ8ý¢;¢ûïžCš’›¶7Ôö¤—¶ƒ@’~íB¦¾%æÞ¿2º¿¹ÁAàežÌdsÿ°ø¦Y¼L— @€JH@�{ -–P  @€Ûh;fÊa‘�k#r­Ûºî�n�AÍuqáW��ƒ÷ „ @€ @€@ÉtïÔ~ÆE·Çì;—ô¨Àµu@{ M¢¹Þ[â%³Ø%°�¦–ÖøŸûVÇ–­Ùí´pšÀóϤŸ‰8vIûÌy< @€J_ÀÝ|鯡  @€� Ø}┣³¹ÜïR‚æ f�úöÝcPü×—Ž�±£í ¥Ë @€ @€ŠCà©•Ÿ/l¿jö‚H_Í;¨î�Ú_1,ƒ¼ž7š†J@ ©©1îz¢#ž^ÝQÑ ±€Ïå2¹X6{Ö½ŒÁÔ @€½ ா A€(„Àè “�I™ûM:wC!æ7gi¼õÈ1qƤñ1°y@i,J @€ @€�ŠèØÒçþâ¾ôϽ±qsgÞÕUcgbdké¾ÊP ®¶&–¯«‰¯+Ãì¤Ô‹+³ÙÌ›–ßtæ]½8¦¡ @€úYÀ­}?ƒ›Ž ÐcŽ™ò–\6wu:V}oŒgŒò8í=¯‹É'¿!jºßÝs @€ @€(r�kæ<§_t{,{f}Þ‘v³ï–µï>$Õ™¼»iH€@‰ $é?úlusüñ�U%š�°ûI`uúq§7/™3ãö~šÏ4 @€½, À½—A G€èk�ѧ¼-Éå~‘Γ~Ù®ƒÀK2éy3N;*N8öµ/½è  @€ @€�"¸ç‘gâ?º5îxð©E6¸1‰W Íį”öÈMcå ÐÐÔ7ܳ*²¹\9¤#‡¾X›‹ÌqËæœyKß oT @€�¾PàÞ—ºÆ&@€ô²@Û„Éÿ”yyú§¦—‡6\™´6ÖÆE_=6y][™d$  @€ @€�rxò¹ ÏïØ~uûc=*RmH Ú_1,ƒ¼Ý]®Ï yÈG ¹¥%Úç­�M]ù4צ2Ög’äøÅí3n®ÌôeM€(]wü¥»v"'@€*L`Ìø)ïÉ%¹KÒ´«*,uéæ)ðÚ±ã¼/{ŒœgÍ @€ @€ô¿@Ç–®8÷÷¥î��›;ó :}etìàLŒlM"ñNwÞn(g�¦Æ†¸sá–xfuG9§)·]Ø™Ü[—Ξ5g׆ћ @ ?Üö÷§¶¹ @€;)0zü”$Iî´{f'‡Ð­ÌŽ?|L|wò¸ÔÒPæ™J� @€ @ ”ºwk?ãâÛcÙ3ëóN£»˜}·´¨}÷!™¨ö iÞn¨�ººÚX´* –m¨””åÙs�M¹L¼}Ùì™7ö¼« @€…Pà^us @€z Ð6qòÇ"ç¥]üîÖ·Jj:ùÄ×Å”÷¾!jklî_Ië.W @€ @€@) ÜóÈ31í¼[â·žîQ؃“xÅÐL ¨íQ7� ¨0�ªªLlÈ6Ä�¬©°Ì¥Û�ÍI&9aÉì×ö �¦ @€P$U xÓ @€ò=qò'“\œ›O[m*O “îVõƒÉGƻ޸Oå%/c @€ @€�’xò¹ ñ� o�kæ<Ù\.ï˜j“ØsX¼¥�7š†DmCk̾oeôà¿j•%°%—Éýó²Ù³~[YiË– Pz^ (½51 P!Ù¹ýG’®4{(ÐÚX?þÊ1qè~czØSs @€ @€}/°yKgœûóûâ‡WÝ7wæ=auú%…c‡dbdK‰w³óvÓ��šZZãÆ{WÇÖÎì‹'="ð¢ÀÖ$'.™=óšOyD€ Pl^(¶ @ =~òÓ7o.Lú}Í3â%¯Þ½5ÎÿÒ±ñж!/¹æ @€ @€�B ü²}AœqÑí±üÙ y‡Ò]Ì>ª5‰1iq{uúÍ…ìŠ@ssSÜòÈÆX½~ë® £où tF&9iéì¿(ßeF€(mS¥½~¢'@€ÊP mü¤SÒ­‰~š¦æwµÿÇÞ}€ËU–‰ÏÜÞÓ’›Bèš•Nr)¢®]—Õ]uW×$ Š. bw]YJ@T,X�EvWdUTZÍP” ¡„pSo�ÿ¹ºî_‘2s3wêï<�Org¾ò¾¿ï>düÎ;ß©ÂõÝÞ”^z@w|ö¸…1¾«u{‡ÒŸ @€ @€@AîøÕ£qú?�ŸÝ÷h^ãNhKbÇI™hiÌ«›ÆxN�–æ¦øÕÚˆU�myÎvÞ¬Y�¡$›¼iõò³/©Y‰ @€ÊX@ÑT/ŽÐ @€�ÚHOnÿÛô¤¢‹ÓÌ�QT{Ëÿ¼¿çu»Ç‰oÙ/ꟷ­ @€ @€Š%°ö‰Íñ©¯Ýß»î�Îfsž¶µ1‰�&'1®ÕmëœÑ4$@ /�†úúxb[Süüw½yõÓ¸f†#›ý‡5Ë—^T3K” P!v *d¡„I€T¿@zrûëÒ“Û¿“fZWýÙÊ0�Lúu‡Ï{`}ÔùtÓ– @€ @€À˜ lëŒÏÿçÏã‹ÿýóزm0ç¹êÓÐÙ31­3I·Dsî¦!F%�Œü‡¦±#®¿ûÉQõש겑MÞ¼fùÙß®úL%H€¨ Û´XB%@€ªW`ú¢ã^™‰ä¿Ó Í]½Ë<ªÌ:Zâ«§ì3kTýu"@€ @€ 0ß]v|úÂ[ã‘Ç7ç<üH�éôqIÌœ�‰zϰÌÙMC #ÐÖÑWÝùd çþ¤‰ÂÌl” Ê&Ù7>´léV@¬B$@€Ô„€÷šXfI @€å,Ð½èØ—Ed.Kcl,ç8ÅV|�¹3:ã+§sgN,þäf$@€ @€ ð ÷=¸>NþüMqë=kŸáÝg©«%‰¹S2ÑjôÙ‘¼C€À˜ ttvÄò»7Ææ¾¡1ŸË'0˜d“ׯ^~öå¹€  @€U( À½ UJ @€@åÌ\xÜQÙ$Ù(kªœ¨EZ �ƒöšç~à°˜<¡½Ó™ƒ @€ @€Às lÚ:ÿ~Ñíñµÿ¹'‡†Ÿ³íŸ¾Ù˜>³rÇI™˜ÜáÖôŸºø;¥hkk‰;Wƺ'·•.3—«@$ñê5ËÎùQ¹(. @€@­ØE¨••–' Pv3{x’d~�Ö\vÁ ¨¤¯_´c|⽇D{«ï=”t!LN€ @€ ð{�ï]÷@|ü++bÝú-9‹ŒÜˆÞa\³'f¢.“s7  P�¦Æ†XýT}üzͦ¢Ìg’ŠØ–Í¿ü¡åç^SQQ – Pe Ü«lA¥C€T†ÀÌ…Kf“ìi´­•±(‹%pìßìï{óþÑP_W¬)ÍC€ @€ @àî_³!N=ÿ¦¸ñ®‡Ÿñýg{±³%‰¹““hkr;úÙŒ¼N€@é2™LlKÚâ–û6”>”›À–$²/]}ÝÒëË-0ñ @€jEÀŽB­¬´<  @€�²˜¾pñA™$~’ÔV6A ¤,>õ®ýâÍ/ß;ŸÒËb=A€ @€¨U�­}ƒqÖÅwÄ—ý"‡sfhHÏl˜3)S;mp匦!%hjëŠkîZÙlÉC@y lJ«zñCË–þ´¼Â  @ 6ì,ÔÆ:Ë’(�îÖìÃÙ+Óp:Ê$$a”�@}zJÌ?´0Ž:hç2ˆF @€ @€µ,pÅMÆG/øi<ôئ¼vèJbvZÜ^ŸÉ«›Æ( �ŽÎ®¸êÎ'c`H•{Y,HÙ‘<•Éd�Xuí9·—MH!@€Ôˆ€÷Yhi @€¥˜uØâÃÃÉÕÙ®ÒG#‚rèhmˆož~d,Ø}F¹„$ @€ @€�XùHoœú…›bÙíkòʾ£9‰¹S’horë9/8� (;�ŽŽöX~Ϧؼm¨ìbPIÖÇprØšëÏþyI£09 @ Æì2ÔØ‚K—(�ÀŒžã÷M²Ãפ³�/Mf-G�ÙÓÚâÂÓ^;ÏšTŽá‰‰ @€ @ úú‡âÜKïŒóÿëç1ò÷\¯‘“Úç¤'¶OKOnw @ ZÚÚZã¶ßöŽýÕ’’< #ðXf8Û³êú¥÷f8£ @€<Ÿ€Ý†çò> @`;º»W$™kÓa&nçPºW‘À çMŠ/þË1mRGe% @€ @€�J¸úÖÕqÚoŠUk7æöÔÎä÷Åí uyuÓ˜!ÐÒÜ¿Z±êÑ-¯ ‹&°6²±pÍòs~S´MD€¨aî5¼øR'@€Æ^`Ö¡Çí>œI–¥3MûÙÌP)/?hf|vñ¢èlo®”�ÅI€ @€ PEkÝùÒÍq劕‘ÍæžX[S;OI¢£ÙmæÜÕ´$@ êëcíæÆ¸wU~_ªÄ\Åœ—Àšºìð•ËÏý]^½4&@€È[ÀÎCÞd: @€r˜~Ø’yéã —¥­§åÖC«Zxç«w‹“Þz@46Ô×Bºr$@€ @€(#�ÁÁá8ÿ¿K/¹3¶ö æY]&böÄLìЕDâsÎn PÙ™L&¶dÛâ¶_o¨ìDD_P�ô{af‡’Eßpöª‚l0 @€�?°ýðg~ @€F »ç„�#;t]:ÚôÂŒh”j8ýí âŸ^³ozÐÇðjXO9 @€ @€*Iàú;Šá¦x`ÍSy…=¥#‰9“3ÑX—W7�  P%Idš;bù/ž¬’|¤Q�ìýÉ`vÑêÏ}¸0ã… @àé*kž.âg @€Àv Ì^xìŽCI’·'3·s(Ý«D =ä%>ÿþ…ñò…»VIFÒ @€ @€¨�uë·ÄG/øi|ÿ†ßF6=v6׫µ1‰¹S’èjqK9W3í¨^�–ö®¸úÎ'c8Ÿÿ�V/‡Ìþ p_C}Òó»«Ï^„ @ ðv# ojD @ †¦²dV¦.»<%˜]à Rÿ�Ö¦ºøÆGŽˆý÷žõ'¯ú+ @€ @€�±ÎÆW¾wwœùíŸÅ¦­9OV—Ö0kB&¦�KÒ'æÜMCT½@Ggg\uç†ÊãÛBU¯Ró Þ=œ4öð²3¯y  @€� Ø’(0¨á @€�Ú˜Ñs\w’9¹=vª]™ÿ©À“Zã›92æí8åO_öw @€ @€c*°âîµqÊù7ƯV>™×<“Ú“Øqr&šêóê¦1jF £³#–ÿrclÞ6T39Kôyî¨O2‡?¸ì¬ ÏÛR @€�œ¸çL¥! @àÙvöåŸÆ^ó›ÈæqÀpsCÄÜ)™ßêöq —ÏÔTˆ@[[kÜþÛ¾x¼·¿B"fniÞ–}ñý+–öa.S @€jBÀEM,³$  @€�±˜Ósü¸ÁìðµéûŽå<Æ®�£ö›gßã:[*'h‘ @€ @€T´À÷®{ N¿à§ñø†­yå1c|³&d¢.“W7�  PÓÍÍMñëG³±j]~ÿÍ­i´*O>}Êó�Û2/}lÙç7UyªÒ#@€E@�{Q˜MB€T«ÀôÇ´&íÍ?N?TR­9Ê+?�üë]âÔ·ÍMé±W. @€ @€c,ððã›ãäónˆ«o]�×LmMIì2%‰öf·Œó‚Ó˜ÿ+ÐÐPk75ƽ«62!ðG�k‡7m{Å÷iË_ð' @€ÀèìVŒÎM/ @€@ì±Çé�OMzò²ˆìËp8ùö�cþæ…éiWŽ»òA€ @€ 0¶ÙlÄ…ßÿe|ö·Å¦­9O–Iï�œØ>rr{ânqÎn @à™2éý€­Ñ·þjÃ3½íµÚøI}Òûê—]¸­6Ó—5 @ 0¶, ãh @ ÖŽ>ºnÆcÓ.J7ø†ZK]¾)0RÏ~æ’ƒâuGìþ—oz… @€ @€@�~³jC|àœåqû}�æ5rWK;OÉDKc^Ý4&ijÆô@IDAT@€�çH"ÓÜ˱þ9[y³vÒb¬ÿé||Âßüò—§÷×NÖ2%@€V ®°Ã� PÉÌ)/þ|dãk"[I>§@}ZÝþÕSzâ¯�÷œí¼I€ @€ @`{‡ã¬‹‹ÏXkÝ”ópõé ;MÎÄÜ´¸½ÁâœÝ4$@€@®ÙÁ¾ØmöøøÝºméí#�˜×ߺu·ÞýfýwÜs�_ ¿ @€�Qؾš. @€@m t/\üéTàøÚV�ýˆ@sS]|ûcGÆ¡ vB€ @€ @`Ln½g]üÃé?ŽÞø` ç^+7©=‰Ý§×EW«‡{�éœ�šèï‹ÝçtÅÊÇúóúïtÍÃU/À�›;¦õ®\ñƒêMQf @€�±°‹1v¶F&@€ªP {Ñâ“Ò´þµ S“Ržã;šâ¢�{íºCž=5'@€ @€ �»À¦­ñ©¯Ý]q_ gs/lo¬�˜›žÚ>1-pw @€@ñ::Úãú{7Ǧ­ƒÅ›ÔLe+�DöS«¯[zJÙ(0 @€@™ 8Á½LFX @€@ù t/ZòŽ4ªsÊ/2[`‡I­ñ�O¾4æÏ�Zì©ÍG€ @€ PCWÞ²*ÞšžÚ~ã]Gî¥íÓº’˜ŸžÚÞÞ¤¸½†~]¤J€@™ô÷÷ÇÎ;´ÆS[“ØÒ7T&Q £tÉ¡]söߘžä~séb03 @ òìhTÞš‰˜(�ÀŒEKŽNOX¸$�Úç§ø—Ó”»ÎêŠ O{qÌœ6®œÂ  @€ @€@ <¾ak|ø 7Ånü]äqh{´4Fì<%]-¶1«è×A*T¨@ssSÜûH6z|k…f ìB ¤ÿž¿õ¡åç|½�c‹ PÍv6ªyuåF€D`æaK^’ÎþO:XCA4HÅ ¼pÞ¤¸àä#cÊÄöŠÍAà @€ @€å-pÉ•¿ŽO|uElØØ—s Iz×·{|3'd"ãpÎn @`¬šâÁõuñÀ#›Çz*ã—¿ÀP’‰×¯¾öœï•¨"$@€”^ÀöFé×@ @€@ L_¸ø ô†Ð•iˆ­e¦ÐŠ pø §ÇÙ8,Æu´a6S @€ @€ÔšÀÊGzãCçÞ7Üõp^©·7'±Ë”$ÚšÜúÍ NcI ¡¾>ÖnnŒ{Wm,ÒŒ¦)c�¾Èd_²æÚ¥×•qŒB#@€”…€]޲XA @€å(0ã°ãöI†3éS¶«ãSñ^·hN|êØ…Ñ6òŒg @€ @€� gãKßýEœùíŸÅÖ¾ÁœG9©}ΤLì0. 7}sfÓ�%¨«ËĆ�–¸ë�Þ’ÌoÒ²Ø8<œéyøú³~VVQ † Pfö:ÊlA„C€”‡@÷ÂÅ»d“¸>ý°4µ<"E©Þöòyqê?� õ¥ Á¼ @€ @€U*p÷OÄIç\¿xàñ¼2ßšÄÜ)™hnÈ«›Æ PB�$I¢/Ó·Ü·¡„Q˜ºLË òÐ çýºLâ @ ì¸—Ý’ˆ(µ@÷á'̈¡¡Ó8f—:ó—Và„7ìKþþE1r²Š‹ @€ @€@¡úú‡âsÝ_¾ìîÎyØúºˆ�&gbJ‡Û¼9£iH€�²HÿûÝØ7ür}YE%˜’¬Ê&ÙƒZ¶tMIf7) @ Ìì|”ù �(®Àôž'%Ù�å釤ùÅ�Ùlå&ðÑ·/ˆ·½æ‘¨â"@€ @€ P0�îz8>tî ±ò‘Þ¼Æ)jß1-noH‹Ü] PÙ ­]qí]ŠÜ+{ ý=Ùú¡…]}ÞÍ  @€�*P®SE‹) @`û&|RGs}ß5Ù¿Ú¾‘ô®d�LzXû¿/>(^ä†Ø  @€ @€ÊL`ó¶�øØ+ââŸÜÙlîÁ5¦í;OÍÄ„6·vsWÓ’å/ÐÒ1.®ºã‰¼þM(ÿ¬D˜·@6Vôe�|lÙç7åÝW @€@ Ø©âÅ• �»Àœž·6f;˜ö8,÷^ZV›@}ZÝþÅ-Œ£Ú¹ÚR“ @€ @€@ núù#qâÙËcͺ�yE19=µ}nzj{½SÛórÓ˜•"ÐÖÙWþìÉÎç›O•’œ8sH¿÷veKkö•÷_±´/çN @€ª\@�{•/°ô @€�zN¯Ÿ‘}â¿’H^•CkMªT )= ë§í;»J3” @€ @€@±¶õÆ'¿zK|ã÷æU¼Ø0rjû”LLlw;·Økf>[ £³3®¼kC æñx�bi¾1HÿÅ¿tõ”Gþ..½thÌ'3 @ |׿Iˆ @€ÀX œž™9û‰¯F$;–³»¼ºÚã’O/Úsfy*: @€ @€�ЏíÞuñæÓ~Ën_ù”,޵ï1£.Ú›·WÌb ”Û!Ðß×ógwÆš'bp(Ÿ1¶cR]ËQ`�ÎÍÓzW®øA9'& @€@±¸[Ü| @€@9 $Ý‹ö9+ è˜r J,ÅØabkZÜþ’ØcçiÅ�Øl @€ @€U)Ð?0Ÿþú­ñ¡soˆõ½Ûrα>±ËÔLÌž˜‰ºôï.¨�þ¾þ˜7³=ÖnŠþÁáÚI\¦OXÐ5g¿†Þ•·\óô7üL€¨5îµ¶âò%@€þO {áâ�Dü¿ü¥ææÎ茋?ñ’ØiæÄšË] @€ @€…øùo�7äGñ“Ÿ®Šl‡ðNhûéí�-Nm/üª‘•!Ðßßswh�õ›²±­_‘{e¬ÚXD™Ú5gÿ�éIî7�ÅèÆ$@€TŠ€’JY)q @€è^tÜâˆäì‚j°ŠxÁ.â‚S_S'vTTÜ‚%@€ @€(?�Áô´Ý3ÿãŽøü¥wÅàPîE‰#'µï49S;ݶ-¿UJ#ÐÚÒw®ˆG7ô•&³–…@úE¹·>´üœ¯—E0‚ @€”@ÀNI ÐMI€”V`Æ¢%G'‘½$�Âg¡Ò.EÉf_ø‚iqî�ñ�­%‹ÁÄ @€ @€Õ!pïƒëãø3–Å=¿[ŸWBãZ“Øej&šêóê¦1Ô€@ssSÜ·6kÛZÙJñY†’lòºÕËϾüYÞ÷2 @ ªuUõòJŽxºÀÌ…Kf“ì•éë�OÏϵ!ðÒºãÌ÷í­Mµ‘°,  @€ @€ÆD`h8ç}çÎ8+=¹} =Á=×käÔö9“2±C—[µ¹šiG€�Zhjlˆ××Å�l®Åôåü�¾Èd_²æÚ¥×!@€Ôš€]“Z[qù @€�˜uØ { Ý�Œ«a†šNýÏŠ3Žï‰Ößo¨é_É @€ @€¶Sà7«7Ä ÿ~]Üõ›Çò©³%‰]ÓSÛ›òê¦1Ô¨@C}}¬ÝÜ÷®ÚX£ÒN6g³‹^¾ô @€�ZPà^K«-W PÃ݇Ÿ0#†oŽHfÖ0CM§þúE;Ƨ�[-îÖôï�ä  @€ @€Û#�ÍF|黿ˆûÖmÑ×?”óP™ô®ììôÔöãÜžÍMCø½@]úè� -q×½DjWà±ìÐÐ!ÝpÞ¯k—@æ @€@­ ØA©µ—/¨A��Ž<¦« yyšúÞ5˜¾”S�7¹S|â= £©±ž @€ @€�Q <øHo¼ïÌëâÖ{ÖåÕ¿£ù§¶{¨`^l @€ÀŸ$I}™ö¸å¾ òª¿Ö˜Àªl’=ø¡eK×ÔXÞÒ%@€jT@�{�.¼´  @€@­ì±Çé�OM\ÿÃHâˆZÉYž.ð/Ý%>òÎC¢±¡îÏßð @€ @€�.üþ=ñé o‰-Ûsì‘>KräÔö‰8µ}äï. °}Id;âÆ_>¹}Ãè]Éw76l;ä·W}é©JNBì @€�\l¥ä¢¤  P¡§gº{Ö#²ñ¦ M@ØÛ)ðŽWîÿòö£¡^qûvRêN€ @€¨I�‡Û'žµ33ŠÛkâ·D’(¾@¶ï©X¸×øâOlÆòHŸZýÔ¤õ_Nƒñ-ºòXQ @€c$àÃÎÁ–(­ÀÌ…‹ß›MâÜÒFaöR ÿ·{ÆñoÞ/ê2¾ÏYª50/ @€ @ RÖ­ß8çú¸ö¶Õy¥ÐژĮӒ9½ÝE€ÆZ ¾¥+–ýÜIîcí\®ãg³É'Z~ö‡Ë5>q @€¶WÀîÊö êO€”�@÷¢Å¯Mƒú¯ô>ë”ÝêŒ}@'½iŸ8ö�ÉÈqY. @€ @€y\¶ì�8õ 7ÅS›úòèÑ=>‰Y3‘±%•—›Æ °} i‘ûµŠÜ·±¢{'Ǭ¹îì *:Á @€žEÀ˳Àx™¨L�é ”ÞDº:�¾¹23õöœú�/ˆcþfAZܾ=£èK€ @€ Pk›¶ÄÉçÝß]v^©7ÖGÌ›–‰®RyÁiL€hlëŠkît’{Á@+k ¡ˆáW®¹îÜ+*+lÑ @€ž_ÀNËóiA€TˆÀôÖÌË goJÃ�P!! ³€}û‚ø§×¾ €#Š @€ @ n»w],þܲX½nc^éNlOb—)™¨¯Ë«›Æ @ àM#Eîw­�l¶àC°ü6g2±hÕµçÜ^þ¡Š� �»€÷Ü­´$@€ÊX`NÏ{¦ dëoN?ÜÌ)ã0…6FŸz×~ñ–Wì=F£– @€ @ †Ó*À³.¾#–^rg  çœbúɘ›¶Oít«5g4  @`ÌZÚÇÅUw>¡È}Ì¥Ër‚µõIæÀ—�õ`YF'( @€À(캌M @ ¼&|RGsý¶ëÒ¨ß]^KS”h>wìñ†—îY”¹LB€ @€ PkÒÓÚ�KOm9½=Ÿ«½)‰yÓ2ÑÒ˜O/m  @€@qZ;ÆÅ•w(r/ŽvyÍ’ÞoÝÐÀÁ«n8ÿÉòŠL4 @€�Ñ (p�›^ @€@™,XpLú¶¦ÿ‰$yI™„$Œ" œ}ÂAñº#v/⌦"@€ @€¨t�ï.»?N9ÿ¦Ø¸¹?¯TºÇ'1{b&ÝŠÌ«›Æ @ ¨­]i‘ûz'¹U½l&[ÞÜš=êþ+–ö•MD!@€ŒR 3Ê~º @€ÊA y´£ùÅíå°Å�!“~Š=ÿ‡*n/.»Ù @€ @€-°ië@,NOmù_>Åí�õ{ugbÎ$Åíý xÔˆÀ–�OÅQ/œà Y5²ÞOKsáÖ-É…§«{Œ  @€�ʨ«¼�EL€øƒÀŒ…K>žþm1�Ú)n¿àƒ‹âe‡îZ[‰Ë– @€ @`Ô·Ý».þþÔ+bÅ/׿5ÆÄö$öœ^­�ŽmÏ Nc(©À@__ÌŸ3>~·v[dK‰É‹-�~bÙ³sÎÖ–Þ•+®*öÜæ#@€RÀNL!5�E€M`ÆÂãÞ™$ÉŠ6¡‰ÊB >­nÿÊ)‹âðýç–E<‚ @€ @€(o�ál6κøŽXzÉ�184œs°™ô.êÜ)™˜ÚévjÎh @€@Ù ttvÅ�ödŒü{èª-�$Ç®^~Îyµ•µl  @€�j°#SM«) P#Ó÷ÊôaÀ—¥éz¼^�¬ùHš#ÅíßøÈáqè‚95”µT  @€ @€F+°fÝÆ8îsËbäôö|®ö¦$æMËDKc>½´%@€å)О¹_yÇ“14¬È½†¸†&@€ /Ð}Ø’ýÓc&®MGn)üèF,W�ÆúL|óô#â }g—kˆâ"@€ @€(#�ï.»?N9ÿ¦Ø¸¹?¯¨ºÇ'1{bz¼†»¨y¹iL€å-ÐÑÙWÞ¹!}š‰"÷ò^©‚G·5½¯Ú³æú¥·|d @€ÆXÀÖÌž(œ@wÏ ;GvèætÄI…ÕHå.ÐÔXßþ葱ß^3Ë=Tñ @€ @€”X`ÓÖ�8ù¼c¤À=Ÿ«±>~j{W‹Û§ù¸iK€•#Й¹ÿä®´È}P‘{å¬ZA"},©Ë¸úš¥d4ƒ @€Š$`‡¦HЦ!@€¶O`êAïšÒÐÐxS:ÊÜíIïJ)n¿8-n‘âöJZ6± @€ @€J"pû}�Æqÿvm¬^·1¯ù'¶'±Ë”LÔ×åÕMc Pq#Eî#'¹8ɽâÖn;þÍpÒpÐÃËÎx|;ÇÑ� P4îE£6 0Z�é ŽiÍ´7_›ößo´cèWy�õ™¸(-n?`ŸY•¼ˆ  @€ @€Š&0œÍÆYßK/¹3‡†sž7“Þ)Ýir&¦u¹eš3š† Pñ��qå]½10˜û¿™Ÿ´R�ìÍÑ_Äš›ÏÜŠƒ P Î!¨„U#¨i�Ó3]»\”¼¸¦j,ùúL&¾yúqо³k,sé @€ @€ä#°&=­ý­ýIü÷µ÷ÇH¡{®W{S{Ψ‹ñmŠÛs5ÓŽªC ¯¯?æÏîŒU�÷ÇÐpîÿvVGöµœE23êb~ï~³þ+î¹ÇÂ×ò¯‚Ü  @€@…(p¯�…&¨U�={<½Åô®ZÍ¿óNkÛ㧇.˜S‹éË™ @€ @ G�ï.»?Þöñ+ãÁ‡{sìñ‡fÝ㓘7- õyuÓ˜T�@ÿH‘û¬‘"÷EîU³ª9%2¿kSggïÊ?ΩµF @€� 8’ „ø¦&@€ž[`Æ¢ÅoI?¬|ã¹[y·šFŠÛ/<åð8lÿ�ª)-¹ @€ @€P`ÓÖ�8ù¼c¤À=Ÿ«1-h)lïjq‹47m  @ z::Úãš_lо�¡êMRf!�M²'<´léYñ† @€e$`÷¦ŒC( @€Àÿ˜Õ³ä�ô‘ÂW§¯4þÿWý­šFŠÛ¿ü/=ñâw®æ4åF€ @€ °wüêÑxïg¯�Õë6æ5ÊĶ$v™š‰zÏ·ÎËMc¨~�ÎÎŽ¸ò®Þ®þdeøG�ld’£×\{öýñ @€ÊM@�{¹­ˆx @€�˜uÈ ; × ­H)&ᨠ�‘âö/ž´0^zÈ®µ‘°,  @€ @€ò¸à²_ħ/¼5¯¼$½ºã¤LLç¶hÞà: @€@ÍtvvÆOîÚƒƒÙšÉY¢Ñ7œ�Ã^~ÎM, @€å(`'§WEL @ †v:ò˜®¾�æ›Ó)ók˜¡¦R)n?ïÄCã‹æÕTÞ’%@€ @€ÈM wsœpæuñ“Ÿ®Ì­Ãÿ¶jª�Øm‡Lt4»%šœÆ P“i‘û•w¦EîCŠÜkè`}$uû¯Yvæý5”³T  @€� °›S! %L P=§×wg×ÿ Íõ¨šÈW’¿Xú¾ƒã5‡û>ƒ_ @€ @€�¿¸ë7�Å»?sM¬^·ñ/ß|ŽW&´%±ëÔLÔ×=G#o @€&0Räþ“;6ÄPz´·«fîklØvÀo¯úÒS5“±D  @€�ŠHÏËt @€ÊC ;ÖŸ•F¢¸½<–£(Qœµä@ÅíE‘6  @€ @ ò¾zù/ãu'}?¯âö‘Ó½vœ”‰Ý§+n¯¼1”Z`cooõ‚ñ‘Iœ—Yêµ(âü»õ÷7]éAdEœÓT @€�çpfÁói@€C »gɱ‘��c.s”‡À¿½wÿøÛ—ìYÁˆ‚ @€ @ l6mˆã>·,.¸ìy� Û”–eí>#“;å•Íb „*N ¿¯/æÏ¬ÝZq± x”I²sg²µ«÷Á?åº @€ . À½à¤$@€òèîYüÒ´¸ý›i?wžòÅ«ÐöŸz×~ñ¦—ï]¡Ñ › @€ @`¬~ñÀãñw§^·Ý³.¯)Æ·%±çŒºhi´Å˜œÆ @à~_ä>{|üV‘û3èTíKtÌÞoíÆ•·Ü^µJŒ¨(;<µ\‚%@€Õ'0ë°öº)ͬ³ú²“Ñ3 |ìo{õ¾Ïô–× @€ @€jXàëß¿'>ö•Ñ?0”³ÂÈÍÎÙ“2Ñ=ÞmÏœÑ4$@€9 ´´wÅUw®�l6ÇšUºÀ`ºÔG=tÝ9×Vz"â'@€*_ÀNO寡  @€@Å L;ô¸Éu™ä–ôÉœŠMBày |äŸ^ÿüºæÕGc @€ @€�êØ´u N:çúøŸë›W¢�õ»MËDg‹[žyÁiL€òhj늫Ó"wWÍ<™>y{ÿ5ËÏùMÍd,Q @ ,ìö”岊T¿Àœž·6f;¯N3=¨ú³•áˆÀÉÿð‚x÷ß.€A€ @€ @àÿ~ùÛ'âÝŸ¹&~÷ðSÿ÷Z.ߚĮiq{C].­µ!@€¶G ±µ+®¹K‘ûöVXß_Õ'™\vÖ† ‹[¸ @€@ dª(© @€•#�¤Åí¤á*n¯œ5Û®HOzÓ>ñ®£·o¢Î @€ @€�*øæ÷Æ«ßyÞÅí³'fb�ŠÛ«ì×A: PÆý[žŠž½&”q„B+°À¼Áìð%Ñszú¼ @ 4Î4(�»Y  @€@M Ì\¸ø”HâøšF¨¡äß÷ƽbñß¿(’ÄÃjhÙ¥J€ @€xV�ÍÛâ}g.�Ï_zW eŸµÝÓßhLK¬vŸž‰)�ö™žnãg 0ÖÃ}1{ú¸Xõè¶±žÊøå!0·3¶Žï]¹âŠòG @€@­ (p¯µ—/(±ÀŒEKŽN‹ÛÏ/q¦/’Àâ£÷ˆÞ¼d2n:‰Ü4 @€ @€�²¸ïÁõñ÷§^7ÿ⑼âךĞ3ꢵÑ>S^p @€�B õÅÌiãbõcŠÜ ÉZÆcíß±ãþë6>¸â¶2ŽQh @€@• ت҅•(G�™‹–¼(ÙåilÍ埘 +ðî×Î�¾íÀ¨Ëd ;°Ñ @€ @€*Ràâÿ*Nûâͱ­0¯øgMÌÄÌ Izn†‹(½@Cõqó½O–>C`(›>ê¡åç^SŒÉÌA€ø£€} ?Jø“S�é ß73“ Þ’N2mL'2xY¼ãUóâ”·uuŠÛËbAA€ @€(¡ÀÖ¾ÁøÐ¹7Ä_{^Q4¤Ï¢ž7-#§·» @€�rH¢?Ó·üjC9%–±x2;4tÀC7œ÷ë±›ÂÈ @€�?°ôç~"@€Æ@`rÏ{Ú›²õ7¤Cï3òÌÞü’�ãcï>4êÓ;�. @€ @€�šøõª'ã�Ÿ¾:î_�_\WKóvÈD£-¦šþý‘<”¯@’$±9Û?ûÍSå¤È )ðëÌÐÀ«n8ßÑý…T5 ð¬ŽÔ|Vo @€8úèºÆlÝEéXŠÛ ZÞƒ¼ê�Ùqú;QÜ^ÞË$: @€ @€@Q¾sÕ¯ã'|/ïâöY’س[q{QÉ$ @`”Ùl6ڒͱïÜ®QŽ [… ìš­køÎ‚Ç4TXÜÂ%@€*T@�{….œ°  @€@¥t¯Ûá3I$¯ª”xÅ9z�žìŸ]¼0šëG?ˆž @€ @€/°­0ÞwæuqâYËckß`Îù4¤§µï9#³&fÂc¨sfÓ�”L`¤È½³~KìµcGÉb0qñ²G®ëh>³x3š‰¨eõ«åÕ—;c�î…KÞžÞ‰úÌOcø2xá¼Iñ¥“_�íÍe� @€ @€J%°jíÆø»S®ˆëîx(¯:𓨫».Úš”¶ç§1(±ÀïOroж¶¶xì©þGcú"ì×5ç€ÇzW®¸µs™‚¨a;D5¼øR'@€c)ÐÝs|Od‡¯Lçpœ÷XB—ÁØófuÅÅŸxYLžÐ^Ñ� @€ @ TËn_Ç}îÚØ°±/¯¦u%±ÓäLdܹÌËMc PNõuuñÈæÆøÕêMå–XÆF`h8ɾôáeK¯›á�J€O÷óK@€^`NÏñs³Ã·¥#O,üèF,'�™SÛã;ŸzitOWNa‰… @€ @ ÈK/¹3θèöÎæ� Ù¡¡ýºá¼_?_Cï @€F#`·h4jú @€Ï*0}Á1­™öæÓû>k#oT…À„Φøî¿þuì4Ó÷ªbA%A€ @€…À¦­qüËâÇ?]™WïÆô¹�ówÈDG³Û•yÁiL€Ê\ ¹©1~ùH6yb[™G*¼ü&34°ÿªÎ²c‚ ðg™?ûÉ @€�íH2í-_N‡Pܾ}Žeß»­¥!þããG)n/û•  @€ @`ìXóT¼ò„ïå]ÜÞÙ’Ä fÕ)n»¥12(™À¶¾þØsz&&t6–,M`—áLÃ¥ ÓP´MD€ÔŒ€÷šYj‰ @€�±˜¹pÉû"²7ö3™¡”�õ™øöG�Œùs§–2 s @€ @€”P`äÄöW¼ï²¸͆¼¢˜>.‰½fd¢¡.¯n @€$°u[_¼h§¦hoIÙâªn�$ŽXÛÞrvu'); @ ¶ŽJ¡nN P…Ó{Ž;2}˜ð7ÒԉĜÝ4$@€•*000»Ìh‹5O ÆàPúÂUµéG»uÍÞÿñÞ•+n­Ú$%F€]ÀöQÑÉMH€ªO`öÂcwJ2·¥™M¨¾ìdôG�‘âö >¸(Ž:x—?¾äO @€ @€�èÝÜÇþÛµqím«óʺ)=¼uþôL´7¹5™œÆ @  ::;âÊ»žŠÁAEîU°œÏ•ÂPú5Æ—­ºîì+Ÿ«‘÷ @€¹ ØEÊUJ; @à¦õþ¶†¾þ›Ò7÷~Æ^¬�³–¯ñU“�D @€ @€r¸ïÁõñÏŸ¼*V>Ò›{§´å¸Ö$vKOn¯÷\é¼Ü4&@€Õ$ÐÑÙ?þÙ†yŒ«Š’§"ÉüÕšegÞ_ÅIJ�(’@z§‹ 0j�¤¾¿ï+ioÅí£&¬ŒŽýçŠÛ+c©DI€ @€(¸Àÿ\ÿÛxõû/Ï»¸½{|{ÌPÜ^ð1 ¨0��½½ñâŽ�Ä1œ¶rù†›íŠìÐw'÷¼§=ßžÚ @€ž. Àýé"~&@€rè^´øI6yCÎ4¬H�ÿn¯xÛ«_P‘± š @€ @`ô#§¬~ü++⽟½&¶lÌy ºôän;dbΤL¨cË™MC PÕ›{ŸŠÃ÷™PÕ9Jî÷{6gëGHó1Ð/ °]¸]|: @€�Ú˜¹ð¸£Òc¾– Øœ¨â_ƒw¼j^¼ÿˆLÆ2Wñ2K� @€ ðë{·Å?}üʸlÙñÞs½ÐܱWw&ºZì'=—“÷ @€@- ôÅìéãcÕ£[k1ýZÊy�®÷ßÔûàŠ›j)i¹ @€…°³TXO£ @€�š˜yøqs³CÉ­i²ãk"áMò GìŸ>nQ4ÔûNd�þ H› @€¨Q�_Üÿxó©«bÍ£›ò˜Ð–Ä®Ó2QïÒy¹iL€jK ‰�ºöXq߆ÚJ»ö²Îf⨇®=çêÚK]Æ @€@!¸BÑ @ †&÷¼§½)Û�~Û>»W ¥]s©¾ì€™qöû�–‘#·\ @€ @€5#péU¿Ž“?SlëÌ+çY’˜5Qe{^h @€�H’$z‡Zã®zkT fÒ~b¨nhÁ#ל·²f2–( P0»L£4¨ �¤)[ÿ5ÅíÕ½Öï=5Î8a‘âöê^fÙ @€ @€þL`ph8N9ÿ¦8ñìåy·×¥wwŸžQÜþgš~ @€žK ›ÍƸ†­±ÛÌŽçjæ½Ê˜X?”ùïîOh©üTd@€[@�{±ÅÍG€*X »gÉÓðÿ¦‚Súóì³óÄøü�ˆŽ¶æçiém @€ @€�jxìÉ­ñ·ÿòÃøÆÞ,竵1bß™u1¡ÍC£sFÓ�ø½ÀPúåº:úcδ6"U,��ä…IÓÐùiŠ>0Vñ:K�Œ…@ÝX jL @ úº{¿4²ñÕ43›Õ·¼¿ÏhîŒÎøæG_“'´Wi†Ò"@€ @€xºÀí÷=o<å‡ñëUO>ý­çüyR{’žÜ^�õÏÙÌ› @€�gŽ)�™Ø:T›¶>k;oT¼À¾]³÷¬wåŠ[+>  @€EP V4j @€�Êèî9açÈ�l8Œ«Ü,Dþ\;Ll�ÿüÌËbÖ㟫™÷ @€ @€ªHà[WÜùÒÍÑ?0”WVs&e¢{¼ÛŒy¡iL€<«@KsSܾr0Ö÷ö?koT¼À`&I[µìì*>  @€E°óTf“ @€�ʘtðIÍõ[oNnߣr³ùs ´µ4Ä÷>û²˜·ã”çjæ= @€ @€�*ÎÆ‡¿pS|ó‡÷æ•Q]&bÞ´LLhs‹1/8�  @€�çhkk�µÕIîÏ+UÑ Ö&ƒÃ VßxîÃ�…à  @€�¢¤ÛP. @€À³ $Íõ}*nVŸŠ£>“‰oœv¸âöŠ_I  @€ @€rèÝÜo9íGy·77Dì3Sq{nÊZ @€ù lÞ¼%�ßÍ�uùvÕ¾r¦eë“ÿÜc�Ó+'d‘ @€¥Pà^*yó @€� ˜¹pñÉÙ×U@¨B¥Àù'ûí5s”½u#@€ @€¨$�ß=üT¼ò}ß‹ëï|(¯°;[’´¸½.Z�ÜžœÆ @€@^7nŽÃöêˆúzŸ9ò‚«¨ÆÉ�½ן]Q! –(‰€¯=–„ݤ @ üfvÜËÓ“Û/H#µƒTþË5ª?ùÎÅë_¼Ç¨úêD€ @€ PY7Üõp¼éÃ?еOlÎ+ð©�Iì¶C&ꛕ—›Æ @€Àèúûúcþì®øíھȎn½Ê] ‰¿êš½ßêÞ•·ÜQ�(�€‚µÒÙ›™”­@÷ÂÅ»D’ÜšžÞÞU¶A l»½G¼ÿL—y»†Ñ™ @€ @ ¾ùÃ{ã´/݃ƒÃyE;gR&ºÇÛ@Ê Mc @  m]ñ“;ÖGV•{A<Ëp�þ$’CV_wvzOÚE€øK;Riâ PÓ“>©£©~ÛŠôCÂüš†¨âä�>lÇø×%=ÑPïa>U¼ÌR#@€ @€ÄpZö‘/Þ~ÿž¼4êÒÓÚçMËÄ„6·ó‚Ó˜(¨@CKW\ûóõÓ`e%°f` Áº›¾ðhYE% @ ,Ò¯:ñòX~ÇCyat6'±ï¬ºhkrr{^p @€c&МÝ{Ìî³ñ \j�¤gFvý¿–: ó @€å'PW~!‰ˆ(…ÀôžãŽL²ÉWӹݽ*ÅŒñœSÇ7ÇÅŸxYL›Ü9Æ3ž @€ @ ”7ÿâ‘øûS¯ˆ‡ßœWS:’Ømz&ê�•—›Æ @€ÀØ d³ÙèlÎÆp¦1žÚ<8¶“½$éÍ黿ì÷ëÞ•·Ü]’LJ€”¥€¶²\A @€�â t~ÂŒº#�urqg6[1Z›êâ²ÏþuÌŸ;µÓ™ƒ @€ @ Dßþñ}qêù7ÅÀàp^Ì™”‰îñnæ…¦1 PT�ææ¦¸cå`<ÑÛ_ÔyMV4�­1œ°æú³^´MD€”µ€3ÊzyG€Æ^`Á‚c²CCÿ‘Τ¸}칋>C&ý´wá‡�PÜ^ty @€ @€Š'0œžlzú—~:÷†¼ŠÛ3iMûü·o¥ÌD€ŒV`Û¶¾xÑNM1r°“«*Z"“ýn÷�'L¨Êì$E€ä- À=o2 @€@u ¬koùdzë�êÊJ68ïÄCãÀ}gýñG @€ @€T™À¦-ñ�§ÿ8¾rùݑֹç|5ÕGì33Û�Üž3š† @€@I6mÞ={vD}�Ï/%]ˆ±›|§hº(Ž>Ú·ÆÎØÈ @ b| ¨˜¥((¼ÀÌ…K^IviáG6b9|ôí â /ݳB @€ @€À¬Z»1ÞpÊâg÷=š×èÍIìÙ]- ŠÃò‚Ó˜(¹@__ÌŸ=.X»µä±`LvîØÒQ·ñÁ׌Éè%@€*FÀ®UÅ,•@  @€@afrÂNÃuC·§£Ž+ìÈF+�w¿v~üË?Iâã^9¬‡ @€ @€…Xq÷Ú8æSWÅúÞmy =¹#‰]¦f"cÛ(/7�  @€�òhlëŠkî\_^A‰¦`I’yíêeg]V° D€Tœ€­«Š[2 @€�í˜ÓóÖæ¡lÇ�ÙH^¸ý£¡Ü^³pvœqÂáÑØàa=å¶6â!@€ @€Bà?~ò«8ùó7ÆÀàp^ÃÍž˜‰™ÜÌ Mc @ l†ê;âæ{7”m|Û.��ÃÉð~/;÷¾íEg @ b2¹À  @€�Q wž©¸}Ô|eÝñ ½¦Æ§�]¨¸½¬WIp @€ @€�Ñ d³ûòO㤥×çUÜ>rZûn;(n�º^ @€@¹ Ômнvì(×ðĵ}™læÒé Žiݾaô&@€*U@�{¥®œ¸  @€À(º.ùûlïewÝÊX`çîÎ8ï¤Ã¢½µ©Œ£ @€ @€Àh6mˆ·}ìÇqÁewÇH¡{®Wc}ÄÞ331©ÝÉí¹šiG€T†@6ýP4±¹?æLk«Œ€E™¯Àž™öæ¥ùvÒž¨�ºêHC @€@.³=n÷l&.OÛ6æÒ^›Ê˜ÔÕÿñÉ—Æô)]•´H  @€ @€rX³nc¼ñ”Æ­÷¬Ë©ýµ7'±×ŒºhiTÜþG @€Õ%0<<S:3±±¿.¶lª®äd3"ð‚ŽÙünãÊwá @€jKÀnVm­·l  @ †&÷¼§½1[Kú�ÿüf¨ÊÔ››ê⻟yYì¹Ë´ªÌOR @€ @€�Z¸ý¾GãíÿI<ñÔ¶¼FNlßuZ&2îæå¦1 P™ím­qý}[b³"÷Ê\ÀçŽzKf8û¢U×/½ç¹›y—¨&�L5%# @àY’¦¨ÿ‚âögõ©Ø72é§¹¯�r˜âöŠ]A� @€ @€ž]àG7?o<ù‡y·Ï—Än;(nvYï @€Õ&°ió–X¸{{4Ôùv_µ­mšOëp&¹têQïo«ÂܤD€<‹€÷g�ñ2¨&� �;&²ñ¦jÊI.8çøƒã�ÎÁA€ @€ Pe_¹üîx×§¯Žmýƒye¶ÓäLì˜þÏE€¨5��7Å‘ûŽ�D�{5.ýî�ýýçUcbr"@€žY î™_ö* P-³[¼ "ùÏ4ÿîWË¢þozó¾ñ–WîSeYI‡ @€ @àc_þiüûE?‹l6w‹LZÈ5rjûÔN]¹«iI€T›@__ì:kBüvíÖjKM>ûvÍÙUïÊw @€ª_ÀWõ¯±  @ †fòîñÃu ·§;Ö0CU¦~ôá;Å¿-鉺:§qUåKŠ @€¨I�þ�¡XrƲøþ ¿Ë+ÿúôh‹Ý§g¢³Ù­¿¼à4&@€ªV ÛØ7þòɪͯ†ÛšžÐ¿ßêeçÜ]ÃR'@€5! "ª&–Y’ P£Ép¦ákiîŠÛ«ì`¿Ý'ÇÇÞu°âö*[Wé @€ @€µ-°ac_¼ñ”+ò.nonˆØ§»Nq{mÿúÈžxš@f`cì3·ói¯ú± ZÒ§]:¹ç=íU�‹ @€�çPàþ8Þ"@€•,0³gñ‰‘Ä«+9±ÿ¥À“ZãÜí­Mù¦W @€ @€*R`ͺ�ñš\·Þ³6¯ø;ÒÛ÷™Y-�yuÓ˜ PõÙ´ z|ö˜;½­ês­ÁwkÊÖŸŸæíñE5¸øR&@€�ÚHXè"@€ªM`VÏ’CÒ=›o¥yù2[-nSc]|ç/‰»'VQVR!@€ @€Ô¶À/î<ÞpÊcÍ£›ò‚˜Ð–ÄîÓ3Qïn_^n @€µ#0œÞ0�Ü‘‰Íõ±yÛ`í$^™îÝ9û€Õ½+WÜQéÊ’Ôž€¢·Ú[s @€@• L=è]SÒÍšKÒ4ÝÚª¢µÎ¤ŸÚ¾ü/‹bþÜ©U”•T @€ @€µ-põ­«ãèý {rk^;t%1?-n¯s§//7�  @€�ÚØÖ×ûΪ�ö–úÚK¾Ú3N²çvºdïjOS~ @ Vl{ÕêÊË›ªSàè£ëê¿�&7½:¬Ý¬>þŽEÏ‹vª]™ @€ @€ªLà[WÜÿü‰+ÓÓDòÊlΤLÌ�’‰$¯^ @€jW`ó–­±p÷öôÉ7>AUÙoAsd²—N:ø¤Ž*ËK: @€@* Àݯ¨"�îG§Ÿ–ÞÙ:¢ŠR’J*ðO¯Ø5Þò ‡øe @€ @€T‹À¿~ýÖ8ùó7ÄàÐpÎ)%i=Ö¼i™è¯0+g4  @€ÿ+ÐÛ»1ŽØg<�êص¹¾ï‹iZ>$WßÚʈj\ ®Æó—>¨�™‡-yId³_JòÞ«fU#áôø×Å‹¢¡ÞǶ*ZV© @€ @€5*088'œy]|ý÷æ%PŸYµÇŒLLh³õ—œÆ @€�?èï‹Y;Œ�U�mý“Wýµ öꜳÿý+WÜ^¹H�ø_»`~ @€@L_ø¾™™dðŽ4•‰U�ŽþW`îŒÎøÏϼ<&�ocB€ @€ Pá›¶ Ä?òʸñ®‡óʤ©þÅí­�nëå§1 @à’ô±8ëû[â—n|†w½TÁ}Ù$sÀCË곂s: ð'éy. @ ’,8¦!“ \’æ ¸½’òi±w´6ÄWN9\qûÓ\üH€ @€¨D�G߯ùÀåy··5%±Ï̺PÜ^‰«.f @ ²ÙlLií�›Ë1<1�^ )Égçý�ëýz @€å$ À½œVC, @`�¶74"9p]u)S�Lú ík§sgM*Ó…E€ @€ �«À½®�W�xyüj哹vù}»ñ­IìÝ�‰Æôw @€@ác�îúhoñA«pªe1Ò.[[âKi$}TË! °}uÛ×]o @ ”3{x$‰ÿ“^ÊEƒ¹Ï\rP¼øÀ�Ç`dC @€ @€Sàú;Š7Ÿö£Xß»-¯i§v&1oZ&FBp @€^`¤È}—ñà£}1œ-üøF,�@Éž]sö[×»ò–ÛJ�Y  @€�B øÆZ¡$�C€Š,0½çÄI™ìÀÏÓiw(òÔ¦C�ãß°gœø–ÆpC @€ @€sp|5@IDATCàÒ«\z} ç5ݬ‰™˜5Á-¼¼Ð4&@€ŒR ­£+~ü³õ£ì­[™ ôg³<¼|éeŸ° @€�œû�’& @  ’ºìÀWÓ¸·—áâŒ6¤W2;ÿÝ‹FÛ]? @€ @€�28ëâ;âij®Ë«¸=IkÚw™ª¸½L–P @€@�lÞøTºçøɶfÒlÌ$É¥;yLWÍd,Q P… Ü«pQ¥D€Õ/Ðݳä½é“ò^Yý™ÖN†{Í�Ÿzï!ÑP_W;IË” @€ PeCÃÙøÀ9×ÇÝÙt/׫.½c·ÇôLLítr{®fÚ @€ &п1öÚ±³`è,æö49�Äì²XA @€�üTPåo¦(©@÷¡KöŽ${iD}I1yÁ&u5Ç·?þ’˜2±£`cˆ @€ @ ¸Ûú㟸*þçúßæ5qCz·n¯îLt¶¨½É Nc @€@:³1�±qË`G5T‰vïÜñ€Ç{\qK‰ã0= 0 '¸�M P*�é ŽiÍf²ÿ‘ÎßTªÌ[X�ÆúL\xÚá1sÚ¸Âl4 @€ @€�¢ ônî�¿;劸æ¶ÕyÍÙܱÏ̺hkRÜžœÆ @€� ¦OÔ©‹ögŒ˜¶´Ãe³gÌì9ö¯J„Ù  @€�Ñ(p�š> @ Du-ÿžÞêš_¢éM;Ÿÿ¡±Ï¼éc0²!  @€ @€Š!ðØ“[ão>øý¸íÞuyM×Ú˜ÄÞÝu1Räî"@€(½À–­[cáüö¨¯óåÃÒ¯FÁ"hÌf3ß™Ós¼ÓÆ Fj  PîÅq6 Øn�î…ǽ.›Í¾s»2@Ù|øm/Œ—²KÙÄ# @€ @€�üV­Ý¯ùÀåqïƒëóêØÑ=“ž šW7�  @€Š$0Ð׳§�‹U�n+ÒŒ¦k�ôŽìžsö`ãÊ?빌O€FÀ î…q4 ;�£�®ËÔe¿•Nà±ic§\Ô‘ØcJ|øG]ÆG±¢Â›Œ @€ P �[ïYó¡Ä£ë·ä5⤎?·×ÙÊËMc @€@Ñú7ÆÞ;v}ZŽ�@Zä~Þ¬CNØiìf02 PHÛg…Ô4�îG§�’{è mÈL×gŸØm-�%˜Ý” @€ @€Û+pím«ãM¾"žÚÔ—×PÓº’˜7-è—›Æ @€�’d³Ù˜ØÒÝ“[J2¿IÇD c¸nè¢è9½~LF7( PP?,(§Á @€@afõ,9$qa:jú…rW¥ Ô§'¶ûã/Ž]fOªôTÄO€ @€¨I�Ë–=ïùì5Ñ?0”Wþ3'$±Óä´¸=¯^ @€”R`xx8¦�oˆG7Fúùo¸”¡˜»pÝ�±-zW®XV¸!�D€Œ…€ÜÇBÕ˜ @ ³y÷øálö¢t(ÿ^À³†8cɱïnÓË!1 @€ @€ä)ðõïßKÎXƒƒù7�¶Ïžh‹/OnÍ  @€e!°eë¶8d~[Ô×ûªbY,HA‚Èž:rÐ\A†2 0fvÓÆŒÖÀ @`»’l]ÃÓfm×(:—�À;_=?^{øîe�@ @€ @€r8ëâ;âÃ_¼)Ò)rî4RµëÔLL§*g4  @€e(°±wc¹Ïø2ŒLH£ȤŸë¿µÓ‘Çt�²¿n @€@¸Ù @ _�îžÅoOo•�o?íËSàཧƉoÙ/÷2Ës�DõÿØ»ð¸ÎòPü,É–dË»%ÙŽc'Þ²œÝ‰—°5ÐRî-�²CiIlÇ)[¡!q „$ìK ô_Ú½åÞ[î½P;¡¥¬¥ì$,$DòªeÎÿ(e Il{F:gæ7Ï“ÇÒÌ÷½ßûþ¾yžhæ¼ó  @€ @à Wüէㆷ.rô¶G%{hm%özCè ´"@€”F`÷ÐÝ±éø¹¥ÉW¢‡X>2Úù†CŽ2€˜6�ê´­la @à~–oÚ¹6�ôŸ²Ûïw€;K%°dÞÌxÛ®GD_oW©ò–, @€ @ ÕÆki\zãGã7}=E5;^jý@%úfjnÏg0 @ èã#1»wVÜñ‹‘¢g*¿É ß»âôoÝvë—&7Ü( @`*œà>•ÚÖ"@€‡8jËÓ;Ç“Ú;³a31ÔÃ%h«TâÍ/Ú‹ç÷” [) @€ @€üJàÀÈxüé5Œÿý‘oýê®IýÛž-uü`%fwinŸ˜A @€� ¤ÙWú,˜9‹çv–(k©T Mß°ì¬K�>è @€Ó" Á}ZØ-J€î_`,z¯Í9ñþuoÙ^µóŒ8qõ’²¥-_ @€ @€@K ìÞ;Oºü}qóg¿—Ë¡£-â„ÁjtwhnÏg0 @ D##£ñ eíÑ1ñÉF·fè©UÇþ>¶ìÊþšw#@€Š$ Á½H»!hi��­Ûi\ÒÒMTü…ÿmmüá9k›¨"¥ @€ @€š_àg¿Ø�ýó÷Ä­_ùq®bgÎÈšÛ—V£+û×� @ ¹vïÙçœ0;Ÿkl’�NÎŒ;/k’b”A€šFÀŸZM³• !@€�2 ,?{ç’ñJíKY óË\‡ÜÿK`Ó‰‹ã­—ÿ^tNÛåF€ @€ P �ܱ;žxÙûâ»ÿyw®|»;“Xß_ ‡xæb3˜ Pz�Jgo|ìËw•¾Ü#P«Uj›þó#¯û$ @ Np/Æ>È‚ZZ`W%{±ü·�æö&x,™73n¼t³æö&ØK% @€ @€­#ð�ïÝÿíyÿ/wsûœ™I? ¹½už)*%@€üF =0k—õüæ?•Y ’]´ûѽ`v™‹�;h& îÍ´›j!@€�R n¾ó¹iÄCK™¼¤ï%ÐV©Ä[ÿbk,šï�¬{Áø… @€ P`�ÏýŽø£¼'~üó=¹²œß�ĺìäöª«m¹Ü &@€4‹@š¦Ñß3 fw4KI­^Çò‘±Î×·:‚ú  @€@QªEID @ –n¾ä”¬îwdÿ¹ ÖO€×=gcœ½aET¢ @€ @€@k|üó?Œ§íú@ ïÉUðâÙI³¸•$×4ƒ  @€šL`|¼G-êŠÛ6µZv¬™[ÙNè]~ê·†nÿì—Ë^ˆü  @€@Ù4Ó•}åO€¥XôðçÎJ£6ÑÜÞVÚ"$þk�m�]°eͯ÷ @€ @€@±Þó‰ïÆÓ¯ú@ìÙ?š+ÑÁ¾$V-¬„Þö\l @€šV`÷î=ñ�ç4m}-WX’¼qù¦mN5k¹�W0M@ƒ{ÑvD> Ð2mF®‹HVµLÁM\è–“–Ä%O8µ‰+T @€ @ ¹þׇ¿Û®ûpŒŒŽç*lù¼J5ßåµ\h @€Z@`÷Ðݱq}_ TÚ%öŒ'ÉÛcË.ÕµÄv+’Š*P-jbò"@€Í,°të%�ˆ4^ÝÌ5¶Jm fÅß\þ°˜ÝÓÕ*%«“ @€ Pj�øÀ×ãù¯ùxŒ×Ò\uL4¶/�ëÜö\h @€ZH šŽFG×ÌøùÐH Uݬ¥&K{“}éÐm·ÞÒ¬ª‹]@ƒ{ÑwH~ ÐtËκ°/M*7e…õ4]q-VÐŒ¶J¼óê‡ÇŠÁy-V¹r  @€ @€åøÛ÷~5^ô†OE-Í×Ü~ô‚J ôin/ç®Ëš 05iö7漞jܵ/‰ý#ù¾)hj2´JN�MÝËO»yøö[¿Ÿsžá @€@|‡b… @€yjÕ¯ÏÆ÷ç™cl1^}éÆ8î˜ÅÅLNV @€ @€÷xó»¿—½)sûÊ…•蟣¹ý^˜~!@€¸_�ýûÄéÇtE[›¿ï¨\wV’$Þ~ôC/˜]®´eK€šC@ƒ{sì£* @ $K7]òøˆô %IWšØqÞqñû›Wd„‡ @€ @€Š"ðúw}1®~ëg"çÁíqÌ¢J,™­9©(û( @€@†‡wÇCNè+Cªr<„@öJ਑±Î‰ìÜ @€�)¨Nñz–#@€-+°tã¶þ´š¼7èjY„&)üœ÷Ç5ŸmUŸl’-U @€ ÐÄ7¾ãß↷.wsû±‹+±¨Ws{?5”F€h˜ÀèÈ�è_4;~ð³ý [Cà)8¡wù©ßºý³_ž²-D€„®,O 05IÚV}K¶ÔÜ©YÎ*�Xº¨;®ß¹):f´5j q  @€ @€ê$ðò·ýK¼2kpÏsrûDKûš%•XØ£¹½NÛ  @ %:Ò=±rɬ–¬½éŠN’7,ß´mEÓÕ¥  P` îÞ© @€@ó nÞq~DznóTÔš•Ìh«Ä›_¸5ÌínMU @€ @€J$pÕ[>¯{×seœd=íÍíó»5·ç‚3˜ @à>ããµ8zA½³Úïó˜;J'Ð;žTþ>¶ìr Zé¶N PV îeÝ9y @€@i–ž³}e–ì�¥IX¢(pÃŽ3býªEø¸ @€ @€Š!pÙ›>o~÷Wr%SÉzÚ×fÍíó4·çr3˜ @à�öí;g­™Õ‰?6ÝÊ.pæ`úó•½ù @€�²hp/ËNÉ“Ê)pÞyÕ«¼-KÞwÏ•s�õÓyLüáÖµ¿þÝ @€ @€ÅHÓˆç¿öãñ¶÷|5WrýFëú+1w–Æ£\p @€R`hh8ÎyÐÜCŽ3  É‹ûÏÞùà2d*G Pv îeßAù @€@¡²ø¹i’n,t’’;¤Àú£úâO;-&¾¢Ú� @€ @ ˜µ¬»ýÏ^ùÑxçM_Ï•`5»Z¶~ sfzó'œÁ @€“Ø7ü‹8ùØÙ“o`aÚ*•ÚÛV�»½£°JŒ4‰@µIêP(œÀàÙ—œ•ø‡,1ÿ¿-ÜîL>¡ÎŽj¼ãê‡Ç’½“Ÿd$ @€ @€À” Œ×ÒØqý-ñO·|+׺÷4·g'·ÏîÒÜž Î` @€�Ü�Õñ¨UgÄÝ{ÆrÏ5¡P ÇG“êÐí·~¨PYI†4™€Ü›lC•C€Å¸çÛ•ôï²lÚ‹‘‘,Wàu—ž«–Í?Üéæ @€ @€4X`l¬^û¡ø¿ûv®•Ú²«dÇe'·÷jnÏåf0 @€Àá Œ��ÇšE•èîj;¼fF �xÁàÖKN+LB!@€M( Á½ 7UI 0ýû÷$»²,N˜þLdp$ý÷uñˆ³Ž9’æ @€ @€4P`4kn?ÿ¥7Çû>u[®UÚ²ï\¿$׃ %0vg\·ãì˜Ñž}Wµ @€ @€@¡îÚ�{á{ãËßþY®¼ºfDœ0X�oùär3˜ @`êFö ÅqGõLÝ‚Vjˆ@R‹¿^uÚöÞ†”´ €÷Üt% @€@}–nÙñÇIš<¾¾QE›J�JöÑ_¾`s,Yàý†©t· @€ @`2'·?á/þ9þã¶;'3ü×cî9¹} 34·ÿÚÄ @€EHcѬ±èëÉ>�éVf�eû»’Ë\€Ü  @€@‘4¸i7äB€¥<çÒ�4�7”.q ßKàŠglˆSOXz¯ûüB€ @€ 0ýC{F≗½/¾úÝÃhnÏNn×Ü>ý{( @€�C ‰Ó��ÕJrèÁFW �gnÚñÈâ&(3 P îåÙ+™ @€@ñ’{k–V_ñR“ÑdyæÒxê£Oœìpã @€ @€¦H`÷ÞÑ{šÛ¿üíŸåZ±#;±ýø¬¹}â_7 @€eŽ-'¸ô\–ýzÀ<“xËà—Î}ÀÇ=@€LJ@ƒû¤˜ "@€÷Xºyû³#IqßGÜS��³â%nŒ¶ª?‰Ê²gò$@€ @€ZC`ÏþÑxòåï‹/~ó§¹ ÖÜž‹Ë` @€�‚ Ø3ǯè-XVÒÉ)°$:Æ_“sŽá @€ÀïTçw¿ @€“X¾iÛŠZRù§lèŒI 7¤€•¬§ýW=,ŽœWÀì¤D€ @€h]�}Æâ)WÜÿú?É…0ã—'·wµçšf0 @€�B Ìû@%ö/T^’É%pBïQ§}ièö[¿–k–Á @€À¯Wúk ? @€�I $Ysû_e£gMz†�…xùE§Ç‰«û ——„ @€ @€­,°d,ž¶ë¦øì¿ÿ8C{v¤ÓñÕÐÜž‹Í` @€� �ÓVuEµ’0;)åøËÅgo_�c¼¡ @€Ào hpÿ- ? @€�É nºäOÒˆ‡Nf¬1Å8ãq__ÌädE€ @€hQ�‘Ññø“«>Ÿþò�r ÜÓÜ>X‰.ßµ˜ËÍ` @€�â 'Î-n‚2›ŒÀ‚¶Jò†l O*LFË ð;Ùyn @€Àd–nÜÖŸ}Tþÿfã³/†s+£ÀÊ�ÞxãŸ?$º:}Wu÷OÎ @€ @€@s ŒŽÕâ™×|0>öùæ*°íž“Û+1«CÏH.8ƒ  @€ /06r æÌ鎟Üu ð¹JðÖÍ^qÚ׆n»õ+8 @€Àý 8Áý~YÜI€îW ©µ%oŒHgßï£î,¼ÀŒ¶J¼é[bNoWás•  @€ @ UƲæö ^zsÜò¹ä*9{«'ŽÐÜž Í` @€� ¤1¿k$æ÷úª¢mÚ}RMÓxÃò³w.¹Ïî @€* Áý <$@€¿XºeÇã“Hý›{üT6�Wî<3Ö½°liË— @€ дãµ4.|ù‡ãæÏ~/W�Õ_6·w;¹=—›Á @€å�SVuE[Õ7•kçî•mßx¥öWÙ=6ñ^,~!@€Ⱦ¸Ñ�8”Àâ³·/¨$É{³q35ÖãÅxò#VÅE�;9osƒdE€ @€´œÀDsû¶ë>ÿü©ÛrÕþ«æöžNoôä‚3˜ @ ”###qÌÒ9ñ�ï+eþ’¾GàØÙ+N½mè¶Ï~� 09'¸OÎÉ(hq�j%yMF0¿ÅJ[þŠ%Ýñ‚§�¦¹½´;(q @€ @ Ùji;o¼%Þó‰ïæ*m¢¹}}%4·çb3˜ @ äûvÅ G÷–¼ŠÖN?M“W÷oú³¥­­ z 0y î“·2’ZT`é¦K��õÇ-Z~éË®dí¼ö¹›cNoWékQ @€ @ ²ÞöxÎ+?ï¾å۹ʩdoÒ­ËšÛ{»œÜž Î` @€�&Hc~çH,˜Ýѵ´l ½•dì-Yõ^дìS@á �G šg°± @ ÕŽÚ²sN-Ò÷eu÷´ZíÍRïU矿·ñ˜f)G @€ @€�Ò <ï5‹w}蛹êøUsûœ™zArÁL€ Ð4ãµZ¬X<3n»c$jÙ‡FÝJ)°²gù©?¾ý³Ÿ+eö’&@€S(à÷)Ķ”O`,j×gY/)_æ2žxèÉýñ¤Gƒ @€ @  /|ý'â|ð¹²I²žöµÙÉíšÛs±L€ ЄÃûcë‰s›°²Ö))I’–oÚ¶¢u*V)8< î‡çf´€@ÿ–í�4žÙ¥6e‰}=ñ’‹ÎŠö6_XÓ”¬( @€ @ t/~Ó§âïß÷µ\yßÓܾ¤}NnÏåf0 @€@ó ìþE�ëþî_ã�ÿëK¹86knŸß­Y'7œ  @€-#°{÷žØ||_ËÔÛ„…ÎmoŸñÊ&¬KI @ .ÕºD„4‰ÀQ[žÞ™¦�ïËÊ™ß$%µT3Ú*ñö«‹ç÷´TÝŠ%@€ @€QàUïü|Lü—÷6Ñܾ°Gs{^7ã  @€ZO 663gÎŒŸ �´^ñÍQññ½ËOû—¡Ûoýfs”£  P?'¸×ÏR$h�±ZïY«› ”–,áúígÄ1Ë}6¡%7_Ñ @€ @€@¡Þüî/Ç�ïø\îœV-ÔÜžÍ @€�–HÓ4–öÕbV§3NKû$HÒ7Íßø|'¸•v%N€�ÐàÞ(Yq  @ týgï|p$ñ¼Ò%.á{»uE<æœ54 @€ @€¦YàoþF\ýÖ[#ëµÉu;j~%Ïvr{.4ƒ  @€Z^`ß¾±i}oË;” YÚÙvàšòæ/s Ð î�q•J&°aÃí•Jí¯³´}´½d{7‘îÀ‚YqÙ3O�$q´„Û'e @€ @ ‰Þ÷©Ûâ¯ýDîæöÁ¾$&þs#@€ @ ¿ÀðÐPœ¾vNþ‰fD Ý>°eûéIF @ Ü ± ’ @€�鸣§ãY'NwÖÏ/PÉþšyýsÏŽysfåŸl @€ @€@Ý>þ…ƶW|$ÆÆk¹bNœÚ>qz» @€‡/ÐûbñÜÎÃ`æt $IoY¿~׌éLÂÚ @ HÞ-,ÒnÈ…¦E`ÙÙÛ×¥iòâiYÜ¢G,ðO{plX?xÄq @€ @€8|�ÏýŽ8ÿš›cdt6�¸8žþèJ˜¹”  @€ @€Í#ðõÛîº)öìÍUTßÌ$V/®„ö›\l @€x@�Ý»÷Äæãûðq[ �¸lù¦�k‹�¥ì @€ÀÔhpŸg« @€@Aîèß‘]A;­ éIë =3ÛãÚígÅŒö¶ƒŒò @€ @€@#¾÷ãáxâ‹ß¿>�k™ÞÎ$Ö,ÉšÛu·çr3˜ @€À¡FöÅš¥Ý‡æñb ÌKj±KO_1÷GV 0…þg8…Ø–"@€�b ,=gûÊ$Ò—++ÙLVà5—nŒ¥‹çLv¸q @€ @€u¸ãνñ„Ëþ9&þÍs›Õ‘ĺ�JT]¥ÊÃf, @€�I ¤iKûj1«³:©ñK û ðY[î¼ XYɆL½€·§ÞÜŠ P�]•téÔœ³ '@€ @€¨—ÀÞýcñ”+nНß~W®�3Ú&šÛ«Ñî É\n @€8�á¡»ã´5¾ûpì 0§'{C–Gv »hMo!¶æ¾«š--°èÌg/¬Vªÿ'Cpz{Éž m•J¼ýʇÅÀ"§ ”lë¤K€ @€4‰ÀèX-þäªÄ­ÿþã\µeW¤Ž¬F׌\Ó &@€ @à:ªµØ_k�ÝûÆŽ Š©Ó!�D²ºgÅ©_¾í³_�Žõ­I€¦[À îÓ½Ö'@€�)˜ÑÞþŠlѾ)_Ø‚G,píE§ÆÚ•‹Ž8Ž @€ @€ùji_÷áøø~˜kr5»u\%fjnÏåf0 @€�#‹-ŸmU�©å´ÌO“×-;ëB½ Ó‚oQ˜n îÓ½Ö'@€�)ؼckÉS§tQ‹ÕEà÷7.‹Ç>|]]b B€ @€ �_ày¯þx¼ïS·åšXÉúhÖeÍíÝ�jrÁL€ @ N»wï‰ÍÇë‘®甆É^E-ªµÝs€ß”®k1 P îEØ9 @€À”¬:w{Göð�S²˜Eê*Ð×ÓWœFT+þt©+¬` @€ @€�I \õ–ÏÄ?Þü�IŽþ¯a-ík–Tbv—æö\p @€¨³ÀÈÞ¡X³´»ÎQ…›�4ž9°iÛ9S²–E @€@�t‰h3¤B€�8°/ž—­°º±«ˆÞ�W^rf,žßÓˆÐb @€ @€Bà5ÿðùxó»¿rˆQ÷}ø˜Å•˜;Ksû}eÜC€ @`jÒ4�¥}µ˜ÕY�Ú…­V�$©üÕà—vÕ%˜  @ $ÜK²QÒ$@€�#Üréª4M.;²(fO‡ÀS~oU<äô•Ó±´5  @€ @€-/ð¶÷|5®ûçr;½  {4·ç†3� @€@ƒöí;›ÖÏnPta,°2ÚÇ/oð @€�B hp/ÔvH†$�D:þú,vGƒâ Û �%ógÆóžrjƒ¢ K€ @€ p0�ºå[qù_~:²ÃsÝ–Í«DÿÍí¹Ð &@€ 0ÃCwÇ©kæLÁJ–¨»@ÏزóAu�+ (¨€÷‚nŒ´ @ ~K·ìx|íáõ‹(ÒT ¼zçYÑ7{æT-g @€ @€�_ ÜüÙïÅŸ½êcQËÙÝ>ÑØ¾l®ævO$ @€E˜•ì‹Å}Ά+êþ$¯j’ÖÞ[vµdŒ‡ @€@Óhpoš­TÜŸÀQ[vÎÉ®Á½òþs_±¶=v]œñ eÅNRv @€ @€�&øÌW~^ûá«åªnQoG/pé)šÁ @€¦X`tl,NZÑmUL�búz,·aií®KêH  Ptï2}‡äG€G$0µk²‹�(ˆÉS.pì²ÙqÑy¦|]  @€ @€Z]àËßþY<ãªÄþ‘±\óº“XµÐe§\h @€˜&�áá=±éø¾iZݲG"�&éÕËκôè#‰a.(ƒ€w˰Kr$@€�Ã<{û©‘ÆE‡5Ù¤i¨d�ÜxÉYÑ3Ë×âMÛ&X˜ @€hI�oÿàîxÊåï�Ý{GsÕ?»+‰Õ‹+‘82—›Á @€¦S`tïP¬^Ú=�)XûðºÒêø_fS½; @€ @ ¥~z×¾xòï�Ÿß½?Wݳ:’XÛ_ÉÞŠË5Í` @€¦Y MÓX6§]ÕiÎÄòyÒˆ‡lºä)yçO€Ê$ Á½L»%W˜´À@ü|[6ø¤IO0°^=?žöè ‘‹$ @€ @€­"°gÿh˜¤ÉÕ“kLqÚ*•¸~ûÆèœ¸2êF€ @€ 0%cãµxÖK?_ùöÏs­7ÑÔ¾~ 3¼•“ËÍ` @€EØ3|w¿¢§hiÉçÐ Æ«í×z˜ @ œÜ˹o²&@€�ƒ$µäUÙÃÝâ¡ ¼äÙ§Ä1G-(`fR"@€ @€4¯Àó_û‰øè¿ý W�I±6;¹}æŒì7 @€J/°¨{O  @€ @€šEàƒŸý^\öÆOEšæ«h`Nÿ¹ @€ Мs»F¢gf{s×ÜU½¬Ësæ7w‰ª#@€�VÐàÞj;®^4©ÀÒ-;ŽË®È=§IËkÚ²³iyüþæÕM[ŸÂ @€ @€EøÂ7~Û®ûpŒ�×r¥6qjûÄéín @€4¯À�#qÖÚîæ-°y+›[IG_ּ婌ZQÀ;‘­¸ëj&@€@Ó ìªÔÒxcVV[Ó•ÖÄõõtÄeÏ<=’Ä©_M¼ÍJ#@€ @€ $pÛ�†âéWÞ{÷�åÊjvWÇ.vI)šÁ @€J*0<4';§¤Ù·tÚ:°eûé-- xh*ïF6Õv*†­)0¸é®gd-Ògµfõå­úU;ÏŒEózÊ[€Ì  @€ @€%øùÝûãÉ—¿?&þÍs›9#‰µý•¨8£ ›± @€J-ÐÛ¾?úºÛK]C+&Ÿ¤Éâ¼óª­X»š  @ ù4¸7ßžªˆ-%°øìí "I¯k©¢› Ø§=ò˜8ç´•MP‰ @€ @€ÅØw`,ž¶ë¦¸=;Á=ÏmFö}‰ë*ÑæjR6c  @€”^`dd4N_Ý�}wéKiµNüiÿ…­V´z  @ 9¼%Ùœûª*´Œ@{5yEVìÜ–)¸ X0+žóäSš % @€ @€Š/0^KãÂk?_üæOs%[Í® ­ÏNnïÈšÜÝ @€h=�á¡¡8eõœÖ+¼ì§qÍŠ‡\²¨ìeÈŸhp÷ @€�Ò nÙ¹%Mãi¥- EÕÎ�Ñ×;³E«W6 @€ @`j^øúOćþåû¹�8¥qí’JÌêp\c.8ƒ  @€4™À¬Ê¾˜Û;£ÉªjörÒÙ£céÄA�n @ ÔÜK½}’'@€@ë ¬_¿kF¤µ7¶®@9+ßqÞqqú‰ËÊ™¼¬  @€ @€%xÕ;?ï¼éë¹³>vQ%æÌÔܞΠ@€M&0::§33&>ëV*�§,ÝtɦRe,Y ð;Üį P�»çß¹3ËtM9²•å„À±ËfÇ…ç�ƒ @€ @` þñæoÄ�ïø\š_‰=ºWrÙ@€ @ I†††ãŒµ}MZ]ó–•&µ7lØpA{óV¨2hv î;Ãê#@€@ ,ݸ­?+ëÅMXZS—týö3£{fGSר8 @€ @€@nùÜâ¯ûD¤i¾l–ÌIb°Os{>5£  @€4¿ÀŒto,œãZo¹v:YǬ®åÊY¶ @à7Ücá'(‰@ÚV¹6Kµ»$éJ3ØqÞqqÒÚ @€ @€ øò·Ï~Ù‡bl¬–k¥yÝI½Àe£\h @€h�±±±8yeW$>[ªO“t×à9—ºP_ª]“,üJÀ;•¿’ð/”B ÓŽ3³DŸRŠd%y�ÀòųâYô  @€ @€ øÁO†ãi»nŠ=ûGs­ÔÛ™ÄêŕЫ’‹Í` @€-%044g­ïk©š› Øîd|üÆ&¨C  ЂÜ[pÓ•L€�Ò œw^µ’ÄkJ›‹&~ýö�ÑÛÝÙ¢Õ+› @€ 05w ˆ'_ñþøé]ûr-Ø5#b]%²÷ÝÜ @€ pP�ÊØžX<׵߃"ìÁ4âqý[¶?´`iI‡R@ƒû!‰ @€�¢ þtÉ3²\6%yZàü?X§Ÿ¸ìÐ� @€ @€8l�#ãñŒ+oŠoÿàî\1Ú«ëû«Ñ–ýëF€ @€�C Œ��ÇIGud�õ ÙCYéñJš¼nÕ¹Û;Š”“\ @€À¡4¸JÈã P�£¶ìœi¼´ÉHbR‹ú:cû?xRc "@€ @€8<�4;Žïâë>ŸûÚ¹T³+Dë*ÑÙžkšÁ @€´¸Àððî8û¸¾W(]ù«÷íMþ¬tYK˜ZZ@ƒ{Ko¿â  P�ñZzE–í‚òd,ÓëwlŒ¾Ù3A @€ @€4Pàê·Þ7}æöÜ+¬^\‰î§.æ†3� @€�ˆÑá\ÐE¢DÙ«¿/9çâå%JYª ÐâÜ[ü  |”A`ÙÙÛ×¥Iº½ ¹Êñ¿žð°•±å”8 @€ @€(ðŽ›¾où?_νŠù•˜;Ks{n8 @€¸G`|¼Ç ¶GµâuE‰ž]ÕñÊ«J”¯T  @ Å4¸·ø@ù(�@RK’×dyVK�«3�¾žŽxî“OaA€ @€ Ð@�O~ñ?ã/Þø©HÓ|‹,ž�Ä@Ÿ&”|jF @€ ð»»wï‰MÇõýîÝ~/´@ò˜ÁM;Yè%G€~) ÁÝS� -0¸yÇc"‰‡:IÉÝKàúí§ÇÂyÝ÷ºÏ/ @€ @€õøÎïŽg½ìC16VËtÎÌ$V.pi(šÁ @€< Àø�áX¶¨ë÷@’xíà—Ú´n�” @àÞÞż·‡ß @ @/ª²¨n,PJR9„Àž½<vƪCŒò0 @€ @€Àá ܽû@<ýÊÄÄ¿yn]3"Ö,©Dâðö8oe‰ž¹ Ð0�þ³.Y–�Þþ†- pÝ®»ø´è_Ø[÷¸ @€ @€ü—À _ÿÉøô—”‹câ,‚µý•ÈÎ&p#@€ @€@C*£»cᜎ†Ä´!éxåµYd§×5„WP¨‡€÷z(ŠA€u¨VÓWdA»êXÀ†<üÔ�xÔ¦c[P @€ @€�ˆ7ý¯/Å?|àë¹)V-¬Äì.= ¹áL @€ @`ÒcããqòÊ®ìÛ¾'=ÅÀiHÏغý‘Óž† @€Àhpw @€Àô nÙ¹%;½ýqÓ—�•ót̨ÆåzzT+þ¬Èãf, @€ @`²øÌíqíÛþe²Ã=n /‰E½:L~ â @€&044§¬žÓ°ø×_ ©%7nØp�ïûª?­ˆ P�hu@‚ê(°eW[¤ékêQ¨ ¼ìÙ§Æòþ¾¯"< @€ @ 5þý;?�×ßãµìHˆ·¹³’8j¾Ë@9È %@€ @àzªû£w–~é#dœÊéÇþdVçES¹ µ @€Àd¼³9Y)ã @`J–Öî|VDzü”,f‘#Øx¢xÌ9kŽ8Ž @€ @€÷¸ãνñŒ«>{ö�Þ÷ÁƒÜ3«#‰Õ‹+áìöƒ yˆ @€�º ��kzêWÀ $±kà!Ïkà B @€�ÃÐà~Xl& @€@#ú·ÑÜÞÑ6‰Á† @€ @ A‹{Æ£sâÓ·nåH’ —m½t}9’•%´Š€÷VÙiu @ àý›¶Ÿ”�Þþ¬‚§)½_ œtìüxü#¼¾õ„ @€ @€4B຿û×xï'¿›;ô±‹+ÑÝ™u¹» @€ @`öîÛ›ÖÏžÆ ,�S Z«�ߘÍñ‚2'œá Ð8 î�³™&/�d·×dýXš¼Ù´�¬d=¼üâ3¢c†£À¦m,L€ @€4­ÀÿþÈ·âuÿø…Üõ-ŸW‰ùÝÞ^Ë g @€ Ø·g(Võw7$¶  xøà¦ç6$²  @à04¸š) P_�¥›·ÿqvéí¬úF­Q/zÊI±vå¢F…— @€ вÿòÕŸÄó^óñHÓ| {’X:Ws{>5£  @€h¤@š½°Yµ0‰¶ª×*�t®kì$nܰá‚öºÆŒ¦€÷Ä3�ê#°`ËEÝi$¯¨O4Q-°vùœxÊœÐèeÄ'@€ @€´œÀ÷2ç¿äƒ12:ž«öÞÎ$V-r¹'šÁ @€L‰Àî={ãìãú¦d-‹ÔE`õOº;.¬K$A @€À xÇóM'@€�#èL«/Ì" Y³§Jàڋψ™�>°=UÞÖ!@€ @€ZC`÷ÞÑxú•ˆŸß½?WÁoÓ¬í¯DÅ�ˆ¹Ü &@€ @`êÆ÷ÇÀ¼Î©[ÐJG(�ìxÈÅóŽ0ˆé @àˆfî‰O@IDAT4¸1¡ p¸KÏÙ¾2;½ý¹‡;ß¼©8ÿÑ«ãÁë|ajÕ­F€ @€4»@-MãÙ×~(¾ñ½»r•ZÍ®ð¬ËšÛÛ«¹¦L€ @€�)¨ÕjqÂòŽH|0wJÝ�`±¾d´²ëæ›J€ê" Á½.Œ‚ @€Àá¤cÉ˳y3g®9S+Ð×Ó?îÁS»¨Õ @€ @€- pù_~:>úo?È]éš%•˜9C‡Hn8 @€˜r�ááÝqÆÚ¾)_ׂ‡)�$.;{ûºÃœm¨‹€÷º0 B€yú7í83’ø£¼óŒŸ�k/:-æÍ™5=‹[• @€ Фóž¯ÆÛ²ÿòÞV.¨DßLÍíyÝŒ'@€ @`ú:Ò½1·×ùwÓ·¹V®Ö*É ¹fL€ê, Á½Î Â @€À¤’J^ MŠjú�óàþxÄÆUÓŸˆ  @€ @€M$ðñ/ü0®|ógrW´xvKæhnÏ g @€Ó*0:6§ãPµiÝ„|‹ÿÞàæmçæ›b4¨Ÿ€÷úYŠD€“Ø|Éc³¡§Or¸aÓ(ÐV©Ä‹ŸyjT³Ý @€ @€ê#ðýŸ ÇE/ÿpŒ�×rìíJbâôv7 @€”Q`xh(¼jvSoÑœ+7nØpA{‹¯l˜fï‚NóXž­&°êÜíI¤×¶ZÝe­÷ÏŸzb¬Z>¿¬éË› @€ P8�}Æâ™W0~1| Wn3Ú"Ö,©Dâðö\n @€ P,�¹]£1«³Z¬¤dó@k~ÒÝqá=è~ ÐH î�Ô›î#°ooå¢ìΣïó€; 'ptO<ù‘Ç./  @€ @€Ê,ðœW},þã¶;s•0ÑÔ¾6knŸ¡$—›Á @€O`ÿþqÖ:§¸og(£d×ÀC.ž÷@�ºŸ4J@ƒ{£dÅ%@€�û,;ë¾ìôößçwRàe�³fv27I @€ @€Ê(ð†ÿùÅøÿNîÔW-¬DO§£ÛsÙ@€ @€@!ö ÅÚe=…ÌMR÷èKƪWÜç^w @€� hpo0°ð ð�ñ¶¶¿È~ëûÍ=~*ªÀ¶2Î|Ðò¢¦'/ @€ @€@é>úo?ˆëþö_sç½dN‹z5·ç†3� @€� ¤±´/�ö6­kÞ¤ßNí¢å›v®ýí;üL€-௄F ‹O€÷,;ëÒ£“4ÙŽ£ø3;ªqé7?Q @€ @€J"pû�†bÛ+>ãµ4WƳ»’8z¾K9¹Ð &@€ @ {÷î‹ÍÇÍ)E®’Œêx’ÞÀ�L¥€wE§RÛZha�ñ¶±—fåÏha‚Ò”þÒ O‹% zK“¯D  @€ @€EØ»,žyÍãÃr¥ÙѱfI%‡·çr3˜ @€�òØ;ËÎ,OÂ-�izîàæmç¶4�â  @`J4¸O)·Å Кƒ[/9-;½ýñ­Y}¹ª>uÝ‚xô–ÕåJZ¶ @€ @€� üÙ+?_¿ý®\V²¦öµYs{{5×4ƒ  @€ P*�4Mcý`»ö–f×*7nØpA{iÒ•(”Z@ƒ{©·Oò(…@’ÖÒëK‘i‹'YÉþ*¸ê‚Ó¢½Í•Ó*(Ÿ @€¨“Àkÿñ ñÞO~7w´U +ÑÝéèöÜp& @€ P:�ááÝqÊê9¥Ë»E^ó“îÎg·híÊ&@€�)Ðà>Åà–#@€@« nÞñ˜ìRÜY­VwëÝqÞq±~Õâ2¦.g @€ @€@á>ò¯ß�þþs¹óꟓÄÂ^Íí¹áL @€ @ ´½mbV§ƒØJ²�WžqéÜ’ä*M(±€÷ožÔ  Pt�õëw͈H¯+zžò‹X2of<ó1'¢ @€ @€¨ƒÀm?Šm¯øHŒ×Ò\Ñfw%±b¾K7¹Ð &@€ @ ôûŒÄÆu³K_G‹Ð3jW´H­Ê$@€�ið.é4â[šÍ.p÷ü;Ÿ‘¬jö:›¡¾k/:-æôt5C)j @€ @€L«Àžý£ñÌ«?C{FråÑѱfI%‡·çr3˜ @€�æØ·{(ŽZ<«9Šiú*Ò‹—oÚ¹¶éËT L«€÷iå·8šWà¨-;çdÕùÔn ¶øQg.�­§®,A¦R$@€ @€_`ç �o|ï®\‰V²¦öµý•h¯æšf0 @€šF MÓìuQÕ‡~˱£Õñ$½¡©Ê’Ê* Á½¬;'o\`,Ò?ÏRœWð4[>½m•xáÓOõ&AË? @€ @€õxÍ?|>ÞÿéÛr‡Zµ¨ÝŽnÏ g @€M%0<¼'ÎXÛ×T55o1é¹[w<¤yëSL·€÷éÞë @  –œsñòHÓ�MXZÓ•´ëO7Äò~o4ÝÆ*ˆ @€˜r�›?û½¸áíÿ–{Ý�9I,ìÑܞΠ@€šR 3Ù=3Û›²¶f+*©%×f5yAÛl«D@ƒ{A6Bh&�j­ú’¬žŽfª©kYT_œ÷°uÍXšš @€ @€S*ð�Þ;n¸%jiškÝ93“8j¾K5¹Ð &@€ @ ©FFFcãÚž¦®±yŠKOØ|Éc›§• @€@‘¼kZ¤Ý� š@`é–m'GOj‚R𾄗\tztvøä{Óo´  @€ @€�† ìÞ7ϼæƒ1¼g$×:m«W"qÖ].7ƒ  @€h~�ÝCC±j`VóÚ&Q{é† hxëíñªw~>wÔ�¾$ôhnÏ g @€-'Оî�9Ýí-WwÙ Î^á.êŒêβå-_(¶€÷bï�ì P�_~åÔêÒ$Ü¢‰žtÌÜxÔ¦c[´ze @€ @€ê#ð­ü"vÜpKÔÒ4WÀ93“8jžK3¹Ð &@€ @ eFGÇâŒÕ=-[™ OÓäù‹ÏÞ¾ L9Ë•Š-à]Ôbï�ì P �U§mïM#¹²ɶx’WœZ´·U[\Aù @€ @€�Ãس4Î¿ææØ½w4W�޶ˆ5‹³ï@tx{.7ƒ  @€hm�á¡»cõRßP^‚gAO[5ù‹ä)E(‰€÷’l”4  Pd��ñ‚,?ŸÄ-ò&e¹=ù«bú�‚g)= @€ @€@±ž÷ê�ÇÄ îynMík–T¹yÔŒ%@€ @€À ¬˜—DµâÓÂ…>¤qÑòMÛV>O  @€@)4¸—b›$I€�â ,ݸ­?;½ýÒâf(³ �ŽÕØþø“` @€ @€�ÀÛÞóÕøÿNî+æW¢§S3Fn8 @€ � ìÞ³76®ŸÃ¢øíãIåªâ§)C(ƒ€÷2ì’  P`�Z[õ²,½®§(µLàòg<8úÎfA€ @€ p˜_üæO㪷ޚ{öüî$úçhnÏ g @€~K :¶7úzfüÖ=~,¨À“¶n?± ¹I‹J$ Á½D›%UM`ÙY—�Dz~Ñò’ϽŽîï‰Ç>tí½ïô @€ @€À¤îÞ} ž}í‡cdt|Òs&ve½Ç,r)&šÁ @€¸�ѱ±8ýØîûyÄ]H’ZåeËI: PB殺pÓ¤L€�¢¤Õ±+²\ÚŠ’�<î_àê N�™WSÝ @€ @€Kà’n‰üd8×ÜJvhûšÅ•¨º“ËÍ` @€<�ÀðÐݱnyÏ=ìþ¤çlÞ±µ0éH„J)àmÕRn›¤  0ý˶^º>�ä)ÓŸ‰ &pîéKãì +6Äc @€ @€xý»¾ú—ïdÄý?´ra%fud]în @€ P7�¥}i´µy­U7ÐÊvèÚ,´�j�¯°h î­°Ëj$@€@jµÚUYX/F`[¯�•ìÿò/xê†HìR½HÅ!@€ @€ZLà3_ùQ\ÿ÷ŸË]õ¢Þ$&þs#@€ @€�ú ìÙ³/ÎZ×Wß ¢5BàÔÁ­—ü÷F“ZC@ƒ{kì³*  PW�¥›/9%"õB¤®ªõöœ?>1V.›_ÿÀ" @€ @€Z@àg¿Ø_÷‘¯åªvâÔö‰ÓÛÝ @€ @ A#»cÁ쎶nµô¥6\Ð^·x @€@K x‡µ¥¶[±¨�@é5õ‰$J£Î錧þÁq� /. @€ @ ©ji½üÃqÇ�{sÕYÍ®º¬YR‰ŠÃÛs¹L€ @€�<cããqòª™y¦;=ÇþxVÇŸLÏÒV%@€�² hp/ûÊŸS,0¸uûælɇOñ²–Ë)põ§Äœž®œ³ '@€ @€˜¸þï>Ÿþò�rc³¨]ΦËíf @€ò  Å +zóN3~Š’$¹bÑß;kŠ—µ4�€÷&ØD% @` ’d¼ò’)\ÏR‡!púú…ñð�ÇÆLS @€ @€>ü¯ß�׿당!úç$1¿ÛÑí¹áL @€ @€Àa ,™]‹¶ª×a‡É7UÓ–´½dª³4�€÷æÙK• @ áƒ›vœ›&鯆/d�#xñ3OÉ^Äû_ü!šL€ @€´¤Àº;vÞpKÔÒ4Wý=�I¬˜ïý˜\h @€ @àöìÙg¬�s„QLo´@é rñ¼F¯#>4—€w[›k?UC€� ìªDNoo p=BŸÿkâ„c—Ô#” @€ @€�–«Å³_ö¡¸kø@®ºÛªk–do�940—›Á @€¨‡@{º/º»ÚêJŒÆ ôÆXõE� /24£€÷fÜU5 @ ›î|löA -d�fvTãY�=±NÑ„!@€ @€´–ÀUo½5¾ð�Ÿæ.zõâJtè¥Èíf @€ê!022g®í­G(1(�}&|Û’s.^ÞÀ%„&@€�&ÐàÞdª4D`Ë®¶ìª«[к \yþ)±h^OÝâ D€ @€h�÷|â»ñ7ïù÷Üå.�›DßLG·ç†3� @€uØ·{(tÕ1¢P ˜Ñ6^¹ªq…$@€�&ÐàÞ¤«,ÔS`izçS²xÇÖ3¦XõX½lvI5¸uûæ# b6´‚€÷VØe5 @à0=ü¹³"’ËsºiS ÐV©ÄŸ=iìd  @€ @€@s ü�~#Þuó7rµ|~%z»4Lä†3� @€ سw_œ±vNƒWþˆÆ“—g1¼°>bH ÐÜÜ›{UG€�#h;0²#"]xDALn¨ÀŸ?õÄXÞß×Ð5'@€ @€4›Àd§¶_öÆOå.kî¬$û\ƒÏ g @€¦H =ÝÝ]mS´šeK ‰Ó–nÝñèÚk´Œ€÷–Ùj… @ ŸÀQ[vÎÉ.Õ=?ß,£§R`ɼ™ñÄs×Oå’Ö"@€ @€”^`÷¾ÑxÖK?ûGÆrÕÒÙqìb—Ur¡L€ @€�)��k{§xUËåHkqeÄ./²óÂO€�ð?‰Úl¥ @ �ÀhÔž›�÷Ý]yЦxì•çŸ=³:§xUË @€ @€Ê-ðÜW},¾ûŸwç*"ÉN‚X“5··¹ª’ËÍ` @€L‡ÀÞÝC1¸ k:–¶æäNÜôóÇL~¸‘ ÐjÞŠmµW/&!°â!—,JÒØ9‰¡†L“ÀIÇÎ�‡ž~ô4­nY @€ @€@9Þþþ¯Å{?ùÝÜÉ5¯Ý�Y—» @€^ MÓ8aYGáólù“Ê.§¸·ü³P@ƒûÒx€­+0:ž¾0«~Vë ¿òËž¾!ÚÛªÅOT† @€ @€�‚|óû¿ˆ+ßü™ÜÙôÍLb Os{n8 @€ 0�CCÃqŠÞiÌÀÒ‡H�Ø|×zœ ЊÜ[q×ÕL€�ƒôŸuɲHムñÐ4 <êÌ¥qê K§9 Ë @€ @€Ê#02:¿üñïÀX®¤Û³óŽ]ìRJ.4ƒ  @€ P�%½µh«úÀrA¶ã~ÓH¢v…SÜï—Æ�hyïʶüSî-PiK/Ïî™qï{ýV�Jöî?{⃋’Ž< @€ @€¥¸ú­·ÆÜvgî\'šÛ'šÜÝ @€ @ |{öî‹3Öö•/ñ–Ê8Y¿tÓ]çµTÉŠ%@€�I hpŸ“Ah ��³.>6;½ýé­Qm9«¼à×űG-(gò²&@€ @€LƒÀ?û½xÛ{¿š{å�¾$úf:é/7œ  @€(�@{motwµ(#©ü®@š¤»â¼ó|¼üwaüN€�ÐàÞâOå @à^Õê•Ùï^4Ü ¥8¿tvTã™x|q’  @€ @ àwܹ7žûª�EšæK´»#‰£æ¹„’OÍh @€O`dt46®�]¼ÄdôÛkÒÿøß¾ÃÏ @À»³ž p�À²­—®ÏΣò‚¡Àχ=õ¤X<¿§ÀJ� @€ P�‰¦ö7ÜwíÏ•T5»r²zI%‡·çr3˜ @€EØ»ûî˜ßUÔôä5!�¤WÄ–]ŽÚ÷l @€�_ hpÿ5… ÐÚµZí/2—í ú4XÔ×�}èš‚f'- @€ @€@ñ^ÿ?¿ŸüâæNlå‚Jtµçžf @€T Í>}âòŽ‚f'­_ ;�Þù @àWÜ%á_´°@ÿ–mYçtúÇ-LPøÒwýé)Ñ3«³ðyJ� @€ P�ÏýޏáíŸË�Ê‚ž$ö:"7œ  @€(¸ÀÐÐpœ°¢·àY¶vzI¤—;޵Ÿª'@€Ào hpÿm ? @ E*iåEYé®Ütÿ�_97±qUA³“ @€ @ X»÷�ƶW|$ÆÆj¹ëÌNm_¹Ðe“\h @€ @ DKzkÑVÕQÜ-KV-�Ÿ?¹¸ùÉŒ¦RÀ;µS©m-P`pË¥�ÓO*`jRú¥À‹Ÿqr´·Uy @€ @€LBà…¯ÿD|ïÇÓù›!í «W¢ÍU“ß ø‰ @€M&°gï¾8cíœ&«ª¹ÊIÓäò .È>‚îF€­.à­ÚV¨Ÿ�–HÓñ‰ÓÛýÿ  Ï„ß;}0N?qYA³“ @€ @ XïúÐ7ãÝ·|;wRËçU¢§Ó)~¹áL ðÿ³w'p–•å�ðŸskí®­÷­ª«÷fi±QHÓ ¢ˆŠ­Ô€ Q¤mp‹ñKò1ß$3ÉŒãD“¨3IÌĨ‰‰1“Éò™IÆ} Ѝ`Ä(eQ�fë꽫î™s1F–¦»NÕ]νç~¿úUÕ9ïò<ÿ·è¢Îyî{  @€h3�žê¾œÓÝfQ—*Ü5÷ ÌyE©2–,V@AãaYœ$@€@9Vm¹fMöØÎ]îJö[úM—=5ÏV ºBÂ"@€ @€Š$ð½îŠ_yßr‡42'‰ÑnÀä†Ó� @€m(pðС8ó¸‘6Œ¼D!'é/oÚt}o‰2–*F@�ûaPœ"@€@Y¦’ä³\»Ê’o»åùª Ž�c×.i·°ÅK€ @€hºÀäd5®þ�OÄî}‡rÍÝ�Ý;fY%”·çbÓ˜ @€m-°w÷Ã1º°¿­sèðàW=¼è�+:; @€ @ ¼»ãÄ5ÞY½À?c“1òêÇ'4h €÷âšEXyæ5+²— ¿¦ˆ±‰)bÓêùqþ36  @€ @€8ŠÀïþÏoÄ'o¼ó(­žxyíâJ̵õÃaœ!@€ @€@ V §Ù  ½º°KŸ¦¿8vúus ŸÀ @ a ÜFk`T «ë-Yd}�®ôaýÒ+7GoOWé @€ @€Ž$ð�ïÞ¿þ‡_>R“Ã^[8˜Ä²… ‡Åq’ @€%ؽgo<협fÞ6)¯ˆž©«Ú&Z� @€@ݸ×�Ò@(¾Àê­W/K“ôµÅ�´œ>ëÔqæ)«Ë™¼¬  @€ @€ÓØw`2®ùÏŸˆƒ‡¦¦ÙãÇÍúº#6,ñX$šÆ @€(�ÀHï¡èéòbèÂ.uo[±ùª¹…�O` ÐwrÂjPS`²Úý¦,²þbF'ª·¼|sxç3? @€ @€�# üÒ{¿ß½ëá#7:ÌÕ�Ë*Ñí�ó#ã @€Ê-°wßþ8ýøyåF(vö˺ûmæXì5ê. À½î¤$@€@1–�µ}q$qu1£Õ•ǯ[ ‚ @€ @àý¹ÛãÏþÏ·�Ðâð—V.HbdŽÝø¯ã, @€tW÷Å@ŸWEõ'!�ä–ž÷æ�¢Æ'.¨¿€÷ú›‘…èN’7f�y˦®Nw¥¯¹èÄF&$ @€ @€@qî{p_¼ýw>iš/¦Á¾$Æx’OMk @€”KààÁCqúq#åJº­²M—ô8`SǶZ3Á @`vîèÎÎOo´…Àè3_¿0Û½ýš¶¶„Anß¶)V.óvg%\z) @€ @€9Þü®Ïărôˆ¨d›¶o\–Dbóö\n @€ @ Œ“ûwÇü¡Þ2¦Þ&9'o]¼õêÁ6 V˜ 0Kî³Ô�m!p¨ûÚ,Nÿ“_ÀÅêëíŠËŸw|# @€ @ 8úø·â7Þ™; U +1·Wu{n8 @€ PB�É©©xúF¥^úE}Õ®×8>¡ @€@¸×ÓP(¢Àø3^7?IÒ7161E¼å²“béÂ! @€ @€O"pÇ�&âßÿÞ OrõÉO�ÌIbt¾âö'r… @€/°wbW¬X4çñ§}_�$yÓŠÍWÍ-J8â @€�Æ (poœ­‘  P�jwÏŽ,�áB#ˆÇ Íí‰mÏ>î1ç|C€ @€ ðS�4�¸ö�ŸŽ=ûýôä4¾êÊž~lXêÈ4¨4!@€ @€�G ¤Ù¢'¯êÔ_L`qehÎ+ “p @ îî6Õ�(ŠÀÚg]5irmQâÇc~ñ§Ä‚/,~¬Šï @€ @€?xßÇnŽ/óG?=1ͯÖ.®DÏ4kF€ @€%0±kW¬_1ø¨3¾,”@š¾eóæ«üÕ_¨E ê/ À½þ¦F$@€@aMöm�HG �@þM`ÑH\¸uã¿}ï  @€ @€�Ç |ë{Ä;>ø•ÇžœÆw ’X:œL£¥& @€ @àð—uþ‚³EÿÑ@ÿeED  Ð8î�³52Z*°èÌ·¥iòÆ–aò'ø¥+N‰áAokö¤@. @€ @€¥˜œ¬ÆŽÿò©8xh*—COWĆ¥}äBÓ˜ @€ž °kb"NZ3ü„óNC Iâm×»PŒå"àù†°”­èï9ðú,Šù­�D�]<çŸe÷öÇ»øž @€ ð�w|è+ñÍÛøÉ·Óþ¼~I%jEî @€ 0[�óÒ¨d•ÔŽB ;¶åþ22A @€@]¸×…Ñ (–ÀÒóÞ<iú¦bE%šŸüò•›cnÏO¾õ™ @€ @àQ7ÞzO¼ïÏo~Ô™é}¹d8‰…ƒ ¦§¥ @€M`÷î½qêÆ‘£5s½UI峩Ýh•¿y  Ð`î 6<Z!ÐsàÀ«²yµbnsY`ãøH<ûôµGnä* @€ @ ¤ûLÆuïütLUÓ\}Ýk{ä‘ Mc @€8ªÀHïÁèîVC}T¨–4HO?{dzZ2µI  @ áîö6œØh®ÀæÍWe[ƒ'voo.û´g{ûÏ=5z{²'® @€ @€�'üûß»!¾÷Ã]O8´–V¢Û�£1¹N€ @€9öí?§;?g/Í›%P�´¶‹»ƒ:PÀíÞ\T) Pn�{†æ¼4/·B1³?eÂ8ûÔ5Å NT @€ @€� |ú¦»âƒ¿5w+æ%1o®ÝôrÃé@€ @€ÓèM÷ÆÜ¾®iµÕ¨éçŒnÝþ3MŸÕ„ Ðpî '6š*�DomêŒ&›¶À[_þÔèîò«wÚ` @€ @€¥xx÷�xó»>iš/å9½«¹ß’OMk @€È#pàà¡8ý¸‘<]´m¦@vqo¦·¹ Ð$w}›m4C`ììkž‘žØŒ¹Ì‘OàÌ“–Æ™§¬Ê×Ik @€ @€@IÞþž/Ä�îß“+ÛÚžíÇ,­DÅæí¹Ü4&@€ @€�üSûwÇüÁžüõh¸@É Wn}à ŸÈ ÐTîMå6-�ؽ½ÑÄ3ÿÍ—�Iâië ùt#@€ @€:Xà¯>û/ñ¿>óÝÜ®\�Ä`¿û-¹át @€ @€�Ü“SSñô�C¹ûéÐ�ì áÞÖœ™ÌB€ÍPàÞ,ió @ ÁcgmzD²µÁÓ~Ïý™±8õ„±ôÔ… @€ ÐÙ÷>°7ÞþžÏçNr°/‰• <âÈ § @€ÌX`ïî]±lAÿŒûëØ@�4~vü×­mà †&@€�& ¸ûÛdpÓ @ a‰ÝÛf;Ë�ßð’“g9‚î @€ @€�ÎxÓ»>MÈ•\%Û´}ã²Jöny¹ºiL€ @€f%�¦iœ²fî¬ÆÐ¹a]ieê- ÝÀ ÐtîM'7!ê/0úŒ×oŒ$^\ÿ‘�8[�KÎY'n\>Ûaô'@€ @€tœÀýÿ·Æ§¾rWî¼V/ªÄÜÞÜÝt @€ @€³Ø=±+FÍ™õ8¨¿@šÄ•«·^½¬þ#‘Z! À½êæ$@€@�’®®7eCÚ³ªÎ®³®’ý–½úâ“f;Œþ @€ @€�Žøþwůýþ—rç52'‰óÜË § @€ÔE ¶‹ûI«¸×³þƒôM¦Ý×ÕX# @€@+¸·BÝœ¨£À¿¾úôçê8¤¡ê$ðŠçnŒ «×i4à @€ @€:C š\÷_?{öÊ•PWöDcã2�5r¡iL€ @€u˜Øµ+V.Qä^wØú xõø3^7¿>C…Z)àNp+õÍM€�:LV»wdÃôÕa(CÔQ ¶{û«_tbG4 @€ @ 3ÞûÑ›ãËß¼'w2ëW¢¯;w7 @€ @€@�Ò8a¥÷:£Ök¸Á´»ûõõÌ8 Ð:î­³73f-°þ´íÑ$¯›õ@¨»ÀÕ/>>V­ð¢àºÃ� @€hk�þþƒñÎß”;‡I,Nr÷Ó� @€4B ¶‹ûø’¹�Ú˜³HÓäÚ¥ç½y`–ÃèN€-PàÞâ0=f#p`NrUD:2›1ô­¿@ow%^þ¼ê?°  @€ @€m,PMÓxÓo~&šÊ•Ev«%Ö/ñ8#šÆ @€ Ð`�Ú.î} žÃð3Xسÿà«gØW7(ˆ€;ÂYa @ ¯À¦M×÷fϯËÛOûÆ \÷³'ÆŠ%Ã�ŸÈ  @€ @€�6øï»%¾þ�ûrG¼fq%z»swÓ� @€4T`×®‰XµÔ.î EžéàI¼¹VW3Óîú @€@븷~ D@€� ìZôÀåYÇ3ê¬SÃúz»â%Ï>¶a㘠@€ ÐŽ·ÿàáø/º)wèóæ&±t8ÉÝO @€ Ðx�4޳‹{ã�g4ÃØ®…÷¿lF=u"@€�B(p/Ä2‚y®¯T#Þ’·—ö�رí„X²p¨ñ™� @€ ÐFoy÷gcÿÁÉ\weO0Ö/ñ#šÆ @€ ÐT�‰]»bÍ2»¸7}š“¥Iò ±m[×4›kF€pg¸` "LG`å–ŸŸí[uÜtÚjÓ<�ÞîJl³{{óÀÍD€ @€´…Àþæ›qÃ7~”;ÖU +Ñß“»› @€ @ ©Ç�ÚŽ©àÓŸlãè½+^<ýæZ @€@‘¸i5ÄB€�é ¼uúMµl–À5—lŠe‹ìÞÞ,oó @€ @€Å¸û¾ÝñÿÇ—s:<'‰ó²- @€ @ à»²]Ü×-(x”å /‰ô³ÌÝ`(çòËš�6PàÞæ (|Ê'°âœkÎL“ôÌòe^쌻+•xéy6Õ/ö*‰Ž @€h¶À/üÖçb÷¾C¹¦­d��7,ñø"šÆ @€ ÐR�cVô¶t~“?©À)c[ßðœ'½êVÀâÂ.�À px�®jåÅÙV \}ññ±bÉp+C07 @€ @ PöߎOßtWî˜ÆVbŽº€Ün: @€ @€@ëj»¸¯µ‹{ëVà3§QÛÅÝA€m& À½ÍL¸”[`ü¬íǧ/(·Bñ²¯íÞ~ésŽ-^`""@€ @€´Hà¾÷Å¿û½rÏ>Ø—Äè<ïžN @€h¹ÀÆe=-�A‡زbËÎ8ì'  @ ° Ü »4#@€À¦*•·<ñ¬3­¸êEÇÆØ²y­Ãü @€ @€�¼ý=Ÿ�‡wÈO’ÕµoXšDí³ƒ @€´›À®]±ql°ÝÂ.E¼Y‘äK‘¨$  ÐA Ü;h1¥B€@g ŒnÝ>–DzyggÙ~Ùe›·Çåç×~�‹˜ @€ Ð �¿þÜíññ/~/÷ècó“Èvpw @€ @€�vX¿´»]Cï츓¸hÕ–kÖtv’²#@€@g (pï¬õ” �-pm–ž÷³*Ø¿æÇÅøòù‹J8 @€ @€�Ö<4q ~ù}_È=ùÜÞˆ• <²È § @€J ¶‹û1+íâ^¨Eùq0•jt½¡€q ‰žDÀÝâ'�qšEX½õÚyIšü|‘bKDm÷ö—=Ïîí~ @€ @€?øÿûcçCû~òí´?oXZ‰ŠÍÛ§í¥! @€W`Ý»¸quÒ$}õÚg]5RÄØÄD€OPàþDg P8�CiõuYP^â[°•¹ò‚cbõè‚‚E% @€ @€@k>qã�ñŸº-÷ä£ó“êWÝžN @€(¤@m÷ãÆ‡ [ɃÚF@�{Û,•@ («À¦M×÷f�÷¶—5ÿ¢æ]Û½ýç.8¾¨á‰‹ @€ ÐT�Ý{ÅÛ~ûs‘¦ù¦íï‰XµÐ£Š|jZ @€ @€@ÑV/î*zˆ¥Œ/»m±#¶^o‹ýR®¾¤ h7w�ÛmÅÄK€@é^xÿ¶,éå¥K¼à ¿ü¹bÍØÂ‚G)< @€ @€@s~õý7ÄwîÉ=Ù†¥•¨Ø¼=·› @€ Pl�‰l÷ãWÙŽ€«4>Z}àÅŒKH ð8î�ñ- &�D’ì(XL¥§¶{ûÏßTz @€ @€�šÀnþa|øï¾•cÙH#sT·ç†Ó� @€ÚBÀ;–s™’$®+fd¢"@€�G (p´†¯  P0�ѳ¯ý™,¤§,¬Ò‡sé³ÖÅúñE¥w@€ @€Øp2Þú[Ÿ�4{�ï~¼ˆï  P�Ñ­ÛÇ’4¹¤ áã_^ú̵qÌšÅ< @€ @€¥¸é[÷Æûÿ×?åvX2”ÄüO÷sÃé@€ @€m'`÷b.YöFt¯ÞzíêbF'*¨ (p÷s@€�‚ $ÕäõYh] ¯´a½ê…›J›»Ä  @€ @€?84Y�7¿û31UÍ ç8z²»]k{4‘ƒLS @€hs�±ù^ä]À%¬L¥Õ70.! @€À¿ ¸‹ìG�X±ùª¹‘ÄU ­Ô!]|öš8nÝÒRHž @€ PøÍ?ùj|率rc¬[R‰n[:ävÓ� @€ÚW`bbO7>Ô¾ thäÙKö_½þ´íÚž´ Ðö ÜÛ~ %@€@' Tç\žåµ skçœ^sÑ í¾Ø  @€ @€uøæíÄ{>úõÜc-LbQöá @€ @€eX³Ø«½ ¸æCûú+¯*`\B"@€�L@�»O {ÊWÝQ¼°ÊÑ…g­ŠMëíÞ^îŸÙ @€ @€i¶½Ù/üÖgcr²š £+{±n±G¹Ð4&@€ @€�Žصk"Ö-è˜|:%‘$Ò±õúîNÉGè$w“;i5åB€@GŒžó†s#’M‘L%ñóvoï Õ”  @€ 0S�?úÛoÆ×¾}_îî«V¢×ãâÜn: @€ @€@çl\ÑÛ9ÉtN&«FãþuN:2!@€@ç(p” "�TãÚI¥cÒxÞ+ãÄ�Ë;&‰ @€ @€f"p߃ûâ7>pc}I,Ÿ—½i¡ƒ @€”X`"ÛÅ}tÑœ 3õ$�732Q @ Ü Ü˽þ²'@ `c[¯[Ÿ…tAÁÂ*}8W¿øÄÒ @€ @€\ÿ»ÿ»öÌ ±~IÊÛs³é@€ @€'�ÆI«¸oY“ÓG·nÿ™âÅ%"”[@�{¹×_öM ­nÏBò¼¯@ë²õ”åqò±+ ‘P @€ @€ÍøìWúìwsO\Û¹}°ßí®Üp: @€ @€@G ìžØ‹çõudníœT%M®kçøÅN€�NPàÞ‰«*'ÚR`ýiÛ‡#Ò+Û2øúu/>¡ƒ³“ @€ @àèMÅÛßóùHÓ£·}t‹ÞîˆU =†x´‰¯  @€ @ ÜiöÇõ)kÊ�PÀì³[—,?÷õ« š� PZw–K»ô'@ hûû’ZqûPÑâ*s<'¬�§�´²Ìr'@€ @€Ä»?òµøÞwå–X»¸ÝžBävÓ� @€:[àÀÞÝ1o°§³“l¿ì*•je{û…-bt®€[Ë�»¶2#@ �¶mëŠ$ÞÐN!—!Öë^zRtuùUY†µ–# @€ px�ïÞõp¼÷Ïo>üÅ#œ�?7‰EƒÉZ¸D€ @€Ê)055§n.gòÎ:I“×,:ó­6¦,ð ��r ¨Ú+×zË–�‚ ¬¼gÅYhk ^)Ã]<[N]SÊÜ%M€ @€ø‰ÀÛßó¹8xhê'ßNës%«k_·Äã‡iaiD€ @€¥˜:°;úºJ™{�“îïÚÿÊÇ'4”JÀæR-·d (ª@šÄŽ¢ÆVÖ¸ÞtéIÑß×]ÖôåM€ @€ˆ?ÿÄmñ…›˜[bå‚Jô{§õÜn: @€ @€@yšŒ§;Rž„Û$Ó¬~çÚØ¶Í+Úd½„I€@g (pïìõ•m 0¶åš#ÒsÛ ÔÒ„84·'žsƺÒä+Q @€ @€ÀãÞ} ~õý7<þôQ¿ŸÛ16?ÛÂÝA€ @€Q kj_ôö(ß;"R“/fw4V�í\ñ¢&Ok:8Œ€ß�‡AqŠM¨TìÞÞTð£OVÛ½}x°ÿè µ @€ @€t¨Àøƒ/Ç·öåÎnÝ’J$êÛs»é@€ @€åØà`œvŒ]Ü‹¶òÉT\W´˜ÄC€�2 (p/ãªË™�¬Øú¦E‘Æå… H ÑÛ]‰lYO‚ @€ PZ�o½'þäÿsîü—'12Gu{n8 @€ @ ´s*£»ËßÒEúH“ô̱³¶?½H1‰…ePà^ÆU—3…HÒÉ«²`l^˜‰xíEÇÇ’…CŠH( @€ @€�æ LUÓøÅßù|TÓ4פÝ]Ù{x/òÈ!šÆ @€ Pz�½ûöÇ©íâ^´„´’ØÅ½h‹"J'ànsé–\ÂE`óæ«z’H¯.J<∨d¿·=k#  @€ @€@i~÷/n‰o}ï�Üù¯ÉŠÛ{²"w @€ �O`¤w2*‰]Üó©5¶u¶ÛVlyãÊÆÎbt8’€÷#é¸F€� Ü;Ôq6üh§0tN�KŸµ.V�.ÈÙKs @€ @€@gÜ}ßîø¯|Sîd†ç$±t؃øÜp: @€ @€�L`ÏÞ}ñV¢Áê@IDAT”uÃ,Š%ЕÄÔUÅ I4(—€÷r­·l (�@Z�k ŽP2�—?ï8 @€ @€�Ò üò{¿{÷OæÊ¿¶ÁÜú%ŠÛs¡iL€ @€'°d( ›¸?¥Åß&IúêM›®ïmq¦'@€@i¸—vé%N€@+ÆÎÙqZ$qZ+c0÷cÎ{úhlZ¿ì±'}G€ @€(‰Àßýã÷ãï¿tGîlGç%1·W�{n8 @€ @€À£vïÞÇ�=êŒ/ °ì¡…¼¨q�¥Pà^Êe—4-¨¦ohy xŒÀU/Úô˜ï}C€ @€(‹@m×ö_yßr§Ûß1¾Ðc†Üp: @€ @€�ìZÔu˜³NµR {IÿÕ­œßÜ(³€;Ïe^}¹ Ð�egm_œM|IK&7éaNÙ¸(žvÂÊÃ^s’ @€ ÐéïøàWâ;÷äNsÝâJTlÞžÛM @€ p8�]»&býèÀá.9×*�$Î?ç:;&¶Êß¼”Z@�{©—_ò´B »Wdóö¶bns^`ÇKOŒŠ§±‡Çq– @€èh�oÞþ@üÁ_ýSî &1@u{n8 @€ @€À6,ËÞ.ÍQ(�j:õºB$”D@�{IZšEàúìßÝäç‹�8"Ö,Œ³žº @€ @ tiñ¶ßþ\LNUsåÞ•ÝáZ›íÞî @€ @€ê+0±kwŒ/ž[ßA�6;�4^±èÌ·Ín½  @ ¯€;ÐyÅ´'@€À,ÆÏ~ð™Y÷u³B×: ¼ñÒ“£·§«Î£Ž @€ P|�~üÖøê?ß›;ÐU +ÑÛ�»› @€ @€ÀQÒØ4ÞÔV4U`¨¯gÿåM�Ñd  Üý @ ‰Ù^X¯mât¦:ŠÀü¡¾xÖϬ=J+—  @€ @€�'pÿÃûã7þðÆÜ‰ ô%±|$ÉÝO @€ @`z»'vÅÒùŠÜ§§ÕœVIš\�Íä†Hs¸ÍB€�G¸ûA @€@“VžyÍŠˆôÂ&Mgši¼éÒcpnß4ZjB€ @€è,�_ÿÃ/ÇûäNjÝâ$�ss»é@€ @€¦+�¦i @€ @€�¶øè'¾_ùÖ½¹sX9¿½Ý¹»é@€ @€ÌP 'öGw—wR›!_#ºõœŒW5b`c @€À¸?ÑÄÔ] Ékë>¨g,ðŠçnŒ•Ëç͸¿Ž @€ @€�vسÿPüÇÿñåÜ¡÷÷D¬˜ï�zn8 @€ @€À,öí?§¬³‹û,ëÞ5‰ôçcÛ¶®ºl@x‚€÷'�8A€�ú ¬ÞzíêlÄÚ\ú»·d)„A€ @€4Qà7ÿø«qï{sϸvq%*êÛs»é@€ @€f+°h°:Û!ô¯¯ÀøŠ{—=¯¾C�' Àýp*Î @ ŽSéÔk²á<¬£él†Úrò²8~ÝÒÙ ¡/ @€ @ íþåî‡ã÷ÿò¹ãž?7‰nmå†Ó� @€ÔA`bbOl¬ÃH†¨—@%’«ë5–q @àɸ?¹�+˜µÀ¦M×÷V#yÕ¬2@Ý^ó¢MuË@ @€ @€�v¸þwÿ1MæÛõ-ÉêÚk»·; @€ @€�Ö ¬_ÚÓºÉÍ|8�ç®ø•¸ÿáý¹Ç\·¸‰úöÜn: @€ @€�f LLLÄ’y}ÍžÖ|O.°aüìŸùä—]!@€�™(pŸ‰š>x�¾´çÒìÒГ\vºÉÛ/ÞÃýMžÕt @€ @€�Ö|ûŽã�þöÖÜ“/HbÞ\Õí¹át @€ @€-HÓ4ž²f 3›òɪQ½úÉ®9O€3Pà>37½ p8�ì)`ím‡E¨d¿á^pöº"„" @€ @€@S~å¿}1&§ª¹æªdw´Öd»·; @€ @€�ö8´OÌíëjŸ€;>Òä…+¶¼qeǧ)A4QÀ]ë&b›Š�ÎXyöŽS³ Oéì,Û'»‹·®�ñåóÛ'`‘ @€ @€f!ð7Ÿ¿=>ÿõäat~ý=¹»é@€ @€´PàÐädœºq¤…˜úq•®dòŠÇ�ó-ÌB@�û,ðt%@€À£ÒH_ûèï}ÝZ�—=÷˜Ö`v @€ @€@“œŠ_ýýrÏÖÛ16ßc‚Üp: @€ @€�ôÅþ誽5›£iĕ׻ÑRˆÕ� àÔNXE9 Ðr�õ§m΂øÙ–"€GNÙ° N9n  @€ @€@)~ç£_�»îÝ�;×5‹*ÙƒðÜÝt @€ @€ °oÿ�xʺZ¹Š£ kF·ìÜZ�X„A€�¶pëºí—PA`ÿœä%Ys‹‹"®¾ø„H¯Rö³@€ @€t¾Àvî‰÷ýù͹ž“Äâ!÷OrÃé@€ @€ $°d¨@Á%’Jå• @ > ÜëãhÊ.�ÖÞfÈQ�Ã}±eóê"„" @€ @€@Ã~ý|9ö˜Ì=ÏšEŠÛs£é@€ @€ &01±;Ö�,ª‡“ÆÅ«·^;¯ÄR'@€@ݸ×�Ò@”U`Å9;ŽÉr?£¬ù-ï/9!æÎé-ZXâ!@€ @€Ô]à–ÛvÆ_~ú»¹Ç­íÜ>Ô¯À=7œ @€ @ €–õ0ªÒ†Ô?•N]ZÚì%N€�: (p¯#¦¡(§@e*½¢œ™/ëîJ%Î?s]ñ @€ @ ÿþ÷oˆjšæ9ÉêÚW-ôh šÆ @€ @ À»'vÅâyŠÜ‹²DiT^Y”XÄA€�vp»�WOì´^`Û¶®Hâ­D5�—Ÿ¿!–/†A€ @€èx�¿ÿÒñÅ[~˜;Ïó’èïÉÝM @€ @  iöâ÷“× 4º2†•ž:vÖŽ“ʘ¹œ  POîõÔ4¥»wéyYÒ+J—xA~ɳ642a @€ @€ê'0UMã?üÁ—rØÝ±r�ǹát @€ @€H®ìmÛÅèJíâ^Œ•m,àNv/žÐ h½@•+[…jgž´4Nذ  @€ @ ã>üñoÅmw>”;Ïñ¬¸½ÛS�Ün: @€ @€�¢ 8x0NÙ0Rô0Ë_/_þö¾ò$,SÔ_À­ìú›‘�’Œ�~Ý‚4âÂ’¤[ø4¯ºðøÂÇ(@ @€ @€Àlöì?ïüðM¹‡éï‰X>b'·Üp: @€ @€�6X87«bqE`Á¾½•%q @ ¸·ãª‰™�bôU/Ëé-F0åŽbÁp_œ~òx¹dO€ @€”Bàwþìë±ó¡}¹s]½¨‰úöÜn: @€ @€�v˜˜Ø«–Îm—p;>Î$­¾ªã“” ( À½�¸†&@ ÃÒôŠϰmÒ»úÅÇÇœÚ6d @€ @€@ üèþ=ñ{ÿó¹3êObÑ êöÜp: @€ @€�68v´¿Í"îàp“ä¼[Þ¸²ƒ3”* À½¡¼'@ Sƶ\sb–ÛæNͯÝòzÎékÚ-dñ @€ @€r ü§ÜûLæî·v±âöÜh: @€ @€�68°oO ôuµaärÒ•L^Ñ‘™IŠMPàÞdS ÐyIR¹²ó²jÏŒ.8ce¬]ОÁ‹š @€ 0M�oÞþ@|ì“·M³õO›Õvn¯íàî @€ @€:_`rr2žºa¤óm“ Óˆ¬¾èz5šm²^Â$@ Xþñ,Özˆ†�6ؼùªžì@_Ö¡–"Ä—=ç˜Rä)I @€ @ Ü¿úû7ÄT5»+•ãH²ºöÕ‹<ÈA¦) @€h{�¹Ý£vOÀQ�5£[vn-D$‚ @€@› ¸³Ýf &\Z/pïÐÜ ²(·>,_87ž~Ò @€ @€@G |òÆ;ã³_»;wŽËG’èïÉÝM @€ @ �öìÙÇ®jã :+ô¤Ryege$4G@�{sœÍB€@ TÓ©ìíƒE¸úâ㣷§»¡ˆ� @€ Ð�jšÆ¯ýÁ—r�Ý�Ýý_à@n8 @€ @€@¬^¬–¢0˘ÆÅ«·^;¯0ñ„m"àîv›,”0 (†ÀšgîXšDRÛÁÝÑb�JöìÙ§­iq¦'@€ @€4Và#ÿûÛñÏß0÷$+³âöî®ÜÝt @€ @€:@`÷ÄDÌêí€L:"…þ©têÒŽÈDh¢€÷&b›Š�ö˜</˲ðh°Kùâ³×ÄèÒ‘D" @€ @€@cö˜Œw|è+¹ïï‰X>/ÉÝO @€ @ 3ÒìáNY;ØÉt@iT^ÙiH�MPàÞTn“ ÐæIšT¯ló:&ü—>kCÇä" @€ @€ÀáÞûç7ǽì=Ü¥#ž[½°õíG4r‘ @€tº@¥º?ºÜ (È2§§Ž�µã¤‚# ´…€÷¶X&A P�•gï85"ÙT„XÊÚ僱yÓhÙäO€ @€t°@­°ý¿}ìæÜõ'±hHu{n8 @€ @€@‡ ìß N^;ÜaYµq:]©]ÜÛxù„N€@ó¸7ßÜŒ´©@5ÂîíY»×]´)zº» �0 @€ @€õxLJ¾{÷OæxÍ"Åí¹Ñt @€ @€*°lÄ}‚Â,m/_þö¾ÂÄ#\@�{ÁHxC`õÖ+²½¯ÒK‹M¹£è®TâÜÓV—Aö @€ @€@G üó÷Œ?ýûoçÎqá`Ãs<¸Î § @€èP�]»&bÅ¢9š]Û¥µ`ßÞÊ Û.j @ E Ü[oZÚK`*†_”E<¯½¢îÌh/=om,]8Ô™ÉÉŠ @€ � üêûoˆ©jšË"ÉêÚW/tË?šÆ @€ @ '¬œ[‚,Û#Å$­¾ª="%Z/ànwë×@´�@šÆ•mf)B¼øÜ ¥ÈS’ @€ @€@9>ûÕ»ãÓ7Ý•;ùåÙ[ŽÏéÍÝM @€ @ ÃØ}=]že›¤—$ç­ØòÆ•m­0  ÐRî-å79í 0ºuûXç³Û!ÖN�ñ˜ñ‘xʱË;=Mù @€ @€%È6Yxd÷öÚç„þ¾®Ø²yUé @€ @€�)ðÞ�~=jEîy�UµÝÛóvÒž @€(µÀÞ½ûã„5vq/ÂAÉóFŸùú…EˆE (¢€÷"®Š˜h¹À¢3ß:”¤É [ˆâª#CsH @€ @€:N`çCûâýõO¹óìObá òöÜp: @€ @€1:¿‹B1ºcªk[1BŠ' À½xk"" ÐßsàÂ, UÕX‹ç?cm¢ @€ @ þïþÈ×bïþÉܯ^¨¸=7š @€ @€À#{v�nEHãò"„!Q@�{WEL´^ �ËZ„N=vQ·n) @€ @€@Ç Ü}ßîøÐÇ¿•;¯‘9IÌ›«À=7œ @€ @€À#Õj5ž²n˜F²;<ÏX~îëW ! @ p Ü ·$"@ ÕËÎÚ¾8"=¯Õq˜?⊠ŽÅ@€ @€èH�w~è¦8xh*wn«)nÏ�¦ @€ ð�9•C‘¸Åð“V}S™ê² g«ðÍK€@¡¸zyG€@+z*•mÙ¼]­˜Ûœ?è®T⧬üé _ @€ @€:Dà»w=ûäm¹³Y0�Äp¿§Ï¹át @€ @€#°{ÏÞX·|ð1ç|Ó�$Ò˳™Ýði ¿Y (°€÷/ŽÐh‘@^Ù"úGO{éykcá¼�GŸò5 @€ @ #ÞñÁcrªš;—U =ëÌ�¦ @€ pX�õË{{ÞÉf $›FÏÙ~R³g5Š. À½è+$>š*°z뵫Ó$=³©“šì°nY{ØóN @€ @€ÚYàŸþåþøÛÏ/w ‹†’èSàžN @€ @à°ö퉾ž®Ã^s²¹ÉTò²æÎh6_@�{ñ×H„4Q`2ÒŸmât¦z�å çÆS�}’«N @€ @€ÚWà?}àÆ¨¦i®jeí«¸�Ÿ Mc @€ @àˆ‡MÆ)ë‡ŽØÆÅ& $qilÛæÕMâ6 í!àŽx{¬“( h–@—5k*ó<¹ÀU=Ýþ¿ýÉ…\!@€ @€ÚQàËß¼'>ù•;s‡¾d8‰9Þ5<·› @€ @€À‘æÏ=òuW›&0:zïò-M›ÍDhîm°HB$@ 9c[®91"Í>­8÷i«Z‚ù  @€ @€uø�|9rnÞI¶}ûøB·òë¾$@€ @€bb×D,[ÐO¢Ù= Ë † PwÅ ³!@ ÕIR¹´Õ1˜?bËÉËbíÊ…( @€ @€%ðé›îоñ£Ü9-I¢¯;w7 @€ @€Ó8aÕÀ´ÚiÔ`�4¹dõÖ+¼Ú Á̆'@ }¸·ÏZ‰”�Æ $iÄe��ÂèÓxÙùÇL§™6 @€ @€�¶ø�ܘ;ÞJ¶{ûÊnãç†Ó� @€˜¾Àä¾èªÝ„p´X ™¬=¯ÅA˜ž…pg¼0K!Z)°âœkÎÈæ_ÕÊÌÑ×Ûgœ<†‚ @€ ÐQûùÛã–ÛvæÎit~=]¹»é@€ @€˜¶ÀþýbÓê¡i·×°�IåòŽnh´•€÷¶Z.Á Ð(�¤Z±{{£psŒûŠç®�‘¡99zhJ€ @€(¶@5MãúJî »³»÷£óÝÂÏ § @€ �[`t¾WØçFkH‡ôù«·^;¯!C”m&àîx›-˜p ¨¿ÀæÍWõdo´ô’ú�lļÏÆÚ¼]´'@€ @€ZàcŸ¼-¾sÇC¹cËŠÛkEî @€ @€@£öìÞ#Ý�žÆøGè�Œê%Go¦:_ÀíñÎ_c p�{{Ÿ•5Yt”f.7X`ÍòÁ8ù˜å žÅð @€ @€�æ LNVã�º)÷„=Ù¦iËçe[28 @€ @€M¨V«qòÚá&ÌdŠ£ ¤éåGm£J  À½‹,EŽ&P¹ìh-\o¼Àk.<.ººüZj¼´ @€ @€�f |øï¾wÞ3‘{º• *á6In6 @€ @€�YÌé:‰×ÛÏB°^]“³G·n«×hÆ!@€@» ¨$lו7uX±ùª¹Ù@Õe0ƒÌJàìÍã³ê¯3 @€ @ HûNÆ»>òµÜ!õeï¾lÄÓäÜp: @€ @€³سgo¬[>8«1t®‹@’¤qi]F2ÚX@�{/žÐ ˜½@×Àœd£ Ì~$#ÌF༧�Æøòù³B_ @€ @€@¡þð¯o�{Ø›;¦Úîíõí¹Ýt @€ @€f/°~yïì1B’Ëë0ˆ! ÐÖ ÜÛzùO€ÀlªIõ²ÙŽ¡ÿì.}ö†Ùb @€ @€@Aj»·¿ïc7玦¶{ûÒaÕí¹át @€ @€ê"p`ßžèëéªËX™•ÀÉãç\·iV#èL€�6PàÞæ (|f.0vúu ’HΟùzÖC`n_WœvÒÊz e  @€ @€@!þèoo��íËKm÷öD}{n7 @€ @€�ú:4§¬ªÏ`F™•@Z�²‹û¬u&@ Ý¸·û ŠŸ�™ ôV/Î:÷Ì|=ë!ðÊC}õÊ @€ @€�– 88•íÞ~Kî8j»·/±{{n7 @€ @€�ú ÌŸ[ßñŒ63�4"+p¿^}çÌøô"@ üØ‹(f*P½l¦=õ«ŸÀùg¬©ß`F"@€ @€´XàCÿVÜûÀÞÜQŒe»·WìÞžÛM @€ @ ¾»&bÙ‚þúj´™Œ¯<ûþ3gÒQt‚€÷NXE9 �[`tëö±ˆäìÜu¨«ÀÆñ‘8aý²ºŽi0 @€ @€@«MVã½~sîé{³ÝÛ—Ú½=·› @€ @€@cNX5И��šO ©d»¸; PNîå\wY(½@%M^’!Ø«Å? ¯yáqQ±5Y‹WÁô @€ @€@½>œíÞþ£û÷änl¾ÝÛs£é@€ @€4N`r_t©çhœï4GNÓtÛæÍWõL³¹fè(’!@`ºi¤—L·­v�¨d¿�ÎÞ<Þ˜Á�J€ @€h²Àd¶{û{>úõܳövE,±Cn8 @€ @€�† ìß 6­jØøž¶À‚{úΙvk  ÐA Ü;h1¥B€ÀôÆÎ½n4Û¼ýôéµÖªQ/8sU,_<ܨá�K€ @€hªÀŸüý·ã;óïÞ>ºÀîíM](“ @€ @€Ó�Ÿ½*ßÑr�4 ›x¶|@€@+¸·BÝœ´V Z½¨µ˜½&°í™ëA @€ @€:B`rª¿3ƒÝÛ{²çÄËíÞÞ?’ @€ @€�&°g÷îœÓÝiiµa>ÉE±õz ц+'df' À}v~z ÐŽiõâv »“b˜ÓOÛ”m¤ï @€ @€t€ÀGÿÏwâ®{&rg2:ßîí¹Ñt @€ @€š"P­Vãä5CM™Ë$GX4š>pÖ[¸H€�ðÊž\T) ðäKÏxí’ˆdË“·p¥¯xîú˜;§·S™ƒ @€ ÐP�©j¿ýg_Ï=G·ÝÛs›é@€ @€GØ{0�½"&«?þ¨ýÍZû:{㱘šú×siDWÑßSûHþõó�¿®½Ó˜ƒÀ£†û³G.É‚ødš% À½YÒæ!@ ==½/Êñî-^�óN[ÕâLO€ @€¨�ÀÇ>y[|ÿ‡»r66¯]îRåvÓ� @€~,�f…ê{¤ñð¾ˆ]û²Ïû³bö¬ˆ}ºG­_D6È£ŽÊ#…ï?.zìOb¨?²�$ºýýú(¥r}91±'�ôÅ}g¯œp´L ûOóűmÛâÏþ,Çå- ×Ĩ‹€÷º0„�6¸¸�bíÈP—Ìë�“�]Þ‘¹IŠ @€(—@5«&øí?ýZî¤k…Ëçe�& @€ @`šÙfì1‘±ïÊ ÓÎ Úk_×vf¯çQ›ã‘]àF<°ç§Åïµ7h¯ºÿø#b 7‰ÄŸµõ¤/ðXilZ5ŸºY�{‹iÙÊ{—�qgÄg[‡é  Ð4îM£6­ÆëægÛ�Ûê8Ê>ÿ•Ï?&zjïÁí @€ @€´¹À_~ú»ñ/w?œ;‹ÑùvoÏ�¦ @€J(°ÿPÄ}i<˜›Od»µ×vmoű/+xßw0�{wý8€Ú;’ÍŸ›Äâá$dŸ»·bUš7g%ûAt´\ �Ê%Y Ü[¾ @ YÞ@¦YÒæ!@ åS•žfAxaO‹WâœSW¶8Ó @€ @€f/P+*x÷GìÞ>{I# @€ @€À£&§"~ôp7ßU�¿7ß¿¿»²ÝÚ[UÜþèØ~òumçø�»Ó¸õÕ¸á_¦â¶{³³]å�)°{ÏÞ_2·3“k«¬Ò‹#®WïÙVk&Xf# Ðs6zú ÐVÙ+†k¯dt´P`Ýèp·vi #05 @€ @ >ý¹‰Ûî|(÷`+æ%ÑíQdn7 @€ ÐÉÕ¬6ü�l—öû²ÒØ[¬bö£¹OfÅüÚG_V‰¶x(‰¥Ã•˜Ó{´ž®·“À1£sâŽ{÷¶SÈ�ëèèÙ�v÷§ã‹�˜œœ ðxî�ñ=)°þ´íÃû#ÎëÈäÚ(©+.Ø•JÒF • @€ px�ßüã¯þÂÎÖÞÂ}Å|ÕíG r‰ @€¥x8ÛõüÞ¬¨ýþl7ôZ¡x»&#îz0Í>¦bÉp«V¢WuZ»/ë�ãŸÜÙÆ’…z'�΀͛Eµ¶¹§÷¼lÚ Жþ¢-—MÐä8Ðd}¼>8/\�ÛŸõ”±:�h8 @€ @€@óþæó·Ç·ïx0÷ÄvoÏM¦ @€:N`ïÁµß7‘F­ ¼žÇàœž8õø¥qÜê1<ØCÙ÷C½14·'çÖ>÷ÆÜþîØùо¸ãž‰¸ãGqgöñýÚçìûÝ¿§náÔ ÷wNLÅèü$Ʋ{×^ôíh_�}ûı+‡âÖ;&Ú7‰ˆ<{�A­ÀýÍÙGö¾t¶€÷Î^_Ù ð¯iš\6oéÏÃS�YëÆµ4“ @€ @€ê!ðî?™Ùîí£ó<ͯ‡¿1 @€ ÐniVŠzÿžÚÎæiìÞ_¿ºÔ…#ýñôMËâ´–=òùø5 ³Bò£G¬y¤ýãœz¤èýkß¹/¾ú­{ã«ß¾7n½ý�˜ªÎ,æZ·;H㞇§bÕ¢Ê#»º=ºÇGåû¢¬ZÜ“¸%šÒÆ1¾òì§Þùéw}¹´'@ 4 ÜK³Ô%P^�¥ç½y |^yŠ‘ùËž³¡�ˆ‚ @€ 0 �¿ûÇïÇ7³‡ûy�å#Itwåí¥= @€´³@­Àûž‡Ó¸û¡jì?4ûLÆ– þ[1ûi›–G­P=©cÅx_oWlŸ÷ÈǶgþøÿÞý“qËm;㦾7nÊŠÞ?÷µ»c÷¾|Éduóñ�{ªñƒ‡’X»8‰‘9u zö¬F˜¦ÀÁý{£»;‰ÉÉ™½àašÓhv�4ÒÚ.î Ü�âä2í/ À½ý×PE çСçfMæ¥™Ë 8ãä±Ï`x @€ @€@ãÞõÇùwo¯mž7š½»ƒ @€Ê!p(+èþaVÔþƒ¬¸}2ûz6ÇØÒ¡xñ9ë㢭ëbýؼ٠5£¾sû»)ª¯í_;öœŒøÒ�ñŸº->qã�Y±suÚãî9�Æ-w¥1¾ ‰ñ…þNž6\A/‰»·çvÓ� @€í&PÛ¥½¶[{m×öÚîí3=Fûâ…g­�‹²ÂöS�[Z×]ÚgÓOúõ÷vÇóŸ±æ‘�‡&Äß|þöGŠÝoøÆ�~Ò䨟ïx �}‡ª±ai%j/ w´�À²/L(Àj­]±eûS~ð™ßÊ¿ C‚¦+ À}ºRÚ Ж«·^Ñ?™¦ÏoËà;(è—ž»¶ƒ²‘  @€ PV�wýIþç†vo/ëO‹¼  @€(“Àîlgò»²¢í�»g^ÕÞ›½2úÙOd·ö­›Ç¢ö}Ñ�yC}qùs�}äãÎ{&â�º)>ú‰ïL+ìû&ÒØŸ¹¿¢âEáÓ+F£={vÇ@_Wì90Ë·&(F:mEWµ]ÜóߨjÛŒN€@¸—qÕåL DÓ¡gg¯*QÊ…Kµ»R‰ÓN+\\"@€ @€äøÔW}û¾<]i»l$‰Þâ×$äÎK @€ˆxpow?˜ÆCÙç™§Ÿ¸ü‘¢öç�¹&†zg:LËû­\:ÿõ�gÇ+_¸)þ¿ß»!þñ?ÔIiµ].i$Û² )û˜ù?>m—µ€ (›€÷²­¸| ”L +I.Ný¯\KWýEg¯Š…óZƒÉ  @€ @€³x÷GòoŠ•do³>6ß[wÏÖ^ @€I V‚PÛ}¼Vؾ'Û¹}&ÇòEñŠ Ž�‹¶®‹ÑŃ3¢°}N\¿(þô?^ÿû†ïǯ½ÿKqû>b¬ûÅ#EîÇ-¯Ä¼¹ÙÒŽÂ Ì›SøËà†±-לp×g~û–2$+GÊ) À½œë.k¥ؼùªž{Òxa)’-p’žµ¦ÀÑ � @€ ðÙ»09®2Ñûoõ„ž49+gYÑV°,�dIÎ68� ,\ÀkÀÆ6ë ì]ÀìÂÂ…�ËÞ]À„ ì]m0Ö6Æ`L0Æ Ë²rÖhf4#MÝUß©1²ºjºzº»Ò¿žg¬™ª:ç¼çwÚ3Þzkr�'·uȓێM~âYgÔ–ªêí¼ – ?"€ € €þ0+µïíN=±}^[¥¼ûú¥r톙’›Ü ¢Í ¾/]Ó&›VµÈ×¼M>þµ'elÿÝç&='Ñ ToO¤Â>@@@ÀC*�wo·.½ƒ©Ul_w^ƒÜrÝyÒ¾²EÌäï°ly*‰ÿ�×.–ójå}HºO [NÝ”ÝqL—h^DÊ B„d)âå†,i+‘Çžïñr�!ˆÍ0Ü?‚‰2E©@p/ é‚2mxUÀÐÄ|"Çæ¢ÀM[gKiqÔÅ@@@˜šÀÎ'äçOtÜIU‰&…ùŽ›Ñ@@@ÀCfÑñ]�º<½?î8¹=¢2Ù¯Z?CøÌµrï?_)U5ó0%·Ÿ¾Œ+æ×Ê�>}�Ìmµ¯Qh¨,÷íGt‹�Þšï½(P˜;îŰÂÓ¶ w,Û¤™/„G€÷ð¬53E \7Þ˜#¢½&\“öÞl/S·cC@@@ü,pÏ÷žÝü„ÝáÖ\Iµ9‡dœŽ € €xF@W/õò‡}qé8iˆ“W…ÑüyË ä±/Ý(÷üÝ%²tN�gæåf Íu¥rß§®– Ëíï?¦.*Ø~T—^Š»9½Ð�=00$MÕ…¡›·×&¬Gâ×{-&âAÒ%@‚{º$é<%ÐÜÕt‘ ˆW‰.®JeiT–/ht1†F@@@¦&p´{Pî{l·ãNÊ 5)åvêŽÝh€ € €xA «ß�§Tbû¾n]âzòU¨ÏÈïxãrùÝ¿¿Qþù=Êô†²ä‡äÌÒâ|ùúÝ—N\`7å¾Cöt9À·ëŒcXÐL‚{Æp“ìØ0´’<•Ó@ß äú.bF’ÐÕŠa½·W2>Y8çmWÌ•h>f²@Í € € € �!�/ß÷'�9ÿ@�êíZºE@@2(`&Uïí2¤_ýëd3+“ÿåk—Èë6Ï•¢>#ŸÌ.7'"{÷…RSQ(ÿû?ÿhyúQU9¿¤À�º2î�f‰äò�ˆ>:‘šCµ}Wbió†÷Í9ôËÝéj Žd@€gU@¥Kp[àîˆh=Ü‚Çåe¸ä‚—#`x@@@@ u�¾Á1ù?Û¢|M¦óá»c8 € € €. ŒŒËDµöîg‰ífÅö÷¿i…¼åò’›q)zkÖ+¼ã�+ä¥ý½òã_ﵜĮN]Šó#*Ñ�×Ù–H.‘9M%²ãЀ‹Q0´D43GêH €AàÙUÐV”ù €€4nèY£ pO ¥®DÏ®w/FF@@@¦(ðõo“�a•åàp£z»C0NG@@\0oص·[—§öÇÅIr»™Ì~³ªØþø—_'o¿zÉí)®Ÿ™äþé;7ÈÜÖJËÌÊà/Õexâ¹£òìÎ.ÇÑ×–iªR™ãf4@@@È�@LÙqL—mGtK²j{ûÊfyès×ÉÇß»^ª+ 3ÝÚ ÔM+’w½v±å)ƒ£†tö‘ân äâ�Æ .q‘bhu�EAÝ^ÆG�´ �àžVN:CWòôËÔø|”èâ"ÜtéѸ5›‹+ÀÐ € € € 0�Ï÷Ù”š7WòV{Jp4B@@2 Ð;dÈÓûãI'B›Éì_ù‡-ò��\&s[+3]:xÏõKeZY�e“ÇuÑÉq·ôqëÀèÈ�俍[ܱ¹)pé¢Ewç»c#€éà]÷tjÒ¸*`hÆÕ®ÀàráÒ&@@@@_ lÛÛ#¿|ú�ãØ«K4)ÈsÜŒ € € €iˆ«ªí»:uyá°.£±ä:¿fÃ,ùù=7ÈÖ5mÉ5ଌ ”åÉ�oZa9޹¶GN�án äÒ�±±qYÐZâÒè ûg�ÒþêÞ‹Ñ@‚"@‚{PV’y r�•+oÎÓD»<ä ®N¿©¦XæÏ¬q5G@@@R¸ç{ÏŠ‘ÂçãÍÓ¨N–ª9í@@@�t ý·« @IDATœVUÛÄ¥ãdr/ìÌ á÷üÝ%ò¹¿Ù(•¥Ñt…A?i¸é²ù2½¡Ì²·ƒ=ºŒÇ-sÀ%�ÆiTp‰þ•au¡8è+|ƒ¾ ÁÝ÷KÈ@À8VZt¡ˆQކ{o¹tŽäDø³âÞ 02 € € €¤*p¨s@øÕ^ÇÍ+Š4)‰’àîŽ € € €@št•Ͼ§K—çé22ž\§—­�.�|þz¹jýŒäpVÖòr#òwo;ßr\³Zÿá^õ6O ÄF†TÞ¹(êWâÕj|ÁÍE`lH›™ˆi£¤#pSÀ0tó ›‹ë—7º8:C#€ € € €© |éÏKÌütÜáÖ\Éç…É8@@H›Àਪھ?.GN$Wµ½¬8_þõ®vùÒßo–êŠÂ´ÅAG™¸bÝ Y>¯Ö²óc}FJwb³ì�S—ù-%Sî‡RPïTMoiߢÔ{ % àܽ³D‚SPOЮšBsšNQ ¶¢@Ϊ›b/4G@@@²/ÐÛ?*÷>ô’ã�‹Uåv³‚; € € €@öŽòœªÚ>œdÕö�«Z&ª¶¿¶}¶h¼”Ëþ‚¥0¢¹NÿóíX¶�‹ô %wqƒe'H»@su^Úû¤CgêÎ uFÆÙ àQÜ=º0„…É 4­ï\u¶ùÅæ’À›/›#y¹9.�ΰ € € € €@ê_ûÑ 24sÜÕÛ“Ñ@@H‹ÀÁC^<ªK27â*)Ì“O½ï"ùú‡/•úªâ´ŒO'ÙX½¸^.ZÞd9`§ªâÎæ-�øè°D¸ŠÄÕEÑÄ ÁÝÕ`pH— îé’¤pM ’“Cõv×ô_xÊf—#`x@@@@À¹ÀÈXL¾öÀ6Ç T1²êJþ9†£ € € 0U•X¶wè²ÿ¸žT/ë—6ÊCŸ»^Þ°uUÛ“óæIoTëgµõ bVrgóŽÀÈè˜Ìk)ñN@¡ŒD[S·î–ÚPN�I#€@ HpÔr2Â)`på¡« _Y•%sê\��Á@@@@�Tþë¿wHO߈ã¦M’#«Ñ@@H]`TÝx빃ºt÷O^±»0š+{÷:ùÖG/—æZmSW÷FË­«Û¤¬8?a0†z8t%ñ˜Hؘ�h­V•ØÜÐòóó®p3ÆFÒ!@‚{:é\˜Þ~G…ˆv‘k0°Ü´u¶äçå"� € € €øJ ®Jÿ}ñÏ;Ž9/G¤®œêíŽáh€ € €¤(Ð?bÈ3â20:yrûù ëå¡Ï^'o½r¡D4^»¥Hî©fÑü¹öâY–1ë›üqaÙ˜ˆ��ðÿ_Fd“ïÔ0"W'6g"€Þ ÁÝ›ëBT �¤@\ôËÔ©êcE6·ÚW6¹54ã"€ € € €) <ð«=rèX¿ãö ªz{„ Çn4@@@RèTÉËÏÒe<>yëw½f‰|çWJ[CÙä's†¯^¿e®e¼ƒê‡d.~°ì€i•ÙMÅiï—�[g_~[ÔI ÎE¼&@‚»×V„x@À‘€º÷*G 89­Å…yrÞ܆´öIg € € € €@6þïýr<ŒYü¯�êíŽÝh€ € €80krïëÖeÇ1]ŒI tçåFäß±A>ôÎÕ’ÃÉN©}qþy³kdNk…e¬æ…lÞ˜^CnµË+R2:(»Ã#€S Á}J|4FWÚïÎC®p5†�þ¦-3¥° /ä L@@@ü&ðÔöNyfG—ã°kK5Éã^‚ŽÝh€ € €8ˆé"ÛŽèr¨wò¤åêŠBùöǯ”7[Wøv26çzSÀ¼àüõ›çY×Ùoˆ>ùÃŲ=Ò/`ĆÅ\76÷ÔÿW»7:##€S Á}ê†ô€. ´Çת¡+]ža•À%ç·â€ € € €øNà+)To7'ÙXÁ'³¾[lF@@_ ŒŒ‹t G@@@ I�C†c#€©�àžŠm@À5�Æc «ÕàÕ®ÀÀ²t^=  € € € €€o†ÇåÛïp¯Y¹½²ˆwÇp4@@@ìêÔåø$ÉíE¹ò�¼T.ZÖ” v!ðª@Uy�¬ZP÷ꎳ¾£ŠûY øqn# î®.ƒ!f‚;ot¹º ŽNHpw*Æù àª@$"[] 䃯^X# 5e!W`ú € € € à'�{zI†Tù6‡[coŸ;$ãt@@@ ¡À¾n]ŽõÙßU«¤0O¾ù�—˚Šû`'g ØUùï™äbгûâçÌ äk±ÌÂv­ÍݾÄîŽ!€^àz¯­ñ €€½€a�àn/”Ñ£¯½xFFû§s@@@@ �†ÊŸø÷msÜe®zç¼¶”¢VŽáh€ € €œ%pä„!‡zí“ÛËŠóåÿ}ì 9¡uEåGdËê6K…¾CÆã–‡9à‚@ÿÀ�T–ªÛå±¹& i†YÅ� ð� î¾Y*E�éíwT¨»å¬FÂ=�• êÝœ‘@@@@‡ÿ~¿ì?Úç°•H}¹&9¼{îØ� € € €Àé]ý†ìéÒOßuÎ÷•¥Q¹÷Ÿ¯”eskÎ9Æìf7WH[ƒõè{í/¬°ë›c™0dAKq&:¦Ï$ M.MòTNCÙ¼%PQè­xBÍÚÙ«o³¾*$„ L¼-À»ôÞ^¢C�Ó´Hdëi?òm–^¿y¦ª\ÆŸ�,³3 € € €¤(ðÒþ^yâ¹#Ž[W—hÍuÜŒ € € €1äÅ£º6ùÅÑüùÚ‡/•Ó§á†@Ê›/h³lÛ7ló´lÅ�L J~y'™4ž¤ïÜÑh¤}’s8ŒxF€¿žY A�I4Ý0¸UÎ$H™<|áy�™ìž¾@@@@�´ |凲M¦°¬±B•€cC@@HI`d\ä…#ºÄmŠ·GTéí{þv“œ¿°.¥1h„À)�U jUÂtΩÏøw4&b>Ù¼#�ÇeAk‰w a$FÄ ¸h×�)#àWÜýºrÄ�@ÈšÛ>Zœ²i{fºù¹Y2‡7<³ ‚ € € €¶½ý£òƒGwÛž“è`IT“²BÜÙ°@@˜LÀLj7+·�ÇíÏü_·­—-«­+oÛ·æ(¯ ˜ÉíËæÖ¼ºã¬ïúÔÝؼ%ÐPÁmó\]CHpwuœ�àîD‹s@À5ÍÐy‚嚾ȵµIqQÔÅ@@@H^à›?yQFÆT©6‡ÕÛ‚q: € € pšÀŽcº ŽÚ'ÿÍ[WɶÎ;­ß"05�Õ‹ë-;è¶ÿÔ‰æÍ«Kù„õ”ÿ"€ € €Nö×åø€}2ñÛ¯^$·Þ¸ÌI·œ‹À¤«Y'¸Ÿ$Á}R¿lŸ022*3ꋲ=,ã�&×"[Nû‘o@Ï �àîÙ¥!08%°råÍy¢É¦S?óoö–ͳ~A˜ýh@@@°xð×{¥ãø õ GÊ5‰�ßn¡Ãn@@@ÀZ »ß�ƒ=öÉíW_4Sî¾y •›­9’¢ÀÊùuêõ|âôÃc"ãñ;¦YƦ×d¬o:NBÀ�­IœÅ) €€ë$¸»¾€“ -Ë¿@�S:ÙyÏŒÀªùÕÒX[–™Îé@@@H³ÀW~ø‚ãÍÏÁë+x»Ü1 @@@ ô£†ì8¦Û:,›[#Ÿ¹óbË$dÛÆD`�’¢ª¸[Ú¸u _‹¹54ãšš\"íwç‚�x]€wì½¾BćÑs¸rÐÅÇÁuí3\�¡@@@@�äž~©Sþ¸½3ù>³¦T“üÇÍh€ € €„Z`LUÆ~ñˆ.ºMñöºiEò•Ø"Q^t…ú±’éÉ_°Èú®ô'IpÏ4¿ãþeZY¾ãv4H›@E“_•¶ÞèÈ� î‚¥[H§€A‚{:9öµj�õ A‡]q: € € € �Q�¯ÿx[Jý7”'¾•yJ�Ñ@@�€™Ôn&·�Úb6“Ú¿úÁ­R«’ÜÙȤÀ‹ê,»ï¶<Ä´»8:Ck†�‹ÅüÌ@@@|#ðø³GdÏᓎã­UÉíܼÎ1 @@@ ¤Ãc"Û;ì“ÛçµUÊ¿ÞÕ.�‹‰Cú0qmÚ«[ç7 ŒºÛÔWäØåP¦tƒ¢£™6¦˜š îSó£5dP yÃûf«îÛ28]Û\ua«”GmÎà € € € à �o>øbJ�Ô—“p‘�@@@ t1•×¾íH\â6ùí•¥Qù÷m•’¼Ðù0a÷VÌ«µ bxŒ î–8.ˆ��׸·š�àîž>##€@2$¸'£Ä9 àŠ€úxq«+3è„ÀÖÕ­H € € € €žèê–Ÿýn¿ã8Ë 4)Ž’àîŽ € € :35xûQ]†Ç­§ž«n�õÅ¿ß,-u¥Ö'q� ´Ö—JžºS}¢mD=ví.ÎHÔ†}™•™õÅ™ˆ¬fµlºm–ÕAö#€n $þ«îvTŒ�(õ"y î ,µ¹ºÙ½¨@@@8Sà¿þû%‰™¥nõ$·;$ãt@@©À�㺜²¯€ý�·¬•µKB*Ä´½ `^d1³©Ü2”áqûǰeCdT`z]4£ýÓ¹½€®käfÙq\ ÁÝE|†Fk�•+oÎM6YŸÁ‘L ,Ÿ3Mšë*29}#€ € € €S0ÔgÓÿù³íŽûÉÍ©.!ÁÝ1 @@@ t=ƒ†ì±O ~ë• å-—/� öžÀœë<‡á1ïÅKD"yšÍ­!ʸ€fÈ֌ €@Š$¸§G3Ȭ@Wiáj5÷.Ë,³eï×mœiyŒ € € € €€W~þ‡ƒr¨sÀq8uešDÈowìF@@—ÀˆÊ;ÝÑaǬuç5ÈGÞµ&\0ÌÖ³³m܇Æì/Ôðì¤ØÀÀ�T•å|–žžÞ%Ò~w®§#$8­ î¡]z&Ž€·â†Á‚..Ñù ¹uœ‹ü � € € €I |ó'/&yæ™§Õ—ñÖø™"ü„ € €œ) «\àíGu‰Ùä··Ö—Ê>°Yrsy�u¦?¹%`WÁ}ˆ în-ˤãÎo)žôNȘ@Y£ÞsAÆz§c@` <ÜM@ sÜ's¶“õ\]^ ófÔLvÇ@@@@WŽtÊ£ª‚»Ó­¢H“B ƒ9eã|@@™Àž.]F­+^GósäËÿs‹T–FC&Ãt½,0§µÒ2¼a*¸[Ú¸} ¼Àúw�Û±…aüHD(B†…fŽøP€w.!#t�æµwNMÎú<½:¿7lž%¹9üyðêú € € €¼,ð­Ÿn—¸YRÐáV_®9lÁé € € €@¸ŽõÒqÒþõÖÇß»^Θ.fëy�™�åÑ¿î1ìÖžŸ_P”h^NP§çýy îÞ_%"D ”d0†rÙ™4Þ0¢±M*B~?¹´LëÎkpid†E@@@’0Ûÿë¿_JîäÓÎ2?+­*NüA÷i§ñ- € € Z�AUµ}w§n;ÿ›.›/7^2Çö"à†€yg�–úÒ„C›Éí#*É�Í{ñ¸. [K¼Xh"ÒVOo¿£"4Óe¢ àH}³TŠ@x4ƒ[߸µÚê¶C²pV�[Ã3. € € € �”ÀÏ~³O:{†’:÷ô“Ìêí…ÜN?�ï@@@�P ÄT^û‹Gu±»YÖ’ÙÕò‘›×†Ò‡IûC`N‹užîÐ%ܽºŠµTpwqm"1=n#eC<%@‚»§–ƒ`@@ ¨Z·¾qé¡°fQ�TU»4:Ã"€ € € €É |ó'Û“;ñ¬³êÊxKü,~D@@^ØÑ¡ÛV¸./‰Ê—>p‰˜U²ÙðªÀlÛw¯FM\ñ±Š¸ø0Ð"rµ\ôghH,À»ù‰]Ø‹. 4oxßl5t›KÇ~Ø+Ö¶„Þ@@@ð¶À¾£}òëg�8²²X“‚<ÇÍh€ € €„BàP¯!=ƒöÕ­ÿõ®vi®+ …“ô¯Üý¹v##£Ò\SèÏàµn—ªi¨¢¤l €€wHp÷ÎZ ˜šÖ„{ËæÕ¹78##€ € € €I|ó'/ŠúÐ-‰3Ï<¥¡œÏèÎá'@@@àe�“ÆìëÖm9nÃrÙ´Š‚i¶Hô„€]‚ûð˜'B$ �u$¸[Ðd|·z×lzsû�³2> €Hpw€Å© �͸8 £0D�¢hŽÌ›^“à»@@@@oŒÇtùÎÃ;Í1+¸³!€ € €œ)0Ù~Ô>¹ý¢åMrç›VœÙ�Ÿð¨Àœ–JËÈFÆ�_0oÙÒ.P’oÿ»(íÒáš¡o=c? €. �àîò0<œ! ‰!ígìᇬ \½¾M ÌO{Ù@@@@� <ðøééq]}y„{,;V£ € €]ÀLõÝÞ¡ËxÜz¦�ÕÅòÙ¿Þ(9.¶V∗JŠò¤´8?aHêºyIá¦p ûbgú‡$/‡ß5é—M®GÃ0HpOŽŠ³@ K$¸g ša@`r�–M·ÍTg5M~&gdB }ô™p¥O@@@HŸÀ7Üî¸3ócѺ2>u G@@¼À¡Cú†­+ZçæFä ¸D¦•Þ‚ KÀî1k&¹³yS �ËÜæo†¨4Ù r7ù¤aXk戀Oø…ä“…"LB!“‹C1O�Nrñì�FFX € € € €€È޽ò‡;SL+Ñ$Ÿ›Ö9v£ € €[ Ä�Çí3}ï~çY>¯6ØÌ.�•¥QËyÙݱÀ²²&Ð0-/kc1Ð9•M�/9g/;@—Hpw ža@à\CÓÚÏÝËžl´ÕK[ã´l Å € € € €@JßxðÅ”n#ÞPNõö”Ài„ € €�ˆ«¼ö—:t±®Ý.òšöYòÖ+Ö€‰[À¶‚{Üî‘l?Ì.Wb~3°1j:ÅI»¸L  �àîÃE#d*`~ÒHw—÷µÏ�Ïz]ÒgX@@@˜L`x4&ß{t×d§�s¼@ýª(âM�s`Ø� € €¡ØÝ©Ëȸ5Á¬ærùÄ­ëù Ùšˆ#¨,£‚»Ç—È2¼��!©(¡Š»%PÆDÈÝʸ1 €@²$¸'+Åy �Q�¶ ·NW´ft:·X½¨Þò@@@@·îl·ôŽ9£¾œ·À£Ñ@@-ÐÕoH§ú²Úrs#òÙ¿Þ$ÅæÃløTÀ®‚ûxܧ“ M؆Ìm*Íl½7QcƒŠ‰jÞ["B ”¼»ÊegÒxO@�h\èÒ²DÔ_‚3k\�a@@@@�ɾù“퓟tÖæÝêêÊø<î,~D@@� ˜UÛw©êívÛþâ|Y<«ÊîŽ!ày�ÊÒËcöÿ X¶ã@ö¦•�Ò˜=ísFªnÝxçÂsö²pA€¿. 3$$ÐÚíe_æÖ.®“ª ®~ͼ4# € € € €@*Û÷õÈs»º7­*Ö$/Çq3 € € €�0TÑö—:t‰Û$÷^´¼IÞùšÅ�œ?“ —@e™u‚ûxÜúáRòîlcc#b.`sGÀˆÇÛÝ™Q@�3Hp?ÓƒŸ@À%Ý*¸»dÅÚV—FfX@@@@`r�o?¼CÌD §ÕÛ�Šq> € €Yà`�.ý#Ö/®¦©„à¹ób‰�Uä‡AhæVYµœk,nyˆ•–š"�DÂ04r¸B¸êLO �àîÉe!(Â%аé½mêÂËéášµwf»l^­w‚!@@@@à4�˜*-øýGw�¶'¹oósE*Š(õ•œg!€ € €@Ðú† 9Ðc�ÜnÎÿÿ»ý"©�FBiÐ a™ŸyÁ†Õ6N‚»�§öϨ³^COÀ` ÑÌ"¥¼±ÀµeJøM€w¿­ñ"@�H,×|bÄæ‚@Q4GæM¯qad†D@@@&xäɃrüäÈä'žuFm©Æ­¬Ï2áG@@§@Ly©CýÇf{Ë dËê6›38„€¿*K©àî¯;7Ú¢|ûß[ç¶`OúŒÚÆö[祯?zBR Á=57Z!€@4Í Á=�žNººæ¢6‰š%ÍØ@@@@ ÜûÐŽ”¢ª+ã­ï”àh„ € €�ØÝ©ËhÌzZsZ+äƒïXm}Gð¡€mwÝðáŒÂòÐà�äåòþŽ[+¯éUÜÝžq@� þ ð@@/´{!ˆ0Æpñò¦0N›9#€ € € €€ºO Ë£Otii�&…ùŽ›Ñ@@œ@W¿!æ—Õf&�~îo6Ia”¢hVFì÷§@eY�eàãqËCð�@<—yÍÅŠ(\¡hZ„b¥áZrf‹€'Hp÷ä²áhÜðþ5ۙᙱ·fºxv�·"@@@@àÏßt—ÄbÎoG]W¦aˆ € €„^`L%ñšÕÛí¶¿û²`ú4»S8†€/Ì‹7J óÆSÿoX_ö‘° ;]h¨L¼†.…²a�v5aÞd Ùª3]¼&@‚»×V„x™@$çŠ?—Ö|FC‰´5òf…Kü ‹ € € €“ÜûÐŽIÎ8÷pD}ìVSÊgoçʰ@@Â&°G%·Û]3ܾ²YþÇ5‹ÂÆÂ|C$PaSÅ]gó�@Ä÷A”� ±¡yÃûfvvL |!@‚»/–‰ °€a�àîÒò¾fÃ Ñø¼×%}†E@@@;�gwvÉŽ½v§$#€€)À[ý<@Àe�‰[Ú¸C8‡¿`Q]8'ά@@@@Àó©To7'U[ÆÕüž_\D@@�Œ ÄTeêݪz»Ýö©Û7HuE¡Ý)CÀ÷v9ì¼{àŸå�Û\ìŸ`ƒ©A‚{Ж”ù à7Üý¶bÄ‹@€Z.¼µQDãv6.¬iDýö_4«Ö…‘@@@°�˹Çþ¤G£¹"E|D�€†] € € "�=]º¨—U–ÛugË– Z-�s� èºMŠ;oøf™§“ÞèÞbfwþoqo�Ð ð ôpQ WãV6.ñ_¸¸^*Ë‹\�a@@@@k�Ÿýv¿œµ>ÁâHÕÛ-dØ� € €aè4¤³ß:©×¬Ú~÷ÍkÃÂÁì�æ� € € €€—̼öï>²ÓqHê:~™V¢9nG@@@Àï»;í³vÿñ/×J®ù¢‰ �� X]LÏ» þ}` I~¿ß\ZÁy3.¹½Î¥±B*Àoü�.<ÓFÀ-�ˆèkÝ;ìã¶/k ;óG@@@� üú¹#r¨sÀqT5¥šDøDÚ± @@@Àß�}†ô�X'¸_¾nº\´¬Éß“$zÒ$`X•pçý„4 g¿]×evcqöfÄ �˜n¬�Ȧ@n6c,@@½Ô&ÁÝ¥‡Á¢ÙÕ.�̰ € € € €@b�o?´#ñ�IöÖ•ñiô$DF@@�€ Ät‘½Ýê?[4?G>ôNr-x»Û¼hü�Û�ÉSÛ;åŽ=26—¦ÚR™ÙT& ¦O“�«Z¤0Îô°ñxâÿ_xGÁßÿ;4TæÉ¶ýþžƒ_£7 ÍÌùºß¯ñ7øO œÏ`ü·NDŒ@�Hpwa5s#™ÓZåÂÈ ‰ € € €$�ÉÏ~»/ñA›½…ù"%|mCÄ!@@ ÀÁ㺨ÜeËíÖ—Ism‰åqGÀP•òÄ^ù×{Ÿ‘ö?gbf²û©­´8_Þÿ¦ò¶«JnNäÔîÀÿ;82.£c‰ÿ‡É C ×9?'ñ… �œ¬×&Ew¯­ñ xþd~‰™ ÞhÜðþ ÷CsaIÚWÔKqQÔ…‘@@@H,ð³ßì—¡‘Xâƒ6{kJy[Û†‡C € € @�¡1‘#'UV³ÅÖRW*·\¿Äâ(»ƒ$ð›ç�Ê5u¿üåÇI˜Ü~ö\ûÇä#_þ­\óþ&uþÙíýúswï°eèy¹\4o‰ãƒCƒƒ’—ú²Tšœ/íwSPÙ|E œ|ÎugÖ¸" IŒêí®È‹lZÅu.Ñ3, € € €XÜ÷Ø.‹#ö»kJùÓ^ˆ£ € € 4�=]º˜U»­¶»ßµF òÉ9´ò Âþý£ò®�=,¯ûÀ�å™]ާôüînyí_ÿHžxî¨ã¶~lÐ}rÄ2ì¼ËCð�@<®Ë¬FîVáÒR5êǹšÊ%|†E Œ$¸‡qÕ™3. DD#ÁÝ%ûųª]™a@@@@�szÕó�=}øÜ“ì))Ф0o’“8Œ € €H {À�CÖÙíí+›eËê¶Í˜©œ-°}_�\qÇ}òÓßì;û�£Ÿ‡GcªòûÃrðX¿£v~<¹û„u÷|Üý¸¤gÄÜTÅ›Cg€dñ‡-BîW½ �° �àöGóG ‹†<ÉÉ¢÷©¡r#™ÓF‚û)þE@@@÷x|�Äbºã@j©ÞîØŒ €@ªf•Øñ¸ÈИHÿˆñÊ×€ú~`Ô�Á? �ç «óFÆERøõžjˆ´C@ ðæßãýÝÖ¯�rs#ò‘›×ŠÆ�®ûXxð×{åÚ»~˜¶¤t³ü;þé!‰ÖÌœXW¯u‚{7;ðýÚGs¬/ú~rŸ€ÊýZãñ $ÀŸì-&SAÀËÓÛßV3d…—c jl–ÕKIQ4¨Óc^ € € € àC�û~±;¥¨«KÈÚH ŽF €Ài13i}Ü�—Ò�‰$vsŸ™Ìn&§ÇâÆÄ¿ñ)äŒDÔ¯ëË©‹ÕϹ*!ž @DÌ¿§z¬¯8«›V$ï{Ãr¨(ðü®nyÿ¿üR¶«Dôd6óµ²ydz’õ\J=ÇTÏÿŽžÐ'î®cÕþÛï�¿¼n‰Ìm­´:Å×û»NXWp7/¼dó·@<—™õŲãЀ¿'âËèµÙ�íU}äŸîöeø�¾àã_-Á"à_�ÑÖªÛÔøw>Ž|ÉìGOè € € € 4�ûÛ­5œ¿OT£>¬gCH,0¦’Öû‡ éQ_*—g`T½#ïüWmâÎ3´×¬߯âí1x5X3A«4ªI¹º°©¢èåä÷ …@· €xZàè CÆÔcVÛß¼u•”RcÎÊÇ�ûÇÔ-u>óŸ”{¾÷œÄÍ+&ÙÌdöæii¬ÐļƒÎ©Í|ÕXž#Û;t9>`ÝÏç¿û¬üËûÛO5 Ô¿ÇmÜÍ» ±ù_ ¹*_%¸û~œ�ª�¿FÅý€c'fð—²ýµ^D‹€oÔ[ék}¼��¨´sÛª|<BG@@@�  Ü÷‹]ާ¤©ê«JNû´Þq4@‚#`¦( ©v31¼ïÏIí#ªR{P63‘︪ü~|ðåd¬»¹B®Û8Û¦ùMà™]ªjûc²óÀ‰¤B7ŸÍ«�ˆù\)Ñf¾Ž6�?HŸ¸¨0Ñ9÷ýb·ÜuÓJi®+MtØ×ûì*¸[™ùzÂ! ¾ ×úwd9²ù�?È¿ÿ|Òw;kªÔdzUdÒçAfU÷ù ùþx»û˜Uâ¿ðƒç壷¬ó½ãÙè¶©àžŸÃȳ½üøóÐаú=¨j‰Ç­ïRàÇyù!fÍÐÈóÃB#àÙn‘) àu�Æõ··¨½gã»deS§Åœ@@@@À§fu8#…ÏkJùðÙ§KNØ 0³*û‘†üé°.¿Û——:téV îaJnOÄgºë3ä…#Êeo\vuêrB%ý§ðç%Q÷ìC@Àuóâ.ó9€ÕvÞœj¹|Ý «Ãì÷‘ÀèX\þÇG’{¾÷\RÉífºY•}FõäÉí§¢ªôi­Íkêï>¼SÆÌ]À6*¸lAL'‹Éôú¢GØ•yã¹ñF‹ûGd~tF@�ðPÁ=S%²Ïl®óßJU™=Ó›™_U^0ñ5ßb°ž¾Ù¾O%»ïëQ ïêK}ÿ’úwhDeöMq3“ör¨'>‘ÌÕP¡Iy!O¦ÈJs@�,8®‹ù<ÁjûÛ·®J9ÉÙªOögW`<¦Ë-Ÿø¹<üû“\ªîJcVm/ÊŸúó˜*ug4Ë÷§ʇ޹zÒxürB·º¸ÒjËÏ™º¥UßìϾÀðÐðÄ�¦²q÷¨ìÏÎÛ#¢™¹`_òv”D‡~ ÁÝï+Hüx\`zûÛ b†,÷x˜� oóªàÜB,� Ĥ@@@‘€ùAã�ïu<ã¼!!ѱ @ÀËêBû±“úDÅö±xú"Í͉Èb•Ì~þÂ:Y¹ NV©¯ºiEé =™Uã×�×0ñuª{óïÅŸvwËãÏ‘_?wDž|ᘌ˜%îSÜÌüÀnU©Ôü*ŽjÒP®I­ªìÎ�AR¥ €@F†ÆÔóuW«íÒ5m²|^­Õaöû@ ¦’Ûßý‰Gä¡ßí·�Ö|®ÒZ‘&u‘ÞnªsÆ•*ÁÝjÛuð„ê�æÚ«S|µ¿KÝ9Èj3ßg` ŽÀx,&Óë‹d÷‘ÁàLÊ'3Ñd–½í=@IDAT¢‚»O¢%Lð« î~]9âFÀ'czÙ õâ+Ï'á*ÌE3«5&ƒ € € €þxü™ÃÒmó³ÕÌÌêíéú0ßj ö#€™0«°šÕ2�ž4ää°uÒš“8Š òd­J7Ùͯ¥s«¥ ßÿûå¨–Ω™øzï�Kel<.Omï”_?«ÞÕ×Ó/uJªÕG ÙÕiȾã"õ*ɽ¡""Qÿ“9yØp. €€ÇÌêíV›ùºèoTõv6ÿ ˜ÉíïùäÏåg¿µOnÏW Ø‹›#i©Ú~º–™Ø]¢.øPωm�ýñ�Üt™Õ½wµðî¾ã'mÜyþçÝ…K1²–ª( î)ÚM±ÙüæµwN;ô›ÏôL±š#€–üÙ¶¤á¤C GÝ’&37WMGtÁîcfKe°'Èì@@@@À7÷ýbwJ±š îl €€_T1ò‰Jí‡zuQ•Û§ºÕWË–Õ­bVo]»¤AòCP~Òœ£9Wóë®7¯”�¡qyäÉrÿ/÷È£O3QÌéS•óõr¸7.uª¢{Ë4Ý�r> €@ú†Æ^¾ãˆUÏ×oœ#s[ùü×ÊÇëûÍ ïü—Çä'Oì³ Õ|z·¸9G%·Ûž–òÁÊbQ ¿°G]�­«×:Á=?‡÷²Ì¯L£0?ñE¯œÀ7™ˆÆ/P�ÿ4sÐ3„]€÷°?˜?PÉík3<Ý'˜ÑP"uU¥ ް @@@È®ÀèX\~úÛ}ŽUʼn¥´€žÃÑ\ˆ«œk³Zû•Ø®~Ni[0}šlU ífRûâYÕ¡¿«EIQž\{ñ¬‰¯“*;ˬ€úC•ìnÞ)Äiew3 ¦C­Ó±¾¸Ô›‰î• @ü)=ÞhŒ àž€yñ•Õ–›‘¿ºi…Õaöû@àë?Þ&“]øm&·/É`r»ÉT^¨ÉAIüXÛyà„$“ Ñîr!¸F49¤�52<$u› ݼ’„-»†fæ„‘àž]uFC T$¸‡j¹™,YP÷�ܳÎ.²õ‚fFeH@@@@à\�‡~`¢âî¹Gì÷P½ÝÞ‡£ à=�q•Ì~ä„.GO’BañW&tÞœj¹nãlÙººMZê(dò ÌYß”—Dåu›çN|?9">±Wîl·üîOg�iÿ£™c®Ù±“qi¨Ð¤Y%º“ødoÆQ@�ô ŒÆDºú­3ß|Ù|iæ9AzѳØÛ¶½=òO_ù�íˆ/'·G2V¹ýÔàEùÖ‘ï<Ø{ê4ßÿÛuº‚{™r¾_ß³'0>“Öº"Ù×1xö!~θ€±&ãC0„Z€?Û¡^~&�@f×ßÞ"b4fvzO$°lnM¢ÝìC@@@².pß/v¥4fMi$¥v4B²-`&¥RÕÚ�©jàºunšmXf²öõ›f˶γj;›3�ªòyËå &¾v:!_{`›|çá24¢'ÉÍ\»Ãªzn‡JtoT‰îM*Ñ]ÌeC@ ã‡Õó«ÂÃfõö÷Þ¸4ã10@fÌç"ïù_�Șy%¤Å–«*·/n2“Û­“Ï-š:ÞmÞ­Æ|~“èbLó‚AóË|^å÷íб~Ë)ä+o¶à 4WEIpweYµÕ"w«ß*w«û˜±!€é Á=ý¦ôˆȉÈÚßËÇpŠsZ+§ØÍ@@@@�© ôŽÉ£OrÜQqTËxå:ÇAÑ8K ®>Â?¨Òލ¤èTÛ×/m”7^:O.]3]¢dÛœ%œÚ�³›+䣷¬“¿}Ë*ùö#;äk?Ú&ûŽö%ÝÙĺöªª{\Úª#R_nÞ¬– @�ÌÄTÞs‡ºHÎj»^ÝÕ¥¾ªØê0û=.ð¡/>!»�´ŒÒLn_¢’ÛÍ×ÀÙÚ U"}ÿHâÇœYŽª¼![¡ddób‘OXö]�—=kË 8�v�Rÿ_—‘v“ìth”·^t|þ�_ɶìŒÇ( 6ÜöâÌ�, c­$~]”Å(Â7”ù!Èô&*ü„oå™1 € € €Þøñ¯÷ÚVª³Š¸¦”œ­lØ�î ˜I3}†8®‹M1NË@Í$µ×m™+¯ßÐOe#Á=5Ú €@6z ÙÛ­Ëp ùsZ+ä=7,•×l˜%¹¹ê.îlYˆ¨ìÀM«Z&¾v:!ÿ翞3á̼P!™m`Ô�g•ܧWEĬ´Ê† €@:Ì»†9¡þc±™wx1ïLÂæ?�ýêî1÷ÙÇmo�¦Iyaö/ +RÜÅ¢RáþŽäïzc;9î´©ÞþòÜ] Ž¡3&044,%…¹20ËØtl! kÔ‘¯Xe7 0%2 §ÄGc°X¹òæ¼c"K­Ž³?sëΫË\çôŒ € € €$)ÐÙ3$¿}þh’g¿zšù”w®_á;ð„€™ä¼·Ë�“ÃIfEŸõòyµrë�KeóêV1“­ÙÜ0“ÿí®�rÛë–ɧ¿õGyPÝi$Ù­CUØíˆ‹™ä^_Î:&ëÆy €ÖÇÔabqëãï¹�êíÖ:Þ=2®nóÞO>ªmÇ-ƒ,S¯{[¦¹sÁc4Ï2,ééµ>è“#;ôZFZ¨ª×³W`VC±<»çdp'èÙ™?õìÚþàcÿ¯!3@À“eÑ…š.QOð Ψ ø ™ € € €øAàþ_î<”êí~X]bD <c*él_—.�ýΟmXÞ$·ªDê5‹„¼vo=fæ¶VÊ?p‰üi÷q•èþ”<üûIh&!îêÔåXŸ&³j5)‰’èž'!€œ#`ÞIäp¯uõöµKļHŽÍŸúÆäÙ�]–�›7ò™WqíùažÍÝhzN[Æí—;œ° • î–4�8P]fóàÄ ½: máÌÍ7—ïyøK\]àÕ%".|,@‚»��Ðð²@$.+ Þ×ue‰f6Wº2.ƒ"€ € € €§ ÜÿØîÓLê{3´º„7•’Ââ$ȸ€YUu¯JnWE8“ÞÌßcW^8CÞ£*¶/™U�t;NtG`ñ¬*ù÷m•§_ê”O}ó)ùÕÓ‡“ ¤Ä�gÒª*¯6OÓ„¿\I±q €Ài]†ŒÆNÛqÖ·ïUÏ%Øü'ðü®nùÂ÷Ÿ³ |ŽJnwó®ey9ÖÏ\QÁý ]‚»íÒpÐçù/Ü|>W�…¯ÅÆ /P1=䱸 @‚{‘) àE]ÓVZ¿,òbÄÁˆiFC‰ÔV•c2Ì@@@|+pèX¿<·Ëºb�ÕÄ*ÔmÚs)¸eÅÃ~È’ÀÈøËUºO 9«Ú¾~i£üÃ;VË¢™Üe3KK•¶aÌ ¹ÿùO—ËãÏ‘Þó„ì:d�ujP³òîþãºôi2·."y§Žð/ €“ ê±~ža>—ذ¼yòN8ÃSæsƒé7bþkµ5ThRUìn&…m÷¾«Ð}³çÁ^ËX©ànIˆ##ÃQWëvÿb¦Þ›„!Æ îÞ["BÀ÷êÆ7l €@úÔK²éï•'ØzotLfÄq@@@ȼÀ�½ÏöC}«ª¨ÞnEÃ~È‚€™q¸×�?î�‹“äö9­òw_*ÿùÑ+HnÏÂ:eró"…ÿþìuò�·�/…I–Ví6äéq1+þ³!€ �Œ@Ï !CcÖ7ÞsÃybÞ†Í_?úÕnyrÛ1Ë ‹£šÌ¨v?M+×&„ã'‡-ã÷Ã�• üdâ$ý5ï|ÊÀúaSŽq|<&Í5…)·§aêê/š™àΆ¤]ÀæiKÚÇ¢C‹@ûÝæËî™æÂz/›[㨠‰ € € €œ)ðà{ÏÜ‘äO$¸' Åi �v�ÁQCž=¨ËÞn]UüK®ûêŠBùÄ­ëå¿ÿí:Ù¸ª…D´äØ<VžÊúzÏ KåÑ/Ü —¯›žT¼q]dç1]^<ªK,žTNB±€yA�ÕÖRW*W\8Ãê0û=*0<“�~õ÷–ÑEÔ óë#ªº´å)Y;`^Ýv´¾ ÕÛ}º¨Ãn®Ž:lÁéi jš éÎ ÁýL~B�4´HÏ|Õ —E¦ÁÒisZ+�6á|@@@@ ­Çå™—º÷Y^¨‰Ý­ÒwH@ 3™}ßq]ž9 Ë€JrOf+P¥oÃrùÕ—_'7]6_%ñq[2n~;§©¦D¾ô÷›å¹LÚÊ’ ÿø€º€ªæÞ;”Üc)©N9 @ Pfåö“êîVÛ»¯?�çV8ÞÏ÷ž“£Ýƒ–6WjR˜oy8ëì^{÷ª*è~Ýv°Kp÷묈ۉ@™zo‰Í�ú¶‹îhpedE�@ ðŽ[ ——É!àŽ€®ËJwF÷¨Ñü™Þ4-ÜÌ@@@\øÉûTõcë„ ««KøÒʆý ��¡1™¨Ú~¨Ç�dk½¦}–üòK7Ê]o^)%…y™ Œ^=%о²YùÜõòþ7­H*áp,&òÂa]ö« 'Ø@8[àèIëgæÝanÜ<çì&üìq�Ã]òùï>ke4W¤yš·Ò³rÌ2îÛè¸oG³ó`¯Å¬D¨ànI¨F\½ÈcsE ®éË]˜A@ ÐÞzhj&‡@x4MãÖ3.,wû²‰ªÊAl € € € €€›þz_JÃW‘àž’�@ 5�c}†ªÚ—Á$«¶›Õ¼ÿãîKåßîÚ( ÕÅ© J+ß ˜fîT î?üô52»¹"©yTNl;¢Kœ<÷¤¼8 ƒ€ù7¡S=±ÚÞ|ù|1ïÃæ/��}õ÷2:f�>£:"ë|rW&k“ß®ž»X?F] ÖÁ ;RÁÝW O‘ₜ@ÎÍë“Ò"¹b^_$âCÀ‡$¸ûpѯ hÜÝX£uçÕ¹1,c"€ € € €¯tŸ–'·u¼òs²ß˜·�&�#Y-ÎC�©˜‰e/uè²ó˜®î61yOfòÏÿ¸f‘<üùëe㪖ÉpF –Ì®–ÿÏkä/®Z˜Ô<{Õ…ã2L!ɤ¼8 º@W¿ayáSŽÊ€~Ó¥óƒN¸ùýþ…ùѯöXÎË|­[]ê±ìv­]D1_�·ó€u‚{a¾Ý¬-—�¾0dfC‘ï¢BÀ†A1Ô ¬#s@Àk$¸{mEˆ¿ ÜxcŽ¡ÜvÆ…u\8£Ê…Q@@@xUà§¿ÙŸRµ7ª·¿jÈw �9��CžVUÛÍä²d¶9­òƒO]#¹y­”æ%Ó„sB PÍ•�Þ²n¢¢Meá¤36“ÛÍ$÷^•ìΆ n�Ž“Ö ¶üÿìÝœ\Wyðÿgfgwgûl/ZiW²$«K¶l«Ç’&´@*�„@(ñ N{I�@éy!=!$oHþy¿È‚1`ÀE²lÙ’­.Ë’%K+iµÚÕö6;å=G¶lßswê�[~çó‘%ßsï)ß3;;å9ÏÝÔÃ]b<öðЙÎ?õ÷»lG½¤Õ¥AÕ6ÃJe² ÔvÖ¥©ŸŒKÿФeç:ƒ~”—ó–6~<ØÚÀb—h]Éà^"xºEÀϸûyu™%è¹°`¹ê–í�%°_ÒÝX‚^é@@@xYàþÇN¾ü?Yü«¥ÖæÛõ,ÚáT@À$pv$-ûúR23g:ãåã‘HX~姯—¾ð6Ù¸¢íå þ…ÀU:£ÿƒõyýæž«ŽZÿS'B=t.%}—Ì��ÖWr@À/ãj£ÝĬù÷ÀϽq¥_¦˜yüçw�ÉÁCÆùv4„¤¶Ò�ïuíF•Hš§ÆÉº âxŸ9{{5ÙÛ]°BÎ ¡²L½ø¦”B gÁí!3g)äé àîãÅej”B No,E¿AïsIW�´5×��ù#€ € € €@ F'fe×�óY� 6• —‚E`.)rXŸ¼˜’t±:ë—µÊw¾øv¹W¸W”—eL4ê�¦ú¨üÃ'î�?þ·HeÅü�—SC)9z>%MŒêŸ…c& €@ ÎÛdoïí¬—›7t•`Tt™«@\½ÈüÓÛc¼¼LEcõ4»7$+dážÔ;ós:)—&3ˆlW]èëä¿þøÍ²lQ¬°¡5_ èà™Ÿ¼óZùÚ½YºZjæ�ëàDZžMI¿2çm›@Ü)�PîÇͯGÞ­²·‡‰ÆtçâFuß÷ž“ —¦ µ"‹šÂâæ½’6ñí’ôèN¼c§‡�ëAw#�/+âñ9éj®òåÜÜ>©pZpwû"1><&@€»ÇŒá"àvõ¶œ î%X¤ë®m-A¯t‰ € € €¼,ðÍ�'_þŸ,þÕ\k÷Õz q* p•€jßß—’ÙÄU ÿlnˆÊ¿~æ.ù­Ÿ¿I"¾:30qx�µK[ä›ÿë­rÓêŽyΛNËõøŒgðøœ·1N@p½À…±´ñîúŽ1ïüÑ実|Y ¡2œÿõÿÝ÷ò�Wý«ª\¤+æî÷¹vû)ôü¼XŽÛdp¯&ƒ»—4¯1/j�æu=ç&�–IQs£ã*0ð)�†Ã �‹À§õs »ñr¡Ëóš¥ ól�Ë@@@@�Ü&¦æäÑgÎeÝ@MeHô—ÿ@ �}Ãi9|.¥²OÎßêëÖwÉwþâírëõÜ%s~-ΘO %V%ÿçso”Ÿ{ÓªùN}‡�ý}I™™›÷TN@ð¸ÀùQó‹’»e‰4ÖUz|†Áþ7}^N÷�'ÝÓ»rã….©H›o6à’ZãØéë u” îFßV4T»{“‰_á•:î~]\æ…@‰p/<Ý"àG�¯»¸TÍ«Î�ssóœ*+Êdq7în^#Ɔ € € €€ßÜ}Zâsɬ§Iöö¬É¸lR*çØ…”œ4‘½xyY8$¿ñs7È¿~ö ÒÖTýâaþF o�ru€Ï}h«üÑ=·Ì{GÜ®ƒÜu°;@ÀŸ#SiÛÍLï~ãJNܧ³J©èï¿üOsöv�)¼Åw)Ó¯›M¥ª2bªríñiuÛ¦¾ëMz³A”�õ®]»b ,�di±lçiwùÒM÷ÔÏsÕ €@ƸgLʼn 0Ÿ@¸,¼q¾s¨/¼Àöë;¥¢Ü{o2 /A‹ € € € P*�û;™S×-µ9]ÆE €Àkô›})³‰ÖùáU Zkå¾?¸[îy×Ñ�îŠ!ðS¯¿Vîûü›¤µ±Ê¶ùxâÊcw|fþÇ®mCT"€¸Ràü¨ùù}õ’f¹îÚ6WŽ›AY |÷‰Órìô°u¥:ÚÝä�0,»;E+ËŒóskʼn¾Q1ež¯*y:£¾[ÍÝ>®ÉÉi©òàcÙí®™Œo6*ë39�s@�L¼ñÊ*“™p”\ �q«™¬Â–5í%è•.@@@@�+:SÚC{ú²æ¨R™í¸MxÖl\€:ûõ3§“’I€ð­×wË_|›Ü¸ŠÏU-(9T`�V¶Ë7þì-²dAƒmË uÓ½AcXeù¥ €øG@oÀ»4a~nÿ¹7­$ðÖCË­¨ÿâ?ž1ŽXg oõ@öv=¿ep?p|и.:«>%ˆiYÒÉ�ºJ±òÄŽ•B�>ð¯îþ][f†€ó!!ƒ»óêrmOS z¥K@@@@àŠÀ÷Ÿ:#:È=Ûâ…Û¶g;'ÎGçt@ð~œÉÓÐ/¾e�üó§î”X]¥ó¥ÇÀ è;|õ�Þ,k¯i±5Ð�f‡Ï¥d„ w['*@/ \O‹)¼½¶º\ÞzëR/M'ðcݱï¬ì{î¢Ñ¡»1ì™ )›÷ªJïÝ=þ©#ŒëRSÉ›Œ8>¯hoP»N(Ž „Bi’£:®N‡øW€wÿ®-3CÀiõ®€ îN£ëþuÚg~)Řè@@@‚#pÿÎS9M¶Ù#™írš!€€#ƒ*#ªNªì×v%R–?ºçùÔû7‹þ7§š¢òŸŸ“l^Ói۵Π«ÓcÓ¦pHÛË©Dp™À€ p7•wܶLª£Þ $6Í'Çí²·W¨¥l«÷N uÒüп¸×EƒðèdŽVшÍÝêŽD -áë Ò� €J€Oñx €@AÞvÏ‘4‘ÖÑ̼‘:µ³¿«­>ó 8@@@( @|.)ßòtÖ-ê[·×’E-k7.@�—úGÓrô|Jt@°]iTÙÚÿýso�Ÿzýµv§Q‡@Ñt¦ÞýÌ]rǦÛ¾tBÕC*È}bvž·m+T"€”Z`:.21c~.çíËJ=DúÏB@gßuà¼ñб°„½ß.6 Ü¥²¢Ì8O7V �ÎÈógG-‡¦—¤.ê¡…±œs˜�™öÌ]r�£;¯K¯êÞro•;ÇÆ¨@Àk¸{mÅ/.H%B]:4_kûõ]Ræ©Ü׋Ìä@@@p±ÀÃOŸ•‰é¹¬GHöö¬É¸®èNËñ�yÒ¶«ó—-ŠÉÿù[çÍš}UÓü�¢ 耱¿ÿ­Ûe¾ F}W‚CgS2¥‚#) €Þ7¿VY² AÖ-mõæÄ:꿺oŸqæõu}Gƒ·‚¨S†‡§~­yk.{�^0®M�ÚXÏ œŒ<¾¯˜�ÏI{#)üK°ÐeI¬-A¿t‰> *Ò‡‹Ê”(…@(º¾ý½Ï�×¶�€ù#€ € € €@ îßq2§Þ[j½õ…yN“ä"(ŠÀ©¡”œ4Dä\Õãm7,”¯ÿÉ[dQGÝUGù'¥ˆ¨(«?ùØ�ÈûߺÆv0ê&)rðlRf²ßGfÛ.• €Î\7goûö¥dvf ÒË‘S—äÁݧ�mu5†=DmÊà^U1ÎÓ­O6¸×‘CÚ­ËæØ¸µàîöU¥Ëˆ!»Šƒ"€@¸ç�Ç¥ ð²@(�&ƒûËŽýkù¢FÇú¢#@@@@àj�„J/û]›/ù¯>÷êëï˹EøÕ"ü28¡²¶÷]2‹½ØÎû~l�|ùwî”Úêòñ7®ЙQ?ù¾Íò‹o±r�'®¹ë¿) €Þ›NÛnPzÛ¶¥Þ™ #•ÿý߇� :;x—Dz·ë;ŘŠÜŸ:bp¯�²¹Þ´ÖA9«. ÊT]5OCF’TW­ƒAÀ»¸{wí9n©¯xqR‚YÔÕP‚^é@@@ٹNÌfMÑLöö¬Í¸�  ¤ÕÐÏö§äüèüÁí¿ñîäSï߬²hÌôÇ�Ûç¯bÜåw~q³üÄËm‡ª3¸ëLî ›`4Û¨Dp\`À&{û�«Ú¹ÃŒã+’{‡Ssòµ‡ŽèTÁí�ÅÏê»Ä˜J]u…©Ê•Çãj2ûž4Ž­¾Š÷Fœ€T” ;EK³Ôdp/�;½"à?Üý·¦ÌÇz·}¬GuÚäxÇï°¦ª\´àð‡ÓG@@@ d÷ï<•S߸çÄÆEV@·UÁímÅ^Äù½n•{~bƒèÀa ^Ð�Õ?¼ç¹ûu‹m‡;W?çS¢( €îH©çêA›×-oÛNövw¯à+G§ƒÛ§f¬dõïñ®˜÷®â ó ŠŽæêW¸üÿœänUôÝãôJ°fffxXš‡ÀÚ�?À-ÕJcO¯øJÀ{¯´|ÅÏdð‡@"•${{ –òÖë:¤LßóŒ‚ € € €8,�Rvß~üTÖ½–«ÌvdPËš� ¬€½9v!%Cæ �£³µáW·É{î^X+&î]ýøýâ¯m—í7,´�ÄÈTZN’ÆÝ‰J@ÀÓiã]7"‘°ÚÔ´Ä£d™è�eÿrÿã©zóv…¨ãÖñà—çÙÞä­÷§_0®OÙÛ�6Aª˜›KH{¬2HSvË\+úë+yƒî–Õ`xX€ÈH/CGÀ-jgòF·Œ%Hã¸áÚÖ M—¹"€ € € €€‹?Ð/C£3Y�H�X9k6.@ °ÇUpû|™Û+ÔΙøÄ�ÊÛɆØÇ‰&^®ÿî7o—Mk:l§sn$-Æì7|Ø6@% €@Ñl²·ß®635ÖhYôE(P{Ž^�£§.[ëlðæ»Û¸uBúËóôZ€û“‡û�ëSõæú'DEÎÝ­U9_Ë…¹ „S!’¥æÎÇ• ðCÜy( €@Þi mÈ»ÈZ`yOcÖ×p € € € P�v�Ê©™àNA28q15o oM´\¾ò»wÉ›z2i’spµ@UeDþùw^/떵؎óø@JÆfr·E¢(‘@BÝhã’Êàn*lÈ3ɸóø¿~Ëœ½½ªB¤Á£Âã óc´½¹Æ�‹a1*�aÏÑ‹š+‡ê‰i6Ú­¢±†ðÈR¬y:�&À½ðô‰€Ïx÷Ù‚2J$°¦DýºÛžÎ†@ÏŸÉ#€ € € €@éÜ}:ëÎËÔ§Ñõ Èz²\€y œLÉy•©Ú®ÄTöÓÿøüeëºN»Ó¨CÀSµÕW6m,ê¨3Ž[s9—’Y›ì«Æ‹©@(ªÀ ÊÞ®Ÿ§­J]M…Ü~ã"«*޹P`x|V¾ñèIãÈ:¼ne—Á½­Ñ;Qá/ô�ÉàÈ´åéÏj*Ø`o‰Àƒ‘°Ú}Dq^ DwçÑéÿ x÷—ÿÖ‚!àI�¥›î©Wç�¸Ã«­,“ýÒ € € € rìô°œ¹0ž5E¬:$a¾_ÎÚ� šÀ™Kié6D†ý£Q·ß÷ù7Éúe­Aãa¾hª�Ê—?y§è;˜Ê\òJ�{ÊþGÅt9Ç@Š$pQ¸›Êݯ[,•e¦jŽ»Là¾�I\ÿµ(ú}m[½wßÜÆ­§uy¦^Êàþäá «såP]4$!ï.‘q^Tä&07;›Û…\•¯Àyç;ùÅ—¯"×#pÜþ`úä+0-[�o\Ÿ½À­ë;%¢·S@@@@‡¾ûÄéœzlªáÛåœà¸� œU�í/ Ùg×Ó®ÿí³o�½M’aªA¸¶§Qþâ×·ÙfMÌ¦å¹ ö?/Asc¾ €@)t,ôè´9ÀýÛ—•rxô�…@J¥áÿ×o5^ÑZ’ˆ‡¿ªŸM˜§íMÕÆy»­â)Ûw·�–ñ”R`f6.Íõ¥BPû®îºØÎ/¿ ®>óF @~ÉU šA�¼B’Z›W\œ“À�«ÈL”!€ € € €@Þß{’÷¼i^#Ð?š–“ƒöÁºÕш|åwï’µK[^s=ð›À›zä×ß}ƒí´t¦à cæ 5Û‹©D(¨ÀЄùùxAk­Ü¸º½ ýÑXñÛ^Nž5vÐÑàíÍÛñ„qjÒÖXe®tYÍSGÌÜ뫼½F.£öÅpµzç±í ðN"œ*»ÞOóa. à¼îΛÓ#~Xã· ya>×.jôÂ0# € € €øL`x|VöÈzVúöàåÜ”8k7.@ (—&Ór|À>¸½B=‰|ù“wÊ +  Êã‚yŠüò;7È›oYbKñüÅ”LÏÙžB% €€CêõŒ©¼ñæ^ ‡¸5ù¸íøWî?bRmeHôû[¯–¤zÉ­ÿX•ƺJѯ¹½PF'fåØéaãP½¼FÆIQ‘—@c�7ÛyMÒ…§Ã)Ü]¸. / àî¥Õb¬¸S€÷¬KOWC z¥K@@@ºÀ÷Ÿ<£¾ 7n˜|šj¼`šÇ@ 0“³iy¶ßeóÃ."‘°üÃ'~Tn^ßU˜Ni�èXÈ?ýØ�ÈÚkÌw-ÐAjÇÔÏP:û_ÏQ`˜ €€ûôsñÈ”ù‰ø®-½îŸ#¼,páÒ”|{×)£†×³·Ï%�S“öæs¥ËjöØl¼¯Q›ÔÛ ¯ˆ–™Ÿ£_q"ÿSP�PJˆ)+¨(�!<~¥oÍ™1…àÅH¡Eçi¯²¢Lº;bóœE5 € € € Px�w¿�S£MÞùž<§ùqä&Oˆ:—2f‘Ô­êl§õëÛå¶æÖ W!àq�ªÊˆ|é“wHK¬Ê8“ñ™´œ¾d¿QÄx1 €y è»Ñ˜657De#w ÉÛØ©þã;Ï7u—©«Ö:ooÞžM˜ƒ|Ûͯ5œòÏ´Ÿ§Ž\0žZ5VQ`�¹øl€g_©‡B«KØ;]#€€p÷Á"2J%°øö�ê{Á¶–ªÿ ö{óº)�pû¤ ®?óF@@@ T •–ðá§ÏfݽŠË�A�‚\- 3�VÁí:ÈÝTtöê?»÷VyãÍ‹M§p�@tµÔÈu›í\Ï\JËØ´9hÍöb*@òš0?ÿ¾~s¯”…y?”°CëM ÷}ï9com*¸]¹{¹ÌÙ¼ööR÷§›Üë«øyóòc´XcŸž™•†õÅi�îÞm#ƒ§Óêô‡€�<þÒËG+ÁTð @<•&{{ Ömó*ö”€�.@@@¼Àãûe|2žµCS _.g�Æø\@‡€=ÛŸ’‰Ys0˜&øÌ/m•wܶÔçL�Ìn¹n�üâ[ì¿–9vÁþŽ™õÄY €Ù¤ÔË™á)ókš»¶ôdÓç–Pà™crêü˜q Þo;›4NO:šªÍ•.ªI$Ròô³�#ª�z�Œ“£"/�EmÞ¹KA^uÙÅñTj•ˆÄp@ÀC¸{h±*n%Åþ“T· Ø'ãYÞÓè“™0 @@@ð’À÷vŸÎi¸Mµ|¹œ!àc�“SriÒ¦§þþ·®‘÷ÞÍ÷à>~0µ>þžeEo“ñÊ™9‘êç‹‚ àœÀˆ n×w¦±*µUåróú.«*޹Pàk�0ŽªNMûáÎdñ„ù5x»GÜŸ¼$3†Û@U”‰DË�ËHEÀZêyp”â!…V—¢_úDàî�ud”F ,kKÓq°{ííl6³G@@@�’|7‡w}ûön^’õ¢SÜ*p~$-çÔ»rǦùÄ/l²;…:)P©¢¶þâ×¶IE¹ŠÞ2”�±ô¼H —r@ �¡ óëšÛn\dûœ�Cw\R$�„Ú¥ð�GŸ7¶ÞZç��Û†¸ðËónóH€û“Gú�ëTÏçF*Dª"æçk|Š*@òÔ¢òÒ8þ ÀÝßëËì(®@Š îÅ~më‘°,쌽¶‚# € € € €@Ž÷�È 6·j7u«IØq¦)r²VYÛçË.½öšùË_ß.e_¦‡€WÔ[ÜK°x½]±ôJ— € € € d�<Õ' Ó·à60~ °™"U ��ÀÀxZúGÍÁíº‰Ïüҹ톅´Æ) pµÀ;n_&7¬4ßùux2-Cê@ ðzóÞ¬uL´èÍ{wlZTøNi±(_{è¸±ÝæÚ�”ù$²*ž4NÓ3wQÚ¹ï¼q ÕD·q¨xI Šøö—,ýG(E€»£àt†€|ò2Ì? ÂLðŠ€ p_땱úeœaõŒÝÝÞà—é0@@@ðˆÀwwŸÎi¤�59]ÆE à#�©xZŽ_0¤‰üá<òÎkå=w¯òѬ™ Î èÊßûÐÖË�”¦^ŸH‰ÎæNA(¬À𤹽Mk:DgĦ¸_`htFÞÛgh[�‚¦ã ó ‚öæj£�[*Òjø�í?gN¬ÊXE/ ¤“ñ—þÍ?œH‘DÕ9lzBÀg¸ûlA™ �ÁÝAlÝÕju{Þª(ÛIf§;@@@-�Tqv_ö›p*""µ•þ 0Í“ã `Ð7~8rÞ>°võ’fùì·˜¡æÐ?Gv›Dtvá3—ì7šÌÛ ' €¼F@ß%ÃT^¿¥ÇTÅq— ü÷£Ï‹~ßkUÊËDb>Ê >3g5Ë+ÇÚ›Üà~ìô° ŽL[N"¬>~¨‹ò„%_!055#•ú‡›â¨@(-dpwTœÎð�îþYKf‚€c7~@EY§W8Ö!]¸iU+ € € € €€£»õËèÄlÖ}6ÕðÅrÖh\€€ÏžS™Û§m’ãÕÕTÈßÿÖ�JT €@^¿ö³¥Å&méÙá´Ä“yuÁÅ €W $Ô¾¡±ë h}Úí7.ºêlþéf�¯=tÜ8¼•½]Ý,Å7ejÖü˜]²Àýw’ß±ï¬q-ªüµVƉR‘·@ZÝ  §�tÿyCfÛ@HtU=£f Àù �«î¹Êq¸X_³\MŸTâ?Vö4:Ü#Ý!€ € € €@ÐÜ}:'Üsbã"|#pn$-ƒæ=Ñ/üÊ­²¨£Î7sf"”R ^mùí_Ød‚NLÛGw£ €@¶#Sæ×9=�õÒ«þPÜ/pº\ö0´M¸û©LÙl>]¶Èý±;÷�7.Gƒ�2í'IEÁÚc„; 3ó†šßþѶÌOçL@àŠî<@ k�t2¥wÖQІP@@@@'r p×·÷ÓmÜ�ô¦/ü 0©2CžTiMmʇޱNîØÔcsU �­ÀÛ·/•Wu/ëUYÜÆj*@²ž4¸oÛØ�EKœZJ»ìíQÿZõ[€»ùq»|a¬”K1o߉dJv8g- àM�Ó—R¢3¸›Jkc•üõÿ¼M"e|=e2â8ù¬½¦E^¿¹ÇØYÜ�4T € è×:¦;b”«ït·¬í̸-N,�€ÞÌ}ìô°qmuþz½:7¿F_º°AÊ\¾K}Ç>sööµÉžO!Œe*,¦§gDo¥8.@2UÇÉéï øë™÷׃ à �Ü�^¨WµJy¤Ìéné@@@,@€{€Ÿ©#�ƒÀØLZÎ\2Îè ™¿ùŸ·‹r§ €@ñîýéë��“ÅÝHC �±Àð”ùT}§šêhÄ|5®x`×)ãXj+CRUa¬ödÅTÜ<ìe Í•.©yÌ&À=VE¤²K–É3ÃH$“Ò«ôÌxý2ÐP:Dw¿,&ó@ÀAÜĦ+ü Ð~ç¯Õ¨y,ñÃ\¼4‡�×¶xi¸Œ@@@<.0>—݇/d=  înNA�€ $S"ÇúÕlÊ=?±A6­é°9ƒ*(„Àê%Ír×–^cSdq7ÒP�d$0›õÜuìjm%_.g ÇxX ¡)>wÁ>ôÇßs£ëƒf<¼ £À|YÜÆÌ�nÆF©@.0�tÊædó]L}ΩP˜÷œõ¸�` àÌugÖä, Þàž³^nÖU—K»W!€ € € €@‘Ž�}Ëöl‹þb™€ŽlÕ8o œ¸˜’¸!XFÏlËÚNyß[øþÚÛ«Ìè½*°²·IÞxóbãðÏ�ÚoN1^H `�uçSÙ¶±ÛTÅq ŒŒÏÊ®ç�#j®õ_ÀôtÜü¸]ÚÝ ea÷ÎybzNž9vѸ^¸i¨˜G`zzFÂ|ˆ5�Rá«C’&æ¬ð¬´ˆ€¯p÷õò29Š"pmQZ¥Q£ÀÖ5íêËa÷¾©4œ @@@ð¤ÀÃ{³ÏÞ®'ÊËž\n�@Î:Àëâ¸9X¦¶ª\þìÞ[ ÈY˜ È_àýo5Ç�LÇEF§Í?Ãù÷N  €€¿ôóæŒ!á¯~Ýú.Mا³ùîîÓ’LYÿþ«ˆˆÔEý÷½ü”zìšÊ²E�¦*Wß}¨_:½E‰–‹Tª5£ �‹@R=®:š£¹\Ê5ù¤…ðùøq- À=€‹Î”ÈU {˽UêÚE¹^Ïu¹ lXޜۅ\… € € €ä ðÈÓ}9\E€{Nh\„€GtLЉë@“§ô™_Ú"Ýmµ/þ/#€@ 6®h—*“»©ô�Zø™Îç8 d�a›ìíW¶K]ME�y<3÷v�2ŽÕ�ÙÛõd§l2¸/_3z¸¡bç¾sÆa°ÉÞHCE†�•žÉi]p÷ßN¢‚ѼZ€÷W‹ðÿ `U&¯Q•¼Ð0 §âšnw¿©,άi@@@J!0—HÉû³îZ%j�=�‚ÁèNË´!ƒ©¸ss�üøí˃�Á,p±€¾9ì»ß°Â8ÂÁ‰´Ì%�ÕT €\% ï^c*Û6v›ª8î"�©™„<¼×¼¡»¹ÆŸ¡vÜ—÷¸;ƒ»]€{C•?×ËE?2¾J¬š°É,rmçm!±j àé¯ ðLíÕ•cÜ”@ �Jó�D Ü»ÛëJÐ+]"€ € € €@žP·ÿžžMd=õ˜O²†à  Ûû.™³·×«ì¥øË¯XKA�Ò ¼}û2©ŽF,’V±šÆÌ›–q €~¦›6?_n»žw/<,ÚsFfãÖ;»"*zʯÓvÜ—-to€ûðø¬z~ÈøÐ"ƒ»‘†Š *­_"gx5§å*P–([�ëµ\‡Á À=xkÎŒÈ] &À=w½œ¯ìj%À=g<.D@@@�¬±Éfg×Pc5‘¬v>Ô!à'�)I™ã»ä7ß{“´Äªü4eæ‚€§j«Ëå­·.5ΡÔ¼aÅx €@À&gÒ¢nveYôæ¾UKš-ë8è.�v½`PSmÈ—4“êq;c¸óRDEõ÷tº7á±ýçŒëU]’ò2c5d$�J~82ºš“r¥ pÏ� žîÁ[sfŒ@Îé4ÜsÆËñÂÎæjiŽÕäx5—!€ € € €Ù <òôÙì.PgëÐv¿fºËƒ ð¹ÀàxZF¦ÌÑíׯh“Ÿ¾ëZŸ+0=¼'ð³oXa´z³û¹6^H  �‘iód7¯í”²0~ÍBS;|ò´q0Í*ÀÝ�ezÎüÚýš )soØØÎ}æ÷XµW‹99-0==£~üù³ï´e6ý)ñ5ٜϹ l÷¾R öº0{\)N‡ÈàîðÊl]Óîp�t‡ € € €ATQGN^ÊzúuU!Бõe\€ÐYKŸ¿hH]ªæ…ä÷?|óå¿=65†‹€ïÖ.m‘õËZ�óœ0¿/¢�Àè´ùyrëºÎIxwª»œ—ñɸåôþ¿Þ•lÊzÊ—–/j´ôpËAûw‚’ݲN^G*•’Îæ¨—§àɱ§…Ø3O.ƒF D|íP"xºEÀ‹éÜ�^·5׸ûM¥Óô‡ € € €Åxô™³’J›7L=û5À4_Ž#T�ÓC)‰'ͳß[VËêéÛ*º@IDAT%Íæ¨A�’ Øeq×î9¼(é|èpJ@??ŽÙ¸oYÛåÔPè'�o=vÒxucMHmÒ4V{ºbjÖüßÍîç'åù³£FûzµÑž‚@!Úc…h†6²XšÝéœ�A À=È«ÏÜÈB`Ñë>¤#­Íé=²h‹S3X¬n FA@@@œxdïÙœºáÖà9±qž˜P�1çFÌÁ1Í5ò+?³ÑSsb°Mà�7/–òˆõWà µyÅ.;qЬ˜/ pµ€~”4ÜĦ±®RVô’°ìj/7þ[oRøÞ“gŒCk©õo°´]÷e‹bF“RWìÜÎ8„ºhH /iŒ×P�€I ¡ºÌTÅñâ ´ônû˜{Ÿ€Š7oZF�¬?ÅÈ¡!.A ¤B‘eþž¡;g×ÝVïÎ�1*@@@ð�À#*ƒ{¶E©\«¾\¦ €€¿N šƒÛõÌ?ý�ÍR[Uîof‡€Çêk*dÛõÝÆYè,î@�× ŒN½öØ‹G6¯íT™¿y?ô¢‡[ÿ>Þ7":#¸UÑ˧3¸ûµLÅͿߗ/tïæŒÇö™ÜªüºZÌ«e柑RŒ'(}&ÓibЂ²ØÌ�<pÏ�ËŒ@Yxy`æê’‰†Õ3ô‚vÜ]² @@@_ =uI.ÙDnf«‰C “æ0žJˈúc*ÛoX(oܺØTÍqp‘ÀÝ·,1ŽF¸ë ·@�W ŒL›Ÿ·®ëzåÉüŸ+ÞÛgW½�³�§ÔCwfÎzꑲ°,îrg,‚~=²Ã&À]AA P©¤á‡¤PÐŽ¥€ú9'ÀÝR†ƒ ðjÜ_-Âÿ#€€¥@:�&ÀÝR¦x—¨7”µÕ•Å뀖@@@@� <òtöÙÛõ¥|±ÌC èp.»ìí•eò{Ü*$.õ÷ã€ÙùGàŽ›I¹¾ýŠEI$Eì‚8-.á à{h;fàÞé{?LÐ.ÀÝÏÙÛ§m²·/^P/Ãk‚R¯ù©ó£¶÷ë«p/õù©ÿ©©)/ã1åüš’ÁÝyszDÀ›ÖŸ`xs.ŒŠ)"À½˜¼VmoYÓfu˜c € € € €@Áp/8) "à ��±´LÎê0wëò�·­•EuÖ•E× ÔÕTȶ� �ã7ÿ¼/¢ð±ÀøLZtl«Ò«’e ­ª8æ"�ÙxR?ÐoQ¬ÚXåùŠ©¸y Ë]üصËÞ®3E6/,5Y ¨dŸÒÕR•õu\�§@˜ îy r9� À=0KÍDÈO ”‘Á=?¬¯^ÝÛ”õ5\€ € € €d+ŸKÊîCæ/üMíUUˆDËMµG¯ è`®†RÆi4ÕGåÃïXo¬§Ü)ðæ[64‘�­˜‚ pE`tÚ,±em'w±1ó¸¦f÷á~™‰',ÇS^&R[éßhé)› îË{Ü»9ã±}ç,×Kä.rF*òhoTpQœHàî,8½!à]ܽ»vŒ'ô»:Ü�W}õtÖ;Ü#Ý!€ € € €@žPÁíÓ³Ö_øÛyðŲ�ux_àÜHZ ±@—'wïO_/µÕìrñþJ3ƒ  ÜqS�Tèˆ>‹’P{ZF¦‰p· áT`Ôæ9q˺΀ªxkÚïí3Øïïi'g�SWwˆ™+KX“R;ívÚ¸7ø8ã~ Ùßu}•õkãÀÃ`Yq›§uð‹î~YIæ�@ÞüËúÝyM» i �öfÈ-X8„ € € €xäé³9µØXíßLw9�p>P7v�3—ÌÙÛ{UrŽŸ¹k…�fÌTŽ€Þ˜²}c·qƒã¸q¨@�@ è»ÙŒÙ¸o]Û(¯Nö‘½æ÷»~O;1kþ�¾|‘;3¸=5,ÃãÖ‘ùe*­ÎÇ÷½ú3æ‡qW„Íï}ý0?—Ρ±{˽M.ÃB àî¢Å`(¸U ]!{{ §­¹¶½Ò% € € €Mà›Œv&‹�Šmo¨"ÀÝäÃq¼. ƒÛ“6ßñü½7Jy„¯˜¼¾ÎŒ?¸o¾e‰qòCiQÉS) €@àÆgÒ¢ƒÜ­J[Sµ,YÐ`UÅ1 \š’#§.G«ñï{Z}'&Óݘ¢¹¦Û��ß�ûÌêÕgú³ …HÌͺIÚËD š"‹{&Nœƒ@Àøô1à¦�@FéîAî¤öƨ4ÔU®AZB@@@,G¦EgH˶ÔEC¢³§Q@À3ê»ýó£†h.5Ýë®m“7n]쿉3#$pûM‹¤¢¼ÌrÆ µ¹Å.ã«åED|(0:mžÔÖu�Úšy\Só°ÍÝÊjT&ð ë_…®>Ñ4LeíÒf‰¸ô ýÎ}çLÖ›ì�6Tä'0=3£^ó!W~Š9\�Üs`ã‚&À³sÐVœù"�ƒ@:”&À=·|.Ù¸²5ŸË¹@@@ÈHàõ…*‡4­~¿•{Fxœ„€Otöv»§…ßþ…›èòéÚ3­àÔV•Ëö�ÝÆ �N«¨@#06mÞº¶+0^žè#O÷‡ßXm¬òE…Ýfµ ËÝ‹�P»ì?Ðoô�ù|ÍŒ§¢èiõ¸»%Zô~èàU¸¿ „ÿE+Ü­T8†¯§C¸¿B¤øÿ³²'VüNè@@@/`÷…¿_,ÛéP‡€wf"ãæ`®;7÷ÈM«;¼;AFŽ/ üÈu ^ú÷«ÿ1bÔùêsù@À�úÕ�]ìMkx=äöu×¹Ù{Ö8ÌXuÈX燊ñó,Ö/sg€û¾ãƒ2©o'eQ"*۾κOA Xm±Šb5M»f2¸›m¨A� àÎCæPoà pŸW©°'ôvÖ¶AZC@@@,}æœÅQûCõ©rm”/–함EÀ›}6ÙÛá�|ü=7zsbŒ^#°Å&û°ÎZlw'‡×4Æ@ÀgS³iI¦¬'ÕT•Å] Ö•u�À¡CriÌ:Ê;¬ÞÎÖWùû=íÄŒyÓª[3¸ï|ÆfC‚Ï×Ë5?8HmTí¢ 8-@€»Óâô‡€p÷à¢1dØöéˆêïGû¤3éj©E@@@(ªÀ‘S—dàÒTÖ}èLwþÈš„ ð…@\eo¿0f„yûö¥²l!wžôÅb3 ”ÀRõóÜ«²´H©§‚qÜIA‚*`—ýzãŠ6Qûþ(.xøis°tƒzO«ƒÜýZ¦ã" Ã�X]¥,êpg²½�ûÍðõšQ(¦@yØðCSÌNi[¸óÃÍãlp·å¡ºe´W)è wŠƒmÍ5öFW € € € D»ÛµÛyøýVîvs§? œI‰jµ*:ˆë#ïZoUÅ1ð¨€þ¹Þ²¶Ó8úÑì÷ÀÛ¢ðšÀ˜MöëëW¶{m:�ïÃ{úŒónôy°ô„Í&µõËZ]¹AcFí¶}êÈ€qÍbdp7ÚPQ�t*Y˜†h% �tCÇ-÷´dq§"€@pà¢3e²H%—gu>'ç-VÏÌíÍuy·C € € € €€�À#O›¿ð·»Žw;êð¦Àœú.ÿüˆ!º]Méî×-‘¥Ýdo÷æê2j̶îÓæçs‹Ô €þ·y¼ae›?&éãYLLÏ©`é Æú=À}ÜfƒÆúå­F—RVèàö¸~SbQ*T:ƪ ‹ !P@�Ù™YWnþ(à]ÙT8ÒYÜ) €€Q€w#   Òá4î?–tÕKU´Üá^é@@@‚$�H¦l¿ð7Yè�,øØÂ¤Ãq¼+pÎ&{»žÕ/¿kƒw'ÇÈ@À(°e�9ƒû˜ î4ÝÕÁØ  €€tŒ­Š�¶,eá�¬[êÎaËôà®çE¿çµ*•–Ÿ±šù•c\àþؾsÆA“½ÝHCEæ ‰Õ§S@ÒŒš IhiF'rV€÷À.=G C�t˜÷ © uÚu˹O¡,i@@@¬ö?7(S3 ëJ›£ ÜÜF‡*¼)�P±?çl²·ßqÓ"Yµ¸É›“cÔ `+pÍ‚˜´Äª,ÏÑÁí6`-/â  à»ì׫7KuTEHS\-ððÞ>ãøkBÆ:?T¤ÕïïÉYó]X6,sç�vîÕþ^3?<îü2‡öƨ_¦â¥y�ÁÝK«ÅX(�î%@§K¼$J“ÁÝéõºvQƒÓ]Ò € € €L@g´Ë¥Ôàž × àj�ó*¸Ý�àòò¸ïù ²·»zy„T¼Ø–µæ,î£Óy4Î¥ €€GÆl6÷l\ÙæÑYkØï1¸Ç|,=7ß�¥«¥FZ­7¶•ò2>—}Ç.‡Ðàó53Nœ ÇšêØÀä8z8E€»ãètˆ€·xföÖz1ZœéwvÄ: ¿¨£ÞÉîè @@@(ðøÁÜÜÉàÀ Söµ€ÎÐ|vD¥p7”[6,�ë®%�ËÀã›ÃúŽg.ŒKÿФÌÄ“ŸKʬú£ÿŽÏ¥.ÿ‡¤±.*�õ•ÒT¯þ®»òwmu…è iŠw¶®ë’o<ú¼åF§Ó²�ïˆ,m8ˆþ·ÙܳqE»'î“™�î—SçÇŒ³ñ{€ûÄŒqê²~¹;³·?~¨_R:õ¼E©*©$²ÍB†CŨ©$Op1\íÚ §…w; ê@@xÀƒŒ]?P­‚ÛO ¢(�jç4@@@(–@RE´>uøBÖÍë/•£êËe øGàâxZIó|þÇO’½Ý¬ã½šT°×n@tRý­ƒ¿tP»þ{pÄ&’ožiF"aéUI[V.nºò§÷Êß]-µ¾Ïcç–j» îc*À]‡›±‡Á-«Å8@ Ø:Ævœ îÅf.jû?Ýgl¿.õÒÅ×Åîñ»~™;ÜÛwθ&do7ÒPQ�Hؼù»ÝѤHKH¸ë·Ö»\PB�À àø‡˜Êê¢K eÍQ“·@[SmÞmÐ € € € `8p|P&¦çLÕÆãdo7ÒP�€gÎ�˜¿C¾qU‡lZÝéÙ¹1p 7—�ûÏÉ#{ÏŠöÒÁì….‰DJŽ÷�\þsu𺚠٠²„nߨ-Û6.”¥Ý1Þ �_ ö–,h�ÖÆ*¹8üÚ�ú.3q‘ªŠuF3 €€Ë&ãi•IÚz�ú¹²»­Îº’£®xx�9À½Q¥÷ó{™˜5ÏP¿6scÙaàî÷Œûn\� �)•Lyú¥š{ÝâÛ?Úvò{_È>G©FL¿ à¨îŽrÓÞHI¨7Ä&9G­Bmok&ÀÝQt:C@@@ `�8ŸÓŒÉœ–!àZ�1•�trÖÁ¥Fýá_G@²kWÏz`‰dJö=7¨Úûä‘§ÏÊÓψ¾kG)Š®T�AÿùÌ—ž�îöºËÁî·Ý°Pn^ß%Uú¶ W„T¾Ä5×´Èž:c9ìYUAwK"€€ïÆ_»×ç¥9n\ÑÎk£—4Üù½ñNoî3•X�¿Ÿ©—‚¶¯ï×-m1є츾“ÐÑS—Œý³ÑÞHCEfgã—ŸçIZ\›&“IÑYÜ p·1¢ � ðéQ�WŸ¹#0�€z{×;Ï)TX`Í5M)óù}Ñ lFs € € € ��À®\Ü«ü ��"g#à}�ó6ÙÛuÔÉm7.ôþ$0ƒ9ÈõÍ'åþÇNŠÎ~©ËÝXú.ŒËWî?rùOu4"o¹õy÷VÊZZ¹Ñ¯ØcZÑÓh pŸrçCªØ$´�ÐMeãŠ6SÇ]"ðô±™˜²¾[™Ê3'u•þ~Ok·yUßMGßaÇmÅîó‰µ^åen1ãñ³@"‘�Xm… �óØÉuN§Ó:À}‡“}ÒxG€wï¬#EÀqu6•ÁÝßoòG�§ÃõK›ç9ƒj@@@@ w�”JCµûpÖ T¨O’£åY_Æ àR�¸ºóúà„9€ë½w¯’°NëLq­ÀÐèŒüÛ·ŽÈ?ó°\¶I7ëÂLÍ$äß¿ýìå?:Àýgß°ârÀ{ ¿hJ¶Z+z›Œ}O]¾ÓÏF *@ÀWãvî+Û}5W?Næá½g�ÓŠU«ÈŸÿ:Ÿ5N_Ö/w_öv=Ú�jƒ¦©ÄªL5G x�•¸�×Ðrz©¡‚à €€à΃Œ¡T¨—øv#OQ*–v×¥]E@@@´À¡CÆŒvvBÜÜN‡:¼'Ð?–Óm×£jGË»~t¹÷&�?û°üã×ÊWp\fãIÏÏúÀñAùŸ±C>û¥'ä]w,—_~çim$šÉé…µ pŸŒ›7Ã8=NúCŠ) ­ÎX'ÿ–ˆJÿ½Ž»Ž“¿ m?¼·ÏØŽp÷{™°Ù ±a¹;ï@ ï@d* X3ÓÜ9^:�ÆZB)�×é î@ÀR€geK"€Àe�P¨G„.�|4t·Õ:Ù}!€ € € €@ÀìnÿmGA€»�uxK@¶÷�¤Œƒ~ûö¥ÒP[i¬§Ây}÷�‡öôÉ—þÿƒòèÓæÌ¤¹Ž¬,¬ïÒº|§¿w9»iXÅ€é?:Ó©Îæ¯Ç�P�sê¡sùoõïD2-³ên…(Ósò寺œÕý}?¶Z>ôã륾¦¢MÓFK»¤L-x2õÚã¢ÖÿÊã!ƒ¦8ð¬ÀøôkŸ_œÌš%ÍRYQöâÿò· †Uúò}Ï]4ެ±Æÿîvw X¿Ì}Üû&ä…óc–k¦W‹Ï!,i8Xd�š¨zCDqT@ýö%ÀÝQq:CÀ[¸{k½- ¤{î0ðÝu´àø € € €Qàñçsj�Ìi9±q®šH‹]âï÷ܽʕãâ ¦Uôø}SÛÉógGó&Ð�BuU!‰©éÕ•* ]}K¨Û#ÅëY…éÀç)•á{rVý=«þVÁÐêoŸKÑsþËûöÉ¿ÜD>¬‚ÜA»WUòuf.–Ù\SQ^&KT�ûs§G,/Ók\«3@ÀÏvÁÁ7¬l÷óÔ}1·Ïœ5Þ¡¨Jí™óûË ýÚËî«7»n�ÛoÎÞ^ ©Íw®2 €@$dÞ €é—jŠ:À]¿Ù0ï4+ÕÈèJ.À'B%_€€;Z·}¸V½tpß6^wrlTmM¸ “†@@@@à:kó‡ú_q,“ÿ©PŸ"W•gr&ç €€Î�š¿3¾iu‡¬ZÜä…iøzŒúùúÛ�Ÿ’OýÝ.978™×\£êù»±Zµ«?z³’ÎÐ^È¢³¼ëÀç+Iÿ_€žTAîÃS"—&Ó¢3âšuÖ£S‘òð¿ŸTÁýåw?°Eî~Ý’ËÙä­Ïæh!Vô4™ÜÕnìPeÚ@7 ŒÍ˜GwýŠ6s%5®xxoŸqúµ�ß˸zíe*+{›\y‚�ûÌî±jÓl8Ž@qRÉÝ¢ª¸Ãô[ë5]Û~µùÜC:è·‰1È_€÷ü i_ T…*{RéS¬øR¤ø“ª«.—æXMñ;¢@@@¤À¡ç‡D f[¸-x¶bœ�€{tæ1ll*?ÿæÕ¦*Ž;$pæÂ¸|òo“ï=y&§u¦KÌ®ÿè`.à^ŠR£‚Þk*EºC’PIG¦Ò28ž–!ð®ø3-‡§åÃø}ùï'åsÚ*-:ý<¥(+zå�Z7=©ž;®$U´®ç( àuý»ibÆü j#Ü]½ÄzýÞ{Ö8FýºÈïeÂfƒÆ†å­®›¾^³¶îþ_3×- º,033{ycm6ïY Ë_ šëQ­àž?%- à;Ü}·¤L�¤’ÉžË7€)Ls´’�ÀÆk[È@“�§ € € € €@n�<ŸÓ…¸çÄÆE¸R``̸ÕÞT-wmÖß)SJ!ŸKÊß}õ€|á?ž–ÙxöÉgê«B² ’¦š�ë>gÖYã[jC—ÿ¨iÊõ8ìMÉÌ\æÒ÷ï<)�8/ŸûðÍ*›ûâÌ/äÌŒV¨ì®¦2©2¸S@? L¨ì×)ÃˤΖéR(î8~fDú‡¬ïzRqÒAxO;n³AÃ�î'ÎŽÈÀ%u»‹¢ïT%ÀÝ‚†C$“Ii®«�Á±ìD80<ßv‘JÉ"5¹=¾� C�œpÏ™Ž ð·@(êÍþ¦¡þ6)öìÖ,1x\ì¾i@@@ü/°KæR‚ �‹ × à5³5 2h›ÊϾa¥Dt$2Åq��*{å'þf§œèͪo°ÕªÇ»T`{­G‚€ÊË®duïn,»œÕýüÈ•¬î™LüÒØŒ|è¾'ßTî¿ÿ‘×Ic�JO)˜€]€»¾ûð³À¸Möë�+Úü(ÿô;wÊòE�™\Â9t·×Ju4"S3¯}¢ÐÏ:³1Áf@r xR`lZ=ÉÊÆ•톻Eàa›÷Fuw¿—Yõ{Zß%Ǫèßí×tǬªJzlç~s€;›ìKº4t®k=ü&Ë£+N‡tw  ð�ìS|Íœ9€„$Ý›ÁiœR@�®ÖÚ¶FS € € € €ÀËG_¸$#ã³/Èð_|±œ!§!à��1sàÖÖu]ÒÕRã�YøcˆzÓÑ¿=pTnýà}Y·W« GKÛÂrÓâ2éiövpûÕ+©³Ï¯Y–µÝa©Ë0ýéþqy˯~]¾ÿÔ™«›âßy„ÕN—î6s"Ó™<ºäR@À5vÙ¯Éàîše²Èl<)�4ß­¬±Úò2_Ô›MeÝÒV•ÁÞ]AþIµkî±ýæ5‹`ÍLëÅqwTW¸ëgÆ*ÅEZB=Åí�Ö@À«¸{uå7EPo�xñPdãW7ßÚÈH¯6áÿ@@@@ 0»l¾<¶ë¡AeÖ¥ €€÷’)‘¡IsàË;¶/õþ$=2ƒ%ü±?{H>þ—;d|2žÑ¨õÝ4–w„åúž2éP™Û]£”Ñ29IoªZ¿0,+:âç<_™˜ž“ŸÿÝïÈ?ü×AÑ›(ù t4›#Êâ �ó¦p£€Î~­ÿX• õ iÍ5-VUs‰ÀîÃý¢ƒÜ­Š~=QSéÿ÷´v4Ö/wßã÷ðÉ!�°Þ€_¦¢Øj°fV�W޹G <ÌëÞ¬ÜK€N—xA€{jxa•#%õŠð¢ÍIúæX•“ÝÑ € € €HÀ.£�Üít¨CÀ;:¸]¹[•hEDÞpób«*ŽXàìÅ yÿï=(N fÜr§ hïi K$@)«ZjCÒPU&'.¦dpÜþ{Š”ŠlÿÌ——çÎ Ëïøf‰è¨(JÎíÍæDøùïÉ¥±™Œ&¦3W.m Im4˜>úwÐ •µ~°6-'R2g�˜õ%Ëÿö³2­Òïþ¯_Ù&e~MqÿÒl‹÷» î¦ìÆÅ -#€ÎŒO›_']¿‚¯Ì�Y…Ü{Ù}Èü^7�w»MÔ& ·•�ûÍîAY3·­ ãy¥ÀÌ̬ºkVHôfZŠSé¶î-÷Võíúói§z¤ð†îÞX'F‰€£å5Õ=I1¤óqt$ÁélÅ¢˜úÐ�Ì2ÁYqgf:—HʉóãÎt€^&¦2»et(˜" € €xLàÙ†3¨¼zjdo¿Zƒ#à]�uydÊüÅü;¶/óîä<0rñåo”Ï~é •Eß¼/NE' ïmKGLe¯|ñ`€ÿ~1›û³ý)ÛDZ&ú¯‡NHE¤Lþø£·\H 0[ÎSïh2'â‰'õã—Geθ\ˆ®°Û{¶qE»kÇÍÀDâjÜÓÏ^4RÔ«là~/ÓêëKÓ�šš¢² ­ÎUs‰”ØmÀoà¦÷®Z¯ &©~¨š*äâÈlP J2ïtY\gœS*µ@˜LE]‚T_@´CC@@ $ð¸Í-Ûíº ÀÝN‡:¼#pqÜüaoK¬J^·¡Ë;“ñØHgÔî‚ßüË�ò¿ÿ\F#o­ ÉâÖ°¨~R®ÐÙÜWw…åùÁ”œ1?žõ%ÿùà1©T|îÃ7‹JºHÉR £¹Æx…Þ,CAü& ¿ú™˜5ÿnÙHwW/ù¾ç.^r·d¥Š†Šà&Ec3æÇïúe­®{=ô̱�ËwݱZ3ýš¯FÝň‚€Úc¸;½ee‘Õ'îNÃÓ. ÀÝå Äð(…€z ÔËÛgå{;ݵsÚÙÙÓ[±ôm³(…àd…³¤%@@pV`W®îæ$®ÎN€Þ@ /�›÷·m»F":e8¥àg/NÈû?÷ 8>8oÛ:˜çÚŽ°Äªù<Ï„¥?ê¼Fÿ×T¤åÄ@Ê6GÏW¾uD*ê§Þ¿ÙuA]¦ù¹åx{³ù—?înY%Æ�…ÐÁíún+V¥»½NÚlîlau Çœxü`¿±Ã doד›6<€UÝúå­FŸRUìx朱k6Ùi¨(�@¬†�J§ÙÕ¦³EN÷I à~>µtÿ1BP7>íu¼Ó€wØÕjΊp¦Ÿ‡ÜóÀ³¸4•²8È!@@@ÀO2éo~D[VWhiòá8^˜™™´ÉJúŽÛ–ye*ž瞣ò¦�ýWFÁíµ*Kå†Ee·g¸Â !Y½ ,‘y¾áüǯ”¿ýêþ [å´ì2¸Ï&Ìt/^Ïß €€×ƧÍ#&{»ÙÆ-5»mÞë%XzÔ&ÀýÆUínYª—Ʊs¿9À�Íž/1ñTUÎó†ÃcôÛÒ¡t�ßæÄ|@ ž�ó7¤|'�Nó¢ÁéEmk4gEqz,ôçÜ »–I"Ü Jk € € àˆÀsgFdpÄ&jÃ0Š ¦Ïa|#piÒ�º|Q£¬ZÜ웹ºe"O¹ ?óÛß’¡Ñ™y‡ÔV’u ÃRIrÀy­®>A?­QAîóÝ|àþùIÙ¹ÏDuu›üûŠ@sCTLw%ƒ;�ð£ÀØŒùµÒ +ÝìÇ5ÈuNI•ê÷©ÃŒ—!ƒûlBDohµ*ú.MW¸ë1<5“½ÔTp7Ép¼‘Ùïœv‡Èàî´9ý!àܽ°JŒ‡Tn®^‡» |w-1Üÿ (€é‹ˆ"tˆ&Sêƒ2  € € à5�'lnÙn7Üít¨CÀ;CæÏ3Þxs¯„¸QCAs¯ Øy÷ï< “¦H£ö¦Ù—´†eyGXt�i¬6:�{*�–�üÑ÷¥h20.ùNTõ6VY6£?MçciÃAð®À¸Mök2¸»{]Ÿ’‰iëèîòËw$s÷ø 1º1›Çïºe-Ru×.J½4ax1¡7|FË ¡BH �,PC4“©ÉX3•â<‚%@€{°Ö›Ù"�©@o¦'r^ašp/Œ$­\-@÷«5òÿ7îùÒ € €8/°G}�œK©‹ær× €€›êûx» —;7õ¸i¸žË3Ç.ÊÏüηŒ�V/N0¢®Öt‡¥+Fdû‹&¹þ]§‚ÜWuÙoЙô?øùïÉœ!˜*×¾ý|]{³ùû ²¸ûyå™ÁÐûÑâ†øÅhEDVö6ÅC3¶ÛÌ„ìíz©FmÜ7¯étÝjÚÝY‡ìí®[®ÀhnNÝ"�â°@h‘ÃÒx@€w,CDÀI�ÞmïÕ__v8ÙgÐûªˆ„¥™ îAeþdp/,«ÎøDA@@¼&`wûoÓ\t6áÚJ/M>GÀ+ÃSi1}šÑÙR#k®iñÊT\?ÎýÏ ÊOR·OYg}qú¹õºEeÂ]2^Éÿom©ƒÜíîF ~öŸÈ¿³€´ÐPSiœ)Ÿ‘i¨@ ŒÏ˜^)‰lXÞ*õ.Ž»õG€»È¦5î ùرï¬qͪù ˆCEIfgã)ãqé0þB‘OóË×atºCÀí<)¸}… Ì%jØç°ùòE R¦nûIA Ðdp/¬hR߃—‚ € €xHàÒØŒœ:?šõˆkUF\»@Á¬ä(‰ÀЄù³Œ;Töv~Î ³,N ÊOýöý2>·m°µ.$놥2b{•9茟KZì?cÿ§o’GŸ6UåЭo/‰V¨Û J*e¨à0 àA»÷�+Û<8£à Y礲ËàÞ€;’Í©»L^~ê$h7­rW€ûèĬ<>d|�ÆÔ¦E nH«'šæzóÆO7�ÕGc)_x󠻞¼|„ËTðª€ý§=^�ãF�œÂápoÎsaN+zb9]ÇEÌ'@÷ù„²«Oàžg#€ € €@ÉöªŒµ¹ÜŒª.Á%_€@‘ôÇ:ƒ»©¼~s�©ŠãY<1$?õ‰oÉØ<Áííõ!¹¶#,ú”âtÆB¢7Ø•OüÍc×Ñ`[�J»wóÓŠm›T"€nŸ1�jã ÜÍ:¥¯9Þ7"zC·UÑyåjpG²Ñió/åÕ×4Kmu¹OÉŽ=~°_Lw‚©ª©`hÉÖ†ŽÍMuîú92�Ô?5©H„+ü³œÌ�‚à^FAÀ?éP¨×?³ñÆLwÖ{c ŒÒs!¾1+èš™>t)h'4† € €P@¸çRêUw x[@¼$ ™–k«ÊeËÚNoOУ?|òÒåÌí:¥]iSÁíKÛù:ÎΨPuKÛÂR]aþvòܨüÝWª;ß¶µ‰0#ˆo—�‰!8½xrÖ ¼a9în~Pì>Ôo^]@îHfà¾y�û^ëïÜwθfdo7ÒPQb�†jv^8½átz‘Ó}Ò¸[€OÔܽ>ŒÇÔG¿½Žwð´Õ\€éK€ î…•%ƒ{a=i @@Š/°çè…œ:Ñð¶À¥ sÀÖöJy„¯‡òYa�5ô'ë›22>Op»Ê(¾L·ó¬š�væ×ꌭ+;âÿ6•/üÇÓræÂ¸©šãJ ZYft ÀÝHCxL`*žVÙ¤­ÝÙR#­�UÖ•u…À*¸©4Tã•ר´I@dóšse‰jvì;kì9VŒ53PáZ�>s|mÒ¡Ó!î°ùˆÇÝgt Põ>¾§8-ÓªI ½±ÚTÅqò(#ƒ{^~¯¾˜÷W‹ðÿ € € àf}ª}dzb¥JNe“¸5ëö¸J#04iˆØRùsç³*ã“qyßg¿+Ãó··êàö‚Ûó±ÎåÚª •ŧÅüõçl<)ŸüÛÇDgî¥X T–›3U¦ w†°n‰£ €€{ìnÀ²ni‹{ÎÈ. Øep¯ÀÞ„DÒ|‚�Š¿iµ»Ü/OËs§GŒ�Þ lJ0PáZ�ró¾O׎Ùó …øÀÂó‹È(¬€ùžÂöCk à�^ï Õ#mŽà]¶?–Ês³à^Ð5KšRy´C@@ #pää%™œ™Ëº±ú€d»Ë† ð�€ÎHOX8¢R[ßvãBëJŽÎ+ 7}ôO’çÏŽÚžÛ¢‚Û—“¹ÝÖ¨˜• !©µÉ¶ø½'ÏȣϘ³ˆsl^h› î^X%ƈù L̘w:­_Öšoó\_D�¾� 9{q²Ü„;’�N›¿+zš$VWiéSªƒ;÷�3v][’AÄF*J+vw:½¡´�ÁÝitúCÀ帻|�Î ¤ùvÃaô¦Ü&Lwaý)¥`dp/% !€ € €€{�äÔK‚r‚á"<$0:eì¦5R_£R\SrøâÿyF¾»û´íµ-µ!¹V·óÑœ­S1+5ýÒVûø«ûž)æ<ÝvÔæV.äñôÒ2x¸JÀîF,ë–‘Áý**×ýÓ.{»~?„ü_vî›×vºnÍvî7¸7*áºõb@/ $†�ã/ŸÂ¿ , ¶ï�Á½À¦4‡€×p÷ú 2~ *ðiõœrß;ž‚ÎÑ]�EÂaiŽÕ¸kPŒÆ7êáE) Ü ˆIS € € Pt�=G/äÔG}4§Ë¸\$`ðrˆ.©·†ò  lÿÓÛc;èfÜÞAp»-’C•:ƒ{§Êän*�í?/ûŸ4Uúxe…9�jŠ$–�~l0yü" nÈ"“³æ Øk—àîæµ~â`¿qx ¹qúØ´‘@ô†V·•6ÜcÜEÎmËÅx®˜��³qù*‡þIw‡ é¯úæ••bœ8 ÐqËP³ê&â@WtñC�e ëÕ-·x*æQ2¸Ö• î…õ¤5@@(®Àž#Ùgp×™îjÔíÁ) àm�‘isÀÖftô‚öógGåž?ù�íPTpÎ ‚Ûm�œ®ìi «ÏßͽþíW÷›+\µ p×Q¡@Àã“ñ´˜žÎºÛj¥‰]¿®^a» îõ–N¨Íf646­vW€û™ ãÒ§þX}Ç£ ¬™ÕÜ9æ �D2)uÕåÞ¬F[ºéžzÿL‡™ €@¾DUæ+ÈõøH ,"]>šŽ'¦²²7æ‰q2Ho „ƒp>—&eú´ÓÁ1Ð € € �‰À¥±y¡,“S_qŽÎv«¿`¦ €€wt6ÒDÒzü5ÑrYGFRk›£Ósò¾ßû®LLÍϪTicVt’¹ÝT¢Šˆú´Ë&‹û7wœ”Îgÿû²DÓq¬[Û îÄ·;¶t„Ř˜1·½nY«¹’š’ ŽLËñ¾ã8êÕ{Z¿—1›Í¬KƤ%æ®4ö;ž9g\’:µ^ä4òPá�Öú —Œ$8Ø­ ‘Å=8ËÍL˜W€÷y‰8�à„Ò¡ÎàÌÖ3]ÜUçŽ�0 _ „ˆJ(躒Á½ œ4† € €EØstÀ˜‘Юۺ¨]-u à�Ñió(oZÓ!ñKÉX@'<¸÷Ï–ãgÌ�T:ÇÄJÜ^n“)<ã9±à�±°˜ò€èõýûÿ:Xð>½Þ`2E»××�ñ#€€½€]ök6ÚÛ•ºöÉÃŒC¨Uw# B°´]€ûfõzßmeç~s€»ËbñÝFÇx\"ÐP«v3SH…Ò=ŽvHg àj>Étõò08œ¥Òdpw–\´Ö:Ü#ÝI€ î…]m¾Ø)¬'­!€ € €@ñö1éo×k²ÝÙÍŸ:ü 0j“ÑqËZò›d»Æuß>y`×)ÛË®i ‹¾Å�zãA»M÷¯þà9‰Ïn{àÎ)}T3³f�2Ón�¢�Š@� Øgpo)\G´Tp�'öÛ¬wWârã8ó­°Ûкy�»^ïë›cïÜgpo¨æ5t¾�®/¾@m”�ÌÅW~eá”�Áý•$ü� À=ÐËÏäxµÜ_-Rìÿooª.v´`�0Ü ºúdp/('�!€ € €@t÷\о=8¼-0:eμ¼u�»^Ü.ýè3gå�¿ò”í0;c!i¯ç¹ÓÉ• TwS™˜š“GŸ1^™®óóñ™xÂ8=âÛ�4T €€GôM*&ãæ×Kdpw÷Bî>dpo¨òÿk²dJdbÆüøÝì² ­Ï�–Áë[Lé×|áîŸ7FwE ªÜÿÏ-n[ët(Üã¶11(�€ù�Ò�‰ž@ D©��ÁÝaûæî“ª;2¸v¹ p/¬'­!€ € €@qôݧö=w1ëÆ+Õ—+¸ërÖn\€€›&fÓ’PA/V¥¶º\V/i¶ªâ˜…ÀäÌœüÆ�uÒTêUÕ’¾f3ù¸éx´\¤¹Ö˜rÿΓnnÉÇ2=K€{É� €@ѦÔë%Óï÷žÎzi¨­,Zß4œŸ€Þ”vèù!c#úµ™ß˸ n7½<íU�_·%×Ûa³‰P¯çüþˆõÇüÂ!ÛlLÏ�³H§¸s`Œ J!À'o¥P§O\*’4î¯ îƒ¬;Ü »à:H„‚ € €¸]àÈÉK25cL3�?Á¦¹s¿ŒZ'G¼<½M«;$RÆWB™®õÿËé˜0ž®7­è 7P4¹®¢Õ&Àý;O¼ Óî×ͤøš™M; ó4b´¡¼!0>k'ÙÛÍ6n¨yêÈIv'TUˆ”—¹a”ÅÃè´ù»ÊMk:ŠÛy­ïÜo¾KN¬Úÿr ã ¤Sæ×Æ.®/†¤žÜ÷„æ Y&�€7øÂ›ëƨ(Ž@:Ä=j‹#kÙªþ ˜wKH Ì7l’¼ÒL2Åîì‚‚Ò € €E`ïÑ 9µË­Ásbã"\%06exÙºŽÜ&™.ÖÞ£òåo4ž®?r[©‚Û+DeDð`Ec�9K舊vÜuð¼gUœ!ÏÄÍåÈ´ZsZEç&TlSY¿¬ÕTÅq—ÁYœRHõ›š÷B‚Ò ÀÝã Èð(¨@ˆ îõœ§±Åê6aå¾™‡‰ê<B|Û�‡Þk/%ƒûkM8‚ € €îØ£3s)õÑ\®âp“Àø¬9`kË:w¼¸Éíê±Ì©,Þ¿þÅGÅ�ôò©KZæ «Õ¼ño}»L¡ßzì”7&âÀ(gâæ,•|äìÀÐU`Â.ƒû²–¢öMãù W£ï³º»ºjßò{]U�•õ2óŸtçË|ÇïUWee~ù%á•O îƒÓ. ðìòìÐ7ø¼~?Hp� ùÎM…[£©8 ˜Ó$q÷oæËæÌ  € € à¸@=î&X­=ÃÅeǧ–î!`XÖñ¨RÒålkZݵµÇº?…×þð‹Õ±s"‡ �ÞÐÉû¥äxA_^ž»ïZ²Â:>,ß»W\´dpçʲïÞTˆÁ ˜Ë<ó–ïÛA€{p³Q[K‹úæ«Ç䛹ã�ÁÝ·K7a®Ï+óÏ¥å…Åî˜ù’�ÊÄÝ(@ ië ­Mk;¦ ÷íÞý¹–˜Ž�a#€À-œ†¸„_ˆ«ÀÀGÇzõØ9@ð°¥ß­/™�¦H'ù¨÷‹›w¿$©@@%06UTç.O×\}^gNãéšÙاf-ÙïÞÞ£Ò&}5‹Uàø¹IõûO¾.ncnÚ¹G(=–÷“ç§Ô|QìÁð|ë¢-ƒ{Šh4ßœ©‚˜ÓÁíR*£ƒ�*ŸãRyð³R]‹Ž]UæI;^K&­”ùõejAá‡ïu/�዇,îú¦QÂ$ÐSàó!èùºÜ‘éºMÚC78çæ¼Ð+H«¤[Ϭ \ øû{Û‚o”c'�â™±¾Íù Ü}³¤"@@hŒÀþ£WÄŒn¶ Y[)e �ÙE¹—÷í$©¬s½¤¬ÓaþÆ<¯JBà”ÙjKoRe‰kX�Òéò´¾*š’/š×À‘3ãN÷?¨Î¥ÇAèpº9¨Y h„ÀlQ®•ã%ÙÆ…’—-OZ‰Cöv3SóÒíJ=t¯[¡KúñR¯¾yE|étåÄ" pR £-wÑ8&ŸT÷îÜq̈î Üã2ÓŒ�ÕR•�«mB¹¿ëº p÷W”Ú¼R¤Ôñb©kîu±± € €(ð½£ò#ÛmÝèÐÜY@ ܳ:#©´ÜO€»Dóöúÿ÷׎ÈA8ùLBmêâ½òm°ÿ`æRZŸ•Šbµ~naY/ i(@�ÌX�—Ö…`ñíâËo^_h“?ÛÅ�BV`rpÍXžØôÐ}n¸ïQÒ s-)sÃaôç,d/1º»Š@¯ÙU„ü/.«îþ³R#¡ À=”ÓF§ð_ Q&ÀÝU{�=¤G³Qê‹Ü}a¼VI™ îþaR € €4Dà{Gê p�A@@CÀ©‡f-/÷î ƒ»mª.\�UÿþÿyUÜÄ„ßìêO¨q8¢Q˜ Ú-7uà~}&¯ŒÍ‹SÚBBцp_À–Áý}»8^ruK+eeû®‡ îæX_ºL¹¾'§î(85}/¸(ö§+ÇAµˆC�³­úÆ –`dpœÖpX€w‡'‡®!¬@­Ûzƒ|SZëîàùßM��Y£¸û7ádp÷Ï’š@@@Àó�åЉ«5WœmQŠ u5³±N ,¯(µXòîR«N‘øžÍ]Þ…¬½&ð»þ²š+Ê«7u'T»%ë7ŒáÈgäþà®tð\E]÷p77y˜¬«, €@tŒ´š_ò~â�y»gGo‡‹>¿uj\Ä!XZ?\EÍ-î:ƒ»KË+z¾¤›åÌ}$ÜKâÒlÑ—j–—ä'~U[ÛÕ(PV¸×HÆæDU€¨·¨Î,ãB V� Ük%[ËöédRp_ !ûV)@÷*¡ªØL:SÅ®l‚ € €4\ààq9Cš­ñ|ÆVJ„AÀ–Áý¾�¸Ks¸ÿèˆzú•sR±èL¨8M‰.�ÜÍ�'g,�6¹1´Kc¶÷[ñ? >[€ðý»8^ruFË:ºû•7å÷B›«=÷¯_3úéÂÃUTogVíìò¯1jzáàE±Ž­E X.•T OF v–$i œÖpW€ww熞!¬@¢²1ØãÝÚò*¥ƒÜYh´îþ —ËrvÿZ¡&@R%ï@IDAT@@ >�Ã'FëÚ±=C6ÖºàØ ‡æ–äs¸ËõÿRÎÞn²¶oéáü­¬î’tJþ웈y€ûeK÷L:ÜóNï@ Þ¶ïßEwW_'ÏO)é³Ù<•%ßg'æäcýëìí ù°¦)ÓúÒ!9À½+çXg›"D£aèíÐ� ` R€ îAjÓ pvÎáÉ¡k'ðyý^�àà 8pµsS!ÀÖh*Î)ËÅš8»Ô3öÜëac@@@`iyE;?YsK¹V¥oÀ¯y7v@‡tRKUž–žÔÑ.」ۡ޺ӕᄂž?pAìІ®„j%˜Wô {�-ùâÄ4Ü¥ùͤ J“lX�n ˜ì× KÞ}4‰¢îÞÖã]ÈÚ¦ |÷ÍKb Ù„ŠÃ'ÓļH >ö�MraJÌÍož[î$À]´¡À}�B;îÏ’‰a‹ÃÛ|À¬4‡@ø¸|¾9£Çø.0ðѱ^])Gc¾ËÊö·Ë…” à£ÜýÃ$ÀÝ?KjB@@ŽœW¥’ŽÚ¨qÉ“½½F16GÀ=�Å’R&ÈÝkìÏóuãõþ«œ½ÝÜø3ØÍå3ºÈ¬jIÉC™œ)Ê…1(¹<6'Ž’›>D @Àq[öö÷léVm<¢ÂÙ|í­+bß mÑ�{Ô÷²«Ù¢p°¯e}`PôiFÁwtöv黉¹Á¾Õr ÖŒþÒ&µäÛx×âåö¹¾�üFÞ‡z¨B.Àº�O ÝGÀ�´Jnð£ê¨^`Co®ú�Ù�5ྼ[v%Àý~E@@g�­«/y�ñŽÂ-°°,¼lÛØîÁ5¨÷Ͻ>¬^}ë²XûF�½Ý-îHAhÒ–Ø“y4ÎË¥Q9À�øÏ8¿2;ᘵܻtÿ®¾p.â½ßtDag›X™‚ÉyùXçæ.5¸Þ­ØÏÉ÷»ÈÞ™×e\Òž!Ä2è¹Ï¦Š&‹; Ä\€wߘ¿>×R•�H+Ð׃oÜÁ’Òš �Ô�VdñG€w©@@üxã„üp[kí[)e �…%¹—Û6䘖˜Œ’ÿÛ}M}Z_5ÛDövÑ'*iË9Ó©Ùx¸_¸*¸·¦9ו¿Æ�@ÜlÜïßI€»«¯‡±©¢:siÚ³{ ý‘‡¶'æä÷Çv»•½ÝLÔ‹/xΗYÙƒŒûâà)ˆ„ÇÂÁOc"Q!À=xvZDÀ9Ü�›:„@ð‰Š"ƒ{Àì½�Ù€[¤¹¸ �ÁÝ¿™'ÀÝ?KjB@@×›Á=C š¿3Am/P$ƒ{MèO¿rV:.?õ·› w–h Ø2¸OÍZî‰6‹š]XVç.Ë�„­–Ì÷§ax r�™¢$|ÿ®u!]t»ÿú�œ½½]—µÜ¯” K÷=»7;5ÎËcsêäð”Ø§N2¸‹6„CÀö"#_/Ë•±lá›6zŒ€ïœ¦ó�” ¡@E‘Á=àiëê À=`òØ6G€»SO€»–Ô„ € €þ ”JeuôìxͶµ*•âìpÍn쀀k:U\Èàþn“½ý?ýÕþw¯¼é7°°±‹n"‰ì�¶›âœÁýè™qeþN¼–\kB™l¹, €@Øô×%UŽ—Òú Ñ][{Â6¤Øôw¿%À½ƒKíæÉË+ÞÓ�mM«ßãVbã^òî¬^k²íÛŽ¿Ä)@À!�””êcÔºB÷¨Í(ãA >.aÔçÆ^DJ œ À=è íÌÇà[wШ´ç)�ŒCúÏ‘û¿re…/­þ«R# € €¬Uàˆn_6Q5.y²·×(Ææ¸)°°$Ÿ¯Ø¶©ÓÍN7©W¯¹¢Þ<5&¶¾YgoçÆ‘'R¶ì‹qp?rZ¾a®]ßÇ‚„Q`Ö’½ýέÝ*Ãã)œ�Ö×�ÊÜ;tÀtÔ—‰9y„ß¿Á¹×.Šîj‹(@ 4•²pÇIhF¾Žê[lݺ“'|„ô�Hà‰id¬M@ýã±.k#¬yo2¸×LÆu ¤“|Ô×IwÛndp¿�„ € € à€Àá£uõ‚÷ºØØ §L¦åE!#©yªßຼSýmvgþêGÄ.˜Ø¶ do}¢V`Ë :5»µáV=Û íÜWµ#"€€[³‹rîß¹N.¤¤©æšÜ�cWÅ>Ä"À}^¾‘uσ¢M3 Ì÷’\›îÊEÿ†qðDF T*Ef,aˆNçA€{X&‹~"Ð@¢ÞˆKÕ„F B÷ çÊ:Èà¤yœÛ"ƒ»³_Z©=#¢­S € € à-ðÆ 9±÷××òp9›e„C ¨¯¯Ka/›û;TÚÅŽ!úÖËÉ™Eõ·ÏŸëÛÔ“T<Qä‰\AÚ2Ù“¶HÈÈI¼{@oÙ2¸gÞ½-¿!€a°ep¿W_X†»~?7¡f¼ïälÑ7&f[¢MbÒ6³ é+µg·[îg/O«‹£Þ)ç:¶½ÐF€{´_±ñÝâÒ²2¯g–àÈàœ5-!à²î.Ï}C (�„ZTS´£ÔòúQ·¼ýòZFÀdëbñG€ îþ8R  € €ø+p¨Î îdbõw¨ �f—ä —m›:›Ñ%gÛüëgŽ«¥eïGÊ›ÓgýΡ9;y èXZÆIËTLÜ͹Ï#ÖwþF¤× ë@Àm�ÙEùx‰wwçnÿЈع8doŸÔÙÛ¥W®¹‘uÛF·Žõ_8pQœ¯B6Á�¤¢a(—˪=›S—#Ð× Ü#0‹ �µ a¹VAöG ½ÑF8F±cSG8:J/#!@wÿ¦±¤/ò° € € €. ˜'M=;^s—L¶;;×ÌÆ8'°hyBúÖ çúÛ¬Uô)�¿úû£bó} ÞE�hØ>§f—¢9èUFuæâ´*.y¿©´ê8“-—›@IßÛVôN®Zô‡Á�wô„mH±éïþ£r€» ˜Žú21'_“|ìÁÍÎe‘~é�àÞ™‹þ|EýõÈøÞèÉ·¾ó ?!°!ˆFhÜ ÀÝíù¡w4\`÷îÏ™xqµ£áÒï4°¹?ÿÎ/ü„@ƒÈàîpY¸Ë§“ük‡š@@@�jŽ�›T‹KÞ‰muä3\`¶ùP†@XlþúÚÃ2Œ†÷ó•7/«Ób;:yOq"Z�ÐSž®�NÏ-ª²¹+"fË[§ÇÄóÔ‘†p\À–½ýîm½×‚ÜBl»gÍàÞ}– �Á]Zö씊š²Þ7½xPpïŠÁ|5žF›"Phç®Ï€á׫Ï~ô€ÑiׄÓ7®u“þ €@£Æ:Òdoo®PœPÂjü ƒ»¿¦•^ÜòW�Ú@@@ÀO�Ã'Fëª.ƒŒwuÁ°!X.É�/}�Ù��¦qÝýËo+7�»¼'Š>Q.�²¸›Ó³óBºßƒ¼uJpÏg"è � TVʸ¬ÞKö¤€ÅãÝÜý�ÿ8>žØ_AjC@@?êÎஃX@ üK¶w’l\›à¿þæ1µ\*{NvR¿®#ÀÝÓ&+¥ îfìRÒ¨º˜Œõû�ŽˆÃ‹z¦\qà €@èf‹rÒ¢ûv’ÖÕ ¶}&uÄà!EóòëvσÎMÛK‡ä÷Î眛0:´&�Ö4¯é5Ö±sR% p¯Ã�]ˆ’îQšMÆ‚@UæÛ{nkÙ¥+ß¼×ľ¾ àî+§*“ÁÝ_PjC@@�ºVô÷“·N�×¼¿Iö–æ‰Ê5»±. ,—äà—udpWÍóWß8*NÝºŽ„²9‹;R �–´<ŒÓ¦å–˜À´ÒŠ÷� æ¸Á±D±œ†„�07.–¼kδ¦Ô{6wy²¶éû‡ä›®:tFð(/æãxjA>Æß³Û­÷é¹%õü� â”tåÄ" ¥@*!ÿ}†r@!èty¥B€{æ‰."ÐHÜ©KÝ„A ‘$ƒ{ÀóÔ™�Á­å›Òœ,�2©¨X| ¾Ý7J*B@@�5 œ8?©ŠKBĆ¥n²°Zp(B d˶ î�m!�ÿÝ}íÈeurxJ¬x “óf"N r:p[ZŽOJE‘\ÿí×m�iü�DrÒ1˜¶ ß³½W¥¹ËÍÉW�¹AÑ–Á½ñwÜn ¼–þžœzï=^EM[÷µoŸT‹Âc¥ÌŸX;O�kÚÜÐpcÊû¦ÐÆ´F­F ‘PýH €@¼p�÷ü3z”þŠD÷€_홀[¤¹8 ¤’|Ôû9ÿ"Üýä¤.@@XƒÀ¡£uíM€{]lì„€sæEI¸¶ÞÕ‘!hKÏØ7¾sVœ7lõ  âà)¸&�k•·ÍMdqZžÛ?,·+';‰;Q€8 `Ë‚½ûNbå˜"Ï.œº0¥¦f=ËLÀt[«gQdVNÌ Ñíz„&{»ôtjÙûÔ�ØŸž|B9Ö]±¯ P­@yÅr—yµ•°]m‰„[wöÔÖ{¶Fˆzó‘*µ@¢B÷€'0Ÿ‹ø7ï€=iÎ.�$ƒ»¨ÆÒÜkcs@@h”ÀázÜy°\£¦„zTÀ𽽋ìíf2¾ùê9qNÈÞ.ÒĦÀ wìÜDlÎ]žQg.M‹ã%À]¤¡˜^�;øÐ½r!%MØ?4"¶‡›'ælî›E›f93®—o¼ï/ÞÞŒy¡ÍÆ ,-/7¶j¿] Ré¾}%k@ N¸Çi¶+^•$î^. Z—ˤT6cyöiƒÚ¥Úø àîïÜ—¥çúÛ µ!€ € €« ¼qR¾�lÛ™G„Ût(C <Ë%9øeîêôÅ)urxJœÐ^�Q’%Þm– îg.N«’ôˆ„ˆ±}ûu9{» $4ÙrY@�° ˜·ð¹EùXéƒ÷àîꜾ~Ôàîj¯ýéWQÇÍš^KR§nÿèû7z5mÝÞ}röö¬‡èlãx»i“Cà XZ*é§¥ñÚn°wÅdp÷va-±à´Dl¦š�"à-�P•>ïÖ6B`s¾ÕR'¢@Š î¢M=2¸×ÃÆ> € € à³€¹÷öÍSc5ךI+Õ’ªy7v@–,OFï#À]go?/Κ Úmå½Pô‰K�9mj‚¯¼–ÒJY�¹,g5÷Ú'¬ëžÛAìzwN,¢pZ`zAnßµ¥Kuwdœîœ;gÍàñ€i[ööÝw­W�yw^·KúqR_~ö„øR(Š&âPr�ŠêÊ _"B>2w»Ÿ ÀÝÝÉ¡g"ÀQE Ì4‚€Ë2¸8=›Öà 7MisG?‹dp÷Ï’š@@@ ~�Ój¾Xª¹‚¼êdA�hèø[qé.dŲ¸<ýÊ9q¨=í¼Š81+ÈY²¸Ÿ8?y “¥þ…ƒr€{+‘ 0@¢*` pÿ0ÙÛ��ö9�¾üÈéq±æ&Å(/óò�{tjèÿðݳjrfQìÓúB´çJ8±èÊ·Æbœî ²B€»;“AOhŠîMa§Q\Hààtôwsq)@nšÒI2¸ûú:(“ÁÝWO*C@@�úŸ­kÇ|†‹ÌuÁ± ØÜÛ2ñNO>3·¤^~ã²8kÝíb1ÈYbSŽÇ Àý›¯�W³óËž³žÒW�;8nð´a%¸/0½ ÷ñÃ÷l� )iªÀ¡ã£JJ4Õ¦?³ÓŽn2—'mî»77unnm|ᄀ[W½ý»¹™´U?=Ž�¨ t´Åûûvæ•÷& Ó$. DøÐ%fú‚€Ó}N÷.b�[×E€{ĦÔùáàîïI'Öüm…Ú@@@»@ýîöz)E�ðTä�*óˆ’o¿~A•„; 7û„çuÞèž¶Å<ƒû“–à´®\BñpÐF¿©!`…gå¥Ý;Јf©Ó�ýGGÄZ ÏÞnž: åØêÑOgºw§;9 ‡GfÕóä'Àô“½]|S �\–PË€g²;àöhà]×± ¡;*ðÙÏš[ 9Ý|eA H�Ü}å&ƒ»¯œT† € €u ¼qr¬®=Û#P ;!R�9nKe3ñN™øÍWΉ³j2J² pCÀšÁýÜä�Í"ùÿÕ‰õŒÎà.-ë:ø[‘lX�n Ì+Jºpp}^mìãQ.®Îàþ!9À½#âße',ÙÛ}`P%ºëì‹OÿÆZtô ÇÛ®þ…Ñ/¿ZS'ûeYe=»w®¥ÊmÙ "(@€{'•!!P­À¦ñõ]z[޾ªóa»®¼å™§>ÔOÜ*àÒ �[ûÆß+ÒYÑ0†>#€ € €@hŽœ¯¹ïæBs«IuÀ‚‘�2<šÁecüǾ¢alA»ÜDâåïÛ lÜß<5¦&g}kËµŠ¾üì eþ^¼–´¾zÌߊ— ë@ Ó r/?Löv§É%æò›-ƒ{GÄsÈMÌy&›iÙ³{°É³óNóæI×_ÐîÒ²^gow(_ê&ëX“@šskkò«gçáL’Ä­õÀ± À="É0¨G RN÷Õ³ûÔ/ÐÑž©göD �wס&ïBwÙ†@@FàòØœšš­=à®=CŽƒ`fˆVFÀvŽ"ã÷×uæÏñé¢ç$˜våx/ôĉéJÈ�rš®oïޤŒ "|òé!qlëtpy(@Ǧä@áÝ3àxïãÛ½á‘5:é}wBJ^ç"ü}v±¤Ôü’<÷ûÀ&¹0à’\TÃ#³b«BÐD "#`Þ“X‚Hµ¦{‚m‘Ö@À%Þv]š ú‚@Ð+•Þ ›Œ{{¶gžÆ‡ñ7D€ îþ²JY�üm…Ú@@@Y`èì„\h)ᔄ‡"B( $^¾6’lk:„#ò§Ëϼz^¬È·´+òĶ »]¾éá›–×S˜Á¿ªŽŸ›‡Ð¯ÜY@�0 ˜xfЏ‡qîlÙÛó:¸=ÊŸL¶ìí÷íìS}]mÎLéÞ§äìí…lBµñ0{g抎4N ¡äϙƵóšËIÜcþ`øñ À=ÞóÏèc.�R 2¸üÈç„t0÷ƒæâ#�äª�¯“]1gGY@@@�& Ôàå�€&NM#Ð${€{|Ÿ™þÊ[—Åé±2‹;Qy�KVÿo}*b‹/X‚ÓÌ_L !  F�¹ÅŠ~ßöîyogVíØÔå]ÈÚ¦ ì×Oá‘–w⻥.®iýļ|íqÏîÁ5ÕíçΓ3‹êß9#VÙßÉñƒˆCA´*ÂM´FéÔhÉîNÍ�A X܃õ¦5ÜH�Á=è É“.-hòØ·G€»¿/Ûã¿ým‰Ú@@@o�£gƽ VYÛžYeŠ@ TÖ÷L<3¸—ub‚7OމóhËÔ-îDAä:-™ý't ×ë–€»0âÌ—ÕWŸ;)v�ìí"  �é¢ÜÉÝ3 ÄßÊ@M.±ep7™Á£º˜¼Z“–÷Ç pÿÊ·N¨¥åÏ©Héȳ¾|tçÉsЬŒ­@¹L€{à“_©tÞ& "€€3¸;3t�&$ToZ�u“í<—+ÖóߌÁà¹PÊ‚ € €4SàèÙ‰ºšÏµr±¹.8vBÀQÛ5õlk<3¸Ÿ¹8­f–=g¬E“Ä4îßÓƒ•ï˜`vY²¸?óÚùw6ŽÀOÿùoßR3sKž#1�Ÿë:8^ðÄa%„BÀdp—–Þ= ±¾É‹K+ê�SòMŠpŸ\�Ÿ:ÐÑÞª>ðÞõMž�ë͛ˣ{÷ ‰}1Áí&È��8¬¬xß臱7kŒ‰Š"ƒ{³ði8Äp`èͨ¨D_³ÚŽk»í9Ò¥Åuî›5î$é(|¥'ƒ»¯œT† € €5 ˜‹Ê'ÎOÖ¸×õ N.6×ÌÆ8-`ÍàÞÏ î‡OŒŠs–�p`”8h ªèi—ƒºŸy5:î&°ýÿþÒ!ÑÅ8˜›AX@�° Ì-Ê=¿o'yßd�æ–>9ªJ%ïŒÈÙéϦ±Yù¦ŒG?°I¥ù"ÿÆ©QõÖiùirý�ò±Ts_]´Ž€ÿ¥å’ÿ•R£] ‘ ÀÝ.D)‘ À=ÒÓËàXE Rá›ü*D~gtæ$2¸û)J]Õ�Á½¥ê·!ƒ{õVl‰ € €þ œ¹4¥k¿�Öžáb³ÿ³A�¸+×|‡lîäq÷ë@Ϻ-îoꌲ—ÇæèåÚ»ð§_{CMÍÊÑŸ§­™@ iæfàù%9Xø®­ÄÆ5mrViøõ¡q‹(go7¯V[€û§Þ*º]°wß1±Ióû7“Š>DO ¤3¸§Óœg tf+e>ħ1Ü ÀÝ­ù 7-@€{€â›úr¶FS\ ÀÝßW‚íñßþ¶Dm € € €ÀíCg'n_YÅšœ¾à̂Ѱ±—V¼3`FKàöÑX3¸s£Ïí`¬y[ £z�k•ƒTþæ¹SooÖ&fÕŸ~õ°Ø}@Ø�“ Ä)@XX®(é 7›ÖåUgž»Ý™ªÛº±ÿh<Üg*jyå6Žk+ZÒIõñnñ. xmq©¤¾ò­b«ÂÎD "+ÐѦ/Áœ܃³¦%àHÃÁI¡K(Ð`[±ojp]{ì ^ i»Ú|wBß"ÜC?… @@�P ÔàN÷PO;�GÀSÀ†º\Š_€»9gsøä¨§•Y™'«¤hCÁu�Ëéû?ùÊaµ¸$D …ðO¾|HÍÎ/‹½½£×ö®"îF àŒÀœü€ u÷6¿:3Q±¸²;DdÕè¬üÄ��¾“ÊçÜ ýû—Ψ™¹%Ousz}�cOVFZ #«ï�e R€ò µi ÇpwlBè �Á=@ðþž¶[£)® ¤’œTðóµP–ÒøÙu!€ € €‚@½îdp@Y�@ˆl9 âà~îòŒ¼Û’RÊdèfAÀ&Г—Ï£ŽŒÏ«/<}̶»Óe£“ ê/þæM±��m ÕEövч‡ÀÜ¢,|÷v.‰»:‹—ÇæÔÅÑ9Ïî™KœQ¾Y{Ìàþ©‡·zš4cåÞ}Cb³=í e޵Yˆ›@.Ë ?Ð9¯¨î@Û£1pJ€w§¦ƒÎ ´@‚ î’÷uEøóiª6�$îµ�­²u…÷U„(F@@�F 93^sõ&\¯­UÚ«¹Bv@'l§|J1Ìà~ø„œ½=Ê�QN¼#Ò‰‚ÎòŸÏÈŸ—øÅƒ*¬[ÿçÞ×ÕÂbIœ)²·‹4 €@ˆÈà¢Éº©«¶ìíæ <¶›:oª&t?Îê2¤�fótîO~x‹c27‘¾tè’Ø—~²·‹6D[ —!Ü2ÐN(2¸ Nc¸%À;®[óAoR@Ÿ©­p xo'îrÓÔ÷p÷÷¥°B€»¿ Ô† € €U ˜ŒÌg.MW½ý� ÛZ•²ÂÞØŽÿ@ \¶`Ÿ¥¸²¸ç9-®w{»¹Gp¿puV}ù['šØ»úš~þÀõ_¾þ–¸³ÉÜ^ÐÜY@�° ˜€ai!ƒ»$Óüõû‡FÄNtDøΖ½ýC÷ ¨¾.7ž ÿ¤å 6­ú IÝ<F|ýRm�L á–Ï0±mƒÓ. ðŽëÒlÐØþ‰Ïts<˜5@ó®|&ÀÖh �ëæ.ÿÊù©­P € € p»À‰áɺ2ÇæÈÞ~;&kˆ€€í”OX³L¯eZÞ°¸[²r¯¥Mö�ž@o>¡lŸ›ðä¦S³‹ê×ÿ�ç¬Eöv+… �å¥Ì?¯¥=Û¢¶ tx±Î�ýG¯Š½èÐÜ£ºØÜ?õÈN Ûó|Ñ྾#ºö�˜:á´@k:ºïOŽÂw+õyb\�º…@£øão´0õ#à¨@±ØÖéh×"ۭμN™Æ‚@Àdp÷¼LwA© @@ª:3Qõ¶7o˜#°óf~F 2¶‹;Ë+åÈŒ³Ú�93.nšç}P´¡àv[wó$•¯?êö�]ó›ô’º<6'ö®§=¡¢<(œˆœÀœ%{û]Ûzô­DtqÒÍM™‡NÈî…ˆ¸/,)5¯ÿI˧Þ*ºþ¹ýÃêÒ¨|ÑßiûFhWi �ÀZpÚ<¹uϤIâÊ‚1àˆ#†“Î�0©t…ÿ€_ ùî“Óœ ÀÝß—Üýõ¤6@@¨^àèY9xÓVK;§#l<”!Z[œÖrIHaÚÑÚ;¾¤S¶ŽM=7Jé«`:q+ U ôél¤m–×ÌïüùËjtr¡êúšµá×¾}RýÍs'ÅæÍ߯öu\&�(@�P èVˆ‹ pgqSà­ÓãjqÉû¸5£ŸCßÑgÑÛ²·ß¿«OmZ—wbÂö>uLìGg›ýxIÜ‘""�JòÔ÷ §²\Jð�4:í!àˆg.™º�@ÐåJ’g±ŒÞA€{Àâ4gÈJáïë€ îþzR € €T/0t– îÕk±%Ѱ¸›l˜qZF&ä`cÅ‚@-&Çï`�|ùôÊø¼ú•ÿŒ*9ü¤„‹:ÛêÿòG/Z‡½­/ÉÍV! @ L¶ îwoë ÓPbÕ×ýC#âx£ü„‘Ñ990Ö•ìíææÑ}/Ÿç§¿ÀSD b! [ˆÅð›3È–•îæ4L« ÐlÞs›=´�@“’•ܶo'À=`qš3dp÷÷u@€»¿žÔ† € €Õ ­#À=©¯9“¹¸zc¶D L K„ûârÌÜuÀ±´´òèx‰†õ�õ:‹»íæˆï¾qIýÞ~ÕRCóŠfç—Õ/ÿÞÓjfnIìDO{B t˜&Q€¡˜³dp¿› îÎÎçþ£ñ p_,)5[”Üd«óõågO(é¦YóóÄâ,�PñúÎíÄ\—ÉàîÄ<Ð š @€{Ði*)2¸=ím<mIc*íâõ#¶÷tˆF×›*Ð_H¨Þ¼=zëúýçÔ±sMíç�Æç‹%õß|~Ÿzõ­+7Vyþo‚Ûmïž;±pX`^·K!ÃÛ6vª\–ƒ§ojvQ�¾8åÙ5óé›ÏÚ?ƒ=w ÁJ[€ûãoubŽ�X�oÌ1 q(—WâNüøe܃W§Eœ À݉i /P©$p˜½-K÷€ÉiN $¹…Þ××î¾rR € €T)0t¶¾à¹v�Á�¢)Ðb¹º31]Œæ …QY3¸§yØX]…À{t0¸íÁ¬&¨üç~ûê{GGª¨­q›—Jê¿û�}ê»o\²62ЙP=íüMX‘(D�Ð Ø\s÷6bá\�ÐCÇGÅ®µg¢™!|YÇÃN-H·c(õø#[E“ öî;&6gž×Ñ›ÄAS€€‡@©D€»KcWU|¨7V˜ÚpVÀr ÔÙ>Ó1ðA QQª¡Š*ÚÛZTÚöÜà*ëa3jHà^+™uûz2&Z+¤@@¨B Þw2¸W�Ë&„TÀ–�yœ÷·gµÕ’éþí�øAÀœÒ¿kCJÙNí_›S?õ¯¿®þìko¨Š³&´°öÕ³óËê¿ÿ�§Ô‹/Z+3˜ÝÖÇea+… J�¹EùÍ÷îm½¡S:}àØUq˜ù¬Xê‚ñ9ùµºi]^Ý»£¯éã37ïýÍs'Å~˜›åX@@©%}ƒi2ÁßC�¯…r²Òd{´…îp&Ã�¹ '*PI’Á=Hðõ]<þ«­ž{ý‚µÞl‹R÷n²ê[+ pXÀšÁ};î®NÝ�ãr€{T3„�ÎÊîŸzx«r!Vöï^<­f–=_6¦ë:äï ž;±�È TT.ËÝÔANoR%óA¶G[ àŽ€ýŒŒ;ý¤' à³@¥Réð¹Jª³t"z«¹e̹!� ƒ»¯A€»¯œT† € €U =;Qå–ïl–Ög~3v¾ÂODL€ îïLèÈøü;¿ÜòSkš œ[Høµ�¾|B v¯þZúû—ΨÇÿÅWÕëC#u´Rý.&ðì7ÿðEõ³¿õ÷êâèœuGÜ~ß`Jq³‡•‰B±Àü’4|×¶ž�,º]7O<±}Væ#˜7Nß §&çå×êã�lubÂ÷îûÑÛžP¶ï ⎠Q�Ž'Ý‚œÚŠªà$8m!à�ï¶M]A H}*–÷Á{:tšš �$ÀÝWõ•²|òÉ׆¨ @@ø¾À˜ÎÄ<:¹P³G.³z ^Í•²8#�Ò7±˜Ó>^§*Ƨ‹Ê¹�2°+–w‚p‚˜�x´qGoRÍ.–­ÁiFâì¥iõ�þåߨî\¯~þñ»Ô�t›Êú]nþ®_8xAýƼ †¯Ì¬ ont3™Û¹ámU*6@�� ”tÐðòŠwçÛõ>zÛ½ YÛT�Ëcsêê„÷w\s|Å'‘�ÏéÐLácogV=xwSçÄ4~ê”zåÍËb?ú;9Ç âPK�v2¸;ï• êÁŠÓÎàîÌTЂ0Üù”zWGo5 �vÖ$�ŒË•Ì5)U¿sY:ûT}l‰ € €Ô$0TGövÓ@Ž{íkrfcÂ(�ÖOD_*ÝÞóeí5W\Vù6�º9â‹« è÷ZÌMæ ~˜Ó¬wmHª¡Ëú5§ƒÔV[öQæß¿ýÓïªÏ~|×µ`÷ƒ�«íæY~áê¬úÊ·Nª/=s\�8?é¹Í­+ML½ÉÜn2¸³ €QX°doß®ßs¹DææÌ<~UìX>›ˆä¼�ÍÊÇ?ôÐú˜µùq_xú˜8/æf¹®\óû(v�š �Ëè/ä,� èO2¸¦MC¸%@€»[óAoP YPJþ"`GbÑT¡�³È±˜h™ä"ž¯³RöJ‹æk T† € €¼[`èìø»WTù[{+Ÿ«¤b3B+Ð’Jèwïs¼:è;î3óKâü‘½]¤¡ NsÃÄÝ“jx¢¢ÎŽ–«ºÂ25»¨þìko\û·ss—Ú±©Sm×ÿv v}ÿÿNÕÝ‘½Ìgž99³¨Æ¦ô¿¢:}qJ}íÛ'Õw_³¾z åZp»ÎÜNp»—ë@ J Ëòh꽩H®‘¿“ÜõGbäsiqbÞû˜Ý öñ‡·6}Ì¥•²úâ7�‹ýX_С¥b)ÄS ÛJ F�3¯ŸƒA÷ Ái ‡pwh2è Á ˜ î,A ÚI›”5í¼[€ îïöXëo¸¯U�ý@@@ V�ãçªËÔzk½9&w+ ¿#9[·Éj¾¹?Þ§€ÉÚ¹—¼3ìN¨B6©Žêlî^OQ�:j²¯{e`ïÌgTZß°21½¨ÖúI“]õ=ýIe‚ÜY@�¨ Ø2¸ïØÔõá‡v|Ö÷Lô¨'up»Ž÷\ò¹õ‘÷mô, rå³ßV#ãób“ýyE b+`n8g R I÷ ¹i ‡8½áÐdЈ÷Õ�€±ã�-)`Rš«R éÀ#íªìj(6[ë¦P ’N"€ € €€S§töÖz–¶.´ÕãÆ>„I my"úÈÄB˜†B_�@¡-¡>°%¥†t�» \[Ëb²¼¯u1Ùå·õ%Õ@'Ÿÿkµd�À‚ü ý¤ŒÎð $F=5×Ù—3¸ç³Ñû›•�>þÁ-ªÕv×j@¯�½û†Ä–ÌÍs<Fä¡ Æ-Äa<ûܧ9\ ÀÝ•™ /@€{€æy¾õ¨MS7 �Áýf�µÿL÷µR € €Ô&pêBíîæ™[ksfkÂ(�±¸Ÿ»<Æ!ÕÜçiÚk6cÿL<Ú=›’jx¼¢Î�—uöuÿꮥ&x¶KgmÏpÕ·6¶E�,,˃ؾ‰wY§y%æûíì¼÷Ä™ÏÕ¨]R×ñüjlN>@xü‘­Í›Œï·|UßûÍWΉýè/Dï¦q° Pƒ@Òò}¼†jØ´j�D{Õ›²!DJ€S‘šNƒ@M¸×ĵ¶�ÛÚx»]› {×+@÷zå¼÷#ÀÝÛ…µ € € Ð�…Å’º2&?&\jµ­• Ð’ 눒@öÚ“¼fÎ^š‰ÒPë‹7M}u±‚€ùÄÝÜ“Pý�)ueª¢.O••þød1YÛ·ê¬íÈÚˆ7� €€{ Kò‡ý¶�¸»7cJ8¯ìíS UZñž‰LkJíÙ=è]àÚ/=s\­wé¥õ±Fožó NM…H ÅŸFÀ³E÷€Áigˆ¸tf*è� ˜C-Ü$Ï‘:%@mšºY€÷›5Öþ3îk7¤@@¨^àôÅi� VÚ�jjk‘JX�Qȶʣ9{)&ÜeJT@Ǩ] tìI©I�©õ’v·dl]KçÚ3 µ^gS]ß‘P&Û-  G�¢N.Ääª�}í*—%ÆÅ×ÅAK€{GÆÅ¯­O¶ìíûÀ jorÊzsºaïSCâ ×éã ó„8¸] ©oa T §ÔçµúçË�¶Jc ÐtŽê›>t�àÖíùÕvUQ| �¾­É_N*M9&�ä1;Έ”ÁÀ×F¨ @@ø¾€y|{=K›%赞úØÜ¸žÁÝ»ogbàî=úëkk¿=ÈVeT'`.¼t·'®ý3™ÜMF÷±ÙŠš_ªni«V}E×´›ÀöOj‘˜X�1XX–?éw vÅH"\CµepïÈF/|ÁHËã�l•Š[ÿÚ‘+êä°|Þ¡_w° €€·ñíÞ.�\»nÏHîê·Ôl#Û npO€w÷æ„!Ðp�ÜJkÇJ’›Ú}Smæì3 M ƒ»¿èdp÷דÚ@@@À.pºîw.BÛe)E &1©ùk÷ ›9weF™õSO¹Hn‡h¼–£: ó`×;z“úßõ,ÃEŒ¹ ÝtÖá…¥ëAï&@³´r] ¥£dLFö–ÔõÌìægsi¡³-¡:s ²…ð…r#»tÄߊC83t9 æýTZ¶vJE¬o¢ÀÒòŠzóԘ؃|ÄÜgе¤ovóZÌ1ú'?´Å«(Ðu{÷ÉÙÛÍcòú H^ßÄ¥mYï‡@»Rù«Šw?,©�0 q¦Ù¢¯ø$Pª,ë<<·Ò'ΪªÉ˜3Ù,4A ÁU>_ÕËæY}, € € €@@ugpo ¨ƒ4ƒM0§}2úィƒeo]J¥²º4:§×ço-ŠÔïœûŠÔtFz0&ÀÙd^Ͻý”•wÆVt>"ó÷Lt¸^&x}n±¢fŠ×ÿ77*,ë¹4ÿ—t¡ùÿF€û�›ZÓïܼ�Õ?Ú”2‹9�®¹§·n˜…¤eÇ&Ü%›f®?rf\-ëcT¯Å< ÝÜØ¥Å–½ýáû6¨®ŽLS‡;«ï¸ûú §Ä> �½]´¡#�ð¼Õ›F ¬$S:Æ�â&@ÄeÜfœñ" R-©Ž²÷wG|$�%ƒ{ƒd©v52¸¯&T[¹É|Æ‚ € €%pê¢ü¨p[ÚZÞ š³mG„_ «ÿÞMVh¯åÌ¥éȸ{�›u„MÀ?³¸/°¨³ðN/˜€öëAí³:¸½Ú|(æ&óïÝï××ß»Í� �¥¿ëZ¦~�–RgË%àÝý×=l¾€y†´ìì’ŠXßD�ƒÇtÞ]a‰b¦ðÑYïctCðø#[‰àVýùSj¾è�bÞ|6­#À=¸É ¥P Tˆ|Þ4y´ïà\”‡îá˜'z‰€¯åJ²Cç�ðµN*³ dÉàn¢´aI΄ûj[拪¯žT† € €v�z2¸›¬wéˆe¾³+QŠ@¼L¶Ki9«Üà}¥âH¬çvžHL#ƒ@ÀY�e�…}t¦¢Fô?ØÞˆÅœržœ¯\û§Æ®g0îïL¨��IEî¤FˆSgTlÜ·“ÁÝÉi>` p7O³ˆÒb>3¼ž²tcŒ?üðÖ?6íÿ½û†Ä¶{ó •æ<чŒ@¹BÌUЯ}{)îA£ÓàîÀ$ЂH”+…J´¾#MXs{¸×LÆ> �ÁÝ'ÈïWC€»¿žÔ† € €²ÀÄÌ¢šÔÿj]ÈÞ^«Û#n“Á] �F7îQ_–äÕfVŽºãC�ÚLÀùøœjŸ®¨ xô{‰ ª¯¨ +ªOnêJ¨|Ä?k›¶FàvóDóT¯ÅÛäÎùܼù ‘–ïêWý=9©8�õÇÏOªïÛê'{»hC7*eÜoXõj%Á|PØ´ƒ€C¸;4t� *ª¬3¸á”·iÇœLaA dp÷W½ôÕ »Om € € "�z²·›áµµ†h�tÖ,ÐfÉà~&îmÙ´J%jÅã©{&H”¨VÀËž/_ËØ^r ^ÉœŠ¾ª3Ç›…¶„º£7¡:õÿ,  Ô²<¼mcAqm̽WÉìü²:9<)v,Ÿ‰ÎûÛµ÷ïYù5úÄž¢CP¶ìíæ Q]¹èÌGP¦´?�2î�Oº~g%ƒ{àê4ˆ@óx¨Lóç€ ¸@%™Ðî,A d3–+MAv„¶b'�ÐøXüðºXê_íÔ„ € €¼#Pw€ûµlÎïÔÃO m€"-ÇÏÉADÒ>a[o‚Û× 0MÌ;Aîa›Qú‹@ð&ñâdEí?»¢.OU” Áí·*L/TÔáá²:~¥ìdÿní/¿#Ðh�…%¹…ƒ�r!%M8tbT|"F»nOE(rÉ<ý£$Üh™Öý±�noÚ<˜†KúƒîKÏû°¾¡ÉGIkX1�a T ¢’¸*Nc¸!À‘‰ó@/T Q©à x:™T2¸(NS7 ˜‹|,þ ”=²�ùW;5!€ € €ïœ¾0õÎ/5ü”%ƒ{ ZlŠ@øÚZås?'/LªÙ…åðr•l蓟R¾X’³g®R-Å �¢~‹#°FMÖÈî„Q YItT·_ðãXÂÐç¾Î¶0t“>FT Aw_g¶l® ³ € € €ÔànÉæ@·iš �×I ç—¼>tb4úîÖ îÞ.¬E�x ˜ÌíoÔÜ~dž‚ú‘G¶ªïêWÐAí뺫»þ“ÖÙÜ×÷ä®ý3òU›Ô?yü.eN7Ÿ8?©^:tQýÃËgÕó¯_¨zbFuåLqEݳ)yíF§ªwdC" ° ÷˜¡í$ÀÝÅ)>0dÉàÞÜ„æ¾r™'lHƒÎ·µ¨O|h‹¯íÕZÙå±9õìkÃân�ѹÙ@$ø(�Ë$Õî>Š®RU"!ßݾʮ#€@xpïÜÑsêÐÁí…ºwfÇšz;IT3;ø&@|»o”×*Z‘ÎJùÛ µ!€ € €êÌ¥éšL¦5¾ÖÌÆ„^ ŸI¨å}Sþaàõeã:ù÷Rɸ¨õ×ãC �E�ýððŠZZ©n¯®ŽŒúñ�nWŸùÁ]×2µ'||K1uíÚÒuíß/þØÝêø¹Iõg_{C}éÙãj±Šš±:_VwoLªB›�«Ž†­hšÀ²÷q�éÐŽM]Më { \�XPGç< Í÷×öݤ=2#¿6×7H™§{4sùâ7�ë|ï>¦õAzÚù,iæüÐvø²­i55gÆ„@EUÈà4m à˜@s�žà;ÄG ¡SJxq‰�Ap#5'?Yh–@’È_é˸ûêIe € € à-`.þ/˜ˆ¥—¶Ô8t6G ÖyËéÇÃ'£à>Ð+¸×ñVë׃G ê&¦ïÈ¥²ªæ½áSoU?õñ]êܬZtö ìþ¿þóPÿúTùÿQüåCjv^§›·,&ièÊê½IÕ›'0ÑBEQD–ôפýº÷ZÌSò¹¯"Ö5QàÀñ«bëíúFM?o  À¼6'çåŒ'Û@/ä&Ìgà“O7Xß‘à†yQ‡¼2œ‡ó†iÐÚ¤JàÞ [ªEÀeÜ]žú†@ã,—<×h\kîÌs"%®s︓Q9+ä¦îîŽLÝ@@@ â§.LÕ5BýÄsˆ¡€ ’–“ç§Ô|±¤rÙè^ÚÐ'¸›@#@à†À…ÉŠš-ÊÁ‡f»í›:Õøµ�ªÝ3pc·Àÿï)dÕ¯ýÌÔg?ñõ›ô¢zú•sÖ>˜¼,&pçú¤è”?¬•Pˆ@HÈÞ’‰º©›ŽÉîÙ›6 ù�W-ÙÛ×÷äÔ#÷olê_~ó’:kyR\�Ï�¦N�‡R Û¢}À˜@¥R‘¿üÖ B� ‚¹Ý<èQÑØ*Šw»�¯¥¹V_ë£2jH�Á½®U·]!ƒûªFl€ € €k8]o€;™£ÖŽO „P ¥¯ôH§ Ë:Uã›§ÆB8ªê»l p_,ÙY«o…-@ ì KJ�Ò>pŸüÐõðDSƒÛov6ïoñÛ?¤þ¯õ˜2Aï«-'FÊêÒï{«9Qn�¢å¡Û6Â=¸ˆöþÀЈ8²Žlt‚ªmî?ñ±*Õäk¶{÷ ‰ó�×ó`»°²î“@IDATiVÜ‘b.КŽÎ{X8¦²B÷pL½DÀWÜ}å¤2Â!�HTppª:x^€Ú4u«@‚ î·’¬éw2¸¯‰��@@@ J2¸W Åf ð¶@Þ’Åýð‰Ñ··‹âýÝ9%�[´ÁEÑ‚1!€€,p\Ûò—|ä}ÕÿÏWÙV·žxaÞß~âÑê™?þ)õ؃›å~¿ä”çä[Öfq' @ 2ãs5¿$~îÓ÷©ûwÉï!®A˜ã½ßø'ªßýg�X�ýLw“ɽ"ݵ¡Ñª(–äõf2¸WeäFŽÉîÙ {Ò¸¶Ì±æ¢wrôk�>ñèŽÆ5^EÍGÏŒ«ƒÇåyèGTQ=› k� <ÿ•ö€¤9p@€w&�. ÐÜD'ƒ{€Ø4å)�Jòqï SÇÊ•2)oê`c@@¨Aàì¥e‚Ük]ÚZ¸(]«Û#%�”>ýc réÐÅ( ÷¶±ôq(@  �÷‡T¡äç&Î~úÉI]„D€£•�LÝDÀgÜ}µU×’æ­ÖæCYãR|³ò ¹lÎT± € € € 8}¡Îw2¸7pV¨�ptåä«ë/¼ŽAÔÙËMëòª¿'ç¹·9�3·È9OV"q�KSòß~_W›úé�¿'Ô&˜÷wåõнÄqT4Á‰ÙAÜ‘(.˯å-MÎ’í WÓ»tôì„Z\Zñ쇹·¨5¼÷½=¦‰¹ŠÒqüžKZÇüØló, j得ϩəE±¹þ‚üýA܉x[ I(ÐÛý@€{@Ð4ƒ€K¼Õº4ô�àpÎZà 6My �ÁÝ“¥®•dp¯‹��@@@ �Ódp¯A‹M@àf�ζ„’BTÎ]žQç¯Ìܼy¤~6AžZ²¸O#5\ƒU˜›[Æuà¡´üÒOÜ«2­)©84ëÍ5¨?ùÍ�«-bŸM&ûË–`qG pL`Ñ’Á}Ë@Á±ÞÒ�ƒÇ¯Šù¬tÔ*îâdÁUKöö�?¸Yuu47,cï¾!Ñ­§=‰› ÄR€@]€üî&ZÞý+¿!€@x¯�Ã,3Fnhî7©Ûûé5¸GzzC18Üý›&Üý³¤&@@ð0A¨õ,Y2¸×ÃÆ>DJ ¥¯øtX‚…^8p1Rã½u0»mî:¸“â%`‚ÛW„¬ºm:uð/üÈ]‘é)dÕŸýÖ'UÚ|˙ѲZöN¤,ìÁjܰepß<�w¯Ã1ïÑ�cr€»í˜5,l&s»íFª'ÛÙÔ¡\¸:«ž{}XìÙÛE @À]à�;¤Ü5¦g8' Ëu®«t| ÀÝGÌÕª²�P\m_ÊðC€w?¯×Q6iX@@@� ˜‹Ðµ.æÊN�Ö:l¶G�ΜÇÊï¯zá`´Ü?xw¿8øé"çtD ˆ¨€-«î=t‡êho�ÔÈïÚÚ£~å3÷‹c2�˜§® ÿâ^ à–@±$÷‡ î²M³JìîÍê•íŽÍV”tÙ0ŸkQŸøàÿ«£¦/>}\U„Càý“Á�Ö* ü‘­µZövïþ\Z,¤")@€{$§•A!`ø¼ù»ç±-6"ŸËÈàî3(ÕÕ,@€{Ídâdpi(@@@Ÿ.ŒÌÕ\S«¾´“àÚtÍnì€@ºrò›Á‹/è œè^€¿g{¯Êwû,逸EKP\_ Œ �8 ¬–U÷'ÝIž_û™÷«-âØLÐÿìbt?Ä�S�â²<”-ýòk_Þ‹’F Ì뻎��«ÏgäcVq'Ç F¦å÷ÓýÈ6ñ¸4ˆa˜cþ'Ÿ>&6µ¾�à‚¨CÕ „ÿ�¬ú±º²å%âÝ\™ ú�@`¸FMC¸!°uÏ™h¥¤pƒÕÚ‹tZßÍ‚@p÷Ÿwÿ,© @@n¸:± Š& ³Æ%ÛÂ%µÉØ�È td*)¼%ŒMÕ�%Ð(ì(&ÑÈûv­‡1½ !‰;Q€¡˜˜«ˆYk;óµç�ÁPŽkµNgõ]�¿÷«±n6<Î{¡ˆB§ŠËòëw°?ïtßãÖ¹7NŽŠ7Væt´B*ä‘JæÆÉ)˱å§ÛÕÔ)éÐ%5|eFìC!ä ŽŒ‚ÐGœÁ6HkªµÃ|а €@œ8j‰Ól3V´@2Ýš"X�tØ¿¡ËEk  ÀÝ?Ô•¾¤ú§IM € € p«ÀyËè[·½ù÷ Ïê»™ƒŸˆµ€ nïl"ÜµÌ .FÚçÁ»úÅñMÌs^GÄ¡�ˆ LZþÞä#[U”Ÿ¼û¨Þ·e¨�­([숽N„J+J­”½Ô×Õ¦Ú³|)òÖiÎÚÇ®Š çõ ™a_Ì1¤eC_»z辩8�õ{÷ ‰í˜b y(@ &�„üVPS=l\½@qe…üê¹Ø�Hà‰idT/07Ÿ$À½z._¶Œò‰R_€¨¤á)n²ð͘ î¾QR € €x\¸:ë±võUÙôêÛ°ÄG +' =àB¤!¼k½8¾1ÔY&Aô¡�( زêþÈ#Û¢4Tϱü›_zHeZå§ OQžµ±7lÙÛ7÷w¸ÑIzñ¶€-À½##«¾]�ã?ØÜÍMFÉDóÆ85»¨þþ¥3¢`¡y};E! ƒ{ð×R®à<;-"ÐTÜ›ÊOã/�Jçp˜� îƒÓÜmdp¿�¤î¥2'þëÆcG@@XU þ î\ ^— ˆ‘@gNìK‡.ªâRIÞ ä%ß¿Q ê4Y_M�; D[Àd'—2”›ë5¼G~ÒCTdÖu·©üÉ÷ŠÃ™®¨%� ›�0 -‡/[pwm.—3¸wd]ëmmý™[¬(óOZ>ýØN©(�õ_ùÖIµ´ìý&or¢­ëàüA A#1�ß bø0S-éÖÀ¥AhªîMå§q‚H&+¸ÌN€{Àà4w›î·‘Ô½be…/©uã±# € €¬*0|¥Î îä.ZÕ– ˆ“@^gÅl÷.êˆÆ—]Š,G¾­EýЇïÇg˶)îD„JÀ–½ýýïY§Ú³ñ8púå'î3›§Y\œ$™K¨^ØtV¼qÅÐl!ƒ»S¯�‰™EuîòŒgŸLbó\È3¸ÛŽ'ïÜÚ£îÒÿš¹ìÝ7$6ß—O(ü-òP€@ÍBj6[ë:!a<æ× ÅþDH€÷M&CA �dBà^ ”�Û¤Ó¼ÕúÈIUu$õ>‹?+<ÇÚHjA@@O�ó#ÞAžß´2“æ{ßMüˆZ ;'¿/<óÚùHÙ²fNÌU”�Ð2Ò& �8 LÍË‘Fß¿!6&£õ�}t»8ÞË“Åén‘‡ŠËòßöfÜ�š±C–ìíí:¸=ì—-mîOìÙÑÔ¹xãä˜zóԘ؇þ‚üA܉*D¸‹6�*HV*¸7 —zpT€¨KG'†n!Ð(�R‰ î�²•êM§„tIÒ¬GÀg2¸ûJ€»–Ô„ € €· �Ô—Á=“¾½.Ö €@¼zÚåà•o¾z^Eù:üžUw‡wž7:#ÈÅûUÃ舆ÀtQþÿÈý£1È*Gñ+Ÿ¹_ܲ¤¸››~X‹@qY¡ƒÅ�ƒÇ®Š�ÑÄí]+0O Y,ɽúÉ=;åÂJö>%gookUªÐ&G {4�@ô¢üÅÚÑÙZI¥ô» ÄI€÷8Í6cE@ $’dpú…�æ9_A“ÓÞ-dp¿d ¿à¾î/¯#ÓòûæÃ÷mPûÚű7º ¸TR_yö„ØL�ð0‡ê ƒ{�pkØ� îkÀcWB*ÀLH'Žn#P¯€¾àé�º¦Þ ÙoU�}A…�f �ÁÝ?ý•ùÄ•­P € €ÄQ`trA-ØRÁ (™–pÃb5¬QÀœ’´eh|öµóklÁíÝ?mÉž9£³;/X²Àº=2z‡6)¸Ýìsdž•m�ßco~áGïÉÆu÷2§¼E Ü0/Sé«’¹¶¡‰AÅî(¹Ó“CÇå îùG*˜'_\µÜ(ù„åø3ˆÙùÆKgÕôÜ’gSæ¬Áúç´Eœ»QÞE Ü(Zn^Ù2ÐáNGé‰:xÌ’½=›Pæ-¬Ëå)á. = ýÈ6Uho^Ìåù+3ê…ƒEÚþÎË£¢�æ T¤»^šßµÈö I÷ÈÎ-C@ À]’a=('pzjÉà´8íÝ*@€û­"õÿnn–O_Õ_/{"€ € €Ãú‚t=K¶… Õõ¸±qhÏèL�ÂSJ¥²záÀ…H3<±g‡8¾â²RS œå�(@ ¤ KòßõöMñ p7Sùã?°]œQ“Á�Ø,‘‡GÌç¶´à.É4gý�ãr€{GˆŸ3?S¬¨¹Eù3æç>ugsÀ¿ßê“OÛ7™Û»-Ovw¤V¨�Á}U#¿7XI–›w7‘߃¡>¨J€÷ª˜Ø�è転CüÕ1|ó�Ôï²-i2¸‡oæ¢Õã´y!²ø&À�ؾQR € €Ü$p~dö¦ßªÿ1#¯V_["€@”zÚå›`žyí|”‡®¶mìTܹ^ãð„¤$îD8-`{0EœÜ}`PåÛ¼ûc‚Û't�; . Ø2¸oî'ƒ»Ks·Zw—úZK_lÙÛwè'„|èž�ZªóuÛýFþ…§å÷õ…pgÎ÷‹ÊðY \áéï>“®Z]²’ò>¨]uO6@�° ñÖ™£ßÔ+P&À½^ºzö˶Ü^�ûø+@w=͉"@@@Ào2¸û-J} `lÙŸyõ¼Šz¹OïÙ)¾L@ç¬%§¸# ଀-ƒûŽM]Îö»ÑËèô½?ôÐb3<ÑB¤¡À�Å’Ü‘-¸Ë8—˜ãÊC'FÅVóYùÆKq' VtüêÕùÚ ÉÞ®“ 6myþõ êÒèœØ~�°0‡Ö(P&n`�‚µï^®Tp¯��=µG2¡ž>:�@ídp¯Ýl-{H1ÖR'û"P«@*Ùij*µv6Ûó¨±L]D@@ „Ãdpá¬ÑeÜèÊɯŒÏ«#gÆÝÄzøÄc;ŬŦÚáq9Xi Ͳ+4A ¤—W¼6×júºÚ¼ c²öSoG:]‹(@À �%K€ûÆuíNô‘N(uþÊŒšœYô¤HëÈ$áAžÛ»´rD·K1¬-z`ŸùÁ]Míî“O ‰íÚª­U,¦Ö(`âšyƒË»ÊÝ•2ïj¡œ9:�@ý¸×oÇž„R@ŸßË„²ã!ít{Ï éÔEªÛdp÷w:¹Û_OjC@@�ëêpÏèÓ\Hã„6�”¾ Ô©[¤å›¯ž“Š"±¾ÐÞª~áGïÇ2:[QóKb1 "�â’|ÃÊöÁÎØ3}ðî~q6çôÓ,¤àMq' P`±$ÿ}ôààTX›:xüªXÖìíf@—§ä×ß�|d›ê)dÅq7º`\ß¡ô�ïž›(ÈßÄ�(@�šÒ$¬Ék­'’Š îkEdB&@€{È&Œî"°V�„*q½VÄöÏe8¶ª�‹M$@€»¿°ú±WþVHm € € {sQz®¸\³C¦…‹Õ5£±1èn—ß+ž}í|äEþéOÞ«2­)qœÃ:- „^`Þr(µ}SgèÇ·Ö˜ ö[:<«1§¼g‹œ÷öÄa¥¶ îý=9'úH'”:pÌàN!óÞhn’–ŸüN©(�õ_~ö„*™G˜x,æF×Þ¼ü=ÀcV!€@ióˆ –À*•$AX�iÓnð.ëÆ<Ð  ¯W€ØªÕrá$È~ÐV¼RÜ5ìë € î¾rR € €h�á+³u9˜ î, €Àj=99°å{GFÔäÌâjU„ºÜuþìËÁGW§+j�,c:�€X°epßH€»1zð.9‹»¾ß’'Vtì®ùçµôvfUk‹|›×>¬kœÀ¡ã£båùxTÜÉ�‚Ëú8QZÌÍS¾gƒTÜðõææ¤½û†ÄvÖu$” rgA�Æ ‹ÑXß[kOT*­·®ãwˆ¶‡3Ñž_F‡Àí•J8¿=Þ>’P¬áKc(¦)ò�$ƒ»¿S\!ƒ»¿ Ô† € €jxd¦.…,9‹êrc'â&Ц/ÿJïæIuϽ>y’ö™ûUZ8Yk–Ž])+NùDþeÀ#.°`Éà¾c�w3ý»ï\/¾ fÈà.ÚPÐ\�Å’Üþ†¾v¹�’@VÊuø„àžÏ†/DÁÜXquFpÿ¹OÝ©š™Zðàñ«jèì„8Ïý…𙋃¡‡ZÈàè씓Ά*Nc4_€÷æÏ=@ X"]õ†;Pn’Í<»"ô)Ì«ÉàæÙ£ï € €¸)0f‚Û¥§˜€ÖŸúø®¦ò?ù”œ½=ךP!¼© © 4Ž@�é¤ü]»Î*ÙÍ"�¨$Èànñ¡�( àÅYeLXtæaŽ®,>!En´ðwVMf3@@@ÀO�óWÈàî§'u!€Àí=9ù´ð³¯ ëà�èŸïø>û>e{|ü¹ñ²š[Œ¾Ãí¯Ö  ÛûØúî\4¹ÆQ¼÷Žn•˦=kY^QjÉ’)Ûs'V"€€5ƒ;îÌ@uMÐÙÄ¥%¬�Ö—§äãÂÇÙ¦z YiÈ _¿ ÿ0¾úí“b;doi(@Àw�TJþ®í{cT¨Ew^ÄL€÷˜M8ÃE�`8” Ö›Ö¼lî¼÷`­M ¬IÈ‚ € €ø)Pw÷Î<ø9Ô…@”:u€»”Xn|º¨Y‚’¢â²mc§ú¥Ÿ¼WŽÉipìJEÅ Ö_4 �0 ØþvsaLÜ€ÉH§’ê¾�}bÍÅe9˜S܉,`»ñb —›WÌ_uõ-Ç’ùfŸÕO÷™µÜøøsŸº³j›Fløw/žV³óÞó̓½×8WÐwêDÀK M€»KÃÖU’¸7 —ŠpT€wG'†n!Ð8ó•†%(�ÜAQÓŽE€w NEdp¯�]@@@À*Pw€»wNk["€@<Lp{—%‹û3¯��Ì¿úùÕ®-]âXM÷ÓWÉn Q€€Ã+–?Ý6Üßž¹; oÿ|ëE2¸ßJÂï,–ä/úÚè!]0‡Ž�бÈÙ‚ËÓòëÎÜ4ùð}šÚ÷½û†Äö{Ûª%%S€> ‹á3è*Õé î­«lB1DL€÷ˆM(ÃA`5�d¥B€ûjH>–'¥´H>¶AU¬&Àëp5¡ÚÊˤp¯ Œ­@@@`U�á‘™U·¹uƒVÜÎi‡[UølÝ:ØEZâàžiM©ßÿõ=Ê„piª¢Nä.½TX�€³R÷t:©Ì?–ë›û;DŠEïdÀâö „€-ƒû†^܃˜ƒÕÚX.•Õ›§ÆÄÍ–ÁÝÜ0uuFp7ÙÛ›™ãîôÅ)õò—Eï~²·‹6 Ð2¸7BU®S?y­E.¥¢(À·ù(Î*cBÀ&�$ÀÝÆãwY3¿Üú=ê ¯îþÎñíþzR € €q0�—-n³É¤å@UÛ~”!€@|º-ÜMÖÍÑÉ…XàÜ·³OýÚÏ|À:ÖK“ubÄ’Úº7… Ð )ƒ;ÙÛß=ƒýùw¯¸é·â²ÐyÓfüˆ@ ¶÷Ü� ©±£gÇÕÒòŠg±y€Fز‰›àvé3ÅÜ0õSßå9Ö V~á©cbSæFø.ËM­âŽ €@ݶ›§ë®”E� 1o¢ DU€÷¨Î,ãB@¨r-Ñ4b}Rq±¹®ÔY›îµy­¶uYßÌ‚ € €ø%py|®®ªÌ…k@ �¬Îs–³<ÌûÙ×Î×R]¨·ýµŸ~¿ºoGŸu —u&w‚Ü­D"àŒ€”½Ýt0g¢+YÞؼޒÁ½ôöfü€€3‹%ùšÌ†>2¸»0Q��ŠÝèȆïZ¹9”–ÇÞªz;³RqÃ×—täý¾y\lÇdoŸ¸8 @@E€;/b&PQdp�Ù”3\ô#ë9•áçË b»ZâgCÔ… € €±¸26_×8[SuíÆN s�nKFÇgbàn²oþþ¿Ü£VËìlœŽ\*+!)iÌ_M w¤L»¦‡«ý�»3Š`z²y@p'ƒ{0s@+Õ ˜Ë1Ògp»¾s/ŸÓwï±4]àЉ«bò! pŸ]¬(óOZ~îSwJE�¬ÿÖ÷†Õȸ|¡¿@X A#Ü$@n¼›0ø1QNÈoÒ´O ¼G7Á›Ó"ÄH€¸âM¶ÃC%ƒ»¿“Cw=© @@�¸ ŒLȧm6­inf¶ùP†Þ=–÷o¿~A•Jeï#¸v×–.õç¿ýI•Y厡±ÙŠúÞÙ52Ãuô¾ RDl9IrY2¸ß<Íý=9•Ny‡,ê îiݬÅÏÍX²WùXmŒ‹f:fŒŸ®Ç”Ò˘<ÝŽ1�áÎ&Àáw€°©ÊH ̇-ÆFpîÜ#„Å�â¦2�Ü dÜEÛ½,qW"¹ @€ �8è˜tÕý Ü]q# ÒRk¿ÄQà®÷‰«¶¬–ÿõ'¯–ZBX­+êèÏÈS‡Ó²¿7#ãIûø]A li›ŸaU%M‹Ç§Ú†ISÌŸø"�”ͪ)«Z­W"±¹±¬zçþÆ~×Wš¯9�™BLè5ŸL^óŠ Òf39ÈïfëCóýí5V³¢>¡Üå�É$@~Èòãóï’²q#\‚„;îÅ>Âô‹¨åq¸ºZÄÄׯÜIúŠ—Â�(-át³­¸grƉ­ @€ gzÝ ÜyÄãŒ0[A‹ 4Û8¸ïé”®㋳ÄâûÖóVÉ7>ûim¬rÔ_mVÚ«„PÏÍÈÎcÑ®ŸSGå± àž€�븓ÕÜ×\˜9íîv, ³·´º� ¤fÍ‚cÜ£1²»ö÷RWU8÷¬zÂâø´y»çÕ›�ý "á×{zå@ç°±ªöÆÂamì (PJƒU -§Ù€ ƒŠ·Â'Z ïààîKJ‚@�ÀÁÝÛ�ÂÁÝ[ž”@€ �¸ès!pO¨w×å¥q'Gÿ!·ô u6Žš?þU§Û¢ >ߥ›WÊ#ÿ¹íº³rê˘DííÉÈvåê¾O¹ºk±ûL:§"Øȃ€�ƒ»�˜;�* :«�«=u zh‹®ñI[÷š¢ëo!vÈÎÁ½ÎÙœÁHt»gÄ,P]¿ºA®¾pu¨í´so¯U×õv×ö¡6œÊ!æÃGzxÕ3QˆN� !.îáò§v@ È ”pmUä#\ÝÃÀÝÛqBàî-OJƒ @€@Ü ô åîà^�¸=î» ý‡@ÞškÍE<ö«cæÄ¤´5UËßòFùÊÝ"«Zm@Y°Ð¢ö>åê®Åî¿<”–§•»{GF†'qw·ÀE<#`'ÊFླ»ÉKK"þHÙ ÜÛr;GûÛÒx–>6‘’ƒ�#–�×~â…"ºNgdnr¢eGTä=·ž#%z–yHabzF¾ÿÓCÆÚÛÂk›±Q$@ð�@�»ol)Ñ$ |:€@¬”d™Ïà€ãœ lª2ó¡‹±Qœ�áž©€G�¦C€ @ ZÆ'gdrÚFµahnE/° hˆ†h®MȱAë÷ÂO>Ó%)¥Ô®ˆùR7_±N®:•üù×¶Ë¿üp·C² 7›Hfe")Ò9”UÂ(‘†ê„Ô+7Sí´Y[‘�ª Žè ™ñ nØýŽÒvêw7•A[w%ô$@ *’³Ö×*º}«sœ„•>S;vè7v§F]ëèkŸBzå-r· e¥%òÖWm²J ,î?=l|n u÷+ë t`ĨÁÈbz(ðL"a¾8´%TE�{P¤©!P’ͪ³=79A GÖA¡¦L´°�ã" wÐÈ@€ X蜰Œ_.²‚§ºË!"X†@}UBÊÔj³Êq|q˜JÎÊ/Ÿë‘k/9mqRì¾××VÈŸ}h›Ü~ýYò'ÿü Ùµß,äZŽÖØj'÷á¹…;N¾“×Â/-SÕœ½Wžü·Œõ——ÃI:PúCc˜˜JÓâšP]i^ˆùqÝ+¢Ùï”ÅuŠni™:Q¶4ªc„P Ø Üõ„¾B =jõS¸õªõ¢W÷ 3ÜÿÐ^cõ­u'¯é��øNo<ß/¬ ƒÀ}!¾A ø ð*¤øÇ˜B`�×ÏZÔ’8|MØësOù—#KzÜØ ÜÇÔŠ9„…ªõAÆL.Ɔ͉†€o´¸Ý$\ÕR£ÜÁ1tó ¾Ã‚wî;aܲNMà+„0®VÛÑ×b¦ðö×l6%¿ÿذüjw¯±®U …ÁÙØ P0 x¦«ƒ€ÛAu€@`Ìw¯�5�Š � ¨S=¦âA§.D€ù¼„ ÷LÞ¥4@€ Ę@¯kw^bÇx·¡ëðŒ@K­YàþدŽÉg~ã*Ïê*†‚´ŽîÒÍ+çþþè}WÊ7ÿs¯üËwËñ~w«qØ1Q&ú’œUb«¹yP EWºZ›ZY–P"x-|?ù¯þ\­>—3 Ê-iEJÀNà>1…À}ñ°—Ùãñ÷bZ|‹@JŸ aUk­!…è ìÜo#p/÷îaó~¶nU½l»hM�H—ÔõÀÃf÷v}=ؤ&¬ �� pñòP= Pì¸ûÓ?,& •®\`-¦âÛwfø†–‚s €ƒ{°lŠƒ»Hl@€ 8"àÚÁ�§ºŽø² `OÀÎYóp÷ˆè¿3Ö4ÚÓÔ¶¦jùí».–Þq¡<òÔQù†»ÿlg·¤f”ݬÏA?ÞŸVzÝ陬ŒXàËÔª¢U %vׂwõ§>ωßÕ¿:��b$PVbø�M¦Š±ËyõirZÍ¢1í»!Ñð‡€žìe «Û¸›Ø?02-�}ã–ÕéCr­ºîˆzH©}Ì´š‘nû=·nu¥½ZÐw;`ÄØÞÈ…� €@ÑP,ó̤¢í5ƒ@¼ ð*$ÞãOï!Ÿ $¸¯ô™0Å;!€ÀÝ %çÛààîœ[B€ @ö\;¸ãÎk–T@À–ÀðdVzG³20nÿ^øÇ¿ê”3nCànS» ¿úæþ¦•Jê©ç{åñ�òÄÓ]²§cÐ.«oiJ %ãÓYõwªŠ—ÇY»»W)—÷ꊓnïZ_õâgD­§xño!°ÛÇ'qp_<¦“z–Œ!”ð^Ë@†è  hñ±)¬j­1%;÷öÚJ%?Œ¾¾]Ž�dŒ¾€åjVà]7o ˆ¦u5�ª•ú‡çf3ZnÐÞP�-[N$Š‹ÀËw[ÅÕ¯Èö&�£kddž†AÀ'Ü}K±ˆ,�l–;�ئ*#½pÁ;8¸{Ç’’ @€ w=“®TðT×72A δ jŸµ÷ŽfæÜ¿�°8Ò3êd3¶y‘@•:8_wÉis:ªwpR~úL—<±Cý=Ý)Úé4ì  ægÒY›kÊB)F…¿Ÿr~é_‘šp` ›+õ‡OÀVà>es‡ßòpZ`ëàÎë„p…Z—HÍ.bÞÇÞtÃÙ¢Wì 3ÜÿÐ^cõM5 ©ä¹€‘ ’@VÌÇ’ Û›ºÔܤØô•ŽBs¸äaG€@ìh¥+çû †=�°8(ÔÔcC ÔfyV›l$dõS/ @€ ô ¹¸£<ò?E@ è h_³� %jWâ�!åÚžkà™R®ÄnßÞR#w¼rãÜŸ^ð`çÈœ«û ‡d·rwáð ïŸX˜)Äo)%~OMeetÎ(ôåý¥L ß›ª¢…T�êO»¾ 5úøÜÛ¯—wÝ—š8>™zé3N˜Ò³ž Án²€! Ñð…€Ín*«Zk}©“B�°sp¯WîQzâ笺ö1…÷¿q‹))�x=Qò±íÇŒu­Â½ÝȆN�Ñ`‘ãà,ojƒ@ p�À ÐJ@;¸Gÿž2P$~V†s¶Ÿt)Û)�w§¨m—FàîˆA€ @Ëèuáà®Å[åJlH€ `"0™:)jïË*·nÓVöñúXsÏ«7ÛoDªcú9ñÆÓ›æþÞpí™/åKÊž#Jì~hðEÑû€ì=2$I­6�HÐâ¯þñìÜŸn’v Õb÷Sœ“"2P4C´0ÛJ¬¨ÝÊõ3]&í¼¼“LظÚó:áeN| —@Ê<�{¸C#zå3ûN[QW}1B÷pÆØþk.Z#›7´ÓƒHxðÑý¢'HZ=ù°¥.úŒ­ÚNŠ’€õOµ(»…N)ÁÄ£0´@à lª‚@dK²‰3£0´�(ቴ§¬M”<­„ @€ �Xpãà^�¸=û�„@®ÒJ£sB Ú{•åØt~ï{ëk+äó¾FÎ^Û”k3Ø>GMõ•rÕ–Õs§²êgO'†¦äXïØÜ_gï¸ë“¹U\ç‰q™�5‹²N•ã׿ÚQWïgúO‡–Ú„¬i:)x÷«NÊ…€e�»Î;©ÝúØF8I@‹þMwâƒ&�œ5_Ϭn­ º9Ô7�Àñ� éž[òe^ìÉ�úRñÃí�ZáÈnq�÷¿é‚%ý 2BëÚxxŸ±Ê•õ áÕ¯ œ@½uàÌ©ˆîñoz ¥oCp kj2`%37)ÜÝ`# @€ °ˆÀøäŒØ‰‹mþÒ׊2í¼ƒ€€Œ*1{ïÈIwm-rÏ'œ­Æï¾åyË+7JkcU>E‘7úY^{KÍÜßåç¶/)I;Q÷ NJ§½Óâw%zïè•ÃÝ#êoTG§—äñ3bP‰ÄôŸ³­i*-ºB ë'qÊ68éÐn-ˆCà¾ÛdrfÁ÷ù_0Ì™OƒÏa°spoo­ ³i±¯{§�{{eô“ï¶>Wè�=km£ÜpÙÚPÇø©ç{æ®ëL�hoà™€‰ ñ€@ $ Ë[Ä ëtq%€À=®#O¿!�@pif*Y†¤—”c2÷�±9 @€ `I W‰ÝÜÝP#Š‹ÀLZ¤O¹g÷Œfd*•_ßjªÊä מ)oSÂöË6· †ùñ "·ñ®n«�ûÛzÞÒGÆ“Òq|Tu�¼Ï ß»N àG'òÜa–V÷RŒÞöe¤£_d•^­m)‘rVy‰ü'`7±b|ΪAì©Q°›dYŠnò&þ ‘€^¨Ä4q¯­©ZÊõ’ „ÐìÚÂXw]ÄçHN$³2ROô „ý &ú„rk¡^&š@€ @ _®î<ÑÍ=ù!P�ôÓˆaå’Ý£„íÚ-;ßÇ—m^9'j½·×U—$mM ±®R.Ú¸bîoþzŸ›žsy×¢w-€Éù] à'¦ÍŽÎóËYî³$jgÔ¾±´lZU"Í5¼�XŽéÞ°¸{³{ÓÒðK™TŽö¦`ÇÑ”§˜âgÕ$2ýjo6��ûWë¨k”˜TÍ-"HÀν}UkM€-¡*+;÷«Ùl†Pqñu·�{{S}¥ZÉèlCÏ‚‰S“ðäaceí�ŒŒpH€@Hò½7©Ù[m&�À½`�†CÀ%^‡¸G6*�D&1#Ü÷6|É”zF€@Èpp÷vpp÷–'¥A€ @ ®úÜ:¸—ñ`'®û ýŽ'­9îUNí½JØn'örB§¥¡J‰v6ÊÝÊ­}ãº&'Yئˆh3R½è?=Áa~ТŒþá)%~Ùõ}÷áAùås=®…ïz¥�ç»2²¶9!ë[KX`>p>ûBÀÎy|ÜFÐíKc"^¨�¸ Üç&ÿ(7çcYRȬ|«´¸½IMÖi®MHk]BXQÉÿ<5«§öY‡Õ­¬Æ`M&˜Xý›ÙiëàÝûÕ¹U�ÔoÝÞùÚs¥º2\ Õÿùé!™6\ôëcÑŠúèò5q%EO…{ÀC ð€�SB'îÕYèݧˆ!�DB-j¾q‹!_»œÔV„L�»·€ÀÝ[ž”@€ �¸ÀÁ=®#O¿!°<�Œz|;0ž�µ+Ñ]>A¯ìwýekåm7o’›¯\/åÚŠ–�E´ø}EsõÜßç¯z)uV)=ŸQ"¶'Ÿé–'wvɯ÷ô‰ŽË%teed*#ç(7÷* ÈÛæH ¬ÔœaT9âNÐ’  ƒà?Nâöñé“«¢ô«óír¯òôyY¯ž¢ÿŸY£&î¬k)ÁÕÝÇUrÖ\ø*îf8¤tÓ1U‡£|®?>œ1®‚T¦®‘ï}Ýy´¯âþ‡ö7Ðl¸”7â!¡Èê›)B`8¸ÆšŠ Ü£2´H$23Ù,Xá–©$÷ XS�™€~‘IðŽ@†IÁÞÁ¤$@€ Ę@ïà„«Þãé ™ P&’'Åv'”[{Žâ%ý[Û^?'j¿óU›dMN§Kሀ{]~nûÜß}w_"“Ó³òÔó=òدŽÉƒ�í—1‡¢á1%$Ýy,-¬-•š GU³r&`'úë>1žsyÅš!93+i­Ø¶Ú¸ØƒÖöwôgæ&’¹é«F×9¨ÝÞ3²©=!µ•1€æTžy Ös¥®æº&Oºùeßµ¿ßX@}„ú·{|Äúا;tûugÊÊ–cß‚HØ{dHžÙ§fѪFŽ74DC TY´¡ò§r@ ø p/þ1¦‡X@ ›‘áÞg?¿¤ôZg„Lwo “›I•·•S @€ P4z§\õ¥‚'º®¸‘ Q% …ì'Æ”[»ÜŒ+�{>¡¢¼T^sõyÛ-çÈÕ®Vβ<·'y—¨©*“ÔŠúï÷Þu¹|÷±ò•ï?/Ž /ÝxQŒ~T¾ûxZ.>½Tâä½_}$PU®�yÖÇÑÃÝ#>Ö\XEOL™­±‹ù·©]Ú�fæ®^èÐô¤´gŽeå¬%‚èÔûß@rÖú·¬kZÕ®ÙûÞV‰;ÕÊ.¦PWeJ ?^_oÛ½¶ßí„ÞH;÷víŒßX͵}èƒD �ð d 35Ão-€|"ÀëŸÀR,¢J ›(I% ø¢ÚæBn×t �{!�_±´�»·#É=“·<) € @q%Ð78éªëe¼ÔvŽLˆ�‘)åÖ®DíãYÉ÷õìyg´Ì‰ÚßtÃÙÒT_±žÒœb%P«”Vï|í¹òŽ×œ+?ÛÕ-ÿø¯ÏÊ�•³»]˜J‰:‘‘�í%v›‘W´øÏu!p?ÅfB[˜BYZ¸k1{·:ßÈä½:Êblºì}Ú‘ûb6ù~·sp_…ƒ{¾xóÊÿÌ>³ƒ{]UtïU»†Ì“&^qÁjÙrVk^\òͬMó¾£VÇ1…ö®�Llˆ‡@ؼ˜8v ªþDÂ|@/¨ŽÐX@À)îNI±Š„€2í™AßÜ`N%¸G›šLpë2‘qŸÆÂÝ8rA€ @  Œºsp/ã½öŽ|�@!Ðb­ÞQåÖ>š‘i³¾ÐQ—êjÊE ÚïVní[ÎjÌÚac#è}ïš‹Öȶ ×È·Ù'ŸþòÉ´�2Qÿšj²²¢>º"80Qdª+ÌûÔáîÑZPULØœ€JŠì:SOªÙÛ“É{…”åFV‹Ü˼6ŽkË¡rœž4/4 Ük—ÆÞ˜Mg乃f�{}¥ù8ìmKr+mx2+“)³òýo ß½ýá§ŽÊÐXÒØ±• Ñdkl0 €|#À”ßÐR0"J�{D†fAÀ/ÙLf&ÁÛ¿ð.)7‰ƒû&DOwo™ãàî-OJƒ @€@\ �š_^›˜hq;�uLtˆ‡@t ŒMg¥S¹Fj·ö|ÃU[VϹµ¿vÛ©®äO¾<Éï}~ºëæMré9+僟Tö2®Å  Õ¥Â.lDD‚ zÒäV«bïŸ�)¥˜å¸©®%mØÚ¥Ùd‹d’^%E¯aµ?Ø5Xï#g¯m’ƺ IÍfdßÑ!¶�ž*kooFJ•Ƚ¹¶˜(žê]ðÿ¦fÍ×L«qp~@^¬ñÀ±á¹c©U*Ô1XÿE1ع·Ÿ±¦QnÚzzè;ÿ¡½Æ6èã ×LF<$@ t³êz�¥w3_$× j‚$ÑKÌ PbF@99ÛÌOŽŒº;…À=ÊT±Ü—#”[z†IÁ¹ck@€ @À’€¡ÌâŒe¥‹cøD•€~ã:¨í]ÃY�ÊïýëÊ–yëMå.åÖ¾auCT»L» 0G`ãº&ùÁo—{>ý#ÙþB�%e+Ç3röÊ"³‹¶ì-‘AÐ.îIëcnÇñQ9wCK�͉d]å6”¹ŠÁ£ØÁµ°ò~%6œ°Þ¬Ú\¦f‘ÞxÙéòÆëÏ”W]±^jª^–P¤”'Ÿé’Ï}}»r®°Ê>§_ìQnñ—¬+•ªrãf$8  ÷C=ŽV¡®º\ô!»ž{û¤ZÉaH9¸›Âûn?_MŽ wbJ·š„õøŽNS¥÷v# 3úæ†�L6a¸J¬ TLà廳€+¦:@ ÙDbFg?™äÚ*0ØTd$€ƒ»�«ý@›@€ @ c)ÑË»çÊKÃ}ñžk{Ùq$ ô�*aûPF¦fÜ(U6Ä7]±nέýÆËÖJY)B`÷4É4�*eáúwŸ¼QnùðwedÜzÅ’þ±¬œ¹â¤ãvÐí£¾â% u¯Ö»œêAஆ¾¢Ü|>)ôׇCJÔ¾O‰ÛMâèÅ{¾>×¾óµçÊ}w_*­�U‹“ç¾ëm®¿t­l»p�üÕýOËß<ð´ñ5«¾¼×âú Öš[VBä©Ù_|Y…{ûAyfß c•uUѼWí6ßw7ÖUÊ7m2ö)¨„o?²Ïx\)W“Ü[Y"¨¡ ¸"0c³êˆ«ÉdK@]e®öm³‘0îùÖÂüÃýéV«¦8 7_¹^þû»¯�³Ö6:Ê¢]Þ?þŽË¤]­ªò©/ý̘gD­Úr\µcuÇ6#¤eR6BÁÕ­µËä&ÙO»ö›Üë¬çˆøÙœeËÖ×äzâ©)¼ã5›¬Ø`ÚÎÏx½jôï3V±R¹·£í0â!‘ �ra`‰†h#Ôa�{�Ž͆€[ÜÝ’# ”€ºÊÃ7¨@;r³µ#[E kˆ‡< ±®>¡FÞЛ€ @€ò!04æî]Œvo#@Ñ" ]Ú»•[{¯ϸ�_]Y&¯¿æŒ9aûÖóV!b‰ÖÓš<ÜrÕzÑýâˆe)'”‹;wK4Dº$P]®Ÿ…[?¿=Ü=ê²ÔâÊVn3c²Ÿ}këžãÑÂr'aó†ùãßx…\}áj'›/ÙF;¾«•)þÇÿüÕ’´Si®-•*µ¢!wIÜs‡@½ºñž#ƒÆšê+£÷.²GM>5]ŸëÕ‘î}ýyÆþ•ðó]ÇåXºv%p'@Q&��tÚÙ5H”{QPm+Aà^PãEc!àî@¤�l"1“@œè�¥õŒMÞ@ÊœÊÀÁ}!�|¿áàž/AòC€ @nÜË͆›@…&06�•Ρ¬ Œ»™}ÑÆr÷­çÈí×�%u5¨àBª ˆÀ[n<Û(pTîÚÉÝÆP: VRM±¨¶9”ÆÁ}n˜+l~p…f@:žÌÊîîŒØ ¢OíÛÚù7Þt�|ò�—KEžïì>|çÅrüÄ„üËwŸ*~Á¿šã�¾Œl9�‹÷`~IÙ Ü[k–Âf^èP“„’)5£Ä"¨¹šb3wÆ"‡ÿQZØÞ­VV2…×_{†¬ŠÀŠ÷?¼×ÔD©¯JHMw#  %ÊhùU°¡x»s ¶™ÔxH�»‡0) …@ $“I)‘{!4µhژΘož‹¦“t$ÒJx†êéø p÷'…A€ @ –†Fݽ‹)+å™N,w:ZÊ>¨í]JØ>ªînBMU™¼õU›äí¯Þ,ÚE–�b'pÓÖuR_[!c©%]Õâ³áɬ´Õq~[‡Wªm„€‡»G\•Yl™jÕ„ªr%rŸÑ³K…%,Ög·BøEê ö÷fŒîÌó»¦E¬õ»×˶‹ÖÌ�výY¿fýô{¯”'žé’#Ç­WÐÇ6í½ª±hºFáKÆä¬ùkuɾtº µso¯� {»>FèLáý·_`J ,~D­ñ?ë0Ö‡{» ˆ �R„��E ÷À™S!Â&€À=ì ~L £Ü®3îÕÍšåEܬû�ƒ»·ƒŠÀÝ[ž”@€ �8›vÕí<Í&]ÕI&@@æÄs}£ZØž‘©wDV4WË{nÛ"ïPÂö¦úJw…� H ²¢T^{õyàá}–­Ÿ\ª{·ÜŽH8! ¯•´A¹…v[F¦E‹ ëâ} Öï V·ÕÊÑž±%Hµ¬X»gk7æ¨í’Ú1�™›læ¤�o¸öLù³ßÚæù¹WOXû‹�\+wþþ¿›q¸?#͵¥‘æil|ˆ ¶îjß%„C`÷áAcÅ5<¬v›'J\qþ*¹pc›±?A%|ï'%ePá+ShYQ�ª#¨± ¸% Ü (ÅÁ=`âT�Ð àéúÐK T ܃­‘ÚÒÜÙ B&PÂÌaOG Í:cžò¤0@€ Ä‘Àà¨;�{Ô–}�ãØÑçxÐz“£ƒYÙ~8-ú܉ÛÏ>½I ஓ_|åmòá;/ò\`¯¡·…Jàê Í®Éɳ­PûK»Ã%Peëâní¶n‹ƒ¯}M[�±Ò”�{¶1S@ ³ê¼ü|·3q{mU¹|Q¹¶ÿý'_éÛ¹÷ª-«å]¯?ÏØ{ýzðЉ¥NùÆ $ÌHªI¦°ªµÆ”D¼Ïvw˜îµ6Ç]Ÿ›eY¼^Aa"i¾¾ø�7…ïÞ®nšü§Ó´¸½5—FA€@¤ $Ða>>ÙlÂݲ˜�·” !¯DxþµW]¤@`>�L:“fÎGâûçtÚ|í{åTE€û*ow~ÓÞò¤4@€ Ä‘Àð¨»w18¸Çqo¡ÏaÐ.íÝÊ­½W¹¶g\>Ú{Å«å7ß|¡ÜxùZõ8W·0Æ‘:£Càôözcc¦±ä1²!Á�êr‘qÃ\ÂÃÝ#rñ¦î .¢\kV˜]°µ¸Øü‹ ÂØtVöödÄÉ1ãŒ5�òÏŸ¾Y6®kò½ÁpïVytû1éì]ꈯ+ÏÊd*+5û&� ì&Y¬n5ï»yTIVöØ Ü#æànçÞ¾nU½¼êŠuzìï&Ï�gö+ioàþÁ‡Dˆ÷úÁ†ò"t÷P5ø¦R# àî�¤ �LBf˜ììh¥3¸3KœÚàÆj1‘ü¾gܾÙίZrC€ @EDÀµƒ;uŠh/ +Q$ Ås�CÙ91š›öég0¯»æ ù€¶_¸±ÍMä�@QX¯Äd¦0�ƒ» ñ. TÏ ‰­g'êqYjqe;m…ÙÁ}2½¾vªÕTŽ dÄzT¶÷•—Ÿ.û‰¥¡¶ba‚Oß´Süÿó;×ÊÝÿý?Œ5t©k‹�íˆU�€%¤”S¿U(++‘–Æ*«$â|&0®fí±žÄ¡çqV—GgÿžRǰÁ óÑâ}·oQÎèá·÷þ‡öG­Z¾ªÃo£±�$@/HDàxòRcbò!›Aà“¡¦›x‰÷—Pðñ  nØfÔŒ6B€Òz BB$PÂ�•§ô3D=åIa€ @ˆ#�¡1ƒ­è20ÊKyɽ "’!�3ý¨tP¹«jñÙ¨¸» 5Uer÷-›å}·Ÿ/kmœªÝ”M�Í5RYQ*I Õ¢v‹Ö~<Â,†‘ŽF´ƒ»)ìÚovË5å)Æø3Ö4»5:¥Ï…ѸæL©ãþތ O:;?ÿö]ËÇÞ~YàâÕk.Z#÷ܺY¾ñŸ{,¹ö�ee]«H%Ê K>ó#õiÂô f•roÇÐi>­à>ï;2d¬L¯N¥ÅŠº†ÍïåëÕÄ—·Þ¼ÉØ— ôõпþä ±ºöf¶á��ȈÆ5Sä°øØ ²²î>ò¥hD‘·QQÚ dfÓ©Di©�5Pôb³Ü#á{ÀQz²pßý¨w?¨R& @€âE`hÔÝ»˜2éÄkG¡·¾8¡gG•#¬2¥tV4WË{nÛ"ïxõfiª¯tU™ úñä:åâ¾ÿè°ewµÈÝN”l™‰HÔØw?õ|�èw6e¥ñ^º¹Ý@OD¯f‰û�r`Öâöƒ›÷üè‰f_øèõòºmgÌ�ôóGï¹D¾õè>™�]*®Õ‚íž‘Œ¬o�÷~çd@R6«z¬n­qRÛø@`wÇ ±Ô€K0Ö??AOŠé5Oˆ¹çÖsD¯ºvøÑÏ;ddÜú™€–Ê®l@0öQ?œ@‡á””wÛ©ÉÑÖP猪$@ b¸Gl@hü&P¦Ü< ò»±*?­íg‘îÞÂç7í-OJƒ @€@ Žæîà®uX¸ÛÆqo¡Ï~ÐN°ýYOº{nwöéMò�7_(oºá,©(gæ‰cD™ÅG`UK­Qà~òyb®âõpzT[™PvQBö¥õ�«MÏ�‹6®Xš£˜3Ok”–†*±º&ÕžM“êü¨9†´¼CM>Ó+«8 zòÌ?úfÙ¼¡ÅÉæ¾m£ÝÅß|ÃÙò­GöYÖѯV‹Y¯\Ü ö’¿ÛS94cB8ìî5!+¬Hh÷vÓkyµÊ½¼û ç[e <î�‡­�º!͵ Q‹Þ �!€À=ø�Êdppž:5B \ÜÃåOíœÀ¬¸'œ= ¼mÅZa÷bÚ‚éK6z;T8¸{Ë“Ò @€ GCc¹› •aøÇ]…>{L@ Úµ°] ÜÝ„W\°Z>ð– å†ËÖª 'áÿÜ´›<ˆ�jå°l Þ3ù�Ð5dvo×Õ}è΋|¨5÷"0¬ò KÒ CµÔDƒgî=#âI€yïÁ�{mM�{ðØ©¡0?M µYTøE R9¸ÿXʯÞF¹'—W-Œ¶ÒÊâ$ÀÒXÞŽ+¿ioyR @€âF`hÔÝ{˜2–)�Û®B=  ç’ÌÈñ‘¬hqN.¡F¹Mß}ËfyßíçËÚöú\²²- `A@ÿ¦LÁFÏhÊB<l 4V›“Ÿz¾G´1‘IÇ9ÜxùZùìW~i‰@O Ó«�4 ´ÔQOd¤oÔÙ‰zݪzùÒï½ÒVHnÙ©€"_}õÙ¹ÿ„emƒY9½ñª%œ#íÜkì²’æ�ž� �°öÏÓ÷¨æÓ»O-ZZìœ{»ºÞ7…[®Z/çŸÙjJ,^¿_üÖÃûŒõµ7$±¬ ˆ$�¬p^z`2³)wVƒn(õAžˆÀå¦g}¡ @À�dMmªš[Ñ\-ï¹m‹¼ãÕ›#å ë¬çl�訩,76w#\¨­L(»(!ûÒƧf乃rñ¦Kc³i]³\rÎJyzoŸe¯»ÔyÔO�»ÒyÊqUÇ1u®¶'«F½ñ†³äÏë©«1O¬ò÷šWl�Ï}»e•ãÉ“î°Z♋LYüfOm½ª÷S,‚üwwGôÝÛ»‡í¯ùï{Û%A"3Öõ³�ÝÒÝ?aLooˆ÷Ä+# Ì#Ðñ“ Þæñà#â@�{F™>B`�¶®º™‘6ó�è¼Mùè�Yý”Ž� $¸{J–7nžò¤0@€ Ä�€[wîqÛSè¯Ú¥½W9ÀȈ�@ʪìÓVÔÉ}w_"o¾ñl©àg…ˆ8äE e£`Eì™Z24V'd`ÜúýÌÏŸ={�»ÆvÏ­çîCÊm¼_ñk«óÖ@GŸ«{Ô¹Z¯°’š5 Þ¢èêÊ2ùÓ^-wÜ´)òîÆg­mœ[ù¥³wlQ/dn5™©™¬ÔTxËtIE‘œµþÍê.­nCàÆÐW†Ñ¢…uξ8±uaìËßnÚzº\pvÛË!~ºÿ¡½ÆÚÔ9«ºÂ˜L YœÓ%nÿŒ:ò �8` `œF›¾B@xþùϨ… AÀÁ=HÚÔeE@ßVñ’ÈŠŒ»8ÜÝq# @€ p’ÀШ;÷²R^š±AÀŽ€1î8š–}¹‰Û›ê+å�Þw•<þwÊÛn9q»dÒ ��Ñ ³Ñ^o+ó KV-p7-p'ˆ¼áº3¥¶Êì†~è„swõåxžš„öë#i9¨ÏÕÅíçŸÙ*?üë7É�¯Š¾¸ýƒóÏh9õqÉ¿É%QDÌ#`·_´·ÔÌÛ’�A°upW«e„º—Y±é#qoKÊ�~ÞaÄÕÞ>KcãH€ŒÌÓ²ŒYHÈ�WRùñ#7 ’�Œ rØh4ò" ¯±>6Ê«2¿H`VO'@ de%œò½î^‘¤@€ Ä“À K�{9·uñÜaèõ²F¦²²óXFvÏÈ”Y?»¤œªŠ2ùð�ÉýwÉû߸E*+J—lC à�1�{)ç8ï@SÒK«_ú¸äÃSÏõÈlšw7ZÜ®'w™‚?ו¿È];ÁëIhû{32�ƒ ×{n;_þí/níŠ^Há\[�;R8ÓXê±M?Ë–†*)g6” �¯ñ»›W†¯ Ùq|9÷öë/]+—œ³ÒW>N ÿî�÷ËŒA3 ¯ƒ¼^-Ãi»ØÈ�€>w%€À=PÜT�h(‹F3h 0ýøˆß@Г¹®‡P»¨&^JK2“ŽWŸýêmš;U¿ÐR. �¢&ð?Ý/?ü¯#EÝG?:÷ÇØ&-vª?*¥LÄ„Àƒï–ÇwtŤ·ÞuóÜwƒTWæ÷HE;·¹ ehoÝ`#O˜Le¥£?+ƒ¹½Q.QËÜÝuË&ùÝ{.•U­µELˆ®A ZÆ&Í3P8ÇEk¬Š¥5µÊYXï[³ÏÅ'”Êú¹ƒrñ¦ÅÒ]×ýøè=—È¿=qPú‡§,ËOfåY%rßÔžÍÔiÐ:N}ŽîÊÊ„*#—ЬVWùË�^/7_±.—l‘ÙöÜ f÷©þ‘éP@ ±{‡ÕÖd3c% öű-È>Ø9bìzM…óc‚±�<ŽgÅ Ÿ+õ¾»/É£tï²ê,îhŸ±Àõ a²Ÿ ˆ4ýû&JÀÝCÕ@›He€€×ò{ãuk(ˆ@B=IÎò$ ÚSvëéÔª�@©^Êž§žìÜ=ÁH!€bG`d<%/Ž]¿óí0«!åK�ü0R.â—Ì|L)i“¥ )ƒE¼fï&”#pwƒ�š•U� Y©„˜õU QóÅ-ðššÉʨÒÉkæÃj…7¢¯k/>Mþò¾ëdu[áNB;½½~›ù_<¸�˜_\Q}ž™µþ­êN¶6VU_ ¥3:‡�«]¨ BeëßR×�úŸ!l»h�\~n»!5ØègôËž³~{âj°Í£6@ n®uò¨Ž¬"ÜÙ CÜc8ètJÜn¶J�ç¦ô[7B&ÀK"ï ƒƒ»w0) €@Œ” Øp5Úž»âF&8!ÀqÉ ¥¥Ûxq?08êî] î¶Kǃ˜xÐîŒ�ƒéVN�¹Þškq˧Þ}…l=/"—x�½…€»ŽLKÏÀ„% }«TÁÛJK6DæO`9�ûßraþ•A ¯¿æLyðÑýòدŽÙö¦g$+úO; W—Ÿ¹ëßp*�•im­e›Û>ñÂ�mòÉw^.×]²v‰xÞ>gôRj+Œ�²ZQÀ¸qÌpp�Þ€Û‰²sYÑÁ�žWÇ¢Bpo×}¿ÿ¡½F5êp¡'  �Â$�볉ÂìetZ­®5Ý=T�Nh  à‚�Œ\@# Š€€¶JaÝÅ€r�{@¤©ÆŽw;:¹¥áàž/¶† �“J[›Æ/„¤Ž*b#Ä�Ç%wƒîÅÄ›¡1·î¼ôv7jä*tú…±µkq»�ˆÅªŸg+§öOÝ»U^uÅú‚ËYõ�8 �›ªrœáŒxHÈ“@£ÍZÆO=×3çL\¦ÕÚ1ú‘Å>z½Üñ{?íØ¼\ÐÎÉãÊÕÝ‹pÎúfù„¶ßreñœ«”+¾)Ì¢„3¡Q%ŒIÒ‚ƒ»Ž�)»›]ÇmæqøØ¢“E/çÞ~å–UrÕ–Õ¾·ÃIÚï_?`Ü´½�s� (œÖƒ$uÉŠÀ=XäÔ�H@à‰a œ€µUJà͈G…“Ó8¸Çc¤£ÝKîÞ�B;ïXR �8À)ÙÝh{!$uW3¹ Pü8.¹c/î†Ý:¸óÞÛÝ ‘«` hÙ\ßhVŽd$Wÿˆö–ùø;.“;nÚ( v áEDàÙýÆÞÔšu Æ<$@À)=�B¯‚cåš=1=#z߼䜕N‹+êíZ•€ø[þ:yë§þ][^äž/Œ «äco¿LÞpݙʾ¸¦¹ÔW—ñä:YÏXP&Ø:¸ÛÍV)BQéÒî�»:¾†ôJvûË}w_VÓ–ÔûÃÿê�ñÉ™%ñ:BO.ZÙGËF äD�{N¸òß8‹À=ˆ”�Â#€À½ðÆŒCÀ ÚÁ�ý�”�° ”–ò€Ä«1ÀÁÝ+’”@ ^ŠíemP£ç…�4¨¶R �÷îF,›Íß©rh*?ö¸qëvÜÛ�lH€@¡`âZ°#¥žåîl© ð�w R$¢N@™�Mï±&7/®kņ@OM=k„vž¡¤ @±"€ÀÝÝpg²³å�°œ{ûEWÈõ—®Í»¯ xà‘}Æ¢*”RËîüdÌH )I�&FªSnŒ:÷ p�ðøÐ4øE�»_d)Q&P"ã’› R”{ù¶�Mæþâ:ò�¢�G ”§¦ž�ÙlÚ¼ô¡g•P œ’Ý ©BRw5“ ÅO€UžÜ�qÖ�²g^UZìbrsœ·Ù’�Œ×$D�ä¬ÈA%lœÈí�å�—Ÿ.pïV9wCKÑ +(.#Óò•ï?oìÔÊúxˆ]�H„€žH¡ôÚ¢Ï7‹ƒ¾.ûų=rÓÖÓ'ñ]X¿ºAþñS¯’®ãò“_wÊOŸî’'wvËÈøRm‘~î±aMƒœ}z“œ³¾Y®¿d­\~^»Äñ:vÊjg{q�‹ÈüÓ²¸7±Ü‡™œ?)»›î5ê¸FèÍJÊâX~ª-÷Ý÷v½’÷ÙªiKþÕîí,¬· (83³¹=Ç(¸F­ÁYîQÚ�  p‚2u@ j´ƒ;!0#ã¹/=Xã¨(6âøÙ¯ÁÕ¥€ �\ p.ΕØÉíqpwÇ�\pB€‰7N(-Ý&߉7nÜÛu+pp_:Ä>=_¤{8+G2’Ë­¶vfüÔ»¯�«/\]øèŠœÀ_þ¯_ËØ„ùùøŠú0ü_‹:ݳ$Ф\ܵ0Ò*<ñt'w+0óâN[Q'oõæ¹?}þ™’i%âžVŠäédZ*+Jeýªz©(/�—+¾§m¸Ü‡™÷ ;‘`k#îfrþ¤ìé2Æê+sîíƒfª-gµªcù:c›ƒNxlûQé0K2Ú˜äô˜Pü 0�2—ü¨/öe&¸Ç~@, p�å°Óé¸PÏžÆylÜ^`åd\íÔ�“Õy·' p÷Ž%%Aˆ�’®ÀÝŒw¾BR7u’q!ÀqÉÝHç;ñfbÊÝ*oÜÝ�¹¢K`<™•½YÑÿ: ”‹ìï½k«¼nÛ¸:…Æv‘ÀÎý'äÿh�± Õ ©*7&“O 4Û ÜwtyZW±¦‡ÛšÛ�ó¸ÍÊÎ<2“39¸ë÷[�u!Y†››[ô)»;ÌÁw¿OMR²YA>ò¶è¸·k:_þÎ.#¤F®�ŒlH€@¡H"pvÈ2l…ÔD�÷(Œm€@ÀÔ‚Wã"Î_ܼ¢«n÷¢ÓBìâïF �»w,) €@œàÐån´³ÚŽøB€{wXó�xãÚÁ�yRîŒ\‘#�VæfG•c{—rnwjªÊäãï¸LÞýúó¥¬ §C§ÜØaèîŸ�÷üß«ÕÌ¿õõ­œÜ£¸Õݨî¦p sXô>»¦­Ö´ ñȉ@÷ õÖ*PgX’Ñ׈¦}šª„çj–Ø|‹Ôçï½GÌ÷š ó1Õ�Féˉc6îí›7´È-W­÷£jWen¡G¶¿ÐkÌÛÞ,?cCH€ò&0i7ó&ïÒ)`1�DVFÇñ(~< .þ1¦‡° �5¯‡e±5QùèIæW¹!àÜ=€øbܽcII€âD!©»ÑÎWHê®VrA 8.¹g“èÂiiS)§›.Ø÷8øR '²²ãH:'qûM[O—G¿t‡¼ÿ� n/Ðq§Ùñ# �‹ïýÌJßऱó­uÊ�W¹— �òR‘º*ó>÷Ó§qqj,âPO× ókØJî–»€É½]oÌŠ–È|�<Ö3&“Ó³–uèIú˜dè[Þ½=J“ ¾ô Ù½]³kS×A@ 8L%ÓÅÑ‘éEVcÒTš xH€[(aR …€vpÏâàØpMLψvžLèu ‰wïÀ#p÷Ž%%Aˆ„¤îFÛÎñÑ]‰ä‚NˆÒËßSm*„ó�x£En¦Õn¨‘'*RJsèDFúÕI§aEsµüÉo^-¯Ûv†z¦æ4ÛAaèì“÷~öaÙÝav}Õ¿é3Úðß {¬âXS�Èø´uÏßÑ)wݼÉ:‘XäHÀÎÁ½²Œ +œ3ióubkc•Uâ|$`w¯�˜{ûÆuMòÚm|¤‘[Ñ{� É#O5fZÓT¢V$0&“�©”Z‚„�D"‹À=0ÚT�è@à�± %Œ€‰Lðb(0Ü’Q×´Óji¢êªòà*¥&,"€¨n�<¾¦m´æQ,Y!@ È $u7Àù IÝÕJ.ă÷îÆYO`Ï'ŒO¹¸ãàžuò†I g$+ý™Íá�ï;_s®üþ½[¥¡¶"̦S7 �#�Ÿíì–~îQ³_Ñôô–áQyŽpÙÜÍ5 é´¾–ûé3]¢�M0Šñuì é:1ndPÉ«BK6vî- Ü-¡ù¹§cÈXzM¥1É—„j’¬ò’3†�Üu‰ŒGG1þåïì4¶UßׯnŠN[� %pD ¬´T2YÜÁòh#õ¾�»G,)…D�{!�m…€G¥‰qu¥åQiã„@RYU!pwBŠmü"ÀƒyïÈâàîKJ‚ 'IÝ�¶ž,J€ü!À=‚;®ùN¼qëàÎx¹/r…G`2••½Y�vþ R»/~þÃ×ÊÖóÚÃk85C9Ђö/üï_Ë¿üÇî9�°]mu Yׂ°ËŽiþ¨¯J(»¨ýtiÃj?>Ø9,›Ö5/M$9°¸£Î°¤i'pokª¶ÌC¤lÜ+ƒ;�ë;‰cƒí»~æi�òúkÏôDŽ%wö�Ë¿=~ȘkUcBX�͈‡�²²Ò‚ks¡78!%Ü }i?\àÊ4²@ Ð ¨ÛÎ.ôÞF£ýɵ3!()QOî žH£´ó„#…@ˆîîFœó®;nä‚€—œPZºM¾^qp_Ê”˜â" =5´¥s(+N<¨(/•ûÞv‰|à-J9Š�âÚ!èMQ˜QK3|ýß_�/~c‡ŒN¤–í«oZÅ3ÊeA±�oJÔ˱†ê„ MXO¾zîàwßèǧ`}ýsàØ°±Ã•eÁ‰ƒ��ˆ`‚�À½µ÷ ‡l÷áAc•A.²Ô?–•)›KŒß¾ëâH­¼ñOß{Vf­fQ)šÚdþ´&®ƒŒ; (@è/‚´L"ƒÀ=xìÔ�Ð p}h‚'�ÈŠáñ]ðm‰K�ÚÁ��0 ”é§÷Oä+hñ¤@G!©»!Ë8Uƹ+ž\ˆ5�(-á]H‘ïqibÊfmuÚm”�¨žT®í}™Îa7¿úÂÕò¹_#g¬iŒz÷h ð"íNú͇öÊýê¯opÒ—ªr‘óÖ”�(áb# ÔWЏ[WðÜÁ~yó�g[' ‡ºûÇe`dÚrk}M_�:Ã’ÍLÚzâ‰Þ¸µwKh>EN%g¥ãøˆeéúMcuEpïíÜÛ×­ª—7^–e;È�–oþç^cÕ+ëüþ�tH€@a()ÅÁ=è‘SžŽ£A×I}€@ø¸…  h'�–ÄxBÌ oP *L¦Ò1è%]Œ2DuÞ�ŽÝƒVïj¡$@(6IÝ�hFÛÀ _p�àk¾Ç¥q;û9›&!p·�CRè´ãæáþŒô�:?o7+…á¾ï*¹ã•çÜ Cï €l ŒŒ'剧»äÛ�î—Ÿüú˜ãt¡uʹý¼Õ%¢k @ tµjÃû1íàN€@¾víï7QWœ0ØØˆˆ&Ø-„�ƒ{°ƒ¶ïè�ñ<¯ÅíAMVëSîí“6îí¿s×%R¡å¯ýàÑ“Lam3³ÖMlˆ‡@¡Hè¥�ÈÌ–âà(q*ƒ@4 p�Æ8Ð J ¡î�VHe’²{2@ 4¨'Nô%ì*´ E¿²ç–5ì‘ ~@…E!©»ñÊ"pwŽ\p@€ã’H›ä{\ÂÁÝ*QM@‹Ú)qûlÞZÔþ‡ï»RZª ºï4ÅL`6�-ÒüÉŽNy\ý=³÷„¸YÅdeCBÎ^‰s{1ï+…Ö7;�ñs‡æD�h• mT£ÕÞ]ûOTÇ¥�‘�ž0i mM€3±ñ#~OÇ�±ØZµ FA?<¢î1LaíÊ:yK„Vܘœž•¯~ÿySs¥µ.¡œï�É$@J�{ðW’È p;5B tÜC�à ”¦³i&  ~÷@ySÙRˆW–2É'&›Í*‡9$îù0$/ �¸ÀÁÝ݈£owÇ�\pB€ã’JK·q#î›_ÊøÔÌü¯Ž?GȘÎq›Ù°¸ L«]ù@_F†'�»¶¯_Ý þ¡mríŧ7z�! oIÿð”ê9ù×=";Gä°úÞÑ3*³³faÙr]Ô�ÍÎh+‘5MtçÅRV±Ã7Ú#ÃcI#šµÍÁp36€@ÀJ-àK¹j&PV2‹ÀÝŒ‡-îE;´t f™Šñª’ió¤xN ™2/Iæye 8¸[@É#jε±”›Ö<’€@ì”Dç�KA±×+§ 0 Ö×|�Kã“nîܸ1rùA@»¶<‘eðì(”©|Ë…ò;o»Xª*x%áE†@Z]�êÕ7´Ù�›Pªöÿ %À*WŠÚ ¼ôd¬édZ&ÕL”i¥›TºZ¸{¨kTv ¿$jw{^²cÑZ›� +J¤ºÜn+Ò íânš õìÁ~îá MÁ׬O;mܹ¦7 òLÚ|žÅÁÝDÍŸø=GÌ÷šÜõ¤ÎAó�ÆÚözyë«6úÓy¥ê �ÿøÝg�9«R_Åo߈0� ÷ÀGoª¢�{àÔ©áàirøc@ 8�þ5‡'×ö­¼Þ8W˜T/“âoéë…Êè‡@pL€s±cT 6Ì×)yAa|�ิ‡ã/ù—Ü qpw�•==Q†ÐŽB]M¹|êÞ+äí¯Ù,o!c#�h�úáîõ7:çR®ÿ=ù}DÜN2ò¨i¢>õŸÙâªÚ™tUcBÚêxzµ³Pޝ´ƒ»¨ #Vá9a§ÕöÄA`>ÜÛçÓpþYO¢4-à×ÒXØ (Î[\¼[©É~z2 UÐ÷¤•>«‹ô½Æñëã³nÓ…Ûä ×�iÕ¼Pâôø/?¸ËX·žÐÌÄ?# PèfM'¯BïXdÛŸÐîíæ“DdÛMà �| ø| šoóÈøH`\•�ÀÝGÀó‹žFà>ŸC PZ b/±s¿ê%MÊ‚ %%(ÝŒt¾BR7u’q!À$Xw#�·ƒ»K�;·tîÆ‹\ÞèÊÊ‘�Œckí|ûÇ¿ù io©ñ¦”�EÆÕ±T‹Ö;^±¿,h×w‚ÿ”©¼´7(a{C‰TWø_5@ÀKvÄÇzµn†wvîï7f¬¯2&Å>ÁäÞ®Á´6.ÈD_[™Bu…ÿï;úíï9þð½WFjòì£Û�ɾ£C&d²¶ÙfÆÊI€|'�Nû^, �åB}¾@ >¸Çg¬é)PÓÚ&Ô-ÕŠ‘|ñ�€^*–�0 à–æ-ý, wo�R �@ßîn�ÓeãE€|!€ÀÝÖt:?£ ñ©TÎãÞž322xD ¥^ÖîS®íÓÎöû5mµòÙßÚ&7_±Î£P DÒêÌ~%úõž¾¹¿§Õ¿:‡A�ªr‘æÚ“N¤MÊ�”ÉW! UzB ÂæíxØ+=xÒA �À.�ûÉ•BkZ¤+ž±¹Çjk«-ÈÁë8n#pW×~†1µbTÿ¸ù¾Cßc\µeµŸMȹì/?¸Ó˜G_7µÕ!p7"E@`ÖæüUÝ‹\Ô�{äF…A 6·ðÁ4€Z �p¨Û)íàNˆÀ$÷€HS�‰âwñùº6º«•\€ PȘlænôppwÇ�\pB€ã’JK·É÷^`Â…ƒ{)‹€,b|'0¤DíZÜnç¨9¿÷¾þ<ù½wm•ºjŸ•/ó+åsQÐì;ööÉ%d×O«ÏÚ±�<-ÌÒN×ZÌÞ¬þôwŠ�€Ýµ•›kµb`Bò' ïž=`vp¯«Bèj¢lw½ÙÒˆƒ»‰›ñv÷*ŸÜ÷›Åíz•ê?x÷~tÙu™Û_è‘í/ôóŸÖ\" ~öF>$@ ØMÐ*†þE­ê�ŠÀ=jƒB{ î�¦D�÷…—0¦*K¥vOí-siG±�Ò @ÀŠ“Í¬¨,—¯�tùØñ%ÀqÉÝØçs/ �iSÉÜWxãvÎÝX‘˵›JÇ@Fº†Ì“ù%·4TÉ>z½Ü´õôùÑ|†€#Ú�}Ÿrg×BvíоcO¯ìq”—�¼!P^*R­kznÊüµ˜‡voSJ4 èë«´Å‚aÓ3¢Ï…ˆ£9nQn•>éýÇ*ècm%ª +4sqv÷¶FÜ�à|HèèÇÁ}@9·�N™ï?î¾õÙxz“=v_ä—Üe̬óí ¨Û�€H€@‘HΘ�[EÒÅhu#‹À=ZBk n¥‚cMMˆ�¬L÷U��Éàh2°º¨V´»Á;ùˆZ¼k%A€@!À)ÙÝhe,îJ" °˜÷ÅDœ}Ïç^`bò¤`ÊYM/oÅýÜË,øä/m’½÷xFÆ“Î^Ò^sÑùë�Ý +[jüm¥�qu,üÉŽNyä©#òØöc2¤Û£Ê”V aÝŠ]µPVÿ)-ÿÜŸþuéï~ýPÿé6—è¶«†ëu\™³/²ëþ G&�»þ}N&g¤–% â¸[äÕç]ûÍîíõ¸·Û²�±™ÜŠƒ»-;¯�ô˜î~õqWO°5…šª2ùÝ{.3%‡¿÷È�º–=j¬{MS �tH€@ñHΘ�]ÅÓËõ$!æ“T„šIS ï p÷ž)%B PàààHõ�LXUA`)DuK™äƒ›l>ôÈ @ ž’º÷|„¤îj$âC€{wc�Ͻ€ÛÕÝ´‹¿ ô�fåà‰Œ¥›íâºõ¤‹O¼órùà*áêóáûRÇzÇäá_�ýü¹ã2;ŽःnbNè­…ÝZð­ãÊÔ>=÷¯þ¬ãÔwý¯ÞƯ]ü%Á»uéϧDðYõaá÷—Ó5ÙSbõ9ûœ�ý¤€½T}Ö"v¿Ú»tT‰�@a°»¾Ò“¸öø†Ñú]N«­«4&‘ ̤ՉÐZ›ª )DûAÀÞÁÝŸëþu2•2÷æƒo¹HV4GËÉÿËßÙil°>¿¬nò‡•±R �PL#p”{B²c�VHe€@d p�ÌPÐL ¡Ü �èš ¬.*‚€DuVTÜÇ!¶sÏŽœ€âJ �ÒÄÕÐç#$uU!™ #Ü#¸ì|cN. ¤•Îø`_FúÆÌ¢ù-8½½^þî7Ê¥›WÎ�æ3H+…ö3ûNÈ#¿<"+wKírTТôꊄh—Qýïœc¹ú\¥>GÉ­\‹ÑõßÒ`¹t3b �¼œ\!Çúܧ¯Ù8Ëå…7–™ŸÞk#pÇÁÝvŸH¥ÍÉ­�Ñ6›[Zø)£)µ6l;51Ðë^ê{‘£6îíz¥¨ßxÓ^W›Wy�}ãò½Ÿ4–±ª1ZלƆ’äM`Úî–wé°˜@6‘@ྠß!Üc2Ðtpp·€âWT׉I¿Š¦\8"€xÅ&Ç!¶sŒŠ !@àEœ‹Ýí ZE€ü!€ë²;®ùÜ L(±”›`ç0ê¦<ò@à�ñé¬ìéÉÈ´Ã]ó¶ëÎ’Ï}h›Ô×Vœ*‚!ð� µ#=±£kNÐþØö£2àóŠ–µ•/Š×ÕîX]®>««Ô¿Ú‰�@`9v^Ü^³-W'éÅK`d<);ÕÄ.S¨CànB3?c+pÇÁÝž‡‰GŽ�KÓý�Cåào.ùão¿Ljª¢%iú§ï=«V½²~^©ýMNkR³- €@,L%gcÑÏÈt2#Ü#34ÁˆÖÕ`°}§6Äš€ºí÷çV4ÖX��[fãN#"|&pÒ‘ÆçJbT|>®�1ÂDW!@`„¤ó`äð‘sn°Ø9`âMŽÀ^Ü<ŸãîË�CY9¢Ü³ÖÚŒ•VW–ÉŸ~ðj¹ã¦M³­hbÿEï?O=ß#<¼W~ðäañë™­7(q`½úkPF®uJÜÎäŸØï~€@^¬WP8Y¤_Dz¼LæHxrg·˜&ÂêE*˜|e;~vçÖFî¶ðÇŸó¸O9µÉ^ÔšRß,"Â×|è´÷)×öáI³˜d~ùçŸÙ*ÿÉWÊYkçGó9æz&äÁÇÈí;1”[LÚ�½AéÙê«õ¿ åÌî¶$òA°& Ï‡¦PWÃJ%&6Ä[x|G§u‚Šm®åbÞçÅ„™´ùº´­QÍl#BÀîšÎ�k1=ÙÖ`„>×ßÿþž+Ô„Æhý~¾öƒdZ+ó am3îí4DC è”””¨(l.(‹®ÇáwH=Ê6/5~óh à#î>Â¥hDš@¶dPÄüÀ Òm/ÐÆML¥¸èØC³Õy;ŠùˆZ¼m ¥A€@¡à\ìn¤8çºãF.8!µÅNÚ…mò™x3m§¤²é\ÄÞéÛ´”¤¨R¢v-n·sɜ߇÷ݾEþàÞ­RQŽíè|.qý<3›‘Gž:*÷+QûO~ÝitªÍ•�>Æ5Ö$¤Q;´ãΞ+>¶‡\HΘß�­]Yç²T²Å‘€öÂy\�M¡Y�ãöLצee%„{v^¦vt›uƒUåÞîÇɬôŽš�ÃÛ.Z#7^vº—ÝË»¬ÉéYùê÷Ÿ7–ÓZ—�jæGù��b#P¦—“™bëV¤û“ÍdÇ"Ý@øF�»oh)'�È¢ovŒ&]:µÛJj+Vˆê¼Ù|D-Þ¶„Ò @ P°šŠ»‘J«•�€€?¸GpÇ5mã.¸\‰©wÇ4Üö—#Kúr´ðªC9$v ™E$óËhQÖÙ_øèõrÓÖh‰Jæ·‘ÏÁØwthNÔþåØ>8:íIÅêÍT‹r´ÕMJøÇDO°R à�€v 6 jëªË¥w‡$ÙL8Ø5,Ýý–0ô¢Y�j5‚™€š?'¦s[Õ5) �™Ùy�bçà®�ž†Ž~ûûíÞµ±ÿæC{dx,iä°¶™ßº (BeeÈ-ƒÖ„ pš9õA *8âFe$h‚&�Q÷¨ÝÍ àú&¦˜Á0rª›GñÊ<|ÄMÖˆ@ f8»pι N0ñÆ ¥¥Ûä3Ù5eRR-­fA ÂÏ8ø’#ý8jïñŒŒ+—D'áå–ø×»AV¶Ô8ÙœmŠ”ÀøäŒ|ïñƒòÀÃ{å™}'<ée]¥´Ÿ¶×)·v �°$m^Õœ¦ÜÛyuÖÈf½�ïè46¼A�ïJKŒÉ$(³i3†¶&µ´ !0v÷ª ï®Ý†ÕªRze)Sxó�gËgµ™’C‰ŸU31þñ»ÏëÖYê¹¾5ò!ÅH ”|àÃZ’(ÁÁ=pêT�h@à�q ž@¢dH͉¾Þ×81•ŠqïézØJQDx:Úå‡@È…BÒ\h½¼-÷—Yð ^Hp�à i>Ç%î®�“)'Ʋr /#i‹èçŸxçåòÁ;.TnÚÞ Xòh>YC Ð?<%_ù?ÏË×þý›ÈïY¦>Í4*wöVåÒÞ¬þ*yˆR% `E 9k~¸»V Ü È…Àã;ºŒ›7«ó Áž@Êf…¬–Æ*ṳ̂zF`rzVú'-ËÓΊRˤœ#õÑ÷°�{{EyéÜ=IÎûœá{O4®Ô «^ÛÂoÝç! xD�@£côzÙ¥î‘ ðHÑ_¾”�è(Í Jš›­ hB9 \c½%ŸÉ8Px[%¥A€@�@Hên󒺫‘\ˆ¬îÆ:ŸãRÊΞЦ9h�mà�dI@ GŽôg¤sÈ,à›Ÿñôözù»OÜ(—n^9?šÏ1"ÐÙ7.ÿðÝ]ò͇öJ2ec¥º -jo­KH›úkR¢>Lí–F2  �i›W5kV peP ´R}Îüù®ãÆÖ7©•Köa°‘@IDATì¹jkÄÁÝžžw©ÇzÍšÁªrïô'F³2a³²Ô{o;_¢6ÑH¯âöåwaתUŠ˜ÌbÄCŠ˜€wÇÆ"†äi×Jeæ“•§5Q 5Ü£6"´H¤f³¥åÕF5šÀîì!@¼â-ü|D-Þ¶„Ò @ Pp.v7Riõ‰øC D¹°r'�Ͻ@rÆÝDYÌös§8çÐní{{228áìzÛugÉç>´Mêk+âŒ-¶}ßtXþþÁgä{?9¨œþ�í3V°êª²ªA ÛëRÆùÅ q€@„àà¡Á(ð¦lßÝ+Ó©YË^(#j©SÂW‚=�k|s™Zqp·‡çajÏÀ„±´*�EúRóÈ€ùž¸¹¾R>üÖ‹�í+áÑíÇdßÑ!cõk›ù�á��"&�ÎòÛzxgӉѠë¤>@ <º�Fgh àœÀÑ'ÛGÖ^?¨ßZpåå[^[Ž�ç·¬o^•“9öpp÷vÐŽ @€@.’æBëåmó’¾\ Ÿ +L¼±¢²|\>÷);{B›ª¸ÛÀ!i�¤½Ð�±uE<•¡F)U>û�«åŽ›6 «œ¢ŸŸÞÛ'÷í�òÐ/ޏît™î­T‚öv%l×Ε@…B iãà5çàBa×v>¾£ÓØu½’ ayv·H­M8¸/OЛ-ú'�Ux¤(êV«KéûSøÈÝ—HC'Ý~ùÁ�¦&K•òÔ+ �ø˜I£zÔk’3#A×I}€@4xt9�ÎÐ @ ŸQS¤GO7nÉ%Ûº'02�ÀÝ==ræK�{¾æÏ˜M&nÈ7@€À‹’ºÛ¸»ãF.8!À=‚JK·ÉÇáØ­ÀññÒq f)�±é윸ÝN$t*×–³Zåï>ñJ9kmã©(þ�=WÿÉgº”°ýù¯]Ç]÷¸¹ö¤¨½EýË×É„H`,i$­YQb˨ºÐ<þk³À½�»£á´¶6T9*ƒ�ò'Ð;4e,¤¢,·¾G96d~±¶~uƒü·×žglCX Û_è‘í/ô«?­¹„ÉÂF:$@ ¸ ¤fÌדÅÝóÐz7{à—;ZíT „J�{¨ø©¡@àà Ž&¬�ª °�¢º…<òý–�kc¾u“€ “@õ�«�Càî ™ àˆ@Õ´#N‹7Êç¸äVàÎ)dñ(ð}1�cYÙß›‘Œƒ÷«ïãùýwm•Šre¿Mˆ-lÿÏ_tÈß<ðŒ<{ ßUŸµ;e{C‰¬Tn핼UrÅ�L€@4h÷à)ƒ‘~†~κæh4”VDž€v¼ÞÝ1hl'îF4 ì&g¶5!p_ËÇ/vî^Ü6ÌHÚ¬oŸ»?)/+ñ±‡îŠþÒƒ»Œ5½’ˆ'�)îA¼~˜áà©WÐÍ¢>@ <Š ‚2u@ ºô“—³¢Û¼âjÙÀètquˆÞ�RžŽW>¢OBa€ P0˜læn¨òqJvW#¹ 8¸»ë|î’36oômšÃ\8$ÉÑ�Œ\þ_µR%ÿõÇn�×\½j1"°k¿|æŸ~¡œ'{\õZ‹óÖ6'‘ž+|d‚"H`xÒ|μhÓ ©¯­ˆ`«iR <¡VE1…ÚÊ„T Â0áYo'poi¬^°-_ü#`'pÏw_žš9>b>ö^ºy¥¼nÛþuÎeÉ{� É#O5æ^ÓTÂjFF:$@ ø L%ÕÒ„ d¬Œª �ˆàÖ*bBs (�lv�u³‚#Þ7h^Þ-¸VPS\ ^ñvä³Nlñ¼­’Ò @ À 0ÙÌÝæ#$uW#¹ —Ü�u>«9áàîŽ9¹¬ èÛÒ}=é7‹ENå\ÕZ+_ý£[dËY­§¢ø·È ô LÈç¿þ+yð±ý®zÚV§„í- ©S= �b"`'p¿æâ5ÅÔUúâ3�Çwtkhª1&‘°ˆ€�À½­÷E¸|ûÚ74i,;_�{ljŒè…LáÓï¹2’r…/g§©ÉRªÌæW7q�lDb@`b �{°Ãœ@à,pjƒ@¤ p�ÔpÐL Q¢Ümî(nN±W×=`~8Pì}§áÀ5ÖÛ1ÈGÔâmK( € …@‚ÕT\ î®°‘ Ž$°wÄiñFé´ûç(ÜÓä»[©Y‘Žgd|zùýñÂ�mò•?¼EÚ[PZ¹å]Hù&§gå¾»K¾ü�]2•T;JAŸVÖkÇö©ÆÀ8rl ;�ûu—œVH]¡­!ÐïžØavpoV+ œ˜±¹¿jÅÁÝD¶ê4¿Ã®(u¿?Nde@ý™Â«_±A¶ž×nJ-¾³o\¾÷“ƒÆúW5&¤L‰Ü €@| Œêå)HôXUA#€À=bBs (�„rp7ßSÚ”8TÖ}b"ݤ�%€ƒ»·ƒ›¬·<) €@ $u7ÊœsÝq#œàÁ ¥¥Ûä3ÙÕ­À�¹KÇ!Î1ãɬìîΈíòë¯9C¾ðÑ륺’מÏècÓ¿þø |îëÛE»·çôW^zÎÊBëí ‰Àó‡dptÚ²v}^m¨v/¶,´ˆ#M¿ÉŠòR©­./âžG§kÚ]Ýnòr—·éŒÈÁ>õ?C(S6èpïVCj¸Ñÿô½gÅdº¡ïÏOkBÝîQ;Â&��±ÉÜ&”‡Ýâ¯?ƒƒ{á"=€€k./G]×GF@ BÔ ë �X‚�ÉdZ’Êb«2ߵ܂k25Ä+Þf>¢o[Bi€ P(ôu·>#ØÎmÄL/“r+…­!+¬òdEeù¸|ŽKÉóË}»š+;:ñJÏÊÞžŒdVÜw÷%òÑ{.öŸâßG¶¿Ð#Ÿù§_È®ý¹ši×É5M Y­:JCF€ Pô†ÍÅrå–U¢µ8!ð¸�{{£rog?'EfÕí‘W[…ÖÆ*a¢¯ïãÆ'S2­—ˆ²ê°èVKplÐ~RîÛ_³YÎ<­Ñ¢Öp£ôä•oüh¯±zÅ#^õñ��X(W׌éŒõq3BèdBpp;UB 2¸Gf(hB 0çàîö¶4„öA•S)îE0Ž…ØîÞŽâDoyR �¸(So8SNiqâ Ÿœs@b¸$À=‚;pù—Ü:¸—`çn°Š,WçPV:ú—Ÿ$¡Åy_¸ï:¹ýú³ŠŒÝYLàXï˜üÙWŸ’ŸŽL™Ï¥×^‚À½ˆ†Û×®ŒM¤äW»{�u4!p7²Yœ0“6ÿ&[”š �¾Á)cEsNcª9áà‰¬Ñ�_çúô{¯”¦úJs!¥LNÏÊW¿ÿ¼±öÖº„TW“I€bB ¤„Uê’ ÷À¡S!¢C�{tÆ‚–@ pYåà®–r ¼Þ8W8©î„AwFo©ç#jñ¶%”@…D�{î£Å97wf䀀SÜ#8%µp»|&»ºvpçÑÍÂAˆÑ7¥c–ÝÇ32j#È;…ãÜ -òÕÿë9mEÝ©(þ-B;÷Ÿ��~ñqÙt8§Þ­lHȆÖÑîí@q$ Ï¥¦Õô±sÖ7Ç }vAàÑíÇd6m=Á¬R�gk¿:¦ª¯uM¡­ �»‰�×ñ}ƒ6î.4œ½jb®ÝýËU[VË[nÜèu7<)ï›í‘á1³+óÚfnÎ=M!(p%,µøf¤¤?ðJ©ˆ gFf(hB P’” 7bA’Ÿ˜š ²:ê‚ÀK¯¼„“Üd=áH!€âF ´”kï\Ç<!i®u±=âF€E%Ü�x>oR3ÖB˜åZÂX-G¨8Ó'SYy¡;#Ó%Ý|Å:ù›OÜ(uÕåÅ ƒ^‰ž óÅoì�/+×ö\®�ªrf[Bꪸe7‚âM Üì½í¢5ÿ?{çoWUåÿuï}½×ô^$!¡�¤ˆ""ˆ:ÎXPAÀ6vÿ:â8ö:@DÀ2Â(Mˆ3@€ R’H éy-¯÷^nùïýB’÷òîÚ÷œ}Ï9÷”ßþ|’wïÙmíï>÷ÔßZ›°j°÷3£ä¹¶xy!η,œ$*�{EI~’Ød�~Å»ël“w9§ÚùûÞ¬¬0}熳È�«”EÅÊH·Ý¿�E\*®«‹qMÍòA‰€[i¸îk"„îî˜ X!�{F°£Sp�ìXVg,ÄßdºÃJY1¨xH௑b4n#€ôÖÎH:¢k-Ak  ^"€îæg ç\óÌPŒ¹ñ�²Qã3X.žÐŽ2¢Rp(Æ„©RÀñiV×`‚vŠÈíLpÐI£¾îÝ«èË^C¸Î˜„ÅW_^ÝÓ>µ}w]—áqå _‡Uaª*‚ÐÎ04ð-¹½½�¸Ÿ{òlߎ³–Àðh”6l­g­Äy—e“,Cu{„îɈٳMµÒ˜Ygë!n�*"óÿ«¸wY:·Ìž�¤ÙêƒÏì£Æö¶•¹¸®fá Fqð20á±1Ü3€]‚€[@àî–™€ �áìDg,š�ŽÜeîžýÌÜ­å±�µ<Ñ€…@KWšžj3JM7Ž ã‚XüÎÌíéðR 8+ä+t¼Fçèøs{cw‚ö·¥v¤�Ñ¿wÃÙô¾‹Žó'Œj!loîI}¿Y^œK¿ùÑé+gPÀFºmí»j�GmŸQ¢ù•aÊŽ †  )´*— q{™8¯"�€�%×Ú*ôÿhÝ1®>ÜÝ1Á³c­�ótD-ÖZ‚Ö@@¼D ‚0š¦§+ªˆæeº1T˜B "oƦlÆ�XÇ%•p€ë§ŽŒ¿¶KAÈëMqêLý’tÉÜ2ºëß/¦ù3Kü£'0&B ÿìž—èW~ÙpÔö¢¼-�¢BY @@`2) íܹtÕ[–pYØ“DÅÛúê&m›ø¥²çá‰<Œ|†ÀÝ%ûËŒpK\ˆ®�Þ�ʨ†Ï.=k!�ÿ¦¹öF³‡›ÿÂGoÏË&Âï[,ª�€O �©z|:ìLKxþß虜ô &�{†'݃@æ $D÷îMDKç C=¡˜L lô)ÔäjøÆ@w 6ƒ€( @à®Ä“4NeI±`#XFÇ%ó(cq^ •ª5�KEÕûùRسý`œúGRï[çž<›nýòT\˜ãý�cSlÛ×NÿöÓghg�±7eDM±}v"ÆN�‰  ð�¶¾qgX¹"ÊÚSÝ+¸Ä$º‹ÀÖ×[©³w8©Qòš½¼÷¤pÕ÷|EMdYI@åˆm$‚{G‚Z+e …øM³•&[ÚÖæÍ´åõ¶Í9åa¬ÎÀÒA“ÀдÖÏ|»Ãý¡;—€ÀÝes@Ày!ùÆOð°w‡P£›c„�<…:¦¾ò ¶ãÙ @@€'!)φËIGHʵ‰í G à¸t”…ÑOéÜ ŒjDx­œÑ™ñf¹Ñ(Ñkc48šÚþ«ß±œ¾qí›)+N]%t*ͨto¬½_)¢·gGˆ¦•ÀyÅÚ=­�€÷ ‹HHNèp²3ô à>¸»oN`8MÀXH §­òiµ�ý>†åváTO¡Ü>—Ù—Ž¨ÅeC�9  €�Ôúü¯Ï­+™ç°mº!ã··Ó0·Ì‡0pN9¢·»až`¸‘@(,nØ‘œ%� Ü�%ŽÞ@Àu pwÝ”À p–@‚BÍÎöˆÞºû†'‚ ÎRæ¸[Š��€@`DÁÝô\ë IMw„ PY8.™žyÝ•%ºÑ o5=Gn«ÐÔ“ }­©W$¹èôùtË—ÞB¹9xYê¶9LÇùÓÿÝßvÐ7ož¢Rq™"•Qûñ3ˆ™‚²A@@E Eœ{ãŒþ2O„ä}Û™ TÕ‘“<ò\ͤï¿Táb}"3Ÿ•ÜKóÍ4…²iPEpŸ(pß×'¹*•*ÝpÕj:mÅ U‘Œç ˆðów­ÛÁÚ!×ùîÖç³¶#@À~q„¢°ò1=„(Ñ~Ì&|Ü6á.K Aáæ¥~¹rl=|×'ÐÙ‹îúôPS—"¸ë’K^/®+NIÞ¶‚€„"%›ŸèhLýâÌ|‹¨ 0‘î&Ò0öY×ñ·Æøú­TS·· !HªtÅÚ%ô“ÏœKYYˆ˜Š•—òGÇbôÅ_l¤ûžÜkÈìYe!ZX&Ä(0„ …@@€%ÐÔß{ß~Ö¬”Â’CƱÚ»‡hËë-Çn>ò½’|}¤ >$'0¦xÞSUŠîɩٳUÁ},A2Úþþö8µöªŸÑ½yåLú·9Õ#-lõîGwQwÿ®~N9W,Ä�¦@ÀwTZ¾¬KŠ#‚»K¦f€@Æ@àž1ôèÜA ›F›£„C�“³Ñ&ˆ!�€ÓÂx;j)r]Q‹¥F 1Ï€ÀÝü”Å/<Í·† ÇÀqéX"©¿ëÞ hGpOmJ¸”@³ŒÜn@ÜþÁ·Ÿ@ÿù¯gîÛ]:‘šfõŽÑ5ß^OϾҘ²…°ÐÐ,�¦êbˆiRÂBHA@FÁyÙô¡K—³yÈ�c <öB-qŽªyÙD…¹8wËÌèwáȦ DpgÙØ‘QR˜K…b‡–‘Í�Mržžß¯˜¬7*,›_N¿ýúE”ír‡Ý1±¢ÒoØvì0�|/«)çáw}>€L!0<ªvö™RÒ&É w¤Ýð4„„ñôôÁxHŸ@Mu[›h…g‘~há̓ÇlÁW°Ÿ"3ZË8έqkm7h @@Àgp>6?¡ºBRó=¡“îæçŽ7æ™±†·ïmMý¸íÆ÷¬¦oÿëY·ûl'i뢫¾¼Î�¸=_ˆãNšq»Ïv @ ƒäê)\:qq�²l—�í 0…À#ÏÕNÙvxCeD°‡Yèü•QÁ¹TQ’Ëea» d|¬“—Uk·,#Àÿá›—PIaŽvNU|ðé}ÔØ>Àv7·¿k2@Æ Œ(N``d �Šî¡N[F£ ž!�»g¦ †‚€MþòQŠÜ‘"P×ÜïPO莀 î( +>AànE´ Á#€ó±ù9�ÅS‹Í·Š ‡ à¸t˜„ñ¿N;Þàõºñ¹qKÉ–^câö¯\½†¾ôá5„×Ü2sÖØq ±‡.ÿüC´}êcR·z^„ rðK·†>Z:�!|¸k�¸_}Ùrœwƒ¾“˜¿\�eÓËÙ•…8³p d(#¸—ähE¬$péÙ‹´š“¢ö?þÇ%$EînOq±Ã-÷½ÂšY$Vd(+Àïš„ �q½Q�p”@¨gëÖÛ¦.1⨠è @ Ó pÏô  pq«Öä3c¾ƾÀŒu,uní\8-j±Öz´  �)ˆ”lž<ι晡˜!€ã’Z‡Êê—Ä»t¤híKОµs–´熳èú«V€H°†øêžvºâ S}Kêg ªÂtÂÌ0eá M°vŒ@ÀVMÝü9¸¬8—Þy®ž€ÓV£Ñ¸k lØZOcÑäûTv„¨8BØt&/*ï1©w†Œ}›/={!ååd™ê [\ÈÞñõ‹é¸yå¦êeªð/ÖÑžºn¶û9åøM³p� p„@w?´ÖG`8ò!‘:z€#v �LÀãÓLÒGß àÍî1Åÿ–4u P4–ü¡˜ÿG�fŠ"3ZKÜ­å‰Ö@@ (p>6?Óªžæ[C �c „Ãx4x,“Tßõî¼€#UŸÈ÷�6!nßÝœúyÏ÷o<‡>ø¶¼1(Xi˜À3/¤÷|euô +ëHAÜÊÙa‚€F‰ ™  `š€|åÒ*VQáÒû/^fZ¼Éµ…íÁ ð¯a*Wa�–Åc(ƒ‹àž SQAŽ¡6PÈ:å è†÷wÀ-*Ȧß~í":}å 댰±%épþ«¿ðÑÛó²‰äï @TB"bA"¸«Ù‘×jG£h@À[ðË[ókAÀ Aàn Ùä�ÆÅƒÖž¾¡ä™Ø 6@wkÁÊ¥ ‘@@@À,DJ6KŒHWHj¾'Ô�`ÀqÉü¼ÇäM½F„4Uiâö]Äíß½álzÿ[—yhd0Õ�ŸÚG¾éQV/U.…3«çF¨¬â#\Q@Ì�ŽfL°m’ÏÆ?ôv8—™áô²£B}½aK=‹¡²çrŽ�Œ¸¸9’ÿ’%¹Ú‚\ñÉy7¾w5�µzVÊŽ/úΞ/p”@4§/ü|#Ýû䞣™OUE!:nD3 lK4)¢·/žSJg¯žmI?h$äyþ‘çjØÁV �;Rz¢1¾~yI.Ÿ‰Çœ° ‚NøÈiŽõggG·(R¥êŒ2ü¦íä�¶AÀOâ„ã…ÓóÅ�îý�¸�îî›X™ €e]¦ÞÝ‹î#|wˆàní. +j±Ö ´  à5ˆà®7cñx\T„·ž=Ô5ÜÕ|’åFÑ“•?¼ a“ðÇß¾á½Þ˜ZÜþÿ„(äZýÉ?äó€Oÿäizè™})5KˆeUã&%(�4ŒD‰äŠ*\ºú++âpt°=�g_m$.H•Ü—* pO†ÍÔ¶1…ÀÜM¡DáZúè¯Oó×í3KC”…Ëõ‘  p˜À¨âüu¸ þZL †–Íb¤h¼H—k^œ5Ø ˆÇ£Í7‰æRèè�À="d[L „53-%Šî–âDc  p8Ó›j¡#C°‰õ�Ž;ݘ¯—HæÛ|“¨‘!C£DÛ…¸=ÕùéK^C×½{U†¬D·vˆ‹ß±ŒÜnDܾ * q»“€6A@àÍ=Âáì˜m‡¿æeÓUoYzø«oÿÊËÌÁá(�‰ÈãHéX·éÛHyAH¬0Çf#à Ü ‚B±´ ÜöàkĬ’+³ÊðƒN2�å®:Áá¡&b1Dpw˜9º7@w7Î l‡ ä�…›‡#wðîZº†NÃwšuÖ�'ð²ÀZ¢h @‚ABR½yN¤Rê5‹Z ‚ŽKæw) ’¯³Ì.J }»yÖn¬1*¢Ä¾v0FÑQ»>ÿ�SéÆ÷¬vã`“&ùþú­ÏÑ_ß­lA–LÓô³G e³ÈHB@Þ*6÷È+³äéª —RQAvòLo•bÍW÷´Ñ‹Û[èÅÍ´y{3uõ�Œ�HŠúËŠs�ü“ѰW,ª¤‹OŸOKæ–!š}Šy� '�ÿû{ [ªºçwމ ÕªXå%¹&ZBQà È`sw?º‹- ¯×s –bù @`*�þ‘ƒ¦VÁ–4 Äùˆàž&CT?À%›fc�4 ì}á}sÎû”T\ç§Ùª$ÐØ>`°$Š�€5"ˆàn È7Zá">XÚ ðœ�õ¦TFKE°‡ŽKz\¥ã VÉÒcçåZ2(ªŒÜ>"Dîªô™÷ŸLŸþ§“UE�ç1òRä?ïx�~ÿ·JË壗ãg†©¢â7%(d‚€€EÚû¤ŠýáK—[Ô“{š‘âëïÞµ™4ö$5j`xŒä¿ƒmýGòÞ¸Ÿ¾÷»Í´pV)½õŒùtÅÚ%´|aÅ‘||8J`Ó+�ÔÓÈYàèÖCŸäyçøc©è}SÄ*NH `�»Öm§aé¡Ì¤ÙˆÞÎ�ÁfŽ@ß Láê`{ZÆŸúqGZ- 2€€/`Í_L#i�Š‘æ´[A† Ô6Càn ZBâ K0i$ƒÐî |0L‘’ £šT0.Ãò!�ØB+=éaÕr¼ÑtÖ�LVoެ®%OE;„¸}`D}Nºæò•ôoÿ|ªÕÝ£½ øÉŸ¶ÒmlSZ‘%Þ´œ8âv%$d‚€€Å»øóòÙ«gÑR±Ü/IŠÖ?ÿ_ÏÐÇ¿ó8+nO5V)Š¿õ¾Wé’OÝO_½ùY“Þ{H“¬Û´Ò÷‰_Ê…[ÊŠ‰H´?«SäªH �.y̼óaÞ9µª(Dù9éö‚ú A#ÐÕ7´!gz¼2z;ÁŸiëÐ?€€cÁÝ1ÔèÜN !î¡…n·Ò/öímH]Ã/ãÃ8ÜG ‚,ÂÊY�ÐÎJšh @‚CBR½¹Ö’êu…Z 8p¼Ñ›òñû�ˆ¹ºxcŽ—›J˹ÛÕ§Þ!õ,¾kíbúú5§n¿Ý4{éÛró½¯ÐÏî~IÙ�·¯âö¢\<{Q‚B&€XH Gœ—ûŽgW_¶ÂÂÞ2ÛÔË»Ûè“?Ü@5M½–"ý.ÿð¿¯S³Xiø×_½�²å‰ i\ðÿÈsµ, )ˆE²†@4Æ·S^œËg" ¸ûÑ]ìj ²‰9åø=D‰b o�Z‹žDpwx‡ht¸?t àR¸cuéÄÀ,pž@Xz¿!9D opŒ‡Fê Ý€€p_ ^±nOˆ!’¬u0Ñ€ˆÎÅz“ Ç2=n¨FDÂx©k„Ó±eto4¸º™;Ö|w”À¾Ö8uô«Åíçž<›~ò™óÎlŽN�í�Ýùðvúî]›•ýÈH®+fCÜ®„„L°�ÀAEôöÙÕEtÁš¹6ôê|“¿yp½ëóY&nŸ8‚õ/ÖÑÏîQ;qM,ï÷Ï›^>È båmS…ˆàŽd Dp·†#ZIN@®N¡Z}©¬ DEyø='§‡­ �ÜÜÒyȵ‡íF„ p7‚ e@  pÀ$cˆ `„@‚dw$' ôô;ÙúÊ‚xŲ½B;ËP¢!Üõ¦;¡­ Õëµ@ Hp\қ턆Ã+Žez¬3]«®#NÍ=jqûª¥Uˆ~šé‰²¡õñßýœ²eù˜eù¬0C £ä„L°š€ŒÔ9ÀŸŸ?vù Ê’HO·Ü÷*ýÇí/��ÁVn}töâ]•ÜUÞt€ÝcÊ…¸Ý»;>§3¢1þ÷[Q’ç´9èÏg|z5‰*¸„èílPÈÎÊRe#Ï¡‚´ÚÁm‚€ xÿîÞƒÐa2¸‘€8@àîðÄôôá¡¡ÃÈߢ3Z· ØùRÁ:+Ñ€€€Ûà\¬7#p,Óã†Z `„îF(M-£±‰—pLmâÄ•›HÃÙÏRØ^שž¹…³Jéwßx+åg;kz³•ÀOí¥/ýr£²±:9� Äí¥ùø•*A!@l p°;ζ*ÏÉï¿øx6ß+ÒÑê;w¾hØ\)¾ÎŠ.~¤à¨¥}Ïc»Ž|êñùÑçjØáWá|ÏÂÑÈà"¸KÇ”¢‚�Q�÷ê7ßû ‹£(7D2‚;€˜&Ö¸Ð2Ý *L$�H ‚ûDø A&£ Ï>Æ$($îê—vŠã£:{†,hM€€qÕg•ª$„v©!@@ I“QI½MGHšºU”�"aľÐÙ⼦J§9Ôq!�îÁímUOtuy>ý÷·.¡ª²|Ž&éøßgÐgò4©�‘’˜ãg„©â]̨ Ú¤0¶µ——õþ·/²Þv<“ç¢/ÿrSJFYâR~n…p¶* *Ì ‘t¾’Ihµ)*8�‰(Ùò5TG‚ú†yf�¿XG×_µúPå€þ¿ñåƒÔ; –H’äŠ-"‚;’5äbXÜ‚XeŹGöckzC+A#ð„8ží­ïf‡�èí,d€¤ ôT)J ÛjaBw«™¢=ð*ܽ:s°,&§xseSU7×Ö5¨.€\°˜@$‚/«�"‚»U$Ñ€‹œÍôæŽezÜP Œ€ã�JSËÄ5î •ZvjØ’ACBÛ´³I-n—¹?|óš;½8ƒ–¢k« lÞÑB7þp¥ºç?NˆÛ+ÉÕjüh@ �+¬pâXyÏý±ËWjÇ­…¤ÐZž‹R9zËDäù(7É›~)|—ÿò²CTœG$�-Â)`OKòë›�½nÅá˜]ë6îgû*âv!É\ôvÙzE‰Øa‘@@“€¼åþÕ_øèíyÂ÷ ×ðšpQ @€F…ó ’Èàî0qt®%€Û1×N g D(,"¸#9I ¹w'y£/�w«öƒÄ)V¡D;  (áÃáÔ5êô �{ú Ñpp�À‘QoO%8JV·ɨ¸o›Œxº£)6ù”³.[(ÆîøúÅ´bQ%WÛ=H ¡¥�®ýöz“;�"-�¦êb<_Q B€ØF@ Û»ùãô¥g/¢ÙÕE¶õowÃ/ïn£kþS}.’g UaZ9'¹¸�³qzIˆ¸×"Ì{4ÆsåÚôËöQ¡¸~äùZv8ÕpjcÙèdÈ•¸�;GÛ�ؼ£™¶île‹Î)¡þpÏòA€€šÀÈ(þR×D®.�D,Ö¨[õ@üEwÍ'FÚb‰îÚôô*ÖµôëUD-Ð$ ã´¯‰nJµ¸â!ì”ÂØ  o@¤d½]AGHª×j�@ðÀñFoÎ5¸îz¬�¬%çHFn—ܹ$¿øÂùtƉ3¹"ØîAýCctõpû V ®3 •Í´ç6™)�² þ%¥›ç#SÊ;JZLU@á´ ì®ïI» 4f :£Z격–+W×F.€€@P @à®7óˆà®Ç µ@À—ŒPšZFÇñ&Az‘ž §™Êß®-ÚãÔ=¨ž§›®=ƒ.=k¡]& Ý �÷÷ŸúáÚUÛ¥ì}¡ˆ–;³ ¿H%$d‚€€Ívñ¢ÓVÌ UK«l¶Àžæåµå§üµw);X$­ÒYEDFÀçR§~ç*øhûº�ûÙÑTq{j –�N†ÊIÜuˆ¢Ž$ðzM'=¹¥ž…1»,Ì®bÁVB€L Ð;86á>:@`¬ñ©w8кðÜ’y`’`"8A`ûö›dx\ 8û�>¶P¿8sÐtY¼ˆµjªc:!­ê퀀x–„¤zS§z ¯×"j�&€ãÒaæþ&4LºÇ ’9£QZI ¥7A�ÝjÚÿrÉñô‘ËV(ÛA¦÷|ÿw›iý‹uJÃçU„h¶ˆ–‹  �9] m0y�íq£¼½ý–{_¥M¯4*áÊsѬ4­8aqnN„ ó³•ýû5sT@yäùvxUÅ8ÿ³p43¸ýP6�»&TT#yå’tR™‘æñ“kÛA‚C «_½ÊNpH86R½]ý Î1SЀ@¦ @àžé@ÿ à*‰fW™ãscú„—go¿zécŸ#Àð& +¨pØLOt‡&  ®#áŨΤ ‚»5Ôc p7ÆéØR:ܳ5C?Š€žH6èJÐÞV>"¬ìþÍ+gÒ·®;“p*·y2nþ/�ï¦[îãÅ0Ò)w^%^£8<5è@¦8ØÅ_-œUJž>oJ/løÇÎVúá¶(M•+ˆ¤{.’¢bª4?°×8O¿t�ú™ˆ¬añ§¼Ïq”;§Ff4Æÿ–ËKr5ZD• hh飇žÙÇb˜Y¢,\γ|� �š@8¦î~…§eê&PÂ<µ÷§ùöP@ÀÃp)çáɃé `9�DwË¡ªììT@.XHwë`BànK´ A"!©Þl'¸·ðzÍ¡€Àp¼™ÃÄGÇ›,Í7ê¼üÄÁ(Ê+L¿Þg_²âÜéÅôë¯^@ÙšsÈvŽŒŒؼ£…¾ôËMJŠóB´t:^¡(!!@ 00’ nÁ�K×¾k%yñº¶o`”nøáR=k®* ÑâêôÏE}Ã<¿iZßoÿÛ¦ýì+ C¤é£Ê¶‰ ¢1…_iyI�€i¿~`{•ʳÊÒ?†š6 @|E //WùÜÈWƒuÏ`dw$'€«9ì G „ ÷£4ùÔÑ3äH?è$Ü­ÛbŠ(#Öõ‚–@@üFw½Õ’êõ„Z <8.é͹V÷¬ˆVgq^‹¤Õ*%â)n—M¹T˜—MwþûÅT± ‡È“Ûe”Çk¿½žÆ¢¼Â*7‹è„Ya!˜ôäa4€øŠÀÁnþ‚¨¬8—®º`©çÆ+ý¸¥£•<'qI\†XæhÕ«¸¯\\É™àëí#£1zôùZvŒUb$ë ¨®½qÍm=o¿·ØÑ3L÷<¶›æô’åˆëz$H‡@V$éðÓª"DpׇJ àO¸ûs^1*Ð#� ƒzQK—@G7"¸ë²C=ó ^1ÏŒ«¡ŠªÃÕÁvðbD97ÌšŽ�Ô vÃð8ÁêÍ’Žã�nôo,b¡7GFjín‰“ŒË%íï_XKËæ—sE°Ýƒú‡Æè#ßZOR Ã%)j_.Äí9z~)\³Ø   A`4JÔÖÇŸ¯?øö(_z%y,ýå‰ÝôðF>z¸¼9~Fز⽊XK§-Ÿá1zÖ˜ûÌK Ô?(–óI’äµ@y�øÉrQ…s)î–ãö}ƒw>¼�†å‰‚I³½�!ƒÍ fÄ ÒJ3¼¬(›H„ p·$ÚŸÀQØ'‰a€€Bªµ¢´aœ@K'îÆi¡dº"aœöÓex¸>î‡Ià/€€€’š¡u´¬Ž�ôhm|P€¬ŠŸ—ÐP�gEôîÇ4ºâ GÎ�"lG?/–“¿ô¡5tÑéó�ÔÁï�÷òŸúáÚYÓ©Ì2!(,Ì…¨M ™  à�Æž8q×CÒ�ð#ïXá�%Öu³ÿ`}í–¿+\P¦¢_K·Ü÷ªÒ®j!f›[�ã¢2A@ÀA­½ ’çn.}üй,×n¿÷É=ôük|@ÊìÑqb%+SïßÚ½]ç•oÑ9Oÿ£�ú‡Æ’—2‚;’=¸îrÅ«¢„Û¶‡ºÿZ'‡ß<¸�˜t²j ¶d€†@Ïï˜4%þ‚Ùa[Ѐ@æ X{‡œùñÀ�4ä䌪C¥Ñ6ª&'ðzMWò lD‚ø¤Ú޲I�ˆ�6™‚fA@qå*ç�J³Çoßñ"u)ÎG³ÊBT.¢[�z‡ùëŸ5ËgXÝ�ëÛïäÖ?_ÇÚY-îHöP­ÈPQ’gO§hÕw¤øoࣷå†HFpG+„Ãaqý¦ˆ”`E'hãXc�Oý¸ãØ�ø \¸wî1ràðOu¸Ø®M .¢tö j×GE0C Á3¼TeÁ]Ey  [Ðmg@IDATI92êíº‘’Õ­"@@ÀÊzûAB3¬zV–ùG±\„C=˃[«$AûÛù(°’Ìç?p*�¾2x"/¿ï7ßû =·�_ÙZFh].ÄíVGËõ;WŒ@ì&ÐÐÅ‹²�_PAçœ4Ûn,mÿùךèÏ�ïfÛ”ÎVó+Í_+² ¾‘1$ŽŽÅ’—*Ì˦ãx+ ~ò‘˜Ûúô?Òã=!ýQË ñÅQã¥Ç�ƒ p7Î1è%åñtÇ�N¢·³h�  A /7G¬>Â_—j4‰*) $šE@OÉ @ 8¬¿S;Œ|J QëÓ�¹vX�=C®µ †ù‹"¸[7ŸQŃXëzAK  ~#!©ÞŒêFJÖë µ@ Xàx£7ߺǥ �;ÞæèÍÑÄZ1¡kßÙ'ÕûÈsNžM7¼wõÄjøìÿØÙJ?þãVåH–NS¡ˆòˆ  à=C êSDÿø»V’XxÅ3iT(Ì¿òËg•ö.ž&�Å~”mÊÌîAþjò”¦Q–�¦´*³Þ¸Ÿ5 BˆÛ¥ó’=¢Œ³…ì­¼$מNѪïüæÁר1 ¿ªÄ* ,d€˜'�•-,HŽ%ÂuŽvˆÎ@\Ow×O g ˆG]¸Xp9ut#‚»ÃÈÛÄ+ÖM}T.¿€  & à\lØÅ!E�j�€8.¡4µŒîqIG@¤eOµ [’ØÓ'&Hçxñêò|úùçÖbEƒdð<¼­o`”nøáR­À6½$DÕÅP±yxša:€€O 4tò¢lyÞ¾ü¼Åžù-÷½J{ºY›«„S «íH<Ë5'L·£KW·9<¥õ/Ô²6ʹ@²�·š€ìÜíãî§–kšzéñùß𬲰§ ü47 ø•@œ «tznáD�Ó}¢?wÀ‘ØÝóë@ÀqâÑ Wè¸5Áè°­܃1Ó™%Ä+ÖÍ�™ð¯¬ë-�€ø‹"¸ëͧn¤d½ÞP ‚EÇ%½ùÖ=.egGLw�»id“*4÷$¨½�¿{“¿�_~á-TU–?©¾x›€üÝ|åæg©¡¥�H¾¶¨¯GX@È� èIP—"êø5—¯¤�kª ‡4öÐÏÿçe¶{@ݮ󑌖ݣ`yþ›æ²vù5cÖŽ&žœ‹r› ’vÀ�¸pÒ-òmgWæ’¿aéÀŠ VP�»¬ìm%J$ Y;ŠŸ@<ÁÅn 0‰€x¯W7i¾ØN ±mÀö>ÐH¬­iéŽ�ˆó" K;Bc  ¾!g3½©Ô’êõ†Z ,8.éÍ·î‚NÙò�»É„Û“À&%Úߦ^}ë³ÿ| �¹jæ„Zøè÷>¹‡þúô>v(âù'-›ÏIØ"ÈÈUôö¢‚lúàÛNÈ�e滕W_ýÕ³4ªPFͯ SN–ù¶�ÔèÑÛ¹'Ø3* iÕÒ*#ÍøªÌºMØñÈ(úx…Ââ±$#ãöHá\P’gIhÄ¿zÅ Mÿ³~;@)nÇõ=‹ šFÔÏ•4›E5�…kÙÈ < à¤cÈ  "‹Cà®âcG^m3MÊŽþÐfp @¼bíÜÇJÑZ h @@çb½IÆ9W�j�€8.¡4µŒîq)+K/š/™j¶" ™ín‰“ÊAà¬Õ³è“ï; È|F@FÊýÚ-Ï*Gµ@ˆ ‹rõ~�ʆ‘   ��¡1¢ö~þÊçêK—SqaNZ}8Yyݦý´é•F¶Ë¢¼Í,³ï|Ô¡`ùÖ3æ 1·}}³ƒÎ`ÆÐH”±–µ ª(X>V:3�ÖÕ5Æ¢qºá”—²‚Í.‡€ÍÕ ã@Kà`¯~Í͉ÐÇ._é6#£1úÎ]›•ö.™"»ÎH"˜u ò×B—œ±@i›37l©g¯dÔçrÁÉ^ŠÅ ¨Üí…ïñÖ£â vÇCÛÙQT •¼l6   M £W,ˆä(X¤ÆÑÑ€€ë Ø´è™ëÇ A • ÍsZgFE6Ž #«7¿^×C ñ¶:°hVsD{© „CðkKMÉx ݨ�Æ{@I¿Zt4«æç\«H¢˜JÇ¥©LŒlÑuvÍÒ\/}\à½�‘©/3$Þ=Övð9ùøå_8ŸªËó ·‰‚Þ ðƒ?l¡m{ÛYc³…�Éq3ðl„„ Ï�‚ÖQñdT8ˆŽ�ÿ%~$÷zyì ‹añwü³ü>á_vä�0 �¨=¿xvrßméåÙï»hI5¯¤;ÞN -üê½³Däv;W‘âvn%›Ò¢\zóŠ^Ai™�ë6`ÛªâvyLD²—@Tw{Ù{½õGŸ¯¥ƒmýì0fÛ¸Û)2@|O@êw pw~š³Â½õÎ÷ŠAÜLV7Ïl�LøË_btÞ§äÃÂLtÄ>‡GbÔÕ;D¥A>Æì Dg´v‚{C`m7h @@ÀGp.Ö›L]!©^o¨Á"€ã’Þ|ëÞ ädë kÁÝø�²²ìíÿs2þuh$J�¿XÇÚQU u; Ç U÷òâ\ {BS~#pûƒ¯±C’ÎB%ùø ³€�  M ?/WÜc h×GE-M5OÝ5¬U•@|KwßN-iHP�X÷4š­ÚÙ3�»Yh(oš€|€dD“µŽ%Z� @¤d½™Æ9W�j�€8.¡4µŒ®€P7‚;‹|ªmAßÒØ•~r–Ì)£ÏýË©\6¶{”€­}ñç•ÖËH¹å":+x‰€J1û¡DýⳌÈnW’âb) =,Œ=ü—H r „н¬ D…‡>ÛeÚ ¹_7÷Ýߎ%ðÎsÓÜéÅÇnví÷ŸþéÔ7 ~LLZP¶ÕiDþ–»xž—œ±€±Ì¿›7l©'y½�,IžrqlC²Ÿ@T¬0Â%DpçÈ`ûË»ÛhËë-,ˆYåøý²p� ��H$•iÔªœ¨Ñª†J ¾&€£±¯§ƒ=¡P¢6!îHÎèì"šç\è)˜"b©a$ëÄm|¡h�•h @@ÀM)Yo6Á]�j�€á`n4‚ÄPÝã’n¤L.š©!cThHèÈj;ø5éÐñ“ÏžK¹áí»½â¿îy‰ê[úØqЍŽRLˆn' µ—�"êrï¢öá1÷X,#Ä�FÔ=˜ šv¢\ñvQ:�Tˆ¥"j*"¼»g®¼hISw‚bü)œ®¿j•g†µ¯¡‡þø;Y{e¤ái6G ïâ�aòÅ�÷ÜSf³öù5cݦìÐäq ±�X<–fpÜ¥#pQ�X: ’¸ý¯|ôvé€W]„wŸI°a€€BXÎ ŒæÚט+�Ò A �{fc“â‰p�¹›¬…âéhïL§:ê‚€!ˆÎh“áBq(Ü ³BA�CBBX‡dž€®�Ô|O¨Á#ǽ9×]Y"'KO` �{êy’O±ö´ÄÅÒÑ|ÙO\y"�¼l_9ž$°³¦“~}ÿ6Öv)X[6# áK™& EííBÔÞÞ§^�"ÓvÛ¿´[FÜ–ÿäm޹K‘¨ü——}li|ž€Ó<:Ø•�Øn'éÌSY–GÓÊ hZEU—å‹ÏùTQšOòzzD(ìGDø\ùwt,.þÅÄgñOüí¥�½TßÜ'ާ¼Ñ¬ýRd[×§zñè»ZD®–QÝ‹Dtw$8L ­Oì› ÝÐ ïñNôöûžÜK¯íë8<´)¥£G~Δ͖oèPDo?sÕL*)tÀËG¥ß È>þb=Û@U1ŽI,‹3¢Œã…즢Ü-Æí‹æî{rõô�°c™%œè�@@ÀN½£v6�¶“ˆ%bµI6c€@À @àðÃ�¤z‡êÅ“æ¤YØh�×tÓ˜xº“�…hböF«’€|Ñ…d�„JAa]7h @@ÀGÂa¼xÑ™NÜu¨¡#€UžŒq:¶”îq)+Kï<`¡ÖðØ¡xþ{Ko‚z‘�Ï)¥ÏàTÏ�˜Jà›·?O½üËæ9å!*–†o*$lÉ(�Ž�CÂv«£µ—çÒÉ˦�;î¬XTI3« ÇEíR˜îy] ÞkšzioC7í«ï{}ߥHT7ÉóX«2ËÅBà.…îUBðŽG•ºDýS¯A½ý„tþ©s=1Ø!¡ÒÿÁï·°¶ÊKÀyz×�l£L†Jà~É™ ˜ZþÝüä–z–Kh$I" =•à�I4¶lþTl’ç6$˜H@:Üýö¡×&nšô¹\üvq­? ¾€XL@�ÀÝb¨š �dCàn€Š€@Ð@à´ÇxAÀ�Æ­· Î9ïSm¢hµ�â(b�hHOÁû†­õÔÖe^ƒ ¶ŒS…˜.¬ S>V\0²{øªLC§�°0iÞŒbºTü¼�ºûFèÖû_eM•NW3ŪN$¹J—¤£Ì´Š.Û—ÛåÊò8Å¥ªbgæ…ë?hÛ£1~ÿ,‡À=h»CÊñÞþ ½]Fn‡ƒ\J„( �&�Hä”i"4]=” Ó•P@ pDÄ4c�  E@ ܱ†³:½Jªz-¢L&�î2Å“[Ã7DpÇ>  `–„¤f‰*�s®7Ô#àk„ÒÔ2ºŽ722®NB÷©ÔºÔ¦qÍ™^LŸÿkM%çý-?¿ç%ªoécR-ÄjeˆÍòA†µ„¿5tÆ©EDmOçX-ż—�³ˆÞqö"Z±¨ÒõQ«‹ sèíg-ÿ'¯Õ·ïï Ç_¨£{ÛE�íæ¢vŠ(Þ]ƒ1š%ÀãQ®õ|Á¬�X´f;�ž¡Éhþ\’Žr/¤ßüõ5êd¦‹,ND —‘ªk£wž»Ø 8-µñ‰Íu4<*ÔI’ܽp½�Œ�›T`å%¹6öŒ¦½F`Wm׸#g÷¬2oœ8û±@À!½gxÞ�;­~Õµî´ V�dšô.%J„jÂEÉ9ª—sÎY�žüL¢:kgWWÔb­h @@ÀK $Õ›­X:j!½.Q C $Þ ™' ëxS Cxj$݈ñ]y¢JLDmßתÝ.FñÝëÏ¢‚<<úöÄ„š0RŠ]n½.’°¨‚2,# /OºãâvÝKUéˆ##µKaûÊÅU®µsðäóÆ…ýòß'ßw=ö|-Ýñðvzáµf®Ê”íR˜{Pðlí�ÑüÊ0M/ ®P¦`òÕUôöª²|zïÇyb¼2zûBàÎ¥’üU9³7K§N@,§ïéXòå_n¢¨ôp`’Œ’›� k l¶Š€Œ�\Ó'½ÝlÊÏÍ¢÷\x½÷Â¥´jIµgEíܸeÄíÑÝeT÷;…Ðý�§öÑ(§º=¦!Yl¯p`jê g•• q0’ÿô�ȨýüÅ͵ïZIº«Þ8Mkƒ0ì#�»}lÑ2xš@(œ¨K$ð€ÇÉI|½®KÜ´G)'‡f'¹©/ˆê¬�m]Q‹µV 5/€�To¶dÄV${àA�«îq©@7‚;°Zo­%Ï{[Åë.…ý_ÿØé�‹PªÀá›,ýùGÜÂŽGŠ]–LƒØ…„Œ´ÈHí2b»ŒÜn6-™[FŸ¸âDºbíÏD¤6;ÆTåeTÞß³š®î^¿‹~øû-ÔÕ7’ªÚx~SO‚z‡ã´lF˜ r UA!—�ÁÎÛBì«/]NÅ…Þ˜ìÛÜFýŠèíó*œ{¿Ö9� Î!RFÿäŒ.ß3¬7ïá�ûÙF+Šš…ccFT±,"¸ÛÞCMËkþ»„C—ªÅo7¯Ð9<Ø `)�5u»g±´Û€7އjŽÃ`à�ƒÍ tc±P­Œb€ä�¸xaÝÚÑOsf”9×)z ˆW¬�n]Q‹µV 5/À¹Xo¶àT¦Ç µ@À8Þ¡4µŒîq©0_ïQllÜÑÇ9‘ÔÔ»cKSw‚ú‘“ß¼r&½÷ÂãÜa,¬°”Àïÿ÷ujhígÛœS‚ø•¥ƒ ]R,z°+N bÕÙL:ãÄ™ô‰+WÑùoš#¢�ãø-Ùe‰— 22÷;ÏYD?»û¥q[”SäN€-£¹¿\£E"’;Vi˜Æ£åoŠKRˆý±ËWrÙ®Ú.�4î|h;k““ÑÛ¥m½üAêâÓçSQ~6k«3†ÇèÉ-õìЪ„HÉy\÷¬H˜ŠàÅäü„¸°Ç‡„cJ{÷kÙ,qÍ� NÈÏÏ¡±è ]¡� Fòsk'|ÅG8BòÕ#(ð@`"�æ�¿hß�­:±">§E µÈÓˆÊJÕ)ñ˜ÎÔµ˜î@@|C⽩Œ™UéuƒZ H¡0^ëL¼î½€nwéô$#(×vð ²…pò{7žMБúoO饟ßó;0¹0ÂÜ ¼æ`!C‹@‡ˆ0½µ6Fu�æÄí— ñöß~ú.úów/¥ ÖÌ…¸= ýÒ¢\úƵo¦õ¿º’Öž:'I‰©›äíÀÞÖ8ílŽS”?L­ˆ-®"0*Îå- !öû.Zæ™UX~ó@Šèí•Î]cGcD�ƒ¼Àýе‹]µ8aÌ/ÖÑȨ“$ÉÀ^åÎÍO¹Iú3q�vÊKrq Ƚbò ¥O÷í¾6yã„o%ù!*ÊÅow|°‘@V–7V²A&šnkyìGKe‚<úÐ ä��ÁD�´ È'b{Å¿Õi·„ hnç£QnA€!QFssb<Š¢feT$8›éM»®�T¯7Ô�`ˆ@à®5áºÇ¥‚<½G±Üj�ÃK•ö a£ŠÃ§Þw2-žSê¥!ÁVƒn"B)—Kó+ÃBDÌåb;˜# �3ûÛâJn²×,ŸA7 Ñöª¥Uɲ±- �%sÊèß¼d<Êò7ó<í?Ø“¤ÔäMí}r%�-›¦â<üð'Óqÿ·ƒÝqâ§ÊkÒë®<ÑýƒÊsÒ©¢·;¸¶ ‡Ž«t(Y{ê\OpµÒȇ7`›«ÑÛáÉâ±-CåœT^œg[¿hØ;ž­‰¶ïï` ž]†ó>  –ˆ‡àDo9ÔÔ Ö¤.‚ A% ÷V%¨´0n�=bȸ;8ïõ-¸;ˆ;p]ATgí”ëŠZ¬µ­�€x‰ÎÅz³…îzÜP Œ€¬JSËÄ4CªëFpW »§Zç¿-R¸Õ9ÀG&]2·Œ®¿j•ÿŽQ[×É(¹\’Q«‹!váø`»9}à Ú%"„�¯7gZý¿�žN—žµ‚IãØ&•|Ë›æÒ9'ͦ»Öí Ÿü÷VêRO€œŸWâ$�[æ”ã÷? ¦‹¿È(ãÍ=ü¹ü�ç.¦¹Ó‹]<‚£¦ÉóÒ€â@1ÏÁèíÒª6áøÁ¥wœ½�ä*7AJò²ak=;äj!pGržÀXŒßO+J pw~FÜ×ãí壷Ë›¤s €8E`h”?o9eCû© à˜1dƒ p7 Å@ ˆÄ­â\º9;ó»êSGªqÖ"ôæ'ÕY;›q.4ŽµÝ 5!L˜Öl©L *�€!!„=6ÄéØBºÇ¥BÍîñ?œ‘c—Ñ”UéŸ<›r²#ª"Èó(�ŸÝó �DYëTAèÂÂA†aòñNCW‚ê:Dtiƒµ …ÒêÆ÷�D×^¾’rspü1ˆ�-&¸×¾k%]rÆ|ºþûOÒË»ÛØ²2CÎYM{œz‡BãÑÜ#ÁÒï*Ù¸5³¾K½‹WÕ:{‡]½]ž"{†ø#×k—¸u—°Í®'^¬£‘QáQ‘$I­Y®’ ±}“tráRE)î› l¯kî£õ/ðºÆYeaÂ/7({Æ î Ð= 8q¹ÃDÿY‘ ÿ #°ŠûXE퀀 ${ý8,7�镽üòkn¶¶yƒ¢3Z;Oº¢k­@k  ^"g3½ÙBw=n¨FàÁ¥©ebšÎ®ˆà>•eª-Rt:Êë›é_.9žÖ,Ÿ‘ªä{�@MS/ýé‘�¬åR ‘‹ È ÌÛƩ֠¸]ú«¾ï¢ãè™ÛÞC7¾g5Äí9-&#x?ðƒËè_ßmlU¹ºÇkbþÆ ?1Š8#夻±›a_xÚ<:~AEFl3Ûiªèíó]½}VU!­Y1Ýì=_~ݦì*EhÄ`ñØš¡:N—çÚÚ7w?�?=ºsÜy-™¥Ò‰mz äíÉØ`€€}Z»Gík-'% Žô5I3°@DpÇn ÀÑ>9vØÛÐCÃâ‰o^.Ïvð z›ÕY»ÄÕA­í ­�€ø‚%ëM#œÊô¸¡!Fè #˜¦”Ñ=.äëÝëÇxMØÛü´A Û:ù¯êò|úêGNóÓ�1– ~ðû-�ñó¿ÀaáÓðÑ'Z{´O¬¡ØÍ&�ô´3è¦�¿™N\\5i;¾XK K„X–Çö³VÏ¢ÏüäijïRvÐ7œ Wëc´bv„D`}$w Q\ËÜ œE¼�dôö;ÞÁšZ.¯Šóœa¶õñ`/?o1Í™µhŒžÜRÏÎQ•¸#e†€Jà^Q‚î™™wô�ÆéÖïf�‘âv¬ÔÂâA€€ Ââai[÷ˆ -£I�x$Q£ÊG€@° à5V°ç£%�H(�»’�õ™R0ÛÚÙg}Ãh� =ж{ÒãšQí¶ íƒ€¸—@¡Â´&'žàÅmZ ¢€À¸G8‚ÂÔm�{n¶VÔÈ ®d!qq^·E7]ûf*)Ì15w(ì Ûö¶ÓÃ÷³ÆJ�Z‘Ã"BÖdxŽ€ÐQÑΦ8ín1&n/Ç™Ÿ~-Ýû½w@ÜîàlŸwÊzìWÒ9'ÏNÙ«Ð´Ž‹ÜF'�”­ €äœHg.]°f.½éoD¿í�m4 —}`Ò<‡¯G¤Úç¯8 c©7?þB�2Jjá;ƒ•_28õQ…Çn9Ìwýøæ:¥3Û¬2È™2?K°‚E ??W8AóׯÁ¢áÜhÉP­s½¡'¯À¡×f ö‚€ƒjžº¹Et×ï`—èJhë°…@$‚%V‚ÕµXiÚð�¸›ž4�.;gñÄiÁgøî]›ÙÑÈ'ó+ñZƒ„ %�ž¡½T£ö~c‚…3NœIëy%]±v‰–ƒ’Òd¦$ Wêøã\B_¹z�ˆÞª~®9"÷†8u›Û”�£€%j;øù�×E_þðKú±»‘CÑÛ·³Ýd"z{«"zû²ùåt‚ Ö^¿f¬ÛÄ;ÇU ç8ÄÈÜÌ3~ã•—äfÎ0ôœqztkC™X«³°x� `�HËBÙ„VÙlb$²OY™ �&€'Á�ž~ R�OÅ=%&k 4µCàn-Q´v˜¢3&aÍßXU&Ö C+  hYp83=ÿºBRÓ¡�îô&=Ç›Â|ó/Êb\Èâ@/ˆ“³ö ½"%½ý×íµ6¾t�6¾|�5sziˆò¸ŸåƒŒää"|5íqÚ&Ð#Ñäe&nÍ¡~¿ú‘Óèîo¿�fWMÌÂg‡ Èk•ë¯ZM÷ÿà2šYU¨ì]ž/·7Æ ;0(CfÚz…CIç>÷ùKéx�ˆ°eôöÁaþàátôv99m G@é”´Ô?8F¶6°Ã®*V;ɰ‘a �1ÅýL"¸[ÂØ‹�lë§§¶Ö³¦Ï(Áï–…ƒ ÛŒÅqì± .ßp]Ãs?ⳑ t¸}ÀøA qù�{ FVg×·ôYÝ$Ú�qᑎ€É�–'3 ¥A@Æ ¤Š<LS ¤#$�Ú¶€L$€{„‰4ŒNÇñ&?×|÷¯ 3n´‡JvˆÈÊ2Ê2—®< ­^ZÍec»‡ Ä… Y½]>Ö˜W�WžâŒ˜~XôÜÐÅW&¶dN=ôãwÒ¿¾{Uʨáëá³½N9~ýõGï¤ãæ•+;’Î ;›âÔØml¾•�!3-Úù9ÈN$ŸûÀ©iµïTe7Fo—Î*g�ËÏ Þ*7ë_¬¥Q&L¸ØÝ¨,b5§~3Éú‰ŠU6¸�;GÆÿÛïylÉóv²”!ª+/ �€€ÓÅŠ‚HÎGûÝÎöˆÞ@¼FÀü¯�ö‚¤E@8(î á.-†f+ï®ï1[åAÀˆW a2\úvèP@@`�HXвoö&”ÅÇCÒ’‚!€€š"¸«ùp¹R„«›t"¸Ëîä¿ D,—ã< ¢,s)7'B_úð.Û=Nà±çkiÛ¾vv³ËC”ƒ7,dL% µŽÛƩߠHáC—.§¯}ô4ÒqFšÚ;¶XM@Fp¿ÿï �~k=½¸½YÙüþ¶8�ÆB´ N1JP6evˆÈí}ÃüõÒÕïXNs¦ycu„_ßïÂèí}<Û5Ëgx†­•»ßºMØæ*…H6×Ñ,d0¾ã–Aàî‚ Ê€ 2˜Åÿ¬çõŒÓEôvÄìÊÀÄd°Ké”:4š ¡1¢Á7þÆÄµ|¶pvÈ áåe‡ÆÿåaßÈà4¢ëÎ~~Õž@ÈÀ ÅÏŸ?!dÀt  à>xì¾9�E à.qÁÒŽÎÉK»;í�‡Ä+ÖÎ5ÄvÖòDk  Y\\›�kœsÍCy0N „7ÆÆaM(™ÎÊ…yz�ce÷¬œB{4,^hséW®¢YBàˆäOw<´�˜Œâ8»BU2¦�Ç’×ƔǔÕªÊòéGŸ>—.X3÷ð&üu)�Ò¢\úïo]BŸüáSôÈs5J+:B—+?àª$ál¦tV«U8«dÓ�ï=ÉY£4{ë覻Öñç¦ò ¡�“Iòm«ÝpéŠóƒ½½pŒ6l©ç�PU±³sÄàŒ¨bIªòâÜ“ îПÚÚ@Mí,€é%¸îgáø(CŠÚå n­Âq«{�?·ò¡|ùkšp€�+{ÁùÙG;ƒ‹†ÒÜ5â"k‚aЏeƒÀ=S�Q‚€6\j£CE�D$¾7#uÏ(4õÒ�êm®{L…%#€îÖNX:Q­µ­�€x‰@bRÓÓ¥zjº1T˜D@J=pŸ0 ‰¡/1…@#U2ô˜F’/~ýž¢":[}?Ðêò|ºþªU~ÇØñí¬é¤ç¶5±ãŸ+ÄíYx›ÁòAÆdý"rô+õÆÄíRÔ¾þ—WBÜ>¡«¿å 5Ó­_¹€>ø¶RÚY'Î+�Ý©S)›A¤Hmp”¯pý»W“W"6ßö@Šèípžè@yÍ”,eEÂtéY “eùzÛc/ÔÒX4ù5¤t�+ˇÀ=Ó;Á]î³E9™6ýg€ÀŸÝÉöZ"~³Ø-X<¾ÈèjÖæ8½°?F»[âÄíG‡-W×nŽñ[jbt@¬ØÃ_ŽÖÀ'0N ;+‹ºû²Æ›BI3BqÜÍðBY ½�A…!ƒ@P ÄF¢{ÂÙx¸àäüÇÅs¸ÖÎ~š?«ÜÉnÑW ‚»µ“Œh²ÖòDk  Dp7=Õ8çšF† `Š@–p¼•o‘ Hç¸T Á]>+ð{ªëŒ£Mú—>´† 5üÎÎãûÝßv°Ã�ËÒÏ,ƒ8�„ŒI¤øsgSœR9I‘ô¿_s:}@ˆ¤Cؽ&1ôÂé8üíëÏ¢é•ô£?nUš¼_ˆŸ²…ˆ²Qœ•œ¬È”—”µ)œÕ>vùJ+º²½ 7Fo—ƒn\Z{êÏ8pcÐÙ¾nÓ¶Z¥ˆ²�c<‹Ç‘ y>æn7ËKr1?ŽÌ‚»:ié¤'^¬c�šQŠ 3ŽÇ3úGTÓn$Z{ê�ÊãÊAáÄØÜ£ÅÓÂ4 ×y©¡¡DJ¹y9”H ‚{JPEB¸[ÌÍ�€ß æ‰ßfã‹ ´üýÖ6Ñd¯ÅÍ¢¹Z;úS”@6˜'€ÈŒæ™©j¤#jQµ‹<@wóóãÞ„šo 5@’Àq) ”›b ^X”¢*éGp×ï3•MnȲšD6.­XTIW]°”ËÆv�èé¡ûžä‘œ)D.XÇã“ì�ù­½ ÚјZÜ>gZýíg—Óßq»CScK7R´úé:™~ðÉsÄ1B-†“ÑA;øóŒ-°Q-4Êü³ÿ|ЏòFìµ_ßÿ* 󃙗�èíR(ÜÑÏïÇW¬]ÌÃ÷iNßÀ(=µµž]�,§2T¬åÅyN™�~\DàÏëw GÄäÇ2¹bSU‘úœî¢¡ÀƒäÂõ»DÄö—ëÌEk7Ò¼<7Êhð2ª;¤K öÆujºãtYý±úxe­Ël‚9 .#�»Ë&怀 È»�=.´Ë×&5u øz|\f¤zÑ“«¼Ûk< Q‹wG ËA@Ò%!©y‚éIÍ÷† <8.™Ÿótœ] óõ^–Å|þ®ö@{\DÉâçâë;�°¯ò|¼žóçÇwÓÐHr¡Ô¬Î(Åk ¯Ï±ö7t%HŠ˜UÇiÇò…ôà�ÞIÇÍÃê™NÌ‹}¼ÿ­Ëèö¯]HÙRÇ$¹_ÈÈþ½CŠ“ S›��"Ö± —Î*¥÷_´ŒËvÕöCÑÛù•EÊETðâ<ç˜ÂIƒÑ„Ž;\tú|Wqt˜õ" ô£ Î+À”å;?ONŒÛK}Œ)nd*J p÷Ò\Za«|¯v÷c»Ø¦ªKàØÊÂñ`†CÜ‘üA@^o½R§úÎDJT«F,#¹«ž-XÕÚñ/�¾áÔ÷”þ}fF&Ž»3Ó3zð�àÝéziv`+¸‡îÏÅ«{;îÝ�¢ÝY;ËéˆZ¬µ­�€x‰ÎÇæg ç\óÌPÌÀqÉ ­CeÓqvÕ�à÷ñ;¶:ñ›KY‘0}í£§qÙØî¶4P]3/r™U ‘‹¦Ù¶!HÁ²²´÷óÇ‘Ã�_vÎ"úÙ¿�G9Ù"¤/’/ ¼ý¬…ô½Ϧ/þb#;>)À~í`œVÏ�PžžÏÛv�3ä"�ÝüïpõÒjºTÌ�R{÷ýNáxU‘¡èícB$Ü-"¸s銵K¸,ßn不þÑÀŽO Ü‘2O@î»\*/Î岰ݧþôèNvdreŒÂ\ünY@É�«æÈ••ê„ã›ül&MN¨gœ8“Ï.¥EâßôÊjn÷‹½ôÊÞvzìùZes²;¹bωsÂYiEi2=A ³�Ä�ž¨P"�»ÓÐÑx�îœ4˜  �»ÃÐÿþZ‹¸éKˆè¸‘w½¯» #‚»¥ó›Ž¨ÅRCЀ€€§@Hj~ºb~VušÇ� `9¬,ai:Ž7…šj:¿.fÑ7œ îAþ­÷‡/]>þbÛü,¡†Wܵn;kª¸”äãÙ (àre �»G¬‘*]sùJúú5§+£{§jùÞ ðþ·.£®¾aúî]›Yƒ¥Øòµƒ1Z5'‚"XJæ2ê…ˆM:œpé+W¯ñL$í_?°Í•ÑÛÛEôvqUY>�}RðV»yì…:c– ȾL¥¸†à~’ŽnW Ü+JÁÝÑÉÈpgÒ�è…@y[3˜f[† £AJñŒqû×>z:}üŠ!p±e&ÜÙèõW­"÷ºõ¾WY‡Çˆ¶ ‰U"§X,) ƒ£DÍ=üùü¼SæŒ ÖÒ豪F¢·‰ÙH­BàÎ%¹B…\õ&hiݦýì�eôv¼añ8šUxê–Càîè\dº³{ŸØCQÆ)E°êB¦g(½þåõÀŽÆÉk,#I Û¯½b%]wå**)Ì1R…NXPA¿ýÚEô‡ÿ}�¾zó³l�!aCKo‚à4Á"BFy¹940�{4ön ÇÁÝ^Âh|A@ï�Š/†ŽA€&‰‹;N,Ýj˜—EÛú p·ˆ%š9D‚:k÷„¸Ùµõ¬í­�€x”@V$3/Ã=ŠkÜìt"%{yܰœ"€ã’yÒé— ò³Íw(jøQàÞ?’ Î^¬õ‘ËVPYq®/Tò�¿>à ÓdäÕêb\7yc&�·rwK\¹úƒ´HŠ=òÙs銵Kœ7=fœÀW¯>�º…ÈýžÇv±¶ ˆóÐÞÖ8-›…¦WhYùÁ·Ÿ@}BQ¯Z±§N¬.3­$"VpÒê•H ;G:Z@àîôÔG¢Ü�†Žþ@ÀƒðÔÆƒ““AÀiŸøU§è³Ûé~ƒÞ_}KoÐ`ü!d‰¥DÓµXjðDJ6?]ªh_æ[C �c à¸t,‘ÔßcŠ(„©jæi Ü}è`Û ˆÞ.#Ý_sùÊT8‘ïq?³�ÁŒ’Ä,�`ghÿÿì�œœU¹ÿŸ™ÙÞw³%›lz%$� �J(¡£€Þ Š^+âå�åŠÑ ˆØëU¹ ( è B„„�ÞËf{ï}gþçYˆ¤ÌsfÞwÞ™·ýÎ糟Ý=õ9ßóÎÛæ÷<'LÍšHÆL‡ÏµÿsÇù·ûøPá× w}l9]¸lª–Ku²pXÛ…c¢ëÖ™ßå+gÐüã\Aê­èíÛD[KrdWôvÝ9oJe-šS.ÚíÕ‚g×#A³“\a6�NYûa�L "¸;e™’nÇÚ-õ´·¶S‡ïý‘ÜI ^ÝGm­�Oܾ`f)=óÀ•ô��ŸnZÜ~ˆïØó±«N8ôï1¿‡FˆØ6$ˆ—@$€€Ÿñ²²°^Ï�—¾Ý`aè @À£ p÷èÂbZ `1¾ûßeqŸè.�ÝåýMQ Q ‚{T,¦3Ãa¼1  A@ÀÇp=6¾øp*3Î -@ÀÜ�Ðz«n"祼“w�0Äø ìoÑ7¡� Ž#²Aðbÿ:%Ó‚Ý5´uÇÔˆžÊ ðÕEt2þέm�ÿèRiQ6=öÍ‹èŒEuÕPæÅÿ�[Ï¢å'LÐΖ�&ºúõÇ•¶îk‘¹¥¥é3מì:½}€ÕpBš\bŸø²©[¾äèí~ŒkóôK{…•"âèí~d"±¹`dT6÷û2¯•<ügyG•ÜLûˆ¼Æ9•óaü=Íá±ùnà-‹øžìÓÿ¾˜ž¼çRš3¥Ø23o½v1ͬ*û;ØŸð^ì¾"Ð?ä«é:b²ŠpôöX§GØ #@ì%€·ÄöòÇè à&¸§xµÞÜÕšâ1œ× `6kW8ìÁŠÖBo  Ñ@H�Š>/!©¾g”‚0œ—Œ‰œ—Šò3�¨Zè„!¦:´¹ÑAMôöÌŒÝtÅB›-ÄðÉ&ðÔ‹²0-'#@9¼;8F€#³Y—ªÊóèJ8³`F©®Ê|D€¯)?þÂ*Z8K>&øßö†0 iD˜>B÷TÛz#ZÇ€ë.<Ž&�Ï�»?;+¶wÒ/ÿäÌèí=ƒÒ ®8J¾ßRïÀ0½øF­8m¸#9‡À°æÜ �»sÖ)™–t¨sì_Þ'1¾ŸYŽC FÔ-ùÖºp\ÒgTÒ“÷^J·¼w±ó›•‰…ó·^·Xì’ߣÔ"Š»ÈGhë‘�¬‰ÿ¬"¦ Ü‘@@ &kï b‡ ®%@÷T¯Ý«[i4¬ÿÒ&Õ6akdT>W›tþõ=T—øíó»hHðtàÀ\¸÷wׂòRn<¦vu+­P;*=uïe´`¦ìh«�Xå«—MÓößÐýz«_”û�@MË€ÿ&móŒÕž;¸Û¼ÜB߬»e¥`'ØM A÷¯Aßà(5¶ô¤xT çeAìËiéò&"j±Ôt  à*ˆ”l|¹àôiœZ€€!8ÞÁ5V7Ç›¢|Y\§3dØCßÉÖ´É“áˆn~¢·ëŽ/”m?ÐF»k:Ä©@ä"¢ñeG/ÞCxœ�™F?ÿÒy4}b¡/aÒ± T–æÒwo;‡tïG;û#´¿U¾FÅÅ?5š»"Ô«>›RºéÊTZägµž¾aúé“[¤©PIn€ò2íL3a�Àýгü½�êù×k´ë…¯AD<¶ºfâÈËyزǖ5Iõ ¿{~·8$ß÷[Ô[ ‰àˆè›kÃÔ7$ßå}Í£_Üq>åç&wk.>çßö¾“ {Ìovbìˆmï1 ‘á+éÔÞ=ä«9;b²‘0îŽXÎ'�»óׂ€3DÁÝŽ…¨oî²cXŒéQˆÌhíÂBàn-Oô ~!€ë±ñ•NDHj|4´ÿ€ã�ñ5Oä¼”—“>&æ0:ª.ò¡Ñ¾ì¬? ¢·7i¢·_}Îlš DˆHÞ&ð”&z;‹Uà_$#ÀçŒ-JD3ªÑóuìû·ŸC‹æ”ƒh ,[XI·_¿D[§¶=B-=Aé …žGŽ”Ã t]8ªì—ÿ·�ºzeAÓ¤{Äí ©SEÇea^´Ä‚¾KWøOàλ,<¿î`4$cyÅÊ!É9øúÍçŒh©¸ “àŒ�Œ·ò6vÓÆ]-â¤* ñ™á8¬€?Ï›ëÂZ76™� ¿úáetçG–™z÷afÚ+UÑ X5@IDATÑ’ybÓ¶^áD$¶@�ßdfšÛmÑoœ¬žo „ÀÝj¨èæ•â5CrÝ3L±É�­œ3;X�§ÿ¾O¬–­{ØxŽ CÁ1XܾE‰ÛcEBçë?Gm¿þâyÇô‘Ì v–¹äŒéâm½b @`Œ@˜B a�P š Ü1$¸‘în\5Ø 6¨þû÷ÚÕ°­6 íë!uÛ5û &oŠ€n ^Sú¼Ñ¨.|˜ÏÙ`ú  28œÉl¤’D"%K}"@àêË„wþÁ_qHô¼T”o<2oîöÄHºäÈiW¬œI“Çç»}š°?�M»[HС ÷ýQ|HDÃÜué¶÷/¡«Î�­«‚28‚ßöÜ{Ë šYUtDþáÿðñ·­^¿sÀáõýô7 Û«Ûd¯;¾Žÿûs]ƒä‘gwRKG¿hoU±}÷ÉõºU³›ß7ù1­ÑDoÏÏP”Ž:,†5 J ²e+ŒI�§ÿ¾Wì¸4Ͼs¬h Ž!À×#¾/êê—Ÿå¹QUE>ýþžKiåâªcúHEÆ9K&‹Ãô Ê;¢ˆ�Pà+½ƒ¾š®C&hÚ¿æÛ1f€8œó¾@0E B»e�Œyc| |°Ì)›"uÖ¢•ÂZ; zðI�/h¢BRã#¢ø‹v–0¾Þ‰ž—ÌÜÙJ]Dã³H}‹Môv~üêSoFL9�§4"Ž’›™–r“0 Ãðë–í ±#DrdÈ�½»>8lù\aGýáçÏ¥Ü,9ÊxÿÑÞfYÈ튉&ÁÈ}Љ.æÇg¯;™Ò]¢0V7Vß{üM‘_“ìŒÞÞïý2ÒC´zÙTÑv/<ÿz�8½DoÙØU sÒ-)„ÀÝ®uIÕ¸ìÔºqW‹8î"njݗ+q{GŸ^Ü>oZ =uï¥4gJ±m¶³“ݬɲc›º®"�€D ¥KÝü#¥”@„";S: p5Ü]½|0RK ˆìHíˆíŸÛ›iD÷ƈ@À�"3 »j˜Ã �€€€A¡¢D¦¾ÔÇ5×(3Ô#p^2Bë­º£šH„ñôV”g<‚;÷«ˆÄ3®�uøÕF£&zûŧO§U…všˆ±SDà¹×ªÅ‘½]D㫎ÍÂN]ºhù4ºãÆÓ¯ºt”P¦#0kRÝ£"¹ë_·b‹ºö^+kWâ¶MDñù3ÆÑ%+¦»fÚO¬ÙMu-½¢½“Jì}voê–σç.�Lù¹¢í^-èUÛz¼º¹^œ^q®X„› kv¡*6±«•MÓÀ°& üñå}bËlu ËÍ´÷<+‡‚1,nß¡œNc Ãgª{ª_õB*-ʶ�ܪ¥SDbÍClˆ_8Ø,ïèã 6LR] p·�;†·€ÀÝ­+»AÀ l±aX_984J Í]¾f€É[GÜ­cÉ=Aàn-Oô ~!€ë±ñ•æk®üÕ¾ñþÐ@àHˆà~$�xþITànRÌ‘è¸ñÌ-Yuš•HKç¿ó5ˆÞž,öNê—…„»ªå¨ÅÑI«e�-�ý:ئ¿ó;u~%Ýÿé•„ë—=kä¥Q/>}ÝxÅí”v5…Å(ÚÚ†+dŸã=Š….}Y9�]âu»ñ<ø9z;‹.Krí^ò®=:çŠËÏœ¡[ Ï–ýcc=qäýh)Cí±l42öæéî%ˆànïê$ô§^Ú+‚û~�# Xܾ³1¬ulcC§TÐ#w®v„¸�í9wé$þ5qzÄP‰ŠÆ÷™ÙY™Ô; ñÈò=¡$ˆ ‚{’È¢[ð$Ü=¹¬˜$‡@$�À=9hµ½Ö5wkËQñpË ñÎÇîz¸Û½@ÜIBsëÁ7æÀ¡ÄAŽ7q@:ª ‹¢IEfîÑõ<‰˜’²¶õ�2³óN�Bs§–¤Ì d�ÖÕˆƒç)1!‹Ó�üK€Ep%R—ø\ñ“/®¢ÌŒ�®Ê@ n·_¿„ØiBJC#DûšõÇ¥ÔÖKù5jg<[LW�;›–?^,wZÁŸTTá}u�¢Y“Ší·³Q­*R¾t»É‘ÛÏ>Yð‰“ò@Áó¯gQœc†ù¼@ç [ �»§�Žê†nÚ´»Eœ#vnÑØ^Àןmõab'u]šX–7&n¯(ÉÑUKiÙ¢9å$½oáyõ èç”Rc1˜c¤eøoWGÀÁÝ #@À pwÇ:ÁJp�ôHwVâ`"¸Û€Ý“CB¸bí²&*j±Öô  àp83·Ra„ �xN0Žu4œ˜Ð­(/Óø ª….¢©SÔ¨[}‰Ü;(ŸÇ?xÉñ)²ÃØM`ÍzYà^œk·ußn»T”HK‰E4¿üòùT Ä�H `�´P�øÌJbѰ”»"ÔÖ+_Ǥv^Éï":Ø.Ï¿PÝ×|þK]3]~´|ð7D{³Ó‰ÆåÛ+–Ö‰ /Z>Í—N>¼nÏkåŠmŒ¸/L(Ð>¿ ‚»·�?¿²_œ`ŽºäædØ{ž�óyﺶ¥6ó¾§\‰Úùújª*Ïs1¾¯;ó¤*Ѧ>uOƒG C6y4“Tü † pOhŒ!€3µGÓ�TØ¿¦¨Z�ӓб0Æ;vh¶n~§þ�Ø ¨‹ÍÈH Dp7B uA@€�ô c¿qÝ5Æ µAÀì,a„Ö[uuv•"ŠÅ²d$1]}¬î“VÞ ‰Þ>mB!-[8!ic£cçQð‹ohêœÅ²Á’º½€8#=D?ý¯óhü8xBذ<ž’�«/ßxšvž»›ÂäÖë°vbqîQìuþÆŸûÀW˜GOΨòÜkÕ´u_›hLUI�ì”]²£OGŸìPpÅÊ™¢í^.ØSÛA5�Ñw;æõ*Â}„#—XóüR\`Îéב…QÇxAãØZšgçYöS‘ñ6v¨ß¤Äí�ýò5ˆ«ò5ÿ‘;WÓÔÊG²›7MÞ®X?7GNF%�"û'q´"ÁHûžhÈ�h p�Fy �;øUÄV¡ÙI"°~‡¼…[’†D·%⥑•K‹H²VÒD_  à’š[k\wÍqC+ˆ‡oâ¡td�‘ÑľåH§fÒˆúÂÙm‰Å€º(¤×^8—xTuÛ²š²÷��MÔÓ7µ­ ´GùY8¢ÂñAf�Úáa_‹F§üלB:±Š0aŠI&ðî³gÑ9K&‰£°èx¯zû-µtG´bë“æ–Ó{Λã,,Ô@½=3�¨ÜÁÑÛ+TÄÜSæ�w o+ }þuÙI.?;@iPà� wVßÜås ˜¾‚A\ö­àx¨�°¤Ò8T¿A@@ Ü£@‰# Ü〄* `’@0€ç3è"Ôd*2Á}Ø…�c:e£/Z>� l1y¹°Ù�ÀÂ4.¨E&sDl]$ÅÊÒ\ºç“+lœZ4]tãpûË7�¦µrwS˜xw?¤­aâÈõRúà¥ÇÓñÓÇIÅŽÌP½�E—…öŠ.ù|È»ZH銕3¥"Oç÷ ŒÐ«Ê9AJŹR òí&0¬qÐ-Î7·«•ÝsÂø± ¼¸¡V¬„û~�-½êšÃâvŽà®Kåêé·ß¼˜N˜U¦«æˆ²©•¢3Ø€ó'ð*ÇóƒÖÈÎÎR�&}rso-º„z‹"›ê�A|Gß`ùnÉ1aH�@0€î "4Ó¼¾¹ÛL3´�#@PwŽ„ÿÕ¼œM¸st  àY¸›[Ú0Þ3›‡V œ—‥J"þ®æ#¸G1ÄÁY]ým¸ëVÏu°õ0ÍJ-ý´iw‹Øeq®½‚BÑ0$•G)nT±¥ÄQ¡üÌYdöœ)õ‹|Ðx×Y³èÜ¥“Å*,øÞ«Dî^O,²®ë�?Ÿì ðék» Æ�Íô’Ft9QEo·{Ô¦nùØš9©ÈuV k7×Ó°àY’¡ò Ú*Ô–÷3=ˆ7¥…‚”—#ï˜a¹!è0¥^\¯Ù¹ ÷ý)] Ý`ü¼¾©&Lº�¸ýäñùôÄ_Bs¦ëºsLYzZ�&UäGµ‡Åí,rG�CBié‡þÄï@PÕÂÆP à¸{d!1 H�p$ �{ª`6Î�zDp? þ4IÀîô&Ívl³Q¸ù;vm`€8™@ÈîýÎ� Gc"¸kà $ƒ‚)‚‰ìèdV¬)èzLÙŸŠFõ�²0nÖä":ù¸ñ©0c8€€NPÈÚ¦Ì4 RJ€…% [—nyï"Zz<Î:F(³ž?®}ãã§SA®,¼lRÎm½ò5Îz«Rßãž&ýüî¸ñ4ÊËv— è;�nA*-UÚ½��cÇ)]qæ ßîfñÚ¶F ÁINDc{Á¨ºÌKNÁÅ™¾=žm_˜$ÀŽ­[÷µ‰£eñU„“‚ö¾m®�½+ ‹ÚYÜÎ"w7¥U…¢¹ýÃòµVl„ÏÅ9ÉžÅ�l¶g\Œ  àV¸»uå`7ØD vÍj_±@§MÃûvØÕí¾�;&n�uÖÁT=%"h±Ôt  à*!¥ É8�ˆô­¨ñ®Ð@à(¡¾Ì9 I\ÿFpxe�;G&6šF\´‹G�kí‘¿8¾îÂã j1z¸¸þšurGÓ\¼°&MçÓçö†0±ðMJ§ÌO7¿g‘TŒ|H*ŽNþ•›–iÇØÛ…›Ú†.(lPjÝò5üÌ“ªè¢åÓ\0“wLܾ¿�þ²öÀ;GýUY »Õ™¹.ªìå+geµþ}c{“8Ù¢ã÷Ôbg(°”€Î9·8?ËұЙsücc�hL®Úm!Ž­"ŸT´(gª­u±ïcNš[N�ãb*W÷EnKÓ'‰&÷ ‰E(ð!�Î>a«²Há”#£ÝC[S8†ð|³î�EÄ@ Åԛ͢¸§úëÛ[S<"†ó*Dg´neG!´³&z0#hôqª¸îŠhP ÀyÉÂDÎKÌ<7ÇxÔÓ}ïÖÔ…YJÕð®³g™�V®$ðʦzÑîbÓD6^-Øß¦�x–�€¸õ,%6…hѫǀæuåY3iÕÒÉ¢©,D®k—EàbC‡°ƒÚþÙû$#=D_ûÈ2×9©=øØ›"y¶O,²ÿërJi±º-z®4£ù|Ͻag³Ø,? × ŽÍÃçÜ’Üm^ž¤ ¿i�ü}v‘ûtÒIãdWÇìįަ±üõÏX4‘þÚ…dv÷9»æwh\m÷!ùz{¨=~û‡@C;<R¿Ú‘=uë~Ø—úq1"€€› ØÿÄîfz°|K÷T/ý¦Ým408’êa1ž ¤!:£e«Šî–¡DG  à+AuL­w8Ö7/¦zE#&€ó’¹ã Ñ�% ó2 <,ëÍ ÷•ì �²±—®˜N¹É6ý;„@msÕ·ôFµ†o‹ ²!L‹ Ç£™,l¯�! þÖ-+¨²4×£0-·à�V¾ññÓIw½>ئ!�½²ß§Äíº¨Ë¿êšZYà–e³s}=õâ^Ñæñ…J ‰Å)+hÖì|sÙ™3Rf‡ÓÚ}°ƒzú•GI”¤ü-(˸Ïh”ž�• :çÜ’BÜ“ÁÜ }nÙ+ Ü à�bëÕ¨{ðÝMòsú!ãV«]Z~þ_çQ®KO°ü ù…õòb�[ZiüƒTß:©'°9õCbD·€ÀÝí+ûAÀ¸éH1÷‘p˜ê›»R<*†ó"D¿²nU‰Øh�è @@Àm $5·b‰ IÍ�ŠV àxF0·Î‰:Þ›¸óµ£±¿�67! [uôEHÐ!��rÝêã, ]9�Àk[Eó”Ⱦ"OìiÖGLüÀ%ÇÓªS¦xrû”—äЗ>tŠh8_“¨ ¼’:û#Ä;°H‰…í}÷ R±có¿ûø›jW™èóbG'Dogö’³ïüsñéÓË7Ù†­ßÞ$�èí"GðŽR*)0îì+õ…|çàSíV�À=7Ž­v­ï΢ۡå�]׬šM}ö,â[Üš~ýçíôÿØ/šÏ;· �ÈÎÎRïØ¢ß#‚PòD(°)y½£g¯ÀåÛ«+‹y�@ D‚�-Iì] j!pÐ Û��òFF²†@X9ž �€€€Q¸%öV}I�`®7´8œÎK‡ÓˆÿïDwt2»Õ·.ªjüÖ'·f£Fwüôqt¬²ä€ÞEàµm²À½Á;µVÉ6†Ï Ý*‚»”æM+¡Ï`©TŒ|°…À»Î™E'Ζ¯[|\óÎnO,JÜ#ªë×?ºœ23Ü%x«S;ˆ<öÜ.qy* ”‘&§¬ ¥[>†–-¬¤²âì”Ùâ´�Öï€ÀÝik¯=:�{q>nãåè¦zMí}ÔÚ=ršújÒ¥ÁÝ´ÇØÊWŽÚÎÑÛc¥¯X@wß¼BíjâÞï‘wV·Ó?zE;Õò|8Zhù¨0Â60¶,w„LÕðÜMÀ½w'îæëAÀÕÒ##¸Û°‚»ÔC$JÑ%øN{xu¿Ã�€ÄO€£¯!'�¨�Ôøˆhþ!€ó’¹µNÔñÆ´À}4öÓæfdM+~ÕÖ+Ûxí…Ç.…Ö°vK/¯miM-ÈÆ}‘Çc윣‹™¥¦Ýv¶ëij[&L' ¾OºãÆÓ¢”¼“µ·E¾î½SËÙÕvD¨oH¶ñ’3¦Ó‹&ÊZòƒßm¤Á;�¯@UÅöMÎÎ-=ò1t銥›³ôÜScF1G`DóÜR /GsPÞjóžVÑBDoÑ$­€ŸÍwÔ‡©¡S¾Æü³ï;™¾ðÁS\ý¬> ¶BùØ?OƒCòö%¹—‡gÐCëî÷ß#~'`ÏüC‘îö Ç¨ àjö?¹»ŒØ¿æ»zI~Jõ'–¤ÏzýΖ¤��¼O ƒ»U« ¡�U$Ñ€ø‹"%›[ïD…¤æFE+ðœ—Ì­s¢ÏEy™¦4Z¦úJF£ö¾ˆÚâ9zÏ9YitùJ‹´¢“ñnnwïm?Ð&N° ï(D8+8Ð&]$×›¯9‘fVylÖ˜ŽW,ž[®½~uõG¨Y�Û镸§Z}F¥”—�N_ºáT©Ø±ù-ýôðŸwˆö•©®Nˆ&Ü©ŽéüÈQt/\6Uœƒ× ø>b×A9ðS>î#}HÇ5]�»£×άq;4÷ý¹æÍšâûvüL¾µ.¬u bHì|Î;´|âê]-nç¹|í§ÿ¤íûågOÞ±eVäqÌ é-m=P¸Ûp, •õ ÊÛ+Ù`†p\ÁݱN°œF€]}Å=Å«²f}=%úzŠMÆp$€îÖ- "¸[Ç=�€€ŸàZlnµqlŽZ�@< p�‡Ò±u"n3�d>‚{ƒ¦ i«Fà·ê”)Ä"9$ÿX·½‰¤�JNF€ÒBþaáç™öF¨^E‡–ҔʺñŠR1òAÀn¿~)ñNRâ 8RªÓÞ&½í·^·˜*Jr\7µŸüa3q4W)U•8ã+r�sÄ™'M$³÷ŒÒ¼Ý”¿aW³ö>Béÿ‘L@'p/.€ÚÙÁKgÚ´¦¶~±-ßû#¥†;Åo® S‡r>×%v¢zàÖ³èºÕÇ骹¢ì/kÐ/žÞªµu¶·§ãùSËÈo…u­ƒ~›²æ»}ݺ;ÁØ à.xôs×zÁZp õH„­cR¼�*ZE}sWŠGÅp^#�†î–-)î–¡DG  à+¼Å=’q‰ I��ˆ àp¼1·Ö‰:Þ˜+é„"æfb]+2·õÊ_¢_´|šuƒ¡'Wxmo=dGÏG®÷ìi–Ï <Û/ßxef@m⽕÷ÖŒ&”æÒÇ®:AœGA¯i×ëbc Z”cZ«æÚ}üôqôþ‹æÙh¡¹¡»Ôw)?ÿ£,t— œ s}[ÙŠ�"Z{äãæÒþÞùæ å('%ÜGHdœ“¯Ûy Ü�³NVZÒÞ= v§ñÛ À8�¡Q¢M5aê�¯-Ü+ß{ÿø «è²3Ý�ihí¥ÿüö‹ZXU%*ÊÁ;y-$Ÿ¦§¥QK'î6,;4f6@Ç� à¸{a1°�@�ˆàn÷êúNFÅ�^"ñŠu«9:ªAdÝHè @@ÀK)ÙÜj&*$57*Z�€?ÀñÆÜ:‡¥°ÔqvgVஊÄ9tÒªq„8ɾìÌ4Z¹¸*ic£cgxmKƒhXA6"4)ñlW¿üþdÕÒÉtÎ’Iš1¦âe7]¹€Xè.¥š¶0±ÐÝ-‰mÝ­¢·K‰}³ïúØrµÛ†û¾Jæ(®=}rpÈIJèæ„¤»wbñáyj÷?§õ;d�{~–3ÖÐÏëkî:Ç\ÜcÑsgy[—,pÇÎMÉ_ÓuÙÛxp”x÷$]ÊËI§‡¿z¡'îÁ9ÙÍ÷¬¡ŽnY¨Ì׋)ÙµE·.(K-�¬¬,q—˜ÔZâ¯ÑÔÙ w-9f –pß[ Ë¦ŽŽ@! †!pO É¶»k:L¶D3x‹@(ˆK¿UÇ"¸[Eý€€€¿@ànn½’š­@ÀBØåÉÔB‡e=X\ý™u ;ØÑ¶E�ô¬“'‹Ü‘üC`Dy;¼±£Yœp„i"¯Œªóä¾fùd™‘¢/ÝpªW¦‹yø€_Ç>ÿÁ¥âL9÷þù˜ÚT°³!,:¦±Iÿ~Á\Z4§Ü&ëÌÛ70B?úý&±ƒbÁ5/Óâèfå$¥s–L&!ú5±/ézM÷ü,¿’qϼuÏ-Åù™î™,�›@{—,2N:ã¼÷d\V±o(BkF‰Eîº4®0‹»ëbZzüx]5×”}÷ñ7é•Mõ¢½ì£7g¼ ÛˆÃOdäׂÑv³eíù&݃0(€€[@åæ–•‚� à0áHî6¬É;[lCz‰"¸[·š¸[Ç=�€€ŸàZlnµqÝ5Ç ­@ ˆà¥cë„T¸—çÛi9Ã� Ë"¤Ö^Y¤uÑò©qÌU¼D`óÞVŠ~Àf(_‡,ÿjö¼´ÌÚ¹T«hÖºè­y×BšRY í… à4—œ1ƒ–Ì«ÍbÁr÷€|=¦¸ ¶=B�šÝXwÛû–¤Ø*k†{ø™íÔ®‰äê”èíìÔªq¼tÅtk€¸´—¦ö>qY°˜“µ¢Ó—vd4º…¼+D^NFôB亚@G�,pG÷ä--ßwl¬ “ðèõ¯�yšßý÷%4Ƹå¹ù�M»[è[¿^¯�ÂÌò ž;µ„ü[Ø­¹ö/•äÏ<�ˆàž|Ì[E!Eò�׶ʯ ½ÝûÇG‘¬SZ)U•çÑÇ®:A*F>8–G½ã†Ó´öíãoNœz#´¿Uiþ?�Š\ayHyÕ|ÿ·EúÙâ'¤ö¾I�¹¹Ê ìlµû�ŸSmS�8ý\‡Dà D±‡t|d"š²G�8ϧ~a;Ôµds­Ú‘%Æ{‚U…ôÄ=—Òô‰…©72 #öŽÐÍ÷¬Qó–ïgÊ T–ïŒk~ Ë Ô¶Ê9 v�æ2�žýkŠªåb”€€€Lw™ J@bPQÜc0²º¸©c€[»­îýùˆÄ+Ö-6"ÉZÇ=�€€ŸàËs«áÐÀH I!€gsXu¼)+Ê&3ׄXQÙÌÍ&ñV-š¤gžTEyÙ×�8ewõðæ®fÑ`§ˆ EQ�0�=MÒݽ}é†S);S…òGX8«”®>w¶hy—rújÓìj"6LA Nw4¨Ï§æúžóæÐ§MM�5ÖñØs»¨±­OìØ)ÑÛÙ@Žö/¥óN�âûsdm³,pÏÂåC:t“?"kN©¤ Ë1vÂk äÊ‘ùc °­µÄ½ñ. [êÂc%º/˜QJ¿ýæ%Äܽ’îúùk´»¦Cœ¿~˜Q)œÈç¡Pˆj[ú}NÁ–é«èíwhîl± ƒ‚¸„®ê.Y(˜ %€-dlX˜ƒõ�6ŒŠ!½BÜ­[IÜ­c‰ž@@ÀO $5·Ú‰ IÍ�ŠV à8/™[g)"a¼½¥¥©0OHý �Êb(©M²óÙ"þr]J«—O•Š�ïa[ö´Š³Ë‡®Idã…vxá]¤ÄN/çŸ:U*F>¸‚Àÿ{ÿâ(ÛRÚ¯¢¸ËŸ©Uòó÷·„‰wX�ҔʺãÆS¥bGçs×ï>þ¦hcžŠú]œãŒH®,þm×8A\ºbº8¿è"¸gÊ=¿àqü<‡5Ï,Ÿtüú™5P÷|;’è´Y£<Ú®©+BÛêÃZ‡5žú)óÇÓoÆzçìÅ7jégOÉ1y·�9•A A çÑ£?ñiegg)Çù~8ñЃ@Ú2 ²AbÀe=6#Ô Dä§± %°G㑜hßhï}¸[·Æ£š—´Ö�‚ž@@¼FBRs+Ö…4×%Z�¼MÀLqÀ#²Âñ¦¬8Ç0JŽ|ç´S"Gª¶DOSß*¯Z:Ùð<ÑÀÝz†iOmôˆz,-ÌU"C$oàó h¥ÄÎ=_¾ñ4bá ¸™@Yq6}äÝ Å)°ˆ¼Y‰Ïœ”Úû"T×!ÛÄï�¿óé•Zᾓæs´-O½´—ªäÝo�½½M9Iº*Ž€ÌŽ@~O5šî™i¸ˆ8ýøÐEë.ñ�ÐÖéë�jû ó2Å!¥çE± D|-ßÙ(ßojx®zÿÕW. ¼ïxµwÒ§î{áУþžR$vjC‰@$€­`$6IÍ�îIŒÎAÀÛ p÷öúbv �Tá`÷¤ŽÞùÆÝr¬è-� î‰þïîD ¢=€ø“„¤æÖÝ !©¹‘Ñ ¼OÏæÖ8b�ʼ¢Ä¸À�­Ääæf’x+]ôöÓOœ "ÕËB‡ÄGGN$°m_›èˆ‘� ¥¡Dò(�f%ÚTþ bºñò4£ªP,G¸‰À‡.ŸO¥EÙ¢ÉZâˆYl”¤þ\îP‘^uéæ÷,¢“æ–ëª8¶Œ¢øÍѾµiθ<ç\|ø\)¥Õ˧Qºrò{ªkê ‚»ˆÆ1:1sIž ³P¢‹Þ3hñ`>í®ZÝ[ìmÖ_ÏÍ+gÒ�>w.eexGÈ˯`>÷Ðß©©­O\ý‚ìM,qÎõ^4¶è�ïÃl5Ìãƒ+÷ÎMŸ"¦ �DxBN"\t ^'�IƒÀ݆E~aC� £bH¯@wëVwëX¢'ðIÍ­v8öw7æ:F+ÂyÉÜA`…ã G5“†GœõeœNà¾zÙ43SD—زGΗ/n ókÚä›¶ñãréæ÷œ£ƒ€{äf¥Ó§Þ»H4xp„¨^1]lhqÁˆúXn­%þ-¥EsÊéæ«ÝûùüËÚjÚU}çžs•Šæê”ÄÂßM_J—®˜.ù*¿F'pGwÇ :�{q~–ãí‡�æ,˜Y*6ìV»~!%F€…íÕm±9¾ÿâyôíOŸI¼s’—ÒkvÓÓß'NImG³+‚y»ˆo¨k…Ç�ÃÈÈ"¸Ûc‚€Gxë®Æ#‹‚i€€[ì_óm~cXë{½bç�†^jíèõÊt0�ñ>’% p·#:ß@ÄRsKÎù�@’C;K˜ãjÅyɬÀÝIÜ9ò ø¢%v°>ÿ´)ÑŠ�çq›ö´ˆ3ÌÍ‚ä@„ãòvvé’'ñÙ÷�L,F/ø·óçÒÔÊqJÛÃZa¹ØÐ¢~ŠÚÑÖ~6s²Òè~ áøQñ;�¾!ãÓN™ƒ¢·ó¹Rz¼åN[P)ÎÅOµÍšîÞ HìÙ%•ßá@àîÕ…_<·BœZ—zn”Î}b#Œ«�_Ëëâpšû¤Ú�å«7-S;fy뙋�ž>ÿ½—µGÄô² áQC‹…Šë$jZúÁ"õšÿñý¦Ô‹A¼B*7¯¬$æö@wØW×wÚ0*†ôDp·nGF5a�¬=�€xŒ@ wS+jE¤dS£ø€"¸›[d+ÎKåÅ9¦å¦:K°Q‹iIéT%Ð*�€EÂãéü-{ÁÝÓ ,Lî &¢ä¤Š|ºbå ¡%²AÀ½8:*;oHiDEë®Q"w»Ò�–0µ÷Ê×j¶ëŽN£i í21áq_ÚPKwÉŽUUÅ*š«ƒt~ÍÝòz\tú4JC€ê馮ÞèSi!%Nƒº!áÏM²;ÐEpÇóA²éÛ×ÿô‰…T”ŸÕþ:Mwþ‹Ú™cÎäkÂq±û¯�J·^»ØQ×<+–�ƒ |ê[/Œ]¤þÆ)G¶Š]ì%C‘o;�ììlÒ9aÙn w @ôvï®-f)!€GÀ”`Æ à]êUnFlXÞ}uòv›6˜ƒ!]Dâë ÀÖ±DO  à'¡ Ãͬ·‘’ÍŒ‹6 àp‚5·ÊVœ—ÌFp× FÌÍÆ|«6�hnõ²©æ;FK× Óöí¢ý¹™ˆp\\ÐÞ¡žAY´ùÑwŸÑ¦‹×¦ë °(yÁÌR±R]{„ìpNkêŠ(q½ü¹dƒ¯Y5›ÞsÞÑv7袷g¨Hßå¼ñqÐÙ/¯Ée+¦»yÒmÔEoÏJÃ}DÒÀ‚tÏ+ÅÑÐ ‹.l&ÀÎDKæ�­¨�#¹ØØ‡êþzCõ(õ¨è÷ºÄÑÚï½eÝpù|]5×–ýè‰ÍôêæzÑþtåø4³ïÛE@(8‚@$€m`Ž’²›R6ð$\é=¹¬˜¤Ž@ YŸºÑ0Ò!›÷È‘°ÕÁoˆFâ•hTÌå�ò¾€H   `�œÍ {»z;§˜‡V œ—‥Jx4ñç�2ÓÜ;Ê” g±H«?zpͱ¨qœ6ÕpŸhà~;«ÛiD‰Ü£%Þ2^;Fò ]ôöŠ’ºúÜYœ5¦o`aÙç>°TÄÁ¯«Û¢ŸÅF °ˆzW“~Ì%ó*èë]îêH¯/¿YGk77ˆ´&ÉI›¨év¾©,Í¥ÅÇUˆsñSA]s�8ÝLu/�ä|­à˜áˆàîüõKÄÂw�=SlÞ«œ!Y´�›@­rPÛ\&�³÷’®®~ð¹sÔ½öìØ�º°Æ¶ýmôÍÿyMkù¬Š ±È â!ÐÃa$ž>PÇM5… �@ÀëäC$ð@À�… p7E.±F/n�_Ú&Ö3Z{�Ä+Ö®pDm�‡  F°øÉ8ø•g† /œ—â%ud=+"¸—gÙiœÿ �ÆY1ÉÕtHçÏ(¥r%jEò]P†¨^|Ü|Ïâ¤Ä×ù’\\;%>È?–@Cûà±™ÈI:� pO:e Þ&�»·×³�¤8PQ»S Ò—ô�0ÀvTwRgwÿyøâ!ÂKòx0Å]b»¸Q¡"€€ÀÛ‚x 7u,„qÑ5Å �@ p‚�‡Ò±u¬8/™�à>,k~Ž54‰9:�û²…•I];™Àæ=-¢y¹¸‹lÜ\ ‹ÞÎ"¶¿`®›§ÛA n·_¿D¬Ër¾ý­²@Klh°``˜h‹·ë6ÀÊÎL£Ÿ|q•™s´3hRÒª¯Yw�^ßÖ(öÏÑÛCzþæµÑE ½lÅ q.~+9iáüߢùkv»‚ÀÝ"Èí†w‘¾áòù¢uí*‚{ßDîÑñîho%Ýn‡ÚågÒ#w®&v°ójúï_¾NÛUw)ñî`ÓJt¡— E¾cÕ3ÕÍÐר± Ù£[ìc‚x‡®øÞYKÌì!ðØc*nXäM{÷÷¨Õ �þ€Ù›"ñŠ)lb#+D-bç(ð$\‹Í-«‘’Í�ŒV à}8/™[c+ÎKÅêKiÞRÜhÒFŒö•H}ÝöòËz÷‹öD˜ù¡í–½­â4ó2Å"¸”@�Úâ]w.øÐeóÇ¢Kºtz®7›#\sôK]$o×OÒAX v/¹ìLY¤ÜÚÑ œ� GLÞR7JC1áîÿôJ:~ú¸D‡³µ=Ów뢷«Û«Ê"gEtÕ §TЂ™¥¶2uÒàJ‹är#ÂŽSiÊy!7[©R‘!€-ÇÍ-4œÊÌqC+ˆ‡ÎKñP:¶ŽUç¥2=µ®¥÷Ø49±„k𦖠*ñG"�–ø¹séñx_��×óØñcë^9Ê^nÞIxí8¨(åå¤Óû/žçµ);r>Mm}´vK½²©ž6îj¡ÖÎ~ê’U;!qÄîé iFU‘ú)¤E³Ëèô'šr²r$õ™kÓÿ¾�F„êû["´ Êús!·UEnç诺t«²ïÂeSuU\QöìÚ´i·¼cHUq�Lø&uî-ݲ êÒÓ ¯¾ƒŸ#¬J ¯ã%2ÎÉçó‘´ _qA&Žuç,UÒ,ÉU¡µ¯[}=ôXôøxM]ª,ŒP>ž ”¼‚¨Zíð¢Ûéð…z×Ù3é®��>vowx¾—þæ÷#7ß»F;¥I%?ZB(ŒF „ƒU4.IÏ‹6'}  ày¸{~‰1AH>�@8²>‚·oÉ}Ô[Õ¶\—•‡A DgŒEÈX¹U¢c£¢6€€€› àZlnõpÍ5Ç ­@ 8/ÅCéØ:VDpç^ËŠs ÜY0ÂÂѶÔÙ/‹´Î*£•.?s&�2¼º¦X/ºŽo&ުő¸¯½p.ý\­M´Ä×Ïv¥µ8×:Þ,øÝÞŽþß/˜K7_³(šY®Êã{°»ùºhsººÖ8-z;;ô ÊçËËVÈ‘ÿʼnz¸@w:’)zˆË¦6¢žS¤TR�%!ßc>pÉñô�{D8 v5†éÄÉ!Ò}Þ=†ä˜éðN;Ôõ»½/ö™�w?øÒ §ÒûÕýµ—%ÃêxùÈ7ž£ŽîÁcxÊÈSŽ“Jl|rÈüvÞ} )õ"ÁȆÔ�ŠA¼Fw¯­(æ6CëÍ lòÃ�/olòÃ41G‹ @¼b-P«D-ÖZ…Þ@@œL àåo!’×Ü$ÂE×¾'€îæ«oÊ‹³MÀQܳå]ßMõi¤Q§æKøe +�t…º"°§FÙædZ'æô2WOEi2+#�>tùWÏÏ©Æ×4vÓ÷•`ì‘gwÐà�RF™L�=ƒô¿Ïìû™PšK¿æDzïª9”æ´°×&çgg³O¾gýæ¯;©o@]¬£¤ý­*Rw«ÎŠ»š”8N‰æué¼S§Ð×>²Ì¢8Ž�¿ã@»8Ý*%z³Ó 0šaÍg Ù“‹iΔâhÍ|›‡ï0ܽôãòù¨8ww¯nüÖW”äÐgΠǞÛµ‘Úd†jÚÂ4yœ?…ʽÊéi[}XÜípheê�Án?—–Ì«8<Û“ßõó×hývYÿÀs*‚ž¸Ÿñä:|R�íÂ6„·Ûíæ"´Îís€ý öðç£ýÜaxŠ@Qs‡#‰±ù¥§¦ìˆÉ¼©¶àì�µç¨#,…N"€hLÖ®†U¢k­Bo  N&€/jÍ­®¹æ¸¡ÄCç¥x([ǪóGp7“†4Â3ým£‹à¾lá£Ý¡¾Gì>Ø!ÎÄN‡ Ñ(˜&À�ú›»eGŠW›iÀQîªî O}ë:ý†ßÐ/TtðDÄíGw_§v_øÜC/ÓYyœžzi/Á¹ôhBÆþ/-ʦ›®\(6bQ›îó#6ŒR°¿%LM]òg‘›° î¡ÏžEýÕíiDmasï¯e�Œò­¡ÊB«\¬£ÕÜ-ˆºlÅtëòHOºçÞ±ÉÙ8*µ”Jpo ¡ñdþ-ï=‰ØéQJÛ#Ä×D?%>‡ÕuDè̓ñ‰Ûùþçû¯ð…¸ý™WÐ�~¿I{8Ì(Úêè¯5…Ž& é@c¯£môªq£¡Ñõ^�æ �::V @@ °eËCŠlŠ‘�$aõNô`½üÅa’†E·.'�»µ h•¨ÅZ«Ð€€€“ R²¹Õ ûë /s”Ð ÌÀyÉ7«Ä�ÍLÖGÌôg¤ [ù'ZâÈ¿'çýÈrÑæŽ<¢Ý5ò{ªœtç ±fæ ÔwÊbM>Üt%¢·›§{dË7w5Ó wþ•ÎþèãôøßvQ2ï‹÷×wÑG¿ù7ºø–?Ð&\É<�¯X uò8 „é‰>â°@®F‰uiÖä"úéÏÓ uí�VöÄš=¤Û-d’ŠÞÎÑ]�”X¼©‹St îÇ,žOŽA⪠ÝsJIA¦«æc#0y|>Ýzíb±{ïlŒ¨{±Š§ º"´A Û÷6ÇwpýÅóèѯ_Då*¾×SuC7}ê¾´Ó¬(ÿ �€99Y¤ÛaÄLŸh�Öú¿=TWMT Ü5pP ?�ày?.Ëj¿8´ltä)ºè'žšhŠ&c•¨%Eæb€³™¹EÀ5×7´�xCø‚0NG×±ÊٵܤÀ}häh‹R÷¿.zû¢Ùe”“%GéK�•ɈànõÔ�Éb$]Äè«Ï™M•¥¹©7Ìc#²ÃÈ¿}ñÿèâOý�þüÊþ”ÎnÓžºôÓOÒƒ�½™TA}J'•âÁò²Óé“ïY$Ž:¨®ã �zqºØX´¨X §Kü9üÕW.¤¢|oJGFÂtßÃò×P™êöÉ·–y�Ì,¥i uËè˲�æùD¦éKTŽœ´Nà^œ�Ý]¹hI4ê?.;žÎ*G`'  aòòg›?»ôQ‰Ûã‰XŸ™¢ûþóLúꇗQºrõzR€>ü�稻wHœjNF€8z;˜&L7Ý ÍPçv¾y÷ò)Þ<´0Dw†p¡2€€D@Ep—ß,J��Ÿ0�mûÛîø‹îÖ®·U¢k­Bo  N&€k±¹Õ �â=¨9rh± BblFÑjXA·¬Ø\4¶!Ï‹:�û© *£áBžOh#¸+Q’7´÷ETô»ès ¨eþè»F/Dn\Ø�àÑ¿ì¤ÕŸü=½ôFm\m¤J!õ `zH*Õç�¨pªßüÅktõí¤šÆn}e”F%pí…ÇѤŠü¨eœYÝ&¥Ù6œ:Ôgp‡ÊéRa^&ýZ‰Û'xÈÙäѿšcqò8çEoç5jï•Wê²3äB—d¤É'.éúãc\Ž›úˆæ9¥¸wÇ-X’ JS7#÷|rño)µõFh §-©­“óùž®^í¶²nÿ(5vÅ÷^³JÝ7üþîKéÝgÏròÔ,µí+?Y«Ý9ˆ�ã*�y�·:K*�xœK’j€O;¨S O§ŽiƒXL@¾“´x t àm‘`w–øÅ õ6ŒŠ!ÝL¢:kW/Âo¨�@@@À�«~� @wÃÈÐâ&€g„¸QQÑ*gW³Û�ÛÁ] 뤴lá©ù'Ð¥"î5·÷G�%‹2Ø?*7f6j¢NŸqâDšRYàÆi9Âæž¾aºùÞçéÖû_¤~ñm åehbq€æMÒ)ÓC´|VˆN›û›Ÿ89H³+‚4./@FIþ¹¥�V}âwôÂúÖ *ਫ·½ïdƈr©m× Õ�nÜ£"Ýn«W‘nåK1qäןé<š5¹èèæ®ýph”îä Ñþ,”³<ßyÏÚü1æ5“ÒE˧JE¾Î¯*Ïç?0,ó¡ ¥tN%¸§t-œ2ØqSKècW� 5§V ÁÙÙDÛ¹ …]Ú "¶ïQÂýx�ÙÎ<©ŠþôíËiþŒq6XlÏ�O½´—~ñôVíà3Uäöì m‚@L íÃ1ë ‚õ"�4dÖcE� àK¸ûrÙ1iH��àFÕ«»' ã¡Ë1ëw¶¨-»@â&2ò Vܽú·¢U¢ÿÄÌA@À $5·æVEJ67:Z�€· ‚»¹õµÊñ¦¼8Û”CÆt�¦ÆˆÖh@}'(i.YÈwòqåÑš!ÏöÔtˆ³ÌFôv‘�Û X´Ö¦qr¹fÕl·MÉ1önÚÝB|ò úýš=†l*U‚u¯Ÿ8)HÓJƒT’‹Ú~¸Ô—�Lò2T^‹€ÉøYJìž§Xˆ…÷×åYzæÕ†lCe¢KVL× ÕjÛ#ï5�¯Á[jä‚닉ïë¾wÛÙêz\!ÖqcÁÃÏl§ú9ú½Ý‰¯½ÛUTb)ÍU‚OŽÔ‹t,Þá(;3ºg^Â2Öc;CNÊ èî™)·:ƒÀÍלH'Ì*Ó³»)LõGJmc‡òñ¿Kí²²Q‰Û�DŒþ„âó‹;Χâ|ÿ|FöÖvÒgîI»rã Tæ@6­Ñ(t8t ©ÏqvùÁ ÐhÜý°Ð˜#¤€î)€Œ!@Àj^¹�C4móÃ\�4ǰz™½·¦ÍI&Á‡€¨ÎÚ²JÔb­Uè @@ÀÉ $5·:p*3Ç ­@ xFˆ‡Ò±u¬:/•)�»A– djKêÐ[Oš[NYÓm˺8aÐÝe�{ŽŠ¬‹ä M]1rtAn�êToL4…³àHÜ?þÃfºôÖ'é@}W\#óu£B‰ÕO ÑÜÊà˜x=®†oWRþHcí©öÕ]БÑåˆ ?zÓ×ÿJxÁ˜ÿˆN|ø?ÿÝ~ýRqæ,Ô­nÓ(ÖßnÉ‚¹Íµ£¤ŽrÕo|ütZuÊq<7ðnßytƒh:;j”:TüÖ¦¸Ÿ»d’8'¿ð9N·¢¸;ûÑE«.Fwg/^­ËHÑO¿¸Š*Ksµ£ìQ"÷­±¯‹ÚNl(äû¹z…~ÝþQjT÷Ëñ¦™“Šèѯ_DŸ½îd wOŒ·wÖPÞJ7Ýõõ²÷ž�Ø9szäld �““MCÃî;¯˜¢S«vTÿý¾}N5v�¸‹îܵ^°œN@Þ#Ò閻ؾ�Ú]l=LO5ˆW¬%ÎN&H   `„®ÅFh½SNeï°À_ `5Žd„dœ€Uw„çfWÿ�Äÿ¥¹ñÙÉ-:ûåq—-œ 7D‰ç ì®éçˆî"×è;—¯œI™!×ÍÉNƒÛ»éƒ_}–¾ü£W‰ä±ëž&èä©oE`ÏŽ3»Ô/ßpT÷n ¨@IDATŪ¿x"`ó®JŸ¸çyzô/;¥.‘…À'N¤å'È×ÈF­¶(J÷³8b;Gn×hÀÆj~æÚÅôÞóçȹ´äOo¥–ޝ=MæèíÑ‹lÍeç�cà9K'ÛjŸÓŸ2^Žnß/ë!�>-_اsÄ)�ÀÝÇ€4Éò’úù—Χœ¬è;4jw°-2�EãnHíÊ |ƒŠØ¾§9LqÜÎ�M‰|ყг\IËVºaš–ÚøÅï¿BÛ÷Ëüx÷!vâô‘æßR¾èìH��ñwnGö€ÿ̬Wí\r&77C´HÜSÇ#�€ç D¾IAJ1�uÛ›R<"†s3ˆê¬]=ˆí¬å‰Þ@@ÀÁÝÜ*[%$57:Z�€· àÁÜúZù,P^œcØŽànÇ·Dz�»ÿ¾˜7¼pn°»FÁ=A®‡±¹jj=ê’Ï<ל;ÛUó±ÛØ×¶6ÐyÿýõŸÕq™ÂÂö%ÓBc‘,㉸W§oWbñФ’�P¤X¢y›Ýzÿ‹Ä¢c¤ø°/áí×/+ó§JŠV˼·Õ‡©gPþìqÇï¿x}âšEân-èQJæï>þ¦h~®ŠîZšçDyû[âv¹GKÅù™´hNy´"ä½M@Á]ã€ö|eîö¯�ÝÌ›VB~ö옻˜±SåÆš°öÞÓιðõ™w6z£:<æ„Öã:}¸­—®˜A/üà*ºéÊ”ÎÛêø,=öÜ.zäÙÚYÏR; eA“¬e„Âø ù|Æß+jÆA`]uP@â"à¿;¦¸° €€Ápw3àlóÌÚZµ5°üÂ(ÁîÑÜc ª³vA#Ò·ÖƒÞ@@þߣxÞ'M‹Üž‘vT')úw²j£o)�ûÝ¿z=EV¹{˜i é½çÏ'ÑÙ¡v% ãT«¢Ãò�.7µ„~úÅUÄ»¨x1ýð÷›©»Wޏéäèí|Ï4(ìzÃçÌ3Oªòâ’Y:§)•²ÀÜ-EmigÒ½RR�eéXèÌýÞwÑ<úáçÎ�ë:ÆçÕ­uaZ`”xW¡T|5Çä÷6‡éŸJÔ¾¹6LMj\á‘G\ŒKWÌ ~pÝtåJOóïKav¸ýÁ—i·f×/Æ3·2ˆgGñhB�99Ùê]…þžÚL¿h“@WÍ‹%{bÖBˆ“€ï¢â„j ÆD°ÕŒ1`ÕÞº·Õ¢žÐ�× :£µ+l¥¨ÅZËЀ€€S ¡p7µ4ñˆ€LuŒF „󒹃ÀJÇ› å&î‚pÊÜŒb·R�TÅ4Æ8± Þ'PßÒ+N2+êvŽ‹ XH$¥³—L¢Ò¢l©ùoxbÍnúÄÝkbŠÛ3• }aU�&©êvzªŠ4½,ö׈<º�žzi/Ö:ŸzïI”Í‹,$ŽâÎ:ŽÞ®KUêÞá—_¹€òs3tÕ\[Öªv­ý‰¸K© ;@¼Ã�SS›|Y¤¥ÇWP�G×ÍÊõ˜P–Ki‚T¦áQ+GC_VÖˆ‹ó!p·Š³—ú¹à´©ô¿_[M…y™qM«Où=íj ÓëJt¾§é­¨îFEçÒ@ýªï†ÎíhxKÔþ¦Š_×1u¾™9©ˆ¹s5=ôÙ³hü¸\iHßäÿï³Û‰ï…uiöø in‘tMQ"�áˆ7AÅ ;¥ BoÝ¡ qŠ­°@Àb¿™rÅ4`$€€S"�õN±ÅOv¼°¡ÞOÓÅ\  :÷ÅÓ²­i„à �€€€ˆ”lÖaUGÃxzü –€ß�9œ£ñ†ÑÍGpOíóˆ.‚ûñÓK�Nõ=D ¡UVòÙ}ÚCxmŸ G!>U:š1ל;;Z6ò#ðøßvÑ-÷¾ ¢�êÏÛ%¹Z49D,ÞuJšP Y±¿JüÌý/ÑÞÚN§˜íX;ÊŠ³é†+ˆöñµv§îéRq~&ýê+REIŽ®š«Ë¾÷Û7©—UÌBrrôv6¹­Wþ¬Ÿ»t²0+dN€#ÝÏŸ.;Pv©�œG`DãxPR�»óVÌ-™WAOÜ} Íš\·ACêX«WbtŽêþêÞ·"¬h �EwçQøþ5ÚY‚oÅúÕå¥Cí˜ÂböýÊ¡l[}˜Öª>Ö©èð»•h¾¹;BC&�ÉY¨ÿ…žBÏ>p%-?aBÜóñrÅ-*Hß¿ÿŠvŠìTÉ÷ÁH `5�¶nÍ…ÉêÁÐß¿D´î_ÿà°€€&À‚ÎÑ€€ÿ¨�£ÞG}dô‹TÎøÕ-�ÔÛ7H¹9ñy¸§Ò6Œå,ÕY»ˆàn-Oô ~ !©¹UÆ5×7´�xà!JÇÖ‰%R<¶…œ3Ñd÷“_ºË–È%%Sú’?'+�¦M,�£ÄótÜ…ÏýËÏѤ¥Ä‘ÛÏ>y’TŒ|Eà7ÝI·Þÿ"Åж�ElŸ2.¶�ܨ ‚´SE4•Ž#ø®çèÉo]JYðlÑ.ÓG®\H¿üãVjïÖl�"ôÀÑßqÇù4£ªP¨áþ즶>úÅÓÛĉpäöB9�m(ß3uHŸ¢s–@à~43é½nØÙµ˜îãò †Œ ÇÆL]dý’|iãÒ8~èY*âùŸï¿‚îW»Â<ô› 1w¼9|B|�Å‚õŽ>Î=òüàÓ„Ê:2÷ðÖÖü=©"ŸnTlW+ÇO~>Fz‹@wïÐØýá�æäÀŽ�N½Æ:ºŸÀÞ†±ƒû'â²"EuÙšÁ\p:g¾-s:5Ø  ¤©íf�RM€Zî­mOõ°Ï…‚ˆànéªY)j±Ô0t  àX’š[ÜÍqC+ˆ‡žâ¡tl�Ѱu_‘³À}ì‹÷c‡ÑæpTºT¥QVJó¦�SÂGŒ$>~È× Üql¸ýhê’£I_±r&¥¥ák&i�~f;}úÛ±Åí,êqº°§,?@s+UxÍGzÛþ6úÒ^•p ÿmy9étó{æÁ;sþàöshÑœrÃmÝÔàÁÇޤɫNMÄéÑÛÛ5ÑÛ§M(¤é½ëœ`õqvòqb—]b l$ Ñ°Rq"¸Û¸4®:#=DŸ¹v1=}ßåt¼f#“añ»ü$k¤§èuOœ]FßW׿—~t5]ñ<ˆÛÃÄì?ó�—h}×a¹Gþ©–œæŽ×ß_Ùÿ�@ürr²¨£GÞ(þžPÓ(�p0‚îF¡¡>€€–Þú‡ˆú5š€kVÍv÷“hý/ÿoÝöÀßcŽ0U‰Û'•hTã1{H]Ž–ý­ËèóXJã �wÜdf„è’3¦Óo¿y1=yïetÑòiÄNhHGøñ6Ó_ÞwdæQÿñ}%ž�‚‚-#J3þžÍ²ÁýÝQo]Yã.#ÀìA¬& eõhè@À'°åŒ ½n[ô­í°c:—¢êY»6ˆàn-Oô ~ €k±¹U¶2R²9 Ð ¼KÜÍ­­•w¶À¨È�Ûp„ÄT {tÜç[]�ç„äNõ­½¢á™ib \@ ­Oª-˜YJs¦»`©7ñOJÌó¹‡^Ž9ðÔÒ U¹DÜ~h2¥Jä>¡H/âúþ�v×tj‚ßQŒE©½îä(%ѳn¿~ ]uάè…Ê}àÑ 4<"ï1yœþسG«mל7ÏY2Ùn]5~Yq6M©,ˆj3³î�¯QQ!3étÜKÁ=éü½4ïôáw-¤Wöºëc§ï€agbûÊÅUôíÿ\I~u-}÷¶³iéñãµ;ÛØi¯Ýc¿°¾†¾ö“µZ3&«{à¢g_×µ@¡ã ô :ÞDO¨îÎÞ ÇSo,‘@@À:¸[Ç=�¼M @�õ€‘zϬ=HüR t ^ÑÑ1^fµ¨Å¸h  à6¸›[1\sÍqC+ˆ‡oâ¡tl«�]'”å;H9ƒšÈÊq4�»ŠNàŽîqcôlE}wˆܼðíšHÄ.›êæ©%Íö]ÕôŸ÷½³ÿieJÜ^ìÎÏÇ4%Ì×EÑî¡ßõõŽÄäàç —¯œAÇM-‰‰à?.�Oy× 1ë¹½Â�ú.zô/;Åi°sE^¦³?3�ýôùy9écbHq‚(ˆJ`ÉqQó9³«_,B�MôwDÒµiY\=l– ï}í…séùï¿›~ü…U´la%¥ê;£�¶ ’¾öáeôúÿüýòËлΞI|>G’ ì©é¤�|óoÊ_-°°}’ÚÅ ’I ¶U³a2öyßj£Ðu>G€éƒ$�â§$*º¿#ëag¿hôâ5¶P]S'M¬°×‹Ý‹l½4'ˆê¬]Mˆí¬å‰Þ@@ÀRõ%Œ×Xê¾ñÚ\1H5<#˜#nõ³€™îlùàH„²3’û†…Z‚�>-¤9“ÁÙÜQä�V#êijë‹:è�”.É¥ø³ÏbM)�}ò$©È·ùݽCô¡;ÿB½ÒIóm2Ó•¸=Vt'CT¢š3>HªGI ¶½ã@;}á{ÿ {oYá䩨j?rdö÷ÝñŒhÇ¥+fÐÝpŠ/"Ä~ûß ¾¦HÉéÑÛÙî6�SÐÊ“ª(]E$F2F`ÉñôøßvEmÔ5v�Jî}pÔ�‘)�® Ü ÜEn(ˆM€#¨Ÿê”±ŸN–ù¥ uôüëi�Š.=‹ÄîõÈ9Yi´X9Õœ6¿’N™?žNœ]F,rGŠŸ¯Í¾ò,ñ=±”2R¾�ÄÙ["„|+¤…Bt žpV°4ÚG$Œ`¨F™¡>€@l¸Çf„  ‡"oDÒðXb›%Õ÷Õ´Càn IïvQ�µk ±�µ<Ñ€ø�@€•^H† Œ†eq•áÎÐ@àxF8GÜÿX}^šh2‚{ eÜóÑUì”ÏÁ³&áK<”µtô«hµÑ�pÉÅ:”pP ¼X^’Có¦�sñì¬7�ßÝrß ´·¶SÛùŒò Uºÿ™ K/�­ÄI[ëdAòoþº“–Ÿ0�®_Ï©  Ú4e4Œ—@vN¶zO!;ZÄÛê' ÁÝ86´ˆA¯˜cB1€€q_~°~â™77ª‡yï@ãÝ¢E¶ìm¥ÓO�£&ªø•€z¨ðëÔ“2o«£6&ÅHt   à(ü"Ÿ#Jb!Gë cpÍuÐbÀÏ€ã�¹%µú¼4±<Ï”!Á=Ù²„MLóg@à*ÂñIA}K¯8ÓLÀÙ¸¡ ]‰˜£·ó=-Ò;|t=ûê�w2¢ü5S‰ÛÇ{@Ü~hj%¹šX ÚöèN.\ïË?z•V)ao~nÆ¡fø}þ=tÛÙô®Ûž¢]Õÿ*YuÊúΧWúƉì[¿^OR >ÕLçüwÚýJC%9ò:c׋Þ†þ˜1©�Šò3©£ûØRøÏQÜ ³ù(Ar�áQùzP‚îNX"ÏÙÀç×9SŠÇ~<79—Mèk?ù'½ôƱ{‡OcººÆ9ûp"ø;YF"�B&‹mŒ~û«#…;bÔA1€&€³ºadh �H€xë™È…qÔE ¼¸±žnºÊÂÑ•ç :£µKjµ¨ÅZëЀ€€S ¤+‡³!ݾÍN5ÜF»p͵>†ö<ÞêÉ8I„e¼§·ZL,Ë5ÕtpÄT3C�tÜ�‡ÀÝK/V®ÓÜÁÝÝ+®¸Ÿµ¸ÊÝ“³Øúç_?H÷üZ¨nbQÀSâöC§*áqW˜ºU$åh©­k€züMúï_­yŠ@±ï>û�+éùõ5TÛÔC3Õî(ËNð�ɶýmôÔK{Åc¡¼ @Ùjǧ']ôöÅs+â^s+Èßg,™7žþ²ö@Ôš»!p� Ʀ̑Ñè§©÷`¹nø G7¹ 1<òìúÉ“›µµØÉÓ »i'‰BÇhévŒ-þ2$²�ÖÜ‘‚7•þ¢ŠÙ‚9ßå« àRáW]j¸«ÍþÇ›MÔ'… qõÌ`¼U‚¯X…r¬«E-–‡Î@@KbRãK3Ž.˜1ÞZ€M€·êF2N`T�ÐxoDUåùfšÑ` ¾³ÓFpŸ^jÊn4ò}wïÌÓo3éŠ�ä@Ã"µ3Nœè7$â|ÔwÑÇï~^»CGªœZêͯãø6bne�ÒB""úÑï7Sms�\%”–‹týÅóèôü#n祿÷W²s_“JÜñÙÑ ÜÏQ» ™'pÁiSÄÆ­=íùWlˆË pD}éÕMqA¦oœv,‹AÀá^ÛÚ@·÷e­•|/<£Ì×síDPè{ëû\c«§ pT$°žî"¬gŠA�@„ p·áH ‡im› #cH·€¾ÝÚ•B4Yky¢7ð Ü�¯4®¹Æ™¡ÄKN°ñ’:²Þ¨¤Þ8²ZÜÿ•gSFºF(ô48’\ ž& ]¥tüôqRò}B@/p‡�[ƒ¶^Ùò%ó*(?7C®à£’¾�ºáοRWï�8kÞÉ€à^ö'ËTsœU!Ý84N¨  p$�Pb¯#‰ÄþÏj!iìQüC�æÖ:ÏJs Ö“ùò…Åía€)•”—ãÕ™aªh`„€Nàž�ÃÃJGÕmï>øÊʳO†P“‹Ï�·=ømÛ/¿‹eQûqJÜnÂÉQÇC<ÆŒË PQŽüœóÄšÝÄbf$8œÀÝ¿’øÕ-ÑÛ;Ô9S:kN,Ë£9SJŸ6þ6H 0/S»sH‹ŠâŽd?�aÍW¸Û¿>°¬&Ыv”ÿàWž¥ÖαkµñÍ›à�{a RN ”–™ò11à["áî8@’B÷¤`E§ {ÿúÃNEaH¤žÀú�Í©#º†¢3Z»TaIéaí0è @@ÀcÁÝø‚&CHjÜ ´ox9¤l—,Q¡:-NËó ÷È�$ÃI LÕ;(›4ÑÛe8>*ih•C}sTg$÷ˆ‰ølD"[Ô_ÿy;ý~ÍíÏ( R~–,úÖ6vaá´Rý\¿ò“WE§)N&'H൭�´f]�ØKea€x7¤6�SÐ9K'{z‡T­Ï%§O‡jUw¼¦ñ¤¬`DEÓ—RqA–T„|àïFo¹÷­£'OkÎø ådèï]8}˜ìp=š÷X7Ýíæ VôõCæöU„ý àP¸;ta`x‚@€^ñÄ<\6‰gÖÖºÌb˜›JAˆW,Å ±�¥8Ñ€ø†@(ˆGq£‹�îF‰¡>#Çc¼¸v2ÎKáÓLI^ÔÊžA¹ïãgŒ3c.ÚxŒ€.‚{fÄ n\îŽ>91ï41kR±§e©Í-ýôõŸÿSÛçx%Îå?¥ÜÌUÈs^»¹�þ²ö€Ÿ�`®÷ĈÞ^UâŽçfV·©ó¦”Î…S�„ÆPþy§N¡´´èÇİV·jœ „ʦ ð:H©¤Ñt%6È7øÖ¯×ÓŸ_Ù¯5}ji�JÔ?H �jµ­ò®©¶ÅWãEhúu?öÕœ1Y�”ˆþ$˜²á1€€Ç ¼êñù9rzµÍ½TßÜåHÛ`”ýÁÝÚ5€ÀÝZžè @üBBRã+[)Ù¸hÞ%�—ŽFW7Ïf"¸³ÝƒIüú¨Où Ü�5Þ«Ï‘ûZû¢NŒýëÓCQ‹�épí‘ GoGì¢;úOêîW’£¶OWÑÛý˜¦Œ RPs[qçÏþI#¼M’¯ ¼üfýcc½È`BQÀ5×�î�I‘«³ÕV&ËN牂ø æeÒŠ'Š jÚd'± ,% ¸#‚»¥¨ÑØJà©—öÒý�¼¡µ¡,?@UÅšBmk‚€yi¡hì7ßZš& ‚Ÿš¦‡† ±øó [,*(°„@0ÂMŒ%$�w²¯¦Ýx#´ðDp·v™ùË|$0Jw£Ä’)Ù¸hÞ%€ó’ñµMF÷ªrsÜFŒÛo‹�aù™gîÔ’x»A=�híP¢¾èBU¥éCr)­ÀýäI.�•ufÿsK=þ·]b‡ìØ1·R/ò{  C}öu‚¦½µ�ô«?o÷ÀL1³øuê=¿Z'6©o®«ŠÝóõ5ïz!¥Ó• ;3Þ^£ùW¬œ)6á]‡:ûåµ¢ÀMÝ:Øýž�(Îϲdt `/�M{Zè?ï{QkDžrôœUážë¸v2(t�ìœì¤ì¸è:6¦´a6pÇ� ำðËJcž `�êç ·©aJÜö[÷µÚ0*†tDp·v•’µÑZ Ñ€€€ @Hj|UpÍ5Î -@À�P¯�ðâºÉ8/M(3'pIŽ˜'¬ºÄó,Öª—cê{Œ@}K¯8£Œ4Dìá8¸€‚C£Ñ LO Ò²ü‰˜#�î»/GôvîœñAò»ƒÇD%NÖiz¿õëuÚøZÀ(t=�5ëÒëÛÅyLTÑÛÓ\¤ ï§Bç¨]/�¬#pÑéÓ¨²4WìQÜE4I+èW›™l® ÓΆ0é"¸—@àž´E@Ç �"Ííýô_ý / ”ìè8ÏÇŽž)Z £!0�§½OR‹"”�{R £sð7|{åïõÇìA ÉîàïB×&yt…ÀKåÄQª#ËG ¨³v±“!j±ÖBô  àD¡_F×%‘’�Ú€ú àexN0¾ºÉx0Á}pظýñ´Ðô;e|a‡°x(z»N}«,p÷»À×­+ß­ÙÍýÔ•”›•îÖ©Yb÷ÏžÞJ;È;g–å¨(÷ú�{ò8ùëÇöîAzø™–¬ :qÞ óî_ÊÑÛ• MpQôvŽFß= ;.÷¹S�ÕG';ZÝpù|±ÛvM¿W9j!%Ÿù[Ý¡7ªGI·‹Á!K¦Tæú¿A\H`PyÀ~èο�ÎÁ9¨n�YÜÎ"w$°‹@K·æE–]FùcÜÚº¿uÐSÅ,Aì ¿a²ÃŒ  àE¯zqRNŸÓ‹ëë©—C' �ÀQÁý( þ ±]‚Ñ@|J �ßø#"€k®!\¨ † ¤ÁñÆ0³dœ—&¨ˆ”fDãR”uÓ:ªÁÀ°,šRYpTmüëG:�„ î<"8‚»”Vœ8Q*òE~c[qäq)±¨{Z)¾r;ħ¢0@9òsÏÿ>»�XŒä/O¾°—6íi']U$¹»%±˜z4ÝÚÒ¢lb‡@$k ¼÷ü¹”Ÿ›!vzP‰®‘’K ³ÿ-a{uk˜Xè+�—K'Í-�U å %À÷kÿïÁ¿ÓúíMZ gU)/K¾÷Ó6F!XD`o}ŸE=¡ƒ½Ý 0T0FÀE¯ ŒM µAœA @aÜÌØ°#á0í> ¿(¶Á$ é�^.X¹u @@Œ€Ã™QbD££¸æ§† ?ì,?«C5“q^ÊHѸ¢¬CCÄý{P#D�»“(û5�¯¦Bà…˜ÿ²t÷Ì4¼pãÑ= [½hŽ¿Åi_ùñZêÑœ9b9;Þ9~ø 0­L>ì©é¤×·5¼ÓyžÀÐð(}ó^ç©nƒ¨R9F¸)uiΙKæU^Å[¿šyÙéô¾Õlj·ôDˆØHÖPaÚÙ¦MÿŸ½ó�ë(÷þ»»ê½w[’{Ou€�!„–¡]B¹\¸>í¸.%’@€›„˜P=¤'¤9±cÇ%qÜ{·dÉê’%YeµÒ®¶|3rœØÖÎì9GgOýÏóHZ�iïû›³§þç�¶()�¯•Ç&#ÜÿÃwjšÄ«¿h@@ �{ŸØC�®>"­ZSä!¾’˜I +3ƒGÂfšàÚ¾Ù·š0׎>c@àn gôî%JÝä^çÍõ|¯$й–¡w3 @P§/ý¨’%úv‰Ö@@@ÀçÅ­¸ÚaLF¤dµ6 <8™€+K¨Þd—ªKsTÛf‘Cù�ÞIÁ½®2WïîО ÈîúÚo@yâ@(¾(�‹4Î,¶ŸS:YüÊ®zj]£°µìtUÙL˜+tFÇŒÂ,q6¢ôχEYØî@yv?µõø…žñèí|%;¥!‰�zé‚ ;¹b+[?wÍBJ•„úoè‰b…�G´{(FÛŽE¨‡ýUšÞõæZZyχiñÌ¥UP@ÀbVmi¥[ÿ$—ze{¨ŽMôD³ xSÓÍ6ÁµýGÉ �»kGŽƒ€1p¥a gô®%Ðöê�ýÌùC®`¢ãkwtšØ;º¶*-ËÝ[Õ+Ø�»F6€€€ý@Hª~Ì’%$Uo j€€3 ฤ~\#IZÍ©¦L½À�[ŸŒ(îc!1—ºª|q&r\C £W,TLOq Ç8:‹ÖfÖ�šëÆ4Îf}ÿ·¤®Ïd‘Ê©9>¢Š<±Àý™õGÉ�,¿Ilµ!�A�~õàN¡åìðb·èíÜ™Àý¢…åB‘15eEYô±+çáÑÅÛOˆÏiŠȘD ÀXîfÛ�°ÈíaÁ]Iª*ɦ?~ÿ�ôöÃ?#�Ø“À‘–úÊÏWK' e¥yhn$göaçYíùߤQ efE¶›Ô7ºp \m¸d á&˜I€=Üßhfÿní{ÕÖv Œá�[Ç_ä7"¸‹ÈhÛ�»6n¨ n'àõ‰Eng#ò?MBhbQgØ.$€•%Ôz4’œgU"¸sëƒIX…yt\ìcm"¸«ßkœWCÁ==×;vq¦?¦sf»7ú꟟ÙO mB6eLÀ�—‰ý]¨”ñ-3ÊN^ÿ’DƵ‰íö#ðëGv¹‹R-‹ü*ÚODuÌÞÎ_½„‚ßL6Ëka½{W½0bl¾ùÉ ('K<ñª¥?Jx=¦}$øÂµÇú¢´£%"�Èqz|Òôç?¸˜Vÿî#t‹ÞŽ `_'†ƒôÙŸ¬ ÿ¨Xg�ê#ZPe¿ÕWì;*°<�æž±DE�Ÿ 1ÚѰ|™øB?}¢M×€ÀÝuC‡AÀxLŠ%iŒÇN!]¨±¥×„žÑ¥• ‚»¾£MRÔF}­Dk  V#àCxGÕC‚¡¨"€îªpMNÖqIsw�îüVG$šçûKµF!¾zÒ¨aU|éê Ä5�K}SÁ=.+o”E¼[2«Ôʦ'ͶÐx„~÷ønaû)ì [} ^³ ± Ψ8G<àŸ/`ñW?'äµõøéþ§ö ]ÉI÷Pi®xV49C½ý¼¹¥”Âw~¤¤(-̤ïüûRaû\ ÝÐ%öI%��@Œ¶‹PkL¹ùôfÏ�SJÏÞõAúὉ²ù’ H ¶%fú‚/ýlëúÀmÏ«ô¾îBDÈ0˜@zZµ÷ŽÜ+ºãØZfЂaWH:Ü]'1: "¸›µìk„ÀÝ,öVíÜõ™d‰Zôµ­�€X�„¤êGç\õÌPÔÀqI ­“e“µ²ÄôŠ<õưc’hëZäâvÑ|Þšò\ˆ¶´@uX�ñp„¸ø7^JaÑüì'UŒç‰»¶ Å2À%.�àþØêêé�?‘ƒï<ê4�^‰$'P‘/>"ì:rœ4÷Ë@®­ üâo[…ç îX]‰xÿ°²ãCcâcæÒV6Ý1¶}ú½óiñLñ #\¨Ý¢�#)#ÀW$8Ô¥½íÊ£ßó(ú·|ñbzò—ï§…3°j�2Ò(Ö&pó6Ò+»:¤FÎ,õR>V0’2B¦±Ò32„ϰŒµÄ}½±é„¸»oØá1NwÑ£Cp�ö’®½Ìë÷yn¾Çkwvšo,°Dp×w8Ø ú6ˆÖ@@\AÎÔs$‚s®zj¨Ê ฤœÕ©’ɺ¨¯Ò&p �²LŸ¿2Á|mE®>� [�-WïÃ[Û�m„éÿDÇþ,É�¢5>Áò·�‰£·g³¨Óö潃r”,Âçƒ+ÅÝè11ª¿½�}ôøK Âî ³=T�eÏï‘,‚ûE !pºŽ|’îm_~+ÉÉãQÈûüxž�{× ‹ÚÞ¡ãÃÊY]sé Zó»�Òg®^@˜0�ˆ0òAÀþ¾ü ýå™ýRc+Ùõ¯lò¢´22A I†ƒö¼žLC›�Q î†Gg àNxÔìÎq‡× `,�Gááœ6Û)zãVni§±à8`€Àë<ì¡/’~¢¢�†úu�–@@H/þÔ*"¸«g†  †ŽKjh�,›¬ãÒt&OÑ – ÒÕ{Ç„®’G uUùZšD‡HvSì7Ø~Iôö9µ…”™žb?§¦hñó¯6SSÇ °•éEl1va.2Î&P‘'~É#åyè`$Gà�Mo½“Ô§z›Fog‹˜P@0¹�O :n™ÔodêGàÜ9¥ô©wÏ—6x¸;*/iEdްóÿ®Ö(5ôD)¬0Ø=_Íé¯7¿‹~ó�+¨¼(Ë”à"¸ƒÀ«{:é¿Û u–OJ›Q"¾¦“VF&$‘À±ž±$¶Ž¦%Ú;ÖÝÑ*ÉG€èBWº`D# ‰x°4M"DIÉç/[û’Ò6µ'¼dÖwÜ’µQ_+Ñ€€€Õ R²úI–�T½%¨Î$€ûõ㚬ã·W—å¨6ˆk�•Ç[LܼL0_W‰î‰ :¿ÄÈXX褆9¶�a ¿D°dV‰1FX¬—ß<ºKhQfQqäíB@q2ÊòļýAzacsœZØdgëv´ÑË»:„.”³}"+M¼_+Z chL|Õ5¿¾ˆr²R-`¥{L¸ñ?–R�äú™¯Rr #Bã˜GóúNÁ™4÷FigK”†%ûóëØ~Ÿòå�žC«óazû…ÓNÏÂg›hé¦ÿwÛ‹æAâ«ñÌ«ðJWÍTÅfH*�ô´Tj=Hjh\HÑÛ…h�  'Üõ¤‰¶@„Øs£�ÂLd$•Àþ£¸'°Íçd�ô#‰ˆ_fè× ZpŸçcµcš,!©Z;PœJÇ%õ#›ÌãR]ežjƒx”T=pD%å†i±OµC¨`y~iwË›Ï" ‹à~Îl÷ Ü÷±ç©»�ôžEé�k ñjí Ê>¥±EвÅ÷AϾҬ¬!”²~�tëýâE}ù"£Ó‹íû=?^º Ücä$#ó²Óè¾ï½“ÒÓ|B·øeËž¶(a±¢þ‘m?¡¶1Åd/œ_NÏß}-Ýø™¥®\ÕE¸c!@€ß×}î'+èÄpPè ŸÀ¼ ÊÇ&º‹ L#�–‘IXpÝüì’wsУWpû>=pÝPÁa°7�hw³FpÝNq”³lB¿æðð·HºˆâŽY7–h@ÜD‘’Õ�¶,‚�úÖP@àl8.�M$ñÿá$Nv­¯R/pçË¢®'öèÌí2ÕjàŸÙ:þs�€d'Á\>û�°,zë’Ù¥öshŠ?ºêˆ°.Ô.ËÅó5! IFE¾˜Û+,Òw2'�IÌBV<þRhî¶\]è¡tö]²k’¬z�»9£ºhf1ýâk—J;„b´§5BAñ"4ÒúvÏ ° ¬:¢´Ÿý(eÀ'ÜþÕK豟_Msk íŽöƒœE€¿ãüÚ/×Сc'ÎÊ9ó_¹=‹­`„V$àŠï1¬h¯“lŠ’w' (| €À݃Ó@ÀIºÖ/;Îüit’OvñåùMm ¹ô‰�]É@;Á]_ØQ� @@Ôðb™Zdl‰\œsUCCPAÀëÅ#B¸&Š&S„W_•¯Öœ‰ò½±êödbù鹪ÛCçc¡P‰GøC²�p”O�‰oo ÌùuEñ3º5Ì€<±¦Aè]U�—°@¢�4£0ËC¢ãà?Hû±© M2ÇØ»ˆ_üm«ÐÚTýµÚÆ« ðÇÁ²IAKT}GFr \û¶Yôù.’v¯—÷´E„ç=ie›fr1û‘îèDÔö>½]iâ<×þþ£ô‰wÍ#¼WRJ å@À^~ñ×­´rÓ1©Ñõ%^*”¬Â#­ŒL0€@ËqÉÌCúwq¡Ì¬Èvû×A $€GÍÂFW X¢ÆŒ}`,¡£­x9`{+ö ÝŠ¾£’LQ‹¾–¢5+@¤dõ£�s®zf¨jฤ†Öɲ¶T]²’æî,*¥‰Ï‘Íå­(Φ ¾ÉõøRö¢$°ŠÊc»¹ücâcǼºBJOcjT¥—¶µRß X$�èíÚw>1 ?SaqýÎví�£¦eÜÿÔ>êìÚ3­ÈK)6~;Í�™¢E=kÊr¨²$[è;2’Oà?{½õœ*iG|R×n&rŸÿ¤ Ø$3!jê�Ò¶æu)÷µŽ­ÖôÀ-ï¡»¿õ6*)È´‰·0@@-�'×4Ò¯Ù%­V–ça“ÒÄ×nÒÊȤ¥¦RKOÀ€žÐEÛ–/ ÆÙŽM   ;?BÐ�H2OŒ6&¹ 4/ °¿ w×mF¤ }‡Üõå‰Ö@@À-¼ÜŠkë˜HE ¥1Ô8ƒV–8‡¢’9ñ¦¾ÚÜî²èíµ•ˆÞ®hqA¡îŽåÉ+é%³Jã§RGYuDX”G¯Ä!E,Š»(½ �»�m¶÷�Ѳ‡w íÍH%ªÌïŠÊ`. Ó… Ê…yÈ0†_yä·7¾ƒæÖJ;ä:w·E©¥ŸMX�–´_f„ÍÃme~maÂöö1áÄÕ³=Ka3OþûºóèÅ{>L—ž[}v6þp�]GŽÓ·î^'õ(7ÃC³Êð [ ™¦HÏÌN<4Ý8‡À®è_u¸‹p@ÀBpEb¡Á€) àt‘˜9& òË»:MêÝZ�„+úŽHB;}�¢5p œ�µ ´(š°¶ÖP @àtˆà~: eŸ#‘äIa¦•瘨M£ãúØ$Ñ-�舜€4‚;ÓŒdcañ±cáŒ"Ûø¡‡¡¡ñ­ÙÖ&lª<û¶ŽÂ ™À}óþn †XÈa$Û¸ûÁ�äˆWø¨+ñ’ÝO²¨ß-¨°íØ9ÉðÂÜtzägWÓâ™% Ýjé‹Ò^&t2Á»Ý�LßtSݵ³ÒHŸ?¿>Üzbª] ¾IŽuÑ_žÛ/ì�G‚-qÀwH&p_ŠîÂñ7:ƒ‹Ü¼í½tÁ¼²„]ŽÆhDZu²hîâ9_ Û1«·ÿ@G”¶òˆí1UÂvÎéŽ.§‡ú>šUS`– è@À ½£ô‰ï/§îþ€°G.jçâö4Ÿ°2@À2ZŽK–#³Œ•5Ä…ÀÝ¡C ·@ÀŠð¨ÙŠ£›@À¡¶m»—¿.ÙâP÷,íV ¡£­}–¶ÆCÂ}9'SÔ¢¯¥h @@ÀJp>Ö61;¾iÖæ*j�€á|˜«šy²ïêªÔ‹JùaR ËTåŸLìŠîªP:ºp@êß‹·¶{Ùq£º,ÇV¾LÕØõ;Û…Mf{ÅRHG]F:‹ÒÁ¦~Q¶[œÀíÝJá°8dt]‰xÜ-îÚëæBD"s³ÓhNmáëeñÁ|ylLþqË{è-‹+Ãǵ±'JÛ˜Ðýø°õUî<:{÷æ·Di‹@ß7¢Îf¾ZÔ¾­ùýGé£ï˜mû•0 €ÐðHˆ>}ÓóÔÔ1(¥1§ÂK9éö?gK�D¦#¤¦¦PK·x²†#œ´®mík–‰—>³®Ý° @À¦ð¨Ù¦³AÀÆ6ÚØv[›~  w[ NÆ{!\щäÉfIVWœh @\CwmC�ó®6n¨Jฤ„Ò™eÂQu"’3k'þ¯^ƒÀ�·::>u»ÆÅÚ4ª(ÎNlrSO0¡}¯?6ñw*slßyÑtúö¿_HóêŠ ²Ý€X�_]åK?[M›÷uIÍ)ÎñPm±3Î×RG‘é#¡d=‘s ¢¤9%îI£‹†AâpÏÓÉxÞc€€á|Ú&z Ï:|vC+Ýö•¥¦øÌè}Z„îúD8*x ¬o7h @@Àa $Õ6 ˜X¦�j�€>^ )átv™Sty’©sjܧ6žáˆ8d!îgï®ý?ÀCœ )0Ü”¬úPSî®èí\Ü.šP™ÉD�éx¤­Ûœ•&>O€À]7ÎF5´jK mÜÛ)ì®<ßCü;ä„44&¾F‚ÀÝÚ#Ì/Ùÿóý‹èM +éË?_MGÛÌ‚SÛ‰û‰PNÆÉÈÆù™D|%ŠdÄ.²þøD ¾¯ �’êíñœZº ‚¾ûK ûh<:ØÎ&À¯m¿q×:zqs‹ÔÑ<¶ÊÊÜ ˆÛ¥��i9­½c–³É5y¢¸»f°á(XƒÉYc`¸†@óšßtÕ\þµÃÌá9®qÚ"ŽÆ©©­ŸæÔ•ZÄ"˜a,“ª/uíôå‰Ö@@À-0áLÛH㼫�j�€¸OPBir~\ò&IÉ«5‚»$¨öd[Æ%óxós$awía³3 ø%;›ÚÛ :Ò‰RMY®(Ë‘ÛebÇ|&úAÒ�@F*?NÄ[= w`”†ƒ„Côã�Ì–Âloû³8z;çé‰Ë#i‹æv¥¤xéœÙxï’Ì}M¯¶Í,¦ç~õAºé÷¯ÒC+ù«JåÉÏDçü‡'.nç‚w¶ØÉÄ_> *•Ýðˆï‰„ï|Õ~þc“Ìø>uêï0k[v^Vn)[eŠÙwåEµLÔ¿�.^R5ñ¿šú(  `üXsó½é‰5 Rgø„�UÞ„Ç.i#ȃ ¤¦¤Ps› †d�Pf&í0£cô  à^¸»wìá9˜H ¶–=^�ÀÝ„8ÐÔ�» Ü­Ô¥'ÑÓU+k["SYÔþÁD�ä€�TWQDMm­¡€Àé0ñætÊ?OL¼IÒ"iûˆH¬É=¨.uW÷£âh¾²ˆãömkYš™ê!0þ9«wpwk —К‡_våÊÉÂIë,<ø\Gàþ§öÑ�l—úÍWœXTísÌD4©³Èt�À¸s®1í681ò¼j7›a/€€ý @ànÿ1„ `;1/­õûlÇvŒ’eð³Zé–ë£äÛÆd!¶E»)^0ÞÀ¶°ÞZFBhg­ñ€5  `¸k©fèi‡Z  €ŽK Å)KòŠNõUyªîüPd"w‰MKEoçmåç¤iiuJÀ?:.ô ��„h,—#¹MàÞÔ1$ŸÌ4�³†„-"ƒ‹ŸE©�EpG²>�ûžÜCÇOˆÇª¶ÈŽ@IDATØKN:È"¸ÏeÜ‘ìI€Oôýè;fÓû/�A}î-{h�–Ìf°�›|òé{.®£k.™Ao=·ŠEŒÇ¹ÊBÃS@À4�­n ›î•ëOùJ‹Xäv­Ï LsƒÀkÚzC`aOL~€1Ë.ô  àh¸;zxáX“@ûšem5—­‘Y7Óš:×*þ`®©­ŸfÕ–8×Ix–�h;žÄe0à ‘$ Z„ ®€€œF‘’Oƒ¡â#&–©€…¢  ’î*�½V<™ÜyõUùìwëk½)ÿ3бÕÚ.aÉ="¸+7” Hîì±’MðUD©ÚeÜ;{Gâ¢àzÁt¼I‹Ëf*Ó¤÷±©4�ºè¥ß>º[ØS&›Wžç¬“ÁˆDó<·Ü…;ƒM2ÒÙAéó\DŸ|÷rÅ쉟öã~zœEB~øÅÃÔÜ)^åCu'*+Ì™^H-,§w½¹ŽÞzN¥BÔ®’ Šƒ€;lÜÛI_üé*’½·äçæù•^ÊÍà×aH `O™Y™l?—Ì<´§[v±z÷†ßõØÅXØ  à¸;g,á ØŠ@,æYëñÄ>g+£bì«{ºèêËç:ĸ¡…¢Æj¡¿"ÉÆç‚­  r’Êùˆr“-$õ‹í à>§)� ´dO¼9Á]½3£‚Um/¬ÃÑ~‹‰œÀh0,Œh �»}ö¾`ƒ@ÓM9™©”—ížïüø¸øà‡ ’³OËŽ!Ùl«ä˜ƒVUhl¤,? ¬‘—é¡âm×!ÂFMÎàÇJÑñ27;�*гM¶Ý'ƒ@ui}õßÎ¥¯|ì\ÚßÔG›÷uÑÖ=´í@7qñ{2¯Ÿ;§”–.¨`?åtáürÂ*JÉ �6AÀYö4öÒg´B8aó”·ó*¼T�å¬sô)ßð×=ãl2’)Ø#„5¦tŒNA\Ow×ïæˆ¦„×ú"’uHÍ1˽>±®™nþâ%,Êø»bÀã8 �{(7É"!hlÕ@@\@wmƒœl!©6«P œAÇ%mããêÐ$&­ÜÇBÚ�’i !®ÑÎÕi5‚èíÜO™hÕiìîO0~þ ·ªËr}Y6^¢èí¼î2rÚóøJ¢”žŠçÖ"6VØ~û_·H£ÃÖ—8O87ï°ój ]u¼´Â>h´ |.ðÂÅ?Ÿ½fáD÷�½#LìÞM{û¨«o„ºû?=ìïЈüb<�㦕簟܉ŸéüoE.ñ¿õƒçÉÏ—r“¤Ùå^ÇM@“¸‹,hëCôvÓ†7FkM냸šî®~8æè\}ϱêË¿ÖÌž Õ™g…;{ŒÓáæ^Z8«Ü�à5¥àm³n{"¸ë† �€€«`²™¶áN¶�T›U¨Î àó"ú‘–‘LöÄ›*&0å™ð2žÝ'#¸ÇËI¼M�”×ÌÏIKÜJ¸‚ÀˆD<�!ì³ ÃbÁf ;þ¸)…$ËW`‘“äì ²9bxv™æz´Ê½Ë74 ›*a‘Ûs3Ø[‡¥€D¯<— Ü‘ÜG ²$›®¹tÆÄÏÙÞ�…ÂÔ{b”øY–ÏxTvþ7…ýMeùõ=Î-gSÃÿ Zt°É6ŸøþsÔ?4&­^Wâ¥ò<ç�Ÿ¥N#Ó‘RRR¨¹+àHßìàTª7¼ÎvÂFç€ÀÝyc �@À6Xô›µ,RK�m v�¡»÷@àî ñTë Duj‰‰Ë‡#â—ÁâZÈp;DJÖ¶D¢QmQ @ !—"Š[ Ù+:y™òe:‹æØÐ:·ÑF\›GÆÕ"œ K‡ˆà."î¾í²è€˜SoŸý!ÛZ]–+Ît`Žl"?#éO@Á=-ïô'>õù˜ÝòÇM†øW¥– 蜘!ñ3๵ENt>M�@FZ Õ°hìH  �L}ƒcôÉï/'.r—¥šBñ$p�̬L GÁݤ±<ؼæ7]&õ�nA\NÀ™O\>¨plCKؘ6T/ll5­otl>Üõíôc‰–@@ÀM $Õ6ÚÍ¥¶Q @àu8.½ŽBÕ#V–¨¯ÊWeÓ©Â\ä®%…#âZ9éâL上@@²ƒAànŸ]A6wÐmZ‚’å+ oOÎ>-[%5Å—œNÑê”<ÿj3m;Ø#l£"ßC™©Âl[gŒHtTˆànë¡…ñ  `K~¶Zû§ozžÚä“áù¹™GoG§ a6k,=ÏZ³úF¿  €£?öÓx">\™DÍÎ5©wtk6Üõ�(”vúÁDK  à"ˆ©m°qÞÕÆ µ@@ Ü•Pš\F&Λ\ZÛ–úª¹iz‘s_9�I®«æL/rA€€èM ŠÐÞ²‚ö4ôJ›.ÉñÐÌ2çž›¥Î#Ó±šº¡o1opckÌë=ƒ¸�®hܾÀ0‘@ËËw6±îÛL4Áµ]óMûÅÑV\ Æ%Žû|xÛ¬×PGdê½:A;  Ž#!©¶!�Å´‰5µõ†Z à.˜x£m¼�˜xctw †et�wŠ¢]Ÿ"aý¿²cX–Ëî²‘œ}y4$n·®RÛä.q‹È™*�^8HMƒÂfj ½”êÐÀûüñ¯h‘‡6ù¯(/CÈ    '�p$J×ÿ|5mØÝ)m¶ ËCs+¼„·ÁRLÈ´�ŒŒtj;�»YÃæ�x¼Ô,øè@€ pÇN `&�»³Â…�I#°e·I=£[³ ‚»~#�»~,Ñ€¸‰îÚF[&ÂÒÖ"j�œ"€ãÒ)êþÁ}ö´uF½V:Ò6)Hö÷?š†Âu•´íy®Ãd ‡Áý�a�³h ‚„I0SÜ<*9Oͬɟb먮'ÿè8ÝñÀva“ilÁ‡êBÙ„°ª-2‚ãb3kÊs Ç1䀀èG€?øöÝëiÅÆcÒFs3<4¿’‰Û�{j–ú�LçHMË ^0m|[—|f�i¦¡c7€ÀÝ £ AÀÊbžµV6Ïɶ=±¶ÙÉîÁ7 Ü%pTfAࡊƒ€L@¤dm;‚BRm–¡ØŸî´�¡oæÔjz1�DÆ•y+{ åËÁ!�'±„#öÙW:+ƒ)V]”Âaññ »»þ;�†-B^�›ŽˆØú#ŸR‹¿{l7õ Ž Û¨-ö’“W: ‹§nÕ”å¹ @@ô"ÀE½·üq=²êˆ´Éìt-¬ö’*0)'dÚ“@߈øžÍžÙÉê4]v.Ø $€K*\[ˆÅÖØÊ^ÛØ>D-�'ä\QJÑ•’J\÷ÄŒP@@`2œ‹'3Q²Å!©;PœHo´�jÌ€ÐQ…LèWœŸ©ÚÀ@P,ÆRÝØkpÿ£•œËêé¿ë¹  qî"‚û¬órÒÞøç¬Oa&ÆFÒ—Àð˜ø@1³ÑÛõ¥=µÖºûtï{„�d¥y¨,×ÙÓ@¤Ü!pîÈÐ�ÀÝí ûžÜ+m0#•ha•—R “rB¦] xèP«ß®ÆÛßîAànÿQ„ `k¸¼±õðÁx°?�¶uw70/°œ�IC¹·á¸I=£[3 :£~ô!ðÐ�%Z7€�TÛh#‚»6n¨J`â�J“Ë5ñf‹â®6ñȸ¡°ÚZ,0·D£†ûõ<�ZÃ#ÛQœê´ý’EpÏtY÷ÉD¢�l&€÷ #\ˆîó닌0}($ðË¿o£Ñ ø‚¢®Ä#½vPØ�¥‹��‹÷×iå¹–¶Æ�€Ø›ŸSÿ v.æçcYJc‹/-ªöÿ‹N$�““Iƒ#âkR'úl%Ÿb^Ü­4°ÜHw7Ž:|kà÷f˜ñgÒ˜¬ßÙaRÏèÖL¸ëGýX¢%pIµ�¶QBRmÖ¡Ø›€O5  Qoæh¸s‡!± Kä°DßN8‹¨a;Ø“€L·�™î.uLa^ºpÇÁ]ÈFkÆ@@\óâ%UâLäJ`OC/=´ò�°ÏüLeË®„Um•!Ñ÷S5"¸Ûj,a,€؉Püä�éîwHÍæÛyävÁ œJ Bⷜ곅üjl_³¬ÍBöÀÀë+:\Ëð@ànÖ˜<±î…ð–Æ,ü¦õëƒzE7öÙÛ`ÝzAC  N#€ÉfÚFÂJmÜP ”ÀÊJ(M.cÔqiÎtõܹµ#¡É6'Ü"Ñ©áþ'!=×�ì&®aàGeܳ\¦�Iñy©07¾È=ÂVĈªŸ/ä„]$)>„Ø„Ù,Ü“‚]u£\T÷Ãß¿Jü¯(Õ³èínHcãb/§•!‚»˜r@@´à“é¿÷›Wè¾'÷J›ð²SñÂj/e§»ãœ,…�LGhï×ò€ËÑHŒsÎCkŒë =�€@|¸Çç‚­ H‰zרº:�ÀÈè8n>~Ú|tˆêôå0ˉ  * ‚»J`¯7JHªÍ:Ô{ð1a’zFEpŸ«5‚{P¢J¸+{-ެаlJ@6g?3ÝgS¯´›]\�)¬Œø B4ª3FÄ禅3Š©8?Cu›¨ ?�­m¤­º… —æz('CvÕ ¬j»Œ`X¼Ï"‚»í†ƒ€€å ð÷Žß¼sýmù©­v^À"·çºä|,…�LGHñùèH›ßÑ>ZÙ96ßZ.+l—ÀÛ+— 4Ü+8¶î®ƒDž+ÛèdÛvz'�o<ß ª‹GEÛ6<´qC-p;œ‹µíF IµY‡Z `oˆà®müŒšx3—Epç/¯Õ¦€†W²~¢²pÏj�Cy[ðÈv[{æ.ãe_i·Epç#_’/¸‹®îÚk¦îmϰ˜å%çVM½´0e�±0Ýú§ÍÂvx´Øºw¼^æ«7„ÂñQd¦§PQ&dħƒ­  ZŒ‡£ôÕ_¼D�®>"­ÎoÇæVx© KÃiËÈëÈÌ΢qÙìlë™ì(‹bÏZG9g@lIÀO l940\E€=&Œ­s•Çrö¹M-²¦AÜõ£ �»~,Ñ€¸‰„¤ÚFÛ(!©6ëP ìMo´�ŸQÇ¥Üì4*/ÊVmd $Š“½Çý�ˆ¶ƒ€= È&rá¦ÛRI�X¨:.¸º�ÑTý'ˆÏM—�W3Õ.P_÷<º‹ºúF„-ÕyÉ-‡Ùê Õ¥9š& Á"@@ÀÕ‚¡}þÖ•ôÌËMR\Ü>¿ÒK%9²»wiÈ[ a_7qÀš:^þÄD&º8Iwì – à‰ÑKâB#^ÞÕE'†.ôܽ.C¼¢ß؇y$PIçb•À^+.aikµ@NÀqé u�<.Í­-Tg+ÍV6§ Ž¢LÜU�c+ȸã.Ù>ÃÎ�¢”åõêiŠ dÜO+ˆ�š t ‰wº²¢,ºxI¥æ¶QQ­ÝÃô»Çv ㇆šB÷ˆŒÂ’h¡Å’I1B€È�8øê)Ÿýñ Zµ¥5Nî›ø** «¼T”ížsñÞã“[ ís«ë¦û#Do7}`€Àܱ#€Xƒ€—ÖZÃ÷YÁ—#ÞßxÜ}Ž»ØcDp×oðyÄF¼¼×�'Z·@wm#mT¤dmÖ¡Ø›ŽKÚÆÏÈãÒœéêîÜ«@PÝ‹L¸l¤¿ÚFµ@ÔÍÙOñy)%Å}¯ŽJ%w=' ©#'•�±ÓQÏ øœô±wÌ&¾ï!™Kà'ÜD!IØòúR/qq�[RX<'ƒòsÒÝ‚~‚€$‘€?0NŸúáó´~g»´~™´°ÚKY.:K‰ Ó 23Ò©½wÔ ®ZÓÇXl�5 ƒU n#€§Enqø %к¦h?3­Ï¢æ9Þ¬Íûºï#|ƒ¢3¾ÁB�O1þ† @@TÀ¹X¬ÓŠBXy |� ฤ (Ÿ0nTÒÁ�Û6ÒÏBDp×�¥Ý[Jñ‰E¸E¶ÏèŠ"¸gf°Í.LÅÙB¯ý*' rqF F¡ˆÀǯš+ÎDŽ!^ÙÕAË74 ûÊÏôPIŽøø/¬hã ‰ÖŸ p·ñÈÂt°��á ýÛ÷ž¥-ûåïéùÜÓELÜÎÏÅH à&)i„g æ�xª×»Ö¼ÞÑ3€¼A÷7Xà€€©n毅יj‚‹;bmn\4þˆà®ï`ÇD!Ïôí­�€8ˆ"%kÌ(žfk‡Z  €€›"q*À¡¸ˆ‘Ç%­÷@HÝ„\�$„{ÄHE¿âQ@A3d¦§ »‰¦…�a ÙeUªK£h/šY, ÿ˜ºc©°!gtK¢·¿õœ*ª­Ìs1ó]³ƒ÷M÷¾*5dF©ûDuaɤ Dp—î.ÈH@ w`”>úÝgi÷‘^iÉTÑâ/åf¸ï<,ƒLWèóYÂDU9y¬yÍ]ͪj 0€$‰îI‹fA4ˆfjÀ¦G•¦N?µtžÐ£)´aˆÎ¨ï )jÑ×r´  `”¤šÐ#‚»&l¨ŠฤÓ¤BF—fO/ ‰ö|’m§6‚§>)û+{e>>Ž‹Ê(:¿Tfº8Â7æ€ÛcüùñDtL …íá„ÎVÎ�^HéiLA'Yôñ8U°é4|—êO¸ÑÛO£eÎÇ,?H‡Ž‰ßTä{(;]v•`ŽÝÉî5,¹ô)ÌMOv÷h@@À¡:{Gè#7>C›û¥¦±Û®Å5>Wžƒ¥`�é:Ø6â_­ç¦‡bÐnYoX`¸–î®z8Ö#Ã7¦ÊÞ†ã¦ö�Î�#àóâô¯'m#E-zÚ�¶@@Ì#€ÉfÚØG ˜Óµ@@—@ŠSÄÈɮ٩T]šÇ ù&µÜùÒç¢t‚-ŸŽœ@VîNØ|­ê(SsË"¼;Á÷x>¤°àâ™%ñ²&¶!Š»MÂŒî!±¸½€‰„ßý–º„m @òðóû/þ¾MØ¿6¨-–\ kÚ?#ï»ù9iöw€€N µ{˜>ü�g¨±mPÚ7ŸS¼„‰Û³pº‘rB¦s äädÑÐȸs´¼gž5–7‚¸†€;ŸH¸fxá(Ø‹@{iûfñ€½¬v޵kw´;Çx"%ñŠ�êLhíT#Cp="¸kÚ0©L6TE<$P9*ªíÞBF—æÖª†ÍïWÆT¼äËŸ‹Rßà¨( Û]F@ÁÒì³3ˆâpq{pÜ�QÜÏ™]*Àá1±ÐUX º‡Äa°?üöÙÂÈùÀg �ÿûÇ6ô‹'±MgâvÙõ�1VšÓ‹,‚;Ÿœ�  jmœ·s‘»,±ùí´dš�ø_$p+�‰'Ö»•‰‘~{">Dp78ú�€À]Š™ †xä#¶ÎÐ>ÑÙëžz¹…‚.]‚øu.ùQ�¾�Š_ÒéÛZp ¯BR-cid¤d-ö¡Ø™@×´š†Ïh�ûœéêîÜ15QÜS$÷þ!±øM@T²-iwÜ"Ûf\es.GƒÛø¡§¡çÌ‘Ep׳'÷´5ˆI'Z]÷®¹î�aAO6÷Óßž= ´ŒG�­ÌwïýkXr(ÌÏ�À]¸ã @@`~Îå‘Û;{G&å�¾�Ÿ{yävÁ ÜL ­OE´7ƒJŽïm-/ßÙ”œ¦Ñ*€¨'�»zf¨ �DÞ˜gE›GÓ#£ãt¸ù¸¤²œBÜõIh�ôå‰Ö@@À p.Ö6ÊF IµY‰Z `O1,K¤iàŒ>.ÍÑÁ�;P¡K—EhíGwMû‰+¥²™¢ {,z’MÈ Ô,ý`•˜yîI÷ vn% Ï.ÓÚ/ævþ¼2Ò²:ÉÙ}àmøj 7Ýû*É&Ï(õ’›çg#‚»¶} µ@@Î$°ûH/}ô»ÏRï€|U´œt-fâö4ˆÛψÿ\G Åç£#~×ùm!‡×0[Ä7r2¦€¸ƒîîgx ¶!À®’ p7q´vî1±wtmˆêô%-{ ¤oOh @@À)Žèhi]e>åe³°™q�äÌ⃠© Ð?£ÁQñ9身½]NÝ‹>ÿj3mØÝ)l·8ÛCYâëaEeÈ.‘3 >tÐHÃH�-û»éß¾÷, ËgžçfxhQ�—d“Γg%ZkÈÊ΢pX|a-kh�‡Ö:Ð+¸ `c¸Ûxð`:8‘@Ûº»Ø¥j³}³ƒOË7´ÚÁLØ8E²]SlÚ•ÕíҕçA@`J0ÙL>£…¤Ú¬D-°'ܵ�›ÑofO+FÍ–yÉrÏÌK•<-î‚ÀýLZîþ/3#~XAþ šGF²>Ÿäû>t§À�OÞ8GŽÏ��[éžÍ�ͽQañœÌTºæ²Â|d$—ÀX(L?þã&a'ü»PÏ¢·#‰ à¾^Ì9  ' ¼²«ƒ>ùƒåäÈgIæg2q{µ—RpêÅ®ü!|ÌÝ|kÌí½ƒ€À™pV8“þ0Ÿ@Œ=;Ew“Æá•½]Ô?0©wtkÑ2âFõï´~ ¶sÚˆÂH>Y´Ìä÷nߌ’Ú—,õðýRÏŒ×0š�:­"Wµ±£,‚»RÁ1´‰^ª�„h<,+ª6 lM@Á�;�Øc+»&s§À�Ü…óË…ã×;Œ�[笌ÆJ6Áê ×.¦ìŒÔ³já_£Ü÷Ä^jëvW]à! �|ž± wd€€0«·¶Ò¿ßü%š8ZÈVKYÈÄí²É§ n#ÐØ9ê6—-ã/Ÿ§Ü¶æÎFËC@@€€À»€€õx=¸›4*|é=GºMêÝEÑeô%m´¨E_ëÑ€€€p.ÖFç\mÜP ”À÷K ¥Ée̘ì:·¶p²! ¶DÙÛ©1yÀ¸3Z�-‰~QÜÏ`åæ²Ü9þ| Éúd"šDBë{§ÝÂ÷^\'¬ìÆhTŪ†žÁÏ;ÇúÄ‚’‚Lú‡;œ‚uÝëì¡eïÈæÓÑ´"¼>z-à D‰!@\Kà¹Wšè?oYI¡ñˆ”AqއæWyÙJmÒbÈWÈÌH§Ž>ÜÍôׂ‘bf·Y€~AâÀíw\,Ø `&ïxh5ë_üÜLã\Ð÷Úím.ðÒÝ.BT§ïø›!jÑ×´  `4DzÓF\mÜP ”À5­J“˘q\š;]½À�[`QÜ•¦TŸøízîJ1:¾œ4‚;žêÙbüeB7 ÜçÕÑɱö¸_ùñÔ;BŒl?£�d€o|ò|DoOw¥MÞöçÍÒh²u%ˆ"{Š¥ìÛŽûúS”ð@@àt{î]ûj 'Xý¬4×Có* n?�>ƒ'àKËP¼ !ˆ%�‚‘&*š˜*ܧJõAt'ÐòòoO°F7ëÞ0TDàáUM g”+j…,KÀ'{ƒiY«­k˜¢ëÒ€e  J`²™J“ËDx(H$�¤ˆD FÕÖŒã’Lt)ó! "â°,‚{ßà˜¬么@nVšÐÛ0ÎÙB6VÊ�EŒIÔÉVr"I¶|ಖ�ãœ)„Ã2x Ò¶bF3ªóéºwΕ5�¼$ز¿›ž\Ó(ì!7ÃCeLp‡ôÉ-(îë±—€€œN Ìž«üàwèó %zVPžç¡9LÜîÁ)÷t„ø ŽÉW>¦¤ˆ¾Œ4©� qPKwµÄP@À žu„nÎ"08¢G{ÎÚŠ�DßõÍXLò¦C߮Ѐ€€CxðöBÓHbR™&l¨Š ‚»"L“ ™Ámn�¶î#Aå÷-©)“\}}Cÿ –‰~†Ë?d p�+’õ Hk�Fw¶¾gS·ð‰À}”MRsL�º5öj¡µ?ÊD]b›oüÌRJIÁ«I1¡äåðë–›î}UÚÁŒR(í¤€NËÄ}ýi0ð@\N`ˆ½[ÿÌÍ/ПŸÙŸ�DU�‡f—3q{Â’(î#àe³°´øÝç¸u<ÞüZ0RëXK@@€ÀS$ì –$õF p7qd6ïí4±wt�lˆà®/aˆíôå‰Ö@@À p.Ö6Êá¨D)£­IÔx�@¢èbŸ€÷³j (ŧþ‘®šî2Ý!"¸Çßܸµ$?SèvÈÝÁ¿…\¬–! €0t÷ ÖWåÓâY%Â!;îW>iH؈3ÆÆ‰:Ål.˜WFï~K�=·‡K¯‚¸l¦p »™ˆ;ŠKÓI|ŽõE¥çšï}î"ÂcÉIØ Ù0Ì"ËÞþ׭¾øÜ¹Úb¼2Š“�©q `€¸ŒÀF0îêoü‹ÚzÎϳu%8×&…®&0ÄwÄÌAHͤ�¾Adpv�ÑA€€i¶m»—Å{‰­6Í—w|¨e�šÛû]NÁ¹îCT§ïØÆ”ªDôí­�€ؘ–2×6xãaDp×Fµ@ 1�(®iCŠS¬ɮsk‹âX#ßć˜‹Ü•¤Ôq)Dp³q[NI~†ÐåqLJ²±R[ý]˜<·ËÓÕ—Ö ðI]’HåŠÎÄèø°øâ ?-êäÐkAH-jÌp3É#L7c�ï V ÀnóVXÁ·Ú°ã`·[]w¼ß¸ë;ÄfDmÔ×´  `4œ‹µG p×Fµ@ 1DpOÌ(^ ³îÖ«¸sûG¿wŸp3ÕÏÛ“ÛúÁ]LÇ]9ˆànÿñf BS÷ ±VXÉaÕ¥9tÑB± »­?Š(î¯�9×ùê_«óÕ$oüÌR‡í!öq§±m�îjŸÐàŒT¢ªˆîâJ‘\ ùCñª`€€€Ã ð‰î·Ü¿‰¾õ«uNŒƒ¯�²°Ê‹ó¬Ã÷ ¸§�œì,ê:¡ðÁ•>]¢•3ÄVŸ BzÆFü – €ùø– —€� ÜÙÃq$s<÷ê1ºöóÍé½&•DuúâE´K}y¢5p.ð@ROwõÌP”À5­RRg–3‹Û¢Y%g¢ð?0F¥¹‰ÏA2�{ω€ÂÞPÌéäÜ�î½3üK—¼jëv†“Sôâ‹ZL›÷uÅm%Äž[w²(îÕÓa&n—³þøUsiö´‚¸±1ù~ü‡�$»—âQe½‰/’o¨{àÂDQ @à.bƒí  �,2öÁæþ‰(øJR|%оÁQöwlâ/_!qVM½õœJºxI•dêÕ5Ú�¸ü£ãôÕ_¼D/nn‰›úF>�l·g¥á${:|�°‡}i�L#à!ïJÓ:GÇ  �€€äf‚šÈ�$h]½¬±æò¯eÝÌHrWh>�›ÛèÄ`€ ó³âäb“� @T§ï虵Q_/Ѐ€€‘0ÙLíñQ‘´µŠZ œ@+$hÚ̺X4£X“½~…Á×ÓSÄ/à›:†4õ�JÎ# É„®Î#a_�ÒSÅßõÖ¿}ÓÑò+/ª¥Å3KhOcoÜVy÷Ê|Ÿ«ÅÁí'bt"‹Ë‡oÌÊH¡o|ò|a>2’K`õÖVâ?¢T˜å¡¢lñ±@TÏ-Ûe+] �@àî–ý~K`4¦X®‡W¦—w¶SL|Š™0ŒOD{à…ƒŸçÖ2±{]Â~Þ¼¨’r³ÓŒ5½9š@»>þì�WLLºHäh^¦‡æWzI6yvð-�½â ÅŽu÷OD|N‘…/¶ƒ“S´‘ó¹�‰³?ÇÄLñŸÌáæ(îþ±5÷±‡È’tÓçßLå윅d<>AøG÷mvÌ÷ïz½IL@vFw18䀀JüZdÛÁnzäÅ#ôÔúƉû •ML?tìñŸûŸÚGiì¦æcWΦ®;âÞIK{¨§l=ÐMŸ¿õʼnUNmý-ÏóÐÌ2¬Ž"âƒí �@ZZ*54ŽÄËÂ6c4µ­¹³Ñ˜®Ð €¨'€'ꙡ€€�˜¸=þÛmpsWë¶·»Ù}Çú�»¾CË'ƒ �€€€¬ÿ®×ëeÈàþ: |½ D"£jaj–À�Ûª%Š;?ŒŽ�+ó4SÙ¹©sPY#(åh<*3ÿ‰—Á=ëmcÚVJ�?„l‚KŒºúÔM¢±ž‡úXtåÒéQÜE­ñ(îñ&‰Ê;e;÷ù`W4î‰S>^}I=]wÕ¼Sÿâ¯Áþôô>:Ú.>gWæ{( Á�¥£"‹à>„îRvÈ%:zGhÙÃ;éòÿ÷]û?OODbç“iõH!vAú÷åé’Ï?L¿üû6ò�êÓ®¶¡ {xü¥úØwŸU$n¯+ñÒìrˆÛí5塅 Ò3²&îA­`‹mðx<\“…‡Ãn|ø 6!�»M f‚€[ ¤x¼/1ßY,$3<¸ª‘Bãa3ºFŸI$àƒ¨NWºˆv©+N4 ® €S±¶aw£rH*ÔÕ¸�I=3ïÍ*Qo0«áWÅ=C ½¹cHSߨä<²(î¹Ûc¼3$“YÚ{üöp"ÉVžŠâ.ê†ïëG�»/úACOT:iª¦,‡nÿꥫˆØa{òðWîüçva|µ–éÅxE,ôZFŠ�OŠŸ p�Ï[A@ �v¶RÌ×ÿo ½å³ÒÏÿº•š:Ä“q”´'+3 Ó¯ÜA—ü×Côçgö_Ý ”à÷û|ÿäûj¢ý†¯ø1¿ÊK5…âó†’>QÜJ ×�c³™c‹FtÔÌ@ß  àéEBD( `&�æ5w °þ7™iƒ›ûf‘íq3GúŽîú«™Qõõ­�€Eçbm¤Á]7Ô%pM«„Òä2fN X<³x²A ¶(¸gJ"º6I¢Á*0ED ´0SèMpg„p,”!ŠàÎMlí¶�¥æš2Å]2±¨{(F}#îÙ繿LJÅþòà¿þö”—-9™˜;¤ŽïýgÙB²(ȵLÜ.‹Nîx@ ä‚EQFwl!~\º�ŸxÄvÛÈ Ã}ƒcôƒßm ·éQzzýQé $B�á�±0}ñ§«&VHä4¿ž^Rã¥âlˆÛ±B>Ä#àõzi3î=ã±1h[4Åë[mP_è@4�Üškj•@@@1ÂŒAý©*nqÓÞ.ÅeQм<ô’nbˆv©K4 n!ÀÚ"©'0‹hÔ·† §ˆD)étJ?›91`ÑLmÜGÆ”y—)‰êÜ܉îÊ(:¿Ô´ò\¡“£ãÂ,dXˆ€,‚{[7"¸Ÿ*þ(íŸ8ÿÔ¿qÿ6tGÉ +Œ†G¬ÿÖ§/¤ æ•Åå„�É'°ûH/=üâaaG9é*ÏÇóa! Ó2d“¸X @@�0[‘ïïËÒ¥_x˜~ýÈ. †Ì[¸û»—¹þöÕôÉ.§ÎÞe ”«tõ�ÐG¾ó -ßМÐïÜ �3ÝGÙìÜŠ  �@NN6�Í;/h³ÚIµb›^ :ê$§à €€Ãà­ºÃ Ä<^ÜM؇W5šØ;ºND�Õ—ª™Qõõ­�€E€4DÒ@`<ŒÝ°¡ ("`¦P[‘�-d&·š²*ÈMWMFi÷ IÐݦÜUƒwh…úª<¡g¸ ÑX*#=UlNk7¢è�NçK§ÓeçUŸ¾éŒÏ\Ü~„‰Ü�œ‚a¢}b:Eaºäœ*ºþ#K„ùÈH.�›|Ó½¯J#Ï(õnI•�C‹Ê+J8FŠÈ`;¼A€“^ÚÚJW}õqúî=/SïÀè™ ?¥úˆÊò‘ @@QOš> ¡�b«éd°Q�õQ @Œ!�»1œÑ €À ¤P ÷)2œJõ•[Û¨Püp|*m£®ñ°L°¾ÌÍŽÚ¨¯7h @@À(ˆà®žô8Vê¡¡($aëÑ"©'`ö½À¢™Ú"¸ûÇ” �3%ï›;ÕC Ç(ÌM§üœô¸~ñ…W07-.Kmäòœt&Ö‰—¸¸]&–�WÇ-ÛnýÒÅÄ£¹‹ßÿ÷¶GˆÔ¶uR*n_º œnüÌR[ûjwã�´Ðoß-tƒÏk !È’dd¤Š3�uaŸ˜rÜDàXç}ü{ÏÒ�¿~™üå'¿‚,�7ÝK³Ë½”•¦ÿ1ª�E€?—µ?‡µ/ºÞ9{œ]}„®üòc´v{ÛÙYøßAøŒß>¶›Þÿ­§èh{â{Û6QâÜi>â“'�@ô#ÐÖ§üœ¡_¯hévDƒë ü°4Ü-=<0@à�cë~ÝDk8õ?þK€kvî2¶Sô–4ˆà®/Z³E-úzƒÖ@@Œ"àóâv\-ëTrj‘¡<(&€kZŨÎ(¨&*áuúg‹ž�“%Q] ú *¸Ë]ˆà.€ëÂÍõUyB¯GCÊö5aÈ0„¢«Ç\À&wÜñß—I+rq8¹ó¿vLJÅíçÏ+£¿Üô.JK�b¸];B²ˆÍ¾×}ï9ºíO›¥çÎSÆòˆíKØê<‚;€€~ÒÒRép›_¿Ñ’z>ÜÕCC 3à�ºÔÑ'€€&1ò`¡&rúTZ³½]Ÿ†ÐŠé p×w̵èë Z0Š"¸«'=.l¨o 5@N'‰@„z:¥Ÿ¹ Ãì´ ¾Xµ A&¶gÑ…¥LIŦŽÄQîµ�|g¨“Üí½Ú#”Ø YDÓÖˆ7E/=¯š>ÿÁÅ¢ì‰íü;°‡‰Ü•s¥ œ9ˆÑŽ–Ä蹸ýï?z7åfK–ü0Øv7vÇ£ oÜ+–ægzˆ‹ó�´ÈH³ƒÀ]SÔr¾rć¾ý4ýøiLál.>jf™—Οî£"]ÝÈäcª)ž ëÓÎÉzäÅÃtÅõ�ÑÊMÇŒ4}%‘Àò Íôί(Ÿ�1­ÈCó*1I,‰C‚¦]L =#‹¬ð\ÍÅCp´uõ²Fû×AlDw L·`A.!p7q'xxÕQ *|He¢™èZê@RQÑ.UÀBQ�× ø|ƾÈ{½c�³e…�@’B ÂC"©&`…{�E3Õ Ü¹£~QÜ3%ÁáÁ]õîâØ õUùBßÁ]ˆÆR²î L¼†$&ð½Ï]D×\:C\€åŒ†ˆvµFw¥ �É/šû¢,ò|4¡(ÿ¼¹·0$ »81¤[þ¸IXÎÃn;g–áÞSHA†,‚ûáÖ Z@p¾ZIJ‡vÒ»¾ú8m?Ø£È9¾‚DM¡‡.¨óQe¾‡ø±É¬Ä…õç×úOüééÐç~²’¾ò‹—¨hÌ,³Ñï t³qüÚ/×Ðn{QQTþ¦¢âÂöÚbÈ©¦ˆÕA@H Ï�gýB8dxbÐ^€]€èD éèÍ€$Ÿ@z öÒX†‡ÇS8·>ù6¹©‡áÀ88ÚCçΫr“ÛŽôÕkæÓCµ‚¨Å�Xá€8ž@ îªÇx<‚‡Þª¡¡($Á÷K!©3‹Yá^`ÑÌ’3�RøßÓffÉ g¦Š•'Míˆà.§çžÜzIwÐ=ìì©l2ËŽCÊ„kvö*¶ó wóm4Ê–Æxqs‹°)É}wk”f”z©‚ û¬˜øê‡:£44–xÒ·ÿãLjÜn…qüéŸ7K—ÕÊ’¬Èb¬nƒlE›]‡�Ÿ‚ÇíVEا�½�}ô­_­£}Gû7Yšë™ Ë&‹(nL§‚)ì-3/ŽQcO””,ø¯µ�´~G;}ëÓÐuïœK)\�dy!¶ŒÎ}OÚA�1v±£ ñ•OæTxI¶Ê‘‚fP@@BÀÃ.žö·ø%%�•l1îÉfŒöAô#€+oýX¢%�$hØ´lˆ=+|5ÉÝ y �M{ÄK�Jª!Ëb¼<\’n¢ˆv©K4 n"€UÔ�v�EpO,·Qß.j€E"øviÙ¬°”òâ$Fpç‘nƒGŒ`?H 0¯®HaX�PVX†ÈÉ?'Ú}¤ËÆ' .pûí�WÐÅK*¥%£ìTÛÀDt‡º¢Œ©´¨á™}þí8�¸ÝpòSëpËþ.úç ‡„�paÞ´"¼R˜ÁE¹¢ë¡¡‘5wbÒŸB”(fcÁP„~þ×­tõ O*·óï΢j/ÍeBa+‰ÛO.¾çÑÜ YTw%‰Gpÿß{^¡+¿ò½°ñØÄ%õPÆxüµÝJ6ùðŠë£Ÿýe‹"q;Ÿ¬Ä#¶/ª�¸ÝøC�n#�“›CþQe“NÜÆÆ #)ïKõ…n@@`ÊðdcÊÑ€€‘¼1zÞÈþÐ×™~éè™ðŸ- ‚»¾Ãf…¨�úz„Ö@@Œ �»6Ê8ïjã†Z �ˆ€”…–ERMÀ ǤÙÓ )#Mý"�þ ²I ²¨¥j"7ª†‹ ¶!0‡íƒÙÕ ˜Hÿ~éŽÒ¹]IôZDnŸ m}ë†Ù€ÝøëW¤�Î,ó’o�¥Œ”fæJ&ídQÜ‘@Àɶì¡wí ZöðNœުØêçM÷QA–2ḙüø­ÔÂ*/Í.÷ '³œm_cÛ ý×-+éÃßyš8$k8Ò2@Ÿ¾éyúÜ�WбÎ!EÆñëá%LØ>­ÈCÖßk¹„B `i£!\¤š<@›š×Ü…}“݃('€³†rV(  `Q_ì ˜áZ· RS[¿kýwŠãDp×u(­ jÑÕ!4  `Ÿ·ãZ@G¬îR‹¨$0€U˰„y8^“Ÿ05¯®Pµ\Ô¨D̘�.nzwC¯89®!À÷Ásç– ýEw!KeÈÄ›;A¼©d°r2Séo?zÍ—¬jpª�@ˆhGËÉhî£ì³Ñ)È‚%òhòÛXÔön¾fª‚tÍ¥3è�[ÞC¹Ùi J£H² Ü÷¯½t¸å„°›â)ŒH,l¯ÈÉxý㤸OB‚ !0ÊN?ºo#]û?OQƒÂÉn™ìÁEÂ3Jí7Á¦<ïd4w5ÇÎ-û»éƒßzоpÛ‹´� ݱدy;ˆÍ¬}j]#ýÛÿ>Ë¢¶?Jk··)6†�=Ÿ�!»VÜ ‚("p¸sTQ9J�­HRËh@’BoÔ“‚�‚$‹@ûKËvÅZ“Õ>ÚML`ûÁ®Ä…PÂÒ¼¸ë:> ˆZtu��€Bܵa†À]7Ô�DGLP×%2ÊùV™ìºxf‰&ZJ¢礋ã×í�À]w'V:_µw{Œ¸Lгã"“*Åüœtzè§ï£KÏ«VT…Gsç"sE݈Õ¸°½‘ Û·6G¨k0¦Hˆ—žæ£Ÿ}åºçÛWñ#™O ­{˜îøÇv¡!À„îïùúô÷åiĈ“z~Õ\úÑÞ‚qOÊàü66Ó‹›[„½r¡iU¾øû,¬ˆ )þ䓸*g'.nßßÔGçÌ.=; ÿƒ€­ðHØ_ÿ¿5´ûH¯"»ù=Âô"/Õž¼_PTÉF…ø÷žG÷æçÓæÞ(T,zæ§¿=w`â‡_ |ê=óéêKê‰¯Š‚¤�À‘–zà…ƒôèê#40ÔÔ¿æ�Yê!ÙÄ%M £€€bÍÇUP·Š‚J °ó÷³ôÈ#¥åQ@¬@O$­0 °@@�Z¦¼V)[UEÖ�À–}¸ëFÓø†Á]_æ¸ëË­�€€[ ‚»¶‘ŽD”GÎÒÖj�€ûŒ™ I¥Q 55®¢Òüú"JaQCyÄE5‰ �%.JÎf"÷“bøÉ¥w7ôÒ¥çVOÎÀW(ÎÏ ÚÊ<:Ö94Éo.¬õ�Å(�E¤F².x8“Ò�£5à+×íaßõ7-ª°®µìÒóªéù»¯¥ëo_M[öw+¶’ÏéäcOE�ÍH%aÔ3e4�iãøçTöv�ϳbóÔXôèØÄ_Ô;Ä>Çá*í<›uvûW/¡\>Si”3ˆLþ�Eo—¥YeΚÊ|6*�‹!ƒ‚HÎëwv@ànÔ@ Ý ðóüŸžÞG?ýóⓟ•$þ}˜]î¥,á�˜lÆ¢¹ó h-ýQvžUBè�2[tÿ¹ù¾WécWÎab÷yT_…bo’â+–<ór=À¢µ«¹–:»U>a�Gl/ÏÃ=ÉÙlð?I ##�¸ÌÉ,QŠ=cVßè@´@ W­äP@À4ÍkþÌBÞÄVšf:¦Ç^: 6&àEw]G�?Fµ pWKìdù"¸k‡Z !À£ò"i#`•É®©L™:gZ�j'xB%‡Õœ qÓ\ôŠœ€,ŠûPâàÕ€h²H–;·€…ö4¡¢8›¾í}ôµ�ŸGijC±¿æ2�È>Ä"±÷Ǩ} FM,’ìá®(5ôD©¥/J�ƒ1êcÂÛa6™D«¸�ÄøÐÛgÑ‹÷|âv‹îjwüc;uöŠA•,r»ì{lQ·lcV®d¢Ö*IT}Û8C]I ƒS>ùýåtó½‰Ûùä×úR/-™æqû©�‚G«¯`ÇØ j}T[ì�XiåTžÒ¿<âø½Oì¡Ë¾ð}‚1î•&ââm¤ÉzFééõGé;Ë^¦ >ýÝpÇZÍâv>vÕl•� ê|·OF�- `8_j[á ïÕ ÿF‡ã™£´â�ñ @ìAÜí1N°@à,ž=óÐÏÚŒ "°nW'u¢ÊÒ<ƒzD7zðb]p=q²hY¸×(—ÀùXÛ@Gx˜J$] ŒrÕ’&V‰àÎ�_4³„ö7õ«öc$Ä"k³Œ²”“Îóãß÷ì>�»Œ�›ò.˜WFO¬iˆë2ÞÖ0a ’µ pal‹N/í8Ôo3¶)$ÀWÙøŸO]@Ÿz÷<ºû¡ôàŠÃV2ÃHaûS)Æ…_Ÿ]C_¼¤ŠÞ²¸rbÂhz; », úƒ´qomØÝA¯ìê CÇNL™@SAñhíù^J‡"jÊ<ÑèE ¥Ï õb©¥vë·¶aÓ²ÉKïii u@@À@¸œ36ºÐ�@Jª÷Y¶ô*ã‚·cúaUÜ×mÛßIW_�»bh*}»¾ƒ�»¾<Ñ€¸…@Š—±ZÆÚ*B -¶£X•Àh/—´Ž�•î‹g•ÐÃ/VíÊ‹¬�'‰ÐΔEpß�;µÂ›U];Uâ!"KdäJޏë3D•%ÙôÓ/_B_úð9t×?·Óc«L‹`È…íW_2ƒn¸î|š=Âv}F89­ðë�ý2[u%þÞë Q™é$‘’H 3�&„½ñæ†òH¤k¶µÒµo›•D Ð4èC Ÿ-­óÝ{^™ˆ ®¤E~¾àQËyl<É:IŒO*šÉ޻Ӌhbr`ç`”âñGivóŸ;Ya.nç“FO ÞÏ›[6!‚OÔŽÝòý£ã´e_½ÂíX@µ½G{I¯€Î…Ù\Ôî!>)‰ï»H Ö!�ž–J‡ýÖ1È…–Ä(ö´ Ý†Ë  �».€€ 4­úUwÍe_ÛÌž¦¼É�þ[Áç'×61�û\+˜T@ÄX•À‡À= dƒ€Ä%àõB}L‚�aöò @@_�1,‹®•¨•î¸À]KòÇÈN;)ˆ':híFÄR-àXgnmÕUæQsgü``<Š{UT&Vzþ]çAâih;zG¨§?@eEYVvÁ6¶M¯È¥;n¸œ®ÿè9tç;èÙ—�JÅËz:ƣɿç-uÛçÖêÙ4ÚJ�^8H;¶^ÀD|¥¹8¾ é˜QÄ„“ñ'¬Ú�»Ž¨ÑT’ðýô[¿ZG½£ŠzÈf+9Í)÷ÿ‹4™ºsáu¡�1êbÝù5oü£Ääúgo †",ŠyçÄÏË`aÈ—.(Ÿˆîþ–%•tîìRâçq»¥±P˜¶èabv&hg¢v~N“MÚRë�Ö^Á¢µ—#Z»Zt(†HÉÈbß}eÉ4ÞHÊ3¦uŽŽA@`  pŸ7w ‘ÚûT%Ôù¤#­½ÑÚ•àB0�@G¿¾÷8¦;d?ö·¼|çQû™ ‹A@€wì ¶%‹yž&OìÛ:`sãì�ùÖýôÞKçØÜ÷™�îú޹•¢6êëZH&œ�µÑ ò7…H ºàb$m‘Äâpm-«¯•ÆÂ.¨/¦]GÄ^ãµqM|¢@€9éÄîñZ Ú�{|0.Üú¾·ŠîC£± Á�°ˆd]¹ÄîñíÛq¨÷øh¦¼µ 7�®}Û¬‰¾bѦ}]b÷5Û[éhû Å[ACÖ)Ø.œQLïX:�ýL§E³Š™@‘)¡‘lGàÇÜH\4(J5E^ÊÄ|Ý·çgzˆë×™Ž}Rbã´ý`]´°bR6€€™¶ìï¦ÿ¾cÍ„àX‰ì˜2§ÜKylGRO€_ëN+òP ‹ê~‚EuïdQÝOŒèsßøÿÙ»ð8®óÐûï.z#@, Á"Q©fY”eÉ–#ù&VŠíØùœäKœëÄŽãT;¾.¹×‰ãزs;®²%[űŠÕ%R�’(ª‘¢Ø{ïÑ{ÛÝ{(Ví ffgw§üÏóàÁbÊ)¿³vwÞóÎ Š˜_µ­qüëžä猼ë ÷Y*è}üûÔ’ñàw_]U"ú=£Ó¢Ûnhí;À®‚×/ f×3QTŒÿx¦öé*c»~LAäççɾ£}þèlp{IööàÎ-#C ð¼ì ü3@‚+ÐðÖOwÕÜòÅz5Â9Á¥·Göü[Çp÷ö%í]„ ZI]œnŒÛ½Êè´!ÎC”@ÞD‘„�­{ƒR·k¦ €€»dpwîÓ+¿=T®»|šíwÝ}�Å]g½3+e…•…0y`ÆN›Aõfí°ÏßWͯ’šéeÒ 25&+í*¸§ZeY¤xW@ÿ®‹$ÿ]ß°»Ù»PÏrÕû„›®™9þ%rãxFèöî!ii�–Ž~iî�VõÕÞ54¨6mJ‘L�\,Ó&Ÿý>YeqåŽQþR謽Ϯ¨Ÿ:q“þK–ÐßÕ½íì÷S�ú¸··Õ™‰íú?�¾ƒ†~Q¡¾óŸ/ê´�€»ù…Åê}�ÁJjw›¢6µày©Á.6#€ž ÀÝóSD@ÀD ¡ÞÅ.UïÀ?or »Ò(°lýqu1¥_*+JÒØ U»-@ÆXwEcê@  €vò¸m¹]²ñã‡R½¿³£V9 �` ôéÞG^{/°hÁ4¹OöØK¯ºÆ¨b#M‹ÎànTv© î´€äùÈMóäž§w%ië%À=)Œ‡6–ޏ'ïЖý-ÒÖ5(UEÉ`kZt6öéSŠÇ¿DªÒÒ•zO@*þë/Öšvlþ´¨ÊÌoz;Ó  ƒ,�ÜŸYqX¾ñÙ„íi€§J[{�uÈ—UÖvýÝJщ½/UYÛu06Å}�žZ80·RÆÿ~tô%¤[ÝÝ(Óquö»?¸4ÕXR ‚ÙÕKÎrµ[ßM€�¬nËž¦,ö€¦�pKb'jÆçèL@ì pÁۮةã‡FÆœ�ÈY `(ÐÞC%Cœ vx-Àýº…Ó&èqòݽ*¸b¢Rœ1 ¢Ó·ªïày4ahö䦋 ǪyXScÈã‰:K%+:«çkõÍ4) �n�Ÿ/Þ!ÇšŒ³ðN-S�Ü}%Ý} kýSJ�€uðè«êÂJø= 06—Ÿ>¾M>ò¥g-·Wªçô¢¹9·g`þôbÐ*å}ÙŒ¨\Q޼g^Ž\¢+é¿éù!OKYœ/ãÚVG冋säÚ9Q¹hê©E·gàÉI¤Q 77Wv×õ¦±ª¶ 𒬼� + 8¼)@€»7ç…^!€€E�‚ÂøJuh¿ÅÃ9, K×Ô¦¡VªL§ÜÝÕ%ÀÝ]OjCÂ"@€»³™&ƒ»37ÎBÀL@gã¥8ˆÅ& wV³³³j¦—ÉÔÉö3+÷M<Œ¡³è²¸É„oû»/›&3«Œïôר©²%P<- ÝŒÊòõuF»ØŽ. mì–;ŸÜnX›ô»XýQ²#�¯2]ë,îFåÉ×íb;i8Xß)û§çå‡o‘±ØÄ¯·ô�u õå* Xgp§d^@/*œQ‘jÞ«Þ¯S N¼}N.»^d¡ïL¢}왦Ñ"Ù(*.–Qµ‹’=�H"òBöZ§e@ u>IÝ�@ ‹‡—Ý¡ï§öJ»ú¦_X}\:»Bïà'ÜÝ�­¸NaFA@À¦@®¾’H±-0˜éû7Ûî!' à?�ÖN2¸;�5¯ep×ãX´À~w}�ÑJVíÒc©­û[�w²'Tz1Ä|ðÃ1·ö&„²òxbG¥Iàæªm�Ò?4ê‰~Ò ‚( ?fü×_¬1 šWE0j¶ç~ú$ã÷›¤¥ƒë%Ùž£0µ¯ß“üBÝõáw¿øŒX]tªï¡Ч©Ìáï©,æ§Þusð” ï•¡^?ß.�Nözï<ãè ™hí!¸=3Ò†­ŒåD#Ë ÷²ð�WÔ}0ItÌÔÇ/KÍ�`o:ÆâqÙ²·)�MP·ËQ}µ™âš€ƒZ\!€¤M€ îÎhÉàîÌ�³0ÐK5›;Éànä3Ñv/¾X´Ð~€»§•,Æï%×í:1ûC$ð™�^!F‹ùtðfS¸½üt(+2Μ92“7·4x¹ûô _ <÷æY½Ãø³ö2õ¿X?R²+ åd¼ÖÉP–¼q(»¤õÐiè–OüŸ¥òÝ6™.Œ9 U>ô ®špLñ¶€x¯Vóª,û§Þ¯˜•ùjk&Gdª Ÿ¤þ/ä{`.õßÄRuÇ/��]÷Mæ_©žg:Hÿý—äÈõ*C½¾c€^ ÄsÏÛÏ;z‡€›999²»¶ÏÍ*©Ë¾À[µ+oï²g €ÞðÀË]ï`Ðð§ÀÈèÈ‹yyùúº<Ÿìfi _Z['zß%Yj�fí �ÁÝ®˜ùñq•!…‚ €€]£ /»õ„íx2¸‡mÆoºGT&eM�:-ÀÝ,©6š¤‚^�Êæ}-2¤Òrz!ºÂ¨“lϘ@uU‰üÁ-óe±A€_swBfOá†6›[ éßô)*x³¥'ùçË××ɇoºÈV�Œ t÷ Ë·ÿ{½á�úwó’iÆÿ‹ Od‡ë:ŒÎDÜÔ•üï䓯”¿ÿÃk„<3®ÓSáÛz!ůžÛ#ÿõëM2<³ä¢ƒ�u€q± š¦øS@¼åŸþ?púû©±èE¤ú¦‡Ãc‰SßÕ wÆ¿ý]߀'Ù¥¬Ó§Î­íÛÔN½??÷TpzažHažz¬¿«h#ý˜×õþ|NÑkÒ-P\R"ã�én†úM!Y¨‰»@À¸ûcžè%˜´¬½»µæ–/nP‡Ühr»Ò(ðÌ›uòÍ¿”в¢4¶BÕn �ÁÝ-ÉSõàî®'µ!€aÈÍå†jNæšw'jœƒ€±@wï°ñNöL(‹%jšðÄ4pÍ¥SÇ3g�Åì-\蚸SE*€AgÛÓ�–QµPb˾V¹éš™îâç� üí'®6 p×ëjšUðô¬ŠsCiB åÑaWªì›Fî¯m¬—15‰¼žõèäÑ-ß ü׃›¥­ËøÎ:3UFÜ Jñ†€^hளj¯ß}BÞwuµ7:K/%Pw¢G¾rû*Ù¸§ÙÒ¸t°òì)Q™­þ†œ\¶t"ùJ@ÏíéÀó³?ÿ†~÷zþ–³GòH‡@{Ÿ÷>7KÇ8½\g$‘xÁËý£o €€®¨[Qâð¼+³;Ecñ¸lÛËíȳ; Ö[�èûPR\ˆ©ç?@»y¸Û%?~`(IT¥£š8 ´@wŸ…¨f¨ ¼˜Á½HE /œ7Ù°ÏF;ú‡b%&¾Ü$‹ûš�MFÕ³=„ çM‘^Wc8ò¦ÎxÒ,’†'°#£Å1úø¨§DÖ[ ªËh§i  lÝß*¿¼Ïpz�Ù JñŽ€^l 3b•_,Þa´‹í8ÐYÛ|a¯Üú…§-·ëçé5³£êïÁíŽÐv’ñ_¬€ ”á €€'¢Ñ¨ì©íõD_B܉ «~v(Äãgè > ÈD2 Â.IĸµN–ŸËÔí‰)þ0º@é�Þ{¯—^ jñž=B¸P �{÷^HbégÜ-1q–ºÈànÙ*Ù�£V"“�˜æm‹NwÔBïÐÄ™µÊUЫQY»ƒw#›°nÿ»O¼ËpèúNF™o ObGÆôgG“KŒß—¯«ÍX_h�  è»®üËÏW‹Š]5,O� o! y²¶cšÊânTVni�=GÛ�v³[ -½ògßX&߸{­X¹³�~fÎVAí:¸Ýl!†­Np0 €6JKK¥8fã u[ !{»Û¦Ô‡Ù À=;î´Š. 4¬ºs·ª²Îåj©Î†À’Ǥ·Ÿì6Ȳvh”wWíãq“«O®¶De €AÈ%ƒ»£é$ÀÝ'!`(ÐÙÃ{8C‹;fÑhëpû°E ¦9ª²×ÂÓAgu6*;µIßà¨Ñn¶‡Pàýïš)Wϯ2yCG\F¹Þmè“í•&Düó—m2ÚGÀ‘ÀýK÷ÈÞc†çNQ¿‹•¥Æÿ OdGÚt€»Ùƒ»–ìL{h Øúí#/ï—}þiYcq1iq¾Œ¶Ï­ŒÞ�%ØjŒ@À �\?ÏöñÅÇ‚\‘¼ä4:í¦=ÍÉw²5”úã‡øãk Ç®>J’ã*È�âMTkô RS[¿ì>ÚæÍŽÓ+|$ —~øðÃë<%ó§q)×(Ë;ôºõêr£¿”"KW•úæÞ,÷’æý* Ÿ;þ­—åŸï\-ý? ©™‘wÏÉ‘ÒBãç¥_=è7 €€"êÀ]µ}þép0{Ú5½gxm0‡Æ¨@ l|*¶g¼X@}\C€{–ç÷•õõYîÍ[ˆ�ÁÝ “åcb^Œh±Ü{DÈ–Ü�É÷ Ž9;‘³@ ©@Ü“ºØÙèůóª'É”I…v†1~lÏÐÄîú@³,îkw±ðÝ6|ÀOøðMóäšK§ŽòDwBHüoȓչ9"“ŠŒä–¯«Ëjÿh� |ëžubv—ª9*³^\Fñ®ÀÌÉÆY²ã*ýö=Ïìònçé™'FÔímîxb»üæ?,–7·6Xêc‘Z€ú®ÙQ™Weü|´T!€ à‚@YY©ºÃŸã»@™B‘e[¶ÜK¶ 9¼#@€»w悞 €@Š%ò¦ª‚¥ ):¦rú“+ŽJßÀp*UpnôªiŠ{^ hqotÔ„ �.2¸;“í#Îg!` ÐÖ5h°‡ÍV*pÉ‹eÑBûYÜÇbb)иÜ$àuÍŽ&/rЧ, è»ÈýÛ_Ý`Øý+TÛFwC ,ï¨,5þ iùzܳ<=4ïs�W7ÖËËëj GQœ‘YÆ¿ƒ†'²#£ùj1дIÆóôÄ«„×Ü�_7¶vç ùí|Z¾ÿÐfQ/Î-”™êïĵssdYÛ-hq €@&º‡Œ_e¢}Úu7¶8ÉAy" €@`pÌT28¼ìŽaIÈr$²'04“íûÉÖ–½°Ö²~K™CwkXŽ"ƒ»$Ax‡îï ±´aP]àeq™%*BÀ’@KÇ€¥ã8ÈXÀ«“-°à®GÙk!‹»Y€ûî#mÒÝÇÂwãgL8÷ÜpÕ ù�ç¾½/!݃Þ\,bØé�ì0 pß_Û!u'zB"Á0pW@gmÿ·»ÖšVzÉ´ˆ�§Ä”È3;kTw£¢ƒ”Éân¤ÃöÓzĸRþäë/Ê‘†îÓ›M¿ª¬íW×Dåâ©dm7…b' €@Ft¢½=uä¤Ì(ú;‹Ebc/¿s3[@ ¿ãöçxè5„\ M¼r‚¬ÿµMdzÞ:0±@n+§'V²v„WZ¬õž£@²%@€»sùau»n ¤. _ÇÖ¶ô§^QÈkˆ(ƒ»žÊ^ AÆù¹"EùÉ'^slØÝœ|'[C-ðõ¿|¯˜½þ9Üõg‰â1�õû^Z`üÒâ7y¬Çt|ïÁMÒxÒ8ðgFyD&™Ü1Å£ O/u q•É/î_ºGšÛyÝžg„õ‘êä9½´Onþۧ䙕‡-ŸX­þF\;'GÌžZ®Œ@pQ ´´DºúF]¬‘ªl $duýê»:mŸÇ  €€Gp÷èÄÐ-p&022ú’:“ËaÎø\9ë±WËÀoZ\ÁLc%dpw— îîYR &�Ü\ÞŽ;�ïá‘1§§rœ#ÐÙ3(£±ø9[xèDÀ« ^ß½`ª£;wõYS¨0 º[³³ÉZ%*�‹g•˧~o¡á˜GDêÛù›d”ÅSL‚6^¶_Fǘ·,NMûP`ý�J^ŽÈ¼JÞ/ùxu{ÍãÅ@:‹ûOßæÕ®Ó¯, ìRw>úøWŸ—¯ÿb�ôö«BŠ^xvÕ¬¨ÌŸU¯õ-œÀ! €dX oD½˜¥dU ’‚fuhÜà­�Û¢Ô‡YhY{w«Šo_ŸÕN„¼ñ�á˜ìØ"ä Þ~N”—nÍ’WZÜõ €¤GÀ,ƒizZ N­¸g.IvZ;²Û�€´žðh÷•Jô²9“m+÷'Äʺ‡òbã ®µ;ùLÀ6|HNøÒ'Ii±JskP:Ò;DÞ ž¬m6ËJÜÖ5(ËÖËZßh¿ �É?ýô-Ón_TUw¼0=„�Ðw»˜\büúè±åäXS·{N—2-Ð70*ߺw�|ôKÏÉŽC'-7_]¡²¶ÏÍ‘ “×á–+ã@@Ò"‘½õÆw)JK“Tú�X$²ôÙ€øX€è6O]GC�g ÷°##Ë7Ôe¤q.@wçvž9'SÙ…&üŒ 0±@nŽñ…ï‰Ï÷:ûRhiç‚SêŠ"^^ðºhá4ÛCÔ¡Å}*È}¢Rn’Á}m‡è W  T–ÊWþìº 7Ÿ÷ó¡–¸Ä'~ žw?¤W 8_Äìwþ�ö¦·ÔŽ@€¾ÿëÍRw¢ÇpDúwmÚ$Þ+y|ÇÜJã¹ÓwýáÃ[=>º—N½.vé[Gå–¿{Jî{~�z½cí�^<ñîÙ*kûTµø…ÈŽtNu#€¤(PVV"í=ÖîJ’bSœn(�8Ü´â§ w³ð¡oƒ|8itÌ¢±Ü%æG°7Ý/?¬n©hñ¾æéî õ'È!¨.©‹“�^hq2ÎAÈŒÜ�;�Œ9?™3@àŒ@s[ÿ™Ç‘�õý^h±> ŽDÈ´@޾RIq$0L€»#7NBàB�¦62¸_hâäç„ÅÌ‹NêNõœk�¸Z»V^dÜÃu; p7Ö ÷ýyÄ¿t³äëU¥¡3¡ZX{TÁf—*K"R�k\éƒ/’ÅÝX‡=ˆ �ÉWn_%f/.ªŠJaZ~˜S³PäÿRYü)áhh퓯üäMùÐç—ȪmÖ¯™é…×ÍͽÀÌìùIFŠ àu�H$";�ñYcÖç)‘C2ЬO@·¸¢î¶(õ!€€'âY쉎„¸Ϭ<âÑ{踻7G¸»gIM €@˜Èàî|¶‡†cÎOæL8#PßÌE§3)<ðò�.©©�вÛ£ë±X\Qln³bkƒiŸíNqB ôsóê:Ó1í?—Qþå›er§ŠU�寗“žYyXºz‡3Ù%ÚBÀWßWAÍu'z û\^d5<€¾(R‹¦—›¼FÚ|\6ìnöÍxè¨3�öî!ùö/×ËÍó¤<õú!˯‹‹òE®š•3¢’o²°ÌY¯8 @�ô ”••IïÀhú f+M�oVl°r Ç €~0þDÒO£ ¯ €À…±+/4ÉðÏK×ÔIk;f·Üî–©&<ÐË-vž@²&@€»sú!•ý�‚© è¼ÈÇš{S«„³Çâf©X=`ôî˦Úî…*²pMr’ Æ3* -½²¿®Ãh7Û�¿þÿ®–kL3”Ðÿî4Ç-„VÄ×f¨€M螬è»9>ùÚÁd»Ø†@è6ím–_=¿ÛÐAÝØB.�ÎåZC î˜3%*z^�ÊwØÈÿ7#Ÿo<ºUnú«'俟Û-£cqK#ÒÏ—¹*ûÿµsrÄl©¥Ê8@�,´õs¶,°_Ø¤Š‘ºÍÚ‹� Ïäg@ÀÃ|bâáÉ¡k à\ qõÏõ•�ÎkàÌTâê¥óº� ©VÃùi ¨Î=X2¸»gIM €@˜ø_ì|¶ûGœŸÌ™ 0.ÐÛ7,}C,qãé ßûz¹\·pº£îõZÈâž«>Y6 re}�£¶9)záý�¾t³äçå¸k !uíÿ%3ì}ðv詪*5ŽØ|ðŽÂg$Á›wF”šÀ Z­ó•Ÿ¬2 fžW•B•õ›�y{f…ñßË-û[UVogÆEFÔ Ñûžß#øÜòcàÞoeµèÛ“Õ]‘ÍÍ‘ÙS"¦ #‚äÅX@‚%�›“#;�’H#ë³M�4ë“@@ ¸§C•:@ÀêãÃÅžèHˆ;ñè+‡B3ªîzdü<°U)#€ à!�º“j5:%« ‰<·e˽LDVg�Æ@ �|‚’N]êF�¬ 4¼õSýIò¡¬w$äX±éxȼ7ü¨¾’BqE€ î®0R  J�IÅù¡wªƒnír¤ªÈùaèí–¦öÁ0¸:v?dp¿áª�ØØmñiRV£ÄÛzAð|&àês.È•ýÁçËg?v¥éõ‹'âên�¦‡±3Í3Ê�/-éLÄO½v0Í= z¼)042&_½}•éߨyUQ)"ƒ³7'0M½ºxjTòLî|ñÐKûdé[GÓÔ:ÕÚ‰�ÿûð—ž‘?üÚ òâšcê2ö^x”DäJÔþ®š¨LR¯•) €Q ¨°@4ôqhþSD–ø«Ãô°'`ü)¤½z8ðª@B}t´Ø«� K¿î{a¿ŒŒÆÂ2\_Œ“ îîM“Ý·Ýk™š@ü.PV”ë÷!d¥ÿãq&+hVði4Ç›{1¯ Âî奲pÞdÛd}C Ìcí4³,î¯l¨³V G! þí³7ˆ^”aVÚûr¸Õâ“Ó¬"ö9(TÁ¹f¿÷:Ëíèsä˜}+ðÇ·ÈÑÆnÃþëlÎÕ»t‡n×Aîfå‹?\)+6“(ÈÌ(ÝûZûäêwø†¿|L¾¢ªì>Òn»IýÿqÁŒ¨\;'*:{?@�@ ä™.ì ôؽ3¸Þ¢¢ø«Þé=AÜ07í~{Ôˆd\ �àžqõóÔY6w8qþF~ʪÜÝã'ÀÝ=KjBÂ&PVLÚ>§sÞÛgï¶àNÛá<‚(PÛdtÄñ¦{LqŸ¤‘¾ñêjÛ:Oe� r·R*K�xtw½[Qä-�›•_}ãVµ(cŠ)HKOBŽœ$€Ú)Í;gšé6µõË’7¸©fš§€ê=&°e«üò™Ý†½Ò7Ô¼tzTŒÿcžÊŽL-‹˜<ë»Þü;.÷4`´þ‘†n¹ãÉíòá/=+ïûìãò³Ç·I{÷�íèE ó§E庹9¢çš‚ €@5Z¼õ_0²7Æ¥‡—ÝÁÅ’ìùÓ2d@€÷ ÓdW é­Û·©Ën/hýåuu xH€ îîMF,f-àý© @ (%:µÅ‘@O?ŸÙ:‚ã$”ÀÑÆ.\ðCw=ܯ²à®Ïë´ö~§\e¤Í1ø¤¹hTÖîdÑ»ö¤XÐwxä;¿+sf”™žp¢+!›ãdŒ3UJßΊ∔ñÝùÔÑ› 042&_½ýM1[ø6·**E¼ ÃÓÁpŒ—¨h£×Kú$ý<úô·—;ÊnØ(;ÎÐkSufv�©ý7ÿa±|ðïž’ïÿz³ì:ÜvÞqVпÓóUvþ÷ÌË‘êòˆDŒÿ-Z­’ã@ð…@II‘Ô¶ ø¢¯�îd"±$Ðãcp €€0¸ì€  (õ‘U„,îYžÒ‡^>(ý"eyÎ4ŸcöIú™£x`E€ îV”8@ ™@ Ñ ÉX,m#ÀÝ!�T`]gÒílt&`Èæ¬ÆôœuÃU3$ê â¦ÇâµJ�•v² v5*Ë××íb;I¦M)–Çþï‡eê䢤ûOolíMȾqTzz ß3)0{²ñï}݉y~ÕÑLv‡¶ÈšÀ�Ù*:´Q™T³»�Çö` äŠ\¬‚¡ÍJßÀ¨|ê›ËdÛ�V³ÃØgC@¿^ß´·E¾óßäýŸ{B~ï=3ž©ýP½ó…¿úuï•3UÆvØ®îhÂå¡ €�Mäb>Ä@¼øeŸ��î#€ ˜¿‹žðt@|"�àžå©ŽÉ¦=MYîÍŸ ƒûi‰Ô¿�ÅÉF–º"5 €á(.TW·)ŽzúX8鎓B/02“ =¡wpÀ/ܧL*”KçTØzïpB¬&`®,5t}eC½iV[Ûã„Pè î�üûïɤó çý ÙÝ—1ÞžgüyQY‘"“é¹ã‰íüîg|Vh0Ó[÷·Ê½Oï2lV/»tzTŒÿKžÊŽ LŸ‘¹•æ—çÛ»‡äãÿô¼|ýk¤§$€ éÒ˜zA 3²ÿúŽòå¿)ïù‹Gåÿg©üòÙ]ÒÐÒë¸qÄ®ƒÙ¯››#WΊÊä~«cr" €€ïö·˜Á÷#õô^jÚr/áé)¢s à†WÓÝP¤ð¼@Ã[wlª¹å�«Lî³=ßÙwPgmúàõx„þZT_Y¡¸" okªÅ!ê '• €¡ ƒ»óéî&ÀÝ9g†Z ©µWü�í—‰ò“ç�WWË›üõû�Þ¡„T˜dg?=W:ÈG'‰×ç\XZ;dç¡6y÷eS/ÜÅϘ \>oŠ<ð­ß‘?ûÆ23<¶g0!»âr• 8ËË1<Œ. èÏBfOŽÊÁ–ä« 7tÉKkj壸Èå–©o �Ää«·¯2]È¡ƒ™Í‚xc$ô"“³§DÔ¢¬ˆ4v&yÑôvGô멇^Ú'ËÖÖÊm}£|ìæù㯳2ÙO?´¥�Õ{œmOŽg½ßvà¤ì:Ò&úwÓ­R˜§Û£¢'䚯Mp«IêA@ÀÓ¥¥%Ò|ˆÙž$õÜ’l÷�ö@�Làž eÚ@/$ÔeÖÅê³®/{¡3aíÃ3oÖÉ×?Û/U“KÂJà™qç8¸5½g:ïÁŽ$Ô½Ð#,ðàÌÐ%@ÀÛEúþäG]½dpwÇI¡¨;Ñz·âÉ¢¹ÝnÄ¥ún¼ªZ|a¯íÚºUà°•wðS^‘®�äÁZË×Õàn[Ÿ´ÀõWL—û¾y«üÕ¿¿*ƒÃÆAîýêŽ;ŽÇäòꨔèÐkJ&¦ª,îõ"C£É[ûÙãÛä#7]D`fr¶ú\àG�l½�è”Fdædþù„yûEUQS·ÉiéIþºé´M[× |á+äñWȧ?z…|àݳ¤´HE\‡°è õÆ“}RßÜ;ž¡}Û�ÖñÀvm”Ž¢_ÿÎTÛÇq¦£êD@À§ý£\×ðÀÔ Ž¾è�~Ð@ íü×I;1 €€Wb Y¬âO pÏℌÅã²~gƒ|ô–YìMk2¸»û<ÐA-ÜhØ]SjC P¬Ó€Q àîˆ�“�ƒ:‘⪀¯2¸_5Ã0úJ·�˜¡J•ÅÝ(ÀýåõuòµO_oÖû0ø Ð÷ø|Xþâ¶åbv'd½ãx\.�xMI¿€Î¡P£²¸nMžÅ}_m‡¼¶±Nn½anú;C dP@×Þóô.Ãu.ŒËÔß"þ…~Ç%êùS×LÚú̃Ü5ÔêMã_yjEáûÔ]y>ôÞ9ã_³§—ÆQß©¥¡µOedï“ã-}êqï9ß{åd§�¥UŠóE*K#ã¯!ŠóùíuÈÈi €ˆ¨7€»k{öÚ!Ü=0­9dwuƃZ¸º«¦T†„A ¨�·äNç¹½gÈ驜‡@¨¶ìk õøÓ1x?ep¯ª(’ù³*L3Í&3êJˆºi•Xy9E9™¬‘ÃÇ»Dº^>oJòØŠÀ‹N“§¿ÿQù³o,“–Žãõóõ@s\z‡"¢3är;C*×vL›‘ãj •Q‚ýŸ>¾]bÎe.\§¢l èLÒ_¹}•úÿh˜<·2*E*X–‚€‘€Ÿ¾lFTâ'âÒÑoü\:÷üѱ¸¬ÚÖ8þõÍ{ÖÉ¥s*äúËgÈÌ©%R]¥¾*Kd†þ®¾2�é]ÿ> Ǥw`DzúG¤O}ï=çñéí§¶éãúÔþîþai:Ù/éÊÄ~®_²Ç¥ê®/:¨½J}ñ;›Lˆm €œ(++•Î>ã;�=’Géˆ'"‹ÓY?u#€^àjº—fƒ¾ €@šnSi„¾¸D5ò�inˆêMVmk–ã'ºdvu…ÉQìJ·ÜÝöSÖFwGNm €©�ÁÝ©_{7îNí8/¼ݽCr¨‰Ä>n?üö^@gü<Ü`ïB¤ŽÝÓAîåEg±,PŸ6ë ¡¾áäAZKÞ8$ßøì nOõ…Hà²9“åÙü¾|R¹×žè1ySWB=ã²°:*ù,J7µJu§^3Keq?z2y÷‡NÊ[Ûåækg¥Úç#à �Ÿ<¶u|á–QgÊ #2sòÄÿ7�Îg{xôßÏËÕÿ©Fõ?«¾=>¾¨ÐÎèÕw‰þJVJ‹óÆÝg¨ ÷"õ"M'½É͉ŽßÝU?Ö_ú:AN4zêqŽÚ¯ë22“!ý¥V. «ïzQÇø×øã1:çg�y]ïÓÁ÷~)“ÔëZЮÛõëW  €Xèà5®5©´5–YšÖ¨ð�oÙ<4tÒ/Q+‘îé§6maÍöãò§¸›¥{'îî ›ekr·%jC’@!WQOçIÜÛqbxÔ¶‡wði¹ßÜo¼z†<´lŸm‘îkîºâª2ã÷gV‘ùÌ{ǃ¨lw‚x[ fz™<£‚Ü?õÍ—eÏQó¿m=ƒ Ù^“*C®•E ;˜Q~*‹»Š}LZnl›üÆ»g‘Å=©ý$°ýàI¹kñNÃ.«xa¹lºº{„áì@à|}§‘µ ¢ª4GÝ '.�³¹Ÿ_Ë;ÒÙÑÍàßyFp·hcý:@µë;±ð-¸sÍÈ@Ò'�£Êm;j¾Ð<}­Só�DâõúÕwužù™ €@ÀN-Ãø  pZàøô¦5*‡XËéŸùž�^<(&woÍN§BÖªÎÎBqOÀoA-î�œš@R(*d͹S¿öža‰Å“gvZ'ç!t�ÝGÚ‚>ĬŒÏoïn¼ªÚQpi÷ uÞ©*Àݨ´v ÈšMF»ÙŽ€e�ªŠ"y껑߰�\%–•] ññìâ¼|°Llû@ýQS�ÊânT6ím– {Níf;¾ÐYª¿rû›*˶ñ{‘9•Q)Ê÷Åpè¤Ç ÕMÞ®œÏèžÏÇ)ÍŽÎ' ³³Ï«ŠÊÕ5Q¹ñâ¹jVTôb,‚ÛS¢åd@� ”””Jÿ°ÁŠæ»d|è‘è’Œ·Iƒ €@Œ?mÌb§hH›ÀSO©WÜ‘§ÓV?[ØSÛ)k[-ËAé ƒ»»® “‹Zî¶Dm €A(äŠuJÓÙ×?œÒùœŒ@ضìç=X:æÜ,À-í¥Zç´)Å2¯ºÜv5½C Ìgí4PTQlä¾ä�CÖ*â(&(+É—‡¾ý»ò…?¾f‚#OínêJȶº˜ô¨ç3%=:p07Ǹ,îü,pûc[Ç3b�¡¬0"³T&n ©èÀìëææŒ?—ÈS3±¤J&;ž�]gÁ¿¼:*ï½(G®W_ú±Þ¦3·ëc( € �š@sï¥StåìøX<þ¬+5Q  àÞÎùd¢è&¸(�ˆ-v±6ªr(°rËq‡gršdpwCñl~ËÚx¶çwŸz|:XýÜïú9®×õ÷ ·ëº) € L�’â"9t˜d3˜ÝµÇ×ÜÙä�~Ð@ £j]4ŸÀ´žÁ7Ô¨;Ã7ro�ø‘凤£{À[� IoÈàîîD«3îVHm €¡ÈQ©ËJ Ywît²�5àîÔŽóÂ%ÐÕ;${êŒ3ކKÃýÑú1À]+è,îv‹~ÛÓ«²„Z-å*àÊh-—¦zV RH‡€¼ûËß¿R^ýù'äú+fXn¢½/![ëâr°9.C£–OãÀ$: ouùù�–ç¶lm­¨ã£ÙsMxìM�º=òÏw®6íÜÜʨZcz;ÈŠ€B/ÌÑw(/:õ¥â'믒ˆLQ_zqWÕÛ_SË"2íí/½Mï×ÇORçê¬ñ%‘ñú ÔÇ:¸^gcgaGV¦–F@ȨÀˆäÛ¾ `F;’ÆY’¡2L@à<ÜÏãà‹À–-÷êËTO…e¼^çÈX\Vo«÷j÷Ý/ÜÝ�Þîî‚R "�SŠB4Zw‡z¸©WbFiAÝmŠÚðµÀÖ½'|ݯwÞ¯wszß»ì¸ë¹°³F]‡¶ê@)£²øõC\ 5Âa»+óª'ÉSßûˆ|ë¯o”‚|‰g±´ö&dK]L·ÆÇ3ßZ<�Ã.˜59:žá÷‚Íg~¼ãÉígó/ ŒªÏ®?ÿýÒ7h¼âEþΪ0þ_çÅqÑ'@@¬ DÔj¶ÇÈÞnÕ+�Ç%"9Ñ'ÓX?U#€ž ÀݳSCÇ@ Ý‘Dä‘t·Aý ÜÿÂþ‰â×pw—Ô¯A-î*P €€�©¸;qÓçèf';¹�S?Î �Àêí�álF�g¡Qšt’Á]7Û=h=ƒ»>^g5*ë;eÏÑv£ÝlGÀ�•¾ös¿J–ÿìrÝÂi–ëÔwhîNÈæÚ˜k‹ËhÌò©ø¶€Îî;Ã$‹ûÒUGåhc7^xVàûm–‡Nö/W]a]0#JkC!v € €ø] ´¬T:zFü>Œ ôeÃ?áCÞ Ì$c@Û¸Û&ãŠÀñU“Õ½Eǃ2¿Žcóþ6Ù´Õ¯Ý÷m¿£Ü;ÔÕ¹K�ÁÝUO*CÂ$PY^¦áº>Ö'Éã:*J pDVïn Ô˜¼6˜˜O#Ük¦•Šþ²[z‡¶²®—DD•%o2ÚÅv\˜_S.K¾ÿûòÍÏÝ e%ù–ëÖo÷;Oº×µÇE%t¦ØÐYÜ�>‚ÒÉî|j‡�Ú8�Ì ¬ÜÒ w/ÙiÚà¥Ó£R�kz;@@ðµÀÉ^_w?8��È£Á #Aì ànÏ‹£@ P·Å…,ÑWÖ×y¢aêÜÝ�m2¸»ëIm €@˜¦L"À=•ùnäöTø87Û÷·Œßí CÍÚã>^ìê$‹{L÷ö »—ÅýÙ7�Ș®”‚@t6÷¿þƒ«eݯþD¾ðÇ×H‘�ÈTý4=Þ¡Ý�ÅÆ¿�e ÃhBOŸd¼ÈåiµÈ¥¡…ˆ‰Lu †ÐÚ1 _úñJÓ1UWD¤²Ôø¹mz2;@@ð�@~^žì8Â]·<0U£Ñ±Ñ%è]@²"@€{VØi¼"‰Ê#^éK˜ûqïsûd`h4Ì»¾¨KqOÀÏA-î)P €€�ɸ;a;sQg(x€@R�µ;¸smR7úù½À�WW;’è´wÚÔ2ã÷Ÿm]ƒ²jÏS{¢�ª@yi�|íÓ×ËZèþÙ�])y¹Ö/“è î:“û&辫!.ÍÝ µH#Õûü�ÅÝ`ˆ1µHèç‹ÉânÀÃæ,è$_úñ›ÒÞ=dغ¾3ÉEUÖÿnVÄ@@<,�WX,£1{I<<ÿv-!/Õ¯¾«Ó¿ ç €@j|“šg#€€ÏޝüÙn5ó{�ú|Œ~è~wÿˆlÜuÜ] L£Q^¸9™dpwS“º@�p L.#ƒ{*3^ÛÔ“Ê霋@ †GÆdåö�£çç÷7]3S"FQ§&¸]ö.næ« Î“‹�ZòÆa“ÖØ…@úª*ŠäÛó>yë—ÿ¿üéo/»Éºr¸5.T°û¾qiëKˆ�oê�6èÂ<‘i&YÜŸxõ œhëO[ûTŒ€�»ï”·¶/¼Ò9C̈ ¹Cì¨r, € €€6/úôãxüÚgõ)Ü£~í;ýFÜ ºÍ Eê@¿ <â÷¡ÿ�½z(ÃðÍì^´õÍÀ²ÔQ?gmÌÍ"€¼-P^V€E »Å^˜e �q*>Øu¨U†FI+œîiÓÙ‡ýZj¦•ʼêrÛÝïQA½v‡mܺ|}­tõÛî' à–À¬©¥òƒ/þ†¼q×ÉÇo™o»Z•ðYÚUpû~ä¾áhLµÄE/ñï_Ûž ³¸•Q•ÿž§wíf;ز¿U~ðÐfÓöæO‹Jq¾é!ìD@@À÷%%År¬yÀ÷ãÀúýC/` p,`ü©¢ã*9ð—@<‘û˜ê1ל²[jF? D"�ø©»Aíë=Ïî•1�ꊒvõ¾”â¢@B_ £ € à@ ¬„ îØÎ;¥þ¶ŸÂ(� ;¥wp‹ ø}±ëûUðnn®ý7ˆ�rGÍ(7nmhé•×7Ög`Æhë‹N“ÇþãÃò¸úzÏåÓ­Ÿ˜äHØ^Û~*Ð}ý‘˜ìQÞëÕÏ�j±ÈXH> +Î�ˆ¾›ƒQyP-téìåÎlOŸÀc¯ì—V3l@ßsÁŒ¨8øwiX';@@ðª@Ii©t÷«Û”l œœÞ;ôz¶;Aû €@¶ì_½Èv�iHƒ@46²XUâJi@uPe]s¿ìØßäàLN±+ÕWf(® ˜Ý¾ØµF¨@ �¹9Q©œD�{*“»ãàÉTNç\' —^>¿êHàÆåÕù=À½D¥¤]´`šmÞþᄨ„˶JYaDJÕ—Q¹oé£]lG «7©… Ïüà÷åõ_ü¡|á�¯‘YSKSê�h×�íõ*£»t×ï[T†÷C-qiîNˆþý ê2z³,îCcò«çv§dËÉØ8Xß)ß¼g�éis+£¢ÿ‡Q@@ƒ@sWHVa{}2#òä–-÷’ÁÄëóDÿ@ í¸§�˜@Àõ«ïêTý|Ñ} zŸ[eœ-'ècÏäø¢úþð×üÔâ!€8˜^Qäèë�Èân¬Ã¯è»â½÷Êò½/|@¶>ôgò«oÜ*¹é"É7{rÛì|L%ÌÓ‹HŽ«,ï{›â²áhL6ׯdÿ‰¸;—ÆÎ„œìMH÷`BU>7}¼_ŠYwÜþÀ {ý2úés�ïürƒè îFEÿJ_6ƒË¨F>lG@ž@$¯HÆbö?ï žDvG¤f ¶iÕÏÌo5•Ý.Ò: �1�ÜŒµDC €€ÇrÝ/ŽIy·H¢Üã] t÷FÔ}šWo«—�}pa Ç™íÁ鋱÷â Þè»§IM €@ø*Ë pOuÖw9)ÕLNµÎGÀ÷ƒC£²tm�ïÇá§!ÀýšK§JEY�tõÛ¢ït�Á]ßLlFydB º¾y›ì?Ú* /žˆñxqdpwwVÈàî®'µ!€a˜<‰ î©ÎùÆý'ÇTtU aÐa‚ϯ:ÖágmÜAy/póµ5òÂêc¶»DJ ì�¦³IW©ÀxX›¬<ðâ^ùÜ\%9ÙN3�¬slCÀ¢ÀŒÊùÛO\=þu°¾S^V™Ý7ïo•­ê«[G�g±è˜ÞSq½ÉOuÍlßÙÎë_S�9þÔWDrÎûYe‹?½OEŸ=îÔñ:A»ÆOVî~z§|ú£—K¡þƒAAÀE�1u÷Ð/ü`…è;.}—�¹•·ù°@@ ˜}#¼ÿòÈÌî¬_ñ“=é Ý@².À§¬O@/ 4Noy³¦µZ§µöwú5/¡:ìË+ëëpwhgå´(�V˜,?�¾Ìòˆ €ÀY�Š2ÜÏj8{4<—C*þ•ó§:«€³€ÀáºvÙ]k/w†�õ!å½ÀÍ‹f�gbÖ í�z–Êrk·Ì¬0p×™u_ßX/¿}ã\»Õr<ž¸lÎdÑ_ºèß±£�ݲõ@«lSÁî[ö·ÈþÚN•Ýæ/ŸGFª?‰»0zXm]ƒòØòò—¿åéM|GÀ�?ºUýÞµÖ¥b,˜u|wÊÙ� € €€‡rÔ áÍGº=ÜÃu-‘x4D£e¨ €À„¤ ˜�ˆ@ TO=KD�…jÌì½Ïí“£4Ní³ŸºE|»»³• ÀÝ]PjCB&@ww&|Ç�w*¢|*ðÄ+û}Úsw;�÷³¦–ÊųÊmOFÏ`BæÚ>MtvÜÒãÀøû–’¨Ê¾*gøA@%2—ù5åòÇ¿u©üçço’åw|Bö>õòäw?"_ûôõrë s¥²œÅ�z.±xçøzü0¯ôÑ«w4É�Om7íì¥Ó£¢ï.@A@@ LÅ%¥Ò?¤V/S².Ë�?žõNÐ@ÀCdp÷ÐdÐðŠ@ÎÃ*÷ÐW½Ò›°ö£[Ý&vã®ãòÁë/+AZÇ!ÂÝU_'®v€Ê@|-0£ªÔ×ý÷Jç_ßÜ ŸüðUb.镞ÒÜ8r¼CVl?á~ÅÔ8¡@P2¸ë�Þ|m�i°—­K¿ÒAîÅöÿúê,î[’GǯQAˆë;Ïd½žp"8 ”¨hÚ÷]]=þ¥‡¡“¹Ww2ت²LëLï:ËûÞ£2‹ûx”ö»ÞÜÞ?ži[ÛPHU@ßà‹?\1þûeT׌òˆT•ÚÿfTÛ@@ð‹@CÁí^˜+õqÀêoü¼Î }¡ €€Wp÷ÊLÐðŒ@ãÊÛwÔÜòŽªCWx¦S!íÈc¯"À=Ms%ÀÝUÙ µ¸ Ce €–ÊË ¥¬(OzG-ÏAÉj[úäèñN™?{ròØŠ@€{y_€Gçí¡é½ÀÍ×Î’ûdNïpà^U‘cm"£×Pu_¾ûùxû @ïHƒ€Îò>gFÙø×|pþx C#cr¨¾KtÐwsÇ€´´«/ý]}5·õ�ïèJCo²[å¾cgÿ³ÛZ÷³@\­ùÊí«ädç á0ŠóE.žÊM¯ �Ø� € X�¢ÂY»»7°ãóÓÀ¢’xÔOý¥¯ €@&pÏ„2m €€ßÔGÞ‘G"’ø¿uù{WIn·ˆusÖÈà¨UíI¢1Üm‚Ú@.P3½,à#ÌÌðšUÖÒµírùÅU™i�VȲÙÛ³<ªù±€ÝÍéæE³l¸ëYèHÈ´IöƒuP|eiDÚz“¿§ºçé�ò™ß¿BJ ó²?Ùô�€èlðú«ª¢È•�©»>ô«Àøñ`y8¯ƒäÏ Œ×ûÞÞ~*HþT€üéÀúS�ögÏ©žZ"¿ñîYò/Ÿ¹^eÔ¶ÿwÅ•AQI Ž6vËç°"é"ªÓ¬RÿƒôÝD( € €„Q`RY™4ê ãн7æDâQïuŠ!€Ù À=ûs@@À«‘ø#"ܳ¯õ‹þ €^à£/Ì}@O 4­üQ›úœ{™';²N=òòiiï Ù¨Ó;\2¸»ë«/œQ@HE`ê”áÿs*‚gÏíì‘�[ÎnàˆÅrç“Û82ÿ IÏE�Šø»é𙶇4évn1§Ò8ÀýtwÛ�â@�P üè‘­òêÆzӱϟ½ÀŠ‚ € €@hòŠdlÌùg9¡uKÃÀ’x4 ÕR% Ü1� Ò&�ˆ<’¶º©Ø²ÀX<.¯o¨µ|<N,ÑQ ×ÔS”‚ €@Jy*uàEÓÉâžâ9'?ÿæás~â!ÁxmÝQÙSgœ•4x#ö஥oYTã¼sÀÑiã'M.6Ïâ~ÏÓ»Èâ3@�м¸æ˜üìqóE€3Ê#¢¿( € €„W "»jSø '¼péyçä¶Êå騘:@� à„Yd  �6�XÿàRU9·J›°õŠï\²GFÇTJ8Š+dˆu…ñL%ñ€em<30 €dTà♓2Ú^�{kW‹4´p{Õ Ïq˜ÇÖÕ;$w=³;Ìž{ß Ü|í,q²&ºk µ¬_fYÜ;z†ä×/îóÔÜÓ@o ì«í�/ÿøMÓNM*ŠˆÎÞNA@@ Ìe“J¥¥s(Ì{bñž=·�x¨Ctð”Ÿâxj:è xM i˽I<íµ~…±?Ç[úd㮆0=-cŽ:‰VHKO‚Qi<‘Z G0 €@ªsf”¥ZçŸ#ðÒ[GÎù‰‡Gà×KwIïàhpäó‘1ƒ{uU‰Ì¯©°=3=ƒ IeíïDYÜï^²“,î¶g…@�pè…PŸý÷WepxÌpÀ¹"—WG-â2¬” € €øP ¹‹kÛ^™¶x4ñ WúB?@/ àîÅY¡O à)�x4òkOu(Ä�yhÙþ�ÞÝ¡“ÁÝ]Ï µ¸+Dm €Vj¦ànÅÉê1Ï®>&½ý$>±êÅqþØw´Mž[Sç�Ά¤—AÌà®§î–kklÏ nïVA¸§¢Ç¹ €@8ÆÆâò÷ß{]ÝÁ©× QÁí3£’—cx;@@…@Qa�ì<ÆÝO=2Ù›VܹÖ#}¡ €€'p÷ä´Ð)ð’@ãŠ)+ÔåÙZ/õ)¬}yqíq©mìëð]7Ü]å”x<în…Ô† J�êªÒPŽ;]ƒ�ËŠ�µéªžzȸÀX,.w<±5ãíÒ ¹@P»Þ¼h–ùÀ öv ¤àNwX6#€$Ð7UüÆÝkeíÎI÷ŸÞxéô¨”¨(w  € €!ˆçJP?ÏòÛÔª·3¨>§öašßM@›¸Ûãp£Àmñˆ$îãȽ8æekŽz±[¾ëÜÝ�2>pדÚ@�° ̨"ƒ»Ûsÿä‡DS‚À²Õ‡å@Ù•¼6—A}/𾫫%ßAšÛÎþÔgˆ,î©R �Ÿ>¾MyÙü®Ÿ5“#2µŒàö°<'' € €€±@$‘mGûŒ`O&⑜œ_g²AÚBü(@€»g�>#€@Æâ±èªQVNf\þ� þ|É^éyç¶Ø ƒ»-® ŽÇùó0! €L(PV’/ó¦“Å}B(œè”M»mœÁ¡xS þD·üâéÝÞì\È{ è"š¢‚\¹þŠé¶gw`$!#c¶O;ﲸŸÇÁ €�¿r@~ôȃ½§6ëÿ)s«¸jŠÄN@@�Д–•IG±ž˜ðDâÕ†7~ÂÅ OL�@/ 𩎗g‡¾!€€gšVÿ´^uæUÏt(Äéî‘5[ëB,àÎÐ#Q²¹#yª–¸¾2@®[0Õ…Z¨â\�_ÜË-WÏá±ï†U´ð÷Ø ‚†¹�'/¨ܵõo]?ÛyGêï�Èâ“@�м¾é¸üó�«MÇ[˜'² :*| jÊÄN@@� 4tÄB4Zo5"Ñû½ÝCz‡xC€wo̽@¨øÕ_ù ›¡èâ½Ïí Å8Ó9ÈÜ]å%ƒ»«œT†„ZàÊùU¡:¨©WVmf�d:l©33>¿K4ôd¦1Z±-ä÷½wŽm}‚îdqwDÏI €@(¶h•¿ûî릋XsÔÕÏ+fæH.WACñœ`� € € ÊîZ>cœX*#GtåD»ŸËHK4‚ø\€�v|>�t2'PT’Ð/0;2×"- lØ{Rön1ÚÍv ѹ‹,0Y>„wËTˆ 0�Àes+'8‚ÝN~ùünÑY°)øM`ã®FybÅ¿u;Tý r€ûE3Ëe~M¹íùìHH<õ$î2Q÷ûžÛc»oœ€ ào�£�Ýò™o¿"C&¯íõÇžWÌŒJq¾¿ÇJï@@pS`D „›’»)ê¼.õ±Ù£µ+r^g"€á À=l÷¦@{×€|ï¡ÍÞì½:#äw=H'YÜup»rOµL”ÅýΧ¶KKÇ@ªÍp> €€ONvʧ¾ù²tô˜Ç�,˜•ò"’{ødZé& € €@¢Ñ¨l;Böö P[j"‰ßoé@BÜy €6Ñø}6çÐ4 Ü·t¿´wõ§±…`WMwwç7ÆrwwA© ±€ø~á´ ¤oè÷¿¸_zûGÒ×5#ࢀšþáC›¤»ÔÅZ©*Ap¿õ½s±uô§à®6Ëâ>04&ß}`££þq €€¿úGåÓ·-—ã-½¦¿xjTªJ n7Eb' € €@èJJËÔçŒÜáÔ#¿ûøÊ;·x¤/tð¼":ˆ^h\qÇÕ^lz`RFÆâ²rS­zâÏ.¨EÚÈàî"&U!€ÈÕ—T¡��^óìÒP3U"à¾ÀÓ¯í—�ûOº_15º.ô÷÷\1]*ÊìßYÄ­÷‰²¸/yã°lÝßêú¼R! €€w‡Çäsÿ÷UÙu¤Í´S³&GdfÁí¦HìD@¥À±V’hxeâÕ;�½Ý�Ì^ý@Ò(@x[q©‚)‘YÜ=2µw.Ù#±XÜ#½ñW7Èàîî|àî®'µ!€a¸l^eØ Ò6þG_;$­Ü(mÀTìŠÀ†]�r÷s{\©‹JÒ/‹ûzTN4"ÿãºÙ¶!GTR°¾awl.žj¬ø­{×Iœ»jÙž#N@ü  ïÖ¡3·¯ÙÑdÚÝ©e¹¨ŠKž¦HìD@¥@II‘h0¿R(a²3豑ё‡³Ó4­"€þàÓνF�, äD"�ªæ‡²Øš~[àpC�lÝÛˆ‡�¨ R ¸'ô¬�îIQ €€�9ÕåRR˜kåPޱ) ït×SÛ$A ¤M9Ï”Àáúùö¯6dª9ÚqA ïn½aŽ#©Ž>wÜË #2M.•íOÊÓ+íf; €€Oú‡FåÏ¿õ²¬ÛuÂtŹl:—;M‘؉ € Z��±|õyxh‡ï­�'äÅ–µws+BoÍ ½A� ð‰�Ç'ˆî!€€÷jWÞÞ¥zõ´÷zÎ=öê¡p<ÅQG"ÆÁ)VÊÓÉàÊigÐ €@Út¶Ü÷\V•¶úÃ^ñª�ͲjK}Ø¿ZÛûåëw­‘áQîRåÁé1ìR,üùúà¢É͵ÿ1²›7̘§²òæ˜tá?ïß(}ƒÜnÛð‰Ê@ÀgúoúŸóeÙ¸§Ù´ç%¹¼:*|ÔiÊÄN@@�� äääÈÖÃÝ!½÷†É‘û½×+z„x[Àä²€·;Nï@�l $¢r_6Û§í³KV•ÆÞ”�±öˆ îÖœ¬†¬�V-8@À�w]:Õ�Ѝ%©ÀíOl—ŽîÁ¤û؈@6úFä›w¯–öžál4O›)ŒÅ‚Ÿ«¬$_n¸r†m¥¾á„ŒŒÙ>-é ùêÆ&³'”}²sPî|r{ÒsÙˆ à/�¾�QùÔ¿-“M{[L;^ þ7\9Ó|”iìD@@ àE%¥Ò? ø(ý2¼Hë´ž¡—üÒ[ú‰xEÀøª€WzH?@ 4®˜²B]®õ`×B×%�,oùº£¡wªŽ’Ö(UÂóÎ'ƒûyü€ à‚À‹*]¨…*ŒzTÐÌ=‹·IðÃR�Øî%�ѱ¸|ïþõr¨©×KÝ¢/ÆâáøKò[×ϱ(rþaýîùÌœ‘¼óë?÷§{ŸÙ%u'zÎÝÄc@Ÿ ôö�ÈŸ©àö-û[M{®ƒÛ¯®É½Š‚ € €É7“L#¹Læ·&$ñð–-÷rûÁÌÓÓ"ø\€wŸO ÝG�l Ü�HâþlµN»ç ü|ñv)-ÜùUö'2¸»;µ¸»ëIm €"ͪ�œhŠ4 ¼¶µIÖm?žÆ¨�‰‰„ÜýÔVY·×<ˆkâš8"[ú½€{!ÜÙÅÄíÞzÃq²NÚÍwýoñ¢*ã�³õb‘ÿÕ†‰Ã €žèQÁíŸüÆ2ÙvÀüuÑéàv³EOž �B@@ ƒ¥¥År¸±?ƒ-Ò”™€ú\‹ø"3 ö!€ÆW N`3 €À)�x,ú€z†ëØžŸòÖ®!Y¿£ÞóýôR pww6b!ÉÚ讵!€˜ ¨T„×^2Åìö¹ ðãǶIwYl\ ¤ úÍäcËöȳ«kœÍ)^Ð ‚^æUO’ùjñ•ÝÒ5�7ß.U–F¤¢ØxØòõuòÖöF»Ýäx@�, tõËŸþëK²ãÐIÓžè v�¹�àvS&v"€ € ½ÃÜîÈ;OƒÈæã+¶Û;ý¡' €€p÷Ï\ÑSð˜@ÓêŸêˆêW=Ö­Ðvçþö‡vìNu’zÏIC!9‡ î!™h†‰dXàšK§f¸Åð5×Ù7"?{l³ ¾ ~pjøf×Û#Öϸ‡_Ø%¿z‘÷1Þž)k½K¸Ám­É¬õ!•ÅÝnÑ4:ÈÝÍrñTãwÝÎm÷®—±XÜÍ&© @ ��*¸ý“ßxIvn3m…àvSv"€ € pF /7W¶é9ó3²+I$Ènhð¯îþ�;zŽPq0¿ò@7è‚xck“ª5ÏðÔY�ˆ¾·;Å5�Aq®YR €ÀY�+.®:û�Ò&°rû Yòê¾´ÕOÅ\( ³}ÿúù�òÀ²îâgŸ „e‘Ì­ïµà®§´£ßÝ÷âüˆTW¿§=Xß)/cñˆO�è6„L £gHþôë/Êî#í¦#?Ü^@JS'v"€ €  ò‹Kdp8†7F£9�y£+ôðŸîþ›3zŒ(*I<§ºÓá¡.…º+Kß:êñÛ¼ ‰»1ócÉànîÃ^@g—Ì™âìDβ-p÷s{eëÞ¶Ïãì èàöûžÝ!¿^~Ðî©ïa�°¼xÏÓerY�í™p;À]w`äš|²ýÇ·H[× í¾r €@æÚ»‡äO¾þ’ì=fþñzQ¾È»jr„àöÌÍ -!€ €ø[`O=Ÿ‰xeU\Ƴ ë~bþ¦Ç+�¥ €€L.x°·t ð˜Àáew «0á‡=Ö­Ðvçžg÷JOßPhÇowà¹Q^Ø53:>w7#¡Q;lG—@iq¾,œ]®Agq´ß¹o£4·õe±4t�ÿÇÞ}€¹Q� GÚÞ¼Å}‹+.ØØÆ¦›^S ¹á†|@.H¸In I ¡…Œ!`z 4¦›ênƒ±�{Á½¬ëîÚÛ»¤ï̃×Ú•f´*Sþó<òJ3gμçw´ZKzç½Ê÷c¯.“ç?Úèô¡ºn|ny;àQgIŸy\±éùmn©mŒî{¦$¯Jr/èü=mUm“üá_ „‹m™ž.v@â" Ÿ„t™ªÜ¾nkè<=¹ý˜B¯¤P¹=.óÂA@@ì/��“-¥e$¸[e&šØYÚc÷‡‰ �£#€ö ÁÝÞóGô `��3\®ÂXb�PA <üÚjqËåá»:á^oç‰]íÛmûSÁÝm3Îx@�ø œ<ª0~ãHòEiµL~q‰ªøÝJÃк[ ¥Õ'“_X,¯ÌÞân�^?�Á-Ë™ãŠ%9ÉüGÊûë¢/¤ ÊËÀ¡ß×êUÜËPµ,úúôˆD&°fË~ùö¯ß’M¥U!;ÐO`jKnWWì`A@@cé²rKµ±Æ´Š¹€úÔêß2uª/æâ €€ƒÌá` ††D* ‰F÷Hñ¢¼ßªÍdñêÒ(÷êÌî¨à½y夊èYÒ €@{�þEyÒ¯gfû•<Š©ÀôÏvÈ ÓW‹{ÒUcÊéúΫj›äÖ‡æÈó·¹ÞÂÉn:á5+#YNÑÛôtÖ6$ÈÈÍФGvçIî•5Mò»‡æ©—L‡Ì €QX°b·|÷ÿÞ’}ûëCöœ™ª'·{$™äö�NlD@@àH�_ Ÿ�‰’ÀÇ~ŸïéžC#€Ž ÁÝÓÈ @ Ñ^M{^ÅИè88þA�'ßZ…Ü l⦄ƒ$4Cˆ’€ž²wÎñÅQê�nŒ <ñÎ:ycÆF›Ó�¶ï®’›îýX¯¯èp;+�#ð»+{úœK"š¼u±qÔ#täûŸn“7foŠ(fvBˆŽÀ[s7Ë�þ4]jë[Bv¨'·�, ýº²6"€ € àR�ä¤$Y¼!ô•’\J“�akmþÎy­OÈÁ9( à Ü4™ '°uÖý•êè¯%.Ž|¸À; vÈÆm凯â~I^þÐKD«¨à;!€8yT¡Á–4‹¦Àƒ¯®”÷�MS7õõùšÝrý3¤´² lÅàNg €@—žzkµÜpÏ iiõ‡ì'K¯ÜNr{H#6"€ € Й@rz–44ù:ÛÌú8 ¨2OÅù�p¤@èOþ9d…ÄF à‘'cÓ3½F"ðêŒ ‘ìæª}¨à½é¦‚{ô,é @ X Qž”ôÈ ÞÀš˜ ÜóŸ¥2{ñ¶˜‡8G@¯OýæÌõòë‡æK=_(9gbÃŒÄm'¼–ôΖAE¹aT‚7WÕÄ:·1x'ƒk ²4é‘ÝyÖ}Um“üVý^ºì\ƒz4Cb# ¿æÞõÌ"ùÓ£Ÿ„}ýÍIW•Û‹<¢Ÿ´Ä‚ € €f4Y¾¥ÎìN´��@}£/õåØuOÏ €€{HpwÏ\3Rˆ±ÀΙù3Õgö[c|º7(0å�µR¶¿Ö`kw6#Á=zóN‚{ô,é @ X@O×;÷„âà ¬‰‹À_Ÿ^$ WîŒË±8ˆ½ZZ}2ù…ÅòÀ++ì=¢7-à¶ î:й'”Dà$RÕ Ÿ›eP�¤„HŒüpá6™6kclN¯ €íZUµö[&Ζ‡¦.o·¾£úIJ#Uåö$¾±ìˆ‡u € €„ÈÎÉ–½ö£Aœ4y¡|þ=5q:‡A-ÀÇEŽž^‡ñ¸Í¯Ià©ø“£u&Ь¾DyoÁ¦Î6³^ �ཧ�Û*6FOŽž@Œ œ<ªÐhSÚEY@¯<ùÇ)ŸÊçkvG¹gºs’À®}5ò뉳äõy[�4,ÆbPÀ�ïÎ=Ñ|‚»Î¹¿.v îzÕßÁ½BÜýÇGÈÞýõg–f €‘Ô7¶ÊÕûP^1p…ÍÞÝ4ÖÇ#žÎ/ÂIìƒ € €€«¶–µºj¼V¬&þG¬#ñ!€vý‰¿]FAœ €€Eü�d=Á=FÜ¶È mÆý/®”úÆEßP½^¾9Š–8Ü£%I? €� ô/Ê“’™�mf}Œô¿õ¿yx¾ÌX¸%ÆG¢{» Ô~²Y®ùûG²rë»…O¼QПn[Æ ï%yÙ©¦‡½¿6¶Vù™šôÌîü½nu]³üvòb/PUÛ$b�ÜõÜçÒØâ‹ý9‚eÜXÁÝ£irÖñæÿ.5«_•ÚÆØ¾†TÉ’)I�?]>úl»¡ªÂ�÷À@�Ž¶ï©‘Ký–,ßPÖÑævëôÄöâ|RÛÛ¡ð@@�ª½œÈ�[ÌvÑ„êí1Ã¥cp£ înœuÆŒ1Ð$ðpL@ç¦|e•¸1ÙÀ îF”ŒµiõqácR´BèŠÀÉ£ »²;ûFI`Ê›käá—–ÿ£jÓn–­Û#×Þñ�ÌXºÛ¦# ìh ø]zÒËù'õ�ˆ±¢.¶ îIêo=q2Ôòç)ŸÈîòºPM؆ `B`Õ¦ ùö¯Þ”-»ªBîåQ9íG÷õHïn$·‡„b# € €RS’eñ†j-i'�ê&i}1NÇâ0 €€+BÔ²qÅø$ u�s >*šP±QDõÎéдÀò�òùš�rÜÈ"Óû:}�þ�KTZT‚{}cKTú¢@ÀJI^U5Ùk¥�\Kÿ¢<)é‘)ÛËHÈKôáµ¹[¥¼ªQ~sÕ‰’ž–œèp8~šš[åÙ·WÉ «·|,|)àÖ“ªÏ<®H2Ò’Ô{¡VSÏ…òÚ€ô+0µ‹éÆù™šôÌÑd_uÇÉô5uÍrýÝ3dê�K’žÏ‚ ±ÀŒÅ;äõšZÛú³±$õÖROnÏIã3Ɉ±Ù@@�Ã’3¤¥µñð5ÜO¤€&Ï–Íz¸6‘!pl@Ài$¸;mFX@à6¿&7ýK}…zŸ‚!%ðÔÛkIpïà™@÷P"\µ÷@£|ó߈povC¬+pÍ7†Ëåްn€.‹LO9÷„byâ�u.¹5‡;gÅ©˜4[þ|í)R�›aÍ ‰*ª«7î“I/-•�»j¢Ú/�Ù_À­ îi)Iræ¸bygþS“ØÐ,Rß�Œ”Ø&8ìá‘ÊzŸ¨óR:\¯Ý+w<õ™üùš“:ÜÎJ@�ÐúLþõêr¹ë™Eîb&©êÛÈ…^õÚºO¶"€ € €€1�Ç#Ÿo"—Ú˜VœZùý�ÆéHp�åi\3Õ â)hö>­ŽÇ©²ñDq¬7çm“�ÛËC´pç&¯ªÊË‚ €@(¸,…P;³-&'�*ŒI¿t™Àêm•ríß?’%kvGÖ{ÙBà@uƒüóÙÏ䦉sHn·ÅŒÅ?H7ÿ½¼ø´�—×t\Y=¢Î:ÙI/Ì~TÏÐï{c•¼5ws'=°@ 3�FuöÐM÷Í”;ŸŸÜ®ŸÐ4º˜äöÎ,Y� € €@$™YÙr FU`±„€Ðæ—Ι¼ÒÁ à �Пð;h  ˆ§@é'÷«¯j_ˆç19Vh�i37„nà­^-¶Õò\HÊ�@Ç øü±O>sZŒ4 0WJzdÆø(toF ²®Y~óÐ|yêõåêr°>3»ÒÖâ>Ÿ_Þ�»A®úËûòΧÛ--á%RÀ­Üuó³�/½’»Ù¥NßÃìá½zpgK]cKÛÕ8ôŸ, €¡–¬Û'ýâuY±!üÕ2»gi2¢Ð#ú5X@@@ zÙÙYêJ“|=Ñ.÷´?Iª^ér/t€ $ÀÇJA$¬@¢#°cÖäÅ"šº±XA ¹Õ/ïÏç²ã‡Ï…‡÷Ã9¸� Ð� î X`ÕÉ£‹,!t$°jk¥\{ç‡2ïóíÂõ:²þºªšFyèÅÅrý½³díö*ëL„–ðû-F‚¸øÔ»¢6>¯”^õ øð>Ñv¶lTÜ3ižâRga°°´ÀË­—ïÿöm)¯lgß\M†ª×^>~ KE@@L ”×u~"¿éÎØ¡Ë-ðÔÖYO7v¹#:@ñ±~P[V €˜Ð$@w“f±l>ñ¥Ò@E¶¯ˆ©àþw@:psEÚNH,±ºa®Œ;ªÀ±D°@}“OþüÄgrß3 eUøäŸàX“�ZUJúÅé«åÊ?M—׿nMDÓÆnÿ{yÞ‰ý$%ÙkzËã”à®–ž"rT¯Ð…¿9g“<ýöjÓã`@Àé­>¿Ü6åSùßûçH‹*"jQœ’Á==¢_=ƒ”›PRlC@@ 2�´´TYº‘‘éÅh¯Vÿ”õL· €€ëBªïz@�® øj_R=èZ/ì-�½eî’­ÑêÎöýPÁÝöSÈ@�˜ PÁ=æÄ@OùÞ9C"Ú—�â'0ý³rÕ_Þ“·çlŸJ b±¦€~ì«­“©ÄöÇÞ^+ Í>kJT–pûßˬŒd9}L_ÓsT×�†Ó»E¼C÷,M óB§[ÞþøBY²n_ÄÇ`G@Ài•5Mòã?¿/O¼¹*ìÐôs�Ž)ôHïn¡_kÃvD@@èTÀçI“V— ë(ÞòñÎy­�÷a9 àÜÝ2ÓŒ"°kÉ”zõÖâ©„œƒv(0ù••ê’ã¼áÓq¨àÞáS„• €‡ øüüÍ<ŒÃRwÇÝWJzdZ*&‚ Ы¹O|i¹üüž�díæòà¬I˜@cs«¼9k}[bûÃÓVIM<³l6j+�/åâSDÄ[Ç*îz€ý <’“Þyâ¥^¥øgw~,å•\�#¢ e'p”À†í•ò�[Þ�¹Ëv†Wfª&cJ¼!_cÃvB@@)àõzeñ†š�mØ_�€'ðH|�ÈÑ@w �àî®ùf´ �- ü‡6î�ré†ý²duø/e:ÛßIë©àî¤Ùd, €@lHp��k4zÕOT»ü\ª¸GÃ2}|QZ-7Þ7K&=¿H*«ãqHŽÑ‰@s‹OÞ›·Q®úóty`ê ©¬kî¤%«;8gœù*Ýõã´u~N¢–óOî/ÉIæ?j.¯‰ïÉtšÊmÖÛ#z•áΖ=urã½3…ÿu&ÄzpƒÀ‡Ÿm—oýï²mwuØáêWÈUä‘Ô¤°Mi€ € €]HÏÌ’šú8^¯ ±ºd×=½kšÞpÉX& �óß:$$LŠØW tΤ *úì;çEþÌ»k�7¨FD÷ÐØp™€ŸŠ´–žññÇõ“œŒdKÇHpíÞ˜¿M®úË{òâ{«¥¦®©ýFÅT ¢²^^œ¾Z~xë;rï ˤ¼³àC sä‡mv7W´çï¥HNfŠœ2Êü µMiŒó÷²)*sX�t^Ç]dþò]rßsK\ñüe� €Àáú9[“§.—Ÿþõ©5p…›~êÊúkª—ogä> € €1X³�â)1��°Ó€&O,Y2%ΟlE,»!€6à#'›Na#€€½4�Ú(?üÓtyø¥%²qû~‰-cë;…‹0 Œu»gÞ\!?¼õ¹ý©E²z[e¸ÝØn@ ° C®¸hd[K�F"[Gdü½<¨’—�*'�ìÝQÈu5�ij Ù$f�êå=Q³³¥U½F_ó·eõf®×™ë@ÀÞúI;´L¾ÿÛwdOEøÏJs34S알þO`ï™'z@@; defÈÊ-Õv Ùñ±<òˆãÉ@ �àn�I p‡€×Óú„i‹;FkýQ6©Š™ïÍw÷¥Æ½¾ˆ²þ3•@�Ä øTIì ;ú·&e¬!­,- '½:g‹\w÷ ¹þïÈÛ³7Heu£¥cNtpú‰ÛvUÊóï®’ÿ¾mz›Ý¿ß_/j›š£ŽËÇJzjRÛ˜8I¶ã©%Áýk—‹Nðõ÷*TÅ=I}:>¼�GB½=®mh‘ÿúó{Rº·ÆÄˆhŠX_ ì@ƒüןޓ{ž],F®FÒ7W“}=êjÖ"€ € à$�ý�^®Pi© ìØÙc×tK…D0 €€CHpwèÄ2,°žÀÖYïQ ¯Z/2÷F4ñÅÒØäÞsHNqïsŸ‘#€Fô„[ë ô/Ì•“�îiý@‰Ð°Àú�Õ2ñååò½ß¿-w<>_>[µSZTai«n¿soµ¼òáZ¹îoïËÕw|$O¼³NJËëá‰�À·Né'c†}]‘› î#I ìxOç­½ðäþÉÉÔå Jp×g 3U½’{¨EOý‘Jr?PÓªÛ@ÛÌ]¶SÎûùk¢ÿ ·èpÑ_'öðs §Åv@@¢+�žž*Ÿo¨Šn§ôÖ%õ¾hŠL�êëR'ìŒ `Hà`ù%CMi„ ÐU�ˆvyWûaÿèì=Ð(s–l“óN�mÖ î6›0ÂE @EÚ GxÈïž5D>Y³/½ÙͪuŽÉŒ¥»ÛnyY)2aL_7¼—ŒÜSr²R­vÔ㪭o–u[Êeùú}²põ^Ù´›*ÊQGî Ãüì¹ú’Qí¶h¡Ê\·ké®ü½üz¾»ç¦ËñG÷–OWíþz¥�{Õ inIIЧÕ=²5ilñȶŠÎO&ÚTZ%ÿý—÷åÅ;.úꪆF@ÀR­>¿üóùÏeòËË U€Ô/â2T]é"'�+AZj" @@À5M�4iõQÜÃBîóø¼OX(BA-� ¯ mÊà@�NvÌ~p^Ñ„›V©#;mƸ Lzy¥œ}Ò@Ua.tµ¶¸§ƒERU/N¡q@‹PÁÝ"a ŒÑÃzÉà¾Ù²q‰¿¸lÙä@m³¼>okÛMÀèAùròÈÞ2zh/TœQÅd«B4·ødö Y±¡L­Ý+Ë7í·j¨ŽŽë—+Ù™íO¤ ‚{ÇSN‚{{—‹O`:Á]ï¡BUqï“›¸Êâ|M%Ùk²»ªó+Ø|¾nŸÜpÏL™òû³%Éë¾ÏÚÏ4�@Àn»ËëÚ^íÙc(ôüLM†¨ÊíI^CÍi„ € €QHIN–_P½=ʬ]ë. ¯o›{¿¹Ê];"{#€® ÁÝÕÓÏà@ í`÷‡plÙ�Àò�²pÅ9eL¿¶:{É)Ξ_F‡DCÀçë<Á+ýÓGôô¿ë?8gˆüýßK¢×)=YZ@Oú>˜ø½Fr2’夣{Ê�’<P˜+%}ºI^·tI\š¨q:=™}×¾Ù¶»J¶îª’õÛ¨KîV¨$ÓΫ(ï�–‘ œ9¦�œrlqÐî.Û.¿œ8[*kšÂÆ«¿¶ è <é(l�4@@@ÀZJ†46SüÃJSí÷±R<Ä‚8]€w§Ï0ãCË 4´¦?—–Ôx� ,ËrÁ¹4 ‡¦®”“G÷sÝÓßÄ»ô)ϰ@ÃT¤5Le‰†§�-‘üi+eM³%â!ˆø T×·È‹w¶Ýµ 'UFöÏ“£Ú’Þ»IQ¯ÉÏI—ôôä„$¾76·Jeu£”¨oKfß\Z)ë¶� ꪼ֚5küÌVÏ‘ÿùþ±>O8I¶ã9â9ÜÞ¥g~†ŒÞS­ÙÛ~C˜GU Qç¼Hr+ëï’‡ööȪ�~©Vñt¶üç½uÒ» S~qű�5a= ` �uÒà�O/’Ç^_i(ž´d‘aêu0+�Ï �Ñ@@� x½^Y¼¡:F½Ómd��»f̈l_öBˆD€÷HÔØè‚@ùü{j 'ÜôoõÁõ]è†]£(0gùY¶n§;¼0нZ¿+Ü­?GDˆ$ZÀçï<±+ѱqü`�•øƒ³Ë#o¬ ÞÈ× TT7Éì{Ún‡>#Õ+EÝ3Ubf†ôÌK—yR ª½çå¤IjŠW’“¼¢?—þô´ýLV�S’<¢ŸÚ¢²O[Z}ÒÜâW·C÷¿þYUÛ$• R®nûT2ûžŠÙYQ'Uu-‡‡Á} üß�“‚ÜŒ#ä=D‡,¦+•wÜ‹³Ö^têÓ îº€^9½w·Ä&Uêç‚ÝÇ#+J}R✱ûþ³Dz©dþ+Îê¬Éc4 à�m»«å†{fÊò e†ÆÔ=K“Á½<¢ÿ·�@@+�–‘¥>S¥z{bg¡ýÑ5M{Tä6.=Úž…G €@LHp�)/�#€ ¨/Kÿ¥®`N‚{Ç< Yûè´UòˆËܽTpOÈs�ƒ"€v "­�fë`¬Ÿ~”L�¹Iôäf:¨oòÉú�Õm·Ž¶³ÎÝß9½¿œ4º¨SÜ;¦ñù8!ìH™‹U‚û__h:ù¿Ü îúXÔ¹>2¢Ð+Ëw¨zZ�Ý×�;yž:I(MÎ;©ß×+¹‡$XÀ¯>xþ÷;kåïO}& M!^ľŒSÿˆp`OÂO0J0‡G@@À2*‘Z–o©³L<Ò&Ðì“ä§Ûîñ €@ܨÃ7j„|-°cÖ¤UêÑœ¯×p/Ñï,Ø!k7™»|z¢cîêñINéª û#€Î ‚»ýæ8#=Y®ÿÎ1ö œˆ@ á{gÉÕ—Ž‘Pµ³=êË5–`=‘�¥½@u¥ˆÑCz´_iàQU}@ÔÅ!,±¤ªÒ0#ú†®d¬Ïýuw~,ïÎßb‰˜ ؾ§F.ûÝ»òÇGJnOO]Lr;Ï@@¬$�•�-{PÄÆJs¢>4�ºkÖ}å–Š‰`@�àî‚Ifˆ `M- =lÍÈÜÕSo¯qÕà©àîªéf° €@D>ö"rKôNã�ë'£æ%: Ž�6Ðßüþ''JºžÑbѸ T‡:\ñ¤C¹è”þo±V?U`�uNÈLÕd¸JrunG«Ï/×ß=C¦ÍÚbdlBb+p°jû9÷ÆWåÓU» ¬WŽ&cн¢¿Ö± € € €€uÖí$¹Ý:³ñe$¾À$ËÅD@ €€ HpwÁ$3D°¦@NEÞ4õ•­»J†[s*¾Šê¥�7Éæ_=vúª/:}† Ðu¿Ï: f]�{zÐÿÆ_ÿýcÝ3`FŠ]øù÷Ž‘EáOŒÑ/�Ì,@‚{°‰¾æâÓ„L ïx/‘òkýÿ£[º&C{‡þ]¿êÍÍ÷Í’?ø¢³a±ˆ™@éÞ¹âïÊþµ@ê[ÃÇ«^Ò†ôòÈQê¦ßgA@@ëäädË–=õÖ ˆHt�OKç>ø €ñ࣫ø›sD@ M`õêÛšÕeŒ‡Ã:~¿È .ú2ÚCõEë<ùˆ°¨€ž¬ÅbO�Á%ùrééýíÙö#@�¨ \yÎ`;¼�é~Ip&#Á=ØäК¢žY2nx¯C ÿ¬¬H³E¯w§WqÐ=üÇê÷>·Dîù÷b¾˜6<ë4D�p;ËjåÊ?M—ßNžgªjû±%^ÉIŠpÇg; € €ÄN ##M>ßàŽ+ÍÇN1ê=7J’oJÔ{¥C@Ãá?‰7Ü @"(�ùÀBµß‚HöeŸØ4©oÑßœµ!6�[¨W*¸[h2°¨€ÏG©‹N�á°’“�u[÷·�ó‹Î’òÊC‡ª¶î骶"£ € €–HIË’Ú®øf©IÙ´kvÁ;‹‰p@W �àîÊigÐ `E�� ¬V_Û>fÅØÜÓ?þ³L]Ì™o(=*:¹ù¹ÍØ@#T¤5¢dŸ6i*ûåÆï�²OÀDŠQ8~HwùÉ%£%ïHpž܃MŽ\“šâ• Oîäê°�%€F{$¹çgj2¢¯G½ÕÞ·¿¾-�õ�ٛŽŸ à�ÚúùËcŸÊ7M“Ekö4UÛ SÑ@@K hêrpK7×Z26w˜$r Üý$`ô `Ü-2„�èÉšçAõƒÿ([èé°ew­Ì^¼ÕBE/*¸GÏ’ž@§ ø|öH(sª,ÆuÒ˜bùæÉ%±èš>@À¢}òÓå·WŸ$ÉIÑù�÷à‰öø{¬¼æÒ3¯4°fŸMª¸ëCÉÍPIî…á«(75ûäÆ{gÊ=Ï.ž?ž4AÀ¡úŸ�i³6Êøë^–ÇßX%FO0NSÄÐ_k¨ÚîÐ'ÃB@p�@VvŽ”U5¹f¼6hMZ£øÒ2¹öŽ�¤N/UÏ‚®øbÛùþïÞ–›þ1KÊ4»~…ˆ’|MÆöóJž:¡†@@ì-°zG£½àÄè5yrã«�84Æ„ØQ€w;Î1#€€£üZàŸŽ  ·jóùdùvF:dÜCû°@@ WÄÊ^ªäã®>Qø¿€½æ�hˆDàw?>NåE²k§ûðÚLã÷SÁ=X%x�~±o�¼!ÌšŸHe½½Œ³Ó4Sâ•ÌÔð ¨ïºM.ýÕ[Rº�K’‡y*°GÔ6´È_ŸX(çÿü5Y¸j�á1åeLl/)ðˆžè΂ € €öÈÎÉ‘íûêí=çEÐ<��7,F„ØW€wûΑ#€€CvÎzðS54ýÆb!�§®´UÅ8#tzr  €¡Zýλ‚I¨ñºiÛ â|¹ñ;#Ý4dÆŠ€ë~zñ09}lIÔÇíõðq⑨$¸)ÒùãKÏÜùÆ[ö©*îv[R“DFy¤ +ü{ïµ[÷Ë7~ùº,Zc<ÙÕnÄ‹€ÛZ[ýòìôµ2þÚ—eÊ´•†O&Ö_K†÷ñȈ¾Q穲 € € €€C6ìæjnV›Jõ ÎÛ;f<¸Éjq àf¾‘róì3v°¬@@4ª¸[lv¬Ü+Ÿ¯)µXT] ‡Ê‹]óco@À •Kf¿t27ÌLtÆøÍ3†È©#{E§3zAK |wü¹âÂ1‰ÉKÙØ W܃L:[qÌàî2¨¨[g›;]_QPÉ �n¶ì¯úô]OL-Οä^QÕ(?øý»òÒ‡ë-;Cóú{ª·çm‘³®U~ÿÐ|);Ð`¨½.…þÚ1®¿×Љ2†:¥ € €XB ''[6îâJn–˜ŒÃ‚ðü÷ö�» € ÁÝ“@ €À‘;µ¼ijݶ#×ó8±�L[•Ø¢|tÜ£ Jw €€C$í9tfEô«¹üòÊã$?;űcd`¸Qàœ±}åºï�-FWlòxÃ'êºÍ� îæf<’*îúGö×Ù÷´»~ÖÛ£þö†¶Ò+<ÿê�9ró}³¤¦®9tc¶"€€åæ/ß%߸åuùŸ»>–-»ª Ç››¡Éدè¯á^7 wJC@@°ŒÀƽ­–‰…@¾XµsÎä™_=â €€%Hp·Ä4 p„À¬ÛZÕwž“ŽXËà ¼÷i©¬ÞèœË…ëIm, €„ðë%Y+�—“.·_{²P‘Ù±SÌÀ\&pü�îrË�Óßé$2킞UªºSÐ:Vt. '¸Gòvt_�½ÿOÒ=[“QEIIêÜæÐ–×fn”so|M®rÎg‡ÆÆOÜ °jS…\ùÇérùÞ•Ê 9U½>èW}Yè‘tÎA5ìFC@@ì$ Wo__JõvËÍ™&¨˜ìýá“åP èº î]7¤@ &ÉÉ�O¨ŽkbÒ9�F,ðÄ›k"Þ×j;’Èfµ!@ÀšT¥µæ¼D3ªá{È®:.š]Ò$@`hQŽÜzÍ)’j${¶ ñq%¨`<Ÿ�ツU:_SÒ;[ŽÚ³ó�l©TÜ[|�l´Éê¬4MÆ{EÿnÙYV+ßÿÝÛr÷3‹¤EUvgAë lÛ]-7Ü3S.¼yšÌYºÓpÀúI?Eùªj{?¯d…}0Ü1 @@@Àr›÷Q½Ýr“"R!MÞÿX0.BB\/@‚»ëŸ €€U64¥J hz’;‹…¦ÎØ,·¯¼d¡ÐƒB!1%ˆ„ €PÁ½®šp\?ùéÅÃ82†„€;ŠºgÈß®?]²2b_î•eƒŸS>? îÁ*¡×èUÜÍ.ºr¹Í«¸ëcÖÏAÑ+¹÷PÝÃ-ú…t&O].ßþß7ecie¸ælG� ”W6È­�,�3~öм9g“©(r3Tb{‰WúxÔXLíJc@@°™@Nv¶¬ÛAõv«M›ú„fJé'¬ñ €ˆðqÏ@ÀÂñMRáQ¦ËbsôÔ[«-Qdáx"¹&|d‡b/@ HÚ³ñì™ ýò GÈ'™Û‰Ö �p�üì¹ëÆÓ%¿[z\b!Á=˜™«�›„[óÍÓJR’ù�¦÷9 Á]·ñ¨oN‡öö´%´†³Ò·¯ÜT.Þôº<ûîZÑ“ÞY@Àµõ-rß–È©ÿï%yæí5Òê3þ1®~NÚð¾Yè‘ôØŸŸf 0¢@@@Àå[Êm~i:gÎ_«_ <ìÌ¡1*@Àþæ¿E°ÿ˜ `�ms&oQÁ¾f›€]èslpDwMÿF�@�0T¥ ä ÍúÉo7]qœŒ”ï Q1œ-�‘ê•»n8]úôÈŽÛ@¹T05+ƒM­)è–&ãdžk´½¦1 �-A«m»¢(_“£U‚k’7ü›[å÷Ï—ŸÜþ¾èÕ¢Y@ qúïão®jKl¿ÿ…¥Rߨj8˜Tu‡£zyäØ~^)Èä³9Ãp4D@@ÀæÙÙY²v{�ÍGá¼ðU�WvÎz°Ôy#cD €€3HpwÆ<2 p°€*š:ÑÁóåÐüªÓão¬´eì‡MbÊáÜGèL @™ÐÎh¹>5%IþxÍ)RX�áÈñ1(œ$�ìõÈ?;EçÅuX¼�概{°‰‘5—ž1ØH³ 6N©â~h`ù*Ául‰Wò2Œ%º~¼h‡œsëòágÛuÁOˆ“@M]³Lžº\N¾ú%¹mʧ²¿ºÑð‘õ‹V èî‘qý½Ò+Gc¿ñ†»§! € €X\`û~ãW|²øPœžxÀYb4 €€³HpwÖ|2p À®9“>‘€,tàÐl=¤ÿ|°IÖo-³õô*­, €„ i/œ�ó¶çf§É]7ž.=Tu]°¦@j²Gî¹áT5¤WÜôr%¨ s*¸‘ZqþÉý$3-ÙPÛÕÕ8ï au~™Œ(ôÈÀ1ò+VQÕ(Wßþ�üî¡y¢'ܲ €@lô«&ÜýÌ"9á'/´ý4sýwº(O“ãx¥Pý4ò;ÛÑÐ; € €Ä[@¯Þ¾fÕÛãínàxŸ©êíŸhG@� �àž x‹˜¨š>Tq7¯¦�½nï*îþ¯§ ÇAl-à§‚»­ç/ÒàûöÌ–ûn/ÝsR#í‚ý@ Fé)^¹÷ÆÓdÔÐø'·ëC¢‚{ðÄr2X°‰‘5é©IrÞIýŒ4mצAås×6ª H;p雫ɘ�d¦;!ý¹éëdüuSå•„ÿ³9ð Á�.Pº¯VþøÈ9éêÛ*·×Ö·ŽIÿ-îÝM%¶«ŠíýUåv½‚;  € €¸S`ç�€ðU‹ç> Q½Ý‚ÓBH €Àá|¤v¸÷@‹ ìð佪BÛnÑð\Ö‹m–u›÷ÙvüTp·íÔ8 W¿óФÆÕÏÎ+ì•£’Ü'H~vŠ�‡Aì8J 3-IþqÓé2bpÏ„�‹ îÁôTp61ºæÒ3mڮݾg&¸ëƒÌHÑdt±§­âs»Awò@¯$ýËΖïþæmYµ©¢“V¬F3vT¶ý^�~ÍËòôÛk¤©Ùgfwéž¥ÉØ~^ÜÓ#úX@@@À½YY™²rkµ{¬;ò]Ý*ò^±nxD†   �àÎó°ƒÀ¬ÛZµ€6É¡º-Æ)Óì[Å�Ê‹n{¶2^@ 2ª�Fææ”½ŠzLrÏË"ÉÝ)sÊ8ì+��ž,ÿTWV6 {BáÑø8ñÈ ðQ‚ëHÃ�Ç�-’î¹é†ÛjX®Ü�›â®>´W¥ŸõŠÏÇyDº7´,^»W.úÅ4ùýCóå@M“¡}h„í–o(“kîøHξþ•¶+#´úÌ�íÛ-ýà *Ãúx$�ÿ>·Çå € €.Ø­rÛùèÈ‚“¯i®^}›ºN  €€•øFÊʳCl €ÀaÉ) �«‡µ‡­â®¦ÎÜ"k7íµ@$æC ‚»y3ö@Ü(ð;9}Ì�3j~Ì%}º©Jîã%7“,ózì�@tôß¿‰¿/ƒKò£ÓazñzUæ-K;¿�¿•í@L<Яð�Ó˜Øã`S½˜rU½óÝõdÙcUèÙÆ~ïô/ÌŸ�¾VÆ_û²<7}�puÓO-vp¡€þ{3ù.ùá­Óå¿|CÞûd«éä“ÌTMF<)%;ÍØï« ©2 € €®ÈÊÊ�›©ÞnÁ‰¯Ií ÆEH €G�à~@« lþhJ•hò„Uãss\�¼fÏ*îTpwó³–±#€Æ¨ànÜÊÉ-ûõÍmKrï–™ìäa26,)�Ÿ­’Û9AåY">=!™¥½@«ß\…ßö{óèÒ3G„°OUqwÃ’¤>ÁÚÛÓvóü4¿RUpÿÝCóä›*Ywɺ}n`bŒ˜hiõË[s7Ë·õ¦\þ‡weî²�¦ûГÙ�îë‘cK<’—ÁßGÓ€ì€ € €€ÃöÕxLŸ@ëpk / �n�u¥5‚! @�P?ÕÛ@â%àiõNRÇrÇ7¸ñB�Âq^›½UVoÜ…žâÛ îñõæh €€]üTp·ëÔE=îþ…¹2éϔ‚Œ¨÷M‡ б@�ni*¹ý ѯ¤`•…÷Á3ÁßÊ`3kÆë)ýûä˜Ù¥­mEm@Üôß½ŠûXUÍÝLíÊMår‰JÞ½eâl);Ð`Ú˜p¢À®ò:¹÷¹%r¿ ×ß=C–~aþ$ý÷ð˜"�Œ.öH~&‰íN|ž0&@@º*�™™!K7Uuµö�¾@‹$yï�~·ôˆ  Üc¡JŸ €@Œ¶Ï›¸YD›£îé¶ ¿b¿*î�/àº0å슸F€ î®™jC-ê•#üêLÙ?×P{!€@ä%=2Û*·ë¿wVZx<>7eY?*k¾wöQ¦ûñ©Âùz’»›–Ô$‘…®*F§™¸¨ÊÔ�7Èøë^–G^]!õ�­n"c¬´ èïiæ,Ý)?ýÛ‡ròO^”I/.•òJó'}tÏÒdŒªÖ®ÿvKçs5ž^ € € й@YÕÛ;×IÜõIÒs¥3&š¿„WâBæÈ €€«Hpwõô3x°£€úBæ>;Æíô˜ßœ·MV®ßm«aRyÑVÓE° €@¨J›0zË8/']îºé ™0ª·ec$0ì.0ÿWgIŸÙ– ï#‚§„÷`³k~pÎñzÌ'‹î©rW‚û!×U1Z¯æ^Rà£lµõ-rÇSŸÉÉW¿(M].µ -‡ºã'Ž8PÓ$S¦­”ñ×N•+ÿ8]>øt›ºòƒ¹× ½>D¯MƩ߹a}<’•jþµÊ±À @@:h«Þ¾‘êíâ$xeRÀso‚Càð €&Hp7�ES@À »æLZ â˜k…Xˆ¡½ÀC¯¬h¿Ââ�4*¸[|†°† îÖ˜«E‘®JÈþáÿ�"ß›0Àj¡¶¸ø¤bùÛ ã¥[Vª%ÇI²%Å |>sÉ’Q<´cºêÓ=SNShz*±½o®G’½‡mà. € € `@ 33],§z»ª¸7 ´»ã~Pˆ Ð%÷~òß%6vF+P:{ò{*‚e‰�‚£w$0yª}ª¸{¨àÞѲ@à*¸ÂÃvz½Øïž3LþòÓ$5™�ÚáðzUô?_}¼\~ÁK'·ëCâ}DðÄ’àlÉš Nê'ù9i¦wÝW­êo™ÞËy;äe¨jî%^éßÝ#ê4Ë^Áýþ–¶Ut¿[Uv×+¼³ `½"âò eòç)ŸÈq?~^~=inÄÉí)ª”þûsüoÛI3$·ÛåY@œ € €XKà@C’P8ÈZs¢G£Þ>ÎÛ5gÒëEFD €¡¨àJ‡m €€uê œ;U~òKÖ Ñ�‘½÷i©,]»KŽný*îT^tçs”Q#€fø Ö¬˜;ÛŸ6¶DéÓMþúø'²yO­;5 tËL–;~vŠ Ø#Ââ»ï#‚½Ip6‰dM’*›|ɃäÉ7W›Ú]m–JU½\Oðvû¢ŸÇ^”§IÏl¯l)÷KY�ñÔÿÚ†™�Äf@ÀÊÝ*òž­ê¾ÿ/*FkgR[1F±Mzq¹<ý—ˆ*ÏÅ(¤ nIp"a €@$(w€Âª�š¦ÉE§–Á%yrûãŸÊîý !Û³· ¨_ùŸKFÊ¥g µe5tÞG?c[}Æ“†ƒ÷fÍ‘W¨*îfÜõ¤×²š@[Eæ#ûã±H^†Öv«ÔÝ÷¤ºÁÜsvÑš½¢ßôŠîß=s°\©’݇©“Xˆ…@CS«|ôÙv•Ô¾If,Þ!­­]ËAÐÏËê®ÚûtÓ$Ûä b1>úD@@g Ô4' ŸYrnw政¹jرŒÅ }gg¦È…§ô—i³6šN]S@j’E…æ°nÝÒU’{¡ÖVÉ}‡ªè~@Uv7»,ýbŸè·Û¦|"—ªªî?<˜ŒÄGSfÝÜ~ûžš¶ í/Ú. VìýŠh,ù™ªZ{îÁ«D£?ú@@@ TÔ' Ÿ…SJÄv­ªÁ—:%Gæ˜ €Ñ Á=:Žô‚$L`ïÿ¨+žpÓê«ÈÛîP`ÎÒ=²hÕ9á˜â·'z%ù퉞Ž�ØCÀ0Ÿðd�‘e¼ô*ÕgŸ4@F é)“^X" Öì‹×¡9–ÐóÁoüÎ1ò­3‡ˆ’Ã=¼‘z^µúÍUê€A—�;Ät‚»ÞÉÞj܃0C¬ÈQ‰î#T¢{�:1@Otß_gþÿ}µ -mÝõªî£Žê.ßQÉîçŸØOŠze‡82›Ü( _Ið³5{EOhŸ±h‡l,­ŒC¶:±E¯ÒÞ]ÝR¸nqÔ\é@@ deeÊüeÑ{þˆ´0* Iàáòù÷ÔmO;@ë �àn½9!"@À´€æk™ð&ÿFí˜ezgvˆ©Àý/,—ÿŒÔ«¸[¯Z:‰)1�z:G#à§*­cæ2Ñ鑟)¹þtùøÓ-òÀËË¥¡9:U:=.Ž�@(�>ùéòÇŸž(CûwÕÌVÛx<]ú¹`zZ°õÞõÇj—5§Žî+%½³E¯ðlf)« È€¢N&1³mõäà£ûjR«ªàë‰îµæÝuÅÊÛn·MùTŽ�/çŸÜ_ÎSÉî#XöêvÌ~lÊ+¾¬Ò¾Cæ,-•Úú–¨0=E¤g¶§-±=-9jÝÒ € € `J`W•ú\(²·Ñ¦ŽCcÓMIIÚ¦÷b@K �àn©é @ 2�íóþu hÂÍÿRo�~Yì+�¹+öÈÂ;ä¤Ñ%±:DÄý:¡zdăgG@ÃTp7LECúÿ?Î=y`[5÷ž_" וØ‹&ØSàÌ1}äæ'Ù™©ö@'Q“àÞ1L@�¦‘UÝ1N„kpÎùÇsKLí­ D·%g땜YÌ d¥j2¼�&M­«áï­ò·Ý7ߓȚ-ûÛnŸÿ\ {dÉy'õ“óÕíĽ%)ÉI—ìcŸz-\µ©\UißÑV©]?é!šKŠúFKÿýÖoúó•@@H¤@vv–Ì_ª2ÜY,'  >½åãöZ.0B0%@‚»).#€Öðúµ‰>Oà&¡³²'¬Kn8²ûž_&/S,VK!ùÂðÒpµÜ]=ý1|¯‚,ùÛ�ãåƒù›ä¡×VJ}ÕÜc†MÇqÈÍL‘_\6FNWâÈŠÞœ(ÛñSJ?!ÌãÈïx¼ñX«'¸ëÉÑz¬™eOU -ùÕÌ>´m/�ª¾5(Éפ8ß+•uÙS�ýªª»¹™øºÏ�eµòÔ[«Ûn9ê5òœJÚÞ'Œ-’¬tJo-e¿{õ�­²l}™,^³G>[³W–¬ÛÕ*íºˆ~>D÷/“Ú»¥“Ôn¿g #€ € à\�-e~ª·[szªÅ}Ö �¨@Ì�ànF‹¶ €€…¶Í½wñ7?®³p˜® íÓÕûäÓÛå”1ý,5~uÖ²¥â!@k èiYˆ…€ž${Áiƒå„c åÙ·WÉ› ¶Åâ0ô‰@\.>©X~zÉhé–�×ãÆó`V;q7žcu¬¶¼¡Z°Í¬@Ÿî™rÚ˜B™ýy©©]«ÒØ"’FÞ´)·ŽëŸäejm·æCUÝ«ým¾µ7²®º®Y^›¹±í–’ì•ÓF÷•3�+–ã†÷’aýó$ÉKuw#މjSv A©döÅk÷Êg«÷ÊêÍÒêS—Nˆò¢_#?K“ž*±=/C>Š20Ý!€ € €@—rr²eÞ†Ê.÷C1xµtΤ 1é™N@â*@‚{\¹9 [­ÕsOÀë»F…ocKmº÷{Ÿ[*¯¨*î^ }Q«Q­'§P™×ôt² à*òÛ]5Ý l~·t¹ùÊãåüSÈÃS—Éêm|)��‰à ]蓟.·\1VÆݧKýØagÜ;ž%½‚;Kô.;wˆéw=н* »_�DsFRÔ7 Ňªº×«ªîªR~…ªîÞ•§~s‹Of,ÞÑvÓcÍTg%;´‡wt/9þèÒתX@IDATÞ2vhOÉÊàL…hΣ™¾ô¹ÝXZ©ª³ïmKj×+´oÛ]m¦ SmÕùm'Säë'U¨¤v }„fj4F@@w¬ÛÕìŽ�Úp”ê4é{l6!#€t @‚{(¬Bì*°}ÞÄÍEnzQÅÿC»ŽÁ©q/^W.³o‘³Od©!&{5i"sÑRsB0 €€Õ8Êj3âÜx† è.÷ÿêl™ñÙù×k«¤RUxeAÀ—Ÿ=H®¼h¤d¸¤\´W/«Ë$ÀO‚H¢²â‚“ûK^vª¨i2Õ߾ꀔˆðl5Åf¸q®J>Öo*?]�L '»w­ªû¡שÒûó–ïj»éëô«½èUÝ�SÉîÇ ï)Ç«*ï…=³©æ},Š?[[ý²yW•|±í€¬S·5ª2ûU¥ÝìïžÙ�²Ò4ÉÏ8˜Øž­î³ € € €vÈÉÉQÕÛØ!T7Æ8sÇì¹qàŒp¢ îNœUÆ„îøïÍC‚»Ÿ}r‰œ:¦Ÿ¤¥ZçÏ/É)|¢ `1*ÒZlBŽ^úœ“ʉÇɋﯖ—flêReX‡s1¼ ê“-·\9Nô“3Ü´è §,Á>NF‰Âšä$�\zæ`yòÍÕ¦zkj©TUÆõ*Ð,±Ð+nåiêæ•Ú&Uѽ6 ûëDêÔýh,úÿC×lÙßvû÷;kں쥲¡�WÞÇ©d÷áýóePQ7镟IÒ»ApÝ´to­Jdßß–Èޖоu¿lÚY%z’{¬½*»þ{™§WiW·õbA@@ì$ ©ÏÆVlo´SÈîŠUª·»kÆ-8\À:v‡fx €@¼JçL^Y<ᦷÔW‰ßŒ×19Ž1�M;«eú¼ réÙÃ�í‡V^�~ÉvUr�@�N|¾Ø'ºtrhV»X ;3E®ùαrÞIäé·VÉœ{\¬ÁЭ&�šì‘ÿ¾p˜\rÖPIѳ;]¶è'¢° TÒ(Kl.?o¨<õÖjÓ'<í­"Á=63Òq¯Y©šè·~ªr¾*Ä®Ý&¼W5D÷wcïþzy{Þ–¶Û¡H2Õ4ªD÷ÁE¹m ï Õýâ\Ð7GÒRÜùˆ~ÒÍ>eµaGåÁdö­Úª³¯ß~@ô3@⸤§ˆä«dvý–£ª´sžTñ9 € €D] +;GJ×ï�z¿t�¥³&½•žè@Àîüt×ô�ÄNÀ/ž;5ñ“à;âˆ{¾]Uq?ûÄ’“•qÑÜ‘ îÑÔ¤/@À™Tpwæ¼ÚeTýúæÊŸ¯;MÖm)oKt_ôE¹]B'N‡ |gü¹üü£¥ 7Ý¡# ?,Ü;6òSÁ½c˜(¬Õ«t�Ô]Vn4÷7 B%X·¨ó¹]xJÔ»Ö…Ê7—¾¹ZÛMŸƒz²»ºé?cñ«R§2êõçÇ‘Ï=‘º°g¶ ÒÞK~ïÛ#S º¥KvFŠ-“­õäõòÊÙ]^'»Êjew…þ³®íñ¡uú‰‰º²D’:÷KOdÏU•Úõ¤výùÀ‚ € €8AÀ£ŠÇ}¾¹Þ Cqæ½z{tÏ´w¦£Bl#@‚»m¦Š@@ã;gßÿIÑ„ŸÏÑÎ0¾-ã!P^Õ(¯ÍX'ÿý­1ñ8\Øcx½T_ ‹D@Àå$ì¹ü `‘áÐ]î¼é Y¹~o[¢ûòÍ,a¸E`¨ÞêÿðÇHIŸnnr§ãôPz·CNë�%j+¯PUÜ�L^×¹^T¿¬&Жd®-Ûc' Ÿ`Ð3Gk»éÉí•õ+»ëÞõä÷X.ús toMÛmöç¥A‡JJòHANšJv×oéêä%õ3GýT�óÕ­»:™)ÿ«íi’“™Õ„øVu¥¤úÆV©mh‘:u«W‰úµõÖ5|½¾¬²¾-�}Ï—‰ìzòº¾¯U=�='ý`uvý§:o€@@p¤@zf¶ì=@õv‹Nî¶ROÁK��°@" Á=B8vC¬. ä΀&gX=N7Æwç3Kå¢SKÏ‚¬„Ÿ î Ÿ@,/@‚»å§È5ê§å�ÒK§,Y³[žzkµ¬ÛQåšñ3ÐÄŒìŸ+×\:JF î)œzp¨àÞñsÑo�\ÓŽ´ùÚK& ’Û_(�Í­¦F²·šwS`1nìQ/¤zEoý¦—S«m HuƒHuÛÏØ'¼9¼ÖV¿èÉâúÍÈ¢Ÿà“œì‘$U±O/�ä=ü§¾þÈu_>VíýêE¢îËdöz=¡]%³75Ç8ÃßÈ L¶ÑÏqÊJÕ“Ù&µg«„öu  € € àt¯×+Ÿm¨uú0í<¾ûdÖmæ>8²óh‰p‰ î.™h†‰îØ1çÁ‹&Ü´D�|œûFoí×7ùä¹wWË-ÿubÂ%Á=áS@ €€å¨Hkù)r]€šÊ¬:nD_;¼�,\Q*OªD÷Í{øbÁuO„¸° C®½d¤œrl±P±¼=6 îí==âïå!‰ØüÌÎL‘ Oé/Ófm4u€º¦@[uV§¨˜‚‹Cc}F²Õ¼d«DéÂ/O!Ryß*á= 5_&¼×7Ç!‡ÐÏõ¤ô&±_bº‰a¶kªrøU2»Jh×+´§Ln××± € € €nHIÏ–5n¶]Æ[Þ’šò¤]‚%N@ã$¸·¢% `7�€ÊĸSü�Wì¸â}pêjùîÙC¤_ß¼„—÷„òsp@ÀT¤µÅ4¹2H=Éöä1Årâ¨"ù|ín™úѲx=_0¸òÉÅAwÏI•]0TÎ?e�¤$S’¶#Zþ;R øõzÔ,±¸ìÜ!¦Üõxô*î$¸Çrf¢×wz²Hz²&½rž�ЪòÈÛª»«„÷Ué]O|çW-zÞGö”¦ü3S4ÉHÉP?3ÕÏtõ“ÓCŽ”â1 € €¸M 99I>YÇÕD-;ï�À?ö~ð�:ËÆG` € �à1;"€Ö(�™7­hÂþ/T¤C­­»"lUÙ‚S^[!wÜ8!¡'Á=¡ü°…€Ÿ,"[Ì“›ƒÔÝõŠîãÔmÓöý2mæzyQ©¨"«,Ð;K®8o¨œ>¶„Äö0jTpïˆ î»Dsí©£ûJIïlÙ¾§ÆT·e5ÐCT S»ÑØIê<£üL­í¦‡£ÿm¯UUùkEê›Ò *¼7¨Ÿª¨:‹ �õ­P»Dö”ƒ‰ìTf7�HS@@p•€–œ)µ û]5f v£/ýaÅK¨ €&Hp7�ES@À~·ù5íçwÚSö‹Ýùÿû½ ò£ ‡ÉðA½6XÜFÏ�@Û�°g›©r} zÞâà’|ùõU'É�¿Q+ïÌÝ$¯ÍÞ¬ßÈzsý“#À˜Aùr™Jl?îè¾Bâv¨Ã6QÁý0ŒÃîrBØa1¼{Ù9CäÞç–˜:B«_¤¼6 =³Ép7gÁÆššÂì4MÝôྞO}ŽõD÷¶„÷–ƒ?ëõäwuß­'¼éV©êÛŸÔ$U‘]%°g¤ªŠìúOU‘]?q€@@@À˜@jJ², z»1¬´ÒòÏòù÷˜«†�€89$ €@d$¸GæÆ^ €€mrÊ ž¯ê^q»úâ¯Ø6A»(Љ/,“)·žŸ°'Qž+aö°‹€� îv™*ân¿õУÃÞ%¾·[÷eB¼Þþб¼ªk½ ;  € € €€µê}©ÒÒZoí Ý]µÇßB‘G÷Î?#G—ð1ªK&ša"€EgÜü[U^êN$¬)ðÌÏ”³NdÍàˆ @p €ž„¶a[…Ìøl›¼óÉ6©oRå[Y#�›™"ß8¥Ÿœq|?é_˜+|昩e ´ œù³Wdc©¹ jzrñ ¼mIÆ0"€ € € €¡2ÒÓeÆê:iõéŸ$³XM Ðþ¶sÎz‘G@ x<6†† p˜@jÿqË’Äs­Z•qØjîZD`ÕæýrÅyC%IÿÆ�@@ æzÂs�ªD}܈>réGÉ�ÂIÒRZV'>?_ZÄ|bp½îYÇö‘k/9F~~ùX§ªöç夑ÜkºD Ñ~õ:=kI©©0ôªÚ©ªJwv§¼˜‚£1 € € €.¨ ¤ËŽ2®„nÑ©¯•dßå5[5X4>ÂBˆ’ŸæG ’n@;M¸é7*λí«cœ|Ë©òí³†»qèŒ@°Œ@Cc‹,_¿W,ß%3—»ef¦ó@F È“³Ž/–ÓŽ-V íé�7d 8F ¦®YŽ»êy©ol55¦ÌTMŽ-áÄrSh4F@@@Àe™™òáòZñëg˳XN@%;Þ¹cö¤ß[.0Bˆº îQ'¥C@Àº½ÎûUfrSóaëFéÞÈzæ¦É¬ÿÏÞ�ÀÛyÖuÿ¿çî{š´Mº§-P ÐZ…´‚ Š2Š•EAGÆAQAÅuÑÔ‚Šè°´‰P©Œâ6ˆ£³*m“tIš’îé–¦¹IîÍÒlwÉÝï=gÞ[Å©%MòÞÜå}Ïû}?“{γüþßç~:œsžó¼Ÿ|Stu´–Aå @€� LNÍĶ'Ʀúãæ­ý1�n¨t-½@KS%¾õ¥«âš—žW^¶2–÷ØÔ¾ô«"�ÅxϺÛâ¯þñ±Ì_q~%ºÛ¼-žN @€ P�¡™ŽxàÉ¡’T[¸2GªIÓê½ë?r¨pÉ&@€�Ì ™{è@€…ÙqçTÏE×T#‰×¶ˆ:>’žV¥Ôe ï~ËñKoYS—µ)Š P¯CÇ&âÑÞCñÐöƒqÏãã±¾¡¨Îì:%�ÙÚ¿é²3ãůˆç_´<.cÓ{T*I¼ôâ3âŠKWÄ Ó íÏ»`y¬8£=¼IUÌßu© ,¥ÀÔt5^öÖ¿Œ#Cã™b´4F¼,=ÅÝw2±iL€ @€êV ¡¡!¶í�844Y·5¼°‰†jåâ]·]¿¯àuˆO€¼‡ŸKSÔ“Àùßþ‹¿�Ö³¶žjª§Z~üµ/ˆßyç·ÕSIj!@€”^`v#æÞ§f7½¦›Þ�Æ®ýñëÀpì98Z—6­M ñüóºãâs»ãÂU]qÞÙ]qÎY�±rEg4§Ï¹ 0üÌ–¸ñ dêÅçVby‡·Ç3Ãé@€ @€êP µ£'¾rŸÓÛs¼´ëú6¬ýÅç�@À;ø €jHA`õ«~¼uºÖýDšõ¼"ä-[Æô÷øÇë_/¼ä첕®^ @€@馦gâÐѱ8xd$ö>û�ÄރǞÞß{`$¦fª¹5YÑÝg/k�³–µÅùgwÆù+»âܳÒ�ìgvÆòô±Jâ­§Ü.ž`êD`OúE¡o}ûÿˆ¬wÈ8£=‰ËÏK_|» @€ @€�R ´47Ǧ'&ctb¦Ô9.~²–Ô.í_¿®/ÇE#@€�ð)ã ’E¸àÛé�µ¨}¼(yË–óÚW^7þ××”­lõ @€Ä~¦‰ @€ @€�²tuuÆýO–¥Ü"Ö9ݘT~¿ˆÁe&@€�ù°Á}~�B€� lÛvÝdz|ãï¶€ßMwDZщTªD @€ 07�ù—=}§Š¬½÷¥§¸» @€ @€�² $ñø¾éHïxïʯÀŸõ®¿¾7¿ñ$#@€�…°Á}¡…�O€�¬ÿïiÌ�ˆZʈû�Æçÿù‘RÖ®h @€ p*Ë»[ãû^yñ©4ýwmŽ�×bö�‹ @€(�@gwwìØ7Rž‚‹WéLÒPû`ñbKL€ó)`ƒû|j‹غõ¦©ônÞ¿SÐø¥ˆý{ÿýÞØûÔP)jU$ @€˜‹À[¿ïEséNqŸ›N @€ @ �•J%¶î°¹=Ï‹—Dí/öܲnGž3ÊF€ /`ƒû›�…Ø“,ÿó4¨9]­‰É™¸ñoïËi:± @€ @€ÀÒ ¼ìE+ãòKVdrp¸Ó3™»é@€ @€P ¥½;L0yi"Wg*§·—f¹J€�çhxî§ÿ\OìôZû¹l{‚{k“SÜ�Ãã! @€ Px�öö¶¸í‘ápž\~—2=Wÿoú6®ûãü&”ŒSÀ î‹©m.@ oåþ¿Nc>Z€¨¥�øÞOn‰‘±ÉÒÖ¯p @€ p"�ÿüÚ¥ßÝ?Q‹ã?·oÐíÉ�/ãQ @€ P|�C# 1=íµŽWr&©Åoå8Ÿh °È6¸/2¸é �{�Ï~&ýøý¹ÏYâ€ýGâoÿùá (� @€<·Àó/X×¼äœçnðÏ>V‹‰éçxÒà @€ @€@aºº:ãÞƒ…Í_’àŸéÛ¸v{IjU&œ‚€ î§€¤ Ê&°ç¬}ŸOk¶ƒ:Ç ÿ»Ÿ½7öÊqBÑ @€ @€ÀÒ üص/žÓäû«sê§ @€ �_�í¦£æðöü.PÄdµÖø�<”�_À÷Å77#ò/�žâž¾¸sŠ{ŽWj|r&nüÂý9N( @€X:�ïùæÕqî™™ì¬EÕÞ™Ýt @€ @€yèêîŽ'úGòO®T ©%ŸØ»ñ£{` @€�g ØàþL ÿ&@€�è߸üoÓú·ü#wŸþ?�Ŷ'ä.—@ @€ @`©*I¼íû/Ïcj&âà°î™át @€ @€9¨T*qï“£9L&Ò3F&§'~ÿ?û'xZÀw¿ ð×U£’\÷Oz8'üìÝQu´\NVC  @€È“ÀúžFGkSæHýGmpÏŒ¦ @€È¡@K{Wì?:‘Ãd"}M VK>vàÎ?~êk?û›|MÀ÷¯Iø›¾N ïÖ3þgúàý_÷„r#°ñ¾ý±þî�¹É# @€È‹@WGsüÐw¿ sœÑÉZ ŒÚäžN @€ �#�–æ¦ØôèPމr��¦Jò‘ã<î! 6¸û% @€�\WM*ñÛ'hà©üæM[btl2ID @€ @€ùø©×¿$*IæPNqÏL¦ @€È•Àx­-Ž�Mç*“0ÏH’?è]ýÀ³õ#xZÀw¿ pB�=·®ý_Q‹»NØÈ“K*°ûÀ±øÂÍ�.i“ @€ @€�< \¸ª+¾kÍ…™£MOpŸ=ÉÝE€ @€O ³³#6=bßtžW.}×åÀTsÓº~²÷Øà~2#Ï @€ @€�< ìøÅ¯{¹›˜‰O~áþÜä„ @€äE`Íå«âŠçŸ™9ÎSCµ˜šÉÜM @€ @` :»{â±=Ç–0�©OA`Wk[õON¡�& PbÜK¼øJ'@€@&�jò_Óö¾âœ mqê?�<ùÔâNj6 @€ P�·¿>û)îÕô]�}ƒÞ )ÀòŠH€ @€žhllŒ»·ÛÜž÷_‡$©]÷Ä—ÖMä=§| °´6¸/­¿Ù  P�¾Ûnx û¹Â.aÐÙ;¬}ð³wGÍ­ÖJ¸úJ&@€ @€� \û­Ç9gvœ¨ÉqŸÛ70{Kóã>åA @€ @ gIsGšÌY*qž%ðØžXaïɳPüH€_/`ƒû×›x„žC 1©üVú”WƒÏᓇ‡×ß³/6|µ7Qd @€ @€¹hl¨Ä�_ûâÌy¦f"ÛážN @€ °Èím­qûCGyVÓe¨Eò›±þºé¬ý´'@€�ò Øà^¾5W1æ,лþúÞ$âãs@ÇExß'·ÄØøÔ¢Ìe @€ P�ýÞEGkSæ¸ýGmpÏŒ¦ @€Xd�# 15ã5ü"³g�îÞþ g|!k'í  @ œ6¸—sÝUM€�9 Ì$ML;Íy\`×þáøü??²àó˜€ @€I »£9Þü]ÏÏyt²£> Ï § @€X$�®î®¸‡m ‹Ä}ÓTßq]õ4ЕJ$`ƒ{‰[©˜�½ë?r(©ÅÎÇXÆX8�|fkôX¸ ŒL€ @€ (ð“¯I4TÒûÓe¼úlpÏH¦9 @€X�J¥ôŽ/Ê\&™»@úÎÊí}þèËsAO(›€ îe[qõ @`&[›¯O‡Ù?Cb�&&gbí_Ý»@£– @€S`õ9Ýñê5ft¤£“™»é@€ @€,°@KGwô¶Á}�™O{øJ-IOo'œ¶¤ P�†ò”ªR˜/�‘wNu]|õHzÞÙµó5¦qæ_à¡'�Æ+.?3Î_Õ3ÿƒ‘ @€T`åòöøüW¶gN?û ìòŽì§¿gžH @€ @à”ZZšãÎGGbjƾéS[ªFµÚ?öm\û{K5½y  @ ˜Np/æºIM€�%X5<þ§iˆìŸ/yòrøÍ›¶ÄØøT¹ŠV- @€8�À5/9'^zé™'hqü§žª¥˜ÿ9� @€ @€‹/02Ó£^¬/¾|¶+ OŸÞž­“Ö Pz'¸—þWæ&°oßÖj×Åkö%‘üÐÜFÐk1 ŽÇy+Z⊬\ŒéÌA€ @€ !ÐÖÚ_ÞÔ›)ëìYp�•$zڜ➠Nc @€ °��±á¡ÁÙ�ó*P‹/ìÙ°ö†yÓ` P '¸—b™I€�…è_¿î éÈw/ÌèF�/�ßþôÖè;00_Ç @€^àußvI¬ZÑ‘¹Ž½Õ¨ºëyf7 @€ @€Àü $±ýÀLÔ¼FŸ_Öù­Z©Õ~kþ‡5"”AÀ÷2¬²  °p³¯má†7ò|L¤·d»þ/ï™�¡ŒA€ @€êB ±¡?~í‹3×2•Þõüà°OÏ3Ãé@€ @€æQ ³»;vì™Ç µI¾û¶u/ÄØÆ$@€�ú°Á½þ×X…XP�þ koM'øò‚NbðÓø››ŸŒÍ÷ï>íq @€ @€êEàG¿÷…ÑÞÚ˜¹œ½6¸gFÓ� @€Ì“@SScl~lxžF3Ì LUªÕ÷/àø†&@€�:°Á½ÎXyX �ZRù¯‹1�9NOཟ¼+ÆÆ§No½  @€ @€@�ôt¶Ä›^ý‚ÌÕŒLÔb`Ô&÷Ìp: @€ @€�y˜ih��c>÷žÊ"}çäOvmü£� :‰Á  @ ®lp¯ëåUG ýõ÷E±8³™e®�ýÊ#sí® @€¨;�ŸzýåQIï—�õrŠ{V1í  @€ @€Àé t´·Å�œþ@FXh�±Êtõ÷zã @€@} Øà^ßë«:,š@Cµú›éd¾&½hâs›èýŸÞ}çÖY/ @€ PgŸÛ¯~ù™«:2R‹±ÉÌÝt @€ @€NC 0‰éwU; ÂEéZKâ£{îø£½‹2™I @ nê¶2… @€À¢ îÚ2нúš3ÓI¯^Ô‰M–I`&}±?4<ÿá—dê§1 @€¨W�³—·ÇçoÞž¹¼Ù�Ó—wd?ý=óD: @€ @€ÑÕÝw>â0·üÿ*$OML·þðèž; �ÿÅ’�¹p‚{®—G8K`ºZýÝ4ñp±R—/íçoÝ›îß]¾ÂUL€ @€Ž#ðÍ/='^réŠãtÇÚ7²àÒ& @€@ý Øà^ÿk¬B,šÀþÛÖLÏ-ûo‹6¡‰æ,ðÞ7ÇØøÔœûëH€ @€êIàíoxiærªéîûÝ=3œ @€ @ £@ckWì?:‘±—æK ðh,ÿÔÌkJ¨CÜëpQ•D€�¥O¦?–~´{`)3˜ûäÛû†âóÿüðÉjA€ @€J ðºo»$Î?»3s¥{ª1»ÑÝE€ @€,Œ@[[Kܾmpa7ê¼ Ô’äWcýuÓó:¨Á @ ´ ¥­\á ° £½wO.[}Íì½Á¾oA&0è¼ ÜñÀ�øÁï¸$º;[çmL @€ @€�" T*I4¦·;¿õ«{2ÅŸÝÜÞÜ�DWkzO; @€ 0ïG'[£ÿÐø¼�kÀù¨­ïß°ö}ó=ªñ @ ¼Np/ïÚ«œ &pö±±?‰¨=±`x^&¦fâÿüîyË  @€ @ è?òšËâÌem™Ëè;Z�šSÜ3»é@€ @€N&ÐÕÝ÷ï:Y3Ïç@ =<àÝi ï�ä`-D @€@½8Á½^VRÈ‘À¾}[«]]s IâÍ9Š%Êqéˆo¾ü̸`UÏqžõ @€(�Àì îSÓÕ¸ãþ½™Šž©F´5%ÑÑâ÷Lp @€ @€�466Æ}½“1:1s‚VžÊ‰Àçö¬_ûñœdƒêDÀ îu²�Ê @€@Þú7.ÿÛ4ÓÖ¼å’çë~íã›cl|êëŸð @€(™ÀÛ®½<º:š3W={Š»‹ @€˜?�jcGšœ¿�´PÕ™ä½ 5¸q  @ ¼Np/ïÚ«œ ,°¾ÖuÉÕ;’Z¼u�'2üi OÄÊeÍñ —­:Í‘t'@€ @€ÅhnjˆáÑɸûá™ ™J“›=Á½½Ù)î™à4&@€ @€Çèìl�õE­vœ'=”/�Z|¸ÿ¶µ—¯PÒ @€@=8Á½VQ È©@ÿ­koŽH¾”Óxb=CàŸ¾'ú >ãÿ$@€ @€åø©×¿$Z›3¿ç¨OÝ3£é@€ @€¾N ‰'žªÆLÕë쯣É߇š›Ç?”¿X @€@=Øà^«¨äX ¡–üJ/=ÇÌ•g�É陸ýÏnÉsDÙ @€ @€À¢œ¹¬-~ø5/È<×±ñZ Œúð=3œ @€ @àÝÝñDÿÈ3ñÏÜ $ÉûŸüÊMNÒËí F€�b Øà^ìõ“ž¹صñúGÒ�ŸÈ}PãnÛ·ßÓK‚ @€”^àgðŠhlÌþöyŸSÜKÿ»€ @€æ.ÐÚÒ·o³_zî‚‹ÚsûÊá±O.êŒ&#@€�R d‡¾T<Š%@€�ù¨5μ?çè|ŒeŒ…ø•µwÆðÈÄÂNbt @€ �s�óÎêŒ7|Û¥™SΞà>œžäî"@€ @€² MµÄȸÄg—[üIRyÏÖ­7M-þÌf$@€�²4”¥Pu @€ÀÒ ï¼{¬{õš±ˆä{—.…™OE`xt*Úš"®¹â¼Si®  @€¨[�KÏ_þÅG"ëvõéôsø³º’ºuQ @€X�îî®ØðÐÀB mÌù¸­oà ¿>ÿÑü'¸ÿ ÿ"@€�XylâÆtøGp CÏ“ÀGÿæ�ØöÄþyÍ0 @€ @ ˜Ï¿`Y¼æš‹2‡?ãýš¡¿  @€ @€ÀÉšÚºbßáñ“5ó|Òw<þºï¶u[rE¨s�†:¯Oy �#�¡][žè^}õ5i¤çå(–(Çè?8žÝ/yÞÙÇyÖC @€ @ «VtÄ݈Ýû‡3<:qvw%½ŸÉMc @€(Ÿ@{{[lxh(ª¾+^„ÅŸl¬Uß8¸kË@ÂÊH€Åp‚{±×OzN R­ýJÚÑàX¹÷ÝôÕØ½ïh’ŠH€ @€NàçÞ|eæÁg?“ï?šÞ"ÍE€ @€œP o ‰©»ÛOˆ”—'k±vׯ?Ú™—8r @€@} Øà^ßë«:äN`÷mëŽZíÆÜèëÆ'¦ã¿ýÙWÓåòfÂ×áx€ @€J#ðÊ+Ï�«.Ë~‡³Cµ˜ôÿÒüž(” @€² tu÷Äû²Ý5-û,zÌ“À‘Juêƒó4–a @€ÀIlp?)‘ 0ßµ¦êué˜nY5ß° 0Þßß¶+nÞ¼cF6$ @€(ŽÀÏÏá÷Ù[«ïuŠ{qYR @€XT�¦¦ÆØô˜Í틊~“Õ’Úïì¾ýF·€? C]  @ ›€ îÙ¼´&@€�yè¿ù㇣×ÍÃP†X�÷||sY„™LA€ @€ò)ðšk.ŠË.:#s¸}ƒµ˜®fî¦ @€¨{�Éh��cSu_g�¸cÙÁŸ¨“Z”A€h(HN1  @ Îžæ•÷Œ47þPZÖ™uVZÝ•3:>µêL|Û7^Xwµ)ˆ @€œª@g{s|ySï©6º]-=Ž¡’DO[’©ŸÆ @€ @ žºº:cýƒƒé¹x®"¤§·ÿôŽ»ÿðÁ"d•‘êGÀ îõ³–*!@€@¡¶n½i*}µú®B….qØOþý#±u[_‰”N€ @€exý·_¬ìḚ̂w UŸØgvÓ� @€êS I’x¸*}­ìÅr1V¸¶©ýº/#«” PO6¸×Ójª…èÛ¸öKQ«ýcÁb—6î{>¾)FÇÝ"®´¿ '@€ @€@ÉfObÿÙ¼"³ÂÔLÄþAÚg†Ó� @€êR µ£;v­ËÚ걨Z4üJZ—76êqqÕD€�œ Øàžó�u.P«44ξJ?êuå]àñ݃ñÿ×]Çò¾Nò @€ @€À üðw¿ Î:£-óýG«éwü3wÓ� @€Ô•@[kKܶm°®jªóbþ¶Ãõ›ê¼Få @€@NršK,(‰À`ïæƒÝ_}vZîš’”\è2o`\ûÊ cyO{¡ëž @€ÌE ¡¡’ÞB=â¶ûú3uŸ©F´6%ÑÙ’dê§1 @€¨'�Áɶè;4VO%Õs-•™†7îÞ|´ž‹TäWÀ îù]É P�j4]—;Pš‚ \èLú)þoþñ¦˜™ýdÞE€ @€J(ðŸ_û¢èélÉ\yßì)î™{é@€ @€êC «»+îÝáôö¢¬f-‰ï¾ýcO%¯œ PNp¯¿5U '0Ü»i´û¢«Ç#‰ï)\øÞ}`$.=·=^xñY%¬^É @€ Pv�榆ŸŽ»ÚŸ‰bz&¢#=Á½½Ù)î™à4&@€ @€� 456ƽ½S1:‘¾8vA º¥ù‡GvÜ9U„°2 @€@} 8Á½>×UU(œÀÊ‘ñO¤¡+\ð’þõïŠý‡†KZ½²  @€ @ ì?ùºË£½µ13Cßg¸gFÓ� @€ /0‘´Ç¡¡ÉÂ×Q–’$Þ}àŸ>×E*”N`ß¾­Õ®KÖìLjÉ[JW| žš®Æ‘�±øžW\\Àô" @€ @€�ÓhkiŒ£CãqÏ£Oeh2=¨®«5‰6§¸grÓ˜ @€Š+ÐÝÝ·>8PÜÊ—ü¶¾ kß]¾²UL€yp‚{ÞVD”X ÿÖu_LËÿ§ªô/¬2nÛº«P™…%@€ @€ó%ðÎ7]³ݳ^»�âž•L{ @€(¨@CCCܳs'Î § @€N ÖÔû�ø<¹( W‹ä“ý믿¯(yå$@€�úh¨ïòTG€EìÝ|°ûâ«ÏNs¯)Zö2曊JTã[¾áü2–¯f @€(¹ÀK.=3þì‹ÇÔt5“Dúr:Võ$™úhL€ @€Š$ÐÕÕ·>0ä(ðâ,ÚÑhœyãðλNJYR¨g'¸×óêª�¨FÓuiô�‚Æ/]ì�á¡xhû�ÒÕ­` @€ °¢§5Þú}/Î q,=ÅýˆSÜ3»é@€ @€Å¨T*ñPßTTkî`VŒ‹H"y_ÿÍ?\”¼r @€@ý Øà^ÿk¬BN`ïú�ª%µ÷.xIϾ'ñËÛcãéñs. @€ P2�ŸýÁ+¢£µ)sÕ»û�?3š @€ P�ÆÖ®Øó”ƒÀ ±Xÿò�=É7(¯¨ P�†Ô¨D( À…¯½g¢}ì‡Óè+ ¿t‘NDgk%^~ù¹¥«]Á @€ Pn�¶–Æ866w?œíîf“3-I´7'åT= @€Ô•@gg{ÜúàPzz{]•UßÅTj?<´þwÖw‘ª#@€�¢ 8Á½h+&/J"°mÛu“µ$ù•’”[eþÁçî�‡wdû0¿. W @€”^àg~àŠèlŸÃ)îG|Ú_ú_ @€¨#�$Iâ±}31=ãõnQ–µ–Ôþ¦ïÖuŠ’WN(�€Ü˳Ö*%@€@á†{ïÚÞ½úš5iðç.| ×Ò÷(Ø~(~ð;Ÿ��þ'F ”L€ @€�Ò ´¦§¸�ŽOÇ–mû3L¥§¸·;Å=“™Æ @€ �_�ÖÎeqÏCù (Ù³Æjµ¦× ïÚdÑž-ãgXr'¸/ù@€'¨ERùÅôù‰´ñTŽØq$>÷ÌQ"Q @€ @€Àâüô_]Í™'Û}Ø©v™Ñt @€ @€�Ü tt´Å†Žä.—@Ï-�$µîÝøÑ=ÏÝÂ3 @`鯺töf&@€�SêÝ|$=Å}ößß~ Í5É�Àì�׬9/ÎZÞ™ƒ4" @€ @€�ÅhmnŒñÉéØü�SÜGÜ, @€ ��$ú‡ãààd~"Ir2���Éðè½oúd =O€–BÀ îK¡nNÈ&0YùPÚag¶NZ/•ÀôL-Þ÷Ç›b|bj©"˜— @€,‰À;ÞðÒèžÓ)îÕpŽû’,™I  @€ @`:ºzâñ¾có0’!K I*ïê]ÿÙñÅšÏ< @ «€ܳŠiO€‹.0Ô·yºë’5O$µä-‹>¹ ç$°÷ÐhœÕÝW½ðœ9õ׉ @€Q ¥¹!¦¦«±éÁ}™âOÍD´7'ÑÑ’dê§1 @€Xj�ö¶ÖØøð±˜=ÍU �t¥þ¹oà ï+FZ)  @ ¬Np/ëÊ«›è¿uÝÿM�2û‡‚Å.uÜ|æžxdÇ�R(ž @€Ê'ðS¯I,ëjÉ\øî#NqÏŒ¦ @€,¹@ÿ`%Æ'Óon»Š"0ÝX«üRÖ7вbr @ ¤6¸—tá•M€�" Ì4Î̾È+bö2fžý†þû>¹)Æ'¦ËX¾š  @€ @ ¤�íMñŽ7¼4sõc“‡}¶œN @€X2�ÎîžØ¶kxÉæ7qv�ôÞqëvm¼þ‘ì=õ @€‹+а¸Ó™�Ì]àØÎ»»V_SK_p½zî£è¹˜ýGã¬î†¸ê…ç,æ´æ"@€ @€K*ð’ç­ˆ¿øÒ£™O°�¨Å9=•HÒ7?\ @€ @ Ï­­-qÇ£#15íËÚy^§Ÿ-yª¹iüMGŸÜ:ñï÷ÈŸ€Üó·& @€À ÚÚ«IŸ~üM<•3�|úÞxôɧr–J @€ °p­MñÓ?pEæ Æ¦œâžM @€X�ƒ£�12>³$s›t޵ø�'¿rÓà{ëF€UÀ÷Eå6œ®À_Z7‘”àXF@IDATžcöó§;Žþ‹'0]­Æ¯âΘ˜œ^¼IÍD€ @€–Xàmßy¬èiÍœb÷‘jÔ~—ÙM @€X<�®îž¸ÇÐâMh¦yH¾Ú·ñŒÏÌÃ@† @€‹"а(³˜„Ì£Àà®»žìY}õåé�³\Øwh4Vt5ÆU/\U€´" @€ @€�Óhjü—óen»¯?Ó`ÓÕˆÖ¦$:[’Lý4&@€ @€‹!ÐÒÜ›Ÿ�‰©ô¬«0µ¨¼ixׇö&°  Pz'¸—þWŠ)PMjïJ“�3}9SàÓ[ã±�ËY¼ª  @€ @ ”?ví‹ãÌem™kßã÷Ìf: @€ @€Àâ M·ÆÐÈÔâLf–yH¢ögý®ß4/ƒ„,’€Ü Ú4 0¿ý[†z.¾z2õ5ó;²ÑJ`ööê>q(~à;Ÿ� ¾c·PÎÆ%@€ @€�üÌžâÞPIbÃ=ÙOqoiLOqouŠ{~VS @€èêîŠ €(–À±†jÃëwo>V¬ØÒ @€@Ùì.+ûo€ú  P`�³‡Çoˆ¨m+p ¥‹~ïöÃñ_|¨tu+˜ @€Ê+ðŸ_û¢8ë §¸—÷7@å @€¨�ææ¦¸kûh}Sª*jØuÛõûJU²b  @ .lp¯‹eTÊ)°uëMSQ‰Ÿ+gõÅ­úŸÞ�÷,n’ @€ @€� ­Í�ñÎ7]™¡Ç¿4�˜Ž80”ÞÍE€ @€r 0<ÝG†fo²î*Š@ú®Â#=‡V¤º @€@ñlp/ÞšIL€Ïè»u݆ôÇÏ=ã!ÿ̹ÀLµ¿rÃí19•~Rï"@€ @€%xkzŠûÊåí™+Ýs¤éËh @€XR�®îž¸û±�%Í`òì•Zò3Û¶]ç[ Ùéô @€�4ä ƒ @à´–_üM›ªQyG:HËi ¤ó¢ ì?2+ºãª®Z´9MD€ @€–J ¡¡M�•¸uk_¦3ÕˆæÆ$ºZ“Lý4&@€ @€ó%ÐÚÚw>6“Óé‹TWaj‘|¶oã k XP ð,'¸? Ä� P<�ÞõŸØŸ¦~_ñ’—;ñ>½5¶ï:TnÕ @€ @€@i~ô{_çœÙ‘¹^§¸g&Ó� @€æQà©c�qlÌݹç‘t1†:RKu1&2X(ÜJÖ¸ °¨}ÉòÓ ï[ÔIMvZ3é=Öù£crÊ›!§©3 @€B`ö÷_ø¡oÈœu2}Ù¼°–¹Ÿ @€ @àt:º{â��C§;Œþ‹,�Ôj¿ºwýGœ6·Èî¦#@€�ù°Á}~=�F€K%°þºéZTÞ¹TÓ›wnì8Ÿþ‡æÖY/ @€ P0�yÍeq᪮̩gOqŸq'øÌn: @€ @€ÀÜÚÛZcÃs@Ï%H¿"ûž�+>»$“›”Ì£@Ã<Že( °¤û6÷u¯¾úÂ4ÄUKÄä™n¿_|×ËÏ�•+:3õÓ˜ @€M RIbEw[|éÎÞLÑÓ› ECÚ·§-ÉÔOc @€ 0�$I¢¨)�˜Kw}–N`º¡Òpí`Zºf&@€ó#à÷ùq4 äD`ºZûõ4ÊÑœÄãjé‡ô?÷ß6ƱoŽœ—& @€ Pp�7¼êÒxÉ¥+2WÑw´S3™»é@€ @€2 ´ttÇã}Ç2÷Óa‰jñáÝ·~lÛ§0=˜'¸Ï £A @ /ÇvoíºhÍ@ú�òkó’IŽ“ ODuz:¾õ/8yc- @€ @€@Á.\Õw뙪˜ý‚øìŸ3:œâž Nc @€È$ÐÑÑ·>4Õj¦n/±@ú–Aomdü‡‡÷m�Zâ(¦'@€ó"à÷ya4äI åþO¥yîÎS&YN.pãß?·ßÓ{ò†Z @€ @€�‚ |ÛUçÅ·\ynæ*ö ÖbÜÇÔ™Ýt @€ @€�S¨T*ñȾ阞N·K» %�Ôâçön½i´P¡…%@€'°Áý8ž"@€�‚ |þó3IR}gšÞ«î‚-á/_G<êVw[6q  @€ @`¿ñ¶5QI²�Æ>{‚û®ÃŽÐ›·. @€ p •–®Ø}`ìZj’+�Z|¡oãÚ/æ*“0 @à4N³¿î @ —C½[öv­¾feú1ñËsP¨ã ŒŒMÇàÐh|÷5«#Éø!ÿqô  @€È©ÀÊåí±}Ï@<¾ûh¦„£“Ë;“hn̶9>Ó$ @€ @€@麺:ã–û�"W¼•?� ×íÜ<\¼è @€�çp‚ûsÛx† .Ð03ùÞ´„ƒ/£tñÿúæ'ãK·=^ººL€ @€åxÏ[_��ÙߦßuÈMëÊ÷Û¢b @€,œ@cccÜÛ;ÕÙ[‡¹Š%P‹÷õÝò±þb…––œ\ û;ç'S  � �Ý·ßx4}ýý«¹#D&�÷||sìÚ›í»LhL€ @€r °úœîø‘×\–9ÉÑÑZ ¤\ @€ @`>&“öØd|>†2Æ" $Q»§¯²üã‹8¥© @€À¢ 4,ÚL&"@€K 0¼ë®º/ºú["‰K–`zSÎQ`bª{öÆk¿å’h¨ø>Þu#@€ @€�\ùü³âs_|4¦¦«™ÒŽNE¬êI2õј @€<[ »»+n}pàÙû9ÿµ$*oÚð}ù�*!È.`ƒ{v3= @ `=—®¹#jÉÛÓØM‹^ê¸OîŽU˚⊬*µƒâ  @€ @ ¾Ú[›b|r&îzh¦B'§#Ú[’ho¶É=œÆ @€ ðoÍÍMq÷““161óo�ùGA’øD߆µŸ*HZ1  @€@fG¢f&Ó�Š&°ç–u;’$~«h¹å�øíOm�‡w@A€ @€êZàg~ðŠXÑÓš¹ÆÞCÕ¨Õ2wÓ� @€<-04ÕG‡'iO`sãø{‹[b pêNp?u+-  @ ÀC«¿wKOŒ^‘œSà2J}¦Z‹û·Š7¼êÒhnò?[J÷  ` @€”D`ö5oSS%ÖoÍvWñéjDKc�­Nq/ɯŠ2  @€ 0o�Ý=±ñ¡£ó6ž�O ©%?µëÖOl]¼ÍD€_ÀN±Å77#,…@ïújçEWß�$ÉO¥Ó»ƒÉR¬Áç|êèX4VfâWž?Çt#@€ @€ù¸âÒ3ãïn}"†F²�œ7<^‹sz*Q±Ç=ÿ‹,! @€r"ÐÚÚw>6“³ßœvK VûǾ�k£X¡¥%@€ÙlpÏn¦T`x×–ýÝ_ÓžÆÿ–‚–PÚØ›·=¯¸üÌ8UOi N€ @€õ-PIw¨ŸÑÝ_ÞÔ›©ÐôægÑ�öíi³Ã=œÆ @€(±ÀáñÖè;8Vb�–>‘4Æ÷ íÜr¤°N€NQÀ ¶§¥Ô‰ÀDåýi%;ꤚR•ñ ¹-Œ”ªfÅ @€ @€@¹ÞøªçÅå—¬È\tßÑjLÍdî¦ @€”P £«'Ü9TÂÊ‹_r’Ô~wÏ-ëìw(þRª€NAÀ î§€¤ Ô�ÀP߿鮋^þP’$?V?U•£’ccÓqd`4^sÍÅ‘8”®‹®J @€”L`öõîùgwÅÿ\ÿD¦Êké)î³Îèð‚9œÆ @€(™@{{[lØv,ffoæ*šÀ£­íñÖ#Olñ÷¢­œ¼ 0'ÜçĦY`x×–�Ý«¯¾0­áª"×QÆìÛv�]ØÏ¿(ûiveôR3 @€O`õ¹Ýq×CûbÏ�c™Â›ˆ8»«�ÞõÏä¦1 @€Ê"�{âà@úÒU<�¤òæÞ¯¬uz{ñVNb˜£@eŽýt#@€Å˜løÕô;éŠ]D9Óÿò wFßþ�r¯j @€(…Ào¼mMæ»—Ížà¾ûpµ>Š$@€ @€�ì�mÝñDÿHöŽz,¹@úÝ„ÿÞ·þúõKD °ˆÎrYDlS @€@~†ú6�u¯¾fWzãî7ç'•$§"05]�Çv‰7¼êyQ©¸õú©˜iC€ @€ÅXµ¢#}í{4¶ïÉöï‘Ɉ�I47z½\¬—– @€ +ÐÝÕ7ß?éw£]Å8:]­½îØî-£Å‹.1˜»€ îs·Ó“ .0¼ë®GºV¯¹*‰ä²‚—Rºø»ÓÛ´ŸÕÓßpÙÊÒÕ®` @€(‡À‹/YŸûò£Q­fÛ~01qv— îåø-Q% @€N.ÐÜÜ[{'ctbæä�µÈŸ@¿¸wãºÛóL" °°•…Þè @ ×µHâç҄ùN)Üq~릻ãÑ��ûœ  @€ @€@Ñ.9¯'þãw¿ sGGj18–mS|æIt @€ @€�Âo‰ÃCé-¿\Hné[¿öO \d pÚ6¸Ÿ6¡ @ Èýë×õ%Qûµ"×PÖìÕZ-Þñû·Ä±‘‰²¨› @€ê\à]où¦homÌ\eï!Ü3£é@€ @€�:èèê‰{w Öae¥(i´2Sy{Z©ù¥XnE @€À³žý€Ÿ  @€@Ù†v½öžž‹Æ¿+=Íý²Õ^ôz†'cxd<^½æ¢¢—"? @€ø:�޶¦ŸŽ-ÛöÝs'z`r:¢½%‰öæäDÍã°¾Ìn: @€ @ È]ÝÝqçÃG‹\B©³'µøÀ®�×?RjÅ @€�TÀ î~  @€À¿ <¸~¦kõ+îM¢öéCŽ7+ØoÆÞC£éÉtÕ¸æ¥ç,¹¸ @€ @àÄ •$Î=«#þ÷mOž¸á³ž­Öþå�eíÞæx�  @€ P—m­-qÇcc19åÛÎ]àûVŽŒÿø¾}[-`APl˜?ÜçÏÒH Pû6÷u¯¾zEZÊÕuPNéJ¸óÁqÍ‹VÄç,+]í &@€ @€�úxÞËb˶ý±ç@¶[ÌODœÝU‰FŸÔ÷/ˆê @€(½@’$±ïXsì=<^z‹‚ÌTkµkß|cAó‹M€æU 2¯£ŒÔ�Àøtë{#j{ê ”R–ð ½=ö*eíŠ&@€ @€�ú¸îíפÕ³½­_KOqßyÈÁoõý›¡: @€D4·wÇ£{²})š[~Ò{¯ýáÞ�ëîÍO"I @€ÀÒ 8³eiýÍN€9ÝsÇd×%W?žÔ’·ä0žH'ŸŽ½O Å÷¼ò’¨¤·pw @€ @€�z8sY[>�Ótb�‚ÀΩææ÷žB;M @€@éœà^º%W0dÞu×=«¯~eÚç’,ý´Í‡À‘¡‰>6¯^³:’Ä uùX) @€ @àt*•$.XÙ¿aG¦¡ªµˆôÿÅí^#g‚Ó˜ @€9èèh‹õ‹™Ù{®B Ô*ñæ}7ì±B†š,°€ÜØð Px�Z¥V}GZ…{ºt)ÿâŸvÄ?ÜúhAÓ‹M€ @€Ž/ðê—_¯ú¦ó�ÿä Ý;P‹±É4ð @€ä^ R©Äcûk115“û¬>§À§úo]{ós>ë  PrÜKþ  |8¹À®�´³–Ä»OÞR‹¼ ¼{ݦx¼÷`^ãÉE€ @€æ$ðÛo¿&³½Í_KöÛy¨:§ùt"@€ @€�|Ôšº¢w¿3Úò±sJ±·¹iÜ„9ÑéD€eh(K¡ê$@€§#0Ü{×Ö®ÕW¿"½�÷¥§3޾K#0{[¾{y*ÞðªK£¹©qiB˜• @€̳ÀòîÖ8:4÷>–íKÝcS]mI´5¥ït¸ @€ @ PÝÝÝqËG •YØ/P�ÚÚ}ë�üûGýD€§@RK~~ÿmë>gO @€ÿ&`ƒû¿Qø8%�ZCµòŽ´åÑSj­QîFǧã?¼>&&§s—M  @€ 0�†J×½ýšH2Æ>]�Øu$ý?. @€ȵ@WWgÜzÿ‘\gî$µø‡=oø'iåi @à_H @€Ùwo>Ö³zÍîˆä³õÔ:/û�F%fâWžŸ—Hr @€ @€�Ó¸èœîxð‰Cñdÿ`¦qFÒ;ÛŸÙ•DSCÆÝñ™fј @€æ*ÐÒÒw?9£nÁ5WÃ¥ï— &3Õ×íÙâþ¥_  @  6¸d¡Ä$@€�| íÚ²­û¢«_I¼8_ɤ9U�ÍÛžŠ—]¶<.:wÙ©vÑŽ @€äZàÊœŸûÒ#Q­Ö2囊8»Û÷Lh @€ @`’ôV]FZbÏÁ±E˜Í %�Ôj?·çö?Ú¸Pã—Ô£@¥‹RX�Út­ö³é<a.S,�À;~}ìÙ?°@£– @€,®Àêô÷ŸxÝå™'­Å‘‘l›â3O¢ @€dhlëŽGv;ô;3\Ž:¤¯¶ÿyÏÆuŸÉQ$Q @€@!lp/Ä2 I€yØÛºƒQ«ýL³Étj#ãÓñÎ?¸5ÆÆÓ£ê\ @€ @ ~ù?~cœ¹¬-s%;VÓ·92wÓ� @€H »»;Ö?pd�F7ì" Œ4%•w¤syŽHà¦!@€�úh¨ŸRTB€_`h×–GºW_ý‚tæ—.þìfœ�ýGÆb|b"¾ý›.œ�áŒA€ @€–T ¹©!º;šã+[vgÊ1]�h¬$ÑÝ–dê§1 @€Ì¿@[[KÜñØXLN¥/Ö\…¨%ñK{Ößð• 8XB'¸/!¾©  @ N&~!­d_�TSÊ2þä�/Þöx)kW4 @€ÔŸÀ�¼æ…qù%+2¶ûH5¦f2wÓ� @€æQ R©ÄÎC•866=�£j ¾Ü¿~í'—`^S @€�º°Á½.–Q °”}›>v¤V©½})3˜ûô~ñ£wÄö]‡N # @€ @€�%HÒCد{Ç51ûw–k&=p×a§f1Ó– @€ó-PkêŒ'ö›ïa�·¸G“éêO¦SÖwZ³ @€�úh¨ŸRTB€–N`¸wËöîÕW_˜&¸jéR˜ùtfªµØôà¾xã«.�–æÆÓJ_ @€ °äçŸÝ�î:Û÷ dÊrl"bEgÍ�wÇgšEc @€8ž@WwwÜòÀÑã=å± $µäm{n_·¹@‘E%@€¹p‚{î–D (ª@sÓø»Ò/`ï)j~¹#ß3¿÷§›¢VóEz¿ @€ P|�ßü‰5é—¸³ŸsóäA¯‹‹¿ú* @€ @ híím±á¡¡ô³Ê¢%—÷™éòýõž�7üÍ3óo @ »@öw¶³Ï¡(…ÀÑ'·Nt^|õƒI$o-EÁuZäƒO� Îj‰Ë/=»N+T @€”E »³%Æ'fb˶ý™Jž˜ŽhoI¢½Ù)î™à4&@€ @€Àâ‰C‡'ç8‚n9Ø—L6\;Ô·y,'yÄ @€…°Á½°K'8äQ`¸wË“]«¯Y™~üûò<æ“éÔnùêÞxÕU+cÕ™]§ÖA+ @€ �S�«.;;>ÿ•Çcdl*SÂcµXÕS‰Ä÷Ln @€ @`.S �±­÷Ø\ºê“'�$~¨ïöÌS$Y @€@Q*E .7È«Àd2õž4Û“yÍ'×ɦfªñsÞ�xéäZZ @€ @€@žÚ[ã×~,û÷ðÇÓýð{�¦7Vw @€ @€À‚ tt÷ÄæGtƒ/¼@R‹?î[¿öË ?“ @€@9lp/Ç:«’QààúOKjÉÛÒ)} ¼ˆîó=Õ®ýÇâý7ÝSÓ3ó=´ñ @€ @€À¢ ¼ùÕÏ�+ŸVæ9÷­Æätæn: @€ @€À) tt´Ç­ØÜ~Š\yn¶c²µùÝy((š@CÑËK€Š 0´ë®]=«¯îI³~sòÊx|�ÇvÆŠÎJ\õÂsŽßÀ£ @€ @  /¸èŒø_y8oãhÉîï>´üº%›ÝÄ @ Žœà^Ç‹«4Xz�¡Þ»ú»/ºº-’ø–¥O#Á\FǧãÑÞÃqí·\��þçÓ\õ#@€ @€�¥èjoކJ·ß·7S�‰éˆ–¦$:[œâž Nc @€G ««#n~p0ªŽI;ŽN¡šŒjòÚ_ýƒl/² U¢° @`éìÐZ:{3 @€@IÎ~ñšÛ§§’7¤åž]’’ë²Ì=ÒÛV§ã•ßpA]Ö§( @€(‡ÀU—�_ÞÔ‡Ç3<4^‹•Ý•tƒ|¦n @€ @€À3š››â¾]Óql,ý&±«è¿Ñ·qíß½ù  @€@^lpÏëÊÈE€u#pä‰-3�~ó]IRûÉ´(xe·<|0.¿¨+žwáŠW!: @€”Y ’žàþ¢‹—Ç翲=j ªiã陈�NqÏÀ¦) @€ž!�ÄÑ‰ÖØ¹ô�ùgÒ—È·÷Ÿ½ï§ãᇳ¼´.b©2 @€�%°Á}ÉèML€eÞ½y_÷ê5é'ÀÉw”©îz¬õïê‹ï{Å…±¼§½ËS @€”@༳:£ÿà±ØöäáLÕŽLD,kO¢¥É&÷Lp @€ @ héè‰Í�°(¾ÀHÃLÃüòŸ)~)* @€ùpŠl~×F2¨3�¾dÅ#j›ê¬¬Ò•315oÿý›cxöS} @€(¨Àû~âêXÞÝš9ýOÕ¢æ|ºÌn: @€ Pn�îîÿÇÞ�€·už¾ Hí$e[Þd˲dR’cÇ[âØq§MÒÄéM23mÒNæf:“;Û3½Í4ÝnÚflɹéí33�Þδ™,õ’؉µ’”d‰”µÙÚ7‚$Hjå�ààÜöµk¹ZpH,gùŸçQLâ¼çûÞ÷÷áyB/¾‘퇆Ü�à˜êµßéÙùŸÏ:¦ A@À¢ìànÑ…!-@ ÄZ³sš·šöOTuVèš’“rapT>º¶Q4�]ë\³ðŠ € €8H ðɼhP6íé6U•úÞ·x=šè•¼6G0 € €¸V 2�×ONHn#-Û ¼oÛð-ÛWA €Ø@€w,)"€8G`¤»sXoZÛ«*úŒsªrg%G»†¤F¯�•·Ö»€ª@@@l/pç²y²ëP¿ô]5UKbÜ�ÚˆG||Â`Ê�`@@pŸ€×땳—=ra˜»C;`õ½YÏÇFzö$P % € `yÞ~¶ü‘  €€Ó±Ž7õƖ媮»œV›ÛêÙ¾¿OÖ¯¨•ÅõQ·•N½ € € €Xuk­üÝk'$›5ò®(91-ªÉ�]ÜóF#@@\)0.Ur´ÇÜ—Š] eƒ¢ ѾÜÛþ\‡ R%E@!àqD� €€Íü¿­R6wp›Õè†t õ‰þWÿp›ô »¡\jD@@p Àò¥så7>mþ;øƒc†\Í¿)Þ�t”„ € €\W 2{1+ÞÙ0íÆ € € à|�ˆ‘m‡�_¨;*ìód¦¿áŽR©@ëx­“ ™ € à.�d¬³Wo\›ûÿ⻫rçU{qxB. ŽÊGZEÓ¸=»óV˜Š@@@g ø¼iZ•—ÚϘ*4×ÜžÛÃ}nˆ×¦àF@@G „BAÙu|\&§ùF°Ú#Ú¯öìxþˆj¡@ì$@ƒ»�V‹\@'�hzb§.©�ˆhKWœË :Ú5$Õa¯¬ºm¾Ë*§\@@@',[•£]ƒr:>lªœÑ ‘yaMü>šÜMÁŒ € €Žðy½rê’&‡§YŸëŠÒäû½mžw]ÝŒ €€<È�@p¯@ë·ÓžŒïK é^çTþ{ÿå Ùu Û9Q  € € €€«~ÿkë¤*XaªæÜî§/äþ—@@@ ™©”žóã@8CàÔ´ßÿo�Q U € `?vp·ßš‘1 €€ÃFzö E[âjŸ³§Vš+ËùeG¯||ÝR™«Wº²~ŠF@@°¯@$ä…WÚô™*b*-oïಋ»)8‚@@@ÀQÁðÙudÈQ5¹¸˜´¦eŸìßú,»›¹øI@é €å Á½¼þÌŽ €ÀÛÉôƵËÕ/wAbo�©é¬t>'Ÿ|p™ü>{Cö € € €®¸çÖ:Ù´§[.›Ûq01nH}Ô#^îëºç #€ € €€HD�È–ÃÂý­œòl0þ]¼íùŸ8¥ê@@À޼ÕlÇU#g@' þŠñßR…ñ p¬î‘Ø�üÞÿ³K2™¬ª¡@@@7 x=šüñ?ÿ�x4s»±§ÕKà®K¼vÓs…Z@@@à�Pe¥ì8:*Yƒöv'<'Ô*nŽ·Íûs'ÔB  €ØY€Üí¼zäŽ à(�¡³û&ç4­}C½`þŠ*ÌܧȎ’pF1GcÃ2§Ê#÷Þ¾ÀQ € € €€kÔTÉùÁ”¼uú’©šÇ&E¢!M‚¼­a Ž`@@°­€Ïç“S4¹8¢^q8Aàb…–þèpìO“N(†@°³ îv^=rGpœÀH¬£'ÒØâSØqʰ ¶ƒrï-s¥qÑ\VOÉ € € €vh¾s¾ühËIIM¤M•‘œ0d~Ô#&7€75Á € € €€UF³Ur¼—^h«¬Ç¬ó0äs=mϘõ8 € €³ Á}Ö„ € €@a’MOìÐeü£jÔÅ…™ÑÊ!°©3.kY,ÕsB嘞9@@@˜‘@Àï•ZõZö—»c¦®OgD<ª»=ZÉ.î¦àF@@Û ª¢òúÑ!ÛåMÂWÐ íÙxû†ç¯~–G@@ ÔžROÈ| € p�Öo§=ï3*Нú߀ʧGǧåÖ&C#);¤KŽ € € €¼'ð+�Ü,ëï^ðÞïùþÐ;˜•‰é|£‰C@@ì'ÑuÙ~ˆævû­Ü53>¨Êþ»kžå €”\€ÜKN΄ €ÜX`¤gÏP¤±%®ö:{úÆÑDX]àâð„\LÊ£Í âõðýB«¯ù!€ € €üƒÀ½·ÖËß¾vB2Yã¼ÁO¹Èñ)‘:�]Üo@Åi@@°¡@(T);��ÉT:kÃìIù*©¬GûH÷æ ç¯rއ@@ L4¸— ži@¸‘@²»ã-Õä~«ú(xÅ�b9o}�£±a‰5YsÇBë'K† € € €üÿÕzP&§3Òyäœ)“Üî¡€&!?Mî¦àF@@K ø|>9¡Ú /'Ô·z9! Æ×ûÚ6lqD1� €€ƒØBÔA‹I) €Ž0*4Ïo©ªºW™K úƒÿ~@¶î9ãÒê)@@@À®ßüü*iX ›NÿìŬÚùÝôe\€ € €XT@“‘é€Ä/Ž[4?Ò2+ ¾’ý£Þö�eö:â@@ ø4¸ߘ@˜±@¬õÙa�¦}I ÀÇÁ3V´Ö…_ÿÓv9ÑuÑZI‘  € € €×ø½ò__/šÉÍØ§Òê[û—yKã:´œB@@ ø«t9p:a£ŒIõÝ^Íó5cÜ ŽÓ € PoædJ@0!0ëè‰4¶øÔgÈ6q¡Hg i;Ð/Ÿz°IBA¿E³$-@@@®h\¨ËÉž!õoøÊ7ø-9!RÖÄŸ{gƒ@@°©€®ë²ùà�M³'í«d²†<ÕÛöÜ©«œã!@°€;¸[`H@� Ì�øŽúÞxÇ�â8o�îsIùW϶ÉÔtÆ “% € € €JàÛ¿¹N¡ Ó§/l‡gZ� @@@À*U¡Ji;œƒ}¾­²$³ÎC}û?õ·ox}Ö1 €M€Ü‹FËÀ €N```_6zSóv1´¢FeÛïÂÑ–m¤®þ¤¤§§å�UKÊ–#€ € € `F \Y!•Ÿ´î‹›¹L¦ÒêÍ µƒ{$È.î¦àF@@�² Tø|rìœÈåäTÙs!�‚ ´Çëþ™=ÊW FÊ@ €^€÷›2" €EHtuEÖöiš<]” ´ä{�]”%5¹ó¦º’ÏÍ„ € € €ÌDàžåµ²µ³W. ¥L]ž7¤.ê/÷•5åF0 € €”O@SÌ^š Ê™þ±ò%Á̅ʾ�&ñ_‡ =0ã!€ €@ahp/¬'£!€ PT�dwÇ›‘Æ–[Õ~g+Š:ƒ—L`Sg\Ö­¨•ÅõÑ’ÍÉD € € €ÌT ×à±âæyò¿6ŸÃÄ^wY›Ûɽ&Ì.î3µç:@@(­€á×eß©‘ÒNÊlÅx¦¯ýÙŽbOÂø € 0{öJ™½!# € PJ£Bóü–š°«”“2WñrÍ_ùÎV9Ós¹x“02 € € €XyK­<óÄí¦G¼˜4d8e¢+Þô \€ € €F ŽÊ®#C…ŒQ,! òñ¶ /X"’@@� Ðà~C"@°–@¬õÙaMË~Ne5m­ÌÈf¦cãiùòw¶È¥!no8SC®C@@(­À¿ÿò}R_2=éé YÉíæÎ� € €XU@×uÙzˆæv«®ÏÌò2ŽÓÞ5³k¹ @Ê!à-Ǥ̉ €³HÄ:ûõÆ–a5ʳ‰«­"02:%Ǻ.ËÇïoŸ�?Ѭ².ä� € € pu…WšEååö3W¸Æ£é¬¼Ýà>7¤]#‚‡@@@�ò TU…¤ýè¨Lå^¼p8E`R ãñø® }N)ˆ:@pƒÝSnXejDp¤@¢»c¯jr¿Sw‡# taQÝçFetlBZ³T4�ú]ø d@@@ÀV7©÷®þ„� šÊ;9!2·J“€�×¾¦àF@@�¢ ~9Ø“–‘1n¤]T讉öÍxûÆWJ<-Ó!€ €À,hpŸ% —#€ PN�š[VnÊd}ŸS9Ì-gÌ]8�ƒ§.˼ˆWî¹u~áe$@@@Š$°î®ò“m§$5‘65CrÂ�ú¨G}ÁÛÔe#€ € €Eðx<OTHïÅñ¢ŒÏ e0ä¥xû†o•iv¦E@�YÐà> <.E@ ÜCg÷M†—®Û©iÆWU.üÿz¹¤@óoßß/÷Ü£"óD²koªl01 €ÌX€F¸Óq! €ÖHöìˆ6®ÍÝ üãÖȈ, !ðêîylÍB©­b8Æ@@@@ h·,™#§z‡ådÏ�©9’jcÄê°&~Mî¦àF@@�‚ ø«¢²óˆ¹×3M€ÁŠ!`¨/UºoûóG‹18c"€ €@ñhp/¾13 € Pt�DwÇ‘¦æÛ4ÑV}2&(‰@&cÈÖ7âòÔý © ”dN&A@@@`¦ëî^ ?ÞrRÆ'Ó¦†HNˆÌ×Õ;ô¸›r#@@ #ÑuÙr�æöÂhZgC“?êkÛð߬“™ € €€Y�Ù ˆG@K •ãò›êæÞ§-™IÍH`àRJ¾ñm“ÑÔ䌮ç"@@@J%P­å;__ozº±ICz³¦¯ã@@@`¶áp•l94"¹­¾9%ðúüäÄrTEƒ €€ ØÁÝ…‹NÉ €Îì뜌4­ß¡‰ñUU¡Ï™Uº¯ª>Õä~ypTmn�‡íìÜ÷  b@@@À>·6Ì•c]ƒr:>l*é„ÚÅ}^•&~¯{MÁŒ € €3¨¬ ÈÞ3“26‘™ñ\hI�K†f9sÉ#熸‹²Í—òƒé«Þvã3ñ¶�>x‚ß@@À~4¸ÛoÍÈ@�ë $»;÷ë�k—« »®ÈI[ ì8tNn[\%·4ÔØ*o’E@@p—@(X!õóªä—»c¦ ŸVýðÕÝ­¤ÃÝÁ € € `R@“‘é�œˆ�š¼ŽpË hòûª¹ý¿Z>OD@�¼�&z%-î¦àF@@�÷<�œO¤ë\ê½ÇøÁ1g}š÷ÉáØž ÇTD! € p… îWpð  €ÎHÄ:.DšÔVߟrf…î­jÛ¾>YѤËMKªÝ‹@å € € €–¸ûæÙ{äœôœOšÊ31nHMÄ#|’aÊ�`@@xG í Ë�3 8œ'0™Íz>ÖÛþl—óJ£"@xW€·…ߕ࿠€8\ ÑÝy0ÚØÜ$¢­tx©®+ï•×»åÁ•õ² Vw]íŒ € € `�µ+æË7�”ét6ï„ 96)R¯³‹{Þh"€ € €ÀÛ�ª¨´BÙÿ¼¯ý¹Ÿ;³4ªB@�whpW‚ÿ"€ à�Ê[ÜìÉdžV ׺ \×”˜UŸø¿²3&�¯],ÕÑ�kê¦P@@@ûèá€DB~ÙöF¯©¤'Ó">¯&‘ Mî¦àF@@ÀÅ=*›ºXÀÑ¥ÿ�xÛ†ßut…‡ €o xp@@÷œßôgc^�÷³ªâ”{ªvG¥Éñ´üú·7˹Kæn÷îªD@@°‚À—ŸºCZÔNîf�Ø¥¬LL›½Šx@@p£@D�¨æö!1r·„âpšÀÑé€ÿëª(V×i+K= €\E€ܯ‚ÂC €8Y`$¶çb¤¡¥OÓäÓN®Ó�µ%Ʀeï‘sòÔ‡š$à÷¹‘€š@:Aµ@IDAT@@,.Ðrç|ù»M'$�Éæ�i®s!5%R§³‹{Þh"€ € àB�p¸JÚ�ŒÊätþ¯7\ÈdגǼ†ç#}Û¾×o×È@Ì Ðàn΋h@!�ìî8iliP ¯rDAñžÀ¹Áq9Û;(�¯kT·pçf=ïÁð € € €€%æD ø¤mÜT>¹Üý>MÂAšÜMÁŒ € €€KB•Aé<;%ÉTÚ%»¬LCûjoûsÛ]V5å"€ àjÜ]½ü� àf�HÍÊÍšß«vq×êÜìàÄÚO÷%$9š’¯^*šÚªŸ@@@+ Ü{k�ì8Ø'ý—ÆL¥52n¨]Ü=âãûܦÜF@@ÀéþŠ 9vNäÂð¤ÓKue}†h?èkîO\Yïšš)@@@ÀM“ïýË‹¿ÂÜ^¹ky}Éæd"@@@n$ð¡{Ê�·ž’‰©Ì�Bß;Ÿë~HNŠÔë_ä~O…@@p†€GÝ‘øB* gÆœQU\MàèD:øTª÷Õ+;@@àÜy& € €ÀUÆzßÓ—6ïRŸ Yð7ÃU•ìýàÖ}}²¢I—›–TÛ»²G@@pŒ@8ä—¥óuyuW—©š¦Òï„Ï q«2Sp#€ € `iMÆ%,ožMX:K’›�€6"†6lÑìH«ê†\ÙÏÄÛ7v`,†@@‡ Ðàî°¥@ -�èî8mZ»@�»¦Ðc3^ù²†!/ïŠÉ£«Hmu¸ü ‘ € € €JàC«ÉËígedtÊ”Çȸ!õºG<ô¸›r#@@« „"sdÛ!s_zµZ äs}C´ÿØ×¶ñ¯®ÅY@p«€Ç­…S7 €ä/¨Ì~SEïÉÿ "í$�OË~w³tÅy“ÐNëF® € € €€“ª‚òÜ¿~H|^scLL‹œ¹˜u2 µ!€ € àx�ˆ®Ë–|nåð…þI_Ûsìð)@f!Àî³ÀãR@Ü"0xº3]|ß/ �ö%µÛ|;páÇ'Ó²¹³Gž\× ‘ª€+¤$@@@» ,¬ Ët&+‡Ï™J}lR$Ð$ägwSp#€ € `�H$,[�H&kX R(’ÀáI-ý‰Tl¯¹[v)†E@k ÐànÍu!+@,'�èíLÎmZ»G½•ô¿©äÌmŸf¹jHèj‰±iÙy¨O>¾¾ABAÿÕBx @@@�’ ¬]±@Z÷ÅåÜ唩y‡S†Ôêññ†)7‚@@(§@UUHvOÉÄwe*ç:yîaÍk<2°ýûç‹<Ã#€ €€Íhp·ù’> €¥‰uôèMk‡ÔœO–r^æ*�À¥á 9pâ‚<±¾Q~_é&f&@@@®"àÑ4Y÷BùÑæ“2�οÉ%·ÙcJíX§³‹ûUXy@@Ë „*+eï™II¤Ò–Ë�„ &�Õ<ÚÓ½Û7ì-؈ „ €Ž ÁݱKKa €G ëØmlnÑVgF-·@ßÅ19Ù3(mi� .–{=˜@@p»ÀœH@ª£AÙÒÙcŠbbZÄëÑD¯¤ÉÝÁ € €”X  ȡ޴\N¨o©r8WÀ0þ}¼mÃ_;·@*C@�B бTHMÆB@À%úÂû_Ó¼Ù'T“û—”ìº2Ïö%äü¥¤éöI÷ùT‘gbøò hoMüŸ;ó:[ô—w!˜@[ Ðàn«å"Y@¬#0Úµw$ÜÔ¼_}<ü%•[gi šÉ¾—ÄïÍJËŠE—Á@@@0+PðÉ­ ÕòbÛiS—NgD2Y‘¹j'w@@°†€GÝAøB* 'ã£ÖHˆ,Š%0äÉxéßþ½ Åš€q@@À™4¸;s]© @�’$c�gõÆfµšö‘’LÈ$eØõæy©Õ}²ry}YægR@@@Þh\¨Ë`bBž¼øîCyý79!¢Wj¬ É=/0‚@@(¢@îÎÁ£™*y+–(â, m�¬G´O÷ìxvŸr!@°™ î6[0ÒE@Àj‰îÎÝÑÆ–ÛU^wZ-7ò)œÀÖ7úä–…!¹µ±¦pƒ2 € € €3¸ÿî…ò‹Ý1Q]ë&Žá”!uºG¼Š € €ÐdÊ–}§F <.ÃYOÀø·½mþÆzy‘ €ØA€·qí°Jäˆ €€µŒ -ýOUЇ­�&ÙÍVàßÛ)­{»f; ×#€ € € 0+�€ß+¿õ°ø+Ìíá3•9}!;«¹¹@@f' té<><»A¸Úò†ÈãmÿÌò‰’  €XVÀÜ»¿–-ƒÄ@@ œ©ØÞ)½iýf•×տ`9saîâ ê�¨Ÿïì–õwÕÊ¢:½x12 € € €7¨›z»Á}ÇÁ¾D^yz|J$P¡I8 ]y‚ß@@@ èþPTÚÞ,ú>!1åF0 € €³…£²õÍí³1´Éµƒ^#ûh|Ï.Ú$_ÒD@‹ ðö­E†´@°£@¢»óŒÞ´6÷ÎÔ“vÌŸœóH§ yåõny¼y±Ì�†ò»ˆ(@@@ , ©MØ?tÏ"ùÑ–S29•É{ôÜÊ’"õº¦¾§Ÿ÷e"€ € €À "zT6”ÜßâŽÈùdoÛÆýŽ®’â@@ $4¸—„™I@p�@"Ö±7ÚÐR/š¬qOÕî«tb2#›;{å‰uKEÝ@Å € € €–ˆ„ü²¸.,¿x=f*Ÿ©´¨·.D¢!:ÜMÁŒ € €€I�ˆ®«æöaÉÒÜnRÎ~áêÕÕ·â­þÖ~™“1 €XQ€w+® 9!€ `s�[jVnóWܯÊh²y)¤�djZvê—'×7H¨Ò�HN!€ € € P<�[ª¥«?!Çc¹›Êå$ÆEæViðÑäž¿‘ € €ä/ ëÙr(!é Ýíù«Ù4R“ÿoÛðolš=i#€ €€<̉”@@Àæûöýå´Ly>«Ê8eóRHÿ'º‡åk¼E£êÞî € € €”Ià�~û~Y\15{®ÅæÄ¹¬d²¦.#@@ò‡«dûá¤L§ùƒ;.»‡È&'~SÁ7ì¾’ä� €€…ØÁÝB‹A* €8I ß3^¶v“fÈ—T]A'ÕF-W ô]LÉÉîËòѵ�RáãÏË+uø @@@ þ ¯Ü}s�ütÛ)1L´Täzm¦3"óÂìâ^Šub@@w„«B²ë䄌M¤ÝQ°»«¼”ñfxý/.¹›�ê@@ Ðt Z”ñ@@à=�d¬ãòœÆµûÕçÊ_Trç˜÷dœ÷ÃÙþ¤ÄÏ Ë#kÄçc©�·ÂT„ € €X_`Q]X&§2Òyô¼©dÇ&Eªš„ü4¹›‚#@@�«TòFlZFF§¯r–‡&0-šç“ýÛ7rX]”ƒ € ÁÝ‹@  €8Y`¤»ãl´qmîûwr�Ô&r¼{DÎ_NÈÃk–ˆ×K“;Ï @@@�Ò ¬½k�lß×+çS¦&7¤.â^Κb#@@�+¿î7äâ°ú)‡ãÔW„#ÞöÜ‹Ž/”@@ ,4¸—…�I@p—@¢»co¤±¥N½ÉqŸ»*w_µGº†dxdL¼W5¹{hrwß3€Š@@@�ò x<š¬SMî?ÚrR¦ÓÙ¼“ɪÛÏ�M‰Ôéìâž7� € €¼O ¢Â'§/iÒwiâ}�ò£ƒ¾oÛð§®�Ò@@ Ì4¸—y˜@·,¯Y¹9å÷­Sõ.sKÍn­óÐéA—V-‘\c € € €¥˜«eN$ [÷öššvbZÄçÕ$䵬)8‚@@\/àóz¥/á—®swRr=œmŒãmó~S¤U}U˜@(Ž îÅqeT@ø€ÀÀÀ¾ìœ%÷þÜðxŸV§æ}à4¿:L`ÿÉË255)÷¯\,šFc€Ã–—r@@@Ë ¬¼¥VŸ¹,gûFLå:2nHu•&~¯eMÁŒ € àZ�º£ïåÉ ïu­�Ë ?0|bìÌ©{`q € €Å Á½x¶ŒŒ €éyc"²dÍ&Íãùuu*ø�Óüê0�½Ç.Š–MËÚ»Ñäî°µ¥@@@À­^,/·Ÿ•ÄXþ}¹ísMîõºG¸)™V™@@Ê)�knO¦CòfW¢œi0wé Íxd`ë³—K7%3!€ €€[hpwëÊS7 €eHöì½YÖò†fÈ3*O™Ò`Ú ì9rA^Cî»s¡jr/ѤLƒ € € €€ú}²ú¶:ùɶS’ÍæZ×ó;Ò‘É´HM˜²ù‰… € àF�Ü|DzUràŒ¹»&¹ÑÊ!5�kZö£ñÖç�;¤Ê@@‹ Ðànñ"=@œ(�ŒutE›/Šhwb}Ôt¥ÀÎ7ÏIDí׿úŽWžà7@@@Š,° ¦JBAŸ´íï35SJmúî÷iÒän Ž`@@WäšÛÇ¥Jö�¢¹Ý ž+Ò£}!Þºq«kê¥P@(» îe_@@À�‰îÎ7ô†æµ­w³;ÜUuÛÁ©‰xeå­óÝU8Õ"€ € €”]`õmõräìe97×|3œ2¤ºJ{»Ñ½ìE� € €–ÐdÊ–½'Íý}m™ôIÄ´€ºÖèkÝð—¦/ä@@`4¸Ï�K@@`v‰¦'7ë2¾V�rÓìFâj;lÛ×/ çúeÅ-uvH—@@@$ððê%ò³g%1¦¶fÏóPM’kr¯×=j³Â6äÜ©ì ÍÐvªŒÏžîT¯Š8@@�Ò Ðà^ZofC@� ÇöLè -¯‰&_R§*?pš_(ðËŽ^Y¾¸J–7ð�./%!€ € €–˜?¯J¡ iÝ7•cJmú^áÓ$¤ÉÝÁ € €Ž0üº¼~”ævG-êõ‹éJÆc=[7&®ÆY@@ 84¸Ç•Q@@À„@¢»c0Òpß^MÓžQ—yL\J¨M^ÝÝ#+t¹iIµM+ m@@@; Ü{k�ë”ÓñaSé§ ©®ÒįÝ9@@p›€ÐeçšÛ]´î OÖx´oÇÆnÕL© € `1Ü-¶ ¤ƒ €€[’Ý�]‘†æ ªÉý)·¸©nCÝ þg»b²êæ¹Ò¸h®›J§V@@@�2 <¼z±ülçYU[³›8rMîuºG<ô¸›P#@@ÀîÞʨ´¿Es»Ý×ÑDþÍ£=ÝÛ¶a�‰kE@ .@ƒ{ÁI@f* šÜ÷é�ks[z·Ìt ®³�@®Éýå1i¾mž,Y0Ç>‰“) € € €€­~¯Üwû|ùɶS’ɪ§yé¬ÈÄ´HM„÷<ÉC@°¹€O5··½9hó*Hߌ€&Ú¿èm}î‡f®!@(† îÅPeL@˜±@¢é‰-º‘jM»yƃp¡mrMî/µÇdýŠZYT¯Û&oE@@°·@ý¼�èU~Ù¾/nª�”Úô½Â«I$H“»)8‚@@l'àEe;Íí¶[·Y&¼1Þ¶á÷g9—#€ € Á½ Œ ‚ €ˆµf«›Öÿ<+Ƨ՘5—�,+�U]î/¶wÉ+ëeAmIJy’ € € €€³VÝZ''»‡äTï°©Â†Ç ©®ÒÄï£ÉÝÁ € €¶TEeÛ!vn·Í‚&Ñ_Ƶꯈú¬¶0Ã1  € 0;Ïì.çj@@ ð±Ög‡Eó~B�Ì;g…çµäˆ“Óùü|MÞ:uÎ’ù‘ € € €€3þì›JÃswËÝ�ìø@VÒ´}8óIAU € €€Ë*ÃQÙz��èÜõ40Žø+&~MZ¿�vWÝT‹ €V`w+¯¹!€ àb�DlÏ`xÙ}»4C{F1ø\LášÒÓµ“û޳òðªRWvMÝŠ € € P>…W^~²í”dÔëÒ|�\sûø´Hm„]Üó5#@@Àú¹æö-4·[¡ ›á%¯a<Ûþv¡*¬+£!€ €À,hpŸ% —#€ €@ñ’±ÎÞHSóqM´ÏªYøÄ¸xÔ–yz:+/¶wÉC÷Ì—ºy4¹[faH@@p°@}uH¢UÙöF¯©*ǧÔ7ò½šD‚¼ea Ž`@@K „"ï4·çîXÄá�©¬'ûD¼íù7]S1…"€ €€mhp·ÍR‘( €îPMîG#�kê£âÇÝ)ྪ§T“ûË;bòÀÝuR_q#€ € €”\àžåµrºwXNö ™š{xÜ�ê�&~Mî¦àF@°”@••Í…ævK-Kñ“Ñ´¯ôµn|¥ø1 € `^€wóf\� €%HvwìÑ›Zæªi×–xj¦+“ÀÔtF~¶³[>tw­Ì§É½L«À´ € € €€»>¼z±¼²³K†G'Mžkr¯Ó=â¡ÇÝ”Á € €ÖÈ5·oÚOs»5V£tY†ö}mÏ=Wº™ @0'@ƒ»9/¢@@ L‰û–nÖÇôjúÛ˔ӖX ×äþÒŽ.Õä^G“{‰í™@@p£€¿Â+-+æË�·ž’LÆÈ› �Ÿ©�Ðáž7� € €–ˆ¼ÝÜ>ÄÎí–X�Ò%¡^¹ü8Þ^ý ‘Öü_ø”.=fB@Þ Á�' €ØCàèQC_¸þgâÍ>"¢-±GÒd9[�iÕ%ðb[®É½VÔ곎ë@@@¸®@ÝÜ�ÌÕƒ²uoïuã>xr|JÄçÕ$¤Éýƒ6üŽ € `M�\sûkû‡$kÐãlÍ*ZV�Ùщ§“®^Åp € €Ö ÁݺkCf € ð�D|O:ÜôÀKšdŸV§æ}à4¿:T �y§É}ýŠZYXG“»C—™²@@@ˬ¼¥VÎÄGäD÷�©œ†Ç ™Ò$à£ÉÝÁ € €%ˆèºl:0Ls{ÉåË=¡qZí-õèÀžŒ”;æG@n$@ƒû�„8� €–HÆv§¢75¿*†ö•X•¥’#™¢ ¤Õ­á_ØÑ%ëE4¹Í™�@@@ÞxhõbyuWL†’“¦H†S†ÔëñxL]F0 € €%Èíܾùà°d²ìÜ^2tkLtQóÊÃýmãÖH‡,@@�ë Ðà~}Î"€ €€]�Cú²µíbÈ3*½ ¦HJEȨ&÷Û»díí5²¨>Z„@@@�wü>¯´¬X ?ÙzJrwË÷È…¦¦Dj#ì➯q € €¥È5·o:0Ds{éÈ­2SJm×ÿx¼mãa«$D € €À�hp¿‘ç@@À’‰XG_tYËaÕäþ9• Ÿ[r• ŸÔÛMîm]Òrûgvn/ ¸u&Éšö+}í¶['%2A@n,@ƒû��ˆ@@‹ ¨&÷ц–˪½ýI‹¦HZEÈÝ2óEÕäÞ|{µ,™?§30$ € € €ïÜ}s�tõ�ÈñØ�)’‘qCæ†4 øhr7G0 € €@Qª"¹�Û…Þö¢ðZ|Pík}mÏýÐâI’ € ð�hpÿG$<€ €vHtwìÕ×V©œï·SÞä:;�Üî"/¶ÅdÍmÕ²tMî³Óäj@@@�ë wÐYeQ  €¸Y€w7¯>µ#€ à`�DwÇ)½qí€*ñ.“Ò®!�kr_¾8,Ëæ]#‚‡@@@˜¹ÀÒù©ªôIÛþ>SƒŒNªÛÍù4 ir7G0 € €À54u‹ ´/,»� _3†ŽÈjšçsñ¶g·8ºJŠC@× Ðàîº%§`@Ü# šÜ÷GšZ*ÔGƺ§j*}Wà•×»eqM@î݇ø/ € € €X}[½tõ�Èñ˜¹]2‡R†Ì iP�î € €ÌF ×Ü>!aé÷¨K (@\ @ƒ» ™@@@dèì¾ÉHSóÏÔ¾h¿ª<¢˜¸O`÷á 211.ëî^¤nÏ=àÝ÷  b@@@ xKê#UHÛþ¸©IF'Eü>MÂAšÜMÁŒ €¸TÀçõÊÅñ ‰ÑÜîÒ§@®ìCÁ ㉾›r±¥#€ €€ hpwÁ"S" €¼#�Œu&"KÖ¼ªy<¿¦©ÂÅ}o¿$—†’ò¡{–ˆÏG“»ûžTŒ € €OàÞÛê¤ç\BŽu ššd(eÈœJM4¹›‚#@p™€Ïç“sc~9Ö3ê²Ê)÷}=Z:ûHl÷ó—Þ÷?"€ €Ž ÁÝ‘ËJQ € p-�dÏÞËá¥ë¶jšñE¸V�;Wà­3CÒ{nH>|ïñWðç°sWšÊ@@@�Ò <¼z‰l#.†Ìm¦88fH]Ä£î8Vúœ™@@Àúª¹=žðÉÉø˜õ“%Ãb {²Æ#½;Ÿ?[¬ @°’=VZ rA@�’${ö èMëv‹_PúJ2)“XJàx÷ˆœèº$­Y"A?OK-É € € €6ð©õ‡ï["/¶ž‘ÔD:ïJ²†HbB¤N×Dc#÷¼ÝD@Ü à¯¨�žaŸœé§¹Ý ë}�'51žìm߸ïçy@pœ îŽ[R B@�|±=±è²–·Ä�ϪxöGËÍa1gû“ràø9ydÍb ý«Žr@@@Ê% ùåžåµò‚jrÏæ:×ó<¦T?|îß¼0îy’† €8^  È©‹šÄΛ»C�ãaÜU ahÆâm鮲©@Ü.@ƒ»ÛŸÔ� €€‹±Ž‘†–nµ3Ú§]ÌàêÒãÆdס~yì¾Å\mAñ € € €…X\]5º·î‹›tlR¤Â§I$H“»)8‚@@ „*ƒòf<+ý—ÇX%™øf_ÛÆÿn"žP@@À4¸;b)@f*�ìî8mlIªëŸé\go� Cã²mo¯jr_$z8hïbÈ@@@À2«n­“ÞsI9Ú5h*§á”!s*5 TÐän Ž`@@ÀAUU!Ù{fR.%¦T¥˜0~OíÜþ§æ¯ã @@Àþ4¸Û ©@f)�èîØ­šÜsÛw?0Ë¡¸Ü¦ƒÉIùÅë1ylÍ"™«WÚ´ ÒF@@°šÀ#k–Hëþ¸œL™JmpÌ�ÚˆG|S—Œ € à�H$,;Ž�I"•v@5”0cMžSÍíÿaÆ×s! € `sÜm¾€¤� €…PMîÛôÆ–j´Õ…‘Qì&�LMËË;ºäá{HÍÜ*»¥O¾ € € €ðz=’kr¡õŒ¤&òoPÊ"‰ ‘:]��Ü-¸²¤„ €G@×uÙúVB&¦²Å™€Qm! ^üu¼µú·EZÕ+@@À�4¸»sÝ©@®"�h^ú },r‡:•ûÇáB�ñÉ´ü´íŒ<¸²^êçE\(@É € € €…ˆ„ü²jy�ü}ëiÉæ:×ó<¦T?|îß¼0îy’† €ØZ ¢GeóÁa™Nçÿ7£­ &ù« òR\«þ’ľ�¹z�"€ €î ÁÝëL• € ��ÀÑ£FÝÍ/g¦µµ*|Y>—ã<�éé¬ütÛYY·¢VÕéÎ+�Š@@@J.°¸.,sÂÙþF¯©¹Ç&E*¼šD‚4¹›‚#@°™@U$*› IÆÄ"mV"éæ% móyŸn}v*¯p‚@@ ÐàîàÅ¥4@0/0xº3hZý‚O<�©«™�+œ �{ù§ÛÏȽ˫¥aá'”D  € € €e¸gy­Ä/ŒÊѳ—Me2oßÐfâB@@× Ðàîº%§`@˜©@"Öq"ÚÔÜ£úÛ?=Ó1¸Î]IÙ{¤_\µH"UgE € € €%ðz4yä¾%òBëiIM¤óž?kˆ$ToT�®‰Æ×ðóv#@(‡@UUHöž�’K#“嘞9­%�54ã ñ¶�?³VZdƒ €XO€wë­ !€ €€…±ÎƒÑÆ–¤Jñq §Ij%¸<.­oôÊ+ë¥:*ÁŒL� € € àD�pe…¬¾½^^l;#™Œê\Ïó˜ÊˆLL‹Ô„épÏ“Œ0@@ ä‘HXvOIbLýáÆ�€¡ýF_Û†ÿ  € €À�hp¿± € €À‰îŽÝªÉ=·m÷Wœà× &'åç»b²þÎZ©¯‰¸®~ F@@(ŒÀÂÚ°,­×å—»c¦LM©pµ…{´’&wSp#€ €%Ðõˆl{kTÆ'Õ79\/ þlÿ?âm¾ïz@@�<hpÏŠ0@@àýªÉ}›ÞؼP}мúý�ó³ûr·�ÿû¶.Y}ËYº`Žû¨@@@  ·5V¿=Îî·L�72nH¥_“ªMî¦àF@Š(ÑuÙ|hD¦ÓÙ"ÎÂÐvP©ÿqoÛ†ïØ%_òD@¬ @ƒ»V�@@À–‰æ†Wõ±È*ùÜ? ¤3YyA5¹ß¼0$Ëk\,Aé € € €³Xw׉õ'äxlÐÔ0ƒc†ÌQ»¸*hr7G0 € P�ªHT6–LÖ(Âè i7Í�¿èmßð¯í–7ù"€ €å Á½Ü+Àü € `_�£G�%á'^š �¯RE,·o!d^C½OýÊë=2/â••ËççîÏ� € € €€i�Çš—Jn÷¾‹£¦®Í5¹×„=âã“Sn#€ €…ðWEeëÁAÉ}fÀ�€zü0^?ðÏäèQ¶òçé€ €˜àmN“`„#€ €ï¸x±5SÝtû Y 4«Çozÿ9~v§À¶}ýbd§¤yÅBñxèrwç³€ª@@@�™ xÕkÉ�®m�_¼“áÑɼÊm:”2¤N÷/Góf#@(ˆ€¦v½ÉøtÙqx¨ ã1ˆ#^�?:ñù�-“vD5� €”X€÷ƒ3 €8O`8v0®Yù÷šß·^U×ä¼ ©È¬Àž#äÂå¤<°j‘øØ:Ï,ñ € € €€ë*>yhõby¡õŒLNeòöH«Ð\O|mDãÎby«ˆ €ÌNÀçóÉðT¥ì;52»�¸ÚI;²£Ÿ:¹ï/óÿƪ“ª§@@ 4¸‘!@@�äÀ¾é@ÓêŸVÞ‹&KAàðÙA9öÿ±w'Àmžù�ç/‚ž"uS”dÙò}È:ܾ﫻Ýg’™©ìÌÔìd§v6ÉÔΦv·6[©­™Ùª¤f&–z:É$5;IºÛv·ÝnÛíK¶$’’,’’lÝÖI$(J¢ÄàÀ»Ô�nË­ã\ï÷­b™Äû¼Ïóÿ”E€üßÎ~=¾n™Šý>@@@@HK *T¢{n®ÓÏšÏ(™jÏîðˆOI“¦GdM€»Š9$c € 0c�’b¿:<:™ñ\XpüEñgºwÿWž·µ$„ €™ À=“Ú¬… €-0Öµw²náú×§}Ö&Ñ%�,É9è8Ó'zõäýËT^æwt ƒ@@@ø�eõA-ª-×GmáxÈÑGMŸH�ÇR¨”"wG` B@f P^Vª= õ^ŒÏàj.)P�“SS“�Gšÿj @ó#-@@ c¸gŒš…@@À ½í•Ëî}ÃöxŸ6ù.rCÎäx}�sãú°µKO¬[¢Ê`éõs@@@�/ ܶ²FS í=vþKg®ÿãИ­²bKe~ŠÜ¯/ÅY@@ }�`(¨]ÇÇ44bnŸÃ�À/ÎÈë}¬¯å{çA@˜½î³7d@@à �áî}ñ@ãƒoXJ>oNÔ]q’\)0<2©Ÿî8£GïY¤Õå®4 i@@@�™ ŸºÌ� €®ˆuí«Y½ñ§É¤^4µ®… ñ_ Ä'úɶÓZwK�–-¬øÕã|ƒ € € €€�§Ö7hç�³:wiÔÉðËcL¡�REî ‚ù<Ž/c  € €À5J•ÚúÙ€Ô¶_CÈ�Û=E–÷Ñž–—ÃnÌžœ@@�ù À}¾d™@\/0ÔÙ6Z±ôþ7å±^2Õ®À¼ámë ÓÉ}y]‰n]¹@@@ ø¼=µa¹ÞÝÝ¥èè¤ãëÌKQ �™[Ì…,ó…ãˈ € ðË2¿HùCj:4ð…GùõZ^=Ú½cs' € €s+@�ûÜz2 € p…@´§=X¶ñgòèæ­ÏÊ+Nòƒk>hí‘OÓZwë"y¨.píó€Ä@@@�tÊJŠôð=KôfÓMN%_ž::!ÓÉÝRª6‹@@À¹€×ëUlºLí'†œ_ÄH7ôÙ‰Äc‘æï�vC²äˆ €dZ€÷L‹³ €¸N ÖÝ6\ÝpÿÛ¶e}Ë$r _Uà“ÃçuîbTÞµDEEüZ~U$D@@ø �šŠRݱºVo·t(i›öì�ø”4m ݫ˩pwHÆ0@@@Åþ"õD}:Ž¡�À¬ ^ÛóxÏÎ-'¾ð ß"€ €Ì¡•4sˆÉT € €Àµ†ÃíCÁeëÞµ<žï˜1�k�ãqw éÔ¡“çõȽKTVêwWòd‹ € € 0c�†E!ÕT–hû¾ž´æ1]Ü}^KÁŠÜÓ‚c0 €¸R ¬´TGÎ&Õ}aÜ•ù“ô5.š»"=ÞÝüò±kŽà € €À¬(pŸ5! € €ÎbÝ{/U._ g4‘@IDATÿ¾éäþ]sE¹³«Uèáó#Ú±¯[ß½HU¡ÒBO—ü@@@æHà®›(66©O�_HkÆÁ1[Sà^ê§È=-8#€ €€«‚Árí9ץ褫ò&Ù Øû‰HÓ–Ã7É@@�Y Pà>+>.F@Òînï-ßø¡,ý–¹’jæôø vô¥è„ÞÞÙ¡õkkµhA¨`ó$1@@@�¹xøž¥:ÒqI½ÃiM<0j«ªÜ’ßG‘{Zp F@WC!m;ÓX<áŠ|IÒ±ÀP2éyòlóæޝ`  € €ÀŒ(pŸ1"€ €3ˆv·�¯\¹a›m[©"÷’™ÍÂU…&0>‘Л;:´vy@«–ÕZzäƒ € € 0–©OzcƒšöGtapÌñ ¶-¥ŠÜ=òz_Æ@@@ àʃ•ÚúÙ ¦æ&~-UÒ~ºwçæ}¿~ˆï@@æS€÷ùÔen@@àÃ]m}ÁÆõM–¬ß6CüׯÃ.H$m½½+¬š€Gw®©—•ªTà@@@@à:E>�žÜ°\ï˜;ƒ�ŒM]gä•§Iix\¦ÈÝ’‡—ŸWâ𠀸PÀüNTR¡íDi» ·ÿú)�Øò<ÓÛ²¹íúÃ8‹ € 0—¸Ï¥&s!€ €iĺÚ#+Öï’.wr/JãR†¸Àöýg5>>® ·/–�Vz¾Û¤‡ € €Ì^ PZ¤î\lî vFSÓ¦rÝá1™�Æ&¥ZSäN�»C4†!€ €@Á x<�+ =Ÿ\n$4k�1Kös‘æÍ»g= € €¤%@�{Z\ F@æV nï6Üßj:uÿ–™Ù7·³3[> ì;~Q§»/é¡»—¨¤˜Ï?äó^; € € � �ºª2ݼ¢Z?7�Üí4ÚŽŽ›¦ïIS_UN‰{&ö‰5@@ ·üþ"�ñëPg4·#š\—åyÁ··äB0Ä€ €¸M€w·í8ù"€ €@Î ÄÂí�¡Æ ûM`ß5_ü~–s;”½€NE¢Ú} ¢GîY¬P ${�°2 € € €@^¬ZR¡@™_ÍŸFÒŠ7—Š|–‚%¹§Ç`@Èk�Ò’b?'užËë<~^&’–ýÕÞ¦ÍÛçev&E@¸¡T7$b € 0ÿÑ®¶Ó ™û�Ǭæ™ÿY!_ÎÆõó–}åÎ:ÕUò%lâD@@È’À½·ÔéÒp\Oõ§ÁШ­`©¥Ò"ŠÜÓ‚c0 €ä¥@0X®öŽI]šÈËø z^&Íßë^êmÚ²u^War@@�ë Pà~]N"€ €™ˆ†ÛN×nÉú¶Y•¿&gŽ>çW�Oë'ÛÎè®U•Z±¤*çã%@@@@�ì <¶n©œìWW_4­@L‘{MÀR‘—·%Ò‚c0 €ä•@0T¡�E•zï��/ LÙ–õ-Ó¹ý½/=Î� € € À=Ãà,‡ €\O ÖÕ~,Ô°ñ´)oÿ¦Ç_“¯‡å²s‰¤­7[:U_é×7Õ¹,{ÒE@@HGÀ²,=½±AÛööèâиãKm[J¹/yäåþrŽÝˆ €ù"`É_fŠÛ (õž;_H˜Ÿ¿ÛÛ¼ùí/=Î� € €Y À= è,‰ €\OÀtr?jXoŠÜ­—Ì8ŠÜ¯‡åÂsï�hb<®�w.6ÅT¸ð)@Ê € € €€#‘WOÜ¿LoµœÑXÝII)jjâëBæs¼+áÈšA € �û^¯Wcv™>96”ûÁa6¶¬ß1ÅíodcqÖD@øM ÜÓ„G@@�¬ DÃí‡+6ž0åíß0ÁPÅœõÉ­öïשð€»o©ü~_nG4 € € €9#*÷ë�»ë­æ3šœ6•ë�ÉiilRª Päî�Œa € �Ã%%Å zt,<’ÃQZ’²­ßímyùµ,ÆÀÒ € €_ ÀýK üˆ €䊀éä~4´rãQÙú¦‰‰"÷\Ù˜‰ãTdXMŸö˜"÷% •—äHT„� € € �kõÕeºûæ:½³³C‰¤í8¼qSà>•�ªËiãî�� € �s�@¹öuNêì¥xÎÅF@9!`Û¶õÏLqûr"‚@@ø•î¿¢à@@ ÷¢]mŸW¬ÜpȹËDÇïn¹·EY�¨0®×·ŸÑWî¨ÓÂÚ`Vcaq@@@�ÜX¾0¨•K*ôþ']æ-çÇÈ„.�¯,£Èݹ#@@ W‚¡�¶ŽidÜÜž†�«X¶ý/"-›ÿûUNñ € €@–(’Êò°< € p#Sä~"ظñ3ó§äo›±üþv#0—��O&ôÚǧµzq¹Ö¬¨uYö¤‹ € € àTàæ†*U‹ÍÝÀ"N/¹<.:.y-K(rO ŽÁ € �U�âò }t`P‰D:ïËjÈ,žaÓºýŠ´lù› /Ër € €(�rÅ0@@ ›±®¶“+7î5mÓREî¾lÆÂÚ¹'`›÷çßý¤[{Z÷ݺP^�'÷‚$"@@@�¬ Üss�¦¦“j?z.­XÇl•[*óS䞃@@ ã^¯Wã*×î£C_›óFÀ–mý�½-›ÿ:o"&P@@À…¸»pÓI@òSÀtr?\¹¡Õ²õ“AQ~fAÔó)°çÈy�éЃw/VI1O‘ù´fn@@@ _¾r×b�»4ª#g.¥•Â¥Q[!ÓŽ¤ˆ"÷´àŒ €()ö«g¨HGºb[“…òN )Ëú"Í/ÿmÞENÀ € €€Ë(pwÙ†“. €ä·€éäÞjÜ´[²SEîþüΆèçCàdϰZÌíæ¼k¡*C¥ó±s"€ € €ä¹Àë—ëhÇ€:z‡ÓÊ$Uä^UnÉï£È=-8#€ €À¼ åÚß5¥Þ‹ãó¾ ä­@ÂÜ÷õ6o~%o3 p@@ÀE¸»h³I@ C ÚÕÚUÙ¸±Å–¾k2¢È½0¶uN³èŠë­æ3Zwsµ–ÔWÌéÜL† € € �ÿ–eéÙM+´çð9�íqœ�)Ò¥[µ�|ü…ɱ@@`~B¡�¶Ql|z~bö|˜²,ÏwLçö7ò9 bG@Ü$ÀÛ�nÚmrE@�‚îjë®ØÔdý¢“{qÁ$F"s&0>™Ðë;:ÔPW¢µ+ÌÙ¼L„ € € P>¯GÏ=°BÛövëÒpÜqRISä>`:¹/zd¦à@@²*P\^¡� j:a~Iá@àê¶Çþf¤ió;W?Í£ € €¹(@�{.î 1!€ €báÖHhùúí²¬ï˜á%.aˆËR�õÞoí‘==¡ûÖ.2Ýõ¨ÛÛ´ygá§J† € €@a Pà^˜ûJV € à2�XWûùPÃýï›–iß6©—»,}Òu(pqxBoì8£»WWjù¢J‡W1 @@@À  kÊuǪZ½³«Cɤí8å1Sàžª‰¯.§ÄÝ1@@`FÁPHMGF›šÑõ\ä�!%í§{›¿×ꚌI@(@ Ü pSI @Ü) ·_¨\¾þݤ)r7R¸S�¬o$0iªÞlîPmЧ;oª3Ÿ‰ áFfœG@@Ü"°bqHËëƒÚÚ–ówi$®Ë¯/+Jy�é–ç y"€ �i�’ò }|`HS çw›ÉtŒ¬——’IÏS½;7ïˉh@@`Æ¸Ï˜Ž @@�Üînï®ÜøŽeë›&º`îEHD¹ `›*…mûz504¢Mw.Q‘�—¹°/Ä€ € €ä‚ÀÚÆj•—©å³Þ´Â·å÷Y ”P䞃@@àº�Gž€vLëx×�”“*`]��|·,ÐI @p••,®Ún’E@7ĺÚ.…x[²SEî!7äLŽ38xz@íGûôȽ‹(+žÙ$\… € € Pp÷­­×X|Jû?¿�Vn£¶Ê‹-•ù)rO ŽÁ € pU�Ò’buùt¤3vÕó<ˆÀú¼¶çñž–ÍG¿ðß"€ €ä±îy¼y„Ž €\K ÚÕ:P¹ì�·l�ý 3¦âZãx�ÞþQ½ÕÒ¡ï\¨Õå€ € € € pYàá{–ªç\LÇ:ÒI¹‡J-•Q䞃@@à �`0 ÖÓqõ L\ñ8? p�ˆiïÿXOËË'®rއ@@òT€÷<Ý8ÂF@n$0ÜÝ:X¾jÝ›Ûóu3¶êFã9ï^�Ññi½öñ)­YÐMËkÜ Aæ € € €W<µ¡A‡N]TçÙè�_ïÛœ±UUnÉï£ÈýzVœC@�« ”*ôñÁa�O&¯>€Gø¥€ùݳËg'íiÙr@@� À½°ö“l@@�+F:÷¾òSËJ|U²ª¯8É|A ™´õή°¦&'µþ¶…òz=_8Ë· € € €nðX–žÝ´B»�UßÅQÇæ%¦R�ÜkùøK”c7"€ àv¯×« + �Ge§>5Ç�ÀuìÓ¶]ôh¤ååðu‡q@@ /x[1/·� @@ç±ðžhhÕW~jÞ ~Á\UëüJFºQ ýØ}vüœ¾g±ÊKýn$ g@@@�/ùŸFeÚ}lHæ­hœìõ$¦žŠ´lp2˜1 € €ù-@…J~ïÑ#€ €i Œuí�¬»uýkÓSÖmæâµiOÀ®øôÄEí=Ú§¯Ü¹P¡@‰ëò'a@@@�_ ,^ÐÚÆj½»«SÉÔ'£c“Ò´©‰¯*§ÈÝ!Ã@(X�²²R�8/�ˆŒlŽ$6矔Äíg:÷ü—á9Ÿ™ @@rR€÷œÜ‚B@æW`àt{"ÚøÜAÅ—›?+ß=¿«1{!ôö�êgMgtßšj-©¯(„”È@@@`†+—Thñ‚r}ÔNk†X\òx,…J)rO ŽÁ €�@0Ô®c£º5Ÿ~ã@À‘€Ý4a%ž�ìþ/1GÄ € P¸Ä6’ € 0�®¦d,üÜ; ñ YÚ8ƒ¸Äec ½¾£Cu>ݶªN–EA‚Ëž¤‹ € €üJà¶•5òyµëàÙ_=æä›¡1[ÅE–ż¦tâÅ@ GÀ’¿¬BÔä´ó»ÀNþd2C�÷’#/�ßó—£3¼žË@@òT€÷<Ý8ÂF@æF ÉŽ†Û¶V¬Ø�0ó=67s2K! ¤î>ÿñÞ^ �èþÛªØï+ätÉ @@@à:ëÍëÂøÄ´ö}~þ:£~óÔਭ2Sà^æ§Èý7ux@�Â(òù44UªÖãC…—ÍŸ€¥Ö�Äçäþÿ:1‹03 € €@® Pàž«;C\ € €@L‘{Khņ³äs\–¥òXààéµéÕ†[ëT*ËãL@@@`6ݳDÃ#úìDZÓ\2Eî©.§åÆ`@òM ¼¼LGÎ&uæ, ¸ómï²ï–HsõïõõýÇTƒ&@@ PàîÂM'e@@àj¦È½=ذ±Ó²ô5sÞsµ1<†ÀÎ^×›Mº£1¤†ÅU_<Å÷ € € €.xì¾eº00¦Ã§/¦•õÅ[¡K%EtrO ŽÁ €ä‰@0RÓÑ �LåIÄ„™¶þ$Ò²ùÿ�šÌ=e9@@Ü*@�»[wž¼@@�«ÄÂm+Vn8([ß0§}WÂC\!ŸLè§Í� –Hw®©—ÇCQÂ@ü€ € €¸Dà‰û—«û|TŸw¦nçü¸\ä^J‘»s1F"€ �û–é¤ã+©Ð¶ƒƒšNP£œû;–Sþ¾)nÿÓœŠˆ`@@²"@�{VØY@È]�hWÛ‰àŠ »M™ò·L”þÜ�”ÈrI ù³>�鹤¯Ü¹H¥%E¹± € € €d@ÀÔ±éé� :ÖÉîAÇ+¦JÞ.™Nî•e–Š}|hÚ1@ÈQ¿¿HãÅÚ{r8G#$¬˜–mÿn¤eËßäh|„… € �a Ü3 Îr € €@>˜Nî]¡åë·É²REî¥ù31f_àdϰÞoíÒƒwÔ«¦²<û € € €@FRÝZŸÙÔ c¦‹{G¯ó¢6ÛT¹_.r/·ä§È=£{Æb €Ì¥@ P¦ƒÝ u�›Ëi™«ðâ¶Çþfoó–7 ?U2D@p*@�»S)Æ!€ €.ˆv·÷V®|à]Û¶_2©]–>éÎP`(6©W·žÖš¥Ý´¼f†³p € € €@¾ x<–žÿJ£œìW¸/ê8�¤)r¿h:¹W›"÷"/�ÜÃ1@�†*´ýpLѱ鉈0òCÀöXÖs‘¦ÍÛò#^¢D@Ȕf@@ †»Zû«îÓ¶¬¯šð«ò0B΂@ÂT%¼³+¬ññ¸î¿u¡Š|¼ìÈÂ6°$ € € �5¯)rÁ¹ï=v^‘ #Žãø‡"÷šr�)rw|@@ ‹^¯G _P; *õÞ0N̳å¼<ö¦¸}¯Ók‡ € àÞtÏ^“) € 0#�ápûPÕòM?±-û3AÝŒ&á"W ì;Þ¯�ŸEôÐÝ‹T(q¥I#€ € €nð™b·\©ÖÃ}:{qÔ1Cª.îÒ¨­š€G|^Ú1@ÈŠ@YY©Î\ôèHW,+ë³hþ ˜_ùº,ËûXoÓËŸçoDŽ € 0Ÿ¸Ï§.s#€ €"0ÜÝ:ZüÀkòÚ�˜”–HZ¤‘�sãzõ£“ºmE…—p€ �³ € € �3E>�^4Eî;ôêüÀ˜ã¸ISä>b«6hŠÜ=Ž/c  €dP ªP˱]žÌàª,U G<ÓÉÇ";7‡ $Ò@@˜ Üç•)@@�BˆFZÇ‹ï{­Hžõ&¿•…˜#9Í�ÀÔtRo6w*9=©{oY(Õ óͬ € € €@ ø‹¼¦È½Q;öEtqhÜq„©"÷ÓɽÖtr7Íà9@@ G<�’¾ vÔÔ´éÃÍ�@ZöMúžŽ|²ùBZ—1@@Àu¸»nËI@˜¹ÀX×Þɺ[×ÿxzÊs«™eíÌgâJ7 ´½ ¶#gõ•;ê ”¸‘€œ@@@W ”ø}zþ+�ú¸½[Ѹcóyi Žý¢“;EîŽÙˆ €À¼ ”•–ªcÀ«Ã�Ñy[ƒ‰ XÀ¶?œ*)~±¯ù?ñ*àm&5@@`®(pŸ+IæA@\"0pº=m|î§AÅ—[ÒÝ.I›4çH ·T?þø”î\Y©†Å•s4+Ó € € €äº@Y‰OÏ=°B¶†5<2á8Ü©„44&-X2 c9@@ KÁP…v~>¢þaçÿŽg)T–ÍAÛ²_«¼XóÝÎÖÿàüÓŽ9˜!!€ €dN€÷ÌY³ € P8]MÉXø¹w*VŒ‡LR› '12É„ÀäTRo4uÈgMëž[êå¥ _&ØY@@Ⱥ@ ´HÏljÐ{º�tÏå"÷q©6hŠÜͧí9@@ só 3»(¨‡55mgnaV*ËÖ_FêÎý‹þ¦ïOLR$‚ € 0ï¸Ï;1 € €…*ÐdGÃm[+Vl0½ÔôX¡fI^ó'ðÉáó:püœ6ÝQ¯`yÉü-ÄÌ € € €9#*÷ë©õËõÞ']Ÿrפ)‡Šš~Ÿµ©Nî¹;vc  €³(++Q×€G;b³™†k],`ÛÖ¿‹´lþ·:v,ébRG@˜�î3@ã@@�_ ˜"÷–ŠûÍ#Ï›/þÄük¾s >?¢Ÿî8£;WVhù¢JW0@@@ ß*ƒÅzüþezwW§ÆâÎyN˜¡1Sä¾Àtr·x"ߟÄ� �ã¡PH;?Õ…!çw]Éñ”/öeÿ›ÞæÍÿo†—e9@@� À½@6’4@@�l ˜"÷½¡™¾n¾|ÙŒ…µóO`|"¡7š:TZ”Ô�kêåõzò/ "F@@HK :T¢Gï]ªwvv(>™º9œ³#Uä>’êäN‘»30F!€ �¦€ÇcÞŸõµýР&§í4¯f8—¦sû?3Åí… € €3 À}¦r\‡ € p…€)r?hذÃtPû†9QzÅI~@À�À΃çt¬ã‚6ÜZ¯`y±ƒ+‚ € € �ϵ•¥zèî%zÛ¹ON9/r�OIc¦™lm€Nîù¼ÿÄŽ �{¥%ÅêòéÀ™hîGDù"0aÙÖ·#-/ÿ8_&N@@�Ü À=7÷…¨@@�¼ˆ…Ûz�÷¿mþ¼üU“@e^&AÐYè8»\ØpçÊ -]ÈS(«›Áâ € € €@ê«Ë´áö…úùÎNMM'¯8n ÜS…î5©"wÇW1@®% …´ûĸÎN\k�#p#�¨<ö ‘æÍ[o4�ó € €ÜH€÷ q@@ -�XWûŪå›^³-ûqsᢴ.f0F`t|Zo4u(à·uçšzyS·Äå@@@(X�Å ºom½~¾«SÓ çEî©.îÓ¿(r/XC@`ž<æýW«8¨íÍUœÿ;<Ïa1}þ ô'mûÉÞæ-­ù:#€ €ä¢+Ä„ €ä¹Àpwëˆé#?òy¦ï3©¬Êót? ¶-58§£§/h“éä(+ÎB,‰ € € �)�eõAݵfÁå"÷DÒ¼(txŒš&³“ ©ºœ>îɆ €À¯JK‹Õ3ìÓg§£¿zŒoH_À>-Ë÷xoóËÇÒ¿–+@@¸ºîWwáQ@@�Y Œõìž\xîÇ“ec ’u×,§ãr— tœ�é�gtïš*-©¯p©i#€ € €îhXÒ­�Õz÷“.%Ó(r1EîÓ¦álEîîx¢�% €Àœ„B!í>1®sæRf.Ðj~{òlËË‘™OÁ• € €ü¦î¿iÂ# € €s$Ðßß”ˆ†ÛߪX±¾È¹?4GÓ2�ËÆÍýæ²ýŒJͳèÎ5uòz=. ]@@@À=«–VjµùúpOXÉÔí½±¸”]YF'w‡d Cp©€eYò–ThÛÁAMN™Oˆq 0S[o%Gã_ïký‹á™NÁu € €\K€÷kÉð8 € €Àœ ˜"÷íÁÆ çÍŸ˜Ÿ7“ò—æ9“u×D;öiïѳÚt{½B�w%O¶ € € €€‹Ö,¯Ò²ú ¶¶†/­;M=:nÞt0E{¥¼õàÔŒq €î(-)Vo¬HŸž¦Ù];?ÙÚö÷"õçþyì㿟œ‡Ù™@@QàΓ@@ #±®¶}+74™~É,èËÈ¢,Rp‘ £zõ£“Z³4 U˪ .?B@@ø…À­�Õª«.Ó¶½Ýi‘ �Ûòz,…(rOË�Á €…/ µçT\g/™Ûžp 0 ˶þm¤eóÿ­cǸÀ,¹@@àú¸_߇³ € €s(íj;\±i»%;Uä^6‡S3•‹¦¦“z{g—‡F´nm½Šý|^ÂEÛOª € € à"�;Wת¶ªT;öEÒêä>4F‘»‹ž&¤Š p¯×«¤/¨‡‡41I=ò ¸8}}�ISÜþ�{Z^þëëã, € €³ À}ö†Ì€ € �†@,Ü ¬Üø–eësYU—2�+œº¤>éÔúµ LW¿Àçø@@@ 0îºi�Õ–kûÞÙ¶óœREî:¹;c$ €@A å:~ÎÖÑp¬ ó#©Œ ™âöçMqû{]•Å@@\+@�»k·žÄ@@�ì ĺÚ.U7Þ÷š-ëqÉZ”½HX9ßc“zeë)Õ½ºmUÝåâ…|ωø@@@®¸}U­–Õ‡ôQ[8í"wY–*J­+'ä'@ ^ÀRi B; khtªà³%Áy{mÏãÝ-/ïŸ÷•X@@�_ PàÎS@@ +C]{GüK}ÅgMÝkþؼ:+A°hA¤:ømÛwVÇÎ\ІÛê(/.ˆ¼H@@@à×·6Vkå’ mmíV2�VîÃã¶R�ß+Ë(rÿµ&ß!€²@I±_ýñbµ6ÿfr¦ä– Kö§>+ñx¸yKW&Öc @@þA€÷�à¿ € €ëÙ=ySíݯ�û–›ÅïÎx,XPgcz}ÇiÝÖRÃ⪂Ê�d@@@¤›ªµfy¥>h +™FÅ^t\— ü(rçY„ PèÁPP­§'é7ÿøq 0këý kú…³MߘõTL€ € €@š¸§ Æp@@�¹èëÛŸŒvµ½lØè5w xngg6· Ä'úiS§¦&'tÏÍõòñ’ÇmÏòE@@�¸iy•n3ÝÜßßV"�"÷¸4�”ªÊéä^ØÏ²CÜ)àõz•ôµãð�&&Í?xÌ^ào"Võ?kú3ó[ € €™ Ú#óæ¬ˆ € p�X¸mG°aý9˲ž7§ùkóUŒxȹ@û±~5ïïÖº[¨¶ªÜù…ŒD@@Èy�UK+uçêZ½÷I— Ûq¼1Sž5•�ª)rwlÆ@@�ÜÊuüœ­£áXîK„y!`Ùú¿"-›ÿH]M|Z"/vŒ @@� À½0÷•¬@@�¼ˆ…Û÷W4l<`ÊÛ_2 åe�3ãzõ£SZRã×-� d><‘3± € € €ÀìWèž5u—‹Ü§Îk¯F&¤IŠÜg‡ÏÕ €9"`©4P¡‡†54:•#1Fž L›�þSSÜþ½<σð@@ @€÷ØDR@@ I n;l\¿Í’•*r/+¤ÜÈ%ó©ÛÕØQ¸wPëÖÖ©¼ÔŸù X@@@`^…´îÖz½·»KSÓé¹Ç§M'÷€y÷a^"cR@æW ¤Ø¯‹ñbµ–y ”�¹ˆ%-ûkg›·ül.&c@@f+@�ûl¹@@`Îb]í‘PÆŸ™¿2¿`&¯šó˜ÐuÇÃCz»¥Cw¬ iéÂJ×åO € € €@¡ ,«jÃí‹ôîîNMN9/r5�Üã¦ÙmM¹)r§Ê½PŸä…¤@0Tëé õô�d~$•�^%­'z[6ïÉÊê,Š € €ÀU(p¿ !€ €d_Àtr¨Y½ñµdR�˜h–d?""Èw�‘ñ)½¾£CEž„N>/‡ò}O‰@@H ,YÐw,6�Ü;51•pŒ26)�›¯šT'wŠÜ»1@ ;^¯WÉ¢ vÒĤóue'ZVÍ#�#¶e?fŠÛOåQÌ„Š € à*:\°É¤ˆ €ä«ÀPgÛh ö®Z~ßÍ&‡[ó5âÎ-�݇ÎkÏ¡^­_»@Ue¹Ñ € € €ÌH`Qm¹º{‰Þû¤SñÉôŠÜÇL7wŠÜgÄÎE €Êuâ¼­£]± ­È2®°µÍï�?Û½ý/ú]‘/I"€ €ä•îyµ]‹ €¸O Ö·*~î�`ã¸Ï4S{Ø}d<g/Žé•­§´¬®D77ÔšN}´ê›gæD@@2)P_S¦Gî]j:¹wi|bÚñÒæ†_1EîµtrwlÆ@@�L X* T˜®íÃ1ÿ`q 0w_q©ú·N¶ýDZ¹›’™@@˜; ÜçÎ’™@@æM ÉŽuµm6lì4uÈ/šeø=vÞ¬Ý3q"iëý==:ÑyQ÷¯­S ¼Ø=É“) € € P uUez|Ý2ÓɽKcqçEîqS3‹›"÷ e>] 8¤… �W%Å~]Œ«õø°Ì[™Ì™€méß÷6oþýþþ&ç·½™³Õ™@@g9sb € €@ÄÂm+V¬o’¬¯™pÊr $B(�Ó‘¨^ýè¤Ö, hÕ²êȈ@@@w ÔV–êÉõËõ¾)rMµgwx¤ŠÜ£ã¿èäî¡ÈÝ¡Ã@æC  ªõô„zúÍ?LÌ�@ª ý_™âö?›»)™ @@�ù À}~\™@@`ž¢áöîŠUëß�m=m–¨�§e˜Öe“SI½µ³K}†µî–z•–¹L€t@@@�¨•èé ËõÁž°FÆœ¹O˜¦ïÑT'÷€%ŠÜ ë9A6 €@>x½^%‹‚ÚqhH“É|™óG`D¶¾iÙüjþ„L¤ € €n ÀÝÍ»Oî € €@ž D;Û«7ý0!û>ÓPmUž¦AØ9(p¤cPoî8­Û+´lQeFHH € € €Nª‚%zfã mm +::éô2¥ŠÜ‡S�܃¹;Fc  €À¬�r?gëh86빘�/ ØR—e'ŸŒ´lÙýÅÇù@@�\ À=—w‡Ø@@®)0ÔÕ_S{׫cE¾²´îš9�@š£ñi½¾£Cãcãºçæzû}iÎÀp@@@�\¨ë¹L‘{[XÃ#΋Ü'M‘ûEî¹²�Ä�´€Ç㑯4dº¶kxÔù]G …äæLÀ²­ÝSÓ“Oõíú~çœMÊD € €d@€÷ ³ € €ÀüôõíOFÃmï…V¬�¬gÌ*¦¡;s#°ïøE½÷I‡î^]­E ‚s3)³ € € €d\ Tî× _iÔÇí=ŠM8^?Uä>8f:¹,y=Ž/c  €ŽR]ÛOõKÏÄd›6ÛÌ¥€eéo‹Ëìïôìø~t.çe.@@2!@�{&”Y@@`^¢áö¶PÆ}¦¼ýkf¡ây]ŒÉ]%0›ÔkÛN©ÈJèŽÕu*òñÊUO’E@@�‚”ý¢È}û¾ DãŽóšJ˜Nî¹;öb  €€3ËTûË+´ãȰctmw¦Æ¨4R—øß#Í›ÿhàt»ùÈ € €ù'@uFþí#€ €\EÀtr?j¸ÿ粬çÍéÊ« á!f$�ꜴûÐy5íïÑ}7ר¶ª|Fóp € € €@vÊK‹ôâƒ�æõ]D—†Ó+rµUðÐÉ=»[Èê €@AÊËðêÓÓQ%“‘Iä–À¨e[߉´lþo¹Ñ € € �žîéy1@@ ‡L'÷ 5«7¾bþ(ð  si‡Jhy(pap\¯|xJÕæÖô·®Z`Џ?}n#!#€ € €€ËÊJŠôÕ‡W©å³^õ›×yN�T'÷�_¹ûx9è”�q €WX* ¤º¶Çt1:yÅ~@`Žº•´žŒì|¹eŽæc@@²&@�{ÖèY@@`>†:ÛFC‹ø‘íµWYÒíó±sºW iÚ¹oßVû?ïÓº[¨2Tê^ 2G@@òT ´Ø§¯>´R»žÕù�1ÇYL›.»¹;æb  €ÀÊÊJÕõiïÉaÓµÝÜ2’�¹h-òYOt7½Ü1÷S3# € €™ À=óæ¬ˆ € 0ÏÑHët,ÜöÓPÃ[–�çå˜Þ…ÝçGõ£­'µ´¶XkVÔÈc™�Sp € € €ä�@‰ß§¯›Nî{÷©ïâ¨ã¸SEî—FlÕ<òñW6Çn DÜ+`©¤]Û¯jă³0÷ø?{›7ÿ¯C]¦g?3 € € �;¼í–;{A$ € €ó  · ®Ø´Íô×þª™¾|–`J— œŽDõã�Né¦ÅeZ¹¬F4swù‚ô@@@ ¯ü¦ û×Y¥áA�‰8ozš*rï7�Ü+J-û¸«W^m:Á"€(VhçñQõ Ä3°K¸T`Ìäý[¦¸ý¯]š?i#€ €¸î¾Á¤‡ € Å­‘êÆM¯'e?i<ê0A`®&¦z{WX}†tï- TVêŸë%˜@@@`ž¼^�^|h¥ú.ŽêhÇ%Ç«¤šñ^4EîÁK%E¹;†c  PÀ%¦kû¥x±>ù|XÓæ�Ì“@$iÛOõ¶lÙ1Oó3- € €Y À=ë[@ € €™êjª[¸þ‡Ó>ÏÝf½›2±&k¸OàHç ~¼-ÕÍ= Æ¥ÕtswßS€Œ@@@ O,s;®§76(>1­}ŸŸwœ…mjS�ÜËüÖå/Ç2@ à‚¡ í6]Û#éÚ^p››K ÙjóÚž'#;7ŸÊ¥°ˆ@@�¹ À}®E™@@ gzÛ'¢�ϽR¼Ò¹!g%°¼ˆO$ôÖÎ.…Ïèž›(PVœ×ù< € € à&�‡îY¢ò’"í<ЛVÚ©Nî~Ÿ¥€éæÎ� à.�’b¿†§Jµóè�¦¦éÚî®ÝÏt¶Ö+šò~³g÷ŸfzeÖC@@ Ó¸gZœõ@@²+ÐÕ”Œ†Û>¨X±±ßò¬ùòd7 V/T�ÏÃCzeëI­¬/Õªe5¦›;E…º×ä… € €…%°nm½–Ö´mo�’©í��Qûòk¿ŠR^ÿ9$c �÷ÁPH­§ã ŸËû\H ·,ËþãHóæ?ŒFZ§r;R¢C@@`n(pŸGfA@È3Sä¾·rÅÆ=æÏÔ/šÐKó,|ÂÍ�É©¤~¾»[':/êž5µ Jò$rÂD@@Ü-pÛÊݶ²Z¶vk:‘tŒ1XÜxßßûäYcRºµ@Ò"�˜ž¶õAk�œ8¯{o®Qeˆäà6 € € p…ÀÒº€[·ÌtrïÒX|úŠs×ûalR™�j¹_ωs €@> ¤º¶ÇU®fÓµ}|’®íù´wù«µÏšN>ÞÓ²åd~ÆOÔ € €ÌN€÷Ùùq5 € €@Œuí�Œ†Û^5n4=Öô„ù¢½vìk®¦Ðu.¦}xR B>ÝÒX+¯iÁÃ� € € �» ªJõì¦úxo·†GLåºÃ#nº¸›æ¾5¦È�—~цä¨@0ºÜµýôYº¶çèTXæ?NŽÄ_êmû‹�‚JŒd@@HC€Â�4°Š € PøKù×ÏIÞW$»¢ð³%Ãl l¼½^ÿá_mÒM µÙ…õ@@@n Ð?8®üÇïëó®ôjÍÊü–n_â‘ßwƒ8� �s%%ź8V¤g†s.6*P[iÙüÿ˜ììÍ�´@@p$@wGL B@p‹@4Ü~:Ô°á ÛÒ“æÓ  Ü’7yfG raT?üà¤*J-ݺ²V>/Ýܳ³¬Š € €ÜX ¼´H/=²JíÇÎëlÿÈ�/øåˆ©„tiÔVU¹GEüeα@�ì X*Vh÷ñQõô�g7Vw‹À˜mëŸô¶lþ¾[&O@@®'ÀÛh×Óá € €€+¢á¶�â¥�ü�Ï3µV²nq%IgL iþj±ãÓ³jù´GwßT­Õ�Œ­ÍB € € €é û½—‹Ü�v\Rç٨㋧“ÒŘ­Ê2ËtrçËŽáˆdA ¼¬T½QŸÚO k*Aí,l�—ìPÒzªwçæínLžœ@@¸šîWSá1@@× Œõ잌†ŸÿIÅŠqÓgM�¹€y870®m=©oR·­Z "/׿�@@@�¤î¾õÕ‡W©ç|LŸw8ž!ij$ûM‘{ÈÜÅ«¤ˆ"wÇp D2$àñ˜;m”…Ô|$ªþáÉ ­Ê2Xï{SÏöìú^ @@øµ¿¶à;@@¾$Ðd›nî- ?“¥ÍÉâ/ àGæTÀ4s×΃çôq{Xw­ªÒÂÚàœÎÏd € € €s#à±,=»i…b£“úôÄÇ“¦^÷¥:¹—ù­Ë_Ž/d  €À¼ ƒ�:/èˆ*õ�$2!`[ú÷½u}ÿrøƒ¿ËÄz¬� € €@> PàžO»E¬ € €Y0Eî'�÷¿iÉzÚP“• XÔU‡âzå£SRrJw¬^ ‘ÏUù“, € € �/�Þ·ÔÜ�Ë£O�urªnò∭bÓÅ=PL'wÇp DæAÀçóÉ. hÇ¡a �NÍà L‰ÀUb–åùíHÓËß×±c|¤âªD<ˆ € àv ÜÝþ @@G±®ö‹µ7Ýõ÷‰¤ïvsÁG1�Y ì9rAïíîÐí+*´¤¾b–³q9 € € €À|l¸m¡êªË´c_�RÚ�£¶<K¡RŠÜ�š1˜K�P(¤á)}Þ3¢4þ÷=—!0—;N$­ä½M›w¹3}²F@@À™îΜ… € €€;öODÃϽ\1nþü¬G A C±I½¶íŒ¢Ã£º}u�ÊJý™X–5@@@Ò¸su­Ö,¯ÒÖ¶n%’ÎË$‡Æl¥†W–Qäšë€Ç@IDATž7C@�Y ûý³ËÔrdH£ñĬæâbÒ°V× áÝßëMï:F#€ € à> ÜÝ·çdŒ € 0+�&;nÛZ±á�™æóEµñ¬<¹Ø©Àg§.é'ÛNiù‚R­ZV%�EñƒS;Æ!€ € €™¸É¸¯[[¯ötir:éxÉh\š˜–ªË-ñRÏ1@� CÚs*®Îsc3ºž‹˜¡€mÙúãHKÍÿ2Ðû§æ_~@@¸‘î7â< € €Wˆ†ÛŽW®|àmÛN>-YÕWÂC̹ÀøDB?ßÖ¡“çuǪ*UW”ÍùLˆ € € 0s�å ƒzøž¥ú°µK㩪u‡Çè„4f¾j¹;$c �–@Yi‰úÇýúäóaMN9ÿRZ‹0�« IÉoEZ¶ü7©Éùm^®>�"€ € à Ü]³Õ$Š € 0×Ã]­ý•Ëîû�íñÞeæ^=×ó3×èì‹é‡ïŸT¹ßÖÚÆñÒîZV<Ž € €dZ ¾¦LOmhÐGmÝŠ�M:^~|JŠŽÿ¢ÈÝÃM»»1¸ž€en�Q¨P˱Qõ Ð8ûzVœ›ë°åµŸˆ4}¯}>fgN@@ Y€*ˆBÞ]rC@˜w�áî}ñèú密F‚~YzpÞd~)�´m5èÓ{:µvyPKë+°A@@È�êP‰^|¨QMŸF40ì¼ 2Õô}pLª5�ܽžI†0@�<Êðjß©¨Igçé6æmØæ÷êt±ÿëg?þóóy›�#€ € �Eú?dŸ¥@@ K`Éÿÿ]Óèÿ3Y•Vfd“¿ûÜMúƒß¹OuÕ�|—@@@W Å&ô»ò¡>;q!­|KŠ¤Û—x•ú/ €@z^ó !ËÔ®£ƒšNPØžž£ç@ iÙÖõ´¼üŸÌ\<ç”)@@Ü)@wwî;Y#€ €̃@,Üv4´|ãÏM'÷gÍôUó°S"pM�ƒ§ôêÖZ¶ D«—UËÃýì¯iÅ @@@ S%Å>½ôè*:}Qᾨãe§“ÒÅ[•e–ü>úU9†c ¸^  êèÙ¤ŽtÅDÓv×?²pѶ“_‹´lùQ6gM@@ I€÷BÚMrA@Ⱥ@´»í|põºx’ž{M0+³¸J`b*©÷>éÖþÏût×êjUWr3W=H@@rR ÈçÑ×Y¥óc:ræ’ã¦È½?f+Xb™Nî¹;†c ¸RÀï/Ò¤PÓ‘!ÅÆ¦]i@ÒYØŸLXOœÝ¹å@Ö#!@@ @€÷ØDR@@È-�XçÞñhãs¯„¬x±‰ìÁÜŠŽhÜ Ð}~D?øà„J|¶Ö®¬•¿ˆ—~nØwrD@@�ÜðX–žÚÐpùõÙžC}²†j›�©"÷T÷€)tç@ø²€ùÿc¨B­§â:Ó7úå“üŒ@FlYÿÝšô~»÷“?wþI¶ŒDÆ" € €ä¯ï„åïÞ9 € €@,{ø¾f[ößšP+ó \B,@�†EAýÙ¿Þ¤Mw-/ÀìH @@È?�wvvèßüçfML&Ò ~iµ¥5ž´®a0 PÈ�@™N_Hêt/…í…¼Ï9žÛ´%ëzš_þ §ÓϯåxJ„‡ € €@nÐÆ/7ö�(@@ T n;QÕpÿ�eé!ÉZT i’V �Lê'ÛÏè\TwÝT«ò2GKh € € €@á ÜÜP¥Mw,ÖGmÝŸ˜vœpt\›’ªËM)-¬»1 O Èç“]Pó‘¨.E' /A2Ê�sæ-/˜âö7ò%`âD@@ Ÿ(pϧÝ"V@@�¼·U7Þúw¶]\k Ý×åe�÷G:ôíǵ´¦X7-¯‘ÇC5DÞo* € € €@Þ ,YÐs¬PÓþˆ†bŽó3uœÃ¦Ð=Uä»c7"€@áBÚß1¡‘QÙôË.œ�Í»Lì=Ö´ýdÏÎ-Gó.tF@@ O(pÏ“�"L@@�üê:0mº¹¿jXÚ´Y{ÖdS”ß}> LM%õþžµîÕÝ7U«¦²<Ó f@@@  *ƒÅzéÑÕÚ÷ùy�íuœSªéû¥[Uåñ—>Çn D�ü(//S_¬H­Ç‡ŸLæw2DŸ×–­¿¬¸TóÛ§÷ÿéP^'Bð € €ä¸o{åø € €@a DÃí‡+—¯ÿ™mYO˜Ìj +;²É�ˆ)œøÁ'¤Ä”Ö6Ö¨¤˜Ï[äËÞ' € €–@i±Oß0Eî�g£:Ù=è8¹iSÛÙ³*±T\ĺÃ1òNÀçóÉ*ªùHT†œßñ"ï%à|˜°lû÷zZ¶ü»þþ¦D>LŒ € €ä³îù¼{ÄŽ € �—ÃÝíýÅ�÷ý­OÞF“Ày™Aç½@êÎ{Ž\ÐÛNiE}©—VÉcQ‘÷K € € �w^¯G/<بɩÄånîNHš×uL‘{©)p//æõœS7Æ!€@þC!}Ú5©ãÝ#Jý?��, œIÚö3½-[ÞÏb ,� € €€«(pwÕv“, € €@®Œuí�Œ†Û~Z±býyÉzÊÄÅïæ¹²9.‹c4>­·w…uèÄ9ݲ¼B ª. ]@@@ 7¼{‰Ö”kǧ%Ó¨ä¼4b_þÀr¨”"÷ÜØI¢@�Ù ”—•ê¨_Ÿ|>¬ñ eÏÖ“ëg-ðº¿(þb÷Ž¿èšõLL€ € €Ž(¢qLÅ@@@æ^ nßWÑxÿ¦Èý3{åܯÀŒ8èìÑ·žTrjB·¬¨QiI‘³ … € € 0gw¬®Õ½7×ik[ØttO:žwhÜÖÄ´T]n‰›s9fc 䘀×땯4¤¦£Q�œÈ±èÇ…“æÕ?Œ4oþ£ÁŽýqæOÊ € €dU€÷¬ò³8 € €R´«ýlhñ'¯}›ñXƒ Ù°Í­ž[�öë'ŸÔ’šb­ZV-�‡€ÙÚÖE@@w 4, éÉû—k[{·bcSŽFM-hÌ”ßU,ÓÑÝñe DrB  é`Ï´Ž†GÌ],r"$‚p·@§e%Ÿ‹4mù™»È@@�ì Pàž={VF@@àWÑHëx4üÜk¡ÆxªÌãæ‹?EÿJ‡o2-�ºõó»Ÿt«õp¯ni©¾&˜éX@@pµ@me©¾þð*í9Ô§ ƒcŽ-â¦~`ôEî>�ãˈdM ¬¬D—âÅÚ}lXcñDÖâ`a¾ ð¦Ïò<ßÝ´¹ã �ñ- € €dX€¢™ ƒ³ € €7Xúè>jÛÉWÍ/ëõ7Ëy2!ð/¿v‹~ïÛw«®:�‰åX@@@à—cñiýϺ]›nîé~Ÿtëb�Åü)07Æ"€@æ¼^�¼%Aí<2¤©iZ¶gNž•®#0%[ÿ[¤eóf3ÆÜë’@@²)@÷lê³6 € €WˆvµvU/ßôC[ö:ÓÇ}ÅU†ðØâ¢~ôá -ªôkõòj¥þÉ� ðÿ³w'Ðq�õýÿ?÷Ž43Ú%Ë‹$kñ¾ÅÙ÷Ä+!!Î�$JOáO�‰'MK!@ m�©c;¡~а´Ò6-%HbKޝY/ñnY«-¯Ú·™¹ÿG¥I°ìm3÷Þ÷=GÇš¹Ïòý¾ž±}æÞï<ƒ € 0üéfö÷Λ¤“­ÝÚºçhÜFM­èÑVGY¦À=#H‘{Üp4D�ÈÍÍÑöú˜¶lU,Fñˆ 3ɹ)æ,ª{qåž«!ç@@@`d(pgfA@@ !�æš m-ý4×é š"÷9 u¦1à ÐÓÓ³kµjó!ͬÈSɘÜa˜…!@@@Þ)`Y–ÞuY™r2ƒZûZ½œ8kAûÚõ¹§,å„)r§+�@`ä22BjéÍКÍj댌|̈À™ý·ë]T»öñýg:Ís € € �®f%Ç�Y@@ˆ[`ü‚ûn±ç'¦C~Ü�hˆÀ0 |ä†)ZòáKTD¡û0K3< € € ðÏ®¯Ö½ß®Tgwb…¡ãóÍWÄ�±Ígè9@�‘°m[Á̽¸½Yݽё€8³@Äü¿ø¹ÚªËÌé8?>væ�x@@†^€܇ޔ@@R�Öê�{ *.ÿ…cY};¹— éà †À¶í?¡Ÿüf— ³š6¡Pi{€#Ñ @@@ ^�)eùš{ñx=·±F]ñ¹·vI=2ïá,™ á9@�ÈÉÍÕŽú¨^?تhŒâƒg¢s8µŽ7×U-ê 9� € €I À=IðL‹ € €@"͇6�;ëŠõöZ£Ì}èËéK[†K uôü–zýfÝAÍ(ËQiQÞpMŸ € € €¿(*ÌÒ-×NTÕ«õ:Ñb*×ã<:M�ûÉŽ7‹ÜùŒrœh4C� deeêp[ºÖïjV[güÈð„tD ^ÇzÆI�ÞX¿zåžx»Ð@@F^€=FÞœ@@”@é¼ûþD–ó=3HÖ ¢3C,ð¾¹ô7½ÌºçñÈ ‡ € € ðN�–ö}òïŸÓK¯7¾óÔY‡Ó¥Y%eÏÚŒ“ €À€BÁ :�°6¼qJ1‡Û„H§áˆJÎçëª ‘–ƆkÆE@@�¡`÷¡qd@@FL åÐÆmW?íXÎB3阛˜‰8‡ÀîšSúÑ3o(p4½b”BÁ´sôà4 € € €À@BÁ€Þ?Šê›Ú´óà‰¸‡‰˜’¾£­Ž²Ã–Âéì…7 @ଶm+œ•§õ»Ûuàp‡(m?+'G^ >fÇn®¯|ìgR%/Ï‘÷gF@@ À=a2: € € �|�æCŽe�¾ðI;”>ÚDsYò#"Þˆ™ÛC/n=¬_<¿G¥…!M,-PÀÜàä@@@zÛ¶tãÕÔW¦¾a{ü;¹÷½w;Úæ(œf)+D‘ûЯ #"à/�œÜ\í¨�êõƒ­ê�R;ì¯ÕwE¶ÏƬô÷4T.ßíŠh @@N PàÎ @@— ´6¾ÜÛR½ñW¹“®Ún¶DºÁ¤vi*„íA�Ž®ˆžy©F/¾Z§)%Y?.σY’ € € �WŸ_¬ò¢\½°¹F±¾êõ8�ãío¶ÍˤÈ=N2š!€À[²³3ÕØš®õ»šÕÖyË~E %¢²¬‡êªFÝÝZýõö”ˆˆ @@@ n Ü㦢! € €©)`ŠÜßÈ.»êßdërs;º<5£$*¿ 4ïÐÏ_دúÃ'5µ4Oy™~¥ o@@@`XfM¥«fŸ.rï쎿д¹Sêì•FeY¦pXCdpðˆ@8T��¥ªí-:ÚÜ푬HÃc�–cÝZWµü_¤Êø?ùå1ÒA@@À͸»yõˆ@@�ß ´Ölln�¸è'¹VgßÅúyæ‡[Ò¼:RJ`ÇÁSúé³»e;M)ËWf8˜Rñ  € € à�Ò±Ùºeî$mØÖ¨£'MåzœGG�tÒìm[`ŠÜÓì8;Ñ |'`Û¶ÂYyziw»î0_*É�@ê ˜×ås‘ÞžÖ>¾3õ¢#"@@ˆW€¢—x¥h‡ € €€KÊæ/žk.â›�i¬2—„L˜>•Ô—>~©n™7]áPšÏ²']@@@`øúvp`Y•~µö`B“¥›­±fÛÊÍàbBp4FÀ¹¹¹zå@‡ŸdÇv,·[SŒY–ópmeáפ¥1·&AÜ € € ð¦;¸óJ@@@Àc-‡6Õä–\û#œi&µ™K�t< ÐÙÕo7Öé·ëhRq–Ê‹ódYOx`iI@@RD ÝlÃ~ËœIf7vËìæ~8î]–cæóM­Ž‚KÙaÞ§¥ÈrIÈÎÎRckºÖïjV[W4©±09g8lþ {_]ÕÊK•æW@@p»în_AâG@@à -u:[müENÅ�¦pøÝ¦ ÛdŸÁ‰§’+p¼¥[ÿQy@¯ïmÒôò<�)ÈJn@ÌŽ € €xLàÊÙÅš=e´^Ø\£žÞø7³=ÑyA¦e>�ì1ÒA�¸¡ zì,UmoÑÑfvm� �FIpäüÒ±‚76T=º3)0) € € ‹—¤†…•A@@H�ò…÷Ÿ‹Ef"š�:Q oè+˜øø-ÓõéÛ/RÑ蜷Ÿä € € €À öÖœÒÇÿöwªnlIhœ¼ K3Šm¥³eVBn4FÀͶm+”™£u;›ÕÑÍŽín^KÄÞéXz ¾rÅ&Wvm÷Á‚“" € €€¿¸å¯õ&[@@ 4Wo8š[rÍ“NÀ)05Ä—û�€”]"ðêžãúñ3»”¶4­|”‚TP¸då@@R] 0/¬;®›ªíû�éÐáÖ¸ÃíŽHÇÛõºÓØ7+n8"àR�ÜÜ\m¯‹èõƒmê�R/ìÒeôKØ[Ž}CmÕògý’0y"€ € à7 Üý¶âä‹ € àK�–º ‘ÖC�7ñê­f3›÷„ _B�tÊ DcŽV¿Ò _µGã25±$_¶MEÊ/"€ € €@Ê „‚½áµwöêÕÝMqljIM-Ž2‚–2ÍxO ;;S�­éZ¿«Ym]ìÚî½öVFŽå<’‘©|aÅaoeF6 € € ðV®B½Uƒß@@ð�@ɼÊl+òS“ê<¤KŠ.¸xÚh}å“Wèâ™%.Ï„ð@@@�Ôø÷U{õ7�­UwOb…¬e£,UÚ©“‘ €À Âá�Ú#!mÜuJ1‡Û…Iç‘h´e}´¦jùs#1s € € €@rØÁ=¹þÌŽ € €Àˆ ´ZßÒrEùOò:²{%k¾ €;Ó#¾ L¯Àáãú·çöê`ýIͬÈWA._>¯í@@@�þfM,ÔüKJµjK�ÚÌŽîñ-�R{·4*Ë_¶¯íH=�ô´4Â9Z÷F»ª�tˆÒöÔ[#"z»€#ç—Ž\TWµlûÛÏð@@¼*Àî^]YòB@@ �’…÷\kÇì5MËãhN’*`™w°qÛ,ýùûÎWÑ蜤ÆÂä € € €€šNtè“_{^¯ìjJ(�Ì ¥Y%¶Âé u£1$YÀ¶m…2s´~W‹ùpK$ÉÑ0=q t:–¨¯\ñ„iÍg1â"£ € €Þ`wo¬#Y € € 0 �ÖêMµùe—üHv`’༠B'FP`Ë®£úñ3»Js4¥4_áÕ#ÈÏT € € à1�¬ŒtÝñ®©j8Ö®�ŽÇ�]oTjjq”¶L‘;ûiÅ GC’&`)'7O¯×D´­ºM=‘XÒ"abØpìj«–?›@š"€ € €€G(p÷ÈB’ € €h®ÙÒÕrhã¿çN¼²ÎŒq½ù¡bx ˜ô�hÌÑš×õóçöhtN@Kò•žÎÛÛÁg@@ðœ@À¶ôž«*”—ÔÚ×sâÛ ×¼5SS«£´€)œ5…î �š¹¹¹Úk¾¤áå}-êè6ŸNá@ÀŽå<’‘©|aÅa„Kˆ € € 0 \mT†D@@À­ó–ÌŒZ±Ÿ™ø/pkÄí?�‰ÅÙúÂG/ÑuWMVz…îþ{�1 € € •ÀÚ­ úì7^ÐÉÖ›kiÊX[¦VžRD ''[�Fµ«¶-E"" âh´e}´¦jùsqµ¦ € €xV€;ÿž]ZC@@ q�æCŽ�š8óɘBy¦÷•‰�@F^àT[�þgí!­}µV¥c2TV”'Ë¢ªbäW‚@@@ÀíåE9ºyÎ$­3…îÇ›»âN§ÝÔßê�FeY Øqw£! ƒ@Vf†Nõ„´vg‹Ž5÷ à ‰Àð8r~éXÁEuU˶Ï ŒŠ € €nàŽ¿›V‹X@@A�’ù‹o5»åüÀL9f§e*-ð®K‹µäCéâ™ã= € € €~èèŠè¾G*õìúê„Ò¦I3‹m儹™��p8¤ŽhHw�R4æ Áˆ �Àˆ t:–¨¯\ñ„™‘3 € €©-À>D‡ € €@ÒZmÚ“1þâìÀ4Yš‘´@˜�6¶éßžÛ§š†š\’£Âü¬G 9 € € ào�ô4[ï�7IŽãhÓŽ#qWFcRS«£pš¥¬Eîþ~‘ýH ¤§§Éåhí®6Ué4oGjfæA`H¶û†ÚªåÏÉh ‚ € €ž ÀÝ3KI" € € ½@{í–ö–Cž7ñŠjɺÎÌúY�áx£ú”~òìn5·´kjY¾r³ÃÃ3£"€ € €¸æ‚͘0J«6ת7bª×ã<Ž·;fi)?Ó’E�{œj4C 1�@ÀV(+W›öuiO};»¶'ÆGëp,瑌L}øà +§@8„€ € €)&À%¥[ÂA@@ U&,X2!‹=ivsŸŸª1ý ¤››¾Kî:_¹i;º÷‡Äó € € €@?»ªOèÏÿî9Õní§Å™Ÿî+pŸQd+�-·Î ij @À2ŸÉÊÉÕ–½m:ÖÒ3€è‚@ÒmY­©Zþ\Ò#!@@HY.'¥ìÒ € €©%pªzé–C‹~œ7¡³ÅD¶Àü¤¥V„Dƒ@ÿ1óýÜ/m;¢ÿz—rÖ¦”(ä%Ü¿g@@@�ÿ�Ÿ¡ÛNÕëûŽ©öHüEî]½Ò±6çôNîéöÝú?Q~C``9¹9ÚÓäè•}­êèŽlz!�DGÎ/+¸¨®jÙö$†ÁÔ € € à®$¹`‘@@�T([pïlS/üc×Å©ñ �@AnH_ùÄåºiÎ…(t�‡Œ6 € € €€¢1G_ùþ=ù«2×â>Ì—jišÙɽ0‹[“q£Ñ�·äädëÀѨv×¶½åY~EÀU�Ž¥ê+W„˜ … € €€_Zª76•e/ú箬NÛÜšžcòæµ_ß#yv™]Î~³¾FÿU¹Oecª(Γm›Š @@@�~lËÒÂËÊT<:KU¯ÔŸ.xï·ñ[NôÃkud™þy\Bx ¿"pV�¬¬ �ìkÝÍ:ÖÜsÖ¶œD …¶û†ÚªåϦpŒ„† € €)&À¤[ÂA@@Àmã,¾ÊrôSã>Åm±/ÿ+0y|ž¾ôñK5ÿ² JëÛZ�@@@à¬[÷Õ§¿þ‚êšÛQz”ÙŽo7÷4Þz�Õ—“þÈ‡Ô jÓîæ¸?Hâo1²OQ�˜)Hù‡P¦ó•}¿YÙ�¢1 € €¤¨î)º0„… € €€›ÆÝð`VZwï·,9ŸqSÜÄŠÀ;fM,Ðçÿìͽ¤B ÝßÉÃc@@@àmÍmݺ÷Û•Zµ¥ömÏŸëA8]šQl+;Ä­ÊsYqÞ_}…í±�6î>¥HÄ|õîØ-ÛúhÝêåÝ›‘#€ € €@2Éœœ¹@@@Àíû_êm=´ñ™¼IWm�£ëLV9ÞÈŒ,ü&pôT—ž®:¨ªWjU6&¬Òqy², .üö: _@@ˆO LÓûLQºù€ð†í�râ¬Ç�Ĥ¦Çô³”æ=W|Ú´ò²@ضGYZûF›ª�t*fþŽp àR�¾ÿ –Y=�»ê^|´Ú¥96 € €¤€WŒR`@@/ ”^}ÿ('ùŽåXwy)/rñ§ÀÕç�Ñýw]¤«.,§ÐÝŸ/²F@@�8ÖmmÐ=ßZ­c§:ãìñf³±9–&�µÅ—h%ÄFc�„CAu+Cv�Roß'?8p·Àó Ÿ«­Zù¢»Ó z@@H ÜSaˆ@@ ”-¸÷Cf»žï˜Ô <˜)ùL`Á%EZ|Ǻüü¾BwŸ%Oº € € €@œM':ô™X¥M;ÇÙãÍf™AK3‹meêFc\+ÐWØÞc½YØÞÓKa»k’Àÿ `vmÿN�ùÜÑÊï´ýáI~A@@!D_º"€ € €ý ´ToÜž;ùšŸšïT>ÏTOé·!'p�@uc›~ñÂ~mßwXãGg¨dl® ¢&D@@@`d²2ÒuÇuSÕÕÕË»ŽÄ=yoTjjuN·”âSÅqÃÑÐu¡`º”ž£—vwè@c‡¢1SÌ�€»jb–sGCÕÊÇ:ª7÷¸;¢G@@�T À=•VƒX@@ð˜@ËÁ ­-‡6ýKÞ„+Ì]mk¡IÏÜÅã@À½Zõóç÷iÇþ#*›©â1º»w5‰@@†CÀ6_{5ïâñ:oR¡*_®Sw_õz‡ù8osÔ·™u~¦Å·gÅaF÷Ma»ÌÑú=ÚOa»{ŽHÏ.`éá.ç¶CëV¾qö†œE@@` „ÄÍè� € €(�wïTÓí'²tåºÓ�”¸ñªRÝsç…ºpzqJÆGP € € €@2j·êÓ_AÛöK(Œœ°¥ŶBi u£1)'LO—“ž© »šÕÙ߇=R. Bà�Ûùdýê•Ïüñ)žA@@†F€܇ƑQ@@@à-‡6žh™¸èÉ<§³Ç¹Ï3Íístá4)/°¯®Eÿú»½Ú}ð¨&gklavÊÇL€ € € €ÀH äe‡tç»§êxs—¶'PäÞ‘šZe-e˜Ü&�žž¦´pŽ6ìíÐÞúE¢æ+ 8ð‚€¥QOàÖú—¿î…tÈ@@RW€+B©»6D† € €€gJæ.¹Ä¶c?1 Îòl’$æK�[®)×â».Ò¬Éc}™?I#€ € €ý üǪ}úÂwÖª£ËT¯'p”�²T^h›ÏÊs �úéii²BYÚhvloïbÇöÔ_1"L@à¨iûuU+žN M@@@� °ƒû€éèˆ € €h­ÙÐ8jâÌFÊ47¨¯2ãpŸz ˜ôK)�=µÍúé³»µ¿ö¸¦ŒÏÕ肬”Š�`@@@�d Ìš8J﹪Bë¶6èdKwÜa´tJ­]RA–¥ß· GV ¯°==#G›öwiw]»z#ìØ>²+ÀlÃ*àè?"ŽsSÚ•/ë< Ž € €¼E€"’·`ð+ € €Œ¼ÀøùK®¶û¡™yÆÈÏÎŒ ¯ÀMW—ëž;/ÐùÓŠ†w"FG@@\"ÐÞÕ«¿Zþ¢þçÅ EL3Šlåfp{3!8«@š)lO3;¶oØÝ¢¶Îľ�`Xcp†Fà¤%çîÚª•?3Ãñ©�¡1e@@ˆS€Üã„¢ € € �@ë¡ uf7÷8 š}جkÌ,ìÇ6<ÔŒš�½uÍú—ßîÑk»«ll¦ŠÇäÊ¢# +Á” € € �*Á´€nž3Q9!­5»¹ÇbñÕLFcRS‹cvq·(rO•Åôq}…í¡ÌmÞß­]µíꉘ(ÞøU f/ªY³b½·Ò"@@p‹·ÕݲRĉ € €€Jæ.¹Ä¶Oïæ~¡Ò%E \sþ8-¹ëB]yA™lS”Á� € €øYàÕÝMúÌ7V©þh[B …Ù–¦Ž³•ÆGär£ñà�€‚¦°}Óîf5·³cûàE!ZÌ«%µU+ž4±Å÷ ¤L‚�@@@Àýìàîþ5$@@<#ÐZ³¡qêè Ð ô˜ÝÜçšÄxÏâ™Õ%‘>�Ú¦v=µj¿Ö¼R«’Q!•åQèÎK@@|+P<:Kw\7U»�TuCKÜ�æªÁ±6çôNîÁ4><7 ,�nvlfä蕃]ÚYÓ®î^vl0&SVÀT³?çD­Eõ/®¨JÙ @@|#Àß,5‰"€ € à.�ò…÷Ÿ‹Eh¢¾Â]‘-ñ œ?)_K>t¡æ_6Q¡`Züi‰ € €xL`ÅÏ^Õ?þë+ŠÆâß0¸ï‹±&�±U”Ç-O�½R&�p(¨ˆ�¡ÍfÇööîhÊÄE  ±@»céÁúÊO˜qãÿGxˆƒ`8@@@à­ì†øV ~G@@�”h®Þp´åŠòÎkÏi6AÍ7?Tÿ¦ÌêÈP 4�ìÒ/_<¤g_: Ñ9•™ÝÓÓx«>T¾Œƒ € €î¸rv±.›U¤ªWêÔщ+ð¾*ÌíŽúšdY²¨s�Ë�FçȇLa{–Öín×�ÆõF©ù=·-\*°ÆŽn¬[³ü9—ÆOØ € € àQ.óxtaI @@/ ”.¸ŠbÑÿ'ët¡»—R#Þ&PQ”­>t�®¿z²r²Bo;Ç@@@ÀGNtè3ßX¥Í;'”nfÐÒÌb[Á„ºÑ�· dgeêDW@¯ìmV„¢ö·ÙðÀs�ެ‡ê« –KKcžËŽ„@@@Àõl çú%$@@¼/ÐR½áDË¡E?ΛÐqD²úvsçvµ÷—Ý—6·õèÙ µúÅó{”cêÛËŠr¥ûÒ‚¤@@@ÀŸÙéºãº©êìŽè•]Mq#ôF¥¦VǸ[ê+vç@ �œœ,�ìjÝ­ª?Ö¥¶'ÂG[· 8zÁJsnª«\ñk©’W»ÛÖ�x@@ð‰Ww|²Ð¤‰ € €€WŠßuwE b?a¾wü=^ɉ<èO Ëv<øá tÛÂi]�Õ_3žG@@<)ðÛ ‡ôÀ²*µ´÷$”_I¾¥‰£msé ¡n4ö¡@nnŽª�EõFM«Ê|}ø ð]Ê'-Ëy ¶rå�Læ¼â}·ü$Œ € €€»¸¬ã®õ"Z@@xSÀ?ïÞ?37ª5óAAÀë¡ô€î½ó<}ðú™*“ãõtÉ@@øƒ@ÍáVýÅן×öýÇÿð\<¿ä„-Í(¶J‹§5mü%`)ǶïmìÕ¾†6¥N¶¾p,ççÁ€}ßÁ–›oÈä@@@R_€÷Ô_#"D@@�~*æ.)ŽÚÑïHÖmý4ái<%�°ô‰÷ÎÔŸ.š©Š’OåF2 € € €@½‘˜¾þä&ýà¿w(–À6Ûi¶4eœ­ÑÙÜíÏÖOÏ[f§„¬œ\í¨íTmS§ŸR'W ÔÅä|¶¡jåÿø›�ì@@@Àm\ÍqÛŠ/ € €¼S o7÷;Í=ÊÇ̉1ï<Éc¼(`^ïzÿü‰¦Øý<�?­È‹)’ € € ðGU¯ÔéþeU:z2±âäq¹–&�±0ïþ gfëÕíj:Õí?2ö«€#Kß w:_Ø·qe‹_È@@Ü+@�»{׎È@@@à-% þr´íô.7OýÉ[žæW&çûf‚Ša›„�HQ�P( Å˜¥ÛNSEIAŠFIX € € €ÀàúvpÿÊ÷7è§Ï¾!lj¬ô€4Õ¹�Êâviüj©Ù2;+S§ºÚ²§Y‘h/‚ÔL‡¨HT M–õùº1 ÿ¤§žâ+ Õ£= € €¤¬€¹tÃ� € €xS ùÐÆ¡‰—þ¿tÙ&Ã+Íw­½¹Ôdu�¨¹©ÿÒö&=ùÌ:v¢EcóCW˜s†–<… € €¸W -`ëº+ÊuÞ¤B­}­A�Ý‘¸’‰™:裭Žú6úîÛÑÝâŠA\n©Ô(77GMíéZ¿»UuG»Ô·¦øLà×±¨uSýšåÏiçNþølñI@@¯ p©Æë+L~ € € pZ dÞâ‹mËzÂ<¸ü*ðž+Æëã·ÎÔ•”+`Š@8@@@/ 9Ñ¡û©Ôº­ ¥•´4£ØRߟ©-Ð÷^6#+G;j;UÛÔ™ÚÁÃ'pÔ|(çÞÚÊ?7SPØ>|ÎŒŒ € €I`÷$â35 € €Œœ@ë¡M‡[®(ÿa^{î3ë\ó¹Ù™ �ÔØ_ߪ_}@«6WkTvšÆ�ËUz—Rcuˆ@@+��‘®Ûß5UáP@·V,Î-½{£Ò‘Gi¶¥œ0Eîƒ]‡áèe‡²õju·vjWK{|;õG,Œ‰@2Laû�œ´è{ëV?¶9™q07 € € 0Ü\¡naÆG@@�”¨˜»¤8ˆ.³ë®” Ž€A�±ùa-ùкyÎ�ÊÏÁ™™ @@^�×÷Ó=ßZ­ƒ Í M4*ËÒÔq¶Òù,pBnÃÕ8;+SÍÝiÚ²ç”z£lT=\ÎŒë �ƒ¶¬¿¨©Zþœ+¢%H@@@`�¸�î € € à^�Ò÷Þh¾Ä÷q“Á$÷fAä ^ h*7>ûþYºóúé*/Îü€Œ€ € €¤€@GWD_ü§uú÷U{å$P4ÅíÓŠlågr+59Ëh)77[‡ŽGµóPkBk—œx™�aˆ9–³, =|äwßnÖ™@@H!®Ê¤Ðb  € €Œ¼@éÕ÷g8¡èC–£¿6³§�|̈@꘯¹Ö{çNÔÇo™¡‹g–Èê{‚@@p¹À/×ì×ç_§–öž„2_`iB¡Ù3™·F ¹ ´q P83[Ûk:U¬s ÃÐ/ lµ¬Ø'j+Û⥤È@@ˆG€Ë1ñ(Ñ@@

wñ¬˜m}×$:×óÉ’ qÌœ�¯û>x¾\6QY™Á8zÐ@@H]�º¦6ÝûíÕÚ¼óHBAf‡,M7»¹gð¶(!·D‡CAÅÚ²¯Õ|¡7‘®´EÀ«Ýæ“5Kǵv>òòËßã/…WW™¼@@@ସŸ•‡“ € € à3«lþ½3ßZþ-“w¡Ïr']Î(�“‘¦Å¦ÐýÖ¹“UZ”Æ6<‰ € €¸A æ8zôß^ÕÊŸ¿¦H4wȶ¹£:y¬­q¹ÜZ�-ކÙÙ™:ÕЖ½ÍŠDÌÕ�U†OÖ­Y±@@@ÀÏ\…ñóê“; € €œQ dÁ_޶œÈ·,9;cžDÀ‡¶-ݾ`¢þôƺxf‰ÙHŒK >|�2 € €žèÛÅýÞG*Uw¤5¡|Fg[š2ÎVšyÄ1PK9¹9ª>Ñ®ÚV™Ïp €Ài«É‘ó`}ÕŠŸš‡üÍàU� € €¾àn´ï_ € € €@¥ ÏWÌú®9?£¿6<�€.˜Ê6ßn•P7ß5‡CŠÚamÞÓbŒ#¾ËŸ„8‡À†˜ã|¶aÍÊWÏÑŽÓ € € €€ï¸äâ»%'a@@ˆ@é‚û§È‰>núÞ0�þôAÀ˶-}øÝ“u×õÓtÑŒSàÁå/¯7¹!€ € à5�êÆÝóÍÕÚº÷hB©å„-M7»¹‡Óêæ‹ÆÙÙY:Ñië•}ÍŠD_äL’$ p\Žõ¹º5ÿ,-íÛÁ�@@@àÜq~@@@�³Xe î½+æèQófjÜYÚq ß \>s´>õ¾Yš{éee}ë@â € € à.�H4¦oýäe}÷?^—ÙQ9îàæ¿SÆÚ“Ãm×@  pV¶öÔwéàᎸ iˆ€�úþqù¾“ýBý �÷QÞ¤Š € €$,À•–„Éè€ € €~˜°`I~¯ã|Í’óicÁû*¿¿ ÈÿŒ…y!Ýý�ó´hÎ$•ŽË?cžD@@RM`ÝÖÝ¿¬J�ÇÚ m¬)pŸl Ýû Þývdef¨3ÔË{›ÕÞõ[úä‹@\æ:â+NLŸ©{q妸:Ð@@ð¹…>�> € € \ tá}WšmÝž0#\8ðQ艀·lSÜqçÂÉúÈ�ÓuÑŒbY—"¼½âd‡ € €€ûZÚ{ôå'^Ò®Þ§6sW(Mš:ÎV~¦÷ß÷ô½·ËÎÉQͱˆvÖ´&ääþW ��À)KÖCµcžÐSOñ �„èhŒ € €~ðþÕ?¯.¹#€ € €Àð ,XšV;yŸc9_1“e ÿ„Ì€€{¦•çéîÛgkáåT�›áÞDˆ@@|!ð» ‡ô7�¯ÕÑ“� å[œgiÂhoîæ‡ „µõ@›Ž·ô$äBcü&`>ò£žžž¿>òÒw›ü–;ù"€ € €ƒ À}°‚ôG@@Œ@ɼÊVäÛŽôA@@àìÁ´€>zÓT}`á�7¥Èìê~ööœE@@’%pªµ[_øÎ:ýÏ‹ !œþænîyÞxÓkvk?Òê˜ÂöE¢æêœEÀÚf[úlMåòµgiÄ)@@@�³xãŠÊYä € € 0’¥ –,0ß˽BrÎÉy™ · \0y”>ýþYšwéåå„Ýšq#€ € €€Ç~µö ¾øOët¼¹+¡LKòßÜÍÝ»ºîHOOS0œ¥í5�ª?–Ø.ö®K–€ó1ëáz«`¥*—F†fHFA@@ü)àÂK)þ\(²F@@ ,XšVª“Ÿ6…îk¢ÎwQ䄊@ÒÂÁ€>ñÞzïÜIš9y\Òâ`b@@@ ?�c§:õùÇ×éÙõÕý59ãóAiÚ8[9awÜšÍÎÎTKwš^Ù×¢®žèsâIx§€õoV$ú`íºÇÞy†Ç € € €‰ ¸ã*JâyÑ@@Hº@É‚¿PäïÇù” †÷_I_p‹À³Æè·ÎÔœKÊ•“Å®înY7âD@@À/OWîÓ—ŸX¯S­Ý ¥\Z`©¼ÐV*îænÛ¶²²s´ïp�öÖ·%”�ð¹À.ljÝ]¿æ±U>w }@@@`H(°RNC@@þX dî’Kl;¶Òœ¹æ�Ïò ô'�•‘®O½o†n¾v’¦OÓ_3žG@@F\ éD‡þzå‹zasmBsgþ~7÷ìÙÍ=3#¬…ôÊþVµ´÷&” �ð¹@‡ùöƯæ/\¶cÇÒŸ[�> € € 0ä¸9)"€ € €g°Jç-þYÖ·ÌÙâ3¶àIèW`îEãôÿÝ4S×\T¦¬ÌP¿í8� € €Œ¤À/žß£¥ßß Ööøë[ûnЖŽ2»¹�²Íe‚‘Œöç²”››£º“Qm?ت˜ãüï þD�øžŽE­% k—×ÄלV € € €‰ $å’I¢AÒ@@ðŠÀèkÿ:'œÞý�Ùáé“SºWò"FJ ?;¨Oß6Sï¹f¢¦”�©iH¯@IDAT™@@èW áX»\¾F/¾Zßo›3�È Yš6ÎRߟ#q„CAYé™z½º]GNv�Ä”Ì�€×öK±ÅuU�ýÆk‰‘ € € �j#sµ$Õ²&@@@ É¥óî�*K�š0nJr(L�€k®¿¼Dzãt]ua¹2Ã|^ĵ Ià € €xDà§¿Ù¥¿ÿáFµuöÆ�Qßî};¹—Xò›»e&ÈÉÉQ㩘¶U·(e·ö¸‡†üŸ@·ä|-Íjýfuå“|:äÿ\ø @@6 ܇�–�@@@�s Œ_¸øf+ÖWènM9wkZ €À™òúvuÿ,½çª šZÁ®îg2â9@@�º#­zàÑ5Z¿­1¡ ³ûvs/²”šÛ·YYꎵõ@«N¶Å_pŸPÐ4FÀŽœ_Ú=P»j¥Ù½�@@@`¤†æ ÉHEË< € € €€¦,Zêj׳UÛ—LzYL‘”1�K§�ÑÇo�®9—kT^æˆÍËD € € €À[~øËúÆ�6«³;òÖ§Ïú{ßnî…¶Æ÷íæ~Ö–g>™––¦pf–éÑÞú69lÖ~f(žE >�펭%õ«W¼_sZ!€ € € ¥À@®� åüŒ… € € ð{�ÒwÝ?^±è?ÈÑG@A�Á ¤,}èÝStÛüIºdV‰ÒÓƒ�Þ € € €@‚šõÀ²5ÚòÆ‘„zæ„Ínîãleãë–““­S�–^Ýߪ®žh|�h…ý sç‹õváT¹4þO¨ô7Ï#€ € € H€÷±Ñ @@>�ò÷͉9ÎJ3ÃEÃ7 ##à�âQúÔm³tÝåšXZèŸÄÉ@@’.з‹ú÷žÞ¦oýt‹º(>·Í]Ü £m•äŸùvn8”•ž©�5íª?Þ•ô< ôšM'–ƒ]wàùï5{ R@@@\-pæ+"®N‰à@@@Üyg`ü‘¢OX–õ÷&*r=°¤¤�s/,ÒŸ-š®«/,U^NFjE € € ày�½µ§tÿ?ViëÞ£ åš›ñænîátÉ\#P¶Ù­½ñ”£m[�™êy¼€£ÿ–x°®rÙ¾ÁÆ € € €C!@�ûP(2 € € 0L¥Wß?J¡èWÍRŸ1SØÃ4 Ã"à;�PzÀºOÕ-s'êÂiÅ øëå» #€ € 0Â}éßyj«ýÙ«êé�Æ={Àlç>©(SÇZzt²­7î~4D�s XÛÛ¹¿~õŠÎÕ’ó € € €#+@�ûÈz3 € € 0 �Ò¹÷] ËY!Kó4�@ _� EÙúÔm³´à²r•å÷ÛŽ € € €ÀPìª>¡%f7÷ŽÅpŒ�‰ ô}•ÂëÆ6þ@O=ÿ§MŸ‡ € € € À}€ptC@@’ `�Ÿwï�¦ÈýÌ›¹ I˜Ÿ)ð¼À�W–êC×OÕU”)+3èù|I@@’#‰Æ´Üìäþ˜ÙÑ=‰%'fEÀæ+¬Gƒé�àùï5û/}2F@@Ü#@�»{ÖŠH@@@�Ó|,Uî=Žc}Qrò`A�¡ÈÊHןß2]7^3A³§Œ“eq eè•@@¶í;¦»¿¹Z¨µåÕ€Àð 8ÿ%+í¯ê*—íÞy@@@`(¸;;ŠŒ� € €$A`üuwZ‘´/›"÷ÏšéÓ’S"à �åyúØÍÓ5çâ2U”ø"g’D@@�áhëèÕ¯_:¨ÿ\½O¶5*s†wBFGÀ¿¯;Nìþú5�­ò/™#€ € €î ÀÝ}kFÄ € € €ÀÛJçÝ;Õl/ý Sèþ�·�à ¹Àœ ÇéÃ«.,ÕØQÙC>>"€ € €€w"‘˜Vm©=]ÔþÂæZuõD¼›,™!�|�£’õPÝØ†ê©§¢É‡@@@ À=-Ú"€ € €),P¾à¾91ÇyÄ„xE ‡IhxBÀ¶¥[®©ÐLÒå³Ç+7;쉼H@@†^`ÓŽÃzºrŸ~µö NµvýŒˆoè1 ¦w}íÀóßk~ë ~G@@p�îîY+"E@@â°ÊæÝ÷Á˜å|üá›OÚ €ÀàBé}øúɺùÚ ºhF‰Â¡´Á Ho@@p½ÀÞšSf§ö½ú¯5Tw¤Õõù�.xÚ 8U»jå~—ÄK˜ € € €ýPàÞ O#€ € €n˜²hq¨»ÓZì8Ö%'Ï͹;nÈÏéc7OÓõW”뼩E Ø\zqÓú+ € €ƒ8r¢Cÿ]µß¶ïÓ΃Çå8ƒ�¾ �€ÀVó×íþúª«èCS@@@�à.k /¡!€ € €ƒÝÝ…V4ð%9ºÛŒÅ¶Òƒ¥? ”ŽÍÒŸß2Có/-ÓÔŠÑ ô¤) € €¸E ­³W¿^wPO›¢öõÛ�QÕî–µ#N/XM²œ‡êÆ4þ³žz*ê…ŒÈ@@@àM Üy% € € €>(�wïT“æ×eév¤KФœÀù“ ôÑ›§kÎEe?Ž/UH¹" @@ˆDbZýríé�ÚŸßT«®žH½iŠC Ð#ËZîŒ}m߯•-C0C € € €¤˜î)¶ „ƒ € € §@ÉÂ{®µ£ö#¦ÐýÊᜇ±@ �…—è®ë§èª Æ«0?«ÿ†œA@@�”ؼóðé¢ögÖÔÉÖ�`ð‹€)pø…ÎjW­Üï—œÉ@@ð£î~\urF@@¿ Xeóîû`Ìr¾aÞNð;ù#�,�€mé}ó&èýó'é’™ÅÊÍ'+æE@@�~öÔœÔUî×ÓUûUw¤µŸV<�Ã/`­²¬èçj+Û2üs1 € € €@²(pOö 0? € € �$�)‹‡ºÛí{Ëù¢ !?Ia0-�Pº­;Þ5Iï¹²üt±{^N. € € �$�]Õ'ô+³K{ßNíûêN%) ¦E�ß ¼f9Îçj׬|Î_³zÅË#0S € € €¸P€w.!#€ € €ÉwÃYé]Ý÷Ȳ>gb(HVÌ‹çè+vŸsa±îºn².™Y¤²¢üsw¢ € €.xmÏÑÓEí¿^W­Ú#µ»lù×g–œW,ÙSSµü9Ÿ¥Nº € € € Pàž Í@@@¤ –ä÷*ö åh‰ñÈÂR_àâ©£uç»&ê²YEš6qŒ¶�úA! € €ïè�Ä´nkƒ~·ñ�žßT£ÆcíïhÁCHA�ý–c=T»¦à)ii,ã#$@@@� À=Å„p@@@7 L¼î¾q½QçórôwÐM±+~(—­^7Iל_¬ÙS‹”N÷3¹#€ €¤¸@s[·^Ø\«ßm8¤ªWëÔÖÑ›â¼)`5YŽóÕÜ㣾¿cÇÒT@@@ˆW€÷x¥h‡ € € Я@ñ»î®D_6 >f~غ_)N �zYiº}ÁD]wY©.œ^¤Â|¾”!õV‰ˆ@@ÿ ÔiÕoMA{_Qûæ�G‰²é³ÿ^dìb�6³·»¢á<¶î›­.΃Ð@@@’$@�{’à™@@ð¢@É‚{fû+ŽôA/æGNx]À6Oy÷eãuóµºtF‘*Æ�òzÊä‡ € �B¯í9zº ýwiOÍI9æÍ%¸J ïë¾ÛÛÛówG^ún“«"'X@@@�” À=¥–ƒ`@@@o”Ì[|±mÙ/9‹¼‘Y àO�ùúÐu“uÕ%š>qŒÒ|Aƒ?_ d� € �@OoT/¾Ö çLAûs›jÔt¢cx&bT �µ£�/Õ¬]v`$&c@@@o Pàîíõ%;@@@ ©eóÏ�Éúšyó9'©�09 Z  7¤¿{Š\:^L-RVfpÐc2 € €€ÿN¶vëySÌþ» ‡ôâ«õjïêÛð™\+à8¿�IŸoX³òU׿@à € € €)'@�{Ê- !€ € €ž°Jçßs£Ô·£».ö\v$„€ÒÓlÝzm…]S®KfilaŽH@@ ^�ƒ ͦ Ýµ›�Ú_~㈢1'Þ®´C�0‹Ÿ3×z®¯zt}ІHX € € €. ÀÝÅ‹Gè € € €€»–Úã矼ݒó·&îéîŠ�h@àlN-ÔæOÔe³ÆiÆÄ1 ¦§�­9ç@@<.‰ÆL!{“Vm©=½SûþúSr¨i÷øª“ž¬U¶¥‡k*—¯õOÎdŠ € € 0Ò¸�´8ó!€ € €~X°4­,vüÏKK%«Ìïä�€×r3ƒúÀ‚ š{Q±fO«’±y^K‘|@@Î Ðp¬]«MA{åËuZ÷zƒZÛ{ÎЊ§@ÀµŽªp®[½²Êµ98 € € €€k(pwÍR( € € à-�)‹‡º:ôæë¬’œ±ÞÊŽl@ OÀ2Wž.›1Z·\[¡‹§�ÕÌIc¥ƒƒ € à�ÞHL¶5jµ)h¯|¥VûjÙ¥ÝËJ ü‘€ùò…¾�Ú¿\_µbõ�ä @@@†I€÷a‚eX@@@�øÆÝð`V°«÷ÓfG÷¿¦Ð=>3Z!àV�¬Œ4Ý6§Bó..ÑùÓÆ©¬(ß­©7 € àK�êÆ–Ó;´W¾\«õ¦¸½£+âK’FÀÎú˜¥/7T®|ÁäkêÜ9@@@9 ÜGΚ™@@@Î"Pré§2­œÐ§,ÇúœiVt–¦œB�̨È׿OÐ峊4kòXef=’i € €ÞèìŽhÝÖ³C{�ªÌNí}î àqG­€õpíêå¿3™RØîñå&=@@@ U(pOÕ•!.@@@À§¥Wߟ¡`ô&ý¿1?%>e m|'L hÑU¥ºþŠ2]4}œ*ÆøÎ€„@@�TØSsò÷»´×iÓÎÃêBXÄ€Ã.`m‘ã<\·fÅoÌT¶»7 € € €œM€÷³ép@@@ i|,uò>îÈù¼ ¢4i�01$E tl–îX8I×^P¬™“Æ(/'#)q0) € àu�¶Ž^½øZýï‹ÚkÕp¬Ýë)“¼]àÕ˜œ‡ªVþÊa´23‚^J‘\@@�ˆ9Ž^ß{Lk·6hõ–Z½²»I‘HlÄæg"H�­–e/­­|ô¿MD¶§Ì² € € €@Ÿî¼@@@\!pÞyKƒÍcNü™©Åxȼ™�àŠ  †E ˜fëú+JµðÒÍžýguc³6h÷Ô“ Ã-`þÉxÎÌñõúª•æOþnpÆG@@Q ÜG”›É@@@’(`�_pßͦjäsæÍðœ$ÆÁÔ àr�ìÌt]wI±®š=N3'jJùhåe‡]žá#€ €Àp D¢1mÛwìt!{_Q{ßNí};¶s €0…ìÖÓ–ýzmåc[П. € € €¸B€wW,A"€ € € ¥@ɼ{¯±¬¾Bwë½C9.c!€€?l[º|Æ]wY©.˜:ZSËGilaŽ?1È@ÔÖÙ«—Mû&S̾ÙìÐþÚž£êìŽ ƒ F bYú;fÿá5�¾1˜�è‹ € € €€(pwÃ*# € € €À°”Ï]<+jÛeÉùˆ™ }X&aPð¥@Ÿl-º¦L—ϧé…*-ÊWÀæRœ/_ $� ày�ÃÇ۵ɲ÷´o1?»ªO(3›,s €ƒè2C|?ˆ>Ò¸êñCƒŽ@@@p‡wÕܱND‰ € € 0Œã,.•cÝoÞ$ÊL“=ŒS14øT #”¦…—”èÚ ÆiÆ„Qš8¾@cFñÏ�O_¤� àbÇÔ­ï­=©�¦ }ó³CûÎê?Ú¦¾ç9@�¡°š-Åïéí]~ä¥ï6 ݸŒ„ € € €€;(pwÇ:% € € €À”ÏùL�c§Ö±tŸ™nÌLÉ àc�r³Ëû W”ê¢i£5¥¬@LÑ{VFÐÇ"¤Ž €@ê 4k×Ö=GõÚéŸ&½¾ï˜Ú:zS/P"B�XM²´,˜ÖùOžÿ^³G’" @@@ À=a2: € € €x] ôêû3¬`äcެM®“¼ž/ù!€@j¤,]={œæüa—÷|•(°S#@¢@@Àã-í=§ Ùû Ú_5?[÷UÓ‰�gMz � æK ªmYßrzì®[¿¬3b"@@@’)@�{2õ™@@@ µî¼30þHñí¶å|λ_’ÚÁxQàÿgïÞ£ìªî;Áï}n•ª$ôDBBO按�ÇÁ€�àñJ¼Òi[Ý+ö¬‰í™¡íÄ2�îå¿ë¯žÇšnð€Iš5vØ ³ûGOG‡ö}é{?Ù—ÖyPÖ_�ºZ ¤{Jªÿõîûo½7æ-x @€ @€¿H@Àý©8F€ @€Ž!°nó�çæºý/KN‹SGŽqº·  0çg�¹°zû¹+"ô¾$­_½$­Z¾hÎçᆠ@`¶šÎì?Ýó|üÙôýfûéþô_¼/í{îðlÝÒ¸8Y�ÿ˜Sþ_vÞ÷Ù8Ù\G€ @€I@À}�V[­ @€ 0ãg_}ýªééúÓ%åß�Á—Îø H€�X¹l4mŽNïï8/Bïë"ô�Þ×®\’Z-¿�b™ E€³ 019�~öñÇ÷wÂìã?}6ý·íûÓKÓ³p7C @`F¦r*™ëô¿íxà–ïÏȈ!@€ @€" à> ­L @€˜]�—}fÑüÖ‘ëJ.7Æ�ÖÎîÝŒN€�™XzÚpºâ«Ó%ç¯Hç6¡÷èô¾nÕÒ4:24s718�gîteo:³wº³G˜}ûžR»Ž–íè~�ýlÿã4]>·ó›·îéþéš! @€è>÷î[3"@€ @€�¸è¢±y/œñì‡ë’?ÿÑ}a—bê °ÀPU¥M®Hï¾hUzëÆeéìµKÒš•‹ÓÒEóXEé 0Óu)é'»ž?Ú‘ýÕ0ûþ´ï¹Ã3}+ã @`.~Xrº¹¼8ñ§{¾ý¥¹¸¡{ @€ @€�~pïוU @€œb�±jÝæýצ’®�‰üw§x2nO€�X±t~zÏÛV¦_>oyzK„Þ×­Z”Öœ±8-^8:#ã„úWàÐÄTúÁO÷¿fßßéÌþ£Òá#Óý[´Ê �’î)­rÓî{—ÿuJcõ`­J @€ 0»î³ëkt @€ �Îzï Nç²5~EùïÇ$è7�ugœ–ÞsñªtÑ9Ñí}MßW.J«£ãûÂ#ýVªz @à/šLMpý±Ï¥ÇvˆýxŽ×O>{(EÃvô‹ÀdIù/RUß¼ûÞ[¾Ó/E©ƒ @€t‹€€{·¬„y @€ @€@ß l¸ü“ËêÖÐÿ…nM)¯ïû‚H€À@ TUJç®]œÞ}ÑÊtáÆeé¬3§5|_Á÷£óÚFñè�gŸŸèØ› {'о³ ´?—ž9ð’ {?,°øÇž�ïêÜ6œ§oÛ¾í¶½ÿØIŽ @€ @€oN@ÀýÍù¹š @€œ¸À污µåÀïT%]_r¹ìÄpzW`¨•ÓÛÎ9=mº`y:oýÒtÖêÅim„ÞWŸ±(�Ž ÷nafN€�>xjÿK¯vdÿqØ]Ù›ç&àîA€�AˆPûrÊ7¥ÉêÏw=xÓáA©[� @€ @àT ¸Ÿ*y÷%@€ @€!°þÊëß!÷ëSIÿ<^A!@€À  äø¤rÃÊ…iÓ…+Ò/mˆŽï«¥Õ+¦UËOK+O_˜††ZƒJ£n̉À®§¦Çvètao:±¿²ÿ¡É9¹¿› @ "Øþ7ñïÔ»kÛéw§4Vwã͉ @€ô£€€{?®ªš @€ @ çÖ_ö©5u«õÉœË'bò+z®&@€À, ´ªœ.ܸ4]rÞŠtîú%iêEiÕŠÓÒª¾¯XvZªâ}8¶À“û¥íO¾�¶ï‰­yîì?ŸžxòÅthbêØ8ƒƒ!Ð|³çÏS©oÞuÿ­ßŒ’UI€ @€ºKÀO~ºk=̆ @€\`Ý¥7ÎÏÃÓ¿[ruCJåâçP>Ž)0:Òêß/~˲tΚÅiÝÊ¿7]ß—/L§/YpÌë�@€�~(Ñjx÷Ó/¦Ÿ¾^%ÄþBÚ±÷Å419ÝO媅3-ðLÊé¶áVþ£ŸÞóÙ§fzpã @€ @€Ç/ à~üVÎ$@€ @€s)�×^ùéÍr¿!§ü�¸±ÿ†ŸK}÷"@ /–/Iï¼`Eºðì¥i㙋Óêèú¾bé‚tzlË#üÞjU}Q§",�v]Ò®§^ü¹Nì?Ýó|ÚùÔÁ49Õ,Õ @àM ”ñTª›†ªçïØ¾í‹oz8 @€ @€oZÀÇß4¡ @€ @€Àì ¬ÿõ­o)uÞšJúxÜiÑìÞÍè �¡VNç®[’ÞzvÓù}Qt~_˜Vž¾ �!?TI Ëž{ñHÚýÌÁ´'¶&´Þ„×·7]Ù÷¼�vűééºË+0=ô„Àÿ›K¹içý·üMÌ6~† @€ Ð-îݲæA€ @€Ž!pî»·.žÉ‹^SÏ9ÆéÞ&@€�7!ðºüÚÀŸ±0­Š|Óù}yÓ>6àß°K °Àt»N{÷Šû¡´ëé£!ö&ÌþʶçéCéÐÄÔ )�³*p$Fÿ³ªjݼãÞ›ÆgõN'@€ @€NZ@Àý¤é\H€ @€N‘À–-­õûVÿV©Óõ1ƒ«NÑ,Ü–-0ܪÒ[Ö/Noݸ4:À/îà›ð+–ÎOK�Æ6?�6Þ@)žÀ  ¼ph²Vï„×#À~4¸�ö§_ì„ÚŸ9ðRj×êŸu pÊvÇÆÿÝäÔä¿{ê[üô)›… @€ @€Ç% à~\LN"@€ @€Ý)°öª­oÏun:º$¶‘Y @`0–œ6/�¿aIÚ¸::À¯<-­Z6¿€_¶x4-�üÒÁ/]ý®´mlºOËT @€è;÷¾[R @€ @€À ¬½ú–WÓ­ß‹Ü"ê?o ÔL€�^Èñ íÊèú~Þú&¿0­9#‚ðM'ø%£© Â/YAøÁ7á[•�s{q�͹û¦¦ëôt„ÖŸ~9´þTì7áõ£Aö£Ï�÷ž;œšs= @ Ûòó¹¤?i·Òï¹÷³?ìöÙš @€ ðó~"òó&Ž @€ @€�«Ö^µÿªÜNŸL9ý“(D[à^MS'@€À+M¸}í Òùë—¦ g.ì„âO_<]àGÒ¢èßl ŒÄûñ¼`þ¼W.õL``ž?x$Bë‡;áõ&°Þ ±w‚ì/‡×_²7ç•ø– ô¶@Nå‘TÒçÚ‡ŽüÕž‡o©·«1{ @€ 0Øþª'@€ @€�>XÙ§Ö¤áüñl]—R^ßÇ¥*�Þ 0^«„_»raZ}úütFt‰_¾äh ~ÉÂÅ7AøÓ^ÄwžGR¥Cü½ì�év�ž{ñH:ð‘ôÜÁ‰Îó�xÝ9öâ+¯'^~ÝœÇâýÉ©v·”` 0{Gâ7âüUi—Ûv=pË?Äm|eiö¬�L€ @€æL@À}Ψ݈ @€œ"�ÍcCkʳï¯RþDÌàý±ù<à-…Û @ ["––/í„â׬8-­ŠPü²è¿daÓ~8�6:”N›?œæ�Äû�çØN b™7Ô­¥™W LM×éàá©ôBtLoèMý¹f?‚ëš ú+¡õ—êG_O¤Cq�ë]´�¦B€�îøI.ù�êáé/î¾çsÏvǔ̂ @€˜)?О)Iã @€ @€�8뽟:»ÎÕÿ\Rþ£±Ýʘ²) @€@ŒŒ´ÒÊèÆÒÑNPþôÅó:áø£Ýâ‡;ã�†äçuòM(~þÈPn¥á¡Vš÷òs”oö=ºC  •7áòƒ‡';ÁôÎþKS/‹ã/=Þ„Ö_û^³ÿÒÄt:41ùêñâÜÉ©º; 3 èU�º¤ò•ªªnÛyﲿIiÌ_,½º’æM€ @€Ž! à~ o @€ @€�~¸è¢±y/,?ð;ødôs¿²kTô¦À¼¡œ–.š—–.I‹OkºÇÇ6?ºÆ7]ä›®ñ¦_û£„��üȼV‰ýæ¹ ÇÏŠàüPu44¯[UNU³E›úÎsçuÕÙï¼÷òñV«êœÛªâ¹•cÿõÏCñþL?šyÿSš¸^ ^Çsóúè±ø*ÚËûq¸óÞ‘©v„ÄÛéÈäËÏ/¿n‚ã�cÓ/¿Ï�óâý©x¯Ùoº§OuŽ¿òçv®?úþá³£ ­?wh2½Ûá#Ó:§Ïô¢�NB ?�SýM·êÛŸüÆçž8‰\B€ @€ô˜€€{�-˜é @€ @€�™8ë½7\Ø®ê‘JþhDé–ÌôøÆ#@€ý"Єä›ð{våyèå0|J�¿G#¬Þüog/ö›�à_~O� {j‚ì)¾aV·ë4×µÛ±uŽÅa @à�â¯ÞÛ?sú›|å g @€ @ ÿÜû�UH€ @€ŽK`ͦë´ŽþóˆÜ}".øÕãºÈI @€ @`æ–”ÿ,—öíºÿÖïÎܰF"@€ @€zI@À½—VË\  @€ @€À l¸êÓ›¢»ì¿ˆî²‰[.˜£Ûº  @€ ¤@�\îðôü?ß÷ÍÿýÅ�$P4 @€ 𪀀û«v @€ @€�7 œsÍuK¦&Gÿû’Ë'#ì~Ñß÷š @€œ¤ÀTü±/W©Ü¶ó¾[þ6ƈ— @€ @€�øÉ4 @€ @€Àqä ›¯¿¬Nå9ØçÏ;ŽkœB€ @€Þ(ðx.é ­júó۷ݶ÷�ozM€ @€p÷g€ @€8!�3¯ØzF«•>’Kõñh°wñ ]ìd @€D�‰(úΔ«ÏïÚ¶ôþ”ÆêADP3 @€ p|îÇçä, @€ @àçò†«>ýÎv�>0|8Þ^úó§8B€ @€,ð¥”Ï�Ì;òW�ýöçØAé @€ @€À ¸Ÿ–S  @€ @€�_,°qóGGÛõ’ß.©þXÊùÚ8Ëg¿˜ÊQ @€ô»À¾øÂ?+¥þ“]÷ßúÝ~/V} @€ @€ÀÌ øaóÌ›‘ @€ ´Àš÷þáúVšþJN ˆ· 4†â  @€ 0u|Ïùk©JŸ_òô²»ÆÇÇ&£lU @€ @€³! à>ªÆ$@€ @€�¼þ½×_QGÐ=§òÏâõ, @€ ÐW?))!åúOwo»eW_U¦ @€ @à” ¸Ÿ2z7&@€ @€ƒ#°â²Ï,šß:¼¥Î9ÂîéòÁ©\¥ @€è;�Ãñ%æ/•*}a×½ËHi,º·{ @€ @€fN@À}æ,�D€ @€‡ÀÚËÿàüªÕúhIé÷âô5Çq‰S @€ @àT ”ôw)§/ÌžøÿúíÏŸêé¸? @€ пîý»¶*#@€ @€Ý-°eKkÝ3«#—ôñ»ÿvLv^wOØì @€ 0pûâ¿×þ´ÊéOvnû?¿7pÕ+˜ @€8%î§„ÝM  @€ @€�× ¬½ú–çéÖ‡ãØÇb»äµïÙ'@€ @€�9¨SÉ�Rý…%Ï.ÿÊøøØäœÞÝÍ @€ @€��pø? @€ @€@w ¬Ý|Ã;r)t/‰™-ï®Ù™  @€úU ü¸¤ü…jºþ¿w~óÖ=ýZ¥º @€ @€�îpïþ52C @€ 0�ç¾ëÈÄDõ[©.€÷ÅÖHE @€ @`öåT¾œJõù�÷ö�¸M™½[™ @€ p|îÇçä, @€ @à ¬zÏ'VÏùg©ÔN)_z §âÖ @€èu�éTò×r®ï˜ùÏOÝýêõ‚ÌŸ @€è/÷þZOÕ @€ @€�¾Øpù�甪ý»uN‰6.ìû‚H€ @€�™øVNùŽvú÷{¶ý›}33¤Q @€ @€3/ à>ó¦F$@€ @€æF ¯Ý|ÃÛs)ÑÕ½ünÜrÝÜÜÖ] @€ Ð%¥T%ÝQ¥ú/ž¸ÿÖŸöƬ͒ @€t÷Aÿ ~ @€ ÐcÕº«ž½"Õ9ÂîiKlËú¢,E @€ @àÄö”\þ²ÔéŽ=÷ßòí¸³ìîññ±ÉS0·$@€ @€t�€€{×,…‰ @€ @€])°eKkÝ3k¯H©þP*éŸÆWwå0K­P @€ @`Žò†«n|kÝn(åNØýmst_·!@€ @àÔ ü$å|gNí;wn»õá˜FdÜ= @€ @€NF@ÀýdÔ\C€ @€8N�5W]A®Ó«T°¤üÎã¼Ìi @€t¿ÀKNwv:µo»ù;1]¡öî_33$@€ @€z@@À½É  @€ @€�þØpù�çԭ馒?ÝÝßÝU©‚ @€À@ |/bìwV­Ö�;î½éûQ¹Pû@-¿b  @€ @€�¹pŸ e÷ @€ @€¼A`Íå×oÈCõ?mÂîñÍeñ¶ÏiÞ`ä% @€�.x4~Ó�¥J_ÞsïgØ%s2  @€ @€@ß øÁiß.­Â @€ @€�^8ëŠV·[õo–R>�Sþ�˜÷ü^™»y @€èS�ˆºîÌ­òå�߸å'}Z£² @€ @€]) àÞ•ËbR @€ @€À  ¬»ôÆùetú׫R} ï¿kÕBÝ @€æP`"îõõØîJ­ÖWw}ã¦Ýsxo·"@€ @€x�€€ûk0ì @€ @€ºL ¯¹â†KªªA÷ê)•_é²ù™ @€�^Ø“ÿJÉù®òâáoìyøö—z¹s'@€ @€ô‹€€{¿¬¤: @€ @€�¾XÙ§Ö”¡ÖoæT>PRº& žß÷E+� @€ÀÌ <œJº«.Õ]{¸ùÑ:þiíA€ @€ ÐMîÝ´æB€ @€8N�u—Þ8¿ŒÔWçR¢³{ŠïiÍq^ê4 @€ƒ$p8~ úõ’ò]yºýÕ�ß¼µéÚîA€ @€ ÐÅî]¼8¦F€ @€8N�¼æŠ.©rý�”Sxßtœ×9� @€@? ìÉ9ßU§ô•òâáoìyøö—ú±H5 @€ @€úU@À½_WV] @€ @€ÀÀ ¬ûõצvû7  »_ÛèÀb(œ @`@õv@IDATòI¥|¥.Õ]{¸ùÑ(º HáÊ$@€ @€ô�€€{ß-©‚ @€ @€?X³éºiáÈÕU'ìž+ÞYý³wí @€èY�ÃñƒÎ¯—”ïÊÓí¯îüæ­{z¶'@€ @€x�€€ûë8¼ @€ @€ô³ÀXµáªý—Ô%:»—Þ˦¨ÖçCý¼äj#@€ô—ÀîœóWê\ß•'†¾±ëÁ›÷Wyª!@€ @€hüÓŸ @€ @€À€ ¬Ùü/W´êé«ë\Þ] k”BÙ @€Ý)PâÇ™§Tß_Ò¼kÏý·|;¦Ç< @€ @€úY@À½ŸWWm @€ @€�ãÈ®Øza»ª"ì^š°û•±Í?þË�I€ @`FvE‹®¯•:Ý�†Û÷ì¾çsÏÎȨ!@€ @€è÷žY*%@€ @€Ì�ÀÆÍ�L‹.¯Ja÷Nàýíswww"@€ �C©äm)×wÇoº{϶[µëÒ>@”J€ @€x£€€ûE¼&@€ @€ø9��›ÿÌ©2ôñaRÞsz_ùs'9@€ @àØ^ÏçTß]ªt÷’§—?8>>6yìËœA€ @€ 0(Òê$@€ @€̘ÀXµvós¿œK}môÖ¼6åtE =oƆ7 @€@¿ ìŠ3~­Ôéî4ܾg÷=Ÿ{¶ß T @€ @€ÀÌ ¸Ïœ¥‘ @€ @€)°êÚuÚð‘‰÷æÒº¶Îå}ñ�Ó… ¡h @€�W¥’·¥\ßÿ>¼{϶[oDçv @€ @€Çp?¶‘3 @€ @€N@`Í{ÿp}+MýFÊù}‘bº&.=ý.w* @€@ï Ä?ûòÃ9Õw—*ݽäéåŽ��Mö^fL€ @€ Ð îݰ æ@€ @€èW�-[ZëŸ^óÎTʵ‘zŠÐ{úµ(u¤_ËU @`€vÅ¿í¾Vêtwnß³ûžÏ=;@µ+• @€ @`Üg×Ð @€ @€¯ظù££ízɯ–\oŽ.Ÿ±¥Kc�̓ @ »¥’·¥\ß]çr÷žm·þ0¦ßaô @€ @€ 0³î3ëi4 @€ @€�8÷ý[G޼”~µ »—Nོ'.x?C§ @€fIà…÷oc»/Uù¾U/~äá‡oŸš¥{– @€ @€À«î¯RØ!@€ @€8Õ¯Þsº²ÔÑá=§&ð>ÿTÏËý  @€ ð\Iåþ*åûr•îÛQNÿNÚ66=u+‘ @€ @ ËÜ»lAL‡ @€ @àgMà}òpõ®R—+#ì]ÞÓeñ®Àûψì @€NV`_ü�ûSªï+hß}ïòï¦4VŸì`®#@€ @€ 0Sî3%i @€ @€�Y¸è¢±yVî{W®[W¦T6LJ[Mà}Á¬ßØ  @€=._|ªJé¾µG‡öê¾÷.ù�@{�/ªé @€ @€úT@À½OVY @€ @€�AèÞ—ïÿ•œÓ•ñA׿¨ùòØÞañÕH€K`wœ�öt_]åûöÜûÙÅ~äÜ= @€ @€t·€€{w¯�Ù @€ @€œ€À¦M× ï]¸àWRª7çR®L97ÞžÀN%@€ôªÀŽ˜ø}©D‡ö¡zÛÎoÜòx¼hïÕÕ4o @€ @€À ¸ðâ+� @€ Ð÷[¶´Öî;ómôº4—ôžÈx]šR>·ïëV  0�Gz=íé¾áªºoû¶›·BÑj$@€ @€è÷þ_c @€ @€¼F`Õ{>±rÞÐȯ•NØ=]šrúÕx{þkN±K€è6�©˜Ð£ñE½‡rªªsz`÷¶[vuÛ$͇ @€ @€ÀL¸Ï„¢1 @€ @€zV`Ӧ놟Y<úËuty�¨ïi‚ïñ¡ÙÆž-ÈÄ  @€�>(;s„Ù£�‡êT=8œŸ{tû¶/NôAaJ @€ @€ pL÷c9� @€ @`Ðκâ†Õíܾ4º¤6ÞßõoŠmdÐÔK€̉ÀDIé¿ä’J­µçê¡]߸i÷œÜÙM @€ @€t¡€€{.Š) @€ @€t—À¹ïß:21Q½£Ôé=Utx�Zz_Û]³4 @ G�yF�=?˜Sû¡ÅϬø¯ããc“=2wÓ$@€ @€ 0ëî³Nì @€ @€ý(°æ½¸>§éK«èò^riï—Ä6Ü�µª‰8i�CqåßÇäj§ò`{jêïžúÖ?}Ò£¹� @€ @€À¸À"+‘ @€ @`öÖ]zãüztê�­R]Z—´)>xÛw=oöïì @€@ ü·’òC©ÔåR=¸ëÌ=ãéK_jwÑüL… @€ @€@× ¸wý™  @€ @€@¯ œsÍuK&§\’벩ä&ð^šÐûù½Z�y @€¯x.^ý}ÊéÁx~(iýý®oÚÿº3¼ @€ @€ @à„ÜO˜Ì @€ @€N^àÜwo]|d¤zG�÷œ#ðÝÞc´ bóYÝɳº’̪@I驸‹úáøÂÚ£ñŵG†ªÖ#Û·ÝüDÜ4Þò @€ @€ @`&üÐl&5�E€ @€ @à$V\ö™Eó‡ ½—¼)’r›âƒ»_Š¡|~wž.!@€oF þÞ?_D{¤Ôù‘V©}â�›Ÿ|3cº– @€ @€�ãð²ã·r& @€ @€�98cóï/œŸ†ßQ×Ñå=º½Ç�›­ ½Ws6 7"@€ý-Ðt_ÿQ|Ÿì‘&Ì¿]åÑ<Ñzt׃7íïï²UG€ @€ @ »Ü»{}ÌŽ @€ @€À««®ýW§µ¦&ÞQÕ¹éðÞéô¡¼ ã¡÷W•ì @€�_(0GÇ#Ñaöaöö£S¥þÎ3Ûn;ø Ïv� @€ @€�S& à~Êèݘ @€ @€À›è„Þ'&ßžS¹8WùâTÒÅ1j³-{ó£�ô¤ÀDü}ø�AöøAØ£UU™7Z¾÷㿾åHOVcÒ @€ @€L@À}À\¹ @€ @€!�×_ö©Õi^ëâÔNoKU‰à{¹¸¤üÖ¨~t I€ƒ"ðLJe<—êÛu.�´ªÖ#;Ê’¦mcMÇv @€ @€zP@À½Í”  @€ @€œ”À–-­µO®|K®ª·¥ÝÞ›Nï9ð)�[uRcºˆÌ�Àþ¸Íx|Yë{U)㥪ƧÛíñ½Üw @€ @€úI@À½ŸVS- @€ @€NB`Ý¥7ί‡Ê…9—·åÝÞ�†Þ›üÚ“Î% @àÍ<—K/¹Œ7�ÙK•LJËôøöm·=ƒ–73°k  @€ @€è ÷ÞX'³$@€ @€ 0ç|?=Ï›¾(š»_œJ¹¸Žà{ît~/Kæ|2nH€ý&ðb4_ª/h¯J=^††Æw}ã¦=q\�½ßV[= @€ @€N@@Àý°œJ€ @€ @€@Êk7o]›#ðžsuQ)åüTòùP¼ lÎäC€Þ p(^¿¤&Äž¾Wª2^×Cã{îÿ·»â¸ û°¼$@€ @€ @ Å��< @€ @€ 0ç¾{ëâÉù¼R—óKÎt‚ï)ð©~_8·0t­@~>¦öXNu'ÌÞÙ‡Kk|û¶¥;R«»vÚ&F€ @€ @€@× ¸wÝ’˜ @€ @€�¾Èg]qÙí¡öù©Î”\ί¢ë{´ímº¾ŸÛPßU¬ ô¥ÀÑ{IåÇQÞcñE¦§œ+¹õØžmÿæÙ8¦#{_®»¢ @€ @€Ì­€€ûÜz» @€ @€¯Ø´éºá§NÝXª|AU¢Û{Žà{©#øž›Îïk^sª]˜�â6�ERýh€½yŽ{»nÿxï·ì‹÷„ØçfÜ… @€ @€ÀÀ ¸ìÒ+œ @€ @€@w ¬¸ì3‹æU“çµZu„Þ#üžrÓñ½ÙÎŽíôîž½Ù @ «ކØstb¯«Çb¦h/?®KyLˆ½«×Íä @€ @€ „€€û@,³"  @€ @€ô—À¹ïÞºxb¤œUç¼±Jyc|Ðyv´ÞU¾²-‹} ²ÀBìåÇMWv!öAþ#¡v @€ @€½!?÷ñ @€ @€ @€@ œsÍuK&�Ì?+ç´±äzc.ÕÙÍst��­‚_Ïèa�ütL~G³åTž¨sÙ‘ëØ¯ÊŽ©v~B'ö^ZS'@€ @€ 0àîþ@ù @€ @€Q`ãæ–NåöYM÷÷èf|vŽçTGð=ñ)ºÁǶ86œ*�É”J„׫%Âë9Gp½.;ÚUÚQÕù‰4ÕÚµëÁ›ŸªÉ¹/ @€ @€fS@À}6u�M€ @€ @€@O tðÑ齊íh¾ ¾—5QÌš[|°ÚìÏëÉâLš�nØ]×#¼aõ&¼^ÒŽ¦{Uª'††ÒŽŸÞ³ì™”Æên˜¨9 @€ @€ @`®ÜçZÜý @€ @€è�¼öê?8½j·V§:‚ïUZS—jMα_"üÞlÍ~Ê«£Ø¡~(X —@|&G8½ì�³÷Fçõ'ë¯7Ø«’Ÿ˜Žìé…Ã;÷<|ûKÇ5š“ @€ @€ 0€î¸èJ&@€ @€ @`®ƪ3¯xvyk(º¾7AøÒz5Ýš£|!ø&ŸVÅÖš«Y¹'*�Ÿï„ÖKÚ[ª²7§öÏõÞèÂ[µw8MîÝžVîKÛÆ¦Ottç @€ @€ @€ÀÏÜfa� @€ @€§F`Ë–ÖÆgÎ8c²=oMnEð½Dè=w:ÁGø¼"‚µÍ¶<‚´+âCÝØ†?5 å®}&0íÖ#¤ž"¬¡õÒÕ#ÀûU«ÙÏ{ÛyzïH}è©íÛ¾8Ñgµ+‡ @€ @€]+ àÞµKcb @€ @€ø…ùœk®[Ú:¼÷ñ¯ßþBœ‡= @€ @€ @ ›Ü»i5Ì… @€ @€³#ð³PüTŠà{îß#ü»¼JõÑýÇ›îð� |nöÅvÚìLǨþQ�ƒ‘9� zŽ zó\EH=žK¼Îi©ë)WûKŽçvkÿ¼VÚ_ ½tàñ¯¯y1¥±&äîA€ @€ @€=. àÞã hú @€ @€˜5�-[ZçX¶pbráâ¡2µ¨ÝJ‹[¥ZTWiq.õ¢èŒÏyQÉiqtŠ_”s‰×Í~Y>wŽE{ìű߄åÌÚ< Ü /E(½ §ŠÉ4ÛÁè�~¨är(§*^×s©•ª<ŸêèªaõT•ý¥�¤ªÞ?ÒjX°wÙ�ññ±Én(Æ @€ @€ @àÔ ¸Ÿ:{w&@€ @€ @€ÀàlÚ˜ž[89] W‹ÚuY\•v',_5!ù&,_•Eu]�äœF"(=8�ý:ö#8ǪW�7ïÝŽž÷ ÞÛÿÿJ§âíØrl¥ÙoäÍóáN ½D =§¡§ƒÑþüPn^GP=ÖâP�ôÜÖK¼n•Cíx¯9/×åPUj�Ô‡^j |êî…1–îéaêA€ @€ @€3 à>ˆ† @€ @€ @€�®Èç¾ë¼è>rp^©òðhU•xnBñíÑéöÑà|¤�î⣩.#ÑM<²ÜÑo¼ÄY©ŽÆô¹Š`wì—ׯ{±ß¼Ÿâý¸¨9^âu¼Œ,x<7Ç›÷ãu*Ñã>Î�nå±_uê\¯;×Ä ©ª:ûqÕT©ÓTÎy*ºÝÇsÝyñc?Þ‹ãÍ9u»=ÕªZ“u³?Ý›žŠ»Ä±<Õž¬¦†ã¼©VkjtèÅ©‰ijuŒõð÷OǪİ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€Àÿ× ò·žÆŽBÈ€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€½d´ ;IDAT 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`ÀÀo ŸOÍ«·TI]IEND®B`‚rvirding-luerl-772b25e/rebar.lock0000664000232200023220000000000415114130670017323 0ustar debalancedebalance[]. rvirding-luerl-772b25e/doc_legacy/0000775000232200023220000000000015114130670017455 5ustar debalancedebalancervirding-luerl-772b25e/doc_legacy/luerl.txt0000664000232200023220000002365615114130670021355 0ustar debalancedebalanceluerl(3) Library Functions Manual luerl(3) Name luerl - The basic interface to the Luerl system Interface functions - New Version The Lua State parameter is the state of a Lua VM instance. It must be created with the luerl:init() call and be carried from one call to the next. As it is possible in Lua to create self-referencing data structures, indeed the standard libraries have many instances of this, then using the functions which decode their return values will generate an error when they would cause an infinite loop during the decoding. An simple example is the top level table which contains a key _G which references the top-level table. Note that Lua Chunks (see definition below) can travel between differâ€� ent States. They are precompiled bits of code, independent of State. That you can ‘carry around’ this is no unique to Luerl but a low-level implementation detail of the standard Lua language ⟨https://lua.org⟩, for more on chunks read ⟨https://www.lua.org/manual/5.3/manâ€� ual.html#3.3.2⟩ the official Lua 5.3 reference manual ⟨https://www.lua.org/manual/5.3/manual.html⟩. Spec Definitions Binary means an Erlang binary string. Chunks means a portion of precompiled bytecode. State means a Lua State, this is a Lua VM instance. Path means a file system path and file name. KeyPath means an Erlang list of atoms representing nested names, e.g. [table,pack] for table.pack. Keys means Lua table keys, the keys of a key-value structure. CompileOptions means a list of compiler options. Currently supported options are ‘return’, which returns the errors and warnings, and ‘reâ€� port’ which will log the errors and warnings. LuaCallReturn = {ok, Result, State} | {lua_error, Error, State} This is the return value from evaluating a Lua call. Functions luerl:init() -> State Get a new Lua State = a fresh Lua VM instance. luerl:gc(State) -> State Runs the garbage collector on a state and returns the new state. luerl:load(String|Binary[, CompileOptions], State) -> {ok, Function, State} | CompileError Parse a Lua chunk as string or binary, and return a compiled chunk (‘form’). luerl:loadfile(FileName[, CompileOptions], State) -> {ok, Function, State} | CompileError Parse a Lua file, and return a compiled chunk (‘form’). luerl:path_loadfile([Path, ], FileName[, CompileOptions], State) -> {ok,Function,FullName,State} | {error, Reason} Search Path until the file FileName is found. Parse the file and reâ€� turn a compiled chunk (‘form’). If Path is not given then the path deâ€� fined in the environment variable LUA_LOAD_PATH is used. luerl:load_module(KeyPath, ErlangModule, State) -> State Load ErlangModule and install its table at KeyPath which is NOT enâ€� coded. luerl:load_module_dec(EncodedKeyPath, ErlangModule, State) -> State Load ErlangModule and install its table at KeyPath which is encoded. luerl:do(String|Binary|Form, State) -> {ok, Result, NewState} | {lua_error, Error, State} | CompileError Evaluate a Lua expression and return its result which is NOT decoded, and the new Lua State. luerl:do_dec(String|Binary|Form, State) -> {ok, Result, NewState} | {lua_error, Error, State} | CompileError Evaluate a Lua expression and return its result which is automatically decoded, and the new Lua State. luerl:dofile(Path, State) -> {ok, Result, NewState} | {lua_error, Error, State} | CompileError Load and execute the Lua code in the file and return its result which is NOT decoded, and the new Lua State. Equivalent to doing luerl:do(“return dofile(‘FileName’)â€�). luerl:dofile_dec(Path[, State]) -> {ok, Result, NewState} | {lua_error, Erâ€� ror, State} | CompileError Load and execute the Lua code in the file and return its result which is automatically decoded, and the new Lua State. luerl:call(FuncRef, ArgRefs, State) -> {ok, Result, State} luerl:call_chunk(FuncRef, ArgRefs, State) -> {ok, Result, State} | {lua_erâ€� ror, Error, State} Call a compiled chunk or function. Use the call_chunk, call has been kept for backwards compatibility. luerl:call_function(FuncRef | FuncPath, ArgRefs, State] -> {ok, Result, State} | {lua_error, Error, State} Call a function already defined in the state. Result is NOT decoded. luerl:call_function_enc(KeyPath, Args, State) -> {ok, Result, State} | {lua_error, Error, State} Call a function already defined in the state. KeyPath is a list of keys to the function. KeyPath and Args are automatically encoded, while Result is NOT decoded. luerl:call_function_dec(KeyPath, Args, State) -> {ok, Result, State} | {lua_error, Error, State} Call a function already defined in the state. KeyPath is a list of keys to the function. KeyPath and Args are automatically encoded and Result is automatically decoded. luerl:call_method(ObjRef, Method, ArgRefs, State) -> {ok, Result, State} | {lua_error, Error, State} Call a method already defined in the state. Result is NOT decoded. luerl:call_method_enc(KeyPath, Method, Args, State) -> {ok, Result, State} | {lua_error, Error, State} Call a method already defined in the state. KeyPath is a list of keys to the method. KeyPath, Method and Args are automatically encoded, while Result is NOT decoded. luerl:call_method_dec(KeyPath, Method, Args, State) -> {ok, Result, State} | {lua_error, Error, State} Call a method already defined in the state. KeyPath is a list of keys to the method. KeyPath, Method and Args are automatically encoded and Result is automatically decoded. luerl:get_table_keys(KeyPath, State) -> {ok, Result, State} | {lua_error, Error, State} Gets a value inside the Lua state. KeyPath and Result are NOT enâ€� coded/decoded. luerl:get_table_keys_dec(KeyPath, State) -> {ok, Result, State} | {lua_erâ€� ror, Error, State} Gets a value inside the Lua state. KeyPath is automatically encoded and Result is decoded. luerl:set_table_keys(KeyPath, Value, State) -> {ok,State} | {lua_error, Erâ€� ror, State} Sets a value inside the Lua state. KeyPath and Value are NOT encoded. luerl:set_table_keys_dec(KeyPath, Value, State) -> {ok, Result, State} | {lua_error, Error, State} Sets a value inside the Lua state. KeyPath and Value are automatically encoded and Result is decoded. luerl:get_table_key(Table, Key, State) -> {ok, Result, State} | {lua_error, Error, State} Gets the value of a key in a table. Table and Key are NOT encoded and Result is NOT decoded. luerl:set_table_key(Table, Key, Value, State) -> {ok, State} | {lua_error, Error, State} Sets the value of a key in a table. Table, Key and Value are NOT enâ€� coded. luerl:get_stacktrace(State) -> [{FuncName,{file,FileName},{line,Line}}] Return a stack trace of the current call stack in the state. luerl:encode(Term, State) -> {LuerlTerm,State} Encode the Erlang representation of a term into Luerl form updating the state when necessary. luerl:encode_list([Term], State) -> {[LuerlTerm],State} Encode a list of Erlang term representations into a list of Luerl forms updating the state when necessary. luerl:decode(LuerlTerm, State) -> Term Decode a term in the Luerl form into its Erlang representation. luerl:decode_list([LuerlTerm], State) -> [Term] Decode a list of Luerl terms into a list of Erlang representations. luerl:put_private(Key, Term, State) -> State. Puts a private value under key that is not exposed to the runtime. luerl:get_private(Key, State) -> Term. Get a private value for the given key. luerl:delete_private(Key, State) -> Term. Deletes the private value for the given key. Passing String in the Erlang Shell Here we are going to look at passing in command strings into the luerl:do/2 function, especially when these strings contain Lua strings. The problem is to make sure that the strings in the Lua commands are processes correctly. First just just doing it from the standard Lua shell as the source of truth: >return "aéb\235c" aéb?c >string.byte("aéb\235c", 1, 20) 97 195 169 98 235 99 Now doing it from Erlang where I need to use \\ to get a \ into the string: 1> St = luerl:init(), ok. ok 2> f(S), S = "return 'aéb\\235c'". [114,101,116,117,114,110,32,39,97,233,98,92,50,51,53,99,39] 3> f(R), {ok,R,_} = luerl:do(S, St), io:write(R). [<<97,195,169,98,235,99>>] Now doing it from Elixir using the ~C sigil to get the handling of the string right: iex(1)> st = Luerl.init(); :ok :ok iex(4)> s = ~C"return 'aéb\235c'" [114,101,116,117,114,110,32,39,97,233,98,92,50,51,53,99,39] iex(3)> {ok,r,_} = Luerl.do(st, s); r [<<97, 195, 169, 98, 235, 99>>] So it works as expected. We use io:write to write out the characters in the binary without any parsing or trying to be smart. AUTHORS Jean Chassoul, Robert Virding. 2018-2024 luerl(3) rvirding-luerl-772b25e/doc_legacy/luerl_sandbox.txt0000664000232200023220000000741015114130670023061 0ustar debalancedebalanceluerl_sandbox(3) Library Functions Manual luerl_sandbox(3) Name luerl_sandbox - Fuctions for sandboxing Luerl evaluation Interface Functions The Lua State parameter is the state of a Lua VM instance. It must be created with the luerl:init() call and be carried from one call to the next. As it is possible in Lua to create self-referencing data structures, indeed the standard libraries have many instances of this, then using the functions which decode their return values will generate an error when they would cause an infinite loop during the decoding. An simple example is the top level table which contains a key _G which references the top-level table. Note that Lua Chunks (see definition below) can travel between differâ€� ent States. They are precompiled bits of code, independent of State. That you can ‘carry around’ this is no unique to Luerl but a low-level implementation detail of the standard Lua language ⟨https://lua.org⟩, for more on chunks read ⟨https://www.lua.org/manual/5.3/manâ€� ual.html#3.3.2⟩ the official Lua 5.3 reference manual ⟨https://www.lua.org/manual/5.3/manual.html⟩. Spec Definitions Binary means an Erlang binary string. Chunks means a portion of precompiled bytecode. State means a Lua State, this is a Lua VM instance. Path means a file system path and file name. KeyPath means an Erlang list of atoms representing nested names, e.g. [table,pack] for table.pack. Keys means Lua table keys, the keys of a key-value structure. Functions init() -> State. init([ State | TablePaths]) -> State. init(State, TablePaths) -> State. Create a new sandboxed state. If a state is given as an argument then that state will be used otherwise a new default be be generated. TablePaths is a list of paths to functions which will be blocked. If none is given then the default list will be used. run(String | Binary) -> {Result, State} | {error, Reason}. run(String | Binary, State) -> {Result, State} | {error, Reason}. run(String | Binary, Flags, State) -> {Result, State} | {error, Reason}. Spawn a new process which runs the string String in State where the deâ€� fault sandbox state will be used if none is given. Flags is a map or keyword list which can contain the following fields #{max_time => MaxTime, max_reductions => MaxReds, spawn_opts => SpawnOpts} MaxReds limits the number of reductions and MaxTime (default 100 msecs) the time to run the string, SpawnOpts are spawn options to the process running the evaluation. run(String | Binary) -> {Result, State} | {error, Reason}. run(String | Binary, State) -> {Result, State} | {error, Reason}. run(String | Binary, State, [ MaxReds | Flags ]) -> {Result, State} | {erâ€� ror, Reason}. run(String | Binary, State, MaxReds, Flags) -> {Result, State} | {error, Reason}. run(String | Binary, State, MaxReds, Flags, Timeout) -> {Result, State} | {error, Reason}. This is the old interface to run. It still works but the new interface is recommended. Spawn a new process which runs the string String in State where the default sandbox state will be used if none is given. MaxReds limits the number of reductions and TimeOut (default 100 msecs) the time to run the string, Flags are spawn options to the process runâ€� ning the evaluation. AUTHORS Robert Virding. 2023 luerl_sandbox(3) rvirding-luerl-772b25e/doc_legacy/pdf/0000775000232200023220000000000015114130670020226 5ustar debalancedebalancervirding-luerl-772b25e/doc_legacy/pdf/luerl_sandbox.pdf0000664000232200023220000010332615114130670023567 0ustar debalancedebalance%PDF-1.5 %äðíø 23 0 obj <> stream xÚ�Y½n$7 îó󫓨`á"@.@ºî‚ïíU)òþM$‘”8­½î Ïh$ŠúH~¤èíßÍlºü3[„ò_oïÿ”·ßËÏϧÿúº}ûn6ï¶×{ytJë¸]Œv*è´½Þþºjí’Öᦵ…ò[Óû�òSÞÍ{y/ßà^~ìË|YàÍKû]yöeâ[ù^þ~ý£ìh7cTöꎠ•7°]œV9ÚÏß«’®cã�_.¶�„2ÅÑ(ÐsUÃîmˆÊ¦¼] + ‰ {Ñ(ãïðÖæýöŠ(øÍ8e]h:£bHe±±ÊåÌ ¼Óa÷ªÏauÜrÑÂa±õÊÚÿ`"c°ØB¡ë“­`„—TGª@¨GÉxüŠX€×؈£¡¯}bÖ¼yœõïÊ”‘¨_|µvL'­ÏGÅžÀ;$3\eõ%ñÞõPU: .6:%[Å=æ«9SÝE+lµPÎbïÝÚß¾g±Âd”8"m#Ÿ»š+¢Á ŒD—"÷õZ¹ä»ïh¾–¾&Ï_,_É÷¡†GÇ5å8íN++6ò¼¦o{:œ Íl1öÖ¿£8$3ÒU7_|™L–«‘Jëvô¬Ðײüî|C¹f6�‡êÕWx—¨@å§Æ „Z£¡À>+09[Ïf%`_…'¼�#³ðJe�Æfô ¢íòê)8F¨Œ¸ã‘4´hª@€#.â—æÕ;�²�Ÿ%•hÇ0ò�ýGÁPy ÍM|öÊ8[€�*wZ3;:¡³Ý%‹q�ÓÂAñÍ»Î3äd3°¨¡=ˆ)qÏb„WâŸg¯¦Ï%ôÚ±’è˜]ß;§ÀðeÉ~(¥%Ënz´�9š¥ã4?'™uÔ³„("î¤ÙuœKø«²1M~~мûð•æÁ’33²Ì#Ò“Zzh3m[O¼¯_†'†Æùì?7šú—O˜wp‚kp?>¡ÈØhgGÛÓüÛð“ž�ÂÉoC�Š�¹ŸtªlÁZq“EzÑàl¨*°º\Ch_71/×#ý‹ÜÍ>Ñüº}]åLÆÎ5*dVãøÅuvÞÊÞ{ðû`:Õô50ø„ËÒޏŸÏT­Îs«&áF$ygm;oÝ8ê&]Vø²aãíȳ¸È™;òuçJ$®Y¼Ú¡ã*cöä!cþÒ˜c1&±dqBWá†;&éNY¡An¤ìóŒÎ†”CR“ÇÃõ˜ñÊ4Öõ¡°ôÙhZYϬDv”þž®2K"#Ê{<Ã\LV棆J‘Ó¡1"f[Òkêù°–ºöm‘7K�ã˜÷ 49¡BÜ�z¤¶�1&‚G�òáˆðH†F—+S£çš A\¼åVó#Öƒ´ŽúcZ;'TLnTo kDy[B’ËÙ#¢¶>ÆQPú‘‡N s܉b�ôJFÌÐJ¡2íPkô…œÏùA&E¤ø‚‰S™˜hò�ø6{;oGýT|#ÂV�§P?§»p “M 2�÷îÄqÃ_0)‡+y'ƒ!§§Çp]fΑ~Q=ô’ÊN$6øÓ>+l*ïyg쯸&Iþ,WšÝÖÇÜý¹„%ŠÔÄüϳzJÁS˜{ÅÞÅSÉPGÓU¾E*Y[IÛ¾áÓ~çÄÚ¿rù‹+W×Ú6¯O7B Ímô‡»Oa0s‰tsÚç”9ÆÕn&Þ9Ë%Y¸Ã�ž»¶Ý¾ýŒ¢�Ô_­"c8ÔêÎlÀ•ëzØ.Œ ²ÕÁ¢í>šö㶉)¤ç²�„5ïOane †;�p ^lCª'Hkú\)>ªdÓ¤Œ¼fÐ}t¹8•;½uób™Ž"ÜÇ�+Áþ4b«Û¥Sçê@þ!”g÷@ïÇy9ÑêrÇ«ö<ÖhÓ5€íéÒC5Jö÷¹p«³å!± ŸæÐèrÈÕ>Lâ¶c ‚¨e>äZ&CøñY;8/št.f•Jª%ow Žˆ¸ºîÛXÈltöá£d²¢ §‹»Ý…!£°Ü\ôí8¥Nõê¹~¸ ~Ó]æ+UDíÆºøÉ �Eáñ†¯DÖû�ªhÑ)·L’hq⌂)×ÈÐÁ&F|¦S¹vŸ±y/“e£™nsÅJÙ�Êj+I²Ô�Úç¡<°ŸÑÊýP%êñÑ÷Ï{| P�+j™<¡ê-:[?ì}…jýÛCú¬ñ6.W#8š?ˆN©èŒ¹ƒ›qg¹ŠîÃÓÓŽ•¤ó\E> „KÂOü+yÉ)íí!§´¯Ü â¶+ŽR.ZÚŽ¢P‚æ¨\_8¬ ~\V8šed8—:‡žNr¢ó(­Ø¬ƒG™lÑûG™Ë­šù �k /ÖTø§¬J>�ÉQ\òà6|†ë‡J”�?ø³Êò²¸–³ô¢SgDøÏvHʘgrÐ"äϽƒåÅ^€<7ÔÎç¹GšÔ:ÀÚ¹¶Â©Öw}¢Í:J‹ÃŸ6xY£Œ-õe°º”F�¤`^ùç/ÿaS½ endstream endobj 28 0 obj <> stream xÚíÉ®ä4ðÎWäÚØU^¥§w@$nHï†8LOÓœ8ðÿÊ.¯‰“NÏ0Ì ½¥ã¥\ûæåïE-’þÔâ€þåòþ/úú™ž?7ïÞ–ï2‹R"ËÛ}±J8ë—‹z›åíöÛ‹”h_ÒÛÞ¤ÔôÀ•~ú RÅc^ûeùñ��*µ,بWBY•�ÆÍqc|G`ÆÐc_/Lœ•tì­|YÅkÔ{~c<Ø?>0aŒ;8üþeL]ãy� øŒv{î‘4þ}R”r$$< enÏâþx»Úhê�цw´YòæžÑ`ýK‰¿Â “׸:góޤ~÷HÍÄ £^ÁÑÛéLñ½ß2Áø¢!ê²&zÐm�Þî*k¯¡¬Ã+�8Éçc’HƒWÖ–/ž eN2„dQ׺;A²!®ä_,—;t£ŒáÞQ6�&iO´ð,Y�||^/è"’•£‘bt!Û{„[øÊ£F�˜EZ H^]VF®ò¯^ ù¸¼]ÆùÆEŠxÏ¡ÉVî5l ¸W=%Ë2�Š‚FaA“#d¶œ³� ©×uc…t®Â)zÂtv<ð�G�JÃz˜dä¯PãJ\Fop¸ UYHÿóWää�WFiEHq®Y£|­œ©GÚ3²>ñ¢ˆBš*°´}ÍK+ÿÉ‹¸Îê@Ī`×ÀVþ1U;vƸ®-¤ñ…G+ªGÚÆ§ŽÒ9m;æ nlç¤�^((GEM.òìý{/þ¯Û(Ðæ‹¯qvß³Cœ+¶ =o†ø1‹.nrºmvŸä-d©œÅ>²i¸s\e…õ‰¸tLñÿ†‡¨EPî“ó�¬4ñ!Φx_<‡#ïäÚŸg÷, ke…Ûªøôœ¹ß…¶Ä t똙Fâ.ƶ:ÜŽ!uÙ®{OôÂn{—É#0U‚I UA ¯[ÜQŸmà$%tZ �Sߦ'(aíö€U®3Êýì“"t< ü Xp˜¶.G£ŽœÈP)÷dLrL�~^xt/<´NÍxT‡W]¨¯m�­_óðº›2I+S·Ö=²$9èMvÄ(FmÏh]ŽÑe„m²ÎÛ†`ô1dÐV&¸�HˆÂK˜óÞP|5ÈÆU2wŽéq„Z2õ¼¢Z0l sf–öùš05Ëïü+ïwÙîãJ¸÷•õ´|T<J'”ª¥ö�=^áq¬•ì-Cä ¤úlÝû]ý®ÛãûõÕ[*)4•õ#o7gÉ– Ùƒ õÅýF“™ÇN^:'Î.³8¢a²óMþiç¸æ Û^#û})¨$Ū´Su޵:ßÅwbZ’¤|³�ŽÇ¥ºOnÚl2[/�.¦J’u8ù‹b,Ñ„x©)Éwú:+^Ý<ÛÔ?“Þ�éŒ|Wi3 µeŽÒõÄÝ@ˆOeĵóˆ×ÖÌÈÔ6ƱCÐJè°Vš•=@Ð]•Á ᳎t2É#ÓÐYuużؤr8·c훕 RHÕ¢]m14"`žtðlokù7";& $ë3©Éš{­U¼ß4˜&öx½’rÈ2¦¨¦g¸%¢öDœÉ‡‘*/ç¾U^Ç\Òäå”ûVy}ÑcÝgáa›m}ïƒXµ9u’ï•5áƒ%4�Þ_ޏ¨t Êfq=H€ŠíOl63áýB –êéðÕ e¼•é3êÄ«[·_¹=­:!Tè +,týöR}¥D3Ý1Ž_C¾[S®Œú}EVKüœ<µ쇾gÎiQ¯;ä-ó[åT“q€.3,mß4kP×Õ Úö¸Çö8ËrN ®{< £ç¨iÜÒ}J_êÔXCÈ$”I+[w7'p»õôA§ –;3gÖ×uî\:˜6îuªø€u§ŠA¹§3Ouªœ° >¨S¥”=ש¢Ù';U^xo[UÒSnŒR kÖ�¨ÃâI«³­*ª‰wZU ds¢·×D|ÚúQ«®U•¿Ö7Az¸ ÒêùVá»^Õ³5¹T�Kr½)É31�KòÜH¤äB–û>[ àr3íž)Ó‹M•éŽÒwㆠÏ!øÈê°&Âù*�‘ï«tFp¯JÏĶ�³’ÜõN|í'à> stream xÚ]ÑQkƒ0àwE;FÑhÕDèìÙÚuµýirº@�!êCÿýLNú°€Â—Üy^Î/ª}¥äHü“éy #i¤†~2È Z©<!ù¸È½yÇ´ç¦�¬â¿?ÏõÏë×áÜwLÑt}†vº3³¾^Jš F_H¸¸Ú×�a„®RMO²Ì#ÄŸÓä0šYíDƒ»÷m©Z²ºµÛ©'­ïÐ�Iàå¹ûÅßã½€A3†©¼,˜WN²r^¹Jü;§1¦ÝþËŒ §Å ͭ¢JÔÆ) Q±Óf‹*P{Ô‡SLQ%*v ·¨õæ”N)ÖK°B¡vNÑ"¬�bõ¹�UŒÒ žm]ËKo¶y;µçÐødÌ|…n´n8ö¥‚çôu¯m–{þ,_™{ endstream endobj 73 0 obj <> stream xÚ]Ñ_kƒ0ðw?E7Fñ_k)ˆÐÖ ²uµýirº@MBÔ‡~ûé]èà ¿äîòçÂc]ÖZ�,üqF40²Vié`0“ÀnÐ)Ä “JŒ^ø=·Ax> stream xÚ]’Ïkà Çïù+> stream xÚ]”ÝŠ£@…ï}оœa´ÛþI ‰ŽØì,“Éíd…±•޹ÈۯݧÈ |ýS§N•eZëg–þöc{´3»ô®óö6Þ}kÙÙ^{—pÁº¾�‰â;4S’–‡fúÕ –¥§Ýáýcûãçásdz·O{½7þíôUsÍ:{Áé¯Çd™ ÞWÇÇm¶ÃÞ]F¶Ù$Œ¥Ëµþ6û{ÙvãÙ¾†µßYß»+{9•Ǹr¼OÓ·¬›Y–E Ç‘^;vö65­õ�»Úd“-OÁ6õò‰uÝû*ǵó¥ýÓøpœï–ãY&y©Œ¤A" Ð*’Ú�Ö  ´E”„˜š¨Š$JP�=)縧@{D{d°G„\r:IzD «H2ƒ:ò”¤·‘ô4üIèId-¡§‰È-Å$u"TP¾ƒà]ƒÔu ‚zŽZ+Éd …¬áA!3�<rêQ4ÜtLCO¡z†ˆº‰>htÓÁ_N'¡�SL82¨üb,F�#�Ê+ôÈP.D¤Žr þ üä’£fK}öÞ„|ê]xÓ©s¦úw&®ð:ÔOd|Ò u z÷Ãp„©~u{÷~±8úqxÜõÎ>¿Ó8…[ñ÷ø�Ç endstream endobj 76 0 obj <> stream xÚ]ÒMkƒ@໿b�-%¨kÔDH´B iKLÚ³qÇTˆ»Ëjù÷Õ}%‡.(<Î8û5n¶Ëw²˜ûeT]ÒÀšV C½º›šØ…®­t|ÎD[³ì»î*í¸Ù¡ÒUGÌ=í¿³ìçm8ª®’¾·Øª›XœO…1A ROMŒÏÞå壨ÛÉF±$qs�cå~0ö²êB¯Ó·O#È´òÊ^ÎYi¿”w­oÔ‘˜ç¤©-çcmµÔëª&SÉ+9‰7Ž”%Å8R‡¤øç~»4õoe¦t?Ó=/òÓIœ[-9´�™ÁÆ*@fB´²Zα5¢ÊŠ›#–A+Äfm¡Ê¡w«Ð‡ (° =óq¬%Ä|k‰<«û‹P%Äþ"¬:žµ†–f�±Û5ãµ=âù,§ÃžZäÙ!õݘñÊlÙf˜î­•ôl5­ôô—}þ¬ ­ç endstream endobj 77 0 obj <> stream xÚ]“Ao‚@…ïüŠ=¶i °À¢‰!ÔÆDÛ¦è¡G„Ñ’è.Yñà¿/ì›xè&�|;³óì_l–ÝöÂÿ²¦.©§V7–nænkG:·Ú ¥hÚºgrïúZuž_ìªî£º’ðw«÷ügû¶ÝíŒ6Û> &¹¹4“Ã~*ÑÐ ¹ûGGB2o–åãÖÓu£OFÌçžþ÷PúÖÛ‡xY4æH¯ãÞ§mȶú,^EévÊ{×]èJº�—e®\sµièÖU5ÙJŸÉ›ÃÊÄ|=¬Ì#Ýü‹G)ŽOõoeÇô°Òƒ@…ÙHR:Š%(BŒ)q” ÊA)h š:J86qléHr•5bGÔU‚B¬@ P ʑɄšÑ Ä5§ŽâzP�Ya‚O/1+p&+0AAA! Akº” tIB=Á7Hè%Г\>tWÁgÊ…¡´‡àbLÜ]ôL¡»)|¦èà`W@ÈCŠ‹ÁYÊÿoæÆ„ça˜qΟc^ß­ÆÎ]7Ðã쵚ž÷¥3ÝxÊ=èwÔ¯ endstream endobj 78 0 obj <> stream xÚ]PËjÃ0¼ë+ö˜R‚-.c(AÓ;iéQ–Ö® –„,ü÷•d“CV0«™av“š¨’’³Õ¼E½TÂâ¤gË:¤"YBr·¡øò‘’Ô'f>؈�|�éwóóø~jôÈT–î©c7É÷×Ë1+@`¿’/‹AÈ7Lí29©ê5”%Hï=9»ÀîMèÂìÓ ´R °»Ömœ´³17Q9HIUE»lMǵÀÉ0Ž–©I™úª <úª*ñï?_U]Ï™ ìçܳӴx­*Vôòµ+¸„íïËóÙZŸ%ž(nI…÷+m‚*öúuS endstream endobj 79 0 obj <> stream xÚ]’ßjƒ0‡ï}Š\vŒRÿÛ�­N�­[©íØxtB�õ¢o¿˜_ØÅ…Ïœ|çääìÒ"+D7³ÝY¼¤™5�¨%MÃ"9±;µ�°—ÕŸ é/ï«ÑÚ¥§jüªzb»ËùòQ毟§Ó ÇÞ^¨]•ÜÞ®¹²š_Ÿ#1×p‘•Ïi¦¾ÍÀâØbJ£ÜÓ,Ÿls¨‡;½¬ÿ¾eM²-ÛÜÒRÿ)—q|PObf¶•$Zç :>Ô4�'Y‰–¬ØVOÂâ\=‰E¢þ·îyØvoøO%×p'Uá¶:ÉJ®rA¡¦èŠ@èˆH”irSPŽ5_“ç‚�¯ÉƒÅC?g‚Ó{ç^“oœo =ÙýœÈà§!8C8}8]œ!°±/9ˆ4„¾¨M8Cd–= a‰ Á Cˆª#C¨:@—ÔQôš!Ô¡gª\†DÔz ]ŠL-{}Ýæ^׋_öo^ù"¥=Õz0×êý þ8Œë.ýþ$Êh endstream endobj 81 0 obj <> stream xÚmV{TWŸ�„I!FÊ×�Ñ™©Zm«<´v=>¶`µE*‚+¾ @€H o!¢ ]”®é:RrŽxððO¥¸•pŒ¨1‘Xªv�ï\ UÓÆr¬B¬§µ�¼ÐÖÛFìÿ{%\F=wiãwö�ï‚nyC_tï0ðbjÁ4–G—ni–%nJ<,ÿ$2ô¶GƒX0–âhè§žHQìÓŸsÙ�ªõ)¤å:ؽ?Àº:B ±¼É×û£�‚!¬K(ÿ T£ƒµ7`Äü¼ôüM$ó0<ˆñ‚¨ÿÁã þhï'ÓLëúöì§W>oN^MBÛ/ &¦- Ìò‹‚üt ‹…$°>˜ ± Šb§Â10úî4 ¢»÷@4™Ò¬,p-ѯ&×êr+ÔÄšü}ýfÊxÔyvÿ€;Å%{wõ÷ G‹;¨î5l²W€ uÃÓÊrÑ�18�J–õ8=äÚáh0\ÄÁE0 `'N’,çñà'ç¨ùM [EfCñfˆLÓš âT’“Ž•è#¼×@½º ªpÊ«v X”ä?VÏù¬šp:˜zÖít»¨ãÙ@18ŒÃ‹pÄVe“Œ‹q²x}ãÙ~ósv‚< Ä­¹º*ËègCqè¾Ìô2¾Æ*{Jvi¬O(®% Ǻ ì#p,Hk× ëê F[‘TÍ¥ÀôÞûwþÔÔÄ8›HÖb7শÚ¾ÝMûH€6?x¿•õß÷WµFï=¤?Êa©àk¥ÔwVùÈÒîâ&U³,Ó·°õcœo=óð‡Æ©%Yïö2b+ëÙI ŠEw�ƒa6U“NÇ–Z§C†8P²Î½‘€âüeËf<ÚÐUG}RµÛÑn•µTï¶á*SVÜ,í¥[V ku²n�Il SNÁɨÕÍ4zÝîf/‰Ù:�Hõ»Î÷‡N�„r¥²ãáŸU{Ø60µ ¼<âa÷DŸYp­âZîµ##÷¯aR»ð[� ü~Þ•éÛÉkþÏ.ÿ™ÿÑŒøyËçóu-í�ž·¶l ±ÚQϺÔ¥®/}‰ƒ—6NÓ9²59Ti�ƵÞ)«7»†DÙcDZqáv7³‹<~»ÿí™6´ÊSÖ.[ñÿ…žty½¬—Àhº#àç)ÌÑei)ßh°ÆÝIz Ä7¿yD†zÐ!²Oô¼¾ÄÏËëyçOQ8êE0£³×%&̱Ÿ8E‚¯þóç½N6ßMÁLô]6—בU-{ W‰›½WÛ›)wl¸âI2Ä¢�Tž%[Q…`ey–oâAfwÑnaÖùÜeö&®ÛDA$~ d½‡ûÜ¿æÑ….©^ËrfÊ€b²VWsífÜZ[So'bÞ¨tËv–óâ¾mÛvºIì�ºL¹¬‘З°œ%hqÚç(í  _—r.o�wÌ¢k6“ë²Ö8ôŒÌ€^᤻‚M&JÉ¥uîJnhÞ¾ÕGÞxô ”J›k|›ìøæj[%Cb[BI|$Ø–:{X×nJš7¢B>%85 o…&ˆ¶èJ¿�èºæV8!ÉÔÉ_bå‘|D r‡Ûíöº9®Ñsh«\ø<\c¨Z¼òQÿíÜú endstream endobj 83 0 obj <> stream xÚk``à`T``hqcX ÆsR endstream endobj 85 0 obj <> stream xÚmVkPWîfš•qt§™ÄLkwëºFE¾²1ZAAÁ(à ¸Šu€�™Ý0P”á —Py ÃkèQŒ ñmY5ÑZ‘r5˪‹®ëš½Mš­l«²[µ¹?î½uêÜóÝú¾ïTâ₈D"yPp(“¨¢—¯ð UÇTºéh7—›¤G )â('n¾3·À…÷—:÷I]¦>à;æŠu?ðây"Ê›5½·ÿʤ „›ëߤ §MÒß"®NˆqCf#s�yÈòo‘D$ý/І&JýQŒš6h i+¼||Vù3Ii:mœÆ@­ðñY¹lz_CùyQ[TÑñŒI¯¥Tt µÅ‹ ö¢B“ÕR‹šŠRkT ±K…«wQF½Z§§âtŒ1I¿Ä‹ ×hõ”‰ÑÅS©S'¨Uzu e¤cÔ:Ê QS�;©†6PAÚh5­WSžž¥W«)�Á�ô�··ÁçÅèâ¼c…½w›$½÷ô;Ï€m!ážAùo ÛäeH5P±ŒŽŠQTÚ½×ÿQûs „Ñ%ªaýñFV k?$ÙŽìCö#Zä$a�4g�œœ7õps‚‡ç|0â.ÃqÇßbÑÀì£ý$÷=ú?¨|2ʦìï Áy×w—ðî<öl té°V‘(Ä\Ò@A†‘À:5ú(:Oæ‘Jø‡ÛÇ{:ȶúÞ¶|°sï�Jòx:(LSÊøsŒ´+Üi’;F`ö v�ó€nв¼’Üì¼¼BâwÉ› *\µ¨n ­Ð�bý `}¹ã)?“—¬\ÈÏæçüc)t†ng b#ƒáŸ%�ËË×µâÿ*ãçk‹I¯²Áÿlƒ›ÜÞðô¿úÍýqý˜ûzŽá–*ê2Z5;câf�‰šj|ùæÀC;c+³HìYæáƒitŒr{§®<�ˆ<·Sð4΂n/Îßmιº­�hÙVã!9ÀšFš+³¬6emYme‘p¶Ãÿrãæ¨=»;¾�ìí9 Jñ’RPXBb«×›óó̙ʌÊÃ5åu¥ ÿ!ï¤HQéI�šhNÁW‚—�uà³Z;ÉZ•6Ê| HˆLÍPüÞw�·‡_ÿårKOw QÕP¾ÂÇ ¬"eS(`9W–î…è„üñ„ïÖ s5·ä—ö�œ Š]æçNëy½"WгÝ› ¶4jiý#`ñcW@á§$6'Œ{©pè­z&Ř”Ü`lqX›šÙbÀÂvH¨-‡È0ŒÆîpuBép‘0}Z íD½§L‹/U¿oÊ&‹^I°‰7€o Ôô3`ËЊ³@a É¢[ƒ3$ A_ߺ48Xµ+„àÿR¢ÌÜÀ˜D‚Y#ÎÜ>ø‰*–¼â]yé²ù¼œwÿ»”ÀÏ¡œð­Ph@pòâc&2U�Çî­é§É¤3EWO)»Áµ¶3ÄéÖ¾šN¼çTZŒ�l‹A±JÙ½”úb^ª‡Y9œw2÷³ž<·a9“ªGŠ2P‘i¹æ"b[��GšÏžÏ&ÍwsòÛÛÞÉ<–l¯vÅÒ_4Ž�*'xñ¿�àÏÑõ’ÛG̱äT+[`ö'L´ÄÒø@ š…�$kBý *O’°º¢Ø@ÏÉLÆN~ª)Êu ¹o?q°ú”á~ïÄ#Ék¸UŠU{¶òo¼ ¬–4‚ã¶¢¸ÂêqÌé[èxÁîÕ‚J7zë¦UúçPþýöû˜;üžÃޤÖýïÑÞ©¹Dt–`,¯ü%UZ/nÿú§¿¡XŽI‚mñ+<ÖEÂåèDïøh¹•Ùùr“”tcfM}ý ;!` º(Yd’¿66À¹ ØkxÎV\6†£þ´*&<©%`œÏòóŸ`£¤È3ÎçÀÕ„bwòmÞùÃù¡ŽÁÛ„,ÅþÝóÝv¸¶ Îãú&ùÍñÀ'Žñ�'˜ᡯâ¯n{Ô�š/ݹ§¼¿æÊÒw7„ø¾>º-»ÚÖTíh×Ws AQq³û©Ðsפ„ÑûÉÄ}Ú‚¤"Wì–-±@œ^”_”¥4—‚:âsÉÃîMüÛ�šÝ¯iüMbÒžÇÖu)±ó™lJ=£OÎP¯øÎ:EA·Çã/IøþðŠYyÿÓÑ1ð4z Ëá‚à:…QR�žn>àš• q>Xbo¼v½¥Éû.ƒÔ¥s/”õ\ë¸xõ®>pÄÖRÝÞšje²Þ|Úzáóaüá¹�ÞïíÞº•ä÷ò)b='Beã eRÉV^7ŒùLî›\ `QïBqR°èHý¢¨š1)sAanÁo›2ó\­[Ÿw ”%;š ì$‹ê}�3�À¢Þ Ö€èjššg”Zòªðªâ#µGI¨çT4×öÝ+~G& ú™DŸ�Àr¡éÂáÅXÞ·q#ÄX”Ãn|ûFúýX’ 2óˆréQ¿®�„oÏ-ý9üÑÀ¹+,Ùu×òüŠÒ÷¸b3ðÍÚÚ)5(UƒÇo©ƒ¢T2óK0ò•òø¦æ*q£ö‹¶Óx÷Ãj+y"¬ TʦšÙ.]$Œ%ÈÚéåGyŠ�ó¯†Le¹MBÌp g¤¿R7vư›µØRZ\\VRlé­–JìU–²Ò#KIY‰t&wÈ}òmÅÔ} endstream endobj 87 0 obj <> stream xÚk````TP`q`l(dpßX endstream endobj 89 0 obj <> stream xÚ…V TWž�ÇDÑ24ƒ3Cı«ÕãW¬ –.tÁGk‚ˆ Á$@ñ�’Ü "¨D 7f´ÚÕÖ¶zÜÖGku»­v«GK[iÝ-ê?rÙsv"n_Û³{ÏÌ�™{ÿûßï~÷ûÿ¹B&#$ɰĤ?×èò'ÅEÅó2}M „PaR1C¬Dàü„0©$ÃóTÒ‹*Ù@ö†*Æ…ÊÖÊG„¤h˜¯>ø,ªžßüÃTc| �ªp‚ô#$„’J¨ ñ âé$s3�ú…™ú|‹ÁRûü}Ë{|?K¥g!í?˜ÓŠæ�ÈÉâ4¢ŽšZ’»,ÃýæW@t|÷€=å!Ä#é,©�#ÕoA¥ëm¶ÍÌëe/ÆÐ8 ÁÄçì!5ç¬ÈfµÚØÊÊMLÝ‘u­Í�»OÞÄdõ+8a>Vb‡~caR(k˜€Ï/ôò” ¡ÒÇÝpW Ex" ÃÉÌÀ4íÃ�Þ0­0M© Ã`5‹Cíj+$«ó¡T>pG\LO˜Váp�¥!Å*çñHp�%ïí\Ïz¡]§ˆß¶r“ .­€É­ñxè6``±è¸Ÿ³[ò¾; ” Ó…©�e{‹¥z¬dÂçj¯áþ-éh¹ŽÑ®Èz€åŸ‡~Pðø™Ⱦ‹ î:‡ÍZÍl(ݺ®H³êpÉA§gïq&`€xº£a„T æ±LdSÆ“Öì±HGëÆ"G6«Ù@/–‰î=÷‘—öÞGV�kµK൧oÁ˜À¿C8VöQ­p8˜O&�Ô{xÖ6¹–zÊÝ i‡Qí¶K:/ÃúËRa°êSkÝÅ�LÆCõ+»”‹ë^ª;¥ùðjiõ|“ƒÙd߉êáÞz‚¶Üжn`¶Wn)«¨T6³ª³é5x<ÂÁÏÁðÂŽ ¶¢Í]¾ƒîÞÚmÒifÅ¢¢ôĆ^#³¿Üf_÷(9Ô�ö3›ä9'ÞA�ôYx¶FŠ(¿eHò�RøO�è¼0ÔKõ þ0\ý¶.�\¸&?ï%t©…�#0†Çc EGÚ"—GFV*W‹ê¾�;a7-W¯÷šoƒÄ?ì`û)zR}ÑC&•¡.V�‘”'ü´ÿéäì×–Ìœ³½õ,C�€{$åúyo)9öRþ£×Ð ž±OWPsóŸ×žùTáüç>¡Afån‰*D“xn…œJÜŽÇÜ'Aþ»ºë<¨¸�É+Ýd^«¡†gµ™�0Ôe÷¡–γ¯½�x¢e#~Jø‹Yµíã§òï‡ùdkµ-‡Å×Õà; hU„xœ#føŽv¿ Ü\/$×ÂÊý»êŒ¿,Õ¨‚TÏðþ yÆUe¯ª²;ì;kꮫTÞoֿᨭ©rÔîP Î=> þ7gŠË× endstream endobj 91 0 obj <> stream xÚk``à`RfH�ñ`xàÂÀ`ª endstream endobj 93 0 obj <> stream xÚ�Y X×Úž’AETÆØ:cgbk[WÄ]«Vźµ*UÀjEYÃda_²œ$l²¯�°8 ‚»Ö]«åV»ª­¶ö·¶O«Ö.ö î}þ ¨õÿÛÞ{“<Ï9'çÛßï='ÌÙîë7lVÄÅÎòœ±Y®‘)£«¹ Ü À•æhŒcœÔ‰›(ä^tF¯¸ ÷¹:x¡ýDÆGHô† òF9žýc8àú"ÿ9Ãu’càg×—1'L€�ÀFcÏc/`w± Ä×?­UËÖ…ÊbÕ‘êäÙžžsW*â’•‘ájélOÏ9ÓÏER/é›A!ÑŠDUt¤4(6Tú¦‡tƒ‡t£"‘�”NVÄJƒeAò0©"Lê+Û*Õ¨dJ•4\©ÐÄ©¦xH}#"UÒD…2ZÊÿUÊä² •,Tª‰ •)¥ê™t�Ÿ�¯tµ"V-]"‹Uɤ3fH¥*™L¡Vǽ6s¦Zî¡P†Ï ãרfʇ©f:¾7cµ÷Fßë×­\µÑg•‡:I- S(¥¡2uP¤\åñ'×>بPÆÉ1þEa°—°ÉØl*6 ›�ÍÄfa³±ùØl!¶[†-ÇV`^Øjl ¶{{ [�mÀ6a›1_ÌÛ‚mŶc�XŒE`‘X�Å`±˜‹Ã”˜KÀ’±,K<ü.äCÁ¿æcóAqƸÀ(hœuZè´ËéCáá%çYάh´èªø¾ ÷ÅpäRá‡ÍvzxìðG�8å:ÌÕâzgäÒ‘ÛGžsótûvTþhÁèÍ£o�Ù>æè˜>÷¥îm„ßXblƒ„”\×úÜâç2Ÿ;ÛÝú³ ·±ÜŽDAÐ86÷N/j×2HÞ/•ç‹R©Tƒ.=�A!?$o Ió3�—ã?[!n±ø6¥½Éj.1[˜Cð9âh†È¬·èôdŒˆ£å¸µó ØK¡±p—iÄÐ^¹q­-……Uß±¹·]…!—?±\âmÉi¥¾I©ÓFéÐÐïÝá]tw趪íÔ¢ÕþëbêRšZjêšÊòÚw˜™Žæ£¥mÔÑ3¡³™0|«a•a}ŒËòHå;$¡}í®òbß¡}‡kiÂ+$¿9è0U¡âK->.!ÌÓWFî|7¸ãةޛpQ!íÆ�ÐÚ.ôÂs6Öëþ°oÝMh¹Iæj \‰)÷‘xi r* ¯àh’V$ǯç¾Ë |oÇ;ß©+{·}JÁ¿Þƒf¡YfôŽÝIËdQ~¶3¼±KŤ×k ƒñZ`.­¢OwŸ*n¤vÆË™¦`ëæ`Ò ²ÈºïÑô}8|Ÿ#«dßÔGÓïîC/ü+ fv?;‡Ÿ}”†^¹û¯éSCp·þ0 Û?ƒœþ…‹Û-ìŸÓ%% (C tY&½”#]„ÔF´u<߃ïì¹·=Ñ+uLº*¨*`­g`^ Š´z=ÈÌ¡·­u†m=6�BÞhšƒQœ�fÁ�pÁ=È@Æ�{[k‡íßuÙ{nÂw¾rsàII0dõ:#íûffµeÎ~8.¸Ñ{b×ESxlÐÅd�ñ5‰-MuÕ»?\Öý:3ah4{2t�dt-¡Æ.O€~p�MÌ’Kªž�ˆä¸øøê¸ÎÊŠÂ’RÚ²D±1ÀßE§3™ôdn�¾ ìúuˆÅQËžfá)>’¬¼×�×®¶��q�ãX|UNÑQ†û'ªž "’ã�±�M~þâ$AĽÉP|éàž6;³'–C‰s20jSh¢{{ÌNM µ3¼i¯Š‰ï1œé!»,ç[ÒlýÞö“TGoÚN–)MÆdÒ­)_QçÙ[,\À à„Ûð];œf·Ú…ýRX*QŠ‘‡Rí…–Sh¼ØßXÔÎÀºoñ»¥Ñó;¬QŠçiåSéY0WÜn):LC‰ÎhöELc+ F4p^Þ(¾jц3õx¸Qû:­’sŸŠ‡BS½l‚–›0»ïqLr,yÙF]Ž‘ž1 dQÛBvw©™˜# ¯“„mb›Ôß÷»‹Æ —™“ø'ùÛTˆC·ƒPXˬƒã%(K §~eßCýR‚¨PÆ­"oÚabÝyÃBn_¿­´Ã—ìD÷;·]2¨ß¡?ë'&ÌÖŽk ›ê¹ � …›§ƒòšná?–<±|AVÔ4z,S†lwévDW1nð`9 ç~Ul@ç¾ï¾ÂþþQ’®°ö-«æo™H#|‰ü:ºŠïÔ‚µ<ì@±U´ï00ìcØ|…±´“�ŸA1‹†AüŽ9`­¹•t¦>9CIª«›[+ëù2hZ Ó½i7á6|îæª{Š–›5ÑýØý„ÛóïCÉmbìhÎî�À‹~BØöÀÔˆp¾ƒ.õººöÜ6 Žºr§¼ÐP�ËÃ0`y:;ñÝĵá„…ì(ª÷gr¬zHbïä,�“Ê £x2È©(²X óéªÒ®“_RïÙw$3Ua–ÐmdðVÑ¡ª°ø”׿çRbùr“Õj*¥Ú«í��)ö¨ôˆÜ Qÿü¼ËSypuùùGH8ì@Á póÙƒ U 4d6¸Ã9Ÿþ=V¨%p-—ÌM–Tg¶…&肃hiÛƒ‚¬Êcõê×l2{“‘–AÊËel"í�B®¼ï Ýàð_�_ëH?¾µ…nÙ² l¤”�ÀœËDç'°md>h¨®£Ý=†ZêûË—¯v¥v)˜=��5ñœ«‰Öêó´™dJyfUImQ�Þ@˜$Î�¦¤3sÔŠj.ø©¡ÙÜVigˆKڲ↖}Ô7àU5�FHüÞØ6å•ÕÇOÚÛuÀJŸß‚Î`�F'øÜÿ¸ä¡Óe(»L|µñ5ÿŽì61пXy']�U·‰ZàžÊ˜à1q÷Y<¯~š;"+tvt·µZp��ëñ_?:}éb©ßf¥?³FäoAﳂRX#„­Ð[rÕlâÁúŸ€í ¾ÞÇÆãK |úq�x§µô:ÝÄŠ K€Œ ]¬Œ¼ ¿nuK#nÐ.¡ãåbkÇu¾cv_†>ïÙÁ¼—÷BÁC÷¯­�°CÀ[¶N_ÐÍpBœ8ƒ¤>Ø¥ãÑÌöT='«¨£ÃhÚÃÏûr$ÍꦘHžgÅ5ÄïÞS×bçSÄ>TPñ§=ìû¬¯»�¸Éó[‡iÀ ƒ¸Fd²äZÉü�ΗÓ�÷ZêÍ.,nˆÍ *|ƒÅœÎÈñZS‰6ƒLLÏÌÉ¥ÑDä&âÔ8Ññ×~X¡ÓS¿þ‚_:%º:±×'™LJÑ'9æ1«¨µÕdlåqFÄãLb"7û1ÎÀN;ñw}>_Ö¦óPõµHLxâ'·ß*~ ÛY11Ùî ‚©Ð¥ƒÎmĉO†°¨ñ)VÖˆ�ʇȑ-Â>¢ :¬Ô‰ûN\þkÝ…|¼MyZi ¬l�Y_  DZ*üuãã[J¯Ò�,Z*ަä\)ΣîŒÈ–mj -} �<øOrì;Ì ‡9|2 nf¸N3uÿted—P¥ÖâÒ|$ûGŠÌ‰Ÿ ©µëCK»ÿ ]¼§>Œ£Öö8óùÏØ ÄÑþ“ÿ&ýe)Ì7é+JwR^þ�Ìo8ñ%šøGO¬ÿÛB Žþu)üwåâ`šC•ÑÂ-jööK%,ކÐ0+/üàÇ ,ÃÑC®JT–m2'Qèuy«¸²Îdªd fS9Pû7Ž«Æ ò̦|7}àîó™»Ì¦"ªÕ2ÜQ¼þ…‰güD´þ=BÑý×Ë<›'íÄ#ø5-9£ôÅWÄÈÂÖ‚;Õ4dáK,zÉvs•bӢ齋'دQ«�ú>³ó£–�. 1è�øÃܤ8üÁûvôøðï±8·.“ÜXí¥zúFóÙ+×ÉsNO{e™÷²([R+[gk=æÒè£l_y'ÕsJ3+Ó¸)>€‰ÙiPš\L9*c.•cÊ5e‘Ú"PMßèZ3MX¸¼ú\Ó‘ÇÚö’�qu±ªèôÏï×At»sçg‡FàêÝ«põoX÷c¿Ýû Ü!ñÞ‹gy1¹Yi.9¹ë€†BkÅAOHŸ?ù ų¾@nH´bælŸcÀZÝQÖӔܑc&ýAÃÉ®³Ô�ý¯-bˆo[â»�F¾(J¤Õ£Šäp1áõø,z„…ûŸa¥oöœÁ“(„8±½úGU®Æçn_ãµ@ø=šp…_ãDÏÐì5`˜Í ©øRà §Ÿ>Ðò~+=‹?šòÝÑMÇSÒôÏìxœ0%ôÏgµýÛ…ý±ƒ½Õ(1ÅSHìh¯ï™êãÕdŽAgÔÑè­�äÃYDº �ÈÖ3ÀNóÄ.|5ÏKáXýA-�U00mà‘(©¨ÀPNU[ * ¨â¾®èjnýÐ<žG¸’n&/�KrÜ$‡^Z/MÀV²‚šþÂ~Ÿ!yšXlqÈë4Ù’cI0æeОh×d^œ¾Ìd) ›»A/î%ƒ(&vHZW•1£„)ЕÆ%ÍCyÏO‡u¢<¾£ä?YË«6¸ç±2CtÝÑï¢ôk¯–¥�wÂØù3êi󇬃šƒ_ÖcË;ýØÁ Àº—qfÂÀ•óA'ÞöK¶´ªD»÷î=ÚØ4žíì©<ì`ÔÆø>L1[,æ ^=BZo,ÎH%S³2òtô†¥Kˆ²K€¥�¬¬ÜUg¦‰r^AÌ Jð7[âøåWÌ&ïÃÌ}$ñ÷FÿÍã7mÛ˜À7|Kkn¢~pteb¹Æš[^IÚZÛ/|Lþª¨X[žª#³³ÓâL4abÞÍÝ&ãnÆÑ·‚l5_Àº×~EüshYSUŠ’Ì2ó2éW� ¡M¤/1æç“M] öÿ…öH-ˆàiê€@ù¶ÈW£XýE\ÍSƒš$†Í/¶U‘MIUêDMFÌÎÞðc{Μi¤áÜ2ÑŦãæ*Ê�'¶þçm‚î›°˜'P�ðÉy_D|Jÿ¸cQUåíïÌD¯Î[º˜\ž?«gýÚþO�R'?¯ÿáÓv¹àÚura™d9X£}‹žž¶9f'ú¶ýÇdF{|w޼úŠOÒpDíg»ìT{_òäZ¦Ä,[Ïóª/†ŽG6´öþÍ#±Kÿ(IgÄŸ·dú<º+Ö§ ŽšŽ\ÞAƒÄÿ÷úAh…Â?ÑUö®&p ‡.øí#‡þåÕÊl•¤3¤Î¬lΦ  ;“D8Š„"üî�Þ޶$úÉißµÛû`¸ã3Ö­ÿàÓŽ5¼˜#2� �âeŠÄ÷oí{wg–ºŽ6ê©dTSFmCCÕîs¾½+ælIK¦;ÔAuÛ¨hØV$ø�–†ÿ›¹Ùø¡¢Œ`5<{¬Bû)I¨1[•HjÊRkòhž EñVýôM÷¹ÆŽc1ðïŒó@#xƒèÿdÐ_*ͳ?Ž~ýÛxÈùHšRšÃÓ³t:šWÀ€±"Ÿl+úøâûtÙ[ÍËÏÓ.\††{7îÜßQÓÜä¸êäæ]u®ç7 ænIΫ>¹ë¬«(),¤Í‹KºžŒÎ]¹~�9ÈG—ž¥7?‡Ãi7ÇOB£9Êõ•0 ›çø‘g…»ÆÆ­¬†±¥…61=ÜÙWá: ¸Ž`‡_a3[Y,Ö ®®ök¡¥Ðjµ滎ü_ÑK endstream endobj 95 0 obj <> stream xÚk``�øš<ññž¼ ¾¯*a °¶* endstream endobj 97 0 obj <> stream xÚ}V TWž�Ç@�Qâ#CgWQT Zܶ¶>V”–‡Š*aÑDHxúÅÐÀ ñQJQ^"Âêû°¶J­=V=®­¶ÝUÛÚ®]9ívÿÁËÙÝ j[×s:sæÎÌ}ü÷¿ß÷ýÿ½B&#$ɘȨXóF½i¶6p±yCª»*\ðžEJF`�•œ‡à'|dØ_)=§” â·|á¾²�òg B’;Æ]vŒƒQÊÉâ×(�rŠ»â°r*Az“M¨ ñâÑ$J5¯7,O5˜¬Ö‚9AZmÈó¦‚ìŒt£•›£Õ>7Ë]¾È-â"ô)™æw]ómÈ <—Ó1|:!Uó¾ºý‹ÃMõ‚Ĩ ÖBD(ë_Nb[ð uÂ>x ƒ#á$¬R4ð(¹ƒm×£¸b�jèJ1/<à% P°÷K‡ª OݰÓQ¸m*,g°f'íOϾùüjVw¶èÚך÷�@|t‘¹øñ­Úwh ¾_ˆ©&6ßé(sч‡Y©ƒ¨¦`GYÙÎfù«òÓQËêÃi\�qÖc=ˆo¨€ ‡1@²*¸‚@ A+¹ Z)l<Ô}ÆÎäd£19¹ÓØ××ÙÙÇಧêTB³­"Ûa^—¤ |š¿å÷Rax©ëóQiaYéf“˜›Ac¿r˜ô6 gM{PËQÛÕ5§Ù®´Uõa4 ™‚ÇaÍý0æôý\ÇÎ�—(*Ž;zÛ={÷ìm¥Á«O0:XÕ…xAÚ1¼îŒ7(Ä;Y”ÊU�çÃ`/ù¯•ǧÍLˆ1ä0åpWAÝá%r9P…RÙáÓa:¼�àm—‹} $HþÞÿQGcîB»6ÉÝHð0(Úþ´Þ_€«€ Áññ|”0�¤ÎâÅn{ºíá÷ •SNM¼$ > ˜êÁ$ÑÕ;#JUtwºïdïfyL@yÿKX�›+m¨Ìi›TR�‡Œ´ØíÄ×è$Ýs Ù�±*á'q‘ßžYÇÃj7Š?‹ò�—é¾Ï’É¢�ÛX<Òaü ¼vMÕ'4OR‹ì›²QMq˜tŠPÑ.§½¤šÅ18@.$‘TÍSP+�0zjŠluUïnØ?ˆ½'Ö½‘g×ì(£ZGV¹å¨¤»:ÊË:Df—ý œã¥C E­S„•â98œž"ÜZDj– µô:ÿߢ |JŽ0'w«ÂS\Ì18%*bˆ&©KO96F$úAì#¢ŠHÿðññ¥ú¼ôPJ?&œ˜¢]½&)‹¹›ì4Ð!±¯Ef²@�ÔM¼è‹Uð„ªnõt4å-øEU¿Ó$Ñóoüp‹¹õ 1¯ŠMÈbܳ^ÿýYŸÖ²pÅÖ#P#‘ Uà#ŽƒI šàAü<~A;OÂcoOƒ—àå[ƒ0†Á>µê„ La që$z»®ƒ9v°·±ŸîíÝllb3P|¢˜®ZD�«O@ÿU¾Ð �Ò!ƒP¤�éÃó˜á¹�iQü¿8«!”<¯€‹Ç/E ðL1ÁA?Ð ˜�.µ‡óslΓqO*xã"u¥½1¦–ˆózðñÌú¼èÛÛXó6Ì�28•šÚíÎ’B}Za�˜vq°Gúið¸vìÁ¿À`òâ7ËÒÕ{œµ¿5n»'…oÀ©†qÝ— �˵ŸäÓ%ÛíÅ¥¨¬n3 ÞØ§‡âÙ¼&ÏÆXÊlÙR^^ª)Þc¯®ë=VWψ93Ø‘?kT‚é1‹b0!Pm5]ˆdêwW¶®MYie@NRWñ¼§8”w_@ö.–�%䧇@uŸAù…&Íú¶¼ÖÖ¶ÆqS¢ŠyHîÈ>É…{pI„å2¬SƒtÞMíAO=*O©‰ë8¯é{sàþ�Á ìëb,»PY#ÝŒ*],¼2²””—o/f^['?Q“HãYKfNŽhOjÌaû×vì‰å¶¸�6åzØr(+I“˜ö‡…xV”0õå¨2‡¶ ›•Åd>ÚQ_SQQUÍœ:%_{ñ®í /€|Pw­­-³K Û¼»/CÑe*_x8u_^§ñM&µ5s÷ü}žiUµ¼fà.:x­Û_Élq8JùycÄÍ×ËP~*³/˸;…Þˆƒž�Ò°©¡�í1vÛ®oõì²]ÛöªfQ0Êñ˺ÚWÄì/-E[ù&ñ­ªhd(ûá:yæ©wP}‚ø»©wªÿò—çý#(t<<ÃS÷o«~W—@†gZÌ1è‚‹�Vðç±?ÄéÈòik§O·{¦‹¬}�[Ü­œË=yöª›Û»0xFò8`¥îx%£v¢ã¬@�ø•_Ž#_LXµx�ýÐ{ |÷DËV’»™óÏÃWÐg§˜ù¤˜‘±®Kø€—4 : ¥ÂuÁOÍ“e–�åÙ´Ö�p�Š4¥E˜Ä嘗ü=^�ÇÚ±Bl»@Ša?k¢<1'3|)½µÌá,akv¹öwjÚ-ÍfS~j¿þÜõζ0�)$É÷W9«.Ð*÷!z¬@+ýÅ“0ñG÷©x“wq­ðj ¼Ö¸§VÁ<#‹7+½�rÿ (Fµ;�GÅ.GUUÇ9¥’ßÝ»ow­³zWE­S9úîY endstream endobj 99 0 obj <> stream xÚk``àPÐP`TŸÆðÀ… h) endstream endobj 101 0 obj <> stream xÚ•X{X×¶Ÿ2AZBk¦î‰¶µp¯*zÔV©-¨Xµ¶‚�ŠB€!‰Ix„gx’„‡‘ð~¿åm´ÇÚë±½V�ŠõzµõÚê©úµ×v�wÓïÞ™€ÊwúÇùî$™dϬì½öZ¿µ~¿„ƒÙÙaçå­Û¶)䊭š·}½ÞWÈ¢Øk›é×èÅ'@Œ¦8´h½„K»Ú�8èÏNÜI'»éOÑ×OUÿÓÌ[Œaœ´—ØóßBG§¥Ì§…K�Þ`/œwzãÏÃ8˜挹a$ö{Êá>[fC”"B%‘kb5ÚåÞ¾¾~(”ZU¬4F#Zîë»Â“=¯½ï-Ú"ŽŒW$«ãcEby”h‹·h›·h»"™¹+rWÈE’±,Z¤ˆKöˆÕ•Z$U)•joQpL¬Z”¬PÅ‹˜w•D&«%Q¢Dy”D%ÒÄHD›Bv‹6*äÑÖØH‰\-yy‰Dj‰D£Ñ(×úøh¥Þ •Ô'š±QûÈfŒÔ>ì÷¼6~´=ØkkÐ�ÛwzkR4¢h…J%шcejï ë‹!ƯaK±×±7±eØ[˜;æ�ya>Ørl¶{[‡ùcïaïc›±-؇Ø6ìcl'‚íÂö`aX8&Æ"°,KÀä˜Kâ2ñeŽeØ26ÒvXãhNÑ<þ¼œy™÷”ëËíàþ¯�‚‡ñ&pÞˆŸã¿Î—ð´/uxÉa»C�Óùëæ‡:º8f9‰œ†8/ˆ]pkÁ´ó¡—ìàçC–�8fq95I(éÚAŸÜ¨•gç(æ_ ¹ƒ–xý°l³¶­¦§â3#0tW_Sí(hCrÜå)$tßlzÒ{¾¬}ï)[Nö“=ÍE}ÚòX�bH‰KDiZ¬Ø�KGwôŽüg't+¥œ (¶À ‹ËwS0zrû$q’N�þ‚o"¿lg[{Oÿ»Ð²} á)ñÔ½4ºC_GÕN‹µxŠ\-íÔ×P0'4�ÿõ½ÛÔ°G-ß±øÀ ˆãÄÍõÁ Tê„Iw½ �=C'ìn¶mŽ ˜MÃÏ-,.VÃä+LŸ$¢èL(À…¾Eá‘ê8ýø}yÇ"ANø>_°o:WÕÀ¸ÐuÔ\o¤âs;H8ïÑ? +µÆmŇ۷Èþ>Æùg¿;wù‹Mïç�’žš“9P9Ņ甂§^|³~("B™~÷âg#‡‡�Cfà¼ÖÛØ'´º~KÇ… zŠt½\¬ïèB_~ËáÁÐNÐ×bînÂOøgŒ�tÝäÑÖ²Î~…1)©+ô”ùód†Ì„ �»OŸDæÌK�v£šõ� ŠÂìÑ*¾Ì¸ÿ¬ hN|™wŠlh7öSXþ•AAQH4.+)}—BcB‚ùò£*e}°/NV DøJ½½Zص™¤Õß…ÜÁK”úóº •�f`>>jl´9Î.ý”ˬ+ŸäÒia‚~¥1 %O¹p ^ÛnìcÇ Ä%¹ºhê÷5|iYÖ €�¶{Ï¿«™äÂóq‚§kØ|EÆ\«`ÐÒÆ .ù�‹–ÌâGMÌŽ p1î‚˹ðI·à¢x(4L#îVöŒÅ -4:+»À>ëpRžZ˜R—\ßóëYÈ3µ2ÂÖZ ÌÃՙȤMLÑ$S�”NÇg!ó0È o’E“�hž‡'PD1ZøƒÇo§ê[Ú±]QtD7HŽãuL"Ð;p…€èݱ>0(äÒäÝo¾ºø×‘½{Ùu¡ÃäX8´â‚ã1ƼĜ‚İ?ùÓ\¹yógZ Ç[ #�ô½‚œ<–¡—ÑK?¿ Ýàkc÷[©•p™Â/TŸýrôl¢ŸÉV�!ì“óÐ ¬ílîu´N0>üiþ³mÔRÍÓbõ‹ü7¼¶ƒÉŽ‚ÉN8 �xDIúÀ�±µÜã7ê[#%é90·RÂðDãÁ¡acKpÖY È,.}Vø®Uo�¶4�óY k™ŵò˜èv&QݸG–X¼�ôßø ð�ë¯S„]÷¹D÷**©¸,£‹667S�äcuúiRnƒøÖ8Ie$‰œ–"¡­¿¢EÐñÔ@CC¥-:šÙECŒSIļ–†ÒÊ©' ×øÀÜ<áÒv-v²dòÎTã5£�Òn‚–äÞºP½l?0iãªÃÉ?½ïïQ_•Le§å&*„² My þ¡Û¸ß¤ú=ù� ¶Û“‹wRÎìne™âÆ·É�¸6)¿6�Ê1éë Âbã‘¢2�kîÎì'ï[&îµç¶¥·RUeæbS‘ýÁòæ<Yßf>N¡`„ öDE†â¶OrâÔ_ÇN ˆC©_Ñ/‚ˆ© 6ë|ú†«�¶wÔRæÆrÃrò7ƒ?å|#‰Ö'sèxx^P•]™UÐMÆ3¥6èÈM†2±*ûX.›ÐzļxY¹éÙ‰BeSF�©Ø`ªð:ÜÏ3•UU4 Y€ØÐþ£5Ô*µÞµãtE¿€Í;ˆ�rü¿w�¬ ŽÐ¤¨\Í'ÜŸa_aƒI5Eô÷M‹cæŒCœ8_ÓÉ@GÎ@'®Áï]î3©v›À·¬‹íëxu'[â°fjf'Ã‘Æ €.à‘úˆˆ!½™‚pó�qØâAË9Ès�÷³_ÓŒZà/ÍÔ#¸6�A‹ÝŸÑ š7ÊCx-»á‹]!èRµÄÇ«T²øUwwKK7`¦§Å¶ÆÈ¥ãf·ŽŸ:òžÃEŽÓb4ÎxÂV$Ôì ‡EW¹ô‘~AOri< ÅüîúÒ–l©`<ìPº<›Z…êÞ†½¼¶,¥1� fŠA/�«Ï簾Åüøäü8iãïmÛ¤Ì2Šöä�jyº£æ\3YUS^SNMAoÚóŸ­gchqùrüñÕÇ㮯§é:Æ‘”R)€)ü†Bèà­�èâä #UY%#åÊl­†"þÞ˜—bÔ’2[ðâêòBäKS˜¹Ù}‹×¶1ž¤•J)øŸ8}ûøÈ@]yÚN€ü$}J~¼PÚ®¯×gÌRgÌn÷Žô×�1J~fTÍuÎõó9Þÿ€·�‘,ÞˆÍ-z¦Ù“,Ú ¥3èºÒ‡ÿ€¶¶ÿÚ˜6û……sÖ ‹Ùl³r€ð|„xˆçéŽäúÓŸ rú `u™`å'�›6}rõÎÔW_]¼tþ£?³P�«-PeáüheI‰N¢× î¿÷rHÎÄ�á q Óâ¤9ø[hÛ:‹W* ®f” œ?qï#%>�ܶxBÕüû¡­û(çIO+±Ž™xÛAm^i²™Aâí0Hü&|ÐA×ï@meYi­°"¿%NŽÄÈ •£ù'—÷ÜLö”¶T<Ÿ§�aMš),8ÿÀݘÏÁÄ®õ_ªIYž*[[™s¤€i’¯W!ïmBO)Z„~ 5+÷�V˜]¦êê`„”,Ï8t1N] ǵLj•±±‘=òÞmÇ�ƒçäâ2Å*¬•“[­þÖb†b0â;]ÿP0¨0dfÊ Ÿêgæâ.–l81vÁp4§™ÊnÖÖe³'~ƾ¨=?(ü~ýrbÔ&ž¢d¢ÖÎD­fZœúbí_Ðñ–C.ã5íUU§5$I„Ä/º CB]<ˆ¯íLí#/µ^¢Ð:x_&Þ½l…!pâ65¼+̆À"‹„Å t·B¿‡Ä«tí hÌ]±ïãôÝ»�™Oˆlµ/‰÷X¾¢ˆ–²À8 °Õ¬�À`Ù‹¼¾ÅêQ×;g¾‡X1 ÔMÚÖÖ¦Ú.–[-p§Ú[8Ÿßº~Ë|«å—–Ãõ‚‹ÒÏ2+AÄ�²l]íºÚW%¦˜®ÂÑ“Ÿ]|Rã'/K*óšY dÈLÀg P�›q0tDî5‰IÄó_ë·itÓ·j Ú)y­ù7µï ÷Eîú@^Ò(áíújûz½¾!ŠŒ0¨5ðSŒò¾ÆòcíåààйŒó$œý¿îÙ âˆEaq¹b�bÝ¿¢WšâJÁ²ZÞÁ#JS“�5u5Ëÿëfµ¦˜J6'÷Ïøv™ U]a{LbnNn¨G´$qù'®”z=I¾ŸA�äY²cc”kÂ÷TŒk@ã¡üc22B¯VS^6—*j =•@6vº°�„+»¿;ý¬›6[!n…<¦LÏ, qIvNÀ.9F >-ç¿H˺9Ê…CÞ\yÂìö$Óêß²BŠ)²ÝðAƒ¡Y¥W'ƒýÞœ$r³a´�‚‰Ð“ÿ|äy oÔ·D2NkÀëù¶vÄ‚òJÅݯJnܘ<ùìpd@u‘él¡V¦§Ó6Ù˜¤,Må2Ê••�¶fÆÊÆPœ8½vƒN¾IßÞ`5ÿ9¹Î¶»>”�»�¼Ñ?PÞx¡ê²z}+$mŠ­`y9ü+ÞäÐù³dƒ#Gèñ.æõâ5]ƾ>F’QÇSˆ'Tç5ë©OÖí¸Åk2Ö”u {å¬^ÃYb�ÚZh/9h1â#^ Ûêf+n‹vWꥑºòèš;OU˜z(AÈr`n²ë0¾ª.A@lq~LôÓzzé,Íâ/ô`5¾™Ý¡™Wù"Ì}[³g‰®‡"ôk�.)P—¸H’,Ó¤�Æ’Šâ*!¡ìHj�ËR’äúÂÏ<> ™Jô ?ä5Ïr£íßštZ¶˜ù…½–ýgc•‹ÎD¯6ÁÕ¦æÛ+œ NŽ–ùVDZ¦#{”Ö•qrºZd4–1£úrc¹ÓºÑõ7ÁÿO† C endstream endobj 103 0 obj <> stream xÚk``à0?ªdº`KXãƒc\%X· endstream endobj 105 0 obj <> stream xÚ]R[HaþÇ]#uZóF´êøg&^ÚÙÕzè)+ºa®Ô“°ëþ»;í:³ÌÌzKeM©Ýu×¼­hâà%IÔÀK��—§¡§À‡¨§"èMfl¥š!ð¡ïÀ9ç;œÃ��j5À0,¥ºæ>Ód¡K :#oqS�ʰFÊ’²8!@ÊÁ$'�SI¹jâK•Êú�‹åãª×¸ú¨!¶šÿè×a|6سd%�¦üÄså&nÏSx¿NÆ $‚dpd� †©±ÄãwwlŒmˆæ)¾­”4.—3ž6–r8yXj0\º¨ä«°Œ„U–FÓ¹(h¡m°Š„5$41-ò”‚ ­ÈiqÛ!c‡fôz9ÄrÐÁ2^WHB³“â` ú \YäFÙ —¶!òNïÖ×™a%Có°šjD4‡ N!‡tò¼çš^Ï{$Ã:ôvy‡Ó»ÿ-qzåNWyÏdÖUË+Lu$ßÊC;ÃBâ-”›#ÿ×÷˜›¶Éâ2Ê€U%K$CTŠXjÐ�©ŽÎjb¿}‚¤RÅôí7[iŸÄÏâùŒáî@OWàiGAw{Šk3»;ƒs³ÑÅèRÎ{ñvüð|hpR»…fì:*VØëD¢ÁÐX˜Xšý¶›92ÒËs>º§5§éн ¾õùZ´¶ië»ï‹bQ˜Hƒs’3cªChr¹Ü.ïxóü«B‹ú„�}‘Ü{+`"¹-¦î¨¤l±$ãëÍÖ!‚p ®j§§ööç–ü¶ÂÕ×íñk}íÓ³£«Öc,ÁZüàևΗOˆ5ÿº¿^ëò\ÏóÖF6›‘ÀZ@;Ùmæ™öÓ®ã£X´,j6�bÅÓR&ž/; ÜP\µžê¤ò‘ � 'ˆDµ™Áx’�¸�$ôÃJ¬L„p|yBƂ‘Ii ?% ¦–düœèÚ endstream endobj 107 0 obj <> stream xÚk`€MÁ endstream endobj 109 0 obj <> stream xÚ…X \WºŸ™DPÆôÚ =“ºj{ׂkµ¶à•‚¶Ūy„H$áÂyœðR$AžŠø@[ÅGkÕ n�Šm÷·µW+n­níc»÷Ìíá÷»w’@±Ûvïd2“sæÌw¾ùÎÿûÿ �ps#x<Þ̰ðpUªêå¿·¥² E¬ÚÞ¹žõeŸƒž€ËðX‰ û¼+;ÇÍàÉÃ+<]mžnãQØö?ªŸ üç‚Wêm?^Ÿ‰Ü=çp¿f>ë9×ÞqÙs!t!x„áMüáK<&0Ï•çþóLÁ ª8é†iª6I›è°xµ*-G�$“k%�‹^²_‘¬ò—„ÆÆ§¨²4)I’ØÔI¨¿$Ü_²Q•Åõ&I^T¥Jâ¤òXE¢D•(‰”n•dh¤j�D¦Ve¤iþÓ_)OÒH²Tê wVKÒX�4A’‘š UK´r©dÝæˆHIˆ*U+ KŠ—¦j¤??‰D#•JäZmÚò… µ2•Z¶0‘£Y¨pÒ,´ßç²ic¤_؆Õk7F¬õ×fk%‰*µ$Aª�MRhüÿ5´“í�*µ2VAp›/ñb>ñ±€ð#�Äbb)±‚XI¼N¬"Ö¡ÄD8±‰x“x‹ˆ "‰b'KÄr"‰P©„šÐºrñå¶9Ä{¤Ýˆrâ/�÷�K°K¶Ë®›\ëÜ·ïùKùI2Là&è>/¼í¾È]ínóxÃãÓvLû_Ï]žw§¯˜~hºÍ+ÙÛ{•Y#­è¦ÕçŒ élT6ÛÒ'êUüآºš€‚››ÿ ÏÝ9®RšuÍÝ ƒ°Ç`h¯Sl ?=§XÃàµØû�bª0äJè÷ƒ#»ûN*Ha9]u„î¶À>¯üA¤…™ 9€jÊ•EÃ:<îÐÑá{ƒh^-ù€n[ßÊû» ÕÛ\Ù<¤!ïÀožß�£H(TÐW¶7 ¬"uj¨P€&æ½ñz2 f‚í� öø‰â~ñþþQLÈ3 Ö†®])¿Œ .]<åöÅU‹�×2+:cßy(Û6ë.+‹õ¨ ÅûÖÀÃ}b´DÐYq<² u64t ÑlA'ÜšŸ6t8ÁèϬ¼QÒŒ¹²‰ˆ'êN…eº¢Ê¬R�_–½#˜^ºúÆßNw#¢ÍGa1#7´é;èó¾žÑ?Àh´ û.ž_ÏC>ˆ9ôÍ>Æ ¢™<´ÍwEO:EÖ„£1ñZeŠ´G}°~·¡z7È ß¡+(UäìÊç5çîëÿþ䜘»n_rtù‡ØB�ÿ,/*ŸmàÀ—õ š­'µæ8�ìIŽkÙIcÞ‚—0ÅP5xƃ?þóÂPWO7 6Ê þ%[:íxóGQÑË^[³éæØã×n\Žˆ´Ï /zͲúPilÂDrJ*²KÁÖŒÍÅ*:(èÌ=ƒÎ’æ68ˆÈ7¾ÁÏài ^ÀÞ 5ˆ½¾›�Dhö©�` š#Âmä¨éÒ‡7ès#ê¹ ŒŠºqç�Íe}D‰ÜSà'¤>Êå¡‘A?‘ƃp€Á/¹ $À" ’¹kƒÜ“¡'¤i�»æ­(Ù¾ó¾·!_Û{vŒä³e¢Q'þÇgN£™98®Ožj!²¹örÕ1Q(ù’qPÇ%‡¥ <´AK’êâ8°s—j¶�Ù0ãÐ4·/œsôáeôúeåeŸž‹Ù¶·mh½-ýb¹í­‹Ô ‚­gg‹ög÷m.ÜV•ô. <ˆF�¼í]ÚoMÐÒ�û’›³ŠGêŠ3”b¹IÝP¨ÒÁÑp]¡xÉ�Ñ,4ëÇ‘»€ – æœÙÚvçÇZ^¦×’%ù°º„É+ƒ¦†šSXhª²@qmµ©v/¨¬9¢¦¿½5ÆP�A½Å=¹ÝÀlì¨m2Óê÷—î¥÷í7ö0x=v½µ9öÔy@]«ûèäÉs íØ�±(&hç /�8ÙÚÐßßZ:à(=†øp ãÅÊÑ%QSIcÑn€ï!)¿A_a(¦uÙÚl®·”AÇðÌ}ù…¥ù%Ùbm[AKC�¡ÁÐÏo¨oÚÓ&¶¯ÒõIºŠä誡WÔ§†:ƒòÈï¶žxu}tRv6@ƒµô1S-´ˆ4à�»•‰AkÉoo9{Þ¤ÚpV‚À1ªË>ÊÏ1Ê��ëío}PÒ·«l”•ÝÎÍšóÀtÇ™*x™—•  øxO §Éf»*Ïa-¢î ‹J•‘¡RY2º»-–nÀYgõZreeœaH?3™„\âMyý̸‹žjßq@Ïáß+VÔbõùèÂÎ ½€|¹µŸ­å¬eÂÀêýf.3©%öê"ȸr}z1³GÈŠSËRŸ­"‹N-BÆÊzaG‘êé2O • Õ£0Ã~0®¤dBCÕ);a3˜˜”úØi;Ý h|÷*ެÍߣm’Ö• Kê�¥FºÉ´Ç´‡©©¿‹ê�ç…†ñtÒnÃn€¡Šžò{„£#ŸóÐ4û>Ë—f›^ËÚ%h‡ˆ TÆå'¨À¡-Ìf&ï7s%á2ãkkkòŽÑÇj¬­Lç}ƒ©Æ"4�uQƒØ½¶D˜kl…Fz°¦ÅRË\Fcü^{Õw¦�OÚ†#ѶóÜ) m£>cK'DL<‰g¡%ˆD/ò�‘¦®ÉÜrwæœv1Áó_ÿŽ€{—´ËÇ•ô‰buŒDøE</áÇ“TçÏýÈ݉ »l¸‡¼Ç°7_•1I&îŽY/ûÿ3XÚsþsÜ{õrûÿ~>…�ìêF´²±¶‘n‘*Owè9Íêa›v¤¥Þ`ßêÚkë==ÌÕµ» m†½Üë9�µÌúoÑÿ}Ó endstream endobj 111 0 obj <> stream xÚk``àÕUØzƒñÁ1 bl endstream endobj 17 0 obj <
> stream xÚíZkoÛFý¾¿b€ýPk “ó~A?êÆˆÝdí¤Ù,«ªD;ÂÊ’!Ñyüû=wHI#YÔZIÜ6‹�‡œÇ½çÞ{æÎ�CagÂ3!“œIï˜LkÁ¤f&&shWšy¡˜æ,HÁ´a‚[tL�R2¡0\¡^™À”ES�¦¥b ´1L”PñÂ@�‚n!J¡ô� 9VH¦qoñOk”N3 yŽ[¦!ÏA˜†ºëe“éuçéÓü¢ìW4efÈ`2 òI¥3(ò!3ÁwŸ>ýÛ×TÿáǬ��ßôÆw½Qn2Õ\f瀞ÑßU¦2¹À§dÈ<È>ǧ´Ïˆ¾¥ç”Êh:H¯2C±²ˆ0§‚Ë0mÿ@dZù,`ÖÎ}¦�Ë´ k>;™Œ+*Ðù æe}aÀÿxáˆññ*ÃãX/š"ò—Pür:é_–U‘¿<>É_•«üô¦w]ÕÅa]œ®©^(J„.ub*Iû9âφ7ÃjVìOúû—UoZuöfðËp2þG&:ÝüçÞM¹Ò¬¢Æ½[È@%–w²£¢Ý©äiÔ¬éZ¶óT›^ªK{`‰X ©v­ ªÝZ•ê(¿V¥;XN¶Á1 œ�hLG‹U¡²£×ŒV­VktGëmzSµaƒZh]3Øvô𽮣×ÌõVkBÇðÇóá`V¨ˆŒ–éXD_Ó*Ýt+d¬Éÿõöß,Nb¬c˜³ÈÉã»Ñ¨»©]¡@Þno:s[Ú‘a3Ä©½ÝÚ­ú¥2™]ŒWëÍÖºL¶¶‰”®Z›µ ÈW­ÍÒÉ ¡j…f�Øêkx涘näoi¡IjsÜd| 4ƒÂ«�í/ÌÒq ×q9«f´Í‹9)f÷a5*Ÿ\•WWœë’s‹Ußð3O›4þÓäÕ$?NÓe³Þ´W´1"�?#�Ñfi£Tì)86<�ˆ®%®µnî-~طز.�nî¯ê:§ÚP¨…MPøÍ(ÖµH�_¨ÑHØ«Êú:¢Õµ\ƒR–m(LŠÂ/QXþpæ·-šQïúM{Ófqcûu»áIOþBÝàkXfï[örZ¾§-÷ÒJ±ƒ•›´ïhÙ—[åZ¬ªãÕXÕ2;Ô9S[–ZDõ ‹ÝjÌtÚ&a³%<0²¶€¬�ºú�ûíÖºÁªN’ëeƒ­Á¾�Ñèˆ2T2×Û<çÛ<'Ï©ßÁs[<ñíy5´yU&^Õ¿ŸWµmf ¨ÇÆY÷åql][\®—›¿RÀ׉6×%»kÿÊ;ºU¶¹Õ$nu°[çmÍfEšvŸ˜­›„‘êÚ”Pxû&åO*ÕªdjýŸ#T[C´-<ß^Xt[X\–ð�‡%Ý,‡ùCZãBÓ„âÛ �i ]Ë,"×ÌÃeÕ.OŒ‘$'Ã鬚?Äœõfs^äG“; Øbí¡²~èiɾºáÀÂg²y¤5¸ù#Ü烖 h·Ýxª-×ÇkÌɦ`6 é•’ˆ5t†‹è:J¢WN$㢜Mî¦ýrF'J46¾~Ù».çÚodŽ+ÜÎ Y¿e¬ßÏèðd((Ì'ïȽgs š×f5hSë=/ÃÞáäc|EMÇQ.ÈFÀÑ´ìU“é<ŒÍT3M�o(?;!šûæ™4†Q7áCèVž}ûM¨çtÀ½¹j¦D:v>…|�vT̼ Á]õnÌ4�¬Læžnæ[.*Ñi®Šïšwýrº÷qð~x;¸ºùÈ~Ý“\j®¸ùµÓ©íÁŽ{U¹wüš ’š …ýžËï8ÿ®S»êÅm9>ˆll^_� «ntþùdPæ¯gå‹»j4#ñ )ÖQ·yí‚”®yXc�zUo4¹Žï3}¡Mè*S!ºÚÅÂðBsÛu²º®«+½ˆ=½)ã× ¶ˆ…Gº‚ÛØAð@ý1½UWÔyÓ¥7pРuÔ€‚4(Ó5¡ÀLîZ[H'£"´‘"TS8)˜ò"¡”#§ÄŠÂ)ݲîÚ�víºZˆVWÛÂ[IZàٮхãŽ)ȶ¦ÐtlŠZgŠ <óžÎ i5Vu½.è¦!uPÓF´òÑ6jÒÄ’»¬c¤•L4¶«9*=£Ÿ“2Ž×†ª¢ñÔBÈòÔ:1³QüA…UÔ�Þ3E'«ê` 9P¼ÕEŽyôˆÚ!• à5Çû@¿®÷Q{$"F-H;2 ÞLê<CˆvÅc˜±_ i}ïëR6z½"8Ñ5Çp1wÃ<>Ä3]xGÈÂ+ÐMJ„&éÈj«‘�*m(èÖ"pp©Š"f<Ñ„ú‘½qS…ó–h©5*»;§ñX˜6MìPc‡qRç E€2tÆM—n~™þ(~±ˆ­5^C±‹…_Œ¶"ÖPøæ56Ö`&Åb©ÈÕ¢|=«º0‹v_C fO Øò:,¯E­«Lä&¹–b‚jRƒksÔ¹®l¶S®˜Š{¦þO3]HÍhÌe;¨‹ÔÐîbA¢3ÁÅéÑé1ÝSÏ{³2¶þüüâòŸßŸ�_Lnzcáö/Êë»QoJÝ/?ͪòæt|5‰ äõpVM?í &¿•�ü�µÇ×{§,‡ÃêSšnoGå -–œ6 �\ÎúÓá-V6úf€íñ†Õ%C_#,·0s´ËþùÁ¬O’<7tH¯÷E0ù%0ý‚]²õí³rxý®îsðþúÍpP½ÃDuQÔ!-´ûX‡°ñô}}+‚YØÍO‘å‡ýƒñõ¨d<400e5f2b0032e15e3c51a88f6ecbc885>]/Root 1 0 R/Info 2 0 R/Size 113/W[1 2 2]/Filter/FlateDecode/Length 282>> stream xÚ%йNBQ€á3¸ ¨\AAw׫(  ¨•‰‰‰vÄZkÁÒgðL,,í�…�`au=¦ùò'ÓÌŒ1Æó|&d²0³°k°Ø…m8€=8†C(Á ©C 4€Êp*ÆÑi#dàÎÅÿªƒ&A†fhƒvè€ 8à‡Nè‚nˆ@ D¡bÐ }Ð è`a †`F )…4ŒÁ8LÀ$ÌÁŒïí_œ?KèÎö,‘´%úf‰=[â_zþº$^´$ù«µ)©²Ö¢¸Y­qŸ´r’ûÔÚ—|F+/EOëHJ×ZKR¹Ñ*Jå]kYª�ZgRýÖZ‘Z@ëBjWZ«R¿µK>üóØ,d endstream endobj startxref 34021 %%EOF rvirding-luerl-772b25e/doc_legacy/pdf/luerl_old.pdf0000664000232200023220000011634715114130670022716 0ustar debalancedebalance%PDF-1.5 %äðíø 23 0 obj <> stream xÚ•Y½n,·îóó«è_#`áâ÷^ ]wA �÷lªyÿ&’HŠ”Fãõ�mì¬F¢(òãGŠÞþÙ̦Ë�Ù’-¿zûü»|ûùûëÛŸÿyß~ýŸÙLRÖ¿½?7“�Úã¾ÝŒö*ê}{üq×ÚïZLJÖΖO�ßh <Ûgyeì£|Æ·?ß+‚ÝfŒÊ!Ø*øæ’ò{Þn^«#Éu Ó|–çÇÛÍÙXFm‘âž0-üÕ�ªm·>3<á�uo7›î¬`Ì4%–)G->ûz”£©œÊ¦œ×fUÎŽjÅC딋è2×½æ±úér[ûßw°`ØŒWÎÇvÐhTª´Æ©h2ôYWÛauÚr±ˆ�Ãb”—Æ/gs®¾Ñôw0Y‘�#ì9ÒÖ×Sl‰¦Ël£oÍš1ó®.ÁL{Ð.gӵȳ>]é^�š":÷ñÇ7ìwå yÊ›¦­Ó¯´Mþ£ DxSWxW‹_zÆ› ­¬w„¶:@>‹&«äm‰3Ô÷6Ÿªy¯« hÐ`ž…¹oÐ%lB—<Î×OòìEzÈèÇržb/=yGìiw\Y­áÍkú¶§ámf‹­�þÞ’Y2YºêŠï½É赡¸î@´õµ$¿…õ~—Ê5·if :x�y5Þ-ÿØTø«QZ-Y´G³‚Äî¥÷\VÂì+þ³Ÿ|d^9°óßàÆ lr]^=„� ‰n°²ƒpè`ôh¶rQC¹FTŒædht¹R5z®ÙЉK@0¢Üj8"= HëhÓÚ¹8‰V¥Ýs5ÑîKoÎÜ™â|ìåìhQW”�“ ëD¡0Ç&é)*”Œ� l+…Ê´¡Öè )3žó ‘â‹uP4O%bÂmécF�·[ýT|ã=³{Ð)£ó*\ðSº‹wN �l"–é´w Š{Ëx�¤Ü­YNO�ñ¾Ì2”#âzè%•›^Hk¸Nû¬lSy/xyÕ$¼Âš%ù“\évWKó ç)bAM4«§8…yVÛût*êè~—ß–¬­¤mï¢Àt8(±ö·TþÂÊÕõµÍkÅÓ-Ðæ6úƒÝ§0˜¹DÂ÷9e¾ÚÍÄ;Ça¹ 8 ôܵíþíg…äœt_V‘)ž jug6Ö+›ãvó¶\Þ}—)’í’B•˵´Âz>»YZÃÿ±Â£êu<¸ë]€t†KT=�Ø}M +mlHjwû¬�¼ià•t¹z/×zçO«eJJDéà{GïÕÌ>ÀW¡W«Å�˽K¼–g¥ùuòbtº\ôªS‡›Ç|ˆÜWºÒ£”!׆ +9^øÂ>·€¸‡H- R6ª¨)ŽUQK@¸ÄˆöÇ«4vòq^tã `UD€³cëL0ØdèT�[‡luÊB¤$ÜÞ ·8J¸!°Ü\ôÔ(¯NE빈¸�~£ª”¨­\Ÿ^œp¬ Çk¾^°YoV4¾ÂE?‘M©ob!+‰eÏ$èrm<ØD‹ßi×Ù\Û„ßñùÜ!å‘Uúµ�¹lҵµ“DYŠO2ka/üg´ Ð/UÂFŸlÙè[Õø¢–™+ªàlý°Ï•Uë?(öŸ2kzð 눳À˜Ðá²#w–Û[è_ž�0]o•’ß4„ß‹ _àk’SÚ·KNio©D½WÅ\ôµ ¼’P‚¦¨\ß:œŠ�o,Í2²£=×;Ccg÷¢ý(½Ø¼G™|Ñ›H™j®šékì.P¬±úß³* uîöˆ›ž}0f¨„¨Di3‘ÞPŽôÐ=ß×r–(Ò_àgiv»+c¾“ƒ!n ,o÷ÂÈsWýr>Íiþªtí‡ÅS?¬ïú�^+—Ãÿ?{9£L¹¯ß¢Ó*ºNRv^ùû/ÿuZ™ endstream endobj 28 0 obj <> stream xÚíYÍnä6 ¾÷)ü£•¨`1‡Ý½È­è!göÔCßÿRQeÉ#�=›d‘C‘cËI‘dMÿNj’éOMÒ¿œ^þIO¿§ëûÍï¯OÓ—ovRJDkazºNN ïÂtr�~íô4ÿõUJíÎQ§_7KiÒ—tÓ=Hi�98ÿýôÇôÛ1�SÑ�ky%”SÌ3Íõòì�¯zI#Î'£ Rž7°HH†þ@KŒõËNàµ.N'Uá]g@‘ÊläiBïÛ4óßáx¶Ô‘¢+Ñà|§ˆ#Ù—è­o{;��cœˆÞ,†(Ð4;Ð 3):6ÞÍ¢ù½5d.]ï Yª\de3]XI.sÔÕ–—î¹J¹(‚u+W!U†¶Öe��.z‹<ŠyõÆf0ZG6`°pê¤gKæUÎ4gá„tÚóÓ@C –’�†YOÙA†R EÒªœ“‹�“té™G ‰±×íÕ˜>ë&S¸hû”X1w_.ù²‘³©‰¯ólËad³[nYëÇEsNóJ�¬èSl[1ë1/òð^Ö«Mìb«LW�š§ –1F¾wôN»e æ²g}ëZÛþ$»çPsj[Fª�Á€ªaîwr#@µ€Ï®ñÏ€ÔBy¯UÎsÖ~]¼àæÖV)¾ÀsV‚°N¼y$ûÑPžêâÚ ˆÔ˜»�Š—K]R>qçü\rÞ„ØéÀù¯G ¿­$?�¡ærAŸÞMñ�»YºêYËWæ°•ÙVNÆ @j]‚{0^°âä•…‚jÌðºñÞõSÆÁ^~é#¥öï6 £=[Ü“üÌèÊ5¥ÃD­2ˆô,èRpÛª”1šïü¼xf©n·<7qö`=„³`…6~gTõ>M>Þ­¯†c¶jí!H¤~\x£I�:—w©±Ìnjü!ptIè`{5�q±®ÛÞXÙÐ� ˜’¥pք৸Ÿ-„´ÉÆH»ò �ÜK6DÑzŽFZ?ÑÎÄ–jaO\j툙ë2ض’[]$0@Wô“Ðc7š5ÕŠÃh=cJ¬Ûba·q_65ÔDŽûœtUݨÄvíÅÎ~šUW½ëLÝ–•<³$Û6JµYwª‰y«fqÛgòï±8M¥"*»§¹m¯X~CÉmÔÁs±å¥l~Û K6½Ù^§yñ}²è½Í<Òìç†!8ßgv(í帺×ÐçÒÊ‘p´ŠÁ…fêk‰�bã–Ù]ÚjÏGü½ö¼ò¤2¶ºociá¶¿Âk¾kl8¶Å”1�6_þÁ˜ÕÀ�ˆÿ?ž>&ž< áÍñô>[ƒOŠñÒÆ*ì`¼~(¥Ý½Ã=âz»ÿëñú‰bdؤ¼9`*M(×z�óf ½ë÷ÀC±“âFø›Ý|e&;lž€ªD]±}Cf¡·õÃwÀ·fÕ,ÒHÛÆÒÈ}d Um^—9ì”ké •º“ ŽëÔF?Éߊ~¦gº�è}v¼› üÁTp².÷âüÞ› ·i¯s–§¹ð�<[ÄÒ|“nü%ÐÏüÍ֕䛵lS÷=Åìs“}wLçÍ�'·ÿ¨•/- ÇH¶Úåf‹�OWØõ)X»³àî(ç;Ýñä\œ«âòR²#:¢˜Çà•Æ“ÁC®úÍ炯• t}ÙÜ~r=–Ï­¢ÙmY²Â–ù¹ß´HcùÀó^:×j‘Âá‘Qò<æüc­Ê�Ã|½HÆ{z:,ì˜ÀŠ^ËiáCkœ>:'dУƒñÆõ\¤x}T)î|>Š#8êÏ£…%eÄåìtÛ·ƒUèt»,‚OÈ PŠ ¥"Œ°¬a)Ž«ïkpw§~Ý ®VBi=�œ–Âéú©ù²žùç/ÿiî'ò endstream endobj 31 0 obj <> stream xÚíZKoã6¾÷Wø„%gø ´z+�[уozê¡ÿÿÒ!‡CQå×:ÙMQ춨Ñpž?‘Ùý³3;MÿÌ.ý׻׿éêWúüµúþée÷ã/Æì’Jüîåmç� >îž<з۽œþxÖÚF­ýIkúÖ| ¯üíŒÖ†~ÃÝûBcG+×'–ÉϹüqtíø:�"‡ü¬O4FòpÚ?9p4#ši¦,aóì¤ÙÆÚ§'½a}Mož×Ë]K:ñ¼lÜÿùòÛîçNÄ&e¼‘Ø„>åY ©ë§´õo~à6ת™^éˆMŸè ÉŸ!›<âar/k³1K`•Èw<Ȉȶ™ëÎÈ12VA²Í’íÔ¼@ú99AuZ* Ç=ÄçòXç�—P¤^ITŽLjЄdƒöq0!D=Li¨A‚R¯û§2eŽ})§·Y ;Äh¯’ö—Z¤N#Ï-ðàr4T`¨Aü:T#Ò”À–öj`hÉÍ՛͞dÖFÈ´k�ØÝ2#HÎ64çüú\iÍÇÀñq œ¡ÖŠR�5N-À)@ÏÍVäŽ=~˜cõèȶ݇,�õ¿Mq‘†ÎÏÁi¬ Âû¤¬µ7zœq¹ÄU %ü§‰Ä°ècPQâ‡Èy-Uêͳôx]›l­½ØZ½ÊgÜ Œ; ¦H‰ÇI®0L2y†l}Ö\f:• ¦d�þµvȳ²âñˆØ¸ÎÙ–Eœ ô~õ¤èËÚKLÛœ€åþD˜\䉀TÀ£9YÝÎ)Ñy£’fæÅÒl¡K™¦Ì®ë‚‚åË\HÞ òã”LÖü>f̸€ÐÐÝÓ Óy5yù˜ÆÉ‹ƒùÝMiö›][¥‹õ.R¢AVá†Á‹FYdÃiZ‘¸ S[äjÞ'¥`s‘\Ò“• á>zb‰Úĉ´U²ŠI«TYqËhŽ‘¶§•£$³÷.s�•¯Ùž' v<.:î ÔÄÂq•t'SóÊ›‰ªQ5&Èœt õ¼FdÌ*À4â°ÃD* ± �›bd¸Ua6פ Q9I8?34Z€D©`f=ç¹#©ðÝõ–ÐUhFïÃ{Àü'!�ÖVÃc¿–´]ÈØíG‡b�Óðl�ŽÌ�áÊn¥›ZljÃqËñ°Ö¶ÑnkÖw:ëþgÛQåo^Ù ž›ÙÖŽË㽫ÒLÜ‹*ïBšsôJÌ܇œ°:Z¬·­9 òŽ8m&¯„ǯI}ÛàçÊÆæâÐë–"h‡c©’Ýû0.²õ1Ý™•çlrFæŠn&~ß²Säߺ…øô Nç½&ùv.›•àê´{ÊeÐ{7ã§~‹°?¤´ z&sëCÏqæjïû·}„³³û� ¿W•R…î!µô¹ê‰¬SÁ†ï»žF4ÆsHðˆ¿Î¸é…o�°«I„ïé�ØÒ™�¬°Yù³?‰š©DCü©P+�B„ýaùäï?ü â#à endstream endobj 34 0 obj <> stream xÚÕV½ŽÔ0îy ¿@Œ=c�m)J�HtHÛ! ²a©(xÿ†±ÇNœ�½[-4è.ŠcÏï7ó�WýRVþ³*ÿuýÉ_ùùñÇûÝE½ý`­J:�ºÜY(ª�€ß^]–/£1.C‹1ü6ò Wþžë^â综-ïŠL>óž×^Ö�•=ŠL–ÅË.ÓàÁ³²›…ršµ©�:ö‹«,dK·ê$ºeÊÏmA`�8}½|Rï/’z8É�ÑBdÓžy>vgYÎÇP<³ku´q•=R´IþQŠu߯ðhÐrË�˜ïb8ø)â(¼&nX$3vŒ^w¨öE™ d»~pPp‘ÃÚ¥ó6#ÊÜXzÝiÕÉugÆxWc/ÁìœíƒyÆÉn¦—óÝL_Ó>Ø„'(×Jžm>uˆ4Öà|™ }E¾/©è‰ÕÆ•Ò`¡Ž¦:²àzÖÕÎi4ÛÅÐ#’g˜�«±Y‚ü÷sëu«NºàÀ)¡ ÷áN™{^óŽ/Ó$Ü\]Ú4jÖ¸‚RX\…KåE-n�,%\]ÚŒî*Ž÷K;‘Þ‘ËѻùÞ2Mív?µ4K•Óó1- mwÂî§b�1ðˆ±ŒmÊš°5¦£æç7¿¾HK endstream endobj 102 0 obj <> stream xÚ]Ñ_kƒ0ðw?Å=vŒâŸV×�ÅÖ"¬Û¨íÃÓät�š„¨ýö3¹Ò‡ ü’»x¹„e½«•!ü¶š78B+•°8èÉr„+vRqBòñ!?óž™ ,�Ì|²!Üþœ‡ýëÇñ¤{¦â·å »éÆìòr®â ¶}¾„äáz×܇ûZµò<ç49Œö‹­ÐW|qk_V •ªƒÅ¥lüJ3sÃÕQPþ¸˜ÊãZà`GËT‡AÍ£€¼šG ÿöãˆÒ®-ÿeÖ…'ÕEÙºpZ%¤Ôk½!•^iLªH©W²!e¤w¯,òzKH[¯ÕŠ´£=úC¶÷J©ØGU®l×ïg»ùdí|yÿ(¾­®RáóÝŒ6.Ë$%‹Ç endstream endobj 103 0 obj <> stream xÚ]’ÝŠƒ0…ï}Š\vYŠÿÚ‚­V¶Ý¥¶�êè 5JÔ‹¾ýjNèžäÌ™™dÌ$OsÑNÌü‘}YÐÄêVT’Æ~–%±5­0l‡Um9iRÿ²ãƒa&g>\xGÌ<Ý�§Ëñóë|í;.lg{¥f~r¹½ß2;`ÕPß^1Gsž¯q¢.uÏ¢È`Ì\ÂÚq’/¶9Týƒ>Ö½oY‘lEÃ6÷¤P;Å< OêHLÌ2âXÙÙ(¯ì+^’ä¢!#²–³([Vl�¨þ�;>ÂuùËå*·“EnY�¯ä¸ tPä¹ T‘“€2(=E®òApqw =H+�P† í¥g!C Òž{<½h‡3Ô⡲à¤È·A..úó‘ÏGò…š  Ñm€ªCT jW+‘/D·�ö …º[K]¿¾çõ!Ö zP9K¹<§35(ë›¶‚Þ“8ôÃ¥¾?Ì�´‡ endstream endobj 104 0 obj <> stream xÚ]’M‹Â0†ïý9î²H›ZS„RÐV¡°º‹ÕËÞb2u 6 i=øï·ÉHàÉ;_™I\5u£ú‰ÄßV‹&ÒõJZõà W¸õ*¢)‘½˜ùS ÜDquàæÈ ñ¦ýiŽÍÇç᤮hºØê»\\Î{ʈ„MÏO$ ÜÔísœ`hT§IQD„ħ9ò8Ù'yÛH}…ww÷e%Ø^ÝÈÛ¥jýMû0樉$QYúpkZÂh¸ËÕ ¢"™WIŠý¼Ê”ü§Ó5º];ñË­3§Õlž$Œ–ŽÒ-Òiç)Ë<-SÔVH 5†”£†”QÔÖHÁ/PÈP#aöl‡T£†´Â(l�”yÊO,AJ‘Ðr…U3Ì—Z#áfÈñ yÈǰº¹]¡/®qnܯi‹‡µsûýŸðƒu3è¼¾�ÑÆyùý¯„£Î endstream endobj 105 0 obj <> stream xÚ]”Kkã0F÷þZ¶ %~è‘@0$q �éÌ·³èα•ÔP?PœEþýØú>RCÇ–î=ºWÒbwÈ]3ŠÅ×W…Źéjg¯ýÍUVœì¥é‚(uS�$ÿ_µå,v¯åð«l­X÷‹?_�}[vQør´—ÛWé^ÞßòH‹Úž1úí>X“Yq¿Ž¶=tç^¬×�˜âLÁ¯£»‹§MÝŸìóüî·«­kº‹xzßþMq†/ÛÚna�¦>\½ª¯íu(+ëÊîbƒu8=©XçÓ“¶«ÿû®5¦�ÎÕgéæáÑv†2J=íî´¡æYþ÷<'Æ endstream endobj 106 0 obj <> stream xÚ]’Okƒ@Åï~Š=¶”àÿ5� 4M‰É¡G㎩WYÍ!ß¾ºoÉ¡‚ÂoßÌøvfì´È ÙNÌþV}]ÒÄšV EcÿP5±+ÝZi¹m=Òߺ«ËNÕðUuÄìcö³ÏŸ‡SßUÒuV»þ.V—sîr&¨Aèù9ó Yù'ê Ùô,Ž-ÆìÓ\yœÔ“½mE¥÷å쨩VÞØÛ%-õIù†;u$'æXI¢Ë¹ðV÷‚Æ¡ªIUòFVìÌOÂâ|~‹¤ø§{k¤]›ú·RK¸›ÎáŽÃÝd!ÏÓx -È!Òß‚räš|äñd´µ¦ÀhPˆš;‡f(‚–‚ÖÐ í@^‚=(ƒ h9È…fÈ×4‡h‚>Cxñà“£J„NpT Ñ ŽE†à3D'ækjÍœEèKdjrþmô ÌD–‘-‹öÚ³ú¡Ô> stream xÚ]“Qkƒ0…ßýyÜC�I\¡­mAh·±nc¯Vo;aM$µý÷ÓœË&´ð™›œs¼¹qY­*Û "~õ®ÙÓ Ž�m=]ÜÕ7$têl”JÑvÍÀþ›sÝGq¹«ûçúL"þZ,?«õÃv·sÖm‡4y\ºŸöñã}“Ñҵ﷞„d®VûÛe se�NÌç‘ñÛxôeð7q·hÝ�î§w/¾%ßÙ“¸û(÷áÍþÚ÷?t&;ˆ$*Šp\ s�kéÒ× ùÚž(š'ãSˆùf|Šˆlûo]ó¶Ã±ù®ýTž.Çò$Qi¨ d@RbM‚2¬1é@y 2 %(­@O�4¯Í@¼¶€B‚Ã/Ù´ $YoƒJ(KqŠÁµa‚3e@pf˜X=±:ô²5ˆõž©^�A±Þ „ï¢�VAÝ0áKdP¬Î§°:²+¨+x1 uµ!»a‚— ýÓèØ¸!�BW˜àS"‘†O‰ >%ë!»Fß Ôs&¨ktÌ@=gâ¾£G}Ï™�(G�Æ`B¢XŠ`7T2±z”ó­›…«ÎwzºôÓ¬þ�jsõ~�0Ða(§ùé,ýÍ|ïúiWøýAùúÌ endstream endobj 108 0 obj <> stream xÚ]PËjÃ0¼ë+ö˜R‚).c(6CÒGœ@éM–ÖŽ –„,ü÷•d“CV0«™av£²©),D_F±-ôBrƒ“š Cèp’$)pÁì†ÂËFªITž¨þ #BT}ÿëßçãé¬F*“xßXzl½ÔIû•|Y4Bºá¦j—ÉâØÈ^Až€èì¼'kؽsÕᓟ}ŽFÈvײ “vÖúŽ#J 1)Š`—¬é˜â8iÊÐP9 ÉcW䵫‚ äÿþÓUÕõìF�g¿¤ŽÇÙ[áQ¶¢×CÐn,ïâ·,Ïfc\–p¢°¥$$>®¨•öªÐÞVu; endstream endobj 109 0 obj <> stream xÚ]’Qo‚0…ßù}tY P¡hbHÇb¢s™ú°½a¹0)MÅÿý §ña$�|í½çÚëgÛÍV5=ó?M'�Ô³ªQ¥¡[w7’Ø…êFy!ge#{Gö+ÛB{~¶/ôGÑówï§Ã÷Ïën¿ïTÓ/ªï×ÂLϧ<¬¤ ŧ‡&Æo7ÇÇ­§v«ªŽ-—cþÐÖÜzó`“UÙ]èe\;˜’L£j69gG»r¼k}¥–TÏ/M­\ˆt²+é¦ I¦P5yË`xR¶Ì‡'õH•ÿögm—Jþf,×CyDaj)³$@<¶”d ZƒÐ´±Ä]e•ÈÒ,„C âØs!@È"4go §9·ðƒ{„œ’EÈ)ÍAH­Péúà à#§ÈA3Kq‚‡{ ¾!YÌ- $KAs³„O-@8%�, ÎE8MœKâ4¹{XØ v79^õ8¢Ï •wc†�±slGqœšFÑsÔu§Ç.ûþæǧ endstream endobj 111 0 obj <> stream xÚeT{LSg¿—––ÑR±—:Ó꽟o7¤E¦3è6Ä¢ø 8ñ1©ôB ¥úP§nÔ¾n[jq‚tõ…W‰2ÇpTD’-ø¶è†l3c‹nFݦYÜwáÓdmöÐdç�ó}ù}çœïœ_Î98&b8ŽËW®ZÇTêÌs¤­£Ëì&�%†.å'ñ“Y)É“Oá<ˆã§ø©B” ®J…O§£ÎIñ ÇFã'cîÓ­ã¡@:5z‹wH§Ç€°t–‡á˜KÆ&b“±‡Ø3\„KŸ”¥g¶Ñ¹zÚl3Úê2Ôééór˜ª:‹±Ì`éé¯Í‰éL�­+t%L�µÂtf=X¡«Ô Ÿ©‰¢F0›1ƒm´Ag*L)ÐÒ€ÝJ[¬ ÌÂØ«¬¯¨�Ö`´‚ÆR¢§…6Ñ:+­v³ž¶›�Ë ´`)c¶�•ÆÚl¥AZVš›­j¡Fc³—©K™¦4jcÕ˜þ6²jb~iKWçkÓVææ,É/X¢¶ÕÚ@)czÚ¦3š¬êÿQû�ÏX*u&,*,[Ž­Å ±õX1VŽUbfA”´¨H0IŒ>!¶ ûŸ‰;ñïâæÆlœ\…í2¾±>\Ï}Øï‡!ÃUwÈÛ`¸— yëN¼æýý—(~LL„‘do|µ¸ÿÀ¾MÚ-º¶ ,T͘�Ž&¢—ïi~éº RÙb¢¦+ëªl5$ª4�µ*ó´X7À„&îBGuÙqªy;ë®SÊøWë#ÐÞ²+ sÂò“ÐÑG|Ï+`ƒâqá$š²`&‡&ÜO}…]OކêYÖáõìq‘ËìZãÛªââÖ®*ÊÔËö_TÂó"44°þ”…^¡Eõ"8=tëÌ9Õà…<$ôQ2`¹QI¬¶Ç½D¬Ž–çjè¤FãÅÄ—/öô´˜v9óÈj±¿µ‹=¡âºXO+%ã·ÖGøya<šdÛ€€Ï�å ˜¢þáWÏB)H~/â¿÷ÊɼF…Þ³ºj¹…)®¥U›KNuÚ(K·ûó.ågþ+\7Ù~¤óL¯ªû‹¡•:½™Í5)eðOT·}lg ~·Kû‘[Á²w€Ür�ƒ)ðš^ƒI�è¹L²þ@@pû]{_ÏBqÉ"$xa©Êœ’]E rÚ¥ÛÙMª ßß@= ™hÔ0ô+n8 l5T�lʼ¹Gåvy�¬ÏíóP—Š  h@‰®¡$Dl,"½¯›U:¼�ƒ#_øò2‚؃Xª,Q˜åœaùéA¶Š‰dø#?Aq¦âˆqqy–á=Ò qцž÷Ë ´^`9U[/ë9Iqbb}ζ›‚™âŸÞý&òºC$kwT+­‡ßki::EF©ßÙúèÝqö0œuŽö ³Çåýˇj‡Š‡¯þmˆˆwðoÂ,ÅÃE_Í9H…oþ¬~ã‹¹é‹ ¸}ÍG#ÍW×¼�$�ËÉz\Ôõ¶o›ÎªÎ^ß‘Ê¸ŠŒ[©J½ÑSîNpÚ<.�%;¼.¯CIL9|Þ#d�èNç[Ñ·Ió¶¬]?Ÿ»UEz‚A6¨"h�„9Š&¶Ù›kvT×—jîæ<�‚‘Ÿ“±¹úˆ—tà�ú ¾OÀ×ü;MpLŒ’žs³B¼à�ì¬LGÏÞþçåÜI¶ÄG!­x9[Ì1äîæÕ7T#í7Ž6R>µH6š‹”<¦‘g¹ubYlÓ&ó*éÌè¾ÄæÇvg³|g˜Ïn‚Lã¡°ˆLjéK¬TÂ%F$->Ÿ/èóû÷>> •F"MÿþXË4¥Iвo° endstream endobj 113 0 obj <> stream xÚk`F†7†5 Õ endstream endobj 115 0 obj <> stream xÚ¥W{TWž’‰Ši—1];cgbÛí*V@Ô¶¶®X°â°"®õ-�� !�<X‘„G \A^òHÏL¥‚V¨PEk«H­­¶X[i×v[íÒ®mݽC/{vÚÓöœí{ÎÞ9çΜßÜ;÷w¾ß÷}w®óõÅ�dTŒ65N³$dqŒBiTÇ馢k¹yÜ#À�æhŒcœÜ‡›/äõEá~ÂS~¾“Ï¢®y"ÝHô† ¬LõC¿ƒR¿Gù§Ù³üŸ ôûý“ø`lö 6{Çþ% ü~YèùDm¼b}¢BcH6d…/ צeé’•*ƒ<$8xé“Sý yX |C\BŠÖ¤OI–ÇiååQ�òh­‰�&Ëh5òx…*N�$×&Éc/É�z…N/Wê´Æ4ýÂ@y¬*Y/7iu)rþ®S¨qzE¢Ü¨ITèä•B±uK¬|­Vc�G&'(4z…|ñb¹\¯PÈUCÚ³AA£2P«S%ñcôAê郦æ-^»):vqäú𢷼hÈ4È“´:y¢Â—¬Öþ´?¢µºÔ85Æ·yØcX¶ ÂB°¥Ø ì9,[�…aáØ:, ÛŒÅ`{±}X<–Œ¥`©˜Ëò�ò�ÄÈ)p}±Á A–`Ðg…�[¸HhöÕúÞÍ%ŠEÿ›Åcøcø—’�3D3¶Ì¸0ó±™u³üÑ¿¥VöP,uµÞúÈäô=?2ÚD4ršÏeç�[ð}^¶œ­£a8>z÷öÐ�ª=µ{©‘[7h\ÙÍ- -'”à s²ù´³—êS±„IÀÑî¢Ð§W‘Äê•_ê.¾Ý×{ÚEž]eÊW)÷…Ú�ôôÙ°ýûvÄwŸ†s᪚n;-]`iä‚ar¯¿g GŽBÇ(¡âP-ƒÄ⯑0v—..™†×q¢1f‘§"3ùUÞ="Jj~Uq™‚ø½q(cBKdë,qz%­6%¨·S[UÇÚ0‡Ü ¬�„ñ8±Ö ìÕõtwË)v€òÞÏA±Œôr;Ä †îpú6á„”Uƒr³¥ØšO£¥¹HòBõÚröÁ“ðÅS×î‚™;(ª¡jAi#-¸8,Å6K½c¥èüžˆcáÚˆBøkJ€ËP0\Ÿ¹ƒ>ŒtG«3àÖq oÂm…²K=‰šLczšËè­«>ì(§KKí{¶•ܘ¾iïnº°¨ØVHZVGåèûŸÌÔÃÍ›† žå1£s¤Ä!®æ!�È;<ÀpÿÀ…JÇÙŒ}Ç¢)$ùãB4_-„>£§]µÌZ¾Y (ÛHÇTúxÍv*aUðÏ×jz›º˜ŽÆÞŽAêÒ±=/W15€-‹”¢DKÜí.¸Íäï…y—ˆ‹Ü"8KVn-+ȳY­6úéôu†8*î |žqA/N 4Ù�ëÞÖ»h6/}=ˆæ~…pVÄÜLœ+C¹b¸¤â3§‡úg9šŸ\ÂH3Ú9Q ´¶øŸèÏ<[Ndöj.>+û6¼ïO§éÁöëýŸ�·Ÿ~+hÁŸÂ‚“«’=Étõ¡’âwwHˆ÷öl_Fο·þ[(¼së>¿—Eïݱ9…F’QÑu¨2¡m€yçÄ•k—·…ÓM“„,tÕ¶çhÂÿ©°Kc¾1<âeàì•¢¶ýêhR XH³œÞ$€§ßrñð9û·wGv^ÈÉ£ÑФR¤�õÁx’ÍF›4b{óMà¡<[3Úðð¢ªW˜/ðõ¬ Ša!7[$Eqn¸õÜ_ÜÐîöo8x†_–å1g5§ådÎl�j[bÊÁlº9UuDA-Y±*æXRU.C|eÎ9˜¥I$7ÓUXé݇v+·‘kïÆÀà¬oÎ~Кÿ榺í¥í`9�\YŒ¥*×å&ʪjiõk½ šúë•wn´çOédz{^ªÌle ±|µ¥Ðj1“ÙU9õNG�V!Yˆ?�Fk2S-ÔRp¯Ù N4´3¬Ë[妈aógà ±É™²Cw- x£ÂÞs¼�®mªïRcP–1Ò€�æ+«á‹�À„â:çäéº]¼Å ŒÄï�¡“îÑì*O¦–'lPg3Åð[11þkÅ»ñ=f°�Öàö¶!_vØÚߘú�ß¿zþÒ¥Ú—¢i”ó[¥è]¸yHP �a Ü,BG¶â¼ùÔ$|^÷ÿlþŽËa¯ÝrÛ&•±¸M4ÔþeÀžÆh:ðÏKs”Ìä^º¨®¿[;#ý0£±„…çá9Ö>rjoæÞùÚMäOÄÝ–•ƒJ³XŠéMVMZ µÛòÚÙ<ÆòAþ`agjÇÃæêôöØ: qà›æÃ7Èq$C�Ó茦Q|­Ô’ÄLzð¤"Kø�Vq‹';ök«€•P‚ƒ=¯˜µíÌQÈXK®é§öÑëNÎS¹íf�Š[&[¶k#zˆF¾°NÜ jÜetI¥4R„ÏÇp@‹xÊ×ñ¥¾Òëœ*õ÷Ã…7;osà?8BæMóì{J”Y@C¡˜`ù[¥õœãIÓþÞtn8‘oÂlÕÝ \‚�÷~q£ÂŠËè¼Â— ÒHM³¹¾±ñH;Oûªê â„uNAWÌêÂû�� íïÌ­¤•iåëk$©åaµo‘îþ¿BAy ÚNç•¥T5p8™ï§·Ó¼Lcn>ݪV—§Ph¶r}¬¨Ž«˜NíÑüþÜsæ#E­&‰óࣖܧ۹týÎã7Ò…Îb; Ël… ˆ2kƒæáYÀZå()q7ÐŽÃÀ^W/Ùu|4P÷Ï\¸9…OC’…‘&ÿïFŒMp^qÞ„ÊÞ0ÆâᚸÄp§�†]p>‹æó² TFqñbå¢à"‰ '®Š:ÄHø¾áìp×¥k´¼¸ E¬ÿÀÝcàn‘ÏE•2£¸è@^¬åeIn~ H¥P”¸½ùâå¶ ñ|ÊÏŸù†„xð žü’ˆË_:JÝmu�žL—6׊‹èw\Cý#Ô§gÖ=µãù˜� Úƒ2DzN€óÿ=œ¤W𣆅ÓžÞþ!‡£ù¿Ô3jÏšÕ+¬¯�¥á'?½E! À£€Ò»ŸNo9‘ó:ÕРأ Û\�Kpé c‚dë"‚'öN›W�M”¶ØuŒ½¸Nk" €­ ›F›&-h;× "V[«A ÙAÐJ¯ðn§åÝNìz~Î¥z�PÇÀC““¢l‡ÝZKÕ–”6f ž»UÙÚpêÃ’‡¥üªa&Á‰QXÁ;C,¼.³~¬¥ÇâÛvP›×hžIb´‘–(„‘‡Ãº×С=Wõg¨Ûƒg.°L÷ö¯/�¡5²u ÔÌ{�Ofd¦ŠJÙà„‚LÆü}—¼Þ¯“¾ÒðzÇ«Ôñ †å.æH XAJ§<r”ßü±{nêÃøg¸¹ð:¨­ªp‹é™¾±Z¿Ào;sd–«Äγª¼¬ÄÞ[çç×Ô^k/w”Úíeåe~³¹Cs&~/û€n  endstream endobj 117 0 obj <> stream xÚk``àP5ÜÐ’À¸ ”Á¨ endstream endobj 119 0 obj <> stream xÚ…V TWž�ÇDÑ24ƒ3Cı«ÕãW¬ –.tÁGk‚ˆ Á$@ñ�’Ü "¨D 7f´ÚÕÖ¶zÜÖGku»­v«GK[iÝ-ê?rÙsv"n_Û³{ÏÌ�™{ÿûßï~÷ûÿ¹B&#$ɰĤ?×èò'ÅEÅó2}M „PaR1C¬Dàü„0©$ÃóTÒ‹*Ù@ö†*Æ…ÊÖÊG„¤h˜¯>ø,ªžßüÃTc| �ªp‚ô#$„’J¨ ñ âé$s3�ú…™ú|‹ÁRûü}Ë{|?K¥g!í?˜ÓŠæ�ÈÉâ4¢ŽšZ’»,ÃýæW@t|÷€=å!Ä#é,©�#ÕoA¥ëm¶ÍÌëe/ÆÐ8 ÁÄçì!5ç¬ÈfµÚØÊÊMLÝ‘u­Í�»OÞÄdõ+8a>Vb‡~caR(k˜€Ï/ôò” ¡ÒÇÝpW Ex" ÃÉÌÀ4íÃ�Þ0­0M© Ã`5‹Cíj+$«ó¡T>pG\LO˜Váp�¥!Å*çñHp�%ïí\Ïz¡]§ˆß¶r“ .­€É­ñxè6``±è¸Ÿ³[ò¾; ” Ó…©�e{‹¥z¬dÂçj¯áþ-éh¹ŽÑ®Èz€åŸ‡~Pðø™Ⱦ‹ î:‡ÍZÍl(ݺ®H³êpÉA§gïq&`€xº£a„T æ±LdSÆ“Öì±HGëÆ"G6«Ù@/–‰î=÷‘—öÞGV�kµK൧oÁ˜À¿C8VöQ­p8˜O&�Ô{xÖ6¹–zÊÝ i‡Qí¶K:/ÃúËRa°êSkÝÅ�LÆCõ+»”‹ë^ª;¥ùðjiõ|“ƒÙd߉êáÞz‚¶Üжn`¶Wn)«¨T6³ª³é5x<ÂÁÏÁðÂŽ ¶¢Í]¾ƒîÞÚmÒifÅ¢¢ôĆ^#³¿Üf_÷(9Ô�ö3›ä9'ÞA�ôYx¶FŠ(¿eHò�RøO�è¼0ÔKõ þ0\ý¶.�\¸&?ï%t©…�#0†Çc EGÚ"—GFV*W‹ê¾�;a7-W¯÷šoƒÄ?ì`û)zR}ÑC&•¡.V�‘”'ü´ÿéäì×–Ìœ³½õ,C�€{$åúyo)9öRþ£×Ð ž±OWPsóŸ×žùTáüç>¡Afån‰*D“xn…œJÜŽÇÜ'Aþ»ºë<¨¸�É+Ýd^«¡†gµ™�0Ôe÷¡–γ¯½�x¢e#~Jø‹Yµíã§òï‡ùdkµ-‡Å×Õà; hU„xœ#føŽv¿ Ü\/$×ÂÊý»êŒ¿,Õ¨‚TÏðþ yÆUe¯ª²;ì;kꮫTÞoֿᨭ©rÔîP Î=> þ7gŠË× endstream endobj 121 0 obj <> stream xÚk``à`RfH�ñ`xàÂÀ`ª endstream endobj 123 0 obj <> stream xÚ�Y X×Úž’AETÆØ:£3±µÖ÷­Õªh­ZwÀº ¬a {Â"a $9IØ÷5d±îûV•Vm{¯Újk/]î­KkKÏÄýÏ? Jýo½ý—$Oà™sr¾ïýÎwÞï{g˜½=&œ×oØæ>{ÖŒ­²@¥Ü'Úzu57ŽiŽÆ8FÀIí¸ Bî5{4ÉQØéhßïŠ�iŸ"Ñx dŽà¿íˆQp|�ÿO*tœh½0Ìñ ÌÁ`ð‘Ø«ØxìöO�Xàø»¡þ¾²µþ²pE°"aŽË¬YóVFD&D)¤sfÍš;Ýú½Xêê"]çã,õ ÷—®s‘np‘nŒˆã¯K'G„K}eA>òiD€Ô]¶]ªŒ‘EÇH£#”‘1S\¤îAÁ1Ò¸ˆèP)ÿ7Z&—ùÄÈü¥ÊpY´T$“¾çáæ.]®�®ö“…ÇȤ3fH¥12™4H¡ˆ|kæL…2Ð%":pf?'f¦|`RÌLëïf¬Þ´Ñ}Æúµ+ßÝèö®‹"^! ˆˆ–úË>Áò—?„vðÂÆˆè09Æ¿(lö:6›‚MŦaÓ±˜ 6›�ÍÁæa °…Ø"l1öö6ö¶ [Ž­À\±ÕØ{Ølö>¶Û€mƶ`[17ÌóÀ¶aÛ±]˜æ�ù`¾X„c!X(&ǰp,‹Ä¢1¦Äb±½X"–$øEð« Oð›�ß$þµ[iÝ.{,N€ ´‚FÁ»EvvW„"a”�³³ÿTD‰ DOÅgñ±ø~‡â!³‡°CN >4`˜ý0ßaeŽ.Ž·‡o~Íi¼S²Ó…‹Gœ9fdØH0ò·QíΤó'DqhôäÑ ’a’4ÉÓ1»ÆÈÇ|ùʺW~}µcì±É$Ê�ú~œß¸»ã'Œ€-N–4ÀÂ,·;N`ñÃ&à›’òZT ’[D¢’Lm^"•¨Q'e2ȯÿ ÛýöyèÆÊñŸ�׈X|G´¹Þ¨/Ô˜#ðâÓh†HŸePg‘an ’–ãÆ¶à …Fà RŠ¡=¼-râ4*Ó^–{ÌäÜ| ú]ÿÌL$sq½’sÑnø–hµ*$ëp =ñnÐØNwøï(ßE-^í¹6¬zo}ceu}qfËn=ÓÚp¼¨™:~Þ€o×¼«Yæ°<8ú/’P½õ úJϑΣU4áê—Ýàs”ª¹\ú%ƒÞ>)!ôÓWïÙéÛzâl÷=¸8—vâN«L—»áE èvîëY{îG¹J(—@bÊ#$^êí™�HÃ8š¨Éñù;™þÌxÛG"EY÷ŽÏ)8ì—‡PÂ,ÒK´›Â÷ÐòXYˆEì ¬k�a’j€±’„¾xЕÓç:Îæ×Q‡Û¢duL½¯q«/éYdì|:½S‡v a>2J:§>�þ �ÿ×>ü…Ñaüè\~ôé>4ÞïÁ¿¦OõÃ�,JÖ2ƒœ{ÂEîZfÀ$I!ÈKVuªŽF¯§K#µm?OÂSðƒ—¡ wšTÍ$€¦”*Ʀâ O••RÒé+DmÛOL£Ð&4ÍEÞÈ.@³áF¸ð!d ãÄmV™aË÷ífÁ�{ðƒï…Ü\8LR˜ 4iÚ,µ–v _—@m›{· ïvŸ.¸¢ le|5ê°d2ª2®±¾ºbÿ'Ë:ÞA£f" �D£M†�l†Ž…4ôÁˆ>Áý>!tçœ$M1uáá11ááu1MMuuM4ºmÿ‡kÖ-�…}¸Ö$„^zÉÕ˜.¿ „Ȩ¨ŠÈ¶²ÒÜÂ"Ú°$b£—§ƒZ­Óe‘9Y9Åwî@œv²äÖ"`�¾ü1L~,´|{%p+¢àl´Œî·“׉oT�L¨U½CÇÈ9;1\i8nfÞƒ„ñ›wÒ‘q[·L¢&‰=µy- wo1䥋?º®\u’9´¹`þRÒ–i*ö Ïò¹ÆÊ»�ùøUõ2®n ‹¿›žwœá~Á‰òÒ Éñ¶pïz }m ’ âád(¾zø@³™Y‹Ë¡Ä>hU{i¢cWØ¥7µ'°þ` Õ¥9ßE¶.5¦Ùšƒ-g¨Öî}{X¦h/Ð&�N–¥ü™¿ÄÞgáB÷¸^¸Ó §™�f¡E ‹$Ñbä­pEË)4v ¬þPº€1ÃÊhñ|•|*=fˆm¡D g4¸#¦œ1‹# RÔi0`5ƒû\<�4a5ÐÕ$h¼ÓzžeMº!3M«N×ÒƒfƒTj‡ßþvv ô´‘°Yl2‚šGÐ(ä0s"ÿMþ:âÐé0V1káX JÃ)¹_™PO åÏ8YªàØNèÒ)8g™!´ÈàcIuDGYx„uæä×{§7Ú _7íÜoÜ.‰ ç‘?âzcëmÐAu}4m ‚[§ƒ’Vêîã?>�àÂÔ�iô|˜+&¦ ÄÐQ §šÝ]Î8Á‹€åD,œ÷U¾Ií{¾ÿF-–’ö€–mï.Ø6�Føùt ߣkx‚…b£¨ó(Ðt2l,¾B[ÔÆÀ¿@1‹†@üoÇŽ}h,etJVBr4©(�kh*«®ã)O£l„v§Ýƒ;Lð•{ï>ŒhŒ5ãœO<Ší]ðJz‰Ñ#9¸[‡-~Œ°]Þ‰A�4ü'jÔÕ-Íqã»’\MNC Á€djè´¸�qk(ÂóÛ�Wãɤ³ ‰ƒ“SAz"ƒŽã ½4Ï`ÌͦˋÚÏ|I�2ïNÈgÊ þ;È °)Ƈö� ˆÚM¹n=}q/C,_®3uETK…¹®n¯9$)(c7CÔ¼:ÿúT¾Œ8üü#$¬8øm"YN'€§o ¹P¸X¾Éí«AnbšÆJgèR°H«æY7i+»N�nªû4Ðt í|+A1ÔpCDN–z% “Xî ­.èZb`¦„Å‘“Fä·y3þ­QÀ¼�#{D¤E¬C;[m»£åÒoßÍFoVÓ¯͡g&Sh#Z€æ ä硹pëg_Ô_<À(K:ýЍ�_Æ@W¼#;çš&ò­…[/®-¯… 6¥ÖÎý àߣ…*Wq ÜdIEJ³œ—Úׇ&�ªÅÇǨ¤\V¯~ÇË$3Ç2ÉûB‚Hy‰Œ�£7í õö#W>r‡Npè/'o·&�ÜÞH7nÛ6RÑÞ@ŸÁ„fDzÍd6¨­¨¦#:º4UÔׯßjOl�®e´µåTRÄ+*�Œ:Z••©J!÷–¤”VåÕÒhÂ$‘ºÐ}ÑtJº"Â�š×6è›ËÌ qUUœ_ÛØI}ÞT0Ю˜ÄcÕŽ)“VŸ<}ä`û‡Fú¢ø>´ó™�–ä# §S|ø½Ç°1ø;Ö�âêð6CÑ-ºŽk‚V%[ŒAŒ¼·�E”ŒNÁä?�ò;�‹�­ŸóÝÉÁ¿M+óÜ,ƒ§PÙK§ðüÍαϸÚ]‡²ëÄg\3OÞDƒý:ºá÷+o£+’Bª·P ½6&2:ø“˜xðbëP1xxEFhom¤Ö¨Àa®Ç¹yîê•"�­4JzaŽÈ Þ‡›.Š`¥6ÁM’ ¨r ßüóYå×+„÷ǰQøͳ‹îÐõVøKxøþKlðëñ;Ægð5ª%t”Û[Ç6¾ðZ‰GÞ }Î_ÿöVa†€G¶6+§ƒá„8qI­®¨ù²dtÏÎ(jmÕê0Ä«îÜO’E}X0/"k£ö¨n4óÉk`´(kÐúzþÒÓÑCÜãòù¥”à´ŒA|O¤3dæÉì›— óé+'» 5zׄ'ƒ*pƒAŸÄÈñ*]¡*™ŒKJIÏ Ñä$â8Ñúò¸ ŒÐn0®Oð«gE·&t»%�ñ{³â­ã˜QÔÔ¤Ó6ñÉ&â“-.Ž›óŒèa›™¸ÆÝ±ÕÁ7TI|ÍYE-³Êú~ü(ýÝŠ‰ÉšÀYÀ—ò_ú,·ˆÏþ½K¨Û‚Êo‘5[„=D;´¢¶ùÄý '®¿Üw!¿ßO§<ÛZi#,k„©_ Ÿ _rÐRqÐ%d0(¢ÿ ã΋L<é)(´t°6iðHà9Ѻî#b�ÉDp´�áÚô8TÿÓN”œ““VHó‹²ù*e.Ò÷ß&û'|1ëøhÚùH}nÛG•éYæóŸÑãˆã–3’þ²½Ì7I+ŠöP®žÞ"˜_qâK4á÷æ¦æ?âøË�Âÿî¸Xdàd4r‹yú°H­ì=Dƒ†yãO€g$Ó¿ G}\¹¨8M§�§Ð;ò&qYµNWÆÔjôºx²¿ê?®ÏÉÔë²ÕÜôþ¯¦èuyT)È«b¸ãx8ú„ ‰âD4ýg† ËõÿeXšþ#ä*e½e‘ÙZ¯¼žX;Ÿï%ÐMã;÷uè=4ÍC¾|�qA³àj¸Nƒsázb©U¢ñ gNCäß`),†“>¹÷ |}*°Ö•™›ekÖöß³VÖ ýfŽFMEþ\H~™‡Àá?=ä ñ¢|I ðPzÑ{”^á;(o¯š#‘Lô‡àrÙÎÔ}Hi8ZÓI}xHé]ÏÔ{ƒ-2ÒV»¹vö*_º#?r ǰ¡ølMQ;Ã]Àë€AA¿¿a.¥äxõEPŠéç9Y“2›µòÖ7 “êüÆÆ[¶fö`=¼Â:·>÷�O Ûâ7‹=§–<œü74žF}ìà_Îüip)!öåcfâOÀ‹“¹4‚hX;ÐëöŠá\0a§µ m,œnâÆ²Ifç¾ë°ü1ò™`œúÙ/õñRÆÑ=øsÚ¿™§öbúƒ7ÌÞE¿oë¼OÌéöøë Žƒ†¿»p…Ÿ¬º+’æÕ£¾š„181údÓñ¦“Ôg—ç"ïÃX”ût_œàÑ!ü eHŒÀ°·‚F£ s(Üg�Ðõ t…#à(º¤Œd^–Q�:û=Dl¦·#»$\H.-BÃÏ"�F\º¿®�ÊÍ6æ½°0LäWî†FÉmîE4±iþµTJ�•¥ÖmUópòy^ ÊH´,€¯ü#‘3�œ´R��•[øí'�¸HŸ„vÅPøivªîôE_$žEtªMT–_ruh›ä9[žWâ²Y¢Ædß+oSÈᵩh õ`t¸Ñu¨ÉÄ ÷^ˆ,ßë}! MˆPÆÐIÉ¡‘ž”ëÆ^^3 »qïó/ºçmãF¡4ñ)sÚO ¤ x2Ú‰¨²DþM’ Šx᜖¡£W©ƒ¢©�é'Hb’¿H¸º³Å½j샺ۗo“?"ñWèM}üBZ჉ÕvÓJ™7mýÿóÄÊ…8^Þ ‚[™ƒ�@¾†\üºd4q2°ë¬z?u»ân#ƒ”Ü\É꘷Ðd a±¸›Œ´¡° TSßBû,ô¿3ãž3K_Oß}BÊaÜ(I³¼ÉÛ5p�w í¬<¼ŒGþ(\pbò£îÞ¿æ€Î@ktq)QdDÍ>S¥¹¸ÙÊa|ü. —±—YøV£àÜÕ�¯ÂõW…\Ü(y¼öîÂj�fEÊüÏ\ oœ¹|¾mB‹öäÒj=PQ% §Š�»mMo†N—’Am5…ùvÍ¡ø´›;aÑi×Û‘LQÖÉ”{2ög48ÔD†„�«v¬\¾,çø6zËÍU]›C¡.h¨d�‘À O|/È(ÊÓŠòh`Ìn9M³W{)8䋇Ў­2ª¸ UÎ-Ç ï1Å1b쇣%§Ãö§Ó!Íþù>ùnEkJ.�­õ]÷¡]Îl¹�Ö§ñ:ÅæñO6‡3µ %™Öd¥¦eie¾`…œdkÜ‚Ê#”LsT£úÓ$â3SÖÝÄ•äö ¿¥ ÏO—htÙ©Ï<}ÕæiŽ^_UE ÀPYåàóáa] ñ#ÊXûù�#vŽ{EÈm²„KŠÒ TIY©©ýý_®¢Ìd� HUAZQiva¡‘†ê*Êá�¼zà³`c,ÜÆ ÚÌ0¿æ›G�³¬à¶Kâ­²Šã‘RdÃù¥e-pUY´…LMP)H>SƒAÒk´ŸUý ŽPGžØD�þ(=`m,ªAie6m(jUœV‚æ—Z�—îoÇÁt®�sþå:/…I3ñ~ GJÎG»ã+ÂdkÀw4dáë,zÝZ¨æE‹u‹Ã¤S²”8Á~�šÄhÄ)m7o^�Ÿ7¡œX ‡þô‘Y]¾ü{4Îí†Ë$w×ß~½†¾ÛpáÆòîÜsÓ&-Û´,ÄßÄV›šNxòŠý8ÛSÒFu�UÎNÑn‰òbÂvk¢uºôm•®ËÐ¥’ªlü¨‰ž�Ëy`ˆ®X¿%õÿL‹Âù ºXËVPeÙ%´„Û jå~º( ‰­(Oéj¢dºF­UÓèýþXäÆDêR� ȦóÀLób p5ÖÙת€¬”�ûúŸŠâór4%T…!§4‡�1Ü×¥í MŸèÇò¥0–›ÉÛã’„\7ÑjO®SPó¬ ´ëŠñdš6+KE¿�ò‘=l©K¬Öê;@%o 4¢H?½!ŒW²ÕòNDP””kÈ,¡J² ùnùx» ¶âPoÍÀ[°e¬ Ò²Bhq°§ ×ñ"Üj¯MgJ'Õ@›™LÏB“ysYÅ:CÙЪys¯kDaáÖÚ˵ɅLŽº(,/~>Ê|u:¬eò<ûù\Þ5Ûš'Š5¡Å tF¿‰’rŒé¼[†\>?Á¶ŸQ»H•m»d´y:~Yy‚-iµÅ°¶»€u.æô„†+á7�Øì‘`hR0ˆ„+öN¥NÎR3h1ªAká1Qï\YcÎ>lË!WàO¡1üÜJü“|UT9Ð?Dèü¥õ[�¿£)ì` =àÇ¢Ëí³›)k¯âcªü ˜8/Ö¹ê+âðó‹Õ•ï�&SuÚÌzÒñÝ$Ê*Ôfg“õí êßòëXâ³yj¿ z³È]±ú}Џ•©•ñ ›�o*'ëãËqÊä°=Ý�'®t�?_GÃUÜ2Ñ•ú“úrÞ�/ôuŽI�=€óåÀÁ2BÒtÀm³—,+“nwˉ¤¦#‡Æ ñ¿�(4BáïÍè-> ~sgÑPè€÷;zø¥7QJ“$Q—AªõÑ i´&¤¥�GÁP„?¸Û}íxc< ŸËIH|ßbôõÀ@ëg´“åð Dâþš×ÒE:­$Q¼M‘øÑýÎ�ö·¥*ªi_­:"‘ ©O®ª­-ßѽ{ÅÜ­~ûèV…Oõj² þG¤�26?’—ìË Úu9:l¡$þÚ´˜8RYœX™Ió}h�êñ7ëZ3#Õ$zÛ¬m|ƒßâ¬íÿsTÈ9M”¨Óêù4¢ÿÏÀ¹ a< úôR§�89G÷A�8Á§&¸Üd}¬â&©ßÛ—”ªVÓ¼:´¥ÙdsÞ§W>¢‹ÄBfv¦jÑ24tSÝžC­• õ4Ü6æÿþ#«í¯ûpý€e_î¾äRÌaïçOfªK ssi½Á À�”E†f¬\¿�N±ië#š¢{…C­–ÿï?âõÆ êÿ/dëó+­ÿ{ïd}Ð?’£'�Ç0l¾õÑý+ÎJ·²†åšÄôP{÷Ç!Àq;ôú0“Þ`]0Ï`0^vt4ws ¹F£1'7ÛqøaË6J endstream endobj 125 0 obj <> stream xÚk``�øŸýùñžý_gÂ@�äV  endstream endobj 127 0 obj <> stream xÚ}W Xמ’AET†¸dtfÜpâöÚÚ熊ˆ .¨Q  EMØ]@ ¹!"›Èލ,²VG´j­J­>«~V«µ­Új­>ùº¼3xyß{Ôjë÷uæË�É]ΜóŸÿœs¯„pt$$I¯€yA†uý8•‡·am„½ËO( BÎŒÀ+8a°TpsÄîÎÒ ÎŽ�IøÄ@¹ß@Çu²A!‰ëeo?î=œ‡ˆo=kœ‡Ù;꜇¤!!œˆž„‚P? !^}dF„!L;'B«�‰ŠIï©RMœiXŸhŒZ£‹áÆ«TÆÚÛ8oOÎ_mˆ7EGq}çïÉÍóä ñbo7Ò ç´:ÍÚHÎÉ-Ò†p±&­ÑÄ­1b×›Fyr‹tQ&.Þ`ŒæÄ§Q»V«1i#¸X}„ÖÈÅè´œßâàEœ¯AÃD…kõ&-çáÁq&­–ÓÅĬŸì廯Ó`\ã)Î1y­}9Éäe_çá;?p‘GÀœ™>�Á>ž1 1\¤ÁÈEhc4QkMžÆô�„x $†£‰±„1ž˜Fx>„/áGÌ&æÄ—Êî7AZ yõY×zpƒ,Ñsþ³¾<9o;j`…ßHªû¤ÊÔd[6Š`ñR²aÙÒ]ÑØ}È<÷4F^;Æk|ïU>±‹éÞ¿ c?jK½ö½ò’í»�ÿÅ\lºR~ž¾tÕ0§‘­Ÿ»sªŸÒE¸žÖ(P]Y ²ÁM*4€^J¯vü~_5À½Œ€áŸ÷Û¡ƒÝò&0…)ÄýcèTA sô@sq+ÝܼQWÂG¡E+ÄúQ)‚“Ó­]4õv+´B²F~‡'3�“^SVþ×ÀÍXpºÝXìÑwšŠÇˆZ�–Ãh4m¦·Á8!îÅÆx O¥‚+NVd™³£¯ô¿¨7§ _'?z „e§`8€”Ù·ÏjÍRæoµ¥&i"“Å:ˆ½bpÀ`%îS�ø÷L^þqö:'Ï–ÿ¶ð´§Røl èó8¨ï1@ÎQ]I S·šSÒQFÁF\±[ öÁã”xY‡°”Ù´ÉbIW¦ä™s š�2bó*…€ßE¨õ¯ #&.Á…) ŽŠÓ‹«–ú„/ ˆa@FR7ðäwè"«¿„Ìu,?f’_–ƒËs%$é•aG⫪Ž7Ú«^ ¡-Ù"¹ô®Š°\ƒÕ �N¾«:Ààá‡eá¹Á5•-Ûžßi�ÂKÓN”QL—¡¬RævÕæT‹ek ³jµìøBÿÜ4;sÌÿê•űlëòší 1=76%qNû6•oX©\±Áwè4<¶F¥2…”K›PZ ‹ýÉ´­0733;‡9~\¶üòã´&>hY»îò´#Ñu}ĵþ$_£„ À)Zâku™ˆªè]Sö8EfûçóʶÇèÀÍzý¢,f“ÕšþJÏ;]jîÈ@ Ìž º]áô:ì‰p¿ð¢õEIl£®>íÖf§º´›[(§{¡ØÁn´$3{ÓÓÑæWºIºtËÎDûŠÊ\Q ‹>þ *¢ƒ'w1ó6‰©ó6/iæÅª4RÅÜ›!ø*â MößIò8œ&ãå ËÍ» Ãè[�·±‡ÈÞ3 Eçéóbk>#ò×C¸ý Có>Äò<;—ÄmÁÿxŽwýäjºóÔSÁz+N«CH¿h“a!ºTÊ@¸ó؂դeÄò‘#ÍNkD|ƒ+åÜýØk_;w£k[sÚÏJ^'©=×¼ÚÏ$žû†2Áä!K¼§šËÏ0ðÓŸF6“ÜÝØW\G·�3SH±üÄ ÃyI…pJ*Ü‹i6è·i•½°¨2§"”‘¾•ÅN؆)¨��á帷ËÅáK$Ììt–wïA{è‚<[q “A�íݵ3û-ŠÆê:á3^R$¨�üC¾iÝkùˆGÉÊôdLb‹(¼ô/ÂçwŽY![í7‹Þœaµ¥²¹;K÷Ö*«MeQ}BDváÖgmç*ˆVÊöfÛ쟵ŸÊz ´³»x´"þa?f�qMÉäªâ¼|9ÓÝq‘Á¹rîÁwy�j›ÍjÍÜiÍή¹àìÌïjÞ³+ß–³33ßæÜóÿ ß~# endstream endobj 129 0 obj <> stream xÚk``àPÐT`TŸs�áÁ‘&¢² endstream endobj 131 0 obj <> stream xÚ•X |Sź?i›“j•š£s‚"(›Š€ì«(A�6mÓ¤mš¤Iš¥kºÓ“t¡´¥¡M÷}ß lîŠ^„‡ DyØ êÅ+WE}âîÔwßœÚ>½÷ý~/ÍÒ™3gf¾ïûÿ¿ùG@øø�à¡-[·jÔš-†ùÁs^Ô¨"ù¾ Ü£Üc6À‚cœÔ‹›æÍMö±û гþÞCþ>ï¡�îêþQ/|Œ Iòß·&Á‰þ�ãÿ¦øOç;¾ò’yÂ� ¦4q‹¸+ð¾¿ÌªHM¸|c¤\mˆ6XÌ ^´Z£µè¢JƒtApð þ{©ôŹÒM²ˆX�I-•©#¥›æJ·Î•nÓ˜po´t¦F- —+eª(©&J"ß-MÐËuz©B§IÐêgÍ•†(£õR“F+Å¿:¹J.ÓË#¥ êH¹NjPÊ¥ëwî‘®Ó¨ Ò-Ñrµ^.�3G*ÕËåR¥Á ]6ož!A1W£SÌ‹ÂcôóT#ƒôóøûæ¬{i[Èœ-W¯Ý¶cí\ƒÙ �Ò褑rƒ,Z¥Ÿû·Ž5 ü¢‰G‰Ç‰'ˆ'‰ÄSÄLb1›xš"æóˆùÄââYbñ±œXA¬$^$Öëˆ Ä&b3±…ØJl'^&^!v!ÄNb±›%ÂN(‰h"ŽPBKè£7ö=~-"ñQð!LÄO•àªá•èuÇ{¾·ÊûªO°�Ò§Z8UèþD†‘ï‹vúÎöMðýÍï?³ß?'˜pvâÖ‰wüþ7Xó@æ— øï×?õУåMš=é�À‡õ�_S$µ—œ¼tòq¸*Àæºá⦚\n�¸"ëpÊAP�m±'ÓÈ�³ �¦'ç+é˜DV–Î ¿á|aŠ™ÍËfR³2Ó’$ÊÖ¼jð#YÛdïî°*íLÕ !œAV-*YKnŒDÑÄÖâëÕ­ù] Ú÷Š‘ù.,d»Ö¹àIWà©!JË9{ÅÝj»E�RP�  LôéÎhÆþ'¬ˆ®·4Uv”³[{AÅù“ºí­ÊEwI(ëš�×ÿÚu¦¸ù VjŽçõÐõùÝx�Ûb³Í“ ¨¢¤h™-“‰jéüÏV8¥ˆÁ¶B™ nt~uF m¢Žsf¸BüqÄGkÀ;�]§ß“¸¶]G$@Z21ŽUDµ°UŒsXf!Íj6JÑÊV20‹¤ PôÑÍkÌtØ!ŽRo_æÁ��$©Ï?«‰cjP»8T±ëy€|¡ bWû|Þ´!œÁFÃ7\·\�¥nÛÐR7L¢"¹T¨ÃIÁ?HÃ"Rô1.ugŽkH*xtÁîádRo×êlÛ!Gµ�‰ííËl¡¡×�‡“™¥SnÞ¶i�ê‹ApIôÎÛ'ß¿ðöúç@ÀKÆ»“j¯{Ã÷µâ»sD¶?<œ�H¿Ï¥Ø#ìý°Ì›ø·Æ»'ÉÅ„‰»âò­=TÀ¶´H`°¨á@ß¾VÐÝàh¯—ÀWDoÙ´¶Ó‡‹[{4vãD%.d­ªl©q) %z/k¤3ã³â-y‡™zövn~¨/zF¤²¿þŽ ޾›uŠ®i¶÷0Z~€Q�Ÿì3 óŽûÂgD­ì‰�m qï–B%mÂΈ­ËÁÞ̳ÇÅIP°(²\Õm{cØÐ\ Z%Ò²jôpàׯA«þz÷�gìp…°ÍVÞêŽÎöZÏÆù¥ïzãuÕCÞ\R¨¸Gk74í®7œF:›íÝ|›AkIy¦5Šù}©HQœÖàZϵÑ{ CÞðLŒøîR>^‘·h0Zš0Zà´ß½Ñ´qíµdï¡2l±ÕÅ™\‚^7ìr{s‰p¥¸OmKµjmÊ`~öª9ýÌó?ÁiPzí'÷{o„­<̘ ,]ô€½¾ž�´¨ŠmQ˜3Ò2²AÞ[^f¢oCL¨s�¦ !’ Mh3Ä¿p œðÕÍo=`{ÛxÑ ŸvÇþLýÄECRÜ©´g™Óòô -Ç$ÛL/ßpîúñÆ;pCù¾É #ìµÉMts}UCýôÙ´‚}hÕ6ôØôÀ­é�‚OtþR lð1¸Üó†×9/ñ@L‹R¦UFGt¨»Ž6uvô¦Ï@L3î‹ëãïãïYà mŸ“õï ÕÅ(eíÚî‚|›½$í‹JKÏõM;`ÌÒKÌU¦êŽ;ï@!Ƀ×L˜u˜l[¸Sâ�ŸÍ·,]¾w>›/2«óŠ<ûMÔ<æXI:[ñZqv  û YÙrŸ–>½äÙ·ŠZ@Ja¹¦�®krvð¼‚R¬qv»áónÖå¦8.æð©Ì‚“0iQç)£š1ÛÉYi2Ù^zź_ €Ó/ÿp™¡|ÚßO˜y„1§´�r�:ɳ͘™�sZcŒ¼<‚Fþ�#mD[î GàÄS½55uŒ%ÿPjM­ñçJÊ«¡¦oé¯À9—z¯À W›>�*ºq½öSj2Á⦈L]Û­ûXÕë ÌSF?ýâŠEáGb�˜˜ô¤Ì�DUj(IÔß­ë^·m´Jýºtʯçnôšßzµ§ÊjçÓëH‹1Ç™Ìd”±U6I�ý`~1Èt´§öÐß¹®ÜlÎlJndŽ; Êò}ãKê³Êèê&G'ƒB!Þ±P‡‰½ò£§Þìë;yªW¶�¹ƒ~‡¯QÌÔë¼5݇š[œŒ£¶Äö =ô›mð™‘c±Fˆ…gÄGÒËÓJú† Ë’ج´Ù�¢M8’~8“�uè„?´Ìäô‰¶.¥ª¬ÀVVàeøº°¬øHi­„…‡Ósïs+Ü߸©K\i�˜ÇPB5ù_»—†„Ìz—ˆ¨™÷®ñ@±‚¡zº‡eÊqípI�©ä!£ÆQÂ¥äÍ ]'N–év'ò€¸�?¹g‘­|‡•×G,ˆ°§t–L‰`ÃÃûYÏ’Ž~û3Ü÷¡0†Cr‘›úˆÛ�·ˆ! æÀó#YŒYŒ,³?£>¬mÆèÒï�0C#À•ŠÛt ±±:�*¶A×ÞÞÐÐÎó‚“¹7.ÂÙ½¹ìq§¡PÐØ Ÿ€„½5…�Ý*{"ó ÏŠ¨øÊÌ#yXØ D!´”‹œ÷-�=Â^¢8†e)c­ïÉÑ1©p"ùÅ/pÒ “XK–F—G¶7båm—àÎEX‰7R|ÏD-‰Ü}îÛ<»1‘4›4k±}ÍØ¾J'œ…ðêHFÛŒ)†—æ)Ö?,‹k�OÈO>þ=,T±IÙ* O|E£áý�¥€7s hâýôŽæŽS_‡eh¸öÏ ÷gø�K0r°GÜa*ŠœLÔ^]ÔÁËK&„ ÍNV§3Ï ªù°KØ”¦µ'Ñ!ž½ÆTç´3Ã2Q¬)'Æ“�®y&ÅS¨.Hô5r ­‡™úHeIe s– ‡ƒþ8úž7׺ß½tûâíK“¥NsUx#æ"€fQMô›«‘[cÔ %Q{DE«µéC}Q›e¶[h•L1U9XÂö‰f<7�Ù/I'¯®“Š |ND�¾Ö9Ø[U’´ �ÈÈšsb%8 •|@ùa‰#îu öTdº?¨b\ÔyWýõ" îÊá.Žø{ú¥xƒ*†ƒI´”Û!ìNM,Œ£7Ž´rX–8Öúe,ºI\0 —ïF:œl ÝU^8ÈpÉ•¢ÿí™QÆ÷ý‰ñ;"xÆSXŒ(šç;><üþ¤õý‰ïMÿ¾�(¯·Ý°ã++MxÌЄ¶¡m†x4ˆŽÕÅÃmpk}#<–”ˆ_²­³¾ v§ë-Ëèç ÎV&í”íË·%ïÙþR2>r´”^¡/tdí)gï·­Þ.‘Z‚wܰ€G//è© ±(ÍDšüýÓÐzÿ=¤À’bñâWÖ®_ÿÊÅ×?üðÜù3/=ë9"ï¸àD,ÖÓðý/÷ŒÒe\.Y•×¢4d¦¤dƒèå{­‰y¾fV�«*UM¶ÓÙ]ÔÒ†§.� æÝ“¨xÂ%.¨s °xÁ:•3rËÅß­üù¤þwÊN;s�p .fà„+7oáêⵈ­ AÔÝ"¿îß²n*¤]ð¸'œC¯EÁYCÔÃã*™ð]  ¦×±e >�jO +ª­{˜UŽ£î<²Ò“$?àãˆ�°šŒéíÍúCe(Š/n˜ñÅÍvãÝrì¯åظ­ûÅά"“§‹k¡�úMr«>'œåÅENIiNCŒɰH.AŽ/èÚV½ýyH=ÝQÔPÊÜŸ§ ‹yŸpÂþo”o€+»^xWO«²té–òŒƒ¹ødâš»U¤@� ñ"�˜–™m‘¤ëÚZp}7–ŒÊ[^_ÿ õ{Ou^ç ¿ÅC[Ü+ÜX{ÔWV®úqŸÆ–šª¶½f=�š¨o“íèɳ¶CõLz½¥*å°/õ3ña¯óLŸäë®#\�KÅ<#G[ÐwŒ’Ô÷DÜy�¬l¶éZ˜*‹Í(—P¿X7ÚâªbA¬³5±›>ßøI?ƒ–ÃïÄ¡²W—€-pçY’ºA\ØêÁQ¾KÎÇÎtÃE?à §p~âÚ´ ÷¾œüê«À!¢¤ž-%©•¼Èb¨>/€K¨o͸C x [Oñeòäo} ‰@­Ñ×YëœmS´Ñw¸ ¯KðÆÕËWW®zsjø‚øœâXj9ï×/w.w>,/S¶•œ8~ìܯ•‹ÔE ¾°<«ž×mX�‰=5’>3%>´Dì)“ÑH¸bÙ¢õ'Ö©g �Vؘó¹åyÉÞˆ]«ua…µ ÖœÛËVøV³lM$nÓ$™íêîÚ’ÃÍ% ¾ÿý”34œpù¯7=‚ü Kã üÄs]Ôv.NßASëbŠÀ §0þ ¶¬NBIëÚê¿ÔÊ˽¡€1Ù L=#{»€]U•׬LÈÌÈÌ•²›…¦>G++æüjú.…Ìr¥í—D+µKÃv—^2€ÚìœÃ*š¯4˜9ž-•VÚ:Ê�êäé¼&.nÿêôý<^ qî80NÉO"åé‘ÌѨ„ä°,L4–åã$='ƒÂñº=›g¸>å† &Ù«pª¸ÆV/‹dõ&°“Ý“a¤7ØNÔ00‰F'AAŸ’µ#呬~AäÉà<(¯¢DræEùgŸ ÿö^MׇAuûÜø˜LæJ=]PðÚ*+Šqi£í#©ÓËVYÕëÙæf+D£ŠðÞ Ñ�rÈ™—â?ëé-©íÔ>}q5[Å×xž h!/ö�ßÿ!öÊ�Ü®´Š¸Kü6,à)ϳŸXgN'ËL^>�[.ì´;‹Ú%ž²ó)O�®Éía 5œ'”•9ÙvºµÆ>PŠ;8V؃åPiäøò�å¿§gȱB¤‚ B]AX…TŒÅ_Íåõ$ôBׄòò:[]Óhï9Ì@/xMXOiT]˜ž+\�T0WÌ=!îÒäqÍI&hñ �lÓKÊkv /˜³K£è4£->•‘#q´ {=ìºãó1Ü}H£&O]�Û†ÏÙС¶°0ñ8}¬èÐù ¦áÛ^ô¤Ðä¨fôÑBgc!ó¼"l«æ­Cºó!à^vܦzþ�•‹‘c&tËÿµ• $”¢;¹VãZkÂ#r“Ê`¦í…¥G$”¶ÅX£V™�êýÝaoÝ> )+p·yÔž'áí?ã1‚ –ñO±´–qKÊà’²Â2Lð ÑøûÙü'º&¸'ž¬+´ó¯¢ªÂƒþþóíöbܪ.±—ø?ÀÕNþMü?¡Ûì÷ endstream endobj 133 0 obj <> stream xÚk``�0ÿ›lºlÏ¿ÆÇ.Í� endstream endobj 135 0 obj <> stream xÚ]R[HaþÇ]#uZóF´êøg&^ÚÙÕzè)+ºa®Ô“°ëþ»;í:³ÌÌzKeM©Ýu×¼­hâà%IÔÀK��—§¡§À‡¨§"èMfl¥š!ð¡ïÀ9ç;œÃ��j5À0,¥ºæ>Ód¡K :#oqS�ʰFÊ’²8!@ÊÁ$'�SI¹jâK•Êú�‹åãª×¸ú¨!¶šÿè×a|6سd%�¦üÄså&nÏSx¿NÆ $‚dpd� †©±ÄãwwlŒmˆæ)¾­”4.—3ž6–r8yXj0\º¨ä«°Œ„U–FÓ¹(h¡m°Š„5$41-ò”‚ ­ÈiqÛ!c‡fôz9ÄrÐÁ2^WHB³“â` ú \YäFÙ —¶!òNïÖ×™a%Có°šjD4‡ N!‡tò¼çš^Ï{$Ã:ôvy‡Ó»ÿ-qzåNWyÏdÖUË+Lu$ßÊC;ÃBâ-”›#ÿ×÷˜›¶Éâ2Ê€U%K$CTŠXjÐ�©ŽÎjb¿}‚¤RÅôí7[iŸÄÏâùŒáî@OWàiGAw{Šk3»;ƒs³ÑÅèRÎ{ñvüð|hpR»…fì:*VØëD¢ÁÐX˜Xšý¶›92ÒËs>º§5§éн ¾õùZ´¶ië»ï‹bQ˜Hƒs’3cªChr¹Ü.ïxóü«B‹ú„�}‘Ü{+`"¹-¦î¨¤l±$ãëÍÖ!‚p ®j§§ööç–ü¶ÂÕ×íñk}íÓ³£«Öc,ÁZüàևΗOˆ5ÿº¿^ëò\ÏóÖF6›‘ÀZ@;Ùmæ™öÓ®ã£X´,j6�bÅÓR&ž/; ÜP\µžê¤ò‘ � 'ˆDµ™Áx’�¸�$ôÃJ¬L„p|yBƂ‘Ii ?% ¦–düœèÚ endstream endobj 137 0 obj <> stream xÚk`€MÁ endstream endobj 139 0 obj <> stream xÚ…X \SWÖ!äQy¦Ò<ç¾è¸ÌTAÜZ«m…ªT-h[wY$$!�YBØ‘å†=²„‚lŠ¸ÖºT[k Õ¶q©ÓNk§‹¶ŽÎLÛ©3çµ—™ß¼€Šßׯ߼ßË{¹÷ÝwÏÿœó?K"¢\])‘H4)8$D›¨�ïïûšR•¢ŽÖ9'WóSùß`OÄ#ŠçD¼Â…Ÿ&æ§»š=Ed™§Øáé:¼�8~Òþl–ü†¢Dœ×÷'�‡çtáÛD_ÏΉ ž3)7JD¹S¨)ÔTêEDbѸG’cµ1Ê5±ÊDC¼!}�Ÿ¿ÿ¢Ú¤t]¼*ΠXàï¿p®óú¬âE?ÅÚè ÚT}B¼":1V±ÖOâ§X§Mfã¿Ó&*b”qÑê� íNE˜r£"E¯Ôé*�6%Iÿ{?EX\¼^‘ªÕ%(„»N©VFë•±Š”ÄX¥NaˆS*^  Si ŠàøÊD½Ráë«Pè•JEœÁ�´tÞ¯Óê4ÑjJ8XÁ,3©YÔlÊ—šGͧPÏP˨ç©åTµŠ ¢VSk©êU*” §"¨H*ŠŠ¦b¨xJCi©$j·X°®pL£¦9íìJ©‹8Q—ËL—­.7ÄáâîS$n’ÉyÉ7´^ê"])vÓ»7q\è¸:÷åî=/{\õôõlï=>ÕK�^Øþ£�Ÿ–*ÚëïÁz1_Ø+«ß³7»•¦àL–Œç[%‡òLf5›hÄÊ<ŽŒn“˜ ¸¤�Ë),ÌÍ’kºpú�nîĽ}©XÅuü(�§éŽßJT©X­éÄÍÜtSîåÈó°QF|è÷á‰W¡=ÌWíÞg`t0i|cŸ¬W‡3£s+Ëó¨¥WÃÿDfDÍÄ/jÚŒ�ÖnË ՘ͭeÈÜP�-ìΪWrdU1™°iŽœÉ zoíƒCÕ}' n?UzˆínÇ}‚Ä¿Ë xwl:bê3TÛq>sàðé/afç©WÄpF%ûi¹´ÄÅá¸lô¯åÒl70€ê�×;œqž"HsLþ‚Wm�õèÌyˆL-Çûä°Xj+>Ö‹ŽÙ¬ûÍ67ð‘Úð‘òt¨ùë²¶ªµª³O�ÓWQÖ ®´oÒÊçKU8SeD™ªM¥¶0µP¯é,ÝËu•‚¨¸,Ü�,•jðö³‰Èpìí‚S¬`Ò>î(à‚¬WoÎEz3q)+9ïË¤ÝøÄ†Ôµ%¸"ŽÍÐaurKQ¨«vÉÉbékÂq M(ÙZ$'AÒD¬"3K�SºÚ†›¾ºÛú™•3Wá3ÝòÛÒƒØz°Yž2wލÀya˜$‚­0K ³É챇#w4 ÊÝþªjsY5Ê ÙjÌ.rË-Nß“*Ï´f4õÿð¸ Qh‰ÝºÀ/È~“½˜,Þ"x:›Ðv¾Šî+Ü�^¤�f�F Ü ²€îÙÓÅÑœ¹„á˜r2ñöSÿ8l_O7bÖ©°éºN7ÚœÎõƒgdÌ@èö%/¬\õÖ½+—¯\:†FCŠ"íÞqÀÇ ÇVó3_zTvKÚ‚ÛããðîTDZ!¦Hc°qànoAw<3Æ 2"iæ(”DÐi8åÀnkE×¥#H‡ÇÑ™ÉX£îÂV®wؤyÜÊñ͸쯶ôs‚âøâ.Âd»7“ÄÇ‚HÖ�ˆ Óó‹Ó ÐÆ”ð<-pæK#oÒm-xè—ÿJž sf“ 3H¼¾Ÿ2ð9yÛ†VÂti¡¯7¼ûööì�n†…sê6d‡I‚ùJ̯áß’]\†�Ë^ضEÌ–Ž² €¾'C³ÆÀB'mB°/gr³`¼h«M걑#^'éO>À½¨È;ÐÚÑØ�¼HúE|çí‹°ü¢æ¢wÏ…4ÇkXíH¾Päxõ3‘â«xYGZ_xÎæÒømˆq§j�q-ÛXß•OG5í²¦qŒˆÊ1æ¥häq :K6b &nÇ/åÈß_“aòý¡/¨L?³qªÎŠnŸÏ®¢ó³pY>—Yˆ²9fzNNCi;–W”5TìE%å‡ §Ùo¯_»Å1 zóz2ºQ[]gE½Ù-©ª£`/ÛÔQ×ÑÕD,{-2rCxôÉsˆ¹\ùÎ믟}ëØÖ!²È€¨Ù³Ž¿ÞléïoE�6 ¾ÎÞ ^Ìyñqð®¬>¿6·‘/A)±˜ŠÍy¬1-Û�&Ìpp„¬!ÂG’S�•Ÿ&7´d7ZÊÍ–7a‡ÄRU_Ó"wºf„î"�va1oé•õé°EB&ýýÆãÏ­ÞŸ–†`�ô¤6EŽ�`!Ýàt•ð* «èï>:ôæ¹ízDRcGݻϹÊwd•�Ä:¯ˆFàÄálD®ÒÙB‹Àu\¥ë„<æä o²‹n�‡p˜/æóXœˆJ*ŠªJËÈ"8äs!Lr° ÷õ&a·ÐI›Q)DEZ$ÐÒ.µ>D4{”S6Üȵ›RÆFßÑ�Ö¤À“ô R.1=|~cäùC{^ [Bχ–ÉSùJ“@M¤¦Éï!&€T20FXâGõh=H“§É\ ܵâZ:S'èœ6m�ßÃ7Fúx�y£ɹ ¸?‚ã´��YżJ!,G䉇‰IHFcnybØDd��oŽQèY;4Ú½ß9uþÓó0U¸1|…°Ûnœ€x“´_°,Ç,v–7JÇ™’ó¸Õd{¶*/±0ñÉR:÷äB¨+©rëÌÕa:¢Çô¨Ûp?6Ivc5ÇT:q£B™F÷N6Kk·]"aY5†zee�[~U]A[ßPÓPÕW}UuçÜÌÃÉ´s�Å™ÜÇp )Ú{„­Ì‰_¡+ãèÇÖÿ3Eý?lezþ _ íð±]ôŽlN“ƒZ“üþF\‰«ßïÈ$ÂÜ� .àr÷x£ j™_H@``È�;ß\¾|õÚ¥µþ#¹=ØÅ#AV"ì`àdwo)"†_ËÍ ã’‚a n×oß႞ˆˆ šƒ¦Añ?è{ǃ"„` ¶\.³T¤×!2ñOÛàIp•w8�ƒk«+¬òš=­É‰$Šø ñxcþÀ&ô⹡�lWek�°ÅA‡î ñÛnÇ�A×#ÎëY]aj~fmAe1KˆÈJ¯•ÏÞI8Âú£ÌÜü=™òüªT[D�XF”Üå<½¿rÀG´£U¨ûÌ]¾åެ_�sr XSŠòKvfhñçÞÃ5y(»ÇÐfªucî¿?Øb?*ÿrùMâŽÈª±¸± ›tc#ð‹ìú„néÅÚ~Žù¹}7N‰–¯Åš–¤iê6`ßë|ÿGÀße›·¿ê�VÀ®k4sëÛ×_Ù2F!ðu€Ø�¿`üy#ï!kÍ>¶dãËéÁa耔ùx4’\ÆBó32´ô±@mx,ÐÅ‚o˜~÷ŒÚ›¦TÛÞÚ¸�óʱó5vï³—×:N:€s(/3j^ Ke—TDzëQÌ‘¤êç›—6ûD×)NÊß<}ê*¸[}ÕU(¥¼¶°•uVpNèαM£ß“¡ÉG1áuÛY"xîéÕo¬ù\Ï�4IÂX» ?O]$ßõÊsÚÍûv è}EÇJ›ÝšJK›XgßÀ©ëzÛ«ú-HsÄn¼Ä‚Ûµ¯o=äõ5;4ÛÅ|$L’ýHdm •è¥:IbÅKu‡å]ý}w?oÐ$—£ sYFß(*Ç(¨"SA j‹ŒÄi,YfxV5ï~Æ·&îtþ§Yò�;wùo ­ýD‡š÷Õ&�âxj†¥Ñò™à�•ÃÁ[ÖŒÛâv•îÎ@!¥¯åØðYy°D:Ö,¹I?ꌞ]4ÖC|MŠé9ª®ôÙñ[º¡Ç»¹©LæX7'$Ä_vsñ4szþÒì„çðþ~¿,}ÄBÏqè¯=º·{1[Ìm¸™}ÐàyåÊëìÞÍL~ Á„`æc¾œÿÄ)/Í�ö6¡À½@ÞÍŠH[^%äÒ=EMyƒOñOú0QΊæäóÊLš¹ó`ýA� ÃMåÞFÜÃî:0‹0Á7�Ô?Ϋi7ïnu¦›°IÌó3Ô„qcŒí¦‰ˆÜ "¸!é~¬�7^½4HÉI|]+nc[:ðþZ�`ðgIïƒÔKÒìëÀ;ÒÎo±{wÁ&²ú&Á&FþkòV�ø¬�…éj§‚-ym-~Pàcû¿…÷Ñ0�ü$©ÈÅÅXŽuÏdé„ö+1LU’Yê†+-õr&À–Þ,LOÊHOŽ>°ãôw'À§¶‚ƒyü–G�ÿ LäYÏYÂïzj©ó7~ wN-¿¢ž¯­¨¥‘»k˜Ösöô°»;<5V™�GekE•§ç@[YEµ¹Å¼÷­ý{=Çóí“ÿ)û¼y˜k endstream endobj 141 0 obj <> stream xÚk``�`gMm[ÆøÀµ C endstream endobj 17 0 obj <> stream xÚí\ksÛ6ý¾¿‚3û¡ÖvLâýèd2cÇIëÙ¼ÖNÚ&ª>(íhÖ–<–Ü&ÿ~ÏI ¢ÅŒ­I»»íºñ¸¸÷Üà‚—›ŒeÜe\ØL°L8›qŸ)Å3¡2íu&|fQ/Eæ„̤Î<ÕËŒ3®3-2Î-Ï Ï¸Dj!Kã?ÈrkD¦Pï‡<¤RfJ#5:S©·™¢Ñ0‚‚B”Gêe¦¡ �5˜¶™–H�Ï4ôá‚gÚ E!ªwhç2!8Úy¤bÐ_8–A!¹È$ÚK(AfI ÃÌc:3�«PièÙØ ª¡;ú£½–° ò5IJ†Á8F˜LRŠÁ Æ3ÐK"µÐKa\ ½,ƵРCA ,èéùdúïâpv=.¯û S™ ŠŸŠãâ  tP Ûiñöä˜þö>.WóŠââf˜Ï®Ï{�'åhÑÇäËP^çÒÐ$Q¹‚·%ó¹²nðøñßrø?þø#¯U(.‡Ó›áE�qëlþqqyñw™Ë\,õ“ÂçŽ&]­ŸT.7˜ßL¿rRæ––'sÅÈW:ט>ÂÛ\ ù 5SÒåž¶3e-°ò-̞ͦ JP%NŠg4-BKD•¡5 Ê׫\˜uV‘ÅÀ¯¯g£ÓrÑ/^=+Þ”ŸÅñåð¼|R%‡UrÜz9ÐJüjHfÀú˜_;P¤ôÆšñÿlòŸO.'‹yïh6Ú?] ¯½½9<<™Mÿ‘sÖ/‡—åZ½ #î]AHÎ{ؽ–O¢'ÝêIö°s-ŸTO¥#é=Å[%¬§‚-ÝV x¬�[i·Pª%Uô¬Éž2­"(h[Eº§\«Èô”oÙžn[æzšoµÃGv½Éßû&UôtË2Ázºe™à=ݲL cË2!{ºe™P=ݲ Š¶Í a"3ü+ÐÀˆu¡²gZv©žiÙ…q[fANË*Û3-£\Ï´lò=ã#ýÿ9ϱrQ —”˜à& -ëf}F.~}÷> Ë/6PçslÛÓ›‹‹ÁÆz$—¬Çf�#´­ë%k×ãáî-õBçlKíXŽà$]oD®·Õ3“«-õJ³\Št½ô ÛR�½ëx²^8‘³mõÒæn >Ür»„O¹YVË/À»ž‹Ü¯Ô»ÝÝæ"Y‹€-—:+ÏÎS%cˆ—™ãO?®C¤gofÅQ¼gÑþ:¼.§ :­Ðˆ/±ÁÒf£T-³Œ$ây�¼Rõ³ÁŸÇ_Y¥VÕÏgU™•)-d¬…Ž´°›µ0#HÓÕ¨VTÏrX?›Ún”á8Yi¬êv�v0Á¢^Åe¼jc}]g*ÍC?`(F•µ�¼Ð¾¶\øªN �,«¼ýP[þ!ê+je­ÿ¨Öm\÷E}kÛÂøµm9A¹Bx“Žä%ÒA74eº·LyEÇ^±‘Wüý¼²äɨF�¼Ä"DÝÿ"Úæ6Ú¯¯Ëßé-ÈyÇ:"¯*m¿õì¾/BI(Sç,�³<ß=”�–Û?/œ©Cš�i^<œulÓ@Óì2ÂVÝŸÆ­[Cê„䣒—»ƒrÉÈ¿ œ)(Eê„⣊ïzBiT¨Oñ«ƒ/™ªl}ªÐuÖ)h©ˆÚGµïQÛúÝ·ÛUX&R­�"Zoº{¡!'‘yùÊRt?èèun3Ön#U‘ŠT}©zûð�tÙm¾,©¨ØGQ±w_Að‡bÊNþ­Ð¤"dEÈÞ?<4�óíàIEÆ)¶|éýJúç½ÀÑg“ëù¢ù5ãùpÞ`_<™Ý@ƒ}!Z¿Vïð‹œªÏ˜K[Eý’+ú½…p3_­´ˆ”6+¥k¤¥[¿�V:GÛc-@Et$@Ð ÄÓ½â�Tèz1Ýà 'å|vs=*çt˘ú† r¯‡çe3:Ý­„Nxž÷EPgPÝ¢›‡ë§K•"qþ®â\tëdÕ_Š;ö—|s}×þ*ê¿l>¯ATÕE˜êLõ³{VýºžÉ‡åx2<œ} — Ýoõ¢÷äº.f× ¯ê×2ºæ•võük^‚òú™E¯ošßŠÀ¥/­!!Šl^ÐÖA¸¤Xƒ‡7‹�+E†«7ˆ¦ŒÞ®ºÕ[ÅæÍb³¬½}<«¥æ-¥Š¶(_+¤âŸmÂ=»ñͨ¼Þû4þ}r5>»ü”ý¶'˜PL2ý[¯Wa…Ùq4\”{G?Эs¦„æR î¾gâ;ƾëU°¾º*§a*Õ÷,žMƒà¶³qY¼�—¯n“)¼.YÑ-pjÖ”.g9zɈàû'ÃÅðbvNSGÙ¾æ| Y_13°¢…Ž÷•ö§ûR+�L ¼¡ì€3j8óÔ-3^覆ëc9HÝ×J ”è[fJ÷……4ØJÍ´ ­µ‰‘T�™`ÆP�L3Ag[u&}p¨£æ^÷éæ»t|à]_:] &9«äÝЉsÞ·©½k=µ‚f’±�2}giüZ‘Ö™DO£û ‹ˆD©Õ}/]æÂå~MŠh#Nõé  `I§ŠLÑ€PDI j.tHi`ÛÅ2•@Òf  ]Û§+ôÔ?[>•…&C7õ =@jéh4]“6$*üѵkD5‚6˜²hB·ªÑÃÂ8¬=¤bxT}ÏmFßFÔ­Ž‘è¥<1¡Ï 8àHÏ�ç$' /Q‰³LhäÉjÐä Âê¸T®ÖˆÒ�‡ÎC;¤&¨¶,�ã$é�«GÀU}àL¨ÝJÕwÜݜ䥰Hz¢›‘>8UX"=�XTg|ßc7Œ¾¤€¦("ÿj—y² †#ô-\-ûìÂPŠî=ÙànìCh—©00>úQUp9ús.ú�Ô…´r½¦OK@(¼Ì.K·ý…ÉC‰_vÔ+Ú-³†‡v4—šS•¬zbJ…DµG&«·)áÂ8äûv A°ÊûÛõ<Ô8t5ÈsW1߯g Z@TÚ÷¶'ŒËI=‹EðpH–vm6±¬6/¬*+ó³šM•®f/¯Ü?9>¢gª`Åáp^†Úƒw'?þøôûç/Nf—Ã)·û'åùÍÅ𚚟~ž/ÊËãéÙ,ìòç“ùâúóÞÁxö¡ì¯èîþdz¾w<Æ–>Y|îa¤««‹ò’v|F±ä•óÑõä ûqø&…–ü£_è« â—ðñË*lô]õ(æ#’嘦«q!¿Ï½.N¡Õϯ°q\ýTNÎ?Vm~?ÿe2^|Ä\·AÔ!ûØ×9úÜ%|g„Šcl8“ÑÁôü¢ÌXñìbx>Ï ä~Æ^ÿ[Ôt6/±æÍÖþy\ÛFÛ\?jñlrQJúÔ§Š~€h¹ ¯|6˜½tÓý³ßÀ¾ÿSñt:š�áŠ"*«¡ÄŒ".]ÅMofo§´.±‹mjlfËÓ·‡O_.µ»d‹j³ÅÜ‘-&f‹ªÙbô[LĹÆìûôñÇnBl±É–$~1[ô:[l¶¤äwe‹½ÍÙ�-§ï�_GÚÎ.Æ» ŠkQE°ûPkkŠ+‹NÄœ#ÁOŸ¶Ñ—u2Áa×,I·myÙaÌ¿ÆÁ»¬-›„w¥Š¿MÕ�*'Oß¿ÿùt© ÛáÂ"D›-ê^ K’,Zù˜,’¶!OßOrûà K¿ˆ*Õ;„Utª¤äweKµ®ÓEw§Ë«£wO�^Dêìhe©¿]‹¸âîµ²p•\Y¤ˆÉâheñ:ãt:ÀÊ"|eÙ aL»Nß�.…w押ÍÓ�+¿þ|LÔ‹Ùtö|±;²Èv|+ïßZ'WdÜÖdAéŠ+Ô&ŠoYÌ­²}Épt¥/ªŽ}iªð-TñIª$Œ¸"×#\Ù%ÂÝ,½3Y6¸¶;YŽþõëógï#âVPî‚-íøVÞ+¾Õ&½ ­Å,ÚÕÛ�¤#Ñ­ÓÐ>W9“†{étÍ˾jKJAÓf=Ô•]BÝ„ø®¼©¢�uÞ¸î¼yþã›WïÞ×$Þiø"ÛÁ®º[°k­‹V!6…/Ô&¹Êp¬28ƒYIÿÏÜl^e쪤˜z1UÖã\Õ%ÎMˆïL• §¢fSü(üûm endstream endobj 142 0 obj <<0f6ee843b88d2230498fb6a979183931>]/Root 1 0 R/Info 2 0 R/Size 143/W[1 2 2]/Filter/FlateDecode/Length 330>> stream xÚ-Ò73@Àñ}''§O> stream xÚ•ZÉŽ#7½û+òDs_¡Ì à›�º>”J-Ÿ|ðÿ_LÆBF2™’Ý ¥˜Á`0–‹zûg3›®Ì–lý«·ï¿ë·ÿ×½ýùŸÏí×ÿ™Í$eMðÛçc³:+çüv1Ú«¨óöyÿ㪵ÏZÇ»ÖÎÖO�ßC¨Ï_õ3~üùù[eä6cT Á6F—àÚóvñZ•™�Cæ»>ß?.ÎÆºj+÷ÀÕhñ_0xb;ÉvÊðÀ7Ö}\lº�ba’XI<­ZzöMôˆÙÄ2y»Ø¢L1$V¼i�Je]i]Ñë±Ö>]�½ÿýD�…Íxå|„‹F£Rl �SѾè7]²í¶»Ýi+U#6î6» |8Uv½›sí�様Qe•7­X7Øîlo}hàôËàëî°7æc‰"˜~N™ÏñéLºvrŠdB:ÇßÞÐ\Ìʶ…7 ­Ó¯¤MþŠ«à&w|ÓvxrŸ¶�2°îð鹦þ.>>Š“Þd%—gÖ󦹒VÖ;ö¥a ‹"v˜¢’·5öè®$½ù®î\rÛmð`É"¸ÈsƒV>‡Î%x¢×Òç¤ö*÷PÈšFlÔ“miÅN§�M.1È O»%ÄßWoÙƒ3۪ɪ÷xSÈî-Šiß�üµïeþúù*…Ãë�,|qûå]Rµ�MÓžHk‰lŒZ�Þj=W”Pû í÷¸23o8Ù1rgÆ lr�_»¨'Ë ê {Œ@  ¥ÛðÅvĉ&�îÈÀQrä´â%&�’'ÚŒŠ/A™—š`гtOsC'ô®»d5®÷Z8(~ žn ÉÀ ls(¡Û±i …دľR¯¦Ó’öà„DÙ€¨Û÷ŽHvø²È2ÄÅ>o�Næ8K Ì?'ž�¦¥<“ˆ û È®ã^Â_•K™üœSî!òÃWÀ?¢#gfÍ2ŽHOJLÔ�I OŒöŠØCÉ)bó ð/°Ïãz¡—ÌîîTL ý}ø [dÏÉ�»¼“=@¦†,…%lr/z6TcØ\4dé\?!/×*ý�ØÍ>~ o«¾C¸ŽíðÓ82ªqüâ>wÞÊÞ»óûh®£(£=và Ä_—‘uÁz?Þ©Y�iQW»rîÁÒvܺsÔM²¬ôˆM÷=ÎâfKÎÜ5ßNn@âÁâÍ]¯2f2è—Æ›1‰eç ÛP%ö*Üð†IºCVäb#ù‘²� O„CP“×Ãý˜\£prƒjÀ'À´r!/²£ô÷|•Yµ±¯*Í·Œq¦lÈG9"‘§ÃZõ�|X\M¯¹çÃø£-òf-´St'¡É ýpwè9ImCǘÎ4<ʇ½†G24º¶YÏ-:Ñ(#Ê-ð#–ƒ´­†}Z;'Ѫ”ý¨& §úpæ: ÎCq¾Ð¨k�i”a$Á!‡Âw¢P&9E…Òƒ³�…R¨’íj�¾‘3ã1¿ ’Iɾj‡XR&:†|#}ÍÀÎÛµ~(¾©ítÊè2…Ê(ø9ÝÅëH ˜l"•é|v Ž{;ü“r¤–޵Ÿžãu™e8G†EõÐK*7½�Úp1ÎYé¦á^ð²eÅ=)Jðg¾Ò쮕8æŽ%,AÄš˜ª§¼…y4Ýût(Új¾Êo‰JV(iá]>nœXû[.qçª:(žî¤ øÃÓ§0˜±Dº9�sÈ£µ›�wŽÃÚb wØÁs—¶Û·ßQ’sÒ}YE¦x¨UÏl¬W¶Äíâmmÿ}Íóv7æÂ•Ë9·Šz¾¸™øŽTáqõB2Þx…çé*—0¨z±y  +ilH*»D*\sµäÈ}<î±Yx±¦ê?Uê<í�ž½Ÿá¢¥- z»r¤‡î±c\óYz‘~â?KµÛ¬Œy'-Bþ8@Xv÷BÉóTý”ži÷06?ÀºÍÃâaÖO}cÖz˜¨¢}§ÞÒàY– šüv]Hì �½ÊµXzfo"]Ÿæpô& U!ͳ,Ã;¯c–q”ý?Owe5ûeä C>à R‘ï/“yŸYïDàÀ"}L™u1Šõ¶L�µo?Bÿ¸œ¶®�†éÁ=™!çâìÝ Î­Ç¤³¬œ+�ž¢}À~ß—e}øæ\ww]éÚ`>êtf-G~qúAlüô3f©²Ü<ó™Nóå:5ÿî?+ì€Ìejx^¢Ó*º^=Øyçï¿ü "Ì endstream endobj 28 0 obj <> stream xÚíYÉŽ#7 ½ç+ê¬HÔ>˜ �[€¾9´]í9å�ÿ¿„”DIµº<ÝÈ4‚`ƨ.-õÈG‘ªáïA ÿ©Áþ—Ãí/|ûßÏ_^†Ÿ¿Æ!ŠèÀ /÷Á)á]Nði‡—ñ�³”ÆKéF)ÕMJxÍOòÏÞ¥Ô€ý1�qÛÇËI�3µá¿;¬Â>|Bí¯³!Ï&‰$©�p*·Ðšô¤Ñà«TÛËO³‹žî­H–ùGkÓ³IÖj¯wcÝ?_~CÄ|‡ØIh‹€)%¢eÀ*¢qk&m Ej8÷oi�˜ÇèÖ"7 L½^^¬=7ði„®²µo1WžCÒÖæñ¦H#Cr®,GÝxn3:·Àufú�àøò’ÝÈèýHItÁE»KL;óº$‘õHš� ¡^ªR+Þ©@ ©"»gE£`†ïpk»3Skñç.' „‡!´G~[š{¢…_SBGa›\¿²ñ®Ê¢œ‡mpW`#š¥D67sGßw$“#¾Ö~`˜Ûzl ’63ê:üÎ öüúš¥ìklúHS-<¨¢�½_Àw^Ö¸äœ.>�ȯóßúÚ�H[PÍëS (~›Ã�̼4VõÔ´üû~ Ø�K÷Z®x̰ £pZ=âUÈ{MÇÁ}jà4®F ÐøƒÖÆX{:B¸Ùìt°äè…OSf¼­ÌmËX�ób/åG›I¹U»ýø„# GYB¾ã�¿qN•¥ì‘m.O¤‡ž„bàøjuö|F9…8ÛóL $:î×fO¼ÖìÝ3¡ñ‚xµ´ÿ%�ÔtàVùG¸°äWeè ¤MÚ㢫»ÍÁ•”©îä'î ƒ04†¨Ÿd­8ñw›ý°o3·‚Q Ôÿ öØÌžèónöø±ó¸ñÙèþ¹=ZeÍ�&-«ñî9ý>âåäÅVOçv^ç¾õI±vìÑã1º1%ÕXlp|‚)n»þÉ#¸öÊ�½ÓÄ?ä�¶ ¬ì�¾*HNüÏ'=gVì{2$%_ãŠ$P¯™å:¹¥1�[ö½‚FÙ®ö*s˜l�{âÂÉ(µŽëÔ3?¯¿Å|Ïã0-vî†0 œ¬s™’ªko6̦½îKYÏ h’y&¥~&ŸY7(�ÎOSØõÖº¾™¯M­Pfú±¥¾0Ñ,Ë4«2ËšI+_’—Z8��k4&¡è'6΀ï+k΃R¬ÓÍJåO'ùåµDF2D�†Úà-·#àéòA]ó3Ý#¼mÜŒì™ÕÆrƒÕ¸÷dv’4.~™ÞÇi 7¶ÄíÅr>ži&ó#¹ÉëºäïËJ¾£xDX±x„m¾Ü÷`•ßæ�È-¤a)üŸÚ×Ê’sBbÏò¦Yl•ì!ÇÉVÔ§È2©—¾¨+™×6†Ê ˆ¦j²mו]PÒ6á¡]€Q| g¾£è9 éouUª ÜòQíÂÊ‚DpÐÌílµ ÃièBÅa~‡õ¯þ@~P_Õ¢\†hÕ«:ÕòSpéX†þ˜XÞamjþ'Ö¿M¬îö÷Ý”°xd„ø(ýOÒÔ;®‚JÁÛe'Z–î}g(Rn|‰v Ç^MÞø1eñzï*‰­ÖXÛŽƒ{Èû�âòبyyœ[®¦”\Ý­µƒ¾âÑ=OsËVò\Öë8:?±6÷Î)Ä¥JÞÇæÙÖ"BpðpŠÂÙPÇNNb¢?çý©sc#™ÞÌ/Rî Á ó€|àøÈg†> L> Nö£•Px0žœ–xBV®ó™¿ÿô1:"@ endstream endobj 31 0 obj <> stream xÚíZ»®7íóû¢É>–€ "€m ]uA _Ér•"ÿß„ä ¹\.)íUp}#°­Èyp^‡3kOOj’á�š„¿rºü~}Ÿo›ï_ÏÓ‡OJM^x v:ß&«„³ót°¾Ít¾þq”RÏRÚ«”á[Òo¸„ÏMJ£ÂÚWzŽûðÖLX‹ëžéúŽüaÂÀ²¦.Dã,í¡e™‘/Ò_Oæ¸HLž´›wu ÇB ,EÛZ‚á3Z {’]¾¦Ð¢pÐ×îôçù·à»ƒR›ì 0µâì®Äøuq[üdÓ•¨î푵-z¿°ÁÑýšÝ;ýVC2âã™âï:á÷(”²l]äwòd¢žxŽ•}éL§J™vãDGºLWԑݪétñ$%œ éô×ÌŸô\cZå•ÂãIrJ�k–®ólèWÁλ1Àx#>x9�‹'¼e;’4¨Ï’4úÅÇÙvÍ)Ÿý?ÎfÎUQ¨Óæzñ–Ý˧•õˆGöó�}�Vô5§jY©}N\½’™WÑïV¿B)ü¬v–?ºu¾Åò7Xi½ý€e¼­ ý•Û ÙYÆ*< BŽ£#Fu¡Ì2V5¹F+¹RsææÜ�¹g,4ÙHÉœ—ô[Ý"¾Øð­Ó÷.l„ ]|{­Ò+ç‡Ðáß3»MÐÏÑú€VÂH=ÀLœ±½ŸÓÊ=Ì$ŠÕ >ëö¾N4]̤­Œ™#a5fŽ9l¡Š†ÒB%™Ã*Ñ[¨ê*IÚ´Pr•B?÷tV©³ÙÓY1é{7Sà¼@÷/K £Wrû•ídó"¦,e¢^8P E Ú÷íºî L÷ä]x°¯ôPBÒ döR<ñOæ¹w5á%ÂfŜߌ—(…Ò±e.L­Õk¬S�&ú N¨Ý(ñÍ æü Ý:Þ?h¦¤&Ç$‰öBqH¥ŸxW`Pθʹщj¬ÝpfyQzrjÑ Èˆ•R.#;õš–�ʾ6²ºÃ6‰Á]D>i)W ð{È H¼j˜¦ºµ£n’3×ïGZ[é�†Ö7¯4v´3_hH·íS®Àðhtá­F¦.þ -Ÿ¯k³RZ€] §Ì‰Ðkž}Áž8Wh2m3®ò Ü³M[1K|ÛAïCwtûÐý€*ôÖÖ5SòÃÙwÊ B+ûF(ß¾âúåßå Æ¯ aà4#8³å‰êÊÅåI_Fy¢­QžW^ÑpIa­yÚÐl@¾uI ò´šAži: +�™Ú:œ_”z=ÓæÞ.¸¨ªBèŸ÷ɼîC�)í+àC°\î—Äz-܃³�á~•¹c{ÐYôˆW0wRéI£(œ {ÿ¨±âWÿ—cE’mÈ2‹%»¾´œ¿ÿòÁ_O endstream endobj 34 0 obj <> stream xÚíZË®ã6 Ý÷+üQERO Èb€i�î dWt17¹™UýÿM)ɲe[~ÞMÛ‹™ÀŽC=HñœCÉ·ù«�Fò?h,òÙ\ÿäo¿ðçûäúåÒüø3@ã…7hšË½1 ¬qÍÉ _us¹ýþ“”ÊIinRòU¦ïxåÏ›”pMߣÍ;_ßZ;Ï×»”Ø.\5¸-Û(¾¿';²üìv>iÔa¤oõÖ½¼¥9ÐÛ°ƒ¥•�ÔG˜]ì‹Õ¦%´ïlѤq”){È}‡~ƒïÑ?-þ¸üÊÑ;¯sˆj¢í†Ðå`9œÑö½kø„‰„k?‚¥_gÆ SüzIëk+ËëI˜vîø­\Æó‰ˆB ¯ùnº¤çºÐðÞ·nÉd¾‡u³&[`ObÙæRß^axš¿å�»'XYOÝäÖ…‡àQ€âõI¾Õ—±mXF†”°]+[´V¾ì] ØÛ]SRWé�p¦·Í ‰´ÝÃó ÚûÖ§¼tUhx!Ñ<›9 úÄé±OJ·ëÐAEäïÇñú0ŒÖ¸Øe¬¼*FAyAÖ΀T‘nAªÈ¬�4™,�4YÌ�4 –AšlK�¶O6ƒ%²k®ÇÑl²Up¥$¯ºcu—‹ˆoŸ†Õ!ÛÙ˜s„a;õ£ZïB'¾†ùœP‘ ÂQ.,Á\ ôþXÈÔóË­6€Úê¾ÿ*\k}k!]?¯˜9·ÂvD¹œ°=y_#F% ;O)Élo1?¹åEH�Í¡P8嶨2±å€ÅÊð§LN¨$L-¦ĬvÝÚŽ}SN�¶ûõäDÀ9În¦1›”…­,;TÅ{Þ=XUSûT•PD/´òŸªòßViŸ«*Êá1U»]UŒ§]ª¢™f«ªbÔQU1z]U²ÙŠ?äD1¿í“aÐ ὑ�¿ %æ�Ÿƒ=Ú¬zn´¡l]Ñ*’:ax<pío{íÑ�§žl¥þš¢¼ˆ�äª ¡�teH¶´—î¬á W·LJJf2@!½gÛ”�yÞIÙèÃs¼ˆü$€` yr3€Ê·�îæ•[ ÔcH½•�žì ¥…;ZÜx†ˆ™yÙÙýº™Z®Öý õZAŠ>¼ÓÔ#ç(í 8ô’V &üdm¿�ñ1ÀÿwZ)#€·0ý ‰ÐãCý9@³Œ,zî|¾ôî{åÐxÑå&amGQn§YTÛUx¡ÌV1ç­ºCG89r„£,W«/íŽÂóJü$¸þ?^Õi‰BuïêÆ°Fm³NÇ»Y�ÖfQ§íX§µët²Ùk%£ŠcëX;†¶xKXäˆ(´ÝP ¤£’> stream xÚÕYÉŽã6½ç+ôfÈ"‹ `ø �[€¾9Ä­ñœrÈÿ_­¸ˆ”¥vÏ ºÙ\ŠÅªW«—±pÿ'þŸ/ïûo¿úçëðþémùñ!Çœ½¼=-˜Ñv¹hðo\ÞÖ?®œ+˹^9—àß<}‡wÿò˜óÏ—ô~dZçü¸Òé³ñoD?fÇu°Þ.NúºŽêGÚÓòÒÌŠzzx‡YÔ…¢çY–µ¸‰«çÀ”=xûóí7/³‹Ì! &�"†âÆ/UHá Ç„w=FŠg³;L„£~KÚ2e9ɄЙ§@£(n)å5S{„1ü†áÌ^¨a®‰7ih­x§OJßÀ\IA´ZùojWÏ�6ÞÇ㛫äLrã%œo1@$ïjïš „²ÇËqBY3n+Ý ® =á箬�’ñR�Ç”cǤið9cØ1¥ûÊZ×Ò×Lƒ­Œûµ€cgt-³º BBfüy»D�Á#ãéQt@˜šz!,sʸy߸h´~OFçx‹(À­MÖ&u⃮ÄÅ~'—�×™ŒJ[ÇÃÞvlØkêþ°Fe1Ò~e6c&?îÐB…4L*™…‰�FhkèÌ|:a&ÃSÅèF±Ò¾ÞxGÓ«éÜ„¿x~¤¯Ñ«ÑÊžã©wãÉíî¢ò3`ÔÞÅuÆ÷òsÊúûgbG€Áöô‘úËÎ\XÁ�Ì.„‹Î’m±ä R1š£lõaò^`“Žª~¦@^APÙ*�á2ª•wð‚Wdñ§6tÃ5òÌ ÈrS£c¥Ö¢j„в¸¹ä ”yQ&Ñn¢ºÚL·ŽÐ&«¿W™…‡œ¸�(6FÎp†Mw’b|iY<û˜G÷žUž¶sÿ*§þUîzj ë}=±cä'­ç *¤÷ŸÇåé*žùÏóÞî%Ÿ:¥vˆ)-Z¼‚œÁ»LÄ}œô¸kõ¿�•��ýýp¤O¦–Ò§–ÎÁ–"k­sˆ£p¢áíãnãÛøq˜DOQd�IK®es¡ pú ÖVA pØD(…ÞF –Îi¡ÖoÍ®«ÌGª vq¨Úm±œPºSšpb¸â*¢ü~¾LQÜ2ŸÛ}°f~K/GªShQ ™äbå_Äò÷AJ Hû bËgì4éy�(+O& �)¥O†’ÒÕt5”ü7Õg8³ 6!c`ÿIð£V\Rþ Ýý�eºd(o±rï5íŠF£•Эë,¶Ù–Áí= >‹d†Ô-©c¢0Œ—¨/›Ör<£ø�ÄFDßSÌkdNº+!´.)\—|"5ÈiaqÈñ[@Æ®$±k!µ›"½{zš¾*13Ég|¶û|7ý�I—œ`Þ+×6ê�H ýÅû¤Åz!J}µ$Mß�Üf!Áà¥vך»”0E9œ‚¶Ï–㡆Yy¥ûÞ…¹2óLŒZUl’§¢0Ý6f¢�? Íñ‚©Ac£ÐÐ8‘˜~7?Ä¢CCÝuƒÈY]Z�£È×ÖÎÚÀ¾ó4}2±_ÝN…ö¡:«†Ä}Ä÷ÉÖ–ç*.Jë7%tï´é˜¶�[@h‡B;HÔø”ÚÐÔ�Û»à®(Û=1J–Ó7áJâæÚš“ PkÎçÝ’Iªfs£Ì5 ¶•3> stream xÚåW¹ŽÜ0 íóþ�q$R'°˜"@ ]€é‚;ãuªùÿ&¤¨ÓöLv· v�eŠ|<ô$O&=)úÓ“úWÓí7I_éùµûýt™>~ÑvŠstà¦Ë:9={¦“úµÓeùñ¤”yQÊ™ó ´R$Z�) Ô³<]§’VÑ]éy±-øyùF(|BM'íçˆPüßȃ>ƒ§±‡ó h+ÏÒ[†³�å+¿Á'™q±HèIRY·ê –Y”Ò·­Ê›B²� ZÕ¶®£EÞók™u1a-é8è׃áçX¯ÙcÅ®om]�Y$m=dIPWû ³)Òš'²vKiÿ|yCKÄ0;Ìázãr>Y°ìE f‘ДçÖ--‹,í!1�¥Î±¤ÕbªÍØ�prCè9ÚÒ�òúð÷YCƵgëŒpôàô¯]JµsÖ²l®é–•ma©fßÝ$_E�­mð» ‚¤0¥12,û(¿E.Ûj�Í(÷ë‹ –Ã*cÞm<–Íœç3l~Ê;ÄN/¯ç°Š] #�ûµÅGõ�kô|T#»nk®uB qÍæÙ´}¿¦(�›ÎÝúå¾d}^ë¡íž´¿`D{§C¹Â&æçe¬špg“…8÷šªË0.òäìs'ÞáNƒúwšÄ!…;Í!wŠs'ç–u½ÉkTYS8oo»ã'>ðŒ&¢!Š@�k®öóAˆÚ!5½â‹y-ù ½?fÇŒºcWSÙ·ðeÖYÛiÀ9*Q¶80Óúƒ¨ŠÝCÖM‘Pqì0lw„j1àÚ¸ý=< Ê;Ô?ŸP\§Ô· }Û±7Üao¿ßM6Ügo‡ußÞRô?^ocÜ#Þ£•ny/‡ó÷Ý�ýs÷¶:¬>VgËÚœý‡¬}§ÏÖÎÕ„¡kÇ®#z=×fø¸Ÿm¬\�Ö W—C÷zoæétCá›\ˆý 6*áíĶÜY�ìÑå^NRÒ­µáûzÈÜÒåðJi%Štš±z}‰øª¹îÊzDÒ&ÎÚWî}|R„mìì¡­¯÷×äúÀBŽ*E¾ô9îºi®’¥Âál‰ûày®e.ߤ÷…©£™CôÛvÂÆ€Å‹wýwCE¿npç}»½Ë:N¿5ÍÚöìÄzæðÛ¾Äó‘îøUX;¡ÿ,0×Îe¬™î¨IGL_<@=kêØ“CEßõð²Û•ß?ü 3!\ endstream endobj 152 0 obj <> stream xÚ]‘Mk„0†ïþŠ9n)‹_U· ÂâVj[Ö](½e“ÑÖ$D=øïkÙCxæ+3oü²>Õ‚OàiI[œ ã‚iå¬) {.¼0Æé´‘½é@”ç— Qd@ð«ïŸ·ºy~oÎr "Ìögìç;Ñûë¥ S`عìË¢¢�ëS»Œµè$ä¹à¯e|œô»#“7|2¾OÍPsÑÃîZ¶ÖÓÎJÝq@1Aà…mºñ¨d8*BQÑ£—«�W« ö/ž¹ª[G‰6Ùq´fAš†^ŽJKIb):8J½ZJKYäèh)Ž�\,±lo™YŒˆ é¬õº‘UÚjeÖ⟡¤2Uöüh³ƒ] endstream endobj 153 0 obj <> stream xÚ]’ÝŠƒ0…ï}Š\vYŠÿÚ‚]]·…¶»Ôö¬Ž®PcˆzÑ·_Í ½Ø€Â—œ93“Œ™ÒoGfþȾÌiduË+IC?É’Ø�š–¶Ãª¶5©ÙÂ0“S!ÎEGÌ<ï¿Òýñýxºô]Ámg}¡fzr}»fvÀ*ª¡¾>1Gó!ÍŸÃHÝ�×=‹"ƒ1sk‡Q>ÙjWõwz[ö¾eE²å [Ý’\íä“êˆ�Ì2âXÙÙ(¯ì+DQ’,xCFdÍ+fQ6¯Ø ^ý;w|„Ýëò·�‹ÜNf¹ev¼�ã‚ÐN‘ç‚RENÊ ô¹ÈÁÅÝ€¶ ­ü€2i(= R�öÜ‚àéí@œ¡•ŸŠ|”�àâ¢?ù|ô _¨ Êݨ:DÕªvµùBthÏ@Q¨»µÔõë{^b™ ×•“”ósª1Sƒ²¼iËé5‰¢K”úþÖ/´‹ endstream endobj 154 0 obj <> stream xÚ]ÒM‹ƒ0໿"Ç.Kñ£š´ ÂV+ÚîRÛ½Û8v…%ÚCÿýjÞ°‡“™|̸é>Û«fdî—îdA#«Uiº§–Änto”ã¬jähe¾²-{ÇM�e*[bîötøÎNï‡ã¹kKåËm÷¨–×KîsVQ�©—WO,°ÞgÅk©Ý«ºcqì0æž§Ìè_lñQu7z›ÿ}êŠt£îlqM ó§xöýƒZR#óœ$1é|ìMv })I—êNNìMOÂâ|z‡Tõo<»Õò§Ôót?�¦{÷“YÁZA;£04ZùP˜iÅ1Æ!�1+›S@9´6 =£ ƒì È®`µ†RÈæ´q8C¸ƒ2ŒAròZE ˆc/"€á&8ö"¬6î…c=�›à8_„³ ‡³ »3ŽSMå±u˜ 5·×_wɧÖS¹MšFškÞ(úkÓ¾ëç(óþåþ¹“ endstream endobj 155 0 obj <> stream xÚ]”]‹â0†ïû+r9Ë0Ø6_ RPkAXwvÇ™½¯mt c[b½ðßo›÷Å�-(6‡ðæpëû/wqí â(ËÂr ôª®v×¾¬œ/Û³‹–ñødbYŒO¹¶þï»Y`ÚñT}–~ž¬Çáq¬’,Ð&�¥”‚T ½ÍAkДƒVXS‚Á�A®@y ”kn1O� ÌÉß4(Å7Ì$¢Kƒ‘d1’kÉy°–Œ@k ¢5‰fsÍ@*Æ]Ñs¢' ž{Wð4È ‚§B&< ‰fŒ@3ò©¶ äÓ€4ÌT‚™!ÁL¢Ò•'‚§%iì»Õ°N±# Ï”ñ`f¹&²¤Ñ=.–�ž0p±$Ä“¨˜a> stream xÚ]“]kƒ0…ïý¹ìů[Áꄺ mw±;«¯�P£¤ö¢ÿ~šz1AáÉûu’ítŸíe71ûK uIk;Ù(º wU;Ó¥“–뱦«'Cú[÷ÕhÙé¡?ªž˜ýS’âûõýP }%]g½®ÍútÌ]Áj‘z|ŒÄ<Ãû¬|Ü&ê÷²XYŒÙÅÜù6©[%Íp¦—eíS5¤:ya«SZê•ò>ŽWêIṈâX·s¡­º�UMª’²"g~båó[$›q?@Ù¹­+µ¤»éœî8Â�ò> stream xÚ]”_k«@ÅßýûØK)êºBbn.BÓ–¦å>�¤B³+ó�o_Ý3ô¡‚ÂÏ÷œ™�1­êMíúQ¤¯Á·{űw] ‹¿†–Ä�N½Kr)º¾™â³=7C’V»fxnÎ$Òõ[ýïåÿýÓnç�óìaí¿º‡�÷mnDGGľß’¹Þìo—‘ε;z±\&B¤oÓÖ—1ÜÄݪóú3¿{ …Þ�ÄÝGµ�oö×aø¢3¹QdIYÆír˜k}G—¡i)4îDÉ2›®R,·ÓU&äº_ëZâ³Ã±ýlž¯§ð,Sy©Šd@RbM‚ ¬1éH¶ÐdAÐc$Ík ¯­ P€àÅ0ÁK±m"IÖÛ"RE*rì¢Apm˜àLœ&V· Vg‚^ñÄz�‘T/ÈA±Þ¤@p­P%…ܼ&xQÈH¡J†‰�±;cB]œ)ø4 gj B] Îo ‰Ÿ– >%òÓð)‘‘†3É ¨„FèY&èiœŸA],wNÌ  ,r°8±)¡æ,%°#™X'f¹±ñ¹Ãç˜'÷gpÛkÓ ÅñŽ#:OSïèç0øaþ*Þß³#ý¬ endstream endobj 158 0 obj <> stream xÚ]PÁj„0½ç+æ¸KYŒ¶X "´n„Ú–Õí¡·˜Œn`MBŒÿ¾&Ê:0�7yïñf¢¢<–J:ˆ¾­æ5:è¤G=YŽÐb/‰’» …—Ì�¨¨˜ùdBôóÞü¾UÕYLÅôP:v“üpiNq »•ÜÌ!Ùpy¬çÑáPªNC–€è¼x�Îΰ{ºÅ½Ÿ}Y�Vªv—¢“z2æ†*”äy°‹×t\  ãh™ê‘dt©²ÓR9A%þý'«ªíø•YÏ~J6¥éKîQº¢çÇ ÝXÞÅo_žOÖ.Y‰–>�Tx¿¢ÑÆ«BÿÝhu: endstream endobj 159 0 obj <> stream xÚ]”Ínâ0…÷y /;U$vì !Q~4HC©†öBb˜H%‰LXðöCü]u1‘@úrmŸãscO–ÛÕ¶m5y]uðƒ:5müµ»…Ê«£?7m’iU7Õ ÿ«KÙ'“å®ìßÊ‹W“Ãê×Û~ÿó÷n×µ]–>ÿñçÛWž??6™Sµ?1øãÞ{¥…·«Ãý:øË¶=uj6K”š<¦5×!ÜÕÓ¢îŽþÇønjšö¬ž>—‡øæpëû/ñí Òd>�Ëe¸«ºÚ_û²ò¡lÏ>™¥�g®f›Ç3O|[ÿWwšiÇSõ· ãðìõ1ñâäË¢GŽÌ !23¢@ÿŒxa�vìÁÊš²ô ñ‰—g™òÍ“Y!#Ý µõ4B9mãq¯‘ï[¤º…ð8Ôñ®‰×Åx²›Ö_G}×�³âï_ɶ endstream endobj 161 0 obj <> stream xÚeT}lSU¿¯íÚ¹½•±g iá½Ë‡øëÆÉ@%ÛÂø :²BßÖ²®oýb TÀ•~Ý~Q>6h “ñpD2Œ6æþ0#È4 cF ø‡1x\L| H<œ{ò»çœ{Ï/'? ¨T€¢¨‚eËk„f³cöܾÑk7»2h¥4IšŒhVb�ÄQTHS”ÒTIÐÊ ´êÑtÒ;)kÞÃY“ üã2>=+è©r¤ŠÓÓ3À>ú�­Èù`"˜ î€(5E?}¨Ì"là—Xx‡Çæi+1¿V!´´¹l�V,).~uVÆ—Âr#\jÞØ$´º›lÐì°À¥F¸Ü«…VµÁ—ÜÀ[Íö(4@ÿ.ôºy—6ºo‹ûe#4YmnØ*¸š |ºx;ovóèuXxôXy¸¨v• V \fÛÈ;Ü<,,„ÐÍóÐêñ´Ì+*òx�‚«±¨AÎqÙ'¹‹2u…•+ªM…Ë–T,¬^µÐèÙâ� ‚ Zx�ÙfwÿGí Zp5›í@¶°Ô‚Õ lÍJ™.Ù²§8E)©:ê…Oñ3>©•^iOcïÁ÷S¸"Upì"ö 1?I:×Ý«½IÔSæÎ ãÈ„?fÞǪ¾û]Év„|áÐö»Èk²½c¨¯ïîkáìƒhøœ¡f`<Ž¢ûôµac"íj<=yíÄÃÈÙ*¢ŠpZCâƒ\ÑyºàÞ s;'ˆšª@¼—{�¥a¾%¹;²œšá½»Ör�Žkø€¿Šuj¢Ý}è¨AìC¡n¹üoÒ¶ùá¶VêVŸ“ ¡X0Æ®;GÆáçñ%=¾„ó03pžEÑXL F;^/#Š5lQ~@ÀL}E’h/;­ÿzy‡!�ÆŸiйk GuW|X»ëؿ֖^ÝnÂ~ FB\Ö†\Ô“K$�0kêØp(Dz<Ûã{¬`Ïcå nëå®HÄ$…DªàøÄš&ÿ*MÐ�h:l[°©Ìº“ cJÍô�ì'c“gÆ>‹DCÏ ãD ³ºb;ú’Ã¥šÛŸßú!™ “,òúœz÷¡�;>N~Âj¥õÛºïþb>‚ááñc¡1t¤`xlÁè–ÑúÑc5cŽ2Y>éM\¦»3ÿ»YûÙÑÔÕ‘ßõco|=»xþªùVqWgWºSÛ:7³L øQ(À]îù±ã”áÔå­3…@�m=×l±…6³ýžPÀÀ€|_8ö陉j_$|˜Pßì}«„c†VºjÝÛ«çˆ×ZØP"�ÂîtJä˜DN�·³u«³½¡èVÅ}¬¼ñÛ=ùë{Ú?•rOSw‡°eH)µÊK±ò£Ýý~¨!yO¹Yª™û^yY©oà+_ÿïæÌ1´1“f1ªöÃΣÎ+†'¯tíá"Fµ6#:ù’�ž!K˜“‘‘î‚m)©¼ {¤ÔlŽÊ$ÐÏ!:WÌIçŒD"‰H4º;öÙ^šN§;bÑÝ™ ‰'輪Žü endstream endobj 163 0 obj <> stream xÚk`†6† ÊË endstream endobj 165 0 obj <> stream xÚ¥W{TWž’‰Ši—1];cgbÛí*V@Ô¶¶®X°â°"®õ-�� !�<X‘„G \A^òHÏL¥‚V¨PEk«H­­¶X[i×v[íÒ®mݽC/{vÚÓöœí{ÎÞ9çΜßÜ;÷w¾ß÷}w®óõÅ�dTŒ65N³$dqŒBiTÇ馢k¹yÜ#À�æhŒcœÜ‡›/äõEá~ÂS~¾“Ï¢®y"ÝHô† ¬LõC¿ƒR¿Gù§Ù³üŸ ôûý“ø`lö 6{Çþ% ü~YèùDm¼b}¢BcH6d…/ צeé’•*ƒ<$8xé“Sý yX |C\BŠÖ¤OI–ÇiååQ�òh­‰�&Ëh5òx…*N�$×&Éc/É�z…N/Wê´Æ4ýÂ@y¬*Y/7iu)rþ®S¨qzE¢Ü¨ITèä•B±uK¬|­Vc�G&'(4z…|ñb¹\¯PÈUCÚ³AA£2P«S%ñcôAê郦æ-^»):vqäú𢷼hÈ4È“´:y¢Â—¬Öþ´?¢µºÔ85Æ·yØcX¶ ÂB°¥Ø ì9,[�…aáØ:, ÛŒÅ`{±}X<–Œ¥`©˜Ëò�ò�ÄÈ)p}±Á A–`Ðg…�[¸HhöÕúÞÍ%ŠEÿ›Åcøcø—’�3D3¶Ì¸0ó±™u³üÑ¿¥VöP,uµÞúÈäô=?2ÚD4ršÏeç�[ð}^¶œ­£a8>z÷öÐ�ª=µ{©‘[7h\ÙÍ- -'”à s²ù´³—êS±„IÀÑî¢Ð§W‘Äê•_ê.¾Ý×{ÚEž]eÊW)÷…Ú�ôôÙ°ýûvÄwŸ†s᪚n;-]`iä‚ar¯¿g GŽBÇ(¡âP-ƒÄ⯑0v—..™†×q¢1f‘§"3ùUÞ="Jj~Uq™‚ø½q(cBKdë,qz%­6%¨·S[UÇÚ0‡Ü ¬�„ñ8±Ö ìÕõtwË)v€òÞÏA±Œôr;Ä †îpú6á„”Uƒr³¥ØšO£¥¹HòBõÚröÁ“ðÅS×î‚™;(ª¡jAi#-¸8,Å6K½c¥èüžˆcáÚˆBøkJ€ËP0\Ÿ¹ƒ>ŒtG«3àÖq oÂm…²K=‰šLczšËè­«>ì(§KKí{¶•ܘ¾iïnº°¨ØVHZVGåèûŸÌÔÃÍ›† žå1£s¤Ä!®æ!�È;<ÀpÿÀ…JÇÙŒ}Ç¢)$ùãB4_-„>£§]µÌZ¾Y (ÛHÇTúxÍv*aUðÏ×jz›º˜ŽÆÞŽAêÒ±=/W15€-‹”¢DKÜí.¸Íäï…y—ˆ‹Ü"8KVn-+ȳY­6úéôu†8*î |žqA/N 4Ù�ëÞÖ»h6/}=ˆæ~…pVÄÜLœ+C¹b¸¤â3§‡úg9šŸ\ÂH3Ú9Q ´¶øŸèÏ<[Ndöj.>+û6¼ïO§éÁöëýŸ�·Ÿ~+hÁŸÂ‚“«’=Étõ¡’âwwHˆ÷öl_Fο·þ[(¼së>¿—Eïݱ9…F’QÑu¨2¡m€yçÄ•k—·…ÓM“„,tÕ¶çhÂÿ©°Kc¾1<âeàì•¢¶ýêhR XH³œÞ$€§ßrñð9û·wGv^ÈÉ£ÑФR¤�õÁx’ÍF›4b{óMà¡<[3Úðð¢ªW˜/ðõ¬ Ša!7[$Eqn¸õÜ_ÜÐîöo8x†_–å1g5§ådÎl�j[bÊÁlº9UuDA-Y±*æXRU.C|eÎ9˜¥I$7ÓUXé݇v+·‘kïÆÀà¬oÎ~Кÿ榺í¥í`9�\YŒ¥*×å&ʪjiõk½ šúë•wn´çOédz{^ªÌle ±|µ¥Ðj1“ÙU9õNG�V!Yˆ?�Fk2S-ÔRp¯Ù N4´3¬Ë[妈aógà ±É™²Cw- x£ÂÞs¼�®mªïRcP–1Ò€�æ+«á‹�À„â:çäéº]¼Å ŒÄï�¡“îÑì*O¦–'lPg3Åð[11þkÅ»ñ=f°�Öàö¶!_vØÚߘú�ß¿zþÒ¥Ú—¢i”ó[¥è]¸yHP �a Ü,BG¶â¼ùÔ$|^÷ÿlþŽËa¯ÝrÛ&•±¸M4ÔþeÀžÆh:ðÏKs”Ìä^º¨®¿[;#ý0£±„…çá9Ö>rjoæÞùÚMäOÄÝ–•ƒJ³XŠéMVMZ µÛòÚÙ<ÆòAþ`agjÇÃæêôöØ: qà›æÃ7Èq$C�Ó茦Q|­Ô’ÄLzð¤"Kø�Vq‹';ök«€•P‚ƒ=¯˜µíÌQÈXK®é§öÑëNÎS¹íf�Š[&[¶k#zˆF¾°NÜ jÜetI¥4R„ÏÇp@‹xÊ×ñ¥¾Òëœ*õ÷Ã…7;osà?8BæMóì{J”Y@C¡˜`ù[¥õœãIÓþÞtn8‘oÂlÕÝ \‚�÷~q£ÂŠËè¼Â— ÒHM³¹¾±ñH;Oûªê â„uNAWÌêÂû�� íïÌ­¤•iåëk$©åaµo‘îþ¿BAy ÚNç•¥T5p8™ï§·Ó¼Lcn>ݪV—§Ph¶r}¬¨Ž«˜NíÑüþÜsæ#E­&‰óࣖܧ۹týÎã7Ò…Îb; Ël… ˆ2kƒæáYÀZå()q7ÐŽÃÀ^W/Ùu|4P÷Ï\¸9…OC’…‘&ÿïFŒMp^qÞ„ÊÞ0ÆâᚸÄp§�†]p>‹æó² TFqñbå¢à"‰ '®Š:ÄHø¾áìp×¥k´¼¸ E¬ÿÀÝcàn‘ÏE•2£¸è@^¬åeIn~ H¥P”¸½ùâå¶ ñ|ÊÏŸù†„xð žü’ˆË_:JÝmu�žL—6׊‹èw\Cý#Ô§gÖ=µãù˜� Úƒ2DzN€óÿ=œ¤W𣆅ÓžÞþ!‡£ù¿Ô3jÏšÕ+¬¯�¥á'?½E! À£€Ò»ŸNo9‘ó:ÕРأ Û\�Kpé c‚dë"‚'öN›W�M”¶ØuŒ½¸Nk" €­ ›F›&-h;× "V[«A ÙAÐJ¯ðn§åÝNìz~Î¥z�PÇÀC““¢l‡ÝZKÕ–”6f ž»UÙÚpêÃ’‡¥üªa&Á‰QXÁ;C,¼.³~¬¥ÇâÛvP›×hžIb´‘–(„‘‡Ãº×С=Wõg¨Ûƒg.°L÷ö¯/�¡5²u ÔÌ{�Ofd¦ŠJÙà„‚LÆü}—¼Þ¯“¾ÒðzÇ«Ôñ †å.æH XAJ§<r”ßü±{nêÃøg¸¹ð:¨­ªp‹é™¾±Z¿Ào;sd–«Äγª¼¬ÄÞ[çç×Ô^k/w”Úíeåe~³¹Cs&~/û€n  endstream endobj 167 0 obj <> stream xÚk``àP5ÜÐ’À¸ ”Á¨ endstream endobj 169 0 obj <> stream xÚ…W TSW~1Ë‹ÑòŒÚ<|/(à‚,.§V«¢¨¸�Å‚…º&HX &ÄA!7�‚l‚ › &nµZéiëÚªÓiµµŽÛb�‘âÿðÒsæœÚÚ339ÉKr—ÿ~ÿwÿï»ï ‘ˆÃƒÞÑnQ'L�æå¯��t4-á\¸±HÆp Á±N9ˆsr#Ex¡LxE&êKÄ6É$ÑVñX‚$w\m¯�³lÿkXºÌÍÑpTæN�ƒ!%†rBAü@€€x±È‚Hm„fY¤&ÁkH�æíë;c¡61UcPNóõ�>Åq�¥ô÷V.WoŠÓ¦èãb•ê„Håroe�·r¥6…o�UNÔ&(#41êø(¥6Jª W&é5:½2Z§MJÔOòV†ÆÄê•)Z]œ’ÿÖiâ5j½&R™”©Ñ) 1å’Õ!¡Êm‚A»I“ ×(½¼”J½F£Œ1gûø’¢½µºhŸ(~ŒÞ'~`�ÞÇ1Ï+àí•¡^�Ë.^²ØÛ°Í ŒÒꔑƒ:6^ïýGNûGð/“ð&¦Óˆ7ˆ™Ä[„1ŸX@øK‰D D¬"BˆPBE¨‰"–ØBh ±KÈÙ?×ÅA©ˆØK|/˜'¨ä4vE0åd‡ FÃèÂŽÜldÌÍ5²99i;u õÑíõÕ­e§ïb²`5XŒ¥˜Ä.?úÀ˜ÚÒBÆé+dçºìpŠsao;<”C2žÃq0Ó7KÕÓ×åªâfI &ÂpØÌb“Þ³ŽY³tóTOæº`²äþ�ذc¬%¢j –+œ6 ;ØìPawæC��Y6˜lK·QÏ{ß…Z¹Z‚'%GÍÅþ4ö[‡ä§â?Ö�jÉü µ' à+¡Žƒ—u9–—³6Idˆû~á±tºªzÅj�®Íj� ̳:7ñìxt¢NêK.‰ç§|'ÊÚaÌIËb–o]–¼–ÆîF /²ð¡„ú¥¶Õ7fÞ^šµ©CÊVñË¿áŽ�±ò©/x‚çÉžƒ¬¼.Ç{$æã¦¶êisÕ_jìô³",{ÏÄ:ùñ9YoANÓm ´�¼×;� –÷|0Pb¶€£!$WlǯƒåùÓþ�þ úïÝèÉ„‚ÆK`z½?v€uê[Á~n½Uâî r³¹_åÇ£m‹|±Pƒ¥ŒûÕ-ü<@Eško£#´åÊ­cí3à9HìxèS²ûJ…µÄlÌ-`vfìÙž¬ØÔœz¸¦¥ü_Bë›aZçífØÞ¬=êÜt÷�ðï)¸KI ÎÆ¹ÉëR›ÕªˆäÔd†r&ê""‹ÂiÌ„Î[_a‹e·oK�‰V¨j£ªw0Ôãt}V�áEð女¿ýðö?VYt¥LÝÚh:­ÛˆLÙ¬ªpwk•b¿©¼¤ŒÙzæ"*§�¹ðå�³ -»‹YKE]þA³4';g_š"ùÀ¶Ã‡TU3X3Y¾Ì`¨ýÄ týÔ)týþ}°žQßpyLÌ*<†¡¥ã1Ñ[?û•³ ‘ܼ‘Æ:áiÈQ`׬°Ú®:ëÌ Tx‰þÈu�²@ùcÄx�ÇšE[v1Fx,¡ìxÁ^±Šü¤E²}—úÙü‚góÈM”[Ëò3bI ¾>ÿÙ±j½ƒ^éwꛋ:¥p^—a‘¼Ÿ÷!�úˆúc„ÜèQv,âÅ ²“¹Ñ�šVO@æhVŧ҅E|¼–'ÈFÛž Ü>Þf>Ç#ÿÜœ¿w,í¦ê¡y”=ˆó$©�ð<ÖV|£ËuÔ@ù̱óÔ˜÷¸_äÇc›4q›##ŽÆ·o¶¶1ý!y42ÄÝÔ1hãyèeIêúŸÿœÖðybàÃi°n¶·ÙuÖ7|F’ÔµçîdvFžÃ"�uKâv0÷v,)_A{†­Mf�0HB�Às‹ÿì+ÄR×@pçܧÇj’æþ™Úêÿ{¿S×Lê4—uZØ{·w´œgØ0iiíd6°ªZ²ÁŒrêXË>“1IÑ÷Ù7ŽÓ‹K2Œ¦oåuyU’d4nÝÇ䦦Si/ÒÚ¿;øª€�LÌEyz6!ßhªQpV’ÛÛ÷H¼»Äd,£ëPA-ËÝ!kL¦ÃùŒ¹ò�©’¨½†ß1æ(¼¢?Þ ˜ù±L??�þ??7ÿWéñ§€Â*pø\)È„\hå@ûüŒ§â™3ÆãQxt§L…™÷gËŠåo"Þèåx‚ÁwO£¿Vµ0í5'+íôG-‰Úƒì¡h¶Vá´‹Ï ¼Î˜?œWaï»\†ˆ)÷ð,¦oÊ€õónö µÐ-ÏP®…µ»B9Ì#á­G÷ž²ØuÔ24û0˜…óÀJø:šµÄ!Kü®Ü­œÔ®mqîæ¹)5‚ûôr`¼`:8<%nsޤº~_—ûÿÌK(™TB÷1 cŸ},–�Âî ÃW¨T5§ã($©‘gŽ�¯h£/wã1üÊëW¿%ÝÝOAJ)9?Ž”Ÿ ;²vNl€ÚaB ¯…7_Ý‹?Xêr’šh-„é0˜Ù•ž¹=UaÝ^_o=xœ÷Òi»íàg‡°vh|ò‚Ú ¹X'ÿ!è!Ô3xl“xbMÎg­]]÷×áÑÕLr2VÑÕ(¯–…`² îÌÌ1fìaTkÄÕº÷Ú&Óx¼ßT,XÚ²îÀ.ö\Ø‘¬nÓ¤ÒÜšdiYšE®P%ÏÁ¢é˜m�½L¥å¥ÐÉ(ÇÀâ`rÊ,/4™ŠŠ™’’¢²úzéúKwÓx¾|¯ôôð|tfYAÑc/7 Z¯ÁŽkBn°ò3[­)•LÄÑØ‚ÕÅÒ%o—œQ\~€ªAX°XgfÒLûQéÜïúÑfå¢=;™}9é™Ù9Ò mTA4½OFxÔ8‘Ô”Íf7X³òéö=í:µbž/J¬èÒ2‡²Œ¦í/€’@ͨâs¸JsòCTI_€×Jáuåc¾¼I;„¤8ÿ j ³Q]Ü!?¯#—mIˆ]­eà(¸Ù±„¨Iãĵ'æH7󪹃›$®w _Ü:qñ–cƒøÛµS}©ÊP‡*É LÔÆr"’²â€—ûNúmX9wþ¾ú 5~")Ëï{3È WžÕÝBwìŒi¶„šïtµ4¹Wiô^p ø…h/­]Ôï@dÍ1”~„ÍÞ…Õ}18žË?²Krã<‘†Ž›ˆÌ:Võ�˯CÅ)EEÆ º¢U±PÉý".+È/¾E;5V$s“ùØÎÝ;! EÓiýçYôJC(w_;—aZÅñÁõÁ(‘v3‹UdÞÞ÷Óò÷Hó²ŠõÙŠ}»ýð*L@Uÿ(Ã~TÜZdÞÂòÁ«ï5qja~f ]RŠíg{ ²Wˆ“ŠJø]¯É+¨,dÁž‹æ^zatÏíªs7AænÿÚ!-ˆì¦j¸ïx«ã¼I¼ [LîÃnOHÃ�âö’”ÒÈÄg¤é·*¨Q ú£ uÍz¤¶õ†KX‚§Äâa¬ÇËû™—/øç°˜¬/0ưøö«§”ãAkGË<ø§%bŽãÉ©Èyw)\—J˜!¢P­l0’ µÁPKž)/Ïd6í/,¹-“ÙòO•¾o.*Ì3åˆq�ì­“ÿÍp„ endstream endobj 171 0 obj <> stream xÚk``à`J|0'‚á�« œ, endstream endobj 173 0 obj <> stream xÚ�ZxǶ^Y–Ö€1àEvaW”z¯˜Nè½»!ÛØ²å&ܰ-Ù’F’»Ü‹l¹°6¶q¡÷^B¤Q„I( ™ãä{+ïÁͽ÷IúÖþvF3óŸsæ?矕stÄ�ë¢Å+�žA£G _!óUÊ=Cmwçr½¹>À™æhŒcœÔ�ë+äú9¢�ÎÂfgÇ67´§·Hû‰ú`˜ ¥ uèÕ�Îýøÿú:°Ýèæü>æä€ °NXW¬'Ö{„ý) œÿžhæV…—lÁVYPø¶ð¨1#F�7KºÍ×/\:fÔ¨±Ãl×ÉR·Ò…žÞŠˆ°€mRÏ ­Ò…#¤‹GH—("ø»Û¤ƒAR/™Ÿ§ÜGªð‘®’­“*Ãd¡aRßP…28lðé*¿maÒEh€”ÿ*“Ë<Ãd[¥Ê ­²Pi¸ŸL:oõÊUÒ¹Š pé¢mÞ² 0™tøp©4L&“ú…‡8rd¸Òw„"Ôw¤ß'l¤¼½SØHÛ÷†Ï]ºdÕðE fÍY²rΈðÈp©�"TºUî¹M6â-Ó¾¾±Dè)Çø…õÆúc°AØ`l6† ÇF`#±ÑØl6›ˆMÂ&cbS°�°éØ l&æ†ÍÆæbó°ùØBìcl¶[†-ÇV`+±UØjl ¶Ûˆ¹c˜'æ…É0ÌÛ†ùc˜ Ä‚0Œ…`¡X8¶‹Æb°XÁo‚ßÏyWñ¯¹Ø\›Ó±.Ð Î î;¶;\: g '8ÖŠº‰Ö‹®Š'á¾ÿÁéËŠ;üÙñ㎖Nx§Jg¡óçÏ:Gw†.�.Gº0]|ºÜ躥ëÞn.݆uËu]îz�îNv/ï~G²\RÞc\�Ú÷ú¿—ü^NOQϰ^Ã{}MæP¨›½›úÌésœžBÇÓ§`�‹5°p=ËmŽX={°QøÒØÌ:ƒäV‘(/E›CÅhÔ±) ònû)j�÷ŽÕº^rüW#Ä5"_j©4êsôf?|O�ø.Ò§Ô©dàJLËqcð›BÝa¶)ÅÐ^¹p•9š……÷š]k¯AïË_Xˆ8.âžädèJ|y¨Z基/�†›ðVÐäÛH7m]_¸‘š† tb\¸e* ¬û¡Ñ"Øu®ýAÈ�…�$9 @“¨MUkéA ã}¨5c÷Àñpâ­ÖcÙt¾õŒ—FG†GTW–íülzÓG¨ÛH„¡®¨û“AÐ ’µÐ9‡æÁ‚çPñ\p÷¹®â\$5aAAaaAAa5554ºîøÖ=›‰fl‡«Ÿ ೺ë%ÃZ¼ý¢‚CBŠ‚ ò3rL´aªb‰û&'µZ§K%“ÓSÓsoÜ€8íbM¬UÀ }÷ÐS÷Th] ïIà DÁÑh:Ýæ ¯_3¨|™¶ ÜW«úˆ“sb8Òp\Æ|Ð #—ún ƒ#V,H oÒfÖ1Ün¼Î�y€~*>Y9û³gYöøi¤=NUìIžà#••·ºòö+¹DȸŠ,>')óÃý†…o)’ã A•«)Ô±ß`$AÄãAP|qß®Z ³'f@‰cЪ¢i¢icॵŷrwÒ¢9ÕB6ÎÖì£Ù²ÝuÇ©úÖ[XÆ ´Q¤‹uÏgÙ»,œÈãî}n°À¡£Eh•B“$TŒF„†»¡êÕŽ–ÞÇ™&0X*¯’¡GÃd±!”ˆáðªUˆ)d,bTŠÚξ6XÙkƒ})nšÀ2èfT߆‰—^FM’!%Q«NÒÒüFƒj½÷ÎÆp&ð ¸Ô@ÂZ±ÙÊž¬~„º!§‘ø+ùûˆC—}PXÂ,€½$(A gܱ좞å j+ãb-�½šáˆfÁIëp¡UŸJJ#A,Ýö³86DD”€†ûQ\PJ´Æ‘oÛA·ý(ÞÑÞ–Ïp?‹ómm.Ö¾¼‰°p?ëÊÈûÞ�{¡ØßB4rp%vœû߯)&ôÆúë ‰jy4 ë�+†�¼zêîâ?ç¼²àÄÿ¡ôx˜!&·ÛÐY ‡XV"º�§‚3€åD,w'Ë,€Ž—~øN­Ö.’FŸº5s&¬éK#|ªüº†oQ�ù<=C±QÔ|hšv;>Skj`àWP̢РÿþàÁ½Æ�\@ǧFÅ…’á…U5¥"x.=-0Áb!¬�K%§Qñr¾.øóeæê}Oïö`C𩚗2šnЕ6øSyø[§ÚáWâ7Œ/ákTSé¶<¶¦vl|âµ�¼ ž»~ûLJ— <²©éM 'ĉSHjƒðI¶šOKæ×Ës0Šê뵺] Ñs÷‹¤*¼2p/(‚ËCvî*­¶ð¹ù ò4~Ï…ÙGöþáÈ .?AŸõN…£a¶1¯eÛÌ"Å·$Žÿ8%ä…Ði¥ùUdeT©B²ö¤âÔWç/> ‰îÖ~ŽoOÁYÚI3Äæ—ç—¾ºÔt‰¸Íeñ«÷Q‚c2pžHgHÉ0’iWÏædÑŽ´ÊôN,® Š Êw±AËÈñ]Ž*ŽŒˆ�OJ¦Q_ä"âÂq¢þÝ®¡Ãk×=Ã/ž]ëÛº2ŠŒŒN�´µcFQM�N[Ãdzˆ�çˆnÌË\,Ä'Ü {ª}_˧µÙÔd11ª½r؉ïù?Ñu¬˜¤ñ¼¨­Ó^†/ñÅÿ-DŠÅv¿ñQ` Há%¢ÚPÛ×Äý…—ß½v!R/¿Œi5,¨† ß_ß±ËÐ4qÐE%3HÑvr§DfžWÃ)4íuúÓàÁ`ÓÛ¸Œ°ƒÍ&À�*†kÐãPý§ƒ(.==1‡2³Li|"´véÛ®Š_ï¯ÆÏø|Ùô)Ð4ò–úÒîG•ùåæâ?Ý{‡¬Çÿa‡É¢™ïbgš¶Pn›<+˜ßqâÔ÷ïú©ì_î5âлwÛ¶#m$Õ¾ùª¹ÉՒ׈ Juº¦\£×E’m%ÿÂpExzŠ^—¦æ†µ=꟭×eRù ³„ááUàÀ3º�‡Þ°Qó¯IèµY.ÿ‡f©ù—�K”•ÖI[Jtf+®~�@4” Ñ<4�C^|*�FÁ¹p! ÇÂ-ô€| *F}&ŽŠÈïa>Ì…?»ýì?eÛÒšÊÂ�²×ƒ;oÛ’·¿vÿà9ꌺ A~_H~ ;Àο<æsý¤,‰/X­t§·(݃ÖSîeûƒ™Ð½à\ÙŽWì¥÷W(k¦öîQzT2•`¹Œ´—\#{‘¯‚¿r{°øh�©‘áNãÀN¼x, äxéPy”iãi_?š°Qãw ™jþÎN�özyw%¼ÀºÖ?w�ÏàÊgÄVGN-y<è{Ô‡FÏß ïN.‰p�!öÍSf@�M€×?ciÂѰ¼½œ¾'†cAß ¶TƒÖ°p˜™ëÅÆZ\Ÿ_†…·‰®/í�'Èqš§»2‚¾„¿Ê,W3ÕîL›ßk‡9¡èo·Nųñ˜ôÖÕ_¿º=Pç9gzËJ[‚i^ÞêKI†Ý�Ôª9B}qn,ñkèõRÔ>9-„wP²Ä ÑE4ê]àr8œ„n»¡ì»Ñy¹À`$3S�ê„Ñó±Œ^‡â‘p"9Í„:Ÿ@"u9{wa•‘fÌ|c`Ã�Ü �’ë*ØyѰËÒñŸ$PêÔTµhK¢˜ÇƒNñTF¢é>|qѹÒqñ@«!Õi©9÷?ƒÄútÈ…Â;¤];¶ ÇcoëF>I¼´è»n-¼,ä*ÐÉ+¶<¥Äe£DÕq^¦PÈ©ßÔu{4:]iÙScfм7,Ë—“7%Q e¼‰r[r�—%�®Üþòfë¸5|À„+Í|È3ãí!žuw!J¬ÁßK2€‰×æ‰É:z¶Ú/*”Ú�täa,w3ê↺U%½U\?w�ü‰ï hôéaE½¬†«6ʼj—¯+âxa+ØVÏìöòùäBàÝ"£‰#¾-'Ô;©ëE·ª¤äÆJæ†}ˆÑHsÅå ×l¤ 95 ”ºSÑû¼gz¿b–ç—žß%¤Æu“ÔÊk<Ü|ç{ÄÒÐÁÆ#Ì»xäm2'=i½÷u¦è ´FB*Êv˜‹-¹µ6ãkì9,œÎžcá‡Õ‚“?½]r©p‰äé‚[KiÔ�-.Øzü4yåø¹ëpŠMÚ’A«õ@m¢ò@z 7Ûëêd�.>™ö[!ª ôjCña7¶ï¤cn׃Sê‘ø+ÑUÉ;“«}œÊBrüýÉÙëgM šž~h ½ü¸æ¢®Á)G—4THŽbÐ&<$›2õS& ŒiuÇèmìEß{ìpó1tàÍC«Ì†®o‰kÝAèu0ü 1 ¶Áî’c�;ãsiÿÚ­YžYN+MóóN“õ•-w¡Cúh¹�Ö'šx)d_ñ/ö§hA|­IMHLÕ8U˼À ¹Èæ¯ô+TT)™Ú�jõç±NÄæÔ[1³Èu~ÞÓ&úžú6’ÎÓèÒ^®´§}¥éz}I m0Cq‰“çÞ}º2 âû?ýœ±+<®_ùíÍ×Öûpæ}Å}¢�Û =xþó3ÎóY·1‚®ÀùÀéÚp¤¢U½ÍLïð[ä;Ì…;³›Îºœ„º# IP*…N³2Ä (üéGØ“­—lë£}é¥�›S©E�g ÔLÔp³˜¼^ûô~á~°˜¥‹}Àº oŒYƒ$¦ÄlUljB‚†F?þå&J‰)€Te'šòÓrrŒ4üñ…›(�7 ]¬>|4.Ù×°‚ ̺³,Ý{[grë$‘6Å‘H)²ˆáøü‚:8”*®Ú¦,¨ÂI~Çl±ýho›Þûì§ö?³ë=o¼Èße+pJA~qm0U� -ðGãóm̤²À)0‰…‹"\»Ì«~ÒB¼€ß®’S¡«ð™�2ŸùàA YØŸEým s\¨X79P:8ÕI‰ì·¨FŒº<Œo¸Z}õb»Ò¾ �à€rØñ—óñàßÝqÞÓ%·]ï_Fߪ:}åykìÉ¡§/�îoެaKÍ5‡7�ô!öR^ÕrB9:^»<Ä� ܸMªsÒ%…i“©$]².�Te‚"z¯øVã¼Á¨÷Ü w�Egü˜úÖ¼›l. ˆuõp@—~µkæk�®Á¹¿ÿºþýñïàñ‚×ún|5š˜ìž°Ã))yPRh¾øù3é³ÇŸ’P<ú&rA¢™#Ǭ< ŒEõ¹-•Q•~IZ ÓП”o±ålçFòóq±B.�`›/ÊBްV¤Î³ÍVÙŠùÙ�@# öÖyt!M-ÏcàE±†”<*/-;‡¯Ú߃׳ˋö\âg{‘§ÛÎ=fCÙÖµøE±î…ºb \Hµ;òS]©$©Ö$Ù ióBã¸8‘.M›‘Nî< *íçÙ ºØz“N•ß\Æ<1m3ÑxN%Òu™Æwö=öUZŠO.7µYE‰FcB•oÈÌã—8™K‡¶eü¯›<;¯äîˆNïÉi¢x6áí$` XA±u¦Ðº²ÝRÊ �’a»AgŽ "Õ@›G�BÙƒxC¥æê édU(å×Ñ_# j·Sc¡6.‡IW›3#Ç£”žÃ`©(…/�Ò^õå�jóp®&€_­+úC›nLâ jÈàÝ÷ lø5ŠTiö[F»�;Àoгyõv�Ö~D X×\NOh¸<>\‰e«£ 5á "áÌ�»wª¨ìÅ6´°éXmH `�k ú8~y„´L›CÆ$Ä¥¨éÅÓ¦ý"J̆ ²  »TOyü1�hû&½!˜ï~E¯[z€y‚$›–í¦½–o\¦ÝÎWņJV_Iýd+#‰Jcr^i®©;÷9ýõ¢,U^ŒšLLܬ£ M»Þ­jÒiw2¶BËÓ\|˜9wÖµä±ïí du…Ñ¡d‚N›OD:¾1‹Rs´iide#(ù?Ay°øñ[`H› t™h•R1÷cЏ–Š#6-Ë\HVF†G(ã·´ú¾ÐrêT gsÓE*�è )îfûá@ºY�—ÿæsˆ“µ‹¤Áo×Êeî²Ôº1hez05 9­EƒÄÿû€Uh„¿+ékÐçß¾â,ê�ð{ì{çá+Н‘Äh"â¤ZZ•Hkâ@b<‰p´ ŠðG·Z?9T èWZ?Ô™Ï/A_Û§»‹ußk}/Ä·jú%‰tZ-ˆ¥ø9Eâ'w›ÏïlH/¥½´jE é_WR^^¸ó̪֙cWxëÃ=K×SÃQ‡uHðo‘úþCÛ|fœƒÊßÀEí3{qw%gÃöy¼zrUšŸ“‘Aë =†ØT2 yÖ¢Åt¼]Ùa™n ;Úfþï¿Ä‹¥×¨ÿ¿�mcŒkì¶èÿ½zÛO*ºr”óÀ>†�·ýH"ÁUiæfÁ S†YLwt\¥pîœ;±/w2ë ¶3 ã9ggK‹1Ã�a4Ó3Òœ;ÿ'äêÅ endstream endobj 175 0 obj <> stream xÚk``��øŸýùõžŸýeÂ@�ô. e endstream endobj 177 0 obj <> stream xÚ}X X×Úž2‘2ÄjFg¢Å•E+«½nX@Q5([0JØ‹² †œ‘MQ�EEvª,êÔ½Våº\·ÇÚ«×V[[ÛkoioÛoâ¡÷¿\nýýŸ;IÎ$gÎ9ó�÷}¿%#!lm ‰D2Âi`bB„nº‡«Wb|´µËW#ŒEv¬À'T6Â8©àd‹'ÚI/ØÙdâ�Ç�¾cldc B’:ÂÚ~ú ³/~sÈ´s¶vœ°›@P6„„�à ¡$¾#@B<¿É‚èÄHÍâh�.969c†›‡ÇÌ…‰3’b7h“U3<<Þžfmg©¼ÜT~Qq‰iú¸XU„.Zåç¦Zê¦ HL{cU“uªH�6">F•£ Ö„ªRôš$½jCRbÊF½‹›*X«W¥%&Å©Äs’&^¡×D«RtÑš$U²V£ò]¬òIÔ%«üc£4:½FåêªRé5•69yãlw÷ä” n‰IÜcÄ1z÷øgƒôîÖy®>Ë‚]ý/ôòvKNOVÅ$&©¢5ɱñz·W1}ù‹�1Äxb1‘˜DL!¦®Ätb1“˜GxÞ„áK,"–þÄRb9±‚"‚‰•D±ž'"ˆHBKÄ „ŽH•ŠÀЇ3ál…Ø–0‰¬¹HNØ,·¹!&]$mµk«±='s�5“óÈ-d;åI}#_ o"1ä§¡C[>¬Ý.Øîçá ‡›‡?þ³},´Ù Ÿt&ð°¬\;aDI«…û [Ð6À„v5(!ŽúúýËØ%Ûo{{}GzcKk]Oszµ¡˜Ýq°Õ´“¹Ý1�‹¥Þ7àÒ<—}û‘ò3¾Â^¹ü°òÄ÷ó0]Ï¥›ME ÌSñNÞ^Tž‘WT´5Ÿ]¼\vbé¢_cWì‚#pˆg(†e ƒ@q"¡<`xHî�‡rE¯¶#<\« ïÐöövtô²¸Ûöµ>q"^� !ƒçHÁÜ¢øKì¹añÚð¨FÍÉÖÚj³™ÍÇ¿�Ô yA¡ÁP Ì­Ì-ÛýËàDíDívðPÁ;ŠÚžlê©k“wèÚÙÄÀ�bü¦ÖÄÙ?uâ"¼sQrɲCj¹ÿR´Ä£,öwO2+Å'4¡�œe¹³ 5sXoÛ¬CÙìïóÈlJˆoA»9‹'¹»µpöñ‚´Vð곎@Нp1ÂÜðHÞvR¿¬<‚c¢", E_{Ͱ"ÑOŸýLDÏ>NcèãOß{&¥ŸC»�=V­ÛÄ>Ns7k˜™�ëüã8 (úžÿrÅg*xEU�÷µ×§Í}©ªÿrI´câ×óÂ}±½ýtóix 6´ƒ¥ßB+DØUM ŠfhLjUÈÉ©÷Sô[5ÕÆ¢®É`2¦(\¨�ñ‚VF‡îÌ1šRœaå™b4&X:Ç /B‰L’š¤ç›�C‡zkÏ)dèæø$ŠöÏÈ4gp:³ÑT¯j)¡pྌ®Ï®0÷0�¨¼�nSõ&ÓA3K;˜÷£ƒÌ þ8«÷5½â}!�¡›X+Lwþ;L¯;Ÿå—œ Ù5ð€«ÔÒß* O€ñ8 g`OÆ18 Tø-HƒL`aD°Øu·Â{ÛŒÖk�wÊJf¹×ÁÏ"¹úòo×W)¦»‚.�Œ~P NRá0è tïÇïàw=&àÑØá«Iðüéa?Œ`±S¥b&¦1�€xx�¬ng?ÚÛSwœééùP[ÏÕÅ¢àµbÊjÁ)ë†ãƒ2‡¬»ÐÙ °™ü%žÍx¾�,ù· ¼)à@~†pØuäûh.ž*&98 Sм…ÖØ‡Cx× Ät×%:.‰À ËDF€-'„' WÀh�ï°óü�øŒdö¸è—ÄKýk¸Ó+4P´W޶÷Hn7S~z‡�FâqÞ«ü6«Ñ™ulÎ.dÚ«-E�ËÙk2UU±Ý]§vÔ3W? ÀŽb Âé©O?Kâ‰TpÄÙŠC bu�~#ÀI¾é¯Ùß~¥„Õ'a:Ø€”ݽÛd*QVæšó3#b23ÄÊ »'cÿqJüF¶áße1uå›E{™² så/x"…oÄZÞølÔ÷Y {\Mgòs 9…¨¨úC±S;öÆÓ•xu(žŽm°”ÍÊ2 •9†²êž�ªkX1�»7€ÿ¯"GÖè×Ò -ƒéu ‚1?Á{ÂéKú±åß+ê7£ÜTcî#«.Ô¥$0ËònôrE•ù׌%›¯·„¼ùäå+Ê~ló^Î8ˆÞõÛK^;@=L�Èkç ¯-0„ª:‚b[¸V-J÷R.Fk®Ç²)Gú¶u3¿íz´‡Ã¼à¢BïâY,–‹Ã‡’àY<'@D@÷ÂÓÄ�ÀþC°§' ‚­âôʦUÞQ«ý“Y�Qô-<û5?“º4hÀLXH]ßö?²(=S§ŒlMkjj­ë‹ :‡‡ð^�ê•\z×DþnÀzHgßóØËâ -²¨ò ö‹ÊÞƒ}?Þí�ÅcXývTTÇìC% ,¬£ò�ÆÜvÝzÙ±~åkÅzdáÔñ~mau)Üñ5í[A¢ÿJ¬éëS廳öo S®ÝäóÖ<<­\òÙ#*Iaô¨ ™Ã~T:Ê«)/..-c�“­¹ò¸@”ã¬>�õ‹¬)h�ë˜VÇC7 û�.¼ *EoZ‡ö Ý·cÎ.yL©_%¯ì{ŒöÞ>¤ .a³L¦ÂçvÞ4s[J�fwmÒîˆb°ÂoFÕn¬Í亴‡ îl–wÜÞ²\9ߥŒÛt«7›­*,D›ŸÛ&´­´í®ciÃ�jYܱS¨–i7E‡ìsÎ缤‡ÓùxÈ“V‘à£HµV\žd*.�ñ$ÈÊ+î�3sgàsì*Êã HÑyæ¼ØΈq>ÿŒ‚·*ÞÃd…Uôb]ö¿<¥9þ ¤š‡¡<ýDpÅiu(å§O\�.5°Ðy<‚Ô”qҚɓ ò ¢ þ†IÕÔŸ=wËJpÁiè?+y¥¥Ö M-ÝŠsAá%ÿ‘L5+4Äk®aÿ¾{åÊfJu/ån¢Ï�±s({‹»|,±¶Š�·¬¥ÄB«;…OyI=P J*ÜƉY«HŸ`Lb<¬uâQ¶²0S؈ih��áIì`À¤xíËÆ%¯•­M‰ó}ŸÙ\d2çsåÛª:”mú}±‰ºôèP>òÂ�OûÎ5²'„ɪJÍ¥—{ë#�±›8Vü û?ÖgfÇœJay9¬««¨$Ù¡¶Á‰vC�Ý0~(�ÃÚÌf“©x»©´´ý‚�¿£g׎JsÙöâJ³ÝðAëß5 endstream endobj 179 0 obj <> stream xÚk``àP×É`TŸs�ñÁ1&E� endstream endobj 181 0 obj <> stream xÚ•X xSUÚ¾i››j‘^‚š«çA,P6eßd†‚ H›¶iÒ6MÒ$ÍÒ5ÝéMºPº…6Ý÷}ƒ²9.£è üB”D\FùÁs™ÓyžÿÜÚŽ:ÿóüi›ôÜ{r–ï{ß÷¼ß>>„@ xxÛöíµf›aQðü—4ªHþÚ&îqî ›?àÁ1NêÅÍðæ¦ùØýè9ïaŸ‘7ÐG÷tÿl>A‚¤)üû�Sádÿ'ñ�¤ùÏâ/|ãÿ!ò"„@L'hââžÀûÁ4k#5áòÍ‘rµ!Ú`Y¼ 8xéË­E­P¤‹ƒƒ—ñï+¤/-�n‘EÄjLúØh©L)ݲ@º}�t‡Æ„¯FKçhÔÒp¹R¦Š’j¢¤!òפ z¹N/Uè4 ZýÜÒe´^jÒèb¥øS'WÉezy¤4A)×I J¹tãî]!Ò µAº-:B®ÖË¥óçK¥z¹\ª4´+.4$(htŠ…Q¸�~¡j´“~!ÿ½ù^Ù2Ûæ—×ïØµ~�Ál�FitÒH¹A­Ò/øMXÇ›~ÑÄãÄ“ÄLâ)b6ñ41‡˜KÌ#ž!‚ˆùÄBb±˜x–xŽXIÿ¬&$Ž©EâPÅžò…2H‘”Ïç͛¼iø–ëW`©Û6¼Â “‡©H.ªÅpjðOÒ°ˆ} €KE=Yå`I�MØ3’LêíúA@�i?䨱3±}ý™­4ôúùp³bú’­;¶¬S}1.ŠÞ}çÄûçßÙø<xÅxÏa@í5oø¾V|o¾ÈÁ„‡³)à_óE)öˆÁAû€¬tÁfþWãÝÓ¾äbÂÄÝqùV€.`[[%0XÔx _èitt4HàŸEoÛ¶vЇšŠÛz5vã:D%.a­ªl©q) %z/k¤3ã³â­yåL{37?Ô=+RÙß|W GÞË:I×¶Ø{™ßÍ ?À(ÈO öÙ…yÇ|á³¢6öøîvдw[¡’6á`ÄÖçàèæÙãâ$(XY¡ê1€½1lh®­iY5z4ðsã¤Õ|½ûÏ1v¸ZØn«hsG×q{�gáüÔ÷¼ñ¼êao.)TÜ«µ›šqÏÎ �-ö¾Í õ¤<ÓÅük…HQœÖàzϽ±ï†½áéñ½|¾"înÑ`´4c´ÀÿòF3&´×“}‡ÊðŽ­.Îäô¹a·Û›K„kÄýj[ªUkS‹²×&Èég_¸g@éÕ[¶¦œ1XºéA{CiQ5Ûª0g¤edƒ¼¶¼ÌD߯˜Pç>MGB$A[ÐVˆ?át8é«ßzÀöŽ+ð‚>ãŽý…ºÅECRÜ¥´g™Óòô -Ç$ÛJ¯ÚtöÚ±¦»p*Cùþ…FØë’›é–†êN†ºõÙŒ‚}híôÄbôг gvÝ®6ø\�î�OxÃkœ—x0¦U)Ó*£#:ÕÝGš»ºú‹Ï`L ¾=~�ÿÿ�ÅÞðN‡ø¬l`_¨.F)ëÐöäÛì i_TZz®oÚc–^b®6ÕtÞ} Á¨N ñ¤�N· ÿL  R¹2,qöD à’Éût' šNÖ«¢Êå4òš„Ä U€¦~;÷×S}5�-€Ú¡É?hí§/’Õ­„èy¸DLu¿þâúÍ»Ï óñ‡g?zýuÀËD˜ nq~ç†>î÷7õOÎ~R|]TÏ6F„³z=؉ò`ô…Û “{é{c=sCT‡ïFå&G°ùÀ-$5õ¡d‚=~àˆ­±óÓ–‚´ðÒÒÆ:™Ú™ñÁâ� '&)¯¾’Ò>Oþü.C�KÀ)îg.!#7!¼iz#SGoÚtô²…�]dc�mŠ6ÿŒAþsg£‡Ñ”_žÂxüÄ÷MÌ28[Œ²É3•oÿ}üÝ„¥eýÛÍÿ ~rC?¼1Ì<+g_•�ÑøZFdúñœG:[174˜ap7ô#à “ûìMu€ßuS„<79 ?|Ë<ºãAO û]w1a6`²mãNŠ?~.ß²bÕÞE l‘ȬÎS(Zñè7PðxL`élÃsÅÙ-L0ì‡>dUëZúô‘gÞ.j)…šº¾ÙÙÉó J]°ÖØã†/¸Yw”›â¸˜ÃK™‹0iQç)£Z0;ȹi2Ù^zõ†ÛÀY—~ºÄP>ï'Ì9Ì ŠSÚǸF�àÙfÌÌÀšÖ#¯ˆ ‘ÿ“ˆF›Ñ¶»è18ùd_mm=cÉ?”ÚNSë<ÉÇZIy5Öá!ýe8ÿbße¸ér`ó§ÑÃ…ÃׯÕ}JM#¸CÜtq£©{§u«z”Yb*Ãèg^Z½4üpìa“ž”™ ‘¨J %)€ú‡uÛ¶ÍVÉÒ;[qB§ß9{½Ïüö«- 8UV·ˆÞ@ZŒ9Îd&£Œ­¶I ìó‹A¦£#µ—þÞuùFKfsrs¸ØQP–ï_Ò�UF×4;º‚ñk‘ûUNì•9ù—þþ'ûdû˜»è¶8|�b! 6Y®ë¬<ÔÒêdu%¶Oèá_m«™€ÏŒ‹=B,<->œ^‘VÐç0TX–tÀf¥Í†mÂáôòLÖ£þ¦e&§'H´õ)Õe¶²J/Á7…eŇKë$<(<œþνϭpã¦.r¥½b[@ ÕäÿìZn0ë\.¢æ<`¸ÆÅJ†êí‘)'´À…$uºŠ‡ŒcD W�7Îw?Q¦ÛPtœÈâvþäžKV¶ñ"«®�îd0žÐ2%‚ ` þ=*T±IÙ* JEc áãqÇ 5ø,Nå…½�mÀÂnÐaa×p²¢Êv�%2hñ(ÖøT´ŒÈ4ã-΋ì?Ä‹õèhØÈxs1÷�Œ&?8œ<©|à'�ÈФ íËžõ>á¿.Â|–ƒ½âNSQ,àd¢Žš¢NÞ3!dhv²:�yU/‚ÝÂæ4­=‰ñì<¦&§ƒ‘‰bM91žu]õ ЇP1\�èkäZ92ô᪒ªæ,Žý¶÷ýܬw¾wñæ…›§=N�âªñBÌE Í¢Ú<è·@#·Æ¨Ak¢ö°ŠVkÓ-†ú¢.Ël·Ð*bªs°ï)Ìxlžq_’N¾6H*R0ðyuêj×P_uIÒ.€4"#kΉ•àôVñðà»%Žv»Ú=Ô[sh´“éA§Ê âCõ÷ 0 ‡*‡»0ïYãi© &Ñ n—°'5±0ŽÞ<�ªYâxëö8V’¸`®Ù%Œt8ÙVº»¢pˆá’«Dÿ™1½êÿ�^íŠàõŠÚÔÈb|Ò¼ZaòzÔé“Ôÿ;µjþÿ¨Õ¨o|Ç ‹0¾b±O†G ÍhÚaˆGCèh}<Ü·74Á£`y‰øÛë«àµt½e%ý¼ÁyÜʤ�´}ùŽä¯¶¿• ��­¥—éó�Y¯W0åûm/EÁ»nXÀ£—/G¨ Ÿ±¥ÍAšöã3Ðzÿø#¤Àòbñ²?¯ß¸ñÏ®_ûðóçN¿òœç€_î‚:—;%lŠ9#·Jüýšo‘@êÿdsàÔñÞ—ãÊ Nº|ã\ʼ±} ‚ºȯ¶íÅ'©Êi<æ‰þð›ÃÑÃpî0õ脲)/þ«}ßâ^ã«ÌeÃÛÜ«ÝØèÔWV®æ'q¿Æ–šª¶½a=�š¨o“íȉ3¶C Lzƒ¥:¥Ü—ú…ø°Ïyº_òõ‹×�?®¸'è0O ±ôgõ#‘wŸ'«ZlºV¦Úb3Ê%Ômëf[\u,ˆu¶%öÐçš>`Ð*ø½8Töêr° î>CR׉kƒ{B=ËwÉù<Ã9n¸ô'œäÎO\—v|ÉÞ?%¿ú*pˆ(©GO¥$µ†wt ÕÊÓ\Dýë&œÅãØzš¯É§]ûkHj�¾ÞÒÔTïl˜QM.¸Ë}]‚·®\ºâ¸ÒxÅ›SÃÅgGS+@ø€¶x•s•óQy™²ýˆäø±£gïT-U�øÂЬÞ$b»'ödúÌ”øLÐñz™ŒFÂÕ+—n<¾ñK=}´Â¦œÏ-/HöFìyYVX§a-¹}l¥o ËÖFÒá6½�Ab‘Ù®î©+)o)ñï§œ¦á¤K¿áqÿ]Wà'.˜ë¢vrápºø.z¤>¦Ìv ãjËê%”´¾½áK@­¹äÐ “½ÀÔ;º¶ó8TÕy-ʄ̌Ì\P%‹°Yhês´:a™bþÓ÷)ÌP–+m¿$Z©]öZéE¨ËÎ)WÑ|YÃÌ÷,©´ÊÖYT'Nå5ÓpYÇW§Ènƒ’n(ÄRq`BÙ0•”§gD2ëDcÆ’#²0ÑxZVM¨8N,²y† àÓnÈ`’½ ×Úd‘¬Þv³¯géM¶ãµ L€A¢±APЧdÝh-f/¿(ò.Ê+(‘œsAþÙgÃǾ½_@öcP�ÅÚ½Ï�Oµd®ÔS>&oä2±�˜ =hI�Z¹ÖªÞȶ´X)³Ÿ÷½å�s.ÆÖÛWRר}úâ¶š/(=O5ÐÞY"¿ÿÃYV¹A\ÖqùeXÀÓžM±Îœ.–™5²j·JØewuH<5îÓ�®Ííe 5’'”•9Ùº­Ö>XŠ/p¬°{7& ÊÈñµ"Ë=yß~�ãUO%„ºƒ°i¨Ï¾?v^6�Ð ]Ê+êmõtm“½·œ�^ðª°á¾1¨2¹0=W»©`®˜›)îÖäq�K&hñ Ml=ÓGÊkv Ï›³K£è4£->•‘#q´ ûô”Ðä¨aô‘BgS!ó¼,l¯áw‡tç6CÀýÉ8x“êýO»\†s CXñÇ»l$¡Ý͵×[“›T3m/,-8,¡´­ÆZµÊlTïï {ûæ)øXY!€s¹­cð> stream xÚk``�0ÿ›lº~ϽÆÇ.lx endstream endobj 185 0 obj <> stream xÚ]R[HaþÇ]#uZóF´êøg&^ÚÙÕzè)+ºa®Ô“°ëþ»;í:³ÌÌzKeM©Ýu×¼­hâà%IÔÀK��—§¡§À‡¨§"èMfl¥š!ð¡ïÀ9ç;œÃ��j5À0,¥ºæ>Ód¡K :#oqS�ʰFÊ’²8!@ÊÁ$'�SI¹jâK•Êú�‹åãª×¸ú¨!¶šÿè×a|6سd%�¦üÄså&nÏSx¿NÆ $‚dpd� †©±ÄãwwlŒmˆæ)¾­”4.—3ž6–r8yXj0\º¨ä«°Œ„U–FÓ¹(h¡m°Š„5$41-ò”‚ ­ÈiqÛ!c‡fôz9ÄrÐÁ2^WHB³“â` ú \YäFÙ —¶!òNïÖ×™a%Có°šjD4‡ N!‡tò¼çš^Ï{$Ã:ôvy‡Ó»ÿ-qzåNWyÏdÖUË+Lu$ßÊC;ÃBâ-”›#ÿ×÷˜›¶Éâ2Ê€U%K$CTŠXjÐ�©ŽÎjb¿}‚¤RÅôí7[iŸÄÏâùŒáî@OWàiGAw{Šk3»;ƒs³ÑÅèRÎ{ñvüð|hpR»…fì:*VØëD¢ÁÐX˜Xšý¶›92ÒËs>º§5§éн ¾õùZ´¶ië»ï‹bQ˜Hƒs’3cªChr¹Ü.ïxóü«B‹ú„�}‘Ü{+`"¹-¦î¨¤l±$ãëÍÖ!‚p ®j§§ööç–ü¶ÂÕ×íñk}íÓ³£«Öc,ÁZüàևΗOˆ5ÿº¿^ëò\ÏóÖF6›‘ÀZ@;Ùmæ™öÓ®ã£X´,j6�bÅÓR&ž/; ÜP\µžê¤ò‘ � 'ˆDµ™Áx’�¸�$ôÃJ¬L„p|yBƂ‘Ii ?% ¦–düœèÚ endstream endobj 187 0 obj <> stream xÚk`€MÁ endstream endobj 189 0 obj <> stream xÚµYy\×¾Ÿ™ "*ãTÌ´gR[—VE«Õ¢Ö©R¡Š­â¾ ²¯‘H kÂ6a ;„}‘M÷}iq µK´ÚÖ¶v«­­¶÷Úû{èû¼  x_ï½ïýóB’aΜåw~Ë÷÷ûžˆB$�[±r¥n²•n2_¹Jh —M“ÇÈv‡D…Èä!2¿à ²ø¸`Eœ,T!�ß÷‚›Ì/,ÄJ—x‡XM¬!Öëˆ Äb+±�ð'¶Ä"�"‚‰"Œ'"ˆH"šˆ!ä„‚P D"ñ{Á2Âëuâu›� ñ_"?ÑÑm»h»_ì_°²¿ì0Éa“ƒIÚy´~t�óxg…ó!ç‡c\Çä�¹6æÏ±-ãœÇísqwÑ»\§ü(=õõøã/ЯÑÝô'Oy=õíµ+ãäú;,qæ,·ðϪD»`Õ]XeÏÚéŠÌÒ”B”oˆç´ Í׉÷¥ëŒQLŒ† Ngñèþz±NÉåØTƒ!-YÝÂU£ßÈš&®½CÅ…²�Ã|²ñ9q¨Š‹ŠnâjØßÈê®�Å‹a�]Éá#±³Áâg�+—SVÐX)5oî Ûœ6 ­0?A”äÊÚoðóÛ'sžÑõš¦ªÖ’n#*6ëò�±²‚+a>;µ”Å˲ñ˜�Ó¥Tª×û>¿u÷uG”GTÉÜ}Lk×!¬ø7ZÉ%%"ª")t—Á¬Ü±gÿÉïºarëÌûÀ÷´YkÖ¤2 z$�ŽÕ蘴Œ’òd¶"YUÎì”k’”¬JŸ(ÕTiÌe¦BSjmo1W2¥Åé)lrE]ÂfW«¹º‘­«jk¨‘ ƒk[D?[ÁdµçµEØ9¿<»y[bT8I‡¡4y’… ž®’=Úo"U\B×®®<œÞÉ€è矀b½žš¾ÌgÙâ°›'ÐUÉ…ógß¿vÞóeä̇l¦‹³J³MóðMqifFu<£Ò&%f¤åXøæÏ7Åi…ÅI L]Uu ëìn�S¶·ÔÖñßò¡ëé6…1á§ó¹½R˜'iÎ>è׎5Wí66;‚«¤™;�_ŒöÕÜÌëbLu¦¦Ž8.q%ÏMbs ÜF¹ô%I(§ Õ mèÆ\%cP⢛rKÙ–\eç­uÄ %Ñܶ31Hyè=ý Fp�Ž¿Jçéö8cŠ3b»¼œGX$i厮oC-›W„1I‚zbk³*Y@9\h„Ï“VEV¢5‘9[²¤ØKÃ…âÉ9ȶzT3WýýOu_U±FwªUzK²—«ÚkFU{O›¶`[ÿásÂâ Á&ªu´°% Â3>3ȪfÁu…{{“úôHöÏ·$Q¦´=¼ž=«³ÚÃ{ô÷m(t×*¸è¨&ÎÌÂŒ?ŸÃ3ž¸÷&w•t²Î©¾Ø":`… ÂÂjx•ÞÇ¥¦+¹˜ô‚~aÜfö¼ßáExáûßû.¾·ua%›”Ÿ§igº¸ú:X‰™kŽNÌLÓg¢œ,.'YáØ±µnƒi쀥ؿžÇïún±6çûÜ"ºj…¸>{>Dtk gФå¨ô(Ù Þ²„™ÿÆåN´‚˜úý\:f¬Õ51MõÕmWŸã¶a�Uøé¹ØéÇÉàìž_ªYgÆ�7ŒÁg×yº;º%2XÒÛ¹¯¹£á i³�³�™b÷šiKÐ~ÿ@etdp›b·©È˜W„´+·hR²Ó²3URmURuçoï‚D…�máã-àæeõ·ñÎT2_"ÀC,§CÛxù—øÁsȶˆæí MŸ�)–ÊÇco½ø{Ï¡]m­ˆò åtÐUÒÜlC7x…¦ºÖlsméª+}w/pùÒÉ5~‚Àˆ·€¿ÅEÛ Ö£Ö-Vê>÷ Ý'©åÂøòÂu$;8�« µèÎÐ3Í„'€?I„œu¤š‹ßc³ž²’ö� µ±‚W´pUl{¿.ú‘àU,Ï’”Ý —,ÜÅÏ.Âx‹ µ“2\bF¶Z�6įM—3§¾Ó°pš¬¯åº�|ëü5}*ÃRÝØù×)@ƒëñ[Íh)L¢q-yµòÂ{—™3½ŠçKl.yØjq9bõ³B£ðEÍà•àIêsaI=úr×Ñ“ç¤7æ_Ç£°Ó+¯.\}l㱈ºâ‘ðÖÛÒïÌ|ÀåöÍŸ‘; W¯ô÷DÔnÏ•G{Îôœøâú¹ÍëÙJ¼Ÿöò^㎨ÕîÞ=VËù÷¸}n…/ë ë/߸,â“xº+D°¾GêB¸°°Ý\9 �廹.ÏpèŠàRþƒL‰žu …{de·ðÌf•^ ŒBo…õçïíyoþ]úâ"N³èµ­/£uS%ªlTù+î�2¬fh"«„ŒÓËiÙ)Ð ÎO„¸óqòúG\;Ê* êªk4·"›z:,0Ï"ºi…\!H£`5ýëk¿à‘aþúøVƒ^2<¾a"p­$‘SvÖ–£Î]kÎ37Žzú,Zºêù[ÅïÉÙÂÂâ¢:i›Òœ �Nrÿf8À¸{·À~À× ÿŒJ×zz{ìù Ø<ˆG‹á¹[_Žäd\f®*™Åjü‡8=™ËQI#Jô 1±’ÔÄ í–ol%×Ñ {vÐXA‚~;ãÄ‹°äÜ{áõ‹Ñ]ÚΫ­«­°Ü{>ËúÎyj,Á›xWºQݱ6uSnøVD�$Ê4aµ[™™K=æo¯Ž¨R³”ˆHÕ¤ÇGKÃ*%)ˆÒ�]²�{3U:ï�/Œ‡ñz¿EÔYwâ© »PQr@ÃKÌ22#™ËË`µ®2…¥&¥¦Væ6pÒ‚¼Ê‚R”“¿Oy’¹}õ“>–šãÑžÞ–ÔŠêË› *ŒŽ;M�úR¦º±¼�Å˱=½ÚßýÚ€ãgõAá¹#Gμ{hË:Æ´¿Çö©S=©)éì¬Cææî*Óbnž�ÕÃà]‘Q–V„ðw,.ÑeÓ�:E©Zõ,ÀÞXøˆSõÉj©²6Å\’o,©DpÅ%¦ŠâZ©ÍB?Jâ~‚K”´Ó Á@þ %ÝpøÕåÛÂÕj¾ÿ"—ëü‡ï`.YióCa(ëËÈû×ö�>[)_…°*hÐwwÙzÍè5äí×î»@ø}O+eá7 « .Œ&Á�AÐÓžðq1îÅ£‡ÁN ø'Ì-$!”S�eÊÍÃ/Ã>W˜~â½õ\GûNNÇε-5( ŵb¨m�T=ÚÌÔA9š…D×Я‹¾»O>îÉ;0d8_¬{ôüÓA!‡{”Ø aóšž5°yüÓ|áÐ~£Hü¬ƒ1 w 2vvünÏÇ3Äð`Ð>Ãy÷d¿nÓYØm8@6}E~y FáYƒ…é@üŒ|,ŽM7 ²‚ÁV²Ù`¿Ž« ]• À¾�×õH*w=’cþrôëB†ïx§¡œ?4�Z˜+´}¨ÔxêQæ²Õ°ƒ<Õ¯Ãô÷7† >ìº6¹8UpâB>â²"›k6ªË5éÙ¹é˜ÞÀ�âtƒÍ‰…Ž¥zßá`qze~n c®-oPò ˜-.çz¶÷|ÙO ª‘/DJà"¯“t Öf©y¶Ê­!wdébÓÙåx[JhzŒ!fb.™v|.”瘛ҜŽY3 X–j‹ªç:Q¿N™ÀE±T¡móhHrê£Á¹c�’²­—°_Ar±²"¸Pï˜a*×—3•Å•Ål¾é[0•Ÿu4öÇ’¶9´G¥=Úü€sø ¤b!Uý7ÑGY;¹ªÀ.zÿCðQmÿKø y`A/t[\ÎZ¡éúÒ+Ô>> Á€í­3°ýw<“7ç€Ý™3Õ�"<6mñ´éLz¨ÑœÀšª¥M‰u± URtdÍR]›ÐâÏi¿µ«Ý®ûèÚ÷Wz>9ܪT™åØT¢^**ÙÎY¡Ùæ-6²0ÎížPÜ9¸MÃã0õÓ °»Ÿî‚ ò*¢ÝVz,Y²òÓ;?|ðÁ•O.ù̈jg 8 ¹$Sï;äm³ùjÒV9ª ))™(xþúTuŽ£&7!G.UÔdVÕ4í;‚úΖ §’‚a寰@öôåS*yúÎ’[X‚°òß2@‡i4¬€q$8^½uGà/ë¶{MGÏBöïäÝÃ^넊`‰0¥÷ZºJ_�X.¨ð›­0¤÷÷ Ò�¹¬¨ JZœYƒ·cW\‚G{©k#ò<ûéš&¦¥°®X˜b¯P…?@Fm½v ]]çÑÇ( ª m™¾0›w,ªÂó|¤SC0‹™ÙH›–‘©•f˜TÍm°]°JÉãòÔVÒöÒÿ¢z½Ï³ÎâÒÛ×óåïVJÆïàÓènÅ÷x%¢¾ÂÏnò^Ù¤­¯o¬n-Ï,Í4±­ÍÇ‹ö3¿í�ŒŠ�OQ§±xò"nN 4ˆK>Ð^jÚƒª%ÇÍçîœFmæî¶3R¼ Õ¿Àgø Ž‹x–¿DÏ/NfÔ1©þùlök�ù ­LsaMµ‘Åî°ý?vœ.ð½ô¡|e• •JÁæ©Ê±ŸXc4&´1mÆz³qÀж·Ë÷Vð¶XëVFýÄ×Þ¡;†’¦ä¢sQFNH’œ;vö}®8½¥´)ëueŽÔƒ»k-¥ß½~�DxÙ06÷ëOT'£†ÁW×ÉÚvNÞÉR4$pñR.º6EW·jö0ï7}¸�Åsàoô¦mïÌFo@Ä'$ÕwûÈÛ›‡ÑfZÁÞÊ}KÍæ5ü(º.å�û†·Wø¡=êóAdµFþ¯pïÂ'ò@åyÄ^ðOêù/Ü…Ñù¬V53 uæ]CLÍåÌ>ÖãV`­ÁPQB-¸�¾z(¥í8°³hqÍÂ×€òà®ãÒÓ'O\�‘U3£L(>¿ÌP7DØ\[\fRtêÚ±¶|ƒí=^�¿ü˜÷×q,HvŠ©ªVÃת—¥ë·¿ýª|SÁ®@°+ëPn�cunnM$c#,v•h8E{ƒ©²³E°h.1àøÉ;Güî ÔXìyGÿÓõ‘…èÍrqLÁ›åû¥-�?}]›�’ŒyIƒRY…ÊÒésP½¿?§fð"å‚ÐY’nëØ“_&¯“†„DÌÞ²¦ìºÕdf•ÅÊñâ€%fcw9 =y6§•�9�_Ÿø?±ÂBü#ýatgph¬<\^v%¯ Vk3 Ù:½f€ò5Ü}�siÞ":b=7€5Ÿe˯I³!‘Ë`¹x5 äTµ­ªI¼¯Ç;±�TÇEtUW—µ¡B膙ài¹àXW“—W)µA¹]/8ô ùÏåì•¥_@Öë­ÔqÏ×Ò@ÎíÃvë×'íØ†àÙÊoÜdö˜S3 ÙÌÌLC¢4®FÕÒ\WÝ~2ô݆-@NÏ{ˆº¢_¾'׿y¯~Ã'è¤E…Òšòš*¥½O}öÕÙåKl‡3§Ò5ÚjU¼^›lvò§—X¯Éå2¤‰UIu EU&_?ô™�\±t¨VøÈz[øïÎgòúqdȈŒŒÖSò˜Rž…‰ýºõ’a¿^2bëy¸>A?mÎò±P…a3GÐíZp¡k¸ú°ˆÜ„$´2wuš’y�;ÓÌB:¸?AoÜo�� ï‚—‡ ÖMœMNÿ8ô굯÷ P¦¼K°I`”}«ú*ú`¤5ÐJÅ pÊ+[.x·£ž½­çÞ•^óüK°Ó²Í^ͺ:^VJ³óQGÇ®„ùøTè¶hmØÎx62V‘šã¸:KËÅHmCÇHªôÞéåïø®Y1;ðµ²ã±Ÿ*2ÕI›Ôu e¼6rÎÏïÙu··ï ¤Àl!nû@a�±RÙ|ÔAºeˆ™«å§“ÔØ §ï~zø€#uçýžc—¾”‚Ó”O±3ùê‚ù!­©Õƒ@^‘^„ŽUïx�¹ñùÖ¹Ë6½ãíÇâXì+NÏ0dꤶòQ…p›¤qv?4=qRñ4¥>©xT´ÿS�NR'_Z˜ù*·»Aã_ù.!§[㮃ӑ6ÿ›íùB~2ÝÇ%",!ã„á�\-{’܈O‹sɬ–äc)ßOÌ. cÒWMe³õ�e©sÉõpZ|rðYÉ©ÙGãë…ªä"î+ òµ˜ù%–¶ù¦±2¿ÁÑH®ïÆ# 2“Êk¸r¦;ßÜPÀ^„>qû€d©ÃelÂ~°é¬pY›…è‡xF ‰ÇÃ< ašø9\ß�Ì Ü.vÉ”×·4:Q =yĉ�0OÃcñÙ²&€Tõÿp¼E9ÅA]§­R!.ƒKÍDxâ*±Î�š™(Í(Šl)*ÌËwâqSYAE™ÔÙö3ÛXžqšò A m?›•¸¤–ño”ÁⲂ2�tð“;�àœFYFZGí3›Œ¶Wa]�ÉÉ©«>¯ ÈXk,}ww©Óh¾aü?èÿ J0ó endstream endobj 191 0 obj <> stream xÚk``�”þ[yUýYYÿ¿ïZ (€ ¥Òs endstream endobj 17 0 obj <> stream xÚí]ks7²ý~ÅTÝkÞ-‘Ï-—«l+ŽUëG®í8»áò-Ò²êÊ¢K¤’øßßÓ˜ÁÑ`¤ÑÛl´µ †xt7N4ÂÒ¢�¾�ÊJÊ»B†BkY(]˜`  ‡rR…WT�)Ê „4ªI‰fZ#EeÍ‚¬+Œ*$i¤¶�m ¤- ]VªÂ¢¾ ¾°¨ïõƒ°…#!eá,Ro ‹¤“…×…RÈô¾PäBáÌCf@}c|`¼µÄF¨ÇÖÁro *°|á lz!ÐM£ ‚Ñ…1H�, †¤'t�E߬DŠúV!u°íH¢¨O}°H�. „4Û.�˜‹®‹Ed„*êÒ…ƒ~ƒFE}G7È’(<ê[Ëð" º€hr }E;=ô8t&“Öz<ì hçao@ý{Ñ”ì…(@x°…f,QU MÜ¢ŒBÍðÀ-Éî–2øQá?Fk‡£‘Vì*Áì^üX f¢…†‚AP«µB ¦€5L .”¦€Ó†Ó­”Ád8Ë‚Ô ¹È¢aàÊðŽ�v‰–€*’ ¸s+`=ñƒd^ÂÁPë,À� 'ðátÒ:Îa¶2÷' 1‘å!(®Ã†íxb’ngHÉô’ÄfyxZ6œGÜ ì³9ŸG BŽ»EÌtÉäoÚòÈàQb„ç<´7&K i<›Ë5¬dàqiµåv¨kœ#u!l @—Nñ�¶tšåI|œÈKçƒ&y,±UÜý¤ã$§+D Œ*¤†­C`PÖ°z(Užû¹$;*b ADL\T¢h�áˆÃ�„cjA«–�Åà�£ÅY†ƒÇM[9œj¸“0ÁH@Ee­>œ¼ûúe9y|zºÚLÞžØð·ǧÿ7y²:[,ϦAYÌ&Ï'“§ø‚®Î&�ÑìíäÇ7üyði³ù²þÛdrr>¯ÎŽF�MÞ,7SÀ0V�cž3²ŠôXya¬�Ÿ=zô_·©þ×_W&L>ÏOÏç'è­ÇŸ6ŸOþ›Æ4V�}¤ÂØc`Ôö‘öcË¡íßeß9¢1OàÆ˜Y&­p ³ÇØ(ú7Z†YeÌì®1ÓÎ�ytíböluºáå0âÍäB~ù€y´|àØP>qÜ+Ÿ8lT xH~„âÎV‡o—›éä‡ýg“wËß6“ƒÏó£åÓ2yR&-Õ[©[M�òT‘áÁpE‰¬Î>݉üFêVÕ]Ëoà»¶¢­ÌZÑPQ/Ž?oÖÓû«Ã½·›ùÙfôà ŠÇr4›¼š^îéhv]ÁßZrb™ª„è­�*]#�FÚn¿é摌<3z°ÆP9^�þOjXU†i°‘bG&Â�Ö7²Cî¶\¤ÂÕVzZÃPK(¤êV–Ó¡(vWÍß�멎Rxe͉Qeb{ ¦T’î2˜FÆ·¬Ó#z¥î`캤š‘•-©vdU+Ë�,õ*ò‰¢N¸ýÈš–Ð0²v7K�¬ëS£R·ª.=¨aCK¨¹}ÐÔÉ+»C5޵Qo…bRúש^“w$u95\‹v¨çL¯ÔÔ±ªË±¨á\Kª¹ƒÐÔõ2H¥Ž¥.=~ä[Raä[¢‘ï奎¥.Ç¢†oˆäÈ·„¦Þ]ÙÔ8ÖE9¼w�Ié_ï{MÞ‘dºL¦Qh�ô(´ÐBÓÐË ²©"ߥȎB‹AäF¡ —…Þ¤=¶C loѦ·›ñž´G‰K”„%nÄ{Ù™~Ä»Ù�¬0âýìU½j7‡(†�8ᓇ2MÇZ¬hÊ®¬ïCU¯�oªb“É?þùs¡X c•Œ yz~r2ë*Ç>„ë)G{(¨ÊI´Ë­ ™=åBŒÑ±l¹QbìóÅÚ(,�{ʱ)éSOXz÷©ç…/bn¶œ»�Ù·.§Kº±\ªq |¹!…­B¾¼Õÿ åä5UO¹´˜LóåÊ`Õ#_9¶[ùö’þ_,vcÕÓZÒXÈ|¹±~ì|O9еùbmìX÷¨×hžo/’Ça·ÔS®�è|¹r OO÷LTYðŒ‚oe¶Xz£²ÅÊ)ÄõüÀ¶$ŽzÊ%nO{cmo`1J%�%5Oq±&‰+›kˆÏ”_­=vw\éhN—˜·ãº®òÐ[Žð½¿\oÖñä8î›âþÿxs²|øqùñ£z)v��yTmô¿_½[MöÓíï¸ægËÓM<šc�¯°çŠ'v�r áËÄÏ ÏZWßšmÀgY¦NWß?–yŽrvPjG©º¶ƒºí°‡�gJ½N•ßi~Q¿òø„ÒN,hY>Ç~裘f12;¶Qj›h›«0ó]úoj§í°ó‡³å/ñ4;1Ú4ú°r “IïëÕ€£suuš'Ë:ßÍ´=¬C•ÌEE¦Pé�ný±Ì»HÈXle\@÷¡’‘ê·U_—¥CÚºút¸E%÷*}©°Œ8q¿TÎy.ï<“:ÏÝÌyÍ­ dgêVÞnä¸w\¿ã|Þq6uœæ¸hPm<�¸�Ws&;Ë´Ú6 ,v�ü#8ý*oê–Ÿv_¸ÎUu_p|ÒUMs²ì_Ó×EŽ!O—’#ÜlT›Ê91O'`Ô#¼îXÈ“C':¢Ü*¤ëœÜ�޽ú<&E5Ÿ ¦ÄÝ¡fª¼f•ãK„jÚ´\ÿá–y„Ó5 ’ÖeO®»DpÕ`®ž½¥Y£¸G‰Þãgn?ÏÌ·¹¶÷óñU¼œ?CRéÉ»óòµ#ñÏß{»z30çmJÏŽHݱ·¯¡ï½=ÔÛù3"Jψˆ®ñ÷ïÊÜ›Ú"«Z' ‰WÝOÿ‰=–?¢ôˆô·ñØuÇêŸØƒù3JÏxhàOüCå]Ž9»�àµþ›zówî©üy¥çId¿�§®=ÖîÀsÿã0ÎDé9¹»�¤ñt½£^Óë´î½çògD”ž‘¿ûqy-ÏÝÕxü}{-Dé…Ž·Äª¸ëø�üeºÎ3ßÍüP"×>ãíz)"ÜþÛèáå/b¹EÒþ0ù‹yݾ•Çõùc²ˆSþ|†Òó=ô|&ó~L3ÌÍþž¯;ôvÉÆ?ÊŸcPzŽ¡åí Ñ¼È¶œl^Ükõæº/Й+¢e®‡Xþ,@§gú:nþ\Õ÷ƒÞ—ÚiŸím~/¬Ó½°¦Ûém?†øt�ÜË"’ßkêt¯©õðW^]±Åö½!g[½ð™9ô¦œèª·Ì"‘ß³étÏ¦Í ç®ë q­QÐÛÛü¾G§ûm¯9“s:ó»êy~O�síeï-ç G׳ã³õ¦ùáÆ‹ùºÁuòtu+öˆÚ¿—©^àÜ‚™MJ³%¤jy›¼š—BØ~mO‰íw%’#UÓÿŠk-³®[÷fáö¿ªz—‰²º2Ê¥>µ­•�¸ü¯€Ž¶mÏ·¿Ð¨c”®ãNï>n8v?ê?×C\'Ã>Tè4&Æûjç‡Ë³¿-~9þ²øøù·â_”PZ�0ÿ�Jl öç›åƒý¿¡È­Œ$$ú¯BýEˆ¿ŒJ_Yž>Ž�£úyë³ãÍ,:êåj±œü¸^¾>ßœŸÂoñ:�x‡׫³·áƒ�Û!úûé|3?Yq�0T²3§00ÄÌ›)ñ…ƒFÏ‚åÇ™vªM@¦FÊÿÖOdgd¦Fë™VS'ÜL›©rj¦]Ìd©Ä÷剙q±¶ 1±Äåávf-·(Œ ¨�]ÙØK®3uŠ/”³à§ä-쀉ø*E)7Ú…FˆSGHUl]Ùi4,ƒJ!fÚN½…�Õ|ÌgF³å±½b‰­ã;ÿÈñ•‘¡ M‹‰™4ótW†Mäúž¦|çç.LôüXh6fjòÑ<.fó<Æ<>õ�'•‰ùl¦›‚€ÛÈ�µ˜òmŽüq|c!@k¾[] wÅzÕ8Áyî‘�÷FFñ㼉ò¬*µ¾’ïÎã(ýÌUv¿˜c¶žs�žòM‡«F3/XC#–GYžoÙ 3ïÙÜY�,'º Á†‚*+DN«Æxòè7n쬌ã4>Ç›Uì=P³Q®”¾L•šOl`D²D ŸøS!U“ô%†ÝÏÈÁ›Pêø®OÃÜõ$gZÇ\|"=ØÊ1¦†3'(0[¹Ü†i²°à�å-‘ÅÔà»=TPžñLo9Nâ«'#ã-ÁH]fÇÛøRKGº ßÛ; =EøVI|¸#Íc“Û÷‰C’“Ð44[Æ7�VÆz!¹(ê /oö0Ã{ŠoÚ$¾&Áf69Àäy|øøôèdYˆÉ³“ùÑ«¦·›¯X©<Ät{ºZ/ŠúFìüïQÕ7ž´óøq�gÇ'K¾V´ZøÑ%Ös–:ºÝ¸éŠþÙ«aß{>ùîôpµ€+&I^ Øb#V¼Ø,ï š¼[ýxzŒÚK,UŸÝlyõüûýç/kÔ]²E·Ùb¯È›²EWl±f‡-6a í°“Ø"øÀ˜oÆ,r‹lÉâ—²Åì²Å `KNþP¶¸‹l¡ályòêÅûýW‰5OV'‹» ŠoQʼn›Pq7Ç‹ “pÅYæ ߸ÌW!IÊpEY…]X–0¾‡0ݦl ;lqr[:…¥J¸H=œ*ÿûøýË×ß5¦ˆ; ,åŇ)[ô�K–,F‡”,ÄÓPà‹´ã ä·X²ø%T)¯…ÛRÅ  JNþP¶Hy‘.f8]~~óòñ›÷‰9wYÊ S®øE©³‘…TJÏ‘…¯<çm " Ýzdé†0¥‹Û¥K@—NჹB¹b¯1 ½9øþõO°ååêtõbswdñíõ­¿ÚúÖyÚ’EIW‘¹[®p�d}+R® Þî‘À6›â? z¨"{¨ò“P7‚ Wüî ×YávKL–Ž®N–÷ß½ûùÉË„¸%”wÁ–öúÖßh}kl~ÚY³_MCñ¸°Ú“zÌÿPB o*æ8q­))eJ›Ý¥®²Ô͈Ê›ò‡õ»¼ñÃyóvÿù«×¯+ßéòÅ·»áj‹]ç|e”êZ¾p�l”‘ˆ2’ÿáÉWÐÚî(ãz¨’09ôRªì®sÃ�unFü`ªtìŠêIñÿ£H endstream endobj 192 0 obj <<5b584a56bf5fdaa37bebe1130793c4a1>]/Root 1 0 R/Info 2 0 R/Size 193/W[1 2 2]/Filter/FlateDecode/Length 430>> stream xÚ%ÒY7ÔqÇñßWhÈ’&Sc-‰21IF‹%[;-Ra¬E…"T’¦L ‘â®î»qŽn<‹€›NÄôŸïÍë¼?ç{ó»øcB¡0“`žÃ8<‚Y˜�wð‚ð>ÁX€Ï°_ÀÈO»1”À6ƒoðUL¼^Ãá1¬Âw±Mè!žHœÑ #bÿ£s;ŒŠ3F§ žJºKg@DÃY8`\„KP1�û`?ÄBdÀˆ‡L8Y°²á”B†pÁ.°ÃÈ…Ý�n8 ‰�Ç  p Á{`/Á 8 N8§¡’à ”C$C%TÃ9H�THƒË05ðja¼pê ®Â5¸7 nB#Ü‚&h܆h…6¸ípîÁ}è€Nè?tCôBôÃ!†g’²þif³E–Í"{Í"Çaáúg‘ËÕ]®_ê�äOkMˆ§]+ žßZ“RñWkN*«µ¦Ä[ õQ¼A­Òµ¥5/þ­—2¼¡µ(#)Z¯$àÓZ–ÀºÖ´Ìmj­HУõZ~ü²¹î6æ?¥²WÙ endstream endobj startxref 47663 %%EOF rvirding-luerl-772b25e/doc_legacy/src/0000775000232200023220000000000015114130670020244 5ustar debalancedebalancervirding-luerl-772b25e/doc_legacy/src/luerl_old.3.md0000664000232200023220000001304315114130670022711 0ustar debalancedebalance% luerl_old(3) % Jean Chassoul, Robert Virding % 2018-2024 # Name luerl - The old original interface to the Luerl system # Interface functions The **Lua State** parameter is the state of a Lua VM instance. It must be created with the **luerl:init()** call and be carried from one call to the next. As it is possible in Lua to create self-referencing data structures, indeed the standard libraries have many instances of this, then using the functions which decode their return values will generate an error when they would cause an infinite loop during the decoding. An simple example is the top level table which contains a key **`_G`** which references the top-level table. Note that Lua **Chunks** (see definition below) can travel between different States. They are precompiled bits of code, independent of State. That you can 'carry around' this is no unique to Luerl but a low-level implementation detail of the standard Lua [language](https://lua.org), for more on chunks [read](https://www.lua.org/manual/5.3/manual.html#3.3.2) the official Lua 5.3 [reference manual](https://www.lua.org/manual/5.3/manual.html). ## Spec Definitions **Binary** means an Erlang binary string. **Chunks** means a portion of precompiled bytecode. **State** means a Lua State, this *is* a Lua VM instance. **Path** means a file system path and file name. **KeyPath** means an Erlang list of **atoms** representing nested names, e.g. [table,pack] for table.pack. **Keys** means Lua table keys, the keys of a key-value structure. ## Functions **eval** and **do** functions differ only in what they return. The **do** functions return results and a new Lua State, the **eval** functions return a tuple starting on 'ok' or 'error', then the result, or cause of error. do --> {Result, State} eval --> {ok, Result} | {error, Reason} ### **`luerl:eval(String|Binary|Form, State) -> {ok, Result} | {error, Reason, StackTrace}.`** Evaluate a Lua expression passed in as a string or binary, and return its result. ### **`luerl:evalfile(Path, State) -> {ok, Result} | {error, Reason, StackTrace}.`** Load and execute a file, and return the result. ### **`luerl:do(String|Binary|Form, State) -> {Result, NewState}.`** Evaluate a Lua expression and return its result, and the new Lua State. ### **`luerl:dofile(Path, State) -> {Result, NewState}.`** Load and execute the Lua code in the file and return its result, and the new Lua State. Equivalent to doing luerl:do("return dofile('FileName')"). ### **`luerl:load(String|Binary[, CompileOptions], State) -> {ok,Function,NewState} | {error, Reason}.`** Parse a Lua chunk as string or binary, and return a compiled chunk ('form'). ### **`luerl:loadfile(FileName[, CompileOptions], State) -> {ok,Function,NewState} | {error, Reason}.`** Parse a Lua file, and return a compiled chunk ('form'). ### **`luerl:path_loadfile([Path, ], FileName[, CompileOptions], State) -> {ok,Function,FullName,State} | {error, Reason}.`** Search Path until the file FileName is found. Parse the file and return a compiled chunk ('form'). If Path is not given then the path defined in the environment variable LUA_LOAD_PATH is used. ### **`luerl:load_module(KeyPath, ErlangModule, State) -> State.`** Load `ErlangModule` and install its table at `KeyPath` which is encoded. ### **`luerl:load_module1(KeyPath, ErlangModule, State) -> State.`** Load `ErlangModule` and install its table at `KeyPath` which is **NOT** encoded ### **`luerl:init() -> State.`** Get a new Lua State = a fresh Lua VM instance. ### **`luerl:call(Form, Args, State) -> {Result,State}`** ### **`luerl:call_chunk(Form, Args, State) -> {Result,State}`** Call a compiled chunk or function. Use the call_chunk, call has been kept for backwards compatibility. ### **`luerl:call_function(KeyPath, Args, State) -> {Result,NewState}`** Call a function already defined in the state. `KeyPath` is a list of names to the function. `KeyPath`, `Args` and `Result` are automatically encoded/decoded. ### **`luerl:call_function1(KeyPath, Args, State) -> {Result,NewState}`** Call a function already defined in the state. `KeyPath` is a list of keys to the function. `KeyPath`, `Args` and `Result` are **NOT** encoded/decoded. ### **`luerl:call_method(MethPath, Args, State) -> {Result,NewState}.`** Call a method already defined in the state. `MethPath` is a list of names to the method. `MethPath`, `Args` and `Result` are automatically encoded/decoded. ### **`luerl:call_method1(MethPath, Args, State) -> {Result,NewState}`** Call a method already defined in the state. `MethPath` is a list of keys to the method. `Keys`, `Args` and `Result` are **NOT** encoded/decoded. ### **`luerl:stop(State) -> GCedState.`** Garbage collects the state and (todo:) does away with it. ### **`luerl:gc(State) -> State.`** Runs the garbage collector on a state and returns the new state. ### **`luerl:set_table(KeyPath, Value, State) -> State.`** Sets a value inside the Lua state. Value is automatically encoded. ### **`luerl:set_table1(KeyPath, Value, State) -> State.`** Sets a value inside the Lua state. `KeyPath` and `Value` are **NOT** encoded. ### **`luerl:get_table(KeyPath, State) -> {Result,State}.`** Gets a value inside the Lua state. `KeyPath` and `Result` are automatically encoded. ### **`luerl:get_table1(KeyPath, State) -> {Result,State}.`** Gets a value inside the Lua state. `KeyPath` and `Result` are **NOT** encoded/decoded. You can use this function to expose an function to the Lua code by using this interface: `fun(Args, State) -> {Results, State}` Args and Results must be a list of Luerl compatible Erlang values. rvirding-luerl-772b25e/doc_legacy/src/luerl.3.md0000664000232200023220000002167315114130670022063 0ustar debalancedebalance% luerl(3) % Jean Chassoul, Robert Virding % 2018-2024 # Name luerl - The basic interface to the Luerl system # Interface functions - New Version The **Lua State** parameter is the state of a Lua VM instance. It must be created with the **luerl:init()** call and be carried from one call to the next. As it is possible in Lua to create self-referencing data structures, indeed the standard libraries have many instances of this, then using the functions which decode their return values will generate an error when they would cause an infinite loop during the decoding. An simple example is the top level table which contains a key **`_G`** which references the top-level table. Note that Lua **Chunks** (see definition below) can travel between different States. They are precompiled bits of code, independent of State. That you can 'carry around' this is no unique to Luerl but a low-level implementation detail of the standard Lua [language](https://lua.org), for more on chunks [read](https://www.lua.org/manual/5.3/manual.html#3.3.2) the official Lua 5.3 [reference manual](https://www.lua.org/manual/5.3/manual.html). ## Spec Definitions **Binary** means an Erlang binary string. **Chunks** means a portion of precompiled bytecode. **State** means a Lua State, this *is* a Lua VM instance. **Path** means a file system path and file name. **KeyPath** means an Erlang list of **atoms** representing nested names, e.g. [table,pack] for table.pack. **Keys** means Lua table keys, the keys of a key-value structure. **CompileOptions** means a list of compiler options. Currently supported options are 'return', which returns the errors and warnings, and 'report' which will log the errors and warnings. **LuaCallReturn = {ok, Result, State} | {lua_error, Error, State}** This is the return value from evaluating a Lua call. ## Functions ### **`luerl:init() -> State`** Get a new Lua State = a fresh Lua VM instance. ### **`luerl:gc(State) -> State`** Runs the garbage collector on a state and returns the new state. ### **`luerl:load(String|Binary[, CompileOptions], State) -> {ok, Function, State} | CompileError`** Parse a Lua chunk as string or binary, and return a compiled chunk ('form'). ### **`luerl:loadfile(FileName[, CompileOptions], State) -> {ok, Function, State} | CompileError`** Parse a Lua file, and return a compiled chunk ('form'). ### **`luerl:path_loadfile([Path, ], FileName[, CompileOptions], State) -> {ok,Function,FullName,State} | {error, Reason}`** Search Path until the file FileName is found. Parse the file and return a compiled chunk ('form'). If Path is not given then the path defined in the environment variable LUA_LOAD_PATH is used. ### **`luerl:load_module(KeyPath, ErlangModule, State) -> State`** Load `ErlangModule` and install its table at `KeyPath` which is **NOT** encoded. ### **`luerl:load_module_dec(EncodedKeyPath, ErlangModule, State) -> State`** Load `ErlangModule` and install its table at `KeyPath` which is encoded. ### **`luerl:do(String|Binary|Form, State) -> {ok, Result, NewState} | {lua_error, Error, State} | CompileError`** Evaluate a Lua expression and return its result which is **NOT** decoded, and the new Lua State. ### **`luerl:do_dec(String|Binary|Form, State) -> {ok, Result, NewState} | {lua_error, Error, State} | CompileError`** Evaluate a Lua expression and return its result which is automatically decoded, and the new Lua State. ### **`luerl:dofile(Path, State) -> {ok, Result, NewState} | {lua_error, Error, State} | CompileError`** Load and execute the Lua code in the file and return its result which is **NOT** decoded, and the new Lua State. Equivalent to doing luerl:do("return dofile('FileName')"). ### **`luerl:dofile_dec(Path[, State]) -> {ok, Result, NewState} | {lua_error, Error, State} | CompileError`** Load and execute the Lua code in the file and return its result which is automatically decoded, and the new Lua State. ### **`luerl:call(FuncRef, ArgRefs, State) -> {ok, Result, State}`** ### **`luerl:call_chunk(FuncRef, ArgRefs, State) -> {ok, Result, State} | {lua_error, Error, State}`** Call a compiled chunk or function. Use the call_chunk, call has been kept for backwards compatibility. ### **`luerl:call_function(FuncRef | FuncPath, ArgRefs, State] -> {ok, Result, State} | {lua_error, Error, State}`** Call a function already defined in the state. `Result` is **NOT** decoded. ### **`luerl:call_function_enc(KeyPath, Args, State) -> {ok, Result, State} | {lua_error, Error, State}`** Call a function already defined in the state. `KeyPath` is a list of keys to the function. `KeyPath` and `Args` are automatically encoded, while `Result` is **NOT** decoded. ### **`luerl:call_function_dec(KeyPath, Args, State) -> {ok, Result, State} | {lua_error, Error, State}`** Call a function already defined in the state. `KeyPath` is a list of keys to the function. `KeyPath` and `Args` are automatically encoded and `Result` is automatically decoded. ### **`luerl:call_method(ObjRef, Method, ArgRefs, State) -> {ok, Result, State} | {lua_error, Error, State}`** Call a method already defined in the state. `Result` is **NOT** decoded. ### **`luerl:call_method_enc(KeyPath, Method, Args, State) -> {ok, Result, State} | {lua_error, Error, State}`** Call a method already defined in the state. `KeyPath` is a list of keys to the method. `KeyPath`, `Method` and `Args` are automatically encoded, while `Result` is **NOT** decoded. ### **`luerl:call_method_dec(KeyPath, Method, Args, State) -> {ok, Result, State} | {lua_error, Error, State}`** Call a method already defined in the state. `KeyPath` is a list of keys to the method. `KeyPath`, `Method` and `Args` are automatically encoded and `Result` is automatically decoded. ### **`luerl:get_table_keys(KeyPath, State) -> {ok, Result, State} | {lua_error, Error, State}`** Gets a value inside the Lua state. `KeyPath` and `Result` are **NOT** encoded/decoded. ### **`luerl:get_table_keys_dec(KeyPath, State) -> {ok, Result, State} | {lua_error, Error, State}`** Gets a value inside the Lua state. `KeyPath` is automatically encoded and `Result` is decoded. ### **`luerl:set_table_keys(KeyPath, Value, State) -> {ok,State} | {lua_error, Error, State}`** Sets a value inside the Lua state. `KeyPath` and `Value` are **NOT** encoded. ### **`luerl:set_table_keys_dec(KeyPath, Value, State) -> {ok, Result, State} | {lua_error, Error, State}`** Sets a value inside the Lua state. `KeyPath` and `Value` are automatically encoded and `Result` is decoded. ### **`luerl:get_table_key(Table, Key, State) -> {ok, Result, State} | {lua_error, Error, State}`** Gets the value of a key in a table. `Table` and `Key` are **NOT** encoded and `Result` is **NOT** decoded. ### **`luerl:set_table_key(Table, Key, Value, State) -> {ok, State} | {lua_error, Error, State}`** Sets the value of a key in a table. `Table`, `Key` and `Value` are **NOT** encoded. ### **`luerl:get_stacktrace(State) -> [{FuncName,{file,FileName},{line,Line}}]`** Return a stack trace of the current call stack in the state. ### **`luerl:encode(Term, State) -> {LuerlTerm,State}`** Encode the Erlang representation of a term into Luerl form updating the state when necessary. ### **`luerl:encode_list([Term], State) -> {[LuerlTerm],State}`** Encode a list of Erlang term representations into a list of Luerl forms updating the state when necessary. ### **`luerl:decode(LuerlTerm, State) -> Term`** Decode a term in the Luerl form into its Erlang representation. ### **`luerl:decode_list([LuerlTerm], State) -> [Term]`** Decode a list of Luerl terms into a list of Erlang representations. ### **`luerl:put_private(Key, Term, State) -> State.`** Puts a private value under key that is not exposed to the runtime. ### **`luerl:get_private(Key, State) -> Term.`** Get a private value for the given key. ### **`luerl:delete_private(Key, State) -> Term.`** Deletes the private value for the given key. ## Passing String in the Erlang Shell Here we are going to look at passing in command strings into the ``luerl:do/2`` function, especially when these strings contain Lua strings. The problem is to make sure that the strings in the Lua commands are processes correctly. First just just doing it from the standard Lua shell as the source of truth: ``` >return "aéb\235c" aéb?c >string.byte("aéb\235c", 1, 20) 97 195 169 98 235 99 ``` Now doing it from Erlang where I need to use \\\\ to get a \\ into the string: ``` 1> St = luerl:init(), ok. ok 2> f(S), S = "return 'aéb\\235c'". [114,101,116,117,114,110,32,39,97,233,98,92,50,51,53,99,39] 3> f(R), {ok,R,_} = luerl:do(S, St), io:write(R). [<<97,195,169,98,235,99>>] ``` Now doing it from Elixir using the ``~C`` sigil to get the handling of the string right: ``` iex(1)> st = Luerl.init(); :ok :ok iex(4)> s = ~C"return 'aéb\235c'" [114,101,116,117,114,110,32,39,97,233,98,92,50,51,53,99,39] iex(3)> {ok,r,_} = Luerl.do(st, s); r [<<97, 195, 169, 98, 235, 99>>] ``` So it works as expected. We use ``io:write`` to write out the characters in the binary without any parsing or trying to be smart. rvirding-luerl-772b25e/doc_legacy/src/luerl_sandbox.3.md0000664000232200023220000000655015114130670023576 0ustar debalancedebalance% luerl_sandbox(3) % Robert Virding % 2023 # Name luerl_sandbox - Fuctions for sandboxing Luerl evaluation # Interface Functions The **Lua State** parameter is the state of a Lua VM instance. It must be created with the **luerl:init()** call and be carried from one call to the next. As it is possible in Lua to create self-referencing data structures, indeed the standard libraries have many instances of this, then using the functions which decode their return values will generate an error when they would cause an infinite loop during the decoding. An simple example is the top level table which contains a key **`_G`** which references the top-level table. Note that Lua **Chunks** (see definition below) can travel between different States. They are precompiled bits of code, independent of State. That you can 'carry around' this is no unique to Luerl but a low-level implementation detail of the standard Lua [language](https://lua.org), for more on chunks [read](https://www.lua.org/manual/5.3/manual.html#3.3.2) the official Lua 5.3 [reference manual](https://www.lua.org/manual/5.3/manual.html). ## Spec Definitions **Binary** means an Erlang binary string. **Chunks** means a portion of precompiled bytecode. **State** means a Lua State, this *is* a Lua VM instance. **Path** means a file system path and file name. **KeyPath** means an Erlang list of **atoms** representing nested names, e.g. [table,pack] for table.pack. **Keys** means Lua table keys, the keys of a key-value structure. ## Functions ### **` init() -> State.`** ### **` init([ State | TablePaths]) -> State.`** ### **` init(State, TablePaths) -> State.`** Create a new sandboxed state. If a state is given as an argument then that state will be used otherwise a new default be be generated. ``TablePaths`` is a list of paths to functions which will be blocked. If none is given then the default list will be used. ### **`run(String | Binary) -> {Result, State} | {error, Reason}.`** ### **`run(String | Binary, State) -> {Result, State} | {error, Reason}.`** ### **`run(String | Binary, Flags, State) -> {Result, State} | {error, Reason}.`** Spawn a new process which runs the string `String` in `State` where the default sandbox state will be used if none is given. `Flags` is a map or keyword list which can contain the following fields #{max_time => MaxTime, max_reductions => MaxReds, spawn_opts => SpawnOpts} `MaxReds` limits the number of reductions and `MaxTime` (default 100 msecs) the time to run the string, `SpawnOpts` are spawn options to the process running the evaluation. ### **`run(String | Binary) -> {Result, State} | {error, Reason}.`** ### **`run(String | Binary, State) -> {Result, State} | {error, Reason}.`** ### **`run(String | Binary, State, [ MaxReds | Flags ]) -> {Result, State} | {error, Reason}.`** ### **`run(String | Binary, State, MaxReds, Flags) -> {Result, State} | {error, Reason}.`** ### **`run(String | Binary, State, MaxReds, Flags, Timeout) -> {Result, State} | {error, Reason}.`** This is the old interface to run. It still works but the new interface is recommended. Spawn a new process which runs the string `String` in `State` where the default sandbox state will be used if none is given. `MaxReds` limits the number of reductions and `TimeOut` (default 100 msecs) the time to run the string, `Flags` are spawn options to the process running the evaluation. rvirding-luerl-772b25e/doc_legacy/luerl_old.txt0000664000232200023220000001412215114130670022177 0ustar debalancedebalanceluerl_old(3) Library Functions Manual luerl_old(3) Name luerl - The old original interface to the Luerl system Interface functions The Lua State parameter is the state of a Lua VM instance. It must be created with the luerl:init() call and be carried from one call to the next. As it is possible in Lua to create self-referencing data structures, indeed the standard libraries have many instances of this, then using the functions which decode their return values will generate an error when they would cause an infinite loop during the decoding. An simple example is the top level table which contains a key _G which references the top-level table. Note that Lua Chunks (see definition below) can travel between differâ€� ent States. They are precompiled bits of code, independent of State. That you can ‘carry around’ this is no unique to Luerl but a low-level implementation detail of the standard Lua language ⟨https://lua.org⟩, for more on chunks read ⟨https://www.lua.org/manual/5.3/manâ€� ual.html#3.3.2⟩ the official Lua 5.3 reference manual ⟨https://www.lua.org/manual/5.3/manual.html⟩. Spec Definitions Binary means an Erlang binary string. Chunks means a portion of precompiled bytecode. State means a Lua State, this is a Lua VM instance. Path means a file system path and file name. KeyPath means an Erlang list of atoms representing nested names, e.g. [table,pack] for table.pack. Keys means Lua table keys, the keys of a key-value structure. Functions eval and do functions differ only in what they return. The do funcâ€� tions return results and a new Lua State, the eval functions return a tuple starting on ‘ok’ or ‘error’, then the result, or cause of error. do --> {Result, State} eval --> {ok, Result} | {error, Reason} luerl:eval(String|Binary|Form, State) -> {ok, Result} | {error, Reason, StackTrace}. Evaluate a Lua expression passed in as a string or binary, and return its result. luerl:evalfile(Path, State) -> {ok, Result} | {error, Reason, StackTrace}. Load and execute a file, and return the result. luerl:do(String|Binary|Form, State) -> {Result, NewState}. Evaluate a Lua expression and return its result, and the new Lua State. luerl:dofile(Path, State) -> {Result, NewState}. Load and execute the Lua code in the file and return its result, and the new Lua State. Equivalent to doing luerl:do(“return dofile(‘Fileâ€� Name’)â€�). luerl:load(String|Binary[, CompileOptions], State) -> {ok,Function,Newâ€� State} | {error, Reason}. Parse a Lua chunk as string or binary, and return a compiled chunk (‘form’). luerl:loadfile(FileName[, CompileOptions], State) -> {ok,Function,NewState} | {error, Reason}. Parse a Lua file, and return a compiled chunk (‘form’). luerl:path_loadfile([Path, ], FileName[, CompileOptions], State) -> {ok,Function,FullName,State} | {error, Reason}. Search Path until the file FileName is found. Parse the file and reâ€� turn a compiled chunk (‘form’). If Path is not given then the path deâ€� fined in the environment variable LUA_LOAD_PATH is used. luerl:load_module(KeyPath, ErlangModule, State) -> State. Load ErlangModule and install its table at KeyPath which is encoded. luerl:load_module1(KeyPath, ErlangModule, State) -> State. Load ErlangModule and install its table at KeyPath which is NOT encoded luerl:init() -> State. Get a new Lua State = a fresh Lua VM instance. luerl:call(Form, Args, State) -> {Result,State} luerl:call_chunk(Form, Args, State) -> {Result,State} Call a compiled chunk or function. Use the call_chunk, call has been kept for backwards compatibility. luerl:call_function(KeyPath, Args, State) -> {Result,NewState} Call a function already defined in the state. KeyPath is a list of names to the function. KeyPath, Args and Result are automatically enâ€� coded/decoded. luerl:call_function1(KeyPath, Args, State) -> {Result,NewState} Call a function already defined in the state. KeyPath is a list of keys to the function. KeyPath, Args and Result are NOT encoded/deâ€� coded. luerl:call_method(MethPath, Args, State) -> {Result,NewState}. Call a method already defined in the state. MethPath is a list of names to the method. MethPath, Args and Result are automatically enâ€� coded/decoded. luerl:call_method1(MethPath, Args, State) -> {Result,NewState} Call a method already defined in the state. MethPath is a list of keys to the method. Keys, Args and Result are NOT encoded/decoded. luerl:stop(State) -> GCedState. Garbage collects the state and (todo:) does away with it. luerl:gc(State) -> State. Runs the garbage collector on a state and returns the new state. luerl:set_table(KeyPath, Value, State) -> State. Sets a value inside the Lua state. Value is automatically encoded. luerl:set_table1(KeyPath, Value, State) -> State. Sets a value inside the Lua state. KeyPath and Value are NOT encoded. luerl:get_table(KeyPath, State) -> {Result,State}. Gets a value inside the Lua state. KeyPath and Result are automatiâ€� cally encoded. luerl:get_table1(KeyPath, State) -> {Result,State}. Gets a value inside the Lua state. KeyPath and Result are NOT enâ€� coded/decoded. You can use this function to expose an function to the Lua code by usâ€� ing this interface: fun(Args, State) -> {Results, State} Args and Results must be a list of Luerl compatible Erlang values. AUTHORS Jean Chassoul, Robert Virding. 2018-2024 luerl_old(3) rvirding-luerl-772b25e/doc_legacy/man/0000775000232200023220000000000015114130670020230 5ustar debalancedebalancervirding-luerl-772b25e/doc_legacy/man/luerl_old.30000664000232200023220000001462015114130670022300 0ustar debalancedebalance.\" Automatically generated by Pandoc 3.6 .\" .TH "luerl_old" "3" "2018\-2024" "" .SH Name luerl \- The old original interface to the Luerl system .SH Interface functions The \f[B]Lua State\f[R] parameter is the state of a Lua VM instance. It must be created with the \f[B]luerl:init()\f[R] call and be carried from one call to the next. .PP As it is possible in Lua to create self\-referencing data structures, indeed the standard libraries have many instances of this, then using the functions which decode their return values will generate an error when they would cause an infinite loop during the decoding. An simple example is the top level table which contains a key \f[B]\f[CB]_G\f[B]\f[R] which references the top\-level table. .PP Note that Lua \f[B]Chunks\f[R] (see definition below) can travel between different States. They are precompiled bits of code, independent of State. That you can `carry around' this is no unique to Luerl but a low\-level implementation detail of the standard Lua \c .UR https://lua.org language .UE \c , for more on chunks \c .UR https://www.lua.org/manual/5.3/manual.html#3.3.2 read .UE \c \ the official Lua 5.3 \c .UR https://www.lua.org/manual/5.3/manual.html reference manual .UE \c \&. .SS Spec Definitions \f[B]Binary\f[R] means an Erlang binary string. .PD 0 .P .PD \f[B]Chunks\f[R] means a portion of precompiled bytecode. .PD 0 .P .PD \f[B]State\f[R] means a Lua State, this \f[I]is\f[R] a Lua VM instance. .PD 0 .P .PD \f[B]Path\f[R] means a file system path and file name. .PD 0 .P .PD \f[B]KeyPath\f[R] means an Erlang list of \f[B]atoms\f[R] representing nested names, e.g.\ [table,pack] for table.pack. .PD 0 .P .PD \f[B]Keys\f[R] means Lua table keys, the keys of a key\-value structure. .SS Functions \f[B]eval\f[R] and \f[B]do\f[R] functions differ only in what they return. The \f[B]do\f[R] functions return results and a new Lua State, the \f[B]eval\f[R] functions return a tuple starting on `ok' or `error', then the result, or cause of error. .IP .EX do \-\-> {Result, State} eval \-\-> {ok, Result} | {error, Reason} .EE .SS \f[B]\f[CB]luerl:eval(String|Binary|Form, State) \-> {ok, Result} | {error, Reason, StackTrace}.\f[B]\f[R] Evaluate a Lua expression passed in as a string or binary, and return its result. .SS \f[B]\f[CB]luerl:evalfile(Path, State) \-> {ok, Result} | {error, Reason, StackTrace}.\f[B]\f[R] Load and execute a file, and return the result. .SS \f[B]\f[CB]luerl:do(String|Binary|Form, State) \-> {Result, NewState}.\f[B]\f[R] Evaluate a Lua expression and return its result, and the new Lua State. .SS \f[B]\f[CB]luerl:dofile(Path, State) \-> {Result, NewState}.\f[B]\f[R] Load and execute the Lua code in the file and return its result, and the new Lua State. Equivalent to doing luerl:do(\[lq]return dofile(`FileName')\[rq]). .SS \f[B]\f[CB]luerl:load(String|Binary[, CompileOptions], State) \-> {ok,Function,NewState} | {error, Reason}.\f[B]\f[R] Parse a Lua chunk as string or binary, and return a compiled chunk (`form'). .SS \f[B]\f[CB]luerl:loadfile(FileName[, CompileOptions], State) \-> {ok,Function,NewState} | {error, Reason}.\f[B]\f[R] Parse a Lua file, and return a compiled chunk (`form'). .SS \f[B]\f[CB]luerl:path_loadfile([Path, ], FileName[, CompileOptions], State) \-> {ok,Function,FullName,State} | {error, Reason}.\f[B]\f[R] Search Path until the file FileName is found. Parse the file and return a compiled chunk (`form'). If Path is not given then the path defined in the environment variable LUA_LOAD_PATH is used. .SS \f[B]\f[CB]luerl:load_module(KeyPath, ErlangModule, State) \-> State.\f[B]\f[R] Load \f[CR]ErlangModule\f[R] and install its table at \f[CR]KeyPath\f[R] which is encoded. .SS \f[B]\f[CB]luerl:load_module1(KeyPath, ErlangModule, State) \-> State.\f[B]\f[R] Load \f[CR]ErlangModule\f[R] and install its table at \f[CR]KeyPath\f[R] which is \f[B]NOT\f[R] encoded .SS \f[B]\f[CB]luerl:init() \-> State.\f[B]\f[R] Get a new Lua State = a fresh Lua VM instance. .SS \f[B]\f[CB]luerl:call(Form, Args, State) \-> {Result,State}\f[B]\f[R] .SS \f[B]\f[CB]luerl:call_chunk(Form, Args, State) \-> {Result,State}\f[B]\f[R] Call a compiled chunk or function. Use the call_chunk, call has been kept for backwards compatibility. .SS \f[B]\f[CB]luerl:call_function(KeyPath, Args, State) \-> {Result,NewState}\f[B]\f[R] Call a function already defined in the state. \f[CR]KeyPath\f[R] is a list of names to the function. \f[CR]KeyPath\f[R], \f[CR]Args\f[R] and \f[CR]Result\f[R] are automatically encoded/decoded. .SS \f[B]\f[CB]luerl:call_function1(KeyPath, Args, State) \-> {Result,NewState}\f[B]\f[R] Call a function already defined in the state. \f[CR]KeyPath\f[R] is a list of keys to the function. \f[CR]KeyPath\f[R], \f[CR]Args\f[R] and \f[CR]Result\f[R] are \f[B]NOT\f[R] encoded/decoded. .SS \f[B]\f[CB]luerl:call_method(MethPath, Args, State) \-> {Result,NewState}.\f[B]\f[R] Call a method already defined in the state. \f[CR]MethPath\f[R] is a list of names to the method. \f[CR]MethPath\f[R], \f[CR]Args\f[R] and \f[CR]Result\f[R] are automatically encoded/decoded. .SS \f[B]\f[CB]luerl:call_method1(MethPath, Args, State) \-> {Result,NewState}\f[B]\f[R] Call a method already defined in the state. \f[CR]MethPath\f[R] is a list of keys to the method. \f[CR]Keys\f[R], \f[CR]Args\f[R] and \f[CR]Result\f[R] are \f[B]NOT\f[R] encoded/decoded. .SS \f[B]\f[CB]luerl:stop(State) \-> GCedState.\f[B]\f[R] Garbage collects the state and (todo:) does away with it. .SS \f[B]\f[CB]luerl:gc(State) \-> State.\f[B]\f[R] Runs the garbage collector on a state and returns the new state. .SS \f[B]\f[CB]luerl:set_table(KeyPath, Value, State) \-> State.\f[B]\f[R] Sets a value inside the Lua state. Value is automatically encoded. .SS \f[B]\f[CB]luerl:set_table1(KeyPath, Value, State) \-> State.\f[B]\f[R] Sets a value inside the Lua state. \f[CR]KeyPath\f[R] and \f[CR]Value\f[R] are \f[B]NOT\f[R] encoded. .SS \f[B]\f[CB]luerl:get_table(KeyPath, State) \-> {Result,State}.\f[B]\f[R] Gets a value inside the Lua state. \f[CR]KeyPath\f[R] and \f[CR]Result\f[R] are automatically encoded. .SS \f[B]\f[CB]luerl:get_table1(KeyPath, State) \-> {Result,State}.\f[B]\f[R] Gets a value inside the Lua state. \f[CR]KeyPath\f[R] and \f[CR]Result\f[R] are \f[B]NOT\f[R] encoded/decoded. .PP You can use this function to expose an function to the Lua code by using this interface: \f[CR]fun(Args, State) \-> {Results, State}\f[R] .PP Args and Results must be a list of Luerl compatible Erlang values. .SH AUTHORS Jean Chassoul, Robert Virding. rvirding-luerl-772b25e/doc_legacy/man/luerl_sandbox.30000664000232200023220000000756215114130670023167 0ustar debalancedebalance.\" Automatically generated by Pandoc 3.6 .\" .TH "luerl_sandbox" "3" "2023" "" .SH Name luerl_sandbox \- Fuctions for sandboxing Luerl evaluation .SH Interface Functions The \f[B]Lua State\f[R] parameter is the state of a Lua VM instance. It must be created with the \f[B]luerl:init()\f[R] call and be carried from one call to the next. .PP As it is possible in Lua to create self\-referencing data structures, indeed the standard libraries have many instances of this, then using the functions which decode their return values will generate an error when they would cause an infinite loop during the decoding. An simple example is the top level table which contains a key \f[B]\f[CB]_G\f[B]\f[R] which references the top\-level table. .PP Note that Lua \f[B]Chunks\f[R] (see definition below) can travel between different States. They are precompiled bits of code, independent of State. That you can `carry around' this is no unique to Luerl but a low\-level implementation detail of the standard Lua \c .UR https://lua.org language .UE \c , for more on chunks \c .UR https://www.lua.org/manual/5.3/manual.html#3.3.2 read .UE \c \ the official Lua 5.3 \c .UR https://www.lua.org/manual/5.3/manual.html reference manual .UE \c \&. .SS Spec Definitions \f[B]Binary\f[R] means an Erlang binary string. .PD 0 .P .PD \f[B]Chunks\f[R] means a portion of precompiled bytecode. .PD 0 .P .PD \f[B]State\f[R] means a Lua State, this \f[I]is\f[R] a Lua VM instance. .PD 0 .P .PD \f[B]Path\f[R] means a file system path and file name. .PD 0 .P .PD \f[B]KeyPath\f[R] means an Erlang list of \f[B]atoms\f[R] representing nested names, e.g.\ [table,pack] for table.pack. .PD 0 .P .PD \f[B]Keys\f[R] means Lua table keys, the keys of a key\-value structure. .SS Functions .SS \f[B]\f[CB]init() \-> State.\f[B]\f[R] .SS \f[B]\f[CB]init([ State | TablePaths]) \-> State.\f[B]\f[R] .SS \f[B]\f[CB]init(State, TablePaths) \-> State.\f[B]\f[R] Create a new sandboxed state. If a state is given as an argument then that state will be used otherwise a new default be be generated. \f[CR]TablePaths\f[R] is a list of paths to functions which will be blocked. If none is given then the default list will be used. .SS \f[B]\f[CB]run(String | Binary) \-> {Result, State} | {error, Reason}.\f[B]\f[R] .SS \f[B]\f[CB]run(String | Binary, State) \-> {Result, State} | {error, Reason}.\f[B]\f[R] .SS \f[B]\f[CB]run(String | Binary, Flags, State) \-> {Result, State} | {error, Reason}.\f[B]\f[R] Spawn a new process which runs the string \f[CR]String\f[R] in \f[CR]State\f[R] where the default sandbox state will be used if none is given. \f[CR]Flags\f[R] is a map or keyword list which can contain the following fields .IP .EX #{max_time => MaxTime, max_reductions => MaxReds, spawn_opts => SpawnOpts} .EE .PP \f[CR]MaxReds\f[R] limits the number of reductions and \f[CR]MaxTime\f[R] (default 100 msecs) the time to run the string, \f[CR]SpawnOpts\f[R] are spawn options to the process running the evaluation. .SS \f[B]\f[CB]run(String | Binary) \-> {Result, State} | {error, Reason}.\f[B]\f[R] .SS \f[B]\f[CB]run(String | Binary, State) \-> {Result, State} | {error, Reason}.\f[B]\f[R] .SS \f[B]\f[CB]run(String | Binary, State, [ MaxReds | Flags ]) \-> {Result, State} | {error, Reason}.\f[B]\f[R] .SS \f[B]\f[CB]run(String | Binary, State, MaxReds, Flags) \-> {Result, State} | {error, Reason}.\f[B]\f[R] .SS \f[B]\f[CB]run(String | Binary, State, MaxReds, Flags, Timeout) \-> {Result, State} | {error, Reason}.\f[B]\f[R] This is the old interface to run. It still works but the new interface is recommended. Spawn a new process which runs the string \f[CR]String\f[R] in \f[CR]State\f[R] where the default sandbox state will be used if none is given. \f[CR]MaxReds\f[R] limits the number of reductions and \f[CR]TimeOut\f[R] (default 100 msecs) the time to run the string, \f[CR]Flags\f[R] are spawn options to the process running the evaluation. .SH AUTHORS Robert Virding. rvirding-luerl-772b25e/doc_legacy/man/luerl.30000664000232200023220000002433315114130670021444 0ustar debalancedebalance.\" Automatically generated by Pandoc 3.6 .\" .TH "luerl" "3" "2018\-2024" "" .SH Name luerl \- The basic interface to the Luerl system .SH Interface functions \- New Version The \f[B]Lua State\f[R] parameter is the state of a Lua VM instance. It must be created with the \f[B]luerl:init()\f[R] call and be carried from one call to the next. .PP As it is possible in Lua to create self\-referencing data structures, indeed the standard libraries have many instances of this, then using the functions which decode their return values will generate an error when they would cause an infinite loop during the decoding. An simple example is the top level table which contains a key \f[B]\f[CB]_G\f[B]\f[R] which references the top\-level table. .PP Note that Lua \f[B]Chunks\f[R] (see definition below) can travel between different States. They are precompiled bits of code, independent of State. That you can `carry around' this is no unique to Luerl but a low\-level implementation detail of the standard Lua \c .UR https://lua.org language .UE \c , for more on chunks \c .UR https://www.lua.org/manual/5.3/manual.html#3.3.2 read .UE \c \ the official Lua 5.3 \c .UR https://www.lua.org/manual/5.3/manual.html reference manual .UE \c \&. .SS Spec Definitions \f[B]Binary\f[R] means an Erlang binary string. .PD 0 .P .PD \f[B]Chunks\f[R] means a portion of precompiled bytecode. .PD 0 .P .PD \f[B]State\f[R] means a Lua State, this \f[I]is\f[R] a Lua VM instance. .PD 0 .P .PD \f[B]Path\f[R] means a file system path and file name. .PD 0 .P .PD \f[B]KeyPath\f[R] means an Erlang list of \f[B]atoms\f[R] representing nested names, e.g.\ [table,pack] for table.pack. .PD 0 .P .PD \f[B]Keys\f[R] means Lua table keys, the keys of a key\-value structure. .PP \f[B]CompileOptions\f[R] means a list of compiler options. Currently supported options are `return', which returns the errors and warnings, and `report' which will log the errors and warnings. .PP \f[B]LuaCallReturn = {ok, Result, State} | {lua_error, Error, State}\f[R] .PD 0 .P .PD This is the return value from evaluating a Lua call. .SS Functions .SS \f[B]\f[CB]luerl:init() \-> State\f[B]\f[R] Get a new Lua State = a fresh Lua VM instance. .SS \f[B]\f[CB]luerl:gc(State) \-> State\f[B]\f[R] Runs the garbage collector on a state and returns the new state. .SS \f[B]\f[CB]luerl:load(String|Binary[, CompileOptions], State) \-> {ok, Function, State} | CompileError\f[B]\f[R] Parse a Lua chunk as string or binary, and return a compiled chunk (`form'). .SS \f[B]\f[CB]luerl:loadfile(FileName[, CompileOptions], State) \-> {ok, Function, State} | CompileError\f[B]\f[R] Parse a Lua file, and return a compiled chunk (`form'). .SS \f[B]\f[CB]luerl:path_loadfile([Path, ], FileName[, CompileOptions], State) \-> {ok,Function,FullName,State} | {error, Reason}\f[B]\f[R] Search Path until the file FileName is found. Parse the file and return a compiled chunk (`form'). If Path is not given then the path defined in the environment variable LUA_LOAD_PATH is used. .SS \f[B]\f[CB]luerl:load_module(KeyPath, ErlangModule, State) \-> State\f[B]\f[R] Load \f[CR]ErlangModule\f[R] and install its table at \f[CR]KeyPath\f[R] which is \f[B]NOT\f[R] encoded. .SS \f[B]\f[CB]luerl:load_module_dec(EncodedKeyPath, ErlangModule, State) \-> State\f[B]\f[R] Load \f[CR]ErlangModule\f[R] and install its table at \f[CR]KeyPath\f[R] which is encoded. .SS \f[B]\f[CB]luerl:do(String|Binary|Form, State) \-> {ok, Result, NewState} | {lua_error, Error, State} | CompileError\f[B]\f[R] Evaluate a Lua expression and return its result which is \f[B]NOT\f[R] decoded, and the new Lua State. .SS \f[B]\f[CB]luerl:do_dec(String|Binary|Form, State) \-> {ok, Result, NewState} | {lua_error, Error, State} | CompileError\f[B]\f[R] Evaluate a Lua expression and return its result which is automatically decoded, and the new Lua State. .SS \f[B]\f[CB]luerl:dofile(Path, State) \-> {ok, Result, NewState} | {lua_error, Error, State} | CompileError\f[B]\f[R] Load and execute the Lua code in the file and return its result which is \f[B]NOT\f[R] decoded, and the new Lua State. Equivalent to doing luerl:do(\[lq]return dofile(`FileName')\[rq]). .SS \f[B]\f[CB]luerl:dofile_dec(Path[, State]) \-> {ok, Result, NewState} | {lua_error, Error, State} | CompileError\f[B]\f[R] Load and execute the Lua code in the file and return its result which is automatically decoded, and the new Lua State. .SS \f[B]\f[CB]luerl:call(FuncRef, ArgRefs, State) \-> {ok, Result, State}\f[B]\f[R] .SS \f[B]\f[CB]luerl:call_chunk(FuncRef, ArgRefs, State) \-> {ok, Result, State} | {lua_error, Error, State}\f[B]\f[R] Call a compiled chunk or function. Use the call_chunk, call has been kept for backwards compatibility. .SS \f[B]\f[CB]luerl:call_function(FuncRef | FuncPath, ArgRefs, State] \-> {ok, Result, State} | {lua_error, Error, State}\f[B]\f[R] Call a function already defined in the state. \f[CR]Result\f[R] is \f[B]NOT\f[R] decoded. .SS \f[B]\f[CB]luerl:call_function_enc(KeyPath, Args, State) \-> {ok, Result, State} | {lua_error, Error, State}\f[B]\f[R] Call a function already defined in the state. \f[CR]KeyPath\f[R] is a list of keys to the function. \f[CR]KeyPath\f[R] and \f[CR]Args\f[R] are automatically encoded, while \f[CR]Result\f[R] is \f[B]NOT\f[R] decoded. .SS \f[B]\f[CB]luerl:call_function_dec(KeyPath, Args, State) \-> {ok, Result, State} | {lua_error, Error, State}\f[B]\f[R] Call a function already defined in the state. \f[CR]KeyPath\f[R] is a list of keys to the function. \f[CR]KeyPath\f[R] and \f[CR]Args\f[R] are automatically encoded and \f[CR]Result\f[R] is automatically decoded. .SS \f[B]\f[CB]luerl:call_method(ObjRef, Method, ArgRefs, State) \-> {ok, Result, State} | {lua_error, Error, State}\f[B]\f[R] Call a method already defined in the state. \f[CR]Result\f[R] is \f[B]NOT\f[R] decoded. .SS \f[B]\f[CB]luerl:call_method_enc(KeyPath, Method, Args, State) \-> {ok, Result, State} | {lua_error, Error, State}\f[B]\f[R] Call a method already defined in the state. \f[CR]KeyPath\f[R] is a list of keys to the method. \f[CR]KeyPath\f[R], \f[CR]Method\f[R] and \f[CR]Args\f[R] are automatically encoded, while \f[CR]Result\f[R] is \f[B]NOT\f[R] decoded. .SS \f[B]\f[CB]luerl:call_method_dec(KeyPath, Method, Args, State) \-> {ok, Result, State} | {lua_error, Error, State}\f[B]\f[R] Call a method already defined in the state. \f[CR]KeyPath\f[R] is a list of keys to the method. \f[CR]KeyPath\f[R], \f[CR]Method\f[R] and \f[CR]Args\f[R] are automatically encoded and \f[CR]Result\f[R] is automatically decoded. .SS \f[B]\f[CB]luerl:get_table_keys(KeyPath, State) \-> {ok, Result, State} | {lua_error, Error, State}\f[B]\f[R] Gets a value inside the Lua state. \f[CR]KeyPath\f[R] and \f[CR]Result\f[R] are \f[B]NOT\f[R] encoded/decoded. .SS \f[B]\f[CB]luerl:get_table_keys_dec(KeyPath, State) \-> {ok, Result, State} | {lua_error, Error, State}\f[B]\f[R] Gets a value inside the Lua state. \f[CR]KeyPath\f[R] is automatically encoded and \f[CR]Result\f[R] is decoded. .SS \f[B]\f[CB]luerl:set_table_keys(KeyPath, Value, State) \-> {ok,State} | {lua_error, Error, State}\f[B]\f[R] Sets a value inside the Lua state. \f[CR]KeyPath\f[R] and \f[CR]Value\f[R] are \f[B]NOT\f[R] encoded. .SS \f[B]\f[CB]luerl:set_table_keys_dec(KeyPath, Value, State) \-> {ok, Result, State} | {lua_error, Error, State}\f[B]\f[R] Sets a value inside the Lua state. \f[CR]KeyPath\f[R] and \f[CR]Value\f[R] are automatically encoded and \f[CR]Result\f[R] is decoded. .SS \f[B]\f[CB]luerl:get_table_key(Table, Key, State) \-> {ok, Result, State} | {lua_error, Error, State}\f[B]\f[R] Gets the value of a key in a table. \f[CR]Table\f[R] and \f[CR]Key\f[R] are \f[B]NOT\f[R] encoded and \f[CR]Result\f[R] is \f[B]NOT\f[R] decoded. .SS \f[B]\f[CB]luerl:set_table_key(Table, Key, Value, State) \-> {ok, State} | {lua_error, Error, State}\f[B]\f[R] Sets the value of a key in a table. \f[CR]Table\f[R], \f[CR]Key\f[R] and \f[CR]Value\f[R] are \f[B]NOT\f[R] encoded. .SS \f[B]\f[CB]luerl:get_stacktrace(State) \-> [{FuncName,{file,FileName},{line,Line}}]\f[B]\f[R] Return a stack trace of the current call stack in the state. .SS \f[B]\f[CB]luerl:encode(Term, State) \-> {LuerlTerm,State}\f[B]\f[R] Encode the Erlang representation of a term into Luerl form updating the state when necessary. .SS \f[B]\f[CB]luerl:encode_list([Term], State) \-> {[LuerlTerm],State}\f[B]\f[R] Encode a list of Erlang term representations into a list of Luerl forms updating the state when necessary. .SS \f[B]\f[CB]luerl:decode(LuerlTerm, State) \-> Term\f[B]\f[R] Decode a term in the Luerl form into its Erlang representation. .SS \f[B]\f[CB]luerl:decode_list([LuerlTerm], State) \-> [Term]\f[B]\f[R] Decode a list of Luerl terms into a list of Erlang representations. .SS \f[B]\f[CB]luerl:put_private(Key, Term, State) \-> State.\f[B]\f[R] Puts a private value under key that is not exposed to the runtime. .SS \f[B]\f[CB]luerl:get_private(Key, State) \-> Term.\f[B]\f[R] Get a private value for the given key. .SS \f[B]\f[CB]luerl:delete_private(Key, State) \-> Term.\f[B]\f[R] Deletes the private value for the given key. .SS Passing String in the Erlang Shell Here we are going to look at passing in command strings into the \f[CR]luerl:do/2\f[R] function, especially when these strings contain Lua strings. The problem is to make sure that the strings in the Lua commands are processes correctly. .PP First just just doing it from the standard Lua shell as the source of truth: .IP .EX >return \[dq]aéb\[rs]235c\[dq] aéb?c >string.byte(\[dq]aéb\[rs]235c\[dq], 1, 20) 97 195 169 98 235 99 .EE .PP Now doing it from Erlang where I need to use \[rs]\[rs] to get a \[rs] into the string: .IP .EX 1> St = luerl:init(), ok. ok 2> f(S), S = \[dq]return \[aq]aéb\[rs]\[rs]235c\[aq]\[dq]. [114,101,116,117,114,110,32,39,97,233,98,92,50,51,53,99,39] 3> f(R), {ok,R,_} = luerl:do(S, St), io:write(R). [<<97,195,169,98,235,99>>] .EE .PP Now doing it from Elixir using the \f[CR]\[ti]C\f[R] sigil to get the handling of the string right: .IP .EX iex(1)> st = Luerl.init(); :ok :ok iex(4)> s = \[ti]C\[dq]return \[aq]aéb\[rs]235c\[aq]\[dq] [114,101,116,117,114,110,32,39,97,233,98,92,50,51,53,99,39] iex(3)> {ok,r,_} = Luerl.do(st, s); r [<<97, 195, 169, 98, 235, 99>>] .EE .PP So it works as expected. We use \f[CR]io:write\f[R] to write out the characters in the binary without any parsing or trying to be smart. .SH AUTHORS Jean Chassoul, Robert Virding.