././@PaxHeader0000000000000000000000000000003300000000000011451 xustar000000000000000027 mtime=1603192959.129193 audioread-2.1.9/0000755000076500000240000000000000000000000014425 5ustar00asampsonstaff00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1545837412.0 audioread-2.1.9/LICENSE0000644000076500000240000000204700000000000015435 0ustar00asampsonstaff00000000000000Copyright (c) 2011-2018 Adrian Sampson Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1586098221.0 audioread-2.1.9/MANIFEST.in0000644000076500000240000000022600000000000016163 0ustar00asampsonstaff00000000000000# Documentation. include README.rst # Example script. include decode.py # License include LICENSE # Include full test suite recursive-include test/ * ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1603192959.1294029 audioread-2.1.9/PKG-INFO0000644000076500000240000002230500000000000015524 0ustar00asampsonstaff00000000000000Metadata-Version: 1.1 Name: audioread Version: 2.1.9 Summary: multi-library, cross-platform audio decoding Home-page: https://github.com/sampsyo/audioread Author: Adrian Sampson Author-email: adrian@radbox.org License: MIT Description: audioread ========= .. image:: https://secure.travis-ci.org/beetbox/audioread.png :target: https://travis-ci.org/beetbox/audioread/ Decode audio files using whichever backend is available. The library currently supports: - `Gstreamer`_ via `PyGObject`_. - `Core Audio`_ on Mac OS X via `ctypes`_. (PyObjC not required.) - `MAD`_ via the `pymad`_ bindings. - `FFmpeg`_ or `Libav`_ via its command-line interface. - The standard library `wave`_, `aifc`_, and `sunau`_ modules (for uncompressed audio formats). .. _Gstreamer: http://gstreamer.freedesktop.org/ .. _gst-python: http://gstreamer.freedesktop.org/modules/gst-python.html .. _Core Audio: http://developer.apple.com/technologies/mac/audio-and-video.html .. _ctypes: http://docs.python.org/library/ctypes.html .. _MAD: http://www.underbit.com/products/mad/ .. _pymad: http://spacepants.org/src/pymad/ .. _FFmpeg: http://ffmpeg.org/ .. _Libav: https://www.libav.org/ .. _wave: http://docs.python.org/library/wave.html .. _aifc: http://docs.python.org/library/aifc.html .. _sunau: http://docs.python.org/library/sunau.html .. _PyGObject: https://pygobject.readthedocs.io/ Use the library like so:: with audioread.audio_open(filename) as f: print(f.channels, f.samplerate, f.duration) for buf in f: do_something(buf) Buffers in the file can be accessed by iterating over the object returned from ``audio_open``. Each buffer is a bytes-like object (``buffer``, ``bytes``, or ``bytearray``) containing raw **16-bit little-endian signed integer PCM data**. (Currently, these PCM format parameters are not configurable, but this could be added to most of the backends.) Additional values are available as fields on the audio file object: - ``channels`` is the number of audio channels (an integer). - ``samplerate`` is given in Hz (an integer). - ``duration`` is the length of the audio in seconds (a float). The ``audio_open`` function transparently selects a backend that can read the file. (Each backend is implemented in a module inside the ``audioread`` package.) If no backends succeed in opening the file, a ``DecodeError`` exception is raised. This exception is only used when the file type is unsupported by the backends; if the file doesn't exist, a standard ``IOError`` will be raised. A second optional parameter to ``audio_open`` specifies which backends to try (instead of trying them all, which is the default). You can use the ``available_backends`` function to get a list backends that are usable on the current system. Audioread is "universal" and supports both Python 2 (2.6+) and Python 3 (3.2+). Example ------- The included ``decode.py`` script demonstrates using this package to convert compressed audio files to WAV files. Version History --------------- 2.1.9 Work correctly with GStreamer 1.18 and later (thanks to @ssssam) 2.1.8 Fix an unhandled ``OSError`` when FFmpeg is not installed. 2.1.7 Properly close some filehandles in the FFmpeg backend (thanks to @RyanMarcus and @ssssam). The maddec backend now always produces bytes objects, like the other backends (thanks to @ssssam). Resolve an audio data memory leak in the GStreamer backend (thanks again to @ssssam). You can now optionally specify which specific backends ``audio_open`` should try (thanks once again to @ssssam). On Windows, avoid opening a console window to run FFmpeg (thanks to @flokX). 2.1.6 Fix a "no such process" crash in the FFmpeg backend on Windows Subsystem for Linux (thanks to @llamasoft). Avoid suppressing SIGINT in the GStreamer backend on older versions of PyGObject (thanks to @lazka). 2.1.5 Properly clean up the file handle when a backend fails to decode a file. Fix parsing of "N.M" channel counts in the FFmpeg backend (thanks to @piem). Avoid a crash in the raw backend when a file uses an unsupported number of bits per sample (namely, 24-bit samples in Python < 3.4). Add a ``__version__`` value to the package. 2.1.4 Fix a bug in the FFmpeg backend where, after closing a file, the program's standard input stream would be "broken" and wouldn't receive any input. 2.1.3 Avoid some warnings in the GStreamer backend when using modern versions of GLib. We now require at least GLib 2.32. 2.1.2 Fix a file descriptor leak when opening and closing many files using GStreamer. 2.1.1 Just fix ReST formatting in the README. 2.1.0 The FFmpeg backend can now also use Libav's ``avconv`` command. Fix a warning by requiring GStreamer >= 1.0. Fix some Python 3 crashes with the new GStreamer backend (thanks to @xix-xeaon). 2.0.0 The GStreamer backend now uses GStreamer 1.x via the new gobject-introspection API (and is compatible with Python 3). 1.2.2 When running FFmpeg on Windows, disable its crash dialog. Thanks to jcsaaddupuy. 1.2.1 Fix an unhandled exception when opening non-raw audio files (thanks to aostanin). Fix Python 3 compatibility for the raw-file backend. 1.2.0 Add support for FFmpeg on Windows (thanks to Jean-Christophe Saad-Dupuy). 1.1.0 Add support for Sun/NeXT `Au files`_ via the standard-library ``sunau`` module (thanks to Dan Ellis). 1.0.3 Use the rawread (standard-library) backend for .wav files. 1.0.2 Send SIGKILL, not SIGTERM, to ffmpeg processes to avoid occasional hangs. 1.0.1 When GStreamer fails to report a duration, raise an exception instead of silently setting the duration field to None. 1.0.0 Catch GStreamer's exception when necessary components, such as ``uridecodebin``, are missing. The GStreamer backend now accepts relative paths. Fix a hang in GStreamer when the stream finishes before it begins (when reading broken files). Initial support for Python 3. 0.8 All decoding errors are now subclasses of ``DecodeError``. 0.7 Fix opening WAV and AIFF files via Unicode filenames. 0.6 Make FFmpeg timeout more robust. Dump FFmpeg output on timeout. Fix a nondeterministic hang in the Gstreamer backend. Fix a file descriptor leak in the MAD backend. 0.5 Fix crash when FFmpeg fails to report a duration. Fix a hang when FFmpeg fills up its stderr output buffer. Add a timeout to ``ffmpeg`` tool execution (currently 10 seconds for each 4096-byte read); a ``ReadTimeoutError`` exception is raised if the tool times out. 0.4 Fix channel count detection for FFmpeg backend. 0.3 Fix a problem with the Gstreamer backend where audio files could be left open even after the ``GstAudioFile`` was "closed". 0.2 Fix a hang in the GStreamer backend that occurs occasionally on some platforms. 0.1 Initial release. .. _Au files: http://en.wikipedia.org/wiki/Au_file_format Et Cetera --------- ``audioread`` is by Adrian Sampson. It is made available under `the MIT license`_. An alternative to this module is `decoder.py`_. .. _the MIT license: http://www.opensource.org/licenses/mit-license.php .. _decoder.py: http://www.brailleweb.com/cgi-bin/python.py Platform: ALL Classifier: Topic :: Multimedia :: Sound/Audio :: Conversion Classifier: Intended Audience :: Developers Classifier: Programming Language :: Python :: 2 Classifier: Programming Language :: Python :: 2.6 Classifier: Programming Language :: Python :: 2.7 Classifier: Programming Language :: Python :: 3 Classifier: Programming Language :: Python :: 3.2 Classifier: Programming Language :: Python :: 3.3 Classifier: Programming Language :: Python :: 3.4 Classifier: Programming Language :: Python :: 3.5 Classifier: Programming Language :: Python :: 3.6 ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1603192866.0 audioread-2.1.9/README.rst0000644000076500000240000001550300000000000016120 0ustar00asampsonstaff00000000000000audioread ========= .. image:: https://secure.travis-ci.org/beetbox/audioread.png :target: https://travis-ci.org/beetbox/audioread/ Decode audio files using whichever backend is available. The library currently supports: - `Gstreamer`_ via `PyGObject`_. - `Core Audio`_ on Mac OS X via `ctypes`_. (PyObjC not required.) - `MAD`_ via the `pymad`_ bindings. - `FFmpeg`_ or `Libav`_ via its command-line interface. - The standard library `wave`_, `aifc`_, and `sunau`_ modules (for uncompressed audio formats). .. _Gstreamer: http://gstreamer.freedesktop.org/ .. _gst-python: http://gstreamer.freedesktop.org/modules/gst-python.html .. _Core Audio: http://developer.apple.com/technologies/mac/audio-and-video.html .. _ctypes: http://docs.python.org/library/ctypes.html .. _MAD: http://www.underbit.com/products/mad/ .. _pymad: http://spacepants.org/src/pymad/ .. _FFmpeg: http://ffmpeg.org/ .. _Libav: https://www.libav.org/ .. _wave: http://docs.python.org/library/wave.html .. _aifc: http://docs.python.org/library/aifc.html .. _sunau: http://docs.python.org/library/sunau.html .. _PyGObject: https://pygobject.readthedocs.io/ Use the library like so:: with audioread.audio_open(filename) as f: print(f.channels, f.samplerate, f.duration) for buf in f: do_something(buf) Buffers in the file can be accessed by iterating over the object returned from ``audio_open``. Each buffer is a bytes-like object (``buffer``, ``bytes``, or ``bytearray``) containing raw **16-bit little-endian signed integer PCM data**. (Currently, these PCM format parameters are not configurable, but this could be added to most of the backends.) Additional values are available as fields on the audio file object: - ``channels`` is the number of audio channels (an integer). - ``samplerate`` is given in Hz (an integer). - ``duration`` is the length of the audio in seconds (a float). The ``audio_open`` function transparently selects a backend that can read the file. (Each backend is implemented in a module inside the ``audioread`` package.) If no backends succeed in opening the file, a ``DecodeError`` exception is raised. This exception is only used when the file type is unsupported by the backends; if the file doesn't exist, a standard ``IOError`` will be raised. A second optional parameter to ``audio_open`` specifies which backends to try (instead of trying them all, which is the default). You can use the ``available_backends`` function to get a list backends that are usable on the current system. Audioread is "universal" and supports both Python 2 (2.6+) and Python 3 (3.2+). Example ------- The included ``decode.py`` script demonstrates using this package to convert compressed audio files to WAV files. Version History --------------- 2.1.9 Work correctly with GStreamer 1.18 and later (thanks to @ssssam) 2.1.8 Fix an unhandled ``OSError`` when FFmpeg is not installed. 2.1.7 Properly close some filehandles in the FFmpeg backend (thanks to @RyanMarcus and @ssssam). The maddec backend now always produces bytes objects, like the other backends (thanks to @ssssam). Resolve an audio data memory leak in the GStreamer backend (thanks again to @ssssam). You can now optionally specify which specific backends ``audio_open`` should try (thanks once again to @ssssam). On Windows, avoid opening a console window to run FFmpeg (thanks to @flokX). 2.1.6 Fix a "no such process" crash in the FFmpeg backend on Windows Subsystem for Linux (thanks to @llamasoft). Avoid suppressing SIGINT in the GStreamer backend on older versions of PyGObject (thanks to @lazka). 2.1.5 Properly clean up the file handle when a backend fails to decode a file. Fix parsing of "N.M" channel counts in the FFmpeg backend (thanks to @piem). Avoid a crash in the raw backend when a file uses an unsupported number of bits per sample (namely, 24-bit samples in Python < 3.4). Add a ``__version__`` value to the package. 2.1.4 Fix a bug in the FFmpeg backend where, after closing a file, the program's standard input stream would be "broken" and wouldn't receive any input. 2.1.3 Avoid some warnings in the GStreamer backend when using modern versions of GLib. We now require at least GLib 2.32. 2.1.2 Fix a file descriptor leak when opening and closing many files using GStreamer. 2.1.1 Just fix ReST formatting in the README. 2.1.0 The FFmpeg backend can now also use Libav's ``avconv`` command. Fix a warning by requiring GStreamer >= 1.0. Fix some Python 3 crashes with the new GStreamer backend (thanks to @xix-xeaon). 2.0.0 The GStreamer backend now uses GStreamer 1.x via the new gobject-introspection API (and is compatible with Python 3). 1.2.2 When running FFmpeg on Windows, disable its crash dialog. Thanks to jcsaaddupuy. 1.2.1 Fix an unhandled exception when opening non-raw audio files (thanks to aostanin). Fix Python 3 compatibility for the raw-file backend. 1.2.0 Add support for FFmpeg on Windows (thanks to Jean-Christophe Saad-Dupuy). 1.1.0 Add support for Sun/NeXT `Au files`_ via the standard-library ``sunau`` module (thanks to Dan Ellis). 1.0.3 Use the rawread (standard-library) backend for .wav files. 1.0.2 Send SIGKILL, not SIGTERM, to ffmpeg processes to avoid occasional hangs. 1.0.1 When GStreamer fails to report a duration, raise an exception instead of silently setting the duration field to None. 1.0.0 Catch GStreamer's exception when necessary components, such as ``uridecodebin``, are missing. The GStreamer backend now accepts relative paths. Fix a hang in GStreamer when the stream finishes before it begins (when reading broken files). Initial support for Python 3. 0.8 All decoding errors are now subclasses of ``DecodeError``. 0.7 Fix opening WAV and AIFF files via Unicode filenames. 0.6 Make FFmpeg timeout more robust. Dump FFmpeg output on timeout. Fix a nondeterministic hang in the Gstreamer backend. Fix a file descriptor leak in the MAD backend. 0.5 Fix crash when FFmpeg fails to report a duration. Fix a hang when FFmpeg fills up its stderr output buffer. Add a timeout to ``ffmpeg`` tool execution (currently 10 seconds for each 4096-byte read); a ``ReadTimeoutError`` exception is raised if the tool times out. 0.4 Fix channel count detection for FFmpeg backend. 0.3 Fix a problem with the Gstreamer backend where audio files could be left open even after the ``GstAudioFile`` was "closed". 0.2 Fix a hang in the GStreamer backend that occurs occasionally on some platforms. 0.1 Initial release. .. _Au files: http://en.wikipedia.org/wiki/Au_file_format Et Cetera --------- ``audioread`` is by Adrian Sampson. It is made available under `the MIT license`_. An alternative to this module is `decoder.py`_. .. _the MIT license: http://www.opensource.org/licenses/mit-license.php .. _decoder.py: http://www.brailleweb.com/cgi-bin/python.py ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1603192959.1202486 audioread-2.1.9/audioread/0000755000076500000240000000000000000000000016362 5ustar00asampsonstaff00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1563295387.0 audioread-2.1.9/audioread/__init__.py0000644000076500000240000000610400000000000020474 0ustar00asampsonstaff00000000000000# This file is part of audioread. # Copyright 2013, Adrian Sampson. # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the # "Software"), to deal in the Software without restriction, including # without limitation the rights to use, copy, modify, merge, publish, # distribute, sublicense, and/or sell copies of the Software, and to # permit persons to whom the Software is furnished to do so, subject to # the following conditions: # # The above copyright notice and this permission notice shall be # included in all copies or substantial portions of the Software. """Decode audio files.""" from . import ffdec from .exceptions import DecodeError, NoBackendError from .version import version as __version__ # noqa def _gst_available(): """Determine whether Gstreamer and the Python GObject bindings are installed. """ try: import gi except ImportError: return False try: gi.require_version('Gst', '1.0') except (ValueError, AttributeError): return False try: from gi.repository import Gst # noqa except ImportError: return False return True def _ca_available(): """Determines whether CoreAudio is available (i.e., we're running on Mac OS X). """ import ctypes.util lib = ctypes.util.find_library('AudioToolbox') return lib is not None def _mad_available(): """Determines whether the pymad bindings are available.""" try: import mad # noqa except ImportError: return False else: return True def available_backends(): """Returns a list of backends that are available on this system.""" # Standard-library WAV and AIFF readers. from . import rawread result = [rawread.RawAudioFile] # Core Audio. if _ca_available(): from . import macca result.append(macca.ExtAudioFile) # GStreamer. if _gst_available(): from . import gstdec result.append(gstdec.GstAudioFile) # MAD. if _mad_available(): from . import maddec result.append(maddec.MadAudioFile) # FFmpeg. if ffdec.available(): result.append(ffdec.FFmpegAudioFile) return result def audio_open(path, backends=None): """Open an audio file using a library that is available on this system. The optional `backends` parameter can be a list of audio file classes to try opening the file with. If it is not provided, `audio_open` tries all available backends. If you call this function many times, you can avoid the cost of checking for available backends every time by calling `available_backends` once and passing the result to each `audio_open` call. If all backends fail to read the file, a NoBackendError exception is raised. """ if backends is None: backends = available_backends() for BackendClass in backends: try: return BackendClass(path) except DecodeError: pass # All backends failed! raise NoBackendError() ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1548005678.0 audioread-2.1.9/audioread/exceptions.py0000644000076500000240000000170200000000000021115 0ustar00asampsonstaff00000000000000# This file is part of audioread. # Copyright 2013, Adrian Sampson. # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the # "Software"), to deal in the Software without restriction, including # without limitation the rights to use, copy, modify, merge, publish, # distribute, sublicense, and/or sell copies of the Software, and to # permit persons to whom the Software is furnished to do so, subject to # the following conditions: # # The above copyright notice and this permission notice shall be # included in all copies or substantial portions of the Software. class DecodeError(Exception): """The base exception class for all decoding errors raised by this package. """ class NoBackendError(DecodeError): """The file could not be decoded by any backend. Either no backends are available or each available backend failed to decode the file. """ ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1586098347.0 audioread-2.1.9/audioread/ffdec.py0000644000076500000240000002475400000000000020017 0ustar00asampsonstaff00000000000000# This file is part of audioread. # Copyright 2014, Adrian Sampson. # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the # "Software"), to deal in the Software without restriction, including # without limitation the rights to use, copy, modify, merge, publish, # distribute, sublicense, and/or sell copies of the Software, and to # permit persons to whom the Software is furnished to do so, subject to # the following conditions: # # The above copyright notice and this permission notice shall be # included in all copies or substantial portions of the Software. """Read audio data using the ffmpeg command line tool via its standard output. """ import sys import subprocess import re import threading import time import os try: import queue except ImportError: import Queue as queue from .exceptions import DecodeError COMMANDS = ('ffmpeg', 'avconv') if sys.platform == "win32": PROC_FLAGS = 0x08000000 else: PROC_FLAGS = 0 class FFmpegError(DecodeError): pass class CommunicationError(FFmpegError): """Raised when the output of FFmpeg is not parseable.""" class UnsupportedError(FFmpegError): """The file could not be decoded by FFmpeg.""" class NotInstalledError(FFmpegError): """Could not find the ffmpeg binary.""" class ReadTimeoutError(FFmpegError): """Reading from the ffmpeg command-line tool timed out.""" class QueueReaderThread(threading.Thread): """A thread that consumes data from a filehandle and sends the data over a Queue. """ def __init__(self, fh, blocksize=1024, discard=False): super(QueueReaderThread, self).__init__() self.fh = fh self.blocksize = blocksize self.daemon = True self.discard = discard self.queue = None if discard else queue.Queue() def run(self): while True: data = self.fh.read(self.blocksize) if not self.discard: self.queue.put(data) if not data: # Stream closed (EOF). break def popen_multiple(commands, command_args, *args, **kwargs): """Like `subprocess.Popen`, but can try multiple commands in case some are not available. `commands` is an iterable of command names and `command_args` are the rest of the arguments that, when appended to the command name, make up the full first argument to `subprocess.Popen`. The other positional and keyword arguments are passed through. """ for i, command in enumerate(commands): cmd = [command] + command_args try: return subprocess.Popen(cmd, *args, **kwargs) except OSError: if i == len(commands) - 1: # No more commands to try. raise def available(): """Detect whether the FFmpeg backend can be used on this system. """ try: proc = popen_multiple( COMMANDS, ['-version'], stdout=subprocess.PIPE, stderr=subprocess.PIPE, creationflags=PROC_FLAGS, ) except OSError: return False else: proc.wait() return proc.returncode == 0 # For Windows error switch management, we need a lock to keep the mode # adjustment atomic. windows_error_mode_lock = threading.Lock() class FFmpegAudioFile(object): """An audio file decoded by the ffmpeg command-line utility.""" def __init__(self, filename, block_size=4096): # On Windows, we need to disable the subprocess's crash dialog # in case it dies. Passing SEM_NOGPFAULTERRORBOX to SetErrorMode # disables this behavior. windows = sys.platform.startswith("win") if windows: windows_error_mode_lock.acquire() SEM_NOGPFAULTERRORBOX = 0x0002 import ctypes # We call SetErrorMode in two steps to avoid overriding # existing error mode. previous_error_mode = \ ctypes.windll.kernel32.SetErrorMode(SEM_NOGPFAULTERRORBOX) ctypes.windll.kernel32.SetErrorMode( previous_error_mode | SEM_NOGPFAULTERRORBOX ) try: self.devnull = open(os.devnull) self.proc = popen_multiple( COMMANDS, ['-i', filename, '-f', 's16le', '-'], stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=self.devnull, creationflags=PROC_FLAGS, ) except OSError: raise NotInstalledError() finally: # Reset previous error mode on Windows. (We can change this # back now because the flag was inherited by the subprocess; # we don't need to keep it set in the parent process.) if windows: try: import ctypes ctypes.windll.kernel32.SetErrorMode(previous_error_mode) finally: windows_error_mode_lock.release() # Start another thread to consume the standard output of the # process, which contains raw audio data. self.stdout_reader = QueueReaderThread(self.proc.stdout, block_size) self.stdout_reader.start() # Read relevant information from stderr. self._get_info() # Start a separate thread to read the rest of the data from # stderr. This (a) avoids filling up the OS buffer and (b) # collects the error output for diagnosis. self.stderr_reader = QueueReaderThread(self.proc.stderr) self.stderr_reader.start() def read_data(self, timeout=10.0): """Read blocks of raw PCM data from the file.""" # Read from stdout in a separate thread and consume data from # the queue. start_time = time.time() while True: # Wait for data to be available or a timeout. data = None try: data = self.stdout_reader.queue.get(timeout=timeout) if data: yield data else: # End of file. break except queue.Empty: # Queue read timed out. end_time = time.time() if not data: if end_time - start_time >= timeout: # Nothing interesting has happened for a while -- # FFmpeg is probably hanging. raise ReadTimeoutError('ffmpeg output: {}'.format( b''.join(self.stderr_reader.queue.queue) )) else: start_time = end_time # Keep waiting. continue def _get_info(self): """Reads the tool's output from its stderr stream, extracts the relevant information, and parses it. """ out_parts = [] while True: line = self.proc.stderr.readline() if not line: # EOF and data not found. raise CommunicationError("stream info not found") # In Python 3, result of reading from stderr is bytes. if isinstance(line, bytes): line = line.decode('utf8', 'ignore') line = line.strip().lower() if 'no such file' in line: raise IOError('file not found') elif 'invalid data found' in line: raise UnsupportedError() elif 'duration:' in line: out_parts.append(line) elif 'audio:' in line: out_parts.append(line) self._parse_info(''.join(out_parts)) break def _parse_info(self, s): """Given relevant data from the ffmpeg output, set audio parameter fields on this object. """ # Sample rate. match = re.search(r'(\d+) hz', s) if match: self.samplerate = int(match.group(1)) else: self.samplerate = 0 # Channel count. match = re.search(r'hz, ([^,]+),', s) if match: mode = match.group(1) if mode == 'stereo': self.channels = 2 else: cmatch = re.match(r'(\d+)\.?(\d)?', mode) if cmatch: self.channels = sum(map(int, cmatch.group().split('.'))) else: self.channels = 1 else: self.channels = 0 # Duration. match = re.search( r'duration: (\d+):(\d+):(\d+).(\d)', s ) if match: durparts = list(map(int, match.groups())) duration = ( durparts[0] * 60 * 60 + durparts[1] * 60 + durparts[2] + float(durparts[3]) / 10 ) self.duration = duration else: # No duration found. self.duration = 0 def close(self): """Close the ffmpeg process used to perform the decoding.""" if hasattr(self, 'proc'): # First check the process's execution status before attempting to # kill it. This fixes an issue on Windows Subsystem for Linux where # ffmpeg closes normally on its own, but never updates # `returncode`. self.proc.poll() # Kill the process if it is still running. if self.proc.returncode is None: self.proc.kill() self.proc.wait() # Wait for the stream-reading threads to exit. (They need to # stop reading before we can close the streams.) if hasattr(self, 'stderr_reader'): self.stderr_reader.join() if hasattr(self, 'stdout_reader'): self.stdout_reader.join() # Close the stdout and stderr streams that were opened by Popen, # which should occur regardless of if the process terminated # cleanly. self.proc.stdout.close() self.proc.stderr.close() # Close the handle to os.devnull, which is opened regardless of if # a subprocess is successfully created. self.devnull.close() def __del__(self): self.close() # Iteration. def __iter__(self): return self.read_data() # Context manager. def __enter__(self): return self def __exit__(self, exc_type, exc_val, exc_tb): self.close() return False ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1603192866.0 audioread-2.1.9/audioread/gstdec.py0000644000076500000240000003551400000000000020215 0ustar00asampsonstaff00000000000000# This file is part of audioread. # Copyright 2011, Adrian Sampson. # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the # "Software"), to deal in the Software without restriction, including # without limitation the rights to use, copy, modify, merge, publish, # distribute, sublicense, and/or sell copies of the Software, and to # permit persons to whom the Software is furnished to do so, subject to # the following conditions: # # The above copyright notice and this permission notice shall be # included in all copies or substantial portions of the Software. """Use Gstreamer to decode audio files. To read an audio file, pass it to the constructor for GstAudioFile() and then iterate over the contents: >>> f = GstAudioFile('something.mp3') >>> try: >>> for block in f: >>> ... >>> finally: >>> f.close() Note that there are a few complications caused by Gstreamer's asynchronous architecture. This module spawns its own Gobject main- loop thread; I'm not sure how that will interact with other main loops if your program has them. Also, in order to stop the thread and terminate your program normally, you need to call the close() method on every GstAudioFile you create. Conveniently, the file can be used as a context manager to make this simpler: >>> with GstAudioFile('something.mp3') as f: >>> for block in f: >>> ... Iterating a GstAudioFile yields strings containing short integer PCM data. You can also read the sample rate and channel count from the file: >>> with GstAudioFile('something.mp3') as f: >>> print f.samplerate >>> print f.channels >>> print f.duration """ from __future__ import with_statement from __future__ import division import gi gi.require_version('Gst', '1.0') from gi.repository import GLib, Gst import sys import threading import os from .exceptions import DecodeError try: import queue except ImportError: import Queue as queue try: from urllib.parse import quote except ImportError: from urllib import quote QUEUE_SIZE = 10 BUFFER_SIZE = 10 SENTINEL = '__GSTDEC_SENTINEL__' # Exceptions. class GStreamerError(DecodeError): pass class UnknownTypeError(GStreamerError): """Raised when Gstreamer can't decode the given file type.""" def __init__(self, streaminfo): super(UnknownTypeError, self).__init__( "can't decode stream: " + streaminfo ) self.streaminfo = streaminfo class FileReadError(GStreamerError): """Raised when the file can't be read at all.""" pass class NoStreamError(GStreamerError): """Raised when the file was read successfully but no audio streams were found. """ def __init__(self): super(NoStreamError, self).__init__('no audio streams found') class MetadataMissingError(GStreamerError): """Raised when GStreamer fails to report stream metadata (duration, channels, or sample rate). """ pass class IncompleteGStreamerError(GStreamerError): """Raised when necessary components of GStreamer (namely, the principal plugin packages) are missing. """ def __init__(self): super(IncompleteGStreamerError, self).__init__( 'missing GStreamer base plugins' ) # Managing the Gobject main loop thread. _shared_loop_thread = None _loop_thread_lock = threading.RLock() Gst.init(None) def get_loop_thread(): """Get the shared main-loop thread. """ global _shared_loop_thread with _loop_thread_lock: if not _shared_loop_thread: # Start a new thread. _shared_loop_thread = MainLoopThread() _shared_loop_thread.start() return _shared_loop_thread class MainLoopThread(threading.Thread): """A daemon thread encapsulating a Gobject main loop. """ def __init__(self): super(MainLoopThread, self).__init__() self.loop = GLib.MainLoop.new(None, False) self.daemon = True def run(self): self.loop.run() # The decoder. class GstAudioFile(object): """Reads raw audio data from any audio file that Gstreamer knows how to decode. >>> with GstAudioFile('something.mp3') as f: >>> print f.samplerate >>> print f.channels >>> print f.duration >>> for block in f: >>> do_something(block) Iterating the object yields blocks of 16-bit PCM data. Three pieces of stream information are also available: samplerate (in Hz), number of channels, and duration (in seconds). It's very important that the client call close() when it's done with the object. Otherwise, the program is likely to hang on exit. Alternatively, of course, one can just use the file as a context manager, as shown above. """ def __init__(self, path): self.running = False self.finished = False # Set up the Gstreamer pipeline. self.pipeline = Gst.Pipeline() self.dec = Gst.ElementFactory.make("uridecodebin", None) self.conv = Gst.ElementFactory.make("audioconvert", None) self.sink = Gst.ElementFactory.make("appsink", None) if self.dec is None or self.conv is None or self.sink is None: # uridecodebin, audioconvert, or appsink is missing. We need # gst-plugins-base. raise IncompleteGStreamerError() # Register for bus signals. bus = self.pipeline.get_bus() bus.add_signal_watch() bus.connect("message::eos", self._message) bus.connect("message::error", self._message) # Configure the input. uri = 'file://' + quote(os.path.abspath(path)) self.dec.set_property("uri", uri) # The callback to connect the input. self.dec.connect("pad-added", self._pad_added) self.dec.connect("no-more-pads", self._no_more_pads) # And a callback if decoding failes. self.dec.connect("unknown-type", self._unkown_type) # Configure the output. # We want short integer data. self.sink.set_property( 'caps', Gst.Caps.from_string('audio/x-raw, format=(string)S16LE'), ) # TODO set endianness? # Set up the characteristics of the output. We don't want to # drop any data (nothing is real-time here); we should bound # the memory usage of the internal queue; and, most # importantly, setting "sync" to False disables the default # behavior in which you consume buffers in real time. This way, # we get data as soon as it's decoded. self.sink.set_property('drop', False) self.sink.set_property('max-buffers', BUFFER_SIZE) self.sink.set_property('sync', False) # The callback to receive decoded data. self.sink.set_property('emit-signals', True) self.sink.connect("new-sample", self._new_sample) # We'll need to know when the stream becomes ready and we get # its attributes. This semaphore will become available when the # caps are received. That way, when __init__() returns, the file # (and its attributes) will be ready for reading. self.ready_sem = threading.Semaphore(0) self.caps_handler = self.sink.get_static_pad("sink").connect( "notify::caps", self._notify_caps ) # Link up everything but the decoder (which must be linked only # when it becomes ready). self.pipeline.add(self.dec) self.pipeline.add(self.conv) self.pipeline.add(self.sink) self.conv.link(self.sink) # Set up the queue for data and run the main thread. self.queue = queue.Queue(QUEUE_SIZE) self.thread = get_loop_thread() # This wil get filled with an exception if opening fails. self.read_exc = None # Return as soon as the stream is ready! self.running = True self.got_caps = False self.pipeline.set_state(Gst.State.PLAYING) self.ready_sem.acquire() if self.read_exc: # An error occurred before the stream became ready. self.close(True) raise self.read_exc # Gstreamer callbacks. def _notify_caps(self, pad, args): """The callback for the sinkpad's "notify::caps" signal. """ # The sink has started to receive data, so the stream is ready. # This also is our opportunity to read information about the # stream. self.got_caps = True info = pad.get_current_caps().get_structure(0) # Stream attributes. self.channels = info.get_int('channels')[1] self.samplerate = info.get_int('rate')[1] # Query duration. success, length = pad.get_peer().query_duration(Gst.Format.TIME) if success: self.duration = length / 1000000000 else: self.read_exc = MetadataMissingError('duration not available') # Allow constructor to complete. self.ready_sem.release() _got_a_pad = False def _pad_added(self, element, pad): """The callback for GstElement's "pad-added" signal. """ # Decoded data is ready. Connect up the decoder, finally. name = pad.query_caps(None).to_string() if name.startswith('audio/x-raw'): nextpad = self.conv.get_static_pad('sink') if not nextpad.is_linked(): self._got_a_pad = True pad.link(nextpad) def _no_more_pads(self, element): """The callback for GstElement's "no-more-pads" signal. """ # Sent when the pads are done adding (i.e., there are no more # streams in the file). If we haven't gotten at least one # decodable stream, raise an exception. if not self._got_a_pad: self.read_exc = NoStreamError() self.ready_sem.release() # No effect if we've already started. def _new_sample(self, sink): """The callback for appsink's "new-sample" signal. """ if self.running: # New data is available from the pipeline! Dump it into our # queue (or possibly block if we're full). buf = sink.emit('pull-sample').get_buffer() # We can't use Gst.Buffer.extract() to read the data as it crashes # when called through PyGObject. We also can't use # Gst.Buffer.extract_dup() because we have no way in Python to free # the memory that it returns. Instead we get access to the actual # data via Gst.Memory.map(). mem = buf.get_all_memory() success, info = mem.map(Gst.MapFlags.READ) if success: if isinstance(info.data, memoryview): # We need to copy the data as the memoryview is released # when we call mem.unmap() data = bytes(info.data) else: # GStreamer Python bindings <= 1.16 return a copy of the # data as bytes() data = info.data mem.unmap(info) self.queue.put(data) else: raise GStreamerError("Unable to map buffer memory while reading the file.") return Gst.FlowReturn.OK def _unkown_type(self, uridecodebin, decodebin, caps): """The callback for decodebin's "unknown-type" signal. """ # This is called *before* the stream becomes ready when the # file can't be read. streaminfo = caps.to_string() if not streaminfo.startswith('audio/'): # Ignore non-audio (e.g., video) decode errors. return self.read_exc = UnknownTypeError(streaminfo) self.ready_sem.release() def _message(self, bus, message): """The callback for GstBus's "message" signal (for two kinds of messages). """ if not self.finished: if message.type == Gst.MessageType.EOS: # The file is done. Tell the consumer thread. self.queue.put(SENTINEL) if not self.got_caps: # If the stream ends before _notify_caps was called, this # is an invalid file. self.read_exc = NoStreamError() self.ready_sem.release() elif message.type == Gst.MessageType.ERROR: gerror, debug = message.parse_error() if 'not-linked' in debug: self.read_exc = NoStreamError() elif 'No such file' in debug: self.read_exc = IOError('resource not found') else: self.read_exc = FileReadError(debug) self.ready_sem.release() # Iteration. def next(self): # Wait for data from the Gstreamer callbacks. val = self.queue.get() if val == SENTINEL: # End of stream. raise StopIteration return val # For Python 3 compatibility. __next__ = next def __iter__(self): return self # Cleanup. def close(self, force=False): """Close the file and clean up associated resources. Calling `close()` a second time has no effect. """ if self.running or force: self.running = False self.finished = True # Unregister for signals, which we registered for above with # `add_signal_watch`. (Without this, GStreamer leaks file # descriptors.) self.pipeline.get_bus().remove_signal_watch() # Stop reading the file. self.dec.set_property("uri", None) # Block spurious signals. self.sink.get_static_pad("sink").disconnect(self.caps_handler) # Make space in the output queue to let the decoder thread # finish. (Otherwise, the thread blocks on its enqueue and # the interpreter hangs.) try: self.queue.get_nowait() except queue.Empty: pass # Halt the pipeline (closing file). self.pipeline.set_state(Gst.State.NULL) # Delete the pipeline object. This seems to be necessary on Python # 2, but not Python 3 for some reason: on 3.5, at least, the # pipeline gets dereferenced automatically. del self.pipeline def __del__(self): self.close() # Context manager. def __enter__(self): return self def __exit__(self, exc_type, exc_val, exc_tb): self.close() return False # Smoke test. if __name__ == '__main__': for path in sys.argv[1:]: path = os.path.abspath(os.path.expanduser(path)) with GstAudioFile(path) as f: print(f.channels) print(f.samplerate) print(f.duration) for s in f: print(len(s), ord(s[0])) ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1548005678.0 audioread-2.1.9/audioread/macca.py0000644000076500000240000002522500000000000020006 0ustar00asampsonstaff00000000000000# This file is part of audioread. # Copyright 2011, Adrian Sampson. # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the # "Software"), to deal in the Software without restriction, including # without limitation the rights to use, copy, modify, merge, publish, # distribute, sublicense, and/or sell copies of the Software, and to # permit persons to whom the Software is furnished to do so, subject to # the following conditions: # # The above copyright notice and this permission notice shall be # included in all copies or substantial portions of the Software. """Read audio files using CoreAudio on Mac OS X.""" import os import sys import ctypes import ctypes.util import copy from .exceptions import DecodeError # CoreFoundation and CoreAudio libraries along with their function # prototypes. def _load_framework(name): return ctypes.cdll.LoadLibrary(ctypes.util.find_library(name)) _coreaudio = _load_framework('AudioToolbox') _corefoundation = _load_framework('CoreFoundation') # Convert CFStrings to C strings. _corefoundation.CFStringGetCStringPtr.restype = ctypes.c_char_p _corefoundation.CFStringGetCStringPtr.argtypes = [ctypes.c_void_p, ctypes.c_int] # Free memory. _corefoundation.CFRelease.argtypes = [ctypes.c_void_p] # Create a file:// URL. _corefoundation.CFURLCreateFromFileSystemRepresentation.restype = \ ctypes.c_void_p _corefoundation.CFURLCreateFromFileSystemRepresentation.argtypes = \ [ctypes.c_int, ctypes.c_char_p, ctypes.c_int, ctypes.c_bool] # Get a string representation of a URL. _corefoundation.CFURLGetString.restype = ctypes.c_void_p _corefoundation.CFURLGetString.argtypes = [ctypes.c_void_p] # Open an audio file for reading. _coreaudio.ExtAudioFileOpenURL.restype = ctypes.c_int _coreaudio.ExtAudioFileOpenURL.argtypes = [ctypes.c_void_p, ctypes.c_void_p] # Set audio file property. _coreaudio.ExtAudioFileSetProperty.restype = ctypes.c_int _coreaudio.ExtAudioFileSetProperty.argtypes = \ [ctypes.c_void_p, ctypes.c_uint, ctypes.c_uint, ctypes.c_void_p] # Get audio file property. _coreaudio.ExtAudioFileGetProperty.restype = ctypes.c_int _coreaudio.ExtAudioFileGetProperty.argtypes = \ [ctypes.c_void_p, ctypes.c_uint, ctypes.c_void_p, ctypes.c_void_p] # Read from an audio file. _coreaudio.ExtAudioFileRead.restype = ctypes.c_int _coreaudio.ExtAudioFileRead.argtypes = \ [ctypes.c_void_p, ctypes.c_void_p, ctypes.c_void_p] # Close/free an audio file. _coreaudio.ExtAudioFileDispose.restype = ctypes.c_int _coreaudio.ExtAudioFileDispose.argtypes = [ctypes.c_void_p] # Constants used in CoreAudio. def multi_char_literal(chars): """Emulates character integer literals in C. Given a string "abc", returns the value of the C single-quoted literal 'abc'. """ num = 0 for index, char in enumerate(chars): shift = (len(chars) - index - 1) * 8 num |= ord(char) << shift return num PROP_FILE_DATA_FORMAT = multi_char_literal('ffmt') PROP_CLIENT_DATA_FORMAT = multi_char_literal('cfmt') PROP_LENGTH = multi_char_literal('#frm') AUDIO_ID_PCM = multi_char_literal('lpcm') PCM_IS_FLOAT = 1 << 0 PCM_IS_BIG_ENDIAN = 1 << 1 PCM_IS_SIGNED_INT = 1 << 2 PCM_IS_PACKED = 1 << 3 ERROR_TYPE = multi_char_literal('typ?') ERROR_FORMAT = multi_char_literal('fmt?') ERROR_NOT_FOUND = -43 # Check for errors in functions that return error codes. class MacError(DecodeError): def __init__(self, code): if code == ERROR_TYPE: msg = 'unsupported audio type' elif code == ERROR_FORMAT: msg = 'unsupported format' else: msg = 'error %i' % code super(MacError, self).__init__(msg) def check(err): """If err is nonzero, raise a MacError exception.""" if err == ERROR_NOT_FOUND: raise IOError('file not found') elif err != 0: raise MacError(err) # CoreFoundation objects. class CFObject(object): def __init__(self, obj): if obj == 0: raise ValueError('object is zero') self._obj = obj def __del__(self): if _corefoundation: _corefoundation.CFRelease(self._obj) class CFURL(CFObject): def __init__(self, filename): if not isinstance(filename, bytes): filename = filename.encode(sys.getfilesystemencoding()) filename = os.path.abspath(os.path.expanduser(filename)) url = _corefoundation.CFURLCreateFromFileSystemRepresentation( 0, filename, len(filename), False ) super(CFURL, self).__init__(url) def __str__(self): cfstr = _corefoundation.CFURLGetString(self._obj) out = _corefoundation.CFStringGetCStringPtr(cfstr, 0) # Resulting CFString does not need to be released according to docs. return out # Structs used in CoreAudio. class AudioStreamBasicDescription(ctypes.Structure): _fields_ = [ ("mSampleRate", ctypes.c_double), ("mFormatID", ctypes.c_uint), ("mFormatFlags", ctypes.c_uint), ("mBytesPerPacket", ctypes.c_uint), ("mFramesPerPacket", ctypes.c_uint), ("mBytesPerFrame", ctypes.c_uint), ("mChannelsPerFrame", ctypes.c_uint), ("mBitsPerChannel", ctypes.c_uint), ("mReserved", ctypes.c_uint), ] class AudioBuffer(ctypes.Structure): _fields_ = [ ("mNumberChannels", ctypes.c_uint), ("mDataByteSize", ctypes.c_uint), ("mData", ctypes.c_void_p), ] class AudioBufferList(ctypes.Structure): _fields_ = [ ("mNumberBuffers", ctypes.c_uint), ("mBuffers", AudioBuffer * 1), ] # Main functionality. class ExtAudioFile(object): """A CoreAudio "extended audio file". Reads information and raw PCM audio data from any file that CoreAudio knows how to decode. >>> with ExtAudioFile('something.m4a') as f: >>> print f.samplerate >>> print f.channels >>> print f.duration >>> for block in f: >>> do_something(block) """ def __init__(self, filename): url = CFURL(filename) try: self._obj = self._open_url(url) except: self.closed = True raise del url self.closed = False self._file_fmt = None self._client_fmt = None self.setup() @classmethod def _open_url(cls, url): """Given a CFURL Python object, return an opened ExtAudioFileRef. """ file_obj = ctypes.c_void_p() check(_coreaudio.ExtAudioFileOpenURL( url._obj, ctypes.byref(file_obj) )) return file_obj def set_client_format(self, desc): """Get the client format description. This describes the encoding of the data that the program will read from this object. """ assert desc.mFormatID == AUDIO_ID_PCM check(_coreaudio.ExtAudioFileSetProperty( self._obj, PROP_CLIENT_DATA_FORMAT, ctypes.sizeof(desc), ctypes.byref(desc) )) self._client_fmt = desc def get_file_format(self): """Get the file format description. This describes the type of data stored on disk. """ # Have cached file format? if self._file_fmt is not None: return self._file_fmt # Make the call to retrieve it. desc = AudioStreamBasicDescription() size = ctypes.c_int(ctypes.sizeof(desc)) check(_coreaudio.ExtAudioFileGetProperty( self._obj, PROP_FILE_DATA_FORMAT, ctypes.byref(size), ctypes.byref(desc) )) # Cache result. self._file_fmt = desc return desc @property def channels(self): """The number of channels in the audio source.""" return int(self.get_file_format().mChannelsPerFrame) @property def samplerate(self): """Gets the sample rate of the audio.""" return int(self.get_file_format().mSampleRate) @property def duration(self): """Gets the length of the file in seconds (a float).""" return float(self.nframes) / self.samplerate @property def nframes(self): """Gets the number of frames in the source file.""" length = ctypes.c_long() size = ctypes.c_int(ctypes.sizeof(length)) check(_coreaudio.ExtAudioFileGetProperty( self._obj, PROP_LENGTH, ctypes.byref(size), ctypes.byref(length) )) return length.value def setup(self, bitdepth=16): """Set the client format parameters, specifying the desired PCM audio data format to be read from the file. Must be called before reading from the file. """ fmt = self.get_file_format() newfmt = copy.copy(fmt) newfmt.mFormatID = AUDIO_ID_PCM newfmt.mFormatFlags = \ PCM_IS_SIGNED_INT | PCM_IS_PACKED newfmt.mBitsPerChannel = bitdepth newfmt.mBytesPerPacket = \ (fmt.mChannelsPerFrame * newfmt.mBitsPerChannel // 8) newfmt.mFramesPerPacket = 1 newfmt.mBytesPerFrame = newfmt.mBytesPerPacket self.set_client_format(newfmt) def read_data(self, blocksize=4096): """Generates byte strings reflecting the audio data in the file. """ frames = ctypes.c_uint(blocksize // self._client_fmt.mBytesPerFrame) buf = ctypes.create_string_buffer(blocksize) buflist = AudioBufferList() buflist.mNumberBuffers = 1 buflist.mBuffers[0].mNumberChannels = \ self._client_fmt.mChannelsPerFrame buflist.mBuffers[0].mDataByteSize = blocksize buflist.mBuffers[0].mData = ctypes.cast(buf, ctypes.c_void_p) while True: check(_coreaudio.ExtAudioFileRead( self._obj, ctypes.byref(frames), ctypes.byref(buflist) )) assert buflist.mNumberBuffers == 1 size = buflist.mBuffers[0].mDataByteSize if not size: break data = ctypes.cast(buflist.mBuffers[0].mData, ctypes.POINTER(ctypes.c_char)) blob = data[:size] yield blob def close(self): """Close the audio file and free associated memory.""" if not self.closed: check(_coreaudio.ExtAudioFileDispose(self._obj)) self.closed = True def __del__(self): if _coreaudio: self.close() # Context manager methods. def __enter__(self): return self def __exit__(self, exc_type, exc_val, exc_tb): self.close() return False # Iteration. def __iter__(self): return self.read_data() ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1545837521.0 audioread-2.1.9/audioread/maddec.py0000644000076500000240000000466600000000000020165 0ustar00asampsonstaff00000000000000# This file is part of audioread. # Copyright 2011, Adrian Sampson. # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the # "Software"), to deal in the Software without restriction, including # without limitation the rights to use, copy, modify, merge, publish, # distribute, sublicense, and/or sell copies of the Software, and to # permit persons to whom the Software is furnished to do so, subject to # the following conditions: # # The above copyright notice and this permission notice shall be # included in all copies or substantial portions of the Software. """Decode MPEG audio files with MAD (via pymad).""" import mad from . import DecodeError class UnsupportedError(DecodeError): """The file is not readable by MAD.""" class MadAudioFile(object): """MPEG audio file decoder using the MAD library.""" def __init__(self, filename): self.fp = open(filename, 'rb') self.mf = mad.MadFile(self.fp) if not self.mf.total_time(): # Indicates a failed open. self.fp.close() raise UnsupportedError() def close(self): if hasattr(self, 'fp'): self.fp.close() if hasattr(self, 'mf'): del self.mf def read_blocks(self, block_size=4096): """Generates buffers containing PCM data for the audio file. """ while True: out = self.mf.read(block_size) if not out: break yield bytes(out) @property def samplerate(self): """Sample rate in Hz.""" return self.mf.samplerate() @property def duration(self): """Length of the audio in seconds (a float).""" return float(self.mf.total_time()) / 1000 @property def channels(self): """The number of channels.""" if self.mf.mode() == mad.MODE_SINGLE_CHANNEL: return 1 elif self.mf.mode() in (mad.MODE_DUAL_CHANNEL, mad.MODE_JOINT_STEREO, mad.MODE_STEREO): return 2 else: # Other mode? return 2 def __del__(self): self.close() # Iteration. def __iter__(self): return self.read_blocks() # Context manager. def __enter__(self): return self def __exit__(self, exc_type, exc_val, exc_tb): self.close() return False ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1573436768.0 audioread-2.1.9/audioread/rawread.py0000644000076500000240000001043200000000000020361 0ustar00asampsonstaff00000000000000# This file is part of audioread. # Copyright 2011, Adrian Sampson. # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the # "Software"), to deal in the Software without restriction, including # without limitation the rights to use, copy, modify, merge, publish, # distribute, sublicense, and/or sell copies of the Software, and to # permit persons to whom the Software is furnished to do so, subject to # the following conditions: # # The above copyright notice and this permission notice shall be # included in all copies or substantial portions of the Software. """Uses standard-library modules to read AIFF, AIFF-C, and WAV files.""" import wave import aifc import sunau import audioop import struct import sys from .exceptions import DecodeError # Produce two-byte (16-bit) output samples. TARGET_WIDTH = 2 # Python 3.4 added support for 24-bit (3-byte) samples. if sys.version_info > (3, 4, 0): SUPPORTED_WIDTHS = (1, 2, 3, 4) else: SUPPORTED_WIDTHS = (1, 2, 4) class UnsupportedError(DecodeError): """File is not an AIFF, WAV, or Au file.""" class BitWidthError(DecodeError): """The file uses an unsupported bit width.""" def byteswap(s): """Swaps the endianness of the bytestring s, which must be an array of shorts (16-bit signed integers). This is probably less efficient than it should be. """ assert len(s) % 2 == 0 parts = [] for i in range(0, len(s), 2): chunk = s[i:i + 2] newchunk = struct.pack('h', chunk)) parts.append(newchunk) return b''.join(parts) class RawAudioFile(object): """An AIFF, WAV, or Au file that can be read by the Python standard library modules ``wave``, ``aifc``, and ``sunau``. """ def __init__(self, filename): self._fh = open(filename, 'rb') try: self._file = aifc.open(self._fh) except aifc.Error: # Return to the beginning of the file to try the next reader. self._fh.seek(0) else: self._needs_byteswap = True self._check() return try: self._file = wave.open(self._fh) except wave.Error: self._fh.seek(0) pass else: self._needs_byteswap = False self._check() return try: self._file = sunau.open(self._fh) except sunau.Error: self._fh.seek(0) pass else: self._needs_byteswap = True self._check() return # None of the three libraries could open the file. self._fh.close() raise UnsupportedError() def _check(self): """Check that the files' parameters allow us to decode it and raise an error otherwise. """ if self._file.getsampwidth() not in SUPPORTED_WIDTHS: self.close() raise BitWidthError() def close(self): """Close the underlying file.""" self._file.close() self._fh.close() @property def channels(self): """Number of audio channels.""" return self._file.getnchannels() @property def samplerate(self): """Sample rate in Hz.""" return self._file.getframerate() @property def duration(self): """Length of the audio in seconds (a float).""" return float(self._file.getnframes()) / self.samplerate def read_data(self, block_samples=1024): """Generates blocks of PCM data found in the file.""" old_width = self._file.getsampwidth() while True: data = self._file.readframes(block_samples) if not data: break # Make sure we have the desired bitdepth and endianness. data = audioop.lin2lin(data, old_width, TARGET_WIDTH) if self._needs_byteswap and self._file.getcomptype() != 'sowt': # Big-endian data. Swap endianness. data = byteswap(data) yield data # Context manager. def __enter__(self): return self def __exit__(self, exc_type, exc_val, exc_tb): self.close() return False # Iteration. def __iter__(self): return self.read_data() ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1603192910.0 audioread-2.1.9/audioread/version.py0000644000076500000240000000134200000000000020421 0ustar00asampsonstaff00000000000000# This file is part of audioread. # Copyright 2017, Adrian Sampson. # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the # "Software"), to deal in the Software without restriction, including # without limitation the rights to use, copy, modify, merge, publish, # distribute, sublicense, and/or sell copies of the Software, and to # permit persons to whom the Software is furnished to do so, subject to # the following conditions: # # The above copyright notice and this permission notice shall be # included in all copies or substantial portions of the Software. """Version data for the audioread package.""" version = '2.1.9' short_version = '2.1' ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1603192959.1229007 audioread-2.1.9/audioread.egg-info/0000755000076500000240000000000000000000000020054 5ustar00asampsonstaff00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1603192959.0 audioread-2.1.9/audioread.egg-info/PKG-INFO0000644000076500000240000002230500000000000021153 0ustar00asampsonstaff00000000000000Metadata-Version: 1.1 Name: audioread Version: 2.1.9 Summary: multi-library, cross-platform audio decoding Home-page: https://github.com/sampsyo/audioread Author: Adrian Sampson Author-email: adrian@radbox.org License: MIT Description: audioread ========= .. image:: https://secure.travis-ci.org/beetbox/audioread.png :target: https://travis-ci.org/beetbox/audioread/ Decode audio files using whichever backend is available. The library currently supports: - `Gstreamer`_ via `PyGObject`_. - `Core Audio`_ on Mac OS X via `ctypes`_. (PyObjC not required.) - `MAD`_ via the `pymad`_ bindings. - `FFmpeg`_ or `Libav`_ via its command-line interface. - The standard library `wave`_, `aifc`_, and `sunau`_ modules (for uncompressed audio formats). .. _Gstreamer: http://gstreamer.freedesktop.org/ .. _gst-python: http://gstreamer.freedesktop.org/modules/gst-python.html .. _Core Audio: http://developer.apple.com/technologies/mac/audio-and-video.html .. _ctypes: http://docs.python.org/library/ctypes.html .. _MAD: http://www.underbit.com/products/mad/ .. _pymad: http://spacepants.org/src/pymad/ .. _FFmpeg: http://ffmpeg.org/ .. _Libav: https://www.libav.org/ .. _wave: http://docs.python.org/library/wave.html .. _aifc: http://docs.python.org/library/aifc.html .. _sunau: http://docs.python.org/library/sunau.html .. _PyGObject: https://pygobject.readthedocs.io/ Use the library like so:: with audioread.audio_open(filename) as f: print(f.channels, f.samplerate, f.duration) for buf in f: do_something(buf) Buffers in the file can be accessed by iterating over the object returned from ``audio_open``. Each buffer is a bytes-like object (``buffer``, ``bytes``, or ``bytearray``) containing raw **16-bit little-endian signed integer PCM data**. (Currently, these PCM format parameters are not configurable, but this could be added to most of the backends.) Additional values are available as fields on the audio file object: - ``channels`` is the number of audio channels (an integer). - ``samplerate`` is given in Hz (an integer). - ``duration`` is the length of the audio in seconds (a float). The ``audio_open`` function transparently selects a backend that can read the file. (Each backend is implemented in a module inside the ``audioread`` package.) If no backends succeed in opening the file, a ``DecodeError`` exception is raised. This exception is only used when the file type is unsupported by the backends; if the file doesn't exist, a standard ``IOError`` will be raised. A second optional parameter to ``audio_open`` specifies which backends to try (instead of trying them all, which is the default). You can use the ``available_backends`` function to get a list backends that are usable on the current system. Audioread is "universal" and supports both Python 2 (2.6+) and Python 3 (3.2+). Example ------- The included ``decode.py`` script demonstrates using this package to convert compressed audio files to WAV files. Version History --------------- 2.1.9 Work correctly with GStreamer 1.18 and later (thanks to @ssssam) 2.1.8 Fix an unhandled ``OSError`` when FFmpeg is not installed. 2.1.7 Properly close some filehandles in the FFmpeg backend (thanks to @RyanMarcus and @ssssam). The maddec backend now always produces bytes objects, like the other backends (thanks to @ssssam). Resolve an audio data memory leak in the GStreamer backend (thanks again to @ssssam). You can now optionally specify which specific backends ``audio_open`` should try (thanks once again to @ssssam). On Windows, avoid opening a console window to run FFmpeg (thanks to @flokX). 2.1.6 Fix a "no such process" crash in the FFmpeg backend on Windows Subsystem for Linux (thanks to @llamasoft). Avoid suppressing SIGINT in the GStreamer backend on older versions of PyGObject (thanks to @lazka). 2.1.5 Properly clean up the file handle when a backend fails to decode a file. Fix parsing of "N.M" channel counts in the FFmpeg backend (thanks to @piem). Avoid a crash in the raw backend when a file uses an unsupported number of bits per sample (namely, 24-bit samples in Python < 3.4). Add a ``__version__`` value to the package. 2.1.4 Fix a bug in the FFmpeg backend where, after closing a file, the program's standard input stream would be "broken" and wouldn't receive any input. 2.1.3 Avoid some warnings in the GStreamer backend when using modern versions of GLib. We now require at least GLib 2.32. 2.1.2 Fix a file descriptor leak when opening and closing many files using GStreamer. 2.1.1 Just fix ReST formatting in the README. 2.1.0 The FFmpeg backend can now also use Libav's ``avconv`` command. Fix a warning by requiring GStreamer >= 1.0. Fix some Python 3 crashes with the new GStreamer backend (thanks to @xix-xeaon). 2.0.0 The GStreamer backend now uses GStreamer 1.x via the new gobject-introspection API (and is compatible with Python 3). 1.2.2 When running FFmpeg on Windows, disable its crash dialog. Thanks to jcsaaddupuy. 1.2.1 Fix an unhandled exception when opening non-raw audio files (thanks to aostanin). Fix Python 3 compatibility for the raw-file backend. 1.2.0 Add support for FFmpeg on Windows (thanks to Jean-Christophe Saad-Dupuy). 1.1.0 Add support for Sun/NeXT `Au files`_ via the standard-library ``sunau`` module (thanks to Dan Ellis). 1.0.3 Use the rawread (standard-library) backend for .wav files. 1.0.2 Send SIGKILL, not SIGTERM, to ffmpeg processes to avoid occasional hangs. 1.0.1 When GStreamer fails to report a duration, raise an exception instead of silently setting the duration field to None. 1.0.0 Catch GStreamer's exception when necessary components, such as ``uridecodebin``, are missing. The GStreamer backend now accepts relative paths. Fix a hang in GStreamer when the stream finishes before it begins (when reading broken files). Initial support for Python 3. 0.8 All decoding errors are now subclasses of ``DecodeError``. 0.7 Fix opening WAV and AIFF files via Unicode filenames. 0.6 Make FFmpeg timeout more robust. Dump FFmpeg output on timeout. Fix a nondeterministic hang in the Gstreamer backend. Fix a file descriptor leak in the MAD backend. 0.5 Fix crash when FFmpeg fails to report a duration. Fix a hang when FFmpeg fills up its stderr output buffer. Add a timeout to ``ffmpeg`` tool execution (currently 10 seconds for each 4096-byte read); a ``ReadTimeoutError`` exception is raised if the tool times out. 0.4 Fix channel count detection for FFmpeg backend. 0.3 Fix a problem with the Gstreamer backend where audio files could be left open even after the ``GstAudioFile`` was "closed". 0.2 Fix a hang in the GStreamer backend that occurs occasionally on some platforms. 0.1 Initial release. .. _Au files: http://en.wikipedia.org/wiki/Au_file_format Et Cetera --------- ``audioread`` is by Adrian Sampson. It is made available under `the MIT license`_. An alternative to this module is `decoder.py`_. .. _the MIT license: http://www.opensource.org/licenses/mit-license.php .. _decoder.py: http://www.brailleweb.com/cgi-bin/python.py Platform: ALL Classifier: Topic :: Multimedia :: Sound/Audio :: Conversion Classifier: Intended Audience :: Developers Classifier: Programming Language :: Python :: 2 Classifier: Programming Language :: Python :: 2.6 Classifier: Programming Language :: Python :: 2.7 Classifier: Programming Language :: Python :: 3 Classifier: Programming Language :: Python :: 3.2 Classifier: Programming Language :: Python :: 3.3 Classifier: Programming Language :: Python :: 3.4 Classifier: Programming Language :: Python :: 3.5 Classifier: Programming Language :: Python :: 3.6 ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1603192959.0 audioread-2.1.9/audioread.egg-info/SOURCES.txt0000644000076500000240000000103000000000000021732 0ustar00asampsonstaff00000000000000LICENSE MANIFEST.in README.rst decode.py setup.cfg setup.py audioread/__init__.py audioread/exceptions.py audioread/ffdec.py audioread/gstdec.py audioread/macca.py audioread/maddec.py audioread/rawread.py audioread/version.py audioread.egg-info/PKG-INFO audioread.egg-info/SOURCES.txt audioread.egg-info/dependency_links.txt audioread.egg-info/pbr.json audioread.egg-info/top_level.txt test/conftest.py test/test_audioread.py test/data/test-1.json test/data/test-1.mp3 test/data/test-2.json test/data/test-2.mp3 test/data/test-2.mp3.wav././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1603192959.0 audioread-2.1.9/audioread.egg-info/dependency_links.txt0000644000076500000240000000000100000000000024122 0ustar00asampsonstaff00000000000000 ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1465760133.0 audioread-2.1.9/audioread.egg-info/pbr.json0000644000076500000240000000005700000000000021534 0ustar00asampsonstaff00000000000000{"is_release": false, "git_version": "70e51b0"}././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1603192959.0 audioread-2.1.9/audioread.egg-info/top_level.txt0000644000076500000240000000001200000000000022577 0ustar00asampsonstaff00000000000000audioread ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1477771633.0 audioread-2.1.9/decode.py0000644000076500000240000000336400000000000016230 0ustar00asampsonstaff00000000000000# This file is part of audioread. # Copyright 2011, Adrian Sampson. # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the # "Software"), to deal in the Software without restriction, including # without limitation the rights to use, copy, modify, merge, publish, # distribute, sublicense, and/or sell copies of the Software, and to # permit persons to whom the Software is furnished to do so, subject to # the following conditions: # # The above copyright notice and this permission notice shall be # included in all copies or substantial portions of the Software. """Command-line tool to decode audio files to WAV files.""" from __future__ import print_function import audioread import sys import os import wave import contextlib def decode(filename): filename = os.path.abspath(os.path.expanduser(filename)) if not os.path.exists(filename): print("File not found.", file=sys.stderr) sys.exit(1) try: with audioread.audio_open(filename) as f: print('Input file: %i channels at %i Hz; %.1f seconds.' % (f.channels, f.samplerate, f.duration), file=sys.stderr) print('Backend:', str(type(f).__module__).split('.')[1], file=sys.stderr) with contextlib.closing(wave.open(filename + '.wav', 'w')) as of: of.setnchannels(f.channels) of.setframerate(f.samplerate) of.setsampwidth(2) for buf in f: of.writeframes(buf) except audioread.DecodeError: print("File could not be decoded.", file=sys.stderr) sys.exit(1) if __name__ == '__main__': decode(sys.argv[1]) ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1603192959.1299078 audioread-2.1.9/setup.cfg0000644000076500000240000000007700000000000016252 0ustar00asampsonstaff00000000000000[aliases] test = pytest [egg_info] tag_build = tag_date = 0 ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1567298501.0 audioread-2.1.9/setup.py0000644000076500000240000000356500000000000016150 0ustar00asampsonstaff00000000000000# This file is part of audioread. # Copyright 2013, Adrian Sampson. # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the # "Software"), to deal in the Software without restriction, including # without limitation the rights to use, copy, modify, merge, publish, # distribute, sublicense, and/or sell copies of the Software, and to # permit persons to whom the Software is furnished to do so, subject to # the following conditions: # # The above copyright notice and this permission notice shall be # included in all copies or substantial portions of the Software. import os from setuptools import setup import imp version = imp.load_source('audioread.version', 'audioread/version.py') def _read(fn): path = os.path.join(os.path.dirname(__file__), fn) return open(path).read() setup(name='audioread', version=version.version, description='multi-library, cross-platform audio decoding', author='Adrian Sampson', author_email='adrian@radbox.org', url='https://github.com/sampsyo/audioread', license='MIT', platforms='ALL', long_description=_read('README.rst'), packages=['audioread'], tests_require=[ 'pytest-runner', 'pytest' ], classifiers=[ 'Topic :: Multimedia :: Sound/Audio :: Conversion', 'Intended Audience :: Developers', 'Programming Language :: Python :: 2', 'Programming Language :: Python :: 2.6', 'Programming Language :: Python :: 2.7', 'Programming Language :: Python :: 3', 'Programming Language :: Python :: 3.2', 'Programming Language :: Python :: 3.3', 'Programming Language :: Python :: 3.4', 'Programming Language :: Python :: 3.5', 'Programming Language :: Python :: 3.6', ], ) ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1603192959.1241474 audioread-2.1.9/test/0000755000076500000240000000000000000000000015404 5ustar00asampsonstaff00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1547330687.0 audioread-2.1.9/test/conftest.py0000644000076500000240000000332300000000000017604 0ustar00asampsonstaff00000000000000# This file is part of audioread. # Copyright 2018, Sam Thursfield # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the # "Software"), to deal in the Software without restriction, including # without limitation the rights to use, copy, modify, merge, publish, # distribute, sublicense, and/or sell copies of the Software, and to # permit persons to whom the Software is furnished to do so, subject to # the following conditions: # # The above copyright notice and this permission notice shall be # included in all copies or substantial portions of the Software. import json import os import pytest @pytest.fixture() def audiofile(request): """Fixture that provides an AudiofileSpec instance.""" spec_path = os.path.join(DATADIR, request.param + '.json') with open(spec_path, 'r') as f: spec = json.load(f) result = AudiofileSpec(**spec) return result # The audiofiles used for testing live in the data/ directory. They are defined # by .json files and each one must be listed here by name. TEST_AUDIOFILES = ['test-1', 'test-2'] DATADIR = os.path.join(os.path.dirname(__file__), 'data') class AudiofileSpec(): """Defines the expected attributes for a test audiofile.""" def __init__(self, filename, duration, channels, samplerate): self.path = os.path.join(DATADIR, filename) self.duration = duration self.channels = channels self.samplerate = samplerate def pytest_generate_tests(metafunc): """Parametrize the audiofile() fixture using TEST_AUDIOFILES.""" if 'audiofile' in metafunc.fixturenames: metafunc.parametrize("audiofile", TEST_AUDIOFILES, indirect=True) ././@PaxHeader0000000000000000000000000000003300000000000011451 xustar000000000000000027 mtime=1603192959.126491 audioread-2.1.9/test/data/0000755000076500000240000000000000000000000016315 5ustar00asampsonstaff00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1547330687.0 audioread-2.1.9/test/data/test-1.json0000644000076500000240000000014300000000000020323 0ustar00asampsonstaff00000000000000{ "filename": "test-1.mp3", "duration": 15.0, "channels": 1, "samplerate": 22050 } ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1547330687.0 audioread-2.1.9/test/data/test-1.mp30000644000076500000240000017015300000000000020062 0ustar00asampsonstaff00000000000000ID3vTIT2Simply JuvenileTPE1AbBabyTALBSinCosTDRC2008TRCK13TCON13COMM XXXI am for simple MP3 testingTCOMAbTCOPnone@SD8|K /p `I'&x0p,8h$&/1x Dq$`r B @8NNrC\$My>n\4i7SNdPЈ&Oh4͘q$@  (,p=H!HBN&*!>Vj&^=N9E.,TkVPi QeMFEGᨔZ6z&BڄaagnX3LguvJ|9Qsݜ=oE+sR˼$φpX&u(ݟLV0C ŸB$ tqU R-@ژyQ*ϑNيW \{+NFٻ7;Y!*lo7We"co= E& Xs3$\W*_BLI}(D՝*2b3~P?x3$ݿZ;tQ^WʵEG2\n1.@~-s5 ]Z4-rD@8`TwU|pl D /B \=[(]..H4P(>nJyd*l\ Aе9B' 0A SB6yH]ckRwl~322imrL*yx:HB Qm-TFD3= ŻRRK-P@@HDtV^@)U M*8baM(B BUĪ3ZFX_ff!=Zyw(s 0;BKZHEXE NKC]F"73J p,@v72@Ă޽D{%Aya JAI J pC@@j Š2~`ew2:cO۲=oJNF >M(B]iĠF2FFe{F$̴9R>V{z1dx觾 0&i$]#;m)&9@k!IӒ\T[VRhs`'ˆh7E#@IsyB)UQƴr)VIZ Ѧ$]"IHF؍B}).D1`udLn*C,0Ң^/lSDC@m=dǨ"g &ϙtGZKjɳm%+ޚTGPԍSHJ@ĈҼzL PNH &LbL>ȱ'XSy.I@ LdL}CZzJ`-FƍOKTDc-^ۘ>B}aœxgIHP-6&ԱO -k l: ]=r8vOń?Ki=Vژ4`}R2qI`@Ā2L@gs\fR 'PK VI=!pM&S=:{>^C1#W]֜+J9b~F>k*2 BďI?lrG }a| f 9Bpu&wS@%au/tľնUGO܌ z I1hHdwj}4>gyA͸vN˖_1k"9D BħⲽFaeWyGrmڍc4,A`wb&ʳpN8u6#I*}NL"i\:aU >Z1@ě 61<$QIZ4.e>,K<4*}/FD*rӲQ}ڻ]: ϙwgE}G`JK͗L 4FBĥ~0dxR)ObH4BQ0lȻ}`E=!>j)#@ u(&dMXJ3s^}=žoܥAp@ĮBVH8yg!Nf]j 'U(2jt4ѻ7RKJl6Q HJk.w` Sa 4򗞄3,bBĸȢzLT#hX0"Ɇ.5Mc:% Hc GjjL3QRbU#I5bnU xFH@Ĩj LVd!`*n(2 s060AJ~ |(!-W!̽]KF>@V:*&)xa87}Bij >Hpڴ0>7%P HM3i1LӢyZvyR4\w} dMΙ{+O\^rnAw̡nws'?<OɊ@ľIJHFH`W.x$CJDt$wJVTN& z\).d`6S(DY<Ħ ̖Xu8B`Fl *sJ4A*G([.zzF5)+z#`wSa)9ŝB"*VT!樹[wA^Y@ľFai%HDhaĽ f-OW@`FP{ Q Vf$x[\I`NJPIHvlDh^E)Z$)w\J ^bԭQ.Yv(Bau/XŒHԄiMgeQd8,4JӀk>qkDeTYZHh dsz! *Kj@rfܢIqK2R}fPX}!+H+Mp=k2w lTxDG/UGfBx0p5En b'!@RHymLam2&ԇL0($m[lƞFZvI\t"Дɑ3(dC%!g&v 灢 mB1R@@Fgao^1,Q˾_~ut+r>7U*wh{*@(X8puT0Sw‘ UN-y[)@a eb`pN֪.?]s:MUZ)#ߺPWn ,<B J2CδNYCfPo'_}5oRVnkH-ҾF[SȂͳX`!j4/C@2;@BLBmS=avrz6%g>9V ۧj/0^~ͻ>'-Ĺ[͛E-eBLCK5vMBֶCOt؎F^`a7\uT[j^C ,&"=Ǽ#e{5h E^Xr8҉YQ*:NC@k 3TbIM[ {e9DT-w{0)4؂MՒS--u'eGOJb;/SSB–@cEi6_>EN3EGN$@AEf:W(̽)d%HYƑvZ  m{O˥_55`΅*GR+: tB"1cK.e".zzTBi;-5]NuBr 7rܼEa\C~$`V ůUt\@cɆy-H5Pa3B܎Q>pj2BqRη '%2DV<ݵRϤQ`_W[:{B*Xh quߵm=R n7jb,\.m]D5cljnjLJ<>kPg6UjLhB(&93@'xs* 6ԝ, ]J)qɚik`' 4:cAYV4HH𺞯A4T8]H,HQkSPx렒Bģ0Xќ)e`s#p^s=)>!rDcppxrv 98sƖWG8]w<ق2rA?."@įdy Ě=; ӊr#[9[˳mU䭁jkjxDw44MA|<%iµV'[W(]- ̦*BľТy^yb6 {W~6j:;iA(%Elrp W*pM의m7~p3$ t$FԑRz"46Ȉg2@yy|āy\v*U03-H"k^UQ_iרY!|e&`Ik9.ԒI=N"M0IԏsEBzF"P%%O]]Fyud L{j:NaD8Ev?;N[gS<CƧ|ĿP<ɹe@A Wvz{*b03Endtcʟ 1R&B$ o9JM÷yy$|(l:DJ5t!ta(@BrFhO`t6ݙ̹*t0e^vfSφ Í5{jl/ŵkH^y@zӛBcPa;J2Mjy=JX#BNaeS"JnH1Qu)}ԄaP}q4_S*~tB.y-tZZ}#C:GOg"g !JKW3(%0P1zR=]n󌿈7 MUGʄӔ@@E3wP ?UoA m԰aK-+ VRuUBS0s? $5{%ohDҫ.3B&JyΞq2ӡr3ȍLXj~, y~0kIBnf:udf5AԾ冬mJ)ӹIrJ9C^LFY1%g(@ݖY,VE+@x8ӪԖ6jQ[_4clO]Q,.:Bڽ&w+0$(* y%U=6elv>BfXKamtr2|7~i5 uT7EZwY+:[/@"dNq3w*Z>КD OV78-@ryjUO(0wj ʂ0o:A @nz}0œBP|<Ż*Tb4){: Z!P$A+ 63!uVGg\ˣI. -Իxדj#& WBbZՎiGD,*]3_+!*έȦR=Zt3wdepOБ -V%ńCW36;\! E[Vdy;ND\@r.`mLeGsrIws7!a@ g=,  `CMKVa"j >BٶzD7朙K)>g-EmytUCat*8ģ ԯ=H+  P^¾Q|ڔXCoXR*ؘ3 +&t ]@J6`BF 9/3U2cG\ܹۚt7CO &wz~TC-*NbLC966+7bo:T/BBFFy_DG뙟w' 䡽U* T+Պ-:NlU(,XJ$Up~%]޴w*Ma-KM@xHQU}ouc~JQV Բ&:5&E ' y>e͡\tS MW^5K[Z} P2BZaU[GZ=Dj=v)/t/N eJӉ*\6"?ML.| FR 宀,:5;|n0 c@1ܢzNM:fd /+sE;8ZC|y|p3N|@4qE}^YBHK7ɶ4}dhB:ykRFlCOrb!L5{ (Jܯ5Lt2_kv%y"Z JeD:it;@yF\ ֡h* ]-G*?>ڲh+ܣ~;Ꜥ)ފQA+4@fNɩ(bIY @ņ}./3:HByFW@zz e2!&RhB;~Fw=5N|z&!G5˴Q0\azI}ty+f@T{ +T9[̥퍤]HJBfQiZ%+`ȤSod5sV\>ͶiH\^ wWs"jىqJbA!LBxtA$~a9zw~8aˤZUSVfWl6|ߦLmqEM阅@+ZE McSu|b@ CzLl`IP0ZD>bYY}UaڶzUrY/9]1a6zKm}J0RF\+,k<_sѵ# վ@fIksGTb;jq6PC)Jan(>I$S*:; s 0b(Q,?+ D/@UXDBaBZVbJt GGz+tDnE1Ttn2v@mj ϭZcAQa"Kc;}*gT*@Z 09Mf!5Lgv<:+%Ku4QA@Oa@KY "lg"FZCƷX_;Bq6aKc{Z1:xQ@՝9iP|{RL ~MI/WpB- ,UlgzCS›M8@Į|VcI*-fÃ4ȮT$\`jjHRdTxy2RnIU:Jgp$An,z#U+!c7XΙDB0&\? }x.%~Bxd^L5WvOU}g V9L4çŋ>KOFp>^9]K:;{Y?-W!>BājXD҆nuwQDgh 2_X#Y(SlUwx y-N@ċ.yDx /M xbab9&e*NՎ{$:c̅b6Uy(CSy.[5nr'z7BĕvxĤVLw#ͪ5*JyY@ŒSEIGQ_[l̫ez!rnr1=K/e Pz]u@ġyM !30GH|DsywCwzjH?m`;vMX6}hhbR0JޭA!V >Ξ~J)q69Bĩ:bz T r Ayl7v jo "1H~HP̍)dc\ۺD% !Uc@Ĵ1 ТzD\<;/sZ=AF3xg:,*ʍ:OMP:U~^eaنϵ{r~3^Z;MkkpGBľOv%B߼bt.ƎRL~7D u[bh5ZX//h be'ng.ԱJ**@)x˩shoUXջMy!m&HPֳEM`('AB!i\'@3jDGYH*mGIE@ĞzNPJ>:ll8"zT26%D\MJ.Fv*&g\ Tnȑ~rBĩ Fd5e$>A8mqYpGl}GVjg )ɪ1=BļN8 w豍k|pCX7 )&NWphZFBHvH=.qbiĝ28.Ąذ}UnTN)F d-۴G2gz}m}JODm$n^.jmέ~˴ʀh@S6b d+`8ZDܰ9G?Ρ!yn'p::55tV^g u17{}s{6O}a6ئ6jB_iNzE#]$@u.obq?[у_څ+iDiٳetzEp5Tjr se llB1##P?(@mYzʔ9ߐ":A>cA>wϸ ϔ(ᅍ~q)˞I"ةAUVT[,m"x w7D1FBvԢIF:ǒp0qĂ!\$>]1āEq@Eh`hOEVh~P<>TX7pn/:a ibơLK㐹@ą4&v3bRJX[0oL\3¢5[y2IdКD#XM0J cP'ϕc) YYAj$fԡVBYzL\hSD88dK8UQw%ͪF-wD^t=]Z_FǛN7i;;OvFXJÀx/4Q@ zF>42f1=!4ƦJ*2fh8rq2֔G9Q(iJ;ٚ7]#!GhP8J݁A3=~`>BzD\ zv.+d%[29ЏJ2zlgc;*%c]Tj҄29"M/¯J)@'*^ XTeQZ}Pu՟Yn_}_E"a$ٲ`RFzɴ3JICtQW۴^r+! /f@1 D\;3{Jp$SݮFHth?jPqq3"ƛQT_3JBq %jGkQ XgՋB=D84dGNv(wA`bS^g.SLұ O֤~>sf1smljj/퇦C Y&FrS@JN8k^!2&ʕsD)4V<~E)SI'7xHȅ@56 C `b~ˤuɧ/Z?B0BV( 8fU !^tC.̮ѽL?l9 Qbq:oLN,*h 8tkuosM*Vbu6j'F!Szɪ@a){Te!4M>CD`VSi{U4j'[~\Rdi .+aa DP0HKi,ڶtiU^BzFU+ꢔn&?󆴸)~ywLJ~Rɞ~y[?7oꅀ# E0FL 9%qfH>tMT@ɊIƹj2nmBM//O;)7m=~*f_1YQ>_+/oET2'wW,X+5&x/M7$LΎ'BR~HD\J&ڙ3Yt(췎۳9UYNt6QE/eH*0@zbHK7ay3-e^8:SY@%I`İSR'"%hVcVϼ:YG͢Ib=dI0J@?.s'`]iBA&+B-hHB1B2a̋_Dt< vz/Hʇp\E*2`}N@H홟UHgډ]'TTt W堟KpOLM2@=zDp嘛Pq*d2l}X<1̈́} =ǶhcҒj@!g :_J Ȗ2X_`zLelQf?BBHV`BL7& ԍP}{wb;eDR?3pC_S('40"8l,d@OBH1 @S9yT!#ON &K' Jrj&N([@HF716\sNfR 0$qԁB]+K)AfR^U(6B]EAT\(&9O_ +q&Nn"&L\ Ӗչ(_mZ@ 1vyphdqV^X;bPnX(G(-;Ё0jDf娼Kmm&f18c.Y=CIVQ\ͽtƩ|MvB@0QN<ԿS߲jbl 7ˏ엯V##j73%F9xYYbT{'B=" q b ԕTG\UZG ]54"`w aTxDkBY񲁵];VBā!ӡȌ' `XKBKf7ǎ+B.kf{BKIoQB,M $]5ɥ1(BxuFO`@P~ѸxMMLVC^4sL̕hnGn' 'E<@Xb e4l2hpu_WIֻu`umn0sikU:^_bKk`ﴎ=b~wj>R^ke$mx.]]BdcP)g5 aha5icӢaY #= n잱9~p ӨD `)|?Zi^S/:%el9@\|@tqL8 Zz6FK([#IT lS0fc$?-P>ǕZ \Ȇ, Ӄ p=G߿VDBā0;-xqH*Pօ]{^; !^/nMhPVÎ^&!qD^[FbPsz'`r@) 0eyngF By* hX\eY+juډyļ}.Oj}\7RcP \KG[MYPԁI$ϼ`N;{J#Y}o _˂3EOĠL@K9R{ @8(k4 aeN\EێSp2#œ_t ̊jjX?RD, 01?@BUYRa WU5$d&Wd*W9A=TͫBԌSc_S\FFu0$#KE"o@_3&VIpԖÃ/ġA*"1F]_6? Aޟuxigb*VL(RrVo"ӘBmz |r&B:h);HĄF/g/=hh8̹.~jB%>~1d.ǧa15q<Aa fpN@|ZbF]}3;K3*B||:QwmX z ["p\J9xiHM+jMB9TYOWb?̲)u"*5QBm)ZIpcjVBAAMyjZ8arhue7@<‚57k($:n>@Ā:RHD)M_g?)/3zXBZv=$SxK  Р $++|-J]Go1@Ϊ-̏mz#κk[BĊBNz*3_v}K#T%'Zd&1 CҖZ5T޼RuSǶ};w =P&tj C?M*y@ĕj`ʰؕ(lKNɊ8='@=c?=.:e*(J%iήѶMEs.gPnBwmuHBĢaa#;`ܓ ^]g%@*rlo#3_|Ppz!j`f4z?d-B+&a4K@ĬJءqE ̘+\#)lN8Ǥz2?NDa)ߢF[vcŽAX@Gd1g2% :fdt|Bĺiܢb)59ZDm&JեǮ^qz`܎KY]#Xh/ Y 2SE/7}>ve٥ϳs,NPZA9,@!ԣLP˴{eϤޘ7ݘ>)_?c}C96ƿ^4CGh`=o6]<-$bJEI^,vDJUz%Oj@'s`2 @aH$N-N}dIaZءe J$"]x~R+(Bċ1J("ԥvc+'\R}\=ahYjDŽFlTT0q(F8kL9Sս5ih맚RVAJR:@ĖJ\F @\~̤TcPC9_R/JHxЪ+}ϋPQW@`JC/SgjOߞRƞ7EBĢ8a$K<>$nQ`{#4,9fTzVP˧qXβ@qТs9YˆGw?/%,@ĮANxxye=%9dNsBd)(eژ"YbFCVR8y{K;ݧGtyG,s`6Vjjý+OBĸzDj٬(uG۔LqČU&` !? W\7"md2V'w:F$][Q^EQ.EoI1IW4 "ʆHV\C$B*c5᪜ )#+YoӳF6"/3'4>2G3k+.nٻin Fɘp*ADXB`*z`~-%ȝD;LC~~GopdezZyTS#̋k$ʫYuGFC)Y, y2 uey@k9).[ d;:Vjz2ѬȟjQڛ2{7W+v}Y;Q"Hq@ #C5.F1HjjVqoUBuaPY-,{'gv[̳tśw2yY*+Vy@ƘaSйk(512ɦЖaB(dSkͨdr@āIZďc2Uȭ$D$zt䑥*99BUUX+PmYZ.!*/u^)I"ԋVBČi:ȦazS٩VPrh,%1,@{>ltfPp20IC :`yrί3l_&!JUΧ#@Ė–VJ_W{{)P.haN-exTm<؄bVrycĘiڐ:,Q4=#qU:RXBĢL@^یX咗~a7˗x?LܥXWֻ3!Ros:;KS&~ll*Cյ4[{Ϙ@Ĭ69;; J^tHr؋r SO ʯ%3T'/ڑTIѨ1s25uOjԬr(Lb9TqCQnB-iZ(tDb@8me|)Z^bUjXMA"8_4#s7}-iqͬ]Uyp64clmK|![}ތ aW@; y?A[㎑YL)ڞ*h0 !(X2рFꙝ*d޾/O?Y}`vt#ABESIDU6RD. CW#?\w.s:oY\4 :-ON]JϿc@OAz(Ast.%<Ԛ Gc~}u%j"AtBhCx%Ů=_]o yUVJB]zJ\mwn *LWQ͢@hOqXvǂCiWG0ġf7[T~I{+ZeS(&x'@gQN\;`G.+<#{6qgv^eG3U_M%lj 3xvA .0Xn^=ZoQj)V Bta̦zN< vу4_@E#EuV|ԾwT+ &Һ> TEJJEQT͒t(*m"eM$q]ő,@Ă)O(nځE%ļTY8ĬQ}nKAVZǒAOc27)R ['V'0kuBĐ&c/HOj&QfjVd lұ?eu7f3='Gd+G!.iQFdgN2gJJ *@RZ`M>8%B|͉+x"ӫZM^W!?ʄVaIHΆfS3LH2ZފDfDHь I"sB[FvH,[{+܏agΙ25>0}qDe=lw^U2ݽPm#^L.@ $8Zz[ʊ~@gJYDejzŏo9JttusRW.[{2bx) $f\tyNqGF.س4-W >GBsjVIļ}5: ,|U. @TŰPXt0ePz* M58H"#?TGvk9½]]ת)^@}& aF PD CL.uuO.X3Q),mN C}BGtFybѪ`;[_|}J譤 BĈY^VIlv'c)K4y\ہL^t"aO9<!B0U\$'oX|e-~2  qp\@@ĒAZFJXÍ)})ҵr pkVqZ(4*Ȅ<>ٟɚP1/?Fhk3j 7Uyꞣy~P-U*!F1޻5WMc"ދY5C &F@QJVIĨUP )#  pWG R8o@@d0*g9Xb!]e(Jzz 1G;Re8q@{ JPZ ڷOXP]Fd*3[TwU^_0D Lh3ΓByb>[G=!{j1{1-5v!BąiRy1qDNl23nntE \AmmA T!wn)f5 HqF)!4 tQx=<@ďiX8YHJ]ej7Ƨ·I*< _Z~ I7o>TvBĘ* xw%ru6;?jep?z*뢞 :hs*'{#$uwcff\T4֛syD=Ң@IzN8Q@XX \0\eG3.얌seq l5̋`-J+y2ud:\2Sko[^3lUBR.J t-RDÈUȥm /FmPD"/^Eq'Uf>J~DQ&.)nB 7S";G%C0@bNaD^0[`/;hED9*Rwk~pO`ݯ+~Ύ -_֞Cz j(QU^P$ə, 6r!@mJVID [sXvC6ZrB=1$(,N:|c)43Pij Xsc]?U< ;BvZܦ2Fˑ HB !odo&ڶ|(Ǯaxx z{nq'M^Z+*~ ) wԲl}@ăqDac0t}j 5t_i$ M6H:h#O$g(?GԠfVߌGc[';0BĐbJOيqܧO2@: bVt{:Ax Je&9NէJnǫ'7WhiXQ~iF2Ͷ EUm3@Ě#I(;FHI$e/ݩk ߂RـIYZ&%\ozhi|X0\-BĤ$#HJ|ニV2)'‹Ls zQ@럴 =|d@hcj ʀSz?wiXېI@osgTتe 7G) Vah;kʺO55w>U Vd|ʴ,V?QBNt!N*]åڤ/B{ H̥UzIըq!Ĝjzxv 4APdĦqB> (#^8prQfKs *p'؀Ğ~@ĄJ$6B nZ#Z<:Nu1czcPc6e<1Dɧ'b9,Rt) lI)%F`>,~ BĐ|= +Ѝۖo&dyf:FGHNJFkͅ2H`d Z8$P(Hi@ĝN|_U*`GDMءxJ/ZKԔD.~Rj53";QHbHJDG՚܄m#vfW)BdgABĩYNx~lıU0c _p]'y,CMcb&;bFrz+$=O.RD4jP: ș`@ijyT\F[u:XJq_YTByTg(&`O̜a]lj"W<8RUk!=uBXPrL[s0 4Vj"fEKӍ~8k|PRꅯ+mo?͚ڏ62C9 "89Պb@5x臦E֛n[/GEewʋ1mc% `Ny\!ohȅqmɻP]nΡ lSBQz 0pH[n2[t}I;`1Q2l[ӱhÙ:ᓥJ(\JvCJrGθ qR@[XE HvHXOGxqgGS ovy }yֺݲ]Z b0r5"mQ"K(HۯQb[<BlaZJR긧L1~WDkmUROTgD8)0J$] tL :+{_E M\O/ @xRag8/'YK[Y!6Sȅ"rOG 5BE)I8mXS;kW&vVr&r"m-k*R'YsU弗i?κgbgJ3 7I_̦lЁ~Ouye AayI*_ n @WNXFXͤԺ}XrB˛ c7Tˉi>}1-qSޙQ'Q%nHw'k)gm* QTGbPBcQpWX|v||f*%-fu"yFGfl7lpJE=ji.S@Hi s Azg@m S 9m`N?˿Vv{V* u>"*Ca]iEnǚ8Rܼ霢ֻSAc[?8n-VBFҖzJ~hejn֓:Rd0r90mpS))è8> U()MOn' #@R |GKBr9tU]<m6άO- ćyh朞3&SH(PU!H Bu{ 9+I,PeN~^E@O7vVORANQ&QJ9?UV,vwy!)&lEE!EadJ`j@\zvID|0!0;u(,9ߥ]?@LFfr4Sժk}9\HT-{"["J0cCEA L؂R;BfٖYDHiK߰/|vcR9YiEVvIA'2& 9/,4qrU `[/e_ k@pՖHHEa) \Ō,Ҝ3"#s |B{qzH *w^d4JӺr>V2&=aj!a5uR{x]Ǧp_pg+cAjES$QDQ@ąbٖH[X=kt3#ratXrkeܼkw&0ݥ,k.GkQC_ǢzU{yW=BĎμzZ)oAs-筂jHkZaWn9j޸qQgԼuUk@U$z՚{qG";qŽ@ėLPz ˕ x-~x#W0q=T޷t7v_o=.}YRx׷k\SϿrGܙsDe/pVtBģ6 T-,l9yoW#ln?^_UYaSA2:+oH ˤ'tL?w[MV5tGMq@#(R*;Mmʏ[^NGeAʙUsHv^F`Ծ*WHAlH~ma 4gnB-vz\R>T i]rEzi-z;I]QǡFK PaSGlwZ#4o–NҪ5uGbV@= zDciI{ *3B]Bb8V2T7]'*内G5]\.'fr\NZL}Tgӥ-%bU?ebji-jw W.W2˦/@lzĸ KA`;ACp3VG^fR=)_TP\6S!Cf L&x̪bElpfS(! @xX8-FΖ[X0p@멕/GS[},j⣉dE -i N})q8K",E+u4BĂ@b'22˧&@i{fIezkG"yO*y p 5N9o6>6tܻ@ ~'BqjlZm|!@^9 ?hkGSo[?D:$.C\ѓo`M鵾daCS$<%@]U ZZdžu#+ֿBlp6I-vVtAyhPDN 0,QH +:W syr:*HT>t Lwm$J@vpzĨOJAcT8ާ5ֲH>>oOZf* p\P) Z`M)>liR6?Wûh:' oBăIb 3OB[4E8k(z$VڇhB®^>ؘ7pGP=Z1Bzg?Kݫ *Qڷ.WQ2Gm@čIX$ݫ@(E] 'ו~Qkzv`oаd)jOB,x[ˁJ{:JuUAIxUBĘFzD|u RSC{m-'NjxLK&&4CP0a c&{=_ɋ>$#o'SEW-El%% 0@Ĩ9Jжb X 1R.b8AXZTr<e^4N9;?߉G% *g49t[)HT ^$T~##LYBIJyO8'ivCW_Rmg+ep9wy7}QOۘ[)'('/rknEQـwoϼczY9@ļ6{%>w@A$E$1uHb52 Fխ>Jeeͫݺq@hH'ZB=1 H eiU SuV6 >A &wh#.EęJ}u4kHS9y?J1<N)7v@HFy)6kz&WF=LPnHs`Gw"747*Ø;"yH 3Q1I] ^?>[R_r*"BTRaD0r)[K;w-4FxnqO \O* ܿ!} U4ct5)߈>sл00@^xЕ. /h F[qs+ի3J c/Q=3,{g1s*sߥr_:RE>} iE01BhQN\{^b{h5dsEtpRԲ1k׳zeM:oGP;o][ GcTUg!tɢ` zܒ3g @r{pWe mVjBAG%o6qfo_+MΦR{7*P "V®e. 34`dv<-" :(BB}Jby|U{((L;]Grߛڗ׏5+yrflXVtE:blʹKW8Fݝ}AtP ^>ͿdmO@ć[z )ܸ@0 Cz|%p[Cd~B-TC%N/A5^l@ģ(&zY< /#w.Cu|E5췾2Ve?2} Sk~t]9̯V5)bBZ"JD*%)K) ¡AJ8[*yR=iW%J?~D-f`볝u=nYUvE룣~SLlDi!@W68`tmQr{qJ $Т/x.T'T XoHom EcNM*E`> Na CBdJaʼ0衟uӒNnDYUkB1m3 1ښ{xͪAEQ4]Zbu'i=nd[@nZNa|+Hg)| ?)Hˬ(эIhݠ7QShiWUxJHǯ̶ț<Z2'Bw&`PbC/%E(4O\IRvlFN WT!-F+B*RZ,Rͅ @ĄzD|K7_>;TLگ l0}5LD*XG~VR/ffzH+XpkDBꞓmNYB}VzbEMI4]83Bb"R{|= j=l||(e"XtOeoVB|nXۿ~mK5+,-ԇ@1Ϳ=)!XbQ58@myDXE<.c}TF4$:v_$8 ozf9K5{k{f#3WϫZByAP0ړE`IOG8o?NU0L+U+?cŚY?H_ Bn<GNo ͚L@Ĉ aLY˖nz}l>Nb=<^ڂ >b34o; o~G[ ?ٝT_RBē:yX~D Oӭ3D [f5.vƒ>7_ۃҷ9WC[|1%ߤQ8ٝ4F9֘~=LTX@ĞCaD|jg|Tʶ4Jx(U,xnL܌QAQf$e5ե8rJ-Zȗ{'!5J5Gȗsg3ZBĨy8zs(Q39)'`*vذ*J0 2F3YW*w,7{3%[ʍ;3J@ij RzLوnY3N-H#IP+Ķ0,Ul(v,9@PrL1EP$c-PU4?ivqڪ3+&BČJaeꑏOMgcREb׀flcHEQvOflо }(ڎe f-ΦNs}@ĖJP5] umN.4{#YCMh@x ϵY& !@MȌܟZINĀsx;/ /;#BġZܶ`tD'$ Hh2,1 k!nN|à<͑'v,pBy~G}y7Q/a8w@'r6'~}BRm`2A56gL@įqzF\j&]?^ݛ"F_3 :/RweG #6M覆he639LKqݦBļia\u~Zo(@1.oi\n_$r}w q*4by vϸNd S?8aQ0@*6IDxݬ?B# }{@" ɵP>.' :Ux ,pgu ƞ=_q7~} [ƦdiʒCGZk1K9Y;GÌ%$3ċqϙקY̽f!@L(:.XkL5†ŽƵlQ5mcwl&j( C[Q֓5+3?Vi9b#m:@ JL%\B# `fUȀSR .ZGUqu3#%wZw}mܣ/Z̸EX\ Xwlw@ķjܯ(t+zeR}/Y fGP2/8P&ĕޛ6gٔUJSL   Dm@+^zJ1Y|cш@"#ЮȜBq%0QH Xc;rLBgUC{=Z6ؖ蔕mt21g_0 fBĕVahIH|]UH2Dh`,|„2]rȳDDp[*?BU{W Kzd1(@^ TZrq> ;@ġ^HD̊JNyzm ʫ46O@[=V2Xf2Xs'OG$`&y4^o,'nT{EZLj!7pBĬYЦH)CF'3u: 2+z_ ߥG#oa֩h@l1CgQj%ŕ B)j=d:@ĶJaηcIDžү@ʌM}}:n<D Iˈm2{CD\ܢX8n-44JcBaVah.' {^ RNG=;G矻:@0@$cqN@1tCLB|*VL3/J$7y_@VaEbvT&3@d[MˆĴ5U @=d%:}/rZ+hFd=Gc,$;n/׌K+BBFkG^LZ,GNi׿4T9jSQeQ1Vw,MQ5O9z9 @člzY;*WJ Ĕ.r0W/.ᱱPNUs(Q=?foYnT/a]\3_BĘxևdGz e{A u?l+c$PK2ވ iߤC^9oU[?K]Y5&쇪Kza@Ĥ".xʴx B A F'XVd >q'rtbv|rYR2b-7 \?A]{U-<ҼI*`IBįxxfg^˲CqڕȚի=avDcuaߩß꡿ͫ= P"8_:k!:_@ĸ;"z H-i;lj*l8n._ѷ sJpwy/u|P$EW 1MI*&q(XF5OwB3D ]BG$]Y>u&mXHpk}ϝUC}:Z:"μcLJsf(U|ߞb!,j NJNet@)R̦y\rY%cuQ0;! d~R"`Z"/33~PfʩRm"պ-%/2'Mixkͤ=jB'&X<)2kv{ h6\>g) >B,?QR0(dB=g2 ủ aٍw;UJ^%? )@ē# yU[g3mT2B6u]̖q3E'1sq,*[kHۄI;7fQ BYº̀GBĉzԦy,;̓֌G'_]7EA|IM=](~?Wu ө{bv7^,uwS@ēByDbܝ{/>Zt&A$sMrWYo=VӰMi6Vk?/qRFʓ m` -݄T큶ܳ?Aݜ` BġՖaM\@2TŜWLm9n4, e7Z5b.DjK}QYJMڔ&mj8ńΘ1WᶆEa4qa @Īa4ADCyWY TxBZoĤ?5rxoiw`ì2cQJLѠC%6!?OBĹ.yP{6{gDžb ɑ:Tb`ĮRHVQpHa::BB`+@P^!@⻭O| ߛ˱@NzN^RV$ 1"դf?K#5nbbY.ޤA[.冢8r3w:m߱eg+əiMBPO0KZ&UXn1?!h`2_ !Z  Է?*j滬28F;0+p?@1W[Ew@ߜH6GsvBrr^rueM֢ vu1]o˗#ϡ>[Bj iAHb%4 a>& ~sjC&P@|Q`DAt|)}1nGSNިWW7muFV=US* `$*"*8 j>o|C­dBąa)WaiO=3g]5fzl2Z&ŝ)\caf+cM bT=Ϊ4@Q|t"&Fbywߵr@Đvy0KoWnսoC5UERo$l,ƌGR|$yqT /*QN|գWpH/ZѲZȽv) Bě f 0L%UsϗfSR%VZV}?V6s>bh n efNrWFu'"ЫVf>=?Q@Ħ{zDzOg^:i]_:];ޠ D^Yֈ͞ }y#X8 1&;ZH )rphd+zBijk`D2>1ЮZ䅷[6xOzGI|_.\}F|d q'V^>Q {\|\9 N9:Ӫ:<@Ľ)O ' @`<!$c3U8BUDw#|yQeN!8r PH^E.Q+]8J(aB%@z a,>xPP=楥/PVEAz5 *oB9RĮb(k X8BkŅ[=XO: ^Z@ģ@ 2N #Ȑ3XI̊ڭm!ܨ;w̃ htl`PDA)-Uud갼9s1GG BįavJ !F=wSe^K{^{|J$w=8 LP '3)9x#E*Wg"sLPF BQfA2cO'!MK.@ĹQIF5H{W|H]@R7$ۧOSF Jιꔮ '׷ZbUipThwNc);vEpʼ-mDTVB aP`f<81 y6 yX^|iG߀@00CgߒGCH wN(|l-@I8GS̵կTnq|F:z f@ '81b2D/~.2~0wԋڭLq@:ܢb \*p38O.9%?vM@_R6v5sҮkUX2nvq2]GeV&QCLC衭kYBNIE TkDQ;JI)),Y)#6༢qj/ R]nչݬ}lg-:Iu??  @J6IG+E dTf%Z&$%TƋX> Z$s(IMd^HkCOkb$1JdlmB! zLКƻWiKC* jҠՠf=TJ*%HDl𡣵h$Z*S_nŧ;&"6"$eP4$m>1an@ľA D{6iY^VW GۨTmZSa2/.DZXKTU}S}D|!ȡp @gf&B:z8Q `$W<0~x} &{ggX+ξyZ>zT4遹S<7x,+9R)u3LBS4C49@Ibz\-4U3Mv]f?5?ZKGZ@{4m J*v1Ⱦ:n-ϩLy7?0r)HByNpf-U~MzgѿwyOs]a4j)L\ƎDC+aG#@p)t#WwdTuP@zؾyF!QJ^;FR* ՠ:-FwVmZ "KjOM(P:>y3["/dzN zywXyJ1BvyQB3N-gG'ra}\ Of#0([HYn'xE4NhHu2N̆R@P\&K%`p$*-Y L9 Ͷi,ۆ/|wwRJTtؒ}fZB)x*,mhd3g:,C6֫Bnv{ fD}!?~KbEaoڄ Cq7jƕ#;CGS޻ ƙ<^!&!J8JQ;@. &8? cQOaat9=,E訤A&A"1VXgT%T+3@ƓR=)69QIG,aBĈئx,-+-G7_'k=VwWCSG}Dkʒd"7T_YTH K71)͗qYUSi@z2ܦae/zwu -*2|gnh?%:qY21݀f,?h+! :BĄB&zDHYPm/7{[#WMVom"q{ sDrHH p8BD|M)>h>C˽tϯ m3 @ďB`O*.O>zUm"B须L Z kpmy⽇Bę9yp6B= )-KM +8W\Ó_WuV,+JvL -yJɏT3=`hWJKg@Qav@Ĩܢb e=Zݽ)S2uS#Zj EOwUMf7q?voQ]vgFͧxm 9Z;L-5ֽًs19 <H<33?+'/CRj@_khBća 0T<%>v;WTD^Ż{jkry-XYq*FI6SJU .]s?;Ԭ.c@@ĕ Lh=WՉMX(:N(Lǂ=fͥIjORKO.] Ϭ6- (WڝfJbBĠ bTm%WY󎂺*;_VAGޱFOBb]3;+9 7w2evO9 O\*%оfB 4g?$)`ν+Bĸ9f\ -9Cf2ѵ;Smƞ&8utc󚔷 + `阂Y8?@!LKBa C%*T%ESdZFA;PK}e@TI9V `\>Bq\ 珯^/\rj1_bsH+ĵG*d ĵ^QKRб3Bz t+ 6&훓#9/5H))0ȁ3bg J;>$$a0[@eQ zf$FVb[pS@0[&0P=;r;t[% ,*⮵UZ{$499b|yګ>xV$LS, BS+a;y5q}8B|yOԪ mgWgc$~*\:ޣV $$=e BdHĹn6;Dd`SۇoLV0T)uFZzudYF+D-.y:QLm#$AEjLy%'+@mNЮy8RV!fhr?G#tv ͠@5rzJ\ejFVl!5-vջݥHn=gZ;Y& PW{sQ0Fe@}FonzCn1^BBjyE5븺9z;_FzҲx+D8R}Zf\Xw(%a_WuAKEyA[&ّK:gg('@Q-?@Lf\U:2QR|* ):" K@-w$6f!O%~Tѕ!m؄-$6ܠ":`RETBX1zJ4տ 0@ ༫|Kzq}^s0;I >pc_ ?-iX -5(f^赸A@cJ\/]kVƓ;YK 'TŒՙ<^H[#պ39ߩ馦?M+[PC8[}a5J *T6BrXPED-A`fұڬxrS(ΛFt+uzfqwOcF(Yynp}Ynl!4y|EܬRN2@@/x9 ]7bՖ6t2*:OLL:߷v*=ܗg,k/CRO IƦXHo]F[ةC@WRއ_&jNߪ:U^iWUr^x@9X6DI043% l"V!Ηzj!5ypQMB(P.alȈGd)G0fZqVj,v!t48k8Jg,4eDv8J쁗DMYZ}H*C@2 zPʡbj8^<6)>F>: %&p@bkg2C?FX­H!mY( hc]!e~ B<ض {,<ZkST5ڲ DTjJ~h~[)2XuOyi:U%L{wh]IT6]IqʒM68б u@LY^a25 A+H%';#J׮kQ;h Ӏo‘M+'IeZ5+ձQG4Lamk[hMOQRz lBU)by|>c'YPĄ!crS.{_œ2}oYGD] k H}{$GX>t"a)A&#󁜫eg@dȢyxj)U UvZvC9 ZQ"fGQ_T-PGbO4jVZ%n2@G2!)_ԟKڂQHO,8CBqqfO8g MuHmCDc"V 02QsM͂gqH4q)'Ju(ng|ՕbVͬO2_Al< qeۿ@=OA7@,ئz| /sj+t+eImC^]"p2&ZP#PH ǡf/)ڪ(2!GiR+h^̧6يB7zJXk~۽Z,(=bo kb^͖^o=r .joOF)B)lo/I,T뺐Q> =@C{F5D#@KK5 Y5Ɓf.Vw/Jnx qmdՌI2^@DnAT @i ?BN&y9pڜ,w6͂$Qk)''8Ğd&Q9*Ώ"|z6mEThsB26IDhvCXwJ!S_F#⼉%  M;&]WCue8.δw;}p@>6aĘ cUi >ۄASFMή]Px6:2W[@7Q+YTfc+ŕ[]CBIZ6:D DXSÕ$0>.*.6@=Ӏa-t(6;;̌ЮS3?vJ/rdU%7 !SXV+zAyA`rjB)@Sbp!ɠ" m.R$%wB! F΄ v9.ˡ@g:'pgzE|EO Y~%J}ŇJB^~YXB'6_3=I柩`z"wik?H~B[_Q߲N'EH * Aȩ*;c7@jD9j>@mيyxYA뾂"}E!j7;[;lU D‰;}įE-bҗ`юj*͂[KB| O(^Gju;Xۘw˄ݱyoOk>ϧ 2B;< cf~-i&4c@h%@ċ,xV?c޹x)exZxCԷg ty` J!@ Ѫ`q ܱ8fa]>4kN#3B3.0rʼn4 9f#hrŏzuqrt3Ul+]d露" SnEadm=rDZ8Rǹz8ŰK<@<rzP˩>y1i8FP]# OZ-ꇢw-s2<=ӫMלW@*/Z0jWލv}T?iT\^} $w<{oQhh-=P ޙ@XazP|t~aN@x.mV=͹>X5g)f6\ʧ!Z7 q1Dwqk1$$ sUWBeRJ|R4c2U}b1d_=] ǃ?ܴH>%P @zUY?o׿R@jYzN89Wϐo<4P;C2} ?. W"PP4^PXu٣VP+]ʒni.@vBwqVaAo2O|LP*GUDpXR  wg=_:&'I :LHKBAbC_@wj\ya؊5O9ğsLB @ąBR^bR[zRyĝv6'~A %"ѷLD.MZOr5ұUDTnV0##"BďRvbUs訏=,W>j7(ԵSB8& ,|W 3= sUTwS$gI_އtV+ Riz@ĎH=Şm@Sk= ੊B q#!f!"?XȔrG/ Վҿvl: e2:.ȺIDBĖ"IDK>T^D^9cƙ[3 wYw`DSGw`!|g%hW[[e}|AHUwt{7ϒ@ġJZD,@2}7xaZԷc5HD2 h@LOr53=DhMQz}j LMly榽JPs;BİQxKalk6<^QPuNGwbs.GSTeȚM2u2=U^f^@9zD^BD(r+qtω~޵}Cd Q)qڎv[.qʯd0&y%H;V'@~yb< l9x'yՔa46#%~@׾!V,0FU™.EKAY}1< ǡ!iho,aK!BazJ|sјNc9*\mqNmBaGB vT7ԦHFd93ۛG e0kpO@Ky\wstI/`!iiv\A!þTË3rBJLHÁɣ[#'aAP~Iv,1"RPBR"zJ~""I&3IZ3;g}J:luĮɡLxaω/ $vXF*fT@"z9XgN:LZ67*OTUc3Ս;/UDŽe[`ћ^2!,-km8cD:$+N4{0'.ȭB2xrHj&]2tWŽʉWiX(,ɲ.y5C/ 98& ՙk֝W;%^cR8gzu Zچi3ro2&}xdxԁQF>p b<|"Bx9*z;^Rx/xϪ)'f ؍:!a|:4a$*%7 $zC/aGhmci6ȏ#PCai@yU&ϯUR Ye_w(16OSkE XPɊVuЄ֑+a2_%7HUBAFz 0rɻMRG %UAnD~eų6F%SPԣAWewٛ v'"FP{c@O8g9=!oIXͰf_U,̢++9s|5miXbEϭM|@Ģ\D{l@t\\|"R[D b\S nL߇NDu>XܫY*%M;ScxB}=2BĭqP_BѦ*]# *dy]#[+Z̙z֛1R|C9`2tx Hb" @Ϩ \@Ļ".z8PFՒQ6K*LJp|HlHwÑXZJ%VSZp$QF X SdPmo*ȵ͒@jIxgh*UwznBĵԮaƤQYFGXB452*o@i*K@Roj~vJk:=I׷TMoP ]wCZ9Tj'Hɜ{dsjHyԓ֛W1JT$&@K˱aBraD M^v94g9(φcV)ŵ VnHTBG9XfĹ ;REpTPz< Bj%\}n~9@RRI;ssT"з-(>̒O0~PÏ>i;U , t{VȠyb @pKeF#j5% ȸhB53xcG#jn;ϝX$,YSK  AbGdV>J:Sol E(TQ& .ƚI@j@069md&E}dˣrFiSdD["}𨒁Țr[_U< s%~13#BtJTMAAk4,s{t/>s!v}_꧴b*U #CDbWtv/yJVog(n@ĀQ82mߞO9??#rZ *|AF*%=(8OZqc*4+vp1&CұKm0m]_th__Bĉ|] !3)ʑ(:H9c&0K%yLy^u6"RrH+VFjDܨNzVq5Sxė@ĚB{ ,^ՀۜJDr0gEPu.EiٱcA^W؊ObOKwPMVyAP9иZBĨ |Sb1ʪI$yz38#A$叏 ~t}&3_Ov`š;.l.5@ı–zD0\+P~` # rj#3wuMGtS=g3Ucůroy6{LUiwZeRKyLu }vO<|BI X8պm^͜tvHrc;6&zØPD‚鸉tʋ"*J1MbKW?ntG̒?-D:iEFG+W:i@"SX*FӳԼD*FYƝ4hB5gyyZJwA{\̽K+YO10 T5BĜM. HHD.*)BjJm[rkcP0WU.Ղg&6t-WoV}76]fۇ* @ĥ*Va@Bea8MRUӧ/ۃZd=JL鱊42d2Nuj'im LBıJvaXu }Qr5صwRSB $uC-;<1d , [脁Rq5<=j+*I@ĻR6IXoRպIsü(f;Zᡛ?U[{;{Q1@ΐJ~m ( $*[4B9RI-lv}0FOƯruY>Հ)w#0ڧ?E]ʧ|ƪFMX2ㄎaGb Z@Hh)1Rs?0l囷NְzyP7!M:ւSYGR֍?r‹apɍ弽BFz| 1Q:Jdv}L? d y!+mUN Qi>vkiXE߁W5Y/G9@cw<="_q%gOE@O8+.eYt--&pWXzp8χ/l,cM̒zR} r *iޯ̆,* -@2xA \iCIMȆi"mMmtTZւ`0(j, *xAӶ ~iV/ϭps0v!5%`+%zVB|Oi *Oj$"l4Qo㼛vRIuDlMn2BbIYƁ-ƵGNʣu|[@ą0a@ C"Q馮ds>zOt̀}:\ʜڰظEVDif= S(LRȶ)DGVBďz {?6I8C_[z`EsYnjm_B6)BħJ{8ҌWK~*#_T+ȦBĒHeu1]YZ_܆O" brLXvRgloэE w%dCޟoIWJ@ě"vI1HY 9c!bHQPrٹҙ7B^xiz/'ou(w{Sՙ;%d,5޺mjRkԕ!յBĥB6JDeA NRD|U $ P`C{ʆ?f8&Zf%`1ZWsj A"YIJ" _߃@İ J $9Y‹;2fy,3z3Och*.:Vš!d٥[m u^RNq`e#QFw2BļيahNVLq_9ou_;lV݁ ms^Tdv3?7ܲZU8W,CT5 cvwB=6s@1&aX+q#ƈlC\,]UYow9* x~7(C\/­DJu IGux G\[/?3Wi}Zޢ SZcҭ*Bđ @2Z浨i~aPѕ$lAN] &1y zH">T::]9Szȝ'R~'3e@ēVy0l1b;ae/#LVrLY_cv,ֹ%if/QM>}=7mF1r4+qBĝ > `Cb]!$Ndq3 M}O*K=7dw G=򶋇8\'|i. cD+ 9Qd@Ī޴{p%,42% T R^?Uft=/+=+5Zf*0%BqZƓ^BĹ!zF|#fYSg')Cnou%(a揮kSSjUy5 ưĔ*tB@J޽V`ʹOhG7/na=n(0 o_ V\qjj[J0Ä@'j9Z [D~@j~BQN<:9MLs7F"CQXAu}NKYsOL;£noUlo3'2wTiɍ6i6"C@4x|2JȂ$Nsɩbf4)K%Vvj#;DjZ$ä3B h O8IlMU[̘@p"0tA]@l UHW|իrTFU"l*&ZBg!,w:LAM@6E3.93LAME3.93B^H@ĺHTAGSimply Juvenile AbBaby SinCos 2008I am for simple MP3 testing ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1547330687.0 audioread-2.1.9/test/data/test-2.json0000644000076500000240000000014000000000000020321 0ustar00asampsonstaff00000000000000{ "filename": "test-2.mp3", "duration": 2, "channels": 2, "samplerate": 44100 } ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1547330687.0 audioread-2.1.9/test/data/test-2.mp30000644000076500000240000010005000000000000020050 0ustar00asampsonstaff00000000000000PInfoN( "%%(,/2259<Nu;d#NF#9r@ !M%G 2Y y"^5x_\ֻr,뿟E#ՎUufã"ʱs͜ѽ͖/nU>rZ,`ScƲeAy_Mv pht8 Xd#|z<#RsS_2$7 ̸әTLz*UjJ1w2<]$d'umC(!EEXy%I I7p*"tnQ߇l4$Js~g3 ~K>.z/bYL,#@,ܫ E'K(eRݑ"ш3MH4d߼_f]yd켋{|#2("f)Ʈ)"@mc#\Yde1-EG?"Ynf.3|ٿ]f]-ljLQ yѠs.6i3Fd}?7=/Gh޿w^2]R*6Z ȀUBIRN&R"nyL2|v-@:%+Lڣg:{?.**B҈&$YS>}Y QXV*ր];v5;/e(3`i2 g9w,vue/+fZ)NuT8&"Q栃 xJ:Ez[YU,A)Xb0u21=tvoDL:$Ok]jogGVFvD)=(CPDbKL|Щ?BڈJ]h;%!\r~GJmq'Jˆ6"0qHWuvlL@D:=A\":PܨѾgmv*=V`Bl{he#G!jWv~ν٦VvL5N&,/P^{gkpwXǔ](Wrm&"O&8[pQQ2~;;tu3kŭT`(,Z{_j]lƏm&;EP#a67d &֒4Y\w2(9#E((9̜[Fn.1T#ds&铛,$O;\ҔiNHJefkZC6'p/SY[އ*h*kd¤lD0a/BPM%K #I36b h0"R5:=|ӗ9ĩ98o51v1$7 bs2rBwYG#svS~}/ܳBg޺3)`l ,G8?TV`*`1}UoV}#ɷ~=ĺtW1lB c2i 5 D9<|#9n̲Y ɣ}=^n0yۤ @ ; 8&n+$ [ٙw2֖c/ @yR%cUIBZ$ YQ)OMM%=y7O#hO[?祧)m;L>pJYp @r .VmJqdA"g+{0v rΎ %P31tN\C;ĻDD L1ȆEηUm$] ޑVi8TS#PvdX0XPG$8dkÈNrmMaiJuAF50|BkB!冎zS}:';'哛87{ fb3'܏Z-UF.pKilBrRܩKUIo !BBf}1 f`P͇2L{ 2ȁ"J6Sϧ 9 Q9Ssc tX;fD M,^f"l՞w!"Is'"tD=(0 D(.yjߖ" *쌪EjF`_εrSO3^!FS G?`9}%RSFWTU+x:j|ʠQpO׺* ܺMcL- 0g3$-u-gtwЪjn5IE-]sn!57S܋S;>(M[hdZmCNpne,i ͵Qb0ah@JI&N6+w |Ef|3y!(3Lf)U}"#%!4^5MVW_^\,rX+Ǵ'2JR30\LC7PA]CHI~MI?2v,GPfŅXq']ݪW=clg<)#,nV+%FzӌFqR6Aq% z4.$l&YxK O#| z)%-pvT/c>8DkNJGFmܭ:z} N< aCRҀ8Nɑԯ/Ԩۘª$䡃RHcDi H37,y\06PC%Yd,lı"`T" D 9ζ!.>s==٘zI0|$9BUB.B1n]l.YqvXT55|['_+N;" R3S3b:mUNy[BYcLϑȌ~  V0+=ſOڧPW̕WUi!]dWG%%wav; u3h^yKeU?rf6f cCH.g5Qq'\fTVCC]BSdPgO!H[IYsXg2DEC2|_3^dmE0.`[͘& $O6c$pM7ᳫTsIG3[Xʒ\kb_.ε'OVf)TQgGtaRJlFY;=UmM$kݧJ+Z XUG@0Jj@9 TOrweZXc-Z_1@9 EGnd `jGҥk{ץoVM Tu) n . 6۰@pNx4Ull2NZ;HKUN6ŦUOT$'ۤzYקe^f^-fv+#5d@oKJ8EL Y_{~EyҢ%mO_㝡͝Pb֢ݮ|r WIj?d,dBlÉ6jͨ *V]meEӻ?lٛQaA V(i7- ӷ{%1}8&'uY-2*n}7ϔ|.W/yO_奖W;g tO!XA0#y6f;yܮ멞pL2xI::la\Bݡc˗)ʚԙyφdjE)rW%" q$5⥄ !:F @%0w2p@7KG`ϪXXh(pdHXYyTۢvֶz"*;\YhWe=-mulC9K|1ϝq]GHv(fo>d[DD_gS#y~1z6j,BBfdlE1f`e~ %[A_$e J/M)(d-=3[(t+ՙWEG}{>FEI6mV]s)i=6o3M*/ShiVVVz8u5j7'{je֜b~!" fwۍ@GP- "g'<4nIGYmΒ0Kpa%$dLP)o4&`" K'uM{7fG.NI}.MJΜkiҒ붲Skת̞oݴIj#[t]t2*:ь-JRN)pq!U&N <}&˝}=ًbRGߍ_#QtJKי5Nswg ~B1ldmDa6dMaN 5%ɘb81CZlJGtv҄U`hAR M nD_)jΞ_{zUzYҷfn{vljeRTjMkZi "y tp t~_J>ԦžLSY nم;:Rքٲ?ɾQ^o]s$)M +MҢfP[pGR^P;^Ɍ?y5ix7.?w` FNAR[Ns!CIR\mfAA`\s^oi!V.kZ{}Wάo)7qim0)?k&|39 !W6|leMW6dmE1#,p`MaDKű'ۉqw)Fj J>ՙl;LFb3+VeZ&Ddtb$V2XQUҬELc2ݩSWVYNti'4z~o]/Y]z9‹zWÁ>PM6;DRV霒BGu 1F1hҥqU~ȣ.>C `J) kRļ7YI,*~Ķ[*hw>e{";1[j=F[f泥N#g4$2R0\AIJ4M15LVa\^GKa7clKKӗE|͔em6iReʞKJ21UdlɁ7PgMxa>J$'iAuc% is<MO2Te˩GBhyهOҎFe ̂C.Uܪd;Iu#BkQWo}>=_3ȵΥa fLKe^mmh *v#!J,XnwksdkIdr[52M˷mϿ'y4z>cYu6MfyQ" pVP#R ndT]{z a bRҮTJSI s3'jGj4b='ݝ>:jYzhTzETd!Tbjn=ŲA̱h. ;ˡ4Gͽ+/rYa2|#bR,0Vhd+lDrg-`L njb偕Cf|7nTT t@FG^('aT,B~@LD!K _LaL yGh(%\V*#BY8&(b5K#d dQf1i-U(MZT BX(X mf!3= Yd˛WBB!bԦDf/ӫ&Teֽ/Uz%үzv$cy_RN@Ͱl+ Hl M8*,t F(m.t$+@V˰*:29"VP(z`(CP&DVKeD3E<FҥF(E43(=z\f~,bgv}kib{[μ`k֛bJb *zwؤEkBj-u(b )#PۦKJs (A9(k/I0N.L}K:"ӹl2s3xrG{E0֏@#]iI:O U /!BVS%IlD #-*K/MWz=# \Oau 0&HtgABQAfT 6XSg!Od~22Tb0ĬHN 4L#(@p$\[P%[ðUOV0 !RN[;>|33aƾS56CF17_zDVJ >Z\aZG"M^n*"2!Zw2N'J.KhKV80 TX@$A,tU斖o Q^B`AXRr"YZ73 fGy0?Tv,: ,*92͠$ E|@ΔHh"б2\~O7=As(I5#_\sIu[_])7xӁ79^ $HM3([3A7g}D ,/5W;M=:X0m$vI+ 0 'qYc61lK!d `$Re\`9UlWJЗ{pnȶ`f]M`Iw9*N[h絊t\@$Zs4vb Ϊhr3@$If3CVRYSkݿ(Mxy/¯ko2ee(I&}ʧP &#*sπ`D'EDKG~%YtGY,Ur$ '.S Sf02 gHʉf]압 9Q=U81ak 1͌649HKU-WzE U.:8,&j5D )BtbDm<Ç 4m`Ke.u&XY@Vyg8fD=j0V0q<4~ U)$baO %L0%4Tzӎ}*騰Ѧ1)S e9AKJ `a/6U(R_SirJDf "W`Ra ? ]7R?*e(Pf) e5 w0a'w%`+HH58> i2N)'DiuȦh[m7(EL3*gl4͍gMz6Hj^LΫ0] f 8yr"'"fZF^״$h=`r T WC,H`f`_hAfD *NS,`i˝`y\>= l椙B شH9\| 0CN8n<-9Wtܚ 槚jÔH:T2{Q"JP)6Ӗ|Uu(l Ryж #cԤn@Ҋ#gёYn/tl &',~[LLMH= H7OئZv{vhoUBH 8qg]w0)F&LSUBR=057-԰ Bv]nD,PS YDa^ GGO "-Z@hJ9"bS| ևsG qmDċxSE@r {*|haTfNG d1:P9T1i֊nJX .F"gbD29Z/OU5n/Z"76d, + Kdw[~)(GzJI)9|2ɤDD-E&If3pOajoz)e<ׅ Pdm[>FR3!U\d>=$jsAݵVwvT A@O؅Lj8 XmP`Ii,V"Իr4l,Ȼag2{ay qD#/QEQF;:<‚ MGRMk hd/E?14?!Vrwyt8p:VpNs*:䥞wѯږ4NHkւ!(-~EL,$E-ƭ>X(x B/e<6Jg^8O3(U;p{m: N&3\^l C/1&it|D&)`(E qʇlTۻMzQOH dt"1 \8ڀa`X1 &R!:֪o2@ugSiVOF&^D1knԐ4Qhfd@JnAa2´\hI(H˸*QauVHeD?)SATK*=#>D0RMKkLUNbE)Y'TBІ*@'BE!ˋ#F&xV:& Ծ Jņ^]Zh2lѦbU'),?!ϛ@L v.)%V b Azn.|!EɺRZV5W^9Bv 62ۼ]8|Pm>l)(W@5lE$! ڀw$Llq+U疙R*H3GCobQ#3lby& 4R ~FBOF<xwA5I)ʇOͩ񃄋:˂ K6PCj1*׬n@0tQDY.;2dT#Zf 0 @KV ʹ΢:Rfİ aȚLXZ%ᠠI.&V: n Y G Cn \DR$kE<[a%\Q)!bLBf]ְ0k04@hy#a"qUqo0<Ʊ*fGl۶y($> ?0ɬ+35- H( eIԞ\s}w%vղ 2}g00X[\ $iSI>֓ /Av\M8Ņ^Eӂ'L&AMD؈d b@ h8N.(`HڏhT:G!Ghse#oe)GH3H#̻qF%PDn)ϻ,,4UCa. @ALvQLH z!(%T+Qg;"=WK= %AL"](iwv*+L A3!J$C"B gȲR̈#/枋]_Zx^bB4&E%&arJK)pOPN|<1iW{wpx-+\rkۊP A7@g0Bh ˅ (lkGђDe'H@(r"pLk@iW_e:\%ܹ?߻kpw`@%+ b2$g+)x)&¡రS d(Rm~jr؄j)ܴr{|@6ZFL JgiNOIwOD)S2dT;=.JIL<ɑ 9wP]AatRhsbг֟s( I(x~ٶ\T6V)JrZ[k ``SxrqKRG'6]0Jd&qrgT Bs9+ #h R]ǡ`i4TFJϟ8*#XY!5i d$G"b8TΫI4e4(hiZ,Ÿ*K /lTݖU jiz1%ʥEG?1O /ZǩBja}hSrH.lcvb%MhN9 Y) M-vSp!Md}.2ytoU4Ta_"'h>A&<4-/}r*CD&ԲT(;^-@]  XtYe%d3g% ~X(m|rD2 dS[19OL0V- ,odfi@lsBo%ȭ̄-}9躭1^tҢ~@K-DjH/֔4HD8TEǴBԡh*Cf3CEN|ܾe9k%8?O[SΨ0p-UEhNjRkw | \ (Ir`R1J2TS G 3R\Xl\@N1paɚ$j@ ]6e|\-Lbx K[AYz4q_zT]Źd0\V|΍v8U5q U2?[05s3&: ^50.680 Lw`yC)*=4*!=@fԐtBNMd8ȎND;-Nlf=# ,k>_eD8[ @bA $P@ _P0( & &  @0L@0 !\`h& q50 x Ȭ2X`Ԓ7e)-e>3. + M-]%;8!P HcaYa:!3F2kIPT `3KDKL_ eYޒ3 xcP%;.K(p ܲrQO=#" $2]=zKSK(h'Un?p}ԵZڙeP\.o9ڷS*zvϺ1Z5G9KDGvlzBLx@z-.Ċ:7LҢyfIZ-#L 3Mnˤ$bS^X\71cWk,c0s떫gXRI8{% ZP/>6Iz,XaKۺ }CieltBnp/a=r}zmU< ,5m* 1L%i $M1Em ɰ}SlCW[ie˒:܁A$]Y~[l61bb橴kV#%y !Iԛs< Ęb T?y]gZAdU{freUo[fNH͸021mD\U>ϛOBvc+==< 8mK{-* FSjV%ۨd˵Hh[Py!ZKF93C&_"bHLlBk%f8zkDeTs1Ô$^fv>ds $:h:jvwzIl2X r@ڄ)UrS?u:z9ޗݖt]JZ.Aw ؛q/7c*`Ssn_tCF R+e̾ݛ6~,XUe.jґ)p<@d`>na.'<*m*quqBx+]ޔ[xZwDQ#:NLc&=> h?M$VY^m ܡrg}$1橁A Of̡-pT I<=[%$$Ys $Վ 8#\@oCA䛱A(\%A;ш@$X2 '@U'mS3nh=aI0lا55iMBk2t%mLDO-kT"ۭ=-ILS*PwPbWNr/* yF}9i+ZԲPղfh[Qa23~.fxl3yVfN Uѣ4C5-j-T'pFێEJ $TOHj~/A NCXfš8"gxۚRX~T*'D MbEHSC>9 ׳H\|0m2@;GJ+^9* 4":VHFb!xX.=!bŻ?b8, HeF0*hjro@+.To"HP Da1Um=#K @ML0Fm4 Ua3mBۇ'd.pHJ3){Pe>;EpATSTu1TNKs$HbJ٬R9VxB$Lualpql%Giz Lȵp~J(ؾ^ᕳ9݋2D.=r9l~hg"^bC̆`HԶ O]FY#Ehc I{U[\&&\(q`ĀIbrFD#QItS\%18L0 lq:`wLFxt=w))x,ɼɒ `H)@ipasi=Iyo O.)5Vיڭn@D'$p H:9/|DGullw{Y&\$T!]p !Pt*#(Q,NT_7~IW)NNp@ Al߈N3fI(ww:b HÑq4HR!.`vS!>EX2 DO⪂SnDBD𺳏YVACp&zPJ-k!8͎* LxT. #c};97PuAdD|-SS"]1@lPP" [Zk &bbӂlО.5ē'D$+ iBsb׸ECETH +ʕZh;n#*)ML V]{Ae{8]ODFrOVt3=3w*¢LgdҀP݀0R""R8˃;7pB)<>Fcb@5-VL\Dq`5Pg\һ\R} nI.9on\LTH YPAιlJ@PҩVA+[ͥ.îx|ú+#G, 僎9);PCmbTYԍ k5ь)U5*D;S *tUe =L GLOmh ҧ/@u \ADƜsd({cW-1(nG{qe@f3J4C$(ENJ2sV>AA&{9V^RT.*#͐"#*`$*ftUn/ﻓ Q &pSnk¦).jwGHȡ‘h '8sPHH F&҇TsB W9( &E̅$z |0F0}à :0UZ K!Bl_T*ScQ-`q@D-}nl?Eƚ:ݚ1(!I*IYT+;d5sGGeJHD,S/)TC=X H>찴YU km׳ѹ`)9$j#gp ӬJp ";Xb?zfYQe##CL7S8E#+XW!`됣[Ns.@S5ss(;(:a$zYCM ] չLYz,٬N6nx` NJ\c[Uxp hjw_ڀ d!S nY[r?Ԭ䛒utZY=T*Ao` .!rQߐDЈoVʩpt5,7(dIQ }IUՀ-0!^+  ё.? {?9mGFK(DGQ#C؋+pfF|$|o}7lv*D 2; &b&K=X}6lхl v%퐉7 ܊X QNST^/b@pݥT2 zL䨺w '2rq Ó"B7$W&\DA.':.c/ \B%^Hn~(@ !U[YaD4nDű*e]o3"d(z7hv2kg*>+Jb-~cD ň&Dxంḳ>š"Eks\ qFt)Z~E.6]G7sj&ؿR e7̕r`85n|R]eCh@D/Ȝ1l5Xk[z,ᨬ֔Hk\p lD6λOFbe)=#i6lQz,z"Ѷ5Y54$nAI R.CyB]&.苅n:8i)Z=LAMa v W"r[wv{{䊠ق`ACgQބ!H*||LivfW1Mc/@HY^_rzk:fÅ!a)0t(Pjp%zoM~$ۖzMUY['s=:= 1 cAWI=MLV3dyb!R $h8nt5".{JL֕{$)t ({ >[)`2} `W7R ZBH 4ϗB$ĤF miEx]! ވ̃%lx r F V1Gц%^Z\PvR BQŕ}D"/bdbZ=#h@0V+e,Ҕ: >>'AC`EPjVzKt RX RGlOMIH t04fQѮl &^1n-bYTRqfDV1hCa@EV4(ESE5d*M$RiPrb(l D),CDd=18 |EL U-t(M3#36ki+%=RH fE%wwoGe"0]S-ҵt 4 3YĂ&JSԪ=PG/3U"DZ9 yҦy%FqƙYaC5O).G8^1H,!qOV4}'"3\M5,>v -*/<9D_mjlBU $d8[ؔDթ2[&P0P`̓:sR3SNF,bCP4UiQȀc7X_-dqd**`T*r_C GAU,Hmh) ޺؆Gz`G'l;A#WQ Ti}s.,%cRD3k/*W = xG `0F>PIl <ӗ1Tl(]k$\%Z^Hqy=vmhlnj + -&`%*R>XUʻբ*7He ڶ>k+\I%6ۂZ2 5Ie 6S~F.Y+*.ŏdw.,E5rk8ӵ_UsJX(U߁ܖH@K )w*`UC'GeXl,oҝhжÒrr) p(l9{B s$ e@A)ʴ]gc=Uk"ǼՃ"*JMMk1y>f@Ӆ"95ίދ| \7nD:)CDX;mP.nEJ4L_LgrMP2‡Vb28Zo%w!Ɓ-=#oțd }D8%4z+5JzQ.gZ)ޥ[kv');[qjx9L=* (" #M- ){͆ 8 ks<["Un $^ÃJLK!gD;RS/ATk=1%Z OL$^p(z-i?wJ^* Hd;܉"hQQ%~!mي%Vrm6ܗ$& ʢG0i s,WCw"QR-.t@cXD$U}=qW/d(M ] [Fy4eeN\C totȲ8[cMT|tF! 9׮Ygk}T?xjq=de Ԑ.@ȝiڮL5P GB8s0N Xq9 JtGkhC\Z*-YĥU%\az+)tL"!hx NJϻc\\7Dɀ-k 1SC+=8\Q$QNnpA/Bg$E@|1&ܨ M#|NA*srYj,rP5xYS:߷o#ȨH.NcZ47@]u9R*w,k7m(O-?U^fTJDJ5y,,k3v_D 6<KYӅ7.FNTjRa1HIH6He1dZ-8-c_\6iKF(Ҫe, 0{m ǧXHJv-jRhY١CZT Be  TaYΗܖPcŠ1[tUEf8K $.I d˖=oάL"l:HA 'c*(8y<ǭ~#̳IC,p"TxhTT&T(<ztT%r/ʋ2*T #Km:⹇ hcwZ<5BvfDnz#l.M~A&U]߻(D#O)5`-=#h $>m XQ-Yn1步C`MS#@. 'puL;42$q f-f1#cpQFKVF,GqtX2.XZ==Ѐr&p@ [#|XoHb/!ؖ 6lPј76oRͮp=ck]po_h@C^7{j SE^*'v#xSD+,,9JT؝9V\;\X]C7 &ՄⱁQ!-[XHpymlꮺt:UoMh #@L$M,_)̤ ;1r?hT-u^;SsgB%D,;I^+=(X >h $7RsSߨE'#KI`DUkd5PPؼQ~PP\( DȺh~;Lh8PCbq3r#YB$ߠnL3`9OVͶ}_5\m{.*]&9 X.R3iRC6{"ӳ27=o 3>G03!rK?= 6"}HX"ESK!:ŧ?  L_m$A[ll 4X"qXapeճ4IM{]:qCEU@] iŧX,a \O09L#\Ѵ4|(5ThŤL1/awCD*-Of[ =#h L:mx0vp )~QgPαo2):Uh+@1ESű;)Ɲ:{_ 2S C,!m|`U`& H wvN]ݵ @S|>8X+/e-1s[jJ ~MM3bжh@;Gڨ#jެnOmڎ3CP@̃st gn̮~`eW)tRl7SDTHQ\ 4wfA%vi:#_[I|@SwQT7x)/ iÇț d5O9)a}( [:n90:-a@%]h;HCweTMB,vqFg1n.~DPSO2v_f[*=>)uvu: >O@&'ih9r[.Ř{բ/n2BA x#;sYPSh:#CÈ>9t&i+ /:Z##J͘۾r/X_(sEcX(2^]x@QE(` 1^UÚRS.`}Ҭ"!B-c Q""%',-n,ZMjq8: ʇB0XR*de&؏`iҦT0w`@v21є('GQTs.+9DrUāǠ^/pi7rZ֭D,ΛXBt_e> >m0tl RB:'B r`QCD٤U껩&|& R5="饕+<6oq0!cw2qs>ݵ3  /a*0g*{Fa2Ər DqcNx,pˌ)EA)B2?޾[iOJhy!pELoMtCOUsTR]IwY܂Dey:X\' !BPg)g9֔j$ Y9v.noydX(*&K#J: )®y,UWA&GRj27aUL;MgѼCzpKp\ DbAKcDB#/AY:a, 46m ǽcc@UළIrf"LPwd*! i0a`pL> qf}7D2B=Cuf%Q]LP;†#!Ʋ:{A!v/e[k撛bͲhi>-r84`,EKt,,S|"~8B[Y2:Q axotkep^Nbr:5O O҈_D7VR!@QRK>+%RPMRD-ʳ<3_%kT[7ma& VRl C'[dUN,y91,0եdnʣ}Nkz.UN rW`E'$ 2L!E(J'ttRP:=!LE1=)^TfigZݽțsgN \8&qPPE^'_jTރ  p.4!9(/$LDʑqa{ [L(#e3\vpl.!@D4RS&-N0Qha{rrb8  cP,k0?LhË/!Q:ɑ@ɟa94(aAa봑R֊ֱwz5]Lj )^ xH=Ρ]Iϩ\.ƈd>zg4wS""n%JM1jh*8rǫ5Ԯ-j6@P n-e9)H04TIOqxLfD%3PSL-_#Z18xM=Tm<P!Z@*JP( @cfK^챜Set.tBȇ:q1C4+ ePxVTl*RIxJ1S: FQ=oۦح%FkPbg}L 2hu;vDǘ̄D%Lh`eCp`FD-yqaT2cW﮾iuB#`09 JrdPT"I .Q炙X+̦(쓾&&_e 9Twn>_SJ \]i 4XͼT@8[FvYYȆb#B:H@6&HcBLU>DI,L=f*a GM%YY 4ę"c|! j-}(Ԁ1l/CE E"%^QtkMӶaO`Z"ʠv bq+T(aĆ$D0j])M:rϋYZ\cP!_% BIHSm^(CJQC"3eܩ7fFi)yGOFWt[5US _%H+I@sSPL$"rTX6Wf-;|N~-(`7*.P85q&>'S{rucz^z00T $!L#qSC@ ؈>\ƿ@-Xil1F `7D;+Q`մ=(v1D/PSLa+-=> dGLe-:g 'R(ֺ,w@ n][}Ӹqr<܅M`LeZZUsgI-wFZH^H1'j: >I $l -\(_Hj{lpt{K0dY`4ɣ $i i'}"ȎW.AέGclpؚq)%? THCSpj5deG"tGw34یì}RJRH[{J^fcl<"rFSҭ5LGr)$]YCQkQxv+KBImȜ+:v/:)D`DD;Sk,dTK=)}:э B4CkIUF>'g)we3(XY[Է66@*Q}iFQ74iJ7_R\ Zȧ@ q"L.[Ïe<5%:L} e2PaÅ-t.] r _-;q[Dh罢%J%ss,DG8>8?w8N3#Sn] egS&8 w"]FfHB"OlݻɿWc=d[XaXi ;"lEyLrJy +z9_u*68<$ Az"AS=RF(`j"H> 3c| i$hDBD"SIS㫜=#USU1lvY$ $FRHYhP>= w DOI)G5(Ȉr(!UAq hΎVìfdYWr G"C*?u~krH, OkoJUBquňEX`bObp0&B2I|HVl EK袋(eNc M+Z㨅 "ZЃ$8K"<'IWɘ"ÔOÚG2xsGK2\+LAME3.100UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUDhHvm % 4UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1558146633.0 audioread-2.1.9/test/data/test-2.mp3.wav0000644000076500000240000127605400000000000020667 0ustar00asampsonstaff00000000000000RIFF$|WAVEfmt Ddata|                                                                                                                                                                       4S)|qddcdhq#$1AEN`n}yX:(tdO>AHA556,%1DJHIID>950,&   1Oj0CR^mz%0=Q_ZOI;$tQ; /   } m d ZUW\ajty{}tbRE6,,1BYj6Tk|lm  o i p z   z ul f l i T =   jE)!cJ4%/#')&  8Um*D V Yh w z z v s y xy %<QZe lf]M=>FC=>DB@HC$ eD gWJ I O Q ] r  $* - 7 =DHHW^ P V d Z \oqoof^\SJLL4    yW:  uif^ \jt}  %8=@CDEIVix 4NfeG+'.0662201>Oj}moy   p\="~N 3s>K00q<)9q!Sueado 'ARRTYP C B903. %/'1]3-0-   _ N K > 7 HTUbqhYN7fE4.*(4Pq0Yw}cC% (Y,+)2-{wvlgpxuv}ypR6 )      xbQSW\u  $:PYPNUL>;/ !*5Mbu zf\ULMJ= < M ]k~ aOA&! /Xyo`_id^gaW_T6?YSFHKFBIW`qtgP 5 (       }mUKF2)4 7 :Pl $?O O 2  hY j7 'KT8Z)  /GPLE:oV/w_bv*1FMIKHMbkkrurrz/MWelo}hky}wjlx'7BJH,    j YI+%)y}st}|jTA  +Nm  / ' y`VWf 7 c ljfF' iedvy^_w->:@fv_JTjowmOQ ew[=' $ ""W*dOz~ p b9I2d ^ Q x  . B = <u*.$0`rXXRaC+8x#b j^C -    )    C/ % K ; M q lJ.R p<l% Hj*?  7 +Zw|:z#[2O6~QLq  ]    e   f  6     h 8  O  (?  Qg ?  k   : v[g Ms~f0V; * eH9[0 9  4 >=]Jazkwx`g=^"AK r M l ? " j,S * zWfhV3 ~ @  c HrZ= e |Z_#{I6KM%lUsx ) > *}@hH? hK y{dOx v  J/    L[G R N`F(    # $ $#"!1 <T( Z^~V oIOp\xIUmd "(a$yz2+s)uU%Lt<p5NdSY9y  IL\    ~Y!'.5<B"HI E@8-%  &-49 :F:7v 2p+M!w pQ4] $ /a<n^5xtnE@8WIe.| ~~b<*!|.y ";Pa@larpsp-ll kphd`\`Z(X1Vf P!IED"JI'R*[$,f+p(x$|'~|4zpt!k5_SN=-  g  B1  - . =GORTVV,VWY>]g5r{!"'JA%CTO{jBxp@jaXPJ,D=,1z thD4x]o"B G Q(x/1&q{wrwz $rUp { y \ C / < <U#.|;!Md`~T   . BUd t \=wVb Kz8,(G)b.25a8E=iDSLOG 4W;ocr_mer_ |pe%\SI>6k5 .eEocCvI i MU s  uQ]G(gp1i~$.A~ P$\e !}    r * <)Qfzy/Q.efDLKF^^Q/$dN8jHjx V>OM|GzN|F_R>NTfL:pK'rP3R`Z*nk:sj "4ue]J`3~+}U#5%1XN~!CTD>v~z)KR7` F  50h "###!+/143 551j/:Y q #! yg:l  H Cned) : )yX;(*K-CqhB:~ , Akj&4pRc=-<Qu[MA=](&xZ)5f[4&r P7a0<Wz/i=4<``W6&,VIzkS&vdg.m1'q V  C S.H !hB=r+9e Sy  E  3 b a ?dwyZ{f:|O3#6h mef4| qvLytr'Y>aVyJJLz[yUPzc]d  *?N?#Z.r_,9X%ihA*'k+"UmmcJC~wskVYO?,&3B/ J w  *V.6&)?hn,gddpa  x + w  l)YAJ]q!`;u!% Ogg1]f>E:H!]9 j8fz.*Gn} }-SZo7A E9}4i;ObJp1 !,)PDfV-IHWad^*J#HpEP/ /@^m Jp`uZ`pa 5Zgu<LbX\2oazKgrk~U2 7pH*|    :iMFCCE/0=Vb L/D-h7W#b8dl8 a(toi-ilzt 5-a{])?kjG/D"@ J ? TObzS {RH^cT8 ' & G7/S 09QO , OqAH^&{G., E tRl/*I=4Um !Wqx4!xyi$OWmxpR~-kZ, R}|yUYCc .lXM5! 3bPk,uov$O[BBeW0{6 {) 5Tw1@$"7}Y>1.$7GQqV^\ew' x<jw -K%]]mI ! e%,jNDzZ^7seTqjr\oJ:-%*#)5DQ\fKpyk5 F+HPZ_NV? c+Xj`tUkRf3t))sBK']-GYEf=7 *$* E-N!)S! 'DtW\ \0:FmF<)r $rGGj}( ,MfrlNd:}L 8g:%#h0KqRXQF=?RItV="+*!*w !_8$<Rbmuz|vboAV=\+qJR Pz+6 %_[ !Q!   vA[ ,qfd 0}yY'C']pmH4 CTu2DD1MwQ@+ $22]35C.K!SwAnw8}(A3F\_5[|Kl cIVf^?wC %<U;]  v]u" C]f&>HqTnJ 1T  1(1 2 p x . ? G p    ~(\ 8-:@9[~   `f B 4a 2f 9 Co Pi ^ l wsxMkxN(lx<^`^?@BfvVxd -+#fTq/25 i7R- DzM +2;9A( /n-UNNt_OA662u8H`{HXf~iR:#3'b9AE=.  ! TJv-f[!P} } Ov<&/SF[nNm\: pgKf!rXe7@,-DkaoSn*Rh8G>R5IFQNA-\p~? N(+bx 4o$My:p.Cb"!c fuD9;M#Hghr^MSVrY # S 5 6Qht$<EDA&4K"@5+ * N; |2D>#eq #FemD  9_Fi   tP U 0(0e{dbsHJ c"@I4N S$shXVi3R?-H PH4B$a(wy$hD. p<\ -rf Vp8k^=G t~@t>"pnmfjs}qO#;}qO.#ru,,b+!\r  K3y h R n0=nfa ?at 8 x`cN\F=La\&ft3FGW:# k;dQFY~?,B* .BoB/_ r3g2W[w`BhO,@ 4-Pu)V=5l9vgI4,079s0}Hn9L]BAhn~nB6Wu S 4 ZOgy~P dpxM {>~f YAE  G |} N Vn `?Xgn oSkbZV K @h3"J;*!Oru`\WSh! p!pZ"VUZ  );/!(=cQ6'M U85  N1H>D<[$~?`A$ZI}~v2ua0XS83GiqU;7y )sAR[' Y Nl ?/ .m <   &;q R g w'}qY7^  \N @/:GjD"2?\a<5VUV;HWddVA(HK>hy)[RIP% T 1v0&MESJ!t?2 ""8IRN~<Q?_}FgG 7|lt:R[c]px}~UK{; - s @. D!!yu4{T)?M55 fSwamD S 6m$+ Vw _44N^Thor%ryuPL U{_h9q )q2<Kr~-k HwR qeso.g/ :\Rs?~rR\?$@{&8NttAf)Q{KRXzA@8VRB2:K1$[q[\@@qWp:}pUbh!EXQyYn/K&G5g\,chm0,D$ G   ` &],a p qdV@6 % ' R[CQv zSUA,":f*Kp |gYKu/J%H}Q \k. '"L|]\K$. 8bbMDEY "wiZNRU_"OmZTI8 #Z652\eDI -g; Ubap j:#=jQpk+YVh=xm)Tqw8;ISh":/bSfY0 V^YJ}H=LxU:#StP_FZ-MN"Pk85tEH  l ( & ] A  !R 9KQF7%97 6B a2!J2&NXz-Y@flZHqC-/2Q(iY(AOEC6F|NA!gZshTh~Cp+|| f UI?@W.OeY`l}GBt5 ' t  IG 0 - j U=tMdr*4:@<uXGgIud3Fu|.i5|eR';qT/P~g4rGT5>d3^yr\"C 8CD`?h62/)f#( C  ?  'Y a=zZ$8M}JpfBV\r,6fm N""TsK{HveE?: CFrp) V3g-`/8eJv},BkKo u1w dI BC 7 jM~0<OU SYAv8; h: $tc u|3Gh "q k$x "A Y q8lo 4 > TH|0rTkz/y A0Y;_W[S|x>|uL^c5%W)=W!F}#    k!G! ,<OhmS XtuKI  9 :wETb4?9Sk&- ^;L17@g]h2w{7i%_PO$+],  . h $J $8 (: fS&QPBYC3aZ* Le9:q2X+Mm.YILlY#qG*?T<o&)Hbz',5b,e4bSf@<$_XX$o+-}P5sty6&O 8  5 %gpbV{;{T{`ozU/`4sgEC Gc z   }bH:1 $ &6S yG  ?=sZ5o     C   q ;>C$F l:}Bv,:G>R@;x j'hok C7#2"1E R4_n| Qmz ;Y7> s1X_S2=+gj7L{,(Yn\rLXy7 E + kd; ew _x[Y[t iNW.-.;%c,  4 Nk 5x1M@iL4 b +Rz*KfzO=xem2E'(:FH+I7 i~r7 !dk%B c$C6pH.jhO?#kWM6^]Vg(3;_~g%x a t ms='P{ d ~GpQjxM<9@\3 : 1? n/~-s 4    "  u 0 q  /i *T Yrpm$sm <eshIdPJX >< VF^\zXX>]9ht g|hJS#@!L=q StW} Y vJ)?|$E,bC uKt<e]8iG69T0&? ^N t { d 4 S  t t~XiE}O?Zf aJHH I +} ]J9z -h:/MYK4 eFKK$kh8xz++Re`>>1[0IzH|`0#sDQ*~,[4o)(3xZG:b1?)z{ h l OJ 8e+<#A O^zP=8~OJt"I`  $M/r<0O qEW YI r6pTJ@{f%aaV  $+ .='a  }}u! ANn/r 1v+^Px_i iw$il&yNkRCX 6 $#4(Lk *p3@LUNr:H! >F  ']MbuWNrC2~Cq&6)(9CZzHLRK{GFf_3''4plXK=-@_2EGE{ #km\VVWyUM> ,u  2lEh3FMQ@9N8 } w ?<.Sz/NTN21\WYa cr; W}U#NIy2v!U3< H1``7;.TN T39cgPbW.r2+ g!+}&+}285CLHR- k()<2 R gzgq"egBwy* s 2 k  4 Sq o :  ^ ' hcF.R bEOM\xbTm4tvmn]34v ' M2[R9  nUfnM9A,#'(-:NnQt4%$ =r C 9 $M d[qdc of"_!p4oM0@ZH HNsUb_XL0hTD @iRn J : f N=YgKE$NbwM B zuea'a?s?J*?h#hp,Mb`jJ-%BMf B"myq &4EqGY{C\JELJWhy&WI] >R3_rGPgR$ )tMLG  U`  ND  D -nA<"f EaYdT7 j 6ByI#YYJ  RK Uafm /-P)9PJtPq<iRB||Ok,r"D %4Bu9$~)dwB \@AXzJ0/$In{y ;f )wd`D)+g+ [y [iVI5./KGd8#(=F6x_"0D7PE#>lH0 `! (6 CiZm|z{ u G5Q8|f^:H)}+> 2 P@ ; NV `0"rmq7*6~cr''!W%L5V^^v@P s_1u mZ2N#O\sa? knK1)~+/p6.2 ut( D6 Ee6id08aFD/E|u^hQD0#6 V (K[W<b{MB|Yi@YnvF+I#4CFWW31-[OsynWn:@  !BfpL qL(A8 J a ~o 8 N Z + gH DQt@ ~'QC~ y rh^ P8B~AaT'Y;q kL  r   !  n6LI=DB_N WyKV;w   E  D     !w{'{Z3fC5v-#,c hdK{"}r>sz:Z-#gG%]P6n6|=lb4}= ) m mhMv] NnVu9R!sY ~x   p gUL%GAs`5!ac`EG/?]*xx{7X"[W+>bFT8NftaQy6 E?E 6I5g6 "xz=zBtqr$y 1 BA4)E[ J]v<4U~W'z + * #Y  < Z  4. yiEGiO_{m3$9d''w%$!v  NSUuKiXlA% J Nm5wm4.xjF  Z/Ms ><`sXa[j9 ~  lKDq{V%>\fAM*IC`x`_Hu>P>mB>HK;KE=y5,&# | #l f#p6QadB[EK9'=p 7Q[9!,5W?F'r V y3;&EEUWK .EDb';|(6v|\:eNm7 {Tv!:04v%xx2FGX q!A,3T%rfoK\7 %MEqU` J=KY^JrSp&n>'.Tl vfL2y7mY@fcVbE8x5= RtYAo P w T  NOArlD,M1 &wlu<:82 ) 9&H9Vf=zw6)53K`st%W"o!%x-vo-O" {>= |k U!PryUF>BfME@u h*f#uw: nix`aOA6,i!@Z 7+'d (\ z & n v Kg,fio3?& Bm F   RjgUV?VSl:gs3NNvc)X}a $OU%%RrO1_%+H,'+jAk {{we:yaw|8#WMn-QW?-{Y?$^RzstL= Gf JmR$ 4i51~x&u?/Z;y7StT@"t A ^2qAUCyY  h 7`$G4<8  t;ul&T_;PH((`GT>#)E*Shj9Gd- Wb8i(2,FW`dEdc[eoL*=#y@v 4UX*.5.a`%10gs#fNN6e`R( L 8 _I y[ |h@J$"{{Y1>+s9nr  `  T$ y t2/GJq4(7 ($BN<l1p->.`*z.GgD% . *68+F q2Sji coz>,PdXx# C`h~V0c* 6a'(<b3% H|3hdUC3z$i n h 1p]G=3"'X< VCu.=9O[rCM) ' {2\+d 1 ! R& rv  w We $   P  = ~z"idffN[A@9*p3c5BG=5yLUsf |NH\HjJa:zd:Fo>skty}{#wdF0o.1 <T/U{@'*o+9xa`srcka^<*4(gwO[BG"AVf}ZmiBT qL:7==$FMNe D - D2zVuA J/T\ iu$6:MXPLI P e  gTSk1<-Aj{xX9jr#  ! 7hI tUK6s\}4ik8[UCUb ]gny$"|;6[fN2*r-YU;?s$B LMW%LA*N8>b]9bcJAGAZHQZF^\R!n1T=@v7`Uh 1 SFcbFHgZ9Lw  SM`)iU  4Yd{SE]  9]] tT=2JyP~6!K[dgqy Uv\3Z2  O1OG&^Swl%[`z4njentd4*P h3)`FY$IYjs.t a3 Tj1sIp=aG#G4Gd3C@$AgM1^ 1 Z I v %SGdOx*~lscdX_T?` 'H_@5N[O|5 R0+a >_  i!.' C(C|9=Oqp?buB w/k4sk\s}pW`+1{7|%9D%fVy8f9CI3U~<kKWdK1d8qRW=v+IU+Ib##MQ%rI.f $ . : D J] I @7 2m #$ 75Zc?z\IDPcL "  3Is$J; P#  T  .     ab'r' 3 Dd p f 0 } l@-  a Fl3;~jvs;u o^stS-3|MAuvgYA17+FXyeC _x3Pi1Hh) [!w 5u-6HU$z 5o<9 A+?w v% ; 4ZnK *3<E;Q`3r, Q { 4   L T5$7hi_oD(us \ 0Wd,%!kWn8m6V S-`N  L[R aBKqG HiH}m0|[$Kr*u(q[K#`',Ajha6LUo5T %k  @ }Tg!6sMF--Ew\%  ;L4"7L  j`*N<W  ' ; { p q = U3lpH@|Vd2V&QG,(nm_FWUYS`ixu19y%=R0 .C*u?w@[$HZh }x[/Ns,~b^[i1mfE?U'X/i<zt6Fe& d ig|{ax[>q&8XA?j}0b 66b?L0I2 |+|d<  B;k'svOQ[APWD&{ 2IB[cs`HMa+MZ "'&HFE9|"nx#@,_u3}ciR7 d"S'8m6dKcWMw=6^Bq?Spf-@)N!;} o uT _ G q ?{}cUj !> X%jnWS'mDy & :)Kr|AoU 9  tqz r 8 s cY v T E{K akx,;JF PA\m*<)*"0[e#K6M/l@FEEG}Q2R9Hjv}{$m7$Cct{x`[=+&lNX ['6'zc PA4J(RCJ/-ffN-ko4u!z_t}o1NH|> M-L\U ODAR;8F=r/xlGy  J< [G;cwpHSXJh_H3,SQMD*>l7hu4lt&Wf@SYoUMiR)iF[[nj:gre!NAVR _ * Q;:e  nm-RSaEOWyY<|t1Zs| { 6h=\K 8 G A8[q!xuneS&[T t y] <-  c X & W,|Frukp`Za{|@A;xV[rbh8.)wa na _@fCC\l\>Q1-nR,5;#`j/I41F*LE%4}<@h:q#IO{  ] BzZo5 * B+4k [yrD +@ n1 E @ &% i  / ~qdv;bf'{   w W #s xN_1"!B+>U j6zH(}mS30Z`j"8se%`/XJs0C'm^UQTXbq(@vCo\tGcC~@30ZJk~$RKbm WDg8T38F!]~kl1 [+G;oUsR4DOcqmSj Z ?C   B o*S]zjwi# L G ao-AQ!tyTW*%yVE77U|5  'Nebfe\Jl1_XYB{l?{KM:hwDkk"b}h>1%Udsh' #P0)A}O1)j^(O\L6j9~n4U)}1Xhns  gp r " t` f!{bJ$9=JE4    %2Bt*.p d 0<?i" %&%"#BjF,aF:El6 g u - ~A/"'FUq.X ;,mSA09Qubhb;P6/^ 2e3,9 e#y_g܏!܀Fc *@MlF,J3*W/ =sFh 4MJL /T: w"k#z!=z^5]\j) ,Os6 #%rA&$""8)W8 i{ K>Nh (5 Tn>)WOH0pO  x _  V]%B3J` S]- Izgf!w".&C5$<+D(QZ{Y=%]5 C=4`l+nB;YREN)wG#`t"~pKful}?EU BT,XQF@7D^Ri:u C9gUDFnd\t!u`(9 f] sX>4"q2 8 \ <1(#-1'S %d*|,bw+V' 0ex0 -I5 m?%Ga\}bY<C$ MG'g`}>C)SB# gZWQa-}mrv.g6-z uAy`6 z+\l6O 93 ~ V"f}Fe>x6 Aof   lQ "1K@t n/U8C^+d?y6wna?,6UV_[ Q /y7Y#{]5"G@ݧf(lM'FXilI) j`=CWW" f7 04Lg=o  TqtY 6bpX*6csK]\n ko6Xr+hpxnf3`+_apfm.v7BL>$ laF#   -,r-YJ<M8S 7#n$J#D![( > *%9!w43R}[ )M ^ M M zmR$E vCz| -G;V]/][[`rl+|  3oUzB,3-)yHZgV\MPbՃֱ FeNu}wk%U45TsZ^a- v=p8mq%f%ig9bYA> | 5>$u&%%"+:\ '{sm//o1IGZ4h'vz g 0k z  z| 1 v ,~0~3& <X~Sn. br]/1,4x&<8GK1}/VG"\Jp*wsG= rC$`*Xz1vnFQ>Lm{G7o׻ڬ2w3 ^g R>PJ|t_tTt^lLySDl@K $  GsE-wD6?N    H \  <'+Fm /%(-*A{(#v`{Sf{H6d&&*P7$c|) B:R r _l5(nX ;UtQyB@ B?@,LB(T>cv"(Z+y)#5/GEO? H-H;YUZf~$_I8%x/FZ ?^'|%t{O9:lmb~cG0O.,\l/#Bk'u 8v%OZ m>rGx?8B e!T""H",!#Im\a^ UHB"MoaA EGGcm8  $bL  LP ?~oe}+\7b 9h Vl9&K2uڳdsj?pOE5"ߦk/A`r(#;CJzD% mo]A&W+.n 8ZSdD ee "{Q~^]u &>)_(hm#SC. >s|x YET:~LdkLrj;&G@ Y4/K (t5 wp f b hk qw>sc3KX1K{[2aL   WCtJ]'V[IhBX{In;AzFY:GxC B'O!RVBfx_Lrl1 9Gby,p*pk 6P$ e#۔dۙt*&a kc@ ', Kx 1gz p 7 /<m^*5H>@2>R(y   ~%\5AF!B7-*] [%:[{,_ax 8v F0 "&y(G0':!WAvzU^';/._t: %_.#pR  o"ea\#;[y5IA}{N21/J"VI{J!/56 RZ QjK):*bV l M afT_'E4*mj  "14z2E %@>D? V+O:0>@K)b[$ޛJoBsv%Xa5*pA3I0RoTMcd$}F (.cT` yo k ]}?zhB|  +#|JZ?.,k<z^wp -9#K%(6(%^8V\v)=:yhasB1@dV7_{rtY/yJ)n,*1@$x,(}7(}C6;moQ0`aq&&;0%)YB& a5*! x#$&$!AE ;jCn=Kx  q3B.>h_ j H 7F:y;^I7x/<2dj"q;JTfYl 6O%>3[4-lHwZQ2 s ]ށX3;xR{D1EztCs^7ini}'dB+X2Na;YbM@U RiyG!W$" >7zgYrm-IG@T</wDYP9| q U/ V q ` {  %Z 7 2 $ # 5  4 og2"]'O#?9{\  5 n -G*kTn}Q-A6WU8A-;Rd5OW)a,-q:4 T`d]{cXB:D 2aN H^LkEVDc b1S9Vf @5'=='bO3czi(%!mF k b Mz H Z;' + vf8]O_W"@# n#2!E  8 /GT1P"7( .+2zO2(4/(*#q7_Qa|m9y{ZmH\% kj8T]r!^]  vN6ju/+op~C#,abml& nJqJ.C^>pKzk_ H8Xa <`/w wP7%KMdB;{y ? I*Go5  akrI 0irN,&Of 5u-Gq)_! ڸӕϣm>ղ.s1/vU$N#>^'O SVur\  W3A<}G lejz#Vm /Z?n"#"M tF']U4\IzZ&I4r |=z@+;\f=KFgmO,]bH^4[;GڪH5{t7z;t`mVQ9"qv{`@ K<Q^Wb2E!,u"5!p e7f@ : r J   . gu) DwCIiEj&y (N K<3_i)H0 DD   8 ]Syf7bgP*^A_l'".79:t$LL XG1qTpRx2n.N;!2  eQf=Hf&e cr `/T/L! w'c1"Jo Z'K^ :>4.*)Mzsz;jngk^ 3"Nw`Uf5b/q]<b m R ,c]'~es6 ?YF$9dAQ Xgq,A ; |AKGD?x"*ujzI4\Pyp?J1 2HvPi#4i*/(k6l4a\N#-jmL,bHPs!) | W > 0 +_ /% < U^z.Dt5 =) V _%OUfm9(W: Ru o +H7S~R(8 1 =HqD^ j'<TH}|  Vk+@&Tl=,zP 9L'LB b;E|H w&`>}dEq >AUrr`h+ jC  W   ^cxoCVR!+p8m z iww;ayO!E0I\ l Q i*s! N K*OG?)Nr/}Km=mFߔw4W;oعD1=19?~G*em M | "  &D  i  )toR9 b\&T2z *DYZT5C a<ME0unK u 0==n  9 XoAtGmQr(Gb]f t5fg;au<_| i"1I9}qO^ze(\3}OW6#mQ X ':TTE.z-[J\czZU H3 R=e& * .yG}N2} z'(.M!!)zp     ]i  C ev7+sai؉S hL4(qhZ|1-b 4Z>}ac{YFb&JI\,BgGf.9, KC0k~ 4 6} Qj =LQf D7?W"c`Erl jn@   (]v"z[=Jm$G*a'W G @]u%Wh%s>< 8 wo3 \ y] 1M>DUe rX $r %EkFiav p}zY%Bgq]<H7iz5@blEMPXaA/. +N;"umv0Nixl<: T"zG0|j?9+(:]P=-'Ews,= =u:%)p0~b>H%'(u   ;  }7c/I2$& <; dO - >O3"g ,Wq3MW4/s4 zrL 4 KV@!nO CqIb J{e~OZe79CA`=LBvQ\wuG f\DCKNA' YF+ DPdISfb2  A %:X7%P*KEt 22+h h("I7rY.0],5HB5[ި);ܓ[ۃ? Dr<>#|PXN^ݬڄNڔh/ߝf[ !!"["a "a&p'f\UM27=fWHP R',d4C{WV!Me-v ]Bt^,Kr4a3qz7wPvTr}TyoztcE>;EJdT28m:%JCQ$V&:  ! mc 0[POu-7  # q vzH^WUZzA` 7 -o J7  E  AF!~)[5{8B'.Q1+::nDTjxlB,V,}PT)i7:1!-A@"q-aieMylBMM!.k`!  Ly$#x   !eU%_ , t6 e  ec9a Hw?{O5bb }7 ]b-&W|F). X9{ $ QOs/WY=U Bb  T+rAPU9 p_42tR,1*b.CB&Q2 h';ti%}v:71P&e r9z=VN1\;_)u{YBwh1-^ &&x4 +=Kby,yy z4 = A Y0  P > 2 x  ?\ ;@ m&E w7jmQlfU -##x\H*b\  ,GHjlp9  ? MV9{TaOjQ h(m>I[SawuQLr6E8J]y ?BofqZ9: { Hj(# F_9 *)  ^DH</;;4- ^ ^e t HLQ %  P/2UK.]:no<y$c/mn_dNܷQB+!RGe  0rNJ%9ag _GF91q "'}(= %6Lx Y`&waI/X  "%''9'$!d8O/ 8j (sE> z.EUtc5C%%:;kFB5?.DJo4o @k!!$;Uh * 5=:!)jp:Q x E $0k 'wU;DjAa^6j}cs:\5M$ g޶# ur<[LUg~xnKsQHn[?OePKdjm0D" ayw%8 = F o F l"jmb $XjIH|LUb%hK8g ;/2ps[L6 P $%n 2 /xr#qD>%FJ"=(  M H!6>;Be=R9KoEE9cQ\#diC. U#/Aa:.BFf2wu%4t#Ice3]/{l8+oMO<8oPeYcCd si@:8oK@`% i 4cvRnTNCvTe .y & ~tI j^`1^ VU S_j.Ruh n- Y \K2Fj8: ^M > fWk;.)nZ-5U!Y(f|U4 :2Y{7w|`!nC>w|X(E:ځ@8 tS)l*lop 3U },1X E l$$'*I)+)'S#aZMS$ I7_%< 026#$p(Qp >%8sVLfB3N%c:MO/3IV&)Hh`u@P3aP e^ >PT> Uo guvr*Ds^f : X mA M q/$UAT S eH  8wt71G?5{U6YCLt5o U   :AlZuC/)qU2z:ApzK]F5v).d&;`rj o;# L W$ ^HVS:6|R$r4#]WGI*`XLi ]7i'P<z'ir0 o mV{XS +<L#%Ii 3D i!QuY 2 t5 (.U3n;[ncJuP]c" 8 Q 6 B/|)urt67P~$ily4c= 8]GS+a&y_^wn(YM'e'()YEOOo]@`/3xE Lh7)5HCuf2F'-$@I:R]qjd'mO'V>7m;A]D?0"w E27a 2  V i O H ( Pl~mY0!~ 1 *'e  0FG{M  *]w m 'T2 %3  VF.,uhv= [z E889qG4ar %+ZW3Go~w_<F { v eE a" m\'1 c ' kMN9wq& } \/^`Pp&fW~[*YohoabL9-%*0WB[xxKdg{W u.j7!(Gv3Hg|D =k: ,L`*`-} Yt u" &b]'ti&>$$ / t ^ BdTOd8 # P(BZ^ PF  L |a : 0qL -?v7k(=n;W(Tt`(PwwvDOL&n# ^r)BG6_ ' u 9 Ck- G, _& z<gs F gA] Q q`PMo |$q vMGJ#z;  E  :[   N  BMT`62G46kf?t%`^p3EqZKu= y{fG]MWfIh!*n(:a%(z45o{i{y2WA3r8.eR \ R w hQ  9q79qaN69 _/N1q v" Qs)  t 3 r S ; ~dsJ0Ng 8  V{ &[ x 39x;n EM65Zkc^:^ d?u{*@@(2DHerH[%H20e Es%IMzsu 1k6$:HCR^X73rji mdic3j7'n? %Uy4q r '6'q GqTN&\x\6=e d=g[;_c f  e E@AH l (   > { D KXNw  1 8SKe L F 1T X9 L 0= 0 86 0 B  R-o=Hy\y-)m@S;L?M0PDiz^DwYFI{ 9&[mR 18QC%j+1 ~T1R 1-x:c!$ a So-,j rrU3pJ"=l)<LC>1yxsSS:2r>_+35mtNݭ`a6ݒ&E.leme ^!` j*(c_S+0K  sI"S$%$@"n tym=g.z_-q1H  ^ ,  g D V ` a?qVMT\ZEmn gm#/&+9 hTCqwL4:0[* K JN?'2)!2J|i'6 ~ r vA/vn.8%*z6 fbY?% O%l`<}@?( l  /Uyt:Np  }y`9 D YI#Vp D3BegO rdO-y`z2M6m  z;,~D`KMZ7 QEiC:O+$Sc]`oS+#5Y"[ClF& Kg_qhd^pZyJs>R  ; Da ={QwZ@JV7+-/\cj$o 7$n&AI]{ly='I1a  oG5k %p!g3sXP!+B9r/CTKC}"\+Fg=. goo ZL+"e?$ tf_Pl2?PVvMGgjb>~dp*KUnobc9.mql IJy=A@^TZ Br+filK:Y6 x wP;rq}qnQ5  $; / Ub( 8  :? Y tE! dP%JZ K x H M 3 1  1G b7}"o=\cp`:; n*YawnhhfQ4Xt ( !z n%N&g "CH?9i#!\U %l" NEMYY.o Yh>{fc{U$f#tApo:|'BYghdbfGu9~/ےC/͡Zk~TV_Wkl_3K, 70c*w $'lzl* $8Ff 4iPf,\!2%';) (f&#,vp 8 ^z '{*4>" j&U)**F&%}S?c_J~݊J^w}s!By^;108G1x~6$laL%V+: \ <[pc#ff@ o _1BMz7q56 N\T-*F 8E7},  B VE  ,$JsK"A]2<!  K #     = sj }:3:OeN.wC.^ /Ny_W2C;gcilw|t[e2bK![ i:KP 1Jd:`lg6"M _mac{pumF5xVgxMTe *  '6D=  2_`6s Z0=f{X^wb*+$XRx>PE\[@hQTv@Fgh-$ .  T  >k } ol'YbF)K-)NE b%aA9>YXF N?dSg|iC]5J#'7~X<1J,t&Vmw1*$ecn y[s m:6~?M QuTGx$NiD1]G3 p1|2SindP;/3K s  4Yx8;J%Q k W  !N0s mla *mu=jj I 6Y<y1AI ? n]cG;" w>dK&'~E==@ ks }ZHt]Mm aK 0eBx? 8?}!f4tP&*#s\J]5A!&peɔȶ%Ypo~H%R^Cq ^u}:#p>  k! P$&'#)**q~*n)V'%!!SWg& * n 2>w' iw#B% I+cI 11\('OSb|(myHV5tcKAHV%VJ2^(PWk  n )UZO2{Ux@ +wGd hC5!e"s": `e'B =y  ]]-,~Qx  k= 0#w\J$ tnG6ZU5 G#+g_o"o.*GB,=b/\Jm V%uX |{}@qR#STd =r%Q TJ([_)xm>Ox,Z6Np437R{/Xb$ 5D w> -GB8raެKͧpk1{|(yQ ^XtB|}Cb(YBt V b  ?2|WXW & ~aNcNNzOUcrKH+8s CX)<EgQ pzq(5B0?)N<x*H_huJU+WUu? rv,_<gjN(=^8 -vyY 7 BGP^ja RcvKpN[PJcc X.N1%t3{^*JaEb!KM7<qM28 J9W5J6 fM[=q5co~dm_[f <TCj7mv }b`]ybS)+ K/"W7*V2u : ps $ [)d^Lh3z . #X *m|Ry!:"z Qe #Z ew G V}i g -_ Mj % c i %, Z & |1~5IIg5^ZipeK I77l FV  H aNwP ,SdGa]:,/+*3A DYo| }rd:ek '73ve |L[dh_@K+("5Oir }  P y-F{h*l˭XgwzKW~z# PVbE.A*lki ) [3]!@xdZ#!Z I5 1zLwBxll Fz  *72Jz pH^ HueX NyS ZJFZl S!e eh } J}ZWz S B ; !_p %Y _t8X{[T$5 y1W'K9 ! N* u ^*iDGb*eRp+8Z>k1 '*q~\;>|p1 &;#6NN V.1 57h1Q=5!u`7UG>%r)A ]w) !  3`h$B g c u   ox  R ( D. )%UM{&,i=jO  vGGUEOi4>m L#/BV-j. jlfQz'CY>QOOXKs ptd!Ib9 zu?=u - ?@",/ai$l3p3ue< Q6< m J 5  = / L}3MDT"mXR+d%mb42)PBQA,Z9~t}CS>.|#wK%UEe7C/M:ubx'[t!%>>SV?e1-rvJB>4 11_aVC(zV|>^Qj*t3F  *d X g ( 1) )  f  0V~qr>0>d8Jp2~ jk R 4q ~ U<hFM } * A# [ / R  suE$ \%Zj?dQTIr-{NExEt jnMYm j  &T058Fnu  #y[3W[s_HFp|ZS(Z#m~%Pk_- N"2Y|hm  "%Rao'C#u)o|  I  : >  I  , + 4I^5Q [H  | l& R Z z!QRzLcFp+.g:N ~ f*FG0I `Ct5$`)\ }<5wTv&b.qaFM*3  jy{;#4vb:w$`dj(K unRgIO%Fcfn Z}JE[ptitGy=Q+"zr9r-o1> O2nr,#wA UiN*eZV !V;l8-4.=U}P~cdPaEF&"e2 C G nt[43lfdHtHluuea)M-` x % zhIAd/3n%q e j y]&-fXXr![~ "mdc] {'^ [~ &t 7O w xv4wGg6dC6).3r & w "A  6Z&A id}9K wX^tm;cs+RKt7*w|C(8%Tџ_gcXFp7\>uq\z]#G@oJ  x R *:Wa<N8#  d+t   2.^  m*Uvh,.E}] IgX$ke9{[}f  UCUOV yala !DzatvYHVF.> R'C>a Z,L 18A?9+[poK US vA2  }8PYx}s<+ylv^%NBD7YI:CL1J/oR7i!W:0i 2GXNPre pRVyo+ %?w XeC81uFaS=p D W 6:5?.r   cG(*T 6 a I [ 5r 5: I< WD${d!uU-OTwfr  OuE@ - -5~RJ|:Q1jy6XE\x',b + iy}`'df_B3Ek,s,x)x5'v$ww wJp>#K%u/uq5-pE1=nw0$}<KtY+QZBR߉31l>+ oQ~}`|w"R2 p'7c u 0 [ fu S $N 5 K / n B ! lq , :(Q 3R - 8. H Mb :$ +RF~nve~]) _ &\-   Tz ' + y<!A#}tj|,D{R^XJ?o4y5*=b1h$ o $ w!xZv: PRI)^/88b&F ] f] > s- 1 -*,5iA'%c||jN(S:W3%-.,,5Kq .0u`3Zl ߆u8_:i,8B:,b9E:*;8R 'ne/"q v  E o  n v K) . 4 $F%e 7g^x%JgrFU/ /?% Q R 5ir | qA =e/x|s r I |Y 7J[,S)Fv%N |A  k o ! n yz(LVmiP;'p@V[ jA_@MX-7l <-yy.uj>  "  lr~{?E %Sx[hZuW4 Y,B Yrt~SL_-{$Gk 5z0`&|~$vSP\<d7cq ,`6E  7Lj&@BxAy% #) *(q|~ P Z{ :dUz;9 41JDa(^x.^n0] g h A 8 S_ik dm dP^0ZcIxn@ rPRV:Bk% ~uDz|` ,  @R\. h iR'" ;BZm:  e   6 O(zRsM >&CXi~q"j5s{LzUWIZ~&&p}se`B+* h2;*wQ(e~]BwzBsiDuS?Z (v+G"3M:Ruoso  ,q , 5YB  J !V e  9 ku " ` ! i f y 2 ) u q XP LTt^Rn4O\~ \7s& C su-  UQN_4%TgO[ dhpJ]Ch^V I=i:=>L>b E Pm U$I` =`pb5= 7'nf$>O o:+:jucPO)\ a4L'L,rLxnX};qxNG08cc%mrphwsߦݷ޺-+WrQ.O@w(qAlLx;- KN:.{8\j(r mv4   . @ Tn& K  =f z n} 9 GqNr1x,R ] 00=)h^O Li ^@ ~  fZ h U Tfze1ND44ae W $ nR UU9yp Y7Y k4 6Q!Afji:ry#T l P  [[  s."KDc  w"YV_9<curX[3` 0~>l5\G>SBI~NA'HAf9YrI%zvD a&~z3jn6R>E9 KsG%wxN. w 2]lr}M3 y$ i_ %vUY^: c P Y mD p  C ` H 4 IsLx xK\>z g&:!C'#"zo" 7| i/4 q@mM,AwYZ7?wG LD'[ =LF#sz080f8uJoYS]2kCY 8H0q7w>B; g jGnQZ7rB#w^% ,V D(h}Y0D2v  <WFrZ': s 0p q*A4o gMl 3m}D6& Jl9qe $ ! r <$lt[~GFz/^X#G4]~gA >3}au\A~cT,5YLu GAe0zd%kBAG }$gFZW *c<IKzG"%J ugT*Mv o SQVp  GN.!k5%('vR5y> * 3X]Q>Hr y)]86i/7p<4:[KBI ``XYA7y* m*;!lVNnhWkTL X;19inG  o YJ[E[WtnVrPN D+#ZxJ{`--k n- _b-r 1P^$sJ7lDtxG[a,N^.Xx1 s+ 8x]cNcQ o X  , ; hC x,h~ 4&U4=I^!'EA HdDfQ*|p4ޥ3ת?Р˄Tk_kZ _nne}{ S=9HKt&>^)F6n,av$JvV3 o =rVKLME,\}/4hI3<|gks8AwP 54z?6(mbdn{  q & ? 0V u *j\(d#nse| JGt* 8m0@Sb2*814?\S*}"p9&IH)&Vd$I|i#@\<dUcR ctO@sV7jLc?AS*C{}s?$R6vsjA%6?jEEbAd7,]%i jk$% o\\Iv 6_ dJET  ecw4I2V}qH  )T6n* 0IcRF||%F^{RNC+MM K'm'*-cq3%,zZ`1. +KKQiCS, UQ/D9RP=Q( ka;2!%LynS s0 Gp^W(  2 ! 5qKoZbdemP [1 ?;OB   "   @^>+1*3=cf-Q L9  )EgY!_Q(rb yInYyjBdp(nPYxEzL),-Po 'kA*G&r>u]yyjt$jW+9%"v3VPgP8   UN7DNXr J o& /:{\d]496%G s = H a cNl 4H U 6 ^ *gU=\h+sX.,NoNQ!_J# mk/>VAjW*n#}S  8 Hui1 k2  D<]ud9]}L4%ZWB; n>q1@G@#qAExb=h٨><N6>ڠ7Tl4"fVw]S{ 3mi-Z51^)G32@A=R= E| T f t xkJ'?gIRQ%R~7dtzb|:cfk7/`4bE<m,LF? !^"TNTF+fa=pR ` ?  lf"XM] 9 $ }kQQEd< Xd @XrEh`W@0 5rj4k nmL5!pB"X  u  H 9a!&_ ,Bf!PzzG`[h,1+.`f`2nOWm{iHPMy\Z{g(S}R$Pw.2~P$Aec' MY*} F 1Ijd G "| jX )Zpeo)?tcH;kFQ^,u|2w;-<8u   TQ > 9s h  / unAr+md8r(_SMkaJ" {E]#D b=we6^v)|tj`bZL6U;L_!V DM dv #  \ v|kIPB} + {u Wu-KC!g''z$ "6BP#!1Uu[(3F AU ; F }jZ H [>XTIqcYqigl'"[s1 8u(gys_R7k*2X9]Ny<<vxMAC8.X{=24@Qlcs,;lmCvpOQ* G ' c  ; O r  Ao  O -/Wo!$GCE@N[wt E9,OmVXax{)i|Gn  D@A BZ-YE)z)X7I9N\   # 2m$DD,vk: : W @ m ~ c5&id5 e *[&$S%qXgyMY^R}*2-n_C$%$l>]AAo KzN!0S }x8t{% bAd=`^{  F]`?T># %  O j(46,1TS EydnH*l$QF  o  pm x`:Ay&  z!{O45 F  # 4 ) e O 5 v? 7eVc 5 TV E3oR23}F #`Fduy7pT$I@y2P02s~J-+#j/dMFtN  _b2?w:9v/YVE/m](v$~s/;8<98j<CH=)fDQLw` 7 Rj|%1 TC:~JW 3 eWhH#PMgfS:H'%u9`eX f $ AHyo ^as;8i l9?24lr[9 XpPe\T.!=~J;.HDXj(IKMJf)7PsP% /NgtF*#R|_YEb/#(RF(:ykKaj\:$&\9PBd{pPsoga_ W RX R X" e v   r  e G    uI  9,yKn?YV:!  @lrqR~CHgd3Hte932w  {5oS & @+$WtqM [.\=qj6KE j FO +t" l#,G 4`MZ t  wzj_dE >  ]h   x a6RDaa= {+TOVHAx&q >>VKbKNn/=p&I+}}X([0v~8iVl[FV`E x=IBhq:%wF\3IsALy^mA%h36\+$TTn! - t` W  A txkDr;q7~csz(BS4A&r5sEd ~`RydDzrw@sWvD2OU:~-^#am$>V!=Q^HMR 3m ^ w~ F$8d  M W L |QnQ"H^#`UEq;=Sg2bTJd^o'29,|ga6>peVXnvPA o,jL1w.T'/Cc c[?OA6g^ @h1d|g  ,N  ?8l7n>[np0I} :eRz'$w)Rmo{ rN#x Y  KS 'G )N)gqm<A3z; 8wCf?*-3w6xkt  bnST up0Nt(ve Xr6fLT#e{x-V c t } * z -Q 6 ] Y  a+ 0 fe o I {zU(&:}[YySl<.Qyy:o-9Rxue80a[D;buR)*|H48*9Pbpz~uNc2Er""-QWP[E[}^Ucx *'>DuX Jjt[ 6 ?Wf%/0kSbOR%e* h$9"`P5s4gUH'rtaV$7vN C n [C$Mq-FfTu# XRNz$F #   > k  _ B h  C V,FJWg^ `e f z7 Va{nJg0ohZJ&<0#%Ot ^&uT,|qr2A1fD WPD"]j' ~4O(t i.Ahllk L]Y V \ 2 It`s h ;15(-'x+RtDucq8rf&RT5 `   "  p{ c.Pnq}yryuH>d'! : UX==H+2jf[Q >6xkIC=OR%G3|N8`9F-fyg$#1XcW:K^d#]D#Cp[ K?EL doa -V }@="sWqGAJUbh2tV2`g%   ?'C1.4i<cvm  w p   Ho|X/$,.n~` 6q: J K D rN  u JF? d E/`; Q< |8"V4KB \|O/ #J6^V~m]>]:$l)  K  $8_`*hJQ*%USK Q 6 ! Tw&}}{#8l4.4pKY|G#rP Tq.ffBZd~&_j"J @ZPd*_+` '~R 9 4  M syXH:!Y j] 4s lSk;eXm|SE $c\_s'-p,jl J6r|jE8{C L u(sP,}@l d ="" )) O~[ z X 1}A?0x$   f d 5\{ \Az7O9dn=0l9$dEN@oO q6)b.-" !YAyb#coG8JlKE pWwsYT'g0yJi& q%s q E G\}I3j0D{"u.:H7z$-[e[N.;#eN?8 x g v - | h  - ;&5! d)nO4]9|7 ; Y MhA- .Gy8# Q&L P$AIiX'U 8@x.a]iab-c`D-1]"E(}LG% 9\L^[kn dK&XqQn+aYP?!9m^l>_oS>   Fg>z1X?cHw  k Tp Rmg Q     4Xy" Sc8   66@(as 9\*: L  p  }   $ - & <  K D D}IR9)L%vsO!C~@l@fP5%@LJ;$vYbIH3F8^Sc]WC h qo  8 T Q 1 R`qC& ,`4J2`i}djy@ ! ]<^<z\MHBeF8@^n|RA;B|SgxyPa)QNZoo" Bit}  :&RZ' ?  xU>&#A%`gZ+o!C>[vYZEb(H7I@G,4XykF@VYsDw < h ? TGeP^ Z Np>Nk}r>Iz 1W* % F ? HoG#o1 # 6 q} siQ2M&*-EZnCet' yU A S b@ni3+HB P][l s+FIM>1)Eu^ "!rMeCZ/N?>' }*+thvgs7#bE3sybvn$[.uufP<0,./w(}rJ;l9r O; VH  t& & ; s gL\#]N$ X ,Qz4^) : l {4m,* v~m40 /N-L2|/S}N_^C =3YieWeCi|7HapF6_L};kuRx7i "r)%%+ y!q/7 6+M]T Y&7|aI<[\xH 8fC)%88P> @xR1xq $ _[uK9E dq  :;p 3^/!( ns?`=t _ P !i: [Vj  dI>W rI Me  ? MP  v+ Dp *-NGLji$"' Us{ @v UfA`}v}+JZTH/k1@ Hus z;    | |\ zI-Z  =weX##"_'pq leN ]Rk$nLr|>m4|uHr"8R.ph|psXF(^G6cK^6?V+H`-Yi~>W"=I<:~5m1W~=H-dXpq ^ <Dt$ ] QcTIYPGq#  z $KAjrFI Xe   >{eUSw<kH(" 9Hl/ xpF(.lW3;yx $c 5y FLE~ZV"I^#r"[U>Olh"fI,ni ', H a f M{ '7 0}] `^ ;P/L7I` vZoA^pN C; u  <r_D\{K( _ 4 n ; A3 " / b@%g+Q|d<B w U CHTgFT"M}bJxRI~Lv<&jT7g)cpc7 Tps^T;8%0+Jyz6-0\tOt_65hZ 2Zozi'kw+7<!3D/!\=8d  RH_8{9_#vAJJe=c], Pg C)srBz0wu;    Le ZO6 R $up&C1i W 5 .%yZ@9( 3d-KfQ+\l[[^u%-m$3!]yp 52O. h<+pAcZR,>GWb|*py _(gSY1' A24.2  z' O+ F Z H  W #R D# R I *2 k e   4 u c c u, * '<. hNU 54y`v98LS|sx`L;~ ] p p1 _ ? o # B f:'W_Ar+x1U&c? ~k q|6*~ 144z/"lFN&D P og"-Q>;>j}/`KL]Rw|m=$XdJ/_W*,o?\j%r_ qY)U{7* | vEw~[[x f&/.|!cyDMr{ f q2Vn`z #U-,+%  R-ycV*dfgtQkj{t n4+c Y(-! sZlPUdu~vDVd A^p)o]c<<My=k/vsVTcQDh^D_Je3Xj+^&hGD[7H z;|Y7yuWgEZtRf66uCZ!p fx `W(=QtJ)&]CNha yal7611P= p tR1+  wTI+%xdP 7eje _ ogp  *]w/0M4O2CKE 8 + P 5 n -% Z i7 a NL ; 4?3 ] # 3 : kr pA(.D17>H^iyYJ&sNH ?hR{QDdH)+}REPmi8 _"'G*-18@\KaS8VQtBi* SS}aS!%fQp V  D ~ O > d% qdb 6[">d{#D&\~RIm#4g"[ Q s0 IE[mz$Fs/k ,>vN?n|oFg9]ZL3}( E0O_7{Ukc_${bM5x h ^[f6Jl } fQ65sg!\xQ2/`J)jp   dQ / ? KND)Y_3h]8,?>m|XW +#?vp{PCq4 6hj Y{\X!{3I$Dmj>k;waVz"?vB)quQ7%]4Mb,nwAV Q4hTEu>CW|s)GVk c >  \ J ` \R Iw:Gt2=75U/ .Yt/= : pVP (ni~M",0j>vlr6?(ItT[I(]v+yR'`2dx{w5_NC<2M`r,hJU3-=_B.?5a2vqpyq/dw0 U*nr#m _Slub-Blhx.#/!QCjBM)z'Rj |+xoD9.^ ;% h&a"# )t"? <RkX|Z#a c K  %t 8C E)N>Uj[cikeMQ+-BxT: Mv(8-  zZtyTD  S G|<XuUNEF|_%`UE1`-d3CW 6da/PPd.Mqm[I9\- )5/_l=\ gPtuE?71ym'.CafS$G?943 7&D^KZm Kg+M9|TgW^?J@> Q DS$v '.HVuYWxSPPRgXe{;Tw_~7 I  C O   E  h{=/a'D %Kk< #&')($_/ k ||8;yi_IFUv  +4%Z{e1`AJNLD4DFWt,6/ Ld.r(].LDiPd(#z@_^%:_^tNL<@j@#cM6byrW%mP,AObi:z,?,z#VGusO; \I,QKR3!D|Ds:KtEdWI cSz=4wD"t - 9aG &:MGfcW %  O(yp,j#Xxb ^ ; k[* rH ^R,}w9DD$N jEfpn3 ].xV2`p5ZC77p?P*gB :b{4j7'va=#5/fIAN}(0> hs4f/9%#J*1-*^,H74HyNc&\/N , 4O< $U *zV_>|d.Z/ 7 }~:-08)E.^_!1#m"_~VWM r&~^bZP@p|"BhhIzY*t|XIDC?7& jVE5#_ypA[29 bY`#q&@ CgcgTy7. p N\ 6(%)9WX;GmUY  D oGM :35=MDeg@A`ok Q!P<x {i[ud36F 3 n>Ml$)t&^a  9   #Jdt^>i-}jZ%K?>i67{F.d n'QomsU&vD@IIlA4pK!rtkNz \m(@,`:c<}c[=!# ' E69"QG^|@M y: - K|58 Lr -Nw-] @O d#U=Y = iI?p{gj ]:M=b O5^_6o$hVy%)?gd1R(#Z7/dGu9',+b2 i\Nj\1U09ma'uI%  V7![v=lS9^W6< $)a 1[s ` ,Q-%,ni2a;3q"    P.  ( _ C A [ 47@/%gC"`X+W"pFY@jcZ-keqSfouv5U>H70xhQ<:Q`X q(h:)u7A#n,>*^JP8{Ec{zc  -?)^U\$ ' i| [k^vp` ,?Gc:s?{aOiIP-`0q{8xa33dlF>L fY!|P$Pzk~{;#-z:/}8i+lQ}X?+t?K[K R z p@ * /= N  U  1     {wK1kCvI`53 |h dReVXF3E; HW~+,~{X+MWqWK ys"L& ?5 ^JZe&r};v#=_3cH7sF{ >I3 Cm6; GRBrY?     I / Sa n~llyl[K.>67BTVXt5   b 3KG/  9'4.m.`&lRg'>ImH;i"LvJkl$~HXSdY-3<]PG 9?uXXA:{mLf$YnY.)Mi%5S|p #sV z 7 6 Q K t"0 X 9 6 Q *?i;Y@Q) U  ?~V wzF   I2  T3KP?  K _m # . V v{^>udB 0/&%h,j' xE%4uD`\epxs-e @,`D'o|2&AS[.YP?.%onU'~I37=00t'}MH&b)7 $6v2S :cVM:=Jn5GCWud4qx6n2/&2>[t|\_&  P  'f5 n,{{y;VR=i Ko W6,s-&$hQ1Whs ~8M<&:"\+|r Msa 25hQ [SG< gDO-~wJ*Z~IM0(15TxnAX2GNH7!XU8zSc>= ",J )Q|Z?<"# ! nc`f% v  cj#6366  q4i!"i j&'q-$.sL;Ld7V]4)9 _F14[-7}Tt ANAaFkOU- >M5f* rNfO%?-] NOP.KI);  s / x 9 Z5 u  B d qI k}Xy\2&^NZ Q5|y;A  fl ~zz=IWA`x rAy۶J0g֗ ٽO ~LkDia; }php+IAP1u xu-xt!}%-(~*r*[_*7(%r"B S " &] AUxZ8 ]["%Jp|f7syR:{y,s6j#X/)*vO)o +CGZJ5J >iM5 2 O a)" xCa _  Qb$aG!Nu: gWa66qNw1,k@nlƿmH{ .J &`h l@ ֮Ӌvsd]YSrH6 2v}<@i2MM}dLvw  e{ >8  {GX3 4uS $\=+/0,%%Aa=! DZ hl !0!h.096(  #  i/ ]c%a``  B l~6wW 'r c _ `QaN]zOL4. /Npwp7o]_19JNL"5v"~t eR' ?k*z[,ZM0 Cx O;g!3*R5 2'Eg+ @3Q0UM#<'"a)'s$T)>hQGmM f  EUzDDT1  T  :UtbQdl34Tf g3K~WR`jwny&_ o < *N" ZYdYY 3`'{2>#iB#Ou9EQ/<L-{<HugG&Ib8)LbOٶT 'Tb%!ۮIP v,r,sF TbL X  2 eIUUb_w 1qViM: +jK"n,4&8(7@1xK'K> s-It& :8@0SuAVG}W?J& :m 2g9D #At5"#AI@-`K)6gg_=J'!F e} u}H=Al6TQ^ K41F!A"+!Z! mD&RyI7pO\$ ampd ] ' #C g $00mWID6HYW qyՖRTU cqc 6H3i=~) Բ]ͺфlrW7-Rfkf]Z by( .Sn<x!`X9tV>Ji +7 J)(p39z]:U5@+R:%_LH Dd!|$R#7"07!A}e& zE/ >L7o 'hk h * Z\ x Y rV N.  .z(OvV >] ( ^r\8@>^Zk@2 { :X xf+>3"<Nf] FWkq E) 9 X=JR;Py 9>4z aXlaZ 6J O`/   *~HE;^ }l},K6n+fQ K)0dV44/~a&Bc w4jw|Wl<68om/ EomiHwR0N_/@.x'X) FhEE@wj m 6%Yx6XL-i!bWE  L"" HI6k )sSc<fPl  ywo)\:}$zPW[$U2vtErhءd:o#,#.?~s.%G8wEfw%Աuϊvͯҕ$CߥH@Np5Ms]y (*i; U$6%I zk X!W!5TB^n'(1667>3M*jS[ ]5J\Z SO6!C1BNLMH4  W|Trv%/Wt~nLm G dVP+W v " ln9M/!NX7ccEoy,  0  ]\drU"tNm'{%/;2F:Ug6:yNi#Xj.c`JJ- k ]Lڰ~W;sH ay[  _6"{3m'a)= s/P/t>Y1  s SW5 #E (E\tCXB 1 %U#a55 }c*#)/-}/,&#p_ RqBH]ltX VT{ L!A!h q%0 F6F9g  Xy^W9,;pv!4%*r\|4dBy/Guw  As*ks{  =z74IubBbs*km  >  K bG=wXBP==j'c1Fs,Nrݴ m<0/(n 4p ] Su"V@\.])">&j\cz3KRq jw}# 5!"!hug J\ooo Y~S%I-74896a.+!S3yW& jQ ` %p/UY ^'HhMJchmulI* h}zaEe^)>urP,hfg D:` _ ZAtrdUMDYtc " q G} s y ,!' WMaE0. g )  9 R-$KA+.Xx &}D + eGT]Gވ! /x%]V=EFVd$-SuN@MaiF<} >R_g0}[+$fV h#z)y+(S*%7 ^IG"b#|3J_4Z )=Rz Q g D s fVt8Mq&Qm + f N y /b |HME kr0 *- d 0y+\! 1kt/:-={lI xEa.6|z,F0W{G-0kDN)-S~m-d? 'kQX:FaLswT3# 0fbJnCuL3u:5J@=,>) rl G o i <. B0CVRȩ1_G\ba  L4 0YSbPG y :q  2 fs5gn@ ~\<6    @ # n k$&, 26JP9 863) 2]h{%' c?! |.NxuZ:-8K?K? .$90IjiQڼ| 99In@( >03*66h]F<6~9y4HtKe ; ?q l(  u>JjJ Nv@bz/@aZH{>3X)0shd %Y5S  +2*WbH`|/UDJC+Wn@wu8(*5B2JR!(rmW)-^DYu7RFS_^.n$n RzlG &GWzEB}JJB5x_yJ?AA(Ky6E> ' >   ! ) &)=i7q f< %# MD@YM;)0%=h9}|FPg&B:^r!t"2/ M23_1FB2 EyX}&~N/o 0. ]{Y0>}ge18@U_%D} cMerS/L!:%0?@< :WX32[ _4nP I6Sf^ N 3 S b `* /W4\4!mp@U]z n;54/Of/UEKG;t:kG 6'N qd|VdRPaӐׅwxL){A#'v*,^4Do>"~edUrma A,s6C( $%!s >,<q.#U n4'{U!&]+<". /o!/[.z9,'!m kA 0 ~>vE'SYk:9E#87-t  i@O%O!`/D`]  I.]^; EN+B 1%L"ho[Ok %@1D:}i8NEuM4:0X?mL [HVP D: MkOU*D+!s!HII=}h`~.R>Y5~~RyYY \#HCUR=  5jMn)LI-/Ij9lN9S 5g 0 | 1oih~g] \A< Fxvmq z= ;P,QD ^KHQ *Mmr)sR ` irp 1 8j|8^Hkfc#`7X9 &89-Daa k] T u %B[21u$T r JjfbYqF/T xeG4 S : Z[ " W 7(5sJm~S H\&7q8*v]d]=s$B eG a9MG5Q6Fb Z8/hF JJ2T d IipK- ^bal$$*?R.k0^"1 1/I,MP'!agv Vk"f 38+* X4Y}+P/1h)6O$ <tik.׬:#UBX`|xQF7GGs|'Jp\tNQSEn SE:L;NUe1^ "Xk ~o)Vs/Q 6m7WEX)Q]hT s13_ O}Kffl`J3'+6@E_stTT1 ~{? i  IQ +`Courh9#=l"Xxu\[%Tc&IR~1Yp%T& PC Xa W5[ 3 @wOn ,cyM Xt44VZjL+p!a@xa#W +-i=, E;0B|Jq MJ"'vH< "WCCP_U7>zaB+2kN]T z O |v=U m 0U {8oy/ 6 U<"8P"QVcM d3-98  l ] g .  { 6 XI   XxwMJ$WdkR jFL1 .72<`,  = *=)Q /q!   Vp *!3me*hs v Hpjdfj81O &V9o"v]4` X/ylLGoU MeFޓB/OO?c.'=y=^$K[kYq7t*EV5Elvz\ G E T3PQ PZ . *:LjM-#(V,--_+'"oi ;?$ Et <fw >-+ ,lc)9U  > z 5s7SNsn:,A3apHQM#<~ 2Qzc>:djQ`!2 + 3(z%_8 ps  SUSja*tV5}Q _^k3GwD u4k3-wRLr8NX333,w  b ANToF+ [4c{+'[OoP}P1yZ.![yqyoFB Qk!w{LFZT5Q , z)^:ihU  9 D l  vS Fk"3fP[X^ d%Q+".@D ( Eg;c 7mDjfHNW }kuJ 4g"cw#q_ mLA]ez 4iia ]@8K; }RG7?cP=)b?Q;JSQp< IL [7 =,sj|,0YM$/ ޝ@ s]?''f&q#z#AB&S^QAq" `A   h_   Y8f = Y2Pp[=B'QF v}^42 A#5Si 6 V o f0 xq/  ^8=CA-K6k @}GPUzF{0IcdLC6tae-y +x c j r G}`?'v2 L1{)<+R:[``3  h`4hyrn ca+~9?g~i h   ^0t~Y"fC$VM2 l ( u k XkIs6ZB\8}=,TElza7):H_NH`H6@wkpb[losV  W; VcR@8IgS}%xKU %* ~-,")$t;&T4 -{  J _\[> 9 [ (  5o@x&5MzpZ W  UK'd!.>z[M )5 Nk/v`)IU"0~[8NQeu\|FuvX T ^ % E mj6QKT Gc/o-x #G7r\0e GRF g  +. c N e .fV=.*r e1F 0';&O {=8{!<H8maBS~gbk0)b=(E8;FV8#p$A};p_+B]w ! QD;HD0fM ~ 5PgZ;y 9 4 x/ Z[k D5?c5 " F J O|;oVA9Q.q2 E~Fb,L 6h` 8mXn@$M y % M"yT  hkVFB 9hr( u!Qbg 9j"1+LFQCA"'LIL{}SikZ; [ ^ w rv4 YNVj%V&G@l[z.l Ch PRj U/AoubRGu/ 2B/B5p   X [ JX " i4( !\N`T E R6}66 v/ {"F9c\ :NNCgJB>T KFt/{a!Xw^ 1*zqaV}V|jq=v]#beqn#QdQoc@9R~xY[Jj  54  T a  >LS -2 6eo  .5i] / @?5 BBWaA  Or`l6|a%~da; s 5 o } i?8{CnLiXe)AS.|HIq[[N]iW[&#+;mdr^(u4  bx3q!%)W,-',x2)]#Wr=7 6 : j@ Yg X/|X\ 7 @k u / < " ! fC2T'y2V{kw?I$oW VRFRwaJC/PB[ZfH M f / xp Z\QdH`&(.![m_  JB@ :D,+Q3{ 0dE#-5KC K R x   2HQOO |Jg?T-?' O. L- T5j+]<--MK. d [|S [{<'{U .  d 2 e 7" < 7 qpUfCwcv   Uki "5@5]m /   q " = e>IY.;OP$/slD< *F#kbq96)S{2eAO]Lh u4C  0 `" #V]QnM]ZhVg9/2"Uw,w0/K E6$:5 AR(Mo6zk=\#+nL1wFEzv!7./^'WV6~ CrD2PF_C~Mzp$_~E%A;{DiZPFQ!bv*U+f1  bH  r w`J.P &;0*"Cy >{ Y , sy:V{ 2(bhF?Tf:P+GJg>e;Td1[gT:R9!,/ Y 8D8 . k6-Zk } dn!hE " n-xh a $Ys3u MR'rz5y]0-c{1  |  \ |  ` P O|mp %" } E z: o  OrZeD h,GHb_n^[ I` e5@$qI.!+nzR3: ! 7K`F`"%G(u(c&=!<AX2 4 |5 | z b xB[]a h* -j;^5f>(dbF:!MhZjE ,NER9{d8Cp  av f!Ti3MJt u 41~ lwK =kG  Bjm/u,M~? l{ f x6 E<  [  , -$b8@aK{0Ne P  # y  1 UQOt3n c\CCyE>_)oe 9   1 i@V)rR.* ! 1!E^+* +<kN[z!N =0J?,S]!MmCNN?h8||rF)~RXk; lNKjU` o<&8,gk6d$XZ;{O\/I(ZN/ sU3GRQ;r C EdQ6_$r x R`s,qz"d>7,:%cC*2TX4lTf8WAvfc6Xwtv_5k  Rb{g _,!caMWKN-{7OY;|$sGNNQ }p]rO" m`z?b-D   Na D<fvEB / G*I5z3b@hJZ uP,rnp'%.4bRCeQuji|{ 1  @( ! <RL^"/~/AoO(dykA ]?S< S  u(@ km z S 0,(X/0$\,NR  X" 76z e w PA ۾x{n<8db } eZ W$#J .5i87?QhF<7ea!x)j~`C & t@ 9  o2 ig o- 6Ei@]2 [ \Nt'[ =Yn7|Mb5Qj[.Ua Ufcm1F_Gp+T)4 mFa`Tij`cCFsz@mP f Q2gRIu66YKg_'CwARG mbRkz1Zpvn  H ~ | m Mo Y,%&MPAY(x u . [ 9 l[+E[ETMQE U 4 >KX du~D*&.94-sUx 1zg{ o&n|K<=@ @&<8f24' %oyS\V )# ) `  7 >x7/ 5 SW _ _j*@ -[j_OOIsrP)Kq^1[]S"L~J v \ V[-7r Kik4X0-G$aja 6 vG ( ==Z s gv 9D   z  Q  cWWB 30,\k Bi!1,xW\cR>lL &<Gu g KI?s08"J\P)3e"~0"CD|1oYV%A   Hbj>f r"\ @}{Un(L9d;[ `"5HP0}g  vd 1@~&/ttycG,78xO(, x H dB a:}uQQR7R O)s=|%t R1YKj-Y eFc f|8F-p'MNb Lx . ZF a M`t'mx VF~ 7a RG @ xo ODC8`D܁/%VvJV"IK[Q;'f2 7f=j=&Lh=c* 6,PJY{} O   vy E "` g'W i$r%!/ " U!>O4@ O6 V`FiUF%e!7j/Px! V.m-d(A/ _YG; Uad;+m]KW}{O } ( U `Z^q[)+7+h 6h ] kO9y5 1Stw WJY+u9 DSZSpn ! 0  8:5H 0 #84Pqx^A,T`6+<G^tFM0%x?>w#,Si`*lt&NzireeEI/y7y1Nan%T>v)(p+b\xz}j}y&P(t5 R$',iM7FL! E %| P s,sQ%og #X) v Fa'\ mU_8 Z 8 6   1 JT  0A+d%)M7vvQ=llnGe = > rB [5Vax> .jZt/   4 \ ` { ;T mWej%T+)sh   . "v=UK5[ j _ J v%h )|^q( * c0 / 7 7e  = sKXx,9qWHJ1l'IMgL7$xFvVM'\|JaVV9SSt7:  |` F  & % + nUwD H T&a mq Zwe NQnt0d CfX*f} fBf0 &\79|P>XOd@ `-O(y_:R}-OH |D"4_)2[`I|*keuR5 f;J~N4% j 1 @ Q 1 2 'P It~%KJ1"4s>eG"1\f'.x~ Y 4<_>!~h*V]#d%GA# /Lf0=Su [  A) 0;)SYD@ ' Mv/mq ) 9{!R o fY< EO 7 0 #U^^| m - I ]da`uN1a K'( [ K n   {&c[Xv_u7+ Sft{l#l*l3#'6h 9<eUzl-/h/9<ZS-2p~OXi&|En[0gG  Q. y /:GO GhV#<$OnO!i"#$'$Z#m!\= YR Ml' %{wU  4 t?f{6M;A0(%_r$U&vc]=Gs>]mXFm~([5 \~m kg 4t;FZ(C  bq P$ j \ &U UU S L  uA,$e Z! j74YVkh0 +A,>N] ^ dao}oqo I7 6   P I  s w  %4(:WYܬ6hQ=!:~2enWib8 nNy}eHv+|NjfouYaJ _! 5~s{*+{X-B;M !x~71i =[$Sy0Tg3 34s+~4Y p E " `U~U[p*$6Ayi))|_-QJT 5O3A?=fj Ih#].4 YgXRe0*D4 Bilu9"<)5nhO}O LxuM #fRdRK>ߦވ1w#.O}Iy YQ -<AcK[$ 6J > ?=DzLflN7 )ZeO^!N"ti't3~h i z>u2^jM a .0 [ # fSG5XiH+N njZJFtRE 63q+  Ub3! s ^7_VW 0g|hi7 * \ t ^ ZgZ \ H [x0}Jd/sL )' [ wb-ivZ=B:#  'v4{}Q; 4-o BRBnqP {  n F  I X X u   3W ~dV7i~{fnLz]*,H-PH}=E"|.Z*=.Z 4QXb^g&G_ U?,tr)FRl1!<tlY;$kA ! \V(\ 12CeOMr2- _1cRQa@  PFXzz, ns % nl;! h$N?E&G [$~He^8$MYJd{W ox,CW]  @d2 Y5-(FwJ]7t]98>Gv1#wV;HbC< VZk:#%kbZa% ( a =d(2&7I-utugvuIC5hZ(,oNSc '66+4\)P]gc ;n  $ ,oXe:nG N MhDd/C\O? X 3 _  m_=s].wF1RfgX  k > &W<+EE\9zxz.oIQ$ 3| @r F( %  #QI|3Jra'|T@JMU-*  &l ! k%7hsgsrfhu##mp1hc* z<]9[wJJ{(:VGZ6 3  -H 'Z- zf(b Al` "X$*%$ "M<t  N*y m  s h&w+x/$_w[$m;dMutB+>],?!1}Ak!e82Sg F ; Pxg S C  M a8E Tk#7~Dz f8A8 mS/  oqm\90 n  F o r ~W /   d& Y 5 |  j ? 5  p Vjgw.&  S49=_n* 1Y#vX].5-w7! L| gym 8kKRJZ\V{`S,p )RR] 5 #a :;=,c zSY:@+L!W J;;;4(S b| - jg%w?;9mP>hoQ]8Z*7Z5hp[i r44>k!zoLbG4[vLL  c>, zZE d.>#|[ d   ,_  ? 1 \ L:&</xUxfD( a93!Dio>6`BJ"<E[J`.B {-}fFK  [1@4X&l+I/mj`hL'4\ E 0:Le  6f !  ;P NMm:N[vJJF&~ D W E ) d2~#yNVS|3A"_4<|SdmHfaK(&8L?DQkjE R )=<(N`2^K/N+Vd ]a-O :n<eh  x )t ^)52KC%QBsydwU@CbKI !ad!4fU GDSG "H>Yg*""6?GcOa|>| `^  &s 9:jd Rz,LQ6 LQG* Tb"0#'7%%6%k",~Z@ h+oCJk]%Xs Yse= H ,H7S+c-U VDu{My aB<]  >aLP`s Z Dv8RrZ| M/2Q v F},uw+Oe~ :5vd+U@PyGi;,s hH o  z.>3 t  2 ; lp Y n> $ 2  * o_ " A j j V8 : +~{<84z&Z45u|E)REtP_Yq5'|[|Bw+~6-G> <aL48a_?5u)! &Q " =[ Z y tj.{vgl#A 3EE]6{i ? ) Sz ^in!)@{Z@$aIa w#Y)g=8z/ };[MHTSOe8ou-kO`6^ IJ+feq?h@ `'(yzyZ_wW{r%3~xv;>/ . 2 Bj  ] r)}W5ISw-KMCz()pdR\s.A*feY+9}L[6yj+/= > @O ^  Z d )  :#t#s<p 2s#Y_60A+]vEg xe \ kA,;Z<%TME-`Dd%DRLysZ dm M :7#V#:Lc  *) q m $ >N>fFP,q7xoRt$om j4   Q<$Yu_ ; 7  {e% o  dAo8 SiK:o?]]ZIS*K~8#x'MzW+Jzys  e3.@ n&`c'Aj'r!zD =I* V 3v"W#$)&&M &C"T_vI =0;' C s0 9 {4 l "sk"T+{~F6#oI 7k,Tc0"Nd;U w;fah y }J)_kNmi7{EV  IH "j&Ta9 b  P Z6r{tx#:fbaO  f Z x & D!uIX   HR v W U F C  g  ' ) v r. I9We[.yqeݚi%Mv11O,/Gq$W`Wg( Or#J=6}1es -NG2v'h[oN{udL lk!SUrn"S o4!`qm ".,-|yW&p S{@~C"H*H~ 5 2_v  h+A +gS0CfMVKh)Q<  9t 0 I J  Ou^171 dJS2)35#KK&zKpVAr,arIH<lGq4S_^ |k^C-E?kRm_/ Tm V(B ] ( ) UQYq<'~ E 0 U>c6pCG f]iy*s *?:VHu M"X F- $Cz3 0 G& MSF6%7~!C11Bhv[mq B "X   $6nEPeZnOqj;-J  _' o  #4 Xb<067MVh$zUvZbIw ~re s8?x\T`YT|i!$|D%"Oi H Z MwWb `wE #n#'b"+[-{-+%H ?tFF&R5^iu d:jV  Z;*\acPKs^V n0;oFsdlu E0j+t~o4 PQw*!.\REot5Q ;NwRJ'Z Z`-1-4kK } ' v8  D/  k;) [PqP - RB 6  ;H [:[_`#*Vld37a5/~4.e;7dC~+aoHpm([sr _B-U"%H(r]*)%-!0(o se, J TP,)j!#ot%%J$eR!N#*_lRt(t=c `G +  > 4>;68Fc]u Enu+rY'WjkH2Ln b =5)~~4+DmT]{8=Ld-T) x   R Vok /%*x ] thx^-STC]F<   0wqlED\RC]vYVtF Os)+?/8LxC*^,#t5_G|=/qt&cgZ .p  y ox kOu3x-j)A"-I* _l.*{_9\7vZ( R gpH#0]! M$M^ c Q`-Jv lE&pBuy1Sg g<O}q1[QNa} o4P  9 ?0     .s?P<u d}(Wf0} y,G "a | rH 4 L e<3zrpL{&J NDފڰٯy~X}H j4CN  KdaW E2IH-8d*U46-{8H * uu";9s~zn MVlt]@n   ^ / G m`  e A6= so];z)-Z 7 {q  d  N r8-h;(S&2,op$wSfU1(+V49[xE*^Q9JO`z TO8Y#'i('g%# R;m:F _a s | zzZe"$$h $F!i; - & 9  2  Z)%1"$ q&J$j[y91,B{IX]"i8NmC ?L f @3]R-(!.d^'ypBjW S:v q > l BviyV ;]aFD  71!3,|c9B;m @  D7 A]89Np -=>}Nk+Jo<9H1nxFZ3#8q.  M uA t2 ;H#w:,K:P*:BPA% @Q_6v8p\&"'vi Y k &E < ', g ~ g C~0anx]jSP&VfwGyYa:IA$hG#HK(/&O, )-d U $Lyg'/6(y29>L7;r_n,D/0hAy?(}r.U{d =wnu9(o7_J& uK{|6*38?nX^G++$FMh\9?_[1fC'/e`&J"=VV<@|}q3)M[s 9i,K% / w l  , L n> ^[g#T^ uN\jNY> t8PJ# Hx]ziR&  q4  p"%+ h P4Z1LyGoKUZGLzj! i_9K> cdmo_Zlai X\ /6a$_xM+GZ qz $hhQg$>1 .Ohx cDP(4?`9)>|=O{Jak#V&:HG! 3j[VDo/o2DK.\dd4~trdF]% >KDo1!!9  Io T U B| ljO `!/"5"x! z=vt ##l`Dm`cAiI%?~.e(:edn5;86(K5+[p@g,\4Z] FL.>QB&Fv&4m|6HMB {b+) 90c+RC:3W > ?vLP{5 h_`?m:|G 20;x*||=CW9q~{ t dPMhl)3xe$6fl,}ATS7'g~fz?),'(*;^0)/ Jn)}q" |p{B!lvv-9?MX[Q7 nK-"{3_q,"hvywA2VHu + D \?|L+OCN(ku%KW4z_!/_3Xks];f|Xsm8$X' # y 6U !l=[W(x= RBHK!2G .aP}Rm,y5]!X1lx!v]wROt=z40-< {2ics/U{+V#]J6"d)tud[1)fUF _ T  K g 6X W }]KCSXE J 88:Q`*i NBv/fv: X B~G&P;q|bRA$<l~m4.['55?Hl&z,[H/Z1nW}{ e 08(=5 R!A9UCD:<4 # \ 6[Um 'm`=[ et+ h ` | T  pI^"A۔4_6tOh*;jLh" |  cM69v: VzVo%`,BIzojhN. Qc^$WBs%  [- R.~4NO fP(}*! Zxat"I$%$sfrVL"  d L B ot 4 1</W }"h3J[yKy;PN!C~P5G" d5i0XZz4[\)|)#%Ah)@m.  % %  r) D p Q|s .ouy[p7QA]<,7~f2,|V8CS:]m]UB2gs* t  `0 UOh#~je_| HnQh] 00W} bq -*TxWU *;UC n #]C!`6 ( : YvX<;- JyFm{i 0 $ VD&c?g~EQ& 94 KJ5i}tk^` {)B:l. ,RY ucX\\t~bYaG_h JB(&7-@|-,ILD\D1Z;.O.j~sA,ux+% =xducA`YI)htP`K<+N1 0 O3 | .+wr Z - <E_H@%):.nt-%'I{ygZP6ET 23 py<Y;`' i H  qK p i \PbWz9%SPFEE=&s`\NdT^6)Ly3*#X c[H9&Ke_aQ0 YT0YOg{~ti|rXK6-5 (luR3'1TX,NHAK    Y D:JI yL8&^xXj{"S6H?vn {c* W=5 QhNHnKi1XV2y^_.}:|kb;l%za-nWA_mkH[l@Ax-N!<D\ z1S~suIk2> )dw A= o7EqILWo>g|pU2}z3yvP"cs%Hi{ dQ A- % 9  1PuZ[UnW 0OC}.D4- $ (H L48O1  9 I  8  ;B  | *.+` O R>v%)^vLV?JP<b> |   rj >H^Vk0IGzC2)~҃nr[$(7, i6GGhH] ES!)Qj*t?6?LlBC$i8}Y?Q n+ oF H 4 zG U a ! Zy1=!RRt=zV87A."6% $%!Ek<G z(=<6GF 7}|Jt - 6lfRVAr |IjR  EquR5|Mu$DHm 5rEa1xB#$Q;gZT.w{&ik) "ZY 9[ Ym#F ?;7PWl->C7>Ebxa~fl^[qa _] =cwm8+7%xS>=RAZQ+`e8m< mt_ATU1{dNUY$Fr%B J!SSml#D K 49.Z dzkrqds<0daHIJgSfV4 ]vXr n&oLldUd9rcCjH+1I%1~@'uh%K0G5&:6w4oi$aB^nn %  AFA'b  *Nu'dnGlYIR-};^Y (@Z  -G?"}eOXJ#i(M,rwNN%COY mMI>}pY* hKMAq'[,^E(r1"H/zFzvRBuR3HvP: O  fN j ff I!|<t; 4 ~S b<sfTyyFW="$w0 } 6l 2 ] hQi }x|aFZr ;   k  y  r G^ <Z /I.L}}V_j7S8Y  V {2 :z`"tD(xI/_9`68DaW^=S45R}[?%pLbjsoTx 1]ACI>o]; 4 ! nAd4|%H w!wIl*=wV} (L=j0 Yag;Bh~Pl+Pjw< %*FQ\dY&=  o{ v ? A`Z/txSd/" C kecJ8~lhQU?o0w@; #BQ9+GUC8UL7}Do.BAT|TkZlKV"\:$dc,BI #ZQ8SZ@0Pt!U@L. ~ tWC$*w^<OmkGQ f =CY%CXi9^+! g ? zF!1H_P. ut,hYxe[$a@8;& U<7Yvb&k&-]&y&7xRY E@aWpL\q""z[Te C./]A1c:r{?Pm/ $U3gX[&m  UGPI5<5Eh ] u N   p A$/f,[1 5yl~H1:K3dRi"?rK&i `eH bT:Xx8Q[MPu" C#! *!3D4'EQesO/ *>: _w&a{e`)B D0 0% mr*) $ l v3i!#s R C 5  8bQbmN rp^7 R o Y=o 8 ?8 /Mb4,2aP>g & Wi3k.1VbehU { # ~ z  I AS  %= d ZiDn*  W6-us /l&1X [ `j K ! cl 5/cN!n?dvN%iC49wFhJg-3>:\AWLcA=y=4sm%!p+uzhdG{7lM_sGma,M6&ND5 \  X=\>2pB3mGlEaCEHci? C :~wHM_ ^d  jU Q oA V$7 Z  0 Uj|Kd`+5{ro \ |lXpn 9ctCf,"OthoF29J#LQl8e6nU0z=RdDl ,( S.[i PL^I-<2$a&g%jN\9 hk'%P{>D/V a t&1p?J! ZO7 , HG Fu>+9h3ra( ( p[> ; B 3I#7+Y|DW9+0X?d[F8lPD =#h`l$rUq0]8 LOdoUoH035Ttj>9R)zOxQ8~yMfB '' a  ` 3  m =  w v 0la+z('GZcb7ZL</+6iSS7,`&tD{N6$ lc)-::?93"jkldIiW+J:v-37P)m4W-{ei =SQ~0! lwl  ?cQ;U &< QvY_KR[XUO- _ u!2eF`aE*/+6 IxopD[e. # \DNv4{?f|#!U!,@gxmmx$`g0'YP    s 4 Hsu  F}ex=L J '|x  7 5  ] , lP 5a 6W v* uYOK%5Z"uj&u@#tUmV((GxWeuWk.gc4OP )(a2- rO  _ ?8~+$mbvZ0 @42Fc'i { M A # $ {2BkN[c~ |wP r zU , L [ / ,lJ<H5vET.Vf [7 k&jp/zZ)}nDo!IR(*S*0u`)wb>Fxnl'2_? M_I0=Rn A^;O=f%"E]_Cd *j$9)IT 6=7"YAj4qZ$J`JMdpZZ'*X 5  E^$235_ , B w EL _ {W# Q vE l D adJ+ Q]W y: 3=*dV ULxe<XR%b@ a] h 9] T! #J*!_f:ZiR[rE7^+ I~J` mfo=| xAQhDB<`]|4Hp5]e=40tk$J !Uz rRp   _4  'O}+%wer,EH6N.\`:;(fr>yg#oml>Uwuf5/KOL]%h*=."3 25,[az6Q lANjtZw%`=ML`^_>aora(74 o6r )T" 2 c. /v"('T| )BbJA(M0<q @ [ `   ]`o/j JE$#Ou%{$$!X?%< wk\^sDG'RrA[ pOA\&Qurc;&o > S W K *2  3PX{_ {K]L-D@9) ސ> AV\dPwQ'_rp{}'scVN4?,O@M'8O-x|L59Z'v? )LnM8/4 [ toFp}4O^]c{  ! & R y P:g&dK3o'c3T > W XQ  XF q*Cwh. k {C & 1f>&gQex].US,e&kUU>9$op9 7:6bMI.UwZ~W^Xi\SYIs>cZ#GN \s'F; R  7*Ljk]P1ChKA~qUa*&   +2- Ort*@M/Bj,Yn1<)8\wo_d1tOvs'u6Nk Q H0/=baEDP|~|r~ )J O 8D nuo.p)}zDi Dev&'m_2<l.SNR.e.N-V40<IK/6L( 2J~N4J  |e ab LSrmIDo?i!,? ; .Su&Z * i%c@ 'tIq`~7bd9w?.agc/2NmFN9YH3?m2?XGNe;r8; g\gyu < A Z H;b(pEgIr nU$eOIj#eRr V\CtKZ#oK M2&/yM*4PaT o!vqWSkg(KE&td OHqp+iW$w)G  4?     1 < <uLZU{NfCbU3{a1٘A&9M0(d$~/Opq,{dEwLqL<"F%'g< % 3FvF|Ws EbM 3 W}s_#}9+{A o & -B='s5 fV3B28"f1}nQCk!a ynX@k k6Y& f =  `[*m"[O=>{;qUX{Z}>v  =43CR25`C|0TcVAVv~WWOG;;&"INXuH%VKo /{pc  C~/%Ru|:/z|}"7Be  ]  HlyW  I o?~/U wS X [ {Y FgD\z&Cx2hP!$ vg;  5 /xt4"tVg$ _[`svI&||W|%|@iLPh8Xb3#;O@4T/:s!/ r=Yp6%|2"3yE'z-e1rVV08 T1)N,Kpb H q~.QInZO,Va=I;gZvn+ Oo:p N*JQE#/& (}('PH&g#6M<8Uh8 vH  ZvR  `* >j pW YPFSGd\~Q, $  4 "+   f oE&M3M|/mfHp3Z(|~*(]5Z .;19 BTK~bK* | Lds h 4atVr`z?=v & ( #  c[vD Q p T  V ; Qqd\ syY/n=;(!K_1 jy( :@(p{p A/ ?i>?!cmb: v$<66'w݃!%`sG"fkIx}| 5-X"_ tOR?r'WH^V5!1_$-5@PI(6_ yVg9e+SF-K> -'+.$* ` { mNN*!|7ikmb;} "M$"%&%*%i)$(" ps+{A*A <GY c'  m fC K S x !0iY|dH *Gt'H>}Y9g ._JV?\/W&T8I&ފ2ߜfnMD&9})M~s`!_[d9|P.+HE/" 8b# PG9kD* a%1%8sLRw ew %|F v    5 {   y Z# r+3kd2&xRC0ccoO(RM4`1@S#C ty #UCl = f QSHryn1Kx9 \oqZ>.uOvI~^ZS o?&fl/\lyojR0 0<5>asM/2WN&yB nV[i0 J.R3U"d[i(Q* `rwd>sbN~ :5!}".H"} ^S@% xv -  `=/ :-!` I.r`9H l  9F)3 4  V>  l    -u KJ65?sx ,.   /8:6,N;IY5 IzTQ!m;[k1MbmcfC =Oi2jQ0nxz59^X]:P>!4l- $=SG}qn4c:}x xG2VYA G* P O x , \~ T& g /g3?x;G Z u R< o1CT=  ]9!rX-TJ2S a-m^y&CC!Kd2@q_&nZ _ho~k =}x1{ ! fE$ |[:Ca/ P 69N_$( XuI9"*f/-4 @ ` nK /U`y,6/*[ o _= .BB?VHOYS=.[J;I_'2*Lvm6>o$\6.M?y&Fe<(F;,AI,{|fWu cC[QO'QOU&pD>:r;/e*`Bo0|noO 9 - & !00 +8IM4 D-b*!  D G I{?9dWX*!XHT8 2 q !l>V  T R z6Yt|fR@ =/h7#kU^KGHMV/e={7*a ,-_}:tBjs%mm:e++LrO@!G&gRwZq,InYD!_D h%[[ 7E  W 5muI :Rtu   ( h iM  G   Q  T- ] H i  ,  | Z j/ W  C ;  [ sK  w4OUG\g yg)P3:%cJ-9*Ds&UkJR]iT:(P=*T'. W`vK0!1pB->:KeJT@1K#m u  1 7R  B?8*^uD}a% 5 |MCX 17=j  X Y Hi >n >e:(I8 &3O['<HeE/8\AI3E3G6|ebW3XL$u5B  #O<"]?hW1L!3n5bG6Y,+ 4F` G:Q[0d'Gp}4f$ {O#%hl J/x%@')Bn\J / xX M2\<chB< ; ^  , c a M_ >)QgmgZJ/;0'(!E Au Ws0 A {(gni*<thuxM#tMyZ(JRhA1(d5"xS\z/ Q:A^E[ayTn>;^&jK9-)Xh%c8&v/2pI a5s&c  @  ` Xk':y+ ,     r4"c 1 V 5 x H% !9 *ZuY8 <kO#i6AxhY RjJ1/H g  L Y o ] &k n)OrIy9):n { o %w!m05 q \ 5P #?T`wSj \ MDYEGPfO &>Raj7k `J'=iEW)k3*r)84Bڧe mmJ 5>9#JE^:_>Bk,._/Z(, Lh-d #,D~.Y[    @}(t#6d/ P_ S=;l_T9NJ  Gdv x'a F G=*K^AR*dYS:\V{H<9 p"ivzJtHbWf4ncd~Mh=GDr8<>nu`f<YB8j ";X|&}j}L=M D"4w];@CDl O' % ~ \ nj4 < { +W t 'S  :-A   9X) hW~p -:$g)Bx!ly\rc(4-UuF;Giq;Uy)8\*kj~`RF=9'8949875+#-0(g(*uZbU4kknW5'L2L9-iP 6RS\0 A] nHf`yG;zq3jOzYi { ( Id9B2s  q A v a  $ "{ ,> N|=a/j!   /:57$p$m?! 4 E N MQ D3 1  o0P u 4*  '  ;  no=w~&Wp"WjQrYct*k(Hsz"t#j 8bYK3J2K:@|FgOdF pNL# A?v6\xm'k4^$NA8I/ ^lb $%428@^`|=  QJ e ?  q \o%i ~z@ Ei d @SCKYjMinY)O/ ~ ' xUgpg\S5P_ ,"W &B s U 7 X  C#3CO X:^]RS7yb? ]:EkZBd(AgvJ:eotd}`@.Ft+M x.|rR}c=_z1+d  z > p 2`5dK"vw4 rn qAuQ -! f jKx6+Ja:o1prd'LD,t' \^ p  T sh Rj G N ] n ~L    y V  v<OR&V\) RM {  A[0CK_0 ijf-9c.o3`uA{!>z=k/L im&t2$K1knN]qzgSPl !U\+xb.A$]\ J 9 } I z H Y\u/a<!py`YV   ^U(u% 7 ]WRvQU,p^%xu BpzT `P*E>Anw}lhc3KL(L6ZU@GQdy}ezi\L ^<\(Q+mWyWx0Pb]`Mvrx6< +Z)9<Vvz"4E`r|V{brfRZN@h0] I(g H8xPi7 Z+4 / 1@1 lT;x%{Wx+ Ezk 8D=*S P { y g O 0f ) | ^E=dDYxoO AQ   9 Nv0*I9Kl#*` M wjx>a_  N R MU;M><;*C!?$Ey/-n+w)KRi& I -mT1}6_E{OB@^G7Y K3V0<h9v1 * e V%W%J K { G 3*aP"E urBbt|~"|v!jVu;)I $o|HElA=.3XP^-{ ?s$! _#t >8aqA07Dh|M=37=&T/7mw cwU6iEG[DK ba&VMUwH,/_ R` 7 ,Ntq A,NMoE/&   M 3]yvJkNU[I@42%N:$   # t  H')aOOn[!s(a(kgxSC_J2G4kl  - wd ' V6 _@^j"]O^rMSJ&7o;;U`kWf4G.*TN'1 l k = F \ ) 1 _(?],?$ -  6 _ j _M F ,G  &;3UvI'l}.r!eME NY_  (FJ%nEJP{Sa2: `o gcYQ{m%3L[Ax/w^ep=:S ._*u|\ n5B'v ]293WZx {8!+,"5  mrx)OIoOw_ s' Q & $ L Y  ]*;N TPE8p,', Ag"eI v :1=} uh X O WG | V 2 5 W  t Q hK4p Yt TgykgtC` :P3dvxe"WQ!>1z~ttAZid5Jy>"XVVYw$8C\`F5h)6q^6P/L y.h5\q-i< ]l-J0ld%9D*Z\}sZa=I vW(;S\H % Du r} K > M y " 7   \ =f   f _Ax) |:Q<2r:YXNvlGk  k{hAwK/pe!\" .; bl t7"p([?mWJQ >$, iT._v%|   8d7h7  =A\zaL% M\R\2I9f?Q\;]Xy  > o 3   n>] 'O   01 qm $  | Imk~%'c   bkb|xJ }oY@8Q 4>MHl]G * .Qiw|A1 0S d OVH+M}r\vdDh _1 ^2 ]   ~,cURTVSKF3L~i5Z|FcQ^fAeNu3psuw; N,M\p#q-]5K܊?N]{Hz1W[00gv2y6 Gt8 3Q9L%e=`Q#<X  2 qCj5;z.g0A Yr{ K_[42oz;ewmwq1ߙ,ڷ!Be<UO_3uB< 1XwBK 3OyLT\8  2ef1p G!p %j; uWiLYB`I< P uaaCu M\#b$X6<3PeK>;:9A/=ƍN_;A^7DcwF/<CGoL7T`q hxo[JCu!!n4QZU G3; V-n>  ;"yt_ CTg eIB9 Pm )N e8aKKv$b  |/;|dYn-.Q !T;&x T +` :   "P>MNRD#9Z^7_#n, w(Zz~c[Mjk#YJFu<(e4~U{.v8?=?_|@tyIJrnFI[Q`ZC$ 1y1B7ؐ2#t&  :f 1)q*4F|6hg5ru#?1fr!b\ 1   - ~ Jkl{2GG -1B "#\"Q#mF dk+< = ?p$4|C{a2:ilyl Sd u%R!46-<"" &i-N OD~~QkF]R? E7)g '&;XwsM" oC S_ .l-TeB{X`=v.IX<_4NiE;0m xWx 4vEj0cμχBd4=0mT ߒYݝ$$6G% OED%' W B z)- e$P()d( O%%!.4b$(+t,5+el&3W^ u  {=QTdT* >{: A - m#&!b )@sh;7T_YL3&TiLC2E !\3.FXk  uU.} 7.e&W 0)E(0` Y *q p`LUA2%|4`_N]S>QbNX af; S ,W7ASm $Lv Vd5 } c{B)s; zr r{HW<OQh}e?%U= R 0       C sYS =]F@2-l-t*  Y z?~ePv4\2S"4 _{p;6{D+xyEn3ev{dk$>=nHLE!1amU&5qCOnY`egcT7  Sk "> !YiKbW>&4DE(XlQOI$x's; 3 S  X X?gs4fG$p0%(*(]$4 74 or zhZX_3tA=`0C .%  0$'5{L6jS O q U$vZ#}m)S v /JO H QP~w3@m( RC2b $&y[oZ0HabB R=9H8H7`A~BK! y#E1NmZ@Ioij>8pՐ%ل/-C0 r[!Tc 6 b9ޤ."d2  b * # *   3 ;#gG$,"]!b /3 H  %/79>?;$2{=&, T<<>Lehi(EZG$X ^mDITo Xd@1<5 aNdK=KB{}yYN7Mj&4Hvs:!h L64uTu #NKlk5V +tPO,EKZr `f ~] -TO*]^(HWvd@ZVL+|<Fއ M vQY Li;s%/1ACL+t,?:7EFIMT P.S=sf' b&0gRY qh P6~~ $}AV ~O\EaTG co < ,X g 3 y n f= yv?,(|/%MMv^u/}+V(}^Rv@3`lL?<8+= 1 2 \ qE ' $ykA *dh^9dYgcO~#gT?-v!zXw}2\[VMes*t)0kfPk޸ -8> ; (t"&bxi\ds>B :m[YfV,<@#(  sda ` ;! Y@(!D5g K='!!4 yo`) Fz/h i'H| :_{8N/<u r&>R|Clz2>z`,\mmi-dr[z!E"x ?`  <8js l :JLO6J1   {FH:;jlNuWiues:@|bPNvL+PNt)`G6F$! ('Q p=jS7vr>KfrPOv^i'AA2?;FV~  37"\%'(+'$|&t n& ZK*%3/7r=.@@?9}/N;% - Vt}\^,LBw$U |nY4=@ @%?)4V!~]u\V%TbPbcZmh$d? .2 YYi#nC:[B`etrCKI k$,; & sPvNPUq Y TB4zn5V'vYWT1t  U & ql !@~a|&R V}Կ RA 4!}N J g   Y >( @,bhDx3- UkXd4\ "H fxExWn-j! x'<|^$ *JQGg_A] 7uw!;o  Z  -oP|PFd<#B%# B! 9RC=88 X6CiorVGG 4G6Zy'NY+,DZ^HAs@^"r_ j }.!#RVx \2*VgH  Uuf w=/&*K7{IG#0Jje,OQQtpWT@+r[ anl r c  eo C    )5 {\(?{p}i8e}8\5h)vU9sԥ$ѿԠFjx%~ dI(!ey` :[&bUGD/a:+k x3'LQY> 0 =|8 G57+|5972H+!  ]=[-(V hM -.  + LkuZ|JbMu>VfT{'7KQy @})[m1j11VACI@H %xhb|Pz"3vX9? e?Yc 4s=fZNBkEdd05~;U?A  P@Dk e.  c   HQ x mK5N obrp  @ o  b c  p 1nVIA^7I$~Xm-s&ZAm[DGG K] A LOl5's ( ~E,_xpt\ J w>')C;PF3`#^c 5E= @x[zI^F [ U~N y%[1n*"a.kn*OQVi MEQ-:`,V`Mi]A>&1'%}E}~9tw jV~'`;;jgT]uQcnA?Ur\g/"fc;%x~ )k;vJmj+eTiEc, + ?,roAAT> A    = IZFR[iS=h#ifuP. < z+e&1L [ HM 3#fgP$?HZ;QiR{t0b&Tcw3~!Sh,{l6_._]#0/smyJ nnS/  D^: :"LdQ#+]XB 6 E & yU;#_9N [ "{jQ8p;hCM0tUiZY 3"OO$p0llA %/wLczo3BYfgm7L5ulQFNalX .L=G o30j-ma ?  ;b Mc RJ Evfs Zw 5!+24(5"2,x$Vp4# &%!xvU- V q U>vij0wkmBr=Jd*!MpE ;5 JZ xkL`ZVSlQdQWb_or|r \G9r6@Q`7  ` ts h G *lIlNVG#-<I1tGZIdH  Y{c,_olx prUt[ji1u  f  & JZ Q   3 V& ^<4 jnOt"OaR'>#D~lPp4u % [1z kTvQx nVk6 6 sY`omFQ}"hN%zXc_Z zz h i?<;N8N & i w9&bbp| ULfBmE(# R# c2VZ74=NeMW8 1 x 7!< E "    @/rd8Q }e|q!4$CJ+`NP 5 J_  " D)  O'<+w; gqX!|tX+nI eK+21 4_}c 8 T f 1w X   % a Ek =bUOQ="oVai=m)<,LG9H\q||pU! \4`o:JA Lw(`B }zTreQzjysw A\ - N '{m{  p M ^Bc#s*j/h/-+,*%XjY$u<%'Pih"R-~ ?wU p w W? ( ; Z/sz%!'>$+; a1LY.*x/@-Pg|%B vb| 5/geB< < oPM2c~VWQ(NyZM%|K5~#-hP\bv=d]ug ny[HE]:ccQq;rk}a;0Z Rp {~@%r"=a@ z>gYWo 9s  =    s[ l ]uK   !8jJ2. ~ b` ? &e 0"!pQ9 &caq<RT=}Tv  V $ts ~`6C~,;(gajyBhSGDS|/R^}S(rKm0 {!'N'>($(W X lLc}TJ|GX%G+ 4 [  ;? )  W% f Z*?s^ #Zdae oe, [ n96 17 NGR *ToLY]kC_+@gVT*5K ;3. ] b B S ('-: n]dh+K) {z1+D}?H RKiowmfLa=SH',g3M9C!xhd r\C9v$C,ljjm%3%q2]IS4j6*7M FZ T2y' g /  fiXE6 T" Geb3h0f N5[%$4zCaW-zxN/;z Vkt5 aH.}hn5 spGG5] :,](vUL\rJ,Uz}j? zyxml S D 7,&\,D-\)W"z U?)Q_ $M&h%#&!k(4dc @ ~c H  g C O ]UmB7* i E}tuBb\Y?Vq#`Q0'-2'x6 =`b 2p"H,P"Q2n5+KTv=Mo{j$<EINZRROM" Tt nh  2 [$JU:##lwI"Qj ;@`2f*1C8}]g B   3 Eg oo  "  0x ( n f(;; <|l $tK *}!/qGM.%T *  =}WpvOVD_9^;  D0Z69R -$; lbtf|T,x%mjVv_bizDE^5{"Ag+gzf2~Qkcg= Pv 3+U  t{(V-]iD    = 5 ? 7  s qP4,p\*<stDgD5~Z- j & O " [ u-OB``YhAiV5R1NQ\*"7cx]"IC=~Ja'e S~\EUFs `  x6 [ S ,2 = BC wh&Hn } !@%AD- WGiM&FuMlN |O![r?~*vzQ1+bw G P t ) '  < ` Vjk*A|))tK+nqw &E])Y: E(m^I/ yZ= 2 xE~~8  *f r% fR T2,t?c!vSYb>)}:CUB@pEDP2;LN(8}BBL[0IlM 2 &k55FfWveM X7 `3x : - 4e c }<YP"S$q\# M3 | l|+P /'*!ny$($*$"PYwb<P  c"o-7/X D4"Fr;pq 'ttj/0> wP0}JXJ))-M^eqy`M%`:d F6u Qt*C8=7r z!DkAbVBY6mZ<0/6Kv"Y?x\" N4/2U*+BJݓ203VTCP|3]8vG$?o+rQasS0!TBT **|oF.w 1 ] j3E hA R?S7!oP6w'3 X<!uk(O.ir}naOJo.zb^HPLCstcu1FaN;m*?Ge3jKRT4^W^r3aOtm N\oRPRS$@_ \=0EAx  * xsU  \rs 'rfWTq<W#E7&8<aH8| 'v+J% dQ,\Bzu+~ :J50>JwR$iN:0E0ZRR,.b|*:%tR[[*( R0>+7=cT d h#;v8;s5 3L.j  ) z$6  Z%WLOU_<. y 8~F2tzD]@j.m`j6FۙbLjR=gmab ! T SC9*UI+?;omXcfH XW9$ p C  c R \8Pl ")Q2)" >THLlZ< 7Y PY qef9,)gYgrzT@  M v p 5 @{a"Pf|{<Ze>!4l!p> 1ro #lR|od:elsJl 3X   qL  { y3tnpB2s=p2 :x  /W o2 rHWFw( ߊ:^/l,f'@Ja_"C?brp_A)h9{TRWR   c 1  s @G)v _ dZr^ N}K f(5~q/7 D Vkf~Gy P Y C VL ~Xf}%6 @i vW1-<"=>w]9-;3mFD<::==*. ]d*O E#$lF_f39M.DT5]4R6*{)1jHu.986rC3 "TYA\,IT~ W~A4f H%,f#FPoO5 " kAF, :zMkbtg P  gf^%f6|9f:"VmQq;#]$c3@>!3 ZEtU# S). NoU%ikU!~ iUx{v.fNY)H52 j*U#<L=D d%bQB /1h5{"& Nh6|Z=x!&5 }%R\ sYA.E @,;lUo0A yt f=  h5P Z # {eC#F6t'0}KD+ Y +u=2jMoYIH t K= 3 (>b o UyQ`oNy~\4Zy05ttOEJNQgLW/i A8x[( E@%X(I]) 'e!Q dCFab`)CQ^ v i H #(XBFOqL>5#S2sw3ZL3?vW"Sjl+r i|g#i  p = : A plepL!! C @S!/"p  @Q(@  PtP"fN5P:F a8 r -  } c U /B $ l H  6.//(SbJ:TUu4 1 ^Bdf|wM6 $&>MnFi4Z4^h~ByC y m V  m}* o $S(j0NUm u d , N''HI7wy$g"KOX0$QTy mdkRxNRK4NC sij/1_o1Yn`Tg jq& ?S|[S FE4( W%$uf;aq(Z'"`r/-EMB=9e dm^Y:  f $fK2h jnUUA/J; " 3|v)+Vm~"P^omH99&{~F0!or T9+9"$W^Y0dl.H8y'\a8Iv"+-y3ULc!)(9-Y"1K9%|L`JYBMcRy H; r2C6 r=[  xl}j7LK   &;enVI}fGJG1I,/Pknt.6M\Z3= }KIb7 a C    |-!C$qHwEh.t$ Q\vo<hlZxS@#x),,,)$=;%.;h4 3AH,nT  d [\t/kp;&JU=NV;\wC[nL' -^Xre>/ tM8,!8E< +mnfI/"& 9 l.1p* '  TB1W^Nfz:Kzpa[_=?A |Y|x+{{KM4_EW/iG<!,_%:Z`xgo$]^y@K3v&Rlp9iD4\q\Wu~`F\k)'?Nf_/FE<kkLUf*)1 &("!9b.;7|+ !##i"| ! &;s] ,+Ql \*bY1pb8[4:Y]zvzub4.POo+"A.wnlANCxp70_}J:NUN7 m]rEf [laSQ ge <?mR.^r Bc W`Y"   b kw>Kc KqkAoZ}\;'.2Z %a 2I &K Wcc)U[)OH: #q.r KbXt>_^r`FYON4H3aT ddL@{8S+| ]a7O/~^}A!'$A&D&?%} ;JLbR|i!bo0 V@xs^I*;- LZlAU .=` Cm C}oq.u A (+PsX.Y$GEY'~K7 e w/IyA `{KA  a&P[-\]Gj[Mt_0]2_An.1LY v  H  Z hW@_NCNU(qVd_;BZ ]&PU(<3"SPq$ta +Ic~ ?;@ b@1 >hA  X 9 2 ._or7G3  ]HdU?h % Vn8qz(b 7ORXG#&IM,Fzf\`7Y O I UUXqq80 1 1:y h $3&y' '"$6:6R_'zIj6F?" Xqx bh/m2 &BZ8%"1/KvkI#SAmqugZ@YPn/<_cS2bK'M$l   0 !AL{n&}joYm9X~6P I(9 t  TIm '"^*STS1|[DblRf;2wSm i<H"dk.~)[y_qG9 % - c l b 8JK!HDfvam~WQ1 ?)RZ`p+w&Gs g  ")Sc]G F^%5y#~ U+5G, ^ - mGw:bkEYc]??P  ;[ f9 \~E<\[9=EJjji oLY"uZn_s!J"'!Uwd3$]c%zK/,F)wrGk  Gvsk _ Q C 6 ) Y@Q  ,xVF\&!$w(>P***)S&#YC;} wApcDa2 E}@3?"n nODyGT`GcU17O~{&MFqzcM0'%G)fD gAE 1 0 !]/kSF9tj}yp L @ FXNr>g*tgh] |jM {sVD8 Xv2 O7 mq#i.+* 5^Vg^Y&=^  1 \U . UE x] &( H ^  UHi#!4(c(x-NUX8WD':6'k*fQ`#YhU } 8 D2[I\ aFd>AYk9pv MsM\?1 W ! p ~ZQ9a  ^ $ LkufAQ'\BhepVA ~b&ULj6bhk+y y " DrTc43P#_? 3onYa9Z]3$  H G I7~fFAM}n\# G"d\[z FHrm]Zr X޶ }k]! 4eFs~,*F9u:e: Z\Z2PiG Q I/L lOW[8jaBU S8e6qw}#V =X . C * C(KN*0OK0}yY S 5 N G?WHJo3}fD 4\}z_t B "f&m S^<#<XuIB7{]'|<FBeF1V.M]G b =: . y@>z&J7'V_Wvbsts DNo>[#TuF~~vk^O:4Bk  }{mb~qHao=IO9|5} t V :  K=3@|VT 7 ZzSGW!"{$$ |#$ 7lfy |!Drva :$ 7 ; C25eL. NgL->[ x uT$.pd&_5 + aA7\O0JjJ__>PO0c\l| I@h()bx 1q?n#x6Bfy7z=RW0V|}B?E)B+@>pJOj(BktCeb?p z;6j9%<G85& G w ec j8<Es  E!9 ~ u E =i _G  [RC, 85 S373HR6&gZ3,8<6=$fb'$n} pic[7IK"XvN]>CIa<TR = :!^|'jSpz'<>R)/~qol4?GK % ]  ~ FI1tZDFfqraE<3k$r<* 7-50# ![7sCQPj>(a=,|xblwt6Wi-x l  V J \ 7Kbll^ / n^#_&d"' C BAS09 )(DFdcO}? 5 S#"95,1==("< :&T: 0'   AJ*  "'%<$  ?!I1U..        ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1547330687.0 audioread-2.1.9/test/test_audioread.py0000644000076500000240000000321500000000000020753 0ustar00asampsonstaff00000000000000# This file is part of audioread. # Copyright 2018, Sam Thursfield # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the # "Software"), to deal in the Software without restriction, including # without limitation the rights to use, copy, modify, merge, publish, # distribute, sublicense, and/or sell copies of the Software, and to # permit persons to whom the Software is furnished to do so, subject to # the following conditions: # # The above copyright notice and this permission notice shall be # included in all copies or substantial portions of the Software. import json import os import sys import pytest import audioread # The 'audiofile' fixture is defined in conftest.py. def test_audioread_early_exit(audiofile): """Abort the read before it is completed. This test guards against regressions such as https://github.com/beetbox/audioread/pull/78 """ with audioread.audio_open(audiofile.path) as a: assert int(a.duration) == int(audiofile.duration) assert a.channels == audiofile.channels assert a.samplerate == audiofile.samplerate # Now we exit the context manager without reading any data. def test_audioread_full(audiofile): """Read the audio data from the file.""" with audioread.audio_open(audiofile.path) as a: assert int(a.duration) == int(audiofile.duration) assert a.channels == audiofile.channels assert a.samplerate == audiofile.samplerate # Now read all the data and assert that it's the correct type. for block in a: assert type(block) == bytes