diff --git a/.gitignore b/.gitignore index 4b87a690..437db596 100644 --- a/.gitignore +++ b/.gitignore @@ -1,9 +1,30 @@ -.DS* -.waf-1* -.waf3-* -.lock* -*.pyc -*.pyo -build/ -VERSION -unit-tests.conf +# Emacs +*~ +\#*\# +/.emacs.desktop +/.emacs.desktop.lock +*.elc +.\#* + +# Visual Studio Code +.vscode/ + +# macOS +.DS_Store +.AppleDouble +.LSOverride +._* + +# Waf build system +/build/ +.waf-*-*/ +.waf3-*-*/ +.lock-waf* + +# Compiled python code +__pycache__/ +*.py[cod] + +# Other +/unit-tests.conf +/VERSION diff --git a/.waf-tools/coverage.py b/.waf-tools/coverage.py index ce928838..cc581650 100644 --- a/.waf-tools/coverage.py +++ b/.waf-tools/coverage.py @@ -1,15 +1,15 @@ # -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*- -from waflib import TaskGen, Logs +from waflib import TaskGen def options(opt): - opt.add_option('--with-coverage', action='store_true', default=False, dest='with_coverage', - help='''Set compiler flags for gcc to enable code coverage information''') + opt.add_option('--with-coverage', action='store_true', default=False, + help='Add compiler flags to enable code coverage information') def configure(conf): if conf.options.with_coverage: if not conf.options.debug: - conf.fatal("Code coverage flags require debug mode compilation (add --debug)") + conf.fatal('Code coverage flags require debug mode compilation (add --debug)') conf.check_cxx(cxxflags=['-fprofile-arcs', '-ftest-coverage', '-fPIC'], linkflags=['-fprofile-arcs'], uselib_store='GCOV', mandatory=True) diff --git a/.waf-tools/default-compiler-flags.py b/.waf-tools/default-compiler-flags.py index bba2b1e6..54db7ea9 100644 --- a/.waf-tools/default-compiler-flags.py +++ b/.waf-tools/default-compiler-flags.py @@ -1,16 +1,17 @@ # -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*- -from waflib import Logs, Configure, Utils +from waflib import Configure, Logs, Utils def options(opt): - opt.add_option('--debug', '--with-debug', action='store_true', default=False, dest='debug', - help='''Compile in debugging mode with minimal optimizations (-O0 or -Og)''') + opt.add_option('--debug', '--with-debug', action='store_true', default=False, + help='Compile in debugging mode with minimal optimizations (-O0 or -Og)') def configure(conf): conf.start_msg('Checking C++ compiler version') - cxx = conf.env['CXX_NAME'] # CXX_NAME is the generic name of the compiler - ccver = tuple(int(i) for i in conf.env['CC_VERSION']) + cxx = conf.env.CXX_NAME # generic name of the compiler + ccver = tuple(int(i) for i in conf.env.CC_VERSION) + ccverstr = '.'.join(conf.env.CC_VERSION) errmsg = '' warnmsg = '' if cxx == 'gcc': @@ -28,13 +29,13 @@ def configure(conf): conf.flags = CompilerFlags() if errmsg: - conf.end_msg('.'.join(conf.env['CC_VERSION']), color='RED') + conf.end_msg(ccverstr, color='RED') conf.fatal(errmsg) elif warnmsg: - conf.end_msg('.'.join(conf.env['CC_VERSION']), color='YELLOW') + conf.end_msg(ccverstr, color='YELLOW') Logs.warn(warnmsg) else: - conf.end_msg('.'.join(conf.env['CC_VERSION'])) + conf.end_msg(ccverstr) conf.areCustomCxxflagsPresent = (len(conf.env.CXXFLAGS) > 0) @@ -53,10 +54,10 @@ def check_compiler_flags(conf): extraFlags = conf.flags.getDebugFlags(conf) if conf.areCustomCxxflagsPresent: missingFlags = [x for x in extraFlags['CXXFLAGS'] if x not in conf.env.CXXFLAGS] - if len(missingFlags) > 0: - Logs.warn("Selected debug mode, but CXXFLAGS is set to a custom value '%s'" - % " ".join(conf.env.CXXFLAGS)) - Logs.warn("Default flags '%s' are not activated" % " ".join(missingFlags)) + if missingFlags: + Logs.warn('Selected debug mode, but CXXFLAGS is set to a custom value "%s"' + % ' '.join(conf.env.CXXFLAGS)) + Logs.warn('Default flags "%s" will not be used' % ' '.join(missingFlags)) else: extraFlags = conf.flags.getOptimizedFlags(conf) @@ -106,6 +107,9 @@ def add_supported_linkflags(self, linkflags): class CompilerFlags(object): + def getCompilerVersion(self, conf): + return tuple(int(i) for i in conf.env.CC_VERSION) + def getGeneralFlags(self, conf): """Get dict of CXXFLAGS, LINKFLAGS, and DEFINES that are always needed""" return {'CXXFLAGS': [], 'LINKFLAGS': [], 'DEFINES': []} @@ -160,16 +164,14 @@ class GccBasicFlags(CompilerFlags): class GccFlags(GccBasicFlags): def getDebugFlags(self, conf): flags = super(GccFlags, self).getDebugFlags(conf) - version = tuple(int(i) for i in conf.env['CC_VERSION']) - if version < (5, 1, 0): + if self.getCompilerVersion(conf) < (5, 1, 0): flags['CXXFLAGS'] += ['-Wno-missing-field-initializers'] flags['CXXFLAGS'] += ['-fdiagnostics-color'] # gcc >= 4.9 return flags def getOptimizedFlags(self, conf): flags = super(GccFlags, self).getOptimizedFlags(conf) - version = tuple(int(i) for i in conf.env['CC_VERSION']) - if version < (5, 1, 0): + if self.getCompilerVersion(conf) < (5, 1, 0): flags['CXXFLAGS'] += ['-Wno-missing-field-initializers'] flags['CXXFLAGS'] += ['-fdiagnostics-color'] # gcc >= 4.9 return flags @@ -177,8 +179,8 @@ class GccFlags(GccBasicFlags): class ClangFlags(GccBasicFlags): def getGeneralFlags(self, conf): flags = super(ClangFlags, self).getGeneralFlags(conf) - version = tuple(int(i) for i in conf.env['CC_VERSION']) - if Utils.unversioned_sys_platform() == 'darwin' and version >= (9, 0, 0): # Bug #4296 + if Utils.unversioned_sys_platform() == 'darwin' and self.getCompilerVersion(conf) >= (9, 0, 0): + # Bug #4296 flags['CXXFLAGS'] += [['-isystem', '/usr/local/include'], # for Homebrew ['-isystem', '/opt/local/include']] # for MacPorts return flags @@ -194,7 +196,7 @@ class ClangFlags(GccBasicFlags): '-Wno-error=unneeded-internal-declaration', # Bug #1588 '-Wno-unused-local-typedef', # Bugs #2657 and #3209 ] - version = tuple(int(i) for i in conf.env['CC_VERSION']) + version = self.getCompilerVersion(conf) if version < (3, 9, 0) or (Utils.unversioned_sys_platform() == 'darwin' and version < (8, 1, 0)): flags['CXXFLAGS'] += ['-Wno-unknown-pragmas'] return flags @@ -206,7 +208,7 @@ class ClangFlags(GccBasicFlags): '-Wundefined-func-template', '-Wno-unused-local-typedef', # Bugs #2657 and #3209 ] - version = tuple(int(i) for i in conf.env['CC_VERSION']) + version = self.getCompilerVersion(conf) if version < (3, 9, 0) or (Utils.unversioned_sys_platform() == 'darwin' and version < (8, 1, 0)): flags['CXXFLAGS'] += ['-Wno-unknown-pragmas'] return flags diff --git a/.waf-tools/dependency-checker.py b/.waf-tools/dependency-checker.py index 629fbfd7..63199a51 100644 --- a/.waf-tools/dependency-checker.py +++ b/.waf-tools/dependency-checker.py @@ -4,10 +4,10 @@ from waflib import Options, Logs from waflib.Configure import conf def addDependencyOptions(self, opt, name, extraHelp=''): - opt.add_option('--with-%s' % name, type='string', default=None, - dest='with_%s' % name, + opt.add_option('--with-%s' % name, metavar='PATH', help='Path to %s, e.g., /usr/local %s' % (name, extraHelp)) -setattr(Options.OptionsContext, "addDependencyOptions", addDependencyOptions) + +setattr(Options.OptionsContext, 'addDependencyOptions', addDependencyOptions) @conf def checkDependency(self, name, **kw): @@ -18,8 +18,8 @@ def checkDependency(self, name, **kw): kw['mandatory'] = kw.get('mandatory', True) if root: - isOk = self.check_cxx(includes="%s/include" % root, - libpath="%s/lib" % root, + isOk = self.check_cxx(includes='%s/include' % root, + libpath='%s/lib' % root, **kw) else: isOk = self.check_cxx(**kw) diff --git a/.waf-tools/pch.py b/.waf-tools/pch.py index 3df299f5..103e7528 100644 --- a/.waf-tools/pch.py +++ b/.waf-tools/pch.py @@ -52,7 +52,7 @@ Note that precompiled header must have multiple inclusion guards. If the guards """ import os -from waflib import Task, TaskGen, Logs, Utils +from waflib import Task, TaskGen, Utils from waflib.Tools import c_preproc, cxx @@ -67,11 +67,6 @@ def options(opt): def configure(conf): if (conf.options.with_pch and conf.env['COMPILER_CXX'] in PCH_COMPILER_OPTIONS.keys()): - if Utils.unversioned_sys_platform() == "darwin" and conf.env['CXX_NAME'] == 'clang': - version = tuple(int(i) for i in conf.env['CC_VERSION']) - if version < (6, 1, 0): - # Issue #2804 - return conf.env.WITH_PCH = True flags = PCH_COMPILER_OPTIONS[conf.env['COMPILER_CXX']] conf.env.CXXPCH_F = flags[0] @@ -95,8 +90,8 @@ def apply_pch(self): if getattr(self, 'name', None): try: - task = self.bld.pch_tasks[self.name] - self.bld.fatal("Duplicated 'pch' task with name %r" % self.name) + task = self.bld.pch_tasks["%s.%s" % (self.name, self.idx)] + self.bld.fatal("Duplicated 'pch' task with name %r" % "%s.%s" % (self.name, self.idx)) except KeyError: pass @@ -109,7 +104,7 @@ def apply_pch(self): self.pch_task = task if getattr(self, 'name', None): - self.bld.pch_tasks[self.name] = task + self.bld.pch_tasks["%s.%s" % (self.name, self.idx)] = task @TaskGen.feature('cxx') @TaskGen.after_method('process_source', 'propagate_uselib_vars') @@ -134,7 +129,7 @@ def add_pch(self): x.env.append_value('CXXFLAGS', self.env['CXXPCH_F'] + [pch.target]) class gchx(Task.Task): - run_str = '${CXX} ${ARCH_ST:ARCH} ${CXXFLAGS} ${CPPFLAGS} ${CXXPCH_FLAGS} ${FRAMEWORKPATH_ST:FRAMEWORKPATH} ${CPPPATH_ST:INCPATHS} ${DEFINES_ST:DEFINES} ${CXXPCH_F:SRC} ${CXX_SRC_F}${SRC[0].abspath()} ${CXX_TGT_F}${TGT[0].abspath()}' + run_str = '${CXX} ${ARCH_ST:ARCH} ${CXXFLAGS} ${CXXPCH_FLAGS} ${FRAMEWORKPATH_ST:FRAMEWORKPATH} ${CPPPATH_ST:INCPATHS} ${DEFINES_ST:DEFINES} ${CXXPCH_F:SRC} ${CXX_SRC_F}${SRC[0].abspath()} ${CXX_TGT_F}${TGT[0].abspath()} ${CPPFLAGS}' scan = c_preproc.scan color = 'BLUE' ext_out=['.h'] diff --git a/.waf-tools/unix-socket.py b/.waf-tools/unix-socket.py index 52e038a1..07d1e9eb 100644 --- a/.waf-tools/unix-socket.py +++ b/.waf-tools/unix-socket.py @@ -1,6 +1,6 @@ # -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*- # -# Copyright (c) 2014, Regents of the University of California +# Copyright (c) 2014-2018, Regents of the University of California # # GPL 3.0 license, see the COPYING.md file for more information @@ -15,8 +15,9 @@ BOOST_ASIO_HAS_LOCAL_SOCKETS_CHECK = ''' def addUnixOptions(self, opt): opt.add_option('--force-unix-socket', action='store_true', default=False, - dest='force_unix_socket', help='''Forcefully enable Unix sockets support''') -setattr(Options.OptionsContext, "addUnixOptions", addUnixOptions) + help='Forcefully enable Unix sockets support') + +setattr(Options.OptionsContext, 'addUnixOptions', addUnixOptions) def configure(conf): def boost_asio_has_local_sockets(): @@ -26,4 +27,4 @@ def configure(conf): if conf.options.force_unix_socket or boost_asio_has_local_sockets(): conf.define('HAVE_UNIX_SOCKETS', 1) - conf.env['HAVE_UNIX_SOCKETS'] = True + conf.env.HAVE_UNIX_SOCKETS = True diff --git a/.waf-tools/websocket.py b/.waf-tools/websocket.py index 2aee1439..c30c48e1 100644 --- a/.waf-tools/websocket.py +++ b/.waf-tools/websocket.py @@ -6,7 +6,8 @@ import re def addWebsocketOptions(self, opt): opt.add_option('--without-websocket', action='store_false', default=True, dest='with_websocket', help='Disable WebSocket face support') -setattr(Options.OptionsContext, "addWebsocketOptions", addWebsocketOptions) + +setattr(Options.OptionsContext, 'addWebsocketOptions', addWebsocketOptions) @Configure.conf def checkWebsocket(self, **kw): @@ -15,7 +16,7 @@ def checkWebsocket(self, **kw): isMandatory = kw.get('mandatory', True) - self.start_msg('Checking for WebSocket includes') + self.start_msg('Checking for WebSocket++ includes') try: websocketDir = self.path.find_dir('websocketpp/websocketpp') @@ -24,40 +25,36 @@ def checkWebsocket(self, **kw): versionFile = websocketDir.find_node('version.hpp') if not websocketDir: - raise Errors.WafError('Corrupted: WebSocket version file not found') + raise Errors.WafError('WebSocket++ version file not found') try: txt = versionFile.read() except (OSError, IOError): - raise Errors.WafError('Corrupted: cannot read WebSocket version file') + raise Errors.WafError('Cannot read WebSocket++ version file') + version = [None, None, None] # Looking for the following: # static int const major_version = 0; # static int const minor_version = 7; # static int const patch_version = 0; - - version = [None, None, None] - majorVersion = re.compile('^static int const major_version = (\\d+);$', re.M) version[0] = majorVersion.search(txt) - minorVersion = re.compile('^static int const minor_version = (\\d+);$', re.M) version[1] = minorVersion.search(txt) - patchVersion = re.compile('^static int const patch_version = (\\d+);$', re.M) version[2] = patchVersion.search(txt) if not version[0] or not version[1] or not version[2]: - raise Errors.WafError('Corrupted: cannot detect websocket version') + raise Errors.WafError('Cannot detect WebSocket++ version') - self.env['WEBSOCKET_VERSION'] = [i.group(1) for i in version] + self.env.WEBSOCKET_VERSION = [i.group(1) for i in version] # todo: version checking, if necessary - self.end_msg('.'.join(self.env['WEBSOCKET_VERSION'])) + self.end_msg('.'.join(self.env.WEBSOCKET_VERSION)) - self.env['INCLUDES_WEBSOCKET'] = websocketDir.parent.abspath() - self.env['HAVE_WEBSOCKET'] = True + self.env.INCLUDES_WEBSOCKET = websocketDir.parent.abspath() + self.env.HAVE_WEBSOCKET = True self.define('HAVE_WEBSOCKET', 1) self.define('_WEBSOCKETPP_CPP11_STL_', 1) @@ -71,6 +68,6 @@ def checkWebsocket(self, **kw): Logs.warn(' curl -L https://github.com/zaphoyd/websocketpp/archive/0.7.0.tar.gz > websocket.tar.gz') Logs.warn(' tar zxf websocket.tar.gz -C websocketpp/ --strip 1') Logs.warn('Alternatively, WebSocket support can be disabled with --without-websocket') - self.fatal("The configuration failed") + self.fatal('The configuration failed') else: self.end_msg(str(error)) diff --git a/docs/_static/.gitignore b/docs/_static/.gitignore deleted file mode 100644 index e69de29b..00000000 diff --git a/docs/conf.py b/docs/conf.py index 6cf5ccbd..0e7d0004 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- # -# NFD - Named Data Networking Forwarding Daemon documentation build configuration file, created by -# sphinx-quickstart on Sun Apr 6 19:58:22 2014. +# NFD documentation build configuration file, created by +# sphinx-quickstart on Wed Mar 7 19:23:56 2018. # # This file is execfile()d with the current directory set to its # containing dir. @@ -21,10 +21,12 @@ import sys # documentation root, use os.path.abspath to make it absolute, like shown here. sys.path.insert(0, os.path.abspath('.')) + # -- General configuration ------------------------------------------------ # If your documentation needs a minimal Sphinx version, state it here. -#needs_sphinx = '1.0' +# +# needs_sphinx = '1.0' # Add any Sphinx extension module names here, as strings. They can be # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom @@ -46,149 +48,79 @@ def addExtensionIfExists(extension): addExtensionIfExists('sphinxcontrib.doxylink') -if os.getenv('GOOGLE_ANALYTICS', None): - addExtensionIfExists('sphinxcontrib.googleanalytics') +# sphinxcontrib.googleanalytics is currently not working with the latest version of Sphinx +# if os.getenv('GOOGLE_ANALYTICS', None): +# addExtensionIfExists('sphinxcontrib.googleanalytics') # Add any paths that contain templates here, relative to this directory. templates_path = ['_templates'] -# The suffix of source filenames. +# The suffix(es) of source filenames. +# You can specify multiple suffix as a list of string: +# +# source_suffix = ['.rst', '.md'] source_suffix = '.rst' -# The encoding of source files. -#source_encoding = 'utf-8-sig' - # The master toctree document. master_doc = 'index' # General information about the project. project = u'NFD - Named Data Networking Forwarding Daemon' copyright = u'2014-%d, Named Data Networking Project' % datetime.date.today().year +author = u'Named Data Networking Project' # The version info for the project you're documenting, acts as replacement for # |version| and |release|, also used in various other places throughout the # built documents. +# +# The short X.Y version. +# version = u'' +# The full version, including alpha/beta/rc tags. +# release = u'' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. -#language = None - -# There are two options for replacing |today|: either, you set today to some -# non-false value, then it is used: -#today = '' -# Else, today_fmt is used as the format for a strftime call. -#today_fmt = '%B %d, %Y' +# +# This is also used if you do content translation via gettext catalogs. +# Usually you set "language" from the command line for these cases. +language = None # List of patterns, relative to source directory, that match files and # directories to ignore when looking for source files. +# This patterns also effect to html_static_path and html_extra_path exclude_patterns = [] -# The reST default role (used for this markup: `text`) to use for all -# documents. -#default_role = None - -# If true, '()' will be appended to :func: etc. cross-reference text. -#add_function_parentheses = True - -# If true, the current module name will be prepended to all description -# unit titles (such as .. function::). -#add_module_names = True - -# If true, sectionauthor and moduleauthor directives will be shown in the -# output. They are ignored by default. -#show_authors = False - # The name of the Pygments (syntax highlighting) style to use. pygments_style = 'sphinx' -# A list of ignored prefixes for module index sorting. -#modindex_common_prefix = [] - -# If true, keep warnings as "system message" paragraphs in the built documents. -#keep_warnings = False +# If true, `todo` and `todoList` produce output, else they produce nothing. +todo_include_todos = False # -- Options for HTML output ---------------------------------------------- # The theme to use for HTML and HTML Help pages. See the documentation for # a list of builtin themes. -# html_theme = 'default' +# +# html_theme = 'alabaster' html_theme = 'named_data_theme' # Theme options are theme-specific and customize the look and feel of a theme # further. For a list of options available for each theme, see the # documentation. -#html_theme_options = {} +# +# html_theme_options = {} # Add any paths that contain custom themes here, relative to this directory. -html_theme_path = ['./'] - -# The name for this set of Sphinx documents. If None, it defaults to -# " v documentation". -#html_title = None - -# A shorter title for the navigation bar. Default is the same as html_title. -#html_short_title = None - -# The name of an image file (relative to this directory) to place at the top -# of the sidebar. -#html_logo = None - -# The name of an image file (within the static path) to use as favicon of the -# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 -# pixels large. -#html_favicon = None +html_theme_path = ['.'] # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, # so a file named "default.css" will overwrite the builtin "default.css". html_static_path = ['_static'] -# Add any extra paths that contain custom files (such as robots.txt or -# .htaccess) here, relative to this directory. These files are copied -# directly to the root of the documentation. -#html_extra_path = [] -# If not '', a 'Last updated on:' timestamp is inserted at every page bottom, -# using the given strftime format. -#html_last_updated_fmt = '%b %d, %Y' - -# If true, SmartyPants will be used to convert quotes and dashes to -# typographically correct entities. -#html_use_smartypants = True - -# Custom sidebar templates, maps document names to template names. -#html_sidebars = {} - -# Additional templates that should be rendered to pages, maps page names to -# template names. -#html_additional_pages = {} - -# If false, no module index is generated. -#html_domain_indices = True - -# If false, no index is generated. -#html_use_index = True - -# If true, the index is split into individual pages for each letter. -#html_split_index = False - -# If true, links to the reST sources are added to the pages. -#html_show_sourcelink = True - -# If true, "Created using Sphinx" is shown in the HTML footer. Default is True. -#html_show_sphinx = True - -# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True. -#html_show_copyright = True - -# If true, an OpenSearch description file will be output, and all pages will -# contain a tag referring to it. The value of this option must be the -# base URL from which the finished HTML is served. -#html_use_opensearch = '' - -# This is the file name suffix for HTML files (e.g. ".xhtml"). -html_file_suffix = ".html" +# -- Options for HTMLHelp output ------------------------------------------ # Output file base name for HTML help builder. htmlhelp_basename = 'nfd-docs' @@ -197,80 +129,68 @@ htmlhelp_basename = 'nfd-docs' # -- Options for LaTeX output --------------------------------------------- latex_elements = { -# The paper size ('letterpaper' or 'a4paper'). -#'papersize': 'letterpaper', + # The paper size ('letterpaper' or 'a4paper'). + # + # 'papersize': 'letterpaper', -# The font size ('10pt', '11pt' or '12pt'). -#'pointsize': '10pt', + # The font size ('10pt', '11pt' or '12pt'). + # + # 'pointsize': '10pt', -# Additional stuff for the LaTeX preamble. -#'preamble': '', + # Additional stuff for the LaTeX preamble. + # + # 'preamble': '', + + # Latex figure (float) alignment + # + # 'figure_align': 'htbp', } # Grouping the document tree into LaTeX files. List of tuples # (source start file, target name, title, # author, documentclass [howto, manual, or own class]). latex_documents = [ - ('index', 'nfd-docs.tex', u'NFD - Named Data Networking Forwarding Daemon Documentation', - u'Named Data Networking Project', 'manual'), + ('index', 'nfd-docs.tex', u'NFD - Named Data Networking Forwarding Daemon Documentation', + u'Named Data Networking Project', 'manual'), ] -# The name of an image file (relative to this directory) to place at the top of -# the title page. -#latex_logo = None - -# For "manual" documents, if this is true, then toplevel headings are parts, -# not chapters. -#latex_use_parts = False - -# If true, show page references after internal links. -#latex_show_pagerefs = False - -# If true, show URL addresses after external links. -#latex_show_urls = False - -# Documents to append as an appendix to all manuals. -#latex_appendices = [] - -# If false, no module index is generated. -#latex_domain_indices = True - # -- Options for manual page output --------------------------------------- # One entry per manual page. List of tuples # (source start file, name, description, authors, manual section). man_pages = [ - ('manpages/nfd', 'nfd', u'Named Data Networking Forwarding Daemon', None, 1), - ('manpages/nfdc', 'nfdc', u'interact with NFD management', None, 1), - ('manpages/nfdc-status', 'nfdc-status', u'show NFD status', None, 1), - ('manpages/nfdc-face', 'nfdc-face', u'show and manipulate NFD faces', None, 1), - ('manpages/nfdc-route', 'nfdc-route', u'show and manipulate NFD routes', None, 1), - ('manpages/nfdc-cs', 'nfdc-cs', u'show and manipulate NFD Content Store', None, 1), - ('manpages/nfdc-strategy', 'nfdc-strategy', u'show and manipulate NFD strategy choices', None, 1), - ('manpages/nfd-status', 'nfd-status', u'comprehensive report of NFD status', None, 1), - ('manpages/nfd-status-http-server', 'nfd-status-http-server', - u'NFD status HTTP server', None, 1), - ('manpages/ndn-autoconfig-server', 'ndn-autoconfig-server', - u'NDN auto-configuration server', None, 1), - ('manpages/ndn-autoconfig', 'ndn-autoconfig', - u'NDN auto-configuration client', None, 1), - ('manpages/ndn-autoconfig.conf', 'ndn-autoconfig.conf', - u'NDN auto-configuration client configuration file', None, 5), - ('manpages/nfd-autoreg', 'nfd-autoreg', u'NFD Auto-registration Server', None, 1), - ('manpages/nfd-asf-strategy', 'nfd-asf-strategy', u'NFD ASF Strategy', None, 7), + ('manpages/nfd', 'nfd', u'Named Data Networking Forwarding Daemon', '', 1), + ('manpages/nfdc', 'nfdc', u'Interact with NFD management', '', 1), + ('manpages/nfdc-status', 'nfdc-status', u'Show NFD status', '', 1), + ('manpages/nfdc-face', 'nfdc-face', u'Show and manipulate NFD faces', '', 1), + ('manpages/nfdc-route', 'nfdc-route', u'Show and manipulate NFD routes', '', 1), + ('manpages/nfdc-cs', 'nfdc-cs', u'Show and manipulate NFD Content Store', '', 1), + ('manpages/nfdc-strategy', 'nfdc-strategy', u'Show and manipulate NFD strategy choices', '', 1), + ('manpages/nfd-status', 'nfd-status', u'Comprehensive report of NFD status', '', 1), + ('manpages/nfd-status-http-server', 'nfd-status-http-server', u'NFD status HTTP server', '', 1), + ('manpages/ndn-autoconfig-server', 'ndn-autoconfig-server', u'NDN auto-configuration server', '', 1), + ('manpages/ndn-autoconfig', 'ndn-autoconfig', u'NDN auto-configuration client', '', 1), + ('manpages/ndn-autoconfig.conf', 'ndn-autoconfig.conf', u'NDN auto-configuration client configuration file', '', 5), + ('manpages/nfd-autoreg', 'nfd-autoreg', u'NFD auto-registration server', '', 1), + ('manpages/nfd-asf-strategy', 'nfd-asf-strategy', u'NFD ASF strategy', '', 7), ] -# If true, show URL addresses after external links. -#man_show_urls = False +# -- Options for Texinfo output ------------------------------------------- + +# Grouping the document tree into Texinfo files. List of tuples +# (source start file, target name, title, author, +# dir menu entry, description, category) +texinfo_documents = [] + doxylink = { - 'nfd' : ('NFD.tag', 'doxygen/'), + 'nfd' : ('NFD.tag', 'doxygen/'), } if os.getenv('GOOGLE_ANALYTICS', None): googleanalytics_id = os.environ['GOOGLE_ANALYTICS'] googleanalytics_enabled = True -redmine_project_url = "https://redmine.named-data.net/" +redmine_project_url = 'https://redmine.named-data.net/' diff --git a/docs/index.rst b/docs/index.rst index 4903931e..0c5094ee 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -2,9 +2,8 @@ NFD - Named Data Networking Forwarding Daemon ============================================= NFD is a network forwarder that implements and evolves together with the Named Data -Networking (NDN) `protocol `__. After the initial -release, NFD will become a core component of the `NDN Platform -`__ and will follow the same release cycle. +Networking (NDN) `protocol `__. NFD is a core +component of the `NDN Platform `__. NFD Documentation ----------------- diff --git a/tests/core/manager-base.t.cpp b/tests/core/manager-base.t.cpp index 49f8b985..947727cb 100644 --- a/tests/core/manager-base.t.cpp +++ b/tests/core/manager-base.t.cpp @@ -1,6 +1,6 @@ /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */ /* - * Copyright (c) 2014-2017, Regents of the University of California, + * Copyright (c) 2014-2018, Regents of the University of California, * Arizona Board of Regents, * Colorado State University, * University Pierre & Marie Curie, Sorbonne University, @@ -24,13 +24,13 @@ */ #include "core/manager-base.hpp" -#include "manager-common-fixture.hpp" +#include "tests/manager-common-fixture.hpp" +#include #include #include #include #include -#include namespace nfd { namespace tests { diff --git a/tests/daemon/face/generic-link-service.t.cpp b/tests/daemon/face/generic-link-service.t.cpp index 3d803a15..dfb048cd 100644 --- a/tests/daemon/face/generic-link-service.t.cpp +++ b/tests/daemon/face/generic-link-service.t.cpp @@ -26,8 +26,8 @@ #include "face/generic-link-service.hpp" #include "face/face.hpp" -#include "test-common.hpp" #include "dummy-transport.hpp" +#include "tests/test-common.hpp" #include #include diff --git a/tests/other/wscript b/tests/other/wscript index 926ba9db..3c6d1c00 100644 --- a/tests/other/wscript +++ b/tests/other/wscript @@ -1,7 +1,6 @@ # -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*- - """ -Copyright (c) 2014-2016, Regents of the University of California, +Copyright (c) 2014-2018, Regents of the University of California, Arizona Board of Regents, Colorado State University, University Pierre & Marie Curie, Sorbonne University, @@ -30,29 +29,21 @@ def build(bld): for module, name in {"cs-benchmark": "CS Benchmark", "pit-fib-benchmark": "PIT & FIB Benchmark"}.items(): # main - bld(target='unit-tests-%s-main' % module, - name='unit-tests-%s-main' % module, - features='cxx', - source='../main.cpp', - use='BOOST', - defines=['BOOST_TEST_MODULE=%s' % name] - ) - + bld.objects(target='other-tests-%s-main' % module, + source='../main.cpp', + use='BOOST', + defines=['BOOST_TEST_MODULE=%s' % name]) # module - bld.program(target='../../%s' % module, - features='cxx cxxprogram', - source=bld.path.ant_glob(['%s*.cpp' % module]), - use='daemon-objects unit-tests-base unit-tests-%s-main' % module, - includes='.', - install_path=None, - defines=['UNIT_TEST_CONFIG_PATH=\"%s/tmp-files/\"' % bld.bldnode] - ) + bld.program(name=module, + target='../../%s' % module, + source=bld.path.ant_glob('%s*.cpp' % module), + use='daemon-objects unit-tests-base other-tests-%s-main' % module, + defines=['UNIT_TEST_CONFIG_PATH="%s"' % bld.bldnode.make_node('tmp-files')], + install_path=None) # face-benchmark does not rely on Boost.Test - bld.program(target='../../face-benchmark', - features='cxx cxxprogram', - source=bld.path.ant_glob(['face-benchmark*.cpp']), + bld.program(name='face-benchmark', + target='../../face-benchmark', + source=bld.path.ant_glob('face-benchmark*.cpp'), use='daemon-objects', - includes='.', - install_path=None - ) + install_path=None) diff --git a/tests/rib/rib-manager.t.cpp b/tests/rib/rib-manager.t.cpp index e141368d..55ae1c8c 100644 --- a/tests/rib/rib-manager.t.cpp +++ b/tests/rib/rib-manager.t.cpp @@ -24,9 +24,10 @@ */ #include "rib/rib-manager.hpp" -#include "manager-common-fixture.hpp" #include "core/fib-max-depth.hpp" +#include "tests/manager-common-fixture.hpp" + #include #include #include diff --git a/tests/wscript b/tests/wscript index 0ab7ec64..7e9300ff 100644 --- a/tests/wscript +++ b/tests/wscript @@ -1,7 +1,6 @@ # -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*- - """ -Copyright (c) 2014-2016, Regents of the University of California, +Copyright (c) 2014-2018, Regents of the University of California, Arizona Board of Regents, Colorado State University, University Pierre & Marie Curie, Sorbonne University, @@ -28,55 +27,49 @@ top = '..' def build(bld): # Unit tests - if bld.env['WITH_TESTS']: + if bld.env.WITH_TESTS: + config_path = 'UNIT_TEST_CONFIG_PATH="%s"' % bld.bldnode.make_node('tmp-files') - # common test modules - unit_test_base = bld( + # common test objects + bld.objects( target='unit-tests-base', - name='unit-tests-base', - features='cxx pch', - source=bld.path.ant_glob(['*.cpp'], excl='main.cpp'), + features='pch', + source=bld.path.ant_glob('*.cpp', excl='main.cpp'), use='core-objects', headers='../core/common.hpp boost-test.hpp', - defines='UNIT_TEST_CONFIG_PATH=\"%s/tmp-files/\"' % bld.bldnode, - ) + defines=[config_path]) for module, name in {"core": "Core Tests", "daemon": "Daemon Tests", "rib": "RIB Tests", "tools": "Tools Tests"}.items(): - # main() - bld(target='unit-tests-%s-main' % module, - name='unit-tests-%s-main' % module, - features='cxx', - use='BOOST', - source='main.cpp', - defines=['BOOST_TEST_MODULE=%s' % name] - ) + # main() for the module + bld.objects(target='unit-tests-%s-main' % module, + source='main.cpp', + use='BOOST', + defines=['BOOST_TEST_MODULE=%s' % name]) + + node = bld.path.find_dir(module) + src = node.ant_glob('**/*.cpp', excl=['face/*ethernet*.cpp', + 'face/pcap*.cpp', + 'face/unix*.cpp', + 'face/websocket*.cpp']) + if bld.env.HAVE_LIBPCAP: + src += node.ant_glob('face/*ethernet*.cpp') + src += node.ant_glob('face/pcap*.cpp') + if bld.env.HAVE_UNIX_SOCKETS: + src += node.ant_glob('face/unix*.cpp') + if bld.env.HAVE_WEBSOCKET: + src += node.ant_glob('face/websocket*.cpp') # unit-tests-%module - unit_tests = bld.program( - target='../unit-tests-%s' % module, - features='cxx cxxprogram', - source=bld.path.ant_glob(['%s/**/*.cpp' % module], - excl=['%s/**/ethernet*.cpp' % module, - '%s/**/unix*.cpp' % module, - '%s/**/websocket*.cpp' % module]), - use='%s-objects unit-tests-base unit-tests-%s-main' % (module, module), - includes='.', - install_path=None, - defines='UNIT_TEST_CONFIG_PATH=\"%s/tmp-files/\"' % bld.bldnode, - ) + bld.program(name='unit-tests-%s' % module, + target='../unit-tests-%s' % module, + source=src, + use='%s-objects unit-tests-base unit-tests-%s-main' % (module, module), + defines=[config_path], + install_path=None) - if bld.env['HAVE_LIBPCAP']: - unit_tests.source += bld.path.ant_glob('%s/**/ethernet*.cpp' % module) - - if bld.env['HAVE_UNIX_SOCKETS']: - unit_tests.source += bld.path.ant_glob('%s/**/unix*.cpp' % module) - - if bld.env['HAVE_WEBSOCKET']: - unit_tests.source += bld.path.ant_glob('%s/**/websocket*.cpp' % module) - - # Other tests (e.g., stress tests that can be enabled even if unit tests are disabled) - if bld.env['WITH_TESTS'] or bld.env['WITH_OTHER_TESTS']: - bld.recurse("other") + # Other tests (e.g., stress tests and benchmarks that can be enabled even if unit tests are disabled) + if bld.env.WITH_TESTS or bld.env.WITH_OTHER_TESTS: + bld.recurse('other') diff --git a/tools/wscript b/tools/wscript index de4cb78c..7f4ff7f6 100644 --- a/tools/wscript +++ b/tools/wscript @@ -1,59 +1,88 @@ # -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*- +""" +Copyright (c) 2014-2018, Regents of the University of California, + Arizona Board of Regents, + Colorado State University, + University Pierre & Marie Curie, Sorbonne University, + Washington University in St. Louis, + Beijing Institute of Technology, + The University of Memphis. -from waflib import Utils, Context +This file is part of NFD (Named Data Networking Forwarding Daemon). +See AUTHORS.md for complete list of NFD authors and contributors. + +NFD is free software: you can redistribute it and/or modify it under the terms +of the GNU General Public License as published by the Free Software Foundation, +either version 3 of the License, or (at your option) any later version. + +NFD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; +without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +PURPOSE. See the GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along with +NFD, e.g., in COPYING.md file. If not, see . +""" top = '..' +from waflib import Context, Utils + def build(bld): - TOOLS_DEPENDENCY = 'core-objects NDN_CXX BOOST LIBRESOLV' + commonDeps = 'core-objects NDN_CXX BOOST LIBRESOLV' # Single object tools: # tools/example-tool.cpp is a self-contained tool with a main() function # and is built as build/bin/example-tool. # These tools cannot be unit-tested. - for i in bld.path.ant_glob(['*.cpp']): - name = str(i)[:-len('.cpp')] - bld.program(target='../bin/%s' % name, - source=[i], - use=TOOLS_DEPENDENCY) + for tool in bld.path.ant_glob('*.cpp'): + name = tool.change_ext('').path_from(bld.path.get_bld()) + bld.program(name=name, + target='../bin/%s' % name, + source=[tool], + use=commonDeps) # Sub-directory tools: # tools/example-tool/**/*.cpp is compiled and linked into build/bin/example-tool. # tools/example-tool/main.cpp must exist and must contain the main() function. # All other objects are collected into 'tools-objects' and can be unit-tested. testableObjects = [] - for name in bld.path.ant_glob(['*'], dir=True, src=False): - mainFile = bld.path.find_node(['%s/main.cpp' % name]) + for subdir in bld.path.ant_glob('*', dir=True, src=False): + mainFile = subdir.find_node('main.cpp') if mainFile is None: continue # not a C++ tool - srcFiles = bld.path.ant_glob(['%s/**/*.cpp' % name], excl=['%s/main.cpp' % name]) + + name = subdir.path_from(bld.path) + srcFiles = subdir.ant_glob('**/*.cpp', excl=['main.cpp']) + srcObjects = '' if srcFiles: srcObjects = 'tools-%s-objects' % name bld.objects(target=srcObjects, source=srcFiles, - use=TOOLS_DEPENDENCY, - includes='%s' % name) + use=commonDeps, + includes=name) testableObjects.append(srcObjects) - else: - srcObjects = '' - bld.program(target='../bin/%s' % name, + bld.program(name=name, + target='../bin/%s' % name, source=[mainFile], - use=TOOLS_DEPENDENCY + ' ' + srcObjects, - includes='%s' % name) + use=commonDeps + ' ' + srcObjects, + includes=name) - bld(target='tools-objects', - export_includes='.', - use=testableObjects) + bld.objects(target='tools-objects', + source=[], + export_includes='.', + use=testableObjects) - scripts = bld.path.ant_glob(['*.sh', '*.py']) - bld(features='subst', - name='scripts', - target=['../bin/%s' % node.change_ext('') for node in scripts], - source=scripts, - install_path='${BINDIR}', - chmod=Utils.O755, - VERSION=Context.g_module.VERSION) + # Scripts + for script in bld.path.ant_glob(['*.sh', '*.py']): + name = script.change_ext('').path_from(bld.path.get_bld()) + bld(features='subst', + name=name, + target='../bin/%s' % name, + source=[script], + install_path='${BINDIR}', + chmod=Utils.O755, + VERSION=Context.g_module.VERSION) bld.install_files('${DATAROOTDIR}/ndn', bld.path.ant_glob('nfd-status-http-server-files/*')) diff --git a/waf b/waf index 6eabf32f..df0d24ed 100755 --- a/waf +++ b/waf @@ -1,7 +1,7 @@ #!/usr/bin/env python -# encoding: ISO8859-1 -# Thomas Nagy, 2005-2015 - +# encoding: latin-1 +# Thomas Nagy, 2005-2018 +# """ Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -32,13 +32,13 @@ POSSIBILITY OF SUCH DAMAGE. import os, sys, inspect -VERSION="1.8.9" -REVISION="8a9ccbc1c5d3936b0b08e972e4883a9a" -GIT="2a098b1e9bc626c19cbd47c1f670758c17edf54c" +VERSION="2.0.6" +REVISION="593191f496fe8c66231dfd5df26167ae" +GIT="459ddf50b622573ecfe36c12c076e0fcc610b01e" INSTALL='' -C1='#-' -C2='#+' -C3='#)' +C1='#2' +C2='#&' +C3='#%' cwd = os.getcwd() join = os.path.join @@ -165,5 +165,6 @@ if __name__ == '__main__': Scripting.waf_entry_point(cwd, VERSION, wafdir) #==> -#BZh91AY&SY 6*ZAD #)"D @ 8ap#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)>J}ieHCWmk^|dm}Uj{3Jw6p*T;(^;۱wv#)t=]3hH+{v#)3@={47qZ'nAދ3.#-xJ6aά{;SAxSn@9ϭoPxv={sm:4$z,8^WTʞch׾;}{=_w{L|wΰ<׸i=Wv GM9{kExEٮxݝ]Ϸr[,hC7}v>Mu ,Ͼ׾/}$*#-:-kjNj/+[{v(pa넨o`Xo=#)ڀ_a޻ol9wݝ} >Ít#+}o/gc=n׷{kzs﷊mm#)h_}kkP/UWo\֎'u6MnnԒu>z}ZUӡ}x]w9uW݄x_ZۼGϾ^ws@0kDϼ[z7;Gύ Ͻf:wwTѠWbЗop;sTwntxdu@:(5sC׷#)Gټ|_{@+UAOoOow@c}}wK[.x{ݳwW=9t*Hq;['bV_w[G[/}gm4}ޯ|C+av>znO=kY[wշ0W{}`+ͯ6^>A#)#)#)#)& #)&2d4z{9Cp;ߗ5)ڈF1tʍ \9ʩEJ,9QF~|TIHDH&h *Of0m64f+yauCa!jiLjN &֚͘tjɬ!H#-K[b開v#W*Ɖ7tCefCPoZtF% 32gPU|sWPzNqe9/8/x~yC$V1^75&}U4E9iUs[HB5zlX?tB|/tM إ bGl] HWDž+ v/AпGzoqOiKyap3[#+GFc[sQ/|k@¶f[LNꔂ=j߱^*P !%{ALaϩ݃ͶfD3sKJ+A_ArѤO8kپ<^EbM7ٔǨAvodی=]0U²lQGZXuw/>U5b2(!9Wֲ'lFSjBӉ2eb3|p UjwL'!)Nxϋ'.=aEqR J!/0/h1j#-]}/~Ҽ8#+wc,BL{jOSaFP#+G[4qMۺVoЪf'ȺlfiMtJ4^Ӣ1ȮUHRǦXb=#-Qev%|zx|jwv?&n&=j++Yg]=b‘6tkx߿J=gvn.FkGlFʳKOjk2=9f|4 "CNn!ppY%|Ƃl YA{#qS>Zreo|Z}jouV,N0YCmᩣgGrvׄC4-9BG9$:i&xK#$`#-{hv_UűL LH{?QP/Bsr=wN|9xGL&E:=ߏWsÿVz~ګz3쫡^\y=|yqaݤrΉBqмE[Эd",9{nA3MfM~j Q^S_i`Y`CIMx+ݿ߮XO@N4MTo-"+LGVzMnw1 :Cɧ"8p>=^VᲡK{t58سh=-}X{?K#ciPFt(aץb,ktj)>~^Lwocaz&.Ɇ85*gF4':v)0vU"s}h)s!إoNo*%ʷBCڤlx"Jk\u+#_4ٜ~8/=CmƝpǒY JިQ>\.sZdqf8RB__eEffh<]ϋ\qᄳ%(4VJz5z+jPVd"ctZ(f"jjM4tF"s$hAܚ`cJ#+#-#+w8zꗬTeJxrv)+K@4PM֘Ye}{=#56g{69Ds$IIk*wy4͙<#+#+ÞB?rjyiDq&QqzO(ַ4.xP Vvx_Q'ZG_G/WspX_]E=gʍNCzݰQKe"PT-95dqu6~{y2,JWJA|mOu2m>8vm/Z0;=urQ]ێ/ aoTG% ,H쩡h_JVR%/5CC0a&K5ST*܆rq^ F\46*jrY-c]]etʩ]?Et g4nqh)ծ#+&~Jok'9rpd{~3405#a]ԛ]*>7Ԥw|^㷎zJ{qu^DԌ="aIJdY& s,EނC hN͔+u5%\ۨ|qsqf T嚓)L&WښJ5I1okE;qV7X#+4{vV~I;.`#-,[0xbsҭi퍆tܞ4Ky!#+bK~y}!Qj})SmK0g#VMgY5co #νaXu8|Kpfiq{D/Oq9ZR0I7v*Th(2# l.VךwaVЍfC3R&#-1M+$D:v798䫓)C=p%p Dg& urevJ>ZᾧĖ^vslkLދ_fgU3I|#)f33m7ueċ icU=0Jxen*1{}B$RF-:"'z(xHBM'Q,e:g'7ᲾnD#+#+pt)Eg+&a3 ^^Pjcʋ ~Q uIE]8tӷ#-2LUBs=B9VJ#+IC).ү̓Qq9?u4jG0!"HeĠ7^iZM.; dE4w:T\Q#+Cџ95oڜĺ=i?H5AZgC *hΒec,HI#X 66v[ҳft#+#+`W#-#)嚟6ݸۥ#-0m;ƟTC;_zT&,X=Ͽ۽]&%WWPwsQk ѯrVމP$*=pG-♦J?:*tX@53`nIGySʥx`*Bd&soц +]K];7>E01XMզ#+&k ]CPFToBt)]aTe .E)*-|h8|3עJ3Q߾67G6H4B#+]Y[N[zy:)Z@qaäfƞ#-q#-Y:1AEc5 ޼Y׊oAΧf\-Yo~#-ğ݇T(_yٖ @DCZ2oOUڧm_!䴦ZAI$!eQLR&mCClg:vaRttU[^qʻ{-~\Ƙд=#HQ˼Ϯ3a4$u^0x>4Fev?ZCQh_?@xn00P% s堶Mi10֌8r,S3Lff|vG#+eaU$ͣG9h/}[m|ݨsy=,O8P񐀕'ja#ȯpV:Zw,hasi&z\l~2NZ^5U-5#+ZGKxZwK6٦]GEv4=3{0mQT"UY#&f`jJe)'EWv62&sBq~Za~K;楽c5 ܃I:L3uꖤ?R)KB#)bE#uO(~1y :op7! |c3#-xÍO_}o (<>s,8(RK>V>VFe}}5,9݄)6;0dd#-ߨ?t3c^`!-7_&_ cHD˻\o!Msbl=fo:Mf|4$l9z#+۷7 PDr3io '7:җ2ͧFZ؅` ŭbU!XaF5#Y٢hq:wAOI]F~ I`,wP%k|jG_@!&is?哴mvs?I=j5cO0'#){q\ ,0β-qL:s>X'[#rQiW|leuǦ.A6sp핁 [n l)暋q 7l\@\ˤ۶0c#-j|W#-t/U㱃36Ҫ g]4z{= |Mҝ<퇝̉zMzslr9opLu=Cl/.G =!P.Qן4j m&Nl-ͰفCNʣcNL|yK $ɄØ\r0E^LG8ZPYv j^]KO{]r8r[3୆3#+wo!^si=|zuRQSO{O2f]L#-*<1#)c9IM±$PFfst?Ȕ95E5dH&@B;ba )0Eu^w#LI۰Q2@B3 ,EZ|}x_:g S sIHE5aH!fB#fz1!YKmQEĀ {jV(M(bؒ]0KAq `)#-)9$WElx1~Xp9.a戌zbaõrXᶽfv:&l:m$#D$[X7-}p1( wo=84d㘈`úB‘>GuF0:dκhö@/99EoSE,BZvgmuOl|wֆ/7x _`xJsDG<180k5&&S?5)48YfkBb#-@CIДY6MXu7S+^-JwM_ٲ u$"TVBZ(Nrhu"BWuv| ;u5],K˷M^Z*-͍fWmslkͣ04 4q5XGJ `"kƱU8ȐϚWjN:.+\⵮qEo\؉~Zz_#)^fcnaէQN5͖h!cݳ NĂòWctAo~O/6Pcv/bj>DP1j!W/srK^uy2]sBɌoI#+м8cד80l#O?C:DZ45Wu5|߄oN#-!a#-EQWzMpd6J0NIcƠv180/7džfQ= UR!2@M9],zCn<'!rL%H?5LMaJ7q6-+9Ղb݆FHv 桉ibܕ`=aYq69*b@P@Ƒ A@+MimQQdPP"LѰLȱ46'#)f46XTVS  ##+pk'fk\#)mҮ<ת7w;?ccK jn<04Kp:kLd];c|JnJXy2#iT}W҂+evNL}u2dLbU+d56$<>)g!0q98%f&Q#-Z]5銔Q",D[ 1]ʔ#);%Z߫@l/9n?ͷ.LY1+;xQşOE򔮕ȟ *l?dpG- f^]-̿Ǧݙ@=ݬ+Ӿ[dSꐵUny%|0f[LgT4'0RYY#)nkkI5mJ#+ i@x3 cfGZ&* ώpq9lhq)93 m]5e'?XS=&~*%*GI87Ѡ>Vy=dy7x s=2}l*cZK:Fe#IEMXQ}mrg?#-V}P~;ÕI|tnpj0:c.cGTye<=_  'HtڨJP.c8u_vNxtzeqY<1<),' T!'y@5 oDeɤ壗-xO[_t(E=7ߛt8c4&r24D5#+DF7ʨᱤ$ Օ_˼:.WLRQ^Pl۷ݔOQo_ӷȶlY/F&u/I=g܅UH5F"Q .5!$qճ5"Ҵ>́O2VSW\#zh%E:t/7k'c/g%oZ2D9ALīPݺvq(1Gz׭y#-5iE2ԖOdĆlbTsZTmcۭ++w]kso~Q[!\Y-*ԴT0N4IE-B?j!}b,D췍o^?*( BlPùnfy[<\WPb~SG? (":KM-FzsQhIxYGL_ՍȡkMK^ޒF6!KWJ #\ <eZ%iE,0!!LUJ'siw H~S?߂Θ+ąI,di{VTeOjLvlSm-`#-]ƷO),w'}SC] >u5wOTHBPs Y !ݮ7G$Sߧߋ7~{(e0'SaBPCd(x\DYW;z^?+=pZ|b_ ,"=JR~ )-X~\ڊUI<ڈʔ, !Z(=0(z=t6O[EŪt,y;{_~ߚcȼ},hh}|>#@|C?o_SD9l:l"#+K1XG}YmI.aF#-xhϕST8s#-n/m_V>:VM^o#+wC1~gB<ٕoįI!JL{!h#-;z,SF=4aA#+B[1 =TSNCUpg-ղu>tx(695eجX)Vh/΂Nc\;~j4|%.IIyTU~E7|!6Z9„1vo␴$]?ʀHo& Edco0Ns݋6f$>8-KU%xCԝ9m&={p#I=4z3T:P$E#+`8y U_QdjMmhd!>"rd\8ȠG9#ZAeK< iN̜iG (g M}i;v#]/ԥœ( 2rVj #-;q4$SyjvgWt@bŸ C$! $.s̯ӵ?X~lG#)r^u,d%  lU$fLe#+Ҿ,ǻv죆=<"s]m춿n-oGo.5_IuW"g8j$ALҏ?Yt͜Uv~xҸj:׊{0m6)rˋصp]h5e۟xg|~ jgzl> U '}[_65鷒PWL[59VvQQstk;to^RK#+헢5CNSU_tqۻ3cDkR"S㳛V,X$JX4<>.SW#+[*EcGZ4ca^jm_C'~Yٛ?r*ck֭[绛mZ#igF?"]rXWHc38qvM6梣wkLuIW2x)U/ǃF1S[k#tO#_6s=|XWu2(CϚ!_}N4<6%07M4Cƈ5ц#+'%?My6;"YF8OӐuYO]c-|5pEpq'&1}w7O2LzuN!&Ib(CqqCHNDI넕)Y#+b`rdj/ahgQìyۼW5y :7~牷z鎵yGȦwז:j~"ЇFLtuWszO7!y_)fi&E߯Ш>{}?o}xtdڴrKhow=˕Zzg| ^`~z`Jk,^h}*5M׶#)>#ܟ0naPOT)?vC2<vjF6͸ \yR6S'!:E廫V*JWeWWK/eMJ;%WOiv' 1fNE^sAlpj=p [vg2eQbtcdR0Rgd-R/CUJ֞Iҹ:jQDhwFVƎ#)lݎ)NP\>J䅙7AN$EzNBCq%3gߧYVm7Gѧ׿?G|kɥ:O3>43~ϗXz':.ߜ42*Wg3O;(~!p순zƦx!<00c;4*Y'MZ3""]󊰙O3w/p;kn`[^𶩘jg71vYnE8B`;&Z1 =jȾCN$]Bն t>nN*~RM9w\P*" Cނ Y~Ϊ*ʯ|ӯgu)6%{]r@agŦBR˧S\8U@m"XD<>b1PaX#ia4(*I&a J7*M`l魵 #+(̄ŋX ⴛ#+2M*i4#-B%۱p-tu& cx⚙Q5 }t-N,N}}gsz̆g#)8&~ȡ> @8i7.j"L"tl#+sT G@ѤH4DH@SۡhfيdCM#+E&Q"@D`@q <(_bwE6{>{gʻόC_]P#+2U4ZvV̟|*Mf4Zi!W>e!{X}G>/:f?l{~kZ~>%y}~^~l(޵[BKgedғRb0y÷ ~Gz)\D#r9/?#+\w?g5?]G10N|p{܁#-vX92p-05!a㑖#-M+qXV\R#)H d0,aLŭ#)182z^-f6M0vV %TJZyRʝ75tכƻ(X2)Si"0Xi.,_[|i=]sqv|̍U<#Rc192% ;ռծ[Ǜ'9P\Wt).TB5m꫗&粏Bv,|Qn'O겊Qe]rɝIö8XР.a2‰;06d GraXpc{t('t:I%;=l,7;A@ItG\ GherO h(7ⶒq¥9ׄ:INE;#+]g ?j<ˁe $)F#)D`(nj^K-OXf#-\.leoylG|xm+K0Ř&foEp=6e^,zc!0,$S[=iX(INl mf?(iz8SHV/y5u͚'sndwFI%u̫#+;[<4qҡ-OB ֦>Y0MN_8BZ#U/S: /mHG`5 )/5ffq dCXW)|?vgww|&M ! i(VA0{:WiaAdhiXjgLclm䜌qM1ѫb'rLr8h6B#ǘdHܴEF#+ Wz$StAZwA8ezgm1IuEy -Q+HL1u2 h[`3,`3QT=;NЋYXMNZ9(4(Jm;ub8fclUXd;STĎ'L4u9_%:qqHI'#m'2)(xZ}Jv;#+*t⢳ ӴXPOE:yeDg;!?urG{ iKutuS2)Kyay_n >XkvJKԍvn.w;Wq&Xʌm![f|M} \H^ )lL ԈӐ$dHCY+oH'H6u\J7ykm3i w;̓(5ʼn4hEar݆:#+Xo]uo]0cMjhB4Q>o?e ƚ};hATGՈùR"%1jVnnVe΄ک2ɩ4NXFPr$rWo׺qTb/iÎϑN׼m,{ L+ya9 ~ I/F͙F lY'#)) UbLFy(8jm+Yl57r6b[3+dhXcmӃ+eLff_#+w+], f2 9hvJ6#-H)kůc0='%iqI}7DBm8p# |x41LBq1"2ᠢ|a×fL*7G|g0=^Iup,`ID1@3 rl20{;]/+||^t$ֽ8zʶK)Bڪ;&j~˕vn\Ae(;n PvmgtQ6v5pD(DvLpuu d9уiJ4Sft01!ͳsT+#+J$k[Z].s%6gil16tӜurL82OJej[ɚLF>#N;D^8]V^-eyGO4qƊ?˷򮱇&+,<[Ks]}mϩ8r?#+Z./,Rr/} ȼNWƪ} lafpfW5Sy%]wjy*fYੌTcUYw59bHP# h<Ɩ̎̈0e2))@Q?wLdCí=Jr#˿_/?B~ǣo}Npe.Ze!&,OyJZq\YDc4t}ks}t,Z,:\QDŽME퓉u2BMƞilk#-R¯kï5o\{q3!3F0E㵁Q&/k0!L6ИIIφ:]&ͨ,Qa] ZҨsDNڥ1El|rɡYEDݞ"gߴaG2tك(pޣB+7Px+HF#ϓ&(u>tp@oؒlAwEt8uHiRptΓ9a<1jrp:}GRq /2mw=z1_=xsOaW-UW^sJ#+Ü ĐӃTPTVVw{% Yʵg{^$%A,.#JOJ ##Lr6/I-9Ԅ A+Pôu٣IW#S"noL).p}0x=_z~ LDeߑ6=ժyI56*RQ}'cbk#!РpD*]0/4avE B}3hu+֑:vL#+l-.N|9Д߂Yy4,.;C$5ɏ>ls&9{8j Z^̼[z@\k<1fWY'I钐q'#m`^'`3#+Y?K߭CLou$PsJLH1!t= Ng`)Q!d^XA<(r1w>}[rrOX̌—#5:%%gY?א9 pn,%twW15~6"چ7TC~~^Y-3/z֔_s7̽|Qk'Pf bN ?A^11nҦd9mjZr.Ԯ6vÚʕLfv!LjwʢN\{)s(W{1=ƫ#+&yx|ml(儡qnwwv9'/%$se3a?cݝ¹71=}'*L(8p9q#+/$.xc篵뾟&6p>TR!MP՚' `A͡y&APq<_&8.ϚrǔDc)#SVuK%[jmNUSќX#k#-whn;jzMAuQhc(vQʉל׵]DZSHp<ǿDno콻]5c?zO3=ƗݾkZb"o&jPq#^"a=܃#+%%l"ʦla킮 m"fh0I雋Pmb#+9'ؑ#)zIƖSҲئLAkmk{9͝cҀ5(S$?x9sRc>r:ƒe#EzUus#-G4E8~#;mc6 G7m1MY\tˉE²[PDTH;;6In"Dd=ܦ9Q!ā|I۷DYwӴ>l'>iu:IK~vZ?~.is9FFTAB1T̲{íe+Z1ϑrj ylw/#+Ho@9t0r)ӝÚ(8I1&Za}RHUO97v`2DKrPE2oʣ(#7K* 4Z:J!jm~Ldz|\9sTˈ0zw_#fbʼneѳ*Jl*Y\,פEQvi42|6U,5uP(a Ǜ)cr} g*hDغB6aχ>k5]V]>~PU_\LI#Lh۬BUㄞ#+uOwN$eflӃR"oԟhϽu!&_++deĪ3QSy%l]ӚBn '=R#~gto.ٔ'~D+ۅbͶ&[\~|=a58RQl5WTaq>zuz.wj>FHI#-p[qMsk2SCUэ4!גCLε&LLpmUrrׅNϪhޑ irI V3מ7XU{oOn3+-~+ÿlx>'ɣ*ѵД.~WDgTs6<_:-W$qe:=6ҭ.9ȦLJ;mOt?ŷܪ"y3MKYDmk uZ;a4%C,srґM2gY(ᝌ8tXn/u4>qd 1A``c<ЦSȍVO*#- Ͽ#-mľ{ 4%ax#+o{n3^+E%]2WyXxh,l(tꇞ\ K=u@V)c}碹G,5,L chl%c#-Iz|A|kA|X&Jךn9}L*EYdc|wN}g;r[aC/c1w6!"V$%п(߷ gfIrI&K]ρU;g{+6;泈g l._~9:k'~9?ΠawEw^eFq`3f̤b}xħ#-*`/"ww1l~?Z}q՝ 8vFKφ$6qקw3Z]=O|^^>JݘJ(VuXKSKúLbO% ]Daf8C^N=GJcW<-GYƖYtH{4a-ɉ+r6+DW{ll\<O?L鈩r}'cx1WZ1Y9K9A#+zV=01_E|[5rŇT뽴fw8,Pi'F8m'{ˁ'$yb#-W5ғsMyO9?G#z}{cG<::\[kB* e||矫y %{sg^!KI-2_5{绿_5g11GEַE5[1E;+Lmo#R&zGԶkC~VIi-0>>G)+BHdy[qQn`ԭ=7:ך?kZjTdet#U٪M!;44mpI3,٧sXSq7:劈t:e'eQA#hhc KƝ4B;VW Ba#+8%i$_~k<>=2tvZ2ўs1TZwiNkytu^~^ï#-nkJrsQӒ5sxV#-[::N"s/wbq>gUz<e}~ybQ1/A>!{짾1ߛX8Ѭy߂ߊl_QGN$J\'BGWuyz%?8G\`?4e|ef6| N!ǂU{Er[u釛{tJ$BLrud~K#).//[[+6K3rE06Y T9L{c<^ټ (>xjDOڑKNkrIw녾-:jm(n~)&8EϓܦnSFDML̙?MHϝ HĹoӃY\ N8(r hCZnD>g,4q,)L& =m4Md]Xg,Lfjc\*.Oz[wZќl4$|'Җ*4/k*{FoqOV!ru6=ADZQz1Wi;S[#-dKd =IIUXh9J*d3wL3-8vL`[t0iՒ2EH.~.2(t tn4=91+LM#)t`l~zDg|,]'|0VYojCU.r&}fMg^IK(< p!Ny#jGj~TNiskJGC0N%U6LY6"B-!hЁBp#)kF_(QyEU2h!4|ҜXƘuQaT=l'.ѻwq3U.{jhvh>"\FkIy~F/U71u9n롵Rj?yEpTHksφ(S3 \BmMT@W3R'~Utb"a$cot$dQnh2t-[}l+ENl*&VoOOAޤy~Hנ&@_V`b=6B}VO؟D&2Cx-5N#-'iP#-p/fF|*d^l-=:ŕȃ|QA2#+@uv@͢#-XsZ7Ҙ2[өڹoCq<4;3#UhM#-WzO=%!ƽ}`m}fpXCA*ZŁSҍ׾|#+nn2Ԭ̅#+XԠx)t42r jC ܸr&ѻSlbi5dCZ#-u=T]0ZnS[&ɠϦ:&!Hoזckk{⇽?Jh#+Lwu3{6UCt:~hٞR0X@@+mtsc3ciCBK|hk&$$Rdֳa|~=#~&}Z!#)Xh1E91VSivbEC6݇>r~:?2҉ޒ&(Ǘ<*0p\-pĠY-L|(NM@ȰQ?R\^Yd: EuIs1gƃ,#+\>i_7L= [ߣ*^͔;{@̉u_>;SΚA[z%Fc!Ng)1_`3b}d| ;$0X@j@L`Hh;Feԃ4ߺر2i>{#+Ȅcc#+3Lđ3j;ey=BqWJEm]WAX.Aؖ;SiD 2Yϰ+mAppS1.J|u; Nۓ#)*xƛ'l4|2QBiE1MxP"Vlw`qLU9hWz_VhmѼxN]`nG=&$j#QdQY:G=Ν[(-20hFS@d g3}ߏ_riE(С(!#+lo>{ŇM'@xCp#i;-aL@T >{)ZwJ*ݜY臼'ӯ'z$b]9p&QjDhb?TDd;t&++N:?^fw.ݩ97;0w-i8Dc*_m+_1f6;R(Lc\/TݣF(:\Z9'awS'+ZkBv5F#--y`=W_CC9DDmqMWє,xf|[7=*]TB6 Fh#+-br}3Rtܑhzwmu7C9m/u>#J(#-[#-m99CVu3I3" A6Z+_Eƽ+v5 Chma_.&2;vm(>7OE#G&[*heU$Wr +H: hG>& $%>`$󺖤G'FT aQ?lYY֧GZ#+08g*t6kmevbɼ:% (X,YHJXDo irjY'atwdrEsR<#+c`<*!]DUÉAgB \lYS#+"ޅCvN:UҵΛ:aRt8ݭGW"y#+nnlgգ?3cc]#-`5'Sg#+ܐK^5sWԺphbʀF # ;[:YֈTT1AJ*gfź`wsfu=ֲ7lŕ#͑@R`I1 RH,P"l/"Znag`5뵍IF,ʡtT ({Ŀ!#>|,Dټ2M2v`!E<6(YޚoLly`0 !$~#eo%xk\aω=Nr,ƔCF#-W*8 @4- j6J_ 3 kޣP{z#+#)׭+Ƥ'yu64ŁF |Wb9+]|/1EYB X$)4Ióe9}it 3S ayn CJ3gu)#-(t_Z ts꡺a1 s xo$GRP "N88lޔb,)h.#N:\!D;i%@bQu]j"b:!wK'*oL7:>AOs}"˽^Na*:*#-E7cr KBn=\9X> (@RU_NwlFZWƊ6PEoD∋#yJM -}8 y:vshĨˆ)Ǎ6jc!U'TERlUd8`#-(%!*Q#- Pݶ2(c$,t]#-/w6tR+#-vA&,m8G/e-1 Būm}<&1zQRSѭUc'5ӧ眢F~)~oImffq{1#)=O#+U F-^__d2fh5~wUk\$%bv_9N9W֡KklqfO@fjȤD@۸iQAr$2F0(PjD,({8z|R' W{:W-<";yX@H Kfp^*Y `n؜iTT;#-Ǯ:꨹MH:uӡ񤂅Hvvadž2ɉ .N ^v3pbciig#F8v x#+޼88qt8-J,q׾ؕ57#-L|Vq=| "Mn#+ QY66>CsPN#3\ʥ:=C(Y^T1CFq:&^#r s5.p$Ъ+KB"%G,ĚS4zZXx6*QTdF#kH(j v>[Yqixayē]lwמ-L>mX:[eg$%sXW6&5[܀!Ѱ2 `D\)P9<ZDڏH4Iq66L+ӆ]UY,#5#)@`vr#)by^:rjb{3A͑X>Fr1"8ͼ&?/^R<^|SU U'uHǪҪrbӡ[8,ܛ+̪m<ӃSRif챇Ͽ%htr+tv,fJNiO}!dH@)|&2FP_{+,I\v#-:HT$#+*iE[r7W~' PQ3&a`.;VB#4ivoN$iel||G/>!\AJ037~'2n9 J2-@sלX?ow|^+?UB )9SXjsդR#-l׾%qϻOk~5'дt|ٶqQ*ix)yx,=}V#-nqLL&rthخ|ۛ<.WVOF:O夳oYoQ"b㰱QD!;sBx-()a]6aY+j=`f&߂mw=-c ^ECL9{b}KMWԦaC=Zu1TNCg->1L)#-S('#-`X3Ҡf)[FxBA pw;{_GU3mTRe_T#*c ^lfnWrƆeWc]o_ۭۑ θA2021/yҶN0C#+10Xs@g~SZ},b(9~ZWG|Z9ok*0ϫ)%^~΢5L)\[>vfG(ifbbHKǤ}qL_aWb0gUXɕE\iu#)Of4R☡M@볳9#+XSs3{FJr JDfc oW0wLۥ"z޿"nԻƀ@")?O'.G[!B==5uq;t芜vn c)xslY>Eգ6CXB lf6wI7a߲\cuF?6쟉/B|%0}ZBHf V3xC.+0 ]v3 {WsohC~Q'(/dޝ6~s痓:z(4o߳c쓡&mݔn#|s|E$GG=#t>2q0Y$iuVg Uv'~PЫq#+Na=S0I#-=^֗kI4KzXhKF4TP"!Lgo|F-a/Kb )PC鏼\GgP##ExƧFN=.Mm.=m~1h~5gwIA#+Q.v~ʏv-W}%\ȨN~j"Z&^b rs|rח2{˻Ƅ3R#.8=p=E\08Lz}ۈ>O OdD-tzǗG:?S}v54a__MU3d"pVdދS+goorSJiaH֯B礍>G/$8oo#)[r_..$E ;YGvRp] 7B ;0jȂl\/1ҫM#Qqxަ.G!zh|eɎ5L)К!Y]n6^#)a#+#-yXah0cZQ@Q5FxނU^%tWrwyF#-X , !6WlkSO6v{N~l2#-s3 fo\Q @?]SH{y<ϟ b5z3FN) :ǒf?X=>,m^S=9|]rk#)nȻ9u&ǘP9\SϜM,%Jњ_E.tfW?N@s4jk|ϋzy>m)$ԠAO|{8BL'}u1E$ SmϷKT

r̄Wpnn6>$kC?Ãr'Ba^׬5l麝FQ=EdK\kfdhDW1(ܾU>u-!QUN^#9ٳvFBII7bL(¢cYV*XB@Dw0,F#-{(` ƻSۯ"k#-#+Q4]Đ$ne9?g^^LĞ2P|"$1ea1#+gXO1PHphp`ZJ]Yb٠/V%/@뚺q$j<̔#+QYֳr {˚`PoK/{yT/l؛ބt<9I/ NK62̄SP^0,~n]5Ҧwز=V'kh)lFv)Bbi#흟o;\D2`x+TcL~ڳ^ݭAݼq*d8MqW2'C7[\v_-]vD]C]\y;fz6`pƕf{afվ6aLUϝF5y}H<<Ӣ5Qق2,rׇg?at#v:q/Nv1TQaAң$>zާF4zXko(=5]9<#Q":ũ: #m`xX[{s) #-rLg~LJY#-A&jпlJǮ!Cj|NՖ֓x_#-k#-tfsbHUs?~#+IctLE-)lL.*oX=$*#)y(#)P!wܿ[џF/E]ඈIcǾPsqϧ4HsJM{2m#- }?8#HV;Qώmb[h׌$1;Ct i y= ښ%i})X$,&wk&Ip=~{1J4D6bD ^_K)$K]%˕VYd0= YHQh3h*bĩ$΍vυY9#fx2qamISt xo;Ck*ߏ^[U"3_TGm;US5(B!MEs='9݈׭QMGRgڪ̅m6TYn"aM0ꩱ_.׶|ql- Eu׸8x_:ú#I~34f*e8KY"VhP;~ZMi=Qa5m2ү(i+2NDJΑa9(3HE.KRrKaUdlr"6TB'Bqxgi;9Rfc]O/e޿89vwȮJڞ>#+z8x$=#%TPؖB9[=|]Yfz Ә07_4ISBӲiK%B7ݖC`)7FOS$TU,jg!I̓IϞEfTdBKX#+;o<}w1Xnr2 *+_}L}r ygrm#+H. NpAwyj[1˟uOZo1@e!};7{W9f CAgiJƵ?))W*\ Yw1D9y}{M7 #ʿzZTBl͋2^`bCل`*8I'WVv/[oyW% F-& NcP;zلn,8oMW͎ \ix~s<7vlxa:%7+"Ϝɝ,hZzJ(fjl’!FZƺ+V@v?>YŅSyXbe-ϻl<]ZmC(2Fi^}O;=UQ8h-ӯ>{>z9 [)?ϙZ ~bT0nqȄ@دm ڇK#pEH#)?eA?rUSlفZ&ʈة?=˷_wOy nTuÿt+ƕ;θ̴y^PoROw 3 x";Z?6TNNj҃ Xt/?:t6C)E?  |Iڦetcr>7 Lsҵ ?lD}ރXB]?k`؞}8" a)7881IBhVTɄIDe-E+eujHt7?7 O #+.\f[ZbP"o# H Y)#+#+,;aSrR gRvwvRG)(#'$GGgw.AHKA܎( lG8Ӈkn#+@euj jvKD4NP5,PA T^<CҔzىHt:2EsSlu u*+Z$zlIkOx_d3P`;XIvfFS);y#)ND7lWs~ey0鬭EqʑN."S>,"#Lf߲QkN3nD&˛a;Hɠv hpm9P7*#+<2žED(! 5f'o'w\7й93V9O$u&޲Β$NbWzT7O@<8>eYD—E3w~@4w}E0!7:u|;hD1 Cڙqh3h]I&D@w'N]x>ڑGSb&0Nh9 #)ϱk.QdX-e͛/X.`J@ x,Gv<^Ҿ>M&KGB㱇)Fo6q"*Sq?VJ#gq#+צK\;#-QM.#+"4,#+!>(?d"Ty׵1wЊ! R"DDY#-7:Fw ɬC|ʰE?UT"'m8aڃɱH~lz242=֜˩,6 d?#?\UǞ_"ũ*63^*!F$I7r,#g3#-#+ֱ-hSv\2J;Tèqm[ްK`ǦM7!Ě[aTnlg\͍參3ḋ+QᕚqodI(Qr=UP5$X8P#-\̪FS<z"2ȁ"`^`P;̱`ics?lj|zn~gkUo#+K*tR^r}iO!@C%p$ԣ+5Q_gE1A!> 53X+VXW_\dNh"$'I$|*'<]ô)2*1#-:FF<ʰQ1cm 9D!3dJC>eϐ2{H)&sCv}T\\v[JP=cYJ#+%s%#Ae@qK -@eKԐS`,C|@K#+Hp9%t^hcNaO9oX!6O!zv 5h@\S)!(M-I`qW_o~yQkDY]l̳֧Ktx"ȡoJ }<-CHΘ+7=#&`s#)莍G{#-#)v=!!0Aچ>3ռO`ww_OG|rSC0ø>b7 b=,!$uDP)SFy7W)C#Y^udj g%–9''2oMZ>LAfzsCoGaI.'>h^ kI?Dg͐!P:,ycB|9}ʺn^<>Q(VR>RpܚB.~Q%, #-&$hi{TN;:)1JHf &aQ$bC'W.<2^;1`Q{ tԛ91@3<|: #-z(,vmRUeXզo!}1=/P`|=Wn#);M٫9> 4xQg!ȷ-rWLuMdm#+bR?궴Ue1P12QRobB5ckB7*Bvd8{/c=>Z;D4#-~M}A/:ZuU[5 b`}l"ZH ĤMF!13UtIpI!K› )1<]LAk­DK H@`懲v"lI65z_D@1)GB&ifz"j65-~)|xfxxFiPERz)Dk )}؞aDob6J#-$#)?8T';U x&A~wk_#ߵ($m&S3|w|zgvZs3ȪmV@q3$13/N#_Ox4.ՠ|PW}2>@%|!}o!5dَLCJLAdD#-#)4`PcR!\ҏK Y($x$eç.ЁiscjAͳp{ϲr03#- C(v+pa姬~b7@4COgjL:KR.v]p,6꣧$J L,!}_Ȝ Bv fO#-קu\ONswg1gˏ#-3S|3;qMiO%u׈Fo׍F$@Pb( ~hT#-=,S,yT>sHE`&biH6?VU _qlcV DK;1A%$<(Rå! ؙ?ˣyW<:Z]I(d$dA=RZ5VUNR D\}N]P=g_(;4,|j*RdD0S4@4!ѿ'#);p`6}6K B7#+&e#g#)ڂ*$&"eLMu#bgZ%u^ޤºQV32#)/Ͽ^2x@1JXI2ltLFbzyTh|߄'xT6+s,-%i*@EeBLj2F6Y>wmQ&M\ CSvÍ3[wZS;v:N$N~#+J#+$*V"ڇJ8i7ZXN g)ިn:OJUszi;5!N~pFs)a.A:CQ)>x{&Cj Hp ä."hmKS>@,8 -Bgte=#FA/_Y標,>:-C nbN#+!@{^NB93S>g$r["EEQ#-'`,1ftfȜ}/&#+WJNwÞ&bm,t玜|MH~oÁO}lOLkٞέ5y_fԪ0P1M/uB1,U?zouCDXJz~B0hXpP>t@u!>2#) lݚ\I G=^GkB=7:MIZEwN΢*F?F6F&㫣7G#p k[v=M9H4oDK{8+mV܂%ʪERf*0aơF3}&b%!|c3gϽ`cBȘ|ПO\~zά}OEV%NPL`{v \wZ#)č9ję ބv4#+f=䢲xt@0 :(v`o]v2𷜹 8CO}Qb’S!|)K7$E@,R,Y! KvC|P)Kwz9a#;? ~ݳ.0»N+3=K"#){ɴ"e^6aշ1Uiz=XgQ؏Q+YW&BJ_zau˜t̶O)("e`(E! h#+1nݴЉ#-F*6,#- c(QZRD#-#+BKLX^xxlbM^-[]⊩#)?mO|a?q@ީ0 .) OVHŋ.el"$"H,ز{ 0‰ Aҭ˓s*i#+ ]'ɲ"//[q i{#+!yLX7m2m榫.c?ӯtʗԡj²Wa2`P3{=S#+QHZrjvvY ;W J7zRfwWs3|N}DwX;cw߉UxvuGcG+"|&@/3 90*dAqp(A#+mPj*B&0H5HV"(;ɛ2<"9H7Ƣo39D#+PT fղcƈ*°qjL҉CFl26Wv`(o Ɠ{4[.1+!$tlS\(|IܤZV|9Hx58Ő& 1L05>9jt͠2AHU$H ԅYHn9,)Gq(1e nK6aq}TI@(jd H@'PV)rU~CtGէm(钧k~HocxCG+- I#Z"u)3$AHLl_2>2M?tXF_]/A7_O[a4(ǎ#+(Γ *pNuk%N]ƕl D$DSaƶ.GWogL9d5w5ت4'݆ٙ:.o{c{n58Td?6.m7emܶƣiO3#)NU]Ʒߡx(7Ջ{ @UrdY#)UUtfVDJ,?Jhu+/XY*3\F^#]Mb;8x}AW^OӿLzoF T90vMu>F8>9jsc]6bm˟ UlЪו5ӕwF.2<-ScӪw9X]`;F%N/yy]7!/AG_V N𱝯o qQĨ4F ,\yylru^B<&O(f衫u: Z‘d2?N-[cc˜ѣPkqYKw}q (mtNxPI_y5c1b]c?Y;'=0ŋ'5j}ߗA` 2A}|?PAxL0r1Zy{)J}C]OϊkdvQV:\0hA c+dC\ poM 1~[/pMO*9|T ӀZ?HPf(Q;1A0!9iQŘoXvbT~SRDe2w rjGg߶[qoHhrG-2tgMe\Ze*&م{)'DcƂ*=j0 J]~Ж9N.'2#-b_Ȏ}xBUX$ʱ~)_۽rXX10 ?`r#)͔IJK@|ـRLhl d%o?#+Qŏ#+;d?wxRߐE x `ָSuL) 3pZ6EE$,eq{ą!%F#P?VLjwk7hnD*\ Y4v;\ fMgx1; ԆA иGq</-4;f/Drx##+_}: uwBAQA["\f?wqUUy-U+IW,#+CmSG@.k-,6cBn#-NGz~_ Ԁ`dnqNQE`{ x7,T:ZK׻sP`_tuRxyfI[sd;"j(̱:=4~;i0F#uB#)a#+#+c#+-*d94/d좙[8#)p}i`֮vb_QbONɸ~u{O* ,W#):cܜyU;%Kn>]+,F~(4j>,;ݠ@ 4hFC7mڊm#8d-Rݖ2% (ihU״D%'?.%ϯ;+VL3#+֦V  Ŏm D_°+#)7)}1!gpK#-r Uݩu0ONTeNu*vdƶ޲@ҤIݸ*r<#+/t8 7uWWE2=OY=ˆ{BhpQE qz.&#+-p)CO IMn#+u`As"bv#+^qNR匒j{GeDPYfpG~R9I0nN#1ic3Ʊz)ܛ|L6CWr^[6jb5Sc^7bSp*beb`AROeA=Hj[IOhΌш#-D641"bYKBe Jj&q#+\^|ca#-fR6H!C⚶55챬ح+#-y.ES#)`r @Ȥ='@HfH̦eW30#+`⎚34^dHN)6s-48FTbb<4#-SJ]lj_ˀdc^&|v.Q] .{}qmJÎGjcL~r>`@##+ ]m;xr׵ũgWRLv]0^x47Dݑ!!ԯ8i8%w>51Sr"2Lr*#-hoNB[X,"0EQ\SUaVSP0pjҺYjfUEkɁ-nh(J-C/Uo>faIi*@OP G/EFS*aA0>՟g{#??@# _Ae1VU70}>^UL0!"K=;I#+=e7 _k]>ҒXm1Pbmt&e(u{g#);`1&Ec}SWm[D-JZwرϖ\db;?gާ QJJߺ4:ֽtY{_ xʋ\ >~d#dAydCA!heT#+vA>m8#)Anw#)Lˇrҥ$KZy^l3E"WDQDH_\\&CЌ`z Ȟd>Z#-/HKo6DU&?Ib%N"$W U!,/O6)E+oacPu%(Շe qhu 0Pvfp@FA#+tAE H>fq#)H#) "4EȂ#){ |=n#->f%UF@0k#-iB 4 EZ-_}^o'nHo#+(Euǥn^z93\I/95<םMq%fr9ו]uVJ|!'Zo{-6d̑Tb,`# !%WEG|' #} {㎘b;1'L #+6n=PĶz|N/&en]^u59gr#Aq08#G6ZtQE L!LQ˙ҀKu*#-#)Q2&L["/oCHlur]RdԉD-5D갤(03"sz!Ai{Ea=CB>$IJ7|%v2R$MMI+wic>#)VÐX;$* υWD?;[°vHE1Ҧ4ϿSQPIQ@0 H^(TP,#)Ms@{G.,F/#}s/#?oxShPxGa@E#)Ġ:VA4fɀ04O~1 MesBdZ~}x_+A/㔛F8V?N9_keCB27O6ƤѬcf>an{zdTq.4g#y?b`uȉF09kMyyov9=xGRio!D0&c seRΫbŝ3ĭ]f^R]taJ A@M&};~:ѫC?i#սq0Z{,CgOOhБ̍]G+ iS|@3TmE3 ^]`gՂVk^U T,µm'JG:y)`Vn+5J.GKoͭ&&f\*^ J0bN;̶Kv#BW#)iئfC#)8#]rG&ohU[S>9n<ޑNhOuΉ#+WZ6ܷn[ڻJAQ5H#q:#)#+$[ >dV$*G3NG:m@Jn΂1 AHABwr`Cl#+nFG5ӀI /}xIfFӕ-mMĄVUW.yfy~#) !C3#+ GМ<s<哰/mEDQ#)#-8md@H(vMF튅ȏ_]E,*gv^s<ܻ{{faI#+#)F!$!:!&C!Ѓlm>thH&9' p)Q'oMRfTw @yМp[9J !R|9pn#+VUԩAl\\14xj 3p{-E#-9}l5%璸XI!~m#;, #)oȒh!6pa͢Z2 b" Nt@1&`CC@t~ tEZ82'~#)B"qysJ(heS $ZP*(רDN V!$A3(2 0PoŘûY!"8(@(߀EºN (Y13"%X#C+oյnۋ}Mmķ@BN \n Q||FOeB:[%0;h 12!7vؒ1墷hSTF%FN\GտNpJ8f!@pro+j=p(Ѣp$י `9VnqL۱mE&c#)׈HjUF"ǧ2uoB'2(B".6O#-=3r>˃95AJ1EQ"ְK?08)s"U Յc#)Rl]3- ,3TŎ ?h.4 &`l){`3B` ;}, D lL#ÉͮIzPP-NIM1*39'`0p ujt4ĸ0@"u`r1t2w<&;)9BO"2^[#+D$#-)8OvjDˎft?ogOn-2̒D3`Cv$#)diUR$A#+= d4Q6ͻ!NM#+HLd#-t%8OŌѨ`ʬT(YCލtc[gvkXR .f(@-%%UnR #3Yցj!L: Z@nr\Ymv!G 퀋ByTV'; NogCq]pS94ڦ 悒 _RB{4NGf2M<79'Odt_l0d߁eqd 'dd@0"\ip Ţzh;~iȳIbIMhxFI[m"#-`zP/#)[$(J^ϹW䯤콤h}K+tKOh#)#+#-Pz3dzω!#)#)$(4ڐ̓2YMi2Rd FJ$ *2Vd}=bd&JRY&Q3"#)14|Ab"HQQPj4MSf(LUf&Ȧ1!6QEHFp OmBaJ#Tqe"?h /Ac@qНHEJȰ36 [~l" -? &5xE3&nWb8\+rn.PIg=Nv׮m *4^]+H'xoa8&\{%^Z̈l1#-n 06>}WClR4hHb&STj64ԯ!3"LPcAph<ܹv4O˿\̾˃z֨O$F0'/|;a;մuY$>~Ob eCjzψh8%^3|ٷ)t.F7$f 9{h6A?edu$ L_T]?Mqw%|oF >zs#+Sk.Il7ܣ)Ԩ}Gy; ON;B'=;T.(GBsIDBw2h1wuiQi^y9kk40!= |YWRnm-lŎf]-cST1 Nah#+?s8R4sBvD8#+uy.<.(>g3ⅈ؝6;ߞu^of[CDtf ӃKXyGkDpU +*r1,;I1N9{iNiT‘)I4٥KLryQ !iKb%^3F=3xS':sj64K(B';#+f`s9ieDWBK|\.jp:uɔB`i< =-\b'J74zwfLK"Fj0qxl(4 3c4X~극nRo.7Q# ͼT&!VΆ'g4,>3pݺCCp.W#jrFЉsL\9$dME?^ΦNg; t7h =]-sqeco2o'XebsD;F(pwmh8RDERb~=oOS>xێ3I.q2:: `$Za:ĉqf7b;grߔhӴΦۂsߙ9-!pJ;7{F콸w|;'oﳂݼpcLx{)Ng QSSOcZP˧ܹF14L}MQxb#)- K!lLZ["^pCk#-=#+"5CCn";spprbna!VY&ZL^1#+@"L+^f.+]QYt)xԨL.pؐ ί.4L_\Й7EaS%nٷRwB:#t9ɣ4MgK2\eA Z::#+½ƝT!:t51p pk(C証pHX@GD&y[dݳ iTPpipXlmҗe9FKTZiʖ6NAȡbp#+.vHCǍ]F0QF=٢9$71Nyf^%lu֘67di#K[:&]c&%©%&o5UuhL,\>W付ٻ2f-h F#-kѬlkS]`Z<+,80Yϙua" eLnOZFb|u,q쵵!C0[DSD0fs);dlˑEjʘSB:,\Cbw(jf+H0j#u0L@%*BGN"cD;3'i$#-=L mHa,A(!F6:3|\CPUgO_@Q$WN "&$< k! ㇮s#+n|74>}G#+#+VkA׈s6SjtGCq#- b+:-!;{wTCI`U#+Xͦ[g!u-AS #-j6;Faɜc;|ƽ#-AI$p0#j^0ڝ"Qem/_uY Rv"#PPt R.|4lʋZI`]%H;}0u.( 2P釶}(5ɸu/\mdmihvջTcZqt̙ťk8unpqZ"K+k7yizW9"&㿔p婸"?)B\% 8֑Q[4J)* bd Aq@0#)R#)TD/&!Kӎ#+GA*-UF<9z66{_>PwW#)ÀlJF b3X~S44P>SPZE<&Cp~|#) G#.G>'4P^7"HG!(q&b#+#2?|EX30ZhDϡ;I 0IbRm2nDR` h_ӳ]#+%;G6ZEJA̺L*!sݚFEƁj4{4]׿򅊖 #+匶GQR)#%JVk$f*L[E_;mE\><4EDJ|$2^%#)[{=!Qm%#+#-B#)-lp(0-#))[Ip !!z(v.3PxލB?|*Hf`=jD;C|9 V,2몋 F--Xd! As$@@bu.he\_m'ZA j@UHlTC.t9bZ5GLH&j5Gvo<e1gpo'Aw5э(R+aY,0P."Ņc)Q`1#-QQy,Tѡ%T _3N¥-QBB_>A.6QyDFDK2`./z=vޒOR#-1HeU,]E֟k"@dQ}CtEsEA]#,GO=w独QF`x ?K45rpFCfDVF#+t}oƱ&#ƺ&;k-loE2dt5aLᘘ/#3?@sъg/JVPIݮce3!CX`niJg2GO =<ia8ְj?N3lsHwwp kfNU&l4Sm1a0T#+)e39p#+ciQ(ӳ9R6 GnX`0B61#-s.º0H` K#+#)q )@fؕ#)EBDVas0ӕ> 5@\`B'=lwz"]*pH.a37(C#-s)Z;@PjsTcXt3D="2I#$abM(Ih+k~e-Ei7Y[|hsp&~-QSo?1H9ç##+K]-tV%rÖuӆ8Ij)%|V)L>Sj Bv$`ۙ0-0#YN^s62  gs LM#+,^o2#+]|uZALSNyG#-6#+05gC/5B"(ŌmbŚA,ađr8btvnpp'ș8Hqa5S*ij@k\R#:y>#(o|/F3)N%d'΋"$qtJmtt +,2XY#+`b' &]u5eek̶CHL^`D ڒUA3Da)S%Q@JE)ΎW10aɞ?"9?j`޽:E;k۳ݾ{yZdGz$ !Tf/~S+2#s1 Ħ霉u7gs_f̉&.`AIow-;yR1#(%Ȏ֍.2|3pŹ02 #-drp@f /D@l:.l5;*S5*<(s&m'QH#)>ϠuY M2+#-'pSXeAT -"H#YJ%I뮪 $o6v]Ki,ڑLYLkDma eLY&ELIeK6]5dO[v](e%ZK6kdJص* IVղA*{TXjjxi-,3fVveTF螏L7M鄆,v;`KAmmo,Xf=eC/B9m]SN&<Poe:Ed R*UbCuI,Ub }#);c#_a=H蠰>Cj57D1g6јv~#) ROFWCq7X$Rĩ(VLGR6b'tOH#ˤ턨=Q L=@]&;%I`Q}ȣF :Pu&HΘC#+M#+]M`m(Ux#)7polc5G*]-j!8-E #)vu{EEH<#)b6mgVw"4c8W1ؼ:^*X"=_3҅X ;xRU4e py*]8PUOPUR\aϿE304%Ol8yD;! 16VMdMy%d'^*7dۼ۷h0Ѩ\jG!.FYoZ@6&hU0r&cXk[Xf+K;$q~0 B%q#)38[B>#)P76wf폒8U- ӝGhR,>#+i#+!Bm=wM>oX_ĚNsJ.PrIdwi!)sL&E #+޲Cw+h';y!s 80jHR#+~xp=zqW5W| Q˘ۥ8"Rdh;b ۣL$#>gt<}mo જw=Y?Eb;a͏ii}"BOPЛ-1X!*Ii@:I)ܯ*ve+eaB(=g]wyM2Ƭ[E!#)CMRimꢤR$.R:V3M̋HŀҸT*C,Py\(#-.7W/gr֌75f-iսGa "j:ɮҴ;TܣЈ*EԮΤ/Z:"q 2g0,{``* 9M:3RTB!L8C5&=j.+vJJwaf$#-#-P.RIH[jLex]mʺB*R4WH0lקu1a"@SV{W^/)>mٜT~&/rK5#iԉ,FT>jR T1ѵК0M#-Hu@"̧;A#+b`29BH4F,l,)ushtsʼn-mnʱ A*"WV0#) ,DJ,3P@aJ#+Voi5- Um PaN&3C@ N0:@ʡC6aN;ߠr4#+lex͇$T4PRHmv~#2ct53#D6뛁 !Ԧ+#M5uF&j5(iT7{I98B Z\8Nz"#+;*߁&EERA(tرjyIm95P."g6Ph` ZQ+D/lml36I7ꠒI' ??#1AZEjZƟDžkq5= E^oA{[v~P}Ɠ"#z+bg}~ߗ'#h`#+#cO{=C|y)Q9a P@d5Ec#-jlAYc_zԿanSt&+jW6UKji+Z20^#)سBJH4DMp#)ύB]iVMLAD8NaPLgc9ڙ[Ì\)N7h5vr+O!׼PX;A!;y>XKaH!D#-}6YXet:0Mk,#+2F#+q  44SYQ>jZf;9C*:TTڈR@RlL_V2=^{y!w&}g0,CRA)~WqM?uMVRX|! lsJ(hz5NlBtvsmeSf B)#+f$"#+BG#-k=p0HenɁsi9_#)hge|TIPLT{42w2~CFN~#-d >my*]7h#-Ea(ZI e-Iё~hJVsmM6QE2SMYek)Q6#hVm#+-iemQEXw?xg?+oLt[6Ƞrym.jعHT +:ǤߘRD$d DB7#):"~,X/.S7򲾽s(%P`xQO\O:`(ݴ`ܧ?5U‡'CA0#)*QG#);#+$D~C%UJ%E/j[ʕ R%=v̐:I!g(W@qU@j"jDI0x~wsV|r#-y;F^(q7q4OypE/W`5'a@ΚTw~#+ h(AJ!Cd.r*l!ēi3&:#-dQx$e>?_;#-:=~ ӦM0b(vPu&"zV'|I`^,.Zp$?s2@$"m=vmQ7ʛUO$w=LwD}_D=]KaXpŴ((-)>c Ϗlk>{3%!JX"b0,{8X(XE[`j@#-oQ]"a7,\0v.B(h?(ZiHn*HhQ7R0 #+6/4w"mW׆of'1 ᾄ:fRDZ5-{&Ft/ (/~X:h{MGd  @` #)PDM)B)): 8(#)$4#)PUD;%Ea<.)M˥JnhDR]&ĉ"B> עb|ED+MYwkKM:TSvN"bG p%$ {OuQ<'d+SnAk[P> P29Cd4K;> 4u#)"| | b q2)so#-1<`^$Y"ۯ![FRP#[$PXuTVxƚyعsK#+\RjFelQ`:FQ ?)N1 Kdi+/S9*iL"sv'0.Xs*Tcm.utygjGR[4o.EX$(#-[EhoK*@AdL؈;]=sWݼ %ȰoC6$ #-m8Ú&p4wmܲeI \ag1l&oɽd\?p[$FKPT`c`V+&݈G[RmmFՖ]ԗ6ۥ%JB$#-&~{2.7u֬[MڊUU_Y Bduh#)[ S3Rw DžZr+%Ā1`-m^\i5=5XӛI'\a؆9M\&X1`e91pG7&CnQ2p`p!VՠF#+ E"!`0 ]K!epC8OD4{(#-I&;Aח~/Zk?䆘/buSIyT 5>2Yĭxt @sk--JM6-eLTWZߑ5n5":o:cc喋[T[DEuՐ{fȧaGz(#)r&u>@@s*PP"qڜ'ϥǦ5VPm},O$͸3J "I aU\#-0{ćy5ϤcA\`EL.tHު"&.@z7jpS4zέNCB S1bӄ.!3))hkBbRn4m):ffe@A= _9wXճӟ^޽1on߉;}'hZP\a\׳DF`(t/Xbl#)I Հd.4j;l=q)1Tc*AJ(ܭh+7톧F&O8C57b8e0Y>.i2|X~4#X:7zO@Z#ޔ`°#-[J!~Zŝ氼i{1;HFgyZ66*/mA8B#+c{˽'uu5<Wx4*xB-g=+dNy&pQ:#+JcRÙ!/k6%"tl|Ea.y.HH?7Dg|7$,;Do~GZQHTը,\]Zu1[M*-M*۪ѺRkk*f56E;$;xVRÇ LlG5-ƢlQA7pc\ u3R{OQtA)uhvݸJS)V69Y$LIU@Q M-Fa՝ HZX!0Ž!^<dnrpo g^/oS&VJA@=s#+,ECzdc'h}W?  kZo_A+ br0Wk#)쨡B#+#+k<᭚TBiD~*.0ҋۅXqA{ /m-B#ZXj!clL8gj%?p^{y#mr#- 3*jq0yƢzAu׉TC~X6E$ > iNLg!*@ ~[)& -~n< dZsƸJ07,wqyhItL47xizOcLpapwAhjJ^8,/##+2}δ kpx&'=#+dD;,B#-rFGمgy| pd/`^>7С)6AɦgX,c@ˠ~6R>4= geouIj}C ^3ۯ `NayNˁ8IjBkثWcljڨLդ[5-U&PzO:9H#-A4?6 rmn@-ëDԊ#ra#-(lY^`vHVzv Vjǁ5xbHEa݄͹#p>|Tw #-a"Ғ6TN-ؐ#+S*@r B"BdT+Em+if$p9%Nz҈-,K3TLf#-6])dhZ)-#i~Z˰KV\|ѧC{ݍ5zNxU]^[vdkdɕLo{ޫle=#-ƘؚxቑqaY̓H!BP)zjC(ֆZ JQ۴k~[Ӣ1{n,I,'3Ce6eymYs^ueLJO&#+ ,#-#-ܲJ,+WҔk[LQiXJBfZ)KQRzRHcI5`#-lk+6+n۳CRA[Yr)+CdP̴b1ԛHMbPʜ#[ލC*40}qGXHfg.hkE#+7qcdtŦScq̊"аѪCPt#+ %nAam&ݗ]-X9H0HD '5`# 56c"BjX)X1.FMn0-ՃAVIiX5mƲe@ڑ"c#+ݢ߮\؎cx,C V6ph1ժM*1gt>^#+ aTaO7MɃ2u3[X2/c<|f0pˆx]#-&4e#,ZF4Y g!m@D!VK(`<"ugdZ+ u#+-o)&Pg5R*$Rq % #+[xPk! M# fK-4!Mo[ M@І3VB.4U"ؠOo]c6ob6ק̻tP#-(\% L04MA:2nonͱ!pB4ZQ@ j! &"aB& c(dBY,ػa,BI.#)rU;xa4+#-fuPk]"9\5ՇLXѴLJ打^ӵkU`l FH"%":ȁ2A^Eg4f=ɯ[$i}]cńJ;KX17Q\RQK#+)fji 4cmVلa #66ޔWloccw MCc/[fK~<iiam3Ct+L/^۾HqӰ4QG}[0$x>, HD&.#-!qyZhE\0g^$B`pc5)%x\Al'4qUMj7[zH% :OPߏkae#+ z^8wdj>?@K ӭgz#+`7HHQ(H3 aDl-%Y茀#OV"d8\iQ)%ܶ[RɼmvV5cVMnlZmnUݹ,EdY§uZ+ITVZۥZM]shJ>#DV+Tm锌!3p99I ᪚^m. Z]U4,rAa p"_EwXjy\ܬ׶ד4HBy)VڦjhLjQm)McZ#**2AQLѬI&5T(f)HTt@44+V^a0IVn=/Fl:Oݮ.D6E5s]BD(!'dlѭ4ժmJ"V)O.MWu%nݤmvTmm+%n2ezk%Djf)t!nŏfl'Rd9r#+FIGyHibZ@X5u@~yw.(7ߊv ;D ˽}Û CU#&OxqFW(RR0CbE$[dQx\uf,X9#-}I5^cJY Hi^W#'Knnr3d8{}1r4á+FL奙(=pvt|%(N8gw6s(U ESy6,ߣ62h%ηTU.g4ú⠈#”Pd#)(7b#-D4j#)ҐG#+ `]Q$#)F"bͱoV݉ƈ llJ@jE&#+$ö^{Jƫ‚f#+&ZIF#-#+a"J Š* X#+/F`C`#)0)s,(@xO@}vQI2IF'(P1~&]%V=~=jϴ:޷ǸM:vgQf+n߼߸3D9T B #)D z /U÷mU*GV\#+R33X\)P:t@qƂNuH҉W[KVVrzvC(ݬΏsCOBDcg#)"X/UNGGj#-w#+ȠH7E5kj)X`$-#+G}Pi"L u33?|.K#)eA8@d3EPA2qrDh|@!hj=uAdz`ZѤ6( $a\dCq@l.ՕA&Q1"*I6h̐ePL"Njwh468r.H,RE-ȕ E E@-[BHL'ڰwg*rrd$Fࣜ2%\#-9Dd,2X]#)'|`iO"mx>'رFҪj8Ji4×윍z]]$]"]I!?t4`4qL쐊0p#+2Z|v*6q%X[ɛ{sZ2v^Y;rم;A='xn4;4ɤ*4n@#+#+ &-T]UOz*̫iY:)YG CF׿:oODtX!)QF{cA3C`|QT BtiLyB ;Q!+1~*la~#)A\t4O77#+#+yb)$*o(q5"9ߟ:se&y͂|ѭh#-0΁XJ#)<7->4_4?'xٽbxt@>J | &@LƲ!a$!u\C~STngyuǽx6UT`$sP%슇y Wc>fk=e3nA%0:B!#)4#+I (յV8 ,#chJz1M@e!ΤDN!;!לɇ},ɊXPq9?^C0X_qL GNz}vGQ8)k{#-rׯ1)߲ڤL*?ŌehHޕsv30 09m1٤ ~ϲ#=zcu)Ր:o2a8a`lzj!pof Y,p.g>#I>U =5xs4}'OήnTz!B>}Txs|SZSA|BҤF{Ɖ@F'oXMAYY'iҿuC7v"6;KLebB#)OQ~ݦ#+#۹-|1>{414֑UeTbo:?F#-ϫhr4j%k\:f lP9wԮsdɭ᭙JserDi턙ǯN-Iv.}$U!2oSm~o$0%n{6ij Bl{&92PCJ yOaEU{9`}ye/,d"(FBqa -OKC*p!7v H#) S?z>q_wH02ۋU#+?/3>}/02Pup$cl>C|.Kxn"!C-wvi[~sr#)1dl|5V9/.p)x2hşG#xQgd8ɒO#)OTRmZ:%u̖Τ ,s#)s R-pֳٰMj1i100q4;jՍUjIf0d^I 2#-M )hV&=>]'y"GcV!i=(ϴ`9حhAe~ G\:D`d?4A7l2u#H;#-L*#(Bkd#+a_Oٽ OR*n7|#%1ܟ_zͮ#+РlPIDܝNF[֑PDhցi 9lQA#kk w0@f#-4ACR;F1~9C>vR#@^Xmh+%-JiYSkRB,ݭs”/&@c?@TvD*ݏ4_Щj21FZH, ҒSa+ fLF4fdL6jR"?9:pxCar#LޛoutRI ?LS$xF hb6- `ml#+#|! P:QPp&0#)40\KEǷ:!U20u0fCi/#Qp}OٙpYCz*L:fu8F0܈uCeR"mEda\Kz^MF!ƀE&m CP&+vr\]dywTD4V@•c6ь#) #-m#-4 #-T!ŗ #)U"ͩm6NYnۂ|#-q 쫀V.ZPOup6*,^A8²J}2B>폘,p(fL/4odhʀ,Ȅ#)8#-$V#)v0wnf&x%#-OtR@#)0#)RUH| D#-)o}m-n-wwpݖ΋¼(TY Zkn֢kWJ !5%+#-Lv"ȣH @/5¨ẏrH&<(+g2 ⠚ ߛ31D<;X{PGAH'M/I"&P[֮dz*5((&QDQ"hlL2H 2QXTmTjP !aЬ1l@0FIf&#+1<QH,#+ #-XGpV #-yS# #-QVW,.܈ux8,t$ُm}bVuޚ6dP?vm0c8"J}w;CǮx1J.#-ŷ茰gOME[\Kd8ɞųuStff8E$2fR+O^j{ &N^hbHNWmrgZ꿻wntpOK2+k8>^侍P! OK*~rg{웷UFZֶNW#-j =<_ 62& #I#)0M` kMqb#+6q.vv v){o+vMtyNH%*?0-&Hcڝ[Rkʤ#fHTZ|g*q;r'U8w#Tuwj8GS#-*+%I}aywukwDeȖI!Dc'x}Ymhf962qۏ}K5 pzL#:fpL$#)Ѵ7uJ[AY9ywcq!vnsO8$;:JA֧g5Us( HxDW5v[TN8“+3bX\Pf:!ZwOUR&gFpΏ)nPnshRoiO$+cqYvGcaCxf QPՂ~l~| D{c rsԛ4vy?.Ow7LJG~HD{*v](w3tO#*N웁T#68bg$((yđ*S֕] !ѵ|n.zTM{XHA.vh+o)UɞVtJzfAd[04d3#+&GcB,VCQFXt`=#+.7vz `Z;h">8=4y713$I\,w1ɨ3\r9œkT2`v`Ip%0%WV/!LMCzi+b:ɉj珮 ɉF4ػ N dDsJ+$'7R#-T|fQ d;C=H)ݤMdS;7:eSarމ79`461"RACEulpVr (B#)H#)98Ltq=0tD!lNhc>t[1C\  5rV 5Z!k 6`ná;vS[}lG(=1AMbf:l.^Ա5fC*q;.J'\8P#F4qJ] q,"6 mayG{DI滢g4Pdθ^ڌ 7A:9ᰌ'I-Ɣ؜L[a,s:L8G_Hj#-P>(<4;8~k7zthFOhMsEFsr[t[#4@;g~9]8݃ kstvlJVe"h`tW1>h#-|^wm#+|˯#=ijLl;8[,DB桰Vp8ۃX1ʸ-?TyChv4Ėa(y!yO~p'8yt~GVoe#+_#77fh8TEGW;ly=UЙŨKPTKD-Jb(2iT!Yy#D1413જw ; ^XG+uxh~.|^x"al۝ ]uKAʂp]0WiKRbf2u;\mi#+#-6;چb1„+ᡮ9_~&3Y;V!<#+ˁsh"'zM0o&zs86@8eȹ<=eKi}*T0|wūZRz'9A1~SkMD33BO:q1OzŽ>g_ӝNh}y(?` iԚz`h˛HM$6VhUjf2#48ҔnIVHlA8S U,i!5sq9ͨtE^koKk3[YjVz[ut#켪wX1C B*"Lf1_#K3v-‡elZbu#-E:2/WKr9dRmUҬH((L@Sjы7^aW#-ݟt3_] U4{|s⢡#+mb!qMβ#+A#-/]Z3 +EVI1uK5\FNAˮ1vhRJXyg(,l/i&07`2 Wsw1J xi-EJ=u|z-ci#]Htf[JJ," 1`DmUsxWQEV8ߟw >Sk*6i*+J5*lRaVVfŭcebJRdƖjRMB*R)eJ6JSEJ5#d 13B0## (G^Ap/#+|c9>]&Gy]Er9OTVZazXobd3>PI!"?yaSwo̰#)/Gl$AtY_'&0\*h[i wS`ch&Q֭rٍaIb*ɖhjyP0AY 2C#+@*5,Ro\5 5"#-M<7ϻ.g,*2_7c671an,X#+ ##)x9L0 a4"(*VC UC#) #XK_TX4c։jSTUIJ%D(HddVm%q<֝eb*Ɉ0"%e@ b!L)`ebbTb3R4FdWA$B]#qKBYnX* \zDI$8P'BCMQafeͤ7O+vxț7brј2Xt2ppXBJ>G&m?J+CeTў`n& BRQf$a:B |B`w#-Ǡ@"`*<>]^mQJ-ռ1?/ վ7}#)pb#+&->NZ8>gO g;*|nJ^8c25w.:`aI4Qv#-r+^v--Ql=Pv';\='JȤу)$$*H&‡f7p'}vɡ&孩Swv4 $AiYDQ(w,#+Q&#-w̖hiUQ%{[ɠoddH=U2~?o#+FD#ԽJ-;L_gXF$ڨkd7#)~(T g'HWM +rcG͞}{HiU]X^tpC`I(V)qZ^:exks㥋Ɋ:́ B۝"p^mDb#;>O+JrrJ֬XG)kFԲ4 Ð$(#-!FT "6ozaBhH3jl_H#)QTR`gԻaѦN7E3tESɁ@C2" 'G ,Cw|(@bW8#+$ˣ`Ե` 7l$1X+N6oe7iGU;iT86#+-QfPBlQ>#+2q!DXD .UFӴOjI-ؕq6*R؊&H#fo>eoRI=zyYEFhbCdɶF-L ffYkS_7;Y ﭷN/$#+4CږB1wDT%Zp`Yz#-Ԥn"&nۼx|^3ΐC;bh5`92aًhgb%@&1 TdC(4&Ad8l$A̩ W*K+q_\vSTyveq1qe!]cK@ڭ#)MB2!=]`뇶"aic&TP 3֛J5 9D)jd[ gW$V-Dt㔩֝e &tQ`SÙ}<^2}HY85dONS4TUH6.'VI0ΈlJIoPҪʌj#-%'ciUCKJ /#-'Lѷ!K9CCQZm)n1C^iZ%NJ#+Tc0\RshqÈ&߱Ŗ4)qo[\K "*d3障Bx\BK3!ieE&qjr FY&73&9kgK4(quc@8t0ͥpJY v&ArZ݊t"6qB롘`ذ ĚE$DC8jsEs !`/x]Sp6"讒! }8A<үJ>;ib7$ &o3\:1 \Zg;0SC3&3RL$SeAzbK).B2gil3dP=9ѝ=f} $"-Û'c5_EǷ7f50kYtShaJZMJY{¼beA;5()帖XI\<#>O:KL֤(LF}t'&YhmznhZ.ׇ&rؼ"C<.Zʌ51a͕z]+rxܫe>ܑi]4p' <)Un6mwp#-s/^iL`-#םƬɭIl|aٛ12Zdĸ_L«6s\ޕ9#-WN%h[ DX%LcaZ:#qo3o4QHPyhEAFH!%.͟^!u+^h G#)J mD2fk$g bcÓbsk3&&wF,Hbj 5L R ى "P$@EH\2gxc Là%ڌBhC)#+.a ln#$dptF"!:LLsE9 nDCHdH`CT1YSQjS&PI`#)0\pPUOge.QUPc۔x̖1P`lXDPzyBLfQ~>!ԨJ<*KAkQN${pK<3?DeR%u-&rf[~}2&TV֊6tyR-D@9FC;&g}Ø3#+t.; 4mtQ`m)~C[Y:`Sȑ1!v:7;K9kJGw x)KGSF#%RDsn[ 6 n^v)tN6DTȽJ.DPXUQ#|ȝo2g;=,b.'.A&#)*P.bWydtwK!_i#-lf9ɼ1ы0cITe&14E#+:x-"z뮻]F2<*(cF*#+:$b+a@Fw9CY&4]mʨ+&\`jd%*$!>OwwO|ٮi 9^g|a)*r49*"cj(AtB#+Y5DŸ]|ĠP}A6tq$Pڏm^gyQV:4*xH=$s;s!;B5B)܎D睳;`=Wc!qIqnf{SusdMZ\ct !$*={]ߔћ.rVbLe"FOi !d΅JD"#)0$ZWSlTR{@AH@KAL`iB\!ed"*] 1w Aުז!;hdf@DvݑxR.pvd `#)PQǻ;MYr8$""HWteZw]ԗcr/pRP!+ 0fh"Ys(Q4:,]ohj+Ytՙy-O+EBpH#-20#)Y@s"J('?\;>/BuU2> &Y̢b80'4>U1+6A=m3p0HuqaeVbũg1II$h`1z#-AzL,PLH3#+ƱfuKFA3w fD#QfsːJ;F՘6`:FK_/#-`V+LފDڏJ""X4;U\((<(ǐ#+sb6UP9$,iP2ljPѳjFַKtծ3tݢ)C5!9b'yjSڀx?c$9uvv H8yol7$BE@9>ONO>_"NMϧIgϯ|;}ڏo8ME1#+K,(šg?2B0GjEDbV:s#+wKBi^%h:#+hBaMm;#+ai5׃+Z-s_s#M6+j#+T"Yn7aep>dOR P3xSG4Ÿ%SJi(2CYwaT:"4Ҍ)9Lzj#+bTzζݩ+#-,Uu EX#џ.qG_&Td{S$D #)UǫxQ|Z9:P#-pl``SH#PS# "'QPb)q4 MEdߍ>(ޚ__eBT 牙HERłHig,L#)$$oÝ7oyns_A_yUoHHì)#)]DmbBBF$V5dAw(o0XaXZ-I"m͈Zk`4d+E21M앿* ~mM) %& 2#+U ăP;NБdV@b,$ ֭/kWDRdI%di%loU7R(C*-%FҔҵ~Zcd#-}!p}$[(oomOԍZț5k6-"qwp#)dA'#)<PMh]_?uȒxMux?x}zXvEA~S0#+(91'~W誵PVI| >zQ>9 [ bF0҃p6J;w,[ =2:ܴE&bI#-TrmTFl֚Nݺ #-\ն$""B%SG$$H{(h#+L>'$z /[^~<#-G`r7-)|!~bѫdIQ^Jݣm 2dLJW?RkBcވ?+UW_f#+b,ṰڼM`JZϘ-τeMБRʀ,L袚&u *>}1 G}"B@T,#Z1MChm `Fx_.f&vm*PC-v(Z 0q  ށG]5CS,E}#+4̅0 kM҅ I@7 6L%0I)F*,!H!-P>d@BiG39I5dsX&v^6^L6ۿoe#+](b1c`#+؋7pCt셶+*FEiB X1#+*CLnL̪uҥRwk+*TQD2 1Dډm(JV-kJA))ABHgZP60.l\ AU*,ݡs4V :µ'B"5AeXkۣgq dA @jn_|Mp)-ŸJ38qPU]zqfHNZFQh);2ΗɂQƑu0I,͙#Io@ȍsȿn<#+C$w֬O;%#-k2n&1]A,-^᫃؝blUs4!̈́ 8#-y1y*ᕢ`D Ҹ!\Db% TVF8:%Xs#)A(]GJ\2nY;C+-:#+ 9wA4n u+RK\p}%H^K3)ʭhu u;{UYѥ$b:Q5#+ZU3bN'L! . hjgBt)b\Μhj#-"8x=ړm Ӌ~BM|:܈s&Bu~Sϸ`v\)?vm#-tEM#RyP8bހm7y4F@_rϋ${{_]e.#)X3J`Uӛ\?_pP?^~o/?;?w?g?in}?gXw~0bp"RC?s?wK1C>#-TmBF^F;dQpFa*؀b!<k !!zU]|uRsD=%[mٔ `P#-gv#?їqz6̡#+lWT)Ƅ޸?c64-^l6&HL㳒l{``iR_K#^Zcc[86WaV#+jȡܶ.tpc"*#-ݲ*Ť)8fզCDenK\F^kFM#+C!J C\7~6%DO./\-.6R#+c'?v]v(VG1d|F0yƲ5+0DcF+f\m{YWLp`7b^;}#+8 #eۯljv>P3 vIAK3va'i䃃_iwpFŕvcGWwNU+#-|4,LXDZv) T/^;)ۻS .$d]p8Ո="A{ȗrPbH#-#5D笚6#)x|8CSpf`/a瓼2Ym`@‡=ijs_x$)1TPq**#+ҙ+Y-ITɖboWR),A:??MYVP0Ł}";#$+r>3gaYOSps|=[*a3w#9igBу:JSc%Tsol ;qYX .0]qdc"d+%; 흹=2ב-~_V.VdB7eD4`vn^yZ6J+K#+ZR^7UxړbH, Ni&7M/ xg=!AqFI]@V:͑#-eH#-<9_n;I &V2>#-'Gnȣ{:DG#+Dw!Gz9BxC rO Gy6BJPUڑ]t}j3`ERD 4ol qAnޜS$B ؚ%;%gEB^5%'2?gڔwGhP@J?8eU |,+?x|4|O#+-WN\Zҏ''>$P-|#+;y8PM@8D!GkGדОƌťxtgA%/ !\A$(?uJ?kv񉒩}zyAS>dD c+%9/.%9xFDB_N+ 61e>yYѵW Pٟ:a[oӰ>:/oj5/I#%SM=zn)„0a +#BZh91AY&SYKE 0#%(b |wzs*#%#%#%#%#%#%#%#%#%#%#%#%#%#%#%#%#%#%#%#%#%J*«=JVv^\I$o=>_nk!ۮ'OX6gvqP{ZkR]/I16z1*wy׹Z>{ƆAݞvwv]}[7 v9Kmk#%#%#%g#%<mv۷#&;@9٣V#%U讒P9ԴTC#%H*R E$CBT(hw!o=֟fW}'nS3)PZdTZך]#%^}kyygm׼;|}iҹ9l޳ޏ\@:AH*elkֶuݻzLWZ0lş)#%*"h<ch=ycn7;h2=[ \`]̀{ݏh{rycc󯫺{vz%qz7u3{nÂwz{s{nm㋻kݫ]Î+GݝH^w_׼`_n_I/ Dkۻ6٫}Ί/Ksq4݇k.9tzu{ﻇݰpJ)@*% *UBftIp;=k7cʷ*3vt<1njo]hAfs#%g8#%#gͶg'Ll6[sxCeˣӧw}>\ou{d7:"sֶ-g%@h{{ڋu(^)RMѳ^\}0+wrxfkw>-=ܻ}|{Fll0;z?~2ujRY]%7 wsRӟ%qDH+BU`'D٧uNTxy"/p+b#2kg\W}MTluuKmERU֒-m#%"*5#AФ#%#%T  a+5no-kiSWt 2 "bd,fj3M&0HڈK#%R(M&h A(jj-њK&DhD"jRF#%i*mH-Q%,4Q1Z5QTSd!%2P&41SM͉4fd̄dMm4Ԕl6ٕ2dAkLMJ()FȑhD4A %LiQT#!#2 &0- #jBB4Cl !%4fbD#&%llhؘTe!#E)lIIFQ&dĂHF@$D̥"lk$3b$436 ڒ$X$& (E"e d1e JMFTh&ɩ"ID%6@"l@I,)2J&؉")Fl2$YJ ,bY HXFdF&E4MH44hBI%e5L6(C,YŒ"h&H3 )1PlR #2@E&c$h"Y!LMbQ2LBe#2h" I$#ɳH,FRB31K#+6JFfM52i#2CDRhYRHY1"HQdR"()$ĒiMFɨ$P6cA3Y#&4eDY$LQ!-f͋Y,HM%-aH!jK0M-Ji@d"h,!(M&Q!kjV֌P)J)&dDVR,&%T٢-L-bC؈RFJD#61Q[X2$ѡ66IȌ5#&&2e0dAemJ[QHZ2iKYcR#2RL2UhVɖERY6lf3-lX#[&YYMe%#j,RĖKQZ2TUdmQTT4DbTEXekd@S(ƌ!iiZklhbV1lbH+UKj*)hbB&H*ͱSiYJfT"5Y$*F,BS)ɬLD$2I(с"A1R5BP!*(didɤl#&"+,FS1(RQb#2-2B#6I#cd)fFH#!4LQJdRP5BTFa)S,FBQfRIF@ѐ1e+hƤ%h,e(hHf$Ѣ̦̤̕ E6!HffhM<YZFBL1i%IRe l -f4Mhѳ(iFJ̭dF3D P"DB#&`cF٤lQIS1II l%FQF+fk#&&I4(Y261J 6lC26*2JY[EBF5D(L( Rj&cT#&X#&)Y#2($U2-F#)kdT4","-J) D6%2Dm`S*,FŚQl+&)+)B66JdJ#&%MDb6IA2`BJl͉*edHMEF(mI[)%VFK-C-DTUI["UcRQbM LȘR"S6I*ŴjJm։PljBeSMmFŶ1mIQ eebZV,͍T*f*@ѢTi5b̩"ԕd)2hCHRQhֶUDʅLIDbD4TSI6*ضŦj1eRmMMiFQDFPl5Rfl(I"21#221uo?'5#2?Vf)e"vݓrrhlyz4{Sg~G $#&.`Rĸ`j#22z?{k̼y޿*xd,$b/mض'I~lGeGgw9;ȌSRR(j5䱈ٳjFLI"lLhcav4LVS(rw,˿j6.#2b*P)RH"F(M۩2։M^<2,ޛM0l˕̐UOMb#2,oU%0AE,PG~kLE06"%cnIƓAZYӹrc6Q]ж (`]]ׁNzm+uM^ư=,ZY{x9ˢ)ͺi#&Uͺyhبz5Z4E~^S+kcsOnnKlyeͳ\CmF:׻z{W)6G&i&Y0ޥZmhmmkWyݎQҹs%u""LEO6Yt?5J&LR",0!M te#2OUM?[1?'$2AE&9@TqPR!ĭ̚Ix5%uيO)ZoQY4d&/z3,̬^Z{CAUߩ+`]95SX@!dleN3PRhѡJ]D.Ƞ(we,YL#2NM*mGx_*sW)IP#M+e#2W,j[v&E6(ﺂE4P1PX+W#cRQ4iїEUr"x7ɕv&JhtlExܲj7c֬A` d2xPPG|?wV҆>mzm"cR|;+U]9JN5NwYJHJV#)5XŽz2d{R{1(Mʍ5Ĵ*Z)"Ya44Y__]K8"4n"U@#\ֶjϽ$!FDEFEʠ6vW=55xήN]1_;ŗmH80ˡGҊeJEvYG#2rrӺEF#2(SfZjASX%G4wh-կ)wQ4EO#2ت+'-b#v03#.#^p>ޝ8&|K T;a{'a̪c!q&KZT8!>NkM6)%Ȗ7"7f%-6A83w|ȸiD;H0>AZsdqa-pvPHďEo#C@G2)[-z+UBq>r5d?>,k l5{{ Ii6aC="[$nΌF!'r0Jd4RTo)?ڦp#2p87B6|_|/~R:&aH8f[5aw:Zpo"٩4^nF6z&gX|kyzbvBI$E*zC(I#%qNtzPv^^'*#חw+ҼkS P'x11N9#&2 Zbӻ+kn5f6q6-BD;.GE|/2C<!*n뭛D6˵}OtEܮwSn2i J_#r#Dm=-?7[Ox^;WWKb"V,UE3gOۛJr5Sf~4n,`75j_O8+Uu91s_B>?.aA_i#%)|d]ut5`r`QHL ߮n>tR"3V("“]5mM*fF3N3|4HaTx X|=XF/^_{z[ٰ;<=q:iӬ Jd0YȴОfDu.v!{^43LDMk?#Z4 #V]a"EԓcDQQe0x~yAmj0ݹdB5Źyt}'k2C<"Tm骦Hh5F3/gj>4Q(X=* hݔJEc*ΉG#2l%#2\:2 +cP514w|XM1hB77S&yYC;*wd}lv1h#y1Ds32LJ\95kqp;wy=蕼#&^?(Gn,kLH)Ux'%(W7"YFUi٭yzYMh0邦>(&w"paUט93ɍ\Km5=-,p>v"օ *ዓ:WJ} >:|5O@FI_r"Uc"cpᝦXh$$5QSG) jR#2Q#]zU=ՓlS#20D$:k_#ȏKeUe斛_ z_tn;wg7.U<]^s `8}4VSZT߽R)9:sIǚ# U KdɎ,x^npʼ2=&μ1dqf#2sEiGk3F,E6JRdUAgRS>-@JpmSfT1hα m5č=B|y򢦥i gUI?CJf_~ĕ%,DxǵH /[@"G-%Ä8_SNڕ MRPQ?Ll3m3#Ynu ھ4#2EW,ԿE.Z$Ւ(AOWHb#rXCly \9:(&.NZo 6@,{4RuAi*/AA6KfQοWvi7N hF`KBJc*kman*QNĦb8''Ve~Mt%L;qI"gV*4VDO f8:-:&Z{Ȑ-1)Js\eУ${u6և/-QD@bXhe05լbз^%UpʌL-)UG_0^j#&DGWgYb#泆֢P.tbo=~\z꽮uJVTv;\\u]Y/*Q#t~~z w.8YT:jXxv1$ʒIrH2΄}\ gtPc!FcY#%M@#&hx{X= ( 9VĿF*w|ZV_{*Ni0%울@7#&uM a4[AVTGomGVέVgWT$3Yc0k;c#NMZbqR oIkZC$3]+0rayCђDRPE`ҌCdCqK,Yžg8{>k@LaqnyYˡHL*kh[hhhExl&6۪uW.;-sQK(uBعWYNJ%W3/"jLUd$d>g[/u#%I wãoq;jn7W5h*Y):9z1A N"絞:^IY& m(X597P2C'c(IaO@o;pa҈ڍ OkY?>cE`|B#29::xwp#&j820+fy[)2 hCg(txiGI6^q~9169pv]r0sl+7`GXFD+/EfOo:#k.Fz~slVCްAKQ)qƑFCU`"(Ig(O!Kufy](13in,#2E&.ձN'䂊eֻYF\Kkd跽hi.e&E2:(;^ի@X\0Yl}HkכVnQ^UkvF'j?w=tW t 'ZaYAG.m4U#&-֛QcL91'R/>ȓx4A&Cߍ#% t#%#2iKk9]UGZY"E6I#A8^nqEHi:^"#%̅UR_׫[,1^7*BF=s#%LD! *o/lz~X^+|!mtC=鞅$^ñzy{t4FL??ɀڹ'b##&L\"'Sb#%c㪭yĨ459}GDpÞ]eݔw:N% KJ?:{ oMt9@,j)M)#2:sG݁#(aT8GR1T^-dh5txByt'fd}N0q@<`cQGd#{Ζ\1cVJO,ôOb4\zeP@۩9X aa(%zot8?Jݬ/lI&\"#&gp) !!#6U;(JH{2k#&q!d !\H_#%Ěg睞>~܋@û#pضѤ>)eRzNa V~XЉ1Nm)Ƀ^-ZxbAL3uy6u<#$(vE<7)Sz]í Wִ$Qr"Y d JE"7B<>sP vl`b[;M\o~${|6)ެ7T㠑u^W;WI4jsߖ=4h6oHk8#2{/NC@|o-,0Hu6o'#2I#2Ua&60n;kMاDba;]>ϙzA( aMFp!w)D .q6(#2"YYaB,ar郭cH~/Z$sY<6#R"b*}f/=M(N^M m@v$@5E9GE80U&}yPb+m[)X!nA @/{`?8ͺfGjp{UAҊRyX%4wEQt(X jR;R-J\ K$:iܬ۸kLwJe76M;A9T^k%`\j֤Gb#-9^kR;#2(=$xq#Igx2iЭF`V6s`''UsA1*iMEI*l[.sEp*(~sꆄ4eb:`Fqa5#&WF]0\~QV%UbW8Rʁ*:d|z,tKXݢ)HH╎ãoRlm*a-nQ7O.Kn+בS*&VQdĘ],Lx#%}K(gj|wasL;T133J+gs'Ԣ1aX[]@ڈVn.dB%]y.;#1"ܴTQ||1X=SM7+ԯK|0ҘEA.,Ĺ eFу=14LT.%"-H 7j#&/}s& cdqrѩHvqII;^qg.Q-4c4Pla{d1W<`#&e5DR]Q 9 I (S"o*!WTCyp2b`@ Ə[3~^-WS$lXR'˴^RLDO#iV97Nv>s\{Rֆ|13^^Vp괌`ߣ7: M["96Œh3#M 8Y:يZ*Fi#&] rW3hRbdF4xh5sѤ~Dh.ZX8!3e lh3l~ndz~c|I#&J`@FЩ^{ېƙbіUƍ` ٦ꥍ 'sx ]M5^?oXKY'Tf[,hŊ"Fx"3z/s峬o7Vsӗl~ Gxcjk =rX"%F 8lMxZƁi^-;oU|j 4bٿ%- cmx/*'$\\H1LdCb&YY])dXU4IC"́'GZ,!86#&Y)cQCPd@ߗ±T)ZP9e0 4B1.$j(#&V,Mf,L,q;Fj#& C]o׈tВ64K= 0Pc@hDsskPi˂4 vgmV$~38_;ERi\Dx9iȦakKEJtã>w6}Xt,B02;Kd;؊ ;yHDݚ陵x\AɶCa3;q`:@ @ ȷq\}?d_ kxaaХٌ8jX14 ?mߎߧGGZ ҃#2ZG2z ,=ÿ_l69gxFnf#_н(rjtp_3X0q>y<—VI|gy"[ҷmyMo1p2a[C =%: RYw|>~u#%Q!~Aٹjly}sw0~y6|uŐo?\0m>-Lai!fd<`wh\?;^"a*l hҺ%Ts*`Af t|WErp $ƣ¹㞪ZCn>*ڂ+nX[t@^ʹ{ˀ#%  *Rnnpa?\oLL>]nkzY HP،;ZmId& 3eK8MlUvݨYn] #2P1%/J#&%|-Qx o8&\?#j.6`bP~>7^4snu-F؆{oɜx~S>rrxeJIC>9Fqٱho5ͣ_uh6d`__BTh C4VL=K[×0^ߟj? s"#&.AdoJ]J|Lb93+IkQ㯫bZv| {>˸r[e#kn4@NÓA#uxjI04H(J'Ƙ1@yޥP8jmnupÖp &d YtJh"RXdm9GAa~;rdϚ]5H@UG Ź7K.D#2XG#G;}$09qG#2ExE? 0Lr|,OdRƩrOYߊ6_\o׿#%j#2NXF,"masΘ@}ײeV~=8It*ZTze3#&$(pRqR_DG9yf߳R-J+-#2)sho1lUɉ qH\r$F "e"_w>GK#%n#P_SB$+?:2aC י!kb~G鞊9gZ8/ۡPNv@1+V$zbBV-؟:))QZTxӮOص݇\򿳇Fai`h?J^ZK)-BJH xH8ERЯyy^$ou&d&f][;0:_7ʞq7tvAU]2ԛ>UW?꯱kz44/]2-D%zmwb7lK-y^y?nƩp^S/)[3~V!1_R-痠.ۏ>Z?W<E #%ݾ/Ty-ϞF /؟ rH#&o"я5%="ߏx i\<[(nlfz׾nd>m6> q-_a:rNXsYU[_TSͳnk5GsYx[OsJtkBtzwN6o٣؃}f]w\(yļx#`ᦚ#QL.s,\͈\AEwRqyY3SǷ u+HMc/7{?dgN#É)gdFco#&+y5_gN jI[ؾa i_M?4t.(WM@6 4=' WVot8N["9SN6p_~vѿb{/vO7Z,ul.ӕ'wR!c#Me}ܡA:}"q+(v^_l6[7;(|a*W$'8*,>vYW+Cѥ0ȩΠyFz_ֶ}V~Y^A'h]n8Sz4TyC!_7Ϙ/#d75?/oBP|``s,#2 BPw3zyt#2IldP#%<|-d?9rN?us:?O't>ϒkh?Gg%ͯvݏz쿃ujкZ"rqAHw0GXa(\&{w?;(?~ o0lLaNt5HūwX6 Jq;0vQ[L~/ʾJ|jODq?}jw#%Uh`)d63iB#&"xvj4(q׷^"?G|~b~A̺9³&Khy?兑$#2{F:p`7N=|OHXTS٢@m,#%(yP̉ Ϛ>& +ft^IBfH&Q䭘 zMWs@.`d>t"r:J알렦i^xiq/m<+?^8CmRDu`5>cQ._o*%ЪgGgH{&gI`C :-`@CM߇;3xߦ@&mNetW|ZQß}uϰVM(VQL(FVSaclb^bV?=7xo5^p_oNl~EwS*;[+2+ãzfE&W˗+9z5g%fjxסZ5Xl8_="=WO(o->A$s PG^uС\*@QBGƊFXq$ƞ#7@Ug϶δp(7j["U5KXIғASAQQ)7'0viofw_]UûWҤrw#& DL,[ٰz;O}FL<^q0/SOkmlc"<~QJyGz0#%g4v^ U/og~ʿzp1j32FmJF}*1AAHMJ*Q&#&cqa (8#2*"OSi68kMjD +HR#2kaILA"hhn)"4[VWc'#&Ss hm.#&HKxjHH- hi'~oG|ZD1,?ILr`<wZ9-ESHXvXTY-06>?q~|9DhҶd#3YޠAaRDBը,M$83UdUPPYO:?>q2)MvK{#F4 -glLjUuu_k?]ZհK<}Ϝ XttskNJ O;>~9H/<jUm}&1sO:ʶUdvV{#\3 hp ܔGI ךּꏴy=VN_yD +.#%8h#25U68 m:|YG^pxYuUw\3ܮk^&5_g_RMu~{- }osRg0xh?JZNݴD3KnBmZ$V҆AX)%<#& xAVbƕisYl$wz5uRCt.9jBPBdQZa++)YlcңFRV޵ ' aZn  7No7sR1܄nELBn`4b H9t)lcQ#&dL00TZCӸ貖3HZ7Q-i:0ΑK8{5F&,&T8T$z1TGHM&Ah%Ů!h";QTFuTcucd#28'qB I$jw!!oIFc#2exg{C Gw3,5"{yB4o;hQOF^Dv:=H S'? t"?]P#29<@[mz{m pw3C_n&tcdGfmS$Ef.K|G%^!/:t(nV$t/h$\FQsX&-:0,Ơ#L1΄x 0dh}u{#2:!FM <l?cʪ)m8rR4VEZyf.4!ĻG#2kL#%5JצnjPcրwC{Hʹd[k0U#&U+mAغ&F ᦑѠ+4غՆDDՋ, `!P7Ł0ӌ+cw֣5'+k}8#2lVJRe1H`#2Ȫcw-ܞZ#L^?#OJDWk<-²U''WlKtvΙXB"yjB׊¨:qd}B_4}#&[xj7$b f=#&+ U![iKxJsU=mg2mzhS`<9Fj6ܑRǫUL"8vI*N﹞K^؍fz^tv(ظ@94!LffŊ#2|kj8MQ#2PbXR#&n{#/j˅ftgcq[kaBbPy#26(9}Kq=,6㍼O;>GTb͝l an"A#&s>kPĶN,onՊ({o YBם15y tּ5ݩu#&+ۇ:`w0KLԒ@XrsoƤ}jQ}&%N[PiT[yd:fF7Hd*QrF#2 H9cq6׹h3!zfy4]Ϳ#2|n;~]F LS)#&:y:}NO3(°m@]&.Xv+wc|%Î503<ץq4D2imk#&V)(mxPv~86UcB~\>] 2倹iߩSKē,oE&~{Q wuE"/j#%#RZh^1KV]ҌGi?־x#%ąYT6D }w? iE-%i{=[oD $$X]Dd{:>Mz%$yb8t$6rhϤ^g[4#&OKѷCAm>qݦ/(iagƢlDk$T(L9 ǥU8C[|yɮSG|RFᏤ/>,f:= %ۻE- N}]{7C2pC#lzα9&ZLHDa1⠣h:0>8 L:- @~zxG9eu飢M,ͱeL6o}ayŤ p#0f縅 2&BƂ>?#8u'D&#&PtUO6jEG0TC~8{v{FQV ֵ@/o;h=:$:h7hEOjb+5+w.3cEDx>VAE,dD[3coo#DGeIaA,q]Ot~EHo׳P_FshYC;Z\c뮊V-8e#r:lμܙI߇Bu|Voc3'&ӕ3?f;LWqHE2esESabdŤM^zn/OMQ0#%ȃњ5]Qǎj߶)xoϊ":nj̝[ڋ&OsIZSJL̒|:)589UYgmu48S14{NZJ-ʅ`oHSw36f\#nwwCqƮScS(%n[|^c{=#2m&@wk]dQǃ踭ѧq|̘mI0RONmI8<tr/+F!}ʰ~HgGgʖ,%Ks)~_W~tߙ* "8 /Q$Ϟ#%;BtKϛ9%뷻ى;*3O%1 wK@ۙ KPٔ-Ի16ȼQnDtG_LvIޢ-qwawϮ&sn'*z3{[~>l΍?)qT|a6K?%Q o'hgzy%C#%q1vyhgIl۞Sq2Me`++Wj/27L;8\7ou&~.K諰Z+|#%̸UbHP6XJoi:#2ǙH}`8OoS.诇L(ZP6`'U#2c}X#&DŽ)<.{ͅӝ6Uӫ`sen.tvt^@ h,̝̭3XlݑA7n+]Kf5Qͺ̼0V%yWd?Ke"Ͻt;V9YwC7lbYǝ7. WժYFX19ۦ<+ztq9;*"_~675 Sjn{#wm4/~.}Z0sE¡Aۚ#&ӓcZ#&j=}`lYرkz'WZ\oxKW(Ơbtc(Jnpw?/sݚOl^jTy̙:|1&|)#2 eOFCV =t8ӷcE:>*!s#20cx1-!%gXɳ U7LDr'#2KP`~kF*ʪ(-\\od2ke+ ˠG,I< j)O<tIpŧ'v=][J^TC r_O\Ubl=M"ma ew9Υ mPfDt1^^NSu}p[f&&ޡ_܆M(ufSpr,K85 >MNn8뭺5qQe!wtMc-uRmUD) WXVH"aH҅mgl6WogWU/ KM)U;,= xSg>O$/{yp#&X2#2aXb=IenCD1_ea(.W4&L4bVrT8r ^5RH5 <0)$h>r4MG*z3ۙpSr׿~"P6twB)ħj#2.rfCcu47OPShMjEubfm#%*fIYf;NGӕ5"X 4H^ G4zf/CMsĻ]l%-M&Isxk%3赒/2C]*.`7d; ޮAƼ,q18r\o萞8z%UsLo:N.(]j%9Vh鵦l {u ;#2nQZqxؠ:m7-[(3)Mw]a9R#%wֿ[~7ѥ|癮D鹡ctYӵX,#21D#&aI0jl>>lA_O} (J։(#&h{0Yfm#%/X#2ˠTR9&{rnd 9ߚPd N4m `fysJ,~%S썅Gw=Iǩ}a=.Yw8=}VHBB\PK#&!0oMYϩ#&!#279ltrD#cXZP^J KnTQ)f7Q/6Xt#2RUYY ]xڴ{<,tDۣ\糙f6As\#&~ں&#&n4A]pDhJt:10v[ș#2RkLJm7!m#yO':V$B%sŬC68ZB?OBa"Qx_|$gū46IC,8ms͖s7֍, C`N ˸mkg*)lk{۵ъ{Kz|2Ez7ֺO|QhkAT>=WGU<36$tcQ\\E\m\̚F%htg(g PaaGl P%60Y=#&|^f8F[</}~w\򔴯@>#%~<:\4rOpv_g/4DJTWƮ]2_nCR|R< T !$'u,FĤZlں N&DKDB^fy_c#Ɲr~fG6%nL'oE=>Тb D>Öb! UUWLCBIQ[M߶E(69[D#23h[$׹(DTiMh(TkK~.Ŗ@GEuoͯGm~#%m?wpXLtf6UH])M9 k@;?{dOۋM" dq 2`q$O4?D1AtY==ȱFZ+-4k_ҿOgU,#\ݖq0_?>MNz,s~d` .>K+bI_)d,x4%V@4QC_NhtCT!=I+#&P7}_mp*#%&tDCJq.jQE2_+iYh$aTly(_ =k!znSVUJ֨@F5^99ӅjGb8:je`a"ʞcR#%F#&d BXKq̬ƙiar{UoDxf hm|)Q57㑝#Bi |;iɗw?tw-#w;pdvGkktk'J R*7=6(ܣ؊y?= аULc#2H{' i8cms(k38{H< F #Z2ؚi>`\A[cj\4SywE:3Ϣ<6~}u8ͯ2M $Y5;*#2NIP>3?c@"ӊWW@U=EWbB32Ex"<*ZRkTBs^lsp"e.5Q%=S +%C|<$gur*#~{}eS!jx?(#%p&ܕsP>o| #%ͦ1Ism]%$%s6JH@^V.DgF^gi |36#2tXrXN:8u=_a @Sn-\6AboQTxp-PƜELfi#w<]B˓O5z8_v-VtEwS5eDž{xi#2KN\Co^3/+d^qnT#2ɵEXYs|1ν;QӞcu^i{[S݆XJKDHK^X^)Js#%k^2?,KWK6L8~1o'\8`[@(RLJ !/ Mwixvma-[9'rXԫy*)C#]bu/V2<]2S0R*874| |"$R5#2.)iV2$A]0ӿSC- &#%j4վ#%\KI@1 I94hP˧osmA_Fm?|/>FT93i:/1߼q"c56vCwA̾faL=GQ:{v8cgT٥@um|03On#%cazpGP P`ې$ȍ;;/RuA#&ޏ#&kKC~*4Ħ3a.#%tdb#=7B#27ثBJzu,tMRa}-i)-bJVݿ:v^yy!)UmSLJ57.eR@`%yIyYgAUOv ~$x8r?7^/HUob.@@>w4l#mO#%M#%E<#2#%-#|{8&U^4߾Qr)Hzt-rhk@FCV.Vg[G1b|DNU9B{ǫS_/{mؑyaSD;N=mulJ"0o!vmi~gs~#& @ALjylO^|/I7 Թa'҉$eA#2?wRdy^s4NVTT(J`ڡ"xDaI>!,ցj~ezchBe0܃ՙZwK?}5U^?5 t7B"_ .Y fQP@r\gba 01Q2QlPXU t )7@.`Mm<#2!k),fAI:R:nY##25Bf:n'lTFɩ(hec1lX#ÄaSR,% at=YB$ܭ (%p}]mzJY`EgA,@l[̚n\B8x$ PY؉#U}I|7sڕN!BZ,2^8׷QHJQO=9IZkr? #%`cnh>쳥sHv">N2ژ/`J%U,[.x5T[Ќdfrt:XF TR>Xr? ƭ6JK8.jGՈJܢVA3\\[(0ʪ˗U#&;5F(z?Ωi <zL6ŠUEKt~yk]k7{ґ C{^tzZO\^Ͼm Į"?\n1,w^,YE3MVAEovdXhFT:3lnwg5m6٣qEա{+q6C"B^H11Hg$" E=_uL6QS4 #k*M5ԉhMn.4$5Si}=EMa@]V7vI)a\ǀ$(vsÛ04 cyl JROة| 9X:Ft`i#$>3Bwbj}p^$8^vpWo ԉ=u#%˄{8ubVPJ5a31RE6d\m^λyֺU}6JM+tR2!U)(Qj6xI{} FAGKG0sK4q}S PdOU#&-ro>4Ȃt )|:V^7SAARDY0@:4['J@^wL)2lx7O#`ϐk"bw&r#&Vأj$2xIIkP9q{Q>6("OL;3c$^1ogZm5Z*cgu^F6.iU 9[PM\GgfY\p0TE*^pVMy(v1QwPcM(3ysZE%B"l MxM^r#%9rs2ڏ^e bFZؼ5v`P3hOSD0CX gpn Ȼ'7: 'haN/'N4uf޽Flh&2+SBm2|10!Fday_ 3V9t|#&Ơ.ȉlQLHR%iEY9J#%0213J%ٛ>]!l-cNxh{x9QWN N4Qʫjal 5$mhNzu>sM`;@`^&fG,q.{O7Yjie>ny&7uci=흳k.)EqA݁BوD!.R(M{ J#%B  I#%&i1whODҁٔ#(R{bv(r!Rn-_z:ZpFCʗzDG(#2\#%JPPI#%]@MucZvs=hf粻/:zp !sٮh6guP/J桧oS0rt3#0,16#%= cU:7B0>^I ;Ԉ\ADW;ZWL#R_X-6<)m8 Pv3it 'BduBl?!Ӓ .Ԝ+uejB /^ﵒ#2AAq)#2C!K'cƙqDQHxʪ|·QHxGށvŨ&-QX"C92iC Qyu+xXz#2;(6_Ewy4&k`莩B^)wEe #e5$}FŹ*/<'Q!C9Zb&T:jqP;{]GʂdC("nބinO+C:-kk4:uAC2.\t \ŤeEmI ȳUb!8ilTU)aе!s6뽽#&F)SS!vwV:a:hWlRG=tMZwYQUd݅.oj?]5}}L {]x#%4FG1%\84\WmzpMPbvgĤФ+zL\dLPpѳf4WfN|x&\&#2Ƞ1O;JBKV'ٿ_S26v_g#%1Ui1_AJ8K>Y>)*0eGtΣIPMKio1g>j5$C@}U?]p~1* .XZgz~lN^;mYmΉaVtRT0V񫔔i#2?_~o=#&Dx?q]xYn8a""iRB{t`0{9Y-Vj-d|"Q:H++s=I~}'[tb,?@#2)nږː+ 6~Lӣ:[A]$oф|3ν~h62A˄T׿M#E9HL=-y]SyU^^'rm,*^v!nRlÜS pB}r#&<~0]5'0zL=,9uwkoLa{';3-4)8z=ib Jp.f>W]e"-_P]X]ѻ#%%#&dA@@WE~z!3Lف!Wm#2x~<+bNr,QQ.pq~fS4Fw_o7r-:CQeְh#&mp<'à.wE~J#h~j9<:6?#29CO-m?Gq|S,-O`j#%~C/կwz;7bیX1>S&4F ,Z>&~#%m"ï_y|D(T~?#&C#&K''<]1dul1QPfеGe!؞n~ݾ94ﱔs٦~^PrȞX1T0\#2Łm%nBl/7HUZ}~nqӢS#%/BZS,3fYnky3[%Q4 " #2[t__ $36ޗA_l=aVP.o^D%qۧN;jb% 7F%q5:AC O8Qٸs8ca;. H6'<_A|[k S#wԟ%O<3.:=z|ҾJ;9q:xIn۷`!9u<(ZS]-YdB?]<1bKlu#2XP#2=W388|dU_<ݓ #%A7>H#&]}:=YnQ@"^uEmCsv]b>wԀ{QFh o|l3ҊUX3tB$b_#&1wEK|$;baH8.6#2#22Tl>x0x5Q@T- .ƐUfJە&6Xm7PE,uzf~:nmǵYZ@wvCW=붜Pg9cBUқ˰Όǎ'so(10N0qn~LNzVc/Nu<+:sz?H89S}bd9yG{kW5ݖ,2ìC?G(q!(d_!"I$ 5`oUJ/qUz#k4a۶ߎ7+Zݩ5*#&ٟsG.bTsj#2`Cj{ҨEI:)B[r}cv{6pLS8SGCLH%ZNsZ|^Qg3ڝD8L$~9>%abwlIfMI_?;2t"أt!׽aVm luXp:(: X8--]p)]>GJ 1A yt5iڝL F2MQR+#&_j+1("v7RT3!w\ȣo5ڥ&tur-1X#OR(-.\:v/O>fύY;uw۫aZ1#&eztFL8=-襁 Q,zɱVn?&~ŴJ~ȏ/XȩW,J]NwOJdg3F !_{̃= 'ݣ{ '95̀CA:X6h K[~ħ?{|'a[-x+ay;2v{X.05 )Xf݉GŨDWp KcYky`PsR8{Z. :;slzuv̉MːmV|^ Zg#&;;!鳶] Y\6g#%U{>4t0]O9$o?oIH< ް,Kc.aYfcc#&IJW43˵TNy ÒSMJ5HNQjġ\\ecDD(}=BX@}'kAٙK]d ki/φ4Af*+~߷'n,UΉ ;;24II؞FO\Gޗusy3UʏUBfF ub9_ҎpI@M_F}ޥ'$0e(b<z\aL;ܦxE(H@Oǃ[BJ+GPʥfa`pqpbd+`!5(#% JXA#%F3cM7!RF4 cXG@WUV &']P#&-Hyuwa,o;b,j9yX8Q) EnPV+.8WU5ueć:#"GI YockLc~Ѳ(#%O莌`pZr]u"{ZN-9^#2 g&FG;DT`HwG\?qN' cqEn)5#?k-7'G@{*s#a(~mFSnYJZ-(`4):(4>xy<ɫz#g۽K˗^úY#&W>R::CN7u>|Q)l#2 Tp}d7P`]xzmn`0"4I?* 1D#M ?M-X|LS/d>bXPF^zJtX9WTx`9ʌH{8޵7#%|䘼96WGON[TJ`Mk#%a8s!:GM{CVnN✨@P9PoPPR3g)ALc[\"Jt!5AƓ#&7SM4G#%-PP)K#%z-}{|* ^R#%(RT`*]t*JO`܆ָraҠh2CM`c0% LSa`>7;9CTr#%N&Ok@6ǝ9]Vۼ~^Fi;ff#2,#t+{Ke(ֽ#2ݺ'~P#,3|;r#tgqeYj~ieׂfNÇep?OA jM;UR%}HtSR ON\q״#&""h1Iሿ0L(em)wc@2WHBG33ٻ8dVxz\!E%1+jfwfOwl[>pS\gxѸۙ [ jZff Dzq;A*to#&6^DgZՎֿL3ߞ%}#2G eۆ]zΊh›n;u;b{x(݋a'9J`4Z >P4~\KA!nA"S'#&ORNN""dzѶ*$ǧ L#&h#&/!*a;Ũ#%>DKk#&-@1#&FDtu>m^%aQOf;tQ@X>h[7/_V:nq=ytsՑ;tYߢhC|ħ͔kcAwi B&Kx-1]%cْt<#&cthߖ<w~Pp5yGfͿV)GӝPvS<;I@"RJk|zx22ŸM=ehl 0F0G',)jSkͰ_:[a] plOrv@0Iqĥ[q[`&cbx꺉pQ~pw $֫^Cf?Qo9ظ#&pC I<)MgpxEÕF'Qn#%xTL9-4oxq8Yx@odD_T7WƼ.ZJjY \r.rxQ7(#%4ËYW0!oՠ^GBv_:@(>#2De'“*ae֯iT,($" Xg"o-ZOV9f>#&՝N'e:Wά~?y,FYC CxK<(,DF?X O1gc?X/!#%u;DjuB!:#2e{k??wOCBY#%._g$$?T*ĺA@]j ?a#^ؔX8#%hM 0;5 gsX}PsBoMMK`@N@v2Fϴ*jPLu :F\JmIDpi*D+/J0T6(%@Ǡ,#2`cb=c:w_K/Qvj+1T/xx@ĝbhZGFs.p_4fm+XX7Մ\72O@WA( wvoNvO^Pow8bR |JqrIi"8 !@#%bW}ۈ9z5@{*QF:w;ݬv]7-A%Ui%H?A!jJI+|o!|e /ra x'AIJ=ro~)#&o(>^PdlYW \'18lx>?cduxNǩdn}8""1,NRQfK#2#&Ԋ}=.OT#%)L@yPIT%@KEYΠRDgN#&ڗ,_y؋Ւ| .kSz98& [I`*tI!^_ xUר}P}=f[ThkykQ7f7e#&#sݦaؖmEGr9o|~+?s6Ko;g<?(a~ f/ob#5Q׼6OPAԖx+OpLlCgJo~GDdIg B ;6$xh  6?P$ѫmXѥA$`F/.s~9#2KXPb#%64?=6DQ B! 5>Bo9!~=#&4ȯ>6S`dqC7K/9-E V#2Xd#%xk #%OΖ{ˆŐ;#2`k|X}s&Bx .t*TGC0 )#3S y335"gIW32c6D>#TQ#2D[W5,{^GG0 a(̺b5H#2 d>r2;&z7 k<8O^ތz$61lLK#&_5FfKKF2WYYY2'6C k9 Z]`:2JD4Yy$IXLֵ--m5sVZf=2]Czޭyhhk?^7#&Xucpm,YPJLLv}|FH$ q#%@Zi]Cwl9HH#nsjyNBPAiNdNWz5B)62NƱLU WlF 0JbF1-Q6i޴z8KYSw'F)"Q{ˁMz7Y|̲v |2#2Y_N3v7(4LRR>o`>Pi}>lu#Di%vek ԙعȞBo׸}[Yq+>SgUJ*JRDSM4ːsS-Қ!lCtovkK*Yҕ#|v#&+P:[D`~È^bZ7C&*d-CNFm f0/p F]G~0C #%Bu_쒹7t?Ϡ_YJK>Z (mD,t>,z >m_=9^-P ,9{MdP"Ch;cko{cr?Y|*csvlO!;#)EJ;v($(?xx"=kysF=&BV<#%J=ܡDz>%_U]Mhz@dI@zD7#2Y6,)'#2u`VWo2(hn9QZ۝24 A;P+ގ¹WzJ`5/iۘ\mcU~󥌒}t  :l!9ל#2nq`8̵|oy:&#&" !*ȅDF)(d܉Y jiDcXU1#BS/Ңq֡Cn_o[ v׆#&ۦ&%f-ur6c{ s+n}\=IC"!g2$$P-SLYOtbX!Ev"|5\(.*\6;#%y=/YDx՛js#&dA6#-SR}OV^|Xq{ԏnlq&$QGRP-H(m[/#&**ΛH$n3jT#&TU0?/S=Kn~Ž09⁚S^hV# Ubgw.SD6{e#2(rXv>_Q6s 1$$"B%1j|N'_$\(ne)4F]lSӦٟߔ'zF>:f y#2R<…B"3蕠fK ϗM1Gvϙh)co #&R\#&ꜱb򣢬#22g;@qfQ 6Mc& )1qIRN5 7n9QGٴodBCIː;T;}-mЋ8#&l-*+겏3.yy;0'ҳ)1%q$O8n LPQE%O~`/ZV6)>Q!Z@o}zjT?"clMP*0La 0r!#&QY%Y$s`ot38v֤(STO,A3 )BHqYOE! M9dQ 2 UٱHT!5`D~(|Po{ugr!W.q(cGhIGbOCC'گ#\iO#%tFr2sEdcw3 `0ep$XE6hn0_#2 _*ؔD\)v'!O?׈g{P>*G1(2AEWE^a+.=Y2_DaN"Lb$1E *)p}9@9|:ޭ-GHJNJRd8lvnXg1 ӽ#%?;.ӣwiz<`g^^Al=z:Ό =NN;pvA¦ ku<bሪt`x"20B}(-"nuST(8A T)y})Q$|}BOkj_CHI:J@د۵$U$M()bC&[b$ch)%u_[9,6;;VurT#+%&])w#2Tqrч;yKp#%|2wv7$Uҟ& WTs=@}{fZ]OAW.9sD#0=:m n#2Owcx>#% q!޿l[/0sT4on4HGB#&^6)aJ@7ފ|!=a(vq'4,  UUDg p8p͇YES(Gﮨ5)<#%_k#23nLы>4`|y)9̕ލlE.^ /&&3^L}~^ӗ*[&6zZ-A/]Km)?*ҋ[X,'m ~Sg5[ę0l+X#%sgn?*ڲ`ݥXdœT#% $ Kд7#%4Ù2v0:Blegdɰ p,yP*P*o6`?/̆?##,`#EG9Z#2 #%#667Vdʱy("Wg#2$dOI^;Jvcʦ!Bor0Gln7^9Lй+}~p\}dP co}.뷝u3t6nqYl6ѡgEdpֱx.Rx"45?S#&"}%@DsO(ZavR 144P$dcC4bs:In<,H$VPz)]6އOg"{!U~i`jwOQ:q8(#%ɭ}ݞˣ8@,?Ύ]#2XZq=@ 1$R?vn=sPAʷck쯫^n$UALLlWX׬#&Q`&e6Pk$?Qrn,o;U˾).D.?32EӅ#&T|VMynrnK9ag]჉@ [0(k~v@ʸ|Qڀ:ZcBFsڋs˷Q^qGSY #%OkJ]\=h|^#TenC#&ձT=^c\$ |10OYoz",iQ)7YbJe|g˛w9OTg٘z[d{,N>XD@Z1 oG+sm}F-ȁ^P)Q*@KN1-:m#&#ۦp~T[ģN(EwP>Buv–;@"/W5#=vxW >g*~As@qИW3:37] *XW|r:؏/Yӏ*li"4{ izv/6q'j[CW"(ש6 Lcx4.ݦ*d̆Al܁iXɳZ <2{S2AW;:jVqqammg 3!Mr&6a ;z3lttև|-t瞽i9qeQhHTܘ]VH/^&r6-ib:Zx0j~NJIQK߮t%y ?#ϻuG֜v#4)#28_+v4h"#&P#%l*WSdD͔7R~J;\?wN!oA@%́$?[Ϊgu0`?1ۀ7v`D砰xmpmKIТ4R$bF?O&Ci·LA 8 I-y1QX2]d&5p.#&-* q87z`<ZHJ; !oTȔ5fCS+fap9DUcRT5E6N3@H'g,U-Yr''AU@`cU;gqV!)Z-S-ʼn^f5vVh6e73p p3h5#%a0&b1"J5ih86@`Ghsvqq3Xb_`7kٹ@^;#%ўy ތ@BTXҒX }'7<N#2#&?Y!Ny5rM=<5Dj~xnY;0N%C<b "+FQk$h.1LJ$#&D21^XX}*Ԅ"L/m/X^V6wDuwK>ROgwm;`DScN M$l݆=Xm=4k&EH0u&sZw,A"0,782"x{x HFEF5x[)5D&&5ն[%C:乾>CD8藰ؚ=OXP#&Gub( Hxz!h:\ke`=fNyQgv1N!lzgo^ٷ/f g?#%8$!C=cl"#&Ai83.Xt_ag%d 9+k!U5\# @8LS\t$8#&K7amb$P $E$/a!qVjm꛴"w#&r{HN&HT ,*a#&sAIy6^;197BDbwq389ISQJh52HN_C]LIsԮ1ť˜w`[yqfL6k*̳2IV;fy#é6m؃FUO;Y6ѥJG%X[]1r{))o#&se0kCG$pLscFz% ?5m3}Y62<Ԛ #%Z:ͱ.E,>N4W#&'{BhpQEqo2e̪BZ&0!֊Ƶ,&hk3ъP#%9n"ƛԠu\i/DlJ t70n3]Bʑ4)%.(oMa!}bȬ$'ASV=Nσ C@kQԹ2XȎRSU2`FA]og7&6nR\00SSs<ⰇF2N;@D⓻Y@Wh7/&,Achl3 &@YApi$M qκ#2kIkuFt4@G,#EfF =%Np <hq(U̹QrM4TK_CeI'h1dzӶYԟ\"b(|n*&ͩ&w0v"GWHhDuf3+ѽ?iht:wsoɼo}ݹA-+IC37- YN. c6C؞ (Q6,Bt(#2zp*B@{N)pWZ#2Gs9=Cl0Cj+%+VJ_ߗZu)E6IFveYGggM!́?sW?5~ҔTLJImfQ}v PE.@m I OV-Ϫ#**_ xf wHCbz )k.3%6??HjR#&@Gu j{ixeK'k傲U;I$!Yz)U#&C" ʅ V\rUGB"@}S.S@}"*X4GZ#&Ù{i#&`E!@u6Pb8&w &V䘼V]arM8SQH^+!#%P580.H["-pcjqH˱E9ø|nђTJ*B  sA dGT"~)@4n@#!\jg*2zk(#%8AX":m<UB#%A!)#%"wvDIVѭUDUc= 'ܭf7*4zd„mJOxZZ [@`šF#&&3@p@ذ8C*<+&L^+RHx7Ģ]Fn~y9\ܲVWvI|u^r{֋Ԧ˟`ԈH?r`XBH#% !p%5,"x9ٍG'w!KQqB>Ll:#& yivU{|5$`Xwh.Ѧygt> mC$Y65ZOoTɊ#2iR#&DFDQd##%`H3OGFt9X!-#%yTjgy诬f#& 2Y80!lyW8&̆MuB#2"04J ’`,\S2!T#&wn~9Z=T!(`*?nn#&"BnyԞnXCV}$βuﴐz;[X~~N2//pci\gOxޏ/%8,d131,;n9(L*O4I?/qB#T4Rvuçzt#&PJ:MKy9QdW! ,BȀĈ/$yJbRHGȣH!%خIYUVJ"|/&0Y5a@=4\ٷD˜OmN<ǭiJ~0{$l[&#fi&$biXmKX֒Ցl̪ҥ #2p)T:!` "EA`1 i@ ?57=luX 6'.d(`<46:#&B-_`NCeKEP°sb22M3ш@Dže B$ P0ވB#%0_ _J &jyNt#2"ܩ@h,7P8KQ,iLDE5VՔMRb#2T]{wP(&,$C)es-r5Ej+\l)S(f#&EI[r({oӿe2 qr8FEV@T]J?e}E4ѾZC#.7|\'ȃ¼;TGH|aCC}ݿg~P8oAb+ce`Tֽ5}mҪV_BD|m}aϟET#&N(^(l($&Ϧ]E>/9E錉h+=(W&>Pi5=/b:9NēPA#&Jb Y`DH=~[yAV1_KK VuðP0&#|W& #2#%'3 Q>}밲@n&jYe CwHV@WX{1 Rx KߗE5xCs(*򞋹9x' W#{Ѭ<΢`[ɦQ=.: 9µ㥷;WeӿcpqF;jt,٤m*a\{략/֕x3CuQaݺ_Qu\eKan8/[:m4j3#2vl`b۾}jv4#2#2jݔ:lGjwhR |H0.fmQ}t͂Xfw7N8LyA !cqgy1}Ǔ!(OQAy#2}҈ϤEоMمћ,"脲_0`hbyztX22X=<- #& -#2t:GPӢTIiP0 Á(5F)5.UCdy:{A(p=zmCUs|}U}׸획(|RBi/ĮMf]p|!$X{h@* 1A!?>6}jw#%E aHN #2dy,&;h=[kE1#2#2 #]l#&'L#k|4bhf[+j'7#Q-Ƴ{#%Ki;Ow$$> C#&meQR (H)Fe)"R #2BǬݤ止jx}((vE%QR#%(A`xbA4.u,[h>7Bc`p>7C1-˛/Ɂzvf]#%GWq5$jmUUO0z Ie{1+~([^/T#0Kf"BJ`w*Gbs.0P1C%#& ɻi-7hֹ1T O|_Kd*Exl֙0vq*,G(P=}lhX ;E玔15ywS9N.Ie#&C#%(j7> 3{8B$NYK' ۃh#2-fxԚJ)ɸ{4 USƭm2L?] YءA aUR{CLidN(=&Ág)f!Fpa-L#%0}6,U5EiaBĚ!rcGLG0X"#%YV#c#&Wol@#%\s&%*2HDBA2Pݯ?SXVŤ=X4<B΃evgZ@f[mW<ɲg"ݽZM;s|ODb~Ӵ9}\2d2ⲱnsYv?3ŀ|%GS}*ҥZk-׊nVZ\"HQ#& .r"!~,^'YʹT#2@aist>"* əLje%)4&?C35i jPM(QZh׿naZLY%[4)4̑hEQ%(OuE#2D)%%0ADL"2V( 5R1#2f,#2Mù&<=߾, :e vc^ߛ6#2qEFQ 3`o8lg,uژCF7`6#5^.hHgAb_hMvn\C>]b;sXܿog#2!tMny c׷Y?y}^awxS؛l1#**Bk`o߳_bc5#edX6MYQxϏ}=5KQKf}9U7aAfJg p`ɡsق]p9{  CSY>[HwO co=$(z#&=X\GrgC͹bL]&Gow[wm-tkmX]>g#%H2(7%Y=yrݥ%x4m1Hw nkwtV.ן#&g/91MLAř#2o\7Fxݐf EШ/%"WA@#llm<#Xc~M;t>ɇHa 'JBxwG}Iqgӧn}4? 畧ACy}![_HnD~[R;gX8,vjTX1wH::r21ay Ou (!ݧDWC :Z}n0M'd$O]V>(U᪉@O:21GjF8Ve5dDŒs#&fciy\f,nj7NfsP240ՆpY! hѨb$YB,.7:3#2m]Y561fSgK1MaTt_aqi>0LoT~[.&eMlƴlZ kaJ|n0f2cdiPenAȱ#I^х%kQD07 $ٜ1m'"#'Fk<2S2Cp\%b ZyLFڣ `,ꚫ.m."qݢYCmUz`Loѱ "#%$wkQ6&F/@F&)%+rD#&Wp5CkOI%vʃ-P#%a݋OX#2_ ^#&B'1@ȳ#`9>nxUct~b ڛ1"W)L֍&[`!pm*źX#2>2H:n^Hl캇%[I,cX'`qvH̺2 I#%c=ݱ?8<P씔A#pB}v#%#2jq2[I,f"6EqX1H_"d&[B$ҁmd-`P#&x(D&({}kS$;(Co/iثEWwrL@vdb?2HM6 LMl+O/[H5p;CKNC;e0#2;~"38} Hj@0)= UQє~ [r~?|=2e Dׅ %$#%D #Eh9P&7 x^P@`@O軓;ݥ"rLUE)"g"7z@=A#%lxʮ:̮) eHAo8+,u"O~9zkW*mm^z@Xc̥,؁7V Xds23cw(s{u>4Cے4H,DmU~z[(.aɕ.;\sY#&s hho48 \oaLeD#&A#2ީKD+]]` @R'anM%!#&hD<\bYQ&0F0,`dW\Օ<[/P|>r,!II1#..q#%B^*>.؈ "%9~xc9fW1h0J~RkLp7.Fjkd\}9G\L$gƴ:C~QMa]]AKXbkh#&MM.-W7 't9`vhU#2i!Kbg<:Nk3-#2!%@B-AbV75R'wwDߕVsk-V| #2`zI^fH:f`S#&l;kZd8#&G/fmwъHV,+MrjRo#&k\fH҂s˼\Cd"ju,,[Xd,,5oJ1.\`T(ݺd <H#UD@J&Pljd" $HAK!& :06:3 h`V0A״,~HozbE"@?̭҃}دm3\1_ms Qh#%9LM$2h_;'n˺ܷo_ƫbQmXi6_miior(fyykĪXzI;eoϊk|tu+W]Y[ QYZI\&tӆJ4ɕj`teJe:^mCi .ƥeF((g "锼M8Ȉ6R;.g{9Foi6:F3q tDF!^aJik_3OR>;c d+.! r.hQ&=TNbڇ4~rԙ !A"1a9 czպRƪU-ͻ6e[{촣=v#jKJJCU`аeBE,҆(i@$H+sPY.*RDU-X"X/,Y'\ABLc@^qŶv]6wWd7BYGll[nmЫk]]Ro^\iy2$XXiE$H@!fSdH”Sh٨mͲHJL5S5ԵҴ5R>m|T,TАH+ !TW&B,PCd]&ACDnm#2]DJ:`#%2`#&_(!vޓcx#' (QPedzAV~V^zvMQVH]R{v&I7mr,5LVuZiX[IHiK)E1K-@𮰥)lbMJ4ON(EWu%vjSA35m165-b#&MԪm_3,j&ȢlV"Il˭-LIm)m6(*jmogm*#-W^w$2hk75xؔĪF0B H1YgTיƔdž2,#%:2=tc}d qL&CѪ-DhJ>}ϊDC.)c%%V[rŊ#$2ơ$&TAii[E)5R_o寱֐+hS(EFA)ąJꄰ@#2"+"YU+}"H#2iM5m)2Y+Knj,j6b1-PjRj֛f[#&))nP€2Vmh%M)!El43F3Fb0ѕllбjŪR**SeJS%RVJ1dRYҤ(II&Ra44RTVDRdeRdɣJIiKlukJm6d4tٲJUY5Vof6{*zV+mJ["Vԩj+_vIFדex旗*V׮o5h#2o%Zqhfo+̸mE=J#5>HFoǮ$>xq~m_tOEnC{QvϗBmյ^h#&[YA3Rhd +IC"+ĺ-xwnGѫ^̡҅~a"(IxE #&4$yNg2Ɔ4&rqb ]z#%v@(-Rܨ.A6jsXltt*P~^pM7 B8YfO8H*b0; ;vk/]#2MJlLR駘p\&r#&#&,G̬KJUl@iU?\> `T T?#2Dn g#&M Jpn)'QEUpC]->cղMX#$FuCC2֡wD /boz{vX#%Bp#%#%[cUF#& (#2Ep4Z ̒Y`)b\i=z䤩8@I` 'My T'#&#2vW|-:vchO47%?.[6@<%غ^`r6XԤE҃>feF6 *1h*h4C D6D5$-pINc0RXԍ)׭g#&KH2 QV6pP`۶!͑ T D#2Iin1v8D1UR,KKVE&1oRj0k΋ѪQ"?#%թrE8&BƣӢ ؀cކAbV)5IX8>?4ybo$yɌDy¹#&kE^t5M2SV+E+}}@NmS\刐}Aq *<\n}_Xsّn1^5- *߁0%mŧ֪žwfZK_tY9jM)#2M 6`M^͑P2B0V{'d뇿k(@B=>G=bnT{C/Xq2:16U*~`V΂;ςii#5N7H[LBqL ~2&K  d @&4`RţݨhnP#292e4{pYWekW1Ӫ-kF#2/b3xQȵxǙPiӉƒjLo6#2EMTUT6b'%$TҩRl m46HE`|D$ "msq0#nK4h<_Xow Z(3A` Sj#&&cAvD[BN^ρPh@#2Q5K49\_s`;,7DX#%q "?_@& ٮ&F#&r= 2_oވ%QvՓf!||Xv x(3~G +;;y$DqzyEpkF#6|^h"3ɱ&!MQM=#%r?:Cv:#%+kAX*wmrYX@P#%flY!xEdBD #2|/ˏ8`̕тAi`( ]gϥ֧'< Mģcܓ#2tTH)J~%2ZPQ!<11Yyu(0 Rgu 1@vځ7YPPf|E٨%5#%!#&pҟTI9? #&%?PGZCzO#&4~e&/ꆌ3TEP 8DiDDj6b0-#2#2:i/on$FH#2muX"bRj$*Ŏ i!4,#22dǨKnɆڡLE5*Yb0cCcQG~|u6kr¶)&Y#2a-6dd4; 0&)#2IJņYld ]Q JJMm]:00&i4rM0[)e\aXcXVzzʰ&@Gln$llm6rAn[5i]ѢZ1nkƇ]maF1[g PApjӬ3L tgR.aXH|8 QA}'h/6ܐXtj†VVڦ㕂Ԅ8 #&π'J@FA@/mKmyTkO>#>c3U&mvɖ4h#%1>?F:d:rc:#%t#%'7~ 0@X #EQܼJJ6UD/-,k\WRm7[dR&IDT@F%RDEG,?2MDAD[=|Tx8<;=Zz[EE#&F@IZ*jU6 F#2T +a#2 pNC:f!)hH x B94#&%#%Ɣhmuʖmmxז^Em6B:k+ص^Du5sUk^ikQf&ZmRfKߪqATPGqjV?>]FYG&mH"_FUH3#% "f#&d(XÊQ-Uy(w78#%M@l3Q52#2F u0h?]'IiR!_lXfqa/-3dUIΝConԈҎBv*mc*bv綃X4QpPߗ}qz`ACOb(|DMd=@ T6qӹ`˿]qIFJmC6jMe=J613Ee$PZ`[syn0ӳuv@_WޤH@UfldN'H^>xq ?yԧK6ak91omw6 1ZM6a0 b( „#&Le(ʩC#%c6| !k!HC}c ߞW(vi41$̨6!%Ζ^3=ΤᩓO<VtW#&fJj5#%[cpHKcEb-Z%f565#M} Dʙigjܶf-,+eLKUJk4YbKX*S16jDT H"́~-(O?SIvd4HDQ@LS%nm5E]Js[x6#2~6׼ 8!zNp#%m"51rd㴷U]Ƚ+A "c*T[G|J,y.{s>94 E!>΋G^#24~= n0E#2"}CC֝lbI&$ E")P*/A/j[ pOZ/g;3@>4M8d̀B$Џ,i-#.m:旬\-r!\*P3$^#2Np#&Eֵ"D @W7y@j#6.Pu`2'3Z#2R#&'7a~7ExV5Xha$pIpjEX5*w<9|bz"|2ҳUd~)]WQm>-M=8A;/#&WLp:k5:1R#2! {xq~KͧHSY#k}ag%wTΟс|TSB`!`VRPRP#2VM,W1mʌXDZ_N0b;ioBNO 8:U1 Bb8al4§`H5I>5}n 0ǎu@ "P5AUK-!@ #!0z̄ ҥ"kVyK0KfLUi h,H (fE"gIxF(5S?qB"cuh$H]0P!55RAcY:wjf#h6K$j0Ł" )#2L#%C =gSq#2Ĩ(B\ih@9ލH@r(K2]t]o.ݵkMBȔPe'#2PzogF`kjoTwR{&yvl{u%&Zi]Jtրv 5htfj wp.-B&+&Wr6\C#&p>m3;>D9 '6BuHyIebX#2EXO &\JB<#&aE#ZHAɍL{вb,DCyT)#gAL!$hWr0!(n)ƍ':HkĨ_w4ΩhT~"VR~paQ/"*Cl6˕,E#%oZO߻S#%>TDJF[VB4{.w%?#&rk#&_Lsl ߺHK&ͲD je 5VWE[$F~V2Nx3 /.ЎL5N6D]I҃L@Y'0N4ϐޒ%?FtV]UNSզl `0KegvsXj/_#&,*u@YT0XwuTQYn]xZ%#%Œ&·L#%Y:]3舯CۺaZLxjۛ~aK ]^ 舩 !^:sC䄆rн'!eV[ZPpn>QM9ֆzzfM[:C&"_o\$J xI-׮ј%-nj0#&BmZy]/7mɖ Pg{Oi܄ b4:$Ё,!cET [CbFϤ:60֤M&{K_)wV7t\-2qcThTʝE%W6ں[WumXr֖[3U"U6"i((DlBaSJZ,#256@̇.6KwL:<y#a Hْ aXV 4%%`9gvQMG.J C&f)i.V_8qS?Tsc9@&{ۇn}Zo:@l}ZX@5t4%P,k"a5W/#%:!DZ5_[}2IeFVFi5ljֽH#b%!HTFH!vrDx~[?[qrQsoKj8|ÎUEak5d*:#2SIyi."e>1\u| ԉ<0Cg'#&8^Ye[MN_E^otXjO3[MePaS(4?ǨA߳7ֆV8栴hH܁p&/mHFLlb|rc1bVo7a0ɘ@̍Xf0nd#&V~ǝ mD4R˽n|Mx{nsӹ-Wa]5$W}i(qG~#&%&'w׭<QH\#&O_op*ze Wl`1)jlfo|ƙ׏z]N^y#eX3oa18$3n/xsF _V~OrRbP5dj؎q$J!p?tCQ5|b/OF#[0=~nrڎ#2ţ]woM4H_LV*G-}ڙC !n0G#%_]PX x jC+(Q`H0n@N#`#&Pb#2ؗDeH8j>WE󫫠3ҝ]9*I0? 5il쒤G_nfOn>W9q`g6nLZ.@<$)2#Pzpu*#2LhPI7qrR2.ǁ+:kZob`U@b0VaRT)?,뤚.7]Y#%k#э)g (z+o`!(RTkڈs`FQb#%vZ(M:e#2JB&?Y{@Z$*Yic֡py#m6#%ԂП;JaE6:: Ls Aƥ*>7ZtnWK>)&0xǀ}7qOU$^, fX;bCOn*F5#7T`u&BLo#%{BhU{`mW0!f@Mhoň#;Km1LiaFe>!D$w~/ 4ܲvPIe)›1վJ&axHhㄉI棸#(pZ]t=f6|WἮV^^`aE^$! A4#&v~ 'gN̒YW772,*UΒFyR qdŠ#2"&ۤ 3PE#2Mj"&4+&YR1ւi52lfS$e6,3$Z^mɧw.mɋ7]rۚv\כ&-C#r7{3a `+fJK̗Ya#&7LfZ4Av\x4{8ɴؠ@ 4 2m#&41O//VvUkJ!b,5B0!#2X6fY-V-]UdbR.Y A@1a%bA!fBX45Uip(LCFXf6ZIYZAě! fc02"0cxb[)ᙐcSf#&ݎa FeZԆHvG}&„:<=J="nͽ)*fST9Vj#2 ̉%uZblNTPfU[1!77( 44*#%ƋJ" ĆQUVmjWTV `!`0.bJ!$08=Gؔ8:5OM?-)ި=QjÄ}2?)(H4Ɖ^bc_kJ2l"SiR*SE.2?~;W=CZ1H6yK#{{N×d˝Yex0߶ձ[~dzw[3 $9nffܝFEuF$18pp͌n5xmEPń);MEr[#&k##2W!C#2x7)e2aG$2c7 yMOstgg^Ir!^\0\jK7P󂞤қ&ZlHni *̈-qR#%i#s5pHs#%K|SViyc|?e##xH$#%V`(.d@D?*D;d #>)Hhv:#267ej:,U^u˦ۻs!˫S4-#R1R㺮5Jdnnۯ<1XkB $4!顥1m l#)/{ȶEi#%Єʠ*$a#2*KX@rDa p) ePd kkɚ%-F徙CX P$^j"U)MR/:-b4FTTlTlj-EX4hƙM̢fL4b6dWD#2I7#2[ůD >UE0,*Ք!a>`6uQ ͸fc1Y`cdjS mM7Ga#ɷe8#&R<;=z1%h14kǬ9{w*AOl.FЦɛp#&9AsۓkM-hɣ8u,;]R90`)dLKx&_哶c,DRtq۹Yy\#2&6g-ō bG#&´2z iEH}.>3FXADRիƓ_9r-lB^PH"ȂHP,[o%l\?xwr>t (b Zo*I  "$#2*iHF1@Z% & #4Dh_*YU8 L`.E퐀#26\X>*J#2(%0)*F2#%Khmcl Zf#&6ZP#2f蹔 b D,(PPV1`4Tr""Ϻ`,^?=뉣 84"(0ʒO*#%pݡIu>7/֔fczNkIөb썘7lp#&!2dʶ9cNyUmkUFW&$ #&:@HnaߦY!U5ڌOA d^  szN?O#% /#`iHRj) £a#%.9*'`h|N) B#%3 b TYQ4$۾q:]dE4n#21*M638 Ma3pn>!)4&!QU0i(6tE#&E,@dUib/:a4a0 ΨU B'YF **y:^A,Q:^xIz<6PyCUM#2Qj5#%]嵐#2PC#1qލ|Iī:egek/,~$1dY1n#&]Q-\4ؔ^n+6Yje-GZmhpa.mۙúo7n:c ۤW/ye "XqǷ}mh%z3#2ݹ?Gau,dV)m[UE ?.Y&s#2b%lZ)he[ޚ#p* RT,D)nu]K+0^ŒkUM4%)hQ  j1F1d3Aկ6V<=(DHQ^HkvgETb"M(03.bdE+:8lR(@ b0{)P9.UW HA5jEm*͖U̸ۗQ#%sV#Pii5FZUjWHAóH#2#2DaO$b$V! n#%:fk33\]z`v(S@#&cRI6Omۻ{# S%~~@[ Ѯ#2~\b $ MNs#& Z.#&4F6"H$lCƜt97Ӡ<?u wM'ST8.44)! U&J!DH6#%l(TbJ0" dm,(d)B" h$RgJmI(#&c1(1\.a"-0HB2-IcT'f$ 'XOovvUX8M@S$5@"&zbeW+PhX,4j6X`e0h!XVVkbխ\P4uђit52L䫬ݻpl GeD!#2Cīܝ'-n 8\ BUH@R8n4S#&tP$a$#&NVguTm9wUENL$DH\IK*`2Np,bF"0EҼ'<3b"D%k )X@R8冃_WPq84`1m7Ym%$I#L+ǃ#Ʀcm!+_mZ*NGü8FeUB.v:Q7lx=`'"w:iD0Tb7WTD?UPi-nAD@ #2H$PUTJaP;H6aA8>0lշzRM4h>1j#2j>JjQOB_ֱNJ#2%*ECS,z.a_Z3#M^0p PEG Aѩ2Z[{&6ӒB7#&Y8Uьq.B4kd҃I=8w\J #&P#%1Y1FDKH[皟zw~w޶Qh&"#2bކw}==FxmW+q+lcrT`I0>UNls)ECӐݭG1L}Ygjۄ {r=R4eލ20HA!d$rѲGf;r-^gmh=eu y۽`FvQo΢j Z]Y$Rݾ =IJqLB H ٌ#&j zn5;Ok;UXc#2)r%Ŕ6,D%Ջ1PXوH[޺YAU{}wV/O#%ṑ=>^\g#%'_CwBfmg2o~#]Bv6&hl{ybWBD`_#&#&zd2`u*06rTJ"I aȣ.D&pldLVՓDBG©0u`P3_#2eUZUY֓4pRѶ.@`Ĉ"%0)<)SV/e~2=#2ZҾeeuY[Cu* .<|ڤtr- Tؽ\t,Ȁq[qXB9 "(B*7#2^$]h*1rߞLΰ97r=sUP#9٬^N;pgGBCHϟ5cJʄ;NwpP۞%*&0[#cZFO 4U(ZjyB`/zzI*I&w Hp#%6eRM#&(Bf ݗ8D @5s9zhP] "ȭ$r=A>`ozlիEkcMvuM-*G^gd33uࡷ<;u{]f&Es-#%GCt wVAc88em V]d92hşbh"SYeB5DH:cW\L:iТdn6;'#*qU;UH@!#%!Hs&56<-:5BW;#&ƎA)hV! 8-k/+)"#2cER62_66G!m#2#%ҥT"D#%y0AwNk6[P;$(im4Ȍ*T6ƆTwVKG-7 ;h^_d#%BCw&o2Zqrjh,\#2Dizv>Kڊ. |ⓦ X:5iʻaO ^k"A o?Wy@mݠUG{F~7URXcrG2%%1ܞt\BN yx$3}.I?L3ܷ`v(I hT#&;|L;vSR&t!.뇎2P)ZeLPlH6~$g#&~W#2K&3zܳa-BD%FJW*kRh"eY-%jl>w=$ nCrǨUIE?9Tj6*R~!ḥ6HEhMDRbcDSddؚ6M b<1>qt̒Ġ/:ѯu~qJI6m2sa2`$aǑi/x頖@L@#&߲csz:iN [݁PJQF K'5^/"(PBV̆L_mtjrr}Adam3:2M&X4@2̍IUhrC*@(U%@I5~@ɗsul!PjM7͠~@4ZbU1^ mΪf鰷Ve#2y#ܭ]]#;mdBJQ63(jR+ dhF0f bDh f(`B#2qU$^~Fѩ5UPU#&Di/x_ 40fTe"@+K =3Ll4N6>Dˆ) \4E:a_gx}ֳD1k'CMSLbȤ`FY-#ߢW+hT#&_T'VD;_{ LKDL 'XNxwEk Ir{75m鮳˫_X|ct ]E?] 4N}ΫVFΉLY>_]tG:x`DrqW11 P=HʒT"]Ru뽦Ljp!T!>xz=PnbZṵ=NF(A6XiG1J5/m~uֽ6Hk**ȵUeDCO&YjC v"?IXji w;, P1mTp1w"+IAwmd^9-VKr+W+F]6!lmt\Mr涹ٹ6ɵk@RZF"~0xlyD5E}P]fbVa}Ad-"tQA[7}Or"Hٻ}WG5Pqw@_^ҏQD?@9=%G@Z>,!DHJTB)(;{x҉iuH bރ`25#2(#2&Mҵ{oB]PKT] "&F_Ѿ!`PuM#%^؏uՌ4 4T"㎧!)x#%:#%v̾?H0"wyRn##2ԁʇH#"&P):ڿ²f$ 1idi6,ڒōɴhSmhFmEKJ5MFTֱlm&jkyo_nH 6Y+dDlDaKl#HFFJ88cxF#&0.5P@dx W#2#ȋ&2KXHP(:0ZaB"QmnUʶ6I #2/(H50`(bF"+ Ph1pO̮ץwfUD"HAlb#hu  cvpF|laӲH<[}袕E+IHNȄ,'u.0?Su44l#&-ȓe0#@0#2H8?/˺{qK!QjGHvC#2Royv]o,*l̡~ZEEmrmM֟଒=1T=fRI_Wڳ.يٟ׀}?']ut?-)߂Tv0}s/ Àp ?@FgJXMq.:)PQ>~nѤظ#&T nxB?;M(Ϗ {#YRͽK5#&3X̪Ԯa>JU3L,3qsZYLĒ8n]u{}]\;in@$9 SĪjU L{p!&;T]2d Ag}}|)3_{*'D֖X !)$&lȸ8NI xxnGQ2ؙ 6e!ۢ\:.}Jmv"J/\-\L !$a\fi ՜5qIJE0!A,MtVBZDŽ iGG{H‡:_ssr gp\=קLwIL|izJc'k8Y‡f+e<+gܪ΁ {Qa"#&%S1LNv6Bѳ%fٍblC"q8b(ٻ6iN3Ŵf+2 ڧ+]4Rw[Ai3+t>ؗ޸ %yxFmĽ%}Qu:ζtVm2EF76S<רTׄhɃԄEzVƻ->g}3׾ҵ)[EWnL~Zs^Gw;?ݬ^Bjhqxyٜgn7ׅɞwg]tpt>ٚǜ.=Ҥm*z{:㍞#&԰qzC50˾曺M&_ q~/)Ckh`Bh@M#&ZP +DHqcAcuv3Ɲ2ş!s\/ 6 r6Du6cM,g;M \DeR\ 2Nq1o7<6g6i 5O&Q  B\8br#%t䗄1y:ٌx\cr3*#&BzQ G4Vu]3h|g/M(*&1]:L”oklN0d8.tu7OpapB^svp#%rv ch9#&#&HFtcT)#%{(Ul#%#2! "jG3 .׷,#CBԳtҬxxJJ5#%6s^zvVD%h.\l75ªPe\]uk/7y8ea#2$ݪPQg62T61EpL䒯*gsTdxmIqtQX~>ż9qXiIypC9UMU54oOnq6:aŲm=.܇+j 7}=F+ہH%΋K>nUY P5F%D(@=̴5Qj1]ִZvё$Q )l bҫ ;,JFJZi˘0!8*akdD>"tFv X@ ݦ.$P>kݚHrnc^!x#—$غtm qG]u ǰy_FY-_hL0xFoʏjM@U>NKG}qP2xQwr̸iRըG\Z2.x[CUZ=7,htyQxt2|\Nfd]{h3LoVCTvlC0bӁrBܳk;%3#@У׎D yBˈp"cܶU#Uu#2y׉!"u*lA=G8AR4h*XWxY'*X Nr8Z#%`B+"Pwr6 I2 b _ȧ_`!Yyn"xX)ϸ+r̖\..9COy?P5|ۍ'aburZxsCHfx)oc`#2D2|Kp m\ #&hHif-+W ɥSCF Vbն#2R|3MAC*#Hz2Ƴ,"Fe#2bfԐq͐‰m65$R]V6&cD0J墣ܪd%:wLt`lL!PQl#2@Y0 811tfuDv1^^+G^974BCQV鵭jƲ:kWW.sV #lHccHѳr"ֵUKZ:K_֧<ݭ0;ĬD5AB###2Qic]cD "s#m2l4\f%+XIw&]J&0gHnothsb'`N7N8g *Lᑏ9lwq< #&K֑rtC%cFѸe)Jah0m0lbj/mɒ+; M˧Ƃ"Ek!505C9mF?r1u9ӟՓzrJ„FDu5OߔmFޮ0&i`0ށƘ#2E{] Jƚ9yn#2j,ukDf3 Dڢ&n\cxB˜5Ĵ LaAI$@Q#2|WPG@cr-HvSN4cՁ3G1̦ \ DNxe)$jgdF\d#3Hm&47,hZ5@g5`fV&x3$*&P`jq#&4AM@jACYg!z u:ar>aJ,^p-jv[>raHeCmx@ϻ_unLk,~(i*HI]>fP: T!e!jV3cZ#%LegJ $UT@)WžMx6Oueb˧Lf12*O !H@#2q⤤BwzQ#ě걿vaH K8?Oc1V6-T.S3osn7m#&H1w&ӓvlda%y'[#%U߅%( Q:$hCs ! ^5evahhH h@#%BD%#%n<yճ{{*$"-ST)6ca#2QHj[2ضMIXlIY4aQheM5#JMQJQ *#CZ#&DKFb6E*ai&a"R#I ~IW`@y`NF2o)΍7 `#%3xBFo@x=>}ym)'+hy#%6`#&C:.CN0a8`In|5>].A! ,d~FAWYoRtnD0bz8$9o# u}z27V)k-N~[VQUVɴDVD5IV(siϻveLJ}ia,˿$T~̋fn,Wpl.DvZsˣU5!6]4X`C$K1쩮#%yls=a̬jxYw#%G~yr bQWIq睔zaج-s5kpMisOG9,FHrv<ᷱucvȍ{#H|YJwa*xwgA Z ` 0#%TT˥L C@kY EEs&EػZ7|93S*a9ː2XtQF/BdFlae 8 @2g0Iqا]:4,m"Hd+Nz5Dov "T#&t<ו@.$mRDA?a1@F&j`l GI,v!Lj1AdfTCl1zj &14@SpP,Cȹ A`}xQL@Em#%@0 2Svt2BC #%b Us?,unnLȰM&P,KI(aeHHҖ3S{FqDPn,@(b$e&8Y'7X{OPODvkbx唅8,-aCRd#$wZE)IzQC=t9;`g*#%M30BB,}"D[N#PK;z"ƣ66 AmL\#ЁΞLFe%nɓtH6cR.IᑱcyE!Ҟq#2tث l]zd1 U(Ic˗Ozg--<2<|R#_ $cR7q$[vL*7xȇ芛:}#pz8X̎lH&g9BIUxޚ5<q5 Ns&ik CV^<'jdX^u I R !n>F=r("c^#&oag O ( 5(TC?#&#% |3>.?z"=Vmڈc{YIi~c7Y:(4!-*n!CQųL[G2;p֛jo& Dx^3HfH0l\_RYg5Uמ*=V/nrQȋM~^%J#2*٩=Y۽4x4*$j&GyrN CrJ%C^z#+Hr&2qx. c0Ԙ?r{~&6!T@ZPTV,)qK뛖(+nu#&{򳵚Zcci7[+`eՌ@_R#%Dp~NgF[L3lj誖~hnˑ%#2{ T{#RДHD79QK*v`FVI FMNk#&K2Ę%#b*i##%Ԫ iM@h~zLc$:nb&'T8ڡ,:fl1@;goC wڵVpDNA#%C3 ##Yy*ݭbxF1:H #&]&!-.u.$n*f̉ٮ"Po(OO0tpdb<iq捸y6m#)'ɤr t z(>Yȱe9/958MHzQ\`Re=-eLɷ(ɻ 0!#&TOinڒ"\qG X1g(CYi`8|-#&TV$D/E^Ų81#I#2xцla48%&²\Q$Qweó,ܛ\.wVܥ[&fb-rtN*t\3@Tu%3Uw)aiCe̋0-i('bt>$~LPYwyQ?9PĪ٘+s- zC$lP s^!/MH](|o.H(P"I#2_]HnU6.#%Zif(7E2LxZ0]@~W(bHtK1BihQ&#2C8jQ+W]Ĥ?~#|OFjMD):֧ b2A%J$yp8L 폞~vV (^/$iLMI5,+$mj5 lژԛ~s]I@b(w;#&=1Ŋۭwsf1#%> hmt~KoFlHϙ'{T=蝂{Ou2)#%(KƙI#1}G:GJ"c.x"MKKP|鶊4-J[hyóE"#&ǝ#2{IHƬrKΈ(5p1fl3hu[##-ﮮ3=^\CM8[L]an*.hea[+}oz)pSDn@Y#%Z؃iBU(nC- u|#%>("EL*J.ҌܥoZZ[a_t+ uSt, 0DQ0]~K w,(#%ߚ]E#%,B#Ctl91.^l H1#M8X{$O*ب'3^EF[J!A1e |{|oq;Hhwp'Q#if`!#2,Ղ#"7sX#%wsIG=_oknc50.=l:]s_@[(xqOSa#%G1#2ܣʂ͖'O^AXC%κDhK "+0-F^^y븶pYE6Bъ1/& WXU1ܷSJ#%/GD6m{NE_ ٞ$0Fߎ6@O#%PV A1R]=H!I HQ!QRY#&,Tٵ~~AFblUJRj5RB!O"hEą"6vԐj*J)-eXXّVEAmMM}گ"z#%^EW|M]>_uI;&a'}eL|*j |p q I!=8 g:IDq좫ߕ`#2IgAv엃HPA %j1mԡ4%Xd$$`Ah5w;Yd}lPg,Gb"jbG-6uxPcK|݉2*({,bJ8,,NqENBȡu[D%jhKzͅvӻ6+ƼVdn3vfUuQW;PdYjƚ&wWw[I60i6dP`Ea"J #2DA4ۋz*4MIUZuumj-feRםܷku2]5W T&28xbBKa#&!4A?p׍Ufjbɸ}o>n`hٞ-RHmGi[Fh̓(1,V <®fmMң6dc؋ .IȏgRzD+v܌Ki0`R66<[q.$-ݯ{B Ę"hjT|'Fux6peO3fBvQH+R3x\Lo-~BID*:69ze9m/T~5tYw]*OMo`ߩ-$ --Q4HǏ;jz=$-S2Lf_#2zT~өP Q#&tȾyMذ'㒰Cn)(Y`jr6PRL#2B":cNLəN6"{u#%/#&S_S#F2WR ED4RzJS0׌_=ϣGbuwt/8ځM> E#&#&{}&Oi_#2%PfR-)kg(9F%QPm@gU|m7J? 09$#n7E*ޜ:;Шb@bp1/f]CxQ"1N@= ziő&NG!!!J2L_1 PW#%#%k=Ɔڏ!Gw$`5گ#=$C Bgiȁ;[y[Od6;z=xk">@-? "i4*ʁ@3H_hrnS@!POaG¯۱d|kZ#363 +""#=^?O?O~6gߟ,?ZߛI~o4GD&(?'g#%!~j*p/_m{=nvkjs&.O imz˙~Ƴ^ʪb1gJ|;);?8{f{k y>6c8ClgzB>X\v ٢Xջa#20 ˥OLCpQ :dcT#&0*hxTlpFQ \(*tm輍el)Jod2 0[۲o+}msRmۖm(oSD# #%iB$YۮXrCF$6a! L'>&@i7#2yMzaF,#2"o3=UFFzhaw숺"9W>(hGr:g@=zAXWknh*,AA1DGM^U"I E!;g#%A|=, 6bg`CS ȝhOk & )(Ey.Tp(ATB{l-mHG~;#&>{N@΃++7n<#DZAwpM6>!/F\d#2O)Mz=|笏j36UcO8i?!T$#}@rE8P #<== +#-----BEGIN PGP SIGNATURE-----\n\niQIcBAABCgAGBQJaias4AAoJEEm0xnwFJ3qqfmcP/j4ITHGXd3U8tRn4hjvpLLkT\nfTMd9x9hBEwwRqU0EYoAp2+yIoUKvb5JERF0YjGUWoiZqxEmGGp5BFSOJOrYhq0V\nsZIE01wrQQTYMn1jfoXhjywyLVdyMpl9hgb2Z7DnF9GgzUsd5bPWmoNaCMkhZjuD\nSaR13Ff0hAOVIt/fNoJiXYJ2ICDRG5LGKFlkxy0ykXOkrKDmdah4DV6MGVB/tS3n\niBhxgqMc9ILSFQoEQmFAXTid8Ej0OBj+csAk8nvbCEiV+k74BozpQ+QVfR+agX+K\nnf/oMed8F1jKa9uydbvcEn4SXXEBqKztiKvuCGmZIO3xKd+46+5Oh51wKxZYNsyk\nlYBAA/fH8fOZqMzTCRGZM3q6EnKf+zwGyf4lFOHuVzeXHlfcZA62V1Tcr9aQfsq0\n2saI9S9JsxEpFvAa4S+x7oQ+VJ0WM5XLb04KKFgAMjK/kW2Nw6rYQ0eNCdBX6NCc\n6LWnmmrB/TauSNsJSYIfICoKuv+hebjbSIQa5n1/zQeWYt8DKZYS9Lkwl34vMMdx\nDzq/l7QL+I5Z5jDSVkzRS31/K6T6RWiYFzHgabwD/DNBC8cfG4RwTZIEO3C8uLFy\nDo0MG8w5NFkMk7t0KQtBPe+7BK6Nv6Xo5mLTJ+01INvmgHavhgH4bSyg0kD8MbGS\nY4cOEMKnUkHXCpvXsOLz\n=9X3b\n-----END PGP SIGNATURE-----\n diff --git a/wscript b/wscript index 9b2a76a8..43b16213 100644 --- a/wscript +++ b/wscript @@ -1,7 +1,6 @@ # -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*- - """ -Copyright (c) 2014-2017, Regents of the University of California, +Copyright (c) 2014-2018, Regents of the University of California, Arizona Board of Regents, Colorado State University, University Pierre & Marie Curie, Sorbonne University, @@ -24,14 +23,14 @@ You should have received a copy of the GNU General Public License along with NFD, e.g., in COPYING.md file. If not, see . """ -VERSION = "0.6.1" -APPNAME = "nfd" -BUGREPORT = "https://redmine.named-data.net/projects/nfd" -URL = "https://named-data.net/doc/NFD/" -GIT_TAG_PREFIX = "NFD-" +from waflib import Context, Logs, Utils +import os, subprocess -from waflib import Logs, Utils, Context -import os +VERSION = '0.6.1' +APPNAME = 'nfd' +BUGREPORT = 'https://redmine.named-data.net/projects/nfd' +URL = 'https://named-data.net/doc/NFD/' +GIT_TAG_PREFIX = 'NFD-' def options(opt): opt.load(['compiler_cxx', 'gnu_dirs']) @@ -47,21 +46,44 @@ def options(opt): opt.addDependencyOptions(nfdopt, 'libpcap') nfdopt.add_option('--without-libpcap', action='store_true', default=False, - dest='without_libpcap', - help='''Disable libpcap (Ethernet face support will be disabled)''') + help='Disable libpcap (Ethernet face support will be disabled)') - opt.addDependencyOptions(nfdopt, 'librt', '(optional)') - opt.addDependencyOptions(nfdopt, 'libresolv', '(optional)') + opt.addDependencyOptions(nfdopt, 'librt') + opt.addDependencyOptions(nfdopt, 'libresolv') nfdopt.add_option('--with-tests', action='store_true', default=False, - dest='with_tests', help='''Build unit tests''') + help='Build unit tests') nfdopt.add_option('--with-other-tests', action='store_true', default=False, - dest='with_other_tests', help='''Build other tests''') + help='Build other tests') - nfdopt.add_option('--with-custom-logger', type='string', default=None, - dest='with_custom_logger', - help='''Path to custom-logger.hpp and custom-logger-factory.hpp ''' - '''implementing Logger and LoggerFactory interfaces''') + nfdopt.add_option('--with-custom-logger', metavar='PATH', + help='Path to custom-logger.hpp and custom-logger-factory.hpp ' + 'implementing Logger and LoggerFactory interfaces') + +PRIVILEGE_CHECK_CODE = ''' +#include +#include +#include +int main() +{ + sysconf(_SC_GETGR_R_SIZE_MAX); + + char buffer[100]; + group grp; + group* grpRes; + getgrnam_r("nogroup", &grp, buffer, 100, &grpRes); + passwd pwd; + passwd* pwdRes; + getpwnam_r("nobody", &pwd, buffer, 100, &pwdRes); + + int ret = setegid(grp.gr_gid); + ret = seteuid(pwd.pw_uid); + (void)(ret); + + getegid(); + geteuid(); +} +''' def configure(conf): conf.load(['compiler_cxx', 'gnu_dirs', @@ -80,41 +102,17 @@ def configure(conf): conf.checkDependency(name='libresolv', lib='resolv', mandatory=False) if not conf.check_cxx(msg='Checking if privilege drop/elevation is supported', mandatory=False, - define_name='HAVE_PRIVILEGE_DROP_AND_ELEVATE', fragment=''' -#include -#include -#include -int -main(int, char**) -{ - char buffer[100]; - ::sysconf(_SC_GETGR_R_SIZE_MAX); - group grp; - group* grpRes; - getgrnam_r("nogroup", &grp, buffer, 100, &grpRes); - passwd pwd; - passwd* pwdRes; - getpwnam_r("nobody", &pwd, buffer, 100, &pwdRes); - - int ret = setegid(grp.gr_gid); - ret = seteuid(pwd.pw_uid); - (void)(ret); - - getegid(); - geteuid(); - return 0; -} -'''): + define_name='HAVE_PRIVILEGE_DROP_AND_ELEVATE', fragment=PRIVILEGE_CHECK_CODE): Logs.warn('Dropping privileges is not supported on this platform') conf.check_cxx(header_name='valgrind/valgrind.h', define_name='HAVE_VALGRIND', mandatory=False) if conf.options.with_tests: - conf.env['WITH_TESTS'] = 1 + conf.env.WITH_TESTS = True conf.define('WITH_TESTS', 1) if conf.options.with_other_tests: - conf.env['WITH_OTHER_TESTS'] = 1 + conf.env.WITH_OTHER_TESTS = True conf.define('WITH_OTHER_TESTS', 1) boost_libs = 'system chrono program_options thread log log_setup' @@ -123,12 +121,11 @@ main(int, char**) conf.check_boost(lib=boost_libs, mt=True) if conf.env.BOOST_VERSION_NUMBER < 105400: - Logs.error("Minimum required boost version is 1.54.0") - Logs.error("Please upgrade your distribution or install custom boost libraries" + - " (https://redmine.named-data.net/projects/nfd/wiki/Boost_FAQ)") - return + conf.fatal('Minimum required Boost version is 1.54.0\n' + 'Please upgrade your distribution or manually install a newer version of Boost' + ' (https://redmine.named-data.net/projects/nfd/wiki/Boost_FAQ)') - if conf.env['CXX_NAME'] == 'clang' and conf.env.BOOST_VERSION_NUMBER < 105800: + if conf.env.CXX_NAME == 'clang' and conf.env.BOOST_VERSION_NUMBER < 105800: conf.define('BOOST_ASIO_HAS_STD_ARRAY', 1) # Workaround for https://redmine.named-data.net/issues/3360#note-14 conf.define('BOOST_ASIO_HAS_STD_CHRONO', 1) # Solution documented at https://redmine.named-data.net/issues/3588#note-10 @@ -137,41 +134,41 @@ main(int, char**) if not conf.options.without_libpcap: conf.check_asio_pcap_support() - if conf.env['HAVE_ASIO_PCAP_SUPPORT']: + if conf.env.HAVE_ASIO_PCAP_SUPPORT: conf.checkDependency(name='libpcap', lib='pcap', mandatory=True, errmsg='not found, but required for Ethernet face support. ' 'Specify --without-libpcap to disable Ethernet face support.') else: Logs.warn('Warning: Ethernet face is not supported on this platform with Boost libraries version 1.56. ' 'See https://redmine.named-data.net/issues/1877 for more details') - if conf.env['HAVE_LIBPCAP']: - conf.check_cxx(function_name='pcap_set_immediate_mode', header_name='pcap/pcap.h', - cxxflags='-Wno-error', use='LIBPCAP', mandatory=False) + if conf.env.HAVE_LIBPCAP: + conf.check_cxx(msg='Checking if libpcap supports pcap_set_immediate_mode', mandatory=False, + define_name='HAVE_PCAP_SET_IMMEDIATE_MODE', use='LIBPCAP', + fragment='''#include + int main() { pcap_t* p; pcap_set_immediate_mode(p, 1); }''') if conf.options.with_custom_logger: conf.define('HAVE_CUSTOM_LOGGER', 1) - conf.env['INCLUDES_CUSTOM_LOGGER'] = [conf.options.with_custom_logger] - conf.env['HAVE_CUSTOM_LOGGER'] = 1 + conf.env.HAVE_CUSTOM_LOGGER = True + conf.env.INCLUDES_CUSTOM_LOGGER = [conf.options.with_custom_logger] conf.check_compiler_flags() + # Loading "late" to prevent tests from being compiled with profiling flags conf.load('coverage') - conf.load('sanitizers') - conf.define('DEFAULT_CONFIG_FILE', '%s/ndn/nfd.conf' % conf.env['SYSCONFDIR']) - + conf.define('DEFAULT_CONFIG_FILE', '%s/ndn/nfd.conf' % conf.env.SYSCONFDIR) # disable assertions in release builds if not conf.options.debug: conf.define('NDEBUG', 1) - conf.write_config_header('core/config.hpp') def build(bld): version(bld) - bld(features="subst", - name='version', + bld(features='subst', + name='version.hpp', source='core/version.hpp.in', target='core/version.hpp', install_path=None, @@ -184,79 +181,74 @@ def build(bld): VERSION_MINOR=VERSION_SPLIT[1], VERSION_PATCH=VERSION_SPLIT[2]) - core = bld( + core = bld.objects( target='core-objects', - name='core-objects', - features='cxx pch', - source=bld.path.ant_glob(['core/**/*.cpp'], - excl=['core/logger*.cpp']), - use='version NDN_CXX BOOST LIBRT', - includes='. core', + features='pch', + source=bld.path.ant_glob('core/**/*.cpp', excl=['core/logger*.cpp']), + use='version.hpp NDN_CXX BOOST LIBRT', + includes='.', export_includes='.', headers='core/common.hpp') - if bld.env['HAVE_CUSTOM_LOGGER']: - core.use += " CUSTOM_LOGGER" + if bld.env.HAVE_CUSTOM_LOGGER: + core.use += ' CUSTOM_LOGGER' else: - core.source += bld.path.ant_glob(['core/logger*.cpp']) + core.source += bld.path.ant_glob('core/logger*.cpp') - nfd_objects = bld( + nfd_objects = bld.objects( target='daemon-objects', - name='daemon-objects', - features='cxx', - source=bld.path.ant_glob(['daemon/**/*.cpp'], + source=bld.path.ant_glob('daemon/**/*.cpp', excl=['daemon/face/*ethernet*.cpp', - 'daemon/face/*pcap*.cpp', - 'daemon/face/unix-*.cpp', - 'daemon/face/websocket-*.cpp', + 'daemon/face/pcap*.cpp', + 'daemon/face/unix*.cpp', + 'daemon/face/websocket*.cpp', 'daemon/main.cpp']), - use='core-objects WEBSOCKET', + use='core-objects', includes='daemon', export_includes='daemon') - if bld.env['HAVE_LIBPCAP']: + if bld.env.HAVE_LIBPCAP: nfd_objects.source += bld.path.ant_glob('daemon/face/*ethernet*.cpp') - nfd_objects.source += bld.path.ant_glob('daemon/face/*pcap*.cpp') + nfd_objects.source += bld.path.ant_glob('daemon/face/pcap*.cpp') nfd_objects.use += ' LIBPCAP' - if bld.env['HAVE_UNIX_SOCKETS']: - nfd_objects.source += bld.path.ant_glob('daemon/face/unix-*.cpp') + if bld.env.HAVE_UNIX_SOCKETS: + nfd_objects.source += bld.path.ant_glob('daemon/face/unix*.cpp') - if bld.env['HAVE_WEBSOCKET']: - nfd_objects.source += bld.path.ant_glob('daemon/face/websocket-*.cpp') + if bld.env.HAVE_WEBSOCKET: + nfd_objects.source += bld.path.ant_glob('daemon/face/websocket*.cpp') + nfd_objects.use += ' WEBSOCKET' - if bld.env['WITH_OTHER_TESTS']: + if bld.env.WITH_OTHER_TESTS: nfd_objects.source += bld.path.ant_glob('tests/other/fw/*.cpp') - rib_objects = bld( - target='rib-objects', - name='rib-objects', - features='cxx', - source=bld.path.ant_glob(['rib/**/*.cpp']), - use='core-objects') + bld.objects(target='rib-objects', + source=bld.path.ant_glob('rib/**/*.cpp'), + use='core-objects') - bld(target='bin/nfd', - features='cxx cxxprogram', - source='daemon/main.cpp', - use='daemon-objects rib-objects') + bld.program(name='nfd', + target='bin/nfd', + source='daemon/main.cpp', + use='daemon-objects rib-objects') - bld.recurse("tools") - bld.recurse("tests") + bld.recurse('tools') + bld.recurse('tests') - bld(features="subst", + bld(features='subst', source='nfd.conf.sample.in', target='nfd.conf.sample', - install_path="${SYSCONFDIR}/ndn", - IF_HAVE_LIBPCAP="" if bld.env['HAVE_LIBPCAP'] else "; ", - IF_HAVE_WEBSOCKET="" if bld.env['HAVE_WEBSOCKET'] else "; ") + install_path='${SYSCONFDIR}/ndn', + IF_HAVE_LIBPCAP='' if bld.env.HAVE_LIBPCAP else '; ', + IF_HAVE_WEBSOCKET='' if bld.env.HAVE_WEBSOCKET else '; ') - if bld.env['SPHINX_BUILD']: - bld(features="sphinx", - builder="man", - outdir="docs/manpages", - config="docs/conf.py", + if bld.env.SPHINX_BUILD: + bld(features='sphinx', + name='manpages', + builder='man', + config='docs/conf.py', + outdir='docs/manpages', source=bld.path.ant_glob('docs/manpages/**/*.rst'), - install_path="${MANDIR}/", + install_path='${MANDIR}', VERSION=VERSION) bld.symlink_as('${MANDIR}/man1/nfdc-channel.1', 'nfdc-face.1') bld.symlink_as('${MANDIR}/man1/nfdc-fib.1', 'nfdc-route.1') @@ -265,7 +257,7 @@ def build(bld): bld.symlink_as('${MANDIR}/man1/nfdc-set-strategy.1', 'nfdc-strategy.1') bld.symlink_as('${MANDIR}/man1/nfdc-unset-strategy.1', 'nfdc-strategy.1') - bld.install_files("${SYSCONFDIR}/ndn", "autoconfig.conf.sample") + bld.install_files('${SYSCONFDIR}/ndn', 'autoconfig.conf.sample') def docs(bld): from waflib import Options @@ -275,85 +267,82 @@ def doxygen(bld): version(bld) if not bld.env.DOXYGEN: - Logs.error("ERROR: cannot build documentation (`doxygen' is not found in $PATH)") - else: - bld(features="subst", - name="doxygen-conf", - source=["docs/doxygen.conf.in", - "docs/named_data_theme/named_data_footer-with-analytics.html.in"], - target=["docs/doxygen.conf", - "docs/named_data_theme/named_data_footer-with-analytics.html"], - VERSION=VERSION, - HTML_FOOTER="../build/docs/named_data_theme/named_data_footer-with-analytics.html" \ - if os.getenv('GOOGLE_ANALYTICS', None) \ - else "../docs/named_data_theme/named_data_footer.html", - GOOGLE_ANALYTICS=os.getenv('GOOGLE_ANALYTICS', "")) + bld.fatal('Cannot build documentation ("doxygen" not found in PATH)') - bld(features="doxygen", - doxyfile='docs/doxygen.conf', - use="doxygen-conf") + bld(features='subst', + name='doxygen.conf', + source=['docs/doxygen.conf.in', + 'docs/named_data_theme/named_data_footer-with-analytics.html.in'], + target=['docs/doxygen.conf', + 'docs/named_data_theme/named_data_footer-with-analytics.html'], + VERSION=VERSION, + HTML_FOOTER='../build/docs/named_data_theme/named_data_footer-with-analytics.html' \ + if os.getenv('GOOGLE_ANALYTICS', None) \ + else '../docs/named_data_theme/named_data_footer.html', + GOOGLE_ANALYTICS=os.getenv('GOOGLE_ANALYTICS', '')) + + bld(features='doxygen', + doxyfile='docs/doxygen.conf', + use='doxygen.conf') def sphinx(bld): version(bld) if not bld.env.SPHINX_BUILD: - bld.fatal("ERROR: cannot build documentation (`sphinx-build' is not found in $PATH)") - else: - bld(features="sphinx", - outdir="docs", - source=bld.path.ant_glob('docs/**/*.rst'), - config="docs/conf.py", - VERSION=VERSION) + bld.fatal('Cannot build documentation ("sphinx-build" not found in PATH)') + + bld(features='sphinx', + config='docs/conf.py', + outdir='docs', + source=bld.path.ant_glob('docs/**/*.rst'), + VERSION=VERSION) def version(ctx): + # don't execute more than once if getattr(Context.g_module, 'VERSION_BASE', None): return Context.g_module.VERSION_BASE = Context.g_module.VERSION - Context.g_module.VERSION_SPLIT = [v for v in VERSION_BASE.split('.')] + Context.g_module.VERSION_SPLIT = VERSION_BASE.split('.') - didGetVersion = False + # first, try to get a version string from git + gotVersionFromGit = False try: cmd = ['git', 'describe', '--always', '--match', '%s*' % GIT_TAG_PREFIX] - p = Utils.subprocess.Popen(cmd, stdout=Utils.subprocess.PIPE, - stderr=None, stdin=None) - out = str(p.communicate()[0].strip()) - didGetVersion = (p.returncode == 0 and out != "") - if didGetVersion: + out = subprocess.check_output(cmd, universal_newlines=True).strip() + if out: + gotVersionFromGit = True if out.startswith(GIT_TAG_PREFIX): - Context.g_module.VERSION = out[len(GIT_TAG_PREFIX):] + Context.g_module.VERSION = out.lstrip(GIT_TAG_PREFIX) else: - Context.g_module.VERSION = "%s-commit-%s" % (Context.g_module.VERSION_BASE, out) - except OSError: + # no tags matched + Context.g_module.VERSION = '%s-commit-%s' % (VERSION_BASE, out) + except subprocess.CalledProcessError: pass versionFile = ctx.path.find_node('VERSION') - - if not didGetVersion and versionFile is not None: + if not gotVersionFromGit and versionFile is not None: try: Context.g_module.VERSION = versionFile.read() return - except (OSError, IOError): + except EnvironmentError: pass # version was obtained from git, update VERSION file if necessary if versionFile is not None: try: - version = versionFile.read() - if version == Context.g_module.VERSION: - return # no need to update - except (OSError, IOError): - Logs.warn("VERSION file exists, but not readable") + if versionFile.read() == Context.g_module.VERSION: + # already up-to-date + return + except EnvironmentError as e: + Logs.warn('%s exists but is not readable (%s)' % (versionFile, e.strerror)) else: versionFile = ctx.path.make_node('VERSION') - if versionFile is None: - return - try: versionFile.write(Context.g_module.VERSION) - except (OSError, IOError): - Logs.warn("VERSION file is not writeable") + except EnvironmentError as e: + Logs.warn('%s is not writable (%s)' % (versionFile, e.strerror)) def dist(ctx): version(ctx)