h2-3.1.1/0000775000175000017500000000000013521033126012711 5ustar ubuntuubuntu00000000000000h2-3.1.1/.coveragerc0000664000175000017500000000047113421652727015051 0ustar ubuntuubuntu00000000000000[run] branch = True source = h2 [report] fail_under = 100 show_missing = True exclude_lines = pragma: no cover .*:.* # Python \d.* assert False, "Should not be reachable" .*:.* # Platform-specific: [paths] source = h2/ .tox/*/lib/python*/site-packages/h2 .tox/pypy*/site-packages/h2 h2-3.1.1/CONTRIBUTORS.rst0000664000175000017500000000513113421652727015415 0ustar ubuntuubuntu00000000000000Hyper-h2 is written and maintained by Cory Benfield and various contributors: Development Lead ```````````````` - Cory Benfield Contributors ```````````` In chronological order: - Robert Collins (@rbtcollins) - Provided invaluable and substantial early input into API design and layout. - Added code preventing ``Proxy-Authorization`` from getting added to HPACK compression contexts. - Maximilian Hils (@maximilianhils) - Added asyncio example. - Alex Chan (@alexwlchan) - Fixed docstring, added URLs to README. - Glyph Lefkowitz (@glyph) - Improved example Twisted server. - Thomas Kriechbaumer (@Kriechi) - Fixed incorrect arguments being passed to ``StreamIDTooLowError``. - Added new arguments to ``close_connection``. - WeiZheng Xu (@boyxuper) - Reported a bug relating to hyper-h2's updating of the connection window in response to SETTINGS_INITIAL_WINDOW_SIZE. - Evgeny Tataurov (@etataurov) - Added the ``additional_data`` field to the ``ConnectionTerminated`` event. - Brett Cannon (@brettcannon) - Changed Travis status icon to SVG. - Documentation improvements. - Felix Yan (@felixonmars) - Widened allowed version numbers of enum34. - Updated test requirements. - Keith Dart (@kdart) - Fixed curio example server flow control problems. - Gil Gonçalves (@LuRsT) - Added code forbidding non-RFC 7540 pseudo-headers. - Louis Taylor (@kragniz) - Cleaned up the README - Berker Peksag (@berkerpeksag) - Improved the docstring for ``StreamIDTooLowError``. - Adrian Lewis (@aidylewis) - Fixed the broken Twisted HEAD request example. - Added verification logic for ensuring that responses to HEAD requests have no body. - Lorenzo (@Mec-iS) - Changed documentation to stop using dictionaries for header blocks. - Kracekumar Ramaraj (@kracekumar) - Cleaned up Twisted example. - @mlvnd - Cleaned up curio example. - Tom Offermann (@toffer) - Added Tornado example. - Tarashish Mishra (@sunu) - Added code to reject header fields with leading/trailing whitespace. - Added code to remove leading/trailing whitespace from sent header fields. - Nate Prewitt (@nateprewitt) - Added code to validate that trailers do not contain pseudo-header fields. - Chun-Han, Hsiao (@chhsiao90) - Fixed a bug with invalid ``HTTP2-Settings`` header output in plaintext upgrade. - Bhavishya (@bhavishyagopesh) - Added support for equality testing to ``h2.settings.Settings`` objects. - Fred Thomsen (@fredthomsen) - Added logging. - Enhance equality testing of ``h2.settings.Settings`` objects with ``hypothesis``. h2-3.1.1/HISTORY.rst0000664000175000017500000006773613521033104014623 0ustar ubuntuubuntu00000000000000Release History =============== 3.1.1 (2019-08-02) ------------------ Bugfixes ~~~~~~~~ - Ignore WINDOW_UPDATE and RST_STREAM frames received after stream closure. 3.1.0 (2019-01-22) ------------------ API Changes (Backward-Incompatible) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - ``h2.connection.H2Connection.data_to_send`` first and only argument ``amt`` was renamed to ``amount``. - Support for Python 3.3 has been removed. API Changes (Backward-Compatible) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - ``h2.connection.H2Connection.send_data`` now supports ``data`` parameter being a ``memoryview`` object. - Refactor ping-related events: a ``h2.events.PingReceived`` event is fired when a PING frame is received and a ``h2.events.PingAckReceived`` event is fired when a PING frame with an ACK flag is received. ``h2.events.PingAcknowledged`` is deprecated in favour of the identical ``h2.events.PingAckReceived``. - Added ``ENABLE_CONNECT_PROTOCOL`` to ``h2.settings.SettingCodes``. - Support ``CONNECT`` requests with a ``:protocol`` pseudo header thereby supporting RFC 8441. - A limit to the number of closed streams kept in memory by the connection is applied. It can be configured by ``h2.connection.H2Connection.MAX_CLOSED_STREAMS``. Bugfixes ~~~~~~~~ - Debug logging when stream_id is None is now fixed and no longer errors. 3.0.1 (2017-04-03) ------------------ Bugfixes ~~~~~~~~ - CONTINUATION frames sent on closed streams previously caused stream errors of type STREAM_CLOSED. RFC 7540 § 6.10 requires that these be connection errors of type PROTOCOL_ERROR, and so this release changes to match that behaviour. - Remote peers incrementing their inbound connection window beyond the maximum allowed value now cause stream-level errors, rather than connection-level errors, allowing connections to stay up longer. - h2 now rejects receiving and sending request header blocks that are missing any of the mandatory pseudo-header fields (:path, :scheme, and :method). - h2 now rejects receiving and sending request header blocks that have an empty :path pseudo-header value. - h2 now rejects receiving and sending request header blocks that contain response-only pseudo-headers, and vice versa. - h2 now correct respects user-initiated changes to the HEADER_TABLE_SIZE local setting, and ensures that if users shrink or increase the header table size it is policed appropriately. 2.6.2 (2017-04-03) ------------------ Bugfixes ~~~~~~~~ - CONTINUATION frames sent on closed streams previously caused stream errors of type STREAM_CLOSED. RFC 7540 § 6.10 requires that these be connection errors of type PROTOCOL_ERROR, and so this release changes to match that behaviour. - Remote peers incrementing their inbound connection window beyond the maximum allowed value now cause stream-level errors, rather than connection-level errors, allowing connections to stay up longer. - h2 now rejects receiving and sending request header blocks that are missing any of the mandatory pseudo-header fields (:path, :scheme, and :method). - h2 now rejects receiving and sending request header blocks that have an empty :path pseudo-header value. - h2 now rejects receiving and sending request header blocks that contain response-only pseudo-headers, and vice versa. - h2 now correct respects user-initiated changes to the HEADER_TABLE_SIZE local setting, and ensures that if users shrink or increase the header table size it is policed appropriately. 2.5.4 (2017-04-03) ------------------ Bugfixes ~~~~~~~~ - CONTINUATION frames sent on closed streams previously caused stream errors of type STREAM_CLOSED. RFC 7540 § 6.10 requires that these be connection errors of type PROTOCOL_ERROR, and so this release changes to match that behaviour. - Remote peers incrementing their inbound connection window beyond the maximum allowed value now cause stream-level errors, rather than connection-level errors, allowing connections to stay up longer. - h2 now correct respects user-initiated changes to the HEADER_TABLE_SIZE local setting, and ensures that if users shrink or increase the header table size it is policed appropriately. 3.0.0 (2017-03-24) ------------------ API Changes (Backward-Incompatible) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - By default, hyper-h2 now joins together received cookie header fields, per RFC 7540 Section 8.1.2.5. - Added a ``normalize_inbound_headers`` flag to the ``H2Configuration`` object that defaults to ``True``. Setting this to ``False`` changes the behaviour from the previous point back to the v2 behaviour. - Removed deprecated fields from ``h2.errors`` module. - Removed deprecated fields from ``h2.settings`` module. - Removed deprecated ``client_side`` and ``header_encoding`` arguments from ``H2Connection``. - Removed deprecated ``client_side`` and ``header_encoding`` properties from ``H2Connection``. - ``dict`` objects are no longer allowed for user-supplied headers. - The default header encoding is now ``None``, not ``utf-8``: this means that all events that carry headers now return those headers as byte strings by default. The header encoding can be set back to ``utf-8`` to restore the old behaviour. API Changes (Backward-Compatible) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - Added new ``UnknownFrameReceived`` event that fires when unknown extension frames have been received. This only fires when using hyperframe 5.0 or later: earlier versions of hyperframe cause us to silently ignore extension frames. Bugfixes ~~~~~~~~ None 2.6.1 (2017-03-16) ------------------ Bugfixes ~~~~~~~~ - Allowed hyperframe v5 support while continuing to ignore unexpected frames. 2.5.3 (2017-03-16) ------------------ Bugfixes ~~~~~~~~ - Allowed hyperframe v5 support while continuing to ignore unexpected frames. 2.4.4 (2017-03-16) ------------------ Bugfixes ~~~~~~~~ - Allowed hyperframe v5 support while continuing to ignore unexpected frames. 2.6.0 (2017-02-28) ------------------ API Changes (Backward-Compatible) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - Added a new ``h2.events.Event`` class that acts as a base class for all events. - Rather than reject outbound Connection-specific headers, h2 will now normalize the header block by removing them. - Implement equality for the ``h2.settings.Settings`` class. - Added ``h2.settings.SettingCodes``, an enum that is used to store all the HTTP/2 setting codes. This allows us to use a better printed representation of the setting code in most places that it is used. - The ``setting`` field in ``ChangedSetting`` for the ``RemoteSettingsChanged`` and ``SettingsAcknowledged`` events has been updated to be instances of ``SettingCodes`` whenever they correspond to a known setting code. When they are an unknown setting code, they are instead ``int``. As ``SettingCodes`` is a subclass of ``int``, this is non-breaking. - Deprecated the other fields in ``h2.settings``. These will be removed in 3.0.0. - Added an optional ``pad_length`` parameter to ``H2Connection.send_data`` to allow the user to include padding on a data frame. - Added a new parameter to the ``h2.config.H2Configuration`` initializer which takes a logger. This allows us to log by providing a logger that conforms to the requirements of this module so that it can be used in different environments. Bugfixes ~~~~~~~~ - Correctly reject pushed request header blocks whenever they have malformed request header blocks. - Correctly normalize pushed request header blocks whenever they have normalizable header fields. - Remote peers are now allowed to send zero or any positive number as a value for ``SETTINGS_MAX_HEADER_LIST_SIZE``, where previously sending zero would raise a ``InvalidSettingsValueError``. - Resolved issue where the ``HTTP2-Settings`` header value for plaintext upgrade that was emitted by ``initiate_upgrade_connection`` included the *entire* ``SETTINGS`` frame, instead of just the payload. - Resolved issue where the ``HTTP2-Settings`` header value sent by a client for plaintext upgrade would be ignored by ``initiate_upgrade_connection``, rather than have those settings applied appropriately. - Resolved an issue whereby certain frames received from a peer in the CLOSED state would trigger connection errors when RFC 7540 says they should have triggered stream errors instead. Added more detailed stream closure tracking to ensure we don't throw away connections unnecessarily. 2.5.2 (2017-01-27) ------------------ - Resolved issue where the ``HTTP2-Settings`` header value for plaintext upgrade that was emitted by ``initiate_upgrade_connection`` included the *entire* ``SETTINGS`` frame, instead of just the payload. - Resolved issue where the ``HTTP2-Settings`` header value sent by a client for plaintext upgrade would be ignored by ``initiate_upgrade_connection``, rather than have those settings applied appropriately. 2.4.3 (2017-01-27) ------------------ - Resolved issue where the ``HTTP2-Settings`` header value for plaintext upgrade that was emitted by ``initiate_upgrade_connection`` included the *entire* ``SETTINGS`` frame, instead of just the payload. - Resolved issue where the ``HTTP2-Settings`` header value sent by a client for plaintext upgrade would be ignored by ``initiate_upgrade_connection``, rather than have those settings applied appropriately. 2.3.4 (2017-01-27) ------------------ - Resolved issue where the ``HTTP2-Settings`` header value for plaintext upgrade that was emitted by ``initiate_upgrade_connection`` included the *entire* ``SETTINGS`` frame, instead of just the payload. - Resolved issue where the ``HTTP2-Settings`` header value sent by a client for plaintext upgrade would be ignored by ``initiate_upgrade_connection``, rather than have those settings applied appropriately. 2.5.1 (2016-12-17) ------------------ Bugfixes ~~~~~~~~ - Remote peers are now allowed to send zero or any positive number as a value for ``SETTINGS_MAX_HEADER_LIST_SIZE``, where previously sending zero would raise a ``InvalidSettingsValueError``. 2.5.0 (2016-10-25) ------------------ API Changes (Backward-Compatible) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - Added a new ``H2Configuration`` object that allows rich configuration of a ``H2Connection``. This object supersedes the prior keyword arguments to the ``H2Connection`` object, which are now deprecated and will be removed in 3.0. - Added support for automated window management via the ``acknowledge_received_data`` method. See the documentation for more details. - Added a ``DenialOfServiceError`` that is raised whenever a behaviour that looks like a DoS attempt is encountered: for example, an overly large decompressed header list. This is a subclass of ``ProtocolError``. - Added support for setting and managing ``SETTINGS_MAX_HEADER_LIST_SIZE``. This setting is now defaulted to 64kB. - Added ``h2.errors.ErrorCodes``, an enum that is used to store all the HTTP/2 error codes. This allows us to use a better printed representation of the error code in most places that it is used. - The ``error_code`` fields on ``ConnectionTerminated`` and ``StreamReset`` events have been updated to be instances of ``ErrorCodes`` whenever they correspond to a known error code. When they are an unknown error code, they are instead ``int``. As ``ErrorCodes`` is a subclass of ``int``, this is non-breaking. - Deprecated the other fields in ``h2.errors``. These will be removed in 3.0.0. Bugfixes ~~~~~~~~ - Correctly reject request header blocks with neither :authority nor Host headers, or header blocks which contain mismatched :authority and Host headers, per RFC 7540 Section 8.1.2.3. - Correctly expect that responses to HEAD requests will have no body regardless of the value of the Content-Length header, and reject those that do. - Correctly refuse to send header blocks that contain neither :authority nor Host headers, or header blocks which contain mismatched :authority and Host headers, per RFC 7540 Section 8.1.2.3. - Hyper-h2 will now reject header field names and values that contain leading or trailing whitespace. - Correctly strip leading/trailing whitespace from header field names and values. - Correctly refuse to send header blocks with a TE header whose value is not ``trailers``, per RFC 7540 Section 8.1.2.2. - Correctly refuse to send header blocks with connection-specific headers, per RFC 7540 Section 8.1.2.2. - Correctly refuse to send header blocks that contain duplicate pseudo-header fields, or with pseudo-header fields that appear after ordinary header fields, per RFC 7540 Section 8.1.2.1. This may cause passing a dictionary as the header block to ``send_headers`` to throw a ``ProtocolError``, because dictionaries are unordered and so they may trip this check. Passing dictionaries here is deprecated, and callers should change to using a sequence of 2-tuples as their header blocks. - Correctly reject trailers that contain HTTP/2 pseudo-header fields, per RFC 7540 Section 8.1.2.1. - Correctly refuse to send trailers that contain HTTP/2 pseudo-header fields, per RFC 7540 Section 8.1.2.1. - Correctly reject responses that do not contain the ``:status`` header field, per RFC 7540 Section 8.1.2.4. - Correctly refuse to send responses that do not contain the ``:status`` header field, per RFC 7540 Section 8.1.2.4. - Correctly update the maximum frame size when the user updates the value of that setting. Prior to this release, if the user updated the maximum frame size hyper-h2 would ignore the update, preventing the remote peer from using the higher frame sizes. 2.4.2 (2016-10-25) ------------------ Bugfixes ~~~~~~~~ - Correctly update the maximum frame size when the user updates the value of that setting. Prior to this release, if the user updated the maximum frame size hyper-h2 would ignore the update, preventing the remote peer from using the higher frame sizes. 2.3.3 (2016-10-25) ------------------ Bugfixes ~~~~~~~~ - Correctly update the maximum frame size when the user updates the value of that setting. Prior to this release, if the user updated the maximum frame size hyper-h2 would ignore the update, preventing the remote peer from using the higher frame sizes. 2.2.7 (2016-10-25) ------------------ *Final 2.2.X release* Bugfixes ~~~~~~~~ - Correctly update the maximum frame size when the user updates the value of that setting. Prior to this release, if the user updated the maximum frame size hyper-h2 would ignore the update, preventing the remote peer from using the higher frame sizes. 2.4.1 (2016-08-23) ------------------ Bugfixes ~~~~~~~~ - Correctly expect that responses to HEAD requests will have no body regardless of the value of the Content-Length header, and reject those that do. 2.3.2 (2016-08-23) ------------------ Bugfixes ~~~~~~~~ - Correctly expect that responses to HEAD requests will have no body regardless of the value of the Content-Length header, and reject those that do. 2.4.0 (2016-07-01) ------------------ API Changes (Backward-Compatible) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - Adds ``additional_data`` to ``H2Connection.close_connection``, allowing the user to send additional debug data on the GOAWAY frame. - Adds ``last_stream_id`` to ``H2Connection.close_connection``, allowing the user to manually control what the reported last stream ID is. - Add new method: ``prioritize``. - Add support for emitting stream priority information when sending headers frames using three new keyword arguments: ``priority_weight``, ``priority_depends_on``, and ``priority_exclusive``. - Add support for "related events": events that fire simultaneously on a single frame. 2.3.1 (2016-05-12) ------------------ Bugfixes ~~~~~~~~ - Resolved ``AttributeError`` encountered when receiving more than one sequence of CONTINUATION frames on a given connection. 2.2.5 (2016-05-12) ------------------ Bugfixes ~~~~~~~~ - Resolved ``AttributeError`` encountered when receiving more than one sequence of CONTINUATION frames on a given connection. 2.3.0 (2016-04-26) ------------------ API Changes (Backward-Compatible) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - Added a new flag to the ``H2Connection`` constructor: ``header_encoding``, that controls what encoding is used (if any) to decode the headers from bytes to unicode. This defaults to UTF-8 for backward compatibility. To disable the decode and use bytes exclusively, set the field to False, None, or the empty string. This affects all headers, including those pushed by servers. - Bumped the minimum version of HPACK allowed from 2.0 to 2.2. - Added support for advertising RFC 7838 Alternative services. - Allowed users to provide ``hpack.HeaderTuple`` and ``hpack.NeverIndexedHeaderTuple`` objects to all methods that send headers. - Changed all events that carry headers to emit ``hpack.HeaderTuple`` and ``hpack.NeverIndexedHeaderTuple`` instead of plain tuples. This allows users to maintain header indexing state. - Added support for plaintext upgrade with the ``initiate_upgrade_connection`` method. Bugfixes ~~~~~~~~ - Automatically ensure that all ``Authorization`` and ``Proxy-Authorization`` headers, as well as short ``Cookie`` headers, are prevented from being added to encoding contexts. 2.2.4 (2016-04-25) ------------------ Bugfixes ~~~~~~~~ - Correctly forbid pseudo-headers that were not defined in RFC 7540. - Ignore AltSvc frames, rather than exploding when receiving them. 2.1.5 (2016-04-25) ------------------ *Final 2.1.X release* Bugfixes ~~~~~~~~ - Correctly forbid pseudo-headers that were not defined in RFC 7540. - Ignore AltSvc frames, rather than exploding when receiving them. 2.2.3 (2016-04-13) ------------------ Bugfixes ~~~~~~~~ - Allowed the 4.X series of hyperframe releases as dependencies. 2.1.4 (2016-04-13) ------------------ Bugfixes ~~~~~~~~ - Allowed the 4.X series of hyperframe releases as dependencies. 2.2.2 (2016-04-05) ------------------ Bugfixes ~~~~~~~~ - Fixed issue where informational responses were erroneously not allowed to be sent in the ``HALF_CLOSED_REMOTE`` state. - Fixed issue where informational responses were erroneously not allowed to be received in the ``HALF_CLOSED_LOCAL`` state. - Fixed issue where we allowed information responses to be sent or received after final responses. 2.2.1 (2016-03-23) ------------------ Bugfixes ~~~~~~~~ - Fixed issue where users using locales that did not default to UTF-8 were unable to install source distributions of the package. 2.2.0 (2016-03-23) ------------------ API Changes (Backward-Compatible) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - Added support for sending informational responses (responses with 1XX status) codes as part of the standard flow. HTTP/2 allows zero or more informational responses with no upper limit: hyper-h2 does too. - Added support for receiving informational responses (responses with 1XX status) codes as part of the standard flow. HTTP/2 allows zero or more informational responses with no upper limit: hyper-h2 does too. - Added a new event: ``ReceivedInformationalResponse``. This response is fired when informational responses (those with 1XX status codes). - Added an ``additional_data`` field to the ``ConnectionTerminated`` event that carries any additional data sent on the GOAWAY frame. May be ``None`` if no such data was sent. - Added the ``initial_values`` optional argument to the ``Settings`` object. Bugfixes ~~~~~~~~ - Correctly reject all of the connection-specific headers mentioned in RFC 7540 § 8.1.2.2, not just the ``Connection:`` header. - Defaulted the value of ``SETTINGS_MAX_CONCURRENT_STREAMS`` to 100, unless explicitly overridden. This is a safe defensive initial value for this setting. 2.1.3 (2016-03-16) ------------------ Deprecations ~~~~~~~~~~~~ - Passing dictionaries to ``send_headers`` as the header block is deprecated, and will be removed in 3.0. 2.1.2 (2016-02-17) ------------------ Bugfixes ~~~~~~~~ - Reject attempts to push streams on streams that were themselves pushed: streams can only be pushed on streams that were initiated by the client. - Correctly allow CONTINUATION frames to extend the header block started by a PUSH_PROMISE frame. - Changed our handling of frames received on streams that were reset by the user. Previously these would, at best, cause ProtocolErrors to be raised and the connection to be torn down (rather defeating the point of resetting streams at all) and, at worst, would cause subtle inconsistencies in state between hyper-h2 and the remote peer that could lead to header block decoding errors or flow control blockages. Now when the user resets a stream all further frames received on that stream are ignored except where they affect some form of connection-level state, where they have their effect and are then ignored. - Fixed a bug whereby receiving a PUSH_PROMISE frame on a stream that was closed would cause a RST_STREAM frame to be emitted on the closed-stream, but not the newly-pushed one. Now this causes a ``ProtocolError``. 2.1.1 (2016-02-05) ------------------ Bugfixes ~~~~~~~~ - Added debug representations for all events. - Fixed problems with setup.py that caused trouble on older setuptools/pip installs. 2.1.0 (2016-02-02) ------------------ API Changes (Backward-Compatible) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - Added new field to ``DataReceived``: ``flow_controlled_length``. This is the length of the frame including padded data, allowing users to correctly track changes to the flow control window. - Defined new ``UnsupportedFrameError``, thrown when frames that are known to hyperframe but not supported by hyper-h2 are received. For backward-compatibility reasons, this is a ``ProtocolError`` *and* a ``KeyError``. Bugfixes ~~~~~~~~ - Hyper-h2 now correctly accounts for padding when maintaining flow control windows. - Resolved a bug where hyper-h2 would mistakenly apply SETTINGS_INITIAL_WINDOW_SIZE to the connection flow control window in addition to the stream-level flow control windows. - Invalid Content-Length headers now throw ``ProtocolError`` exceptions and correctly tear the connection down, instead of leaving the connection in an indeterminate state. - Invalid header blocks now throw ``ProtocolError``, rather than a grab bag of possible other exceptions. 2.0.0 (2016-01-25) ------------------ API Changes (Breaking) ~~~~~~~~~~~~~~~~~~~~~~ - Attempts to open streams with invalid stream IDs, either by the remote peer or by the user, are now rejected as a ``ProtocolError``. Previously these were allowed, and would cause remote peers to error. - Receiving frames that have invalid padding now causes the connection to be terminated with a ``ProtocolError`` being raised. Previously these passed undetected. - Settings values set by both the user and the remote peer are now validated when they're set. If they're invalid, a new ``InvalidSettingsValueError`` is raised and, if set by the remote peer, a connection error is signaled. Previously, it was possible to set invalid values. These would either be caught when building frames, or would be allowed to stand. - Settings changes no longer require user action to be acknowledged: hyper-h2 acknowledges them automatically. This moves the location where some exceptions may be thrown, and also causes the ``acknowledge_settings`` method to be removed from the public API. - Removed a number of methods on the ``H2Connection`` object from the public, semantically versioned API, by renaming them to have leading underscores. Specifically, removed: - ``get_stream_by_id`` - ``get_or_create_stream`` - ``begin_new_stream`` - ``receive_frame`` - ``acknowledge_settings`` - Added full support for receiving CONTINUATION frames, including policing logic about when and how they are received. Previously, receiving CONTINUATION frames was not supported and would throw exceptions. - All public API functions on ``H2Connection`` except for ``receive_data`` no longer return lists of events, because these lists were always empty. Events are now only raised by ``receive_data``. - Calls to ``increment_flow_control_window`` with out of range values now raise ``ValueError`` exceptions. Previously they would be allowed, or would cause errors when serializing frames. API Changes (Backward-Compatible) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - Added ``PriorityUpdated`` event for signaling priority changes. - Added ``get_next_available_stream_id`` function. - Receiving DATA frames on streams not in the OPEN or HALF_CLOSED_LOCAL states now causes a stream reset, rather than a connection reset. The error is now also classified as a ``StreamClosedError``, rather than a more generic ``ProtocolError``. - Receiving HEADERS or PUSH_PROMISE frames in the HALF_CLOSED_REMOTE state now causes a stream reset, rather than a connection reset. - Receiving frames that violate the max frame size now causes connection errors with error code FRAME_SIZE_ERROR, not a generic PROTOCOL_ERROR. This condition now also raises a ``FrameTooLargeError``, a new subclass of ``ProtocolError``. - Made ``NoSuchStreamError`` a subclass of ``ProtocolError``. - The ``StreamReset`` event is now also fired whenever a protocol error from the remote peer forces a stream to close early. This is only fired once. - The ``StreamReset`` event now carries a flag, ``remote_reset``, that is set to ``True`` in all cases where ``StreamReset`` would previously have fired (e.g. when the remote peer sent a RST_STREAM), and is set to ``False`` when it fires because the remote peer made a protocol error. - Hyper-h2 now rejects attempts by peers to increment a flow control window by zero bytes. - Hyper-h2 now rejects peers sending header blocks that are ill-formed for a number of reasons as set out in RFC 7540 Section 8.1.2. - Attempting to send non-PRIORITY frames on closed streams now raises ``StreamClosedError``. - Remote peers attempting to increase the flow control window beyond ``2**31 - 1``, either by window increment or by settings frame, are now rejected as ``ProtocolError``. - Local attempts to increase the flow control window beyond ``2**31 - 1`` by window increment are now rejected as ``ProtocolError``. - The bytes that represent individual settings are now available in ``h2.settings``, instead of needing users to import them from hyperframe. Bugfixes ~~~~~~~~ - RFC 7540 requires that a separate minimum stream ID be used for inbound and outbound streams. Hyper-h2 now obeys this requirement. - Hyper-h2 now does a better job of reporting the last stream ID it has partially handled when terminating connections. - Fixed an error in the arguments of ``StreamIDTooLowError``. - Prevent ``ValueError`` leaking from Hyperframe. - Prevent ``struct.error`` and ``InvalidFrameError`` leaking from Hyperframe. 1.1.1 (2015-11-17) ------------------ Bugfixes ~~~~~~~~ - Forcibly lowercase all header names to improve compatibility with implementations that demand lower-case header names. 1.1.0 (2015-10-28) ------------------ API Changes (Backward-Compatible) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - Added a new ``ConnectionTerminated`` event, which fires when GOAWAY frames are received. - Added a subclass of ``NoSuchStreamError``, called ``StreamClosedError``, that fires when actions are taken on a stream that is closed and has had its state flushed from the system. - Added ``StreamIDTooLowError``, raised when the user or the remote peer attempts to create a stream with an ID lower than one previously used in the dialog. Inherits from ``ValueError`` for backward-compatibility reasons. Bugfixes ~~~~~~~~ - Do not throw ``ProtocolError`` when attempting to send multiple GOAWAY frames on one connection. - We no longer forcefully change the decoder table size when settings changes are ACKed, instead waiting for remote acknowledgement of the change. - Improve the performance of checking whether a stream is open. - We now attempt to lazily garbage collect closed streams, to avoid having the state hang around indefinitely, leaking memory. - Avoid further per-stream allocations, leading to substantial performance improvements when many short-lived streams are used. 1.0.0 (2015-10-15) ------------------ - First production release! h2-3.1.1/LICENSE0000664000175000017500000000211613421652727013733 0ustar ubuntuubuntu00000000000000The MIT License (MIT) Copyright (c) 2015-2016 Cory Benfield and contributors 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. h2-3.1.1/MANIFEST.in0000664000175000017500000000045513521033071014452 0ustar ubuntuubuntu00000000000000include README.rst LICENSE CONTRIBUTORS.rst HISTORY.rst tox.ini test_requirements.txt .coveragerc Makefile recursive-include test *.py *.sh graft docs prune docs/build graft visualizer recursive-include examples *.py *.crt *.key *.pem *.csr recursive-include utils *.sh recursive-include _travis *.sh h2-3.1.1/Makefile0000664000175000017500000000021413421652727014363 0ustar ubuntuubuntu00000000000000.PHONY: publish test publish: rm -rf dist/ python setup.py sdist bdist_wheel twine upload -s dist/* test: py.test -n 4 --cov h2 test/ h2-3.1.1/PKG-INFO0000664000175000017500000011226413521033126014014 0ustar ubuntuubuntu00000000000000Metadata-Version: 1.1 Name: h2 Version: 3.1.1 Summary: HTTP/2 State-Machine based protocol implementation Home-page: http://hyper.rtfd.org Author: Cory Benfield Author-email: cory@lukasa.co.uk License: MIT License Description: =============================== hyper-h2: HTTP/2 Protocol Stack =============================== .. image:: https://raw.github.com/Lukasa/hyper/development/docs/source/images/hyper.png .. image:: https://travis-ci.org/python-hyper/hyper-h2.svg?branch=master :target: https://travis-ci.org/python-hyper/hyper-h2 This repository contains a pure-Python implementation of a HTTP/2 protocol stack. It's written from the ground up to be embeddable in whatever program you choose to use, ensuring that you can speak HTTP/2 regardless of your programming paradigm. You use it like this: .. code-block:: python import h2.connection conn = h2.connection.H2Connection() conn.send_headers(stream_id=stream_id, headers=headers) conn.send_data(stream_id, data) socket.sendall(conn.data_to_send()) events = conn.receive_data(socket_data) This repository does not provide a parsing layer, a network layer, or any rules about concurrency. Instead, it's a purely in-memory solution, defined in terms of data actions and HTTP/2 frames. This is one building block of a full Python HTTP implementation. To install it, just run: .. code-block:: console $ pip install h2 Documentation ============= Documentation is available at http://python-hyper.org/h2/. Contributing ============ ``hyper-h2`` welcomes contributions from anyone! Unlike many other projects we are happy to accept cosmetic contributions and small contributions, in addition to large feature requests and changes. Before you contribute (either by opening an issue or filing a pull request), please `read the contribution guidelines`_. .. _read the contribution guidelines: http://python-hyper.org/en/latest/contributing.html License ======= ``hyper-h2`` is made available under the MIT License. For more details, see the ``LICENSE`` file in the repository. Authors ======= ``hyper-h2`` is maintained by Cory Benfield, with contributions from others. For more details about the contributors, please see ``CONTRIBUTORS.rst``. Release History =============== 3.1.1 (2019-08-02) ------------------ Bugfixes ~~~~~~~~ - Ignore WINDOW_UPDATE and RST_STREAM frames received after stream closure. 3.1.0 (2019-01-22) ------------------ API Changes (Backward-Incompatible) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - ``h2.connection.H2Connection.data_to_send`` first and only argument ``amt`` was renamed to ``amount``. - Support for Python 3.3 has been removed. API Changes (Backward-Compatible) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - ``h2.connection.H2Connection.send_data`` now supports ``data`` parameter being a ``memoryview`` object. - Refactor ping-related events: a ``h2.events.PingReceived`` event is fired when a PING frame is received and a ``h2.events.PingAckReceived`` event is fired when a PING frame with an ACK flag is received. ``h2.events.PingAcknowledged`` is deprecated in favour of the identical ``h2.events.PingAckReceived``. - Added ``ENABLE_CONNECT_PROTOCOL`` to ``h2.settings.SettingCodes``. - Support ``CONNECT`` requests with a ``:protocol`` pseudo header thereby supporting RFC 8441. - A limit to the number of closed streams kept in memory by the connection is applied. It can be configured by ``h2.connection.H2Connection.MAX_CLOSED_STREAMS``. Bugfixes ~~~~~~~~ - Debug logging when stream_id is None is now fixed and no longer errors. 3.0.1 (2017-04-03) ------------------ Bugfixes ~~~~~~~~ - CONTINUATION frames sent on closed streams previously caused stream errors of type STREAM_CLOSED. RFC 7540 § 6.10 requires that these be connection errors of type PROTOCOL_ERROR, and so this release changes to match that behaviour. - Remote peers incrementing their inbound connection window beyond the maximum allowed value now cause stream-level errors, rather than connection-level errors, allowing connections to stay up longer. - h2 now rejects receiving and sending request header blocks that are missing any of the mandatory pseudo-header fields (:path, :scheme, and :method). - h2 now rejects receiving and sending request header blocks that have an empty :path pseudo-header value. - h2 now rejects receiving and sending request header blocks that contain response-only pseudo-headers, and vice versa. - h2 now correct respects user-initiated changes to the HEADER_TABLE_SIZE local setting, and ensures that if users shrink or increase the header table size it is policed appropriately. 2.6.2 (2017-04-03) ------------------ Bugfixes ~~~~~~~~ - CONTINUATION frames sent on closed streams previously caused stream errors of type STREAM_CLOSED. RFC 7540 § 6.10 requires that these be connection errors of type PROTOCOL_ERROR, and so this release changes to match that behaviour. - Remote peers incrementing their inbound connection window beyond the maximum allowed value now cause stream-level errors, rather than connection-level errors, allowing connections to stay up longer. - h2 now rejects receiving and sending request header blocks that are missing any of the mandatory pseudo-header fields (:path, :scheme, and :method). - h2 now rejects receiving and sending request header blocks that have an empty :path pseudo-header value. - h2 now rejects receiving and sending request header blocks that contain response-only pseudo-headers, and vice versa. - h2 now correct respects user-initiated changes to the HEADER_TABLE_SIZE local setting, and ensures that if users shrink or increase the header table size it is policed appropriately. 2.5.4 (2017-04-03) ------------------ Bugfixes ~~~~~~~~ - CONTINUATION frames sent on closed streams previously caused stream errors of type STREAM_CLOSED. RFC 7540 § 6.10 requires that these be connection errors of type PROTOCOL_ERROR, and so this release changes to match that behaviour. - Remote peers incrementing their inbound connection window beyond the maximum allowed value now cause stream-level errors, rather than connection-level errors, allowing connections to stay up longer. - h2 now correct respects user-initiated changes to the HEADER_TABLE_SIZE local setting, and ensures that if users shrink or increase the header table size it is policed appropriately. 3.0.0 (2017-03-24) ------------------ API Changes (Backward-Incompatible) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - By default, hyper-h2 now joins together received cookie header fields, per RFC 7540 Section 8.1.2.5. - Added a ``normalize_inbound_headers`` flag to the ``H2Configuration`` object that defaults to ``True``. Setting this to ``False`` changes the behaviour from the previous point back to the v2 behaviour. - Removed deprecated fields from ``h2.errors`` module. - Removed deprecated fields from ``h2.settings`` module. - Removed deprecated ``client_side`` and ``header_encoding`` arguments from ``H2Connection``. - Removed deprecated ``client_side`` and ``header_encoding`` properties from ``H2Connection``. - ``dict`` objects are no longer allowed for user-supplied headers. - The default header encoding is now ``None``, not ``utf-8``: this means that all events that carry headers now return those headers as byte strings by default. The header encoding can be set back to ``utf-8`` to restore the old behaviour. API Changes (Backward-Compatible) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - Added new ``UnknownFrameReceived`` event that fires when unknown extension frames have been received. This only fires when using hyperframe 5.0 or later: earlier versions of hyperframe cause us to silently ignore extension frames. Bugfixes ~~~~~~~~ None 2.6.1 (2017-03-16) ------------------ Bugfixes ~~~~~~~~ - Allowed hyperframe v5 support while continuing to ignore unexpected frames. 2.5.3 (2017-03-16) ------------------ Bugfixes ~~~~~~~~ - Allowed hyperframe v5 support while continuing to ignore unexpected frames. 2.4.4 (2017-03-16) ------------------ Bugfixes ~~~~~~~~ - Allowed hyperframe v5 support while continuing to ignore unexpected frames. 2.6.0 (2017-02-28) ------------------ API Changes (Backward-Compatible) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - Added a new ``h2.events.Event`` class that acts as a base class for all events. - Rather than reject outbound Connection-specific headers, h2 will now normalize the header block by removing them. - Implement equality for the ``h2.settings.Settings`` class. - Added ``h2.settings.SettingCodes``, an enum that is used to store all the HTTP/2 setting codes. This allows us to use a better printed representation of the setting code in most places that it is used. - The ``setting`` field in ``ChangedSetting`` for the ``RemoteSettingsChanged`` and ``SettingsAcknowledged`` events has been updated to be instances of ``SettingCodes`` whenever they correspond to a known setting code. When they are an unknown setting code, they are instead ``int``. As ``SettingCodes`` is a subclass of ``int``, this is non-breaking. - Deprecated the other fields in ``h2.settings``. These will be removed in 3.0.0. - Added an optional ``pad_length`` parameter to ``H2Connection.send_data`` to allow the user to include padding on a data frame. - Added a new parameter to the ``h2.config.H2Configuration`` initializer which takes a logger. This allows us to log by providing a logger that conforms to the requirements of this module so that it can be used in different environments. Bugfixes ~~~~~~~~ - Correctly reject pushed request header blocks whenever they have malformed request header blocks. - Correctly normalize pushed request header blocks whenever they have normalizable header fields. - Remote peers are now allowed to send zero or any positive number as a value for ``SETTINGS_MAX_HEADER_LIST_SIZE``, where previously sending zero would raise a ``InvalidSettingsValueError``. - Resolved issue where the ``HTTP2-Settings`` header value for plaintext upgrade that was emitted by ``initiate_upgrade_connection`` included the *entire* ``SETTINGS`` frame, instead of just the payload. - Resolved issue where the ``HTTP2-Settings`` header value sent by a client for plaintext upgrade would be ignored by ``initiate_upgrade_connection``, rather than have those settings applied appropriately. - Resolved an issue whereby certain frames received from a peer in the CLOSED state would trigger connection errors when RFC 7540 says they should have triggered stream errors instead. Added more detailed stream closure tracking to ensure we don't throw away connections unnecessarily. 2.5.2 (2017-01-27) ------------------ - Resolved issue where the ``HTTP2-Settings`` header value for plaintext upgrade that was emitted by ``initiate_upgrade_connection`` included the *entire* ``SETTINGS`` frame, instead of just the payload. - Resolved issue where the ``HTTP2-Settings`` header value sent by a client for plaintext upgrade would be ignored by ``initiate_upgrade_connection``, rather than have those settings applied appropriately. 2.4.3 (2017-01-27) ------------------ - Resolved issue where the ``HTTP2-Settings`` header value for plaintext upgrade that was emitted by ``initiate_upgrade_connection`` included the *entire* ``SETTINGS`` frame, instead of just the payload. - Resolved issue where the ``HTTP2-Settings`` header value sent by a client for plaintext upgrade would be ignored by ``initiate_upgrade_connection``, rather than have those settings applied appropriately. 2.3.4 (2017-01-27) ------------------ - Resolved issue where the ``HTTP2-Settings`` header value for plaintext upgrade that was emitted by ``initiate_upgrade_connection`` included the *entire* ``SETTINGS`` frame, instead of just the payload. - Resolved issue where the ``HTTP2-Settings`` header value sent by a client for plaintext upgrade would be ignored by ``initiate_upgrade_connection``, rather than have those settings applied appropriately. 2.5.1 (2016-12-17) ------------------ Bugfixes ~~~~~~~~ - Remote peers are now allowed to send zero or any positive number as a value for ``SETTINGS_MAX_HEADER_LIST_SIZE``, where previously sending zero would raise a ``InvalidSettingsValueError``. 2.5.0 (2016-10-25) ------------------ API Changes (Backward-Compatible) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - Added a new ``H2Configuration`` object that allows rich configuration of a ``H2Connection``. This object supersedes the prior keyword arguments to the ``H2Connection`` object, which are now deprecated and will be removed in 3.0. - Added support for automated window management via the ``acknowledge_received_data`` method. See the documentation for more details. - Added a ``DenialOfServiceError`` that is raised whenever a behaviour that looks like a DoS attempt is encountered: for example, an overly large decompressed header list. This is a subclass of ``ProtocolError``. - Added support for setting and managing ``SETTINGS_MAX_HEADER_LIST_SIZE``. This setting is now defaulted to 64kB. - Added ``h2.errors.ErrorCodes``, an enum that is used to store all the HTTP/2 error codes. This allows us to use a better printed representation of the error code in most places that it is used. - The ``error_code`` fields on ``ConnectionTerminated`` and ``StreamReset`` events have been updated to be instances of ``ErrorCodes`` whenever they correspond to a known error code. When they are an unknown error code, they are instead ``int``. As ``ErrorCodes`` is a subclass of ``int``, this is non-breaking. - Deprecated the other fields in ``h2.errors``. These will be removed in 3.0.0. Bugfixes ~~~~~~~~ - Correctly reject request header blocks with neither :authority nor Host headers, or header blocks which contain mismatched :authority and Host headers, per RFC 7540 Section 8.1.2.3. - Correctly expect that responses to HEAD requests will have no body regardless of the value of the Content-Length header, and reject those that do. - Correctly refuse to send header blocks that contain neither :authority nor Host headers, or header blocks which contain mismatched :authority and Host headers, per RFC 7540 Section 8.1.2.3. - Hyper-h2 will now reject header field names and values that contain leading or trailing whitespace. - Correctly strip leading/trailing whitespace from header field names and values. - Correctly refuse to send header blocks with a TE header whose value is not ``trailers``, per RFC 7540 Section 8.1.2.2. - Correctly refuse to send header blocks with connection-specific headers, per RFC 7540 Section 8.1.2.2. - Correctly refuse to send header blocks that contain duplicate pseudo-header fields, or with pseudo-header fields that appear after ordinary header fields, per RFC 7540 Section 8.1.2.1. This may cause passing a dictionary as the header block to ``send_headers`` to throw a ``ProtocolError``, because dictionaries are unordered and so they may trip this check. Passing dictionaries here is deprecated, and callers should change to using a sequence of 2-tuples as their header blocks. - Correctly reject trailers that contain HTTP/2 pseudo-header fields, per RFC 7540 Section 8.1.2.1. - Correctly refuse to send trailers that contain HTTP/2 pseudo-header fields, per RFC 7540 Section 8.1.2.1. - Correctly reject responses that do not contain the ``:status`` header field, per RFC 7540 Section 8.1.2.4. - Correctly refuse to send responses that do not contain the ``:status`` header field, per RFC 7540 Section 8.1.2.4. - Correctly update the maximum frame size when the user updates the value of that setting. Prior to this release, if the user updated the maximum frame size hyper-h2 would ignore the update, preventing the remote peer from using the higher frame sizes. 2.4.2 (2016-10-25) ------------------ Bugfixes ~~~~~~~~ - Correctly update the maximum frame size when the user updates the value of that setting. Prior to this release, if the user updated the maximum frame size hyper-h2 would ignore the update, preventing the remote peer from using the higher frame sizes. 2.3.3 (2016-10-25) ------------------ Bugfixes ~~~~~~~~ - Correctly update the maximum frame size when the user updates the value of that setting. Prior to this release, if the user updated the maximum frame size hyper-h2 would ignore the update, preventing the remote peer from using the higher frame sizes. 2.2.7 (2016-10-25) ------------------ *Final 2.2.X release* Bugfixes ~~~~~~~~ - Correctly update the maximum frame size when the user updates the value of that setting. Prior to this release, if the user updated the maximum frame size hyper-h2 would ignore the update, preventing the remote peer from using the higher frame sizes. 2.4.1 (2016-08-23) ------------------ Bugfixes ~~~~~~~~ - Correctly expect that responses to HEAD requests will have no body regardless of the value of the Content-Length header, and reject those that do. 2.3.2 (2016-08-23) ------------------ Bugfixes ~~~~~~~~ - Correctly expect that responses to HEAD requests will have no body regardless of the value of the Content-Length header, and reject those that do. 2.4.0 (2016-07-01) ------------------ API Changes (Backward-Compatible) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - Adds ``additional_data`` to ``H2Connection.close_connection``, allowing the user to send additional debug data on the GOAWAY frame. - Adds ``last_stream_id`` to ``H2Connection.close_connection``, allowing the user to manually control what the reported last stream ID is. - Add new method: ``prioritize``. - Add support for emitting stream priority information when sending headers frames using three new keyword arguments: ``priority_weight``, ``priority_depends_on``, and ``priority_exclusive``. - Add support for "related events": events that fire simultaneously on a single frame. 2.3.1 (2016-05-12) ------------------ Bugfixes ~~~~~~~~ - Resolved ``AttributeError`` encountered when receiving more than one sequence of CONTINUATION frames on a given connection. 2.2.5 (2016-05-12) ------------------ Bugfixes ~~~~~~~~ - Resolved ``AttributeError`` encountered when receiving more than one sequence of CONTINUATION frames on a given connection. 2.3.0 (2016-04-26) ------------------ API Changes (Backward-Compatible) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - Added a new flag to the ``H2Connection`` constructor: ``header_encoding``, that controls what encoding is used (if any) to decode the headers from bytes to unicode. This defaults to UTF-8 for backward compatibility. To disable the decode and use bytes exclusively, set the field to False, None, or the empty string. This affects all headers, including those pushed by servers. - Bumped the minimum version of HPACK allowed from 2.0 to 2.2. - Added support for advertising RFC 7838 Alternative services. - Allowed users to provide ``hpack.HeaderTuple`` and ``hpack.NeverIndexedHeaderTuple`` objects to all methods that send headers. - Changed all events that carry headers to emit ``hpack.HeaderTuple`` and ``hpack.NeverIndexedHeaderTuple`` instead of plain tuples. This allows users to maintain header indexing state. - Added support for plaintext upgrade with the ``initiate_upgrade_connection`` method. Bugfixes ~~~~~~~~ - Automatically ensure that all ``Authorization`` and ``Proxy-Authorization`` headers, as well as short ``Cookie`` headers, are prevented from being added to encoding contexts. 2.2.4 (2016-04-25) ------------------ Bugfixes ~~~~~~~~ - Correctly forbid pseudo-headers that were not defined in RFC 7540. - Ignore AltSvc frames, rather than exploding when receiving them. 2.1.5 (2016-04-25) ------------------ *Final 2.1.X release* Bugfixes ~~~~~~~~ - Correctly forbid pseudo-headers that were not defined in RFC 7540. - Ignore AltSvc frames, rather than exploding when receiving them. 2.2.3 (2016-04-13) ------------------ Bugfixes ~~~~~~~~ - Allowed the 4.X series of hyperframe releases as dependencies. 2.1.4 (2016-04-13) ------------------ Bugfixes ~~~~~~~~ - Allowed the 4.X series of hyperframe releases as dependencies. 2.2.2 (2016-04-05) ------------------ Bugfixes ~~~~~~~~ - Fixed issue where informational responses were erroneously not allowed to be sent in the ``HALF_CLOSED_REMOTE`` state. - Fixed issue where informational responses were erroneously not allowed to be received in the ``HALF_CLOSED_LOCAL`` state. - Fixed issue where we allowed information responses to be sent or received after final responses. 2.2.1 (2016-03-23) ------------------ Bugfixes ~~~~~~~~ - Fixed issue where users using locales that did not default to UTF-8 were unable to install source distributions of the package. 2.2.0 (2016-03-23) ------------------ API Changes (Backward-Compatible) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - Added support for sending informational responses (responses with 1XX status) codes as part of the standard flow. HTTP/2 allows zero or more informational responses with no upper limit: hyper-h2 does too. - Added support for receiving informational responses (responses with 1XX status) codes as part of the standard flow. HTTP/2 allows zero or more informational responses with no upper limit: hyper-h2 does too. - Added a new event: ``ReceivedInformationalResponse``. This response is fired when informational responses (those with 1XX status codes). - Added an ``additional_data`` field to the ``ConnectionTerminated`` event that carries any additional data sent on the GOAWAY frame. May be ``None`` if no such data was sent. - Added the ``initial_values`` optional argument to the ``Settings`` object. Bugfixes ~~~~~~~~ - Correctly reject all of the connection-specific headers mentioned in RFC 7540 § 8.1.2.2, not just the ``Connection:`` header. - Defaulted the value of ``SETTINGS_MAX_CONCURRENT_STREAMS`` to 100, unless explicitly overridden. This is a safe defensive initial value for this setting. 2.1.3 (2016-03-16) ------------------ Deprecations ~~~~~~~~~~~~ - Passing dictionaries to ``send_headers`` as the header block is deprecated, and will be removed in 3.0. 2.1.2 (2016-02-17) ------------------ Bugfixes ~~~~~~~~ - Reject attempts to push streams on streams that were themselves pushed: streams can only be pushed on streams that were initiated by the client. - Correctly allow CONTINUATION frames to extend the header block started by a PUSH_PROMISE frame. - Changed our handling of frames received on streams that were reset by the user. Previously these would, at best, cause ProtocolErrors to be raised and the connection to be torn down (rather defeating the point of resetting streams at all) and, at worst, would cause subtle inconsistencies in state between hyper-h2 and the remote peer that could lead to header block decoding errors or flow control blockages. Now when the user resets a stream all further frames received on that stream are ignored except where they affect some form of connection-level state, where they have their effect and are then ignored. - Fixed a bug whereby receiving a PUSH_PROMISE frame on a stream that was closed would cause a RST_STREAM frame to be emitted on the closed-stream, but not the newly-pushed one. Now this causes a ``ProtocolError``. 2.1.1 (2016-02-05) ------------------ Bugfixes ~~~~~~~~ - Added debug representations for all events. - Fixed problems with setup.py that caused trouble on older setuptools/pip installs. 2.1.0 (2016-02-02) ------------------ API Changes (Backward-Compatible) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - Added new field to ``DataReceived``: ``flow_controlled_length``. This is the length of the frame including padded data, allowing users to correctly track changes to the flow control window. - Defined new ``UnsupportedFrameError``, thrown when frames that are known to hyperframe but not supported by hyper-h2 are received. For backward-compatibility reasons, this is a ``ProtocolError`` *and* a ``KeyError``. Bugfixes ~~~~~~~~ - Hyper-h2 now correctly accounts for padding when maintaining flow control windows. - Resolved a bug where hyper-h2 would mistakenly apply SETTINGS_INITIAL_WINDOW_SIZE to the connection flow control window in addition to the stream-level flow control windows. - Invalid Content-Length headers now throw ``ProtocolError`` exceptions and correctly tear the connection down, instead of leaving the connection in an indeterminate state. - Invalid header blocks now throw ``ProtocolError``, rather than a grab bag of possible other exceptions. 2.0.0 (2016-01-25) ------------------ API Changes (Breaking) ~~~~~~~~~~~~~~~~~~~~~~ - Attempts to open streams with invalid stream IDs, either by the remote peer or by the user, are now rejected as a ``ProtocolError``. Previously these were allowed, and would cause remote peers to error. - Receiving frames that have invalid padding now causes the connection to be terminated with a ``ProtocolError`` being raised. Previously these passed undetected. - Settings values set by both the user and the remote peer are now validated when they're set. If they're invalid, a new ``InvalidSettingsValueError`` is raised and, if set by the remote peer, a connection error is signaled. Previously, it was possible to set invalid values. These would either be caught when building frames, or would be allowed to stand. - Settings changes no longer require user action to be acknowledged: hyper-h2 acknowledges them automatically. This moves the location where some exceptions may be thrown, and also causes the ``acknowledge_settings`` method to be removed from the public API. - Removed a number of methods on the ``H2Connection`` object from the public, semantically versioned API, by renaming them to have leading underscores. Specifically, removed: - ``get_stream_by_id`` - ``get_or_create_stream`` - ``begin_new_stream`` - ``receive_frame`` - ``acknowledge_settings`` - Added full support for receiving CONTINUATION frames, including policing logic about when and how they are received. Previously, receiving CONTINUATION frames was not supported and would throw exceptions. - All public API functions on ``H2Connection`` except for ``receive_data`` no longer return lists of events, because these lists were always empty. Events are now only raised by ``receive_data``. - Calls to ``increment_flow_control_window`` with out of range values now raise ``ValueError`` exceptions. Previously they would be allowed, or would cause errors when serializing frames. API Changes (Backward-Compatible) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - Added ``PriorityUpdated`` event for signaling priority changes. - Added ``get_next_available_stream_id`` function. - Receiving DATA frames on streams not in the OPEN or HALF_CLOSED_LOCAL states now causes a stream reset, rather than a connection reset. The error is now also classified as a ``StreamClosedError``, rather than a more generic ``ProtocolError``. - Receiving HEADERS or PUSH_PROMISE frames in the HALF_CLOSED_REMOTE state now causes a stream reset, rather than a connection reset. - Receiving frames that violate the max frame size now causes connection errors with error code FRAME_SIZE_ERROR, not a generic PROTOCOL_ERROR. This condition now also raises a ``FrameTooLargeError``, a new subclass of ``ProtocolError``. - Made ``NoSuchStreamError`` a subclass of ``ProtocolError``. - The ``StreamReset`` event is now also fired whenever a protocol error from the remote peer forces a stream to close early. This is only fired once. - The ``StreamReset`` event now carries a flag, ``remote_reset``, that is set to ``True`` in all cases where ``StreamReset`` would previously have fired (e.g. when the remote peer sent a RST_STREAM), and is set to ``False`` when it fires because the remote peer made a protocol error. - Hyper-h2 now rejects attempts by peers to increment a flow control window by zero bytes. - Hyper-h2 now rejects peers sending header blocks that are ill-formed for a number of reasons as set out in RFC 7540 Section 8.1.2. - Attempting to send non-PRIORITY frames on closed streams now raises ``StreamClosedError``. - Remote peers attempting to increase the flow control window beyond ``2**31 - 1``, either by window increment or by settings frame, are now rejected as ``ProtocolError``. - Local attempts to increase the flow control window beyond ``2**31 - 1`` by window increment are now rejected as ``ProtocolError``. - The bytes that represent individual settings are now available in ``h2.settings``, instead of needing users to import them from hyperframe. Bugfixes ~~~~~~~~ - RFC 7540 requires that a separate minimum stream ID be used for inbound and outbound streams. Hyper-h2 now obeys this requirement. - Hyper-h2 now does a better job of reporting the last stream ID it has partially handled when terminating connections. - Fixed an error in the arguments of ``StreamIDTooLowError``. - Prevent ``ValueError`` leaking from Hyperframe. - Prevent ``struct.error`` and ``InvalidFrameError`` leaking from Hyperframe. 1.1.1 (2015-11-17) ------------------ Bugfixes ~~~~~~~~ - Forcibly lowercase all header names to improve compatibility with implementations that demand lower-case header names. 1.1.0 (2015-10-28) ------------------ API Changes (Backward-Compatible) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - Added a new ``ConnectionTerminated`` event, which fires when GOAWAY frames are received. - Added a subclass of ``NoSuchStreamError``, called ``StreamClosedError``, that fires when actions are taken on a stream that is closed and has had its state flushed from the system. - Added ``StreamIDTooLowError``, raised when the user or the remote peer attempts to create a stream with an ID lower than one previously used in the dialog. Inherits from ``ValueError`` for backward-compatibility reasons. Bugfixes ~~~~~~~~ - Do not throw ``ProtocolError`` when attempting to send multiple GOAWAY frames on one connection. - We no longer forcefully change the decoder table size when settings changes are ACKed, instead waiting for remote acknowledgement of the change. - Improve the performance of checking whether a stream is open. - We now attempt to lazily garbage collect closed streams, to avoid having the state hang around indefinitely, leaking memory. - Avoid further per-stream allocations, leading to substantial performance improvements when many short-lived streams are used. 1.0.0 (2015-10-15) ------------------ - First production release! Platform: UNKNOWN Classifier: Development Status :: 5 - Production/Stable Classifier: Intended Audience :: Developers Classifier: License :: OSI Approved :: MIT License Classifier: Programming Language :: Python Classifier: Programming Language :: Python :: 2 Classifier: Programming Language :: Python :: 2.7 Classifier: Programming Language :: Python :: 3 Classifier: Programming Language :: Python :: 3.3 Classifier: Programming Language :: Python :: 3.4 Classifier: Programming Language :: Python :: 3.5 Classifier: Programming Language :: Python :: 3.6 Classifier: Programming Language :: Python :: Implementation :: CPython Classifier: Programming Language :: Python :: Implementation :: PyPy h2-3.1.1/README.rst0000664000175000017500000000374513421652727014426 0ustar ubuntuubuntu00000000000000=============================== hyper-h2: HTTP/2 Protocol Stack =============================== .. image:: https://raw.github.com/Lukasa/hyper/development/docs/source/images/hyper.png .. image:: https://travis-ci.org/python-hyper/hyper-h2.svg?branch=master :target: https://travis-ci.org/python-hyper/hyper-h2 This repository contains a pure-Python implementation of a HTTP/2 protocol stack. It's written from the ground up to be embeddable in whatever program you choose to use, ensuring that you can speak HTTP/2 regardless of your programming paradigm. You use it like this: .. code-block:: python import h2.connection conn = h2.connection.H2Connection() conn.send_headers(stream_id=stream_id, headers=headers) conn.send_data(stream_id, data) socket.sendall(conn.data_to_send()) events = conn.receive_data(socket_data) This repository does not provide a parsing layer, a network layer, or any rules about concurrency. Instead, it's a purely in-memory solution, defined in terms of data actions and HTTP/2 frames. This is one building block of a full Python HTTP implementation. To install it, just run: .. code-block:: console $ pip install h2 Documentation ============= Documentation is available at http://python-hyper.org/h2/. Contributing ============ ``hyper-h2`` welcomes contributions from anyone! Unlike many other projects we are happy to accept cosmetic contributions and small contributions, in addition to large feature requests and changes. Before you contribute (either by opening an issue or filing a pull request), please `read the contribution guidelines`_. .. _read the contribution guidelines: http://python-hyper.org/en/latest/contributing.html License ======= ``hyper-h2`` is made available under the MIT License. For more details, see the ``LICENSE`` file in the repository. Authors ======= ``hyper-h2`` is maintained by Cory Benfield, with contributions from others. For more details about the contributors, please see ``CONTRIBUTORS.rst``. h2-3.1.1/_travis/0000775000175000017500000000000013521033126014360 5ustar ubuntuubuntu00000000000000h2-3.1.1/_travis/install.sh0000775000175000017500000000145313521033071016367 0ustar ubuntuubuntu00000000000000#!/usr/bin/env bash set -e set -x pip install -U pip setuptools pip install -U tox if [ $TOXENV = "h2spec" ]; then # For some reason it helps to have this here. echo $(curl -s https://api.github.com/repos/summerwind/h2spec/releases/latest) # We want to get the latest release of h2spec. We do that by asking the # Github API for it, and then parsing the JSON for the appropriate kind of # binary. Happily, the binary is always called "h2spec" so we don't need # even more shenanigans to get this to work. TARBALL=$(curl -s https://api.github.com/repos/summerwind/h2spec/releases/latest | jq --raw-output '.assets[] | .browser_download_url | select(endswith("linux_amd64.tar.gz"))') curl -L "$TARBALL" -o h2spec.tgz tar xvf h2spec.tgz mkdir bin mv h2spec ./bin/ fi h2-3.1.1/docs/0000775000175000017500000000000013521033126013641 5ustar ubuntuubuntu00000000000000h2-3.1.1/docs/Makefile0000664000175000017500000001517313421652727015325 0ustar ubuntuubuntu00000000000000# Makefile for Sphinx documentation # # You can set these variables from the command line. SPHINXOPTS = SPHINXBUILD = sphinx-build PAPER = BUILDDIR = build # User-friendly check for sphinx-build ifeq ($(shell which $(SPHINXBUILD) >/dev/null 2>&1; echo $$?), 1) $(error The '$(SPHINXBUILD)' command was not found. Make sure you have Sphinx installed, then set the SPHINXBUILD environment variable to point to the full path of the '$(SPHINXBUILD)' executable. Alternatively you can add the directory with the executable to your PATH. If you don't have Sphinx installed, grab it from http://sphinx-doc.org/) endif # Internal variables. PAPEROPT_a4 = -D latex_paper_size=a4 PAPEROPT_letter = -D latex_paper_size=letter ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) source # the i18n builder cannot share the environment and doctrees with the others I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) source .PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest gettext help: @echo "Please use \`make ' where is one of" @echo " html to make standalone HTML files" @echo " dirhtml to make HTML files named index.html in directories" @echo " singlehtml to make a single large HTML file" @echo " pickle to make pickle files" @echo " json to make JSON files" @echo " htmlhelp to make HTML files and a HTML help project" @echo " qthelp to make HTML files and a qthelp project" @echo " devhelp to make HTML files and a Devhelp project" @echo " epub to make an epub" @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" @echo " latexpdf to make LaTeX files and run them through pdflatex" @echo " latexpdfja to make LaTeX files and run them through platex/dvipdfmx" @echo " text to make text files" @echo " man to make manual pages" @echo " texinfo to make Texinfo files" @echo " info to make Texinfo files and run them through makeinfo" @echo " gettext to make PO message catalogs" @echo " changes to make an overview of all changed/added/deprecated items" @echo " xml to make Docutils-native XML files" @echo " pseudoxml to make pseudoxml-XML files for display purposes" @echo " linkcheck to check all external links for integrity" @echo " doctest to run all doctests embedded in the documentation (if enabled)" clean: rm -rf $(BUILDDIR)/* html: $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html @echo @echo "Build finished. The HTML pages are in $(BUILDDIR)/html." dirhtml: $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml @echo @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml." singlehtml: $(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml @echo @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml." pickle: $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle @echo @echo "Build finished; now you can process the pickle files." json: $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json @echo @echo "Build finished; now you can process the JSON files." htmlhelp: $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp @echo @echo "Build finished; now you can run HTML Help Workshop with the" \ ".hhp project file in $(BUILDDIR)/htmlhelp." qthelp: $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp @echo @echo "Build finished; now you can run "qcollectiongenerator" with the" \ ".qhcp project file in $(BUILDDIR)/qthelp, like this:" @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/hyper-h2.qhcp" @echo "To view the help file:" @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/hyper-h2.qhc" devhelp: $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp @echo @echo "Build finished." @echo "To view the help file:" @echo "# mkdir -p $$HOME/.local/share/devhelp/hyper-h2" @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/hyper-h2" @echo "# devhelp" epub: $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub @echo @echo "Build finished. The epub file is in $(BUILDDIR)/epub." latex: $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex @echo @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex." @echo "Run \`make' in that directory to run these through (pdf)latex" \ "(use \`make latexpdf' here to do that automatically)." latexpdf: $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex @echo "Running LaTeX files through pdflatex..." $(MAKE) -C $(BUILDDIR)/latex all-pdf @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." latexpdfja: $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex @echo "Running LaTeX files through platex and dvipdfmx..." $(MAKE) -C $(BUILDDIR)/latex all-pdf-ja @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." text: $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text @echo @echo "Build finished. The text files are in $(BUILDDIR)/text." man: $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man @echo @echo "Build finished. The manual pages are in $(BUILDDIR)/man." texinfo: $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo @echo @echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo." @echo "Run \`make' in that directory to run these through makeinfo" \ "(use \`make info' here to do that automatically)." info: $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo @echo "Running Texinfo files through makeinfo..." make -C $(BUILDDIR)/texinfo info @echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo." gettext: $(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale @echo @echo "Build finished. The message catalogs are in $(BUILDDIR)/locale." changes: $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes @echo @echo "The overview file is in $(BUILDDIR)/changes." linkcheck: $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck @echo @echo "Link check complete; look for any errors in the above output " \ "or in $(BUILDDIR)/linkcheck/output.txt." doctest: $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest @echo "Testing of doctests in the sources finished, look at the " \ "results in $(BUILDDIR)/doctest/output.txt." xml: $(SPHINXBUILD) -b xml $(ALLSPHINXOPTS) $(BUILDDIR)/xml @echo @echo "Build finished. The XML files are in $(BUILDDIR)/xml." pseudoxml: $(SPHINXBUILD) -b pseudoxml $(ALLSPHINXOPTS) $(BUILDDIR)/pseudoxml @echo @echo "Build finished. The pseudo-XML files are in $(BUILDDIR)/pseudoxml." h2-3.1.1/docs/make.bat0000664000175000017500000001507213421652727015270 0ustar ubuntuubuntu00000000000000@ECHO OFF REM Command file for Sphinx documentation if "%SPHINXBUILD%" == "" ( set SPHINXBUILD=sphinx-build ) set BUILDDIR=build set ALLSPHINXOPTS=-d %BUILDDIR%/doctrees %SPHINXOPTS% source set I18NSPHINXOPTS=%SPHINXOPTS% source if NOT "%PAPER%" == "" ( set ALLSPHINXOPTS=-D latex_paper_size=%PAPER% %ALLSPHINXOPTS% set I18NSPHINXOPTS=-D latex_paper_size=%PAPER% %I18NSPHINXOPTS% ) if "%1" == "" goto help if "%1" == "help" ( :help echo.Please use `make ^` where ^ is one of echo. html to make standalone HTML files echo. dirhtml to make HTML files named index.html in directories echo. singlehtml to make a single large HTML file echo. pickle to make pickle files echo. json to make JSON files echo. htmlhelp to make HTML files and a HTML help project echo. qthelp to make HTML files and a qthelp project echo. devhelp to make HTML files and a Devhelp project echo. epub to make an epub echo. latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter echo. text to make text files echo. man to make manual pages echo. texinfo to make Texinfo files echo. gettext to make PO message catalogs echo. changes to make an overview over all changed/added/deprecated items echo. xml to make Docutils-native XML files echo. pseudoxml to make pseudoxml-XML files for display purposes echo. linkcheck to check all external links for integrity echo. doctest to run all doctests embedded in the documentation if enabled goto end ) if "%1" == "clean" ( for /d %%i in (%BUILDDIR%\*) do rmdir /q /s %%i del /q /s %BUILDDIR%\* goto end ) %SPHINXBUILD% 2> nul if errorlevel 9009 ( echo. echo.The 'sphinx-build' command was not found. Make sure you have Sphinx echo.installed, then set the SPHINXBUILD environment variable to point echo.to the full path of the 'sphinx-build' executable. Alternatively you echo.may add the Sphinx directory to PATH. echo. echo.If you don't have Sphinx installed, grab it from echo.http://sphinx-doc.org/ exit /b 1 ) if "%1" == "html" ( %SPHINXBUILD% -b html %ALLSPHINXOPTS% %BUILDDIR%/html if errorlevel 1 exit /b 1 echo. echo.Build finished. The HTML pages are in %BUILDDIR%/html. goto end ) if "%1" == "dirhtml" ( %SPHINXBUILD% -b dirhtml %ALLSPHINXOPTS% %BUILDDIR%/dirhtml if errorlevel 1 exit /b 1 echo. echo.Build finished. The HTML pages are in %BUILDDIR%/dirhtml. goto end ) if "%1" == "singlehtml" ( %SPHINXBUILD% -b singlehtml %ALLSPHINXOPTS% %BUILDDIR%/singlehtml if errorlevel 1 exit /b 1 echo. echo.Build finished. The HTML pages are in %BUILDDIR%/singlehtml. goto end ) if "%1" == "pickle" ( %SPHINXBUILD% -b pickle %ALLSPHINXOPTS% %BUILDDIR%/pickle if errorlevel 1 exit /b 1 echo. echo.Build finished; now you can process the pickle files. goto end ) if "%1" == "json" ( %SPHINXBUILD% -b json %ALLSPHINXOPTS% %BUILDDIR%/json if errorlevel 1 exit /b 1 echo. echo.Build finished; now you can process the JSON files. goto end ) if "%1" == "htmlhelp" ( %SPHINXBUILD% -b htmlhelp %ALLSPHINXOPTS% %BUILDDIR%/htmlhelp if errorlevel 1 exit /b 1 echo. echo.Build finished; now you can run HTML Help Workshop with the ^ .hhp project file in %BUILDDIR%/htmlhelp. goto end ) if "%1" == "qthelp" ( %SPHINXBUILD% -b qthelp %ALLSPHINXOPTS% %BUILDDIR%/qthelp if errorlevel 1 exit /b 1 echo. echo.Build finished; now you can run "qcollectiongenerator" with the ^ .qhcp project file in %BUILDDIR%/qthelp, like this: echo.^> qcollectiongenerator %BUILDDIR%\qthelp\hyper-h2.qhcp echo.To view the help file: echo.^> assistant -collectionFile %BUILDDIR%\qthelp\hyper-h2.ghc goto end ) if "%1" == "devhelp" ( %SPHINXBUILD% -b devhelp %ALLSPHINXOPTS% %BUILDDIR%/devhelp if errorlevel 1 exit /b 1 echo. echo.Build finished. goto end ) if "%1" == "epub" ( %SPHINXBUILD% -b epub %ALLSPHINXOPTS% %BUILDDIR%/epub if errorlevel 1 exit /b 1 echo. echo.Build finished. The epub file is in %BUILDDIR%/epub. goto end ) if "%1" == "latex" ( %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex if errorlevel 1 exit /b 1 echo. echo.Build finished; the LaTeX files are in %BUILDDIR%/latex. goto end ) if "%1" == "latexpdf" ( %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex cd %BUILDDIR%/latex make all-pdf cd %BUILDDIR%/.. echo. echo.Build finished; the PDF files are in %BUILDDIR%/latex. goto end ) if "%1" == "latexpdfja" ( %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex cd %BUILDDIR%/latex make all-pdf-ja cd %BUILDDIR%/.. echo. echo.Build finished; the PDF files are in %BUILDDIR%/latex. goto end ) if "%1" == "text" ( %SPHINXBUILD% -b text %ALLSPHINXOPTS% %BUILDDIR%/text if errorlevel 1 exit /b 1 echo. echo.Build finished. The text files are in %BUILDDIR%/text. goto end ) if "%1" == "man" ( %SPHINXBUILD% -b man %ALLSPHINXOPTS% %BUILDDIR%/man if errorlevel 1 exit /b 1 echo. echo.Build finished. The manual pages are in %BUILDDIR%/man. goto end ) if "%1" == "texinfo" ( %SPHINXBUILD% -b texinfo %ALLSPHINXOPTS% %BUILDDIR%/texinfo if errorlevel 1 exit /b 1 echo. echo.Build finished. The Texinfo files are in %BUILDDIR%/texinfo. goto end ) if "%1" == "gettext" ( %SPHINXBUILD% -b gettext %I18NSPHINXOPTS% %BUILDDIR%/locale if errorlevel 1 exit /b 1 echo. echo.Build finished. The message catalogs are in %BUILDDIR%/locale. goto end ) if "%1" == "changes" ( %SPHINXBUILD% -b changes %ALLSPHINXOPTS% %BUILDDIR%/changes if errorlevel 1 exit /b 1 echo. echo.The overview file is in %BUILDDIR%/changes. goto end ) if "%1" == "linkcheck" ( %SPHINXBUILD% -b linkcheck %ALLSPHINXOPTS% %BUILDDIR%/linkcheck if errorlevel 1 exit /b 1 echo. echo.Link check complete; look for any errors in the above output ^ or in %BUILDDIR%/linkcheck/output.txt. goto end ) if "%1" == "doctest" ( %SPHINXBUILD% -b doctest %ALLSPHINXOPTS% %BUILDDIR%/doctest if errorlevel 1 exit /b 1 echo. echo.Testing of doctests in the sources finished, look at the ^ results in %BUILDDIR%/doctest/output.txt. goto end ) if "%1" == "xml" ( %SPHINXBUILD% -b xml %ALLSPHINXOPTS% %BUILDDIR%/xml if errorlevel 1 exit /b 1 echo. echo.Build finished. The XML files are in %BUILDDIR%/xml. goto end ) if "%1" == "pseudoxml" ( %SPHINXBUILD% -b pseudoxml %ALLSPHINXOPTS% %BUILDDIR%/pseudoxml if errorlevel 1 exit /b 1 echo. echo.Build finished. The pseudo-XML files are in %BUILDDIR%/pseudoxml. goto end ) :end h2-3.1.1/docs/source/0000775000175000017500000000000013521033126015141 5ustar ubuntuubuntu00000000000000h2-3.1.1/docs/source/_static/0000775000175000017500000000000013521033126016567 5ustar ubuntuubuntu00000000000000h2-3.1.1/docs/source/_static/.keep0000664000175000017500000000000013421652727017517 0ustar ubuntuubuntu00000000000000h2-3.1.1/docs/source/_static/h2.connection.H2ConnectionStateMachine.dot.png0000664000175000017500000256343013421652727027341 0ustar ubuntuubuntu00000000000000PNG  IHDR p1vqsRGB@IDATxT/K]Xz. H `5*ˍ"ի)W{Ć1 cK, " Uz˲~ggٙٝ:;y^ss3;_B            @ Ha"            ፀ            P#ȗF@@@@@@@@@@@ X{@@@@@@@@@@@@F /;7            @            @HwM#    Prs)/OMlvm)޼n]&       (@&_U @@@@F8!-+CRf#RVdmnXm46SSfͤVm6m|s[n$0@@@@@@@U?-gD@@@@%[6mnm,UiSsgԩԵ:v8;       kx     K˗K˖+VH%Hg)+'kW       D X     TѣҢE҂'LCZ 5C@@@@@@@ XS1@@@@W_If7P@ZYgIÆڶ-f6!           @499Ҝ9ҿ%}/HSX͞3^=ɪN J65hחڵ}-[ϗNO'N'SW/K/Oes!      $y-@@@@*Ȑ>@z}}!-N|SRǎUpiԤIE91==#m.mvzڷ/eb!#Rj߾,Gc_@@@@@@@&@/    @ -M*4oTPP>*2g)+Yu=NOs>o6l֭֮֯V-Ԫ% $]}J]q9        @ Iז;C@@@L魷]=aus--T!Ol/-.V.Ş{tuI[x@@@@@@@ $k!   UsWӥҟU+iP{,\C;-'\)͝ /Yi׮c]JNߤq.l       }    @ }Н*]x4joѣV`/|'8vXVۤDС @@@@@@@Hp5 s{     ,Z$=4mZX+UG2D];k`ҷJ~(}xd}4Z3f4a4lX,{2@@@@@@@ $ҫɽ    IϤ^1#Ԫ%tҕWJ:Ŷ?&g/`[̙R~~l;\rJ|;% @@@@@@@95w    A`t7,0 B2nA]T w]*)=5MJd       U$@9-    @ /)-Zt t4v~|[^M6E޽ 6ѫ1@@@@@@kU#   A`b{ٳ;U/;.f[*,Bz9򢻲ϖ{L>Z?<5U_ ^"uI?Jr4yN/       @|ׁ@@@@A|;*؜@E )#-^ VW[n ^@@@@@@@p]    G` kH.ϗT״^i_K?A;((nMzE@@@@@@z5Up    Q ,\(]utdnA#)55vz(o7 9?_я> ^@@@@@@@U贪Ύ    @vIK{{SOIjN/-#ү,gE@@@@@@*T;gE@@@A ;W&R殻I@ կ>rD СE@@@@@@5UY@@@@b8QZ8IO?~TUygݸQE@@@@@@ZNSsV@@@@Jxm??K>oÇO>)eӦMZ`AHѬY3]vjӦMȘX:}]主ԩSG\sM,Go>͘1#h6Dfߊc)SŸg$DC@@@@@@z5Up    z Ч4wԸqxY|_˹{cK/;/ѽ{w1BcǎСCn.qUVp5my¼%%tjF!{GOm)S. zuYC@@@@@@\5@@@@~~~ ]w]m۫W/mݺ5fϞaÆZ+X~ӟ:^>رC6l?hsQ]~3g i*lرc5iҤ ;~UxH鮻g \^6z@@@@@@@*G rNY@@@@^)C[Q@RR[%gԨQzᇵxb 4? //Od6&rOz~z@@@@@@@*O`MYs&@@@@(zJ'РHjѣ;{I5E[^pQ^@@@@@@@*Z5-@@@@z+@Æ v`MD=XSۈ~. 6z@@@@@@@*F`MŸrT@@@@6n ] ???hσcƌѤI-WZwiS:k       /߷4@@@@^ \ o_ז(Wpĉ[iҤI:+#PԱc"BG҃       P^kK    I`ÅBGǃRy;+##@@@@@@@ XS@@@@ J"Tܽ(%^öm4m۶AT@vS^̱c??5p@z|      TWz\7    @b 4lXXw~Kj½Z5w\͜9S3f… ?A-,       5Y`MM~w@@@@  >zJ/0 J {o׭[jnƂ4SNSnݺ'cO@@@@@@@ $Ћɭ    YQЫ?v, X⣏>\vm]pu*W {;@׷~̞=[Y1iٲeCӏ      (55f@@@@HM {C)ɓuaΣGV,T@vӦP+Wif͚#GDޡ-j֬Y1#؄      55N@@@@5…nBGI*vrr RquW_yWYL3驧6{*tnkh       >ZN@@@@ R@aF>t_|_^=c!K;BK6l{=4n 픥;֩29VeȑA}4o\u*_ۧ:' 8嘪YŢ)ST9%       IwI\    @M__4(Ν  'z.]8yԡX ;8Ԋerk)       O @@@@Eˤo w8PڵkYfnx}:tF!T Yĉ[ski3mtkl٢֭[B6njժOip&@@@@@@ V@@@@XV+Z?]yIs@3Fz}Δ7a!-[M唔. @@@@@@(N`Mq:lC@@@p$֭[qFmڴIlel۷n,lӷo_MFRaaaÌ=Zqm{իj*w-gfflܰMd7OOOWݺu#WN<lMqcվlm۶eVi      #@b\9*    PnG J4T _93գGw[nܪNGzWdtы@U L"xc+7 hv f[ xoޡCjzMHCH˗6Mm PUN]ztTt,-]*n+hsg9\>hy=lVX+Ws =z4s5n _-|ӨQAǎ+U ΩpoRܔV)̱q!T vA@@@@@@ &51q1@@@(=8yЌٵk >x(ر[ xΓk׎XaS 8ϩzޓFD.7KޫuJfIN^UySiܸq~Vim67hmlnur,1WBЇ7.mJt67S`_fffL+NRdBVƪyU[j%KC@@@@@@ Q$+}!   @$X~~~Le<[` xs{ؼ%JjP#+%8K\*M`|_&Rɓc+rBNd#GiӦ!*#// zm;娖-[~vF0 0@6 8P}QJJJeF+77 D [%hpjѢ68 6,Sr @@@@@@*U`Mrs2@@@H`uֹl!h*1:=z t]<(%rmykqrkT_H~J5v?裕w=LGDl-|sĉo'99Y={tC6^͚5+qDp)dA7obb)`,TM4Y`      @<Wk@@@@8u6m4SSSC*xgzDL7뿤?1$%IO=%~;To*8a-H*'Hv3X6[*6:ur6VƂ6g}:tPk&o>7cݻw^ 6ٶ'O P:uXƪY]vAs &; @@@@@@  XS@@@=DU3eѶzN2N3Z0B'?^x! "4*L|GNj XuKӷ~WZزeK 4?Y8: 9rE1*yu{M D@@@@@@k²Љ   & 6g֮]+o ͱcb]f}/c={|g^zQ+{ҍ7JYYq@/<-DظQ7N=;N}"bK XՔ-[xֱcǠUIMM-i7WUۿ{M+ 閵7^*x޼QFe=#     T     }|ܹ38j9!8㌠[i/dt֭޽v$.vN ><<4 '~K);;֭S#aKƢEpBw{#G2d=\};Q~D BTFFvp,TeˁYH:emM4 &^m۶Uݺuz*G@@@@@(R    .`nٲ%la @Dׯ>flnhljРAtaT :$R_}s; gݙ^tӭkW_XO@QYUn ^6LzM9,0lcm;VZe> XƦΝ;^ ??߭ncHۖY拵@V˖-ݰmN^'--      k=XC@@@2 :uJׯի*d}999Qyn^z& DOi ӧOO?/2pЙy7Gz66Y7YZK<"2f Xptݺu6Vfҥ%k9B669ݐt$ғO*Ԕ_zE9BVT7|Η-[VlN~6߱'xa~cyn7޲۶m+ Q@@@@@@*@r\7   o84i4;wVZ>F~@ËӼysz뭺뮻ԩSM!V`W <_Ϥs LG5XW7Jddٴ_ n V^Vk޼y;w;(矯C +Vs6zohъ7!VZjrnVJayq     T75z@@@RM`ƾ]yyyAnp JII VʱcRNNI}S:~aT| J+=4kVtf!tÒqHCJ6nYr#^U;IzAjӸqـ'sNnvVűmNYZS'hqn-     J`M @@@ի!oپKXxl@IDATѣG5o<fʊxiiim,p3`'$hTU676yǏ/4mT;v [nݺe:;#     @ XS=^'@@@ C+Vp'/Df\   @ 7[4۶m!ݻ3^x05*BŹ@ff^~e=*sa:B;%Czw|y'NHo%9Ew嗥yxGY2D<7}<^#[V/8p*i FaΓnIz)5lcoj@aaʘWwxԠlFuX2⍰ {}B76*8{쑅J,.xq,Sn@@@@@@֔"@@@Hl{ xk54{S›,DcUi: D*M&MҔ)St{nB5M4 VWM|Sy6͂ ]*Xu~|^ I))e>|\)ifu>[%--DSj4Eo)i~C9neJ#qF͜9 ~-lYÇ! /{w<7Xe {A*6l7Y}4@@@@@(ҹ   @5(tJlu &(%ԩSǭ8g=FC& طKzg݇I݂fƍs+t-pS/;&}I~*mRlu}-7k<5j$5hs 8 rUq x'%'w(aw:~\:|X:t7efJHVǦ?8NyX_|z)ч@ YƭdcUm,da ͂57Z0nG &z-u~ڿSJj;۵km$ @@@@@  B'   @sp_b?Di?f/ Mzz,\CC ,]ԭNo褥.Z^4a|ͲoWI6H_|!As髯$nC]BÆ&Y|uV` X@ ||ZEH0qƕs88唻۹s?hS4xcV-Iڿm:;eݼME=4!     PT@@@0{sS_l?Hc}|sC>}il߿6m 08yN{ ̞=;$)reiĉ5jT6VBX2 |^Ą=VEwoisC%'ECj*ŋ;ռ>w6s fz:袋T;CZ· dʍW|+empڶm+     @" IW{B@@\*d\0U9zhwnߊny/Dӽ{w+Q5QzsϹߢh`[oUǏW.]7@vA#N'NpC8[;gjqTUnHIUqNQ8P4HNţ*΍)`͙3 Xfɒ%MV6]v 7>p?*M`U-U xoyJ@@@@@A`M< \   @D}hJ46_n]ć/ԨQ#_*z&py൳@U CΓ&Mw]Yg &覛n}9 T֮wzj7wK=v3l3rUT5e_L/=<9FA\h Pc>/ |ZfMDnݺl\ @ :^oݺտnVdUp} qp @@@@@x X ׄ  @UYnػwoT׀jݹUo4 54N //OJ-))IW\q&N /0p˕,`_4ca< G=r>3%'LyN u)#{*uky]jLjZjyvrM;Jy9$U駟*Xp2d?hc˵Iꅣ222A-oqRGXoۻtعsɂ73MC@@@@@*T:D@@j@vvVXo֝2ʕ+e%zΓٽ{ XiӦ%v ~zk׮Q͜ĭުǻ?md%rrN*wGzեηK'Nȝ<)-yWAƛ[ aC9Չ|-[᯴4_54@ &[B6Sž.`J6G%\ U5[to`|/LmJEN     Q!   t&,]k:s;OpZh@Uիd\V`ѢEnuS*'''h}j„ я~*D Xxvo_jw\0 PT5k͚5kq׭jݐmP~X):(_Ǐn,xMV4ͪttJuv*Xꍷ)GȲ     }   Pn;v CM%$ACط@|rssoyܾ+ĉ5bĈmT? r-}Wn+FJعs[;?tP=UKݩm۶aщ+`8͖-[/xsR]@JJ:uЍUU!     I`M$@@@" h*46ԭ[W}qC4-6_50G طo^x=ڳgOAnMǏw wO CvUΣ"bToo|R]X&Mn7٩CR     0kF@@@׬Yŋkɒ%d)O%5{xZ46ݻԩSҮlGr'|RSNթSگ_?: 7ܠmc 9R3fpodjٲe)ABVƦO?TaNMME]l.2n:8:@9 9~x.~6^mС* @@@@@ q$k˝!  1 jʕ=|reggx6mڸ4ݺu}#8 *W //Oz)͙3'k֘1c@ͰaÂX9pڶmݻw'q7 @_`uW/w,x*#@ >^uo޼ٿ}y4j_ ѩS'7dm͛6ma     k@@@8yVXT֋Vw  hkh P K/g}V;w ͛o]wݥ38#h+'k..RAĻK(@FF[O>qH{ {vڹ®*MzŽSZfӦMnЦ4n^eN:ɪ@@@@@G`M8r@@@AիWh/_.PS\B4sl M~RnlC8Xf&M^{M'N:65a;V 6 J gǏ~@&PXXŋ>C-Y$5jѣGk̘1n&5558:@X/lcneڵK1aԮ][;vTJ7s 1q2@@@@   @ C{֭… Ӳe˔]5yU~bc#ħ}|zꩧ駟]dZt饗{_,[!`'O=ԝV$i /{n|/"VQbĈ/fcmh @}YƖ-[a7L#Xl.h۶?pcI&Ewa@@@@kj[@@۷4Yh=Z%%%GA!PX56"P=;/n{.5nحL3qDy晁XF!vW_E@,knE3l!fcx PwX&p:|pqֲeˠ[4k,>t"    .@&_a@@N Dc/:!<{ūD3h =`OCͤIPk[ntwkܸq[eX.*+nsx Q1#TU 3gU!!CP}.} P@ff^}7ƴ47o6sFC@@@@U`M  ą}s%Kػ 8kfRB .EExTP@TAkfe9g{3^n֭[e۶mfj`]gϞf3Z5)S  Dk֬qɊ+Dg_x 4uTEAyZZjժf ď={A66"K,ҰaChSZ58v"/*dXo?^p!t7.|_<=@@@@@;D@@@aM&FgΘ1cϡ_ 88XfϞ-ǏCtKڶmkj *dSכnܸ!.<1@8}5nl5f͚I5$A6 J: ɓ'n;foLI>}`|}I&}Sq,     / ;E@@gxlٲŚfǎ3FWt@Iҥ4D;wB88qL>]n߾mӻ9sJ޽K.:uj:6xQѿ-~v}!ıeٲe&F@gk& y7%a„6 >f poΝ;A7K3XmQ^bq2@@@@xk^E"   ;w K0(xxxH…Egʗ/ou[S@o7n,]4a_~f,=>sʕ˜^zfvLs!Ďf # O2ԯ__7o.5k֔ĉNc8+ @HHt7..\OF̈sN,` @@@@@ %XN  +At%F+aaav*G 4+=ϙ3@`ؖ-[Jx6ul o4A ?C/x @< UVMݻw#$yɦN:$IǰKfS=jx՗j~Vʓ'ϟ,t&M:#    /"@`͋(q   8Tۺul޼h ͭ[d+[TPhF3F*@u._,'O^D5kVٳt]ҥK:(4N4棏>2ߎr@ 5k֘L6ܾ};…4nݺ&歷"?;@ ܹch7%ګ,6} FT@@@@@( @@pFFsaDc 9xZ*U*iҤ;RzuA@QsӧMЍhЍ/ }= Gz[g.-Z0lJ.l5 C h6K%FnΝ;'O>}i6cKXlٲ98@@@@GǹW@@Р dƍk.yQ.:hbŤRJfƹrx*@t֪UOV^m3 ]֭kjjԨ)؏@ L2Eza3aݻw_ دNDb d|ryA͛ؼ;RP@E@'EЌ6d>F=;aBt}N,Y7>>>CQ@@@@@1qF@@p ` cǎEԩS-4ʕIF*@tf7nɓKǎ_~(ķL44cÆ w> nl4X8444BtRVZI֭ x؁N*(={V43X~^V$ & V EKv]ϗ/LC    Xc7f!  jyfǎ&hfׯG&f` *p98qL:Unݺes:ooo۷tIRHaS)+ׯ7MпTRgs6  .9sȺuɓ'6-l|UVmJӦME) + ؄_4^;T A6p;,//~@@@@ck!  ݻggtF} ٺuDɓ(Q")Sk%mڴQO ol"~~~fiXX)t~(؛xMe@( ϟhq @@@@ E8@@7ׯ_o yvz'`EZi4&K,a55xܸqf賳(Qd,5 &6pbbZ`2dsYfIvb@BCCdYt(dyNl7o.)Sg@ j 9whME?h͛|Ϧ7G    /&@`͋9q  g рW;v5QDRL3J]k %b bY@_V^-cǎ5m)נAPk#%СCр-v풒%K:Ti, ܹsG,X`3`SĉK&McǎRzuX@׳gZmo5!:&,Xp5k֨~@@@@\Zt@@xݻW֭[gDu֭(4iRX*UHEk( @\     85p  (Sٳg gI. l4/^\_<xu9vX7oڜP_( 45F GAt3hڴ,XѻD@P@{-[L~GǏB[h!dSR%:6@b^@1bt~ 8KL3fDIM3iMv$sK8f޽{Bʖ- @%Jnä;/A    v*@`  @L }ZMV LQ4C &Fm,-;*1#   ą5q5@@͛4۷oǏGz$Ikfh0M2e3cىؓ@XX̟?_ƌ#;vim(P \EѣG4iRWJ*%;wtO@':9ĴiL:H׮]Mփu#ؗNc ѠݻwˁD|^ItLcYt|    1%@`MLIr@@@`zjYf_^߿Uue˚Y~uJ*ID"= = ܺuKN*&L41K,ҧO޽IƦ \M`߾}RX16mٳ]"8kL 9vM4Aj?b0aBz6@S@'8tn68qbYhE߀Q    Wl< @@|]KpB704UV)RDy, qƙA6A4-ZH l@UΝ+-[4/eذaJA@D@ج[NL"/gؤOޚ&o޼Nk3gLFjcYT#2.H"Rti 0PdZC@@@xk^Fc@@e■YitJ֬Y7ߴfɜ9sT{;v,_\t0K L@M*U,yD/G_|a.]*@~5ѣGmYltR bؤImt@O@3iͮ]ɓ'm#W`2eʈe6L@@@@ &*#  GUV_^B3@@@@( @@fYz ˗/GzĉK*U4 8v", cƌ?fP4nX $+Vt.vE`޽RxqsmO?/ ķŋeʔ)2mڴ'O.۷7A6 r}@8s پ}X2oRܹMTPAJ,)%     N(@`T  ?&fŊy(@KV I$I4"(#;w ٳg͕tpcΝ+W.:6@̙#Z2Oꫯ{'s$ N(*-2Yl6lիW޽{KÆ E) %pkͶm7EH0hx{{G*@@@@Oǻg@@N߿/k׮54 Å "mYҤIE[RNə3gDZp7o/&L0[Ot")RpU`2rHӆe˖Iz=\@{طo %88ئiٲe=zH׮]%C 6ul 'Dl,ˮ]$$$$ZC袁6e˖    8   pH|r G  \$J(Z%@8zɬYDuРAҴiSf:(иqcYd9ɓ'%wܯxF ܹsGfΜ)&M}gu6`)VX*@\T@ݻWl"[n5˱cӧQhŋ J*.d荒 @@@@.B@@Eɓ'GT^iiӒ$I"ժUu뚀FNpB 2;vy ?D4j ļ@|DxyyyIPPE8# N"U5ĉ{ǏL38|T6@u `͛76oߎ%s&^]J,) $9T"   ğ5gϕ@@T@3-^Z.]j\z5Җf˖ WԨQC4:o<=z޽ۦɓ'Ν;K~Ȟa#1+"ɒ%\tiٱcG^! gϞ56ӦM,͛W/:tIb@#6A6hj"-[V^uhLQ@@@@; Nn@@_K.k5Fgwww)_5x6 :ԩSerȑt҅!62l ;{%JkNf͚; 8@pp7tܸqrQJJv*}}KA@ :ĒfӦM&ͽ{|~\hQ\ ,YDy<    +@`Mrv@@;Y/^,K,۷G:N[V-iР I.!#pI?\\r2h iڴxzzԱ'0w\iٲ_~)Æ qf@\@3XBda0@*Vu@퓍7Z͘]*UXoo@@@@ ALN  `:PFh,4XYɚ5ԯ_T^]%JaC^@gX3fy|䉵:<̪j`L`ĈgipÆ \@gAT/DfYl5Yf;}CbI&fÆ ?߷<{YZm|}}jժ?ga@@@@ !HN  `aaan:3( .Dŋ:PTRqD]@gTѣG˖-[lY:t E'oM=*y捿pe@PڵkˤI6=̞=yOܵkWI,M ;wD'5 כI>|3edl4ЦZjR@(@@@@y9/F@pGɚ5kd…47oތjͶit@IDATKFqƒ+Wǰp%{ɏ?(~~~rigɒE#=zԩSԱ#PhQٿ$LP߿/ w sΕcJ``Moq^o߾1cF:6@xYٶm Ѭ6ti4Fl,K}ǰp5eԩ3/kРAҲeKI A*@ 4fҙ)"pi@\G1cƈ~Sk"gUa@U4Ν;EE3D:QFf^D)@@@@ Ŝ8 @@tv?Cϟ/+VL<ԭ[W6m*kזdɒE8 + ޽[F-@ Kqss3:(PcP@;&3 k޼̛7I@pbCɷ~+?hFK츚wߕrYv @$ }N@@Y4F3GU (`y7jժ2eʨe?    ָ  c @|HiRN-חf͚I͚5%QDIZĒΪrJ3Pa/:v6mL bL`ҥҰaCӪ?X>S;k!A@5.^(~~~2eʔ|}}M[o@ ,m;dA6TPA<==#;}    K X㒷N# %C7@ҠH>`4իW D8 ٳe̘1k/٫W/dȐ!| `_ 6̴nΜ9;iKi !p]eܸq6K"EL{weXGi͢yfdʶm$444ˤHBU&j2wDZ@@@pk\NO@@t=_%KDU.]:iҤhBt&Xu ?ׯɓe„ rUZeҾ}{l5p:ȬYLxxZ  Y9|MOgnCvMl@@ 6tuڵkr(/'O]ԩSGVʿUQJQ   *@`Y 8ӧO͌zL3ovA3*ҲeKiܸ$KAzF3@QƎ+Niיv*)Sc[`ڵbȐ!78vh= .&pq/w##ݺuCJ֬YYA@ >9"+V?dH,TPdoذ˗/>5@@@@ &F9   @T/ӧOΝ;;E &pY~Z0aBر 6Lre  %f$˖-36Td`6:iVٲe-؇   إ5vy[h  'N3gʬYܹs:#m۶55NA^2f%,:HVZffիGj@+&L0ذa': + \tI[2ed$շu@; `gO>۷eҥgϞH[={v`ӤI#؉   ؋5r'h  :seƌ=-iҤ1Y4bŊV @@@hrJ 3YjJ " \f͚f˫WJ靼t@~;޽{iwwwywdĈXUXA3gnKXXXeȐA4F3 A6؁   v @` 8Md2o\4 = WY`,_\;gNoK˖-|V   ĩ5q@@A֭iӦɢEÇ6J*LӔ-[֦ @.^(ƍ)Sȝ;wl!CHӦMEg Jɒ% 1cbs@\D 88dol2hFN:ɇ~(ٲes  ;fK.wFfckݺY    @l Xœ@p[n̙3erر=\tU5k&I$P@4׷~+31bY_x4j@p1 x~gϞ{I \L"87hFPnhvzIǎN:dra@@@bZ|  hfN4;wfP^t L M= Q <~X,X |MW}SW2fIAhݺy G@n޼iǏo3ҤIO>2tPI6+w@q̟?_fϞ-6mrʦ}uI    X<@psΙ4ӦM+|I:tAz! _: s4J>}\rs΢( @tK]vYzuf_ -p55jNGXJMp͠AaA@!?nl~'y4jժfƍ!(D@@@1qD+@@Xذa즋/ͦ-[dPxw$I$XGx+W3t6E ͚53ױD%d$O# k hvÇm>,YdYk[@رc|fK{߿mV'NlS    5P 8ӧO~ UM͚5 Ա h h`M2eJ`E1?K,XG^Z@ O@@عs 6L֮]kիeg@GЉf͚%&MG4;}ҧOݻM֦ @@@@ 2k"Sa  $/R͛'?]5j$:yJYAx1ٳMƈ#G<)[l2p@ڵ$Oܦ @ 1cƘkjժS<@pA5k/hD+#G|: #eժU6ڼK.2tP(    @TD%~@@6o,?#Rǎ̀o!MGG@gœw}|u  *pUd„ Xoʕ˲G@@@@@@pOe˖-6ɑ# ѹsgI$M ػw|72w\g!M41ʔ)c# +?65=bŊɞ={b:@\KfQFݻwx#GvkUa@ݻgO3F\bB {GNLFA@@@o@p`UV'|!`{I֭Eg` @@@2 \ _4Hcǎ2x`_: k'OsMʂ bZ@\Oƍ_ĉ%44 PT)сȾ}  <06}_dɒɐ!C76#   1|>N  k֬+Jڵmjtshyi߾=A5qp/8'Okhٲez6A5ҥ#Fٳg`3jAرcf˗Ϻ   iӦ5k ZOk.Zyq~V@p4,gРAr)%uԦ AAAf2={lyu"   @ XC@ m۶I5f͚j.\(Es !!!2eɟ?4o\vaL0AΜ9c~d  G^2o޼uV@@K,YdI/^, 2oݺe  &6 y%qĦ .\vIʕeϞ=-ڋ   1 @`M r @@ sy?X+YAVܹsf@شi$((7|ZogO:uꈿi•+W$C  .$,Foffo~.AW@U@j#.j&k 2c@@@W罷 @X@gB :pA0XJ֬Y?N:e7 / ~3kΜ9-[4oԔ,YҲG@n|||ɓ"E sݴ  ?^>%}:9@AO@R@'70a2 8dI(SN!   /@#0{l3P… ֖NZ}3cZ$IYAxM+l*V@@@@ܝ;@p\۷K}b с ǏСC͠J!-GN@,Y"+V___?A5iӦ5Gr/\ ^^@3hP| x  諓,\YJ5r_~q*@^ Gj*SI.@^4RcY@W&MO>Ns%iӦT\Y @=LbŊSݻwO6mjW|s|@@@?k"@pͦ0uT3>>yH"`2-0+1Mxea{-:uÇ[Yxq3kcǤo߾ecw'NXc]g@oĉˈ#LMF̬}[nY (P@n*:t0Mu4cǎhݡ    5P ĖRTkHBƎ+wU}@ zW%G2dp rJ VZ@QX(wv" t/Ib?~,'N4ӧOLA@4T3d̜9d@@@pk> @pPϥDwZJ6mȑ#2`~[PxD8yKr)#G۷oƍ˖-[dݺuRvhB `d{D @@jՒ}W_}%ɒ%3;_.]v˶m۠B@a/-$I>,]T5kF4@@@[!)lMB@bE`ҩS'ٿyiӦfU <_@z5Jϟ/:$LP4Hwߕ[v8@LvҤI%((C@@54СCeΜ9IΝ믿4iX # d>Փ`vɬY @@@" cM$(B@bRѣGJŊA52l0ٻw/A51͹@iDg?.U̝;TD@@@gX   @LhÇK A5 &/Bl"Ą2@g 3fHBI&6A5>>>2yd9}|8B#p Q@@G0#:t @a…&_e# #ШQ#k M6Q@@@@1qF@@v%eʔ1?*UJ4{͇~(vzğ@pptI>lmL%dܹrѣ$NZ  8띥_ @̙e5ҥ3.]5kѣ]^#8aäUVAAAҼysC#   ָꝧ  a?˾}5K.[n"E59! 7nܐO>Dr![++WݻwK-Dg: "@`i k hfRvڦ?!C Fvz8ӥXb+޽{;C   .'@`r: !w^)[ d)Yl߾]N@ ΝHΜ9O?7o>IÆ eͲn:`+0@^RgɓǺ   2e+VIj39sHJ̙3=ڏ BI$KdLgΜ) U@@@C @@^@g̀G$H|- 2f}lժRP!n@@@e8 -K۶m޽{ٲekJ@4@TԒ*U*MM    cXV"  >|Xڷo/۶mXbO?IŭXA^~嗢%]vKB)R0L5[ͱcpA@V@g̥G5}̐!YF6  "?in5̿elډ   j7  o>>n:=z$Ny:KO@)$O<ҡC9|L%KyɡC̏dҰD)~(kd@P Ydb 5rnN3P@poV2edd?ٴ@@@ ƥo?G@ oRhQڳgOٳgT\ٺ@Un߾-#G9sJ~ٳV v͛f 5/Q  :DlZ9" 40Bp*TROZYA@@@`TZ v p-iժ;b 3k֬j*4i$MZI@{=ɑ# >\]f&חM6^jՊFre@qG@@ FtPfɜ99ƍSN1rnN @l hBUf.s =ztl_#   +=   ^Hk4FjRNm  gΜoF~=<@3K>}vb I&̝;W̙CPM .(p!СɓG&Nh I8 _ǛG@cy׬A5^^^Gzj~p9כ ^eʔ ZjҦMkfVL F"~n-A'8uꔵ7dR ..0f)QQ8qE> #O^}]԰0#6"   jָ  `8xTPA>syٯ:eϞ=DZ+LZu5zhр HL:@ &f=9 8@Dd޼y,53f KA@4wƌM3ϟo{i   &@`q &رctҲk.# A/y'O$nݺi&keʔ)rI&Mjc@ vWΊ /ۍ?ڑݻ˝;w۬  `^^^֬5]g}fͤM   5.}< 'pYQb .,[n?P<<<\# ̙3`ҢE ٳgբH"/ѣG[n3S@Fq*  ;vZjƟ?|= $гgOɔ)f9|+u"   `-  Sf͒EJ@@9 ٹs,Y2.y@I&I~} ٷ"S"d ].YK*i,eO==IBv!mfw}߹猙1g39s^|{&s^}l߾]7nL 9bVX1L@@ӦMYO>D=@,)S&ٳ۷%""ݥo   @~;F̀@@ ]v2|kTVFthƎ+Nr3<#g}e;+ (Yh֚\r[@@N}!W^fG*Ud  `W+WHѢEŋ&C_@v~!   Td `@>+WJ \j7on21T|#F X.\ C *ݻKP/,֭UVT7F[ _eD[]: 6ڵ/_~3gڬt@WlٲI7nĉ]` @@@L5iFO  M} ѯ_?/O<2m4y׽4u#8}7NL":c 7xXc3@l pq)\Iڵe6]@@)\4СC%O<<=BHR5I@HP@?l۶wU3D@4nz)1116@@@@ 8Bg  R[o%FP^=:uΝF$իW˰adŊ.*PSyɜ9>V@K@3.ڵK2e$׮][@@ N8!J[fj&s4 4 pW ܹsq?Kw=@@@@;d+" bccM'| ɖ-L>]͛GPܩV`ٲeSOI]j+&'OCI ID Gk-@ :^t=q`:DS&MX=o2@@@k|oN  B,5֭jxe̙RdIk@ 4%KLM6 {O6m*ӧw  DEEIh&@H@5$cƌ_)@@@@ ֤ @@:a駟Çs)͓?\f&[dڴiRti?SOɲed/[) k2:@@ݭ>cL@ dΜYy-pcv"A@@@ ( @}h  A}|۶mR^==EqL2EJ*%m۶CYG>G~gy@C95q% xG@.W|͚5&wZV@R/PV-+WZe     ;tk@@,X mڴ .dү_?2  ׯ_Sѣĉ.CY}Olg@ 4ܱX;  2Ν;Kv'Nӧ"GIddj @hѢ3ѮKeժUҭ[7*@@@@G!wQ[4 $(p5ڵL6_xq5kEBTի'3gθW_5*W/X!@IDAT@(S۷Og..] NF xH@?s`e'<<\4;=ݫK.2aNh@Рp){ӧOp.),!   2x*@@ [nFɞ={6lh:ȑF7hs۷o+Ne YdeTr: 111A]U&sΕ˗/ˮ]B =@@@@x*@@}M7~xӧܼyT5kV8q4o 9>eƍ[  rY)  :k'@@2vX3d{A-V*UxfԂ `[_~E|djժ&FOI"   PTC-  @Μ9#jՒnݺYA5<$#@f.]CJM#&,,L4ibf3gTc Gw@8hw)b^ @@J(a>Q=zT{GX q,6lp   > G4 XteK":SuA# .ȠAXb滮5͚5?CfΜ)<"ZرcVd((  رUǤI2@$[Yնlb@@@B @ytyiӡ eԨQ>}$=@Ќ47j4Sf%]tҢE ٻw̘1A7L9f2g  M^x|ʕf oG D SLRT)sNtT9    BkRi  |}\S؏7z+O~E@ܹs{Ç˗M4@M6o>/62]@Ǐ[,TU  :͘ݡCɓ'[e  Iεkv}A@@@   _-\z#cƌ2zhرc@w4&""Bh 2H˖-MMѢE@pGĉ @@R/мysuV~dϞ={cǎ_|ڨ@:'&ŋu%JPh@@@ &h/=G@Zj"##ʕ+'s̑|Fٳge̘12i$+HP.[}J…>  `skl~ @9Yf2e3YӥK.ѣGeȐ!ApOVZ )^հ@@@|'껦h @E`֭#մjJ6nHPMЀ>}YGih@f:p !&.6C@l LhyA  X|HHԄ $...h@^Xb9b)    X}cZ@@ 4CϞ=ƍfٳg>L6lT W@jFmfz53J6mL Z)  G`M>=Q/u  Wlٲ /ȲedSxիg2ڮct@EO?ŋlKJ"E*X(    W*/# <QQQҲeKAW\Y)Y `W3gΘO>N}Հmۚ5/@nݺ%Ν35}-= [[n&F{9f[/^\j֬ioHz ?rmyL@@@/&h@]_~J*YA5!!!ҽ{wg|KJ(!VPtb;~xEg֌Sۦ{@@;\rk" \rYg]x*S@@@@ X}cZ@@ `dRZ59v=#?1};v/c5ڵkfP5_kF]ĉV ((   za;rHL@Ȑ!ɠtRZw@@@*kr3X@<'j XSqe۶mRV-5DM Ο?/}ŋ˨Q 52e]ʡCS @$N@@M4B :;ٽ{G2@R#.&&&5p.   )@`` "˖-+ʕ+ GXX <ج36wU **J}P3^zt9C͸q{ @ Xa! -4#k۷?e? @p hv5@@@57E@V֭[ҧOy饗̙3f:UdРA?-qX… &f1bDGGцKN&C 5|04@'OzHEA@@v$o޼9s޽{#    __! 8||\rր:ȁd„ R@(# s2@@ 2gle39 G>sdZϒ% zD@@@kZ3R@R,0|Tlذԑ!C7n|'Oˉ 7.]$65|\|4}]ٿL4I4  vp!W>  @0tQg:o<ٸqc0 1"X@'5=̝;{J@@@<k2"@<&p }Q]O~Wڵڡ"@qذa&fȐ!- ywL@ɓpžh:@ӧM]ӧ^+! I h&Ac4C@^< x[ܹsV|>`QP@@@@'|  8p@4h ƍ˧~*ٲeQ@Zի&ѣVw-ZH~hѢv  MX?~u  -жm[?~۷OV^- ,7x#u7SZ5)X/r;g%J0hTJ8os%/Ž;dΝ駟&s={{=u )b)    1-  wϗVZ˗M3e$'N4n0tV2e9r={gtYf2`R 6#Ɔ.! @@ g믿nƩYk֬)Yf q{sp4u7k׮klڴ)z'eʔ1ه^}$Stb)ǢV a"##է,*T(Er^W o멻oUX@@@@wk@@7nܐ;Jx@6l@P/C wՄ dɒҳgOe䰰0Pg/ {",bbb+I@@_ԩ#j2믿D:;9ɜ9 {YJ9sF֬Y#T^]6nxS[z@Pܼy >\?n944T6l( J @  PV((  >4i+WN4;f] i'83aSb\F1Οd̘QoŊE'N޽[tǒ7o^)Rhsɉ'$66ֱ|_z} 6L=j <$$Dի'v  5t+ @%>0q5XYfYrCʸtG#]\KF/t{ =zH>}4FwfϞ-F .}вeKٲedȐ:>B6z衄KѶm۶4mTN8|wݟQQQk.S#<"و@@@|'껦h @&:u$73 j4>$nW |Cdd<Ҷm[:u֭[eܹ߭@ &.'A@?޽@knVq߾W=[xիۣS@@@  &.6CE@YOȤIxӦMZ( Йa5`\rfX]xeͲh"P *@`^9 &qg̘!y1C64Kځw;/ȑC&OR_|E?+xY'&R?~w-6ݽ}+7^w&o4S;    Vz X`yx/)S&d̙5kV[N @p ,YD*U$ 6={X5jԐ?V%@56(t @Vp2o@@&O,}Ħ)@|%[6m*ϟ7MꃺK۶m}A#GdС2c T)bm7o.gC@ nܸ!:3.եg  gTRch_%}`k#^jiJ4[?9<*SLU)måDV+׮]Kdo6WX1yQ2duʒ%Ku˻?ݻKBL@.?{=7NѢE ɑٽC&SkH@@@SC{C:@H3gΘJVZS-G6  7dԨQ2qDr%z5K,u# 7΁5dFG@@  ( ˗/iӦ Ξ=+UC? ;vҾ}{y%,,,;/kvwqyTbj6stSsZgU\9k0Pܹ}Ir"##=UԪU|. 5GkӦMgho|2Tc_k;OOj;rk_}hٳٸ~faA@@@ &=@@ k׮ ʉ'L]ҥ#FHϞ=S]7 r|2ftuJ֬YK.9A~ @5  Jv$GÆ &cbbd޼yK_yy C=޲eKMX?YZ409MJ$$$$CS-~~FVF˓-Z$?ǚ,>~ިlƍ'֭rXҰ`{]iy[櫯2M|J3jʱ    ֤y@R+![] ,(~<䓩@ ,||ㄌ3ZS޼y N8aPD@L {&ˀNn4uTɓ'(y~8^._,E1hVdKSC!(Q"YL+Vp97tYw6QObS; 6x*U[nҥKEh.{^W7o׶Ys}gthoc9(իWO?Tʔ)cm   i/@`M_z @4#De=I%/_>k@2c V?yZJ~'ٸq]l1 .XU$70qBJ/_.X4i"aaaU)måDV{LX<_,Խ{u= 5k پ}}П:uH6m}.buu(on@@@@ kP@ 0m4ܹqɓGfΜ)/G@ ń_6o2W^yE.*Tp  $-@`M>E@U C Zgyĉpc&G /^ׯ˩Sd׮]:ڗ㟟>̥?o˺s3g2e8NUٹn(OU~x}&3fzcK֭[^Kc%v7Q{ss;ߝv=6̤43/zjPkfz0@@@R"@`MJ8@4v횴o^kUܹshѢ6  ֭['^ڥjժɇ~(O  |rΝ9@@ lٲť p>eY5f5}wV9~A|__Ԏ?~}~6m ٽ{wC*W iڴH޾ڛ{jǟF@@@@ ItD@H\bN˖-|ҠAwX@ A̙3%..:L2HzyU   XKhhdϞݭs9@@; 8 uK,jfcǎYWXpEy7֞&MHÆ >O8ן'O)RH.ʕ+O>w;syG۶mc78_k;G]\7    XW~#[gϞ2ak˗狾΂xZٳ&'|"7o޴hӼys S@@ 8krIj(9@@F'OSNY=z衇ZIbAqf͚5&Éf}w,%J)S8V6<.5(HNuiӦhN4{~^f    5{9 @ 8qBׯ/5f͚쮳 1cƘ/Gv,_g|C& @W@g%W\;A@@dϞ=wtyƍ.3&Ϻ;/. tZ˗O4p&`Gv+|:t:O  y5Pc˖-yAҥK :(BTRwܹs]w֬YB we&525> ǟuEν70E@@@dX $A@?riӬ>qDɗ-|J3uT6l9sp,Yk׮һw﻾`D@ m2N@@̙3K.w… E/S^]t3Ȝ9sD^Z]'zː!Cdw?`ܹ_,u֕ s폭Vb4o{d   I X@@DDWbccMŊ3y@ eٳgγzO {o 06@\@Ę~̙3C@@pW K'xVXQ~mܹ%Xm۶~>SO՝б-o޼;=Į{k?y.MBDz @@@5ԥn@)/յhe5ksΝZ8 ?(l߾:8$$dTRv   = .Xʕ*S@@@_RR,Y^tI8pvJ?+ϗ/AחҥKq|RRoz D>e 暦彮B黳pB'N^v)#    WҴ @"wu޽{2x` M,6# lذA#Wv9QF!=vV@@xח@@/#^vV@@7ƙV@@@@@@@M xA &&Fu&oTSR%ٴiA5^JQԩSҾ}{)WKPMҥ 1#F\ :       d #^ɓҠAYvxeʔ))S&k@ %W\ѣGرcիV AIV$]: `(  F֤<"       O7⁰ 7֬Ycj4.2~xi׮7n[ng}&C3gX#Ξ=Kw.3gS@@tՁ9sZe         [k|Mk A,0n8ݻErA@ߗ?Ӫ.C Ҿ}{߿s=v   `˗/[@X@@@@@@@HkƝV@H ::ZZj%sεF]F ={6/["@ %K֯_o" 6ÇKɒ%@@^W\:-[6L@@@@@@@|+h @سgTR 5ҥK ["QRvmy]jydΜ9xT@57F@@@@@@@R"@ƚq ?lR/ȑC"##W_M)pi2dL6Mbbbʗ//#GZjY(  ._lu0{V       Vz @J~KVPA.\(Jrl; lk׮ɘ1cdԨQmWpa:tJ2J  ~ ׮f˖zL@@@@@@@Lk2*@48曲b M6SJLm@W_}% 'NX˷}nݺR  8g!ƿE@@@@@@,kz2@4زeԭ[W>lz>}z;vt1 {E ˗/={ʎ;!KNڵk' yZ)  82քK o@@@@@@@ &@.$@H[HMG^7o}ڌ+s&q5NSʠAܹsV Ço-ĺ[0@WZ#͒%U  ;/@vy   #@`;Z t&L0Y&bbbK(aMTX1,0'|r޽8?\˔)Kz-D'G# Hd X@@ ,[L@@@@@wΚ@HҶm[9s5kٳ%w6  @|={"꣏>… [)  @p XםQ#      S{^z G:u֭[^{2l0 Q@.^(C I&#˕?U:N@X @H@?<=lB%JC7#   $!@`M8B>~Iׯ/Ν3ϖ-|WRn` ,X6m 0ݡ')RDF)5JV= #p k3f@@S ҪUVZdْ#Gk@!p!ѣ,ZȱIBBBqGI…@@΁5w  d[lz+Fp@.LlѦ;vdd]7oQ@@@S;M؂ D'Nuʆ QW.6  \zUF!Ayr2~xy $*2$@@ h]&w2P@ sСweRbVq $[lΝ;ڵk ݺuK֬Y@@8dr8@j3`Fi"pgcI-V*U$uHPҥL0! <   $@`M ]MƂ pW[nI׮]eʔ)ֱ>̝;Wcm?^'ӦMϱ+2n8 %  M8z2X@@D~?C/YfB IժUOp:Iӧ>h<|\vΙ3,X0f]9rĔ .,ٳg۶mUn,P-Zԧϝ;'ׯ{ʅ 8>yꩧ$SLV_ ߴic5RlYsƍ%&&& {LRs֩lذ!~ W\Yo$꽓ؤ{!<<\J*`Qe2s}{GНѴiFFa F@4pD;Bo_:   l,+):K,oL /^4k4?4c0%JH7 eq9~̘1|ɉ̕+iɓ_;v0_- &HF93囻ufhk :Ii5ںuiڵI6pdcGѣG& N82Ĥ\O)]U;v̬k3gl  |i׮fn˗/KӦMeɒ%Їzf͛MsJڵ]`O\//    5q ЧN:ec{Zb2W}ҷo_~aOJ*0! i&@ƚ4a@@/ &|j*ɛ7KKԡYG4%E,ݛ$k֛-[JbIYfϞmz (pA/RRUoʕVP͔)SLh֟o&f#GJf\%aÆ;vi`ɣ>jkfGf\Kgfqd݉իo#Gf̝_~&F8/Om:o2eO];* P   ~(} _~ɞ=|p :O>iFEE }7nHPM @;8֐W>  FҥKȮ2~;jn| Pz)" fIY[{953iN_ RӾ}V (AjժfH4NСCN^y]Ed?I6N@@@@x@#_ȳ>+gΜ1 ժU; R+^@gիhV_[o%{eRg&dA@Ze0kj>  @jtRdIG'å{>c03f=zzwYpƳ}vS<6WԺukɗ/hѢd!O>4m Y#'~nj2UTIf**TMohÚ}^z&M0A^~e0yARjF5jPB*؇   ,|q ҵkW)7o4C5F?,gAY˖-+4&& )SFVZ%fa  `w~  4ˋcYdڵܹsCkN:E}pʕ?Zez(SL湐mĈosK/`*%/5?QZmf4Po̙&NmڴI,X`23.]ҥKŋw^gy&@_~E*V(~XBӢ?-ZFg#   5{i x.\_|QƏo N?,ׇ#r岶Q@8~ԭ[W!cu6>}z)_GR;wnڵK׊fXA +V0Y3tsΝ%Kȳ>+zL6ͭ% G ,J5K4^zI,YL˗'5ʗ/˲?|̜9e`#JxŋeFs΢١E]׳f8a kذdpc:d^}u4[f9s|W:   1" Etn"Dޡ_~UnAS"'+'^z%y7EOiыR{1ѻ(  @$X {6" +7ҋfYeBC4P?77=뮻N6miOzm\嗲f^O%Ѕ  2$z fk׊nOi /ƍZoh>hgފsY%[˪q۶mQ,G}؟ߟioeqqN@) 8s/ނ8`[ʕ+WL5|h@5ٳf=d78   Dkt-@ Ξ=kNڬ;8lR-[FPM\ڏ@z2\Oiu"B ='&SVA@ &2  @hfjh6fiӦÇK.]׃ݒKǎMZ.)R<Ʃ7Zr=zdQ)[  v[">}f6Zx9ٹ}h-b-̣jժd#4.3y%QȪԙiȹ5_ 8ֹkƶm۬Ao2mi-}L8<4}    @X;"#?T׫WNǮ 4H>cɒ%K"@d?, 4dVƌW^uIڵj@@RX@/䲊u#kg@@IJ*;DhL27n Y+zQf߼ysce85] 4KF֭ME/'PP!sS67m(G-,z|̞=֠_UoLh`@ *X<# D@6m9F4PX1rʕD/|܉'dfѢEJPрJ46*yg%..hpbC.#Ϣ .lWpA{9\޹åJ2\pA#%JH̚X@@@"OgZ3fL5Vju=Qb i޼y!@B}hڴ9nM0gΜ2~xot Wb   Azd=@@]L2&BA,dG&O,VVZ\O ++Wάj@ږM x ?Z+ٷo>, zv"tqž={|\@@@@ VBe(O@d (m۶gϚ4+Ś5kRJɪ@ r@g4K톷hBl">9!n`@Pgk"t'l@@[;B7x1SsP|M=#jJr_`2W%V9ܖ -SNfmm޽ ڗxgyIz/Y)Sr4F|y 0,X@ H h)- ҦM+F2jP1dрSN9g1   Q..G@X?4'֮]kZ?h>>Mi $=IaycǎV\%A@G5/h   @p4`7yٲe]v 2e &|ǽ{&y-=O'իwaeZx̙Yj&N(e˖uq h۶SNSO=%Ǐ;7o^7n4mԞ  EA@@@@@@@ &2 u0ϯY-..N "}􉺾!pXj(?=VZ2uT)Q=@@Wg` k\mC@@@@@@@ Xl2#FHڵkի Lwp5kTRI6fw-@@WJҤIc&Xj       )-@ƚg{ @\xQw.ƍ{Yk&N(3f1%piٳ,UӧO  $-'\ʉ'^%@@@@@@@@ dd -#+?]wTK/ NظqT^%F֯_OP   @Μ9k8       S5Ԥ.@ v%w}lݺ6SL&KM6mbtTz3glٲѣ}B@@dʕK#ǎKF-  m6l &D[ѣGlEߓ(6myS@@@@ "F@X|4kL/Ӏ    bq)%6 ӦMA5˗իWT{#މZj.A5O<\阋 $)pWːƦ`@@@@@@@ cMA@ \"/ i$i޼ytu  $p5[>z˗g@@ J,)iza#Pxq-mڴʕ+ &PX1d)@@@[kv0@ Ξ=+;vtVѭ[79rKGH!Z@u5&L+Z s\g2  @J*%G@@@T &4 }jJ?nWP!Y`TR%K@ zreS[ҥO> *v@@$7o^{2kl @@8}l޼9&N@ *Wl79sY@@@R-4 H1cH=ҥKժUKSAlB*p)ر̚5NerUW@@,kK  @ dȐA2eͧ !z'O&Zl6mDgϞ2}G@@@ Ig@zJFiWТE =s4@ zv-M6_t*..N^~e&M4Qz @}}Qz @Μ9Eodpٿ!       q=z ^zvPMeĉT`I&I2eի }J@@ roo߾-G@@@@@@@ H@@6n(5k֔TwK^tt1*YXʕ+٨:u$ϟ7-;eժURt0n9MC@W`sEoo       )@`MxZT/:u޽{v-*+Vo=ۥrHgJVdȐ!vz)-9r@@HY… jSvl @@@@@@@5 @ Kƍ5jԐ+WJrbL"GnMfϞm:6mZ;vۢ@@(R?f@@@@@@@RNfK @ '=\xѴyʵ^mc ]vT<%{pBڵkh6H  ~ 8k׺,       Hj@ Ξ=+:t?nf޽eذaGQ$?w-2dRR(%]A@"[XA@@@@@@@HykRޜ-")*_IӦMeŊfiӦQFInRl RN믿6'OVXQ,Y"\CA@bŊٍ!Ʀ`@@ M6]Ș1hW_2}… O?O83gN)Wyĝ;wgƍ+W.)^4h@db-b8qd)+[lǬ_JMrfrw|%#Gdǎf5kJ4iDJ߿?u~ݻf5,PO:eיUW]e;vo:2e%K?{͛lٲr[ʪgu_j˗9r$Bްa^BJ'Qͥu>)T91O%ZZ۷l*RhQ3g͚5rEɉkti k8 '23y"U3 @@@H5kR #ضm4nX䖖lٲ̙3ʹo- @j|Һuk9w-"=KA@/N/t[x  ?.feϞ]Zj%… 'XѣRv=M;eҥf/"-Z0A h`СCsfѣޓܹsŹb7l'kNMfOde˖AɀbSO Ó\'#G|AY|.X1ʐ!C:fh_-mۚoF~3ӵkW܇5C2c YҬY33]v +.5:&?s^nY|wy[EuyN.\K/ΙpvOͤnMWJFDz)ӧϛUgMqN!   -@`MjH@O5o^O,\МD&RY`ʔ)ҩS'sa6EO~Gw  ^ wֻ,&-B@Y@3h&-z]43̄ LP#Q.hF+Key%OF9sf Z.o޼֠)|3 L{e6mdÆ v "۷w;D3Uh:uꘛygʞ={l۶ͮo͎_} Тgj Ѭ!VBRY9i+Khҷ~kMNY3@~OL`(2j(1bt fXremkhLAe BۮlyZzХX~׀.Ӏ-OV ~jP/^ܼ4ŋE3/UVO2&Nhg2Jۄ@^nUm49yAE    @2NfŬ :6'زe˄lлvѣL4))^  hыn @@C M4B~=GE3"^ڏ^^3A5 2&A5Z/?]Y,Yn3V=1`ͫUΝ1'A+@fϞ=>U)Ƨ,F  F㏽,dݷZ/̙3ǬKPfh[k֭[˽kFt$Yo:7w\;lڴinggE7cXӜEp0hO    YD W .?,֭,X@efOcK`رҽ{ws!gwyG$ @@ ʖ-k7r˖-0  "`]دjƚ` P:ucǎv/k-z0\^4Z}ǭ`?eU&^~WVF2f({6kTJfͤbŊfڀ\߿_4{q\aÆftŊ}v3l9 p…n0nڴsvV.\h&5jHeҥbL?8С\|fʕ塇J40Po6A|G6#GDr[ϙhʿ+ H޼y gɉ<@@@bkx5ǜ$Ld?,M6v )1&0as /`Zh  *TI`M  @2d-?Eԭ[:|Y 2WH@.]L ⱂ/Q6i):Oh[n]:wl; <86:O/@@( &v&]A@@[iO߀^|{}9reݻwtI]%5RX1)_YLt܋5PBRR%-Z;{5uܹS=jO8aQtę%5ٲe=z9VW<'Ok9Z>\ 49 ouϟoFk׮-ٳgR^=3͚\>mg]A9v=n1? oe޼yʧ~*̤S/Y\n<if'}=XO>D5Gɐ!Cm    D鎥[ k׮5wrڼy鰦*/6%1*h"y>3+ĨF@"[@/ڱ.n.z@@Xr\4648ڿ5jFoJFٓ B1k8m 84h9QbEТ^Z .len&3nʘ?FoBִiSɚ5̙S(5k4Kj{SNSre)S&i޼ >ܬξ}Wg@@@X_=!$dseʔ=ifI} ˥e˖rEReСW  a'iٵk蝳)  $%?KÆ [o5Ydjժ%A` ,hh&Og p$F|+hFۭY%riYboy}Xmi~iShc^X'ws-]v54"ŹiV?%sv&V߭R0mdƌ桁Q~}yM%J}U7g;vu;̀bkXuYk8 pTq7fϞmjܹhp{Ѭ3Oi⯾j ͖gΜ+{#   @t B}W @ Kn ֭+z%ᚂ+}vs5=M62jԨ0=C@bDn0wr劬_^<    =zTܳʤO^ƍg]' '=_bǞ~`W[BW]l;wN4[BX"Vv|AӧX#|k`AݻWcYFWM\p^?C 38ҥKt˗/I孾[eV_Ǐ9"m۶Y=d4񸀗ޜŭl57+R FeP_áhN?~/v@t nHfRuA{lݺUn-|̜9iּٳSk׮:,    Ā51"DW^;ժU+2ed̘ўD_%zWG=aEz'~ҤI}G  @ xvkl @@  2ŋg}&:u 8pUZ/T2 f 0i޼YUh֝,Y`qhfѠ YFs`k`mߪ'ұcGyL@ܹsY=;3XE+ tXKrm7lO7+N|ku좙ChȆ ٳRvm3N:&kAӷo_y͛Ugh{Vq.o=ڗٳg[] ʳ7gرc&ے\Kbkw뮻ΚϾf tTӝ;uhr4eZ8aRg͚S5LC@@@(~-@ D QFÓ7 1*лwoL ( -ٳǨF@O@/b.YjUu! ?n^rEm-Zԧu_>5^ȮY#,ݚQK(kYXիʞa-Ӄ]4{J֭E^dUABVt(Z<;;!)i9sf}Ez?۷o?uVYVf{Bz.\V9ݹbJ2k 58D>Ys    @ &vEГK77I3fHӦMc#PtZ2f(s΍ػcܝt@xw;zC իWoVl"zs9rW^_N*C@'>``+I 2D4|ҬY$md˖M4ĉjժX*o޼{,Y@rʉ^[Ey~0[55jԐiӚl#zF3 >kGM2~xSw)9s7QJ,믿E[Z5knV{JlĜuQ+XF#}y*/,_,AoR|9Νa;wʕ+'Vq.oM u5vu@@@@ :H/@ Jozʺ=irM7Ei8΍ݺu'3FD]]v͛#@8~xT':i`ZݰaàvK/XPI @;𺬈@R^z&AX;wnCʇ~(}okPB <6Uyh`͗_~igm Ek㚡bڵpBы꯹3K4E5EK>ZH˗/onO#F{/_f?KTe5*7tsƑVlǖ/+-Zk?hАc^8I9;wN>3%[=nU5|8q"frkJ*qM2E7oPk)^K6 1A3h SoL<ُY@@@]h"V@Oc=d ^uUDڇ @ ?@Z솭\25v7:/sc@B#p9sLh*V4cw}'֭3{b2=z4tknh<2zhnݺh"^3u9ҹ=A4/ɨZ4#TEi4FϵmhdaE38_:֢N; RyIHoT߈5fؾ}l2v)k5ݗZ(?[srLҥo_̮vkyGCVIy+wu[KJ˖--t}9CJ<ݗ ո/UV憂DӾ}{9s1DZN߿} 8YFeSӭhFgZm3   D5h9DIsrEK=w]k ?_~ٜQ;6 \SOS@@ e.}{GݟĶqF@@@bGϱgz;YA5z믿v9Iq l=9tPSO ]2gΜz@@ |jPi^GvW @{4S3,X hMVҼysѠ YpɐA55k476*za}Ѡ?;3Ѹ8ǝnj6_KƌMf֯_o6` }9O>^/_.ҥ3bȧ.C Jʕ+gΝ+hV4ԫ*VV`o@@@@ <]6FxZ1&4z7Vc={ʛo6xFлըQÜ֖ 4ȜX V֚nIV^m.]X%  83̙3'ы+&KW^vB^zɪϹ^'I'ca@R@F3#&E@2Zl^H^n]3I3(h&H(zy׮]&C\xruEBc6ol2,Y2}IF3 鱤A< {6P3-Zlu&k$~eV=GTT#=)w?~\6mdj ,(Ŋ3Aie 'et@@@] v1@ĉ)?sSޑkĈUQ@ &OlT\Y;KƖE@bS~v`f. f`Mlk@@P hƉ%JG(C݁ h>"d˖MnF6 hV˛Gk ܪU+4   D5Q[D)qƲ~zlM+>m4ѻ S@ n|;=jԨ+Q@@RM@i"[ҥK_Na@@RS`̙@JNI&:~ w}~ϒ%9ʬ    @ *U" lٲE5j$^W_-ϗڵkZ!@ ;V>nyϞ=X0`ԩS'VO@H@ضm[@Rhuɒ%eǎ&cͩS$k֬)]JfRtl @H˗/n~@@@@@bRtRK矗_|D/OcbP`׮]b 2eHݺucP_y睮C@Dr̙|fFf1b>}Z.\(<@6^{.l @ ƍ      Ħ@\lv^#)+p gPL<l XxݮVZ  Ħ@֭Ϝ9f@@@@@@@/@`MMp8y4iDLbɘ1cW_uY]/|Fa@@bSZj ,YD؄       5)&@ v:$Փ? dΜY̙#ݺu]z ֭[gO^W`>@@bO]vgϞӧ=F@@@@@@@ I!h6'm6U]t>w_Jfb#W'Na*UJ4  ֤I@       ! &DT-j*SH"|r]vl{H _g3  ŋ ˚5kb#       "kBK  ,o]T"?-[6vQ9xЌ5Vɒ%53   o=       O ]&@KnҥK~'UW] Q [lǏ   ФI)\ݻWf͚%C B   6l &DqѣGlEߓ(6myS@@@@ "F@ ^z%ymV&M$2d1 \s5$`  %6mZ޽}P@xWS l@@@H1kR !@ hv.]AO>2tPI&Mv~!@4UѢEeqAɗ/_jjl"KW(P˗/7ww={v)VٗYfu˗e̙rFл nܸ1Yr-R`dʡؼy_^on۶m .lbŊr=HlD}?uqqq5XHsE徔cǎ\xTlY|Y^F/Z׌Vr-[gB ՟~L:ռ'SDKJzҰaCXɓ'ycݟPUVɮ]\}7u]2}xV3}RbS@j=.{=yg"ż|U椆f#7o|rٿiFEYиqc |X.+WtRb":f}pP     5aKhDӧUVh"l7ߔ={FR7h+^T5Z+ ֣.;p6mXӫW/駟;o޼RLsѫ0S4B3YEA 6lݪ?gH@BΝ;瞓ٳg{кu]v5j;Buh!RҥK'zA?~yOl>ci׮=]/xmݺ=rѺCeud믿Ds^,eqD*̙3'|N^jUMJrPӾ}| H|.dz(XXtH=D92l;w1&7޷ʜ? W?O}7{*T[` ,YaujBXoiF*Wl죀x   -@`Md?Z(w nҤ㏦3f4+]) ?jѻwܙW-vZ)fɒxZC3YhPIRâȡo2Kqo7j>/^+o̙3Kr]C(p t2fƗM]rܹY/O,&TNj?N z~T/Z(    @ Xk{"@P;e˖-9r,z5WQFRD ьz^\Zo}^L)RąA/@w^)S& K*U$mڴ͛]:'O)T:zG˥K\IH馛nri`^(wPS4[q-iƍ& r׻ p1M4r 787-,o>68˒%K';'z~'4 ph3B2j׮RE(]tCqDG}RVPL_z "e-;vѣG1oMlD=[΢Y<;So5$7ܧ70kx٪ȕ+h߳>+ϟz[.}VR=@7}ԩ#jL-W=, ӦM͘p!iٲ֬" 4:.\ .,za]nL Ԣϯ;8/ =eIl%e^ h6^xnX XXɲiE/J`3$ܣ'?ck…*{\kLdמZE3Ly n76VBܯ_?2<s8N24G/={oc;nʕ+g2i҂ ߧ#4E3E޽{ѣ,{1'4xW'j,^z{[gpm]̛C)F5YuA3 >ՠhuBs;aY(^3޶\u m?ղ|K(L04 ;RK \Tn~da)    _u} @PVZheѢE'On@ 6ҤI#&M}oWz{d &D0.r('ra.(CV0aB5vZ<kr8R]`ܸqL(I8]vmhP/#_C VsָlZXE/JYZ>>el5@\n~FgU ,(o5YW[5=.m{* 8̀䩤>͖-zԼ_O}cZt wD\Yl—25_^w1w=C!pѣK H2ZL2`Po`ת{|t{@J:m VK0<9[J3[T|L2K"oN<ĀYٳMTm4;eS@P TVM/_.*U2 s5O3(lٲ%Tz5;ɹsr!/l%JTX`Bj])ϩ^f`mi2fVzu7n( 9{U4cA0K=nzQklٲV 7v=ӲeK{9*FJ8ӧ q:5[f.k}v:xs=:P|}r^y }wLyf3ǹfw!U]vҵkWqI{} &L =}]b^$ӾHgm_29IlՙԼ`VCl~BRw1ϒyxnS@@@@@@  =D@ U.z;co_3=^@ HzgիWKnE`G}4'AjBT#]t.z!GA*κN_p'gΜ .R]t1Yl{1 6heM?~gBK_t[ouwX3vXь(Vyk*?%l~yԩ.U>C.Fjg+VpV1ƽn_I׭ꪫjժk:tHoO ĔjeBҌl 4pɔ.~r?:.T h.vq`gL,ϑ`oଢ଼Μ9ۭӃ^oJ~o;X}r%gb[J3[T@@@@@wk}>Hqw-3f0 q&M$>l "@l dʔ yٲe.] &HriӦdir!{^w^)Re?]2kI=wq˺gD/RR=:+*YdɒŮNU… ]2 9bM_^TCVoMO`ٳgeԨQvjo%T.֯LlIζ녿ŗX/_>9|9n4PɹoӦM1 X(n5ٽ|   }e͖;Γ|Yd]v ({Ȑ!D$ƫthZ*Ty/@9}D4k5^z20Z7bΑ y}m2?           aMX$ %`˔XreeTJ(SE$dڻAdܹ2e>}lڴI Pn ŋIWjUT h*4+Q-Z eAA/(1F\r WRwq_z\X)]fr);`C (6Ǐ(Ec„ eDRI|͙3GF!oaѣwɓ'GŮii`ʨXbNI\y1A"->Թsg8H6r߾}a}Wp?*1Ktvѿu/_>eLЧOWeg{AMhpY?]Hϵ@D.D$D&!"[^ Ռ:k8KNdRy,f6t2 f4A\A[u3F*ۍes,Ig9$vqTA3" "jAai-Z5"t~WU~ڵLso2ط0g v@O?)#yQ{stp6{-Fe˖ELk8ke_x"xoьnaPB߫" ܀4DdټF{3hh3NbG|w=S\G$@$@$@$@$@$@$@"@Úxe$@iAʥY:@訣J$@$\ѨQ#2<{+J|jkl_`{' @C.|zR=|SuS:GRʉ1dǎame{w. 6 *3 _:K0`2Z!ŋL|1, D% $^=_uPy'U*,-Nk-Zv qM)RD8?Ȟc1ybŊh^d@O?T."dž"6;0&ꪫvyUnze] r!]`\3{lKС/*2;KwLx@fOq=O8/#e(&vAdqDt~e {6mNX`fcd摩^{N ?\}j$@$@$@$@$@$@$@$hXGu"HQF-bDo޼R!B$@/~0WA(h o ?'r%"<`2Oz uxo?|>,(1jPE(3NT}D1$%6|:X燁+QSS<28zָ]#侸[C=$hU+N~cu[UA>4|pG}g*b "$hzȄGQr uW׮]4^\P`"ٸ6'a7Aae ܌o0C(Oa(sa/b;Ⱦ vC6hYt G~+gH#믿^)=*jBs3Dt%G\Cܽ'3Z3X;XSx,bP5c5c u/034"koNͺ%j%x8qXNe%#&hځ+Xz2JAdI&y Bm۶*/c8sQ@87g]`X}w`'A$@OPrw{ #B _^xp.\88CqJhO MG?q>n:/H,b8C^-xN/h69o^9~0 adme˖>8F5]"r;e|֛HHHHHHH< d(Ts(1"zNIH U @zwM7jB1 hAkת`h(h SP4J,ESW|7#^xU0Yhm͘J?XX Q,ߣG@(@~J 07n~DKUȑ#U{̪&9|P1!?(@oW>l0y͘Op-¸?ݴiӬ,$\Pn"Djgʜ8~^υ^kWD $_~ 6XtM(gA L湀{U1sI8/_|X #9g3+x2񋧘D]>*Ta\aJІ58G򃚏Z׽5Ux@iF"9d3fTFݻJL(wqy!ZBѢEt!t$/+]wPz*.ND+ A.=xv csh90@ i^t+[D#0aB抾}JUN0,ExvБEIJ/y\nݺ1c8aƍ뮳o|+ksSN8CW 7 nQl6HHHHHHH а&(C$7={*";y8% L$ڊW\DxhD|m۶MdΝV\!Y(6CFeS xUlC4hk\?*-Ci c)xe⇁7QS(4^,9c(a b]p\ve_ј5_~Yj9狩hʕsVvM^}UJ$V.;L1Ն5 "@7yI<@IDATDɫl+s"r9x𠠏EC'CAAIW41ҧCa)((j:ހ8N&P^*Pd.D2DqUC ,(g\ͱ(ctHx,bvÚh K\p^#^&Mj^x뾊9sc}uC8$󜱟6,c 褨mxfx;ӕJyRH x ^qKw0V 80Q È ?@wUF93636Az\(5NF5(]"ˆy8@XDsvѻwoԩSޡ"o#/qw=թ[HHHHHHH а&>NYF/vu ^4G"I<~6012>תYdW\?N:Ŝ&l nJ)/QβeL>kԩ~21pR@"Esϕ7|3,:i}ꩧ{FSY\rzpBu|WB_%ڙ (y;N= wDp>rҘ%ݙ)Rt 4DA&V4x7qB$@$@$@$@$@$@$}hX}ǜ-&$nxI w>>|VaIH CK(~d%b|e|}/eË>keiTjjVkd& M[J0TPt mT6֬YTūrY)|GTAm^& k P"5xoH4aYyQC ۯcǎaz!7wPqӰ^wCS-^7:e# 0A*xh={v.8vPF0PH޽x5 ˌ iC ]tJËxޅyx68G48Z0 JlVOu!vߺukز ;LeO<%iL4jJڻwoL2:(u>#PV Z*3YA k 8ˌ&bիWv`pA\AT?H},ucpԦq,Lgk侶TRR^=iժ裏*^kg8 -<6O9su`d׀[H `({M\tz+(x\ܹjjuxnZ)y-0(d HM݂N{m 2KhϹ1RtOgnݺf]WATງ19[۶m {7:u7N/XB_.xոqcU W4i2‚1l߾}rHHHHHHH а&0GN | ^ӐWΏ' t&`*+V,J^m駟XQM /oJw&f&HEjg1Lj<(PիY&$DS/T>:,M(Fc<Vu2ůe&M*ƒ… H38n 2b,*k+sB'/0Oȡk7(\Z_ti9XguL~zzt\Ǝk퇙D(B e HPqO'N;Mm H#ZXLcNtvÚW_}U0BkEQ,ϵ|<:ד}_5O'p,h$]` E-[ʃ>E}wCIN)$lx7 LMPtw])7o}nԑhLG NGcq{:D(Ybg0UL K曊0Nq K_ݻW%snuglGT|]xM6p-ʕS-[Vh$P)?xE}:u0=ܣ xp5(xG1#J5c($@$@$@$@$@$@$@C]30{$@J`ӦMWAJ(!͓ dh,  Mg-{1M ^UC <^>zq ǝX $BI[NSpq9/9眓\}ŋk+"(ԡt.|1s|`?ST_La-#3j <"ʳ]<>`9:y,,X &Pzў~f͚rW;&q #8z[xSA!DKzqWd7BJɉ(@rĉ7t}τX(]wu=(','p,&@ct5^x (kzugzK{94"G\3rCjɼ{E-PTrd3k5xǍ}+o^:(`(8P9/"~믿n&QF"AL3xn:wZ 0>t)X *t~x'>B ayU?A108( Q|2 @FHA#H$xG{=TR"HHLvT^lYXPP /NbWlHx5 P`)Px7# é> ^|܌6o|L(kNnfqޒjmb@Yɓ'+e 3zS 6Lf|uM-5j԰tunS#ܒ5(|w\X! W,6^%]=[nQIw* S?H>}ӹ܃T,dh;zX~A.+o(,AY Et7¼ p,'bӖtv.\X ݵ  0;@z{ U,;gUQ`ԪU˵pLcOl b7۵޿0QC/#3 TqMHHHHHHH ;а&;3[IYE`ҥΝ;U0 dx̼dҤI]ѺM6jٮL ~yIxJvftxJľʣ>cٕ(_4P$­[*.x#qϞ=կH"RbEe< eLt1ۃ:_Q4J0V(C.탹JF`i(yxqAb^AZI}ËO>Y$E$ӫ(UcعGs޸\Gf8^zIW͚^+(gP!2x{qڷ~F̒3b"EwrXl%m\@p&|gjbF3s7 תyfeMn ے)7[ϙ$o τqƍSƀQ"?W՜%g~{"0 A ~At젟M+po{9sX5 bKGyD=?c\1&e˖G̉W[/ K_x1c Z8ynh-:]ujY>#E6ر $RD!iͰΰDG;: /jёk)$@$@$@$@$@$@$@C 4-%0袋,eR(AF5pF l$`*i$h^ 8PseTZJL%;?>nmN6]%"񤛘FXfa4 x$ŋq#2"YF`l&:_#*%6i$ʈZEL3}4j_ dAAIB=F˞={Aȑ#w 3R ?|qjgd_cj}I' G.F;Ԯ]*:uސF[ӧ'ӂH{ys,$~tI!_ZӼkJ1->8l#T6Z SfY6T?v$zbs&&TxqҥRGO3j"a4mTԨ0kQ=\i޼rn3Ϩ_8kZGOD%\kc,y-cD(^d89d&}ӧkپ}{X:/C߈m-Ȅ |NGaDrsLw[AZ"B$@$@$@$@$@$@$=hX=ǚ-%'obXf޼yRDo;H$@JT˗/ۮ]I@}W(OP;C0EbWmG~c0 C۶m>`>]IqQG/,3gt}4D:ʁz;\Kf>nL,GVɾ(D*sd}Τzy Q}ܹ }}r\ }sС*4όv' єwxh Z0a!4uA1#l>ի`r91QkI0h1r&/rrr">-[-ڔLocFG>pB fq       4#pH՗% GÆ [oتU+7nq'$ H{( (0jz(JD1zlٲ%L'xB~mڴI6oެ>!1Jx/PpE`TqRi ,6Nu-Z$۶m?\~7܄γ<{)WxS(JC)#!~H OP %⺄RQ'At?C0?k,> ^i2].bٳg)ծnI^|E9C$@$@$@iB@{SL겚YBKs:%3 yr5\k`lS`A-fHHxFDK($,%|z CD"cGyD uϗ5jرc8a "˼Ҳe@s ]'tNtE-4"fΜ9VtxEf^Ҩ￯Vr4Ή kƌSʇO?-:/ }yx[Wreu}0l;!/m8hyW/ϕ!p"tqgީ Qq>+~>$@$@$@$@$@$@$@J "wuWQ ¿1H`a3IHHHHH . A9_-ǥ,fJ$@$@$@$ŊS ,"8 "q;>2׬'pJ:u 1wo߾0vۥKnРArw "pBYl߾\6h͛ YfaiZ@=aT0~x믿²Eo]E†K/4l(x3"Y/f=we{6ȋ6l :9!`lN1r;H֭sm>M6Mט 'N"`+ u>* FY0G9X-ZP{f8O$@$@$@$@$@$@$&/[GK/;u$FRm UxѣGƶ #    /F%4͛7RJڗ;e+R)kN)@)OgN#  Ic1[RԫWOV\ؼ;0sʲЌ (#T|rn4i&L$߿)}Q4\P?3hѢjժ5:mԪŋ x :jur) 0+D " ~nP'قhBn8G}*xcƌxc޽"#>ꨣ/7axe =lYUPnҦMiذ2dC4^xAN?tMfTn]С[7h@z"\2wgq,YRu^>j"܉HHHHHHH а& +D$xk7TI]hr 7+ @>5q^_q]vUye0:Zڒ @p8 %sJ c9F-_~* ѣGˡ UTիWHvQs** l%Z`$##xI' E @aMsҖ>5o\?\&M$7N6$@$@$@$@$4ʕ+0 +4_f͚%7oˌ3 s  FeQϜ6_}*YA:D;vl4- E;/ۊ&(GI h D*(+VL9\O$@$@$@$@$@$@$EhXEM%t&ce@ǐŋa)$@$@$@$@$@Xz #8wqIjՔeD} j1{  HŒDYfhI&(@!y HHHHHHHHH а& kD$`#W_-%KTjԨaKE      D8e̘1={JÆ RJ #   "}xUVc=krg$K*UJm|eժU HHHH -TTIz)Uלҥ8p -J 4BiHB`rWUyZiӦY @/.}Qҳg3e$@$@$@$@I%еkW9U֯_/Æ Kj}X8 I5Ad^$@ 2D:v(Ty\oH}IHHHHHCCRJU{'ONEX* @ 'L!{ݻw73!          daM'Pw.999_z%)P !O; Xx)R$|%HHH"ذaC홴[ns h :TN{~J0>s, D s[o $3իW;oZ       $@Ú|r衇f^CӸEP2Ҹ): @{-L4IR',FI7xcF"H/u($@$@$@$@$@$@$@$mg[^ رcԯ_29eܹ4Ia`i$@$@$@$@$@$TZzת:l۶M&Np    n䭷޲9C$@$@$@$@$@$@$@$@$@$@Fk툱$Fn*_|]VfϞhit YU H$_~Y"Y @ .]Z=##5ʌ ( }Y5SN2tPU#F()W,,>l: @0 +V`H _`{昚YUVMN9Y~O?I%R)^+^)~X=p͚5~V>S2f̘ oq͛0a9 @B а&Y d 6H oU.S̙3G*V=R  ܹS֬Y>LL$@$~wv}LuQMlyf9bk,P2# Ha޽xsKJiӦIǎS)Z;^)z`X-x^ׂ(|Oix3% @JaMJVқuQ *Tsʉ' cIHFpr衇&<D$@$XzaI]s3={1E"j͒%KT=_{5իWԌ0 4ipH2@^cp/DGdPhB`QkhXώ{ x'D"E"Q ۷OO\K$@$@$@$@$@$@$vhXv&&KÆ T=TҥKvY;  "0vXiժUJՉ! M+ݺus.>lYtX}Wm&:f֤aU ^p d /ڜ rˤIQTJQV->[V`9֛ҋƍ\r+=o<]v4ټ{2dȐlF @FȟQacHJ`ٲerZF5gqFN$@$@$@$@$@)ChѢҼysUիWSn @qN:jNl}&܃HHHHHHHHHHL5I>,2~(_|ϪI/F%JȔ&$@$@$@$@$@$@h׮ QHHHHқyg5Qk,!         H#4IŪ@={4iDvޭX~}#<2Uz $@fͤxI&%,HHHH (a… ʖ @а&aY d&iӦI-d޽P1c-Z43V DPBr嗫<6n(+V)?L$@$@$@$\k׶*j*k3$@$@$@$@$@$@$@$@$@$@$.hX.G$$0qDiݺ߿_SL;,k* 6mXUs$HHHH } +VLʖ-zmkN$@$@$@$@$@$@$@$@$@$hX '?^ڶm+P]{ˡ[ܛHHHHHH 4h@?pNdfIHH駟Z믿ʖ-[l" @&aM&MD`Co $,HHHHHH iÆ U>3oӹ9; d=*UX k3$@$@$@$@$@$@$@$@$@$@$IJ$@C`ҹsgQҥ :T˗:dMHHO?$K,J~)]|ryI…s1AԵO>$zGyviƍ$rk 6޽{PBRBkUVzIٲe%ڼyfU ԡ\rJ˗㎓;\l_1S?ijժRhQdݲz\K,xE ;Z%{~ҥvZ9&g}u?׿/Spxr1ǘ 8ў h <#GՖ[>c#lZC"?7駟czQGF:=V:xMqƫי@-dԩj#wqsBMY~D4(Kk_䁈v,cuC:,1Y ~G"|>bx;^#ߔcXpa 4nܘh{Fw̡7xgb xw1gX fλLwtŋwu?;B+{ 8û3<,MFcy/wzǪh9dj3E%[⽞xf$@$@$@$@$@$@$@I!z)D! O RvE~c"  lu}\tү_?3qD4N+Ϝz*'nUjr:vkm۶97!eٳyrWԭ[W )Ujy |9!#ZKzԯ_?bBF*=UBVe^ӐKXroic11ųE^±XnB.%uyWCwuWV4I5֭'d^2H ~]mc?!.98G}_K+#3yC0rw2Ε{!2 ~s5%㐳;ud9]wj_%{3d4n2UW]eU? 9W^ҽoN ΐ @6B$@ п-z  HxG44 B n%t/>`EFG8$N2Ї<#C8~'~'Oki@m(?SA jʾ}dӦMj)R}ftD،*DATx -[o%&M2ro6*G1+{rH lbŊ֣2RV )i恈D.eʔvE-8QK̙#!i)!(.#{^^;nZE9/}'5K? Zqu5j;V>W|%ȋ/(?hN:тhNuhQf ¦&L:/pԫWOU"q+ n◕[~Az >DAýQp/µP#mho%~-־^oˉ1m>ϱXfpn$Y,~'c18O9smkNm coc}$I9 "J$ 0)IV8 +3I$@$@$@$@$@$@A K L <ǢPϘCŐw% VNqM~"ք{?ofg/X (bz O7;.#+8+bMp і՞3fXۃ:u*Q+t!@bDqO>8k,$aҐQMLO!!Þ͛[;XMo8㩕k8 UN˖-Ȟ}Y3 bߔ2? I0C:D[9pcҿ;'d҅(>"0@IDAT=FaX޾}{BJ(9=Xӵh/`(d+wSNֈ&4!㘜Hgp^#~wZ(Cq]|3 ʞt+լ_^ou.ϝ;7euOāӯ_/{BXVh~dX,b|}XiG1Ni<_CJjlWNtzBQ 5|cԹ2Qz=E믿>S-At^¸@_OoA{ߜF{?\〈,k֬-[6Wdlo4%q xhCoN"d;LDf%IHHHHHH @C/:($@$J akO>)>  H&ӧK.U  /-g}ڽo߾KV{f T и?|vQT7n,A:}2i=}ҥUƏyH_{Y+VP@q ")!J* Bm?vg}&;vPtzDŽ ZRް"Q+p5mԾ).(H!c?"D_Z6sXkn;qU"xiF>_zMFfpqbFS8MOyAOX[8X [X NʷK^N?}̱X׫`FI1ү5}n/bXL"8C,sd]Y[zk8Kca< EIf5Xv K毿Rk\$ॎ]vl|^3yi{(ڌwCx Ӹ-ǫnyYۀTPb_U=4~ї@cLXב#G "ꫲj*e$((Π|gxM8Q-[ݻwWF8_}Qܢ^=={4@k˱2iJ8Qvܙƭa",ү%/XLkLa_CLOz]N83=KƳXcIK-cT:EG݄gI@n~3m4p;5}D#ɺ7x~?]T A/Tpvz:=rV-[T0\gZQڋgl `IHHHHHH sа&s%[BΝ;[c:| 0  ;Cvء"Uڀ|CNhŋO?Tf͚$ur-[VA6BgI(@ .PmAD~0DtާJ*"j!OJZSOP}v2RqnP7>CJ3ih 8>DUĹW^n-^d?N:$\d8ו)SFVj̆ T_b4Xez]v@o-SQfmVEB?#7qdʔ)Jy O>J~0o֭>A=c &H߾}݊ͨ 4PA$?ږ퍉'l_bגbsS=Jg1I";ɺc6FW{cxNMC4 }jϚƓ0(?w -[#Zp{z"*^pJG=<ަӺWY4h} x9O'ˌۇ「;l d-dgI 7(1p 2|p@+ȍ7ޘ;1א @ @45(C "%Kx| @7{lǬ+&0 SYӰI&VuiӬu6m6v5xK[N/nҵkWepU`h/H P>l eʇk&d Gyue2.],ziE3<33j_2p1$@$@$@$@$@$@$ږ$@a/С?^%(]ya@$@$@D>#馛wU?K'ڈ>UDo]yee`mD:WZ֬Y)X6m+VgWV ~衇)ZVwJн{wm;wo 0@Zj崛ZwGh~WSwMknЊHC`аaCaМ*s."E48/ϵʱ#L#lq:!oCk~TRr{#R 0h's9Gx G#E?ʹG{ k!/}<[^E{護RtIeE4OD1 svQ>m00HcǎUIx\bCEdW뮻:桌… 3} }fmkmXc1}ۧ8K~'}>_+~r,(ҩ]~A-iX*=Lt}Mƽg.~K/wRОeDґ#'t]F" b #'8XzFxGXpHHHHHHH } а&}kNgvĉU _].`F$@$@$/'p̜9S}D /_\p+ͩ S?0A3}t?ل탺CpORt( SO=UN!9=a\ͨW2۵k,X@E'Ab8K4h຿ ZAf,U,eFo4-[D3ёiG"]܌R? rrrԺѣGg/zF<{ZVA05 CJ'Fۿگ%/F[9G\cXt%Yo?>K#zDN9K$,K+գvZ ?5kZœ@,a}XG?E۶d:⋂])I k]$0qs:ˎeF< * N12q_$@$@$@$@$@$@$@&Iki2"iT}[L$@NiQ*U5bĈ@ ^!>ØbʕnЎ[n2T2up^sϩ(?DԻwo׬X瀞 7(}õi!l\o7,Y\]kݺuV9RFe?DaA'K.] MΨ6B_KF_qb9znc1%b~d\YNKX,ULUP!0|{d'XDCM3o2 f:,iݺ!663}g& {/ {"" BDo 3N:2֬YʜVrFE|b{11f1ipHHHHHHH V]Ě#'Hڳ><s{Æ Ӧ ( 8J6m*{>Hke5}bYWLeGE%x*"#mi&57ox9sE+ljJ~aS@EACS)O:U֬Y)4?~ҥKPF8jѢEZQre)WlذAEADCDTQ"3'Y[zu:eҼnZ`Ifz3P4g}X6WhYhȌ>b2~-}1bq,~gX,Qb;Ϝ±XDc\-4$o{J.=~u_3] fو'v,B|xNJ16qOos3vHtu%q@|2w       ; @_n@Y 64I#z !Pxqe\}~k^z )z-Y~}^]oʰ `>A{K(MZa39tPժsHCy5NRZ999x*Rz@P;*ZH?m.m#5$0 _s뭷JzTDr1O?dEm_?u_wժU~H}^e˖\ov1s)@B Vť.(% x4~-}1bicaL%YLs$mL)bpWGDТ}2KϽ+-Ȋ++] * B?e65!u6lp ,HHHHHHH .K3*.) d}I˖-wU/ZR(G;b vjf*V(mڴQO=oW^y|;jcڵk( iyd_l?"{b„ w9&_z|jwX1Bm'եK:擬ZS^z)SO}C-A: <@P7o:_A!hØZ ^W=<G,z3cb+qвqF=%Jf'd=LO Dz|ű?Gc13_LOzRwmL^D_AYfact8J##ćk&m۶UIk۶m^w K{CX/x)V}t~Zo:NȕaEPW% "HHHHHHHB5qLI u r饗ʬYT%8e`snY3  p!DqDgxU% l=>Bƌ#[n:_D8pگEGhN/21ӯu*  rN}ݧZ5R+W/0`cRnfG;v>Z;f8/ .,Pdڵr!HFP"O=k_u]֭+\pZݻ^kd0uǸ.c1<՞4MN+>K1QOMFt5{׶y睂;DjׯnxG9;%JyF[gApmk}fpgn079:Y0ąqLIHHHHHH@ `$@)B7o.gV5*V̜9Sի"5d5HHH : RJǏ;Ðo]>#n;wtnQ4kL}`ްaC6>C P|Ǥz *$?}˦Lƍ]iڴzu ې&hC^"*_4:u]"@yj%u֙S닩Pd%(Pӛcg2JL라2aTӠA ŠpG$x#p͞|ҹsgAoF{*UFnoE2 ;P K8{\+3^Qރ>6mh#]' "TA~Joe>gUYzv.C(*25K=Rq3<Ӫ֧~js& x/Ak~b?G#ȱ_}ylZqX,QJjjb&M/߼83;s,%ך"\3}^~~٥K [N#.\(5k֔۷sop,"  xAZ6m$ژG8 4u\8N2C       aM HPG(A/ֿ~8x!0216;QV,qKS( 6L `Cs=WE5ûH ]A^8@Gիæ^T)ٶm2<;qԆpȴe˖aۜq/X@ʔ)#7oV|' F}ާOq`%H׫.M6_`D±}ixfС%) z)P<1 Zj6l(KVJHinPO>$ j*z!OӿѯE{iS= b,15 yxZu;b2CSYLSD{s,zr,U&4 )sy[n YxS17ڼ۽0ȑ#NPFxxg+Έ̊x1zh_8Ug_N18 f̀HHHHHHH hXE Q A$#z)AT@=pr&0Γ;b3*_D ( **`%>uWm섞=|vzf:D :(43BY?@|(l~N˗/䣏>A;TzDkO>d駟AS2L vbŢm;O2,@QwFՏw֚&;kghh6Ztn91c qd~a?tYslh?3FHt' R**Qσ 3la(4{lю:#>R)pȑ2c i޼lҤI&XLg1@=M2AA:'՘kIo[Q(׵t i ZLkܚESY̵_Δw3j|]))R?6zhԡ߫cqܹfX@+țXږh )W?e ZALtuA#4FLfT9v7\xH)    >b_tp -A5aOTjUT?@H?ꏮ:3@h$o&zĉquKիW*իK`֭u:p'e_GGUXIcusʕl2QFftUAgdzt,}4a0`YQva" b oLHM6M[g[P xxh~},Zʙ)rد@~^3t4ڵkȔ`$p'ӯk T];~ w͠ :ިQk\{Z,ﵱZIꫯ6YǏ/:0CufVO}h2,P.\hϝGuTN ZSsN3xEs,_|:1<;4M:@+~(ʊv(   @=@&m&:9sL5UfFI I@GNGBQgu4dFD-V_77nlrڬ#h۞u: SNRyߔW5F~79|Sw*Y^2sW@{|U،k&~\mJŬln(JB r'Ir!'Ǯ(=@@@Ȍ5q\@G<޽̛7CӧK۶mS~l  +.LJrY@ Hl@@@@~ w -[[n2|&wƌ3LC@rM૯I&%N:) T $xiH l-[: \l5 Z,;k"7Рnݺg}ffΜ)M6h88   ^ YkV\)hB@HoZzug@@@@@ P uV޽̟?pؠf͚ @f̘!6m \h vbܹR|yXX`Wt̞=ҰaCğ9F@XfXt1MQҼy\ 9"cHKi& @8 &rWqN㵓*5GZx Y+0uT?[^V-gxo +5S*    ųNT \۶m=zȼyի-Zr   @ptr}w-  k֬qWn]g@@@@@ 5~8K1gonjΝk ;0TӲe˜5 ޽TZ5 e *Tk߾7ιBŊK|,ٳ~NMq(Rs0dAZ4URŻ|R;N:>uT` j@. 4jiM6}b`؜ȅ   @6 Xg崀՜~2g`jZj.4@ [#!䦀vpwMZm9>kd@͚5eX5w` 3xo ;@@@@\(k A`ǎҳgOMu=P1cp#   @:y%L9VJ< @@H5t@@@@@ 0cMj})lPG}dVL>)d@ <3r@  6m)wޑo1 h@ʒ%K]_jt~AV^6<vƨ/ a…r$_(%YfIsJcڵUVrT۽h,A/)Gev{^Ho„ g#  EI;wg!~i i۶m G#@&a/ea @t`lHx`LP\^=Xn:9x]Iޔs0edU3wj擒5zMGn>crP&#亀lZT\g @`m&yyyWlY)]tl/}v~֯__fϞ-1_~ڵk>1A8(P5^{)> ŀUv(hRr<coM@kh|3ܑ ޽[~#k@@@@wQ ٳG#3g4ͫR 9c\ڄ @Ǐ}  QuHiȑ2dȐHYAC2[Zkl 9zcdRk5jT&cO^{5_=JNGqBb<sc/O@_4hu_ڷo5O.o:t3& h;   (|(n}ʕ*#   @ݺu֮],  ]?S!wp@@@@@\,?AT/s=W~m *;#ڵ vi   EgkH  )5y^     @nEN<8p믛r92etP   ~USmk @@XzS#8Yf@@@@@X3E=%pA?iWٲe7ߔO<1P1   $*@`Mr W`ժU6l,     _˙˓Aɋ/hTL3k    @ڵ"֭[,  ]+W4;ԩ]6      @`M HdAK+BySdRW_ݻ{yB@@@˗ *v_  @P5 4bŊ @@@@@ Ҵ2d<b%K &șg}F   d@ZL-ɂA@@0رliذaB@@@@@ Jf!馛dر1%JK߾}8Z X|lݺ@˔)#Gqzևٷo|gޯR4o<6R;,\Дyf_o^ZjeȖ-[/0<-7Rڶm,[lnڴTV-R֘oܸQkcemrGJ՝<+W_~ŹmuL͝;YFz .۵Z+^h]uǔ>BS5ycMϗ/R[cRn]С4i$"CիWΝ;My^N׍l;åRJa2;j׮ma}/d_cH\˵Xadݥo2oupO?qGϝD NbC$ͮ    @P$!@nּg O)@ݨQˉ'º tIι46?"oy nݺueݻ-CWw 7鵔W~@_CE,S77)o7S^~M];d8yyyls/r~L}w,XP>wҥK+R Dz;Jy=sѢEy'|rr;}N~G@_z;8z嗝s9zhg}Ν;;6{TSkp_~@eO_s0t^ Dޫ}M"QMqwkdݻ7{K/4~)w͠xE=׉" ^wNQ}xZ=!CO>P>} N{iӦ9us#]qǛyܝD)P0?9/wvOV01bDLWCv{58$辞q3i"0`@غ'o׮]N}u q'?ĩ~~Z~Zdɒyw\[oUX/݅˩~)m*6?).簳sB~pS;[zҌ>Ν|(x_}A@@@3SEB _wm# /0l@@ %:˃<)ZJtƗzc"\G6S$.H{L>݌tIʗ//:G}$:rpq=X>^{mb:-SQGͬ?Վt*F~7 ;NX)לEfΜ)5cI͚5f%Sg-Hϧ&GG?| #(}gFՙt9sH~$~,P`͚5sI~.maG/m!Z+^%^kl2:ZZ,뮻N}Qvڙk3_ - Hu"494}d3M~O?83H~B Z~砳ߤId̘1 wvzt~!Rm>&e}_әS; &}7\J1wyǜSO=U}:=믿.~r!j{a\WtigFknKϕB3iy晒dcꔈ@%@sVw:>CNwW{nq0l6 }++u>Γ96"   ^ G,.?bqN+ݝ,  ~رL:թHK/Ԣ3Q#GE]YD`Gg}V;h %ggak4'=3f0hlJd?zU۸=zt?.Igꪫw }hjЇI} W2@IDAT)L8ElʟmYgU1̚5ˮzc"Q8A5K~uϟUT4lԀdǝt@@;.OahJ]hpMF˖-)Sct9ƪU:~ZuV(O>Õd@@@@~yUF x[~8N@@ l|:?SsI]g2i,Tu pϦbet6p?X~K,1#Wͯ~OpB3A:ks#'N4$k9ckg:u";mٲEG.Ty3YY.}co?U9j@5IHP {^f"]>b\(tpA5O_H f tl`^R̫Hc2ܡCRIZgTt3 Ԥu/ @XRXx40C):_ze|z'V~^}f;"gwAvB ڱ;v;_|ч6!   >z!qС}@@ M:cIggkQkԨal7]_bE!0\?{7M۶m+M6u:$~>}Dg׿ܦ㟞Ν;C>u4PRn )StҎ\ϛ *H6m /,s9f~=1cL^ժUYffe9Zvtռf觳s+ٰa,@&x w2u}.^ ʵD uM\b}u izL4|v;&MIc˖-+7p)KgCH6XD^Igљrfp~v}^>;v먵k׊Ξ>.Ά2g3nmΔ~^/ׯ__9Sc.> 05Lwߕ{ qu@! @@@ XEm} 0n8k7ts@@ hKvggًZ0ŋ;3}znCh>ݷ֮O=^zM;_>"ǞǕؔhݟ` hK f̘I1sNߜ2u& x '8g/} 2qvHb!htmOv&N:)l6$V֣gHj Y^ ;Agٺu̚5˝5<ιÂ!   Kk|yڨt ˢ_uz#! A;wӼ-[:ˡ ?믿e߾}f_ CwtMvXw'1>2l>v/}ꨨE%n_N?NVl'pF[܎?:c8p@l;CW:*4Vv?nsS@C 1sv:p=묳dժUc>=\3A4v~饗_7gΝwic8\"M='lzuJttի˄ dȑ33lܸ1gMCp x{u6["~ZuOE"552סHuk1?fڤWx4uW]uT\Y>s:u]mɒ%Eg{xРAg~w߉ s۶mbZ IFse^ogUzNDNErvrǛAtnsr9簗uв}s<@@@HVd h'. JgjH  @4Hdᦉm۶5#Wge#M6:ef͚r[n34@GRI뭣+V̙ƽ݋ . l[[d֭ ;ÖZ4hHgܹɣncZnH\sȡ]=7:Ȋ+aÆȦ#4l`BƍꫯsFL.w/3jgl;X&>m^%^kX/"z ^wG~dYuu]'33FjԨ!={Ot7R $:'6(A[Ҽys7'-58i,OJDk4i^%{m{x X3|S AH4uq0*ӟL /P~g!PZ5_bK.ꫯ_~ sKsǖAi:qA]1qi&]wU踺AgQw%3f-:WZiDB WxK:XS,)b#]?_":g'~Ϟ=;DkHuk`w`~^%GxqN8C@&gvoJx^D!w0LHi66OX1R9Jٶ t& BMLXJ%Og}͟~5zz뭦D~7Uz$g[ȷ~+_|kg;vYW .=M9ue}s<@@@BP,nj :kv#! Aذa*?K.jGwV55 `u_3ΐ>PtXS~muh˗GRhM2Ŭ?Lz„ ff (I:MKn-O?/:+DJ]v @PI&s;w495w "_/cǎ5u}\k.b׬Y㼶ؙiB3k"$"uTpB+3h Y˴}M6kH;$R^h 3xbGv?cE'hmJ﻽t8` mۭE U6 [nuxR$g[F?L65mT8yRT2a[W/oysmn/;߲eJ: qmWLZp+t~?ꫯx@fΜ)f}ě"9rl`b۰n6ǹ}~qww:2   $+5ɖ%KDݶmiv|饗L  #:tUWc=&zt"'xݜ4|ܢE iР^Z3`cvtD"dC^C}+(T%k9yd9묳 mmxuY:udv۷q lH}2zh3+ȑ#MviݺuS;FW̟?_l6Ww{Hˑ܁2k֬ {;mӪ\rN=Cg|TFr?.re^q~_w߻iy]: ^1#   [E[fP`ժUrꩧM- xB=jNǡ@@ #믿=\S;#֭KlXcj]PYvhZr̜9ߓO>ihzbM{YJXwM*ifٵooSjm<r f„ %ww}.׻JYI[1l`16g!h8QklM(^nⵘZ${߼ysCʵX,}n{;;O\+9;UV3%#z 9c{n>+vF?O آ3w!}lkڷo/%J0RdIѠTX^:~(^-ʮwqNLYgR[pCx}?(pNgEr5wr_,s^2@@@ &7MR@GqҠ;ӱkF._|%;  _p'1ӆ\ZQFE,[gi<)":v`/4%u./+T Ew饗JjLl?DG,Vu]E[oՔ3묝K83n:ZVPEһwoQmx-x5j$|fqPc;=1*Ud#v&m{F;GVD딠]EU=cm@,\/[i38iYȶ`D^km}Fgut)23T૝;0]߷5eڴi{nTSThE%-h):JTc7c:떞={J Q}_|]& *"(gl:uT[CghM. h@!   @g 5:jX(i52߼/ 䖀DVؾ}lذ!ƍͲvv+C=$7thRw3{.kPGkN1,ABѬtvifK.ڵkW[ݲe,X@^y0l߿qyCoskG;M-},yŹ>w?g8pYA=bŊ_jbhl'xn3ev[2\;v)B;iOh`vvҙSَ;9\ uΥH8y4|56> [Fo㵲VASw{z0/@V9kVLS^ܛYX^' ֤\z4Zڶm[ _zu,: XРDg<4E+S rAU"_| h"sW_|bnxĻ|o4JgeFN:)I9^g;~򑒶A_#5LEʚz/ U N<ι&@@@Ȉ5a~N;QGvT~}1cF& B`Ӝ@:ӂdɒ2zh @lGu;3hh3h`;e{`E-kxK`-O,#jHL_|3b78яӖZ5^;L4ItR]Rl=\eG[۸--F+:35J͛gTtҦsiȑ泦v/E;շo_\O˗w`:Y@ Wktdn.ZL}]k@|l=\jS^=Q/RKQ^'Cnj dktIƄQV-{V{HՠBEbjDz}tuRfM9_ufK`CKnuw WN9OMƍ'~rB:{ЅxQTx{OMĤt֚߿?%/D;~&8: gc#   @8b4 صkd]Q@G_$! @|:t0j({M7'N4 eb۷o QuG1زes͚54h`*V(>h4n:3r (0a 0^ ֖GOFL'RJ)Q;#kuJÆ zq;Æ x:5)~~kfv\vw砻.,G}/ [2#?/{^itfZf={p :3Z,k~m93CDgp4h'H # A쫳MO?knKe@MX3uYt+uu@QV{mKy    C~lr":g팮8M6_:g5,C@PxIAڴic&ڑE/5NBDVыmb+m 𾗫g>{ۭ#k@HFkdҿe˜2cC^N痤{/u p!%    @$oH QudSi]nٲe[K@@@߾}b\{qCf@ʗ/dܱcOkSZXtӰ֭[;, +"H˜Yٟ}b-v+r"   d5}~]d2i$st3eFF  @5`@l @j3ڵ+5T Ų4P @HXST)i֬Yɀ@"_}[]tIB~K@@@@N;%T(]wȶ(@@@*PtiXP ]`˖-?n:     JTRnV ,]Tz);v0۷7N+r   䚀{ƚ{Zi/  5ۊMX n@@@@@ @`M"mKモnݺɦM~vRD!3   ^Xo߾#  pִi&lV"     Gkx֨sk֬ M;v_]J.p   pf'&uΔ %d' 38,     @d@I`Æ fիWϔ)S|1O&@H3wT .;wF=ܹsU(ׇk<q% @Q :+SO=h9!kIݙ9:[JFo!˗Zi/    &ЧYm۶I=/0۹   K@kG`NE@޽[Ӛ-Z^عs|Ji @mڴqr[#G#]vŞ    diR L4I# 8й dN //9֭[e@@ =!үvYkH l۶Mʗ/|A 1 17q .]Ztf  J|}ύxԌ9Qgٻwof#   <kwNsE3gΔ8?p 2lذ d@bLʕ+g[ dC`7'iӦD)  K,qI`C!CȨQRV>#*K bҾ}yryСCe̘1L@@@@@@ w޲gcp%C>h8 @ g:R/@NkP+@ K: %ơ`@@@@@ @XMoOm۶^zɸqĎ.@lԩTV-۪E}@I5kŋwlfImVvؑx  ԯ_߳Q3֤Cc     dRLs~g޽_ޔu'+"v$ۤ@  ѣ=+@@ $~׿&3{" @N ZjIsڂ#    S}m*[n53լ\ҴuoHٲer   @n X[" @~_MEw     A &g5ڴgݻ,ZȴA2uTRJ&"   6&7[O@@ jmڴI8"     i & [ΓYfWnjj׮( @@@B+V,+C%@@\p0cMuډ    5w}+R^{5ӎ *Ȕ)S䨣}h   D &[@@.]Ɍ5      (М qOV.]wqo5C@@@ &?G@ kJ(!-Z\E82an*˗//FR~})UTm>̽*r*UyN>sYlTZU5j$]vC9Om۶M*V(Zrև[/ef>:\Ej֯ARr䓈ڵk'%K;vljҤIszjٹs)SF7ny/^lƍEСC}B~|iIܨSNBݏ?\*U6+@@@@l &uI#F:Bs=gig2!   geߟD 8ph~MGuSќ ?a۪4[oK6l?>+w.njsѢEү_?Yrer}_n=裢yVVM~װtM~'9evu·EW."+p]vl͝;o<\uUʵws12+V[l;󟢯MsΑQF*6S#pٳMu5}349DZ_|Q;,G@@@F9T$I |/6@@@3< @7|#w6.jf QiӦR|yӴ_~E֮]kfрW_}U^{ͮUV4tpi„ 2p@3JN6mژZ>SS 305:ʂ ㎳ ~&FW>^'F_4"VM6ѣZgq&Pl@U<:U/6لiLtoas1ұcG3Ss޼yGzMF$_fyNQ(@@@H57I |KPb\eȐ!I    7EB@He˜nYflxgSNN4+zKt'xu8BFifk Y~+:sΠҹsgs*UGz3 ;e˖5Ak3f̈X3}tSl9^'Egi޽C-"7o6>#4pF}lhl?/r)vSZrGnmfjtf{y@*;#PYz.HAUG@@@@(|@/_.zrFD/Z@@@@ &N B@XtJk |"P^=dԩcj/{^{=3JA9[ҥKs8] v ٙe\=_,] 6#igϖ+Wzv:4K֭qƙ#F(Tj֬)'O3<3"㡀>9Af:k @@@5~>{O?$=z0ӎkSu~q<@@@p КhɮM," HRlʗ/of^T@g_љZ4]z饢338d㏝YfU6{{* z $5jԐ/ k1*UTTT)b@2e7{bňEٶm[PiF.B?~bt" Z{G1nj#\Z4kL*ٱcGuÖ-[DgCڵyl֭[הFݏ    \k{n}ݲM6@ Ԯ];ѩK,vQy@@@_`f*+~=@@XlQ5jX!@t&M{&3f9EI={4wmf >͛7ZRrk5s=1;~T^=Ș>Y,Y"oV\A5uV^/^ld4nr'رcÖϑ'ʧ~jWCw}%F_ zjs_?xְaCiѢ_tB]W^=iݺuClҙ?L:Hʕ?ST iӦ1'St!C4iP 8묳dժUf={ݻהA4ɓ套^_]n* vwvZ޽qN>dУ5k &ȑ##    Pkzbڬy':Zj/Vȯgz#   vD`M򖔀 "7MZe U;v03YXkذaQ3Wh'HӦM+ 0YDe&l=Uׯ_%耇E#[J*hR3ܹdYfQٞAkF4fܹ2s̘j2b>1ҠA_ML}(P_޽{A:T"ߤcǎ&ބÇۛjڴice˖>[~Os@@@,P2mi>l&Mdj^bE3ݲDB@@@yyycV# @-[,:thzM6loFm&eʔx@u5Dʤ3 I4CfFefoY6Vj@9se|>WQT)SW_O?-I 4Pt?lf={t9!fI?'+U&8Bg:!_Zj3>@hjܸt-t 7o^_~EƏou]1t7vQ_|qY    &՗Q_}QSw"WG9c|K S@IDAT*   h"  &~Z?^^uYeJ pEnRܟW1,p &g˖-2k,3S˞={Dg8Sc(),?_hYetv jHEs1h 3fߎxҥK;B'w]4?5Hz믗cǚY`خ]_fsjg ^AV<4io~5sϙ,{_3e  XS@;   [`_ߴNG[L}+&O=vi?E@@@8p)@@ ˗/woٲ*4kLkfCр}GiՏ8S^hXmt3g}uSNC9$wqljmCrAҨQ#իzq:ȿ/2e,ZHڶmvw[?ݨ3S%_~fի?,_vr饗- T4iRJD䞥(R`M5lc7X.:38+,]6ZV!   @P Qt .Fh }   pwcRu,E@ Rԭ[^sҩS'SϾ}w!;vH%/a>6l`fHgغݖt55CuW-駟{ʕ+;_@~Wͺgy\ w2"p7˸qd_DΝ;m:;S^ΫvƓonSZ/_|<œ@@@|.P>Xx:]+RVQ}@@@J$)@M`۶m?VOjժ裏 :;Igxє'{g"O75~e:&zϰaäx&8oX `ZdIY({$[K֭Ͷ>lQFRfͰy]3h&O@@@ Xsu-1g}|嗦nM65_d+W.J@@@@ Nheʔle8:  IΡ&r)ұcG#FDleÆ 6nXhnA4@`r 'Ȓ%K 25o,}l5ӦM3zΒ5n-[8ںuk7;㕓!B۶mEۺo>Yzu\*Ukl{衇dذa&ͬ3޸_zn3+`VX"_Ͷ7|Sl~y9묳dǎq@@@-0>Y:"K.>MGywCͺR!@@@ȼ{ƚҥKgB@z˖-Z :3Π`3_^ 5[gFѿ}GU @E ˧" Xp!J\E,( e[VPUtq;HE$@B⦅=d2L?5gye2]%Kٳg/;]R%׿%{CI-F?ln2A#C ֭[K*Uرcp2eLc`kAŊ.EmhFO`,YmS HOO_~E{cǎr׻fttL87U/0A51}tYbq8X+kYa4pJӮYFf̘!+W"Ef5iٲe'͖* Ҡ ?~zjC@@@ AYVzM"a3@@@p%FlCA@fLZ4i⿉tE<(_&f~'$$ȧ~jڷoKԭ[WWg͚%w)~Ҍ%Y|G[EΝQΟ?o2OyS3nG]vɞ={QFnz<âwEקΜ9#P5RN4@@@"OȻ慲ŋ_5{&E@@@ &t+E@رcEx?<zꙇh_%KJΝۍA,Yi40:K.-:tb    &P<{,OСC#X#   vS2T@@l߾ ."$%%I=J@@@@"Fԅj^y g1̊   !'@ƚd,@BXx,=4TjjW{G'@@@@"IHo&z@@ b8 VFE̾(     9sdرfL| m۶    #noVoAA@Ν;7nlש      ք[y_{5ի     _2W  wv;6lЮSA@@@@@  +m۶Mz-fÇKrrrfg@@@W2քe_  la=      &Pa<ɓ'{rinM&O;fk    (2Jy@@ WG@@@@"WȽ> Di8`kӦ,X@yiA@@@p2D # @vmP/_>`2     -@Ca_?''G  k׮5Q,ZHJ(»b    Ld Z@@ \Fj6۫_~n}!     TӣDQFG}dZ*UJ>sZ=i   x&@Ϝh D`߾}mhРAAo6o,3g,(tG :u}97I[nu~    քe+EϞ=[&L`#)))Ҽy_+@@@@ cMX]N6 A*{n{ed) tR(l@@@@tfbdС~L"ݺuSA@@@|%@_I2  Z`޽Ikl *     "@ƚоΝ;O>iLNNaÆjxA@@@.HKK35cn\\ex  }իWϮS 3͘1#01  Knݺ~IT<Sg i   A+@`M^[ةS{oC^{[(+B@@@8wK|||쉍  & p]Oʕe=!$о}{@@@4H0N ##Cz-VZl) ,h^Bމ @@@<kJ,Is  x!`eUR%/F      +@ƚнv]СC7sVZU/^,|%@@@Hk"i@@NNA@W)[k] Ǔeԩ   ".a8zS`OvFC@@@XS  $     5!{m&G1tQ}]M    gGK*eש  N@X%V;~"     Nք^rrrda3Z:u$55U+@@@\̙3vҥKu*   c, @@@@@ 4 U;V>C3 vŒ@@@p%@`+# 8|xRB H     5!ȑ?Xƌc W_@@@Bٳ1@@V`M}?8#"     քE 7n(&N(ݻẃ   8 cS" >8w>}ڌq@@@@@P &z1ի(#Fl    x&@Ϝh x+p+kl *     &P$vs \pAnv9|9ӱcGywr)    x2ޜ@@  kݮ[No.{쑒%KfCj׮4h'N8=`f̘oXlYVZyZZq7|X/@    5aqĉ>0ŋ;x7@@@@ >}]FT@@%p'PV@[:w,gϞxӧԫW`h pٽ{;ƚSԩc=uYV}k UJNh@+LʹpEw N`_hCjdϞ=^1o~hoQ~'@-n \ D'xs|+WW?Oբ}֭[W7kѶmL7|sfٲe{y#jz饗|'=wƍ駟d?$~U[*r̙3,Uq-[JJ!ywuݜyիj?]4h̙fjq d7/Ħ5TdIi޼m`wWOnSNݻX764s7h7l^f{]7!   @ X7ֲ6wlsZٳgns@@@@ (Vt4cEa  VV,/VYhU ϡCJ?|>W[ʕ+g4 &Ɖxc/ZܲeC-Zf:u2ǭW4rq_kv1LJ{e.4[?nӌBwwo~Z)oƌҡC;wlڴh@3uYM~O>D֯_/](99Y+Ѭ;w ҥ@;բE yosΉpɒ%2h s]5[@@@"Ko$D1b|fzǠ>,A"   -EO   5dm$"4ӄ^{M{_d׾%zgE>|95agM:VHY{AfzZV^m7zA+V^BBˡsV[ sךsMɓ'4J.;7~2eWc['o۷o }Ϟ=eYf7 0k qU|3gΘ 1cƘYѣGE$<7p }hf*}/\P&NjZ#   @ X643믿n]C5jns@@@@ h5%a!  Fef"*UJ/.ƍ3Z_VW>|Yޓ5;v|]?0? ~UXsI42k֬'|le˖&xWVY~hj٣H򗿘V#G3 7Id%w2i$A\E dxA4_K.ΚW`龵hƌ;vȬYީ_9.~Æ ҵkWsH3{&С|&Xu <+xXֹ,9u.kvu @[ߧǏ/a?K.l b9hF }?4ٳg6Z>}xN4h+w`w7Mj6E1B4@L3@@@TO tǏ/^hP#}#   @X_$X"e" @H ߭RbEOHJJR_|!|r,40_f?)_}jիW6࣏>*ӦM3Y(֯_/m۶ͣGާ5_Klllލho>rҥKOy9rD4F&q l6@<+ N+X4p-''3guN5fƍ8RG@@@  w'ӧ=zR2y01[C@@@p(  _5_]we:ަML\sI:tB.jժ2h Yk4TV6mxYy֭+vTPi=Icǎ55`ɒ%tR&^3zh}{Bvw8}9 Bro@"ԩSGɑ &hԳgʁI&C=$:u2{1bO5Z9r\eC\4T$Oo jǏ[~:wlY|>iР鑙i;Q^=qp̚ϩh   !(@`M^[fzW&MMA@@@BEPR@BUPrFIti鯝tu 7`F;vF! d*7/q[9w9tywfwsr=0w\׭[W`wP\uUvמs    YքxGNm;se9999h! ѢY?LӲeKiժuXǓ}Y3ŋ 'f2j(:W1112m43ļyLq,1 sɱ-u@@@/"ᵝͰaLZoU&p   5vX/ ~*˗D+Z;GJDV,YR'۶m3cɂ $:5@bŊnWsFOmVn&(W㔔GҡC5k4n8~~-H֭eƍ2fz5Hfq,!3fƤM6oׯ7فT"sq㺿hSO}oYk8p[ҴiSپ}^d`tm7x9R&M$#F7xﭽ{ʖ-[ff>]!   @ 82ɂgΜi(QBRSS\ryu<    wP\0B@BLo7xAҥK믿.7p 8y_?DEE=#6mf͚lV O'Ð!CL@͊+B.O>i\A|Q*Yr\Q֭3|Ю];Q͛{=?bX`{A3h f-})RL8Q-[&T fҠkFƏ/ HA@@@c4;; >^~T-큨    $ i@@ bN>m7l}Q ߓC_W#G,&k}*Uo#?E8*]tw'6oޜ~9>cv+5k4aUD3خJaZKxًkN?}S;v=Zv%{쑺uJFhѢ.4>\~Xͦuٺu ILL:uHBBC@@@0 &/1E$kzu->/w@@@@ ^BH`  Z4ʔ)cnM}%Ν;XU hp^&M#Ћ׌[8EA@@@ @ff݆=jvwUѴ@@@@ 5zgkww }~@@2Mژ`HII}xSGt    Y?sxNcYQWBA@@@B]XS|P G@R,,*v!^@@@@@Da/3̟?_x 3v\\|駒@@@XSB@O|  @D}&".7@Ϟ=%11ѫڷoU?:!    gؼy 2wҦM9@@@@ Μ9#f քd  .\,<k*`hݺ胂    %^ ݜ>}Zz-]xIJJ C@@@+[n|o6 J --͞      @ XB>''G  {1,5ӦM T@@@@ oSNٍXcSPA@|&`M$g      քЅ0a,ZȬXTKbBh,@@@[ݨbŊv   oXGFA@@@@kB:~7ϚFGG| j ճL@@@@s_~nL`MA@:@@@@@"Q?Ojnj#]v D@@@@ dɿ=@@dee͋)bש      UȐ;S/SFfy     :BBB@@c`MLL6D@@@@@ R +裏ʺu*ի'sΕ _5C@@@p X@@5NY8     _pL>ݬ0..N>)[l!      Ɲ@@@@@"MHm8TcyjM-T@@@@p_쭑Ʀ LQ|͛7̙3}>."Nr|괾h"I[nu~    eKKK>}ȹs(IIIAR   ^X/ŗ  [k|і.]* -0~^#   LLСCe۶m}7/ @@@@P2$$$VX?  eaQ     $@ƚBw5o-7K.-/^Us#   a%_-wy\x,Qle]    _N8aK   SX{ N@@@@@H cM\Aj:t /re    8y=kl *  O-jiש?(w_Lά zL48K2o޼7/… YfF{@@@"kbL:URSSJʗ//))) X"K@@@@"XCƚ3  Dck .۶m+H͛>vl +ϟ1-@@@@ ()˲~zy*dΜ9RFB^#   #p {b2T@@ 8-##çc3X4)..`C ;;[Ν;U||ĸm'/\ 74_@@@ )+wm2bѣG!@@@@pXC`M^ fG@ cM^ÇˤIw BRvm{oku&O&''ԩS##   VaLRR߿߬뮓_|1vr@@@@ 8f\og4@@#XyQ     D5 2e+T ."EH THi@@@@ HX$e  @X -Z_ff]     @$ XSW}2rH3sTT̙3GjԨQ+aJ@@@@ 511?Fp@IDAT17#  ^57eD@@@@@ &̙3r=HFFݻxL   bŊGWyX @||su*     DNU2d۷ڡC?~|Wt    @ X5+WE2@@ J.mv      (@`M3$%%XlYY`)R$+`*@@@@ x4 +U ee  @ ߧJ(avA`M_L     P`k L۶md̙3VZs*    @ Xjԁ5j`  o2eʘ)4#    RpΟ?/w}z!ݻwff @@@@ tN8a/56@@/Xs1ѬA`ݺu}vٳg,YR]vҠA̔~˖-+W]u:vѢE玕+VLիgڴiwc=XjUYDG٫j׮-VPJvv]j۶mEb*,v믿k7w^zmިVI_իWҥK;mA@@@@  UxGd˖-f͛˫Y@@@-nj5քֵc  z֗Ϟ=+999z`Z$''˝zhٳcǎ?u\wus[nJV^-7|7ސaÆ+ӟdժU&c׮]۱u0..δk߾7N[\90`<3RbEkiHS+|>ƌcl$W&Md.;kxʕfl `۷o^1vjϟ?_+p@@@k|%>#nfF)     ?~>PJN@@VD5sĈO@߹sgֿd/MbݻM܁5{h gE9j28;ԩSdQ7o6T:u] 5E߿_~72e̙3G6l uֵ 5СChX~zkY/-2jJ4I3:׬Y#~Ջȑ#5fBfA@@@$@``uXMҴiӤq~@@@@/YjժV  ~2uwA~!oj6m*~$$$\6hV bqW&Nhk=X3q:[?|`iph;w ֭[~f4VȐɓ'SO=%jۙ4pFece7oNըQLPfy7M $'N!C8`_~YUPUt    W^SZ{>}ڴմƃ ʳ @@@@H &R=zj@5Zjg5n4C@@@R?]^xAG-&L    5q @*U:0 \` ﱁ.RJ}vIMMqqqc6n(~OtonuV^ЊV\pA-gVn*bG5_z%4L3>lRJ,)͛7˺u\.H3WOn:utdjܸY lH7|y'&&1{=w8   a,@`.iܸqf"E|hD@@@8zُ~ibŊa76 @ժU%XcSP !bEYՀ,^<#f &l^ n2J-[gz25>񵿫/aäL2aYt6=7nYvv/P{beF|򡀾nFOfzҠHԳgOٿhw}dddq5U>r 6f\n =n3 7`z4F!*!!A.\('Nt5-@@@@ L􃘧z30    ~z'O9==vʎ@@p\VspU fA7niտ֫WO׿G}dHb2WhWPK Ѣ/|U*Wlqݍ4W_yJC3! @@@@~KTK{q@@[E`+ld9shІ}宻J*IœLҤIJ<#RD fʕH X`ycf9tYXـ<qt ~gJJJs_˗| I٥K?6 "ɱw,4ٳgOu ڵܪh܁1'N0sǏb^=r4keٲez   "p'ilsݢwbʌ3zS~"   8z}KA*  >p:5>e $%%/*˗/}Mk?OꫯUV.W py g:uZ(h4Ct(~mGJO<Ԑ|AqX{u<$^"(#裏ʴiLK۶m].ȑ#b]S+3MƎ5J3. 4}<rرCrrrL9scYU/UhƤ7o?    >wN޽{`d@@@@"C˜ժUMK@@+&e_(G!.S >>dL5Z6m$f2k4;СCeڵX41b[d駟e˖ cZjժeeM6ŋڵkKݺun *r+q5XLL<=plذ:Bd 4li*Y}?]hV*gʀcXmveU5'89!@@@3k|pAǎ+֭3#5lP^u    @8֐&r;;E@ߥ5=@ﯠ%G@-dʔ)A#'N͠ei֬_8jԨ!7<&L00 2H\Rr}ᇽГ{>ԪL2ӧOG9 ͡ٳgf-ȑ#eƌgɶm\.HIY%..Ϊ^c{FoֹsLE_(    9ёUtժU&̟?_J(@@@Sk²-@jP… &&B_~v/lAVx 6wzgϊfaѢd±xje? GS:u{1`ԬY>uqXq<ޱM~ 40]233%!!Aի5's@@@BO\3PS[bm'SOg .;u8wlt@*D@@@?= sÇ˾}.;u$zg     @X3z  _=Ğ={:BA ##C:v˗/7.ڨYfnh7o8<ӱ5kfS:tiאkհaälٲZ.![p&MW^r%yW>>>~?Ν;ifV\6=W]u)zG@@@ 'w RtihLLy    O W*UδF@J$Ν} ?N3cZJlV{W~AUѱN:믿z-[ʭ*r~m.^(9o^xAZha+VLƍK>w9}3g\斓csWJ#a&OlntVQm۶YO$O?Yɮ]\g5/^,VXo5d~0m43iOVVeC/ lKKKO@@@@ ;А!C×ڵkϩ    O Ѡn^?;Z#  8ݻa@ h֚wy<-dɒo>;"..N,X Ѯ9QgϞuuTdɒˎ9{"]4KͬYqƹOs 0X5;c;rYJ0_6SJ֭\re\s5.D`ڶm+7t s5s߾}oZ(o4mTo.W6Y:0`!:~7ȑ#eҤI2by7UVA}M?~܌iW    5^\$Jtw/D@@@@ d*WV`  @ ԪUK)".]={Yo h6_]RSSeŊrIX1cHÆ ~ٱcGh*UHF̣}r hi䉕DM8ܹsh6"h@s=g2YY4\}jff˄ \q}=4tȓ;i[4(   #@`M>)eҥWbbQ>9    /b̩q Y@j4FO?c3lO6K9bmQvmGR\Ϋ-HY8<|rn޼9fz=ڷ^q< ǹsϛ 'ժUslF=ȖWҥKV;vX=zڵx֭[-ZI]m۶MΜ9#[n57ԩSGu   5z1sLb>@@@@@ Y(  _ /=zTzweʔ͛Fe`(Yt9ƚ &MCxM3_utD@@@ k% 4/r-    +UWnU  f͚ҥKL6m"&L@~RRRDޔ$ѣ7]    @X~eզ޹kҤI    ;nj5ָ  {-[ڃj`MnT@ 8v!^-@@@@$k(    @ DGچm6y!#YhѢM#   IСC5j԰T@@ GlٲҡC3Ν;e߾}fE@@@@@ X-IIIaqiݺu @@@lY]  Pxz=%K:@@@@@U bkO.k׮5׵qsυ5f_    @P pXSV-p  hBȑ#wɅ $..ΛD --MΜ9 @I@S@@@@ t"2fذarYs ":u +J@@@@0p !cM\T a!Ykf̘!ϟe˖Ib__0,5     8D;#Gŋ^V*'N}I@@@@ {83z  @@QX'E]v[4k,\A @ Ps'ִh"4iRsۉ @+;|#ѣcŊѠA|/~@ΝC' @N :p @ @Jʿ !He2uYqO=c_TuC @ Pk׮M8sժUѽ{x7v @lgC I1bDwb @ @ r矏7M6; @ @@%,XPMrm| @ԔxV @ @ @B(4=ܨ8n6m{) @ @ oΝڶm۬V @A-[Lyǣ,7 @ @b馛bԩ)ݞ{sN3Z @ @`}͛=݉5 3k׎,_$h۶- @8s뮬V @ @ @B( . V^?W\qE^@ @(ye9~V @;vL;vl̜937 @ @ybܸq)E./!@ @.9sdK;&P @rV$>촿sW @ @ @(K3[n%ׯ} @ @֔nt@ vZ4n8}o~Xp׾ @ @ @@>`͵^~a~GǑG  @ @E%fywaV @@-3L\|y$7s @ @ @B(B2mڴ֭[Z*4hSN Q  @ @@ ?FJlZSh< @@ Ѿ}Xrel1o޼l 5\ @ @ P$sbE]$_nH$@ @OĚ:uvmtL(Rm6N>4'|wuWJM @ @$P'֌=:;}INININq @ @@-bQfϞ{  @KfΜ;wkFV"_> @ @ @@ 5y\z饙M7d&P @ @rK`ҥPMUiiin5 @رc7}cС_O @ @ @,5կwI<7 @ @@ $w4] @'pWdM?˗g+ @ @ @@ `Mr믿>5]v|_ @ @@Q ;XĚz%@ H`v>:M-R@D!@ @ @bnXeee{vg.Rl @ @3gN֯k2  @ nHn|\I]  @ @ @D ok^}6lX.6o<:( @ @@ {bG Ν;駟>cɒ%qų} @ @@\|Q^^^{[䮲 @ @RuO)--B 5j&;cq, @ @ @@ `#<_ҷ*ֹ[do @ @8~Ѻu k @T wݴ㪫"C @ @NS_qKrHifϞv裏Ʒ<^ @ @hڴi,[,:v3f(n  @ th߾}|GQRR/r^L @ @(;oφj: C5*' @ q:T)--< @D$?S~~sNY  @ @YhQ <8ŭUVtMyQ @ @@ ;  @8Gi &ĭޚ߁tO @ @E%W5]w],^8} ݻw/7KX @ @@> ;XĚ|~'Ngڵk]wɍ+9' @ @@ ּqw5NQWm @ @9sGXQ( @!{9眓f)++. r A @ @/75W^yeZ*}G;Zn] @ @X5ƊB?'6ۤ5*{16 @ @ @ b7ވ~8lٲe\z9A @ @={v@vZA P͚5_WY . .]} @ @ @(5<ꫣI&h' @ @xwү6m4r˯x/ @O>is΍.(_ @ @D䋁Lhgy&9䐴ǴiӢnݺ9ڭ @ @5kaÆjժѣGOO @@$5ݺu%Kiyׯ_$ @ @ Q OIf~.}j2  @ @ {t&8y @pڶm~{ώg+ @ @ @@. `ónq '䒝^ @ @*);dl׮]V+ @ SO>8 3T @ @ 9;Xz3o1JJJ @ @#`k}) @`c~_G6m%?)6 @ @ @Cof=O>UZ @ @5(`mE-ZĐ!C]ve1eʔN @ @ @99XrGj @ @@ ɿL @HnwK-_<eeeU5 @ @ @@`=Ky䑱{WIX @ @lٳg׭[7nMӄ]  @6OѣG3$}ؔ @ @'/MXrcx훪' @ @l@fbҥѡC5k- @y'`ǒ%K8.  @ @ @rĚPMrPM}ID @G}$ @O w!C_|q  @ @ rj,VZqum* @ @T@rw`M @8K.I\2?XxqAHL @ @9%S5wyg$w0MoѥK  @ @ ;XӮ]_+ @ F ^޽ 崚zo!@To4l0fȐ!q7V&@ @ @"$5/3K/4JJJ @ @!;Dyyy`MaR @jJgϞ1lذ?bĈ5} @ @ @j|wߍQF'xbqJ @(Yfea;t  @߿\SSN9%^ʼs @ @ @@j|[n5k֤ ^pQ^J7 @ @#`k}) @ 4hP㨣{/Z  @ @@,Y$~ߦd5s=7O @޺@IDAT ekL @#p=dqGF{G @ @ {cٲeiɝZhQA @ t!; @@>ԫW/F N<9=}= @ @ @@ qDk֬vżyVZ1}5= @ @jVM6[oɝ] @6Fߎ޽{… e >`l̲^K @ @E.Pc'֌3&I8C5E'> @ P~i:TtZMa @jJ w?7N|衇K.C @ @*Pc5~{Fxd @ @W\;cE# @ٳgݻw'KO4)veƚ @ @9$ЪUX`Al61L+ @&bŊ8cܸqi֭[Nj/;CE @ @AZOyW^z7В @ @\Xti:Tձc\kO? @&РA3fL3Mlgq @ @ P]:Xsf}uYY @ @(\3gf:u  @%fœO>]tI={v'-ZT][Z @ @ Dk-[>`Դi8 L  @ @1cFe5 @bxg]vNSL?<ʪyg @ @ @@> T`Mĉ'XH @ Iҽ;uIz) @ o|cEÆ ӇFr͚5O @ @\kƎ^zV[mU @ @G`ƌYX5 @` |ߌG}44hv'k6bk @ @@ 6,7hРV @ @5;v, @AG>qiڵkM @ @ @@ T`cȑi͛7::2 @ @@ ;XĚ{{4D(jC=4]fzRqg)  @ @ Q5?xJ&@ @(3gfA d  @8#Guw3\#6 @ @ tfYf @ @8*N|ͣe˖ZJ @8ꨣ⡇:u}'5'|r^:rh @ @F*JNIXb[|k׮A @ +VƍڵkcW^y%" @@ =:N8XreJзoxlEn @ @@X3f̘t&߿bN @(zYfC5 DN @@n {1jԨhРAȑ##sq @ @ @@ T`ó  @ @1cFcǎY @ GqD<ѨQ{,>솂ڷ @ @ @dO?~:uֱ>T]V"@ @ 3gf}:&P @O裼Υy @ @j/~WuѲeXxq4k,.\u* @ @@ ldɒ(--w} D P&L>}d5i}z. @ вe7n\~iKa>h!ē @ @ب'|2CL~"@ @(NuO1XSR @ U SO=ַ҈+V}ưa 5\ @ @(*I~\q~ @ @E&P1X[F? @Bhذa5*N:4իcРAq 7RLY @ @ P 5\ @ @(X*7Y@ @ @|kW  @ SओN'|26m_O̙30KE @ @ؠ+W/F۶m G, @ @0XuBN PtP<ѪU43b7|P#E @ @ؠS8P"@ @'7j(~ʿ3  @@nқv9M`o'(t" @ @ @6h&Ro~ @ @VZNSNQRRRd @h۶mKeeeqGm݆ @ @r\`k^y,V޽ZA @ P\f͊իWwi /- @u7o=ۣsY @ P 4|0,GuT,[,{LA @ @#ރ5gώ  kI @ @6mZBA P%%%1x:thԫW/x'c}y @ @M8&ӫWL+ @ @XĚvکF  @|4hP<3ѢEɓ'Gr^{-# @ @F`MѼՂ @ @^Ěڵkǎ;XX @@ ~+dV^`A1bĈHM"@ @ @M+ރ5&MJ;vmc7m @ @l yŧ~nݹsMт=  @@-駟N;-7я~MA4I @ @X{//^2t֭9D"@ @)Sv5 @@zbȐ!qM7Eڵ'92{3gο# @ @ P#5X3qĬ]w5 @ @'0u,t.]ZA @ |{ߋ<6|I'O={ƸqEB @ @&^5&MqbMF @ @km @ =?~|Nj}Q'*X @ @ >5X3}l]f @ @*NUVŧ 1 @ رc+qG ^:?8cժUW @ @ @z `̙3 JJJC뽙 @ @i0;C4lذpIB @5k>h\veَsOp11 @ @Tz ̚5+d T_WV&@ @iyŲetӽj @@. $'@?/K/[⋹ܺ @ @ PYhQ$KXr @ @@ L:5 o&P @`O<1~5,X\s뭷n^H @ @_/Pj%wqǯ_3 @ @ V`ʔ)Y]f @ }7ވ>8]d|'N:6|a$@ @ @/`ܹsEڵk  @ @pbM @Ԍ[nO=T\~QRRnzG^߮&B @ @"`￟i& @ @'PqbM~;w.>  @T@ڵn#FDӦMӝ&O{G<ո  @ @ P|2m6 @ @'0mڴ4tiii4jԨ$&@ Pw\ѥKt%K1W_}uY: @ @ _҃5Xc1$$@ @|{K.Mܵk/{  @N:cj1xӧO,X v @ @[҃5'֔D֭[Mz @ @@ L:5K_q @U.ФI>|x:u;6w>lgA @ @@k.\4k,ׯ_LF @ @#`f % @KbܸqۦoKObڵ5؉ @ @ P8Yxqy慓^ @ @2eJ]f @g}7ߌ;,,kC߀ @ @ P`Ok ;@ @ @z TXSRR;w^W{: @+[O<?Ovrӟ{sm^O @ @`MYYYZ*iѢEQ K @ 5m۶ƍ}F @@$W\qE<ѺutA_}$'ٸ @ @ @*5Xxl%'d  @ @@ |dɒ4w.]. @rM` &D>}֬YW]uUr! ڸ @ @ @*5XbŊl f @ @LڵkV+ @t[mUl @ @*ރ5+W,V+  @ @E-[oe d  @9/РA;bѱ[{qs>  @ @ P]W^k2  @ @ -, @@ s11qt&W^^/c=H/" @ @ @k{Ɖ5_k  @ @Xwf]v)ȌB @(t6mO?կ"9&,֮][ @ @ @*5XS~E+Vj @ @@T $\R @&PRRw7ވݻ,~ߏ8 Ν[`!@ @ @ Tjy qV+ @ @C`ժU1cƌ4N;u)R @(`.]/Z>vu6lX' @ @_R5M6u릯2XT @ @bHjy睋% @ ^ 9n{.JKKӼK.AE߾}{H @ @@q Tj&!b-R)5 #= @ PoV`MF @ P0oL4)N;,ӨQk׮g) @ @ Ph=XG< @ @_#`k| @@lf1dȐ9rdl2M~xd @ @7JlV?(++<@ @ Pk  @ wq1eʔ8/%$$ظ @ @ PHi۶mwj @ @@ T 4i$JKK ? @\`-z(I\ߣo߾qI'ŢE\H| @ @ E҃5ڵ2Ϟ=; @ @-`\q%%%X: @2$T\zz͘1c* @ @y+`&o: @ @jF`ԩvtw޹f6  @9#вe9rdw}ѢE 1rJ|9ӫF @ @ kW  @ @E&0y,BA @N˕ܥE @ PU\k*$|$@ PZ1c~ l>ℑ @ @`[olM7'@ @X?'֬g @(SO=52/ t%~d) @ @ I#ͳx3gNZ? @ @jvb @@rsGy$F’%K3ό:(fϞ]e< @ @T`kvmYd  @ @@ ,\0,Xu] 6` @l@߾}kN?lg}6veWW @ @ @ kĚ$okYC @ P&MVL(E @$мyoO?tO.={k^1 @ @lrs=Ǎ  @ @XwƉ5KE @*oV|;߉Z &D^ʪr;k @ @ @`kf:駟nt @ @]ɓ'g( @|@ƍoGg]6nܹs3+^K @ @YIZ;WZ/Bvk7 @ @8vѥKf @{Z?Fa8c_~w@ @ @ P;-Z{) @ @_`k-#d @ @p&M1XQ( @H͛w/r#]<ԩS :4] @ @ 55l @ @@ ;X.a- @ {Wkq-DӦMV?8cz+ @ @"A5XL2@8 @ @l"y @U-Pv袋b1pl_|1=/%Kd+ @ @ P4X4qI'e$Gr @ @ G`ٲe1w4PrZMIIIᄓ @hժU<3DǎV^7|st)9׷ @ @ 9S~ab! @ @@*0yvuW* @>835J~z;׿H6!@ @ @x6xf-R|I >x$%@ @@lWrb @5%+ӧgN~WgϞq9\S؇ @ @x㎬V @ @5NR @U`~8?E.]k׮;:vc͚5O @ @F |߈;OH,m @ @lɓW'{@A @8蠃bĉ_"6mhѢ8bvc`7"@ @ @6j&+2g @ @ *kڶm͚5 :'@ @ ԩ\rI̘1#N9())Is%mxѷoߘ={vAd @ @DҮ_xxk6 @ @T`ܹdɒtMT) @Hm& /R3[mԨQѥKƐeee  @ @|FԮ];.lk& @ @'u]+J  @ 3{w?>ZJow1}СC̚5k״ @rU`͚51tиk>lԨQ\|qeEӦM @ @@ꊵ#< 4H{lkޝTMPY+6E~Th/J;G{ivm*TZ"ڤD ZHhAɒs:wνsgޙ{ǝ8ξ=b|?E@@@ȿyE?{"  E@@juu*pwڎ;]:߿C=d6l(w%"    @~Җ&CըTX&L`Z V3ppƚMZN2<@O?}5@@x嗭s.~xζ   @XbqcEԮ]gg})    KLo /O>Vn:;M ~4hSs (F@"5}\  @ ̘1#rIdP0  %DJ*6p@ٳp 6bMv=x7;v,!"&    %CtaN|r;/Ss@@@@I@@@X ԩS^|E믭}{;wu<@"˙@@@@@-P(5˗1cXƍ= '`V*z\=    PON;dj*Fwƭ    (om&M6mD0m4k׮uQ6ur&@@@@@h J`h*WlU^ݓ/chq    @1Xb-YĻ#5    QplgUVvI'W_}Y    -B z:7n.Ҕ)S|V\YԸZ@@@@ ̘1#rGD(@@@"۷hFa׏,7e˖v)X 4 @@@@x2}͛7?K|rSl~J*}9/m۶/2G .]dva[@@([Jp/kb@@(J.]ةjO?-Zio?ׯ5k֬*q    -Bk&L` Xl׫O֭mرV^%ښ5klժUH k(  %ФI+_~z}'['5ZOA@@YL2vEygO> 0/^lk6zh/[n1.     @ lq4mƏo{-]Ծ{;蠃|>rhܸqY Pp矂#  ub}1"rϵjm`eVQ0~G@@@r(W]z֭[7:t` yWlԨQv7l{wb%    lXUpn۷Yf˽,6>WuH8kJw gNvwGHRUV6u$bs@@*^{y5h"GVUXd_AM@@@&L_~ulwu믶e9r֥KSN     @ڗRfM}lv]wY*U<<3^ݻ`Û@@@@(15_l'Oڵk{-[fV^l@@@@ :ux$i›zvG&="  %]`mk.\hw#ٴi=SN:,5kVI@@@@(t o_}u!2dk޼M0! @@@@ʔ)cu}$VP$`S@@@@`믿`smYʕU`/zO9:uj c@@@@H@FCoγ;x 稣K.4px@@@@xT}P@@@/g7t;]w;ؿkjڵkGǓ'fO@@@@.om۶"U$>^*Cږ-[M#   HU`M5ks!  G`wn yMx>`{뭷L)     z-תUTi8hРH*+VE]3eʔpD@@@@*{J*n@@ٳ͟?d "[l}#G͛#@@@@@ )! JK/N=Tgg}/0ӱcGSFq ̝;צO~O>Ee[[ݺuN:f[eNz饗"NvqE 2Mf*!=أ@`Xj/bK.N{C=ڷoolMcI/^l?ڵkf͚`sL.Iϙ3f̘a?7|qF/RAM6$U^=۴=@@@@ &Pʥ.?Sˢ1\ڵkL=~ :ьό1"LVlԩVtt?g϶ƍ\ [mݬaÆ֧O~nƮom,ԩ꫑Ls9^BA P2W`ɒ%ֻwo=z_> UTn[o]:ߏ /_nzȓSƐ!CLAlƦB|xyZ=4,;&޽27j(/4# ,׬Y37]   ?7| ϢPF ҅^Hv(f@@@@HNtrg֭[t<^]R^?3^X//Mv\1WW_}&9Wjt+6m2U~w4itIvGشi%>oȺN;UX1*'>?6rOy .Z."kҤ\ϯʼylРAvM73yYgo㎳-[ZzϿ(C,3[ܣ`J:?K}@@DA6cƌDwlWre;"L   l#<4YiLEW-[f7pu]5={tNu"    Pt`M@]|yꪫL8z!/;[+ޠ Fs 'deиtQ$) \ҵkWSdJl5\92)xgv=؟ .ʕ+>D9RՋҥ`gƍޕ=æ^n=d}QA5Gu(HAKg);1I@@- [LTP@@@2C1cx 0F=S\z=2v-3@@@@@ sJg%eo|Ͷh"w͚5#0a|Vn]ۼ,%Ld@ltLjL7j29,X7n92Q$+oͪOf׵'s,,#FIE]/b6 dBA9t:3[n^&pPMNvlDx㍑ڵqmiӦ'|beIg)c;&  P`Me/<@@@4ib/}v[Ŋnڴ,e˖ֶm[{6pI@@@@")PkW`m̟?ߞySbP~gSOk׶;رcM cb;zeO=Tx6?h+W,5Fv Xl]yQWrM7yh0Ӱaèfz?*lذaS^gq&N??C|xfȐ!LիW_~ʔI ve!K-Z$ue[l3fDQf*UDMqQ<n剞#|x6l*To짟~?weӋ}Ϝ9\|r开d _=r Z,abvZS`_e͋l۪Ut*&Y*Tp @@$L`~!  A=S袋L4ova즛n[Md#&@@@@(a%&&x]Vj7p-X>C~8?hߔmA)ȃRgώJE&}ACV[`_4e5%U;XA=<lȐ!fʴԵ6m^Tt_|Ũ@eSpM^%6Яw￑ugd:,wL* 8  Pםw9!b;HhG6B@@RJYlĉ6m4ܹm69[)MǎO?MuwS@@@@DXKmO?mjK/ye˖ 61eWPekJ}iy|CI@*{!W >Q@V*J:^AA8w&r| ѣ /SfGiժU pQ^*K}?ug}v|N3 qvuf6tP[reԲ̄MtT~ ; ξ   $z^6}G@@(Xrȑ6|իmvlٲFmrnFeZʢgF,㏷gy&X    Dք*Vh~^xN=HeUW_}kįl&Ԡ_˖-[>)HEcc$eѢEQwQv`fɒ%LP=~}n^{n,>hyQf{'UV֢E 4hPJ3NVÇ5(~5k,-8Ge (XG^)5ժUzTRd>-[z+*Md$'YIV@@<4h6wuWTH;   @sO=o=#r}\x=oS'nʐqF;_~s2    @&ɄȤkPV3<֯_o|3ƎkK.\֨W *5GFRkS/`=?Y&UV2$rEԩwT\cǾB 9mm_n'tREy2- zmգU/_3gO>^)eiӦMd֜7n\/ľg󙉽ɓ'GJ֮];SƯDKN5(}l:>{sZ6m4>XT~}-  䕱F$2    @f 蹸\uU6bMTo~#[&M}#C[o -[6j3    l krQ/_p ޠfϞm{ڵk#{aذa޲w˞ &nݺ]@g̘٨VZVJ|" ,0eJ2d~`7oh`M2:A͛#I& +3{2(wޱM6yn:{a6(@#Q|_} ۶m{lj IqĉQxF63k֬իW\}7ߘz, =TۼA =\޽nrNg0cr1V   OkA?LG!e7@@@( (E4Y2ռg[zOxk]q^~v&?piРAx6jzm^}l35kִ;V\ux3,;x2@@ "[`<}@@@@vg~DGfK߅{E631dȐ8KE:f6mlѢE9n @@@@ C5TVc#8teE>}M<>Ϣ3rPC2j4n5jUF*MڵM)%2$[{%K؆ ")[6C=)"9%|\O8@ rvy駳e)5o! /M냊ȑ#Ao (OT矨x2eaÆ _wlƚDY>:t0-\T/f2=z5o<:j:l,;dcn@@R SK 0 g   E]@2(:T>4 Z߾}(:,/Yfqo^z)`'tAo[Z}#    *kR$l -[={zG߽F_~7V#lU45֠h eXA8v}wo5'ט鯿:dvm1b3t()^YlYT>cJib])EA}Q.SA-￿izo``> DBt,x?^`pzhg{իW6ϑ뭷޲^x{ィ`zR|Lg)ة{C,D@@nWzpZjEL#  pupW_n=#^F֭[u!;M̓/8_p@@@@ &wqF|6gΜȠe˖-^k8qbjoB ^mt]v%ePgN `+-mމiDn'6K.qwKEOk6SLI<oƍ6n8SeٚE&뮻g v:c@@HÁ5׷^z@@@ SwlFlFEiU]zֽ{wR 2$a5kI'd =z$"    kR1v4˟isε~!< "+kPm)H'vX~}p>eP/CʦeIu  (`HYz)jDS̤ޖ 9e 7fXY,\޽{r(?e^ZÇ[l@O]vϡˣMu`M:ޏ5d tꩬEO>LxG5kY* 2{|g#n.[̙3M=^CJRa+8c@@{~:EvDM<(gy<̇=GϟoVGv. e۷}*R)3w,r)vzY0K- D3eJ衇>KA)js P If p`ͷ~wt~wLܛY;/fiu]gEU𠀯Uz4VըQ nHA@Jk^mw?]Mk:kr5  I ) qv-'3 aI0]np1ݑ`Y0v|IA?54g/"  [M@y);y{][o쭷u]^pWd%- `QHPh}T[Ѥ墷Ac@rPk>NrJ@@@rl0X6m 9]F׽K,#V5 ̤{=F)=ak԰aè WH{|M/c;zsv;ǔK7RُVÅpI'>&UGe? ʕ+gsփpPNSjh9]WDR~wL)XS f̫轠 eRƧzE}) dz-]ob?ԇCym4Q`/%q-Cl`nU?@| OH5|A3D6c"]=#̉>p9ó_"A5:X˖-3c;& Y3?x;YN{mܸq'xqf{:uA+]Q]jWl^LJ@qЬY3G-\+.   "3~9]JsId\IݧJ>L%qfZi0(cK055jAkqx2isw\#*h$VCi:ݔn5NEm\"FoP t0v   :=~4inƎk:vI)hī Y3'oīQkM$WS}T' }!XFẎغ`^ن6)h :-q*2R'#A}GXu"AS T1=XYvw5V-Zإysa…^`eQ[?CeRp@?\ jA0X:{ii_x׈&{uПwAQAxYpoZcBWQUJ$UˬNPÓL{c,D@@ 0uT>}zJ;#mv)ة:6q@4DM#T=bX-ǭ ׇ/+8 *RT^ūPH\CcՉ(N^EZ>-Un]D8<ݐ   EW E>""Wu_w}ntnLdJ~ V .!8s9 R)dNAP rGOޥZpp Ozz5\(h%^Ir֠A~G^DF]y睦l8`62pWZ)T8ۏ^xt~.wL^[k裏 eR)[P0V0TPVczj۷oo:tc9&Ap,  9pk. h?m3])N["AϚzQ{JӲm*+I^ M\rF\Ճ7zA=3gƧ{T=6lO"  O`Ȑ!i)=ԩ=gK[(AT:Q) z Sqذa^A\cތ?n"z?:zm=zФ欳}$}u>hg,l$^]zeRx=XDM4GHg) KQ{\AN@.7|c}7L8xܓz{gk1ٮ];/['pp   P8 ,Px@+24z OOIӖG[* ,Y՛pЫp^G4+G@o#idñ @@XUVyχu[l^zyx`紩.!:u.z H 5@Y@2zo~MCÆy u4!:TχxE_lu Z@@@L(zw}XP/uժ+]t#FxZjeJ魊K5N<IH/zjSu^~r[?VUzv7GB v[Բdg:v>$_oj\=X{nAӬY3າAVI=xD|?"׻Q}3I5еw–ɓ'.wEa,6Vf،'hm(}V PgP& s!Ng)1q2G^Ȕkm8a=ςbKyݕ\pL:Şy@0 XsYutnssLD@Pҥ~Ѝ21-\>;(FIACp(   @Qx'K.)K>SldOGAAG0e[ g2 ?4Vg郂@QPn~F}.DӪQ=IEcQ֛mIhl   @XzS@lƇv$!jI-Zs=׮JWaw͌3bϟ|{H+qmWԖZLQڞyK(&^iӦVY:ߏ:Q3ΈY>#o(ey饗Lxڵk#l_Ƶ<4eɩ챓鞊=].x ݺu1뭷ϟݦ^}Uom/bVZqa>@zEٳ4ܥ7LeP@0H?;![#C~߲n;c%Ik Lqcs0d '2@@e3qoa[ ?T2gmuT)`\ߑ!yNRJ@A`Q7;>W|DA6|u8zמ{, |h[:R[2   @zI/GA نTv(;^믿\ō0;qٵRj0ieotA=|x08vu3l0/ԥ^zraP³:*TwTgt7s좬U W:sn0}F*]vi. S,?owf5 x&ǭ ;C#~xm޽j _ >7 L7@p16}F$fZje i䂑 5"IOOĖa5P~#.mTC3߳oiwYP6͛.dm   5˔)ScǺg Ձ#KTD(( uGTh|TǡP]PrT_=&m5k$Dه   )(+)?*,6?nFԩݏՏ1"۽)3ԩS]/<6`(u3ua˩T5]뺮'uKj׵rp (.Yu ]^qeA=Bt]W_f[Mny}w}֧O\F;伅u->~i{\:|ztIvM7Y˖- 8 EB` sWȯ~Y`Q#?&!i\x",r߸$hd&|ysb7- Ѱ8$@@@$.B{'#u.m2<2Qu 4H@l;|L8}~Z5=@@@ݧį%Ŀ@ (5a_lO@&vٗ_Y]G* i^7ՄBP zmX-/\hHpف>Qz_   P_soUZ6's@/7teՁ# QHŊM@ Pf)eDq}2&T\ߕ^HPvHhW6B@@@ "@`MxSa uJR`M ޵*6lHP- +ʔte٭*ȩ!\#/5׃?iLyG)S}u} 7onFnJ5w~*g4[.o  QC G>![    ?qnA8WyaµtZ[r;c΢ok@wo1#(eAT/aCJt6rA~2VQ@@@I5  -P|y⋭{-bK,7ڃ>h/=֩S̾@`/&O64O#+T0SL˖YA4JAb&vY1)( i>ܟW/ 9P6m>Ub!  @* UB=~(K:Ճ|չqmՁԫ֯ʔS+W\b-d@~}, z)F?ʅ)tTΊy_TcDA7d #  H  Pdʸufgq 8NKک 2vy"sO\( V/xfx?fT3-˩lYf?ָY3NrJWԈD6N6$,7}IiodrfGaF,@@@ f&u j F9eTpDg(g*v)CTwsR# ׁ|M˪UfKQlڶ ܣ   \kJkϝ# Pd*.z;+1cx2j(s @ l7pW ͇^E[C7Vy(UʬaCp6{E f>s֞jm\BH~uDV=S   @nA^$RZVBݗl9YQ:[,PV~Gu$7{hzAmH|   P) 2 @1Y=PӣG[b-YĎ90`ӧ9 P.4{Pvիs l Q#F@T U=^q4L4VV-[u?}ߠD K;ά}{^#  @۬:ɓ͔)3^Q]G&~?Td @ ~p12_ r* wn;Q6_@@@+@`M}m3@J@NCCsiߵͮ}gy(UXp !Y'MkF%9͎8#%@ Xut+ 8cFV͆ f'uי*h`Ү;8"  dڵfETEr* @?l]rڒ @3p9->Tﱹs9C^~_Pz\2fY1  k+}  PUڍ[onvԿ6b7/+nHwƍ3SÒxE ]r5;(1Ib u*W6tifI.뺖.5{)(j0S,'@@(nn~ȇxn]c5k֯ux[ :N:4G^"^SPO?e]׏? ʆs~I'ݖ   P)ʯ׎ QKkw_;3lݺuxЮ}VY) P@_oH 7n~=oH$͚e߆% @ 촓'QJԸDA*6ZvfoC@IDATF6  EW`C|iVfm@ 2d@ժfRu.Ճ7HzCu6R   Ek5# @]+Vؗ_~iw/+@K`rW^1ldsYҲL AƇ#0X16,A@f]7Mb~oswi͚41ܳ(5׌  @XlHU-)cÉ'˕ @"'а+0۰ @FEu#᪫8L)   EGZq  l&L,w- 7n-[6#) fk֘c6|@M?3CK5$Qc]< P+k0`?L]9{ٍ7CVKVVL#@@_l#8:(d」3G m#Q#AKAG#{~_ҩ2S@@@2[U{Q@@)ЬY3/s;K.)7]!E@= {n};d5 @-2+~I A@H(M^fnwa̎?\`{嫱IϞfu fGmܘ)@@(|ϨSߣĉYA5 9H7O>13j  {uf}/RE߫?B{}7{ߊ@@@2I࿟ttI\   :͛ c|Az){Rw P~sfe{O?}Wլ)@'3;L߫p;X2޼_ױdӧٷ"  )p7ծm־٨QYjl j,t@~#y tU.죏̖,1{C5 l6l0{3[Iu@@@ &^@ p~'#Gڵ>}zd @$UA2^kY.u M3:լwoZ3 H^pٸq~/=Km^~9:;XGf   $+, o7Vo7[8(Bs]f?וS@P֯/7S&tyYÆY)W3   JoSsf@@:,K_jvYBH@Vf?>Y6YǞ?D8_o̾@@@ 9# l%˻O6l]  PbV{ UR+g撛ٔ)f_|avfXCAH@2fb6n?]}Yyo^;l޼_g@@@8,^g[˿m&̞m6qY׮f꜂ P*ثL]dVbu>mHA@@(<k Ϛ3! @ֳgOJ6lzv`S@J+_%ljw_Of)=7d{>U6m2{YF   1Psf N17}wNDk+kB1;2 P;x_ӯ[g#f{9T^'C@@J5%E@(7tURcx饗믿.$? Pl֯7>aNY{ hfwaVZ%@")^F4kܿ͛ z2S&2   (;j 2SJ2)8kCz+@` 촓e]C5(FgvR@@@%P&]%Gnv˖-֤Is) ~ǭtsʕ+{jjcs1 w mֻY5̮ެ[7rBtm1^[f0s'̞{_vefeC@HgU쵗r.fn3`ad/ ̆76y΢nlP>۬T . @@(\cR?*N~ԩ㝢uiӦ286 @IfuSs[:j(رcJZjW6v \~;d݌p٥/$M8|7ou 6md{=5\Q}ץ1c͚5K~'mN5t)'oտ}GQ3H\n]^kx m;?PByNO4/^#tREƍ޳.nknv 콾^R" FUX1C["`ܹs n%Yo;fEV d%AWOn,a  @P%}YֽS5>\suYK~{BoO=Wѳ6lڴ~鶓EQ^{5OTlY;S#+WtuXJvlYDMn:3fLmx^6Ҡh:Pğ$'fҬڴ1{qsaY˘B@@(57,GH$m۶_knD5"?]5Hr\p6uM7qV dKi>hvf9W\;_ڞꫯz .@Kڷo=i5L9ꨣrZyP/Z7Ύ?В'˹nsO0ue!r:RX\{l0и^z. AP)H R]k/ĉ]sMu9>{R^%RKOCCdq]/BԦ첋QRfx ;#ZHO>$2_R&\8?KPuvە @@$ (CU.4v[3s]g%Q%շPzXkV:(Cu:Soe˖yqC393gZ-r$uW]u=qIY$i,Yuf Pߕ:@h_Enu/WuՙTUYb @@@ W2e% B @QS;lksyВ P/rYg]{vf>j^YJڔԜx&|-rY;/*`$6l2\y}jS9kL`z jt?#u+˟y・r+Axۻkv:5R@[^z%/(K։P>N*fȐ!֫WTXK HGXps  %T@ ,8l֬,׏ 05kYIZju>Tw2|pk*r I`%t#~%KnK7Q,_wYƹu   X  @QL5c~jrHWn (J@ҽk7*U~odR;{ݻwڴi֭k˗̙*P6vyD.+M"Vf> Xx!|( s1])^>LA P"^:y=j)SL᠚ 1cv͟?{MIA*&L. :I:b7?0OZ!<"2$R^2/%r%i}绎]$f.=\༹}K  P{H5*׵jGr kvj=P/zk9AEnpf醴{chԩS͊+6LvB ?5E%޽cW\a_ zuYt鮹oYǎ#0C]E]elDΝu~VRٴi"Gy7]ƓLJ^S)bwE RpaHf?5{na  dp˼uI\}[7F# TSB@l¥SNެqT2pB{mR1ǔI&yPOwi %]guMM[Z{Vݕ2夓N#F3$"P׺*5/k2Ц#\ՙ3\gJ;@@@ ]֤KgϞFI%趹U2N@6+g6M)׼xizN=R=vw@ %݃v6vr3嗧 *UeF ɭ(^L$LnJ:ݓy^SYIZP=USڷo 5ǏN;-ΖыmիW/͘q~]}NT Kfͼ/᠚N>d뮻\vm g 7V&eQp'W]u^aa2eئMSo]8KI^0鄹 Vf˖\N  lm7sw%2d_/-ί.C_o;uuf^' Wζy 6u M%_+W6AٱkT_3f?`$]v)98   P-iwL@( U]w5һҖ/_^ToFJK0bmf(1T~7|Y/yD6vM41N;]WDZM*6\bЄׅg̘wo %YtG8E;L r*(Sfj@+P^~8}FTfJ)>2(e޼y+qDZ0qw*a τ92S" y~2Sv Q#ZP>[n]d~TMԯ_w"7mv(@KxyB1?CE*uH   @I cMIy >(o.3q  :Ԗ.]^5ݺukk׮]2f@^yѾsmܓɩSz'I?IQ@2R%#2s1^iBJ~kׯ,?h]YR&nK'?VA+bTV~WoM5Ĝ&#fqI+9z V`RnEu $ҏ:gnIOFS~CfQ#w7;zKZerVa\RХ2U?8죏<ߣ  'h3רѣ͔-BL$;md&-oh:@=bxĊfqc?7;I\հĉf5j@@( ֔W94и_~i>GX+fZў5/wu}uhS=Xu^Ί%gըS\[ JKJR)WիWϾ;Ոaܹq{oWu 6 Z:ur% |E!x=\o+On(*Fe˖ fstAQ>Ô T(V(_}$f̙ ='xVuʊF2g\GMj.^  /EO6{e3sGGkF(soJޙTa5dV2%$BdLfE*cRHɐd(("<ː!<2[9{ν{νgxo=Zg>α͕3/@,~F&a3g=[I+ӻs *HHHHHH n$@$@$@$J"MK*gJs}.IHhZT1x WPTVzx;ϟVEf3d-S…"){N$@$@$@$@$@@Sp   mU˦Md޽YHΗ҉L&9scȈ@YV-;w> wH^cǎrwњoUy뭷|jAӯ_?V믿QtҒ oح*:o<]Ko#Ou# '.1r}Ϟ=.zA|mə3g\pAҧO^|7nܸ!w9aM>ӺJQT)YnԨQå܈?I,ǒ]FD|2mL    4<izV恛1}j>AEb scDAR ,8ֺ[8|~ O̡y&'DiPT`] @d&2>GHHH rʥ5/_SN)mzl')O' YU9d)R$`MGtCG%J\" *-^`W\Y*U$$V\)(Z5ׯW_}˶ c 6Hɒ%=UJTP!< 7.Ɛ}ϟwib_.9h+PRCWƍ]=YX1Ƕ`~{VBK1gT\9o]~? QDJvQ =gCN$@$@$@$@A p / `5ϪAP5|sP$<,.gZks v_\yz ?Tqc HHHHHH<Hy7 @tș3cGusHH i ̚%`ՇE>iNW/X|pn̲b y7䡇lٲIfT&iJtSd?!בdݎKXlrFyAv]ԩx…{т;w+1HmqӐ 7.׺bTRz kpbK.={TE۷,5p{.m3'O.z~'ټyT]H~(]i%#E+"~ܖ!    W S2xΟq&nFF0gq >p}1_b2 ?+k ϴiM      DQ $@ƌ-;wα  #pȼyKQ#WΗ/̟?_E%$QӘ?. 4]05EyרQ#裏<  ,5DE 1}^h`dNN8rk>Tv_βuo[C֭_ d@J./%؟iVd~Aw}W+JPBiRd8gOfy1e-    X֑[Us7TygZy ymy;s p?-*Ro 6#v dC$@$@$@$@$@$5p_XXjlٲEv)2d\rI `ǵ{n9vc;/ܻw(p3gNzQyM$D[~Dfr=3ݩcA؉q_^V^-8Wcڕ+WԤZYr\bE5SZҦMy%yAywJ޼y!СCڑ[ne:Ƕ˗/=O<1r]BSlg!ێ]v)G剣 ]'~߃)|.! u\ID{ڵ@6ͶHHI` +N4-a+&(o{ؒ%Kvi?:w?77h ɚ5>O|s@j\ k|T\*FBz$ ϓ{]_/gFX~iDd:x~ѣtE73i${ -p-NNaMȲ%    wRc1$|[}.}}r7F ڟi9߭_W !{ 5 $     wָv8Q.\q p?~T\!CO>qmc ",]TWpC9ٲe* o[h-iӦz… Kǎ' :D#p{0~Cп_ȧX ѧO= -GݰbAiQY iɜZ;M$@$@$@$gd q$EϑYl#В@4?r{/i IQ."     h <1F>6mhQMbŴ@B8 >\ طo[1v2sљ[)Y: s|KGH޿Sgf~[a}ՎcpJBfkjU t搆 ztnݴo6lؠσ˔)#W^Վwvu {|f믿WsǀM\fIXuq8O_>ĸ<"^A4ѣzw?dl@@{cxG# HzJס ~R%}"9el-.BdI}>~ΞfժU4 6r$~]/y?E$@$@$@$@$(9G %K,c%[l1Ƌ0I q 9sȦ;^bTXTΔ)StS+WiӦ%"˸q~DbF&wC\~.VX!7oM }رzΦ&4b鍛?s 2#U޼ycTDDΟ?vw\׻woV*T9{؊H yQX @$@$J.-s5\jZڟ!_`s]+ ȡ,XХ9dly K;Zy:w>c@lD#     p%`ȼy\+p+ D3-@wE?Z<HHHHHH X( Yh6n2$NZw/7jHgrAcz@4 :T E >СqiD- 22f(ne2u@\1}tGجYtaahN>-#N )SZ-8at;_[&F}ކ|i׮'l"SN AlUN4h8q4mT[7hE̙3K5dqdVx!C BCy.+'D7%K% @P)-ߟKC 8M&ID= 㽍J(8l4,MXP.f܁X5k,ͽH]Gy9AXZ;fh걏F$@$@$@$@IFLI?d] ۃf` ^X*:ϴsFw: i9HHHHHH PXyiԍ(}1$G{8oذ! e۶m(น@3gԭ`Sv.i&}bŊa J*z^Yx)_fMZv:{Kdhs^B]X3aT.Fm1bKk}ǤvZ4ճgO[z0͛;sŕ@ڴiwy`[GXoZ0sp8p F+/^Y xjdXڶmpB[6˗/K/|7{6O=u# @e,k֬fK  $$pŕNBeNLŽDѥ\"{uH"P^~'Y~ٌsi͘zF`!5l,*$KL(̞=uM`΋xnGc#GԙS6'p효DD=ſ-I$@$@$@$@ %`@*Fmڴ0k4\&h|Hoh_O˿3[Z`m     Dѣ,\&A>\-Z™z+vɢK. iϾc2Vc-#X<ԃ  3u F7|0իW51[u1"#UV9@0c46Ӷ5mb9bu̟?_?W݈֭[7Yd@utʛoE^ gРA7r_~Y>j \rXOAܓ=hҤIub={ȷ~+e˖Q; ~dH>kr8 D׮]ݒ%K+:k2"r$@$>/Ԫ%l5k:Ԩ>O"‘~i-vϼ.^ݿ+cuԑ|lƹDdRL)˗u] iz뭷t'<&,*C Y q oÙ1g}'O>ϟ?/ ԛ|dE0cxӌ3.g8v&JR| ,E^Z}T=zĤ @PP!K=l.*\v).lxwyG ^s"f?W^gÆ 2~xXב94]=(PmE?]acӦM.5s)HY "ڞi9h_\~уٳqCM D  k"@}Y7LpB &#k5Y0[u.ڰSsM޽{w*!ʕTo,PQy`n" |ь7L%쑯 7w}@<:Ȉx9rӧ+WDa>t萾k\uo3߯_?ѐǥgXkNFgv'9OgݻWFF N㧩^ËdсѣGr`po^~33gM\poŸ1!?:H›@[3Mx,z=NZ9dCF@|ٮuwi+8z|嗂]ڔ)S˒%8qŸSb۬Y3yP#=U)=w.#ӫ lZj:HƪU\;V;8')>S|Gmڴ#g0Mm*͡\dKQِi+ @^McJ "׋/(vL/Ǎ'(xWg| \~lݺU[3Y"XD\A<צM4~ }ik:\#w{NYt$i9h_<h'JGH#     @X -wҤIraݧ(Q|y5itZm۶'cǎ9ڀ$fo>#dA)SLA܀<0#,Qv w 򵻃CL~d̘ёNWpa5|eMkε/\:\Nz#=E޲i3+cYC'3/wJaȬd^|gb,γ$F# hԬX!'ӷP 2<ە+WtVdC$@x1߷m|ϳg6}2b wK@'Of8|E7vQ >drrrm􆺐`j AƌA2_`F$@$@$@$@!Ag5 VyD¥o">#s/2nܸ1ݥ\'@=r$aL/ lVJXUli{]!     wAD(Y  a$6;^}UҴiӴc~Bڶ _삘L(0~ysCud"q4:uJ,Y_<"f/0[vX3u-DSX0?`wO͛W $F&ϪUzr$S4/L\t`CRrQn4      X9 D>L{zHQx :_|ҬY3~:d@ kڂ4du8tS1#*PaL;v7CN:9C,`-DIrիeϞ=&!ut+#ЫW/΍`ѣ^mGz YfW)p Ƃ(F$@$Z4H`^CBQCdyuAm۶i; 4x2W\_VZAl 4 XL= lg\!saJ2|p;wݻWf@3gN-};'L (14Q _?y |TdO u:+g ΁%[r5ƍEU.2xp( EP$F!J";D!l5l Æ 3}^o֋ ;ֹsg-uk۶̙3c:o<9:#o(5jX4iWΝ;8߈e~rʎcfhL]THuJ@ @|CDÇ{l [~}:;72x*3ucTԇ{-:h0d2y?5 [HtX4rl' H/ȁf&z^HHHH nEd4OL4  Fe+M Qgu* 3~     p%6< (f!ի˗ep{q9n6T}Iq -iҤx̾O>O?=CtA 85J,Y" YnVye2bEοz@pyfDdӎ;Jɒ%`#TR6Bdfu֕ݻWUYb2۠ƌ<L]'hx?ݻq)VlڴIy]7s̺.v4}nٲ6ⳳy2zhyEZSpa93JePqŸp}1$ *xԪ%J|kEnVrΕ+tɞ@87n\к[~}K"NXȚvvI!^HHHH|$s`c>KhWl\) ΁F8uJD8U﹭-obr8$@$@$@$@$@$+[Mdb|'dϞ]5NwvD 4i$Oc ɊYXlС+R:T\9y衇D+$c:uAٲe%E*%:K4a`ovdgcK\UNx3 C ̤ >,YDCVWF$@$@* .8E52(A$@$@$@$vmQzsٺUT@0Q,n(0 @|?ˆjkx f$@$@$@$@$@O "~` sH޼y ㋻ALw,nܸ~8QϜ9!gD;Jƌv˺uҥKZ0ެYF_&}:&w'y"?WMN<gJ,)ٲeKz{-[pwuϟ_^.3WEv={]STLH` Yc-[c=$ MxxUÝk@(V;F$@ ꫯ N UYBmݦ[gL 'm3d UVҥy~_'D=,*,}ZҠ",iF`c$ }*a &RHv"gϊʖhe$9RE{HIM௿J.$۶YěoZBdr 6B$@$@$@$@IF MyR%E\?^E>Dn$/LaCs aQq>]cGdr! ğ5g3I LVyQc>ԯ_?> XFX#<HH o*V 5cɖH J.-(4  ou#TX'x"   !p="**ۣH"w @b3"pDF2#IJkW;%E5Z$@$@$@$@D>+}7}zwnRpa?R  WW+RO;3f ҿw)q-      kE ~ꩧ¦( ReeKHءC"ݺuH~"J# .|ȽZ7l"H6"۶Y,YB $%E~rFFG̉ FG|,6O[HH 4󏕉&o^D0 KFKk7Ep:ʟ$@$@$@$@$@$@&@aM=   '0!%S!6meIHN S&ADy58N}H"VYHH i-+"s[#؆!# 5[|Mh$@$@$@$@$@1 !2j%A^8fds" V_ $Eܧȑ#V/Ҧy%KP"ٳ'ExM     >Dg @TXdn[+^ʕ+yp$@$mfoEq5/%^k Dʖ;Vh$@$@'pO?ԭ+R"&vt"/h9BP4     @@V^Dn:cƈ-9rID\=  H8˗yUEJSvwo{EFə3c $@$@$@$@$@$@wVI$@$@$SkάrI$@$eo_lƍ)V `Dm[ Eyk$@$@!Ȭ=zu㏋̚{ d;p@䣏DYF$@$@$@$@$?oz|m,Z$Ң A8qHH pVA1w s-! @f @"&r$@$@$@IG {dΜY4itIHB@"='yDoI"ȎP=Ȯ]!mvH–H2VdaDu['OٷOOF$@$@$@$@$3 E~X$Y2S6[l 9|8e$@$'R"cIw ;D^zI$C(š @&>vHHH qL0A.]/֪U+I&M\W!  5k\ tv{^E PAvC# F>\GDSkWkeneٲE|)rt @ A+c".;͛Ez2K֨!;<5  ;+o>~: ԭkS'Z%1qVЦbE}lH…_9@ɈhLwzuko7G$     Uք'ڌ4 "pIA@>|AN\!  _d(ҺUN{Kdtr3ր['H" X Ӧ*C$@Eu+WLn9ē.|F~/D'?2#FXkI, 4Ⱦ$@$@$@$@$@A"9HV9tHo95k y|2HȦ~}ʕ A% $#pŚ\9EzJ$g$./L$@$@$@$@$@$Oq%!C[]wrH $G؛"E ^<̀ m׮]2m4V.)fHHH fyD ԩ" d =*i҈T*ʩ\NyaF$@!@`>ٳEfμ&sg^YIJuT.\8"[^V%/pfwHHHHH Q tyc`aNĵBQfMH]^HJ`v~ ~/\ټz-E?.ҨH޼1p @x&<>yB D#+ʙ3gq3 x$0bOSK/-w uЈlN6ȬY/̙cs yAdAv "˗˼y+d͚eQٿ\ 4'Ukl ^z,GyHHHHH 1'ҽU`d\+W?oes@FAZ9l٬I$@H1 k*w^"v!iPv&Z $So$ jʕъ"jṃfŋ̶mVx G ujڵ2|8%svA7WH*"+[P!8HH YLdR844%?P)USe*kxVZ^W#    𙀊g% X'!YD%/eu-y8HH Xv>0Oo'pjUG4 D6d)!rt !o>ɛ7nYf2iҤUPAVZc?w $.ɓˍ7E**ƤE4gnСCgϞzה)SqQ~I˗/Sk?b EÊ:w"/{g"p.2eDB#  \&*%1bk -K< ݮL\eĈ!rɊ*OM6%x     @@F_{`YmJ9lj9\@JA K9`D.j"\_V-T$*<@$@$@$@$@$@$&?YM# '|E5ߴiSj|z$@$@A%R=,J߾/v`h% mN>*X"E+'R,^\/i$@$` ҕk5P5K})QŠZH"2~AҼySygU[Dի'Ux      `((o%r51"k׊ GE~*؇<@0' 4 0{g07}1u_Yi .IHHHHH : PX{PF,Y2߿Pf$@ ;V>*yڵ#g~# N/+{O7Qzp.VIHH ҤqFBDSW^-dd?8/x1~q`DsEQIՉk$w"h]i;rLN֊Ɗp /c)DȄF$wak y bZf0/B#      CK&ge A$xfΜy$ƕp d9vʚ4i"Ŋ n$@$@$ R(m.*D\_2PXa%p,1N&X"M,$@H"6Y"#iqY#+.lW)>}?.=@ɪU, @RHN2Q`Xޚ0s ۶Ys#V yQ!3^@dcA}m$@HC0EΝռhJ(pakBkK#      o(FIHH–ՄGǎ x >ҮU J!|3W_9a9Ĕ"ERlk$@A`@T/Y-t"&ºzo +=rH۷aӨt\FRNv5I6ZE$@$@$@$@$)(:Yc==s9:bSbz֨Q#)QDX$  _ O/$D'O['vscGL|$tCw ɓGBf !H xNٺј%Iv@˭|Ix Ò'O./dsԹ#ceEF 3@#p^k$@ p5b?~76FJ]'][`lIeҭ-9rM $5 IHHBdN߱  dppw49^?E֯wfAdzg]IȾ}V;Xɽ( ?̔ɵn x&ȫvYތɱc:DW.^*ЏCH4Im哹sرcgϞrahW^ŋ2p@I:@dMŊ @@zbF?V s %*a-Ἇ2_~q=#ρ`$cF׺"L9~϶ow9u9"2xc$kt|yYtܸq]U9Ӥ_i2~|~رmV/1HHHHHHIšxi$@$@$@I`Ĉl57?4;^ @"ȐAJ/dF8%KZ:|W̙-DK޼"rH~I 2 @޽Vh~Nf,RFD%~B}vj>}wV޶m̟?_P$ݴ+WȂ t0`MVxB-bsI$@$@$@$@$n]V-BDL0s pWlKZ`@[;E F@WGXr9~? QSDcA0Lj,ۖ)!]ѯ_?y'^Ё8n L@ @d8r2D&F@b   oٳgug}Y)TPxt$   g|Rk ADt5l#'~qCƛL8 k"YأSzkI Q+ڪq  2(jsOsN-vK/ɓxcԇ`N1(ʛdf/|nŋs l`QZ5.pI }{,.HHHHH2 aC}'CSq'aiw)O?.8af%7Ν;'3f(^5BK#    zxCQ 0cqzٿ{j0o֮ѬcGVρ@XtQ{ ss8| Aekͪڒ*UU%4I'x 7s"F=j3aPr ɗC }w]+t7?֥jժz^I&J3E#      7ָfd_b5s b*1/k .Ⱥudj봾~ټy}*q&zz18}lڴIEօf !+"ϧG[AˏٯX תߕ+W /bŊRtiI6m,g9 B(C漘usC*T~5 ϰlٲnG=o˗UJ\{-_s0نpd\lKyl2K|=ʛ{!pVqs=.I}pʺux$@$@$@#G|]/񸥾'Q,Uٵk!8Fh)9HQg 7>>ƘpT:Y ឱgVº݉D=~ =Z{1XW^?*Jr3!#cN"yG ,̑tA zlo<-[s… uoޣRaɈmr D4HHHHH@@tρÇU#UZ\$Wu=E$s}yn9i`_lsfNs ͨ'է7ג'ϬW*RCRps S8-w HW_}%cƌ5R!{ 5DF$@$@$@$@$@$@* ",2d9| iٲ?z,z/܇6a5bG @0O`dڌ{ QջU@\Sj{]V2SYD-I]a_|QE,6>j ~ ( HHHHHH : 9:?cT^m>}Τ4pdHm6Ob׭[7-_|Ck&ML`ƓN% C@Z߾}} ȱ @%c2\TxUյkWiذ˘mAT60YN2ڴi*_z\1f? S ||v|BbAP YaͫÕ2_!6^H p!p5a$@$@$@IKNq p,ǎ-qtV(p6Q~tu} C EoM\DɅX̺6IPXB z;rHy'u^L5v2A0' ^]X4Ydus/;|PЦx*JA>|I>CYno@=E 98     H2tUH2pb"|qƀ^wN?8ʖ-R0gW鹏l7蟻zWF5ˤ޶8{Jcε g0 &v;ƅ5C!#<' &f)# jڈfpiJi֭Xբݣ 2gh'C5j$_ UD >3>d=."il٢F5ix\pZh Lׯ|%KD/F 8qB:v쨛F!@ e%J>}]$>w\c(TwqfO] ,Djp֠A`F$@$@$}=,L:UGR܀▴ߦbԇh%h3qOU*Yv: |4pvȦ}3K9`fi_7C@/c[g<,Ǐи#*@9'xBImSZtA_Hs6Ⱦl0̳` snWk֬xʪO     &w'n榵o^C`%Іy W]<u3܇9f9}`)p>NY;ww/1xW$' <#x}% 8Q9ի1p      kE|o93&֭[W Utw~&Lg{̙4\?[l~5XŊ0dDAQ;62 2=p2ؐYi |Si3 k&L ]t}ѣ^7O+^tӟ9s|.zj1͛\H6hQ|@%KV!=~xU1;e/Mb /\P/^S|(vF8k׮7_aM /`[b֓W: @b{G9.h`fpP_u1kGtiM@Ը$@IDAT(S#GA2 ژ`?9s+L;~     Nxf9aܸqy %@t:uꤟ[i|{'Nm.\XC/C5oyQݫ` R8)J3<21_m      4p/ x"Gz,ŖD⭘65H _3|Gl]Uz3lj=gLbc{g!! R G`޸ÈdhWZ~LOc3mz]&#Fp,믿RH M^ ܦ}YF~+ێvMj  BA Yftfݻwi@z<" jp]8h"C"B{`y)sgL~)P@]W"  Hr;E5ݡ(ٳy\'};@p|Ν;uTȒ%8 _Z[9s]9!A$@$@$@$@$qXb.zJ-DF  D"w}w@ݺu~ڰaCɜ90`,]TebV0O7l09x4v!/ [+1.IHHHHH"59r^\pAgؾ},#ȑ#ZҲeKS1|Rk̂ @c+]YQ~?,! ") Hw7HJ ]-!-tt=;]z-wܙyews&wΡetV.}e4eڦ|k(Q^m-/]^g-,&Zh/^,#G?L@Ҭ} bh   }ziӦ 5 Au]! g:7Mi4W^&F+xzӊ4zX"ECJ6Æ 3 ʗ/oEY@@@hk<4ۧNZyB'Y^xYW: e_1/.A*7o^}ɨlfX֖9sf3~}֠M`9sػhE 7[D >4{NѦKf-k`޽{ 5L\Lz%k:g:d*~ލ/hݺHAdzauM+ߪP khӛ /kV@V$]8Fn4MojO*9C  lV2d%- @ӧ &46kj֬i-^"NDQ뵌 6s0I?j=zn+~?*8^B0@@i71cF;v<(UVױf߾}uxV+xKK5k֘ 64 u|:bѢE?~3oaso:@@@|R9))|AΝ;_Fm6kE ׬Eٳ_2:}Ԫ7ZEGŬ,kVѦ5jd_eBM͵ Qv7 @\%5tSj@M5K{/=zk7NԩݼtW@XՑ2~]~sJzsK[ҤIhѢpd6*  g<|k0M(M+asxIC;v_UV^jwIJ9ҥMѣ [nrʙ|zRnp(@@@' PƉ~)Ż`5|lٲErBej'[_hh6쮓+!k^3ZDO V r+ >ڦX.ZQH#%J>ֶȑ#U{4#;&@5ڶo.Z2]'los^_/h߾ _d߾}/-VDJ_dmZ' `fMfJ&L0_'NkҤI?_w4 8pLARz /0ҥ =EZjyJ'8P@=-[TW>v A5f4Nܩ\IZI&tbs=zW@@@^&ٿ?A5n>RW^rֵ5jHŊ4f̘s&T 2cք: 4dɒ]ѹ4@@@ s+zlKʗ//}ݻWzNB[wI ]I#pʛ%M4&VlذAtVClQFfX@_-ZVxX36-p@7{m۶LӉqƍͶ={mY5RZD'k`nZ&8qb&0ǽwٮ˚7puw1O۵k''NxWPqe ʦMzdL2eJǞ! h`~6>3iرce̘1Q1c1`UVu;o:H$x3{lsf&V>j4]D?S&Iɒ%50{@@@&߿MaÆ56z?4ywg =ӧc ܉ޥc ibRLrXR+ZM3j _ŋM<"  c?-@o hŔQF$,ᨦ4P@kX֮]kg9تZ޶Y5ϟKm־֎˗/7eiJLkiKXͪ0c=e4xFh4닖I u:N'hFm־k1xt@Np˚^djP6kߗm[2z#E:VKkӀ;~! w ̝;T׌ׯƍ{5ـUqhѢ8!GN#C4A&;zHZJ lƌTD+V6mڈ&oT 6y9c @@^+pI)PtU?~lϜ9١C}m@ġs΁־Ӊ'w}:AZKtРAMFD@@@W}o虃)":aI[nD3;URJ'1k+ u+#;wZF9s4w@os J3:./8:,i&5O<&3NK(k6k_kXr^<:N@-Yv[`zeffcMv|ײs4E~OP\! w ߋZN?sY=oz󀧍~lUsW!>|x)V|o>B+_ieDx^L+W6s%=z͛7ە?'   0KLd˖-!C46z_5]t;BzO(Q} ,M*4ZJÇe„ &)l۶+ @@@o QNҦe@ w|˕m۶#J,:eM'i'|":IB'kȑ#G$TPfDP-ZHhL`ðap3knܹsǬ_Y/ivUm_|蘃PGnn߾m+aҥf|ֲZ{^s2q vP JZ>;p;q}c7>?7/WUychܼ֬yN:gW# ҥKˀ.g A{-iʔ)M2¾}JС' h׬Y$FudɒСC?Pƍ'OqgE.X/M 덖 @@p5\&AS[޽\v_<XbN6|p:Y%k֬ҊֲhemVf`g(QH֭͡ϝ:uKJs O*U*;;tӦM={V`Ƥeͭ?PF'zidmjrJ{7+X 2ڬ}u}ϫǠ9^@?J,ibbP\rv&MaÆ"cɥF]VϟdՉJM(pTsmo.0gYxyAܸqs:D@4рfv5ȑ#eҤIvG:qnܸai"xP7@4iM6:ъ۷V;z=G?K/R45/ x  {e}5FMZ0 , f'6ާ[H"!3Ƀt.&jM0=^M"TT)ɐ!hB'OX@@@kǝgϞ yרQ^fQnժY?d (VpO_4@U\/8u]:vhN1x`gYurCnZ8QD&)uԒ3gN3)R#zqhԩ^fUѬn=|`V[''PM3T[s}4jkcycxˎ"DH4,+WU{ƍ&Lczޫٕv%T@eLϭ߿I$ov|j+W^^s}gY@K6/ʁcǖ5kH˖-ݫ؛3gگ n haJѢEdUbLb*TM2eʘXfРAAV:@@@@DiAM1=R L#F Њ\wpFdĉRzV$N2LzjԮ][tѣÇ&@@@\,@`9] h iӚjͻN'1h`Ǐe֭f?#QF͛Xcف5~~~fٳMVѠ˗˙3gDQtrV "͛M0gǎfϟ?75UtrLYUk챕EKk6jX6Y}kG h ip~_7oh{V3};[d$Yj֬)*Ur9^:իfKŊB A*@d,ѫW/3ŪRݽ{Tбhr"Exð@N:2c |ل ,(zjz-KX|&&5Isε+mY  h w5yd|ޒ'd h"W% TgJڰaCA?w^-#ի'M2̭`[haj[xD@@p@&řtҙ0o{ݻٳg-[6/  ?˗ϜMhiiOn׮]3Ys{-cƌ8ӮƦ믿ȑ#$f .;뼯;nPhթ:U ,mѢEvcƌ)68 A h MZ̍dk梕2z4VSF 3f͚26Ɓ)ׂ֯_/WUVU-,hB )9r%J/i  &*֭ :k?4),Qc>OG1tРO?~,4Es7L zcJi@@{}ٲeMJ'o8P40ۚXZj" @ _N:%+V+WMhefoL-06ŋsQ@@o8pI VJSN5u<"~RfK.R@4h`^r$̫[1``,YD'{ŋGt钴kξ^ڼys4@@@ X<[̙#.~Rtwy)A\.вeKsXO4s= @G@'nkV=ztYhѢ3"> VeI(BH}Ȃ Lu, Xԩ GʢEީ5xeƌѢE1cxB# ܹ1/I.UoǏUoHn @ F)b "Νl֮]+n2 w6_QH*h/^`?'E@@O:u꘠sx3fӧk:&T,y M6MB`SXLҴjJ_9s|ҦMϋZڛ O^Νk|kٳuk׮I׮]E?nX}T   q%GBZ!a„tJC]ŋҴiSF Y@@4h@f͚e|7#Ed`5CCӑ˷~Nq6 ?f*<ڴLNXVXa[R%sSN?@@gϞ/LֽtuϞ={^]$I3 u&˕؂x˗$) YzhݠZ̘1x&F51 @@wz4nX-Zdw-YdJu^,0fi֬=¼yMdSnX9;v(!C|!ɓ'&HɪEYZh!ڵvnB@@Fzh رc^! lڴIef^ңGwnΜ9&FV 46qJڵEs?e֭dɒ%x }j֬)ܹsf;޽{]l  g hx ԯ__o'[]iӦRbEsb$F_ uڶm+v2LuݣGK.R@ HB&N(Ǐ7V,5p@0W/j    Xnn @(p I:I x?(E+WA|ᇲm6)[-z>{l{okl @Kt .~XQFG3@,5R+ԫWO͛'7o޴c@@Wܿ_Zl)}\xќ2vزxb3]E &`oV4m[ڴie&ƪR2e$Ǐñ&M*P6o\† kܽ{W "ZeKl @@@y;/F@ <}d8 4 V%| ,527w?~lN]xqٱcIƕ] s_sNs~ܠAE4@ŋg脞7JN$}4)Srʢ ,(:qȑ#   ػwd͚U~%KLR{, H@$]V5kh˛? :O~7I2y;wLŕҥK˥K`@ q2j(9uꔴjJ‡ok$O\wNj8k@@'0}tɐ!5W.]D2@%K?$N;qDɘ1hǏ/??~|~ 4}UF%=z*@@@7! ZӦ痮]sw Dӧ@:uf Ȯ]$s/yw_r=XF8X eʔҺukYv3|[ĉ>={Ji &4/^Lc[@@KƍRJUfuddÆ ү_? :+ 1cʂ d9rdsFMT wn'sAW|L0A9"5j԰_xQKI:hgϼր!  o+@`ۊ? ^(3g9Neƌ&3{  K]&ŋ>ofdرc|m`MJ|mpNPlu%پ}d8pS'irIXD2zh9{@@FK4_̛7&۷Ν[;% ah 9x|"DӡfʔI-[   /s7 pC3gHҤIMϪV*fz9r䐝;wiҤya;+@G3^lԶyfff7s;]*{C :U|7ϒ%ܽ{ED) xތ-[MXma„QF5ĉeNCp dfVw^'IBeʔ?\f*$ wf%  <|Pt"ÇkJD1dرRbE'AALUǏ!EA&9N`޽ҹsgYjUjp96@@P>2N"ÇLT@ wxTViԨA5@R@w5(/^Sٽ{wt"-knܸa0HnsŚvɰaLw?cٵkh) xfxѣ={vYh$L3^jeO$I8@ dɒ%tRSiP?,ZX1dSti',# xݧjRVѦZUVT/.C25XbɄ LlkXxtU'JիW7׀?ǜ    @`I7 qn@5F'5-[t8lذ}vɘ1`  k2F$eծ][ƎK?~\RJeʕKnjQ L.]26kڵ7M\3gNdSLI6m]x  .\0uo>=3f#$UUׯ//^{ݠA$RH:_ٳg2m4oٳ~n˖-Mb,   *c\  >Yn]CC%`@ЀplՄ d:u*A5޾*Wl/ |œF 6׮]Y6l(j:H!5yt$EҦMٴi<}ڍG@@7J2d0E ֊;v M3J(!ۻN8QZ4ll,L׀VҦ4~F{V%0   n(@`)t @ox7naUTIZhMCd, x+$GrQ31bȪUu^=w܂ UP^f@=‡/Zfͷm&]vSL Jܸq^z& ޽{   @ ܽ{Q{ ֖(Q"`3x` &Lv#{ ČSzۤI$rX'OK=ɓ'u|^P@+5_5ܹghmz}:uj9s<< y  x5^F2 @U K2L0]J@@ Atr-E'ڵK .hO>}Zc e&I$@BaW8 1B)"C{4L"_|ګի>,  ^@Odɒ%=+ *qFp&;ؿ͛לC+Gc8>z(QHkEmzF={v_}Ta#  7 X.cC@ -Zd&&i74ܹsE/@@߿/ժUZ={f:Xn*ɒ%sS.\hj56  $MTZj%k֬+WȌ3LU++D?ϦMxD+ >\ @@5zb&GT7oD5, R&qFV2;wqƹ/r2Ղ'%J{nx?Y@@@`~6СX׍#Bf͚IϞ=%F7N  8BG(z1x0 Xtr]mժUe֬Y^@~M*V(f׌}rd0aB%/ߙ- +?onl/^`A%Nؔ+WT 2,# ܹsI&v2/s7ߘpH^,E۵k'jZYtXxt~.]t vV ѣh®(dm@@?O(D@ꫯN vy) … A5)S4 yĢELP\_K@x_ܖ+W.0`9r 8PrN.ոqJeٲeG@|NRn]RTȆ O>wF‡/GKJ8qK.g}&Z@\ՂbV919ˍ7M66mZ    Xtb>^lظqg#>,9sfbM&u1Ӌ۶m 2@RǢA;+VLfϞ-iz"EȺu̎oד u:kɒ%fN*F+,YacH΁!  5jԐSNه^L5jT{  Z}[,_܆1cF{ J]vSʳg*TH &2eױ  5?@mg6ol9o޼2}tI4@ (#GJWa56U$H`I/:ȉ'3DMz%͛7PBY@@@Mw{G (s)[,]>{ᅨf! ̛7O֭+3ӛʋ-9r_gݼGK˗^n߾C7 y}ӦM&F?h9sJrbŊ a%  iZzr)u1"Glcx7nHƍe5i̙3%k֬:'sNiժl۶>Ip}ҹsg!@@@ 8 N}΍ 8qBg.7o4#߿â x.[>|،-dȐ2diݺ׍ՕҌ?9UXb<=BRTTK&d>}va  kРAңGykԨQMUuxVM;w·Zz-;v4=oDcXQkx$Iw}'Zņ  5p~@8q%J(r &+@|@ٳ泶fW:)pl˕*U262e   ?^jժ%ׯ'O1c$M^ HM>waO>1%ױ<޷o_L#D%J0RLic@@p5| xNڱʦk۷KHdt @6lɺA ҦM+K,ɓ{q7nJ*2{l? 8KܹspBY|͢Y)Rؕlex3@@`Xx4lP]fUut"|2 pVٳ 0L=zt?~hAkOSAhʕ Æ +:t0‡og@@p5< xsfDQF;wʇ~E#d( xI&2m4{ _|ɾH M^ m۶Çc̜9SU^ ŋ ~M Z@ʕ+̙32  r~3f}ĉ*5ױB@?GլYSJ4モ#Zxt&hӦMA+1Bʔ)sx@@@ 5=x AJ2YL{}NC@p႔+WNva:"D޽Ĩ4hESNIСʕ+4@CEJ66li2 *kӧ  S8`R>|>OŊeܸq"h @pܼyS6m*s̱OG&ɚ5 ܻwO+CG'#G-  8[g s|@H#GuU޽D]/"CA@m&˗bM"@IDAT+N:U*Tr"EȚ5kܭ@G]flΝ+ׯ2?lt 8Sᅲ:Çi"D`*he SL-[ʝ;wLw4N~}B"׽Cǎ3k…3/4@@@8Sc# EL3gNыtyE1CAl*ɒ%ŋK <{`n{ޭ[73 _a/ \zU,X`/oڴI>}ItLfi  kzd!3g,f͒TRX@AĉRF p2m4I ;tg۶m+Νǜ&M3fϟ^   hk-@BgϞIҥeŊft:Aw˖-& !! Q:I]v&۫B ؘ1cZxtV۹s93g$I$<:B@/_VE?n2el'Ox3@@7jkזK.hŇ֭[%L0o|vD\)ѣ 4̤W'M$eʔqeW|\Z=gϞ暷/wIe#F 7@@/@`M9" ^'бcGo͸bŊe&&Mɀ@4ׯ k׮S.Bױ8 .HD碙v㸃s$@\ 4fΜ9uV;-ig.ժU3g9@@e?.]СC1ƍ+SNŋeGJ`Æ RVS7on~ έٿ4iDon5v  8RGjr,@P`ƌRfM3СCf+X!! Yeɓ'M5QaÆ5 QFךW^6 8wblOT +؂@^8qTZUvmodʔ)'N{  'ܸq\\`ݴiٳ%]t:/Wnjc7oݺeO?Q>#{    X>z@/I5|-3lO|4FbLF# O?$ZN6lX8p|W"Da Ǐ֭[˽{0b͐!CE<,ŋ{!ow.;vJC@@G xm&^tɌRlk6  @~ϟd͚z$J(x;gČLlw|g  ?~\f͚e;@?7A6^+@@n߾mjOn>uoL2X@N:ȑ#Jx A6m.\؛cK*O<1}ϢZ)O>wN"  ~ָ{B@V\BYhGʔ)e#F`'G@tkٲeE'j\_2Ǯ7f湶yIŊ]N @p ͛7 =xʕ7n\RԪUKevV  Æ .]Vv%J7n;G@ X$Nzcǎ&#TP/!["6l({챏,Y2;v-Z^   &ּ  Cz3lfĚuv֭:uj` N`,Z2sL)U{uz'O4U^j&" /hFkך ŋ˿>}ԬYSjԨ!ɓ'a;+@@D:udʕvsi&Љ4@._l~Z.? m /<}Tٳh%iqhCHKG@@x5b; >$0}tUV)V 0T@K`ĉҼys;v,YD>cرcvqB_Q3D@^/Y|P$@ ;@E̙3fNZ%dڴi;vlk O ܹsGZha~6Z}̞=[2glх/^4ɢEƉG~G",   @`k@qΝ[;fFY-[F9>` !pa]^ _{tG{&cŊ%?)Rȉ'|Ta# nX6h7[„ MZjI o9 … M%]-tҿSA+5@ ̘1C4y۷;h iݺuy2YfI˖-TZ3fL!  gXD@):9Ti֯_o6mZS\@@K.5j7^ƍ+:%O<g{A@3/_ެoժ1}X xlܸ,X@nݺ‹4s:uLf! kE5kּr6" ;vL>]5f͚8q@NΝ;Ҽys駟KI^ h GZ\S̛7̜9S$IP-[$J֭+#Gȑ#[xD@@2\@|^@ˏ ֯_?j|@W lݺUe&VPެ,y^+W;Txq{@pT[v1bDdx3%MT4U'[X@@7ؿd͚5@PMƍeǎBP Jj*8p j3e$-zk<իˡCT2edȐA~7睘##  [ Pƭ: cOɝ;\vaÆ2~xǞ! +&O,M6GRH!?Mcc*UJ~sH郧#@LϗiӦɆ d!IHrR~}4@xѣm۶Cs(QdܸqRJ׿=@Z`RZ5믿׶hB*aÆױZk_sb,߾}{S]>L0 gC@@` &X99 zʕKN*cɜ9s֭[͛ .D‡oN~GM@ 믿ʷ~kW(gE@@ XRnN B_͚5e֭䚭_~ȑ#3@8rȑC֬YcF&L?~9 W7~Xj%J,  {Ν[ƌ#/^4`!LZ+r?~|ꫯqz @0 6L'O6g K,Ç^!NQFsNI&9;wLr]u3~~~⼾/RV4o߾|rY{_@@@;B7ٖz|o FM6vv| DKW@@˗/ի˿kN'NYp͛' -3\?H̘1@+p2e&?fnذTVMD xץnݺtR{|z]b֬Y8qb{  wjJ&Nh]"GlN!sm Y]+Ά  7G  rÇK|ƍ 4 &@_Л_|hpH"me˖5 oҤI̙3.\8y + @@… eĉ~io D% $ @ؼyhՃsΙI.]gϞ2dHDYtԭ[W_n8B- 6m'Oիˎ;^(QTC'@@Lk<} )y5;ٳg%K?,B rV" cBMmɒ%3ӧOp Ҕ)Ss)RD֬Ys2@pSLɓŋNTJ*%70i ok׮bU7Iki '`Ibc2eʈ~n#G <~Xw.4\jSX1!  #HM @0 ܺuK>3;&[l2w\j= /3FvPMM:j<_n… ,  w $O\ghbdMZ5<ݷooSQ!xkפtҩS';PBo>!SE(8qbٸq"DÒ%K$SL?WƙZ=hzj?9˗M":@@@3XF@ Çź 6:!D/jv 8Gۢ5K.Oћk4R PرCg  NZ xĉ2i$9w\cheJ&M̄ek[x >@ժUEhnݺ7|c@+Wڵk˕+W̙3&@>8^z|r{9rk|@@ k<} T@3덳y}bǎ-7o?a SL2r!s 9|p/:?nhhի2d`@@xXBƎk2eJjL+V,XF@iuСҹsgJM8qdƌTq:FW… RzuSIɒ%eڴi3fLk 0bSYHaj#L:T pJ@@xGk! .Zt'bĈ~z˛C?@R@+UXQ]fƧ7Ν+ ڠ/2e2L/5Ƌ /*6&L0_/^ WذaB Ҽysɛ7omKU*6@@@Lk@ H@֫WѪU+7n\ @>z饗ٳˆ H[qF+ *Xl  (VLI'"A@G \pAʗ//6/ 6mG>@Xڵ̜9ӪE_ #Yfɘ1=)  @B 8qB>3:ufցpݻwnݺI,YYBpGJӦMСCV={?PRHac@mʟicJ^4^syO]tO?TRL֩@@'@bx@D~TZUA,XPlD.4 ygϞƍ[﹚T1l04huM@-*TՊ/^c؁ $͛7M2:pCꀪ֭[˛o)Ey5~A\svdtL"  []UV湲\M$???.~Xݻo˄ K.- ,ܹs[@@@ $u} 1s玙ΑT3gNYjI518@b({n)UT&M za7nzQBk @@~!:4%ӦMEJ*Udɒ%0@o6+gGRM…EUTc D ʕK֯_/AAAX[7J(!N,?^f͚%S6 7{Sz  X~׌@DҡCH]ΐ!~'Dn" 9s&R ~Zx ٶmY5Њ6mdQbEk @@Yt/H߾}jR5jH~i3իW@pSN{|}.c) G@8eҥ1cFS%00PL97J>ȗ/RZ57n\6@HLSj4_KLd֬YRf ˫8{!'OtN`AQ@@@ &|Ԉ سgԯ_Jiժ|駱c@@"##nݺ% $ޱcI~z[/ V\NٰaKڵkfEKСCn[GKj#ׯ'ƽ.%"/йsgپ}w-.\03j;xu0y_ʄ x/eɓ'm-   $xu n*pRΔEΘ1C&-M/)a#HرcK/ɪULT jʔ)fpc%DƎRL&?@@(UYѣ믋ݻwͬƅ  &S@+_K,)4 KNϟ/~$K̹S; q(Z脐A=l0`6իYp~۶mKh@@`Ԯ_\ `oIzaP̛7Ot/@'&KMbՒ9sfYn{x$5ʰ *Lgr)2ddʔttRJ_Jtw'q#vw 0@4i" ^xٽ{4mԎ! ,ZHFmW+VLvidžktL?3?SVj&Vpm$  g $σEz Ν;'ʕI_K%DO~ n&0i$Ytfn- e˖ɓO>i~p謋3fHə39s?@@~L<٬o=/ u7+(?D/ @tVZ='zn4i [lذsm-)R0ꘔ|hB֬YcH$I Jh@@`t@.]5jXI5=|w$! 4GI5]_D 4I5|```"EA  st0w޽_~ʚX[ݷo)@A@xx/^JѕǏ/g&& `]R//_Dsms]vr D}!ˊ+sΦ:v~[n3S  $5 gIM s39r|͘UQ TV3g4;vdž%Kf9Rt-_|$cW^u]    X.!S֭[Ν;Mٳg7I5rgD  ҥK[¦LRf̘!4)_{2&Jv @@ &r|2o6\'O?I:uQ=|Q날%@@<@ .  `[]sVR< %ƶW@A@WڵJiҤlٲw6QWѤ-JIT $@ҥM~V:gϊĐ/_>?~ܼy3qu@ VZVRO?-;v &"^ mڴ&F8Vi[n/^\vhQ ,(۷o@qUW|7   @,H" [={i)RŋK b[ # jժɔ)S,tX 1x!/51U8@"EȂ Dl6mj%V,QQQBB?@t{ؿką r o_^tuK-O?t]Yd0yEc ڶmk&FHh@@w ݮ"@߾}eĉ&^Gfe| `CΠi&7{ly~6 l*`bMɒ%m%a! +/$Kfͬݚ` ( _|: Dwø @[ 2Dnbԇl!!!Һuk[Lp Y 44Լ Zriaf؞y9|誂w?)  .?{^̓z)\fϞ-1#x={J@@@ҥeժUyfXu/k6t :pQ߶PJz?18@H  ou5߻wO+-[ׯ'FH^fӦMͤӧ7[n˙3gڅ#  (k>@b)":c:]Z_~@@@tbq K&̟?_  "~m  ?rɆ LM%t2eHÆ ~6@; ,\P^z%շdʔo1\bB@3s4KǎmܞXJdƍ={vC_SL@@5qb$@Л;vh3((Hl! @t;u9'OC __>W@@ VΝ;iӦGDDH^lɋ-rZTu3g0 4^tIVjVq]  H5!"@ lڴI4h :-[W_}ERͯ!OᅲҥK4:}g`cHKIG@@2fhVA[;vL`$۷zE nߗ#GJÆ %22҄/Yu@)@+пYbdȐ4ta)UܖA???YfTR֕jժ%W~0@@*krY@ l߾]֭+7n0U5nXfΜ)>>>@*M)W>};o޼uVUt(X'  :'|Rf͚eW\jxƍRdIԩ={ Pׯ_-Z%::To۶Mzꩄjz@@15k4 *dd˨QD`)H&,_܌u N0d@+  L]Aݻvr5&̙3G%Kfߠ @ ҴiS-ZC4!+ȑCf@@J(!aaaxbyQ:}ڴiR`A1bb?Tn@ 'Ne9I&?1w\A@p@eǎҬY3Ӱ~xwyxF䝭JJt"4u2 ,Nz  $x 1ЙkԨ!:[֛I)Ri v;c:׶m[Y~= ^3gȅ LcVsZA@'аaC9t|Go׉m $=:x7]TRhO-[&x @,ɭ͓#G&jg:/֩!}zYt=xv" { $KL&N(&Mɓά\R^z%ݻsn&L>< p]&uԑA  @HG!xKLR?`z7o^Y~ɓC{L@H8۷oKNo߾m*nժlڴIrȑp Q XPzgF@@@6mȑ#ұcG+[JbߗwZ@;wTXQΞ=k:?~پ}ԭ[;G@@_4^Wɜ99Nڵk<^&70TDV@@ &i@ tJߛHrejxD@@DDyx2m4l$Idذa2{lI*;@^'pqiJlټt@t3W_}e,Xt7**Jy3s 86  D 4|1cHtt =_`߾}f\ӧe˖[o  o$I/!!!2eJS_XXpȑxO,%KYvAZ<(uAA@@HqǫF qu4h@6nhϘ1㘵2Nr ^ 3;wUc <j6m$b  ?~ k, 6@@H" >\åp¦QQQү_?X/^@'pG%KH̙3&|m6S;v@@m۶ 6HlL+:K/$WvbT+W.3hǎҲeKw8  5nw@ .QFfu=D+RH\@FŋRF 2eܹsv W@@-ZTtŋ IǶl"z;V@q|4iD_n-[ܹS^xǝ  Hk.Z"## *'NRt;_|rJ3 Jn\8   $$ &U!SҴiSYj 0}fD @ѣG% !i"͜9sdذa$IDI<^Ěq  zMppY}ӱk ͚5K.y}Djn.]o߾֪mڴ1feɒֱ $@_<쳆?4?s9kT~MI܎9ƨ@@ & @ߗΝ;ˬYL@… z(@'L2rJ$:u;V&k /!Bѹs綶@@@A$IHPPl޼Yx S3-S@ atu֭[KTTX55jC@oȟ?*5ժU3 n2CF,N~L5k4m\xQի'.\pZT  @|!_AG&ռk_tPvڶ@@֭[tr!ZLL͝:u[ă@X&Nl xo>3"=QF{tfk _Ν;ұcG8poLkڵXBҧO@x`L?wh :۷q#+j9~4nr.  SHq*/#RgϞ2yddddܹR~}W@[ @HHTZUÞ}YٹsTXѭA+! :nϞ=&F tnݺɝ;wS5"U{^zI:d%KTӦMʁ" }4i"6lٳ~'yE'!$9sLkAm@@5l@D.L]Yglݺu"GE S *Ȃ LlV}K,=&*)XFgBΔ)S@tGv  … |r2XjժQl"yݳfϒ%u! \m۶ 5ǏK``Z vY  ݻwne˖vZɘ1C'6@BlŊV҇~$?x!Sו*U2u;w$ܸq)mQ)   &6Z ` O>DkJϞ=@@}i֬8J̰u[x@DDP-$xE[  @"Ȯ]xHWL:5I'pmi׮= _~2{lI2 @@Nɓ'7{=+]}z8 NW`AS8Wʉ  $5 H }X ;c%̙֭3ÄWV?I(@@Hܹs͛iӦwJ.]dȐ! P;U W\ڵkˬYL'|||dĉ&&I$1"G@8p,"E ˗VtuJdȐA.]*RsرcrjA@@ $@\/"ݺu4 v}$ 4jժZtʨQdxd #`bM֬YRjA@@ NZ͛?Ç;ʝ;wpBΜ9#˗0woDg#޽Ya@po֭[իtd(Gu(gymʟ?l߾La(@?/;vbŊ/^(ժU3ž6xdlmԨܸqQ@@ XT^*GڵkyrSUΝ?o cʕ+o%Kp)^!S[bE  tRիWia˖-Rrey0IMS-&pBDveCҥMRM-&F@R GqFY֭[ҢE OKW g} :.  Hq8!X`֭f6(sN֭/BA@ ܽ{Ww.o[fdӦM3gNj$Xl  8Q\r~zɚ5ie߾}f%݉R5#0i$31.RN %U@p@t$44T:vh]r}5%5O^/^,S˜9sdر^{  `kr%@!{Jݺuf.;}tI@"##v[|kcoF߱O@@*PX1ټy͛״sQT9sƩR94h뢃J+dI&+à-@@eɒ%JsKΝ;]3lQv %Ν+z _$00P֮]kvLRfΜ)#F`u7Hϓ.  L`eɟ?i&e4L{IΝG;:qڴiw@+Vf!@ܿ_(۷۷osSO BB@~k! x@\ZFWsϫ^AGV? *͛MҥK'+Wf͚m@Hl֭7o^SMr{mYfٳg16l_k=8  kHq3 [A~stZfdΜ_%@G͛ҲeK9r=zHBH@oW^5ҦM؁  +teiYWѢY׫WO; dX:`&La\&6@@e:im^0mjRrŊg& ibMϢur9)]B@5vāx{_M6,Yf/e X03tv?X>Sk.`6@! E__߇   !O{zTѪU+Ab(3-[V~W3/^܎  hJ~NZtuZj… -&OhxQ4Ope  `Oky] 7xC/^l3\R ,5 Vtiٵk9,]tl2O <^@WFBb8@@5:U4tRy7]8  -[HJ…  ĢE@G C &^W%͛7ɓ'{B4I$"%,,Z&:@@@M`2i$~eѢERDD@@hh+WNN>mҙm&k׶SĂmܹ#:kl{ @JbŊ]>J :mO+VH5$22't9r3`B@l"u+b"U^}U IF̙eΜ9,Y2{gVr1  H">@C͛'22m4Vn! ;qIÆ ڵkė^zIåPBb7oZ'Ƣ`@@&UT)SXW,Yb%5j$T:ի?B]@@4D?g|G߿9~g,4[jhRv$XV  5H  سgtA߿o1biYQ/ n#p]yפO>ުU+Y~d͚mAA1Lc!W@@W}2l018{#2?ܫ@= M;. !  3FFmhرҥKku6b$I*U2ǞwnMѭ[75k$Oա  13}&SJ˖-GWuD g̘aU@@ &$@:>$̱˗ ?~\eڵ"eʔ7СC#g(>>>M~"  `;)SHbL\?Y1ıڷ% 8p 0nO4I@@@@׮]eܹ"E s ^zrƍX'ɓ|Nu8hbS@@x X/>NF.mn:sJ\dv@EH͛7K@@9r/k֬~zy=t W ܻwj`  6EI̙Mt+V1c0RB4Mݻ9Zpp5 @@ 4kLBCC%M45kH5$222{Y Zmۚ^_U" $5 Ju 駟dȐ!E1|Μ9) x.Y_Z5paxdΝfov$+$"u  J'0X;u;vyBΤO0>I$gIPPje@@իWM7mݺU*W,oZϭO>ƍî/A@KĚĒ]@  QQQ`\r^&@w@K@gAR:t۷ojժ%۶mu4[ Wn   vR&̻w|eM|n(_mڴS;Ӵi_w2  >ak}I ̙3 D>}z { 2B@@pgk; &Oŋhs% r @u5rH=zHhh $ζ(^O@@(~/_ބvIR@'jڴYU^M}Lnݒ_='J@@ XcKB@ g 8V^Zg][z 3'Jݺuʕ+RJIxx1@ N&ְbM9 @@ &M$3g6Q̝;WBCC9"wGQfMٴi _֮]+bF@ .޽{K=2t7@FA Hj@g   nYdqYa˺ \|YW.۶m3dʔItNAA@&?YFʗ/oqԞرc{D>~wEADA@HQ@ED ]Q bCAM ؐ*M#?oBreS?zAμwo.3n  iX@B1cTŚ5k&{nq& q$nywR?32fI @|-0@!p뭷5\c^Z>3^@@H[8@ DaÆgv^f@DЎN]w=|ldkIL Ȓ%ȑÔȑ#1U6   @z>C5_6lؐ96 ~Ծp2{lTRjPe@@ ~r-SLu ܹsQ,[oe_wr {@@ &-!#$p!4i9`Þ2$@H5jM;<8EE qk*C`MSj $^*ݻw7U׎a?x22P /Փ_~Ŝqʜ9sB Aa  РzkѨQ#S |q=]4׮Uhu۶mC)#  @X#7b &0n89v옩֝w):Z? @D?~Ԯ][vaYtiYxԩS'MiSV\FB@@ r-o]nݺɓ'u8xԯ__~'QH={  \r-TfIvVZU4h`ڴi923؍  $ ]`?|u$jժd @,h'Ν;3<#)))Hwu̜9S?X("e@  (`a:&@@@ЙZSk￟j-[f*\|Rl M  Ȟ=;VZli q1hr@IDAT3gΜ*s٥|e@@HMt؇ V!'!ā͈W6͔)矋~AB 8g  @ 0@2g>}T[@.]j .TS|䆡  @d˖M+;Fgiڴ̟??Ajj\RfM* ,E@@ I[J@ 6B;k. Y`ƍRV-={9gΜ2j(qK ٷo_9p   %pUWΔI[4NM4%K*T\~-C@pW i֬Б#GqƲh"w/ǹ?Cvh/  @ kɰ@ $e˖ڵk͹kזŋ'! :rᅴ".\X̙#["S.VXwޤu  %гgOюu4 ĺҢE 7o9EB fq  q$;hu† 3QU"RTN5Ν;#r].  」 @L Xh:teP *0rHeϞ=& ֨Q#,9\4Kر+5  (Qt\СCoF\)&N<)~̜9Ӕsϕ3fW\  dϞ]Ə/7п4h ?;\ժK.yȐ!q\   k"5@$#ñ\rIVT@ #m۶V~ipBfgKOVࢋ.˾}v{@@]瞓9rj{{xRҮ];2e9#o޼2m4ꪫ́@@Y@8qNq\jժx+e$SL&Cr 2E@Hk^R@ 5sΉz( 8qtQzigEX@ 65۶mBR*@@B(Vߦ9"zpJ HNd̘1:ԪU+ުBy@@2 'O,k6ݻWի'6l@wjmkʲe@@ lք@ f#hd .o>E;.soG}$YfQ~^XÌ5    t>9\+ʮ] *5ve„ RNdc  ܹs ի;vHݺue˖-8}WҎ,"  ` XcS ^XGTpa_~F\@.~zY̝;הE7nt=e 3/3(@@(R<ǎO)it&>}|WҠAt   #/_>oRJR !VZ9RN ӧ9)SL2d3r4  w̘1Cʔ)cn:W߿?QziQ9{ٳg|F@Hk^SS@UaÆ;ҵ7 @4a߾}:ג%KjժqRNRJm۶ɿ2  q/PhQi߾*>hР>|tؿY@@Hj… ˬYxaŊҤI9zhRXoݺ(ǏY@@@)@`Se@t s+V(UT )NB@ )))ҳgO'N4jHϟ/_|q4Ƶ@ K6g8@@xꩧDg1Ѥ39s&6 J-0uT{DѤ[<·@@_@Y-Z$Z'O&~Өa $w樉'7S^F@Uds:1gB@ 2ǏvI>} >C2e)I V``Æ [J  @rIÆ ?S&OH6Ǔ#k:u[?x饗 @@ :s5W6mWv3Ӡ Ѵk.{ؘ) A@ kb6P@ ̙3N]J l{쑛nIFi/dɒ%8/ 'peuZj  $cYkH-f[رc"m۶{/+E@@""PR%3p\Μ9Ky#rXȭjo„ 2   XX"$`ٴi9nݺRhѐ$@!vZQ,\\>o޼2i$qvHF&ObŊvf+WY@@@ ׯ/e˖5U={߻رch:.2e Qj@@ \2zh{w}W^}Ո#.شiSɚ5)CB@@W_@%0tP;,  ѨVZvE]$`#PLɑ#5s_   ]<O>^f!~:$5͛7B_uU2vXɖ-[T" Ą@fO?{9B!/5k4Wց(K" IJ5|w( Ǐ7h1u-[x)  H:̆+R,Y"UTL@G+_՚5kԩS VC  :QΜ9͊ߒGɓrmM/RogS J  Kw}.R׮]e̙z-4lЮ~k/  Xs ɓ_ܹC΋@@JJ r=vXѤ#vL5:c SbŊb'NfI{L@@D;|)[\dʔ)RL,+B@?K-L>,M4-[_E2XUJBL.=3gГ@@D &(A"${n3b^/o1BW2 _`Ϟ=r7ȑ#ə3gLBY]Akl @@PvRxqS3fȮ]U%_4(F!jJJR@@ X3ʷm&7F\xLnݺ沇9Ez  1,@9 erԩS۷ @, [tHY`)N3i${X,3eB T\Yri2%&  [9~^I?5jTlx ,ZH:udo۷=@@ `͌xeV\)[ӧO!ɢN:va{@@@I`ذay;vY@@ Νkj6l`UhQ7o4m4IY@eٳ˕W^ifٻwW${@@'`h FpTOD^޽{@@,XPM&Ig|2eܝ{ 7eI  XX"-zj駟ժUr}." )ÇKzd߾}:cTauT9Ć_o "gώBQ @@\k+VhrQnU2#2~&oY>dɹ  %PT)?~TTE .];sY?@@@HСCsƦ`@ ^|EС8q”q2|)VX @$֭k_￷Y@@@ nvS- ,7n\"V1nDgZjv;vd͚5nD@@K@B53gδ}|D.C@R 8 @?CgД-[6iӦ;@@ y饗<2ydɛ7H>뮻Nra*N`Mj $X4iRU?۫W/2e)cdԩ?.3C@H<[~iSSNI֭OX.\6! $5xש3 털m6_` Ʃ O`߾}R^=;4s;)d ĥ@\VZM@@`tҥKC͛':3)&L_~D?5j*U*  I)kI-L8`>wZ%K$|}   @pQ '0tPۢcǎ2  DS`Æ ܹsM1r-Ǐ< c5KĨ6    *ЬY3S3}oMZOVZ%zJJ)t߾}!SJ  h2e2UXTmڵҡC=kתOʕ.]jm@@ 2y>$ i ?RH9r䈜wysNɞ={'r . ,X@7o.{5WUSLū5ģulٲuԑٳgE54}ĈqQV   9 h۶m ~wRn]SNg< ժUDSvwݽ2#  ƍ{-/B'5k4hpѾ}$q\  Ȅ<@C@GנMmڴ!&9n;DbZ`ȑr=M9uDS%\p 2eHrDGݛ? ;St\U;M>=gp(  @2\{V뮓\rɱcd֬YNw +jժ2h w/H  CTR߹5nXΜ9#zJ4i\5j\g_~|U" ] ss$C@Б!@+bFxj4h`:Tͻµ}-ZB:uJƌ  (#GM7o;B̎Bxwdĉ `O$@@bI@g4iIeӦMTİzv~XCB@@kx@زe̞={eNKB@ 'OO b_k׮2p@ɚ?ql@w!7|p'M$uԉQ.@@f̘!~{We̙~AJ.q O?m2ʔ) 6Yv3J  . <3O?رcҺukٳgw˶Zj{@@Y{jK/4SIV.:Fn䪝R+O=TBV UT+ʊ+dfĽ%KMs-sNܔ" W O2mܸQ-Z$3 W|V W  } @ٳg^-sΉص @ h MnD;[IG${&^@ԩ#W\q\R.\(sΕn!bDRsҥPʀ  &ݻg8RJvit6{>o믻w1rF@@ey믗SNI>}aÆbd`իW[" $@$7FR`С;vY@@-#Gs:j^x6lA5n/I*3bY_yE@@ ʔ)cgÆ 2 7od3gN1bȑ#!7@@",PfMyU5F!˗O+ff͚Du@@Ȁ3dS@DؿL:TH"R^D2C;YfO?d˖M $wuWK@ :t {?SfΜ)K,5jmUSRRL3edθG@\`ҷo߰)*TD~!!&l^;vL:w,{^{M*Tu +  īL>]-Z$3<5@^K]|yٺuݻWv- @@ 9IN@F%'N0ǶkNdy @(+W&M͛qM7Jv)5kV']v5ꗁgNX=@j4v#! ħ X %K_Ul(1^={ZkV}/1C@@ x+2l0T=zT(mڴ1}%6,WxKKXR! p @:t];,  n)B;XA5%J TnhCtFŋs̑ɓ'u @@w… *@J:S9)|K.~ s)̙ 6|   JW^yEgjX(Zʠ3XIkH  +{9 N߻xbsLʕ#N@BϤqr!C !fi @ٳg_>Gr){@@A Ѻ߉P O>mӻwo)SLLB   nVZ&]^zp_"5VZv+  @ X7*#0[M0J 瞓.]؝[l)gg\s@`ڴieoi  @*T.={e2&{ʕ+M&W_}<ː@@aQˑ#)[oebZ4g`ͺuR=  -@`Mb_j$ f͒%k.|8 @@Ǐ7_^}U\Ǝ+s綷DJ_~)S&s9e/"%u@@"![%;w_|S;~ᇢ@@Hd?o38>q] /PcqƸ G@Ș5l@ !Ν+[ 5 !2B'o>W9B;;vD!!Q<{ 8'!  ֈZ'N$B^zJ:dʡ?5$@@A@ .]T~QFuK,iș3g.@@ tznǙ @ |v:vh/ @F6m$\s̛7d#@M8Qz行f @^uKL>l޷o I  Ă@lb_\9+`4@k̘12enٸbW& ZaÆɯ*|RbEVԯ_?Rik֬IB I%̳nuHNi&ǕDz)V6Yl{n=n1*mopZ7_Dh{8`?L:S#)4l瞳Oj}& @@dK#~QXw# @?۷x:wx~x>I|I  ! >}:G1Wwm8q"<9zJ6CYyr̜9ֆի<MzݰaCJVk[mWOHJ5R50oVyg͚5^z)sqƍ^yv_~Gƍ떍.~+FϬw)v[>ߩ=/mڴI9tPPR˹O Io[rz*ofFu'@)s8 nZ G7?wF۫ruYt;|޽-E޽{{KmI&yzoI |u]Z&  @ )}>9[l)w}~߶mx+>E@C(y} !'%NfEgёI "pQ[޳Oի|P :ބ Yjt=zjqZÇKnݤ|2vؠ|N%:ZS۝\rr;0=y,2 %o<.rqYJ"Eڵk=7|0)3 N͚53O< 4hu]Ɇc@ hŧ~*tI$r!}z*vl߾L< 6UJRpuPVZ%+WE(;vL֮]kN\pBJ3˦C{pW뺠ַn*Zg6mHӾ&ό2p@dp?zv& ٲe9rĹY̙#=g:Э{usZXKo`>e˖N5nZ5Gۍ6$Tr'B9V<#0Gdɒz:&Mk6H@@E~t*RhP9Yyfkr (  m @#Ċ+LA AE/!%@5k֘OS\:~x馛8K@ηo.б ڵ38CE}t6+3swHݺuM^nSr[ՠ1mR}BA@@ H@p 8gFW :z*7Ko1'DDxE;[_hp͎;LPHS~.zzL;5k]qw/\P~?{ꪫ3EϜ9cgZOŊefvS̝;7``5NzfN:cjԨ0-7]zz*ӹs/:@ĝw)߶1|رS5O)_9\3e;ٳgG[:sO-9tͽ{ڛggBHnZ(&\6Fkh{Le$7^c8_u|7ohԬY^f!xŋ :Kc ?9G JӧOcd  0l:ƤK5?[?/VXr" I s!@8Qr)[Pt@h >t*jv8PB45@ hK/dgIͽfҰw'|b(5$gUɓ'sײhu:1;ʸoeJG5zjon"9PrƷNt Tpm_z 2.wy^fh385s{7o^_uIYdJ}}`^-u$GN8^`TDr:FY׶wĉ#TN{RݭE^@@@.ڡC/+ RCB@H>ԇM>j$pgܬY3ɟ?R:Pi@tk͡I&W_ڹ:+q ]={J…塇2(_\}2n8YP=-[̮Bݺuw#TTɾ^FBH{{]v߾}^JѢEEk.)Y6ߕ&Y۵M6VzuM* z4k :sR_֭^ylDg^J+5Τ9PrݙmKXm֪U st+b~m8p>n1'@>nz֝cۻ}vY`y|e]pݟ~<ls@   X1W@b^/x]w,  xv}H,Ym, $vmӦ%:#F5ޓΝ;mU k™N8!+W-3\U fTlY窽5A7iOILUW7mtDW#QJ`VQ1)P`͑#Gdݺu:^@ c[TGܻw]e?ʙ3g$s')w@h]aVA l{[nҮ];{J*O<,[ϣfCwn{nn=8VNwn=Wg{?vɶC#Gp_"442$@@HmhU@Y,^̠3St뼮Θm;vX" $߲&Q* v lfjo)a48\@gyԙ!@ dץKiԨHvwfr8tV jp~jVґ ,h|uAʕ{~:h%}NRꖍ.Vx/ɓvT5i%`;w=_5(`Ggph%o[gͲiիjy: tDIjժ'|"jW znch{Nrvղ;OCG}E7A]v5>aÆ'~  O[1,Bg$! $5wϩ1 %0zh9~ֶm[ɚ̼XA8K`۶mr׋N1Igꫯ{g@ Qce;ߊnיA1PP! 4{mo`f ri`N:uEWCgI-}fD~gy|9_ݲqYp/;;j:2|0I,)P0y5 .tf07`IQAav%7X[ϟ?YB:k5vXti۫|h{СCcw\ҥKKܹ"n޼YV*SN> :3<LGZ7r-)S'̕/>}ӦMҬY3)QtQ:B=̾X joީ 9sF,O=[o EڔZ`\[I=ef}-l| ʄaEի?qsNjQ63g6^'H:ʼn'=:%\b;pSgtޚqVۙ!C" q,L?[n?#FȞ={Zo}֟{1Ug\pպt}e=:B*UbYt>@@ qI{IM@t HV뮻E^@0VZ̙3ͺv:7 @ 8m;[nm-X@>S=z={|9S;תU|ɨ#E+iz;aԩfև3frmڴI34!Q{LVy;tW_}U)buwDo-:ɓ^[pP]sNK;#$[;i[Igq7k{zmgAG ߍ{3.UXѪyQW`_W^ 3gN.mN(ꫯRskۄw g۫eLCmc?ôHvL$^-ViLmlC>#9|ͪ)}rBpVT)p iΝ;G\@@ cU:&u<k *d6kl @@ &in5ED9f!_|f%@dضmHș3Lj'd \{Ζ3"hGs ^4,a:˄RL0b%w%;( 3m۾}S>3HauFɷk8;/^-[,|Jn˟i_p3FiE]Ց]یpu6 Ƃѽ{4JPF7ՙ{4nĈS> wyg jz5H1~rR۫hP7K+a[`˖-fDWI   e%*s   \$ :t-ѱcG{@Ў:+53Ю#2 @ y tv!:h'˗(iJ`A4k-ƍ+z@;;vt%J-n|GE:5Jt!=ܭjXo۝\sm>6rI۹[ǂIOJYfzYAiXByuZϬU&֠5}NѤzt6IzKҟ/X31;= ErJݺuf.rKZfG;Rm mjn{nn=j0vwؾ}{qv t<'`ߟ   8F g |9@@ 2c)3 @;w;in!8@ a>ݸqcs͚5eѢE$" ځXl^}Uǒ:Zz.]kG:6[g([L ک24Ag߱RZ|;3FgP+qw[y_ڂz1 >>U;;|wYp&.~M:3zԩS1\XOc}8Ooi= bs9kҥKȑ# +y#;qℌ7Nn3O+C@ h`c<`f]рŋi&Ni\JتU=ŭήz`;: ֦M$TLr=^g4`9~YΞ=˭CEg%\"ܖIۘ>@"l{n=w^Uw7jlzi{})RJ w  ~֬YcoKX^ЙuA{;E@@w-"ĚӧeĈX:wkE< Ў 5͛7(Г'Ok6W $_ wߕ=z2e:&L0C8gϨP|gu] I0SRNٹs^5;{W͜kuq>7zF v<=rY72'[26|ck׮R:tH&M$s5˷onJ믗ƍK,YV+{o aA;r:g,LozuCiŊ~s;66梋.:k%KdӦM^w1<+y+W\aYx/\ 7x)R$\٥;ذa>V\9ѺWVMׯt8;;PBRD Ѡٳ;$67`Gj%li{i{fK۫Ml$}_ 5r('  F$@$S<>̿VZ%A" ghP)Q}c@ ^x9sfy:u2gYfZ+gT)).S<>x:ӡ=#={<uY[E}Q{_0 Z/׭[iZ9mݖ湾e ߺetMtXԩS'3[R'@8E=__=R~T/4uĉS=>;ݺwu]nOW T tw;qCg+mk{7 2:pb{?` ƅݻwVv}V=A]YK-/>'p'E`[όKu R7Qxj~ν{-TlYSs=7.K!@@'! @ jӉ^f@ 9tw):EprPK@ߟ#t} t[m^߳\imwYwKۛ]H+Wg7o_]4j_nf <~xGl۶M@ϚA_r:r˟UO$i%:=} fXt` 1:{xZ%}e]걺3_^k:w8_WxFJߡEւmk빾KϫԮKjOgSюs\ :hs=f)X\| y3P3_$3~{c+04@Ι9y< jx*6׽g7g7^&:m~3[3o(=z|əef _{ mʕ~W v,kHYxqO:e~7N…UUdb;;&@YtMӓ*U7LX9}Ϟ=gY8^[l7igI{BժU3]mo0]J KG}$z53Sr@D3:*U^ Q#:c=& :޹3,;pzefK۫M]`(P M@@ @`Mu1cƈ~)m۶#L@_@zG͗Vm>1"$vlܸь"uVaĉk%KؒS:B[iرZ;>}:]y4N"nD_±M_,X ;v+V:Snl f`wT;z_Ԟy7H=/ḟCg͌znݺI|"u\Ggs_1.P{N`usU>Lx s4iҘh/;3>}:,50u;e|eیX8ss{}[d5׽p]/.=ZV,O۷o [oZqjN8{=_j[h/ W[n{u7z5#\YSzmh|w@`M4Aڌ .@`MvDeҤI?[8@)P 7xY\Oz23  }'@ oHJ SL2eׯfS B7o 2D:v(iҤI_7a &u jFn;:! u#mw֝9sf+o6~EM)ߥ1A9~Kv Ь,B y}п/ׅKΫ{|z;aw}EǣGu-ԌLF2/,:u`P{$5kUgLs:9rvϒڦ`ɽ·ޫm 7Tzy{ñ2>\^|E@-k&>l8cXR^*G@"Z>=4\`ڴibpЮ]; [' un\ 믿ͥM    @LMV*j}"ѣGСCҹsg|r=Dmٳ]Γ><9(U du q?):\w0ZO?k` hь5Źwp{u>i~vn]߰aCϟ/E?-ZjM;vLv*/^=sRD {9_qp^/ξEt婧2/DU9b7UnsC>,6k׶קD71`ӽ`}$>K} ǹRqv8 }u֭ 5Z׋!R˗eܸqꫯʎ;fi1cHe}D    m۶:uO?moku gVbŊ裏fΕ+WّG6he>3]  W^kڻjD|y_&\CqJ}(A W9M4*)̙3-[6kdP3rS50Xbm.\Rƍ]據ٰa… ̅ ę|.;;V+񇽪f͚K/ΉP]3y8~[fΜil[ZΝ;';~6[`ޫm {+$ェ/^]J)dҿ=I}_Μ9Q 2D}  OF @t >|XΝk]dI[ntu"x/6mj>sOZ+@@@@R$P@MX3 0@,X`ۼy<&+B d9RLZ{`e۶m& 3pZ֭[ٳmzoPgT"[ Z7dɒ%68W޽[?n/ ڨEm 3΀]]lD[_ЕF38Y_N+Fݎ?.OCuͤ޿hϘ1y@>J;, xg |kݺKի֬cr/tޟϔnoY,ェ/^] K5tڴi2yd?;Y^FVӱ=  5I VMmn=uI&Mh FplڴI4i"3K:=+3    ;Cϟo2 :Tf̘a Ο?/SL1/]vm뮻~f@sL:ខ%rl><+:4`JZ4%o޼7w9=}Rzu;; صk]s?{aI7²J?;f8'tOײ~fǎ2dLon:u'x^z=K(>OE34k,Q0 ,h2i! P}`L4&Nh^/VUЗޫv^;:ޫ A睟aO{׽n_Q,]T4c>uբ%C &`\7tsULM;3XS   X, '0fXCA~}B>ĉ3Kٳg{|b    'PNמ={$!!on:0~hu@f2ѧ}k@S mDJ}:x0XR>$3>P' &ouժUձk`U֬YcMw;UkYo8/,~-ꫯd2{5&RF їӧ˻k[uY6|C}{+-ޫ}v7eIusM,{59x4cڵkMfrJc}7J.]+5VwkB-L  @ X熖! [|;~?6P@[`ҤIj}j}̙3@1Z   Ġ@ɒ%^0/ ~:u̚5 $Z4fŊ$ȓ'*UJ%JB 8`okg ` viA bF[39U5c~߬)jG(>Rm \據ѧ[3S]~%KVx 7iv%-typf 6YB}վyj =;%q]޻=%Xqն^w ם'Og^<2Pϡfב#G̼.}o >=wjt҉fdԌ?[+k\GJ@_oř3g4@@ C:@ЧYEBAn}ZT~ n֬hMl٢c@@@ʢ_~ pl /%K>(zEa t9uc%k֬9sfYpҦMkN:uZ`:KkE:~/笣xru%/޽{'g`+Sa9s >;o޼>7mΜ9.֫We^g._,ׯkͨQNI%&ϟ~o`>L&L`Bt>^m5#'EQ@@@@K@1ڵkg^r} ƍMͦMdͲ}vh >z) n|9s0nV7D'U )\ofwѦMU%G{?xy(hpN\r4L3XE6lhY@Z 5Z׋唒w ߿Jx~5^4+AVgϞrw{חk%%{=WUBy{ K~Pti)WBSJ<=X  /˙ cCL_[h!y䉋~I@ )S>L<ڠAd<    -6=L/ ?dƌAZt? 8w  /իWĉIu&7={vM,΁:X|c]cPgFڧYkk+VHƍe۶mf> &B'C4%wY3gt ߚ)ý?½N{fRzq-Z~1cȷ~kd]ìv:q>Tjd8ϑ'>K+%^mA ׆~k&Oԇ=C`tZ[ V#哂 JBH"RD ƏxBLZ| vR@@P(e3oߩ:u` z +W44;v,Q5sN۶mMvu&Z Byyj=;xp| ׆穄ng^<*8AZz!yUP;  D鉣 SdڴifqiӦ0 {5M6S4kM&M"4@@@@ tplܸ9iL 7$Ѓcs0~`]ϖ-M5*V p=z9ٮ@+]=lٲ%0dɒҼysO&J Cu8[8G"rRV5rHPc}ʕ+`"ޫLo0>yNϒڶxj y 5l3^=QæI&>:N/@@8 &/#0i$ҡCɐ!Ct q n:TcHO$ozq{   9sJ@@H`3B9d NHH^zdIiR`Mm̙SJ.9ȗ//^v.?_wKʤFOɿz~ƍ g;<*VR_jϸlݺ5&w z{QF% p8e9thp1~3mڣ'7Y˒{߷o9r{GܡfLr!*U 65kUJ(!:עVZOYr-e˖,X B V]_u Ê:vhͺk0X%)wkCuͤO#e[S:u$%^{{=_q~UPzX3Nɞ  @T D7dQEGc@عs,^4HS r -A8qtU.^h6'͘1ïÓ;@C&>zL/@@@ dw}WڴicW'ѣGK:7?f#\;g~{V3Nkƽ[iYL@fx{:8?růyt>~UčCu&{[usGm= xچe  '@`MSzq(0vX;=j C}=kڎp@TЧ6k,UA@@B#PVTLxhݺ4jHΝko7HbLnYny3㊷l.Fԯ_ߚ}РA2pDۏ7N|DL:U^&O,ڵs_lN4IO@%^uk7?knM>Sk~wpZIrǵ }h&$-W*UMp rйӧO-˘19Ǻ[q￿~굖kYo8_^n]9xh[P{"_8?znޫ}v7׽n*NI3… )}@@H(:Y4&5Z)C֜ Hӷo_PÇKtE# P@@@ _y쪬` T;- zT֮]+O\[MJ:כּTR;wnkO[e꼿>(2e1cHǎѣ,X۠l dmqk@IDATytNzݩ{6jGJ{'_5H=]V=)[Vp~M}Ajޫ 7?O׌p^/}+ 9|p+6@@H-a > Oc]w%Ei?6BHСC}G}DPM    ȓ'=ZfϞ-KvI)[nf^@"B@&$$,\PkNz"иqc`?h́H"&Aj*W,iҤI}=+T[`O5/]W՚H3)"k>d~כӧkN:!Ct1 dP\3yb>)ֽW[/^s{U+_]lfoʅ I@@b\?tb[@1i$9rڱczDiӦbؤO{xf͢S@ .]*+W6@EdɒvSu9sy&HMH$.;痺uWxKp¢/bCA Y>rsD C#1cF/L  Ķ5}~ĸEhi۶d͚5{L@ЧyjP޽{MoFj֬ )S#4 @@@@@pf#&N MA@B,@`M1cvjO3 9/{G?nUL={p HZ ׮]3H6NLtN  BˡC7ߔ>}x] B!l2iܸq(N@ FJq*hѢ*Tj#q-7O?k @@ &BN@8|̝;VdI[U= @N*:uϛ#ըQd)P@L (X3gx$ -Ι3g]$òP d˖-S7 "={hv^h5IZo\~:fg`ͥK|t  ZiS@ e&L˗/J:w, H@_Ç}g4iD,X +       @x5/^ A9   @ &O @HHHwҥ= @ 0@l7䡇#GJm0    Q'PR9k֬!@hgG@ XcS0 ļ#bAEuɚ5kLnv)W\,v>!Q'~aq?W_}5B@@@@@w7/b@ À!a/@@ >L/@ Vc' @ 9sFڵk'g6}H6 6Ly䑨 G@@@@@@IXsʕx:}E@Z>tQ@}3fx A@?yrJӯ̙3.Z~@@@@@@@ 5d3M@@Wk\=C"^`ܹr!Ζ-[J޼y#4e;wJ&M_5̓'L>]j׮ݦo       @ Xs! > X!#`7K.4 _iӦrasbŊٳro GD@ظq:ueL2Iɒ%%_|.g.]$Vr_q>wRbE묅;vիWˆ DK.- 6YZuO9rH*U&6o,'N0WV&/;r,[Ln*Ǐ"E 7 uԑ,YxW=nXXjUɞ=yƮ]k|,QKNݷhѢ@{쑃&{B IRvwgϚi=j㩜9sF~-7sΜ9=mfizm[N:)_ԯ__2du]b `SumIٲe܏ă@(>F@@@S<@ k"5m4b\) #K6mD{j` с@@ }QYhǦi/ p/G;}ƍ<\fmV4ĽʕKz-իY5|p裏L?CҦM뾋=ߨQ#ٿtIƍg/OɄ :T^{5o>g}TӾ}{Oʹ?NӂK.'O'x&I. t &C IXl׹sg駟̴y͘1wgɒ%Hcǎfz˖-k q/zMkʓO>) .LNh`ѣVZ׳xg5#   @| Clrekw@@ &O0CA6Ν3A(=5zOo@塇/Fծ][On9%  gW\pd:`O>hͭy.Ռ%IehI/@صk$J*IգS"pCkGt>= D@4iSN+.h+V; 'Tk׮ 0>ԯ_[3JDŽ;v7ߘj4]Yn]E}z^)"@5i$5F3̟??QPVY{;zO|XFa6ӿsu9ss^'f*gY˗E4i"  JF^/:79b'5?0Y{1\ W w24;WժU%{Cm^`1    hflXcI ľ5!Ĉ@BB) ?Ei?PH9r 80< (  @2fhI3̛7Ot  4klA5?S]WZ%'N0˃X-[6SY':8 \tpf Ҡ3g6pB9wYCDs;O>!Xn|V*:d2=2gрǏRJ|۷~?{L2ż~giР|ᇲuV 4Դi}o?n7߰ah5Kn&9c@@@@V$&AA@S}z7HRRJf q/ֲŋ QUҷo_9uT@U`V\Pfx'LS5Uʗ/oM^BB7:tqiG6B ZdO?h1 l4i7Qb4Ԋ+G6޾}{fΝA /{g2l0s>T>}Z+Zc㚥P3/ 3VS] qٲee۶mVGr(1d Iu ҁYfMjD4W_zJӀx Ҭ:ׄ3M X@ YU͛7`5jw}:i=#&L0^5X P5Xrر֬T^]{=ߚfRX1{sjP=*T4HQ_ ȵkl0EA@N7Fgã0X'# ~X"!On'@jс&mڴIfpL@ V^m%JOŦ  .4jtŋv2DؽEU3x+ z% o'Oٳgeɒ%fZoYnTϊf@Ν;'y 2x+_UQ\ck4~Iú6 *hkך*jժtO>)9r Ҭc楁:^;w4&gU}Lm&"Ӡ62L8k`#|RHV  @D=zT;hȈ#䡇rYiF&ɦuk|]VvmsIY`nxb9sf뮻 4cO `wӟKNL ,v*v-dI>@ 0xMk4cȬYLV Pػw 80--Y}I>ɰ-a贖z!F_/ Aɖ-[dȑrJ3j.\Xu&}h x+ֵqDTRΊق4P[ɖ-hO?d,{˗sPX@YU2LYfVv(k[k@Y{ZZmfoڴ)Q+?3b@4GA@I A7  @j XZA@̙3lYD 3Xȇ@ _z);؜0as)  @, ϟ_Zhaw?P]Gׯ/uԱקt L9:`ȓUSH'j:p@G}Tj׮mׯ_P[|כ鎚I$,f.طo9rD֬YcJ\rmM!~>J2Hz쵛V`nn:C' l_?>GKRǬuֶflٲ+WH2e}e̘1Gdw@@@@@G2Y 5cƌ۪5@ hb^dvAL  "=jժ%+VZZjkf"Ѭݥz~[@Yiۼy$k֬&bŊS)mZ]矗ĉf@jذ͛W;&ȝw驪/_ޜWrVdX峪V ܎;XmnNJrիeϞ=~Ŧ ٺu+  ~`\pazvA `vI=ޟ@@@ ika- jׯ{m Oܹsr̙3M: rذa# Ԅ D5ԭ[Wt/ Ќ8ohfy.^(޲ h|-[6kڵ˴[ЌfbQ'-UV5URJrwyu4ꩧ n/_/^ Z9|p9Ҡ-'wA_>wavR}Zj_}vYdu -[.3f̐_U 6VnčҥKeʕq_: @0̙3'S Ft  O5sY^t4E߭3g|nS-۶m?.s疓'OI6lpv&ۑ5s 7H>}D܋~,\.]}@|V[n-UT1{dOM֠CuZ:Wz/رlٲ%Q:QBh W4ik7     kbc'@ :f ۇԎđqƲi&\rh׫W/*  Y@N[A{Lhd,  H6md߾}&Ӂf&ь{͛7p˹˴PBq/ zdH    EkDoEvuy[m2D4(ˋ/(*>h ル5kv2hP͢EL;w%JM7$GUVfɜ9h?ؼzi=Hy>䬏iUϪSZ˗KŊM3lgX=n>}pzϹW@ zTPAN:%[n H5D#O@ݴg@Z @ /_^:eoy X@-[f~ ATnBzPB@bL nARK@k jѢ͛7q@u:XTk.\X[33:Jg@@L/@ ƌcK.4  [;vQ>3m&@@زe|Wuo[@    Ć35qN  5(  &ݻwˏ?hVbEQFa@/;'C;O;#|i0 Ĥ@˖-hѢoh?vB@@@@z2L  1/@`M̟b:$0vX|Ah:s"Iҽ{w{U^uyY@@bX[n}Q@@@@@W@@ &6#@HHH0='^t9FzE7@ ={V>5k9htdĈ&&|H     7nSN,Δ),YR}ҥKj*s-+VZcYzlذA#K J֬YM̺ӧOK9J*rO7o'NUi;vLnj9sfL[~L,][oܽ:tHv8%Jxq= @v-[W)RcgΜ={uŊ9sz܎Ī3&M4M  &@` @j ۷o7oРT@?.͛7:qĉr^ ["    DGEy[W~8ph{9zy=7nXfϞqݚ5km۶sDs%oˬ>||G7o^?D4jH/:uqyϗv%ھpRBӧJ… o[-'O,OC)X`>}zX{ʕ+粭Bf)[!_,@g[(3, D5th+  <kgIM @Iٳg6m\;"&?ZSkOӧ@@@@@eΜ9v4hd„ һwoѡCY~d͚9o۾}h+WHZd̙;wng_ʶme 40$ϟyy >ҥ3+ԩSM:i| rlٲ$4m4^ 2$>/ҲeKu7fz\_c;f޽ 8k|  sz AUET-[jMA"W`Ŋ橂VP>PST猖!    N4iHNW^1w)o0믿nj/.sMTj׮ 0>ԯ_[3JDŽ;y:wR:~ʔ)˗`oGڷo/j@_ev :nPO%āK)"th=4MY@q6-+- @@X/X?B !!nOزwd3Sx[nՔ*U*$.     7;kU#cǎ5uk&Ok޼Yxb5E.X,u&Z*U_xЇi馛|قh֚P:n(DĒ@Lg1]z7D3b[._l4i"  JF^/zN F}&;c=&+W63wv,={ɰUjUɞ=T^d=,^!@ƚ`(R  }D9 cѷ~kzO|cݤ; @P&N(-Z3gΘzީ?^(P ǡ2@@@@@d̘>Ѕ N̛7Ot|Я5kfנ͖^VZ%'N0X !-ᅴiL6,wk귎g[˃uAzmY֭['3gCq >̙3<wɿ/Sh*rYqKnz~lݺUt JӦMf{?n?~lذdҺFa,bfk4@@ >L/@ >sΝ; id#d4>@:v(.]2i۶ P̑#GDF     /tR{'^Ey}Cef6}Rtid5CzJv^e<͜fq/N2V`|r8;Zl@ h'x0 Co@3f.]L $xW_WӴIV%$L ık")  @rO߼yys5ظqc*&@ J-[&=iM7dxj믿.V4>*VI.Y3lڴI4 qVfx/X}c͚5y.^(PZju5jԐ|ѣGMݻ:n0Něf2dh`M 4F˨Qw{d„ M͂2zT4hqرի{gm4Xbz Ԡ-z =U4Q\Rv!/h @ T@@ &G(HK!-ew G4>Jl oO7b@8H&O{  @>#@'zjiԨP?4]wal'0EZ q8'7A3oh?.y1={V,Ybuy?VmZׯ/2d0ڰaC8q,: A+}158zj۶m͛6m*KzX#$ڷnݺ2 t tX;w[b߾}MP5 X  /@`MCzQ,`l56 ڹsg 8!  @D XQ @< ht՚@7OҺ͛WA@@@@1G}T>sь'˗_ڵkvZ^u7mTtfLطodɒE֬YcI0ի2w\kq3gm4'%S,PT)i߾7N,]tQD sN* N V)[^Z4H2eU- Q5YX ļ51 D>Meԩi:XJZ}R&eĉIf v:k[\r&fϞ=~Ŧ&@ƚ @vk ~J)SX1cƨF-j*'9rTO$_ԇ @,]TV\)͡ D;7󀇨YUl .pwJݺuE\_~C4#[o%&L{YVn:KlLSyW^Yt^{5ӧy & 2י:uȳ>+ǎ>5uDc$Ax{h`;㵎;ì[nVZ5m5poɒ%fδld61c믢!R3&]t: " D@pFXh /IQ~>@ A5r,^<6u!  :   @4 h- z.6m=J$ܰaCIz}4]@M@Zm֭[K*Û޽{=kӧMEUtiԩ*:t0AбcGٲeK:! 9tDX?yn?vl DE٣ 盶kn-*A@` h&/\ R^=rP 1-?XkI6?~}f9!Xl4n8$uS) zӇ.iɠA{I{Lh,  H6mD ŋ7{͛7˥KW^\] %W\&Hex^9sf駟v9fѬ:ZI&&PgӦMc)SK]̤qi#"@5k֔d>G3ڴjJ/_.+V4E=R36HEWZ%7tzRB9ulݺU6l R"@`MJ@^krRqƉ5l5Qzi6U`ȑfիWMEĉ%SLA=! Ό5٦ pNʿdXJlٲzF"^瞓̘1CZl6רQCV^-aAhrk]nhڴ=ڬҌ/2¸ylٲAڵ̙3!} >}X|yO6A4kN52A|F3M<^]tL{6-{Lh^?;wniѢw}"H @zk6ds|ڋU`b׊w.#Ft8T      5@IDAT.: zHfq_f=2uTSΝ;Mv @+W-[֭+%K &vC[@4ݑ[oL       }@ p|I  =ӦM}<@;vK^XCV^l Ċ5r&DFۥKh3D-pye̘1vP5@@@@@]M6u!k֬2nܸe'@3&}zWGZ@@/?GbDҥK2qDӛ,YHvbgt]… ȴiNҥ#FH}-@@@@@`*ʕ+ @'{B`%;  9 !f͒#GִjJr!- @xN>-{̟?0SL&P@@@@@bE`ȑu%cƌN  <gƚ 2bjB@hk"8%;]t@A@ 6m*V2¯Z4hݧ     q$УG8-]E@ X[   X!)8~̜9PP!iذa jcW@ o{[l1 ϗ/|RfE@H\/[Ln*EnAԩ#YdITmg'Z wRbE9sٳ^[lYdݻwٳgE))SgڵfpRD I6($ǎ36V3{%U}$QQPTPP$.DAq38#I HA0%DEgu^Ngtwy[$v޼y)kܸϟ?0'va6m1?ˣjժaDz߰DԸΕ:+3w\SvgϞb ?zM4oVb41W_YN5;.ҥK,]4݌3+LW>/X0 ]XnC @ 6g׾/߸q*T(t>lݺ[>rH޽{:,@@@@ gtÞn@@T &:cFl׿筷fM6sN7L]5ja36@@0W_}խQBeQք޾[[|͞=;̖H`eOPvp瞳>}XZlYUO~1n8{饗[nve\p\`x禩۷? (RvТLJ -@ ~w;@@@r@p`M")!e@@d@X~[6 AqmOe@ 7 ̜9ڷoowݿ袋lԩYrWC@@T/A5 ۷o+ʘ1c-^3X^4eSn-(>j(СC6|fڵ.ڶmIҦ?cm۶/l?i.W_ǻ7xiZ/N2YZI/vY}BGug9d>kwqY=   BcǎzMƚ  @ȗG@S,{z@ >Sn_5A5y34@@ >T߅j_]I-\{ 9qD.^]}.N&M\[=*3Njժ.裏\ `HnݺՔARjwفV^i,?UMJiйJ*;6F@@@_ 8c 5  [ɭG~#@1b.bѣG7EН;t`ۼ]v.SMҥim@@e(:lM޽]Jƍ)RZd chDk׫W|#n1qDN#ԩc>HYkfh$Ppa{ݐ$*O*Wl*U֭[SO=er֩S'_l.\`ʕ͛vSLqׯo%JFY>}\zL#   k2Ƕ  @ &;z@`Μ9qFSV_6S@*+2sݻwO>Ċ-W̸@@bPɓ'VaTߢ|eR-$l^{5[v~ƌֶmۈ9b{zXeR[o)p须e@@@I@@\/@`M? r{.6 yU`РA"'O!}ݦ]ΫGq!  \r%(c8.9sfćWSŋ ՉwYzn-[Ļyg o~n. ,NƧj7#jr}apد_?={)`rر}t]phk׮.ۍnFtQ[hˬu g ʀL7~_~eۻw8p~S{ ݻm2@@@5vϟ?m  { ޮs@ g v_0nw @ х5/b`<0JL  ^6lbK/СC]͛׏(&RJk>$^*Ur nxjK/MԩSMI,Y.rNM˗]v wqGm1s&/yW_}ddzgou9 7`F뮻Νc,*3Qn] QFg mڴqlmfgyf`3U*FEо|V[7؆ l.ƯT7~GS@@ c~G+߫фX+W̊fi3XM$3b5  c @OmϞ=C;vt59wȼǭw;tǞ!C3ꘫV2"Dl Fl7s DrrkB*-Zd̗/jƌ2KdE`ͩoGʕ+gwu QСeQVnt۶mkjղM6sM} , эc?iv۩=@@q>0e]6?7dw3gڛoW^G[QBأ9jG7lw,TPfk{_mcǎɓ]{y4ӧofEk*F@ >PtNPƗW[o޼-jذa tP`چk׮nq"ELo;vH^wW N7Cs˵_+[,>IeƎ  @"im@@r5XSE_Srekٲe.=]E :tn&6muQ@@&4z<vO>ik֬aÆٍ7h]w]&^C믿O[袋nKn5jdx7v={v {n}Ç]pMuj; P@Y~ 87n\m|v38#b= WbŊ[u˺uULʏ?H`MFHO k.% @H@2eM֫WgS)L5do krʑ Ǝk>5lM( @^ػwqܹn8ŋwߴj*/ 1  d@ɒ%k׮ֶm[T=zԆe5ժUsq~Ld6U}O0/_>۷ot1. ?~%3T7Yq <[osBFA+ SQvHůuSfx]=s=, @Ȝk @j }Ih@@kx Y {Z[L Y@.}5ydkڴin}G@8Kv5|YեGyyOx7ʶyf}͚5n' /_,4F3*'N?

;Y   |ƚB E @@'@`M;NƍmΜ9{M Nq= y~Ň.Ի 38-  o IVG$s=:ud4#R +8gdҥKUAw6lkNA veʕ$T^}U[_x^~.\hM4 KtT7l#G1cXfҮ |6lZvүuӮMlNmlٲ% mڵ):z @*Vh׿\#3fpAkH>ݻwrdJ@@ Xg-CS%/}![roժmݺ CL6tX    lڴ7d'O.TQ_~Fez."W`VZ5fȐ!ng[Ge_EviSO |%\LӬ׌.W֞ݻw'#T7X (ot?|6|e˖L7RܹsnXѣmĉf|USZ`޼y7ߤG@ Q@~ɦNhSl@Rsv87Fƚ\|:  |ؖM@]0Խ{05XK|PM:ulCHO@@S. /]}ر49p=o4g[dvUW׵kWkԨQǏ[haj2.h^Ӿ3S|;ٽm@ ܂u֥]4wM7s: <묳G~Uu>}ֺf͚tmbAU`)( \   $&@ƚ @dG#@X`s:ռys;3sT  hzw1]*TO3E@@VZ.肴9wQm޽NHbw%=czD*Ԣc)|VU@Enw^誤͇ i"E\pO~gǎpBkM.tM6nL:&6l>;Jj1w ^j\s)0REhӡCg ͅfΜi n)TS@rz:t]wuh"Spdƍw,+Vp}#r tS{tϞ=)7~ @"ύTy뮻"f9Y"0|賞,q7Jƚ0|@HY~ _Fsz+, @PZ;Ç 4i.]:׎# .l TV\7ժUnv(˟/r+30]`G&MnsƲmf(+Nڵ~=tMoumF[(Ɨ &Xh_o,}'h5ju.O˖-> 1"]6@LL(G?6k,M)Ss~@pƚRJ "3\}߫dXŋi;2"e@@5y 2cmѢEo @0gϞGm >cӹ  @ 67x^uۼym߾viʄXfMZj /cݯ.IJ͌3"6 OEg =o{6=b)N81b  2fTZh^zwٮ]'AiիWϰmbW_}^~e۴i^|LebhzC@@UgQ}ef  5s)d;n/:t%KfiH;4]ҥKwY.PI5-" &;֪U=Rmk˗-[fiLCA@@@ ʼ 5^g@@ 5I(@ F؋2=P@&/Z~wݧm|@@رcB(V hOhc6B@@@@XFA@r5ii &nUPZnӺH@ g@@27n\ƕ(]t,B@@@@)X`v}! bkN` 7>#`vj pzGQ ==>il+@@@Æ >B EZr@@@@&>&tv !n @1bD`={ L3d'NX߾}7t3TRaia|sxnդIn`6K@4D3J,ip ^.V5hUI{)~3Z믿mڵgw9k֬-Z4s:kz3ΰZj.N39oosȊ^1C ~2o  @^ &IƁL`ԨQUVs;F89b]t'2oi@@@@ȉw}͜93l$7򗿸@Jv.,tqk֦LvG^x!PpEL6^ovɓ']hǎk>ƌvWw=~j~[E 8 >/xQLO= 0}gmС1mdxbkٲetS)6i]v5̙fܣpw;wn9ru796mݻlь>|Lm׿zW7p mCc޶m}z/+y 2QpPhQPӬL=dYxWlin{ﵗ^z)*H}9g $GKHL.HUB@ 䆣D@ G bt_2+ 7`_~f"E?뮻.'w!    N@BBѣ.K.?.W\"ewqDIAr-6}tSeriڴ/^ܾ;5k-\~6lh 6k^s -\]6a„4j>Z`M1Δ-[?sdϢ&62pLGDEoCYG> ݺkwyg誘qkX`n?E u35׋/ ٺukXYf| NX%K ~V6ըD R~ׯ)`EEYxFmQLw\B4XCگVZ`{ m#3жϙ8̑+2'@`M@rs; pe\7g}@]v;.yn     @NPS0F>}nݺ  gg^z/iZ+F;鲖(GMD+F>ǎ=b`JǏwkoFӴ>%F&ӭR=BKmҤIv2RDo 6Qaܸq.#^+2uq^e8/X ]3z(`KEYW|tg^Fgy"~> rR^w~^Pp%R2Z^{neb3fL sd8?æ/: ω0s@f{9{tI̍@@ yh j}Yaw @D_~EA5X    @@;ƍ]dv]m*xGeȐ!jRJ=eQ'\ nVw3IK,; *P2|^:I{(-T::ztV_~;6Xgh τ_ +W.\l]駟)KMꪫ_ϖ~et9Ήdr@Y @`M$  K%n"@w@Stw[n%u!#?/婊7n    v˗/Op3ŋn-涕 bŊT/Wq $L85yEY:uL7T&U_Qpa{zk}oM>k.sMX?Cr_7Nv+M嬳]G_;ΉyJ =ebSƛ6mXʕʴSOYp`B0ܯj:ur|=\tC@efʨL2eI_(Q5j2m߾=MY@B eX   yGs, d҉o۶U/_>{@6m侌wfΜi^xaS@@@@%>=z4*:t0Zgm۶u}M~yV,x ?~gnpL4)yO ڵkZ?r͙3'ݞ-Zd{u}pHJټ@Q*'OvAnټ+U}mJDYʊ<)ގ;\GyĦNj ٳgM6{1ݤ2yÇG}K,-[kfk׮u ތty{uuFi+Vp֛oi "WC< σnO=@@+@`M=vN#=ٳg` @ Y}pqFץ>f͚e{nN"@@@@@"0o޼@;}wuHA?/`;x`uGt}f륩ə2@ܹ3{Țut|M\;VM׆2w}ݧ~:ssZnݺn_|EeQAD*"reR&DJ,xǙs_߇]s@f{3ecRرc{RKĔ.].\hw}wve dPP~Ϟ8q v+/ ?`jO>z޽{wY@,dE:  @(7Ũ@;L־}!#q |w;/%ФT@ț'O Lw  @w W[`NeY)rʬlȓϷG}ԍMw#TtݻVo۶]*U ,uuV@ Y,}!w}&vca8Te]~n(/_v2q4u~'ꪫ"vڶnݺWW __"eArIspc9#C&9O GR0[oe;w nQF`QeR Tτ|5jd/ QzǎhѢCН۴i8O5l]tb@i憤:o  d^70=( 9G`Ŧ`]oڴ7m]/_>7GժUí2i?lٲ%0H`SPˌ3\Cp`⋳HҢE +Xn4fY '֨ Tj֬iVL^C).}ME*ʕ(Cns=gz?ٳʖ-za;w(RX,#Qf wGg`)e"RUϞ=#5'D;p:0+3{Mf}9 $rSP>ěo9 (Mݬ5kn(HUSj|#lTYrJsXexW 8PBnN}@@\,@`M.>xtNVKFz<#!/gz;x۝>\O}}a  kw @@>KL6-uoi,7^z[vHcǎB(/"MUXQCbQ_'OjfѼ.vw9e(H4{.>PBt>[6jK/MW'xAnu+n&7ٳgV)bW_}uPM^J@ 2e{m|nZY-t^/z sAh=$9X"-O9Kmg}o,ϙ6osk|].9\=Jێ;2(;tjZ478h-1 X#@@<(@`M< V@j+WviƳv&/t=}r5׸;+V, Z@_(8W# mzlv@x4ieРAn23;S2({_drFB/ `B3?-_vi+Vt Q.*V jmD$۷`gwy.̙3]@24nf͚F~.c0ƍV O PkhZyS[Pv=x H7{'m͚56l0-D;9笨/zV9x{>+g¯uUpE`uֹV2=2*?c WFuY@5L# %@`MjoFI̺SJn,_|Ih&@ n{rP-)k͇~h \l Fߩ1t" CX@ g (>{^{ [ha͚53\JwG~ejnݺVfMw}eK5$ &=V߾}5,T`6mƫQ)XI&  Z zdtvnvV>L'dɒֵkWk۶UT};|d漓8g%8^缧LeT:_7\=eEVw/Nv;'뜕~9U^u>Z7Mhk׮9~}> *F &:CF@#@^  @PYiU?|kذa[SHקOv'g 9Zﷵk>9@r@Ŋ_ތ326~=N:Y޽Y 3Ϙ,\ДCIۋ+>~*Ww TPYrJ۸q9ȩ#3euɫkVZٴiseJlޘ1c"f@GْttTX1@u}n+Y"ΩpN9+ҘYwb9i5jp6l+Ʊsϵŋۖ-[؊/@`Mfl kʑd - S&[ Dx饗twW^ya.fB@<*0oMͱ=XG  @JKQ2H@ I#Fp-.VݻwOR4/#>rw;.{-@@ w@n9R@@J@wWsA۵kWćMB駟n}u_xo V̞=5jd;w +ꫯvӾ(L2agf-ZpA5ZeqQLȏ={D'?~<>#Gĵ[6!^Rnݺս[2 }j߿?!P!h|.HڵkT#d"ȭE_ftQcT>p nH>x&+;8>|8qP|Zqʊah?ynի:ߧOG-sYg%fݺustеk֬ <& :G Td(.\8JMV! 52#x@ tǕ+VEGnLe84*׿9p@{'L  @j et֬)5U5 @^Sر#0y뮻"gY!0|kiD ӰaC[d={TEHZ*s_vR}ݱ?R@Mp; X4iRNb:5e Q\ҦM{mժUa;_rIYuZ@|^w^ sVVC|v=}ɫC`;]8}&l,l,C5\h]tEָqc;Lk׮us(&#m~2@@xL<{. F> B@iA/>;@RW 8cMRR# @p)RNeY)Pxl>^'N'e̺8_tYit̛7/жQ 4@"F; (Ф_~~6O>pʕ+]FϨ({U+[m۶o1*Q,Gqit)IP_Uf?~~Q>gt98ge+";1{lݺ =ݠ>Vˈ#$M(Gt?;o͚5Ezܹ_3q =z4 5 &@@ &%3D Wч|YQGxt/{ܦFwF2      f̘,(#G2.^zKL5j԰s=2 Pd#R{mzR"(Ad7Zx #ҢE\+j>RpHFbSf^KÇ7=b)^3l:믿n7o۷,Q*T5kZժUM2•93оm{9m'xYOٳ3q^hmʊ'NX LHz^߫2mڴV^m 6)ZN 6<5zmQ@@RG9֌2!(ݵ^;Ͳ) >֗tqr7ߴ?O1mO%@@@@@ (Qš5kFi  (8VZ"+ pJG‚$ /_ZlboFߗ*F  cM25i @]Eo@ Db@IDAT 5*g3 %p1wC5@Zݳ @@@@@ :vފ+f#FHh[6B }#rw_Ȧl @BdI@@BioƬm#}h׵kW7n[cƌDT 4     @ ҥKǻ r5kwgW^yeP@L *T(Sm1  @ &w/z@>ݻw=wt/  Go&OvUH裏]vYkG@@@@8Æ Kh\e@jժ I& mF $*pm`@H kR03HȌQ#0 UvٱOv &W_U]@@@@@"лw@6lhzP@ k .L@@$@`M i] UVys r뮳3g>,Y>Sk֬Y#A@.~[reJ+Vի[ӭ ^qF矃E_(Q"CҥKmѢEw^ƍ۷VZ?|+SL`]O^b[\N+W\hϟo'OZjgv_]O;4۲en͛7U4*US*gy*UM+ڵkݴ~(9c=ޢ;`.Y,X`Ǐ7K-Z4MS۷o~v.4"+ ]fʚ5klϞ=n6W^^cKuVX @f͚w}8VSre7|E$[ڶmz}+|;v,ܪZwҎ4py/G   X{ ʜr\  rq~sҥ 4#IM6 UtՔ)SCD@p/-[P@.0`u<6tаۇ.7o^u xG^'Nr 6m _~ rQx ]}`رg*s.aРA]D|9rb(HHW^GƯ{^r={9si(PBjyֺܹuk7}wMW֩S@=?`;.gw(u(#b_ we)X&&P?-Z01 .C=/첀]h=S_Vڵ˴]RlYի=cv駧c 2ծ]۽b)_yJhd .2op^{/xd@f{Y'D@@@ ' F8*>/̉O   &yyP@ңG?3 t]tJ?wwNh@@ եxnB*f1?C#E,+*f6Q=my-]Ve8iڴ2̚5.\hȢ,,,)[TD zs=eiq3 P L,_OjOhRZ5_-b2vw3qM6O? y^J*mNẉF֮];˟?}gaRmh? V5IA5*~hk,GzMp^|Ew<묳uG7z/x˗ @RTnm@c $EWe[~O=GBt?+y/@@@N… gn  @ &9S@<}sC!Q@_ݨ-[ubbw  ov'njw}M4(3M>}Hݯ]6h 9DObwy'iow}4YO:X3sL;vX،'O - PfQ{^p?lz ZQF/ Awq lZ1JF?QP/l? >e:F [)PPЕW^o7p;NcCF5J 6=O4~PAu?`eQi櫸ge5jV@\P&!el۶mmgT#o}SX1g.-,X ><(]ŐPa fUPf>lS >XoFQ*X8_@fAԞ.V裏\S ?~|fj*\Ym|P(cذanoc\,19Gys1eo&M= n݄ *^◹~ "<D@@H1kR3\@@ H &@`'T-O) @tGkլ^5 \Tsy%{W  p嗻-_<=?2hv[m+2'(M◗,YҚ5kJ\|+V$>ܯ%~;<… ۃ>6$tիz5erҭ袋U%?n4e{uV ٽ{⭔@\f\OF}.RYdn'N QZ7zL2n?HdLAz/U\inڞzꩈ_:u >e \rּysm,CmϞ=HJ(a5rYߔ!   @2=!cM24i@]Eo@ 6m.L4h`uͦ=H]覠 VZ6sL;sRq" )-࿘_& C(PA|Y۶m]u@_ުU+|:u\Ç.EX7mԮ SPʑ#GlΝnLӧ[A<&Mdkft_!e[QFТ7iX{9+y >\\uiΊeݳgO`: >O6?;-Z0eڿ}סՙG d漷cHNzN6͔9JAy^ټP \˖-M֮]k^7pY~{ョȑ#ݹQJo(է    K2>Ll  pj95rѣ=$[M Hƍ]PUj׮jj֬  ?n|Bb_Gz6 .뮻US l/g͚zi*$0}`ٰaڵ˵v@v ,wO?(oL11~^A**T=u*q{+-[p\qIuo6x2x*Oݶξ &IeR2v&*~ɂ re 9fϞmʊ6vX 5Ĕ.]ڝCڵvD\h"8@Av+.[~G\]ab!   }DA@H-5\F&0j(WQw>ԗ@ YP;n۶5ƾK\rvA;  9XСC裏ںu\/uH姟~ mߎoLRJ6u֦@vϟ?w3V&8})E8aÆ@fS|H*UL'( m޼yW_l m?_^ziI,#N:()L2VHg^~<'>+ϓO>麦뿷(M65gĉInzD*ʼ ]"<+9^Ө_ou9ny/K2\rI`}2+ۖ/5_|(~y~CZjnM9p@S N<`P)  d,QVaMՌ\+W&AZP֐&C**  yNlltJz/+  G~S2(Zwyرcđ+g"Ќ> Ҷ+/3fh^/NjP?XNhswk"P\rv]wAh"O\˂Ԁ)q3!?:e7Fl}{{qk֊+fر8, j\ ^YISÇw'Ԑ %CׯUVErO+iҥu%jժ1dE 2(O﹛o9ntYV-۴i3&b`M߾}mHiEh`nOA5|*K~o(/s 轡mppi0~@2#oȻ P*@@HDa9V#nݺG Xn*]tM6N?@@rZ.2O\Dyݱ!xyiǎT-reP`d,3,\e_ٳ=C,,~>|]qgId_ xm%|)h&R ^>*>j޽.8Kԗz=)Ӌkt6YOGJ*eޤxvmL0M*@RNQ ReEQV^iD 6obo|GtΝ ug. ^[:(PE7)QQ0.U3qhz߾}nze˖u@ '@@GΤm}O[E@}cF@ eѣtJΝpo4"ZV_uCK?BTy0N@Hi{;EEo?>??4CSb ]Qi~#)?%3[Mޛ .:YƳgvݜ?]{i m۶%5-͎A  sS5_놫N[߾}WVZ,D |T7E@  у!@`MjgF Di@T5jT`ݻwL3$"z_}9m D4@>ꫯ(peIX|_P/mۚ?䠠.=p*3~ IQV-ڵ)O?$KhkTo{|]_{]xVD XL?-M6꾮63.I"M ^U0(MpO]-b?֬Y30@sޫ^SͯuXvm׌2q}>p2i@@HMG &@@ cMj ?U+Vu!MXD۴icsuJӅ]荂  \sj8m4{L+?-B>3٤rʑF\n"n dɒ.άY\ >FXE[oݺ (`<+˟g9r3ƚ5kЮtgaÆm%L2i)СCVx4q[lG9sܹ:wW$m_7P!~ ѲPuy#wy~tf>XFgy&:?w@J zA6l+ƱB2e.qlJURZﷵkצG@ Qe׿61cFoh?PN:Y޽C3D}. 5^g@@ uIcH@ ](/Z۷OwaK,]'l&Nh ڣ   kYFxIy^r= 2$l'NpYZ7on:zjҺuЪIW6%KؤI\0駟UPz ӑ#GL ,}FjnݺX|'Gq\׿6(XꩧJWow^P("|vA;^*>O(If`l8:Eq2I[͞wy~q>+ }s $]tԩnq^7k+(@=[l}wl~z;w[OtZѣGUlmHy晲iS@@ ~@~)e-_~rta/x @@ȗ:Ce @t}AKn$ @\Pj|PMVHe@@ B&Mq4(xk׮9-z- a={5je< O+ꫯvd,2>k[>DCl5y,_ge+ 6wsre(IDN}ꪫoۤk׮9t:uy]w.~0LsE_WgoGJX3/GM+peѣVM'(`ITn%]m޼ .02W֠HE7DPq2eJj /WT0tz ͆$S M7dsӧ~uN]O|3 ^TX1]pRp=P;ڦs3=}=ޓ>H*R#t2y) Ԃ LLn2]t::O% :{hѢEƍ=:XC&@nPޣ{mݧ O 3^p߲bZ%)kvA-n ̙cİpBо\?Fig}v,XjժZST)8)ʄTjUȵ~zw!oX) ԩ_%P'Y2qDHD3cnoɓ݅TX{ 9K-[f|A`8 T1bDL]J N蜹|r{߶YfoNtdyF 7 Kу># @pu# ~aYV (;0%k9@@ Ih@ ѣktQ G`ڴiN>Fw;v,Az R@C-Z0h~hEzd8x-]s(CD+ e ڈu]MpEO3=)gΰzcx7GSƦÇŋĉ.sMFL(P*RQ=(Kaʦz ~(&1W]HHٺuk̛GҨQǐFȌ@f{W~k.sW B Lgt.Weꫯ,l6mիWTV"rS4=!  "X@@ &7E0T5**U2] S H][˖-@A|.Ww"  )=0kL  )#@`Mj>]tGr@ g}f 9z[;W3 O4P  Y;&461"m(>H;OdSA@@@@ W gFY@@ )\FA,0z@uf&LW A5;wQFT u  yN`ܸq t mF Y=NW^ye;d @@@@r@p` kr  @&$ #@_ln5kִM{'ZNv-ȑ#x-@@ ' 6,tBl mԾ}{ZjB6i$@@@@& &@@ &e5Ep~;v̭ڵk*,CL0({GPM%f@@REwީ2\;Ά @@@@,P F@@<)@`M< b3fL. TL5N5=zw}hhC@@@@5﷕+WoŊz^dqFmnADVeKڢEl޽n7zٷoZ͟VLЉ؊+:uXrB5{n[v/"E^'*sUP!P'x]`a KTnj۶ms+Wl5k֌Tվ;;|p`˗/,Dfו^_pVF +_|ӿ͟?ٳǪTl5kfE-+Hu͛7:e3ϴRJ2򜀿@#cM; @P yU`6k,7<}}ա2.H]aڭjNL_4%a4     @ ,^Zlv? wj ]|gC>ty;r?Ѯ(%=QVڴZG|"K%,{Z$Z}g9gҙxLsu}]{Μ?nݺٳ#؋/hΝKR%K 7kР_ߟaڴieܾ}{k>cw3.ʕ+{=+~n޲;Ww_oc-[… Ԛ`*M6>(ln`5RPPJxꩧLTJZ<`[|yn@֭[7{]OF~fȑ6l0STpQP^Ǐb~?3VT)S0d+WZ-\'Z^0D !k4Y2$)g  @5 @" s}ȮY) @8jɰ@@@@@ ^%_|nzBsAFg̘a3g ;u]Z\]DY`wn~]pvuYz8iE7[f)2((Qj֬i >kTeJEB#)+2R&"ExB>^wo5kֳgϐy>}ve؄ \<`Gvk׮mP ꫯWX F@7"}o߾aZ?|&G  0$̩f ,0e&k|, @ٳ]ҼtW9ݙ     @ pxe߾}#wLӯ_?:Y ڢ bY裏|F7eC9sȑ2loҥn8jM?DST[޼y]6 "VZ٤I\*^ΛҺu]D;fe)Zh_C%C= \sՌ3U-[f*X@2v]wYöD МCesJ$  $W&Yg RnV*^{m0!@@@@@@J..RaJk._ȑ#`\rʜsos7|c?h+suoٲms+)Gn&E/*=)%2);^ޱ},5jTٸqc{׼]xFz?{;lڴiZR@b ֐&=E@$@` HHSM  'TL5~>,"    $04h&"Y}YqFg)-]w/^5WP^@SpFsι B2衲pB?rjɓ' <_̙3S{zAA$(e @rm>H)C2}dɒ.E6lذ??u=쨟ueʺꪫhѢ֤I[xq{mfիW[Z\֫$/ $@`M$@@ &13Dtݻh&Hd9sXnL_?޲eOD~]0w@@@@@\r9ӧO+.Vر)&Eݷn5h7o76 =?M6uACy'N'|Ք_HҥK#ו ~m)Je.ʭI_~.EkOU_r9<-Z0s1[dv}%ԩS{﹇nF3fmݺl2~jC^fĉa57ްkƼP Ԏ5iQ ğW9eF M|w9W]~A5$ܹsk׮$Ig     )8{}2 +ya^4PJosofV&K~駟m^鰢իSԻ.*MB}R~},7vۼ:raeʔq{ݻ7ю9\VUHEʨ! M@^>3<x[b)mڴigR? )TY =zl7vrtk׮5+СCC;d{Wq_y;~c&=$ӨUoۤILAʂ`/0k=_yzVV-5j Q^| t +KvUΝ;'0PH5=  _d6 SVJ @@ut:oz-{@] :_P cg dU_   … 9rĶo2(+ /`:u ˒3gNSLRlـ*/#A2+ʐРA[l}5ZWkdɒ]uŊ-W\Iv>sL@QoCR\p_pٱcmڴmDan&O4cV֭3B;sn^zfYcʕ֧Oh/eQ`NZ (Zs=.FrM6Mv zܹs `,WMO?ɾ^-U(FAz:gʒV !Ɠ95֤F  @ X!@}xEKʔ(Q"Bk@ Q,XjnVoj<@5q2%   ptR~}={+V,*`]YRK8^Q0J4EXtҀݽgTͻ*W{eKlޠ {9⺗F+ˋWTb_~)(FmP]X*X+1k_i-Y=vwl_kj…u5}t^ka \tA(z~ڵ#gW_fMvRP֫|'O+X8q:ܔ)Gرcַo_yg]U"EuA ?Ni?C@Mkb1jRV{e/$z^PM^&&N2sA@ Ar6mdL@Ư^UfO=zVXᆰzjkٲep;.Ouw2"Fm۶8ƌczVLӦMQFH  p7Slݺ)s?~<5ШC |M3gNA+Nr=(LymC  /Vl \tو@$.2D@Ol9-f$XfK7n.⤍؂ #/:v ޽$+"    FH"6zhWi$Jl̻zQwe*T^Rٳn:۷oŋ<+^fo='O$SRfXÆ z(Շ,TxY-R ; ʕsAj|g"J)SG.ym#vJ*zPB\rg!3X]XB@E5r'ԩS} +[w]v &T/ f @\ 4ȶnsa d@][wٲe^Lx+ХKӧO0sr͚5͛ے%Ks :nRNt[ɒ%5 ]5 jg/&1VԩSdžr:?}WRZۼ,ݺuKniny(Kn8{lwstZjU_<PfE ?lĉ6eʔYLV;w {Hka***Wl֭{b/":59rpYeh ľ9d YeڴiLr-`/ @< ,_ڶmk^NlҤIcx %j*/k@tK.Z(z&Pzu @ 2(6:t.Gy__՞y9rd~ϝ;2dϞ=I}&M /t^͛7[hmn8}o;tfcBS@P)ޮ];W^@}Fԯ_7n삜X{nkf]UݙgY+t l{N{_o믿5jݱc\m4rEI'Oyޫ 6Qvn cMH6"  #?1QF@߿ .M71.b ];>u? @@z!N@@@" (nݺ Bgڑ#G">_|߭?ëvVZvފjn& * /=@-lRO!K֭v.\0I()HG@~Ϟ=;wn{ꩧ!5c/Ҳwμ-^ ETw!xFT (pRe۶maMLUgOyTE/_nְgϞ.ze[lI҅nK^`l@ 1\C   @ &O*SBp+J#OA۴icGEYk*gΜ@@ .􅵊zر#B@ Tb { [O!zJg1H t/e fL2ʈ#lMyL5Wf͚?~!\@'.`@ p+ U%HxvO]a@IDATP\q.ˋgO׮]M:.01~xJj: |uOjӦMb;eXoǏntndR!Pvmk֬ n6ʘ[ժU])}&La nɕ+kށ cǎu7Q\v]s5VN^u ۺumذn 7#,@`M  @b XX"Ҍ3ɓnI#k֬VZt]u)  @g)X`Ly  ?CH'{5 2R _|=}#"Ю];ꪫlƍ.;DZG(FYt,*Te@F5%kǛy\͛[r_,X.6u{%Lz(7wӎƑQ> QpךiygΜ9.(Z;=Rti?iwygR@Yk*RiѢW}76}t_sM06ӂxL[oe~{xwnH@r$'D=  ev ?+wI}^@\@ ŋp;ޙ3gZܹH"     @ӦMˈ: (C޽{B~z/ʕ+_#K"Ν;'{%Kmhƹo߾ ϵyLң-юY[lY ]F+eϞ=vSbŊYٲeTR5(EY@`ŊɎ"U29r=놧5jp?RL$?m_ ѣGfw͛7}`WB˙3gݩC 5yD@^?LMC B@wHێ?{7ٳ-!p$     Y\ ֨Q,>JY *W{d19D袋Lfvɖ- Q0  &$@Mkb1jHٳgspW!@ lڴɚ5kfGu3l޼yv>     USNQu'Lվ YW@y%{"   "@`Mh@ (ҀiƔ/uV馛t_/(      YB(TPT dm2d@@ &ΫԩS}֭o_;vtrS}?43C@@@@@T 7.UƹryF@8 cML D!@`Mh!Μ9 Vjn8Dj7/^l )1n@@lܸN8=wvE]=x?koV۸sN[nmذ)b˗͛[u'O Xjռ]C>o޼َ?QF6٘+賅իW֭[رcv饗ZŊQFv75eܽ{w)SJ*)nfz*RJ}uz=:/^49sWڵ~ᇀmVW1U|*{i}ނuϊʖ-Uk|, @ L67ݻY@Ѕ`7t6]&{aaI0#@@x0`-_<4ҭ[7{]@Cp#ԯ_?xs-[… C}WֹsgS@DpQs=g]ѣ_Eڏ?hcҢE Sj&L,b(iȑ6l0|`Ə﫚>}w}.C Iik4h-[,d;ּ[֠AW1+o y,oLsUرcCQ3u ׯ_o$m}Y{饗v(&W\(;ІbIn> Ybz~ݫrʕb'Z^2    $Yf  @xkP1,fr3]Y[nóa I@wn֬m۶5EbK.bŊEڍ:@@bZ`.k&qid0\Po#\)QDLTL2n@s7lД-R D^QY=zԾK뼪geQPI<` R]P@۷[[bEPr۴rS&z}6!kק7Tl+}Q(W_5x%=ǬL8}2i25(KVі9s];t`ZV`͈#v0GM:5I`i<Q@ (S]wscp @@@ kBe]ΐ)  @ȖF`@t>}nݺY@8q℻NwVEOpt3If  @ .SVne.YfM NY~oŋ' Q/]t!C:T`OӦMݺ<[QhQ_L/jTٸqc{Q?25*IPU c=i}ZQѥ^f5y(gy7_tn4-eQpET%(+ʬ}vj\D/ϣ%M/b   s\?l  x$9gĽ3glnVZ &믿Z6m/pS/Q )W\Q0_@@(Gz{ڻ뺻;-\&Pǻ+V0xmu'O>ĭzm|d7߸C/_>#}4| Gss]s5VJS"D*ݻww~,Xke!Rxȝ;=nZ>)Yj>{U}檌\rh† fG~'xѽ 8Ю*L٤Irg .tYWnܷVZ. ցZ   @t^kc/@@ 3@ 2V9rmo׮ɓ'I6 @ N:t>MXbtRTRN#  NrtirZ7.VS՝Uwk׮ǏMXJ * 6d1kd4<|MaΜ9n muL:mV˖-k_S~`Ο??U:tB#آEL3ǎ%KlX RԩS{﹇Bx6fۺuٲe.VY{]'چ \*ogf@@@ xkbR1! %@`M|Of#0}tC׮]}, @ OH"+2' @@HUVzQ&pE3/_c 6m{oϠb *dk֬DG.ͮ]Lv T)]4tА2^}UwW^yc}ftq| Qvm14h 0Q`H(#ѣCԩ;%Jv .۷JΝ^xwp̙<-[6d2e4mԇ^͛7)SLk:wlɓ'l+V4]OA -js Q~~+P {@?7EA|PE Xӿ]kt : \eSP5 ω. rD50@xM į5{n  kRDӧڵkW2  û.Rfn!'@@H,YЃ x ;ZхԽ{UrLє @>[\7+V0ɓnhNvh1AY2ugP}ޠeeSv˝y "Qe-[f &ŋ\tFٳMَ"y.z=.XuI뺸_~7_QfΝ2dHaR@<.E?#٭]vĹٳ׬Y濃.W {ˡ;`. СC^S((o߾n?EEt9IP  @@Tw  1-@`ML>gϞuh[|LwI @ B]#Gwmܱ?;f  @t :tYd\h"SPk?~\saׯ} (+W\aʢ#(󏲍~駦, E*wmPYvGG DA J, T ^e.ʫچx6|Tm6~ӦMGrhɵxP 2R@@ ^&VYZ5{'R { IX2d/# Y]~X?~ɵ-^xa!dM}P/e˖]}Ys @@LPm8p@3fY M6FӺ(.zVLjxz5V 0af\r˶g5jبQg%Çw)6l`իWOKIs;u.>[xeRweeZR9sD Q׎;\pW_6 ?g$(LymCKm@/}5͢ &5A@G9X|>|(FP@ 6t1aÆٽ  ׯo76]1tt )Z;瞳I&?l.?,\(?|dv/ݻKvT^>]$K;YA5*9neQ`mܹ֡CcLiQQgr̙dF#\a?n 64]\_ԧ~衇7,{A4} P:_t'̙3s8y ۷oPV_bE{LAE}nUW]e˗naM41/E_ٳgþuΜ9niӦ!jT={v-G^{-S@ Pe۶m~krUVmׯ X&+P-zW={L:z/իmٲ%IQ-#GLRU =%F@@@@ cMbwf@\ Yf9ɓڶmWc2$XݣGEkg}6Q<@@H7-[Z͚5/'|B~m=eхx'XNl߾}lʎ6ol-`Y*Q"hB FjӦM"n+CVpߚTtxn2qđ5cǎu+etٵki>*DCD>B bRV .m&u_#F0x:te>RcHUV6uT7;wFjJ +Pvmk֬&A+Mǎ?U iz/Q6q+[ȑ_=}Mk׮kԩcW\q8q¶nj6lp'+MT3zرȿ  QJ* >"\=իW'GF>@@HDv#3wqnBP@ VZ.8}x޽W^I0Z@@>>0o1J@@W`ٲe)PL1RYPbŊ̙3]_ʄLEe]:#KZY_^{cpA*{ٲeTRঌ.1h m޽ngΜqcָ (atM6MJk%YԔ>}))^/bJv LJ4B (.ҟjժ_mGqΝs)S& bѣG޽eI˝;˜VBi!  Ė*b  @z X^E@{عrJ;pPP`?~^w4]    @ xR  &@`MQs Ho3gܹoȚgΜnݺ/bTSL9`F     @ظq)Cɝ;]~vEoNڵklAVʷmΝn:۰a)Rʗ/o͛7yڨɓV@Vo{͛75j$Ub~V^m[ncǎ٥^j+VFم^:dwؖ}gmpYdc˟?믷J*1(࢛i^9s X ᇀmVW~ժU:uX}ނujٲe-[عs6B Գ@, ٳN:冬w*ݻU]veV`P؆@ xk B@(@`MD*@ + {nxmǎP /;u]6o}w}.C Iik4h-[,d;ּ[֠AW1+o y,ohin uz;vl7*pnݺ^ߚ 7ܐ>k/ۮʕ+yڰ@, vmg!+PL{U\ҽkyĉ֫W/-R{2)f  @Dk"PYU@wڴi>/QDV*Bwuy䱹sZZA@@@@@4(>}eIQf?.(EY䕱#\wl2(SA2e]bŊYÆ ꫯv D^]`ѣG/뮻Ϋ xw Q>YzLA*kvj}vSpѷ~k+V2T\9`V8`J%$m(}u],L:z-˗@UPeR]4+#Xc֍t\i/y9lԩ֤I CF@@@@@ k (k &M~={yzMn{ؖʎ;LYΞ=2ϟo 4/ ضmo2(K >ٳg7eIՌ3dHʈ!=7u׺Zjm壏>2?ꫦ`瘕 ^z^׶o>S }֬Y.3^`m3g۵Ce֌1"lw Sp 6~3ez ou]ws) `jΝ@@ %2ā]V@_2_r]t|     S@++ȿo7 e.YfM駟vA5Kŋ' tbC W=M6u^oSPFѢEj1%V; Qeƍ^KF?ˠ3jԨ$A5VP=n:ʣn7V|t饗'ORZ<ׯ7[)X@y'\Q2.)G_^Qf%۵kW߅^ĺ~&@iӦt?&* T  $5wΙ11/^Zj_sbģ>{}S9rdzۙ@@@@@HeH}]ݝwi2:76X" k 8|[zuoq._|F!]?Yis4Y1͛纻kJ*,E* Tw2,XB: &;wn{ݴ}٨Μ9cxӪU++Y]r%֢E 6l!~'xѽ 8Ю*L٤Irg .tYWn7]7,Xk"kXz;@@Ax8Vӹs=E 6,Yb~y8tl Q"     rӾ.,]t1HMiӦk }Y]׮]kǏw33&ATpmxc (ixÜ9sܪ,={/"lٲԩSfe*rٲeo2q#@eSS5C,d<-Z0s1wʆ,_ \N:e{(+ԍ7hcƌ[-[2iQٶ&Nh6lpoa 2uR"Lg*u)ه6  #@`MKf@t)aD/݉o߾D2~Ɖ     @ Z7eWt1>QٳǭȑR \rvW\mK6e!ȬsÐĉ5sW `ȑFY:DI%kRGzMz}Mxxϟ>|8xߺ2m(S ~Wkᄈ]ڰ@ (}3Ϥjz<)M3B ٚ5klѣvk.S+iJ C nꫯ+.ɓU)GG ?HN@A*EA@H<7ef,殻{0~i#\QF^z떋+2|*RL46mre2ۤ45KJ7e^xmر.Â01!3R: /Оz)Mq.Jղ|ڤߴS^۶ms(E߻qT6,D7}+P5hU)0ꢋ.#GݻG}ds56 ,/#Fp?eIn?iT|̀ۤIL TSܯxw}kժeFr6@~| UPcyEڦ;wO=+ 2bQ9h ` ePFѣGG޼yM7Fy(QDLj_paDA-۷o7eȝ; ϙ3)x&\)[l*}ԇ^͛7)SLk:wlɓ'l+V4]OA -js Q~~+ = >e(" ߿Au5 ?]P׉>UeSP5 ϩm cMjh ď5s.  !0k,< QyЗ_㝾SYB_P@@2G?cM   o-,Y$` *x7;jER;TUm^™3gB'aÆ.XO>ļVXa Zɓ'tMuU}VʘpBSFӧeeSv˝yTˠD+;e˖(i„ xb7k6G~6{lSHEީަ \~3e UFs!Cj6NtA(nڵ#qϞ=^{wPP`ֿ[@ tgeQ}ujY[Tt\MH5)@   ejětR72epx;'f% }ɡ;xnm 91p@@ KA@ xwTמժU'x" РA .@ 1tP7%eQpELA?ӽ]< 9rpv-4iĔQ%#JZF_.V|I۲e7:t`m'Z|YnC}|6~x֯_?˂qS6+”EIAG Q:uا~j IϢ,]D Q@^gڵ {=z5PPD(Yy.S-ovj^H:m~/jJpmM6ɕ%זz<k< @@ &1;F &>|U>dɉ0hH@)%PQo}a8:SA@w,70 @ (F   m۶ u6fӳ@6mj5էu Q]]~|xy5ViݺnDv\F 5j2|pbÆ Vztd_֫Wmԩ Z[xeRweɖ-?I/ʪ Cs̉XwႻ$xx7t?#(HMEek]j~CtXG Ydw  @\dY0 H;XIƀ=cޗJ˽pB+_| !"      _e=PNlٲ?'jY۷~'ꫯ\WVB  ˦IfӳgO!3cEqYrtХKJÂfTΝ;g/NPP]ϧzʆ Mį@r\۟y晈-S̫F0*Ur-u *$ȕ+W {_  2[)l$f}ǎӥ{ϟߔ9@Zjժ~{vnl ț7xjժ3Jw$ʖ+J*np8ݬY3k޼-Y`V7ڮ]\7G+2IBL?{){ĉmʔ)3yv؁ߚWzrʶn:ۻwo}# x5j5xFA@Hk\3SbZ@Ծ۷ٳ|<.kٰa4˄ iӦ>-Ə ĴU/90x@Η_-Z| " PzuV@ ԯ_7nl :tW`MѢEMY^{94i={|16oY: ws3;[7HVwv |X%g]$KYcVPJf[`X~z;wu!RA(K3.nԨ=#vQw\kRLDPP~&( /rz\7|2ըQ#V\ymDҮ];d@@x*cy @tR:t(lÇwm@ zjkٲeL hz/Y}OZኾӅx'no>SeGw}g7o?q(QtJB\N@L\di&ww2$(hEG~)HEw-GPZ3vXR& ]v棒'O!\6GVALʊץ.#`Ĉ/G*lժM:ΝD]5ke g(2}VjU!M%˗/wrrmz_S`ڵkk:uW\a'N[چ \(D#e(  %@`Mbof@L Bэ]xC^ dӗ]zm      lbf͊jd7pCTP@@ z9sv&c@@ aISDM:$51*~m7 /͛g+W0l@@@@@5vYRvݺu|4nܸ:`'@\ w>ӧOY@@H k<3KbR`߾}n:7ZjYҥcr XЗ6O=zllĉV^X cF@@@@@YHO>4] @ &˜  k ;E̝;׬cǎe@ c>߿ /r-u@@@ ~'[zmݺՎ;f^zUX5jdX\O[vm Uگj{T̙ӷg;u *kPdI+SURkqڵ~ z?~;t޽;E7G٣׻\D +WΛVt: U_ ]v,X0T3M}F+|]|VJkڴi׎њ5klͶcy]DȈD7e   '@`MSf Fh2U?}zl@ |W֭[7;{#x衇{MT  @ (@fȑ6l0;yd)G6~#GX[iٲ-\VZe͛75{Wmu[oV\ m櫺lÆ u-ɓǵ[˴YxZJlر)4ӧ}ݗ}\(P } 1b!ė_~|gnY, (ʕ+Wtn[h+#j^ٲeuW*x;|5h [lY:mP`[oe 4YFA =V9"  $5yޙ5  XIYJĉ'1-[֮,5>@< ߿nf_v.ǹ2'@@UѣG׮]eQ۷[[bEDe,qDIBg9r#"E,)q1k,ѳgPLӶR/Kx4ʕ+'ivGE 0 .]t˗/}+Ї,B_ҥf.I|o߾)]UnvAEuA0^{_^z]["܉R)!*ɥTOK?ĩqCEOSBr;_rr?9kg}y}i֬~\fgf}gݦL46laÆ%Q ,)HL@t ,\Ў9&w=X٣s !{=7}IL5+V#c   `z]Ew{|g._u۶mp®yXibHtq.WPC ̻HK.!*yHKo5 @$iӦֿ={ (PʈgԩS矻!5kfcƌ͛7YRY}ՙ4i[βdbKyk׶s7a@@@X6 @@ &'A :/{cR ( ^x72]׿6lGʐ@@@ %nF׍(#VB?PQve$Yr ;PpfeʔqvnSJs˗Cf۠O?vSǬraMJ*.c99QHUgEۦLobl2ٳW=s\۷ٳgmŊҥK6dȐm `ooiG'NݻM)#Y   @(d E:  @ "z-3C x59rpw!̴ad`]#˗(_}U{衇2  $W@D?e=z7e hҤw͚5CG#XQ6N:%\@SpJP'ŋw4"ǿMJY/ָqc,+c-[/QbĈd?l|v6BEfF`MJY! Vʖ-lS\_H{ꩧ\p6m<`%J$zj۰aCj2]>}XMPʚ o{B߆nX\2(>sxl-Zrʹv'O4G  Q eaVeb>}:5 1/sCEw  AAI 5{  L`2Gtꫯ|mݺoH]hԪU+;pPlntN/   `֬Y]~gnYtѲ)… w&t\-{1G̘1#~i*9s_唰Rvg{]>w\Sz=1pB:0Сq=X]vuX^:u-X)H?L8̙7pCx@ s0UNS`uI^u:Paܹ 4]U9bO>[20녖;kWpa I,;0w@@XspR@@ &kh2&pEС)3Jʕ/x1DF;A@@Pv=^y;q p}AUlٌ:Tƅ@۷b$+]8<3d  @]~-xvYZ5Kvqۧ~xA^F:KqZ[%1 _~{ٴi;fOSΝM۽{o[R jղQFW\aÆ sst5k&ՔĔ@P ]&Xyu 7M *^GNc( ` OX  @t݂ ݼ+֫3  @t d03f̰K.)n:3O#ywQ#GϭB n @@O`/C@j5kVf?SĻQ;wiy'+Wk]|OXk֬ V-;vMoG, B=W52eʸ߿? m^ݠPbEW[]VR9s;U@@@`wne @@ XG!+h Q@͛g{ ƍ^  xUV.[ϕ*Uvٔ)SlС/B#'ie2B_|&Md'OFҝwiE~>[֋teʕ{Y7rQ  rm۶gͫbbʕk׮0ZQc7o@"(V}ᇮ aD]Zn"nOäXLY 5I{Q@6k22ٳgmΜ9nꦛnʤ3ad,ݑW_]p k]vXd4   &;vpF 0ƺ`Df͚>&]̭>J*fȑnq7G*83jժY6m\֟C͗/=3/ۧ~jҥKsˎc5A sU>c]jVV8ۺu-^حƩ }'2s`aw4C f,Yb˗/2Q@RR?P_~ٳgd@|1] TX2@@6}Qs([e˖E4sNFA=j@*)9w b   g0 {'N{۔Y?*>|8CGB)k׶{Ο?o;wL#tSe,;wpu]\W_M}SŋA<3g΄;Tԩ8cqQѳ7V=Kc=ļ3Tȑ#o@ (PreۿБ 6!h6 K.+z`^`Mkz@@H_7ÄY @:̘1U?y0v@t lj'Zݺu}RjAA< ׯ=תU+{U<#k7 I T[7nj ֥@޼yS{ 纙@@ lȐgΝnlM4qw͐ePd{w`}vf3L@@H-:u;ccǎu߻w DP0~ٲeTRAT<)SI(m,XK]H%9VH7i;|p#JӦMCz)Rėh۶m.KktA}\F1ǎ]vZOЎĢ@J5j԰իWÇKVZ%Ċ.&{]ݎ;lƍAA ˑ#Gbن   @H^`̙3.rH    l5I˖-3(;v7]0w뭷^  ʕs4*qڪ$ _Ie;W^i͚5K%k֬!ψ0*   @ x5bPe  Ć5q%Z`X`cڵ39Eg] @@@,駟2;UV6>    D@bŊE  @(քDH5#Gŋ]UT n6(:F  >}ڶmk}mp& @@HMlԩurmEԎF     k;' @@B &d**"@j̚5.^&[Mjg<j*7뮻&Olٲe3O@@@'кuk+Uu8 4:u@@@@@  *ѣG},  D5!Z`ƌjʷ.o'|ϟߦMf j"  Q$PNӃ    #@`M8ZE@K:L%L5XR`A[3,A`Μ9/dɒ>#VZFc@@@@@@ (~z;~xʕˮZ+㬏bŊօUV [m6[r[4|vwZ̞~@U]EvzF辴w6zhW-+E5gΜ/^l:F*&MN:ov˛6mߨޛO@t1co-[-I _wor۶mmI7      /e QgϺL' _%eQF@e.0Bu-ZnV]&˗2(SW;kȪUo6yV&ըo>)G^z.C.駟LBk׮E,+^v`u7 J*%w^SƗܹs zRyFۡec.]ګfŊ-/h|=CZ/GqH nv2lذ  F< UBHkУl9քt(9Wc)ưxŻ{3  @t XǗ!fΜƗ%KkѢE+C t֬YUJM@@@@@E@QfϞze㏭{.cǎ.h$O<: pҥ$njʘpE0}t3:f[lլY3Lr7o^s6ٲe3eIyA5cƌ=z$VR,XQB)#~iݺK&  VV}=e9gdwy}Vơ]Ee߾}.[4Ge;Qt裏5jط~+=zԔGAK@$[@t XǕY! ϑJk  QV]t# &0rHO\e ϟ?B@@@@@^;w?n,[,@WtA5|`A5]v6`NӴiS m[|Q_g̘(Jmlܸ;6쾣W_m 2eJXS Q'Qg:uo&Nǎe RMߝ>8p 7{#NjXHιn=65q̙%  XIi*_w=Y@t׳JKj*Wx#"     ! g{Yvmk.裏\܂e S˖-E2/ʀeSƯ5kָf˗y̵ɕ+=snC5eA 8p}]WG m(_e DzxS@wm%Kŋ[^sW-:tO*.+Z^z. I&. Ȃ2Z);W͚5-_|Vn]mm޽AZk< @@ &63D X CTѝڴi F@@@@@@ ̙7TeI2oS˖-={z>weپ})S:/]dC f[o.ĉ{nS 3YF2 ]ˤe肪  P {&3CFL.Hy_:+-p֬eC@݁k5݁s'   ._IA@ ƍS3zBXt }+M`Eetɷ (ZhDq(͆ \62xm|;M.?~˼0zh7n˰ФI1f͚!_~ƍ[bE۲eKm2J15|"9xAW?OxdDYDs ѣGktsykذa}7,9.k<#2(ˌI_A@<dcH3gr5f"$C@wy'}=.<[@@ko5   >l|M yw> Lt%ЦԷʅ nOj孷y;f}w}ɢEL/so=nޮ f2eܲ)o{Gl…-X#2=sveRz㱜9sm0Сq꽧lk׮Cٌ3lԩ`m@W'N9scw 77c\aN:}#*Ek۽@/P ۿW=+S+ղ>hn%A e 0xF@\(?L&g[nV1$/۵kqG,  @ R@@ |B ըQ {);rS@P!C\͞={n{St^{/ҡ${.Î[hYI&$UFW^yN88l6m[6m,3\Ңߒ%K?)F.8p@*3/+2`%o޼־}{Pe0a\믿Z~0/o~X@, s% Sʫ.VK߲>Umٲŭ߰aC,VnC۷ϗ,&^"S?  D1fd(}.$xF _{h5kִ1cZ@@%ݩ @H.ԃ @ nZMW^=+xiӦ֨Q#.xʔ W+^` Iˠ[EVxq1Gi9o_~{ٴi{o>}p._|iuPQ=}ZjժeF+† 27FA zܦ2ͫ^no߾ѓ*KN *^ m@@ Ft dtIh @`qo?pm"     ٳzve{ߡ_e˖uԷ2DR.V={ءCt]GPK]peSd^FwW믿t^`*Y&hH7tה`@)SƵK,ͫQ2*VZ_x*T#gΜMc]X0@U2g<5o[uʕ+s%SĊ4vPUxp۶m Jm^rJ۵kW@dDF+@@ Xُ G  ,YĎ?Fܼysw7L4|@ľ+駟`aw4C Q%J{|+X@@Zn!뮻2@@47nt#, ` @@ dɒ%   dVe.P?i_~ei(Ç>}$~۷ 9zz뭦 0`=,{A4~}7n=NJ1t1 t{  ]@~ŋA<3g7ISNXUϺY\ETe˖-A *dǎs֭[Ν;]8+B뮻Ξz)S TOիWǯk@(}g5jp-w2My\TE\ܹ);vtYYܩS'۴iS>u926V @ɒ%}[f@@ XǗ!f͚ƣq>C^koSL\rŭ+@@kEȑ#Aj@*Wl}vذa"M6,#K.5nNI sN:j*^5*vm1b)(ˠAXC*sP ѣW ^zvw,C+kj.\2$m߾4)Sj׮m+VΝ _~ܸq2o~tTNR2*ʹ=tsȶm?`UVuYtng2N){YsW@ ׷*Umͦ<dX}E˼z;w7en@@ @ &~؂1.pAŻGc\#W@wٳo3@@BXS@PQ@B`w5 RS o޼=}#! .XD5_}n:䶉UmʕL:=ҠAx㽎-Zm;-Gk(hcڴi.wWK/?92a̝;7Y-_zasqV JRɖ-;oUP __:u"L@IDAT-Z~W*CJ*yyF e\P2}g2qD[o]J-(GAs^Q^VV@D +Z{Bƚi dJk2acd>}=|`~С w]vVZی  %~gk2 @@ 1ka2q믮/ݩԻ)J'Q G>|8wЊ@@@@@@ 6mdSNh v[Dh !?o1 @@aF})- t3/Lw=ݻw@@@@@@2@֭TR A D@ҥ}ٽ{o@@ &z-3C 4o<Ì cǎ3f!(QF@@@@@JN:@Wlٲ&v-  DefdSNŋXʗ/ozPu͛7?c0a]uU,   *p![tEGڮ:kԨ]q }y[bEV*TȪVj'O4+Vh9rvi"W\VB_իWފ%KZ2e,k֬ުT{޾}8p NYd1ݔAw̖-[m/4} ʕ+yz!C@k ֩ϕ+Wښ5kܿw+WlM6 zvH8Sd`t   @;k̠eX  ) @`M X`={U [Mp'Ď sξ ze-Zf  1)#Gkf'NH`:n<_>lrwu͚5˖,Ybwy[oeW ٲe?l֭Bܹ] ثjŊ=^6nܸeϞj׮ml2AuĈ _ѻwo=z[~nTR9so✼v&Md:uJPgӦMvƍlS`/lO'|ҫ_~i<?~܊)b 6nvm˖- 6ذa Y@r"   Z7ٺu),@@ 59M!9s\oٲef͚`t@P@ά#G8q)̈́#   ̛7T3fѣGx;yW((K.BZ޵k)ʣ>R}Jw}}nɓ'mҥ.͛]VReniֵkW[j.k2x_~WMԯ_߾;ouʘ}軜P˾}}.ki9(~GjCT}zHm,X`OvutR*!@ Dr{ݿ5mog6sH2LgԩS矻5kfcƌ͛7iѢM6̙3ֻwoWgҤIn:˒%/ծ]Ν߄e@@@-[&?:@@dȴ/_?~kРA G 9k׮v%VZr-   nF7^e)PǏG4~]p eQYreZlӫC.ٳb g>ۆ 2?[no=zN8aw6=o۳@@@H*UkO?Y@@NnǕY!k׮q.dHCI`ڽ̞{t E@@G@b?e1=z7e+hҤ>Pf͐?VŠSN 6(P\㵿뮻ԉdE]3H ͰajW~p'Y_Y!FaK,5ڹs۬ɓXU!@<װ7ni{ك>EW^㏭e˖.ەeJ|GK[5(?l\so*T}h_^)][|r۶m 4xCA3+0EA@Xw51!S[ QbŊ[l-  DqeVܹs}c;|, Kݔse&LYIK  f Xxu] Uk߿U^^x{*Uˈ%+7ers̱o֭P/ZH"SO#)/D ^6lg}ZG@F 5,g<`-Zrَ;lAkz葠mƍ}(s?k%K%GѦON`s Py{wǼ ;czP@ vokF`Mwf +@`M{f@ ̛7?5> bH@?w.^f/[ժUcH"  PYfgee&пGqA/G.] eѢE]`2樟3f0ZJΜ9uomy|TUe}ЍS ^zAk{pB:~Сq_+( N:#GEP`W7Aۯ=wܦbǏw+y9rĞ|I쟉Cǎs_+\{e$;  TkN8a  D5y\* K.\PdI h1bYnH/   +2x`۴i?ڴic-[D=6vX9sVvD'ʵ^TՈɓǔBEڛ4i֧}?ī@Sݕ7ÿb5|-ԩSYFt<0NM\?+Vo9{\?Hϻ#_πk췰o>k5  ءC]|"X^`uYK \.SN Z1 +Vt/^h*TH3g0z*    I6[@@2k2cdPyFF 1"0qDtqcdL@@\jժDK-+Udڵ)SСCn_W_W6i$ľ+篗&h@,YĖ/_3e /bgN { uݓ2nzkFL  @_qA"Xp?޵&[M4˴/n[=ܓi@@@fta t{ ]}Ç}(cJ(vkbΝ6t钝={eJPv?br˕+꫉O덧N}Gg;%2`Wu˖-A *.0hذ[.N]yQ@ c rw}VF 7ݻ,UlY&+P|ֹsgoS;v2fGNlӦM ŎC =& bP K,18k  @\ݻwѣGSg'  dIC.y&twY@ tNeQQ]8FA@@ я=6pu׹uGh]ݾ}dz2=eNݡ]D>s$*1L0TS4h1"tUW+fѾ׉-ԫWf+m۶۷@2eʘ:d+VsYܹza=@(.W*?UZ7nlF_-9stugOٟƍg-[t%\_=~m޼)?t:Q[2Tt9r$Ì  *Wl:aÆSO=t;H K]wݕ]g ?ZFњ  E e,f j~[?4m4Cd$H.^膥5JLA@@0S0*M.PY~ҥK{RYYUn6w1x(;+Q=4h`>P5PGHh5kִ˗[=lΜ9;xꡒ-[6kѢVB @/]djrFρ>C_bE.@oǎqFLȑ#lC@@@ b+VyF@2k2S@Tդ`i)p){}=z̙@@@ ίʕsL_@&33]+Қ5kʔKC@@@ X={vpႭ\2-<  Den~#5> \@w,[je͛73=@@@`Mϓ'M81:lD@@@@ȝ;UV֬Y24={i#  ֤:1;@ vϟ&-[6kԨQLƬ޽{7pϑ#1"f-8   ԩS#b(X`Dh    /Pn]X5 W^=  5i^2hdw  8N:^*W    @ ?>̙3v4B@@@@w;I}r 5iNN._&״i$BO`5 _~o+   (Э[X6sF@@@@ n&.]jk@@C8t?o (XbإK _xSp @@@@@&l2۸qmݺgJ2]YbŀMon-ʚ5k>wiNr *dW_}uɓ'm׮]nk ~6ok;wn,u)SurY%P4h`Ydqsٷo_mտΞ=kV2ŋn^uԱ+"Μkw9rJ?igΜq2eʄ$hM6ّ#GF=~Q+XUVWb ko!O{'Wu]&;v~C7~3Ɗ/R?IUT Q&PWO [_+#2ȥt^e5gk۶^{s=-[6E-[tުQPt<bL;1>]e/Q^{@@@@@@ z;f-rT&A5ڠ@& \}նuV2eJ$](AB?ܭWi|u|ڵ+n`]H^V ٰa2yA5ZǻmyܲyBIEYb2jə3z醨,XQo~GkРsI`ʗ_~6)Jo{܋2[]^xkA@kX2M J{JA ZtǑǚGB@@@@@֮]뫤 iYre=СC 6g\3屮K4 Z ٳgO:֭sI֬YgPⵋ1eϟn#]+V̭7o/hFH:zoZg_ٽׯis綾}Vr5tM>mR=Tf͚eʘCA Rs… .RRɒ%M͛7^{-9u!k׮{Yk„ W'%Sp¾n9[NjA9^[/O6ʲtgݴiSkԨ y@ $soHfϞ>u~7. ί2@f͚2vm޼^7umѢEЌhлwoWgҤIQw5$Ν;7L_ƍ\xѽgw4@@ %IIMB +?<#MIwQ)Wj2@@@@@RAJ*NzȑZ8Ӆj|.O?󰀕X}ˈFU˖- ,AmfvuO8џ),V P)Z{oWWuy{VZl2=xu`o}F}}CjQ62eʸޓ^p)K2vxo{B_4z̒@Z $sgEN2ePڴiӬ`3gϞNC.sٳb 8@!Cl;`{뭷?{gohPҨ(Ҥ(TШ(C!$Ã#c"IIB)4*?{s^szZA;|p 315#wyfĕ$\p13$@$@$@$@E cfNVx Ѣ;2$_ÚŋKB+68z}:NhȐ!j㝈2aͅ^d_M !$@$@$@$@$@$ K/{OL"p\(4{ˬY>UD[ٳsaZ (gs4"d…*J=dN]Q;G N hOmFVڵKS 4jHE@a ڶm}-^;3^xwܡW^ᆱ!Ƶzr '(.eX={b9%"}oÆ . v=ezSD}04r S%;zt%JP# 053f8d0?    h а&Z,r?0=F1y_T1اO<τHHHHғ[ncHHH /^ܩaeРA2gH )>Y6 KH"ҥKCK,D@_U?BG# ;NzꥢA=9_~F a6 $=PnР|GɶaMT0H۷ow8j%qhE , D\; stz!MB;phK*UD(UTRDִh"5/ Mj+P"m:2exmD_DVR>#Pm^͛7;M\G9!~x̠aMNHr_   H/4Iڐ@F7--4$8m&O.F"HHHHґԘucHHH ? $PV-yF>:|rQb(GSRHU m4^F ۆ!,[L/`02sLYxڎu:=ÖX!zJP:o Nz80FaM6mm'~J{7EsΝ_ kٸq BD{O6+]wVvmҷo_,PBe.@ԩ#0 Cd%Dܷo,X0" @ KA,H @:<4iKZf@V:Z /F. @t[{wV8sI'I׮]СC(ghq1N`iԨ]̢*AQa dӦM-tZP_YuQʰ~-Z$ׯWuZoN0#Iym:]dÆ *{D1S{n2k֬,+V8udggH HWbEE~~Y_J*WCC "=VZaz    '5 H ={(Zj Bm@_7QW_}tL3 @'гgO޽{@ |ͲrHHH .xWU:T8nL@ tIЯH!Ƚ0/_>fK.0akI;ۿhdQxP|qIѢEQGs?mXH,Ȃh#?q%p˜9s!^)IpX4l06m,gɯ*;wv€: r0w(z[brPRb+ҥK #D{G͛'H{{%:Aڵk}m:o6^e2]h߾*)SH֭)0&N跙IHHH 89rdy! kQfIt\koC956P=fI;v܆z<f9 HHH ^Z<F`W_e[$@$@$@ _?̜93NLAQF [`C *N@l_UV/Xyy}KzD#et*DbU|_ ϟ?2+=4Ҕ?Xһwosc,3m4/ڠ$LÚO?]h88 R/DБN;,l- OAyQH zҥKeɒ%lZf̟?_i4i྇^GI6?G9%мys-S*TG%wmC$@$@L#/* hiҤrǫ/UmccHHHHr(5QHHHHHH҇-O>dnUW]VWVM*UNam۶?9[%aЎ;믿.{<j]J:ub6mFgem"Z*L TlB"N#P?:4kז38CoRS :kEX.A4DGpE 2^ve7`>lqDĊٳg+C/]mذA ,蜟\m(eDXVZM8?dIǽ<۷oO:oHarCիb#{-:tH=¼tME[ýWXp0tP.[  TGٺuC!   lXǏ'!QFIa` |7x*W\ha!CɌHHH O5kt9OL!=' !Ph}?y(RH JK7ʺ,  /~eʔD@uw} b&{K`dxmǺaÆmYYg\>3^^KQWD[|J~5ZLCCg}Vm6 R xdw73<7ǜFjҢE ٸq Kݺu{;6[=auG42`rJ6ɖI+ʖ-+=\*j:3չhC;wTyڦMYh^zǽ˗bab^yokwT@Ĝk @PwrR4}^IL^v@'N\ AFhGz˩EN0fxG   #Bk 0^L<I62o!O=L2EΝ+Z9t饗ʐ!CTREjX+VWmXc.邴!'ilBy.\~/kׯ/&Lʕ+gkB夓NRQnL6:!A9aWʗ/ Z`#tzv|įA2L6mڥyQkF)3fPasJN }g!"ҥK7tCLJ l28pSX8l۶mqN8C.8qtL{9eXJf}p¡?W @oV.Ӱ&Y4 d*?*7ߤILmM1 ` N:Lˍ$@$@$@$@$@$@$@$@$@$@$@$&oYvءalڴI)x≂_ѢEݻ9P/O駟 ~N:ېƪ@Ng]zuYdl۶MMqUs1f,Hb #FÇ), axH!GUt?CEsûHHHH 3 а&3kM)%`v4n8ua$`ƍoUYSHHHHHHHHHHHH YŊ5k_ypM3ɩ!? @%PT)9"#>xE2,0Oѣ2Ұ&Ol< @aM@VRA I`23Ylҙ @v:tȾ2?>@J&)_]KFz-m۶MfWC$@$@矯L9srq6q$@$@$@$[ а&Y,@(rH%ZjKb$gv ڰfIj8 @QԫW/ SLIC+$t9DSIB$@$@Fz%[F-{oڴwߕ[M}X   uQr饗F_pHÚ

3? @*V(m۶SƍQb:tn!̍HHHH:XGH waM:lMv_}2޷:,ӧSΐ nWG}4w7#ȓ[ٹsg,XPTRYֻ8 -r\.^~JD]x,_\J(!*U͛K…um׮]RhQ^kᅲ?C_V-$ [n)|J b:͛7z#N:Im۰aݻW̓ar<ٳg㏗>3V"Op^t.]ZN=Ti֬ϟwn Gun̙HHHHHH27ި kP'x"m k:`1w4Xc   dǎ$IIDa B֫WHH R5kٔL+W,W]uUJf$@$@$@7o kI" pg}YWt"w[m8bn˖->pgرh-ŊrתM#F#GJɒ%e֭/_>.r-.LƏ /xfڵkM6<2lذl+03Ϩ=z< ˗W (? &Hj~ŊJi։p|qpJ:,HHHHHH2/UVN-X@6l)R~8X  KÚ ' ~. )R$7-sVZu)$@$@$@$@$@$@@3le0r1HeРArW OMEl߾]k:tʕʨ>`[438CP>m۶n)[Hcёx<,˔)m_شi;s[ԯ__`Tv)CpR?Hx" <      X~SG}ԙ @f`Ě8N% /RUFEX 5k,D!     @ d̙Nf'J>}dϞ=ҭ[7Yl2q3ٳ&,V5ӧOŋgqb:Y8PB_G}$u͒^/̞=[~h9a ǘ?ɒ%һwoe3|pec=p@O ͚5KE3g^s9( *7oV'0B O?4K#H bu5 j 7n8AmD dFɌZ@Z?S8(8믪EGuG!     C 6uōZhMz!eTSBe`6A~:uQ^5kј6l"֪UKL?>\rc7x#|RJ'|ͨu]>Äeb p :&̍HHHHHHrˀTThȐ!l b4M# а&l/ l۶MUtX=։HHHHHr3 "ք%?7Ne׫W/%HmڴQΝ"׸AFu\bES`A[U~<`?/2j(/bŊvGn ͚(7:2b!֭[Ut~IjՔabӦM񣳃 a! Y5C:uꨨg6mكIHHHHHH Z΍HԐwyGh+HHHH&@ÚqG[/TN[(C`𑈴nZ%믿d޼yv]hj}Ԇ5(D]Mɒ%eҥ2}@~={  @2׹-[TD;CfΜ)0}ѨiҤO:3ݻw[_y'=\RHVdԩ> 7xJ3aY| a_ڵEG3< DMPBYc6Q׃ $N53$' |w 5j'y)$@$@$@$@$@$@ ,X)  ؟}QLٰaZ<#RJ榸'tTZU[ * 6/N;-Ԣ:(馛T?pH˩g9%HS\)r W"E7P3A U-\PzsڵkWfݺucJ*ށ{СC=gU>\6ڵK~GA~0ts% DIꫯO>YLD ?#ҿ! @:/jԯ_ߙ 6ڠ      ;T @˖-} |衇??Aݻ;1#%_hhQ:Sh3>R&GQ DD6lO>Q)b _pXIH M$z2ѣsΘUrEĉMDLݺu,S-7YWNy駕 "lܸQ?xg;*aTA(K kʠA7 C9aB$@$@$@(x's5>G~n-[:tʃ-Z,,HHH'@ÚqOSLÚ 䩶y@%d޽m۶pHHHHH,Xx@F1W!ׯW6lP)l2)_WMDK0E֔-[\xF3=޿{oy(ےݻwˤITpeYfU\Yz%K뮻NYf1М=l,Y jr9O$Ds jp/=cǎ*۪U+A/_{5_Ú}fsuֹ k`ts9쳳$Qrn6eCMӼNt uul? B`ȑHh߾4mT̙#pLds$!    kc͒H ,#x@n%EM6ɯ^xZRիoժUJ1bŊ_ե]vrqmedqJp9?ܽY]rNP~6۷g uigs7t܀wVw4&3h<~7JApϞ=RF 9묳 UCKOT:<%")V׭[*M47-g0KIo;wS ½ϲyfUJ* ~8PuSVA_wVAצrLשS̈́LBy96-ZT) RHsIHb?0K˨Q+̲kF={yC.4nXرC c02w\B 矟Lցٺuk 2"AOg(?#YvqD @j $r::ՙg)j$WF5*UYgG-nڲe3{\sfF<kB#^qʉvTYZ0@qPD}6 %Dl;w,:$ْ~l-5mS9c|xu2ޫh:AuRDҰ&kGiAIR~+A@  /hÚ]v)xA9p@ dd/$eX_/ Љ% e 3({,X0[x/l;Vٔ_3H?6Ql$W^xO8K,3y"l" Z"@I V|rY`cDp~e+V8mIA?ܵy([#<$a p /<:;+&;vPPND`cA QFٲl 0~2 XwJj *YFF hDWi =?ٳG'S9s7y脶)f\=5?urt6˟?0b 60BgÐX汏Ve3 MuePC{U,?S2) ҳ aܹsU C6xj ݈oD.=SG6IaGtD?~<ҳgO"a 6B9[sG$H99*ZbE"V0 iÒ*U(7xvU!      [bܸqjQ ejߢ1P5 ˛}(: CP'иVZ-(Q[t0 ^ǶnGz=QG*zdƵQ:([KLJO `:b:IׅiXc,%\D/pZCAgr)s9GE<"o-Ç0 >h?_y1 @QX`6f1B!T$s6+WtVr)JyYa ߯Gܾ}{D;.ir_[llr|lN9! (|I1\\^f͜(KuTePE/VtO)>ҡ%VgI57ސvکA֭[Eg i'5y~FesB3UW]kJtZ |lM<;ysʏ&MRkM4O> :AiOm۶9us2LG)Xc3Af& l:LBSXE|y ёշo_D /#Lx5HVHH &D89s 0 ccɒ%XyP0ۄ[ںnHTŝwX|Fuhf#^שmd:uK{Q9Kt'[ezed䎼u0 jDy45j c316,fXzSil; ,ݻWWXSb6/Z bnS\̶٘r/d]|yy'e.]dY ?qqxxSO8PD4 AWiW>\g֭[妛nʒרFpꩧ ڼdݺu*\iMm^Ih[)ʉżXb _z%F! HEKyF~? H~?qJ!LUVr7JUP#")6lPu'HAsDSH>}ļڵKyM]xۅ'ϰ71Hi?a܇$ val d7ΉR:Ⱦ}Ҿ6@x~p㋱D//zS/ J}\)6̲ۘqm]7 FPy_Q/vduj[%gL{ O\SAs>h.LG$k `XC!@cǎRreYv l2cn^0 N͚5C>SaV L_N+s9?($mm۶^6&lyŠAC/d Cx^wޭOLw|c='faf 6Dʂ5ܳ[AU…EFQԩSGyn9 h96S$dui­iJ*=M6UEgCDã 'o.޸4$[ kϭdHHH Tp~zeh]w&#k⋌U"d G@}r"gTbs mcka4͇[I 0Du< o@[5^8mJZ.;v5k8լ_3xyHGfS%fl_<#\=dcn) Nd +Y)~5mz͆x :)MR:Pp-4U( xn1ܠæ^zIWkF)J۞K.b+Pաl:L9a:Ž }'gߡ5ENIH >aϽiӦIv ŋ/Vu6iiР2)ZjDbl޼`@-/ bրiЏԷo_5k2\»/`8|pB @Zr#… շ|M 0t?~@؂'D8p炟JΝ*NI 009HHG|~zA(^d&Db.~~뭷ߖ]ĉӲ(qP3̈HT%*}(|768259R4cs\[7ɦs&Ufܠ^שm[)ON_' 0 k๐ByW^q/ܗ_~RtO'&xQ"^"U4cM/#44/tz"ߌ=Z/ vb)hbc@ 3&LP޿u0 m, :|4;ɰ_%[ԫcʞ=ШիWMs؞:sϩx[nP gPwS`,u 4̻uAxeؼNm?ж "ޙBI2O?4Pm~`'Dq +1"Dwξ8f/ 9rh{t PڃhaʕS6βsNA)3sBC9 @z:/b9s$QMz sj]tFH9n) %PT)"\Ө&h~AӡoDA1|K)t$@$@$@$@$@$@$*74i(P@UaƌҤIٸqc(@Q98hoEf~f>1J;*}wa ʩus3DŝwX|Fuhf8tLھNm렸d;?I5RI # Vnf8ddN9Ց)yA\Rxٝ|Rpa'CSL>=gPg3Ƞ1t6_"¨CZ&/Iİ毿RPu>'p\vezsjm. a%%uGiK=9CÇ;~˘uL| *$UVU֯_)˰ üS0%M6ɓO>i*r2i,VsurJ5bcum_IkH6_3 mrq-[VEOb^B$@$L2%+V, @hٲ|g*6Lu !CȑGEc}aƂF<DM( mX:N6ں,A:(f(/s&UfLA{oשm(S꟤]׋5H\-Z䬡a3y-*  HڵeРAJ$z,[L7l CU?DぁW_-eʔ T[nn.Ɲ뮻|Ә{HМ0 ҂hk֬իW+{.0 mnjchqP?^YdN8g5FJRMQpJL6uPl3<_R}N$R~&d7ݖ'\鑖5qX HKf@^&PӵkWeܱk.!dĈ_~yJ= P8UdeժUɎ%L ]w5FJzMtV.QkAuΤ|1DLFq⼳b:M9GehX:,Қz"@(Q"ʑ@%/;P9rȀJ>}:DK^z*ucǎJ!}a1رcUx;צMI$K,i̻;/ >3PV~駕QG* 5I:;&*. Kr_ 8Q&4.y]V 7Napqe?X;_pOK2|1cd"Zn/?\0rG04ic1އVQ>^cB JfΣfts9N:$J3xc ŋҥKtjYf<#<1' ( ~PiѢTG sN>}0k,e$g  yoVzMt;xc Y0;xE7o,X@'H"βߌaqW^,XSSN9E!lݺUAqekq2sobFIjZ~,5z7|g4Vr;xI KpIF^% q5[3zL2'i}Vh10Ԯ];(Sw|&!(Scv@bOXN;4\O$@$@$@$@$@$@$@y dx ye׮]8IW׮]Vl۶M5jdoٲ|#Z0ӯ_?e LWͨ=zE;!=4h<ʗ)S&K^a-^x3;(VʷPq Ս7(<m8 |#}p8wͿ+V(osv >ꪫܛL$`@׹2{NG-C Y?(p VEmL4AuzLmQRݦT#Ƶ :x'Λ'"cN:(z:u_aDqA;?qiXkDE@{=@3, @jՔ B0bDzQup\!J ^فhP ama^0hK/9;#0ZK/a~H;/x i߾S aQ*F%xwVZ / UTZ JAic"iIDF_gpp`҂N&xكC p"d;w3_` `Xe…z6[\* S+Y=Z6tr1ǘ9w:Q\g6',۸N;QF,A8SB!       J[n#FguP(W8Zl̝;7N%8݊%o#0JITt?[C=B Suhøz*=m۶1:SSq,#ڍ? x;v\s5:i)"]~[ɒ%V}w?Cw}'>( keBC '׹1W ԑ#GO?-xB0g 8P}c0bUN(fk4V_ #:yGO`5&D֛:| Aqmc\;r*J{Ncw9A: ڡQD~xQud$@) `>(e9(X$ $`0ݻw;ٳGaD D֭`ۘ?NFeXS.0 K{`9%Fo Ad-cJdO`Tc5mڴiNjx dMT\F4`± *3g̒iӦYpA5`7@]u9:lذ4@'5<`@VGS83:`8 o a`7qD5plwyX}Ĕ kcrӠ@DIu S3Yk  uNTƍ\?hAd&00 6NIHHHHHHH ] |GQs='}VO?Td`QFϞ=5fa+ /TX~/BEYrrh8!#6"%KH޽UUD[`[Ƃ (uEۧ I<п ` @ $s֬ -pz뭷M7$2|cZas`=OJ*%Elj (xJDlQ'04]$qm:(ΙT/9=7EH7LFq&r%b:M'DŽ꣎:Jp-B w³L` K}HKÚ\qgd$>) +vx܂1 %\{1"ظ-νX#ӰfŊŬ]Vy*fONzSO=%cƌQ 5?_0M$2΋S       >@IDAT{ァjҤQ 6"_$N x~ωrƄf͚)#{G`|#Zjh9~D3~x1 kr _f 93>j'(rt]yw2 @trrGWKD$`yN㓈~9vo1PkkԯMp c-DǪi55ta O:(ΙT/SI :(z:M ԫ]6Ooa{}Eg },Dt= b9ޚSf)QPY d:xFG0ߡN!N/kԩSK^^ᅭsj#ī5>8mB_U2 4 |_yN6;w=2AR1`I5\Xb%I]ӳtشn1|2ӺmX?4B{mFZAෟ ޒ.Hy &Q)"Ed +|`J؆SO=,.yi2 LB&,u&QP Gzx3 `#3D6 WRȫvWf(M2%E~P Ɲtط~t}GyqJoG(S~2/Rz4Ǧ$@H:7kQ!`˖-+-Z|P0%PՆOYl=q7m4><:z!5jP޶}O>i&]rҥK l1ɓPQ0n:(0IFlN\~5Cdyw12Y*}mJ~iv3H;ΙT/~L(dα:(dպa(P !'#0Y~z?s軞s9[F6xG4bG On#v@{nc/!VY@@G"T@|٪^櫯m0(1o%ɾy^cܯk׮Y:2<3ʃK$;(nlpA_G^zeY ߬7>*N]6a <(.YD`%7?q VM%92gYrVu)') |LQ\XcYn]͚5sEgf:$2 LB: p>;SzuJ \D7U-0rCDAoϞ=5#]8%       @Ȍ3EQ1_G%a h'}QXGmz_sPP+ ̟B$ul٢"vq2sL C~ "O:3ݻwrj?Ը9|?#ZR}N oFf„ |rt yA޳1N!Fz;v_2vXu- c]^l<^:8`2a~Q$ca럠QWyb9]t_4LFq&sA1'c:EAɶO젃y<.+_V7|o^n}xׯҏ֥^C*5|XwD|P[%Mm~Hůf=٧QF*tJ:xڵKF Ed c(x4+GҔ !4nvtp ҦM3g>6f8փ*5-fpq(G3x#WjYmO=4R{n\pwl1汷}&sL>w)]PS8 8Н,et4,f{&`hap'װaCլ·S       @ݺuUqR"D>U XxbH~i *~/pȤ[lnIelXl"J \p-ܹsX ~?>pBur))" Acbw6tP}nygUÇ?C0 LLq% @L10@QqP1F~3 '0ER(kgv3s\9c9%㗊(dΥ:(Q\~(G jt3 gBD^,X>seȎ~ 8F9:Oy{JQn`ܔi\Lk%K$+ń*$@ %q!|٣<A-sBRT`wd}9EG+ FmfbVmY/"/t2³R"bM\io& rD)1&>vCg7|/W -a1E$իW;|uAiޔt2<8z]wpҥ\{0 ݱP4E%yh[m^Ih&>Mz*;btk׮u6^8Q&~g3cҤIS С%GM֯ '7sHREG "ɿ *ZAӦMUӱH:>Ckjݳm@-[̖&e˖U%>p er- 1l0Y`|'q`t4o( B$"|#Ai2zhܹE]$'NTyz cUʸq}ԩ#PC6\x#j (eiPZ4hB$<c9և0Ae⽰RJ^b3kRlSBO el렘|:gRyYK&duj[u'~vҥq }@wz*<6C~nV՗p5ר(8 Y픆5i{hX1HA @ fhѢq+.oC)׫\os0RJGt+t3AZDу;ovBA:l91-^:ڐa*c1aAOlG$umLmSCFKz`C0ْ|Pងt #’4GY`R,[o%[lyyXټNm>&[iP8vyj*I'$=  \^{55 'VZIࣻS.<;;0194Ø =rkF{b  ϟ'"WyңG"<""ImWW1o</m֠OT 懲Y?V*W,aFQVʮ:e\~xc0iݲdﲬcSHRG 5Q Eu1[׫~j?Ú}fZ܆507"F5:=F%0nLMSH1P(\rϾGy$jaM$\ H:GCYϟ?[1Ƈ{ul""%" _;8_APcrDj$@9~ʾ@/kOrʙIy[c(w< z+iR!6Ƶu;e 2umk\;q | tI:(zquA:d 5tׯ~C QF ~.oO<#Ί7AlaM̛20KH /x&0oNMm۲4 0xt1ǎB{g( #-[W_}Ue^LgmT PDCb .c+B)rNŋKUO>Y-hܹk.( ۂ~f/:|qb?cc̘1ْl`~7o,0Ti߾hBym<pg0O#s8iO<:Os\۸Ns3 7rXש{ ~Cgx܎_,ڵ']wݥ<|:t2~x*0DyP,֭[[.ٓ @$zZ cx x䦐 @n$_ ~yGO`~A6Ƶu[l꠸2z3fQ/;isJ{qm]uP)6u$L? 3Mƍ{L}Y]Bfܸqrw"sE] #HoxBMSHo0$V \zjcԨQq-~m@>^4u͛7( kaM< ۪U+X+66J'%V~nCtB4j7 xw@~$&ҥKK؝ff̻uxz7H+?O^^~eRJ1 D"Ga"* :LB`cYv-"C(xD4gΝ;< +WT-sQ (3<*=Apݻ `       HbŊ9Ytd[u`( oذA~'&MZL>:tH"UV`!}H ^eŊUel[iMMxiTʕ (@LJ$G 1PXq4o8nj5FJ}Mp[F `LK {\[7d./ѩIhݙ>yv-qAq}܃N#8tPqutIjժ*plc[d/ d(3b )$@A+~>R 7O?dFt bK"6md BN= NU-6վ0e޼y?˲eXI&?Em߾=pd808p@BՁЎLr-[T[*༂Q>U>S$qBi#AQ0ʨW2|D^zIe P"2eӁFY#Z7|2TF$@$@u^}U՘O?4hh1[):u$W_}uT$ wy'Sgo#<"*Dtl Lu]wɄ ѯ%pUdIA?>"r?ב @5Ft^Ϊt 6Vŋ+E}I#(J9jӸ%xR '{6oS9%D2k+שMi^?1y8Ʒ_a|Iߺ~zAb8ź>:HvaMH! d67 /2= NCOl[`ЅPH /@xaD8/SugR… i6l0'P ̙3mkE`W_ym:   8L/8;ҁ@:{M> @ff$z H?(rfܸqR|y*案OڵS*vD{+'DDDK߿w}=zyrH As>dס_EGS֬YcNknOvI&ɴiӔ(& @r2q 4rt&`c\;˺@&{m]A= 4p dƌ#gV5׏"/ -DXn::Ӷ @B*3g3rJu4}zvTZUv,x1Z{,$|C 7f͚Iɒ%ոt?制C H6m6VZkhݺ۷ϥm8I:taR $@$@$@$@$@ "S.YDf͚%08qBO0!ʈ5q@%"X`!B$@$y TҨQ#ɞ={g$@$@!"PreA (O'O5j˥hѢ!͆~+W I$@$@GH"rYy9Rvj  6HC4$ x'gݾ}{AB );wիWݢE ۱CE+)PFDh"E/gA4xSMhk(ѣG;W.eΜH!**Tu*"լZJ6m:*OH&Mu}ѭH$on9\  &йs琍74 ^6L$@!%ɫW:uݻr)-֬Y# ilNHH blHC=$ 8P Ek ~mа&p* x"-4$x$    -[6Ybc9}2Yv- '+Y @H +WNetԩr1pyɒ%r+W.[#HNCrJ&_Vx#F|8X$kiƌ?VT\ɓ{$@!"yɒ%K.z& hϝ}G޽{uƙ0؋+O<     !kHm۶[9ҥK%C 5e-x H  ,.^B! <ŋ٤RJ0 @Ȝ9,[LW.#GHƍ &g^HHHHHHH `/2sD)3: $2e$=XO0QD9uvH$@ʄ)$@$@@J7iD.\"֩SGG5"vI hÚyJ4ip2 'wT$@$@QNa\SZ5Rw˖-ҺuklF92NHHHHHHHbxc ̞=,G$@$@$@$@J:(񊟝 @D\XB`PsYٶm4lP~א9aMD89xύ%IHHHH  … jժ9a;СC#q yj/]t~c%       4rJ]qFi޼|$I`b}" D -UT̚$    #sʓO>)ݓaÆI qvUN$@$@$@$@$@$@$@$ 0}t8$K̯zD$@$@$@$@$@$@$@H%KH5իxb۷?>ӥaMБAO;w4NOHHHHH ԯ__F! / ۷o|E5NHHHHHHHԩl xIzRSn]sL0Aʗ//m۶Ѱ;N,EO5s$@$@$@$@$^{M6l ~\vMڴi#Vĉ+ M6޽{СC:ujɕ+TTI .l9#Gȹs,6;&nRӧ9s:Uo޼)ǏW=MV_|YoI"*THҤIcoٲe:?#[lQS,Y"<#\+f+rI9uϑ#[;vQ#%m_g2ݻwuSݻ>:("໸}v55k< x C&           7n`_tϞ=A+xChX lœܹfQd0 O$@$@$@$@$ *URU5:tP@#cf$@h׮2"dɒ%V04i3܀!#zӱcGI8տ;95N'ʘ1cP"(#Gm54@*U*A4E)L|'$ܼySѣ F+ 4m1#*ҥKvYhK.j0聁_~1j` խ[7e]髯2H3@[g             )RȜ9s:,}Ǟ8+pn =Xi)^>HHHHHbx7lٲ* Ç7$@Kڵk~?Ũ3]C wܒ3gN9t̝;ן&:<=,~*}ƍ`L|j* :M"թSGE~ 1^B-ڴicxBĤM6v…=X f͚2uXH@0=0HHHHHHHHHHHBKL2ү_? kwiXl› kIHHHH $IDf͚%I&U]° 'c9-$'GđRL)Æ W_}U`T# 4h@7lP)4{j1ê,:s>=Z`h|refT*T`?P3e'кuklm<Oy8_xJDrgX7xCe!DcU &ȴiTZjfRb sݻw2A3f̐g}I&_AD63 x˗W!ͩS䡇2a@_Zrέ`xaGg9tt!>Gm۶Iٲez|ycϘ֭[^zj wQ&=?Ja?QD֭N:)%lx "0'r$M"B 4:3ϸ!f믾ְ[n.uΆ50jժjt#H @8A8}Z+ ?ǀF8oܹsGĞ?B DRX1}# x$0fq(kұcGI6z,@$p ws… e޼yQhnݺ%gϖ~I,Ybk(xӧR0el-V0:#8=.,gΜ. 0 j۶s:Z EK"E$o޼ʀe1ѼܱgKdٲezC?Xڷo+)|o9Z`H{dժUs= 'رcrYF)0eF`e|"E u γgƪ+WHΝչ.ί]/eȐAfI4sIHHHH ڿ? D~Ifd45s$tfF :^6H>H> hBPlǎ2sLҥKٸqhon9+GҡC0 DΝ;gTI$6AM&(ϳ V0:tgѢE* egРAn?D gnܸ "ӧSO=%O>6I$?^ou$+wQt.w5k1%I~,Pom^6141y!ZÆ v8 BZJ,# @sl+p|6![   p'`~ ؍I&B8;uyˆ5cy0P>ˆ5$ҥKoHHH|#/Rܹ kz)2e&HJ.-Ǐ)Sȑ#U$]vIRB2nx1c,X+%jwІ"( cw}"Fk֬QMoذAׯ@şc+d"52ۣG2ecڵkKՍ|w'iҤ-[*oSsmeEwԘG|"reDV ʘOo߾ҭ[7syܹ-әHF@Gxys$@$@$l0B$@Jq$@$@$@H(޻wOf͚%o/M| $@E`j>|#jn @ @SN#D3fL;e$@BUVF:ē+>|x@-ܹӨ c8:YpZ Fw~)@EGvh;vLϗ/*׽{wV~|n )t(P~'}+@z'O5gN鲶}(\* z|%K̇YHHHHHHHHHHH tAsگ)1b_X"6'?x /K۶mwHD)"ߗ U6CAy憱J8RoPva6t)B0,    &pN'ЌXHQH5QsaE^gΜVc`IHGق\2=aFذa[E'_|?\.^/RB6G$`"CiӦB#Aԩȑ#gU2E*r]'NH̙M=ZRB[2prykT31VDݻNJp=z^vPX|ϦlٲOѢEUΠγ> rD3(_s ʕ+ "f#|L߾}{A AΝrU [han$@>z EDæƍ71U-ɒ%SeCp[|Iٲe)SF*VU5]v);o툙$A`oʕ+43NHHBGHNF3BA BmFbi EX̞={8GC g2̠y~aFD@z+4ˑ@aM~RDH4M6ɐ D>(Rĉ>2# S]Y@IDATk 2йsg7X9(!gqƩ}yo=`12QUA^`vXc e~UxmE;/ZH)[)cI3xL2no8Q0ƍ+c|-X@)7޽[Ғ;wnyC:G ? xsWlڴIEo1zQٳC!Xbʘg͚%WV/yQF.:GF01G7s& U}8U+2L %H7%홀kg^,A$x0M4GKXGаB>°Q{ 7VhX-)#$ (RPHHHHHH Kڵke߾}de"YH 00իz]vM(愝]:z0$he.Ϲl0{o9l}I1uT,;frJEdg.br1W,Yw2W\j X@),YRv!.]R 񻴓-'NP#vI$@$@$@$@$@$@\xQ߿_\"9sTkիW\vpc Xӂuf z}nRRҥCr9?å]ٳKX'8*-kOcgϞG9> سܹsGnݪ2"_|p5JzHҦMkUi$@${ K2e2'+t${c<]ܯ@o$C R@yZݒ4iM#˂K6gJ(̺z9)$@QH੧q\$˱(8e{C sVE>W^1>k!ߣUZ5YoI3qҤIVTZ*UTYmf'\o^5EyCPPRPƵaPow)$@$@$@p(e —_~i?~+lWܢ>DçwstČ1"ơg8:*8f krׯcʥ)R8dt9ܹs.c FbϧW^1%<;:gϞ.}#qV,pD믿\ǘ'L`9F=?{0;3f*u.wE{47[c=O~2aߕlz|6'TF 㚧{_|VӽnG}ol5rܛ8h,iӦպv9zԫpGmڴ1$O0O=oVw ̭6grJbG_AߗGp` ^/0>?vt>)j]V$!Ch3e˖nݺɛo)Sc;w8H];Εx1G{U <2|z8ڌիW+χFO0o8jK{/ >\qwFѣ;`W$(QFÈ/fX╀CIAڶmƀk;PHHHHHHH޽{umxPG g /c}j}8n8<#ޓDdZWy>rmg ºT sz֬Y]EtE$I$P䔁JÆ ո= s FjL%5$4I9r˸ ӰaTKʔ)cUi$UMO?9s$@$s{=[ =@܉_}8 k֬8J=.t"t= tW"R:uJe:V|M  o#rlߛމ8יG$xL(yO(s8HWs6 ۂ,G$9xv2 o Gf͒G}:nw.?̛7O^;7`C 6aÜO>DZn W<ib VRr\E 4[oziʔ).L0^zyH= ŋ BPlsxnQrxGd'0A'&vD^@ż8 K2溺<6aqƩe`PMS`B" %/p∦.. 0X/Gq/;!      'ɓ'X3C%gqx_(2h9WXcܼyS6lؠޏzGue0g0yy0^qxVN yp,bҝ?8ΰkeŊ:Ùŋ>H֍r\ZU0F2'q5f,7V=pn:lA?Gd` 'h6 F;JĉN$@@ʕeҥ p:'Q'16ݻkY?}#S@adz8xGKE#"c k,X0€0sV+=@k%'di7m{+Ԧˑ@pS ΘR0#"D"NH L B9sT3w:% cǺՠlٲ&hCx3ٸqNu Oj|~A3f6heh⡿QFz={T6WQ X/h G{b^iuDE_ϫ"` A0X0QPH T*U#va$'`Yti ;'       { .TիW4Af͚5eԩ̵/D4Sl߾] %(Aƅ bM&vZùC1sL5ZjδlR9B]x1{32WxUOxQ8qw$sH T(t3x48w w`, g*}OQkܵg{ jgi޼ 0]ڵkx4<8͘1)p?,VoOP^zHG۶mSFLJe޽H#Qcx$gx&Q޼xKH h5PHH `# ar!L1b8>|"!YfUCыiҤlfK"0>JF-1URE'2ee(^U $dɒ%o~΢(F>xot9G_csu>  /G@-Z r4}''Rwݵo}Q@y 8ёkԨn\Ĝ1 Ř]ca?^Zo޼Yqƹ8R@.]c-(k'yޢ^XH {%lg" HÆ Uq"jlٲE90Ez0 kU{7?oϫ"V:(z\ZNmG5y||ƌgɎ;> '::p ɠҫW/Ε}xVti&?:֠-iX(H B ;v̘ k {xV=]μ^u>u1TcϗU^{5Á`xUn]_cYx6+y{IL֯_os뽱/}$Wxq5.+r;wn)U1@O}=>Թe}ɗ/DV>|X.]~6!fZoEe8j}6Gޣi< c׸qcCDSAq? ;_| gC Qšge(vx!B-p0rHnN@?IM!!,XY'gC$?y7*̙3U…  ԩSlٲYUqV^=el4j"a:ƼĦ%ZE!  LQgg,\FnlH @!zJy Q>M"s3֨UkWvٸu.}4bŸE'AN+ٍ;eKsgysQV;3;3r*(na_}HP3fL Ͳ. D,D=z@i5ܓp/! Dr@RLm7?_=+ĝ,0cwϞ=H,HR6Z~6tP ~߾}JZG%gΜS`m p& C3eʤtޱcGsXGo⁀p ]%K* pj=B 8eozsZ pv̂.?+Vq_5kL9ym׮2.YIu5> 02B$@Ja"apGgION-iҤ;q>E כsvuұIll`ü5ʖ-+9r䰪Wyٳg|XiXG h/ Xot3DPСCj!f}m۶ ES>WI*zPCxyG/l: u}xԊ,{:G;n8e0zήs෍kJ^{Ax3aHSHw6A$' b|f%XT "CÚ|Ap-07J$@$@A࣏>($@$@$I(n:ԩRp)!UP,s?vڹr2ֈ c<_׾pNkz}9?P<r7sLiPNwVC:$ofC eʔj.X37c69; ?}j Pzd KD cƌҵkWuR75܋Oc%֭[ o(BA=;_=e( QF 2&|Kx^`'av{Ν;+C韠 (CR?㏫}w3=?Lgw5^zI96OG7=D,Xи蟘ϧgVIF52mCR!Bl($`E@_ok2$aM̙-Et9 &RJ>l\a&7ZxxGhvW kVc͢@׆5'؉9aFGBhAXy 1hc'x,C>cx oPCYFӪIgcG,:;O]2x$Pu  @ cfD(WPA-:|ԿCs< `fx`s _vM_®J䟨 PP!f׮]jŋJp {m D/YD7ъv^xA9|m5mu][:O+Iu^0vX71$ 6k5|p171 _W$@DӧrJN"Qb @8#e˖:\q?Hx{c_Z5e}+V([fpu>ﱝǜPO0iO glDFh"V;yx_ vdW|}NWTrt!X韠6*t? 駟*=s4YҪNa&# D jEdh Q$ j*ePz꠆z!zÙ~Ν;5kV7mXc9,X`^._l(ěV" yj:^M&(qZ=gΜQAt^D@6X_]^џ~yύD@bԩSbc9w8{2y9Od%z]/2P5'?\0?2 3 kC1.psq9*^{`$@$@$tD\gȝ5go<Ž <]֪ "0H > !СCp1ҥKU$] 4(`0aGfcZjY; =^ݺiC|Лܶm2"qMʕc\D3GBbmhP;=%_qyt2}5CBvkV:5$%N @gQFz!SLa^vm^艾gEh'tmXi=`Ç @GNpoR…]OaYcDYCQzDΰ&I  nv6˛{χzOG fd`|cCu"0 E?\n:YfT{%}GHH""~gjf+WL8Jσ:uJH"@bd!qeڗ'|"Cn-$Pg.]ZE7_Uԩ2wCGqɷK՘c: @x7eΜ9W_Ƞ~u.kU4EJIEl 7m4(MCGFO%|>,8'ؠ*U*e{P8G 2'[jmX}ĉˆ av-GQ |/:tH:wPre2L Dgp}Y=~u>$ G\xCeH :]H$@B`ʰe`hSOej} &LF%cǎl*UꆬVZ hpd޽j^zm|\zUnVtADP0 6ްرum. XTœgQ5˗/W X̀臤~A"} htYگGH$ʕr tj t`Q ]֜9BZ嗂,"h"zM@`NÚ~ׯ͛7QF$@$@QBw6Ji&`JJH•"]uo!o־ܱƚ^ZU0׾PgO^C9}X5>_ްaCo( lH 0Pƞ*njcۘr/3H"0CͰ&cƌ)9 ׯb;w$Ydda8uRC5O ׿7I̙K6aO{arI&58{f9O^ ˗=6 k42oq=zΝ;Cf͚LI;*Px եDq 'UUDfVy[H"9bM¯E΂H C?baJݻ'.]rƒYpݭ[7믿.X0˚5kDiJ`TAltBҦM+jcEDٳDz"E!pvuA?4eʔe,ц2H_|0\de\/kr]y6($P wMn~;f9L,d,YRuE-=16ͱѦMUV{ݻwuֲo>6Vpp)!r:5Bt8s~}uA]fРA]Nys ՘eHBKsvĽ[4 `ZC;w?ƸO:VVMpfkkfNuh"+BQ^ u'{+-X]Q p]^H},dUi}*!޿[ĉUu87t8c asYG7+W(0bMtg8($@Ú(9eRX؀W%x ?\ ;DGVNÇ+CDA>n˕+B"BA ,bKޘ 2<ǃ6/cΐ!ڵKm@?3fD9u-ZTy0op'O?4p6*xϪ"PG]3gX^Yg^@U  $`X4]hPEDڸqI<Y0n'#o,2m4l˖-Eo{ŵi,S@,Y[… 4Jp`߽^$ NlHH"1Ϟ=k;#G MPH . lذ "\p')۷W *- pҢE [XvdWF{ZkYi̙jM9//މ wG$7*T uUv=r/Ž I"B'C :+V~ZN< sέiAUKx1.m`/aJMٰjժ2i$m.{fDs('xB=ÂHyo޼2Ng p|T۶m:]8FQF)BFk&~c?ϵz<`cA0PQ)T &pPM! H%%JݻUg eǫ (c6HFwhڰʵP‚ y䮍z0fRP_͟?㼨&9`qQگnGHWF e$c7Fw<}7FQ̞=҈( PƬYd꥛5QFN1:  kȅhct6G1E$  '`i5)Rz*46x @( @!Q(XGK 0סC7k_A`}ox!}v픣 sp9~AyHpn(W^2p@j~IFJNH"o`\Cf]tDnCׅ፝`m zأ`:p?Vg{s98 hpۻwoGHyakJ8 pݹ`;vEsaȃ(fh\~O!+yXCVhX-)#!#`AB$@H!Vë#Xf?D_vfѹs='x1_ʓ¸דgQ ?F ϐ3     H :uj)SlٲEv%W\ 2D8/^ 6om *$(2eJy?7abŊ͛7F… KҤIcǎɭ[$yR`A#kǎ*]'ȑC#%I!97UT/_>I.mׯ_ݻwccc+9Nw>fϞm'OxϞ=RhQQc޼yQcgϞsvˁY$!ĉ a|oΝ;uV G3]y@$X hhC=$iӦD @z9sFͮx>͒5>baof F ϒ'    p'PZ54hSI ,`dر{ɍ7\ -[̙3c]tIT+Meɒ%~zyǍb&M=z'mڴu o8`d=HpHBȰa+O1`۶me9sXÈ FG P iѺgϞ2a||ڵ/%iӦ* coW^1ës|w7o.5kNo߾ a)G2\K׮]u#GHd\pzT9su.e@$@$@$@$@$@$@$@$@$@$@$@ " kq@ #gL8     h%x-6mh<@h [&O:PP۷Ν;e͚5nH) ʁ5Jt"I,Wޅak޼yʸUVV]% j2f̨B4DYA˧~(P"Eȃ>Ν;"`1Ds%KyᇍSN=0zʝ;neP,0Yx\No?,Wۅ  XI\yz,XgX`M `3f9rtYY9 2F!h']MPHHHHHHHHHHHH ڵ˘ k ߐ@4ןCܹsL$@$@$@$@$@$@$@$@$@$@$nݪf(Q")]O3aOX—Vʕ+|'‘ D ŋ^+G9@q{N$k֬w^%H"W5C}]0Mewm{:aPժUU;wz*u>~-[#ʍԫWO%[N}GA"~oxHb9rlٲ -ߜ^yuG1cF1 "sy%KHWJԩSKUԯӧO{|           '} ZhQ/B_h, 1gdž'HHHHH⛀68&?  E!B\9eʔꫯ.aܒ!C/viHW\QQo 0,ђTF fPr>$Ԅ Tի͛Ud 7n$ID (C ֘k׮ ٖ.]*0F}h'Oti֭[ߪ !{12e߿__r4h@,XR S3gڵKxA[)SF~g˺L$          ;v09B_< )s#A 7'#}&(ӦMSQjժ*Uʫ @֭]ӦM+0ׯRƟ5ϟ!C"27oޔ7xC8ߟ)[1@JVeuZ(Ǭ8rH _$O\ƌhӬOI_F-ׯc<(6|$G,9# Q"( EHFEPH HQ(iKWN虝非lwU}u~G&+4)SH-,7/R4h@,ŜFO+&_|Ǝ6@sIyGx9!ԥ-gΜ* b#G (qM$@$@$@|^eqO2~8o`?.(xB$&/X>5^SH!Mu$ఋ/ʋ/ͻ*"] {!h&`D3HHHH  @z3gΨW\Y|ƞ@T&*/;;1vإ @$n0,o[$\Q!SWɒ%oQEڵ`2/ xAip;ʃ . RX&O,M4 xQI_{50a,^Xv!cz#w2c=&lx|ɓ' 3ftÇ"Eȭ[` x P]V t`yT-17' f{kSX1p’:ujd~hٲeN:!t7o8qBŻtZ3gllܹ'޽{G|vi k !Z$ M@{Evfyy_13>83a @x0lժ(Q"<;V@0?$@ArʕF]5k4ν9ZLKaLӟ0NC.谰F$@DEe_H^J2 ܹs<{ @ڴiuR^="66VN0aMΜ9g{ٳh5={C&z#Yfj1NJ ;v(a2`Ѽi77 fH +SL+ZwA˸2Z7A O>ҽ{x H@ OdA$@$@$kpHH \ h~Hl*a$@QN,yꩧ|ȧ\D$v"zH%KvgIHHHH"&2{^@xOСC>Ws9~O2n2dǫfbp^{2PԩSŚ-6q$@'7o^%:1W\*ڼcz:`*mϟ?ރc߾Pf          _Xj6˔)Sg'lDGܹsў.$]m߾}dt zcǎ… ˽{~QσHҥKomZ,%&&Fv`I R-ZT;%z d *uSXkH vp= 6H57nҥK]'` ˗/o'$%Jx.R,YR֭[L^tIҧO)]c?H ;vL9Q"k' F`bnk ɑ#׬fԨQ*_Fr^P﯄5۷o^4iwSٴiS8~…%E]0fUhW `b (V rȑ.пBܹS^òa_uY}ꫯdÙ`ELJQI`ƍ?Gei  Y(~ m#:˂B BR!$@~0ܱcE=_hѵzޞXϢ{[ ӓ 4C#) KƑ @T0/̤ךA"0zh%;wĩrXݸq87W^U;`p9ҥK+۷.!q<XBFہ|ɓ'!CjO'$@֭[2|PdϞ=C[Μ9孷ޒN:頀VZU(q@ۡCۓQF?\xZU/rd"Ç?S,Y@ӫW/0`c7 IFBGxsgkז-[(&}ziذhByWj1GǁHH<$`i%E߰ðyͿm|6 Ϯ@`ڴiy!כݰ>Cą ׯ_߯QX>f& @aMx\'HHHHM'PlYYn„ rq9u`L2If"             sQXc ;.\0z!'$@$@$@$@$@$* цEh|%@F$GfS+US>f"             Yx,k֬bXkZH A \tɨ?}9OHHHHHH T8 kB]l @([ࠑ Dy͛7UZj%%@xH k :yRH! ia:A?v)[n +n+l޼Y޽+SL6ɓml$O<:x=uo4iRynjpw'۷oW7ؑ=ź5j>Wuc.O>j} 6V|%O ,i]LG E\RU&ø,BXCo5!~<  @؂]0:uji޼`9{FWOrgVX/.}Q9sF ={|ǒ%Ky}v–2eʨI_9v3g4i麖-[&M67nHܹ~j'~A P4hڎ4 y/_nD]V@!C# ' R16vә/j`:ë"{ァD2؁8lĈJTӑ#GZ%a BB]Rm M.S*8HHHHHHH"?^u|jcرc믲n:nӮ6GBFx209=vSƍ6mXUiK z+֠Vc@[-˘1.:Ϋ7$@A#gʊHH x9pYɓoyAxzcMɰaL29k:!ԇa Rҥ0 ϳ 3fȝ;wTؠ..,B8.`&i$@$@x(6&8Wzӹsg%0qU~ޱ?C0p `Cb?Q _ H+VL'+osPƍ]ze˗ORJv[x8Ԛ'0`Fj漺֋4`y7d̘1K/IΜ9uQ^j {$O<H  Ď8@4 ,xbGx D$E5޽SMe֬YN,Nk߾9ȣs֭+_~"4zyo;0|U%69b)G' ֨Q#Yp`.llyZ1 5,HQ.O+#Yjmoo~m/ܹs2h ɑ4`]'6ic';,lG,AksmU"](_I"@llܼySu={E$DV7vXqՠϘHI,-g.V^(U͛դ?:ySLQpo(A`aÆqcbp޽* ZTd&O pѮUkG:uL|Mh'TXQݳ\D@M^k኱$@$@$@$@$@$@$9EHo%Ad5d„ aJ;RN-O=SR%I`C@/ l߾]MMȦJBNp vyFvH J  NO+A'O^A[}O4I}_~EY&X‚ T0_paB 1UڛP?,"sOCK_p]Qvޭ֟knE՗N:Iٲe3g.Nm{ǿKq$`dz;A\u %Kvɖ-[\68c bqI "E(ΰ66FUZC#GUg}.㢀3`& >@btbdmh|%g N['~t=Wx|"s<`k9s

Q,+Vp$Dk0HHHHHHš_xZ\3殝dȐA%q]y27y};||]~g< @ 3ɹ_@$<Gu?\86ԆM%]i+ z}ke_%Jdڵ*Yf1c8m$"l")SesN%6lX'~eKnݪ֠/zR0c=3֡`= ֶ~z)U&W^U0ga}nܸ>9lV؊@r(GOFOHH @;lԨQfZkuuP/]nU3/$ֻ`8^uY؉[ NtZ: o;`ըQC%qۥL2FZ$ێ :v"p/ GK:~CB{JA!wp]6VO~|1޼ysdXo +`WM{Bn߾g2x%bޕ+`M2dP;c|`-0Z/9HHH4'  aÆ ҥKWl„_~mX@ϻ,G[[혛UaZǵ^׋=00'<@Z !IzUH+yr.+LL$xE2o I כb_TbZ2fx&ӧOGʃyA?$@> ߹sGk"E7ϖX;ց`#?161c :-zmʕ+"ZtصkܠK6 k&H Eh?k.C$@-n-Z$S;: <{ٲedɒ8 sPkф9W_}U-20Eڒ%KOz5>^ k'Nl$hƕfLfVΝ[ \ YXNر]`T<AX ʩST_mӯX;(D0`r%J `N{ΰ ;r,o5:9^~W]Lpo qٰ; B8 >^3p~ez1 ">'p3I0 {dB$@$@$@$@$@$@Hcܹs9$caڵS|'.ۻw혛t7@zQcݘXx^ovۂx7nܐ)S(_^H x;8v"Q㿨pY^$Z81 F] IUBga+Z<8E8?')=矫M{X a (0lk׮W klH =`1$H"@ԩe˖@v)SNUkΝ;'C޽ξg˖M:uv$= :GX=Z`|۶mqĢ|RucA|ы1P^ \`}fDʡ >` .0xbuz_5ʕӧb>7yBA &I;v9Vwq!ȜN8}9sf}U}*âvm>kH.4@V~}3 @ gUWHy/M6N GĦ2$E4'O&MH ʩ oܜ2[wE2ۃt(رu֩KV mQ55B2[,굥,sz~A7Xaq:UEXQa @B=+`4߇"G?A۴PO L߾}ڌJ*)o/v%bbŊ)،h$l< c{Ho%ui5c -:`sVH.]ގ}Ba䘏„YXC5arL  *UJƎvW6lv{n)Qeطo_2erbrweH@hd6,.;M&hSaaםzNס%p;r`mD0 k0׍`p=At^eBإ{O}{tNkQgvUwn\r)ᙣ\szv\緫X5fQ]'      'z|wjl?t-6`.^ayQn^ؽ{dٲe.pB;,굣,7sO NI\p]@8'0l";߂-x,l^Su&.^sszհ 2eʤ6,U ѣG:GaMв` քu`+HK;H`7UvMo)3gΔYfIj\%s~-+s̑e(ȑ#.8eB/">k`Y, 8 k,1В@^q $  pOӧOWV^6p$xҥKp*c-$@$-5t->$Gڲen^aϞ=rQUXbN>|X^oRJNi Hzm'ӓ XtS/tNk0ExKI${Oe&>^E k%qIJi&%I$6j|$> poMM!ܜ17>mXbUkQo]n]@&TY& ,Fg_I™& ` [RM4Q}#GRCQ=tPz >@.]$FR'SNJ?ZJ^:wlD*whڴ<FyJX? ̀釤 pMkNxuB& /$GM7v)J6lPa:m>iԨ|W,<&2[ qF}/9IHH 'Μ9c}ziذ!|%+f̘Q< a's$@$@$}?z{_"ð@H:u g$@$`gag,ٳg:tr)XשS'WO̍ۯTw9+,\PyF}ktq?%T|%'s7K"HxGμa{s:z`#ɳ0k rf@8`ԵgϞ{冀^v:7lM5 䁷Xaf͚ iKB*asn_ QXh,5 |X=  ի:NN:9~\~]0ș?~#jΝ*\d˖Mr%%Ayݳg)m˝;d̘1N7p>{;v]qqn/p˖-o>9|IF_bE54mcv4$/Wѣ⩈D/:ƍ *Hĉu<,UT'Ougr=k.]:$|OaC@>} +p7G|*HHHHHHHHHHHHvF+Wr_x\E0š`f]$ Gh$@$@$@$@$@$O[CF2T:t1h.֭[ԩSJLPJ8aԩSG,Y"*ԪUHGI={N6lؠ4yٽ{')RP*U$C 8 xK/ɚ5k,KH6lR~m%J s/lU0\Mi$LzիW[ffڴiRjUom&O>e]OA3i%dҤIygʶo.7_zu3FC`3@(Txq#ӥ]v{@U!sH׮][9smV [ 0|@VgY65XHAr%{A$@$@$@$@$i(+MW^ǫb˗/<@ p!ٱc믲n:f͚խ'W >\v*Ix?!Cɛ79sFh'y)mڴqf_#q|`ʣ v:OeƌJ|& gPBEɩSѼK:4o\yt^E#… z&VN>@t_˷~knnsxÝYyb{}^JXcN.K.Fe֬Yq D}/FR           0&0rHcSɄVtπ1p6hF+ @xᇕW{١^I`ʕ?ݻ;UO  &۷w_bСC:׭[WK~5ٴi~sz97N ІHz I*N"rW… L2#c]q] UVIL ! AL6Nʕu <P3 [\,jWY4i"8fĈ.+Ygv qF@Ν;Kĉôl6 @8w;Vu'y ' 3[n(xB$@$@$@$@$%J$F$E7Jb%Ad5d„ dbŊ$r |M婧Rv | 0@ z =* ^^lڄ!^|ώ8BdԜ9s*WUW_}e0xo.|B,  dB`׮]|>s%]t̙3+a)R>} ho(֣2ԩc%$gs;97!!> UժUU`tRpab-xqgZR~/^l$ޞG#H#1W_}UuIxx!˖-dɒEj׮-2G_Ϫ?Tޢz!>R~r%m W^yhEa$@$@$@$@$@$@$@$@$@$@$'}j\_OІ&IY9 @@ `6 k4 @8sm §l) @&wP٘F$L`Ϟ=΁Q(ɚ5k`IXDϵfOI  xo#DṙyD$QXY7 A56'Xzࠑ @$Gݺu#K @@x ذ$O6l.]<`wۿ9r(+ݻ3FyY~!fpޓ@ k]vڪ`@|1rjxD4.q G xGǫ#UTҬY3>|J7D-R^%'O.#GT4iRxƕɓ2 2`5kU̚5Kyp'i޼}WF i$pխ[7%Pߟ x57qg޼y+{5ݻwwGT(YT yxq) k4F;|7`r&? ? ]&N(8h$@$NlNWm%&q<$@'vZUp m$`$@faVˢIHHHHHoD0 ,.YD X;w:.Xxv)'|RoeL2)a<栜EKQK,GId|:v'u <̛7Omo0ׯ_3fȲegL27 ^#J*w >7 =}\Ɲ;wd*cq+ƍ>V6O=1p߿d ##ꫯ* #/_m?˖-kPe@Ӛ.Eh={V'UvEyչy]_|Y^ː!z?$ߓh @A  ]Ѹw}W0WFaMB_O$ȴc&WmwHH<$aX`61 MjժQςš;C@H1h ٿL;}45Ab|T~QWvHH&=ŋs~n,g7]TgAT_~v" K(QcgH 8Ǜy$*a>!7uzO(1 ) k"QG ]tjQ\u&h`/H!@a7DҦM+ԫWOd"JH(aMΜ9g5{=={_!xJiذѾ=z,x=J͚5ZjF`svoJ*%cǎU^[ S޽'LlU\Y5YfjQJ ;Mݻ; D4|šgyF>,R%K:T})SH|`vq:7<zcW^Uc=w, h$@bxx"    @XF$@J@{ $@$`EH—gts  V "5xQ%    DɅf7m'>50˿] <1_ˡC|ʕ+rq?O<>MƗ^zIqL޶]6mс| 2(/98_rs 6/[逨pBF9d߿E,H r ͛W2[;˕+>{d:NuЋ Ο?Gdɼ(IIHHHHHHHHHHI`̘1r1Ueڵ`U]X I `QPQHHHHHƑ{E.;*TH}Y3g&> a#xXٲeմiS7t g})\\`(XcEO?ԪUK/_. Pz={ѣ*jRX1dB]9 sh$@q 2sL5k[]sV9;Ӛ|>m۶ɉ'|.I  K8]gIHHo3gӧrV^ Y xHp]t05 @8w :T5,q2rȐj$5!u9       m.]ҧ|%'{`ٕ(^VD‚lk ɑ#ͨQTFIʕ. UT5j(^&8{[n)IΜ9]&gCoχn<@X}vI&:WK&$Mԩjժ)W.\PRXㄈ$DiNBnK>ڵKv)JCB 606NW_}% ,PѴc67n9jˎ B3gҥK,e9s#HHHH&|W\Q)9^ݤ~TWIE'HHHHHH \SժtҩqkcM]l$`8F,$pEHHH<%x|.mڴFcbbs ݻW-.ر`~)_ [lW=+OEmXxbWEgSN"E8F}:ulٲ/ȠA,Fs;PL4I3gV(p-=>7H"E #"m{ b5͘Y~M~a1B#gϞ-[nݺsywIGQK|O D ch^7oE*_-Yf@ܒ,Y2&I{֠Aٺu@YB?ݻw+)~h$@O@ ;h @ .7]6lU,(! .T1'%hF$`M"Iw]Ak.;wQđ3f̐rav@h߾}eڴivZuӧO/ 6-Z @0of`HH0J*Պ I uԁ,eGׯGHO    H%0sL5a_ɮRX"{7cO-,HSE:qĞ&g:   $vX6Ԇ@xS6T"H ĉe„ rq9uO!O<#G"Zx <ɳzj:!]Bl>\>`'І]){ꥎ˗/ˉ'^a_{\xqٹs?^bwRJY.W\N5e DqH="'ui$@$@$@$@=x)ͫ(vлӥK'%KTGСB 1cFy'Wx8D_0&9VH$@$@$@$@$@$@ٳࠑ @@&MQS };w1'µ&%߿*gĈ-{)ƍSq>ׯW@P,Y2|kV3gΔm:ٿ4kLc#!z^pz%WvC5ӦMUZ3h> xOz,GAaMg$ f58     yg7nY4"      &++54r!ٱc믲n:ĝx$ÇK׮]CaW"?Hg F_[EaMpy6*`4~h$@$@$@$@$@$NRJe49OHHHHHHH|'rJCTKݝ ׏Yf9 ph߾9ȣs୤C7'[|*m7mڤ8p@y?8^z,~ "#G ֨Q#Yp@h+'/۷:tg!uݬYj=o< ?hUL/e]O_mۺU pikXݰaC{ꩧ\2Ov '+SA5*ڇ*Uu R\z[7@@Ha*]w1%~5qWF@5"&iN A@@ʿ4fulݺu@QL  $YfY^\M?c uԱˮ,r.3AJZr-O"_}{F>5*\)x&\VZM)lٲv 7P5oxF ? D{HA5Q^zi&6U^֮]kof>}dj@ QЍ& P׉Ueb|tI>-G"  @6?z뭁Zx."X8, }Gȑ# =3G  @: B`Mgo˗g_  I|ꫯӧOLY@tbzJ-pꩧ{^B׈ښ5k>z-{Gb_W B׮]c'eؒwmƍ7|Ӛ6mrH]t-[ֶons9!źVZ+"V [zuN [1 y1|[~}  ={ݻwn{atqG5JQVj\}!IA@@RApapμ 61vG3@@A`ȑ6m4Ro'c%y0GF@\=@?{ ,  $k;C @@@O< tC2ٳ8x7Ew!v Mm۶e4h.bӤ֭˲#@7r<n+Z=Yvc>3ܿKH}e7ى9=0uŊaܯ_?+]ڵ=\[hQ:z;n0BuԱ5jW5W kK.u{v<@ QEhZꪫM9~+\+ܺ+mٲe$ [f @@Y`ֿ^&KVdɘKƆdIƳ˜@pƚ8vMW   @BWVь;v숮1@ȧjղ7=C4V` 믭UV .@ ,Yݘ|uיfW`a.\h;wtuCt׮](ho߾GS&Hn裏l&zeE3fծ];xS_jÆ %˱ 6n,A}@IDAT{41(駟uF / jjf̘a:u5kָ௪Unj3e9M2?{/_ޔyC?v & WHU@SV;S .pזa{])T(:o۶ۮڄL$U$>XGS2UW͝;c|) I Z6mgN:)Ѝ~W{'mĉ6sLۼy{x_nլY[3Zmٲ͙3eY`M0!Лǎk 6 ׂxY_~e/_zڵ.[3  A@uίIұXgcB'\ؾ,"  I%Ppxt@@@r.pgڨQ瞳u?;8VU\9lZDJ"i3}]F(9xG<|s7Ѵ}LhZ+͛7}Pl@VիW/e Eʹeĸc׮]~zlz?QDLX@~Zn]l۶mȑ#V~}ϒpErv?_VE1٭]֖.]>;wY6@@L@* *ms15NZ֤ cD+XC`MzG@@3t G@@@ ɣzNǕc*ikQT);#lG+WZh΢娣r|FD=U@@@?ꫯÇ;A%$;e`X,gq ƚ{&h/t  $FH".5W@@@U`'cϞ=]v6>    6UViҤ}islP*C iٓFGơ   @~P`& &?m@@@ ,[&NS~Lh   &,׿dɒ6n8+X`:Zc &, Hʮ]E@@@9tPJA"   @ro*W`>@@@Hu 6 78#FXut=   XsȑT> Ǝ   ,pg@@@@>lW]uܹ5W_YE`M@@vC.6lG@@EਣrC!&YHގc֭_mǎVR%;䓭iӦv1dm޼yևZQti;Sݦuپ}ܲk?޽{mn '`J}v7F?}n%JVٳjܸq鹷lbVr:,+\pm7ڵkmjժ׬Yc6m [׿^zVxqjݶxbf\|ySƟiYܹs- \ 0ol}~7i]FPElϞ=`ݺu3XtXbV~})koNs8_-j'x+Wο:rNՙ>S~ zqg;3>;9u]s { 0X|KdD      SxfΜQ#G˔iO`Mʜ*@l+vyF@@RB Ѭ(+nC q ֭3&æm۶9眓a]Z)S͚q端r˕+W6p^HLMg͚e-[tǍgW^y[ϭK.WXj׮fw5x >}awZ=9l@ &M7_Ѳ\G}Ԟ) 2?h"d;}v(PJ{,Q圞FܺukxGV tWpNjٲe]g5j{*GpzOOn&cǺͱ^K}:o3ft4+Y}=6l0!gO?tmywObghYd2eX͚53Ֆe([dPY?@Y*2~ZcuMF?uD~m{wCvNqV 6);o;^V͏?=,3^)Xhm۶u5ʦߚ2* UbBɺsX^z%SБox8wqα·2h_JoWL_nӦM3_t4iW?}6gw}Lujx|%Q1"@@@@@ȉ֭[D޽vcI֖T;c(   Tލޗ7I58+}Y Fii97̴޿bСֽ{wɡgϞ#n P kt3/Irܿ+:| /a_LZ^u]a:s s/"     @u]&/T /HMH8)?)Rm 5dV"  I$@ƚ$:y4?YYjBh\`=\G*UUV[o9Bfwy /(#GheP %gҥ!j*Y+JO7t8͛;/x&Vx۔lٲ꺼CceAz5kָ/^ݼvx2|LA5Z,Y DKd,퇒K#cT      OR?y9=={C4V^|n﷯*(͛gޤ,^pHJ"p뽯= :PQ^%2 ,Ͻ7WwyM:};O?)Wpٷo֦m~hFi˗/wOnmڴ M[suƍg-r /` "2n      Z`ֵkW;x𠫠5V~-3q+/xLW,  @ݘ ISuY/pݻc[7Θ1#C*nr~PUbZ~HF^/{֌C 7hܹsΔkJNo9W^N;4geURŔ "\Z _V7ٳg6A CYb-c'Ͻ[oՔIAooB*U̙c7xc֭vf]zvϺ>3.pϞ=aS ѳHA@@@@@O޽]5yփ>}4Q(CC x5zm6T6   @J&%NSBxGfw37k\U`=h+2f͒?l0?d(VVP!P[55 邲8pe8s]w PPF[}/;={n_ . lrX"v{^}ͮz~SYh,Y2;_^/J8\K >}ʒ_$? LP]K$muye9b[t ёveC믛`/0.P {6lhO= QO8v)FEо@@Sի{5P@L~g  @I[wb~:/N.@@ </_M|OIz9|%}"  ֤5YW^%-⮻:U\ͦfWʖ-k7p QPAUxxgQpnYE]d X<TV-&曭tnV\ifPhQ{ǭsaz~SYA3=͟?vaeʔq.sי^JN -9yk׮uCmҤ 2~Ng,?G/usOjUFK/4iƔI׈.O>*ktL x(PeQV;Xtmmݺu~@QL    _~ 85vX-5fD XA   I!ʹb.Lbq„ nYF[klƌ /b:rmuC34Ì"Ex9~>t}GLzu s19_<;yuNr9{gw\L=|y]v_|a\r9s)h裏o|+rz-d9/i}}\wu__$^ku>i7~[ 3 mGQ5^]vo9T>{J,iwﶍ7zUݳfWQ0_BLS~An% OI>%@@@@@ M[n')F4R=@(W\8  wC5r;NesHe˖ѣcǎfۈu+V=zIX0qXrWNsF;ho*;zэ^~GwEI\o;9pwx3=綳|w B DWjUEVm^Pv)>|N:lEvG@@@@@ y6l;N}>a$s ,!֤@@H{kO=T{re63n8{7f8`GvZjeKήID/^lk֬quTriejj* h1gSVt-^x]tE駟]Vv"9\|ykԨ; :*V uS :Ԕ%Iא>{:um <_>c_bŊ@8H> ]zu [1 5kִhEUm@  @ ܫZj&Nh@H.]X^Bnc%  Y =z >{2Fusn~k=">Y`PY"I&M̂ ~gRY:n 1h߾ʕ+`cw4C ̞=ΝoE@ @qMZ0uxvO_,}<8" $of;w={1^uUַoߤo^쨼9F(W\`G[n ,  $5~?'xGcT{С ;ԗrKF:d/ m@H5TVXmeٵk}6~xw3>u6lmV4iڼys T^Y\TE?;vk%Gmw9|p~n5kRD$%9ݻ3yvDi_v9R؝wC2^ޘC cq޷o_xAץ^3Eǭ>e̙sgՁD\YHZ>4K.֭뎡w.@; <֬ܩQr*W\qJ[lYu>ej @vY    @^{-YY/Bw @ƚp2G J*eEqHG4:\@@H1p(O7^wunO>лpB۹sQ7v5lu'wś'l'ШQ# ]ꆚI裏vYknG]pDUVYkݺ իNT߻y:ӆ8M72dzlذYwC=l0Cm NT&/LِsVMጂ(lٲ3:-[tAz-X&Lج@c5׹xLۿ_^]vveyxF Td| ~Ju8c=}# C/nM6Z"F\r֢E0[Z)F      dФk;v;v ;w;c%^ &$ +H?eʯJ`3  $7n R3RX1;vl,Mi@ƏozRziڵ)m@@@@@@ȗꫯŋ?W^1@`MdNB 5K  CСC@ +qQN81&RJԎF$R`ٲe{O@@@@@@4hM4W2er8u@ܕ(YE *U2P@@@T &cѣcH"1h߾}>D@@@@@@H+ &؃>莩`6~x;}0$ZHk0 @@VlFzJPgizP@@@@@@@ q?]wu 6.k" &2'j!_~%叇@@@!@`M8%   /^lwpEO<ʕ+a}ڼyW|]ti;SCnV^ϟo-2eX5 Ŋm{%JXݺuC-,]vij_~PUZxjլTRa[lر#q{U?vZȾnj_-_WR%7kӦMcf6qvGg?."{qeˊ5kئM24-PVJ̵ޏz_[ժUp¾ג%Kvڦ̔zos۶mnw>#Gܦʕ+g8ׯH^zݺ9s Vŋ,_SN &sȊYY^=gG 7֭[gs}*{5]W*'p,Y2T5!  @l޼:t]_6rK,@`M3F@L2DH#@@/&7`@@@nF1cFv ^ڵ 44WR 9:VZٔ)SBnK/5<m1b5ʖ-k[l:*Iu˖-~ƎXBvǫ`ݻ/Kq:*6ŭjSN͛ۿoo{VmȐ!ࢠnݺ٘1c2lϭK.nqj֬a^(X;/re3Ub?EBAv}Y۶m3QpU-2^|+@kxÝy]{oxMϝ:urAF<=䓮nWM"Em`0׫j\sMγ>k7ү_?{3U̾7|M>=6P`Ϲ瞛a{V*ٳ]pQz^#W_}y Pg̚592n8+2   @r koذ LZJlF+RN@KRݔF`Mʝ>  @k    (LV"֮]8^z%ƍ=te* *ow3ow~.Kܹs]0- ݜL,~uYަ "QPJpF1P(橧W^yeQƝx(HQF 5 Yr)0i…6sx.y/ ?tEAQvԮ]; hAԪUˎ=X7(#\,oۻロip7|oߜ/ӦM{ڴiِHN۷VgW*zSV=)CWy'(@TAS:^tI.㒲(@Z;k4!LVpT/TV#=?>3=D@@8M䠮߉'!Sbஔh@ hƠ *$ v F@@ &-O+   l & ^uݻ +\F@:tⵏyժUv'Ov" XbE`2(> X  ĻWO<}.BkK+P@wjFi}ԧdQ.PF pv,={tQ< ~ uI&㏦,KzFe{_8a)p+2{/pYkTGA] R?~|Sn^\ozxE'4/: Q)H_죌8ʊhl ( jʺ}^S@@@ z@`M&_.>7s}Tgƍ/)   @ Xg!  [@! QcΜ9qݍnPP~e` .]tV+y<[)(,Eee;]Ї:ꫯLf(~FMBh\`=\S @@@ ?[g}fu#F4/vՕQDa˼ylΝnun֔)S&0;vs@zxf9/z^ZyҥKȑ#?_*G7++]{jժ_א}dw~Շ2PO{v, O@ތ 4VZC=dz++ lN e(͒%KLYe 2Dw7olk>bW7=e^xwѦMXvCu7ƍG=b W_*(Cz}/|kMQ9{[n1]\p 6ӹղ6ƠT?\9SnPaÆk?wYh`_|1C[_7Pe~kV7lОz)l 4?p "UP}yEZ իW۽k   .B7&8mĉVht9Ĥ8k40rG5^@@@ >tB  p4l֭c D.0j(Ӄ @"ϟo-[tcڵu&M YT\e7F0x5KQc=f;L2}٬YܲnNTQ… 7[l3e.J$e!ԏW^.VA{(D< 6.pF7)R$p Tɴ1+o}nTO\VtIֿ{曭tn۶mlʕq?n;w(**EN{|饗Z߾}ݸBv>QEYD S2n({ƈ#ܣXb8~?AǤpZj6<([p sS͛7v< ~z . LSv3{7'isTuF%GC`'3  @:(ۤP}+W.-:  k<@@Hf dkM @@@dP§~a8Q^뮻.P/t3tCm JQPG,s@]pkɒ%Gv_~ dTˮ.@@HV~^y^gk Jw$dV`͏?hC_R@@@d֐&3Ԙ}Mj  @V у @n (Gv۷T h޼5m4= ^P2pCڏHX~ŔgV^6h[%\V 0ƌt5oܮ&Mm;wvg}veRη(ݬ\lZ\OZVr9~z\y]~}{ꩧL[Cu<-Zd˕rS&MmЊ29(Lmꆪ* SM} euUT  ٳ2/&S\JJ\(}Q  $5zf   @nF;DywqG\w /*OY9b) (M Є~[nuhǫ~m^]K*eSȪ~*o+S){g}2+(?7 | )__q}9( N@)J?~,jժn{VYϼm^,;p)j*I' R @@ )V\2n|^{|%)F"cMLH_\(nJ"iF@@@ o˗G׈  ʗ/o[>}z7@n tz[c? dʒ!s̱{:u*xeaÆQ5rcSEb ٧zd*Kv*sMQG^x]tE駟]PuB^bezeI:묳2mOjrV3mU@IDATs1wmƍ7|3,idW;0oW7l(6ԬYϟoυ  @: lٲ[GNCNc#&iNA wkw    5[RAϝ;7FF@'KN I!P^@8s .0}<8n5e˖5eyG_gh8`fW~Mf{klj4(o P(vMlT(ΏJ~V|w[ǎ+I_)dp\|vǻGM6Y*UCWA5*`CZ vizV?X4i-Xe=SPZf͚Vyuc]n߾f2@@HFM}`O?y+\p27ƔS)ș'@_hP@@@d &3]+j#  $2xA ƪ3۶m ؾ}{f~ ٹswyE}*;ΰ( -T0lk׮{7:tȮ*g -O<)t3˞={[n @ޡC]n֬}/={t/~{L4^4hDz޶>#5pAץnQiY:uX5 'Բ($>U`PKnݺnS޽3Fʶk_Kgj"]wWL:,+mٲej}. ><6V   ~oPO8裏dɒ>kTr D&@`MdNB@@RhѼPYEر#G@HZjƍfСF˰؀@kkժUzKHE}yo7kz+ŋ7/˗/:wl?)〲vyÆ tRSP? FfRJ E 졇rYz/3{n7ϪViK,q7\wu.Cު.\h LR /E_T#?eޗ]t Q'|ƍg 6>;?@xy{6lذL)0F+~{鞕w]ڡkf͚5s,G H׌?Q?($@F /tSW*`ʮcƌg2NB-Mת:͛g 4ƍ2s|h"ɵ@@ ]xҤInEA5+WN!?H?N:EnRz\    +xk&[@ ~{˺Ϲ% @/p]w 1(0}1/uY6|SeQ^QVބ+9ڦM{]U.\8\<]ߧOw3n^jЉ'2t <+FO.^= F{Gު|2C!Hcٖ-[lʔ)D'7| 80i{&Nh3gδ͛77@/rVfMo5L6-clٲ͙3*CՄ 2vXTX(gϗ_~izxEڵkg]vg@@RB@ n Tw]ݔ| 4: J/1@@HV2$a\   >}zDa/K@byۢy>K:42eFo5f#%ǫ(2,pHgԨQsٺuvrV K/UX1:jzD[7oxpJE7+OO* #ڢl c׮]~zw:ίq%vsـ@@]snݺ?ضm#G\3}>+ .UQ#gk׺ kIh6Y<:&! o(+X-k]krכ!R5[nu5k@@H6k0@@@tЍ!Yt.:NMQիG4{]h TRv駻G*1",ʕ˓Ԙ~n%yf  Po1í[n,5H SN9>s7eQw    l IR@@@@ ƏozRziڵiʶܹsLc/V;64B@@@ꫯ+Çn{ @`M^ ?iW\I`M8%  )'ƬC(    z˖-'4??v(V+e\    @ ,Zڷoo=\s=#?4!5i~9<B (cW  $}:c,    @Fʕ+4>;vh1 H"1   uUVcS-KV@{ )@`MHV"5֤@@He` kRL2v@@@,pgzYEj!   @J l޼Zliwƍwޱ… q` I3q!I'"O[re5ل  䝀X# &{F /ݻwghѢv'Zr2~qA7o^ꐯK.mzjmիWM˔)c5j԰.(gٳJ(au|^tܹӵ_~:Ѭܾ}-_<裏6MRfϞh/ ,x-lܸ֮]뽌jժagd c~,볲RJ!ܻw_m;dɒ!@@@@@K[no[裏c#j'L1+p1Ǹ~t򎖑!  @~nX_w:x6cƌ]ڠALe۶mv9ZiҧLro^zY&RJ٣>j?ܶ#FبQlٲe;ꨣ2VhF)}rUWرc1?֥KL+Vhk׶nyebw}nvg9a馛2nŐ!ClEL Y rW\})R$f͚fӆqٕW^+@@@@@@ :[LGSE?l'!n/Ω59=)*PV-w֭[M7d7Cl&F@@h 2(Ფ(3K/R|*eeWU|M5wqvy駟2̝;הQGYlҶm[X1~uYަ ,wS)۰ȑ#B Yϰ]C(sO͚53ՋٔBYsB=.)f!+@ Wtm+v      Y֭[7$x*{jm3?[Xg#Gv}gnK,MH-   ZXCƚFE >l:uj` y׭w.+ P5tP޽{}$ V2ej{M3 *\sMj!_|njLu͛g;wts3F;T6o얃{AK޳>~^{{ @ DQ ɓhƍ~wyM:0cOmִiSSqKoZha#G˗ӧO6m{&U,(( $DEY # WWEѫ&L{eE]L$H$Hɒ%{ܞ ==3=zOSΧ{0&j&.݋5;VXaȥ^uS"~n@@@@@iC3?ϟ??j0Nx;]ϭfG {u K 8ДɫXb~P\ɒ%m֯_4֭)ƍM TԩS6dȐjVW^yŝw.?Sx6"     S=锵n YH\k [@D4ݗJS>   aH"> ͛|>$U<ӦG,=zvM,R@R&MF,|f9P|,FZPǏ[%Yfn_Æ sϵ={ {NqL55ʒK`ѢE֪U+w PM6 N+r.#B45eK->&4%tz yM޷o.]{7|5={H&cMf䨋@ -[ڵktP351[-y.e@m?h;3|kq>FrX3~xץ X߾}SuOY|~:o ddJ`o{BzA+>Ye׍TOm2S|AEUJM#>SR^< @X@@$0k,[رcnw=7ް~m59oH[2el޽bŊA@@ JIX+Я_?{LO~?~. /tm>}ږ.]j 4tmڴq|+c–-[H"w߹vr+fu!A3*5m49ĉ]ģyw@ Ufݺu1c3ՍWY-Z~7QF@@@@@$5}lSN6zhoY$@`MLl@K믿m۶ݻ?Ǖ   @ &ϾttL :Ԛ5kf ,O>:v6"ɨQb )W5j/ElZ\ri@zNǏYt֭[[R.\6n_}U T+_4ȻI&~WϹuޘ;́ Bࡇc￟f0ȷaÆLJ}nX/"X?! k&s dU@t̘1gMG ]t;3M  @/^l7t=ݺuKO?uZh1F;nܸժU8`k׮+VoLIAP~F?@]hj}􉶛dy'[NL  V\iN{nYf6i$+Zhlțv#okZ@_,X "!cMRx@@Jz9 9"ڭk&L`۷y6lh-2eXPK&ML7ъiz-WEYJN>j֬iܣGϞ=.Ju'Lڑ߀}yέfoA (kMZ5jUV.Oi_Wp3&U6Bf4%X^K4`ڵmҥcL6(   @n f(QDnvs#@f̘4 ϮPm~_f˖-kkkƍ.AҥzvԨQL.;wzN##% nJdy;'@ gN-ZdSn]Y={S\0gU۶Kh0٫jÇM6c[YȔy+#@@@@@u믷;vSVSkM`M{M"2-p嗻/AO<4h mp   O2S@ hY փ H؎,P8 @@@@@  T۷owGj|jfI  )D೘ Ӎ|Ur7gC a~ Iؗ!  5~JR\8   o-ZdD h ?lݺuH=92᩶͝;7SAv뭷A}h׮ F ݧ@q 7l2esW`e"oТE STziq~4i5m4 fԩn/2ؽgw\!lA{GKW;TfM'Mk)mlBzM7d LrqwHzn֭M-}/G  eߚCEY&ɭr &li<%ШQ ,n-Xg@@i Pр>;O@@@+V̵,4ʮl6N}Qϧ>JJMTOA?wY]4(䪫rPYfTF(( HǤX*OYZRԆ2j (lٲ)&T{p"*UF P&ѣG]wB:u\@ҦMl>Fa˗ܴiӬcǎ. .mڙgi}mذnf׆kV6GAiM\?cǦU?)KOnʄ3l0:=XzTQ~M )`{ ݠ1 E?:oه[Ogj&Q&$ 9-^N!  ] {7+hMAPMv'n$kCQ(5ӧMk(   @n 5%Knpn@@@"[oؖ-[_~6qD4w}ߝY׮]b[FV9D0oV ySd=Q fΜi'OJ=@'~jQBElz Z`oNYz[Ҭa(g/) ^7o^eQGڵMY|Z 0:t^kCz5J'=6bgrpO(.p:@@@ U@   @>P*Uދmܸ1@x饗Rdʢl*>P)@-[vڥEQ-d?d,AiTkaQ3] Q{G駟:XA!Vrە&3}n22\ugIԢ< 6S̙czU-e˖wY&M\Gy7E;nnP $%   gVMpL5|x\R:֤nI@36(RfS@@@ cMns^@@@P`@fܳ>&9zKR6rʹv%J͛Gm>@FY|Bˊ+\FP gmw;Tn:ұcG[kGMѣ69jFr:}Ќif]w^mr[)CKC^<̗+W4 .l ru/^E:ԩS.Ci6b=TLbʘCA qSV3gbŊ.HSzꩨ?Sw.]4OYԩceʔ뮻eKnճŋ[ \7e   eՄ ~\&nP$kϕ#JQF ,   9)`'NS2LNs.@@@Pcǎt@nd(Pڴico|df/vՏ9btX_uUvW"TΝ;ݲ0q+Yv3q,˭h߫!e[QF7v_W+4wqV5jʷϥKݷo_ނX'eڱcnѢ Sf Ҁ* &?l9R){~fOn`I>l^z(7eZv;~ƌwP,_:^;uT[) R}   Mfm۶Ç g$#BgFkRа  9(l,   3~;[wU?Z@3gF}60<|ͮ:e5k륨ʅ^@ 6؞={\kիWЁ ь{;3<UD>Db|c_7 HgX;(@V{ٳg}.@MAj )Y'/K֭vqF\pB8@!CD<W^yŝw.[~G^]b#  @ :tG:ۻ** @W\R+eo   @v XJN>TL@H_ _+WƷAZCЬ>[OG+۷o"թYfЎoݺ5R|HUV;C(@2o<726~_ P48~A+֬Yc QTiPx< 6w\ꫯ\6ꯀFM`>x(-TR@k1pA}x 3 O+,Ruz5-g6a7XoO?mzD+ʼѣGhَ@ rH Qy7k׮A4@w5^jo4l0PvmS-_4h`Æ s6@e~G(FEй|Rۦq. |L7@@B{=;LcUt)lq,'5Zs+ZիgK,UV%@@I_~%8]ҥeР& $QE@^{5Ӄ @V ` |PQ&4˾f֩SD+ZB |AѬY31c})k *V^SޯA]wmzdGH2eO>.FA-ZpU צB*>xƭ)7`ݷo>~jݺ-Z>c短B L*x\RV$O5ePC pl.Z~[_V#:;Jʕ3:gǹib)F?gsΩWejlӦMG ۷oc})QЍ>)47F%G7C`@@@?OS0lwg 5  ƍ fi޼90   @ AG9ځ u5 0˹4ܗB wlO}T|>?Qp~Ҥ Q`Rvl۶mrOs9ǔIN-:ٷ1~x@/o/.Х:X@- ڢ m޼]צ;X}^M>CeQQ0.UB?ղτ69&A@^_/7#O\@, ȑ#>p%  5 mv0G! uֵ{,EDЌ?ժUˎ?n3gt5|n֬Yx >0oOY3˗Ν;\rnH({ &M#Gd{eիX`qƥG;vC_ FW{! ~E%JlA۷ow BR eQ_H6lZԝ"E.U^e8scꥷu VZ8~\u?92{Y+Z|H{%RAၡ֭sWZdtO?Mg@@xg.\w3 6X@32g7_@@ kbS35v4G! P`@)5٩S'7_#(?|&xRJ.T|Afۭ] vЬZӽ{w]ef9Kx9DEi믿 ,&SڢE__]Poڧ~i??]Xsg -(I5>)j"evi߿3xpgϞ=us޼yֺu]Y/^l[nk[@ d澧 Gk׍T/:t53h ۷o&SlRJuV@@Oࡇg}6pM, .P | )K#(  59-@@@rZ@G^}UwZL<9n](PkꟊiӦ,>CA Q]oZj֭[7;}if۬ m۶*>_W.R+^)F~.\h6mr}]lV]F%MD 3U:2}n<k֬Q&5j  NrءA5RCPMr2sdɌuH 'Nhvrd$ @@@ 8`[vmls I.Y:3fdymsrqҥyql@ nm#V2;~}g.IŊU]5 5D=0_%\Yf|`MƍMYmd˖-vYgggѬcǎߚ7oө?no;VYRJ*+Ҿ,@ $:|+V,~e>ۑ࿿9sܹӺvwzuHT|ݠB5+YdΔC~m[Se>:th}~E?tRu7@R d7luVu_@IDAT˔XfP" $ٳ{51Ȉ#N".5Vkb8f}R`>@燭KC@@8 Xܹso`B@ B|m߾ݦN"\~ԫW/QB?@ ~aX2-Lw.`CK,̢ruיh8V^ZZj^5.Fxb=<\re9_T`q9gFj׮^O>^|hբn_WSK=SzhЏLZK;tԻw]&Lp}VePz/w>ekQpaQ&uֹZj,4ݾ}{ B:vX;ӑJΝ_})($@F{glٲetRwZ~}7n?e|kp{lbm@@N\Fmݻwe@liF@ O \}AXCA@@rRش5qlg(@@@X4пI&!CDlB {I#EA)}uϔA%̞=4h2n iٲ[U&eYK܆8@浾~}zVP#9t2d(Iul?}vړO>֭s?/O>n?+ܳ7JȞ;( F_N;02ZW֠hE٢T:N2%Z+@*}wޘ@){[;f}Ꞥl ج^z\ b֬Y5I~`T؀  o8`7tST4ƍGPM}ųX=@hذ*T}p)   @N ۷/8]v N􅵊YKR@j&heСrR`޼yiɾp.(S2eC)N %Ŏ^x gq)s>ׯo,;wLQ?J۶m]}oT-.{ٗ@mSW^y?cVC2i=7jnV=틔aL\1p曦 @[n5ex<^B7nx~Yg:*U{^]pۈe|O[~\K)}2  @ ޽,Zusq^s5Yz &/!@F!f;wAtB?ph;C@@bk%mɒ%ci") X )  @HY)W#ɰ-;4?K}VN[ri?<&V h6lOA6ʼ|*֤ -XXZ/oٱ ʌ)5ktA- lٳW H3gAwkJ;vըQ# ,hժUsYnBm|Em s2ʄTreȵ~z7ޟW) ҥߔ-Ϻ.롌O֠2aoߧ5M< ̏w@@xXG Q2rS@Wl2׿\ƌ1SWP)3/_nzf͚9>k׮]܃|<# $&#QRPcTc)dV̊Q$꫃afɢ   9!೭hGA9΁   @VZha>hZmif/GVwaz:tȖ,YbB PiZE2r i}=z0="e?I?鑙2{tv9>Vе#Gf=u\^eo#L k/>Q0LZaZ}@Xʖ-[2|w#Y\oZ}`Y}/uuuˬlٲR,w/WeVѽW_uY6mdW66VR"*  VrA5rSe3M 2C6ȇJ?|&&\   ,w^׻2e$p/   yKxּy$mѢE룀0AA8sq)W^9N  7ec tڴi`n  X!Xk(   @N 58A@@@ k:u3&c9(s|Kݻk.C9@@@ L:ՔEî݆ g}fw^\Cc'@`M\1/Ep*u… _M7|   ɓFҥӨ.@@@Hqԕ%Kte^`͚5t5d   @{=ٳ8qµܲeKOLYz)dU r<Xꫯv5Ǐyu]KC@@D2$+B@@@H_7HR M!о}{\rLM7i$8@@@x > `OvMve峅x 5@ @-W_XU   /k%I;   wޙs'L1 ԯ_    ~a{gn^}U+P@*@`MV9|,F5OZ. @@ADxC,X`W׻4!+5kF<ƍmǎoWksvTRVRn??9k.\~Y%m^Pv\(UZ5PBڵfK>3ܵOuD:v-^ϟo. t+RHkڶmV`Akذa}V,YbjժѪeh5kl߾}Pn݈=/Xɒ%vA'N… uPhQ ]}-yҥZ*VhX$ٲemݺ՝Bܑʷ~k'O+6 Ѯ7YK"bq}/1@@@@@2(l.{#}Q2dH &^@>@.֭[xh=P@@@m_J.yF O ((@g̘ y뭷Yf)?s6r̝ۢ; mΜ9WpN|j;v-kB.]:jժe[oM?+][W߁@ p+ /w^~eW/Qzk^@mܸqv 7Lb\5 H`2߿_򗠭X~4i5m4xfԩ~={ a q#y睗b^+Vئ/('rʥm?c17tynwzF֭M-}/G      h@}?9ydKߏ}WeXFA hk48@oBu߫@@@ B3)S&yȲ[7onbŊYΝF.B=72kϲⷅ?g6~e7=z)~Fԩ2lڴɶo lĈV|4nMebHt/e˖uuARJ9jEnYM6:vhG .ڶmkgy}ga曝kV6& J8pՄVڧ,1ޮ/CS@a{vѢEVzTQ~q妇0ս{TDŽnӃMfrLM>p`&~C~V#eJY"W( 9-^N!    $ݻe ,p4 _N+1kr!7Xglב^#  W+LOgϞ.nݺ.{@BkFH}= _v_Գkd@ӧOÇۋ/k@y2d g >`!b2Ѯ Ziܸ}~sϹa. ])PP5\c 0Q:4,k.<4!r`O~P3>XҨ[V Yj2mPoz ,A^F2(KLB <`s]3g)SZEbZli}5iUϒ}٢/aP $%      K,*dsy9 N$+u#A * .CeH!  سgOpй,@^X|y]erg}NϦl~uє}GG̡Q-[l" >YlY>bg +e5zh%JXӦMS/rʹVumS#Y;OZ/+Wi>.\ ,^eTtSlĉn22eS $ɓ']~*VhUVSOEڽ{u=ve=SuԱ2eʘ&wR~novW/^4h`w})@@@@@ o L:ծ݅hܹs( @`M^x#,ТE }iO    ]d,椀2jY14X |ܫW/wDܹ3+Mc/b|Ӡk_4Z3Q]}զ_580V RQe /kWuBkyg%QF+N<|\t}-( ,K;vpK3)3Ё믿:^ +=}#ewgv. ~ƒ%2@믿ޔkڵ3f n2w@]cǺ{j_7$~@@@@@*ڵkLfϞmNA )i΃@|W~g@@@ Xw^!Zju^zfΜә5XF{|,{3D;>#J,c. lذ|mծz@x䆕+;|pK#tS{C3wEl      'O&WQtM'WKӡ|+pV2. &_ƭ]B@@s9'p^u]H"O_`]6mڸmۺ]ۃHuk֬i֭ /$gX9˗/u5j(XeAArQGׯ_?QpŚ5kL"uquJ*AK31ʂV>XFУOl^@5J… ;+ߞ8~{">+0QѠyޙ)}^`M74>&L;Oъ2o#n#m`7|ӺvC72-\6l]])ۖ/ 4aÆ`eٺu~CE3jMcgY@ S@H_@i߫i /;V\&   QueE߯1grJ<a}饗ҥKmɒ%o>"AI@@Hdl5*ѷ 0e_3QhQԩ=VB,X<(KRLӧ vlWk|PϺ2h 뮻\M޽I+e!AD~7Gl{+}>[֭M祐?~gJsArS_~q pR6̔k֯_oVr,'}uW]q}\r^縞Ȁ@,=(O?s;wNuVV6md~}:gҎݜ8qš5k"7 %G7&NH`9Ҥ@,k@@.4Ӕ)S\cdN5 [@oҤ}.)krJѕ)b޽@H~EJ.(QOgCAH*⠌5*z/iлۑ 4l;E ;R]X}=kZjgL9TK!@ deiu#]Mr"m6Dx׭[֕}gJQ!lE_f.VH*m6E@ ^J [.3,䶀>  y]`ٲev7}o駟W_/k% ͛7w=f͉sr@@H.ݻwHP.̆ :t:b W^xo32 9NՉĐֱ)sE/_nm,=-ZkxRք@(NƍM8 FR`PAKp"Zi߿3e{RƳgvݜ7oiҘ⃵/^쾼Q( &^}nz $=tkfРAַoHMVJ >S^?׍ @X@@.'?xkLM<9[zi! $r k][l쀱#@@@ \y,@~޽{pY~6`CUfݺuӧO3<Kxߞg 4m=Y8g?]8SV Qٶm[+|]__Kx.F~.\h6mr}]lV]F%_7jLYL\5jH@C      @b ֮];A5M41M% d }D A4)S\o9Zv@@@ XCƚr i C ةSsZucoHK9~o}>PTXIuLŊD#fr}`2(#>T$guixv+믿vDbŊ'NW]uU}>Xf̙sNڵk_n2TT‚B,Y2 gܡoz)2z);T#؜9sLu  6D5|ݨ3C2e.8$lڵIm# tϘ1#C \K.vwof@HhM۳>s;XNN & v!@J E5<#  Yؽ{wk 򠀂P(RJ ըԫW/jxr}'/fI)gaO=THe#XxM8ebl믿,X0/'z=@gE/:6;tW,3agъ_% K G2ejժ+ۖ楗^roB;fJcǎvu׹ōk+7C($@F{glٲetRwZ~}7n?e|{~}X8E`ܹ&r U 4P|ߗq= !@vC8@HS@)>ào=1 "P AA7@ hQK  K`׮]ASe˖ Y@ ((w^4??:uXëu+(SZmT|[]>k'tuf 4rdl}Rl5%/*ߧge+ QC+3LFKv[)[NG4Pܗ|0_nW\q垽T|;ZRX(k_N'VpKB\ݧYo 7n~u=oŊ߇m! tS} @ :Mm?y9iHv6@@ \ڵk&HS[>Dm6Ms<*o74 kԗSX/ }@@@ ք'e$9c_eƍٳgfd N`O2Rf͚.PCK=}m7<&t=^ٱV>gS& C5W^y;jԨ ,hժUsYnBm|Em s}ҷo_\ Z~HWpt7e˳KG=4iޗ&L7;뙲ּk6yd70?Ad@F{ =Ki-[f׿(Pm̘1qj螹|rEЌ5?A^ dD gt߫dؖLA@zlUTq]vey2k X/<@-[t<~7XY )   @<Bkʖ-&i\]6m۶A^xQD} =2S^Qu?{yxΝ;G^7=z0="e?gWx=2SJצ#GآEԩS.sMz&֭[rE*:tۛ))GX)EP0LZaZ}@Xʖ-[2|w#ҠA _CV7>dzuҥKmϞ=Y.}!һ}VѽW_ÇۦMlզ P})@DR@@@@@rO`Ĉv4lƏo+V̽Nqf2!@`M&fKƍܹsM40HR@@@ yf9G !J,i^z{$DD -ZԚ7op!ݣHW@Ws@A| +; @@@@@qw 6,Ф~)R$.@`MBhݺ Q&OlwuW.!  @^5eʔq2Z/(ЩS.[$cƌXʜ|`zRzmڵPA@@@@@ݻۤI+}駟6MFA / X^-@h@?z3aku  uXSlټ~)7n\LתL>Xf:]s59I΂      6md:t+V~,XFizSAgx @ ׷J*O?d=ztm֣"  D8vi6k" x7bXBb:2/о}{\r#4iq      f͚e:uݻw,S}Gvuߋ5%ҳ)k믿j 3"  $MK`M\g~;ek)zP@@@@@@Ȫ[oe}Ǐjժe&LwYmUkr#w4۩kT Q6@@@ V]vXP   @ ,XV^mׯŋlW^yլY3b6nh;v숸/|cz\7o#GݥJJ*Wu~-v9{ڵkc .(Q"ؖ +L /'N `Gr%oַlb[nu+V /0t[TjժV@ֳ+WځRyg\`{nihry|߾}"͛["E:}$@VI  Nx^x@uXɒ%m, WɫF Zl>mdCA@@bعsgpX `#     c 0`͘1#9Xj5kbs=g#GL-ܹsI&vۜ9s\ʕ+s *oZj嶏;zᖿ+ҥK ѬE[oM?Bϫ.(U iڴ.?A={Q4Piʔ)Qǻ-Z/2j]yX"~5OZrR+Ys~l̙ k.']QPK/dO=^|Ev "7o^,]cjwqGLQPkWnEuh&Olv[tM:v6s{ݔ HA+mڴF}VVSR?nS?4|t-|APwʮ, @Yߦ:5@@2v.L2۔-@~(.Ah׮q    ر#84Qg :   T`~ 6ƒjt xG J*VR%[~}ᇱ40՞GnO? 䗅ǻKiݺⷹ D-[t_XA/]Z);fB^`AN4ɭ+Rk{XAF>[@@&ߙ>v5jë5D & @ C`~%K짟~qTB@@X.:   9/L!(JN>>wg}6nA;v4eQyGs~ԩS6qDw9@ʔ)Sn93.\ YxR֗-['-dI ۓ'OEw*Vh,UVSOE޽ۺtvr?ʔUN]wM6-k=ozYŭA.2Q@@.'.߿}*_Y`kԨ *@`M0t "о}{UV?+}   85dIׅ   $2٬'<}np)c^\DV* ,X4c2-Z8`_uL]T Rҥݱ_|ELmrPBÎ;,k/'O JQȴ@V?<6uTS̾}l.ەE[lIէ#G,b$믿Fak׮uϘ1eC]};U{D"] W@XPPQXp*cAPh *B*]P()ug$9'9 >]^{o'z٪U+?~[ΔJm5j֬isMv^6  ^@3+1c|=.l}X@ + X_UƄ9PWu<#  @M *ٳgw7d{@@@2e]fW bϏj Ydžz,[,h<ЫW/^Z'wvMaxU`{۔!X~mذ'ehҤ v\mn\rJ8h܋/R Rn]*eQ&#z޷o_و  ^`ժUV^=zyĉ矷l9ެ =+ 1 @ Ԯ]."۹sC_(P :ę@@@ S x^xnL9t2zE3ER@@ eظq9p;S`l@i=æ i((E| 7k_xw饗͛rl ꫯ\V#WҍB,wuWMJz*ЩSd믿޷O˟}'tߎ=~|嗭dɒ!Yra U*TjdѬYuSp"m/%\b9s lN @_L2.˃6ee,?mذmDA תU+=pVY'^bhĉ.Ķmz 3!+ƢEk׮.YK+xH}2(0'N(REzUPu[oM@̊+>ד&M Xӽ{dz#0FA7'OF% wʒV3f ƃ@HA)\{EM2%^]JdW ND5*}5:pZ@@2]_x:tƚt @@@]t;M7uT7o) ͱclܸq6{l9sfȠ l \>)zܹ i0,&\reVtd7(s΁î{jtsxJ*V|yqHu YEgq޽6gYXF{7v>pjjwmw2z}v`ڵM]X `s ݻw'9LrTo[>TYEU… u  \`߾}֡C$iBMୱ/@`M .pW4ôfR*8   ը.5 ^G?(p w@ *TȷZj6`: f %7o^k߾{WcǺl|no5/j,YT)\8p('-eϞ=tX/2َ9T'a@@q>3F\ʲSO}yF~>삿ymvM7Y֭öN?H^&pY˼}^;-8{6M@IDATM͛ݪ2uyٺ./  ]nfV4 ѐ@ Xx͝;n@@@ (4%:ŋ۲eˢ;@Hp~W5kV0"Pz " ={XٲeCXA Qu/nL ٧P;g}yg=\f4m4hoVXW_ϟ?h=~3dI6hw\6lhM41$f۶m_ 4L7:N%ɸ"8(w]Xf^jԨ?-Zm&劮I'NO>t2D!  %j*k׮/;i~>`B90XR1) W>#og@@@ n k<ȟu@@@9r.{L E7Ku TR`~ilGc7mڼysd $+Wjp:t`uIvLF pVu e UZjvd̙ɪ)HA:Iof+ܒ 9Tە1CE7}yYy+T)m =þoF>@ 2\ooVk[n}Q:fWoܸtɾd5Id؀ $2+;SD_~T8IXH@-,_|/QMfF??-Mr,  $kfoݿ q$  $PJ7}!4Xj?%K(s& /@#GGMY ֭[mÆ jܹ]PD~' Mwu]g)ּg̓IN7nܸdSco-X=*Tڴi,3  ( v |oL;tP$ & + V[o7ɓ I+(#  ^`fZM7!"   V@={J* X@ ;vt5XkR G5@@L_ ~ׯCm1˕+/_ފ-d{T^|yjժAy5ӪU\rYZj^;x)床S&Xn]J+RHQo_xX.o?uֵ9rVIS۶mK= +SuV۳gOJիW|e/,ŋwMo߾ݎ;St&ܺ^;v. (6yٲevԩqyUW]v9sƾ`ՒmWe_}[_?6nhzɓjԨ)mmɒ%i&%Y%\b7 . isם:kz&6,Y*Vj۞k@Cx3@<{{@@@@Ț?of#FXܹM<#@D! @ӦMM?O?wFGR@@IDzk=lAV8~ꩧ\ E`{ZÆ 7]oٲ͜93ӧO[߾}W^16̙3^?~5jdgϞu~ɓ'?^zoJs=gwu_z%9rdSdb k޼yet:ֽr]w7|Vܣe ,--ZǏN:Vq8_o߾ڨ'Nzv`Ço@؆ƼsN;mܸqnw>KJͺd bz(8((FرcJKY6l <8XD@@T XJ(eP?]do|PE?8$ ;w)s24hkW ҥKM!ԾSvmSЇ X*+Wv7?-ۦOp IR9+ vhf,e , )$ 2mek7# mʔ)n_wy'M?8D}oO?M ϼ/^Qf&S{XYf⟝u.F+WWY`Tch?KJͶGy,he{%XQ.] JzE&kFl(늗%'Y٠2xl{=S`E} d,NJ`mM}jFaݻwOv21{p%>Gz݉s>}Lu={ 믽!f7ϡ;,gl^2     u[dN/ o66( ;lk@|n9sOZ5@@Hx/`!" ܡl$>ۿuV9&h(7M 2$YP(Q}qgx2ʨ,B֬Yc;īgZeQP%cƍh>÷ (]ĉYuɓ''۟ Y9͚5sCgۧLE VnO&XPv6i^sү;5q !^@@@@@@@i;/FnR9j Ϲ5眜"8٠CnWi(   /VK*忙eR-UCkbY^|Eq&o޼v=ie)^*mϟ?)h O>qM֬YӪTbBEYkukԨnF\GuZ+P%39{\ .tkzi2xuuTT\:]weRf̙3]ի[|N:.ٮ]R:     @oVοyMTYL;c=iAGldW"+3   `GqQX"Z9s?}˱X *JԖlٲYV\u/&Xou]gciܡ^mvgѭ[7wS8f̘sAn!O罯T!𽕞^BYR -׽ݻwW}Yf 7e+'\2ycǎG}+Wt?16md:~޼yPN]|AWgn:Mm5Dxn@@@@@$;?nME'Z7\f}E 3 X^-@&+F/~!.#  @<u65N6W4}w.=C3'O72DZo@浡,XVz޾X<:tȗy ՟߱8MЍӡ^m_lYDԏ 1xЫW/ /Q͹bŊv嗻1~m+[)Dg)T;ٮO*|dMu]wb8zϡ.G -׽GyĔIAo'OvI}.S`A[t#`\nnԧgϜ9c zlmذa <|O.c~hV z<@@@@@ _5 `XXbaL-=S#@{Gu}}wG7D@@ ֔.]:',)dׯdG 7=B̀uuΝ&_/QDBnoѢeϞtB,:@>zml(v(weQF(-Z2t%{ M4 yK/6orWvPEYl ꫯ\6PugFgrmذev gf9,zmmܸh4cƌo7o&LfQT/xqJYPf:uСC]2|ES`jTt+ 6Qnٲ ={Ǡg  @Ij X~}OA  ]΋/hO>/K~͛7= $5:3JU@7&N:eƍg}<   5dI#w`Ŋ`hm۶ }5kSRL7~i߿ر÷M`SP˼y\PVdkRf͚Y9ܲl&~ҤI.@F Q_<TP!.{衇PBn1W re?]v!-R=.FrKMɌz˦pnǎE唲(EYJe:ʬ~uݼ4K R&"Pu]pۣsםX8PifyMss溧 5*odT26f[*{Ɏ QЍToPy(zdxNt}6TU(  ]70=(  R@nkW4dɒ&@Xs9.[5k~j믿NM*n@@ox(X!`9s$٫Ge{oV0ѹs`nRSEDS/"^`MJ IJgځ|uǏ\VM5e(vNe+, 6?؊++ٺ2fl٨z%!:_}.[n k…ܹs5\?dˑ~5/fΜ|[VV h~lRV(] Bhu'Ρj{,Yj;-P}c{}v7ڵk6GuT`W,Rמ ءCl^UYU xeLZ5MEt *9IP   dx Xǎm׮](OYkz) 7`D XI_8@fK Qyw l/ E@@ jZ(Pv*A#f2e^Q}R|y_s7vep]vŋ x(@B7N(;Hڶm2nea\6#Y(FNׯoQBኂ>70NeVٳO P{ ѲJӦM-OʘX~G #3euɪk뮻̙cO< H)S?f4iR Hݹx.[^ɓUZt}f+>T eNz8jlϺi˗w[l ꆬʕ+ۊ+lǎEUx衇lӦM@  @{wuGΛ7/78 mf]vXB@wmvɨ7]tM0!QcΎ@b X;F ]6lh\r&۹st 'E@@t2֐&_L٤IӍ)5>vQ{mȐ!AFYN4T`iڴ  Ϸ7Z٭EUӼ>}tF|\L9ٸqc۷۷T?+hw5:tML7(Iuo9+8+K5 ʛ7[<|hQ.l۶*hF;}UWY"?,םskVRs4hf[zUwѢEnWm۶''|b?ylmHŋ۲ee@ kYfŴ}C ZsG}8@H.::vh~o|뭷hѢm, @ dK.H$Ν;ꦣq%+   ߿ߎ?)SoD.U`-9r@rZW^yۉ'T[pթS'(5\V~B yUb*7pCIGYJ@+Tԩ$G>|~aߍ7xc+yw݉رcI^Gbg^%׬x|zH麧r-VZ5nݺMo$2jK5+^~]&}eRf8ͬXjU1NM&GaQfX#G\|լYׯo]v)pӦMn:x#m![}FK@@*UL* x n#%K]_\NL  &MիW/{7} >( 1bF#B $PBӌU3G׿/t@@΅]|!c4hXO>ĔB=E7:e [vže x7P&Myo5K>pW]Fܹs8Neo;wnzYY7ȷj4鉊r nP0D)KnnkWʖ-kO>w}ަsu'=cq:,wE.SY>n(Cź(Gt}q׭ ^ѿmڴo3 /@  3X}}dOyƳyF@8|w֡C7)׼S}-&@  X_@V]`9zhk @@"@ƚ (l *0o޼7fZ/ۧۼ}>w8r䈭Ze(_U\R PX#TvjzrQ( nJmy7LH&HnQ6HJc݄q8Lں \;v鑚=cRG齡on TbŊ&oQ`fV\w}#H#fE9_O xP׽L۔KgΜ5je`]o\r)^^]m۶ƍ-W\;e^ˈ>@@@@ZFM˗φ fsO,A XE_X@F[hѢ׏>nfߌ<   &:7J}޸q=@ UbEHad\bH#An̓&)F      4)&}ݩ[M8.6@ c X_z@Lw}_Ǐ۸qo[+B@@wakb k.*q# F?zZj )Q}gnj2KEG@B# @3C_z-^ؔ^_\S@@@ hT    $UW]ef XYm'L`ݺuGZǎmڵ.WoAA;wے?hpi\3c +TP?Cۼyo[ú/u/̝;׭l9.dŊIo]tq? ?w>}Lhٳ~_{>keCJm_\?YwZ:4MR(<ݡi@@ C (㩲nذ/Mn0vX7o#  eXe^J@}1bo@@Ț5f͚#gT    (py繛}Yk֭)f l#Ք-[nkJY^5kֽNo_ LZEąSN7.fQҥMH'O]ݤEW_},Fu̙QTF s۞  Μ9l*TÇO>#b&@`M(i-_|{ώ9mS  @L"E@@@αeUٱc7H[n-\Д&(ƫX'^ʕsYacv\r٣>{MRScFrUoCV@؁s߳SN鮿z+U(QZha=8q¿owA d\v={W\6m}XP6,e!^פN:.ٮ]Bf@@ uQ,4kvYD{葺FVLq8՗*}uFH@@@_N2˰   @ ̙7xe=U/L7(#r 7 o|r;p~kt… s߿=?ݺus7Yf̘f͛gǏwu;wc'ݻ }YfftR6'x7nl?W|1裏cʕּys1bmڴHVlڴict-~]ۺuLYԖj֬i^1XF@R# J?-[6{mɒ%Vj4Ad#Uy @@F_F.]:!   @/^쫫n֍Nʂ_oVgn*UߕrŊ/wXme˖us̙3.,ʗ/˵ /m*Ux<#@s G1eʛ7M<: QK= q:tpnnj T 8пo6l0w^{6j֟~Ԟ|o>1,  ) ڷoo @_[9Rj Egq0 J{W/_4_GE@@@ 7[a%L7Pb#pY_C) ) 4ƍ )D b'~5FK @& sUƁ-[nl#TQN:v{Ŋ3MiQ& 6,2#xm"m;- n&WOKSAUV+"hlt~@@@8G{9s$9[9 L8 Ν;Tͷ_m:uʷ-aK@@@ rwPٲe},]@?(k]  D.PP!AժUY@ =4#7jjղa)g}ffͲ.]5O=TL\|yמA7Ƴg2|/F*M6})hl °@O? @ uf+(?n';z  i駟|MGoƘ4F# $nԃ (VixϞ=mĈgԬY3kܸoZeэغukkx5RD ymƌcӦM {3|q;r˗wizCJ, @ szq.x)P0J޽{)ʤN)Q@Xv}ݶzj߸6lh]|žm, @b dK3zhrm۶[;wӧg.@@H֤C@@@B=zΞ=k=XLGVBמ*(cnWesM;&~ƣt6/BSx5f͚؁O sN7\0oW7#K]3U7ș3g,NK  Μ92ԭ[?A,XL}b-@ƚXY@_ǮNծ]4I   1C٦MwZF@ /^N!Λ72mf]vD= @ FҥKo7|seOQcZ:unQP^=׷/MVj!=Əo&M M뮳"Eؾ}w1LA#ϹFmٲ%}^ݐ#Qre[bر# ,?ؽk-1\y{) @5"#@ \{/E4㓾ްa]~/:  iЬ^QJJ/^l˖-] @ 믿ڬYh 5# T^=#w!1P F&M\-V5 ~/M01@ 8JYjԨd\?Un Qm&Nh|&Y/Mq dae+6lώ;F-[6n[3|Y!@*@s&4r+CyF@@L.eɝ;iWJ@@@, *Vӧ2ݻ7CSK޽]0́ꫯ6_fߜd /mΜ9n 7ܐNFYcF'Ot]ӳGQ䈡ʃ>h C֭KRu.sP @H[njժ>wepamQ7VTNoW;v2f:u:ud}65In2dH}l@@͛7^zj`{ ID j2DMǁ O.]ٌ:R=Vhx@@@x5X{l`" YPJ*{#4h=!x,YZliծ]V\ik۶mL\n][b)Â(F\uU.[|7jz-뮳9rVf1wܰcT0Ͳeˬ{6{lMr;^{.G 5-ZҥK]Fe|U˸qN:mZPڵkO>Zڴic~g@H;wyfB 6vXk֬o  @J֤$~H7͐4tP;s >ܥ^O/ #  UX`D@@@  ̛7/U ^VVe Xb6eז2(A…RJvEؔn\7x􈦼˦G$e…)VMiy)bko˖-~z7Ɋnϕ+WG jժիm޽Yu( &[Jm۶euE7+`{J@'o?l+D ܝD"@`M$ZEs*PbE馛lԩk.7INi8  NT-&v    (n&kJdn95A -ZԚ7o~;-[6\" qt?h>3_ʔ)colҷ@ k"Ѣ.sGy׿spB@@b&@`M(i@@@2@v](Yjd. @x;kiv;vX^@@pdp/ B@@@8t5$   XYf^Lnmc5P ffѣ=vi6lq='#  @EZo֬}!u]#.Rz0R+i&K?~f-־}{{ꩧ\OJ 2d^HAREA5z_;6p } ɌˢEEnSNUXG@@@@*e_;&5jjʷ@ Z@ .;7|Vp7ĥ4  Q ޽tsJٲen@ 7o^w"e_\6]ڔ)SBvBm*Vrv.,0wq͝;;<[5hCV,X`K.5eSP%KZڵMA:&wگeHEB?* .RWdL. 6}~F{]:uֱcǠy矶m6S7n QT`yGlnszLjqCAR}… cB(wޱ?D 6#    ^@ :Ԟx _nB <,5%$5 3`2>ffլٳs˼(=G@H$~7\2(X@ C (ÊZ?̘1_(32+ QH'~;Y/I֭[eC9uT_|ả 4:wUTJ*YML믿&L(Piɒ%ֳgO);Vmh֬YQ?^R?У+z#FXݽ]y٤I|, @2֥K;SL @@@@@ 7ntY7 hѣG5\m@N @ .rkӦkQ7qD qi @@8 Xg`G 2K.2qĘm֭@!C$ J(a ѳW@e=oI׬YcOR!L>e˖ͭ?LE/* NA/.L,H>;J_>S,5jI&2\&O@@@@@s#ӞyULg͖-MEP͹y8 5@ S ߗ_~ٷ  dlk2CHI@5rՔU$_tgt{'M׭[׊/+Mmϟ?)8#3gθ B22sL;q[?s޽{CV\iSL4H{KQ*CA ʕ˔\EhC2ST)آE {B^~wC+SW\aEMٳSqwuU^guqYvڕT@@@@@%#իgm\*Ul6tPF@\ Xs.9Yꫯ vts~L   @رcʕ-G gΜޏ7l ImьeZrսc]wyוgϞ=#Gk֬ ʓ':tȾ먆$… c⋨ڈ %hghH*Э[7̢Vg̘tg kwvל}ڬYL39slW `矓r1裏C?7oFa6mrϛ7]ϧMXm?tuƏo֭3eR[F5kw@@@@@ ?~cs:_~nݛ-t @X0/5E g4hP#A@@ l߾7 *Y@!pi[l2 *Y3zxmxǟ}ܰaC,M4qۼ} -{>Cm/^-YPV"9(( 6ezիk^Gy.\fiZh]P@-+~>$Z@bG=z}ᇉ>   @ x/R7=̕@ {|>l۶ms7vXkӦMSf͚<g^ wlzeHkmѢE65zr5XbBrYlbٳ1b5ŋ,k|￷7j |w=|LRsYlBΝ;:u 2L˖-si&9)xH7x){s:2@[n.Fr QPum۶Xtis=}5>`c[XOTD+KZ)O. q3 G@ 9FA@Hl=iq6ԯ_ٔ/_ޫ8֜ @R4aBcKxiR&P@@@ hb'\ǂ'է#nݺ6sL+\pe 1+i*+ FIJQ,X ^`G|C_q%{YMhmoeveyJ L Q%hJ`!\I鳎yyqz_u{c{jΜ9J h[Y-W}u].[CA 2!ժU3kwEMWVqym}PZ2O3eܹ^SOye駟v j2dm޼x -ڞ8A؉@2s+n+`vS{.P]k^C,YUA[nu͕xNXipֲeˌL@HW'\%$_C@<) -*4[GVFW^yŊ/A@  Xt@tV2|dpF˘  QXSt8@ЇuqcnӦ@Rvmfe2(󁲏xA=W\a kt.\h ;ʠ-ȑ#tR7+VXc m2㏉HhժU=zp^25ǵqEYE=gΜI&X!7|>xVN:Π2኷k]p@`6_=۷=]!K,J2)"  э  0eL yE?nv{@ M dJS @SӧO?pM@@@ 5dIe|.@ h &3)pEFRdʔɼI|MOe*QT^R?tٶm}1n/8'N$Kݻ[zL/.گxY-b5 (YAj9rdvQT)?b>m'L/ܵk_ٲee˖-g    z'M뽠-6m"&9DT5 i~/ۣ>jTAA@@#@`My. IhҤ5m͛g r :wq~'+VXaX/ƻnvx2jղQF콞/V+ -eHU4eIZr͜9n善vٵT;.@c)0`:uM>=άQ^&۷ka"v/_֬YcvJQ4E޽{ۖ-[@@$)R&O\hQAI $vߟc9@H ,\кvc *ĉA4FRTd ŋ{^u_쥗^r|R\@@ Xކ='eQ7ߜ"ӧ[4ɓs?ΝsY2gkÆ /t/^V?˒%5k,VZΝ뺯9Ti۶ /LYh.Pb)޺ukSN|Pn]&+ :4F`Ν;M(ˆSRJ$ɹZ+½+mرa.|wW_XkA5޳Yf^ 6I<!a/_nV0e ?P\ x58Iཏq  @$9ѿ[(c=fO|8ӧcZP!{] /*3,]ԪWn?:믿=Vl˗m/kVP+^7oܫuߢE W'9sگ%(2 6MW>>|xc AF4ٳ^WА2/[=馛b$\@*[n {Эj+WvI?Z5YneʔN:=Obwtek@ǎmͱNɎj@P 2 f@:    6m)?F>ޫ#&4A4'@ƚ4!H@ҥ݇JǬ;Nyh  msVRK@T_5 w6Uƌc}dȑ@Ǜ+#mj,w.3BIZligZxirG[kº)RĮKŊ^{umoe4iJby([WC 1ƍ>XLʕs׭[gǎs$oJ@ 5kִ&M`po8eQƬ}hޠAQJܢ([)ܹ[?qDkիjժVV-Zuq۲e_nIuh@4 (MEYߎ=MCc, DLB 5ju-~v  +VĹJ$9@K@wn 4˛7oxς*l @z &=>kb hbϻkZuU>Cn5X @@@T8t)e]WuvWچ ܊cJ_|EFA6ʚ|)'@I5Ʒ=k,פiӦ~05}gnyI_|iҐnDt=ɷ#RX1 X`\}'nrtJɒ%'ϫ(5bWi֬\ҽw+(O*XJ|`0,YbyEZj+=QA}:p\vܢiŊ ԱWk3G@ >i|hox  .?I`M Ҝ@F[m6p}Q@K}qmϞ=q펱O|uMJOjIjuE%ʬ,6Xd޽E vŋ?@ HK. =PreILÿ[W_~.]TR~|qM&0ahsN۴ieϞ`WlY˚5k\@@@@(pBO٣d~]-r捏{ȘdQ#O<[%Q0Fm]vը|  @z &==[#;wn_~=9 *]׎pq,X7nxZ2er4     @Fmڴ Y_> zwk~@@@@@@ haI&Yȑ#qԭ[eRJ @ g )kkT}Y,s   y Η/UT)>rf[~ϟʔ)cM69szMܾ'NE]d+Wԇgǎs_}ա$.xտ.|2upJϥJYx׮]o߾u\|VtP\&ǭX6nh+Vڵk:﷝;wNu2Tٽ{V8\/^=R@ SN5K. 9TX %JX.s={w-zMg-ثW/73ϸπ4h`3\g߾};ܱ#-wy}n8 0kplb oٲeSSZǎc@ү3glԨQ6rH;}t` -Z0ݬ( @F &#> ФIW-]ԭ4}t;CD@H[^@@@\rB5DaԪU+,2ĕ@YB}neM(\L磌rVZ岼(+7x 9r}VF oW-[Uꘔ.zoC=*ZHD^G_|y % *X\ܱphF@??v_dS|@i /%K'(;gt,Y믷5k:̙3M>فI>+8?N{u J:NA9cǎutbr .zզjժMx@Ϙ^3AA@#0w\{衇 Z_7ڴicȈdg1#AXJwqeΜ9a"  p5K>    ]iRW/6mu4t֭[6B++[Kb&o)cŸi^{͞= 4ٺukNY_\,X6F#*spB:gTl? df}jY֭[;kƔ=#\Qv)S?lzvpQ6( nc2uܙyg N@< 5kVW}#Q SF4cF!ШQ#kذV@@H=` kRϝ+!   (ʰa;v찕+W&Ta1b ъ  сڵΑ3gN~*^L`oۧ/owof˖{1 &_.\rk,&Mrg3۷n%ڑsB&JEJ,)K/M{駭PBn/dd}П}YSƲͽ$n+fE5(C~BCIP1@:Y$̔)?1sL[d^j ƍ,Yz @|w6{D߿e$ݹsfɻ 2سgOs:u>#w믭q+ؖ-[--Z'|XUw@Ϟ=]SMt_ݪVgf'@(a*UgU2gl={Ǣ!!! B%D!CQz7   @o.rEYB"A   X|yhŋޔ_~P eʔwt武Օ,Yҭ?׮]8}Ŋm(ˎ?Tr<8*\p`ۿ >VbC~ >WV!o1ĞD2 oȑ#&)˂ѦMP%(x' Xލ_gu RҤɓ'S7E = (Pu^بQxmjߢE S1>>}z|0ֱ 4(FYZqTFwnWPV  ͘1#0\e ѣ[ l  P,PV-*ʧ~޴כz  ʀ^!c'{ƚ^#  D<͛c( y];B<$;ĞU^PٳgC7^z._~ ڭXt) ]9믏,I.6O<.#E!ԭ[fΜiEz51^(5nr}Q{7\/Sr<Q-ЧO_Yfjժ (EP`ֿ۾˽^zqۿ^ʔ.]m]* @ oHm\wu.[*U*@(wTx@*4 QQ֚ϭ^C@@H;vtED7V  Uq@IDAT@8rn@GMA"%p5СCg}fsεΝ;5O=T^K/u ,Ћ(Dv>Cp/F* 69s&tnWF Ơ/]v˄  |ʴSbESfŋeK,%Jy|bv3iy(enI>m=7W\q Pʕ+xZXbn0_>c \ W}^P):uV~ƍ[|e߾}fe? M࣏>rYk;]w) "iF4T@oO>Ľꫯ?r~@@2?lٲ Ԙz Dkt  ʔҪU0{a駟FY(S&L˔un@` ѾH={&*C/ SjӦ ]i퓳Q`&/R벍/п{7\VN::2኷k2$( Po߾{hɒ%mC@қ W^'ueݻia.(P @2%@үVޠj+'NH  a۷zGƚ   iݻ[z쯿~h_EEovbh}֧={ءClڵ4Il_j?~0ak`-(ٻwoC!_e$uه(]o޽>92 *U+k /w-mK 9w˖-[L3@Ҿc\LժUc4o֭[2TGzi_5i9 W]uuMfޭT   _/cM̙[ h5-[D"@((RM<ٍnѢEd(e`XiP]vv%fQF\fΜirK W/s6e4iU^=5k) %gΜn"xJLSiҤ5m͛g 2/h(cM"N>&]NpA5jԈ?\Ez#@ 0NjӧO3[^a^z|f۵kWR@ҥsNtsA(To&{@ &9/aÆ;֥/TPE@@ x5%K4 D^`jժ_+   _?͝;7 Gɐң@*Uc3suZ LCM 2=-׿q.ۀt3|˕+NOj o7ߝ|LgϞml4SLs)cҲeK>'亴A \q5HGԩS\1o˖-sU^[nn{=5km۶ͼ 6I=! W^.}ٳ{#=Ir@ )Sƺty 1bDZ2C@@ ] /vgMI . u.U@@@^@ TPVÇy 0M;vիW41_tNMׯ:ƶD+ JQQHz, 6ڵk+_N:V~Ians^2W0Wz)*^;o_B#\6 Ylݺ5nV\ߵk e[kԩS$vG\&gZǎmͱNEZ) WUQekJ?&SHY2֤'gCt"OomzCW^GyĴ6@@/}I PD|Û$Uh=q@AB C5ju-~v  +VX#qjΉ$X@CժUچ b7tSc{a+sv)b .6m؞={Lwm6mr#<ꗲhJ޼y]NF聂F$Y<ƌk$ZPB={ѴiSPƍSZmڵ}zbs.K@͚5I&.#XKiqr-W_YJ\3'xbڬcj%KNK8q)rVjUUUXю?n[lכoPHA@ osϙޏԜF^zzu#DF eL9+ zw6rH;sI&u8!  Q`ǎa-[6Fdkًqv@D3Ԑra^ %C]$Ɂnv1k,kݺutFnee:PepQM-Zz5QI֬Y5Or+mÆ .ӂX܎+(hѢnrmΜ9 礃 J%"$w@  <_flʕn5}e`@e m(gݺuֿ;`ɒ%WgZnͫ@t!oZl+}ذa֥K˜9W= @ .F-7[^{5ɓz  ֐&y   @J ,Z(Ad/;w %ps}eȟ?}%J{*-%g5J4ժuKNyGM7oܸev(W\S>{S0WRܹsz(!K.w| }\}vaw9}LJR}]* B0a[Ν.Y]3--7@S`͚5w~)3 W(@ I=kiL@x>cնO{'죏>Jc;  ?۷:M`M @@@PP&B6&ޣIaTNN`ָqTȔ)?R] "LY~mSpWZli?UP@ IEl.iOW^6~x۷o[kժUVfʹQz  @:gabL:z*   Q$nI);wVZ%PA@@B 9s^|E>|8q"ЦbŊ.E:6@R_7 .B{'t0`͟??   e̟?=F@@@t/yf1cFqu%8B@@B Ν;YG5k@= GU@ 6vXm.I&it@@#pY۽{p2eO)   D@֭xISڵt!  ~UVY>}lҥ̙3[.]lذaVP@= W@ dɒڡCEY.4;  @PPkTI_E@@@ UfQ@@@m_|ӦM矷ʕ+@H֤^ y;l̘1.o)Sw}{@@H;vtlٲm6@ lذ?#ٳgK/ ,>aW8_|VR۷ׯ_owx0)gΜ^Ӿ'NE]L6mcǎ㯾9ne]fy {j:)RJ*eYf ]l߾}1B=⋭tҡv={؊+lƍVbEӊzCΝ;Cu':x4QR״_{LJkO=(?ةS}%ɓ'MA*%J^~ewL={cVP=c^}r~|?^zc|s0?\PojժDRb,˚PpaW]uU.;ªU\>xE)ȑ#_[5]1ljTޔF=*ZiNYV=j/;.J׻ *X\ܱphF@??v_dS|@݅^h%K +NpQvv]VfM7|9sh>فI>+8?N{u !urƎkF.]܂ÇjZjp#3.LP@@@@@  .t < ({C=4Si  @ &?GRQ@1>3?g?ČTB@@ ] kʖ-Ng(k׶sUԦMf]vu :tuօ ֒ߛ2&kfϞm$)d֭*닂+N>m ,X̙3t2dH*x[رcnߒ%KLp[oeu Tk!eg̘a'Nt߿yu\\E3 QQP&=:ymtZ}nEk1eW]iʔ)?#e .fx6mx@FPvΝ;͌8~ƌ    @Jl޼ٽE `=sEFHn *U xq71#{@@H?"kΏ;WE4,sv= 51# w!  pҥK!: g{Qƚ*vrEt/l&P׻]ҥK]6ʀ ,*^[ h9lذی>W\.k}l޼yߡf͚m68#8/~V={;y'Lم@?dDٳ[>}Е[[77p+V̊-jzmQ(̅*r :v옫NsvB6u*;gϞԩSmlk:믿nUV5/{YP    @2@͔)SB 6p@;q;E]dÇw{@+x}9DPo߾v%+̘1ô2.@@ը_wc"@X|yO"h"ŋޔ_~0K,VLx+p\%K2fYvmr+V lǷ,; P9?p@pm&vZkC~ >WV&M$G W^nZ]31Gq*|`Ǐw7͛V\oۻl7;v0*@R8tАd_~tݗ^zTjݻMS9x*@@@@H_|a5j԰;L̙[nF= /L9@ dIC}+ @ș3 6>ibƊ+L  iQ`۶mn&@B@z[{Ĉ[l;v ޵kVPGRVkS&7l2xm?lC qWDȜæDeY>ڴi$eZ5Oc?ۯz}I'OvR6fHJN8$P@^(^۶mk-Z0eӧ yc۠A@]p`nT .eϼzцfP 7  kfQ@@ kO=;l^V< !yp I_ET$"M>t0`r-nK*vK!  n5dI7Ò 7o^+_w>b@{BWyA)gϞ z@_~.\hz;bҥdsa_}G}x /&@T (~k֬x_uįs(km_~f^zM=~߿?P .]m&mt|A N2(F@@@ Qzogu qocK*eÇ;3E`' Q%O[jX H͛[ӦM݄#}( /?2',  D21he]iOkC)g}fsεΝ;5Z-%˥^N1;4<2xA7fM+TPrʕSr<Q-PX1܊ 1cF)p-\ymC+RH@_p֭[]7n}2זDє 2ʕ+쨉? G IAHyꫯC. SϞ=_l D5Q20H)ުV&C{׼S@@h2hyL0Nƀ@zPVZѣG{WLO?5jׯ؟ /(Er4a:)7xc X},,1z}ф:u긪6mڸ8k6M $u(M.^VۥfeR_o'|oʩS\]&\ymCSf|x-Ydmh@F2u]!@J.m۷w#GJr>y]Ke*[llٲ%4C@@@Ȩ_|,ߡC@P>;m˖-6f"goƍZ5g PC{gG~ۭ[zN;@@^Vz ~ (5j)[ʕ+m̙v-;wnSցI&YR.RլYM)9st+UdJ&MiӦ6o<4hyACW_mqic_}S^EYjԨkH9G0`M:զOg2/v 0;ʗ/ok֬]v%("@޽D $@@ zbEY|A艿G 4vߟ9 @ h.6gΜ"z~Vj<@Xd"@ ,hO?(K&l  @ l۶-0(2(@ ] ԭ[4h`4&R*@8Pjڴiֿ 7p[\mzVf8p o_|IΗ/{49~6l0˔ ~ҲeKuH9Q1DD+pA ;vlkԩS\1-[檼Inݺ[h֬Y7 N$e4˗۪U2ڰ/ )"⧟~sy9 RJrO @رc[Jr(F]( >Y@ NMXk_U<  d 2d'FVjS>B Vg>vȑX;vիg/:7篎(늲(@$= Zڵ]/NaݺSI*^; _"^f Alݺ5UnV\ߵkW֟8q­ל2eXNž';:t2={:vh7ou Mvk?kdT . q#   8p=Cn{x.)S_MPM@ @2=$P K, /X-=[ /Lh  @ kX3#~͛[j܇IC n)֠{a+s6M"E… M6gS%KݻwۦML#<ꗲhJ޼y]NF聂F)g=x`3fL(DB={kC)FY'ƍgSNիڵkm>DTz}!@fq^YfrJF>@{e~w]0_26ijn:߿d+VZmUq@gɓ'O@j#Gj(")+WHs#Q'p{WgCƧ(K~L@B XJ:@ Eϛ7ϭUi:wl%Jv!  ^ƚK/4]OtgfdE%hrL1u޾k5?؝kǎ.@L2 zҤI[KrۨQYiŽ,-[rʣ>jxƍ.C\B*+eܹI=jK;T\پ[;|?w>pTR.|qM&0aKsN,{.Yٲe3.[dCر_ti{@ &Nv"ݮ`6m=CVvЍE@@ l5_ex }-)EYi[jC9@@@@@RI`޼y6p@[zu+lFiW]uUz  5 !/_>޽{w믿W^b S;@@&m۶X`Γ͛mƌIu]8@@@@@"/|rPpW1ׯ $TJxW_u٪Uu%@@~2DsHO[ŋ'dM!     Q df͊qU3|؞x @@2FKHCg   wCي+l˖-vQK\rV~} c?իWǪU/_>Ty$5grʕi&7svfz%}K"Ekc;p0*Uk|Zj޳ .>Uə3]ven;ܹ͛sZM޼yt#>z}P_D ˓'Of! Q={ذa쭷޲gUdITw^GEyA'},E_\m۶.{бc\}e!kR*TpUo>FAW??6m/#rLLY q̝;ZnӧxI@G[84X@ү2D5oǙ0p $Q r%BDV{j_7n+Vomw_4!  4 +Z锂   X`A W^1\#M\2{mpnMO<>[u[lqYԢEÒXN<ᕿCBz3gN%YY!t . ܘ={]s5n)Xϋjm?iuoQ )+)ge©Swj۳g)sƮ*e{`.}/$|'Лoٴ1cƄ=UW]?V`MT' &LQ;w̙3G @:ߦcǎ_|1F&ܹs, ݚFW@ҙ@t_Iƥ7c   [n 1Jl    @ |\J*F;4h`j];7syIW6믿eQʠALA/.\p)ʰaܥeʕ1.{>ct$YTɉA5:P]-Y K{/Td)o1=TٴiSs+p^z.Ӂv_;nLZa#*3>@H=3.[A5NاOOPM{n1 ^?>sҜ@F;p:x=it@@ J`MJr>@@@B |wnG2eB7`oEq >%Gַo_w*4|)qyvX/ߏlp>?UAT^{cI5k;jժVB󂵔&x> 4=yv@dϞMXP}$3={֔FYȊ+fEf͚ п{HCYvMs*ZeW^y(P6lhycsqYTbfPzuk޽fl#QeTҥK`oolٲ PitHt @ J'a @zSXE+}ic@@ 3h@@@"/}@MnN͢~awɑ#Gإoj ,Hw"Mʙ3gMw>ct$>JqiY;{O>ĝ pDey]eLe]f^pR@zڵ fQٳ5}lܹGڼyieSSr)裏MA7W^yŴx_hˤgVYzL:֯_2T\)n1 @2**_~%Kn_vYH @ &= "+Px@?EG@@+hK/v#   AjԨFI&3/^8MUa o޼f7:TiB]RavJIn|ʚ/)?g+V28:?{n#}̈́_Z5 v q}Ozm ,\U{5W_}e?2m(S NgT:vrʹ7V3VoWR$@oM6d{C  @Ф7xe?~M8ѭ-ZX*U=15VF;ڝ'Owa"+ࠒZ5+V]SǑRE&-ʱAnUp}_he˖n2|*u]F*rhQp姟~rxTE"]@4{GD&UbCQyP@Q[.ҋ4"HG>ϼw7l,eܙݐ{D?vg!wܑ4iHժU. zG&hSN8,hBVX! .45SQg2tP_rBxo$ Ѣ7A5lPf̘!39 #[Hs/lٲ&A:uD3М8qBef6_MZz.dϞlJM M8V 8`@EoF 44|HSvm3~[4h ӧ12@@T@gYD(P Z4I  @ƌ#  mi`ҥK?yhЂf@m0] Jy ȑ#Mvl f~\3FXM~ÇM*WlnY틫L^{h`fЌ_}yJJ4i"C Y;z~Q jٿ* f݉V ʕ.͔FmhYV-5kɤS` /`fΜim$2z?Ș1th~b+T?n" ˝;y^t5=z|CP]QFݻwlTh7>m( k?6zՍ765q: $5I9@ Z{Os`  -_X`A2 XpV@@@ЙLWs5:˿Ȧڵkg^ƍmFG?3g6=1GYxqLO%yqJl2C4C}:t~%ղh.͓UVfqL6M.]j3Kvy4kDRJE71o駟L19~@IDATܿ|ryhFgE3<3`o߾Ϊ x7MF[|xL2 6imCegt)S͈gΜ)Gŋk׮fP]|ٮz2d0 4ɓ'ȿ5j$%K&Mg8    &hE@gҔW^} _bŸJ@@|B`߾}~FBnݺ;?'F@u Ŋp "q0F@c{) Л+Ǐ^zo\Nm&JJT:a9s&gkɇ~hv=zbwyk>gٶy։x.<ҼysCo.&M2kΞ=+ݺu],l> PBV^mj4R d͚53,k׮57kZ6P 4-[4j J =td I ċ2^Y˒%[lb}{nGlԩSĆ~@E=e4h-#t&IA@+D@g䣏>_ݤB5|ppώ#  `/`{,[35z@}P@E4i҈3"<<\/Vb+W64ib+U$zcfW+LdɤGQD i14nX8 R%JDi @>}d„ 5[Њi2kUY]v4ӻwoO@ [R3N˕+ge@Z W!>.+>]g)  5K`2,Ɓ   K@~wyрNߟS\zU9bϕ+Wۉρ={'xBE2xU fر30f͚ %g`  @@ XkL2ؽqXG@f,YȔ)SLWZd<_M6.]נ $@…4A/5#^gL>]f͚c9s<؀ݚϪk+fr Ѐ+ScS-KV@!k|bUM˛TA'~We޼y9z  ܼyS?nVO 6  _O%K访 /^_Ƹ@ :+.(Bhx/5fԩiÇ4h +Ww =J*Rzu}`9ezã4џ>74FKR#.3-Q.<M!  ޤEg x^z~@@@ .#F0zqDD!W^_vcsÆ ۯpϟq)Jݻrȑр9O,_\>#sc"E 4hPǻci>sj/)~5͗/t]40(r;wl6-ZT֟z)[ brVݻz޺uvr5YP 6rt٪p7-saָqc)Vҭ[7f?mQ?76mXUV&kݺݻ7J:IXQ*@ ^/R+/ԯ_Lxb!&^TFb2xšk ?ҥe˖fPzgyF~a$#A@(6^2(<`:l/^h_89 "9sLMV`nظq+DoKXΞ=[hfI&IB"r)SFl"`$W8}NYkƎkYd1(Z:tHt}{/֬Y#JE3(4kO@xh@W_}e2;wvQ?)]m;  5vExi5U~ݮ];)QW!  L5T؆   @hvE믿#Gɓ'MD̙%W\mXYO[`cVZmz3'JL}ވyqoZրwk˗ѣaH&M>רQ#荙U"r>St"Kq1bD\uLTBK4.ײ}v9y})YJ9b}b*]|raٳgHB44o޼Cp"pEeԨQV ү_?om' *@`^Yƅ^)w.֭C  / XkW@@@F@.ϝ;y͠p .]:3yᓊ.!'<p_胂 0dр+W -[f1+Rm;  5~xomRݻW6l`f^ѣ!  Fg|衇b>@@@@ Ag}$tIׯC=zL&MtTR t0! 3gdȐ!2vX~mܚm۶&Il,, 5t*x@M0Bwߕ JXXwt^   `e/X`,ٍ   $L@'7o^~'tJx5; @@=jj&N(nݲUK"tQ9sڶ @ XhW"WT^]:w,&L04{) @@bطoJl,    hРA'T+dm?>A(  D`%""¶^zI~  5~p\x>}Z,X sΕf͚`5  @@ _F   XL2@*]t 2V@@7 lݺU>NZt޽{K,YlY@@  gG O^KyLz%5k֔ 2xO@@&.JA nlܸQ4`ŋK|ZjE.wޕ?3fwg…rQ[Khhm~ȑ#r I"͛׶kf9rHdɬMnxSJ%rtE{^OMӤI#ŊsZoϞ=r%N"E։5pႹXҥ%eʔQڵ^̙3G Р ɚ5dϞ]Y+W\]vY^/v Ǐ7ݻwKBDg ϙ3].j?ϟ?oVҿ:Z_9\s}^:uatsvfi&DTTXQ8svVO/^ܴ~#{K7gEl$mڴΪ @@@@֮]kj~g^f̘Q^}U4V@0D@<(ФIy47[2qDS#  kb7 h`?WFA5-[I&9@*U8lng_~E6l jղUI^~eۺB6md&>m۶n_hN 4-36^}ү_?ɔ)Col^֭sgdQXl~&\R6mj 8+c]oF:tNB6?c:=4$$DJ*% z9ټy<۬ }dtT/̙3Cm?nd4x`9r7kMmEM2EڵkgC֣[L>(5`^UVE٧קjժcrv5BAnjE~ivڦӧO֭[{ۜ@@@@ Y~ft7|Sw$@2  (@`k @ |W7\|071Ew3Kw"  D^3Zh& _@:A-˗7j4`m6ٹsr1S66 2Du&hߢ,ǼyLBVdkQOfU8|H3j(oECbk9ܵ_oR<־g};,XF@={vݦb7o^gҥRBs>kנ @lEc_4F3h0YtEf-zlGH}?@@@@8SN5YY)RD}]e2?@4d6`ƋxO\@owv}mYB%W_}47xC֮]+6gKi@^9zc[l)СC&P? ?}/Ҝ/K.,W>ipو   N,Ү];ɗ/\͛f:RNdf/ ^+=c @ ʄ r&k̀LCF@F+c7AR@ zcͬ;ޯ=/^Swq8>PFowV׷ۢE Yb,\>探tvGޤիKaÆ2c W `+@1rES6-[VFem4͉'$[lDA5Zz.dϞl JEo( ߬@j=~" 3F߫UXw̿>'#gtҞ?&v:YK/$oy@? O/,BЙ^{53c6 ZJ4'@@O X5z#cT<ΏO `ׯ.]2ƍ<4hAC4! >`!2FL4`ȑ&ƺujժk4NHڵkG&M2 t$ne!W]#MPg\"""p>3g4,5zҥKMn̛7'r̺~&>}z|yٿ "E YI&D@vw &KY/NowWqIF4J3nh,f͊6GuPXA7ޡjF4[h8zE`%@׆}j(  $^`̘1  п͛gjQ)S&}X't(  >kgK @t ȁdڵ aჂ  'f/..\ؓ]/:9w\3ú]v&eܸqюUon߾}cڑ9sfأsŋT=NZĩX*Ewfр$IܕH] ([UΝ;4[Y4D38+!rR㏢ϛ%$1߻w/nۺ~9žm <<3޷o_nYL4+^'Z'6ks 6m Fiҥ_#딆> jE_:OLȑ#fw2elA&~mCkegh)S}/ 3gXUO\k׮f~V]|ٮz2d0@ ؿNف#  ,p-}Ȅ dZ4LtguVOS40OK޽G( OX  @4F@\! >\&N(ׯ_whVZԬYa;+  tɒT @ zcξeբR@@={l.\mp@tlF]{;HdL#KW^#G47 9}߬}V]}1-'5I/C #~W2'Oe[n_VuРA&so}IުU+):X@3Yi(͘CTrav9s&j>n#fʛ7oɓǣu"   ؼynZg&XjBBBD?ܺu,]_ ΀ @N@:CR`Ç=)Ύ  d K= `iЋ;KiӦr}H4c"E 4h4s}$JDDi쀺l_\ueRJf}ԩY{0!| 6l0z&fY7ٿ9Eo}N|{N3thpNlhѢ'Omeg΂l XsVn5nX+fvuM.]׾^":k/Zj%ժU3?[zisSie@@@@ )˼KaNƍ31cƤ@@x ij>@< :uj8qԬY|AݧOs3xbpJ@@ @/ۍґ3;( F QwAC?~sޤsNti[oLր/,ߒzs\TO?Zu٢EL4IA3k}'& f:Ȕ))SF%K&[l+Wa 0@ryHkQߠٍ4i+VZ&F]9RO.e˖m۶ə3g̨_y[}W1_9 m^znfر3E 9t萹Z)eʔ&N3ΊڟYQf˛5`2$ U ^yO]zhpKM~zɟ) ZBF&ZtW*]zW+ƅ NCA Xݿ[yCz|P@@\w!>-O dYUg\lO# ޽{mmb`&`׮]dϞ]tֺ;ZjժO5kV)Xyh_|\cN=$,,68pa|:Y=4m4JE64hdpfk+jLC s/bz'=v~ʴiӚyڵkٳa/[h! X_ heL5:ڵk˦MLFP5w\pڴi&ζE -QOuoF֬YcV󚝬~ҬY3k?FA@@~>N*:~5:@|G wKO@Й+&:# @@-G}dNY jJkpftV*Vhnv sVm^&9rDNknr~[@@pk\H+ hVܹsv]/zӼ>SF_|KNJ(a_<#h@胂@   $ dܸq_ zϜ-[63)N5R@@wkG@ @jժ%]vNjfСXBf   k'O37K˂v@ ng}$tIׯC}&M$RiӦ%XB@@@@p.o>9r|r Jʕ7xC7o.!!܆  >*otpt[`ذal29ro2j(J4U=  ߿/偖KppNE G7o޼'Lq|PBї:}G@@@@o G!/غt5jdjUf 5q@4idRF \߾}N:RP`  I!pa}9L q΁4h@4J*%8_>H3&h&1      @{3g 5۷owhH,믾ɓa+  ?ϵd$ `իW7Yjt7oJe E@B@NXK @2eD t%n     3gѣeرrY6s)z4  rT O>Ė?O?4@F0@@R\      ?]v3}CPfT3g|Xf̘!+Vc@KތT_~RL3]v#eX  kr!SD8'      qnݺIlޓ'N؎-^L0A?. )@`M`^wF~&HL")R0#6l]Fp@@3ɓ'4iDV\iYڴi_ˏ?(5j԰c@$o)ժU3#9tF@@<)@`'97      @t۶m3ge&;vV`_ɓ'eĈ&ƶ@@ 5@XE|Y@SN\ti4iܺu{ׯ/K,={+b   '؄ tСҽ{w3N:Ɏ;$s><*  )k<%>xv~aDA@n߾c%߫1 vrC4   o 2~xԩSI>=R/2idXA@ XW)!>$Э[7Yhy9sFt"U@@ok$]t-D ((lԩSI 6! @|ƌ#    xF`ڵ2zhΝ;(VJӮ];I*>V@@$Oe"ĉ%K, ,qN)  W;wNӗ"ExEDk@@@@@@^j2/^\U&3gδKƍeŊsN I@2U @4fҤIR~}so)5jԐ'5A@D]vنM`kv*u1@Y }L'Vsn@@@T <!C@ddԩRdI|L2Eׯ/͚5L8+  W XjER5j$!!|Hל" ,#   u7nܐ3gѣe˖- ZjI=A찟@@S܉)y΋x@ gΜW_I۶mٻu&+W6Bx;@@kX=Jyv @IDAT      &w^;vL}   @`7\$@6mdѢE2k,x⋲l2ь6@@,]vYB`# 3gxD" -O    I[n/ƍիWGJgϞҢE y衇g  -A- 4:+D%感|{Isr΂  jՒ˗={Vi'.D@@@@@.?^Lb&?дlԔ+W~  X㵗!Y"jԨ!ߗYvTXѽ'u@@ SNILܹs>o:      z7nܹsMvG9A"Ek׮/J g  xաo /~9Kܹe۶m6mZ7@@]˒>}z'|RVZ]      nؾ}N3m4fi֬KRjU],# >%S ._uÇ{2c @@|O`ݶNb@@@@@@~̚5dٴiS(Qdi۶m(؀ 5>t* j`HSdIt̜9Sj׮-:tph@@EW@@@@@@ lٲļW^uh-Z4+Vt    @"raҵjZV-TRE (Ȗ9@@Wk-à      hҌ7N4&r)] iݺM6n@@zo0@D K&F)SlذA'O69@@7{9_LO>-Yf́k@@@@@@6m24f͒ׯ;I&jԔ-[a+  ? XW1! q㆔+WNc~7d hC@@|]@?~\2d .\@@@@@@._,ӦM3n߾=IM0M˖-%uQ@Wk2.@ ;v *۷%((H/^,:[9@@ p\"ҥ3~'d͚53xF     ~3qD3gܼyaP6mL@Mɒ% @H q".PD :tK.n56 @@@@@@},X@&MdC3d ڵ] 9а .@`M?> L@g5Ne˖ɐ!CO>Ϊ @@ p@@@@@@mfiO..\pod駟;J&M$eʔYA@ zo@+W5k\"k֬J*E:  <3b 3sILl @@@@@}ˌ3L@D.s:G9"f@@N; @}4h٨`  >={V3gw @@@@@1{ɲeL0Ν;#H*JөS'yꩧ$((a?+  qV@qMzjѰaC?)  )jdbk/_eT       ߿_&O,~*ڵ35    q &VDR ,,LN*u֕;#UV *F@Y @@@@@|A`ڵ2i$T5%44ãi^na@HJ!$PNP3x`{hBn*ӧ  ]l$c@@@@@@'O)S4rEJǎM,YD@@ }Ah@@zJ֭[g۸qca@'x+WH4if @@@@@HJׯ˼yL@ͯ*w8}tUV&B XA@p55@N8!Jϛq5J^}U3C@I@3^|Yr)G 3V@@@@@@u, %_|FI&G@@@@@+p駟L0ŋEKppԪUKڷo/?t* ٲeӧK:uKJFe  `'`XShQ=,"     #uVL3k,9qD?cҦMPSx(ـ  u hJǽ{UV6 @@!cw_+z     8p 9sݻ7J?<&g(u؀  A,|C "R֭+RjdŊB\# 84&yru m      7Oٳg?#ʸBCCN:fbFITa  X?ג ^!py)S;vߖ?^7:  Uݻ3O ٱcGJlA@@@@@|\ҥKߛ`~M߿0dɒN"ۺukiڴd̘a?+  +@  #<"s̑'|Rܹ#C *U'E@Q`߾}&F++V,ƺD@@@@@|I͛pB9sO^ d5e˖y7   @`M\d$@ŊeذaҫW/s:͛%o޼I·  }XCA@@@@@|Y ""B/_n2r(ɟ? iժ,X0~6  5u- d[Nf͚%/_6)r7l )SL>p"@@viTD 2       3r@w \vMʗ//{5ܹL0m@@x ԯ__/^l:zȑ#-P@@@@@;L0NsD.2d^xT^]%K   5< @*{nP\~ݜgĉҩS'@@.3gN9v오KN.]     x@`Ϟ=2g={r*U*iР S$O]ڶmkN"\R*WS&  @<._,ӧ7G<f͚xMU@@@@@@ i/L5QN"kזVZ?/SR   D'# *6m._|ܾ}[4i"d˖U@@ܹvT%l,      <Ӱ,Y2Z i֬dʔO@@%@`M PÇˮ]dŊriԨZB q  vakxe@@@@@@Ol޼Lo߾(] *UHͥiӦG@@+@`M|Ũ M;w\)_:tHlb>Xp&MB@HndI%G#     @"""d͚5?DZcǢ44+W6hflٲE@@#ߒ8@ٳGx p9m۶2eA(  I+PjUY~9˗%mڴIΆ     'p Yt̛7O-Zd"88XU&/4i҄48,# \  @lzf͚5͛k&#G0# X ]trɕ+>|ŭ  |Uw Y2Fd!êAGV(*]Gjk?[)ٺ2dOY 3$@~N~&7 7q37}>    ۶mL~:TYf3f ԦMj@@HlrN@j9r^{5狐VRR?t@@B(qF'Tc4hP̩@@@@@@ ʴh""{ァ Um:eAgddT݅  4' ;<=쳺UZZ{Lz衇:@@ ,]{{Y@@@@@@#3f?ԩS}vܹ=\NTCC@@)4>Fb\'?5qD$?yGb\#  /dEX`@@@@@ zjM6 ̚5KG{ad/a?~l  @8  A_@kpͤIpͣ>{cP!# #@Śq*     DUG97^jj8 s9NuN:ݏ  @\CG @l L2E]wS$&L^zIIII @@߿V\d[~;| =Ñw_V"  -qk6F @ ٳcVE @@~Vӧ;o߾]۷߉8 @@@@@R`ݺuN?w;w =zhر4fj*l@@@ D]eL @ XI&ɪո*ټjѢ9  @:t;v(++KvÑ     (~zY%wvM6ڵk}ـ  @,@(_;Chu7xC#F1@@rsse0f4O\ @@@@@B"P 1lA)...$$  D@b4 1 D7߬K.= ar)zuM7E?#D@B$dg4@@@@@+Wj֬Yi˖-;QFOw4ÇWBBBـ  @ ƏD}h"]z饚3g9" G'OV-"h4t@hKz/3g'DcA (H[lQF);;ۙ Dީ   Q`M@ nݪ+B}cҋ/zױ  bw!GV@@@@@P{rJ'H3{lgf͚رcG'Hsꩧ:AA)..c؈   XS;Ds9rUf_ҩ`[ZF @hr+VhN?.RkM':     @4 XZsuB4VfϞ=h}:AJcanݺܟ    zAޔ3"4}twkرNe˖9x@o^x5. ŋ2dw@@@@@uilZtSA>ْ5b9Rr3eeeڝ   kK 4СC`=zG/ϟaÆs& ĪX@@@@@ w;xmzC4>|xvF26"  qeW 4U+b ɓ'+;;ۻ@@ ƍ>-[ԩSX>cE@@@@@ h-_ ̛7ϙZJϑAON={ ?@@@ <ք}  pa7q9WW_kժU\S" +бcGm߾][Vmo Q3@@@@@B/i&W_}%ϟx,tI 'a#  '@ 'jܹ3ۗ[=Y؆ D]Զm[gcƌѧ~Cf|     ؽ{믝irrrLJJO< ؜j4s@@"[ 1O@]`={{7[f_[ch  @4 ,^;!CxY@@@@@@ 8 :h,Hckr׮]:tRRRj=@@@ D= 4&M\[/s2_}~}{=.!  @X |7R     Eϟ Ҭ^Z5u 9ɝڴiS1lD@@+#A@ 8YfoԲe˼dffЭުdz@@hRpM4Uƀ    ĮY`iŊ*))%55UV}NhzQ1lD@@ X! P\\zJ>ݳ[nzGt{ױ DtR%%%)??_͚5!@@@@@/^ :i whl1b﯄c   `@ vڥ_2eJ7לr)zG5rȨ?C@8rUTT~HC@@@@@ ݫEyC4YfJKKk쮽Xj>|3YB5hF66"  G` ? etwhƌL.W~*  )|t/K/)]     Q,m6'DcAwڰaC#̀ 4nB4ɵ   @UĪ+ @ ؛kO>@sV\P;zuWW:uD@"TB͐!C"tt@@@@@ Rڵke/r46ߵkWCf  DV9v@@@`X!Ĕ@IIy=ںuw)))4i^mֻ@@ *ߟ'Voر]     Zt?Y>:t |C4Wb"@@@kMǁ  PXX?zᇵo>tM79mZj]  gq>3k;wT6m± @@@@@ 6oެ%K4nfݺu*++u$2ˡCwܳgOz,;    XJM΅ w#cmYs:c9)@@Y51{8 @c ؗ/q Bnٲ:xܹ&@@xgt;_n     *Vʕ+3lUi:M0YfݻqC46;&$$s A@@"@ @hh? ̘1ҥu[nѨQ*m  P Xڗ_~SN9>@@@@@:޽ofӦM*++ LNB3w&[ٳw4@@@  %gB@NK,G:rHc l&L ” GओNҼy})##>@@@@@*ټySqƭBwUe7o>}T X 4؂  Z`ME9 uرc9SNNN۴ikF]wvZi@@JJJKk֬iw!    XիW;Uh,=Ӛ1cFRݻwĉuW}X@@;v>S`!v9    Q'PVV[z3ɪѬ_^ Y]z4nxm۶ 4   k"u@XnSΝ;+!ؗǏW_q)!!v>  @dee)// X    D@NNLթNñL޽feԉ@@@ XA!Ă@QQ}]ME=    4~z's37߬'|2;M@@@@@ dNEk⌅giÆ *((|nXƝg:u${ @@@H Xw~# B5k_+uU;}Q~j„ ;v,o& @GOC>=A@@@@(--նmۜe,4;߾}t8u[y ϸ󬬬:@@@$5t+  0o<'dkΝծغuk]tENfѼ}+@hZ+©HgXpڴ     Pgݻw;a f,Di&9rLIIQ׮]3ݻwwB46͛7o^sr    @&"c@@'^;C}UJ흐_SO=M5!V  ҥK|5k֬;@@@@@F37nq4@۵k:;*@@@@|B@?ִiӜ|VB6?d!lB6ՄX @ e!Coir@@@@&PPPf,8;aj¾֭:j4}@@@@G`  PwB6}:T {l."=Za ^`:_yzCΈ    ߙmڴRh7@sz)Y.]8 TڴiSr  M@IDAT  X؆-  P 6׿6B6[ymGɵ  P_)ShĉOlsX JKKL6p7駟v̜9S~b    : T,PgϞz!Y(1d=X%&&    #@a\9+ 1-`!SꭷrF*׌;VSѦ]vUw3 x?^ÇװaÜy>}dom#Gܹs޽{黙e@@@@bBD[n͛+f|?¾f;J[ץK%%%   M#@iܹ* 1#pa͘1 ټ{˫6v{ I'l.ك4@h߾rrr*VxRSS5doƂ7F=н{w}    "`/l ԧY5*fܹL}T9@@@ X! UŚ5kywe`U?~N>jo{+@bl}ޖT۝eh    Dbmۦ}޴inϞ=2Uq4V&>>@@@@<5w1 Q#0|YwѲeu:쳝}effݏ D5\{^CLJJҀ4|p'h3l0Mu>B@@@@hvdg,@s4f_mڴeܰ;w4YYYG}E@@@( X7!! ׯw6={mdU=    0q3UVN:9f4sT   Q @& n"C@@nVB66͛7//ڷo ٌ;V %  ;\qz    _0VeB2۶mVw^'J7@-8U3+    kb3r@bV`Ϟ=O63fЦMZ 4HiJKK /@hH7|S?} ^Z:t98@@@Uݻw{3q'jL||ڶmf,$;Ufl}CC@@@8r@`{xG~GN:D@P ,^X|O?AwuW@@@@@ 8 ɸaŒÇSSSձcJa{) {8jjN   I`M@]HsqB6Vf.l~3f h'b| M$pA{ֲed!Q     - l߾Rpgh[BBڵkW)4hܹhZhqx@@@@ X@G`޽e!֬YppZi ?l@@>=R6m4uYu=@@@@ؿ70c!7(Su*фn ̸N}j,\CC@@@L5y5 4w} |gڱcG/Ҭ[ѦgϞe Xs̙gzY@@@@MLwvB2n@wVu!1:T T \    7 @"@`ŊUs3fvp_6  O?}Y?/_=zJ@@@@!S-0c/ 碢t%33 f-z@@@@ D=d  &Fŋ{6fK.=zy^@LGѽ4߯wAώ    @0s*߹rnnP-[z+XPƝʌ2Phs@@@@ f  Ј%%%Z`7h_ `nW\\\ـ {o.袠ީS'^ZiiiAN    GqX0df!W6m}>[p֥䚜@@@@k@h "͛7O͜9sj dee9A7l3x`/i +d 2$(W^yE]vYP   D@iiv00 ޽;d0qnew޶m[%$$캜@@@@  !̙35{l߿?[hSN9EzF#F(999l@>|g' @@@Oe|1;PkBѬz֭fЌoƾϦ!    )k"NO@z}7= _7Z5B7-[z'ĺ@Νuր  ]&؀   &`a\',cӎ;;wTqqq ˸v))))dD    p@"`H]tm-ޠmvhw#Di0uҤIzmf=   4_e;^[o/_ U3Y& Tg:. @@@@X Xw# @ YF_~wZvmcԩ7h3rH dY椓NRVVVY >~U54@@@N/wq2s[>p@p'rf͚U ˸fEV     XZOΆ 4@AA͛ ̝;_̀ߤ z-]tEv2d,XjX   @,  fڵkW/+[jjo Tܲe\c@@@@@ kBɩ@@p())ђ%K4{l͙3Gٸqcԉ' r-j< 'tR <gΜjY   @ 9rD Z 鐭J`P}}+^!    @ iX_Ύ ۝Oq߾}ll4h@(,,TZZʼ0a^}Ug@@@gb:!7 SSpf߾}!NrrڴiS) ]BN    !@&<@@LpBoEjuÇW {5F@Mc޹e{tΝV[fժUu4@@@BRP7$.h[sҭZr2m:cBqY΁    Q @& n"C@@B-yfoUodZ*mFa Qg{wŔWl/=pttPd=/SeTPp8Ƿo;uv\U23-֭ybϞ$ @@@NP7Su*θ,(EN@ƭ,ca˶.++ ϛ*h     @@@X8y|ѢE7owZ~};aN8Aީ0#ڎyJn5{M㄂,\H_s!  ,`ߝY7e}L=s0U]g4@@@@@ D   @8 Lsi<)?x=T A K`&iɒ͢Ej+RfUfgKcHGK^7   4tjȾAnw}.f=e!> ese{YL㇆     k6 @@`nZ)hc۷zhZZ!M ZeU2c4_|Qsys$b2bDyT'yƼ! @aazZإs Ք5ʀEn ĸAs1p @@@@@W`Mzs5@@7] ٸa_>{<Ʌnݺ9nxʂdm[icgasIg*5H3iRyKiD@iG塱i$;ȑ#Hgi޼y1d      @ ;A?@@bRZ|7pdg9777(qC7IJJ 섀 x*7xC͞"ljx+2M"U#w???@@ X՘cLcVȪh ؼuj25UI҆4@@@@@ 51q$  @ ر ,[L6YfŊ:p@PC ܸa~W^j֬YP`XNկW^\##C8Q6ccÂQƦUfzOXe X쬳*   شo>r0jUo X՘`>[hƂ54@@@@@@65 @@0(++͛mJOzi={B6w&[۷7o9):<-偂1k'ytٹb=KD@iCI_]y#GJds  Д  M?a0V% Uo^r @@@@@e5|;  @T؃U6lYj>A]z6 +]BC~XϯjGz)5b=KĢԩ҃V\z#qŢ cF@PXe/TZQƎ.4f/ڿ -bAZn|&0Knq-@@@@@q    PRRuiŊɪXর0t XUw*7۷Ѽܹsnݺ0zKvy*Utl_FyUg ?OZB#%E.$[! @ Nn@w]6:XRR2331`ݩvl\\\ "     %@  a"`n6nm,holAr6=z܊v-oJσx*Y_)-[ʃ3WqW5+_KZUg * x /Hm[Ŷ=gƌX @P` 4E(D!c3@@@@@@ քM   OÂ6U7yyyAw111Q==Ome D[;s4uTgX>\O~"bK  Z#Ghީj5`1MJ/N;b X      pkΖ3#  5;wԪU*MټyN}ݻLrwO9|8q>uwS-o.]ub:O>)w^:@nkזW{1.]^FX H%%%0n8Ƃ1-:$B1n8f,T$        Ή@@@@aa֬YS)pcիW˶,Tc ܸaw8<%a7oþ+|:뮻S1^58}W-4yInMoTx曥ݻOa}wg"D=A_cJݑ Xh&33PLx3"@@@@@@j$@@@6m7pcǎ:fsC67={t\x[sε77pm۶뻃ϥ8CnSIB%B'`<ũΖxCj׮bK 4U@]yea܊0gwkof{wMnUbO\@@@@@,5u-  /`YjcvZVB6z4Y, ݾ eSA4tM뮻QfU3.L>b/~ZJOX^gʫB:T~N7ߔN<1 '`{=9P&4)Y222*bc78J&\@@@@@55v/  a*`Z߰qFZ9 [\\SI7ppwf͚yw{tUWռ鞤-ܢ;SZGVyxR*?.%Eky/htҷߖ;| NDoCDe`KLv|~~~*g [nϵs@@@@@@$5t+  1*pazC7V*شcǎ:$$$K.NlN=znRi Ooܻn@mݦo]-ZCkF7N;w}W6,B*o_yiOyizJ4)d X,hr2mz$t%&&z+ĸb6~la7csnfh      ĢX@@(#-`qC7u[ 7~_]Ue XB6dm<3ySz/}Աcga>L6lJJJ`qK.Q˖-k[o% hYKJJZӧT)ٺKաC9ތoVr~歪Sqq:uTi3=? 999o;ְC>} @aaar9x`n=ʚ/5m 4o޼{ʩ@@@@@@ 5q%  1)w^ ulpC66?TѩinKre=.8C is\MGEƶ2߯;m~Wsoܶm[ڵlA={ڵgΜ'ڴiSsXŤ{|w}6nXaVvcc,tE[OT:ݻk:쿡N;15j]"zݣJ?Y\㎊,!*`!P a|or`jå:]|-k X54@@@@@@5q  4UYn]*mغ`+X0*n PtMJKKv+~"O|'?!OA%'W5VôǏ׬Y^W^yec:Xù~iii>n8ٻ8.HSDŎ5V -jx5WXk55DchQA` %{ÊERsde2;8{|xz衬zN㵵sxGk;=cO>dlVYe]⪫ʪU=}DG":AE.K5@Lx!S{X)aVKyy1]SYYȟ  @ @ @ /!H @Xve#v:dS5B)I*-gyf\+qqFű1Tӽ{>TӢEqZۭ[׿U\C7p9mѮ]x饗_QF9UO=T;j[o}s"}y,,4eʔlÇ;.(U1IATe5Zf^%^}x:fmYfNX]w!VXaދɓ'2^ l1p#_*-W|*wO8!\V.Z+?^ |΢ 0?wiPեfIUۅ L}Rx~R[Ǫcҟ6 @ @ @M@Ś 9O @*'N̂)p'W9SJHA?:i=ז[FMݻ!G>餓%{j* Z 6m]tQ\qq]ȢXeA<3)˽ޛ TT[ӱ={V 6|5߳ >)s뭷F.] fyO2x,|T׊5BW_=xzo߾qG/)>ߎ<.jA͛ȑ##v9^_RKEX J||_8ognMK o a f9<0o>cƌl֬Y)a{v Tݯڮ)f @ @ @ @!kR۽ @(!C{ݠYbs_{UhO> :zg}UH_O[m2qzTM(} sγ|jرrɆz}<?Sd7*/׶OPZ-"}t2y#k경kYVZJ̮Z<Hsܗϵ[4<㆗^ziVA0v>}I^{e >`j0Wdv1UnIUaRՖ :4 ;o>ۯ~!^y^z9T.p זj#\Blv*դy%RrrٖxՈ^ʿ~K./80nᆬjQmwI0kjqT&OUpI!«jPpm?]Wx]3k ^j vYMmN @ @ @hhw? @B`Qk pZ[_GuTTTTN5/2?瞾,RmL6-zҼuVܯUZ_Np,S$}mfY7o @ @V֤~7*wվѱc_Rf~Y}j38CN(SuԩSٶk9NV[S#vvsb&kԨQeI:昈\A#n-Hg꾥ps V٨_r`L T{2WP%[ B{~ShWy+gg~ @ @ @h53 @T })_9/ MzOgF|]VE>jkJưզ*T۟N~5)\~I߯_ݻw8mFՖDUVF4WwEXT'|7xc‚TOɓ^RevBॶ.|IzBׂ]fw}f @ @ @̇`| @-駟ƤI aWҥK,s#|V"N;m1c^PP}*+.裏fNlMqqGG]Wu9yo;.Υϯjdgu׭v+Rmv.b"Fx㍈Oj_?V&O6x܂5J/ ˜- Kom5Ol(躧pJ=R̮쎧kZh @ @ @ @`! ,DLC @ff@IDAT 4}9.t嗯Ih[n9^So_2bjո}W<-ɓ[ hU睞B uIפjk?ϱ&\Z\`j֭[l[g_OSOEzu[>}6y;|&kf ּ;ѿBM -쭡5)+s{SRȥfֳ0C,u9>`L˖-tE @ @ @V@l @ P_^qTuf7YmՊͼwrj}ՖS3\Qd/WZBuj~XaYgׯ_uQH:ǓO>R=zD^Mc$Puo];UV裈?>b&ŠA4#rlsmܸq_V T \o>)Sk :n!>U_KcUu=z]  @ @ @ @@i'@ @`\s0`@Ywu#UX[aQW_=rᝅ}5fI!mp@VmKy+ULJa=ܳ=J.>u> nI6z'bcnU %WebC;}beZ [ kh @ @ @ @@^@' @(;}Ԩeu{57+jVlhL-REӫα]oͱj^\ÇW_}5뮸_-ϳ5կ.]d}ӦMv?Yϥ5=rg-TVVF֭.{O!ٝ+SB?0 @ @ @h-FpL @+3׾3Z=㩲}gUJYBӮ7mF^~3&x,ps}رc qUW:w\㥺3a„jS[r%ΐ!C#5Zkر,A[ 505Z܋ @ @ @ 5 Z @ԓ+xf˭U3X,qakjU5X#TGTf=իW,2cM]vig\> {f?{tP7 @ @ @ P%?C$@ @@ZeU UXve ϋRo,Rզ_T۟Nվ!f͚{/Jm6[W1`~)7RФJ+U-vңG|~@?O^A7}܄ @ @ @ P5̏ @&)0n\~ٹDm[UL2%R1l5|I_ǤI}W[mXlŊ hժUӧofRy뭷Msug>8xW_.(b A  @ @ @ @F( X) @ PbDުaÆ5:W۟N~뮻6,R%–a{ꩧMK.u'WVnauYOG}^{mVEž YPA @ @ @ @" XS.O: @(+%/g„iji,[nՎׯ~l&զsU۟?_TqTdW.^7ۥژ:uj :8fRM;sqUOzӳxk@ p1a„:*ZhQܯX#:eMjv%˪[NL;?jUIF O,Dry}L]t . ^zx" ѬYw  @ @ @ 75[2 @J^`fNqȈO_VZeAN81v83c*O)S?8S _j紓˼n/|.رc~qwdǿѣGJ5*СCڴi~zqƸqI I$_EͰČ3bРAq_jw]wݵ?Ƨ~:.͛7-rNfފ';ov5jTY([o,O<1s1;l/hk5׌N:){}Kg? +DluO#UJF @ @ @ }UF @(ЫY3]>;^yX"VK1pl56( uQs6l?x~uW  ʕ49蠃b饗5kF?^{~ڿ!;@Q M;9>hVm#hRBs'~E0 @ @ @ @*f䶆; @ @@]6$r!|ϧr˺\U>}Ru{,ƌbje 6 V^y[l0#9m6g ,1z裏?^_S&;t hHh̯qC]{Eecn @ @ @ @@U @(1\8v5GJlC< O'l"wp @ @ @ @BYH!@ @@}joG뮈};;6bu#ƍh,? qo @ @ @ @UrC @ @@4oq3gs)/D"@ @< uTcEt萿"~|fyLw*p-m43TӼyWDzP\t @ @ @ @5% L @ K/"znm`e-]ѱcPGPMY?|#@ @ @ @V@Ś}F @ދ8與RMıFh1x䑈SNx啙}V[-k#wyL @ @ @ @q XӸ @ @`~#b_:n\'n 8OL Mn63TӬYgׅj‚  @ @ @ @)GjA @U#|3"7ϟOl?b"zhk!Д}7C":ux;3_3k @ @ @ @4NqNݬ  @ @`~RSOHtqy{1?@yNąFzk?\St%?cZ @ @ @ @_@?C+ @ @| uF"fͪ&P?qFL6s+qѲZ @ @ @ @! XS* @ 0CD{nK/Ub5#N:)"X9{A }|f+j>#N8!M @ @ @ @`M/\\+^DqUWm&v}M7͛k @ @ @ @4- @ ,05n+Ϗ &KAsKچq=WFeeĖ[FGĮbN F=1lXDT۶Z?iD.oQGm~Mmf9֦Mqbf뭷^z~ @ @ @ @`My>W"@ @@ %?x#-qjM~{2$8p{֑ TjZ{GG@gվQK=j6xfCF=bƌ3ֱ>;vVfu׭պ @ @ @ @46̗ @@O>SN9%ݛ5ksLZx=W Onk2Ha+ݱG:u}7߼x)đ*3D<|īF2@uRXc#Z+G?JUoV]5b2J&:͘1vlćF"* nMZE5kMRslY5dȐg}bFZT=m-[Uy9Bm @ @ @ @F@<*%@ @@ |gqI'wQI\;/N9h޼yx4Oχƺ JO!@ @ @ @(yD&H @߿vi_onu]+ȶ)S"y'7"|3J)p 6m"ڷXfhvK%)T^)ShR j.N[ L~Hk4)JB;U?"ƍˇhRUng~֕>P*ұc_{]V{}ݷo1/F-$@ @ @ @_5: @JVߎ#<2FQ._~ytAcHay{R,h\2bfVIU|X#IT1n~ml[o-WTTc=oB@ @ @ @ @ ' XpD @+ҧO8묳/)iR&k*|qMj޿rfT&Ui [*;j;/L"R\7rj\\qѷo߅0! @ @ @ @`͢PwO @,"wy'=x'3Qu][F&Lm&rAY_IW TmCD.Ӧ_vseeD |o2U{jWmJi."WX_GϞ=sՉf,tқoK/b @ @ @ @E' Xݙ @ &ӟ3ό'f%-N<~mڴiR8s /\vmѫW @ @ @ @V @ @@} {qac=VZk_c/ Д?xeoᆹ*A2A6 @ @ @ @F-P٨go @ 0[TkM6٤IUj?x嗅jf+DS[o5Ygy^n˖-#z{np @ @ @ @@i֔s0  @,T1cĮw\L0!{5׌aÆW_mڴY3(RK=K,nkO<<3 @ @ @ @@i֔s0  @,4n)ó1Sc=6^yi} D6pø뼔78zHmf׽;gSLX: @ @ @ @,zmO  @ @`A8cšV_}߿.c*pYgYOT9RYY#G]fGSkM6dA  @ @ @ @Pd @ @#FȾ_5TsaeUjjg '?RpI\sH?{\rIl2_-";2# @ @ @ @P$I @ @`NsNӧg,2q~U@B1,+rKr.xW⠃^zx~]wͪ׬Jc @ @ @ @%bMi=!@ @@FUϸ⋋ET1CΌ:( ,q=/^"2vf=SX-aÆ*_D=WUL<ڸv @ @ @ @@Ōܶa @ P*=2dH{ǎnN:i `gqF\r%Y_=V[my0~1xuni~~fm @ @ @ @! XS, @ 0Wz*o]{ƥ^[. @`Mݺu^'||?9N=1ڴiW^ye{t! @ @ @ @YxF"@ @@ \q*hL:5r-_{vOhƍmFf^ꫯI}%XxL @ @ @ @k  @ PgC=4\f;#:tP}1>}A>}Q>m:uʾ@뮻VM@X}cȑqd\?Oc„ M\  @ @ @ @ O" 4 @j4iRr!qw+[. @@M.,8㌘6mZv*UC5'@ @ @ @Gyӝ @*0v{cԨQ٥q%ĩ:CO@xcqe+r 2$tDE, @ @ @ pkQ @ Poݻw?;K{g$@|wǻロuiӦM 0 z9K'@ @ @ @@\;M @)裏6lS t!qt.ǓO>o}F1qw}CS~ @ @ @ @| 7  @ 0{n!uƍ:u9~ԩ/rsXveG_Y3f/=И:u\v @ @ @ @`MM @X%38#z]^{UYy`d @ /ТE馛⢋.7ޘƏ @ @ @ @`*r_1u%@ @L<9<=N>KkPD @` 7zb=+.{ @ @ @ P5t @oc}Çgl֬Y\}q14܈)Oƞ{_~ekă>뭷^j @ @ @ @< @M?' /d_|jM:f#@@C=:=4f̘v۷ѵk׆{ @ @ @ @@e @ @vmeaÆe_p/MD U5jTt)[q^뮻f&B` @ @ @ @/6 @ @ _B5NƱjO<[n%4+?@Mĉc}n @ @ @ @" XXy @ PR?x駟f` bȑmڴݻw\veM j  @ @ @ @u#n @( 2$v}oC]vYeU ] @` h"n8Ss8+k @ @ @ @Tq  @JSN.֭[ :4\rɺ @" 6o<{3p  @ @ @ @@T͒ @Vѻw>}z6<0׿F⺍*ЧO8餓뮻.*+2.gf^ @ @ @ @@ 4; @ Ј8裋_L?#}Y=U @j{7|``?8#@ @ @ @]@މ݀ @.p5 'P ՜|q7e?ML`*mM:5[{X- @ @ @ @f ̴"@ @,W]uUtI_|qq_I`СƤIi#n͕ @ @ @X u4 @ @.j>[hݻw?ڴi-ۯXŦ)X3 @ @ @ дkz @f#>N?;/.;rM!\s 4ևi @ @ @ @ Tm < @ PF]tQ׿.(uY} #U3h޼y9, @ @ @ @uN @4.,N;r/jk'4 P>hѣ~wqpM<[K @ @ @ @& XS7' @h\sMŕ) @@ <#^{5~{4k֬Vi) @ @ @ @*k?( @@N(.s)jh P?{VZe˼뮻#3f󲭍 @ @ @ X@ @@8p`+OYtIqW4y4-z(\3eʔl᧜rJ\veM j  @ @ @ @&' X @ PUɏ8۷o.h2biӦek n2P @ @ @ @ 4gn @W`ԨQ8&NzkTVV2"@@ׯ_aakc-z'@ @ @ @`MY=N!@ @j_g# x@IDAT͛7 @l.8ӲUTT-p@ٮ @ @ @ @+ Xt @h~algK :4ZjdM,5>~NGkvO @ @ @h5< @**lvgn1lذX|u(  Pw\\{:{,tR@ @ @ @ @4gm @Ibw}z;#;+ƓO>zm#@ @ @ @4:FL @1cFq]we YG? 4ɓ'nV %n1rXj @ @ @ @+PYK2 @8묳%X"B53} 0;-[c˺ӟ4L2K'@ @ @ @4FL @ׯ_.o֬Y 80t2ùMN`ex _~l#F?9X0 @ @ @ P~5L @*>hs1#W]uUt֭AuXs56mdr-q9b @ @ @ @%*P1#L @ $oV[m_u6I'W\qb4u{7zӧO(nY @ @ @h56 @sok׮of{J;,,.bZn#GΝ;B= @ @ @ @%& XSbt @XpTE!il6(FK,Ăn8ׯ_^mg[ @ @ @ @Q 2Y @"pgC5۷!CÑ^uvſw}cԩ0 @ @ @ @E/ X蟁 @ ؼyc5\w0$-ZĠAC?8 @ @ @ @`Mz\&K @^8Ê]i pV\qŸ{UV]w]\ &F#@ @ @ @ԣ@ŌV @ "Ɩ[nG_2n @ 0 ݴJ6?x;X? @ @ @ P*֔32C @ p!C5:uT5F #pA'lʔ)_07w @ @ @ @,K  @( *l2,L 4(Zn]3 4K.$vlcƌC=2  @ @ @ @,P1#5; @M[g.R{M  >ܹs| .8Slܖ @ @ @ 0wkn @%*0nܸoPM駟.TSʴhJ|Y13ό'|i,*  @ @ @ @F) X(I @ ?3fL6E]@nݲ@MԩScjMȝ  @ @ @ @sp) @ 7{־}x#UJ @6mZgk{]3 @ @ @ @@  v  @(}z+6l0aB6{]7C4!O>$:ucǎVݷo8# @ @ @ @A1L  @ P:ujի9装j 8  PB+r߿8O>9{ @ @ ٻpeRQA@1PADP4R3MJgK -J! *0+*YEDQe];<׳k|>E @!iw @(Ysύ{.k߯_~Vr_  @n 'M:o޼8#cɒ%u @ @ @ @#PӴ. @ @<N;e/ei&|r-,* |G[ĤI]tQy!@ @ @ @ԃkݔ @T_`1tIw3A:Xs5㦛n-[fsƎ[0! @ @ @ @25#@ @ qꫯf~cȑ nD ~hѢ8#?Z @ @ @ @@ -4|"@ @@ye]"ϗ5X#ݻwсO Ԥ{.[Yg^xa- @ @ @ @O @ Р>b-bĉ:ǩڠlq P/[mU,\0Zn>ll7VK @ @ @u0) @ Pc??TN:]t$@߿jRJ'wqt]  @ @ @ @f-Ěf}m @@7n\ 4(/^mڴcFz)["@+Nr-W^6qWİa @ @ @hNiԷ  @4]t'դ]}قj3@ k,uo6#[%@ @ @ @t7 @@z'锚3<3M;7M̛7/N:ƽ!'@ @ @ @@ٲOS] @ ${۷o̜93߃>KܫM @ ̙3';lԩ׾\9 @ @ @''i  @Z`ĈC 4ZvŕW^_駟 ,ȗe @ @ @ @u! .A @@O}… }od+2 @ @ @ @ZN @Ԇ /_usLm k hBݻw:*ٳ㗿eڝ @ @ @ @ E@`MCA @ \xᅑ;}׾lgӧOk Җ @ @ @ @XS_%@ ~ŋviZk5C[&@ }QVVuc…B{ @ @ @ @@e>M^QI @Z6mZ#{}oD @@)p@u]Ytjͱ[J7m @ @ @ @pbry\$@ @ '|ڂ5@:&.o4| @ @ @ @+#Ěӗ @̙mQ̞=;V[m촚_ @n>`V=ztK>  @ @ @ @5pbMt"@ @:FʂjR#<2TGO[ 92/8!@ @ @ @T55ӏ @-Z=zSF-W^޽{W# P(lٲ8p`?>~bv(l"O @ @ @kť1 @[TS]@  @ /PVVÇϗZ!@ @ @ @j(ĚF @,b#- @zNB @ @ @ @X|W  @X 1cviaVb4]  @@D֭N(.]]v @ @ @ @@XSc:  @X{sO/Kp+:X9s[n>۶moVtq4 @ @ @ @pbMye @jE`ĉqfc3oZ  @]vqGgϏ뮻  @ @ @ @FkjĦ @+/˖-˚r)Ѣ"3  @t,pUWŒ%KJ% @ @ @ @e7ݐ @ @̙lA̛7/\s͘:ujo߾F7 W?4 @ @ @ @j 'ť1 @\YPMj;tPA5iC6lX/~|^ @ @ @ PkJҎ @.]{I&EYYYKѯ_jD#b߿L0!6nܸ8p`uЖ @ @ @hNi_'@ PsOTs=6 @ /8oW]uU>/C @ @ @(E@`M)J @ PQmO>|^ #<2^{l[o5͛*1& @ @ @ D4k[ @C`qwgSw5wX9  @ Zq衇f;;wnhFU @ @ @ @`e֬ @nXxqV>ce˖k2 @`U p |^ @ @ @ "e5r @+HbM7I&E-ݻ @Vz;vl6ָqb2A @ @ @ @-Ě} @@ _ʂi҄{G3z @|5y  @ @ @ @`kV2 @ \rsi"@+'0dȐh۶m6Wn@  @ @ @ @f! Yf$@ j̙G&ܹspvB @r۷o|YY⮻*B @ @ @ PQ@`ME5 @TS;ȟ pG֭9 @`8 rK>/C @ @ @Jl٧  @ P{'M PK.nݺŴiӢM61}СCa0 @ @ @ @i 8iO!@ PN_dM0!ZhzhV\paO]I @ @ @T@`M,*  @(UntB@JC )v @`vaqo|^ @ @ @ P@ٲOSe @ @m6y晬ĉwޥtӆ2+eeeoDnV\&@ @ @ @kz @*0eʔ|P͠A09r'O;U$@ @ @ @TXSD @ =:e @@} tA|^ @ @ @ P^@`Mye @J(|Y( @`U /6dl~8fΜ*36 @ @ @ ЈZ5[: @(0k֬x衇_ɓ'ǂ  @ݻwjՕ>/Xxq;lUMm\ @ @ @ @ |A#ބ @ P߲̕Vs!SO=U 3#4KiӦE.]{֤ѣG  @ @ @ @-  @(U஻7\fٲeO Pcu3fL,\`B @ @ @ @ 8#+$@ .]w_;Ǝ;Xc  @?cʔ)voٲeq7ܹsGw߽Ҷ*  @ @ @ @+ {;'@ Pcg}6fΜ)Ԥ>  @J tAU֤k,&~5 B"@ @ @ @Z @ P@z99s\'hP)3YA-b @ @ @ @zXS&'@ 8|¿/2 @! feKzb޼y iyB @ @ @45 &X @$dɒxdz%w5z՘o vylNj/'xv  @ @ @ @ Y @ 1gΜ.rQ Ѐ V=# heB @ @ @4V a@ @@x~fnᆸKM{h[outM5;W7,_)C @ @ @4k5< @ V_q  @tСƛ޽{G߰# @ @ @ Ф4i3 @VرcIZh[mULkD֭ke, @@3gNlfРA1f̘1cFL:56`Z  @ @ @ @@X @3KOիWm۶Vx`ehoN˖-ke3oyX?~ZQ5 @ @ @h-6 @2eJ̟??*, @ 0`2_z|^ @ @ @ w @&MoۧO|^4d¿Y򚭍 @ @ @5ul @MB`}#!@ YgϞ$ @ @ @ @@N@`MN' @+(|Y` 4 @"zŚk0H,2 @ @ @ @zXS&@ y7`|^4t߭ӧ7Z @ @ @ PkT @̙3[ԩS>/C@ٳcҥ }G @ @ @ԑ:6  @ PXӱcǦ%{ @f" IA5)F"@ @ @ @$5 @,0jZ* @ڶm_BYB @ @ @hބk  @\E?gΜ=ztU&2)9gY;w>}Ĉ#@6vA xN+ޖ7gPC @ @ @ԥ@gR\ @P`W,X ,YuWU?nJjʯ%뭷.*?sE孷޺{,r˸;|PMӾ~aKΝޯ_*jw\lYdE _Q_/1gΜ|Ӎ78N8lͲz*~_g/FZ\uU ߧL?~xu]E{fmW^G:%㥗^<|pO * &/)2I-[uI zѭ[H{IL6B0׃>o}{:x441?3gnBӡCD @ @ @4[58 @ `\zwD`gQ!fȐ!qWD.(;.^}1bĈ,$w5[mUeͪ]E՜tIqG6mqq!-_駟m۶ͷ+OZT/~1~ĠA7͗Sg[>ǍW&?NM3K'$Sn喸#|:cc;4iӴ[)в,? @ @ @ @ @ P@Ϟ=M'NW[orzaJA7|s6)%VWȧ`\ڵkvK2gyfL<9?ıDSTN9Cso=_.I|W1f̘դ ѣGǣ>;KuϊM'LlF4]{L'h\pLV9M;i… cʔ)HvI @ @ @ @O @V(/r)pRiƌ1lذ%?N)ЧO^5kVHR 7ܐw 6greo|EʅQFOҥKVJ?|暅C ҅nSq_ؽ}Y Rau]WXo oDc}Nn+7-%@ @ @ @t @J dh+SNNoɍ69眓+gu^d{n/Ү]ѭ[ovQO{G:rmd ]RWzإKƸq㤓i:u/Wmݢ0iڴi1wʚ6ʺts$?svИ¿Yˊ @ @ @ 4ǻn @j(F߾}ޏ=X̛7#\^x!;%7J6m ̒[gaIjSQUտ1z|^;/WܹsѥkfϞZ,\0 O*ׯ_+=Z]*zM6){ĉE\x7裏]'?|ێ/`c~V3% @ @ @ @@N@`MN' @% YO>$nvh0`-;hR=:+|ͱhѢ|m I5+JO->}z]R òefΜF楗^\Ka*ĴV[Xg^7RF'm6FhN64}'볚~gkw}=b>  @ @ @ @!Ɨ @j qկ̙3'RJaJ'zv*||u׍nݺ7tSERpEa*g+l\sM̚5ne &iR`V4gMʟP4wMh:Ѻu>3q'fSO]oHiT4Xjj H[xqy Q @ @ @ @i7 @4&tJvm-9Zr-1o޼klrmdN^~8%SRz 4hP~e|s&lm۶_{7cmᄏ$|jfԆKZBMM+LoqaQcH/<Xkc[UW]UTEհ9hji*4guƌqee-[F J @ @ @ @  @(EsΉ|+YÇG ԩS)]W͘1c8cʵQ(xm#ҥKs=EӧLU/\;9rd믿_t=I _cɔw9cW/ySN9% _D *(XؔR:N~oH+~~/B$#Fd6 N64}zꩧF:A)b 7C @ @ @ I$@ @d}7k{ߎ?<;%*Ӳe. _BQ6 Hjd|hi_җ+?r.]ʅ~/M7TXSL??ݻw :4;ܹsQ K,Qߋk< Փ'OtO.U7u>Z`MRpWKg-ŋg,Xﲟ~er@ x+\M9M;jj:[onHv ._ @ @ @ @@@izZ%z(NIwatM Eܔ,nѣGѵ\W_tLn⨣Yf.U9qĘ?~K[ThVSr)tkMM6q]wݕK/p+)j 6C=4G9tSzNӎ۳zuŰa__%; @ @ @ @B56$ @HA$tzM ;bwN)BʮZt۷o)ge\4fVO>%YĚR}Ae\s5Y '|R4… oN,^X(4IoMOA/;vЦTRԩS#?Vw.7~e_}*kWj>#F(y`O?=yg"b\Y߷v[)ت.M9M;j,jޟqqWN=,Ȭ. @ @ @ @wϬ @@s=^f~GdɒZ_ɓ߿Q6 3f(: e-zE{tH))gҤI.]ˤu{~̙w}wt_xxV[mJ,R}zQ=S}R?#=WUtj .˂.xm09hji4g5~&LO>HσD @ @ @JEU @ @/H'ؤ4w8s˖-˂nJ'[X+cSjGQrw}:A )&R)`~k. 7ߌc=rkqWʿT_2cT/CѣGʚUK'C9X''|VnVjtrԘ1cSk 6<M9Mߥ\:A5)xK.~lpdn| @ @ @ @@pbMӼvE @Nvy7n\ >'MBS4H%Z'.vaѲe\N>W_}9rdU$) oj^x MZn_W㏏=#izNӗ!<GQ^XǙga< @ @ @ @`k" @۷ovjK/>lֽW^3V6ZECTv:GQ _ o۶mӧwiѢEQ:STpwǻロ>DΝͤvfZWIsU֔:Q>tТrS-,\0׿f?Xxq;;H&]0r*_"H @ @ @ @ ~ @TK N$ɝJ2gΜNNũ4v( z)%У7pâfӦM+*WV0aBQooeMk\Ojɥ0UծM)—)') cyii,hȑh͜93,_tmYLsGD:srwӴœN:i0&@ @ @ @T"Т:U @h_~n4hm8q |)\xѺuJ-^U~GɠAʹBKN[nK5L[[lEӍJf͊I&vaqM)3EmQG=X?>N=T<~zVD @ @ @4eZjʻ7 @n\?~}ٹb鄓o=*ۤ $\[5묳Nli,=N*]tE+rim!C>n bܹUVhѢ“DRJeM/\ʝ8+Ttzi'Z @ @ @ @j:[ @k_~yx^wu1},`קL ׿{nrQ/;6_NO={vv2Hzrq'f)X;(P?ZNۢ˜b̙֝~9rdr!Nɩϟ$?6lo~/fʿT߱cjZ1pa+߹sxWcL4>y䢾]t?OѮ]VX{C?>:M!sZ44j @ @ @heеqo  @h鄑z*Rʒ%K*,K/#Fd)0XBr_җ{-mӦM76|Xpa G.]oOWpR Ca|jd~9S'|ݻwςFrSI dMbԩ#:t}.R3l{T_s5wޙI֭3M{N.})RP矟+3t  Jq뭷F `jiƌTw&gw>i-[ wqwgtAqwfiӦE  @ @ @ @pbMu%@ @ASLozr4)^0`@eqƭtPMh뭷tV[-n2dH>e޼yd?;m?!R҄ *GOAV裏΂6UUTnyTw-"Æ ˿h9/5xN?k9M;~v @ @ @ @)Тinˮ @h:tn!ƌ={\V{?_W_ʶ}y* "ɵk` ;wÇ? OڞuY7,W cԨQԵ6\ʛ̞=;&MTneeeeѩSׯ_=.8qb|;"L#~vsVY @ @ @ @MWl٧n @/tSO=-Z%KTXƥ^#F8+)bƌYH :ujt5u)f66Jڽ;/f?sͯww֭[x)`7ߌ~;zH'$^zeAH]ti5ްFs٭~fҥKt;c<#tAqwfӦM;N"@ @ @ @TGUukK @(ze'SNKJ/tMm@~$ Ms~f!G @ @ @o @ @ @ @ @ @5nN @ @ @ @ @ @zXS @ @ @ @ @ @C@`M} @ @ @ @ @ @- @ @ @ @ @ @XS$@ @ @ @ @ @w5~ , @ @ @ @ @ @>ԇ9  @ @ @ @ @ @]@`M @ @ @ @ @ @5nN @ @ @ @ @ @zXS @ @ @ @ @ @C@`M} @ @ @ @ @ @- @ @ @ @ @ @XS$@ @ @ @ @ @w5~ , @ @ @ @ @ @>ԇ9  @ @ @ @ @ @]@`M @ @ @ @ @ @5nN @ @ @ @ @ @zhU+ @~5jTw@ ,[쳂 @ @ @ @` YE%@ @tZ @ @ @ @ @ZhQK @ @ @ @ @ @@pbM]K @ 6,N8ᄦ!;!@U&Ъ k @ @ @4so%4/ @/6mD @ @ @ @ @@} /y @h|A\ 4mN:믟mߎ9s4 *h۶mt}o` @ @ @ @ i  @ԫ 7#F5U+0|KIN=Ը;WFo;c<#Mv6F @ @ @ԟ@ @ @ @ @ @ @O5gof @'/~1w΃& w߽ܝzѶmqeA @ @ @XkV)  @(EओN< }\veѥK˫oK `~ @ @ @ Z4=" @ @ @ @ @ @ k* @ @ @ @ @ @hk]G @ @ @ @ @ @ k* @ @ @ @ @ @hk]G @ @ @ @ @ @ k* @ @ @ @ @ @hk]G @ @ @ @ @ @ *Ԩ @ @ Oĉc̙ѵkdMbw5XBE3 /ĺ}w߽=[oe/r7~xsWlvѲe|9IrٲeѣG>sƌkez*-eީSƛoz뭳WaU,\0K 6 UUr)|W 70ڵkWY3u @ @ @ @ \@`MAG @@H2? /sVXX 9C/? _җb̘13s|+2N>|0sac=)W__:crʬYrDΝva„ q+Ras9ı[Z:thz}_^Ǝ[.R׿xϏ;No>f͚Ur:o u]#5}: c*?ӳU#G}4<1ѦM gnwbȐ!ڨ @ @ @ @hu7|+$@ @@)3Ȃjvwcqǂ Go2һw*K.$/^\٥u!҉(Ě?8^|Ÿkb64pe஻gA5;v/ 9ꨣi-?O+Ng9j*Rg}//4 |Z/L˹k~;=&W_g]_v)_εO C: NEJAP)[VL*H x㍫`dC @ @ @ @45 NX @ Zg\uUxꩧ.N8~/B</~qH'NkoT;)'ӦMy}?;eGM]n473gNlVYpM 07pCK~ROgrk(ue5z謘tRZ^K I\kJ7͑NI%dSYJ٤d U#pǒ%KVF%@ @ @ @w5~ , @ :Ry[VKu]WUV2R Yt kfoNYlJ[s FOSN; )fȐ!q}믿>mc-~!5_᭷ފcFYYYֲeo IKTg4Wv⢋.ʦo~j&O/;/]wݢ N[nѵkx㪛 @ @ @ @* ^MN @@cH'ҤԳg:_q+?V_}Oz;ﬕq n5*#W9v ,)L餛\͗K^{{,X& ׿5+m< N֤4~x'ӈ s8~ת3oG[ou,^8媳ϳ>;.\mYtIEVjwI~(, :4p֊Fz&҉WUt׾gƌ/'}:v){ﭪ{~̘1qoͽ6ĉ'SNͷ!@ @ @ @X[@ @I/) JRkMXc8Ӳ~ڸ_WCx?km|0,XwGVk<;g]voaK/TiѣGggS>}#5R `abvʯ?{/kRY`Mn|\}n-Z/~/K< 1bDcu$N6lX6[u% /&O}QgN!J>3!{w'd3?JuYqWF L;f͊N4^ K~aU @ @ @ @v @ |;߉nݺe}";w}'.HP.u]*]vkRJcVZ aVv)SdCmVk@HTY*/lk.\kvR`TN'={fr5O=TV۷orR]ڵk[7ӟf^i:*;dV.|S:H{ǿfNA/)eqwF J)r-1x0?n)z-[m&⊬y:.RPMJiSN9% K++ ;sSD @ @ @hkWۻ(;] 8(⮃KH".݉[815QIqMㆊ!T$*F ;y/)s}{us9 @M/?裩|#tI' 6 ~_: +C#9xoy-:*5EHgϞ Ϧ뮻n /PWibE-U)_L2r_~q۷O;c/㽨>SDuhEЦ(mκG!~]s5=/B?Ï.RKGyݦf͚n<~РA)[-~"dkGuTS+Ze&B73ǵ=ܳVzo׮] @ @ @ @3Qg7v  @ W\1yi„ nȟjD|=\veN_8p`uG?A91y oҹ{Ν;7i|SsE]sϝ;%FC\HqkOT>q?8E@hEPDfEIzh:th*6b|q}K-/O>}z:#9s?GeK@ @ @ @Gkg @K`uM~z3fL6mZZk9#QKcGNrxdܸq krQeWn5_6||oڵkErЇ~M7zϻKZQm裏>҉/>ADg1;=)k,Xu#S\sԭ[!r-?U)jU*~,eGc( M4)*PW\qE~]y啩x]uU馛n*Mo>@ @ @ @Wkɻo @j"b]w5EO?Mw߽&WNJ+89眓FQ9YE4FsEUt޽4CI㊠J1<(4TM7jԨ<}騣4"83rԿDI[ouӧO뮻SO=Uo1>GK-~JDpE0Z+/_9]v]kk`QiWo4#@ @ @ @ԕ}n @ @X{EXYB {-^&9E`>76fh^{mz7=oT/~߿j=Gct=#rK,D{swQU|L85*wngϞEG߾/~Q#u#2S1_~'PMNJi麥|h묳NkҬY҅^XuݺuKſ\sM1Ej6WnfՌ% %@ @ @ @y6 @ B寻5?$yGs{Y~z~a6mZw}wlF)%3gLSLilX@Ч~Žޛ:t>y^ߒ{l￟铞âZ;#rӐ!Crإwꩧ{,s#Gʃ/x3QQ'Z1>|ϳVS㸗hŸ\1OK-6 7:iҤF7|)sp)B4n)WO>9W)Avo^|SoKgyf)X` @ @ @ @@ w @\^HeHz*}MzJ/ćrH:]裏ΕPJ+赕'/WWG՘EY$*9Tᔏ?8W7n\` */"hkž]wݹ֋Kj]tEǮ[nRcIz+;6_;~.T,M0!W} @ @ @upn @ @ @ @ @ @@$: @ @ @ @ @ @A@{$@ @ @ @ @ @h XӀD @ @ @ @ @ @@=Sv @ @ @ @ @ @ k @ @ @ @ @ @zx @ @ @ @ @ @@=: @ @ Ҍ3ҥKZyK/=W̙3ӓO>Y]x%HkvsE+zϧ%\2jiwL]v-s|AZlzWaĉoՆwߔ)SǏYfk~N:s_=3& iJ{c=V:b-RJŇΜ9iUWM={,}w/~ڵk`lS֝:ujzlIߧg} +zP)}Q%_~3H_W\1}ߨ:N' @ @ @ @@i @h%N=PDxLzjôi[o]Νw9y睕xܸqiK'Onp~O~4hP>w%7iJi߾;Sz7!`xӾ"S"f+O#}{K]w]s{w_dE+xgrS߾}ˇp@3<3r) WvO<IF0ciذaS_!C*M?zGF):w`G}4N8A @ @ @ fU߻ @ @` DU.u]7Wy0W^ye4vy)*ĸ^QZS>}{gti;,/U4w}<ͻロ~jS澿/9T5nQF-2j"ӿ=:Zy`֨β^{LǎS?#n9p뭷]wݵTU[qq.EzL{1r\:ˇjmΧ<ȴFU+BW_}W0)  @ @ @ @Z`MkyA @@ݻwDՐ>}ᇹKnҧ~:y>"@a^W\qE_~9E>(k&Mnt駧y7pCZyK~NEE_{]:t-=~7s3f78k"`rg=O0!WXr%,;#G՝sYg?񏥐(Eh`J>lMiOa=)/+ދbۧ_[oM?pO믿>袋Rǎ/yD%,ۛW\`NdvR%Inʯ~:}N_4}_kjw*~G=<}XTn"!RUڎ  @ @ @ @( XSO= @ Ps{4gTiŗzF_QM2%FbV+?W]uմ:qЩlEJ+ZToqQ%/B+M+Gǹf̘QS[)Ư*SN^ﯼJ6mZD+jSiyӧO:蠃СCsO{waʇqW;sjD('B.Oj?kBFm^mi]vI'ON؋73<Æ KկRnrx's;1_w߭zN @ @ @ @@ w @\`̘1'?I7A!j g?Km]{gˊJIIs[QZlܹ_"еkƆU/,Uǔ/u]9bDlK/ GCKEfرZ+G 'Zq~Oq孹_;kva2I.]҅^X9/#tIk~s+ ,RG?Q(q_f͚n @ @ @ @3Qg7v  @ \iӦʪ2:uJ]vY2eeJchem&WxA"8A9CСCS)[nq}~'/u)hk߿t3}rxꩧ*|{o?W\wZ)E0Z+/_9]v]oLqqTYlR?ùlCi̘19떻ϺۆORӫZuEŦ8+TS_>ft"֌K %@ @ @ @ԭ`M>z7N @@-"v)<̚MCbJ>jݹLsD+A D31"Q:K,{<*S~mFvmԳg??#ouᇗB?bǺPXfe/?sOOrSNetD>zuY'^i֬Y /nݺ_?k)W[mTYuM߿ym^zWF @ @ @o~ @ D5h矟k)SwvGϸSOM=X>,F?/_gNb|>GQ>HE\ǽD+yZn1!k&MO9|..E|M7xOps~Am6>/6o[/~t @ @ @ @Q@{&@ @+y&l>3qGJ(Q kWnpݲ.xJ+7x#WOիWQI%ڜs9O?mpm.W_}5-9S{jz9^\#-}Df5L"ZdEҺ;|@M.(Wu]r->1Ǥ=3oV;vl>0./BzWJCcOE ĞV>zooya?>ta*WQ`܁fΜ[<-9y饗JO>dhR߾}ӠAҀoߎN;--5 @ @ @ @`! @O~O?ZEfmzꩴ>PLUn\&߻w6\vRSƪc}OO9㏬oo  @ @ @ @ @ @ @ @ @ @ @ @ @ @1y! @ @ @ @ @ @ @ @ @ @ @ @ @ @ C @ @ @ @ @ @ @ @ @ @ @ @ @ @Ԋ ZyRI @ @ @ @ @ @ @ @ @ @ @ @ @ F/ @ @ @ @ @ @ @ @ @ @ @ @ @ @f1̣2Q @ @ @ @ @ @ @ @ @ @ @ @ @ @@ @ @ @ @ @ @ @ @ @ @ @ @ @ P3kQ( @ @ @ @ @ @ @ @ @ @ @ @ @ Ј @ @ @ @ @ @ f]"vlYZsskhhiCD1jTȑÇfAN @ @ @ @ @ @_Aj @ @ @ @ @ @ ЇF[fMkE "6oشewh \RPc e;ײ0!bʔ6uj#"Mk wuO @ @ @ @ @ @us`qL @ @ @ @ @ @) /DXҞ}6[K/ES5thČGҎ;.bv1B @ @ @ @ @ @ PR` ƒ. @ @ @ @ @ @ P ˖NUf )#}c=sf\Y  @ @ @ @ @ @ @5&  @ @ @ @ @ @ @ؾ=wkRE`„3hio}kDjc!@ @ @ @ @ @ @ :Aa @ @ @ @ @ @TG<`K"dr509s".li|gĤI50qS$@ @ @ @ @ @ @L@cM @ @ @ @ @ @ #E}E9⤓"fji1|x\c βo_ĪU>Җ/xɈسwfqY]q%'y @ @ @ @ @ @ 0%  @ @ @ @ @ @ p 45E'?YD2lX)D~ziEzjKc c,Kssʕ=--m3ƈw+Cѣ{v>G @ @ @ @ @ @ @Y@c? @ @ @ @ @ @) F?El[0!⬳"y)tRθ|y-7xJ.B/4#X_ @ @ @ @ @ @ P @ @ @ @ @ @Z`ϞnX{S5*86v;"{.[ڿ{Ė-S9kO)b̘Q @ @ @ @ @ @ @~.A @ @ @ @ @ @CB`ږ;ذt1}oK{;" 9ѱ@ss#Dۿx|sħ?q챥F @ @ @ @ @ @ @T@8 @ @ @ @ @ @j@`Ŋ?#{69s".4#?ks^瞈vK."N=kM @ @ @ @ @ @CA} @ @ @ @ @ @i#o"7oc#%-o8#V`@#|kz#kM @ @ @ @ @ @A} @ @ @ @ @ @igm `+`<찈.ʈ j{,{ߋ"6l#n)b޼ʏ1 @ @ @ @ @ @ { @ @ @ @ @ @ P)ohn6N9%k""FG)G?ַ"~UWF|3fTvQ @ @ @ @ @ @ @^؋NE @ @ @ @ @ @ػ7[#n)bo!⢋"/##>(⊈jO|"k"og @ @ @ @ @ @ ]; @ @ @ @ @ @S`Ϟ)?ѣ#n%-?FJ~? ʏ>(E"?= @ @ @ @ @ @ @  b@ @ @ @ @ @ @Ԓ}oį]~浄4ΚU~]x啈8Q'q}' @ @ @ @ @ @ ЉN&@ @ @ @ @ @ @ش)s;a暈%K"0ЃN_F_GՕe FYS_ @ @ @ @ @ @ P@R@c @ @ @ @ @ @ @l8'(=ϡC#n-t*#"bǎg<Ȉŋ#8t* @ @ @ @ @ @ @E;E @ @ @ @ @ @Zع3s#,)=c#_#:t*X< "^~gn c8t* @ @ @ @ @ @ @2 @ @ @ @ @ @ P#G\tQ#o0U @ @ @ @ @ @ @@)T @ @ @ @ @ @Tҥgo_ @ @ @ @ @ @ @@   @ @ @ @ @ @k[Wq}RYKۛ;wns 77\|;qW+,{qgǕW^guVaWۓrׯϏ{ӛ7oJs9e\wuq-GX0bټ- @ @ @ @ @ @ @@M @ @ @ @ @ @ PKD~{~Xz_};w˗$ֈ}ۿEsO>U @ @ @ @ @ @ @@&ИmX @ @ @ @ @ @ @@ 47G|5)׫2dȐ9sfѴ֭k=:Əߺm;6t=} @ @ @ @ @ @ @@u@ @ @ @ @ @ @#-+nDCCq_U?xxXpakK/;Su;_}|3zXfM\2ҵ򕯴3n۶-.ogqFw.\yq뭷yfKmg7ضn @ @ @ @ @ @ g @ @ @ @ @ @ PE|KxM[OE>fΜ{nKtҘ?~+#޽f&LK>b˖} @ @ @ @ @ @ @A^ @ @ @ @ @ @?'{qtq]cO<1,Y ,h3޺oo.dy4o馊/]WW_+_m??j袶u{ @ @ @ @ @ @ @8'@ @ @ @ @ @ @/.=|t]'OnsЦM#<Uzcz=bL+} G @ @ @ @ @ @@`QI @ @ @ @ @ @Zogpaq]{#Glsm{9s"&N,o[\S!@ @ @ @ @ @ @@Z @ @ @ @ @ @ @{xv1jTq]{aVCGfͪ*[S?mgD׷#@ @ @ @ @ @ @ 9 @ @ @ @ @ @5 woĚ5=J8OO[om3C}'1f3gw @ @ @ @ @ @ @J+h @ @ @ @ @ @!jժشi>zňO>kVqM;wlsafN{]?|\U @ @ @ @ @ @ @X,  @ @ @ @ @ @21q8|򗿌ݻw,7l(}3JU'cǎ6~m@u @ @ @ @ @ @ @&Xm2 @ @ @ @ @ @Ԃ t|Æ  9w^zУٹcƔvO`m:uj};#Pu]f* @ @ @ @ @ @ @@ Wۄ̇ @ @ @ @ @ @ 0qĢi655<_3Έ?o3ӑڭ)Oo f;wnݻ7mۖ;,ӥ64̵\زeK.>}z뾍he1%{ @ @ @ @ @ @ &AiW @ @ @ @ @ @8p v۷oϷm۶YzV+jfbew|!>˗Sv)2}}(_˳=mᆣFBڰabȐ![ SXj[O<{wvʷ[_X9 wj8kB @ @ @ @ @ @E@c< @ @ @ @ @ @ @b#Prm֭mBq[ls> _F5rG]≮s?w\4PpHC6mZyERdz>{bʕ3<ٳgm֦N +5Ύ4iR{{W|83:`6FѺﺨѣ)Sozӛ򁃩^8tH-;&B8 s,\g۩?faY=AΝƍ{ԭKlRHcjK v֟- @ @ @ @ @ @ @ @ @ @ @ @ @ @)(, Cʺ}b:^nŲebܹݞ 77|sL.Qq…qƸq:K!)'˕W^wuWS<q9紩uugaÆVs1kV6r81H)DpS0k/C i pL)1[;,옅'fAW+1)`6K 6{VXIc6>BSKllo_3%ՖKOs @ @ @ @ @ @ @@ A%P @ @ @ @ @ @*),, K ׅۅ!^<$) o̘1@Rbccckbcߦ|hX)h1-iSO^.vEn#Z~ j-(#RݸqbqYgg .̿܏K٘yOqR:ujaޑﲀƴ.nߗgc~WCfSxavիWW<=0p}caߑGLrAYxcO{:oVb5|N9v 9tJ`  @ @ @ @ @ @@]?Asn @ @ @ @ @ @@ ڇ#O`k~۽{#ZSbRAM6źu^\'L}۸qc\ORWW~n??>ш~R)(%Xxƹ~j,X1geٺ}~ %4Sco9vv)<1}eٺ0ܱp}逸sMģGηv%lL)@0 J–¹,8pS@-))&묖B+СC)<1 QLl;_}xau#Gl V8qbL4):Z6u_W㳟l~ol?eynK P_q=S뮈+,jĘ6~>dyy6cWQc֗gD}}}U<9 l쨯Z:vUq&PQc rٚ- @ @ @ @ @ @#A} @ @ @ @ @ @5,cǎKR@(@1cƔ P RTKmȐ!%޽{YbS+[L8eʔ|\JUW]7uԸk//bmN.+,R.E]B9Bz*#v#rҖNW61 lu %Ϥ䘅3V꘍MspƮn0y[cvvjyL815r-=r}G͓ @ @ @ @ @ @X- @ @ @ @ @ @@ ,* Ĝ*m۶-y-KElјV%Fnܸ1Rs=R, Z\vm烠z:thL0!r_KWOSO=5`k2rAt?وK[n4}LcO.Ժ@`rۛ7o.9.}ve9K>W^ݕCcSp,̂Ǎ׺J_KVj)D`,7)1 璂S0baXcvl?Iu)^R0go: ޽*RPfWwl|Zg-::_#U M @ @ @ @ @ @` ,8%@ @ @ @ @ @@ uaRgߟŰa$ NY!C:e:*˱zxWbP>@ 8qbL:5M-NɥePYV=؊o'4]uUqusX_|`.S,~Zp]J ⤓"U<ÿ|rh ٳ'>1}kIAs, g֕9>ZuIwr-qKRr )Ȼ˜2J;7jԨH;  @ @ @ @ @ @m1C @ @ @ @ @)( N,4Ըa8)1 EY8bKS-1VÒRb RLmڵpf͚|߆ b޽2 SbS- Xփ5X*Pg̙3ST|c˿^;QSS 'D<|/'?)FO|"[fs3f~<优9sLiMCm۶~lۯw{3}^ύڸqZPǬ~ 䳴H;3,XX*ȱT:_m{W{wQ_ Ȇ⋨ @ @ @ @ @ @-A̖ @ @ @ @ @ б@ I!3C*Oc;(СCDYHbZX_RL/ͱnݺ6/B.Hx饗^7Ʈ]VRPĉo~cԩPis(\ WV 7]tQfq%/_ZחS%P-E\zilPWWgώ緶yZ )wT+ S+:E\. ilaET(Hߧw œ:uֲ1|QqeĈ^{aj+Pt  @ @ @ @ @ @8.I @ @ @ @ @P`޽%~)&璂\pRji|VO_~ֶr|5kZS0O %?>8cƌHmʔ)Z WO!Y0lIAY\rI>3ʽ첈.>mCկ"rU)bEG.pzs;SܬYvZ~k!f}7+Q_ 'U显U/P{) o, nlXWj;^eذaA ;O @ @ @ @ @ @P@cP @ @ @ @ @ @*H:)L% z׮]_7><Bx,X00VX:thoL*ϱaÆ| /O?t3 @ @ @ @ @ @T jzB @ @ @ @ @T@ &nuSh_ӟ8)d$ P, I$YXNuI9rbWTz>֭_|13?]|=٤P^RhbpW_7fE24iҤ8#sLL>=- s!Ë#n/̛syW*{w{z,5|$;K˗C.])'41x≭)OaÆ=D }G41.ߝi3fL>: f,\w-/ާ; j, t,ߟrR{ Ic:vȑ.N @ @ @ @ @ =Ass @ @ @ @ @ П;wl S, JBa /SMA/Y0Labv//2dH̳/rxC<ӑB_zx!)Th޽vД&OӦM,Κ5+R)S!&L4B` r٣q%SG0:!oO":%1uխ% gL)1e˖uy>{̙&N z DMMM~/϶ vvG).~~BǏu:.l[^ KaY:[~u:y@o(^,^~fi]j;kllpq @ @ @ @ @ @@ ba* @ @ @ @ @ @H![lɇ0-lܸ1_B[u X%A-i? fɶll:N`KϞR |'ȇ,Z*V^֭ˇz-g5||I Q:uj̜93;8a)t1=w Zy… )-=\\ӧW%Wx"/.}x䑈KwBySc gSO=46,Ν&1}.- =HAwl]Ԙ ש? (~d#FD (ؕzowFG S*Txcq^ݑw  @ @ @ @ @ P @ @ @ @ @j>D1 O)Uj)ܢ?raQۯS0žyB0W^y%VX˗/+WK/k׮Hzc2dHL3f̈>:Ĝ9sǏK9X%gJOon c<z[#. rϜ&rѥ{}~;B1`8sI лp['IPe˖־[v[w5f̘|x& i,NRK[Oγ|cz\Zg-Vd{qtk..K5)P4 Zu- @ @ @ @ @ @bC  @ @ @ @ @ @ АBD0lTbVK!#)!Cd")@/ CگSH0ž~:ǎ)dq͚5bŊx6lj[K YLA2&LSƑGf͊9sCSRF<\7G.U=㎈kػY&OȽj ZtipUVu:;v,ɒR,ٲdK,i$m !6!Ðt 3f:1LJII4MRzMa ?-CC2M@.c˒-Ƕ,,VJ}ٟo=^ߙ}~v|7)1oUVmXcm,X>Gijj*}jzL|=>I Un _ {;o6UHcΚZ @ @ @ @ @ 0*1ʏI @ @ @ @ @ @8|mzꠟĉ A! Mv"\\#h1ۗ=vCo喴dɒbŊztwY0n"IHc?Ҝ91@_*YPMkzkJW)~{eOm۶5whOe…iݺuE@c3pI)| k,/]t]NZ|ϋs}Nj&L.g'G p̵7eڽp9ؚL4Ax5[4J @ @ @ @ @ #Ar @ @ @ @ @ 0L" 6'b˗ njA9X hmmc :u*Ebm={F7.͚5T\xqxmo95 p*8'~"|>M(w2-)OJo׬I+_Ii 9G*Xh<~x .]Z fܰaCZvmkY BA1^[cț6GpӦM`>/F<\L̋m\Ԕ⺌4Z9^O @ @ @ @ @ @@'A8 @ @ @ @ @ @իWI,'Ay4~0*F]^Dpm0F DȀ2"6`֘9`|&~&0aBO0 @ @ @ @ @/ 9 @ @ @ @ @ 0._"|E ERt5Ewtt *ĉ)`ڠ8 x\LXW,u<%.\-[VX/^,Y"d1jW\J)u`AJ?tWNMw̘>ɔ>*[Ľ'|hgy&ukLsO̘wBr`c m,/y]oȵAyznSZIB#18ֶ|ZZZk;9CcZxyZ {6t]?.;#@ @ @ @ @ @' q}& @ @ @ @ @zkGgYm<,bǎ+B#h1޽{;.=zt?Z@qriӦ 1-C@6oNO~JOڽA%;:ɟwwh!O?|ںukQ#1{ 0u֥ 65͛7/CL {ژ|aY;8{<ʔ)yX="X42wyO=ո?x @ @ @ @ @ @a. q @ @ @ @ @^ٳB?^)F`1cƤ~E͡ 9!p?y:$&.]J2h1/^xqΦ)z뭝as}0Gk4ϥ1GN?)*./kp!|&Ν~ʯ&qSOU#q׮]=y-TC#1+fkɓ'!7Ϝ93ƍ+5= >:Pܖhǵ]8qbXgzy˛2L @ @ @ @ @n %o @ @ @ @ @*<kCsbLzA`sz Z^[7hѣҥKӒ%KpBnf)=HJSO;{^8p@`'|2>}ۍV1׬YS go}rjf 0+rpcg91g{JnT gg1?>of*1_p<o?; @ @ @ @ @ @p8>1K @ @ @ @ @D\t]b++9s?:'N|KbWAP)Sj"Е@nݿ{;-8K/Ulْ}#ho- @`\rUPc9<ܹs.0~ns]pm( uShc\yh qljjJӧO2^xcR>] @ @ @ @ @ 0r1ҙ @ @ @ @ @ 0CrhbX7-:G0(Eb)zM7U̙SG0a`mbQܷo_*d18p ]z ulٲ.͛wݎÎ [SRH*9,=GGRS00θM{>1cRaNeh}Q1nݺa]yÆ zI&uy PG ~dz91i!Ґ3x~VI]+my?rWAyZW/^x]NzP۸pm+|WһÌeʔj`bWXG -wspyxΜ9iʔ)r6JQư{-ٳMV0DJbٳgSFXPoKFӊ+zK!@~S`ƾqRz;RzSz{2ŮQV)}Ko}+NߟүJJ?c DSO=U cR{ҪJrg9qʕ)cƌ)rpb <EzTJl'-E 郣E  POSgSx#/B+y ۗWWҷ*0}Q%G^_LGѣGиm۶w_~}5qÆ r Ο?pwё76`ֆ5Ǽxv@sHcnsXcWɓ'S<ϱ:k;_=qGB @ @ @ @ @!& q}  @ @ @ @ @@tR R Ze){V3gN!VΪ#@N!0"#hq_%ʕ+}>ʼn'B\pa{t~ n$@XSؗBCC nپRWS%x4WC)=yhX;{,G}>#g6/ [… ʅe˖j{Ju}ݝ-[* @DݩS:Fp]y8`x1}N!vTW4FvΡ=qG+}Vovoڙ3gxΨ @ @ @ @ @ @{ e1 @ @ @ @ @jSй W:eʔGpbc`Ł#T1wUmcx޽ʕ+}>iӦŋW.]bZlɓ饗^*#pȑ#~k%)N5?۱ xcRRS~<ޚoֵkS1cn[8{6gMi۶7kWʕ)})}C)B`̸rQ 2k֬t}U7lPYuY @_ΝؕC>|՛"1Bwa9{'NTIxyiҤtСK;wLO.Smհŕ_pطB#K OSҗRhXJWt])ygJ+VJo7l7lC)bMiǎoOiϞTޘê(?7U[!?'x1^p7n,d=0  @`P.]xg6=ޘC.1Gxc~UV c!m5ƻñ|wxwW;|ǻmy8]m4 @ @ @ @ @ 9b @ @ @ @ @}hkk2H'N4#{ƌpO,E o DG*IVa1-DbW\ZIbvmEbDb -:k-MXF@2~oOƟ`6dV~Y#qT'm>3gR:r$RڻA/*}bGκu)Q#R!0Tl۶!]u =s?Bpԕkj`4sj]O1_x`}#w5ޛ6BK;s(chmoN0a06  @ @ @ @ @ Ɓ @ @ @ @ @/p…jѣG#T<\nQwKKK5L1-rbnIq?=F_.j9t1xt!˖-{KO:uSb]mctX+W|Kb* @@%c8})}oԃ-魭)UPJLNR%-MfJ&Mjn~̵=+WRܖW)EFɓo2/+ץTnӏHJzWJ|gJ] Aؽ{w`gy&]|-Zdk֬I]V!@QrY jjτn͕xϠʵi9nM&У@\qmG(wm,s۟";xmv5-W @ @ @ @ @.  @ @ @ @ @JrK9@1wx^lDCpxt*,d$ۗ^z)Eb_;Ə%d1/N4-bΝo ]<؇ԫ UV;,`Ο?--R3F(c3FP]L 0Yv915(nNCmmciB'N|hm?ùk>KY"4`zm/yJo[ @ @ @ @ @CP@P @ @ @ @ @ 8]Is>|<7:mTp#@1rb9\1:(u!P_ :~WӋ/"l1\B_رc… A˗/GKGtdsU¦W-mԩSCBCZ]޽)]׳pe?ەUیҭJ8s#bś5W26$9ʘnݚΜ9yƍiӦMO֭K&Lv3  @ԩSE(c2yj(c91<>mڴ8 q=h\ԘkX5)ƸܖcZ\h @ @ @ @ @FчP  @ @ @ @ @!pʕt"P^b_гF9:іpڭ 6l1wڕgGo˘JBr4K}:-F/ܫ#1zt]wUmSQ_iϞOf*o8uJ>MM)Uӌ)͜ҬY y.XFb뀰> [@c"fΝ`h| z`5kuQ$* @ Wn_ ḿ }OgsٳgwޘGݬʗvPEիŵ{jϞ=Px=%6[ژ#@ @ @ @ @ A@  @ @ @ @ @8w\%PpQ#H1CNTRV:::rΫ$DC9pqҤI ٧ 00/1~ԩ>m<-Feĉ{˗/]|gO?ocYPIm \|ު@IDATZZZz  @ΜOImm3~>>Z H):vlAF[qm%=M"\i08}tڲeKQOFrk7%lڴx , p=RWyZzF^IiPƨzý}c'Ͼ k"p1ם;w+W8UVxw3gq]  @ؽ{wZti>OOӝ!@`t wnyj{ƍ֮][ fӭ::5&ĉڐr`cy8BsXlWax 6Xiin;|\=6h[[[jZ @ @ @ @ @= bI| @ @ @ @ @ \z5):t(u5&7G)v5GHBtRz嗋] /(}zرi…Հ˗WczٳC۫>aaMMMZB @@򕯤=6~6=#!@@8sLz'[lINʳlϟ6mT g{t)e">ΝXijyKKK8gΜNM֯=> Oxray<<Ӌ{.׋vwܑ֬YөΜ9u-@ ooO~6>}C4 ttt7o.;LLW"0)xj@c A.]*B9R n,Ghcodhرcٳˡ}a  @ @ @ @ @8"?V'E @ @ @ @@t>|8EbiF 0Ҝ9s WScG ~v8p,ٹsg茼%~~,Y$mo+j-Dql9p1g}6?N:5}ݝWZZ[[{\ @/|կAiF y'`hܲeK:sLXhQʸiӦ]zu;  0:iS;VE5^|Xq?2k֬NmHcytl:;97|s;vg ={"^(s{ܹ^)Swܑ-[ZZZzz ^x1m߾]|駋vǎ):,X ]SŋӘ1czZ| @ s=)~2i7nGf$x!/ڗ^zss4iRsiƌ]-j @8}tXjxD]]O1Cc85ֶ(џޅ ڀmߌy~z^FB @ @ @ @ p1 @ @ @ @ @$믧2F(@KE9H1w.Y,F`S:~6y֖NΜ9Sċ//_>N 09Nfpm۶WH|?ڴiSXsz` @= ={npr nWqgu]Ǵyީ(|"14F@cmL{HEHz~?UIFB @ @ @ @ 0hֆ  @ @ @ @ @ mk9x1ZƍW XFmہJ[ȁ?|ڵAѹv\2Eb<sgL @ @ @ @ k׮}C>uԀ9: Xknj3_ _|jb]KbKKKZ|y5l1.ƴ7իFbdSPmsssZjUŻ[I?!$@CK_rz{[ԭޚrŋSkk:XGCD7oN=X>S݆wիW|g|҂ F&@n@|914v՞?ϨkCsc馛&Lc)믧eCUspcnuF`c-ilj>}tA 3g͛c=V.eرweܴiSvɒ%7 @ɓ']6iў8q"uttVfsPcns`cyn*g?gϞ6ƻg^ti'ᠵkw  @ @ @ @ @` b"@ @ @ @ @,ޞ>"X^N,cW;2ϛ7/7n . ӈ۷;v5Cޔ"l;LxYEPO<98:ްaC_>͚57m @@zjz[ϟ?P9sfUPcm)Sj8x1 5yǽu  @ @ @ @ @ b  @ @ @ @ @! a]Gbmӎ92&O^t*;mU!@@+ \ܳgOdƎ.])l1/_{ZO>nZ.n޼9EQt]8qb{a  @/RZbE{)wo|ݬ 0,Yc=VhxV?>_>E(>X4Θ1 @F Θk?W&LP6`Yfxg|?|p=5v4H4rH… [[[G>3$@ @ @ @ @ -n @ @ @ @ @@"|,,,,3&tME'!c8wIv&@@?sȡѾ ŋZZzu;#EG׻\v-ܹ]|'6;::JSSSZjU  @Q~'~//|3OOwvc;uj8c|;uTcgi+W3F@%K.o @|_/kC?wܛ+7`({rXc9sq5`61޿ ݻί>>3ƻ<mؓ @ @ @ @ @@  @ @ @ @ @uCTW>"eرiܹ],Ա%ޞ~kL2[뮻R8cƌެ>(˜9s[|?^yĴJtqj]~}ʕ+uW4iR`x wS]  @ Dc1ƽ[ƘE_jʔ)r@cWÓ'O˦-; "1s8C~M3[[oږo~oߊ @ @ @ @ @8>2L @ @ @ @@t%Fbųgh#\lΜ9Eёb[n%577{V$@@:::ݻSR<3EϦM={vTzjrڛu؈zǪ዇v7nܘ4a„n1 p=~kǎ))v?O[u=> 0.\nݚr0͛ӧرc]wݕ|"1xާ @8+3v7<]ĉ@B܋xTF@FXc91G5#ԱeՀA]UuG @ @ @ @ !8  @ @ @ @ 0D^{jb[,g̜9Cm.w#@ D ?_.C{qSSSZbEʁw}wCDC5mۖ^S<6mTѩBjiҤI;,G8OSP;dC!/*=\{Y`2?#Q!@z~رcU{Ɇ@Ն3Ƙ^Pa<|pʘkہٳm)<>gΜ4f̘rvJ @ @ @ @I@c,L @ @ @ @F@M8p EgXƴ/l3H='NH-pԩN /+Wx(3f(BˡVJǏq#Gң>Z۷oOQL:5mܸÓ'O @!# q|H{OOg#<2dՁ @`8 {3#T^6mZ33_~}ww @){ mwwĉwе94if%!or[>sL/9D8cWu۷" @ @ @ @ 0A ! @ @ @ @ 0N>]+,ÇC˱cǦy!k9pqCHá @o9O?zjݽ{w6Y&]hc8 +v׮]ŋ<@;SNP @M?8u?~G>R~ux%@P8{lz'[lIΝ{---)s0M̙3.o @hoo215FXczvZNrɩXayZkkkkCG f"4FV"cСC)x?v-%]E#Q!@ @ @ @ @]@ @ @ @ @ SN{SL+r`[CIհx1~q#tqƌ={#H;vH9tGM[DWN=PQ#"Bx @H__/N%Bx1/~1}  0^yQohze̘1iʕ]5BN @!<Ay81?BHӋ$i5O馛RSSSvk;(S1`hs͡gΜw9s*]5N4_۶ @ @ @ @ I@c'# @ @ @ @ @`\v8rϞ=)jtWu_t_nщB(?O|kxwߝak׮MVJ={΅oߞ|;E{ĉnݺjb8x2f̘"34F[}ݬ  @ @ @ @ @H8?UD @ @ @ @7V :ҋcW_}hc8ʕ+:ɓ'ToѢEՐyRtʧ @`4 Dm9p1#rM7Us%KzZmH̏5۷oxɺ6sE5kRSSS @TK.n!^qOO__Iۿ]wi"@ppBz'phܼysa8Xa=PQ7mڔ"Q!@ `Ʈjs QeƌEhc=@56> 4J}ۉ+wߌߎߒ:t_Ao…sPcC!@ @ @ @ @D@(& @ @ @ @4X :Q5:ˋAѡ^Jt9h1YY @`?~MC(gy&]>>}O[L۲eKڰaÍ:<%@> \z5e5oꕱcߑs0cBJiN 0x>epcsw_׮]Ȯ7.|)3FkmxcKKKu=7Fʕ+ߗ`7'w(1NGGGn„ )#1ri'N6@ @ @ @ @ !8, @ @ @ @)btlWZ̝E֯#>}zscBo?>}?{*g .i!7?}#t1/FgJ>Eb/u]aNj??N I'ϧ+=E@רFrv*B}_-[1 @^رcuscQe̙]4ֆ8N6Q> \t)ݻ-KwޝN8-xuF8ҥK_!@ @ @ @ @H@0* @ @ @ @4P :+-F'uhO:կM:Z\xqhcN j%F+W;.ܹ3]v۳Nb#hqݺu6mcyҷ"|1_y啺y睂jAxSń|gQ^|Ŵ|b? 02=Z2`xpպ'7wNWNcǎ @sxȑps/;a„j`c5igv,{̙4߾Dikk^&NX4pk{7n\i @ @ @ @ 0צ  @ @ @ @ @ tttFsdUYiJL_Kt2C#X\c3I @`T DOmذhZ.\o~E;ns衇Jk֬љp7 pCwo|1DPAm}H_җi{Mz =F;'@θunIL6-mڴ%Z[[ m @];V ig 9U(o~Kh;MebYepaⳎ/ùƼLSSS,B#1jy8B @ @ @ @ p1^gp#@ @ @ @ @ D]u;kkkޢÿ\`S@&۶m+sbt]7n\뮻r|>EOfۋ6G`)S9 @ @ @ @ @b썒e @ @ @ @ @ DPW[L;rH,/^\\.\pX| JhիW?r-[ /]Vw/cƌ):f͚4~ (oJǏУٵkצ]"aĉ].k" @@^즛n*V{.w}kɓ'k @g۷o/Bs8cwϢ?p3g 'A @ \|ڀ<1| Qf͚]7ƴN^FGGG:x`]v:Ntjc<`>sZ @ @ @ @! @ @ @ @i߾}EmA1~ܹ>ք X(تϤV @@]};ߩ/FehѢw3(g̘QoQ  @ o}M}O犭=YgG9{  @@Y Gr(c1^3&Ze`Ƈz @F@;ve!=tPuz7Fc#Jg@m̵<[[[Q'NTCs8cn 7wܴ|"13ҥKSB @ @ @ @ Y @ @ @ @ /U+={cky8:bNڢk+ёvY.Fb/)+ƍKw}wh&_/}{߫iԩS_e˖$B?#?H??[ =ZiGikkKǏ/C DL<H<@fϳ @J?$ %E@A>Vwǎݱ˂ * *BGH ?Ϟn !ڜsgs>rgY@_@!Ń3'UQBCCFkϛ ddd={XS         Pbo'        T55 ϒ}67+dRQ@.@aah`Cy2:h.{-eS[7fffJ\\&QC*S4|166V:wm  X@?~СڵvF}7m[gV@0_3._\֬Y#z/Y hPơC{0^^^κӎ  HMM5謞̨q@@W@CO:%V0M@cezƞҴiSʨ!ذaCWDPFjP>;u7h6ܩS'ܹXK}nq         pbh         TN⦓daŗrEfLKkIEIg@t+V؂D'tVt.gϞw-Q~g^NT:n8ꪫdԨQ8T@=Oe3K.ұcGqu!        T^ 2         p4@CE+tqϞ=Q :@!p)7U'!|vdȐ!fB~]miߺɓ2o<%..Nrss.Q'ӧ ^E Ѐ I&w}gd޽%>X`.2j0^1l0۽`ـ  5C 556Za",:a s5j@بKۻRǩM;[fi8Ԙ$z/1??ߥKb;|ΝM03j"%A:!         d        \$$СCzYR'R+O@E+`Rיl_tQ-33RW#7nl4ZV[@@@Sw˓={pF fuGgggtV@̨#|}ӥ1         P F,4"        Q@'ɸtRdk+''#D\mڴ1rEEENХ.CG@)l ]ŲoB^L.FGG׻ݢ"Y~-|YN:aS5|ǧf@@LgڵkKMc ^ Rd2j@cbbr4PEi(Iaaa҆  TٳP⡍VP>}W/;((HPF]:Wkʁl۷o!9/ e~WFA@@@@@@@@A$         PAL'ײI4`cǎ.L3}@j@jj ^e˖IRRӳ>}.|c? 'Npx]t޽{3iC%@@+n:0`K>Kc ^ Yb-1!!A ^| epF7vؗF@@;rq[`X|Uy涐Ɩ-[ڭוp"9x euύШwnݺ޻z@@@@@@@@17KB@@@@@@@@j}E+tQZ322\>i׮-p ]eF\ G@'Y\rh͛7Kaa (GGGE@kΜ9&|̙3vf2h 8qD7֮   F?S}뭷sk'/@sL0㯿*^`F% d   e o5 mt5dٱ|}}MXc-ZZ90^5q۶mhvr92""h3vIҎ        u;!        @deeN|d ]԰Ž{@(W&;v0Cyyyn:Yt \vӿ!, 6W]5# _ٳvĜG ^0aBh@@< oC4Tx! E --MV\iB5~|V(-mڴӾl@@@'bB3ZRTHpFبfզ޽h5߿_.x)^^^9ݻK=DZksh/         bk         HFF ZEj%"wwwiӦĥCCCC]N uC`xbYh,_\Ο?ܤ[n2rHS "֗LY`|2|IOOt7nL<,5@@Ç7!S~ )E'(߲e4h@s(@(^4QC5xӦMe3h36k֬>q   Pa29rĶmgϖcDzx84AAA;ְ} 11Q4q֭^R;h4vA<<<\ٝ>         @m S'        TNAeU \<| \ԥVmm@'p)Yd _Ǐ;Eh׮-xQaœ/rrrLYt(Ǐ7ዱ&,p   yfrңDŽMyzzJ^^^ͼF@^ dddȪUL(3nܸ̿ۈʨˈzE#  @4x0cu kZٰƀpF+UV&ϯrrg4 gܲeܹk֩5uUzi,!         P bo        (X?rH1bYD|^}ٱĉM1cۮ   88v옙8]i 0@֭[gڝ}ۉ@Ꙁh02ˆ  h߾ 6̄3j0"S@@@'hܹs:Thhh(o-:FU휛+\2jMHH0.9s悇;ڂ{eփ./@@@@@@@@@ @c x8@@@@@@@@ ڱc$&&СC.!O;w6Uu\&# P/… M0 GL6?zh@B@aa,_\4|qΜ9hHrҤIr >@@-ݯ ?./&XJ7hPN>NA@233e&Qׯ_/h0ѪM6u֕v@@@&QCU^SѢ5 g԰F+Z UUZጛ7o2wssmJ޽Ez̓f#        W;u#        P[t2ݻw˶mD}:R4pK.&KVe_W?1..΄/j_www38h `e\ڵkMٳĉv=ꫯ믿^FE   '|_M7d7BǛv ZC -e5Qj0cNNӝ:vh f6l;@@@bB>l֭7;vL*|hF+uҢEj --̈́3Z GA@@@@@@@@.AC#        tB+ \Ԫܱc^`lnԨ-dxbf\ڟN W`֭&xqj*+UCBB/+߻whV N.]䪫2W^y%7x  P) ozI.y~ɒ%Y6lX @@nfʸl2Yn]h G֪<"@@@(,,'Oh,ԨRTTTIӦMx8K}:Ago.nٲE.x]m۶5}z G@@@@@@@@@b"HA@@@@@@@@J5 _4  @4cբZ7l yyy0nݺILL fq҈  \J[PҨK9rDΟ?_S5 f,!َcٴi geBB]_~ڽ{wrv(@@@@@@@@@X=E@@@@@@@@ M{ [,^:$EEEL'dСtT+xM6R@(姟~ __E'HtTڵkgB5E'`@vv_0넋w7ˤI$((~Z@@BL Bӧ |r4ĉe޼yfөS$<+g5ɓfES7on j4h6Vdh}>]}֍7V gʲ[Gzi fԐ:         PQ+*~         Psd˖-%/85jVlVbTTx{{[]X" P.}ժU&xQwp Z cccE۶m ?33gEk7(-Z(  \4kSN?ᱮzo̶ v@.@zzX„2j8͛<<}l???}iD@@jn<+ӧ+|Y& f,򔜜,Eud޽:+nnnҹsgPFN:]hG@@@@@@@@T F         :IDIh/]p}E ^EI'R  PUGyx˳LܧsΘ1C-Z$'I&Ç3!bٜlE@[>CsUVɠAU5Q͛Gш N %%D0cbb///߿ f1bsN##  Y 334ZጥǏSg?gՕTٰa-Q5\d @@&PPP :xVVtAvOy=..49@N2j@cY3СCmkȷB@@jg0?.V0cC$''Bgh`F}Zץ~GӢr7mdW^-Z^YE2dvرlC@@@@@@@@'@c{O"@@@@@@@@8z \cǎӿzyyINlVbpp U!'˖-/:pO'LݻL8Ԯ]Vš֭>@,q 4I&n&gr<@@aIIIҥKsVg\g!ƨe2n8g]iG@Z""K.5U)j*111`F;Iю  UHN8a[+j@W&Qi ou\j fܾ}hhҸqc6Æ 3:;N;        ~k{         \ȑ#f"M6ٖw[{ҳgOիH't@@*eѢE&|q޼yj7 >/N0A7onׇiii_ƭ[u߿qruIPPv@@3gΔnɜ / O>Ӝ>}<#fٳeʔ)N@jK3|XrssM& i geݲeJ}aȐ!111yHgiG@@@@@@@@'@c{8c@@@@@@@@ ;vL6l` \EWBCV.hE@" deeɂ DP~'Ȱ;ɓ媫@>4-~ze֬Yru2›oYM&ݺu+  {L^}UsB?8+}?c;u@@RR-_WȨu&ig6    mX<ѣRPP`߅I&ϐh 43'Ί>[mB;>+sδhG@@@@@@@@VX+&N@@@@@@@@RO7E _'Ne2,,Lzm:NKA@R /"|̛7aN!*:|:̙3wޑ/w}\wuЀ  PF-K,1͚6m{_oO>]z!}ـ uO@A^ҥKM]b֕w#!!!&   ϗÇF i,^5ɓUMl e9r=         *k"       K ]]֭[_h7# Pmyyyh"={|fwl{6qD4i5Jpa{'|")))%v oYM&ݺu+  VƍӧI&{rWK}ggy# @hmk֬l#KmC :K#   @37!^5ͳ*͛7/Ճ         Pbao        PtbD3u2))I ˔  Z۷ުU2a# B@-[&_|wjw!!!&xî ,YD~m? pu]'~~~ H/@@jѣGe˖LcccE*VhGW_}lC@z&!g7l i~5j9R(ގ҆   PEO h԰}ɑ#GDUH5aCbbbK.Ҷm[77 >         P1V'!        P>Çڵk ]$33AW^f>}ev܇ \jM6W_}%f͒'N؝NFꫯ _Iʽ@zz|;Ν;Kc~ׯ_m@@@h< /yi۶mnݺ>SN?lD@-!˗/7K.-[HaaC???2d e`F pwwwؗF@@@ϗC3xܹr[M e:22g^-        TX_ޕ@@@@@@@@@\!Tu͚5)]v5AI7;wfH#Xn̙&q׮]v(&L뮻Nƌ#:Q:qo)hcҢE {dڴiҸqXG@@ $$$خgϞug+*iii*K@@@Æ +4U;H||-qǎ_~Tm #F؂۷oo    @ 3VXSSSEoѐݻw˺u$11Q?.v1IIIt-[F gu 4( @@@@@@@@@nE.؟]@@@@@@@@@N̳zj[n|'|e~/DLS&@jӧe֬Y&|Q.>>>2n8媫}Me2g)(((1XLL2qD)  ɓ'ܹsͥj(|ʼlh[Cʂ F@@,'NH\\,YĄ39riw 5j fԀf͚9@@@eٲpBg`7770̨!۷56lذ2ó/        Q_1ǷkF@@@@@@@rٴi ^EN*8AAA&tqU܇ D<TgE_/2l0馛DQ5jT|3(,,yk&+W,18r-?Y.x  @} /&Dznݺueug  P.ݻwۂ%%%;w3=U=   P3 L0ҥK%33=i\ҴiC;@@@@@@@@1ևwkD@@@@@@@zdzd.jcnn::qK}t6  Pl"W_nw=z07p4on; I_{ <<\?}Gs ^  ' ^"8p;WJXX9sF4ıgmW  ql޼̸rJr8h qؗF@@@ɑ+V`F gܱcq]vH^^H~+qYrWѣGGNk| % y;v,;J@@> hx>h>C:uKzoo͚5泵NbS@@HKK_U`۷;=`+Q)   ^@l`FgϟGZS۶mkN&x@={LXcyC֭[ۂ5Qu-[wwK         P9+        uA@'V_~ ^իWKzzKgmœg U2c Ov1p@xKPPv*.~y>@s 7ȣ>*ݺu  ;O?5/_߾}]?~[;:uJ]ڏN  %hC9=\-L(3jmҤӾl@@@BYf|jҳgO8eDGEF+Z: {t4h0h-CBBF;        5M ƚp>        _ ++Ll믿ŵkJvv7jȄ-jV]'  P >,uҴiSo7z_YfIq{졁2=DFFV@  @իl޼Y<<~ t-IIIҩS'?  @M +qҥr׭[78zh:t9@@@ؾ}2w\ٴiÃCnUVncǎ$;8vX:u?^<==KlEn*>|RTTd000P^y衇I&vV@@@^ //O6lh== :wTEGc@@-[G"o&/]W^yEqfRkw#  P7իWŋeɒ%qF),,txf5#FѣM8cv@@@z>lk!cƌ[oU&L uAA:tȄ2Zѣve 442ZR=<<ڕm        TF /        @ D7o,qqq\R233\۶m%&&aÆ RN؀ PG222L {'۶m+q:eڴi2vXqww/U#c`'xBN* 41   D`ƌrw}v5[n1|My\ޗ  @MHMMe˖ق4###M 3j@cXXӾl@@@Yf_m\9((H:(('޽[v)hUm\-Ҿ}{ԩjHcTT: @@@@@@@@p&@3@@@@@@@@jNdDJ6mdEIю P'o|gVr4i"wu}݄:173aI[Yf&Q}}}f   P_}]3qy︸8>;< //@@ pAŋogΜqxnnnҳgOPQFItt4,Jш  \|$9s|WJ 9;n}:ѣGM04ZU"NA{nΨA;w6]N        [ F        T'C׉A-Z$vz͛7#Fȑ#McVe A`˼yx^N}}ɓۻ>p\k˜9s$--===e2uT;v^/Ο?oиcٳg| M62j8U]        F zVs        @-˓UVE _삣K QQQ& [[7ߘF;Z-buV|U,"?%&q{E   TN@%33Sڵkg&v.ψܨ$ .,E@j0j.5!!A4Q #F3jmݺn!  \$,O?%K}kժs=r]wIƍ/Y>޿?ph(Uwiϝ;@ҥKX|٤IǠ#        @ ν\        P:$ ,0/]T^DGG&ѣ;K# Mٳ{Ǐ-Z/ӦMxQ:o!/4N]x ӟ$U{PFC@@ $&&J׮]u]'f* P-[{v@@ӧ%..zh0무o^ƌc% YW@@@X2c x볶SL1Ϩ 0Ķĉ&1))IjP.]>E}G^~BE@@@@@@@@1VT@@@@@@@@*/#&xq…sNIGm* 4pؗF@ꫀ.؅OLY_ v<.><T-A@@Oz5/iFtP!   +ȸdYt={!8p-O>/   U'PXXhϟ/x۷DDD\32  \@z-A#G,Ȱadf / uٸq epիWK^^6ƌc~mݺ~4"  TCD?INN.1pVj@IDATVSJ```mŹsL@h-=lRvjB5Q;u$>>>.AG@@@@@@@@#@cy+8@@@@@@@@ ʺul TC  w/  i&yeܹoҠAG6mX,/Nꦁ-*qI&?* @@z!Cʕ+gΜr|f?/S@@xsTڵ:t0#N@@@rKx ٸqc43ϻV_%11ɓ.]>ܾ}{ح[7222g]        pbd@@@@@@@YYYxbdj4i"W\q7NF%5r؏F@ g^ӿ:Aڃ>(uaWC_ޓ|Yj/lBm   Ep  ߿SOw $66B  P>l e^^^2jӧ;K#   @VX!ӧOySJ dԩcI-::<#k5D@@jꫯo6G?a>WЋ-cǚ]?_a@@@FF,[̸{n'=EDnj#Ç :@@@ )aaaRPP {[Fky)** >?d2CvU9j         E 20        PGv%~ _ܴië԰E ^0a5@"J4" PN?SF//xqN8!?̚5v777[^[;+   P>}tsЅ {zcǎfnIA@@r:tH/^l$%%z/|&Q{-҈   @jjKZZmǀy'̳2XKFF$&&ʖ-[LH.mV˙~wm߾ eٳhՀpgЎ        P>Eo@@@@@@@@~ ܹSfϞm"\sL8Q'LDA@ ﹮eyyu޵^ϽlY6i F @@xyY0|p<#GHSAF @` ̜93+8jԨxg믿.0U.+̸xN @yӧ:th+i\rIT^=oҽGӦM_=7;79j*nvmg @ @ @ @@P|߲%@ @ @ @T -'OǍ+VXT|]vq衇Fnb 7\i @Hѷoߘ5kVnjժE>}⬳Ί5jm@ZNw~fmwy&@ @{qGg\q5ֻ֪w[!&Mm۶]K Pɓ駟/r,_7n{gVSNw/PI' @ ;vlV|qԩ4hG>l~toR*ʘZ={'/Θ 4i&6t_= @ @ @ @2*c}cE @ @ @E%Kİab1bĈr|*4tg6l: @?.>ӳGYc5gϞqGz=_0`@nƪUřg*U @ @kn! gw}k4H*xGxN&@(z*gŒ?W"}ϻ; 3n:>@3 @ @ {w\rI,\0I=S>'yVW_gL:_19 @ @ @ @@@!r&K @ @ @ x{z(\[lӟ#M743 PHf͊}+VȍƵ^mYF 'pB|駹ISoA @@СCL81 ,]*9lذHh]pҫ4  @]`ʔ)ǏŋCݺusYa=3իWq:  @ @ ⣏>^zE&5j(xh߾}~B;wnŒ+dV~h۶mls*Xz_;~ @ @ @ @@iPc%@ @ @ @^9s㮻~'7h +/l'u @.tҸ⢋. r-믏TO+~G>};M^VkG> @Le˖E5bѢE馛ƻᄏʁ;ѴilC=4 c @` ϊ=\0 &///f\QTr @Y ݏ|gF&J*E~⬳Ίtm_|d|#g*Tf͚eE۵kѢEX/g' @ @ @ @ (X  @ @ @ @cԨQqwСC_iUƁsLn @4iR|;7A:uK.={Z*R?|Yh̙tl @ PrL[oua=*;VV-/^͛7S @(9;#GfG+^{u]s4iC&@ @@裏 #~q}E<'|+ʘ_/F}۴ieLwa[/c' @ @ @ @ (X @ @ @ @VI`qǝwiy睳CݺuxF_} X"(?իW\veQV?+ T_pqWG*^Z5믏?gϳ @'0`* [lRJp¨\rk @%tҘ4iR0kǑn馱{g]v%VC&@ @@XlY\|q箥j6lXlFʢ$&W>}zK1y9֤Ih߾}V1=o喑y @ @ @ @%T@! @ @ @ ƌ7|s 2$b?lϊ/# Px,'tR؛F @@Hn:K{+__լ>hԨQ6L׮]'\!O P~(c*8~Xxq6l0WqwիxN @.uÇYc5B~5> Mkwyg)*WڵmԩSm6߁F @ @ @("ְ @ @ @ @BH W^yeL4i1VG}t~ѬYyAE#<7aΝ{ 6 gٳg,\0f͚q!R @B߿? I :1o޼nم9 @ʘ@zرYaƑ#G_`Dbʊ3n @Yᅬ:* Qb잝;4%̙3'+Ș2>soF罠Vz({]oF @ @ @ Gbr#@ @ @ @@Z*MTiSO=5N8ᄨ]J @O>}7^yl *\^xamm,]47xc.VZcM7 @ @t G, &D 5Ν;dz>9k֬_~o0 @+;2}]ɦϘEϚ5kxN @6˗GϞ=;B˾W-޹sرcc1f̘1cϞ[D~QƝv)TA @ @ @  1$ @ @ @ @M`ɒ%1`ׯ_|G+۲ezhTXq}^ @+}s^ő {gb̙rH7.' 7kf @_`m7|3*UϏZP:s{6СCc}- F P>HGgbsmvb E? * @ P_}B bѽ{Ҝd|gcԨQ*UV-n]F:u :L @ @ @ @b% @ @ @ @% 0yqWDZ|mv>;:wn @jx뭷"ge4j(-ZXM6 ,UJD @@XhQԨQ#-[y =G}4u떍{_\s @ {YATqر>_(>+Pf͂G @/b+V|09 G`Ŋk宅'MFhҤɏ @ @ @ PB#@ @ @ @cqEG}Ҵ\mJ^ @O?Ot),m&biAdm |xa@ @-xxz꩘6mZ *U;F\-Z(8 @(zj_K88+"g 3^̙Sl͛7 v $I @ @ @ 1K @ @ @ @.!CySNͅ-,rF˖-s6 @/FbY0nm5*Yg\9{{bŊL} 3zXE @ʶu]_$ѣG$\nݘ;wnv}%@ /~9rdVb̘1`]+=oF:ujժ  @4t_OϞ=oB\r 6,:w\BO1 ,_<&MCt_i }-Ȋ2v-jI @ @ @[[/q @ @ @ @` +qgĄ Va}.,z @V9scǎ1cƌ,>+Xf\9`ٲeѻw߿N裏^WR%g @'pǠAw]t#Fd&M=L @Hŋ?}MIqw9g}gyM @@H;{W]jժ(+}SA8qbB?nM6;,wow{M @ @ @?{.c @ @ @ @`u |q9#-&vi+}]  @$dɒu]ŝRX͚5^x!ԩS,_,\0=\Aׯ_۷|AȖ @@9dM>UbŊE"=s {lcP @&{óSS6l c*ʘ 4B @J@*w!c=Nj/7.)!}2eJu]7.ٳg4 @ zѫW,Z+BNnm G'{oviڵcȐ!h @Thf}ɒӧO\{ExZ f͚dɒl!iӦ\&@ GNe1bDV/p-2WCQRI @7o^{va|?K#K~iHgϞqglB9T3dL?'5ocq"@ Pd+V_=F=&O˗/|yyyѺu(cݦMH} @Z7ߌ;7|Mկ_8szZ1t;qĸcРA4XcH׻zw5o>g @ @ @ P6b,, @ @ @ @ _׸#-Z5+N:)*TP r-_5\7:ujt)̙ V[ų>뭷^aOe< @J@/bu͞:ÇgyN9唸馛zJ @(/2~(ȑ##.իW/+إKc=z @"O{:thXhQ <87nOhҤI|qq:: @ @ @ @R'c{L @ @ @H~;=sqwFÆ s}6 @/oD6mbҥQJxWb%?a뮻%veD[2"@ [tMCgHE-X j׮]#6k,uF @ ,_<&Oe1bDYѓUri"(]vTB#@ @@a /;l5jd+;y̘1# sO̞={\s^zEvV @ @ @ Pb,Uo`  @ @ @ @)pw)-[{k={xE@Zxm۶Yt%\\pϟ`O ;;g}ͱǨQf͚E6  @(>`qYyֱcǘ0aB6'| 4(P#@ ;>Ӭ(agTִi\Q9y5(0} @vXJ @ @ @ @JW_}rH3&Y޽TAo&6lϳǍ;cIDkNiѫk3WڵH @ @ k.R1ƼH֪UΛ8qbt!;CAL @4 1lذ>/]'TP!R.]D׮]cm1: @ k3gΌVZżyCo84 n.禛nW^ye\s޽{q[  @ @ @ @ VĽ'"@ @ @ @J~{G̘1# 5-pǑGYC w^/;Gy(.\Knq7<Ə뭷^QLgL @J%KFxhڴiL6آ_lYv]_1TRo" @%E믿#GfE_~Y`hna(nkV$@ @ p@֝ў4ib?FP&L?{g}v?M @ @ @K{! @ @ @ @4[YYfenOo_# 3s΍ƍG*XrHo?sHX~1bĈl FZ*=k @x饗m۶1w}wqfs7.vqbd @J@^?D6lX >|xK|QJԩSV1glذOA @@{裏ΒW^L:5ԩSd["=nW^ye3fxYgzjժ  @ @ @ @Xb,f @ @ @ @V -ݾ}l᎔Ķn-PFR  @_`ѨQϳ"Fm`HR֭[W_}sye]Vs @'0wܨ[nxǎc%n)N;l/8.I  @f/"FCTbӲeˬ(~ݫWq:  @(p@ 2$KCAeW^yׯ_<bŊ\뮻nyqꩧ b @ @ @Bšl @ @ @ @t ,[,v#Gh֬Y QNҙ  @ 0 ?B]?)ҎTCꫯf㏇ @JójS_kY-y̚5+6l-ۼy:ujä @ʊ@`رOưa⣏>*0 6 &HEwmXk \T|1-c)SO~$p7z<ܶ83rE7l8p"En @R`ҤI۵k. DǎizS! @@RJ^+fΜoF\r%ѦM~3Oo}7o#dLSF @@W^޽{_|Q]j":ujyQb,yylI\{ߖ\H @ @ @J@ފҞ  @ @ @ @-裏Fnݲa+WSB]vYk @M>aÆСCE ///o<@czl' @ @lvag{1`,ʄƲer9mqI'I @ @ @ @Bc @ @ @(NP7|իWiOK @R|jv[я%@IDATfϞ[ou|wqGѣf2$ @eA`QVHצls̉g6j(>H_4 @No͊1>Yq[CAaÆkTR @ P ͚5ye?;L\f̘=P߸[^袋"Xb~g @ @ @ @`b\uC# @ @ @ @eI`ɒ%Ѯ]x׳<ȸ{Rr!@'xW^jժŧ~իWgS {g5*[n1xb @V7|3f,C9$~՞J.]bĈYcƌTE#@ @xVXjǏg_{c= 3u!^ @ PnիWu-7ވJ*,[N^|"]-"p@~g @ @ @ @`WXM @ @ @([~n͛mV  ><+˜^B0wܑ+¸Fgb @ Pj^|\;Cn{un{챹ܶ  @^ ///n^?8n{」J*,Xq믿~t!ꪘ>}z @.N:)~,T/] BƖ-[Fn?:K @ @ @ @_-: @ @ @ PN?we3fLFʭ>GqDi PnA!<:l ԩSf͚0) @(_~eY i &tuMB[mU%&6 @ S{/C ^x!-[V{GѵkOA @j믣I&~GH{ѪU V˗ǽ^xa|G5_QZ\  @ @ @ @Wv @ @ @ @ʁ/7tSiZ;PR$@+O?s6F`^0cx&@ @&Mۿ;KF-cǎY(SLǗ@ @lqgs=ys=qA[,Z(Hw\ԫW/vikcƌ?3n @V@Z .Ȧ^bEVnuaNDB q1;3]s֮];&]^|űfŝw`F @ @ @Bn @ @ @ @ ,[,z[.FMŋSO=%WN\ьm/?8 fnݺDA @@xs1B)r~KE5 @J@裏G}4ΝÆ O<1_\E*~Ygo͛7s9'RTE#@ @` ;wѣcĈ7 UT>}ĻgqF~ip ѪUxg~'@ @ @ @O 7xû2&@ @ @ @?o1?gZn/rTP PFF`j{l 0fZ2b-T3-[o&lR2 @%^`v1cdqΚ5+ׯ_bc7[Ŋr7n\b  @] -1y2dHx <9lw}ctݲkxN @VGC9$E;hg5:H>xV`k64iR @ @ @ @@&0X!F  @ @ @ @@3gNl7_mۖ[ @ p 7ܐ,:Cګ-nݺţ>%  @(]˖-Zjł b63g8s5?gAAs1OK P[I+*])@1cF(ĉc?ɳZj{fEtu1: @(:gGuTMfd /D^VrHCQF\  @ @ @ @ bG@ @ @ @_޽{-ܒ#!s PN5kӧOJ*ŗ_~iQ"|'L;vf]v{5 @7x#ZjzaC=[N+cꫬP… jժYu]#r!#SCNO>$4h;r8%I`ܹ1lذ0QbѢE? bŊo#xѸq @7n\٠oy[>kJ+>;f͚K^zѯ_8cB ~ @ @ @ @ (X| @ @ @ @r-0mڴjbҥQzxwc+&'@e]?78KsvZKǏbkO>5 @ Pn8SƟ@޹;XJl? 쇅ԕ*Un @* FQq1N |fE|ɘ3gNl2+Ș2{T4 @FSN1vl/w^4@1 ,\05\}]nm6g:t @ @ @ @T@!rK @ @ @{?9\~q{ @ ?z왥}G]t&I/Sʕ+F'@ @L Ex,W^y%҂%͞=;6dXxqԬY3>]vI 7 1*cA MFi %Z`1iҤ(!CbƛRA8 ڷo*T(8 @~>vef͚ԩS}(3gΌ1x<ꨣ⪫_~/ @ @ @ @@9rnK @ @ @^z\ 704$%UQFs=-[̅yFӦM믏Km @ @ @ @$cyzJ @ @ @d^xaN"mZ6 @+!JFѺul _`ذagoqa$F$@ @L ̚5+fΜ嘊TT{yE*U8oᆘ3gNY @@*q9ɓ?_k,]/~ѥK[n~Cs @ @ \tE.XbE eE }W[nuY'K+]K'+8vز< @ @ @ @oP7S9 @ @ @( 'N~:Ke7c=,% @WM}YvԎ;+V3^ziԴY^^^  @ &СCn$o4l0N>,ą %\R @ РAݻw<3Y{7:蠨VZno& ӟ{w?V@ @;v̎:uj~_#z2; @R`W_}5*T_}UԬYq矟ۥK6lXCt'|z)(SO=5v#@~ p饗lNA@XlY?>8̙3 tr-8 Zn]1:  @w˗GӦMsӽ鳴F $ }/"n-[nw1g @ @ @1 1wT: @ @ @ @ uQq}ex㍑ @!ШQ裏Zj_+\oolM6r&MbYє"ʐ @a FZbҥV[E(Mof͚eנ)'|2vZ"SšjԨ|MAP @$ L:57o [;'keExSI+dLTLbŊ @@y馛NR?;, r.??+ c9&[n~g @ @ @ PVW(+ȃ @ @ @ Kgώz(;du׍FYf `mV"zۯgy"9  @ɓ'gE9:t=cZk+sŞSqF @Euq饗Ɣ)SbƌYۯ̙3g뮱 'O=T,YL @eZ㎋Zje91gΜ2P b/rl]sO4m4nXbE @ @ @( Br @ @ @ @ޚ[W^Qj_;~ @⋹LBZ ̝;7  \N8c # @ P.&L˳4bL~qwƳ>~a\r%qW*M4!CMD .{H6(g:+{|g1txc̘17t5jԈ]{{c  @KjժI'W]uU,^8|9K I_֭[Goo?o޼q'ǀ[nVZ_  @ @ @ @@PL!@ @ @ @ XdI?URH h @@4iR.vm@Z7-\Z=,[xF"@ PB!|ͱV[eJ\sMVe+g*Uy: @UVai<(gdRALj#y9UV͊1tAYqƚ5k8N @eQW^_|yVo߾WSPB3uYg̎dh @.иqܹs{cƌ))ˏ ԭ[7xyq˖-ѬYx\; @ @ @ @@iP4Kb$@ @ @ @VI஻ʝ߻wܶ  @ ^{,M6$]wݲt1g8zYsH @oS;vG(Q7v,H8DJT$"HTAŀ$AP=EPD (9td$(s[u_쿞gvSuկ{z{zݰaU?*  /-[6i޼ q6mDO{2  ĚZiذaVwҭ@zd͚5{Iٍ޽{u֢m߾=p@@@@@@@ cto?j       ޽[48RJIY  K7n3gΘ&z뭱ԴitΓA@@XpH,b̔)5S,YLo؍$  P@A7n,C 1|y饗XbZ._,sΕ^-*v|c{2  Ă/ 4M0a>|8EH@̙W^M6IO.+W~[Ο?o'       @41uD@@@@@@@ |r|ǎS\ " @t ,_ܮx5<?~\2M{74S   K [LJ_~ ҡC%D@@@ D  XB^}U)S]yFYtCnFV qF{2  D{.\ |M6z#rŋĉͫXbsI^L@ƙ3g|       [btKr@@@@@@@@ "Fe!C3@@hV"%qٳgM>ޞ   .PLѠVZ%`ٳg_V^-uֵ'=Zʖ-+|\rO@@@@@@@H_F.A@@@@@@@43f֭[y2  >Ν;'YS $GajCdfm7piYVj@@@ ,X`ɫ=23~AefZ2d㏣UT@@]TRҽ{wYt޽[( 43M?_ԩSGzyeⰅ  D@۶m5ΓAO+ʼy䫯^KӉ'5୷*+V\!@@@@@@@"D@!       ^`„ и8yCJD@Xf\xԱF]hk]tTUV  $z2tP[k׮2qD{    E16̙#aÆI&M$K,v+|ԯ__ .,>/_!  @$ nZYrMb-C]"Q C ˖-[SNÚVZ%jՒ{N;UN       X S:n;MG@@@@@@@صklܸѴP_Pn-MC@_+VGѦYfҤIvY)   @ @YfXСl۶Myr労iFL" 4Hź͛e͚5)n ǻE=Zr%%K%JH9Mtcƌgk{SY~lذ!UԫWO4)2##F0O>-ʕʕ+7RR@f/VG?.[L~7k5nݺr{8rL6f*U  oԠ:~Oܹsː!CKe˖&S&3 ęy@@{zOe޼y믿MժUsŬ(ț7 6L:v(dݺu{壏>vEq :       @, r,mMڂ       vg H`vkc90fΞ=+f2k,\|a\;B@@XP^e˖-֚ўsNL̙͛3[oT?O?47nvN/\{plٲҽ{w [#{)h<1E:$3Ctk8^G4i=[c=dׯLz1cOZ A@#۷7'OɓMPƩS~gΗ/<&(w!3gj}̌  @ڶmk1jcƌ1ZbUvڲj*8pKN:%^#~2h )_|6v!      D@\ԓj"       A L2Ş{d@@ X46k֬RJ0tvǺz!C0U   @ ,\nZ:u|fjҴiSD dҸqcYdI6vB?OΞ= ]KD&8 , ڠA$N7b]~ W]uC/^l:?~| ޫ=z~uI_\bu=F7lPΜ9<ャe͚5f_lYq#ϟFH_r b?Ħe˖V:| q=HBcǎ/ȅ YxG@@ -Z3uN81feD@Lk׮yfϒ̙#UVW^yEN>m@@@@@@@ d Y!        ಀv k*\TT5R< Dcd֭Z7tdΜ9Ҫ1c]f͚y2   @JlݺuSRD-שhI&2w\9~ O?wQ *슀;q/^ܣ|?e˖GF;@:wN۴i?U@)ZhC޽{t̛7Ojժ%(f͚| ٳ믿ګ v TRŧM 2;_1Qy+SOIŊ˗СCE?o. 7|Z$ѻ'ܹs=>O}Z3~+͙3t n ;߽<9 &]?msxgq>|؞A@  :8ӧO7'M$ǎ3%@kޒZ^4H6lhW/H2ofIIx?z~`t hpϯʮQ"ELV@:}۶mf3߭Buq֤Dnzkp ɓPI}5  5kVK kP lR?p+W +^m6@D |w˰as>3f̐~Z衇ˤI$  JzJB zK6ol㬒.]jol HB@@@@@@@ b (!       @ _^ A@X`1!hЏUVJ(nHV@!   4MEϟ?]_c5ȲeYΝ^xAׯd;1>483M7TϜP˗*UZļ'Ng5~ ~gPmmǏnK gɓ'#G .j% ¨KgΜ_0TWTJYnޟS-"qqYnM6Yxw.[R% W$@"] SLr]wСCe޽q:wq7O=c?{Fz;  @ ~4͞=;+D Aŋ͵~I;>|)SF{=9b&!      Y@agu        ஀Q@@ ֭iՋڵK4PUFu[<  EҥK"d?ʕ+K.Hk7|SN>m'R0kpgJ*П3X-ZsTekALJ#t᫯:Q==nZ @$d̘eiӦOsY :h 9vXDѣ A;o喀k|!ƍͱ*PA?:w=+s9_2xG@ 4xƍ͵_%@IDAT<8ÇMtIOε;  @";7k,;OB/u?l۶MoդP[jeP"       @, d6@@@@@@@H;v]lY;̤ID_$@HZnݺҡCgryvأkShG> l޼.,T5XvpOB@NO>D4@ 81֫W/%Eenٰa[2p@Pd޽&?Oy7]v9sth-rN3g`B I…1ZAHm.gϞAҥ4oܻب.PKV}wr!M֭mwݥe˖ҹsgs̞!2 .+WkoԨIe43 _U:K?r䈹y{ګ*Ŋg:>TsZrebꫯL|uN\Ng" @N&MO?5ǎ+'N'NVr X/ C 4}@@Hwi/~ ȗ/ FlٲE4kjRժUSxT,z!~oJJ<ꮝ[w3ڶmk:4|?B:\ti}HׯP=&vթS'%o޼A)As%#GL2yk ?^Zywv̞= W\16}N=b@(Ț5~ 쭤* 64?]t=@$@@'1cF[i+n۶-!bXiӦn:2d,XF0@J*%nH&z@@@@@@@0 O+@@@@@@@@P 9rp¡*֣>t1@ұM禑@Ϛ5TE;OwvR :޽4C;|/P@ț|rqC D@@Νe!)Bүy׫WΓ L@WΙ3裏LpF "-'L`^sf͚;SX kZɛn)t?#g%׹>>b`;fӨQ#JE>lFF-\r+WX  @ ̙3fF'0w\{eV){44ؐ!CoO8ai5 ,VjU[ 0AF">W^!ly50|1z+}_|a۷όׯ ȨS Hn~ۏ# @p7CG"   [o-@@@@@@@@5pbt /Oz EqT6,Wzv& h˗[Yq.# jD&U#!D@9LE x)Z… ;w4SzM&zΫeF^  @jԨ!3f4ޖ,Y(R/PpaOk׮?` ݵk]^իmVq~͔       b-H@@@@@@@@8yϕ+' C`„ IV&MGӧO۝˗/kfU   k-/6lkKdʔI>`Ps Z֮]ʕ+v] bD3a bw^9pݸ@~2m4{뮻N5jd;3n`-ZT\}Dϝ;'CZjժ]a>||wrDk@B:\; 49G]At钬_f=*ک|StbܳgXeȐ!jZmw-[6X}YO>&q2e|Rxq:pxG(3gNyG&e5k9_Uzm^zl׀ıDf:@@_@ +W,zL#sQi/PlY?~XBz)3f0ڶmo^}]{m-ZJB@@@@@@@@        3驕,  ֭['юuFEGѶYΟ?oW9k֬v    9sEhS<9sf0 ˗ҎkB^ gmh@)Z;8_ެyS8Z]v1cFk=(;ĉ`o/cѣGi͑#Gz;1Ν;]w1ɓǻz>/_lZ5u͛E`Z)ݚ?w@>CT۷TsٲeCUoQre YZaìyϞ= 5kժ%wq˗c@s;סCdܸq2zhY`X50^}Ucelժ.\Q:  z=zzI}jԨaϛ7d\hY~ӦMҲeKL^3hǰ       bMG@@@@@@@@[ C ޣF@t"0j()Πt\z_JD@@ = 1m5\#76/^?kMl A.\ &M2QfhKr>(C:4XٲeSwZT4 O?$_L2E.]eʔN:n˂ &qqq= LVf͚^3g<@@@  ʥK" 6 fQE ] ^ڣZsx0eʔ({ٳҩS'qѣl9o Imգ=*+ʭ*;N׿%|Qѯz{z u3gδ'/^\5kf;3]G謷~FurJ;5.=u{1yw~0k<('O6k 2+}^EJvd42 (Q+zlݻ kŋ?KM֭[`ϟf@@ Bʗ//3g6#cn$}Ft2giԨ=ڵcvۿ=        @l 1/C@@@@@@@ ] ˗nwG2  sOy2ȕ+d̘zĉNi   nfϞm@6ph˝;p .cp!ٽ{5(UV8?/=vٳG>c.\xٸqc!-PlYիl޼Y|{RX1|ر\kRI_|ٞ   @dɒE4& $ eŊ:,C >};v_=       \00/        @Q@p[@;i6mYM%s{|(Odʔ,y>|m=fF@@@@@@h~SUr        @`Yfr޽bC`͢Ϧ4ig_xE=ZZTDB09r$0w̘1"\ss=pj2ׯ7FzRSˆN}]k澮gW??PjM?d̘߬u]'G?4Guo>mqʞ={Lgο/n5=.{ю׮]k!:r֭,j }UT_rɭes+\r~%Q e˖rѕ}k7,nkZwgRTX9gײ+W61 8F:Ga hfkԨ!7v̝8sNYti ӰaCk=Jqc ǏիW81*@_MT+k 2`KR Bxѻ}뭷(h*+}C/_,C 1}衇ҸHzNRNMQFɄ ĉgۼ]4&! b"5ժUK vH@ ow}S6lyQ 7oyp J2,ϔ68g¹yRݖn-s)MOۿn]j.װ#8q̟?_g~9֭+M6xW9,cʳy{ ub@@@@H@H        @qɼN&# om`7nb '[nBg ?ꋟ4i2yuh"E裏z5oz^3/־5w{ws_B 6ǣN:yT4 1,+>SLf ;̚ ?O>Ȟ7G~Mdϗc{Eq68%!+1QF hp/۷ojKBG5k֌/l[uw|ǎ'l#G(#CD+r<7QcB4­m꬞ zlo?sݻ7>{쉖MȃutB D:;mڴOy_ǹ\jz.p^G 'uWV-{EJ}G}6/FNiMC UHf[B]0!4 [ψY wVRTnB_6.!PriGB1z뭷RT:,;G8p >"}ΝOlmf7h ^36i$:X2K, f'٬eIDDŽzuѣGڧ~joorL O!N̴9 as8ϓ:ܒ%KW_kQ{\͚53lt+{-s=vCF!?r}f/D@uҢE zU{)S&{֭W_}UJ(aq-Çd@@P-[y2 z?g}Q75Y L.\ w)eʔ~n@(-gJ~)鹙@0zJ |_mMjqyR[u`yqՍ}C\?@آYzs5_q~'4D4@@@@ ]       m&6_pԯ_?ŠS/N8!ڹ3AvV|uEg̘њ~igE r!ٻw\|ٞ_3͓Zj_ $ cgϚNV ,h ^J6-L!pk_׊cwk_ɗ3f@ Er_ছnWd="g8Dg@ y\6i4{1Ýmͺt"Æ sȻ~eҤIՎ֪W.J2;v0mذAXgӠpuw\; Ǐ7 C9 fD׮]֌.8hLڦVpσg*@+S5krYUxe4ibXSO=%+V4/_.Cro߾] $o ޽;'FV47ܭyG f͚eǽXڰ%dق)Xp ==N,o޼޲[їSoٲt{SSog: Ev|7n,z~ܦMc~O.8._oUnJ9Oisdvq LJ$GriXM=fb ;M_ /`5~OO?n GbP w|Fi<(cǎ#G\Ϧ}矗[ڵk'͛7KB@pOp’3gN9u=gJF -}6H_.Ç/ҬY3lѽ+ L9oS|Iu[Ywyf~ ;`*2}GxLʜ9h[nv=cdŊSSm_LT MyQ]ƙvw<    +@ Fw})@@@@@@@, 8{l)kB(믉J\l hMh۶|`?֭@ZP0jN'G5yO<8K,~߽LXvGG}T>dbr$ kC7wuj_[… ONIuZ޽MX1zuڅ.ZΧ q{q68E;8;,SZgS֯_/?￷kGf>4m̸ANy[nqV#|h ޘ9[uwKq FR;>u<׻=v{jpNq.\(?oY^ck'8J*1cD4Q;4xyvEU*UJz%[nA@HQKزeK bIJnA}]Ѡ=3f̐:H\_Y [npBr=p>$2sI<3o3ޗg?3﫞~TV6R%qβ5xL*U=XB.4&s[G8wgu׵w}7kuvoLy4hܹ57-ZcZ0X :t\J;rcUWvYf&d˖MnhoG@"F k֬Z];tY?:R@2d חO?T''N֭[UW]eCۢTz뭢F8pN@@ 8w;vnaF"}.]=zy&svw)uܹ/ry{2$%|gJy4~pL(Dzkϫϓjnms)=/ɹ}=_J\f.]СCvW.;7Ҕ)Sdv 7G&7!    @:KJB@@@@@@@ЎNS 0~ŋeÆ vQJΜ92[nSNٳo^F3[lpx.\hE;OItQǾ=Y&f(R+D8wu?*,'NC=dH[Ӛ{CJ*5.^XEJ,qss+k?.۷oW[fM;uw\ۮ9S u0@.]d/믋vt yw{B56u]evvFÙ_hyydbKXiG<کr%:t,XcZ5:R;ϟߣ@pd̃@4 hŻv2U ~V4m7 #Z||= N=7o |4jH2fhϦƿ晉&Mȑ#t2   (QžI !W]unZ~'ٻw 2\92364kiӦ&7xgJϔO#ϔvu}ir>G3nە$    a cXY       KGUƍvgNxH.K*,&@W?T?rr] =x`YF ɓSZH8wu?*T@0}ݲrJ_x 2W_}^u%>>&_}}EAuRʼʕ+g}y:zǺS;V6viΑ#GL'rvԲeKk-]I8s=plS7ܽ?zݕ3gNk̶mTx0$ hb}@2n8ɒ%,3gΌQ@\{/˪UdҳgO)Q]oI&RHy饗D ! ͭLEۛo'?.}eҿiڴ3;c]|ٞLHNN3NLC)uyRm[ϒc>և?{ޕ"JPHGlrA@IDATE X*z]AX@.hR̝&I6d3|gv2IΜ6'wrsY^<~hGgzG0`,+91ܹӚWI@@@@@1zJ          "K,( ӣX!·4P$_w3L2>Ή]vY p˟H1I&Æ }ҙN<)GkF*1bDD8ŸXzky{.{{y'^LUVIݺu퀪s疯ZW:bvʢZVի^ښo5HCx=`i ¨Atmu]gMg"yTPAgnOuj׮mjgM^ksw(_;\}{+Oy{KS☆kXYdȐnbO6 $2:_u3O;+=| ȑ#>5#:u'6ĨЇ"|B);"K~;|SdLP߇I   *g2C=$gΜn jUTW^yEYdk+۷O4(W_- +  _KҥĶm`AȚ5nZ>#^ .~6V ܹsh"y^z&0cf_4a)1+ŬmL0sl`Ll@0G!2ЦѦZpW:t`#"vY;͛7K|ر\yf]&w.]*zݰRӦMM Gk:׽{,Nn Fg|2Nb]H'K#SViܸq1UI  D@^O?5A{ H )Nk;Z&N(3g֍7?h)OOɓ'>Q  @2eoǎG U@@4A;z̟?_͛'|󍹾XLǏ7t&<ϽhFׯ/چږp- D%wi} mJSMIsݝ/v=mJp2ȸ௠^g{[nɈkp+-[VkҼJz޽[3^b+2@@@@V@;       O>iiPSN7,ӦM-Zr}80vnҥKK$_n*GKS{پ}, ( e?/^ (LK,qN&9&N,0x`ӡe/\`u2:TZd;G)s]˘W纖]fv;w |R\9{#!0bO?ɶmLy):J:u<.Y8i+ډNf0aϾK/A;5ܹt] .^ /U\rI9eo>kϫ^׆ b+V$i.)qkW4#^S/[;^ ө{֬Y_6 ^uU2Yht}Xvb=7CIc,Y2ͺ^\6@ 34; @@{}ȑRV-9w :Ty)Q;g *9sf̠AOn._lŋ=ne6U= @H{!cZ< 3vUm۶5f!hETkp +納7aܸqfvΜ9Mۊ5k5h;|Yc)MiR,mJ}nU{Rewu}E槉6WsY^7x'ls̑J{Ν!btw    Ĕ-`cpQX@@@@@@@G`&ķ~+O[nE~i1v-Jp> YH"-[6k2kIkvpr;ErmcA &3qDѠ ׯ}ZSiF|AD;Ms]y>|F)юf `j#Vҥ >=~gIFL@;vH:uދBBIOXgqw5RL>@:PJ} iC˹_(ڵztT^9Uٽ6wAm޼ڿs=JO[ιiH5#Gug1{ebJ@;R&MQ^@@<Zaiaiܸq6c +{mP0 <ޤ@Fr}}:%w^JSM$Gg3f4Y*T05'|bfggyZż:pYԎޝu1شvZU kmܯsZ/Ww>pOj,G {I??K  @ _ƌ#ǎǛ`z_FBH{Kg} vb„ ƁرtAt;  EI w}ٍU_+Vm۶%(}a>4PrlٲL>LmI흜% 7PL9bڷ'Jm{+I^ks-hSjI̫ԵvV[0K(v63FJzYZ;Ν;eFp/#    @1e        @,YO?A… }vT?۷O4`)zg 5H!9'/^mc:{j2)|2s]~}P^E{5 .X1apS:uD!C;Æ y(f{kaKw/u叕='Bf5A}0СC>5Հ]{6Ws᳌(^|w&0iÆ vuvAB:}(ܳtW^K~Ҏ \ÝKt}Kkؙ3gĉŋM?SK^ݝ};jV;ͱ5z wwd{<#}{$N*p{pwUZէٳhmVz$o޼֤ݻW.wUTI2glo؈~&ٲeJŊy> Nv Ef61)o9sƔYf1Y  IJ@7z+D@" l;1g?[Χ|믿^:w,wyʕ+{' @@ 3o$@ %5\ckڦI,Y ָG~͔))S zv֠Ӆ  ~mH8g٫}Jy, $< )Mhbq@se{H'{Uvw[ޘ6Nȏ{u]֭[}0U3YsF=z#9s4ϩXmO^'3@@@@@ EĘ @@@@@@@RS }0 aX.΢ẼիW7BB RdI9v옽#+~p4 'e˖ BY{vND!yg~qgu~w敒HnݺF;={L4I~dƑ8<8߽ZzhB4~J,9w]/%c  /Ș1cn޼Y.O<=9Uٽ6wA߃tAtg+֨c=fOEۋc:%w~JS7KrOZ39s{N;|r*U8'נޗ/_ &#n/wٜ&6ǟSb2g0xu7|cg˒@@R^gϞ2x`9}|+vHJB@ cƌҪU+3wӦMNjit|um@2tM>## ĺ@ѢE*ٳgH-mӠA38ˠ훬֭3mݖpv\IR @&(!W\#G3w: ¤m6m$Yd m }Y$ږ8TRm|{׼b} mJu/mJ۞Tż:׽6wmڔ:5wp0KuL dL9Iۇ._GdDKWV_Mp ~S3Ԡ!ڵ +Ho<֡Z8߽:׵zkz8q/m۶-l혥e˖Ҿ}{M+ VbF tAe̙vϝ;'K,1=3NG} ,3jΙ?~DN:AEډ/,#GVMMyѣE_VZp@^Ks^֫~Ʊ~юT/ {ZbKMnY1}޽dڵkjkI̙}Xܟ$p njsM;*_|H^\(@;c1S6{ly^"E!5S,Mf&MR@H 4A{=9qLHO@;8r]`)Zv>{+XzݲeO?P^Ϛ5_;Ўǎ+WN>w<`h`N=׵ជ#X=߃[Z_G`=7r6lH8=)e&zeb馛L'?H,^ǹgI?ٺ+n㏛N{5|y'|1ZLeٽ4wi.{h+!Cge={vݻ&t+v:}w_>^;ˬ>曢C֎<{%ޥё:]-Z0כi2c5d8p@VZeVk$! 5=@s+ 3ir~̰rJ7n {!S]v믿n:uꘀڵ KB@bQÇc Ҹ@,YrfGq L}_ӵ ɓ'e0hSJpNhٮ,۔۞Tmɼ4w)ux7l_{ MlR%r ^2݁C Tu7|#˖-Yuذa>ӉMܹ3a?shid DgҀ:JfٲebŊRBZfMꪫhG    a 1,66B@@@@@@@x@P`رcM6͛C+Vu[c>}нP>ٝ;wvO8JCH$g_ľc- _i}*Ud:izu8Һ| |w#g:lu]R hW_}ʕKSӧOȑ#Mz!yS=~a;Ej_f&=*gN' a\ǹ:b%Ԏ4Y.]ǏˬY;K}p$wv yhٽ6wW_9Ξ={dĉPBt/iyr^ə4\S5Xaədg'4س-[Y.;kOq/֦ի'9r|?Ǝ+3g=f:u֭[K ܫ3')˗Mm5k'  @l \cozWfe(5 @ : :|߯A+9)Ǐ?(:hZ2~DB@bE@ۺocQNE@&љѶlꠁO:eQ0aٴF텶ϋ.] 66}qwgpl;PL9IoӦsQ{{sT =߫DCmJގ;ϙH^{n3gN 4`demK~DK^W{=TWonᅴ^muv7m1    @0b Fu@@@@@@@@ hF>E FK#^i)B}ֽ}0/\P>3Һ>8(igTJW^yeĂ j2ʕ+MI&'k֬&hM8<"}{yqq=ZքF,_Ę#G{>#iWdɒ35o\Ν㑸:ӧD=/S`{WcĞ2eJLb@Jk׶F}^gܧO4={֬f?SMN{;s:J̔8nHr/_>M4(ve%ǫDbjlgbĈ>sv3Ԅn%.=F:z/XN:O?IѢEJ;ZԤ-:*UJ{1ѣ hMZ" @v1SN ~*"D~OܦM3O 6Lj*UȡCDjo ;w4lbz[[z`=ADk M4"EX    @bL        "΃β;h͙3C3gHo߾m"ZF{_9'N^K.^Ews:t[3 tN9wn煻3p:rneWowf|%aN|VZ%r1 ~a0uqp^|MSG}O_.\r0SNs=S:uL[^ks֫v&R={ڷo v4i@4f?^}DdVJH?Y&w?JRgϞ> YYJb$3H_o,.˛7n C3fȘ1cD#3?.|?s.]Ҟ={L@;\"žY׊  <ge˖5U꽚vɓ۝; @ h_2h 7onG9}j۷<쳢%wUnV:K3 " {֭[E#@m mJiSjW)M6^'cd[2oQY5vmt6no!Lin8~xӞH"/:w}g/oٲePAuϑ=⥻s?'(^ШQ#{ݼyO߲/^hQK9DϋmJV$W\v^     @ F@@@@@@@@NkS;O.=HYK,x@~w;[wߵ@i+H6z4pvTk)709{ǟ=5Ah:.&5-It|ϙ3TX1 vү_?{ݙ3g&~ݺuMG z Keݺuv_&^KsbbŊɶm]vɄ 54H}rFRE^$E o\z*UJ ,ZCDueӦMf… eÆ RJ ];"Rڵ&z;v֬Y3䠭v|DE(L~7k׮zk&{8g͙3.Y ŇM8p`|TZ  F5kf:ϟ/mڴIT@ ӧ}ĉ2uT;v,]|o'Wf۵k']t:uD( %]j̧N2ʈ@?ڔҾ&ڔWX^'{Yvg;H tҦ4L;N@] 7 eʔ۷">}Z/GT$3_N><#ڳg$= 4qΝ~W>mu+VȂ D 1sG~VtvM6l. rJY e˖Ӊ+B/`!… @gΜ1iǍ7ɓe֭>ãpV0A4xcǎ-W}|>g#ׄ>l{Wd\L}1V:\#>_8߽:=>O&u\=gxϢjժ%zLu<ٷoY]12gS/ϗ#G^zoK߾}M %Kkƌ& N Zzu9rO U~ӜiӦ*tPӽ{+ݏ;o/stJSM${~uξBM<$'zdttXI{_|E>|5Ki(Y..%/^5w\7oG֬Y#Ν'x̟4i˗/^"c\^* 1,ФIy7M /^L >fM[nfزe7NƏow̭1 ]d-բl  Π bM@ Ц6R)M6^'U[hM?sc3V)l-[66l ~go̘1͏>H *d6q |>uoK6l(:܁58䵻}2/4}ߴuxW7ߘ<¡CLgϞ֡G|ܹ4n8vš@@@@U@zd(        &N(zJ~N0;t6X3y!^imnذ^t%=#ȑ /೶)Smۚ@l 6jHv-h2W8 H^Z^wU !@ pwϢǍ7VY+h͛77+.bŊ63oA1'VTIT"2e2eҲY2XNOnַ9_Hݣ{ms\;ͱv(i%QjUk2W\tnH&Y0Wp;GZ,/ܝy(QB4e(ɓ&zk'dQ;O?I5N:RBٵk`ĉVv9sf.59ۆdRsvrJWj@~LZt:{ɒ%KLʖ-e\ h .$K@@@壕Ao˗/bR.@8(_K淥 رc@Ӻu䩧gyFnfu;8b*  v{g@)" G)MimJSMI;ӑjKDRHd~.KKu6mHfdܹ6άYdɒv͚5ܹszjV[6 g}g: w;w&$%(Xk /^E>3L@?Ï? K_|A)ZhO    #@ 9V@@@@@@@{V8P`Pꪫ?dȐ!bZtXʉ_^+TPٔ74jޡ^j[y @ɽV%v 5oY?VY"1Q0Y;5̙3w֤ PZ/wݬu2f(]v5ѵ3@)UisyNs9W.Pd\!%i6><ݟ#K,2n8젨)… .6Okq/ j{P;`syӸ oI;Ҏ֬Y#]w̛7ORlvIH/pM7~% \rIjdڵo`$@H.xf1bL:e\dٵvu?~i߾>.3# @pbL[ Hnڏwmm|uTPoṇMTJ)=ƫsَOweI<%ڔS||wY ~{1;_W^yEڶm+>i^@@@@ VJA)'        @ $ӼyJr CT[lI0_;xӇV*5<`qF_M`0j)pDuH1 tk R|ONٝʁH(oG#k幎'mRkPMӦM%}5YNsɝsYʤ&}PBe͚U>Ă0jf^ݝoPR恶+^xE-ZP.Lo)qDZm~e1u#-s̙3|*Λt29Wf͚ 4+\<; l|f͚g>ز\6i'Jڱu-޴ig޽\ۜ9s4og@@ :֭k _>: E)@Ҕ֭,^X6o,?.]68|;;j~R:d/g@B GvNA@ )!MiRrsdpzmj ?r+I^ݝ%攔ymiSH&25\:n/_>裏d~t֫lٲ{`mmiIyg| gR=ቀ>ܰaC_ۖj`Pmn=|yO믗Zj,.\,d    .(@@@@@@@HY˗>}dȐ!~ s 8,N!4 W`ݺuRF 3ѽ{w5jM{#q%0tPy'LN*wyi`seǏxDZ@رCv)ڹN=ʗ/o:(Vh $H}={Ț5kp )U$SL_@J`_|f+gΜYn6ڵieu  @2^xyMږI֐@ FqRG^SW %e8p@4ТږBzZ?WN;=B{bp,aLzOX^j}^ޓ1cƈtWȓO>)ݺulٲ91    S3~           4$~ Cf͢SfŦ <æ3~OwLؼy ¨4lؐ Ҍ50$H(`x?~< A4%ׂXHժUn:{@RS ]tr7aĈ2yd=ou9:uJ(!:u2A+Vf  GYfk_  ėIxRR]fBQFfT@J.-h )S;#+W4;ڶmS^z%Q c@    @j 1/            (^̘1C:9s挌;Vׯ/>`mX_]-Zć@,YnZ$S`rԩ͛W=iC`rјlժUnٲg@hȝ;GZ~|2aٷo)]LGڙ~oԵkW뮻$gΜRʁ 1(9sfϟA@@@vn;v4 _̝;Tbҷo_6l_xq~'[5    - ^@@@@@@@@@@@@ =ڳ:r-RhQ'c҂@ڵeԨQҡCS][obŊ\+b)fB vڸA \͛۝;4]1O7bf%JL2غuk,"A `9M@@ rҥ\f   Q-!Cy衇dӦMһwoiM\ G!p    @@@@@@@@@@@@bBe˖RfMS˗ҥKc^ș3gUlժ=  @t ȑ.ɓ'qF@'([n3fΝ;7ސ*UUN}]]}9~@@@@@H;y䑡Cʏ?(u1|5JjԨ!sI;@@@11            UtO?mW8#'0k,{b)A@V {vN:e3 @ )RDz)Y~,]Tv*?<#RX1lٲeJA@@@@@@ ZjɊ+䭷ޒ9s5w%7|-c    JSi@@@@@@@@@@@@Y;G}T;&ӦMÇK̙C· "#pq@s+_T\92KL [Np,YH2e@ ϟ?/?cf͛WVo=o˖-O?ڵk%_|R\9iڴ8O'NH\FF4XѣGW]uUBwaٸqd͚5N *HBuٷo=H͚5N|r{vݺu%C sYfer_0)29;.\XJ.-2er/ 8?+7o6&%JkF*Vp @?L2E:ud:& =ݢkI믿Nxw3g< " ^{oɓeԨQrJSӧOرcPZ5޽I3mt֔R! @(/_euE@@@8H>Kڶmk~+;w/|7T @@@)1ᢰ            m ꦝ|GrnK(X{`Hi[R$:z!/[ ww /`W:t4h=ƚ={eqA)O<oȃ>h1BsˁD; 5k&;wĉ դ+U`ۃ&zҥcȑtb#h^z~W_} -믿2;W(VTRE4@)2k@ooz4(g~{ x WZe:GKQ5 )40k*6dȐ`ԩS>M_c1ikSf{ޥKلu@;a& ~;zo&}g}VڴickܸK.,     $(U̙3Ǵ;yꩧӢP5j$4!8Os@@@@RB@)>@@@@@@@@@@@@@ blKfi,?ԩSZ5h;3e$e˖){"[lY_|aN \z&H={A5~'"E8WON+W,9r0۷OvmȜ6m|> yuיsP@˗7U֯_/˖-M6@ bƟ)C5sĘ24o޼AZΎ LjR!~v|wd2uT=zgWMV?oꠟ%sg׮]E?@@ ~.^hW&C 8#    @=YfҩS'Y|=,\дKz     {c            馛`rAoM0tEpdꫯ̪9sFzɜ9s^|Y>cy衇ԩSҮ];YfdϞ^9믛N߼yttrfΜ nFɚ5_Z(y6vaDRjpn6Հ:|$Ӏ*U2_ RK4ߵk|HN5o5vt{ƌ2rHs+=ҹsgF2| tQ>|˗9qH^t Eޙ@{( @ gĎ;A?ki@qɁLal"^xAnC;^v9NRG@l2gl3   @ dɒ%/Akvej2]+ @@@@ uҧn+             Co^Fl,~Aohڴ1q8zc Ծ}{V?=" d0*UJΝ ;43j ƍI+آj-w.q b/ ~M6냮noL>lb 1L{RxqˤI|r;v,]{ay{NZh- @< 8Kdʔ)J@[r2x`l~ԩ xrɫ*{ {_l /p9aS0   m_5`Xbf޽{o~    :bLw            -Zd3r_~[og@͛7YOe„ &]X 6jʬ]xQ.\h[&X)FgXõj 0R^=S/"~RF ?Vl#Gkͦ9Q)8q;vӧOѣ< A&۵k'k׮[ٳgKf͚3gN]hf˗yn Guo_ "ڿ@Dž %J^ƎT=Ӣ]6wrUWI޽M@_ ̬{HÆ 3`Сcf= /[f룏>2 ,(ժUGyDvo7q7ٳvdb3  4h;Ι3Glb=3w{Զmۊ^tZ+ Ĉ3@@@@@7_`uwmq6@c>    7ɖ\@@@@@@@@@@@@@:;s أG{OJXȜ9]|g({f#~\plݱcǐriٲY_}w&83Q m?7Ud|,A؞x MȥD-yA׬ܚLW-M94P`߾}O>uܞg3|2i$iҤcWXaf[rcNjB6jH6lhm&N?LꫢAiڴiraiӦԭ[gqrʬAׯ/VܹSO{=Ϻtb/ב3gʞ={|e\tOxWRlٲꫯ̠4>3S 2^ cƌǏ'49]̘1cccPBx̟?_zih-^W^yK NY@Ԕ"            @\y啒'OS FJYm۶ڵkN doX|eqƍel& U\93Zjfu NּRJI͚5݋#2rJu_i%fyK4m…f3 }V7BV9ٝ5լzϫ*U)4tPcemMo Oʂ L0D 0g0jwy =q{jPDwz͕+ 3`QǽH)/1SLkӧM]4HoɡC`M.=ZEvݻwO'O4_w/rwZkmi&sdČ'whH֠9J~dϞ]44Ц]w2Q=yA޽{EU{!+9ZxE@4ص9`[n^J(aoE=.]ZڶmkkW`@N@QwH(   Q/mQ^|E1ch{MWmtҨ/?D@@@E cTz        )!0aYlYJ}  1Qh dΜ9jG@@+e˖H>ԨQC4PvnYX(* /Zz8#Р};v Z7|a2ez^Sf-kر 0h&֭kk5o޼dܹ)5uRk^4&7Ԡ;w6~)YY._,={K.sGjC+UPA4(i-K~5-g2e vL4 't& NY`A; >5uf\~`0F;f?bd@`/#G/^pt0kݻ-Z4Y@RF@g7Y"yz  7 &VX!~iu!iҤ|GҮ]2cm@@@@2        @Z8qbZ>uG@<@$@@B\ Ф4W͚5Cٜu!_[ d/d$M OҬY3Sw cٺu_h&(QBν pc? 4E}ɗ/YӲl23J-s ׀V oY`>s3qv6=&M6ɓ'.D F̚W^ mڴӎч btWр{Ǐ!#F0C6zS3703om3j֭[;iӥK'=z'xB43ix񢩧m~a dHNu'O4%pKfR|`}-W_0: |=ȓO>)oekN뚥;k}u__gޡoa 4<<29e^vI!j`JѣvF@@ $ 2t{ѣGˇ~(v2l۶M{98pY3Ǔ@@ N:e"G8# \  @TZU~Ѷs̑gϊжJR@@@@ *!            *UdWsÆ b5`X-2;)[ԨQ{ hoƧ>.]71h ԩE~Y4pa8aÆ& .6mژl.]j:ʚ5tMd6fhϞ=Rxqkkɒ%eݺu~N_}YܼystZ1Λ7OΜ9#ٲeYԄN,2[yj9wjР|gRP!"{ZJj'gj=c s S_ Ν;WfϞ-?mRr;jwׯ7ix_|VǭX ^zv>INZ+VFR`Xsܸq'ja- Ĩk`7pOr>A{ ,(/_k]<|̙Sn6kyMNJk׶FW J h0 ah`^zI^|E$]?gK.SNC=d>+ϟ?=  DJ@$@@@Ү@n  Q"~R3U\ƍqFMK֭ǤӀon͙3G4z"Z2eʘV3f A04Q5i@ԾޅUޙ[5oh@sр4Ri _QI d()%$D2TJI&4QQ>kZks]][ӻy&!S2Œ(D[hb{Z ?k3#FҥK!_| 0.]TjԨ!K,Q`ȑCڶm?YfL2Eƍ'PDmñ͛7k 6~i޽{%O<̈ϟq7nBݮRg… eݺuOmV_/k"=h7B2_ŊNs쇄nM {-Ȅ TBƦM-[LuRg<`8 (P@$y&HHH :2eʤF'O~M߾}G~Q=b4   c왳D 8qJ   %Pjm\Z_4?dɒ#|<(ӧOٳGdfK$@$@$@$@$@$@$@KB{r               0 ` ~4     pPL# $ `LOV@ yJͭս{ ?4lPիgm:c:$gΜ f;F>mι+={L42{b[Ԯ][ܺuk(-Ψ0DWX!FHtȑ#Be˖o3_\LKv3.17-vڱcGbѣG%W\rI=KO>م l-["nLFA$@$@$.Ryꩧ=[/,ZH0:uJx N:Xz:Wœ @cj6H 8'Y @0`ǵs_l5kL!r7dEHHHHHHHH D>0Z6 dx_|ՆZ?C 8bzѫ5sziӦ D'˖-ZŊӼoYfTZ5 g駟To՚O 1B_uG}i ]Jj2QظqI&pB3gp Ծ}{bN8!n %<{ pq$VHKq RgO֬Y[nC=! a3fݻO>p|m V0B׮]&f?FTC:u;wYf*?[%@Rg#P/葓) ,7M M-$@$@$ ݦMmٲE_u9tV Ux߿tAz!+WNj|  Hx[9rH$@$@$@$@$@$@$@'жm[Ke˖rqYx4lP͛!ѯK        @!8l% Æ gyCܕHH سg\pqFYfFvԳs2vظ+1jJ-Z1*Z -5\{Z… XCV# #`ޣҫY4V39v&8]9ÇKݺuek)?\7vM2ŕ#Wu矯]eʔŋQ͸c}v  ˖-^[n[ ҅cUVTiV@uҤI뮓ܹs;%}]ƍUm裏 RJ &!d+T!HP# ;')=|AUּ:[fp6m? %K2eg< 6K3Vp+VhÚ!0Jocf?uSn8eJ!D :T{b[oxy^9s e{mf_LyK\}l d$~駟wyGE.]M;/?/@gϞȺ @!`߇i$@$@x82Hv? 8P1<H ~.;Q8СCrJkt,Ul +rMW,HHHHHHHHHHHHHHH #@X2#ԗu$ pOa{O:N# ޒ, N Ǝ?.HHbCGŦԥ .}jh'0{l-[Z!pԩSGׯ/< 1B >L:Uo bYf \tয়~*9r9&Π+?9+!%KT-W 0@ 1B' CD$6h U7t AɢEGVBaC-T?-[D[5s;ٱcG*ѷ~;hV8_r̩p6n(UTIA:ӬGb8c>]p޽!wzLK,)dԨQkET y q N0!V!i$ر 1.ZH ;gKqɓG~Wp-<  jIlHHH v}nڵkU7ߴl2.]H=D K"  $ pm%{HHGBNc=7$8% Ǧ,zdiڴ޽[ӠAϤPBhHHHHHHHbHB1͢HHHHHHHHHHHHHHH2>D  @صkoA;wnh JGA m"7@J.@fbJHz/e˖M @# @ZQ:GATB9"WF]w2$#̻S8qDkBַo_dC쫯Z>cXy:T0}1}wߵDI!7zhqcol޼ 3"uTqRg䉺jJ7fwʕ+KLC0l0Joʈرcqzl!x5igydL# UŊSaZ;7p~{,5/Zy)[TTIV^-;wθvk֬阫V`v=ys}ވݻww,3VVsB Z8C$@$@$S@pgSj$1BF)_K3!ba$@$@ J1_F$@$̕gS;{DHH;9)SFZ͛-1… ''HHHHHHH|"|TO0               H$ZڴiDjB$@IOq9X~/_y#ג@/_.^xa{19 @xeȐ!AHH'{%EA$.ݒ{"=J*rJ9 1[ fT;~xŋK֭姟~J .)3Bh?nݺϾz(P@ d˕+:!s>sn0qD<!4C`i$#- TF*x1ٴi9sFyF裏TQF*'H6 WX ֭+Zv*o>|^5`̙*Nxe ;i$D4!Ƙ5kV sS!Kk%KM aË/aد1߿O&!4sw۶mz|q- h]tO?T߁/¨nk֬qR.;\[EA}ᇎ};#)FC:CBS6#ڵki$@$@$@I] H~wT}s}=z|޼y1 dbU$8'B6bJC}C6 pO -?}9sO|ӇoBÆ ~ 4P"E Kbt ?s9G+$FK̚5jPVyΐ@ ֶm[̃ W-"1}jT${h"d(ZjPY~ҬY3yWuS&M,q{^i#D e&W\q*UJ~\yfOq+WNx b̙3<ח_~kY3c~뭷(hz'i2edڵ*ևsuɒ%3BLyr-U B ;6+]A.#-G!~#3f!wYƌBVA3^ܮ];=~;w]vbyC\i٠AT￷xs>| -DdQ_UZUe 4B`i9Bp?c ^zSD: ¶Fl৓o^3/ aƴm!`7Jays{ٲe -Ĉ@ nJ#  7zh … g};wkJfd…rCX$ d\b̸ǎ5'                        '`믤gM}֭yΐ@2>}ƺt"͛7w+!2^Qٳge۶mZ+BL_:.*J "PxqygdȐ!;믿ּ *5zhy뮓{G8CȑF$@$@$Ç[ y9C$@$@$@$@$@$@$@$PHOUq߾}|riѢ̝;Wg͢7 $ 1&dcHHHHHHHHHHHHHHHHHHHHHHHHH >}Z̠3=Fb=Zna̝ƍe֬Yjy5׸ڏ; D3f O`jEJ*b HHH|#-[6ԩVZ%/L6MN<)̛7O%J^zI.]BSgF$@$@/b o޼nYFṅgaa۶mb ɓGJ(!M4pNf/R3i{~{BDۜKQg|4M.ksiYr |DTג>vjw"X>:QJuMc˖!ШQ#A :u2I8%       p @!F(\E$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@n @ku ʇ/ڵ,ڳ>+'N \FОr  G 4.X@~m۶*i8C؋/({6);vK͛Sl/s=誆 ʢE웭yp~ \9`o/.#ӵb*ٴiSD|M]|L׬Y#wv21Bמ^n;~\8Gio+/HY&~Mq}U7CJͳ԰zj 0ϴ#]u2?+E:6苘4imn}iFߕW^i3yzwXۼ̸e9l+@0mڴi:߲eK]o`5/ >\oi=&A(Q駟VmL!ˆw)SU::L)HR@ K!L0G?~'LZ"`ţ֡eVWmw%~V }Hs|Ք!   H%otA;A`LJq"ѰPhJi.ɓG:w,>\r%)vl29ּys9rY .@f͚%7GBHM F ^}1^Ï~{άO_x.]TAq[gVHHHHHHHқ@'               D%PT)ɑ#6{` {m:/t;6 8fA`A>S9s4VڵdY|o*X@R@@bvql6a9Iu|)5+ 7d3gNMH"۰axiٱc L d!Y Fnou]z=ꫯ+}4_egAʗ/";4K(\74kL Bn;1>}z*!'N>ty4^Y!y_K:ukkРA`|J8̱ LlA$ ܬncfaqA[]-ZH@_t4ٻS?8 PD/^lte +{>~{>!d Y >nPީS'AQO(͛7[gM"Dt颂gBiE{rWwݻw=Ğ"|MYދcX$d!Cѣ%KXbn}1fe˖k:~wkԿo1X/((HHH y ~oѢ)M"yɰ$@$@$@$@$@$@$@$?Ro                 -ZT FRP!b*~Uy5*#ϟ_05f!$t/Ioc ^Vҁd-[?Gq9眣BO>r]fM]FWᬀ% BKFlɬ gX0PÆ (#TӋ.)IL=zTK-s̘1D]>4k,&uKc޳bE!~\..$@O g`CUF[!:(ˆ۴i# gUW]#7ߴe&^ڃ}ݲJ9!@]ڵku0oanz.N>ݾZ[Nޏ իWQw„ @ ؅K!7 *hHK`n$@$@$@$@"rJʕ+[!   C׆ &&+̶}ɿoKU38%  O9D# H!ٺu̘1$\_~}8I3M>Ӭx ܲ ޻w,X@KY[t ۷az 1'Hƍ/2Daܨf0yd}9RC QkeرT￯c΋iӦ g?~yƢh'C6dR`.9sB0 ܹ3p7k_;ĉu\؎ ^lժU*Zti}WlY-{ܹv /EyofqAGyD4i <^{5)ֽ*<%h]{)E"ebjc2ywqF1bq/>|M7ӧSUBh .5jcGxW_Ifbyw-˜; @T ؅Tղ9 @&={vzjx7 >cV^]j׮HH2*֚wF$@$~0[ljnOF˖-|c=5w,c:e ۷[^9u fnn9o7Ŏ;|)Ŋf5|F7|So8̅EuxW;x}GߛzN >S=GI$@$@$@@믿j x J @ W(`s$3-2M{zBЊ0B=!m,o޼f6Ծޞޞ0Ѱjժi"8Yn,MnA@ Z 1DPW<+W*KӻKp1By E<]Ѿ; rcb@`Ap Sm8F*?_~*‰ xgFP4}}VPN9`}pNlVBPL%!us{Ȑ!X 4r]P&~= 睓p$Fg:tH˅'OX/nY~ZGuj} b=A 5-3ꁠZ]tQK87n~S^жm[*}}iV;C pq^@Df(fj/=j8/VbE֒ C[lѤh LC$@$@$@6l0)xW䪫@VA=zW!  8'`(X`ז# &[sӧB_f;cenCϯco>hիGSw}}ABl3iG4H͟?ng̘1ok>ӱW8c=˽>Broo]4k׮ӞTz       @f9G$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$M`?p@ټyc;F iW\afp~iB۟M n ͚5kfkO>=B _ xC ~ 1;tlsVR%K2E.̙S f6╁霖"ڌa~ܹe駟u0TWiEra֟wy.A\7QWޥe^ 羓׿{iL^n~AP.r-VnF{!g oX!\AW\ω"EX!(e_BeCDC  7vqH͏gZeBZ_ըQ#]LSNinX́"I…U½C#wdC@xҤI* /ĉk hD핈:yƨW@<,!M6m.DZ1 g#G>\^>{L^~x‡ ͇IrB]6~v_6qa4p7oGÛo8+̇ګ)(RK7^4諾껺|r}Tpgge?jIgJv1jΝ;u,͈#Tӯo\nIQ5lE= ʉvXSE{}DǑ tM A֭[xCӟpދkIHHHHHHH 9P193[I$@$@$@$@$@$@$@$@$@$@$@$@$@$@$ :tlٲEE A.%Kb03(v#e m=)`b vq;#xWreF?0@ah&MT@U7)۶b K "@xv*J A LhjAlݺUE .hQqy믿J}M? xy~ C1J,L?_~ E9s& yv^XE6vP`F-l{z{;qφ/Y;{DS( ]uU>}Z y B0%Ezy"<6B|Xyc3;XD'H38vCxHqhXcSBT$,vL~Q2k,S"g3+"{] ,1oz-F{['pBeu78ov/ˆV^ʷν gSV(A(r6lؐJs5wѣGMq=E <|w!_ӧO2l۶5ϙ%g >rH @<0JQpOug]HHH@ ?`ʔ)/}oʡoo+Y3  D'@!D?l @F#s3C!FG7u( M#0 g!j'ReaL ,};KQE1ʫtӦM]7n,Ŋ3w߭"\)6iժUK}߯_7PLh1ֱhʛ7j*EC'ל^GNu@=S0ڳ3z 5}D9? AW%a c 64       HfbL϶ D~*:u/fq71BLnF10=m9st7#h2DEPɓ'"4fX߹s爫 ,H/,wqGN 80^?vJb|TT .2ē#DW0%/^l j/?ٳgFYmqq{ wB,' ͛7/(H{wb}qBss>sΝZ|*U`dUѤo7N⽸Fr̩00n?.Ba32y3HPMNI = x}F|0-,?i^xC,CY@ C w1^x"P@ZPվ-{as8s\H#A<fO}M8QH7tS`_ F,##!m0: !YfͰM*>N|zjժ,RLkԨb9 ٭_0 ZoFN.]/_ҥK%\~ꪫTXQ>?Q'H7u.#6v7:iw̙zOB?Ç N$@$@$@$@$@$@$@ O                #!#b##0/@1>)?/k׮H|TʸILA vקHn!^F\#E A<@LQ~'Rqjf~d„ իS+:7BM6M5X!ڃ4v=]a9 qZz`֠AE81mUZfݻ@nwb}qyEr}ў f:%=L0@͛7kr؅K{J$?zHb[nYLYfd<{p_)^@hYz= H& +~͉'ٱl#Lqmkʕ+'=*HC T4i@2lp^Xp!R߾}5ۺu 4bbѲX= )\'jǻA$xWUVisxm7vc… eݺuOq.nc:"R_>g-_<{9ٰBc!qXy\? 5c!(={x?,a~=s2=|D5DZ{}D92ӦM1}Cm^0Ԉ\oXAuݾ2N11<cF0Θ1c1B YLwb}qX2,,{AkcN # NN2& ?\9ti$y3 8fΜvuMa$uL)+>R8PǞ>0!چ.ZX]v*B}Ռg`Iyy⹎0#TFu8_Z}D#Ĉy,Y2Ǫ;wn)_]VЍ7V!F@ /2 N9.\s33;IfګW/}^SAM66L8Q|Ayfណ2zf}=yܖk/{ol"ZcǎuC"*um6O?x6F!FCŸy~ g&ШQ֓@.T؍IHH &A#1i !  P}33uT@3g N -[L2e6$@$@CBs, &k+cYKc|?1\OSNc}L"{ҹsHw786 1DшVXxU,X@#GT_@#uEZxVE&-h♺DZgʍ_w5zh_D<{<r=SNh+Sihyz{1JP r{ {-7p&9W;#j(r&M!C;ƃç4       HFe-gIHHHHHHHHHHHHHHH 0eܸqZ*Ι3Ƿ xZj|H 3w͚5aG `A#a}GHH?@ׯ_X-0`+a]0u*#] 7ZqLkE:P"u@etbDc@1)}=+y饗j1ZfM+BSc:De͚5ܙ҇gi5 5k|23 0X- +ٳDZZN!SO rʥbC,;V/SNڵU3:vE~m]g8 ;yae,[L+]CnP[F5p؃4Y9#8 {nu5-k-Yq?7+1{8?,PU/`1l|%+/|0"_|^(QB_^oxϬXbVׯ_C0h׶^$@$@$@$~ж $b&   8&v'OQtRiӦ1c$oqTVHH 3 3gNHH xҮ];6l'(k׮}>V%;c_oOoOl>V(X\yl3ieѭ[7*0~'s5SLקOT_X0x|OՀ0֭[WkrJ@x{RP!7on_|NO l3%rKG/ȴ==}D\+nh$~~=ԯ__]tIF$@$@$@$@$@$@$@$@ 빚HHHHHHHHHHHHHHHH 7n,M4 ȣ>%5֭*=w\ٷo,X0XҠ!fH#hF-.6 uOYlT@PV LoQTyH_Zl+R͘1Cy晠ib5T)!ǯJ'=5A2e 2*UJ3!> XXX^hXs[Fק m۶Em&mЄl@VXZ)bJ gi= .'NȔ)SjժjHϴܹs[߭y}}Ayh{,C=<#{r)Yh4j(Uհ9sfVZ}5gcI/^믿qcԳgOٹs#Gٰa/kœya9&LPE ˆw@;N;v`8 f#: H J.-'OŋKz"&hZ#cDδ.li50{h ggZ[nE-Nh[zyi` Ϟ /0=eN:j=@3IG`HR 6n(5kLkHo_f7x/C$@$@$+ oF~:L4Iuu׉?3tK^/Dzɤ廌 mn[d]}S\gtQ6mTØ6AјG)b >@IDAT/^`Au[lQ_ 郯ٳeӦMY@)Ydj^o7fpA_&[}DSҊy5lS]t~{wGԏ#\yๅjJ,;v{%       #O               1AUTn> :8wĈ2j(|!Ac&a Sa/BnbmF!%KTE@Pb:X]N:R~}'HS0BoQ;H|' Ž8Nv7g} $^+EX3<N\"Y ? ƃckVBH6N,4Ə{'(19U0 f( HtR]eڷoѢL6M>C4Hn TjPP &灓0(4F 0 Y0 ZF0#飏>'|2p!ό@".8DQoy`S!FGP8gΜa-#7( "@kk=O<믿jvC$"aUHi^8^F(<d:FrO`.ضmۨ3&k8*e}ǎj$@DxGʷ~*_||c7N @d˖MN-X@W3|uLSO=M+"&Lh_h2j6C*|DQP?51>Xwސcr#?7oϲzH6l( @2c2mHHHHHHHHHHHHHHH .@ M؞#t:t(d}17.ٳ9RTAhB@_~{2g)X՚BQF*1C$o={fA=N"؈64iDO.H?tPj@ABo;qD15Fӈ9!̃csTɌ"6\wu͚5Sa</@p@.ҩ#مFD3i\fxz}:ydٶm3qD}/x n~t +!ݻcx/9y)}C?;TzVT!vpӧTZUg7oެ"s` ?.;3B{wqib ]Uzu&Ox;v~qP+zqN}p2}|L s8.F~~_L_w1EüpF} C  `_lҘ]!ii(vҭ'͛7HJNFy4HvO?B $@ F:0^m*ٿk}Y/   "0M}pAZ~"֒ Di$@$@K/C?} BJ0x(8o k׮vK9rR=zP#?ZwPre_+Ep¿6k|t a݋#wknP=S>@EA`W_+skU-|u>Ѳ޽{`jΜ9q` h(1!cl8x͛^^J?y6riԩ>~1"u8P\`;~ sʥX霖q1pA,?0x΃۷9tj6mZ *?n{NiwO?2q 4?Nd^Yb/ˡOiٲ,[Lʔ)#/{="߃|qw 7ԨQCp/PMnƒ@,>KYZ޺uk EjP܏ݺu L/ϴFisӦMUl@ qAT߁00ό9>ϫs^ZgA#֫WOo]+6nWu:C SN22" $=<@ЦM 47 $KQ ,F!F gHHH|%PС2a~?k-Ⴢ.;8kC$@$Q رêzŭyΐ ?1^꧟~& *JO> ژ+#/P˯޽[|#_0W>ehJ3gu u~u1^UN)p_^z%Zj鸤cNe?ukJ*][\;e,-E${w([D I!Y+[D;󟻚;˽ǘ3|3s8s3yyV9/ XsDx H{,=:[yzzQ鹏ZjmsF-#0爪;ak:w,={4?yzLH4Yeҥr[}걃sDݦz=^9};Fc    P5       @͚5`XGaG6?ՠ Zn65@Znmbۨ9o1jУڠ?8hUPAqw Mtݫ+W43[:J!.Z4Q+EmMc~+}~K(i0^_sf}kXAl1]dcq渓qz؞/Ng6l0/;w Y=E?,*k֬1[  f= %[mO6m$/y_us*.ȅ^4/Ӵyiٲ9FfĨs,б 9a 2ddʔIN<)z! :Pc}\BE>/?z+…  ӀRPԩS[-wXP==V?}^cqC5\bqʺx"7Vgc-3D_ǿL<\"uf_u=M͟?l_lAz\勵VT,τz- ƴiӚP@7 z+V ,X`zlҰX Ջ9=f_\xNC9<}tsA9sDoܝ^JC2zo}7utq9W\ܹ#W6G}>Oh}=s⾀τZb,~/i@@ >օi(  / wzqÇ;ϯA{6X ^"@ݺusz'$O\"""N:4cǎ>w>:K^1s9=lٲ|\݀iy/x'G=M]rhc2edٲev;=Ԟڵk'zHz^+=s|z^OQk;F뱞#VhQ ]+9s9/… &R_6SO=pرC>g͚zY/3F}O51-0&sJ/[s{D^C ';$@;Yd1 JYM/^ hBE]{5?0|~{uQwD/Ǵ:uJtgk |{Egt{Kbk_z=vBߣ{c}Ι3SOϜ9c.N9sfыdk跷Kb[3>Wo߾mzq/zKgqN/T-ْ/=SXhhլYo|Z@͛g!z$<|A q}G } =͛XP@{c+xxB-O>YL  Oz^0 "E iܸ?iX?@W4w꯿*BApNsc;^[{ yn9z^-]rE6md5,Ydv~ŴUfǒ޽{61DA8-[81{myG13fz k6o 6@ύl|~b[yW5T]^?]j+L'0m4=@@,Ybz4  ? h޶mfgϞ-7oޔk׮ɤIO?5j K?44 {/kfp?L9 g*U*W # ^Hu?ؕ{L/T9uV} Zp9YSxbMqw    .@caƇ       xIv.?>}Ku"mzs4k\͕A@ 6k&}>VM@T`{l㍺1oSO MzuysmL@UzOm@@{Q@@(RL6M(cƌ'~u]=z+U dS) Kf z:@8Oɹ`[f ?Ga` hnBe/\ ~Rr0B@@@'@#O@@@@@@@@,XRӻTJxS`Ϟ=s駟fh@ H\ﵰ  Î@ C+s]ӥK'ŋ^Ν+׮]3kР3K@p^boΖ-.\ʬ @֬YeȐ!ҳgO4i5J9bzo JʕK:t L҇GC@S@|>l3g FBΛq~s.V:8w#zzСCe˖f-Z;vH4iwЌ @@@^_S@@@@@@@@5+%YdT^Ydɒťm.]ڥzTB@ .kťyV=x@L~7>ya/f7o,'N0+_$I7;g6mƍL  /ׯ_7Q^# qMVڷo/̙3G &[l158 mڴ>}H۶mtƌhE (۟5ė @B pތڜ k@0N8}oi;_b>|X:u$q`!   @P Ի#        hD/.z  +r~O`k@x#7n4O 2Nj#Eozy{ k֬1 ϟ_J,zcD@ 1.  %0yWmʕ2dYlɓ'W^2x`i޼ n̞=zB &]Ν;=  !y3+{\0ƚ@0NkO#"C>S˗/'|"ח *|     AQ@@@@@@@@@@@V eʔRDCݻ&Mx~N޽{ٳ#^[ܼyB,c J~E>l/0Iڏ':$W\ɓKxxh۶mf5lٲIhh5+gΜ16xb$EѶhv2e'N؏(TI&U֭[g/{%I$c >|+mڴ:j/\ ;w֮^ QUl}Zʖ-i^lV*K. RرcM6cljFڵkM޾}Eر~0.]|ᇢ.Vuf52o޼6aɔ)SiӦ:(1aq\clٲކ._z<1*}v\A+/Z2]MLc[ִ4[ny[pkΌϪx[˕+8iؿ zFV[PYCqL>l0 kcY}ﬥr1zm4 ,Θ1C `'O˗J(!]tڵkKhhh1`@ b @@@=ge„ RhQy 4Ȝ?`    45a0P@@@@@@@@@@@@ C A{SNhڴ= Xa0z+ZS_F8ck9rjZf̘!M4qj}ǕU&3g4._,ׯ6m޽{W^1aիWwJ}t,\T}E5qذalNk=*f1|pqSL2eMk]֭e&4S/aE!+WL29.6cǎ  `1j)  @ d̘Qz);v>L?߿߰lڴIիg>vI7n,ɒ% v2ƏĘ"E ,)    @ (P@ˍ7UV?P   @h#            ={V/_nz裏JR׾E %Bz2d j;XdSO=c.,_?y'LxO:<3uV)]iG&tЭ}nٲEBBBDݒ$I"zݻw;S!CM_Մ::݈+5G1̚5+Rkϟ=ztF]@ݿi0<@ظq:tȬYR%Bf0c@)S++gϖ%J؃߷ohBr%#FK.˘@< 7ߑ(    _=7JѲzj2e/     1Ȏd             ͛fx炸z˗/4h )R@4!Ђ.A=fxC͛7W_}f}ohѢ/_>;trѢE.Q]#""Lݞ={Ԇ+48\r#581:#4nݺ_ɕ+WO?53fh56l(;v숱K.W_}U *$iҤ1%-[;׮]>}ӬY / &M2;v(i9}4jN:e͎tu6liW|U5jymXs Gׯɓ?A@@@@'Ǘ͜9<߿<2kBCΜ9#/}>qXu߹sDŽMݻW~7CBBm8p F]vKLq9/`1`FA@[@C ~ɰa70u}Ѹc) ٳki&@@@@@_ysqN>-=zqp   @h"             lڴŴN|iUlL5+,mk} (i44S]kS}?EA:C48ϕijv߾}ۄ FZQp8-#F0VVG6!;vUV0D p)RDѐS pˏ>]xiР:uJ^JmۚUڴiM>4P(YX41iҤvcϕ+WX4t4AbuzN5|Кx9sf[G˖-MLϟK.ɱcO> ĸM]}j ]L2X_gxb}\XC=kcT:&MDr)WYAN:=|pǪL"uVٿYZBKcl@@ 4]{z \Z3~v h ~,{n1L    @ 6L-&L=π   @X 1         %0m4YvmBm $uQ6ӧOl~~lAKdɒTJ |VhLl#א Ǧ|@={}rΝ+_s-0ydNi&pWޓI&P1cƘ5UTI4 zRP!61`[leƌ+D[.]:0F0mxΰb gsVWsvMhZlɓGmeƍZVi&MӚ5k޽fXVzjc˗K.5ͱLR>Cyw9 磆=s&XбN0M߃oFjԨaGe͛7y!Z4h^:O=B޽MPΛ?y8uT]@G0Ι3ZcY;Z7n,u1/j@b*2dg1*3f&vH$ ͑#~؄4ZAMH~Z-:^ uԐG N F}5ksΙg}֞٫W/L5֬Y^JLk25 ?r'ι-V0 IF֮]+-Z0a\ׯ_7\¥y 4yzeɒEҧO+]\4poԨQO? 5+d0ƜX` z+1wܒ,Yh=u0mf$MT4l1渎iXhZBCCJ*_.Di8?Yi׮XAwO?lvȟ&NڴiEB/\ qƙi0СC塇rժU8hyFmh"[:x~G"ҨSVZy%ѝ>k/]dpy{,>aYig| vc] رg+VPF:.!r =]~=zԚŽ޽k^oڴZZ^M" A!^z̘1&̙3r7oU^]w.!(P$ Cw{CM uho @pyj A=nɲw^9#:σ)@@@@+1zF@@@@@@@@@@@@@]۷ƍM3%Kw ,SN^zI2f&xV k֬tRٹs̝;Lo޼لƍĉ'ƺkdʔAjHdɒVwj͛7z1%:=V>͛7ZǏGy$|꭮)ߚ*UVTUk? W^)SFZ~+}oY}ٲe믿 9իE}\b.&|r\-VXlM:u85.gϞ7x7Xx!>x1.]jƣY;_M(i=G߇h褯Ee mڴẗ́Z"~ٳGٳZZĨ&MDk.PX+VЋ#Z1s[%@@ ~۷2a>|<#M5J*@C<Ò>}@@@@-4iRs:u$jՒ4iܻ2k    >*@       #.St xM UTٳ {mCڰ^D@|4} @$%J؏5TEe(  #`}>3i Ѣ/~gi*- ]`>}ŋM'M$/<+z`Nǎe&lp֭d'NQ  Ҡ<-ժU4$[Pa5k֌^,+]^Cˍ7L0]VqYfTԩ~۶mߙqɿ+-[4{də3S۷Ϭk.۽ʱc ƿˬnEa OwիXBv!77 4`h=vZC=$#FvɦMD6cSO=% 6 Z,+?}=SycmpY=F͜1cVFi&@@<#С2ecG𤀞?ߊs-[Yzr   $@hm !            N hPةS!C'kZl'Nwo=bk*>}zƨ58ϛs΢A !uh8ܡCL9rڌOӀE-wܑ˗Giŋu'پ}fBWw}2n8+VpraÆ~^ rm.}dZhy<;wfZ]|9UՠC^.YDΞ=kA*GwyZէ5dtȑO ͝;#d͚5kYk?SL=PGhO\[z @XXksN;w+V؎;QF?~m @ ڵ>A6    dr咶mۚQ_zUud @@@I @ڛ@@@@@@@@@@@@t8͚5 Q%0nܸ!SN5`M&^grP X֐DoyJݺuMA\ޔn\bׯ_v|D8ptGVv4iY~ ٰa]Ujժ [reRg=Yg;/_>ک{yl|m=}H@IDAT=i9|pfrZQ8r x:_g̘ў}{ښpׯ[#ݻH >7}Y9sj@C h0 k{b#<":u *M2iԴe3]Ǒsu-7Z Ϊ3f̰ꫯL  x_@?+7o6!ʕ7JEsO0As3@ ;RDDDX#   A'ZfӧOM6F@@@/ÈQ             @ رCKJp끹yɩSԩ#<@`Q%Mal0իWŅ m5ڵikڴirرxȈ#L5kJ2e݆UXhR4i7ސ *Dvq߿xtynL{[l>kȅU9ג˸o}]ħ.]ڬqFcD_Fe?it={ XsƢ̰=Vfj/rdWDl٤H"bZ<l2MX^wsϛצdΜY4  8={MeL{رrڵ [E0PV)X5=    t2d޽{q90۷:   !`        {O]v@@ @LVF@x4" @ \r#zAr&z̽k]e˖4xR`ȑb ѣԫWO'/^4׮]k6 /ĺK.~o[Ѡ3ƶ؞_hQoV4 A|ׯ_7A4n:8p\zU'O.~a\m۷ҎNZRHapBs_bEI4O$IJ*2{l uрC ڿ 㶆MhiР(Q"ZkF|lՋ^%5oү_?y\ʝ;hdΝ%gΜc/,}MԾ[{jXߔ)Sd͚5f9C "lճf:OCE^yڨZ/?-[ք&t?j8`.]D̙#R2AͣG6AGt 40ϛCÇ# =Fܫh4Rס/=Y4RJ&|yݺu&j_Oۢ}Le!{n_J(!(ҠO}=_^9bSu[,I.' RdI`}-  $ d?\pIYG/p۶m+ӧO}@ 28@@@@Y_|Q|=dǎ2}tsnY@@@Hlhnbw#       !~8p`blm" t>ԯ_?eL@@Omp- ˄i|Q\8dɒń[jӱcL-R3P4m޼yf8G5ϓƦAv/^4wz%glQ44M2e$9r0PCgXǷxzԿ7[|5rfp.\0օ[h!&M{7wܑ> ԠA4i8۷o}`oeٲeu;ի&R[u?Sv{?c9s4r7o.$E (`ٿvxNkNƌcj?^ZjX@@ 1v%7~m N޾}{ywdU@<+'[oe峴gmi O>g  @TnݺI\江 OR|y{=G9~:t   /07@@@@@@@@􂣮\ ޵Q @.*U(  G`֬Y&IԨQŲZ]|,}aʼnٞ  _H>.\|O Tg[|JXX+VSO׽B fj5t׃Ao"eʔRhQs[LgWgD~L>lYyÆ l@@ 1c[ `5DܹsҫW/9r{2K@FDD= @=Nͨ  / D޽k6oHHHHbu" xA@Kv$mڴ^M")}v{`1L    |ƍ˔)S̙32zhٳgux   @u             @p 8^{x`oҶm[L- @|N'C=s}C_ɓ'͛Z  @}If$,,̴|Ysk]>x`|H3 @` b)@@@@ NzĈrh0@@@%}io@@@@@@@@@@@@L`ҥvZ3ꈈ_~ x~'OiӦӥK'7B   .0g9unzH>A@@-ҥKɕ+9R^ck l۶1A6    @4޹I&fswVb    C1Π+            @Ϟ=!WBCɓ ĸqڵkv-$mڴ.D5@@_[4  /`2ٳG7n,I$1}.cǎׯ>#D\غu2eJɓ' -P@@@=zHҤÌG%HA@@@|U_%ꞡ_            … eƍfŊ^z)Gi&ڵF  l"ׯ7)R-[d  '_|ܹS4h ǥm۶&\lĉrM<=BIҥK.\MY@@@@r!壏>>A@@@^w3r@@@@@@@@@@@@Mҽ{w{1 |rIS^z-[6  O ?O֭i&@@S _|2k,ٶmԩSnȑ#ҲeKSL+޽k-@@@pJk׮f3f\rũz   $A -@@@@@@@@@@@@@@&O,;w4eʔ5j;wdĈv+;v@@_sɌ3ҥK'5s@@ DDDȼydRfMJfͤ@2{l;^ @ nj F @@@@ N9rHÆ :NI&Ź> @@@@ 1.            A*pEի=ÇL.`ٷoibŊRxq&  L8Q\bӴiSI:  -ZH6l ժU;6h@+&/3-[    @Ν%$$ĬI*Uk@@@@ @׮]e…fiӦu5#   &@cѳa@@@@@@@@@@@@OcǎrU3mJΜ9 #v ҥ@.pI۷o30~)Az 5jԻkO3  3UT}ҳgO;~HBiu@عs\~Xb~:   $O @l޼Ji&@@@@ڵi&@@@@_N@@@@@@@@@@@@l7nomrС!C1 Ϯܹsg 3 ,[n HTRqeϞ].]cdP ༀ <]Fe7L   ~o/|gѣGΝ;2sL;wҳgOɜ9+ sA%J!@@@@*W,J~Ml"˖-UC#   @ 'CD@@@@@@@@@@@@D O=^ZBBBGiulٲ!ɒ% 1 ԫWO͛gϒ%WG k9"r2saI@@@@?sCa@@@@@@@@@@@@@)pA0`DXX|DŽ0z>[ҥ !   9҄0(z-B{w{@@'RHa/{iӚ~^|Y>C >b~ON!}lݺլNX   !PV-ɛ7Ycʕ}8f    p1&5[B@@@@@@@@@@@@ (x z{v$"""(<=].\h͒%4kӛ=@@D8{L4l9UTҦMDD@ `ӧh ;#ɒ%3C?}tA#SL 4 $k.J(O]    lQFY#   *@cq@@@@@@@@@@@@[`ĉb 3ٳ znt{w vY'OpgK  ^;v\tɴa<׶E  X2eѣG޽{qS9rD}i…믿VyM6}$Ѧ`@@@pYI&!CSƌrIۢ"    )0O5D;             ^cǎI&I4iL..z#ozc z}@<)pz|GnXXtv  9r/B}֭,^4k.y饗lٲ2d)W 7nSdI{ @@@@RNmW:t\~]Ə/zr1j!   ⡶h@@@@@@@@@@@@U&˖-3[h!Hs='}ilܸqҺuk4L+A#P^=7o^Ќ" G,Y8}oou5j$ӧOw+!  -Yt"KMh(%_|ҥK˯*!!!r9I.t~    ~+pɕ+ܺuK2g,$KoC@@@@            .Z!YfÇ\C֭Cg.rIA@۷oGzܩS'#@@{'|R4qѢER`A{< ,y뭷ĉ|&@_yl۶t%o޼0N    >Ԯ]یE5kV@A    o9            ޽{޳ҥ3@׮]z%ɒ%3ӧKcǎ&M@رc\vͬSd8e!    @}]3g4j(iҤI`m@@@@!wS<M!            @ ܸqCJ.-[l1 Zg?o͛7ڵK$Iٍ  @ )"۷o7| 6  3W\#Gʐ!C… v̙3K>}EfgHh'J˖-f5 ]v    +믿1ZJ*Tep    sC}kt cN,뾁}U,A\@T\QIr\'rŅr5411\R@@ d~sf93>k3g @ @ @ @ @ @z'p9Cz+ u+W5Jc^C P|0  @ ^uqƴiSOf͚ek~⤓Nm6׸ J{~~  @ @@~|] @ *>-zP @ @ @ @ @ @ ~o"R-bԩѯ_:ZmG}t6;>lİ @5-;|kz @5ӧ9w}w1c+bvrj[3㣏>VZ'@ @4*lb̙ѴixwgϞb  @ @פ a @ @ @ @ @ @kw}7:,1-dBk]dI1"cU @|WU! e  @@ӧOg}6Rb} @ @פƺ @ @ @ @ @ @F =0[V>SOXï~z8)0F @F=Յ09T @뮻bɱnW'|r̛7/^#PVV0;AԆ @ 'pB"}uرڭ @ @ b @ @ @ @ @ @4*> (>W^ye2[bʔ)P[ouK @ag}6[L~Cm  @ku]g;6l+VĘ1co߾_*/_^\&@N.* @ @' Zh p7ҥKko0= @ @Vĸ C @ @ @ @ @ @,lٲ8C7nvmcܸqQ\\Fηk5T @["F_E]EEEc @AW_}5.h׮]H;? ag}6ߣ <  @ @V:w1͛ku< @ @* bN @ @ @ @ @ @@˗ǿ;'?ISOet=&L۷As:7ߩ @ B^z)KzȐ!1/ @ Zh7x#~F&X}7^y =- P1  @ @z-p'?v|] @ PED @ @ @ @ @ @ҥK7ߌ^{-g[zuze>3֭[ǓO>;g9Q=gy&GկvūlI:՚ @ VXlM|~{ bn&A @ďxꩧSiڴix_pѩSy*~Fł $f͚-  @ @jQ }"}9iӦE>}jq4] @ @2q  @ @ @ @ @ @h+W3fd)t1,-;t=vZm˗/?> aLM/!hv @@! vm=Sc!XF vax'{3<3{:_wuqwƅ^2pF kYc:.z1 @ @@- ?Mr-qE'@ @DU|Z@ @ @ @ @ @ @ 0,Yov[1}6mڴe˾B۶mm]_N1pr-p{7@zy睗5L 4iR4id;҂ @O?{V @ ,]4ʸKb…:RBa\~qYgUN @ P^3ˣW^#|uO @ @ @ @ @ @ @z$PQQgBs} _L=Rڷo|+_mֱfmEEEҕ{!3 \|y?,]jJ P@),fذaٌo8qbT @9sbq뭷Vy;N]37+6'cǎ͆}'nx @ @O:x2Gy$k/. @ @X&@ @ @ @ @ @ >eee;d[ YLOXt:w۪UӧOlѷolb-ݻsԬ@yyy /d1".袚Do @u&Ge_ϛ7/ ;cu6 @oSLN;-޺u,3ό-[ϫ 8~x饗iӦ`hӦM㄰j @ @@ {o;GwqG @ @@#^dK$@ @ @ @ @ @( -PXyK>qΝwٖB+o%%%YzuQ \xqyelvsEk}\ @ls=7.l#<2n 3Q @4 7?OsKl+C9$wʞF&hѢСCX"R /, @ P˖-?Zj61; @ @ Z @ @ @ @ @ @@ Ξ=;r!idɒa֭_rJi߮]W[GqqqL:5 P2: @@ h"^{@G @ .k&{_5+;V[N Hx7O_׍dI @(h/89rdiӦjCG4X)S׶뮻* @ @^c1|͂7K`D @ Ш*>-jK @ @ @ @ @ @` WmA \7oZt۶m \Sbnމ;7xc`oQ\\ܠh1 @,+DcŊѱcǘ>}zlƍ  @Ը}ݗ/{왅5vas*4\>8Ə-^-ܲ. @ @@`^z)髯[mU=) @ @P` z2 @ @ @ @ @ @ ,^8 Y|w?B%K_矶ԩS\bn+rwuW~av_޽{. @4:(xl%_~yuY `U@ @{^zi={W\{B %3#5*Э[(++78͛EEE5ڿ @ @MWU? ><{vzp7 @ @ bBLn"@ @ @ @ @ @(x+WFiig+.o)..M6$6tlKኩ YL6mڬo52_=viXpa[o5, а4hP^zo-[l؋: @u,0}6lXL0!?͛g#F>~^E@x뭷O>قx⬄ @ POΝ}zy(**1m @ @L @ @ @ @ @ @@^>ȇ,+g͚׵Ҿ}|b.l1Oa%%%Ѵiu>#'ġaҥK̞=;J- @CqP @ @ @ @ @ @.|@8cƌ,t1XVVVem6**ǭZ&L!Cʕ+(xCm  @ 'pg/~l}{qwnD @Ə2cʖ[ncƌAN P/^/Ƕn/r= @ @@l'Nۯ/  @ @ ) qCj @ @ @ @ @ PKKKK*V\L{/ [uh"z++7tرvxb= fs5jTs93?!@iӦ6l˖-kEF!@ @0-Z\pA򗿌s\9ꨣ+]N Pzs=wq  @ @G`qg :thz뭍gVJ @lqbc @ @ @ @ @ @+>8s,t1,z a\rzO8JJJ5-ȇ0~X^8s$@O~,15Mu!끨  @ZhӦM=:O:xgnxK/?>4iR55%0y|WU @ @ C`;ŋGV crfA @4OKXE @ @ @ @ @ @d)dqYb.\1+Sbo}Kzq=bՀv E`޼y{ī-k_Z<#ѲeˆD @}';dM_ @ P[7tSuY'.رcs*Ǐ&kŖ[nY5+ @ @@#8co8 @ @5,0Nc  @ @ @ @ @ Pk Y-Ι3!ݺuˇ,VWKJJ6o^`1hРxlV3o\f @U-[ӕ[o5Z&G @y3ό[n%?338#?hժU %~YVV%].***  @ @@o~!{/ @ @@M b)I @ @ @ @ @ @+;fϞ@Ŵ_uK!+W\Gs!P^zU ]dMYf=D,\0g9ƌMÀ @ @`&Mw=6dȐ,q7:I @X7q  @ @ @ @ @ @@#`jG=򡊕sS(\ӧ#=;nݺ#<m]N @%Ǿ{ףCSc @ Gছn'~^+{w7޽{N P _|16mϏm, I @ E***Ϟ=;Zls~s @ 6Akr @ @ @ @ @ha3g̶Yf-ZZ͛7 T\ݾ{B5ԩI[V̛7/G^G-آNep @XlY [cС7  @6lXu][j~qQ\\?BXpat1VX7F!@ @X_SN9%yzv @ @ ' 1'aO @ @ @ @ @43gSٳ#fTn&صk(**0 P7xc|ɱtlnm< @+pȑ#~_z. @'I'o}tM1`9j_AecƌA@ @ P-vaqwW?  @ @ bǀ @ @ @ @ @_K,8k֬8+)qʕZXv>7`10vԩZchL@Hzj\q=DT @k)p%}MX\\?bkx " @,Z( dcŊٵ=Yg?ϢEUw@@5*Fu~뭷СCkg  @ @Ԙ@zO{1o޼hӦM̝;7ZjUc @hn @ @ @ @ @ @@ϟS̅*=سgB+z bT &o;NN+" ɟT!@hp{O?ώ.ӂ @Xs={lKč7̟S!@v<0aBooy W @ @8nӟ|p3 @ @ blt/ @ @ @ @ @ @:Xre5dqѢE՚]&M{ V+,s-[8 и~8ꨣbܹD֭㷿my䑍  @D`̘1q'g۷o}f#y- @@e˗g_|q,[,~V5lذH{ #йsxK.ϡkg @ @ԴC=m,mVC @h\m @ @ @ @ @ @҃egϞ3g\cbiiiVh"JJJ!)\rb#3X@wlĈ<***z{o\ @h8{߭:>(**0֣T  @Ԗ6l&M_W1rXxqoG%߷\8p`jO @ P5ktP c==) @ @*PTi)ə @ @ @ @ @ P;+WX5Tq̙ٹ VkEEEѥK+iH;)6͛e]~B}̋ P wuWΝ.))ѡCZI @WiӦŏ~xꩧKٳg0 p ߩO<{g:Ԛ @ @` ?>>lc=6 : @ @%0Ncz=- @ @ @ @ @D,Y$fϞ!zyyy5k=zjb:)R`B(0o޼,{Oo߾xva9 @/W;wn?O6[! @"PQQoώ?844^yѾ}9]_~/Gqqq,X ZnhA @ Pg:w-nݺEiii| L @kA3y @ @ @ @ @ht|A8k֬-s3gΌQҶm+VZL<}'pBxGu]H @q olчzh7qX- @,0cƌ8/Kn7tS|̟S!@ |GFʕ+cw{7v' @ @@r!>ʔ)Sb]v) @ P׫, @ @ @ @ @hQZZ!)hqH]t={fA+۷o_q4&@@}cذaΝ;ǯH;  @@?~|p6>+&@ @`RC=7pCqG g{㤓NѣGG6mֹ_ 4fg}6 aLlN @x`>X_M'@ @u+PTi) @ @ @ @ @4lP8s*A\|YYYѢE()),B>WѣG4o|}Ў Z஻O?={:>;vlt5N @ n;wn[n%7+%@ @Fď~x'n׿?B \xqye7qqG|~W  @ @ R }#nCI߿9O"@ @ ^` ƂL @ @ @ @ @ U`ʕYXW@\>1Vt1سg;wEEEJ{4:wy'N:x衇kO^}1t9 @'pƄ r!q6>+&@ @Fnjg}v,Z(I&1lذ5jTjժF ,[ofm֐km @ @-.ԩS5Θ1#zՠkq @ @@bV @ @ @ @ @ @@H?={v̜93**Vϙ3'˫֦MFݣr&l-V>׺uj1|V _2?O7w\s5QRR?B ~_d O߻ѹsa @Ԩ?Ao[~HWX@ 3ԩS|KKKW @ @B/#GfsѨ7I @ @P1+a @ @ @ @ @ a Z?~'Զm,P1WX֭[0F6>Æ {^{m 2$N @q 1`|`ĉckVM @@ \28scYgÇ;/5kVc@}xWc뭷Ζqǟ$'@ @4j^z)~ }&#}6C!@ @ us; @ @ @ @ @@zHi.HqMX|yVѤIڵjCSb.h}Gcy~;yӿ맜rJ5*RB иcse'|rݸU @x~k_Z >  @6@˖-㪫<09g~z?h߾>'8p`!L @ @j@E^{ދ_|1 P= @h,+m @ @ @ @ @+W5kn ,}-Zτ,V>͛7\%@O駟;/׿V1c=bѱ.T9 @@NWU{owqG4i$wٞ @T`_~9N<7n\6~x'nhL'O/w]wU @ @~1`qM6Ymb Zl֬YuҞU =hK/~ʽ}gqGD&M\s@ @ w}7;=|k @ @f̘G}t<|k_;#6t9 Q"6x?~t=JKK2 @ Шbx7Em۶  @ @/,0 F @ @ @ @ @A~UΕʕ+5Rյk5,B;vXq4&@H۽.)STO>1r8ꨣiӦU9 @ @rС=#.UosL @:Ha_??駟o8|&@^{,1?pF @ @u(fA˗/ 2dH @ @@}X^-s%@ @ @ @ @ @,]4JKK󁊕+/^\5m6 X̅)|GQ\#Ԛ@zW_2N޽sύ>Ϫ8 @W'+VX)GA}n  @ P(}Qxqw槴V[eo} p_-婧 aY@ @ PI`ѢEDzeˢO>1mڴJWU  @ @k'q6. @ @ @ @ @ ,]4/^\eK,Yi;~pmMi+//ϭ\2RhSΥ-=h:8Я_[YfR\=ϝk޼yTZhte˖ٖiS !/vWW\]4Ϋcǎ S\Sbnݲ; @^~ꪫ;Ⱦ<8xʧ  @|!9sĀ"S cȑ_ @ PHSN fJcذa iB`}n׿}n-jj}Ҏ @ @ ?x6Ę @ @Z1e @ @ @ @)1=t?^8OaZiK"W=^5t1*% gSPcꖮz.ns6mdSB@H`~֬Ys`j/>=2ۧU%46@ǘ1cmݪ\s@ @ WL2%k>ĉI&_  @ @?x:"4v)N@}Hh"}now>ǜ  @ @,pó5  @ @ b' @ @ @ @ S =8>?ϟ??>} \\lYa.fUTTiKspgZsD&R8Z fL[۶m;n׮]vonU7k֌0$Q9P1ۧk^oau ܹgSb-=2ݫ @_`ƌqǍ7§:ď~8S_rk @1vni<{:ڏ  @ PH˗/s=7~_dJsիWu]nTͅ: kש  @ @/ &|A_&o @ @@] +K @ @ @ @KO>,*7o^---WO몤תUlK{zn;עElٲqZ [uKT>W\\M6~M\bmyUfLEVXW[Oko՝]OK.m;N,Yyܵ4.?5Yҟ\0cگo~ܵ\=T4w=)sUC/^\m,P1Oን=zwY!@@z}ĉ1vx?=`߾}N @+!Ν;W[  @ PGG}Nwߍ=3Fgyfɓku]u @ @'п֭[;?xO @ yE>$np @ @ @ @I {YViii> +K[.p1.\nj|;ft0dz..=d9m)cz BT@ MLl)-Wk)(t]EEnKSd!w!;}:߃BzU\Rk+,~ՆI_wT+W_}5n喸"}/YA 'xbhN P/qD O_g}q衇VKm  @ P?<|CSNs*&LȦ:mڴӧO}9 @ @G}85cw_Ϟ4#@ @8A䕶L @ @ @ @@ {wl3gάBRXVMչslih5SBRc`\=SPcY=OV8WOԦK{U91t>W_>]mѢE]/(`|b.hq9s"V?*sؤI= ǝwޙ0N:3woqf[=>s  @x7b]vui*w^Y @ R}K.W^q]wnlM TK.1o޼sm, @ @-? /0FdO @X թ8G @ @ @ @ Byxr3>6C Vx㍣k׮֭[H[:Nʡj A ?,14VUtzx:!iٲ熨muUke˖Eiii̚5+ꕏSbM?[)`1>تUjIc @zK, &d<@,]J͚5:({X#Wq@ PS)|q]w_={3  @ ]G:*gRI5jTy晾/j/~Xc7VrDyB @ а~K___7[ @ P]AԞ @ @ @ @*'Ĵi"=(X9x1]_ߒ2Rb.GU8(Xq}#PsY8c eL!ۧsi-\1)͛7F4i)X1,-  Pk{,~}ݗ}L~,|#Ν;z1 @XbExCe}/&Mmڴ1tD @B(--Oܺ;uT\8O5̙ U\5`1w>=1*Ut! MA-掻w(_jOZ }?1R[nq1_c @"pYgC6~!"S @ YG裏\F|0vqǸ{}!)Su]u @ @-o|# b\tiL4) ԰lu @ @@*>-A}UNzoCB@B׀i! -<GW )PK1^P#h%B` !;Sɨ@IDAT^LzL2$3sYv[{LΙs @ @ @ @ @@ TTTkjV~nӦM 0 "մ{d)Kv:mlذa`[p3;=iܳ6z @,Vʦquō7ؘd @su5\/vaq}ŀMv@z}nʥ^wy.  @ @|?^}M-:A" @ F3Jcx @ @ @ @F-0w?^x![[iӦm+u? \o6[k;.BRc=jL~?<1-kRShbMJ?|7jrJIA={~eeXL  @*VO#E @@H/[/| bŊHm;㷿m >@ɓ ;# m  @ @8 ĉͲ4v$@ @;$lN^;Ե @ @ @ @ Pzng͚U#uANڵ"@+aÆ3gN̜93{/RnZmi_ p\r]-v5zQڥKH) @@i Y㩧5kT 0hР8Ӳ`CF˖-1cFvPnV}z7{Wࢋ.{'H =Cz'@ @hPw4}kq77  @ `F bl0 @ @ @ @ -[SLɂSb|6ѶmJ~ 6LeQU@cX7o^^ IYzu|Y.]D n,hZk*8 xĉ駟3fTKB /tCe @@c\aLw7n+ @ J_zqqye3x׳s=1bĈ5Vi=\ar  @ @@i |̂7nb a @ @V1nN @ @ @ @JE`ժU3_׬N<9RcuUV1xB?oy՝b;@l 5kVCSMv ҽ{Bb TCvZӧoٲe$kZRbq@cj!ۋ@̚ŋGofMnzlXy_6mjԷ @@cHYb ]LuΜ9N,>8^׶nݺ @ Аڸ۲!ӟhC66 @4x?cԩt83~\wu ~g3 @ @:thg?&?qDAc` @ @`>L88 @ @ @ @ K K=Y VuU|T}ڶm۰&e4hd)rbٳgk=:d[؞`"e,YYxcqHc Ǵ/ Ǚ۷oEpc kؘoKA-Z;$w}7{ ^Ǧ /Dz[]Ia45aò iN Иnw yq=ߘ` @h+V.,F]wyg%pYgş_= T_/ @ @@l)11* @ @J1VJ @ @ @ @@H!O/b?>&Mj{Yy͚5k8fE:XreB++ZWNB +wԩA lذ!,Xy`cLU7musSL]tɂ kCe:4m#@3gN8eʔxŴmksΑ9um a51 @ C_  @ Pw?;Nlܸ1t1f̘0`@]DO3gΌעE|6F @ Pj 7x#bɒ%ٲ ̗ @ت ƭI @ @ @ @@={v!xsV;+ ;.[v @T֭[[ WLA/5QͣgϞ,͕S Zs7RgƭXEѽ{Bxcq;kL& J =z".tmƑGG}txFz. @hwqG|M6eSO~\sMSy @ @A;6.Fi@}ѣGGB.g˳.?x{} @ @42[y٨'N}^Mp  @ @ݲ~; @ @ @ @v@ Yzgt㧗_~ڋ0 Mzҍ}د_jM] ݰ|޼y~RP|=ܼ6&]vSb`|O>Ѳƹۮ]߿Vk23A kL~%Kj{筅=WcVR3V.&u4n5k+SN^z)[vh[%=2dHxQGeB @T~W\QͿ a,<  @إ#FO:^X`A|_"{KMJ`ʔ)q @ @@i s1K7k @ Pcw1  @ @ @ @h)(Ǎ੪qv1 ]<餓"ՁVumhr)p<`"֭[W빧9N<8#)h*+WgΜYZŴ\jUܪU(//B V۷o/)JU`͚56.Xηeq}եKBxcXݲ[nٱ۷!MV >Oz!t1/ŵkh޽{>89,t10^Bk  @Rx'bĈzl)׿u)L  @ 6n_[n)N{7:tPئA`G<쳡\zL!@ @(m>}Ĝ9s"}wm…? @ @K` F?  @ @ @ @4 7x#,瞫r̝:uN:)Mz8  АRXOEEE!y%Kj=Ӟ={;>dAM´hD .̂ˊ |YQQ]=M} XLAm۶ heee5F MR-i,n+W%b1{l֬YtԩڥK~!ۣXXU}wߑ۫gg,t1/Խ[b: @@%qiŊ+=rJ\U @J?>}os̉aÆ]wk7B_|09Q @ @@8c 'NA @g @ @ @ @].n?!xgO 9ꨣ Ƕ8ԇe˲o @ @ 40 @ @ @ @&n4f̘; 6l1ţ>:!gmq A;(Wn|v4xX)W^+pN!>)xV!@@cXvmژ4.Z([/^VnT׭[SߪUHk~mmٱcH^ >;wnTTTduّjZM0v˖-j (.)|Qb?z$@ 5ǙgVKG֭[o4 @ @` {ʸ #+ߣEm>FvC9Cm'@ @(1?>&L:}L @F`tjvL @ @ @ @zxwYNtAY\)C!@_> I_LAՅ,p()rb/fru@ EHRޒpS ŋeu?1;n:nXСC@ؘ.i{ S4UKf ,ye2߶dɒ:h߾}/{f5LAn[':!@ Pkqg>XzuYgUV[ @ Pmo|iӦl=}Cl[:uj;ooP @ @JLਣ*1>쳑>S @ @;49 @ @ @ @ @Ro~,q[\/_\tEY~ q,$kk)t1ck[RV/S@ON(++OE)0w߽hk͚6l(3!)-i=)qGJ Lu;rfiӦΘnD2ɗRڮ]v1[Abذa4JS ŭl~Zm6 X0+@-{YёZʘ3.]4ۖ?ߖ)._P-WTSy]ĘK_Z;OvN2͛7)k;`9J?ө\2VXE縸l>vFIz*tCݧOlv,;q  @/0f̘8 'sw @ԋȑ#u}>^ziv3ݎ;n@ Z̙3#,ږ.x|Y]vOMX jSRX]\yM7|lz ѫnݺ&;+4n:V⚂B8Z^N)r-ޞ7nM6jzjVStqI05kd7͗G(6mZa*5 @ @$dg2eJy= @  @ @ @ @u"BEYn ).)\.+"XKF(B~ XLUے’R(O@阪j{} @h߾}Z^^#ovN Kϯyj=m++Wl=˷e K5 WIs~.,;vN:;w.]l7 @T'p뭷W_]x}z]wo  @4~?y1bD  'Fs=O L_.u @ @r:* bLߏHO:C] @ @@ b,  @ @ @ @V <#q-nС/})9(++b 4,TQQQR,UrѢEu2ݻo3`O> P)x"«<13y;/oK˼Y&RMUӶkcJ%g Nڶmmڴ]vY8h/w!RM?oyb[!@ @@} \}W^)QcD @MBYbUyb.]j}- @ @ @@i \2>x3q]wE]T fM @馛W^}-6mzk,X {تUU)i꫱q (m '@ @V }213fĢEk׮o @ PKq6K @ @ @ @;$Ə~;cՅ>Zh#Gk&;v -bŊ,`q̙-tCږo5ݴ,+gAybZ桋=zf͚r'@ @ @U ߍ1"yl۶mcٶ*O @@a_ׯ{'ih׮]m)+6 @ @GydĸiӦ3f̈vˣYfMfH @ C點]tK$ @ @dK!@ @ @ @ Ʒ?o.7R׾5],H`jgΜ3gN0ږSbu5,R @ @ @@)wCƟ޽{)L  @ @`zԧ>^v>,q;ЛSuǡ/Bcq @ @";.׿fW;wnse  @ @ 0e! @ @ @ @ 6nwuW|;˧@*ѣGْ@XhQgώf͊tsږ֭[G>} WCvZK9 @ @4 Կ˿Ŀۿ3r}6  @ PY`z* c|7wމc=68p`í77x#Rc*_i @ @ԧ^b|cy9} @ @ \@c  @ @ @ @@] ?>ԩS ]l2/Ʒ,xCNXti!D1)VWW^]h"z̀FڬYZ_O @ @ @VZ]tQO*Lfx^ @ @ ߿ꫯ|1>cqlTkV[hk @ @N 1eʔ)s K @ PK7m @ @ @ @x7ꫯqm63<3~ƠA6n@]\P+Vr)4gϞ,one!)Q!@ @ @F`ܹqɓ[lկ/  @JF }'O<1^z饨aÆţ>rH8D_T1(4 @ @"pG F @(mA= @ @ @ @@  o1~ڵk 3??Oc)l PS5kٳdɒvuEb U,}VZm;  @ @ @xWbĈfw)?fu{% @ @@3&LrJL<9ϟw\<#1dȐRa(yΘ10A @ @{#}>eҥWw @ @@4Q)& @ @ @ @_j0F͚5+l ֭[ X\pauy0`¾:N @ @ @_gcٲeY}cATw @@zyꩧO??OСCcҤIYݾ}&4;S!@ @/;.׿fϙ3'zU_/ @ аFl3: @ @ @ @vD୷ފ*y[?G|ߎvk "}l֬Y:{B;>o޼شiSQ͐CkY5 @ @ @NH%p qW8>$@ @)бcs~z<t8餓#8iNf5cƌl3BK7] @ @@- )SkћS  @ @, 1?zN @ @ @ @@ Owcʕ'|r?Ai4 tXUb8s̘;wnږ6mTnܷo˝:uO @ @4@+V%\w_at\pAGm۶M @ԅ@vN;-&LK,)1vauq }"X?2p]4 %@ @h~xa? Ƃ @(=A1 @ @ @ @@x/{0gguVaFX`Aa-VTTĺuj=֭[G>} Ymݲ}]vt@ @ @4Nwy'<̘:uj6͛~k焌 @@ c|SO'|2-Z'xbb}/1hРy @ @`ڷo=POǂ 0'x": V. 8_!@ @ PSf͚cҤIƒ%Ks5=q @ @@؄LS!@ @ @ @(M6-]w]Y&xVF|ߎ֭[N+8H1T̗˗z4_ݻw,L8l1ZӧOl#` @ @ P@z+;p̈#??ݼ A @;SC1nܸ8o[̟??>OœO>kR8q=eoN'@ @D@IDAT(5>8 bL:ujs1F` @ @Gǀ @ @ @ @@#K. &F>x5jTRsիWG S̃`˥Kּӭ٭[ȃ)`QV"@ @ @v@ C8s^(\FxѼy6  @ R?1>31o޼8駟 3=n  @ @ ƼKs K @ PbK7] @ @ @ @-?!/ŋ^s5q 7DYYY\~ڵ+VhѢ:jΝ#)n-d1kӦM\O' @ @ @3fL\z饅ڵkwqGyY} @ @ t1ƍ| 1s80>}Ը:{/xGn L @ (*16I4 @ Pkf>*E @ @ @ @ԫ5k_?6lXa[So_>̙f*t#oQСCBn> @ @ @@z/뮋o0}'?ƁXئA @yc^{-RzOFnrce3 @ @ߖ:v7n1y @h[6ٙ @ @ @ @ oySL)L /عs¶ذaC̝;täږmnX]bB @ @(~ȑ#cĉnu @ @ 3{:th1mڴ>|x<ѡC4RC)HM7Oe=(ޥM @ @Fڵ;f̘]0}WE5:A @ @@tK3!@ @ @ @h.ŋgK?|m ML7Ƀ WL̙ N-eeeQ^^^eb [uҥr> @ @ @<qܹs9n:~??79 @4]}fasL$N<98x衇M6Mwxf~aa{A @ @`{>,qժUr۞K @4AMA4 @ @ @ @' oƏ~ GƦMb t3X~}٪UӧO!`1TLyMzQk @ @ P*=o1HOҿ=!C y @ @@kbO~2.\&L;/hC\د_6h\r%1{-Z?g\wuѬY7W"@ @u,<)wuW/tW?pzz| @ @;"pNKA  @ PzK17c @ @ @ @*0~8#&ҽ{=ztwq[ҥK7 XL7̝5kf5m[jVtݞ={F Q\C{醽  @ @ @@Xvm|[ߊ'iӦl`}{'?3P#!@ @6lX5*F7nn! cX^ZO @ @;"Я_֭[,\0N#]8 @hh @ @ @ @MCn/˱aÆlBx`{QVVO=~a-,X)`1?++-[Qu@ @ @3f̈ . ^x•wuWիM @4s=7g,l:W]uUEqMaz~A鳩  @ @8蠃'3gŋK.;ڕ @ @F(hA3d @ @ @ @-r>f?~|aR:t{/t֭XUbږj֭r @ @ @h`|+bŊldeeeqM7ea͚5k`5 @ P7~7|slذ!FO3fȶ<> @ @ @ Z\r%1y©|p}ݑ  @ ?,sΉM6ŷ,3?H^/^\s΅ @ @HA&LN>}zs1;ڕ @ @F& =`K @ @ @hL)41'iYU"6lP멵n:Smbؽ{Z_k{:Hw\i BsƱ @ @ @ 齸gquի-Zk6H) @ @)to^S0Ƌ/8g;;-,YRK. @ @HAy6m Ò @ xM @ @ @ P3U,VY3gN_֗oժU!`ڠجYZ_.;?~p Ɓf!{]^F_ @ @ @%$oe]O=Tao}1dȐ6  @ @jo~ꫯƨQbʕqgɓϨV}u%PعsV? @ @%,P8}0u @ PzK17c @ @ @ @@)`1@ʡuآEݻwTد_f6i_Ϟ=\bE;/^'tR+=3&L}-:J @ @ @@y__bI͛7:~D6mj֑ @ @ߎI&̙3㬳Ίz*ԣ@7t;tM @ P*K6O @ -Ml!@ @ @ @49tCօ V8{1)h1,[Oz*)nUSc1lS,;;'$!1 B( aQ,o%HP FMPgX'Ev` $$@:ޢtWwWuys}ou=4H?xR/->lD @ @h^z)>6rȸ㓟da  @ 0]kk׿5N<ĸkv{5J`ŊzU @ @hbȐ!wyƞq @ @@ b @ @ @ @bӼ֭\FShSb'1ג,:_'H)qĈ} @ @ @4R`q饗ƅ^A{lL<9z3; @4hPvm{k3N0N3 ! @ >͛Ψ @ @m_@c @ @ @PGm5{&a XLɤ4 :z l ׿w_~νlMC @ @ @HOn @ZLG}4H}x>bh'*b֭[;kI @ cƌ)\BcB @yG  @ @ @ @X`APz!m[ X8p`@l-d1,vҥqF ~oa;v_nmYN @ @ О8cW^)0N1mڴy T @ @ ?'x"?믿_{N:Bl}snO @(@q?_3; @ Ph @ @ @ P . ź˗/or{BSb> O~*:u*~͚5  @ @ 1 q4'@ @\@c? #@ @ @ @(SbqbϚ5.-guMBkٳr< \{q=|cʔ) >֎ @ @ @G`qEɓcʕO1mVu* @ @@y |':Xvm|k_'|2\^ 1&S @ @@v©RB @}AmC @ @ @ `e˖śoY-L1-KR,ӧp,|W^ ;h 9sęgYT eL  @ @ @bo=N;x GW\qE|/S!@ @W`ĉwG[ .uر5k* @ @*6N!@B @ڴ 6x @ @ @Hg**\p’eYaâŒp;I+r:*wVhK @ @ @O>zj>!kc׮]3όs9'z葭6'@ @\CW]uUl6u* @ @@ 4(p@ѧ~zۿ[5rnLZگ_BK-ZT @ @(ѣ#0gΜXtiA @W@c>-#@ @ @ @v,||,H7ȇ,6WСC Ĩhk֬N:@p%Ā * @ @ @S`ʕqWƷ(;nK//| ] @ @6$}.>k~FN]61Wv @ @ 0jԨx衇:cƌamG @ n1G  @ @ @ @5k+/ϟ?$KAY=6,(`$NN>lNw}8#]E @ @ @8_.ַo8⤓N]֫ @ @- Hɓ'YgU7­OߛdEc&aN @ P*ѣGNb,p @ @6) M>V7E @ @ @--gϞRbqbZ-7GbqbV}ii #f@/\pA:t]vYB @ @ >~8S+t1Əwb* @ @@ݻwxO~2֮]&M?vqǶq-p+\eѢE  @ @R5p3f* @ @@6"@ @ @ @ dYb񼸾`\W^1dȐ6lXdal]% Aɓ'Ǽy}+_]wu؁ @ @ @ ̝;7.kb͚5{/PQ!@ @mS`='_+W;,{ڵkۼUq_ NG @ F] x u @ @m bl] @ @ @ @VXgώ0lx7pmN)D1 R9hؙE@K+"4Hk @ @ @ҥK?aL<9/^\hȑ#/֩ @ @m[ /'|2E]iavJ}t @ @5jTt3f(U @ @) m>WwE @ @ @v+||bXs,:`1 Rm۷>7N-|ߏ%Ko裏-آ-ܖ{ @ @ @h5k뮋I&Ŝ9s G'98S[n* @ @@ڵkx},V^_|q|_~mxÇ/7(U @ @B1`xw_.) @(crۧi @ @ @ @ /,fAuKسg:th)[,hs΍#FD=ԣG1cFCۿswH @ @ pwYg?|sqG\XB @?>;˜|ر?):v 6S?ŋǘ1c}ﲑ; @ @ZvuxGեwĻvZ~V @ @/ps犿7@ @ @ @-P[bm! ,(}fmY>H- T9ׯ_I$TW\aLwrq aG @ @ @xGbĉ>[ouju @ @ L4)nx饗"}8?v|g_ٓ @ @@Fb\vm1f̘i7 @ @1V^ @ @ @T@mgώXX^z8lذl.`B>@IL/^W_}u5]vO?LZ @ @ @!;X۪~=K.$vmj- @ @[{q5ħ?Xn]}/|!޾a6p'}lٲ?~GL @ @F*֩ @ @{0aB\{x7wyg.5*x A5|, @ @4M`х˅zVYfM~܌3g믿iާO8]  @ @ X!J3  @ @ @ ˖-*5=zCCͲyqbNbSO@c?яw!<ƞq @ @ @e*6|'MV*2:3uQѩSz @ @@m\rIwozk|j]N`-,8̘1#>U @ @4U`M7ݻǠAGYfg(1N;xQ @A4 @ @ @X|y̙3'`AS#$wE @C9$g{# Dž^gh?1>s) @ @@~abݺuM:Om; @ @e.!EA)(< @ @ @@ X={v T`F޽cС YӧOI$W_}5F g뭷^x!:tP MF @ @ @ZRW^`|w {#?8묳b* @ @Pw1VZݻw2}_ @ @ؐ@S Ʊcn貶 @ @e*a]i4 @ @ @!PWY/KQRbž}rAv'v1bDѹs9sfwnp @ @ @ +1C??j CM'@ @U }/B̙o=O6uaM7ݔ?;SŅ  @ @*K }v}W]uU%; @ @-&ps  @ @ @ @,YR-H7߬uT{5`fb>}*LRs  PY>`>1zXYOk  @ @ @v.s=7FΕ> @ М}1nܸeN>x'K.yي;G?Bc=&➠ @ @ZO *eرc[f\ @h &9 @ @ @JXxq5~()8qذa )Q!@]h׾B] @ @ @|,XSL/<ϟ_hhΝs9GcAE @hn}O~xG瞋S 'ܗ뮅>1a„²  @ @k'>ӟۭAz;C @ P~J5K @ @ @ -jP%K6Zgfm֫WZQ`͚5ܹ͋sr|RD @ @x뭷.:/^\`=9rda  @ @׿?3f̈޽{:+W~Ŋ+bԨQ/}5 @ @|oܠO}S?q @ @Un*uQ @ @ @l@}ofiٱtҍ8kݻ۷΀aÆ TH!xB+Aj7 @ @ fΜ\rI\wuN~xs93s @ @Uvu8C[ns~4iR/ڵkHF>`>2P @ @4D`}]v%}ц^>cǎs  @ @@ b,g @ @ @ڬ… Ybmnٲe%1ׯ_!DqСkK={,*O෿m_ u @ @ @x/_jժBuGuTL81FQXB @hM.(~իA7bРA٤{bL#,i  @ @@y {/|I}ݛt  @ @.WZ N @ @ @@[X`gϞ]M6d)pQb[^`뭷_~9t͋ @ @ @?[okԻw8cO!Cֻx@IDAT @ @E㎋'x1eʔriZGl/}K_ۤ @ @#bvixꩧ~;H @͂[  @ @ @T|X X6lC{Q9 o_|1ƌG?q @ @ @2{cɑe N:Hu @ Ps̉ѣGҥKk׮sȑ#˵-ڮ5kwߍܹss-#@ @l/ˍn?ߨcD @zs @ @ @+`x7!g.Գufʯ[bEI^/`1ֽ{\I @@Cb @ @ @fXzu׿K/4xjW2dH~qF޽m@ @(G}icʕqM7TMm6u)wߘ>}z̟??xg}Z.H @ PrH@^xaobwc@ @@uR^M @ @ @J%@l^3lT 7`qС&zCҗ7|s=Xu>zun @_˯aZD @,Y^{m\~1sT=zt>#nݺUf @ P/*yرcO?]-$ @ @`Μ91eʔ ,<<8蠃!6Z @ @Tw8s-Np kcРAttMtҥ.XgСCJ @Z[ S @ Xzu3&^y商һF# @XA4 @ @ @ a~(R+Wl P-T1)(`N@e./[oowyg-X/ @XE @ @ p@>q=,W!@ @TEbĈ1ܹs⋱V[U-_Wz/~d箄 b @H-pGׯ_:4̎ @ @n\& @ @ @mI XB Z\jUo=u8pz,vڵs ׿nxސJwܸq > @ p 'Ċ+Z.I @&v~`|1zqgvmWm @ @@ 7N> bqԩS+J#<ӟ1fF>;[4'@hwW^iw  @@ַ7hvm *; @ @X֏G @ @ @Y 8o޼(V,gs̉R,4(j T6lX~}ږ.]3 @xG me] TƌǏoȮ!@hSO=Uc+$ @)xcʔ)1cƌjsLtI~6Z @ @!XhQp qy6V>Ė[n?㮻3g[lѸUQ/ @J!0m4Ath]v' 5`won!@ @\@c? #@ @ @hy8wHAYbqbV뭷bMn`ǎcM7$fEXs>dȐٟ  @cXB @ @ 4W_}5ʸg3fL|1nܸٳg&u @ @@߿p ~7V\\rIL2MTzfqǚ5k'Mx|СC,6 @>䃘S3<o}~Bε^Cl'@h%}ŋCP<ӭ %@ @OC\uUqwڵk{r)~Em@ @hov1".]=z3gƦno{7o޼b-bŊѯ_x7w<-}Gn= @4R /KhF7a &O'N! 3H) @ @@E ܹ @ @ @rW3`8l1,د1:u,6,k-@B;3aL?Xލ: @ @ @@ ,^8nƸ瞫*p衇M @ @ &W\˗/S9ֿA?6mZ,\0~5 @ @8~w*oƺp'@ @&  @ @ @ړUof*fٺy$`sΑk*ui;G^  @@x M,]4֬Y8 @ݺu4) @ @@ <Œ%K5`6o|q1m@ @h'tR\ya8qbtҥr3Έ믿>K/?>z]ޞ+We˖gNh}m @@k N98lرcf @ PY+yi- @ @ @M\2̙Skbov[ RS6lX^8h Mv Pyz#F(ԛZu]# : @\&Mj  @ i;#'^{?蠃"P @ @9rdxW;47|s|_}vZ3fL|+_n)^_{n;ը~~WZ"@xEE>}*>(7O<1.XpaM}k]o% @ PyZg @ @ @xኳgώ,P{wJإK|b`pŴ-,vСl4h] 7߼d)EtD @ @ @ ̚5+M^{mzqݻwz߾x: @ @@ SO=5ĘVAAU@~L>=֬YcR @ @4T_~q 'E]T!ke @T Ɗ|lM @ @hY+V Ӷw}$ ڵk隁˩馛 X, @-P<@Kѹsg>S:! @@oP @ @,vڸ뮻bԩ>?~%nj_7n\۷x: @ @@{WNOģ>{5ȥs2OzE)}ܿĀ{  T̙3n=tu"cӲB @ tmǍ'OUV8Ӛ~6p;.O?pKqge]- @ @گ@6>{Uӗz|MYl9nݐG&#\U@ ܫm۳R⩶ٺln/gB @4N0ss @ PasDH)L)׷|yՀK< zֹ#* HN"=zDxzZJ - ~ls@ NLgϮ X@ŚHha ξ<(  @ @ PV FZ?1gS `,ʷYߥKU(!i:jf[n1bD<7*Yeow_ v܇z1a„|V @ PGuT>1u]'_OcniӦN;+b}~5 @ P)0oɒ4^֧6f*Xl5)]r}viflx|)11S/7P~ @ Ж1^ @ @@X,bӢEieӶC)O&=4g%u2'"eJy6շmI)u6Q @@CF,R+hqieZ'aÆOai? @J Ғu  @ @ZE`en矏x_xᅪ嗫JUsVMO=UNթcƼ?mmDR6@k <_nJ1-*:u}79>iY!@ @h>ms_dz>_bvk VЙɓ㤓N#1| M%@ @4@-՗͟&?R=͋ٺlBxms4-7혛r)eXR4g\%0YؘׯjL>iWM?6r^ @h ƨ9 @(#yjJ4T\3h1[N4@EXR'nr(r(wR=u hԥKվiƧfc S (^YO׮:6ն}͚ի#6vumk#ϊUSdRwI>Ml:AyqXc,2p`Քճy^Mc  @\t5CŴ>/Oa+A-`q6[/tД@) @&P1]1}#}O<1ᄌ;c޼yC.o @ @i|'Le,t1->nVX|髛lJcu_m֥q꛲~>i9Ws8`ܼj䖍Ws ~il٦~zmi ԇ1Ҿ*~.zgM}2~ٺ4_әMUɗB @J- ԢG @ڸ@~1wn^Ty*^΂yc~KѢo߈>}i )-u(Y,+-#PИu BS3G@ZNa/9SBcS'A$ fLA$~q1O1h;_YY,T17F\z\СCSnHndaÆ֥zz( @"=}${e @ @(sE<`#DUi@ 4Җ[FY5O4mEUb `LfIY@4͜?JU= T\R?Q5r%11vl'?vGxչwuWg?T_KiO>thd  @ @@ |K_O>9կ~]vY] J^믏]v%^}-<Ș>}|> @ @H㔥R]ͩfbZNcdIx}髨޽zZ-g4 NX<֧pWFC}5>c˯u(?Lce5i[_/ճpa9v]5ӔiJ2 g,54_ T @ @ㆄl'@ @@`ʪ<@@ـ@i "2Qc:uꔑ#4Y=uYbgStil Wn)2M7GYz0c h,jLsa$gl]В~[ZgcH,v穞ME = vi P,S^qHc{/_ߴ|ΝΕZU;A ΘS4mEUjl @ f1GF @ @ XQIc̈4-z;ȥ(ŠAUӺ˩#R;G% v1ܹU?^B_xN/Y8SglٳsJXfMBbg璥ӔӾM-)`1Ye V̦.muǦ": P߁YyWb=[}\n'xkέ?pܗ5J>}b#F}Ȓ @Y{k42x ?x駛tO~F6˜&]u ,~~K so2O*~07xn(7|s~0tt)Yq}3}q5lp7hѢ;}TF:uT[=o?S}ҥ^? %|K>hByg'^z)?⋱*°E4mq濛ec͟լ-Fv昷%?39J穫TǺo= @-'*yg_?"[;#r߿VMhD cl%uAa#4a f|衪)}(J몦dOE| _i^Kr#7ɇ/ ).sz~}ޭ8u @ @#Ej8+ r/n&-ߐ2>|XG{~]\p˾oq˯iG5w_W~ߢǖ\w4]ۼi)'v7ǚ?Q%ONG:Jǎl7S4yjsj{q!GxR۱O}^_igW_/]Q>c!C\.bZU (Z?~bz64P5F_6e]@nئwUSej|뭈46_ t-n뤟ܫiZ\W{Y8c6OFH  @T@\'1Tk1 @(g)#uHG_}C=9rKa<*O'իBscڧ\.Y~MIR4wrܥ @`cV~*֜pŴ.0nc^RKBSNKYbܹs0s @v&BoE]Agy k]rzyo߾p7dűSNmȮڙj+)<mSa]1c3̇64vmW3r-T`))%r~6\!UyI'l\zf5\_׳ PmY(` ,4g=ke;y7lip38#nx=ELlqֺ_KcM=[_אm̘1#:nL?ks14պߔnuRoKjgsf5JsW[ߏw}w!9 7iҤn+{lq'gM s^V @h7GW?\{_='r߿F^4؎SOEn)|IDD8䐪˚"27]w/㷿m,KR}'r}F~ @ @)W\qE7pC7jmSO-\Oɓ'羋/v;6?Ґ~2Wo>Ϭ5gm#PyL?c-GTHsO^sisONnߏ?OyO~_-wSy{gmwix']㏏ں i ѣGwɟgqa=\z\{^+_̥ln.j¾sO~iѢEGH&' ]u[ :R4i̭5N}iܮNr% P,fMUcw/)9qRo mJ)%@ @@ lDfub @ P+OFdI׷Kȅ E(^oʍ՜1{, P#VNӆJW)4ipԙSDZ4_gψ#"F|JGrW!w^Y}޼y0uMFm\*VO} @ [0n_z=(VRHz "PI!iz(7^{&ސRGrXyTS(Ͻhj ,fWkG>jZEroYZ*/Xj~KYOMHmJkM)nSc8:hHI<}:Lhn4՗*:mlR\Dꫯ6x@n}J: /KC]O]kS\o7SzMhLQ꟣5f- @ мo~qY3X5Nnja1iw8#"=\^ĝwV Λc4tRg>":ȳh{9vܳ0x-kQBJ @ @H XL)U Czoݻqՙ@>Uj}j!xyl>ʥj~Ky?Z?i]6g>4t^ǚ?uR'>ޛsO5?m\g]o^ziu5W0}TzwGj1齕߆9k^24] 5cFDO/WS=K5vX|4_ _4(cǦ߃3 qiԟb!iׅܽMDn:K6ޣKO ?%Ӕry^1 @hέsYW%@ @C 7nƋ/Q# Ze5FCp `b4hQ)uH5|4B@H2ĺ$R#u IS82s?Y>ׯ֒:~ֵ~emHFҴ6UM6V Pf酊)֬KtMy Mm~ X[/z6 @RmM7?mۡ `K*-E%]ʖIYv̽IRW0yzq:{?+rom{;, DҿIcn^?Zu\] ذ|x [6ulytōO~np7[P=}SI?w_箾#1Pym5 ׯ_l_}N*'\/Yc=bر`3IcP,=}.^_*ڔPZTFRJ%,gDgKQJZ)$IYJE?-}G %m4s3ws}{?klgΜ339=\袑h7pԩS>o2 9 رD߲vmK/T- ~x۶K"  )?@T嗋ۈ(S$I}cƌqE|pC_%\"ݺuf͚99'       HSO'D!ߪD}Ҵ [ox㍖++m„ * N%`G9'Lh=IDog(2z"u@XFd:&㌦MM'ܦ4ckܨxnSN>G1SXxBVÇs ;S:9m?cX;>ꢛ)9L$@$]!^bТ#rRbH^ժTZf ?GxR@@8*G/[)Mzeɻ !AA7h_xѣG)O>YD 4h%gϞ+"s%Lח\z H!x7#{xj F/ ctp0 BuSOIFE,#E߾}b{#!xc6fPS_]W~n#    .N("_}5ORzoҵHzYsKhXOdbEFPtkj\[D.Xp-'ϖ%K(qw/˖-rpɒ%s΂s=WspH@$@$@$@$@$@$@$@iJcX>Kg,_wuxz׮]2w\K >Ϣe%`Ge{0}Le b@m%;>a߁Ou֛7mj^.a>cLOSG/o C2iпRA2{߬>5fI0tPҥt1)gy̙3GY'Thc20xʖ-kvX`e7ֿs\κh"i QǍLH$@)-Bp+EO N:ɎW|0!F t15nB05x6!g=jh5}e~ ɯQCvm[X>d H#     GVY ;w*g L D ^W40ח!HH eR%{R~Y Fe8 TvXA` XCEWMqG{XNÆ ]vV#<1ܑ#GZ4b„ rUWEsVTxg  _n]4iK:"@m%^a7 sT{AMo>BQ/;IHHHH!cȫ<EVE>[@~cbRq<|F_!I,S14U Mn)U*5R/gK|Zγ;u$ŋ&: @!QZcھ}{KD;kU-[H۶mAtrw ̤/X;<=xgrwLUdnԴ2~>T ɥ>+b=c{}{YfEb$R۵kgU1pʍv%k ںXzï\DY1=鸙H*"f|N;_>1G%E9}kK'S piٓ7#QFLVsg1Kg \}x~S #? Fviz)rHHHHHb({7 @#Kd:j87&b5kԪeϝe.2Ib,H 0 5g3._.b=9~"p2QܬI 0<[QF88#0q%ةIUnC0#Tq*:s}˖- : .@n6P?LǍ'}2E+@!kժ[aÆE vw^l]>A|~s[jŠicXǎzRBWqcLu:EʩJ֭[o(>W9OvMqGpÇ;A}ucnG:p @r xCWdϹf+A+ZzOW˖K"oml" ׼O'Fo@IDATo- ,[_ѹ@Z1 (O϶PYNE       Ȼ4i"˗|r)\pޭp5kР%ս{w2e@P'z-8]EN$A'旑i?3`a61Aw c|lEMO}~FCuAQhACכ9f/7H ~^!Fݻjժp=嚙lI},\lusq u։,X`sDo`5/XPDz,!2 1 明=6XLE$@?R%{6oQnִti|ZQKE HIuiaw_h#HHHHHH@>s+ -|D,ED.p؀GP+QvЀ(4 L 8"ӑ u*66#re@#c7ȦM4cF>uQc, #9 z)yW;qCQ&MEUԷ޽;rP*za@ HHHHʕ+K-d̙@|~)@ !Btըr9j$;#Idk@&\feɒ%!ŋE2myQALoHM:U͛ `y7ll9߾}YY{"}p뭷aÆCY0vQ>>:fQ-'Yڴi#KvVC\|>zUPDD$AQl͘"*V-?IHHHH#w+[o9gC~za!ttOko{4꠷G Y$sAJg{.hFAN=T$um۶mwC*Вme I B^?~8mƯi&m]?wY}A7m$@$ ƾQ[|CWՐ@V(!`:uDtDk)R$PLD$@)G>;h۱Ɵ~@bµ؏I[nM_zQvg'li$@$@$@$@$@$ P1֟HHHHH }Ad2'|xBpp&8l`uU @??? (#p|'LӦe3pq&RDч<0,8p@ƍ' p!+¾ )F[8(qgM^QElwEI=w @ УGK`Dbst K,/_\v|vwxjkbF`?asoۯF:ja]>u5\)ݺu믿^ Q#hļm1zDߥ@`*Tps^0֝Ķ%'Sshxw싨κ#Fa&C4rҤInЇrW4ώ;dʕn6M6uX0|ޫAa"0DD{LW=: @bv!ȷ{wG)I宻D̊ &tS<[oپp_kdU2qDy/r5k/ׇF$@$@$@$@$@$@$@$ obO>Bݻ <4HuCLb ˟-`R>Yv}s̔/.I2m}CLw'pV3ܤidP2|ާ94;JS>f9es]D76!W\!Cau:}y As1j) $@$22lE |D=8ߚ TZ3?$|F s,,&Կj-ʸdI*@Av {rv Cqc{ HuqN$@$@$@$@$_(b=IHHHHH҂2K J'ճ6g$@$@@)L[G GġDv1_>;ap{C$p|Eۭ :TN{N6lQopua_(,1a;},@ҥKGWK( 7&!    Ez!Y~|2o7ςtyž=ꆠUz}_2&=Z J uٴio LJm;::C4Gj",Yh/86c>AQ/?IHHHHrQ"[dWwocΥK>T*үȀ#!v;QD L)B)` ;w%5kd)7m_KRJYp @%Ю];%FP@ .3uT՗:h gmRx"ivnk|壏>*_|8py8av}s̔/.Itm6 hGل`e7e*Mq1oj?{2ƴcAmSNqb=?,YR*VhbŊrsq>J刈gS1FLu~s9w榸;sN$@HC07v_i׷+H1 @$Aښ5KL tbRCT7Lb~=9G#~(E{N`$@$@$@$@$@yeHHHHHH @P ox_x 2^gO'XM Hceʈy=Հsad23S!91ko8#Lx?h>ߙ֭[套^  " )-c.^e˖X<^)BXQWvH#     V{˭jexwߩ өe;9Q3mgQsc9F0< E~AۇqṬt҂vǡbի\ve(c :,m1pz\?D?l(:8 1nܸoAoauzؖ=Sw-^ֹߎ(W#֣ Аn˗/'7xz>t&/}{5h;Lɦل^Pm&'#g:>sHHHHH 9sDnYd>}(I%-!"O=e3y"__+ }4EP%;վKK|ߗ߼T8L.鼜KW%       '_F1Tb_NHP tw[;25k׮jlrʕW^i/Ps(9MDLzX2X{c뙌 ;Aoa>zzPP- JSMOֹ`={m7b?;yV|~ai[lbk׶NYS)lRJ[#>c;OZnm-yxɶedhXHH  f!/׮]rl^RlO*>{IHPϭ+2?ӂ"/jU~,a2c=9{Vi̞Z ^IHHHHH J*$@$@$@$@$@$@ҐsEƞϟ/{wl}*Q"qK$@$^^Q~ܮ<Δ\a dׯUJug~l⬆!ٲc mڴ+=Z;юm׮]2tPk 7 ݺuDߜdgA'taڴiߺE$wLbܬF!AAcɶWg#m̘1X-B- ۷o0skbXo5jHeϞ=~u2 @l۶"{o)*"*/?D}Mߡ9 昛75 6)Ʋd ވu>+38=DޠAKspށO#3~1ca'[k7o)[oU.h٧˝wiM#FP`=#\r,9::r\ъjժ]A9=R?c9Duyc2b˵#bкukz%]tgr#v/稏Q{Vg=|ӦM 1vػwo7իSNUW]eݟu+ r ߫&IT7!^.aݧیHvX<rN$@$@$@$@$x֭i6"o'BV3ܴid ߧk<||Mk,-*>e aʕ+/ G&er6֭D-^(nV[=7 @.7߈=,\],}T)[m?30j=$@$@B¸cONTx6+w8^;EO'lU?U-IZe%     HmRx, @~#a/'5DԘv;ƿ-RxCHH (zEkm`(8([VӨQrD:KE {R*8{! o xanADN*w^9r5ծ]d[( F޶VZhEС(Q'7 @pX>Z8ZlN(&LrTJusҶm[9#9y ]33 a//wEJ'dT̈́);d{2g5SM:0埌M=i'"oWƢe<+d̘1`wԨQI17O|=l:sGPf|[uAGuxqr;끸*U&n{3 $+E>S|~By=AxSE{HHRMwhO(- ?,2w~^'lCB6" $@$@$@$@$@$!PȳU      Q*"RT+\Zl\!HHMH[jgÈ4bC|=ሲeE A\yLJ >PyꩧdI 6m)#xv TEx!$@$@$@$@$@y@^,zK8 W\q@( ne [|޽=>g!he=G˲edϞ=ܯ0wQ]t5mVFDuh]8%p VPjv,ի[ b#~5\㬺s݆ }uH枌7{oi%KȶmstII2p3Yr Y"ΔHnz };pb^x>AY߷o_A^M>{ d &LNGN蔟s     ~+ҵUhy55B# /-Zh$@$@$@$@$@$@$@$@$06na\jY7,=z<oțoi!;vX#Fŋ`m,As=WjժVR"('맕Yؤ^KtOKo[Io<eSw~uHį5^}ˇG7oɔ27|àm<'Wa<+&o^^˙buLw;ʕ+;"'|3'ںs.}q^۷ow7r7X0=HB%AӦӧ 6':KEb]4  M:ugO[bbiB[{ % A_1LjQiNT?nv%     T!]r%X     'TKxNӧQdIflG 8l1"*wA$@$@GNi/f{ϞR%i#j|D:}o-<`[v B0 L?s1P ED͙ P?4     '3:${|:7_yl N6_~E6V?[ժU,sJazȯcǎVpyC8lٲAAy=,С%4?( 4vXW, ƍUD &:[ꫯjժmta1w\' XbbԅG4޹^0ۺs=l;g9{ҥc%1o *q@KAM81A{ bhh~^ \ߗ#u&ћwwO"ʄ?n39q|Di$@$@$@$@$@^xAwo{Ens+ !P%rY[gcSnK-H.O3ME멢뻛1cF'[*[‹a5l_lР_n#        y晖#2ꫯ,ߣ2gFZ>ҷo_ȑ#eĉQ  DgT0LVg:s,Zsab>ʩ z[ ew:nOvsv34{'F&prrРAG/yg W[5jG!?~co~q9Bev\zx|O$@%?"u"YsEjeO_ Zʚ 9UC] ۱CԘVab҅]D O&B!w=!N,ý @c]2HHHHHҏ"Sjl<_%,phm"wF$@$@)A@wq"2[2k.̸q8($/Ҩ(gR6~=aR\9ٵkDUԷL*j#x.2O#     (Տ; |~FEƠbfzꩂA9m?`$f ,SN2nN ww{nSt j3g ti{T{ 4pm۶Vxyc=&*Uw3&!!~y"p7 %K:7lؠβl;'PL>lk֬(a 6mvr֪UK30H իw-lm;|>zQWLt1}9ԁs     L-r5"enkv% .@ W^)ҢW Dn ~yȷߊr1b;ի :4PSDJG?_m /NQgiٲ\xҩS@}~p $C0`u9w"cӌ_1꫖'@'M$r >g!7 s'|5f9&Q6gf̹&\O`cJ26"(o;\p4284c& N]c{G\he˖ t̃HHHHHB'^sm֣GK|2~x\/ H Bt3{ QFVv.We}p66ꃫDI.eG?Sgo!5Agz6Odرwe#_\jcӧO+0 (ׯnܸ1J*{ɶ3SK?[# /if;[MhVO,Aױ 1"W(L1B^uqѢEҾ}{Y|yq:ds~y֬Yb8[nŭ㱮Ͷ套 j|͋HHݻEL8QEz%mvD;OL4B$@$@@XǞp,|E5͘N0ݡC $zi9]/$@$@$@$@$@cx @={D%5>Hdǎ#mGVD:  HkflȞWDYԩ"KfVSh/gT1׳}Y9r?K78bDhb,qx~     H%e˖3<#vlFs% c\P t"q-[?XAsuV#bT x^T[Pyi%B1̘1Y!_~IAɶEbPlOk[" 68so9j W7eB&{?ȰlR_Mj}nCU!>̙3}M>Wyo4`یuH#fϞmiVw'F:HHHHH (W'~]r/5fLC?.ҸHv M.M|>J.6lXRA03g%7Dǎ)پX̹HHHHHHHHA>k׶K>Ef#G SO=U0y)AqܹR5СCYPAϟoM;CʱYvj 4BS…]v,ԹrND>x^$Of⣜J@l{ıvG٤_9!2g5iӬ5%Qdd}ɍGS7;05R'07 !C8IM1ߤ[oxÆ -H$z'H"nz,G!lz >zI'E;Ȋ)Aέy ˕+'{̋F$ aq"8F^cO狴h!Mu  ~oٞԐmK=UsA0Xi[ڴS]f3+ny 2[L$@$@$@$@$@$@QR|7u)2f  4:E p'O1J9q=\zˀ߷ ʫRJTEG|B4     o0(ovs= .! pݜvp,oa2}t+([nV0g]'{=Ujo;Lcsr^LݻwN2\=z%hѢ}XA`Ν;_/mڴ Dbg_u.7LC)fNo0ҲEHi^.ap~x[C,<Ch"NDzbD.?3|Lw" :-;6c>Jc h/,͚5@dF$@$@$@$@J`DuYVȇԭ5bӍZTmaF['rY"Ӧ4h|m . 8C9kE RmZ‹۷ZʗHHHHHHHHH W꧟~t*S~>/|NPL7#2,WBgruQqcΪyv}J,sg/M>ʩ ޶mew~uWigs~^.a17o̵ꟌM={#6Aџ̫ZjC1hȑi 4h 3L1ˌ=}YV])>!꩟'3&h,m衇ຝq*Whf$@iC #zm D,:)_5ОN=5r?HHH ' ^޹ړ#KL$"}'ՉIiG{w[@8$HHHHH P1/OO$@$@$@$@$@FDfDvZQH,g KΚ[HHH =a˜8K ,|ȶm6E 8y4)P`_T9lpӧO#     "P|ykb@;N~GYf&郖w2y +믿ꫯXWs/^\N>d}wz$hٓ>a_u0LV oL:7xOZ@渖ф M"Hz^Z`ȱXA~dI1  Vgzlι-V]cRa^dɈblݺ5b=+:{EJ7t! ) F+||>&w"춉X|ی(ݟy};vnJz1HvK.Q߷K @{QDқӤ,f!O1w…KDZsi%VMu]2lذI?}7~7iD<7!\&        T!QFYY:(Ę*W&Gy4mԚ2:tH~!&mڴ?ܸq~X-~V8i%g#L_0WAˏ?#Gٴ{{ny~z T4_`/W>Ama=uމ{0Ƿof D{>=tʔ)ry ɲ[E?Rȭ w=`[XD?ퟫ`:u.,q[ay $O@bdp#D֯"U͚UxTk$@$@$*t"6رj!,׶(#|ӞT{IT,HHHHHH Ȅy }+Wڎ*nrZ_Ĥv@pE   @{΃EfȘ1Sdǎ*B%˜;~91J$@$@$@$@$@iLoX5@ jtD~:~h1כw_9gΜ)| EdmC±KlͽeOvt ϟ?_;vl۶-Ki+f ؿEY Q}gj`s( 9 Q3vTgɶ[tiz"?SO8<###b=#vA7LC?#ˆ|6l蛽ɶ;}{÷B!m4^PG g`{fү$sYI?9z>z r?9Hz]w*wy'DžrtIrGG# 'qzV[:x^~o̭ӌq,޲ek8t M4[nE.R﫨 $@OɓE^}UX,[J/i(_.8}IHH @8;iFEw]uDys& .  . 1aHHHHHH /2qȐ!v0oJEϟHo #PHҞs=y)фYad8%stZ{7|9 bی(ݟA)"]v͒Acv)x8c ꫯ`uH / /\uUj g+]HHHHr5kN +2kӧ+-oo1"8_3^ <:lذ艒Sn]3fԫW/x Bs]LpY|bh33 ٭h"2JWd c>ʦP~ L27o6OFN}nz(79V|yi֬̚"ӦMS1$^3\7Ax[jLPxCN: ]}#8̞=e˜d2o(`{?A [o}}axIv-[FUwY^ Vهyn3| y}&N(%/C/5HHHHH U(:ȦMvTF2"r}X%6y6~,ڮ!h:uĄ#*i$@$@$@$@$@$@$@$@$B VU(ĘhAJG9'Z`O?L<䝮`Q ;AoX?DI&MM'&}N @Mmǎ2gg5bn9`W^'B\l2݂,*VԮ]'UMz>agM,q']vW_}U.]*k׮KժU݌0kG}n @g뮳=#X(l~[D(˜:׍%! qj8û@ ax7>ĻF$@$@$@$@$@c"HHHHH8ODіjDxBd˖ ר!S"׋L*re ޓIK$@$@$>w|r,/8N9=+OYajJMU!HHHHHH &'*> DmށN 5k4mT۱jW^qV}A{p %396 mfr<*v[|yG51\7m5ƍ}ˁ'߃l4"$e˖RJ={H߾}h xL0A^~hI"y QXK.-5kt;sL+8 C5lP g5˼I&jcs,68p@z)K,qwCׯ&Aavn ,-26fLGyuLEɓ-j0*UuȾ}矷# 6n'$Dy%Kvx~$pQvt¡>hÎٙpdcIHHHHHHHH 4h*`)U6&= dG9Vv̂#+`/1 vi+~>9:k?z/5^ߔ_%cISbwv()_R}}cSbD:? ;餓"xˎ.GY w³;WGt_/5JxgPaMdߺu[?o 3gy)y1Lu\zWW'm͏ -"\Į3~^(߰bS IN o$xyy}7gD??y} "}F WL9tn'S~< 2m4KѤ}Ov$@$@$@$@$@$@$@$@$Ч駟Zϧ-m+Ƃ'`G9'Lyj rNߡ&ۻ7ΕߚP>LU:\O9LOFSXGo䟌17z| KiE sY/m ltʅGg {wwyLcL9cM6ާOqƠ[W_ɘ1cqƦ|Ib@8~l=Y"":0?fL2ǐqV5 g-\?1V0A8;t萜x≖_hݺuk׮Vhyڎ1EuX}9=hsH^=LdOۋ/1EN7S0=uTMME8S2^| 3@v(X;OPPK}|θ馛2sI|M$K.$'|~;Wfp2Ev=(A͌={f(H6ԩPU ,U݌-[8:kVwv( ,˱.X`}ݗ~,s*fz~, yD\q {FSOedTْQ .=C9gyDZ5=HHHHHH -٩jQ~lS"]nCzE35$P0-[wݻ g<%T'<5GΝ;ӪN޶`@4iRD;PijD#L2%KX3^1֝ytMy۶m#X+(AԌnݺeO^ dynAU0] tͨXbDWo߾} */}l"qW%2T %qUWeqJ1KZsҥNvY&{){yFʄt{AQMCGzNׯ]vakagy/o׮]HHHHrY5Hjϕ+QYXONOR3zƕW^j*'Dv~x^Mۛ7oYfQ˟J;fl ,\^?S B$@$@$@$@$@$@$@$@"Nڈ#N=ε?Y4 'w)e~f}L]tٖ`ma(o{Adq]MOFM=7O?? ہ*g\#5\V} 'D3 ƫ* m=VR6tZQ_Ow#?1t Wp(q8H&a@_/gBp]EJL3 ql*:rn[J.maz i ;Ǚ+V,+Xb7눩̕hz ry}L;iz˖ڳ~$@$@$@$@$@IxG#     g~IE:Kdר!"׋< 'dR( (f͚o'YG*'FiӦ(Yvm׫ơe͚5fDw1ʁ&b= nFI TXXr(Iu%[% \DiCHxA8qb̜P~%3N<39YnnwۡC'X8nB%PȽzzԯԵv| )Y>}(ݻ(gkQN¨~->      0G_2DnР<駟ʱ5_g… E nqV!Ѳ/_tM QKUYhQQʯ/9sy w]`nҍ7΂ɶs>R_tH5P_zQ.ZHF-jp,[,u֍8Y1mvڥʹՠ^QA$]RJ5k}6|3,G~;v9RΝ+񇛴PBrO꣞t{wuhމ7󘘛n/(6>+GMN,WVMتvGAi386P HHHHHHr@v.]ZW[;v0P;a%\"j& @#o|r9gx"D s#yہ/">}DY)Pi&+ -G7xb c9Su>ÇoO7lUG++I\:0+V7i8)]he}ˁ%U܍gwcZreCP /P}QYf̴6Wp41 F/6}W:ZwkTnpoBs[je}}$ m[֮#?S{ΐn۶mV _~eYn c e|笾"E`5"]{WtDSTM6s|Y!        G@b\zu'M ;>U|s,;aE #hyyrN߁PI'2IQ0ڣ-zSٵsWp_CL0G]3[ob;Sw^B Iz},$r6=]N.cLD@hĈVٳ5VHB'0rH^Yar"<"rI.Og ;_ؾ`/G^[3q۷ۉ u駟.gq*U "by|et kYStf = MqO?ر" d 5*7\l; @8B SfHHHHHH FܥblݚykGMWO>XrrꋜuR_ta37_h@0/A(u[oU^z%w=; pԩF- 6ty |`}|TMsG͛gU߷\r^^zuio!7psjyg:08!X8gϞD.үJ4i )6w]tq1A!zqǹ}'/˗/v7nmwzz,̟? I&Yr7l袋\kq5ғZƽcyT2|Yx5Ax)YgX<ԯ>]~/}CL˩¯ܖ6)#즗M& >? 1x㏞W瀐 qNj}4S @rOS׿D9HQcDjL.:ʔSP$!t?,:t\wuY;ˁ16tWQ^Fз>X?wYfߟ' V"キUmVEݢٻww'>}x"        0E`Ϟ=RD +͛[M<w A1ςm$@$ _ S'֝u2ӟJkNOn@*9 k5ٰ81^~e+{IΝpN$Mj?̌>[d@dgnRt㏙sj8~i!9?P7g.]l߾=Bu ywF,VQ9P=t!أG}we؃o#M69 i"1MsY| 1uU<0?KQ Y ogIHHHHH PqbELɬkR8"E2s)|9_|ԯ_ @'4@wSqc, `BlrС+gB8\r%qu"PSR[R5c׮]ꫯvͬk}9<A@@;j{RvF#  d&RI/L.t$a,^˪TG>,QuܹsDWF1̴iӴr`uNd8q=ؠy6ॗ^ kZ}UVN;dzO7z,f,%lG 3s"q⋃Ο?_Æ 3X0=.Q.VjS˩^z6vӒQ[O<0?ɓF[n՚5k4o<7N7&pzxjҤUIE~m;O"D5]    )РA;-@@@ȕ>*ž9묳g:#@ _x>.i[7i0Hq$J1U&_4I"Am-[#]`CW9]<5P- `Sʖ-=СHÇTWkWil6Zbd{u   @z "g5   o%_D~앺uSOMn'|N;4/( bsrO!laKgAirGՔ|͍5kjٲeEh駟m{Wu- kZ)U=\+?~,Y0d)fyiРA6mΝ9rd%ų v'6۵kw6ZI6BG,/WH&H<#1@@@@ pg[9n ~LkN=:lM7tzW@@y$D6fbD˿vljԨQoժU?i*]t    .`߃p@7!@s" Z411=̟xbNM:U ,wܡx~nZF q/Kf*}}ժyf9[LjuD%GlxP/Mx{K/^eDvک\rD3g_U [@UH~7w.w\.4cЉ8   $RP@@@ 6mBrpEKD): ҰaC͛7k=X3gZjUTrnA,k ~ْ'b@D/qJ bIkZX}⋽Dŵmzx'x'| \]zu޲96mDl2zh1$g N|8>Q?5i$gώ/̙>}O1\.\^+Q:蠂q%TF o*sD@@@@V ;$b,k@t`kgޓ*TxfM8S@@@@@#Ojժ! #Gp  @ܵ+覛%#V'LqMYu"zd_ˣl޼9] |; fh Ք}r^{@@@@ȝ@t"   Փ?6aݺm۶tJ`|ĥI]0K\!~Ԃ tAyg3sΉ?sv  %zp6I~Y٥Kɓ$K'hL    @&Mq;Nޏ)s)Ӻ#o߾k{MԈe1ӧO~Z8fxYlQw-ٸCo    @x"UVi9 { YfAsb5{,믿Ʊ1/zd#ҩJj妛g@h _ /+E<=3zgV.8~-a1_3#Fgkڴi0oI'N͏7Nk֬%h$@2RjsI.rsUf"  @HĘw;D@@J3}YI/-iߘz+H~ht1Xr|0-&؀O>YGXc9F{ UV-%uXڵk璑ldث%4̊%j /IX.F7]3f̈Oԙ^~.1Q?#G`bT믿F4;erTR%[ŊڴigL v-$7N.(-]zR[   Y'DŽ4&W_} k̙եK|]@@~AZ$$a\,8iΝ#[Ce;vpq]?S׮]yI گ«꥗Bw1rq_@@&   PXC/!#Iiڴi?ѨGy$b>^6ZJhj޼/p[n<%zJO<?@JXO->8~ٿ/{D^:3%K l[viF7RV~gt\6-]X  ) 'v .   i*p}%Rolʩ>zꩧt^k׮F<.ҵkWmVݺuӘ1c2tzwF^38#m[Xm/o:蠃ĚvѣGnOΝ;Ν;X*rܶK"$b5 gV (Mi^MyCkbip@tr #     =?YF|s&  xI6m Aj c4e׻mپSLMKp8h /_>Uc.2w}nbo٣>1/Y7%bܸQPbd F@@@@0¿L"”\  @Ϟ=D֫~DuyM>f͒F 䨣sٽ,c%_6ɴ&z gmcrZxٳgk;v+۷Ո#H!|3'GJn1@@RTxn!  i!{Җ-^~i=|}衇4mڴlftk믿7TnTz3xCZ n8E8q?'b$eʔ %C^*ZF/5?颟\r^ܜ{|.zXzz ؏[o rxs@@@@@ATR:s֮]뾔龕IA@@ a1^ԨQ@$uj>}Zl@Zodm,g*C]{?c)5@@@@L LyY  %ХK1i ;wV pCwrMAJ$r1!&ɸ$AիA|CAvڲϲ_\'W/h-  "@"X@@HP/hX׮uj/ЫW/m߾=֭[%]z 0aڶm?3֯__]v ? ڸq#{ZzuIJ 'IΝt;|G0+7nhaJ"b&״'bw駫B lL=!:bv6X:.D*V,w2      ^2dHP  @nܐ4hT=f)zLSv6XۤIu=bĆ?>͞=[ꫯV%2;D/רQkǎ;yـ%<F@@@@ 1FOM@@ǰ8V-[1cxuAiԨBq3)LT?f^ kW+z gnIFo}D7I%2,[ݻw몫&\'2ic $of0_Tx5;S=:[%zXQ,Z(jՊ/x^O֭uᇫzt饗ԕ+Wgʕ̈́ok`3.,X-5     $=WZװQ|#3.-B@D`Æ!I] {'W^y%bD=zz*UTB+WNrK^{ t,HJJ g,     .]:X:@c@@@ f1Lņ   @ y,w˵EIPK`[jP}6ϝ;7^;w?hCX-ZPڵmO?E4UV6S״4i$ـ9\`?ޞ=f_uMbAc$i)aEC@@@@@HX%KꤓNڷbŊ4 @Hs3*TȨ'cOyj8Ҟ 6'ہ`S   P@IDAT  @leʔ 6ܶm[P  VNsqBƎX;XGId?q$eHeZ^w^:/]vջw,AZe$@͚vX[@@r MGFl  $@ؑMa{5o<8p̙'Cu*_|T{%:u }ƌ̏=:'l &Aᅬh13اt!D,_#泚ޮQFYmrع3cFj      ,7n\P  @4bĺ{Bm]Kسg`k͚5|*U(Jݣ/    MOb'~-ng   6NYf^&O͛7jW1 "_la#q R'xD쯾[/1"_dz~|^ Vzo-@@@ cAjr,@@@j pRiB>9˕}/u]|2T+8 huzV^N~Yf?o߮O>$C TN knWxV[/zLmFx>N:d%/5UJJe@@@@@@ \D@@"PB^6dԓ=nO_[nE˗v}$rƌƆ3RC@@@@@@@x wq),ĉ}:@ Xce+&@#D<ڒxԩSDS 1K2__uԾ}`|G$E6W&,|   csb+@@@ !Z5k64*Lm6Xjڴi|Wl . ٤Iȕ'Y5jU Tu>D&ȴm֮]x`0ȕ^D߶ &̜9S+Wg|3fLĺ;F3@NI;#}X     R˖-d)&M@@\ T˚5d1)Wz޽{pg}V6m ST)UzE?@@@@   %'b}uX@R xŒ6-]]I's1IKeǃ^y啪SN_~ Sۖ-[C\wuD9M1 ><|z iɒP[J\@@ȕs   @b tўu+%wgz¬[.ק?~vwaD=<Ylٲ` ݕ(Q" "7e'bYϞ=#}&?4/g2}]~,_w_kΟ;#@@@@@4(U=PO_~Ѯ]X# EAϨ'kOyr~VVZ^z)K='h#i       ).*,O?⽥{&ЩSv3Q88~O KH%װX޽{ͱc=|~*#FؽCYԪUK-ZV3F6l$@ Z  e#A@@HL.]5?~[nQl+ qj֬fΜ-4}t5o޼P껨57|7UR%sYF\sMv-[OiFV^u?=駟W/𩧞RYζ;wTUvmuYZ\?8XVm O@Ȣe6mv֭9r?,fq XM]nB2P@@Ha1ťk   eH&-YlIsK_}%+}Os` NJb5lذdǏv,YRGuT"vZ7Q>W\q(N%J{կk߾N9`>JA=se>?fұcG <;t߾}a윱, M'h͚?~vQl0aΝѴƍ{"&L~i CՅ^!Cx޸q ~6m9q#>`YuwE]Iv*ro'\wTZQ#  %`  %b=#+  @,/U._G_ASeSQ}0O2mcIB-v}2"     `m   .#MݺupB/^Q~ž@͚r1٤W_lH<#~{.5c98~Ocǯ>;\`ƬYF-xPKhq,&_y7vz12e;vzO^{-|W|`ibbO>Ç1cA'gjUvJjS@@@ uHĘז!  @X$ri~rIҤI͋/Xs7̺{i̙j֬Y=lMZV\.2eȒ5iDʕgA.]=$7r09mhT 3yuCw9H8gΜlmڴ~/KiSN|*UiB5{PZZn\ta؋6ԨQ#/hСC3@S6cfM3"     @!TPP  (PxB<ާ1 ]UV1+OixɆm^OXr%U[c F'{8~Iܸq,WLuz{{VTIӦMܹs}`*#FXxs1w}a8~fUչXY}XQ@@Hm1w   .wzKacGaAI]O.,YRwqz`nM)_6o!uVM>ݛ"VXFKVfͰQ͏=<l`G2 O>JJ.xm5MN[ӏ?DdId 4ȟ ^}#k׮2*$ҍ7fle c6@@@@% H@@R[~A-[ԩ   @vD_&"F?z3;,Աx%{     Пe)  AlO?HcjIO=%]s\6 ʕӚ%:_Lj'&~"q㓧xЧjժˊ+G{+VleÇT,>㩧>ܒU:bٝmX`͚-[B I>9=  'PPШQ#tI{4zhO޽{R'a/F^26kKz׫B Y6cѸqDYn ,`9H۷V}tQ1     1 ~vk@@r)оEAzm;17gSޯK˖-u С %^m۶ik̙3  @@@@@@@J~$C 0qP}PLMI$?F;!KONRA.͘1C\rI1/%W$ڶe3gNEq?9T:vExrLj$8z慚eym   @ Jw"  !Ч#gzq[ӣ2;vp ~ҥKnX xx3V`^2ͅ jٲew}u畂@nzK t1TXn¶   @ ̚5K+ݻw+{ァk @ TRE{-{ߦZ$@֭ժUZ[bEmذAM6kEyW%   `7n̞=[ᓍ ڵk?6L3?εkO\|#r*T7VҥsuM.RŋeX}Bmի1    &~zUTkV'ZiOrg۶m5~LbҰLvڲSV&O)S$X i XW\qJ*4&8q7_a޽{{uYgm@ l*u$}uHƻH+ TH0ƃnu?oܳu&Mx҈ n]( رO>YSLvf@@Hva%@@@ CJ=z6it3@@ɒ%t-P0ҥKb7%˿;x"nL$ c5@@@`^/z +`Dƍӵ^e w_ ӕ+WNf͚N@@ },Y ,Ys5SORZ'= 4B͛K61ԬY3Yp^[nAflqʕbzUIcb#@@@@Hd3g{DچxO8e*AF /HĘͦqYUJฌ( XåI'}TH;! cFbTtig%  #.Zٳggp ^פI:ud÷,qSOIW I%0uT}GZhj6lXڿM[ $b,TnN     pg&  ([lM7ݔmsiӦnJ@ ]rBfY`(2l۶-ZDH<'*^zIZB:4x~wh!@ĸ"uo}qYRI2@@@4it*  @NҔ)d&H61,tAo@ ^{mwqcǒ1F+6C 'K=zHq$OCH   @ X"+J5\S' @ X01֭[#@ 92a1=Lu m7|7s, *Yfn|a'_UVyy 5r܍ H8͛%a\Wd#csb@@@@@֭'[yX~};vСC&ݻ]@TK:/y=CG>LzU#څ K7ݏIrGC)WNz94@@XD |qh   _%L=&=@(9I'I++5l߳? $Hw ʷ'泊nE%4BA@@@@@`]9  o[zdxqڴiڸqc.Q9 % 4P^.< {w  ֕cc(,S~{ kݐ"i.ܹsժU+Yl"i'E@@@@@@@ ω.ڃ@ Xҧ.LnYhjF#rDm9B@ ֮WziPZzKj4G@@@ $b̻{"  I!Pϒ0st ҸqfG ;4 QI&q;[vl@ ^JܯeK |6p     صkw&܉O8*  @͛e 'MZ}ڱcGf֫Wnl.8N6o<t7*Um^V ХJ'iX@B |K8kgn^._m8plR >C[^s]bBm'C@@@@@@@ HĘW6$@f?H>}d~ _Zl P+hQ6嗥VI.-[T:w@@0n>@@@D+JK^="թ& tr5kV۰$ yI 2ڵ~7((      ޔ#" غuOKh-Ν;syr~a=chaK:c o띾XbjذaDr?\ժU+q>@@@@@@@ U <=? @l1^|dq}ƍ %Czi .xl'@Իv풆W⋒٥   &@"F   @ \vtSOI}JKJ%H&5of0t@$PFKysF'ʖnIG\9c95@@@@@%+W.>'  Y l߾]&<%[ٕRJCl2xT |gΜ%]䋖xqŊYxڵk~fyL۲D:iPڵ %e,V~]5pFfK.NM2ś&O%d `{ӰaÂԯ__Gy7q+V SA@@@@@@@ d{J2K-xE VMƀICH{KK?JhG:|DXv  sd9ou^tQ2j      Kw%xR~ƍr74rJ(yS.RiD@HpѣC?H.^FcmLs     W`͚5 Tԩ  G`…8q{uԩ  Y-bSI՚5kx_4 ꫯ)ċ䭝X׶m[U\S/pv옠CI' 7d;!X/ 0groeTXF9}}ڵkW|Ջ/}z>%8=eG?<8Ν;]ӟ4ydoD/wּy魷?%f$6o)       $5k&2:@lh%\@<#=dn+zҁ @J K/IVet .|Tbrj   @EG@@PjU=wH>^xa~͂,…u]ꫥOJJC( @X\1KKT٫Wh%Y      @h9+ %:;wnDYfɒeU+tUVkQ֭[%^6Y**U 'C=T%Kt4j1bDVx+T8P7Vy#5i.DHU/H4t#ͮ1xuUWs7x>uI7mڤQ.CMVJ.3s1>^z?gYRFKkӦM֭[l>}7 0[n?{,)c6mɒ>֬Y3؇        ">rʉ,ځ@R X{ %RO?--[J,CңJg)YBSO7  i'16:| J0[#  '1才@@@ؼy/^%KxVEgw;inW.DUrqA(  3ABo}v=BAHK@@@'`-&.һȎ.7n ϭ+M6UŰo8,X@˗/[:uD벛 TVM7I'RQY^~,XtQ֭EO0!XtQGeիWk޼ye˖}7X]%3?TBV{/YϜ9SUTAN;M˗ؓ'Ov{m jg6r1D~2X X})܂{yѢE.!㯴=g)S6l-;h9{݂S@RS~~_R@@bq?;}^Rµkfe$gv0kv/&kV"˕+=/^ܻ1vl/vv_ӱMu9'ތ7rb%*ϡGu#z,}?<=s.=ڰaC,eM^dN3g˶mۼ;H7ݺukgϟsϢM$Ҋ݋~bF{ 1cS~[,7R@@@@@THƱvMl챍A/v_^zZjv=_Uw8MY6ٞT26cvʕ+5qDo %u:YtOz쾾=1͚5nR9sd.mt-uisAkh,3 @.~W~^3~$[뮻:tg}lO'b,7 @C}wP"7 %d9Z>MnHu"86C# . xCz_tתn:^M)|trc,"    @F$w`3@@@>GDbDVsU[+CW}64Y/.@j<χgG@pl0i`]{췟t[׳@@@`sw* 4oE?MR0^z-[}ݧΝ;ϝ;W{-{コkUO+Ē8 %SL flj_kዼ}9on]x{dgoZrx$:u;zKr}8nc*?m5zտo,=.ɥY$6ڞ6HfH/lca?I^%n7v%?Փ޽[O6["eW_+_L{4jƦ?%dtI-$JxtrߝKr@E`W3Fxk7nr KJ; T~}5pɾ}8"  @z Lnk@@@ ,@%Vd8d-]T;vs*V Au ȑK|"m:rCSrsΑ?XqF=ڍ%`YO`-{\v$b}YE} ?ܚ>]މܽ)y;4l,G V:t:Wg-)?sٳ,jnoĭłd=b?17|3fxqm?~7Yhm?Čm۶ٶvm˲e˂~.lڴ_%č6=3rkl}edT@@@@@ j챍IgAV@6x?`/1رcuQGeyul<_~ҖJ**M/%K.$݂eyO V"p$C,gěܩdQqϬ(  v&L>HC̴kЀl0d/ @@@Hooڴi֭Т_~^{O^xĂ[5jA#Vy}31<}YG㏽$//}mýUguWDOgS@3/9۶m2='/.^Xv/Ŧ7[n1y-V'Kr8}dP[i,!~thر{rR߾}1C=T*UvSKz{mrJY𞯿ڛg_ӶIvi.8ީ:ü&[fZgΜMظq>kFZ oJA@@@@QiF#G Wi&/!%H%adlɶ{kE y\<iwjy&WӪU"w3g8{Y}}KOh{r6U_@@HY1쥥c   hHEO,ÖY"ƼjժI3Kh</ﵟFbC{Iҳφ}T,~zV@RZt؀G(ObZK&!]tܠ&s   d*ТE /޼yz뭈d{֭Z; X3-SÒ$~,1Z)Sx-h%'eͱK.`紾Xs9GG˹-6&;<1e˂1<ϽcI-!MT VimVgڎ_~ԪU+/1%l粰Z)     @ c lI-ȭު x≙^#Fx-і唈1`D0hԩ:餓w}mQ?}̒0ںN85`/}[޽{g$?c۶m_A?䌹מ,B@ O<& Eh*5n\(ƍ;&K^冦CiU}z @/%v_wZ$K*^4!2 J]ܽLa/)3gVl\k)R nذaOh6)Q@@@ yHĘ׎#  @ X O?=Ynٲ%O-\BT~}%^,W\];Y[n M.> -~(ώ3sw Ml|o/dZ*S Z1@HhAR.Vk|sC6b    @ }o $mg͚}_~ٛDy%a7X_ՂX@aÆiƌYGyZlƍy[;-J~cfͼ/ts= ўq^SL0#ݻwXRÎ;/E(`_Բχ'| x?x`/0%+w.s ofMgG{w 征裏/SӼy]tѵ^o]Vrgϛ}g2 o7of|:ꨣ]#^f;%DʞZ5kʂ?{'Uu/X@@ ,؍VX][b%mQ1ƨQ@IDAT(X@(JU)6193{wvfwf~g[}fsn΅x?̲}0G曙읎w\e :ωIkcw>J#Ho NJ\{c?oXi[K-Tkǡh~~cy|˦n9M( 59Oy~>} ڢx׸'4E^'Z#G뗈ڿcvf(D NQu 9č8Խ{L%m!\REE`QI&cFx&u ڰPXFq4eD|m۶q̴]v]$pM˘3bcƌ ꫯ?=z3"bM" " " " " " " " " "К#+ omСa1^q!pܹ֦M]j}M駟r^}Uo"r^c^G{/MLئcSOElTQh^{SGI|'^~eѹ/|ǍgkuQ?.ZJNiN6~C?;}AԩS[.y;o}on#/4.? P?<3gG381Ύ_F[CF5<|ix_k$q +Jf\ /O߾}UW]/t(LĖhCy[ܘW(O2b$4ʇ2yr#:FV$3,K_h<f4eÆ%Il,|ف^5lA(7j2%;Y\A)%3j5hqe" " " " " %PuE@D@D@D@D@D ;[-SuuQ$u%cMuIu\;u2;餤x'IԵFCA y溡)ԏ|or>}+Ibo@8xA1`P>88=>2dH8m`#ߕT%DA /wt L/[C`(/i ܛ5r4hPs=:,$0/D0@L$}gy]wuqQ0kC)"u]A?{y"b*BA,a"1fϞmD^xaN#F`0F3Āc6BRHa|JCk:Ə^%:tHlRO¡qz1y`Hhuډ~`E7>~w޹f} FYIW# ѓ#GrhpdGH#' =)9_wvY(^{-x7<}i]HSN Ɓ;vTԜR f}A[VQc9[oa@IJƄ0^t`Xdv\tvzy}ˑN}>Ʌ9A1(ÇƇ~gB~weJ3̾9|b( sHE'CF"P0gyy FmY 㓲NʸBD@D%᭞/i+ck^)DXS6dٝ璴Aqo)Sdr0;lHN(%WI٫EsFcB12'DBt/rLwg͚U)Hpڵk^E([bk)!$O~u|ׁg[0@&/h2 (NX\K3ub `zG|a+>}ؼyq؞*fs̮dfQ=DED@D@D@5ɓ'gou@..)abs0 /6D.M>'|6!C _pjƘ{5" " " " " " " " " "В#~/~ IWE`E5AnW+ň24Lh/NWO:Ds=ӦMO?׿K/]qÆsmy6 c{ ]BE;O!'vCϙ~/ZS!8袋" fwNր/7Ln4,0뮻ByS3F[Fm^s=g{wb>}zmkWq */}!_S /0w9xg4{yc9|TW`0r1ҹq_/6<{M1zdB?ϥ ABD2 #zjR0z!8f?n^!X~I7C12ML#ZqX#|ar7&MV[mU.3)c4gd\x=qnox֥i51qs" " " " " O@ " " " " "P!xis<^YAAd>NQС6|x"X];sЏtkrJ^KBH yY@wA}@%(D@D@D@D@D@D@D@ $ބ ֽ{Zj0;3 @qj\`s8f̘:\ֺlW̬g{.CE6}5?szDQDZhz<"4Awyr!5V# ?B (7Ab>JlA p"1k `{a-Lڸ:,4hPx}뭷ھ髼˃=ܓپfSgꀘ YDfПֱc`Lr+ @3< *5|u|p|= cH%&']x b)W_o=:WK*;3AOX-fD@D@D@D;s0D-aB;mza>Xy+g%#4z-BfmLwuWo\}qw=_zЖOo|wĤwhQ@s&Թǰ"|1gϞ/41yӊ9q]Әs~sascY||׶tM!o1Cӟnjd>nCֹv̧#=fѷotk7d kQ -h2ЏL91Zk-3f,ONe] z O"LqQoQB=?`X^hɭM똶C\hAM\;g83=mp7E@`8i$e"BF8 21ؤs,'NǏJ<]^0$?12vwKgVj(ʁ. 6 &FbÆ='$U(ˇrF~o -P>YETD1sʓ +i[11 gBbAc4md?){J:rK%ƌiFtyfV4 P@ @g}ftR*:-z:JH- !VGϙ =ѣ| s'6sML0?thRXoG rZsݔѩSfs͈@d@BbkSw?`ק >fʅo5" " " " " " " 8thO? &cuYTQ(dV,3f! 7z^q>~aĦ? UͲw2dHXĀv wi';c5c8p·bߢ!#"- y8+l,LSնSO:5 M7L+D O!/-6a1.91N?`6bĤq=0׾'p5c}ua@P8TXb;#\م^1aL_AdgqMFh n0e&q=&7Ce ofD d"cߦJ CX ӧO0ͥRkf%,ֿ)b[׸[3`f]Wz{$?7]75DDT>ڎ9q=d):묓1fDGT"rʑ{L_Zl;wM0>〈~&r)Ύ>(ߜ6j.֊s~s_|\ǫmmմs A=6w4;Xu.==L9m\YcmQj9fyG3G)/vxxevmC_P\PӆJM~ @>wK׮]vO}ߣxRzhdds@ʠAa9j< wLv` #SX!"м,8Icǚ&O FZQ/o7)>Ǽ$Z~"h&W)y@PmE@D>=^xYgLW_ozR^^w]5ݍ%_Y"Q8۰1w9(Ν;ƴAcM!" " " " "P8oR@!@B!v@i ХKF5D꺞~uN>̵CgtI3q9mfֻwR6L}F" " u-/zBkC68I0u'FqѦM0ˀK..i8`0<`/|֚%|Ë(~75ǃ^,"p#^c| xwFF\ pt$56lXIN~W{a;z=0?1QxAOm;̎7<{QO@Ϟ= [D8`Vu~$y?o68p`5,:|G&2bg>3@QKBD@D@D@*7`Oط~9SL ;7B:9~gpho0zmȐ!?: [onSS?B3a +s{/”'$Lw!z(qÇ̙3]i){0灜#\FY`xI{?>@&1S1{#>`!L`?bެ9<7 ^D@Z)4^eԨļ7HꩄO|/IۥU,2 m3G}LƂ 7|SL81'|z)ka=e饗@k'PSԩS-+t **J+dZDXuU[nxyy[N1l*m[.zJo~ iIy.tyR0S~"'(ng[!"в`Ő 4i!cc?ƈ+v6+" N%}K/%Lsf.TD޿^gZ3ʡ3;mڴ&Ǭ\A `*yј1N1l\r%7khe*0"E@D@D@D@D@B $9 ?̙Stu% XVwIpk֢+"I.cIv>$=kS-n-gᅓc`)cVx~fQ@u$}`kUw6]\l1s-0|d <]L۞w_B!# B68CB]Z| MoǾbz#"D!Z~}Vp\|Ȑ!-ʈqƌA1,$e.]ÿ}_llף7>|yg~z{I/f(=YFs[o 0c}dvAHN qJRȊ/[8+ fkue/O> G}EH1h;!ޗ+xAPםv }uZСC=`Zw.nqL;uޤcӉyYgauי]r~:,Zd{9U-e%*@{l(/>w)xP_nrGtvmjb+%Q׿gy&cop ڽs> ¹^C(ݾj@'/8|ۗ+x嗷=#SݓN:ɮzc KcwжJvq]v%:ꫯڤIsuؼFG%1eш}5-BSs|yחJw)ΜWщaVp/mĈDžm=[FۿV}8Ge}ߣc 7`<|m,L &⸞ybKɱ"!'TN%y9 MC-O5 +Ň-?O5 eCkviҢ0އ*Wq>WєTwՌ9}HmuBFcFѰf=CIi^D@D@D@DyK ]@e iՌ"&1+Rdh|ǎ%dX,f=I{.B25bѵ?21[;,t 74`dEf?s$͉@{\*/2ExT+wu޽(|NBD@D@D@D@D@D@D _<&_{zyz̎%̤|Mr-K8J]LFi?۷چqP8݇^m]lac "}qY9ݺu e`ۭq0~ Y~XAl|︢@dic`T3}\\g\Q:w]uUL2n)'_y0 [*9拭3 xŁP" " " "D̙Y"1;D0BW^s$wur]O\um&AؖgڵkWkyGmfmI%F{ofon&dڹ皥o31_İCLiM6ks͘2>{#/)A"{w_h,*{v3f#'xh3;vlP6S 8O4en 6P3" " " " " " " " " @:8cmO6d18C,BgqW~ذa\PkE}دo} 'aӘ[~܆|vx*uGgޡF&Nhauc1:i!yq[M+@}rJƬ wQXKy[wqߌI}=SN9%,+O}r/rF:\D}[ym8{a#OS?~|L {h{n!oz}11"#0AH-`Fķ *<; p J h_aX`PQ<):`+wE:iεQ:8\XԩS';묳6޾;' ͈4zŶ‚&SHax 6/tZnVMzt+QUD@D@D?­/bo\oh9W۶msmVe<<ӡ3E/!PBeD'GN>̞|29ѴMuw ` /T;]qE_U}^55ڤ)ж裏#5?#p SFJ͢#~&L0·DqC }(]w]73bNtqFzys=^zmV!wAdc`H`hvQpR#fׁlu F7U:`馛qȑA/MSGmyM]tbsJc0g'o8|SIy|cb<Ƴ>r`o;Qk;i_}բ.-d96C.(cx]w-:蠜W}>]v &|:]5t9м2b,B;2Q1#|Q0d{އM=*0ʂǠ];q5׷WiЌToMz7]UrZ{%4Ϸ67N{?mQa^v)1{6g&4iFRb E#y,ysR&afVթ$u F.Fzמ}M8&/]xPXP3" " "ڽ DcvhHpD W)D@D@D@D@D@D@D@IhfĘӇ}yBmSOs9 tRan?!I a(1[\dEjwA 1bd_Bȅ^XZ{'e]fw6mڔz޳>;1~+7tA`= B=1i5,}_?wߝXܿo>":N>[:W?RWal荸.aΝ;L<恚pImu%JCQ)qZ^7=M<ؒ\JˆCF֟yk)Zר6V/OrjW͖饚"lJAl3!Ca"(-ڭi>گ_ $]rG=W^ 3ry$y0}gBA<|I} ]!" " " " " " " " ": -~_ڿ/#~{f~\~|IHB!i}[lEC725Η H5m oe~wF/a5Ux)Ō{!{1ZS| sˆ|`Y?ek1#YX?}mU`L.\ysezh0b|>ra~8幢>3ڻ̗.#{%\%`<c%P;HwWR@3̇8pr0O# %!gn$eIaM[i*" 9o':qJ:`-NHi1dtMUUc1FhIGS}T(Æ vK 1c4kdtlK^@h(d" " " " "PIsG#ivZfQSNAeLP1ꪫ2XL{ƌ>2S|Q:sL\Q#8GNAtMӫjGN\7=zئZg Z; YG}Ԯz<15%x]}tqW潭?B/" "  CGy$/2>}zP EXbەk̙3C\</"ꪫ#<@6_kjIhXԲK\> }ij6;$2kIWz[7MXfoʻNr_aL;B-y<@(o hЦ6޴55=>M;ch)#q1MHh'}n͕b@$sy' 11zݠd/F.i?'H1yep@~'#> v;ɽ mi59#G?O:hÎ ?aEc9{}~[=\T,cge_7FsjZSzYgy?Qa|€lv\4Ft&ǹ_~p/HO!$}Ⱦɣ=~ڶ޿^7ǚy{Pт o l{l\l=o@!>r@ ]6,Qy ׿uw+B_c4={BQ:C?"Wѵ@K%p>(>L*:R3bHY,>DZݧ&%(ACFYSfjBD sX߯Vva;VibHY}u|Fmtn` ~9cԢy<;h{)ٟ ј1mH*9 hJUMyVKD@D@D@D@D x}FO2H*&:z/ P=0qwT">#F<$#+ٳw.$?yBFGk08U :/1 dtP I q(q=ZD@Z3Ådh"L.8o9 ۈ1߀G@k']we|ܾz0};t.Eծ];C} fd ڵkč! .EB0"XJ޽3J p]w5 ʴG$qwzmzq &00/dK} +SO=(Dp ]KR͛gw\S?1Jm#3Fmqh_3#I@3D|c|ԗpB yt#5>P`~xСC B|{1[q~LH1Ƈ_`f}a&LsNwVja5yd;3Fmd Z+;@<3N0s\F, ŠSܿ*Sgo8 ` Tx"/Uuja(gfmZD@D@D@iD R8#`\:7+)>vC i#|\|Ń9Gy$T,G؂ސ!f^jɹ \9~+-hz訍K]n04Q~.gY6WT'^B_ϣ)Q2&ݕW^ 7єR瞡@cȈ0ڱvF=(/0q BTc(@K=&Yr?GAXmy G*d180&g;lu O>nyr9;#4%gM=Pw<uepV bhz뭳71̉k3Y1-,;vaO$?1ݺu os\ZϮpocĪ.;bئMOqM>¸,H[.n^i}r1^Noi` ho6ȟΎ܇z(sH}cp^1[q1#_[wLB蓱Ew/Z5R_SaeMLA#&gɛ} b;CޤK~\#52FsF l֬GG(فzSF:(4y@" "P㏓@pW]C o, W3&&_A!Bc@@ð^k̀|+W~GЙs/mXHEUcf 1b@ %"{~_~_MȏxL0d`h-9L|# !D0[g %QTX2X}aK3bDs{ } ocDGh#mpmگk. T5zp/OH Z9/#fQnމocDSj7cb,w,{@IDATC+Tзo ؚ^_yd0]Ƌ\m !af]W!6Xh!~.hIQ?=L`dAtUyvbgi^B`5OF>B6mZ4hPhC7o^Or5ׄ4ݙPK Dp=P8m_2>7c d,1]a .@#Rsyü 3F̭}|uƑ#㏡4ݧ 7Kq7w\2d}g!|]t jGyd\Ԥt>^IEӷvM9.#Ʀp*5p1wo"N|vQGyI቏?8qB0ٺ{[̑JҷK tϽ! Drŗ_~ioF8Ǧnjmh-"J3xqO2Ũ7Z\r"޴6DE?VQ+c=/9yg{n_ب;S1"`R̠Ks\y37ђȄjr2_;UuD}[mu@ f믿~n<LȭoѣG!Ncelĉ5!V\ZZ%Ss CwQ$H1MϣEۈF> 2hOު*iS!w}| |)y-<Z.͑>3FEgݼy_"$ɢ⪫VGlԇ[K,q%D@DRX)D /L߾\TD@D@DN/>u{ <8P9n[ne|qr9oV5ӧϕswy睃"K-TchE ~vaI!7 etP~+s#Qs4]v1d$y\i^es<{!W_iɕ#,5S-rH(f 26,;eꪫBY1dlꢋ.+mܸq=}o,_~y睡,I/)ڍE@ 8(QGe{G)jݻO;92CavkFD@*fmY;4 q>ᙇ+lz7s/sX W^ XtI@ =Oy҆,2] =J4Zӎ 9ERvujO~h4fL?/qb|A(䙦c%BƔsFʺk=zp]V:jiuo.XD@D@D@D`6Zd\D WYe[{C\)cezg" x壮⫮/IZnrnWi Tlq͚qnnj4{~ƌ%!E,הdMč)0Ucھߎ" MH{W_Ϛ %{C4Z$#ϝ[ʵkWe"??2q#@CܡXfeJM@E=ގVQ)bWhuK/N##+0ӧO0_˝V !L ky`|AXb%'`8דSM1<h6{U@<wsO^9JR=77DB5 _F0{$,vtPR0T@0=C={v0E?o@y q/8j'kfɻfħzj(_y#<L~ay?)b믿޶Z^[+D@D@D@D@D@D@D@D@D@D@j'ywrBtZ+"  B@b?pwq̼fD@D@hoOaeg/͙^򪗤ˌ~D/3+h.K.Y}_(W_ͳl;[(rYnUf.PPD]Ԗt0N9#hxߚ'q2 ݝyhydS]@ {elvҤIyrUb4^Dt '\1oyK{o$k0`\mrnלh {}%Mh~2]LYqO?ޟf#9Vɚ6ʪ2fĠ1hz%5" )o6sFqJG4Zׅi%.sٷ~*3w< mOLF.3747M32$$4(),#pͶl-[,n)-{u^07H5&ye?^t,TE KL~7];|G0Ns eM7 l<zc)0y Ǐ2\Wݬ_~QZ(fD@D@D@D@D@D@D@D@D@D@j'{sx^Bl%]D@Dt?Cm̘1nhQ@ I=\mɎA|ήA  )} Re^c|#FK42OMU>ɍFS;NCW/'Jkl?{2^\2S/OOl%oAskDc8hg*D@K[/tM_;myɎ/=}ԨQסaӮ~#" fM" " " " " ?~\S D&*D3gNvx .^.E2HlhAEIǂdSwLp-m0ZBIich[];Za B@W_ %ScA@,,fi5H1I%*;V.vUAD@D@D@D@D@D@D@DB s1Z3UKD 0X{wk﹵/u7.ӷMm[7Bg2 tȑAd&V{|3ƦsK/dO=T{k)yֶnkm͚5ˆnO>dz0ABD ڪz-h0{n"J>?dIUXIa" e:nAL~M6ə٫ &kѣOw6ϧ5DlD2{G2?w_QNir1kl7E&;rW2R駟9>ꪫBa,N8BD@D@D@D@D@D@D@D@D@D ?6( C`v !JCV?T!" ͙G}r99X}yA~熇x rܓ6g6ߤIvߔ)f`+f6/MJ]۲m*ch҈^_kޭrI2BW4U^4Zd,;݋ ^Xd6ioK,hwڜ9mڴeۇqalCaXN!"P~hcHٙ$T|_hk<ƍ7ѣCI[ʓYg&ݺu>hV%QD@D@D@D,BilPe4rc6YkhP]#@D4^|g(lD܉)+Bʹ$Gt钔6EI#4"DIj&LHmϵ\$P^:fgnùֺ DpZj5}F2F,f]4[SHnjsX2"O/" " " " " " " " " K@:thd{Gf^3" " " - /`h$Qe a@uZ_A駟ƋwΜ9yر"C Mı[n;""}]tѼ  W裓+yDJ晽ZR2ɰUWM w7[kv7kN?7KOرf617J\Ƕj5xcNLk9ݿկBjryn".?ְaBiI￿vav5ͺk>>֐!C'xqC`?P0D8_~뮻V#J4 \hRɘ/Ƽt1Kj"++"UBImw41eĜFrO,(.e{3FA/{^= Q9mH5+Cc/쥧y(i E2ߪr-o#FyZD̛73?¦K.dƘq 6oCh{F&jbPҧ7hΘ[Y l;f̘P`LHwOh'wu !1TT1VڈރblO4~*qtuLСCG&" |e#G̘/N81Et6H 9I5Br}ƌѬq 3rMkyB`RXxa3Tz $3)`HAy {haHN(5$8 095EvCtP*i@`GoOʦӨA6h̥CΘ^{-1A6gĨT5/" " " "P:1N{43 w 8L袋Zk1Z޽akGۉ@k!lС6l0{b@!w z拋-XmcwSn&"͓n`ȔG. ]VTU+ꓹtiA ߴiQ̙ftZ :'p\PF9q\8kY5LE:mZ|8ks9.fO9F% Mg2^e,xE ;"0C$y}  qBAqWȦFD ,Ioq(~cǎ[q_ =:1:MCt!sfӼ@u,Ed1=T` =& dBD ':|`"T!_E>oCWNJWMR,=0f"zEdXAos4NdžþG|:N3oZ6[[b mV^cH!F!" " " " " " " " " " " "к `p^D@D@Z/`avܓFy'x1FL1_3fL0QwZ ˣlƋ٢BǏnnϫQw1/r}l&"6$%1,> ~٧&S" [YUV,nfkae̺tIDZA\\e+~]wuCSFL1&.vi>SF_RܓtLqV L/&/kݗG^qa6n T< !Fkg" " " " " " " " " " " " "А"$ W4O?x&Qva`([!̙_~QxEekvnM:w\^P=v7?^c?"DGqD(ƍ5"Єi'6̵+ldscB̙IK3J֚-p ym1Sэf;R2)1_lF5f"?BATh_yPP_2|a*ܐ"[믿0[{ˌ;.5R0q}>S 4仡c}C Uh;J(gunVK56/!wr>.YYQ4_$wRQ;q}˺vǗmЈNyu]Z/eOw_ &^N"p Og |.Z}ƫhGb!mE޽ a'Nl;:@eh7_?t uѣI#L,Owc=Y 29lA:@dX<3!" " " "޳{/,FE-t1=] @QHPxaÌ\b{a -Z&@)& oCl$M~)OUqYzq??q6tD"L[;|L͎=+d P@K!;`D0gϞ-t" " "j=:/"%.mY yoJچ{˞GDy{E ;'Əo׿ӹ3]*g}㎳v{£fBCʦ]aęsB *NkH1G.!dDq!@:t`'tR(tw4U= B!# F m([oW_D0e4hWäɁ?o߾1l?" " " " " " " " " " " " " " <#߆u\H!" e"W_܍s\|-+ș묳NZl*-tRꜜ_10N=%2I 'FeK,nأW^zU-М8%=SXJ:o(3gLof?ѸqB2dHf6gd| Fh+D@D@D@D@j'  t;6P {?8XH-b4[ѣG_a ]ۈ!0c {Gc=f qN: wi1i*"P2U0ӌT?y+n08CKOx7lT )>h0hm+D@D@D@ &np]v;,0Q"o}0`\qky ?i#FpWIka{l0Z;1G]VrL`\uUveСC[n1>3b˜C4W۹F4\\o2u:&oED.TBݻwxW^՚hf9otMv 'wQU?H({/H&( ҥw*APJ(]zIEzh{u̝ɤ63gf={I&^]ܸqcY`ܾ}"34@@@@@@Y`Μ94@p^ >_UlL}zٴi4mFsaE>OY֭k.]55ϝ;'AAAmݺu:Wm6@@(@c||3  ~~~ <yzqs!zD[={m@ :9aͲb 3Yի!Z|MX~}щU4p .ȳg3|p6߶u1겙3g2Q    gmZ08u1AI@ z-~aX@XaFQy>}Zc.]ZJ,l " 3ܹSf̘!K, CmDXV-!]ѣGk.ٺu ~EKw-'N4a>ҽ{wܹdʔnO@p& 6裏2 ,-MmҺukX\)8?}}`cjpMj ޴ @@@@o~Cr,@ LamԤIjXFC#|^SL|ѢEyT?c}#a~zShΜ9E+VD h b,SL9 _jtZ1:zݫW/>;E$@y[ƍ)Zh~]6@kjpΝk]pFV'+VL$Ib݆  ; pUƄ ā~v)~f. ]L(.\ӰE-TyR1#_^Zta,h;[*U83gBɝ;wdȑcN:+W.|]Vn޼)Ydۆ'    0F l-!}Rg޼yMȢ%lQ5QOZ@ Ν;'+V0ዻv%MTjժe _PT@hA:r-"ӣGs"0aBر) ?Kݐ!C,G@@@@,_C ցMV+f}@ 6b/=6{l3ҶmB@d&|Qx\>iٲRREw^s1֭[Pwb2e uV輿ɓ'E ^H?uMzm! Ĥ+U}z|6cD@\R UT&xrرW'_ymƍe寴^ QL ̙3ʕ+v;ZGiڴ$Mn}d<}̽-[E c .\VZ>s̡m4vXYz^>}H-Dh Çe&q߾}C{a}L,y,\PΝ+!)yHǎE?P&&   @#S6'>#\*Wl,gd@@ p޽e Ev_Æ ڼl̘12hР@;E3|n2eJywM~w(Q"x˗aÆu7i[`ʔ)fNYPPP!zI~ecvĐݻwMy )Ԕz^ZO^C-Z[%*wL#  hPd  ;ܹsG,_YO://.jb9܁1 Ziƍ&|qʕ8߮NVJ*Q!D%"ȋ `bl_{nsz#   (@; @U :5hɒ%7Ջq!  ʌ3dÆ  F֬YSNҵkWɟ?+ A/(% ?={ǏCWL%xQM ͛'>>>r][6EAʕ+g' eԩ2g vl٤Gҽ{wvɹso emӦ$MvU>~\҄2gϟ/I$PƷzK]o@@@E P``1An&2@@ +7=mRnh!Aw }9 S6VZyҥs؆ĕ\z9K$wq˝;w]9D<==sF'lA@4,YĄ/ܹSt~mӟUT1:1s̶y>ׯ_iʽ{_tyN>-Փ˗/٩J6'NٳѣGv篾}J$yvx@``@{k^;ӛ@Fyz/_p_  @$b" N#p5M'IL6pQ̙3ײĝ@PP(˖- ĝ&|^PGFgX`n:ܹ̜9Ӻ={d)]lb]@@@@lbի0  f͒gϞIMSdxbyK5kf Dl  h!ɓ'} r-tM2ed.'Z@LMo߾ffY,YX`Pd޼y2zhl[tXC- @x-'NP^[l)7\^aQz_M03mzO5g"iҤy   A?%Gω5l}@@XbuS@p_O&L`;V їZwl Qk@NV\r9g$sp,!kזM69S h=g c ׺rdȐ!vdƌ?JiҤ]J޽%o޼v  NZ3ٳZƈ"JK(@vA  +@czs4@@ /^4_$H[ Cګ^ʖ-ktҒ2eʐ6g8["PZ~___zxxHժUe1 xU/B>\/믿|-ZT;w     fAn64 1jۍА& D]Ç2gaDM瞼[ҫW/yw$a„<[ ]zqz'ZCs+Vvu>֢ӦMH"&C,Y2UC@M^(",aPዿ}zѣ??i @|5`FfH>2d0Yr˒%KH @Af  WQ ]̖-5p3gθ EhГb+W46l-i;cz-т 4@ &^|٦'TÆ E i[~ԭ[7d{@@@@@@\ŋR`AyX.]rN@\@4h„ r1zyyI۶mwRLM/=zTt.nH-iҤRJz񴧧gHڲW_}%]5`cǎ2h )TP! @:G֮]k;qҾ}{;ˌ3D oŋ>3eʔW@@@T F7}c  $0w\i׮ٛZbE4 ۷3Xp\~ݡVӼysiӦhX a*ssϞ=+:?_<<<\u(;tdh"iѢE@C-[&ƍݻw[7kL/+W[@ > h8Λs^o7nDkZB\r6mp_  61[@@@iԛ =^˕+rF.fΜ9\D@]|9 m6b[ƌw5'ԩ#ZĆ͛7%k֬|Ç_|a^'֭[˼yc      + τFi5LiС} @ |'ʔ)S޽{v}ə3 ޽O^4qΝŃ dߓDIŊZpBF%]w^z~`^ O@p*SNɘ1cLӧO}Ӣ 4!C"ȑ#&QC쎞"E SHU?s*UnO@@@@bt!  eʔÇ]n߾]Wg_ d'O4ϗs9N4nWh wTRkw^w"I&?'F2jc``ݨʗ/o!5:v49rH&MiӦf’GMxĸNQ+GO$iܹs˳g${rmsI I @@@@@@m{>|(ɓ'+W(@@ l-?Ȃ CTV̈́j^yfٴi)v(:N/r]>w3כfctG}$ݺu-dDC@y?^&O,߷tJL cF$a„vbɓ'OdٲeUZՄ@7oi    5ǫ@@pg 6i#ʝi._lij$I_ _lذxyy9lI`ݢsfCLNc,n(sSڍ0K,fWϞ=%SLvx `/?2j.ZoYDdɒ&Qnp"Eټ`) DM ƨj@OZ`_eᵜ9s.pׯE} (`5|QpM 6,@bS`ƌҽ{(R h?P|||I& A@@@@@@>S]ׯ7zM@#vZMm/'N,Z2Žtn/رÄngysJ(a ^QNڲiu̿m۶|,:u? @\S @O.cǎ+W pKڵk'vbɱcDΙ3G1cFҥ).7o^uΔ)Scpm e]t,\Pv09AGštRNN(Uk# \rKX q/@cܿ@Z@/?O!:y .]:%xQs|3# ܺu˄/jQ۷/Ą-[JBTa!;4jHVX塔.]ZԪUJ{ 1Ǐujժ2l0_r  ٳG+Yz`sΝ۷In]l?}OۥK8qbiѢ 0@ʗ/o'    1:{D@@m-[Yz"EN &np<xEgyf|rs=C]uE !$eʔ#)X9sB2{lS1p5xQĸ|rŋ[5tDX)p]I -ls.\?/h + $, ~Yt;C rY2[lfٳg7-@@@@@@ F)7a1t(v ܺJMݻ n{4iҘ`*U4ӶBLRʗ/o ]/fkXC@/8X| _ܰa<{a峆/-[a= @WXf;u-N>m&u۴i#s΍3@@@@@@K?={ɓk@ CɦMdɒ%re! HrL袆VVMBԥ\RF!]+Wl֭k'  @p-zuLӧ|G>}zz3g7N;f k.]LQۭ    8A> @@A˗m`iٲ3t> ˗e޼yVYҤIAFo-I$y5@ ,C7|c6ѹo 9jx9jo׮]o߾'OubMsˑ5hdɒ&Θ7o^j@@ j1F͏W# @l \pAvmI/^څ JbŤRJ榡\@@VZ%ZP xӓG-Z0x p7-&EeMV  | {)wMI*Ut}!      e J(\Jd%K(  Zta&|q˖-jw3e$5KZ$M4nj+vaڵˮ:?7|n9O@@nܸ!~L6)SW t҅XYqF;v]VHW 64k֬iY=   8AN&@@D`ܹҮ];ӛ_% $p {d&|qΝvUSx iݺ4iDtN "/:E̙3;@PP^Z͛Ftփ|@ ?~,3jH ̕+WUJj[%JKX !  K@@ 4 M0E@}}}VEXbE~c%S@Oi( _\t,C5k_9҄Nڭ   Iׯ7|#ӧOOZ_*U*iZ3gΘ\f͒utJV$I$vx   /@csD@@Q 00P .,.]2۴iԮ]J7b n:y5(J*ҦMS0cƌvyȞ=tݻw#^;vLƍg~#ۦu"oe+c@ v.^h4cAoG/^zp///P5Qeqf !@s@n޼)v~!pA5)Y5tQ *,Gd… ƍ"3g-[Cꪓh @|Sl޼9BCy'-Vp˛MW.۷oks!      G1羂D}]pA4 hE酺/_ wX >̥wevŊJ7nnCf<  ׮]Zf̘awTԩe&Y3'N+W^z[L@@@bO سH  8رc͹F[o%k׮u7V@Ttܹse0ŋE `̓'z ܾ}[,sXjժZzv4^kh ԩSeҤIl{ٳ%KUSiԨzwk7oޔ/ ٺ\#GJ$a„6lƃ N$8sL@˰a>$I8EҥK|cǎ2x`o   ĮA@@pF )X9ORJ9cWn+)Zpr-qj]֭[K۶mtYQԺu@zM +/^,ƍ3a_.'-[JE!!ĭ^u Ӱk.̆ .٩ٳKM8k_  C >3J@Vɓ'ݻwJ.\Xre)Z[u ̀ ׯ_7trv&|A4iRmX`EUlYkb"Ei䊞v}I:uF-C 1gx]_̆      ĐeˤYffǏ;MA "^hEDuVqz1m޼yrm*V(#Fwyn<1w&DѣGae̘ٓV  @l\|Y+킳s) D𭁌̨,M?c6o\>c,@@@bX f  y:uiN̹G6]DN>msƓ6mZsM6RF :壏>2;_cǎ{hxZd/^jL c&MjO 7o4ZXs:3v`iҤUZ˗/ϵR@Ǎ1@@@@@@}qkhߺu ͭQF[@@@@@@5j >L֯_;( DB,6nhnN ՙ3g:uE `~TRE>3WrwyKSH._lV$IW^2tPѹ4@@Y=j>hxm(*]V-qX&O,>>>rMTP26nX&Lh'    =1F#{A@@UWn>jnj# rաoV@^tqyfڪ\/6mTRJcc@RD$JHko6cVǏqƙklw!]:u~IBlW@^x!DmɅ{__P{)ʕ3Ψ @ u;z @ ;wNm&۷o7/^ 3ũ/,X0Y&dJ͚5K-[&Ϝ6mژ?oxX)*U2޽h0cdڂ u%;w3gFl      @ \zU)">RXh?;B@UeϞ=}^RK"VCVdIѰݻw۽^/R4]y\,M:t ʕ˲{@@v%|V˶s7߈8S_dry.\X,۷ȝ O@@@AQ7d  yDߴ99K~#L:s͚5&jժU/_lٲd͚a= @ tފΥ~h ^DC lڴI|||dK$H o߭? ={Aޱc>vz^VF sp 2nc@\Q FW|3 -pIh _~z]2eʘE _Vdʔ)YDDԩS2{lsrKe&:)Au @ mTDCq+VhW."GӉeYdHʔ)͛,Ym@@@@@@VM>P` @\h-qFsӋ]=zbW4dɒKݺux ^5|1b\pu ݻY6mZrgy~z<\{~ߟ,f@@@ e::  @w.3f09a˖-x1Y6Zի3g-[/VXa= @ 4,sΦ#:gxq)z|X^xb:bŊPFMo2e q[" D1:ћAW@0WO۶m;w_}I2TZK D/!!3Yz _@zzz[o%:tw}W$Ib' 1+ТE Yd9ӧE#v%ժU3/6l@@@@@@( HѢEpH! 7tuӜ?>ȑÄ.֩Skhphgv:t>ȑ#︄ Zս^E4֭[ֱi/Bv*<@@\U@6m|kFtg^z9u]3nYK}2dPv@@@H ).6F@@-4 f͚KI*8qBgccĖ?cΝk ?YՐS _9A .sK@ǎk:qFֹzHopms|||LrhrI9`Sv@\G@9j֭[3ꨊ/.kזZj| LC@bt7  zȑ#Z%6mZSF mٲe9)@"Yfݻџ=ئMɔ)z Ďqv-ZdNG sΉiZ@      @l_ƏoU~}YfMlc 3 ٻwht~"Iz7Lb…Cnٝ;w䫯ɓ'ӧO봰ҥxzzZۃ?C $Ǐ-iҤСCE!@@wx3F;yux=zhyw˜ӧM̙#֮%IĄgǒ+W.r    @1o  +]7m&M^z 1&uV/^,zzǎ&`$h}C=e :zӦM(usi … ȪTb7mڔzV3&Q3+4U~WXzuI*U۲@X 19 q"Zhd˖-W޽{%cƌ믛/,Y҄V (p31AO:尗lٲI۶mMc%ֳ@ VX!526l5*ҝ sO>>x      믿r$ɒ%3sݰ= ! 8q]ĉMKb#\pǦ~+Z`ҥK'`ӷo_.tSaڵVZΝn9!d@IDATO@@w~h^׌Y1LQ2gvԩSEC%-MZv'Λ7e1    Aa @@7>|ƏܹS$H#eHD@``YFfϞ-W 3mZja-D`@2g,ny #oMCL"o߶A\O>ҭ[7I6: ^k.ka3zxx^#g fZ5GN@\X F~:  >}Z6mdK/'m_֬YS+f @ K.5hZжiƍE-4_@GϟKĉСCԊt7qEI@kYi@Ȝ9sdѢE?۶m+ECyܖ1:G{;z uz9z'O.;v~:v+y :w&brawz֗STXQt0 @ 1= "EU4xQk׮z믿n5|x APg U-f2!Zɶ ԡCiѢLv5@L M43LC_Э[ȫ       A&ݶB gK@##ٱc5xȑ#d͚\(j _a Z֭9ZDIJ,Yb\bZܹoVZY@˗/7ϝ;g%H"_2˝{L!Ǜyɖiۛ|Ys   61`@@7xx{{˩S( >|!ysΕK.9@on0' ^zf0zИ1cc`Zȸzj0.3oˀ̵.84 l۶bhǏ˗/C|֛Q5D!nB@(@cy9 q"3g΄ ?0k֬iK*EbZ@8̜90j`lV`Aka$ khxԦ'>fd?,]t1/ӧL0!`{@@@@@@"$tTPP$MT:$Ek@ :k.yi ɓ'Oa ^A=*}hmkذE.vǧO}{$I"C Y=  2qD/CʕK{i޼u=xh,M;udĢ=    @@7t+V4s< .+ ,0wH"4iĄ/֩SG<<<a·y~WSԵGDp}sΙϮZc2 n@z}2m\g' n#p-ٺu fԠ޳gφ:,YHڵ:癆 @4 @xl߾݄.) ҁKEOeʔ )@hx,Y0n۶M^|iwiJ˖-ʕ+ۭ  kh;-֢MOrhwd^'>FƌD*=      @x>RJɅ ̦z{@˗M|ݻw(r˕+'3|VRE'Nⶑ]xm>|̘1C^xa}y dѯ4Oúx5@hرBV~}S@E# ϯ#G)Sϭk50|„ Rpa2g{o>w7~~~%JHt"Æ 9sZ@@@,@c|~;  @|ko%r}}aq'X7={lذn~JxvqƢ5Yi ;vYfscmki:HÆ %I$y bӧOzZj% .4/]j;^      @ݺu3tի֭[Eóh @@@ݠsuuSBɗ/)ңt֮][ҦM궯BCuƨQDXZ޼y믿-[J ,~&0իɓG|||QFe<@@[@?8P֮]kPu٧~'z߷Mdb]@@@A]g  I޽{RtịJ}a.पހ?.,tKt/ "%!]"tHHt( +%-%YX9g3&~s{wpgsǛ x$;w,_܌ "E*UT7*8 TǃCh9:L㪇-:M?{A"հ0,#.pa+1N{4φ\'NR @81a@8wI\֭[NۢAT ,(tQ T"Q)pM ӧOʕKڴic028! ٳG-j:жm[6mkufڵRfMZ p:/B@@@@@@ 4%J$MEA^PٷoIw)!!!NA4Ѣ&\Iϐ+VH>}V[O?5<=8& ڵl޼?K„ z@@ʕ+ɿzQeԨQҠA4 &c@\\V|}}wGҦM+7n0^*D      @DΜ9# Ϛ5KZhz@78tb۷"nܸRX13!J*fLDTO?|t͌'5Jٶm[ꫯ$eʔj|~ 2Dn7YF2vXɚ5GN! )c6l|w&:GmA)ܹ##G4}nH4iz7oIxQdɒIÆ MŒ%K I@koD޼yM7n,!p%~[n5Z܊֭[8vYAx#}v^?~:jժ&_  7 u 3/_}Ɇ cݢgIJ L0M) @L h3f̙3ŋMA I)9l@r)HǏ?f@K.\(_7tx̞=[Ǝ+ǎ뇿kNv*3g  \pyf6 XT)Q3˗϶g@ w@ _.7n4YtҧW/.tQE8q8ە:@ IJedAPH:h6mڈ& x@ 6'$G={HѢEk5`PPk!      `G6zk޽(Q"f@{bMcf*#Gڵk;kGݹsGk%:^?B   @ZJz!gϞN>}z\zx 2|~\Y,,   x=[  ^-pmywܹsO?Cz LgϞɺudܹfy]G5 &$m֬=ImgaÆիWK͚5AA7]\Eǀ}f&آ xܿAm鬤MJ : U$b"D@HHڵK6l`.鏳lȕ+ ⢉˕+G/  񇙔>|w]{ƍ+իWmۚg] x*8p%K^z|/; P(      … %00мGv- |C@p5y2((Hnݺ崵:XbV"EHL%eٳgtEݻ疧ŋK׮]ڵkVW5(? sX@@ZǏ7|#}-[< ̙3NtaѢE5#;HXK% cJ: c.]˺uDUg_*V(UT1?L:)w ӧO?ӡ$M6ҢE I:v*@K`Rn]ȠA^`Ȑ!      +/.=28cǎ B@п۷o77n(ǎeϞ$^TTPA'NF '{uFɈ#$}V.h̏>H֬YcuQU8:0Ra@^ <ҭ[7+8=QD2tPDիW۽ZjIVDA@@@Hi(A@v^zѣ CTd޽.]:og ˼yL|ÿˡG000$`Ԅ@hE4iRsy  ɓ'ĉv-]tK 'O2n۶͚c^DVVM4);L$I]XGp1{H@[ŋ{n3T/~ܿ꧎50aM֪c@@ VXaT]tj{'ӦM_~Ν;Ȱa$W\v    $btw#  `/0{liٲ?lٲxoDf]x̙3G~ѱaWռys 8q2 w;t̿ !!!&N1cLG#GXFrE7l`Gu*BJ*e2֨QCt?*@NDn`@qѤ5˝;w#E&KժUsʔ)G% ݓyɓСCMıQF) @yCɖ-}du      @nd"UTw^I.0 .."v풍7}VgΜ$^:Qby 8Pƍ'XVԩS۪۷#k׮SN9$RV-YI~T"]mQ 1"cٲe^$`tv$MsUV)S:ݏJ@PphR% Ć 2A @h׮L> 5)۷o Ϟ=iʅ L=C@@@@@ &H׮]MgǏ/7oҥK{G% O/nݺUO~uOʗ/oV\YraϫVΝ;ŋ6̙S4GŊ:O^8r䈴l$E3W\2uT)Ug@@Æ ZtVڶm+Çdɒ٪\Y =ZSִiS4ܥ;A@@@p"@"F'(T!  Fݓ%KRlYٴiċύzASU@cj\ٳgÇRH!7-ZH"ESDD@k\U-h,U x~6m?^4yؒ*U*裏D^  $pI+)/"1|+.\$eČ   %@"Fz?h  @t \r$]\f #Mȟ?hE}8q8ݏJ@U+?f%ID7on0vXA@ ;Vzavׄmڴ/u_:udŊf p      /^3gO &Zܲe|̙3N ,h%^ S`E֭,Yjn„ >}M?ƿBhh1B `M:7_>s0x 6^ cǤ}믿Zm@U&L[upu8pInm(F2eʸzh   v$b`@@ jժIPPiwΜ9e׮],Y2.MEc3_/o?HABt8wU Xe˖ѣw $f͚Xy e@w\%Jf͚7p D?o( .%@"Fz;h  @߿_V^m˗/+V4?fjԨ!ㆂ^Y`L2E-Z$_lԨ:l@W@Y&dԛ)z#^z:n֬Y9E@@@@@`C&_Z>S:t!!cr'6l05@ϝ6^T\zL~Z}_~r=UV'J,Y:O^8yjJviuSMlCA@poޫsT>m76 x &dk׮k&>|dΜٮ@@@\UD.@@@6mdƌf)Rݻ孷/dY@-j|9sҥKEc/:_D5lP&M~3 @ hbM!C9|" 2j(1ҳgORĊ};I@E@Nk[ih|lLrɓ;ۍ:@ czs6@Ћ_۷o+Wʊ+… N&MѤjՒ9U\Q&ܹsvKӦMM تyF@ 7n[DMȸyӧ:uj3%QDr5GH#     )pE)^賖 ȢEo7B7~&>뺳?~|)UI u)]vJh \AL"C_oZ$00PS @dhM9E?4 yyMpˆz@@@@@@[t&:|rѢEe֭Go@?@?.v 6M̙JX\9˦}oLgϞY]nݺ1B'Ony¹sD={v9s(QV3   ,\P:w,o߶zתU+3f$IĪsP>WZM6 6rVgX@@@X1z[K@@ʗ/oiӦI^K.&A" 1۷7l2dӧ-vkjI{ \ŊsV@@@/ t@@c/_. 4/^>3Fw1#)Yr̙3G4:/^hXAb޽{Xֲi& 37n\xb;FA@@@@@@%>XpiOʔ)MƬYDh i`gVǏ;&+XIK(a;M+5!CLA[!Ӡ<  $pӞZ]&mڴuY/D3fDVY@@3gJ=޽{FNdgչӧO>PlElR[kQ@@@\EDN@@;rʢcόE߯dF@Mjŋ뵝w57n,og@ Zj%f2طoh V  *cѲh" {iŊW^&  G2Kz<HݺuB /^W= #݇ (p YtIw^ML.Ԯ]<ʗ/Ϗ JT" ܾ}[~G4i9sƮ &@ر  1!TZnmN {f|2tPscJn"|L      ]ttBoݺzpAMa$Oᛚ"E TIRJ~Y߳gI>xO7y߅/dҮ];ѱ"'U  .\mʦM޿[;s2e:wYزeI.y!I$AIΝ=.I@@@JDnvX@@/?lٲr]вeKX=[65ӧN1cFi֬I3gNT  PHqđH \YP2a2eh%W\fX-D>S@xYjẊa&M*jՒzsǁ @uH:j@ }TVӺK@@" 0i$۷<|%vҽ{w6lDR kRwܱ/_>?~ kU   @ 19%  (_I2eڵk:Y@x< !Iʖ,Y"f͒۷[cmN8ԯ_$_Ԅn(*%2Y5a] LѣG&Q1cɓv7cǎҹsgI:6V@x{ɚ5kL 6~/~~~f|ݺuf͚o}XGO$bOL #&_<}6h0ab8pW X&L ;wN\t\ @\A@ ;|dB Ɂ̡N:%Yfr @@@@@@7;vôZO̙3G6mf T $p%2er5'M Vܹd˖n+ &D{z 58I߾}M,_|tv      DYL~̨eܸqҵkh:;A&@@@@@@p JӦMEkI:Y z}߾}bK{nyȑLR+WNtbǏK-h, L/_>awIm%wܢ:  8|>Jݺueԩ7xa*@wx̙3G{ڏxd]tҥK[h/  hA`#hGM\EDj       ='7sY8zh8=D^S@7&ƍNgVVMV*oR?^'O<1]1̟| ܹ֡S4i"Νܾ}{3fW'0X@@xeݻwo8qܹslٲV;-ܹs^Є{BKرMBZ%KNݡ   n*@"F7}h6  G }+M?3g,;v?FA 41+W=ڎu|h˖-VZc3 :觟~2}8vh4  =3gرc寿;ԩtYRNm@^W lRƥK:+k1j:@1zJ@8q,X<_8Fljxiذԭ[.N0xUj[ҤIc&\wAt ,YD4h`=d# Di ,#Fr@@@@@@XvԩSGBBBL#;v(&Mr2@ BCC?0ׯ_/uJ|$_7o\r%̖X@iѢ4kL%4yѣGX՞G-KYf5JmfKӦMgϞ/_>m  [RFMJl2I$IbkRƊ+]9"T *$cƌ ÖRJI.]Lx2 n%p1Z5jdGFܹ#SgϞ0=h       g zӧOM[n-ӧOXbyf ׯ_7 7l ?$!'Nl&UZU4bƌXb|ᇖ~t] & $#MӤIٴi2eʈkJ@IDAT>U  |h-[X*^%KΝ4er}dwֵDX@@@l1F(C@@ݻ'*U`s4iҘ,9rxJ[`IhKF.-[Jnb(A'ϟ?7Q3 ~wh&fHH]A޽J*v  Q}vYx,YĚAIK,8,#[iD[qqcc"үڵk˪U!n*ʕx-      ^Zׯo9i5(Ĝ9sDǚQ@o ={ȺudAt^|"_|&&_,Uċ~T<|Pz)SN8ҦM+3g4J/Xؽ{XyE8q>  Ą>||b @/SLƍD"圗.]234$L|֠ZqƵU   @1R9  {IcNZ4>N\"|lzuڵ&>4Ǐ/5k4WνH  5͚53sЪUdȑ믿ڵH?~lN{1,PNYb!8sdɒś9;@pp5J,Y"ϟ?Z+V,3OW^RB@"[֭[&>ܹse׮]$߹YffU  @"Fx -W\15Ι4iRxL.]Z4^;v>}ڮ{:ٻ}ҥK30n#+ xʕ+ >dРAuI5H;8B@@@@@1cƈN|9vdʔ)w"@T 9Mׯ_/Co&i%J[n55۬+񶉁?mVt Mc!50 @@йחSNw?\KVASG-GYmڴ#GǤ    :$b|5^  @4&g-2e-[[osطo̜9S͛'ovkɒ%MFv*@odĻ 87NN*zm?l)X_ٸqcցe@\ zMB:|I"4iDZj%DAXDnt@ >}*PEmlڴ!!VhEZm @L;wNƏ/ӦM{5!W\ҽ{wiѢ9g@D@dϞnݺtHyHHIFnݺ%~~~ru>s#M!     /0h HvfMȨ) ܽ{׌6lW:Zĉ% @4M.|5Mv5CPTRٳrʯv07[\hɱcZ=ф:#[lV   Ĵiݺ,_j^?hpw.gϞ?PnMV&OldZ,    H @@H8tTRE\b5kV1cƌxI7n0 45M䩱 x>*@#q5/\ n)p}ZvhEǒuU:t ɒ% e@"]`Ϟ=2w\Yh:P26mTRL~3 !ڇĄ^X9sx&-Z$_lԨ۩@  DQܽ{TϢ S(б:TcYFBBBn___3uR|y鰂8 h" ͛7ٳg;D  Fzҥ2j(Zg5UϞ=ES@J׷f͚%V'O؝.nܸf~6լYSǏo@EHo B]&3ϔ)h$`̞=v*@O :I[0uK5kLw.: _p²o>'<|P|||.m߾]ʕ+gRvmYbE@@@@@@S@'`4mT-[fN+V,=z\ @d @z-%JY@@ ޽+ .4Iwp7x|/o׮ϟa; х D&0zNu=lu뚛v˗ $a-XFXSN5AllN&tY:t og@#вeK={9p(P ֈ- 2˗%~faҤI#vP^      -: E5MHAIɓ&դϞ=s\r|L2>/_/ŋҥEIɒ%#tŋKV_:bRpawmE@r NַmfIh`iӦI„ :w]3gCn߾muA?^k   $b@@dĝR,]T"Lܹ# l̙ЅiJ-x9s:l@ j*U~{ n&p3foM ԩ#q e@DĉZܹsŋ(RhB@wN $b7#1"WOn.\rš %J06lȗX*@^*ƍI& [yٳ4j e@_~R/Gv^zz=ӦM      rgϞ5kѣGM'NlTTJ@O>5 ׭['|ԩSw1B U&Ydq/IK7ondڎ^req )RUyų&/eȐ!ZtLe$UT^a@'@@p%… 8 A1 >FE2m41\--:(f͚J*U$N8a7xΝ;erJliӦ&cܹ=t @hRKZdժUf92-[69}u@@@@@@-Z$ɓ'q:cڵ%Kk,-BxhXbORċOJ,)xz'O&c@@u z͓hM̞&LCt&@ ctIs@ :bҥKeҤIcSg͚L@WSvN i/_4ɠ4c I$:H=̀GO;A@ :E[fBEd?CN0A:w٧x      1AY*V(K,IFȼ<7oʆ LE|m1ժU3+W,zO!!!fĉ/^|ΤM֪Yn]~鲎\pTZ['   ܺuKׯ/۶mzݷo_oDzB6mI㱵h4XW_}%.@@@H c$ rpkRGǑ#G }DI#YdY4'N0VX:>:ӧlYu=Aîk(і1SL-[6ɞ=yĉGi8 @ h5kʉ'Y$H P^gQG@ș3gq:l7ԨQ$_^h  @:tHoެY33gNԜ"n 4IFk`a1f:DQ@7ptۭsȑ}\8zD "p92en a;,~hp.dxFOЋzlȑrqO^wn~3Xю@^[Xbᅴ:)A'ҤI/6V@@ bHw &@eĎj rQ… .]:ǝA@@@@x du"ǽ{VI4qHGHH˚'N8seݦo(I,$OOr@StDڵȑ#Ko5<KѣGyfYvy\ti&M*UTM;4v%ux@ 0qDZ-HD?gmRJFw@@o9CQ!h`嚘\{BF>L>}j &ݻw羆'@@#KBϟˁݻw&]/EAkwM5kV?#u88_Ċ$T$Iʡ@5L"]tԢ S̙:\gtR9sh2I*lݺ.\s!  !CiE[J@x;zh9y]RJe~tԉ|v2 DƌY| m6in>0@ H7o'zٳvbuQ\9m ,nj#SNuU̲  Dތի92lٲevͪٳm      ̙3.^h=4ȵkD'#KDa:97ސ4iXԩS[˶z˻J;@ ֭['͚5;wS f·-p9YfIAq%׷cǎ6h yuTJ4ie̙3sϙBFcС.2\ '   z ] ǚCڵkWHߗNFm5jnq   A Ǐ"/1w\w[h]p=X%J؃>/nye-Ţo^֘l4رölnHsiEu g-G+V;OB0;tծ]i:t}~BO6n8+|W^L2Ec@{ ?~7Ucϝ;{pH.իW@Ɖ'yg5k>+Wγ{@":0&LpK.9רRjʞ~iR ƻ@ ɓ]ŋ}7O>M"|xx!.|͜9ӧ* ڵ\rl Ĝ+WnӦMiBdž ܾU@%)zNC@@@@8z_6nh6mr۷odq{Voҥs7-k])ɓ{>iҤ A<(Va`ϟw7MMu۩Sn{;q℩@i*9sfeܹ-MEO4ICBE@(իgvVZ6vXK,w  @t >}fϞuyQ,Yq _TxƔтG@_|EW$s֚PPFvA" I8?46  @ ;_~٦Nѣǡ`{WM5=EVgϞ9s渱 `[5tSЦZB=;9 nYN;v1ׯn!_p8ѣGʕ+>}^x+{% @\|ْ$IbW^bŊsv   ̑#iҤJg@!@ N<龘L&[ʔ)Mo[ha*GCIvOUUUpI4@7L UDaȻv튑ӧuo߾֩S9;E@@@@ tnʕzjw[jOW*21 `֬Y:dʔ) *QL)СCo߾&ͳMLeΨ'ɕ/>|؝M탩+͛mƌeˢ U TnE r _F ۱c[~5k,fYժU~vK6L2ac@G@@'ׯkS* i5ÇTӧiӦ?zi  ,]   @h گ/CViӦ!Q(ETMcz+Ud _|xߨǺ8~ h(޴i1, fԭt:"A$vU߿uՅ:*]D ;R_~i{WbEWU'e@B W j S4@믿lذa6d7?>≫F@۶m](9#ʰ ֵٳԠA{뭷,_|>x܁AwS@ 肯&E]@kݺ+$IDh@h޽]Q؈={vСp# =P?qWsH{z/n֭G    i-%Kۆ  ؋ &覐@ N-w?~O SNBu)QoZdɜ'Q*Ib7 @ \v}]L2d`?=C1zlv%p%SO?>+2eJ{'駟UZ4izH`Vvmӄo5N4T(݅S}  _~exfbMW e{饗|c)^RHJ]/   bCBLѣ0V^egnիWwGyǏX^'Ot֭3Ψ̷K.!]O,]i\ƒ>ӦM^xBZ`Ŋ/zkUSaNi =z?Y)b/oŪUZ8q"nf@ ؽ{ww ex ;w)Q[ ܘvY"nb@ڵˆ bcƌ1͉TkM6."a„7D 1@ X7^T]V,gΜ>x}Wַo_ӇxֵkWUY"° @|Gֹsgw&* 1h۷w~wމðO@@@@^`6sLw[d]z5s ZŊ] ț7Ŋ+2f?l߾ݶnj*} bT(G{HĤ;I pcǎz[BE)4cǎ O~ )XNk֬huc< %{M שw=`r 6mry3V́jժ=X`wCI3gبQ\(jDlo-@(bU _/>|}'v!cfϞjڴ%Mg@Ppႍ1gn \.@@ 0T$SĘhlٲ9>&>@@@@WYhM<٦NjWdIT=îFʔ)|.+`'ݱc fT8nݻ%Jd ŋ[%k .!w+"͛7wE}z7qW*xXZL/l?smڴq&nMƗ{&*Tu  ܙWZ~@ߑ軕G}vD کSY뻁[֭*   xR<Xj3~xo:aUb:ui;+Yfߟv1<'NJ.m gL*g3 @ &B.\=7ͫ3zױ<K5gW_ߍE Q/%Kf/5ią O8S@yx.ܹs̑ u @4>|_6l)/!b:kqƍe@b\@ׂ4{tR㩶Mor峍 1?@p2`7*'қڵkS, D{-Az} 8T/bS1]dd@Pؽ{w"GZlҤI1- _|m,o޼1v,v    &NhӦM'OFy:s綧zqZ)|+Gyfo07md?v"^xVP!+UpF!$@,?E}ӨQ#]y##GO?n3)PZիWw]bŊXB|ծW Tcz+W_޽{[.]‘>#  -?w(/uFi'wֹi,ѣ\@@@.@7dKӧO_iLh#G_ ʓ'Of͚z-k֬J}dx /?4h;;vlөS'7'ٳ{k W;vG}dƍ˗/{7i5jpPBCM@EblC\cnݬtB@Zׯ&^xo[lBxv}{wbX@@@@ hآEsB _L \VF Jx 4ڸq_t۹s-Z}[LwB(NmcǬUVoҥÇ۳>Y= p[u] E%a„.@\A|eΜdch 轫B:Yuh @L軑͛~WyZz>3ЂC`ժU6j(7~N{"6.&M9UUHCMٳgom~ahv^!.h"߿֍7gաC`@_'|bG9"El:uXر}B ưx$_];we&[޽{MU<ҥKnǏ4h`;w&֫ )/G;w7o XG4DTP<_|1v,v    @L ;wξ{3f-Y$IjԨa/=4D~z[f}vI/QGa8>+z%JX„ z*@ va-Zp!jMg=G|>&N>PcTM#yWdI+VTOc]L6֭k/6k,˘1cvSO HԩSRJO  D iNuzyR0][|_ 6t)v%a@@JeL@c7Gm4ىؒ'On5^{q~^ڍ}W0j>jK*U*Vh fTnzSi۶gυ -?n_ `TM7nK.f#wuM5k_}%]BG`۶m6`7nOq@a:vy99S@ oW_SɓǺtb/ō7&@ b ח!P{ CM6oC@pطo۾Kr劷۬Y3w4s,  @ I]&L`?|u&⠙={zcd    D-[/p;Ϝ9g ZiB'N쳝ܭ q)QOrJ;tmw/^<+V+W4*1G6"@ \x>CW|^ cK&g ظq)HOkF`? _TcLC OVڵka;ĉVJ۰aH: ,]4b@@@ t=k׮#s'|bb С럧O?i$˙3g   A&@c`nX (HhȐ!gɓ'}!]jР%Mg7nn/vጺ?x-;vl+R eT0niӦـD8qv&Y>|eȐ~͛7FaSNIM,.QsXh %k=)S&- ǎs>?s;uY/^܍S{ ?tIs>CD:˖.]8|7QP fvJ*e ^!@phBAvlΞ=}VZ5:@ ._l4}tۿ 3f/V\Q*=zxZm̘1plG5yfӻR  G  T_EU\MGmqǏMڹsRLiƍsq|   1F'{C :p~/򩧞ۻ}60P)2zn۶mmX@Gy4&DPծXhOK" <6lY} 8prMgCY&MN:$I@ <@!Μ9c[KCA{A޽{}NL5A۴iƪ)` ͛g{v#;C .4_ĉG2Az3gtV9|wޱ^x!d't @$ r7|ӴLC@x rW[}w1I \t;Ɩ-[ǎуs@@@@50DĦճ^{ͅE2B.fŊmݺ[:sRNb\(cݽ&@ ]&:tݻUa8yil͙3Ξ=%Fgu %JXbE֯_?[zI޸j&~@eˬW^6k,C淾T!#@cȼt.0}tٳYT?<|dx">ƌciB~H³{@A$Qx(Ri|L?ؽ1T _L}#    9baÆbS@{ݤaCW<9sV\/_O>}3Q12zn lR!_ĉ{/[\^gc#IqD;vE]ti2l A;FVzuSx h̀ $)DM!vosm裏޽{]7gn ,9rr  +0e[]tɝc*UL4:7i&L>+2yu,   Apv!@޽{by-%r۷oϸ@/&k.\hk׮Wy bT ^>gΜcQjʧ~ bk^wviFcڱc|:'N{'Yf3Xܸq}@ |NT00F @m˖-bΝ3 v!˒%]pa۴iSL"    p{챏>MXdE#UVmZʕx<@@m۶B=7]899PR hL\#@? &)I(>PeLӦM۷G O?)|'IF뽪W6ǎ;[ >}x¸5AM"03IO>}o@@J@_Uf;rٜ9s,Yduy2 [@],]!  Apv)z:C޽{۩SX֭[XiҤgG@^ c\pZ nsLH͉[Rt <>_O+Y}VlY*@`ƍ.|Qa+<?~|S֦MZ*U+@ J#Fem-[FT\N8NB 6{lK4iuWmլY6m~&VXƁk   1Y v"}TP]]2kOO@cV^BW7.ܹs< 2#<И7o[>  8Ǐ.]ؾ}'*U*WKFcǎ]½V ZfM'?~ؠA#&V B}6p@uVR[<  6[:ȑmܸ1s#° ~͍CϜ9T86/vŮ_YdIw!SLm  AAqA$p wdԨQv ?n̰+@ 04jݺun|h(Hٳ}Xr"fW }m83mРAַo_*vѵkW{(:!@@:tTRyVs 8P4*ҹsgw}ԩSL#   klĈ֣Gڵ6mڸ^aHC6]vyШ E>P$ItpF d{J<5M(>|󦠧RJ.Q@ 4T LNN N>eGUgu"EDV"_M'ƨ3gN˜={v8S>m޼u?Os *|h8 [ߘ??5e|ϮRLiwŊ@Fŋ9|^L[r솟A]wʕ+޳ֵ5kZ򪰀 /y@5kRUZDi 1!_tuرֽ{w;|I&;Z݅X@08ydžjRԺuk•@@ *,Y-uԦ"1crrQUV!?    @ [o٦M=/nAڴiY@PmٲeΝbŊ1/_MQ0c(rK16®>c3fM ,Xঢ6M]&ԨQ2g|{iܝmLGq;PJM6˔)0~J]e5R?K@@J`ڵVre{|53sy1nٲŪWn0aBw-nݺ1A@@1׀3=իW l)RXϞ=E7n\j@ ̨ eԼ%KxGխύ3*h,N8Q=u /]D^wAK8w}^y{Pƪjѣm޽7k6mj?|ovSY  R|W1z|rϦy4@%0qD{wlCzj n`I @z589sCAO͚53=GFٳ6p@0`i`Hp w*PJW`Q?~INWD o1?òfz@@@@ZSmҤIU_>r鳞 *qFo0Zɭlٲ`F-@ `q͝;>3駟|Ďj׮m]tŋCw8G ^:u)B")SZժUMዺ<Pc=fGu+Rϖ.]:> 1+p5/.ZrI!  T_Ϝ9㞨iӦpdpo=ybֽ{wи *BXT)SeܙCn^4TQ͛[=իWmƌ6rH5kiFĦH'OXF@ 4wWAj m֭[!6l}Ǧpƈ-_|΃z$Hq Ę;Çќn}^y7Ua 1`^ N*sNk׮+J5kִ>}X޼y#f /}~8qDYVsΖ:ujz@@hݺ :=Mz]E=h.ݶmOv    W\1]gٳ? _|y:@ h˽֭˗/T,Ic|AΨ Z8qn3l@1f7l>O$5jz-{|W@l,Y _ܻwoɖ-ըQÅ/Wܸq|+)!%KtRC~/]dժU sU)0Rx*_:N@@ (h'0zR{'P/Zh zիgG{@@@ x9l ̜9x ۿoEuw%aq)(Noi8qb7Yi,ju@W@A} g6mZСl4.QU9z Ď}/ի<@X;n„ PƘ8D\[oyfM>w}>x @L P~ܹsȑkucA%@HثW/W 1b5 ^ *|8 *ޥA*{!)ŋϚ4ibݻw3z׳ ܩ~#FWt۱c+3@@@@ŋk&t5lFCPڵk]8uSXZҤIMAe˖uPt!Cvk׮ cǺeɒMk֬L2&@ H4fΜ96e1c:u*ʞ/^/>VX(J!U?֓[&O^ԩS| K1@@@ VXϞ=Tvm-N81|{[d*VaJޟg  Aahи7|TajmƍY=nj MGuiBu-U.yK.6S㏮8ի}zy9;v_7_L>݆ f1Sg5kVkܸi: @ W_mܸъ)Cs@gYfϕj.z>@P^ǘ1cu܇zȆ ¼o x>40U.]رc.eʔ%Eׯ_߻@ \4v֣G۵k۱cǶz{g9sg@Ϸʕ+S]UPFAKC@@@@NΜ9c:t#GzDt[je%K̻.{U8{vvBʔ)u_dI$-6k7i8rhTWޣۗ!hǏwlB6/^UGu5j0 DĊ{ @ޤI7N[^Q%ޑ  #l2x9שf͚Cɴi\3Osm3gδx6?&@@@ 1do8Oּys 5/# sN f?nWջ(\+¬`FcVC,cm߾}>]͞=kK„ } ^ѣGcՑ5^UT轑~@@rL4J%JSx *f8i$v,ƍkuֵ;Ua@ ~7WhܹCzkfzTRy׳~ .j*kٲòW}8~-qĞ#a#0}t֭[VfMA`W ܕB3g~駟6MNGStϞ=ݡ48_a9    @{7xtm+ŋBDҥKn:7IS5W\i+nkt|\NҥTRVhQK A  ᄈM6t4hʕ@P/tR~MH"UZՅ/^i;GGSR@D@9{r:tcǏf̘a+W'A@@@ fg˗/u>=h}ڵVzuoHAԩmԩVB9CN@@給'pkӦ;ֻS}+] o/^mv]ȑ2*QW (fnClD 6l`Co.\s%Jpu?ԩcqƃr>g6oiӦ֨Q#Ӹu R@a%Olٲ|/ϋc# 8ƌcϟ9z:ud=z  Sfr?jޭi|7oxs~ o.]v5}Xׯ =_Fq7WEdi  @t $OΞ=k|k׮-qF+V^J;w-@@@@$pIkݺ V>}\h  R W_jYTv-^xVP!ʨ@" .L8x6ydo,2==ӮEj,nܸc"z(:]t4x 3gν>%  1tPw;qϙ*UU㳑 D˗?x6dw߳{A~a  w:vhEO>y:@pXz `Tᣈ޽{[J"f@6 Vj?ߊN+qϞ=8>j: @@@@fΜiM6#Gx7+jذa9sf:@ <_n۶ms]ጛ6m+WD (`$-ZJ /Q3\ۖ-[nPrʹ/MCիh"ԩSMQB6*fT)dE@ aT,X C[{ƍeȑ֤I@@@ >skѢ>ӫm BŹs5#>h {7ât@@UA@cza}5TK" <6l@ Ξ=k˗/%KpF'p-pF+-K,|>7=zh¨0ƈ-eʔ֨Q#kٲ z3e6=|6<֬Y3>t= Z@+VNUV.^G|]cӁXI۷o>%J(&@v+ܹ}rc޸qc裏,UT~LvQ % +@ hnjo-\ۇdɒ{&rʼnǻ@ 6olݻwɓ'tp֫W/Qz  -+ of CD;Zݶ/2lDJ@@@@(Ν;+pRN (LJҥKqFS05kMw9r02VH9s4ѣGm޼y9sةS윊(xnݺ-[(J|Th)t57/ɓ';";f*TUZ5|sxnݺ G@@ }7n\w]g W믿nFSN֧O5   @ =4visc<=Tiy̙=G.uֹ`ƥKnm#SLPƲeZɒ%-a„6"vrcTH|7Dּys\$Iܴ1'fĈ6v؛~ďߍ[kB|s{Fo jҤɐ!CLa4@T@s'NhkXڴiߕ-[H@Ie˖Y֭oрLi 181@YϞ=] 2:uؠALh @8 ݻza|]~\rpڗ^z"^@@ &zm;Ą 矏y|r+_{Sz    Y O?9ҧO Ο?o6lptT EuΨ'Nl 5R(cB}-cƌlӧOŋML `ܲeKgM}sYZ,{Q> 'Nӧ۔)S .t*`㏻"6Β7"N矻e  %[o'|:(Q"3gUX1lD@JOSqeG/g   1 @c ːP}~iF^C+Mg*Qu7nܸeu H"P2eʸ[|wK16ܭmҤI6~x[bMI< >n֬)?˗/ɓm/;Cc4lT蝆 @ t>#wsε*U)s~ *9'q+]v2 @ (DMvꝃTTɾ ӵ;ĘA1Fˎ@o4۷oO?Ԟx :@pP/M`Շ ޽}7np   T _O(cL=Б#G,a„II$ò@@@@u[nݼߧ%M&sz d/^֯_n jT?u'E?~Maz>}\%Kn7oRLƱUVͪVjҥlL?p?pڵzf͚dɒV  gϞu֬YN7[l.t8K,p1vpE4AMO8ĉcd   W^1Wu ZѢETENb?5hfw   @#`@{7mĈ޵yop(   Ovw˗/7VZS9>(TRVtiw4u &CA5wߏԮ]dA󟀂[^gرvq+|VZּys{G g @ hLԩSijF֬Y9?@ظq dի޳^x:udŊg@6mژyZ \@c.],^x#@ } -dzEϗPt  .ϟA |4iSv[l4W^m[7n\SQ˛@ 8lb ^͚5˝u lʕNAӦMuڅ Aɒ%GڴiT@@@ 1x^+;vp7m=hƍmȐ!DyEX@`bе+V֭[qܱj(QŠ/08X!yklڵkMOn6lHEu/i</_vXnMΓ'5k6lhiҤi;+@۶mܸs5^4fȑ#Mc"6U cʕ#f@h={ho…m̘114V!TyڨQ@U#!/p5=z$Ik߾u%KY=  w L8}.Yo0|@@@@ .\ =zԝXر߶{pz8V@Ų)zQ*pqMU$E! k̖-eϞ'MNwv믿ܤ]렢\ B@@@ ?TiٲenE"Elɒ%a5KWn'Oty浟9)@@A8"0i$kԨ={֝j|.,*Xy"V@TCc<nTXbnܫƾ*\Ou$H?BG@͛g9k,;rHS1:u긛L+ _/oϮgkժ>=1 @4 hvDʕ+EC@ N:e} 2Oݗ(Q:wlk׶8ql !Z"={>ڧjTtz5ETC@IDAT@f_%mڴq ͞3޽{[֭Mi @L6U@OMNӧ@*@k.Sqg$իW-]tviK"?~ŋCs @@@@PN~k׮ Yj3fqƹ9MN xo߾ݶl5F@wm/^jCT|f~/jA MEVBp޽{mϞ=Pc۶m IJ.m> _,[i  W@+*[SLCEٙRJs=PT(J"V@flȑ'.l4ТE WS;Q8F4  xTI wVUV4+ 3:)=žd8s{@@@ zbGׯ_wy>Cog ,h&L{ױ*QիWۺuhljɓDž(Q7eΜ9\Bl2_u{-VXq>=7oOq \t~G믿t4&͛7W_}Սc @@ 43.[!?CSF;v ߠ-W\֡Ckذ%L0&@7j֯__lѦ41gBv~ЗxYreEa9X@B]@|:udK,jZP j! $O̙3)>|q5h̙cO<q@@@@3gSz'ECY@/TZEw/_|S'Q+ԠǨnwŎ_~P*.O?{;v9r9J .)REetSa0fϞ_'#@` ܹs]Ma *Vk֬i !]t>}.Ə~'} 4ڵku7op'?s@@@ t}Va Z!CgI]Vwrg϶%KE@@bR Ƙe"//9_~ن f'{U螊:{wG.Бo4=}TX.ػ *FÔ.)ҩ4* 0n;A%UdtI4c&|9O=<羯k|&9ӧO_'},YXi2… R?۶5!NЎ!M8^-: \&sm["GM ǏxQ>攅gw隗9v@4&f<|oY_hsn'h̒%IFg2ž:ѣo>|Q5V-f?{sm34~dךsժU2i$ٱcKg_|4lP$Hqv  *ϙ3G4h*Cc N"4!֖-[B8nܸsRM*Uc@@ ǎ͵~\rɼywߵa c8._ PCVJ*%f͒ԩSv7_~2uuW_}e&4C@-[4}H_y.;@@@gϖF]ѢE3I?৸&ZhbJ-1cƔ˗9@@@ JH%4 ֭O?Ԛ#4iRYd/^AzH7@x왜8qJ̨ 53m$:G7cƌ)S&H.x{{*{[LLNM1:1:_5/2xNW(QBʔ)#I$ ~m; h2i'8c ~z>yC *t~vձ2.@_믿6u= /ݹsgɑ#m7 [@ߌ5Jz-1b#ڵ#~v Ho:CF)^x!Æ 3+l_pm۶wwN"@x4Yѣ>[X3y&fŸ@@va&j?;v(#FkUfh{B ٵ}C@@@5@tނ&0|ܽ{W>|(=2zgqDxxxi4M'[8qbDlidɒ$Uwp|ˊ+Lp]G3BGY.]ZGD={lٲ"~I߾}#%RR܂SNתUK.]vz-  Q*ЫW/v"^xr}wznݺ4?su_̘1MrOOO@y?+;.]:^ _H+FMѢEMe~>}t7xPoJ*Yscĉ@@x#殺,Ybj }I_qº^̞=[>S4#C@@"YD L'i޼zq[.ZQ@/u&hDN25y&o|(Q"+1cʔ)%iҤC ^;ȵkҥKIm3gΈ&{)z=k֬&bME)!vMf/_)}tNSTx ; :߶浻+ hoFƏ(___jժ ) W@ٳ5sԩSVZ᭞p1;8pM4 r+e/puݻwKǎP_|!ĉ[@@E@č[Β%PmϾ뗘ɒ%3uN    ͛7 J 2L^wQ2@@ /&+L@9s4kԨ!``^WVhX]9XMqS6   Ǐ{5i^bŊjܠ ϭd ]ޔ)SI&N?6  DB6Jݻfǎ;L4u~O>Q%E! _sο\5-1c 䭷uxL1b|u;~w@@CI)5۷MrzVzޛ={vȕ+M0#wi&,f&g)Q \m&    8?sΙčW.\(+Wv1@@:Th˗[8?/4AZL ̙30p{ Uxq9t萱ț7>]?O{Yh|'A@o߾]+,@@!p )T?R~};wn8jtKNVo5ƍ3sD@@:1F=-WҥKqw=j+̞=[j׮mߎ @ h"F ?|hLJ{bKΨmj=m{sDAY4idƌ%C Y56&`ԤDӧO)Sȅ BtVc:͛KÜ4De@@t}EX͛7υFP@\M@Y躣Z9bxtA6m* A @7{hO]/_>Ydl3$@"ƗH؁v/ԩ#?նNIO%۷e2ay5ܹse˖ 8~[t©S̤_{gImsС& =ۧ-@@@@ZjLR֮]+yƨ@@ J4xݧW\)W\yRhQxf͚:uaW@}G&I&Ip,Y2'EоCc1qDa@@@p ;v|޸Kn::c;w6kl}9ڵ@@@ $b 8ÇMF<ĉ˺u`N?6 zM|xU3OP7nܰuuI爇I4iRyZ :1UTY&L8'عs\3 /o>qժU zA&tY@@ G1߇Ԥ:a|7  3ftY={f,Y"w>1@ "48:u2ҥdP  Hs̑ .EU9sʱck׮NV    8m۶d:ŋJz X=M6&^nh1cJf͚RjU^/5jdNN6l0O 8 T"ׯ7ֹwCA@@"R[n&֙-Zܹsˊ+&˖-/IAK` `' 駟EQ$*TN @=zTʖ-+իW0zzzF'O6jZE@;dΜjĉֶ=74 Я[)    'ЫW/iݺOVZlVc@@@I2 $A{$9sf$%K4/]$]Iݣ/ .pi2e@@f*3f̐gϊ΅5Z?nKɓG>ٵk "8@8qdΜ92}tk={=;@#?qCO@Ν;'ժU#GzxxH=̂)MFFA\Q֭[C'Oln~XT)9r͛׶g@@en߾- $0+]YbݻW|}}Mfʕ!   Nq&LjФ^  wޕkʲed:oKժUf͚&Q ^"baE ˨E?[i"F/:A6\vTlYh@@@H?MЋ/6Zj%|Mw}Vt   ^޽{cNPlڴ's'6ltmƍeԩ-Z4k  =;&&Ms} ^z-iذ4o\4@L@ Χ  *{Ub7oV…k׮&W  .]2ňC[ K5 ,% Fևɚġ~ˈ#D>@@wH82eJݰ5X;vld|h @@@x3M'e-CҶl**@@ _zjY|lݺUs9t߿_7nLF} s 9sF4 L29W- +Y?y)<s綮7k.ӧO/FX@@ $NXm&mڴN?~TZ'*@"Fw}7v}GԢAr~'%SWhɓ'rRbE9~iSh0#=֭[7#]B#  >gE20*5k6yF@@@p@ǏK5dժUw=M .]B@^ի&@ҥ%yIl"Ϟ=l4HMvL?CtaGɒ%ӓiDeٲe6*~TsW6L&r#  l~~~މ; @j֬)wqaDX5q>}L}:׼Yf2o޼@@@@-d̘1cgҤIҵkW(A@пG6nhkҋ!Cȍ7ȑC|L:Ugc@/<I  --Z4O_ 6H%ˎ;Jԩ?: cʬY$z4SX1-U3n ֚݀7on>i0  Jw57r)ׯVHٿ̜9S%Kfg@pG["F&RlY;izڵc)    'gUf5kƍkTZ:K@@7Pߗ)Sʗ_~)}<RI.tI+.\ѣGD#m ,4 $wӪs?HMgu!E$I$yz  .%{ *dtYiҤK/j;w6IFdҥa@@@@sI]5.Oft@\A@Z >\2f(|hDԭ[Wv%GVZ qS]]g  (pi[$b(@pJ*Ν;姟~իm۷e&Mi۶\x 4" @x6l([n >l/᭚pJ1:Fp|{IŊM` Nv3fL8Q4;2pM3}t/nF%O>5CK* \{*e  @uDbMƨիrp@@@@"^ѣGRJٲe<^xi&)]t7F  a81B|}}%uҮ];ٳgF+w.M$Ak4ma`~_^=AQOs玱%۷I$Cfh   ѣGe˖I„ M/WX!&LpG~׾kiݺiH?[ LA@@@$G7Yfi,  )w^$eʔҥK3֞΅yv.]2S/n;3 DSIhQ F +Wn{{{kqIƌQF0T@7Wwhr>DAHn8E7nܐ%KΝ;Mkqƕ5kH۶m:M 8p ?\n޼i>_>u@@'>%${w]ʺul<#   8@@@T\Yonz?~|ټy-ZzG@@8wh  Hts΢Ai^xadϞ]#8qB "峎/CYܽ{4Vvm5[v5k&.\0Յd={tK@@pY kK<ر.; lرfS϶;vͥ   ,sL4FϜ9sL/G.K,?؁{M@@t>ԩS%o޼+sΕ@3$P^$eԹdI&uw@J x :[E@ f*3f0M۵k'q15ܹٳgKΜ9zo߾jj@\Q sfb>>f`!O  ]Ξ=+˖-K_fܹ壏>2]GA_̟?twߕ~Z=֧On%H >|X4 @@p:ѣMW4oͻvٻAAAҰaC7oiZ-4cC@@N޽{+hM69\Jjy*@@p ?~\&Nh@߽{7D} &ƍK%C !@':ujthrKA@ ܺuK?~vRdI_P@xnjР.V{zzʄ W>\L`)]e8D#G{oxxx!)RC4    :OJ͚5eݺu uV  @$ hEM /_>]I1cW> ղeKr;("gΜMCñb Q4   i4 YQ]WV-Yzi^#޽[eݡM@@@aH0o &aDGSL1Wxyyɒ%K6~ x왬Y߱cK*T̯SČ@@ hbرcKPP{گqZB@It W5jynݺ` @pk'OlDƅ Zr ,p58pMVjժ%0j?\4V&xyd$a|ِ= [& kX(  @8qDﯟ={VtX֬Y4~ݺuMS&9  `$&MݻvIϞ=K.k6pU1;˸)[_U___фe{AS @\rEׯ/ŋ~4!7'OJ۶m+rV@@c=}tЖQ;nݺ( #   . ˗ ]kt@@ '_t1 ^/Æ 3<(]v?mpMDGɓ'OLo:t`J9@ s4}џw#Gt~ @@@ze„ ͛avǍ1bիESi|Ix w`   8@>}dرѢEy﷝n t@N@~ǒ:ujѿ9;[ɒ%3F4&ț7  VXb@W x{{Xǎ319 (`\6m*ҥ#Fcl  0dAh>|t\ZD.28"_@h۷o4Qٖ-[ߎiDO:bVKO2c I$ @@ 8J"F.Yd۶m @@@@"T}2w\SR]j(Q"B۠2@@ ºJ'IxҥY!8@Æ ŋŊ3 T/"3jP9sH8q ZC@@ P~}OnA\xƍ%[lfpN+4jF   b#GQipӧKݺu]l @)wa   8ԩխqIÆ l  a6m;#͛7#GX9s`W\iQ؂[' %pY?$b(@@ eʔ[jMҨE 4HҤI#ڵK.NNDp]?\Nj%c>|z[ (@"FW|Wv8|p$J2Iĉcik׮IEo$ -e˖rIiڴuS)rz@  8J"F%bu@@@@N&L}tӥZjvjf@@EÆ |Y.XB <~ܹM69@8t萵I?W͝;WRH؝c/ǎ3-CgP;v@@@71lz-G}\颔)Sd &4ڶm4nX^xJd,   8eˤE8,Z^ Fb 0[l7Ƚ{K-*7I%TRY@@8s[l  @/zO???=ѣG2vXфǺĉa@\NI&2e+!իˍ!.IRX1~tҲvZ;vd@Qo5߽{V"EDɓ  @߿/7/^\v qDqz)5k{Y@p?ڬY35jo  ,% Hz-ZTl)t{˖-$a$oEؿhٱxt_PxF@"P iҤ_SH!/_^Urd۶mǏK֬Y^ W    Z`R|yyW^2pP_ω   \tJ_U ( u֕>HH*!!Lj 圃^?yD/G154HzP   F=z4֧O߿7-YzquNs  _D78|/^\ߨ&Mȴi"1jE@yǏ%K~GdΜYZl) 6z+!@@4G8q$ @g.ǎs]@_֭[2vX9!:>z!%J #0qDsUG!s]LAz I@?,$[\rɺuHh'AПiJ¨$'Ng}MA@xL2J^*=P|`ak @@@@8~TVJظqc0F<35" \|Yƌ#E1;v(L¨ f{߿_0? VfͲ0… I_&^%a̗/t5Q6@@@=̙3GM "rDbOV*&LZh׮,_z   WRR%+ c*Ud! <~Xt>\p2o<+ ch-[mۖ$Na@^иsQK_>=  n ʀŋ2|pItuZDk׮&ͪU\rag@[ x̹ 28`= .7n\ԩz4wOZʕK,X ϟ?w=@ӧ|嗦ʧOG}<( c0%'?tdd֭@;&%J0 Noܸa/^<5j$ ___g}E@VQ`dɒEҥKg{nyATv@@@@xTRE.^h{ҥKI6B@?M2eH)UVgϞu۠Aɓ/HC,P8.hդ7jҤY^hҍM&&ҳgO8{F@@@ C5->nЅ0`4jȌ( @@@@``T^]g.k׮Xb٧ N# TvH> 6L4ϟ_f͚%.]CJ4ilxF@  @ibĈ!͚5'N.V=*Փ̙3dzߟ ƍ:u>|PU&{ Q]e`D.DZpPoڴ|yq-P R͛W{1_ڷo/ѢE  QG?yDov@@@@ttСCfҥ׋?  s̜9S*V(ɓ'7v!\Vr!ǏÇML2.,~3 2Ș1c\xaڷ~+3f˖ {-\  8gm:W_ɑ#GQԣ)SHRLׯ_?P޽EY@@@G@7nXcs]46Y " ܻwO9]˗իW[bGnݻW8 61ck +pY:' |믲vZ)RոnѢMV.߷ 2w\)YkL2G[-f ,]Tg*_ ,ܹsy\Y`˖-3gNDO>5k͛7ŋ%Ev! 8Z"J*Yoƍm6@@@@/еkWYrG֭['I& Ԁ .H7oTRg6={a̙W^&ѣGO>5kV8 ^jE/_=zI84H@@pw}Wufk4i"ϟ?wkrcǎIڵ%p5    J˲pBs,N8fpT^y.;@@UV;H6mĉ0h t钙 WP!  gΜ>}zk @\k.Pո&ҥIF+nݲ zWagȐ Fɋ/\o-Ho3D<( 6~ 6yڸ 7~&ٳgM1b0e9"˗oh @@pDK1cmذ'    >} >T%K.ٳRF@\@ѣGoZjI$IA&ݓ'OѥKN4.X39sZ@0!5цM8>ĶZ )VX(@@@4Ș1ck۷~[֯_/%2lݺUZl-R5   -0c 2dA-,ZH(@$((H֮]kbe˖M&L  .9¶zo$3j@Yȑ#ҴiSI2t9DF+s1{6@@C C #AAAr(Tٲe>l۶f@@@@ l:f͚r5sa2edĈa@@'ЅlRtf L;wXJ0|}v|7N-*9l DhRW-}5U[@u:u(Qԭ[l!  .*0p@I,݊+d.:7,=z0?{Lԩ"U    #Z0A0G g[|,YRr%SN;A΃`6l'O&mq?$F k.]t<  R2^wn$~cz_`J5az !:uڵk46BZ$ B!@"F{(N$rJ+˰&_\t ˉAW@4h&`ׯhPW-g֭2w\I8i0T@@yҧOouٳvTm̙ɽ5@@@@ ۷} ӦM+/hѢ"@@L@uAt&8qxN >3\ի2e)]xz2j͛'7i*]D[ʕ+2h C?wjR[    ziP[nmv&\Qu c7Wa   OiӦoJ2g,-bpH@?嫯MGfm۶r 3OV1jRF   \ܹsK1Zl  I$1.^hqxBVZ% rw}s >}d͚\믿J˖-C1g"D7p$'OJF.9R-jfp$͂_Hɒ%tMv]9"e˖u@@8Z"F^2eL/߿/Gy    oK,1 Xb &8 8.{3cG˗/[;ԩSGVX!ׯ_ٳgyN@ sƌ#^^^kMfy뭷^>=  rhORL)=zK.Yc̖- :wVeʔ:  O[ҦMkm /#={}>l۶MJ.-n:$@/7n\3Yfɓw@ܭHVo7E>5kʽ{I~npBUVIeڴiM?ː!CLP(M# B1(Q={m6@@@@]_X'?^rmf@psW_}e~ȑC $gΜ=ztZ,X@nܸ!/5jH̘1s@MoV^]J*o~A͛gƜ0aB8p["  * … Ф+V8q☽ӧO BA@@@ ۷O:t`]4sLɒ% @p=ϟ˲eˤx7o^ff֭[-[- I0"@H]c+ҥm N$;vli۶YS;uTɘ1{J*U$Ouʽ{̹ 4??@@gv회7N|}}Eѣ9r~hѤlٲuիO>['B2l0s|䯔^x!ڵvh~z   .ufҥKwzǩA@&Olmkl    k޽k>>rɔ)S7L  @̙#۷˺r2i$yw}l  8@PPĊKt~iv(&K8(Q"yf     н{wZ5kV9x I፣  ?ܹ#˗/ Ν;E ^<<\4~EVWXѥ`@@@ L8QZli.4!%@``,XP4mʘ1cB+@@@IH$o tsԩҴiS3~$JH* !  \5k֘;w )+W6mH2eB  oܽ{̏?}Vu  :Q2n߾=DO&M*;v-ZHܸqC \zU+ׯ_7ݻ 0q;LY`;# N:& Ztޝ$#@AAA2~xə3g$~$at  o*>}zs͛oZM^WpaXl    ,u>3Q8$/3@\ٳg&W $I$Rn]Yzu$2e>}yKtڕ$=U`֬Y& _1;9sL+ c%HW   _|dΜٌ^%oذM%^?1bȂ $f̘qɦM^G@@@psMо}{KaƌBF @Z2|p37f͚< tAN:eҒѩj: C QKtot@"VTRm6ٻwTRE<< 8@ee:;h Y~wmg<}$av(W  Rxqiݺ   ,Z :[5&-@|z?ﳑSt"n!   `åqbniFjԨ xCu֒9sfS 00fc'O,Ν3kآcO @q-={C@@S^z%YrݻD4իW5bٲe]i -P\96l RaɧOv'(O;I# fCDH[֬Yex *> .,? C7j۶K*9   dڵkI09y CRreK.^I    L@4CΝ۬q q'bYF*U$O?Tܹct_u֙=tI]p̄ >%@G9|*wE@ ,( .ÇKf$^x֭[2bѿ :udu+GYGkֵ]v޽! PtRF@.?@$LP,Y"iӦp/b.޽{&{O@|G@ ̜9SN8!ڵDw0a̙SZha "%?}gmow=+z 1zSLDBg ŋ;nsСCXbk.3xW^o>yW<&&D@w,ĨߦBBB@@@@|r)sGrM6C@@ʕ+2eyW$Gҷo_9x,~RJ;w믲`^$HCKCƍ͔q95i$zI&/}  ĵ^WjU3mppٰ(c2e$ ur {   *.͛7PCЧOy饗|@HӧOK%sұch{ʕKƍ'gϞO>D6 @+;: @lD=K}I01c ҰaCњ*4@H<,Y/p Ƨ(O?͛7VZ残e5E fKݨձS7ھ} >\%J @@ .qlk= g8p    ٳG&L`('N,}A \Ν;2|| ]vuV4,/)xYz+Yd.@iӦY@@__~C@@&0p@{[ϻM@fͤJ*K߾}   5JvilGH@#;Y)8vXqͣbŊrJ9ztItl  gΜSfϞ  uG@DT Fxx|R`ASWeݾD  gɟ~}5ghY HiӦrq3[bL8i@hFưaähѢvnӧOٵk/^<@@N)Rȿ/9&+@@@.i۶} `.,@}\|s= =@@@hzpʕ}ܹsSJҤI߱cǃ@@@1'NȠALֺ̙3%A>@ x{… k&˗/G[ĉe˖/Ȇ ZjÞ - %hK(O޻#@^dky3^dd,[Lt][o%۷o<<@y٠Ν;RN qS IS0ٷo=}lٲ(ZE-pB~9I0:@)жm[{](Q'H@Oxg>wZYGܙ3g/88X>Sɗ/_@@ 9s̯p  g)RkO>\?8g͚5RLX| BY]H#GZl 1򍀀&{6 O^8|p)V&i,tp@@pb+jGΣ1%IĜC!GRq@@@|H~Vbʔ)?~| U@p'dРA'Oy饗d„ r%V4i͛7^h5b)X=NpW3fZjetDfϞ-gϞ5o6M  <@ҥB cǎ… QyJΝp&{~JC@@@Ν+6l0igϞ]k GٳG6mj}\6mZ{  j%$$Ą#GW  ;yYӧ]8ڦMȲeڵkw@ &EզuOHb|`AvԫWOL~Z7\I WСCpGݻg}e۶m2l0?i  )uQ.u/67;F     /A^ꫯ*E@Ћn;wnǭ@ĉnݺb xL:gϡݺu x;W@@@g:tDFFt'0@^z   xץ[n6ɓ'npLC@˗KhѢ2{l 5ŏ_4h ?l߾9/^<(@@(AAAVll  ([ЦMkgΜ)y䱧kmʕ+^FAT W\2c ;gNd߾}6ZBq-|ın~hf}W䣏>|Y@p;, ^ثW/ٽ{,Yҗy@@gnΜ9c &1f@@@@W8p@>S3uɣpE<̉ -p/孷ޒ3.Mb_*V()pB^24@ rflȒ%KD Uj{ץD   |$L0.`@@7Z100mubԀ96q    .]Hxx?Ka0' x^ܴ~ziڴ[aÆfs۬ .,G`ٰa{"E { i2{l_N0߻woۧ   xQ_K?gI&5O:U<   K)S%K&/O ӧ[n9sfkyN:e=Mf2D2fhA@YB #o7.]*Ŋ8pOf͚%QM'A5DfǏK-bm.FQb|`Qc29sHL<8#BGO9s,XP6ol7(z!{쑒%KzR*Ċ  Q 1j1owiy䱡4@@@@WV\)6m2̙S:w  o>(K,RR%Svlٲ=޽;X: K^ISrZ{[/*Tp   @*UD?Ӷ~z9r䈯yf}5 g?@<@@@С`m؟̃;BE>]+Uvmɝ;)|M#oڵkEҶjJ'N}d ^-@!F~zI@8Kj֬);w5kH2el ǎf͚';m4 Ğ@ dѢE*U*3'M{22C`OzԫWOLZQ?@!-p%yyr-3oeԨQ0a@@}Z*/=NyT5jdtD&L`tO   5Udd?GtM2gl2^j>="  ŋe˖-&m݌k׮F@ \@ 5dŋW^yE.]j$kE-%؛  ٲe}:  @L*WlmܸQ^{5;^ܦMə3Nݻ@К4_|\fڵަ@\߅q1s @իWLꫯʦM$ n`Ye˖I֭ߗ?X'On  2d /^3ʹs|%CBB$Ydfn]@@@@_1ch¤]lYٺu/ 8I֭[d3g|wm H*UqRjU4@BCC%}r5I&\p} r)|Jʬ#H$7;   k7oޔL2۷%iҤrYZ+&|ß@G@@G^ʔ)MZG x{I޼yE7!ֶfэi  7flڴi2qĿ챢o6mڸ Y@@X(Y/DxbyFG@_ضm ܸqC5k&jղEӥK'+W>"D'  BٳucIln4j;y;D     @ 2`;ȑ#m  8b]{=ٴiS"Zyʔ)rEYlYDtS7VN0FyBO.ZQ/\.   )R0BBB?|tN^0Io -   /7aTE}I'G@8~tAd"}Vx2w\9sW(OA  HZt"NBe@[2eʘu;w5j9Oa޽޷Ç[n@ Æ ҥKN>-͛7c P18 Oؾ}PUc74@ tc ʬYZ_~jժ   (G!H |ԩqz,gΜf>-h    / L0^o.8! #w^֭dʔIT" ,YK9@x*bŊɲeDw~wuj:˗M->7n<<@>… %mڴ$y-A    b˕+WL 6y8"G@w sJJDx][h &:uȊ+D 5N0AJ,8W@gí[Lk.p|3̘1ѕVZ>@@@ l ?go4    2eBҤI׼l; \vM.9rFEXZڎ9:n8y5 B@&G8:! =S͛'f͚IxЁ+@IDATL7nܐ{˗/"F@ Ě'Cf/>}ȹs\oߗ_~)N2NJ x@PPM1k֬O@p@ܹe̙r1iٲ$Hqm1bdϞ]u&.\pEx̉x}饗L^Ǐvy]$^bthxbm۶ɇ~h/sΕ 2<8<xnU;w,w5,XPv):u??G=c  #p!7&6mZSg'Q@bQ~5k?/&M3 oٲEv!חxb$  @Խ(Q! 9rO?TN8!۷D;wsIǎٳC t %eʔfL5k,@YB6$pWܿD"'ZJڵkMza׮]Ž|yB Ĉ  Q S!ƨv.qsNC@@@Z@)7<^  W^)SHR^CJppM,uҺukMdb t@"qFy_7 hTi   pbQs,3;#ٳg7 }/xOrd   s'""ݷo_I"0 ŋ/,_M,٤tR4@@uO7_6!w@p,YĉԩSҥKI$ ݻ9sJ۶m%00}&@oakܣG:n pվS9 Q |f@~wi׮T^]._l͐![NƎ+ &vC@#ĉKtl~(hQ8+    mZhڵk&F.d! o ɪUN:ktO?dŋ'UVEɅ dԩRL{ -[fOB?]vŋ@@@' (P@ *dFݾ}-|$KdjZje{Iʤĩ޲eK3gHHr޽8|CB< |'f/E/!سg-ZTtUGQ8p@^u]|E@@iٳg7c?^&whZ 2mڴ&gϺCHĀ   Ěݻweرf|ݻw  ~^K.)S&^|-g6 6;wj|w$a„!n,!+V0JJʕ+mh5j@@@Q_s-Xɣ{p-ZԩSϟ//_$@@@  &>}^?MC@}Pwh,Ys6s̑SNIϞ=Eׅ@@ɓ'o,@@M}Y1b9sF>CI"4,,LO.y͛ɓ'4BW`ܸq/_>޽{G,y=#p_ _R: .5j*UJ9bK4|駲l2[&x@@,-[6sn<.9sf3.v\d`@@@E3gŋ k6 cq:F@7t)XP!)ZO^w.GF t۶m٫jժ?~ d/u I @@pz^mGVj1Fmf#%7@@@n`b s^3ݪU  ~Yf#G>|\~ݜW\Y6l`6jԈ`OȽ  Oα$  'MVl 2,?4mT; # ' ~6qDY[H^!@!FxI—ܹ#7h={_ݗbI@7UT|gLeҲeXa@@C {̙3ꎣnuaW    3ev>}>@.cҥRzuɔ)tZtd(Q"׬Y#gϞ5#(Pq 1Xj}t5l;CeJ |@@@XȒ%,YҌo>9qD-mVؒaԩ@@@!CP+ &  |7f?B ɬY|{yrζbŊ?" ~M޽kܠA@6l` usm۶Iȑ#yTF6"   >%KziĒ /j.,XЬZ~=1M4 g̘!  <\ mb|G@@RL)@2dM͛g/_}A@@@tHb=$a„.! k׮ɰa${ҬY39p#W\fmpp |<3&Y`(PۿgI @ zl}_^֭[eРAc*# ɑcI&~8KCVԩS/˨QɪUʾ}D7!  ѯ"dwiZ.\@@@۷V`A5 (*K,jժ^ܳgO9xH$4lP֯_/zϐ!C$O<8@ZBFТ;w47 .l~wa   9s攼yIs«W^0o!Yf5[NΟ?Y   7 WnܺukoN@xbӧOKND:۷DOL2tR9zo^t- @@(f<@}nâ/]V4hSE_6m*}15k't@@@p/]~Brh@\'sN=zR 5jH=TR @@/Z1SL^  $MԼԾ}{:u)ʨr˖-3~m0`)R6@(^w!5K4iE'yq6. snjΑ#C%0)x;wSN2c KܹeRhQ{@@Z@BBB$888|Q 1^xq@@@D}f&t}~1# )Yu9s8w č~ߛ'ٳg=`(TbQ;/_CE>   c ܾ}oϬ\9fb[hw{f Iߓc4n   )MDɒ%mۺQt @ _ヒsҼysS瞋v  18w s̶O@6ĉK׮]g2ӧO#Fo+V^)H-o{b"ƍE׳͖-[ʒ%Kb2$q 17黿`*ŋ'_~H'Bp;Hz6ƍɓEM@@p@,Yȑ#nU1}… O@@@)SHxxIE7YI 7E xf0_|ZJ¢ԬYStS *@{(44L.hgj-eʔRD?l2TCr7   8PzG5|W^uIpp),;wG=c'|k!Fmϧ?   ${ M<ل?~|ߐ;G, ą7D?~?>ڔ/t]7n, &v  pJ$Jʹ3  SvL!1efj*jժ c8BCb_ }xom&ҥ+WNX87&ENxnrd)_[R##۷oKm۶c"Ed׮]ai@@_ k֬d^d:uj !@@@p… m:uHt54  nݺe '-[V+#GE3d zÇMa)S:ivAp5kPɓ'7E.5eB l   @kv[> Ԯ][65""'s@@@̛7Ϯ[dɒQ0% 8w};a|eŊr!>E]1+ }-s̾8" _@jA'Nɓ}nW_I%ZjsN@^iH $,,̧MH(tn< X/6IFΝ+/L ߿_+& ,YuI~Gɓ'  "b w !tD     @L&MdСA@ |ҬY3I>lRmfҋnի%88X./=N@9"Ͽ+V(w]?`gע4@@@Z,k³fK*& .͛=+E@@zO>صkWۧ 7    ŋn۶-ׯo#_dA@@@ׯ_~ń+Hb\#  0n|%6mڈ~|4@@}|E@_eԩ 2^ZJ,)o׽|K I$_#F͛7XB1&d+*@IרQù0xnִiSiѢ-"w-5kڼI @@;db }Ww5˗/:G@@@b,駟1Znmt@@ ntnRreɖ-?'O RN-ڵ;wRܹM | RJK.Ippa(QŅ}@@@%uܺuHHKIu /_."  xmf]t}: x@DD-X\9 ӦIƬ )SH\)urA@@@1Et'Nȴi55kK/$UT~q7_@(R 2䪟4nX_s9gFAg Kk˗/3YC3xÇN:r!n6vX{a=@@@7Ț5ʱᢽÅgyήiA@@@gΜ#GL$޳ghѢ4]:iҤy(A@@k,2d-ȸf^2/ C???џ WʢELQڦMpd $9" /_6FFFpG% Љ\(p]I&vpΝat  O'8qb׿et£(    .ܭZ}:  ;Zy!C'jDIeÆ rI߿P1vFE\!~z;-->|ޑ?~ۧ   =z0jcŊeݺugiРEc`@@Ν;g9sfۧ  p-آE 9vL>]gnOֵ%J]{n{?@2ed~:rرُq\/_.6Dn8ߣGɕ+  { qڴ@3<  ZUV{n 2hZvWF SPBna!O/0n8?_G. .piڵ S5堃 'իWEk.Œ4@@<] K,6`weBgn@@@p~8g3^԰aCg 8 ^2p@ɑ#K,E^s^@^3NC@@@ >3;nKC@e…RhQy7oazѣGuC +C@_55V4@@$H@ڶm+'N'ڼHYt.\Xԩ#p΄@e&|Ak|ݹs "#w;>+3#F[|s)cǎIL`׮]RX1oŋg,ZH%Kdq6  n, GCtBW^uc=BC@@@.0k,{iӦO@_رcҳgOsa^vZv@@TZUVXa6:t@ o 8 1j!޲e&Cp=(a   Q7=xb{˗7_vM穩7   ٳMI$ zh& +ݓiӦ?/ٳǦiSNI%y@@|hq mQ$xVD @„ }rI0a8ӂK,B Iݺu!O ЫW/)]y͞OpN! 1ГM%w^0` J/MSshp]ҥK'6l0 E%F@@@YXQ/>]rY2    gwܑ˗RN-ժU@O{̛7l=Z`G{dUz/^oAMƍ4i>@@@LN|-ۧBz~ @@@(rJtQYH‰3 y9Rg.mڴ1;F/QСCK   .\SRA@.-v6n8[[ 2.^X ,( 4G:}nDRQ+iҤfɓ'˺u2 1zE%35jHLb{2exWd1П-Z-[ʽ{xbR\  ;bTi. 1w 1!   ? hQ۷oԩÅq@OҥK.t͛^mذAN8!~d̘ }xl!!!"YdO@@@5 )t;w&5~ 1zH    |g6z-\EC@._lf˖Mz%/^!qFٱcԪUKA@<\B> x@DSNr)O$}&?˗O4ibrѣG[͛˵km:6} c6iҩ-* pAL,(/̘1ÆٱcGyش͒A@Bw-Ę&M^MGJ   yl 4}:  ]@7/lٲ?~7n\z՞7o^;v;w\xRbE  Q 1/_? D-ǟN&   @ $I>͉ys֭[%22   8A ((H3?/eʔq¨  st=3O 0:T_nbu֕]vc*Tp΄  Vbt`@@ cΝMA1cȳ>k9s^'N>C*$ЦMy7MJϟvySz 1:!xM6͙1ܹs%~O2" lܸQ+fhz!n:~x~^xsOz  "ɒ%)R ]ny=w 8@@@@Qk׮5eʔI^}| '  k{Kƌޓm۶YĉK&Md˖-r!ڵM [s,YE)}@@@Evf???ۧUlYsn$~~g    ?\u @wuM6\rĉ7a%H@ZhػxoL2PHR24QHBh0V BD!BdS<^^}{3z<<{;ZoټyL4IJ* ͥ   > `)@M@q2zh)R⋲k׮8n @rg':Zh1 PD ͛3aĀLB pCKڵȑ#fB ɲeˤYf7<  дwޠmfr1'   /.]2lڴ$NB~h Ξ=+u dɒ2l09qℭx駟cǎʕ+md@޺u٬%Kv]#v}ʔ)mߝv@@@ \p֩'PbE{%Kl    7n)>I$3*F@˗/{L+&_}ҦMk'|9rz$@@ ccz !&MҥرC}]q1}#F0׵kN ȑ# >Zm60 #JP רQCڷotb ?^Zn-C^z_K b2  a-7m$gΜǏKTTT1cFۆGJ2@@@@ &OlI Dڵk?7)SL &S{e̙@c c,(B&MǛ5ѣ%QD2@ 4@c=&+W4-7|Sy'B\\@@'ڻwoPbN:v옓@@@jÇ˼yL/J 8@|%pYg4 J,i4kLҥKs3 Y`v_1Z N8Y^@ڴi#?\rţk֬1=ty1bDc{uĉKҥO>_o7 2A#=VsAܹ;w,}noh_qW_\=_^\At)?l,Y2th    olO=͓A@W^iӦK.2W\K֭%M4X@@9_9[lqz @W^+ȇ~(:uJ.\ |9R^z%ҥd͚5{C@ jƵٳGf͚%Ç7aO~htF$@`…RL1mڴߚk@@T]:;ǃI@@@NmkԨMg@M@˒3gNy=0/-[˗_e11ܮ_ F*U*|[5 p&VB@K,{M1ĉTRrјY$qMZ)uԑx@4R|ʏ,v]wyl5W^N-[vͺ+bGH%k]{ߨSvlrǦ:{njg-?q=l"gΜ_   @<ɓ'#RN- 4 @._,&L%JH`f۷kFƄ3s$  33gdɒE  N:;# c5;wh̟?t5NaɅ @h {ٗ_~)NL7xC@RH ![h!ǎ36m*M4؇LꫯʥK @dʔ)RX  {` eϏ߮    ~k[F FKA@ Ο?o&EGL4_zJ.j@IDATSe@[8|lڴQ|yI<3:IH @lܸQ~a9ymrD nTZϽ.{zZWQ }AsNMJ@R@@@o |7H Ξ=+#GAɞ={@@"^رcr@ ƈ@@Ȓ%ҩS'Qǜ?ތ1,~+HڴiCW4"E`&&֭[?0d)2Gf5ؼytTC= kV`߾}RZ5 rƌ?Ya  @Ǐ7 !   6mDGGxx 6Xh)[VXgCn_~%D@ 6n(G=g>C['Xm6eB@= >;eݺuUVFA(QB܁"-N8:feC9ZWu]6z(_)KoҧOٷ2eJ3i&߳I   x[믿E6k  p+3kwyG4$Ib[vRL[c@@"DYfy2  '7o^/szo*q۷o/ #G,N--F ,t\TѢEMV\) ~ҩ >lE A6l>}c&A4$L}?hܸ;wT\YVX!%KLz  MФ%Cp+    A&0{l{~(Q k!A@ lo߾/_>yG_~Xk}.gܹyfyn{ .]jtUTKo1{tp…q,=C8|ƦKN{)A xٺu-O{&O._/%[x_nߴk.9r-W/_.xZjO p+C00[h!9sv̡__jk=6ڊ$?N:qL8kt?lͣ=   !.p13gtP}E /rǏ/Ŋ @@P c)ډ ]@Ǭ|7vZy6c֭;ʎ{xO@ǩilIB~mquޫY@|vh[H DGGK… o+W.$B@t\&MwrUS?o%K[+@@s9rC5כ˟2d՝8q    (0e۬ <@BI`ٛ;Cw.:Iy~38qTV+ Xhr6OZ?#'tma`7KgϞeի=ҀqIc=lÆ _ylr˔)#oSd}NةxKʆ &%Keʈ#D-B!ZW_^\pFFXImڴq&P Ĩ&   :uf7nl'f ۷o}n`2tP9xT}GeGD@;clټY4e! X@DDžԫW϶FS6:FdҤI6&݁  'ֹsgS@}v?5j,@ ?Ȋ+Ln-zI@f{|}uBAѣEa@@@ٳg7;\|Y:tU'PK$@~ @@@H+WdxMLpY N<)C uDAwNdtUf&R  1VT)}X)ТE ɐ!Y_ڵk=w` qygXB狮Pˊk%KxT}@1H1vO^N[el8p@t_g`}&-{%gΜf˗kM|}k%]7qAlȲDu>fժU#ĸiӦ[.@@@p vaÆ6O@ zϻH"&Т|nڴi7ސW>;Z$!  p>'$}9" %p?,K.5km޼Y4i"\n'!ի u\R4)r9皞A`ݺuo48Ø1c$E~*@ UٲemPV4aԩҩS`j&mA@@ @E[ bN    6Kkזɓc @ Yh߾lܸѶYvM3N:AI @tt4)TxbtΝ;/_l> 8űvC|*p1Yj#sRL|LBsNwV{lԨQC#A1O>m&1U%JСCjiZך}yr˵ZM}6cǎ͓IN^m۶9Y^@@@eSNٳM9rrr 9O>i&E%={;w%[lBO@@|&pA[6-@@ ,tZ`dB od@\[+,iҤ:!~zTMA  NѼysxJ.]L PG L<ټ;w/_>駟l  D{}I!C3 V̉.G@@@ӦMuֵy2 >kߛ /y:⥗^ XV ڵk̙3I+W}[:ud4iKk&C v@ Eɕ+Wlgk֬ȝB׻iy wtQy%ݷk׮;wXs;t]4\\/lP{Suѣbt;K FK,YCS?^>M joHFUV q+z.[ZW .8`vhР<ñx ,XO FKA@@@ ӧO .{1I(J@pXbfWfΜl߾Oޮ'  7@~$! @*Ud2g,Mu\I50Uw}A@ (J.-334av3E#iOV D~Ŋ^zE"}F b!fݧOq8/~??GUA@@nE G ~h FMb3Z8e'O._}TZ f:tMV wڵko_~vP0yÆ ΢)RDҤIccfƍ';vCMe˖޽{ewˢi…śuv>,޽{zw0E $*v,/I$Rxqgz-YAɴiLP_~EM?ϝ;gd|g%SLqεˆJ@ DoPÆ Ej> _ӥK'ٲe3A. |!  ,?6O@t"wyGf̘9{ҩS'iӦ}\X@@@b3f$-Zr8  jtQM:Uz-;eܹRR%[R[@_ 8+Wq=zu`1P}xdI#؎3FtRD('N~eX2  O@vRb<\tI%K4W@@@@ (v-k֬1mIسf \zU̙#Æ Y4H;s=Ҷm[yM%6 o UPA "[6 0@c>7h  ( xT8!wE\PkZn ̧/^(o~ǎM6w'}o;Qі-[ٳC/Q5ǬZcۥXb:ujS~[b ĨSJl W[߁믿6c܁:A/{1Zj(Q"Z׎zZۥBE 4kL-[fz2eJ 8=ܧӧO{h) @@Xs/bW\9b-8 .\(oy^׽g\K.ҲeK߆I  R Tl@@ }Q_L4Iz%[n5 >}̘1Cx [wu :KchSLߟtnR 1|-=^xLk׮Rti?N5 h#G~`ZxiJĉeұc@7@@iw }E_ҧOoq ɜ9]&   >tꤺu:Y^@'kFgӘdɒ`ڵ*U8yE@ @QQQAHhժ:t ଁ?q ϋ;h`ҤIH"q.hOZ5Ǻ׍۷o{ꩧ_~f^/,_/,[vfI̘15cĨN:J'Ԥk ז>ήq/qy:u\mɚ5|@@ б/M4Fرco;w4c[駟6Ϸ˗/{B@ t[.]}yf#g6<+򣀾a^Xxqٳk*mDߦ:Q׫W/͢n@@B G@f܁Ol'OmV}QA$@A`ɒ%+Vy2 xꩧL0͛c~fSN泄ʟ?hwQ ɀtwyNY3{lzZjUwgb{<ꄘ哂 s2SJ.{+ܻ[RH ˗;kbŲel{V.]3gʄ dŊhNǵ s_7=f\*LBHx;vL4EN48A5O?-~dȐn']ꤝ;w:Y^@@@HME zCɓ2fE   =9rB^PoC@@@@ k׮@e˖ɧ~*~y-r]wIvLF9e#ҥKMtMr­{O Djʫ)*G.C qj˗evߤIJ͚5ٴi q'y;(@t|o=믿"kl֠׾}>ݱaÆ ,1)S4=:\o1hulo^5DU+Z~zZוB= cǎ5ӆrB@_(5"  my' Y?۲b s=ҳgOy'zѣ,   pb̖-k Y@@<t~޽{Ke2d9w:uʬnݺI۶mEǃ@[{*l޼YtlΕꫯjd=4Ё3m:I_I .]͛{alӦL62=C@@S {f9{,1jH    @0 1֪U+F[@Hŋ2n8hB &Ӕ$I8bΜ9qF at  5lʕ+z B쾧|άHne{ / =@Hu(u:خN:5kkK@kNJ{+U|X:v( #GJtttv#@PHBFet]vmH꽢( ЁգG$_cǎIÆ e޼y:@qҩS4=C@@ D hܓE]Žy@*w^dĈAE̙3K˖-ܹs' C@ t2ϛvkbdr6lbŊrj@pՎ_z5N:t~-ZXv|<ۭ*7J1N24gٲe3\4/2vX0a=zɤLRqiժ ԫueoKe6s4 U mڴṿKEǢ10Z@@@pflbSR% @h>}zޒG}N|،  _܁o  qȑ# 6ի?ތCٽ{nZ $o4nܘG~ p{o۶3gȋ/(3gμf?V@m:-G 0kݺuro!Ԋ~( ˜*U*o }*A@t;ـN:uꔓ@@@ܹsDj x{h @,YD6m*ywy#cRdѢ'a NO@&lH #+W.hp͛7˜9sny䑺uewM+oUVy.\IƣgwqŊ [qcdRhQ)W3n裏dϞ=_EF5u]ZWQ @ 8IfC{@@@.0}t7 `{ih}tҢt] d<,6@@Sȑ#c3gy2  U 2n8Yf9n۶mf侏l΍rwg͚%_}U\e c$<:8sAɓ'cJҤI*_*V(6m2f˖dlذW0@@] {vC0LD.]:۞'O<@@@@ mBm   py6L2RR%8q\t,Y2iܸ,^XV\)͛7)R$A@ .]jPB' 1mٲ妝zիv{O;TtYz]3gNѱ LI93edJOoآISgt"7nVԩ%KW_3z_^7__\끾@ 6'kI   $D`ڴi01Z 2 @X 0\Nr0XByg5  ;>HB@@ Ŋ)StϣCի'+W $xC?3+2 ch?ZGhyD_5S?@:}j)bl+WΟ͠.@@"Z 1OޞSN<@@@@ iN^J@7@BT@իΝ@Nʚ5Cva3w}&^@X'cڴihѢ@@pB ٮ͛7O6olcf+:I:!ff͜EW f t>yo=TI7jH]E'u~ |ذaf<ѣbŊN՗׺v֗;z]N4@t':t   @>y=΅# @ Ϣ}Q!cП.  'cDn  ʗ/oxbZn1Z"R K,x#W\v    q3gnݺq9}@BH`һwoYbG5(~G<ֳ  @8$I$lډ  5j?JϞ=eÆ ճf͒ٳgKFwߕB @oh"αI&SO==`811" GmۤO>#_|!ɒ%K"L`РA&ЪNG &HT"L"  x$ xS@@@@@ ~ͮ^͓A@F&>x=ꫯ%! Ih ~=rs+WbŊ { ={ȢEԩS~~3x,ɢ6lh3qA&K,|M|_^ZݻW4e(&_]jntٛ?f\*LB3   @|Mf! ̙3=˗{E0j`zyg@@Pp1fʔ)ԚN{@@BD3Ck+SDx^xAz-ə3gf"@2g,}<Ӧ m۶#>}@5z ePa-Zj%ϟ7|̠4C \b&ܹ¤mڴ11/  Yf8t*C @S/   H`ܹv>hd@Mҷo_ɛ74i#>(ܽ{wٱcL0 @pOF F. @ <RH!cǎ@OyɨQ_~˜'OY`7Yjvoӂc, ]n|$**ꆥi RleǶ_(`KQ}ukپפ֕.k=! ~ޙd@@@# 4G<@|e_@ ={TXQ~aq?sTdI:uX Axh  @t^cǎ]ƯF@@'g}Vl"C lٲ? J׮]ӛ O=ԩSt#R-¥b 3I?|&0b?)@ҧOE  .HƍO> xwe$I   W@'rl^ݓe:u*`b@@@@-<Ӡ\ors@"S`Æ ҪU+;L={X%J_|!339s  @Ik@pU $w}];hSNz8>9sf='`ni&[\v+SX1I&kq9Xs_\h]vBb^\ 8@G7G@@@7n{4cʔ)oz ; .+WڵkҥKm#~AV\)׷   zի  @@_ $KLڵk'۷owyG2d`- xo&K)DkH    @v%;v0ͨP$O}:M~@@@@@,X`h) +{nڵʕKA_wƂ '|"> GƈL8 /_nK)W͓A@@@RNmΞ=kd@@@@tt̟?={v)Va; @\R֭++Vw… 7|#֭cb 8O4@@b/# ]@Z5j_^q{-M4ҥKˬYz2 @DdĈ,Y2ѿZ 1ι~۷52D2mK*W,;w4щ,Ybvh=  '5kVө+WA@4]tSN ԋ   XgɓK z2 %JӦM%_|2`9vxdԩ!_}&.mڴv@H+e˖y2    @4i,-@@@8,[L>``@@ ]V4h eʔ3fئϟ_ƌ#7nf͚ILjq  {~L2m?  @yw˥zVzHtFBTKpGr@IDATΝ;/K/L pW.OMk&45lP C`޼yRZ59tн+-}p  '%K(绺]3AN!I    @/۶m3՗+WNRLP/ @7QT"w`ĉmZ"E i޼^Z~w_>Q% @ 1Dj$@@@@H:3g<@@@n&믿]jԨad@K`˖-ҤINj'O9r{N$IbA@@ g! +PlYdRtiYR|yiԨlݺծ'+УG)P;w|W='c8;伙EEEСC}W%#_Lb"̟:uԫ關lٲT  qȚ5 nW bԪ#'*@@@@ ,^' @ 2N>-~.\X6l(-{%vѣGK%62  Wʕ+Ma痌3z`JA@@@pb<{lXN   G`Μ9"1Z 2 @Ҽys)ZL4I9"M~ 6LݲeKI4iд   /1Kz@@*PfM?efK/ռ"@ LqީS'9zk1NMPxm|dϞ.A/' .N<#&| BS@@Ȓ%m>Pw F욄   JRJj"I`ҥK;W^۷ۚuBQF{ HB@l۶MN8a /So*T@@@Yw FNB@@@ .Ne˖])"ra }M6cǎ˗/Zy-:Aw@@@ 8>l)S&'  @0 $JH5j$6lÇXDgIgϞr`j6mA? ԪUK4ibj' C$D@@@(*U*[3gl    75j<@ ?~\w.痏?X.\`qK_ڵIF@@T@?G; V,  @ =z۷˫*ɓ'7M=|hL"E_-: "G {ү_?a[/]9!S1ɣH-[+WB~ms{5P[m|ᇒ(Q"   @,YlHl"O?ecygdɒ2slw\)_4mڔlV +PxqСsm۶0Dҍ \zUڴi#/^4tY􍌄)p[L6t UTfB'x"4;D@@@@sD F.@@@@˖-3nM *  @ ,_\5j$ aÆٳgMtƍn?ԯ__%Jb ʕ+mJ*ed@@@@۾c'!   p3 ]Tbd@|#M4Iniݺ޽Ts7n/BrP*  a(p ӫ 2a  @ <fɓ'}7']we\ɑz~7ݻɓT5k,sRGĘ07 /R.\hz3LzF7<voΧMVf̘!=Pac@@L cƌGG x4< @@@Ν;r'@ ӧOjժIモ+W:Ce˖M`- 믿lKy2       $T@ 8@ *UJ4i"۶m<#j*o…z2   psҥKfǨ  @Fdƍ2dɚ5iŋ? Hܹs!+qH&sÜ}   M`ҥ. EBn}~̘1RX1W̟?68Gү_?d'O  ʕ+mJ,id@@@@@@@HٳgŹ}]wI,YR D`ѢErK:udvjժɒ%K䧟~%Jd@@@ 'N;RA@3IJvdҳgOq'ݺu… ѣʕ+as:WLÆ wޠ, tQO? Z-4AB}pܹ„ޖ<@@'1cFSsD2MVO FKA@@@(l2[[ l  @p |I-dƍ:a֨Qdǎҵk6DDd$Hf1!WTP]uQ J1`DAaQWQkB$Y$)&D$(>{OmMO z{>]]_UWtWǸ4a@8p͛7կZjVlل+C@@@ @@@2l߾}nQ@V`…vyY۶mm̙O>d4i믮UVx@@@ [l >@@*~|A[ju݊)Z?XnݬQFG,RW`Ĉva9'x–,Y rxP (W^qP'=X6ƚ@ fB!J*6c F6ʊ@@@ |6iӦ|~x%K ܹ3f@@@/pckl@ ~';s֭ T'.?mҥvZbłi  @b Yƶm*٤IĮ,C@@@@@@H 䋮/ _mW\q5n&LN:6n8ϭCx@@@ 1܎%@@Wrŋ .{kξ`< Cvؿ3T@kOcݱ4+c{M70tPXbHիW.TڻJժUm̙\(   Pʗ/4hƍp<J*lvǎ0    @~6|5jX{>@X`ʕֽ{w;G .l_|͞=i֟g+TP+b  $[L#1!wB@@@ a avA@@^ x)$|}  ?V}ѽvWeuے%Ks\˛;! $@8OSY@@r+Pn]\_-ZV7m4k֬uվ`< 5kL>)5'`WZ!ClŊn֭[u]LBDkX~zkv!ժUKR'@@ȥ@r5lڴ)@ɒ%ܹ3f@@@Kݻݦ6md Y̝;:ud@~̘1gDwת;h>U2@P ظq!UB@@@@@@H&{ڜ9s\Vj{l2U" %m68pU^ݞz)۷o_ +WZnݬH" Uo*  @A1qI@@l mfϞmƍ5j8`oBn7ozYGXbOzs/pH@ ?UV#<6XhQ=z*T(*@ ˗/38֯_հaC2eUX1f   1&~V    _~eѓO>9f@ &NhCO>$?p馛W^vQG@H^c߭Xž,D@@r(0`     Y ݻwN9唬fg: @={E/q`RJY޽M)S&  @:ޗ5" $@Νcǎ.  6~_Z=LnH>:."{짟~߽%1J2PWҧO_~s2Q`ҥ֮];]4iBá,Xo  (_||(Yd;w    !_iڴi0 @oې!Cli6ZJx7ZҥL  $b\2a ;gΜiGA@@@ ^C=4`    .0{젆mڴ @Z?W_}uXw nXb0@@֭[P0  E={W_mCvm6m޽{ۓO>iK.$h:+0b4iڵFeݺuz%o P 2Џjժvf:?@ ,Yb~z¨NENj0&~6  B _?ijvaVP!W;vij*l@@@RP1&MMF#{9Su%Mcڵm̘17Nc|v[E@ ֭ _mܸqL@@@@ gw(QDr7#  T زe˘n#I`֨Q#ׁa,\]yW_o a,H{  $-[*P0  {bРArJVYf]zֺuk5kR du]ֺn\8$1A-͛o߾Fz)SpC`ѢE֮];_]7or=9D@@ ˗Vq`8 9w ;wtQ   );.\_V-+SLjBj@ va<1.~ev;  @?~88]0vT   $PX|Ɏݻ b (@@@"K*eՋ2@s̱ی3£sα!CXÆ ӌ   mۂ qs@  1c/ggY6ms{ի0-ײ^׫WO>|MҥKbW:jGc dhvw/(.;saA$X`yVZli'N?m޼9۷o84y W ޷Gq]{]Ij   21̮   @~':t]p"Er>F +쮻w}7M37onCN;-x   @ l߾=`Ra@@@ @Flԩ6a߿/!~>ѣ 8ʗ/vA!@ /^Kkwq|wUn#{Yf٘1c܆ʔ)c#GFy]vAc֭mҤI0.+A@@ y1Qz;wLDj   I/` 7@;zm=CAc…SN_ɓƼ3gM $… jF7     A0@@@ ,0{i˖-a@'?Nׯ&VZ6n83g!b@@ ر#vҥa@@@ t>k*Ur3۷Y5lgϞ 3Fsα /gݺu$LR"jiwj߿n;pk?lUTIJ\@u!OKg $߱T@@/_>XjƍpJ,6McE@@@ 5ϟ4 ƀ@ O֬YcC_~hѢvWwak3 %``]ZZj|vֱc$)UDH6VzuS'Q-ZHS_@ߩІhrR4 ƤMT@@@oz;$~{\G@ʕ+}g^{rݨ&n:  ),}P0  @Eݻ[׮]Guߋ-[nO=K/t=LD 1&Md\aݺuuƷR)u~AL᝟ M׏K,qMmڴ#MHz?܅0ꃾ)bǏRJ%}h  d_xVD ;!kɻ%|]n @@@B بQ,f2 ,]y;v"v]ַo_;c  @ 376tIVPCHٳǖ-[൤z (?d܁H2eʤ@+1&>   @<b:DDؿ3~矃*EN|_D@@@ >p¦(   poh/eڵveȑ#-[JMjժvwڽk^z`|J#@c$}0x]VZP!C~_ @b ߅~7|??*"!1Evt*6ovaj-bM4IEڌ@R ,Zڷoo[lq>]#&I,  1PׯD bTCwIcL8+E@@@_m۶ms7n0 @6f̘a )SY#tዺLGS@@/ F_5jyLPڞ{BHk^x zgĉ3@CO˗ǦFb   )&xo-[Xi. V`ٮC?i&tl5jH3'   x>TRW9j  @ 4h&M]Q ҥK] Ǝk jL2I2@(^ >:u٧O;묳hѢ ڲ Z/@y0a[1c=P {e˖nHߴiX۶m a=;[@@@ i| 8p@\]d`v @@@@b%`` -0uT;Sݿp-9r].BZ@Hc'tR4"   @b !  )%1_b<"@ Y.2kժCO9yrܸq0AA{@@V1.]:i@@@H4>.\hH"V~}:@@@C Gcr/j  <nիWۀCuWK=줓NI&%O)\`ȑV|衇jA ;L^<߻U).ʋղ:;3ln ͚5'#oV  @ F֭qmF84 Ƹ 6   @,^8hk a@ 8p}]kҤ6gΜ`u?[b]wuVX`  @aK,qkժe%J    @u$Kٲe    sÇr5j( PcÆ ի:ݻwknŊ鞉;dچ  @ؽ{{ .Q   ڃ.r+TҥKML{-_<jJHmv!;Az&c'j*>|@mԨQkF\ ]N?t[n[WƍmVL\   @H ƒ%K1    @ -Z֮%U-j@ ytoi ԩ͟??h.V}뭷\ҕW^iE 1 d$k1>OP@@@@6oR\`@@@$oٲeFzC(cǎ:uXm˖-vs=zj馛L@@H>plOA@@ g}fZ 6GYÆ gϞq`< =~ԟy[`AW"Hc [n֯_?YfAl&mB@|.Q*p>e;# Dh  䭀Qk~m1s"   @va|[QPB_)k@ nS/ܖ.]YfPK. @R`ѢE<Ε   d%iӦ`e    F&M@A Y\G]tk׺Znݺʕ+Mі.]@8@@ ]&P0  @LZha7ް;mKA>SVF {m߾}1+GGyw}naz>#cc"@B1aexlҤInz뮻Q !n:;3 cNl̊-j?x@qo] A^G@@_@y/?r-֫W/>}ԩSQFvۃ>h*TʱERPγ>&NhRwuW Jo b_o=|pfݔ>jԨlU"@nŸ,XViMfG}tnW   `V/.\؅&.]G3) JUt*{W~; c娾ڿ9lmǎ%,;O0(Ph=@@@/j,Y{~@d0aϖ/_T] `  W Ƃoi  @r (tO>wynvGk|^wO׾S@ Ma7g*Uv)vO 4[o={7dELA"TXѽ;HQw@@@3x1,Y2h0A    #K5w *h+H<]HꫯC=:5TX.nժUx4  @ ,Z(XAE]g[no*0wͰNp&CȢ .]C]P!kڴrw;~7}* W?>QX372qǎ.0TgqcBAde˖Gq˖-s ow߹q :Ǹ)|sln?@ i׮5k͛9h+_ݻeV< F?_2>ۚS+* V~SPuuQ~Quk*sIס:r}ꩧ*uwC瞤nG (K.A]΄;(M   1'kC@@@P'ׯw=ȥ5k֬I>~kѢEc7ZUQG(v~gֺukvieo^{5ꫳ7 F'rhQTgk.'n.4~=-[I&._wǃ:Q:?DvӨQ#Bz Q+=/+.F[Z5~uZ9aܜ9s"GcE*/u!<~Dn¨oZj{7'|boFiLxG[n9YJǎrz9R(y~'xi4gϞ7qСvUWEȜu! 馛mbK@IDATL7 '^$g9WEY\sMOAVmB@ A 4H R<8c]8W*Uz믿6F?ꨣLz+n߾ݢi>C?{v( [l۔|F^{MJ7" *z!7ܹs-qeqcǎM3My퉂U:,O~(QEFҥ ԰OþךB+z-?:[ O?i+RZʖ/_ya%g7g;M$kǃy?Um۶QC5SO~:eI*pQuENPm@8 رjP|8քM#  $@8ON*R'@ C{c=f5kִѣG!UVu\?   @P7@@T=矛Ewپ}֭[h@ ʖ-ktkԽ~{UE )<@+>|H](kUW]3|Hp͛2&]M}٦*'N4ufHeݺu6eWK:tpOg͚o<}}q8p׿ڧ M/&jpevږՅ^hw7u3Z_x|*VZj-Is6|p/ `:vujܸ=="63>KF}qF;\U8I'd{N1b‚3+ U{yfѴg}׿siF_uQJovʕ+b'OuZW^q\2X_FczoW@ٕ+Wv:=Yu _wecƌqTw^~dW/j~oּysw\sof|O2ݜ}9/_} 6J%cǎ]}hX_}PMֹ?e˖_:r5Fr!թSYftfyF *אownzK,[uXk)YsD+:u:g>Ć eug-f܂ kRJD P#GtA?Cs֯_gxW^yDV 7`>6BL@@@EEC;  ,-V/Yw/H]pe%KS'  䱀_ F/#  )ФI1cgr߾}Ijժk}n[=zLC!Y-kE k֬q7*j+Ŋs7v+p=ؓO>;C\Y  D@c?p:ܡ    Xtij? @wyԁ{8xVk׮\ I&CoN8dէ9н *p.LO*Ll)\ SRh}QxyĨ._x +ܩW^v]w;u׭B-n{V!Unln FmEqAB {R'uu] QTY]_2g]O?t/Ͷm\6̠z:Z7Ԟr)Qj֬f> )My fzVODžf)x?XX),o߾.Nao>0[PfC=ׄ \aI݇ѰsÝN)@Lc "S/: o(Su>QO7۾./~|]9J~zBt~#t6m3^ ~}oͫGk[hEV(Of XT{wX8sLwW` ߴiSN?^iE![\r}n9fhSgo T\V^ U =z___}UwPy@k+m+0Su)oqU\jb<Y|}dqrqVkODAlcY+V?}.o tLvQG<"  @ -^x*l@@K@]pCkuеݺ^Q@ ot_ݽZ+=ݍ'k'n-ܠO>Vv|2A6lHFfTyy@@@/R۷o;y@@@@8OfX/ ׿I&N#]sav6 'w֭[ݳ " lRJz2lS5~~ ӜpyecZLܓo?ܾKj  (P,y3/r| *cǎu r ̪(Ku֮]uDsꩧq~{gd89@)L8Q:szHEhٳggYw ceUZ54nPY6q6l\$白6m:t4qͦ@Z)`K߅GAa7NSuֹc[y:(KCS@^_:FhE!lږ^ ͚53WZJ)]z*1ZQt¼.#GtAm kӶ[tb = Z:6ӭc7Yxչpd80ZBGsS͝;zXlܸq֯_?m,0N3*.\ WzY-3 u Q[nWzKÛs:^wսb~\1ΖsYu~Mq,h~.pʕS yiYu*wQyG*`Y墋.rayG3(fu~Ҿs$*8VEڮa:+PTǼ^LsAF%Ɛ!CܹYC|곈:|:(\:w<.Tz<צ KI^pc*U!@@@ ֬YCЊ:yY!䱀o5Jx)^njCc:@@U@oym#  $@%sTKݗҶm[ڵkp_d՞!|ge˖/^z)5&1 vUL+ǏF{' fJNsLܬd҇E.k>hĨ@}wGDΚ[T/~XAT=#?<-bH`{`BTtikӦ[L!|˗w4@]=_|qyǯ0VVs2*zGk7eʔM7>סю=XܨQbŊvڣ>jt+Χ:uBUn]U 4T7:7ouj۰aCP/ >ͪ FDŽˁgϞ`>]-p5jB"CZر["?^ *D%W?ӹ4EAo?N"E'l 8T7o^:+y{wO!*zcdNL4R蟊G7l0;ܱ}WV@}9RJ.YǖΓghk[ YLYQ gqzzoŏ ?3IW[l1׵jϽܼ.Ȣ}sj֬H5k/w<쳑&:(,V,K? Hr`+ZG!:gZ^:VYN Z|qǹנVI996 [U򗿸[@sݺRȢt:_LzӸիSuhBI^p^@@@@j~*<"@ ߿ߞx O?m~7nM>}h>   ?={'1`@@е̺@.6n8#]/0?ȶ@>ڮ]\ }`WK7gx@ >6{Fs@۷Iisrlh4+D:곽B'#},YgG 1 c@@@-Z0k  hSLN:nVۼy~˗/Ν;'Z  $ER@@@ 9ڶmk_|=*TnW: N@uϪ2(y+pHޮ![!C7|6rgcE֎+1tbqRO>vẇ  d)Pti7OFddiD@+blРAmh LAUupi :ZtixT%䤜wy6}t}'jQBtF:g?~AWUН!f_mͯpFu..ڇ>]s5Q6rHwé:رc#zF}o < Lv {FM!e*#=O$;yd۴i 6ek׮ujҤI԰K|{ m?|hp}r}dfdžnjyEV lܻwuzL+%yG]qJwu)lٲU+f3*@u!}N[㵬y#KN-[ڜ9s\Rk?NUyyݰ鉆Vǿˎ[!%A    J!֬Yc}u{z}cʕh@@@t#Mu$@@H^ݧpۥ^j{=mpg<MWbСKk5 1aʴ@7$t5C@7vFW\q ><1*G-@@@*UʵeǎqoAqT@@@/;VCԩSK@` (uBE|N#s9azL~L}[{9N8TV\ꫯ ($.\UV >aG/wVi87p j1IъiruARJ&pN8CCQp3-;m4ٳ08V|`i99'dž n{饗hmOhu;ʟ7wq/ [m.r;SU1>S> =hx-1'džE>c[d=>W6m4xe˖eUty5   -rUo+իWOjR/H!;wڠAlĈgϞ-ZQFk(   )E   .pG x뭷ڿoW'Z W^jOt7!P5kִoe>LSJĘ7%nv7ꍕNM pQl޼ͭ_|1]'*fA@@2_S$]|ϋnĨ (    @,b*DX ^8lNj:.\p0@@ >'I}r'ЦMkժ[_>*@O(\s qt*ULVpxzH Zv }O>tđGi͚5z%qcu4/ <Ǝ(oӦMmO(xG~7lMOwB QF4o޼42*0Oe|CZ?!dg8(O)F#s3>,C|h馛ҭοִTbU\ ƼxCa]t1X5g:wcF_OgUt,++25l`T?OfW\qq>r?v^ZNdeVʡj4?o3w#iV.9=zʗ/|Wwgښ5kZUMv2چ4?oyrrl(Tg5^y>ӕ(Qm?tAѶ(yG T+Vp0(ݧO{2Z`}=#W?<_N -ENÏLb7|pзoߨcjX))u{)@@@ ;a{@x 1~2d}?ߡ+c@@RFgvHʀP@@ @mڴioֽnOrذakǮ]G{W^yݿ{+u lycOFyZb,0}tׁxF`ƍ1Mwq7}̃  dG ATFdg}wbEcnY@@@2PGԮ]$Anׁ:g!s\n~:JG@@ $4ԫW/4,PlY{ꩧ\?c0aB5W}s^L:=*\,>gqRXm ?mq ӟׯ_t9h SgVeXL<9? >XO,a;Y 'w:3+ ;R?8y7ȫ,͓%V/hc<4ahQ7$/Uf͚j:HYzLUT)MS~mu.W{=^O S[vUz;εoOf8c>M1bD8c ꪫ\sj>W/O9x;om)?m쎓3< l׮SN^q~yǷ餓N2g˗/wC5j 9s5c87r?Okzxc ryb7}ۼy ^TXz"E\ot]ӵ Jr h"j   K, ~hذa^u 9X`m]UPʀh Ѳ  )+wޠzh0  Ν;sSxܿn:{)b-*8%@ sAW^Ay+]tBO?|W5UyЇħVl@@ @x " }aIA@@@Z1r!Cּ^?CB_}:~gKW^mݻw7(  @2L_ׯyL3<3{phe]VGz}`~|vחZspC ͷh­wΜ9 VZe R;wZ6}bwmڴqf%iӢnҏ߂M6:Oxw:|7o O .]j_{h^=&T-ҵRβ#8"ߘs:[k"\KN6lpA`~]Nuvf7 , [F[6Ovy+ݿ?93F*V~MAPrrމ֒*UN ^D 7'|mV7οGΠS o D.?rx:;oFJ}|xr΋g7Ę@@HfŋoРA0 _ުGv'ۧ~lV}[R   +MA@@(6e˖YǎF&M-b[l 3 (cu3_ӧgSJ ƃbbx 3 lkgu6W@_rٳg; 9ydSr2@@aZ,>Quy_<ƶ@@@@`(LN `RZ@P;G)p~sS> ݻqd4@ 1%vs뮻ܴ[^tX Rg>\[f̘a˗/w(%YTغu_:Ȣp@ӭ[ə>oݺzn͓eϞ=6i$ /дԩGul S}U>C_\sZJ“x\ݧcEǯSv=rʹQWVG絕Q=_g>*P_FEǥ5;^H}ߒҲeK;#b9?W\q[^L}G=a܏n >wѢEptM۬Yx?oyL#FDn1{yxvV. W +eDj֮]ey'+WB vM7 :MO?O>~`D֮];PP2]ne۶mi2|TJ,j׮m2Q(Hɇ/7^Ͻ{^u: 9i:ft~^_oN{>3WM?\2|[F)RڷoG[͛a kz"w|skcNyرc]AM.]9+3'}i~iӦ:-סέZh>Dͯ@z .?)u ?^ U0id@ι U¥L2#Q= :4SZyK3`T'xUWBckԨa-ZH3_*?袋~ns KK?fkÃ4#3x Fӽ2X,GܰaCW_uDףZ#7l`_~y^f kw`"ܞwƏoÇ_5]Y/t5knzx7l>SQsٲe$UA]t#;c>v~Z^uͽrlڴic #fSH{'G3+ ftIA (ߠd7֌#  @A_vksu*c    P VZ ƀ:W (BaJ*űl@ĨN8!oVZJ@9;vtcN:2K V̬(Ft }+اI&.h…0ס?0;“tXBdNʕ+&LN3fu~STRC -/r6D3)~ڴi9Z_WbL!Վ?޾[w%\W_WHȑ#ߋ ]`_իgϞ^?UXMgyM:5lZܹsB+5nUزel͚5Vztj&' BJN^ZEODB3K.mK.5dٕzreQ|ٽ{txN:ez\3pPBwڜ9snݺ.p6c w(V'+V3ͪFA H=\_ȫڵ%Z0\xEjw |:r\|"/gM*@[g.}ޙ9s GkGMΌ(4>}pqߣ^y6dȐͷ9(S!PjժeI{d}PrF5ouג9EA fGΝ;uN2ŝ|rw Vl^~}ױJݨYLazg8zhw<}.VmkQm]b;+7on닝>㗂   *Guy~4 @L~}~vʕc]V  )@cjwZ  t]oF~Mk d{woSqg2ː)QHBRTJe(*I24IJTTd&ks9{"Ϯ:`=QF Ę:7JKI:Tlْ=8- ![ML7bjn:uփ#  @ hK;Py%m-   ĎAs.  &kWpW4z]Bbv" $p[|krŊM'/mՀJ*0>}(HdPpСC]B5^ ~y1_lPK(K..2TzwY-\pާ@5k0FCO?;ln1o /B, ^ d ۴i)|KE:urL'Sb)3 Fz&'ѫ[a `[)Oʕs֦pס^G}׿ 2e )Ԅޤjkb\pwΦ'> UBż036mhI&n+LRpaСw7[ U؞Tʢ1%VlXTx7l {l͛g BƎu-U{i۶)loqt >LkJrznh9rV~EGvB3_ yz/*R /V Umv~/n`̬~QBz7nK/z7էŴ~={4GǎMsw&}.`螎]V-7/~W |\>4iB0:M[h{Ea@@@$ρ) @9bÇ'|vF߯ 6+@@kJ(@@"WhѢn,K6m5 1)bĉ.kJcNv]y!Z!]i ƜhJ˖-C{=ݿpZ hRO>W^ֳg( MG >37[I5  &zDZ*'OƍաO8N׮]Mʩh@ @@@8 ՠj50Hk]Ig͚uܡj7uժU[@@ hP믿]k,VTYA[w{{QFHooM 6K,P+ۻw͙3 ڬ^ȑ#mS… Mceʔ0I)LZ(PJ,PҺuk3fT1{Ν.0W+&FV; s9+n޼zƧ 9&J^۲e͝;׽h"c="hf#*|\%O'>Y۷jԨa 7C?5?wd?c{ >_ U'j~{AM):B~eʔ)96 ScMœ]&Q&QNeܶIΝ ս(o;n+ۑ#GJȅ^P   _p~fIHûK܎۷#F@N!k};t`+y浧z'C jn@@@ hթ듢z"P  cC)yJ<n̙3/w+4G3;0 0jQn" ov!.]7g"  9jҖpaΦpl@@@Ae˖bzH#ŋa'O|k֬Bb֭{z  "#(Ԃ@(riu !ٳcFp K΅iilժU+Q77ՕIo?6&Yn8"Y;Rs'[lnBәC?+W Z) ^L'M:EĎ9RD o[@@@8Xh/PB@ 7n]ڛoW[nwo,   PȊ!1ԉ  @t (@@@ Gu 1ԏ  @t \q6o<4h.c޽n:kѢ6|p+W\tvV#DUZfl~zZcQAq7ovw"_iCo?5lٲ6e˚5kxQ@@@ ٷo_X=r_S@@@@` lڴv+UT@Çȑ#Z7nϝ;u:wlٲe׳ ĺ \gn%KҿL)_|qjvcbR`ԨQW̙S;!mFHgv!2MvaT7evl  ĺŋ]5.hѢ]!غuwv1wtٝwi  T  $.@c.E@@ dʔ}Q[Sg̘auz&#c)Nci>Z3ΈSu ԹWx ۾}jժHThӦ}n3<>-@@@` w9r߳g    p+V`N{.T^l_.^EkD|@@ N8`˗/wPi: *pQ@ӫq^#1~^ kiРAn 5B |J]F@@W@c/ׁrEoGh9U@u6o췥J*6b]@@@ ӧ9  D@%lʔ)GYǎmʕvA۷;6l0kذa"4F  $GQFpBѣeΜ[IN5l@L eDs/eSx+x ;묳Bw0jF$ݫW/xmرVV$@@@ }ya͑#={,    +$+ ʕ+Eߤnݺp,,  @ hЖW*V-r   R@x[< n@@@/^#/__f8/֭]p6k,f͚~t2dg@@s\@@N1Oۼy^z~'&MdnUtG׳@.\~]ͿSOK׃OH%+W_})StdHٳUVMY@@@)5kVñ3gNwY@@@@NWI:OW@ P`ǎn"]hcǎ+T`~fF ĥE~S   t؃M@@@A {h]GA#0uTӵ+neݵ JN5l  7^1]tir<  %P\9/7ߴ ڵeV]tE/V xG,O"i]֚4ib76ze]uUQ;"  8z R+  "вeK[diƼ/~WY eT8#xȗ/zxi &2d_}ןn)ؽ{{mذY^=>|x kas@@@ 3gYb >F@@@ V\:?~˕+Wlw!@HLb*Uxl⎡X}Q[|o2fcS)  h=@@@B Y   qK.umzeʔ  #G?o*Tɓ'Ҝ `ٳeɒ_   IǎsR"m@@K3ΰW^yž;;] /XŊ%zFkH>hzM曶bŊW{'=i&߿kR 瞋B@l]vYN/y`P?9rĞz)hN!0!֭>|#XCv,*FfΜiڵx+ﳀ  D@L&l*   @ڵ<+z̙3C[֭m۶mi @ w}UyŧY@45F:gכ .Zl#=DPN?klŊm„ !Co<-D@@ b|^z%ٳq* hvu/=G@ kk'J]jH#"EثFG0 $Ppalٲ^O'"Q$MEMɦzA~7K,1G:   r/1}) _{ַo_;pVZ-_|:@@@hg*1FY  D<,͚5{f͚:1fmv7F_h1ȑúuf?=zcƍKdKVs Mo=z9h K..yAk'OܹsԎ  I@(H^hp\rMصk| @@@@ ^*#0c ԩ-X>|'z&XYX@@R-vZ۳gۿ|򩮇'k[npd@Ȕ)51  Xnر 3d/@@@ V ƢEZ,Yb {)SFiױ  Ă7 (   @Z ݙ3gawݰatM֤IXPnC ۷&L*VD{飽?{9[fktF~Z@ |O(D e˖t@@G1DE7 |g@@@@T+܊ J௿MڕW^0j@]weK.]!QuJi, DEUP_f@@@8ŋMb)X@@@^`֭m65 ć={SNVvm?1cƌIBi@/@@;L2>9r$N@@@ 24K۶mm…ָqcQ| 3fU {{G_;Zvg iT@MnB ( J رc0 ԍ  D@*p A!9T   @ l޼Oc> x guU5j֬i/]tE:@@#@`BpYˏζpl@:u.]vm| @ ZٳgGZ=-[B@@@Xl@O1-[6mlʕ~?UfUZ_   k^B (   @8 .l'O'Zǎmƍ}vkݺ7FesN8ȱ8-vmݺu6i$ٳ =JclgcFrwze;wtM{%|h[, رnw-IűO  !@c|gz   @< ^ve@ >t1oΝPB.e˖.]  @ &/_>!p[pa0@{&8 D@ܹ#%ی7z  $X| FbR@>C6fٳg޽{3dg@@E/ȑ#=  Q(<+}Wo̘1*Wls!'&[l\ԃ>hǎsc" @cXx9 W\@`n͖,YVUR^{5an@@@DE7+vE@@@R%fbŊ, @l ,]:udӦM;'9sY@@s ADwi $  Z}١C]ׯȑ#y@ؽ{ Ncq 5xr+E@@I?KO1'0ydС[[zlԨQVti    @, xA꣮ o   7xnVk۶Zw4i==C 6mX߾}mӦM6~xӧ*U*-sAyӼݺuÇv ,mģ&]op'{HA@@@ FҧOzpܹsMعs    S>D.Յꪫ^0B|@@ ,Zg[޼yCz,*w&4 8 @ nƌdJ6mZ i!PbEMq F^    Xr> Č&5mĉ~4{tY@@@b] 0xQ$z  D@ l^zɎ;ffͲUΝ;[ "# d˖ͺtb>9ro#GB(_ۇ~PhQ + t7cƌ%KQn@@@A_K\&ڵ_f@@@H@`cSS @L4->3~^c0Fy  ;v 6    ۶m׻C*   'j*oJ(//0agA!5 Z6maSL@@@ Hl  ^ gΜ6|pꫯL2]%\b- }#8AС͛oڣ*E|۷)/kw}Z,   *!CH bܹsgn@@@ )! Le˖Y [nk׺db=zpx<u! B`1,    @2,XoUR%@@@V\O~ D L6o6o:?~{?4K@@@ AL}E  X/sZΝ-}ĵv؀,1Lj@ܹcǎ7[\yT3!@`Μ9zhٲeHG `{nwnU{A@@bBرca>tʮ]En@@@@T Ę*6vB *o={ʕ+6_{Iz~i˞=@@Xdr,    ? A>    @ =z֬YJ,  ƍ3}ݹ馛l…v뭷X@@@Q x<@@.C YfY]G8`ݻwK/Go/iy<tr:j(۴iSҥKGfi  /{IO   $C`Vw   @| zC9@_`v 7mf[lq*PM8&Md N@@@4eW  D@Z~~ؼgϞmUVѣG#4 ϟڵkݻמ{9h A"[fkXT:tM0~    @rWk.@@@@ 5^c"ER; @ 躩oѮ[bk]LG Zƍ#4@?%K._    p*TT_f@@@ V\(Q_fK`vyٔ)S7k]|7X@@@] k֬>e@@@H3Yfٹ뚻~XN[|ywŹC=dÇ۷ǹAq֭[gugȐyXԋk׮Nt7ްҥKà  Ĕc\wOKܹ&ܹ_f@@@H.bڻwۍ Ɣ=%pa4hUP}qճs3/QL3|##   ^c…-_|ڌ   UV,Y_fC`ӦMvM7Y-l˖-gu&XgyfttV"  i$-[6H1,   @ ԪU~wܹO޵\?UT#F7vuƉ@BUV}ذaqWpҏׯر& @6nhr:t{ָq@@@0 D҇1Ia@@@AA> DO?dիW]ڞ={\5رc/;4@bYȑ#l22eb @@@#~zۼy NԂ   +WAOQ!{YJL^Ѽn ,&MxE@@ bܷo_#,"  #m b3g49Vٻww}֠A[vmtƕ@n,cƌ??Q\!t?+XDt֬YcÇw͢W^[%#I4L͛^zOdB@@W Rw@@@.}߫AHΝ;^zɎ=O>okyIq  ZM~yAwˇ`Ԏ@ M,XЊ/n2eJqWXa6l8n]Rw*Wl9sLa7~_~ŶoEY`XpB 7o$۵k͟?=^\9˗/_&.]:;쳭Xb!CDڳg͛7=VbD>ܽ{nM;wD駟lѢE|rϐj֬ie˖=a[ڒ%K .fz6rz@C (p6YXoٳg7M6|s3dɒJ(a\}دj?i_l^xN 7ŋt9r-[̙3iqSjԨjLB|fϞ۶m۬p8u97)^/zP@XzٯTh׮M8`z W^o    @`{ @ 9M;=3mĈv7X@@@8Q L]7KA@@YK.n9d4:ֲehmA]p믿n+X.]bAsbxΦ Bܾ+ۏ?>ɉRX5#  'IAXMsE B@@@Xn>}KAxLH?~Vj#G4,P@@"S 0xKAmM`Μ9V~D`y)py ˀ܀? ) {s(QLo> F]7|M[V=-[,(A'oƌMˮڢڵkuӧOuG6|]vem3w\ԩĊ_{5=7t@s={ȿUw\]w΂y&Vg4B:̙3W˹r[nŞ|I?`ᄈFPؕW^Vh/ϺA}VAV[T)?sd7wA6 A8d۷= &(p̘1=t*4h`ӦM \2 ftgu:B4y8E 1'@c̝R:  M 0dɒA@ 4u]ܴiS7nCsPjE@@bH@sye޽"   @ ȑÆn7pj֮]k;vpc&OU&1!#؛o4>˒%KL- 1blR 6h( :Sdʔ&Md\:ojF@@ xK. ƈ84@@@X~>_f"W`ժUvG}7RdȐ_  @ ,]oA> q*׀Qٰa`rvm?I]~9$P\²uVk֬}k@WnjrP~k? ҵ /4Hj1q)S&O~̙su ܴi/.cǎ /1w^bթSxVti26QTiE { 믿\ СC7pS ιw8SHѣmر.QA .5U%Jk~9aM}u_uvmqtcYmRhQ˞=ybt F5jp;o޼呂Yfu$ׇ̒*j@ ~RP!-/0o<ʕ+,    1ʕ<}CriaÆ٭@@@ o-    +W]u͟?4frXK3f5l0VJ?\@co&8q[΍lݺu*u'1un아c=fGq*AZI@ h;üZڵP3U   /IA7n;wF>-D@@@ 1bO CG#x mpu׹W/@@ "4 k.;B:t?7d۶mUے%K[; S`_&T ƤOޯN!z b9s>|2f@S 04 <:tŊsoNP,2dȐB2D+^]Vw6myATRX ;vlPkQ4СCOay?n 6݈/3gݻO5;nrӤ:v=Sn=~6={-\ЭSaܹunF^7wAc2T&Lnt_M6V?vuթS'F=xK/cR  9rS)d͚+@@@ذa [[y`éc~G˲eg+כ7q@ٲeI{jC@@"O@WhH(^Çm޽$ڀ   Q(@c4Wpл6}v}.> EC\Y@@ K.uG-PqahD 4%\,7]gcyɮZ,Xm_$>W\p*ŋw&u 封J JR 77%%^ 4 7x=s_vm;ojժ{LuuA۶m>̮J˟?AYVpJߠPI (dnrk^}Uw?_|-Z6m~Vre^ժUm WN<zuQ7iQ}^;׮]͛/_?UVuwߵ믿|TnV\!lmj%Vǽj ٷo=v[B\蘜s=G}٭T^W;}t8y=x?|w\[M}}u 6_Lc=_^|E{Mº~w{sRnٲev2۷wI5j԰?ߡC7ߒjƍ>믿y߬yV|y0sTbE'+ ѣ]uUH"Pdu(dwG*z}S@@@?7,Z[}/YfMGu-KM3r    @tW͓@@bQ϶?'*l󿃊žӧڵP3ǣ|O>3g^ilQ@ 4J~\Yd1 94GV@@@ 24J "A^dg    ]5Qmڴ1MM>=jԨDmE@\={< 2 @3gvx#o RQ_JO>5l)gϞ' bT6 /U}(`L5uT z#JmIW9M)S.]:D~AnIa[ÇEY >pl͚5sp'Tz+s1Y&*cF&)G^~w͍򺤟Ǐܹs+⭶ 6_л_k^a TMlݺnh5kָ T@^.] Sޟ&k[$? ,hޡC\έj_\ZVȳs^sAzйBD;vo}B'Ntz<̞=t\ lԨ{}pݺu.Q! Ν; >TNvnԎ~۝MjBH3fH2sTXJlܾz?k.ӫ[] a*U;@@@ 1>:t=O>v}MA{@IDAT@@H@N  ĺ@v+-[h\X=ܵo/^< _ \}vyg±'5oFiP.0EJ&n]lGeРA@@@ ^ Ƥ&IkAi}|   !1}ٱ!z@ hbs]Zn]?Qh"xM]v%]@@S`ҥ~˕+/P8?VTT$XRMkujݻjݭ‚48LI4f޼yH˗UT SSAbGO* JJ啄 6 (mr­m 2aw`6}Pիj7md=)@+5Efco M yҤIW_}eW6)Qzs! 6}mk.O]n0Xiݺ xk}.TP/ 6py+O%0{̻UqQB~ʕ+-ZC-߿ aTЭ-{uMBWXa T~{&UQelʔ)B=ѣGۛoyCkoJ*z UL8Om۶uy_wu_&SHgĊYa%Jpg5?Pj{ɒ%]Xʕ+ݭB5SWU׀[:*+VhUzA_~{h?Sޫʳ>D Zb3G@@@ x߃HE 9T@]uUֹsg?QOֽ{w#|<  $K 0QסP@@@x([͚5˞x ܈rUR14VFcRV2[oƍ袋iӦ?5"[lqz   q% TB19Qj s黎g(    @J4&V!1zl@h>kӦԪU^}$'MK@@  Mʹ-rPX#n(M껂NUnSm+wj@ŤJժU]S^b}> $E <x۶mX߽>3%K4"  1(l1x  $)k5@k h͛5%gΜIB@zLܸҥKPYgl]EA<.Zk@S@@@x8v?a79M8lp|@@@S`~ b)X@ ,[n;M6h &5k!a9+@@`(\|N:OH ?M>[%U2eVRRbXVZMM.W~w .p}|,X˻wvW R\qcCh@Zn݂u8ӹѸX†nr,Xb~؁˔)I?zʕ+A%:tΜ9sR U?VUoHmΝ^bbcG-[&_mŦڮYf'lH7 U9pd?q;+RH{Mz>eEl@(/01YzB̫/d{LzM+TU壏>r=mC^[5~ܲBuj(F~})/E*sdOhR`s'lx+ (Vq=U S60zy杋Ç&ViӦJmSv]='RgW'~:szW{޲nOj_۷f̘qx 4@@@ s~҃R9'9[jB+f>yȐ!0@@@CEyM鷌@@@и]_|m|7 /Lx'^i\ѣGwA6j5-)/T]5N;ϭbqin`GH   @ hxxu    Q,8Y7nw#|=5Fi  ;A ȡ ? k׶ɓ' X d,X䋁Zׁ|UX7|sBĘTަM[oMtgI)$1G>ڕ$T!FoW}ݺuw^~4}t6m)2 ]T NlӘ#KX,A/* IF뮻W"T |,cćZle͚7nTuAYאΟ^G&Mr SֵlfΜgwqGRE4-{{\Ҵg=BWu'5/Y$~mjkԨ ~{E`qp_l?M2qty繰V0YlrLvUT?}xy+f*f͚ޮI~u\9lٲwHxmXZx\zUtz{$VB,ל&0a_{ʕ;ĪbQ%qF1@@@V@e3??ws   p+ū[@@@ رcaÆnXlժU =) }+ЦM{x^{zmgyf68-K|h@U+k.QӥKgMs%m-  @ hJtZ@h˗70~vEٷ~k V)Q_Ug"d,(0[nBP ,y Ja& B`Hg9s]xVn]>)[nqTܹsm̘1.Qm۶uYjS$իw&UdI+U]?$P>}R'g}f \z% =uD峭[4ʛ's.\ʻ:ε£ҢTTW^Z G\5B}$W@?WSp ?~:WϦMCר~&{A\˗/wO=$]Yg,;c ?S~gƽɊޯ+^0nmuIY>IቧJs{N^' b̒%vw[W{NVm2du̙c C*T:uX-L zMq X}(Ȕ   @>oR$iCYF ^47ekz 6xe   @N]gϞ^Ù&    @4Dዺ~rc6tbV@0ǃKWAl߾}njϞ=Fc\trTC#q8v~aq5׸B@@@ ^:wݛ`_M&g@@@HJ 0t pޤg=O`ĉv}͛J/[Bu,  ĖRxqcKD%\M65 R^+wu}AR…MV^bErJ ,_PSkԨ*}do$w{~ :nϚB(Ur.v1U<6jov1b^AsP.$7100>Qǵ{,-n5)l]8oĘ#Nڸ{n@{-V޽{M2(d7E֯_߽G;~Uj֬~͚5;1i UȢ^u2e͚5˶m&d\G'UՖOj}RVKIՑܽnn=:~'96m-Y*W^1Mās/TXQ} @@@+vZThQL@ ӄ3gm~m;su,   N3 1tԌ  Q&PT)7~{2n8[nF@NT>|u͍GƾS1" lܸ8RO= D D1cH".TxxB@@"J~{N69Q,1n߾= !@@@>~C. I*"RD 6XGPHdž4APҫR;$ywFI ;=ݰ{gċm۶v$7D$aH  @oAݲe&B t2XEe;wz!Cqa\2: {dv9R4QS8ѽ޽{Ꚅ)NYg95ATÆ =z\=MXeϞ=WlsV8ۜ}5!MBr9w&3ЯoZrp2IK.c̙mN??WSIL26ydSw >ėYcЮf&m<}tQ?.s1I5e̘Qtnݺ%x|zmtL:$}f&zwg>׻w^uMoƍ5deʔ1hEAD9B 8UDz@@H}Ç˹s̉3: _-UVI33I˜@@p~,-ǏwV  {us/}ddz2p@j:E5~LǧI=p.!$]@:u4.|+Khj-:ĉ%_|= !  ~$ @Ґѣ~I    g_ǹq+(0c \|W{wlذ@h7PA@8w"r\}M65=횠W]vyLNq1: Gg}rLcmgΜuwŽ^]M)_M<WӇWjYtݥN:fqɒ%q&$QNztbŊ&`Io&Rt_bEI[f*;v]֬Yc>c .Y 'm۶Ź k?r䈭;D5Yf2i$y'I1V^õ^kݺu+x^HٳI$^paМ!] 8 ^vo5? 0@@@RY` :!ROٳ{G?,MHA@@H;15gB@@1Wc5u܅~c2sNW_zaC9rO ۆ=V!.?>#j9o߾61"Wzσ>(.\0qFU@@1:7i_7!   @` cۄ[;v9]u|s @5 7.!wi6Ϛ5K%t{sg}&;wtoJR=,,L6&O,_|9Ng'N"K.ԩS ؞3gNxlڴ)6]>}뒺1䌾Lܜ'ZiѿIW~жO?4&J ƹVjjժb'.]MB[oy)lbA tmگ\?H@@@N`Ϟ=6f1Z *\`ݺuRvm;m۶ |4   3yĉ`@@@ tɷ~+3O^}FA tK&MLz>d? &0 @ 3VZ{=;#   7 Q!   @܉˗8 :!N֭[+:@@_I=%c_oz2MvXn]H|k2Ç'C?|Io-/bVŋE?p*ƣ&atKf& vj6l1B~-;wwSNI2e'MoҩS'M Źޱ/_^9EI4|QmըQçT߁Ǐ۶u2! 5y&Ps'Os='zjʽ9F]+Į9r$, (;)S&ߞ@@@?pO̗%KO wfh9z'b"@@@/gPQEP@w@'TwO荁=NDK  ~#NS\9@H/MzWX!3gμ"&ӱ% M /Ei+n$>5k֔9sիMne˖Du~{g꯼Ic30R~UPA4 &i"EȐ!CY>#S@T1ڶm\4k֬}w+ ͛77}N1|1։ոvڢI-[f*TH&LS M*&HtO6t&{GM`M׮]+ǎ3kRmۺQc_+MHA 5R_OфX:kK4ɠ&:>zرc{1=ժU3+V{&9}vm&߾}.9]w>[߰aCWoZ}xN8&wuI L$8qyWL:ռW_{&lɒ%e=X̜9IױNW&muH}>>{M?`^?\lܸQZ5?OiC.Dh[nqoٳ8sG甾Ο?_-Thb={åG&1&Կ[nj~ߏ c2 'Nuro]@@@W@?Wt3q#L@?ҥ|嗶!^`R|y    @ɓǞX,U]   ?oQVZeo%**$h_>b@tܕi1}o߱fHG@`/^$W\JAHXةS'om/T@@@ b"ƐdZςu@@@H18C@ >Mġ0hLLX &>Ӓ)S&)Q/pwu]gv8p`;^P5jI .^hiҢ{1z) eM.^MĨI4AV׮]E%nٲ$t^4& sw,9R5jd!… ͱXIYM*U86zmnH)dKj+^ty^i:uŋjժ^ RnjRoF-ZdC*V|2~tkR}{Lbk":}gn&5awW{K\4mMLI=Z_ƌc0jR=O>q^i0BK6@:@@@H~O5넷:C 6L^:[o%]t(V# mxi)[8IЂ5N5k+rf]Νc$c# 8uhRcǎɵ^+ʕ@L֣מ;wJѢEM?c'`B?~$Y9&MD[̙3|rڵk&(j5q^_HA{5^=ԩI@}J*&m˝;n@?I߷o.7n4 4ۧ Ruu:""¼F(P )>k֬jժsdeoj?]$G$rכ(;ٮ_ZUxqgn3.gM֭3v甾kRJNcjWgϞKkߡyK}Ԥ>VdIX2};[RV]TYN&wՉu2 uOI@@@ қWM62c ݻ#ތ#GJϞ=E ֒'O3f@@@;cǎN˧~*=w#@@@?,Y1̏懡}&:ɓx+I(B63t]>}HơtPH"'U@@@Gܹs3W3=(*:hCNPDA@@@F@'I։xŤW":pdŊ6 {:5@@ "##MFUD&0P*EYS蠶U9.͞=4YCɖ-T^$7^M X^qxZ@]vQ?S /!  "o>s^,@'E P;mׯ/_|~Nm;B@@@g! %@@@ u4i"+WvŋҥKMHA :G5I>O:%cƌ>zx1zx/(}5k XbB[]#"ouI^L'fKDDw@@@ ={ֶD:~2QA@@@DHĘH@f?ܹsfL2ɫ*={3&p4@@E`˖-eʔu* w}w:>dM2E'9E'B;s( /k/1VIbOH[74:@@@N"Ƽy޿HA Ҷm[پ}i@c{eȐ!ʴS(@@@ uHĘ  -PHY`CFe:'իeڴi9(Tg5=u&MsI Rڬe]o+K[A \xQ:t`a?MaZ@@@LӶG:ٝWJ}z:;wdmڴIuM7s׉HU^_΋UҭV`ʕ|d)   D rW# f/\`O?TZly5Ͱ/   @ 1߿?@@@ #G 7 ]t3gȲeˤVZ_7*{9se֬YҺut)5NN"P 6-Z$?UR WW_5٤5UСC7 Ύ  xTԩS69rzzWmXbv     ;c|ڕm ٳcǎrA5$$Dw.d͚5#X  [l/SSA=zt:9sdyr5$ uMqIX%݊=@ mVXaOXfM[   ?~\Ν;g0Hs9:ud&u_L}=[1Hw"5j99    ۷K"FKA$ _^믿!!!ңG:t(&I@@@r!O1 @@oMĨG4)yҥK3ȪUh^# h֬TXQ6n( ,kךği˫dj` ~A~L  7"# _@'|G$**tRZ5=@@@RIQoJɛ7 ȑ#N@@@HLСCv1Z *$(f]v$wuz0&HF@@ Dr  #-[6Uɘ1N*UX+V," H/_6hJ(!{@@@ $bLGĉN:6 cxxL>]x 0S#   \s5&j1#d@@~o6{lիO>ƍ:*\@n!JDr%S}- =A ˲i& 7㏘7N   @ 1̙3=>|֩     1ϟ?َ@ 5Jٳˇ~h&]qNP  )uVdɒL+@@@@ ͛ɓfu͚5cof@@@!#ON… SOI5j˥uW{#  xBIxDL  @ dذa_ί~3^ڟF(CICJ G"  A"L͝;gzM"F\ A@@@-[Me˖u*    @B$bLHm   *NX`AP@  J͚5?0{d˖Mƍ'GYs@@@AIĨFFFCĈ  @5dҥRn]ݦM>|@#еkW?N`>D>@ &M&V2]UVM@d۷o7nԨt=]   " H`֭ҥK:@@@@ !˗͚(   @lw"B 2+oʭ*0%K_U}Q|@@@@q׮]#  xK`pBi߾ Lٳ|֩     8wʕKBCC۝@dd4mT+QQQߚqҢEq  زemL2N@@@HH`ʕfs"ED'0    [I,I[`8s挴kNza {/_.5jv  ;?0#   d" <9=zqrI/J,x'm~{D~S!I&Ɇ L 6͛Yh8~tv7ߔ%Ke*    ;v젉 Tk!   Ip>ȓ'OfCᅲjժM3f(Q .@@$b9) "   ۷oG~֪U+K@@@'pAs` $"""yp(ԫWOKӻׯ̙3G>/8]B@@(^?-@@@ U#_|hbF-}h~ݻwh4Zn- 2eI1e]'.]$mpРANR&УGٳgiE㏧AF@@LIL;wnOΝ;.^(cǎhWVށ.0aٲef&Mo.?D`'s AGNr@@@ ^KĨ',H@@@RGr9ӸNBA 8 ۷2q2~x{ç@@@d8/^\2gΜ8/3f?J lݼ$(F@8vXZs+b @"FKA@@@ 38_|@p 1Bz-QQQB 2c )_|pk@@@ s9sʩSdΝAc  @ ?-[͛eϞ=r7̙3cGH^ҥ :T?^zI r1Q… 2h :H3gD@oHѢEE@@@ pE_iɛ7oZ6@IDATH]/۷o#GCôl   ~1:<ŋ]vw^3ʐ!CgϞ$@@/'IEҥ}:yI`ѢE?@RK`ҹsjv@@cDjXt   ɓ'M(:֘@0 ;w̵[VZg}&aaav@@@(Y]V B@@<(PL;%K͚5I&I6m<1!yExrˬYdǎߚ^/9qwc3fJu֍w_6 @^yٶm9QF'`D@@0Τ9gpTttI @@@<'D</_ÇKƍm… W^$aLk)@@`زe(    IX|٭@r5$A@@2C˗֩ l{_I" 3f1؞ @@VD3gG@@Z@zZliN}9{ei 3'xFںVB5pŋeذaс:Hf|5ji [l'0Q`99@@Xѣ^LuAq/    .-T|'N#]vLf͚ &@@@`p-gBp}ҥҦMdZr)~Y2@@.%KoݺUTb   @o\ƍ'Ѧ~qѣGꞜVERD ٱc̝;Wv)ŋo/oA}2k;!ptL2A@@@ >|ضDi"Ɗ+e*    @\Dyk!6l0ߦ2d>}ȀD@@|-88{yy 7lN  2e{.  +VgUSA@@@-cB"FG`8qtYΝ;gtΜ9d$   *UZl޼Z *   @رcE~7I_|E9v <8m,~%s=iΗ_~Yd2h ;Xfrkiŋk֩ @ "ׯ7 \'q$   H^OxС Zt@@@"@"Ƥ(O |WRNq0͛W̙#$ c]l xHtP@@@@˗/լY֩    p),)˗o߾ҡCQFl2m˓~"  ʕ+gh"F    @2tP{r͝ԭ[7L@ǎ%SLf՘1cLBFvSĚ:&L;v[l)kN*A$vZT0"cƌA$@W@@@ S"FwU5@@@$cǎɓ֩ QQQһwo1b^5dڴiRdI   !m6lRlJ`lٲEZn 9shSNI:u<  r?TXbmD    @,w"|")pYyeԩO<;vN    @/_D    ./VO?DGG˻+/^_BBB%&NM qodd̛7OoHT$bL(7_t&Ӿ/лLHuCG? 2LDZƌC"$>3ٶmERNH@Qdٲe&뮻No] ^@@@sH:9JmHXJ*    @,w"#2zda tIƎ/ŭ*~mـ @ZTTI6nܘ s,_D    @DcV!͓mʩSLJ,)g   #P\9q߾}r1 w6   NڵL2//^qƙk֬7H%6   :rexBR$>hIĨ:#},M    @ 8q̹(@I@@'VVt-+We˖Iƍt@@N"lٲo#!   ,+V]YSA@@@ @TT8ɓ'fK;vH d&\rٳcǎ~F@@H[L2IŊIIĘ @@]ʐ!C!]tse*)={vi׮1uT _]- ֩ hr ҥKW^yEJ.} q   @{ۊ-j^85{-1'z@@@Ǐ^Z cVzɦML Y7o!f@@@tR9ÇeE@@HL_e\2:u=;vCDp|W_}%7n4-xҸqcNS,xŊ@@@@p'b,VX,1x   @ +N2 @8}iFFaӽ{w9s\ԒPA@Hgܹs&RJs4@@@ADp@@ѣGm $bTT`ҨQ#ٷoΧK5G   ^ժU?m    tvڙt>o]v@(ԩ#*U2e۶miv(4 p$~֩ ߿_zm$sv    o%cl@@@@ >LBҺXUHsʕ+M{I׮]2q! {`I@?'N{=/.2eb{$^*UHΜ9݇Ǩ>}Z:̱co\am+'Ou֙˗y媗W^-gΜ.\ę!C.t{nSD8]l\t)m uƹ9`V"@ \pAfjti@L n'xBKyeȑ~ѧOyפy2o<Hk'cl٤B i}z·   G$bE L:U:t ϟ75lPfΜ)$M   \v/{]we*   1z&L={ŋEjݺgϞ[M tQzaH?~ 80Ν1%z~viK&M4 N|GFy+@A@@D@'FsJѢEu8@@@@ >)aaaNG(cԄ]q%^zo-ѱM?~VtYiР?sWФP;w67oI"FdIG-[mI,Ry3I۸qc?~hB9VjMMWIy:u \|@8Vٺu7|Ӟ4NXycČ@Z Zj1cƴ<=B@@3w"p?pY>kIU'O, @@@ԪU܏j"F    d"|;cW\)O71:.vĉ$b Χw{ d߿SAq5+TpWG   $I+VֽV!׮    ]'OreT&J&̒%KܹsB ^@@X`۶m+PK9 e޽~zi߾L:Ux4_b'ٲexM0خ];%$$Dj׮-3q^Z-Z$K.5ɝ4cBf͚ $1v-ʕ2e\qбHvZџӧ;#<@kBIM.NH.cb>wܹӬkusvWu<@صk[}Di!s$z(̑UVd5j@@@ ܉#C$I`➏sJƌt<;!   @Μ9͸ 61. !  ț7Mx 2eT^]zh ) ,(M6oVto&OӦ@~!0c YfnݺҬY3 @`H|*q!  ~/cӇP3ќW;THNGA@@@Л͜Sg}&:u/Pz={(P  @ 1*U*%:ƍg :4SO=e ?#ڵ9cѢE寿.) LBEM8~xyc !u@b o$b_ҥK./_~ɬ}]Zh!&M2͞>}Zy駍AQvmV0jRD} Ξ=[NΝk^>hɒ%WkJ-cǎMX9'e q?|+WNjrt     1!yY@g0Ge|WdРAv    )1âsȕ(Q"%q,   @TXQ&N([hի'5Js t$bԸy7BkSoT@t"ͶRJf҅o#@@@*$b,VX z|ZWP!{H[   8y]+W.[tR~&alժ,\$^XĄ  CD18X@x~ɓ'K"E_|E<{&o9 z+0j MNq+Hq%)֬Y#48;1GҤIYjԭ[4)u̙3ͦ͛hq֙T9GZ7C  i(b {5j:@@@8v]'O[ICBBdȑ$aE#6@@@4Sye@@@+pwȀL< nDjwuR-SLsO }0}&;q~Ԯ][Zh 9sFze{%44.SA@@퇭Jm>n-K,aZݻw[9@@@$'N:$-O>φ3%{v@@*$bf իD\xC@5hvZ5l0tp#$mS@?q\rɍ7>^5kVyL:V믿ٳ6eo… q㋕u^_N {\V*:Iz˖-O?M4M6[o1[lu2d*z{ muGN[=s|J51Ν;E}'f]޼yEuy}СTREr)jՒ]^3f5)o/^$ ?~\#M65\sh'xu2rOB8C5 7t8wKnژ&v$_|RR%?JXrٖ)S&\r@@@8z aZ?ǜ0a2cƌݻ{8jBC@@G\}bF@@V@a4k?22R~a/;QÇEy=WdK>h&^a;o+B@@@^OĨ 6 @@@@ >):Q> D+۷iӦBBBNK<  8w۷Ϭc2@̙IK܈e:j>ʐ!IjE'a;'&rwoOE'Ʌ'{8Ւ%Kd l7nlӤ'N X:@ h2Y$רy晟&&{&v۷̙3e2uT)Qyq[|s/zr{ECXNԳgO2emI&O,jGw/(h"Fwj2EMjW9r<Ӧmg˛o)?>snZiLM8w\wߙąd8vq$k G}4f9h3ެ lM4%ݺuME8}lܸQ~g_b\)Y{EfɒʝX   KD. 8{$S?Wբ}缭[|   UVܹseѢE"F@@X@$|Rzu3Fc :\:t'N룎r-:_~1 UXQڴiFi #F0I t&@@@ uvaOc)RīqPNPA@@@ |S>?uBogRmM7GKWX@@/_lv+Ydb\@-[(\wuj :F' /ʞ={bI~;\ԩS1DR4~1vHMBUxqs'Ui"2-IPD52mf8my} CTdx< ^\9Yryդ=#4icǎMC=5j˥m۶Wa9|o٦ RbԨQW_ Ν;EDZjrI _~e1Gʱcɓ_O5b\SN& >|ImN:~z-7onfի5ӯZ4i&|݇ٺ&S8?I齣1I5~~}%%1k_$QCY&cƌq.@ nuɥKF}=    {qxxxbtU`' cΜ9eܹ$aL+‰@@@Ф 64]~=%   `:b„ ^蘑;zIwhڴc7g/1z ^{ͶһwoeWRA$ 8PΞ=k֭-[6Dz#   @lbDNCA@@@pPSNȬR/\Є̞=[|AH  $I`v?1Z * ӧ瞳{^ o}1ݽ{h/-q%Ԋs ͚5Mz 5@nͽ)MNKĨ:ũϚ5YG's.=SO#4*tN Wn^O .lp _jbnI"""̾3fu~BYjUvt"y󚟰0Y~t۝݆/&Ĉ7|+V$դ#F믿LF]1i$yg$wfJ.mTtB3fEf hѢfY7n, uKz-GZޚ(R*:qj~^k4dbE?Ooݺ/swg&̗/_}&6liKG<}Y hb^ё@@@ !g_ 6Cرcc:7sU?[#Ή   Dz_ U@@@ 0nV3D{s1 P@@71#^N{Zj&z$K,7MhTRxʖ-XwB'qaYб u-D]eM}HG'-[Ȇ ̢&rS߹s8S^Mii/$%J&@ҥKuJW\9|y-}|r뼱wqGfY+2j(LXZj嬶jSOٳgNeȑ ovguGMYx/Y7d8. p \O7'{IʬiXp{oJb^n菖Ν;G?9{;uoT1υ   @'NseTÇM%K'ϗzy%D@@@`'v5@@@ p^uѱ2Z~W;vlv)СC~ĉJ"&k_|1cv* @~ҥKf=zH޼yܟ   ؼymtҶJѢEmhwu*    [v1NTHeiӦw^s&|ᄈ7Bi@@ hq,YҩȲeˮP_̘1$dbk~zךdTxr&gb'r1Ɨʖ|FIiɜ9 k)-zv{kMި:Mzv ;Lk׎3n!/_~/ڵK9"N˹sɓ'ͣ/Ip=oܸl;zMn?~D˓'Y6mdW^90aL2.k6b yG̹R&z։:$f2 6{<ə3nYmS|ֆ4t*u&B @N"FM[Zwf+    8en<#<'Sz뭲zj[BDc<+!  ޳={v9s3Ç̎+@@@ >H7nlz٫W/뮻$"""{M_)3u1zR6MRW_FurN|{ZC F"p@sQ*   {*1J@@@@ .4DDA =/_.-Z0Ck:N ^p s#  "۷Ih) :K … /hҭEޏiA۷ϩ^գ&ٳ]V?^zkOµD(YJ*IH(~(ZDWѯEJ(, %-{}^sg{gΙyu5kDi]v:uc:cU7n6_ Zoanݺ 6L>3@Ǐ7޿ Y Y+M=S,py7TR'OXmG@@#GLM| 8-_I ;-j&,[e#   {i֭+3gΔ+Vݻ^TG@@" p7K?G^x2dHZB{x'x"RMI^1x 7={Jbbbv#a^.\`ZJ\""G@@C̙3eY/RbfرΓA@@@@9stn"@X~р Au]g(P 2@@B-`b̒%8 u='p 7HڵM. VZx3gN:UHId+paWP{hΝ+m۶ٳg.3-3[ĸ~4-^X7nQݶmҥKE UH9@ f4ȟ\&$$ؗ 6H-w5k֔~Xʗ//j̙q 6M6XF0"U,X=zԬի{٪W;(}&N w!ɛ78qBLb)=mNun īg;f_jxe    X^Ν;#'חիWJyI2eܫ@@@HAiӦf̪n={ ܑ®F@@bɓx#F@|KӴP X iܸqb %.e.sNVʗ/_R/įEdڴixҭ[Š   @tbL4NSbtNG 0a@@@&&:p uF7|#p Zn]믅 y  ~ X5K֬Y:@ >/C F@3f̐[o5$KC7oe˖]mfhbE4VЯ #GԔlO.Ν3F)Sf)md} #?# VY_-4hq={vIC"UozqWof d֭5Cդ5hB g ʓ&M2u|[ 7wJO\pgmaxX|u1d@@@L4ɓ'=ٌ@xoiРQL J O@@@/J:C"   1$!z)yx駟Phjz7ZjŋXٍ7J2eS+2+-7ߔӧOFtޝt"rP{ /( 2@@@wt#+J K/Tɓ}v<#   V;]3gNm,  تU+#_J9Q=u   EJ,j]CaÆ&(ٳ@@)StM6k̙3eRp˵1Zg]4zhߺ=5ըQCZ?2c3ĖN<'Z[i&Uu>0ܹS|d`8Ofɒ^*Tʖ-k1HjO?ҥKU~=qVҺTb-Yh׮2~xQ5^YϚΞ=k[{ڹyYO F    @*'N0.sNeO6!a\jD2|INNO@@@AA=dΜǞ[g9t%R  ēK'SkϞ=eȐ!f.)!v H@Ri FM&Lgy&ñ3á:o1b1))I0NUd,e˖7|c:uAz  Dʕ+/_G{+07ر#ڛJ@@@@ Bǎk;HS`ɢAΜ9c՛lٲԅ  k[l&MAxg/:@5o<#OȻ+}Ѐ䭷yN,|g%G,X`i[ngYnܰa݇f͚IڵN:e;E+lb7o Vɉ#UbCnݺ|5i$:t$&&z4<Nr kE>C+ڵK+f-|U> wi^'4_-z+I@cǎ^xA|U`ҥE9H@8ܩ}&w}g'1ciʕ+K駟Bu, @W_};@@@/#Gkc  ~QFb S~笿1u"  x 4iD{=믿7x.!]ֱk֬ i  #7ol=yz%{o{1*ЪU+8/@1:T_r饗Ti,$ky'}Nh`@@@@ Vˌ@4̙@@@@@?n t|_~)m۶0cƌឈpԅ  i6HC@֪UK/^,ܹs?Z' zz!y7EsiW^yEgn?#<"pz+A4h ӦM]/_>kWu09ܳg tʼn'$!!AbZ@IDATxkVԕ7\hڴhӧOˬYu#Uo =/Lٳ Ƙ)S&> ƫSJ_?\+Ew:a?I1ʕK=jڢB7RM|7wÆ JvL@ūʣݻwˈ#^I?#ٴiq2a`:p>0VKk%k@]v-`bi]k@@@Mvsm n}/os˖-3UYɒ%C@@@bW5i$q;zO !!  i 8NkxޥK3P5ŋq1:WlܸQtL4GfES+i_G1tgO#@ 8׋N>I'2رcpq   @V ƼyJ%.'IVڶmRI<#   :POn)=tp xYӕ_F)3g~@@<lb/3MAxgLƥKҠOΤh`Ԓ\ի.Kj-ݮtJ۷c_ : b\h|m-4Ș>Sڵw LSZjއz uV@9A48/ ,0x7o,N:2|kME@yMQweڵ>V_O?6 L=7PM$@&o( SF%5kɒ%&0a5NPn:D;kk6Ow-[^j0ի{2w%+V6;i㧞zJ `Dnzmkvz5а& LVZ9Wɚ5kӥ~۾k:\k`G5%7l YL\w^v!l}Νz!!   sr%? =>+VL4X z3^gnɕ+WF U^ttMܣGY@SVn3   @ 9rN4IB =]5wsΕeˆ)ԇ   @ٳg͛˘1cd֭tRkR=   +бcGQ[8n81FKjJzm?1h =*˖-gz.Zsyo 3M eo߾݇ &H-i,zSk@ c kNQ%5k֔K.t2qF)Y ku-%kP]?/5B bT&(bBB BYtiɖ-[jKM0AtÆ &qSo yaqϞ=RhQ侒 s9WZwgϞ-%KHBrʢ3W_~vB 4bu<#  _@sR2v3 hSA@@@cRRRc-YB/0uTĭɞz!35ACoM  #]4i@"EDOh  ?\rɍ7ވ @hJ*G ɒ%TP<9.F[Wk `R֬Y$L$׮];j#vLmրrKMĢ30%!   #Gݘʦ  .ȃ>('O6o3f̐jժv@@@@ 8FI|2n8yWqYr    ͚5 Ĩ_Ν;Wڷo ͢ ahݺh FM&Lgy& WsΞ=+ohzٍ"@d#G4͑#n߾]͛'OW   9ƍK߾}M!5jJzmQ#c$^ ^Ś,iӦRj c{cǎC ڵk' p2JF@@HQ Ę5kV\rES'Р [n&&@@@u{n -ZӧO>>|ʍ(@@hؿ9r4'999ZE;@ L4)q k׮` 7tSv!!Xz)QGș3gK8@@@*p1k|)ȸ,п8p%K,gesG@@@L F-q̘1LtR:uj:HI   3 ~8f ^d˖MΜ9#˖-&&t5kŋki&)]KVlvgh x Y>' {A=zd@@@'p9Y|bŊk /ݻw1|ojB@@@ fx%f^jE;'OviFF%3g~X@@زe}Xɒ%<@ ^FTWgq ͚5EZju!&m69rivJb@@@ A8zȑҧOÇ;^&   @ ԫWOJ*%7o/R*gl@@\ Ę>X xUWʕ+eݺury6JiLݺukQ=a߲#1FR?uϜ9SVZeJS胄 ̛7OV^mKUV B@@Hڵkرc5jH\D Q1:uJ48# @@@PJVgB"b ĚE2n8ɒ%KHʧ@@]1999ڛK@ ҥK,46"  (] x ٳg)R^ʈZ޽{˅ Ę_HivO>' {A<'   ^%Kj ƒ%Kŋ͗:gr>A@@@8y ` ^M6Iƍ(g5k  Čc楢   D\@ h   Ǐ۞3gN;OP oҺuk9{)gϞSOC@@@ ,;v_|QΝ;'@y[@@@ c hB4h )4 :|0m)^?,]Tm&.҉Y" ~9b̿Yf(Co۷˔)S FI뮻#  V@K 7o&A@@@A $wFɞ={LykזJg)@@Xغu%Jy2    ڵkU˗d@@@HK1)))َ@P:Fncǎn8p`Peq    ~7mTM&VyIz"޴J*1 @@@}Y J9rYi+dx͛@ѩSJ="o Z`{L2d@ 0>HΝ;g֭P`~  R`…9sJŊCYtrbܴiS"@@@~SNٍLHHdVr-ȟi\L>]'XQC@e-[ONNd@@@@og ƫ{3   (D5SdbC:d˖M)    M ܹsW%#  d8Ǐ}bBILΜ9#-[kך+V('O@1   DNaÆRjUӀSƍ#jF@@Z`߾}udSMB Rti^:1/Ap x뭷ܹsGy#c(ܹsŚtI&L@@E… 7tS[/1ϒ@@@hNd6 Ο?/{/\fϞ-:Q, @@xزeW\!33\"^@@@>,{5-[6َ   3cRR6H@n3*THO.Ko   @۴E5!    X;wn)Xgh޼˙3gd̙3 D%#Gs)=PpG:ud@@@/?ؕxv>2EDl1ګG{@@@pWɓv 2 Oȗ_~iȕ+̘1CJ*@   @8tCSrry@@@@b)   )p1{O1dB os ȑCL"%JA   @iF/n'EkCK@@@m&v2VVM2ea@-m;҉@~ذab݄ӹsgK(C@@ɓ FYf   DP`ٳKZ"ؒU_Zr…    aN:e%!!ΓA zKysH֬Yeĉ7%@@g-[gB     V!  -pq %KcGR>}<3fK͚5S;m   ĤիiٳgW^~h@@@ ^KuֵdKni̙r̙1W <73B8lI&uSw-ٲeA@@Ç_~1V^]rҥKO8!;w q   *pI鉉v  h޽{ۻ1B7nl/A@@ ^njw=99ΓA@@@6l`+<@@@8v-))ɟ4֬Y#ڵϛ}_~eiժUDZ   *Э[7;vڍ  ĕ dԨQv5)>4vn:!?~D!Fv*X?{ 닢 0~-Ѿ}{;O@@@ EٳgM 4B\cٲeׯ_/W\qL@@@WԩSv<XdtADM}x@@xزeMPD ;O&~֭['}Qt"\@J-رkMj@lCROFdӦMv˔)c    n9sgwA Uw!6iF{Ta#   .={vׯ3sSf͚ݢ   @:u\kJ*e>7o.cƌ1;{QF)1 uE>v .̙cV @@@ |vY7qbׯ]    B'Oڥ%&&y2%sNN8avر iv@@F`֭v_<Xp胄 [W|Э)@(qFS[Lta@@@21)))#t>DPҮ];ٴii5\#F`@@@ o^ `x|72m4jB@@H@=rK{:3-":ΫN1bWo_SzD@ x?uS@˖-EK@@@"'0{lSy޼yf͚kHj.W]<@@@og ƄƠ~ =wqڵs7  @<81(Q"L@@@@ H+A"EAa   q*p1s1 ~DMh*XL2Er( @@@Ȝ9_nV'xB5j$2zǎpz_o(Zdɒ%}}mXrZ&tMXfaytŋGJYfRpᴊ2j[﷿\uURZ5jtY0ahoݺV?ʶmLܹdɒ,9sVG?۔?~iҤꌾƎ+˗/W\Y:@2M6-X@vmPT)ч@ V9+ֹZsj'j/s(Kn p]-X&K8Ϗ&iܼ.qMRJxQ?7h  ge˖yB\A "q؛oiWj$ L8޿UVv    @tBL+XaÆ %kqݺuGF@@@JSNJLLdHI… ҡCYtEW|W={a=  q)`  ⊸4N~a#,iɎָM A [QPl栣Gʾ}Ltđ   q)$ouZ.ꫦ<[_pCt)@@@ V6m*-[/x_k޽{V_^=msЀL8Mi ܧ6m$}\}5u&5jԐ]Jǎ>j[v}ܹsw;۷Рxs\\,YSEGX3ZAsoIL-g5 R_Ç 4ܹӜV9)}/M}׳= vXBjC#j/}vfp5Iݲkk$U d:9 /zKy&n l`:Yx+Vt` d8q̙3kժtY   ~.qv>3_~ȑ#vXmG@@@|X|M;cbK ={Q'5H[Z)WCr!˗Itn< 9tP9s}W?TT)@n=r19i޽E3=sE)W Vڷoc…(mu]aovkB^ELB HVLPK}_r%ino6l l2ebQ߳9Tpǁ}B#zVj G@ʷq>tqf)_p]>[$_..㚤ukDϜ9S|Ad e2-pqƌK/E@aR޽{5pB@C`ܹ5Y'dX@@@ɓ2J FPr[lӧOK~A@@@8uq&_)Ȥ 0m4ׯٚ%KϹ 1+V# ķNt5(Q"1=   *K,i    ^&h4 .,W_}\o!^ziDžz1ZԅÖ@j׮ P$%ZI1Jwq6!  Y@oc&1xnVֲ˖-k1=6l0?T   Q'Đ={k >I2Y tYƍ@@(ضmݚ)2) x͛  + dBG3@2@ܹe.@.R,   '{ '/zA˗/jЅWMq   D@n/0ѭ[N~a5jTԶرc7&|+W/,J~hBnVk8>c`AKS,R=s8v5pHwrEիW/y&<;wO?Tx 9p٦:udFr;GFQj gF= 4H}csԫW0ZjPR>}. ¨Dy>*O> ~Zky _1v#ɄE/rftwnxc횤6}1$mK\T;'{^?Gmڴ{/w,wp}|G ƀ_0p@&њ{1fo 5"1IodkذNmD@@2N4}tܖ-[jP]ǚ5khkA@@@ ~U [l ASt5`uf0E@@8غu@ YT'! jk"mɵ&Ժ  "LR,4A 3g/b}?޽۬۾}͟>p9&==qftw[6i$q5I$i˖-AΝkwV>|7M4^{ͬ'wJm[C} >cƌ1s-]vhV @`7o/6rȑf HK@@@ t(kpweҤIv9իE''!   @| 9s MAKSN'iIFڃE@@p 81pR| l Oz '1:ɐUXFѣG=& w>K@@@  ab]@'|֭ݍCJŊe2   Ļ`;v4mT.\ ={4Aԩu4AR h5O>˰gg ]|/ASo/H3L Vr^bV:~;v̯{F|M0sy,[ nh6̛7 DX^=iGE, 8xݖngFL:-ZTzT@ R_c<:\rV֯^zn Z`A;;ietOn^/KnMwI.t%z]ŭ$m{8K\T<&0x`]&֤_uիW8=K~^^o|ϔ)S 1}& K. @ }s̱ hԨX'd=Q:t{3   @/>cӧO7@@{9E !   I ތ8a)_|2i$*u  ċm쮖(QΓ/_F_ !ܹ9226l(fJq;@@ ?GU{9aQ0C@@ɓ'hSICٳҮ];3o냄   7gyF^}U1͛7盀c{Fv)Ezχ3߿߹w1Ҡ'UT¯jD8P'u{JR.oݺ6t[n?^~wŋKe_oY40զ]vɑ#G$wܾvwuvY/ځG ̩RKŊ؜Zp=zm /`/23sL_"/.2{|Z7Ӫ;9qբ8ikv뒛mwkڻa$o]uk5\%IqW_}%X|ڵv'˱cM7d#/;A?gh߾}Z#3egeӧeذa }ʕX46UE)_{Cƍrk֬iCq>7͵… 득4pHZiРArY{g}Vt|wrerQJFy__n]F83ޯO qʔ)nd﷗S,XcSJWX3{2zhqk}SC)>БqQELd>;޽,_<&H3IKn{nyMҶe$_k(Kn_.qMRΝ;'&L5j naԿki1cnI&vfͲ02 \A3~xٻw9RO6Ŋ Ao~JJJ Yq:XF@@O`ܸqm۶%%KꪫLw&gG    8Ȗ-[`w8|}eh^o}s  J`۶mvQŋd@@@@Nj4j; y@@@=X^{:`\X#   @̙eرr7u DM0F ^H.Rk1e˖ylX-[R(iY… Vr;[mw\h+?4@^[.Z|0ҥK득"E|ǼQ1ٳ!CX*U.T ӧwbܾ}>[i5 뮓Çˑ#Gr뒛mwkܲkڸq~tukjgAB5~Wsu֕ŋ{ R;=<^`ΝuVS@͚5%k֬Ƒ   صk̛7ϔR!$]D*T0    -pY@6 tY6ol,jժ%*.   ী1o޼'O?b7@@@7ݻw].Z'   'Ow%MA&cǎN~y/,իWOaoV#   %߻L'xBlbwJbO>]ϟ/5j԰דA_{bŊfw Odq!zrH ~k%┄   914D!.l}լ\(@@@]@oHMzO>'ϟ_>nڏ?z  .\kp;@@@@ .ve{"{@@@R8uꔽ511ΓA@^dӦMfS:u'@@@@@޼ye޼y4h@Əc2OP* ¨ԼysEgH %L2dm6keڴi2BjwHۗ"ɓ'e%JHe[.ZOeLڇp;w9T1>OHz~u;P_~q~=z^_n]\7|#?]O?-2e+ι,일2n{U 64hj~ԬYSj2dHȃZucuͶ5I_l-7Ik;\%IIr;䫯ӧOyܹoy}H 4i4ٳ2{6'kXk2~m{ߞ={y2 >%_zFa @@%ӧO7Y0>ܴCt=DMn5J*vѿi^&   'y@'7=ZcsA@@ M={~[:M.v@@@qL@IDAT@ vm{"{@@@RpbLHHHeO6ŻNH\rɘ1c$sB@@@HK.1AZl)fn]v2gywD?s;98׺S 9R|Iқoi/{gD7W?k֬K/SO=eoڼy4kLCҺukT=Ќ[m.7"Ext c>cѠwVR n^S PBjw+};yԟ6ԨQ#1J+SNŐJ,y<LJ]vIZA5rkj㏛ҹ4mweŊV=y_ԩSɌw<}]rek_5I\Bq]rukjFҿ 4~f x-2[ бcG)[fZ@18VZ]V1P0ԩSMME " ݣ "*<%4R0ן]@@׭[Bss-NгGƍeÆ &;8q)SZ|9q.\OZ [l~a zڂmwSܹ%gΜr1hG5TD .,sEY8p@aR soݺ:!   3#f۷믦kW]u)?#>!  ԥl@@@23NnHB@@@ PSNه$&&y28# 5܏<   '-[61bԫWOt޺#G7|4o\^uqn' =? M6ÇKBRlu)ngW_nMuӠIisωn۶&ؤ~nmsg?4Դo>&;?eQ#+KR-?؀QIYIߓ9rlj {r]we7n -Z05)SLaG7_[%7e5Iv&sK\&>)%7IZgK\Rzû# |rп_u[JIk`;SZ|W)I>T g̘!;wk׆󺶟zCT~y3rHS~ҥKJضlb ʕ+RW^yEڐIa   @(;kF( ,l_iқ5K،7_?R@e   )={ޢfH+h"y H RW# doŋ(ݢĥ<|GuU%Ҽ̙3dcSZȗ//_>fM~?~)UIIIqMΝ[*UdA4ǧ6c} \tK/T'w߼y5tNj~ɪRjԨ!:W 'ttȩ~$?[reɕ+USbtB|G/:@U/ZԬY3 ) q_|tLf~Ѻ^'cAt҆3gFk3iW 81DE$@@@8y}CB[`…2l0:gΜ&>,#   @pڵ3o^NMor=H˖-+ϣ4߱c[Lwya̓'OyK8k|%X)>3g p9uT۝2f:&M$UTqn(V6wvğW >Ԓ[.ZwժUK)6 lXϛ7hP&Y $3О;Ъp&mO;3fJ;}BR]Z[Ǝ5h)P`jU}蘕ѣG퀜zCϭ'Nؐ^uMҲC}]rn&7IZ[65&GIp\&tT0}1lN:.ϟ"E:uH [nH>5jFwb)m?A:8ʟ/,.@ #sΙŇ?}^#Ÿ}@@5X$s3Q7Q闁$@@@OJLns;udOK/ɵ^1:G/@@ Nu(˂ |֠nyL<W\`@fmf?N:7ސ.]MC ߌ믿$sއ:hQ'5I_ƍg6s m۶O?g17j KxiPYiy˖-p妛nx7ojc.𫮺LBqJI?6{I'jժei@͔Lr>f^CGsJ sԨQr 7:@I8d AUA: p*G ={_~v     p/R񹟾?t}nLkV   . )S(xb7ٳ]}\lw *= l.__mԨQZ=SLl-_Mf 5؎5Uk, Pb]nݻ ;o>+k?˙3Wƻ|M˾k|5uNz3h`ժUEߓMzo[lYɞ=_j6md;A"9S !V :W9F5'۷^疻]K ;`ƢЇΧl qNؿ0}9 =?z󗯶f۽@ݭcP]lu.7Ik;%I*t!mݲk.1ߔdE:RǶXBpq)=vf ueCG 0D_$''_    }.vڹ_iԠ9    !`M5++/[l]E@@4Ę&; s:QNԩSfP#G=':9NPFh)+>L:w,ǏN:f ֭[_իWmf1`y0}%ϠDS NLR F~+V4_8PСCPB=ٲe%Kz^$|rʉ5ىfj̉'W_}ua:y̍7(cu҅ҥK?EɆ D'b ȗ/II :k,Y['!   No%݂Sߖ5k֘UjՒݻ;7G@@@ dΜr{@|My̽oJ*IE%-P eJחD3rܹ)b&Tƍã9+gçLb7o.@:MZI@O}muM Dx h4e0iԨQRvm۷Ix4i|}fo0<} ܮu(NB@ z} B+pSBzJC@@^`mK֬L IAׯiNx:tPv   dXy/,O= ~׮]kW|rz3 CZu]G+Tsi;^ՔW TX1KSݵ:.C>볶J<#@nMsos… ¨s$D%Hx/A0f$("A$HP( ("I^AA$$J߯ښޞ53So:_ѢEնիW t$+xsO/mr`]tUA\67i)'Q yC Ep?Fj&W0͆?nVtl1>>xA{kժU?-n3_lY5%>'Ug/kOB${6GdO߶T.o޼;Іymؗh\2eʨ>@L|E4Hߧ1ϪN #8l|h/G:$@pmb$$     ԄԘ?~ӧO*OM[lY:{IHHHHHHғ+yүn ڵ??b$@$@$@$@$$aL.Z)pB qvک@w}lܸQ+5#{L Ddٞ"7tS@٘x,[0`@~!M }|F]`/8?tQT8 /-ZҥK#m OݫJJ>a1$@$@$@$@$@$@8y3{N C=zDHHHHHHH'pgȝw)͛7s=WCszE ,(eJ fwu>Ge6l8;H])h \)N7sw;L+Сb:t#Ѓqsf&}]J#Xy3V?g͚Ues-zHԩSj΋I^n+ ͙3G,YP^x!`=֭[C"4Bv 0<~m% 7;Ѹqc5WL"ln> eb3=I`kpl0'^RIsȑ`Ϸ ěŋ+YB; KQ@*[1>s 1 ז+VUʕ+UW]'}# *䤙      H ~UD81^fM(0b4       G@_8H;h#;"!H"I#    c_UGCLF$̹6oB?L0ASVHHHHHHH&ч7xC Ϗ?([lQsxhlj>&P/5G ܇~(7x."`l-!`XyZ20-m3wB8Em];pf ꍵѣGݱcǀDC,Y53Κ5KL,#"f|Μq)gΜ>7@^zjnTIi;DUEC)Nso}UklJfQx"CF$/SQߚX ֭[ej3^ >6Uiҥrirth$@$@$@$@$@$@$@{²f͚[YT06hر39&6HHHH"?;K*夙 HM0X>̙߾}ED!ԨQ-[&WRMqƌ]Z K0v/0AV 3 B*QA 微0!V&.% pG}TF$Nc^}Rv`is裏" ߗݻ5 mܸqN1OX6~x]uNµI{M!;X}Ƶ"08|^Z]@F#Z 1fCHHHHHH y `~.3\x?miw} $@$@$@$@$@$@$@v`rsa/bEc~m@?^+mڴQ1ה)SF㍴#Vvm&m 0-&zz1Ƒa`$f v8|8m8Zjz5aKܸqS_5|PdI\$039rd@6k2͝;Q6 .Y)VZyŵ|ruFm߾]J.픣6:y_+E=޻wo`)tw4l0Do|t?c2cMms7#$mH]O[G}|/e>|IScH z/^\0jjkb<~&K5`ҡC`$@&ib$$     xG|`}͔G Ĩ A(ĨipI$@$@$@$@$@$@`E{CFC8sHHHHhs\ /iLժU;vZ51˽]WRE ZM?Qr或e˖LF3zM&I$4/$p-+]`3bK,h駟<!s֭dD)Mʕ++Q7y,.҈e&  6LN*x ;O #Bi>ah3<#=3U~9BA֭['n-_b H:vF߀: ꫯ>G* V[nEɶmV֯_&0P~#|_&Ϟ=[+ꫯgϞ2sL]M%ڄx 9sU♎m^B7icC4( !@?V>$r> ^xa*xQ<)SFei174o\ BM65w4:;YaZBz\=J d4WK      G@G>D#i_zѠAԩ XD0. W9qF ?1&شPJ|l^WTc u^q +}-.dxb e٥KaBLS 1ԵJ 8cٚ5kĖ b1^挱~c=Pf͚ۼV0Q 1b?Zy 1W2lx1c(F 21")g1g3~Gr%s6F/%k;wrm1d4> '.Hy[EͼXX|+"ǎSvMMz G$'Lצդ:$@$@$@$@$@$@%o*(Q d[[1zJHHHHHHHlMEXb7:KHHHHH ώbtP0A)ImB^4h~m%CIYdћ#^"&ϝ;7Mk#./zbFJ 0:3䢋.R16PBg5ktYgx&p^&AH ZB Jt-~s;p]A 6`suT߾}^E^s5* )  B j<B)m|饗ĉnл-AduÆ JhoĈ~$/^{r%S-~ 5kVT8MX!7`cǎ ă} ˖-s̡.KO0TvmHW_&%#;hC퍗H Tg;8u0|-ZcuQ,~{/ݻauaj+_@n^?G1VM\x 1b; ߟ .O>>az!]רy;; t&mmh$@$@$@$@$@$@$ ]~K9<&58p@{ 5BRܲ$@$@$@$@$@$@$&xvi!FO`1(faL_s$N<錡rl;ؘ6dm s"k9st4#~%Ҷ~e붸޽[4 5iFkNnfХG" 0fz ǻ|MX9icXOqꑈ0"n~m6:m^t׋}`lny'llOrs_> ',H/Z͛7s_ugY;R!?нz" KKɢ 'p)2dd֠UTq-]>|@$@$@$@$@$@$@$! $&3dHT0_~?~g      27<H/|\yse);L^߾}PVJ,D T93\BBhEo>'#Gdɒ%jZ6 mj#,X0lѲΘ1C%1NS4iDmuH9}, flc0ӧsmAVBnoA-[9@Kٸq Eܹ3q@$ &ަ7(ƒv1XSQ׊ ={T6tBPX ~ZQQxq+FFg)@lٲjuzse=l3j!X/gGzm [oB0$@G4CS*SL@s7(W wUrJ֥K4z()2rέ\ @TU{˨ a!0x`ٳgjN!$@$@$@$@$@$@$@L" 5f<cLӆ2;z 6y#vQ~*7v!zak|&SmK6|'\[lk{g> >GlIF>)̼$@\qN?IJdU0ˍI`<qc.)xرXXparD '=31\`/RAݑ? +V׫ϺuԤfLħZjҴiS \y||޽/+W8 :u[jpmqA/-[8g&rcp޼y uN{RFRjUjϴױիWWF9aY|Â׭[W1InڴIaAm6벹LD^3~w8|9e_?ٳg'|]>$@(g?իWvUAZdqJ(_,]T ;p@ucDjeƒg[P~\B=jP7ļ ܯ^@0ⰱ7^g?^7xCyg~}/믿;vt\ɣS8;$7L!wCp*giC9ӬY3Y-ټFqͻ a\5w^@" Bi$@$@$@$@$@$@$ l/r۝@oOJ       ;wzsZ$ҹ 4E!ơC-tYgɒ%K[!y4 c[6l_ b y |\fwEĂpgڵj\7$!:Ԇ=qOwy+KØ[oU}E{G *ye˖z7N1p_"EH`yT]8o>L0@'͹Vfu%SI۶m#שS')\|t?cvdwܽ.>$mdf'*HO*-w^SWm}I.I,0'bdF0LH T%\!*21pB6l_b WzumyeWln[nqsرcHSL AP6mj *A?TjJ*}ݧD5]閴uN~w*R^z|54zjUo7 )ĸ{n4P8p,^z&?^چ q9ȃ&`^M5cX[b}^wVlS>Ok< "001//!/ ]m       'trMIbr9+xSy$@$@$@$@ %`NcBѳ2J<XAO?a#/a"U\Y?. ,Pځ9 . fy֭[XB^{59rڵK͑[v -[)DŽ"څ`2%rJy@뮓 2sOq ia`ǡ O5i2KX8XE{m3\6)S6CX [A ުU+yWT(SqҤI͛>}LK      0 Hc=B oe| HHHHHH236Z'cl)"v0 v֯_/*Tpp!N5> 6gY.bCXWw\~ٳ<\'F:/m3^i"X*U]ab7{1C9S9kkY)WtQ |ۍ1˗m۶):b{ァ;$0_fϞXtU^wߩ{KǗ@f̕p3au4${J`CÆ H!dL~$KFdPmm~I(7dv6/OQ 0+G\pU8eqRL$/[~ I 30 nP`ޜ9sK/;v,Tv/ DP/bFL]ӧ/^nhʍ{b"a!Vz\UhOsS "`nPApX hΩx4u鴛;_Lw~tgxkNCBpZjCXs9ydc޽{NZwq6#^B7slӇ@44{5S3=ra}^2w^+ќSz1i>Ok<\ڵS/@.~ k 4pi4       G@^5kL!Chzfb $@$@$@$@$1=9#.I2"E_>XÇEDŽNgt@TX ]0-h>!|Yd=z0OND1cFԭ5u!!袋u@(/ׅ 27oV84ͮ5kʰa{U0n4 tz!{1 X!:FRϯDf1w sp{0ș3sʥҘK Ry}:k퍗ُe׆1bD{:R"ʚU8 >cTѣc_O<>빍5`% ڢq\ {Rl$@^{M3ϔ|0`IHHHHHH sp6W_j֬YƁDa^M;B`M LFڵGWR%4i[f!o0E<Ѿ>E[6D>*}zϽYbx &h^׻.cx )T$/7|;vg "ƭ/X@w@ o7ŷ~[N*k׮ h+KTV&OB;'$HNJuḗ^z)wN  ;J*a' &Lu@0'w_Lsc̘1A1?ʼnt©.F/Pv,1[oDAKڵky睧ڀUT@P/ ln9&a@ h /_U /YG&L`Q^s9<޽[o.N.Ǿ %" NAΩw8q℮Bp 'Ĉ믫1X]re<3c9p/wu&UVUۿ+yW1d>rHyᇝctC&g]O[w 3 :x6U׌gﶘ's[el\bf>Zh&;h$@$@$@$@$@$@$@iM?s9rpҩjHHHHK@W+QIJgm$h={T>-Z.] eʔQea &bOn:5{TbԂNx5{젨 yy>Ny,;L,XPnҤ|gGEm۶2x` 􊇓 DBŠR\as+ bǏ)S\wuWǚ~-*[dɀ{ڹsΚf!K{w;•E71o0+O&X덪2̘4>} 0}`e {AsIMhwv B={X1)@u, 1H M6MUXpaiݺu*gM$I @pL#>|X֮]븁Qe&SNuv;VZht?ڨj˨QM P)بQ#ygN:A^*8y-m3?cb|gMS?WlqA=0`m۶ĉeȐ!o>/;w^*bBv9E{lpwƗ?$mbBpNp.R/@pOB4aċ^xA^^~@L wߩ͛ɓjDK#}ڼflwnw̓s?õbں?fO B0"\ m&L#X^q">g… Yz9^⽛6mRbZ`+@yvo~ë< Dcx nݺSlӫ<}RWlC[nE ī;uꤖ(o8}I%BMlncқ9HoX? @r;mٲ1f+a%K>}d泭$@$@$@$@$@$@$) h=Xsw9l ƇO?l٢FA w1Γr bb,R4fw̃|5[\lu%Hr1VcGp]W ,~}0=G[/zMms|̥_}ʴ&$pI1}O> i$@6`*cqN&[&K.Ab+G x ]˖-ʒm+6Qq(aի˔)Sd/nћPJf `@mҤ|'!EZj2c չժUKfiwXw#oVA\ 6[\PO1b~p3`^=SnwnF&kËc 3l2k,Pu`7 {`.AiڶmW"1ۆ‚Tw=zM{5cimQ;\+ϩr&s'[nx_ pgO)       Dп3({"h_xWsvG#    &kD4 @ aÆO WBl.K۔2ᚎwfO>ܹS@D1o8fƛw~A#H MfΜ)ׯR]6CT7iv!qc1.xŊ!%K:oL6jg" BȰ^-"EC7m׮5o0䂐--!=uꔌ5Jd;#Dn"`?YϢ.-JQ'<P,}({"9%d_UZٷorCҧOh:{t饗: HHHHHHH sпR1ѣ0QXn0[G$@$@$@$@@Ƣc:VIDP5c)gs!ٳgO޽{* ~H"YL{怴]ќ9s>-3f K=5kViҤڧ3B~Scyt⩧Rڴi#kvZ}?%!3E>|jצM4UZUʕ+&7 !жm[K‡r<;v{K﮻? 㥗^RjԬY00~s%ô-Z:ֽ{w1#ҥϒ`yfyѤcmoѯF0a :ԙ dLޱ2kԩSU1>vi$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@."gŋ߉l~DojKs B >SU̙3rʾK!`2i[s;ҦX&֨QÝ%9qR@gݏ-m3/QD@1q:\ BR_W`p+=\)T@ Wio.}gxe9㺍Hq/!+Tybb`dժU:Zz =1C;֭[CegBX2`hlyHfTCg@ZEбnA6nܨ*W@Ԗ@Æ   @JWx%uOΝ;W_U o< HƲe$@$@$@$@$1nJJGOX5 @" \uU8\Wq߫W/'˗O}6-ZT0JSfMZ,l"W'NHn[xq3T2J4㫯R-yeW_}'dÆ ryd^z:V ZOJ~37|.\ܔ&s 51i֬ۉ_ hQ u8)'M$YdQC$71WlٲeJ|1W@+WTt^σiӦ)>3lٲj>V!Ƙ#Gp4[v+ȑ#GJŊռ=_dܦA u͛7KJ*U- ,PEPfio<#|5˳>D!-x_µ~ %ֹsg;w0a!ySyX^(z1On @?P⊀} 1DAs_]* e ɓ' B]xᅂfgTv 8~HHHHHHHH  $ًA9wHHHHHHHHH ;v5Owi$@$@$ IPb Hn!:XqBV.حpI$L?ؘ1cDJLbM3EWP$beG pRJz1!T&bboɏ?u8i?6}m?`h8!^xAM>uMn:h6/Q?\/_>@@ ԩcf}Nmp'^oS4mj$jժݻeƌ6Lر, 妙A$|&\W/m0e'bvW0k׮*@Dj뚱edK.>g.`6{r3gN'a ,WdIٶm hɓ'=$a2 @t ^Vfygѣ={IM$@$@$@$@ҴaH  R֭X95mԗc,7|#ݻwy)AFYS~}%2k_WY4i"ٳg=Ϛ5DQ7^[qԘ;C, QժUO<// h"%*ypof(hz2̗ .TpӪU+YiFۛ7o7 q~({/" 0 a쿗]yJ 8uT'D$z-%l)O{13x`5sx!sm!5@`Ej!wVD /^-ϽT"ZYgS/k۶wµbs0v}!+]V`A2eՂ|~       H&Ovd"lڴI&NUP!ѣGʵ "       ʂ (HA$@LrL LAnݺj'dL!Fkh ^f`۸qcJ$`@ҥ ̙#ׯ?PMRYB11rժUNHʾ[$0P6jI`}>[fzRw^;v#&w#-.(;.-Ęsj>k|K;wg_ „ 2D ue Md~|Ԇ$c g@$Ÿh XD=:l07O4Dq- ?xn{5cym=d;hWh}Bm۶m2eʨO254 dDss?#aG)#FPs/ W|?ļ`?euoCd}s=7! QB'U&Yf y:K3w"ٷo_3Y ܹs t.]@`3L߫b I}zĔ:$@!Ib!W_r ܢ+>l]vY^UhHjIŦ3Fz- 07ǜmhpT>|au\i *w$E*0|A-H$n/|UTQ*T!f :z)gUFT,|M0A۷XL6(ʉfGfyɞƳLaMLL{6m(QzeئھWm]3;0[fߓKqNm\fp&=%ںuT5k(-*} -4-Ĉ\"H!мHHHHHHR+tViW06?9"    ?A!F$@>@ yRF ! GcynC0R`Ƹ *$W\qEŕ?9.}88ҠAK $}Fkm}~g2^y~2H*mvHHHHHH"pi'?~Sevǫw;3s4$       T?|k͓'Y0 @`z-"."%Ĉ1_~\{Hx!y7UyJNg k0nW^-< 8Z}^"]#D5kL.tx J/$-[Hڵeذaru-0kẃ0Q*1bCtҮ];gݝZ6νihC"-4V68~W^]fͪCh…m6u>4hٳG tҭ[7Kש(΄y=(5U|Flwh6s}^ӻDX`f>/-%bwG}$r%JO>[{~e97oYgHHHHHHH + z߼ꫪaٳg>}^#"    @cΜ9) ]!Ow|bΝ;_ˡ<HHB\B0  ˗9HHHHHHH sX,Y4Mc?ywi$@$@$@$@$@$@$@$@$jVZjMb{HH$=qtH?.^BA8% &ȁ 9ut4 K/1GU&M$ш^{M>?yuw]C=$rrg ޻wo)J ( 3v!%Ķ~z%-m>6m/_^o X:uJ Qh^ 0k͛'PtQt"E5M&sݠ38C0OO3u,1rСΦ>[:w쬻6lڴ zC ;駟6%Z9p3ykQ*ĽgDTf3k֬w_|~UWZYren\јK*byT$Af\ʬY(,'OTC BTRE 2B PB:n9|%[x>6Gy8s5nvٰaS0D!lpv2@ƍ_#GȒ%K. ;IHHHHHHH2.<|p~9i&HHHHH'pA9p*sH$@ 4mT "կ_?x $fE$@10Ǽy1CHHHHHH29ӧO;9i&RԩSeǎ͛7s=7u˖ +&e˖,[L6eɒZ(+͟?_VZ2\r%RFH !{1o䣏>^{*(b׮]֏+VaÆ^+ٳgkFF- ڵkGlw D5k&wy֭[.qi۶J|˝\mf \?Mv2w93fh{؞^w/mqA=P) õ[nu̝;n;sj[H zL!F ֧O1DRJ'O]Z.X `=sw]l !}9Ͷ9$l0SeΑ#@D[J\z@H-Znݺ)qD}ھflwlny$Sg>;цHDS#qh$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@[ҷX~hTZ5c@~9rST^4$@GئMD>ߕH̙3eȐ!_4 p7l0%˜?~:AgAL嬳Ί(7ި͝;WƌDY;p7ސ C 6sR=! ;YJ₺eG*m6VLL2Ə{,3[lRzuW啀;j;ɃY; c~H1zj.kk&&L8% H ]A@ˤId޽<'O>xnKپWu߁-m37dܼDS7?f;篴[`{ɼyW^{OLaz)qhkQ!FX-/4hP5-"      HChG`ĈN礙     C*UJ'$    0vV`$@$@"{WK&     HibLӛq_},]TmU\r%ip @huԑ)SL_5Cʘ{WAe˖QzE&Θ1Cz!҂A>yuSlDm[t%\q(^xDh#M4 WM$s5k[2{l9uSƍBVz˙3L]YW:Zfxk۵kN:ŋ˗_~kJˎTᎏ^uo[Y}iLw_ܾy^buv>~0tR޽l޼9@|ǥcǎ5kր}\@ѢE7|#˗/|~4        "?ʜ9sʕf͚%W- $![:^,YI3A$@$@$@$@$@$@$@.\Xd"m BGX&0bwufHHHHHHHHHHHHHHH ruu2/[L:uG!,#4ѣGɓ'U]JC$@ %q)"E!dQAءCUV2l0%.~z9r䈘T48j'Np>{(y^|wr5׈4&XunQXЂn{[nQB[lo=|饗+|l޽[MX2Y;Ye,XPʖ-̍s XoӦMDS ǽdU\9`y< eZ4O5k 64 vr?3bI9γtR_W^\OOdҤI lyw8'w) d $@$@$@$@$@$@$@$@ '0vX緶=z w @&#m6btP0A$@$@$@$@$@$@$@֬YE#v qw @?Yϒa)طoL6MpҶml%D$@$@$@$@$@$@$@$@$@$@$@$@$@$@ Ԯ][e@HB8be˖Mwk$@! /A Pz@Tn烶:KS@o߾jѣG'QFi9s ΄`Xomϗ{G:Kd4gl I1-ZTm[z̜9 8^ \o߮wt ]@ ܤI]LBϩ ;w;v8| oݺu*_PifVZnqOij$R3)"=T3}Hy6G@w{c<0yΕve2qD_dgJ>/l^6wӒKmS#o޼377n,ݺuf͚9BadЧzJ3k,رcT33 @ F{|P X'` 1*Uz}HHHHHHH 5/^\ Bŵz"o bڷo/rJ5$@$@$@$@$@$@$@$@$@$@$@$@$@$@$ gqTTI֬Y#+Vʞ=o[,$ѢE %HfgH cȗ/<ҿ)_lݺwMĂ J2eq]wɛoL1)ݿn;.K…;ı?Fۮ,HHHHHHH AX?? )R$BY @Xߒ%K $@$@$@$@$@$@$@$bD޷o`HHHHHH!8ٳd⤙H=ƍsu;i&HHHHHHHHHHHHHHH'PN%x1YrAuGpJ.FիfH cș3ϟ_9 E\;Vx曕URn͛,}(އ%:ul"83Pvi(@6swcDgǎ[o9!IN[\He=i;v Xs+Pm7Ľ h,KH=87w֬YNpXkQw^u/G^6L 7  ,cŊeȐ!JPxʔ)JX3"ՌvDᚴm)YXywމ8q_Y&<_io-5-ШQ#%۹sg/nJ>;gTF;͇}J\`'z|dܹ2}t7n_ *T(ag@ӦM!I#       H{?P95J% -Ĉc @$*Td[nfHHHHHH"%xT"s<z-:8i&HHHHHHHHHHHHHHHb#PNe˖9i?bb2F޽fH p D"TH h~8qY7~Ø^ti@1lw犗(W_uvI܂yNWTcOŊ]=zTt ўD7vM~Es82c2^.Uv9}v',f%Ĥ.]Z:}Nl/"gR,8 "UVz D34{07 klܫmG[f,}%;6}Ǻʴq=eRW_-UA R-$@$@$@$@$@$@$@L`ʔ)rqvQ%O6F$@$@$@$`]OP 3$@$@$@$@$@$@$@FG~t $/ 1&﹋?C&NgϞ]ZnG$@$@$@$@$@$@$@$@$@$@$@$@$@$@$t e˦-WA* 2aU@ܹ[o0I$2LQ4*1(ǂ ~M-Z$_~Z7b= s9WɓNgiAd7Յ|lgu̙S;v/2fٿZG>`-.wqf͚%Kp}fߦMٰas |z8~s7:b2}BA^(ڵk:%z O FcoRJ4f~?v&gy>3ɣvM4h<kvB|W*d@9}NI75pK2ț7\uU2c ٱc|r&cS3 d*bƱA$@$@$@$@$`۝qob;jq%HH Xn]Hnʾ&$!$ H=W1ubc?6 OB3%,\Pmۦܼkph$@$@$@$@$@$@$@KN> dHHHHH'N @:/}\R?B~P(ۧ@@H 0EW'*T|A'Y1BTbCbzz-ի'-[>}g%`DvEVZlpxMm2wJ}ٲyf0/6@̰\rj_?? GеkW1'-[V^~edI>6/_ffz<Ŗ< ;k}m\@6`6I67xbӦMc@K$@$@$@$@$@$@1eCv% ,P!Xk͚53wtHHHHR*UJ'$5^i$@$@$`` HHH y /_^ k9"zN$@$@$@$@$@$hbL4ׇ/F$@$@$@$@$@$@$Ə/HHHHHHH[bՊ+ .R 11m!Gv6vI3A$y ܹSvUdɒY@bŊ/AqСB=qYgɒ%K[O5d~>Æ +AA1O. pఽjժ2j(%`iwaTTwaLAMϤ-.]vѢEդG vZv%$HHHHHHH2!M@IDAT3f8馛4$@$@$@$@$@ P>d2ǎL.W  $!PD iޙT"-" ({ҞѢUHi&Z<6-J$-ZD*ҢJKTO!"B~NϹsg=3sg>s=~+^cf @Xbu9hB9b\n̚5K7oZ,HHHHHH cqɓ'ҥKU'a ($@$@$@$@$@$@$@G6ި^|Ǖ="    vi ɘHM%Ϝ9 gmO`Ȑ!ndn0$@ML']gepȡ1qG.Tc'wGD~+RdM'PtEnV]vofבEN4{67SmqAݬY3Jʗ/☦Ưslw -[ܪQR%>|s9ST8r4is _`=^xAZlh xǛ&zev Y)dy$N6f =}5m3;N+{^ ~8ANGټy o{ǧ`L tI9bD}Y#(MHHHHHHH `S][. fHHHH ŋv%Ou1PV*]v->s$@$@%[^CIHH tZ{N;eN @q#>SO= 3@$@$@$@$@$@$@$P\4h @ƍ tX-P2bUVʕsΡBHO&]*w+eMo NԦݻׯmF:,;w9m*#7-7Qu(Djժ}n ¯~M書Pye#8B8 ;eg>0^&~z0Z~2qJmY_ڶmxr!~U\5W^fm&M$3DiRŧb*?K{L=>UoޯMwh{_2N'[(Ɗc7sx]%#׾)FओNN5{ԨQqƨu%      @@nٲ%@j&)D'N 6uС6 @QXdۿw 3@$@$@$@$@$@$@$@A> YHHHHHH\t(ʀo، GjժRn]UYB+Bh% EFW\pBG! x饗.͛aI(͚5W9dŲh"^z{^{% v +;JT☆7mڔp+H:u?K fA<6m[oNi,XNdөi}36wm')|ϋsqL%:S%3T,SO#Fȯ*t1gݛ0a\{9 dOsrgξ Scߜ6M`nDw1     (X;찃L2`džM#ƿjh…r'jo  Ǝ[E,HH +9_*U$6lbtHs @1h׮ErFTVVzY}[j%իWtү_8n 65k;S؍dB_[o5/uR  ;L<`8p`϶ /˘1c|1H 76m*_j{?: 1fKГȐ!nLn0$@$PLp 'Ǩk۶m7-$#]6R=/ ;O9bD SG̝;72P      *˫oٲ%](vEw+V#8—/a$ ,*UlذX/VժUʕ+V agIH 'p[_Np  [F|͛7WN+駟7E^,G    p 4j(Y 0:b,ރ?qDs۷w:/p~Z/ D5k"R63V\\Cg}$@$@$`:EZ|98i~i9ӓN      ],Y$ `͑"0`e-RfcIHH"8*÷d2zhi۶m$G$@GJ*)\ (RM6u{6k,7Mg?dĈ*rҹsgc/$@$@$P:.bk]L$@$.%$@A wީ1@ 7 AC2HHHHHHHp /_^5nͅH,!O>waaHHHHHrC4AGaZHHHHHHH xRV-ߖ lPHHHHHHH :bLE(kU۴i#Z;aIHHHHHHHHHHHHHHp J*Ɇ d̙4\(yeʕYg%UV%        H{!m۶U;?~|e0 @(W/u-[n#ٲ# *H-     ;LGk׶S K%      (zpѡCu;S}fIHHHHH!@Gp,R0u衇Z              (հaC՟ƍ`]ݺus @+6(e @Fx3 $н{wNHHHHHHH @U7o\Me<֮]+sQ͚5_zqHHHHr@tkUfHHHHHHH%pI'ɐ!CT#G-IHHHHHJ1#< @ahҤ|嗲i&7oW6BG_޹spZnB,HHI@fj  NଘH }pX^=7ߔK /9HHHHHHH @rT舱M͜9Sl٢x)3 @1|,HHHHHHJq'իW˗+"+V]v٥Tq$@$@$@$@$@$@ h]`$>p@hH_V/_^'& D@ӦMö18zj>| W^=3.g̘12tЌ3# @zIGc+ʕSmᕂ=D 6k,w_s[oe2@$@$@$@$`E]DGvt:b fVB$@$@$@$@$@$@%C[nrJYY<ҫW/jJ /N ?J옳!`:bܴiS~ZC%6lPeYM     H@*U1-bLL$@$@$@$@$@$@$@'РAwÙin_|QV\HuYRjUR!        @ `!ׯg]&       ?˫Flٲ%a "pB7F2@$@$@$@$@$`vĈw5jX !gX[f Y* $ {˱.X@&N %IHHHHHH/Z[tX4jHK$@$@$@$@$@$@$@$@$@$@$@$@$@$@$`{)*URሱvL?nݺaHHHHHHHHH [^{<裲qF0`p "C uJs     (*{iӦUؙh+7o&UHժUe]v Gʕ+Z& #   K.!""1֬YSʕ+WD=cW իeΜ9qM3P̙oq̈oV-[fF% 7iD~׮]+_~L:UVZoѢ4n8&ٳNva}1 y橲v[i֬wwۋ-ŋrvm7¨dob6l]wUkdI}yFnj+iժ*?TL]`sS`l`_{챇fq=J>pu֩dpHrΖG8Q{kuzT~MΝccҠAV y.3gsf…\}ݥe˖c'9N39~}q||N>S9r&C(`HHHHHHHH"% .@`|A*>r=Pd?HHHHHH |<@Ă R@XtEN 1ciIHHHRs:S*M6 9C-.Զ]&bG}o'r{N:.ׯ <77ֵs@s p JoO8]?`4hrnF0a8gyFG{WرcUyGuIˆhz⋕Dٮ];t(6nܨ/r!~ݴ_~|3m4i 0p@WܣKqZDLB$)"oIx^7nt!@IB9 @Xzuu=&<0 Oc}:z#FG|$@$@$@$@$@K`+Ʊe$@*W֬YrJOС12; Cs2{옶 t;5jfzЫ+&[ξYu3F_?cU,!Q`Ŋu5/tݵȑ#sQ{=9t:px饗*]{qs=>-gqZѧO[tt_GiU c޼yz+fΏ-@/׻nuu'*T͛.?<Y'}Qo29& 0i)k! 2 (=~`mqz21fN| (YIHHHHHHHH );cUW]%;bƒ <m|(!e~m, <($@$@$@$@$@'l21Y_Gm8{饗W^I R-Yg%olVrAI֭U;?>L֮]:bz8bDiӦ~AU xI͚5]~k׮ 6w}<%5a{r% $d"pUc ‘uN:nL#"z b,knb#LʐH&YF:a iӦ:Gp.{10aX5~ҹ9?/]vUvaҴiS?WMDy<Ɠ &^^}Uqw}_r~Us HH@:ر!6#B$@$@$@$@$@$@^朎-v`W9ߥK$@$@$@$@$@$@$@$` 0@~+ݪU*ӧˬY䣏>JZyzp .]N=Z~a9쳓9NSCuA/>^Z9aDl,Y"Ç/ť-52c / ]w5̍7 -Jc9۷o/l*? v PONg$&]6nX feԩҡC+kX&rƎkn Mg0%2=u~ @6ܵ5 DOjTkGuZVTbq0O^C)s%F%       K.B2dRnׯu]u X #h6mN-LfpBn1%0c ~fTL80n @` 8J&'     (SO!+W׈~       (LN.k/?|\i6:ڵShtŧL"ݻwWY8 VLpv,zͼ,-[Tq0e˖A"4B+©u̙AJoG}衇0b @' c)A꺣O:NO?]zLC$@$@$@9%зo_kVtB$@$@$@$@$@$@^Z6mv hG[[& @4 mڴuˆGq}jJECNR*ίRv,[˞{*y z ʨQI:(N_~e zoСj#t-:uN:ImtBzKC\!Jfdтu"gy&i3 Zh|嗂Xۀ ,y$%(qa;K%O$@$!uٝ&1XK.:_        JU!7tSu@       PWr;Z֯_1     #3g=CUg͚,STw}2ފ:?Jt Gi&MR:7M6p*8n8UDvƍUi袋F@#+Q|A :~vUɷlws]wFKFډv؇pH b|I8S-:uxҼysujGy:BS׾w]p6lX p ʑ1 C1 yU;9 8P԰dݺug.˜_,|IXU^oΜ9j /}C qA,ffmnݺO0O?Tdm/gnXMUW_Ν;1{3sV">'lອߏkɦ8%     (RZÜ%֬Y:;F3 D̙3UK󡣛bS6m+~ҎN@j*2e_2B05c 2TTIZp0N9iܸ*[nQv&N6M}|m۶US@f̞=[cNӼt>_*DMig2f^{MmBpSѱcǚ&(a;aczX_k8Ƶo߾ M˗uYݻwFIjՔ[o`-t4i"oxr%t)$@$@'@Gy>x3fjn'pB[IHHHHHHH2ae'O..$@$@$@$@$@$@$Pzk/,2 6\fHHHHH w1wYS*V2 =!XO^'q\V8v4(O?T-[&rQG)zpʶzjdG&hw宻J_Q\\9i߾v7]JK|*y!ݹ瞫"K/_~Y! s̘1C~w>}\uU pxo}پNupװaCeh!'``իvy Pq/?;=Qs V -j+'P-0oU@_scY-pغukE<￯hg8]7ibMpH^z%ի k1~:v(#GTeQ+ssՖF%lo~ t|7Xd p'N?#:N:ҤI EF;;CsJ*G*0GP+q:Jլɓ'Iݻ+G/_|ZPf,Y;*8&3_>Cәu8sIw}^e}Ȥۜ꺣e9~U tʤ'00# 4vij\Éa  Ϭ0>߫vڈk+?ʡcLm#q>X9D^-X@+Mpvv0ҥK38/Iq7A_-pRoxѣGN?|_ܿC=T9x(w߭N4'X>p݅m&.8D4vIʗ/k׮{5k(lR_J!ȎOKnuMoHHHHHHo76OwM-J!        :HU={ի38Slt5:uUGh'"ܢEd.W]uu]w%(76y-[-O;dq#0u=SI"f7(BAN!/X(9 G踧#82pM4ImjK;,H 5L'裏N@qwT/}ݻ<裪GyDVZG+V_7?#IHrG@`Mڵk3B9K8СC_pn %0~'K='    (T0C>.Lx e~ak1HHHHHHJ jMMPʥ 19kLM znFx(vDf}qŋŠI[ ΢~mqN8!&> \ okB'/+}#Gs9njJ2eHмys/q*Uuh_Zo\8mV``sj{n{.3T\YNڇBTf\wO~6)W_@q\H80Q't{ҦM17 ~ei-<uQn#{GTvj?W\ʃ]1ׯ/0',p⇿O<-S?cve/:ZjٳU sϦb84Qj86ժU˦@y?csUN3u&cw |L6M=y 7O;$Nrz-yWUzjQG%|z41L$ /P^|Eu1\V_s2+HHHHHH~ybVÜӀ^ @n)?Þ裏#k "1BOzk~u MsW}''OUBg-[ѬPx|HXp'fNoc?:\p^W_)^5r5֪UKYS=)&C":=6n(;찃z*Rwygrܸq}*[9l=,H 1Lp ҅N:I}Yk +jG:mذ1Boʁ(=rlb #u.-uQqam&pH! 8b^_-F#4M>]iժK! |HHHHHHH:ˀQ']曕q=zݬHHHHHHH dDiPh4[I$@$@$@$@EF@;b{Uc cW_ _~E,X*/zj`b"s=cv̅1RlIܽ+_|\Rvi'cݺuQ6L'>) {…$2NuˌCnH w}Pi,#w}[n F\5\#W I00з_9(31jX$nWG{.|⼇Q {Yz|J:t_y駟.vԧ*;ժUK/T9c<u{cEl'߯\ҳ}-K;ٳ\|1# d/t ٲer,[o)%r#XDYGgu\X6سf͚PgaZ|~7߬XCG0; f#$y1jIe>O6`͛7ˠAz\pHINsL>N7_'YƏbe 3NVz:~k<>fа=n @ ܺ&@_]sykbOEs~2b{G\'aC@?*Iƒw1>ڼ R>*QX+mL3<빲b>%(.π170tq{Di&:܉ڡt\~쳏^j@G:#FuA,YpĈZ hlwe#0y`H 1kr}Z7zRGWDzp86`m%o瞦`S8v 6$sF{X& @r;8٫Yip?Nkja@IDATa}?ź*U5pJlp :vԋtG! ~֒~$[#Q ƻ$1rHN: (=^^N8{L$@$@$@$@$i$s;R⍿{dܸqh{'=zD :A!@n(H{W9\ 6Q(r7ȍ7(/o1_~-ZK.D9twxn9sL]O 36NjyFm;6FJQZabw)/r+WNgۧcW F/9ܧpa>1"{_6_Uu`",B-Š:>/4F)];bD'Oph`omftN%S0F0a?i:[,{1w1N,G3H?;< Ej` J008V׬t0- @zUwK-pҚJ:x8Uz?8 u8բr)L}aÆu/g³gϖ}?8蠃^Vowq\z)pYpfBZf2>t9%HG-<\}*3sꩧ_X (P>+.J:O09j#نׇĎ\˄[$PLɌ3bC El?#x>cgJ[̹od..f荭oc&)4%~KNkkl=E)$Aoca\N5֓)%:F nvlsX ]\N>depjòeTW*}Avt8z衮N t +uTfҥ 4H<v evuWXk[→"^;V+r8VZ)?1+TG^t?A?2DQG}!hnj5('xa &νS@{M|zNka==oDzdܹn?1a 䆀vs\ƌ# fݘB$P      5(9pѱ+eee -7mڴ0b.*U4:Treov5k(ǐ 0 *7NV)7zR2-t\_(OrM7*N2;) T#8B)7C&ߒtW:<毗; a2+ ,FmÀ #%>0ENS?ChډZrُky㲄=F䌀Dc{?\h:}JUw,&;Rm r~qaI/!13F.:¼><-Q|F򞧺/B}@;m[dydmλB>mfx h%NsH}ѢEpk&YN82)[1zYWm&xTϜ\ m|=|#l6|=#L …2`h[ƃuq<x`܂Lܽr;wטt虊PF j7P^K|5-81ۀ}[߶y ~O}9YCqJ]j:&o:I6vTiԞ昱5^,_t}moq0gu{w^Jl^,w߹]34rڵn:<}DZ;}P7,]GfFܖ[+/~7 !^_9vҘ Ԑε&Ul]7߯4 3|BG N;明;8Pߢ> Bv~N7üElzVTi_uwsh/OUddopMz 7p 6LOH.10?1jQ8#Fγs{1N9x1cҥɴGQ$>f?M5: Xp+'tR\nVGx p5j}6}ov1nWeڿ; f:>6 @zdsg5<1vWP 4s,JPΓuB::9_sr\gq! K7o.yrHHX ~/‘~ʤ2TyB_ &E,m= @/zyl & aB贘-MF 0և },ԩ^"'>?[0A'-/';&4\ #nrfֿ0CZ9e 頃QqP馛T>bh3fne b *oS0c ߆a(_~rJ ^x2v Zw/o8)5 I0f.@5XTVM`XY;2K4:tq> \7:(A?,XflnƅgΜ)͚5sO9T$x|{0ЪaÆ Fq:7ZNMC7a@OP\\G0ٍ7sΑzHve^tEjs ]w]R^.AML 6l\uUQ|FB۽,{֘9^tmG|7JG /Woog0w~7yW}6H4t%d޼yҧOw!|9묳cbn]9'3/ ;W)fh[υTl_{~1"#?|¸\#\f={M8QnfeWA77ߔK g8^q`4j [z-\t: sp3FF@0LGq+GN9_s*k904h JҰDN9>u78)4 %C%/_ծ];2(Gp dzʷ1/~{zلuy 2V3X6fkv-_a"(5ymoAuS6l[N%;3S%_~?g慓Ai:B_9R+oӦMF5*q TZ-w}W`+@δ0k\l4#8@oʔ)h"75f@ݦZgo#9sJ Gع… /V<&UV$&(QAl$OM.xvnt2- @ @_ya5GX`cǽ^}5zԨQn<@2sn:g=aD;>7?'DIxǡZL)p&c4ț$I&9 n!Ͳ?3py2bch.az[mqb2q v&wXhٲ7ڶ_y1mp|ۀUVE^x-$Lo{jc@(9Vs"{42GFy~87cRcl;&O޽}|#};8JX ;ۗhVs'dԩSU9oe8N.ݴ~*/G8Ti[3<qڡoe{ >n089tXtX@?cDrʪou`\2aٜK McÆ e?CTǏWX[`ALLۜuG7":M^הH֔lCl~QAe[/&|#Ĺ8 @܋O*(cz*^j |4ڌk*I*URێѠeM믫WO?>@1.Urw?X8-,櫮1ڵK|<[ٔ&5ez*mzq]]mqT?83 /q2q2Icr=_ ^Qy✥(,Xxvz:\zTd߯}S?}RabȐ!5to0[kfy=ƄMa}*ϔs-1snn6FVK|.梈 غں~ [`4Jkm?boczv-w}wWN7=A wQӆO>Yp ~m 4z\)fÍ7nsgQaaaرcU}QD+~Lq6ʫ_o9r8R޺_z%7~1e|jpE$p60o26m7N06ZntIެep^h)اY:fLd>}|pvA;3;φK~mn7Lg]B&簮!h>_(q|յӧu :`?IL1m$/(- zܣ)$ )ӿއq?:Jr#q)c_;p;-NՄ85k֨ǐHڷo/^{81j*縤އ0:6Ɏ9tӪ18 AӀo XL0c8K&D@7`nJ &;DF9c;;@WasM\JTVxxtEg*8T]8g^16d9CЯ|a&6q hfyh0 "@\=X1bk[ }(?|uq8F2НGc@B+:*s️8F*OqkٲeL06 T_~8eTE14tɂօ6b^1"7ZhHbc[:;v\c8JG}T05t)O g?%<;A_opr`l L1Au^1OSc62>$a2Bd ;ӞQOEt0GwSlާLi9ϵع;l|g;Q!-k#oƣɇ8zkga}+0!IvZioۃ0Iۘ-f6#$c-}A n ǿ;8St]]tIXzt3oX{U'OKX;4gֶiqʇDU~Y[^}Uq[騄X7A kuxqy/Bg9sL;bZg[oȖ @=f7{in88Z_8]v-0~u=|r9(~wS>]m @~ `yf SpB.\`/SHH$0zhi۶0 %00'# R"C_P'>Z)\z饪pGL*d,5믿&Vn@(hcO 3?wSC!?7Cf^V-[,aAW,6Sf̯-.Pd1c[WݺuS~d,(6tvpUq}D8 MZ(ks~}AlΜ9:SXԥJxH&p^kJ:t>2U6 n_~qq$3BSvm^zƺ7|S>37cbֹh"w@&mHUʕZp0au|!^qb iPJndm^ݎ3<ڳx36 myyüyEun8 aW^Jz$87`@$q ~mes0yi3C~s0@G0]8_F))/B,1@ _|Q= oΝz/^CH;˛Iy 4iD9ı a RNX~),r>=tPe Ճ:H]zlu`$Ȉtk,͟?_ZjcVgTif]6FelsWF}ҫgf[8g s- 2_׶!Wx COCsV+S 䊀6mڨ9x|Fӡd!oQ}͜ksqiulnl|gEMڷw1己#غڼ~-KhPuTH،=z ~[kl" Na{ʥJ^Z5:t$K$@$@$@$@$@$@$@$PH.[T0юm(crh[ut#a2K &٠hH… ݢZllMn |PM:ꌘ@$WlrbVt L|j;82xq20$k_IǛ~:Lض8P{ϩ+u՗!  +qzcFq>ǁW^"Hu{I~N~I2"҇zH{{+M8Q9aS/\((Bgk"PYn bj iAc%3 <~I3vJ*py/_^s'p C:uR Wn_N>81_|!;v\k9;H=Z9s!P&}MhJh!`BT(h2*$@$@$@$@$@$@$@$@%@ 9b|P/(ߵkWLҽ{b$2[y2^l7a$qn Fa-Οk9uҥKհa<-. B.c=JX@0:]]pc(@c[Xm) .\A N? G 6`3\9ӽgcwI;Ƥwy IB.c~4*2RJiA,hD.( 1bqӰ"76pDu(Cmz}W]I#!m4W u"ϸ/0ф' #0I'{E]Xx.v( Ka넲> mGўR4b m$'uqH1Wdxrzal_mX4}Hbq6ز}%ip0t0M!|h޼yxqг1evt_gucS~aqw]a!'_pϥD~ f;Aʎ\q~<ƸeX>O:>{qq^z'|NV;?G6ȿI&?z2=G^w/?P"_K7~ms-wdr+}3<P>nvN:ڸ #symxLq~cl_QvuWޏLҮ];C*=MY~}:']z=ܣ !k֬a0{N?t~XAy裏u[C[.`l)Pf~2D } 2~x-hVJ== @vP6c=,TC'b8,֡Cտ(`v]O9)c~i1V{·$ɻg &c-..{9f1KsCƸӱ7燔-\p/!($-{N" `믿^a!1g:!uߩ)]3G\wV'3mV$E'a?b`˾9U_Gろ˲ufI+抹s3 q{: @r ][C:R p'uQtts*c~~4W `dt:0EWh1aE6w޽=0rӺukX.z3>()N8¢ F%N.Ǥ֑n{6C];ye~{d`QM@*ab=JXP5Ⲽ6q |wzg;l}9oR0ƈ4dnO7P;l_L|_"];J.q\l_)m,P6iy&L$2/0\AgRĖ1!*W8>E+>* @UTQxZj߿ 5Fj19OTM45X80'=Pնm[uA](66m˝}'F??q;~1da|~@ !Q0~esk`|=u[)x @0 3fxcLᆮt$-ǡrbq}8N˜_x%-cYqG;}Pܗ>y|cEr L)L^հߌBf[Vgv.K?9??JFpg~"ϒ 1x~;wÜÛn)?⺎;T=8̑Ĝ.{\m3o,mVH"L؋}~1a6ٖIˏp[(W#U,{]aޒ þOpN4l>,tmYos鯋1y=]^57gOϦ ?5 A|Z/ kpH b\Nuqe4˜Ώ|^üN:$ըQ#==HHX TVMy F60^-}z go  pv}w!F6t hsyø  n6|P͙3G3F F 0zha"?*e[XZz8@w}M6 ˆmzan+.%xXGU+WaÆ9=u9 I$vzy6(]L߲^zII#2^{m7Ibazʤ-) ;&j\(vA= 3ܮ.ZGB:|y<:~HRG~nKc2ӻjҤI~u~KrڄϮbl% [Hׯ| Cw%y.;冄}12iR2}!XWFپR}`<RR-Ƃ%x _6rɨ{H,ƒ`zԨQ{HH 1[zNb&J%kcoٳZx ݡCս{wՠAcD٭x>Ii;;{=x%%(G\$q 9f1KSDgt˱0K'2ܜOw', @HChQJ 7ܠqj*5x`վ}{m 1Z<7:TR딮#m}9ץp.BouUMj_C1'_ loFo0m$GɇH u]À/8^]&b+maʘ(}cٲ\;1y=S`$@$D]KF7d CI$@$@$@$P`T[N}YE`)ShNܸq4yHHHHHHHHުjԨ.2݁~.,#֭[$Q尘5\u-Twuwlx XK/Tp ۻwoգG_| -ԪUKuYNzqWaM se]<&I7`xJ$3Mr+ 0aB1?bs;]m.yKhb>SmN:)ڃao+a#G}6hmǔ˹bK8Á8gxdQ_qW\?#Fg/0Ј w^'zvd%y c?O):HڵUv̡@IDATނ#d΋i\{ cNo馪EqJm6دO<9O,&|Lj i'Ӥ~yu~q$&ܖDCLsC};TX+O!lW1s]^po l]tܹ߽]wYwlv8gG~1 1;D3'\/ [6R4Mb+7.cheJB"%1ϰ}liu$6Ǝ'駟g}6+4i}\6?WRe7 VFSَ 'q?_q}{U6Ȉ*v۩IϹIܘkOs{Hu8&IՃ|9̜mrS]nʸ'/B? I_1@aPߐ(uQ.{]a@WLIcw,e"1yzf&2#D^! dZ2ҩT&#UJ    D?Ui1 1cx 7yi\ .HիWOo^-^XX6mߺs1 xnժU1 -X@ۂ-#`SOuS)[LhqJqO{j֬Yjȑ)Kշo_?t5aw@fmTJԪU)ihѸ ?re…jٲe^X)zꫯRNbqp;x/_&yeb\Ļ?qDmFT#\B2@N1rO>IEd0!- QPܼ (Ia{͚5 ^{"U0[ZD.cW_}5SN饗Դi<aз~|gGwy'wrKhq9X^qGǞT|I#iP@qg\|GLjhm [z߼}$,(;a߇M^{"qeymŠ|9{ls`6x)D.?q#CF7c8o+q^R[3Sp!;2GًP}U+sb8p}_>5p@d7|Sw%N:IyuQj7O |'q̒p,m=3Ѕ>(%(G1֒'Ic$r.<+BOC@6J$Pr n X]Cmf͚ive!ߩ$)]27skyۺh!.f5 Ծ$n/K˨E51qU`{eD1̕vYs)&medv+~a9 H%#ʛNe2R$   (o 1bmkc QВ cPD$@$@$@$@$@$@$@$P`$Jߚ2e' U=sSݺuS+Wv~t^"R` `QVZ~8yիWg./u,v'x+(2|u7S8 uж;y*쮙8F4!- &(1h0$y*oc y[omu.Ke[@!'|RCrbL3Xvg((JҸa~4)> AJyLR>cFF1͹sj0۶m[uɮlIޢ.k.SNo2s167xׂvGym0gA9tR=#+>;6|LZ ] u}o2=2qJjhm @CHgyFtAߧ~`p&M8z֬Ys"A v`ѣG6+c?eA-#L9s6i$0 Gl_NjA;b*'Gً}߾V0~lpea*zz ?x^ [0GȎ@׮]w @9 PHsAfI lZ:ۏ=xp_h+7 0re?3`ڠΘ1#eW4;8CyxK$@ %&fIH#īz!m|qŊ wp V\r{78؁>e Jw}#$h6m$LX\SN9EӡC'~-VLÂ)ozgվr] k2a&y-ժUS^xw e-'~ŜCYNUt.I?1 aÆ/цC'.b!)[}:caE=asqqikLȑ#sƻue x}vAW`@eĈjر<ƍ?O=/nNٹsg,Qb$]~zSV`ϸmQ5ϱ2w}l+P|o\JrBޗn_r{Ǥԑ7T@x!2q%$|D)净\|nO Sb#C8)7oZPG[\&;s뮻-w;vT\;SxDXp/ywWp4e*͇ |$$ԕSSuW~TܝKZa]^M?ѻ;$@$@$@$@$@$@$@$P`{,~zGNے%KtȠ 7͚50GsV1W 1K!fw,JcPV4u1^&Yf1 HreY&8R_$):熀̋qq~r~We3$@"JF|CsSjaӃ9Y>ÜFu!ߩf.3 bKe~m~|BH2`(l&ukmqad l/`6w^G:Hq..ݾG\=HHHHHHHHJ\G6hQrN:+% H*c[oU-־}{=aH^dƍSs+T:-[ѣG:_]zƙEE 1AO `夓NbvV۷ի}Kc+F/_^zs$Hd^3 | &MK2dw,w0޽{zy-?49;{gDAOFY9w8߼F$L~kkHR `/X~{kY0|c}IiD1#[Y.+?tgcG0vWWܰO^x5j(~zoh:49kUm32~ȎEKzm>iSR2 ;qwXPא6g{GMW8 huŊ.`HϞ=S aq~\NY'q]w?}<ŋAs .2?A[WXt?۟8ψFfxؼEY4jH7`m}UYti^guǫQFFƌ#n`1~RreӚ5keJ'x'FŽ>~)EA8ׯkp]q/D:OC'.3\ I.7Ā兀lcS~m=֌?Gy$ȹ.Mo9Eu<0ș>ogG† N1h.~fWomۥx`X2MTVW$ؾ^ W.s.fr J?~1lja#      (0f17cEC (OA c_jРWgZfps-,ʱ$W"FOWpb&YI2%R3}B^ceyF?a:7~ψCOC2 J$@& 1k; |{jzXK#iO!#ZG~.ISLע2IŖdwP˕1I0qs[,}cq41Q~?/tQ.{7~^u* 㪃&ivpI'Q`q1w7V.̲_gwN 6OlD/`efɇѰ-Jڵ+X2J$@$Pu]0bݻ+у]LBbX 31-~wu֥:vm" $Κ5KOg}|zA0 F;c TХdD{1}O6"<@|˱?QJ'x C0 [ֆ{9ժU+zjv篿;nǸ3skPŠ9~D!Μ9Swq. J6g'NHB qPnݔ$j;e2fK?O$|~kO1 (С:7q(B'f䦛nRp6(?l0=Q諯m&V* 33'u]\|lel| u `(_Tw%>LO9)\5smHøO8F[n0p (Fvځ^}UylÁtl8%f?`K.1z+ [nG1E`Hï-6/;lm}?N/ĵ?tA9oɓu6 )2=ghQއkA V袋T*UlcHoj̙ݎ~b7ˆbTvB`Qu$MoI .=$?|!KoNǟ1N cvg~X4G~ڄG~+q}]v~3UV7|Se2llH1f,5< >}-wC;l_iU*'Ry$֕MmپJG'kI3l_;QHHHHHHHH /ݦM]m̃ĘyeƹV\uƆ up[lu_16{͛:KC 0@>Wo60Τqe1`Zrl+I㕈,UJ<5:O7IIYY+qϳBe98td7ܑ~ " 1^D)]mtjv9眣ׂ;6o-]GpQ?0aϴ-:k撋\4s%tK?u a|,4WiԾ1Y._eopl6\ɵ_\I+m畤{e+t^ 6#M!        d$$l73;n$0e`VƋ# H$^{M 8P}РA Ceq٧S=!-d,=zܹsשN=X@06m6H0oH@&a2'Жl8K?&La0x]wI'޾ݨQ#f GHpH Yr$+ - w} zHOY|i m7\dM=Ms ^z&^qҚ5kT~ W*+njvr<&`Aln#h]uUۺ K^ޑ0ˆ @;:w\{ڲ%^-Z{|XM륗^C>h8_;.w,#/maua2(ܶB1ʒ"4k,ڝ 1q25 Qc2W_tMX\a#F3{'v%ٖ1O8*˞)o `LM'vtg6k,n:Y{Ǽ 1^Q~1Ց}O..=$&Wd8ԳN2ljnHp\| B^zľ}zI_ԡ{1%lk 5یN8egٲe/Wה1co+Ӡy;l_̶e8(M\` )[V+ ޕL>!HU*\gؾ-G^|E6 '[\~;c+7.c r\ų' 0oQa >3)/O?pc|Sro1ˤW"9f1^'sҟ˳Z87,wo8Y.t8??-Yܥa 7t2uZӦMUJA_uwy.ݐ@y#[{QXJi0:0xꩧ7roC\;eS%s_:/m>)BouqHr_KXy+Lj~.u]Ǧ앨umv̕J}c+t^i)}ϬXB]bE=W]Ã^ZM>]5lP6}oB$@$@$@$@$@$@$@$P5~Шqw{,aSNf[  CGaE( `1G8|W@Ez\$={*ku'(Ac_U0y衇 1,曫Zju"`1+L ?~|N$ƍmt?C~[ҥڷo`\7*^0~}Y{QFb4a܃ša$xԂ  pI opo ',z3 Af9ۍ߱4!]vzǽa S[m?ms1haus=[]?SǺ Kvd\C1 %(+^ye]rʟxp3/;v,3!LDp.y]w)DY:uT*UR }HW#XX(qMl̦w'W[=zp}FQƌ=Z˸GI';y竅 깠K,1ˆFe , /◻A'T6= qv#ÌgR9ne tRon8c0so={:!DFe#g$PF u{ׯGK6:A.=8m>mqwmкqqcLz_SȾK &Ƿ?T;wV(*Ww_mly4h:SWmڴQP~k%\0)>/znALZ#FHw @hh^-[^}U(FD9֤IlhOv_j}i-=쳽0;wlL8#7F?qvȎj\?0nFvqGsu~8%[\klq~F*H?e7/Bʤ֭[32\8m?&\O?N8]F~kÚ^ =/t?I?k{6NB?WswHoP<|f~'e0}%N*)t aq. q+ϸ/ߣR6? UTo+ whѢ6nɬ l޽L'EH#x/z-b&I7a.qu6a#ؓY FЯy,Rk$>sl_mHŤ))yuPrIJ]9rlɥޗ<=JzeЮE,w61^&,z7><7f?I!       F}[mݦz)h#;+WaT'T{viz[6nX/.:i*'J.Ag0f)aAgmFD]p̲, >m;]hPsC@-[6K?9?ğdaoٝESn]u@v}w;g_w_^}w zVX+{ ?x~O\端Z=ڐ"FD@[Y&A!gP$ЧO5 Nב|mf#p#w_h=8r.MݱqZ}ct'$􋁕|pmS^l>C. M\ׄ=6l~J&8>m:B!N`ٲIפ. eli~ٹkNUB_{ァ%AW9眣LڷI        P䘪Y_ ԍ;jR'{Na `B$@$|fa_|Q[.6Áa`Ѧ+Bp SN s[F70znX^_,>sL% 19R+C#@wyVƾqaA,XH Za*55k6A2 d0*'< "0?vAڬY3d61vZIܼ93+q~L0A×ؾ; 籀H\[3l0խ[7]#P·?z뮻u;h 4P/!F|# y3fwG;vTư/PD^zIOP60H'OJ.]婌ao^jGr6=U x2Gg- H9nU]3O_׌!F|Yk[}]ql( }FpO a޶fr CRۭ1ڥP6^0P-?0-m("?<7)nPO~رcҥKu`|`iӦeaE` wæa0(A *xdF̍[;q3QÐ{避Y.sn]r/TEHüGR@]{T #6|z0Fq"c8̌E."gz瑀E1m<>*~'q_~YJﺼoeu| /K,4k裏bnqN}1J}H*=¤֕U6ޗ<=*qc qjС"Ox.\ڵk6l3C3}տ:Jr-z{s@ZAHHHHHHHH Ϣ?7>F/c(SY9^g4fiDžK{_)qS 8~XKRǟ1l)mN2 ~xG )q;#ɓ=|Y>ZZGkka~+V#QbO?2zz' F6|s^{)̧!6l죠n06Ÿ; aBE8?xy馛1k1i;s0 @ dA#('}a)|Mѣz'7CU{ E@##o֓cJ,2pO08i$q2PHH raPoܸYBgDz*쮙|&]4x`g]fwqlP/N[fڵ/ȰAJLlAqQr2$ #ᄏjӦ9 #Aa*@%]X ̙3"rɰPԮ[o>\{_& Ae{3Ĉ~!FEYAuƕaHڵ %Aoٳc K*)t a[<:|^>"]Oxasymł8{{c+Vqt 1:[u]^V8z 7;(/ {9s7_oپOӤؾZWMl_efER WR6u,+Eͣ̈́6tNƏ^up3;ԭު?.%1իW1l}$@$@$@$@$@$@$@$@?7Ws٤Y4[\8f c-I6%8f-s A\H??!GtQm>e?&pWHaÆ>kTM8QM\=|x뭷R"*f,IHH @̱ Z,g^! ? >H #/a]%Kdtk;!FAdر BI.1k6LXxȑ (˜}/]p?TPCN.Wvm%Btu] x8;PyժUubnO? ԛpC0iㆆ 2y{g&:v(Ov̯ۢd/ֺ*ϸ/GSxKЅ@=u1cƨ+)!@C^ Ou]^]1D#AJs=eOwInׯ__}'̙3mf͚ x,l_)mX1W}Q־r]}>=T2l_G7kXX@3Ţ8K/m, -},a[֐6 + nHHH+Ixe! c!{AAe<t^L1˲1˲L\Pvz:9Wcxy^0|yӦMSZpw}ڵW^ѿݻZjO (.Q5P`F99}#"Ho ʸ3Z1"BO+Lt}Β .Ǥ֑F{c.b=*0rE `1F=qD Zj3bpY^8lq; (LDicm$}1J 너]zIa%mMd<P.ޣR)]g$]z饪K.Ӻm菆ӡԩ:9ֈ @a 7GE!aטo6^4Jژq郂Eq+Sbc-&n ,7Pߧ^nPsC]o<#lF u tav$c|u릃 SNUo=.bܶm[ձcG=w"ꜟ$qbXM@07Bp]GpJkAysw^n!..ڬ_ɯOIi4.()6$ͷ(cd$_e: S\}Iu0M\eF<–pkDTvA[. [8{gXk&aQC"1F" 6`<!vXއqA hq/ps9jp% "BX\S>kʕ:8'Ê`HD=ʲrVjq5 ,Czv:}1q_Xc[g 3';%nIH(V4O CPZc{4nϟovըQ>ϓ @pz*ꊏ?? (iV?~/ "矵!=zhh^j7aB9+m& ~"_\pV##w62n]qm6zRe͛cǦ 3u;QW .ɴu]D(\tq1jY+>Іanݺ .]bL~gud7ܒ4IM*ma(7IbaЏ)믗ec2-蓁!x#ʾ~֛nLNb!-[_~ au ]}ǺnF45E(2Iu$p$~yE~AJhb\ }cƌы`c<oT}lex˃4XR]];kEw7A/>X >z8yZRy̔S ABD)uel_7s&5JqGR>>XBVЗ@&M1FS:8K݌ĀqMOPÆ KWIHH 첋 u@~k[HH Acz粿esd,m=q2/}'&esC{1KLKY'eL}0sC 8COG!ZV$#\{٧$n.\cx)sq1&^_eLKuq\}{vs\oE^GK'2npW~l?뙞=PuYgX7k׮jڵ/vX[ Gqu Ğ% HeNP @ lvIO%K`w!`gȑ#8w @iQE o\te`Q'x"'4, cc A01aqh ` &(ME +!yɅaѯ"F{cg͚7nxK/ ?Cƽ+- D SO=ūn8Ɖ'7tSuE AK7 1$@@~"K-&Eķ0A} c naS:t.oHAe`|#yqOl-(wܱ؂*<2='ׯ> tʔ)ڈR֭amjt~zǑ w?NaR](qƩݻ#Fx!5aOhРߥ2圯'VcRH!Sgb Uf{T*1J-ZГ`X?Tr={5jX }3o pY^v”%p;PxߵkVUV; ߻1;l_jR`0+We/W+6"/qc1>@yjSX8iƌiLJyIKbbDm.]o2  '5OFFHHH F$Yr2}J☥LS8AAT9f1KBϛA今LR,:.\L!*?v w0{6.~qyq폟L}v&:+Pz3<ꫯmݦgi޼:q"/T-_2N HXKBZ[LuߩfN8ǹAd9o;5],Uο6$fo,5O_̿_ \.^upoRT_ w]/MpG;䇋GyfoMs<7\W_}U]r%ꡇ=;/yo0}E,HHnV+j`  @dX?Ȓ%Kn-57„njA($@$@@*U1F"kV+Oނ ~Ԋ+ԗ_~UV70\6x3g ی[ۏH&Vpe.CF 1b1,?BN&q<}t܍}Qƅ֭J}x23(`gb HA 췦f͚^p~Go_ҽtu=Է{Wz{ pNV:pzGL@C}Qv?(LP([nF`]vx?q]Wa _P21FliժUr;a/?0tN[/|iic4ß6ˆ@\X&rDtޕaZfA<$e˖ZڴNꫯidx> 6lh; u, uL\|n)2DF| Ӵw)^\wu)a0[Nof'd-5q>ȝn;裏ɓ':u "ڛz5w̸Ǥ֑IJ]G;f{T*-9&M絵}YuQGe˖3(Yg~3ܒ@hkan:LJ3 W\v;ww;WT>zj$]oc*5Aپ*\EUjQ%7wEؾ4 N- O?]=…LC @ip*o0f2+Ry%,aތ8 :[ps4LsC~? 燄7pO-Wn^[djѢEjرM6+b5G``w߾}ŋKcHrJ Boq3li SRl&A9L̍;{˹6xtLUߘ / nMnoǥˏxBŐ(.{]abρ$_ ?I'` f)}cqxYkH?Q6pjРA KՌ3!$@$@$@$@$@$@$@$@lK.lQy뭷 (A=ؔhK= F0synz ~{֞1B^Zߏśc,7 0@a ݄=qk^jjܸq#:tcQUVo[1 -Z`pQF?fb=tAPǴiǽX|=7yW|H:γgV_|d>3uyi0`y!' g|k_pb[a'vX~k+FnIH`>ׯBNt[?#~:00 cLh#@. kAJrW\6Jw7Z[.Э[7_wyGj֬Yb m<+K\LCGGvr)c&NP!x' &Jի>pE#ڀXaΜ9aQg}2 \s\.XG=, <w~c{T*|ޞ={jc;vTVR+k )n lhC\QϢUcQ UP!PxxЭ{ؾr>q?!z Ol_T6y&{M4qo05\_#xSH&O<>c  șrJu=   `^QHP8fTW*yJT<1K4uu;n= bŊ".BgȑzO?TG7|߿:3U=Ԟ{Y0&֬T9"p]GpJb5LAd9Bo̦@@]`Xz 擯7e\ryOS0W\\0/DXy=] DZv œkw}<`eZSXK'Uy<ꦛnr3$  "pᇫ!CHamyԍ($@$tuU&LHz4~(Ieɒ%HCa'#:t0ܒ  *D²~SK 6s9|!F(뮑ƀd :C#t1k'v [ρr`$s#S?^SI'/v+ o֭1{Fb +WZ^ym0wi'KX r)8"sXx4.c`)2q6 XƵ^4hA! 3a5:ԏNE#;I>jJ/T3{lբE + M6Dmz՚5k=> (HFHV/tU}Ul t#R'xB5iDNZfJ!z1>W@1EE@B$@$@q7]y~kKHH 4@ @ ic-^Yf(\{A"ÇF&{=цuu< }Qծ];ճgO=';Cx dI>!- (=s|Wf-Oϸ@)HbeX)ҋ^z{G}W_Kرcp>)e˖Q7)azN$@$P*`,ŋ40%H4D!(NcxH7ĸ~zOkf[o6f ݒ $.^{58{i6 \b>Ȝp ZrJgfahW0//2ș>IC0{+(ab[n%Q/iܸ1/sƭ௝իW밙sVB)ZnA3:k^>z}۷Wp@?=\m?VW]u6te@7tf0!F "AX~E9 t>۵!Σ:ʻE!]v 4@ݐNT&LOi޼F\P:dpme $@oM^駟`F:,/hW7Nxw1HHHHHH@`-PǏW׿zݺuKY7#Hk X(bRb[AxHZLaXH|TV;+y'lBQ)_QE(rʥ]ƍH59s:>[瞪nݺzc֬YjMǎ P\r/H9`'b$O<6LgQÇ˾q:utźu.v}wϿvAիWO͛7O3.x7˻%7xի.@-ЀYʾՀԽޫF 6~&_zH'xF+qS0 zƎ ylR:/X% v w뭷$ۣpBXӧOs1}c+i"^qJp_$@'[sꩧE_y]x衇T ܹs^,do4GZhz']}evI|BO!  ( aÆ9{qWzL$@I%7)Wf~,t-/XӔ)STӦM?>#նm[5i$[ y'_%^;z>HH>Px` _qW~Νc|{atwy Eݥ @tiQGɓ']y   y yyB$@$@y"1HH UR%m}Y)$@$$nmh[2IJD`tRo?N78n8S} _Մ ٳg+nZs1oaI&7 ,\1?9b6tPFq曫ڵkkc~aAs0Ĉ𠱐/0, cXaH,twŋ{#x$ȂHm^X'깊+3fpa>?8oi /hÐ[Cp8qb .O$@A飿P[(fƄ AY~/sN>d   8=}4 /=&H0 N :c &j9U0%K_]aQF3Y|ǜO" &l0^?3#8oV:ur_ۧe˖iO;:         ȅLjr{&7QGnl6k xc-s#G}.HUPM k& S\gFH ֵ#S rEcJ,c'X@w~'e<}tCXB$@$@$@$@$@$@$@$jժya=(u(O/[(M CRZ*px  WO |/H~QyLO9k=_|̙k/Un]n~~RfX7H$5H";kUF mt2L܃_Tɖs׮]~a$ca1<3aG7$@%m0榛ne/ ֩SG1 G >Z uPFB$@$@$@$@$@$@$@$@_8qjѢZv=zjذ^&y?b³$@$@$@$@$thSA'}ҤIꫯ6m$=Z O?==!            @ŊՕW^״w}ZrZlA?H V*U[z       $5n֭uDC֌ @TZ{81Drm^R˗/׼N:$V[EaG$@$@ $&(+BA`P HʕG! 6Laaz-0{衇| @.L! (KeoY&}_z5b ;k,դIu;C ;x5P)&4P+cQyR)KQHEDR*AeH~{{ι>sk 1_>UR OK)f@?&bi!TZtg[h{]FP @ @@f toݺuquT 1N0!իW N &Nh$<8Q;wzmԩrJ]v& 1. C @ @@(mh8\ @+; /_ٳg;lwM2ƌcGqD*so@ _;if씾q=sΈ'pڀܜ<`J@ @ D$ F_!ƈ"$nذywdv?gy&Nz P=GUT1J@ @ @ 8 x6g'j*;_2eY٣B:qF" @9H@Ngy]elu9H2.B " @ @ @@ZnmfͲC5\l5ڵIqРA,:C9A @ v]qi&!q% @ @G`wBc+.fWK/BZ٣Ge7 ݻ[ڵ*ݦMQ(~G_%*TP9 A @ @ xl6#Xflʕ[oِ!C㩆;ٰa @ k;8'Ĩ~꫆cbg " @ @ @ @L26p@;ꨣԽkӧO'~CMd@Am]㿠 @ @rN;dvM:Ֆ.]j_|^97: @ @Xn]\],B&L@tIA @ 4o!d7>;;H @ @ @(jԨaƍN:֭[k]p&EWF~!UK5 @@ΝwVZxJN> @1>^ @ @ @ hܸ͜9l]wmڴ-Zdmڴ#G駟^)(wl1 @ FwB/c ;  @ ~](Bk0Q뮻Z2{h @ @ @ dۀlȐ!Yge-[6z{A1= @@<f'l?qDmּܹyx _B'@իm֬Yxb駟lvsjڵkgO??Z>)_mذ/_>G-[fUXs'|}BZ^zi֨QHaҥ^>a~9CZnuP:>TTɝv')4%ۭ],XPX͚5ݹv +>pι Wڵz"A @ @ ?پ^~ֽ{w;S;\3f؈#B 1ZY1쩣 @ t9^D )l8Ȇxwի Sm[_G}d~UV4h`T\9h[Ǥ!;M"-ٕ?"eI*mŊ7߸:d {Zߜ9s]vō={m޼9AMjӦO%jK˞?R0ɯS㎑Xο;ꫯleۭ|ѲZT~}/… ]\k 4hA׮aFN;ڻ){2}N֭DUVV\r<ܳX2Ø:K&d!=^KdU.A@6eʔׅSg73fX7Rz @ @ @ @'p-K/e?l0'ΘxX @ @`eH^Q#$4FJ-N:ti^J ͫƎК5k젃ʓm#iӦ9{Q) A} (D jq_|&Tn޽m;pTÇDXqoz7xzQ4n;<;   QFB:t)b~QƕW^鮫h $|yE)|?CvG:L @9Htҥڥ!@ @@w}|߾}s3fɑ3'zIs}wPf~ܳT6aه@Hź\+ "Mkc Rq„ -&@ @ @ @ $PbE=zr!hk={Z:u f&%f1ƌ @Yr… }m;["e˖$Y!\&0`zVZYvjժ&Z.q3f:]wvqǨymy&ſܪZjV~}>>rM4q_}ULB1.Ξ'."b]XϿ5jȼcd ~`eҤIO:0A̞{i?s-!>k #{I69XZʕ+袭GTw$a؇@.HfU.B@ Yb,|?֫Wڶm[HnA @ @ @ Mࠃ;>g>p@a1!qaG2&@ @%@ƍA-Z(?2&{mrF-a; -*ABzƍO?wƏҵk֬YֿO>ىIv֭@L'$sc9Q| 2 !IE r z(Z29\ׯ N4sԨQN3\9iڴs$ ({o @ @ @'pZfͬgϞwzOЮ];7ݾ}7H%@):B%2@ @@LggS(;ȅ *lSd@i^~6]q۷лwo?~ _Dl ӧmٲ>`g[jp6i$σN:9A=ʆe˖p IL#JI\zZߠAO?S)}%[ q;ֺt+,9%bK4V:/,ݼy+W@}t*DM޽@1$=>{I/z{E:x?ܳו0]C $*I_!@ 6֭CebYB2N<7N:ɤZN @ @ @ @Nn3`|ĉVyZ8 TTG` @ PbHoLI$lݺ^xWQZ4:)̖ZCX]r%nԷ~{B>&RmwSвeKgh|;`ڵlw/OU'!e]w)[va̔=zB@ $jQ&Fdg?4kyIHq@ @ @ @ P:y晁Ǐ7t < D1 P @YH@B J?ۥb@ GM:մ8k.bmݖ%.(%ӧls֧'G9`QC~!**SBWNε_JKT`2\q@ ;?ydpރs9n~o&L`Çq9| [n]f'+; zG;y #Q¶mڀ7y3[o_=/ 1pB;vxev:v嗝ꫯW_X@QSvnSN&ŋʫޟxՑd8H z3Xu~XkѢEƙ3g`z֭[gz7g$a~c={l?E]䮅AuS#teO%A6URm$/>v/_fITrʶv@"s>]}57o^ ^7[O][Lg6فΝ;>Uwx:|_['s*\p%@22e˞I{~=0>@& Ax'Pz)B^beD>@ @ @ @ P p; 81o~cu/#}֯_kL]v5 !\5jȭٽ;Ɍ7ξD:r JS[m}XPa۷wZymwvwqGJ9?~=sTT eeO}n'ǴMyL'ɋ~ʦS K}¸qO.pxw4- 彰`q&4a8˓]F<bc=+ Uʑx' iV^݉>I$3όVmtJīUVJ`;9)p𯄆 P49F+ mnfQ-9>yN,\8 |A2euQIr"F}y+Mby_~]wuN1Wd̙nSON8!8$֭[O%ҴiS{'L+8߯$(AF-ZҴ:={\g9ҽ[^9wD⃏=XܢE %V7X:u$:d9D;Jw=jU_B#MQY^{\LAWy:Wžҥv]k^Yf9ݻCwDߦE@B(`H @9@`Æ 9z!R]n.O>Y1m&+A'||ӦMqai @ ZTeY&Sݠ]D@vGmRh֬f#my睭L21'Ik .tVe {t/(8 ?-xQa.ʖ:\ .;ou1|8j<]vQLld'Q7_.eO-=Z>=Us,L|gy:B $*S왴GυsI!d;8CwuLRE஻JUU@@yӇ@@ ȹ @J]eCu9%N` 2؞_@ @(D=ض1Ɖ\(iVk>l7$ǵrd4i✀vAr4>r-HpvN$E%݋ E5ƢF ZKO?E:%suȁ_&);w &8T1 EԞ`V<]tUZ%ђ%K( b|"2Pڵkmҥ6bȕy睶뮻(K ;<),)Mƒr߇/:K/ >ruֹ/'= yF_N gqa!F 3nݺ Ç}Y9_IQhB¸o3}-[@￷5u-O:$8pZ )K1s=0b-DL ؅*uB *h~BsǚgD=،+,Ĩ2G@_\'h9 `#B @Hd7) ->˗;0m۶&{-^:^<-jժ*kJH-/p7,L?T7t}pR=|L*Ę.s߯Toe/ѷz 8ZjEm:{r 9N&޳iH{` \%ﺫLٲg=W- M$q[*9O ȼPb9:, @ @ @ @ HF+WѣG\P}b3H!@ oag.ݹb,їnuԱiӦق 쩧r9s8+zN$ JN; ;;;!aÆy 1ЫB 1'?>b}ZaT(V7oS6KKN&6l`n?ֳRhtZH$̞=@:Ȟ}Yӹ$*),]c ]ɋD^ywfhc"K 5-rsq{e˖q mڴ ^}ҴiӸZjEB\=N 1>IRJ&z9|`xt Hf͜ȂڕW^Fy_Ѫς5̏O>cڈ#L[&P~:矻| .4} ~ޯZO?[n}te˖wM;S{˗9SfS;5k֌lgr͉7Y;cX :."裏Luog}L$о}>Dz 6"D8G4@.<J @E9IVWZe/mܸѽм{N1zz!F}@ٲe3Z:g)C @@ ')j[n-d^.p7.{S/limlRw}P?ҥ=S 1z:XʕB^Qm}Qu]WX59w,[j VZvgo{g eNBN)\ve6|g'.kBZǐd-Sw2O9<J x]yto?FN?RH #b?bn?+bΞW^ ~헛@Vr>@2O@2,/# ' GB @ @t裏{VXaƍ39i$F!8\ Jx @(BagEc3Svyge Rrb۫W/֭IdjӦMN/] ֭k’mf'NL, {#m; HܴMs&x[۶m]?xs6mژXk~;m)0 ps=wkHXuk` 1C[%]z7%$(q~'W_}zmokժUMKwOSTܳ@<뮼}W44獔'^ko۝>@G lcbZzg;82Z @ @ @ @%W\dРAΩo@Paׯ/4/!@ %m5xzS~U$Ǖ~!]jj@ y$p嗛O4ɖ,YpSs 䌡$ ,*ȁ+R .O, JX$[[^tmJ$v6ړOASi"w{VO @ Gĺۧ{{H|HyM&!@ uʗ/Ty ^T\QJɓ'@1@AHۏ92Z(@@T^{mUQ@"E=f*Ucf%|[jk6@u< > eK?۴ic۷z96mZ?[O,_r=s7D  n&;]ߎ>h> ^=zn!=~clF k֬(I@i&>س>v{キ'o=a?o2zX`-] Ck*wC/sq`nn˕ϲxki *؅g3(m9R͂CHi5*j(QNV2z믛}r7)<iB֮]rF8N  .㠃r{[# @L ~6n vm8d+;>`ӻ9b{)~{[n;6m[Q iHV\$zWre''q:xqEO,.l\y%(WC"gƍ &䱣 sJytum^ 0hLW7Sw{V:uB  ĺۧ{{Hc|HyM6{xO~@@X?Gb_ђ至e˖1!# Z.\XXA Fa'7?idM@";1b'rJ~w: B<ι [Iʥ^EtС1xi!#M;('A(?SED oSq!^:8*QBl 'b PRH@Jkc?/|(-q9c=fk׎%K93޽m6:w<")[ /h}(_n?s>@%Vwߙ9r-b^yN?v}nݺQ[o-2jG8 ϟx 2e>߰aÔG͋伨gϞyKtoҤI.M ͛g|pæyw}ץy2is2Ñȥ͚5+{xLb̙uq֓@(؅E@q՛6mŽ Pb 6Yb]sĉMNlbsQ'\07,la>5ۿk#pΝ2: @8}?r@"IUl!$ݾ}{g}7LQke$T8h ?~]ve<VP!!8D"%vCN$_~eQv!bN8'o%ZC4[hcw}M2dHl;XumHhWs}o ,Wu% %^e6ۻz)(ꞕ$JX]yeV{u0@#}@ѓk-=(n@&Pre ߈S]?A _k׮NXJ\$@aR3hv2V)[lۡ@~ٴȞ4 Gx!Fg%ׯJ]guKӼh g(yzmw;z7ngm&K.$ϱ /Ў;8)<' N^pؓN:)+p±pP{M6O?~~_>larJhDǛ,d:/:I?FyS>ȥj*1 > 1躐8_RMf#G &T䎿'Ol^z@, y T(6|Ωe*ۤ.@%7O)d{_~Qͷl{bD2e4gNu;26~ O@,D R6  \$Ija;Fs)}X[oendmHNiĈ?!bȪS6,HG뮳_=wVTGqDud,={ȫJڲ%OeHվ#RVNb#fKyʋH[ 3\zOo3l껣 aU,Qw֘Tػϱwϣ% ?hc *_*Y1@.eUl3iK琾BV!a>ZEf Z,C=|- xgK.) @L@N 3B 3<3raR!brpRL|tN@9Hg\ɤ(L|ʕ+-'t(  cƌs9B.ͱ}H 7Kp$Saծi9VL%ڕ1zl!PzȾO65l9m9HH$O O !A 'NtXmƎ[@+LJ"Q(w{ H*#n P˗ʓᯝ; ۗ 0Ι3's9P5jwIV.]cO<񄅝_ &{|&[vy9oYx<"_9j&Mv}w''W=HUb*TC/g_[)y9={͛7h.'E b{>X=6 G] $dƛ itc,f2rteٝwit$J S HG8 ə5/y6uBM>H(ۨO? 3 &9*Uw==Ϛ5oHvB+. 9EFGn'l뻧5Z `#\.c zvV@E[hQF.Vmg l%wtG$m|M}Ҋ+u뺭~=޹ت_gA{V.wUϲ7nlkgWIG5} ۷,qKH~[ʴj?p{ dMycHj֨Q#H *@%Ĩr %=Z۩wOWcy szp-eTܳ= 8r@Q2i˞){\9w@6]1JVFJ/ZZL  @ @ @ @# r< M`sb,9 @ XSz:~y睃8@<MȉH瞳wylj0!<`?p8C=]Vr"3fdc̃;HxѨX}aۊ+:N8O>qUEr>oqlwnM4qMxn+۝SKQr#Ԃ^zG,~ PTsb=z;w{gҧOxI=IÇ;?0jöiӦA7tϚ9s=NQyUWE,ۥK'+a>˞z)_0aI1!&9qQN\=#7]"r/gS: >}T 2ȉMɹT-[nI0CժUH% @ @H г淯Tc-ʕs9q6cdBq"+ @ @ 1VVd~.SbSLIP[li}wqNDQ7oa]cu-8ܹsg+_|f:uHԞEl#T۝Gj8$ 1ˤ; Ew>޳u@i'˺Lٲg_@*lݺ5LcM-Y=jz-Yg4 @ @ @ @ DSNqNdW|V @p> @@Xv/nkkB5k,ֶi ,͛ow Zr(Dt?hJ^$0Q~1y뭷V)!LXڕ>C"Tg>담 .{u'бcǘպO?4Ord}E~%RTtMv0;@QFLH#W_}e-2 J4x=jС=E߹zEj@ZJgu"ųfͲZj9aۢl6mD$/q-J>\;A}*#Ցx/ᗄ7l`/o6;է P`1׏[D \pKC=KV@ @ 96~駭unaذa&'ՇvX5WLכ6m*ο#SdCM @ @-첋@fTϞ= ؄E 5.[8͛lҥ.WB 4:uYMQ6TEVC DdӮOlٲI hѢVQ2([hNzpZwi$v}ϑJ=~&kLs<qeۚH޳Fj4T̄-΄=3[@HBM<9Hb] @ @ @ @@ wyS1cBE3zׯ__tfr@ @9G@}!v1Ί(${'ϒzss\UT}rsH KOxc^VoժUk׮GM^u)tHvrNf,n5k}G m۶M8 @ @rrzM738ϟoONw([kbn !c!p8@ @(Blػ& [Dn@ػQ)! [vu<)F%J)7ԩS]j5C͗]@ @ @ @ T#VZٳ?yᐼ^~+"'!@ \$blРA.!c}F1ci(&'N4} gyuQ  @8cʕO, @ @( `'O{VXDGv(ʕsmlٲ%m@t1Fg@ @@I'W_Cc=8@ N/_j/~=?sZ @~a!ƲeXĜ=w2˶n:c=⁒; @ @ @ @ ; Ǝkw}wvt,K{O @ C X~%g`02M@%g3{L9R* @(n 16ejժvap@ @ @ @ {OD3MfGuT*!52*@ x-Qs=8 .6lc5j(9 ͛>@@6lh~ˮ5>H @ bZ Z\9a zBio/\rM<}[d 4ȮڴuF-[ *.@x!Ƣy @ PR^~'7 a1s48`,B 1Ncݻ[CGB@i$`[vmWXv}w^z;˿/}'r/>#OZj&;wʕ+t_uFM6 #EIF*DSʕ+mwe˖1mƍVvmW+_۷~[d]wׯ-[̼sY1m"_~~:u؎;?-^RJ^{%HaŊ6k,[p5nڴi㮓#ʣRT/eSrhyɩqn:?KnҤIJ K.>OG[-[61JΪU[֭;{lۼys7# >y +kѢ~?kժ\uUvmGa/RFP-mwέ~vivwg?vˇ#ЧO'Ĩq A~?g& <>]f5Owٚ .9?Gʩhs,]Kd7G.# )9qaAFiZ`OvǺt <гgOok'Gݪ p ǡ|Wgby뭷C Z5jTغYfvY*8 %}ڵI2 GZp<L@Q?hHԞgmȑ#MB?XcXʐ@.裏SN>^y֫Wρ=?T zؖ-[/wώ㫯7l`|? %X%KD\ƺ󩞧zmǏX;xVb >_=j={뾙[=JBo6 oF 9EC[n$?yK-@&@*kD\ 1\s hhw6֭+T==ȝbD' ]t{='!́t9F#zj?%<T@$\%2;lc}//o^h\N\$̘fC\6mj]xGSOl!QOet4^b ~" :#㈯6rC @ d3lxKμ8w~J'r}GyLnkm) 2$:͔mֲs1!kYpaOD<0X+ +Vt~'yS9t8kT8ۦ%  >ܴNK./T;C1TKvVZ'?=1Ϗ(IeN26se՟w]2sDK_- @ d\`FSC ,^sک @ naձ&yZ%NQF>" ㎶^{M6W_}?NPbvuW' x:u"0auYo9dzr_ٳMX IQss̱-[Cy/vbJ/'c ;{キ%'MkF˱nxoq㖀Bݺu*9HZr=#v9y4i vjH@pĉn.R: Il^2 va֪U+^s[t^|E\+1jl˗//P_/&RLAi'Gο>C;ꨣ,,_pE|b>][}gW3յvۅD]Xw8O@Т -R 0J^ H$K!4!d5F;~G%0i${駣_ ׯ/sI'dzfmm۶m]?xwޱ>]7o=#_`_$EA$TZ5q:GYx3Hs*wZ߾}ݻf__dcm'RDrmAu&罼/w/u'^ܧre37h=ض\~0xN@IDAT@ @ k2n%y8U߽Dϑ/;?O"+VC51 ^_޿ovp7tazYhذae+c*[\}du]h=iuS*!!̞Z@ –YcH2L2'se6K:T]ɜ'B͊2mD"c$*A @ Ôj!ƙ3gիU &UT)5J6m8q~0?~s(={v؞wqvi~7_|a}qƫr /p,?(2Qs6Y">>H؇@(^ZHছnrٖ.]j|AaE>v뭷:ƺu:AB =z+2HBǎݾ[ "4viБ첋㎮ ^XPb{%ڕ FIRNy :O'OvUi_t[B~ :t^zGv}>xAXX))-``b?x݌Hb/r42j%KlѢE> [@ @IBwzS|*Ǐ:thD=a>xaE (Dr|2F\j+sGqbvmgv͝;Cꫯ6 X;2/nk.otw!@D5Mfk׮MSK]-B}}v3fs=_Q^ݺuKy<@W{ i(7ƛs鞓2ZI橧\<bVzJQAű~/v@ ^2K,풼;e2= @%yfG^J @ @?J)Pb˕+gGyd@6秌D{1WgҀȰ;_v˖-o]KtEhm֬Y?U{ ~wS*Vh\roOkM6u^s5yګA8S.] jdzBpO+˅e[^zuk1w0JLv5kf5 DAZ8/q@ :9/W\=S#7p+#pxLS??S8[ȑ#]}#FpaÆ~Uf76-Y~}r /q5L?|ӽ9 aO?t?~mSO=5g*GÊSAUרQ"6/_~ywy˃>hk֬ /ЍU" ɟ~ }َΑD%t9~# Eߒ'ito?w[ha}50ZY?s']xGe'@& HQHs Ն~c rFw%R-_I lxpvj(7wxTT.RWD=O*o;埙5@?]?C/{5w4|pw?-һꪫs~^vmZ`?^zgʕ+{xYgK/T 41$;i$;裭z֤IWvٲeD^ 4wkժ5'x-D^:hWusT;t`o"vÆ vw,TV">3l<nj4n9>ݻi4RH>{N51K9.2~(0_®uaϫz%gU<@N$Ě6mD%(B%2b&~s5 ߿$"E9ƛs霓0'tSl„ .cd;dS#dܔy!F3>AcܛU @ @ n|R흓Kt5g+V:DxISkۼu]:u>-ZH!6)2dzh.bZ2]zׯ_?mXCFKdz5җxRx_7|skD6 Z[kG80`@O!m'>!/mcYH<rcW_mҚ4Bx!Fue# dpew˄O!|s}i^?d.D鳟#]*@KA6ͅ @ @RK@}>/i!5I|rhd׊oKl@70U^9MU>}z\P/(,3gab( 1JHRO 8p<Okq'wKcK|BFBrE=7*>C#6NTÆ 209~$] 8WL2NHSm*4 QEo:p{fWz$pY NWbŽ{=K߶qƅ\\A%7;xJPI 1S35FJRUXSyڈ$fA*k۾sÙ߽{Zk{M<4#x\/; >Qc"`C<[oh6< 6,+"31c)7cw8e[wuh5gx+#qYg:{LJ"JLk g8\7ԩz7j(/ µoE /~{F:Y33n"Rllfv8\r@?Qd" " m X80ga2h{T\,y0֜D#"_F]o.3g8qC,o:w|IH>z] -`8go7L*@(Ag$f>8O?t8@@Ќ6D܂7|^;#GШ"na= TdbyŨQ ķz팷v8p%.;D(lʔ)~$w# FvA;/bvBNŨN<ًѨ~wڴi1H3fpӧOi:thxVԙ,KVns=ztDZpr饗y^`Hz"nÇ紕,%8Ek9wM0va*2s6m6Y8L&El= 239^1Z@2V$nַ,楝wgqFnZ#h ݤkP?d_b}喋SjUA:s<NdmYQCV>h>m-2TJ3wҖ^NTg= 3X]e`ZL;91N+vmsW:<״^4670ggcy-yϜ ]y~K4?Yc5W,DY3%m2܌q4츖%`B9.IRV6gJ]Dʹ4ijqv[Djޔ^ߌǹigoϒgk#K.fYy)pZ@Nh[6cs֡:m۪" " ".@*fJ!VU/4̙N_~bٳݻ?B}8۷oT&h"$ci1 ޘj1qTE#xF¬Ӧ~ AĴ0c{F}gA<873ƶ]K&0I[yegKC؎ 1e6خ% W"JS" "~xMg B:Ÿwy{ #WD|хO>'# aDx[2 UL*fp f(&^đn:xD*l>軬Xp믿~`U=`W_} gD&W_&?Y8X>}#B4<0@{iy!#<ҋDO5"klI L e^=y}!c=#\cp`(#&(uhvJՇy 0#7?qy'01a+Q7)V8gN[6nDpɄ؍6'o 6m,KtlT[ "娣}AKGD6&#l#8@ݴم pn&/NGP|47v Sy筭4zu =>o;N]^Qi E}?L}C)jV[m嘸$$꣼r)ƙgƈ#yH=߯~֙y-W}] ٘8cy#N^>loOgMG4jY @hBT[~GH#hLD 93Mtȑ><:]+=ǡNZ _zr*&m[@#^ *&gך:ĉf~[mƾ/p_jR@T֙(Olleb"ت" " " " " " " " MJR}+>ޙA}~Q+Uk>(ڮɘ[CǘTy/=4s -eNv.#8bƛ2>r뭷Aov2z5_ JF" " " " " " " "B9}}uD-!&ʅ4wq> ~;I{gxk (Dm>lm)7vÙH N}2Doa,aÆ#F>8? |(B,]vY&E'Ab&λFiej!I'9q? w3%X5<`OD@ԩ-fL6A0+bg̘N 㻂wN;} l~\YtukFˌuDkw+wi)s\Z0/"Z\pK&l6sMf Ə,W "xu;3I]Z]vE똄ڞ[j,9/HHN:9s[|#hBaSHc{7| -"h/}lSߊ PA-mV+ŷ%"e\sM$8-/,Ǚ`X].KΑ+hz¼Ͳkx-Ei휶r_1lamű6;6YZ@h7}󜍖)H`sz;#BQpĩ_ҖAB9mQ|&| f|t-׶ x# x'VMήQ~v eNZ'F!9U6uF&͘Orxֲ}Qb@<[i@Z6X|)FGE@D@E92h[i͸JGikvgT+rYZc6)2ďe=߿w>3?駟f3WK:ϕg-o0%n< J{0c;qD7sQ{Fe3dM;."| Ʊ= yÑc+5݈cM/N.5!Xf2f\9*9Y^bcۆt<˸k@ P(f?Ny/J>m4?3<<]/4G L2}Ay D@D@D@K *~T ~ɦO^@]ǫ *S" @[r1pNA #jD@D@DԩSD!u];.%أGb}ɶ ؠ"%1B"D?c _~w,Ftšs~I / Ycx1FUBfŠl^? \T);vuQ׿fD`D +f{gi>qj>a +9DIGuM16kj3mnbmbL]"P 4!F{;r?fϨJ kC|~ap@_92@(rر~ׁ {X)C(/B}|uay.ce|^ў?g?דCD "^Rh0D`>lPFΜ#n"_n !V;QF;[r}5f&dfn8lf#p;GJs9 ŌwYT00@P,~~g dWTmsU8?8Cr)KSxלW 7SO=]qDKa4y&4m-|"w NB{g 8T@6~\]+='i,4M6k98>ѧDIN}X%'G[&BV 13Ʒ񜌊!Z\={mȴ]b<-J S/.br&df.&"d}Y|yaZ=[>ޗN^{̈,Ӟ Q7nOQM(ڮw5f3By3Ckۤg-Rˤ\I+kyK=㡏 |GF[8G(z,zش,J+N1'xtMSO=~s 127KV;Q_5xծd:@̹!tq3~ݖT}=m"2t,joJ[nYGYYkt^yNӮ#y`/cU!t*CoO&" " "P>s= )" " "  ,[v!F~"}ת СC[@p};#pZN81_2e)M~aOp[ZZz' Ĉε}]RÇJlf7vTa>:s>.f oe70rMq _ޏBGߖ㜴 $ޖ8s]w僚cg\o+ա7lRꕀ93Qz#1sϻ3Y&{ij?[on9mE< +:pp=}5N3\r%~L9+zrNl[mB`aLpa+?~>}Dxi6+1GXI(1*Vme.&k[2Z@S=Xhno)c;5Ƶp-!ĈXWLS4lu3iG(ei5a|C/L~Vr.ofuh}04y&m-S|cp_x~Qiʾ_^=օж@cKaxn5j=ztM;8mRޣB<f?u? <-NX"$ckַ$7|YX]Ջi'ҥ*wu8K:P%WYʲԙJXxe\:Y%}g/R-·)09H^7{l(;`2K D/ uț&li;NY`fm[Kdh˳o?fΜE L=X:iGah[9\c+>_$i8G#ml/ (^EM&F sTn#Zgn,+6`Kr҆hVO6,OZT@5V}3WA}~wvJ\#Xw5fvNat~G 1vN0=:4KK,RÄ_<yt B _*ʹǯ~+@p>0]v Ƿ& oŠbSO=3 BP6!1 Ϲ([o__ߴ'q$t"mV~iL^&gǵ' ~ H }k0UBqE͠/Āx&řX0GL]뮻:Y_h<_e%X-WaJ{pXL|& 6o싳'+4/=cXhR ." g텆yvO4 02ZĜqJE]iĈ-s1gu3gϤbLyRX7"\ԡ.RGN:)q.)!k[˪xFO߸_~h׺J$@[Q9fE=;>j|9~I=wx*{챇hQb׋}[!Zg"CG;faWhIħ-C)vi :x!HK}Ќu:SaZYiL_neX)}die]_w 7bCmڣ8m((6E 7 `tMwx#K?k3{X&" ,M殺*wE: ֻG}3駟vLDbgɗm֪ mr\w}wHQaqe"("mzפcX" " %Pl>FeϪEٷW۬㝓s+Y>cVF}~Djvg޹ƘMuNaT֣,_ K<<wzgIf-Zk\zvFäZyZ>lz4?[~ k[>6ӟ\BLG]_Yݺu O`>UZh*\ߗYqB&P)Vz{G?N='i[K<'7. &30jl`^?\D@Dz>*Zz饫wrID@*DW(y%+"@S 12{i8p`F." "Q tma=Pw;8# O,NMc%VZiVB:u E`*;oܠS[o-K-m캰n#bd,VM(x%bhSN E,NXeرIj7l1Dhs5;ۤE>zK X Gdgmlᆎ<02Q8ے:,FDRl]q[͊ŏGXs2@]D;0_{&X e2#l3i re{ >lé0#ԘY:E0핹t-" u]ɚ!"֡CzQ;þ$[ĉ}$WagϞI4Xe~#Z3cƌĢv aK;2϶Dhp[:v3"k^_D 9b Sx8hH9ߦ@ ~_ibÇwsNaVžD%̟xÎYظ07."R^q}1b>NSgz#MgwOmcLt‚{b}s׮]\oㅖ%Չ9WHa>-yo$ m 1@XB?КTꫯ?|߮}Yg[ jS=3ѣ3Lȴ7jyQ69.M^;{׼xj-4D\FӦMI!> aӧYfyA-ҩ+""~xF\<7ŰITn={z2!Rf +2?obdo6 L$hy+ƙsq#]#3fsw@I&3s8h믿r %Aq83…ǖYfpGWmF<'dAxvce+Ƅvزp׿.q_;tM*Ʊd>PV\qE"+BщBVfQb i[D@ .."_\u]\fhZz9--9:!Fû{Wԗ^z饰X# YbëaYZcD@Ꟁ}Ӿӡ_|B1su/E,W^>ȑ#ɓcbGGZZc籤>szQ2&SOExSNoڜX3IJ;^YͶ7}Y Vlo퓉ELP| ,yo4m2"3*ͬ ζ}$CZNaRE -*]׸옅- whMkrmza~/ m6lXyiW+5;mޚ-3d" "PH@c T[2}#"HԯiezHk5'I۽QiWS6J%%ʧ4VZ/T3f;3ScU}>i;BykQ69'zıc6.L}/mhs)|uPy'T,}Ǿ@,H)JRQ=a*z%." "МXRo؜Tj&xDT 4}~YJݪϯ_xhm~ DžF属)9yi]^?cƌJg=u؇~RK-:$>Vs;qal_,U5ZI#H0/e#Fp}Ok;o_ 1Zwr3#eU<נe۳k@#R+ghf?nekfY<kk"Z_o∀0m}'0n8w'6~AT0|__z,ź+|F%/" 'ЫW/gD@(6sl,f 1tw!4FbZE@D@J@B9^k@}uL(`"BP"8gW_vi6؏-m&Gz>,+‹Z#oV&c};,fg>0 6cY8۠/½;m%|A(*316wߍ9v|pxk|s=o3LD@D-?]z)_I\x}nȑmO>A+Nh7v7oO4 2b¨R8>3wq%ZDGO@ 7LD PőmRB\sn핡e{{b0a.q%Y}"7-iHFq}yQ>gSY#Z̨cU;-n-qio_= *&~VoV<_6uf\n`oy=gnFĺw^Tm@x`-]7]'" ".]䑌 P 崥Q*Y}~Jb1GSlg46}^1xiֳ?90Mޫ'2>}{뭷r-sA _Rg/Iy+[wo E,A983pV{t5>Md# !ڱיEh,s=\yhyx_J:*"Pԯ+Wz}4n328*R%Z)"oY3065TE@D@C ˁf?]g,4Kdw@IDAT" K/'ukx!͜9ӗƤRXMB8`4߾M?śG3yQ;ꨣ$O>V[- B~c@E!uI'95`XD+a&ޅd 3駟]֎F\ʖ8I2&*i-$+R,HA@_Mݔ)SwݭaX[o#Ը^8 q`# ÎcX´ltA~g4bԔ\p:Or^ <8VС8zhGx~y[pyPz"70dƌތwŹaꪫڡ.yva^]ijW~߻]w !>Ǎ~>-__[m?sA.osXK{.Cy=I!J&וcz9L =&`LNپU߅^EMN=ËjW^Ed6&O9Ұxp eһyuGz1F{3y̘1TKL)qE{Ny61Dm޹f_ %Zb%lwwM7uwqގQ֭[W=LXr NS̶zkޣ>vm&>L];3b's4 kkN8qM37᳸ @O݁8V"8Ouz[m6SDђ:u5`6/h[mcw&N;{9_}d#ٗDZXnlt,=Ӿwu^c͒,Nșߺ|b{o>OPəȺ5TYgyW={l+￿G?9k(HQmK땲Riw,z.o=ATM^ۻt\MT֙Rk_f\O ̚5+ D_L{5$)4hEq6Ձߠ?'FD@D@Dh㧏A&D}+kbcͤH}~Qzvg4dc'P8>4>z<f)C]^Ɔv9N0,W8ju];vlc :4Z-`0NJ0! L{-0W+`X סТς@aVDznBe-~਽vSc 0]@&o$FZ,O BfZѰO ~8 K/ &znkxwmF`x ׍w0i%XX^%@ȱ%j[-n,gLi>!wܱen įZ vx RtS-떵ZA^xqᨖAZ1`w;0|B-%iSF۪tKXiP]o/L U! Ǻ욗Z-\>Fi\=ϻ|E {a•@+ : mb\\`iR'.l0i΅G\3zɹn2<6,xeY⁳\856Yz]  +\ &\;H7>r I}/ &O`fqǻe% Pu Fq  K t `?~c?ܝp nG&p0+d_<̊^r9q.@% : K4 wGZ(N` 6p7p8~ DٳagwbM[mg#`–\pAG}9NO>?I?,pS]wg@xM| X)[gw ,V7n DH\0}012Drm 2=,Ig^}Ta"@htPLTy:oul`` `>ݚkϯJw|׮]6,pP;ܠ;6p%.{ՇNLy,:7|O}ǟY0wiۥ@r; D`[o*h t&@==ahl97?jux{ [6@[y] cΜVv}wYlq_ 3iҤm[}MQ6<˷syuX:rSj#Zg駟v/ Yr0}20yX,54iKrVgōrJ>$6xh.8;ʘU{x<-KS^s ,O%ʻ̋{,hw8d1͸[#3裏s=m' -C)+$we .fLk5/믿N"Gǯg~~SJ" h,s):qq}Ywr!"@uzYS޴UeysiEk]%`~ |@D@D@D@D@D@D@D@DSW_S%d%΁V0TJSDy >p  >6q{q @9x2󼸗_~yRKUaDGzYӟ;^(.tTߟ} Y!Hj ~\E"ԇ n߾} !r3AZީUJ8. ~IuH M ȷMCr,-g^a^ܳf>"0$NWXav37z*騎'͎Cc#G,*ʇC8w~]D_z)'x/b\夣05 */rnKZ̙HCsN:{L1b#W_ BK,ӧԩSGnڴi^04o)7hC,\feN-mT ` |Ҟ*_嶋F4~r&" "P 3&:$'P]G?OPgɹ*I6fsv[Xّof#ehA~(T8OVj'n5ITZhԢL0aD!(*T[JXZ=nINkXv"4͡fRb" "  Pa`L w lD@:0 7|_~/I°ݺus[mUvdM gZc4馭39W^q晶u4e^NN<1_}׶e,̟}Q1uZvh,s;t&t_N*@uz=Pi8M;i,ysr*!0{l9h$_iʫ8" " " " " " " "PKqxzڅXC 1zaY%Њ@=z/vmMUq2dH >k6U\EHO@SD@D@I@ujֹD@D@ޑtW X`_I&u&(>S[RD@hf+o " "  E`̙Gy۷[ve*٨#e" " " " " " " " "Б4[X#ݫ*TnOZg"w_/H^GY/lbw<#!`;tyU8$z~s^wZD@D ͨrqyގs]U$'wXiX!9sɓ' w%C" " "^z%w7*n*"%'E&?b%vZr'" " %:quyl" " C@ƹVʩtt;wv뭷[o[n^vץK0 cad" "P@}5[y]wh rkiii#u?0̙S("" " " " " " " "A4[Xܦ*Tn[g"V\qE?r<{ꩧ\e}WVjC OB:@ _y:$%6^vat(@YBݺu++jX!F}nGKhjmѣG*묳Nx_f+oGGU6,XJ!EQ!FkI,8|E/uԆ@cmr@e _YJ]D@D@PQj#2~xiw뮻nZD@D@D@D@D@D@D@D b;CHlMhfkOV8Πr'" "Њ@#Fpܢ.*_hM@u<%" B`WtOp]+" " " " " Ans}!C#uKb\dE8ʚtL={k~򓟸=z8rphgo׷o_[oK%\MXv|ǖZj)ץK>{l/u?vzrLŕG?[|K/:u3c{vѶ 矻g}oay-\({V-[OM8veZFӍ&4[.{ݜ9sl/w^˺^RݓO>}Q߻uY4ꔚK/&yVh}QxӾ /3<؀N5k{G=DA~gРAm͹qUVY%TyGa?V4 ;dw)Y3fg}yWL" " " " " " " ev7wwy>}`.+.hw7ֲZh+D@D@D@D@D@l[D ?7tS (1.5:$;{c8r aiӦٹKeYꢧΘ1<7֍qʌW^l\BpQƫ32vٌ.E]n/͸J37ߴ`e/w1k7.z^댽>s=?J+9k#wP, gQxIp,yN;v0d.H>}Jy.|Y}}ؼۉ_u7uTMwMN/Y~v.-E 8;]pms=n-h_;D@D@f-LtِBO="m馎ʳLD@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D~ xg>{Wr&4 73]D@D@D@D@ 7fEt!etgR,#?=_j'w饗Wlg 8{}pp}D  '^wun=A~+u] eTy;w?Ǥ[{dV XÆn*Hkex~Vi;/xСm¤ҍcN8W({!I&EN'xw(In-D 0z76,܍/:,w1f;vƩ̾꫒p,acN6l?FN;4Lrᄏꪫl_9x-tǏҺ@ 3ز§ŠvGg'#Ĉ?#mղyXwmsd%_;'Ǎ78k/'PqG;Cmrrgl:>_nbvc vanÒ⫈!skx7O?ygˮ]z6x; ъ9mz.µ;Co!ȚĘt(sN +" "PM'h`]8IuJ2Hgؔ)S2u 6OmUK $>.ٮ,2 FTm1B4h[`|; +NpQ(hǹCϞ=m3v\nԨQDrcRofΜ=zbL0GLgO<'!klv-rS D^BaBҥիC4+ksF;'fשS'ww{Dq&8V(矇NG?j%tɻl>RK-0y)#[]27k֬0NN`}" N01y>aoƝ{w$109j묳{]\믿;gyTpu2M` w q~{7\sү_?^k [oiraB#6kmƅQ_><Ƀm-:Vh@ໄ?@_t64O?3o99:c9*&uXٳ*uJ@ɬ"pv-E +ZK}u]Զj+?Vxw2CctsO׭[7W)- D=CcJZ}6ltW]ub-ڄۑe_W"Lu!; _^z~v e?0.a:B#F{o_mv>w=PVsό{[{ĉmw%s.&MsE F2"Ny;Ȓ7d/),wPX^ԩS9YsdǾ{L&}WZgJH" " " " m oO}g Y'pc۷r|dQ!0ppo'h]Ou?c 1f^QgQ'SV " qh2e?taO8ܝV,n%nj!Gz8u7n sPvB鄉^{R!j-wmyq{wA>{7= g&}X2L[ /75ҥNQ.r;/GƁƐ!CZc; 4(V8_锆@y\tMz{+/A/:^a>hwOE@D@D@D@D@D@D@*D?L$߽{w`L@-ǥdB M7=q71U}~c,>ߏoS<#SO9ƅs ꫯ_|jÄ?3'IޞylZZ7>{l&Ў!B IO"t0/~ wǧJ_D@D@D@D@0!ƹ+vsNqaE*p +SNu}p-~Μ9MH@E$0sL7qD^z5X1 RG::,*+"С|?ՙgSwǧE ϱ2˸>ܟe(Kˉ˵2K˜7ʇQFp?Ozף]tQFon‹?vsl\%M8i)D૯rwwKǎg+Mve{~򓟸5\tAwߍ7k, ')8r衇UW];j8V)e}V[-nmqW_}u(aq3vX[o{史8^(tka^#IΟtyg{^W^yoK.$=2b'pww^ׅ}ׇ>/Y9υӠ>ؿ nv!]g?+_WUo햕8}+Eaջwoo}%~;m==wuPD@D@D@D@D@D@:8qHr-e'`_|E2ѾʜMT"lve/Vs*}JR8?nQo9kQ||uQ~'t7tS.FA4;j+ƘoƯ7?/_}_1c?c0߭Jf^Zs#4hPHmV׬ƥo3SLq_ux}8w¶ bq1BD j.Ǻ ]Ƴ31V{<|_z%norvpv2e?c;餓|m_t'Ħeg\ӌ3::^+gX0w=3x.#L9E@]yd,H6u]y^&D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@:^u? iڴi!r>ߜ|wrLILD@D@D@D@D1\;"V"N 22{JAD (p^8Q5 O?m].g"<7p& x;0iC/5ʣ 0VOky ,dsc==a8[lXX;LXf2:N`VYeŻ/sYk|]wyΝn_.``uu1QӧOw<:KKx G8lq],q qNCXK. {1FF?Cȶki/Dv۳iO)]t?(hl0}mUKkʘ#83p;s.vqGǸc3)t-s|chwe,ĉ[laA;iѶg뭷L%cij[oF\4hLq7LX-Ϲk17T"Le3^tM[%OFSgw}_9!I b- 73fw/B泆 cq;y4Vqck6}kx7 !gƳ/r[Ok٘|i1>Lg@2Чܳg6A 7~7?sZz#@= [lgm1jCwAnzW" " " " " " " " " " " " " " " " I Dzl \O0)C&" " " " "0{w$Ęb@+tKܑ#GI&I w &lN wVhNJbF\Sv9&%ᅨ٪j~iwjtÎY1\FL:N\*akO6DӶ2Q>۾JUlNgyw0*Ny< EL/pڄ\xg}y4ę@18x +^?SD㙿{xƟg^?8d9{@G}zv 1<-5|$l.qpꫯzgMѾJ9HJ1`` &"PO׮]ԩS]vR:wYfcк`Aώ^oaڸ1V,MؒBl3Nqd&G 5N2ysD -~lیxD ;Lpj_n?'|3B8xo?1Us|?뮅Yδ͘o3A`Ɛ۾2W̥^{d"a<;N:v￿|>9~ cKKKx!" Baa^|gs5Kf>k=ZD ?H61]D@D@Fo-y.:ԘS4):Fd"7qΫUz" " G@uƻfʱ@xw?)sX(Ċf6&0`?Ys1gKE%G`ʔ)>nXGu+DNM3IW^eSy Xxᅛ.!0|SO=qpADgmVf̙+{WaÆ#Fq!bwfL-\Ł "N$~{p>棾NBa N\Bk;8#t3fpK-Tq9ms5wKQFy{Կ>}xA@s6p82e^@IDATiQI9Gf]+Çbw\Oj3S ?38ČSdk½k=3.S2dKN]ve޹w_ww?\833!.~XvOFj,Lw3qQGvgp-mи_@@{|߬ WD -*mTūЮ|С~8 AO+C`EqWD+s&h4FѮ+"  4j)EHD@D@6x|w&_M?-"ZJѪD+B)i(Ki23F-dB5HiSUZי9qg߿x|s=nV+p~%n L)S(fku{I:T 1vђQ6fI1՝X|%?0]w6n.۴icp}$Ε-ֱcG o.fz6<%2"T5 }HRBi? Wf$K*Vh}.a}`ȴ{>tIxK.n]f^~]\֫WGZsa@|.eߍ>OfMs moלstb{3f̰s$ MӟmizV2ŋ-A f8ӵkנ咕kHטѣG۴t.+OAFce2Cm&YOe˖ҹ{s餓N2 g/xE2p \bŊ<Z\-{D^7l/nTLi,;y !F$&Y{ٿo"igH5i~+^Q},GblڵFbPjWJ,魺_R̝^ V Zs\@PUK]syu7@}k U @ &{ywޑ+f4X]werBꉎc @ @X`o~FB( LVXъ|?FcNԜx}ٮI/F֯LeQ1aZ֭رc_$_Ǐou" [VpϞ=̹\JJs+LN1+< WO,D$XݸڶmkkC>ӦM3_|=3y9IY:Ro\~E |Eȉk[[B+zj/xƿhŁmIGb g 1:1Ps-*x> P a+Wyg\MwЄ8&i@ .BSzLv!@9M?]v^i @Hm+<hGN @ W F<@@\Pkʞ5kf+QRW>WM);gY8 q//cT &9{̶m*K@ Eaĉfݺu\pRLQsZMuWG%C@:o<3rH+*i&ӧO' V3+8c Nz& KPO"2qfܽ{cҥsF_߿?ќ *IVL;\=z= H{_'SWȴm<-sDקNjnxUT,+4ǯiӦ?`"@ۻw| T@?3+ ԉ8`R @(X> @'@y@@P`}0@@$!@My\b,[B߃ (T*T@Hc@ a2gÒG 1J،Ǖ M|ꩧ}Q,@X7(@7.*!p'Y ǺM\h@`,mtX/۷o_O + ;s=gPa/A]=Nx1ԄsWNbTzgۖJ+qi2dkt0M@"S3= \''b 6Be 2p7lzP ZȗkRb|l2CDylcq#t*;^\ UGOܝݺ[L-o&ӦM{Jaɒ%{DNP;4=M_T.1V' >g1GuG}իWc` \i ҤIF9#YR" zH;mPG8  R Y BC@ů|Nw^h@r@R?>N8dXYfYZJ Of͚ℶp#?VZv Ml,]ӊEJ,NhѢA}=GIQ>Zb2e}&L6߿׽E0et;btyN1^: /LF 6L/[HhU~ 6|{ D>lL5j'ĨL ԩ|}zkPAD)mL + @ BN@(ׯoG_ʌdGuWd׮]^Df Ę @ @Hؼy.2O P/2Vzwėⵝ;wZ!u]nڴ)j|"=z Z[6m grʕY P`DlPFf{ĉrY @ s=n> @ g hRQ3w_β`b!Pti3k֬Xv, @ @H:F?ݻDFm۶%YB @YF_7d +~ '&{/E. Nճ Ձ7xhRhv#Fwy% &$K1_*+A6m;vQ#g~6m={VpRZreAv):;vh? f[~/]n]BH)pT -*Dku]^IQFɒ%ʕ+g}f+'!;#< %(KbR%xW}̛oig_bL4_4VL]O2Lԯ_Pn ĘArHN8#:.UVϘ15jȊ)Clld 0vXtHE&o߾V|g5+4͛7XG z1$R;,N Κ5<5Hƍn߾}PFmYO?CvDݝgMj?f &s9gS>2cC 9"Hyt>dCHt7SN1~? 2m۶F~M4SZ>^?_?'Po3ߴiS?4ޜhqyԨQw 1ꙬkW1tmO_yѣb7/OyL]^|E;N$Vi?4l0=@  h.,^1!8i$}){#41cO9} 0x@H#@PP]w]CY hѢ?L%}0@ @@* h!6V(~ٲe  @!ÇF{ 7xi!crR !<6lN*]|cZhѠUjRS nsO<񄝨C-%#O>$T/_B?X2.=1\"sPN++e˖IUV5 d| veڴij.h=jC׭[,2=w=|NTO| F$ DQҙsB 40 8Ѥ/IΥ^jBM<%zI'YCV0b 4&:vjogX^>l&+G]rйg)#Q@#}y`W S7?ׯ "T}`>MKpvX#_xb @$zWn[A.]={(2X6BBk  @ \! #F_VB *lKς# VZ#GZm_IN~F~+W4'㫯j g3ӧO"1oK,?m)\o/TN:W~gO$y 6cƌ<} )}%(/'j4yѴys876.7,el(Kԇ_׿|}ufV^m$WzuŋvC0Ԙ>6S~zh^Dݮ];lFٳg>~CxG}U@]weȿ[sE%y(tr<_l. Zu,6\r7oin|׭[g4@`<@ C4I2ݧ㱬bd9M@i~x> @ @@~τ@ @H-&Mx ^F%Ww,!@ ؾ}ywlG=`/IЭ`C {)SΊ)b +t'1tmD#ĨhrիW~46}&jbč$?؏g =#Foz}T&>tvE ӽ{w駟nEƒ#YֱWЋqىǙ9h7AW^iG|S")C=d.~V^2ӧO]/یxVXtOW *A*Mm(`Lz6_}Ц%'yN?xwNH$Q򭖏b$93?eˬOԭ[TT]7p0$,kժ1cf &xq73i$o_q=$ @ @ TH@ @HW@qF? Շlh裏X c( @? 7زeW&ta@z -[4i~rVT)ӬY3eXhʹk.3މj>r_WpP.Svj׵:uVZ*@YgUBҹ{.+^s`^A0|oBA'0@  1 @@6m]gΜ饃%32O@ ywOjJR@ @H+ ?޶)ߘΝ;}@* Ay'7_O+ TL+V@V'|˴4h`?u@H5qb]@V\i(Z9/'O cǎ^ @ @ 8tPŋ7I.iL @ @ иqc z\K}fӦMA# @ l! /XtwV@=[VuVoH1z(H@I"{8f͚}0@H.d_Oo߾^ cݣwDt+ \{x I!N`ժUvUV5n+ 1uQUVq.  yᇛ5jc9&l77ll -?9s rʙڵk:#}_7#e @Lɒ%M!%/ @ @@A%pꩧz]WLP8"s!W'T9GbŊ^cb @ @Nz2k,9n۶mvv^A @  "_I*^Z!F8Q3<݋w@%pM7>,hK6_~^`-[֭[f]?̄ no%\b$he˖5=!CCZ#9)*(R(رJѣyC;[n1׿۷7SN [Wnݬ_oةS'J-%඲D~L:쳃6%͕W^80_|Ob~:%JWtdoꪫQ7|lݺՔ+WKFBd۶my̪Ul:<({TWzv6nh|@W"y5i֮]k^y#x͉]LQ֭yK_5GqDPAc9+s_ǚ5kYdISzu\J6kjjVĴ?X?иng-]ԭ> IPB]byퟬD%&V-X?>?̞=;_%=rȨ9F^zɴjʭZn蘍3 6̞+^_3]w]Ha;_Ѡq]%O+sI@ҥ)boqsgҤIVtڴi.;R:.,ݿ)^<2]SN:8%".kI'dNjPmKg +0Hc$zZ9siݺkf:,gVuX @ @ l$аaC[/I!F؈~oA;%H@ @ ;|ׯo:t>Z *+_| B @ @ @GYf>|MH!F]ر#_d@JFbP @ dݻwަdɒY?:@ @r__nݺqh{pǃz+*T`4i֨EH"VTr/LVzȊ0V^݊0Х^jn] oޮ;Eo/I<0|$(Pztynڤ[oeVj8jԨ|cUmx;[,p@IDAT3o{4W6r"(; kJZA{ɜΝ;M0LU6olgr ۷o7SO=OQtM{ヲsijNxYiG# @ @ ,"РA7-ҹ)!F  @~ko߾ tw3B@ @ @ @)&p'{-̛7K&ʔ)cve ,c=ƍ4 @ @}eŋ7rKvt^@ @ &PΝk\P9 gI` C OZW\i^{5[ߵ^k$9;ov;p'+@U?C[CN> &+vQG6m;7?psw<9tPh>իgZli׳MSO5*U}s"uK6ڵ ܜu1]v`}'r 7VA $ +!c}VZevm^xw޽Y`A%z=:{[jՌ_~9h-[ k_Mhڴ;m Η~l9 &eܸqwFϙ *ؾYsכ3f$)= ܱr…vo'_ۆ̄JS~}KDÆ M^dcǚ?SN1.qsEι=*h2 @ @@!"M/^9 1nݺ5`!@ Mo.-[\s5ԽB@1C̠ @ @ @  hpB][,eBO @ HnÆ XnlLH @ @ -[5p 'xXc!L5s9xi P0(Q޽{t =oSu-//>_kO؉@³g67n4vȰIHrǎVcǎj(<ӧhw}g+t%%s|Z+_"_bE5;w6ߟkNQf[Bi̐3 [zn5K?s+S"9G@{gǭQ)[oeE R=zJ,iƏo8qy饗GaȞ6m+fyz/ۯbŊSN5rK|A~||WO]l6Nc @ D$Oze/Ы @ @@.]jVZBrv@1 i@ ̜9ӫQF^:0dgl޼9.NxvyEZUiذ-θ\^Mƍ]vҖnڔ.]~3ϴyn]ɲ?H?pꫯlPJ?<۝2BZ@z6TD7\M>fr.-qpב'_uU S_*?{kCݤ!SO=eFmgUVYA[3)[o%¨&q~o$'G}4XSo1\r?hZv/[ 0>3;_tEVXy f~ae]Hy't:t? }v;e x5ט-[x6m+-QdΝ;Hܹsxut}򷛬c:$[EI%y駛C& @ @ P@ c5lCLJ#@ ~gm߉l?_>Q0d@ @ @ @@"EL&MlZs5:C y#p7nܘF @ L6|v?ŰkժUu @ @@r l۶8mO<1ʋ'w vnk> 'VRE`֬YOC}Boa*oCeuRXMbv-2|Iv';c6NlSN^y?cxYj .%&׽NWd .>IHPB;%w-ں Dg_]@$۵kW3j(ҥ[jL*TMHԱgϞ9m_,X`4|<|;Đ!f}9GyIuA k+V ֬YuTRŊ4sdI&c*%%ք }71cYfk% @ @@'Pn]O?@16m2*U*#}Kl;S @H ѣGkں.B#(,7J}˴P ,Y  K yK @ Yh @ Oq^, 9.[c/M"s$?[  -C @ 0p@bb>}Q|L  سgOD&L0WX@`l}@SD*Ԑ}gΜis9'ɵS $9sd[j VZwy'`bjՌߡS-p5a<&ܨrV,WfVG+~x?` MP\Zܾs)MY;~m Sɶlb-[f$&u/'`JӟDb7nG#D;;t`z-$Ĩs\~0 1:qP eg8enhV:bqwa䄽|r3d(ʕ+6>{=L:tu@,$a۸qyXaYY ӯ_?yf3e+|WWve vѣ<б8Ӌ{ϮDf8 / ?۵kƁKG;DѓO>iogzvr @ @YN@wL8R+R[&@ AFN/M"bL-\]0 @"`{NU @ @ @#ШQ#/`B۶mʓI7md3 @ @ /^l># ŮK3!Z:/ @ z0%!@@7 1Jg,!@ H\oyz&Ç={":ئyNiAGl۶~ܾ}6m.ٻw9#L*D%%'lS^=SF #6F!X7$$h[6cǎ5+V ܔo]y+PZh?Cmt۵.!FJdɒnSƗ;:COwqFi~H3fD&Md&LNw2q'zr4K*9^yo{s$*!ƹsb2(uY6 AWP>$A WT)ӵkWu}nf͚5VZ 8֝;w&LU-P$}8? |%z9}!@ @ ҥKM6m q彽bP @@HmΜ9͛vڥ\o/OBb @ @ @@n8餓+RlY`'Pre6l@ѣA @ 9b#~x -C @ xoى'q-!H $IxH"x'N4i[jqd=ڊ9!F'x'(A%ۜ.RH;ud f< ?nׯoũ>3+8c si_8RkСC$$Ҋߜ0ݻҥsF߿?ٴiTٱc'dTGuG͛gFi bѧO3{||dO(+@jժծL%$^7͚5Q%tze J٨Ql.Js}߾}o߾_]$AnH4h޽935c$G'jCdB @ d=̲e˲_l/Bv @N@;;]e8?5OC4QHTVͼ d4 @ժUmwJ,ɳ& } @%4 @ @(|5j !FE'=X7n$ @ @ b%}LGh5k;*t_K /4իWn'@1ziG CI'*Tqݺu?c{4"s!;C@TX\p^7|y猖MHW 5۲eٿZ&Q;'uBST f͚e k[s5kD'te6mLVlWuf$4ٲeK/2={!B7nYhQNhѢoWVP+6lh$2b 3e#Q+ S5֢E|cƌMz(ģ>j$,X`7n&rI{VRQ$ Ahl׮]G !WܹӮ+ܣG+۷eOgLۓm$>|Xns[u}V1fn. &%Kc.1i8p`.{$|A[gG @ @ 0~ǘt;$  @B?e]$٩ opP@^z1*@ YN@ @ @ TPټy]si=y1f@ @3製<=M ĘQ4@ @C_5?[o5vV @ @2G`V@=[.7[{'y^۷$ @`8O6m̗_~iƎk.袤 @buJK#G4͛7^ 3hMwGyDmN\NE{_|aTVr=\+5ydq;apcfx [ov-pB|rMb 6W~0_ٸq=-[W&S:o'N1SzYH&Kd4t_ɸgs "HI,I&n5V㎋j?WH"檫2=5jٳ]jW\a+&e鄛 K.A ,-,[]a,@&jժV(YwcM11sL3wL 6!@ @2@@j׮mM:tS.f֭4l @ زey饗lاO' 1+W.0 =B׮]!@ hG:uO?=r @& fp/h @RI@1m%91f=-C @~w#QyU_LFs D D&G8CF˧~'$v6qv/VTew^:;wlN-[辢XW&˼{=KB={4*Tӌ̙3h"6JHߍ^|E?}=z9un 6̞o:0@ @ AsN 轡Ew2 @ d~<쳶cŋ~#'F/_`Haf䓉A%nN@:}%Լ`Ƀ D  @ ?7\#cac=}bLkZ @ #믛5k"eʘ}A@1{K(Q0:K/!@i ;w ґGi4/ PH[@bpϾ},i 4a P HxYffܹ 7l e GRJfڴi[nfզiӦzvj*+I7pCjm*Wl֯_oHIɶ_JSN Y^kԨaV\iO0!W_}ΆjH9F4") 0p'' }}'mذs'x;ud-ZdԩX3$OMmU} )%*!F'``4N}? %}MW֏V Y\eiԨQ!wt_Z("l M=+Ua2ꀀDd%㏛~zܗނ 2@뮻%׿ >4oܔ.],\̛7/ =zX!ƙ3g꯺f~qǙowԮ!{ 9̵kך/{ߟ֭kJzŊ69H8s$.=rHs%@N=TӠAn:w=O=m @ @M PM6$νTqŒIn @ xW̦M<~NOba"p5ט#F!1@H3^zYPj^Ä Bm& ϵxⴴE# @ Y3ٶm\e (޽ۋ4 @ @ ' h?&bG`Ȑ!F11@K@Beߡq3fرcMAZeʔɧcb,-$ !FG% M > iϜ9s_l $#Ɩ-[ZP )Rt,;[OVYp3~xpE Ŷ.]Fٱ<QZNމ{E#*FҕMRB~VѿO'4gyR2}1+ f5n8 ZNg" l$裏)SX<%Z%+F +0hѢVPB: %7{l+0}zJ/U&o5_|ь; j+ܪU+;B‡lݺ5d5pMϞ=͉'h6nhוC =}v/ ]*ڑXD%H{N3ΰ vGX;k֬BD c2!@ @2L/O?e7o/H Z @@n8x4h7~yi%$@ @ @ @ ; ԪU˔(Qvnҥ:YxqsQG|XF*UlׯXh @ ƍg{@S @ @. ,*UYf+p IWB ~U$+WΗŲXym]mRAxUBNL"B$=F@KDE`[n=cԾ}ڑ`Rڍ Uw޽>Xcs"}5jDε3tPO:Mطvl߾ݬ\ IK_L0W(Kωw/hv޳=Wm@"*Tй{Ywa$RXZ5:#W\aGz{™9p@"IVdI3x`s=ٳNJ//_޶u/7b߾KWY9HdS\dYnDTu&L"x$ JC" ЃQ# Px`38TA2*(s3ûgvz^=3;SU UV͌3wF*Wlm#!   d?~̶kT] l3  $J`ܸq7hsΦu։:4 lݺ *D,,"      Y+Ppa;^.]ԡB f@AyRuxݦxIE@@@ [> Y@@@@H m۶˗4o(Q)іv2ӧOhCHH #7Cҍ(_9-qGM#qJsH (Wi߾}ޙت|9RcٱcԨLjZ.!iӦ4+@@@@2B~^;1cŊoذ[f@@b/p{0[f! [       Q ;vUV嚟M7ymD?YzL"   ShJL+9Ęg6#  aü <[f@@@@ uΝU&1N/_>5x@ v ̶@@@@%РA7w6ŋOԡ~ʕ+{uX~  V`^YH?cŊ_      @` :䨱N͛7y0@ ;0B@@@ k3i$ФIӣG,    @j dl Ư'pG @wn>jѮ]c')FT|b"ڏ@Tȶk`7k@@@@ :뛩S?/o[toĘF'" ?`>S[gٳgZ?*qFI*TY@@@@@@@@Æ =KznbŊn7XTo  cB9   aü… {Y@@@@H9sxiٲBhvž3~-vڦnݺ(2@ZuF7"Я_Li @ ,mlko    ~#+SLQ1@@S*~7"ExYHMѣ`@@?Ee˺#   Y/ШQ#`ɒ%޲[ ԪU;تUe@@@@ ~3g4|=@zyQ2    @Sr9SJ@jm:v        Y$PN򋷜 *Uao@@e̘1claժU3\rIl VX1rD L6OFݖ)S|裏67Z]V^t[ʖ-[2gcY'k8; 6*Wy^ZYfM^ .IŠ+ʕ+TMnW8ݻwի 6}to>q8 2ڵYkpv3:M6Λ7lٲ{ŋuʕ+XϛsA9sAe6l06p1\F S~}mfvY~Iw޺u&MY$}׿甞[Ia:|s$7K.53f̰Tz]tITRl&axAnVs}SN9śp.h?l7|_2    mE8p,_<;wo2"aM%1: @@@aü 8-"Jup9-[ִhU%Z=à gof~Ww g3k,k.;I`׏]dLKXpW%JFY?oe +?uTC_?0)֮]kDž(hAIc̙cwo֬)_|mfΝk7o<`}UvڦH"ӊX:oVw6m6qװ3$S/W/B裏&*g<)q>={הtԸLNL> TXx7.7u©ҿ >Z5 ܐ׿;wZKM`6z\5Α`L=+p&߿)סW  R@_w )^|{G5VSOM sQ@@@H}ߋ4t@+VB F" bL*?G@@B;vmyZ%\ 4keȑ#O?m6+J˶rJ௾jlWu 1]a곿y}#혆欳r)*`.2oFlgq]a)CϞ=СC͐!CrBc0n41|ӍIrpGR:v6پաƝ(pV̝wi{h!ή@tӺ:|v\B^:@U%u_gc}4W?yz(!vlݺՔ.]kذXQ}F` FM~P~}0}ɒ%s/l0חknlM8 y{n$ņ}^ɓ'Aű~7jȞ @-h_ծ:o,ըQ"T:Cn>ݻDz9By~ʔ)6G*ULӦM&@@@@@@@@L[i 0~T!>}"Ex]_yNjҪ.w>B#)6hNn??\)ț /7^xa[Ѯ];駟z4fJ (wTL7Ƀ|׌g8jF7N9g@&Mrsk"ܷo_r0a7#ѼrU*~⋦}^M5Zg>C3vX3sɒ%7ﷁiUy\h%}\@@@@ɓ'wf͚y-߬HЄ8Z}59: @@@'0|;K/4~d@4UHFߵsΦDf׮] J~$@}ߘ_ F }6D3wߵ!]`'xzy@ ¨}(omS5d[ɖU:sOg϶ITv/8}x-+#YXKpEvr@*  @b<#!lͳǩ:        e˖&vӣ汩eʕmAb'   ;W"%Kn.'I@@IDAT&f7o6SL+{\AAn:aڵMZ&z3fLΊEtҦK.~0BIքHxAn[R`wZl6mZ*}v&8p@p+nݺxAm3gYvmA$M.h]4y?9d9{6:,3x`YF@@@@CnݺVb'`yXN@͚5AǾ}_   @s=^_v@4f"Î J2:uumk߾TR,a^)WpB tW^,^1 :*OA]]+w{N8 ]>=pñR~ӺTL~;vsPW_ͳqvX̚5h_mP ŋ~e@@h>{**UĤ\@_א;[f@@@@@@@@ ;ԩc n0&‰tTmB@@ YO<ٶm=|߾}MjՒU bŊ[y@̝;׫L D,/^xPÇw%%J07t-w̙wߍysƇ~hڵMifϞ=v9jޯ_?ޤ 49BAS:9uQ`$n}ٲeM7'%WcTcYuԊd:kҒW^yK.&+@ hP&9CY7kN'"r[I'd}|Qԗ^z)~O=Qґ#GʪUW]eormxm`h BV] O4wa'@YVgMϗ^zo)>z͛7=zm5jT2]sN裏vjB}}[ID9oyu[rem֭)w4n8s#8=AgͦY|X   @& jڵ[ƍj,1규իW'6@@@XpQ%3 ,ȯv,wU?@)S]vͤIz7WpA k<ԩSmÆ ^.=-Z[B4qEjC QE{:OOQZ͙3ǿ8/_)@Ϡ7Nr؇ ڤI?R+}6>}ONxMݻwq]k֬17x˫>5Kg)诮Æ YcACeu]vHHd]g,]ve6ϴirl5)ߺuymʕ+͛1?s}xafiffx4'x{rɒ%駟nwޝkб\G.u{t׼e˖L2#4rR{J72ن{L/(1n         Pn]N(VպH2i6A6RH@@* ^tA_A29nP $+VXr*QC@m\ k=LȽ:{6޽{L L=bR+ᄈ۩S':/Uٲe\M|gl_?M۶mM7oilQ[\sSտ;0)P)8OmڵsٯPuU5wr~8:v^]P:]_4hWMj¢ 'UQ+|4R^Z}5&RE=_e>qD; &!!   @ t2}'One+rX?b$!   \@A\_ d+gd-@8ո;k :͗вe=vA]E2m4,[sQXxi7iXzW} ]~R>%gtR۷PNJڝݐrΜ9v^ٕ&MB/fßP2;ζ̋s}]^]snw^>=eSti3f\E\`~?c5wݺutv͟ X|Ygk+ާu};sZz5k7 . /+hc>}̗_~i=[c#>l.vY"]?x%tիWl0>6:7WJXFg ƢT y4xkٲe6mxX[@R_x @6 h2&:b򀼄؆*l=@@@8CJk+ɖD l9Ӵ@@ n.\r-8,(  ,Y(_U@SO=X:*j*/a76 `,]s5fĈv_өS` OZPBBvˡO>|v`!^[k;/Nj d׵jʸI rdAr匂1c'lO}AS}v;HXP)R2CO`d畻^(X`s`pak;n)P;:%i"? ,(KozuJ3:/n^ XQx_?z(,ZnT X͛{Vj2 4IN O1TB9곺gSlYuQFs_(ׇ~h/k8ǧps3/ptyuͩ[{Xϣ3@ swymd KׁbŊk8AcJJAտ9UR-lvPcͮSY|uQEW[5.FH7@c ^~e>sӧO|б74 dM<'JѼBdu|^,/^lCLAu Lp,3nbd'a`9'(y/C5tI    ybŊfƍwSWh;)5?tjj   s5om]uU\چ@ DN;z;Y}wcbotA]uL'V|eP?Îep>/>sڧZdɒFݛ#ڮ`T<즛n2^z اOOe @\ٕ{ES~{8餓lGmYRA_f)n;v֭߰aJ'q>QLtqUuEׄ=z䪪ׯ_ߎR_g{VRJ.ve?|Y?}5.\+H?x^F.>>z9{2P{1?˯z_yF OMN bC@ ( ݸ0v +K1jPK@@@@@@@@ 9 {2tA\Ҥ$@@L@4YI?o b Aq;## W>T UV tIǏ27o^ĵ G>}iӦMe5Rbܪܿ U`uI '1*^X`}O5\|9{PjU<7gtu"z(?@M<kp=0s1fܸqFϛP)ZPMѤH_} KNwmAܺ`;҄Gk)-[b9sf@7p4?`?ֻ 1\+VIXMdu-EiM>hhrR޽m FMMqy-F/'J@@@}?,M21fY    *~/-bj]/m?;K)84i?i9eDK.7<OU_<-5PIէM~7[j zLϠJ4(@KwPLɟߵ6m9QoZi׺THk׮5fȑU}Ƕ8'=V06߹sQxQ.x&]ONb|m@]vGu Q:CM*Ub ƫϸs޺uk/ j˗/7.rIyPcwnS5c1xc@ϻkk FֻmۺŐz83%T{thR,OL@JxnٍUc^{@ a(>QL,?YbjsJE(h޵k׎(@OdѡCs啝m '@@@@ yʕ+{D(I   ^$guiڴidW4P%M JB ]4Qgmoٳ /`Y\vev`~8x 5kK.h`kgiնGerO>\AvjyS;Z4[ VYMe 򧫳H 0̝;uSZ5e;]LSz++W_}e0~7F5x]oKpv9,XX@:ԨQ<33f0=zgB=\lӢEU Ҝ_R`I`MMMH6]s5楗^שPpCmOzOW0 6d6t LJ6IAo&y|K,@\^#fL0w:tg?3Jy9w\^-ZT<cǎ0]W~*5^ݘ?z<5sFAlbk\bri>!]kdtR?n,M7zxas)2Gw ]iíM R        ʔ)c4RMQno9>6O9?{\a&`㧟~tQF?YM zyjԨcHI֮]ksD'H֭YO?ylf z0sLצ VT\veVZf񶕺^(#-3^N{?#Q6et{n~G~wiـK,kJW{o߾=puǡһMYZ|0~W / 4A9DcX9ogi+{@ \lٲq")[C@@@@@@@@։GĘO{   >|WҐ!CeRK?g Rr4i+\8Cun;S{d TټKfǎv׳>;"+m zsc\ޠeJRq*MpYgI i;:tuvޭlo*?N9x椓Noלun+/V*L28&!IPcFP7&MDd< &$ )XZtiQsFis݃4oe#2,H*Z GWN>d`_~-NA:5Etg%J؀k=g3|vs9vK@@@@ ;\Z?sݴiVR@[H    !@ c ;܆ǢkjlP%S 'Nh6m(Pa?N  8ZV'Sry8Ř={g}SN=nil%^}:(/K͚55*H)9//RQ`_Ծ:_8 R_L㼜͛g-[f9rȠc?9 H:RPW۹s˫kE.(/\lذԨQKF=njϸ xWrubt7rMI+Q.\&'޽;puZsn{춻9{ǾgϞA_n碒M?{dC4ׁe@ ?]WW}y~t{|Gwp]vn{@@@@@@@@xD92@~i  @T_Q #8"އGX!W </e˖nu\5kfN?t`C=PDXxy^jR,~駶38Üp Ao=zy1[Ф =СCê&PzWe3Y 2_MO? dJ)^~ۇf2.0AW^y5[$Q@ h 64DIɽq+VGy7rM>ܾ}t'X}y 4osCS6znhҋ`\r^JvF ɹB%W>{Ce=   d@ZZ[ւ~HVMCU*[Q7@@@P0?fS?.(]؎i.I?p _`Zv+}c=+-.! юi8pa *d gJ~7VeR<^S4Rp5Ѿps8)Sɮ]lƃ:ȿk͟??h93TD ,QK/}KvQVH0_c\PA]׮]kۺl+mq7vlΜ9fٹd7.lQy\WVz XzJ ,pǎ-kڬo]2q`*_)Xy.cnGb2ey볂$Eނ _!+I Ĩ;M4I9 Pp`-[@@@H@@@@@TO< bR:͗.]hu  @ ݻ{^ -z?; (\m۶F 8plWLkW5oܸ Bf+or إK; 50E馛ȑ#.k0G}d;0j2g6?zB<^YF ?=o5_M5xƌa6mj{_HOSvnjRk\,SryvG?_[.ȘPMcnʔ)^z#<T0~mToݎв&̜9ȫG96N۔Y\ꯩÇ7:/Oګz+o⾠=lNL{I'ѣG݋EUF$Xr[@^|Ed׮]-^Ŋ3F%K->ܢE ?Gzk#k\\`:uؠ+WuI} .'uLzP~t ̨v(o8Iyu;s 2WOW\qwnwV}C%>}=]we*oj^5nNHhMѢE\껯 `y MZ>UM{]#dd ƟF7p@ȃ$R]Q8I       Uw uuGK\R SP%@@P@ UWR(vRF VL6UVѠe˖ :o믿 p3b;I@Ǻi`_|)c -0i` / _5TIF @*i gݺu/bO@ny~:*[&'pRnNؠA`\515KtV~~4aIAIݖK\sM@{ʣ̬4I8)pj50j2=/M.SPhϯ^&M2gyYb ڵk{;Sc9hB_Fv4&Krse03g7M 5{l{]=ꨣLӦM/h)]gGY0@@@@ m+\ڸq[>U# @@@"OW_}ewVT!!@vW6~㦹4}u)(/۷b_sI4ib.\hW .m`w,}A4]` R`I}4Q}QGQ~W_<\:^sA\hTcJO6 65-Zdwߨ߰aâ9L} ӦMeuWRp:IUb"y sN7ɍѸ;zc\>Ԇ Yg_/裏LΝsl)F3+w}g v>kL'X?9\tu]m믷g̘a:n:W!Շ]##Gڱ JvW^=׮([cӮ];;PuUK껮PT:q/"``{th bLǏ7+WkAu>{ӪU+Ӷm[{leg S42 Ʈ1ZY:dmM[Ĩ$RY\rvرc(n.s9(^I \X+P_8q5Ƀ& My4ppnsL50XIi0 jgA1T2h sgۀy` v)j_^N׿kwMm0} 6L2L/2NusI G#! /k;A]lY{>Nw5&QQMOHM"4vWI@n41cd v긚hx60&ymI-/_^CiB%MNI4у>AE賘 tQl%MtԫW/υ:=ǟ{ﵟ5IQ5nRP]Mڒ_g}spܸq6ू^*sKͯ\#   @zhbpMF~طVߑi&}Ę@@@2B@lĥ{~Gs/~?mW!T_|VG}\pX_ʭ_ XPN4f@ 2A} 7nix_1zڵkN)u]ggk@/c`t]Rl-z̒%KMrÇ~.C82x="UVח,z> viϞ=68`z=V@Cm׸Xh+H"|뭷j)j=Xru;,RR% Qyb4NF<:\x};o>G:@@@ c4 L<&    qxwYge1SO?ٰaCΗR_  @*+)RR[ .TŋFv]NTGO DӢE _~go*njlzMAH #;h T~!DVX۷yӬY3eGk,%IعsHڻ  5­?z.)H&]DH!I-(0aM˖-cx9X׭[gDˬM6v2`2istsa:uD='ԢELʕT @?)Ы&MgQy   >jղ{+Vx裏줙Zqw|ہ|wF*ir'|2!    dIꗢ1$fOϞ=m`$yM>}ec][,9-9 ܢ@a0i۶m;}}Ldx<@ P}fvٳ́>2lܸWAb,RA .%uWk:uYXH߿ߎEPP^!h޼yB˗/W5"ё7~uV{N4ɟlS}oobOifKk؅QXt HUQFjը       (ƥUVŬRNu$@@-cs} >tЙْ2@.QT v呍M #;|ںH7%KVZ[u } OdTR>~رcRk67a[2*VhQӴiS{K9&   $GF6ի&wAVP&!%&viʕn{@@@S`Ϟ=fȐ!^[f]c4h`tKTLӺuk{K:SOH/h~U@IDAT+0aΝӦњ{NMk׮*p6hc- <6k c2ޑ剴16 @ |^=Xo9 ĸ{n3k,Ewމu(@@@@@@@@ =4QKqƎ{@@"OM2ԳgO1JU@ NCB=z-ԧOӭ[Hve&pgFTvR̫Ѿ@]#.L   y {56l0 UIi&}j֬i-jgVXpx@@@Og1˗/?SLNү^kȶ>qV%|; {ɓ'{wqrq̙fϞ= ڵu[(@@@@@@@@ D1j- UT2[[f@@r lݺ<vC"E]wݕ;kRRb,Q)^xJ֑J! ,0cǎ;vh?vB >˗/jQ6 vsNJ<   D)ؿbPWƍe+PpaSV-믿1#  m=ck^P!s}a+2 ` }Ym}*PKHgQw@ ;w4SN6ji wyG&G        Odɒ\rf˖-Yjժ= @@*裏m{6zh|L=@WwnQv t|!0N("6v>+~@]#NN   16ofX˦Me/Pvmqڵfݦxɯ5@@@@ z!f[^z#8" jM@]mkOe*%_fOZD#0eg[DΝ)*}qڴi^ڶm-        _@dc *Ux b(X@@@ ƍ&WP*ZsaE 1u 5n֭[Hd@~2)@]#"   @Wurɒ%Mbu-: ʕ+MÆ C@@@@ ڵk͈#փ:}!rH}9R Oezj,ƍVP!); &LХKo9 Qh2On7N-Bec=        @ (1ܹ3k4Ę5" D)\0K. L_O|>4C@@@@@@RZj^׬Y-kM iӦy\ +V$2@@@4Pm۶ߟirި&  "XGy)R$UE=@p *d:uWbܸqYdmGa-׆Q8        @ @jիӷ!9 Fv@@=m{b̐!C!]I1oO t=@@@@@@-Pzu}k ѤStP@@@4XlyglMK.X48gT@@@&i&3sLe˖jժl]1N>ݫt۶me@@@@@@@@Vj͚5r/10C@СCmQ_~O\)#7o@ F@@@@@@@ O1VXesbT?R@ъ+̡:&   $Y`ݺu{ﵵ(R1bDkQ`FVH  ?;wK1~xGɀ޽{S6TlK,i9昄46[nq@@@@@@@@([)QٵkYvm6$Pf[#b@@,=z9sms9Ym͛ѣ`!C7 7oׯ_\@@@@@ _ F1 qӦMC ԩS;/B FO@@@;_޷o_ӢE XHK/dt#! @([:t(4    i.{-8Ӽx/]MwGp        !,fŊfݺuҢj&  %0rHtRۨ.]N:)!c866=\@ *PV-%K^Oڍ@bRT}GQ%@7QTơ ,* b9PA=ND g98D{Sh!=l )zmgy&fg   @ ;?@>K'bܺukv5   a,0n89z+ 425 wy|6k A@&Mq_6m,SABUN::tƍ@HmҥKK.N          ؋THLqDg {qT@@4~M}Q3h4iR|UVXΑIUW0tЊ; GB8^k"Qg    xW~VG3[wA[l    A ۋkϝwpHh׮荂 %м!2JEK@"Q@?h"3uUV#O?@@@@@@@@@D^zLqVi}0%B@@¨aZ,;w>NA       xTӴ4g1:4kA@@@ɑ;4i9T@@@@BS/G_r%:ʁ>ڲe˜CPPA@@@@@@@8bڶm{=c{ޑ@@@eڴijժO<ᯮ'61&&FVpP4? ̙#[Kn<8B xHg`   @ ԫWϙ;VZtN%l~& ?@@@ %99 G>b    ϝ>.qҥfr ҼysgT@@@@@@@@(N}H $$ ! D=#999fw}p 2gVVc͚5~L0ٲz# Dh&}&W(@@@ ڪUJ*UDa鯜z=,;ѣRrr   @JJ<;wYWzuѣG^'1v)Ɩ.]z.        Fݻ7fVTbbbvڒn.R|k"  ~|$%%i1RG 33LyL2{:..+a !(p!' WTI$P  ؿ 86   @$**JuiiiRV-IMM5?ͷ 4kL,Y"ǎ3aHA@@@ >2S>|t)s =zT tH   @ ,[Lvm߫W/P1Odbt(        @{Mׯo.ġ   Izq9S~ q4£b/be̙A=CkVйs  T@e͚5q(   Aʕ+Kڵ~+Ĩsydeq/G G@@$~Af͚e\Ns(R ))IFA@@@ |A+-_SNN         HHHpDbN>==]rrr*  [o%K,1ʁ<"Aԥo@@@@@@@@ bt{ .11YiԨL@@pЀ;{g%::YYYY$:@@@@@@@ k׭['r1T1K5J!.bܺuk@@@Y~0Сz^" UJ>}d6L@@*ZOCr<B 555{?M6yUHcjOq@@@@@@@@@HHHpaTׯLW?dDA@@ &O,۶m33 / F233׬YөSA@@@@@@(1j˓{JbbYAAQw-[1(F   @ dee}^J*9T𧀞=w\vI_    p9sHnniկ_t+~ٰacǎCj         Dw^(&;qϞ=4u  SOW\Y&M=m-=       @ l6OKKs bt6P AA   @~aIII1#+ .h84    .+t+VH^^KN*rN @@@@@@@@ bccFf& | 4p޽۩SA@@ \n9xޘ1c䤓N שF233׬YөSA@@@@@@(@BBNc*A[͛7m@@@Xrqqq2yC@@@@VV,XI&rghEw ˗;G%ѡ        P {{boL"55թSA@@ yׯ/=P8N9G@O%>>VG@@@@@@(@z׺3226T!ТE 3-[H^^7(@@@;j(9z9}5    @ |gm8p >>-||6l K._~Eԩ#Z޽{Kj՜;ӡCg}a5kHzzN+IرCn*111rgh~I>,7f͚ .ѾgyT\Y8 [lqi۶Uټy}_|1DA9buݭ[v7L&   QݻיqfT*`u? ~P@@@o&w}ԩS%66Y    z=I?ңGM* AzEO.^z&ȁ@@@@@@@@BWnݺѠAg޾w6PA@@  3_|QJ L%$ܡp$!&0j(o r5ȃ>h|{>lՅ.kܹs ݶ|r+M(oZj3<#Ç7M&ӧO}/H{=袋dr 7țouuÆ 3!X1mddd?/~:tVP' E/.4zh^K41996h -RC>㒘h7ze]fB- 4/))Iz^-W_}qGȷzK)i'|~_=Ͷ?=^{m|٩S'yK/ͷ\uU_tIlT!v|wo2vXX'xBƏo7_Qg( P/za1DqY5/gwޗv@@@@ p19wY 7m$sNP@@@~M?E?gd K    'W_IVV9`~RJwp#$qDb=֩sH@@@@@@@@(ocKcҋ臊;&!>  @TZ4hNT u{"C( xn6ḿE/? 1԰Ʈ]9  4i,2tP9xԯ__=\sі-[UVҥK}5O'˖-38殬]ք:P?,C 1SL1!}o}GqVót$}q?6  Z ɓ'Ev[g~:w,׿|7aBJ$?z     g1:l#A@@@0͕QFkyGNY2@@@@=XϓԢ׋ݻwPQ{&@A@@@@@@@P:u83߷oSJ 4SSS#a@@ 4I?\e„ \\!B,gN T@TTp cnܸQ~'4M6/@쪫;@?,۰EgbuYRn]זW@a+61&&FZhq%ޭ[7N/EJc!D /P/_. t \zY18̜9lj(-6|$V~viIRRFo;Dm M&\m&?Xkud͚5Ez@@@@@{ZҜv5jpwT!@7F   Xӧ˒%KA:v(cƌ @@@@ (}󹕾}JժU2{P        p_P?҂㑝-{l  exw믿6nZβv~!&؆9+ @ 9ʕ+zy+7{l7ەK/4ӓ>\` ]pYohT6$Іazse[j%+W. o>l04OQdqƙ-[&}Qng͚e5ηM:udƤuVJC_~1V+Vpe˷c ͚5Ν;QZģ˥Cl@ 2Ą_I>j8kSSSE_|ozj7m4ߋ/(UN9餓drb_*zqz}r뭷Ν;n0o&~58QK%&&G{ pmZi9x𠤥0]ٳ u 6^PI?Lb߇,{Ҧz>Y5}lVTq]_X,#@4l/4t]t9Yg%g馛l]y177^~mZA%99l?S駟ηyѢE&XÇK7ʜ>XXxׯpV_|ٳ'߱|.b'lX5xӦMH-駟ʮ]~-SN]e׻[L7=yw1;g}   HHH09Ǥ$#iٲ۷ϼS+C@@@(pw8s0    @9\)=Fs~3\ؾz2 &=IO         P{tݷA/񼴏^cA@@,=vѿ آ%٢U40o)Vyfӕ^4UVEu[zl6 -v]ӦMcǎ˴lCmȢv?8}iP- ${?zhU,]T͛W߬Y3S߲eK>wmׯo{nmuJFk ̝;WRRRW_Y_ 3ԟ{ P@ qrᄶzK֭[gmJ}Yr^oFasu]g.ר~Io5D0+4qȐ!&S322nչsgz~5}1MЫ៺{kРA5YCW.SL1-^}MkMHEݥuE@@@%AZ=}@w`?D?L˱c?{#eD   N@?Ѣ[<3    !#-ܹӌo߾`)z2PNj6G@@@@@@@@$1/}p   @V\i#8y)=h5W_}o7DA~ѥ?mK/5͟??_`]r%u ڏ1֮][6l/˶i01jQoޒ}Ll}& ,miskZ Zi m~ 'H5:g?&JԵkR:NֺN/.hb8 s)-,MGٵkW?s} 70􁀧ϙ}>:l;Jhs^͝Mq! 0ו|PwnvA|ȄjC ug u_V ~yW }M;n3#4iOrr=Ew! DlԨ̚5븯!=z0wJcaZM~u뚛;ޮsxE5Q>:?Zպu&rj3|   A^1jquAOW1ҦM`A@@@ ,}[oՙɓE?GJA@@@OwyǙu]ԃY)^        e jec@@<#FG1N8g@.i A9.tR袋̭gϞҪU+9묳dΝO>)60qҾ}"o62 :w8V{ "=׿L6$ Uc[΄)}ٲm6III1pA.o]U&||ٵȶ1sӆ\ع;ێ;fB6;wۧ 07nibieR7 H /PƏo{T][gɺ;akh )ݻf_xmG;/AHGAW\qk gu %t6'[4Um_DoZ o.ׄ*7|`6 >NsFiVi G{X`7k믿ʲem'zիߤx-k3ݦuaվ˼ /HNN>Iߢֿwb@@@#P^=g0{5J*Ill8pN;1z`$   xeӦM .@n&uNO    s\>C3&=Ϧ_~_e F        Ę>=;T@/W_kl3f(хn|I}{E}]?:tH&7iDVZPPΝ;>/^ />} !CؓN:IG|ݦ3pԻvԋ >jhz:-zce͚5 AxA_|M|A@@@ $$$8(P@IDATcAB#;rjFAD 7o<BaN>_GܼysӟoTI]tE 8auZzדQFk.neC98.إKpB _4^2^SN:}?>&ڙe֭[Fbi rv6XQw4꧟~3<ӄ1v],X`.llŽuz}CGEEIÆ e˖ﭲuYD{_|r f aw~mT@|A}5׈j]y+55UMPIhnkm}֢Ϲ>gV쾺6ޞTuyT$zc}q}Zn6ሺa*ɦ+=}wQܹy.|:@@@@ s{brQ@VlܸѩSA@@@ sr9WH۶mCq*@@@@sD{$=)}LC@@@@@@@_ZjŒ#/Ԭ   Ǐ={^zTw9B6=XHvEח.F-}⋒'?|6n޽΅uߣK/Ԭዺ`v[ʾ]vfg j J*I׮]M8_ժUMx q d`ӦMĉ>icb;{ٰE}oߟn+W>,tR'ʶw]H^}N2ENYm3gi-zhtM&S|Ǧ_@?6XQhH._vmoV鋆dggSTRJ4Ֆwwsc/}Q&ڗu}<\nhH0vMf͚e~wذalڴZnxXs7n_7 3_>@@@@ p N[4Q AV[-Z}_   @( g,YbСCCy:@@@@8z{>dڵ٥651++Kmf߾} B@@@@@@@_Hbt_=|if  za3fis=dN%!ڴF%؃& (QF/i]wch?K߾}EyJiii|rM m-jթjbcc34 p%-Y{\|W5쩬Eڼy>&/ĸcfvJ׻uY,l٢UyًFkXXqw/?i -A\o[NNO?mCAh0e˖yIݺueĈr 'ܹsv}bBh JQ'h֬<%%ũ+^ײ㕢Lt?ھn^233M7|#6+jJVo+`E ՠw[3_    Mw/^=*UH&MbÈ@@@J.#|朁w@K@@@@s!9?W^ya dĸfg>1:T@@@@@@@@!`322K2Sxq 1b@@HА#G:B? >31` ` Udƍf۴iGW=m \@JDjpݡCdŊ9\FyK.1k׮}IÆ M]l8n۶uQvwlQmiZq(nkg봮kkel{]gm0W_]dlO&vߋZ4tSn>^ؠwo/|PG@@@ ԫW޽{zժUM]xSuf`(   Qg97 91f@@@@}]^ԽPk j AV{@@@@@@@@ s_(֒Jf  )SҥKMcǎ2vXd"X i`@4h^\Go-i]QE̟?߄1jݮӺ? 7OLsӽϙ3Ǭmw}ٳgΝ;K}us=gׯ_|f.~K=dȐ5L>SLi/v|WraS`pNصzBXfYv+sss3EEEO_', @=\Yk0jג={K/dY{N:fNs{QիW_oQ`_VZ/K7nlE_>35#7ړզSNM?III*,[e?l_]Ur&M%ys-~/2    P AҜ b2;欧Ĩ#ڰawH@@@(|C?2qI3@@@@Pr?|OM%ڟqJ?e @@@@@@@\Ĩa3Y@@ضm<f2c \rhOїKzi'1 駟8ݻwo}ϸqD} wZbE6宻ʷ޽`C5P-w;mEC*m9묳L5##۶v޻}l;]oh`UC6o\.mB4R5 QR<o׮3Ǒ#G tںuEGΝ o m uv:(#F=z)モ|Ь6l.s[l{&^{r;ld¢)+U${6l|sA/,Q,Μ9<'\|fzX!6n g+W:C @gOA}a~` &ǺKfrr oc׶{WoʒѣG\V \pizo~O;Lݦ*E_vؑ8N:5ߺ4McE3z_ 4ݵkh c 3_    Mz9mACxOUVΠbt(   1fgSL5k:T@@@@S ))IW_}^*~= F/=@@@@@@@HblР 8u*  x]@0lҥKG)>|5o޼~pBiڴl߾6kLgu5I]WհaCPM6IZa'pB[|5mӷo_T ool;^E*KR4J/ܢE a \|zꩅv+@N:$֭ QlݺܹϚ5}A6Kwt+R<<(]tm|OqzaB{'JsɚwQ}J E TI&ٳufWl8-kiӊYωgyYvf_4d .w}YN_ QƎkcuys{QǹꪫtMك.Ѕ5(UJB;h Z u}^AWv*(}' 7 _~yL t\eҡC:t9W^)2ߝ5ZC3ogϞ8t+{Mjy饗~7wp_-[ʒ%KL[>|9:xz!:nu@@@@BB34bs6R?o=   Tӽ~b:"   xH୷rFy$QOnnܸx@@@@@@@@BP 5pݻw*  xZ>O>ČQ&N2 b9 ӟdvYl]> kgҥKvM͚5M@( X*iѱw3L ,.J4KmB-Z$yyy&QC qtQzJ:UVM~G1bTrrM8Q*UL`^jG}$(oly5\RqGѓ5Cp MJJ*lNÛulkр5kȨQL? Eu# ͌3#iȢ{зkʕ+qo3g2kjW_u:b   xJ@u-ٶʽbЃP@@@J%q{w>u֕iӦj#   ;dfz~Yg幉DYΡٰawH@@@(F;tB/RBb    nf2SϦ <ؓkavl{@@@@@@@@%PV-gH blР3w *  XhL>݌NNё2` u@ {!Ce]V]٧W\qE)os |7˴/;!N3    P br1IOO:uHllENNS-VZ m۶>N111 A@@@%0o<_j/k+U@@@@pkH]LgϞҢE ON FO>, @@@@@@@@ B1T6lLwN   ^ >\qiڴ׆x(@c94a,믿JRRRfأG2N(c~_Ge@@ (YE@@@J'`uAG)]0֭[˒%KL͛m۶vl   @iyvɓ'Kƍ"    a.;3馛*1za<        \ȷ-A)))>]  ,FrW@~A*U6maht        H$1֯__%77Wb@@G-{_ 1Of      _34Sr[ރmڴ1ڼy=zԃ#dH   (.Cu>ydiժL@@@@ 2^u3Ѩ(@@@@@@@sƷgSw/رcv*h۶TNNh#@@@/;VonrEȑ#0,ƀ    P .IxK-*e;_ׯ_M6N         Y&6lPPA@;vF5jp P b{0!      HHH(SZZ˺kś6QG美7G˨@@@"A ))IfϞmZvmy"a@@@@G`Κ#F8u/WXZ5iԨ@@@@@@@@BP ݟٵkW>z @@ F)fZ7|;ܦ| @cP@@@@@@"VRJRn]3={\^^^ڄ۴i sݺuN    ՟2e4n8C    A/hJ~L277W6mdֵnZmg@@@@@@@@ ƣGʡC]HOcH=\ @{~[>S3O] 93AGzA@@@@@@@M F>Żm۶uGCA@@@ Hh_8p 4(H#    xȑ#f7|s8%>v,m$;;lmӦMX        @㝝333%..Y;1%%%ܧ@@<,;K/$kv P@^^1c֋N:5`+pgg@@@@@@@2 $&&:PLm۶f[l7E@@<%==LhРA2p@@@@(ӝ}FCR$        p55U\Nśĸl29zl޼Yl07G˨@@@M瞓 i5mTLnSd>    %k͙3ǴnԨׯ{zAx        @15ktfee9H4q߾}rª3O@@Æ 3K10F2 ի̸j׮-C@! @ ZG@@@@ A{7aw(c ,xFLg  +d„ f2k,R@@@@"SW_Gە+;ڰB!{ 6.nM4)ow        @xg]1Z]v*  \`ƌ2o+WcZZdee^[lYw         wcffz .5Zg  ('7| >\Sa8p3ի;u*W ;;[V^]n@%77ך:@@͚50 ƀ   dwcjj4iAg+'x3k:u*   J`޼y2e}\\/    @L:#z(Uĸi&g1:T@@@@@@@@,ྐhVV{~w Ɣ" ^\a…}9Um{((bCvDE]QQ, `yEtUػ(HMy}dL2rr˹|sM$qw}H11غukru*Sdɒ P@U`۶mdzZZ*%3@I`.(86f@@@\ 2qA&%TbzIcr?W@@( W.p~k޼yac@@@@Q@W4i[[rJ-j1?[G@@@@@@@ȁ@Ŋz *  $B@_0`kXbSOY )," F‹ȓ^ٳ5&@ @>}'r8;Yg !ТE ={v~lm   @խx+V{mM$@ӦM]H3   $p%}jN/OW@@@@ >]W\qJ6&-ŋT%@@@@@@@@D/*B#Ah@@;w /|p,1@l_\N@@@@@@@ v4Sʕ+ bT/sU@@@ѣW_um֬YӞz꩸Oc    'a{g\+T`}IA1SG@@@@@@@@#/Rk׮o˗`PA@wa~kYf6dȐo b,z?#F@@@@@@ ԪU5b ۵kWt* 1   `6o<1cƘ7 @@( ;v찮]ږ-[p.R;     @vm>kXbֿ7 @@( 7pn(͛7|0 1    Q^ŋVN:$ !M11ے%K\w<E@@@@@@@(%K4AĨgN:^r޽h<@@ j[pn7xcm ~[$1      YvA֭ J TWQFI̛7/y;J@@@RN7ްGyL26~x)4a@@@@ !Æ ڽ+zVbbvݠAT?F@@@@@@@H *n޼9Eznޮ]vCA@@ ^35WbE{g----^e˖@|A        @jժ4aÆNc@ԕ%JUĘs   !/X^>ֺu1@@@@+0m4@ӦMOLy,Y ƀ         @iӦm!A~GA@@ +VK.$hjذaְa1!u֠ru*   @a׭[VTUXWƁ   @*Ԯ];ƍzҥ:E Ue˖%wg   @ ޽ۺwnk֬q}ҥ/M@@@@GG 6tWZbłǩZ)kǗ.]Jc@A@@@@@@@@ A*Tp-o޼9A[HfAk.;L@@RBw޶zjW]`ᢋ.J~1/_>:Oo 7|cg϶ >o[uo]h)6'u֮͟~](UTReݤzYJ\}ڵ6w`2eX&MbŊDUt:GtAVD C+ʲdɒQ6oƍ3,3u)Ì(#gر~7]v!bx-[6rQx̙(&o쳏U^=:23gN0OF;"F~)U{"*n:ul}X[۹sgyYMԏUɓm֬Y֬Y3 YDkz,Cd{zW_>`KKK GVVZwMo߾}fzyy>81Yd5k QɩUj"x"͛c9C>tG9 :,hsxogT|&/^8[·Qonw˶pB< ]((7pׯ_oժU˴C=ԾLә   KVZAS6m %5|zϸׯ   I)|Ǯo?1ct @@@@ {mXٳgw"[9qɒ%AwF@A@@@@@@@@ A>h@/-%g1R@@ȫ?nokv6jԨ6D|)Wr@ L:ծ*On[O=~+iȑe@g ޽}n1=*T-nӱcG~tG}dg}v(Jw}s=7xLضmva9jJA ҸO8`G}.qr0"yϛ7/oX-EٿB4UTϯ_Nh񡲕+Wί.$vPVmΝ50b     hȗgKOr}ٳM@@@>s;"iii6n8Zjv0@@@@ 1¶oFܧO+_|}\?$.* @@@@@@@@ t|_~Oca   k*zc*S`֭As1TY@AGyQYge7v}?g b]UNÆ è o, ~{gK. Sŋmǻ@Zj娝.TX q [t[^z>uhK/JK w}5L+^xPWwu!N>dS~mx)83F+*U&MY;vp_ƌccǎua|pU]A7o6椨^g}Ȣ]H} ԏޖ,YWgߴW2߿vA?`֩S'7⷟AJߦgKX;~ZoSYKXc&?|_Jw^2eM>t1J /kLG1mڴ Qnݺ0xo'{u$ Ƃx~]/{ 0?@@@H>E%߭ Rʈ#O>i{l?|yBVr<٪t68tP7,bygȐ!֣G\?|Ai|?3`B (_~霫z*+s24@@@@ ߽J(a;w4M×*I.@c?At@@H}oҥSt@@@@ ?~i[rygOa)cbE֭k3        @"sR!ZhF6L@@P\wu )6mڸ0B10beIa:V6l`װa20jF*U[nN:u7^!}&LSŊ3?-<5Ǖ;tZSݻrM)r֬YnFMйgԨQn~жy+_[|ѢE7dZU?6S?~|yzyG{ AOh{r@BULhx@@@@RA@֪UuuA b (U֮]y$E@@@xGW^q}Q=s|&)):   ~;t`_}P/ <1Q0@@@@@@@@D  Fdɒ Di n_{17Ȳe?oeʔ)܃ft.g?E>|V5WҥK5\yZzzz\gXV\[zk\ڌW#_|^._'^mg3>={4]T?#8= ^reqϙ3~cE}Ν]wؑiM?uРAn_'|~mbuC!z? x%\bz}K2fwvM7q=`Ç7FX;Xwk֬+ڴi_G~ʔ)@ϓ/¨پm۶? LA~/^wn[vn׮]zCaD@@@r -/^-i޼Ί+,G@@@ 9/VOA@@@@ ? ~QJL Gc,        @z~ qD?  zٻw`= X &PA A P)W\@d/UX^(X6)pNZu׺).)0j{:+aU I*YdsTAUPT`N4$ٳg..]s[AQ*_邺kڞΗ7ntZ>0ʪ>ISpQGu3gδ/ry=t_Ьo1öDXy'Пz-.VDL?sϹ-ߨit O?gg|?뜪u5>0uǰ]`1B:f7w\oMe׮]Qe*ZOꫂ܆kO?5E˅ FNci* SuNx>̝6.u׮]+ -(dsα?>'S/ T\WZpn!S /F^ǎO(@R}|iz)MW[ x\x^}7{߲| ?VtuFc@@@r"?;ɺ,G}:glr^   U`ݺuv-mSNk    P{_{V2 pJ?QM,        {(AYj̘  P˅^I434!QfHYf.J|KQxꦀhEiGƫ4j(h*L,_n+Wޅ+7ovR vSV(Pf͚~_6l((ȗ-[j{.?+@Kqgq{? Rt+VB>h7sVxzxy\^NAzp,&cѹ!yc{nDYпhcfnJva]SjS{AM6ﳻtµ6l`:)]b-ZE׾s z)KǗ/C &*sܸqꫯ: ]h;pk_T pdQ>Qk֬q*Oaxcƌ\%~aLpJt4h"rM;3Sssc8u[2tP3F]^ot^2m°a_뮻]`}ɒ%.O?f|m\uU>xVC[h*SAᢐ޽{;_jE^uA2k֬ć*tۅkժ{XuUVX7o ޓ@MZWa뜭`?=:/k.y9| GpS{8YB3+\u=BI[炬Jƽ Vx{Gz/cA! aԹc.$W:uӱ{R@@@EԯKH{1@(   I@׈ٳ=#@@@@~΢]veDKZݺu:@@@@@@@@%@_A˭~]@@B&}A^E#G.d#d8,c׽e&s7[!о`:R0MN\'QDh~h6tPxGٱm\M )xFRR*Ud c͇ 9\\9~z0)+),G SQPM7k۶m.^X)Q[zUJE3=a E~^uwV?gdˇx4i WR`T_](B4l{1w)Nrz~VW矟 t*mԨQtR{Glȑvq1֭[gh/@4S *]{%Oz)Q]pǽ_e.cǎn͝Sd|g S3p@?˝}Y;SiԨQtSٹsg7`KX:lٲ V:WV/n )Twxz@+NE:sz]R)BB"* ӹ>ldXZV@V@Fȩsjڵv3gm+3G9J-3e/1''cy~AsګW/U3Y(Hoƌ.'0LƢGy)L>۽y'/;}Xd}5׸pV.P(`UZlР;PDVb7_|ᚻ ]إo[iuVF'xXǼ\p 45j@@@D^ .ܴŲ#@cU@@@ T5k;    @|ᅠA>0=b8ʨ`{ԩ         (Eat1X (Z0f@@ (@+* PMժUsK"۷~Tb$Y@E ;!B-{=\kLa*[)Y))* ,۷x@x6|O?4i 9tٸqk:<=r[~ޮ]\h_\1)C5}{](F)IWz6;Mdz`5k%K؏?iV}ѹ^NJJxr SQ߆燷 &MD=o(kO%󎷈UN;wVJMj8T(ݗ_~*ZA7xiu;vOqyfזu~<8 .m6³zƍy,V(a(TN7/8<*pd.=?^͈ss1A! ӱpYgeZS^ 6t_xL#'(,2s~*c^z~` iaƟt.פeqs{{+֗^z=?\=`IJo?c,6pUIC2z^止~S@@@E R_bXa 4   _||ͮ{{mQ@@@@ L:&M&w~^>U%b/Ƈk@@@@@@@@ kB \R6PAI)@@ Lu TG$]gPPP/1z Jw.7ߴW^y>[|mݺ]wߵwyDžE룂fΜmV]s56|p{o:(Ge\|)U&ͽu#'ӢPpNv0!- Jx^Rf{2'xzaz H{mȑ Ν;G[,ô^{=VV۶myM6}~g2 Lv {FM!e*#2okU6Xg:l7.Ϗ'|y'V9=ѣGx(9zIo_|EW9D4*VsҥK!u tgyƏ]uUߛt|7o܎kQ}_ȇ鼘UƔ%cXWv&~_65l0)x1\|cyu+=]݇ yhіeߐA駟,V*=}cxA;uӵ| X K?1c tHIP}8XQ S,YG.ǹ9|heŭ_~S ᎭĘHDwqCa]v5j_ܱc Mtey;w;+|Kѯ{|WݽBLU/kpV73O=^VudVHdϮ*U%;/?/zMnΛ?u6nh:tp.^zu9U㏷ -e y~hIJo(D'0c [n۶mrt^   $w6ծ]$3CG@@@@ov:ֿ1Ӽ( _~%rݺu:@@@@@@@@%PBi`BXDh A`ԩvW-)k} SA olʇ Dݺu31̛7ذaC 6vXLأGOoхռK0D͞=¿y܎pz z]u]g_uxvgi夼曶k.\QR%l'f͚ew֌sBnGGYZƇE[OKUAwr{F>+Wva;GOc>C믿F B[8 EH~Ga_VAS2oA~˲~MЇ0~VTLZrei90b7q駟fu.L)>tE `楮c=N0g_ynZxV5n8<:   qg{m\UV[4 bE"kp   ? 0\)    D Gv˗/o_~y"qXF[R% _.X@@@@@@@@-s衇>o1ū(\Q>(we݃GAKeʔq=?D־}hda̙h"c=Jw* msUTK" _:;}{ 7|3,s/?&އܹӖ.]u{ .:(Nٙy~قv2e95Q޴i;}Wqo-5e-iުbŊviE]}Μ9QGU-[mvOKy''{xW6}Sohz/^W:v.lٷo_׬sF#:?#   @Ճ'ߎNR$ТE`>    ]cG@@@@ ow]vUV- FUԩSy0@@@@@@@@$ Ѭjժ$}  @A \z6o<  K J@C][tUWO\PnONȽ.ڹsgSӸ袋\ \|]=}O޽óX?裏vy{\>' ر&M=3cz;묳2 jIHVNetfW7ߦ¹|h'lk۬P]r%Qh!o>dw*V˪h9^%+LL*76U~/}gti$6mM:5r-XK7/i|*gώz(ȉ &%A?c4ǕY x'fdN<NvF9-߅n;+\Naĉc=J,ɴ4;<|׭[a[Tr{cϫU^;:Fچ]6Y S(|o\W_}uwY 7mСzLб߻tPڇ)VAzEǛf襠x]q)msAچB) teޗ]|\p_+`͇K,M[oUjC?CuIdz\y啦sy%JȰY;Gy;n?|3gNz|rSw~f@@@R^bŊ"?_ fPIj}ʌ3t@@@ *6lhcǎo4l @@@@ ֭[f39^bETQ K@@@@@@@@@Eԉx]d@ĸpB[~)Є !Y @( MQ(/ e*L/=Dk~v 9r^֢E &h"5k[L2.ȫxQR_5p=piQ0Fc}8;w}UV-ô(lﭷjvucǎl2k֬o0ߺЛڵk3<vx0;>Ø+k}1`HC]9㛈>ϯx?)KaSL~Kn xP|k7J-pI'Rqn?>@-<-\~ d)9J%7jUQBrS">\Vzυ* O9B=l2etw-￿;hww뮻΅zsi]tg!`vr[!\[s1VJmʕv衇!m{O+HSajC|.]ϲ:+*X0wg5o~;*U-Ėne۴T 08(Y={tc nX]?kU`pëXoA9+l_~yk)e?3c0ά84h]s5{M3*ݻw{7Umz^;y9|kK:}Urgs{z>{lwRe=z\5Ϗ_z%ҩ}_̙3]? E_Dw}g u,jsux y   Zԗ?WO!}6c; ГGW@@@ {#Fp/UZ5A[Y@@@@T~{17 &P) %Az?) P@@@@@@@@`ʕ+g.0]ԃ3`]X  #+(F ZAlWTƽ+矻P)K;=3M?Wѱ;ydZ%K*`ۄ \Hƒ1E+_~e2<. k=Mf Ejcǎu~ZA7j!_z饦O>zeP99)wuL)PNCAuF<F)cƌq{03.^8r>kQݺu{Q*Peݺuٮ3c=|1*Pu<7.Ga =Ȣދi=&osOB3u }v!'uWU@.`SO=uEz#x۷=   @(^x0iTRBe˖.q38 %M'@@@/0eׯ_?nm۶ SA@@@@ Rࡇ͛7_|թS'rB؟?rJ#Ν;U.8p`nVgY@@@@@@@@bЅ0ӺukwߘJuV]XVE>c\@@@=guRAA~iG#F0PȩVIL<ᢠVZI1ШQ³7lBSP}E)<[nt[ l$-Yfǚ4id;EI@?T0 ۭY;+-|LcO>[D1-Z7Zʕ4<]\!tkz0ܜm~sAn 6tӶ2ڵw߹3}Sl3]fM:ս((R]]v}r}IsO W^^t,tAVZd}jگX;(@C*RpTn Iyk*0dɒ9Y5O,Y"zӠA T>Q^#rw>i]7eO\   Gਣ> Hg)'0tP]=ݻ 1   @֭[HA@@@@ +>~WT)[pիW/ Kv4+VVUVP        @tj1n޼9ћJup_tQq   GBu &n4 lٲ=&06mڸ[u '\\rvG&|;l\葂(@b\撡}O۶m-1*"+U^ݎ;mZZ U[pV Z -7D_+t17cRu    O۷ͭZ*SI--[9sfP   Ptӭ{C;t`Æ +:@@@@ &~؅0j.0:+ceX @@@@@@@@ Ĩ0ƢZb,  :ׯ>|W\aw^  m۶$1@̙cJLuQ1JFXʕ+FƄ@&L$L@ &X @@@Xzu0租~ TRK~VR%gΜZ   yx;p /`s4    PnJ=l})]WX4QVN@@@@@@@@D TPmb֭nŊK&})C  @h":

3 @@@mڵAWZe[lӨ@-lɦ@My)   W~;lw\^e}@@@@B.yf{衇(l|ę ƕ+W^A ;a@IDAT        QDo7گS /L]/  (p믿XF {||TAe˖z, x&pF p'@Q=j4~oB@@(˗/Bp-Zd[O!-[ F}Wx־}=]E@@E`ӦMֹsg[~[βo1X@@@@ 6֬YF}XƍY܎xn *X2er:#        @8xq˖-1+,Y20-ALw@@ v?nV@mܸqV~dM(}u *   @hԨk׎2@@@! .LĦh3̙3}{@@@B*n^x͞=ۍUVO2,@@@@x [Ά,QDpxn#ڊ9F0>        PbYn]WY|޽= @@`OuvNjGml ƀ        7hA-[4 eƌ=   @!;lĉntUVW_}*TPHG˰@@@@)p]z&Miji+WAvZ7ի (        @ ϣbܹs\p<@@`zw;udrc R XL F@@@@@@ @ ƅ ʱAO^@@@"+;Ӎ?--Əo7. @@@@ #C>Q]<'ٟG  _o_|[y}cZbbk';v["1      M wI bo7TN:ӦMA@@@5k b'pBl    m˖-n}b@W^l ƀ         @> TP!ؒP0Ub,BO6CE@'0a{ݣҥKۋ/hժUؾ}{G@@@@@@@ wm bq~ֺuk˗ۚ5k{l@@@ ׯΝ;ۦMܖ?|kUG@@@(,K.#G/_n2scc +!        ͛}Xr E\`ƌֻw@AtP ,cǎ{eʔ T@@@@@@@#?+f5ruM۵kW|6@+.ЦM`ӦM T@@@R_`ֵkW[`́hGN1@@@@|;++߶U5k1ԨQ#SA@@@@@@@@ ?A[lɏM&6bLʧN!  X~uߞ={Z߾}-E ۷o-]tP       EԩcdɒlV]u6Oԩ   lҤIn 5kִW^yʖ-c    "0|{ݶTb_}l77 իWc!1        O1:ĸlٲ|g3  -{n lnڵ#Fw7yرc[DX@@@@@@@ ֭[~s5jdM4 Ѕ()ЦMӦM T@@@R[`رv}A/5h E@@@@U`РAsN뮻ΪVOƍMAիWͪ,        @b/azK *  @z-75j/leʔ)td@[`nK.et.0w\3fL y>&["f"a+l@@@ /^tWAXA;v SI-[Zm6}8=E@@R`v fGuT     {wƏY]uU{ZHUcժU+@ @@@@@@@@ ybsQrePm޼bL  8q <5f&L s@رm|.L7  9sf %j;    F`ѢE bo TRK\rָqcS>V )   )tR;3o߾ve`5    @ z;u 3I\}"XJ$]A@@@@@@@( 1,ׯ_= /j  @a3gݐ>;c Gؾ}qҥ.       x ?(AEJVZne ?)9:  aO+V8;Ά^E:    @,'O'UիgBN܌ h,        @*T4/B͞=TR(s0v@@lڴɺtb7ntc֭]s5f| ر L2Eo8uֵѣG'|;l@ ne˖嵦=H RJD?$   @}5ZjYJbL" Ɨ_~mb֤IDn@@@ n^xM2ŵ۽VD. $    @ \wuAo66        ˗6y^+ beٲe1z @@EzasqhӦ /)| l߾U!{D"Tb}IDӴ (Y$5      AlӦMo~vaKN1йވ/ӦM.]#  -bmʕ_jժH&    @3/uEֻwdZRxnzAcnX@@@@@@@@  -[Ļj/ĸtҔ;E@.p]w٫fVZ]p\rf*)"zpay&      b,[ծ]]A*w:@֭NO>=SA@@H qw:f&Lf͚F%    @ܹn馠?C 1}DK_=|.hWDVs,        b (ĸlٲfPC@HI'ڠA\ߋ/n?5j(%B !AaX`u9^ kf7͛7[T@H+ɓ;@@@6lhŊs=Az0w\kժUE@S[lS)E@@gl;     S#Gڼysz9],4u9*U         <1\5@@ f̘aݻwt7{N࣪>?IIHB&ҋHS@QYV\,ֺ+"/EEYYa"T*һ>\$2)9s﹧|g$.7t^Zv%ΝZE@@BPrw;z*%X2    @No&,,L}ݜvg) Ơ|.(@@@@@@@@bbbD? A~?_oN Fo7  ;'NH.]$!! z}7FBhKTTrW"##E7  ] .HJJ#""$66~v  }I)   ֭[Zj9uPF6N*#P^=Ĩ޸qh"`D@@@PпvY9bߺuk9rd(Rf@@@@\:t?~ԫW/iذa.|]xĘ\ {""@@@@@@@@ 4@s,X\9!;pS  8{Wvm&zOgk$'';-ԩ }ѣ5}"?,cƌq;C͛v?;@@͚5e۶m1@@@@`˖-,wF[nFqmcs8hˆ b"  ~(p%ݻoZ*W,'O6t    3˨(2d8gϞu,XЩSA@@@@@@@@fPb,R T } d,@@  $K,1*UJKν <x3=       {[nu:s bƪU}۷o @ݺuN    <32k,31=sRhQ(3B@@@W^yE.\`OHŊby1I;u*        R .. y_Oc-[L FzT   ?O5jiuӦM2exv0dg1:T@@@@@@@\ARZ+U$vbwGN:7l8g   @ >\FaV)SNz\@@@@lܸQƎkz(R9-V]B@@@@@@@@5SJLL|>6ٳr9π  X|<4mԹO`p b̟?,u       y.peٶmG*U$dm6y>i&e HժUq7oK.e@@@Ygq=zvm}*    dU` Ѣ!Hq/qbt@@@@@@@@ .HZZwmNs~>[  {ݻKJJygo߾ /^tԩ       L`Ϟ=Rf n۲eKlz}83E@@B@ᅲ^z9!D@@@@ ,!*V(O<7 =bLHHpԩ         KĨ!ϟ~7kn~L@@JDڵ?~h׮ 6FC PPA@@@@@@r,XV nsm!^nݺN@@@ oN:'E|ͼ#   @jj<3 "pd+1..m@@@@@@@@@]IHHP~7A~1A@@|GV*'N M51<փ      ͛k֬mE?ihU^z7lԩ   䝀۪!2hѢ|gwbd@@@@e֭f͚5^z|ϝ;'>>ީSA@@@@@@@@pN=+1Κ@@ P^x>}~…eƌYŋbt(       9X~ӇkPݨ!7x}vtm >1؃t@@@ (wO~ʕ+˗_~)QQQA^    'N믿n ÇR-M~m4sT@@@@@@@@Ai5@@ƌ#b|/ի"CCA /zj :uJJ.-UT-[JLLL.6hp5$11Q4Z}3+{ϛ Ňl v[z)_Mz{AٷogÆ =ᅲ$)S˗e͚5ۨQ#џ*99Y"ͺ0TӦM~>/9&*URJ]sǏ;wvoNNS7j֬) 0i&VZR`A?,GukE(WDDD\9ycGGG;vSn}ƍ3ȑ#{nK-]?7tp;#XWAfuK&5lC@@@u`>oj2X3߲e}{w2=~#7+Q;vLb   @ AɅ ckE1ի'tu,YDzq6;PmgϞgACh]VK"ERJra/XåwY27xٮ:P]={ք0j{lXXSѨMt)zm^XEzn3 *]w%:sʮ]L ĉM;Y]1۷nmgG;Wk6?~\;JOXf U1zQkԠFuҋj,Y2Üm3fpZav>33;x{NZ|yܹ뜺k_Z) ~;v<#`    u뜙6lЩԭ[KݝTKo6A:XE@@ #/O?TZjܧ    @vZ.]2+R<l椤$WNt(        X ..1!!j\rcC @@oN>m}Nڵh]{ <_KΝe֬YY^jUݙ0Pg؈aCw@!    4p;9}_ bA:u 0s@@@ ,Y" !CdY\SF@@@cɓ'_mfQJs~gO)LX'm"        SXg< brY9sLs~@@/RSSGNMڵeĉB_<\O&MLxiF6l M65}v.dK,jⵊ b+^GJnj!6Q7hѣ>]zb'=c=ou֕iӦƍw)eSL1m׬Yc~ы[B&駟d۶ma; 3VtiٹsL4g2    @< b,_-Z Fc;Sp}T@@@&yf{ŋf{L^|EG    #$ӟyܖ[@@@@@@@@ 9%$$8P F]^ԝ  O<\TD 9sĘ>a9 7n47p-/!sp%::Z{9eԩѭؐ@>}Z4PN]24 G2j(3åcǎRH^ 8P;Μ9#/mּv)Sg]8v"    `bcc{W[}rر5e ߨ *df/   FҡC9s2rH (    A/{ɞ={:۵kg E{a1^p^O^         z[u^.o b G! @ ?L]-KXb .9#c G เ}dΜ92&&F dzzs_; gҲx_7_ Kfט1cl  + NҴiS{sXXr-mw_~1nX1/_6ۓ 9禗3*uԩ,ޯ_?~ӦMΚw0}t}Ws>*E5f|y-? Uƍ-[ʈ#2モ)Sȷ~k~nxe޼y&yA[v rJ[ 2D-Z$ rQџ}{s޽E_(    @0 {ٻw6KӐ_J1}0Ěo8ǏĺY$   gΜK0-M4 &HDDD^N@@@@D@w˗OZ \3.}p'R@@@@@@@@ 8gXn;wT@@|/=3~j) T1 Y.y+аaC36={6[ e˖rwׁJBdݺu2l =̾wu߆ڐEdڵN_k֬q궍 $tvk+ Rxq3l[m6ZڵKN8a9wl۶]ߣf7n4^zfy 783{^ڴIĨϯcǎ9vE_ ? *wyꩧ =y!s>_ ]tW4?=SCx \Oe y!:NVLHNj^aَ   - 4Zի!ѡJy_ީSA@@}CndӦM*U̙3@?="   ?/ϟ7ksMkԨh/\GCA@@@@@@@@1^ ^\9g   4 O>A>Z^}Usg` P %%řA|"3ψ}`RD 뮻dذaE<Ȑ!CLepL)XI_Z*%K4]ex1lH{*Xpa)Udhxk+AݧAg ´ˆVBe.]ڄ{_kPsƍ4-ԃ2{^j^+>>^Zha֠뮻f0 \Ç3k/Ϯ@ <{7|#K,zoek6ګE5\I& V4wsi?~tUbcck>ݴiSRӗ^xA4Qg/ZHԩ#-s{~s@@@x+W:k82|VF@@HKK~W_}ef_xq;w-@@@@Xt9F*Vm F=        @^xm z P`  @ٳG:w,ϟ7?r<$"UVIh"@? +q]s&eʔ5k}u4h )P,[L\/Y[Oл<õ U:uJ~'Լys^ˑ#G!6ON뾲JJJgϚ^.]$'Npgnls=g`FoZ9F%!!A/ Ҁ6mK/dz\ <8K=d]\;b[Zaam۶5~cr]oժUsk(A (Zs .ŋu@@@*+V8[Jj$&&&ѝR`loР3;u*   + /8AgT    @ ȀRpa> \yfUmmE@@@@@@@@W$`^<= A `  OK4 Bm&~i^O  gņO"ʖ-+͓-[_|azAV=AK=&$hC=vv/^\/ÇgWk>{Zlk@Է~+iii!2uTѰN:Mw6Z}ge"""iiȢ5Xˮ-jbtthGc}q|rg:~5<6p>'uw祾Ι3iCQm7z„ h"Ѡ0o:Tg#FMبQ#yI&sݮamЭ DGZǎ+'Nt6}/}_۷?    @0{2W6K)_~u1ܹSuwO@JLL4}    eذaf!;~ΫqƁ0V    7lݺ̧iӦu"1&''5'™7        @` ^ _/&\P!9s߿?0Tf ŋ{m۶T^6 1mr,NEc9l ԪUK_7ao=Zv*;vvW;P>#FaW՚_s >P5z@Cz9| `A--Z 1֯__4ж7;r_XEɓ'{I3iџi)4{ҥazŋ~Ĩiz¤TRRR%jvv}N韗+VSNn+a;wb?w@~?.'VV F=qq&P6d'uO3zQ<:O}>}:ʠ+'|b7mݺ44H}̬nwm6''$${ZƺG@@@x+V8kJbÆ ?6Ǯ] FG1* bԲ~zo@@CyI~$--7ސG}gʔ@@@@Y`РAh0p@W^ /oLRSSMSw'z@@@@@@@@ȉABZǏ؀-  .kn3gJJr}:D b G@BLsǎ^]?/Dx?S:wٳ_bl@XN/5Nvmm[}aaZ@@cǎ7| ??ƍ{wPzG y:uE)@5̛EEF7tlg={v?a˖-cǎ9NCϞ=kmuo_X -녣3,Cw/_lo֬ľx9z1Bo޿˗/B .> _qݮA(/^ѣGڷo/ܲefߨQdɒ%@_^|E &8a>k׮}3mFb4C@@@B1{ҵj{d@IDATxM6..δ׿PWaÆ[N@@@ {?t<ݽ+#F^g    $y'ߤ`}*9Li{=         @^ ؋Ĩ  xO`#8n>M[bͅؽ{ >t7VZZ,]馛5˵?Ceߟ~I}s\Ν%}@`;t9:͜9lmѢg̘aٶN/Tmկ_?3k=w +ꫯľ>U>f͚e)+fuu֕ XR\_D )Zg֭mfGGGKn}e:o`ѿ/rV[o]>gEv2|cae_ w@<YtURSSEͬƊwfMndɒʕ+ ?d#   *sN9z~%9slm~utٳgاᅞo[UVYc=&ri^xن/^DDmִ$w.]tsjIA2x饗;vdl{W̭Exʔ)2as_6v_Nn{#LAεk kxsbb.    @@ ,_ܙ-=4mifN%4~fһw6 0[@@@?N:eBssZw/Rd    A#q6̬G5jTЬ_ by        +@㕏=AWzp@^`C&TIڵP@tA4+ [/jժRJM6ӧJ#={t~+ 0tn@9sػno5N E3fT^=ݿLXljj.]Z*TWX1۷m5IdVgעwEumO>Dڵk'0 6 oMpgRdرO=lIآE 9rζg`Q ԹW\]$D ﭷ0n馛2싎6A<9"k׮5ڷožwN|v2J&WwO{'=- 4jH N.\GIڵe۶m7߈+kC=zXmڴ˻+k(Q|/ݼyb-!xRt   @`(zSҤIի TJ@߿{@@@s .HNd˖- |ܹs%>>Nh    znrriyN#e91_> j8        wϛ d`; S@@rWԩSu2kϡLo(fh%E7xE>} "ҋ  ʕ+'7Q4O/ l20@ ӯMJ߾}ګߟ*Ud Du1| ,sV5jԐ+WJ޽M` 0FQr.z|LP2jΝ;͗ 3`CceBMRs֬YN'A-3f̐_@ o4xѢEnz7xÄ"KK'~$;y{Z4h ݺu ͥ     Wu Ut}ǬYhhw}G@@@@?ܳgOYji ?(Qƒi    @&M$ .4UPA^~u@k5i,R>}ڤaII@@@@@@@@J@/``33gzZcVMNNsw 'f" d.$m۶+VE]w]H_|a߿_ʖ-죂' Ѷzv]q ֮]l߿=^}-@XXh~QL@Ҳev6}o~o'@П5N|]oD͚5   T`xm۶uY4i1;wNn*kjʕ+K"EԩS   O<-zu%    @ < aFBz|%43 =        @^ ;`("˗7A@@ O=L:?Ι3G*V^9 1tkV@^ L8Q+;t);rLu#~m!ƍֱ     @0 ,\YNN ի btTҰaC~nСCRt[3F@@|(/ˇ~hF̗/L4IZj0    @( ,_\Fmת5jT(-k8Ό F+-        @^ 9C'$$8PhڵkrAB@@ W|]CL"7|sM'AHNNiӦekzk㠬 d1*TP@@@@@L 99Y|ZժU 5k}߹O%5jdu~t5l@@@ 2d3^_>Ν;p     JYGyD̲e˖ % FLj@@@@@@@@ 1;w.м[Bg{%Ѡ d]?_|3fm6q!.@c?X>> !)S&[#5m4[qPFg8B@@@@@ VX!.\0Kg6l(111e˖SȭEK[b"  kvv9Rܧ    @n ۷n7o.?xnAĘx"        sxgL(_co>N@@ kϗ~9ߖxO< s+Z"@ׯ/Eo     ~,pBgv9 b̟?4mT,Y"{Kr@Fj#@@@ Isv 2D ܧ    @n l޼Yyӭ~Nc_:tyD4@@@@@@@@kcBBG b ljY"  ]Vw.)))fO<<=if SC@@@@@@X`^M69sV>.]ԩ@ٲeTRfĘX `   Ν+<\|ٌ?I^|E/J    ,E߹^UfP&=b g !       p bBHAqAH?_X<        1f|+& 0;ݛ[@@2ۋ1jiР|i{6"AEK@@@@@@@>}[A111ҨQ#ѣTKI&΄W^ԩ   *esn3g A?p/t@@@@ ?$$$^{1iѢE{x`DDҥKY韶        A/_طo_ ؊  p@bbtQmfWZUΝ+?o^qw@ K61_|Y:       @ ,Yb5[okٲeNJ` h YfM`M"  ,c;_~1=lRL"<!    p dΜ9fc2edСW6b:1        @.Ϟ=Cb5Pɓ@@ H^tҲ`)^Uc'x.p%8""h       ͓d#ѥK\!1W9󬳸8Uƍr…< #  y)giӦ9rLq2{li16    @8qB~igF9;xU A^#        p-xɹszWl:۷/9X?  V --M+7m)b+Vt{ ;@ 1f݌#@@@@@@@1cA-ZҥKq@&M̤ׯ0c@@@ o]8`zW̛7O\A    [ʱc=zH׮]ݶe<b̗/D        \]$8"7 j  ~ik̙3vW;} {g6@@@@@@@ og6.XvmjmРsӦMrȑ\|'`uիWn`FB@@@ѣҦMٽ{M͚5e…RH?S@@@@v)Sĉ2:9rd/okӳ>B         -gϞՐu bܻwo{ d&oʈ#̮|_|!-ZȬ)@ {>Bp*}vOچ \M`ǎW-BDӧ}1 c   +ɓf:t\Q۶meڵ_ xs} :@ӦMA֬Yԩ   .p ;D??J*h")VX/!   /" pf!%KtSAz-!!        N@?-IIIBo8*Tp۷ϩSA@U`k;aaa&Dcǎ b,f*|r/  زe[/     ̘1éwթf]v[o.,X@cn5kJ||;wNb!}{=!GG@@@@@@@ dfQҡC,Yfg^h踔Fg>x`   @ׯ7G)SƄ0+W. @@@@ :&Md:(V|G#sE  !xz@@@@@@@@@ѣBoe˖˗e޽ ԩSE_{+BC#5{=kq s>䓐]? G@ҥM111x@r ?͡   ,7߈ii۶.\+Ր֭[̙3ȑ#i&SWƢS 4iĄ(W{ǻ;   G.\N:Dh"hF     jǏ85jy@%O<b̗צ)))y2QE@@@@@@@@U@^p믗 5@q H޽ 4H^WaF#7ޡ8^tťf@ y6     8q#ѫW/JvL Yf V"Ѡ  $!;wKe-ZԄ0V^=Z@@@@\@C5QKݥgϞ~>И^ˌ6M==v        xM1DGUB rQ><+@@ V\i..wECѯ_?yC#3}F@       /_/¬DֵkWJm FJ` 1ge(   @ $%%w-/6K+T̟?_n`[*A@@@cI&ɓ +&}6FEE#@@@@@@@@A:gJLLL^O/ UVIZZݻWnF@@|-aر? ݣG=zz*@ |<>u!dXxvfof 3f̐ʕ+KBB4i$З@P >>^V^+cI   @h ,]T>l:t ~T?w7]|54XzqG},w!ׯd 0[@@@ s=Ȃ N]YC6l1[@@@@cdN~/^ܹO%o<`˗%55UB>p       @B3gHɒ%\ B@BM`Ҿ}{џh}j<<sSJŊ{:u*  @(>|XٿY7,f͒ Y#~'@=$A=}ѣz,@?3 Ƽyg Yl۶C1   -Z$'N0vguh۶DFFJJJ̘1C>rC@m F    ;jϞ=͹XآE@^sG@@@@ʀᇢat:AɞF;@@@@@@@@"PP!_ Ps F  MO?dV[zu? , ѯ&      ~,0agvzrޮ*nV3?,[l5jH"EL1z.@@@gr}͘ ٳgK˖-}6B@@@@@Ҥ_~r)һwoѣ8~(qcTT3$N@@@@@@@@p !G| *  v֭[J+U$ .ŋY-@?>@@@@@@C2m43|wӉuoƌNJIӦM̈́=*IA@@M@Cbw䘘5kj*Ж|@@@@@`eʇ~ %x$'';u*        @…aO>C+Ŋ3 1# gϞ5 ܰaY~2d V 迏 3C@@@@@@2eS|:Ν;;P\EΜWZԩ    !}ɓ'j̙3uց0}    d[n^x*,,LƎ+< r<b7mILLUn@@@@@@@@%9s&O௃VPLr%&B@r,kر]UT)XbM ssnH       ׿EϩSn͚5rQ_ 8(мys+W:u*   hc޽eҤIf_J6m}@@@@ RRR$A+ %y:!!SA@@@@@@@@ / * {iNE1 @Jz.]dŊf}ŊEIժUr, @HKK3ԅ@\&sF@@@@@@-{nժUf͚eТ5kVN<hܸDDDWZG`X@@@ kzQ={ɓ́QQQ2m4i׮]:5    $ꫯoz]۹3xK譇~@@@@@@@@#Ppa0 SAzg޽W  /^nݺW_}eVSHYpԪU+V˗/; !ٻ0aޤR{ {/K5jTPb!F]X{2* 3Lw3̾眽Z2w+!@ @ @ @n馬a:x\u>(bLk6:V% h"~_eJ5  @U&>Я_bZiӦϤ}5ML @ @`A>l\tE%7[o54i!@ 1N2B @ @ @ @@]PqϾBq(}Yf#FȒiٲe<ñk~r2 PbEOT @ @ @sƍ7ޘݠAg}dt֋eY&iӦ-0@^ @U`.dS͚5x jb Y\ @ @\o}7 ?sb֪Y׎.l-X~w}u @ @ @ @Ԅ@۶me'Ou"t3?> @J] ݰ62dHJ㡇 6ؠS?Z'6 -z @^xx7ދy;Ɔn++裏Ǝ;XK[R!/ic{ @ @@M 2$nlVZ7ׯp[N r @ @ @ @h۶mVqTDc< B @*U t0`@vz82{c7uLF@ (Xyf"@`R!^zŷ~-Z]w5u_}U曑 "1~b, uڵpߛ5k}QtMqXm":v㏳T;k&ڷo0Ӕ[ʷk+}+=csͲ e F=4O[ݳ>&LJ,Vc^ꫯO,~eK#zQ:}/Ii @ @ @ @jZ`BHKhܹs`„ F=G(tânذaqN;N"%PGbO _>lW\"D**xi-`ER[nC{]wU)1Ջ4_*ufƹCͯN-b7W^y%6hlU=lذP>}"}V8=? kTUi  PZUZ @ P<nywyg)^z>3y_ @5%3z"[{LƚzBK @ \|{U@ǎk~Ntc@q}W @ @ @ @jLm۶ړ'O:]t4i @@I yqg"c]v)\M -Εi)^{-_ziҤIp R^x 'TzWφ~H6m4N/|Ӹk_~qWgW^yel~+Gz?`ʔ)Nb˧zjl喱RKevOsx $ @ @Rq0z왽R q~ĒK.i%nqW@!Z @ Pi/Btoȑ#c 6D@ @ Pg_N;̠~q뭷FvI&ЅmZWO  @ @ @ @W`ϓS1:Bqc @G^{mr SP4'Q -Z6lXޯΡ=W_}5/NXkp4iO?2\9Ry?|I4j(6lH6o<5ja\o0Z! @ @%y3gfir)ѻwDPr]B[Od @ @ @ @Դ@a_|Q 1! @_lT[nvۭ([0^z5 +r,be]O?tDR14v~_ԼZZcN]pBǖ_~|~Uw6l:uʖߺe˖ѤItM1sUga^*r1'SUof"5rcƔ)S">g̘kCo=`ɓcvyzm}~6tĉѧOl @B%\2ӟ @ @AO>H,Rѯ_bG17bF@IDAT?|w}իWlz_.EJ @@4iRv+Ծ}5jT:&G @ @cƌHI<3K7BbL9 @ @ @ @ Ю]|mŎ;-Z6mgmQvy*>{` bȑkFziӦ;%\ I?ß @ P7pC̜93cѸq߅,#Fķ~K<.rB!O?]  @&&loFڲ.l1 @ @ԴM7ݔ}%ő>˒>ӰaÚ Ѕm۶͖Rq %@ @ @ @4J6LT8cmxF@~˳dS{]7%Z&c-{BC=4hPj*d̘1qWGc}'&M,5j|VXa_|Ο<' ӘD,|并}ͳO[O0!^~xeujjʊ<iV͚5+,C9g6O?^xnԟ#oV?K?mO )~'q뭷f;?NnKƴiϮ @ @XfϞ]w]N C-~Gz_~ٱ>@=Q?` @ PkH},]3<+bQ" @ @+;QG'pGΝ:)PBfj'O.lEM @ @ @ P_ǎ˄ P'tR\r%YՋƾ[q ( <0&Nwyg2dO:5+Zk-@..N&Mȑ#_\ sr̙e7)=u 5y8+Ra5Ju+!tS @hZGE*Ƙچn8W4h~ EZ(ފBn)>0`@uAG-[bz饗 @ @Hgm]tԩBuS -*RTT#@ @@U o&QO 7~&)YǪ @ @'0cƌc=.IKo;/!rbl۶mӧO/4J @ @ @ Pڵk_}Tq @Z㏏K/41a(G@-=++1 4O?4=мSeg ?s/|I>GΝ~ut kkBAĭ*ʶ}f ה=œսm<I 6bNR8p` 4(k̘1uF @(&k&#ٳgt= ' &cbZ@޽_u ) @,nivo^m5ֈz*:v蓛 @ @@%^z)iUV?ϕ0)AO"-d$mڴɯƲ.}PSV4^ P Z5u @ @ @ @@,yAf  @A :kIx @%J+6*?wqG;B̘1#nll>}M6"٦N ߿(W` 'WϞ=1k4Au+a(zy*[ߟgNe~/W\1ry_ @ Pi϶o9 UVqA{Y|-\7^<% Xyc饗(gFC @Jx衇"7dnf裏F֭+u @ @9sbBv!<ȊNg\ (XO @ @ @ @~YiӦѢEN<\cyeJJI aRb%@JD -SO=t vQOꪱ;ƬYK/-t)s9'&Mt<=GEqee÷~ѣG>GNѻwy~5P~h֭h @*nY( Ǘ_~h߾OOWqnbUV^*4A @ @jVMLlٲ#rp@>xy_4lRKEQ^z饬 @Tw^iӦem 3>Yk @ @ y晑>Ϙڲ.uJP@!"|RD @ @ @ K.dvB?7ڵk~pܸqy_ PSpABhذavm{TH%@jw}ݻw;,Ǝld?I'V[mHŢfϞ_| (k|crJw){xTH믿6MWmqfsܢLoKEǏ#G̊?ZcjҤICaS8[ouv,|yԺ(5y:ӳ<޸;zjVhٜ鞍YvU&+y @ @ @ @@ Fix]t(ĘS @5$vҍcv,KTˊ,o>҆8S*سg裏 Mןǭ&LK,"]c-XkXchӦMVp1mVf^|ő PUUKEӦX-28HE#^yXs5aòK-TWѹV^yܹsv0 sT(5yׯ_ !koq?fc}7|8#\<餓˻KVt9fu!fxk*uq @ @* p7g}LH,4k,o{キ悱rzy' @**];Crr!qmEF*:q @ @*] }ntǺ ϓVB&, y2x>6K?\0 @ @ @ @H |շp TرcK b! @U eH悩MRqTA#@T@VslѠAOcԨQYq7x#իHEr) T&MbW]w5Ҹk* @ @@yΝ]vY>$gRN/JG`W:d?쳋\ @T@OΧN뮻./6x @ @U!>n5~s.U9C\^*[>+ DA @ @ @ P~zOK,Q=&߶mHl#  @%0ss={ɖlܸqu];VW!@Jj)Tc;?~||G&]tղe׿5WyZfm1\߹_wQϿk>Xq^{mu]w *{jV,RQ>;8xwދ_>VZihԨQᲟ}O/h>:ׂZz-ME@d;v]v;Z @ @Z`&i7_{+r[1jԨ}UW]J2i ;no_|j @(@#}_~(4%@ @ P-rJ=:[+}n} ,R˳Z)X9 @ @ @ @T{Z,nKm„ 1gΜ @@u L>=vec&M{UAFbb5 (R֭[ǚk[oulk,c!, PtqxvW_}E+;VZeα(X#@ @IK.ǟtIy;~x5\u_`7σ9rd!@ @̚5+{c#\蹆 @ @57nwuWm۶ð^5 4,z͛7-ZĔ)SbҤIZ @ @ @ @U"P㧟~Z%k㫯3f̈?8:vX鈝(!SN;=Xufڪ*Pr @vEZحZ @ @ @xgήѷo\Yo8S=n喸 c+x[lE. 1~c @,HᅬGڼ> M7{炆9G @ @Fƍsf맂믿~b(W!Zwߍ'VoV#@ @ @ @ 0?y\QBnS; P}]lOgˤxtMrYs PD 1ѓ!!C*k֭+4  @ @ @`PaxQw=>a믿>書[+l:uVX!?ϊihѢzH @cwz*дiӸc[ \E @ @f̘ɓ'g/>jR5)PBЩSFk2~k @ @ @ @q|IAk׮9رcgϞc @@U|W[Gڸ-߈#GU9 (RΝ;Hj 7P7n\q @ @ @xNv1{y_XbG8∬c kQ-"+Ę6|go߾%P  @nI&e xW[lÆ ޽{Ww(#@ @ P'tRٵݻwA-8rb\fe?֭[X @ @ @ @@u (ĸ`b\ @M/*^zlvţ>묳΢Ml4%'c=e&@ 0d! @ @ Pw^̝;7KOƍ~R?Z+zG^{-+׫WZ[mO"bk4GcmG @`3cƌfYr%cĈ.¬ @ @:{'lMwZ\tQ!'N: @ @ @ @jB@!+ĸ`g  @Owy'|R#6P. @ @ @ PINu]lމ>f.i8<:fm`*Ĩ @ @`^J3 Et>"r @ @(}tP˕W^kvXn,R!Ə?n(ɒ @ @ @ @hZj(H (c @裏bM7_=[cǎSOkQ5 (;wn+@ @ @ @Tsɦ:Yf1mѯ_Hv}ŤI&6_m۶:dgbg @g4W_}=ztuC @ @/w;|M{|p.J(w!eY&bĉy_ @ @ @ @@M4j( >Wq-[ve;X Pcƌ^zoeѹsxcV*ᬄN (ĸ @ @ @ Pj>n- ;ݻyᇗZ oƍcu3gΌkǸ8b,sOA @ @oFvj5ֈ뮻n^9V]웟 1ց!R$@ @ @ @K/E@b׮]E?Hh @H7"ݻw6\X~+k  P 1'l @ @ @*,pĬYw\,b5BLNZ Ñ#Gr!@ @@&p 7oۘ>}zx{,ڴiC @ @@ \r%qwgh޼y+(w!Ǝ;4 @ @ @ @5-2d!\曚/B={vL0 PlIL81K`V~:[nLHT@œ9s*un @ @ @ @>馛ZnG}tXi,첱{d}1hРJDU'гghڴi>Zu  @8Co2dH4k֬dr( @ @@x'}xz[nݻ= ?NٍQƏ%@ @ @ @ P Bi?V,%vm8n-LT@ 1(ڷon @ @ @ @Դ@ق? 1P& @1bD7l޽{?/x'5Z)P^,ٳg$E @ @ @$]8p`bqWaXcرc{9׆铧#} @c=+2K:{g_{뎆L  @ @JI 뮻g}6ęgYJ)]1ѩS,'ƬY(4 @ @ @ @X8}%@^஻w1M vm#flٲOJ@ \̙Sgr( @ @ @uOϏ>K#v O>93Њ_o߾y?p!@ @n|ב~.;6lN:nȒ @ @>xuv[ԫWs|44;wB>ҥKE1 @ @ @ @@t1磏>:?(o P C9$ vm[QF19ϲ*Q SR ۑ^4 PQwygCg),IV @G>n!b~ /k7lXwu_WOF:*-\O?tV@iӦ @4˭:^{l-Z]wlMa" @ @U%0p͛}mڴ[b*ةS<+Ęk @ @ @ @ԄB Vܹs(رc| @y\~q'ܹs|p1"@@&)3D @@U ?T%@ @ @D=ܘ>}zK,DfRSw=|E)X1jշolsiӦSO=}-F @@ ^RT=Z*xX?+ @ @(/GuT>믏5\3C~El6a„Bw @ @ @ @5"7n:t.RqV @?8묳Nȋ0Bp?HE5 @ @ @61cZn鞊]v~w]#(|^|GJ.~ @ P>~:6xc"ct5 @ @@ |g뮻ӳ9kj(@Ê֩S| @ @ @ @HEի裏j"_3mrƧ~SL-Z}$@jV`ܹqUW]rg駟?!@b\s!бc8p`eLe #sj͚5Z# @X7n\, @uZc̜9338m۶uΣAYʣ:*Ί!C9RJx- ƬY"ϼJ)| @ P{'{|_?|Xr%1K  @ @Ԍ@|A@^K/`Z*إK3"mZ߰a @ @b=ztqy^{m#C*Ę&֭[6ĉcڴi?c @ @ @ @*P(ĘuRXl!1cƔBb$@Y &s=ܦMxGcH,G@m(b5kVmII @ @ @?™gM6N&M~rYgU{u׍g92O^q  @ L<9j۳}]w] g @ @@;l]w3fdwqqY)6 {&+s΍1jVѩ#@ @ @ @ e 1N0!6hE6M(ĘS @'f.7.;K#<k&#TXa>0{ a ԩSo)< @!h}/P @ Ps[ou[͛7;#~" @ @ 0mڴiO>b-K.)PT{ァcw @ @ @ @ܹsnP~@':vM4BB @e^~۷o|nݺţ>e 9^ +РARVu yt9 @ @ @U.0gΜ|;/6Vn<Ӹq8SR:묳%ږvmbLy=cm{C PW^|Ŭbas<뭷^]!' @ @@-8㥗^ʲ޽{u]Qz-IQU$P V /t}'@ @ @ @ P#]t?~|A^zѵkرc @2QFE޽"kV<쳊0A@>آcp @ @ @^ˢp _~5Q-6EԩSX* /_"rH3SKϕF @@ :4<@*?"T @ P.;2-[Fzm۶u 4\~~UYh^; @ @ @ @ܹsq_~x뭷bʔ)>\پ}#@!Cb=ӧg+[s&@j g͚U5 Ϯӧ)A @TK,QӚ @uV`ڴiq_|y_ߩzhvOQFHWn&1r;vl曑h @W^|̙3' wޑ>#ЦMH@ @ @ON;-{T~bUWC`*o  @ @ @ @@U͚5b3b,_! @ #<2ta;3T2U$аY={v`.{G @ @ @ԴW\~a;z鐊v<0.xw⩧aÆE2ӊO` 1Ɩ 1s$" @?HOE۴@ b N @ @ @>쳸 DA/O 3hذᏌ'f͚U+nm>: @iӢ_~?*xi-ܢcq>e"@ @Xɓcwo&jvSN9e#"0o bLӭ*٬q|^Q @ @ @ @$P(48uԘ4iR5Z:t-V!ƜBTs9'}x㍑6 P[lYٲ#@ @ @ @:<|ӿUg ;oq[o,DݻwVZ)uW_Չ%I @>lbȐ!Y>A  @ @@{e묳N {'#3\r%yguV|wcvm`f͚#F(DB @@.oFm?cZz(< @ @$p1ȑ#ZjYfXH` 1y*X @ @ @ @@M -4d(Ev׮])t @@/c7Çg6i$8k}$@f5j6k @ @ @ P'tR̞=; Cp ş|I\tE 7U*; 6, @ P=X#Ǝrų>eq(  @ @+kF/H{i**HWYe|ݷz+ @ @ @ @ ݻ˾{y_-ZD U[A gϞse n:~o[7dI@ 4l0_1i~@ @ @ @E.裏ƈ#(;w|G\|]pѸq,K/4&NX|A6xX|3}̙u\D @G뮋m&,uY'Xc5'H @ @(C='xb>bٞBof7 @ @ @ @@ -Vĵh_>?e& @Z#z2,O?tzL*([FUBlR @ @ @H`֬Y?*xFӦMh;mo#:ujvi7ͬAfѧ.F*LM @̙3'یij;S<3ѡCړL @ @@cwٳggy{{:e ٪XB-\h"L!ƪyJ @ @ @ iHj 1ۭ[nىsرc} @@ Rk ,R!zŪԩS8U @ @ @ @vƍGN4bUژ1c ]  @Z$pwF>}믿βhbѹsZT( a*ĘS @ @ @ P_|EyYi+#._|8s ΝGyd̞=cѥ{4ie}Gz4 @_?78 -ިQ/i+OƊ @ @O`ڴi;Ą #natMT"{kfq̙3'^ʈ @ @ @ @*,J+ecSI&Ux:P!ʋ p%{ӧOlGv @/6sBw @ @ @駟'Obob/xK!?<^{,ԗ_~9RĸbŖ[nGŋ/Xgr( @b׿iW^y% M6ǀ%Dq @ @(ܹsc^x!۩S:th4mڴs@`~V1-ꫯo  @ @ @ @T+[o}b| @D`Μ9qG~H7v͛7%YJRhذaY @ @ @U^믿> e˖qk%W kzeqb~iIPۃy u @zt&l'N֭[< @ @*83⮻VHa<Ѿ}*\uQ@!ƺ˙ @ @ @ Pb\[1c| @@IL6-ve_{9d-!@@5 7h̙մe @ @ @ Pq>:fϞMpꩧK/]Ɍ@=Ȏ}Wq'5+;D*B5\X @n \|ű뮻ԩS{?cV[%@ @urK{Y^wqG.O ռB5 @ @ @ @b|7+q1UiӦY2 1֎T P>lbСDFoN;nȞhܸqB9 @ @ @E*=z,VX!?"tú m۶YѣGn2,%X"R~x7jY!@ P\ӧO?+R?gΜ,}'Fڵ+`EC @ @>l 0 ue6l?!P\q;f1꫕ @ @ @c>R, [(*A, 5j4aA%1Xb("1"*VY.ETz>|hP)3s̼yws{wd @,&l;?%%%f/>#, @@%;vlk.^|ŬFŰa"-`#@@1,܈qŐ @ @ @ HSƩwW¿,@ӦM_~ ,;.͛Lc:w|{' @W_};cvm鞿}FjXgѲ6 @ @@ |ᇱ>DڀN81cXFIj7ϫ B  @ @ @ @O`WUVY%KL#E}[oӧǗ_~%@Z^m&R3ƴ1rԩSQ-9@ڵKow @ @ @ PD㳌v{eWR9cUVYQof\~UJ\MjĘM#J: @@Q ѦM5jTg bȐ!ѧO[r @ @G`ҤI{ĉwu׸+TXj2iĸf y, @ @ @ @ PM6$65o BQYڈ1%u#@[w1|M7ѣGGz @ԩ3gΜ< @ @ @ @}ݸ˲ի1`9qjԨ\sM紝s91vr#k[o[o|89 @Hl駟fg1r֭b0 @ @+0sڵk{YiG͚57iU 2i_:xX@ @ @ @ @ 7!z7 BQϹp#qu#@~(pWf,̘1#{SN iM`Fg.C @ @ @L}̙3'8Xwuɔ@۶mNfIy䑱`r#~s=y, @ @`oL6-(5A饗b-\M @ @{?|jl0W TWڵkkĘS @ @ @("+Fe0Fׯ_^5\S1gu떿?x< @ t3gΌ=zg7?C駟UW]uu @ @"8ScȐ!YV/|ZȲNU(F¡W\13z嗫 @ @ @ @*F?jѢE~F9ib+2ϱO>qmM7(:u̙3' @ @ @(ɓ'G^Tꪨ_~ZP 4n)JJJz|INj_X{cʎ{s@ @;QF\tE=֭%@ @ P^ziuZ[ne%BYL1&VZe_~e|D @ @ @ @\`M65kfU@l?Xwu1 PǏ>/r-ѷoߢWRXX`fg^-1 @ @ @ .p9Dj;:w\[:tc9&+{ԩeX@ @ +ѦM3fLv/&6 @ @UEN:)/뮋v-- PeֈuyC^ @ @ @ @B ԫW/6xlwy'f͚UTr ĪcQ~$E27|3jxWM4ÇaFBN:y1 @ @ @@^:d喋+)OZ++nzBQݻw,# # @J#0hРh߾}|Ykv5*vZij( @ @_xgs9qGi'PeֈUVyr/r  @ @ @ @Bz9sDjbdz뭗׿3f^ @6lXlvg1zرcsWnݺ1 @ @ @ ,!@ &pfO2%a뭷_|1`9K#p#Yf-!@ @ @ @@ \s51f̘lM6$N>2ÀK&뮻ǡW[<|+ @,Z ,ӥK0`@~QG#FM @ @*ĉcwN:ō7X˒%(FkvnZ+O  @ @ @ @U@M6yzZh7n\  @ ̟??zw\̛7/K{SO.;3 @`4b\r3g @ @ @ PǏ>;$EڵwR/^͛7ώMJ.:A#G͚55b,c @Tw}7ڶmÆ ˊUV\uUq 7D:uN*!@ @3f̈=3ƎYlq}(,@5bLel6Y5&M @ @ @ @Z lM1-[;K/jw @ >}z~+8㌸^z< @R hX\%@ @ @ P-N8ᄘ}īZR96k,:v6nܸx饗d"@ ?plVz+r<~Yv> @ @?~#^x,5X#yhԨQQ)'P۵k 5* @ @ @ @*ZN:1ދS(ZhG @?~|lqgIԪU+nᆸ⋣p(2: @ @ @2H1ldne:]`v38#hqӗ}`#,Aww汀 @?kC_ @ @ @ @B lv#GcADӦMaÆŸq @}_d ;s1%^nݺ1 @ @ @ pYgŧ~ͼ뮻AT,L8iƁ/~ 7DV7.]dO0!OŒ @L?vŐ!CjԨ;4hPdJ @ @ ۟{@%%%q7u1e'Pׯ[lE_v @ @ @ @ ,܈[³-[̊Ob޼yU` @"⋣[n1},m6^|x㍋(K @`4b\6?g @ @ @ P6/B\}`-\\wue3QM ]zW/"-8C9$;c @(SOE6m7oԨQfmbРAY%%%ѧO:th4nܸ> @ @j*'n}]&{M71b(Fzl2u̘1yGb,^N @ @ @ @U_ 5bQ? >^N;vP @`IҿA }Qvk=\K2c  Pׯ  @ ,0lذhݺuY&5?߯XMO @ @&NK?>;~Ȑ!QV2ˀJ1:t7k֬=zt @ @ @ @BJ itc^ȥlѢEҸqX@W^;wɓ'gj*ƌn# @Hիg6cƌ< @ @ @ @.xiR;4~9 qg3puӧO/ cC=4۵`~ @@7o~K.fumF}{WS! @ @~,0mڴc=J[<ѠA5(F;C^3< @ @ @ @mi =Xs5nݺرc;  @@ ̙3'~Ɖ'N =쳱꫗\#@@ ,܈q̙Ś @ @ @b>}dUըQ#nz*Vj*믏_WYov}ժB۳gϨYf-9 @@U2eJϔK_|p Z!@ @ 52Қ/R/M5|XicU\1v!W#ƜB@ @ @ @ P .]3?y\݃Xo2?Ђ(  @ԩSxg}v 2$4h @ hXտ#@ @ @ P|9QG3fȒڵ+De-\{ѨQ;3% K'Ǯ'Ĉ#n g @(Rw}7ڶm<@a5_~q=DÆ 4ki @ @Xvt5^L 裏Zk@K#ԍt^x!f͚U @ @ @ @Zni=1}EX l2:-84~j(d Pofi&{l]w^xa&6T'u͜9:V @ @ @ $p3<͞B߿21mylq-Cr)1jԨ|<|n) @*ߟ5aLӶ+#<guV~-leQ @ @~JओN;3{;1tdM~p @4bLUYiѣG]"@ @ @ @>Q׮]St?-Z)ƍ @` ڵO>$;y5ֈg}6<%"*ш|AA @ @ @>8ӳ ӵ7xc4hР3qꩧfΞ=;?|ir Ѵitĉp @(.yřgݺu)Sdm/ǮZ\ʆ @ @@9Ǯl5kwnm9dH'Pn;ug籀 @ @ @ @@!o|{'{вe˜`رy, @Lo߾ ӦMNj⥗^֭[/@&@@(m8cƌ*Vr @ @ @(& n{ѱcbJQ.e(pEEZw&L+^ bڵkggYf-GM @y/3e>5jT_  @ @,4LIII|ͱ{.N'Pֈqvʾ9RI=XWfF @ @ @ @ t!V^yl?loӢE\iܸqy, @O`qĹ瞛/p!3< (Ta dե/m @ @ @(/i0OSyMe"UV <8J}W#(̪~ G}t__3U+W! @@U=zt׿z*++5+;k_Rj!@ @ c?qy廯ٳgZ@2 [#f͚fmYS&MT\J @ @ @ Pj֬{wVմiGb.]9-[O;vl  @_ϣ}٢n5jĀ{ԭ[p@*g̘Q U" @ @ @H?;$nX~ 9+P`Wz(6l:hР߿fP=J/wi7bĈ j @J+pUW;_|EVꫯO?tp & @ @X+2N?/<9@e(F b]v<ϟO:tPȔ]oqyQӧOv OP-:c󺯻< @(fiӦA5\3gNjǎ^vsr#@ @ Pf O<1?x! Pʵ;Slo5[nQP/@Z̪L_upk<,s 7PdL @hӦM̎lܸqw}qG͚5lo @ @'|r\xy1 ??- Pʵcj˜1O?{2[ɝ @ @ @ @ ~y&J[D˖-sc汀?*Rk&y'ƣ>+bO@?_~C#ƜB@ @ @ @2 ̟??;(= 'yC; |Ys{w̚5VSi}ё2kٳg2$@Vix^{mM7_~9yZa( @ @ ̛7/w/̠$׿駟^mM^ʵcmr~8 @ @ @ @ !N;E&Mz!~[Ebܸqy, @#+D֭vԫW/nBX @4h1}< @ @ @ @`Yѣ!6`߿ * P~xc5̪5jTyU,y>d}1xLTV @R`ѱcǸK /-[  @ @Tetow 7ܐYf͸㏯e {#.]1 @ @ @ @ Ԯ];klɓ'c=VLgڅo;vl$& PwqGlvge٤ڞ}ٳgd'@Zt1cFi @ @ @K-;9眓_F[cM.NZ :4[n;3[*N<<+" @ )OĖ[n#GҨSN\s5qG  @ @TW_}:t~&M 80; D*J1ng< @ @ @ @)н{|wߝ5hѢE^qX@yW^&fΜQl/G6m3  D[MD: @ @ @?3gNr!1k֬t}6lü[lEIg;mkV,͛?;v,h^&'Pڈ1g=&@ @ @ @ uԉ}7;nʔ)#9Uj8nܸ\ @/ [ѦMx'ck׮]w]HL@#%r4 @ @ @?-0jԨӟ;nݺ?}wiGqDf0cƌڵk|ڤ~6 @ @A`?)~/7o=\ѣ:*&MDN/ @ @ @ @@E .XclÇw}W)|1͗B" PA\sM1~l5\3c LC!p#iӦUUI @ @ @@ {_fuMlU 6m,}[oZ^E_6Մ niA PM&M{WtI1gΜto믿;s5QP& @ @'FΝ3Έsf$iUVTK kĘtu#{y, @ @ @ @ PgϞ!(9[l䱀T53fġ|CǎW_mVrC ,܈qԩG @ @ @TȭtW^9nʓLR 5nK܎>>|xZlvZ>%\_  @,ȑ#c-z("xSO=< @ @Ng7< ^FӧO1"VYeJW @6bLԬY3+C @ @ @ @`KDZ{, @ @w{ngk(}{UN`Y*cz}^ܝK @ @ @ @`ڶm뭷^6Έ#⫯Z1+믿~ BU7>[_=;d嗏ǟg(m6u3 @ @ @~R`ܹѣGZ#8"g<TK/0;wmzrƂ  @+_.g}v̛7/;-5dL; @ @Tzwy'jbge:u>+i*}} Pڈ1%y2$ @ @ @ @ %pAeS  T4 >oi#Ɣ|P|$@B -JM4)r 7_|1w^S~F@#Ɵ @ @ @/B^˖-+XqvXZ5jw۷φ0aBn1qĥy_ -[g|x @X"{,b1bDv^͚5^K4  @ @TV%\Z^{-+v3UW]&oe.Pu⓴u]e^  @ @ @ @,@=Sk8s"]d}'ƌoqP!@aÆySLc @ @ @%Gjժ_~QG`֭=Pl&8|At%OL:9J.3 @;wnuYY,=mkFaNYfemqg |PވqV:dU N^~岭h @ @ @ @P`6-2;+5f;vP5_cu5_IU @@xu1t F"}{o4jTr-4u< @ @ @ @}r!1o޼ . ڴiü&PfM4aÆe]Ҡi8 3XfUchժUV+NAb뭷Λ+J裏ƙg%%%UZ @= 4ȒԈV#@ @ @ Ph;.>,hwޅN@yY3ƍg>qGW˷s9'o߾y, @ cx b5jTVڵK.C+ý&@ @ P%^zhݺu~1}u]7~9cݺud݊"Piح[SNw/ZA @ @ @ @`:H B6p2آE9F+)wT_s'ӦM ZjJF(@Æ LRLLO @ @ @@ qM4bY^UG`M7tʛoY#ev56ll^x!{e @UM`֬Y?!go[oxW^}nUn @ @XX`ԩqI'[ooFV^O7|3ڷob!P";|l'|2:vXs @ @ @ @ t)ҵ,i3fLi5o<>hڴi|WUFE @@H:bԨQyGqD\}Q^|*^e˖1nܸXy믿H @ @ @@Q |G[ɓ<:gUM{77/q)Tb+{'wԶmx+`VS @T?_M?p ѨQ|+0o޼>}z̜93f̘ϥ殳g ǥJ̙isEK ,cqBF飤$Ӿ_׬Y3jժ=JE=׮];ңN:ϽNԭ[wW~>t/Vzl @ P~C ^zg}OHn:' @gٷ̓>8o8p@ @ @ @ @'УGwY-1)UjGƍQ @=XO81"|UWG]LM .Z3 @ @ @rHބCՄ t-8cN=Xy啣gϞ˩2O<7|x7b̘1CE׮]+sIr'@(;#~ԩSRӯ/e`kH⥏tjiK_iӦeǥS3E[R挥ϩAcӣAX~c喋GF @&o '< @ @ @ @(@YfnZuU5k,T:75_zhݺuA0)X\^xa8m묳N 21 :7͜93b 6 @ @ @$>}D~2-Zk 6Czs9'!-pDΝ Se<5_kSS=^RRRYˑ7 @2j[oGhb_*' @pi.&N=&M揅_txUϭ5jX֜{Zz޼y;d9.Yf 7iLGjxQ5jt|F @boE_π{[ӖbR֥~}>$㠃*v0 @ @ @ @TaƍG.]{/2FKK[|&VM૯=zO<{m+BO@H n'OML @ @ @@5x'㢋.j׮Ԅy(St}UW]s΍ݻ?nm1Y)rڵkm6ƌoF 2$J$  @N 5>w=#s[6O`ʔ)0aBd믿HMKS~f͚Y8P^Hs{:uףnݺ?WVGFx1gΜSg͚/95Ԝ1cFXst_sԐrԩ#,-5k,m̘Ssƅ_7i$=?H?[6 @@뮋??&M۲e˸˲5X`S~xֈ1ŷrF F @ @ @ PP)5bLwQ1ar #G8 Ənׯ_viQRRgMЈP%@ @ @ PiC9$BiK~fm6"pWd(뮬A.]g6۬XR4y\x5w^t-R  @@X`A\zqYge RũVZt>5f }|_ϥ~>}O gVX!{6KJsRhbjh?3sܜ>KMӟ_zM5ZLϋse+mXzҌUvQcj̘{isq9 @gƍAi)u X:-XSU5}רQ#>h޼y l @ @ @ @K!0k֬Xmon0aBCUSyկ~&nJY  @ a;wnVꫯ WݢUFJ.pqŵ^UꫯƖ[nY+> @ @ @">c=G͆u]cذaQRR,:@ ̙3's>|x6vf瞋_fezq衇VGUwO<[n:R&HM>.b:GӦMcW)NVZ)o˭?x]VJ8~ 0o޼2eJּ1=T{'OGz?5-5b¯~{#Ί4 @*>ݻw+y 麈=zĀ"a#@LS;,9Cn-S& @ @ @ @ԭ[78bڴiqFϞ=fJyN-"G|AA P5lz(/SN1pXeU}(>FIl @ @ @To/yUW]5nvMvٵĻK5*&L;S927o^ycbgwyqFnF P5|8#o QFviѷoHζqG}5[).Y-}GiƋ-ܲL\e.6i${a#ݻ}us.Q*3gΌԔ8=dKMY={ǏԨ1=ǩYj @ Ƌgyf 0iҤرc/\j_>k_ϫZxYfQNÉ@j>#ow@:6=ҹ彥R(﯌  @@Z .C-".u] L`H1R7y*mO?tY? @ @ @ @ %GF'd7*wv#FdӦ}VXaN| @ kOYfeMwqs!_kMѣ! @ @ @e.0yr-?>묳_~e> W_}۷?>-SOe ܗ|Uq̷z+cW6 @!kn^PnBs~I{sj[͚5{Y^{Xgu"=Zk7^lԨђx ,H',ܜǯ{7dϥΝ;\oذa~Ѵitm @x饗?o翣^}f(7!m%1oӈq J @ @ @ P>={s=7[#5 ݻwLTl2oD۶m0K) @@U:ujs11pm&\$  P7ng籀 @ @ @%pGM۵k-DXT[VYex'bO?4^ܹs<ѠA\Z馛FF[o \tE1` D @#`K㬳Ίٳgg,rqQGU>@ ̜937~QxqܸqMV]uHph"{,tq5׌ԌF@]vϖcIɓ'SFKg)SDz|GsxքqVʚ2 7jL6l,1jE;ŪA @D_?#͛ǙgGydԩSyA@3⏚> O}7#8 @ @ @ @@ |DZzEf6e;A%N=,ԄGE @* ;~E1t;䓳Eҍ6\=P^Yک\Ȗ @ @ @e"5bL +5[kuXp?ڷo_}U6;CuVx.q>,6`Mg*èkt!D D\"ZhkH\=BԨk-zgƌ{`9_v[{s콾b0aBQO @@5Ξ=k¶5ܚ^~e5kygmcѣGE ^ܻwh{|>1tQ5 Mpި.]2Qu5_r3Q~8 ӤIc*SLi  @\ XT8x`_#]ZƦMIb]{XS\@WADC;޽S!        Ď@,Y )zeRXع՚3gNE  q)0}t裏ɒ%3֪U+.@(ϭKq!p,veUfJ( ͝;ʕKt~n}L @| 䠠 3ϧ4իv0Шˋ/Xu֐ yO<Ǵ;bPҨ۬ xb  #4Sm̙2d9p@*O>D4iBc$V;>>=JȑC9Yfcǎ/{@@@@@@@@]Gթm۶2rؽԮy5_ IF3@X@`&Nhp2|ɞ= % 2 oѢ7:A@@@@@@@ F7oޔbŊɑ#GmڴQFŨ.NB6o,+Wky c={`L hk0Ν; ?   pmܹ|vs2d ӧO+( LĎ;l/j XXX!_y@K zZA.\0!VX.#n7N$IHYeB@@Y4|„ 2b9sL.]HÆ />V@ Nw FvժUeF`ҥf=N9        􁎴iӊC<ᦷwJD$<<\J(![ 8^`{.y&9a„& .*p ɒ%i+suўl@@@@@@xVu#@ƍ7V8ڵkZj^cm9e. vF :Ԅh4g͚5N:  8]ի'U>eʔ6 ħ@hhݻWnj4KF. ϑ# װE+xQu ܻwτ5j(5[zĥ>IuF?*Z6:R@@سg5JfΜ)oߎԉrI׮]zi+ /ĸh"?#QF YpapQ@@@@@@@@,}0tΜ9fUgZÄ  xb8qX⑰pHZFY&HhpY9@hCɤID'y뭷m۶kEE[իe˖2~xC7|p{@7綤u        *paɝ;^eU_˗/Uu 0` 1r4iD-Zd^dI3gdɒF@=-*v2x߽{=;I@@@@@@@@*;w6/;aLAct >H0>}H~<1z7Μڼys{˜9  /zjsӧ֭+cƌ)R( (Ǐˊ+dʕn:|cv+tQ/=xv  W!!!ryh3>n:jӦM+VHɓ'w%@p9aܹ2c ټy#.6mj˘1#ـN/A|He&Goooפ        +PLF;vJMk׮-w7@XظqԫWON:e%]t/cٞ@gxd͚59nݒĉ;Kh      8H@,,_GVکЀ6m ߿^Yŋ3gN~sp֭&L%Q! Ķ;wG78zh<@l_=G۲vZ|r9rc;*U*PTX̹s~@@U]e`ٳg#mt钄;[ &|$1bhUN&8T ħ~׵xb?} 'yYf믛{".%367OfчN {1E<@Et kz*AK@@@@@@D… RN{B M^\[6KkΜOJϞ=.O8A)۷t ,!쪁L  q#}viذ:tȾ`JDː!18| ?17l wލ)SJ| J)6"@E' ߿_sIĐFl-uG7qޢץMV4њ#[DEW@@8O̚5K,X 7o|  >@5j$AAAg׃&gl+70M+W_I@@@@@@@@}z{@hѢL0tvϞ=R@8D@@@@@@_kךVXQVZ%>>>{ f# $ݺuVYFAQ .,7['N(~a#(" Ć0`|geYdQ~Wi&Yh9e5TRRJ3ˢPL  l:BF+Q˗/_Gœ$MF nG @-PYf|O?yxʐ!ԯ_ߌAL v;m~Ӂ!6l e˖uW!       @Æ eƌ͓:uNcҚ5k ǏK̙cP x75Q'TwfxOA@ݻAyB_-_<,       &]v!C;wԩSI'o#֤;wVYF 4U Ѡ)RD8"  #uVŋ%W\6 <[d&xqҥQh]Yd_{5'&@ *>ƈ!˺޽{iDh5ZiҤ1Ϣ:T n-SV^m.\(W^}}CڵMb q.!b$𽯳Ku&|ieɒ%\څ        M4'OA/ꃵ1@#p}ӧ|sTe֬Yn=ƌ D1<Ł~"      n ,C@0۫LGK.UTzo." Փٳg˥KW^2f̘  ѣGo߾mO?Լ2O+pMYx>@CCBB9Gʖ-+իW73A@83fh']ʕ+7nD[%8qHR24ZVc@@@tU@P@M^tbٲe{@y7͘PժU3?crs4#GCݻ`$        zMl|X/.IcW/06UK޽gΜܹs+:mۤhѢ  8H@o=+WkPӧwF D#A-2+Vw>rtҤIJ*RF gKRL1l@@po kK$<@'aaa2m4ѣ^vL@Ν+}\vJND2! q˗/      ..p-UؠAiӦ#{z OEdtgϞwQ9}ҧOڵiݺlڴع`wh2  TzVի]z~F nf=޽{U%ׯ_7C=.A&1mڴQ7ZSN-„ +?滇K~3ժUwyGT" &߆suwLފhpɒ%\pA|||Dt˖-[4g @@@@@@@@8~Eoə3%5C No,[,~@N@k۶L2n[֬YeΜ9RD {@~׿e t0I eB@@@@@@xd޼y ͛7̄ 4H矋42O 44T .,0G-Ȅ  3 ^ٳgdȐA&O,*UQ@a _n̘1Cϟ/7nxhTvm|+@@Yt+WV@.ϝ;i>[F+et$qĎ$u  o+V00jVYTTF ^+WEu@#w F}Y ` ҢE 7nGZt@@@@@@@@9իWƬ]Vʗ/ V$K< -[6?b T ۶m˱c.2fI4 *g)Th޼?@@@@@@pQaÆINL>۷K9\74ꫯ[n/{)_ܣϙAбA@x6UVI&MOWhu)m(o>>}̚5KN>q)O/֩SGʔ)C#Bl@@pXx%1*5ƈR}#@/"k֬+WʩS죏*Uʄ/jcܹ< ?xuỳnrɜ93         "0w\[v CҐ8hIzs۷EaBlp}Z5jdnrPT)5kd͚@GBBB'Q|y#@@@@@@ZɓRX1xig^?w68Y`ұcG=z^{#:8NZjB@@' M6>r2ydLlٲŌ=w\ d'oRF ^H ~/1 o־k׮9h2>L.Oc@IDAT}}}v]*B@ 6tL7ʆ ̸:^㦄 ʫj/˗qNuD,Y_j:-Dڲ@@@@@@@@ 6:t #F0=zn:6/ou_k?oom +?HM[>{ $NXn߾-痽{Ji'      #p)Wܹxh=$L s#GJ aÆ^9s4h0dΜY8 %t D)!zϺ=x.VZEy=S@:u?^ C(T4kL֭+AAAD@@'3Zϟ't^m4iҘzτ @l ˾}L袆/|ĉ^R3NJ/.+V4s2e$ dzxJ bEԭI&w=e?9 @@@@@@@@ hhHMErU⿶9sHzLC $ݺuF@8,k„ u_|E1c+6  >>>RhQKʕ+''~@b(ZA3K,X1F+Qz̝;w0@ƈzĥ80v*B^ 88Xt!+xQǏ݂TlYXtiI4ip$Ϊ;wO?T߿/iӦ        CIPI&ecΜ9.9r.S@poaСf@+(+00 ФIzoP[4iRGxŋE]t9uU>3gv@СEشi.]OH@@@@@@S`)SQ/\zuYp!q*p1OXdhݻw AjD&L$߿/^\4_v)h: 'yfwe˖5Ϸi >|X "ӧO?Ksm۶*Uss@@[/0 .]#I*h#.lk = g޽{e߾}~yO[BEur Ĩ7ʕKN8a֬Y#+V?.        ꫯځҢE 0aҶmۤXb= ;wK.2f#C |ѴI( <_|!~EhQs       [|ܹso&I&Q/<$rJyͽ]B xb |HZtW_=E@SBBBw2tPp4?:x|5O?Ƀl /ͳ"y海S@@@ʕ+vh}YV9ێl:4 e 2e+Z=YdGdA@k~ÇСC/^|. *$Eg ]@p Fŝ1c4l8n[nM        ̓0қsV])oGdBp;vH MVj֬)'N)SZX" Ǐ-[ż~uR      8^>>}uPZ at{#F8^`[oɍ7L%Ke˖I)1ݻf؃2D:w"  @3Yƍ#_ti}z+@@p}`ԨO/]$aaaﴯ O$IvP!  =v옙E]9rDܹTUzyyI,Y$fs!OU!N*𽯓6t]o.͓{q        hѢtT"z_;M/ @=!J~S%aÆncB@Rx]      #`۷i8sL=%&+?,UT\Ux*T VԩS{n dҤIR\9 ޽{K% C@@-4Z?iB0aBa /;sN;1ҥ3!<a1e(# 8@ĉ%[lf~R{2!"?Μ9# [ekמ:I6h/˗OF\E\sʕݞ={v9pQ&@@@@@@@@R@6ɐ!oA>e:|Νtnݺ2{lw@}:"@-aA"uԩۅ;ڋ@@@@@@k]vp۷oKtTR$x=E@ضm4n،luD2eɓ' ߿_z% .K=yAL  xܨ.]ذIF hԐƨf u'O\bIԉN &:ĉfʺ-}5!I3f45kf;(   ;f d||eY[ o(Zj]GK%q/9sF3->nygn)S&ѿ j.siu!@=\?qϞ=fp7-I$fiӺE@@@@@@@@V`Æ +/_^֮]mI&LEѹqFL@xp|ᇲd%}RdI{@bK@?K$KT˪UbRԋ       p]PlٲŜULYf A`ȡąSDnIFVX! ;5gVrL@رCtA  믢zGO)V ˗/g\vM4p|ȑ֔!CO!Ʉ  q#V(x{[TW㢅'C5 hԥs}ZeTs@@@\4k RLsϟ?/gϞ55QqxA4iRɜ9dɒEe)tQcZNDp F}Zn-cǎ5/|`89!=E@@@@@@@pyMs:$rr=w;|MYtGoM.sI q'pBi޼\xѾh˖-믿} @2u0 Ȟ={\@@@@@@hԨL>/ʶm$uќ./صru%KHٲeIz=zȠAL)"+@@ &7oޔݻ˷~kگ{}]oLw|7_X'۷R,  8]~]41YuZ9b {\F $IekK=+qjq;sAUulmӥMNX1JJ2ed-jK KeBx.b_R9s4d˖-RDd@@@@@@@@U`ұcGsZNLճk ffX6v!DutA&MdoM&Yא]&@Z K,r GΝs=@@@@@@xH@4LĉƍPB*8kDڴiiVDdRjUgjfECj^~eٷo^>}_~qrm. 8B`ٲeҲeK9u]lO8QrmoA9r ,={)S)   { ho_l2Zˈek.uֿO]Y2y)޼ySnܸiְSE4ՑyV6cƌ!Cʺ=A,u!<*AگQFI۶mMK,)7o edB@@@@@@@@ K2$$D^xfǛzr̘1ҪUb: 1A5j$]C͚5E(  %Jm۶e\^k!      -Z$z?Zcv-XJ oߖZjɊ+LuiӦIݺuɱ֮]v?!q+kףb@@/_;4tbҦMU5@@9[۶m… v*W,Ǐ̙3(HaÆɽ{#GJ"Em@@@}v<+͛QnOgc-l=wĵ4`/b@9u___YCԿ׳?./`pyYsP:Շg \Mu=x-bZ^)R4[!dnvp @ OR5%u!\@@@@@@@@ _^^}UV|yYv[h@JڴiM_x Yl[N &p3֮]ӦMY(  _͚5I&ٳG (_M      x3gdɒricP^=5kzq\Y@mݺ7'@e˖[>HƎkP@@Aٳ&4{…vstpCJƍm8pݠvEѣRH3`Ymz-O>D@'4itE]fVZ2zhI6 h _?YL޹sgٳ$NN@@@|Ҩy'-޽|޽Hu=44Tu {|#hW<<'HY?.##Ͻ֬A+w.7BW@p sΙt7n:yWk"       xZұcG:ȰaBTRo0/Ae O&Mի˗Of̘! Q@@F%m۶5M6m4lE@@@@@@pY,Z7k֬TRyD$.0d֭:խ[Wo~~~u&L-ZԩS޽{EL  @| _Ҽys&hOYvm{ǏݻmM+WcJl٬M,@@@\H@?=x}YC#.#u7\kֺ.u]>ͤ9M4SN<`se' [ ,X@yӧ/ &V3      8@ǎeᦅzM$On'oի%eʔo۷orݮQu(UT2yd{WNDÐ@@ H"es9///e߾}Rrn;3g7}088ش,{f~zDM)     K e ;%$$D4i"."h@@@@@@@@(^-Z4|۶mcC-Ε+СCv @\tIԩ#Փ+WMV-Z$SLdɒMC  !1QaB@@@@@@ػwf.ԣGiڴi^@ J.-ׯ39rDʔ)#{EVjZwܑ{OtLB&@@ 6ol%ӧܻw\Fd|֥ fϞ-+Vحkٲ޽[*Vho     nĨ4^z(# bԀ        S j>rرvU 9roÇ]pIQ'ϷۯC۷OWno $LPRHayYgo.C@@@@@@Μ9#oܼyN:2`Gț7lڴIcNҿӿ/<}%.|W_}% 4={:u½  ׯ_֭[KٲeN___ٳ L#,5իWMӧO/˗/oV'N9@@@@#Lqtx+Hxx ʕ+^E@@@@@@@@Q_?\^z%rlڴQ^        }݋o.j!wv>l) 8N@nu7|M"L>]~GI:.FM ă@ v      8F@=Yz,((H/_='\V QD-Z>@@@@ f> @;zDž/@@@@@@@@p}|Fn:ɕ+Ce  知@2i$ªUʾ}A6  @ƌ>}.S@@@@@@@Oeڴi"kѢE3g篘@|||dܸqҿ/Ç71w޵cA5kVӵ7J߾}ݱ @bQ`׮]RT)Сܺu\)}2|Ypdʔ)N(pQ)Y̝;n^۶me͒#G{@@@@@ F%,[CCBB^z7|h_@@@@@@@@_UVv#ƌc]1îڌ8@pp|RR%9yic$Id„ tR@p 2]!Ѧ      s ?^ S̚5KJ.R@޽eҤIk:6oi֬s 8@ƌfv      \`ɒ%Һuk xu  @DMʢE$qfulٲrɈUdɒ2p@'WAri#A@ ,[L'C 0SyE3f$MԱ64hvѐΚ5kDi$     nĘ A={o˗kJ@@@@@@@@LO7onZ*Ǐw>}s4P2YdC= ;wSNR|y?~jԨQj*y9  @ F4tW>      ķmۤnݺv0HnݤM6,N.PjU_$uԦRJΝ;1o^.]FK.ߏy n)py>ZjrqDŽ _|a+.]-Mg@w=$<<\V-ٲedϞ=ً     kĨy敯ʀ>x@7n,.\5`*F@@@@@@@@@Zl)>>>C]y\r~* "`$WқTAyH&"* Q @ҥJ i‘*$9o߹dkgNd5k6&Mh@Eƍ>*[-Z )S'#_^{Y@ybŊڹs&N~~~q: @L!F#G|)urE@@@@@@"##mQիWqҧOK*SL4.#Fi3ǍDYӧˬ{;}!}ؒi[nU.GB@ os=$I>}hǎ߯/ L6~6mڵk%K_b W@@@@@#|C PJ:~4i"Ȍ        @\4o\RC2/\ٳgw6Vٻwo ={V͚5SZtQFԩ5a-_\O>F ĊcA@@@@@@|P]v3gܬG\xSD9HH U) ׯWmkͺٳg;yN4I~i2, $͛75l0k֬YN8˗5h %M9N7s-Zp6φz!!k@@@@@>___}2gloժUԯ_?6C@@@@@@@T)h˗5e O+Wl/ z S6mct@elٲ9>|A@@@@@@۷S ,I$ c…A@f͚Zv{1;ʁTD }0.͓'DשS'mٲ} <),]P!C.]ceȐAӦMʕ+@sw >\m۶UttMcǎ      >_kƌf@@CfDzO@@@@@@n/0zhM[,bŊ?@IDAT @, ,XP7oVR-FKSb&MK.6k׮^z:}+b#@x0޺uk)SF;w]{K/`p 8Pݻwwy7dsA@@@@p{RdI 2ľ;FD        /<+Vb 1M4@+3gt(֭ݻwE1:  ?lٲ9bt(       p[/)fN5j6lxs9Ķ@,YvZըQ} lR}ٷ[СCUtiY`3FEEyKz S&N( ԤI[)b M;V=ϹLƷzysРAzt@@@@@+@![M׮]ոqc{ŋ]Ξ={t@@@@@@@@:8={J'(( 5<}zM>]sQƌ}|@+Y:>|A@@@@@@? ̛7<)vֿݺg )Sjܹԩ3ᆱMի1Ohƌκ˗7䔈@ؾ}J*W_}[8M427o,S@)}k#FO>1o@@@@@b 4i .lرc~       x͛UN]vff 4@ :wlK2 *VvؑСeʔ)Zn9%_@@3f̐y|GFF(j*M6M2dpi䄕P}1c "    $@!ܬ,Y͐ƍӄ ns&@@@@@@@@W_}UI&L4I/_JSdL$ٌ?T޼y|r'͛kݪ[s @L!FS~g       #;wTu%)8ydi"j֬+k֬6#GTR?C:t SѴ+WOk9 @W`Z5jcǎɓ'O.STo*W\l!0sLiF6~7 @@@@@bxO;vԒ%Kt@@@@@@@@xPtҩiӦvsiڴi:d^l;zSd @< O*V^u:[lZx>sM6a*@C੧r9tӧ      / ""UTQDDeX%NؗY\(/_>zgltxlݺu0{iܸq2{va5h@7o޼@Dի0`ɣK:sԪUKwEtXn5k({G8p`|E@@@@0 15o\?f=ԯ__f#%        %ЩS'gѣG;}O0w^O@{?ԫW/[q۶mzuEaaaV=  ?'|ҡCA@@@@@@~7UTI'N ܹs*nȐ!{5iĆiټjݺnܸ5$Ihz&nݺu q/0o<ֵkٲe?L3puqoCݩC@@@@ 1ˍ2d-hNtjԨÇU        (P@eʔ'޽[+V ]pVppŞ={>@[y>͛7mZƍ5bH[R%@DBL@@@@@@\U|h"֨@ҤIW_BH~~~I&ٟigΜ     P.o?ŋ+cƌk_Tdd]i        ^ qj߾}3**Jcǎ.;O*00FE!FA{5kq:uꔽ>M40aVZ9s\ wH$D֜;̻      xKTzumٲfg XB TET"El /^Tݺu5x`OM=l03ۼ8s]sx9Ή@p@XX*TF~pկ_֬Yڈ%JoFO<"$@@@@@=@`L^5k,nZ0 "        wW_}UI&oL4IW\I.;&۷o"##]! .` 3F!!!Zps /ݻwM6sA@ȑ#… N1؝@@@@@@pY'XfMmܸ裏"1Ψ ;̙3iܸ{7K/իw7Ί)ړ'Oٞ={ԠAݼye -pyuU ЪUdjԨ!SqРAJ={RLiTH㏱9MO(44TvkԨQ6?! ۶mSRԲeKDs弇 q,`6UL}QQQzqK@ׯ?T94qD@r̩ hź#ɌH=E_~],]t:q"    <_w1c5k&BUPAJ*-@@@@@@@@'?~رþؼy+J3ɓ2_? G0`LZyi~~~zj2A!zH.\P̙oP椊      -fF=LN1ET-) oG /[:sKcnhBSN!B@6lŨ3! p?Wݵo>r&ԩt ;c"EЏ=8`&@@@@@u3=c> jJ2hʕ*_~3@@@@@@@@|V^sr>|w['88؆t ;wmx٤!$$D~S gQы5 |7ѣ:o%O      /pUխ["'I"5kV[N͛7wB2dWg:ܙ8q*WlC h"[e5lPf]8 @O0_cƌQ9טϳ'|R~8# 2d=zg.@@@@@%ba6۸q (`gPժU5yx@@@@@@@@@@@@@@*p9U\Yk׮!IFfKҥ2q!+PLmݺUŋ9\zUZn-ws3/^i0MaF> ' ,[k $={ֆ2eJ2kիI>|XӧO٤O~%     =Pb̙3Es5kִݸqCZDEGG        eAf͚٬Ο?I&.Ð'&8t@>=FٍkGI(^{5ٳG7ϑ @*pk!ư0I\      X3gΨbŊڼy}#hʕ*VB q$`[f:v`U,YRrcZ*00І7qD 8Ѝ 0ըQCUTQ>???5o\f޽4i?] K`رuYɒ%@@@@@E~-G!QQQڵFޠAM2Eɓ'wA@@@@@@@@&1}|I۷O(C= .<Ј)tg(/nSG1\,YٳOE      @< 􏧉/Fl7sL(QBlB,^"       (88XժURhhTL믺r# p5kT@)hC@ Vb6=q&N4@@@@@@&` ;|wK'$$Ć{%,@ @@@@@{T4{l 4H5u…O?(RBA@@@@@@@H(M*C vYf 潵ݻ>@ӧOW^QR?[???nZڴi# )'Og-= Y#     nXdTs̺b$nQăWgնmTtiqukN͛7)tf6mVjC35ob@KuM9 lRL˗/.]Eb7 DEE/!%MTY;     o Pel էO-X@iҤ۷O%JИ1c\-        ķ@``:t`ȑ#;/[lJ,}By}„ ʕ+>3EGG[ jÆ 8qҥK6$ O=3gN{Ma6D!      P~j׮2űLQz(Bb^@Ȕ)VZ]:gbf/; ٳm|&'Nr:~[B$@/q}){裏5zӬ駟L*^(ɓ6{NiӦ,I @@@@@^(x/ZxnյuV-Zz5uI?"""1B@@@@@@@p@v휂Aϻ"DX8<L`ӦMzgԶm[={a6=z~G/^mc^'Oq$     @ P1n}cm5jh`|Uxq޽;a @@@@@@@@Ȟ=ԩc=zkW>#l2ϟnHwwڴi5zhBJf"  p'B Ϟb6{!      UesŴw}WÆ yW@H2O1c(00fa3,XPsUVO?,Y4iظLI&tU ^g_W\_7ͼ;wV\i?ݛ!wެUӧ     b9sfVT@@l,Qpax/**ʃ!T@@@@@@@@ѣ3[6{ qbCA_ /J* M6_ԱcG%JH@\l$h64mΝ2@@@@@@K˗/vڶHǬs8qz26 @< tA6lp%DDDN:޽'˗O .TɭЬYl`oC㏚0a 4@@^ .lO7Ab4@@@@@@JvN,Y2͞=[[)@  *m۶ANÇW2etaXBw:PP++NИ@eP9sgϞ:wmohر'N {8uꔳhѢs挶l2!  jc6Q@@@@@̆OճTREK,Iɣ0˗(Q@ [u]Gqϔ) ^zI~~~q:   :ne7nڵkw/s.      w%` nUZU{MVWRzNBlcu׮]ρ)SvڮIl…zu YCaR@0/V^tyE8p2gl 3fQF67||֯_K.C@UP>@@@ fR1lo5k֨e˖:t33K /Sʬ7mĈv@Fnܸ+"g%Kd6C3\r*[O:4  vk׮i6̪Us{ć     OW\Q֬YuСCʜ9s}$ e'O֛oSN9q?S裏Tvm@@ F?tYI&f@@@@@@/ժU+]~*/^\ ,Pt|X@رcս{w=LK6Lu&}oX@;?֍7dsȡ{OwA̳sSVdd ,h i[!!! W``x;@@EӧOΟ?/g6   3tLJMbbŊjܸ,YyL[o 9  .\p 1zq     pɓ'WCQFiȐ!1R\bTiwŋ}Qoh6m81[ ;0tV`۶mIhѢ)8`{@@.0c [p@@Hxb[ I$Ķo߮2e8ÛrһkQ8oA@@@@@@@x;ڍ4L".\`9̙yB v8z5kf7\hϞ=ӧEH@@L!ƘaÆ._@@@@@@gH]mo׮̙C{@ *$SANαϳ#F8KFr^A7'|ٳ_~NƔ)SfM;xGd? bڽb     +@!Fキ ի5qDOfzW!!!7ogOj        o }w'2ǿ-KRZdN*姐dKEPZmBDYC$dQ"%T$d,Osg̽33νgssΜk3o޼yEZJj׮RJҺukپ};@@@@@@@@ꪫ;wiӦA+WݷW`ʕrM7/۶m3 ͒%tI6n(H(SLh Y5jc;v fC@@@@@Zj?/BY`4o|Ə;֭4c y  ))PF wN:ӌ       H@'=rkO?T.@3@ڶm+իW͛իĉ˂ 7ސ\W$W>3faÆD^>IƨC  @ضm 0@&O,gϞuXX1߿h| A رMVzWFLԩSv)  d    k$bw,$}] b1j@MO>O>d@<G#F&qh,ݻKN$gΜl 'pwE]GrdĉoHI]  @, hL *Ri+   #@d3=qWɓeժUrwK  x2f9yd@@@@@@@@T.>urСx4Gʕ+gvwq?k믿ur 7$alРIdH Y@:3@@@@@@#jԨ&a̜9k&Iƌ4A'pwիMFٳgRV-?8,zrС`@ jN#GrׯQ.>쳲yfѣIX8|y      K̑` TXQ>駟|2ܹS:v(%J w!wF@@@@@@@@R< W\qiԜ9sdÆ Qo`}]g h sUWɓܹsfKO?T͛'e˖ $S[ouk K      @?(UV5$_|_LA@ *_~,\P $ X˒%Kr2{쨴'>}5~QiF@ hbI&]t{fɒEq套^ /nC4"MĘ'O4rT     @$HI4VW_&d{$C 5!>+ nݺؑs8        @ ;wlD ><E"ƨCo,S=jiW^yE֬Y# 6D @מ?~oF4H@@@@@@?Pj֬);v0ŋe˖I:uA@ 3fxb)VI&裏ʉ'ـwGN3 y85koiڴi#۶m3;D-_e]S#iXe͚g@@@@@GDàbٲj*ӡCi9| 6L#,ǏMw ٲeKTHOQFD#F^ﯽZJɊҪDž GXbRtis7}9R@@@@@@YtTRE~''OO{  jw}';w 2v~gRbEsf5&0v駟v&"(}5j$UV [g3L^,  ۷g@@@@@GD$ ̙S:t 7nqKƌZ'O)S 7 ]w7N8}!        @|X>cYhڵKviUF {z@;Θ1Ýu`̝^K 5%Sݏk) @@@@@ } (QB4ib3޽[wDh8F9 @ +WJ.]dɒ%V⡇AIB  iQ@kby-|4k,-&DŽ      ?gϚXE3"}S@%Q4G}dk_ywLLhϓO>ikmV^of:udLhhbK@cMO{=ĵW^yU3SZ{޸#25AXm ؀6mÝXΈ΋fM16j?;q5Skb:ӡ iJ{XǮ@$h3XuA   (X8~xܛow 7_:?\{HlLҾUZ5.>!i|mi&oӦMhi|O:h8[6UTٿ

mڴHﻺt#GuK @ @ @ @ @l @ @ @ @ @ @.7&vZFcΝczB땫 @`@cʔ)xhٲedqǽwNk @ @ @ @ @ @ r^\ @ @ @ @ @ @ @:uj 2$׿jҤI<qg4 @d@^^^L81 }YԦMƸq3Hi @ @ @ @ @ @ ffaQJ"@ @ @ @ @ @ @Lwމ6mD!UV#F˅0fV @͍}ի_~ꧮ+VDVby濿Y @ @ @ @ @`W > @ @ @ @ @ @ @Y,{>|x~cǎt:u/֭ @ PZ~cҥi:uѣ#"@ @ @ @ @ @@ ĘeoT9 @ @ @ @ @ @ @ [-[{6lcƌmۦ4 @سgO<,mۖ&رc;68 @ @ @ @ @J^ @ @ @ @ @ @ @Y&sθNK0)S&o,{!@(7cժUѾ}gώ&MĤIc @ @ @ @ @(9{^ @ @ @ @ @ @ @!tٳgf͚ĉe˖ @ {챸+cݺu;۵k&L:u4 @ @ @ @ @ PfC;2 @ @ @ @ @ @ ev튛n)N?tc;˜e[9 @E/p%ĪU{̙'tRL>==A @ @ @ @ @(*wf @ @ @ @ @ @ @ ;~֭[-[ƤI}c~  @88~:Xvmz.]رcz1  @ @ @ @ @%䠎I @ @ @ @ @ @dErm,|J"@8<]tQ曑 _wM>=6mo %@ @ @ @ @ @@{:( @ @ @ @ @ @ 7n>}ٳ1uhٲezL @1cF 0 R+777 rK)Sp7 @ @ @ @ @F` Ƣ* @ @ @ @ @ @ 5/.,?4hP1"*U @ @h>իW,\0gӧO#<2=A @ @ @ @ @b*03̱ @ @ @ @ @ @ @,H-uYZjO?<,|J"@(׏DrC=Ν[<T @ @ @ @ @O '__ @ @ @ @ @ @ P7o^zO<^;8uԨW^zL @C+G.]O6ɉaÆm0v#@ @ @ @ @ @ v>0(w @ @ @ @ @ @ @)o)aLx㍱pB!i1 @%~7-[:tHϏ;3ڶm7n,mC @ @ @ @ @BX#@ @ @ @ @ @ @={v~&5k֌g}6n9oM @p T^=Rw}w-[69s=\p˾ @ @ @ @ @ZҘ @ @ @ @ @ @ @@*l/m۶%˴h"-[7Yֳ @!Cbo;ދ38#~"Ѳ @ @ @ @ @88A) @ @ @ @ @ @ @kvݺuo9RW^y%|S  @(cҥqꩧ&Iw!FQ  @ @ @ @ @H1@ @ @ @ @ @ @u1mڴd$eʔ)QRBB @@cѢEѥKdO~ ={V&@ @ @ @ @ @ ^ @ @ @ @ @ @ @V>??z*Uģ>۷gL @ P㎸馛b]v1cƌ\r> @ @ @ @ @ 31fU @ @ @ @ @ @8D+WLB?d:uij>͛7?D'  @E% X/L83bΜ9Eu  @ @ @ @ @ fYs @ @ @ @ @ @ @$qYgž?>^}U!< @"pe?ժUKNdɒk׮-!8& @ @ @ @ @& 1ިz @ @ @ @ @ @ @!x嗣uֱaÆdO?=/^ 48 @E- ^|饗#HZreG'@ @ @ @ @ @@AH  @ @ @ @ @ @ @" a b֭sN̟??jԨq  @&ЬYxWaÆW^1/)a8. @ @ @ @ @%]@cIO @ @ @ @ @ @ŋm۶'_x3DժUilI @8cbѢEq&[Y&Znk׮=TG @ @ @ @ @B? @ @ @ @ @ @ @?%o$!۶mKK0Κ5+*VOf @JG/RwqINƸ~YS @ @ @ @ @ P1W @ @ @ @ @ @ @ V?زeKrTCٙ @C.PnXpauQޫVTH~bC @ @ @ @ @J UL @ @ @ @ @ @Jk?u%Ϸj*f͚*T8lTVa @CओNz*ʗ/4v3fLv  @ @ @ @ @ bZ @ @ @ @ @ @QFţ>jժ1gΜ[n9 @ p?#|9XxqA @ @ @ @ @X"@ @ @ @ @ @ @Y&+СCrrrbʔ)ѬY,R9 @@KڵkWt9>X @ @ @ @ @ĘC @ @ @ @ @ @شiSt5vޝ p ѡC}~  @ P@;֭['|I+ g @ @ @ @ @D@7, @ @ @ @ @ @b~ş³:+n,Vi @@2ebQNdyѣ cik @ @ @ @ @ @ -J4 @ @ @ @ @ @ @{f͚_|qbQFXbEԫW  @H`qyE?mRrXre} @ @ @ @ @ fL @ @ @ @ @ @ @L`ƍ1hРtcǎ˜ @ @@ڴiW^yerۣo߾{ @ @ @ @ @ p@M @ @ @ @ @ @ @\s5vڤǥ^ZzW) @&<6l /ă>Xhk[ @ @ @ @ @-*'@ @ @ @ @ @ @ ,X =ܤ[ZXjUԭ[wߴ_ @SϏ;/yz?cԩSZ @ @ @ @ @3K @ @ @ @ @ @R?9v*U+W1o/ @@*|SN 6?Qbo  @ @ @ @ @(3sKm '@ @ @ @ @ @ @C IBS_ƴ @!p~d?OqwƲ @ @ @ @ @ @ Ji&@ @ @ @ @ @ @ ̛7/.;N[QR%6 @(TUVEfbQJXzuԭ[P @ @ @ @ @B`fn(S @ @ @ @ @ @ @W P 뮻054 @(L&MĀ%? syk @ @ @ @ @ Pr^^ @ @ @ @ @ @ @ =:y+7I @ذaC4j(R999ǩZX @ @ @ @ @l @ @ @ @ @ @jT-ܒLPF7%@ @@! ԨQ#ndꪫ ie @ @ @ @ @ P1V @ @ @ @ @ @ ȑ#cƍHϞ=SNoV @E#пhҤI%KbΜ9EU  @ @ @ @ @ZWV0 @ @ @ @ @H@IDAT @ @+>8ꨣb۶mQBxw~_yA @O>:tHmѢE,] @ @ @ @ @+037{kS @ @ @ @ @ @ uÇOBS}uP  @(Ѳede˖E*E @ @ @ @ @{#@ @ @ @ @ @ @Ju⨣۷GŊc͚5Qnݒ_  @(Q @ h3fOn,k @ @ @ @ @ @ 4)hk, @ @ @ @ @ @ @ z> ӦMì @ @@~;~mk.͛-[CF @ @ @ @ @@1 0 MV׏4? @j-xҥKZ*nϢiӦ @ @ @ @ @%ESB @ @ @ @ @ @ @?~i[ @ Y}qQGepxgr @ @ @ @ @- q {$ @ @ @ @ @ @|0Mȑ#㑞A @vi<<@ @ @ @ @ @ @@" {@ @ @ @ @ @ @P`ԩ1{Le|plvEX @(V?<ڵk)逸իWk"@ @ @ @ @ @k @ @ @ @ @ @ }t'pB @ @@!4o<=R.]O?t!,  @ @ @ @ @'A1 @ @ @ @ @ @ @>6mw\}>ڳ @ P8y$ @ @ @ @ @ Ƃ@ @ @ @ @ @ @rf͚~;vG @8Cu֙O- @ @ @ @ @XʞA @ @ @ @ @ @Q`„ ӎ>购A @Bh޼yva%/Z(^yBZ @ @ @ @ @ Pu8  @ @ @ @ @ @ @- ?)}QG+VO>$6 @.%%%|y3:_1N @ @ @ @ @ }w4UL @ @ @ @ @ @SoիW^VYIbĈU^s @-lٲhݺu~ѥKH/RJ1N @ @ @ @ @ -it%+ @ @ @ @ @ @ / aLJl14(ާA @8qb̛7oJۼ۱nݺ O{OB @ @ @ @ @ @q blܟ  @ @ @ @ @ @ @|ʹ}7mk @ @ )! w '@ @ @ @ @ @k v @ @ @ @ @ @ PO.e=L @(t8} .'@ @ @ @ @ @f5] @ @ @ @ @ @ @@C6mZfI%%%{zy @-pĝwY+As3 @ @ @ @ @Xt @ @ @ @ @ @ @ ̚5+SzϞ=e˖f9sf,_ @-Э[Z/# @ @ @ @ @ @q blܟ  @ @ @ @ @ @ @H-Z˖-TӻwVURRZ&#@ @ީShӦM{χ~Xx#@ @ @ @ @ @`7Id @ @ @ @ @ @hA$;s^뮻ƌ3: @(n$(m۶y-W^1ucݺuѴiӼo2 @ @ @ @ @ Gpj @ @ @ @ @ @ @ϟ^qӶ @E{R֮]_|E @ @ @ @ @j hn!@ @ @ @ @ @ @ M?OԹs紭A @bXS @ @ @ @ @X}+#  @ @ @ @ @ @ @@!'i 0 @l@w@9 @ @ @ @ @ "@ @ @ @ @ @ @,Y"l6i[ @"]';Pԧ @ @ @ @ @/ VF @ @ @ @ @ @ @+jժtm-ZH @(:߁>u @ @ @ @ @ P}Aշ2 @ @ @ @ @ @4Xڪ @ PS իWt @ @ @ @ @ PCT @ @ @ @ @ @X~= @@&M֭[5 @ @ @ @ @h|gb @ @ @ @ @ @(B-[U\2mk @ @XlR: @ @ @ @ @@i q  @ @ @ @ @ @ Zj(;$=A@XlY<ǂ bNxqGDӦM7XNo>FiӦEc]v=#g8jw}7O|Aߏ5kĎ;ׯ_}ѥKj=ߎ3fTktA\~O>9tZn={=zJ<{"4)>}a얳pU dolDN @ @ @ @ @h4GP @ @ @ @ @ @(fmۦ}i[-0o޼+'UVUZԩS3nLg?+KN$a#GLu_矟Ys(}$a'tR7.J=fcٳgUW]=X=w^uYU/?%90NJA?O_贝:u}ѣ3b>M j߫dbӮ]b(I  @ @ @ @ @P @ @ @ @ @ @h@ݻwOW駟m ۿn=P!W?o1hР~>:/RGƊ'u%kꫯ*^_|y$aiC+TVVJ/UW4`'jڲ]6pMI`Ԕ)ScaÆk[\o@ާIi|U^ ,@wwܱXR @ @ @ @ @5(=n!@ @ @ @ @ @ @@=}Gi[)0f̘馛r׬YLpobɒ%о$Tmƌ lpw}7?XlY$sύw=sW_%LJ~~{\s5=I⩧O=TΥ#F^{zΝ;ٳwXid cʕ1stHةS_FiӦ9CUV:vݺu/2ϟ֭K'{.wH>!C\ixuO*rڧiIVD uJJJ2wv @ @ @ @ @ PH ӲV @ @ @ @ @ @ }W*<4hW]uUƑ#GƭnmGq1zL0a΀NŽ?pk&GuTN\cǎ͛viqI'k֬ɜ/-[7xcN/{ウ崓`ʫ:sߦ>}zN b;3gt*z'5^yTIyŋg_>~ԩSs5@]ӤΦا*Zۧ!PHɿӦM,gϞ-Z  @ @ @ @ @ԁ@IiJ @ @ @ @ @ @ @:u=z<7ވz^ PG<}$!}<@1Ia(vGfi'~G׮]sZO}Q:g~{HON&p=Xnn喴_UrN9θqbݺun.]G˛[oq١wnt|u/n*-{mf+j7ܧIuWӪ_ jg IҥIOh @ @ @ @ @ 16\ @ @ @ @ @ @ P~xZǴA@袋/L^{ŵ^k؜}u]%&^uUѦMNӭ[}YNk7Cvڥ|5mzyvqСCگ1lذȜ?~,_w.o n\4yV߉_>,gV6q@ SN9P˰n @ @ @ @ @( 1"@ @ @ @ @ @ @[Z.Kp4We˖E}\xZǶv֭[L&s9r$|GU;vwuW,Y$\m;.\ LskWZZ3u!,B]vѬYzwyѵk8sW_͹:O|U>Y(gsBVZŹ[eX3 @ @ @ @ @yĘgP @ @ @ @ @ @ @-)pAY̙3cر[r9Mw>`X":thiy_|N3hР]ŋ#;, {ォ5e ۮ}{-[?kb„ QVVM#;.'_6571޽{v`ۇrH$aoNsHw1dȐ0`@~yy` ;uOe^O7ۧq@ '?+Wf}G @ @ @ @ @ @@) @ @ @ @ @ @ @~_>ׯk&p}ݷT 8qbjk۩66pN^)CF/\0zUAqǘ1cұs̉>:z~zp ѯ_6*\}ѢEjOsE1Si|v@eΝk׮TubcRg;v$(+I|L_~[oEb:zg{9^ߒާIm|U42}%wg[$'<3r'IU]vYq\EO>qgĨQSN96Yn]$G"ZUNGxxϝ;7/iScvaI`sM7ń 2cڵa+W/뮻FȘov!{zk>MjFاU<@ $v\zsohӦM @ @ @ @ @ @q 4UO @ @ @ @ @ @So8 S㠃ʄg"pyꫯ+vaF]%zs9I;MM6̈́=cѳg|vߏ:ugyf,Y$۳f͊of׫sa; :w[mU/FG?Qѿ;.ɵ#<2g6OBfJ+;pJc:1o޼Hj(?zQެޞwGѣ5_iRKjF&̴i}C $ƌ%{qM7}  @ @ @ @ @$ @ @ @ @ @ @ @HЫ>SN+Wg¯;"ZYG}v-_΢E>Ks=I&i ƺu͛7Ok$k={v:dw.] 5uz衙e˖ń C<9k3gN$A}I Mz K2soj^Kn4hPLgKv^Iɓsɱ{G_*9vxөꫴ]ާI uW O7\+_ wosŎ92ܴi @ @ @ @ @  @ @ @ @ @ @ @@ t1LFJ|W⪫J_~e @ IZ|IjQP{j97'40 N,++K:thڮnM6/g|'qgo~s;XqHo>zYyy晜q'tRN>:|tk֬'_/]4- .HC[n%\ZZ @ @ @ @ @ @@q @ @ @ @ @ @ @Hz뮻c1c{wSif裏FջwL6lIH T :wcvXҺ bL&T4iRaÆ7ӵk~Jo]tzh:O}4۸+=s6mZs=Fd$OyksC]dmuW+1ڧ} y=v/.p¸2Ι3'HWXQiɿկb=t  @ @ @ @ @ b, @ @ @ @ @ @QG~x<_2'1 s"P9AiYm]%ϭֶm,'֭[O?t:4oIbv̙3Tl̞=;-[n`bz5NLpSNMww-2a I+{ƷzՈf͚8sC&MTS'z&k黳Ӫujji9K8OgqF9#2!?6:E @ @ @ @ @$ @ @ @ @ @ @ @ $_~zt9Fwޑde5"SVZ̿hѢ~m;فc-[}v%%%9k.΄ rB@N:mhfO ۴iؚ]Ucu7n\N \իWg~k׮TI>}bԨQ`|'RuO%dګinu2>Y AK.QVV .,硇֭[7Y @ @ @ @ @ >$K$@ @ @ @ @ @ @u)pꩧƵ^ϏٳgܹscqeŪU&PI3<6.]sI߿$a8~i~{ΰ:+_΂ dk4m 4hЦnɓ't\rO~~5^{HǏ_}UZh|s91tJ׷ĉܧI=uWӪjg lio^IN;z: -F'@ @ @ @ @ @1e @ @ @ @ @ @ @N4iISvUW]%NMژСw֪=uHN(`u; MZ7u̜93't{qGnj_Wrn&qjgj**~_re5*s3fLa_xqu]w}zv}LilMcɊc>iRS]U7>Y[ZgϞqoex> @ @ @ @ @E$PRD( @ @ @ @ @ @ @@v}5f%+l0b۬Y=.袜f͚Ugڵm_?r9NM[nٗk/O?M0`@ldɒ8b=rJxiX>l\yQ1e˖qgK/3f̈K.0&A]d1kڧfaz @ @ @ @ @ @bV @ @ @ @ @ @ @z6lXt=}7|W_}uP,{o~!u<]v;Ϟ|x<9w4of͚eÿ/9c}$!/Omv; LB'O<1ySj|1~HB/XhQ$aQGibQ{>O yY{ ,[,ڶm)4;qJEgM'; @ @ @ @ @ P GK1 @ @ @ @ @ @ @j!Ce]sO:KybXѴiׯ_UbaL&4hP''Ž#GLWX'OT{ǐ!C*^J3gLٍ:N>_.--:+;oY9Y;`83/,cǎEQ^iR{>}\= @ @ @ @ @ P%\ @ @ @ @ @ @ @4w'NviKٳg\s5F-acUNɪvap?tNSNqWĴi6˜tf?c;g:I'xbbܸqd|TtYti̞=4i:t]w5'pBp 1k֬L^ziч0VB)ާ E>ddrO*a~ @ @ @ @ @ @!Ф컣qJ @ @ @ @ @ @ @\`ҤI1bĈL믏뮻RM6|}cƌy j/hѢL`8o޼ڵkt-d% X`AۙoCz* %@ @ @ @ @ @ @ @ @ @ @ @ @ @1z @ @ @ @ @ @ @ @ @ @ @ @ @ @X0 @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @@b,B  @ @ @ @ @ @ @ @ @ @ @ @ @ @A @ @ @ @ @ @ @ @ @ @ @ @ @ @`1Ge @ @ @ @ @ @ @ @ @ @ @ @ @ @ F @ @ @ @ @ @ @ @ @ @ @ @ @ P0 棲P @ @ @ @ @ @ @ @ @ @ @ @ @ @@w @ @ @ @ @ @ @ @ @ @ @ @ @(AQY( @ @ @ @ @ @ @ @ @ @ @ @ @ ;@ @ @ @ @ @ @ @ @ @ @ @ @ @ Ƃ, @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ F@c|TJ @ @ @ @ @ @ @ @ @ @ @ @ @" @ @ @ @ @ @ @lL`ܹ1bĈ q @9k֬ @ @ @ @ @ @ i. @ @ @ @ @ @ P+VI&aeJ"@ @ @ @ @ @ @ Qm @ @ @ @ @ @ @ @ @ @ @ @ @ @@(me @ @ @ @ @ @ؔy󢬬lS\'@ @FJK_lE @ @ @ @ @6[Ky@ @ @ @ @ @ @@֭G$@ @ @ @ @ @ @ J@cA}\K @ @ @ @ @ @O`̙~{' @h߾}t%ǒ%K:<WUV;o*#@ @ @ @ @ @1; @ @ @ @ @ @ @33Cg}>*{}?bI $@z RI @ @ @ @ @$дN "@ @ @ @ @ @ @ @ @ @ @ @ @ @.I @ @ @ @ @ @,@K,D{*w1nE`ԩnPc @ @ @ @ @ H @ @ @ @ @ @ и:uꔮƍ`XFAgqF޽Br!@%0qDAs u @ @ @ @ @4Bp͖L @ @ @ @ @ @ @ @ @ @ @ @ @,g @ @ @ @ @ @ @ @ @ @ @ @ @ @1 blwݚ  @ @ @ @ @ @ @ @ @ @ @ @ @ @* qqM @ @ @ @ @ @ @ @ @ @ @ @ @ x׭ @ @ @ @ @ @ @ @ @ @ @ @ @,g @ @ @ @ @ @ @ @ @ @ @ @ @ @1 4of @ @ @ @ @ @ @ @q L2%}75ݦMԼ0* @ @ @ @ @ @|,o @ @ @ @ @ @ @Qĉ\nK+RZr%W??_K,XcmEo^~Ծ}ԭ[;VZ]rۤIRgZJ;j0aBߣGJ]fnȑiɥ1-\ܹsjڴinVw>4f̘=ӥKC{WlI&i79=S={f͚ @`a8S҅^XciCMzQWzcݻwZ @ @ @ @ @,dj9 @ @ @ @ @ @ @?=F~N;8XӸqҦnZq= 2bۋ/{;ho׮]:sQG.te:>l!a}M q٭8sd-ZUW]5H;v,ouKw}wnfmC=To>}_|QEY$M:b /P=#i-W%^; <8M>tvf̘K/4E8s2{bN @ @ @ @ @1Ow\ @ @ @ @ @ @ @Xm۶iUVɳoӻロ&Mba={u.lsVVXaM7|s:#ɓK/6|:?=siԨQiᥱ;sbp#F 6ؠVƨ1 Yڷov>y饗R| /0x3ܔ)SESO[o5EPp1 b?Y @ @ @ @ @ @`^ bM @ @ @ @ @ @6x4tҬf̘ntG: F`VJ}w9ztiӦ6,s=i%2oOoFnmMa>`AÆ c5kz];}6qyӱ"kqkT0Fcnݲ/ԷocyuLYP8pB|w=~1wy5 @ @ @ @ @ @@qRD @ @ @ @ @ @ 04i$zwҳ>۠;묳r+!q}' 0tfmqXj,)6dԡC]|vm^|aQ+Eem%D@dY6!? /!ofzWA @ @ @ @ @ @9. q @ @ @ @ @ @ @`(c%/R-O7pC>OZvyO|MaӦMK?p/-ZH'xb>#wQ ӧOOsOnӧOO!CS9]wݴ꫗#FZ.0iҤ!GN'ONW]uUP~=/\}h>^{Ժu맣>:}W;[/EPkΝsM7T;9g̘1OS:KzR}C|s[.-2W^3Ϭ2k>˿ {lZs5s[oủYunkG:묓9Y )8 G?ʿw,v=q4tꩧv!u1u)o۵^;qx5פw1-RzsL;vo]o'߇؎5*O[nRmW\qEӻs;/y)Y6mR|//~Rxu]_~ܶmzG'|eq#Z#={{W]l}}ϣ @ @ @ @ @Uyc]u @ @ @ @ @ @ @̺.Zߖ"jvN;픻GXOg̘b-(ݳ߹pNq#L(=u]N_]6~c8hРZ>2nݺUi#޽{VKQbkv9vkܹs>Ubn%Bڴi[lV[庢-4?Ec<1#,O?]B%׿5vm餓NJ׿ѣsh3V0`@a.(N4)9r`l#R9#rcO1/L=P[p{Qc?ĵ#䭡 'Cc&D0kvҳ>?Ŝ"D/0#wWOӧOOgqLֵ.uV1.>뮻w}7{~ay^QsW_}Ǝ.YNN92wqGZzs9T?iܸqF_p^}54DE]{衇9뮻n)Ҡ:+EEXT~WRzs퍲rB73:묓/#D4Bg8r<5?tꩧ%X"-"w<ٜ*u]owС)ZjU+#|Աc)'K/㪫>#tWmmݺud,ڏ?˦['=u[ @ @ @ @ @W`k4r @ @ @ @ @ @ @ @+"[niM6Icǎ Y`bNr(WsUk׮]TXVi"d1=~҈ɓ'(KsaXOK[W^U{.5GN/B!w".JEW;C/,$r.T\M=rHiV/M4IՕBK߷+/z@(7|sySޏՋ~rP%{kvwPi^ŀc9-mà(E]}uu5tSuQ,g?Y>gcҤIES~Wy;mڴTWP'| [<׍?E)S҃>X:/_~b'oghX쮷׭4>X#ȱzscFsP-2~A?Q0F)~"ȵ/C @ @ @ @ @G9 @ @ @ @ @ @ @q}z>Kr-vzM7c?FmV^yPĜhѢSmEJVPuu<_T?Wy}y_fm ^_*E-x?G^|K#2JJS=z{}\9W\qE ;.NiO-[Ӻ{rPc9#@ @ @ @ @ @ b @ @ @ @ @ @ @F!aJ'tRzgl]t1cF9rdZg;cz7|^||y8iҤ{+3M6-)>N *%ZOQ'I`UWMÇ =l߾}Zr%Sʾub۷ob[gq7m5tܹs~ǵhCi纬|aR)௰/^=ҟ;vl4hP+[o.{T ;g2JFPrvO7"(>K[)ı 8ǥ5>Ο~ioƴn՘KYA @ @ @ @ @KT/>  @ @ @ @ @ @ @Cs }gӝw`֭[ 8N@ 70}C=CXcԵk:>4y|ۯʩ"\1JϞ=ӿ6,)z3jԨ;\r%a`Q"+B jyu R,Ə1Nt{WjѢEr}ꩧҿ+͛߿N٠VZ)7۵v+ڊv u.jl8f̘/Lw*/__q˧O>9V˖-s?\4m8sHqA+7dݬُk>Es6mҮZqZz @ @ @ @ @ P?A3 @ @ @ @ @ @ (6tӴV[嵞q :x3 :uj׍@(Æ ˡV_*of "iM6)]oMC{Gz+~{''MT_"1B/<ȊO~D)X.n)p iѳ;d/4*\>nݺG}/^{\h>ι2TS2{葛6mZ+"T8JRLb۷=g{<"twf-_쯰 ?Ԡq.B"7ߠ p2 @ @ @ @ @4R+F` @ @ @ @ @ @ @?, /PkPW_}ƍW/qO<1EՄ o"9 N:*EC=xܶN;UӧOO9LK-XP{V~;2dHySJF[)WU@n5g̘.tW8oQѷo߼{뭷cRg=LkV>Gۯ_s`95,!+s=9,oڴiESo~\AEb{~zꩩI&ESLw^ϫA6 >,{m @ @ @ @ @ PA7t @ @ @ @ @ @ @@y*cMK-TVZƸ;~8i̘19̰s9TGCc=1*b^.lw}7k.:ֿ!oԢEԥK`xi)SM6$⋩g*uwXzWTFTTi6*>3 }"!И.Եkϧu]7m騣Jp@ƻOOcǎ￑#GwY]w5+94qcbm߾}mj*Esn#,0Zly晴k/uWOXK.AV]!@IDAT!K]Yu>u)Fi|":B @ @ @ @ @ /0 6g$@ @ @ @ @ @ @h`SN9%u1" <8:5%6`4|XC> so9x8@0krSY-"ջ͑в<=Դi (1J.K{oS}Bùf51!'p̦B'i/RNc=?BXb.}ݷQF;.yU{awW$W\qE}S֭+7Nv[7hР旝:h۶mʋG}4?>7Gby}ݗ"OSz'};s8`uFb>SSM6y0`@ sNʍW_}5tc(#D0rsOÆ aazk4tz-BQ<;.6Ķ]tQQtoj9 @ @ @ @ @Th2J*G @ @ @ @ @ @ @.0toN?KpI&5\35USFRq3 P @@]Nnᆺ 5 @ @ @ @ @?( t @ @ @ @ @ @ @[SN骫jVOL`ԨQ?xgݻ/d+['N8] @ @ @ @ @@#hl @ @ @ @ @ @ @ @ @ @ @ @ @ @* qqM @ @ @ @ @ @ @ @ @ @ @ @ @ x׭ @ @ @ @ @ @ @ @ @ @ @ @ @,g @ @ @ @ @ @ @ @ @ @ @ @ @ @1 blwݚ  @ @ @ @ @ @ @ @ @ @ @ @ @ @* qqM @ @ @ @ @ @ @ @ @ @ @ @ @@Ƹhk&@ @ @ @ @ @ @ @ L2%}7UyM6ys 5`T @ @ @ @ @ @y(?] @ @ @ @ @ @X&NFUca;vL;wN,Hwy'}'UکuֵGo^~Ծ}ԭ[;VZEۤIRMZJ;j0aBߣGJ]f.¬,biVJK.dyL?O_=?>-iUVI[lEjٲe=\A&MoCf}ny~z.z꩒SϞ=SfJN|ƍYҥKTekӧN:vUiw@8S҅^XcСCS^j/SNM-ZKFm0/ @ @ @ @ @ @`ĸ4S&@ @ @ @ @ @ @_=vm+NiӦi5H Hp@sM_~yT[8/{Ku:t%.,u!}gU#ƌ TTyۿ裏V_:reN}] ҙg$ư8p`O>/(NhF(UCy1|ҦnZb|GҖ[nY:.v>%.9tE-6B<˃Ct!T&p饗޽{7`q/#xw/]jRe#ڙ1cF^mA}rOS3 @ @ @ @ @K @ @ @ @ @ @ @O`WO/x^'|Ǝ"<.B otwԊ]v="dRG&O^z曧uY's`91 G6`_!Qcm6*~mzwsW_#gϞ5.y '-"Epߛo"^J?xqq &Toѣs]NJʼz.Ǖ;Ž:thu]˫S< &p뭷0@UV_~)>EiѢE$ers&M1nj @ @ @ @ @ 0W1f!@ @ @ @ @ @ @5\6d#4{I?_>R{ +"pv[o>4mڴfkE0ay7xTۦ0| aÆ1͚5K{.o781cF_<تUKkx饗c9VD`Ygyh.m#8p 8 y=y\wuW}SGyW4Fhir-5.'SLIƍ1V @ @ @ @ @ @ @ӅwiVF @ @ @ @ @ @V\q tM >:+0ƵT=1.>lM>.Ke;E[KvСw4i~瓿;grx-[mU*8\y )9眓"7Lj$7|AE1bDM'Ӆ- @ @ @ @ @ @"*j,w:  @ @ @ @ @ @ @B`OmYK/Ԡsz 7ܐӟ4E⬖w9w}Sy]1~ڴi·EߢmNn{]:}u߹[n>:9\dywuMzxw]tӤIҽ[j~)S ѣɓUW]#(6F{믿.ƍKw$o۶mS= '\s>{O>iK,LիW:3ԩSgz)S/c[h:wz|Ώ?x >k맣>:}3GuTqvittLC4e1piUԕo'LPq}w9OwuWׯ_-Ry#<2=z{cӆn4^me]V*  @ @ @ @ @ 0 4_gm @ @ @ @ @ @ @Q`Eotz>`打FH^!OE`g]~Eus׷oQZlC]Ck&eoawEUFޫ?~*ۺ\w)dJOyp.nyǗzc5wyu7#O7AM6MӧOϿ%zz3<4iR}xB駟s5k,;.psW':'}7EqM=~{ -J&#G~3&}GɁvX؉_/.#R|tM7߾^DƎFh|>쳢[o{'}G5S =s|W" (<a])/O?tExtve|_j\o.'@ @ @ @ @ @`hЯ  @ @ @ @ @ @ @irTLi5׬uf裏nݺUoq׮]Ss^W\1՛SO=U:wu 6 EXԉ'Z 7:9\_=Y<1*"`K2ˤ:E_=zt奮=CӸqJ6,6Kc/d#\裏!`92BR#tA7xc`xD@~=~{^H{w~lQ7|3yik˦N8!0F^zڵK>l߿}Y\dErXcm!~՟D !q݋.(]Ƴ8 }y_C6B<¸jp xV#9Osu>Z(־ꪫSp($ִiӢz;saÆ:ʸN;UO?tk9 ]x/OnmPY>Ϗsex :4i&ArJKc;kзz(ETu .@"4vM7gىwp<={Agv~AGqDZar{3rU;/%@ @ @ @ @ @@QX$ @ @ @ @ @ @ @/ROgOntPFNm%w^'"qe4KEKc&O||ARs5 :u-m&iرy!_%[nDQD묳N-4hМn9?yn?akQfR(Zv!?L!pTag)@'0}'x'y晥`aSLI>`ySꫯiJU:rPr9Zߧo=_㨣aߟg=#RYyzV[mƌS^:X^=.'.B ܵk|x7եml}嗥Y_F#<ۤIԿ|4o_ a,cܑGY6m껣>1_|Sr-s{aW*:u*U/y<$ovI @ @ @ @ @ @`h۴  @ @ @ @ @ @ @@BU/ni;sW5jTySU曧vڥyӞ{O-Zۮ.1ƍK<@~+"vaUiȐ!n#FTw!G}4|ܼܟse<{o&/B3 8PaÆ໖-[MUK.d~\?`*@J"Z1cFn-R:ʢM}[Q{^ "`AQlX#vɵ%׆{4Mb5Ɩc!E&+QTT|[ξ)ggV5̞9|;iӦxp6`\0EtRSiǭ4ܮ?Rvm?yP#F=#.c^7ί52<#+СCk03fnV|g}DEHBիW9'GUڮo#B/?tqǥ'x"E['mi}M[mU֙pTpq8J ݻW}{ة ڄMRxԞh+;{M=\:3'#$1]*ܵk!y8ǧ̩=]1(B1k-[M=j|>;Njc9&,/.{+6slo߾TWlg: @ @ @ @ @h [Uv @ @ @ @ @ @ @||ӠA N;4pIx`Š w}7[AW9F>AŸ"qnv-!QG~WfmrYl6:u"ovJ0矧#G.pA0/<˛o9j۶mGQ~y{EM_|E馛#^a믿~yT^j|ǹ*Tٕ%XNG7jwqGz\1%\N8tyW֘pD8jQ:tPl./_iN}AQVhp}k,οܤvߢ[!U< ۻ;sA}-{~kYyKUnRۚmqko쳣)qoKS;W\1u1/[oAg @ @ @ @ @f/ q>Z  @ @ @ @ @ @ @UҥK袋;-Tj믿NcǎMoqΊ7x#=yXixvUW@O<1=裕[׹sx70?<2k֬t]wիAT'+/~QI _FkSM)K\pAL2%5*1"i=[6eMӳgЩSJuQ_E._yz8xG^@VUa?,fkӛo=:qW_޽{>l#OoV~W܄ʦoS!q~_qWw߽ΚP: * @ @ @ @ @ @`lh$@ @ @ @ @ @ @hoc*KF٤i#lylEw}y}IzjҜtg=X@ƖXw;߼??r[ngqF塇\ {'xbyu"tKw}wnyk;?яjW^p9(,b]ӧOOJW{4_5ύnlMZtE+/"ivmEUh@k^xa/Ow^gmyo=EZn-{w)z'vk7哭y/K?~|ySշ9#|],ǿڴiS4稜Z*yy #FHg}v6lX9dȐ[oaybo|iuͻ~xzÇuD_j+6=Px6pԮ]bHw}Ӗ[n߁_0aB׿֨>zGN:?ǎPk\ժh?#7YgUn믟)6mZk?k^  @ @ @ @ @ Z1+<  @ @ @ @ @ @ @J|'S.&MJ.l?]tQa{H+rz7S~RϞ=sXlw5}umQZ~sxSVu9:{wL(?k>"|*'#k=L&Ы1n~,k}9uce긆+Ca/Ϯ6nI'C"vWϡ|ws +"x6jM<9?Hf<0r!W^imM_|E"X|9nFWo~3Kƹ4(z}8pjs|i!'|rƱ޸VܷoRq#95ݺuQoGe{v1=裩O>>Z+=}O0ŘPKAqt%ߋ1vbqK.$߃?x` ;KqoN;4eʔbH^z/o_|F^{7߼Fj4|uüf,Mu{%B/=ңGqDt< @ @ @ @ @h@1 @ @ @ @ @ @ @:qƥO?=w5wb&lxtᇧ/SGհaÊ:(N;?-B]t:eEiEVWr-9*fΜnaDO~tAU{A_s5 1L:/,Tg}vϣ:*=^q~oq~FvСF}F?y):t)}SNI Tz"9眓njsL,؜6wl۶mW_".6ç0#l#laZj=Pp?2dȐ>lѣ̮oU;.FP`Ƨ+AUh/#~o񮏐{T49[ltW~EHg8} @ @ @ @ @ @@DuA @ @ @ @ @ @d;3P9g?KvZӉӧ{N!4v%jiVjo8s@IDAT*#iΡRjѣG@5/t-]wuÇO#FۇrH9rdގ>}mAZȏ>(Fk<3zꕟ![~^x4eʔ_x;-V)ǭ1<މ8qbz饗{$w@oC y|<ށ鈴cǦYf~*eҤI)e={,NjP){sN*Ec70 uuǪFo5Д9b83̹)X1ܹs.B:SG]wݕ* @ @ @ @ @huI @ @ @ @ @ @ @*ЦMAL ksRl@c"txРA:v6`iM9ny9]vٴV[SeY&m>f.6&x"|8}Ǹf-Yk;{sk]sq/8M:ƴoL@ ֤9_|4jԨ&msK=Ү @ @ @ @ @ @`ĸp__gG @ @ @ @ @ @k&LH7pC;wܼ7ctK\s3NEl͢  @ @ @ @ @ b\h/#@ @ @ @ @ @ @]v-ѣI8p`A|秵c <#F4i7i\55W[ރ-jY+ @ @ @ @ @~A 5v @ @ @ @ @ @ @"Fη\WI`a>|x;{6p @ @ @ @ @@۪f2 @ @ @ @ @ @ @ @ @ @ @ @ @ @\8qMM @ @ @ @ @ @ @ @ @ @ @ @ @TW@cu=F @ @ @ @ @ @ @ @ @ @ @ @ @EAs @ @ @ @ @ @ @ @ @ @ @ @ @ @@u1Vl @ @ @ @ @ @ @ @ @ @ @ @ @ @\8qMM @ @ @ @ @ @ @ @ @ @ @ @ @TW@cu=F @ @ @ @ @ @ @ @ @ @ @ @ @EAs @ @ @ @ @ @ @ @ @ @ @ @ @ @@uUw: @ @ @ @ @ @ @ 믿!@@xvXZr%O PI/T @ @ @ @ @UXF @ @ @ @ @ @ @W º΅Tx+֫$@ @ @ @ @ @ 08> @ @ @ @ @ @ @ @ @ @ @ @ @ @Q? @ @ @ @ @ @ @u L<9}׭뤝-Z@Kg}E .oTC];'p4 @ @ @ @ @' @ @ @ @ @ @ @2N:$@ СC @ @ @ @ @ @, qA:F @ @ @ @ @ @ ҬY @.] +5eʔ̋:"%\2ٳS%@ @ @ @ @ @`n b'@ @ @ @ @ @ @-T`M7MӧOolhӈ#r'iȑ h;Չ @ @ @ @ @ hېN @ @ @ @ @ @ @ @ @ @ @ @ @ @v " @ @ @ @ @ @Xp^z^{- 2h￟׿v\< @̜93]~Mj  @ @ @ @ @( qD: @ @ @ @ @ @ @-УGtengOL`ܸqs b#A q @ @ @ @ @B2 @ @ @ @ @ @ @ @ @ @ @ @ @ B1 g @ @ @ @ @ @ @ @ @ @ @ @ @ @5 blW9 @ @ @ @ @ @ @ @ @ @ @ @ @ @* ^8&@ @ @ @ @ @ @ @ @ @ @ @ @ @Q@ckΙ @ @ @ @ @ @ @ @ @ @ @ @ @PA-Y6 @ @ @ @ @ @ @ @ @ @ @ @ @hZI;g @ @ @ @ @ @ @ @u |>sҝ:uJ_ @ @ @ @ @,%|q, @ @ @ @ @ @?}Q7n\w=3-u+^y[oWջz%\O>$=SO|A>n]wc{4}aRjt?Z|S~j7We_NO}SN9%>)k_WK.]]q?"pv  .#8.]tE/N]vMӦMbz7FUTW駟N{W0%ݔ~뮻o_u,otQG5nj"qĉmСޫoN;9sO?Mmٜw}7_9&;mݖ^"PlmIw_..=LK{l9Uq7{s9昊i_|E:UW]Ug=3wСo;OQaq/o߾^l}Q]qi+| D{Q:[n;a!SYOw]`, : @ @ @ @ @揀  @ @ @ @ @ @ @@ XkK,W[o)Sq믿>L"W^GCǎGH{ԦM&Au;6=:=cO>)1.91>yL] /h1,W_}u:CҌ3Rn[l_믧-B.k+E^*iwN,HsSk}js9'~]W_Ng}&MNjkY&kfoVZ)-⥶8Jk4GsncRc.]jk1hĞ={եeYBW=+\׽{vqoĽwKx>nƴN;rb|OS:C*bÇ%ay{kSG X @ @ @ @ @k`@ @ @ @ @ @ @rbq;#ӭޚnt%;B"!?1~5@ȓO>9m۶Tۦ@{キ ;ci|s7^zo;}Wi7>K/ti#rĉ5b'7ByRdE8`7wqiwqDxW8>Z=QF9+6,[ogƮyvs5ncx֙*i|jv-_ 703vsN:)ŧ(qE榛nxw-Fc/8}#s}s\uU5ڊ>_*|/M @ @ @ @ @ @@]r  @ @ @ @ @ @ @L`WN+cF\5+<_'1[n]fmnXm J]v-ojgC'Bj07)R8?s~RcT91"M4)L杲 0 }i֬Ye- ^s>SM6)"_L?Q"C}'sFeѯC܋;k6 @ @ @ @ @ @-\@c O @ @ @ @ @ @{%X"m>lU_2})q4j]v%>:coNMx_GtA9@O];u6l:6`Խ{\_-4|!7pCy=|-d]k7߼@M2%}yM;cŵ 2$׏3&IwZl 'w_7^O_#6\g̘.\!Թ{wܑo[/-i7N~xof;S,կ~VXa38ZˏYiӦxuQiu!s4Թx9qo;Nzxٵ^;+^۷og;?Lzja{G)g;.#yvJ.l>G;Kc7¢C|7./kQm^zi{?N>,ވ^ު=ISrM7x1yC=4;R`8ϛ1Kݡe=aAu{_;yvmWs}A{o)(¨S\tE mӦM!_Z10cǎ{^:SYgk:s,h{7_?ᚳf$/Q4c)+C?>ŧDa}% r-K,o.\"1~SEis\.J"PG͟{|Gy8jԨƸӧ~"2W߇x`s&@ @ @ @ @ @@khۚO޹ @ @ @ @ @ @ @"F?uY)"SQL_ɓ'ݵZnws7@ڥ@[vsZm5[ow֭qE[ѷvǣ:*u9=)¨ZB_kЧx 1FEF۹mAO.*/_ۊAJtuץO<1iҤI9|4kEk0Fڅ^kO>9l0#R9Crcs99|1aW^"`/Jyxcy{lGc8vU917fc=<.4t!z O?}cau}WsH^#9,/7qK167L.hugJcǎbl]s0>\_0Hn!댩FESkug7ˉࢮ@9\$~C /{} 7191Ѻ뮛ĉsb\8gEpf;.cϬʌAE0B @ @ @ @ @# ѝ@ @ @ @ @ @ @h@|{K̩4ſI>EV17UrՍe]r{θnw֜ aPԘREW}h6mZɧRK-"0ʙgY޴nϯ5GP̙3SNJWlIZfem=-(7b==P{ms1)yWfuD\ F0[o"6"s-!D@[0F+G]bL;viq]wݕnƼyJ+o6i̘1[V1$~',[;Ļaѹ{_c#X0\vey];vᔻ{>hBph_~y0xS_FsW4չkPjgϞjy?yCExb>~/ +BN>}Қko޽{i:~gu\c5qԇwᄆ.]?Sƻ*_>vxV!@ @ @ @ @ @hܿdF @ @ @ @ @ @he3dȐpL aÆ+aGPU'zKhuM b,B#`/M?cƌEXcź>,}GzS}W9v{G8f5=Cek0(gavўwʃ{"48"nj)A|C]wݵD_"]ڴi<\])׿un{ZkDrW7KPj7ٽ^{ՙvvPi]ŀ#8,}AQ|7չ9/_8J!Ŝq]LӧO/=VlPN|x؈[^,ښ]ccϷǭ4>X%~91~Nni!Q*\? @ @ @ @ @ @ v @ @ @ @ @ @ @?Yq6K7xc>XV:ƍ+fy X>5l)}"H74:t萶nL]bݍ]sGXS}]<[n9h7Mny>5b?a^p8K.j+䢔NH^xa>M߿v @J=Cv %^{-vҥhN&L0:V?ӟF~ըoNC6ڨh+?TW_}5}ۋڡQZ*N:Z87u'ON;n)u]o 6>)qR粍8ӟ~t+:uꔦM|tʯYI&:M=fѣG*.Rs93M2%q7H@:s\V,ƖsDw+R<  @ @ @ @ @ К*K,  @ @ @ @ @ @ @esNZ{sC=nj6t4za*JiWEݐ!Cu]C ؋[)źpڵkzf,To>.OL~AP zk02t4E03}nh;-\qR q)ij^| 頃J_|q&߭@W^ :ˉ'~ǏOSеiEڪ:u{?9;6/y饗r@cDXc5K_ioݻwT] G- +vjdesyR/LJQ^˃Ow\z'RFe>}Җ[nwߴV[՞2d45N{트'R9xV*kԺoSW߸c:ǘ\:)رc^֭ޚ+Q @ @ @ @ @4]mӇI @ @ @ @ @ @h}]tI]tQ>{7oB^O=TirXĉoyOF㪫رc".~=ztyTܓ|֭lǸW_~iӦ^l9eԻw~;]|yW^yenR>}R}"s.  @ @ @ @ @ 1K  @ @ @ @ @ @ @ liv?7){o=_j{ylEw}y at.KiG٨ ?O>36§`Ai]ko~9Herk^zg̘Qym;wgܸqW^u$z1"G0c=Vc؉:C=\ڵKlI.5~{Wk!(M R,?M6lX_{#gy&?>]4q=VYe/#[oy\E])?¤v+b:餓RxhŹNc" 2z#R)_sj5|k/(Epj7ǹԩSm*.i„ U @ @ @ @ @ @@16h @ @ @ @ @ @ @ r)̟zt7WMNHK,Dꫯ9SSf}QE]lWt5yy+raQ3gάq:(GbO.>vsۋr嗧)ST쳠U6d%?:ĉsk]G#0CM[ouO\Q5&;<{z9\| _ui;sZ~˛+n79ΫGe(Bn/6ϞI&5zRK-U rЫ*[RFرcLK/1coN󡢹K^mC=T^]g;뭷^\=*s喫اRe&FlmһwTvOh^"3dk12h ><6=쳥_\UzS k7Wm9믿~^GdǵL6-sm  @ @ @ @ @ @oh @ @ @ @ @ @ @ G?gOoB F>]tQqguV:cs}7-R90[nOW^F_>Ehث:wTs{H+rz7S~RϞ=s0Tlw5yǿJ+C"ti|#lʔ)`t955Br|Ծ}ܧ]v:V5WùXO<_Oov-G]o~96<4hРt衇wkFl g1}{9X9>1Cڶns- vmN:aƫz6lX+,9o5X#E `7|;)޵?p>cUk9[8xEq OMQT縦EvzCL#4~SO=T~\ @ @ @ @ @ @ @ @ @ @ @ @ @Z@:iܸqOoTN5+m9hhĉG) P?-ҥ^rS5-袵UuM6IOlNѣ8x[VQU;7xcm۶MKŰb>/\K.d\gnSytuוa}FR\4"8~iX^zy#'J\c9&+VF`.ƻ.N:%KqJN{QG>JSH@IDATt"C94ָ{g^D^8Rcp3v{šaW+9]zyih} @ @ @ @ @ @@|RiH @ @ @ @ @ @,wyg5g?KvZF8ss=W]żsP|"lo5׬4VӰ#?aw"iVK+Ϙ1#9Κ5+EK,11CN4) )㞈{#Sĭ su]7giĈyCI#Gѧo߾s}- 9j|!k+rmh_~^|a,Lv}A=鈴cǦ8~nݺ-k-_pcu@xE^CO?4?LbUW]5Sy}G9sԩ9W^ V^5`[o/qz^n7w8]%/ aErbU?I @ @ @ @ @4@v  @ @ @ @ @ @ @|Xr%Ӗ[n9WCi&KݻQ_|w:*u^Ok*x`x59V]vO>S-.Knjv1mSdPAك j@Ϛ]"pȐ!5+^5w./˦; @ @ @ @ @ z @ @ @ @ @ @ Т>8Mj 4C%>[⚛qZaÆ5i[⚛wZMйsyVM @ @ @ @ @-V@ctN @ @ @ @ @ @hnzѤؤq @@Z⳻%yWe1bD޾}&3 @ @ @ @ @4U@cS#@ @ @ @ @ @ @,mQB-G%>[[Q>z @ @ @ @ @EsqnS @ @ @ @ @ @ @ @ @ @ @ @ @ @* &#ٻx* "]Ċ-XR5Q&j X5M 5ј(j^A7 Ď 6P|xCjG$0p4bĈՈ @ @ @ @ @ hېF @ @ @ @ @ @ @ @ @ @ @ @ @ @fv$́ @ @ @ @ @ @}t钶fwfF8qbk/ @L2%]tEM @ @ @ @ @f( qD @ @ @ @ @ @ @-Ks=u#X=2{nAw\۷\r!@%駟 bYC @ @ @ @ @ mkd @ @ @ @ @ @ @ @ @ @ @ @ @ @`8^8&@ @ @ @ @ @ @ @ @ @ @ @ @ @Q@ckL @ @ @ @ @ @ @ @ @ @ @ @ @PAs3m @ @ @ @ @ @ @ @ @ @ @ @ @ 1ƫn @ @ @ @ @ @ @ @ @ @ @ @ @ @`8^8&@ @ @ @ @ @ @ @ @ @ @ @ @ @Q]k\5 @ @ @ @ @ @ @ @K/H_~eEw9kPF @ @ @ @ @K @ @ @ @ @ @ 0s>4z4v4qԳgϴr˥曯$N{:*tV^yg7|dO۷/o?O;oZveK><Ǣcǎy R%\M_|OJnz6muO0a}c8O 0IRګW fմzϧVZ)źZj:өUAXƉsW*>h+.ŸvQ[og1uf)SR<Ʊ?0m5ۉp#FGf?~W/e]҃>"^*뮻Ҷn[/6".{Uynr0q>y%:(}ǹ}uС3{~x Yb%k:tPgp*³;snS ?vmte9[ophP :'j` /P'oT~C3{ImQq(ڵku]QGYdR؈kcp7򗿤ݻw{O7pC>馛;SbAlL2[|lx[ηjڪo1}ֶS39(iN @ @ @ @ @ 0k1wg%@ @ @ @ @ @ @f <3LYgԿԥK/z*=L_| ۦW^|iJ5{*9<_O+E-X6rVAoV_Q]tT?nܸ矧\r%f?>]x׿umc6b}x뭷k =OQF뮻.mfoN?N5jKnݺ?ĉ|29}5ӧt?'^^{mi)/^yceKEgq/L ,@q(Gcp 0{ <8ū(W_g3+2EpB -T ]ͦh: @ @ @ @ @ 0 /fᄝ @ @ @ @ @ @ P ;Oa#/S_^q']wݵAofKn֠]s59pڴi9(3HrJ.=zt.Mڏp;Sp7A C=4ū(Lv[ׯ_龟tIi=H3tU:Z(guVկ~U:_vecհ*dn{5<~{$iӦ, .\q~iرiw!^Y_c3fL[.R?\."^{\?|v53\g* @ @ @ @ @ @imgڙ @ @ @ @ @ @ 0 |y67x^wu6k[r%S^}y5nѹTȆJA W_X[Ϟ=+51VeM6)-'qӖ[nwv3UCKoHtO 驧J뭷^n{QGp Pu+JQw!@ @ @ @ @ @ @ bt+ @ @ @ @ @ @ @Rg^fefw^xtV[ouZuUxG}tU-~3&=:"W7}yM|p~ 'L7ȯ1瘞Մ ߞ+k=`\_~9okUVX0+s=WlNcǎCmxt5Tl7tS>6hР(#FHSLh_| =z{U#wޙpq?OZԩSZk^{Ə_|vzӳ>o*nݺvm1{冷]7<._|sV-Xgܐ!CUcXu]k"6qm6U/s]E`O>6⊹{ EV EdM҇~"?Nm۶͡AEHPJ7O͡#O" 3lFӸZ~`UkUݍ`L8؜{8FswT~ۧM74u!}94 "qOO?t#]ƍK|gl}KNj?U9l/D0X:s]Ec<3g7sw}9t7vbxx|`ǖ*Hvۥ?" ۴ih#nHW]uUZr%kL1Xv>^w嗗zG`f\xE)R -5jƹ瞛8}Cux]y)xr%8}#h6s7x8\HK*ŽwD09rd[o~3Wwg} 6ؠyU^{9*?U^#uv@qڴi)_f&4%B#|(Muk)m si+/Ƌ/81ks,)zE]3+B @ @ @ @ @# @ @ @ @ @ @ @5 ypu!iJ;vl{}~Z(=9@)ge)UM&l,9/[yW_}50ΤIrSlGUQZ%+U곊@,f`UcUމઢJ #حw޹]}dEPwyocy43S1dN8",Eځuũ# 7B#D3Aߎ;=+q|РA)Bcx=tv)0Ƴ3&O_wuT⠃!x];GItONwկ~"1B[O>O>IwygZwus_kPK`_=smvay]׻vE(?Osf̵guV۷ony?9C/^\sM8"/K~yySwvsxmy:vX8A3*a}Xcݛ)K/C NV_b\y(wb_B!  @ @ @ @ @ Fw @ @ @ @ @ @ *"g%k?SoN:6kpJoX .`0(1Fb-VлRlD^XX1F0W"/͢{"<c>C鮻YqˬTU6.=`^ORghFhfy#|7JƽQge?zq?z903uB?7QF|;^9Blj {kڴi)BI#L]thK7BxuVzF?8E3*{!G}4W^yaqGv+JS:.pZr9衇9X⋧-"{ʔ)뢍w @ @ @ @ @fA[; @ @ @ @ @ @hAMF嫯Jzk:rQ-]|3Zb%rUQUzL.t"8vwѯлƎErH/ Ƣ}c3{& ϪVw"}y>틵*O".˯aÆ+bzؠºp)+\U|c؎',R|:UM`yO>QcFXԩSӆn"vp}7WG8a}e}s(zRuy+8be6aQ>\ozK- T".UtUWsT器7&MT=7ߤbFzv-2dȐ:n;C/wQi̘1)^Q\/6VӨ7ދ56vcTkOοjƌ?Pȍ6(NٟQ|ߗqϵ @ @ @ @ @ @`nh7.̺ @ @ @ @ @ @ @3#F{.?O.hG:Ss7OyEXQ:tPl6,#xcǎ?y~xѾY'NgqF5jTzG:SUë*؊JE)o_UV͹!guVW "l֕n!wW_4L?.R9P4ڬchg0V[o\QG"\7צW^x|xĉiӦvoh׵kbc/6ǨЧ~yR}lXQ^{^O~jWUe8kY -89믗X~nz~M}sB:?>Ecu]b{(lwys8∴馛V>k- /0]q8^ܹszSmPkZk?Un7u=o[~]j/\&Lȿ%#8WL!ĵ:\.ŽaEgHT{'@ @ @ @ @ @@kؚ @ @ @ @ @ @ @Y`UVIӟ"$'=4lذV[ | _[nIO=T \w}-BQ#P'\ gwqGKaNEj|=z_9$0Íޮ*GAHEɓSX޾X{[JbMy0މp^:-2i-L /pSLu1n E 4(})s1lWc~.3& 2$"01xGnn饗r?5kw^kZgIq,_|ݪműm7vhhW_}Y}_5ޛj|>}ֻ48t+f},KX~݊/m @ @ @ @ @jA[< @ @ @ @ @ @ P[siwLmYP}>|x1.9,qǧ+_EJwy+}!@lAp ȑ#sTR;Us衇s=7] J*C ](틵liGԮڠqڨ}O~GÌ=: 8Ɛ=Oqƥ^z8n@%YEgEc'NL~{~ :4?[{F9C>SXx~W*mڴT]o]|DpJvH[6M(X6wսQ1o6ۨѸ|yח/NΌrĈiر{,B?#pNrJ<d<݌X`RWѰ)~,>Gsc9(/ ϪT1/3FS/T{1D+F讻p sm@#>`!i{wϲ"R-Be~/B{-2"wzNJ-2FZ\'x=6/ƍ{|IY^_޾vbgϞCMwqG*qp~/;/*BxR)sլkzk/c nS8?Sy ;'?IU @ @ @ @ @ @@Z_5onz @ @ @ @ @ @ @ZL "2mڴt=ëZ}ͪVQ.4a„FkyR8dȐF1/| n)E`",w)Epߞؾ} c}M[mUf:S=ތ"p뭷zk'Pni1Yaս{ԭ[<|^x!oFdCBŠ~yө_4W_}F{M6fmrj4iR M("1>8v7wgVx󩮽}K.vUU3<~:c+E:fAEqj Yf{8 ,@*~ ض1[lm*UF`b|F˦"xVR]̷k׮e]VI:}*U)BNxJMjM2%}''HW\qE /͎;Zk훻Qf 61\\|5|bQ.BZ8^aXy(;CjL=P>^+Daq^{.'pB5jTyGΝ;?8tA5W^yeFqiUW Q}ϯxVa .3p&8S3!kfƜ:4lذhMo>G}t>AEbꫯN_~y=#s rq,o4tWW:8><38#Edמc[oMPY=}Ѯ(UVq=VZ)Wo}!õ4e9w);0Uyx￟R~]2?} @ @ @ @ @ @@RZ @ @ @ @ @ @ @\)>_>-r9*Š"+JOmKt)w>ozW[m::v".]V\qҐ7pRYy1L,H8t駗aU?VG91«K.$[>SwɧJ!4uQ9H,#\,"**#,ºz왆 !.AUiy."`.JSWb K-Tx>m]}MT_p&SM|铞{a:t7HN[lEzR/߻~i;vl3fLjj.]gwGޛ[okQj4N6mr[o~+P߶m9DdXsvheiYLfmO?_^{< &}뭷*~Ԟn\kܸq@<,Tm6wߞ7_A/BxE5\3Gߝwޙ%Ob?A:C'~xf^}|OK//JsdMRoq?{)Epyn7g{u9$10_4qo<ǭޚ=0z(Xa|S~O<@>,?ܹs^G|,<ӠArs?Zk\^*;˛n)+s)ۜ殷8w|"5cov(hYT`gqFMyyo} @ @ @ @ @ @@L @ @ @ @ @ @F}bӟ1SgN4iҤ*1c9>T?@ǧ{/a-i%7:'k`&[ny|xގ6}mYfm׸#޻wOoj|!kл˦7x6sFcέ[n?Ow}fbg}3oϻݻ eY&6/رcӄ rlވ{jh|?B;*}iе裏ra j37N5`*7l|?uYg~~  -PoPDmݖ}* @ @ @ @ @h5& @ @ @ @ @ @ @VM6)BO 5N:5\39'j Dbckm۶9$/fVsF@f93U9Wv+_U9#A7_Z}$Bu_ǦW ^z>EY$mF ,=Kq>~ҪZ'>ﯼʩK.c7&MƌW\qԭ[MGc>kFرcSN-\ZtEKmiC y晧_Q>稏9Ǽ" !9s*2󦥖Z*-ѣĉSϞ=ou--pᇧO?iF P~n8#nֹ}G @ @ @ @ @s ƹZ @ @ @ @ @ @ 0 <~m6EGvqI'>#f@ oVxJ ~.^RW_}5EƠ @ @ @ @ @f'A0 @ @ @ @ @ @ @@V\qŴ n0aBz.쒮t5;RS>}="8v裏;Fڴi^{ycFi]~Ůw @ @ @ @ @ @4K[љ @ @ @ @ @ @ @`V ,9gϞy]vYUk@SO-Xx/J8iҤ5ޟy红}sNc>䓩M6OL3Oz /E߸'tRsp,}7){ 6 u9jWԷo>E~y)=zHjxm֨%Ni}O=FNlMkg+4t޽Z _wu7n\/e][lp{^z֩6,?Okvj׮]Z&LPkꕷrK߳gڵkQN6<+9~R}>_~In~^:7 8\/R>ҍa\s[ne{ʻ̑:W=\w{<묳Ng}jvc=jڴiXctᄏ.O?4r)i뭷ο]tI^|WԵ!O?R\CI'Ny{>_sǹK/y^~g<餓NJqo^49/<`|pСC?ӈ#_&G`s%;=PիWwW_}|曧N:7yZQI @ @ @ @ @Ułp&@ @ @ @ @ @ @|Zl_WtyJ%#Ĩy9<誫JtiZ1FT1ÊeRaM?wq9,F րNQjբ!xNs's+v%9NH\pA.F?_s>(E'~?|tMAco5*ŧDa]% 9sfy`âw.\"1SEis}.J|'̟(N>I~gy8t}z0aB>\uUzon6NZ_ EXW]8Զ'xb7Ԫ0•||X!)ݻw/u+Ji윫S~㏗?[lA>XB`^ntǧx 7.F8cຓO>90F矟>4eʔg=a #tРA9|1{[p{Qu]Vr1Xo7>$۱cSOC=t9/E^`>)~+f̘8Ym87ZEL}>tKg笳Ϊ?"3L~a!_~y>hzw<ǘg|6l</.mήD.3C+ggϞU79Zk}|Wsb߸Sߵͬwk,Aq!  @ @ @ @ @S @ @ @ @ @ @ @_ yN:@Q V0E+\'Ǐb%MJ߾}S-rQ"nso֬Y߿;?=\C > uQ)Wb`۝w޹.)DcyuvرF!R8ٳg^CJJzYmkU1ƭޚw#x-ƈAK[ou/S_~_ʇhcgy\Eb&l&Nf(/r믿Nw}w]gurhСC˻'0W"flͪ0C=4F8a?!WӧJcyDp_yYuUKj_}a}_F`WveF8nnr}m*:r!niE J:7e|MtP) 3~|F#So6R8p`Fw=-/LiOꋝ՟\Sަ^ XscFiso۶ml,[lE>7jԨZI[w,Os; @ @ @ @ @ @@J-  @ @ @ @ @ @ @?jLzM7MrKdq"}^~岚YEUcvmz*!Q1NT;SmnZfefyنZ`at]wqp"qfjݺuq^+J˖-*̹?L{oqq/Ҵ~U/?k6,?W7tS9rdgm}I?p}sCڮ;z\<0GbQbA;vlv:u*N1cƼ{O뮻.gi؉({WVXC[+Om魷JE~ިoժUСCҤI6Ź0aB~G6ڨa#(w*ѣGJx|)z˟R㲝Xk ^uUn(G\￟⽻Ymƍ+bev\ߣtҥV)w ˆ:[; 6mZ>]'W,-%BYiӦM$xN!@ @ @ @ @ @, qN @ @ @ @ @ @̿ JZ`1bDիWzGRU,d'xbzɓSΝs@W(٘Ҥ汝G}4ŴWevE0_|~*gw{ߗRewz8w믿 +Y.Ru[+0絕-glsmc֧|I~Ѿ<1 <8uQgIAzݻws=S>}g2N :Lsէe˖;xov!;{wn~ 7]y8W:Q]Q&MThŹm ҉J87f/LS^_޾ݺ뮛=4z4~tYgVZ)7ncMm۶M~m4hPΘ1#[næ"LNGc}|YWk.x)\[,h?ņI&f͚ήKEo馩O>y38oVUfΜz|z׮z߹@v^{)_}iܸq ߡCR_\r%kmS[e&TW\1A{u1N:ųT8m[}e]6WM07ŹkGrm] @ @ @ @ @ 4_@m @ @ @ @ @ @ @@mymG~8W_}U4C{n:ҴiӪyG믟&O\8hݺuя~?#o#oE-sۆZzy [mUZxk]B -z|h_a~iȑn!gyfn{d}ι7mqϪ|_4URcM2%}ѥ0vء8eK`s=S޽s^{1cԘロZ[(^F[|Y_|q2dHq;x)u?MkVN}Qi0 Ŝ#XpN͡tT¹\|wwX?*zj>AEb/K~r)908;3}>(<@zgnX|^.>9aqaE?<F_|8]9UYmrU57yu@W~J}ؤ D @ @ @ @ @I @ @ @ @ @ @ =("nqƥV /w]:#s}Ju!EbY-9瞫ѯbm͇#Fۮ<I&z*amZGoQmF@e[Fb\j* 4(E׬JC 9>ѷ߿ԩSرcS6m8_mfr_>iWx笺顇J-[mZhQK7iJ88Ҳ.K㨫*뮻ko&ls(VZi;_W2,5$#o+"0>"k(o_|_<GaFXe|oJ:=-#K.94N;q @ @ @ @ @_;T~mF$@ @ @ @ @ @ @,k_~9q9ܩ?1Fҫ;vLu"8?1϶<A1nes15.achw}*Rܬ8餓rX|~9+ŦMn]|r˥SO=5E-yV ^|Gɟb~O~vm6H?-RSj +K/U;cj׮]qҍxw 馛n*]#yd2"P8N8z+}t.SF(OרuY)|;4zY.B{#1{K.<:ߦN;ƒ#hʔ)9綾^q^SO>$-9$zG cǦ &ɓ'%X" K.)yK Zk<!C8 ]qy?ڬlf̘".B"TtWL /pf7ߤ^{-.ٹsz.}Ou]7y4߅s\3ˆ_Խ{[/LJ8qb1T۶m>,}N4)_uV{GP%\2s\ QFXn[l j.#;JT6"{>I @ @ @ @ @Ch  @ @ @ @ @ @ @ڵK{Qbh֬Y@( !yiLiѢEZ}1v8/}q)mhPi֭S= M6٤#o߾ הXoSߔq~b\V_ @ @ @ @ @h `iJ @ @ @ @ @ @ 0wvyF]M6iСn!ŧ1嗿eO~ҘM3?ιI O;Ooi @ @ @ @ @ @`ĸtK&@ @ @ @ @ @ @5Ŏ;6Nƌb-ΏsN68'@ @ @ @ @ @( qL @ @ @ @ @ @ Ҩ)lٲQt"@$ۧ.]4joq58禮y~w~kL @ @ @ @ @S@y߭ @ @ @ @ @ @ 0O 0` @XoR|2?y~\VJ8 @ @ @ @ @ 0  @ @ @ @ @ @ @ @ @ @ @ @ @ P)A4 @ @ @ @ @ @ @ @ @ @ @ @ @ 01qb @ @ @ @ @ @ @ @ @ @ @ @ @ @*% R!@ @ @ @ @ @ @ @ @ @ @ @ @ @渀 9N @ @ @ @ @ @ @ @ @ @ @ @ @ @@1VJ8 @ @ @ @ @ @ @ @ @ @ @ @ @ @8lj] @ @ @ @ @ @ @ @ @ @ @ @ @ JI @ @ @ @ @ @ @ @ @ @ @ @ @-\ @ @ @ @ @ @~ԯ_z &OUNZ:(k׮3 @O>FZ @ @ @ @ @ @  @ @ @ @ @ @XP"k r%c @ @ @ @ @ @ 0O 4'geR @ @ @ @ @ @ @ @ @ @ @ @ @ @ZZR @ @ @ @ @ @ &LfΜI-[, /L{n@/N*h  @ @ @ @ @-o { @ @ @ @ @ @ @@@ˎ @ ЪU @ @ @ @ @ @, q^;F @ @ @ @ @ @C1cƤ3f|3pi:uJK/tĉ'|27. k.uuZ @ @ @ @ @ 01ia @ @ @ @ @ @ @TW^iʔ)M+0`4dȐSOMW\qE}jG%6ۤaÆիF @ @ @ @ @@4҆ @ @ @ @ @ @ @ @ @ @ @ @ @ 0/&a @ @ @ @ @ @ @+袋]veޝ @@>׿u hiW_ݘ @ @ @ @ @ @`gK @ @ @ @ @ @Xt.  =xgxg5X{r!@%g b[خC @ @ @ @ @`hْ  @ @ @ @ @ @ @ @ @ @ @ @ @ @T@|zL @ @ @ @ @ @ @ @ @ @ @ @ @,Ļn @ @ @ @ @ @ @ @ @ @ @ @ @ @`>88&@ @ @ @ @ @ @ @ @ @ @ @ @ @ [3 @ @ @ @ @ @ @ @ @ @ @ @ @O1Χ7δ  @ @ @ @ @ @ @ @ @ @ @ @ @ @(bA\5 @ @ @ @ @ @ @ @ _~n߾}jB  @ @ @ @ @ @`_7 @ @ @ @ @ @ @߅|x+?8-2iVJ{N[1ӧ~F}m.hZ}~RW^9-¥cǦ/"-"iW,zs}QK]͛Usd[;iy1VX9H|Ml֬Yx:ҹ^zZtlyG`ڴiUVyBhg39餓yWcÇO}Q}8S~6ۤ\#@ @ @ @ @ @  @ @ @ @ @ @ @@c"Pqiiʔ)5=#]qU}iM7RWA= 6,n֥f\pA:J;{w1bDW_}t?yz饗JDZae.<Թs*+qP~njZد_Gzʳ>[=Ci-:3gYy`J^{;~3fxϼ.(9(rA ʜ9 @ @ @ @ @ @`^8/ s!@ @ @ @ @ @ @|sL 6pԻw袋^{-=s_L>,gRK:feܠAZhکSԭ[O3>y睗sZʦ^/L{oiRW_q.]mV9Au"8ǂ [ H)J~š<&p7 رc8!@ @ @ @ @ @< m) @ @ @ @ @ @ @TV/0^tECqCkԗWuYEyU~t5פ}ݷ^/]{?OOOS'F1#qƌMm۶G?Qzoo~fΜ٤qg׹1׍(lM~Qs;gM͚5KaB ^{-=zN]Ҹ @ @ @ @ @ @ Ɗr @ @ @ @ @ @ 0 yݻw 0`@ܹsVj*wqy#Gwv8yweذaiڴiyNs{V]uR`Sk2._~e綾^:wk׮i-L?&MTK.?Okvj׮]Z&LP]q]w5/;,i׽{nc:(:SNimMkm[o&{(\rԷo4p:GXo%p-Գgq#뮫sMn)ޡlg}SO=5ۡ#w=HZjӦM~6Xct{?t):fv%mv+e8?Ar!iĉ ]}W_SǹK/]~g<餓N})??ų_4/Hzkg:ρFQ28c-x衇R^뫯J>`| ɓkG% @ @ @ @ @T ­ @ @ @ @ @ @ @`宻D-Z̽ u裏N'|r~veO {;S/_qg7\'L^ZxV[mZlC>!hsDXT++=XC`~M6$=eD0SEY~Np .(r^t>v"/Kq…Z(}-"O>8*OÖ1qEM<9vA"u{"<0LXW,8a#1B?')Sqƥ=#+6*q_~)BOUW]5͘1#q5E{CWYe7u|>?FJUs191arO;Jz,/rz<R0FArbܧO?4OmQpj|pˋ̷z+"/wsQ~ӟ͘kq/kT'Nqi%guVaT0y?7B"/ѧ]fm!E]ٕbpݻP0;%={VhJq_}7?p4}ߵB;wQG57tS!wܑ"D3:#Q!@ @ @ @ @ @ b$ @ @ @ @ @ @ @䀠[.KwysimM?^|z w>{ocu!EcRe%C Ƹ[-FX[Qov9,,\|sH\=)w{,/!B #-Db^W\Cse?!Qt08cԭ9,NZK]}թ[niJ믿~ێ92?JӋZh=RfK/<**tH.K[jݺuvaz\j sQjsO[aA.l>ߒ*1"W3B4#43+BnlDcO?=oЋa90B{}ƺBN:7/:Y9B>aK?p*l\ D0 n6iԨQy;qƥg}׬O[o57P[ou/ONg駟6h8}RAK#z衹zVrH9,ˋ뮻.\ +5<Ⱒa`x_E`eҿ&_}ӥㆮԱ;rJ" RoI7|sJE@`1~\WU>gcʔ)ũ-o6Uq{~{Xmwa_~eK#K)>Q P/vVҨ71*?hРEQg [Do>('6(_7} @ @ @ @ @|_Z|_f] @ @ @ @ @ @ @ aÆ_~9tMyȑ9,gx饗9_uՉ%X"Ewy)ƹ;gռ^"T-J˖-վRfun-_&–zQ䪫_~ohӳgҹJD]wݕ*Bq8a^[.N6xOo~"L6fUFOǥÙ3g~6v:uT:_쬼ni۪UԡCgI&c'ƊmzU"u[oR0kz4~C[kv̘1k]!wV&Le6iy}+JYdr~O>9E nmO'ꪫ 7P:Źۧ?oܳ_?וQ῕.]o\>ĉNNiӦOʁ=\Z:۪{/ùYfu"o߾5.xiUtʏ>hA:f/ro_~>J??ߟ^z4p:wW.b5ꫯQF̮DZmAz;wk@QᬵZ&םŹmmmzku_u+B}5] ꃖG 87xtQGgy&.ꫧ޽{=3ӧx&СCk^dQ93ZWq~6vvݺu+?s)1h.q+,/v"^,/Ec}+  @ @ @ @ @ @ b\o @ @ @ @ @ @ @f-о}{ +b1.r9$-.p l*q6]t~G)<@,.6nܸ;r4~- 7o9-i[oMk𨘏"d1"-"{M9kQeUSNw\ߑ* Wf͚V]g]Wjժ6CjmԈ^Rumsj4tպ701cƌܧM6 ۔˫}qC=4mf6lXzWrg~F9眢yd۶m[?*Ωg+nz_%K]!կ+6/~xvm2,Zn/uwuL @ @ @ @ @M4?  @ @ @ @ @ @ @ @ǎs-ܒ^}9_9oNZ5eʔ4vVh8 8yoCfN J!fsOF`TF*вetAO  @ @ @ @ @ @ @ ꫯ;VYe뮻0+_|g?k8 8Fb^zxfmmAyӛoG knE`z*A Y}M_*/G)kwO+Bz8QxuX~08Wu:FqFԡJǏX/Lw(/o_]q2ˤO<1uֹ,Nm8hsY<N;-ܲ.DP)S3}Pvڥ("1k8w.ϭҧO|o髯qkF]%* /CiĈh[wPQܧ}7n\fн{8m۶MoߟZ1K.Yk*#0quͧ⊩A.~joN뮻FxƿY$]v\5a„*z"$?yp+ @ @ @ @ @ @`h۲  @ @ @ @ @ @ @=2aAEPq:>R ;P:uj|G5VѣGۦӧc֤Tro/W~,H:3Km++n6uNܴiҰalאzknV[^֮ -Pz} U<߷Arx3hѢJsԻwkҘ1cw}7q Qq!ۧO>$s1U7xc#F}i >T~\"Xpsű"8/ޑ{T=43_ 27;rX޷~[gSO=5"th%]SNI͚5+Nwޙ>TxVy\V9??E9眓1{w0Dxߋ/XϩVjwԨQOW)묳NGMJ%m)x&Ow2wU?QA {l]c4XDGM`TƂ5%좂Aןw/u̙3rwKs[>;_xxwlVw]yfmW S!+"Cb<@Ό?Yә @ @ @ @ @ bk @ @ @ @ @ @ 0 DW_}ne)B -:_kf4hPkoKO9P1}Ӧ[i"h+&W6xA|MBnR8WcyEX&f~4|p7f̘๓N:)8w"0g#8K.AjVl͚ZW|piyɁnxOĻ ݺuV4lZ#d7  {嗧W^TZ6!~ot7ָN$a֞Ϟ|Z0aBnhcĈˡ=y/|~W}u>j8e]E~ӫFTa%|A~~cݫj>U^~Ն 9#a#G3vq>G8B @ @ @ @ @F\۱4!@ @ @ @ @ @ @NfaNQ Ж"t)ڡCAy-UYdy<bz)r;Z*2`#sFHiSJge +O#NSo0`@&WlTX5[I5rJ{4hРFA3 @ @ @ @ @h O @ @ @ @ @ @ fJ6lJC wY[sU/Zlh:k+ @ @ @ @ @D@c%j @ @ @ @ @ @ @IѣGÇW4AUO'T[-✫}xF1mayH @ @ @ @ @H@c;B @ @ @ @ @ @ 0y7;{.]L @>ju @ @ @ @ @ ƪ0 @ @ @ @ @ @_5jT] @@=P*  @ @ @ @ @ @LkzO @ @ @ @ @ @ @ @ @ @ @ @ @h@6Ԏ @ @ @ @ @ @ƎkVKPSNU2$q} @;81 @ @ @ @ @,l @ @ @ @ @ @ @e]v-۳IӃ@ΝS| @ @ @ @ @ @Y@ck:F @ @ @ @ @ @ѣw}7 g ݺuK?>ոqĉ[Aӑ@.]R^[* @ @ @ @ @S[@6> @ @ @ @ @ @hZ4iRi @@cuQiذahnF٨ @ @ @ @ @ @1H @ @ @ @ @ @ @ @ @ @ @ @ @ @@k&a @ @ @ @ @ @ @@s9[oz'hf d &na D૯J* @ @ @ @ @( qD @ @ @ @ @ @ @[gϞ颋.LgbVn9 R Ɩv @ @ @ @ @ӡ@p͖L @ @ @ @ @ @ @ @ @ @ @ @ @QAm™6 @ @ @ @ @ @ @ @ @ @ @ @ @1NWݚ  @ @ @ @ @ @ @ @ @ @ @ @ @ @@F/i @ @ @ @ @ @ @ @ @ @ @ @ @ @Q@xխ @ @ @ @ @ @ @ @ @ @ @ @ @QAm™6 @ @ @ @ @ @ @ @ @ @ @ @ @:Nf @ @ @ @ @ @ @ @@k_|Qg*]vM; @ @ @ @ @ q6 @ @ @ @ @ @ @ӳ>[6=z^zfαW_}5U n/첩K. OӓO>'jiegI&MJTX?HKs=wZl:zȐ!OݻwO~*G[ovitGPk`nݺ]v%y9!n*?T>SQ{)F~OA5!q V;C+k+vN>t_nwswt{vmG:mCexEUW]Uɖ[nh?)y晹sΙF;uToD^veiw.9sөZohc7,B38t}54#,n5׬qaT|r# '?I鼷rK|#(wkZ+; X|iKwuWa* t<@zҧ~Z btMsc}'r /Cc;T;AƸ1^{-M0!uYK/Mrٷoߪ6B#2ʪ"0^JO=T|Ujᛋ.hʗ_~'M.aY|W)G:v_lKk7xcxs0欳Z{8qb|kkޙgy/^>, -PGbW_4[oYd<>=Z3Nc1Fa7S|~WZo3A @ @ @ @ @ӗ z[- @ @ @ @ @ @ DK.$ "g}Mzk>|x ^{U ؉pƋiw+!?ԡCRz뭗"/Hw}wA1ng1mᆥ8.R.8.űXgxy}٧ΐw_RP`N-TQUs b1>]y>v!PSar=أ"E{7]uU5E[.y5פAQƏ_8CS|wܑ"|+keY&s=)BKC{[n5+}k b @ @ @ @ @ @V%UMd @ @ @ @ @ @ @S`ʡu ,@`U9T/<0FΛ" 2{뮻n-cűݻ*۝:uJvXcu;lذ\: Z~[l0õZ+|98O^z)m65A裏҃>8묳0Ɓ93yi7nΩ%@ @ @ @ @ @ @ blct  @ @ @ @ @ @ @i/0l5\3OoU'?)}7)α뮻6iM74/No6{ケh[Tr-K#?쳥l?ۜaZ]J6pZjߗƍKwyg>^ޮᇍ 6 >9\XloviҤIo/vv)_C{ն=,xg.(Gkgw#GL?Ӳ.tV^y^{c۾v7ޘ٫Wx~W5qy^r;ryv't5)Ǽӯr@ܘx^xa[ m3jԨ|d%\2Epo\~P#F4ԭTߧ>;oGn8կҧ~ZjS퍧z* w޹ޠŵ2dHs.єӜshϟ~'yj?Ogyf߿۹sQƘN.5+}s=s&l.cOJ,ssLV_E]ĉvUW]5r-yno@_|VG @ @ @ @ @j t`"@ @ @ @ @ @ @L/:uK/4a|Ӕ!FQ"J믿~Stc,e„ f#2JFUǎ?Ԫ'ä}ϧ.AGXb-VIGEx5\jr۽{Nz)ou7sWc\cTW 믿>ezhGU$s-氽'x"na?яJ7>AEh 7|3abtP<̓z=/?3ExNN8oym*?".c3@Gy$]yif!/K/t:kNW\qE,DcT{!>w}wz׋~7A:t-yҿ裏f~VF_ 9G8k| 8^a܏q/c.ܗJfmR0G'G'ޟ]w]E=v0 =ӥC[oˡ[xќg87z%K'Y/~Qqs`mU#@ @ @ @ @ @ @hXoS"*Rt7\cǎUK,DFm'/`ڥ[hҲ.[Tݏp,fWYe?B>7yjEд(ZE[Qjߗnq(E]}}vyM묳N@O?4xVw'OשVr}OଳJ^{m:C?|DX3Fay9#rcns99$vҤIo>lW_c=rcr)94.G)#,KF[CFpY}%ُvPė^z)tMsλe]VS^{O O>!xXn4tkAx㍥9wqy;%!cFXk9BvņJKϹG%eѷ<00Ƴ{[0c9c=wzӟC~M>,E_gg8Bva|-9wy(QJsϥOFg+)xzԷojGi\5,/VƵ^;_Oow,295[#28'`0J\̅^8$or-uWG @ @ @ @ @.q  @ @ @ @ @ @ @H ?6Q;Wa^PYlJDz+E@Q䆵tMSu]餓Nq4l&5N;]U;$GxСCsg.zjLdSΣ*zG}sYarhSʃ#R^_޾mE].Q75,̒N8@Uqm㹊8)>S"H06۬(_XcUTFع瞛w#o-(hu+c9&5qwPPxegO뮻nz;O~ϮW~<>J=y\tE5GA^yFys3ΘM{]vρEPc@' 6ؠt裏N#FH`LV9oaozzGJCp-=X{es"2}UU @ @ @ @ @@: @ @ @ @ @ @ @ڤ"|*>+ryw4Tfiԯ_?X^ƌSڭ4Y|ӄ J}g9,*CJ |dI<K,zjC"T-"(ʗ_~"sA_~dO ]nݺMosVj׶'Yg HƍLW lF5BVԝuY9q5,}7WE\rgl}@.;SS_\;<̓j8x\5zO>\'|~n`,H~W Gp7|<ܞ{Y +Ə{ݸ7"Ғs.ߜ`*ܹsZ+Q}?%" Ъ}09rdvkvEZO^xa+c{WJƏg{'ָnը/v"<(P@(5\(GqDᩲ砩n- >Q[}]{9T<5 4X1{|"4B̊҇~bU^~KGxlFʷ*ލ^zikJѮ8ֵk]wݵ|Aқo"8ExC\b<<2R  @ @ @ @ @ R/ZC @ @ @ @ @ @hCrJZr%shME?"(HV 4*"h,B RclGYguRyNUڈ`bӻwԷoߴ[Ze饗N9cS Ehq"hС)B* mZq+?>O-Bn4jԨoF:LLT='"}~|/ݮ6[vm'}ӰaҐ!C{w"43ĦV9@>}VS/{.gJ%BĊ,alM_UW]r-}Fz7|U=z"Z%w駧8 =)29Yj;^{ɞ.U_)[4ѯ!h__cK92ƨ^&)mˏwߝyt'OwEK 'N; #F`9#}馛nʽ*fѹs\U>^,F^x!\pA:蠃i-p׷(G_|ח/wK9W2ij)_nR{XѶx,F@gq?i„ ;̟SO=5ׯ[MR̫?LݶR+x^t_Ghqy /0E~6dkog[o55M @ @ @ @ @$С-M\  @ @ @ @ @ @ @Z[niȐ!yw}w۫6:"p'x |7|z<^k #,€[+6ذցW (aўKZOrH+;(/o_qp #}wa95.-l,by~mZdEԩSik1cJMXc5R޽sHs$Hܔvr!űwO4iM#3H?|z뭷r颋.~-ѠW^Ӽ;mZze%s._nR{XѶxstmQFx8^]Kj3\^{ktVz+#;BoJ|矟맥Z*w`  @ @ @ @ @AAm2 @ @ @ @ @ @ 0m~<~Wmvy#F~a#HlUW}#,{s>}T44s?OQXslOK|ҍ7Xcֹs\C}رcZeUkXbҵqNh=+ R,? jwqZW_w̍ (w?]mJY`ҡ{2Tk ~WJLޗs.~"4srXIűm` RPtFhjy)Z3\߯ZbO!~#Dqmv.cZ]vMoy=zt*  @ @ @ @ @ V1Vy @ @ @ @ @ @ @mJ#}'7\tAif>rJ~w tMs߻+mNQ@L_|EDы/\rǣO84T"$ˇ]vن5X#y=|uE[nn:naUǛlIoj;_}UR\\SE(-ܒ^z&-Mvi/H_~t>L{TWx RϞ= /P>vtmթoLEEHkd/.e}M;omEe5bޱ(QUrOi?닶u5PQ'(/űJwj_qjbM| .`iwܸq"O?IorO?ロ & 1 @ @ @ @ @Z@V4S!@ @ @ @ @ @ @uY'?Ϸv]?~d?{>!86E ]yy+{EbyX쵶ۦ /KSE >ABEPyҤI7M)j-(wy}Xv|5>3/U > Dp\.>(/|IZtE{"tvp=#W/ҩ.ݮ+;vwLGs~;Żx7Ƴ];1B?4t:ˁe]'W_h2վ_?4~/SnJb#QݕW^!=&X!zjJϻjQ=Ϳ:<+BI]fa4}Y,b 6țq?M,L>^{?,~~ _j-&{nkWL;v,yo]'<ƹ#{sUs!t钫⹭Gyn8sDiV^k7bĈA忣-\-?_ @ @ @ @ @ 1 f @ @ @ @ @ @ @@(BxAo"Xqr!C",(Jh>i5H4zNVZ)7|)"n9HkVyV9餓\"t+^{릹+]s5رzUg=\ j0-2 4(=sl)};ƒƨ<3?p ~헃jtl1SЯ(XlS"h .!q}aSkcǦΝ;砲O+}aq]@xnsϴۧ~=q93Ϝ ~:- ?zm CELWƻdjV[-EPRK-Auƚ#|v 00(/u)}C<;믟@#2}+}#|C S;Bu[w{>8izcF_ +xU8Cs`!jR ,"h;Wyf+Ew#={xŸ  @ @ @ @ @ڲ@Ƕ`@v_|&A`sXx)Ffmfw7xcʹ馛N1\0 #Pc5NTb8וW^Y=B#$._"@-'dK~{zG[nCߑߒ]f#8"oFk)1#FdxW5F0 k}k_Ef&F "DHc=?k-^r%_(UmD`cc_4f̘#)`FPrk;y&%?SrW 爿#1K0F@9眓N 縯 @ @ @ @ @e~sߖ` @ @ @ @ @ @ @@F]9:DФIK/y:U'|&N"0Bjlޙ?{}7 /bU\~4vN{S;qW_}5_EPע.ڪG吰|Mq#HNL B YfyiСy{=HÆ Ѧ_~ "1"`,B"lEitxl/Rڹ+#{фLwhފָWYeaS*W^y%7>?<7n\ fh*u޾}kµ}9~/kϫ -~C{U_z*}_0iWOݻwwjW6w՞OSsmPGu>}# @IDATx?UW]Ŝc]1s'㎼&@ @ @ @ @ @`2vA @ @ @ @ @ @ @Z@.][LfaM)/4^ BJ8-rkMO%cǎiʟJO>ZveJ9,VX!{.mD h;-"]o]lJbT G-Bak;ީ5ƌA hLRz4hPi @ @ @ @ @ڋ r% @ @ @ @ @ @ P5\SI}fmVI6هUl&M[mUEc:/o[[kd @ @ @ @ @s @ @ @ @ @ @ @Zѣ+͠A*V;jWμ 4OwsѼmʻhQFfH @ @ @ @ @i! qZ;' @ @ @ @ @ @ @lgϞͦkX+g'0tЊԩSErh8ר_#3$@ @ @ @ @ @8-ԝ @ @ @ @ @ @ JVZiel(0xf/SOMS==VkV->o\A @ @ @ @ @A@p @ @ @ @ @ @ @@߾}ٹ @ @ @ @ @ :EY @ @ @ @ @ @ @ @ @ @ @ @ @ >1jU @ @ @ @ @ @ @ @ @ @ @ @ @ @] blբ @ @ @ @ @ @ @ @ @ @ @ @ @ @@>U @ @ @ @ @ @ @ @ @ @ @ @ @ @v) ]^V"@ @ @ @ @ @ @ @ @ @ @ @ @ @S@cVE @ @ @ @ @ @ @ @ @ @ @ @ @ڥ vyY- @ @ @ @ @ @ @ @ @ @ @ @ @OsYVE @ @ @ @ @ @TK`̘1i6p!@V 'Lq{gҥi@VG @ @ @ @ @b A @ @ @ @ @ @ @@QFZ+C[ @ @ @ @ @ @0' @ @ @ @ @ @ @ @ @ @ @ @ @ @ tllC @ @ @ @ @ @ @K`ر￟m:uTZ!CgQڷA!бj8 @ @ @ @ @ _) @ @ @ @ @ @ P&еkײ= 0=t9G!@ @ @ @ @ @ К1cn @ @ @ @ @ @ @` =:}wpNM-!Э[4S7.M8%N 0 t%k:Z @ @ @ @ @ 01Nma @ @ @ @ @ @ @6*jI&ٛ64V`iСQG خ @F liȑj @ @ @ @ @#С1!@ @ @ @ @ @ @ @ @ @ @ @ @ @a@ @ @ @ @ @ @^93m֭wfFM0aB&/ @J @ @ @ @ @ @`H @ @ @ @ @ @z.  })1_~lC-% bl)l!@ @ @ @ @ 0 tl @ @ @ @ @ @ @ @ @ @ @ @ @ @@F/i @ @ @ @ @ @ @ @ @ @{woUU| 8(T"Zfi欨9OeeXCfN儕3#(⌚"((뻞g߹ w8^skZ=> @ @ @ @@K5 @ @ @ @ @ @ @ @ @ @ @ @ @ @T@zL @ @ @ @ @ @ @ @ @ @ @ @ @DA-[3 @ @ @ @ @ @ @ @ @ @ @ @ @X@1.δ  @ @ @ @ @ @ @ @ @ @ @ @ @ @@Khm @ @ @ @ @ @ @ @@Oҧ~Zgѝ;wNm_ @ @ @ @ @K @ @ @ @ @ @ /'EĠ @ @ @ @ @'A0 @ @ @ @ @ @ @`0aB߿[l.V]uq _|1M4Nc!z+r[;*:+r!M]v}7R|yy睗cJJ2,_|zZ~+[{Ǧ /0eM6J =SOeQFXjO?4+G)PҫWR8|xq˫u]Wcf'0hРDg}V t1gt @ @ @ @ @ 04&m  @ @ @ @ @ @ @Y`}!묳N?ZjӍ` . Ea}%BǏ_YGW_b-L\sM~8~y.?яRnA8㌴>4myi#F(0^tEC-_J9rdGyN'x"mƹ~ +fmVW_MvXSn^|9ȳԠl9e 3t󊧫z+[n%_ 6 {,vm"P7uG8]F\;=u֮0w=暩cǎX{ӁkG/˴=zokvv}-=4yJMZ{・(c\5%\R\/m<_Ν;_?~ӧC7IAF]4y?c-9rdӧOqE}ݗÈ}ۧ~8*  @ @ @ @ @ Rڴԅ[7 @ @ @ @ @ @ @`NDTQ"`*vw1Nb!i>ë~J"*y̙3vϞ=ӦnZ.!mYzKk>oJNj?O.*EmD!ַJc#^+\dEW_} ۝vکF؉wqR8^E0_|"qNu]ӨQ)ԪUt=OxiV1殷`Mysx]CD(b\Dtq5a\ve#!y*SngȐ!)xrW8}#,rܸq'N,w{&M/oI|"l1GK{袋ru֭o^޼MY JQd{t}% yߋ߿E }Ѣ49_ Go[;SyFhUW]5X=q.aUJ\>m @ @ @ @ @D-qL @ @ @ @ @ @Skf9t7T}W^iƌSN-c¸kฏ>('?I>ժ8csc7YOȣ>;Y` ըhzw<ǘg|뗧aE]A+ԫJskĽhuIq_x7ꩧ/"ųV_b}S.!Qގ0(F]#ODޕW^V^y"6(OMnj^{"L/"h-_?j*-o[sUډ`rep ~yq,Jq,JcNrK "r{[ѣGW=5B4#43={猐76tӼ&y!p%s4<{{M뭷^W:Eglj {+(#4~_%X"E@i=:JS׻袋nݺ>QǎKu]׿g~Jv뮻 .JSqW_}lK.ߵij ' d,ʑGYfo;?O* @ @ @ @ @   @ @ @ @ @ @ @* D_"*ʄ ҅^vm`o,AInU'~fU"X/Tͪ}C =zԻp(*uAYoNr@X`E]wݕ#\+JKZ]ܟ ȟy=WSˡC1# -ƈSnm. "L/jp MUH}QVa_|E %;\=C=v2[TE]Qor9:bngv~sd_wuR&n{gF@]HV/Ӎ7ޘ;K!qy7iӦwqO~WFzvzo©Z-Bi#lO>I#F(ϦD4hP؈[MbnzǨYg=T{x"3JsB!bh{]O&}Vl}E_ @ @ @ @ @ @uaE @ @ @ @ @ @p@G;7ߜFx4}twaÆ 6ؠ4#|gر52B"xKvZy4D@Yv5wcOc\6}\n!o3&E]uF%\2e7c=VonU`YES0;(Ee1dG۽ޛC:tPKo~[o'xbv 7=#)>O:.^U7n\>N:Noe7ߵӧvUUnᆥkM6I/r*ږ/ޢ_SܵƦ;~zwYM7ݴbI&`ݢ믟n#|wK`JO'c=-]8^ܹszwRq5%#W^}M]oO\kx..v\'Oο鯾j?<!J\?}q]"9.JC7 @ @ @ @ @Z Ɩ| @ @ @ @ @ @-Xm'NO /0Caa k$򓟤?9逸JԜ[o+Rsc};׿ug79xK/M;SAcguVZs5s@T>FѣS=)YFb́fcqk/}sC 4bĈϦSO=5".㙊nݺ;/B{R|fW"tR^+vm"ЯhT-EUeY~vjXѶҹJc4.銹ٳݚݮ8g T>GgQ9眓>O]v%Zi=H[neѼ]ܓQqUWۈ{(Ŝ/@|Ej|7u8w+rnqA#p#L_KዕNV3>b,n~Z6 @ @ @ @ @Z }- @ @ @ @ @ @_ӟԡCtg{,sd+BO?=]:ĸ s)~al6mN1/mf^y'CoجV[o5״n:z衵Զm_C2~z饗RǎzWg YE{R|>k]G}?j݉wNpxޣo߾pvH[FM(X6wսQ13f>.[|yח/xax}9lذ4~_|q:y.xOFYGtQfw_E9uoMYof/$9cE%\#H;CZnߞc[!@ @ @ @ @ @ b @ @ @ @ @ @ @ c=rc4~Ҝ bЧo1Qդ2mڴ4qܷgϞMcntZۥKx-{cnu5]ximM#FHwygֹ#/J}AU&+~W:uڵk>{!C^{-uQuBGW_}W_UW]Θs"Ǎ穯vGIof]cv~(Zr%{w&M4צT0WXŤۗO2?ɓUW].2{9}{.qOFڥZ*{ }w̙3+8Ω{cc[q~_=n5O; zZkL:o}+1FI'Cʏ7u{رi„ {=_(裏mTS I~R.xDq"_:?OjTJyY_+VNcƌiP`U)_aR}y}y[.p 9C+bꫯ)sQ7nӦM5秞z*Osiw8bJ @ @ @ @ @h M @ @ @ @ @ @!xT49rdFu]c߿/W^yenCM.ԩS:蠃V[mUnݺs|B FJpxKqnKޛ[e-̧ӧ~ZW_}ujT駟3K/F닶u̓:o+Ҭ*?q[l;{ŶE}KWlS2CxW]uTÕƨT!]v͇:MᷳZoI._}q.B"?c W F @ @ @ @ @*к۲  @ @ @ @ @ @ @sD࣏>JZ"tvP<0W;!P}WޛR`WqbO;C/ĉ+5)EHg}&M6DEE]4w+Fj~N9?cP"XԴi1S >w[+طo|SN99{_:4[mVsEInm>VP% uQ_Wxg^py 6 iӦƈ{G߿~6y7R< ū3PYš:w>t֘w2u6uY'x!wl S{gN̑;y|ڡ%]z饳=Ӏro=;_*"th#]wuyejժUq(qNn؉{'lI~\8zy笠VaNJuڤ D @ @ @ @ @ @ @ @ @ @ @ @uOk:u&LP j߾}}jݺu+k_ZcEe:,OljlwvsK,D s(jf5*}Hw_CjT }{GIkVr-S."t2MFʍ#8~veO78wwUFήu^{^ߠ;n?ȡsO~AƍK=P|>St)}?i:餓҆nXc?SGmJ+7t ':+'?a$seܓ%BI# 2*cnov{Ks[>!xtnrw9oVJS_~aq?ijrWwHq:-R9-Io}vڵkUS{n$wꪴF旍=wGn)$#LRaoO>C#|_NSL;zu];B~FXyGO?bhen6ᇝ;w8Grg~,q"0BK:<{or 8R޷9]oqx"5xWsu@j:Gc/SGE0cW  @ @ @ @ @T_kD @ @ @ @ @ @ @`~>|x9׿N'|rF8Ѵir(۳>[縊 |9_O_~eٳgDҲ? 7"3ѣxٲ₽[gu" .Ҽ}hk/ }W;[q3fJ]uUS۶mwr" @ @ @ @ @TMz @ @ @ @ @ @ @[/; @VRgG!@`DbckϢu9x1VsF@f9mfn*jӦMZk*6`8g66Ciϟbl*Uez0`VM~8`S-آgЌ @ @ @ @ @+  @ @ @ @ @ @ @Zh@IDAT_Ӕr|;M:3h'&@` hAl/B`wnҪ:v옮&Չ @ @ @ @ @4E@cS!@ @ @ @ @ @ @H?|曛$[4߼;/Y ,qγ Ѧwe* @ @ @ @ @o1η @ @ @ @ @ @ @;zѤI۷IeyiZ`A|-sUX8^zMZXvO' @ @ @ @ @ TAMӏ @ @ @ @ @ @ 6pRZz[uN >Z ͝A; @ @ @ @ @ @`+gq @ @ @ @ @ @ @ @ @ @ @ @ @ @@1V @ @ @ @ @ @ @ @ @ @ @ @ @ @8w @ @ @ @ @ @ @ @ @ @ @ @ @ *  @ @ @ @ @ @ @ @ @ @ @ @ @;玳 @ @ @ @ @ @ @ @ @ @ @ @ @ @UXDC @ @ @ @ @ @ @ @ @ @ @ @ @ @sG@qv @ @ @ @ @ @ @ @ @ @ @ @ @ @ h @ @ @ @ @ @ @ @ @ @ @ @ @ @`;q @ @ @ @ @ @ @`A4iR8p:}&@ }QښU|pԩSJ{ @_|E[jF @ @ @ @ @ bl @ @ @ @ @ @ @E DX[Ԛ-Rz1 @ @ @ @ @ @/Zϗ2) @ @ @ @ @ @ @ @ @ @ @ @ @ @@6T @ @ @ @ @ @ @믿fΜIrvڕVx?} @m81 @ @ @ @ @W @ @ @ @ @ @ P&йs= ڷo @ @ @ @ @ @1W @ @ @ @ @ @ @<xӌ3 @׮]Ӳ.O5y̍: N:W\R  @ @ @ @ @細  @ @ @ @ @ @ @*ЧO4mڴtM 4hPKs_Wi hvm ֠ @ @ @ @ @ @!H @ @ @ @ @ @ @ @ @ @ @ @ @ @ f~9 @ @ @ @ @ @ @K,vewfF2eJ馛f/ @|+lJW} @ @ @ @ @ 0[A%Ҁ @ @ @ @ @ @l=z.e#X=2c6SNIkBr!@%0uTAs y @ @ @ @ @@-p͖L @ @ @ @ @ @ @ @ @ @ @ @ @, g @ @ @ @ @ @ @ @ @ @ @ @ @ @% blWݚ  @ @ @ @ @ @ @ @ @ @ @ @ @ @* qpM @ @ @ @ @ @ @ @ @ @ @ @ @Z Ɩxխ @ @ @ @ @ @ @ @ @ @ @ @ @, g @ @ @ @ @ @ @ @ @ @ @ @ @ @% blWݚ  @ @ @ @ @ @ @ @ @ @ @ @ @ @*fi @ @ @ @ @ @ @رcԩSkhEM+RZr%k/?^K,ZkNJ?'H>lڵkZeUҶn:vX4ǦM:wYgR}qƥ> ׿^I^}k1]vԳgY;珞^z)xS۶mg>_m V\qԣG\=a„[onRquM:u⾈v޽{ĉs-\!&M_~Wl=PX>}",R/6aM2%_V[-?uСY7vyg̘y:kT&6mft7c7ǪXoc- @ @ @ @ @ @`a0ؚ @ @ @ @ @ @ @ va8nnr^F^|kWWnҰa*{ꩧ."vҥK:3]x/K`֭[R0`@Js=UW]UGn<[or;#믿^o@a 7pC:ꨣʫ}ꩧO<1 /A"o߾mbn6{9v}aJ>`aq]۵kWgѣGFQNx'kg#GL[lEհ g]gGyd:r'|fΜ?c9v!CҠA/X bl5* ܌ qΊA5ߝƼosj>Mڿ  @ @ @ @ @ @Q@xU @ @ @ @ @ @#_neI1F}e嗯xKx`>}zZj7zI&{,;6E `Qo ?3&mšǏ!Q}]"{) )S]ꪱ㭱u Ǐ?8o߾bHK.YO۶m+\"B*^z[,z뭷ɓ󵉐o1tMtAU<ސ"ha`kpYa)ݻp }z21Gs[in4Әc=6EaM6$?-)"#pgIFM}iߪU7W_}5-Q;v,sE)mo4U7jU{Fjf,.D @ @ @ @ @6A  @ @ @ @ @ @ 0훆^̙35\9{@Rnqi})K/kW_~o=w^xT6O?41 ".ԶnRjmDc*9gMwyg`jO;f 6 =4M)W\qElJ]#s_R3<3p`7wixgi[ N8!ŧ(q}9+|G@`F`_~ڴ3lAsL1".Jzh^#GL>8Ҕ?k{ʟz(myiW^yejv}Ϊ=VSjc*ߌź @ @ @ @ @ @$zaZ @ @ @ @ @ @ @@Vro< &G}Զz_-m"<[neGaQ"z,s{fηr^{u&mx 2TDO>~s|Ӹq})My䑊y|h_\;_11n\;o;k9 @ % @ @ @ @ @ @! E\f$@ @ @ @ @ @ @VY<3ṲIҕW^S5!vFJ~in_}Ur}ѶNfT̘1#~yD6lXvKb~V7]ttq̙3rm>믿~իW۷oޟB/7xԽ{<"bΝ;>JCFYeU0NL9l P@5~3tge]6-iSOwMˍ߳?<;9oV9,މ߁7^{]wԩSFC9$8 @ @ @ @ @hq[%` @ @ @ @ @ @ 0ڵkW:g}Vnƈ#R&E{5;G>X?>\_iԌGy$[m۶i뭷Ρz$9uRd3_G}FPu-E_^٘:47/1cɶ[No}>EX|En m~iF;KܞCԾߜwV5#@@s~3|, >:uJGuTOoEcaovƛӍϘG}Ttyzr]ѮF۩5t78y0 n?qgޙWsY뭶Uض ,8cӨQR2$w$t}ta͒hwOL&LHνzJ3fHrJž'xb y?=mڴ+/!߯_% @ @ @ @ @h[Uf @ @ @ @ @ @ 0~uG5 y̋翹bմ*M`ahoƸqrb8\vei]wM:tH۷Ow5\w#+|W|]dEFm?cƌIZ!QGqD}xFݪ{t'GB @ @ @ @ @W  @ @ @ @ @ @ @@xArQ"W^I/rlrѬ{Q ʝjҥK"l饗QН;묳R{ʔ)k׮ѣv1^J=\nZLYlۓO>6` 7W۴m6gϞ;K,Gԋ/M]t?!֭[>!t[oum :4F{vtuץ8~O9rZZ};\zŁȌeРA)/?t]wOk;^%>`M}̋翹bM*& 47cȐ!97M.!WGV*zh+.J1.nixGcệvX:S@'@ @ @ @ @ @-R@cM @ @ @ @ @ @@s=5PK.$~5+D>SPź"X/x|v7r~?w5jTk߾}79a}[o}"i/իWZiRE11£Ǝ[sc6{:7|t-Zαw\@kM6ݤ~wyg+B.AZ1'|:tPA#F1"qv͹F5N؈8aq 71cƤeN~7lcbwwVZ}h ͘8qbfp KN;X-?^lW +O,iԩ7,q>蠃̙3Kmb;%[]jd @ @ @ @ @@-p͖L @ @ @ @ @ @! .H;C1cF:)RFhaڡF =Q6mҀr".v*uر5]`2p[)?ouY?>:9zԧOkvy.ls]@R}`ӧwql^ANYɓ'  @ @ @ @ @ @@آ/ @ @ @ @ @ @ @ ,R;N~9tK3gl<@UOXE[`+_]kX iauX9rd>6f̘ ȟ~{cwN{nz'k&NoNaVCMZ5RYn:z5|m۶cکgϞ1bD}ݗx6diΥsiw{fn "(ESL EswmP66K[-kijk⒛yAK@Ĕ *\r9; aff<_|ny~նm/w4;g<̧y[}>s="j󛑂ySi׮],y[޷PǍ )_d^xaꫛ|;&@ @ @ @ @ @E+ ho @ @ @ @ @ @ @5jT|YE]TMauYfeǵgذaB͛oF{1slbcݺuϏ|kܹe[ȃ*ZAΝcܸqٮR<+ K/~ ƹ5kw_>M^Ę5K6ҩSHN%}{?~A7Gٶy*}X}6jӦM-fו @ @ @ @ @\WV-> @ @ @ @ @ @h?O=:t7a„:۵k)GɂcHN]p8 ~| 0 l޷Д;ꨣbРAْ.~S⋳;3.\XٳcY[ {,d=~wߍl61{^ߔZS*"YwVM!@5Hwylkmyߍt}.x:7 @ @ @ @ @ bM @ @ @ @ @ @QࠃC=4رc]tQFe~Q]իnnRc*y]'ĴiӲ|va_'tR'\Wj^Cƌ-^O7;Xvm\}7ϓ:;"{ng(6Cez6ڷo=ӏ=X̙3'JKKca5_2a_N6lӧg{W껡;g?iUV#Вjf /b̚5ɫ3f:աb٨)S0! @ @ @ @ @ @81}k @ @ @ @ @ @ _|qv>XtiҺ/jbqG P*_Ҝ).*_]8b{G⡇ڎ> }|!CrذaY[ :uj-[VUrL]֭[W5u?Z]6?SӠ-+*Bqstx $Mfp ѯ_l#G͑F3ݻw83OfߟgqF̝;ovkR  @ @ @ @ @ P7 @ @ @ @ @ @hd<;ҥK\~'TWu.\:uBzPUW߾} TuzL7n\=Qݞ8ꨣ NR(jz.?8Cu] IerJY]]>UNjS ,˃S%; mP;!6e@s7#WVꫯSO{}gvinӣM6Y|XxѫWxg|yGv5eɒ%r= @ @ @ @ @ @ %E{ @ @ @ @ @ @ @D{^7eʔz[~=\p Yow_⋱f͚߿xU^//S4hPnݺumO׬ybڵumm)8s=2vi̘1{aÆAsM ^* |1sΉ#GfaWٳgǤIC,_< I馛[ni%UΦw_~Q;\ @UG<8 {s}1q,9$`4[%>K1jԨ())ɾ?Ǐ]{̙ѡC8묳OK @ @ @ @ @4[V#+f '@ @ @ @ @ @ @j+0mڴ:th6?a\z饕zcʕY8/\V?\`A5w9z;cS]uh1鳷hѢx뭷.zݻwςZFy#;+f/͈#"=&L>}͎C.]f͊>;1J… cΜ9Ѷm,̶O> qXbER8ԩS+|0O;vX  @ @ @ @ @@* @ @ @ @ @ @ @@hժURh<իWj6+jZnGqDo4  @ @ @ @ @ @@s5 @ @ @ @ @ @ @E`ĉ^u)__r]C< Fkb @ @ @ @ @ @P@c⚚ @ @ @ @ @ @hYs΍{キN:C4  )nH]s @ @ @ @ @ @ PJּ @ @ @ @ @ @ @@>|xt޽N߿D!< kn @ @ @ @ @ @J@cCɚ @ @ @ @ @ @hqoBx[ʝ @ @ @ @ @ @%PR\۵[ @ @ @ @ @ @ @ @ @ @ @ @ @ @9 blw  @ @ @ @ @ @ @ @ @ @ @ @ @ @@ b,n @ @ @ @ @ @ @ @ @ @ @ @ @ @9 blw  @ @ @ @ @ @ @ @ @ @ @ @ @ @@ b,n @ @ @ @ @ @ @ @ @ @ @ @ @ @9 blw  @ @ @ @ @ @ @ @ @ @ @ @ @ @@ b,n @ @ @ @ @ @ @ @ @ @ @ @ @ @9 blw  @ @ @ @ @ @ @ @ @ @ @ @ @ @@ ~m @ @ @ @ @ @ŋcС;4e>`;C($f͚B @ @ @ @ @ P/$ @ @ @ @ @ @ @ iӦ x' ֫$@ @ @ @ @ @ J6\ @ @ @ @ @ @ @ @ @ @ @ @ @ PSҚvԏ @ @ @ @ @ @(.z+6lP\[@6mv=nܸk @(-qR @ @ @ @ @ @WpD @ @ @ @ @ @رc3 P ڵR @ @ @ @ @ @4eAMX @ @ @ @ @ @،s΍o44@Ν[n٥,Y˗/o˺@GEc[%@ @ @ @ @ @16  @ @ @ @ @ @ @@38bʕtM51bD?>?&LPӡ @ 2$NZ.\@IDAT: @ @ @ @ @ @&%5 @ @ @ @ @ @ @ @ @ @ @ @ @ @)6EX @ @ @ @ @ @ tf8餓j-lٲ{oB"z[2 @ @ @ @ @lR@&t @ @ @ @ @ @ @-н{曋  fϞ ƱcF߾}[mK`Ŋ u @ @ @ @ @@Iٖ  @ @ @ @ @ @ @ @ @ @ @ @ @ @f* 8&@ @ @ @ @ @ @ @ @ @ @ @ @ @( = @ @ @ @ @ @ @ @ @ @ @ @ @ @f* 8&@ @ @ @ @ @ @ @ @ @ @ @ @ @( = @ @ @ @ @ @ @ @ @ @ @ @ @ @f* 8&@ @ @ @ @ @ @ @ @ @ @ @ @ @( = @ @ @ @ @ @ @ @ @ @ @ @ @ @f*PLm @ @ @ @ @ @ @&)bŊ={vu5z[Vbx:Tٞ^{x_Ν;G޽cРA[Km+W;F~ ̙3'/_g} uUݚ5kgјm&ccecvu*]-ZVmF>}̚5++uݟ{x'W^e˖g?e]bѾ} gbڵ6uҪU߿֭)=˖~[lQvҥK3o>wX~}V׽{ԩSv'@]v~+iRcw޺P7u @ @ @ @ @ @@3 n% @ @ @ @ @ @ @G qBR1cNBW^yexo\򠽍fΜ'tR`ǍK K9qG.]/Kus <8|83㗿e^]wAh!Cbԩ$rѣ i3f̈8o޼:+ ,Av~.%O^s5( )1=&L(k:the59HWκ6^pOrH\qӟ4Oj)M6/Ϯ !ӟxl)5mAKn38#; @ @ @ @ @ 16{f @ @ @ @ @ @ @@3mbV,Y)<.W{ʝ^zUٞR`_rw׿XjUlvq{/gy&[C 11>o+04;[ouۮ9rdOg;w9ۑ^/R{뮋O?5?M巿Hᗩ1pHaϏW.˗/P믿եY;gP\eZɓ+,) b,){ڴi1|Ցs [qym @ @ @ @ @hAky[!@ @ @ @ @ @ @48.oĨQw7fe|XꫯYg֭dJ!K 7o^YGڵ Ƈ~8[Đ!CO~WZRmPCo=ƓO>G8, qذa7aFӧO2SOU4 &+)T9|&M;H)??J)@4SN8RcK>(.]Zi W+}k~ @ @ @ @ @ @e m @ @ @ @ @ @ @ NYg?lqwqG/?q˜fA_+_J3z-?<;m)\K.Z6ᗾ)qj![mUy1s߿6%\6lT|g,˜=1˴D /DV"ݯ63gNKA|pؘBgcO>()'ӹw.ol %뮻  @ @ @ @ @ @@WE- @ @ @ @ @ @ R߀eKŋǭޚyF Xi9c?xǯ[.}4m#FD׮]0{キ^Ү] R=S/I^|l޽{ۜ1QC>L~vۭ,ry吏zj\2x;3;Nm rmw+Sڵk+CFnbǏ~Xzu~ ^_}ѱ{fŇvX\aPSYg{Wt!/ȑ#㭷*[ @ @ @ @ @(nA} @ @ @ @ @ @ mڴɮ'E JϮG}t?0>>쳱|)1o>.l]_~yu׵㏏Ν;gÓk}xJ U}ii2_פI!CTx~`8qbִaÆgϞ/}i (r\إK,;~x|ߍiӦE X\lYii>hzg;,Rڇ~_O>Pwu@3~ߎ~,xʕw]/Bx @ @ @ @ @ @1]g @ @ @ @ @ @ @` . ͛]nxCugVnvQRR?#=c9~JsuG}t\~C=TR[ou0TUR`*k}̛BRe*]w]t5W^/R}\s4s4mڴXzut1 1RnY8Y Yzꩱjժ2eJL817)1/ԥRݜ9sp7ga۷vű~{6&}_pŪJ 5[#o/~1?3ǛoYah !N!k?SEӧO,]4.T @ @ @ @ @ @_a#@ @ @ @ @ @ @$~F {」_~_ReZI~ᑞTRXA=;)I'qwdAiKnV*D.]3u]Y0lO9aÆeኩ;ܸFq~„qc i\fMR7.ZQFe՛ xs @ @ @ @ @ ВJ[ @ @ @ @ @ @ 9yJ?蠃7MlvW1{U<֮]ɾ:|Y_xGNȺ=۵kGydR²կi9bĈ"siR0V*mڴ)_ӽ:ujvς=?쳳@ɛnS_\ȖPJ)>(ڷo7UxvmgoY1c*;!@wg?YT8_hQvƖ .oPPrzcŊ;]9sd)ˎ7lP'TuSΝ;; @ @ @ @ @ @*PRo @ @ @ @ @ @ @@C \uU1eʔַbw3fof_>͟!O5Piii <8랂va[M.³R̙3?}lSO{g?'|2.]wqGYKFNLA)8,Cf?y0UiVV}ꩧ; @@!nݺŹ瞛5Mŋg]va*myBvZ:ol*%ϛ7/ӟ7|s_&L;",Yz'@ @ @ @ @ @E-K&y @ @ @ @ @ @ @@ 0 \N<9jIII|(uֱf͚4iR >R{^q 'īywT)//Ya~IAՕJv얷} ulժU*> /,[ @ @ @ @ @ @% @ @ @ @ @ @ @Gs1nܸb 3oÆ 1k֬:͝ST |7ދ3gfs5D(`Y͠~~_Y}ʕ+cѢEYܵکS,1͖Ac~.SZ*ׯ|+0r}e}$.,ƌSU* + M)ңGwީ[ޖc-vu׬uO>|iӦJ @ @ @ @ @Z Ɩ{o @ @ @ @ @ @hGuT 4([%\)J JСC6݄ 4m׮]cƦGy$[{)Ъ}s|% +[n%VZ?Skw駟n-E"pgwyg,\]YkVe-[eZ4߭T/^\Q @ @ @ @ @ @W  @ @ @ @ @ @ @21cd/BL$ LO6m۶qeU;^{m;# +?~ʕq}{!I&e>ãu[ĠA*  PGwy'~lIC viCړkVm_GuTZjW_}uo>zc=N;-vm>}zi&SZZZ\mW^F N ~k _~.XdIm֟ @ @ @ @ @XA- @ @ @ @ @ @ ДR0{-qر/{87x#xc͚5ѿ8f 6lXYAue`YUMך'=,j„ ^5w9ȑ#իWٳcҤI?!/_htMq-xXez6lؐ-As`ܣ(N<8 M!؛oŒ3L/R5*JJJ߄gN:t:+N> @ @ @ @ @ @@h?^^j[p @ @ @ @ @ @ @ӦMCf~ƥ^Zi:V\˕U4 ,t;w{wܱy,2ݗE[o}mvѳg޽{ՂnkMD /[͈#"=Ri*O߾}c(6KƬYb>Dnp˜3gNm6 ӧO Dn +h+VBJS(ԩS+-:?Y}߱cJ}T @ @ @ @ @ @ݥ*U @ @ @ @ @ @ @VZE pJ/ҫWtVe% lqG䧍^RRwѴ] @ @ @ @ @ | @ @ @ @ @ @ &NU}-/efSll.L @ @ @ @ @ @Mbf @ @ @ @ @ @ @s΍{キp&j9MhzŶߦw @ @ @ @ @ @' ѓ@ @ @ @ @ @ @ P'ÇG4u9~7k @ @ @ @ @ @ @:Ah#@ @ @ @ @ @ @R`}*Rl-j @ @ @ @ @ @4?d+&@ @ @ @ @ @ @ @ @ @ @ @ @ @U@cy&@ @ @ @ @ @ @ @ @ @ @ @ @ @P@c3iL @ @ @ @ @ @ @ @ @ @ @ @ @U@cy&@ @ @ @ @ @ @ @ @ @ @ @ @ @P@c3iL @ @ @ @ @ @ @ @ @ @ @ @ @U@cy&@ @ @ @ @ @ @ @ @ @ @ @ @ @P@c3iL @ @ @ @ @ @ @ @ @ @ @ @ @U@cy&@ @ @ @ @ @ @ @ @ @ @ @ @ @Pْ  @ @ @ @ @ @ @FXxq :R |&/qG6O PH`͚5 @ @ @ @ @ @^1 I @ @ @ @ @ @ @@Ha]ӦMk3((OWI @ @ @ @ @ @`s l> @ @ @ @ @ @ @ @ @ @ @ @ @ @5 @ @ @ @ @ @ P\oVlذ6m(B6mڔzܸqqז; @!PZ>A @ @ @ @ @n @ @ @ @ @ @('бcrg  @ڵk @ @ @ @ @ @hݱ6 @ @ @ @ @ @ Νׯߌ+pih Ν;GnݲK-Y$/_u (":D=hǶJ @ @ @ @ @@C blha @ @ @ @ @ @ @f*pʕ+-j*0bĈ?~|~L0C#@52dHL:F}u"@ @ @ @ @ @@MJjI @ @ @ @ @ @ @ @ @ @ @ @ @ @@S(m  @ @ @ @ @ @ @ l6qI'5ZZ`ٲeq=T;.}E`q뭷e1 @ @ @ @ @ؤ M@ @ @ @ @ @ @[{q77 @ ̞={Acǎ}4+16 @ @ @ @ @(B"ܳ- @ @ @ @ @ @ @ @ @ @ @ @ @ @T@c3qM @ @ @ @ @ @ @ @ @ @ @ @ @Q@c1u{&@ @ @ @ @ @ @ @ @ @ @ @ @ @T@c3qM @ @ @ @ @ @ @ @ @ @ @ @ @Q@c1u{&@ @ @ @ @ @ @ @ @ @ @ @ @ @T@c3qM @ @ @ @ @ @ @ @ @ @ @ @ @Q7m @ @ @ @ @ @ @ @@q |GWtǎB% @ @ @ @ @ @ K&|s, @ @ @ @ @ @hO?t̙3'^}СCt=/ŮZps ,w}`ƕ{W6~/.kNsnݺEbժUѶmӧOYӬY[nѣG())ɫ}ٱbŊ sαVދ'|2^yXlY|]v%۷0gkVIVV\s2N]f%_2Dz8 b }.]nѳgϼܹscY]luԩB-A`Ѯ]l+~C |{ߋ뮻iӦ+շ/< o[v @ @ @ @ @Z vCm @ @ @ @ @ @h)[VL>RX0`@+2n uU@ T믏ѣG?83cƌYyʚ:xA JL׸"w5jT.9eʔ0ײ":HSj۾^˂"1()k"@ @ @ @ @ @@Sؔ @ @ @ @ @ @ @-B`1p,pN:)˗/9sdAϏŋW bR_^ӂ)dPꪫbȑQZZ?%ܹsvݷ~w{ BA)"F"vv~1bQUJB("F#(b'P31#Ab b&$~~^}uuQ}^xᅼqK.I={n-biUV|7~ Ha]v2 '7h}絏1B'Eyo[o:v⾕UW_}iĉ)B #nK~{ڐ2뮻*17{5dȐ뮻Wo±Lw)Dp(s-ܒ۶m1ΝȪ @ @ @ @ @ 0'_՚ @ @ @ @ @ @ 0+Gj߾}UGe]"r˥W^y3n!:Zvat7n_~ez'QGJ`SO=U.}>si 7\s, ||צM6٤tov:#=ܓ"p+Ae; y.cvmA}-뮛A1F]믿NqŎ @ @ @ @ @ @W @ @ @ @ @ @ @Y>K#Fȳ^|UBDq$p7swyiڴiy,"imI?|(IեI&iKTcǎMO?ti|ܽ{jC[nT7'5/9re47t,!_)m<͚5KZ3fLEo"o)9rd^{M'%; @ @ @ @ @ @Ur]& @ @ @ @ @ @ 0{^xD+Riv;-R9;hi[lN:7'KܺlTv%[o꫗=#dqFe}I'ONw_7ߜB::]tE9[feR:uꔶj?){u+=EZguҢ.6`ta &ڔ|[L7@IDATGi=ۇ~{tQG.]%X";t.UcC=4]vivJ_k.):tz铦LRtq\;3ߧ_?{,qnDlMkUG8q^RوW ?F5X#n:?kV:_]R]=~i˿;vL;sJmjڹks~qiĉ55o^C=Tiy- P箺9`ܾo߾ͳ>N=|ڴiyKS⸖xW >q|P8*  @ @ @ @ @ 4_P/u @ @ @ @ @ @ @f@A%=p|j*NK{nc=eޟ9lҤIiذa6עERo;uERs:;7\R׌v"{qf͚>c vۭB8wuR8^E0_l8JR^iĈyx6i$=y߱n--0X=>^W7 ҉'XkrWc9&EO-ܒ"/WWn\oE3&o:nܸtxW~i>~o6dȐa8Z^ً_6m<_|6t捺_;vl{T^z)V^;]S>Ew޽tϢOiKDhQ,ꩧv|y8pƸuP @ @ @ @ @ @`Ah ^k&@ @ @ @ @ @ @*5X#A^xazG5UEߚgyq:ԶmspDsu)(нMvҥ;na>N:)E^5GXWLUv.7sGC1FEU}\ut!mV{ɁTL[9<! -P+[U+"6B#DK/M~i*ݢgϞ9qVq_|E>'\OcUp 917[O?<NW`9,/~W.g?Yތ+HkVnxĉ96r-bSyW!oEi^o^cmfy9[9HJ+P0W^y%?믿~ q^{W_!qc>}S߹;._cL|뭷̸!  @ @ @ @ @W@' @ @ @ @ @ @ ЈZJvMZyG"T:n\ХۯU/b)s95ċ5;ʓO>N=W]r%iJ;Sӟ^xsܸx&?PETuh}. CڴiS ֊P%\2EԌJEwߝ FB:CiuJܧu۷o'˟P(tP:/"4qU׻ %XF[.# }kts9x}"6F4lذH/b-J޽KN4*ƍ^o翇*߭ƌ?P-"^z)V'_(Z_} @ @ @ @ @̯ s] @ @ @ @ @ @ @9)pAp{7qiwM_}UU:thz_2#|g՞Me2E%\9hh(-ZhPUP}W]uU:*ԗS8խޚGԢ.B/#2ƙ[ʜ^3ew}y"42#!bZ*NU\r%6l\iU8@@nSO="3f1cӓ&M*N>%qƥh׮]bܖ-[p?Joe 7̟ڵkF9.я~T H-86homb[/Xqgo„ )eQ6xj׏?> [ov)g\k ^iРA8_kӦMS+NUg[DxdԿ[O5+ бcWyӆ87o"puʔ)t<Q*tS%Y@;$J*} @ @ @ @ @ @`Aĸ }N @ @ @ @ @ @REY$yFԯ_;,,<_ϧFjHysVX!T7)>|."oȐ!)-#$귿m.]~堣<묳rUnfghW}Ω5i5QRO^z ǍuP;sEV7Fm"XKΝkۭ9c¤>?.tqǥ{.9t5LݻwO={L[neѼY`o߾9s*/"tI> ޱՕ;*J˖-.UiQ=*#5JM+V^XǴirx̮R~5yח/xGxsW^y%~FW^NN;e]6  @ @ @ @ @4@H @ @ @ @ @ @ @ٳg٫Zڟ;կRvm^'ONƍ;w\q1B6|4}t'ץkn۶mڹ΋ÜXsvR~ VW‹iCEc*rEC:*qH@-ҡ4iҤf͚wy'{U:ꪹO+L1JXVzܩSޫkqh[ct"WK.dmi֔ʯ0 @ @ @ @ @ @ @`X}s8b,,BgeYmҞ{?{뮻.}W{]q1B<;kfs6evymMm]3Ψ1+7?GNcǎ="?@ R=R~y(3/+B|8Rx*uQ +af4~qh6t>9Cx3*_Tn_^_޾rxeMrJVZGy8?k>swߥ~¸AYY|xFuYeĉ0Z6mڴ uӧOOaev8]ܼN;-/_W뮻j:,CI[mULK,Dh_I4&P"(-Q^sw}w*;;H|Mio*uQQQFU_OO YdEJ#_m[ǘ:tMu0+ƨ.~ڵkOtMU3>'ogtr &T>ը q.B"jοQ/` @ @ @ @ @X@.  @ @ @ @ @ @ @D/HJ:SU.ju.]"r>}3ܪ t 'TXwr-eog?YZ{vXOJ;wy-;~O<1Ep^ǻrhfl^q3]j=r{';&"th=|OOM4)N{77}G {.oFK/u<[EʡuF(5\GÂ>E`W[~3NJ-\=ߒ*s=b!pwCIoyvM74*/ǎ6?q)W[mT裏jΥ^:qEWnR^RMN=tw}w ;nH[^n!2QAzS#w[K-"oi 6(-;{謹>:ySVՆV^fGP^$o&MEbyq??=y6y1pB+#8#gފ۴i#cy睗"JcƌvyG!%cwC=H|r-93إ['o3uiرt\m:Gc^zPJ!@ @ @ @ @ @h2?5" @ @ @ @ @ @ 07 2$ߥ36a„wߥΝ;-B\69B/۷o;v8G#gtgt={bk;?|kf֚.V[owp{SNiӦw]yB -T10xK,Q!?NFJ]Zfc}}ҫ\rrRKĜ1믿VZi\\믿NJ8qbxYdZ?!@s+b'|C ;tYg[kFnX>(7hmo±m۶ye~CUT @ @ @ @ @ PͫWK @ @ @ @ @ @ PYwuбYI&9*¨2/y^N@.%xW|6m4/FP*1gd!kޘ'B )e͛5\3o2`-9#AZJ뭷^j1MM"({M6܌*#ԳG3jz}Q>?[lQ4#@ @ @ @ @ @ bl @ @ @ @ @ @ @T`РA):(.:,h;ǠMLLѼވ^jݺu8p`D @ @ @ @ @# >j @ @ @ @ @ @ @_~9qb-oNvZЮwNZ ̋yq3 mvqU @ @ @ @ @ 0 bko @ @ @ @ @ @ @n]w5uر^֭[N Iks 0cy}4/ywa<ۿz]X-O' @ @ @ @ @ P_Aӏ @ @ @ @ @ @ G?J-(eA徺N> ]s޽: @ @ @ @ @ @`4- @ @ @ @ @ @ @ @ @ @ @ @ @  @ @ @ @ @ @ @ @ @ @ @ @ @ @8{B @ @ @ @ @ @ @ @ @ @ @ @ @4 F@4 @ @ @ @ @ @ @ @ @ @ @ @ @ 0{1g @ @ @ @ @ @ @ @ @ @ @ @ @ @  A @ @ @ @ @ @ @ @ @ @ @ @ @A, @ @ @ @ @ @ @ @ @ @ @ @ @ @@#blDC @ @ @ @ @ @ @ @ @ @ @ @ @ @G, @ @ @ @ @ @ @*0~;̫˷nF/bա]tъ @@-NZ˖ @ @ @ @ @ @n @ @ @ @ @ @X"kȐ! 5XH@ @ @ @ @ @ @`h:Wʢ @ @ @ @ @ @ @ @ @ @ @ @ @ @4N @ @ @ @ @ @ @ M0!M>-Z(]a~ҟұ ͛8i Gc @ @ @ @ @ ?+Y#@ @ @ @ @ @ @ڴiSvd-[ @ @ @ @ @ @s ƹX @ @ @ @ @ @/r6m\  @`vk.-2y'O?tvLkX]tԩS]* @ @ @ @ @Z@6> @ @ @ @ @ @Gv&O<޲  @{Nߤk]#@~sA < @ @ @ @ @@ 5d @ @ @ @ @ @ @ @ @ @ @ @ @ @`88&@ @ @ @ @ @ @ @ @ @ @ @ @ @ f @ @ @ @ @ @ @ @ @ @ @ @ @ 0 bGoe @ @ @ @ @ @ @ @ @ @ @ @ @ @Q@x]3 @ @ @ @ @ @ @ @ @ @ @ @ @G1Σ7β  @ @ @ @ @ @ @ @ @ @ @ @ @ @(|AhL @ @ @ @ @ @ @,X_uo\t6mR @ @ @ @ @ @s`.9F @ @ @ @ @ @O?ƌ^袋;78v;vlz=Wruc7.}W/]vM_~Ə[nbO>$+>-[LJЫYY]S[L:5=쳹:Ծ}RX:W?Yڵkj֬Y||Q_Wy?/_NZx +\r 3:裏ғO>IݻwOZQWA`ʔ)wXO=OSOM\rIC I=zR?W~sMo}u} @ @ @ @ @ 0 bn!@ @ @ @ @ @ @QF;. >ڋ k6mfOJW^ye"[nEzsz-ZTOBni~0krN3>}znT|μ DnV:uwiӦxmn/<9(rA ʜ5 @ @ @ @ @ @`n87 k!@ @ @ @ @ @ @D wYd{W^9}i̘1)_{4~*A -PZqj?#8r0aB!RTt|- "lCgv6Uƻ͟q\ScyÆX5d͋-XZeUR* vZԼ '~6(?/x~ /#FT駂Sw)l2ŻN;n`ܶmRܹR"@ @ @ @ @ @9! qN @ @ @ @ @ @ PO^z`^;H۷0R2^ve]v[n+WzOS:蠃RfjݧhxV[-1;K/M\pAy|'sgC"evطoߙ^_Cnݺ!C7}t7;,}嗩gϞ9Tu֥6Æ +0FGQ:W ><|šO @ @ @ @ @ @4HizL @ @ @ @ @ @ 0>4bĈ<_\%1N,3H;ckO.lz-Ҡ4ibuzꩧJ |.o_)ᕯZ3fLW9b/k;vlz+{ݻw61Nn/K~ @ @ @ @ @ @ P_Aӏ @ @ @ @ @ @ 0^xҌ+Riv,OSLӧOoiӟ^;QƜ[R[oꫧnݺ^KVo}iaTf3YZ|颋.߻eY&l2u)mV9ޫx_":iEMlA:҄ רl>J{g>ߓ:*u%-yޡCcziuMڵK;S_Za#|wdvHaաCԣGԧO4eʔjgkv:Vy>iE8W7tSkU?W^)lVw}kZnZ+|ﯮK.˜O?vۥZ*u1+ik?RwG'Լz=P{ߧѣG 4B}ꪫj\r}6>l:S=kӦMK/MW.qꫯrt޽b!xlkwS׮]oIFhtw޽tϢOiK FhQ>~m|ꩧv?h??m8p`^c<uטּ  @ @ @ @ @W) @ @ @ @ @ @ @yC`5ȁ` /0=ZxEߚgyq#4y[o}7+gT;"T.K}ٴꫧiӦ>Jٳga\mrp_|t'WX'pBa0Am۶MO?t:#g8]]w"1Bb?>K?oCj9\E`b;6B3|[OˋȸߕK-F~7c}+ZkU[>pyrlG"}Ϋ???7B"sU4FE}W^y6l/.ڜY4iRc=RvtM9W^_{Cc^;}|WsbߘO>iԩ)k5(wX5z9(3{_GfuF0B @ @ @ @ @h @ @ @ @ @ @ @`hժU ?B;cgiRiͬ}MV]u$Tc9&7E0?zթC8FcEՐ!Cr(W6mJARXK栥U:蠃꼮Xw5-&+O=|zˁ`m#\9K.IW^yejl:?x#B #(صk׼uveo1'?)^~SEo<XjPzJ5lAs8ȑ#;3[nӋZwGΝeY&])]"X0\}i*M׻;,BWKo[]-bEYlO<͌y5t)[7.}uY0Qr^frrqQi,+tA#|/݇z4o<`APY<[ӧOOJ%~oN?Dc}9ԬNԹWYej5BfVk5xY*_?:aSN! M4IGyd>0՚GQԖ[nY rM7mݶX99Q?#1RXYL!+b>曋*u*Ա⢋.=´<|xOE@bc.vmyC=XlD8by)>kSӧOy>ڷo4lذP[޽{ꋝiT5zh?Bc1n|"3JCBbh^zYmƨ//B5^é0[veg8O}"$qfaYZ*N6VYs1|0FUW]8 1gNoo"puʔ)t<Q*tS@ܗYiݺu$;$J*C @ @ @ @ @X@|]: @ @ @ @ @ @ 0 ,"i[\ŨQ5\>ta G`eIx`+9眓 3N/v +PڟWwFb;C(#43wu gv0"ˈ2dHo;%v%.NEYgCvm4;fX'[xN ^|ԧOE]K,DWsK/bYеZjj6o+!m:t(*|.렘wF状]n}XKΝkۭ9c¤>?.tqǥ{.9t5LݻwO={L[neѼY#\q뭷Ρa3iӦMw}ӎ;"`.",T МjYEwTFZk }N[_~U݈ҲeY!m8a4omP韺^ou:uL6-iݺu6qU^_޾#LmY~.x++Ӊ'.y,݈v3칊vيsѯ1KM!hsW]uU >:Nie{'5ƾB @ @ @ @ @'д2 @ @ @ @ @ @ @ٳgi jiwV\q7}t6h^xV(ϫ;%†Ze(TZ3'"Lk7OqO>Zbm0ƨdY--ZHzh{ӤIrb5kytV!ZuUsV^yn1Gc"б<|ܚgSN{Wc\ѶƆDvҒK.g?~l5/L*O^^_޾]&Ncƌa'*Ʌ^{x&w#rg\.ҥswDάz)zE> ]qy7xcfmҚk:w"sv_ @ @ @ @ @ 0 b#@ @ @ @ @ @ @(W_=5mUS&M7ߜ|zM3eʔԿwO/xƙ[:=:;6/_~XO?t>'",,J;HeV?|> sףG!i~x>wX^V[m|8;b"oQF/og4~qhh7`>9kFp/L*//o_]q˦SN9% 6,j*W?#Y\k,.-\ͪ\o幛7ofei?֦M뮻V̗_~z @ @ @ @ @ 0A ӛ @ @ @ @ @ ٻ8GDT,F{&b%ލ%Qla ;vTb^_|gwgaYf<̽{s7 @@ D_}aJ$|믿ݾ}MݧOH:S{1>xqǍw[o5OK.iwL+RvmwǵZnҊ+yGטn\RܗQߐ+PE8cܛ8vm_Pn_gN]5*]v? V7x#=裹h[Q T+H͠wzhL5T_^mQ}8Tą^8V;\s"Ntzu֭[>~5i頑c[o.gu\5rڇ?!EH7|S~JU] @ @ @ @ @ 0 Dm @ @ @ @ @ @ @6'_;.)jar .~4z~*'9\kU:\.$3Ϥ뮻.{챹[l_|[Zr-y+rСC%L>}>VpBwεǮo·}T y瀲*>ƌgRzWMkNb9<.ڷo_c[neZa}V[W_}Ro(^*vuԵk_}ݷƼYZWos 7L -PpwN}Yxv%JZzcKx͌?? 4hS0`@ns簼xW?|(:ŢM7ݔڼ{衇pX|qSNI~iyuގ{駟K.d{qgsy)*# ({8^(vq͛4v3}k8/#Z')+ץj @ @ @ @ @2 @ @ @ @ @ @ @@ . z铺tzRHQNrTv*wMO?}cEeFnj{キ6Ł}1Jhc|>Oٯc]k(#X7̡b'L̹|qmǚ[lyQGXGmiyɁ_.%6lLóhs1G իWz饗r h1vر x驧J,HZjR}Wi_A y?6tN;m~Fhi>CieGy$-hhw n7d` 6 =isɰڡ  N1K.Ioq6lXZxK,?jԨϧxظJ\w=u9;[M6$s=]=Y+|-\z뭋SJ#GLaߣ;o?;]J!ꪫ<0|a$sߏ''J2%J)>湗S Yo<1£#0ݻ&mQ*ivcguaq?ijrUWwHqN:Ny @ @ @ @ @ P z`T @ @ @ @ @ @ @ZSO84x\Do"$/Br! bDV7|64\o/`5$˭Z15ZtA9L1n@[rXŧ(6[:vmWT&Ф[lE~OF݈#js|:q;Fv饗 S+Jح:iM7-{f!Ei|❾k`nݺUeڝ 0 FPjp &@yW_TZ63{Gk\0J>lIɷ~;}/Ry\;3F(??(+st 'T UVY% :4FpcQvb[cT*'xb"h( #ܸDr36_8R~lOzyP&{8.u>_D0cW  @ @ @ @ @T_`[߭  @ @ @ @ @ @ @,0dȐs<#GQgN4f̘ _|q-+_怱#G99N `qOF@h}ٳghJ̅Z(OjiРAy{vH\rIގ6}i]ټ=Y~?> _j|!k*:\s:4mcFc-ҩ{Eۏ=: 6,^x 7f<1~_k馛.ѣIgcxoFݻwn}wߥÇQF~㞚j<߯*P~ګW]>,8㌩o߾^z S再qO^r%]8N34뮻w}wC @ @ @ @ @7\ @ @ @ @ @ @ @5 DM~5&&,E X|A B'x#@4B\%ƌ"$ƍq"pUVi!2V ,?UĘR:ASN9eZdETlA.lccPIՏUcUT;lO4#@ @ @ @ @ @ 8'@ @ @ @ @ @ @FmԨ>;wF$뮻.ŧ1eO묳NcNs'hmdm™6 @ @ @ @ @&AAEd @ @ @ @ @ @ @@kxve߾}sNoi62,o&1"o:iꩧ.6lXyϞڵkWj?Szꩧtݹs4siαW_MyZ_|EO>5;~izs7sVX!M9Ewa5ӏ:N1i+;!bK/19#M7t5ǵ{e_~9?ie>/ѣGznq|(kQ*VnfJzQWax'MC=4p iWOwy礉UK/MlM1xtP:묳2dȐ4`:sŏ?:uꔗc忷&Z @ @ @ @ @4^@cI @ @ @ @ @ @Lַ{|J#1B~8~I' .F]};2!xСCs0ǎ;9G-2]uUi*>^|~lDQ38cS=jN-rvխ[[;,Eay9wܑ/_~Ϊ+poi"y/ rmmKFq߭iof:N=45s!@ @ @ @ @ @$' qL @ @ @ @ @ @4D WXa7TS785\/HJ@_=1NcR^݊X92]veiw}A|~ / <8E`S93u=w7ߤ~;}3kzS޽6|4{%\2_ ksu?#U5jꩧNs=w?#/NW^yek\jLLxwۧUW]53|x}ZI'>M>cmWk|(lV) #p)QGzRw駧>8XƱ~8Eфxy]wݵN>`WP`V,LD,o;#h1Biv(Fq<ǢQ~r]w] ƨ{KG.Ylx)>EY}wߝ",2plss @ @ @ @ @ @hrC @ @ @ @ @ @ :#ɝyuB@vaU4m,̒xtO0TSMV]usϥ(;vL_n햇:thz뭷2wܑYa*0W\1xMIc"C:c'3K.$׭JubzE"hqOzkKy믧M74kWܒai6 @ @ @ @ @ @hLr&E @ @ @ @ @ @?^xtB޽Kͱ1S/j:uJ76rJcl^z=!?|>ф̹!6jW/u_~GQ=ܓ+ߍG}4+7<3&_*kvv)_vmՒ}w3A3Ӵ&'|>}ӂ .wǽ+[^y饗 駟>'sTOsѣ^{_^xa[ *2dH>g}6Eϟ:wǍu;R}uYiNݺu7|SjSfm",ӟT1h{nl9}袋Dg"5\~ǢYվ)g1ӏ;qpxwi=Zk/8dߍYo̳xqynLu_|Es?ڞr)SO=:|w5rgKz}ѣGٳg~nZo-ܒLjSO;cJSO{1%\2vmyn;X]VG @ @ @ @ @j fg"@ @ @ @ @ @ @L T[o5f!d|o=U6"?Ow_x㍫oC:qW)#}6֪cǎ%~J_s]k+v#,sy)뮻.mF9,sδKh[F_-Vc {h˦aÆA_~z҃>övbO9ST尽-b#nV+馛r]Ec3N>_~c>9lvׯqnD#/Jvr`<#1[.W{4xTc#x~Je@<]}թC9^{|<(O<ڇUW]a;S> wI >@͢ :41"WM9a.A%ۮTmg6>]vYg;'mg?sXgurh&kld @ @ @ @ @UTG @ @ @ @ @ @vZz衇Rqn}T")xp 4.™f}|nӨqR %|QXbM6髯n#XS)tih D [y裏J30Ci|}fgL+RoRM5[9Z&־xy`!C#~cƌ[l;+q|5HoVorhG]+B=4z뮻r_\jUF(믿nvmC3~[newHX܏ӟPqըlz_~EFg6kr\%ݻw5#4ߢ.Z\}S+b~W|{RktB l ʸc;.aJ#023cry 7knJ#@ @ @ @ @ @@ o @ @ @ @ @ @ @hcSN9e}٧|a98!8kVqy'E0N{SN9%N+rf]W5gc]V;$p"ys9K<9j,_!CMwygwOE`bJhFX_E[G _*>wsa^{c3:?,';B+#/JWnix+a\YZۧ]v*ɸ/HMQi4E޽{9^w +"sΥs#rM6Q~{キ<{6U#qmAZ΋am-*}z" _A^xa۶mQ~c7ޑ."cQbxH @ @ @ @ @$Ю1  @ @ @ @ @ @ @M /NE[o=ܴf=zǺ: Ae]?f]Aw5O$ia1ҥxϻ OZE8P~!/IAW^yeSKu>X֭[]Sl4駟΁hJ+ ]veӨQwEUy)V,\,oqF)o_&"-q=)sTXRZR%Ow])!mrUWvu:o#DX| 8Pގk2 3cyWSHV_~I=\sa,/k;?o1N;B犾V6ƽ!tJsι3țRX5xGhec=ݫW{եhg8~?ja,&;XVDa0cAF;m" 9+}]`q?H/r?={,U4LyqiL|Aos0wߝ뮴袋V4^zⱆT~N{o\rɆ66~cǎcm؃~OXh>0k7pCގXgE`C=.ŠCZꫯxlw'gecFEbqmQ_DxbQ"^QۗnҪn\}!n~dQI,Lz'-ܒ;\hR+^ ]Jv;hW)RmNrW_}U',7*Jɋw}hV^xZys#FT-tEISL1EC<+rEoWrE۸Bȑ#S1FYz+6/js1vhF/hW^l*W,ov*ږp1%X|*Z]Ʈ*ލ]vYJqNqk׮O>!lM"9VzR㏹MW bl9\\*7=vqh[~%b-gj_ӫWbsŻ2]ycm]Y^"pq=L?JNj"/#ĵ(vf  @ @ @ @ @ Ь` @ @ @ @ @ @ @@[Xxәg"dOLrY߾}dix`袋-ҠqM#g뭷4J;tPFCv5EXk")"<3ZS_b30CZguݴ;/G+J QxAYD}Qunxد_Y9lŵ"d1"+Qᥧ~zzWu ;vi~x\]4g4·~X.(/o_ަu떦n<#mb&/mkog|ꫯݮYocǚwO?"y\˙f4?WUW]5-)OY: @ @ @ @ @ژ 6vL @ @ @ @ @ @h7_jS⻩fv&,]{n0?ҷ~lO5Oviswż*]-8Ϋ)GZ'|2|5N:￿Ʊbo߾}Zb%Vݜah%l)Bve<2  w}ʧT~7KM[oUO?M_u>V̳hؽ{gU5[KFe;2K:}ݗxEm1K'Fq_?3<.LVn_+>^pqL1y5vC[>~FFv.k|ߗ=\B׮]Ӻ[q:jz @ @ @ @ @h+ʕ2O @ @ @ @ @ @ @~zCI<_ͻ}-O>iOvꩧ6j_=viYveOO*#￯}k~q<)AۉNQoZnҊ+pGטK^noVzk>Zkf-ڞÖ0hc_tWy)vm)MU=Э[<5\SgؘK6eySV>NFj",R~(3>F}O;Sߐċ(qZC/┊޽{gb,+"4X[zh?|6lXoFzGs}ѶNz*T.~\wgFM[=<묳vGUn+'5t17|S~裏R`C׎ @ @ @ @ @A]k9 @ @ @ @ @ @ @Z_{.]"hv .`*jѣGS)|v?!"R. 4bĈtc9&m;i)H{lѴſ7l!1D\]^N?ABEPq|̘1i})Pzš{gKł~]pNjvyx"8.J|?qvJ{W]^ xs9hEM۷[VX!?[mUzWk> E騬"#{GP^xt4w޹ߔ{ꫯJC{N;c),hhwW9P/X#SNI~ib#O?w\rɢſ?<,BItM+53N [u]S׮]_|wKkFc[>bҥKm't{'Og}v&>U^;L$Y;گ_|^M}W')'t'@ @ @ @ @ @@K+-1c @ @ @ @ @ @ @Z@)]pӣGԧO[o_~9ϸSN9 ]vW駟Ɫ2"o\%BV[m8]w]O˦K.$?3Θ?n [,3!BY}ճ_uQ9 X|Ego=\svhGyhZ|鬳*֘t7怯9#+K95;vXob_^{SOEY$-RÇO/b8kq|.EE_-riVa<@S'P鷡mc #-c\? f){.=:Eȑ#svX~7;)Q♏Ck)lI=ܓs+Mŵz[˔<"8~c7x4lذKk=jԨ!wA}}7.qΝi~KDe7`OV\qC@xM@8%_K`ʘ2,Gy$-)Ǧ(b>fe;C]wݕnL'|r:rmx7 PƢD`d^o~s#΁I'T @ @ @ @ @mN@cd&L @ @ @ @ @ @4SOC"+>E7<EUsC9AA|"k˟9fmr8Sq|GPPϞ=sHoCEQVE0Ww- OQfmvUA'#+-]wҺ2/#O>I%{am簵yl)ޓ7bĈS@YwOAA`^zipDX:묓6tӢ*q?~o=ۭ[t0bKkR馛҆n׿S霨ׯ_ZeUСCsaںv"|5~[w˝wޙc]+>Q"T0B[O8ᄊ-͌ߡpk0Ax _oF0g?_j,s'T=p |WReFK={3 3TO\5\3eB[>xfo_!wIˉ'Xc1fyP6(E@xy=I_|q>F0cW  @ @ @ @ @ڲdk 0w @ @ @ @ @ @ @` ]#<2qu:1cƤ\0uO*_~e9rdӜsΙ?`TW ロ"2#jl%΋PFNq"q\玭߉[oï"knVDXB -;8p`4hPa%\M>}9x<X>*}zK=qOG l ;o F["(}e~Կ:Gc @ @ @ @ @Am*# @ @ @ @ @ @ @Ɣ>:9MêM^6&0mQܹs+un[=-Zy5j  @ @ @ @ @ [Bݘ @ @ @ @ @ @ @V"ꫯ7j6oym$Vmʙ7 h;rimʻhQFfH @ @ @ @ @$@ @ @ @ @ @ @u]7ٳQYfeu^[=U[rM` Ԩ:vبImʻqQFfH @ @ @ @ @$@ @ @ @ @ @ @[,GqiA`b8p/SNIzhѣ՚;Usϻ9m<ך53kֳ57 @ @ @ @ @ @ 0~5| JCͻEO,\t @ @ @ @ @Y- qV  @ @ @ @ @ @PQFiӦٛ6W`vKrJn~!O?]#@3fL+V# @ @ @ @ @Gw{iC @ @ @ @ @ @ @ @ @ @ @ @ @}$́ @ @ @ @ @ @ /p7n\ @@^}tδ_< @3LW} @ @ @ @ @ Ц 64 @ @ @ @ @ @ @saҩ:w#8za<@A~x9rv>*S b @ @ @ @ @\({.i-U @ @ @ @ @ @V@5: @ @ @ @ @ @ Mx4uԚ7|ieM,HM}{w /pZeUn+O`^bʴiX}VJni&LH>5|K_N?xn^zgy&M<;1~'O?|ͼǺK?oF?ZjB &SLIr4p]O\ꪫVk:[xe{o\EСC2,z];>Ɖ}7*wqGzmj.8wQZ;Fs7ꧮ;9/BL{l}g__ݎ;nwy'=SiڴiNKguVk5jTGKRK5t]w5iKkytwx u]^;]s53 bQ>U2Pb>=YERc8?-ҥYa}/B:3^iۑUW]5EŹ;/EP/b싰+"'}SJ뭷^8qb ߋ/8msZ`rfXlXn*oF'"E>q]1"q?碋._[ѫRuM7=[>˶~rFx .X6QkT:{7K]gyRFe@gQG~UL B#t81vc: @ @ @ @ @h &A @ @ @ @ @ @lA?~|e3fHӞ{"."LUk裏N;S}L;> m.K /pM?Gjr7ޘX+1k6WG*wm(H)e̘1骫Jpyח~?OKB.6yI';.E}faVsMG( '"0IիW4ǎ{'\{#|+J0Fc<6iҤt嗧~-vm-" ru~z:sعn-ᢓ'Os49 @ @ @ @ @ @ Xs  @ @ @ @ @ @ @s@EO~|O>dۛz?rK/ Ccgnm:蠃j[ME/˹_i_3HW"\03<ӮձFaK<[iվ81^:^pS8^r%- (mY%h4a6lWKXVe~۷o:^{핇S3+ .`ԧ>aQ~]zySu'J+ @ @ @ @ @ @ @_]  @ @ @ @ @ @ @%.6 Zt* <FZ`=к뮛 _s5 O| t >s5&M&L7үz[go~GuL:2?j.rHMɓ':U_ՍFWocr̳˪z~b9JyL뗾6'NL^xa~acǦD+ӻロveBJ{C=Gx3j}@IDAT7I5W"7mٿ{UW]5 <8^uU]Z, i=HkF4hPg>~ߵhרAq:4-)5GqD FC5;r.Tvdef8}w1Z)cYf{9~F8;\sԿ||k_kWwߝ"xWο9rd +wb_O|p?G 6,EXom+7miEַ=9KG7~=Q>=uyUʶx>VN;cM|9VqtI)Y~8s1i-H#FH?>wy~W)~k3nHF6~;]x~{饗Z @ @ @ @ @=]OO?'@ @ @ @ @ @ @ }VmSkK){aHgqFC=EaKТa;+VZi7LALQ6l+P^{-"Pܸs,>FX[o="$0b%2"0&lu#iWLnM]PRffWڔp'qƕMn-oK;o|!SNaR%)!t:뤵^c .HnaիWMo1}5uӟ4_-6"s1^w=soyI|A;馛rh՗S k83+/bn_ܬO>"6>^zi^z}y8hV/ٌ9}vչ)Ss=2D"F]|<*!F]\8S>ߕ1TxO#4!O O?t\}7+-A}/?~|έ.q;Isux㍼h7u3OV<)>ե+ρw7DfDbYB -ŧz*r-sc3ڞuYyq^#ʿ|E]~_M @ @ @ @ @9Ap @ @ @ @ @ @ l[o2䪫ZY_xGR~*AI5bĈ\jr>}zMۉ(]MNDOEygOE/!qMF_pvi-4ǻ;9W_}uMDG2zv^󎐝^z-ܲzS#KcE)a|% l_r%S'6>y%_Ҕ_|8DE V@kTKbh]{饗a6WvnWǎ[.ӟ*ub𬘃1)P3-Ү8V_tEӲ.?Æ Ԯ;3<̓"EAx?|8j裏S;Y(Bc9cmwܑ"0tUVIg#22DgdM",|GhjbF6Ձȹ#E c)i%1V!@ @ @ @ @ @$7'c!@ @ @ @ @ @ @zӉplfiĈi 7L'O7 >Ձ}]J0]GO@W"TZ+3UorD)s/^r} f,A}ؤ?o~3y([[cE]Iwyrurea'Յ?vy9)\Ӡx7uYyGbK_R`z+]{&Mevԗ&iTƍoZ>cR9֗#(1JW˸3 Zޕ_|N.rcU!@ @ @ @ @ @#g9B @ @ @ @ @ @+ꚞ&}_o;SM Jx_3uDx 7Pc ¥:.X"x_~iwL*_e{ioK'tR>;#z5mW{Wi׷orWNRݾ{]V͹='|rO}YhҁX >b]\_zy1\sR]vm"`tVób@y{„ o|-.q ]yӢ.tW\Ř܋`ԩ9,O?W]wQ* k] xno{ꩧRiKbXrM7 . ;l뭷9].Q]sf'g6^x!w߰iu}֮jv\o;3tAi7O i:cƌ3Hw^e=*˶_~9M81ι}9:?]W˝=ޮVe+eGx|aEjΨ`R⼔k:@2]Q1) @ @ @ @ @)W`s9 @ @ @ @ @ @ @@"="/OǏOC?я:0ZM#X.ʋ/vVZDK/!C`/쀩pԻs(Xl97߬2LCM7rH`]tE+:o/%*"-3*ӧOO%}9vfUgg#HxDr-Ff"tfȊuz8zseرR9C7YC"(0eۧ^{-/<8?{36+X3J ^-zM?T?ʶ^b%WkKߙ)J`6Lųj{W vfyyymmQFc.\Q_1wu}bm|w4nܸ|WYeO|"}_NniGԝuY&O\Tata+m®k>|xzk+]q.c^wuvz衇JUw}E}/VX}r tno @ @ @ @ @=Y@cO>{N @ @ @ @ @ @tY`Kg+׿ui7AG]\(AtJ ՑaG~!L_}/gpm]ir(oqp+MzjK҃>إ%BJ^+Q[EZG>ivpm-/L׿3fLٔ55qϧZf9O O8Gw̍*㎕ ^!Q"QKnAQZ[^8s9+b#oqW hזu\3u=G]e~wx;Z߾+1c=/@_?űGf;.'x~  @ @ @ @ @ 0 󿺞 @ @ @ @ @ @ @-!85cƌ{C"+J}jr)r5-ܲܓ+cX%Bn\~{zg>4;<.eTV+ Iwu}ur__|6*mfݴiRF)^ǟ?9d/#*B??pi.ʲ9W ]Df\ǏON{gZr%s]lgNYĘ^:.][v,Ln/wmmP?͓'ON&MJ~g>s-}]Qhm棬4hP}G/&n_??rHC=i> +&|馛W\1{)B_~~XbJr=}[P0kY;zQ;v9vSNMx7 1bD~g{^,u'@ @ @ @ @ @) q< @ @ @ @ @ @@E/{d?W~Xwp3m>t4`K%15*3X=r\#Q"d=A_]XxGzӆnXwIǏtϸqrjFUᛣJg%T0f_~KHgw(.(? tgWU}{o,<[nɫmV"1gRK-A*̜gw<#<2BgE`(.ҮzoY{]moTwrDyGg.6Feoĉ?Osv!:-e]r]8_Xʏ~t뭷Үlbq:{.GuTkjM1([Ɲ\Wp]F@X7|᫃njS[|o喹.c5tnW+PO9|;67b-R߾}o~^Bk{Ϟo}[i<3"oub_j}\ވHܳ ~5D0]νKK.I%2^xꪫJWܕv~*y6ۤ.|'*믿~8p`n᧞z.rH?) .H{n^=s@pӱWWxu]yy֫>-!<AH3xtGP*J-ܒkj]\i*1дhPݮt8Ck|"8*J̻ڮJ~3ekOY}s@e.Fb/s1)©O91xiO8tJ`TEW}6UXY[nGN+bb>lI:ujZr%Gёa6B5~[o 70s=i5֨+Zkl^0r>ۻܙ{%`19Z(]^s 'O~ώ;XٺWͯ~ʶ,DnF Vu]oƍիWɋn-*)ϫo@x}^q^FNxsx~U:fͣD(駟{7sWj|xo[_"A +/~fnf.첚;N>_~9-|x&|׌oYd_>?OY}"2BfmϨQR<9PB%9gc @ @ @ @ @ @`Nh,愣r  @ @ @ @ @ @ @& DR$M81OAMzuMwuWs=?e 6 %FՁ[}V1~cL>\z],Z8蠃5\Ӯ#|+B",>;sjk{l`+"nFzjh[^ݮ8[`wܑuꩧ<bM𮣎:*-BCXbs\aݻwc% 0TXG[l|?b=.[s5#4hРVw᩷~{W?6B:aJRF`<"ĭ"wʔ)Ʋ]s31"xH{n)bxV5(԰w4lذ;iҤ^}՚q\q)B2a„F}MOl!ᇷzk #އ=G>4v=PzKU3Fnuw]K_R"1J\~ 4tx|"(;q;'̛Kviی:1"" {W:餓Z7c @ @ @ @ @ @ k?ʜp  @ @ @ @ @ @hs(O=#mڴiiUWM.:p}|-E`&AtZdvKrJ^u]駟ȑ#~0Ď0+{M1NEFcw/=qa=X~^."9wȐ!;ˍ};mJ2:y<[.-9j0uB/Ç05\|ꫯ0\shofo{vq"Knbby7cƌZW7꯺\#`T!@ @ @ @ @ @@;Ч4!@ @ @ @ @ @ @zaJtOˊOO)Okv9'9E "]v"dG=q֧O*Gӎ?i5̟5y7pwh3M`NI'ι'6ke͒4 @ @ @ @ @Gw{iC @ @ @ @ @ @ @ @ @ @ @ @ @Y0 @ @ @ @ @ @ @ @ @ @ @ @ @ @]Ť @ @ @ @ @ @ @ @ @ @ @ @ @ 1v` @ @ @ @ @ @ @ @ @ @ @ @ @ @@1I# @ @ @ @ @ @ @ @ @ @ @ @ @ @;bg @ @ @ @ @ @ @ @ @ @ @ @ @ @v blF @ @ @ @ @ @ @ @ @ @ @ @ @ @@w΂9 @ @ @ @ @ @ @ @ @ @ @ @ @ @ӮV @ @ @ @ @ @ @s3<Ǝ;'@(0}6k=Ho @{רZ @ @ @ @ @" )!@ @ @ @ @ @ @s@u?~=@GF n*  @ @ @ @ @ @n޳{O @ @ @ @ @ @ @ @ @ @ @ @ @h@6Ԏ @ @ @ @ @ @^x4cƌ-B}VWU:* @@38i1 @ @ @ @ @J @ @ @ @ @ @ @*TY$@A_~)>  @ @ @ @ @ @,л;O @ @ @ @ @ @ @ @ @ @ @ @ @ @5, @ @ @ @ @ @ @ @ @ @ @ @ @ @Z@c>=&G @ @ @ @ @ @ @ @ @ @ @ @ @T ^L @ @ @ @ @ @}'NLvw @* /9 @ @ @ @ @=W@c=wfN @ @ @ @ @ @"p饗( @ @ @ @ @ @ @ л'L  @ @ @ @ @ @ @ @ @ @ @ @ @ @! @ @ @ @ @ @ 0 jSO @ --eR @ @ @ @ @tO^3Q̊ @ @ @ @ @ @ @ @ @ @ @ @ @ P#5V @ @ @ @ @ @ @ @ @ @ @ @ @ @X@c7>9F @ @ @ @ @ @ @ @ @ @ @ @ @ bF @ @ @ @ @ @ @ @ @ @ @ @ @tcA @ @ @ @ @ @ @ @ @ @ @ @ @ P+  @ @ @ @ @ @ @ @ @ @ @ @ @ Ѝ1vcj @ @ @ @ @ @ @ @ @ @ @ @ @ @@ Zk @ @ @ @ @ @ @ @ @ @ @ @ @ @@7؍O @ @ @ @ @ @ @ @ @ @ @ @ @ @k= @ @ @ @ @ @ @ @ @ @ @ @ @ @X@c7>9F @ @ @ @ @ @ @ @ @ @ @ @ @ bF @ @ @ @ @ @ @ @ @ @ @ @ @tcA @ @ @ @ @ @ @ @ @ @ @ @ @ P+  @ @ @ @ @ @ @ @ @ @ @ @ @ Ѝ1vcj @ @ @ @ @ @ @ @ @ @ @ @ @ @@ Zk @ @ @ @ @ @ @ @ @ @ @ @ @ @@7؍O @ @ @ @ @ @ @ @ @ @ @ @ @ @k= @ @ @ @ @ @ @ @ @ @ @ @ @ @X@c7>9F @ @ @ @ @ @ @ @ @ @ @ @ @ bF @ @ @ @ @ @ @ @ @ @ @ @ @tcAKyjIDAT @ @ @ @ @ @ @ @ @ @ @ @ @ P+  @ @ @ @ @ @ @ @ @ @ @ @ @ Ѝ1vcj @ @ @ @ @ @ @ @ @ @ @ @ @ @@ Zk @ @ @ @ @ @ @ @ @ @ @ @ @ @@7؍O @ @ @ @ @ @ @ @ @ @ @ @ @ @k= @ @ @ @ @ @ @ @ @ @ @ @ @ @X@c7>9F @ @ @ @ @ @ @ @ @ @ @ @ @ bF @ @ @ @ @ @ @ @ @ @ @ @ @tcA @ @ @ @;$a u;(,e @ @ @ @ @ @ @ @ @* X @ @ @ @ @ @ @ @ @ @ @ @ @8b<~ @ @ @ @ @ @ @ @ @ @ @ @ @ @ 1"@ @ @ @ @ @ @ @ @ @ @ @ @ @4 @ @ @ @ @ @ @ @ @ @ @ @ @ @B @ @ @ @ @ @ @ @ @ @ @ @ @ @c!8 @ @ @ @ @ @ @ @ @ @ @ @ @c=, @ @ @ @ @ @ @ @ @ @ @ @ @ @X@9N#@ @ @ @ @ @ @ @ @ @ @ @ @ @* X @ @ @ @ @ @ @ @ @ @ @ @ @8b<~ @ @ @ @ @ @ @ @ @ @ @ @ @ @ 1"@ @ @ @ @ @ @ @ @ @ @ @ @ @4 @ @ @ @ @ @ @ @ @ @ @ @ @ @B @ @ @ @ @ @ @ @ @ @ @ @ @ @c!8 @ @ @ @ @ @ @ @ @ @ @ @ @c=, @ @ @ @ @ @ @ @ @ @ @ @ @ @X@9N#@ @ @ @ @ @ @ @ @ @ @ @ @ @* X @ @ @ @ @ @ @ @ @ @ @ @ @8b<~ @ @ @ @ @ @ @ @ @ @ @ @ @ @ 1"@ @ @ @ @ @ @ @ @ @ @ @ @ @l&JQIENDB`h2-3.1.1/docs/source/advanced-usage.rst0000664000175000017500000003646213421652727020572 0ustar ubuntuubuntu00000000000000Advanced Usage ============== Priority -------- .. versionadded:: 2.0.0 `RFC 7540`_ has a fairly substantial and complex section describing how to build a HTTP/2 priority tree, and the effect that should have on sending data from a server. Hyper-h2 does not enforce any priority logic by default for servers. This is because scheduling data sends is outside the scope of this library, as it likely requires fairly substantial understanding of the scheduler being used. However, for servers that *do* want to follow the priority recommendations given by clients, the Hyper project provides `an implementation`_ of the `RFC 7540`_ priority tree that will be useful to plug into a server. That, combined with the :class:`PriorityUpdated ` event from this library, can be used to build a server that conforms to RFC 7540's recommendations for priority handling. Related Events -------------- .. versionadded:: 2.4.0 In the 2.4.0 release hyper-h2 added support for signaling "related events". These are a HTTP/2-only construct that exist because certain HTTP/2 events can occur simultaneously: that is, one HTTP/2 frame can cause multiple state transitions to occur at the same time. One example of this is a HEADERS frame that contains priority information and carries the END_STREAM flag: this would cause three events to fire (one of the various request/response received events, a :class:`PriorityUpdated ` event, and a :class:`StreamEnded ` event). Ordinarily hyper-h2's logic will emit those events to you one at a time. This means that you may attempt to process, for example, a :class:`DataReceived ` event, not knowing that the next event out will be a :class:`StreamEnded ` event. hyper-h2 *does* know this, however, and so will forbid you from taking certain actions that are a violation of the HTTP/2 protocol. To avoid this asymmetry of information, events that can occur simultaneously now carry properties for their "related events". These allow users to find the events that can have occurred simultaneously with each other before the event is emitted by hyper-h2. The following objects have "related events": - :class:`RequestReceived `: - :data:`stream_ended `: any :class:`StreamEnded ` event that occurred at the same time as receiving this request. - :data:`priority_updated `: any :class:`PriorityUpdated ` event that occurred at the same time as receiving this request. - :class:`ResponseReceived `: - :data:`stream_ended `: any :class:`StreamEnded ` event that occurred at the same time as receiving this response. - :data:`priority_updated `: any :class:`PriorityUpdated ` event that occurred at the same time as receiving this response. - :class:`TrailersReceived `: - :data:`stream_ended `: any :class:`StreamEnded ` event that occurred at the same time as receiving this set of trailers. This will **always** be present for trailers, as they must terminate streams. - :data:`priority_updated `: any :class:`PriorityUpdated ` event that occurred at the same time as receiving this response. - :class:`InformationalResponseReceived `: - :data:`priority_updated `: any :class:`PriorityUpdated ` event that occurred at the same time as receiving this informational response. - :class:`DataReceived `: - :data:`stream_ended `: any :class:`StreamEnded ` event that occurred at the same time as receiving this data. .. warning:: hyper-h2 does not know if you are looking for related events or expecting to find events in the event stream. Therefore, it will always emit "related events" in the event stream. If you are using the "related events" event pattern, you will want to be careful to avoid double-processing related events. .. _h2-connection-advanced: Connections: Advanced --------------------- Thread Safety ~~~~~~~~~~~~~ ``H2Connection`` objects are *not* thread-safe. They cannot safely be accessed from multiple threads at once. This is a deliberate design decision: it is not trivially possible to design the ``H2Connection`` object in a way that would be either lock-free or have the locks at a fine granularity. Your implementations should bear this in mind, and handle it appropriately. It should be simple enough to use locking alongside the ``H2Connection``: simply lock around the connection object itself. Because the ``H2Connection`` object does no I/O it should be entirely safe to do that. Alternatively, have a single thread take ownership of the ``H2Connection`` and use a message-passing interface to serialize access to the ``H2Connection``. If you are using a non-threaded concurrency approach (e.g. Twisted), this should not affect you. Internal Buffers ~~~~~~~~~~~~~~~~ In order to avoid doing I/O, the ``H2Connection`` employs an internal buffer. This buffer is *unbounded* in size: it can potentially grow infinitely. This means that, if you are not making sure to regularly empty it, you are at risk of exceeding the memory limit of a single process and finding your program crashes. It is highly recommended that you send data at regular intervals, ideally as soon as possible. .. _advanced-sending-data: Sending Data ~~~~~~~~~~~~ When sending data on the network, it's important to remember that you may not be able to send an unbounded amount of data at once. Particularly when using TCP, it is often the case that there are limits on how much data may be in flight at any one time. These limits can be very low, and your operating system will only buffer so much data in memory before it starts to complain. For this reason, it is possible to consume only a subset of the data available when you call :meth:`data_to_send `. However, once you have pulled the data out of the ``H2Connection`` internal buffer, it is *not* possible to put it back on again. For that reason, it is adviseable that you confirm how much space is available in the OS buffer before sending. Alternatively, use tools made available by your framework. For example, the Python standard library :mod:`socket ` module provides a :meth:`sendall ` method that will automatically block until all the data has been sent. This will enable you to always use the unbounded form of :meth:`data_to_send `, and will help you avoid subtle bugs. When To Send ~~~~~~~~~~~~ In addition to knowing how much data to send (see :ref:`advanced-sending-data`) it is important to know when to send data. For hyper-h2, this amounts to knowing when to call :meth:`data_to_send `. Hyper-h2 may write data into its send buffer at two times. The first is whenever :meth:`receive_data ` is called. This data is sent in response to some control frames that require no user input: for example, responding to PING frames. The second time is in response to user action: whenever a user calls a method like :meth:`send_headers `, data may be written into the buffer. In a standard design for a hyper-h2 consumer, then, that means there are two places where you'll potentially want to send data. The first is in your "receive data" loop. This is where you take the data you receive, pass it into :meth:`receive_data `, and then dispatch events. For this loop, it is usually best to save sending data until the loop is complete: that allows you to empty the buffer only once. The other place you'll want to send the data is when initiating requests or taking any other active, unprompted action on the connection. In this instance, you'll want to make all the relevant ``send_*`` calls, and *then* call :meth:`data_to_send `. Headers ------- HTTP/2 defines several "special header fields" which are used to encode data that was previously sent in either the request or status line of HTTP/1.1. These header fields are distinguished from ordinary header fields because their field name begins with a ``:`` character. The special header fields defined in `RFC 7540`_ are: - ``:status`` - ``:path`` - ``:method`` - ``:scheme`` - ``:authority`` `RFC 7540`_ **mandates** that all of these header fields appear *first* in the header block, before the ordinary header fields. This could cause difficulty if the :meth:`send_headers ` method accepted a plain ``dict`` for the ``headers`` argument, because ``dict`` objects are unordered. For this reason, we require that you provide a list of two-tuples. .. _RFC 7540: https://tools.ietf.org/html/rfc7540 .. _an implementation: http://python-hyper.org/projects/priority/en/latest/ Flow Control ------------ HTTP/2 defines a complex flow control system that uses a sliding window of data on both a per-stream and per-connection basis. Essentially, each implementation allows its peer to send a specific amount of data at any time (the "flow control window") before it must stop. Each stream has a separate window, and the connection as a whole has a window. Each window can be opened by an implementation by sending a ``WINDOW_UPDATE`` frame, either on a specific stream (causing the window for that stream to be opened), or on stream ``0``, which causes the window for the entire connection to be opened. In HTTP/2, only data in ``DATA`` frames is flow controlled. All other frames are exempt from flow control. Each ``DATA`` frame consumes both stream and connection flow control window bytes. This means that the maximum amount of data that can be sent on any one stream before a ``WINDOW_UPDATE`` frame is received is the *lower* of the stream and connection windows. The maximum amount of data that can be sent on *all* streams before a ``WINDOW_UPDATE`` frame is received is the size of the connection flow control window. Working With Flow Control ~~~~~~~~~~~~~~~~~~~~~~~~~ The amount of flow control window a ``DATA`` frame consumes is the sum of both its contained application data *and* the amount of padding used. hyper-h2 shows this to the user in a :class:`DataReceived ` event by using the :data:`flow_controlled_length ` field. When working with flow control in hyper-h2, users *must* use this field: simply using ``len(datareceived.data)`` can eventually lead to deadlock. When data has been received and given to the user in a :class:`DataReceived `, it is the responsibility of the user to re-open the flow control window when the user is ready for more data. hyper-h2 does not do this automatically to avoid flooding the user with data: if we did, the remote peer could send unbounded amounts of data that the user would need to buffer before processing. To re-open the flow control window, then, the user must call :meth:`increment_flow_control_window ` with the :data:`flow_controlled_length ` of the received data. hyper-h2 requires that you manage both the connection and the stream flow control windows separately, so you may need to increment both the stream the data was received on and stream ``0``. When sending data, a HTTP/2 implementation must not send more than flow control window available for that stream. As noted above, the maximum amount of data that can be sent on the stream is the minimum of the stream and the connection flow control windows. You can find out how much data you can send on a given stream by using the :meth:`local_flow_control_window ` method, which will do all of these calculations for you. If you attempt to send more than this amount of data on a stream, hyper-h2 will throw a :class:`ProtocolError ` and refuse to send the data. In hyper-h2, receiving a ``WINDOW_UPDATE`` frame causes a :class:`WindowUpdated ` event to fire. This will notify you that there is potentially more room in a flow control window. Note that, just because an increment of a given size was received *does not* mean that that much more data can be sent: remember that both the connection and stream flow control windows constrain how much data can be sent. As a result, when a :class:`WindowUpdated ` event fires with a non-zero stream ID, and the user has more data to send on that stream, the user should call :meth:`local_flow_control_window ` to check if there really is more room to send data on that stream. When a :class:`WindowUpdated ` event fires with a stream ID of ``0``, that may have unblocked *all* streams that are currently blocked. The user should use :meth:`local_flow_control_window ` to check all blocked streams to see if more data is available. Auto Flow Control ~~~~~~~~~~~~~~~~~ .. versionadded:: 2.5.0 In most cases, there is no advantage for users in managing their own flow control strategies. While particular high performance or specific-use-case applications may gain value from directly controlling the emission of ``WINDOW_UPDATE`` frames, the average application can use a lowest-common-denominator strategy to emit those frames. As of version 2.5.0, hyper-h2 now provides this automatic strategy for users, if they want to use it. This automatic strategy is built around a single method: :meth:`acknowledge_received_data `. This method flags to the connection object that your application has dealt with a certain number of flow controlled bytes, and that the window should be incremented in some way. Whenever your application has "processed" some received bytes, this method should be called to signal that they have been processed. The key difference between this method and :meth:`increment_flow_control_window ` is that the method :meth:`acknowledge_received_data ` does not guarantee that it will emit a ``WINDOW_UPDATE`` frame, and if it does it will not necessarily emit them for *only* the stream or *only* the frame. Instead, the ``WINDOW_UPDATE`` frames will be *coalesced*: they will be emitted only when a certain number of bytes have been freed up. For most applications, this method should be preferred to the manual flow control mechanism. h2-3.1.1/docs/source/api.rst0000664000175000017500000000620013421652727016457 0ustar ubuntuubuntu00000000000000Hyper-h2 API ============ This document details the API of Hyper-h2. Semantic Versioning ------------------- Hyper-h2 follows semantic versioning for its public API. Please note that the guarantees of semantic versioning apply only to the API that is *documented here*. Simply because a method or data field is not prefaced by an underscore does not make it part of Hyper-h2's public API. Anything not documented here is subject to change at any time. Connection ---------- .. autoclass:: h2.connection.H2Connection :members: :exclude-members: inbound_flow_control_window Configuration ------------- .. autoclass:: h2.config.H2Configuration :members: .. _h2-events-api: Events ------ .. autoclass:: h2.events.RequestReceived :members: .. autoclass:: h2.events.ResponseReceived :members: .. autoclass:: h2.events.TrailersReceived :members: .. autoclass:: h2.events.InformationalResponseReceived :members: .. autoclass:: h2.events.DataReceived :members: .. autoclass:: h2.events.WindowUpdated :members: .. autoclass:: h2.events.RemoteSettingsChanged :members: .. autoclass:: h2.events.PingReceived :members: .. autoclass:: h2.events.PingAckReceived :members: .. autoclass:: h2.events.StreamEnded :members: .. autoclass:: h2.events.StreamReset :members: .. autoclass:: h2.events.PushedStreamReceived :members: .. autoclass:: h2.events.SettingsAcknowledged :members: .. autoclass:: h2.events.PriorityUpdated :members: .. autoclass:: h2.events.ConnectionTerminated :members: .. autoclass:: h2.events.AlternativeServiceAvailable :members: .. autoclass:: h2.events.UnknownFrameReceived :members: Exceptions ---------- .. autoclass:: h2.exceptions.H2Error :members: .. autoclass:: h2.exceptions.NoSuchStreamError :show-inheritance: :members: .. autoclass:: h2.exceptions.StreamClosedError :show-inheritance: :members: .. autoclass:: h2.exceptions.RFC1122Error :show-inheritance: :members: Protocol Errors ~~~~~~~~~~~~~~~ .. autoclass:: h2.exceptions.ProtocolError :show-inheritance: :members: .. autoclass:: h2.exceptions.FrameTooLargeError :show-inheritance: :members: .. autoclass:: h2.exceptions.FrameDataMissingError :show-inheritance: :members: .. autoclass:: h2.exceptions.TooManyStreamsError :show-inheritance: :members: .. autoclass:: h2.exceptions.FlowControlError :show-inheritance: :members: .. autoclass:: h2.exceptions.StreamIDTooLowError :show-inheritance: :members: .. autoclass:: h2.exceptions.InvalidSettingsValueError :members: .. autoclass:: h2.exceptions.NoAvailableStreamIDError :show-inheritance: :members: .. autoclass:: h2.exceptions.InvalidBodyLengthError :show-inheritance: :members: .. autoclass:: h2.exceptions.UnsupportedFrameError :members: .. autoclass:: h2.exceptions.DenialOfServiceError :show-inheritance: :members: HTTP/2 Error Codes ------------------ .. automodule:: h2.errors :members: Settings -------- .. autoclass:: h2.settings.SettingCodes :members: .. autoclass:: h2.settings.Settings :inherited-members: .. autoclass:: h2.settings.ChangedSetting :members: h2-3.1.1/docs/source/asyncio-example.rst0000664000175000017500000000102713421652727021006 0ustar ubuntuubuntu00000000000000Asyncio Example Server ====================== This example is a basic HTTP/2 server written using `asyncio`_, using some functionality that was introduced in Python 3.5. This server represents basically just the same JSON-headers-returning server that was built in the :doc:`basic-usage` document. This example demonstrates some basic asyncio techniques. .. literalinclude:: ../../examples/asyncio/asyncio-server.py :language: python :linenos: :encoding: utf-8 .. _asyncio: https://docs.python.org/3/library/asyncio.html h2-3.1.1/docs/source/basic-usage.rst0000664000175000017500000007116313521033071020065 0ustar ubuntuubuntu00000000000000Getting Started: Writing Your Own HTTP/2 Server =============================================== This document explains how to get started writing fully-fledged HTTP/2 implementations using Hyper-h2 as the underlying protocol stack. It covers the basic concepts you need to understand, and talks you through writing a very simple HTTP/2 server. This document assumes you're moderately familiar with writing Python, and have *some* understanding of how computer networks work. If you don't, you'll find it a lot easier if you get some understanding of those concepts first and then return to this documentation. .. _h2-connection-basic: Connections ----------- Hyper-h2's core object is the :class:`H2Connection ` object. This object is an abstract representation of the state of a single HTTP/2 connection, and holds all the important protocol state. When using Hyper-h2, this object will be the first thing you create and the object that does most of the heavy lifting. The interface to this object is relatively simple. For sending data, you call the object with methods indicating what actions you want to perform: for example, you may want to send headers (you'd use the :meth:`send_headers ` method), or send data (you'd use the :meth:`send_data ` method). After you've decided what actions you want to perform, you get some bytes out of the object that represent the HTTP/2-encoded representation of your actions, and send them out over the network however you see fit. When you receive data from the network, you pass that data in to the ``H2Connection`` object, which returns a list of *events*. These events, covered in more detail later in :ref:`h2-events-basic`, define the set of actions the remote peer has performed on the connection, as represented by the HTTP/2-encoded data you just passed to the object. Thus, you end up with a simple loop (which you may recognise as a more-specific form of an `event loop`_): 1. First, you perform some actions. 2. You send the data created by performing those actions to the network. 3. You read data from the network. 4. You decode those into events. 5. The events cause you to trigger some actions: go back to step 1. Of course, HTTP/2 is more complex than that, but in the very simplest case you can write a fairly effective HTTP/2 tool using just that kind of loop. Later in this document, we'll do just that. Some important subtleties of ``H2Connection`` objects are covered in :doc:`advanced-usage`: see :ref:`h2-connection-advanced` for more information. However, one subtlety should be covered, and that is this: Hyper-h2's ``H2Connection`` object doesn't do I/O. Let's talk briefly about why. I/O ~~~ Any useful HTTP/2 tool eventually needs to do I/O. This is because it's not very useful to be able to speak to other computers using a protocol like HTTP/2 unless you actually *speak* to them sometimes. However, doing I/O is not a trivial thing: there are lots of different ways to do it, and once you choose a way to do it your code usually won't work well with the approaches you *didn't* choose. While there are lots of different ways to do I/O, when it comes down to it all HTTP/2 implementations transform bytes received into events, and events into bytes to send. So there's no reason to have lots of different versions of this core protocol code: one for Twisted, one for gevent, one for threading, and one for synchronous code. This is why we said at the top that Hyper-h2 is a *HTTP/2 Protocol Stack*, not a *fully-fledged implementation*. Hyper-h2 knows how to transform bytes into events and back, but that's it. The I/O and smarts might be different, but the core HTTP/2 logic is the same: that's what Hyper-h2 provides. Not doing I/O makes Hyper-h2 general, and also relatively simple. It has an easy-to-understand performance envelope, it's easy to test (and as a result easy to get correct behaviour out of), and it behaves in a reproducible way. These are all great traits to have in a library that is doing something quite complex. This document will talk you through how to build a relatively simple HTTP/2 implementation using Hyper-h2, to give you an understanding of where it fits in your software. .. _h2-events-basic: Events ------ When writing a HTTP/2 implementation it's important to know what the remote peer is doing: if you didn't care, writing networked programs would be a lot easier! Hyper-h2 encodes the actions of the remote peer in the form of *events*. When you receive data from the remote peer and pass it into your ``H2Connection`` object (see :ref:`h2-connection-basic`), the ``H2Connection`` returns a list of objects, each one representing a single event that has occurred. Each event refers to a single action the remote peer has taken. Some events are fairly high-level, referring to things that are more general than HTTP/2: for example, the :class:`RequestReceived ` event is a general HTTP concept, not just a HTTP/2 one. Other events are extremely HTTP/2-specific: for example, :class:`PushedStreamReceived ` refers to Server Push, a very HTTP/2-specific concept. The reason these events exist is that Hyper-h2 is intended to be very general. This means that, in many cases, Hyper-h2 does not know exactly what to do in response to an event. Your code will need to handle these events, and make decisions about what to do. That's the major role of any HTTP/2 implementation built on top of Hyper-h2. A full list of events is available in :ref:`h2-events-api`. For the purposes of this example, we will handle only a small set of events. Writing Your Server ------------------- Armed with the knowledge you just obtained, we're going to write a very simple HTTP/2 web server. The goal of this server is to write a server that can handle a HTTP GET, and that returns the headers sent by the client, encoded in JSON. Basically, something a lot like `httpbin.org/get`_. Nothing fancy, but this is a good way to get a handle on how you should interact with Hyper-h2. For the sake of simplicity, we're going to write this using the Python standard library, in Python 3. In reality, you'll probably want to use an asynchronous framework of some kind: see the `examples directory`_ in the repository for some examples of how you'd do that. Before we start, create a new file called ``h2server.py``: we'll use that as our workspace. Additionally, you should install Hyper-h2: follow the instructions in :doc:`installation`. Step 1: Sockets ~~~~~~~~~~~~~~~ To begin with, we need to make sure we can listen for incoming data and send it back. To do that, we need to use the `standard library's socket module`_. For now we're going to skip doing TLS: if you want to reach your server from your web browser, though, you'll need to add TLS and some other function. Consider looking at our examples in our `examples directory`_ instead. Let's begin. First, open up ``h2server.py``. We need to import the socket module and start listening for connections. This is not a socket tutorial, so we're not going to dive too deeply into how this works. If you want more detail about sockets, there are lots of good tutorials on the web that you should investigate. When you want to listen for incoming connections, the you need to *bind* an address first. So let's do that. Try setting up your file to look like this: .. code-block:: python import socket sock = socket.socket() sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) sock.bind(('0.0.0.0', 8080)) sock.listen(5) while True: print(sock.accept()) In a shell window, execute this program (``python h2server.py``). Then, open another shell and run ``curl http://localhost:8080/``. In the first shell, you should see something like this: .. code-block:: console $ python h2server.py (, ('127.0.0.1', 58800)) Run that ``curl`` command a few more times. You should see a few more similar lines appear. Note that the ``curl`` command itself will exit with an error. That's fine: it happens because we didn't send any data. Now go ahead and stop the server running by hitting Ctrl+C in the first shell. You should see a ``KeyboardInterrupt`` error take the process down. What's the program above doing? Well, first it creates a :func:`socket ` object. This socket is then *bound* to a specific address: ``('0.0.0.0', 8080)``. This is a special address: it means that this socket should be listening for any traffic to TCP port 8080. Don't worry about the call to ``setsockopt``: it just makes sure you can run this program repeatedly. We then loop forever calling the :meth:`accept ` method on the socket. The accept method blocks until someone attempts to connect to our TCP port: when they do, it returns a tuple: the first element is a new socket object, the second element is a tuple of the address the new connection is from. You can see this in the output from our ``h2server.py`` script. At this point, we have a script that can accept inbound connections. This is a good start! Let's start getting HTTP/2 involved. Step 2: Add a H2Connection ~~~~~~~~~~~~~~~~~~~~~~~~~~ Now that we can listen for socket information, we want to prepare our HTTP/2 connection object and start handing it data. For now, let's just see what happens as we feed it data. To make HTTP/2 connections, we need a tool that knows how to speak HTTP/2. Most versions of curl in the wild don't, so let's install a Python tool. In your Python environment, run ``pip install hyper``. This will install a Python command-line HTTP/2 tool called ``hyper``. To confirm that it works, try running this command and verifying that the output looks similar to the one shown below: .. code-block:: console $ hyper GET https://nghttp2.org/httpbin/get {'args': {}, 'headers': {'Host': 'nghttp2.org'}, 'origin': '10.0.0.2', 'url': 'https://nghttp2.org/httpbin/get'} Assuming it works, you're now ready to start sending HTTP/2 data. Back in our ``h2server.py`` script, we're going to want to start handling data. Let's add a function that takes a socket returned from ``accept``, and reads data from it. Let's call that function ``handle``. That function should create a :class:`H2Connection ` object and then loop on the socket, reading data and passing it to the connection. To read data from a socket we need to call ``recv``. The ``recv`` function takes a number as its argument, which is the *maximum* amount of data to be returned from a single call (note that ``recv`` will return as soon as any data is available, even if that amount is vastly less than the number you passed to it). For the purposes of writing this kind of software the specific value is not enormously useful, but should not be overly large. For that reason, when you're unsure, a number like 4096 or 65535 is a good bet. We'll use 65535 for this example. The function should look something like this: .. code-block:: python import h2.connection import h2.config def handle(sock): config = h2.config.H2Configuration(client_side=False) conn = h2.connection.H2Connection(config=config) while True: data = sock.recv(65535) print(conn.receive_data(data)) Let's update our main loop so that it passes data on to our new data handling function. Your ``h2server.py`` should end up looking a like this: .. code-block:: python import socket import h2.connection import h2.config def handle(sock): config = h2.config.H2Configuration(client_side=False) conn = h2.connection.H2Connection(config=config) while True: data = sock.recv(65535) if not data: break print(conn.receive_data(data)) sock = socket.socket() sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) sock.bind(('0.0.0.0', 8080)) sock.listen(5) while True: handle(sock.accept()[0]) Running that in one shell, in your other shell you can run ``hyper --h2 GET http://localhost:8080/``. That shell should hang, and you should then see the following output from your ``h2server.py`` shell: .. code-block:: console $ python h2server.py [] You'll then need to kill ``hyper`` and ``h2server.py`` with Ctrl+C. Feel free to do this a few times, to see how things behave. So, what did we see here? When the connection was opened, we used the :meth:`recv ` method to read some data from the socket, in a loop. We then passed that data to the connection object, which returned us a single event object: :class:`RemoteSettingsChanged `. But what we didn't see was anything else. So it seems like all ``hyper`` did was change its settings, but nothing else. If you look at the other ``hyper`` window, you'll notice that it hangs for a while and then eventually fails with a socket timeout. It was waiting for something: what? Well, it turns out that at the start of a connection, both sides need to send a bit of data, called "the HTTP/2 preamble". We don't need to get into too much detail here, but basically both sides need to send a single block of HTTP/2 data that tells the other side what their settings are. ``hyper`` did that, but we didn't. Let's do that next. Step 3: Sending the Preamble ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Hyper-h2 makes doing connection setup really easy. All you need to do is call the :meth:`initiate_connection ` method, and then send the corresponding data. Let's update our ``handle`` function to do just that: .. code-block:: python def handle(sock): config = h2.config.H2Configuration(client_side=False) conn = h2.connection.H2Connection(config=config) conn.initiate_connection() sock.sendall(conn.data_to_send()) while True: data = sock.recv(65535) print(conn.receive_data(data)) The big change here is the call to ``initiate_connection``, but there's another new method in there: :meth:`data_to_send `. When you make function calls on your ``H2Connection`` object, these will often want to cause HTTP/2 data to be written out to the network. But Hyper-h2 doesn't do any I/O, so it can't do that itself. Instead, it writes it to an internal buffer. You can retrieve data from this buffer using the ``data_to_send`` method. There are some subtleties about that method, but we don't need to worry about them right now: all we need to do is make sure we're sending whatever data is outstanding. Your ``h2server.py`` script should now look like this: .. code-block:: python import socket import h2.connection import h2.config def handle(sock): config = h2.config.H2Configuration(client_side=False) conn = h2.connection.H2Connection(config=config) conn.initiate_connection() sock.sendall(conn.data_to_send()) while True: data = sock.recv(65535) if not data: break print(conn.receive_data(data)) sock = socket.socket() sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) sock.bind(('0.0.0.0', 8080)) sock.listen(5) while True: handle(sock.accept()[0]) With this change made, rerun your ``h2server.py`` script and hit it with the same ``hyper`` command: ``hyper --h2 GET http://localhost:8080/``. The ``hyper`` command still hangs, but this time we get a bit more output from our ``h2server.py`` script: .. code-block:: console $ python h2server.py [] [] [, ] So, what's happening? The first thing to note is that we're going around our loop more than once now. First, we receive some data that triggers a :class:`RemoteSettingsChanged ` event. Then, we get some more data that triggers a :class:`SettingsAcknowledged ` event. Finally, even more data that triggers *two* events: :class:`RequestReceived ` and :class:`StreamEnded `. So, what's happening is that ``hyper`` is telling us about its settings, acknowledging ours, and then sending us a request. Then it ends a *stream*, which is a HTTP/2 communications channel that holds a request and response pair. A stream isn't done until it's either *reset* or both sides *close* it: in this sense it's bi-directional. So what the ``StreamEnded`` event tells us is that ``hyper`` is closing its half of the stream: it won't send us any more data on that stream. That means the request is done. So why is ``hyper`` hanging? Well, we haven't sent a response yet: let's do that. Step 4: Handling Events ~~~~~~~~~~~~~~~~~~~~~~~ What we want to do is send a response when we receive a request. Happily, we get an event when we receive a request, so we can use that to be our signal. Let's define a new function that sends a response. For now, this response can just be a little bit of data that prints "it works!". The function should take the ``H2Connection`` object, and the event that signaled the request. Let's define it. .. code-block:: python def send_response(conn, event): stream_id = event.stream_id conn.send_headers( stream_id=stream_id, headers=[ (':status', '200'), ('server', 'basic-h2-server/1.0') ], ) conn.send_data( stream_id=stream_id, data=b'it works!', end_stream=True ) So while this is only a short function, there's quite a lot going on here we need to unpack. Firstly, what's a stream ID? Earlier we discussed streams briefly, to say that they're a bi-directional communications channel that holds a request and response pair. Part of what makes HTTP/2 great is that there can be lots of streams going on at once, sending and receiving different requests and responses. To identify each stream, we use a *stream ID*. These are unique across the lifetime of a connection, and they go in ascending order. Most ``H2Connection`` functions take a stream ID: they require you to actively tell the connection which one to use. In this case, as a simple server, we will never need to choose a stream ID ourselves: the client will always choose one for us. That means we'll always be able to get the one we need off the events that fire. Next, we send some *headers*. In HTTP/2, a response is made up of some set of headers, and optionally some data. The headers have to come first: if you're a client then you'll be sending *request* headers, but in our case these headers are our *response* headers. Mostly these aren't very exciting, but you'll notice once special header in there: ``:status``. This is a HTTP/2-specific header, and it's used to hold the HTTP status code that used to go at the top of a HTTP response. Here, we're saying the response is ``200 OK``, which is successful. To send headers in Hyper-h2, you use the :meth:`send_headers ` function. Next, we want to send the body data. To do that, we use the :meth:`send_data ` function. This also takes a stream ID. Note that the data is binary: Hyper-h2 does not work with unicode strings, so you *must* pass bytestrings to the ``H2Connection``. The one exception is headers: Hyper-h2 will automatically encode those into UTF-8. The last thing to note is that on our call to ``send_data``, we set ``end_stream`` to ``True``. This tells Hyper-h2 (and the remote peer) that we're done with sending data: the response is over. Because we know that ``hyper`` will have ended its side of the stream, when we end ours the stream will be totally done with. We're nearly ready to go with this: we just need to plumb this function in. Let's amend our ``handle`` function again: .. code-block:: python import h2.events import h2.config def handle(sock): config = h2.config.H2Configuration(client_side=False) conn = h2.connection.H2Connection(config=config) conn.initiate_connection() sock.sendall(conn.data_to_send()) while True: data = sock.recv(65535) if not data: break events = conn.receive_data(data) for event in events: if isinstance(event, h2.events.RequestReceived): send_response(conn, event) data_to_send = conn.data_to_send() if data_to_send: sock.sendall(data_to_send) The changes here are all at the end. Now, when we receive some events, we look through them for the ``RequestReceived`` event. If we find it, we make sure we send a response. Then, at the bottom of the loop we check whether we have any data to send, and if we do, we send it. Then, we repeat again. With these changes, your ``h2server.py`` file should look like this: .. code-block:: python import socket import h2.connection import h2.events import h2.config def send_response(conn, event): stream_id = event.stream_id conn.send_headers( stream_id=stream_id, headers=[ (':status', '200'), ('server', 'basic-h2-server/1.0') ], ) conn.send_data( stream_id=stream_id, data=b'it works!', end_stream=True ) def handle(sock): config = h2.config.H2Configuration(client_side=False) conn = h2.connection.H2Connection(config=config) conn.initiate_connection() sock.sendall(conn.data_to_send()) while True: data = sock.recv(65535) if not data: break events = conn.receive_data(data) for event in events: if isinstance(event, h2.events.RequestReceived): send_response(conn, event) data_to_send = conn.data_to_send() if data_to_send: sock.sendall(data_to_send) sock = socket.socket() sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) sock.bind(('0.0.0.0', 8080)) sock.listen(5) while True: handle(sock.accept()[0]) Alright. Let's run this, and then run our ``hyper`` command again. This time, nothing is printed from our server, and the ``hyper`` side prints ``it works!``. Success! Try running it a few more times, and we can see that not only does it work the first time, it works the other times too! We can speak HTTP/2! Let's add the final step: returning the JSON-encoded request headers. Step 5: Returning Headers ~~~~~~~~~~~~~~~~~~~~~~~~~ If we want to return the request headers in JSON, the first thing we have to do is find them. Handily, if you check the documentation for :class:`RequestReceived ` you'll find that this event carries, in addition to the stream ID, the request headers. This means we can make a really simple change to our ``send_response`` function to take those headers and encode them as a JSON object. Let's do that: .. code-block:: python import json def send_response(conn, event): stream_id = event.stream_id response_data = json.dumps(dict(event.headers)).encode('utf-8') conn.send_headers( stream_id=stream_id, headers=[ (':status', '200'), ('server', 'basic-h2-server/1.0'), ('content-length', str(len(response_data))), ('content-type', 'application/json'), ], ) conn.send_data( stream_id=stream_id, data=response_data, end_stream=True ) This is a really simple change, but it's all we need to do: a few extra headers and the JSON dump, but that's it. Section 6: Bringing It All Together ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This should be all we need! Let's take all the work we just did and throw that into our ``h2server.py`` file, which should now look like this: .. code-block:: python import json import socket import h2.connection import h2.events import h2.config def send_response(conn, event): stream_id = event.stream_id response_data = json.dumps(dict(event.headers)).encode('utf-8') conn.send_headers( stream_id=stream_id, headers=[ (':status', '200'), ('server', 'basic-h2-server/1.0'), ('content-length', str(len(response_data))), ('content-type', 'application/json'), ], ) conn.send_data( stream_id=stream_id, data=response_data, end_stream=True ) def handle(sock): config = h2.config.H2Configuration(client_side=False) conn = h2.connection.H2Connection(config=config) conn.initiate_connection() sock.sendall(conn.data_to_send()) while True: data = sock.recv(65535) if not data: break events = conn.receive_data(data) for event in events: if isinstance(event, h2.events.RequestReceived): send_response(conn, event) data_to_send = conn.data_to_send() if data_to_send: sock.sendall(data_to_send) sock = socket.socket() sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) sock.bind(('0.0.0.0', 8080)) sock.listen(5) while True: handle(sock.accept()[0]) Now, execute ``h2server.py`` and then point ``hyper`` at it again. You should see something like the following output from ``hyper``: .. code-block:: console $ hyper --h2 GET http://localhost:8080/ {":scheme": "http", ":authority": "localhost", ":method": "GET", ":path": "/"} Here you can see the HTTP/2 request 'special headers' that ``hyper`` sends. These are similar to the ``:status`` header we have to send on our response: they encode important parts of the HTTP request in a clearly-defined way. If you were writing a client stack using Hyper-h2, you'd need to make sure you were sending those headers. Congratulations! ~~~~~~~~~~~~~~~~ Congratulations! You've written your first HTTP/2 server! If you want to extend it, there are a few directions you could investigate: - We didn't handle a few events that we saw were being raised: you could add some methods to handle those appropriately. - Right now our server is single threaded, so it can only handle one client at a time. Consider rewriting this server to use threads, or writing this server again using your favourite asynchronous programming framework. If you plan to use threads, you should know that a ``H2Connection`` object is deliberately not thread-safe. As a possible design pattern, consider creating threads and passing the sockets returned by ``accept`` to those threads, and then letting those threads create their own ``H2Connection`` objects. - Take a look at some of our long-form code examples in :doc:`examples`. - Alternatively, try playing around with our examples in our repository's `examples directory`_. These examples are a bit more fully-featured, and can be reached from your web browser. Try adjusting what they do, or adding new features to them! - You may want to make this server reachable from your web browser. To do that, you'll need to add proper TLS support to your server. This can be tricky, and in many cases requires `PyOpenSSL`_ in addition to the other libraries you have installed. Check the `Eventlet example`_ to see what PyOpenSSL code is required to TLS-ify your server. .. _event loop: https://en.wikipedia.org/wiki/Event_loop .. _httpbin.org/get: https://httpbin.org/get .. _examples directory: https://github.com/python-hyper/hyper-h2/tree/master/examples .. _standard library's socket module: https://docs.python.org/3.5/library/socket.html .. _Application Layer Protocol Negotiation: https://en.wikipedia.org/wiki/Application-Layer_Protocol_Negotiation .. _get your certificate here: https://raw.githubusercontent.com/python-hyper/hyper-h2/master/examples/twisted/server.crt .. _get your private key here: https://raw.githubusercontent.com/python-hyper/hyper-h2/master/examples/twisted/server.key .. _PyOpenSSL: http://pyopenssl.readthedocs.org/ .. _Eventlet example: https://github.com/python-hyper/hyper-h2/blob/master/examples/eventlet/eventlet-server.py h2-3.1.1/docs/source/conf.py0000664000175000017500000002053013521033104016434 0ustar ubuntuubuntu00000000000000# -*- coding: utf-8 -*- # # hyper-h2 documentation build configuration file, created by # sphinx-quickstart on Thu Sep 17 10:06:02 2015. # # This file is execfile()d with the current directory set to its # containing dir. # # Note that not all possible configuration values are present in this # autogenerated file. # # All configuration values have a default; values that are commented out # serve to show the default. import sys import os # If extensions (or modules to document with autodoc) are in another directory, # add these directories to sys.path here. If the directory is relative to the # documentation root, use os.path.abspath to make it absolute, like shown here. sys.path.insert(0, os.path.abspath('../..')) # -- General configuration ------------------------------------------------ # If your documentation needs a minimal Sphinx version, state it here. #needs_sphinx = '1.0' # Add any Sphinx extension module names here, as strings. They can be # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom # ones. extensions = [ 'sphinx.ext.autodoc', 'sphinx.ext.intersphinx', 'sphinx.ext.viewcode', ] # Add any paths that contain templates here, relative to this directory. templates_path = ['_templates'] # The suffix of source filenames. source_suffix = '.rst' # The encoding of source files. #source_encoding = 'utf-8-sig' # The master toctree document. master_doc = 'index' # General information about the project. project = u'hyper-h2' copyright = u'2015, Cory Benfield' # The version info for the project you're documenting, acts as replacement for # |version| and |release|, also used in various other places throughout the # built documents. # # The short X.Y version. version = '3.1.1' # The full version, including alpha/beta/rc tags. release = '3.1.1' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. #language = None # There are two options for replacing |today|: either, you set today to some # non-false value, then it is used: #today = '' # Else, today_fmt is used as the format for a strftime call. #today_fmt = '%B %d, %Y' # List of patterns, relative to source directory, that match files and # directories to ignore when looking for source files. exclude_patterns = [] # The reST default role (used for this markup: `text`) to use for all # documents. #default_role = None # If true, '()' will be appended to :func: etc. cross-reference text. #add_function_parentheses = True # If true, the current module name will be prepended to all description # unit titles (such as .. function::). #add_module_names = True # If true, sectionauthor and moduleauthor directives will be shown in the # output. They are ignored by default. #show_authors = False # The name of the Pygments (syntax highlighting) style to use. pygments_style = 'sphinx' # A list of ignored prefixes for module index sorting. #modindex_common_prefix = [] # If true, keep warnings as "system message" paragraphs in the built documents. #keep_warnings = False # -- Options for HTML output ---------------------------------------------- # The theme to use for HTML and HTML Help pages. See the documentation for # a list of builtin themes. html_theme = 'default' # Theme options are theme-specific and customize the look and feel of a theme # further. For a list of options available for each theme, see the # documentation. #html_theme_options = {} # Add any paths that contain custom themes here, relative to this directory. #html_theme_path = [] # The name for this set of Sphinx documents. If None, it defaults to # " v documentation". #html_title = None # A shorter title for the navigation bar. Default is the same as html_title. #html_short_title = None # The name of an image file (relative to this directory) to place at the top # of the sidebar. #html_logo = None # The name of an image file (within the static path) to use as favicon of the # docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 # pixels large. #html_favicon = None # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, # so a file named "default.css" will overwrite the builtin "default.css". html_static_path = ['_static'] # Add any extra paths that contain custom files (such as robots.txt or # .htaccess) here, relative to this directory. These files are copied # directly to the root of the documentation. #html_extra_path = [] # If not '', a 'Last updated on:' timestamp is inserted at every page bottom, # using the given strftime format. #html_last_updated_fmt = '%b %d, %Y' # If true, SmartyPants will be used to convert quotes and dashes to # typographically correct entities. #html_use_smartypants = True # Custom sidebar templates, maps document names to template names. #html_sidebars = {} # Additional templates that should be rendered to pages, maps page names to # template names. #html_additional_pages = {} # If false, no module index is generated. #html_domain_indices = True # If false, no index is generated. #html_use_index = True # If true, the index is split into individual pages for each letter. #html_split_index = False # If true, links to the reST sources are added to the pages. #html_show_sourcelink = True # If true, "Created using Sphinx" is shown in the HTML footer. Default is True. #html_show_sphinx = True # If true, "(C) Copyright ..." is shown in the HTML footer. Default is True. #html_show_copyright = True # If true, an OpenSearch description file will be output, and all pages will # contain a tag referring to it. The value of this option must be the # base URL from which the finished HTML is served. #html_use_opensearch = '' # This is the file name suffix for HTML files (e.g. ".xhtml"). #html_file_suffix = None # Output file base name for HTML help builder. htmlhelp_basename = 'hyper-h2doc' # -- Options for LaTeX output --------------------------------------------- latex_elements = { # The paper size ('letterpaper' or 'a4paper'). #'papersize': 'letterpaper', # The font size ('10pt', '11pt' or '12pt'). #'pointsize': '10pt', # Additional stuff for the LaTeX preamble. #'preamble': '', } # Grouping the document tree into LaTeX files. List of tuples # (source start file, target name, title, # author, documentclass [howto, manual, or own class]). latex_documents = [ ('index', 'hyper-h2.tex', u'hyper-h2 Documentation', u'Cory Benfield', 'manual'), ] # The name of an image file (relative to this directory) to place at the top of # the title page. #latex_logo = None # For "manual" documents, if this is true, then toplevel headings are parts, # not chapters. #latex_use_parts = False # If true, show page references after internal links. #latex_show_pagerefs = False # If true, show URL addresses after external links. #latex_show_urls = False # Documents to append as an appendix to all manuals. #latex_appendices = [] # If false, no module index is generated. #latex_domain_indices = True # -- Options for manual page output --------------------------------------- # One entry per manual page. List of tuples # (source start file, name, description, authors, manual section). man_pages = [ ('index', 'hyper-h2', u'hyper-h2 Documentation', [u'Cory Benfield'], 1) ] # If true, show URL addresses after external links. #man_show_urls = False # -- Options for Texinfo output ------------------------------------------- # Grouping the document tree into Texinfo files. List of tuples # (source start file, target name, title, author, # dir menu entry, description, category) texinfo_documents = [ ('index', 'hyper-h2', u'hyper-h2 Documentation', u'Cory Benfield', 'hyper-h2', 'One line description of project.', 'Miscellaneous'), ] # Documents to append as an appendix to all manuals. #texinfo_appendices = [] # If false, no module index is generated. #texinfo_domain_indices = True # How to display URL addresses: 'footnote', 'no', or 'inline'. #texinfo_show_urls = 'footnote' # If true, do not generate a @detailmenu in the "Top" node's menu. #texinfo_no_detailmenu = False # Example configuration for intersphinx: refer to the Python standard library. intersphinx_mapping = { 'python': ('https://docs.python.org/3.5/', None), 'hpack': ('https://python-hyper.org/hpack/en/stable/', None), 'pyopenssl': ('https://pyopenssl.readthedocs.org/en/latest/', None), } h2-3.1.1/docs/source/contributors.rst0000664000175000017500000000007713421652727020451 0ustar ubuntuubuntu00000000000000Contributors ============ .. include:: ../../CONTRIBUTORS.rst h2-3.1.1/docs/source/curio-example.rst0000664000175000017500000000104013421652727020455 0ustar ubuntuubuntu00000000000000Curio Example Server ==================== This example is a basic HTTP/2 server written using `curio`_, David Beazley's example of how to build a concurrent networking framework using Python 3.5's new ``async``/``await`` syntax. This example is notable for demonstrating the correct use of HTTP/2 flow control with Hyper-h2. It is also a good example of the brand new syntax. .. literalinclude:: ../../examples/curio/curio-server.py :language: python :linenos: :encoding: utf-8 .. _curio: https://curio.readthedocs.org/en/latest/ h2-3.1.1/docs/source/eventlet-example.rst0000664000175000017500000000127013421652727021167 0ustar ubuntuubuntu00000000000000Eventlet Example Server ======================= This example is a basic HTTP/2 server written using the `eventlet`_ concurrent networking framework. This example is notable for demonstrating how to configure `PyOpenSSL`_, which `eventlet`_ uses for its TLS layer. In terms of HTTP/2 functionality, this example is very simple: it returns the request headers as a JSON document to the caller. It does not obey HTTP/2 flow control, which is a flaw, but it is otherwise functional. .. literalinclude:: ../../examples/eventlet/eventlet-server.py :language: python :linenos: :encoding: utf-8 .. _eventlet: http://eventlet.net/ .. _PyOpenSSL: https://pyopenssl.readthedocs.org/en/stable/ h2-3.1.1/docs/source/examples.rst0000664000175000017500000000102313421652727017522 0ustar ubuntuubuntu00000000000000Code Examples ============= This section of the documentation contains long-form code examples. These are intended as references for developers that would like to get an understanding of how Hyper-h2 fits in with various Python I/O frameworks. Example Servers --------------- .. toctree:: :maxdepth: 2 asyncio-example twisted-example eventlet-example curio-example tornado-example wsgi-example Example Clients --------------- .. toctree:: :maxdepth: 2 twisted-head-example twisted-post-example h2-3.1.1/docs/source/index.rst0000664000175000017500000000236413421652727017024 0ustar ubuntuubuntu00000000000000.. hyper-h2 documentation master file, created by sphinx-quickstart on Thu Sep 17 10:06:02 2015. You can adapt this file completely to your liking, but it should at least contain the root `toctree` directive. Hyper-h2: A pure-Python HTTP/2 protocol stack ============================================= Hyper-h2 is a HTTP/2 protocol stack, written entirely in Python. The goal of Hyper-h2 is to be a common HTTP/2 stack for the Python ecosystem, usable in all programs regardless of concurrency model or environment. To achieve this, Hyper-h2 is entirely self-contained: it does no I/O of any kind, leaving that up to a wrapper library to control. This ensures that it can seamlessly work in all kinds of environments, from single-threaded code to Twisted. Its goal is to be 100% compatible with RFC 7540, implementing a complete HTTP/2 protocol stack build on a set of finite state machines. Its secondary goals are to be fast, clear, and efficient. For usage examples, see :doc:`basic-usage` or consult the examples in the repository. Contents -------- .. toctree:: :maxdepth: 2 installation basic-usage negotiating-http2 examples advanced-usage low-level api testimonials release-process release-notes contributorsh2-3.1.1/docs/source/installation.rst0000664000175000017500000000072313421652727020413 0ustar ubuntuubuntu00000000000000Installation ============ Hyper-h2 is a pure-python project. This means installing it is extremely simple. To get the latest release from PyPI, simply run: .. code-block:: console $ pip install h2 Alternatively, feel free to download one of the release tarballs from `our GitHub page`_, extract it to your favourite directory, and then run .. code-block:: console $ python setup.py install .. _our GitHub page: https://github.com/python-hyper/hyper-h2 h2-3.1.1/docs/source/low-level.rst0000664000175000017500000001764213421652727017630 0ustar ubuntuubuntu00000000000000Low-Level Details ================= .. warning:: This section of the documentation covers low-level implementation details of hyper-h2. This is most likely to be of use to hyper-h2 developers and to other HTTP/2 implementers, though it could well be of general interest. Feel free to peruse it, but if you're looking for information about how to *use* hyper-h2 you should consider looking elsewhere. State Machines -------------- hyper-h2 is fundamentally built on top of a pair of interacting Finite State Machines. One of these FSMs manages per-connection state, and another manages per-stream state. Almost without exception (see :ref:`priority` for more details) every single frame is unconditionally translated into events for both state machines and those state machines are turned. The advantages of a system such as this is that the finite state machines can very densely encode the kinds of things that are allowed at any particular moment in a HTTP/2 connection. However, most importantly, almost all protocols are defined *in terms* of finite state machines: that is, protocol descriptions can be reduced to a number of states and inputs. That makes FSMs a very natural tool for implementing protocol stacks. Indeed, most protocol implementations that do not explicitly encode a finite state machine almost always *implicitly* encode a finite state machine, by using classes with a bunch of variables that amount to state-tracking variables, or by using the call-stack as an implicit state tracking mechanism. While these methods are not immediately problematic, they tend to lack *explicitness*, and can lead to subtle bugs of the form "protocol action X is incorrectly allowed in state Y". For these reasons, we have implemented two *explicit* finite state machines. These machines aim to encode most of the protocol-specific state, in particular regarding what frame is allowed at what time. This target goal is sometimes not achieved: in particular, as of this writing the *stream* FSM contains a number of other state variables that really ought to be rolled into the state machine itself in the form of new states, or in the form of a transformation of the FSM to use state *vectors* instead of state *scalars*. The following sections contain some implementers notes on these FSMs. Connection State Machine ~~~~~~~~~~~~~~~~~~~~~~~~ The "outer" state machine, the first one that is encountered when sending or receiving data, is the connection state machine. This state machine tracks whole-connection state. This state machine is primarily intended to forbid certain actions on the basis of whether the implementation is acting as a client or a server. For example, clients are not permitted to send ``PUSH_PROMISE`` frames: this state machine forbids that by refusing to define a valid transition from the ``CLIENT_OPEN`` state for the ``SEND_PUSH_PROMISE`` event. Otherwise, this particular state machine triggers no side-effects. It has a very coarse, high-level, functionality. A visual representation of this FSM is shown below: .. image:: _static/h2.connection.H2ConnectionStateMachine.dot.png :alt: A visual representation of the connection FSM. :target: _static/h2.connection.H2ConnectionStateMachine.dot.png .. _stream-state-machine: Stream State Machine ~~~~~~~~~~~~~~~~~~~~ Once the connection state machine has been spun, any frame that belongs to a stream is passed to the stream state machine for its given stream. Each stream has its own instance of the state machine, but all of them share the transition table: this is because the table itself is sufficiently large that having it be per-instance would be a ridiculous memory overhead. Unlike the connection state machine, the stream state machine is quite complex. This is because it frequently needs to encode some side-effects. The most common side-effect is emitting a ``RST_STREAM`` frame when an error is encountered: the need to do this means that far more transitions need to be encoded than for the connection state machine. Many of the side-effect functions in this state machine also raise :class:`ProtocolError ` exceptions. This is almost always done on the basis of an extra state variable, which is an annoying code smell: it should always be possible for the state machine itself to police these using explicit state management. A future refactor will hopefully address this problem by making these additional state variables part of the state definitions in the FSM, which will lead to an expansion of the number of states but a greater degree of simplicity in understanding and tracking what is going on in the state machine. The other action taken by the side-effect functions defined here is returning :ref:`events `. Most of these events are returned directly to the user, and reflect the specific state transition that has taken place, but some of the events are purely *internal*: they are used to signal to other parts of the hyper-h2 codebase what action has been taken. The major use of the internal events functionality at this time is for validating header blocks: there are different rules for request headers than there are for response headers, and different rules again for trailers. The internal events are used to determine *exactly what* kind of data the user is attempting to send, and using that information to do the correct kind of validation. This approach ensures that the final source of truth about what's happening at the protocol level lives inside the FSM, which is an extremely important design principle we want to continue to enshrine in hyper-h2. A visual representation of this FSM is shown below: .. image:: _static/h2.stream.H2StreamStateMachine.dot.png :alt: A visual representation of the stream FSM. :target: _static/h2.stream.H2StreamStateMachine.dot.png .. _priority: Priority ~~~~~~~~ In the :ref:`stream-state-machine` section we said that any frame that belongs to a stream is passed to the stream state machine. This turns out to be not quite true. Specifically, while ``PRIORITY`` frames are technically sent on a given stream (that is, `RFC 7540 Section 6.3`_ defines them as "always identifying a stream" and forbids the use of stream ID ``0`` for them), in practice they are almost completely exempt from the usual stream FSM behaviour. Specifically, the RFC has this to say: The ``PRIORITY`` frame can be sent on a stream in any state, though it cannot be sent between consecutive frames that comprise a single header block (Section 4.3). Given that the consecutive header block requirement is handled outside of the FSMs, this section of the RFC essentially means that there is *never* a situation where it is invalid to receive a ``PRIORITY`` frame. This means that including it in the stream FSM would require that we allow ``SEND_PRIORITY`` and ``RECV_PRIORITY`` in all states. This is not a totally onerous task: however, another key note is that hyper-h2 uses the *absence* of a stream state machine to flag a closed stream. This is primarily for memory conservation reasons: if we needed to keep around an FSM for every stream we've ever seen, that would cause long-lived HTTP/2 connections to consume increasingly large amounts of memory. On top of this, it would require us to create a stream FSM each time we received a ``PRIORITY`` frame for a given stream, giving a malicious peer an easy route to force a hyper-h2 user to allocate nearly unbounded amounts of memory. For this reason, hyper-h2 circumvents the stream FSM entirely for ``PRIORITY`` frames. Instead, these frames are treated as being connection-level frames that *just happen* to identify a specific stream. They do not bring streams into being, or in any sense interact with hyper-h2's view of streams. Their stream details are treated as strictly metadata that hyper-h2 is not interested in beyond being able to parse it out. .. _RFC 7540 Section 6.3: https://tools.ietf.org/html/rfc7540#section-6.3 h2-3.1.1/docs/source/negotiating-http2.rst0000664000175000017500000001616213421652727021265 0ustar ubuntuubuntu00000000000000Negotiating HTTP/2 ================== `RFC 7540`_ specifies three methods of negotiating HTTP/2 connections. This document outlines how to use Hyper-h2 with each one. .. _starting-alpn: HTTPS URLs (ALPN) ------------------------- Starting HTTP/2 for HTTPS URLs is outlined in `RFC 7540 Section 3.3`_. In this case, the client and server use a TLS extension to negotiate HTTP/2: `ALPN`_. How to use ALPN is currently not covered in this document: please consult the documentation for either the :mod:`ssl module ` in the standard library, or the :mod:`PyOpenSSL ` third-party modules, for more on this topic. This method is the simplest to use once the TLS connection is established. To use it with Hyper-h2, after you've established the connection and confirmed that HTTP/2 has been negotiated with `ALPN`_, create a :class:`H2Connection ` object and call :meth:`H2Connection.initiate_connection `. This will ensure that the appropriate preamble data is placed in the data buffer. You should then immediately send the data returned by :meth:`H2Connection.data_to_send ` on your TLS connection. At this point, you're free to use all the HTTP/2 functionality provided by Hyper-h2. .. note:: Although Hyper-h2 is not concerned with negotiating protocol versions, it is important to note that support for `ALPN`_ is not available in the standard library of Python versions < 2.7.9. As a consequence, clients may encounter various errors due to protocol versions mismatch. Server Setup Example ~~~~~~~~~~~~~~~~~~~~ This example uses the APIs as defined in Python 3.5. If you are using an older version of Python you may not have access to the APIs used here. As noted above, please consult the documentation for the :mod:`ssl module ` to confirm. .. literalinclude:: ../../examples/fragments/server_https_setup_fragment.py :language: python :linenos: :encoding: utf-8 Client Setup Example ~~~~~~~~~~~~~~~~~~~~ The client example is very similar to the server example above. The :class:`SSLContext ` object requires some minor changes, as does the :class:`H2Connection `, but the bulk of the code is the same. .. literalinclude:: ../../examples/fragments/client_https_setup_fragment.py :language: python :linenos: :encoding: utf-8 .. _starting-upgrade: HTTP URLs (Upgrade) ------------------- Starting HTTP/2 for HTTP URLs is outlined in `RFC 7540 Section 3.2`_. In this case, the client and server use the HTTP Upgrade mechanism originally described in `RFC 7230 Section 6.7`_. The client sends its initial HTTP/1.1 request with two extra headers. The first is ``Upgrade: h2c``, which requests upgrade to cleartext HTTP/2. The second is a ``HTTP2-Settings`` header, which contains a specially formatted string that encodes a HTTP/2 Settings frame. To do this with Hyper-h2 you have two slightly different flows: one for clients, one for servers. Clients ~~~~~~~ For a client, when sending the first request you should manually add your ``Upgrade`` header. You should then create a :class:`H2Connection ` object and call :meth:`H2Connection.initiate_upgrade_connection ` with no arguments. This method will return a bytestring to use as the value of your ``HTTP2-Settings`` header. If the server returns a ``101`` status code, it has accepted the upgrade, and you should immediately send the data returned by :meth:`H2Connection.data_to_send `. Now you should consume the entire ``101`` header block. All data after the ``101`` header block is HTTP/2 data that should be fed directly to :meth:`H2Connection.receive_data ` and handled as normal with Hyper-h2. If the server does not return a ``101`` status code then it is not upgrading. Continue with HTTP/1.1 as normal: you may throw away your :class:`H2Connection ` object, as it is of no further use. The server will respond to your original request in HTTP/2. Please pay attention to the events received from Hyper-h2, as they will define the server's response. Client Example ^^^^^^^^^^^^^^ The code below demonstrates how to handle a plaintext upgrade from the perspective of the client. For the purposes of keeping the example code as simple and generic as possible it uses the synchronous socket API that comes with the Python standard library: if you want to use asynchronous I/O, you will need to translate this code to the appropriate idiom. .. literalinclude:: ../../examples/fragments/client_upgrade_fragment.py :language: python :linenos: :encoding: utf-8 Servers ~~~~~~~ If the first request you receive on a connection from the client contains an ``Upgrade`` header with the ``h2c`` token in it, and you're willing to upgrade, you should create a :class:`H2Connection ` object and call :meth:`H2Connection.initiate_upgrade_connection ` with the value of the ``HTTP2-Settings`` header (as a bytestring) as the only argument. Then, you should send back a ``101`` response that contains ``h2c`` in the ``Upgrade`` header. That response will inform the client that you're switching to HTTP/2. Then, you should immediately send the data that is returned to you by :meth:`H2Connection.data_to_send ` on the connection: this is a necessary part of the HTTP/2 upgrade process. At this point, you may now respond to the original HTTP/1.1 request in HTTP/2 by calling the appropriate methods on the :class:`H2Connection ` object. No further HTTP/1.1 may be sent on this connection: from this point onward, all data sent by you and the client will be HTTP/2 data. Server Example ^^^^^^^^^^^^^^ The code below demonstrates how to handle a plaintext upgrade from the perspective of the server. For the purposes of keeping the example code as simple and generic as possible it uses the synchronous socket API that comes with the Python standard library: if you want to use asynchronous I/O, you will need to translate this code to the appropriate idiom. .. literalinclude:: ../../examples/fragments/server_upgrade_fragment.py :language: python :linenos: :encoding: utf-8 Prior Knowledge --------------- It's possible that you as a client know that a particular server supports HTTP/2, and that you do not need to perform any of the negotiations described above. In that case, you may follow the steps in :ref:`starting-alpn`, ignoring all references to ALPN: there's no need to perform the upgrade dance described in :ref:`starting-upgrade`. .. _RFC 7540: https://tools.ietf.org/html/rfc7540 .. _RFC 7540 Section 3.2: https://tools.ietf.org/html/rfc7540#section-3.2 .. _RFC 7540 Section 3.3: https://tools.ietf.org/html/rfc7540#section-3.3 .. _ALPN: https://en.wikipedia.org/wiki/Application-Layer_Protocol_Negotiation .. _RFC 7230 Section 6.7: https://tools.ietf.org/html/rfc7230#section-6.7 h2-3.1.1/docs/source/release-notes.rst0000664000175000017500000001165013421652727020461 0ustar ubuntuubuntu00000000000000Release Notes ============= This document contains release notes for Hyper-h2. In addition to the :ref:`detailed-release-notes` found at the bottom of this document, this document also includes a high-level prose overview of each major release after 1.0.0. High Level Notes ---------------- 3.0.0: 24 March 2017 ~~~~~~~~~~~~~~~~~~~~ The Hyper-h2 team and the Hyper project are delighted to announce the release of Hyper-h2 version 3.0.0! Unlike the really notable 2.0.0 release, this release is proportionally quite small: however, it has the effect of removing a lot of cruft and complexity that has built up in the codebase over the lifetime of the v2 release series. This release was motivated primarily by discovering that applications that attempted to use both HTTP/1.1 and HTTP/2 using hyper-h2 would encounter problems with cookies, because hyper-h2 did not join together cookie headers as required by RFC 7540. Normally adding such behaviour would be a non-breaking change, but we previously had no flags to prevent normalization of received HTTP headers. Because it makes no sense for the cookie to be split *by default*, we needed to add a controlling flag and set it to true. The breaking nature of this change is very subtle, and it's possible most users would never notice, but nevertheless it *is* a breaking change and we need to treat it as such. Happily, we can take this opportunity to finalise a bunch of deprecations we'd made over the past year. The v2 release series was long-lived and successful, having had a series of releases across the past year-and-a-bit, and the Hyper team are very proud of it. However, it's time to open a new chapter, and remove the deprecated code. The past year has been enormously productive for the Hyper team. A total of 30 v2 releases were made, an enormous amount of work. A good number of people have made their first contribution in this time, more than I can thank reasonably without taking up an unreasonable amount of space in this document, so instead I invite you to check out `our awesome contributor list`_. We're looking forward to the next chapter in hyper-h2: it's been a fun ride so far, and we hope even more of you come along and join in the fun over the next year! .. _our awesome contributor list: https://github.com/python-hyper/hyper-h2/graphs/contributors 2.0.0: 25 January 2016 ~~~~~~~~~~~~~~~~~~~~~~ The Hyper-h2 team and the Hyper project are delighted to announce the release of Hyper-h2 version 2.0.0! This is an enormous release that contains a gigantic collection of new features and fixes, with the goal of making it easier than ever to use Hyper-h2 to build a compliant HTTP/2 server or client. An enormous chunk of this work has been focused on tighter enforcement of restrictions in RFC 7540, ensuring that we correctly police the actions of remote peers, and error appropriately when those peers violate the specification. Several of these constitute breaking changes, because data that was previously received and handled without obvious error now raises ``ProtocolError`` exceptions and causes the connection to be terminated. Additionally, the public API was cleaned up and had several helper methods that had been inavertently exposed removed from the public API. The team wants to stress that while Hyper-h2 follows semantic versioning, the guarantees of semver apply only to the public API as documented in :doc:`api`. Reducing the surface area of these APIs makes it easier for us to continue to ensure that the guarantees of semver are respected on our public API. We also attempted to clear up some of the warts that had appeared in the API, and add features that are helpful for implementing HTTP/2 endpoints. For example, the :class:`H2Connection ` object now exposes a method for generating the next stream ID that your client or server can use to initiate a connection (:meth:`get_next_available_stream_id `). We also removed some needless return values that were guaranteed to return empty lists, which were an attempt to make a forward-looking guarantee that was entirely unneeded. Altogether, this has been an extremely productive period for Hyper-h2, and a lot of great work has been done by the community. To that end, we'd also like to extend a great thankyou to those contributors who made their first contribution to the project between release 1.0.0 and 2.0.0. Many thanks to: `Thomas Kriechbaumer`_, `Alex Chan`_, `Maximilian Hils`_, and `Glyph`_. For a full historical list of contributors, see :doc:`contributors`. We're looking forward to the next few months of Python HTTP/2 work, and hoping that you'll find lots of excellent HTTP/2 applications to build with Hyper-h2! .. _Thomas Kriechbaumer: https://github.com/Kriechi .. _Alex Chan: https://github.com/alexwlchan .. _Maximilian Hils: https://github.com/mhils .. _Glyph: https://github.com/glyph .. _detailed-release-notes: .. include:: ../../HISTORY.rst h2-3.1.1/docs/source/release-process.rst0000664000175000017500000000447613421652727021017 0ustar ubuntuubuntu00000000000000Release Process =============== Because of Hyper-h2's place at the bottom of the dependency tree, it is extremely important that the project maintains a diligent release schedule. This document outlines our process for managing releases. Versioning ---------- Hyper-h2 follows `semantic versioning`_ of its public API when it comes to numbering releases. The public API of Hyper-h2 is strictly limited to the entities listed in the :doc:`api` documentation: anything not mentioned in that document is not considered part of the public API and is not covered by the versioning guarantees given by semantic versioning. Maintenance ----------- Hyper-h2 has the notion of a "release series", given by a major and minor version number: for example, there is the 2.1 release series. When each minor release is made and a release series is born, a branch is made off the release tag: for example, for the 2.1 release series, the 2.1.X branch. All changes merged into the master branch will be evaluated for whether they can be considered 'bugfixes' only (that is, they do not affect the public API). If they can, they will also be cherry-picked back to all active maintenance branches that require the bugfix. If the bugfix is not necessary, because the branch in question is unaffected by that bug, the bugfix will not be backported. Supported Release Series' ------------------------- The developers of Hyper-h2 commit to supporting the following release series: - The most recent, as identified by the first two numbers in the highest version currently released. - The immediately prior release series. The only exception to this policy is that no release series earlier than the 2.1 series will be supported. In this context, "supported" means that they will continue to receive bugfix releases. For releases other than the ones identified above, no support is guaranteed. The developers may *choose* to support such a release series, but they do not promise to. The exception here is for security vulnerabilities. If a security vulnerability is identified in an out-of-support release series, the developers will do their best to patch it and issue an emergency release. For more information, see `our security documentation`_. .. _semantic versioning: http://semver.org/ .. _our security documentation: http://python-hyper.org/en/latest/security.html h2-3.1.1/docs/source/testimonials.rst0000664000175000017500000000072513421652727020427 0ustar ubuntuubuntu00000000000000Testimonials ============ Glyph Lefkowitz ~~~~~~~~~~~~~~~ Frankly, Hyper-h2 is almost SURREAL in how well-factored and decoupled the implementation is from I/O. If libraries in the Python ecosystem looked like this generally, Twisted would be a much better platform than it is. (Frankly, most of Twisted's _own_ protocol implementations should aspire to such cleanliness.) (`Source `_) h2-3.1.1/docs/source/tornado-example.rst0000664000175000017500000000066713421652727021020 0ustar ubuntuubuntu00000000000000Tornado Example Server ====================== This example is a basic HTTP/2 server written using the `Tornado`_ asynchronous networking library. The server returns the request headers as a JSON document to the caller, just like the example from the :doc:`basic-usage` document. .. literalinclude:: ../../examples/tornado/tornado-server.py :language: python :linenos: :encoding: utf-8 .. _Tornado: http://www.tornadoweb.org/ h2-3.1.1/docs/source/twisted-example.rst0000664000175000017500000000115413421652727021025 0ustar ubuntuubuntu00000000000000Twisted Example Server ====================== This example is a basic HTTP/2 server written for the `Twisted`_ asynchronous networking framework. This is a relatively fleshed out example, and in particular it makes sure to obey HTTP/2 flow control rules. This server differs from some of the other example servers by serving files, rather than simply sending JSON responses. This makes the example lengthier, but also brings it closer to a real-world use-case. .. literalinclude:: ../../examples/twisted/twisted-server.py :language: python :linenos: :encoding: utf-8 .. _Twisted: https://twistedmatrix.com/h2-3.1.1/docs/source/twisted-head-example.rst0000664000175000017500000000103713521033071021706 0ustar ubuntuubuntu00000000000000Twisted Example Client: Head Requests ===================================== This example is a basic HTTP/2 client written for the `Twisted`_ asynchronous networking framework. This client is fairly simple: it makes a hard-coded HEAD request to nghttp2.org/httpbin/ and prints out the response data. Its purpose is to demonstrate how to write a very basic HTTP/2 client implementation. .. literalinclude:: ../../examples/twisted/head_request.py :language: python :linenos: :encoding: utf-8 .. _Twisted: https://twistedmatrix.com/ h2-3.1.1/docs/source/twisted-post-example.rst0000664000175000017500000000117413521033071021774 0ustar ubuntuubuntu00000000000000Twisted Example Client: Post Requests ===================================== This example is a basic HTTP/2 client written for the `Twisted`_ asynchronous networking framework. This client is fairly simple: it makes a hard-coded POST request to nghttp2.org/httpbin/post and prints out the response data, sending a file that is provided on the command line or the script itself. Its purpose is to demonstrate how to write a HTTP/2 client implementation that handles flow control. .. literalinclude:: ../../examples/twisted/post_request.py :language: python :linenos: :encoding: utf-8 .. _Twisted: https://twistedmatrix.com/ h2-3.1.1/docs/source/wsgi-example.rst0000664000175000017500000000145613421652727020320 0ustar ubuntuubuntu00000000000000Example HTTP/2-only WSGI Server =============================== This example is a more complex HTTP/2 server that acts as a WSGI server, passing data to an arbitrary WSGI application. This example is written using `asyncio`_. The server supports most of PEP-3333, and so could in principle be used as a production WSGI server: however, that's *not recommended* as certain shortcuts have been taken to ensure ease of implementation and understanding. The main advantages of this example are: 1. It properly demonstrates HTTP/2 flow control management. 2. It demonstrates how to plug hyper-h2 into a larger, more complex application. .. literalinclude:: ../../examples/asyncio/wsgi-server.py :language: python :linenos: :encoding: utf-8 .. _asyncio: https://docs.python.org/3/library/asyncio.html h2-3.1.1/examples/0000775000175000017500000000000013521033126014527 5ustar ubuntuubuntu00000000000000h2-3.1.1/examples/asyncio/0000775000175000017500000000000013521033126016174 5ustar ubuntuubuntu00000000000000h2-3.1.1/examples/asyncio/asyncio-server.py0000664000175000017500000001613513521033071021524 0ustar ubuntuubuntu00000000000000# -*- coding: utf-8 -*- """ asyncio-server.py ~~~~~~~~~~~~~~~~~ A fully-functional HTTP/2 server using asyncio. Requires Python 3.5+. This example demonstrates handling requests with bodies, as well as handling those without. In particular, it demonstrates the fact that DataReceived may be called multiple times, and that applications must handle that possibility. """ import asyncio import io import json import ssl import collections from typing import List, Tuple from h2.config import H2Configuration from h2.connection import H2Connection from h2.events import ( ConnectionTerminated, DataReceived, RemoteSettingsChanged, RequestReceived, StreamEnded, StreamReset, WindowUpdated ) from h2.errors import ErrorCodes from h2.exceptions import ProtocolError, StreamClosedError from h2.settings import SettingCodes RequestData = collections.namedtuple('RequestData', ['headers', 'data']) class H2Protocol(asyncio.Protocol): def __init__(self): config = H2Configuration(client_side=False, header_encoding='utf-8') self.conn = H2Connection(config=config) self.transport = None self.stream_data = {} self.flow_control_futures = {} def connection_made(self, transport: asyncio.Transport): self.transport = transport self.conn.initiate_connection() self.transport.write(self.conn.data_to_send()) def connection_lost(self, exc): for future in self.flow_control_futures.values(): future.cancel() self.flow_control_futures = {} def data_received(self, data: bytes): try: events = self.conn.receive_data(data) except ProtocolError as e: self.transport.write(self.conn.data_to_send()) self.transport.close() else: self.transport.write(self.conn.data_to_send()) for event in events: if isinstance(event, RequestReceived): self.request_received(event.headers, event.stream_id) elif isinstance(event, DataReceived): self.receive_data(event.data, event.stream_id) elif isinstance(event, StreamEnded): self.stream_complete(event.stream_id) elif isinstance(event, ConnectionTerminated): self.transport.close() elif isinstance(event, StreamReset): self.stream_reset(event.stream_id) elif isinstance(event, WindowUpdated): self.window_updated(event.stream_id, event.delta) elif isinstance(event, RemoteSettingsChanged): if SettingCodes.INITIAL_WINDOW_SIZE in event.changed_settings: self.window_updated(None, 0) self.transport.write(self.conn.data_to_send()) def request_received(self, headers: List[Tuple[str, str]], stream_id: int): headers = collections.OrderedDict(headers) method = headers[':method'] # Store off the request data. request_data = RequestData(headers, io.BytesIO()) self.stream_data[stream_id] = request_data def stream_complete(self, stream_id: int): """ When a stream is complete, we can send our response. """ try: request_data = self.stream_data[stream_id] except KeyError: # Just return, we probably 405'd this already return headers = request_data.headers body = request_data.data.getvalue().decode('utf-8') data = json.dumps( {"headers": headers, "body": body}, indent=4 ).encode("utf8") response_headers = ( (':status', '200'), ('content-type', 'application/json'), ('content-length', str(len(data))), ('server', 'asyncio-h2'), ) self.conn.send_headers(stream_id, response_headers) asyncio.ensure_future(self.send_data(data, stream_id)) def receive_data(self, data: bytes, stream_id: int): """ We've received some data on a stream. If that stream is one we're expecting data on, save it off. Otherwise, reset the stream. """ try: stream_data = self.stream_data[stream_id] except KeyError: self.conn.reset_stream( stream_id, error_code=ErrorCodes.PROTOCOL_ERROR ) else: stream_data.data.write(data) def stream_reset(self, stream_id): """ A stream reset was sent. Stop sending data. """ if stream_id in self.flow_control_futures: future = self.flow_control_futures.pop(stream_id) future.cancel() async def send_data(self, data, stream_id): """ Send data according to the flow control rules. """ while data: while self.conn.local_flow_control_window(stream_id) < 1: try: await self.wait_for_flow_control(stream_id) except asyncio.CancelledError: return chunk_size = min( self.conn.local_flow_control_window(stream_id), len(data), self.conn.max_outbound_frame_size, ) try: self.conn.send_data( stream_id, data[:chunk_size], end_stream=(chunk_size == len(data)) ) except (StreamClosedError, ProtocolError): # The stream got closed and we didn't get told. We're done # here. break self.transport.write(self.conn.data_to_send()) data = data[chunk_size:] async def wait_for_flow_control(self, stream_id): """ Waits for a Future that fires when the flow control window is opened. """ f = asyncio.Future() self.flow_control_futures[stream_id] = f await f def window_updated(self, stream_id, delta): """ A window update frame was received. Unblock some number of flow control Futures. """ if stream_id and stream_id in self.flow_control_futures: f = self.flow_control_futures.pop(stream_id) f.set_result(delta) elif not stream_id: for f in self.flow_control_futures.values(): f.set_result(delta) self.flow_control_futures = {} ssl_context = ssl.create_default_context(ssl.Purpose.CLIENT_AUTH) ssl_context.options |= ( ssl.OP_NO_TLSv1 | ssl.OP_NO_TLSv1_1 | ssl.OP_NO_COMPRESSION ) ssl_context.load_cert_chain(certfile="cert.crt", keyfile="cert.key") ssl_context.set_alpn_protocols(["h2"]) loop = asyncio.get_event_loop() # Each client connection will create a new protocol instance coro = loop.create_server(H2Protocol, '127.0.0.1', 8443, ssl=ssl_context) server = loop.run_until_complete(coro) # Serve requests until Ctrl+C is pressed print('Serving on {}'.format(server.sockets[0].getsockname())) try: loop.run_forever() except KeyboardInterrupt: pass # Close the server server.close() loop.run_until_complete(server.wait_closed()) loop.close() h2-3.1.1/examples/asyncio/cert.crt0000664000175000017500000000240113421652727017655 0ustar ubuntuubuntu00000000000000-----BEGIN CERTIFICATE----- MIIDhTCCAm2gAwIBAgIJAOrxh0dOYJLdMA0GCSqGSIb3DQEBCwUAMFkxCzAJBgNV BAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBX aWRnaXRzIFB0eSBMdGQxEjAQBgNVBAMMCWxvY2FsaG9zdDAeFw0xNTA5MTkxNDE2 NDRaFw0xNTEwMTkxNDE2NDRaMFkxCzAJBgNVBAYTAkFVMRMwEQYDVQQIDApTb21l LVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBXaWRnaXRzIFB0eSBMdGQxEjAQBgNV BAMMCWxvY2FsaG9zdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMqt A1iu8EN00FU0eBcBGlLVmNEgV7Jkbukra+kwS8j/U2y50QPGJc/FiIVDfuBqk5dL ACTNc6A/FQcXvWmOc5ixmC3QKKasMpuofqKz0V9C6irZdYXZ9rcsW0gHQIr989yd R+N1VbIlEVW/T9FJL3B2UD9GVIkUELzm47CSOWZvAxQUlsx8CUNuUCWqyZJoqTFN j0LeJDOWGCsug1Pkj0Q1x+jMVL6l6Zf6vMkLNOMsOsWsxUk+0L3tl/OzcTgUOCsw UzY59RIi6Rudrp0oaU8NuHr91yiSqPbKFlX10M9KwEEdnIpcxhND3dacrDycj3ux eWlqKync2vOFUkhwiaMCAwEAAaNQME4wHQYDVR0OBBYEFA0PN+PGoofZ+QIys2Jy 1Zz94vBOMB8GA1UdIwQYMBaAFA0PN+PGoofZ+QIys2Jy1Zz94vBOMAwGA1UdEwQF MAMBAf8wDQYJKoZIhvcNAQELBQADggEBAEplethBoPpcP3EbR5Rz6snDDIcbtAJu Ngd0YZppGT+P0DYnPJva4vRG3bb84ZMSuppz5j67qD6DdWte8UXhK8BzWiHzwmQE QmbKyzzTMKQgTNFntpx5cgsSvTtrHpNYoMHzHOmyAOboNeM0DWiRXsYLkWTitLTN qbOpstwPubExbT9lPjLclntShT/lCupt+zsbnrR9YiqlYFY/fDzfAybZhrD5GMBY XdMPItwAc/sWvH31yztarjkLmld76AGCcO5r8cSR/cX98SicyfjOBbSco8GkjYNY 582gTPkKGYpStuN7GNT5tZmxvMq935HRa2XZvlAIe8ufp8EHVoYiF3c= -----END CERTIFICATE----- h2-3.1.1/examples/asyncio/cert.key0000664000175000017500000000321713421652727017663 0ustar ubuntuubuntu00000000000000-----BEGIN RSA PRIVATE KEY----- MIIEpAIBAAKCAQEAyq0DWK7wQ3TQVTR4FwEaUtWY0SBXsmRu6Str6TBLyP9TbLnR A8Ylz8WIhUN+4GqTl0sAJM1zoD8VBxe9aY5zmLGYLdAopqwym6h+orPRX0LqKtl1 hdn2tyxbSAdAiv3z3J1H43VVsiURVb9P0UkvcHZQP0ZUiRQQvObjsJI5Zm8DFBSW zHwJQ25QJarJkmipMU2PQt4kM5YYKy6DU+SPRDXH6MxUvqXpl/q8yQs04yw6xazF ST7Qve2X87NxOBQ4KzBTNjn1EiLpG52unShpTw24ev3XKJKo9soWVfXQz0rAQR2c ilzGE0Pd1pysPJyPe7F5aWorKdza84VSSHCJowIDAQABAoIBACp+nh4BB/VMz8Wd q7Q/EfLeQB1Q57JKpoqTBRwueSVai3ZXe4CMEi9/HkG6xiZtkiZ9njkZLq4hq9oB 2z//kzMnwV2RsIRJxI6ohGy+wR51HD4BvEdlTPpY/Yabpqe92VyfSYxidKZWaU0O QMED1EODOw4ZQ+4928iPrJu//PMB4e7TFao0b9Fk/XLWtu5/tQZz9jsrlTi1zthh 7n+oaGNhfTeIJJL4jrhTrKW1CLHXATtr9SJlfZ3wbMxQVeyj2wUlP1V0M6kBuhNj tbGbMpixD5iCNJ49Cm2PHg+wBOfS3ADGIpi3PcGw5mb8nB3N9eGBRPhLShAlq5Hi Lv4tyykCgYEA8u3b3xJ04pxWYN25ou/Sc8xzgDCK4XvDNdHVTuZDjLVA+VTVPzql lw7VvJArsx47MSPvsaX/+4hQXYtfnR7yJpx6QagvQ+z4ludnIZYrQwdUmb9pFL1s 8UNj+3j9QFRPenIiIQ8qxxNIQ9w2HsVQ8scvc9CjYop/YYAPaQyHaL8CgYEA1ZSz CR4NcpfgRSILdhb1dLcyw5Qus1VOSAx3DYkhDkMiB8XZwgMdJjwehJo9yaqRCLE8 Sw5znMnkfoZpu7+skrjK0FqmMpXMH9gIszHvFG8wSw/6+2HIWS19/wOu8dh95LuC 0zurMk8rFqxgWMWF20afhgYrUz42cvUTo10FVB0CgYEAt7mW6W3PArfUSCxIwmb4 VmXREKkl0ATHDYQl/Cb//YHzot467TgQll883QB4XF5HzBFurX9rSzO7/BN1e6I0 52i+ubtWC9xD4fUetXMaQvZfUGxIL8xXgVxDWKQXfLiG54c8Mp6C7s6xf8kjEUCP yR1F0SSA/Pzb+8RbY0p7eocCgYA+1rs+SXtHZev0KyoYGnUpW+Uxqd17ofOgOxqj /t6c5Z+TjeCdtnDTGQkZlo/rT6XQWuUUaDIXxUbW+xEMzj4mBPyXBLS1WWFvVQ5q OpzO9E/PJeqAH6rkof/aEelc+oc/zvOU1o9uA+D3kMvgEm1psIOq2RHSMhGvDPA0 NmAk+QKBgQCwd1681GagdIYSZUCBecnLtevXmIsJyDW2yR1NNcIe/ukcVQREMDvy 5DDkhnGDgnV1D5gYcXb34g9vYvbfTnBMl/JXmMAAG1kIS+3pvHyN6f1poVe3yJV1 yHVuvymnJxKnyaV0L3ntepVvV0vVNIkA3oauoUTLto6txBI+b/ImDA== -----END RSA PRIVATE KEY----- h2-3.1.1/examples/asyncio/wsgi-server.py0000664000175000017500000007472513521033071021041 0ustar ubuntuubuntu00000000000000# -*- coding: utf-8 -*- """ asyncio-server.py ~~~~~~~~~~~~~~~~~ A fully-functional WSGI server, written using hyper-h2. Requires asyncio. To test it, try installing httpbin from pip (``pip install httpbin``) and then running the server (``python asyncio-server.py httpbin:app``). This server does not support HTTP/1.1: it is a HTTP/2-only WSGI server. The purpose of this code is to demonstrate how to integrate hyper-h2 into a more complex application, and to demonstrate several principles of concurrent programming. The architecture looks like this: +---------------------------------+ | 1x HTTP/2 Server Thread | | (running asyncio) | +---------------------------------+ +---------------------------------+ | N WSGI Application Threads | | (no asyncio) | +---------------------------------+ Essentially, we spin up an asyncio-based event loop in the main thread. This launches one HTTP/2 Protocol instance for each inbound connection, all of which will read and write data from within the main thread in an asynchronous manner. When each HTTP request comes in, the server will build the WSGI environment dictionary and create a ``Stream`` object. This object will hold the relevant state for the request/response pair and will act as the WSGI side of the logic. That object will then be passed to a background thread pool, and when a worker is available the WSGI logic will begin to be executed. This model ensures that the asyncio web server itself is never blocked by the WSGI application. The WSGI application and the HTTP/2 server communicate via an asyncio queue, together with locks and threading events. The locks themselves are implicit in asyncio's "call_soon_threadsafe", which allows for a background thread to register an action with the main asyncio thread. When the asyncio thread eventually takes the action in question it sets as threading event, signaling to the background thread that it is free to continue its work. To make the WSGI application work with flow control, there is a very important invariant that must be observed. Any WSGI action that would cause data to be emitted to the network MUST be accompanied by a threading Event that is not set until that data has been written to the transport. This ensures that the WSGI application *blocks* until the data is actually sent. The reason we require this invariant is that the HTTP/2 server may choose to re-order some data chunks for flow control reasons: that is, the application for stream X may have actually written its data first, but the server may elect to send the data for stream Y first. This means that it's vital that there not be *two* writes for stream X active at any one point or they may get reordered, which would be particularly terrible. Thus, the server must cooperate to ensure that each threading event only fires when the *complete* data for that event has been written to the asyncio transport. Any earlier will cause untold craziness. """ import asyncio import importlib import queue import ssl import sys import threading from h2.config import H2Configuration from h2.connection import H2Connection from h2.events import ( DataReceived, RequestReceived, WindowUpdated, StreamEnded, StreamReset ) # Used to signal that a request has completed. # # This is a convenient way to do "in-band" signaling of stream completion # without doing anything so heavyweight as using a class. Essentially, we can # test identity against this empty object. In fact, this is so convenient that # we use this object for all streams, for data in both directions: in and out. END_DATA_SENTINEL = object() # The WSGI callable. Stored here so that the protocol instances can get hold # of the data. APPLICATION = None class H2Protocol(asyncio.Protocol): def __init__(self): config = H2Configuration(client_side=False, header_encoding='utf-8') # Our server-side state machine. self.conn = H2Connection(config=config) # The backing transport. self.transport = None # A dictionary of ``Stream`` objects, keyed by their stream ID. This # makes it easy to route data to the correct WSGI application instance. self.streams = {} # A queue of data emitted by WSGI applications that has not yet been # sent. Each stream may only have one chunk of data in either this # queue or the flow_controlled_data dictionary at any one time. self._stream_data = asyncio.Queue() # Data that has been pulled off the queue that is for a stream blocked # behind flow control limitations. This is used to avoid spinning on # _stream_data queue when a stream cannot have its data sent. Data that # cannot be sent on the connection when it is popped off the queue gets # placed here until the stream flow control window opens up again. self._flow_controlled_data = {} # A reference to the loop in which this protocol runs. This is needed # to synchronise up with background threads. self._loop = asyncio.get_event_loop() # Any streams that have been remotely reset. We keep track of these to # ensure that we don't emit data from a WSGI application whose stream # has been cancelled. self._reset_streams = set() # Keep track of the loop sending task so we can kill it when the # connection goes away. self._send_loop_task = None def connection_made(self, transport): """ The connection has been made. Here we need to save off our transport, do basic HTTP/2 connection setup, and then start our data writing coroutine. """ self.transport = transport self.conn.initiate_connection() self.transport.write(self.conn.data_to_send()) self._send_loop_task = self._loop.create_task(self.sending_loop()) def connection_lost(self, exc): """ With the end of the connection, we just want to cancel our data sending coroutine. """ self._send_loop_task.cancel() def data_received(self, data): """ Process inbound data. """ events = self.conn.receive_data(data) for event in events: if isinstance(event, RequestReceived): self.request_received(event) elif isinstance(event, DataReceived): self.data_frame_received(event) elif isinstance(event, WindowUpdated): self.window_opened(event) elif isinstance(event, StreamEnded): self.end_stream(event) elif isinstance(event, StreamReset): self.reset_stream(event) outbound_data = self.conn.data_to_send() if outbound_data: self.transport.write(outbound_data) def window_opened(self, event): """ The flow control window got opened. This is important because it's possible that we were unable to send some WSGI data because the flow control window was too small. If that happens, the sending_loop coroutine starts buffering data. As the window gets opened, we need to unbuffer the data. We do that by placing the data chunks back on the back of the send queue and letting the sending loop take another shot at sending them. This system only works because we require that each stream only have *one* data chunk in the sending queue at any time. The threading events force this invariant to remain true. """ if event.stream_id: # This is specific to a single stream. if event.stream_id in self._flow_controlled_data: self._stream_data.put_nowait( self._flow_controlled_data.pop(event.stream_id) ) else: # This event is specific to the connection. Free up *all* the # streams. This is a bit tricky, but we *must not* yield the flow # of control here or it all goes wrong. for data in self._flow_controlled_data.values(): self._stream_data.put_nowait(data) self._flow_controlled_data = {} @asyncio.coroutine def sending_loop(self): """ A call that loops forever, attempting to send data. This sending loop contains most of the flow-control smarts of this class: it pulls data off of the asyncio queue and then attempts to send it. The difficulties here are all around flow control. Specifically, a chunk of data may be too large to send. In this case, what will happen is that this coroutine will attempt to send what it can and will then store the unsent data locally. When a flow control event comes in that data will be freed up and placed back onto the asyncio queue, causing it to pop back up into the sending logic of this coroutine. This method explicitly *does not* handle HTTP/2 priority. That adds an extra layer of complexity to what is already a fairly complex method, and we'll look at how to do it another time. This coroutine explicitly *does not end*. """ while True: stream_id, data, event = yield from self._stream_data.get() # If this stream got reset, just drop the data on the floor. Note # that we need to reset the event here to make sure that # application doesn't lock up. if stream_id in self._reset_streams: event.set() # Check if the body is done. If it is, this is really easy! Again, # we *must* set the event here or the application will lock up. if data is END_DATA_SENTINEL: self.conn.end_stream(stream_id) self.transport.write(self.conn.data_to_send()) event.set() continue # We need to send data, but not to exceed the flow control window. # For that reason, grab only the data that fits: we'll buffer the # rest. window_size = self.conn.local_flow_control_window(stream_id) chunk_size = min(window_size, len(data)) data_to_send = data[:chunk_size] data_to_buffer = data[chunk_size:] if data_to_send: # There's a maximum frame size we have to respect. Because we # aren't paying any attention to priority here, we can quite # safely just split this string up into chunks of max frame # size and blast them out. # # In a *real* application you'd want to consider priority here. max_size = self.conn.max_outbound_frame_size chunks = ( data_to_send[x:x+max_size] for x in range(0, len(data_to_send), max_size) ) for chunk in chunks: self.conn.send_data(stream_id, chunk) self.transport.write(self.conn.data_to_send()) # If there's data left to buffer, we should do that. Put it in a # dictionary and *don't set the event*: the app must not generate # any more data until we got rid of all of this data. if data_to_buffer: self._flow_controlled_data[stream_id] = ( stream_id, data_to_buffer, event ) else: # We sent everything. We can let the WSGI app progress. event.set() def request_received(self, event): """ A HTTP/2 request has been received. We need to invoke the WSGI application in a background thread to handle it. """ # First, we are going to want an object to hold all the relevant state # for this request/response. For that, we have a stream object. We # need to store the stream object somewhere reachable for when data # arrives later. s = Stream(event.stream_id, self) self.streams[event.stream_id] = s # Next, we need to build the WSGI environ dictionary. environ = _build_environ_dict(event.headers, s) # Finally, we want to throw these arguments out to a threadpool and # let it run. self._loop.run_in_executor( None, s.run_in_threadpool, APPLICATION, environ, ) def data_frame_received(self, event): """ Data has been received by WSGI server and needs to be dispatched to a running application. Note that the flow control window is not modified here. That's deliberate: see Stream.__next__ for a longer discussion of why. """ # Grab the stream in question from our dictionary and pass it on. stream = self.streams[event.stream_id] stream.receive_data(event.data, event.flow_controlled_length) def end_stream(self, event): """ The stream data is complete. """ stream = self.streams[event.stream_id] stream.request_complete() def reset_stream(self, event): """ A stream got forcefully reset. This is a tricky thing to deal with because WSGI doesn't really have a good notion for it. Essentially, you have to let the application run until completion, but not actually let it send any data. We do that by discarding any data we currently have for it, and then marking the stream as reset to allow us to spot when that stream is trying to send data and drop that data on the floor. We then *also* signal the WSGI application that no more data is incoming, to ensure that it does not attempt to do further reads of the data. """ if event.stream_id in self._flow_controlled_data: del self._flow_controlled_data self._reset_streams.add(event.stream_id) self.end_stream(event) def data_for_stream(self, stream_id, data): """ Thread-safe method called from outside the main asyncio thread in order to send data on behalf of a WSGI application. Places data being written by a stream on an asyncio queue. Returns a threading event that will fire when that data is sent. """ event = threading.Event() self._loop.call_soon_threadsafe( self._stream_data.put_nowait, (stream_id, data, event) ) return event def send_response(self, stream_id, headers): """ Thread-safe method called from outside the main asyncio thread in order to send the HTTP response headers on behalf of a WSGI application. Returns a threading event that will fire when the headers have been emitted to the network. """ event = threading.Event() def _inner_send(stream_id, headers, event): self.conn.send_headers(stream_id, headers, end_stream=False) self.transport.write(self.conn.data_to_send()) event.set() self._loop.call_soon_threadsafe( _inner_send, stream_id, headers, event ) return event def open_flow_control_window(self, stream_id, increment): """ Opens a flow control window for the given stream by the given amount. Called from a WSGI thread. Does not return an event because there's no need to block on this action, it may take place at any time. """ def _inner_open(stream_id, increment): self.conn.increment_flow_control_window(increment, stream_id) self.conn.increment_flow_control_window(increment, None) self.transport.write(self.conn.data_to_send()) self._loop.call_soon_threadsafe( _inner_open, stream_id, increment, ) class Stream: """ This class holds all of the state for a single stream. It also provides several of the callables used by the WSGI application. Finally, it provides the logic for actually interfacing with the WSGI application. For these reasons, the object has *strict* requirements on thread-safety. While the object can be initialized in the main WSGI thread, the ``run_in_threadpool`` method *must* be called from outside that thread. At that point, the main WSGI thread may only call specific methods. """ def __init__(self, stream_id, protocol): self.stream_id = stream_id self._protocol = protocol # Queue for data that has been received from the network. This is a # thread-safe queue, to allow both the WSGI application to block on # receiving more data and to allow the asyncio server to keep sending # more data. # # This queue is unbounded in size, but in practice it cannot contain # too much data because the flow control window doesn't get adjusted # unless data is removed from it. self._received_data = queue.Queue() # This buffer is used to hold partial chunks of data from # _received_data that were not returned out of ``read`` and friends. self._temp_buffer = b'' # Temporary variables that allow us to keep hold of the headers and # response status until such time as the application needs us to send # them. self._response_status = b'' self._response_headers = [] self._headers_emitted = False # Whether the application has received all the data from the network # or not. This allows us to short-circuit some reads. self._complete = False def receive_data(self, data, flow_controlled_size): """ Called by the H2Protocol when more data has been received from the network. Places the data directly on the queue in a thread-safe manner without blocking. Does not introspect or process the data. """ self._received_data.put_nowait((data, flow_controlled_size)) def request_complete(self): """ Called by the H2Protocol when all the request data has been received. This works by placing the ``END_DATA_SENTINEL`` on the queue. The reading code knows, when it sees the ``END_DATA_SENTINEL``, to expect no more data from the network. This ensures that the state of the application only changes when it has finished processing the data from the network, even though the server may have long-since finished receiving all the data for this request. """ self._received_data.put_nowait((END_DATA_SENTINEL, None)) def run_in_threadpool(self, wsgi_application, environ): """ This method should be invoked in a threadpool. At the point this method is invoked, the only safe methods to call from the original thread are ``receive_data`` and ``request_complete``: any other method is unsafe. This method handles the WSGI logic. It invokes the application callable in this thread, passing control over to the WSGI application. It then ensures that the data makes it back to the HTTP/2 connection via the thread-safe APIs provided below. """ result = wsgi_application(environ, self.start_response) try: for data in result: self.write(data) finally: # This signals that we're done with data. The server will know that # this allows it to clean up its state: we're done here. self.write(END_DATA_SENTINEL) # The next few methods are called by the WSGI application. Firstly, the # three methods provided by the input stream. def read(self, size=None): """ Called by the WSGI application to read data. This method is the one of two that explicitly pumps the input data queue, which means it deals with the ``_complete`` flag and the ``END_DATA_SENTINEL``. """ # If we've already seen the END_DATA_SENTINEL, return immediately. if self._complete: return b'' # If we've been asked to read everything, just iterate over ourselves. if size is None: return b''.join(self) # Otherwise, as long as we don't have enough data, spin looking for # another data chunk. data = b'' while len(data) < size: try: chunk = next(self) except StopIteration: break # Concatenating strings this way is slow, but that's ok, this is # just a demo. data += chunk # We have *at least* enough data to return, but we may have too much. # If we do, throw it on a buffer: we'll use it later. to_return = data[:size] self._temp_buffer = data[size:] return to_return def readline(self, hint=None): """ Called by the WSGI application to read a single line of data. This method rigorously observes the ``hint`` parameter: it will only ever read that much data. It then splits the data on a newline character and throws everything it doesn't need into a buffer. """ data = self.read(hint) first_newline = data.find(b'\n') if first_newline == -1: # No newline, return all the data return data # We want to slice the data so that the head *includes* the first # newline. Then, any data left in this line we don't care about should # be prepended to the internal buffer. head, tail = data[:first_newline + 1], data[first_newline + 1:] self._temp_buffer = tail + self._temp_buffer return head def readlines(self, hint=None): """ Called by the WSGI application to read several lines of data. This method is really pretty stupid. It rigorously observes the ``hint`` parameter, and quite happily returns the input split into lines. """ # This method is *crazy inefficient*, but it's also a pretty stupid # method to call. data = self.read(hint) lines = data.split(b'\n') # Split removes the newline character, but we want it, so put it back. lines = [line + b'\n' for line in lines] # Except if the last character was a newline character we now have an # extra line that is just a newline: pull that out. if lines[-1] == b'\n': lines = lines[:-1] return lines def start_response(self, status, response_headers, exc_info=None): """ This is the PEP-3333 mandated start_response callable. All it does is store the headers for later sending, and return our ```write`` callable. """ if self._headers_emitted and exc_info is not None: raise exc_info[1].with_traceback(exc_info[2]) assert not self._response_status or exc_info is not None self._response_status = status self._response_headers = response_headers return self.write def write(self, data): """ Provides some data to write. This function *blocks* until such time as the data is allowed by HTTP/2 flow control. This allows a client to slow or pause the response as needed. This function is not supposed to be used, according to PEP-3333, but once we have it it becomes quite convenient to use it, so this app actually runs all writes through this function. """ if not self._headers_emitted: self._emit_headers() event = self._protocol.data_for_stream(self.stream_id, data) event.wait() return def _emit_headers(self): """ Sends the response headers. This is only called from the write callable and should only ever be called once. It does some minor processing (converts the status line into a status code because reason phrases are evil) and then passes the headers on to the server. This call explicitly blocks until the server notifies us that the headers have reached the network. """ assert self._response_status and self._response_headers assert not self._headers_emitted self._headers_emitted = True # We only need the status code status = self._response_status.split(" ", 1)[0] headers = [(":status", status)] headers.extend(self._response_headers) event = self._protocol.send_response(self.stream_id, headers) event.wait() return # These two methods implement the iterator protocol. This allows a WSGI # application to iterate over this Stream object to get the data. def __iter__(self): return self def __next__(self): # If the complete request has been read, abort immediately. if self._complete: raise StopIteration() # If we have data stored in a temporary buffer for any reason, return # that and clear the buffer. # # This can actually only happen when the application uses one of the # read* callables, but that's fine. if self._temp_buffer: buffered_data = self._temp_buffer self._temp_buffer = b'' return buffered_data # Otherwise, pull data off the queue (blocking as needed). If this is # the end of the request, we're done here: mark ourselves as complete # and call it time. Otherwise, open the flow control window an # appropriate amount and hand the chunk off. chunk, chunk_size = self._received_data.get() if chunk is END_DATA_SENTINEL: self._complete = True raise StopIteration() # Let's talk a little bit about why we're opening the flow control # window *here*, and not in the server thread. # # The purpose of HTTP/2 flow control is to allow for servers and # clients to avoid needing to buffer data indefinitely because their # peer is producing data faster than they can consume it. As a result, # it's important that the flow control window be opened as late in the # processing as possible. In this case, we open the flow control window # exactly when the server hands the data to the application. This means # that the flow control window essentially signals to the remote peer # how much data hasn't even been *seen* by the application yet. # # If you wanted to be really clever you could consider not opening the # flow control window until the application asks for the *next* chunk # of data. That means that any buffers at the application level are now # included in the flow control window processing. In my opinion, the # advantage of that process does not outweigh the extra logical # complexity involved in doing it, so we don't bother here. # # Another note: you'll notice that we don't include the _temp_buffer in # our flow control considerations. This means you could in principle # lead us to buffer slightly more than one connection flow control # window's worth of data. That risk is considered acceptable for the # much simpler logic available here. # # Finally, this is a pretty dumb flow control window management scheme: # it causes us to emit a *lot* of window updates. A smarter server # would want to use the content-length header to determine whether # flow control window updates need to be emitted at all, and then to be # more efficient about emitting them to avoid firing them off really # frequently. For an example like this, there's very little gained by # worrying about that. self._protocol.open_flow_control_window(self.stream_id, chunk_size) return chunk def _build_environ_dict(headers, stream): """ Build the WSGI environ dictionary for a given request. To do that, we'll temporarily create a dictionary for the headers. While this isn't actually a valid way to represent headers, we know that the special headers we need can only have one appearance in the block. This code is arguably somewhat incautious: the conversion to dictionary should only happen in a way that allows us to correctly join headers that appear multiple times. That's acceptable in a demo app: in a productised version you'd want to fix it. """ header_dict = dict(headers) path = header_dict.pop(u':path') try: path, query = path.split(u'?', 1) except ValueError: query = u"" server_name = header_dict.pop(u':authority') try: server_name, port = server_name.split(u':', 1) except ValueError as e: port = "8443" environ = { u'REQUEST_METHOD': header_dict.pop(u':method'), u'SCRIPT_NAME': u'', u'PATH_INFO': path, u'QUERY_STRING': query, u'SERVER_NAME': server_name, u'SERVER_PORT': port, u'SERVER_PROTOCOL': u'HTTP/2', u'HTTPS': u"on", u'SSL_PROTOCOL': u'TLSv1.2', u'wsgi.version': (1, 0), u'wsgi.url_scheme': header_dict.pop(u':scheme'), u'wsgi.input': stream, u'wsgi.errors': sys.stderr, u'wsgi.multithread': True, u'wsgi.multiprocess': False, u'wsgi.run_once': False, } if u'content-type' in header_dict: environ[u'CONTENT_TYPE'] = header_dict[u'content-type'] if u'content-length' in header_dict: environ[u'CONTENT_LENGTH'] = header_dict[u'content-length'] for name, value in header_dict.items(): environ[u'HTTP_' + name.upper()] = value return environ # Set up the WSGI app. application_string = sys.argv[1] path, func = application_string.split(':', 1) module = importlib.import_module(path) APPLICATION = getattr(module, func) # Set up TLS ssl_context = ssl.create_default_context(ssl.Purpose.CLIENT_AUTH) ssl_context.options |= ( ssl.OP_NO_TLSv1 | ssl.OP_NO_TLSv1_1 | ssl.OP_NO_COMPRESSION ) ssl_context.set_ciphers("ECDHE+AESGCM") ssl_context.load_cert_chain(certfile="cert.crt", keyfile="cert.key") ssl_context.set_alpn_protocols(["h2"]) # Do the asnycio bits loop = asyncio.get_event_loop() # Each client connection will create a new protocol instance coro = loop.create_server(H2Protocol, '127.0.0.1', 8443, ssl=ssl_context) server = loop.run_until_complete(coro) # Serve requests until Ctrl+C is pressed print('Serving on {}'.format(server.sockets[0].getsockname())) try: loop.run_forever() except KeyboardInterrupt: pass # Close the server server.close() loop.run_until_complete(server.wait_closed()) loop.close() h2-3.1.1/examples/curio/0000775000175000017500000000000013521033126015650 5ustar ubuntuubuntu00000000000000h2-3.1.1/examples/curio/curio-server.py0000664000175000017500000001525013521033071020651 0ustar ubuntuubuntu00000000000000#!/usr/bin/env python3.5 # -*- coding: utf-8 -*- """ curio-server.py ~~~~~~~~~~~~~~~ A fully-functional HTTP/2 server written for curio. Requires Python 3.5+. """ import mimetypes import os import sys from curio import Event, spawn, socket, ssl, run import h2.config import h2.connection import h2.events # The maximum amount of a file we'll send in a single DATA frame. READ_CHUNK_SIZE = 8192 async def create_listening_ssl_socket(address, certfile, keyfile): """ Create and return a listening TLS socket on a given address. """ ssl_context = ssl.create_default_context(ssl.Purpose.CLIENT_AUTH) ssl_context.options |= ( ssl.OP_NO_TLSv1 | ssl.OP_NO_TLSv1_1 | ssl.OP_NO_COMPRESSION ) ssl_context.set_ciphers("ECDHE+AESGCM") ssl_context.load_cert_chain(certfile=certfile, keyfile=keyfile) ssl_context.set_alpn_protocols(["h2"]) sock = socket.socket() sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) sock = await ssl_context.wrap_socket(sock) sock.bind(address) sock.listen() return sock async def h2_server(address, root, certfile, keyfile): """ Create an HTTP/2 server at the given address. """ sock = await create_listening_ssl_socket(address, certfile, keyfile) print("Now listening on %s:%d" % address) async with sock: while True: client, _ = await sock.accept() server = H2Server(client, root) await spawn(server.run()) class H2Server: """ A basic HTTP/2 file server. This is essentially very similar to SimpleHTTPServer from the standard library, but uses HTTP/2 instead of HTTP/1.1. """ def __init__(self, sock, root): config = h2.config.H2Configuration( client_side=False, header_encoding='utf-8' ) self.sock = sock self.conn = h2.connection.H2Connection(config=config) self.root = root self.flow_control_events = {} async def run(self): """ Loop over the connection, managing it appropriately. """ self.conn.initiate_connection() await self.sock.sendall(self.conn.data_to_send()) while True: # 65535 is basically arbitrary here: this amounts to "give me # whatever data you have". data = await self.sock.recv(65535) if not data: break events = self.conn.receive_data(data) for event in events: if isinstance(event, h2.events.RequestReceived): await spawn( self.request_received(event.headers, event.stream_id) ) elif isinstance(event, h2.events.DataReceived): self.conn.reset_stream(event.stream_id) elif isinstance(event, h2.events.WindowUpdated): await self.window_updated(event) await self.sock.sendall(self.conn.data_to_send()) async def request_received(self, headers, stream_id): """ Handle a request by attempting to serve a suitable file. """ headers = dict(headers) assert headers[':method'] == 'GET' path = headers[':path'].lstrip('/') full_path = os.path.join(self.root, path) if not os.path.exists(full_path): response_headers = ( (':status', '404'), ('content-length', '0'), ('server', 'curio-h2'), ) self.conn.send_headers( stream_id, response_headers, end_stream=True ) await self.sock.sendall(self.conn.data_to_send()) else: await self.send_file(full_path, stream_id) async def send_file(self, file_path, stream_id): """ Send a file, obeying the rules of HTTP/2 flow control. """ filesize = os.stat(file_path).st_size content_type, content_encoding = mimetypes.guess_type(file_path) response_headers = [ (':status', '200'), ('content-length', str(filesize)), ('server', 'curio-h2'), ] if content_type: response_headers.append(('content-type', content_type)) if content_encoding: response_headers.append(('content-encoding', content_encoding)) self.conn.send_headers(stream_id, response_headers) await self.sock.sendall(self.conn.data_to_send()) with open(file_path, 'rb', buffering=0) as f: await self._send_file_data(f, stream_id) async def _send_file_data(self, fileobj, stream_id): """ Send the data portion of a file. Handles flow control rules. """ while True: while self.conn.local_flow_control_window(stream_id) < 1: await self.wait_for_flow_control(stream_id) chunk_size = min( self.conn.local_flow_control_window(stream_id), READ_CHUNK_SIZE, ) data = fileobj.read(chunk_size) keep_reading = (len(data) == chunk_size) self.conn.send_data(stream_id, data, not keep_reading) await self.sock.sendall(self.conn.data_to_send()) if not keep_reading: break async def wait_for_flow_control(self, stream_id): """ Blocks until the flow control window for a given stream is opened. """ evt = Event() self.flow_control_events[stream_id] = evt await evt.wait() async def window_updated(self, event): """ Unblock streams waiting on flow control, if needed. """ stream_id = event.stream_id if stream_id and stream_id in self.flow_control_events: evt = self.flow_control_events.pop(stream_id) await evt.set() elif not stream_id: # Need to keep a real list here to use only the events present at # this time. blocked_streams = list(self.flow_control_events.keys()) for stream_id in blocked_streams: event = self.flow_control_events.pop(stream_id) await event.set() return if __name__ == '__main__': host = sys.argv[2] if len(sys.argv) > 2 else "localhost" print("Try GETting:") print(" On OSX after 'brew install curl --with-c-ares --with-libidn --with-nghttp2 --with-openssl':") print("/usr/local/opt/curl/bin/curl --tlsv1.2 --http2 -k https://localhost:5000/bundle.js") print("Or open a browser to: https://localhost:5000/") print(" (Accept all the warnings)") run(h2_server((host, 5000), sys.argv[1], "{}.crt.pem".format(host), "{}.key".format(host)), with_monitor=True) h2-3.1.1/examples/curio/localhost.crt.pem0000664000175000017500000000240113421652727021144 0ustar ubuntuubuntu00000000000000-----BEGIN CERTIFICATE----- MIIDhTCCAm2gAwIBAgIJAOrxh0dOYJLdMA0GCSqGSIb3DQEBCwUAMFkxCzAJBgNV BAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBX aWRnaXRzIFB0eSBMdGQxEjAQBgNVBAMMCWxvY2FsaG9zdDAeFw0xNTA5MTkxNDE2 NDRaFw0xNTEwMTkxNDE2NDRaMFkxCzAJBgNVBAYTAkFVMRMwEQYDVQQIDApTb21l LVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBXaWRnaXRzIFB0eSBMdGQxEjAQBgNV BAMMCWxvY2FsaG9zdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMqt A1iu8EN00FU0eBcBGlLVmNEgV7Jkbukra+kwS8j/U2y50QPGJc/FiIVDfuBqk5dL ACTNc6A/FQcXvWmOc5ixmC3QKKasMpuofqKz0V9C6irZdYXZ9rcsW0gHQIr989yd R+N1VbIlEVW/T9FJL3B2UD9GVIkUELzm47CSOWZvAxQUlsx8CUNuUCWqyZJoqTFN j0LeJDOWGCsug1Pkj0Q1x+jMVL6l6Zf6vMkLNOMsOsWsxUk+0L3tl/OzcTgUOCsw UzY59RIi6Rudrp0oaU8NuHr91yiSqPbKFlX10M9KwEEdnIpcxhND3dacrDycj3ux eWlqKync2vOFUkhwiaMCAwEAAaNQME4wHQYDVR0OBBYEFA0PN+PGoofZ+QIys2Jy 1Zz94vBOMB8GA1UdIwQYMBaAFA0PN+PGoofZ+QIys2Jy1Zz94vBOMAwGA1UdEwQF MAMBAf8wDQYJKoZIhvcNAQELBQADggEBAEplethBoPpcP3EbR5Rz6snDDIcbtAJu Ngd0YZppGT+P0DYnPJva4vRG3bb84ZMSuppz5j67qD6DdWte8UXhK8BzWiHzwmQE QmbKyzzTMKQgTNFntpx5cgsSvTtrHpNYoMHzHOmyAOboNeM0DWiRXsYLkWTitLTN qbOpstwPubExbT9lPjLclntShT/lCupt+zsbnrR9YiqlYFY/fDzfAybZhrD5GMBY XdMPItwAc/sWvH31yztarjkLmld76AGCcO5r8cSR/cX98SicyfjOBbSco8GkjYNY 582gTPkKGYpStuN7GNT5tZmxvMq935HRa2XZvlAIe8ufp8EHVoYiF3c= -----END CERTIFICATE----- h2-3.1.1/examples/curio/localhost.key0000664000175000017500000000321713421652727020372 0ustar ubuntuubuntu00000000000000-----BEGIN RSA PRIVATE KEY----- MIIEpAIBAAKCAQEAyq0DWK7wQ3TQVTR4FwEaUtWY0SBXsmRu6Str6TBLyP9TbLnR A8Ylz8WIhUN+4GqTl0sAJM1zoD8VBxe9aY5zmLGYLdAopqwym6h+orPRX0LqKtl1 hdn2tyxbSAdAiv3z3J1H43VVsiURVb9P0UkvcHZQP0ZUiRQQvObjsJI5Zm8DFBSW zHwJQ25QJarJkmipMU2PQt4kM5YYKy6DU+SPRDXH6MxUvqXpl/q8yQs04yw6xazF ST7Qve2X87NxOBQ4KzBTNjn1EiLpG52unShpTw24ev3XKJKo9soWVfXQz0rAQR2c ilzGE0Pd1pysPJyPe7F5aWorKdza84VSSHCJowIDAQABAoIBACp+nh4BB/VMz8Wd q7Q/EfLeQB1Q57JKpoqTBRwueSVai3ZXe4CMEi9/HkG6xiZtkiZ9njkZLq4hq9oB 2z//kzMnwV2RsIRJxI6ohGy+wR51HD4BvEdlTPpY/Yabpqe92VyfSYxidKZWaU0O QMED1EODOw4ZQ+4928iPrJu//PMB4e7TFao0b9Fk/XLWtu5/tQZz9jsrlTi1zthh 7n+oaGNhfTeIJJL4jrhTrKW1CLHXATtr9SJlfZ3wbMxQVeyj2wUlP1V0M6kBuhNj tbGbMpixD5iCNJ49Cm2PHg+wBOfS3ADGIpi3PcGw5mb8nB3N9eGBRPhLShAlq5Hi Lv4tyykCgYEA8u3b3xJ04pxWYN25ou/Sc8xzgDCK4XvDNdHVTuZDjLVA+VTVPzql lw7VvJArsx47MSPvsaX/+4hQXYtfnR7yJpx6QagvQ+z4ludnIZYrQwdUmb9pFL1s 8UNj+3j9QFRPenIiIQ8qxxNIQ9w2HsVQ8scvc9CjYop/YYAPaQyHaL8CgYEA1ZSz CR4NcpfgRSILdhb1dLcyw5Qus1VOSAx3DYkhDkMiB8XZwgMdJjwehJo9yaqRCLE8 Sw5znMnkfoZpu7+skrjK0FqmMpXMH9gIszHvFG8wSw/6+2HIWS19/wOu8dh95LuC 0zurMk8rFqxgWMWF20afhgYrUz42cvUTo10FVB0CgYEAt7mW6W3PArfUSCxIwmb4 VmXREKkl0ATHDYQl/Cb//YHzot467TgQll883QB4XF5HzBFurX9rSzO7/BN1e6I0 52i+ubtWC9xD4fUetXMaQvZfUGxIL8xXgVxDWKQXfLiG54c8Mp6C7s6xf8kjEUCP yR1F0SSA/Pzb+8RbY0p7eocCgYA+1rs+SXtHZev0KyoYGnUpW+Uxqd17ofOgOxqj /t6c5Z+TjeCdtnDTGQkZlo/rT6XQWuUUaDIXxUbW+xEMzj4mBPyXBLS1WWFvVQ5q OpzO9E/PJeqAH6rkof/aEelc+oc/zvOU1o9uA+D3kMvgEm1psIOq2RHSMhGvDPA0 NmAk+QKBgQCwd1681GagdIYSZUCBecnLtevXmIsJyDW2yR1NNcIe/ukcVQREMDvy 5DDkhnGDgnV1D5gYcXb34g9vYvbfTnBMl/JXmMAAG1kIS+3pvHyN6f1poVe3yJV1 yHVuvymnJxKnyaV0L3ntepVvV0vVNIkA3oauoUTLto6txBI+b/ImDA== -----END RSA PRIVATE KEY----- h2-3.1.1/examples/eventlet/0000775000175000017500000000000013521033126016355 5ustar ubuntuubuntu00000000000000h2-3.1.1/examples/eventlet/eventlet-server.py0000664000175000017500000000544313421652727022104 0ustar ubuntuubuntu00000000000000# -*- coding: utf-8 -*- """ eventlet-server.py ~~~~~~~~~~~~~~~~~~ A fully-functional HTTP/2 server written for Eventlet. """ import collections import json import eventlet from eventlet.green.OpenSSL import SSL, crypto from h2.config import H2Configuration from h2.connection import H2Connection from h2.events import RequestReceived, DataReceived class ConnectionManager(object): """ An object that manages a single HTTP/2 connection. """ def __init__(self, sock): config = H2Configuration(client_side=False) self.sock = sock self.conn = H2Connection(config=config) def run_forever(self): self.conn.initiate_connection() self.sock.sendall(self.conn.data_to_send()) while True: data = self.sock.recv(65535) if not data: break events = self.conn.receive_data(data) for event in events: if isinstance(event, RequestReceived): self.request_received(event.headers, event.stream_id) elif isinstance(event, DataReceived): self.conn.reset_stream(event.stream_id) self.sock.sendall(self.conn.data_to_send()) def request_received(self, headers, stream_id): headers = collections.OrderedDict(headers) data = json.dumps({'headers': headers}, indent=4).encode('utf-8') response_headers = ( (':status', '200'), ('content-type', 'application/json'), ('content-length', str(len(data))), ('server', 'eventlet-h2'), ) self.conn.send_headers(stream_id, response_headers) self.conn.send_data(stream_id, data, end_stream=True) def alpn_callback(conn, protos): if b'h2' in protos: return b'h2' raise RuntimeError("No acceptable protocol offered!") def npn_advertise_cb(conn): return [b'h2'] # Let's set up SSL. This is a lot of work in PyOpenSSL. options = ( SSL.OP_NO_COMPRESSION | SSL.OP_NO_SSLv2 | SSL.OP_NO_SSLv3 | SSL.OP_NO_TLSv1 | SSL.OP_NO_TLSv1_1 ) context = SSL.Context(SSL.SSLv23_METHOD) context.set_options(options) context.set_verify(SSL.VERIFY_NONE, lambda *args: True) context.use_privatekey_file('server.key') context.use_certificate_file('server.crt') context.set_npn_advertise_callback(npn_advertise_cb) context.set_alpn_select_callback(alpn_callback) context.set_cipher_list( "ECDHE+AESGCM" ) context.set_tmp_ecdh(crypto.get_elliptic_curve(u'prime256v1')) server = eventlet.listen(('0.0.0.0', 443)) server = SSL.Connection(context, server) pool = eventlet.GreenPool() while True: try: new_sock, _ = server.accept() manager = ConnectionManager(new_sock) pool.spawn_n(manager.run_forever) except (SystemExit, KeyboardInterrupt): break h2-3.1.1/examples/eventlet/server.crt0000664000175000017500000000227413421652727020417 0ustar ubuntuubuntu00000000000000-----BEGIN CERTIFICATE----- MIIDUjCCAjoCCQCQmNzzpQTCijANBgkqhkiG9w0BAQUFADBrMQswCQYDVQQGEwJH QjEPMA0GA1UECBMGTG9uZG9uMQ8wDQYDVQQHEwZMb25kb24xETAPBgNVBAoTCGh5 cGVyLWgyMREwDwYDVQQLEwhoeXBleS1oMjEUMBIGA1UEAxMLZXhhbXBsZS5jb20w HhcNMTUwOTE2MjAyOTA0WhcNMTYwOTE1MjAyOTA0WjBrMQswCQYDVQQGEwJHQjEP MA0GA1UECBMGTG9uZG9uMQ8wDQYDVQQHEwZMb25kb24xETAPBgNVBAoTCGh5cGVy LWgyMREwDwYDVQQLEwhoeXBleS1oMjEUMBIGA1UEAxMLZXhhbXBsZS5jb20wggEi MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC74ZeB4Jdb5cnC9KXXLJuzjwTg 45q5EeShDYQe0TbKgreiUP6clU3BR0fFAVedN1q/LOuQ1HhvrDk1l4TfGF2bpCIq K+U9CnzcQknvdpyyVeOLtSsCjOPk4xydHwkQxwJvHVdtJx4CzDDqGbHNHCF/9gpQ lsa3JZW+tIZLK0XMEPFQ4XFXgegxTStO7kBBPaVIgG9Ooqc2MG4rjMNUpxa28WF1 SyqWTICf2N8T/C+fPzbQLKCWrFrKUP7WQlOaqPNQL9bCDhSTPRTwQOc2/MzVZ9gT Xr0Z+JMTXwkSMKO52adE1pmKt00jJ1ecZBiJFyjx0X6hH+/59dLbG/7No+PzAgMB AAEwDQYJKoZIhvcNAQEFBQADggEBAG3UhOCa0EemL2iY+C+PR6CwEHQ+n7vkBzNz gKOG+Q39spyzqU1qJAzBxLTE81bIQbDg0R8kcLWHVH2y4zViRxZ0jHUFKMgjONW+ Aj4evic/2Y/LxpLxCajECq/jeMHYrmQONszf9pbc0+exrQpgnwd8asfsM3d/FJS2 5DIWryCKs/61m9vYL8icWx/9cnfPkBoNv1ER+V1L1TH3ARvABh406SBaeqLTm/kG MNuKytKWJsQbNlxzWHVgkKzVsBKvYj0uIEJpClIhbe6XNYRDy8T8mKXVWhJuxH4p /agmCG3nxO8aCrUK/EVmbWmVIfCH3t7jlwMX1nJ8MsRE7Ydnk8I= -----END CERTIFICATE----- h2-3.1.1/examples/eventlet/server.key0000664000175000017500000000321713421652727020415 0ustar ubuntuubuntu00000000000000-----BEGIN RSA PRIVATE KEY----- MIIEpQIBAAKCAQEAu+GXgeCXW+XJwvSl1yybs48E4OOauRHkoQ2EHtE2yoK3olD+ nJVNwUdHxQFXnTdavyzrkNR4b6w5NZeE3xhdm6QiKivlPQp83EJJ73acslXji7Ur Aozj5OMcnR8JEMcCbx1XbSceAsww6hmxzRwhf/YKUJbGtyWVvrSGSytFzBDxUOFx V4HoMU0rTu5AQT2lSIBvTqKnNjBuK4zDVKcWtvFhdUsqlkyAn9jfE/wvnz820Cyg lqxaylD+1kJTmqjzUC/Wwg4Ukz0U8EDnNvzM1WfYE169GfiTE18JEjCjudmnRNaZ irdNIydXnGQYiRco8dF+oR/v+fXS2xv+zaPj8wIDAQABAoIBAQCsdq278+0c13d4 tViSh4k5r1w8D9IUdp9XU2/nVgckqA9nOVAvbkJc3FC+P7gsQgbUHKj0XoVbhU1S q461t8kduPH/oiGhAcKR8WurHEdE0OC6ewhLJAeCMRQwCrAorXXHh7icIt9ClCuG iSWUcXEy5Cidx3oL3r1xvIbV85fzdDtE9RC1I/kMjAy63S47YGiqh5vYmJkCa8rG Dsd1sEMDPr63XJpqJj3uHRcPvySgXTa+ssTmUH8WJlPTjvDB5hnPz+lkk2JKVPNu 8adzftZ6hSun+tsc4ZJp8XhGu/m/7MjxWh8MeupLHlXcOEsnj4uHQQsOM3zHojr3 aDCZiC1pAoGBAOAhwe1ujoS2VJ5RXJ9KMs7eBER/02MDgWZjo54Jv/jFxPWGslKk QQceuTe+PruRm41nzvk3q4iZXt8pG0bvpgigN2epcVx/O2ouRsUWWBT0JrVlEzha TIvWjtZ5tSQExXgHL3VlM9+ka40l+NldLSPn25+prizaqhalWuvTpP23AoGBANaY VhEI6yhp0BBUSATEv9lRgkwx3EbcnXNXPQjDMOthsyfq7FxbdOBEK1rwSDyuE6Ij zQGcTOfdiur5Ttg0OQilTJIXJAlpoeecOQ9yGma08c5FMXVJJvcZUuWRZWg1ocQj /hx0WVE9NwOoKwTBERv8HX7vJOFRZyvgkJwFxoulAoGAe4m/1XoZrga9z2GzNs10 AdgX7BW00x+MhH4pIiPnn1yK+nYa9jg4647Asnv3IfXZEnEEgRNxReKbi0+iDFBt aNW+lDGuHTi37AfD1EBDnpEQgO1MUcRb6rwBkTAWatsCaO00+HUmyX9cFLm4Vz7n caILyQ6CxZBlLgRIgDHxADMCgYEAtubsJGTHmZBmSCStpXLUWbOBLNQqfTM398DZ QoirP1PsUQ+IGUfSG/u+QCogR6fPEBkXeFHxsoY/Cvsm2lvYaKgK1VFn46Xm2vNq JuIH4pZCqp6LAv4weddZslT0a5eaowRSZ4o7PmTAaRuCXvD3VjTSJwhJFMo+90TV vEWn7gkCgYEAkk+unX9kYmKoUdLh22/tzQekBa8WqMxXDwzBCECTAs2GlpL/f73i zD15TnaNfLP6Q5RNb0N9tb0Gz1wSkwI1+jGAQLnh2K9X9cIVIqJn8Mf/KQa/wUDV Tb1j7FoGUEgX7vbsyWuTd8P76kNYyGqCss1XmbttcSolqpbIdlSUcO0= -----END RSA PRIVATE KEY----- h2-3.1.1/examples/fragments/0000775000175000017500000000000013521033126016515 5ustar ubuntuubuntu00000000000000h2-3.1.1/examples/fragments/client_https_setup_fragment.py0000664000175000017500000000745713421652727024724 0ustar ubuntuubuntu00000000000000# -*- coding: utf-8 -*- """ Client HTTPS Setup ~~~~~~~~~~~~~~~~~~ This example code fragment demonstrates how to set up a HTTP/2 client that negotiates HTTP/2 using NPN and ALPN. For the sake of maximum explanatory value this code uses the synchronous, low-level sockets API: however, if you're not using sockets directly (e.g. because you're using asyncio), you should focus on the set up required for the SSLContext object. For other concurrency libraries you may need to use other setup (e.g. for Twisted you'll need to use IProtocolNegotiationFactory). This code requires Python 3.5 or later. """ import h2.connection import socket import ssl def establish_tcp_connection(): """ This function establishes a client-side TCP connection. How it works isn't very important to this example. For the purpose of this example we connect to localhost. """ return socket.create_connection(('localhost', 443)) def get_http2_ssl_context(): """ This function creates an SSLContext object that is suitably configured for HTTP/2. If you're working with Python TLS directly, you'll want to do the exact same setup as this function does. """ # Get the basic context from the standard library. ctx = ssl.create_default_context(purpose=ssl.Purpose.SERVER_AUTH) # RFC 7540 Section 9.2: Implementations of HTTP/2 MUST use TLS version 1.2 # or higher. Disable TLS 1.1 and lower. ctx.options |= ( ssl.OP_NO_SSLv2 | ssl.OP_NO_SSLv3 | ssl.OP_NO_TLSv1 | ssl.OP_NO_TLSv1_1 ) # RFC 7540 Section 9.2.1: A deployment of HTTP/2 over TLS 1.2 MUST disable # compression. ctx.options |= ssl.OP_NO_COMPRESSION # RFC 7540 Section 9.2.2: "deployments of HTTP/2 that use TLS 1.2 MUST # support TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256". In practice, the # blacklist defined in this section allows only the AES GCM and ChaCha20 # cipher suites with ephemeral key negotiation. ctx.set_ciphers("ECDHE+AESGCM:ECDHE+CHACHA20:DHE+AESGCM:DHE+CHACHA20") # We want to negotiate using NPN and ALPN. ALPN is mandatory, but NPN may # be absent, so allow that. This setup allows for negotiation of HTTP/1.1. ctx.set_alpn_protocols(["h2", "http/1.1"]) try: ctx.set_npn_protocols(["h2", "http/1.1"]) except NotImplementedError: pass return ctx def negotiate_tls(tcp_conn, context): """ Given an established TCP connection and a HTTP/2-appropriate TLS context, this function: 1. wraps TLS around the TCP connection. 2. confirms that HTTP/2 was negotiated and, if it was not, throws an error. """ # Note that SNI is mandatory for HTTP/2, so you *must* pass the # server_hostname argument. tls_conn = context.wrap_socket(tcp_conn, server_hostname='localhost') # Always prefer the result from ALPN to that from NPN. # You can only check what protocol was negotiated once the handshake is # complete. negotiated_protocol = tls_conn.selected_alpn_protocol() if negotiated_protocol is None: negotiated_protocol = tls_conn.selected_npn_protocol() if negotiated_protocol != "h2": raise RuntimeError("Didn't negotiate HTTP/2!") return tls_conn def main(): # Step 1: Set up your TLS context. context = get_http2_ssl_context() # Step 2: Create a TCP connection. connection = establish_tcp_connection() # Step 3: Wrap the connection in TLS and validate that we negotiated HTTP/2 tls_connection = negotiate_tls(connection, context) # Step 4: Create a client-side H2 connection. http2_connection = h2.connection.H2Connection() # Step 5: Initiate the connection http2_connection.initiate_connection() tls_connection.sendall(http2_connection.data_to_send()) # The TCP, TLS, and HTTP/2 handshakes are now complete. You can enter your # main loop now. h2-3.1.1/examples/fragments/client_upgrade_fragment.py0000664000175000017500000000721613421652727023762 0ustar ubuntuubuntu00000000000000# -*- coding: utf-8 -*- """ Client Plaintext Upgrade ~~~~~~~~~~~~~~~~~~~~~~~~ This example code fragment demonstrates how to set up a HTTP/2 client that uses the plaintext HTTP Upgrade mechanism to negotiate HTTP/2 connectivity. For maximum explanatory value it uses the synchronous socket API that comes with the Python standard library. In product code you will want to use an actual HTTP/1.1 client if possible. This code requires Python 3.5 or later. """ import h2.connection import socket def establish_tcp_connection(): """ This function establishes a client-side TCP connection. How it works isn't very important to this example. For the purpose of this example we connect to localhost. """ return socket.create_connection(('localhost', 80)) def send_initial_request(connection, settings): """ For the sake of this upgrade demonstration, we're going to issue a GET request against the root of the site. In principle the best request to issue for an upgrade is actually ``OPTIONS *``, but this is remarkably poorly supported and can break in weird ways. """ # Craft our initial request per RFC 7540 Section 3.2. This requires two # special header fields: the Upgrade headre, and the HTTP2-Settings header. # The value of the HTTP2-Settings header field comes from h2. request = ( b"GET / HTTP/1.1\r\n" + b"Host: localhost\r\n" + b"Upgrade: h2c\r\n" + b"HTTP2-Settings: " + settings + b"\r\n" + b"\r\n" ) connection.sendall(request) def get_upgrade_response(connection): """ This function reads from the socket until the HTTP/1.1 end-of-headers sequence (CRLFCRLF) is received. It then checks what the status code of the response is. This is not a substitute for proper HTTP/1.1 parsing, but it's good enough for example purposes. """ data = b'' while b'\r\n\r\n' not in data: data += connection.recv(8192) headers, rest = data.split(b'\r\n\r\n', 1) # An upgrade response begins HTTP/1.1 101 Switching Protocols. Look for the # code. In production code you should also check that the upgrade is to # h2c, but here we know we only offered one upgrade so there's only one # possible upgrade in use. split_headers = headers.split() if split_headers[1] != b'101': raise RuntimeError("Not upgrading!") # We don't care about the HTTP/1.1 data anymore, but we do care about # any other data we read from the socket: this is going to be HTTP/2 data # that must be passed to the H2Connection. return rest def main(): """ The client upgrade flow. """ # Step 1: Establish the TCP connecton. connection = establish_tcp_connection() # Step 2: Create H2 Connection object, put it in upgrade mode, and get the # value of the HTTP2-Settings header we want to use. h2_connection = h2.connection.H2Connection() settings_header_value = h2_connection.initiate_upgrade_connection() # Step 3: Send the initial HTTP/1.1 request with the upgrade fields. send_initial_request(connection, settings_header_value) # Step 4: Read the HTTP/1.1 response, look for 101 response. extra_data = get_upgrade_response(connection) # Step 5: Immediately send the pending HTTP/2 data. connection.sendall(h2_connection.data_to_send()) # Step 6: Feed the body data to the connection. events = connection.receive_data(extra_data) # Now you can enter your main loop, beginning by processing the first set # of events above. These events may include ResponseReceived, which will # contain the response to the request we made in Step 3. main_loop(events) h2-3.1.1/examples/fragments/server_https_setup_fragment.py0000664000175000017500000000744313421652727024747 0ustar ubuntuubuntu00000000000000# -*- coding: utf-8 -*- """ Server HTTPS Setup ~~~~~~~~~~~~~~~~~~ This example code fragment demonstrates how to set up a HTTP/2 server that negotiates HTTP/2 using NPN and ALPN. For the sake of maximum explanatory value this code uses the synchronous, low-level sockets API: however, if you're not using sockets directly (e.g. because you're using asyncio), you should focus on the set up required for the SSLContext object. For other concurrency libraries you may need to use other setup (e.g. for Twisted you'll need to use IProtocolNegotiationFactory). This code requires Python 3.5 or later. """ import h2.config import h2.connection import socket import ssl def establish_tcp_connection(): """ This function establishes a server-side TCP connection. How it works isn't very important to this example. """ bind_socket = socket.socket() bind_socket.bind(('', 443)) bind_socket.listen(5) return bind_socket.accept()[0] def get_http2_ssl_context(): """ This function creates an SSLContext object that is suitably configured for HTTP/2. If you're working with Python TLS directly, you'll want to do the exact same setup as this function does. """ # Get the basic context from the standard library. ctx = ssl.create_default_context(purpose=ssl.Purpose.CLIENT_AUTH) # RFC 7540 Section 9.2: Implementations of HTTP/2 MUST use TLS version 1.2 # or higher. Disable TLS 1.1 and lower. ctx.options |= ( ssl.OP_NO_SSLv2 | ssl.OP_NO_SSLv3 | ssl.OP_NO_TLSv1 | ssl.OP_NO_TLSv1_1 ) # RFC 7540 Section 9.2.1: A deployment of HTTP/2 over TLS 1.2 MUST disable # compression. ctx.options |= ssl.OP_NO_COMPRESSION # RFC 7540 Section 9.2.2: "deployments of HTTP/2 that use TLS 1.2 MUST # support TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256". In practice, the # blacklist defined in this section allows only the AES GCM and ChaCha20 # cipher suites with ephemeral key negotiation. ctx.set_ciphers("ECDHE+AESGCM:ECDHE+CHACHA20:DHE+AESGCM:DHE+CHACHA20") # We want to negotiate using NPN and ALPN. ALPN is mandatory, but NPN may # be absent, so allow that. This setup allows for negotiation of HTTP/1.1. ctx.set_alpn_protocols(["h2", "http/1.1"]) try: ctx.set_npn_protocols(["h2", "http/1.1"]) except NotImplementedError: pass return ctx def negotiate_tls(tcp_conn, context): """ Given an established TCP connection and a HTTP/2-appropriate TLS context, this function: 1. wraps TLS around the TCP connection. 2. confirms that HTTP/2 was negotiated and, if it was not, throws an error. """ tls_conn = context.wrap_socket(tcp_conn, server_side=True) # Always prefer the result from ALPN to that from NPN. # You can only check what protocol was negotiated once the handshake is # complete. negotiated_protocol = tls_conn.selected_alpn_protocol() if negotiated_protocol is None: negotiated_protocol = tls_conn.selected_npn_protocol() if negotiated_protocol != "h2": raise RuntimeError("Didn't negotiate HTTP/2!") return tls_conn def main(): # Step 1: Set up your TLS context. context = get_http2_ssl_context() # Step 2: Receive a TCP connection. connection = establish_tcp_connection() # Step 3: Wrap the connection in TLS and validate that we negotiated HTTP/2 tls_connection = negotiate_tls(connection, context) # Step 4: Create a server-side H2 connection. config = h2.config.H2Configuration(client_side=False) http2_connection = h2.connection.H2Connection(config=config) # Step 5: Initiate the connection http2_connection.initiate_connection() tls_connection.sendall(http2_connection.data_to_send()) # The TCP, TLS, and HTTP/2 handshakes are now complete. You can enter your # main loop now. h2-3.1.1/examples/fragments/server_upgrade_fragment.py0000664000175000017500000000611513421652727024007 0ustar ubuntuubuntu00000000000000# -*- coding: utf-8 -*- """ Server Plaintext Upgrade ~~~~~~~~~~~~~~~~~~~~~~~~ This example code fragment demonstrates how to set up a HTTP/2 server that uses the plaintext HTTP Upgrade mechanism to negotiate HTTP/2 connectivity. For maximum explanatory value it uses the synchronous socket API that comes with the Python standard library. In product code you will want to use an actual HTTP/1.1 server library if possible. This code requires Python 3.5 or later. """ import h2.config import h2.connection import re import socket def establish_tcp_connection(): """ This function establishes a server-side TCP connection. How it works isn't very important to this example. """ bind_socket = socket.socket() bind_socket.bind(('', 443)) bind_socket.listen(5) return bind_socket.accept()[0] def receive_initial_request(connection): """ We're going to receive a request. For the sake of this example, we're going to assume that the first request has no body. If it doesn't have the Upgrade: h2c header field and the HTTP2-Settings header field, we'll throw errors. In production code, you should use a proper HTTP/1.1 parser and actually serve HTTP/1.1 requests! Returns the value of the HTTP2-Settings header field. """ data = b'' while not data.endswith(b'\r\n\r\n'): data += connection.recv(8192) match = re.search(b'Upgrade: h2c\r\n', data) if match is None: raise RuntimeError("HTTP/2 upgrade not requested!") # We need to look for the HTTP2-Settings header field. Again, in production # code you shouldn't use regular expressions for this, but it's good enough # for the example. match = re.search(b'HTTP2-Settings: (\\S+)\r\n', data) if match is None: raise RuntimeError("HTTP2-Settings header field not present!") return match.group(1) def send_upgrade_response(connection): """ This function writes the 101 Switching Protocols response. """ response = ( b"HTTP/1.1 101 Switching Protocols\r\n" b"Upgrade: h2c\r\n" b"\r\n" ) connection.sendall(response) def main(): """ The server upgrade flow. """ # Step 1: Establish the TCP connecton. connection = establish_tcp_connection() # Step 2: Read the response. We expect this to request an upgrade. settings_header_value = receive_initial_request(connection) # Step 3: Create a H2Connection object in server mode, and pass it the # value of the HTTP2-Settings header field. config = h2.config.H2Configuration(client_side=False) h2_connection = h2.connection.H2Connection(config=config) h2_connection.initiate_upgrade_connection( settings_header=settings_header_value ) # Step 4: Send the 101 Switching Protocols response. send_upgrade_response(connection) # Step 5: Send pending HTTP/2 data. connection.sendall(h2_connection.data_to_send()) # At this point, you can enter your main loop. The first step has to be to # send the response to the initial HTTP/1.1 request you received on stream # 1. main_loop() h2-3.1.1/examples/tornado/0000775000175000017500000000000013521033126016175 5ustar ubuntuubuntu00000000000000h2-3.1.1/examples/tornado/server.crt0000664000175000017500000000227413421652727020237 0ustar ubuntuubuntu00000000000000-----BEGIN CERTIFICATE----- MIIDUjCCAjoCCQCQmNzzpQTCijANBgkqhkiG9w0BAQUFADBrMQswCQYDVQQGEwJH QjEPMA0GA1UECBMGTG9uZG9uMQ8wDQYDVQQHEwZMb25kb24xETAPBgNVBAoTCGh5 cGVyLWgyMREwDwYDVQQLEwhoeXBleS1oMjEUMBIGA1UEAxMLZXhhbXBsZS5jb20w HhcNMTUwOTE2MjAyOTA0WhcNMTYwOTE1MjAyOTA0WjBrMQswCQYDVQQGEwJHQjEP MA0GA1UECBMGTG9uZG9uMQ8wDQYDVQQHEwZMb25kb24xETAPBgNVBAoTCGh5cGVy LWgyMREwDwYDVQQLEwhoeXBleS1oMjEUMBIGA1UEAxMLZXhhbXBsZS5jb20wggEi MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC74ZeB4Jdb5cnC9KXXLJuzjwTg 45q5EeShDYQe0TbKgreiUP6clU3BR0fFAVedN1q/LOuQ1HhvrDk1l4TfGF2bpCIq K+U9CnzcQknvdpyyVeOLtSsCjOPk4xydHwkQxwJvHVdtJx4CzDDqGbHNHCF/9gpQ lsa3JZW+tIZLK0XMEPFQ4XFXgegxTStO7kBBPaVIgG9Ooqc2MG4rjMNUpxa28WF1 SyqWTICf2N8T/C+fPzbQLKCWrFrKUP7WQlOaqPNQL9bCDhSTPRTwQOc2/MzVZ9gT Xr0Z+JMTXwkSMKO52adE1pmKt00jJ1ecZBiJFyjx0X6hH+/59dLbG/7No+PzAgMB AAEwDQYJKoZIhvcNAQEFBQADggEBAG3UhOCa0EemL2iY+C+PR6CwEHQ+n7vkBzNz gKOG+Q39spyzqU1qJAzBxLTE81bIQbDg0R8kcLWHVH2y4zViRxZ0jHUFKMgjONW+ Aj4evic/2Y/LxpLxCajECq/jeMHYrmQONszf9pbc0+exrQpgnwd8asfsM3d/FJS2 5DIWryCKs/61m9vYL8icWx/9cnfPkBoNv1ER+V1L1TH3ARvABh406SBaeqLTm/kG MNuKytKWJsQbNlxzWHVgkKzVsBKvYj0uIEJpClIhbe6XNYRDy8T8mKXVWhJuxH4p /agmCG3nxO8aCrUK/EVmbWmVIfCH3t7jlwMX1nJ8MsRE7Ydnk8I= -----END CERTIFICATE----- h2-3.1.1/examples/tornado/server.key0000664000175000017500000000321713421652727020235 0ustar ubuntuubuntu00000000000000-----BEGIN RSA PRIVATE KEY----- MIIEpQIBAAKCAQEAu+GXgeCXW+XJwvSl1yybs48E4OOauRHkoQ2EHtE2yoK3olD+ nJVNwUdHxQFXnTdavyzrkNR4b6w5NZeE3xhdm6QiKivlPQp83EJJ73acslXji7Ur Aozj5OMcnR8JEMcCbx1XbSceAsww6hmxzRwhf/YKUJbGtyWVvrSGSytFzBDxUOFx V4HoMU0rTu5AQT2lSIBvTqKnNjBuK4zDVKcWtvFhdUsqlkyAn9jfE/wvnz820Cyg lqxaylD+1kJTmqjzUC/Wwg4Ukz0U8EDnNvzM1WfYE169GfiTE18JEjCjudmnRNaZ irdNIydXnGQYiRco8dF+oR/v+fXS2xv+zaPj8wIDAQABAoIBAQCsdq278+0c13d4 tViSh4k5r1w8D9IUdp9XU2/nVgckqA9nOVAvbkJc3FC+P7gsQgbUHKj0XoVbhU1S q461t8kduPH/oiGhAcKR8WurHEdE0OC6ewhLJAeCMRQwCrAorXXHh7icIt9ClCuG iSWUcXEy5Cidx3oL3r1xvIbV85fzdDtE9RC1I/kMjAy63S47YGiqh5vYmJkCa8rG Dsd1sEMDPr63XJpqJj3uHRcPvySgXTa+ssTmUH8WJlPTjvDB5hnPz+lkk2JKVPNu 8adzftZ6hSun+tsc4ZJp8XhGu/m/7MjxWh8MeupLHlXcOEsnj4uHQQsOM3zHojr3 aDCZiC1pAoGBAOAhwe1ujoS2VJ5RXJ9KMs7eBER/02MDgWZjo54Jv/jFxPWGslKk QQceuTe+PruRm41nzvk3q4iZXt8pG0bvpgigN2epcVx/O2ouRsUWWBT0JrVlEzha TIvWjtZ5tSQExXgHL3VlM9+ka40l+NldLSPn25+prizaqhalWuvTpP23AoGBANaY VhEI6yhp0BBUSATEv9lRgkwx3EbcnXNXPQjDMOthsyfq7FxbdOBEK1rwSDyuE6Ij zQGcTOfdiur5Ttg0OQilTJIXJAlpoeecOQ9yGma08c5FMXVJJvcZUuWRZWg1ocQj /hx0WVE9NwOoKwTBERv8HX7vJOFRZyvgkJwFxoulAoGAe4m/1XoZrga9z2GzNs10 AdgX7BW00x+MhH4pIiPnn1yK+nYa9jg4647Asnv3IfXZEnEEgRNxReKbi0+iDFBt aNW+lDGuHTi37AfD1EBDnpEQgO1MUcRb6rwBkTAWatsCaO00+HUmyX9cFLm4Vz7n caILyQ6CxZBlLgRIgDHxADMCgYEAtubsJGTHmZBmSCStpXLUWbOBLNQqfTM398DZ QoirP1PsUQ+IGUfSG/u+QCogR6fPEBkXeFHxsoY/Cvsm2lvYaKgK1VFn46Xm2vNq JuIH4pZCqp6LAv4weddZslT0a5eaowRSZ4o7PmTAaRuCXvD3VjTSJwhJFMo+90TV vEWn7gkCgYEAkk+unX9kYmKoUdLh22/tzQekBa8WqMxXDwzBCECTAs2GlpL/f73i zD15TnaNfLP6Q5RNb0N9tb0Gz1wSkwI1+jGAQLnh2K9X9cIVIqJn8Mf/KQa/wUDV Tb1j7FoGUEgX7vbsyWuTd8P76kNYyGqCss1XmbttcSolqpbIdlSUcO0= -----END RSA PRIVATE KEY----- h2-3.1.1/examples/tornado/tornado-server.py0000775000175000017500000000527513421652727021552 0ustar ubuntuubuntu00000000000000#!/usr/bin/env python # -*- coding: utf-8 -*- """ tornado-server.py ~~~~~~~~~~~~~~~~~ A fully-functional HTTP/2 server written for Tornado. """ import collections import json import ssl import tornado.gen import tornado.ioloop import tornado.iostream import tornado.tcpserver from h2.config import H2Configuration from h2.connection import H2Connection from h2.events import RequestReceived, DataReceived def create_ssl_context(certfile, keyfile): ssl_context = ssl.create_default_context(ssl.Purpose.CLIENT_AUTH) ssl_context.options |= ( ssl.OP_NO_TLSv1 | ssl.OP_NO_TLSv1_1 | ssl.OP_NO_COMPRESSION ) ssl_context.set_ciphers("ECDHE+AESGCM") ssl_context.load_cert_chain(certfile=certfile, keyfile=keyfile) ssl_context.set_alpn_protocols(["h2"]) return ssl_context class H2Server(tornado.tcpserver.TCPServer): @tornado.gen.coroutine def handle_stream(self, stream, address): handler = EchoHeadersHandler(stream) yield handler.handle() class EchoHeadersHandler(object): def __init__(self, stream): self.stream = stream config = H2Configuration(client_side=False) self.conn = H2Connection(config=config) @tornado.gen.coroutine def handle(self): self.conn.initiate_connection() yield self.stream.write(self.conn.data_to_send()) while True: try: data = yield self.stream.read_bytes(65535, partial=True) if not data: break events = self.conn.receive_data(data) for event in events: if isinstance(event, RequestReceived): self.request_received(event.headers, event.stream_id) elif isinstance(event, DataReceived): self.conn.reset_stream(event.stream_id) yield self.stream.write(self.conn.data_to_send()) except tornado.iostream.StreamClosedError: break def request_received(self, headers, stream_id): headers = collections.OrderedDict(headers) data = json.dumps({'headers': headers}, indent=4).encode('utf-8') response_headers = ( (':status', '200'), ('content-type', 'application/json'), ('content-length', str(len(data))), ('server', 'tornado-h2'), ) self.conn.send_headers(stream_id, response_headers) self.conn.send_data(stream_id, data, end_stream=True) if __name__ == '__main__': ssl_context = create_ssl_context('server.crt', 'server.key') server = H2Server(ssl_options=ssl_context) server.listen(8888) io_loop = tornado.ioloop.IOLoop.current() io_loop.start() h2-3.1.1/examples/twisted/0000775000175000017500000000000013521033126016212 5ustar ubuntuubuntu00000000000000h2-3.1.1/examples/twisted/head_request.py0000664000175000017500000000646413521033071021246 0ustar ubuntuubuntu00000000000000# -*- coding: utf-8 -*- """ head_request.py ~~~~~~~~~~~~~~~ A short example that demonstrates a client that makes HEAD requests to certain websites. This example is intended as a reproduction of nghttp2 issue 396, for the purposes of compatibility testing. """ from __future__ import print_function from twisted.internet import reactor from twisted.internet.endpoints import connectProtocol, SSL4ClientEndpoint from twisted.internet.protocol import Protocol from twisted.internet.ssl import optionsForClientTLS from hyperframe.frame import SettingsFrame from h2.connection import H2Connection from h2.events import ( ResponseReceived, DataReceived, StreamEnded, StreamReset, SettingsAcknowledged, ) AUTHORITY = u'nghttp2.org' PATH = '/httpbin/' SIZE = 4096 class H2Protocol(Protocol): def __init__(self): self.conn = H2Connection() self.known_proto = None self.request_made = False def connectionMade(self): self.conn.initiate_connection() # This reproduces the error in #396, by changing the header table size. self.conn.update_settings({SettingsFrame.HEADER_TABLE_SIZE: SIZE}) self.transport.write(self.conn.data_to_send()) def dataReceived(self, data): if not self.known_proto: self.known_proto = self.transport.negotiatedProtocol assert self.known_proto == b'h2' events = self.conn.receive_data(data) for event in events: if isinstance(event, ResponseReceived): self.handleResponse(event.headers, event.stream_id) elif isinstance(event, DataReceived): self.handleData(event.data, event.stream_id) elif isinstance(event, StreamEnded): self.endStream(event.stream_id) elif isinstance(event, SettingsAcknowledged): self.settingsAcked(event) elif isinstance(event, StreamReset): reactor.stop() raise RuntimeError("Stream reset: %d" % event.error_code) else: print(event) data = self.conn.data_to_send() if data: self.transport.write(data) def settingsAcked(self, event): # Having received the remote settings change, lets send our request. if not self.request_made: self.sendRequest() def handleResponse(self, response_headers, stream_id): for name, value in response_headers: print("%s: %s" % (name.decode('utf-8'), value.decode('utf-8'))) print("") def handleData(self, data, stream_id): print(data, end='') def endStream(self, stream_id): self.conn.close_connection() self.transport.write(self.conn.data_to_send()) self.transport.loseConnection() reactor.stop() def sendRequest(self): request_headers = [ (':method', 'HEAD'), (':authority', AUTHORITY), (':scheme', 'https'), (':path', PATH), ('user-agent', 'hyper-h2/1.0.0'), ] self.conn.send_headers(1, request_headers, end_stream=True) self.request_made = True options = optionsForClientTLS( hostname=AUTHORITY, acceptableProtocols=[b'h2'], ) connectProtocol( SSL4ClientEndpoint(reactor, AUTHORITY, 443, options), H2Protocol() ) reactor.run() h2-3.1.1/examples/twisted/post_request.py0000664000175000017500000002064713521033071021331 0ustar ubuntuubuntu00000000000000# -*- coding: utf-8 -*- """ post_request.py ~~~~~~~~~~~~~~~ A short example that demonstrates a client that makes POST requests to certain websites. This example is intended to demonstrate how to handle uploading request bodies. In this instance, a file will be uploaded. In order to handle arbitrary files, this example also demonstrates how to obey HTTP/2 flow control rules. Takes one command-line argument: a path to a file in the filesystem to upload. If none is present, uploads this file. """ from __future__ import print_function import mimetypes import os import sys from twisted.internet import reactor, defer from twisted.internet.endpoints import connectProtocol, SSL4ClientEndpoint from twisted.internet.protocol import Protocol from twisted.internet.ssl import optionsForClientTLS from h2.connection import H2Connection from h2.events import ( ResponseReceived, DataReceived, StreamEnded, StreamReset, WindowUpdated, SettingsAcknowledged, ) AUTHORITY = u'nghttp2.org' PATH = '/httpbin/post' class H2Protocol(Protocol): def __init__(self, file_path): self.conn = H2Connection() self.known_proto = None self.request_made = False self.request_complete = False self.file_path = file_path self.flow_control_deferred = None self.fileobj = None self.file_size = None def connectionMade(self): """ Called by Twisted when the TCP connection is established. We can start sending some data now: we should open with the connection preamble. """ self.conn.initiate_connection() self.transport.write(self.conn.data_to_send()) def dataReceived(self, data): """ Called by Twisted when data is received on the connection. We need to check a few things here. Firstly, we want to validate that we actually negotiated HTTP/2: if we didn't, we shouldn't proceed! Then, we want to pass the data to the protocol stack and check what events occurred. """ if not self.known_proto: self.known_proto = self.transport.negotiatedProtocol assert self.known_proto == b'h2' events = self.conn.receive_data(data) for event in events: if isinstance(event, ResponseReceived): self.handleResponse(event.headers) elif isinstance(event, DataReceived): self.handleData(event.data) elif isinstance(event, StreamEnded): self.endStream() elif isinstance(event, SettingsAcknowledged): self.settingsAcked(event) elif isinstance(event, StreamReset): reactor.stop() raise RuntimeError("Stream reset: %d" % event.error_code) elif isinstance(event, WindowUpdated): self.windowUpdated(event) data = self.conn.data_to_send() if data: self.transport.write(data) def settingsAcked(self, event): """ Called when the remote party ACKs our settings. We send a SETTINGS frame as part of the preamble, so if we want to be very polite we can wait until the ACK for that frame comes before we start sending our request. """ if not self.request_made: self.sendRequest() def handleResponse(self, response_headers): """ Handle the response by printing the response headers. """ for name, value in response_headers: print("%s: %s" % (name.decode('utf-8'), value.decode('utf-8'))) print("") def handleData(self, data): """ We handle data that's received by just printing it. """ print(data, end='') def endStream(self): """ We call this when the stream is cleanly ended by the remote peer. That means that the response is complete. Because this code only makes a single HTTP/2 request, once we receive the complete response we can safely tear the connection down and stop the reactor. We do that as cleanly as possible. """ self.request_complete = True self.conn.close_connection() self.transport.write(self.conn.data_to_send()) self.transport.loseConnection() def windowUpdated(self, event): """ We call this when the flow control window for the connection or the stream has been widened. If there's a flow control deferred present (that is, if we're blocked behind the flow control), we fire it. Otherwise, we do nothing. """ if self.flow_control_deferred is None: return # Make sure we remove the flow control deferred to avoid firing it # more than once. flow_control_deferred = self.flow_control_deferred self.flow_control_deferred = None flow_control_deferred.callback(None) def connectionLost(self, reason=None): """ Called by Twisted when the connection is gone. Regardless of whether it was clean or not, we want to stop the reactor. """ if self.fileobj is not None: self.fileobj.close() if reactor.running: reactor.stop() def sendRequest(self): """ Send the POST request. A POST request is made up of one headers frame, and then 0+ data frames. This method begins by sending the headers, and then starts a series of calls to send data. """ # First, we need to work out how large the file is. self.file_size = os.stat(self.file_path).st_size # Next, we want to guess a content-type and content-encoding. content_type, content_encoding = mimetypes.guess_type(self.file_path) # Now we can build a header block. request_headers = [ (':method', 'POST'), (':authority', AUTHORITY), (':scheme', 'https'), (':path', PATH), ('user-agent', 'hyper-h2/1.0.0'), ('content-length', str(self.file_size)), ] if content_type is not None: request_headers.append(('content-type', content_type)) if content_encoding is not None: request_headers.append(('content-encoding', content_encoding)) self.conn.send_headers(1, request_headers) self.request_made = True # We can now open the file. self.fileobj = open(self.file_path, 'rb') # We now need to send all the relevant data. We do this by checking # what the acceptable amount of data is to send, and sending it. If we # find ourselves blocked behind flow control, we then place a deferred # and wait until that deferred fires. self.sendFileData() def sendFileData(self): """ Send some file data on the connection. """ # Firstly, check what the flow control window is for stream 1. window_size = self.conn.local_flow_control_window(stream_id=1) # Next, check what the maximum frame size is. max_frame_size = self.conn.max_outbound_frame_size # We will send no more than the window size or the remaining file size # of data in this call, whichever is smaller. bytes_to_send = min(window_size, self.file_size) # We now need to send a number of data frames. while bytes_to_send > 0: chunk_size = min(bytes_to_send, max_frame_size) data_chunk = self.fileobj.read(chunk_size) self.conn.send_data(stream_id=1, data=data_chunk) bytes_to_send -= chunk_size self.file_size -= chunk_size # We've prepared a whole chunk of data to send. If the file is fully # sent, we also want to end the stream: we're done here. if self.file_size == 0: self.conn.end_stream(stream_id=1) else: # We've still got data left to send but the window is closed. Save # a Deferred that will call us when the window gets opened. self.flow_control_deferred = defer.Deferred() self.flow_control_deferred.addCallback(self.sendFileData) self.transport.write(self.conn.data_to_send()) try: filename = sys.argv[1] except IndexError: filename = __file__ options = optionsForClientTLS( hostname=AUTHORITY, acceptableProtocols=[b'h2'], ) connectProtocol( SSL4ClientEndpoint(reactor, AUTHORITY, 443, options), H2Protocol(filename) ) reactor.run() h2-3.1.1/examples/twisted/server.crt0000664000175000017500000000227413421652727020254 0ustar ubuntuubuntu00000000000000-----BEGIN CERTIFICATE----- MIIDUjCCAjoCCQCQmNzzpQTCijANBgkqhkiG9w0BAQUFADBrMQswCQYDVQQGEwJH QjEPMA0GA1UECBMGTG9uZG9uMQ8wDQYDVQQHEwZMb25kb24xETAPBgNVBAoTCGh5 cGVyLWgyMREwDwYDVQQLEwhoeXBleS1oMjEUMBIGA1UEAxMLZXhhbXBsZS5jb20w HhcNMTUwOTE2MjAyOTA0WhcNMTYwOTE1MjAyOTA0WjBrMQswCQYDVQQGEwJHQjEP MA0GA1UECBMGTG9uZG9uMQ8wDQYDVQQHEwZMb25kb24xETAPBgNVBAoTCGh5cGVy LWgyMREwDwYDVQQLEwhoeXBleS1oMjEUMBIGA1UEAxMLZXhhbXBsZS5jb20wggEi MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC74ZeB4Jdb5cnC9KXXLJuzjwTg 45q5EeShDYQe0TbKgreiUP6clU3BR0fFAVedN1q/LOuQ1HhvrDk1l4TfGF2bpCIq K+U9CnzcQknvdpyyVeOLtSsCjOPk4xydHwkQxwJvHVdtJx4CzDDqGbHNHCF/9gpQ lsa3JZW+tIZLK0XMEPFQ4XFXgegxTStO7kBBPaVIgG9Ooqc2MG4rjMNUpxa28WF1 SyqWTICf2N8T/C+fPzbQLKCWrFrKUP7WQlOaqPNQL9bCDhSTPRTwQOc2/MzVZ9gT Xr0Z+JMTXwkSMKO52adE1pmKt00jJ1ecZBiJFyjx0X6hH+/59dLbG/7No+PzAgMB AAEwDQYJKoZIhvcNAQEFBQADggEBAG3UhOCa0EemL2iY+C+PR6CwEHQ+n7vkBzNz gKOG+Q39spyzqU1qJAzBxLTE81bIQbDg0R8kcLWHVH2y4zViRxZ0jHUFKMgjONW+ Aj4evic/2Y/LxpLxCajECq/jeMHYrmQONszf9pbc0+exrQpgnwd8asfsM3d/FJS2 5DIWryCKs/61m9vYL8icWx/9cnfPkBoNv1ER+V1L1TH3ARvABh406SBaeqLTm/kG MNuKytKWJsQbNlxzWHVgkKzVsBKvYj0uIEJpClIhbe6XNYRDy8T8mKXVWhJuxH4p /agmCG3nxO8aCrUK/EVmbWmVIfCH3t7jlwMX1nJ8MsRE7Ydnk8I= -----END CERTIFICATE----- h2-3.1.1/examples/twisted/server.csr0000664000175000017500000000176113421652727020253 0ustar ubuntuubuntu00000000000000-----BEGIN CERTIFICATE REQUEST----- MIICsDCCAZgCAQAwazELMAkGA1UEBhMCR0IxDzANBgNVBAgTBkxvbmRvbjEPMA0G A1UEBxMGTG9uZG9uMREwDwYDVQQKEwhoeXBlci1oMjERMA8GA1UECxMIaHlwZXkt aDIxFDASBgNVBAMTC2V4YW1wbGUuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A MIIBCgKCAQEAu+GXgeCXW+XJwvSl1yybs48E4OOauRHkoQ2EHtE2yoK3olD+nJVN wUdHxQFXnTdavyzrkNR4b6w5NZeE3xhdm6QiKivlPQp83EJJ73acslXji7UrAozj 5OMcnR8JEMcCbx1XbSceAsww6hmxzRwhf/YKUJbGtyWVvrSGSytFzBDxUOFxV4Ho MU0rTu5AQT2lSIBvTqKnNjBuK4zDVKcWtvFhdUsqlkyAn9jfE/wvnz820Cyglqxa ylD+1kJTmqjzUC/Wwg4Ukz0U8EDnNvzM1WfYE169GfiTE18JEjCjudmnRNaZirdN IydXnGQYiRco8dF+oR/v+fXS2xv+zaPj8wIDAQABoAAwDQYJKoZIhvcNAQEFBQAD ggEBACZpSoZWxHU5uagpM2Vinh2E7CXiMAlBc6NXhQMD/3fycr9sX4d/+y9Gy3bL OfEOHBPlQVGrt05aiTh7m5s3HQfsH8l3RfKpfzCfoqd2ESVwgB092bJwY9fBnkw/ UzIHvSnlaKc78h+POUoATOb4faQ8P04wzJHzckbCDI8zRzBZTMVGuiWUopq7K5Ce VSesbqHHnW9ob/apigKNE0k7et/28NOXNEP90tTsz98yN3TP+Nv9puwvT9JZOOoG 0PZIQKJIaZ1NZoNQHLN9gXz012XWa99cBE0qNiBUugXlNhXjkIIM8FIhDQOREB18 0KDxEma+A0quyjnDMwPSoZsMca4= -----END CERTIFICATE REQUEST----- h2-3.1.1/examples/twisted/server.key0000664000175000017500000000321713421652727020252 0ustar ubuntuubuntu00000000000000-----BEGIN RSA PRIVATE KEY----- MIIEpQIBAAKCAQEAu+GXgeCXW+XJwvSl1yybs48E4OOauRHkoQ2EHtE2yoK3olD+ nJVNwUdHxQFXnTdavyzrkNR4b6w5NZeE3xhdm6QiKivlPQp83EJJ73acslXji7Ur Aozj5OMcnR8JEMcCbx1XbSceAsww6hmxzRwhf/YKUJbGtyWVvrSGSytFzBDxUOFx V4HoMU0rTu5AQT2lSIBvTqKnNjBuK4zDVKcWtvFhdUsqlkyAn9jfE/wvnz820Cyg lqxaylD+1kJTmqjzUC/Wwg4Ukz0U8EDnNvzM1WfYE169GfiTE18JEjCjudmnRNaZ irdNIydXnGQYiRco8dF+oR/v+fXS2xv+zaPj8wIDAQABAoIBAQCsdq278+0c13d4 tViSh4k5r1w8D9IUdp9XU2/nVgckqA9nOVAvbkJc3FC+P7gsQgbUHKj0XoVbhU1S q461t8kduPH/oiGhAcKR8WurHEdE0OC6ewhLJAeCMRQwCrAorXXHh7icIt9ClCuG iSWUcXEy5Cidx3oL3r1xvIbV85fzdDtE9RC1I/kMjAy63S47YGiqh5vYmJkCa8rG Dsd1sEMDPr63XJpqJj3uHRcPvySgXTa+ssTmUH8WJlPTjvDB5hnPz+lkk2JKVPNu 8adzftZ6hSun+tsc4ZJp8XhGu/m/7MjxWh8MeupLHlXcOEsnj4uHQQsOM3zHojr3 aDCZiC1pAoGBAOAhwe1ujoS2VJ5RXJ9KMs7eBER/02MDgWZjo54Jv/jFxPWGslKk QQceuTe+PruRm41nzvk3q4iZXt8pG0bvpgigN2epcVx/O2ouRsUWWBT0JrVlEzha TIvWjtZ5tSQExXgHL3VlM9+ka40l+NldLSPn25+prizaqhalWuvTpP23AoGBANaY VhEI6yhp0BBUSATEv9lRgkwx3EbcnXNXPQjDMOthsyfq7FxbdOBEK1rwSDyuE6Ij zQGcTOfdiur5Ttg0OQilTJIXJAlpoeecOQ9yGma08c5FMXVJJvcZUuWRZWg1ocQj /hx0WVE9NwOoKwTBERv8HX7vJOFRZyvgkJwFxoulAoGAe4m/1XoZrga9z2GzNs10 AdgX7BW00x+MhH4pIiPnn1yK+nYa9jg4647Asnv3IfXZEnEEgRNxReKbi0+iDFBt aNW+lDGuHTi37AfD1EBDnpEQgO1MUcRb6rwBkTAWatsCaO00+HUmyX9cFLm4Vz7n caILyQ6CxZBlLgRIgDHxADMCgYEAtubsJGTHmZBmSCStpXLUWbOBLNQqfTM398DZ QoirP1PsUQ+IGUfSG/u+QCogR6fPEBkXeFHxsoY/Cvsm2lvYaKgK1VFn46Xm2vNq JuIH4pZCqp6LAv4weddZslT0a5eaowRSZ4o7PmTAaRuCXvD3VjTSJwhJFMo+90TV vEWn7gkCgYEAkk+unX9kYmKoUdLh22/tzQekBa8WqMxXDwzBCECTAs2GlpL/f73i zD15TnaNfLP6Q5RNb0N9tb0Gz1wSkwI1+jGAQLnh2K9X9cIVIqJn8Mf/KQa/wUDV Tb1j7FoGUEgX7vbsyWuTd8P76kNYyGqCss1XmbttcSolqpbIdlSUcO0= -----END RSA PRIVATE KEY----- h2-3.1.1/examples/twisted/twisted-server.py0000664000175000017500000001324213521033071021554 0ustar ubuntuubuntu00000000000000# -*- coding: utf-8 -*- """ twisted-server.py ~~~~~~~~~~~~~~~~~ A fully-functional HTTP/2 server written for Twisted. """ import functools import mimetypes import os import os.path import sys from OpenSSL import crypto from twisted.internet.defer import Deferred, inlineCallbacks from twisted.internet.protocol import Protocol, Factory from twisted.internet import endpoints, reactor, ssl from h2.config import H2Configuration from h2.connection import H2Connection from h2.events import ( RequestReceived, DataReceived, WindowUpdated ) from h2.exceptions import ProtocolError def close_file(file, d): file.close() READ_CHUNK_SIZE = 8192 class H2Protocol(Protocol): def __init__(self, root): config = H2Configuration(client_side=False) self.conn = H2Connection(config=config) self.known_proto = None self.root = root self._flow_control_deferreds = {} def connectionMade(self): self.conn.initiate_connection() self.transport.write(self.conn.data_to_send()) def dataReceived(self, data): if not self.known_proto: self.known_proto = True try: events = self.conn.receive_data(data) except ProtocolError: if self.conn.data_to_send: self.transport.write(self.conn.data_to_send()) self.transport.loseConnection() else: for event in events: if isinstance(event, RequestReceived): self.requestReceived(event.headers, event.stream_id) elif isinstance(event, DataReceived): self.dataFrameReceived(event.stream_id) elif isinstance(event, WindowUpdated): self.windowUpdated(event) if self.conn.data_to_send: self.transport.write(self.conn.data_to_send()) def requestReceived(self, headers, stream_id): headers = dict(headers) # Invalid conversion, fix later. assert headers[b':method'] == b'GET' path = headers[b':path'].lstrip(b'/') full_path = os.path.join(self.root, path) if not os.path.exists(full_path): response_headers = ( (':status', '404'), ('content-length', '0'), ('server', 'twisted-h2'), ) self.conn.send_headers( stream_id, response_headers, end_stream=True ) self.transport.write(self.conn.data_to_send()) else: self.sendFile(full_path, stream_id) return def dataFrameReceived(self, stream_id): self.conn.reset_stream(stream_id) self.transport.write(self.conn.data_to_send()) def sendFile(self, file_path, stream_id): filesize = os.stat(file_path).st_size content_type, content_encoding = mimetypes.guess_type( file_path.decode('utf-8') ) response_headers = [ (':status', '200'), ('content-length', str(filesize)), ('server', 'twisted-h2'), ] if content_type: response_headers.append(('content-type', content_type)) if content_encoding: response_headers.append(('content-encoding', content_encoding)) self.conn.send_headers(stream_id, response_headers) self.transport.write(self.conn.data_to_send()) f = open(file_path, 'rb') d = self._send_file(f, stream_id) d.addErrback(functools.partial(close_file, f)) def windowUpdated(self, event): """ Handle a WindowUpdated event by firing any waiting data sending callbacks. """ stream_id = event.stream_id if stream_id and stream_id in self._flow_control_deferreds: d = self._flow_control_deferreds.pop(stream_id) d.callback(event.delta) elif not stream_id: for d in self._flow_control_deferreds.values(): d.callback(event.delta) self._flow_control_deferreds = {} return @inlineCallbacks def _send_file(self, file, stream_id): """ This callback sends more data for a given file on the stream. """ keep_reading = True while keep_reading: while not self.conn.remote_flow_control_window(stream_id): yield self.wait_for_flow_control(stream_id) chunk_size = min( self.conn.remote_flow_control_window(stream_id), READ_CHUNK_SIZE ) data = file.read(chunk_size) keep_reading = len(data) == chunk_size self.conn.send_data(stream_id, data, not keep_reading) self.transport.write(self.conn.data_to_send()) if not keep_reading: break file.close() def wait_for_flow_control(self, stream_id): """ Returns a Deferred that fires when the flow control window is opened. """ d = Deferred() self._flow_control_deferreds[stream_id] = d return d class H2Factory(Factory): def __init__(self, root): self.root = root def buildProtocol(self, addr): print(H2Protocol) return H2Protocol(self.root) root = sys.argv[1].encode('utf-8') with open('server.crt', 'r') as f: cert_data = f.read() with open('server.key', 'r') as f: key_data = f.read() cert = crypto.load_certificate(crypto.FILETYPE_PEM, cert_data) key = crypto.load_privatekey(crypto.FILETYPE_PEM, key_data) options = ssl.CertificateOptions( privateKey=key, certificate=cert, acceptableProtocols=[b'h2'], ) endpoint = endpoints.SSL4ServerEndpoint(reactor, 8080, options, backlog=128) endpoint.listen(H2Factory(root)) reactor.run() h2-3.1.1/h2/0000775000175000017500000000000013521033126013222 5ustar ubuntuubuntu00000000000000h2-3.1.1/h2/__init__.py0000664000175000017500000000012613521033104015326 0ustar ubuntuubuntu00000000000000# -*- coding: utf-8 -*- """ h2 ~~ A HTTP/2 implementation. """ __version__ = '3.1.1' h2-3.1.1/h2/config.py0000664000175000017500000001454213421652727015064 0ustar ubuntuubuntu00000000000000# -*- coding: utf-8 -*- """ h2/config ~~~~~~~~~ Objects for controlling the configuration of the HTTP/2 stack. """ class _BooleanConfigOption(object): """ Descriptor for handling a boolean config option. This will block attempts to set boolean config options to non-bools. """ def __init__(self, name): self.name = name self.attr_name = '_%s' % self.name def __get__(self, instance, owner): return getattr(instance, self.attr_name) def __set__(self, instance, value): if not isinstance(value, bool): raise ValueError("%s must be a bool" % self.name) setattr(instance, self.attr_name, value) class DummyLogger(object): """ An Logger object that does not actual logging, hence a DummyLogger. For the class the log operation is merely a no-op. The intent is to avoid conditionals being sprinkled throughout the hyper-h2 code for calls to logging functions when no logger is passed into the corresponding object. """ def __init__(self, *vargs): pass def debug(self, *vargs, **kwargs): """ No-op logging. Only level needed for now. """ pass class H2Configuration(object): """ An object that controls the way a single HTTP/2 connection behaves. This object allows the users to customize behaviour. In particular, it allows users to enable or disable optional features, or to otherwise handle various unusual behaviours. This object has very little behaviour of its own: it mostly just ensures that configuration is self-consistent. :param client_side: Whether this object is to be used on the client side of a connection, or on the server side. Affects the logic used by the state machine, the default settings values, the allowable stream IDs, and several other properties. Defaults to ``True``. :type client_side: ``bool`` :param header_encoding: Controls whether the headers emitted by this object in events are transparently decoded to ``unicode`` strings, and what encoding is used to do that decoding. This defaults to ``None``, meaning that headers will be returned as bytes. To automatically decode headers (that is, to return them as unicode strings), this can be set to the string name of any encoding, e.g. ``'utf-8'``. .. versionchanged:: 3.0.0 Changed default value from ``'utf-8'`` to ``None`` :type header_encoding: ``str``, ``False``, or ``None`` :param validate_outbound_headers: Controls whether the headers emitted by this object are validated against the rules in RFC 7540. Disabling this setting will cause outbound header validation to be skipped, and allow the object to emit headers that may be illegal according to RFC 7540. Defaults to ``True``. :type validate_outbound_headers: ``bool`` :param normalize_outbound_headers: Controls whether the headers emitted by this object are normalized before sending. Disabling this setting will cause outbound header normalization to be skipped, and allow the object to emit headers that may be illegal according to RFC 7540. Defaults to ``True``. :type normalize_outbound_headers: ``bool`` :param validate_inbound_headers: Controls whether the headers received by this object are validated against the rules in RFC 7540. Disabling this setting will cause inbound header validation to be skipped, and allow the object to receive headers that may be illegal according to RFC 7540. Defaults to ``True``. :type validate_inbound_headers: ``bool`` :param normalize_inbound_headers: Controls whether the headers received by this object are normalized according to the rules of RFC 7540. Disabling this setting may lead to hyper-h2 emitting header blocks that some RFCs forbid, e.g. with multiple cookie fields. .. versionadded:: 3.0.0 :type normalize_inbound_headers: ``bool`` :param logger: A logger that conforms to the requirements for this module, those being no I/O and no context switches, which is needed in order to run in asynchronous operation. .. versionadded:: 2.6.0 :type logger: ``logging.Logger`` """ client_side = _BooleanConfigOption('client_side') validate_outbound_headers = _BooleanConfigOption( 'validate_outbound_headers' ) normalize_outbound_headers = _BooleanConfigOption( 'normalize_outbound_headers' ) validate_inbound_headers = _BooleanConfigOption( 'validate_inbound_headers' ) normalize_inbound_headers = _BooleanConfigOption( 'normalize_inbound_headers' ) def __init__(self, client_side=True, header_encoding=None, validate_outbound_headers=True, normalize_outbound_headers=True, validate_inbound_headers=True, normalize_inbound_headers=True, logger=None): self.client_side = client_side self.header_encoding = header_encoding self.validate_outbound_headers = validate_outbound_headers self.normalize_outbound_headers = normalize_outbound_headers self.validate_inbound_headers = validate_inbound_headers self.normalize_inbound_headers = normalize_inbound_headers self.logger = logger or DummyLogger(__name__) @property def header_encoding(self): """ Controls whether the headers emitted by this object in events are transparently decoded to ``unicode`` strings, and what encoding is used to do that decoding. This defaults to ``None``, meaning that headers will be returned as bytes. To automatically decode headers (that is, to return them as unicode strings), this can be set to the string name of any encoding, e.g. ``'utf-8'``. """ return self._header_encoding @header_encoding.setter def header_encoding(self, value): """ Enforces constraints on the value of header encoding. """ if not isinstance(value, (bool, str, type(None))): raise ValueError("header_encoding must be bool, string, or None") if value is True: raise ValueError("header_encoding cannot be True") self._header_encoding = value h2-3.1.1/h2/connection.py0000664000175000017500000023721113521033071015740 0ustar ubuntuubuntu00000000000000# -*- coding: utf-8 -*- """ h2/connection ~~~~~~~~~~~~~ An implementation of a HTTP/2 connection. """ import base64 from enum import Enum, IntEnum from hyperframe.exceptions import InvalidPaddingError from hyperframe.frame import ( GoAwayFrame, WindowUpdateFrame, HeadersFrame, DataFrame, PingFrame, PushPromiseFrame, SettingsFrame, RstStreamFrame, PriorityFrame, ContinuationFrame, AltSvcFrame, ExtensionFrame ) from hpack.hpack import Encoder, Decoder from hpack.exceptions import HPACKError, OversizedHeaderListError from .config import H2Configuration from .errors import ErrorCodes, _error_code_from_int from .events import ( WindowUpdated, RemoteSettingsChanged, PingReceived, PingAckReceived, SettingsAcknowledged, ConnectionTerminated, PriorityUpdated, AlternativeServiceAvailable, UnknownFrameReceived ) from .exceptions import ( ProtocolError, NoSuchStreamError, FlowControlError, FrameTooLargeError, TooManyStreamsError, StreamClosedError, StreamIDTooLowError, NoAvailableStreamIDError, RFC1122Error, DenialOfServiceError ) from .frame_buffer import FrameBuffer from .settings import Settings, SettingCodes from .stream import H2Stream, StreamClosedBy from .utilities import SizeLimitDict, guard_increment_window from .windows import WindowManager class ConnectionState(Enum): IDLE = 0 CLIENT_OPEN = 1 SERVER_OPEN = 2 CLOSED = 3 class ConnectionInputs(Enum): SEND_HEADERS = 0 SEND_PUSH_PROMISE = 1 SEND_DATA = 2 SEND_GOAWAY = 3 SEND_WINDOW_UPDATE = 4 SEND_PING = 5 SEND_SETTINGS = 6 SEND_RST_STREAM = 7 SEND_PRIORITY = 8 RECV_HEADERS = 9 RECV_PUSH_PROMISE = 10 RECV_DATA = 11 RECV_GOAWAY = 12 RECV_WINDOW_UPDATE = 13 RECV_PING = 14 RECV_SETTINGS = 15 RECV_RST_STREAM = 16 RECV_PRIORITY = 17 SEND_ALTERNATIVE_SERVICE = 18 # Added in 2.3.0 RECV_ALTERNATIVE_SERVICE = 19 # Added in 2.3.0 class AllowedStreamIDs(IntEnum): EVEN = 0 ODD = 1 class H2ConnectionStateMachine(object): """ A single HTTP/2 connection state machine. This state machine, while defined in its own class, is logically part of the H2Connection class also defined in this file. The state machine itself maintains very little state directly, instead focusing entirely on managing state transitions. """ # For the purposes of this state machine we treat HEADERS and their # associated CONTINUATION frames as a single jumbo frame. The protocol # allows/requires this by preventing other frames from being interleved in # between HEADERS/CONTINUATION frames. # # The _transitions dictionary contains a mapping of tuples of # (state, input) to tuples of (side_effect_function, end_state). This map # contains all allowed transitions: anything not in this map is invalid # and immediately causes a transition to ``closed``. _transitions = { # State: idle (ConnectionState.IDLE, ConnectionInputs.SEND_HEADERS): (None, ConnectionState.CLIENT_OPEN), (ConnectionState.IDLE, ConnectionInputs.RECV_HEADERS): (None, ConnectionState.SERVER_OPEN), (ConnectionState.IDLE, ConnectionInputs.SEND_SETTINGS): (None, ConnectionState.IDLE), (ConnectionState.IDLE, ConnectionInputs.RECV_SETTINGS): (None, ConnectionState.IDLE), (ConnectionState.IDLE, ConnectionInputs.SEND_WINDOW_UPDATE): (None, ConnectionState.IDLE), (ConnectionState.IDLE, ConnectionInputs.RECV_WINDOW_UPDATE): (None, ConnectionState.IDLE), (ConnectionState.IDLE, ConnectionInputs.SEND_PING): (None, ConnectionState.IDLE), (ConnectionState.IDLE, ConnectionInputs.RECV_PING): (None, ConnectionState.IDLE), (ConnectionState.IDLE, ConnectionInputs.SEND_GOAWAY): (None, ConnectionState.CLOSED), (ConnectionState.IDLE, ConnectionInputs.RECV_GOAWAY): (None, ConnectionState.CLOSED), (ConnectionState.IDLE, ConnectionInputs.SEND_PRIORITY): (None, ConnectionState.IDLE), (ConnectionState.IDLE, ConnectionInputs.RECV_PRIORITY): (None, ConnectionState.IDLE), (ConnectionState.IDLE, ConnectionInputs.SEND_ALTERNATIVE_SERVICE): (None, ConnectionState.SERVER_OPEN), (ConnectionState.IDLE, ConnectionInputs.RECV_ALTERNATIVE_SERVICE): (None, ConnectionState.CLIENT_OPEN), # State: open, client side. (ConnectionState.CLIENT_OPEN, ConnectionInputs.SEND_HEADERS): (None, ConnectionState.CLIENT_OPEN), (ConnectionState.CLIENT_OPEN, ConnectionInputs.SEND_DATA): (None, ConnectionState.CLIENT_OPEN), (ConnectionState.CLIENT_OPEN, ConnectionInputs.SEND_GOAWAY): (None, ConnectionState.CLOSED), (ConnectionState.CLIENT_OPEN, ConnectionInputs.SEND_WINDOW_UPDATE): (None, ConnectionState.CLIENT_OPEN), (ConnectionState.CLIENT_OPEN, ConnectionInputs.SEND_PING): (None, ConnectionState.CLIENT_OPEN), (ConnectionState.CLIENT_OPEN, ConnectionInputs.SEND_SETTINGS): (None, ConnectionState.CLIENT_OPEN), (ConnectionState.CLIENT_OPEN, ConnectionInputs.SEND_PRIORITY): (None, ConnectionState.CLIENT_OPEN), (ConnectionState.CLIENT_OPEN, ConnectionInputs.RECV_HEADERS): (None, ConnectionState.CLIENT_OPEN), (ConnectionState.CLIENT_OPEN, ConnectionInputs.RECV_PUSH_PROMISE): (None, ConnectionState.CLIENT_OPEN), (ConnectionState.CLIENT_OPEN, ConnectionInputs.RECV_DATA): (None, ConnectionState.CLIENT_OPEN), (ConnectionState.CLIENT_OPEN, ConnectionInputs.RECV_GOAWAY): (None, ConnectionState.CLOSED), (ConnectionState.CLIENT_OPEN, ConnectionInputs.RECV_WINDOW_UPDATE): (None, ConnectionState.CLIENT_OPEN), (ConnectionState.CLIENT_OPEN, ConnectionInputs.RECV_PING): (None, ConnectionState.CLIENT_OPEN), (ConnectionState.CLIENT_OPEN, ConnectionInputs.RECV_SETTINGS): (None, ConnectionState.CLIENT_OPEN), (ConnectionState.CLIENT_OPEN, ConnectionInputs.SEND_RST_STREAM): (None, ConnectionState.CLIENT_OPEN), (ConnectionState.CLIENT_OPEN, ConnectionInputs.RECV_RST_STREAM): (None, ConnectionState.CLIENT_OPEN), (ConnectionState.CLIENT_OPEN, ConnectionInputs.RECV_PRIORITY): (None, ConnectionState.CLIENT_OPEN), (ConnectionState.CLIENT_OPEN, ConnectionInputs.RECV_ALTERNATIVE_SERVICE): (None, ConnectionState.CLIENT_OPEN), # State: open, server side. (ConnectionState.SERVER_OPEN, ConnectionInputs.SEND_HEADERS): (None, ConnectionState.SERVER_OPEN), (ConnectionState.SERVER_OPEN, ConnectionInputs.SEND_PUSH_PROMISE): (None, ConnectionState.SERVER_OPEN), (ConnectionState.SERVER_OPEN, ConnectionInputs.SEND_DATA): (None, ConnectionState.SERVER_OPEN), (ConnectionState.SERVER_OPEN, ConnectionInputs.SEND_GOAWAY): (None, ConnectionState.CLOSED), (ConnectionState.SERVER_OPEN, ConnectionInputs.SEND_WINDOW_UPDATE): (None, ConnectionState.SERVER_OPEN), (ConnectionState.SERVER_OPEN, ConnectionInputs.SEND_PING): (None, ConnectionState.SERVER_OPEN), (ConnectionState.SERVER_OPEN, ConnectionInputs.SEND_SETTINGS): (None, ConnectionState.SERVER_OPEN), (ConnectionState.SERVER_OPEN, ConnectionInputs.SEND_PRIORITY): (None, ConnectionState.SERVER_OPEN), (ConnectionState.SERVER_OPEN, ConnectionInputs.RECV_HEADERS): (None, ConnectionState.SERVER_OPEN), (ConnectionState.SERVER_OPEN, ConnectionInputs.RECV_DATA): (None, ConnectionState.SERVER_OPEN), (ConnectionState.SERVER_OPEN, ConnectionInputs.RECV_GOAWAY): (None, ConnectionState.CLOSED), (ConnectionState.SERVER_OPEN, ConnectionInputs.RECV_WINDOW_UPDATE): (None, ConnectionState.SERVER_OPEN), (ConnectionState.SERVER_OPEN, ConnectionInputs.RECV_PING): (None, ConnectionState.SERVER_OPEN), (ConnectionState.SERVER_OPEN, ConnectionInputs.RECV_SETTINGS): (None, ConnectionState.SERVER_OPEN), (ConnectionState.SERVER_OPEN, ConnectionInputs.RECV_PRIORITY): (None, ConnectionState.SERVER_OPEN), (ConnectionState.SERVER_OPEN, ConnectionInputs.SEND_RST_STREAM): (None, ConnectionState.SERVER_OPEN), (ConnectionState.SERVER_OPEN, ConnectionInputs.RECV_RST_STREAM): (None, ConnectionState.SERVER_OPEN), (ConnectionState.SERVER_OPEN, ConnectionInputs.SEND_ALTERNATIVE_SERVICE): (None, ConnectionState.SERVER_OPEN), (ConnectionState.SERVER_OPEN, ConnectionInputs.RECV_ALTERNATIVE_SERVICE): (None, ConnectionState.SERVER_OPEN), # State: closed (ConnectionState.CLOSED, ConnectionInputs.SEND_GOAWAY): (None, ConnectionState.CLOSED), (ConnectionState.CLOSED, ConnectionInputs.RECV_GOAWAY): (None, ConnectionState.CLOSED), } def __init__(self): self.state = ConnectionState.IDLE def process_input(self, input_): """ Process a specific input in the state machine. """ if not isinstance(input_, ConnectionInputs): raise ValueError("Input must be an instance of ConnectionInputs") try: func, target_state = self._transitions[(self.state, input_)] except KeyError: old_state = self.state self.state = ConnectionState.CLOSED raise ProtocolError( "Invalid input %s in state %s" % (input_, old_state) ) else: self.state = target_state if func is not None: # pragma: no cover return func() return [] class H2Connection(object): """ A low-level HTTP/2 connection object. This handles building and receiving frames and maintains both connection and per-stream state for all streams on this connection. This wraps a HTTP/2 Connection state machine implementation, ensuring that frames can only be sent/received when the connection is in a valid state. It also builds stream state machines on demand to ensure that the constraints of those state machines are met as well. Attempts to create frames that cannot be sent will raise a ``ProtocolError``. .. versionchanged:: 2.3.0 Added the ``header_encoding`` keyword argument. .. versionchanged:: 2.5.0 Added the ``config`` keyword argument. Deprecated the ``client_side`` and ``header_encoding`` parameters. .. versionchanged:: 3.0.0 Removed deprecated parameters and properties. :param config: The configuration for the HTTP/2 connection. .. versionadded:: 2.5.0 :type config: :class:`H2Configuration ` """ # The initial maximum outbound frame size. This can be changed by receiving # a settings frame. DEFAULT_MAX_OUTBOUND_FRAME_SIZE = 65535 # The initial maximum inbound frame size. This is somewhat arbitrarily # chosen. DEFAULT_MAX_INBOUND_FRAME_SIZE = 2**24 # The highest acceptable stream ID. HIGHEST_ALLOWED_STREAM_ID = 2**31 - 1 # The largest acceptable window increment. MAX_WINDOW_INCREMENT = 2**31 - 1 # The initial default value of SETTINGS_MAX_HEADER_LIST_SIZE. DEFAULT_MAX_HEADER_LIST_SIZE = 2**16 # Keep in memory limited amount of results for streams closes MAX_CLOSED_STREAMS = 2**16 def __init__(self, config=None): self.state_machine = H2ConnectionStateMachine() self.streams = {} self.highest_inbound_stream_id = 0 self.highest_outbound_stream_id = 0 self.encoder = Encoder() self.decoder = Decoder() # This won't always actually do anything: for versions of HPACK older # than 2.3.0 it does nothing. However, we have to try! self.decoder.max_header_list_size = self.DEFAULT_MAX_HEADER_LIST_SIZE #: The configuration for this HTTP/2 connection object. #: #: .. versionadded:: 2.5.0 self.config = config if self.config is None: self.config = H2Configuration( client_side=True, ) # Objects that store settings, including defaults. # # We set the MAX_CONCURRENT_STREAMS value to 100 because its default is # unbounded, and that's a dangerous default because it allows # essentially unbounded resources to be allocated regardless of how # they will be used. 100 should be suitable for the average # application. This default obviously does not apply to the remote # peer's settings: the remote peer controls them! # # We also set MAX_HEADER_LIST_SIZE to a reasonable value. This is to # advertise our defence against CVE-2016-6581. However, not all # versions of HPACK will let us do it. That's ok: we should at least # suggest that we're not vulnerable. self.local_settings = Settings( client=self.config.client_side, initial_values={ SettingCodes.MAX_CONCURRENT_STREAMS: 100, SettingCodes.MAX_HEADER_LIST_SIZE: self.DEFAULT_MAX_HEADER_LIST_SIZE, } ) self.remote_settings = Settings(client=not self.config.client_side) # The current value of the connection flow control windows on the # connection. self.outbound_flow_control_window = ( self.remote_settings.initial_window_size ) #: The maximum size of a frame that can be emitted by this peer, in #: bytes. self.max_outbound_frame_size = self.remote_settings.max_frame_size #: The maximum size of a frame that can be received by this peer, in #: bytes. self.max_inbound_frame_size = self.local_settings.max_frame_size # Buffer for incoming data. self.incoming_buffer = FrameBuffer(server=not self.config.client_side) # A private variable to store a sequence of received header frames # until completion. self._header_frames = [] # Data that needs to be sent. self._data_to_send = bytearray() # Keeps track of how streams are closed. # Used to ensure that we don't blow up in the face of frames that were # in flight when a RST_STREAM was sent. # Also used to determine whether we should consider a frame received # while a stream is closed as either a stream error or a connection # error. self._closed_streams = SizeLimitDict( size_limit=self.MAX_CLOSED_STREAMS ) # The flow control window manager for the connection. self._inbound_flow_control_window_manager = WindowManager( max_window_size=self.local_settings.initial_window_size ) # When in doubt use dict-dispatch. self._frame_dispatch_table = { HeadersFrame: self._receive_headers_frame, PushPromiseFrame: self._receive_push_promise_frame, SettingsFrame: self._receive_settings_frame, DataFrame: self._receive_data_frame, WindowUpdateFrame: self._receive_window_update_frame, PingFrame: self._receive_ping_frame, RstStreamFrame: self._receive_rst_stream_frame, PriorityFrame: self._receive_priority_frame, GoAwayFrame: self._receive_goaway_frame, ContinuationFrame: self._receive_naked_continuation, AltSvcFrame: self._receive_alt_svc_frame, ExtensionFrame: self._receive_unknown_frame } def _prepare_for_sending(self, frames): if not frames: return self._data_to_send += b''.join(f.serialize() for f in frames) assert all(f.body_len <= self.max_outbound_frame_size for f in frames) def _open_streams(self, remainder): """ A common method of counting number of open streams. Returns the number of streams that are open *and* that have (stream ID % 2) == remainder. While it iterates, also deletes any closed streams. """ count = 0 to_delete = [] for stream_id, stream in self.streams.items(): if stream.open and (stream_id % 2 == remainder): count += 1 elif stream.closed: to_delete.append(stream_id) for stream_id in to_delete: stream = self.streams.pop(stream_id) self._closed_streams[stream_id] = stream.closed_by return count @property def open_outbound_streams(self): """ The current number of open outbound streams. """ outbound_numbers = int(self.config.client_side) return self._open_streams(outbound_numbers) @property def open_inbound_streams(self): """ The current number of open inbound streams. """ inbound_numbers = int(not self.config.client_side) return self._open_streams(inbound_numbers) @property def inbound_flow_control_window(self): """ The size of the inbound flow control window for the connection. This is rarely publicly useful: instead, use :meth:`remote_flow_control_window `. This shortcut is largely present to provide a shortcut to this data. """ return self._inbound_flow_control_window_manager.current_window_size def _begin_new_stream(self, stream_id, allowed_ids): """ Initiate a new stream. .. versionchanged:: 2.0.0 Removed this function from the public API. :param stream_id: The ID of the stream to open. :param allowed_ids: What kind of stream ID is allowed. """ self.config.logger.debug( "Attempting to initiate stream ID %d", stream_id ) outbound = self._stream_id_is_outbound(stream_id) highest_stream_id = ( self.highest_outbound_stream_id if outbound else self.highest_inbound_stream_id ) if stream_id <= highest_stream_id: raise StreamIDTooLowError(stream_id, highest_stream_id) if (stream_id % 2) != int(allowed_ids): raise ProtocolError( "Invalid stream ID for peer." ) s = H2Stream( stream_id, config=self.config, inbound_window_size=self.local_settings.initial_window_size, outbound_window_size=self.remote_settings.initial_window_size ) self.config.logger.debug("Stream ID %d created", stream_id) s.max_inbound_frame_size = self.max_inbound_frame_size s.max_outbound_frame_size = self.max_outbound_frame_size self.streams[stream_id] = s self.config.logger.debug("Current streams: %s", self.streams.keys()) if outbound: self.highest_outbound_stream_id = stream_id else: self.highest_inbound_stream_id = stream_id return s def initiate_connection(self): """ Provides any data that needs to be sent at the start of the connection. Must be called for both clients and servers. """ self.config.logger.debug("Initializing connection") self.state_machine.process_input(ConnectionInputs.SEND_SETTINGS) if self.config.client_side: preamble = b'PRI * HTTP/2.0\r\n\r\nSM\r\n\r\n' else: preamble = b'' f = SettingsFrame(0) for setting, value in self.local_settings.items(): f.settings[setting] = value self.config.logger.debug( "Send Settings frame: %s", self.local_settings ) self._data_to_send += preamble + f.serialize() def initiate_upgrade_connection(self, settings_header=None): """ Call to initialise the connection object for use with an upgraded HTTP/2 connection (i.e. a connection negotiated using the ``Upgrade: h2c`` HTTP header). This method differs from :meth:`initiate_connection ` in several ways. Firstly, it handles the additional SETTINGS frame that is sent in the ``HTTP2-Settings`` header field. When called on a client connection, this method will return a bytestring that the caller can put in the ``HTTP2-Settings`` field they send on their initial request. When called on a server connection, the user **must** provide the value they received from the client in the ``HTTP2-Settings`` header field to the ``settings_header`` argument, which will be used appropriately. Additionally, this method sets up stream 1 in a half-closed state appropriate for this side of the connection, to reflect the fact that the request is already complete. Finally, this method also prepares the appropriate preamble to be sent after the upgrade. .. versionadded:: 2.3.0 :param settings_header: (optional, server-only): The value of the ``HTTP2-Settings`` header field received from the client. :type settings_header: ``bytes`` :returns: For clients, a bytestring to put in the ``HTTP2-Settings``. For servers, returns nothing. :rtype: ``bytes`` or ``None`` """ self.config.logger.debug( "Upgrade connection. Current settings: %s", self.local_settings ) frame_data = None # Begin by getting the preamble in place. self.initiate_connection() if self.config.client_side: f = SettingsFrame(0) for setting, value in self.local_settings.items(): f.settings[setting] = value frame_data = f.serialize_body() frame_data = base64.urlsafe_b64encode(frame_data) elif settings_header: # We have a settings header from the client. This needs to be # applied, but we want to throw away the ACK. We do this by # inserting the data into a Settings frame and then passing it to # the state machine, but ignoring the return value. settings_header = base64.urlsafe_b64decode(settings_header) f = SettingsFrame(0) f.parse_body(settings_header) self._receive_settings_frame(f) # Set up appropriate state. Stream 1 in a half-closed state: # half-closed(local) for clients, half-closed(remote) for servers. # Additionally, we need to set up the Connection state machine. connection_input = ( ConnectionInputs.SEND_HEADERS if self.config.client_side else ConnectionInputs.RECV_HEADERS ) self.config.logger.debug("Process input %s", connection_input) self.state_machine.process_input(connection_input) # Set up stream 1. self._begin_new_stream(stream_id=1, allowed_ids=AllowedStreamIDs.ODD) self.streams[1].upgrade(self.config.client_side) return frame_data def _get_or_create_stream(self, stream_id, allowed_ids): """ Gets a stream by its stream ID. Will create one if one does not already exist. Use allowed_ids to circumvent the usual stream ID rules for clients and servers. .. versionchanged:: 2.0.0 Removed this function from the public API. """ try: return self.streams[stream_id] except KeyError: return self._begin_new_stream(stream_id, allowed_ids) def _get_stream_by_id(self, stream_id): """ Gets a stream by its stream ID. Raises NoSuchStreamError if the stream ID does not correspond to a known stream and is higher than the current maximum: raises if it is lower than the current maximum. .. versionchanged:: 2.0.0 Removed this function from the public API. """ try: return self.streams[stream_id] except KeyError: outbound = self._stream_id_is_outbound(stream_id) highest_stream_id = ( self.highest_outbound_stream_id if outbound else self.highest_inbound_stream_id ) if stream_id > highest_stream_id: raise NoSuchStreamError(stream_id) else: raise StreamClosedError(stream_id) def get_next_available_stream_id(self): """ Returns an integer suitable for use as the stream ID for the next stream created by this endpoint. For server endpoints, this stream ID will be even. For client endpoints, this stream ID will be odd. If no stream IDs are available, raises :class:`NoAvailableStreamIDError `. .. warning:: The return value from this function does not change until the stream ID has actually been used by sending or pushing headers on that stream. For that reason, it should be called as close as possible to the actual use of the stream ID. .. versionadded:: 2.0.0 :raises: :class:`NoAvailableStreamIDError ` :returns: The next free stream ID this peer can use to initiate a stream. :rtype: ``int`` """ # No streams have been opened yet, so return the lowest allowed stream # ID. if not self.highest_outbound_stream_id: next_stream_id = 1 if self.config.client_side else 2 else: next_stream_id = self.highest_outbound_stream_id + 2 self.config.logger.debug( "Next available stream ID %d", next_stream_id ) if next_stream_id > self.HIGHEST_ALLOWED_STREAM_ID: raise NoAvailableStreamIDError("Exhausted allowed stream IDs") return next_stream_id def send_headers(self, stream_id, headers, end_stream=False, priority_weight=None, priority_depends_on=None, priority_exclusive=None): """ Send headers on a given stream. This function can be used to send request or response headers: the kind that are sent depends on whether this connection has been opened as a client or server connection, and whether the stream was opened by the remote peer or not. If this is a client connection, calling ``send_headers`` will send the headers as a request. It will also implicitly open the stream being used. If this is a client connection and ``send_headers`` has *already* been called, this will send trailers instead. If this is a server connection, calling ``send_headers`` will send the headers as a response. It is a protocol error for a server to open a stream by sending headers. If this is a server connection and ``send_headers`` has *already* been called, this will send trailers instead. When acting as a server, you may call ``send_headers`` any number of times allowed by the following rules, in this order: - zero or more times with ``(':status', '1XX')`` (where ``1XX`` is a placeholder for any 100-level status code). - once with any other status header. - zero or one time for trailers. That is, you are allowed to send as many informational responses as you like, followed by one complete response and zero or one HTTP trailer blocks. Clients may send one or two header blocks: one request block, and optionally one trailer block. If it is important to send HPACK "never indexed" header fields (as defined in `RFC 7451 Section 7.1.3 `_), the user may instead provide headers using the HPACK library's :class:`HeaderTuple ` and :class:`NeverIndexedHeaderTuple ` objects. This method also allows users to prioritize the stream immediately, by sending priority information on the HEADERS frame directly. To do this, any one of ``priority_weight``, ``priority_depends_on``, or ``priority_exclusive`` must be set to a value that is not ``None``. For more information on the priority fields, see :meth:`prioritize `. .. warning:: In HTTP/2, it is mandatory that all the HTTP/2 special headers (that is, ones whose header keys begin with ``:``) appear at the start of the header block, before any normal headers. .. versionchanged:: 2.3.0 Added support for using :class:`HeaderTuple ` objects to store headers. .. versionchanged:: 2.4.0 Added the ability to provide priority keyword arguments: ``priority_weight``, ``priority_depends_on``, and ``priority_exclusive``. :param stream_id: The stream ID to send the headers on. If this stream does not currently exist, it will be created. :type stream_id: ``int`` :param headers: The request/response headers to send. :type headers: An iterable of two tuples of bytestrings or :class:`HeaderTuple ` objects. :param end_stream: Whether this headers frame should end the stream immediately (that is, whether no more data will be sent after this frame). Defaults to ``False``. :type end_stream: ``bool`` :param priority_weight: Sets the priority weight of the stream. See :meth:`prioritize ` for more about how this field works. Defaults to ``None``, which means that no priority information will be sent. :type priority_weight: ``int`` or ``None`` :param priority_depends_on: Sets which stream this one depends on for priority purposes. See :meth:`prioritize ` for more about how this field works. Defaults to ``None``, which means that no priority information will be sent. :type priority_depends_on: ``int`` or ``None`` :param priority_exclusive: Sets whether this stream exclusively depends on the stream given in ``priority_depends_on`` for priority purposes. See :meth:`prioritize ` for more about how this field workds. Defaults to ``None``, which means that no priority information will be sent. :type priority_depends_on: ``bool`` or ``None`` :returns: Nothing """ self.config.logger.debug( "Send headers on stream ID %d", stream_id ) # Check we can open the stream. if stream_id not in self.streams: max_open_streams = self.remote_settings.max_concurrent_streams if (self.open_outbound_streams + 1) > max_open_streams: raise TooManyStreamsError( "Max outbound streams is %d, %d open" % (max_open_streams, self.open_outbound_streams) ) self.state_machine.process_input(ConnectionInputs.SEND_HEADERS) stream = self._get_or_create_stream( stream_id, AllowedStreamIDs(self.config.client_side) ) frames = stream.send_headers( headers, self.encoder, end_stream ) # We may need to send priority information. priority_present = ( (priority_weight is not None) or (priority_depends_on is not None) or (priority_exclusive is not None) ) if priority_present: if not self.config.client_side: raise RFC1122Error("Servers SHOULD NOT prioritize streams.") headers_frame = frames[0] headers_frame.flags.add('PRIORITY') frames[0] = _add_frame_priority( headers_frame, priority_weight, priority_depends_on, priority_exclusive ) self._prepare_for_sending(frames) def send_data(self, stream_id, data, end_stream=False, pad_length=None): """ Send data on a given stream. This method does no breaking up of data: if the data is larger than the value returned by :meth:`local_flow_control_window ` for this stream then a :class:`FlowControlError ` will be raised. If the data is larger than :data:`max_outbound_frame_size ` then a :class:`FrameTooLargeError ` will be raised. Hyper-h2 does this to avoid buffering the data internally. If the user has more data to send than hyper-h2 will allow, consider breaking it up and buffering it externally. :param stream_id: The ID of the stream on which to send the data. :type stream_id: ``int`` :param data: The data to send on the stream. :type data: ``bytes`` :param end_stream: (optional) Whether this is the last data to be sent on the stream. Defaults to ``False``. :type end_stream: ``bool`` :param pad_length: (optional) Length of the padding to apply to the data frame. Defaults to ``None`` for no use of padding. Note that a value of ``0`` results in padding of length ``0`` (with the "padding" flag set on the frame). .. versionadded:: 2.6.0 :type pad_length: ``int`` :returns: Nothing """ self.config.logger.debug( "Send data on stream ID %d with len %d", stream_id, len(data) ) frame_size = len(data) if pad_length is not None: if not isinstance(pad_length, int): raise TypeError("pad_length must be an int") if pad_length < 0 or pad_length > 255: raise ValueError("pad_length must be within range: [0, 255]") # Account for padding bytes plus the 1-byte padding length field. frame_size += pad_length + 1 self.config.logger.debug( "Frame size on stream ID %d is %d", stream_id, frame_size ) if frame_size > self.local_flow_control_window(stream_id): raise FlowControlError( "Cannot send %d bytes, flow control window is %d." % (frame_size, self.local_flow_control_window(stream_id)) ) elif frame_size > self.max_outbound_frame_size: raise FrameTooLargeError( "Cannot send frame size %d, max frame size is %d" % (frame_size, self.max_outbound_frame_size) ) self.state_machine.process_input(ConnectionInputs.SEND_DATA) frames = self.streams[stream_id].send_data( data, end_stream, pad_length=pad_length ) self._prepare_for_sending(frames) self.outbound_flow_control_window -= frame_size self.config.logger.debug( "Outbound flow control window size is %d", self.outbound_flow_control_window ) assert self.outbound_flow_control_window >= 0 def end_stream(self, stream_id): """ Cleanly end a given stream. This method ends a stream by sending an empty DATA frame on that stream with the ``END_STREAM`` flag set. :param stream_id: The ID of the stream to end. :type stream_id: ``int`` :returns: Nothing """ self.config.logger.debug("End stream ID %d", stream_id) self.state_machine.process_input(ConnectionInputs.SEND_DATA) frames = self.streams[stream_id].end_stream() self._prepare_for_sending(frames) def increment_flow_control_window(self, increment, stream_id=None): """ Increment a flow control window, optionally for a single stream. Allows the remote peer to send more data. .. versionchanged:: 2.0.0 Rejects attempts to increment the flow control window by out of range values with a ``ValueError``. :param increment: The amount to increment the flow control window by. :type increment: ``int`` :param stream_id: (optional) The ID of the stream that should have its flow control window opened. If not present or ``None``, the connection flow control window will be opened instead. :type stream_id: ``int`` or ``None`` :returns: Nothing :raises: ``ValueError`` """ if not (1 <= increment <= self.MAX_WINDOW_INCREMENT): raise ValueError( "Flow control increment must be between 1 and %d" % self.MAX_WINDOW_INCREMENT ) self.state_machine.process_input(ConnectionInputs.SEND_WINDOW_UPDATE) if stream_id is not None: stream = self.streams[stream_id] frames = stream.increase_flow_control_window( increment ) self.config.logger.debug( "Increase stream ID %d flow control window by %d", stream_id, increment ) else: self._inbound_flow_control_window_manager.window_opened(increment) f = WindowUpdateFrame(0) f.window_increment = increment frames = [f] self.config.logger.debug( "Increase connection flow control window by %d", increment ) self._prepare_for_sending(frames) def push_stream(self, stream_id, promised_stream_id, request_headers): """ Push a response to the client by sending a PUSH_PROMISE frame. If it is important to send HPACK "never indexed" header fields (as defined in `RFC 7451 Section 7.1.3 `_), the user may instead provide headers using the HPACK library's :class:`HeaderTuple ` and :class:`NeverIndexedHeaderTuple ` objects. :param stream_id: The ID of the stream that this push is a response to. :type stream_id: ``int`` :param promised_stream_id: The ID of the stream that the pushed response will be sent on. :type promised_stream_id: ``int`` :param request_headers: The headers of the request that the pushed response will be responding to. :type request_headers: An iterable of two tuples of bytestrings or :class:`HeaderTuple ` objects. :returns: Nothing """ self.config.logger.debug( "Send Push Promise frame on stream ID %d", stream_id ) if not self.remote_settings.enable_push: raise ProtocolError("Remote peer has disabled stream push") self.state_machine.process_input(ConnectionInputs.SEND_PUSH_PROMISE) stream = self._get_stream_by_id(stream_id) # We need to prevent users pushing streams in response to streams that # they themselves have already pushed: see #163 and RFC 7540 § 6.6. The # easiest way to do that is to assert that the stream_id is not even: # this shortcut works because only servers can push and the state # machine will enforce this. if (stream_id % 2) == 0: raise ProtocolError("Cannot recursively push streams.") new_stream = self._begin_new_stream( promised_stream_id, AllowedStreamIDs.EVEN ) self.streams[promised_stream_id] = new_stream frames = stream.push_stream_in_band( promised_stream_id, request_headers, self.encoder ) new_frames = new_stream.locally_pushed() self._prepare_for_sending(frames + new_frames) def ping(self, opaque_data): """ Send a PING frame. :param opaque_data: A bytestring of length 8 that will be sent in the PING frame. :returns: Nothing """ self.config.logger.debug("Send Ping frame") if not isinstance(opaque_data, bytes) or len(opaque_data) != 8: raise ValueError("Invalid value for ping data: %r" % opaque_data) self.state_machine.process_input(ConnectionInputs.SEND_PING) f = PingFrame(0) f.opaque_data = opaque_data self._prepare_for_sending([f]) def reset_stream(self, stream_id, error_code=0): """ Reset a stream. This method forcibly closes a stream by sending a RST_STREAM frame for a given stream. This is not a graceful closure. To gracefully end a stream, try the :meth:`end_stream ` method. :param stream_id: The ID of the stream to reset. :type stream_id: ``int`` :param error_code: (optional) The error code to use to reset the stream. Defaults to :data:`ErrorCodes.NO_ERROR `. :type error_code: ``int`` :returns: Nothing """ self.config.logger.debug("Reset stream ID %d", stream_id) self.state_machine.process_input(ConnectionInputs.SEND_RST_STREAM) stream = self._get_stream_by_id(stream_id) frames = stream.reset_stream(error_code) self._prepare_for_sending(frames) def close_connection(self, error_code=0, additional_data=None, last_stream_id=None): """ Close a connection, emitting a GOAWAY frame. .. versionchanged:: 2.4.0 Added ``additional_data`` and ``last_stream_id`` arguments. :param error_code: (optional) The error code to send in the GOAWAY frame. :param additional_data: (optional) Additional debug data indicating a reason for closing the connection. Must be a bytestring. :param last_stream_id: (optional) The last stream which was processed by the sender. Defaults to ``highest_inbound_stream_id``. :returns: Nothing """ self.config.logger.debug("Close connection") self.state_machine.process_input(ConnectionInputs.SEND_GOAWAY) # Additional_data must be bytes if additional_data is not None: assert isinstance(additional_data, bytes) if last_stream_id is None: last_stream_id = self.highest_inbound_stream_id f = GoAwayFrame( stream_id=0, last_stream_id=last_stream_id, error_code=error_code, additional_data=(additional_data or b'') ) self._prepare_for_sending([f]) def update_settings(self, new_settings): """ Update the local settings. This will prepare and emit the appropriate SETTINGS frame. :param new_settings: A dictionary of {setting: new value} """ self.config.logger.debug( "Update connection settings to %s", new_settings ) self.state_machine.process_input(ConnectionInputs.SEND_SETTINGS) self.local_settings.update(new_settings) s = SettingsFrame(0) s.settings = new_settings self._prepare_for_sending([s]) def advertise_alternative_service(self, field_value, origin=None, stream_id=None): """ Notify a client about an available Alternative Service. An Alternative Service is defined in `RFC 7838 `_. An Alternative Service notification informs a client that a given origin is also available elsewhere. Alternative Services can be advertised in two ways. Firstly, they can be advertised explicitly: that is, a server can say "origin X is also available at Y". To advertise like this, set the ``origin`` argument and not the ``stream_id`` argument. Alternatively, they can be advertised implicitly: that is, a server can say "the origin you're contacting on stream X is also available at Y". To advertise like this, set the ``stream_id`` argument and not the ``origin`` argument. The explicit method of advertising can be done as long as the connection is active. The implicit method can only be done after the client has sent the request headers and before the server has sent the response headers: outside of those points, Hyper-h2 will forbid sending the Alternative Service advertisement by raising a ProtocolError. The ``field_value`` parameter is specified in RFC 7838. Hyper-h2 does not validate or introspect this argument: the user is required to ensure that it's well-formed. ``field_value`` corresponds to RFC 7838's "Alternative Service Field Value". .. note:: It is strongly preferred to use the explicit method of advertising Alternative Services. The implicit method of advertising Alternative Services has a number of subtleties and can lead to inconsistencies between the server and client. Hyper-h2 allows both mechanisms, but caution is strongly advised. .. versionadded:: 2.3.0 :param field_value: The RFC 7838 Alternative Service Field Value. This argument is not introspected by Hyper-h2: the user is responsible for ensuring that it is well-formed. :type field_value: ``bytes`` :param origin: The origin/authority to which the Alternative Service being advertised applies. Must not be provided at the same time as ``stream_id``. :type origin: ``bytes`` or ``None`` :param stream_id: The ID of the stream which was sent to the authority for which this Alternative Service advertisement applies. Must not be provided at the same time as ``origin``. :type stream_id: ``int`` or ``None`` :returns: Nothing. """ if not isinstance(field_value, bytes): raise ValueError("Field must be bytestring.") if origin is not None and stream_id is not None: raise ValueError("Must not provide both origin and stream_id") self.state_machine.process_input( ConnectionInputs.SEND_ALTERNATIVE_SERVICE ) if origin is not None: # This ALTSVC is sent on stream zero. f = AltSvcFrame(stream_id=0) f.origin = origin f.field = field_value frames = [f] else: stream = self._get_stream_by_id(stream_id) frames = stream.advertise_alternative_service(field_value) self._prepare_for_sending(frames) def prioritize(self, stream_id, weight=None, depends_on=None, exclusive=None): """ Notify a server about the priority of a stream. Stream priorities are a form of guidance to a remote server: they inform the server about how important a given response is, so that the server may allocate its resources (e.g. bandwidth, CPU time, etc.) accordingly. This exists to allow clients to ensure that the most important data arrives earlier, while less important data does not starve out the more important data. Stream priorities are explained in depth in `RFC 7540 Section 5.3 `_. This method updates the priority information of a single stream. It may be called well before a stream is actively in use, or well after a stream is closed. .. warning:: RFC 7540 allows for servers to change the priority of streams. However, hyper-h2 **does not** allow server stacks to do this. This is because most clients do not adequately know how to respond when provided conflicting priority information, and relatively little utility is provided by making that functionality available. .. note:: hyper-h2 **does not** maintain any information about the RFC 7540 priority tree. That means that hyper-h2 does not prevent incautious users from creating invalid priority trees, particularly by creating priority loops. While some basic error checking is provided by hyper-h2, users are strongly recommended to understand their prioritisation strategies before using the priority tools here. .. note:: Priority information is strictly advisory. Servers are allowed to disregard it entirely. Avoid relying on the idea that your priority signaling will definitely be obeyed. .. versionadded:: 2.4.0 :param stream_id: The ID of the stream to prioritize. :type stream_id: ``int`` :param weight: The weight to give the stream. Defaults to ``16``, the default weight of any stream. May be any value between ``1`` and ``256`` inclusive. The relative weight of a stream indicates what proportion of available resources will be allocated to that stream. :type weight: ``int`` :param depends_on: The ID of the stream on which this stream depends. This stream will only be progressed if it is impossible to progress the parent stream (the one on which this one depends). Passing the value ``0`` means that this stream does not depend on any other. Defaults to ``0``. :type depends_on: ``int`` :param exclusive: Whether this stream is an exclusive dependency of its "parent" stream (i.e. the stream given by ``depends_on``). If a stream is an exclusive dependency of another, that means that all previously-set children of the parent are moved to become children of the new exclusively-dependent stream. Defaults to ``False``. :type exclusive: ``bool`` """ if not self.config.client_side: raise RFC1122Error("Servers SHOULD NOT prioritize streams.") self.state_machine.process_input( ConnectionInputs.SEND_PRIORITY ) frame = PriorityFrame(stream_id) frame = _add_frame_priority(frame, weight, depends_on, exclusive) self._prepare_for_sending([frame]) def local_flow_control_window(self, stream_id): """ Returns the maximum amount of data that can be sent on stream ``stream_id``. This value will never be larger than the total data that can be sent on the connection: even if the given stream allows more data, the connection window provides a logical maximum to the amount of data that can be sent. The maximum data that can be sent in a single data frame on a stream is either this value, or the maximum frame size, whichever is *smaller*. :param stream_id: The ID of the stream whose flow control window is being queried. :type stream_id: ``int`` :returns: The amount of data in bytes that can be sent on the stream before the flow control window is exhausted. :rtype: ``int`` """ stream = self._get_stream_by_id(stream_id) return min( self.outbound_flow_control_window, stream.outbound_flow_control_window ) def remote_flow_control_window(self, stream_id): """ Returns the maximum amount of data the remote peer can send on stream ``stream_id``. This value will never be larger than the total data that can be sent on the connection: even if the given stream allows more data, the connection window provides a logical maximum to the amount of data that can be sent. The maximum data that can be sent in a single data frame on a stream is either this value, or the maximum frame size, whichever is *smaller*. :param stream_id: The ID of the stream whose flow control window is being queried. :type stream_id: ``int`` :returns: The amount of data in bytes that can be received on the stream before the flow control window is exhausted. :rtype: ``int`` """ stream = self._get_stream_by_id(stream_id) return min( self.inbound_flow_control_window, stream.inbound_flow_control_window ) def acknowledge_received_data(self, acknowledged_size, stream_id): """ Inform the :class:`H2Connection ` that a certain number of flow-controlled bytes have been processed, and that the space should be handed back to the remote peer at an opportune time. .. versionadded:: 2.5.0 :param acknowledged_size: The total *flow-controlled size* of the data that has been processed. Note that this must include the amount of padding that was sent with that data. :type acknowledged_size: ``int`` :param stream_id: The ID of the stream on which this data was received. :type stream_id: ``int`` :returns: Nothing :rtype: ``None`` """ self.config.logger.debug( "Ack received data on stream ID %d with size %d", stream_id, acknowledged_size ) if stream_id <= 0: raise ValueError( "Stream ID %d is not valid for acknowledge_received_data" % stream_id ) if acknowledged_size < 0: raise ValueError("Cannot acknowledge negative data") frames = [] conn_manager = self._inbound_flow_control_window_manager conn_increment = conn_manager.process_bytes(acknowledged_size) if conn_increment: f = WindowUpdateFrame(0) f.window_increment = conn_increment frames.append(f) try: stream = self._get_stream_by_id(stream_id) except StreamClosedError: # The stream is already gone. We're not worried about incrementing # the window in this case. pass else: # No point incrementing the windows of closed streams. if stream.open: frames.extend( stream.acknowledge_received_data(acknowledged_size) ) self._prepare_for_sending(frames) def data_to_send(self, amount=None): """ Returns some data for sending out of the internal data buffer. This method is analogous to ``read`` on a file-like object, but it doesn't block. Instead, it returns as much data as the user asks for, or less if that much data is not available. It does not perform any I/O, and so uses a different name. :param amount: (optional) The maximum amount of data to return. If not set, or set to ``None``, will return as much data as possible. :type amount: ``int`` :returns: A bytestring containing the data to send on the wire. :rtype: ``bytes`` """ if amount is None: data = bytes(self._data_to_send) self._data_to_send = bytearray() return data else: data = bytes(self._data_to_send[:amount]) self._data_to_send = self._data_to_send[amount:] return data def clear_outbound_data_buffer(self): """ Clears the outbound data buffer, such that if this call was immediately followed by a call to :meth:`data_to_send `, that call would return no data. This method should not normally be used, but is made available to avoid exposing implementation details. """ self._data_to_send = bytearray() def _acknowledge_settings(self): """ Acknowledge settings that have been received. .. versionchanged:: 2.0.0 Removed from public API, removed useless ``event`` parameter, made automatic. :returns: Nothing """ self.state_machine.process_input(ConnectionInputs.SEND_SETTINGS) changes = self.remote_settings.acknowledge() if SettingCodes.INITIAL_WINDOW_SIZE in changes: setting = changes[SettingCodes.INITIAL_WINDOW_SIZE] self._flow_control_change_from_settings( setting.original_value, setting.new_value, ) # HEADER_TABLE_SIZE changes by the remote part affect our encoder: cf. # RFC 7540 Section 6.5.2. if SettingCodes.HEADER_TABLE_SIZE in changes: setting = changes[SettingCodes.HEADER_TABLE_SIZE] self.encoder.header_table_size = setting.new_value if SettingCodes.MAX_FRAME_SIZE in changes: setting = changes[SettingCodes.MAX_FRAME_SIZE] self.max_outbound_frame_size = setting.new_value for stream in self.streams.values(): stream.max_outbound_frame_size = setting.new_value f = SettingsFrame(0) f.flags.add('ACK') return [f] def _flow_control_change_from_settings(self, old_value, new_value): """ Update flow control windows in response to a change in the value of SETTINGS_INITIAL_WINDOW_SIZE. When this setting is changed, it automatically updates all flow control windows by the delta in the settings values. Note that it does not increment the *connection* flow control window, per section 6.9.2 of RFC 7540. """ delta = new_value - old_value for stream in self.streams.values(): stream.outbound_flow_control_window = guard_increment_window( stream.outbound_flow_control_window, delta ) def _inbound_flow_control_change_from_settings(self, old_value, new_value): """ Update remote flow control windows in response to a change in the value of SETTINGS_INITIAL_WINDOW_SIZE. When this setting is changed, it automatically updates all remote flow control windows by the delta in the settings values. """ delta = new_value - old_value for stream in self.streams.values(): stream._inbound_flow_control_change_from_settings(delta) def receive_data(self, data): """ Pass some received HTTP/2 data to the connection for handling. :param data: The data received from the remote peer on the network. :type data: ``bytes`` :returns: A list of events that the remote peer triggered by sending this data. """ self.config.logger.debug( "Process received data on connection. Received data: %r", data ) events = [] self.incoming_buffer.add_data(data) self.incoming_buffer.max_frame_size = self.max_inbound_frame_size try: for frame in self.incoming_buffer: events.extend(self._receive_frame(frame)) except InvalidPaddingError: self._terminate_connection(ErrorCodes.PROTOCOL_ERROR) raise ProtocolError("Received frame with invalid padding.") except ProtocolError as e: # For whatever reason, receiving the frame caused a protocol error. # We should prepare to emit a GoAway frame before throwing the # exception up further. No need for an event: the exception will # do fine. self._terminate_connection(e.error_code) raise return events def _receive_frame(self, frame): """ Handle a frame received on the connection. .. versionchanged:: 2.0.0 Removed from the public API. """ try: # I don't love using __class__ here, maybe reconsider it. frames, events = self._frame_dispatch_table[frame.__class__](frame) except StreamClosedError as e: # If the stream was closed by RST_STREAM, we just send a RST_STREAM # to the remote peer. Otherwise, this is a connection error, and so # we will re-raise to trigger one. if self._stream_is_closed_by_reset(e.stream_id): f = RstStreamFrame(e.stream_id) f.error_code = e.error_code self._prepare_for_sending([f]) events = e._events else: raise except StreamIDTooLowError as e: # The stream ID seems invalid. This may happen when the closed # stream has been cleaned up, or when the remote peer has opened a # new stream with a higher stream ID than this one, forcing it # closed implicitly. # # Check how the stream was closed: depending on the mechanism, it # is either a stream error or a connection error. if self._stream_is_closed_by_reset(e.stream_id): # Closed by RST_STREAM is a stream error. f = RstStreamFrame(e.stream_id) f.error_code = ErrorCodes.STREAM_CLOSED self._prepare_for_sending([f]) events = [] elif self._stream_is_closed_by_end(e.stream_id): # Closed by END_STREAM is a connection error. raise StreamClosedError(e.stream_id) else: # Closed implicitly, also a connection error, but of type # PROTOCOL_ERROR. raise else: self._prepare_for_sending(frames) return events def _terminate_connection(self, error_code): """ Terminate the connection early. Used in error handling blocks to send GOAWAY frames. """ f = GoAwayFrame(0) f.last_stream_id = self.highest_inbound_stream_id f.error_code = error_code self.state_machine.process_input(ConnectionInputs.SEND_GOAWAY) self._prepare_for_sending([f]) def _receive_headers_frame(self, frame): """ Receive a headers frame on the connection. """ # If necessary, check we can open the stream. Also validate that the # stream ID is valid. if frame.stream_id not in self.streams: max_open_streams = self.local_settings.max_concurrent_streams if (self.open_inbound_streams + 1) > max_open_streams: raise TooManyStreamsError( "Max outbound streams is %d, %d open" % (max_open_streams, self.open_outbound_streams) ) # Let's decode the headers. We handle headers as bytes internally up # until we hang them off the event, at which point we may optionally # convert them to unicode. headers = _decode_headers(self.decoder, frame.data) events = self.state_machine.process_input( ConnectionInputs.RECV_HEADERS ) stream = self._get_or_create_stream( frame.stream_id, AllowedStreamIDs(not self.config.client_side) ) frames, stream_events = stream.receive_headers( headers, 'END_STREAM' in frame.flags, self.config.header_encoding ) if 'PRIORITY' in frame.flags: p_frames, p_events = self._receive_priority_frame(frame) stream_events[0].priority_updated = p_events[0] stream_events.extend(p_events) assert not p_frames return frames, events + stream_events def _receive_push_promise_frame(self, frame): """ Receive a push-promise frame on the connection. """ if not self.local_settings.enable_push: raise ProtocolError("Received pushed stream") pushed_headers = _decode_headers(self.decoder, frame.data) events = self.state_machine.process_input( ConnectionInputs.RECV_PUSH_PROMISE ) try: stream = self._get_stream_by_id(frame.stream_id) except NoSuchStreamError: # We need to check if the parent stream was reset by us. If it was # then we presume that the PUSH_PROMISE was in flight when we reset # the parent stream. Rather than accept the new stream, just reset # it. # # If this was closed naturally, however, we should call this a # PROTOCOL_ERROR: pushing a stream on a naturally closed stream is # a real problem because it creates a brand new stream that the # remote peer now believes exists. if (self._stream_closed_by(frame.stream_id) == StreamClosedBy.SEND_RST_STREAM): f = RstStreamFrame(frame.promised_stream_id) f.error_code = ErrorCodes.REFUSED_STREAM return [f], events raise ProtocolError("Attempted to push on closed stream.") # We need to prevent peers pushing streams in response to streams that # they themselves have already pushed: see #163 and RFC 7540 § 6.6. The # easiest way to do that is to assert that the stream_id is not even: # this shortcut works because only servers can push and the state # machine will enforce this. if (frame.stream_id % 2) == 0: raise ProtocolError("Cannot recursively push streams.") try: frames, stream_events = stream.receive_push_promise_in_band( frame.promised_stream_id, pushed_headers, self.config.header_encoding, ) except StreamClosedError: # The parent stream was reset by us, so we presume that # PUSH_PROMISE was in flight when we reset the parent stream. # So we just reset the new stream. f = RstStreamFrame(frame.promised_stream_id) f.error_code = ErrorCodes.REFUSED_STREAM return [f], events new_stream = self._begin_new_stream( frame.promised_stream_id, AllowedStreamIDs.EVEN ) self.streams[frame.promised_stream_id] = new_stream new_stream.remotely_pushed(pushed_headers) return frames, events + stream_events def _receive_data_frame(self, frame): """ Receive a data frame on the connection. """ flow_controlled_length = frame.flow_controlled_length events = self.state_machine.process_input( ConnectionInputs.RECV_DATA ) self._inbound_flow_control_window_manager.window_consumed( flow_controlled_length ) stream = self._get_stream_by_id(frame.stream_id) frames, stream_events = stream.receive_data( frame.data, 'END_STREAM' in frame.flags, flow_controlled_length ) return frames, events + stream_events def _receive_settings_frame(self, frame): """ Receive a SETTINGS frame on the connection. """ events = self.state_machine.process_input( ConnectionInputs.RECV_SETTINGS ) # This is an ack of the local settings. if 'ACK' in frame.flags: changed_settings = self._local_settings_acked() ack_event = SettingsAcknowledged() ack_event.changed_settings = changed_settings events.append(ack_event) return [], events # Add the new settings. self.remote_settings.update(frame.settings) events.append( RemoteSettingsChanged.from_settings( self.remote_settings, frame.settings ) ) frames = self._acknowledge_settings() return frames, events def _receive_window_update_frame(self, frame): """ Receive a WINDOW_UPDATE frame on the connection. """ # Validate the frame. if not (1 <= frame.window_increment <= self.MAX_WINDOW_INCREMENT): raise ProtocolError( "Flow control increment must be between 1 and %d, received %d" % (self.MAX_WINDOW_INCREMENT, frame.window_increment) ) events = self.state_machine.process_input( ConnectionInputs.RECV_WINDOW_UPDATE ) if frame.stream_id: stream = self._get_stream_by_id(frame.stream_id) frames, stream_events = stream.receive_window_update( frame.window_increment ) else: # Increment our local flow control window. self.outbound_flow_control_window = guard_increment_window( self.outbound_flow_control_window, frame.window_increment ) # FIXME: Should we split this into one event per active stream? window_updated_event = WindowUpdated() window_updated_event.stream_id = 0 window_updated_event.delta = frame.window_increment stream_events = [window_updated_event] frames = [] return frames, events + stream_events def _receive_ping_frame(self, frame): """ Receive a PING frame on the connection. """ events = self.state_machine.process_input( ConnectionInputs.RECV_PING ) flags = [] if 'ACK' in frame.flags: evt = PingAckReceived() else: evt = PingReceived() # automatically ACK the PING with the same 'opaque data' f = PingFrame(0) f.flags = {'ACK'} f.opaque_data = frame.opaque_data flags.append(f) evt.ping_data = frame.opaque_data events.append(evt) return flags, events def _receive_rst_stream_frame(self, frame): """ Receive a RST_STREAM frame on the connection. """ events = self.state_machine.process_input( ConnectionInputs.RECV_RST_STREAM ) try: stream = self._get_stream_by_id(frame.stream_id) except NoSuchStreamError: # The stream is missing. That's ok, we just do nothing here. stream_frames = [] stream_events = [] else: stream_frames, stream_events = stream.stream_reset(frame) return stream_frames, events + stream_events def _receive_priority_frame(self, frame): """ Receive a PRIORITY frame on the connection. """ events = self.state_machine.process_input( ConnectionInputs.RECV_PRIORITY ) event = PriorityUpdated() event.stream_id = frame.stream_id event.depends_on = frame.depends_on event.exclusive = frame.exclusive # Weight is an integer between 1 and 256, but the byte only allows # 0 to 255: add one. event.weight = frame.stream_weight + 1 # A stream may not depend on itself. if event.depends_on == frame.stream_id: raise ProtocolError( "Stream %d may not depend on itself" % frame.stream_id ) events.append(event) return [], events def _receive_goaway_frame(self, frame): """ Receive a GOAWAY frame on the connection. """ events = self.state_machine.process_input( ConnectionInputs.RECV_GOAWAY ) # Clear the outbound data buffer: we cannot send further data now. self.clear_outbound_data_buffer() # Fire an appropriate ConnectionTerminated event. new_event = ConnectionTerminated() new_event.error_code = _error_code_from_int(frame.error_code) new_event.last_stream_id = frame.last_stream_id new_event.additional_data = (frame.additional_data if frame.additional_data else None) events.append(new_event) return [], events def _receive_naked_continuation(self, frame): """ A naked CONTINUATION frame has been received. This is always an error, but the type of error it is depends on the state of the stream and must transition the state of the stream, so we need to pass it to the appropriate stream. """ stream = self._get_stream_by_id(frame.stream_id) stream.receive_continuation() assert False, "Should not be reachable" def _receive_alt_svc_frame(self, frame): """ An ALTSVC frame has been received. This frame, specified in RFC 7838, is used to advertise alternative places where the same service can be reached. This frame can optionally be received either on a stream or on stream 0, and its semantics are different in each case. """ events = self.state_machine.process_input( ConnectionInputs.RECV_ALTERNATIVE_SERVICE ) frames = [] if frame.stream_id: # Given that it makes no sense to receive ALTSVC on a stream # before that stream has been opened with a HEADERS frame, the # ALTSVC frame cannot create a stream. If the stream is not # present, we simply ignore the frame. try: stream = self._get_stream_by_id(frame.stream_id) except (NoSuchStreamError, StreamClosedError): pass else: stream_frames, stream_events = stream.receive_alt_svc(frame) frames.extend(stream_frames) events.extend(stream_events) else: # This frame is sent on stream 0. The origin field on the frame # must be present, though if it isn't it's not a ProtocolError # (annoyingly), we just need to ignore it. if not frame.origin: return frames, events # If we're a server, we want to ignore this (RFC 7838 says so). if not self.config.client_side: return frames, events event = AlternativeServiceAvailable() event.origin = frame.origin event.field_value = frame.field events.append(event) return frames, events def _receive_unknown_frame(self, frame): """ We have received a frame that we do not understand. This is almost certainly an extension frame, though it's impossible to be entirely sure. RFC 7540 § 5.5 says that we MUST ignore unknown frame types: so we do. We do notify the user that we received one, however. """ # All we do here is log. self.config.logger.debug( "Received unknown extension frame (ID %d)", frame.stream_id ) event = UnknownFrameReceived() event.frame = frame return [], [event] def _local_settings_acked(self): """ Handle the local settings being ACKed, update internal state. """ changes = self.local_settings.acknowledge() if SettingCodes.INITIAL_WINDOW_SIZE in changes: setting = changes[SettingCodes.INITIAL_WINDOW_SIZE] self._inbound_flow_control_change_from_settings( setting.original_value, setting.new_value, ) if SettingCodes.MAX_HEADER_LIST_SIZE in changes: setting = changes[SettingCodes.MAX_HEADER_LIST_SIZE] self.decoder.max_header_list_size = setting.new_value if SettingCodes.MAX_FRAME_SIZE in changes: setting = changes[SettingCodes.MAX_FRAME_SIZE] self.max_inbound_frame_size = setting.new_value if SettingCodes.HEADER_TABLE_SIZE in changes: setting = changes[SettingCodes.HEADER_TABLE_SIZE] # This is safe across all hpack versions: some versions just won't # respect it. self.decoder.max_allowed_table_size = setting.new_value return changes def _stream_id_is_outbound(self, stream_id): """ Returns ``True`` if the stream ID corresponds to an outbound stream (one initiated by this peer), returns ``False`` otherwise. """ return (stream_id % 2 == int(self.config.client_side)) def _stream_closed_by(self, stream_id): """ Returns how the stream was closed. The return value will be either a member of ``h2.stream.StreamClosedBy`` or ``None``. If ``None``, the stream was closed implicitly by the peer opening a stream with a higher stream ID before opening this one. """ if stream_id in self.streams: return self.streams[stream_id].closed_by if stream_id in self._closed_streams: return self._closed_streams[stream_id] return None def _stream_is_closed_by_reset(self, stream_id): """ Returns ``True`` if the stream was closed by sending or receiving a RST_STREAM frame. Returns ``False`` otherwise. """ return self._stream_closed_by(stream_id) in ( StreamClosedBy.RECV_RST_STREAM, StreamClosedBy.SEND_RST_STREAM ) def _stream_is_closed_by_end(self, stream_id): """ Returns ``True`` if the stream was closed by sending or receiving an END_STREAM flag in a HEADERS or DATA frame. Returns ``False`` otherwise. """ return self._stream_closed_by(stream_id) in ( StreamClosedBy.RECV_END_STREAM, StreamClosedBy.SEND_END_STREAM ) def _add_frame_priority(frame, weight=None, depends_on=None, exclusive=None): """ Adds priority data to a given frame. Does not change any flags set on that frame: if the caller is adding priority information to a HEADERS frame they must set that themselves. This method also deliberately sets defaults for anything missing. This method validates the input values. """ # A stream may not depend on itself. if depends_on == frame.stream_id: raise ProtocolError( "Stream %d may not depend on itself" % frame.stream_id ) # Weight must be between 1 and 256. if weight is not None: if weight > 256 or weight < 1: raise ProtocolError( "Weight must be between 1 and 256, not %d" % weight ) else: # Weight is an integer between 1 and 256, but the byte only allows # 0 to 255: subtract one. weight -= 1 # Set defaults for anything not provided. weight = weight if weight is not None else 15 depends_on = depends_on if depends_on is not None else 0 exclusive = exclusive if exclusive is not None else False frame.stream_weight = weight frame.depends_on = depends_on frame.exclusive = exclusive return frame def _decode_headers(decoder, encoded_header_block): """ Decode a HPACK-encoded header block, translating HPACK exceptions into sensible hyper-h2 errors. This only ever returns bytestring headers: hyper-h2 may emit them as unicode later, but internally it processes them as bytestrings only. """ try: return decoder.decode(encoded_header_block, raw=True) except OversizedHeaderListError as e: # This is a symptom of a HPACK bomb attack: the user has # disregarded our requirements on how large a header block we'll # accept. raise DenialOfServiceError("Oversized header block: %s" % e) except (HPACKError, IndexError, TypeError, UnicodeDecodeError) as e: # We should only need HPACKError here, but versions of HPACK older # than 2.1.0 throw all three others as well. For maximum # compatibility, catch all of them. raise ProtocolError("Error decoding header block: %s" % e) h2-3.1.1/h2/errors.py0000664000175000017500000000302113421652727015121 0ustar ubuntuubuntu00000000000000# -*- coding: utf-8 -*- """ h2/errors ~~~~~~~~~~~~~~~~~~~ Global error code registry containing the established HTTP/2 error codes. The current registry is available at: https://tools.ietf.org/html/rfc7540#section-11.4 """ import enum class ErrorCodes(enum.IntEnum): """ All known HTTP/2 error codes. .. versionadded:: 2.5.0 """ #: Graceful shutdown. NO_ERROR = 0x0 #: Protocol error detected. PROTOCOL_ERROR = 0x1 #: Implementation fault. INTERNAL_ERROR = 0x2 #: Flow-control limits exceeded. FLOW_CONTROL_ERROR = 0x3 #: Settings not acknowledged. SETTINGS_TIMEOUT = 0x4 #: Frame received for closed stream. STREAM_CLOSED = 0x5 #: Frame size incorrect. FRAME_SIZE_ERROR = 0x6 #: Stream not processed. REFUSED_STREAM = 0x7 #: Stream cancelled. CANCEL = 0x8 #: Compression state not updated. COMPRESSION_ERROR = 0x9 #: TCP connection error for CONNECT method. CONNECT_ERROR = 0xa #: Processing capacity exceeded. ENHANCE_YOUR_CALM = 0xb #: Negotiated TLS parameters not acceptable. INADEQUATE_SECURITY = 0xc #: Use HTTP/1.1 for the request. HTTP_1_1_REQUIRED = 0xd def _error_code_from_int(code): """ Given an integer error code, returns either one of :class:`ErrorCodes ` or, if not present in the known set of codes, returns the integer directly. """ try: return ErrorCodes(code) except ValueError: return code __all__ = ['ErrorCodes'] h2-3.1.1/h2/events.py0000664000175000017500000005271213421652727015124 0ustar ubuntuubuntu00000000000000# -*- coding: utf-8 -*- """ h2/events ~~~~~~~~~ Defines Event types for HTTP/2. Events are returned by the H2 state machine to allow implementations to keep track of events triggered by receiving data. Each time data is provided to the H2 state machine it processes the data and returns a list of Event objects. """ import binascii from .settings import ChangedSetting, _setting_code_from_int class Event(object): """ Base class for h2 events. """ pass class RequestReceived(Event): """ The RequestReceived event is fired whenever request headers are received. This event carries the HTTP headers for the given request and the stream ID of the new stream. .. versionchanged:: 2.3.0 Changed the type of ``headers`` to :class:`HeaderTuple `. This has no effect on current users. .. versionchanged:: 2.4.0 Added ``stream_ended`` and ``priority_updated`` properties. """ def __init__(self): #: The Stream ID for the stream this request was made on. self.stream_id = None #: The request headers. self.headers = None #: If this request also ended the stream, the associated #: :class:`StreamEnded ` event will be available #: here. #: #: .. versionadded:: 2.4.0 self.stream_ended = None #: If this request also had associated priority information, the #: associated :class:`PriorityUpdated ` #: event will be available here. #: #: .. versionadded:: 2.4.0 self.priority_updated = None def __repr__(self): return "" % ( self.stream_id, self.headers ) class ResponseReceived(Event): """ The ResponseReceived event is fired whenever response headers are received. This event carries the HTTP headers for the given response and the stream ID of the new stream. .. versionchanged:: 2.3.0 Changed the type of ``headers`` to :class:`HeaderTuple `. This has no effect on current users. .. versionchanged:: 2.4.0 Added ``stream_ended`` and ``priority_updated`` properties. """ def __init__(self): #: The Stream ID for the stream this response was made on. self.stream_id = None #: The response headers. self.headers = None #: If this response also ended the stream, the associated #: :class:`StreamEnded ` event will be available #: here. #: #: .. versionadded:: 2.4.0 self.stream_ended = None #: If this response also had associated priority information, the #: associated :class:`PriorityUpdated ` #: event will be available here. #: #: .. versionadded:: 2.4.0 self.priority_updated = None def __repr__(self): return "" % ( self.stream_id, self.headers ) class TrailersReceived(Event): """ The TrailersReceived event is fired whenever trailers are received on a stream. Trailers are a set of headers sent after the body of the request/response, and are used to provide information that wasn't known ahead of time (e.g. content-length). This event carries the HTTP header fields that form the trailers and the stream ID of the stream on which they were received. .. versionchanged:: 2.3.0 Changed the type of ``headers`` to :class:`HeaderTuple `. This has no effect on current users. .. versionchanged:: 2.4.0 Added ``stream_ended`` and ``priority_updated`` properties. """ def __init__(self): #: The Stream ID for the stream on which these trailers were received. self.stream_id = None #: The trailers themselves. self.headers = None #: Trailers always end streams. This property has the associated #: :class:`StreamEnded ` in it. #: #: .. versionadded:: 2.4.0 self.stream_ended = None #: If the trailers also set associated priority information, the #: associated :class:`PriorityUpdated ` #: event will be available here. #: #: .. versionadded:: 2.4.0 self.priority_updated = None def __repr__(self): return "" % ( self.stream_id, self.headers ) class _HeadersSent(Event): """ The _HeadersSent event is fired whenever headers are sent. This is an internal event, used to determine validation steps on outgoing header blocks. """ pass class _ResponseSent(_HeadersSent): """ The _ResponseSent event is fired whenever response headers are sent on a stream. This is an internal event, used to determine validation steps on outgoing header blocks. """ pass class _RequestSent(_HeadersSent): """ The _RequestSent event is fired whenever request headers are sent on a stream. This is an internal event, used to determine validation steps on outgoing header blocks. """ pass class _TrailersSent(_HeadersSent): """ The _TrailersSent event is fired whenever trailers are sent on a stream. Trailers are a set of headers sent after the body of the request/response, and are used to provide information that wasn't known ahead of time (e.g. content-length). This is an internal event, used to determine validation steps on outgoing header blocks. """ pass class _PushedRequestSent(_HeadersSent): """ The _PushedRequestSent event is fired whenever pushed request headers are sent. This is an internal event, used to determine validation steps on outgoing header blocks. """ pass class InformationalResponseReceived(Event): """ The InformationalResponseReceived event is fired when an informational response (that is, one whose status code is a 1XX code) is received from the remote peer. The remote peer may send any number of these, from zero upwards. These responses are most commonly sent in response to requests that have the ``expect: 100-continue`` header field present. Most users can safely ignore this event unless you are intending to use the ``expect: 100-continue`` flow, or are for any reason expecting a different 1XX status code. .. versionadded:: 2.2.0 .. versionchanged:: 2.3.0 Changed the type of ``headers`` to :class:`HeaderTuple `. This has no effect on current users. .. versionchanged:: 2.4.0 Added ``priority_updated`` property. """ def __init__(self): #: The Stream ID for the stream this informational response was made #: on. self.stream_id = None #: The headers for this informational response. self.headers = None #: If this response also had associated priority information, the #: associated :class:`PriorityUpdated ` #: event will be available here. #: #: .. versionadded:: 2.4.0 self.priority_updated = None def __repr__(self): return "" % ( self.stream_id, self.headers ) class DataReceived(Event): """ The DataReceived event is fired whenever data is received on a stream from the remote peer. The event carries the data itself, and the stream ID on which the data was received. .. versionchanged:: 2.4.0 Added ``stream_ended`` property. """ def __init__(self): #: The Stream ID for the stream this data was received on. self.stream_id = None #: The data itself. self.data = None #: The amount of data received that counts against the flow control #: window. Note that padding counts against the flow control window, so #: when adjusting flow control you should always use this field rather #: than ``len(data)``. self.flow_controlled_length = None #: If this data chunk also completed the stream, the associated #: :class:`StreamEnded ` event will be available #: here. #: #: .. versionadded:: 2.4.0 self.stream_ended = None def __repr__(self): return ( "" % ( self.stream_id, self.flow_controlled_length, _bytes_representation(self.data[:20]), ) ) class WindowUpdated(Event): """ The WindowUpdated event is fired whenever a flow control window changes size. HTTP/2 defines flow control windows for connections and streams: this event fires for both connections and streams. The event carries the ID of the stream to which it applies (set to zero if the window update applies to the connection), and the delta in the window size. """ def __init__(self): #: The Stream ID of the stream whose flow control window was changed. #: May be ``0`` if the connection window was changed. self.stream_id = None #: The window delta. self.delta = None def __repr__(self): return "" % ( self.stream_id, self.delta ) class RemoteSettingsChanged(Event): """ The RemoteSettingsChanged event is fired whenever the remote peer changes its settings. It contains a complete inventory of changed settings, including their previous values. In HTTP/2, settings changes need to be acknowledged. hyper-h2 automatically acknowledges settings changes for efficiency. However, it is possible that the caller may not be happy with the changed setting. When this event is received, the caller should confirm that the new settings are acceptable. If they are not acceptable, the user should close the connection with the error code :data:`PROTOCOL_ERROR `. .. versionchanged:: 2.0.0 Prior to this version the user needed to acknowledge settings changes. This is no longer the case: hyper-h2 now automatically acknowledges them. """ def __init__(self): #: A dictionary of setting byte to #: :class:`ChangedSetting `, representing #: the changed settings. self.changed_settings = {} @classmethod def from_settings(cls, old_settings, new_settings): """ Build a RemoteSettingsChanged event from a set of changed settings. :param old_settings: A complete collection of old settings, in the form of a dictionary of ``{setting: value}``. :param new_settings: All the changed settings and their new values, in the form of a dictionary of ``{setting: value}``. """ e = cls() for setting, new_value in new_settings.items(): setting = _setting_code_from_int(setting) original_value = old_settings.get(setting) change = ChangedSetting(setting, original_value, new_value) e.changed_settings[setting] = change return e def __repr__(self): return "" % ( ", ".join(repr(cs) for cs in self.changed_settings.values()), ) class PingReceived(Event): """ The PingReceived event is fired whenever a PING is received. It contains the 'opaque data' of the PING frame. A ping acknowledgment with the same 'opaque data' is automatically emitted after receiving a ping. .. versionadded:: 3.1.0 """ def __init__(self): #: The data included on the ping. self.ping_data = None def __repr__(self): return "" % ( _bytes_representation(self.ping_data), ) class PingAcknowledged(Event): """ Same as PingAckReceived. .. deprecated:: 3.1.0 """ def __init__(self): #: The data included on the ping. self.ping_data = None def __repr__(self): return "" % ( _bytes_representation(self.ping_data), ) class PingAckReceived(PingAcknowledged): """ The PingAckReceived event is fired whenever a PING acknowledgment is received. It contains the 'opaque data' of the PING+ACK frame, allowing the user to correlate PINGs and calculate RTT. .. versionadded:: 3.1.0 """ pass class StreamEnded(Event): """ The StreamEnded event is fired whenever a stream is ended by a remote party. The stream may not be fully closed if it has not been closed locally, but no further data or headers should be expected on that stream. """ def __init__(self): #: The Stream ID of the stream that was closed. self.stream_id = None def __repr__(self): return "" % self.stream_id class StreamReset(Event): """ The StreamReset event is fired in two situations. The first is when the remote party forcefully resets the stream. The second is when the remote party has made a protocol error which only affects a single stream. In this case, Hyper-h2 will terminate the stream early and return this event. .. versionchanged:: 2.0.0 This event is now fired when Hyper-h2 automatically resets a stream. """ def __init__(self): #: The Stream ID of the stream that was reset. self.stream_id = None #: The error code given. Either one of :class:`ErrorCodes #: ` or ``int`` self.error_code = None #: Whether the remote peer sent a RST_STREAM or we did. self.remote_reset = True def __repr__(self): return "" % ( self.stream_id, self.error_code, self.remote_reset ) class PushedStreamReceived(Event): """ The PushedStreamReceived event is fired whenever a pushed stream has been received from a remote peer. The event carries on it the new stream ID, the ID of the parent stream, and the request headers pushed by the remote peer. """ def __init__(self): #: The Stream ID of the stream created by the push. self.pushed_stream_id = None #: The Stream ID of the stream that the push is related to. self.parent_stream_id = None #: The request headers, sent by the remote party in the push. self.headers = None def __repr__(self): return ( "" % ( self.pushed_stream_id, self.parent_stream_id, self.headers, ) ) class SettingsAcknowledged(Event): """ The SettingsAcknowledged event is fired whenever a settings ACK is received from the remote peer. The event carries on it the settings that were acknowedged, in the same format as :class:`h2.events.RemoteSettingsChanged`. """ def __init__(self): #: A dictionary of setting byte to #: :class:`ChangedSetting `, representing #: the changed settings. self.changed_settings = {} def __repr__(self): return "" % ( ", ".join(repr(cs) for cs in self.changed_settings.values()), ) class PriorityUpdated(Event): """ The PriorityUpdated event is fired whenever a stream sends updated priority information. This can occur when the stream is opened, or at any time during the stream lifetime. This event is purely advisory, and does not need to be acted on. .. versionadded:: 2.0.0 """ def __init__(self): #: The ID of the stream whose priority information is being updated. self.stream_id = None #: The new stream weight. May be the same as the original stream #: weight. An integer between 1 and 256. self.weight = None #: The stream ID this stream now depends on. May be ``0``. self.depends_on = None #: Whether the stream *exclusively* depends on the parent stream. If it #: does, this stream should inherit the current children of its new #: parent. self.exclusive = None def __repr__(self): return ( "" % ( self.stream_id, self.weight, self.depends_on, self.exclusive ) ) class ConnectionTerminated(Event): """ The ConnectionTerminated event is fired when a connection is torn down by the remote peer using a GOAWAY frame. Once received, no further action may be taken on the connection: a new connection must be established. """ def __init__(self): #: The error code cited when tearing down the connection. Should be #: one of :class:`ErrorCodes `, but may not be if #: unknown HTTP/2 extensions are being used. self.error_code = None #: The stream ID of the last stream the remote peer saw. This can #: provide an indication of what data, if any, never reached the remote #: peer and so can safely be resent. self.last_stream_id = None #: Additional debug data that can be appended to GOAWAY frame. self.additional_data = None def __repr__(self): return ( "" % ( self.error_code, self.last_stream_id, _bytes_representation( self.additional_data[:20] if self.additional_data else None) ) ) class AlternativeServiceAvailable(Event): """ The AlternativeServiceAvailable event is fired when the remote peer advertises an `RFC 7838 `_ Alternative Service using an ALTSVC frame. This event always carries the origin to which the ALTSVC information applies. That origin is either supplied by the server directly, or inferred by hyper-h2 from the ``:authority`` pseudo-header field that was sent by the user when initiating a given stream. This event also carries what RFC 7838 calls the "Alternative Service Field Value", which is formatted like a HTTP header field and contains the relevant alternative service information. Hyper-h2 does not parse or in any way modify that information: the user is required to do that. This event can only be fired on the client end of a connection. .. versionadded:: 2.3.0 """ def __init__(self): #: The origin to which the alternative service field value applies. #: This field is either supplied by the server directly, or inferred by #: hyper-h2 from the ``:authority`` pseudo-header field that was sent #: by the user when initiating the stream on which the frame was #: received. self.origin = None #: The ALTSVC field value. This contains information about the HTTP #: alternative service being advertised by the server. Hyper-h2 does #: not parse this field: it is left exactly as sent by the server. The #: structure of the data in this field is given by `RFC 7838 Section 3 #: `_. self.field_value = None def __repr__(self): return ( "" % ( self.origin.decode('utf-8', 'ignore'), self.field_value.decode('utf-8', 'ignore'), ) ) class UnknownFrameReceived(Event): """ The UnknownFrameReceived event is fired when the remote peer sends a frame that hyper-h2 does not understand. This occurs primarily when the remote peer is employing HTTP/2 extensions that hyper-h2 doesn't know anything about. RFC 7540 requires that HTTP/2 implementations ignore these frames. hyper-h2 does so. However, this event is fired to allow implementations to perform special processing on those frames if needed (e.g. if the implementation is capable of handling the frame itself). .. versionadded:: 2.7.0 """ def __init__(self): #: The hyperframe Frame object that encapsulates the received frame. self.frame = None def __repr__(self): return "" def _bytes_representation(data): """ Converts a bytestring into something that is safe to print on all Python platforms. This function is relatively expensive, so it should not be called on the mainline of the code. It's safe to use in things like object repr methods though. """ if data is None: return None hex = binascii.hexlify(data) # This is moderately clever: on all Python versions hexlify returns a byte # string. On Python 3 we want an actual string, so we just check whether # that's what we have. if not isinstance(hex, str): # pragma: no cover hex = hex.decode('ascii') return hex h2-3.1.1/h2/exceptions.py0000664000175000017500000001240313421652727015772 0ustar ubuntuubuntu00000000000000# -*- coding: utf-8 -*- """ h2/exceptions ~~~~~~~~~~~~~ Exceptions for the HTTP/2 module. """ import h2.errors class H2Error(Exception): """ The base class for all exceptions for the HTTP/2 module. """ class ProtocolError(H2Error): """ An action was attempted in violation of the HTTP/2 protocol. """ #: The error code corresponds to this kind of Protocol Error. error_code = h2.errors.ErrorCodes.PROTOCOL_ERROR class FrameTooLargeError(ProtocolError): """ The frame that we tried to send or that we received was too large. """ #: This error code that corresponds to this kind of Protocol Error. error_code = h2.errors.ErrorCodes.FRAME_SIZE_ERROR class FrameDataMissingError(ProtocolError): """ The frame that we received is missing some data. .. versionadded:: 2.0.0 """ #: The error code that corresponds to this kind of Protocol Error error_code = h2.errors.ErrorCodes.FRAME_SIZE_ERROR class TooManyStreamsError(ProtocolError): """ An attempt was made to open a stream that would lead to too many concurrent streams. """ pass class FlowControlError(ProtocolError): """ An attempted action violates flow control constraints. """ #: The error code that corresponds to this kind of #: :class:`ProtocolError ` error_code = h2.errors.ErrorCodes.FLOW_CONTROL_ERROR class StreamIDTooLowError(ProtocolError): """ An attempt was made to open a stream that had an ID that is lower than the highest ID we have seen on this connection. """ def __init__(self, stream_id, max_stream_id): #: The ID of the stream that we attempted to open. self.stream_id = stream_id #: The current highest-seen stream ID. self.max_stream_id = max_stream_id def __str__(self): return "StreamIDTooLowError: %d is lower than %d" % ( self.stream_id, self.max_stream_id ) class NoAvailableStreamIDError(ProtocolError): """ There are no available stream IDs left to the connection. All stream IDs have been exhausted. .. versionadded:: 2.0.0 """ pass class NoSuchStreamError(ProtocolError): """ A stream-specific action referenced a stream that does not exist. .. versionchanged:: 2.0.0 Became a subclass of :class:`ProtocolError ` """ def __init__(self, stream_id): #: The stream ID that corresponds to the non-existent stream. self.stream_id = stream_id class StreamClosedError(NoSuchStreamError): """ A more specific form of :class:`NoSuchStreamError `. Indicates that the stream has since been closed, and that all state relating to that stream has been removed. """ def __init__(self, stream_id): #: The stream ID that corresponds to the nonexistent stream. self.stream_id = stream_id #: The relevant HTTP/2 error code. self.error_code = h2.errors.ErrorCodes.STREAM_CLOSED # Any events that internal code may need to fire. Not relevant to # external users that may receive a StreamClosedError. self._events = [] class InvalidSettingsValueError(ProtocolError, ValueError): """ An attempt was made to set an invalid Settings value. .. versionadded:: 2.0.0 """ def __init__(self, msg, error_code): super(InvalidSettingsValueError, self).__init__(msg) self.error_code = error_code class InvalidBodyLengthError(ProtocolError): """ The remote peer sent more or less data that the Content-Length header indicated. .. versionadded:: 2.0.0 """ def __init__(self, expected, actual): self.expected_length = expected self.actual_length = actual def __str__(self): return "InvalidBodyLengthError: Expected %d bytes, received %d" % ( self.expected_length, self.actual_length ) class UnsupportedFrameError(ProtocolError, KeyError): """ The remote peer sent a frame that is unsupported in this context. .. versionadded:: 2.1.0 """ # TODO: Remove the KeyError in 3.0.0 pass class RFC1122Error(H2Error): """ Emitted when users attempt to do something that is literally allowed by the relevant RFC, but is sufficiently ill-defined that it's unwise to allow users to actually do it. While there is some disagreement about whether or not we should be liberal in what accept, it is a truth universally acknowledged that we should be conservative in what emit. .. versionadded:: 2.4.0 """ # shazow says I'm going to regret naming the exception this way. If that # turns out to be true, TELL HIM NOTHING. pass class DenialOfServiceError(ProtocolError): """ Emitted when the remote peer exhibits a behaviour that is likely to be an attempt to perform a Denial of Service attack on the implementation. This is a form of ProtocolError that carries a different error code, and allows more easy detection of this kind of behaviour. .. versionadded:: 2.5.0 """ #: The error code that corresponds to this kind of #: :class:`ProtocolError ` error_code = h2.errors.ErrorCodes.ENHANCE_YOUR_CALM h2-3.1.1/h2/frame_buffer.py0000664000175000017500000001516313421652727016242 0ustar ubuntuubuntu00000000000000# -*- coding: utf-8 -*- """ h2/frame_buffer ~~~~~~~~~~~~~~~ A data structure that provides a way to iterate over a byte buffer in terms of frames. """ from hyperframe.exceptions import InvalidFrameError from hyperframe.frame import ( Frame, HeadersFrame, ContinuationFrame, PushPromiseFrame ) from .exceptions import ( ProtocolError, FrameTooLargeError, FrameDataMissingError ) # To avoid a DOS attack based on sending loads of continuation frames, we limit # the maximum number we're perpared to receive. In this case, we'll set the # limit to 64, which means the largest encoded header block we can receive by # default is 262144 bytes long, and the largest possible *at all* is 1073741760 # bytes long. # # This value seems reasonable for now, but in future we may want to evaluate # making it configurable. CONTINUATION_BACKLOG = 64 class FrameBuffer(object): """ This is a data structure that expects to act as a buffer for HTTP/2 data that allows iteraton in terms of H2 frames. """ def __init__(self, server=False): self.data = b'' self.max_frame_size = 0 self._preamble = b'PRI * HTTP/2.0\r\n\r\nSM\r\n\r\n' if server else b'' self._preamble_len = len(self._preamble) self._headers_buffer = [] def add_data(self, data): """ Add more data to the frame buffer. :param data: A bytestring containing the byte buffer. """ if self._preamble_len: data_len = len(data) of_which_preamble = min(self._preamble_len, data_len) if self._preamble[:of_which_preamble] != data[:of_which_preamble]: raise ProtocolError("Invalid HTTP/2 preamble.") data = data[of_which_preamble:] self._preamble_len -= of_which_preamble self._preamble = self._preamble[of_which_preamble:] self.data += data def _parse_frame_header(self, data): """ Parses the frame header from the data. Either returns a tuple of (frame, length), or throws an exception. The returned frame may be None if the frame is of unknown type. """ try: frame, length = Frame.parse_frame_header(data[:9]) except ValueError as e: # The frame header is invalid. This is a ProtocolError raise ProtocolError("Invalid frame header received: %s" % str(e)) return frame, length def _validate_frame_length(self, length): """ Confirm that the frame is an appropriate length. """ if length > self.max_frame_size: raise FrameTooLargeError( "Received overlong frame: length %d, max %d" % (length, self.max_frame_size) ) def _update_header_buffer(self, f): """ Updates the internal header buffer. Returns a frame that should replace the current one. May throw exceptions if this frame is invalid. """ # Check if we're in the middle of a headers block. If we are, this # frame *must* be a CONTINUATION frame with the same stream ID as the # leading HEADERS or PUSH_PROMISE frame. Anything else is a # ProtocolError. If the frame *is* valid, append it to the header # buffer. if self._headers_buffer: stream_id = self._headers_buffer[0].stream_id valid_frame = ( f is not None and isinstance(f, ContinuationFrame) and f.stream_id == stream_id ) if not valid_frame: raise ProtocolError("Invalid frame during header block.") # Append the frame to the buffer. self._headers_buffer.append(f) if len(self._headers_buffer) > CONTINUATION_BACKLOG: raise ProtocolError("Too many continuation frames received.") # If this is the end of the header block, then we want to build a # mutant HEADERS frame that's massive. Use the original one we got, # then set END_HEADERS and set its data appopriately. If it's not # the end of the block, lose the current frame: we can't yield it. if 'END_HEADERS' in f.flags: f = self._headers_buffer[0] f.flags.add('END_HEADERS') f.data = b''.join(x.data for x in self._headers_buffer) self._headers_buffer = [] else: f = None elif (isinstance(f, (HeadersFrame, PushPromiseFrame)) and 'END_HEADERS' not in f.flags): # This is the start of a headers block! Save the frame off and then # act like we didn't receive one. self._headers_buffer.append(f) f = None return f # The methods below support the iterator protocol. def __iter__(self): return self def next(self): # Python 2 # First, check that we have enough data to successfully parse the # next frame header. If not, bail. Otherwise, parse it. if len(self.data) < 9: raise StopIteration() try: f, length = self._parse_frame_header(self.data) except InvalidFrameError: # pragma: no cover raise ProtocolError("Received frame with invalid frame header.") # Next, check that we have enough length to parse the frame body. If # not, bail, leaving the frame header data in the buffer for next time. if len(self.data) < length + 9: raise StopIteration() # Confirm the frame has an appropriate length. self._validate_frame_length(length) # Don't try to parse the body if we didn't get a frame we know about: # there's nothing we can do with it anyway. if f is not None: try: f.parse_body(memoryview(self.data[9:9+length])) except InvalidFrameError: raise FrameDataMissingError("Frame data missing or invalid") # At this point, as we know we'll use or discard the entire frame, we # can update the data. self.data = self.data[9+length:] # Pass the frame through the header buffer. f = self._update_header_buffer(f) # If we got a frame we didn't understand or shouldn't yield, rather # than return None it'd be better if we just tried to get the next # frame in the sequence instead. Recurse back into ourselves to do # that. This is safe because the amount of work we have to do here is # strictly bounded by the length of the buffer. return f if f is not None else self.next() def __next__(self): # Python 3 return self.next() h2-3.1.1/h2/settings.py0000664000175000017500000002704613421652727015462 0ustar ubuntuubuntu00000000000000# -*- coding: utf-8 -*- """ h2/settings ~~~~~~~~~~~ This module contains a HTTP/2 settings object. This object provides a simple API for manipulating HTTP/2 settings, keeping track of both the current active state of the settings and the unacknowledged future values of the settings. """ import collections import enum from hyperframe.frame import SettingsFrame from h2.errors import ErrorCodes from h2.exceptions import InvalidSettingsValueError try: from collections.abc import MutableMapping except ImportError: # pragma: no cover # Python 2.7 compatibility from collections import MutableMapping class SettingCodes(enum.IntEnum): """ All known HTTP/2 setting codes. .. versionadded:: 2.6.0 """ #: Allows the sender to inform the remote endpoint of the maximum size of #: the header compression table used to decode header blocks, in octets. HEADER_TABLE_SIZE = SettingsFrame.HEADER_TABLE_SIZE #: This setting can be used to disable server push. To disable server push #: on a client, set this to 0. ENABLE_PUSH = SettingsFrame.ENABLE_PUSH #: Indicates the maximum number of concurrent streams that the sender will #: allow. MAX_CONCURRENT_STREAMS = SettingsFrame.MAX_CONCURRENT_STREAMS #: Indicates the sender's initial window size (in octets) for stream-level #: flow control. INITIAL_WINDOW_SIZE = SettingsFrame.INITIAL_WINDOW_SIZE #: Indicates the size of the largest frame payload that the sender is #: willing to receive, in octets. MAX_FRAME_SIZE = SettingsFrame.MAX_FRAME_SIZE #: This advisory setting informs a peer of the maximum size of header list #: that the sender is prepared to accept, in octets. The value is based on #: the uncompressed size of header fields, including the length of the name #: and value in octets plus an overhead of 32 octets for each header field. MAX_HEADER_LIST_SIZE = SettingsFrame.MAX_HEADER_LIST_SIZE #: This setting can be used to enable the connect protocol. To enable on a #: client set this to 1. ENABLE_CONNECT_PROTOCOL = SettingsFrame.ENABLE_CONNECT_PROTOCOL def _setting_code_from_int(code): """ Given an integer setting code, returns either one of :class:`SettingCodes ` or, if not present in the known set of codes, returns the integer directly. """ try: return SettingCodes(code) except ValueError: return code class ChangedSetting: def __init__(self, setting, original_value, new_value): #: The setting code given. Either one of :class:`SettingCodes #: ` or ``int`` #: #: .. versionchanged:: 2.6.0 self.setting = setting #: The original value before being changed. self.original_value = original_value #: The new value after being changed. self.new_value = new_value def __repr__(self): return ( "ChangedSetting(setting=%s, original_value=%s, " "new_value=%s)" ) % ( self.setting, self.original_value, self.new_value ) class Settings(MutableMapping): """ An object that encapsulates HTTP/2 settings state. HTTP/2 Settings are a complex beast. Each party, remote and local, has its own settings and a view of the other party's settings. When a settings frame is emitted by a peer it cannot assume that the new settings values are in place until the remote peer acknowledges the setting. In principle, multiple settings changes can be "in flight" at the same time, all with different values. This object encapsulates this mess. It provides a dict-like interface to settings, which return the *current* values of the settings in question. Additionally, it keeps track of the stack of proposed values: each time an acknowledgement is sent/received, it updates the current values with the stack of proposed values. On top of all that, it validates the values to make sure they're allowed, and raises :class:`InvalidSettingsValueError ` if they are not. Finally, this object understands what the default values of the HTTP/2 settings are, and sets those defaults appropriately. .. versionchanged:: 2.2.0 Added the ``initial_values`` parameter. .. versionchanged:: 2.5.0 Added the ``max_header_list_size`` property. :param client: (optional) Whether these settings should be defaulted for a client implementation or a server implementation. Defaults to ``True``. :type client: ``bool`` :param initial_values: (optional) Any initial values the user would like set, rather than RFC 7540's defaults. :type initial_vales: ``MutableMapping`` """ def __init__(self, client=True, initial_values=None): # Backing object for the settings. This is a dictionary of # (setting: [list of values]), where the first value in the list is the # current value of the setting. Strictly this doesn't use lists but # instead uses collections.deque to avoid repeated memory allocations. # # This contains the default values for HTTP/2. self._settings = { SettingCodes.HEADER_TABLE_SIZE: collections.deque([4096]), SettingCodes.ENABLE_PUSH: collections.deque([int(client)]), SettingCodes.INITIAL_WINDOW_SIZE: collections.deque([65535]), SettingCodes.MAX_FRAME_SIZE: collections.deque([16384]), SettingCodes.ENABLE_CONNECT_PROTOCOL: collections.deque([0]), } if initial_values is not None: for key, value in initial_values.items(): invalid = _validate_setting(key, value) if invalid: raise InvalidSettingsValueError( "Setting %d has invalid value %d" % (key, value), error_code=invalid ) self._settings[key] = collections.deque([value]) def acknowledge(self): """ The settings have been acknowledged, either by the user (remote settings) or by the remote peer (local settings). :returns: A dict of {setting: ChangedSetting} that were applied. """ changed_settings = {} # If there is more than one setting in the list, we have a setting # value outstanding. Update them. for k, v in self._settings.items(): if len(v) > 1: old_setting = v.popleft() new_setting = v[0] changed_settings[k] = ChangedSetting( k, old_setting, new_setting ) return changed_settings # Provide easy-access to well known settings. @property def header_table_size(self): """ The current value of the :data:`HEADER_TABLE_SIZE ` setting. """ return self[SettingCodes.HEADER_TABLE_SIZE] @header_table_size.setter def header_table_size(self, value): self[SettingCodes.HEADER_TABLE_SIZE] = value @property def enable_push(self): """ The current value of the :data:`ENABLE_PUSH ` setting. """ return self[SettingCodes.ENABLE_PUSH] @enable_push.setter def enable_push(self, value): self[SettingCodes.ENABLE_PUSH] = value @property def initial_window_size(self): """ The current value of the :data:`INITIAL_WINDOW_SIZE ` setting. """ return self[SettingCodes.INITIAL_WINDOW_SIZE] @initial_window_size.setter def initial_window_size(self, value): self[SettingCodes.INITIAL_WINDOW_SIZE] = value @property def max_frame_size(self): """ The current value of the :data:`MAX_FRAME_SIZE ` setting. """ return self[SettingCodes.MAX_FRAME_SIZE] @max_frame_size.setter def max_frame_size(self, value): self[SettingCodes.MAX_FRAME_SIZE] = value @property def max_concurrent_streams(self): """ The current value of the :data:`MAX_CONCURRENT_STREAMS ` setting. """ return self.get(SettingCodes.MAX_CONCURRENT_STREAMS, 2**32+1) @max_concurrent_streams.setter def max_concurrent_streams(self, value): self[SettingCodes.MAX_CONCURRENT_STREAMS] = value @property def max_header_list_size(self): """ The current value of the :data:`MAX_HEADER_LIST_SIZE ` setting. If not set, returns ``None``, which means unlimited. .. versionadded:: 2.5.0 """ return self.get(SettingCodes.MAX_HEADER_LIST_SIZE, None) @max_header_list_size.setter def max_header_list_size(self, value): self[SettingCodes.MAX_HEADER_LIST_SIZE] = value @property def enable_connect_protocol(self): """ The current value of the :data:`ENABLE_CONNECT_PROTOCOL ` setting. """ return self[SettingCodes.ENABLE_CONNECT_PROTOCOL] @enable_connect_protocol.setter def enable_connect_protocol(self, value): self[SettingCodes.ENABLE_CONNECT_PROTOCOL] = value # Implement the MutableMapping API. def __getitem__(self, key): val = self._settings[key][0] # Things that were created when a setting was received should stay # KeyError'd. if val is None: raise KeyError return val def __setitem__(self, key, value): invalid = _validate_setting(key, value) if invalid: raise InvalidSettingsValueError( "Setting %d has invalid value %d" % (key, value), error_code=invalid ) try: items = self._settings[key] except KeyError: items = collections.deque([None]) self._settings[key] = items items.append(value) def __delitem__(self, key): del self._settings[key] def __iter__(self): return self._settings.__iter__() def __len__(self): return len(self._settings) def __eq__(self, other): if isinstance(other, Settings): return self._settings == other._settings else: return NotImplemented def __ne__(self, other): if isinstance(other, Settings): return not self == other else: return NotImplemented def _validate_setting(setting, value): # noqa: C901 """ Confirms that a specific setting has a well-formed value. If the setting is invalid, returns an error code. Otherwise, returns 0 (NO_ERROR). """ if setting == SettingCodes.ENABLE_PUSH: if value not in (0, 1): return ErrorCodes.PROTOCOL_ERROR elif setting == SettingCodes.INITIAL_WINDOW_SIZE: if not 0 <= value <= 2147483647: # 2^31 - 1 return ErrorCodes.FLOW_CONTROL_ERROR elif setting == SettingCodes.MAX_FRAME_SIZE: if not 16384 <= value <= 16777215: # 2^14 and 2^24 - 1 return ErrorCodes.PROTOCOL_ERROR elif setting == SettingCodes.MAX_HEADER_LIST_SIZE: if value < 0: return ErrorCodes.PROTOCOL_ERROR elif setting == SettingCodes.ENABLE_CONNECT_PROTOCOL: if value not in (0, 1): return ErrorCodes.PROTOCOL_ERROR return 0 h2-3.1.1/h2/stream.py0000664000175000017500000015225713521033071015102 0ustar ubuntuubuntu00000000000000# -*- coding: utf-8 -*- """ h2/stream ~~~~~~~~~ An implementation of a HTTP/2 stream. """ from enum import Enum, IntEnum from hpack import HeaderTuple from hyperframe.frame import ( HeadersFrame, ContinuationFrame, DataFrame, WindowUpdateFrame, RstStreamFrame, PushPromiseFrame, AltSvcFrame ) from .errors import ErrorCodes, _error_code_from_int from .events import ( RequestReceived, ResponseReceived, DataReceived, WindowUpdated, StreamEnded, PushedStreamReceived, StreamReset, TrailersReceived, InformationalResponseReceived, AlternativeServiceAvailable, _ResponseSent, _RequestSent, _TrailersSent, _PushedRequestSent ) from .exceptions import ( ProtocolError, StreamClosedError, InvalidBodyLengthError, FlowControlError ) from .utilities import ( guard_increment_window, is_informational_response, authority_from_headers, validate_headers, validate_outbound_headers, normalize_outbound_headers, HeaderValidationFlags, extract_method_header, normalize_inbound_headers ) from .windows import WindowManager class StreamState(IntEnum): IDLE = 0 RESERVED_REMOTE = 1 RESERVED_LOCAL = 2 OPEN = 3 HALF_CLOSED_REMOTE = 4 HALF_CLOSED_LOCAL = 5 CLOSED = 6 class StreamInputs(Enum): SEND_HEADERS = 0 SEND_PUSH_PROMISE = 1 SEND_RST_STREAM = 2 SEND_DATA = 3 SEND_WINDOW_UPDATE = 4 SEND_END_STREAM = 5 RECV_HEADERS = 6 RECV_PUSH_PROMISE = 7 RECV_RST_STREAM = 8 RECV_DATA = 9 RECV_WINDOW_UPDATE = 10 RECV_END_STREAM = 11 RECV_CONTINUATION = 12 # Added in 2.0.0 SEND_INFORMATIONAL_HEADERS = 13 # Added in 2.2.0 RECV_INFORMATIONAL_HEADERS = 14 # Added in 2.2.0 SEND_ALTERNATIVE_SERVICE = 15 # Added in 2.3.0 RECV_ALTERNATIVE_SERVICE = 16 # Added in 2.3.0 UPGRADE_CLIENT = 17 # Added 2.3.0 UPGRADE_SERVER = 18 # Added 2.3.0 class StreamClosedBy(Enum): SEND_END_STREAM = 0 RECV_END_STREAM = 1 SEND_RST_STREAM = 2 RECV_RST_STREAM = 3 # This array is initialized once, and is indexed by the stream states above. # It indicates whether a stream in the given state is open. The reason we do # this is that we potentially check whether a stream in a given state is open # quite frequently: given that we check so often, we should do so in the # fastest and most performant way possible. STREAM_OPEN = [False for _ in range(0, len(StreamState))] STREAM_OPEN[StreamState.OPEN] = True STREAM_OPEN[StreamState.HALF_CLOSED_LOCAL] = True STREAM_OPEN[StreamState.HALF_CLOSED_REMOTE] = True class H2StreamStateMachine(object): """ A single HTTP/2 stream state machine. This stream object implements basically the state machine described in RFC 7540 section 5.1. :param stream_id: The stream ID of this stream. This is stored primarily for logging purposes. """ def __init__(self, stream_id): self.state = StreamState.IDLE self.stream_id = stream_id #: Whether this peer is the client side of this stream. self.client = None # Whether trailers have been sent/received on this stream or not. self.headers_sent = None self.trailers_sent = None self.headers_received = None self.trailers_received = None # How the stream was closed. One of StreamClosedBy. self.stream_closed_by = None def process_input(self, input_): """ Process a specific input in the state machine. """ if not isinstance(input_, StreamInputs): raise ValueError("Input must be an instance of StreamInputs") try: func, target_state = _transitions[(self.state, input_)] except KeyError: old_state = self.state self.state = StreamState.CLOSED raise ProtocolError( "Invalid input %s in state %s" % (input_, old_state) ) else: previous_state = self.state self.state = target_state if func is not None: try: return func(self, previous_state) except ProtocolError: self.state = StreamState.CLOSED raise except AssertionError as e: # pragma: no cover self.state = StreamState.CLOSED raise ProtocolError(e) return [] def request_sent(self, previous_state): """ Fires when a request is sent. """ self.client = True self.headers_sent = True event = _RequestSent() return [event] def response_sent(self, previous_state): """ Fires when something that should be a response is sent. This 'response' may actually be trailers. """ if not self.headers_sent: if self.client is True or self.client is None: raise ProtocolError("Client cannot send responses.") self.headers_sent = True event = _ResponseSent() else: assert not self.trailers_sent self.trailers_sent = True event = _TrailersSent() return [event] def request_received(self, previous_state): """ Fires when a request is received. """ assert not self.headers_received assert not self.trailers_received self.client = False self.headers_received = True event = RequestReceived() event.stream_id = self.stream_id return [event] def response_received(self, previous_state): """ Fires when a response is received. Also disambiguates between responses and trailers. """ if not self.headers_received: assert self.client is True self.headers_received = True event = ResponseReceived() else: assert not self.trailers_received self.trailers_received = True event = TrailersReceived() event.stream_id = self.stream_id return [event] def data_received(self, previous_state): """ Fires when data is received. """ event = DataReceived() event.stream_id = self.stream_id return [event] def window_updated(self, previous_state): """ Fires when a window update frame is received. """ event = WindowUpdated() event.stream_id = self.stream_id return [event] def stream_half_closed(self, previous_state): """ Fires when an END_STREAM flag is received in the OPEN state, transitioning this stream to a HALF_CLOSED_REMOTE state. """ event = StreamEnded() event.stream_id = self.stream_id return [event] def stream_ended(self, previous_state): """ Fires when a stream is cleanly ended. """ self.stream_closed_by = StreamClosedBy.RECV_END_STREAM event = StreamEnded() event.stream_id = self.stream_id return [event] def stream_reset(self, previous_state): """ Fired when a stream is forcefully reset. """ self.stream_closed_by = StreamClosedBy.RECV_RST_STREAM event = StreamReset() event.stream_id = self.stream_id return [event] def send_new_pushed_stream(self, previous_state): """ Fires on the newly pushed stream, when pushed by the local peer. No event here, but definitionally this peer must be a server. """ assert self.client is None self.client = False self.headers_received = True return [] def recv_new_pushed_stream(self, previous_state): """ Fires on the newly pushed stream, when pushed by the remote peer. No event here, but definitionally this peer must be a client. """ assert self.client is None self.client = True self.headers_sent = True return [] def send_push_promise(self, previous_state): """ Fires on the already-existing stream when a PUSH_PROMISE frame is sent. We may only send PUSH_PROMISE frames if we're a server. """ if self.client is True: raise ProtocolError("Cannot push streams from client peers.") event = _PushedRequestSent() return [event] def recv_push_promise(self, previous_state): """ Fires on the already-existing stream when a PUSH_PROMISE frame is received. We may only receive PUSH_PROMISE frames if we're a client. Fires a PushedStreamReceived event. """ if not self.client: if self.client is None: # pragma: no cover msg = "Idle streams cannot receive pushes" else: # pragma: no cover msg = "Cannot receive pushed streams as a server" raise ProtocolError(msg) event = PushedStreamReceived() event.parent_stream_id = self.stream_id return [event] def send_end_stream(self, previous_state): """ Called when an attempt is made to send END_STREAM in the HALF_CLOSED_REMOTE state. """ self.stream_closed_by = StreamClosedBy.SEND_END_STREAM def send_reset_stream(self, previous_state): """ Called when an attempt is made to send RST_STREAM in a non-closed stream state. """ self.stream_closed_by = StreamClosedBy.SEND_RST_STREAM def reset_stream_on_error(self, previous_state): """ Called when we need to forcefully emit another RST_STREAM frame on behalf of the state machine. If this is the first time we've done this, we should also hang an event off the StreamClosedError so that the user can be informed. We know it's the first time we've done this if the stream is currently in a state other than CLOSED. """ self.stream_closed_by = StreamClosedBy.SEND_RST_STREAM error = StreamClosedError(self.stream_id) event = StreamReset() event.stream_id = self.stream_id event.error_code = ErrorCodes.STREAM_CLOSED event.remote_reset = False error._events = [event] raise error def recv_on_closed_stream(self, previous_state): """ Called when an unexpected frame is received on an already-closed stream. An endpoint that receives an unexpected frame should treat it as a stream error or connection error with type STREAM_CLOSED, depending on the specific frame. The error handling is done at a higher level: this just raises the appropriate error. """ raise StreamClosedError(self.stream_id) def send_on_closed_stream(self, previous_state): """ Called when an attempt is made to send data on an already-closed stream. This essentially overrides the standard logic by throwing a more-specific error: StreamClosedError. This is a ProtocolError, so it matches the standard API of the state machine, but provides more detail to the user. """ raise StreamClosedError(self.stream_id) def recv_push_on_closed_stream(self, previous_state): """ Called when a PUSH_PROMISE frame is received on a full stop stream. If the stream was closed by us sending a RST_STREAM frame, then we presume that the PUSH_PROMISE was in flight when we reset the parent stream. Rathen than accept the new stream, we just reset it. Otherwise, we should call this a PROTOCOL_ERROR: pushing a stream on a naturally closed stream is a real problem because it creates a brand new stream that the remote peer now believes exists. """ assert self.stream_closed_by is not None if self.stream_closed_by == StreamClosedBy.SEND_RST_STREAM: raise StreamClosedError(self.stream_id) else: raise ProtocolError("Attempted to push on closed stream.") def send_push_on_closed_stream(self, previous_state): """ Called when an attempt is made to push on an already-closed stream. This essentially overrides the standard logic by providing a more useful error message. It's necessary because simply indicating that the stream is closed is not enough: there is now a new stream that is not allowed to be there. The only recourse is to tear the whole connection down. """ raise ProtocolError("Attempted to push on closed stream.") def send_informational_response(self, previous_state): """ Called when an informational header block is sent (that is, a block where the :status header has a 1XX value). Only enforces that these are sent *before* final headers are sent. """ if self.headers_sent: raise ProtocolError("Information response after final response") event = _ResponseSent() return [event] def recv_informational_response(self, previous_state): """ Called when an informational header block is received (that is, a block where the :status header has a 1XX value). """ if self.headers_received: raise ProtocolError("Informational response after final response") event = InformationalResponseReceived() event.stream_id = self.stream_id return [event] def recv_alt_svc(self, previous_state): """ Called when receiving an ALTSVC frame. RFC 7838 allows us to receive ALTSVC frames at any stream state, which is really absurdly overzealous. For that reason, we want to limit the states in which we can actually receive it. It's really only sensible to receive it after we've sent our own headers and before the server has sent its header block: the server can't guarantee that we have any state around after it completes its header block, and the server doesn't know what origin we're talking about before we've sent ours. For that reason, this function applies a few extra checks on both state and some of the little state variables we keep around. If those suggest an unreasonable situation for the ALTSVC frame to have been sent in, we quietly ignore it (as RFC 7838 suggests). This function is also *not* always called by the state machine. In some states (IDLE, RESERVED_LOCAL, CLOSED) we don't bother to call it, because we know the frame cannot be valid in that state (IDLE because the server cannot know what origin the stream applies to, CLOSED because the server cannot assume we still have state around, RESERVED_LOCAL because by definition if we're in the RESERVED_LOCAL state then *we* are the server). """ # Servers can't receive ALTSVC frames, but RFC 7838 tells us to ignore # them. if self.client is False: return [] # If we've received the response headers from the server they can't # guarantee we still have any state around. Other implementations # (like nghttp2) ignore ALTSVC in this state, so we will too. if self.headers_received: return [] # Otherwise, this is a sensible enough frame to have received. Return # the event and let it get populated. return [AlternativeServiceAvailable()] def send_alt_svc(self, previous_state): """ Called when sending an ALTSVC frame on this stream. For consistency with the restrictions we apply on receiving ALTSVC frames in ``recv_alt_svc``, we want to restrict when users can send ALTSVC frames to the situations when we ourselves would accept them. That means: when we are a server, when we have received the request headers, and when we have not yet sent our own response headers. """ # We should not send ALTSVC after we've sent response headers, as the # client may have disposed of its state. if self.headers_sent: raise ProtocolError( "Cannot send ALTSVC after sending response headers." ) return # STATE MACHINE # # The stream state machine is defined here to avoid the need to allocate it # repeatedly for each stream. It cannot be defined in the stream class because # it needs to be able to reference the callbacks defined on the class, but # because Python's scoping rules are weird the class object is not actually in # scope during the body of the class object. # # For the sake of clarity, we reproduce the RFC 7540 state machine here: # # +--------+ # send PP | | recv PP # ,--------| idle |--------. # / | | \ # v +--------+ v # +----------+ | +----------+ # | | | send H / | | # ,------| reserved | | recv H | reserved |------. # | | (local) | | | (remote) | | # | +----------+ v +----------+ | # | | +--------+ | | # | | recv ES | | send ES | | # | send H | ,-------| open |-------. | recv H | # | | / | | \ | | # | v v +--------+ v v | # | +----------+ | +----------+ | # | | half | | | half | | # | | closed | | send R / | closed | | # | | (remote) | | recv R | (local) | | # | +----------+ | +----------+ | # | | | | | # | | send ES / | recv ES / | | # | | send R / v send R / | | # | | recv R +--------+ recv R | | # | send R / `----------->| |<-----------' send R / | # | recv R | closed | recv R | # `----------------------->| |<----------------------' # +--------+ # # send: endpoint sends this frame # recv: endpoint receives this frame # # H: HEADERS frame (with implied CONTINUATIONs) # PP: PUSH_PROMISE frame (with implied CONTINUATIONs) # ES: END_STREAM flag # R: RST_STREAM frame # # For the purposes of this state machine we treat HEADERS and their # associated CONTINUATION frames as a single jumbo frame. The protocol # allows/requires this by preventing other frames from being interleved in # between HEADERS/CONTINUATION frames. However, if a CONTINUATION frame is # received without a prior HEADERS frame, it *will* be passed to this state # machine. The state machine should always reject that frame, either as an # invalid transition or because the stream is closed. # # There is a confusing relationship around PUSH_PROMISE frames. The state # machine above considers them to be frames belonging to the new stream, # which is *somewhat* true. However, they are sent with the stream ID of # their related stream, and are only sendable in some cases. # For this reason, our state machine implementation below allows for # PUSH_PROMISE frames both in the IDLE state (as in the diagram), but also # in the OPEN, HALF_CLOSED_LOCAL, and HALF_CLOSED_REMOTE states. # Essentially, for hyper-h2, PUSH_PROMISE frames are effectively sent on # two streams. # # The _transitions dictionary contains a mapping of tuples of # (state, input) to tuples of (side_effect_function, end_state). This # map contains all allowed transitions: anything not in this map is # invalid and immediately causes a transition to ``closed``. _transitions = { # State: idle (StreamState.IDLE, StreamInputs.SEND_HEADERS): (H2StreamStateMachine.request_sent, StreamState.OPEN), (StreamState.IDLE, StreamInputs.RECV_HEADERS): (H2StreamStateMachine.request_received, StreamState.OPEN), (StreamState.IDLE, StreamInputs.RECV_DATA): (H2StreamStateMachine.reset_stream_on_error, StreamState.CLOSED), (StreamState.IDLE, StreamInputs.SEND_PUSH_PROMISE): (H2StreamStateMachine.send_new_pushed_stream, StreamState.RESERVED_LOCAL), (StreamState.IDLE, StreamInputs.RECV_PUSH_PROMISE): (H2StreamStateMachine.recv_new_pushed_stream, StreamState.RESERVED_REMOTE), (StreamState.IDLE, StreamInputs.RECV_ALTERNATIVE_SERVICE): (None, StreamState.IDLE), (StreamState.IDLE, StreamInputs.UPGRADE_CLIENT): (H2StreamStateMachine.request_sent, StreamState.HALF_CLOSED_LOCAL), (StreamState.IDLE, StreamInputs.UPGRADE_SERVER): (H2StreamStateMachine.request_received, StreamState.HALF_CLOSED_REMOTE), # State: reserved local (StreamState.RESERVED_LOCAL, StreamInputs.SEND_HEADERS): (H2StreamStateMachine.response_sent, StreamState.HALF_CLOSED_REMOTE), (StreamState.RESERVED_LOCAL, StreamInputs.RECV_DATA): (H2StreamStateMachine.reset_stream_on_error, StreamState.CLOSED), (StreamState.RESERVED_LOCAL, StreamInputs.SEND_WINDOW_UPDATE): (None, StreamState.RESERVED_LOCAL), (StreamState.RESERVED_LOCAL, StreamInputs.RECV_WINDOW_UPDATE): (H2StreamStateMachine.window_updated, StreamState.RESERVED_LOCAL), (StreamState.RESERVED_LOCAL, StreamInputs.SEND_RST_STREAM): (H2StreamStateMachine.send_reset_stream, StreamState.CLOSED), (StreamState.RESERVED_LOCAL, StreamInputs.RECV_RST_STREAM): (H2StreamStateMachine.stream_reset, StreamState.CLOSED), (StreamState.RESERVED_LOCAL, StreamInputs.SEND_ALTERNATIVE_SERVICE): (H2StreamStateMachine.send_alt_svc, StreamState.RESERVED_LOCAL), (StreamState.RESERVED_LOCAL, StreamInputs.RECV_ALTERNATIVE_SERVICE): (None, StreamState.RESERVED_LOCAL), # State: reserved remote (StreamState.RESERVED_REMOTE, StreamInputs.RECV_HEADERS): (H2StreamStateMachine.response_received, StreamState.HALF_CLOSED_LOCAL), (StreamState.RESERVED_REMOTE, StreamInputs.RECV_DATA): (H2StreamStateMachine.reset_stream_on_error, StreamState.CLOSED), (StreamState.RESERVED_REMOTE, StreamInputs.SEND_WINDOW_UPDATE): (None, StreamState.RESERVED_REMOTE), (StreamState.RESERVED_REMOTE, StreamInputs.RECV_WINDOW_UPDATE): (H2StreamStateMachine.window_updated, StreamState.RESERVED_REMOTE), (StreamState.RESERVED_REMOTE, StreamInputs.SEND_RST_STREAM): (H2StreamStateMachine.send_reset_stream, StreamState.CLOSED), (StreamState.RESERVED_REMOTE, StreamInputs.RECV_RST_STREAM): (H2StreamStateMachine.stream_reset, StreamState.CLOSED), (StreamState.RESERVED_REMOTE, StreamInputs.RECV_ALTERNATIVE_SERVICE): (H2StreamStateMachine.recv_alt_svc, StreamState.RESERVED_REMOTE), # State: open (StreamState.OPEN, StreamInputs.SEND_HEADERS): (H2StreamStateMachine.response_sent, StreamState.OPEN), (StreamState.OPEN, StreamInputs.RECV_HEADERS): (H2StreamStateMachine.response_received, StreamState.OPEN), (StreamState.OPEN, StreamInputs.SEND_DATA): (None, StreamState.OPEN), (StreamState.OPEN, StreamInputs.RECV_DATA): (H2StreamStateMachine.data_received, StreamState.OPEN), (StreamState.OPEN, StreamInputs.SEND_END_STREAM): (None, StreamState.HALF_CLOSED_LOCAL), (StreamState.OPEN, StreamInputs.RECV_END_STREAM): (H2StreamStateMachine.stream_half_closed, StreamState.HALF_CLOSED_REMOTE), (StreamState.OPEN, StreamInputs.SEND_WINDOW_UPDATE): (None, StreamState.OPEN), (StreamState.OPEN, StreamInputs.RECV_WINDOW_UPDATE): (H2StreamStateMachine.window_updated, StreamState.OPEN), (StreamState.OPEN, StreamInputs.SEND_RST_STREAM): (H2StreamStateMachine.send_reset_stream, StreamState.CLOSED), (StreamState.OPEN, StreamInputs.RECV_RST_STREAM): (H2StreamStateMachine.stream_reset, StreamState.CLOSED), (StreamState.OPEN, StreamInputs.SEND_PUSH_PROMISE): (H2StreamStateMachine.send_push_promise, StreamState.OPEN), (StreamState.OPEN, StreamInputs.RECV_PUSH_PROMISE): (H2StreamStateMachine.recv_push_promise, StreamState.OPEN), (StreamState.OPEN, StreamInputs.SEND_INFORMATIONAL_HEADERS): (H2StreamStateMachine.send_informational_response, StreamState.OPEN), (StreamState.OPEN, StreamInputs.RECV_INFORMATIONAL_HEADERS): (H2StreamStateMachine.recv_informational_response, StreamState.OPEN), (StreamState.OPEN, StreamInputs.SEND_ALTERNATIVE_SERVICE): (H2StreamStateMachine.send_alt_svc, StreamState.OPEN), (StreamState.OPEN, StreamInputs.RECV_ALTERNATIVE_SERVICE): (H2StreamStateMachine.recv_alt_svc, StreamState.OPEN), # State: half-closed remote (StreamState.HALF_CLOSED_REMOTE, StreamInputs.SEND_HEADERS): (H2StreamStateMachine.response_sent, StreamState.HALF_CLOSED_REMOTE), (StreamState.HALF_CLOSED_REMOTE, StreamInputs.RECV_HEADERS): (H2StreamStateMachine.reset_stream_on_error, StreamState.CLOSED), (StreamState.HALF_CLOSED_REMOTE, StreamInputs.SEND_DATA): (None, StreamState.HALF_CLOSED_REMOTE), (StreamState.HALF_CLOSED_REMOTE, StreamInputs.RECV_DATA): (H2StreamStateMachine.reset_stream_on_error, StreamState.CLOSED), (StreamState.HALF_CLOSED_REMOTE, StreamInputs.SEND_END_STREAM): (H2StreamStateMachine.send_end_stream, StreamState.CLOSED), (StreamState.HALF_CLOSED_REMOTE, StreamInputs.SEND_WINDOW_UPDATE): (None, StreamState.HALF_CLOSED_REMOTE), (StreamState.HALF_CLOSED_REMOTE, StreamInputs.RECV_WINDOW_UPDATE): (H2StreamStateMachine.window_updated, StreamState.HALF_CLOSED_REMOTE), (StreamState.HALF_CLOSED_REMOTE, StreamInputs.SEND_RST_STREAM): (H2StreamStateMachine.send_reset_stream, StreamState.CLOSED), (StreamState.HALF_CLOSED_REMOTE, StreamInputs.RECV_RST_STREAM): (H2StreamStateMachine.stream_reset, StreamState.CLOSED), (StreamState.HALF_CLOSED_REMOTE, StreamInputs.SEND_PUSH_PROMISE): (H2StreamStateMachine.send_push_promise, StreamState.HALF_CLOSED_REMOTE), (StreamState.HALF_CLOSED_REMOTE, StreamInputs.RECV_PUSH_PROMISE): (H2StreamStateMachine.reset_stream_on_error, StreamState.CLOSED), (StreamState.HALF_CLOSED_REMOTE, StreamInputs.SEND_INFORMATIONAL_HEADERS): (H2StreamStateMachine.send_informational_response, StreamState.HALF_CLOSED_REMOTE), (StreamState.HALF_CLOSED_REMOTE, StreamInputs.SEND_ALTERNATIVE_SERVICE): (H2StreamStateMachine.send_alt_svc, StreamState.HALF_CLOSED_REMOTE), (StreamState.HALF_CLOSED_REMOTE, StreamInputs.RECV_ALTERNATIVE_SERVICE): (H2StreamStateMachine.recv_alt_svc, StreamState.HALF_CLOSED_REMOTE), # State: half-closed local (StreamState.HALF_CLOSED_LOCAL, StreamInputs.RECV_HEADERS): (H2StreamStateMachine.response_received, StreamState.HALF_CLOSED_LOCAL), (StreamState.HALF_CLOSED_LOCAL, StreamInputs.RECV_DATA): (H2StreamStateMachine.data_received, StreamState.HALF_CLOSED_LOCAL), (StreamState.HALF_CLOSED_LOCAL, StreamInputs.RECV_END_STREAM): (H2StreamStateMachine.stream_ended, StreamState.CLOSED), (StreamState.HALF_CLOSED_LOCAL, StreamInputs.SEND_WINDOW_UPDATE): (None, StreamState.HALF_CLOSED_LOCAL), (StreamState.HALF_CLOSED_LOCAL, StreamInputs.RECV_WINDOW_UPDATE): (H2StreamStateMachine.window_updated, StreamState.HALF_CLOSED_LOCAL), (StreamState.HALF_CLOSED_LOCAL, StreamInputs.SEND_RST_STREAM): (H2StreamStateMachine.send_reset_stream, StreamState.CLOSED), (StreamState.HALF_CLOSED_LOCAL, StreamInputs.RECV_RST_STREAM): (H2StreamStateMachine.stream_reset, StreamState.CLOSED), (StreamState.HALF_CLOSED_LOCAL, StreamInputs.RECV_PUSH_PROMISE): (H2StreamStateMachine.recv_push_promise, StreamState.HALF_CLOSED_LOCAL), (StreamState.HALF_CLOSED_LOCAL, StreamInputs.RECV_INFORMATIONAL_HEADERS): (H2StreamStateMachine.recv_informational_response, StreamState.HALF_CLOSED_LOCAL), (StreamState.HALF_CLOSED_LOCAL, StreamInputs.SEND_ALTERNATIVE_SERVICE): (H2StreamStateMachine.send_alt_svc, StreamState.HALF_CLOSED_LOCAL), (StreamState.HALF_CLOSED_LOCAL, StreamInputs.RECV_ALTERNATIVE_SERVICE): (H2StreamStateMachine.recv_alt_svc, StreamState.HALF_CLOSED_LOCAL), # State: closed (StreamState.CLOSED, StreamInputs.RECV_END_STREAM): (None, StreamState.CLOSED), (StreamState.CLOSED, StreamInputs.RECV_ALTERNATIVE_SERVICE): (None, StreamState.CLOSED), # RFC 7540 Section 5.1 defines how the end point should react when # receiving a frame on a closed stream with the following statements: # # > An endpoint that receives any frame other than PRIORITY after receiving # > a RST_STREAM MUST treat that as a stream error of type STREAM_CLOSED. # > An endpoint that receives any frames after receiving a frame with the # > END_STREAM flag set MUST treat that as a connection error of type # > STREAM_CLOSED. (StreamState.CLOSED, StreamInputs.RECV_HEADERS): (H2StreamStateMachine.recv_on_closed_stream, StreamState.CLOSED), (StreamState.CLOSED, StreamInputs.RECV_DATA): (H2StreamStateMachine.recv_on_closed_stream, StreamState.CLOSED), # > WINDOW_UPDATE or RST_STREAM frames can be received in this state # > for a short period after a DATA or HEADERS frame containing a # > END_STREAM flag is sent, as instructed in RFC 7540 Section 5.1. But we # > don't have access to a clock so we just always allow it. (StreamState.CLOSED, StreamInputs.RECV_WINDOW_UPDATE): (None, StreamState.CLOSED), (StreamState.CLOSED, StreamInputs.RECV_RST_STREAM): (None, StreamState.CLOSED), # > A receiver MUST treat the receipt of a PUSH_PROMISE on a stream that is # > neither "open" nor "half-closed (local)" as a connection error of type # > PROTOCOL_ERROR. (StreamState.CLOSED, StreamInputs.RECV_PUSH_PROMISE): (H2StreamStateMachine.recv_push_on_closed_stream, StreamState.CLOSED), # Also, users should be forbidden from sending on closed streams. (StreamState.CLOSED, StreamInputs.SEND_HEADERS): (H2StreamStateMachine.send_on_closed_stream, StreamState.CLOSED), (StreamState.CLOSED, StreamInputs.SEND_PUSH_PROMISE): (H2StreamStateMachine.send_push_on_closed_stream, StreamState.CLOSED), (StreamState.CLOSED, StreamInputs.SEND_RST_STREAM): (H2StreamStateMachine.send_on_closed_stream, StreamState.CLOSED), (StreamState.CLOSED, StreamInputs.SEND_DATA): (H2StreamStateMachine.send_on_closed_stream, StreamState.CLOSED), (StreamState.CLOSED, StreamInputs.SEND_WINDOW_UPDATE): (H2StreamStateMachine.send_on_closed_stream, StreamState.CLOSED), (StreamState.CLOSED, StreamInputs.SEND_END_STREAM): (H2StreamStateMachine.send_on_closed_stream, StreamState.CLOSED), } class H2Stream(object): """ A low-level HTTP/2 stream object. This handles building and receiving frames and maintains per-stream state. This wraps a HTTP/2 Stream state machine implementation, ensuring that frames can only be sent/received when the stream is in a valid state. Attempts to create frames that cannot be sent will raise a ``ProtocolError``. """ def __init__(self, stream_id, config, inbound_window_size, outbound_window_size): self.state_machine = H2StreamStateMachine(stream_id) self.stream_id = stream_id self.max_outbound_frame_size = None self.request_method = None # The current value of the outbound stream flow control window self.outbound_flow_control_window = outbound_window_size # The flow control manager. self._inbound_window_manager = WindowManager(inbound_window_size) # The expected content length, if any. self._expected_content_length = None # The actual received content length. Always tracked. self._actual_content_length = 0 # The authority we believe this stream belongs to. self._authority = None # The configuration for this stream. self.config = config def __repr__(self): return "<%s id:%d state:%r>" % ( type(self).__name__, self.stream_id, self.state_machine.state ) @property def inbound_flow_control_window(self): """ The size of the inbound flow control window for the stream. This is rarely publicly useful: instead, use :meth:`remote_flow_control_window `. This shortcut is largely present to provide a shortcut to this data. """ return self._inbound_window_manager.current_window_size @property def open(self): """ Whether the stream is 'open' in any sense: that is, whether it counts against the number of concurrent streams. """ # RFC 7540 Section 5.1.2 defines 'open' for this purpose to mean either # the OPEN state or either of the HALF_CLOSED states. Perplexingly, # this excludes the reserved states. # For more detail on why we're doing this in this slightly weird way, # see the comment on ``STREAM_OPEN`` at the top of the file. return STREAM_OPEN[self.state_machine.state] @property def closed(self): """ Whether the stream is closed. """ return self.state_machine.state == StreamState.CLOSED @property def closed_by(self): """ Returns how the stream was closed, as one of StreamClosedBy. """ return self.state_machine.stream_closed_by def upgrade(self, client_side): """ Called by the connection to indicate that this stream is the initial request/response of an upgraded connection. Places the stream into an appropriate state. """ self.config.logger.debug("Upgrading %r", self) assert self.stream_id == 1 input_ = ( StreamInputs.UPGRADE_CLIENT if client_side else StreamInputs.UPGRADE_SERVER ) # This may return events, we deliberately don't want them. self.state_machine.process_input(input_) return def send_headers(self, headers, encoder, end_stream=False): """ Returns a list of HEADERS/CONTINUATION frames to emit as either headers or trailers. """ self.config.logger.debug("Send headers %s on %r", headers, self) # Because encoding headers makes an irreversible change to the header # compression context, we make the state transition before we encode # them. # First, check if we're a client. If we are, no problem: if we aren't, # we need to scan the header block to see if this is an informational # response. input_ = StreamInputs.SEND_HEADERS if ((not self.state_machine.client) and is_informational_response(headers)): if end_stream: raise ProtocolError( "Cannot set END_STREAM on informational responses." ) input_ = StreamInputs.SEND_INFORMATIONAL_HEADERS events = self.state_machine.process_input(input_) hf = HeadersFrame(self.stream_id) hdr_validation_flags = self._build_hdr_validation_flags(events) frames = self._build_headers_frames( headers, encoder, hf, hdr_validation_flags ) if end_stream: # Not a bug: the END_STREAM flag is valid on the initial HEADERS # frame, not the CONTINUATION frames that follow. self.state_machine.process_input(StreamInputs.SEND_END_STREAM) frames[0].flags.add('END_STREAM') if self.state_machine.trailers_sent and not end_stream: raise ProtocolError("Trailers must have END_STREAM set.") if self.state_machine.client and self._authority is None: self._authority = authority_from_headers(headers) # store request method for _initialize_content_length self.request_method = extract_method_header(headers) return frames def push_stream_in_band(self, related_stream_id, headers, encoder): """ Returns a list of PUSH_PROMISE/CONTINUATION frames to emit as a pushed stream header. Called on the stream that has the PUSH_PROMISE frame sent on it. """ self.config.logger.debug("Push stream %r", self) # Because encoding headers makes an irreversible change to the header # compression context, we make the state transition *first*. events = self.state_machine.process_input( StreamInputs.SEND_PUSH_PROMISE ) ppf = PushPromiseFrame(self.stream_id) ppf.promised_stream_id = related_stream_id hdr_validation_flags = self._build_hdr_validation_flags(events) frames = self._build_headers_frames( headers, encoder, ppf, hdr_validation_flags ) return frames def locally_pushed(self): """ Mark this stream as one that was pushed by this peer. Must be called immediately after initialization. Sends no frames, simply updates the state machine. """ # This does not trigger any events. events = self.state_machine.process_input( StreamInputs.SEND_PUSH_PROMISE ) assert not events return [] def send_data(self, data, end_stream=False, pad_length=None): """ Prepare some data frames. Optionally end the stream. .. warning:: Does not perform flow control checks. """ self.config.logger.debug( "Send data on %r with end stream set to %s", self, end_stream ) self.state_machine.process_input(StreamInputs.SEND_DATA) df = DataFrame(self.stream_id) df.data = data if end_stream: self.state_machine.process_input(StreamInputs.SEND_END_STREAM) df.flags.add('END_STREAM') if pad_length is not None: df.flags.add('PADDED') df.pad_length = pad_length # Subtract flow_controlled_length to account for possible padding self.outbound_flow_control_window -= df.flow_controlled_length assert self.outbound_flow_control_window >= 0 return [df] def end_stream(self): """ End a stream without sending data. """ self.config.logger.debug("End stream %r", self) self.state_machine.process_input(StreamInputs.SEND_END_STREAM) df = DataFrame(self.stream_id) df.flags.add('END_STREAM') return [df] def advertise_alternative_service(self, field_value): """ Advertise an RFC 7838 alternative service. The semantics of this are better documented in the ``H2Connection`` class. """ self.config.logger.debug( "Advertise alternative service of %r for %r", field_value, self ) self.state_machine.process_input(StreamInputs.SEND_ALTERNATIVE_SERVICE) asf = AltSvcFrame(self.stream_id) asf.field = field_value return [asf] def increase_flow_control_window(self, increment): """ Increase the size of the flow control window for the remote side. """ self.config.logger.debug( "Increase flow control window for %r by %d", self, increment ) self.state_machine.process_input(StreamInputs.SEND_WINDOW_UPDATE) self._inbound_window_manager.window_opened(increment) wuf = WindowUpdateFrame(self.stream_id) wuf.window_increment = increment return [wuf] def receive_push_promise_in_band(self, promised_stream_id, headers, header_encoding): """ Receives a push promise frame sent on this stream, pushing a remote stream. This is called on the stream that has the PUSH_PROMISE sent on it. """ self.config.logger.debug( "Receive Push Promise on %r for remote stream %d", self, promised_stream_id ) events = self.state_machine.process_input( StreamInputs.RECV_PUSH_PROMISE ) events[0].pushed_stream_id = promised_stream_id hdr_validation_flags = self._build_hdr_validation_flags(events) events[0].headers = self._process_received_headers( headers, hdr_validation_flags, header_encoding ) return [], events def remotely_pushed(self, pushed_headers): """ Mark this stream as one that was pushed by the remote peer. Must be called immediately after initialization. Sends no frames, simply updates the state machine. """ self.config.logger.debug("%r pushed by remote peer", self) events = self.state_machine.process_input( StreamInputs.RECV_PUSH_PROMISE ) self._authority = authority_from_headers(pushed_headers) return [], events def receive_headers(self, headers, end_stream, header_encoding): """ Receive a set of headers (or trailers). """ if is_informational_response(headers): if end_stream: raise ProtocolError( "Cannot set END_STREAM on informational responses" ) input_ = StreamInputs.RECV_INFORMATIONAL_HEADERS else: input_ = StreamInputs.RECV_HEADERS events = self.state_machine.process_input(input_) if end_stream: es_events = self.state_machine.process_input( StreamInputs.RECV_END_STREAM ) events[0].stream_ended = es_events[0] events += es_events self._initialize_content_length(headers) if isinstance(events[0], TrailersReceived): if not end_stream: raise ProtocolError("Trailers must have END_STREAM set") hdr_validation_flags = self._build_hdr_validation_flags(events) events[0].headers = self._process_received_headers( headers, hdr_validation_flags, header_encoding ) return [], events def receive_data(self, data, end_stream, flow_control_len): """ Receive some data. """ self.config.logger.debug( "Receive data on %r with end stream %s and flow control length " "set to %d", self, end_stream, flow_control_len ) events = self.state_machine.process_input(StreamInputs.RECV_DATA) self._inbound_window_manager.window_consumed(flow_control_len) self._track_content_length(len(data), end_stream) if end_stream: es_events = self.state_machine.process_input( StreamInputs.RECV_END_STREAM ) events[0].stream_ended = es_events[0] events.extend(es_events) events[0].data = data events[0].flow_controlled_length = flow_control_len return [], events def receive_window_update(self, increment): """ Handle a WINDOW_UPDATE increment. """ self.config.logger.debug( "Receive Window Update on %r for increment of %d", self, increment ) events = self.state_machine.process_input( StreamInputs.RECV_WINDOW_UPDATE ) frames = [] # If we encounter a problem with incrementing the flow control window, # this should be treated as a *stream* error, not a *connection* error. # That means we need to catch the error and forcibly close the stream. if events: events[0].delta = increment try: self.outbound_flow_control_window = guard_increment_window( self.outbound_flow_control_window, increment ) except FlowControlError: # Ok, this is bad. We're going to need to perform a local # reset. event = StreamReset() event.stream_id = self.stream_id event.error_code = ErrorCodes.FLOW_CONTROL_ERROR event.remote_reset = False events = [event] frames = self.reset_stream(event.error_code) return frames, events def receive_continuation(self): """ A naked CONTINUATION frame has been received. This is always an error, but the type of error it is depends on the state of the stream and must transition the state of the stream, so we need to handle it. """ self.config.logger.debug("Receive Continuation frame on %r", self) self.state_machine.process_input( StreamInputs.RECV_CONTINUATION ) assert False, "Should not be reachable" def receive_alt_svc(self, frame): """ An Alternative Service frame was received on the stream. This frame inherits the origin associated with this stream. """ self.config.logger.debug( "Receive Alternative Service frame on stream %r", self ) # If the origin is present, RFC 7838 says we have to ignore it. if frame.origin: return [], [] events = self.state_machine.process_input( StreamInputs.RECV_ALTERNATIVE_SERVICE ) # There are lots of situations where we want to ignore the ALTSVC # frame. If we need to pay attention, we'll have an event and should # fill it out. if events: assert isinstance(events[0], AlternativeServiceAvailable) events[0].origin = self._authority events[0].field_value = frame.field return [], events def reset_stream(self, error_code=0): """ Close the stream locally. Reset the stream with an error code. """ self.config.logger.debug( "Local reset %r with error code: %d", self, error_code ) self.state_machine.process_input(StreamInputs.SEND_RST_STREAM) rsf = RstStreamFrame(self.stream_id) rsf.error_code = error_code return [rsf] def stream_reset(self, frame): """ Handle a stream being reset remotely. """ self.config.logger.debug( "Remote reset %r with error code: %d", self, frame.error_code ) events = self.state_machine.process_input(StreamInputs.RECV_RST_STREAM) if events: # We don't fire an event if this stream is already closed. events[0].error_code = _error_code_from_int(frame.error_code) return [], events def acknowledge_received_data(self, acknowledged_size): """ The user has informed us that they've processed some amount of data that was received on this stream. Pass that to the window manager and potentially return some WindowUpdate frames. """ self.config.logger.debug( "Acknowledge received data with size %d on %r", acknowledged_size, self ) increment = self._inbound_window_manager.process_bytes( acknowledged_size ) if increment: f = WindowUpdateFrame(self.stream_id) f.window_increment = increment return [f] return [] def _build_hdr_validation_flags(self, events): """ Constructs a set of header validation flags for use when normalizing and validating header blocks. """ is_trailer = isinstance( events[0], (_TrailersSent, TrailersReceived) ) is_response_header = isinstance( events[0], ( _ResponseSent, ResponseReceived, InformationalResponseReceived ) ) is_push_promise = isinstance( events[0], (PushedStreamReceived, _PushedRequestSent) ) return HeaderValidationFlags( is_client=self.state_machine.client, is_trailer=is_trailer, is_response_header=is_response_header, is_push_promise=is_push_promise, ) def _build_headers_frames(self, headers, encoder, first_frame, hdr_validation_flags): """ Helper method to build headers or push promise frames. """ # We need to lowercase the header names, and to ensure that secure # header fields are kept out of compression contexts. if self.config.normalize_outbound_headers: headers = normalize_outbound_headers( headers, hdr_validation_flags ) if self.config.validate_outbound_headers: headers = validate_outbound_headers( headers, hdr_validation_flags ) encoded_headers = encoder.encode(headers) # Slice into blocks of max_outbound_frame_size. Be careful with this: # it only works right because we never send padded frames or priority # information on the frames. Revisit this if we do. header_blocks = [ encoded_headers[i:i+self.max_outbound_frame_size] for i in range( 0, len(encoded_headers), self.max_outbound_frame_size ) ] frames = [] first_frame.data = header_blocks[0] frames.append(first_frame) for block in header_blocks[1:]: cf = ContinuationFrame(self.stream_id) cf.data = block frames.append(cf) frames[-1].flags.add('END_HEADERS') return frames def _process_received_headers(self, headers, header_validation_flags, header_encoding): """ When headers have been received from the remote peer, run a processing pipeline on them to transform them into the appropriate form for attaching to an event. """ if self.config.normalize_inbound_headers: headers = normalize_inbound_headers( headers, header_validation_flags ) if self.config.validate_inbound_headers: headers = validate_headers(headers, header_validation_flags) if header_encoding: headers = _decode_headers(headers, header_encoding) # The above steps are all generators, so we need to concretize the # headers now. return list(headers) def _initialize_content_length(self, headers): """ Checks the headers for a content-length header and initializes the _expected_content_length field from it. It's not an error for no Content-Length header to be present. """ if self.request_method == b'HEAD': self._expected_content_length = 0 return for n, v in headers: if n == b'content-length': try: self._expected_content_length = int(v, 10) except ValueError: raise ProtocolError( "Invalid content-length header: %s" % v ) return def _track_content_length(self, length, end_stream): """ Update the expected content length in response to data being received. Validates that the appropriate amount of data is sent. Always updates the received data, but only validates the length against the content-length header if one was sent. :param length: The length of the body chunk received. :param end_stream: If this is the last body chunk received. """ self._actual_content_length += length actual = self._actual_content_length expected = self._expected_content_length if expected is not None: if expected < actual: raise InvalidBodyLengthError(expected, actual) if end_stream and expected != actual: raise InvalidBodyLengthError(expected, actual) def _inbound_flow_control_change_from_settings(self, delta): """ We changed SETTINGS_INITIAL_WINDOW_SIZE, which means we need to update the target window size for flow control. For our flow control strategy, this means we need to do two things: we need to adjust the current window size, but we also need to set the target maximum window size to the new value. """ new_max_size = self._inbound_window_manager.max_window_size + delta self._inbound_window_manager.window_opened(delta) self._inbound_window_manager.max_window_size = new_max_size def _decode_headers(headers, encoding): """ Given an iterable of header two-tuples and an encoding, decodes those headers using that encoding while preserving the type of the header tuple. This ensures that the use of ``HeaderTuple`` is preserved. """ for header in headers: # This function expects to work on decoded headers, which are always # HeaderTuple objects. assert isinstance(header, HeaderTuple) name, value = header name = name.decode(encoding) value = value.decode(encoding) yield header.__class__(name, value) h2-3.1.1/h2/utilities.py0000664000175000017500000005444213421652727015635 0ustar ubuntuubuntu00000000000000# -*- coding: utf-8 -*- """ h2/utilities ~~~~~~~~~~~~ Utility functions that do not belong in a separate module. """ import collections import re from string import whitespace import sys from hpack import HeaderTuple, NeverIndexedHeaderTuple from .exceptions import ProtocolError, FlowControlError UPPER_RE = re.compile(b"[A-Z]") # A set of headers that are hop-by-hop or connection-specific and thus # forbidden in HTTP/2. This list comes from RFC 7540 § 8.1.2.2. CONNECTION_HEADERS = frozenset([ b'connection', u'connection', b'proxy-connection', u'proxy-connection', b'keep-alive', u'keep-alive', b'transfer-encoding', u'transfer-encoding', b'upgrade', u'upgrade', ]) _ALLOWED_PSEUDO_HEADER_FIELDS = frozenset([ b':method', u':method', b':scheme', u':scheme', b':authority', u':authority', b':path', u':path', b':status', u':status', b':protocol', u':protocol', ]) _SECURE_HEADERS = frozenset([ # May have basic credentials which are vulnerable to dictionary attacks. b'authorization', u'authorization', b'proxy-authorization', u'proxy-authorization', ]) _REQUEST_ONLY_HEADERS = frozenset([ b':scheme', u':scheme', b':path', u':path', b':authority', u':authority', b':method', u':method', b':protocol', u':protocol', ]) _RESPONSE_ONLY_HEADERS = frozenset([b':status', u':status']) # A Set of pseudo headers that are only valid if the method is # CONNECT, see RFC 8441 § 5 _CONNECT_REQUEST_ONLY_HEADERS = frozenset([b':protocol', u':protocol']) if sys.version_info[0] == 2: # Python 2.X _WHITESPACE = frozenset(whitespace) else: # Python 3.3+ _WHITESPACE = frozenset(map(ord, whitespace)) def _secure_headers(headers, hdr_validation_flags): """ Certain headers are at risk of being attacked during the header compression phase, and so need to be kept out of header compression contexts. This function automatically transforms certain specific headers into HPACK never-indexed fields to ensure they don't get added to header compression contexts. This function currently implements two rules: - 'authorization' and 'proxy-authorization' fields are automatically made never-indexed. - Any 'cookie' header field shorter than 20 bytes long is made never-indexed. These fields are the most at-risk. These rules are inspired by Firefox and nghttp2. """ for header in headers: if header[0] in _SECURE_HEADERS: yield NeverIndexedHeaderTuple(*header) elif header[0] in (b'cookie', u'cookie') and len(header[1]) < 20: yield NeverIndexedHeaderTuple(*header) else: yield header def extract_method_header(headers): """ Extracts the request method from the headers list. """ for k, v in headers: if k in (b':method', u':method'): if not isinstance(v, bytes): return v.encode('utf-8') else: return v def is_informational_response(headers): """ Searches a header block for a :status header to confirm that a given collection of headers are an informational response. Assumes the header block is well formed: that is, that the HTTP/2 special headers are first in the block, and so that it can stop looking when it finds the first header field whose name does not begin with a colon. :param headers: The HTTP/2 header block. :returns: A boolean indicating if this is an informational response. """ for n, v in headers: if isinstance(n, bytes): sigil = b':' status = b':status' informational_start = b'1' else: sigil = u':' status = u':status' informational_start = u'1' # If we find a non-special header, we're done here: stop looping. if not n.startswith(sigil): return False # This isn't the status header, bail. if n != status: continue # If the first digit is a 1, we've got informational headers. return v.startswith(informational_start) def guard_increment_window(current, increment): """ Increments a flow control window, guarding against that window becoming too large. :param current: The current value of the flow control window. :param increment: The increment to apply to that window. :returns: The new value of the window. :raises: ``FlowControlError`` """ # The largest value the flow control window may take. LARGEST_FLOW_CONTROL_WINDOW = 2**31 - 1 new_size = current + increment if new_size > LARGEST_FLOW_CONTROL_WINDOW: raise FlowControlError( "May not increment flow control window past %d" % LARGEST_FLOW_CONTROL_WINDOW ) return new_size def authority_from_headers(headers): """ Given a header set, searches for the authority header and returns the value. Note that this doesn't terminate early, so should only be called if the headers are for a client request. Otherwise, will loop over the entire header set, which is potentially unwise. :param headers: The HTTP header set. :returns: The value of the authority header, or ``None``. :rtype: ``bytes`` or ``None``. """ for n, v in headers: # This gets run against headers that come both from HPACK and from the # user, so we may have unicode floating around in here. We only want # bytes. if n in (b':authority', u':authority'): return v.encode('utf-8') if not isinstance(v, bytes) else v return None # Flags used by the validate_headers pipeline to determine which checks # should be applied to a given set of headers. HeaderValidationFlags = collections.namedtuple( 'HeaderValidationFlags', ['is_client', 'is_trailer', 'is_response_header', 'is_push_promise'] ) def validate_headers(headers, hdr_validation_flags): """ Validates a header sequence against a set of constraints from RFC 7540. :param headers: The HTTP header set. :param hdr_validation_flags: An instance of HeaderValidationFlags. """ # This validation logic is built on a sequence of generators that are # iterated over to provide the final header list. This reduces some of the # overhead of doing this checking. However, it's worth noting that this # checking remains somewhat expensive, and attempts should be made wherever # possible to reduce the time spent doing them. # # For example, we avoid tuple upacking in loops because it represents a # fixed cost that we don't want to spend, instead indexing into the header # tuples. headers = _reject_uppercase_header_fields( headers, hdr_validation_flags ) headers = _reject_surrounding_whitespace( headers, hdr_validation_flags ) headers = _reject_te( headers, hdr_validation_flags ) headers = _reject_connection_header( headers, hdr_validation_flags ) headers = _reject_pseudo_header_fields( headers, hdr_validation_flags ) headers = _check_host_authority_header( headers, hdr_validation_flags ) headers = _check_path_header(headers, hdr_validation_flags) return headers def _reject_uppercase_header_fields(headers, hdr_validation_flags): """ Raises a ProtocolError if any uppercase character is found in a header block. """ for header in headers: if UPPER_RE.search(header[0]): raise ProtocolError( "Received uppercase header name %s." % header[0]) yield header def _reject_surrounding_whitespace(headers, hdr_validation_flags): """ Raises a ProtocolError if any header name or value is surrounded by whitespace characters. """ # For compatibility with RFC 7230 header fields, we need to allow the field # value to be an empty string. This is ludicrous, but technically allowed. # The field name may not be empty, though, so we can safely assume that it # must have at least one character in it and throw exceptions if it # doesn't. for header in headers: if header[0][0] in _WHITESPACE or header[0][-1] in _WHITESPACE: raise ProtocolError( "Received header name surrounded by whitespace %r" % header[0]) if header[1] and ((header[1][0] in _WHITESPACE) or (header[1][-1] in _WHITESPACE)): raise ProtocolError( "Received header value surrounded by whitespace %r" % header[1] ) yield header def _reject_te(headers, hdr_validation_flags): """ Raises a ProtocolError if the TE header is present in a header block and its value is anything other than "trailers". """ for header in headers: if header[0] in (b'te', u'te'): if header[1].lower() not in (b'trailers', u'trailers'): raise ProtocolError( "Invalid value for Transfer-Encoding header: %s" % header[1] ) yield header def _reject_connection_header(headers, hdr_validation_flags): """ Raises a ProtocolError if the Connection header is present in a header block. """ for header in headers: if header[0] in CONNECTION_HEADERS: raise ProtocolError( "Connection-specific header field present: %s." % header[0] ) yield header def _custom_startswith(test_string, bytes_prefix, unicode_prefix): """ Given a string that might be a bytestring or a Unicode string, return True if it starts with the appropriate prefix. """ if isinstance(test_string, bytes): return test_string.startswith(bytes_prefix) else: return test_string.startswith(unicode_prefix) def _assert_header_in_set(string_header, bytes_header, header_set): """ Given a set of header names, checks whether the string or byte version of the header name is present. Raises a Protocol error with the appropriate error if it's missing. """ if not (string_header in header_set or bytes_header in header_set): raise ProtocolError( "Header block missing mandatory %s header" % string_header ) def _reject_pseudo_header_fields(headers, hdr_validation_flags): """ Raises a ProtocolError if duplicate pseudo-header fields are found in a header block or if a pseudo-header field appears in a block after an ordinary header field. Raises a ProtocolError if pseudo-header fields are found in trailers. """ seen_pseudo_header_fields = set() seen_regular_header = False method = None for header in headers: if _custom_startswith(header[0], b':', u':'): if header[0] in seen_pseudo_header_fields: raise ProtocolError( "Received duplicate pseudo-header field %s" % header[0] ) seen_pseudo_header_fields.add(header[0]) if seen_regular_header: raise ProtocolError( "Received pseudo-header field out of sequence: %s" % header[0] ) if header[0] not in _ALLOWED_PSEUDO_HEADER_FIELDS: raise ProtocolError( "Received custom pseudo-header field %s" % header[0] ) if header[0] in (b':method', u':method'): if not isinstance(header[1], bytes): method = header[1].encode('utf-8') else: method = header[1] else: seen_regular_header = True yield header # Check the pseudo-headers we got to confirm they're acceptable. _check_pseudo_header_field_acceptability( seen_pseudo_header_fields, method, hdr_validation_flags ) def _check_pseudo_header_field_acceptability(pseudo_headers, method, hdr_validation_flags): """ Given the set of pseudo-headers present in a header block and the validation flags, confirms that RFC 7540 allows them. """ # Pseudo-header fields MUST NOT appear in trailers - RFC 7540 § 8.1.2.1 if hdr_validation_flags.is_trailer and pseudo_headers: raise ProtocolError( "Received pseudo-header in trailer %s" % pseudo_headers ) # If ':status' pseudo-header is not there in a response header, reject it. # Similarly, if ':path', ':method', or ':scheme' are not there in a request # header, reject it. Additionally, if a response contains any request-only # headers or vice-versa, reject it. # Relevant RFC section: RFC 7540 § 8.1.2.4 # https://tools.ietf.org/html/rfc7540#section-8.1.2.4 if hdr_validation_flags.is_response_header: _assert_header_in_set(u':status', b':status', pseudo_headers) invalid_response_headers = pseudo_headers & _REQUEST_ONLY_HEADERS if invalid_response_headers: raise ProtocolError( "Encountered request-only headers %s" % invalid_response_headers ) elif (not hdr_validation_flags.is_response_header and not hdr_validation_flags.is_trailer): # This is a request, so we need to have seen :path, :method, and # :scheme. _assert_header_in_set(u':path', b':path', pseudo_headers) _assert_header_in_set(u':method', b':method', pseudo_headers) _assert_header_in_set(u':scheme', b':scheme', pseudo_headers) invalid_request_headers = pseudo_headers & _RESPONSE_ONLY_HEADERS if invalid_request_headers: raise ProtocolError( "Encountered response-only headers %s" % invalid_request_headers ) if method != b'CONNECT': invalid_headers = pseudo_headers & _CONNECT_REQUEST_ONLY_HEADERS if invalid_headers: raise ProtocolError( "Encountered connect-request-only headers %s" % invalid_headers ) def _validate_host_authority_header(headers): """ Given the :authority and Host headers from a request block that isn't a trailer, check that: 1. At least one of these headers is set. 2. If both headers are set, they match. :param headers: The HTTP header set. :raises: ``ProtocolError`` """ # We use None as a sentinel value. Iterate over the list of headers, # and record the value of these headers (if present). We don't need # to worry about receiving duplicate :authority headers, as this is # enforced by the _reject_pseudo_header_fields() pipeline. # # TODO: We should also guard against receiving duplicate Host headers, # and against sending duplicate headers. authority_header_val = None host_header_val = None for header in headers: if header[0] in (b':authority', u':authority'): authority_header_val = header[1] elif header[0] in (b'host', u'host'): host_header_val = header[1] yield header # If we have not-None values for these variables, then we know we saw # the corresponding header. authority_present = (authority_header_val is not None) host_present = (host_header_val is not None) # It is an error for a request header block to contain neither # an :authority header nor a Host header. if not authority_present and not host_present: raise ProtocolError( "Request header block does not have an :authority or Host header." ) # If we receive both headers, they should definitely match. if authority_present and host_present: if authority_header_val != host_header_val: raise ProtocolError( "Request header block has mismatched :authority and " "Host headers: %r / %r" % (authority_header_val, host_header_val) ) def _check_host_authority_header(headers, hdr_validation_flags): """ Raises a ProtocolError if a header block arrives that does not contain an :authority or a Host header, or if a header block contains both fields, but their values do not match. """ # We only expect to see :authority and Host headers on request header # blocks that aren't trailers, so skip this validation if this is a # response header or we're looking at trailer blocks. skip_validation = ( hdr_validation_flags.is_response_header or hdr_validation_flags.is_trailer ) if skip_validation: return headers return _validate_host_authority_header(headers) def _check_path_header(headers, hdr_validation_flags): """ Raise a ProtocolError if a header block arrives or is sent that contains an empty :path header. """ def inner(): for header in headers: if header[0] in (b':path', u':path'): if not header[1]: raise ProtocolError("An empty :path header is forbidden") yield header # We only expect to see :authority and Host headers on request header # blocks that aren't trailers, so skip this validation if this is a # response header or we're looking at trailer blocks. skip_validation = ( hdr_validation_flags.is_response_header or hdr_validation_flags.is_trailer ) if skip_validation: return headers else: return inner() def _lowercase_header_names(headers, hdr_validation_flags): """ Given an iterable of header two-tuples, rebuilds that iterable with the header names lowercased. This generator produces tuples that preserve the original type of the header tuple for tuple and any ``HeaderTuple``. """ for header in headers: if isinstance(header, HeaderTuple): yield header.__class__(header[0].lower(), header[1]) else: yield (header[0].lower(), header[1]) def _strip_surrounding_whitespace(headers, hdr_validation_flags): """ Given an iterable of header two-tuples, strip both leading and trailing whitespace from both header names and header values. This generator produces tuples that preserve the original type of the header tuple for tuple and any ``HeaderTuple``. """ for header in headers: if isinstance(header, HeaderTuple): yield header.__class__(header[0].strip(), header[1].strip()) else: yield (header[0].strip(), header[1].strip()) def _strip_connection_headers(headers, hdr_validation_flags): """ Strip any connection headers as per RFC7540 § 8.1.2.2. """ for header in headers: if header[0] not in CONNECTION_HEADERS: yield header def _check_sent_host_authority_header(headers, hdr_validation_flags): """ Raises an InvalidHeaderBlockError if we try to send a header block that does not contain an :authority or a Host header, or if the header block contains both fields, but their values do not match. """ # We only expect to see :authority and Host headers on request header # blocks that aren't trailers, so skip this validation if this is a # response header or we're looking at trailer blocks. skip_validation = ( hdr_validation_flags.is_response_header or hdr_validation_flags.is_trailer ) if skip_validation: return headers return _validate_host_authority_header(headers) def _combine_cookie_fields(headers, hdr_validation_flags): """ RFC 7540 § 8.1.2.5 allows HTTP/2 clients to split the Cookie header field, which must normally appear only once, into multiple fields for better compression. However, they MUST be joined back up again when received. This normalization step applies that transform. The side-effect is that all cookie fields now appear *last* in the header block. """ # There is a problem here about header indexing. Specifically, it's # possible that all these cookies are sent with different header indexing # values. At this point it shouldn't matter too much, so we apply our own # logic and make them never-indexed. cookies = [] for header in headers: if header[0] == b'cookie': cookies.append(header[1]) else: yield header if cookies: cookie_val = b'; '.join(cookies) yield NeverIndexedHeaderTuple(b'cookie', cookie_val) def normalize_outbound_headers(headers, hdr_validation_flags): """ Normalizes a header sequence that we are about to send. :param headers: The HTTP header set. :param hdr_validation_flags: An instance of HeaderValidationFlags. """ headers = _lowercase_header_names(headers, hdr_validation_flags) headers = _strip_surrounding_whitespace(headers, hdr_validation_flags) headers = _strip_connection_headers(headers, hdr_validation_flags) headers = _secure_headers(headers, hdr_validation_flags) return headers def normalize_inbound_headers(headers, hdr_validation_flags): """ Normalizes a header sequence that we have received. :param headers: The HTTP header set. :param hdr_validation_flags: An instance of HeaderValidationFlags """ headers = _combine_cookie_fields(headers, hdr_validation_flags) return headers def validate_outbound_headers(headers, hdr_validation_flags): """ Validates and normalizes a header sequence that we are about to send. :param headers: The HTTP header set. :param hdr_validation_flags: An instance of HeaderValidationFlags. """ headers = _reject_te( headers, hdr_validation_flags ) headers = _reject_connection_header( headers, hdr_validation_flags ) headers = _reject_pseudo_header_fields( headers, hdr_validation_flags ) headers = _check_sent_host_authority_header( headers, hdr_validation_flags ) headers = _check_path_header(headers, hdr_validation_flags) return headers class SizeLimitDict(collections.OrderedDict): def __init__(self, *args, **kwargs): self._size_limit = kwargs.pop("size_limit", None) super(SizeLimitDict, self).__init__(*args, **kwargs) self._check_size_limit() def __setitem__(self, key, value): super(SizeLimitDict, self).__setitem__(key, value) self._check_size_limit() def _check_size_limit(self): if self._size_limit is not None: while len(self) > self._size_limit: self.popitem(last=False) h2-3.1.1/h2/windows.py0000664000175000017500000001274313421652727015312 0ustar ubuntuubuntu00000000000000# -*- coding: utf-8 -*- """ h2/windows ~~~~~~~~~~ Defines tools for managing HTTP/2 flow control windows. The objects defined in this module are used to automatically manage HTTP/2 flow control windows. Specifically, they keep track of what the size of the window is, how much data has been consumed from that window, and how much data the user has already used. It then implements a basic algorithm that attempts to manage the flow control window without user input, trying to ensure that it does not emit too many WINDOW_UPDATE frames. """ from __future__ import division from .exceptions import FlowControlError # The largest acceptable value for a HTTP/2 flow control window. LARGEST_FLOW_CONTROL_WINDOW = 2**31 - 1 class WindowManager(object): """ A basic HTTP/2 window manager. :param max_window_size: The maximum size of the flow control window. :type max_window_size: ``int`` """ def __init__(self, max_window_size): assert max_window_size <= LARGEST_FLOW_CONTROL_WINDOW self.max_window_size = max_window_size self.current_window_size = max_window_size self._bytes_processed = 0 def window_consumed(self, size): """ We have received a certain number of bytes from the remote peer. This necessarily shrinks the flow control window! :param size: The number of flow controlled bytes we received from the remote peer. :type size: ``int`` :returns: Nothing. :rtype: ``None`` """ self.current_window_size -= size if self.current_window_size < 0: raise FlowControlError("Flow control window shrunk below 0") def window_opened(self, size): """ The flow control window has been incremented, either because of manual flow control management or because of the user changing the flow control settings. This can have the effect of increasing what we consider to be the "maximum" flow control window size. This does not increase our view of how many bytes have been processed, only of how much space is in the window. :param size: The increment to the flow control window we received. :type size: ``int`` :returns: Nothing :rtype: ``None`` """ self.current_window_size += size if self.current_window_size > LARGEST_FLOW_CONTROL_WINDOW: raise FlowControlError( "Flow control window mustn't exceed %d" % LARGEST_FLOW_CONTROL_WINDOW ) if self.current_window_size > self.max_window_size: self.max_window_size = self.current_window_size def process_bytes(self, size): """ The application has informed us that it has processed a certain number of bytes. This may cause us to want to emit a window update frame. If we do want to emit a window update frame, this method will return the number of bytes that we should increment the window by. :param size: The number of flow controlled bytes that the application has processed. :type size: ``int`` :returns: The number of bytes to increment the flow control window by, or ``None``. :rtype: ``int`` or ``None`` """ self._bytes_processed += size return self._maybe_update_window() def _maybe_update_window(self): """ Run the algorithm. Our current algorithm can be described like this. 1. If no bytes have been processed, we immediately return 0. There is no meaningful way for us to hand space in the window back to the remote peer, so let's not even try. 2. If there is no space in the flow control window, and we have processed at least 1024 bytes (or 1/4 of the window, if the window is smaller), we will emit a window update frame. This is to avoid the risk of blocking a stream altogether. 3. If there is space in the flow control window, and we have processed at least 1/2 of the window worth of bytes, we will emit a window update frame. This is to minimise the number of window update frames we have to emit. In a healthy system with large flow control windows, this will irregularly emit WINDOW_UPDATE frames. This prevents us starving the connection by emitting eleventy bajillion WINDOW_UPDATE frames, especially in situations where the remote peer is sending a lot of very small DATA frames. """ # TODO: Can the window be smaller than 1024 bytes? If not, we can # streamline this algorithm. if not self._bytes_processed: return None max_increment = (self.max_window_size - self.current_window_size) increment = 0 # Note that, even though we may increment less than _bytes_processed, # we still want to set it to zero whenever we emit an increment. This # is because we'll always increment up to the maximum we can. if (self.current_window_size == 0) and ( self._bytes_processed > min(1024, self.max_window_size // 4)): increment = min(self._bytes_processed, max_increment) self._bytes_processed = 0 elif self._bytes_processed >= (self.max_window_size // 2): increment = min(self._bytes_processed, max_increment) self._bytes_processed = 0 self.current_window_size += increment return increment h2-3.1.1/h2.egg-info/0000775000175000017500000000000013521033126014714 5ustar ubuntuubuntu00000000000000h2-3.1.1/h2.egg-info/PKG-INFO0000664000175000017500000011226413521033126016017 0ustar ubuntuubuntu00000000000000Metadata-Version: 1.1 Name: h2 Version: 3.1.1 Summary: HTTP/2 State-Machine based protocol implementation Home-page: http://hyper.rtfd.org Author: Cory Benfield Author-email: cory@lukasa.co.uk License: MIT License Description: =============================== hyper-h2: HTTP/2 Protocol Stack =============================== .. image:: https://raw.github.com/Lukasa/hyper/development/docs/source/images/hyper.png .. image:: https://travis-ci.org/python-hyper/hyper-h2.svg?branch=master :target: https://travis-ci.org/python-hyper/hyper-h2 This repository contains a pure-Python implementation of a HTTP/2 protocol stack. It's written from the ground up to be embeddable in whatever program you choose to use, ensuring that you can speak HTTP/2 regardless of your programming paradigm. You use it like this: .. code-block:: python import h2.connection conn = h2.connection.H2Connection() conn.send_headers(stream_id=stream_id, headers=headers) conn.send_data(stream_id, data) socket.sendall(conn.data_to_send()) events = conn.receive_data(socket_data) This repository does not provide a parsing layer, a network layer, or any rules about concurrency. Instead, it's a purely in-memory solution, defined in terms of data actions and HTTP/2 frames. This is one building block of a full Python HTTP implementation. To install it, just run: .. code-block:: console $ pip install h2 Documentation ============= Documentation is available at http://python-hyper.org/h2/. Contributing ============ ``hyper-h2`` welcomes contributions from anyone! Unlike many other projects we are happy to accept cosmetic contributions and small contributions, in addition to large feature requests and changes. Before you contribute (either by opening an issue or filing a pull request), please `read the contribution guidelines`_. .. _read the contribution guidelines: http://python-hyper.org/en/latest/contributing.html License ======= ``hyper-h2`` is made available under the MIT License. For more details, see the ``LICENSE`` file in the repository. Authors ======= ``hyper-h2`` is maintained by Cory Benfield, with contributions from others. For more details about the contributors, please see ``CONTRIBUTORS.rst``. Release History =============== 3.1.1 (2019-08-02) ------------------ Bugfixes ~~~~~~~~ - Ignore WINDOW_UPDATE and RST_STREAM frames received after stream closure. 3.1.0 (2019-01-22) ------------------ API Changes (Backward-Incompatible) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - ``h2.connection.H2Connection.data_to_send`` first and only argument ``amt`` was renamed to ``amount``. - Support for Python 3.3 has been removed. API Changes (Backward-Compatible) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - ``h2.connection.H2Connection.send_data`` now supports ``data`` parameter being a ``memoryview`` object. - Refactor ping-related events: a ``h2.events.PingReceived`` event is fired when a PING frame is received and a ``h2.events.PingAckReceived`` event is fired when a PING frame with an ACK flag is received. ``h2.events.PingAcknowledged`` is deprecated in favour of the identical ``h2.events.PingAckReceived``. - Added ``ENABLE_CONNECT_PROTOCOL`` to ``h2.settings.SettingCodes``. - Support ``CONNECT`` requests with a ``:protocol`` pseudo header thereby supporting RFC 8441. - A limit to the number of closed streams kept in memory by the connection is applied. It can be configured by ``h2.connection.H2Connection.MAX_CLOSED_STREAMS``. Bugfixes ~~~~~~~~ - Debug logging when stream_id is None is now fixed and no longer errors. 3.0.1 (2017-04-03) ------------------ Bugfixes ~~~~~~~~ - CONTINUATION frames sent on closed streams previously caused stream errors of type STREAM_CLOSED. RFC 7540 § 6.10 requires that these be connection errors of type PROTOCOL_ERROR, and so this release changes to match that behaviour. - Remote peers incrementing their inbound connection window beyond the maximum allowed value now cause stream-level errors, rather than connection-level errors, allowing connections to stay up longer. - h2 now rejects receiving and sending request header blocks that are missing any of the mandatory pseudo-header fields (:path, :scheme, and :method). - h2 now rejects receiving and sending request header blocks that have an empty :path pseudo-header value. - h2 now rejects receiving and sending request header blocks that contain response-only pseudo-headers, and vice versa. - h2 now correct respects user-initiated changes to the HEADER_TABLE_SIZE local setting, and ensures that if users shrink or increase the header table size it is policed appropriately. 2.6.2 (2017-04-03) ------------------ Bugfixes ~~~~~~~~ - CONTINUATION frames sent on closed streams previously caused stream errors of type STREAM_CLOSED. RFC 7540 § 6.10 requires that these be connection errors of type PROTOCOL_ERROR, and so this release changes to match that behaviour. - Remote peers incrementing their inbound connection window beyond the maximum allowed value now cause stream-level errors, rather than connection-level errors, allowing connections to stay up longer. - h2 now rejects receiving and sending request header blocks that are missing any of the mandatory pseudo-header fields (:path, :scheme, and :method). - h2 now rejects receiving and sending request header blocks that have an empty :path pseudo-header value. - h2 now rejects receiving and sending request header blocks that contain response-only pseudo-headers, and vice versa. - h2 now correct respects user-initiated changes to the HEADER_TABLE_SIZE local setting, and ensures that if users shrink or increase the header table size it is policed appropriately. 2.5.4 (2017-04-03) ------------------ Bugfixes ~~~~~~~~ - CONTINUATION frames sent on closed streams previously caused stream errors of type STREAM_CLOSED. RFC 7540 § 6.10 requires that these be connection errors of type PROTOCOL_ERROR, and so this release changes to match that behaviour. - Remote peers incrementing their inbound connection window beyond the maximum allowed value now cause stream-level errors, rather than connection-level errors, allowing connections to stay up longer. - h2 now correct respects user-initiated changes to the HEADER_TABLE_SIZE local setting, and ensures that if users shrink or increase the header table size it is policed appropriately. 3.0.0 (2017-03-24) ------------------ API Changes (Backward-Incompatible) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - By default, hyper-h2 now joins together received cookie header fields, per RFC 7540 Section 8.1.2.5. - Added a ``normalize_inbound_headers`` flag to the ``H2Configuration`` object that defaults to ``True``. Setting this to ``False`` changes the behaviour from the previous point back to the v2 behaviour. - Removed deprecated fields from ``h2.errors`` module. - Removed deprecated fields from ``h2.settings`` module. - Removed deprecated ``client_side`` and ``header_encoding`` arguments from ``H2Connection``. - Removed deprecated ``client_side`` and ``header_encoding`` properties from ``H2Connection``. - ``dict`` objects are no longer allowed for user-supplied headers. - The default header encoding is now ``None``, not ``utf-8``: this means that all events that carry headers now return those headers as byte strings by default. The header encoding can be set back to ``utf-8`` to restore the old behaviour. API Changes (Backward-Compatible) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - Added new ``UnknownFrameReceived`` event that fires when unknown extension frames have been received. This only fires when using hyperframe 5.0 or later: earlier versions of hyperframe cause us to silently ignore extension frames. Bugfixes ~~~~~~~~ None 2.6.1 (2017-03-16) ------------------ Bugfixes ~~~~~~~~ - Allowed hyperframe v5 support while continuing to ignore unexpected frames. 2.5.3 (2017-03-16) ------------------ Bugfixes ~~~~~~~~ - Allowed hyperframe v5 support while continuing to ignore unexpected frames. 2.4.4 (2017-03-16) ------------------ Bugfixes ~~~~~~~~ - Allowed hyperframe v5 support while continuing to ignore unexpected frames. 2.6.0 (2017-02-28) ------------------ API Changes (Backward-Compatible) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - Added a new ``h2.events.Event`` class that acts as a base class for all events. - Rather than reject outbound Connection-specific headers, h2 will now normalize the header block by removing them. - Implement equality for the ``h2.settings.Settings`` class. - Added ``h2.settings.SettingCodes``, an enum that is used to store all the HTTP/2 setting codes. This allows us to use a better printed representation of the setting code in most places that it is used. - The ``setting`` field in ``ChangedSetting`` for the ``RemoteSettingsChanged`` and ``SettingsAcknowledged`` events has been updated to be instances of ``SettingCodes`` whenever they correspond to a known setting code. When they are an unknown setting code, they are instead ``int``. As ``SettingCodes`` is a subclass of ``int``, this is non-breaking. - Deprecated the other fields in ``h2.settings``. These will be removed in 3.0.0. - Added an optional ``pad_length`` parameter to ``H2Connection.send_data`` to allow the user to include padding on a data frame. - Added a new parameter to the ``h2.config.H2Configuration`` initializer which takes a logger. This allows us to log by providing a logger that conforms to the requirements of this module so that it can be used in different environments. Bugfixes ~~~~~~~~ - Correctly reject pushed request header blocks whenever they have malformed request header blocks. - Correctly normalize pushed request header blocks whenever they have normalizable header fields. - Remote peers are now allowed to send zero or any positive number as a value for ``SETTINGS_MAX_HEADER_LIST_SIZE``, where previously sending zero would raise a ``InvalidSettingsValueError``. - Resolved issue where the ``HTTP2-Settings`` header value for plaintext upgrade that was emitted by ``initiate_upgrade_connection`` included the *entire* ``SETTINGS`` frame, instead of just the payload. - Resolved issue where the ``HTTP2-Settings`` header value sent by a client for plaintext upgrade would be ignored by ``initiate_upgrade_connection``, rather than have those settings applied appropriately. - Resolved an issue whereby certain frames received from a peer in the CLOSED state would trigger connection errors when RFC 7540 says they should have triggered stream errors instead. Added more detailed stream closure tracking to ensure we don't throw away connections unnecessarily. 2.5.2 (2017-01-27) ------------------ - Resolved issue where the ``HTTP2-Settings`` header value for plaintext upgrade that was emitted by ``initiate_upgrade_connection`` included the *entire* ``SETTINGS`` frame, instead of just the payload. - Resolved issue where the ``HTTP2-Settings`` header value sent by a client for plaintext upgrade would be ignored by ``initiate_upgrade_connection``, rather than have those settings applied appropriately. 2.4.3 (2017-01-27) ------------------ - Resolved issue where the ``HTTP2-Settings`` header value for plaintext upgrade that was emitted by ``initiate_upgrade_connection`` included the *entire* ``SETTINGS`` frame, instead of just the payload. - Resolved issue where the ``HTTP2-Settings`` header value sent by a client for plaintext upgrade would be ignored by ``initiate_upgrade_connection``, rather than have those settings applied appropriately. 2.3.4 (2017-01-27) ------------------ - Resolved issue where the ``HTTP2-Settings`` header value for plaintext upgrade that was emitted by ``initiate_upgrade_connection`` included the *entire* ``SETTINGS`` frame, instead of just the payload. - Resolved issue where the ``HTTP2-Settings`` header value sent by a client for plaintext upgrade would be ignored by ``initiate_upgrade_connection``, rather than have those settings applied appropriately. 2.5.1 (2016-12-17) ------------------ Bugfixes ~~~~~~~~ - Remote peers are now allowed to send zero or any positive number as a value for ``SETTINGS_MAX_HEADER_LIST_SIZE``, where previously sending zero would raise a ``InvalidSettingsValueError``. 2.5.0 (2016-10-25) ------------------ API Changes (Backward-Compatible) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - Added a new ``H2Configuration`` object that allows rich configuration of a ``H2Connection``. This object supersedes the prior keyword arguments to the ``H2Connection`` object, which are now deprecated and will be removed in 3.0. - Added support for automated window management via the ``acknowledge_received_data`` method. See the documentation for more details. - Added a ``DenialOfServiceError`` that is raised whenever a behaviour that looks like a DoS attempt is encountered: for example, an overly large decompressed header list. This is a subclass of ``ProtocolError``. - Added support for setting and managing ``SETTINGS_MAX_HEADER_LIST_SIZE``. This setting is now defaulted to 64kB. - Added ``h2.errors.ErrorCodes``, an enum that is used to store all the HTTP/2 error codes. This allows us to use a better printed representation of the error code in most places that it is used. - The ``error_code`` fields on ``ConnectionTerminated`` and ``StreamReset`` events have been updated to be instances of ``ErrorCodes`` whenever they correspond to a known error code. When they are an unknown error code, they are instead ``int``. As ``ErrorCodes`` is a subclass of ``int``, this is non-breaking. - Deprecated the other fields in ``h2.errors``. These will be removed in 3.0.0. Bugfixes ~~~~~~~~ - Correctly reject request header blocks with neither :authority nor Host headers, or header blocks which contain mismatched :authority and Host headers, per RFC 7540 Section 8.1.2.3. - Correctly expect that responses to HEAD requests will have no body regardless of the value of the Content-Length header, and reject those that do. - Correctly refuse to send header blocks that contain neither :authority nor Host headers, or header blocks which contain mismatched :authority and Host headers, per RFC 7540 Section 8.1.2.3. - Hyper-h2 will now reject header field names and values that contain leading or trailing whitespace. - Correctly strip leading/trailing whitespace from header field names and values. - Correctly refuse to send header blocks with a TE header whose value is not ``trailers``, per RFC 7540 Section 8.1.2.2. - Correctly refuse to send header blocks with connection-specific headers, per RFC 7540 Section 8.1.2.2. - Correctly refuse to send header blocks that contain duplicate pseudo-header fields, or with pseudo-header fields that appear after ordinary header fields, per RFC 7540 Section 8.1.2.1. This may cause passing a dictionary as the header block to ``send_headers`` to throw a ``ProtocolError``, because dictionaries are unordered and so they may trip this check. Passing dictionaries here is deprecated, and callers should change to using a sequence of 2-tuples as their header blocks. - Correctly reject trailers that contain HTTP/2 pseudo-header fields, per RFC 7540 Section 8.1.2.1. - Correctly refuse to send trailers that contain HTTP/2 pseudo-header fields, per RFC 7540 Section 8.1.2.1. - Correctly reject responses that do not contain the ``:status`` header field, per RFC 7540 Section 8.1.2.4. - Correctly refuse to send responses that do not contain the ``:status`` header field, per RFC 7540 Section 8.1.2.4. - Correctly update the maximum frame size when the user updates the value of that setting. Prior to this release, if the user updated the maximum frame size hyper-h2 would ignore the update, preventing the remote peer from using the higher frame sizes. 2.4.2 (2016-10-25) ------------------ Bugfixes ~~~~~~~~ - Correctly update the maximum frame size when the user updates the value of that setting. Prior to this release, if the user updated the maximum frame size hyper-h2 would ignore the update, preventing the remote peer from using the higher frame sizes. 2.3.3 (2016-10-25) ------------------ Bugfixes ~~~~~~~~ - Correctly update the maximum frame size when the user updates the value of that setting. Prior to this release, if the user updated the maximum frame size hyper-h2 would ignore the update, preventing the remote peer from using the higher frame sizes. 2.2.7 (2016-10-25) ------------------ *Final 2.2.X release* Bugfixes ~~~~~~~~ - Correctly update the maximum frame size when the user updates the value of that setting. Prior to this release, if the user updated the maximum frame size hyper-h2 would ignore the update, preventing the remote peer from using the higher frame sizes. 2.4.1 (2016-08-23) ------------------ Bugfixes ~~~~~~~~ - Correctly expect that responses to HEAD requests will have no body regardless of the value of the Content-Length header, and reject those that do. 2.3.2 (2016-08-23) ------------------ Bugfixes ~~~~~~~~ - Correctly expect that responses to HEAD requests will have no body regardless of the value of the Content-Length header, and reject those that do. 2.4.0 (2016-07-01) ------------------ API Changes (Backward-Compatible) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - Adds ``additional_data`` to ``H2Connection.close_connection``, allowing the user to send additional debug data on the GOAWAY frame. - Adds ``last_stream_id`` to ``H2Connection.close_connection``, allowing the user to manually control what the reported last stream ID is. - Add new method: ``prioritize``. - Add support for emitting stream priority information when sending headers frames using three new keyword arguments: ``priority_weight``, ``priority_depends_on``, and ``priority_exclusive``. - Add support for "related events": events that fire simultaneously on a single frame. 2.3.1 (2016-05-12) ------------------ Bugfixes ~~~~~~~~ - Resolved ``AttributeError`` encountered when receiving more than one sequence of CONTINUATION frames on a given connection. 2.2.5 (2016-05-12) ------------------ Bugfixes ~~~~~~~~ - Resolved ``AttributeError`` encountered when receiving more than one sequence of CONTINUATION frames on a given connection. 2.3.0 (2016-04-26) ------------------ API Changes (Backward-Compatible) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - Added a new flag to the ``H2Connection`` constructor: ``header_encoding``, that controls what encoding is used (if any) to decode the headers from bytes to unicode. This defaults to UTF-8 for backward compatibility. To disable the decode and use bytes exclusively, set the field to False, None, or the empty string. This affects all headers, including those pushed by servers. - Bumped the minimum version of HPACK allowed from 2.0 to 2.2. - Added support for advertising RFC 7838 Alternative services. - Allowed users to provide ``hpack.HeaderTuple`` and ``hpack.NeverIndexedHeaderTuple`` objects to all methods that send headers. - Changed all events that carry headers to emit ``hpack.HeaderTuple`` and ``hpack.NeverIndexedHeaderTuple`` instead of plain tuples. This allows users to maintain header indexing state. - Added support for plaintext upgrade with the ``initiate_upgrade_connection`` method. Bugfixes ~~~~~~~~ - Automatically ensure that all ``Authorization`` and ``Proxy-Authorization`` headers, as well as short ``Cookie`` headers, are prevented from being added to encoding contexts. 2.2.4 (2016-04-25) ------------------ Bugfixes ~~~~~~~~ - Correctly forbid pseudo-headers that were not defined in RFC 7540. - Ignore AltSvc frames, rather than exploding when receiving them. 2.1.5 (2016-04-25) ------------------ *Final 2.1.X release* Bugfixes ~~~~~~~~ - Correctly forbid pseudo-headers that were not defined in RFC 7540. - Ignore AltSvc frames, rather than exploding when receiving them. 2.2.3 (2016-04-13) ------------------ Bugfixes ~~~~~~~~ - Allowed the 4.X series of hyperframe releases as dependencies. 2.1.4 (2016-04-13) ------------------ Bugfixes ~~~~~~~~ - Allowed the 4.X series of hyperframe releases as dependencies. 2.2.2 (2016-04-05) ------------------ Bugfixes ~~~~~~~~ - Fixed issue where informational responses were erroneously not allowed to be sent in the ``HALF_CLOSED_REMOTE`` state. - Fixed issue where informational responses were erroneously not allowed to be received in the ``HALF_CLOSED_LOCAL`` state. - Fixed issue where we allowed information responses to be sent or received after final responses. 2.2.1 (2016-03-23) ------------------ Bugfixes ~~~~~~~~ - Fixed issue where users using locales that did not default to UTF-8 were unable to install source distributions of the package. 2.2.0 (2016-03-23) ------------------ API Changes (Backward-Compatible) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - Added support for sending informational responses (responses with 1XX status) codes as part of the standard flow. HTTP/2 allows zero or more informational responses with no upper limit: hyper-h2 does too. - Added support for receiving informational responses (responses with 1XX status) codes as part of the standard flow. HTTP/2 allows zero or more informational responses with no upper limit: hyper-h2 does too. - Added a new event: ``ReceivedInformationalResponse``. This response is fired when informational responses (those with 1XX status codes). - Added an ``additional_data`` field to the ``ConnectionTerminated`` event that carries any additional data sent on the GOAWAY frame. May be ``None`` if no such data was sent. - Added the ``initial_values`` optional argument to the ``Settings`` object. Bugfixes ~~~~~~~~ - Correctly reject all of the connection-specific headers mentioned in RFC 7540 § 8.1.2.2, not just the ``Connection:`` header. - Defaulted the value of ``SETTINGS_MAX_CONCURRENT_STREAMS`` to 100, unless explicitly overridden. This is a safe defensive initial value for this setting. 2.1.3 (2016-03-16) ------------------ Deprecations ~~~~~~~~~~~~ - Passing dictionaries to ``send_headers`` as the header block is deprecated, and will be removed in 3.0. 2.1.2 (2016-02-17) ------------------ Bugfixes ~~~~~~~~ - Reject attempts to push streams on streams that were themselves pushed: streams can only be pushed on streams that were initiated by the client. - Correctly allow CONTINUATION frames to extend the header block started by a PUSH_PROMISE frame. - Changed our handling of frames received on streams that were reset by the user. Previously these would, at best, cause ProtocolErrors to be raised and the connection to be torn down (rather defeating the point of resetting streams at all) and, at worst, would cause subtle inconsistencies in state between hyper-h2 and the remote peer that could lead to header block decoding errors or flow control blockages. Now when the user resets a stream all further frames received on that stream are ignored except where they affect some form of connection-level state, where they have their effect and are then ignored. - Fixed a bug whereby receiving a PUSH_PROMISE frame on a stream that was closed would cause a RST_STREAM frame to be emitted on the closed-stream, but not the newly-pushed one. Now this causes a ``ProtocolError``. 2.1.1 (2016-02-05) ------------------ Bugfixes ~~~~~~~~ - Added debug representations for all events. - Fixed problems with setup.py that caused trouble on older setuptools/pip installs. 2.1.0 (2016-02-02) ------------------ API Changes (Backward-Compatible) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - Added new field to ``DataReceived``: ``flow_controlled_length``. This is the length of the frame including padded data, allowing users to correctly track changes to the flow control window. - Defined new ``UnsupportedFrameError``, thrown when frames that are known to hyperframe but not supported by hyper-h2 are received. For backward-compatibility reasons, this is a ``ProtocolError`` *and* a ``KeyError``. Bugfixes ~~~~~~~~ - Hyper-h2 now correctly accounts for padding when maintaining flow control windows. - Resolved a bug where hyper-h2 would mistakenly apply SETTINGS_INITIAL_WINDOW_SIZE to the connection flow control window in addition to the stream-level flow control windows. - Invalid Content-Length headers now throw ``ProtocolError`` exceptions and correctly tear the connection down, instead of leaving the connection in an indeterminate state. - Invalid header blocks now throw ``ProtocolError``, rather than a grab bag of possible other exceptions. 2.0.0 (2016-01-25) ------------------ API Changes (Breaking) ~~~~~~~~~~~~~~~~~~~~~~ - Attempts to open streams with invalid stream IDs, either by the remote peer or by the user, are now rejected as a ``ProtocolError``. Previously these were allowed, and would cause remote peers to error. - Receiving frames that have invalid padding now causes the connection to be terminated with a ``ProtocolError`` being raised. Previously these passed undetected. - Settings values set by both the user and the remote peer are now validated when they're set. If they're invalid, a new ``InvalidSettingsValueError`` is raised and, if set by the remote peer, a connection error is signaled. Previously, it was possible to set invalid values. These would either be caught when building frames, or would be allowed to stand. - Settings changes no longer require user action to be acknowledged: hyper-h2 acknowledges them automatically. This moves the location where some exceptions may be thrown, and also causes the ``acknowledge_settings`` method to be removed from the public API. - Removed a number of methods on the ``H2Connection`` object from the public, semantically versioned API, by renaming them to have leading underscores. Specifically, removed: - ``get_stream_by_id`` - ``get_or_create_stream`` - ``begin_new_stream`` - ``receive_frame`` - ``acknowledge_settings`` - Added full support for receiving CONTINUATION frames, including policing logic about when and how they are received. Previously, receiving CONTINUATION frames was not supported and would throw exceptions. - All public API functions on ``H2Connection`` except for ``receive_data`` no longer return lists of events, because these lists were always empty. Events are now only raised by ``receive_data``. - Calls to ``increment_flow_control_window`` with out of range values now raise ``ValueError`` exceptions. Previously they would be allowed, or would cause errors when serializing frames. API Changes (Backward-Compatible) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - Added ``PriorityUpdated`` event for signaling priority changes. - Added ``get_next_available_stream_id`` function. - Receiving DATA frames on streams not in the OPEN or HALF_CLOSED_LOCAL states now causes a stream reset, rather than a connection reset. The error is now also classified as a ``StreamClosedError``, rather than a more generic ``ProtocolError``. - Receiving HEADERS or PUSH_PROMISE frames in the HALF_CLOSED_REMOTE state now causes a stream reset, rather than a connection reset. - Receiving frames that violate the max frame size now causes connection errors with error code FRAME_SIZE_ERROR, not a generic PROTOCOL_ERROR. This condition now also raises a ``FrameTooLargeError``, a new subclass of ``ProtocolError``. - Made ``NoSuchStreamError`` a subclass of ``ProtocolError``. - The ``StreamReset`` event is now also fired whenever a protocol error from the remote peer forces a stream to close early. This is only fired once. - The ``StreamReset`` event now carries a flag, ``remote_reset``, that is set to ``True`` in all cases where ``StreamReset`` would previously have fired (e.g. when the remote peer sent a RST_STREAM), and is set to ``False`` when it fires because the remote peer made a protocol error. - Hyper-h2 now rejects attempts by peers to increment a flow control window by zero bytes. - Hyper-h2 now rejects peers sending header blocks that are ill-formed for a number of reasons as set out in RFC 7540 Section 8.1.2. - Attempting to send non-PRIORITY frames on closed streams now raises ``StreamClosedError``. - Remote peers attempting to increase the flow control window beyond ``2**31 - 1``, either by window increment or by settings frame, are now rejected as ``ProtocolError``. - Local attempts to increase the flow control window beyond ``2**31 - 1`` by window increment are now rejected as ``ProtocolError``. - The bytes that represent individual settings are now available in ``h2.settings``, instead of needing users to import them from hyperframe. Bugfixes ~~~~~~~~ - RFC 7540 requires that a separate minimum stream ID be used for inbound and outbound streams. Hyper-h2 now obeys this requirement. - Hyper-h2 now does a better job of reporting the last stream ID it has partially handled when terminating connections. - Fixed an error in the arguments of ``StreamIDTooLowError``. - Prevent ``ValueError`` leaking from Hyperframe. - Prevent ``struct.error`` and ``InvalidFrameError`` leaking from Hyperframe. 1.1.1 (2015-11-17) ------------------ Bugfixes ~~~~~~~~ - Forcibly lowercase all header names to improve compatibility with implementations that demand lower-case header names. 1.1.0 (2015-10-28) ------------------ API Changes (Backward-Compatible) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - Added a new ``ConnectionTerminated`` event, which fires when GOAWAY frames are received. - Added a subclass of ``NoSuchStreamError``, called ``StreamClosedError``, that fires when actions are taken on a stream that is closed and has had its state flushed from the system. - Added ``StreamIDTooLowError``, raised when the user or the remote peer attempts to create a stream with an ID lower than one previously used in the dialog. Inherits from ``ValueError`` for backward-compatibility reasons. Bugfixes ~~~~~~~~ - Do not throw ``ProtocolError`` when attempting to send multiple GOAWAY frames on one connection. - We no longer forcefully change the decoder table size when settings changes are ACKed, instead waiting for remote acknowledgement of the change. - Improve the performance of checking whether a stream is open. - We now attempt to lazily garbage collect closed streams, to avoid having the state hang around indefinitely, leaking memory. - Avoid further per-stream allocations, leading to substantial performance improvements when many short-lived streams are used. 1.0.0 (2015-10-15) ------------------ - First production release! Platform: UNKNOWN Classifier: Development Status :: 5 - Production/Stable Classifier: Intended Audience :: Developers Classifier: License :: OSI Approved :: MIT License Classifier: Programming Language :: Python Classifier: Programming Language :: Python :: 2 Classifier: Programming Language :: Python :: 2.7 Classifier: Programming Language :: Python :: 3 Classifier: Programming Language :: Python :: 3.3 Classifier: Programming Language :: Python :: 3.4 Classifier: Programming Language :: Python :: 3.5 Classifier: Programming Language :: Python :: 3.6 Classifier: Programming Language :: Python :: Implementation :: CPython Classifier: Programming Language :: Python :: Implementation :: PyPy h2-3.1.1/h2.egg-info/SOURCES.txt0000664000175000017500000000534513521033126016607 0ustar ubuntuubuntu00000000000000.coveragerc CONTRIBUTORS.rst HISTORY.rst LICENSE MANIFEST.in Makefile README.rst setup.cfg setup.py test_requirements.txt tox.ini _travis/install.sh docs/Makefile docs/make.bat docs/source/advanced-usage.rst docs/source/api.rst docs/source/asyncio-example.rst docs/source/basic-usage.rst docs/source/conf.py docs/source/contributors.rst docs/source/curio-example.rst docs/source/eventlet-example.rst docs/source/examples.rst docs/source/index.rst docs/source/installation.rst docs/source/low-level.rst docs/source/negotiating-http2.rst docs/source/release-notes.rst docs/source/release-process.rst docs/source/testimonials.rst docs/source/tornado-example.rst docs/source/twisted-example.rst docs/source/twisted-head-example.rst docs/source/twisted-post-example.rst docs/source/wsgi-example.rst docs/source/_static/.keep docs/source/_static/h2.connection.H2ConnectionStateMachine.dot.png docs/source/_static/h2.stream.H2StreamStateMachine.dot.png examples/asyncio/asyncio-server.py examples/asyncio/cert.crt examples/asyncio/cert.key examples/asyncio/wsgi-server.py examples/curio/curio-server.py examples/curio/localhost.crt.pem examples/curio/localhost.key examples/eventlet/eventlet-server.py examples/eventlet/server.crt examples/eventlet/server.key examples/fragments/client_https_setup_fragment.py examples/fragments/client_upgrade_fragment.py examples/fragments/server_https_setup_fragment.py examples/fragments/server_upgrade_fragment.py examples/tornado/server.crt examples/tornado/server.key examples/tornado/tornado-server.py examples/twisted/head_request.py examples/twisted/post_request.py examples/twisted/server.crt examples/twisted/server.csr examples/twisted/server.key examples/twisted/twisted-server.py h2/__init__.py h2/config.py h2/connection.py h2/errors.py h2/events.py h2/exceptions.py h2/frame_buffer.py h2/settings.py h2/stream.py h2/utilities.py h2/windows.py h2.egg-info/PKG-INFO h2.egg-info/SOURCES.txt h2.egg-info/dependency_links.txt h2.egg-info/requires.txt h2.egg-info/top_level.txt test/conftest.py test/coroutine_tests.py test/h2spectest.sh test/helpers.py test/test_basic_logic.py test/test_closed_streams.py test/test_complex_logic.py test/test_config.py test/test_events.py test/test_exceptions.py test/test_flow_control_window.py test/test_h2_upgrade.py test/test_head_request.py test/test_header_indexing.py test/test_informational_responses.py test/test_interacting_stacks.py test/test_invalid_content_lengths.py test/test_invalid_frame_sequences.py test/test_invalid_headers.py test/test_priority.py test/test_related_events.py test/test_rfc7838.py test/test_rfc8441.py test/test_settings.py test/test_state_machines.py test/test_stream_reset.py test/test_utility_functions.py utils/backport.sh visualizer/NOTICES.visualizer visualizer/visualize.pyh2-3.1.1/h2.egg-info/dependency_links.txt0000664000175000017500000000000113521033126020762 0ustar ubuntuubuntu00000000000000 h2-3.1.1/h2.egg-info/requires.txt0000664000175000017500000000015313521033126017313 0ustar ubuntuubuntu00000000000000hyperframe<6,>=5.2.0 hpack<4,>=2.3 [:python_version == "2.7" or python_version == "3.3"] enum34<2,>=1.1.6 h2-3.1.1/h2.egg-info/top_level.txt0000664000175000017500000000000313521033126017437 0ustar ubuntuubuntu00000000000000h2 h2-3.1.1/setup.cfg0000664000175000017500000000007513521033126014534 0ustar ubuntuubuntu00000000000000[wheel] universal = 1 [egg_info] tag_build = tag_date = 0 h2-3.1.1/setup.py0000664000175000017500000000411013421652727014434 0ustar ubuntuubuntu00000000000000#!/usr/bin/env python # -*- coding: utf-8 -*- import codecs import os import re import sys try: from setuptools import setup except ImportError: from distutils.core import setup # Get the version version_regex = r'__version__ = ["\']([^"\']*)["\']' with open('h2/__init__.py', 'r') as f: text = f.read() match = re.search(version_regex, text) if match: version = match.group(1) else: raise RuntimeError("No version number found!") # Stealing this from Kenneth Reitz if sys.argv[-1] == 'publish': os.system('python setup.py sdist upload') sys.exit() packages = [ 'h2', ] readme = codecs.open('README.rst', encoding='utf-8').read() history = codecs.open('HISTORY.rst', encoding='utf-8').read() setup( name='h2', version=version, description='HTTP/2 State-Machine based protocol implementation', long_description=u'\n\n'.join([readme, history]), author='Cory Benfield', author_email='cory@lukasa.co.uk', url='http://hyper.rtfd.org', packages=packages, package_data={'': ['LICENSE', 'README.rst', 'CONTRIBUTORS.rst', 'HISTORY.rst', 'NOTICES']}, package_dir={'h2': 'h2'}, include_package_data=True, license='MIT License', classifiers=[ 'Development Status :: 5 - Production/Stable', 'Intended Audience :: Developers', 'License :: OSI Approved :: MIT License', 'Programming Language :: Python', 'Programming Language :: Python :: 2', 'Programming Language :: Python :: 2.7', 'Programming Language :: Python :: 3', 'Programming Language :: Python :: 3.3', 'Programming Language :: Python :: 3.4', 'Programming Language :: Python :: 3.5', 'Programming Language :: Python :: 3.6', 'Programming Language :: Python :: Implementation :: CPython', 'Programming Language :: Python :: Implementation :: PyPy', ], install_requires=[ 'hyperframe>=5.2.0, <6', 'hpack>=2.3,<4', ], extras_require={ ':python_version == "2.7" or python_version == "3.3"': ['enum34>=1.1.6, <2'], } ) h2-3.1.1/test/0000775000175000017500000000000013521033126013670 5ustar ubuntuubuntu00000000000000h2-3.1.1/test/conftest.py0000664000175000017500000000051613421652727016106 0ustar ubuntuubuntu00000000000000# -*- coding: utf-8 -*- from hypothesis import settings, HealthCheck import pytest import helpers # Set up a CI profile that allows slow example generation. settings.register_profile( "travis", settings(suppress_health_check=[HealthCheck.too_slow]) ) @pytest.fixture def frame_factory(): return helpers.FrameFactory() h2-3.1.1/test/coroutine_tests.py0000664000175000017500000000520413421652727017511 0ustar ubuntuubuntu00000000000000# -*- coding: utf-8 -*- """ coroutine_tests ~~~~~~~~~~~~~~~ This file gives access to a coroutine-based test class. This allows each test case to be defined as a pair of interacting coroutines, sending data to each other by yielding the flow of control. The advantage of this method is that we avoid the difficulty of using threads in Python, as well as the pain of using sockets and events to communicate and organise the communication. This makes the tests entirely deterministic and makes them behave identically on all platforms, as well as ensuring they both succeed and fail quickly. """ import itertools import functools import pytest class CoroutineTestCase(object): """ A base class for tests that use interacting coroutines. The run_until_complete method takes a number of coroutines as arguments. Each one is, in order, passed the output of the previous coroutine until one is exhausted. If a coroutine does not initially yield data (that is, its first action is to receive data), the calling code should prime it by using the 'server' decorator on this class. """ def run_until_complete(self, *coroutines): """ Executes a set of coroutines that communicate between each other. Each one is, in order, passed the output of the previous coroutine until one is exhausted. If a coroutine does not initially yield data (that is, its first action is to receive data), the calling code should prime it by using the 'server' decorator on this class. Once a coroutine is exhausted, the method performs a final check to ensure that all other coroutines are exhausted. This ensures that all assertions in those coroutines got executed. """ looping_coroutines = itertools.cycle(coroutines) data = None for coro in looping_coroutines: try: data = coro.send(data) except StopIteration: break for coro in coroutines: try: next(coro) except StopIteration: continue else: pytest.fail("Coroutine %s not exhausted" % coro) def server(self, func): """ A decorator that marks a test coroutine as a 'server' coroutine: that is, one whose first action is to consume data, rather than one that initially emits data. The effect of this decorator is simply to prime the coroutine. """ @functools.wraps(func) def wrapper(*args, **kwargs): c = func(*args, **kwargs) next(c) return c return wrapper h2-3.1.1/test/h2spectest.sh0000775000175000017500000000070013521033071016307 0ustar ubuntuubuntu00000000000000#!/usr/bin/env bash # A test script that runs the example Python Twisted server and then runs # h2spec against it. Prints the output of h2spec. This script does not expect # to be run directly, but instead via `tox -e h2spec`. set -x # Kill all background jobs on exit. trap 'kill $(jobs -p)' EXIT pushd examples/asyncio python asyncio-server.py & popd # Wait briefly to let the server start up sleep 2 # Go go go! h2spec -k -t -v -p 8443 $@ h2-3.1.1/test/helpers.py0000664000175000017500000001140113421652727015716 0ustar ubuntuubuntu00000000000000# -*- coding: utf-8 -*- """ helpers ~~~~~~~ This module contains helpers for the h2 tests. """ from hyperframe.frame import ( HeadersFrame, DataFrame, SettingsFrame, WindowUpdateFrame, PingFrame, GoAwayFrame, RstStreamFrame, PushPromiseFrame, PriorityFrame, ContinuationFrame, AltSvcFrame ) from hpack.hpack import Encoder SAMPLE_SETTINGS = { SettingsFrame.HEADER_TABLE_SIZE: 4096, SettingsFrame.ENABLE_PUSH: 1, SettingsFrame.MAX_CONCURRENT_STREAMS: 2, } class FrameFactory(object): """ A class containing lots of helper methods and state to build frames. This allows test cases to easily build correct HTTP/2 frames to feed to hyper-h2. """ def __init__(self): self.encoder = Encoder() def refresh_encoder(self): self.encoder = Encoder() def preamble(self): return b'PRI * HTTP/2.0\r\n\r\nSM\r\n\r\n' def build_headers_frame(self, headers, flags=[], stream_id=1, **priority_kwargs): """ Builds a single valid headers frame out of the contained headers. """ f = HeadersFrame(stream_id) f.data = self.encoder.encode(headers) f.flags.add('END_HEADERS') for flag in flags: f.flags.add(flag) for k, v in priority_kwargs.items(): setattr(f, k, v) return f def build_continuation_frame(self, header_block, flags=[], stream_id=1): """ Builds a single continuation frame out of the binary header block. """ f = ContinuationFrame(stream_id) f.data = header_block f.flags = set(flags) return f def build_data_frame(self, data, flags=None, stream_id=1, padding_len=0): """ Builds a single data frame out of a chunk of data. """ flags = set(flags) if flags is not None else set() f = DataFrame(stream_id) f.data = data f.flags = flags if padding_len: flags.add('PADDED') f.pad_length = padding_len return f def build_settings_frame(self, settings, ack=False): """ Builds a single settings frame. """ f = SettingsFrame(0) if ack: f.flags.add('ACK') f.settings = settings return f def build_window_update_frame(self, stream_id, increment): """ Builds a single WindowUpdate frame. """ f = WindowUpdateFrame(stream_id) f.window_increment = increment return f def build_ping_frame(self, ping_data, flags=None): """ Builds a single Ping frame. """ f = PingFrame(0) f.opaque_data = ping_data if flags: f.flags = set(flags) return f def build_goaway_frame(self, last_stream_id, error_code=0, additional_data=b''): """ Builds a single GOAWAY frame. """ f = GoAwayFrame(0) f.error_code = error_code f.last_stream_id = last_stream_id f.additional_data = additional_data return f def build_rst_stream_frame(self, stream_id, error_code=0): """ Builds a single RST_STREAM frame. """ f = RstStreamFrame(stream_id) f.error_code = error_code return f def build_push_promise_frame(self, stream_id, promised_stream_id, headers, flags=[]): """ Builds a single PUSH_PROMISE frame. """ f = PushPromiseFrame(stream_id) f.promised_stream_id = promised_stream_id f.data = self.encoder.encode(headers) f.flags = set(flags) f.flags.add('END_HEADERS') return f def build_priority_frame(self, stream_id, weight, depends_on=0, exclusive=False): """ Builds a single priority frame. """ f = PriorityFrame(stream_id) f.depends_on = depends_on f.stream_weight = weight f.exclusive = exclusive return f def build_alt_svc_frame(self, stream_id, origin, field): """ Builds a single ALTSVC frame. """ f = AltSvcFrame(stream_id) f.origin = origin f.field = field return f def change_table_size(self, new_size): """ Causes the encoder to send a dynamic size update in the next header block it sends. """ self.encoder.header_table_size = new_size h2-3.1.1/test/test_basic_logic.py0000664000175000017500000017774613421652727017602 0ustar ubuntuubuntu00000000000000# -*- coding: utf-8 -*- """ test_basic_logic ~~~~~~~~~~~~~~~~ Test the basic logic of the h2 state machines. """ import random import sys import hyperframe import pytest import h2.config import h2.connection import h2.errors import h2.events import h2.exceptions import h2.frame_buffer import h2.settings import h2.stream import helpers from hypothesis import given from hypothesis.strategies import integers IS_PYTHON3 = sys.version_info >= (3, 0) class TestBasicClient(object): """ Basic client-side tests. """ example_request_headers = [ (u':authority', u'example.com'), (u':path', u'/'), (u':scheme', u'https'), (u':method', u'GET'), ] bytes_example_request_headers = [ (b':authority', b'example.com'), (b':path', b'/'), (b':scheme', b'https'), (b':method', b'GET'), ] example_response_headers = [ (u':status', u'200'), (u'server', u'fake-serv/0.1.0') ] bytes_example_response_headers = [ (b':status', b'200'), (b'server', b'fake-serv/0.1.0') ] def test_begin_connection(self, frame_factory): """ Client connections emit the HTTP/2 preamble. """ c = h2.connection.H2Connection() expected_settings = frame_factory.build_settings_frame( c.local_settings ) expected_data = ( b'PRI * HTTP/2.0\r\n\r\nSM\r\n\r\n' + expected_settings.serialize() ) events = c.initiate_connection() assert not events assert c.data_to_send() == expected_data def test_sending_headers(self): """ Single headers frames are correctly encoded. """ c = h2.connection.H2Connection() c.initiate_connection() # Clear the data, then send headers. c.clear_outbound_data_buffer() events = c.send_headers(1, self.example_request_headers) assert not events assert c.data_to_send() == ( b'\x00\x00\r\x01\x04\x00\x00\x00\x01' b'A\x88/\x91\xd3]\x05\\\x87\xa7\x84\x87\x82' ) def test_sending_data(self): """ Single data frames are encoded correctly. """ c = h2.connection.H2Connection() c.initiate_connection() c.send_headers(1, self.example_request_headers) # Clear the data, then send some data. c.clear_outbound_data_buffer() events = c.send_data(1, b'some data') assert not events data_to_send = c.data_to_send() assert ( data_to_send == b'\x00\x00\t\x00\x00\x00\x00\x00\x01some data' ) buffer = h2.frame_buffer.FrameBuffer(server=False) buffer.max_frame_size = 65535 buffer.add_data(data_to_send) data_frame = list(buffer)[0] sanity_check_data_frame( data_frame=data_frame, expected_flow_controlled_length=len(b'some data'), expect_padded_flag=False, expected_data_frame_pad_length=0 ) def test_sending_data_in_memoryview(self): """ Support memoryview for sending data. """ c = h2.connection.H2Connection() c.initiate_connection() c.send_headers(1, self.example_request_headers) # Clear the data, then send some data. c.clear_outbound_data_buffer() events = c.send_data(1, memoryview(b'some data')) assert not events data_to_send = c.data_to_send() assert ( data_to_send == b'\x00\x00\t\x00\x00\x00\x00\x00\x01some data' ) def test_sending_data_with_padding(self): """ Single data frames with padding are encoded correctly. """ c = h2.connection.H2Connection() c.initiate_connection() c.send_headers(1, self.example_request_headers) # Clear the data, then send some data. c.clear_outbound_data_buffer() events = c.send_data(1, b'some data', pad_length=5) assert not events data_to_send = c.data_to_send() assert data_to_send == ( b'\x00\x00\x0f\x00\x08\x00\x00\x00\x01' b'\x05some data\x00\x00\x00\x00\x00' ) buffer = h2.frame_buffer.FrameBuffer(server=False) buffer.max_frame_size = 65535 buffer.add_data(data_to_send) data_frame = list(buffer)[0] sanity_check_data_frame( data_frame=data_frame, expected_flow_controlled_length=len(b'some data') + 1 + 5, expect_padded_flag=True, expected_data_frame_pad_length=5 ) def test_sending_data_with_zero_length_padding(self): """ Single data frames with zero-length padding are encoded correctly. """ c = h2.connection.H2Connection() c.initiate_connection() c.send_headers(1, self.example_request_headers) # Clear the data, then send some data. c.clear_outbound_data_buffer() events = c.send_data(1, b'some data', pad_length=0) assert not events data_to_send = c.data_to_send() assert data_to_send == ( b'\x00\x00\x0a\x00\x08\x00\x00\x00\x01' b'\x00some data' ) buffer = h2.frame_buffer.FrameBuffer(server=False) buffer.max_frame_size = 65535 buffer.add_data(data_to_send) data_frame = list(buffer)[0] sanity_check_data_frame( data_frame=data_frame, expected_flow_controlled_length=len(b'some data') + 1, expect_padded_flag=True, expected_data_frame_pad_length=0 ) @pytest.mark.parametrize("expected_error,pad_length", [ (None, 0), (None, 255), (None, None), (ValueError, -1), (ValueError, 256), (TypeError, 'invalid'), (TypeError, ''), (TypeError, '10'), (TypeError, {}), (TypeError, ['1', '2', '3']), (TypeError, []), (TypeError, 1.5), (TypeError, 1.0), (TypeError, -1.0), ]) def test_sending_data_with_invalid_padding_length(self, expected_error, pad_length): """ ``send_data`` with a ``pad_length`` parameter that is an integer outside the range of [0, 255] throws a ``ValueError``, and a ``pad_length`` parameter which is not an ``integer`` type throws a ``TypeError``. """ c = h2.connection.H2Connection() c.initiate_connection() c.send_headers(1, self.example_request_headers) c.clear_outbound_data_buffer() if expected_error is not None: with pytest.raises(expected_error): c.send_data(1, b'some data', pad_length=pad_length) else: c.send_data(1, b'some data', pad_length=pad_length) def test_closing_stream_sending_data(self, frame_factory): """ We can close a stream with a data frame. """ c = h2.connection.H2Connection() c.initiate_connection() c.send_headers(1, self.example_request_headers) f = frame_factory.build_data_frame( data=b'some data', flags=['END_STREAM'], ) # Clear the data, then send some data. c.clear_outbound_data_buffer() events = c.send_data(1, b'some data', end_stream=True) assert not events assert c.data_to_send() == f.serialize() def test_receiving_a_response(self, frame_factory): """ When receiving a response, the ResponseReceived event fires. """ config = h2.config.H2Configuration(header_encoding='utf-8') c = h2.connection.H2Connection(config=config) c.initiate_connection() c.send_headers(1, self.example_request_headers, end_stream=True) # Clear the data f = frame_factory.build_headers_frame( self.example_response_headers ) events = c.receive_data(f.serialize()) assert len(events) == 1 event = events[0] assert isinstance(event, h2.events.ResponseReceived) assert event.stream_id == 1 assert event.headers == self.example_response_headers def test_receiving_a_response_bytes(self, frame_factory): """ When receiving a response, the ResponseReceived event fires with bytes headers if the encoding is set appropriately. """ config = h2.config.H2Configuration(header_encoding=False) c = h2.connection.H2Connection(config=config) c.initiate_connection() c.send_headers(1, self.example_request_headers, end_stream=True) # Clear the data f = frame_factory.build_headers_frame( self.example_response_headers ) events = c.receive_data(f.serialize()) assert len(events) == 1 event = events[0] assert isinstance(event, h2.events.ResponseReceived) assert event.stream_id == 1 assert event.headers == self.bytes_example_response_headers def test_receiving_a_response_change_encoding(self, frame_factory): """ When receiving a response, the ResponseReceived event fires with bytes headers if the encoding is set appropriately, but if this changes then the change reflects it. """ config = h2.config.H2Configuration(header_encoding=False) c = h2.connection.H2Connection(config=config) c.initiate_connection() c.send_headers(1, self.example_request_headers, end_stream=True) f = frame_factory.build_headers_frame( self.example_response_headers ) events = c.receive_data(f.serialize()) assert len(events) == 1 event = events[0] assert isinstance(event, h2.events.ResponseReceived) assert event.stream_id == 1 assert event.headers == self.bytes_example_response_headers c.send_headers(3, self.example_request_headers, end_stream=True) c.config.header_encoding = 'utf-8' f = frame_factory.build_headers_frame( self.example_response_headers, stream_id=3, ) events = c.receive_data(f.serialize()) assert len(events) == 1 event = events[0] assert isinstance(event, h2.events.ResponseReceived) assert event.stream_id == 3 assert event.headers == self.example_response_headers def test_end_stream_without_data(self, frame_factory): """ Ending a stream without data emits a zero-length DATA frame with END_STREAM set. """ c = h2.connection.H2Connection() c.initiate_connection() c.send_headers(1, self.example_request_headers, end_stream=False) # Clear the data c.clear_outbound_data_buffer() f = frame_factory.build_data_frame(b'', flags=['END_STREAM']) events = c.end_stream(1) assert not events assert c.data_to_send() == f.serialize() def test_cannot_send_headers_on_lower_stream_id(self): """ Once stream ID x has been used, cannot use stream ID y where y < x. """ c = h2.connection.H2Connection() c.initiate_connection() c.send_headers(3, self.example_request_headers, end_stream=False) with pytest.raises(h2.exceptions.StreamIDTooLowError) as e: c.send_headers(1, self.example_request_headers, end_stream=True) assert e.value.stream_id == 1 assert e.value.max_stream_id == 3 def test_receiving_pushed_stream(self, frame_factory): """ Pushed streams fire a PushedStreamReceived event, followed by ResponseReceived when the response headers are received. """ config = h2.config.H2Configuration(header_encoding='utf-8') c = h2.connection.H2Connection(config=config) c.initiate_connection() c.send_headers(1, self.example_request_headers, end_stream=False) f1 = frame_factory.build_headers_frame( self.example_response_headers ) f2 = frame_factory.build_push_promise_frame( stream_id=1, promised_stream_id=2, headers=self.example_request_headers, flags=['END_HEADERS'], ) f3 = frame_factory.build_headers_frame( self.example_response_headers, stream_id=2, ) data = b''.join(x.serialize() for x in [f1, f2, f3]) events = c.receive_data(data) assert len(events) == 3 stream_push_event = events[1] response_event = events[2] assert isinstance(stream_push_event, h2.events.PushedStreamReceived) assert isinstance(response_event, h2.events.ResponseReceived) assert stream_push_event.pushed_stream_id == 2 assert stream_push_event.parent_stream_id == 1 assert ( stream_push_event.headers == self.example_request_headers ) assert response_event.stream_id == 2 assert response_event.headers == self.example_response_headers def test_receiving_pushed_stream_bytes(self, frame_factory): """ Pushed headers are not decoded if the header encoding is set to False. """ config = h2.config.H2Configuration(header_encoding=False) c = h2.connection.H2Connection(config=config) c.initiate_connection() c.send_headers(1, self.example_request_headers, end_stream=False) f1 = frame_factory.build_headers_frame( self.example_response_headers ) f2 = frame_factory.build_push_promise_frame( stream_id=1, promised_stream_id=2, headers=self.example_request_headers, flags=['END_HEADERS'], ) f3 = frame_factory.build_headers_frame( self.example_response_headers, stream_id=2, ) data = b''.join(x.serialize() for x in [f1, f2, f3]) events = c.receive_data(data) assert len(events) == 3 stream_push_event = events[1] response_event = events[2] assert isinstance(stream_push_event, h2.events.PushedStreamReceived) assert isinstance(response_event, h2.events.ResponseReceived) assert stream_push_event.pushed_stream_id == 2 assert stream_push_event.parent_stream_id == 1 assert ( stream_push_event.headers == self.bytes_example_request_headers ) assert response_event.stream_id == 2 assert response_event.headers == self.bytes_example_response_headers def test_cannot_receive_pushed_stream_when_enable_push_is_0(self, frame_factory): """ If we have set SETTINGS_ENABLE_PUSH to 0, receiving PUSH_PROMISE frames triggers the connection to be closed. """ c = h2.connection.H2Connection() c.initiate_connection() c.local_settings.enable_push = 0 c.send_headers(1, self.example_request_headers, end_stream=False) f1 = frame_factory.build_settings_frame({}, ack=True) f2 = frame_factory.build_headers_frame( self.example_response_headers ) f3 = frame_factory.build_push_promise_frame( stream_id=1, promised_stream_id=2, headers=self.example_request_headers, flags=['END_HEADERS'], ) c.receive_data(f1.serialize()) c.receive_data(f2.serialize()) c.clear_outbound_data_buffer() with pytest.raises(h2.exceptions.ProtocolError): c.receive_data(f3.serialize()) expected_frame = frame_factory.build_goaway_frame( 0, h2.errors.ErrorCodes.PROTOCOL_ERROR ) assert c.data_to_send() == expected_frame.serialize() def test_receiving_response_no_body(self, frame_factory): """ Receiving a response without a body fires two events, ResponseReceived and StreamEnded. """ c = h2.connection.H2Connection() c.initiate_connection() c.send_headers(1, self.example_request_headers, end_stream=True) f = frame_factory.build_headers_frame( self.example_response_headers, flags=['END_STREAM'] ) events = c.receive_data(f.serialize()) assert len(events) == 2 response_event = events[0] end_stream = events[1] assert isinstance(response_event, h2.events.ResponseReceived) assert isinstance(end_stream, h2.events.StreamEnded) def test_oversize_headers(self): """ Sending headers that are oversized generates a stream of CONTINUATION frames. """ all_bytes = [chr(x) for x in range(0, 256)] if IS_PYTHON3: all_bytes = [x.encode('latin1') for x in all_bytes] large_binary_string = b''.join( random.choice(all_bytes) for _ in range(0, 256) ) test_headers = [ (':authority', 'example.com'), (':path', '/'), (':method', 'GET'), (':scheme', 'https'), ('key', large_binary_string) ] c = h2.connection.H2Connection() # Greatly shrink the max frame size to force us over. c.max_outbound_frame_size = 48 c.initiate_connection() c.send_headers(1, test_headers, end_stream=True) # Use the frame buffer here, because we don't care about decoding # the headers. Don't send all the data in because that will force the # frame buffer to stop caching the CONTINUATION frames, so instead # send all but one byte. buffer = h2.frame_buffer.FrameBuffer(server=True) buffer.max_frame_size = 65535 data = c.data_to_send() buffer.add_data(data[:-1]) # Drain the buffer, confirming that it only provides a single frame # (the settings frame) assert len(list(buffer)) == 1 # Get the cached frames. frames = buffer._headers_buffer # Split the frames up. headers_frame = frames[0] continuation_frames = frames[1:] assert isinstance(headers_frame, hyperframe.frame.HeadersFrame) assert all( map( lambda f: isinstance(f, hyperframe.frame.ContinuationFrame), continuation_frames) ) assert all( map(lambda f: len(f.data) <= c.max_outbound_frame_size, frames) ) assert frames[0].flags == {'END_STREAM'} buffer.add_data(data[-1:]) headers = list(buffer)[0] assert isinstance(headers, hyperframe.frame.HeadersFrame) def test_handle_stream_reset(self, frame_factory): """ Streams being remotely reset fires a StreamReset event. """ c = h2.connection.H2Connection() c.initiate_connection() c.send_headers(1, self.example_request_headers, end_stream=True) c.clear_outbound_data_buffer() f = frame_factory.build_rst_stream_frame( stream_id=1, error_code=h2.errors.ErrorCodes.STREAM_CLOSED, ) events = c.receive_data(f.serialize()) assert len(events) == 1 event = events[0] assert isinstance(event, h2.events.StreamReset) assert event.stream_id == 1 assert event.error_code is h2.errors.ErrorCodes.STREAM_CLOSED assert isinstance(event.error_code, h2.errors.ErrorCodes) assert event.remote_reset def test_handle_stream_reset_with_unknown_erorr_code(self, frame_factory): """ Streams being remotely reset with unknown error codes behave exactly as they do with known error codes, but the error code on the event is an int, instead of being an ErrorCodes. """ c = h2.connection.H2Connection() c.initiate_connection() c.send_headers(1, self.example_request_headers, end_stream=True) c.clear_outbound_data_buffer() f = frame_factory.build_rst_stream_frame(stream_id=1, error_code=0xFA) events = c.receive_data(f.serialize()) assert len(events) == 1 event = events[0] assert isinstance(event, h2.events.StreamReset) assert event.stream_id == 1 assert event.error_code == 250 assert not isinstance(event.error_code, h2.errors.ErrorCodes) assert event.remote_reset def test_can_consume_partial_data_from_connection(self): """ We can do partial reads from the connection. """ c = h2.connection.H2Connection() c.initiate_connection() assert len(c.data_to_send(2)) == 2 assert len(c.data_to_send(3)) == 3 assert 0 < len(c.data_to_send(500)) < 500 assert len(c.data_to_send(10)) == 0 assert len(c.data_to_send()) == 0 def test_we_can_update_settings(self, frame_factory): """ Updating the settings emits a SETTINGS frame. """ c = h2.connection.H2Connection() c.initiate_connection() c.clear_outbound_data_buffer() new_settings = { h2.settings.SettingCodes.HEADER_TABLE_SIZE: 52, h2.settings.SettingCodes.ENABLE_PUSH: 0, } events = c.update_settings(new_settings) assert not events f = frame_factory.build_settings_frame(new_settings) assert c.data_to_send() == f.serialize() def test_settings_get_acked_correctly(self, frame_factory): """ When settings changes are ACKed, they contain the changed settings. """ c = h2.connection.H2Connection() c.initiate_connection() new_settings = { h2.settings.SettingCodes.HEADER_TABLE_SIZE: 52, h2.settings.SettingCodes.ENABLE_PUSH: 0, } c.update_settings(new_settings) f = frame_factory.build_settings_frame({}, ack=True) events = c.receive_data(f.serialize()) assert len(events) == 1 event = events[0] assert isinstance(event, h2.events.SettingsAcknowledged) assert len(event.changed_settings) == len(new_settings) for setting, value in new_settings.items(): assert event.changed_settings[setting].new_value == value def test_cannot_create_new_outbound_stream_over_limit(self, frame_factory): """ When the number of outbound streams exceeds the remote peer's MAX_CONCURRENT_STREAMS setting, attempting to open new streams fails. """ c = h2.connection.H2Connection() c.initiate_connection() f = frame_factory.build_settings_frame( {h2.settings.SettingCodes.MAX_CONCURRENT_STREAMS: 1} ) c.receive_data(f.serialize())[0] c.send_headers(1, self.example_request_headers) with pytest.raises(h2.exceptions.TooManyStreamsError): c.send_headers(3, self.example_request_headers) def test_can_receive_trailers(self, frame_factory): """ When two HEADERS blocks are received in the same stream from a server, the second set are trailers. """ config = h2.config.H2Configuration(header_encoding='utf-8') c = h2.connection.H2Connection(config=config) c.initiate_connection() c.send_headers(1, self.example_request_headers) f = frame_factory.build_headers_frame(self.example_response_headers) c.receive_data(f.serialize()) # Send in trailers. trailers = [('content-length', '0')] f = frame_factory.build_headers_frame( trailers, flags=['END_STREAM'], ) events = c.receive_data(f.serialize()) assert len(events) == 2 event = events[0] assert isinstance(event, h2.events.TrailersReceived) assert event.headers == trailers assert event.stream_id == 1 def test_reject_trailers_not_ending_stream(self, frame_factory): """ When trailers are received without the END_STREAM flag being present, this is a ProtocolError. """ c = h2.connection.H2Connection() c.initiate_connection() c.send_headers(1, self.example_request_headers) f = frame_factory.build_headers_frame(self.example_response_headers) c.receive_data(f.serialize()) # Send in trailers. c.clear_outbound_data_buffer() trailers = [('content-length', '0')] f = frame_factory.build_headers_frame( trailers, flags=[], ) with pytest.raises(h2.exceptions.ProtocolError): c.receive_data(f.serialize()) expected_frame = frame_factory.build_goaway_frame( last_stream_id=0, error_code=h2.errors.ErrorCodes.PROTOCOL_ERROR, ) assert c.data_to_send() == expected_frame.serialize() def test_can_send_trailers(self, frame_factory): """ When a second set of headers are sent, they are properly trailers. """ c = h2.connection.H2Connection() c.initiate_connection() c.clear_outbound_data_buffer() c.send_headers(1, self.example_request_headers) # Now send trailers. trailers = [('content-length', '0')] c.send_headers(1, trailers, end_stream=True) frame_factory.refresh_encoder() f1 = frame_factory.build_headers_frame( self.example_request_headers, ) f2 = frame_factory.build_headers_frame( trailers, flags=['END_STREAM'], ) assert c.data_to_send() == f1.serialize() + f2.serialize() def test_trailers_must_have_end_stream(self, frame_factory): """ A set of trailers must carry the END_STREAM flag. """ c = h2.connection.H2Connection() c.initiate_connection() # Send headers. c.send_headers(1, self.example_request_headers) # Now send trailers. trailers = [('content-length', '0')] with pytest.raises(h2.exceptions.ProtocolError): c.send_headers(1, trailers) def test_headers_are_lowercase(self, frame_factory): """ When headers are sent, they are forced to lower-case. """ weird_headers = self.example_request_headers + [ ('ChAnGiNg-CaSe', 'AlsoHere'), ('alllowercase', 'alllowercase'), ('ALLCAPS', 'ALLCAPS'), ] expected_headers = self.example_request_headers + [ ('changing-case', 'AlsoHere'), ('alllowercase', 'alllowercase'), ('allcaps', 'ALLCAPS'), ] c = h2.connection.H2Connection() c.initiate_connection() c.clear_outbound_data_buffer() c.send_headers(1, weird_headers) expected_frame = frame_factory.build_headers_frame( headers=expected_headers ) assert c.data_to_send() == expected_frame.serialize() @given(frame_size=integers(min_value=2**14, max_value=(2**24 - 1))) def test_changing_max_frame_size(self, frame_factory, frame_size): """ When the user changes the max frame size and the change is ACKed, the remote peer is now bound by the new frame size. """ # We need to refresh the encoder because hypothesis has a problem with # integrating with py.test, meaning that we use the same frame factory # for all tests. # See https://github.com/HypothesisWorks/hypothesis-python/issues/377 frame_factory.refresh_encoder() c = h2.connection.H2Connection() c.initiate_connection() # Set up the stream. c.send_headers(1, self.example_request_headers, end_stream=True) headers_frame = frame_factory.build_headers_frame( headers=self.example_response_headers, ) c.receive_data(headers_frame.serialize()) # Change the max frame size. c.update_settings( {h2.settings.SettingCodes.MAX_FRAME_SIZE: frame_size} ) settings_ack = frame_factory.build_settings_frame({}, ack=True) c.receive_data(settings_ack.serialize()) # Greatly increase the flow control windows: we're not here to test # flow control today. c.increment_flow_control_window(increment=(2 * frame_size) + 1) c.increment_flow_control_window( increment=(2 * frame_size) + 1, stream_id=1 ) # Send one DATA frame that is exactly the max frame size: confirm it's # fine. data = frame_factory.build_data_frame( data=(b'\x00' * frame_size), ) events = c.receive_data(data.serialize()) assert len(events) == 1 assert isinstance(events[0], h2.events.DataReceived) assert events[0].flow_controlled_length == frame_size # Send one that is one byte too large: confirm a protocol error is # raised. data.data += b'\x00' with pytest.raises(h2.exceptions.ProtocolError): c.receive_data(data.serialize()) def test_cookies_are_joined_on_push(self, frame_factory): """ RFC 7540 Section 8.1.2.5 requires that we join multiple Cookie headers in a header block together when they're received on a push. """ # This is a moderately varied set of cookie headers: some combined, # some split. cookie_headers = [ ('cookie', 'username=John Doe; expires=Thu, 18 Dec 2013 12:00:00 UTC'), ('cookie', 'path=1'), ('cookie', 'test1=val1; test2=val2') ] expected = ( 'username=John Doe; expires=Thu, 18 Dec 2013 12:00:00 UTC; ' 'path=1; test1=val1; test2=val2' ) config = h2.config.H2Configuration(header_encoding='utf-8') c = h2.connection.H2Connection(config=config) c.initiate_connection() c.send_headers(1, self.example_request_headers, end_stream=True) f = frame_factory.build_push_promise_frame( stream_id=1, promised_stream_id=2, headers=self.example_request_headers + cookie_headers ) events = c.receive_data(f.serialize()) assert len(events) == 1 e = events[0] cookie_fields = [(n, v) for n, v in e.headers if n == 'cookie'] assert len(cookie_fields) == 1 _, v = cookie_fields[0] assert v == expected def test_cookies_arent_joined_without_normalization(self, frame_factory): """ If inbound header normalization is disabled, cookie headers aren't joined. """ # This is a moderately varied set of cookie headers: some combined, # some split. cookie_headers = [ ('cookie', 'username=John Doe; expires=Thu, 18 Dec 2013 12:00:00 UTC'), ('cookie', 'path=1'), ('cookie', 'test1=val1; test2=val2') ] config = h2.config.H2Configuration( client_side=True, normalize_inbound_headers=False, header_encoding='utf-8' ) c = h2.connection.H2Connection(config=config) c.initiate_connection() c.send_headers(1, self.example_request_headers, end_stream=True) f = frame_factory.build_push_promise_frame( stream_id=1, promised_stream_id=2, headers=self.example_request_headers + cookie_headers ) events = c.receive_data(f.serialize()) assert len(events) == 1 e = events[0] received_cookies = [(n, v) for n, v in e.headers if n == 'cookie'] assert len(received_cookies) == 3 assert cookie_headers == received_cookies class TestBasicServer(object): """ Basic server-side tests. """ example_request_headers = [ (u':authority', u'example.com'), (u':path', u'/'), (u':scheme', u'https'), (u':method', u'GET'), ] bytes_example_request_headers = [ (b':authority', b'example.com'), (b':path', b'/'), (b':scheme', b'https'), (b':method', b'GET'), ] example_response_headers = [ (':status', '200'), ('server', 'hyper-h2/0.1.0') ] server_config = h2.config.H2Configuration( client_side=False, header_encoding='utf-8' ) def test_ignores_preamble(self): """ The preamble does not cause any events or frames to be written. """ c = h2.connection.H2Connection(config=self.server_config) preamble = b'PRI * HTTP/2.0\r\n\r\nSM\r\n\r\n' events = c.receive_data(preamble) assert not events assert not c.data_to_send() @pytest.mark.parametrize("chunk_size", range(1, 24)) def test_drip_feed_preamble(self, chunk_size): """ The preamble can be sent in in less than a single buffer. """ c = h2.connection.H2Connection(config=self.server_config) preamble = b'PRI * HTTP/2.0\r\n\r\nSM\r\n\r\n' events = [] for i in range(0, len(preamble), chunk_size): events += c.receive_data(preamble[i:i+chunk_size]) assert not events assert not c.data_to_send() def test_initiate_connection_sends_server_preamble(self, frame_factory): """ For server-side connections, initiate_connection sends a server preamble. """ c = h2.connection.H2Connection(config=self.server_config) expected_settings = frame_factory.build_settings_frame( c.local_settings ) expected_data = expected_settings.serialize() events = c.initiate_connection() assert not events assert c.data_to_send() == expected_data def test_headers_event(self, frame_factory): """ When a headers frame is received a RequestReceived event fires. """ c = h2.connection.H2Connection(config=self.server_config) c.receive_data(frame_factory.preamble()) f = frame_factory.build_headers_frame(self.example_request_headers) data = f.serialize() events = c.receive_data(data) assert len(events) == 1 event = events[0] assert isinstance(event, h2.events.RequestReceived) assert event.stream_id == 1 assert event.headers == self.example_request_headers def test_headers_event_bytes(self, frame_factory): """ When a headers frame is received a RequestReceived event fires with bytes headers if the encoding is set appropriately. """ config = h2.config.H2Configuration( client_side=False, header_encoding=False ) c = h2.connection.H2Connection(config=config) c.receive_data(frame_factory.preamble()) f = frame_factory.build_headers_frame(self.example_request_headers) data = f.serialize() events = c.receive_data(data) assert len(events) == 1 event = events[0] assert isinstance(event, h2.events.RequestReceived) assert event.stream_id == 1 assert event.headers == self.bytes_example_request_headers def test_data_event(self, frame_factory): """ Test that data received on a stream fires a DataReceived event. """ c = h2.connection.H2Connection(config=self.server_config) c.receive_data(frame_factory.preamble()) f1 = frame_factory.build_headers_frame( self.example_request_headers, stream_id=3 ) f2 = frame_factory.build_data_frame( b'some request data', stream_id=3, ) data = b''.join(map(lambda f: f.serialize(), [f1, f2])) events = c.receive_data(data) assert len(events) == 2 event = events[1] assert isinstance(event, h2.events.DataReceived) assert event.stream_id == 3 assert event.data == b'some request data' assert event.flow_controlled_length == 17 def test_data_event_with_padding(self, frame_factory): """ Test that data received on a stream fires a DataReceived event that accounts for padding. """ c = h2.connection.H2Connection(config=self.server_config) c.receive_data(frame_factory.preamble()) f1 = frame_factory.build_headers_frame( self.example_request_headers, stream_id=3 ) f2 = frame_factory.build_data_frame( b'some request data', stream_id=3, padding_len=20 ) data = b''.join(map(lambda f: f.serialize(), [f1, f2])) events = c.receive_data(data) assert len(events) == 2 event = events[1] assert isinstance(event, h2.events.DataReceived) assert event.stream_id == 3 assert event.data == b'some request data' assert event.flow_controlled_length == 17 + 20 + 1 def test_receiving_ping_frame(self, frame_factory): """ Ping frames should be immediately ACKed. """ c = h2.connection.H2Connection(config=self.server_config) c.receive_data(frame_factory.preamble()) ping_data = b'\x01' * 8 sent_frame = frame_factory.build_ping_frame(ping_data) expected_frame = frame_factory.build_ping_frame( ping_data, flags=["ACK"] ) expected_data = expected_frame.serialize() c.clear_outbound_data_buffer() events = c.receive_data(sent_frame.serialize()) assert len(events) == 1 event = events[0] assert isinstance(event, h2.events.PingReceived) assert event.ping_data == ping_data assert c.data_to_send() == expected_data def test_receiving_settings_frame_event(self, frame_factory): """ Settings frames should cause a RemoteSettingsChanged event to fire. """ c = h2.connection.H2Connection(config=self.server_config) c.receive_data(frame_factory.preamble()) f = frame_factory.build_settings_frame( settings=helpers.SAMPLE_SETTINGS ) events = c.receive_data(f.serialize()) assert len(events) == 1 event = events[0] assert isinstance(event, h2.events.RemoteSettingsChanged) assert len(event.changed_settings) == len(helpers.SAMPLE_SETTINGS) def test_acknowledging_settings(self, frame_factory): """ Acknowledging settings causes appropriate Settings frame to be emitted. """ c = h2.connection.H2Connection(config=self.server_config) c.receive_data(frame_factory.preamble()) received_frame = frame_factory.build_settings_frame( settings=helpers.SAMPLE_SETTINGS ) expected_frame = frame_factory.build_settings_frame( settings={}, ack=True ) expected_data = expected_frame.serialize() c.clear_outbound_data_buffer() events = c.receive_data(received_frame.serialize()) assert len(events) == 1 assert c.data_to_send() == expected_data def test_close_connection(self, frame_factory): """ Closing the connection with no error code emits a GOAWAY frame with error code 0. """ c = h2.connection.H2Connection(config=self.server_config) c.receive_data(frame_factory.preamble()) f = frame_factory.build_goaway_frame(last_stream_id=0) expected_data = f.serialize() c.clear_outbound_data_buffer() events = c.close_connection() assert not events assert c.data_to_send() == expected_data @pytest.mark.parametrize("error_code", h2.errors.ErrorCodes) def test_close_connection_with_error_code(self, frame_factory, error_code): """ Closing the connection with an error code emits a GOAWAY frame with that error code. """ c = h2.connection.H2Connection(config=self.server_config) c.receive_data(frame_factory.preamble()) f = frame_factory.build_goaway_frame( error_code=error_code, last_stream_id=0 ) expected_data = f.serialize() c.clear_outbound_data_buffer() events = c.close_connection(error_code) assert not events assert c.data_to_send() == expected_data @pytest.mark.parametrize("last_stream_id,output", [ (None, 23), (0, 0), (42, 42) ]) def test_close_connection_with_last_stream_id(self, frame_factory, last_stream_id, output): """ Closing the connection with last_stream_id set emits a GOAWAY frame with that value. """ c = h2.connection.H2Connection(config=self.server_config) c.receive_data(frame_factory.preamble()) headers_frame = frame_factory.build_headers_frame( [ (':authority', 'example.com'), (':path', '/'), (':scheme', 'https'), (':method', 'GET'), ], stream_id=23) c.receive_data(headers_frame.serialize()) f = frame_factory.build_goaway_frame( last_stream_id=output ) expected_data = f.serialize() c.clear_outbound_data_buffer() events = c.close_connection(last_stream_id=last_stream_id) assert not events assert c.data_to_send() == expected_data @pytest.mark.parametrize("additional_data,output", [ (None, b''), (b'', b''), (b'foobar', b'foobar') ]) def test_close_connection_with_additional_data(self, frame_factory, additional_data, output): """ Closing the connection with additional debug data emits a GOAWAY frame with that data attached. """ c = h2.connection.H2Connection(config=self.server_config) c.receive_data(frame_factory.preamble()) f = frame_factory.build_goaway_frame( last_stream_id=0, additional_data=output ) expected_data = f.serialize() c.clear_outbound_data_buffer() events = c.close_connection(additional_data=additional_data) assert not events assert c.data_to_send() == expected_data def test_reset_stream(self, frame_factory): """ Resetting a stream with no error code emits a RST_STREAM frame with error code 0. """ c = h2.connection.H2Connection(config=self.server_config) c.receive_data(frame_factory.preamble()) f = frame_factory.build_headers_frame(self.example_request_headers) c.receive_data(f.serialize()) c.clear_outbound_data_buffer() expected_frame = frame_factory.build_rst_stream_frame(stream_id=1) expected_data = expected_frame.serialize() events = c.reset_stream(stream_id=1) assert not events assert c.data_to_send() == expected_data @pytest.mark.parametrize("error_code", h2.errors.ErrorCodes) def test_reset_stream_with_error_code(self, frame_factory, error_code): """ Resetting a stream with an error code emits a RST_STREAM frame with that error code. """ c = h2.connection.H2Connection(config=self.server_config) c.receive_data(frame_factory.preamble()) f = frame_factory.build_headers_frame( self.example_request_headers, stream_id=3 ) c.receive_data(f.serialize()) c.clear_outbound_data_buffer() expected_frame = frame_factory.build_rst_stream_frame( stream_id=3, error_code=error_code ) expected_data = expected_frame.serialize() events = c.reset_stream(stream_id=3, error_code=error_code) assert not events assert c.data_to_send() == expected_data def test_cannot_reset_nonexistent_stream(self, frame_factory): """ Resetting nonexistent streams raises NoSuchStreamError. """ c = h2.connection.H2Connection(config=self.server_config) c.receive_data(frame_factory.preamble()) f = frame_factory.build_headers_frame( self.example_request_headers, stream_id=3 ) c.receive_data(f.serialize()) with pytest.raises(h2.exceptions.NoSuchStreamError) as e: c.reset_stream(stream_id=1) assert e.value.stream_id == 1 with pytest.raises(h2.exceptions.NoSuchStreamError) as e: c.reset_stream(stream_id=5) assert e.value.stream_id == 5 def test_basic_sending_ping_frame_logic(self, frame_factory): """ Sending ping frames serializes a ping frame on stream 0 with approriate opaque data. """ c = h2.connection.H2Connection(config=self.server_config) c.receive_data(frame_factory.preamble()) c.clear_outbound_data_buffer() ping_data = b'\x01\x02\x03\x04\x05\x06\x07\x08' expected_frame = frame_factory.build_ping_frame(ping_data) expected_data = expected_frame.serialize() events = c.ping(ping_data) assert not events assert c.data_to_send() == expected_data @pytest.mark.parametrize( 'opaque_data', [ b'', b'\x01\x02\x03\x04\x05\x06\x07', u'abcdefgh', b'too many bytes', ] ) def test_ping_frame_opaque_data_must_be_length_8_bytestring(self, frame_factory, opaque_data): """ Sending a ping frame only works with 8-byte bytestrings. """ c = h2.connection.H2Connection(config=self.server_config) c.receive_data(frame_factory.preamble()) with pytest.raises(ValueError): c.ping(opaque_data) def test_receiving_ping_acknowledgement(self, frame_factory): """ Receiving a PING acknowledgement fires a PingAckReceived event. """ c = h2.connection.H2Connection(config=self.server_config) c.receive_data(frame_factory.preamble()) ping_data = b'\x01\x02\x03\x04\x05\x06\x07\x08' f = frame_factory.build_ping_frame( ping_data, flags=['ACK'] ) events = c.receive_data(f.serialize()) assert len(events) == 1 event = events[0] assert isinstance(event, h2.events.PingAckReceived) assert isinstance(event, h2.events.PingAcknowledged) # deprecated assert event.ping_data == ping_data def test_stream_ended_remotely(self, frame_factory): """ When the remote stream ends with a non-empty data frame a DataReceived event and a StreamEnded event are fired. """ c = h2.connection.H2Connection(config=self.server_config) c.receive_data(frame_factory.preamble()) f1 = frame_factory.build_headers_frame( self.example_request_headers, stream_id=3 ) f2 = frame_factory.build_data_frame( b'some request data', flags=['END_STREAM'], stream_id=3, ) data = b''.join(map(lambda f: f.serialize(), [f1, f2])) events = c.receive_data(data) assert len(events) == 3 data_event = events[1] stream_ended_event = events[2] assert isinstance(data_event, h2.events.DataReceived) assert isinstance(stream_ended_event, h2.events.StreamEnded) stream_ended_event.stream_id == 3 def test_can_push_stream(self, frame_factory): """ Pushing a stream causes a PUSH_PROMISE frame to be emitted. """ c = h2.connection.H2Connection(config=self.server_config) c.receive_data(frame_factory.preamble()) f = frame_factory.build_headers_frame( self.example_request_headers ) c.receive_data(f.serialize()) frame_factory.refresh_encoder() expected_frame = frame_factory.build_push_promise_frame( stream_id=1, promised_stream_id=2, headers=self.example_request_headers, flags=['END_HEADERS'], ) c.clear_outbound_data_buffer() c.push_stream( stream_id=1, promised_stream_id=2, request_headers=self.example_request_headers ) assert c.data_to_send() == expected_frame.serialize() def test_cannot_push_streams_when_disabled(self, frame_factory): """ When the remote peer has disabled stream pushing, we should fail. """ c = h2.connection.H2Connection(config=self.server_config) c.receive_data(frame_factory.preamble()) f = frame_factory.build_settings_frame( {h2.settings.SettingCodes.ENABLE_PUSH: 0} ) c.receive_data(f.serialize()) f = frame_factory.build_headers_frame( self.example_request_headers ) c.receive_data(f.serialize()) with pytest.raises(h2.exceptions.ProtocolError): c.push_stream( stream_id=1, promised_stream_id=2, request_headers=self.example_request_headers ) def test_settings_remote_change_header_table_size(self, frame_factory): """ Acknowledging a remote HEADER_TABLE_SIZE settings change causes us to change the header table size of our encoder. """ c = h2.connection.H2Connection(config=self.server_config) c.receive_data(frame_factory.preamble()) assert c.encoder.header_table_size == 4096 received_frame = frame_factory.build_settings_frame( {h2.settings.SettingCodes.HEADER_TABLE_SIZE: 80} ) c.receive_data(received_frame.serialize())[0] assert c.encoder.header_table_size == 80 def test_settings_local_change_header_table_size(self, frame_factory): """ The remote peer acknowledging a local HEADER_TABLE_SIZE settings change does not cause us to change the header table size of our decoder. For an explanation of why this test is this way around, see issue #37. """ c = h2.connection.H2Connection(config=self.server_config) c.receive_data(frame_factory.preamble()) assert c.decoder.header_table_size == 4096 expected_frame = frame_factory.build_settings_frame({}, ack=True) c.update_settings( {h2.settings.SettingCodes.HEADER_TABLE_SIZE: 80} ) c.receive_data(expected_frame.serialize()) c.clear_outbound_data_buffer() assert c.decoder.header_table_size == 4096 def test_restricting_outbound_frame_size_by_settings(self, frame_factory): """ The remote peer can shrink the maximum outbound frame size using settings. """ c = h2.connection.H2Connection(config=self.server_config) c.initiate_connection() c.receive_data(frame_factory.preamble()) f = frame_factory.build_headers_frame(self.example_request_headers) c.receive_data(f.serialize()) c.clear_outbound_data_buffer() with pytest.raises(h2.exceptions.FrameTooLargeError): c.send_data(1, b'\x01' * 17000) received_frame = frame_factory.build_settings_frame( {h2.settings.SettingCodes.MAX_FRAME_SIZE: 17001} ) c.receive_data(received_frame.serialize()) c.send_data(1, b'\x01' * 17000) assert c.data_to_send() def test_restricting_inbound_frame_size_by_settings(self, frame_factory): """ We throw ProtocolErrors and tear down connections if oversize frames are received. """ c = h2.connection.H2Connection(config=self.server_config) c.receive_data(frame_factory.preamble()) h = frame_factory.build_headers_frame(self.example_request_headers) c.receive_data(h.serialize()) c.clear_outbound_data_buffer() data_frame = frame_factory.build_data_frame(b'\x01' * 17000) with pytest.raises(h2.exceptions.ProtocolError): c.receive_data(data_frame.serialize()) expected_frame = frame_factory.build_goaway_frame( last_stream_id=1, error_code=h2.errors.ErrorCodes.FRAME_SIZE_ERROR ) assert c.data_to_send() == expected_frame.serialize() def test_cannot_receive_new_streams_over_limit(self, frame_factory): """ When the number of inbound streams exceeds our MAX_CONCURRENT_STREAMS setting, their attempt to open new streams fails. """ c = h2.connection.H2Connection(config=self.server_config) c.receive_data(frame_factory.preamble()) c.update_settings( {h2.settings.SettingCodes.MAX_CONCURRENT_STREAMS: 1} ) f = frame_factory.build_settings_frame({}, ack=True) c.receive_data(f.serialize()) f = frame_factory.build_headers_frame( stream_id=1, headers=self.example_request_headers, ) c.receive_data(f.serialize()) c.clear_outbound_data_buffer() f = frame_factory.build_headers_frame( stream_id=3, headers=self.example_request_headers, ) with pytest.raises(h2.exceptions.TooManyStreamsError): c.receive_data(f.serialize()) expected_frame = frame_factory.build_goaway_frame( last_stream_id=1, error_code=h2.errors.ErrorCodes.PROTOCOL_ERROR, ) assert c.data_to_send() == expected_frame.serialize() def test_can_receive_trailers(self, frame_factory): """ When two HEADERS blocks are received in the same stream from a client, the second set are trailers. """ c = h2.connection.H2Connection(config=self.server_config) c.receive_data(frame_factory.preamble()) f = frame_factory.build_headers_frame(self.example_request_headers) c.receive_data(f.serialize()) # Send in trailers. trailers = [('content-length', '0')] f = frame_factory.build_headers_frame( trailers, flags=['END_STREAM'], ) events = c.receive_data(f.serialize()) assert len(events) == 2 event = events[0] assert isinstance(event, h2.events.TrailersReceived) assert event.headers == trailers assert event.stream_id == 1 def test_reject_trailers_not_ending_stream(self, frame_factory): """ When trailers are received without the END_STREAM flag being present, this is a ProtocolError. """ c = h2.connection.H2Connection(config=self.server_config) c.receive_data(frame_factory.preamble()) f = frame_factory.build_headers_frame(self.example_request_headers) c.receive_data(f.serialize()) # Send in trailers. c.clear_outbound_data_buffer() trailers = [('content-length', '0')] f = frame_factory.build_headers_frame( trailers, flags=[], ) with pytest.raises(h2.exceptions.ProtocolError): c.receive_data(f.serialize()) expected_frame = frame_factory.build_goaway_frame( last_stream_id=1, error_code=h2.errors.ErrorCodes.PROTOCOL_ERROR, ) assert c.data_to_send() == expected_frame.serialize() def test_can_send_trailers(self, frame_factory): """ When a second set of headers are sent, they are properly trailers. """ c = h2.connection.H2Connection(config=self.server_config) c.receive_data(frame_factory.preamble()) f = frame_factory.build_headers_frame(self.example_request_headers) c.receive_data(f.serialize()) # Send headers. c.clear_outbound_data_buffer() c.send_headers(1, self.example_response_headers) # Now send trailers. trailers = [('content-length', '0')] c.send_headers(1, trailers, end_stream=True) frame_factory.refresh_encoder() f1 = frame_factory.build_headers_frame( self.example_response_headers, ) f2 = frame_factory.build_headers_frame( trailers, flags=['END_STREAM'], ) assert c.data_to_send() == f1.serialize() + f2.serialize() def test_trailers_must_have_end_stream(self, frame_factory): """ A set of trailers must carry the END_STREAM flag. """ c = h2.connection.H2Connection(config=self.server_config) c.receive_data(frame_factory.preamble()) f = frame_factory.build_headers_frame(self.example_request_headers) c.receive_data(f.serialize()) # Send headers. c.send_headers(1, self.example_response_headers) # Now send trailers. trailers = [('content-length', '0')] with pytest.raises(h2.exceptions.ProtocolError): c.send_headers(1, trailers) @pytest.mark.parametrize("frame_id", range(12, 256)) def test_unknown_frames_are_ignored(self, frame_factory, frame_id): c = h2.connection.H2Connection(config=self.server_config) c.receive_data(frame_factory.preamble()) c.clear_outbound_data_buffer() f = frame_factory.build_data_frame(data=b'abcdefghtdst') f.type = frame_id events = c.receive_data(f.serialize()) assert not c.data_to_send() assert len(events) == 1 assert isinstance(events[0], h2.events.UnknownFrameReceived) assert isinstance(events[0].frame, hyperframe.frame.ExtensionFrame) def test_can_send_goaway_repeatedly(self, frame_factory): """ We can send a GOAWAY frame as many times as we like. """ c = h2.connection.H2Connection(config=self.server_config) c.receive_data(frame_factory.preamble()) c.clear_outbound_data_buffer() c.close_connection() c.close_connection() c.close_connection() f = frame_factory.build_goaway_frame(last_stream_id=0) assert c.data_to_send() == (f.serialize() * 3) def test_receiving_goaway_frame(self, frame_factory): """ Receiving a GOAWAY frame causes a ConnectionTerminated event to be fired and transitions the connection to the CLOSED state, and clears the outbound data buffer. """ c = h2.connection.H2Connection(config=self.server_config) c.initiate_connection() c.receive_data(frame_factory.preamble()) f = frame_factory.build_goaway_frame( last_stream_id=5, error_code=h2.errors.ErrorCodes.SETTINGS_TIMEOUT ) events = c.receive_data(f.serialize()) assert len(events) == 1 event = events[0] assert isinstance(event, h2.events.ConnectionTerminated) assert event.error_code == h2.errors.ErrorCodes.SETTINGS_TIMEOUT assert isinstance(event.error_code, h2.errors.ErrorCodes) assert event.last_stream_id == 5 assert event.additional_data is None assert c.state_machine.state == h2.connection.ConnectionState.CLOSED assert not c.data_to_send() def test_receiving_multiple_goaway_frames(self, frame_factory): """ Multiple GOAWAY frames can be received at once, and are allowed. Each one fires a ConnectionTerminated event. """ c = h2.connection.H2Connection(config=self.server_config) c.receive_data(frame_factory.preamble()) c.clear_outbound_data_buffer() f = frame_factory.build_goaway_frame(last_stream_id=0) events = c.receive_data(f.serialize() * 3) assert len(events) == 3 assert all( isinstance(event, h2.events.ConnectionTerminated) for event in events ) def test_receiving_goaway_frame_with_additional_data(self, frame_factory): """ GOAWAY frame can contain additional data, it should be available via ConnectionTerminated event. """ c = h2.connection.H2Connection(config=self.server_config) c.initiate_connection() c.receive_data(frame_factory.preamble()) additional_data = b'debug data' f = frame_factory.build_goaway_frame(last_stream_id=0, additional_data=additional_data) events = c.receive_data(f.serialize()) assert len(events) == 1 event = events[0] assert isinstance(event, h2.events.ConnectionTerminated) assert event.additional_data == additional_data def test_receiving_goaway_frame_with_unknown_error(self, frame_factory): """ Receiving a GOAWAY frame with an unknown error code behaves exactly the same as receiving one we know about, but the code is reported as an integer instead of as an ErrorCodes. """ c = h2.connection.H2Connection(config=self.server_config) c.initiate_connection() c.receive_data(frame_factory.preamble()) f = frame_factory.build_goaway_frame( last_stream_id=5, error_code=0xFA ) events = c.receive_data(f.serialize()) assert len(events) == 1 event = events[0] assert isinstance(event, h2.events.ConnectionTerminated) assert event.error_code == 250 assert not isinstance(event.error_code, h2.errors.ErrorCodes) assert event.last_stream_id == 5 assert event.additional_data is None assert c.state_machine.state == h2.connection.ConnectionState.CLOSED assert not c.data_to_send() def test_cookies_are_joined(self, frame_factory): """ RFC 7540 Section 8.1.2.5 requires that we join multiple Cookie headers in a header block together. """ # This is a moderately varied set of cookie headers: some combined, # some split. cookie_headers = [ ('cookie', 'username=John Doe; expires=Thu, 18 Dec 2013 12:00:00 UTC'), ('cookie', 'path=1'), ('cookie', 'test1=val1; test2=val2') ] expected = ( 'username=John Doe; expires=Thu, 18 Dec 2013 12:00:00 UTC; ' 'path=1; test1=val1; test2=val2' ) c = h2.connection.H2Connection(config=self.server_config) c.initiate_connection() c.receive_data(frame_factory.preamble()) f = frame_factory.build_headers_frame( self.example_request_headers + cookie_headers ) events = c.receive_data(f.serialize()) assert len(events) == 1 e = events[0] cookie_fields = [(n, v) for n, v in e.headers if n == 'cookie'] assert len(cookie_fields) == 1 _, v = cookie_fields[0] assert v == expected def test_cookies_arent_joined_without_normalization(self, frame_factory): """ If inbound header normalization is disabled, cookie headers aren't joined. """ # This is a moderately varied set of cookie headers: some combined, # some split. cookie_headers = [ ('cookie', 'username=John Doe; expires=Thu, 18 Dec 2013 12:00:00 UTC'), ('cookie', 'path=1'), ('cookie', 'test1=val1; test2=val2') ] config = h2.config.H2Configuration( client_side=False, normalize_inbound_headers=False, header_encoding='utf-8' ) c = h2.connection.H2Connection(config=config) c.initiate_connection() c.receive_data(frame_factory.preamble()) f = frame_factory.build_headers_frame( self.example_request_headers + cookie_headers ) events = c.receive_data(f.serialize()) assert len(events) == 1 e = events[0] received_cookies = [(n, v) for n, v in e.headers if n == 'cookie'] assert len(received_cookies) == 3 assert cookie_headers == received_cookies def test_stream_repr(self): """ Ensure stream string representation is appropriate. """ s = h2.stream.H2Stream(4, None, 12, 14) assert repr(s) == ">" def sanity_check_data_frame(data_frame, expected_flow_controlled_length, expect_padded_flag, expected_data_frame_pad_length): """ ``data_frame`` is a frame of type ``hyperframe.frame.DataFrame``, and the ``flags`` and ``flow_controlled_length`` of ``data_frame`` match expectations. """ assert isinstance(data_frame, hyperframe.frame.DataFrame) assert data_frame.flow_controlled_length == expected_flow_controlled_length if expect_padded_flag: assert 'PADDED' in data_frame.flags else: assert 'PADDED' not in data_frame.flags assert data_frame.pad_length == expected_data_frame_pad_length h2-3.1.1/test/test_closed_streams.py0000664000175000017500000003657113521033071020323 0ustar ubuntuubuntu00000000000000# -*- coding: utf-8 -*- """ test_closed_streams ~~~~~~~~~~~~~~~~~~~ Tests that we handle closed streams correctly. """ import pytest import h2.config import h2.connection import h2.errors import h2.events import h2.exceptions class TestClosedStreams(object): example_request_headers = [ (':authority', 'example.com'), (':path', '/'), (':scheme', 'https'), (':method', 'GET'), ] example_response_headers = [ (':status', '200'), ('server', 'fake-serv/0.1.0') ] server_config = h2.config.H2Configuration(client_side=False) def test_can_receive_multiple_rst_stream_frames(self, frame_factory): """ Multiple RST_STREAM frames can be received, either at once or well after one another. Only the first fires an event. """ c = h2.connection.H2Connection() c.initiate_connection() c.send_headers(1, self.example_request_headers, end_stream=True) f = frame_factory.build_rst_stream_frame(stream_id=1) events = c.receive_data(f.serialize() * 3) # Force an iteration over all the streams to remove them. c.open_outbound_streams # Receive more data. events += c.receive_data(f.serialize() * 3) assert len(events) == 1 event = events[0] assert isinstance(event, h2.events.StreamReset) def test_receiving_low_stream_id_causes_goaway(self, frame_factory): """ The remote peer creating a stream with a lower ID than one we've seen causes a GOAWAY frame. """ c = h2.connection.H2Connection(config=self.server_config) c.receive_data(frame_factory.preamble()) c.initiate_connection() f = frame_factory.build_headers_frame( self.example_request_headers, stream_id=3, ) c.receive_data(f.serialize()) c.clear_outbound_data_buffer() f = frame_factory.build_headers_frame( self.example_request_headers, stream_id=1, ) with pytest.raises(h2.exceptions.StreamIDTooLowError) as e: c.receive_data(f.serialize()) assert e.value.stream_id == 1 assert e.value.max_stream_id == 3 f = frame_factory.build_goaway_frame( last_stream_id=3, error_code=h2.errors.ErrorCodes.PROTOCOL_ERROR, ) assert c.data_to_send() == f.serialize() def test_closed_stream_not_present_in_streams_dict(self, frame_factory): """ When streams have been closed, they get removed from the streams dictionary the next time we count the open streams. """ c = h2.connection.H2Connection(config=self.server_config) c.receive_data(frame_factory.preamble()) c.initiate_connection() f = frame_factory.build_headers_frame(self.example_request_headers) c.receive_data(f.serialize()) c.push_stream(1, 2, self.example_request_headers) c.reset_stream(1) c.clear_outbound_data_buffer() f = frame_factory.build_rst_stream_frame(stream_id=2) c.receive_data(f.serialize()) # Force a count of the streams. assert not c.open_outbound_streams # The streams dictionary should be empty. assert not c.streams def test_receive_rst_stream_on_closed_stream(self, frame_factory): """ RST_STREAM frame should be ignored if stream is in a closed state. See RFC 7540 Section 5.1 (closed state) """ c = h2.connection.H2Connection() c.initiate_connection() # Client sends request c.send_headers(1, self.example_request_headers) # Some time passes and client sends DATA frame and closes stream, # so it is in a half-closed state c.send_data(1, b'some data', end_stream=True) # Server received HEADERS frame but DATA frame is still on the way. # Stream is in open state on the server-side. In this state server is # allowed to end stream and reset it - this trick helps immediately # close stream on the server-side. headers_frame = frame_factory.build_headers_frame( [(':status', '200')], flags=['END_STREAM'], stream_id=1, ) events = c.receive_data(headers_frame.serialize()) assert len(events) == 2 response_received, stream_ended = events assert isinstance(response_received, h2.events.ResponseReceived) assert isinstance(stream_ended, h2.events.StreamEnded) rst_stream_frame = frame_factory.build_rst_stream_frame(stream_id=1) events = c.receive_data(rst_stream_frame.serialize()) assert not events def test_receive_window_update_on_closed_stream(self, frame_factory): """ WINDOW_UPDATE frame should be ignored if stream is in a closed state. See RFC 7540 Section 5.1 (closed state) """ c = h2.connection.H2Connection() c.initiate_connection() # Client sends request c.send_headers(1, self.example_request_headers) # Some time passes and client sends DATA frame and closes stream, # so it is in a half-closed state c.send_data(1, b'some data', end_stream=True) # Server received HEADERS frame but DATA frame is still on the way. # Stream is in open state on the server-side. In this state server is # allowed to end stream and after that acknowledge received data by # sending WINDOW_UPDATE frames. headers_frame = frame_factory.build_headers_frame( [(':status', '200')], flags=['END_STREAM'], stream_id=1, ) events = c.receive_data(headers_frame.serialize()) assert len(events) == 2 response_received, stream_ended = events assert isinstance(response_received, h2.events.ResponseReceived) assert isinstance(stream_ended, h2.events.StreamEnded) window_update_frame = frame_factory.build_window_update_frame( stream_id=1, increment=1, ) events = c.receive_data(window_update_frame.serialize()) assert not events class TestStreamsClosedByEndStream(object): example_request_headers = [ (':authority', 'example.com'), (':path', '/'), (':scheme', 'https'), (':method', 'GET'), ] example_response_headers = [ (':status', '200'), ('server', 'fake-serv/0.1.0') ] server_config = h2.config.H2Configuration(client_side=False) @pytest.mark.parametrize( "frame", [ lambda self, ff: ff.build_data_frame(b'hello'), lambda self, ff: ff.build_headers_frame( self.example_request_headers, flags=['END_STREAM']), lambda self, ff: ff.build_headers_frame( self.example_request_headers), ] ) @pytest.mark.parametrize("clear_streams", [True, False]) def test_frames_after_recv_end_will_error(self, frame_factory, frame, clear_streams): """ A stream that is closed by receiving END_STREAM raises ProtocolError when it receives an unexpected frame. """ c = h2.connection.H2Connection(config=self.server_config) c.receive_data(frame_factory.preamble()) c.initiate_connection() f = frame_factory.build_headers_frame( self.example_request_headers, flags=['END_STREAM'] ) c.receive_data(f.serialize()) c.send_headers( stream_id=1, headers=self.example_response_headers, end_stream=True ) if clear_streams: # Call open_inbound_streams to force the connection to clean # closed streams. c.open_inbound_streams c.clear_outbound_data_buffer() f = frame(self, frame_factory) with pytest.raises(h2.exceptions.ProtocolError): c.receive_data(f.serialize()) f = frame_factory.build_goaway_frame( last_stream_id=1, error_code=h2.errors.ErrorCodes.STREAM_CLOSED, ) assert c.data_to_send() == f.serialize() @pytest.mark.parametrize( "frame", [ lambda self, ff: ff.build_data_frame(b'hello'), lambda self, ff: ff.build_headers_frame( self.example_response_headers, flags=['END_STREAM']), lambda self, ff: ff.build_headers_frame( self.example_response_headers), ] ) @pytest.mark.parametrize("clear_streams", [True, False]) def test_frames_after_send_end_will_error(self, frame_factory, frame, clear_streams): """ A stream that is closed by sending END_STREAM raises ProtocolError when it receives an unexpected frame. """ c = h2.connection.H2Connection() c.initiate_connection() c.send_headers(stream_id=1, headers=self.example_request_headers, end_stream=True) f = frame_factory.build_headers_frame( self.example_response_headers, flags=['END_STREAM'] ) c.receive_data(f.serialize()) if clear_streams: # Call open_outbound_streams to force the connection to clean # closed streams. c.open_outbound_streams c.clear_outbound_data_buffer() f = frame(self, frame_factory) with pytest.raises(h2.exceptions.ProtocolError): c.receive_data(f.serialize()) f = frame_factory.build_goaway_frame( last_stream_id=0, error_code=h2.errors.ErrorCodes.STREAM_CLOSED, ) assert c.data_to_send() == f.serialize() @pytest.mark.parametrize( "frame", [ lambda self, ff: ff.build_window_update_frame(1, 1), lambda self, ff: ff.build_rst_stream_frame(1) ] ) def test_frames_after_send_end_will_be_ignored(self, frame_factory, frame): """ A stream that is closed by sending END_STREAM will raise ProtocolError when received unexpected frame. """ c = h2.connection.H2Connection(config=self.server_config) c.receive_data(frame_factory.preamble()) c.initiate_connection() f = frame_factory.build_headers_frame( self.example_request_headers, flags=['END_STREAM'] ) c.receive_data(f.serialize()) c.send_headers( stream_id=1, headers=self.example_response_headers, end_stream=True ) c.clear_outbound_data_buffer() f = frame(self, frame_factory) events = c.receive_data(f.serialize()) assert not events class TestStreamsClosedByRstStream(object): example_request_headers = [ (':authority', 'example.com'), (':path', '/'), (':scheme', 'https'), (':method', 'GET'), ] example_response_headers = [ (':status', '200'), ('server', 'fake-serv/0.1.0') ] server_config = h2.config.H2Configuration(client_side=False) @pytest.mark.parametrize( "frame", [ lambda self, ff: ff.build_headers_frame( self.example_request_headers), lambda self, ff: ff.build_headers_frame( self.example_request_headers, flags=['END_STREAM']), lambda self, ff: ff.build_data_frame(b'hello'), ] ) def test_resets_further_frames_after_recv_reset(self, frame_factory, frame): """ A stream that is closed by receive RST_STREAM can receive further frames: it simply sends RST_STREAM for it. """ c = h2.connection.H2Connection(config=self.server_config) c.receive_data(frame_factory.preamble()) c.initiate_connection() header_frame = frame_factory.build_headers_frame( self.example_request_headers, flags=['END_STREAM'] ) c.receive_data(header_frame.serialize()) c.send_headers( stream_id=1, headers=self.example_response_headers, end_stream=False ) rst_frame = frame_factory.build_rst_stream_frame( 1, h2.errors.ErrorCodes.STREAM_CLOSED ) c.receive_data(rst_frame.serialize()) c.clear_outbound_data_buffer() f = frame(self, frame_factory) events = c.receive_data(f.serialize()) rst_frame = frame_factory.build_rst_stream_frame( 1, h2.errors.ErrorCodes.STREAM_CLOSED ) assert not events assert c.data_to_send() == rst_frame.serialize() events = c.receive_data(f.serialize() * 3) assert not events assert c.data_to_send() == rst_frame.serialize() * 3 # Iterate over the streams to make sure it's gone, then confirm the # behaviour is unchanged. c.open_outbound_streams events = c.receive_data(f.serialize() * 3) assert not events assert c.data_to_send() == rst_frame.serialize() * 3 @pytest.mark.parametrize( "frame", [ lambda self, ff: ff.build_headers_frame( self.example_request_headers), lambda self, ff: ff.build_headers_frame( self.example_request_headers, flags=['END_STREAM']), lambda self, ff: ff.build_data_frame(b'hello'), ] ) def test_resets_further_frames_after_send_reset(self, frame_factory, frame): """ A stream that is closed by sent RST_STREAM can receive further frames: it simply sends RST_STREAM for it. """ c = h2.connection.H2Connection(config=self.server_config) c.receive_data(frame_factory.preamble()) c.initiate_connection() header_frame = frame_factory.build_headers_frame( self.example_request_headers, flags=['END_STREAM'] ) c.receive_data(header_frame.serialize()) c.send_headers( stream_id=1, headers=self.example_response_headers, end_stream=False ) c.reset_stream(1, h2.errors.ErrorCodes.INTERNAL_ERROR) rst_frame = frame_factory.build_rst_stream_frame( 1, h2.errors.ErrorCodes.STREAM_CLOSED ) c.clear_outbound_data_buffer() f = frame(self, frame_factory) events = c.receive_data(f.serialize()) rst_frame = frame_factory.build_rst_stream_frame( 1, h2.errors.ErrorCodes.STREAM_CLOSED ) assert not events assert c.data_to_send() == rst_frame.serialize() events = c.receive_data(f.serialize() * 3) assert not events assert c.data_to_send() == rst_frame.serialize() * 3 # Iterate over the streams to make sure it's gone, then confirm the # behaviour is unchanged. c.open_outbound_streams events = c.receive_data(f.serialize() * 3) assert not events assert c.data_to_send() == rst_frame.serialize() * 3 h2-3.1.1/test/test_complex_logic.py0000664000175000017500000005165413421652727020155 0ustar ubuntuubuntu00000000000000# -*- coding: utf-8 -*- """ test_complex_logic ~~~~~~~~~~~~~~~~ More complex tests that try to do more. Certain tests don't really eliminate incorrect behaviour unless they do quite a bit. These tests should live here, to keep the pain in once place rather than hide it in the other parts of the test suite. """ import pytest import h2 import h2.config import h2.connection class TestComplexClient(object): """ Complex tests for client-side stacks. """ example_request_headers = [ (':authority', 'example.com'), (':path', '/'), (':scheme', 'https'), (':method', 'GET'), ] example_response_headers = [ (':status', '200'), ('server', 'fake-serv/0.1.0') ] def test_correctly_count_server_streams(self, frame_factory): """ We correctly count the number of server streams, both inbound and outbound. """ # This test makes no sense unless you do both inbound and outbound, # because it's important to confirm that we count them correctly. c = h2.connection.H2Connection() c.initiate_connection() expected_inbound_streams = expected_outbound_streams = 0 assert c.open_inbound_streams == expected_inbound_streams assert c.open_outbound_streams == expected_outbound_streams for stream_id in range(1, 15, 2): # Open an outbound stream c.send_headers(stream_id, self.example_request_headers) expected_outbound_streams += 1 assert c.open_inbound_streams == expected_inbound_streams assert c.open_outbound_streams == expected_outbound_streams # Receive a pushed stream (to create an inbound one). This doesn't # open until we also receive headers. f = frame_factory.build_push_promise_frame( stream_id=stream_id, promised_stream_id=stream_id+1, headers=self.example_request_headers, ) c.receive_data(f.serialize()) assert c.open_inbound_streams == expected_inbound_streams assert c.open_outbound_streams == expected_outbound_streams f = frame_factory.build_headers_frame( stream_id=stream_id+1, headers=self.example_response_headers, ) c.receive_data(f.serialize()) expected_inbound_streams += 1 assert c.open_inbound_streams == expected_inbound_streams assert c.open_outbound_streams == expected_outbound_streams for stream_id in range(13, 0, -2): # Close an outbound stream. c.end_stream(stream_id) # Stream doesn't close until both sides close it. assert c.open_inbound_streams == expected_inbound_streams assert c.open_outbound_streams == expected_outbound_streams f = frame_factory.build_headers_frame( stream_id=stream_id, headers=self.example_response_headers, flags=['END_STREAM'], ) c.receive_data(f.serialize()) expected_outbound_streams -= 1 assert c.open_inbound_streams == expected_inbound_streams assert c.open_outbound_streams == expected_outbound_streams # Pushed streams can only be closed remotely. f = frame_factory.build_data_frame( stream_id=stream_id+1, data=b'the content', flags=['END_STREAM'], ) c.receive_data(f.serialize()) expected_inbound_streams -= 1 assert c.open_inbound_streams == expected_inbound_streams assert c.open_outbound_streams == expected_outbound_streams assert c.open_inbound_streams == 0 assert c.open_outbound_streams == 0 class TestComplexServer(object): """ Complex tests for server-side stacks. """ example_request_headers = [ (b':authority', b'example.com'), (b':path', b'/'), (b':scheme', b'https'), (b':method', b'GET'), ] example_response_headers = [ (b':status', b'200'), (b'server', b'fake-serv/0.1.0') ] server_config = h2.config.H2Configuration(client_side=False) def test_correctly_count_server_streams(self, frame_factory): """ We correctly count the number of server streams, both inbound and outbound. """ # This test makes no sense unless you do both inbound and outbound, # because it's important to confirm that we count them correctly. c = h2.connection.H2Connection(config=self.server_config) c.receive_data(frame_factory.preamble()) expected_inbound_streams = expected_outbound_streams = 0 assert c.open_inbound_streams == expected_inbound_streams assert c.open_outbound_streams == expected_outbound_streams for stream_id in range(1, 15, 2): # Receive an inbound stream. f = frame_factory.build_headers_frame( headers=self.example_request_headers, stream_id=stream_id, ) c.receive_data(f.serialize()) expected_inbound_streams += 1 assert c.open_inbound_streams == expected_inbound_streams assert c.open_outbound_streams == expected_outbound_streams # Push a stream (to create a outbound one). This doesn't open # until we send our response headers. c.push_stream(stream_id, stream_id+1, self.example_request_headers) assert c.open_inbound_streams == expected_inbound_streams assert c.open_outbound_streams == expected_outbound_streams c.send_headers(stream_id+1, self.example_response_headers) expected_outbound_streams += 1 assert c.open_inbound_streams == expected_inbound_streams assert c.open_outbound_streams == expected_outbound_streams for stream_id in range(13, 0, -2): # Close an inbound stream. f = frame_factory.build_data_frame( data=b'', flags=['END_STREAM'], stream_id=stream_id, ) c.receive_data(f.serialize()) # Stream doesn't close until both sides close it. assert c.open_inbound_streams == expected_inbound_streams assert c.open_outbound_streams == expected_outbound_streams c.send_data(stream_id, b'', end_stream=True) expected_inbound_streams -= 1 assert c.open_inbound_streams == expected_inbound_streams assert c.open_outbound_streams == expected_outbound_streams # Pushed streams, however, we can close ourselves. c.send_data( stream_id=stream_id+1, data=b'', end_stream=True, ) expected_outbound_streams -= 1 assert c.open_inbound_streams == expected_inbound_streams assert c.open_outbound_streams == expected_outbound_streams assert c.open_inbound_streams == 0 assert c.open_outbound_streams == 0 class TestContinuationFrames(object): """ Tests for the relatively complex CONTINUATION frame logic. """ example_request_headers = [ (b':authority', b'example.com'), (b':path', b'/'), (b':scheme', b'https'), (b':method', b'GET'), ] server_config = h2.config.H2Configuration(client_side=False) def _build_continuation_sequence(self, headers, block_size, frame_factory): f = frame_factory.build_headers_frame(headers) header_data = f.data chunks = [ header_data[x:x+block_size] for x in range(0, len(header_data), block_size) ] f.data = chunks.pop(0) frames = [ frame_factory.build_continuation_frame(c) for c in chunks ] f.flags = {'END_STREAM'} frames[-1].flags.add('END_HEADERS') frames.insert(0, f) return frames def test_continuation_frame_basic(self, frame_factory): """ Test that we correctly decode a header block split across continuation frames. """ c = h2.connection.H2Connection(config=self.server_config) c.initiate_connection() c.receive_data(frame_factory.preamble()) frames = self._build_continuation_sequence( headers=self.example_request_headers, block_size=5, frame_factory=frame_factory, ) data = b''.join(f.serialize() for f in frames) events = c.receive_data(data) assert len(events) == 2 first_event, second_event = events assert isinstance(first_event, h2.events.RequestReceived) assert first_event.headers == self.example_request_headers assert first_event.stream_id == 1 assert isinstance(second_event, h2.events.StreamEnded) assert second_event.stream_id == 1 @pytest.mark.parametrize('stream_id', [3, 1]) def test_continuation_cannot_interleave_headers(self, frame_factory, stream_id): """ We cannot interleave a new headers block with a CONTINUATION sequence. """ c = h2.connection.H2Connection(config=self.server_config) c.initiate_connection() c.receive_data(frame_factory.preamble()) c.clear_outbound_data_buffer() frames = self._build_continuation_sequence( headers=self.example_request_headers, block_size=5, frame_factory=frame_factory, ) assert len(frames) > 2 # This is mostly defensive. bogus_frame = frame_factory.build_headers_frame( headers=self.example_request_headers, stream_id=stream_id, flags=['END_STREAM'], ) frames.insert(len(frames) - 2, bogus_frame) data = b''.join(f.serialize() for f in frames) with pytest.raises(h2.exceptions.ProtocolError) as e: c.receive_data(data) assert "invalid frame" in str(e.value).lower() def test_continuation_cannot_interleave_data(self, frame_factory): """ We cannot interleave a data frame with a CONTINUATION sequence. """ c = h2.connection.H2Connection(config=self.server_config) c.initiate_connection() c.receive_data(frame_factory.preamble()) c.clear_outbound_data_buffer() frames = self._build_continuation_sequence( headers=self.example_request_headers, block_size=5, frame_factory=frame_factory, ) assert len(frames) > 2 # This is mostly defensive. bogus_frame = frame_factory.build_data_frame( data=b'hello', stream_id=1, ) frames.insert(len(frames) - 2, bogus_frame) data = b''.join(f.serialize() for f in frames) with pytest.raises(h2.exceptions.ProtocolError) as e: c.receive_data(data) assert "invalid frame" in str(e.value).lower() def test_continuation_cannot_interleave_unknown_frame(self, frame_factory): """ We cannot interleave an unknown frame with a CONTINUATION sequence. """ c = h2.connection.H2Connection(config=self.server_config) c.initiate_connection() c.receive_data(frame_factory.preamble()) c.clear_outbound_data_buffer() frames = self._build_continuation_sequence( headers=self.example_request_headers, block_size=5, frame_factory=frame_factory, ) assert len(frames) > 2 # This is mostly defensive. bogus_frame = frame_factory.build_data_frame( data=b'hello', stream_id=1, ) bogus_frame.type = 88 frames.insert(len(frames) - 2, bogus_frame) data = b''.join(f.serialize() for f in frames) with pytest.raises(h2.exceptions.ProtocolError) as e: c.receive_data(data) assert "invalid frame" in str(e.value).lower() def test_continuation_frame_multiple_blocks(self, frame_factory): """ Test that we correctly decode several header blocks split across continuation frames. """ c = h2.connection.H2Connection(config=self.server_config) c.initiate_connection() c.receive_data(frame_factory.preamble()) for stream_id in range(1, 7, 2): frames = self._build_continuation_sequence( headers=self.example_request_headers, block_size=2, frame_factory=frame_factory, ) for frame in frames: frame.stream_id = stream_id data = b''.join(f.serialize() for f in frames) events = c.receive_data(data) assert len(events) == 2 first_event, second_event = events assert isinstance(first_event, h2.events.RequestReceived) assert first_event.headers == self.example_request_headers assert first_event.stream_id == stream_id assert isinstance(second_event, h2.events.StreamEnded) assert second_event.stream_id == stream_id class TestContinuationFramesPushPromise(object): """ Tests for the relatively complex CONTINUATION frame logic working with PUSH_PROMISE frames. """ example_request_headers = [ (b':authority', b'example.com'), (b':path', b'/'), (b':scheme', b'https'), (b':method', b'GET'), ] example_response_headers = [ (b':status', b'200'), (b'server', b'fake-serv/0.1.0') ] def _build_continuation_sequence(self, headers, block_size, frame_factory): f = frame_factory.build_push_promise_frame( stream_id=1, promised_stream_id=2, headers=headers ) header_data = f.data chunks = [ header_data[x:x+block_size] for x in range(0, len(header_data), block_size) ] f.data = chunks.pop(0) frames = [ frame_factory.build_continuation_frame(c) for c in chunks ] f.flags = {'END_STREAM'} frames[-1].flags.add('END_HEADERS') frames.insert(0, f) return frames def test_continuation_frame_basic_push_promise(self, frame_factory): """ Test that we correctly decode a header block split across continuation frames when that header block is initiated with a PUSH_PROMISE. """ c = h2.connection.H2Connection() c.initiate_connection() c.send_headers(stream_id=1, headers=self.example_request_headers) frames = self._build_continuation_sequence( headers=self.example_request_headers, block_size=5, frame_factory=frame_factory, ) data = b''.join(f.serialize() for f in frames) events = c.receive_data(data) assert len(events) == 1 event = events[0] assert isinstance(event, h2.events.PushedStreamReceived) assert event.headers == self.example_request_headers assert event.parent_stream_id == 1 assert event.pushed_stream_id == 2 @pytest.mark.parametrize('stream_id', [3, 1, 2]) def test_continuation_cannot_interleave_headers_pp(self, frame_factory, stream_id): """ We cannot interleave a new headers block with a CONTINUATION sequence when the headers block is based on a PUSH_PROMISE frame. """ c = h2.connection.H2Connection() c.initiate_connection() c.send_headers(stream_id=1, headers=self.example_request_headers) frames = self._build_continuation_sequence( headers=self.example_request_headers, block_size=5, frame_factory=frame_factory, ) assert len(frames) > 2 # This is mostly defensive. bogus_frame = frame_factory.build_headers_frame( headers=self.example_response_headers, stream_id=stream_id, flags=['END_STREAM'], ) frames.insert(len(frames) - 2, bogus_frame) data = b''.join(f.serialize() for f in frames) with pytest.raises(h2.exceptions.ProtocolError) as e: c.receive_data(data) assert "invalid frame" in str(e.value).lower() def test_continuation_cannot_interleave_data(self, frame_factory): """ We cannot interleave a data frame with a CONTINUATION sequence when that sequence began with a PUSH_PROMISE frame. """ c = h2.connection.H2Connection() c.initiate_connection() c.send_headers(stream_id=1, headers=self.example_request_headers) frames = self._build_continuation_sequence( headers=self.example_request_headers, block_size=5, frame_factory=frame_factory, ) assert len(frames) > 2 # This is mostly defensive. bogus_frame = frame_factory.build_data_frame( data=b'hello', stream_id=1, ) frames.insert(len(frames) - 2, bogus_frame) data = b''.join(f.serialize() for f in frames) with pytest.raises(h2.exceptions.ProtocolError) as e: c.receive_data(data) assert "invalid frame" in str(e.value).lower() def test_continuation_cannot_interleave_unknown_frame(self, frame_factory): """ We cannot interleave an unknown frame with a CONTINUATION sequence when that sequence began with a PUSH_PROMISE frame. """ c = h2.connection.H2Connection() c.initiate_connection() c.send_headers(stream_id=1, headers=self.example_request_headers) frames = self._build_continuation_sequence( headers=self.example_request_headers, block_size=5, frame_factory=frame_factory, ) assert len(frames) > 2 # This is mostly defensive. bogus_frame = frame_factory.build_data_frame( data=b'hello', stream_id=1, ) bogus_frame.type = 88 frames.insert(len(frames) - 2, bogus_frame) data = b''.join(f.serialize() for f in frames) with pytest.raises(h2.exceptions.ProtocolError) as e: c.receive_data(data) assert "invalid frame" in str(e.value).lower() @pytest.mark.parametrize('evict', [True, False]) def test_stream_remotely_closed_disallows_push_promise(self, evict, frame_factory): """ Streams closed normally by the remote peer disallow PUSH_PROMISE frames, and cause a GOAWAY. """ c = h2.connection.H2Connection() c.initiate_connection() c.send_headers( stream_id=1, headers=self.example_request_headers, end_stream=True ) f = frame_factory.build_headers_frame( stream_id=1, headers=self.example_response_headers, flags=['END_STREAM'] ) c.receive_data(f.serialize()) c.clear_outbound_data_buffer() if evict: # This is annoyingly stateful, but enumerating the list of open # streams will force us to flush state. assert not c.open_outbound_streams f = frame_factory.build_push_promise_frame( stream_id=1, promised_stream_id=2, headers=self.example_request_headers, ) with pytest.raises(h2.exceptions.ProtocolError): c.receive_data(f.serialize()) f = frame_factory.build_goaway_frame( last_stream_id=0, error_code=h2.errors.ErrorCodes.PROTOCOL_ERROR, ) assert c.data_to_send() == f.serialize() def test_continuation_frame_multiple_push_promise(self, frame_factory): """ Test that we correctly decode header blocks split across continuation frames when those header block is initiated with a PUSH_PROMISE, for more than one pushed stream. """ c = h2.connection.H2Connection() c.initiate_connection() c.send_headers(stream_id=1, headers=self.example_request_headers) for promised_stream_id in range(2, 8, 2): frames = self._build_continuation_sequence( headers=self.example_request_headers, block_size=2, frame_factory=frame_factory, ) frames[0].promised_stream_id = promised_stream_id data = b''.join(f.serialize() for f in frames) events = c.receive_data(data) assert len(events) == 1 event = events[0] assert isinstance(event, h2.events.PushedStreamReceived) assert event.headers == self.example_request_headers assert event.parent_stream_id == 1 assert event.pushed_stream_id == promised_stream_id h2-3.1.1/test/test_config.py0000664000175000017500000001110013421652727016554 0ustar ubuntuubuntu00000000000000# -*- coding: utf-8 -*- """ test_config ~~~~~~~~~~~ Test the configuration object. """ import logging import pytest import h2.config class TestH2Config(object): """ Tests of the H2 config object. """ def test_defaults(self): """ The default values of the HTTP/2 config object are sensible. """ config = h2.config.H2Configuration() assert config.client_side assert config.header_encoding is None assert isinstance(config.logger, h2.config.DummyLogger) boolean_config_options = [ 'client_side', 'validate_outbound_headers', 'normalize_outbound_headers', 'validate_inbound_headers', 'normalize_inbound_headers', ] @pytest.mark.parametrize('option_name', boolean_config_options) @pytest.mark.parametrize('value', [None, 'False', 1]) def test_boolean_config_options_reject_non_bools_init( self, option_name, value ): """ The boolean config options raise an error if you try to set a value that isn't a boolean via the initializer. """ with pytest.raises(ValueError): h2.config.H2Configuration(**{option_name: value}) @pytest.mark.parametrize('option_name', boolean_config_options) @pytest.mark.parametrize('value', [None, 'False', 1]) def test_boolean_config_options_reject_non_bools_attr( self, option_name, value ): """ The boolean config options raise an error if you try to set a value that isn't a boolean via attribute setter. """ config = h2.config.H2Configuration() with pytest.raises(ValueError): setattr(config, option_name, value) @pytest.mark.parametrize('option_name', boolean_config_options) @pytest.mark.parametrize('value', [True, False]) def test_boolean_config_option_is_reflected_init(self, option_name, value): """ The value of the boolean config options, when set, is reflected in the value via the initializer. """ config = h2.config.H2Configuration(**{option_name: value}) assert getattr(config, option_name) == value @pytest.mark.parametrize('option_name', boolean_config_options) @pytest.mark.parametrize('value', [True, False]) def test_boolean_config_option_is_reflected_attr(self, option_name, value): """ The value of the boolean config options, when set, is reflected in the value via attribute setter. """ config = h2.config.H2Configuration() setattr(config, option_name, value) assert getattr(config, option_name) == value @pytest.mark.parametrize('header_encoding', [True, 1, object()]) def test_header_encoding_must_be_false_str_none_init( self, header_encoding ): """ The value of the ``header_encoding`` setting must be False, a string, or None via the initializer. """ with pytest.raises(ValueError): h2.config.H2Configuration(header_encoding=header_encoding) @pytest.mark.parametrize('header_encoding', [True, 1, object()]) def test_header_encoding_must_be_false_str_none_attr( self, header_encoding ): """ The value of the ``header_encoding`` setting must be False, a string, or None via attribute setter. """ config = h2.config.H2Configuration() with pytest.raises(ValueError): config.header_encoding = header_encoding @pytest.mark.parametrize('header_encoding', [False, 'ascii', None]) def test_header_encoding_is_reflected_init(self, header_encoding): """ The value of ``header_encoding``, when set, is reflected in the value via the initializer. """ config = h2.config.H2Configuration(header_encoding=header_encoding) assert config.header_encoding == header_encoding @pytest.mark.parametrize('header_encoding', [False, 'ascii', None]) def test_header_encoding_is_reflected_attr(self, header_encoding): """ The value of ``header_encoding``, when set, is reflected in the value via the attribute setter. """ config = h2.config.H2Configuration() config.header_encoding = header_encoding assert config.header_encoding == header_encoding def test_logger_instance_is_reflected(self): """ The value of ``logger``, when set, is reflected in the value. """ logger = logging.Logger('hyper-h2.test') config = h2.config.H2Configuration() config.logger = logger assert config.logger is logger h2-3.1.1/test/test_events.py0000664000175000017500000002676513421652727016642 0ustar ubuntuubuntu00000000000000# -*- coding: utf-8 -*- """ test_events.py ~~~~~~~~~~~~~~ Specific tests for any function that is logically self-contained as part of events.py. """ import inspect import sys from hypothesis import given from hypothesis.strategies import ( integers, lists, tuples ) import pytest import h2.errors import h2.events import h2.settings # We define a fairly complex Hypothesis strategy here. We want to build a list # of two tuples of (Setting, value). For Setting we want to make sure we can # handle settings that the rest of hyper knows nothing about, so we want to # use integers from 0 to (2**16-1). For values, they're from 0 to (2**32-1). # Define that strategy here for clarity. SETTINGS_STRATEGY = lists( tuples( integers(min_value=0, max_value=2**16-1), integers(min_value=0, max_value=2**32-1), ) ) class TestRemoteSettingsChanged(object): """ Validate the function of the RemoteSettingsChanged event. """ @given(SETTINGS_STRATEGY) def test_building_settings_from_scratch(self, settings_list): """ Missing old settings are defaulted to None. """ settings_dict = dict(settings_list) e = h2.events.RemoteSettingsChanged.from_settings( old_settings={}, new_settings=settings_dict, ) for setting, new_value in settings_dict.items(): assert e.changed_settings[setting].setting == setting assert e.changed_settings[setting].original_value is None assert e.changed_settings[setting].new_value == new_value @given(SETTINGS_STRATEGY, SETTINGS_STRATEGY) def test_only_reports_changed_settings(self, old_settings_list, new_settings_list): """ Settings that were not changed are not reported. """ old_settings_dict = dict(old_settings_list) new_settings_dict = dict(new_settings_list) e = h2.events.RemoteSettingsChanged.from_settings( old_settings=old_settings_dict, new_settings=new_settings_dict, ) assert len(e.changed_settings) == len(new_settings_dict) assert ( sorted(list(e.changed_settings.keys())) == sorted(list(new_settings_dict.keys())) ) @given(SETTINGS_STRATEGY, SETTINGS_STRATEGY) def test_correctly_reports_changed_settings(self, old_settings_list, new_settings_list): """ Settings that are changed are correctly reported. """ old_settings_dict = dict(old_settings_list) new_settings_dict = dict(new_settings_list) e = h2.events.RemoteSettingsChanged.from_settings( old_settings=old_settings_dict, new_settings=new_settings_dict, ) for setting, new_value in new_settings_dict.items(): original_value = old_settings_dict.get(setting) assert e.changed_settings[setting].setting == setting assert e.changed_settings[setting].original_value == original_value assert e.changed_settings[setting].new_value == new_value class TestEventReprs(object): """ Events have useful representations. """ example_request_headers = [ (':authority', 'example.com'), (':path', '/'), (':scheme', 'https'), (':method', 'GET'), ] example_informational_headers = [ (':status', '100'), ('server', 'fake-serv/0.1.0') ] example_response_headers = [ (':status', '200'), ('server', 'fake-serv/0.1.0') ] def test_requestreceived_repr(self): """ RequestReceived has a useful debug representation. """ e = h2.events.RequestReceived() e.stream_id = 5 e.headers = self.example_request_headers assert repr(e) == ( "" ) def test_responsereceived_repr(self): """ ResponseReceived has a useful debug representation. """ e = h2.events.ResponseReceived() e.stream_id = 500 e.headers = self.example_response_headers assert repr(e) == ( "" ) def test_trailersreceived_repr(self): """ TrailersReceived has a useful debug representation. """ e = h2.events.TrailersReceived() e.stream_id = 62 e.headers = self.example_response_headers assert repr(e) == ( "" ) def test_informationalresponsereceived_repr(self): """ InformationalResponseReceived has a useful debug representation. """ e = h2.events.InformationalResponseReceived() e.stream_id = 62 e.headers = self.example_informational_headers assert repr(e) == ( "" ) def test_datareceived_repr(self): """ DataReceived has a useful debug representation. """ e = h2.events.DataReceived() e.stream_id = 888 e.data = b"abcdefghijklmnopqrstuvwxyz" e.flow_controlled_length = 88 assert repr(e) == ( "" ) def test_windowupdated_repr(self): """ WindowUpdated has a useful debug representation. """ e = h2.events.WindowUpdated() e.stream_id = 0 e.delta = 2**16 assert repr(e) == "" def test_remotesettingschanged_repr(self): """ RemoteSettingsChanged has a useful debug representation. """ e = h2.events.RemoteSettingsChanged() e.changed_settings = { h2.settings.SettingCodes.INITIAL_WINDOW_SIZE: h2.settings.ChangedSetting( h2.settings.SettingCodes.INITIAL_WINDOW_SIZE, 2**16, 2**15 ), } assert repr(e) == ( "" ) def test_pingreceived_repr(self): """ PingReceived has a useful debug representation. """ e = h2.events.PingReceived() e.ping_data = b'abcdefgh' assert repr(e) == "" def test_pingackreceived_repr(self): """ PingAckReceived has a useful debug representation. """ e = h2.events.PingAckReceived() e.ping_data = b'abcdefgh' assert repr(e) == "" def test_streamended_repr(self): """ StreamEnded has a useful debug representation. """ e = h2.events.StreamEnded() e.stream_id = 99 assert repr(e) == "" def test_streamreset_repr(self): """ StreamEnded has a useful debug representation. """ e = h2.events.StreamReset() e.stream_id = 919 e.error_code = h2.errors.ErrorCodes.ENHANCE_YOUR_CALM e.remote_reset = False assert repr(e) == ( "" ) def test_pushedstreamreceived_repr(self): """ PushedStreamReceived has a useful debug representation. """ e = h2.events.PushedStreamReceived() e.pushed_stream_id = 50 e.parent_stream_id = 11 e.headers = self.example_request_headers assert repr(e) == ( "" ) def test_settingsacknowledged_repr(self): """ SettingsAcknowledged has a useful debug representation. """ e = h2.events.SettingsAcknowledged() e.changed_settings = { h2.settings.SettingCodes.INITIAL_WINDOW_SIZE: h2.settings.ChangedSetting( h2.settings.SettingCodes.INITIAL_WINDOW_SIZE, 2**16, 2**15 ), } assert repr(e) == ( "" ) def test_priorityupdated_repr(self): """ PriorityUpdated has a useful debug representation. """ e = h2.events.PriorityUpdated() e.stream_id = 87 e.weight = 32 e.depends_on = 8 e.exclusive = True assert repr(e) == ( "" ) @pytest.mark.parametrize("additional_data,data_repr", [ (None, "None"), (b'some data', "736f6d652064617461") ]) def test_connectionterminated_repr(self, additional_data, data_repr): """ ConnectionTerminated has a useful debug representation. """ e = h2.events.ConnectionTerminated() e.error_code = h2.errors.ErrorCodes.INADEQUATE_SECURITY e.last_stream_id = 33 e.additional_data = additional_data assert repr(e) == ( "" % data_repr ) def test_alternativeserviceavailable_repr(self): """ AlternativeServiceAvailable has a useful debug representation. """ e = h2.events.AlternativeServiceAvailable() e.origin = b"example.com" e.field_value = b'h2=":8000"; ma=60' assert repr(e) == ( '' ) def test_unknownframereceived_repr(self): """ UnknownFrameReceived has a useful debug representation. """ e = h2.events.UnknownFrameReceived() assert repr(e) == '' def all_events(): """ Generates all the classes (i.e., events) defined in h2.events. """ for _, obj in inspect.getmembers(sys.modules['h2.events']): # We are only interested in objects that are defined in h2.events; # objects that are imported from other modules are not of interest. if hasattr(obj, '__module__') and (obj.__module__ != 'h2.events'): continue if inspect.isclass(obj): yield obj @pytest.mark.parametrize('event', all_events()) def test_all_events_subclass_from_event(event): """ Every event defined in h2.events subclasses from h2.events.Event. """ assert (event is h2.events.Event) or issubclass(event, h2.events.Event) h2-3.1.1/test/test_exceptions.py0000664000175000017500000000052213421652727017476 0ustar ubuntuubuntu00000000000000# -*- coding: utf-8 -*- """ test_exceptions ~~~~~~~~~~~~~~~ Tests that verify logic local to exceptions. """ import h2.exceptions class TestExceptions(object): def test_stream_id_too_low_prints_properly(self): x = h2.exceptions.StreamIDTooLowError(5, 10) assert "StreamIDTooLowError: 5 is lower than 10" == str(x) h2-3.1.1/test/test_flow_control_window.py0000664000175000017500000010227313421652727021421 0ustar ubuntuubuntu00000000000000# -*- coding: utf-8 -*- """ test_flow_control ~~~~~~~~~~~~~~~~~ Tests of the flow control management in h2 """ import pytest from hypothesis import given from hypothesis.strategies import integers import h2.config import h2.connection import h2.errors import h2.events import h2.exceptions import h2.settings class TestFlowControl(object): """ Tests of the flow control management in the connection objects. """ example_request_headers = [ (':authority', 'example.com'), (':path', '/'), (':scheme', 'https'), (':method', 'GET'), ] server_config = h2.config.H2Configuration(client_side=False) DEFAULT_FLOW_WINDOW = 65535 def test_flow_control_initializes_properly(self): """ The flow control window for a stream should initially be the default flow control value. """ c = h2.connection.H2Connection() c.send_headers(1, self.example_request_headers) assert c.local_flow_control_window(1) == self.DEFAULT_FLOW_WINDOW assert c.remote_flow_control_window(1) == self.DEFAULT_FLOW_WINDOW def test_flow_control_decreases_with_sent_data(self): """ When data is sent on a stream, the flow control window should drop. """ c = h2.connection.H2Connection() c.send_headers(1, self.example_request_headers) c.send_data(1, b'some data') remaining_length = self.DEFAULT_FLOW_WINDOW - len(b'some data') assert (c.local_flow_control_window(1) == remaining_length) @pytest.mark.parametrize("pad_length", [5, 0]) def test_flow_control_decreases_with_sent_data_with_padding(self, pad_length): """ When padded data is sent on a stream, the flow control window drops by the length of the padding plus 1 for the 1-byte padding length field. """ c = h2.connection.H2Connection() c.send_headers(1, self.example_request_headers) c.send_data(1, b'some data', pad_length=pad_length) remaining_length = ( self.DEFAULT_FLOW_WINDOW - len(b'some data') - pad_length - 1 ) assert c.local_flow_control_window(1) == remaining_length def test_flow_control_decreases_with_received_data(self, frame_factory): """ When data is received on a stream, the remote flow control window should drop. """ c = h2.connection.H2Connection(config=self.server_config) c.receive_data(frame_factory.preamble()) f1 = frame_factory.build_headers_frame(self.example_request_headers) f2 = frame_factory.build_data_frame(b'some data') c.receive_data(f1.serialize() + f2.serialize()) remaining_length = self.DEFAULT_FLOW_WINDOW - len(b'some data') assert (c.remote_flow_control_window(1) == remaining_length) def test_flow_control_decreases_with_padded_data(self, frame_factory): """ When padded data is received on a stream, the remote flow control window drops by an amount that includes the padding. """ c = h2.connection.H2Connection(config=self.server_config) c.receive_data(frame_factory.preamble()) f1 = frame_factory.build_headers_frame(self.example_request_headers) f2 = frame_factory.build_data_frame(b'some data', padding_len=10) c.receive_data(f1.serialize() + f2.serialize()) remaining_length = ( self.DEFAULT_FLOW_WINDOW - len(b'some data') - 10 - 1 ) assert (c.remote_flow_control_window(1) == remaining_length) def test_flow_control_is_limited_by_connection(self): """ The flow control window is limited by the flow control of the connection. """ c = h2.connection.H2Connection() c.send_headers(1, self.example_request_headers) c.send_data(1, b'some data') c.send_headers(3, self.example_request_headers) remaining_length = self.DEFAULT_FLOW_WINDOW - len(b'some data') assert (c.local_flow_control_window(3) == remaining_length) def test_remote_flow_control_is_limited_by_connection(self, frame_factory): """ The remote flow control window is limited by the flow control of the connection. """ c = h2.connection.H2Connection(config=self.server_config) c.receive_data(frame_factory.preamble()) f1 = frame_factory.build_headers_frame(self.example_request_headers) f2 = frame_factory.build_data_frame(b'some data') f3 = frame_factory.build_headers_frame( self.example_request_headers, stream_id=3, ) c.receive_data(f1.serialize() + f2.serialize() + f3.serialize()) remaining_length = self.DEFAULT_FLOW_WINDOW - len(b'some data') assert (c.remote_flow_control_window(3) == remaining_length) def test_cannot_send_more_data_than_window(self): """ Sending more data than the remaining flow control window raises a FlowControlError. """ c = h2.connection.H2Connection() c.send_headers(1, self.example_request_headers) c.outbound_flow_control_window = 5 with pytest.raises(h2.exceptions.FlowControlError): c.send_data(1, b'some data') def test_increasing_connection_window_allows_sending(self, frame_factory): """ Confirm that sending a WindowUpdate frame on the connection frees up space for further frames. """ c = h2.connection.H2Connection() c.send_headers(1, self.example_request_headers) c.outbound_flow_control_window = 5 with pytest.raises(h2.exceptions.FlowControlError): c.send_data(1, b'some data') f = frame_factory.build_window_update_frame( stream_id=0, increment=5, ) c.receive_data(f.serialize()) c.clear_outbound_data_buffer() c.send_data(1, b'some data') assert c.data_to_send() def test_increasing_stream_window_allows_sending(self, frame_factory): """ Confirm that sending a WindowUpdate frame on the connection frees up space for further frames. """ c = h2.connection.H2Connection() c.send_headers(1, self.example_request_headers) c._get_stream_by_id(1).outbound_flow_control_window = 5 with pytest.raises(h2.exceptions.FlowControlError): c.send_data(1, b'some data') f = frame_factory.build_window_update_frame( stream_id=1, increment=5, ) c.receive_data(f.serialize()) c.clear_outbound_data_buffer() c.send_data(1, b'some data') assert c.data_to_send() def test_flow_control_shrinks_in_response_to_settings(self, frame_factory): """ Acknowledging SETTINGS_INITIAL_WINDOW_SIZE shrinks the flow control window. """ c = h2.connection.H2Connection() c.send_headers(1, self.example_request_headers) assert c.local_flow_control_window(1) == 65535 f = frame_factory.build_settings_frame( settings={h2.settings.SettingCodes.INITIAL_WINDOW_SIZE: 1280} ) c.receive_data(f.serialize()) assert c.local_flow_control_window(1) == 1280 def test_flow_control_grows_in_response_to_settings(self, frame_factory): """ Acknowledging SETTINGS_INITIAL_WINDOW_SIZE grows the flow control window. """ c = h2.connection.H2Connection() c.send_headers(1, self.example_request_headers) # Greatly increase the connection flow control window. f = frame_factory.build_window_update_frame( stream_id=0, increment=128000 ) c.receive_data(f.serialize()) # The stream flow control window is the bottleneck here. assert c.local_flow_control_window(1) == 65535 f = frame_factory.build_settings_frame( settings={h2.settings.SettingCodes.INITIAL_WINDOW_SIZE: 128000} ) c.receive_data(f.serialize()) # The stream window is still the bottleneck, but larger now. assert c.local_flow_control_window(1) == 128000 def test_flow_control_settings_blocked_by_conn_window(self, frame_factory): """ Changing SETTINGS_INITIAL_WINDOW_SIZE does not affect the effective flow control window if the connection window isn't changed. """ c = h2.connection.H2Connection() c.send_headers(1, self.example_request_headers) assert c.local_flow_control_window(1) == 65535 f = frame_factory.build_settings_frame( settings={h2.settings.SettingCodes.INITIAL_WINDOW_SIZE: 128000} ) c.receive_data(f.serialize()) assert c.local_flow_control_window(1) == 65535 def test_new_streams_have_flow_control_per_settings(self, frame_factory): """ After a SETTINGS_INITIAL_WINDOW_SIZE change is received, new streams have appropriate new flow control windows. """ c = h2.connection.H2Connection() f = frame_factory.build_settings_frame( settings={h2.settings.SettingCodes.INITIAL_WINDOW_SIZE: 128000} ) c.receive_data(f.serialize()) # Greatly increase the connection flow control window. f = frame_factory.build_window_update_frame( stream_id=0, increment=128000 ) c.receive_data(f.serialize()) c.send_headers(1, self.example_request_headers) assert c.local_flow_control_window(1) == 128000 def test_window_update_no_stream(self, frame_factory): """ WindowUpdate frames received without streams fire an appropriate WindowUpdated event. """ c = h2.connection.H2Connection(config=self.server_config) c.receive_data(frame_factory.preamble()) f = frame_factory.build_window_update_frame( stream_id=0, increment=5 ) events = c.receive_data(f.serialize()) assert len(events) == 1 event = events[0] assert isinstance(event, h2.events.WindowUpdated) assert event.stream_id == 0 assert event.delta == 5 def test_window_update_with_stream(self, frame_factory): """ WindowUpdate frames received with streams fire an appropriate WindowUpdated event. """ c = h2.connection.H2Connection(config=self.server_config) c.receive_data(frame_factory.preamble()) f1 = frame_factory.build_headers_frame(self.example_request_headers) f2 = frame_factory.build_window_update_frame( stream_id=1, increment=66 ) data = b''.join(map(lambda f: f.serialize(), [f1, f2])) events = c.receive_data(data) assert len(events) == 2 event = events[1] assert isinstance(event, h2.events.WindowUpdated) assert event.stream_id == 1 assert event.delta == 66 def test_we_can_increment_stream_flow_control(self, frame_factory): """ It is possible for the user to increase the flow control window for streams. """ c = h2.connection.H2Connection() c.initiate_connection() c.send_headers(1, self.example_request_headers, end_stream=True) c.clear_outbound_data_buffer() expected_frame = frame_factory.build_window_update_frame( stream_id=1, increment=5 ) events = c.increment_flow_control_window(increment=5, stream_id=1) assert not events assert c.data_to_send() == expected_frame.serialize() def test_we_can_increment_connection_flow_control(self, frame_factory): """ It is possible for the user to increase the flow control window for the entire connection. """ c = h2.connection.H2Connection() c.initiate_connection() c.send_headers(1, self.example_request_headers, end_stream=True) c.clear_outbound_data_buffer() expected_frame = frame_factory.build_window_update_frame( stream_id=0, increment=5 ) events = c.increment_flow_control_window(increment=5) assert not events assert c.data_to_send() == expected_frame.serialize() def test_we_enforce_our_flow_control_window(self, frame_factory): """ The user can set a low flow control window, which leads to connection teardown if violated. """ c = h2.connection.H2Connection(config=self.server_config) c.receive_data(frame_factory.preamble()) # Change the flow control window to 80 bytes. c.update_settings( {h2.settings.SettingCodes.INITIAL_WINDOW_SIZE: 80} ) f = frame_factory.build_settings_frame({}, ack=True) c.receive_data(f.serialize()) # Receive a new stream. f = frame_factory.build_headers_frame(self.example_request_headers) c.receive_data(f.serialize()) # Attempt to violate the flow control window. c.clear_outbound_data_buffer() f = frame_factory.build_data_frame(b'\x01' * 100) with pytest.raises(h2.exceptions.FlowControlError): c.receive_data(f.serialize()) # Verify we tear down appropriately. expected_frame = frame_factory.build_goaway_frame( last_stream_id=1, error_code=h2.errors.ErrorCodes.FLOW_CONTROL_ERROR, ) assert c.data_to_send() == expected_frame.serialize() def test_shrink_remote_flow_control_settings(self, frame_factory): """ The remote peer acknowledging our SETTINGS_INITIAL_WINDOW_SIZE shrinks the flow control window. """ c = h2.connection.H2Connection() c.send_headers(1, self.example_request_headers) assert c.remote_flow_control_window(1) == 65535 c.update_settings({h2.settings.SettingCodes.INITIAL_WINDOW_SIZE: 1280}) f = frame_factory.build_settings_frame({}, ack=True) c.receive_data(f.serialize()) assert c.remote_flow_control_window(1) == 1280 def test_grow_remote_flow_control_settings(self, frame_factory): """ The remote peer acknowledging our SETTINGS_INITIAL_WINDOW_SIZE grows the flow control window. """ c = h2.connection.H2Connection() c.send_headers(1, self.example_request_headers) # Increase the connection flow control window greatly. c.increment_flow_control_window(increment=128000) assert c.remote_flow_control_window(1) == 65535 c.update_settings( {h2.settings.SettingCodes.INITIAL_WINDOW_SIZE: 128000} ) f = frame_factory.build_settings_frame({}, ack=True) c.receive_data(f.serialize()) assert c.remote_flow_control_window(1) == 128000 def test_new_streams_have_remote_flow_control(self, frame_factory): """ After a SETTINGS_INITIAL_WINDOW_SIZE change is acknowledged by the remote peer, new streams have appropriate new flow control windows. """ c = h2.connection.H2Connection() c.update_settings( {h2.settings.SettingCodes.INITIAL_WINDOW_SIZE: 128000} ) f = frame_factory.build_settings_frame({}, ack=True) c.receive_data(f.serialize()) # Increase the connection flow control window greatly. c.increment_flow_control_window(increment=128000) c.send_headers(1, self.example_request_headers) assert c.remote_flow_control_window(1) == 128000 @pytest.mark.parametrize( 'increment', [0, -15, 2**31] ) def test_reject_bad_attempts_to_increment_flow_control(self, increment): """ Attempting to increment a flow control increment outside the valid range causes a ValueError to be raised. """ c = h2.connection.H2Connection() c.initiate_connection() c.send_headers(1, self.example_request_headers, end_stream=True) c.clear_outbound_data_buffer() # Fails both on and off streams. with pytest.raises(ValueError): c.increment_flow_control_window(increment=increment, stream_id=1) with pytest.raises(ValueError): c.increment_flow_control_window(increment=increment) @pytest.mark.parametrize('stream_id', [0, 1]) def test_reject_bad_remote_increments(self, frame_factory, stream_id): """ Remote peers attempting to increment flow control outside the valid range cause connection errors of type PROTOCOL_ERROR. """ # The only number that can be encoded in a WINDOW_UPDATE frame but # isn't valid is 0. c = h2.connection.H2Connection() c.initiate_connection() c.send_headers(1, self.example_request_headers, end_stream=True) c.clear_outbound_data_buffer() f = frame_factory.build_window_update_frame( stream_id=stream_id, increment=0 ) with pytest.raises(h2.exceptions.ProtocolError): c.receive_data(f.serialize()) expected_frame = frame_factory.build_goaway_frame( last_stream_id=0, error_code=h2.errors.ErrorCodes.PROTOCOL_ERROR, ) assert c.data_to_send() == expected_frame.serialize() def test_reject_increasing_connection_window_too_far(self, frame_factory): """ Attempts by the remote peer to increase the connection flow control window beyond 2**31 - 1 are rejected. """ c = h2.connection.H2Connection() c.initiate_connection() c.clear_outbound_data_buffer() increment = 2**31 - c.outbound_flow_control_window f = frame_factory.build_window_update_frame( stream_id=0, increment=increment ) with pytest.raises(h2.exceptions.FlowControlError): c.receive_data(f.serialize()) expected_frame = frame_factory.build_goaway_frame( last_stream_id=0, error_code=h2.errors.ErrorCodes.FLOW_CONTROL_ERROR, ) assert c.data_to_send() == expected_frame.serialize() def test_reject_increasing_stream_window_too_far(self, frame_factory): """ Attempts by the remote peer to increase the stream flow control window beyond 2**31 - 1 are rejected. """ c = h2.connection.H2Connection() c.initiate_connection() c.send_headers(1, self.example_request_headers) c.clear_outbound_data_buffer() increment = 2**31 - c.outbound_flow_control_window f = frame_factory.build_window_update_frame( stream_id=1, increment=increment ) events = c.receive_data(f.serialize()) assert len(events) == 1 event = events[0] assert isinstance(event, h2.events.StreamReset) assert event.stream_id == 1 assert event.error_code == h2.errors.ErrorCodes.FLOW_CONTROL_ERROR assert not event.remote_reset expected_frame = frame_factory.build_rst_stream_frame( stream_id=1, error_code=h2.errors.ErrorCodes.FLOW_CONTROL_ERROR, ) assert c.data_to_send() == expected_frame.serialize() def test_reject_overlarge_conn_window_settings(self, frame_factory): """ SETTINGS frames cannot change the size of the connection flow control window. """ c = h2.connection.H2Connection() c.initiate_connection() # Go one byte smaller than the limit. increment = 2**31 - 1 - c.outbound_flow_control_window f = frame_factory.build_window_update_frame( stream_id=0, increment=increment ) c.receive_data(f.serialize()) # Receive an increment to the initial window size. f = frame_factory.build_settings_frame( settings={ h2.settings.SettingCodes.INITIAL_WINDOW_SIZE: self.DEFAULT_FLOW_WINDOW + 1 } ) c.clear_outbound_data_buffer() # No error is encountered. events = c.receive_data(f.serialize()) assert len(events) == 1 assert isinstance(events[0], h2.events.RemoteSettingsChanged) expected_frame = frame_factory.build_settings_frame( settings={}, ack=True ) assert c.data_to_send() == expected_frame.serialize() def test_reject_overlarge_stream_window_settings(self, frame_factory): """ Remote attempts to create overlarge stream windows via SETTINGS frames are rejected. """ c = h2.connection.H2Connection() c.initiate_connection() c.send_headers(1, self.example_request_headers) # Go one byte smaller than the limit. increment = 2**31 - 1 - c.outbound_flow_control_window f = frame_factory.build_window_update_frame( stream_id=1, increment=increment ) c.receive_data(f.serialize()) # Receive an increment to the initial window size. f = frame_factory.build_settings_frame( settings={ h2.settings.SettingCodes.INITIAL_WINDOW_SIZE: self.DEFAULT_FLOW_WINDOW + 1 } ) c.clear_outbound_data_buffer() with pytest.raises(h2.exceptions.FlowControlError): c.receive_data(f.serialize()) expected_frame = frame_factory.build_goaway_frame( last_stream_id=0, error_code=h2.errors.ErrorCodes.FLOW_CONTROL_ERROR, ) assert c.data_to_send() == expected_frame.serialize() def test_reject_local_overlarge_increase_connection_window(self): """ Local attempts to increase the connection window too far are rejected. """ c = h2.connection.H2Connection() c.initiate_connection() increment = 2**31 - c.inbound_flow_control_window with pytest.raises(h2.exceptions.FlowControlError): c.increment_flow_control_window(increment=increment) def test_reject_local_overlarge_increase_stream_window(self): """ Local attempts to increase the connection window too far are rejected. """ c = h2.connection.H2Connection() c.initiate_connection() c.send_headers(1, self.example_request_headers) increment = 2**31 - c.inbound_flow_control_window with pytest.raises(h2.exceptions.FlowControlError): c.increment_flow_control_window(increment=increment, stream_id=1) class TestAutomaticFlowControl(object): """ Tests for the automatic flow control logic. """ example_request_headers = [ (':authority', 'example.com'), (':path', '/'), (':scheme', 'https'), (':method', 'GET'), ] server_config = h2.config.H2Configuration(client_side=False) DEFAULT_FLOW_WINDOW = 65535 def _setup_connection_and_send_headers(self, frame_factory): """ Setup a server-side H2Connection and send a headers frame, and then clear the outbound data buffer. Also increase the maximum frame size. """ c = h2.connection.H2Connection(config=self.server_config) c.initiate_connection() c.receive_data(frame_factory.preamble()) c.update_settings( {h2.settings.SettingCodes.MAX_FRAME_SIZE: self.DEFAULT_FLOW_WINDOW} ) settings_frame = frame_factory.build_settings_frame( settings={}, ack=True ) c.receive_data(settings_frame.serialize()) c.clear_outbound_data_buffer() headers_frame = frame_factory.build_headers_frame( headers=self.example_request_headers ) c.receive_data(headers_frame.serialize()) c.clear_outbound_data_buffer() return c @given(stream_id=integers(max_value=0)) def test_must_acknowledge_for_stream(self, frame_factory, stream_id): """ Flow control acknowledgements must be done on a stream ID that is greater than zero. """ # We need to refresh the encoder because hypothesis has a problem with # integrating with py.test, meaning that we use the same frame factory # for all tests. # See https://github.com/HypothesisWorks/hypothesis-python/issues/377 frame_factory.refresh_encoder() # Create a connection in a state that might actually accept # data acknolwedgement. c = self._setup_connection_and_send_headers(frame_factory) data_frame = frame_factory.build_data_frame( b'some data', flags=['END_STREAM'] ) c.receive_data(data_frame.serialize()) with pytest.raises(ValueError): c.acknowledge_received_data( acknowledged_size=5, stream_id=stream_id ) @given(size=integers(max_value=-1)) def test_cannot_acknowledge_less_than_zero(self, frame_factory, size): """ The user must acknowledge at least 0 bytes. """ # We need to refresh the encoder because hypothesis has a problem with # integrating with py.test, meaning that we use the same frame factory # for all tests. # See https://github.com/HypothesisWorks/hypothesis-python/issues/377 frame_factory.refresh_encoder() # Create a connection in a state that might actually accept # data acknolwedgement. c = self._setup_connection_and_send_headers(frame_factory) data_frame = frame_factory.build_data_frame( b'some data', flags=['END_STREAM'] ) c.receive_data(data_frame.serialize()) with pytest.raises(ValueError): c.acknowledge_received_data(acknowledged_size=size, stream_id=1) def test_acknowledging_small_chunks_does_nothing(self, frame_factory): """ When a small amount of data is received and acknowledged, no window update is emitted. """ c = self._setup_connection_and_send_headers(frame_factory) data_frame = frame_factory.build_data_frame( b'some data', flags=['END_STREAM'] ) data_event = c.receive_data(data_frame.serialize())[0] c.acknowledge_received_data( data_event.flow_controlled_length, stream_id=1 ) assert not c.data_to_send() def test_acknowledging_no_data_does_nothing(self, frame_factory): """ If a user accidentally acknowledges no data, nothing happens. """ c = self._setup_connection_and_send_headers(frame_factory) # Send an empty data frame, just to give the user impetus to ack the # data. data_frame = frame_factory.build_data_frame(b'') c.receive_data(data_frame.serialize()) c.acknowledge_received_data(0, stream_id=1) assert not c.data_to_send() @pytest.mark.parametrize('force_cleanup', (True, False)) def test_acknowledging_data_on_closed_stream(self, frame_factory, force_cleanup): """ When acknowledging data on a stream that has just been closed, no acknowledgement is given for that stream, only for the connection. """ c = self._setup_connection_and_send_headers(frame_factory) data_to_send = b'\x00' * self.DEFAULT_FLOW_WINDOW data_frame = frame_factory.build_data_frame(data_to_send) c.receive_data(data_frame.serialize()) rst_frame = frame_factory.build_rst_stream_frame( stream_id=1 ) c.receive_data(rst_frame.serialize()) c.clear_outbound_data_buffer() if force_cleanup: # Check how many streams are open to force the old one to be # cleaned up. assert c.open_outbound_streams == 0 c.acknowledge_received_data(2048, stream_id=1) expected = frame_factory.build_window_update_frame( stream_id=0, increment=2048 ) assert c.data_to_send() == expected.serialize() def test_acknowledging_streams_we_never_saw(self, frame_factory): """ If the user acknowledges a stream ID we've never seen, that raises a NoSuchStreamError. """ c = self._setup_connection_and_send_headers(frame_factory) c.clear_outbound_data_buffer() with pytest.raises(h2.exceptions.NoSuchStreamError): c.acknowledge_received_data(2048, stream_id=101) @given(integers(min_value=1025, max_value=DEFAULT_FLOW_WINDOW)) def test_acknowledging_1024_bytes_when_empty_increments(self, frame_factory, increment): """ If the flow control window is empty and we acknowledge 1024 bytes or more, we will emit a WINDOW_UPDATE frame just to move the connection forward. """ # We need to refresh the encoder because hypothesis has a problem with # integrating with py.test, meaning that we use the same frame factory # for all tests. # See https://github.com/HypothesisWorks/hypothesis-python/issues/377 frame_factory.refresh_encoder() c = self._setup_connection_and_send_headers(frame_factory) data_to_send = b'\x00' * self.DEFAULT_FLOW_WINDOW data_frame = frame_factory.build_data_frame(data_to_send) c.receive_data(data_frame.serialize()) c.acknowledge_received_data(increment, stream_id=1) first_expected = frame_factory.build_window_update_frame( stream_id=0, increment=increment ) second_expected = frame_factory.build_window_update_frame( stream_id=1, increment=increment ) expected_data = b''.join( [first_expected.serialize(), second_expected.serialize()] ) assert c.data_to_send() == expected_data # This test needs to use a lower cap, because otherwise the algo will # increment the stream window anyway. @given(integers(min_value=1025, max_value=(DEFAULT_FLOW_WINDOW // 4) - 1)) def test_connection_only_empty(self, frame_factory, increment): """ If the connection flow control window is empty, but the stream flow control windows aren't, and 1024 bytes or more are acknowledged by the user, we increment the connection window only. """ # We need to refresh the encoder because hypothesis has a problem with # integrating with py.test, meaning that we use the same frame factory # for all tests. # See https://github.com/HypothesisWorks/hypothesis-python/issues/377 frame_factory.refresh_encoder() # Here we'll use 4 streams. Set them up. c = self._setup_connection_and_send_headers(frame_factory) for stream_id in [3, 5, 7]: f = frame_factory.build_headers_frame( headers=self.example_request_headers, stream_id=stream_id ) c.receive_data(f.serialize()) # Now we send 1/4 of the connection window per stream. Annoyingly, # that's an odd number, so we need to round the last frame up. data_to_send = b'\x00' * (self.DEFAULT_FLOW_WINDOW // 4) for stream_id in [1, 3, 5]: f = frame_factory.build_data_frame( data_to_send, stream_id=stream_id ) c.receive_data(f.serialize()) data_to_send = b'\x00' * c.remote_flow_control_window(7) data_frame = frame_factory.build_data_frame(data_to_send, stream_id=7) c.receive_data(data_frame.serialize()) # Ok, now the actual test. c.acknowledge_received_data(increment, stream_id=1) expected_data = frame_factory.build_window_update_frame( stream_id=0, increment=increment ).serialize() assert c.data_to_send() == expected_data @given(integers(min_value=1025, max_value=DEFAULT_FLOW_WINDOW)) def test_mixing_update_forms(self, frame_factory, increment): """ If the user mixes ackowledging data with manually incrementing windows, we still keep track of what's going on. """ # We need to refresh the encoder because hypothesis has a problem with # integrating with py.test, meaning that we use the same frame factory # for all tests. # See https://github.com/HypothesisWorks/hypothesis-python/issues/377 frame_factory.refresh_encoder() # Empty the flow control window. c = self._setup_connection_and_send_headers(frame_factory) data_to_send = b'\x00' * self.DEFAULT_FLOW_WINDOW data_frame = frame_factory.build_data_frame(data_to_send) c.receive_data(data_frame.serialize()) # Manually increment the connection flow control window back to fully # open, but leave the stream window closed. c.increment_flow_control_window( stream_id=None, increment=self.DEFAULT_FLOW_WINDOW ) c.clear_outbound_data_buffer() # Now, acknowledge the receipt of that data. This should cause the # stream window to be widened, but not the connection window, because # it is already open. c.acknowledge_received_data(increment, stream_id=1) # We expect to see one window update frame only, for the stream. expected_data = frame_factory.build_window_update_frame( stream_id=1, increment=increment ).serialize() assert c.data_to_send() == expected_data h2-3.1.1/test/test_h2_upgrade.py0000664000175000017500000002436713421652727017352 0ustar ubuntuubuntu00000000000000# -*- coding: utf-8 -*- """ test_h2_upgrade.py ~~~~~~~~~~~~~~~~~~ This module contains tests that exercise the HTTP Upgrade functionality of hyper-h2, ensuring that clients and servers can upgrade their plaintext HTTP/1.1 connections to HTTP/2. """ import base64 import pytest import h2.config import h2.connection import h2.errors import h2.events import h2.exceptions class TestClientUpgrade(object): """ Tests of the client-side of the HTTP/2 upgrade dance. """ example_request_headers = [ (b':authority', b'example.com'), (b':path', b'/'), (b':scheme', b'https'), (b':method', b'GET'), ] example_response_headers = [ (b':status', b'200'), (b'server', b'fake-serv/0.1.0') ] def test_returns_http2_settings(self, frame_factory): """ Calling initiate_upgrade_connection returns a base64url encoded Settings frame with the settings used by the connection. """ conn = h2.connection.H2Connection() data = conn.initiate_upgrade_connection() # The base64 encoding must not be padded. assert not data.endswith(b'=') # However, SETTINGS frames should never need to be padded. decoded_frame = base64.urlsafe_b64decode(data) expected_frame = frame_factory.build_settings_frame( settings=conn.local_settings ) assert decoded_frame == expected_frame.serialize_body() def test_emits_preamble(self, frame_factory): """ Calling initiate_upgrade_connection emits the connection preamble. """ conn = h2.connection.H2Connection() conn.initiate_upgrade_connection() data = conn.data_to_send() assert data.startswith(frame_factory.preamble()) data = data[len(frame_factory.preamble()):] expected_frame = frame_factory.build_settings_frame( settings=conn.local_settings ) assert data == expected_frame.serialize() def test_can_receive_response(self, frame_factory): """ After upgrading, we can safely receive a response. """ c = h2.connection.H2Connection() c.initiate_upgrade_connection() c.clear_outbound_data_buffer() f1 = frame_factory.build_headers_frame( stream_id=1, headers=self.example_response_headers, ) f2 = frame_factory.build_data_frame( stream_id=1, data=b'some data', flags=['END_STREAM'] ) events = c.receive_data(f1.serialize() + f2.serialize()) assert len(events) == 3 assert isinstance(events[0], h2.events.ResponseReceived) assert isinstance(events[1], h2.events.DataReceived) assert isinstance(events[2], h2.events.StreamEnded) assert events[0].headers == self.example_response_headers assert events[1].data == b'some data' assert all(e.stream_id == 1 for e in events) assert not c.data_to_send() def test_can_receive_pushed_stream(self, frame_factory): """ After upgrading, we can safely receive a pushed stream. """ c = h2.connection.H2Connection() c.initiate_upgrade_connection() c.clear_outbound_data_buffer() f = frame_factory.build_push_promise_frame( stream_id=1, promised_stream_id=2, headers=self.example_request_headers, ) events = c.receive_data(f.serialize()) assert len(events) == 1 assert isinstance(events[0], h2.events.PushedStreamReceived) assert events[0].headers == self.example_request_headers assert events[0].parent_stream_id == 1 assert events[0].pushed_stream_id == 2 def test_cannot_send_headers_stream_1(self, frame_factory): """ After upgrading, we cannot send headers on stream 1. """ c = h2.connection.H2Connection() c.initiate_upgrade_connection() c.clear_outbound_data_buffer() with pytest.raises(h2.exceptions.ProtocolError): c.send_headers(stream_id=1, headers=self.example_request_headers) def test_cannot_send_data_stream_1(self, frame_factory): """ After upgrading, we cannot send data on stream 1. """ c = h2.connection.H2Connection() c.initiate_upgrade_connection() c.clear_outbound_data_buffer() with pytest.raises(h2.exceptions.ProtocolError): c.send_data(stream_id=1, data=b'some data') class TestServerUpgrade(object): """ Tests of the server-side of the HTTP/2 upgrade dance. """ example_request_headers = [ (b':authority', b'example.com'), (b':path', b'/'), (b':scheme', b'https'), (b':method', b'GET'), ] example_response_headers = [ (b':status', b'200'), (b'server', b'fake-serv/0.1.0') ] server_config = h2.config.H2Configuration(client_side=False) def test_returns_nothing(self, frame_factory): """ Calling initiate_upgrade_connection returns nothing. """ conn = h2.connection.H2Connection(config=self.server_config) curl_header = b"AAMAAABkAAQAAP__" data = conn.initiate_upgrade_connection(curl_header) assert data is None def test_emits_preamble(self, frame_factory): """ Calling initiate_upgrade_connection emits the connection preamble. """ conn = h2.connection.H2Connection(config=self.server_config) conn.initiate_upgrade_connection() data = conn.data_to_send() expected_frame = frame_factory.build_settings_frame( settings=conn.local_settings ) assert data == expected_frame.serialize() def test_can_send_response(self, frame_factory): """ After upgrading, we can safely send a response. """ c = h2.connection.H2Connection(config=self.server_config) c.initiate_upgrade_connection() c.clear_outbound_data_buffer() c.send_headers(stream_id=1, headers=self.example_response_headers) c.send_data(stream_id=1, data=b'some data', end_stream=True) f1 = frame_factory.build_headers_frame( stream_id=1, headers=self.example_response_headers, ) f2 = frame_factory.build_data_frame( stream_id=1, data=b'some data', flags=['END_STREAM'] ) expected_data = f1.serialize() + f2.serialize() assert c.data_to_send() == expected_data def test_can_push_stream(self, frame_factory): """ After upgrading, we can safely push a stream. """ c = h2.connection.H2Connection(config=self.server_config) c.initiate_upgrade_connection() c.clear_outbound_data_buffer() c.push_stream( stream_id=1, promised_stream_id=2, request_headers=self.example_request_headers ) f = frame_factory.build_push_promise_frame( stream_id=1, promised_stream_id=2, headers=self.example_request_headers, ) assert c.data_to_send() == f.serialize() def test_cannot_receive_headers_stream_1(self, frame_factory): """ After upgrading, we cannot receive headers on stream 1. """ c = h2.connection.H2Connection(config=self.server_config) c.initiate_upgrade_connection() c.receive_data(frame_factory.preamble()) c.clear_outbound_data_buffer() f = frame_factory.build_headers_frame( stream_id=1, headers=self.example_request_headers, ) c.receive_data(f.serialize()) expected_frame = frame_factory.build_rst_stream_frame( stream_id=1, error_code=h2.errors.ErrorCodes.STREAM_CLOSED, ) assert c.data_to_send() == expected_frame.serialize() def test_cannot_receive_data_stream_1(self, frame_factory): """ After upgrading, we cannot receive data on stream 1. """ c = h2.connection.H2Connection(config=self.server_config) c.initiate_upgrade_connection() c.receive_data(frame_factory.preamble()) c.clear_outbound_data_buffer() f = frame_factory.build_data_frame( stream_id=1, data=b'some data', ) c.receive_data(f.serialize()) expected_frame = frame_factory.build_rst_stream_frame( stream_id=1, error_code=h2.errors.ErrorCodes.STREAM_CLOSED, ) assert c.data_to_send() == expected_frame.serialize() def test_client_settings_are_applied(self, frame_factory): """ The settings provided by the client are applied and immediately ACK'ed. """ server = h2.connection.H2Connection(config=self.server_config) client = h2.connection.H2Connection() # As a precaution, let's confirm that the server and client, at the # start of the connection, do not agree on their initial settings # state. assert ( client.local_settings._settings != server.remote_settings._settings ) # Get the client header data and pass it to the server. header_data = client.initiate_upgrade_connection() server.initiate_upgrade_connection(header_data) # This gets complex, but here we go. # RFC 7540 § 3.2.1 says that "explicit acknowledgement" of the settings # in the header is "not necessary". That's annoyingly vague, but we # interpret that to mean "should not be sent". So to test that this # worked we need to test that the server has only sent the preamble, # and has not sent a SETTINGS ack, and also that the server has the # correct settings. expected_frame = frame_factory.build_settings_frame( server.local_settings ) assert server.data_to_send() == expected_frame.serialize() # We violate abstraction layers here, but I don't think defining __eq__ # for this is worth it. In this case, both the client and server should # agree that these settings have been ACK'd, so their underlying # dictionaries should be identical. assert ( client.local_settings._settings == server.remote_settings._settings ) h2-3.1.1/test/test_head_request.py0000664000175000017500000000305613521033071017755 0ustar ubuntuubuntu00000000000000# -*- coding; utf-8 -*- """ test_head_request ~~~~~~~~~~~~~~~~~ """ import h2.connection import pytest class TestHeadRequest(object): example_request_headers = [ (b':authority', b'example.com'), (b':path', b'/'), (b':scheme', b'https'), (b':method', b'HEAD'), ] example_response_headers = [ (b':status', b'200'), (b'server', b'fake-serv/0.1.0'), (b'content_length', b'1'), ] def test_non_zero_content_and_no_body(self, frame_factory): c = h2.connection.H2Connection() c.initiate_connection() c.send_headers(1, self.example_request_headers, end_stream=True) f = frame_factory.build_headers_frame( self.example_response_headers, flags=['END_STREAM'] ) events = c.receive_data(f.serialize()) assert len(events) == 2 event = events[0] assert isinstance(event, h2.events.ResponseReceived) assert event.stream_id == 1 assert event.headers == self.example_response_headers def test_reject_non_zero_content_and_body(self, frame_factory): c = h2.connection.H2Connection() c.initiate_connection() c.send_headers(1, self.example_request_headers) headers = frame_factory.build_headers_frame( self.example_response_headers ) data = frame_factory.build_data_frame(data=b'\x01') c.receive_data(headers.serialize()) with pytest.raises(h2.exceptions.InvalidBodyLengthError): c.receive_data(data.serialize()) h2-3.1.1/test/test_header_indexing.py0000664000175000017500000005633413421652727020446 0ustar ubuntuubuntu00000000000000# -*- coding: utf-8 -*- """ test_header_indexing.py ~~~~~~~~~~~~~~~~~~~~~~~ This module contains tests that use HPACK header tuples that provide additional metadata to the hpack module about how to encode the headers. """ import pytest from hpack import HeaderTuple, NeverIndexedHeaderTuple import h2.config import h2.connection def assert_header_blocks_actually_equal(block_a, block_b): """ Asserts that two header bocks are really, truly equal, down to the types of their tuples. Doesn't return anything. """ assert len(block_a) == len(block_b) for a, b in zip(block_a, block_b): assert a == b assert a.__class__ is b.__class__ class TestHeaderIndexing(object): """ Test that Hyper-h2 can correctly handle never indexed header fields using the appropriate hpack data structures. """ example_request_headers = [ HeaderTuple(u':authority', u'example.com'), HeaderTuple(u':path', u'/'), HeaderTuple(u':scheme', u'https'), HeaderTuple(u':method', u'GET'), ] bytes_example_request_headers = [ HeaderTuple(b':authority', b'example.com'), HeaderTuple(b':path', b'/'), HeaderTuple(b':scheme', b'https'), HeaderTuple(b':method', b'GET'), ] extended_request_headers = [ HeaderTuple(u':authority', u'example.com'), HeaderTuple(u':path', u'/'), HeaderTuple(u':scheme', u'https'), HeaderTuple(u':method', u'GET'), NeverIndexedHeaderTuple(u'authorization', u'realpassword'), ] bytes_extended_request_headers = [ HeaderTuple(b':authority', b'example.com'), HeaderTuple(b':path', b'/'), HeaderTuple(b':scheme', b'https'), HeaderTuple(b':method', b'GET'), NeverIndexedHeaderTuple(b'authorization', b'realpassword'), ] example_response_headers = [ HeaderTuple(u':status', u'200'), HeaderTuple(u'server', u'fake-serv/0.1.0') ] bytes_example_response_headers = [ HeaderTuple(b':status', b'200'), HeaderTuple(b'server', b'fake-serv/0.1.0') ] extended_response_headers = [ HeaderTuple(u':status', u'200'), HeaderTuple(u'server', u'fake-serv/0.1.0'), NeverIndexedHeaderTuple(u'secure', u'you-bet'), ] bytes_extended_response_headers = [ HeaderTuple(b':status', b'200'), HeaderTuple(b'server', b'fake-serv/0.1.0'), NeverIndexedHeaderTuple(b'secure', b'you-bet'), ] server_config = h2.config.H2Configuration(client_side=False) @pytest.mark.parametrize( 'headers', ( example_request_headers, bytes_example_request_headers, extended_request_headers, bytes_extended_request_headers, ) ) def test_sending_header_tuples(self, headers, frame_factory): """ Providing HeaderTuple and HeaderTuple subclasses preserves the metadata about indexing. """ c = h2.connection.H2Connection() c.initiate_connection() # Clear the data, then send headers. c.clear_outbound_data_buffer() c.send_headers(1, headers) f = frame_factory.build_headers_frame(headers=headers) assert c.data_to_send() == f.serialize() @pytest.mark.parametrize( 'headers', ( example_request_headers, bytes_example_request_headers, extended_request_headers, bytes_extended_request_headers, ) ) def test_header_tuples_in_pushes(self, headers, frame_factory): """ Providing HeaderTuple and HeaderTuple subclasses to push promises preserves metadata about indexing. """ c = h2.connection.H2Connection(config=self.server_config) c.receive_data(frame_factory.preamble()) # We can use normal headers for the request. f = frame_factory.build_headers_frame( self.example_request_headers ) c.receive_data(f.serialize()) frame_factory.refresh_encoder() expected_frame = frame_factory.build_push_promise_frame( stream_id=1, promised_stream_id=2, headers=headers, flags=['END_HEADERS'], ) c.clear_outbound_data_buffer() c.push_stream( stream_id=1, promised_stream_id=2, request_headers=headers ) assert c.data_to_send() == expected_frame.serialize() @pytest.mark.parametrize( 'headers,encoding', ( (example_request_headers, 'utf-8'), (bytes_example_request_headers, None), (extended_request_headers, 'utf-8'), (bytes_extended_request_headers, None), ) ) def test_header_tuples_are_decoded_request(self, headers, encoding, frame_factory): """ The indexing status of the header is preserved when emitting RequestReceived events. """ config = h2.config.H2Configuration( client_side=False, header_encoding=encoding ) c = h2.connection.H2Connection(config=config) c.receive_data(frame_factory.preamble()) f = frame_factory.build_headers_frame(headers) data = f.serialize() events = c.receive_data(data) assert len(events) == 1 event = events[0] assert isinstance(event, h2.events.RequestReceived) assert_header_blocks_actually_equal(headers, event.headers) @pytest.mark.parametrize( 'headers,encoding', ( (example_response_headers, 'utf-8'), (bytes_example_response_headers, None), (extended_response_headers, 'utf-8'), (bytes_extended_response_headers, None), ) ) def test_header_tuples_are_decoded_response(self, headers, encoding, frame_factory): """ The indexing status of the header is preserved when emitting ResponseReceived events. """ config = h2.config.H2Configuration( header_encoding=encoding ) c = h2.connection.H2Connection(config=config) c.initiate_connection() c.send_headers(stream_id=1, headers=self.example_request_headers) f = frame_factory.build_headers_frame(headers) data = f.serialize() events = c.receive_data(data) assert len(events) == 1 event = events[0] assert isinstance(event, h2.events.ResponseReceived) assert_header_blocks_actually_equal(headers, event.headers) @pytest.mark.parametrize( 'headers,encoding', ( (example_response_headers, 'utf-8'), (bytes_example_response_headers, None), (extended_response_headers, 'utf-8'), (bytes_extended_response_headers, None), ) ) def test_header_tuples_are_decoded_info_response(self, headers, encoding, frame_factory): """ The indexing status of the header is preserved when emitting InformationalResponseReceived events. """ # Manipulate the headers to send 100 Continue. We need to copy the list # to avoid breaking the example headers. headers = headers[:] if encoding: headers[0] = HeaderTuple(u':status', u'100') else: headers[0] = HeaderTuple(b':status', b'100') config = h2.config.H2Configuration( header_encoding=encoding ) c = h2.connection.H2Connection(config=config) c.initiate_connection() c.send_headers(stream_id=1, headers=self.example_request_headers) f = frame_factory.build_headers_frame(headers) data = f.serialize() events = c.receive_data(data) assert len(events) == 1 event = events[0] assert isinstance(event, h2.events.InformationalResponseReceived) assert_header_blocks_actually_equal(headers, event.headers) @pytest.mark.parametrize( 'headers,encoding', ( (example_response_headers, 'utf-8'), (bytes_example_response_headers, None), (extended_response_headers, 'utf-8'), (bytes_extended_response_headers, None), ) ) def test_header_tuples_are_decoded_trailers(self, headers, encoding, frame_factory): """ The indexing status of the header is preserved when emitting TrailersReceived events. """ # Manipulate the headers to remove the status, which shouldn't be in # the trailers. We need to copy the list to avoid breaking the example # headers. headers = headers[1:] config = h2.config.H2Configuration( header_encoding=encoding ) c = h2.connection.H2Connection(config=config) c.initiate_connection() c.send_headers(stream_id=1, headers=self.example_request_headers) f = frame_factory.build_headers_frame(self.example_response_headers) data = f.serialize() c.receive_data(data) f = frame_factory.build_headers_frame(headers, flags=['END_STREAM']) data = f.serialize() events = c.receive_data(data) assert len(events) == 2 event = events[0] assert isinstance(event, h2.events.TrailersReceived) assert_header_blocks_actually_equal(headers, event.headers) @pytest.mark.parametrize( 'headers,encoding', ( (example_request_headers, 'utf-8'), (bytes_example_request_headers, None), (extended_request_headers, 'utf-8'), (bytes_extended_request_headers, None), ) ) def test_header_tuples_are_decoded_push_promise(self, headers, encoding, frame_factory): """ The indexing status of the header is preserved when emitting PushedStreamReceived events. """ config = h2.config.H2Configuration( header_encoding=encoding ) c = h2.connection.H2Connection(config=config) c.initiate_connection() c.send_headers(stream_id=1, headers=self.example_request_headers) f = frame_factory.build_push_promise_frame( stream_id=1, promised_stream_id=2, headers=headers, flags=['END_HEADERS'], ) data = f.serialize() events = c.receive_data(data) assert len(events) == 1 event = events[0] assert isinstance(event, h2.events.PushedStreamReceived) assert_header_blocks_actually_equal(headers, event.headers) class TestSecureHeaders(object): """ Certain headers should always be transformed to their never-indexed form. """ example_request_headers = [ (u':authority', u'example.com'), (u':path', u'/'), (u':scheme', u'https'), (u':method', u'GET'), ] bytes_example_request_headers = [ (b':authority', b'example.com'), (b':path', b'/'), (b':scheme', b'https'), (b':method', b'GET'), ] possible_auth_headers = [ (u'authorization', u'test'), (u'Authorization', u'test'), (u'authorization', u'really long test'), HeaderTuple(u'authorization', u'test'), HeaderTuple(u'Authorization', u'test'), HeaderTuple(u'authorization', u'really long test'), NeverIndexedHeaderTuple(u'authorization', u'test'), NeverIndexedHeaderTuple(u'Authorization', u'test'), NeverIndexedHeaderTuple(u'authorization', u'really long test'), (b'authorization', b'test'), (b'Authorization', b'test'), (b'authorization', b'really long test'), HeaderTuple(b'authorization', b'test'), HeaderTuple(b'Authorization', b'test'), HeaderTuple(b'authorization', b'really long test'), NeverIndexedHeaderTuple(b'authorization', b'test'), NeverIndexedHeaderTuple(b'Authorization', b'test'), NeverIndexedHeaderTuple(b'authorization', b'really long test'), (u'proxy-authorization', u'test'), (u'Proxy-Authorization', u'test'), (u'proxy-authorization', u'really long test'), HeaderTuple(u'proxy-authorization', u'test'), HeaderTuple(u'Proxy-Authorization', u'test'), HeaderTuple(u'proxy-authorization', u'really long test'), NeverIndexedHeaderTuple(u'proxy-authorization', u'test'), NeverIndexedHeaderTuple(u'Proxy-Authorization', u'test'), NeverIndexedHeaderTuple(u'proxy-authorization', u'really long test'), (b'proxy-authorization', b'test'), (b'Proxy-Authorization', b'test'), (b'proxy-authorization', b'really long test'), HeaderTuple(b'proxy-authorization', b'test'), HeaderTuple(b'Proxy-Authorization', b'test'), HeaderTuple(b'proxy-authorization', b'really long test'), NeverIndexedHeaderTuple(b'proxy-authorization', b'test'), NeverIndexedHeaderTuple(b'Proxy-Authorization', b'test'), NeverIndexedHeaderTuple(b'proxy-authorization', b'really long test'), ] secured_cookie_headers = [ (u'cookie', u'short'), (u'Cookie', u'short'), (u'cookie', u'nineteen byte cooki'), HeaderTuple(u'cookie', u'short'), HeaderTuple(u'Cookie', u'short'), HeaderTuple(u'cookie', u'nineteen byte cooki'), NeverIndexedHeaderTuple(u'cookie', u'short'), NeverIndexedHeaderTuple(u'Cookie', u'short'), NeverIndexedHeaderTuple(u'cookie', u'nineteen byte cooki'), NeverIndexedHeaderTuple(u'cookie', u'longer manually secured cookie'), (b'cookie', b'short'), (b'Cookie', b'short'), (b'cookie', b'nineteen byte cooki'), HeaderTuple(b'cookie', b'short'), HeaderTuple(b'Cookie', b'short'), HeaderTuple(b'cookie', b'nineteen byte cooki'), NeverIndexedHeaderTuple(b'cookie', b'short'), NeverIndexedHeaderTuple(b'Cookie', b'short'), NeverIndexedHeaderTuple(b'cookie', b'nineteen byte cooki'), NeverIndexedHeaderTuple(b'cookie', b'longer manually secured cookie'), ] unsecured_cookie_headers = [ (u'cookie', u'twenty byte cookie!!'), (u'Cookie', u'twenty byte cookie!!'), (u'cookie', u'substantially longer than 20 byte cookie'), HeaderTuple(u'cookie', u'twenty byte cookie!!'), HeaderTuple(u'cookie', u'twenty byte cookie!!'), HeaderTuple(u'Cookie', u'twenty byte cookie!!'), (b'cookie', b'twenty byte cookie!!'), (b'Cookie', b'twenty byte cookie!!'), (b'cookie', b'substantially longer than 20 byte cookie'), HeaderTuple(b'cookie', b'twenty byte cookie!!'), HeaderTuple(b'cookie', b'twenty byte cookie!!'), HeaderTuple(b'Cookie', b'twenty byte cookie!!'), ] server_config = h2.config.H2Configuration(client_side=False) @pytest.mark.parametrize( 'headers', (example_request_headers, bytes_example_request_headers) ) @pytest.mark.parametrize('auth_header', possible_auth_headers) def test_authorization_headers_never_indexed(self, headers, auth_header, frame_factory): """ Authorization and Proxy-Authorization headers are always forced to be never-indexed, regardless of their form. """ # Regardless of what we send, we expect it to be never indexed. send_headers = headers + [auth_header] expected_headers = headers + [ NeverIndexedHeaderTuple(auth_header[0].lower(), auth_header[1]) ] c = h2.connection.H2Connection() c.initiate_connection() # Clear the data, then send headers. c.clear_outbound_data_buffer() c.send_headers(1, send_headers) f = frame_factory.build_headers_frame(headers=expected_headers) assert c.data_to_send() == f.serialize() @pytest.mark.parametrize( 'headers', (example_request_headers, bytes_example_request_headers) ) @pytest.mark.parametrize('auth_header', possible_auth_headers) def test_authorization_headers_never_indexed_push(self, headers, auth_header, frame_factory): """ Authorization and Proxy-Authorization headers are always forced to be never-indexed, regardless of their form, when pushed by a server. """ # Regardless of what we send, we expect it to be never indexed. send_headers = headers + [auth_header] expected_headers = headers + [ NeverIndexedHeaderTuple(auth_header[0].lower(), auth_header[1]) ] c = h2.connection.H2Connection(config=self.server_config) c.receive_data(frame_factory.preamble()) # We can use normal headers for the request. f = frame_factory.build_headers_frame( self.example_request_headers ) c.receive_data(f.serialize()) frame_factory.refresh_encoder() expected_frame = frame_factory.build_push_promise_frame( stream_id=1, promised_stream_id=2, headers=expected_headers, flags=['END_HEADERS'], ) c.clear_outbound_data_buffer() c.push_stream( stream_id=1, promised_stream_id=2, request_headers=send_headers ) assert c.data_to_send() == expected_frame.serialize() @pytest.mark.parametrize( 'headers', (example_request_headers, bytes_example_request_headers) ) @pytest.mark.parametrize('cookie_header', secured_cookie_headers) def test_short_cookie_headers_never_indexed(self, headers, cookie_header, frame_factory): """ Short cookie headers, and cookies provided as NeverIndexedHeaderTuple, are never indexed. """ # Regardless of what we send, we expect it to be never indexed. send_headers = headers + [cookie_header] expected_headers = headers + [ NeverIndexedHeaderTuple(cookie_header[0].lower(), cookie_header[1]) ] c = h2.connection.H2Connection() c.initiate_connection() # Clear the data, then send headers. c.clear_outbound_data_buffer() c.send_headers(1, send_headers) f = frame_factory.build_headers_frame(headers=expected_headers) assert c.data_to_send() == f.serialize() @pytest.mark.parametrize( 'headers', (example_request_headers, bytes_example_request_headers) ) @pytest.mark.parametrize('cookie_header', secured_cookie_headers) def test_short_cookie_headers_never_indexed_push(self, headers, cookie_header, frame_factory): """ Short cookie headers, and cookies provided as NeverIndexedHeaderTuple, are never indexed when pushed by servers. """ # Regardless of what we send, we expect it to be never indexed. send_headers = headers + [cookie_header] expected_headers = headers + [ NeverIndexedHeaderTuple(cookie_header[0].lower(), cookie_header[1]) ] c = h2.connection.H2Connection(config=self.server_config) c.receive_data(frame_factory.preamble()) # We can use normal headers for the request. f = frame_factory.build_headers_frame( self.example_request_headers ) c.receive_data(f.serialize()) frame_factory.refresh_encoder() expected_frame = frame_factory.build_push_promise_frame( stream_id=1, promised_stream_id=2, headers=expected_headers, flags=['END_HEADERS'], ) c.clear_outbound_data_buffer() c.push_stream( stream_id=1, promised_stream_id=2, request_headers=send_headers ) assert c.data_to_send() == expected_frame.serialize() @pytest.mark.parametrize( 'headers', (example_request_headers, bytes_example_request_headers) ) @pytest.mark.parametrize('cookie_header', unsecured_cookie_headers) def test_long_cookie_headers_can_be_indexed(self, headers, cookie_header, frame_factory): """ Longer cookie headers can be indexed. """ # Regardless of what we send, we expect it to be indexed. send_headers = headers + [cookie_header] expected_headers = headers + [ HeaderTuple(cookie_header[0].lower(), cookie_header[1]) ] c = h2.connection.H2Connection() c.initiate_connection() # Clear the data, then send headers. c.clear_outbound_data_buffer() c.send_headers(1, send_headers) f = frame_factory.build_headers_frame(headers=expected_headers) assert c.data_to_send() == f.serialize() @pytest.mark.parametrize( 'headers', (example_request_headers, bytes_example_request_headers) ) @pytest.mark.parametrize('cookie_header', unsecured_cookie_headers) def test_long_cookie_headers_can_be_indexed_push(self, headers, cookie_header, frame_factory): """ Longer cookie headers can be indexed. """ # Regardless of what we send, we expect it to be never indexed. send_headers = headers + [cookie_header] expected_headers = headers + [ HeaderTuple(cookie_header[0].lower(), cookie_header[1]) ] c = h2.connection.H2Connection(config=self.server_config) c.receive_data(frame_factory.preamble()) # We can use normal headers for the request. f = frame_factory.build_headers_frame( self.example_request_headers ) c.receive_data(f.serialize()) frame_factory.refresh_encoder() expected_frame = frame_factory.build_push_promise_frame( stream_id=1, promised_stream_id=2, headers=expected_headers, flags=['END_HEADERS'], ) c.clear_outbound_data_buffer() c.push_stream( stream_id=1, promised_stream_id=2, request_headers=send_headers ) assert c.data_to_send() == expected_frame.serialize() h2-3.1.1/test/test_informational_responses.py0000664000175000017500000003455213421652727022272 0ustar ubuntuubuntu00000000000000# -*- coding: utf-8 -*- """ test_informational_responses ~~~~~~~~~~~~~~~~~~~~~~~~~~ Tests that validate that hyper-h2 correctly handles informational (1XX) responses in its state machine. """ import pytest import h2.config import h2.connection import h2.events import h2.exceptions class TestReceivingInformationalResponses(object): """ Tests for receiving informational responses. """ example_request_headers = [ (b':authority', b'example.com'), (b':path', b'/'), (b':scheme', b'https'), (b':method', b'GET'), (b'expect', b'100-continue'), ] example_informational_headers = [ (b':status', b'100'), (b'server', b'fake-serv/0.1.0') ] example_response_headers = [ (b':status', b'200'), (b'server', b'fake-serv/0.1.0') ] example_trailers = [ (b'trailer', b'you-bet'), ] @pytest.mark.parametrize('end_stream', (True, False)) def test_single_informational_response(self, frame_factory, end_stream): """ When receiving a informational response, the appropriate event is signaled. """ c = h2.connection.H2Connection() c.initiate_connection() c.send_headers( stream_id=1, headers=self.example_request_headers, end_stream=end_stream ) f = frame_factory.build_headers_frame( headers=self.example_informational_headers, stream_id=1, ) events = c.receive_data(f.serialize()) assert len(events) == 1 event = events[0] assert isinstance(event, h2.events.InformationalResponseReceived) assert event.headers == self.example_informational_headers assert event.stream_id == 1 @pytest.mark.parametrize('end_stream', (True, False)) def test_receiving_multiple_header_blocks(self, frame_factory, end_stream): """ At least three header blocks can be received: informational, headers, trailers. """ c = h2.connection.H2Connection() c.initiate_connection() c.send_headers( stream_id=1, headers=self.example_request_headers, end_stream=end_stream ) f1 = frame_factory.build_headers_frame( headers=self.example_informational_headers, stream_id=1, ) f2 = frame_factory.build_headers_frame( headers=self.example_response_headers, stream_id=1, ) f3 = frame_factory.build_headers_frame( headers=self.example_trailers, stream_id=1, flags=['END_STREAM'], ) events = c.receive_data( f1.serialize() + f2.serialize() + f3.serialize() ) assert len(events) == 4 assert isinstance(events[0], h2.events.InformationalResponseReceived) assert events[0].headers == self.example_informational_headers assert events[0].stream_id == 1 assert isinstance(events[1], h2.events.ResponseReceived) assert events[1].headers == self.example_response_headers assert events[1].stream_id == 1 assert isinstance(events[2], h2.events.TrailersReceived) assert events[2].headers == self.example_trailers assert events[2].stream_id == 1 @pytest.mark.parametrize('end_stream', (True, False)) def test_receiving_multiple_informational_responses(self, frame_factory, end_stream): """ More than one informational response is allowed. """ c = h2.connection.H2Connection() c.initiate_connection() c.send_headers( stream_id=1, headers=self.example_request_headers, end_stream=end_stream ) f1 = frame_factory.build_headers_frame( headers=self.example_informational_headers, stream_id=1, ) f2 = frame_factory.build_headers_frame( headers=[(':status', '101')], stream_id=1, ) events = c.receive_data(f1.serialize() + f2.serialize()) assert len(events) == 2 assert isinstance(events[0], h2.events.InformationalResponseReceived) assert events[0].headers == self.example_informational_headers assert events[0].stream_id == 1 assert isinstance(events[1], h2.events.InformationalResponseReceived) assert events[1].headers == [(b':status', b'101')] assert events[1].stream_id == 1 @pytest.mark.parametrize('end_stream', (True, False)) def test_receive_provisional_response_with_end_stream(self, frame_factory, end_stream): """ Receiving provisional responses with END_STREAM set causes ProtocolErrors. """ c = h2.connection.H2Connection() c.initiate_connection() c.send_headers( stream_id=1, headers=self.example_request_headers, end_stream=end_stream ) c.clear_outbound_data_buffer() f = frame_factory.build_headers_frame( headers=self.example_informational_headers, stream_id=1, flags=['END_STREAM'] ) with pytest.raises(h2.exceptions.ProtocolError): c.receive_data(f.serialize()) expected = frame_factory.build_goaway_frame( last_stream_id=0, error_code=1, ) assert c.data_to_send() == expected.serialize() @pytest.mark.parametrize('end_stream', (True, False)) def test_receiving_out_of_order_headers(self, frame_factory, end_stream): """ When receiving a informational response after the actual response headers we consider it a ProtocolError and raise it. """ c = h2.connection.H2Connection() c.initiate_connection() c.send_headers( stream_id=1, headers=self.example_request_headers, end_stream=end_stream ) f1 = frame_factory.build_headers_frame( headers=self.example_response_headers, stream_id=1, ) f2 = frame_factory.build_headers_frame( headers=self.example_informational_headers, stream_id=1, ) c.receive_data(f1.serialize()) c.clear_outbound_data_buffer() with pytest.raises(h2.exceptions.ProtocolError): c.receive_data(f2.serialize()) expected = frame_factory.build_goaway_frame( last_stream_id=0, error_code=1, ) assert c.data_to_send() == expected.serialize() class TestSendingInformationalResponses(object): """ Tests for sending informational responses. """ example_request_headers = [ (b':authority', b'example.com'), (b':path', b'/'), (b':scheme', b'https'), (b':method', b'GET'), (b'expect', b'100-continue'), ] unicode_informational_headers = [ (u':status', u'100'), (u'server', u'fake-serv/0.1.0') ] bytes_informational_headers = [ (b':status', b'100'), (b'server', b'fake-serv/0.1.0') ] example_response_headers = [ (b':status', b'200'), (b'server', b'fake-serv/0.1.0') ] example_trailers = [ (b'trailer', b'you-bet'), ] server_config = h2.config.H2Configuration(client_side=False) @pytest.mark.parametrize( 'hdrs', (unicode_informational_headers, bytes_informational_headers), ) @pytest.mark.parametrize('end_stream', (True, False)) def test_single_informational_response(self, frame_factory, hdrs, end_stream): """ When sending a informational response, the appropriate frames are emitted. """ c = h2.connection.H2Connection(config=self.server_config) c.initiate_connection() c.receive_data(frame_factory.preamble()) flags = ['END_STREAM'] if end_stream else [] f = frame_factory.build_headers_frame( headers=self.example_request_headers, stream_id=1, flags=flags, ) c.receive_data(f.serialize()) c.clear_outbound_data_buffer() frame_factory.refresh_encoder() c.send_headers( stream_id=1, headers=hdrs ) f = frame_factory.build_headers_frame( headers=hdrs, stream_id=1, ) assert c.data_to_send() == f.serialize() @pytest.mark.parametrize( 'hdrs', (unicode_informational_headers, bytes_informational_headers), ) @pytest.mark.parametrize('end_stream', (True, False)) def test_sending_multiple_header_blocks(self, frame_factory, hdrs, end_stream): """ At least three header blocks can be sent: informational, headers, trailers. """ c = h2.connection.H2Connection(config=self.server_config) c.initiate_connection() c.receive_data(frame_factory.preamble()) flags = ['END_STREAM'] if end_stream else [] f = frame_factory.build_headers_frame( headers=self.example_request_headers, stream_id=1, flags=flags, ) c.receive_data(f.serialize()) c.clear_outbound_data_buffer() frame_factory.refresh_encoder() # Send the three header blocks. c.send_headers( stream_id=1, headers=hdrs ) c.send_headers( stream_id=1, headers=self.example_response_headers ) c.send_headers( stream_id=1, headers=self.example_trailers, end_stream=True ) # Check that we sent them properly. f1 = frame_factory.build_headers_frame( headers=hdrs, stream_id=1, ) f2 = frame_factory.build_headers_frame( headers=self.example_response_headers, stream_id=1, ) f3 = frame_factory.build_headers_frame( headers=self.example_trailers, stream_id=1, flags=['END_STREAM'] ) assert ( c.data_to_send() == f1.serialize() + f2.serialize() + f3.serialize() ) @pytest.mark.parametrize( 'hdrs', (unicode_informational_headers, bytes_informational_headers), ) @pytest.mark.parametrize('end_stream', (True, False)) def test_sending_multiple_informational_responses(self, frame_factory, hdrs, end_stream): """ More than one informational response is allowed. """ c = h2.connection.H2Connection(config=self.server_config) c.initiate_connection() c.receive_data(frame_factory.preamble()) flags = ['END_STREAM'] if end_stream else [] f = frame_factory.build_headers_frame( headers=self.example_request_headers, stream_id=1, flags=flags, ) c.receive_data(f.serialize()) c.clear_outbound_data_buffer() frame_factory.refresh_encoder() # Send two informational responses. c.send_headers( stream_id=1, headers=hdrs, ) c.send_headers( stream_id=1, headers=[(':status', '101')] ) # Check we sent them both. f1 = frame_factory.build_headers_frame( headers=hdrs, stream_id=1, ) f2 = frame_factory.build_headers_frame( headers=[(':status', '101')], stream_id=1, ) assert c.data_to_send() == f1.serialize() + f2.serialize() @pytest.mark.parametrize( 'hdrs', (unicode_informational_headers, bytes_informational_headers), ) @pytest.mark.parametrize('end_stream', (True, False)) def test_send_provisional_response_with_end_stream(self, frame_factory, hdrs, end_stream): """ Sending provisional responses with END_STREAM set causes ProtocolErrors. """ c = h2.connection.H2Connection(config=self.server_config) c.initiate_connection() c.receive_data(frame_factory.preamble()) flags = ['END_STREAM'] if end_stream else [] f = frame_factory.build_headers_frame( headers=self.example_request_headers, stream_id=1, flags=flags, ) c.receive_data(f.serialize()) with pytest.raises(h2.exceptions.ProtocolError): c.send_headers( stream_id=1, headers=hdrs, end_stream=True, ) @pytest.mark.parametrize( 'hdrs', (unicode_informational_headers, bytes_informational_headers), ) @pytest.mark.parametrize('end_stream', (True, False)) def test_reject_sending_out_of_order_headers(self, frame_factory, hdrs, end_stream): """ When sending an informational response after the actual response headers we consider it a ProtocolError and raise it. """ c = h2.connection.H2Connection(config=self.server_config) c.initiate_connection() c.receive_data(frame_factory.preamble()) flags = ['END_STREAM'] if end_stream else [] f = frame_factory.build_headers_frame( headers=self.example_request_headers, stream_id=1, flags=flags, ) c.receive_data(f.serialize()) c.send_headers( stream_id=1, headers=self.example_response_headers ) with pytest.raises(h2.exceptions.ProtocolError): c.send_headers( stream_id=1, headers=hdrs ) h2-3.1.1/test/test_interacting_stacks.py0000664000175000017500000001020413421652727021172 0ustar ubuntuubuntu00000000000000# -*- coding: utf-8 -*- """ test_interacting_stacks ~~~~~~~~~~~~~~~~~~~~~~~ These tests run two entities, a client and a server, in parallel threads. These two entities talk to each other, running what amounts to a number of carefully controlled simulations of real flows. This is to ensure that the stack as a whole behaves intelligently in both client and server cases. These tests are long, complex, and somewhat brittle, so they aren't in general recommended for writing the majority of test cases. Their purposes is primarily to validate that the top-level API of the library behaves as described. We should also consider writing helper functions to reduce the complexity of these tests, so that they can be written more easily, as they are remarkably useful. """ import coroutine_tests import h2.config import h2.connection import h2.events import h2.settings class TestCommunication(coroutine_tests.CoroutineTestCase): """ Test that two communicating state machines can work together. """ server_config = h2.config.H2Configuration(client_side=False) def test_basic_request_response(self): """ A request issued by hyper-h2 can be responded to by hyper-h2. """ request_headers = [ (b':method', b'GET'), (b':path', b'/'), (b':authority', b'example.com'), (b':scheme', b'https'), (b'user-agent', b'test-client/0.1.0'), ] response_headers = [ (b':status', b'204'), (b'server', b'test-server/0.1.0'), (b'content-length', b'0'), ] def client(): c = h2.connection.H2Connection() # Do the handshake. First send the preamble. c.initiate_connection() data = yield c.data_to_send() # Next, handle the remote preamble. events = c.receive_data(data) assert len(events) == 2 assert isinstance(events[0], h2.events.SettingsAcknowledged) assert isinstance(events[1], h2.events.RemoteSettingsChanged) changed = events[1].changed_settings assert ( changed[ h2.settings.SettingCodes.MAX_CONCURRENT_STREAMS ].new_value == 100 ) # Send a request. events = c.send_headers(1, request_headers, end_stream=True) assert not events data = yield c.data_to_send() # Validate the response. events = c.receive_data(data) assert len(events) == 2 assert isinstance(events[0], h2.events.ResponseReceived) assert events[0].stream_id == 1 assert events[0].headers == response_headers assert isinstance(events[1], h2.events.StreamEnded) assert events[1].stream_id == 1 @self.server def server(): c = h2.connection.H2Connection(config=self.server_config) # First, read for the preamble. data = yield events = c.receive_data(data) assert len(events) == 1 assert isinstance(events[0], h2.events.RemoteSettingsChanged) changed = events[0].changed_settings assert ( changed[ h2.settings.SettingCodes.MAX_CONCURRENT_STREAMS ].new_value == 100 ) # Send our preamble back. c.initiate_connection() data = yield c.data_to_send() # Listen for the request. events = c.receive_data(data) assert len(events) == 3 assert isinstance(events[0], h2.events.SettingsAcknowledged) assert isinstance(events[1], h2.events.RequestReceived) assert events[1].stream_id == 1 assert events[1].headers == request_headers assert isinstance(events[2], h2.events.StreamEnded) assert events[2].stream_id == 1 # Send our response. events = c.send_headers(1, response_headers, end_stream=True) assert not events yield c.data_to_send() self.run_until_complete(client(), server()) h2-3.1.1/test/test_invalid_content_lengths.py0000664000175000017500000001110113421652727022214 0ustar ubuntuubuntu00000000000000# -*- coding: utf-8 -*- """ test_invalid_content_lengths.py ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This module contains tests that use invalid content lengths, and validates that they fail appropriately. """ import pytest import h2.config import h2.connection import h2.errors import h2.events import h2.exceptions class TestInvalidContentLengths(object): """ Hyper-h2 raises Protocol Errors when the content-length sent by a remote peer is not valid. """ example_request_headers = [ (':authority', 'example.com'), (':path', '/'), (':scheme', 'https'), (':method', 'POST'), ('content-length', '15'), ] example_response_headers = [ (':status', '200'), ('server', 'fake-serv/0.1.0') ] server_config = h2.config.H2Configuration(client_side=False) def test_too_much_data(self, frame_factory): """ Remote peers sending data in excess of content-length causes Protocol Errors. """ c = h2.connection.H2Connection(config=self.server_config) c.initiate_connection() c.receive_data(frame_factory.preamble()) headers = frame_factory.build_headers_frame( headers=self.example_request_headers ) first_data = frame_factory.build_data_frame(data=b'\x01'*15) c.receive_data(headers.serialize() + first_data.serialize()) c.clear_outbound_data_buffer() second_data = frame_factory.build_data_frame(data=b'\x01') with pytest.raises(h2.exceptions.InvalidBodyLengthError) as exp: c.receive_data(second_data.serialize()) assert exp.value.expected_length == 15 assert exp.value.actual_length == 16 assert str(exp.value) == ( "InvalidBodyLengthError: Expected 15 bytes, received 16" ) expected_frame = frame_factory.build_goaway_frame( last_stream_id=1, error_code=h2.errors.ErrorCodes.PROTOCOL_ERROR, ) assert c.data_to_send() == expected_frame.serialize() def test_insufficient_data(self, frame_factory): """ Remote peers sending less data than content-length causes Protocol Errors. """ c = h2.connection.H2Connection(config=self.server_config) c.initiate_connection() c.receive_data(frame_factory.preamble()) headers = frame_factory.build_headers_frame( headers=self.example_request_headers ) first_data = frame_factory.build_data_frame(data=b'\x01'*13) c.receive_data(headers.serialize() + first_data.serialize()) c.clear_outbound_data_buffer() second_data = frame_factory.build_data_frame( data=b'\x01', flags=['END_STREAM'], ) with pytest.raises(h2.exceptions.InvalidBodyLengthError) as exp: c.receive_data(second_data.serialize()) assert exp.value.expected_length == 15 assert exp.value.actual_length == 14 assert str(exp.value) == ( "InvalidBodyLengthError: Expected 15 bytes, received 14" ) expected_frame = frame_factory.build_goaway_frame( last_stream_id=1, error_code=h2.errors.ErrorCodes.PROTOCOL_ERROR, ) assert c.data_to_send() == expected_frame.serialize() def test_insufficient_data_empty_frame(self, frame_factory): """ Remote peers sending less data than content-length where the last data frame is empty causes Protocol Errors. """ c = h2.connection.H2Connection(config=self.server_config) c.initiate_connection() c.receive_data(frame_factory.preamble()) headers = frame_factory.build_headers_frame( headers=self.example_request_headers ) first_data = frame_factory.build_data_frame(data=b'\x01'*14) c.receive_data(headers.serialize() + first_data.serialize()) c.clear_outbound_data_buffer() second_data = frame_factory.build_data_frame( data=b'', flags=['END_STREAM'], ) with pytest.raises(h2.exceptions.InvalidBodyLengthError) as exp: c.receive_data(second_data.serialize()) assert exp.value.expected_length == 15 assert exp.value.actual_length == 14 assert str(exp.value) == ( "InvalidBodyLengthError: Expected 15 bytes, received 14" ) expected_frame = frame_factory.build_goaway_frame( last_stream_id=1, error_code=h2.errors.ErrorCodes.PROTOCOL_ERROR, ) assert c.data_to_send() == expected_frame.serialize() h2-3.1.1/test/test_invalid_frame_sequences.py0000664000175000017500000004067413421652727022204 0ustar ubuntuubuntu00000000000000# -*- coding: utf-8 -*- """ test_invalid_frame_sequences.py ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This module contains tests that use invalid frame sequences, and validates that they fail appropriately. """ import pytest import h2.config import h2.connection import h2.errors import h2.events import h2.exceptions class TestInvalidFrameSequences(object): """ Invalid frame sequences, either sent or received, cause ProtocolErrors to be thrown. """ example_request_headers = [ (':authority', 'example.com'), (':path', '/'), (':scheme', 'https'), (':method', 'GET'), ] example_response_headers = [ (':status', '200'), ('server', 'fake-serv/0.1.0') ] server_config = h2.config.H2Configuration(client_side=False) def test_cannot_send_on_closed_stream(self): """ When we've closed a stream locally, we cannot send further data. """ c = h2.connection.H2Connection() c.initiate_connection() c.send_headers(1, self.example_request_headers, end_stream=True) with pytest.raises(h2.exceptions.ProtocolError): c.send_data(1, b'some data') def test_missing_preamble_errors(self): """ Server side connections require the preamble. """ c = h2.connection.H2Connection(config=self.server_config) encoded_headers_frame = ( b'\x00\x00\r\x01\x04\x00\x00\x00\x01' b'A\x88/\x91\xd3]\x05\\\x87\xa7\x84\x87\x82' ) with pytest.raises(h2.exceptions.ProtocolError): c.receive_data(encoded_headers_frame) def test_server_connections_reject_even_streams(self, frame_factory): """ Servers do not allow clients to initiate even-numbered streams. """ c = h2.connection.H2Connection(config=self.server_config) c.initiate_connection() c.receive_data(frame_factory.preamble()) f = frame_factory.build_headers_frame( self.example_request_headers, stream_id=2 ) with pytest.raises(h2.exceptions.ProtocolError): c.receive_data(f.serialize()) def test_clients_reject_odd_stream_pushes(self, frame_factory): """ Clients do not allow servers to push odd numbered streams. """ c = h2.connection.H2Connection() c.initiate_connection() c.send_headers(1, self.example_request_headers, end_stream=True) f = frame_factory.build_push_promise_frame( stream_id=1, headers=self.example_request_headers, promised_stream_id=3 ) with pytest.raises(h2.exceptions.ProtocolError): c.receive_data(f.serialize()) def test_can_handle_frames_with_invalid_padding(self, frame_factory): """ Frames with invalid padding cause connection teardown. """ c = h2.connection.H2Connection(config=self.server_config) c.initiate_connection() c.receive_data(frame_factory.preamble()) f = frame_factory.build_headers_frame(self.example_request_headers) c.receive_data(f.serialize()) c.clear_outbound_data_buffer() invalid_data_frame = ( b'\x00\x00\x05\x00\x0b\x00\x00\x00\x01\x06\x54\x65\x73\x74' ) with pytest.raises(h2.exceptions.ProtocolError): c.receive_data(invalid_data_frame) expected_frame = frame_factory.build_goaway_frame( last_stream_id=1, error_code=1 ) assert c.data_to_send() == expected_frame.serialize() def test_receiving_frames_with_insufficent_size(self, frame_factory): """ Frames with not enough data cause connection teardown. """ c = h2.connection.H2Connection(config=self.server_config) c.initiate_connection() c.receive_data(frame_factory.preamble()) c.clear_outbound_data_buffer() invalid_window_update_frame = ( b'\x00\x00\x03\x08\x00\x00\x00\x00\x00\x00\x00\x02' ) with pytest.raises(h2.exceptions.FrameDataMissingError): c.receive_data(invalid_window_update_frame) expected_frame = frame_factory.build_goaway_frame( last_stream_id=0, error_code=h2.errors.ErrorCodes.FRAME_SIZE_ERROR ) assert c.data_to_send() == expected_frame.serialize() def test_reject_data_on_closed_streams(self, frame_factory): """ When a stream is not open to the remote peer, we reject receiving data frames from them. """ c = h2.connection.H2Connection(config=self.server_config) c.initiate_connection() c.receive_data(frame_factory.preamble()) f = frame_factory.build_headers_frame( self.example_request_headers, flags=['END_STREAM'] ) c.receive_data(f.serialize()) c.clear_outbound_data_buffer() bad_frame = frame_factory.build_data_frame(data=b'hello') c.receive_data(bad_frame.serialize()) expected_frame = frame_factory.build_rst_stream_frame( stream_id=1, error_code=0x5, ) assert c.data_to_send() == expected_frame.serialize() def test_unexpected_continuation_on_closed_stream(self, frame_factory): """ CONTINUATION frames received on closed streams cause connection errors of type PROTOCOL_ERROR. """ c = h2.connection.H2Connection(config=self.server_config) c.initiate_connection() c.receive_data(frame_factory.preamble()) f = frame_factory.build_headers_frame( self.example_request_headers, flags=['END_STREAM'] ) c.receive_data(f.serialize()) c.clear_outbound_data_buffer() bad_frame = frame_factory.build_continuation_frame( header_block=b'hello' ) with pytest.raises(h2.exceptions.ProtocolError): c.receive_data(bad_frame.serialize()) expected_frame = frame_factory.build_goaway_frame( error_code=h2.errors.ErrorCodes.PROTOCOL_ERROR, last_stream_id=1 ) assert c.data_to_send() == expected_frame.serialize() def test_prevent_continuation_dos(self, frame_factory): """ Receiving too many CONTINUATION frames in one block causes a protocol error. """ c = h2.connection.H2Connection(config=self.server_config) c.initiate_connection() c.receive_data(frame_factory.preamble()) f = frame_factory.build_headers_frame( self.example_request_headers, ) f.flags = {'END_STREAM'} c.receive_data(f.serialize()) c.clear_outbound_data_buffer() # Send 63 additional frames. for _ in range(0, 63): extra_frame = frame_factory.build_continuation_frame( header_block=b'hello' ) c.receive_data(extra_frame.serialize()) # The final continuation frame should cause a protocol error. extra_frame = frame_factory.build_continuation_frame( header_block=b'hello' ) with pytest.raises(h2.exceptions.ProtocolError): c.receive_data(extra_frame.serialize()) expected_frame = frame_factory.build_goaway_frame( last_stream_id=0, error_code=0x1, ) assert c.data_to_send() == expected_frame.serialize() # These settings are a bit annoyingly anonymous, but trust me, they're bad. @pytest.mark.parametrize( "settings", [ {0x2: 5}, {0x4: 2**31}, {0x5: 5}, {0x5: 2**24}, ] ) def test_reject_invalid_settings_values(self, frame_factory, settings): """ When a SETTINGS frame is received with invalid settings values it causes connection teardown with the appropriate error code. """ c = h2.connection.H2Connection(config=self.server_config) c.initiate_connection() c.receive_data(frame_factory.preamble()) f = frame_factory.build_settings_frame(settings=settings) with pytest.raises(h2.exceptions.InvalidSettingsValueError) as e: c.receive_data(f.serialize()) assert e.value.error_code == ( h2.errors.ErrorCodes.FLOW_CONTROL_ERROR if 0x4 in settings else h2.errors.ErrorCodes.PROTOCOL_ERROR ) def test_invalid_frame_headers_are_protocol_errors(self, frame_factory): """ When invalid frame headers are received they cause ProtocolErrors to be raised. """ c = h2.connection.H2Connection(config=self.server_config) c.initiate_connection() c.receive_data(frame_factory.preamble()) f = frame_factory.build_headers_frame( headers=self.example_request_headers ) # Do some annoying bit twiddling here: the stream ID is currently set # to '1', change it to '0'. Grab the first 9 bytes (the frame header), # replace any instances of the byte '\x01', and then graft it onto the # remaining bytes. frame_data = f.serialize() frame_data = frame_data[:9].replace(b'\x01', b'\x00') + frame_data[9:] with pytest.raises(h2.exceptions.ProtocolError) as e: c.receive_data(frame_data) assert "Stream ID must be non-zero" in str(e.value) def test_get_stream_reset_event_on_auto_reset(self, frame_factory): """ When hyper-h2 resets a stream automatically, a StreamReset event fires. """ c = h2.connection.H2Connection(config=self.server_config) c.initiate_connection() c.receive_data(frame_factory.preamble()) f = frame_factory.build_headers_frame( self.example_request_headers, flags=['END_STREAM'] ) c.receive_data(f.serialize()) c.clear_outbound_data_buffer() bad_frame = frame_factory.build_data_frame( data=b'hello' ) events = c.receive_data(bad_frame.serialize()) expected_frame = frame_factory.build_rst_stream_frame( stream_id=1, error_code=0x5, ) assert c.data_to_send() == expected_frame.serialize() assert len(events) == 1 event = events[0] assert isinstance(event, h2.events.StreamReset) assert event.stream_id == 1 assert event.error_code == h2.errors.ErrorCodes.STREAM_CLOSED assert not event.remote_reset def test_one_one_stream_reset(self, frame_factory): """ When hyper-h2 resets a stream automatically, a StreamReset event fires, but only for the first reset: the others are silent. """ c = h2.connection.H2Connection(config=self.server_config) c.initiate_connection() c.receive_data(frame_factory.preamble()) f = frame_factory.build_headers_frame( self.example_request_headers, flags=['END_STREAM'] ) c.receive_data(f.serialize()) c.clear_outbound_data_buffer() bad_frame = frame_factory.build_data_frame( data=b'hello' ) # Receive 5 frames. events = c.receive_data(bad_frame.serialize() * 5) expected_frame = frame_factory.build_rst_stream_frame( stream_id=1, error_code=0x5, ) assert c.data_to_send() == expected_frame.serialize() * 5 assert len(events) == 1 event = events[0] assert isinstance(event, h2.events.StreamReset) assert event.stream_id == 1 assert event.error_code == h2.errors.ErrorCodes.STREAM_CLOSED assert not event.remote_reset @pytest.mark.parametrize('value', ['', 'twelve']) def test_error_on_invalid_content_length(self, frame_factory, value): """ When an invalid content-length is received, a ProtocolError is thrown. """ c = h2.connection.H2Connection(config=self.server_config) c.initiate_connection() c.receive_data(frame_factory.preamble()) c.clear_outbound_data_buffer() f = frame_factory.build_headers_frame( stream_id=1, headers=self.example_request_headers + [('content-length', value)] ) with pytest.raises(h2.exceptions.ProtocolError): c.receive_data(f.serialize()) expected_frame = frame_factory.build_goaway_frame( last_stream_id=1, error_code=h2.errors.ErrorCodes.PROTOCOL_ERROR ) assert c.data_to_send() == expected_frame.serialize() def test_invalid_header_data_protocol_error(self, frame_factory): """ If an invalid header block is received, we raise a ProtocolError. """ c = h2.connection.H2Connection(config=self.server_config) c.initiate_connection() c.receive_data(frame_factory.preamble()) c.clear_outbound_data_buffer() f = frame_factory.build_headers_frame( stream_id=1, headers=self.example_request_headers ) f.data = b'\x00\x00\x00\x00' with pytest.raises(h2.exceptions.ProtocolError): c.receive_data(f.serialize()) expected_frame = frame_factory.build_goaway_frame( last_stream_id=0, error_code=h2.errors.ErrorCodes.PROTOCOL_ERROR ) assert c.data_to_send() == expected_frame.serialize() def test_invalid_push_promise_data_protocol_error(self, frame_factory): """ If an invalid header block is received on a PUSH_PROMISE, we raise a ProtocolError. """ c = h2.connection.H2Connection() c.initiate_connection() c.send_headers(stream_id=1, headers=self.example_request_headers) c.clear_outbound_data_buffer() f = frame_factory.build_push_promise_frame( stream_id=1, promised_stream_id=2, headers=self.example_request_headers ) f.data = b'\x00\x00\x00\x00' with pytest.raises(h2.exceptions.ProtocolError): c.receive_data(f.serialize()) expected_frame = frame_factory.build_goaway_frame( last_stream_id=0, error_code=h2.errors.ErrorCodes.PROTOCOL_ERROR ) assert c.data_to_send() == expected_frame.serialize() def test_cannot_receive_push_on_pushed_stream(self, frame_factory): """ If a PUSH_PROMISE frame is received with the parent stream ID being a pushed stream, this is rejected with a PROTOCOL_ERROR. """ c = h2.connection.H2Connection() c.initiate_connection() c.send_headers( stream_id=1, headers=self.example_request_headers, end_stream=True ) f1 = frame_factory.build_push_promise_frame( stream_id=1, promised_stream_id=2, headers=self.example_request_headers, ) f2 = frame_factory.build_headers_frame( stream_id=2, headers=self.example_response_headers, ) c.receive_data(f1.serialize() + f2.serialize()) c.clear_outbound_data_buffer() f = frame_factory.build_push_promise_frame( stream_id=2, promised_stream_id=4, headers=self.example_request_headers, ) with pytest.raises(h2.exceptions.ProtocolError): c.receive_data(f.serialize()) expected_frame = frame_factory.build_goaway_frame( last_stream_id=2, error_code=h2.errors.ErrorCodes.PROTOCOL_ERROR ) assert c.data_to_send() == expected_frame.serialize() def test_cannot_send_push_on_pushed_stream(self, frame_factory): """ If a user tries to send a PUSH_PROMISE frame with the parent stream ID being a pushed stream, this is rejected with a PROTOCOL_ERROR. """ c = h2.connection.H2Connection(config=self.server_config) c.initiate_connection() c.receive_data(frame_factory.preamble()) f = frame_factory.build_headers_frame( stream_id=1, headers=self.example_request_headers ) c.receive_data(f.serialize()) c.push_stream( stream_id=1, promised_stream_id=2, request_headers=self.example_request_headers ) c.send_headers(stream_id=2, headers=self.example_response_headers) with pytest.raises(h2.exceptions.ProtocolError): c.push_stream( stream_id=2, promised_stream_id=4, request_headers=self.example_request_headers ) h2-3.1.1/test/test_invalid_headers.py0000664000175000017500000010271713521033071020431 0ustar ubuntuubuntu00000000000000# -*- coding: utf-8 -*- """ test_invalid_headers.py ~~~~~~~~~~~~~~~~~~~~~~~ This module contains tests that use invalid header blocks, and validates that they fail appropriately. """ import itertools import pytest import h2.config import h2.connection import h2.errors import h2.events import h2.exceptions import h2.settings import h2.utilities import hyperframe.frame from hypothesis import given from hypothesis.strategies import binary, lists, tuples HEADERS_STRATEGY = lists(tuples(binary(min_size=1), binary())) class TestInvalidFrameSequences(object): """ Invalid header sequences cause ProtocolErrors to be thrown when received. """ base_request_headers = [ (':authority', 'example.com'), (':path', '/'), (':scheme', 'https'), (':method', 'GET'), ('user-agent', 'someua/0.0.1'), ] invalid_header_blocks = [ base_request_headers + [('Uppercase', 'name')], base_request_headers + [(':late', 'pseudo-header')], [(':path', 'duplicate-pseudo-header')] + base_request_headers, base_request_headers + [('connection', 'close')], base_request_headers + [('proxy-connection', 'close')], base_request_headers + [('keep-alive', 'close')], base_request_headers + [('transfer-encoding', 'gzip')], base_request_headers + [('upgrade', 'super-protocol/1.1')], base_request_headers + [('te', 'chunked')], base_request_headers + [('host', 'notexample.com')], base_request_headers + [(' name', 'name with leading space')], base_request_headers + [('name ', 'name with trailing space')], base_request_headers + [('name', ' value with leading space')], base_request_headers + [('name', 'value with trailing space ')], [header for header in base_request_headers if header[0] != ':authority'], [(':protocol', 'websocket')] + base_request_headers, ] server_config = h2.config.H2Configuration( client_side=False, header_encoding='utf-8' ) @pytest.mark.parametrize('headers', invalid_header_blocks) def test_headers_event(self, frame_factory, headers): """ Test invalid headers are rejected with PROTOCOL_ERROR. """ c = h2.connection.H2Connection(config=self.server_config) c.receive_data(frame_factory.preamble()) c.clear_outbound_data_buffer() f = frame_factory.build_headers_frame(headers) data = f.serialize() with pytest.raises(h2.exceptions.ProtocolError): c.receive_data(data) expected_frame = frame_factory.build_goaway_frame( last_stream_id=1, error_code=h2.errors.ErrorCodes.PROTOCOL_ERROR ) assert c.data_to_send() == expected_frame.serialize() @pytest.mark.parametrize('headers', invalid_header_blocks) def test_push_promise_event(self, frame_factory, headers): """ If a PUSH_PROMISE header frame is received with an invalid header block it is rejected with a PROTOCOL_ERROR. """ c = h2.connection.H2Connection() c.initiate_connection() c.send_headers( stream_id=1, headers=self.base_request_headers, end_stream=True ) c.clear_outbound_data_buffer() f = frame_factory.build_push_promise_frame( stream_id=1, promised_stream_id=2, headers=headers ) data = f.serialize() with pytest.raises(h2.exceptions.ProtocolError): c.receive_data(data) expected_frame = frame_factory.build_goaway_frame( last_stream_id=0, error_code=h2.errors.ErrorCodes.PROTOCOL_ERROR ) assert c.data_to_send() == expected_frame.serialize() @pytest.mark.parametrize('headers', invalid_header_blocks) def test_push_promise_skipping_validation(self, frame_factory, headers): """ If we have ``validate_inbound_headers`` disabled, then invalid header blocks in push promise frames are allowed to pass. """ config = h2.config.H2Configuration( client_side=True, validate_inbound_headers=False, header_encoding='utf-8' ) c = h2.connection.H2Connection(config=config) c.initiate_connection() c.send_headers( stream_id=1, headers=self.base_request_headers, end_stream=True ) c.clear_outbound_data_buffer() f = frame_factory.build_push_promise_frame( stream_id=1, promised_stream_id=2, headers=headers ) data = f.serialize() events = c.receive_data(data) assert len(events) == 1 pp_event = events[0] assert pp_event.headers == headers @pytest.mark.parametrize('headers', invalid_header_blocks) def test_headers_event_skipping_validation(self, frame_factory, headers): """ If we have ``validate_inbound_headers`` disabled, then all of these invalid header blocks are allowed to pass. """ config = h2.config.H2Configuration( client_side=False, validate_inbound_headers=False, header_encoding='utf-8' ) c = h2.connection.H2Connection(config=config) c.receive_data(frame_factory.preamble()) f = frame_factory.build_headers_frame(headers) data = f.serialize() events = c.receive_data(data) assert len(events) == 1 request_event = events[0] assert request_event.headers == headers def test_transfer_encoding_trailers_is_valid(self, frame_factory): """ Transfer-Encoding trailers is allowed by the filter. """ headers = ( self.base_request_headers + [('te', 'trailers')] ) c = h2.connection.H2Connection(config=self.server_config) c.receive_data(frame_factory.preamble()) f = frame_factory.build_headers_frame(headers) data = f.serialize() events = c.receive_data(data) assert len(events) == 1 request_event = events[0] assert request_event.headers == headers def test_pseudo_headers_rejected_in_trailer(self, frame_factory): """ Ensure we reject pseudo headers included in trailers """ trailers = [(':path', '/'), ('extra', 'value')] c = h2.connection.H2Connection(config=self.server_config) c.receive_data(frame_factory.preamble()) c.clear_outbound_data_buffer() header_frame = frame_factory.build_headers_frame( self.base_request_headers ) trailer_frame = frame_factory.build_headers_frame( trailers, flags=["END_STREAM"] ) head = header_frame.serialize() trailer = trailer_frame.serialize() c.receive_data(head) # Raise exception if pseudo header in trailer with pytest.raises(h2.exceptions.ProtocolError) as e: c.receive_data(trailer) assert "pseudo-header in trailer" in str(e.value) # Test appropriate response frame is generated expected_frame = frame_factory.build_goaway_frame( last_stream_id=1, error_code=h2.errors.ErrorCodes.PROTOCOL_ERROR ) assert c.data_to_send() == expected_frame.serialize() class TestSendingInvalidFrameSequences(object): """ Trying to send invalid header sequences cause ProtocolErrors to be thrown. """ base_request_headers = [ (':authority', 'example.com'), (':path', '/'), (':scheme', 'https'), (':method', 'GET'), ('user-agent', 'someua/0.0.1'), ] invalid_header_blocks = [ base_request_headers + [(':late', 'pseudo-header')], [(':path', 'duplicate-pseudo-header')] + base_request_headers, base_request_headers + [('te', 'chunked')], base_request_headers + [('host', 'notexample.com')], [header for header in base_request_headers if header[0] != ':authority'], ] strippable_header_blocks = [ base_request_headers + [('connection', 'close')], base_request_headers + [('proxy-connection', 'close')], base_request_headers + [('keep-alive', 'close')], base_request_headers + [('transfer-encoding', 'gzip')], base_request_headers + [('upgrade', 'super-protocol/1.1')] ] all_header_blocks = invalid_header_blocks + strippable_header_blocks server_config = h2.config.H2Configuration(client_side=False) @pytest.mark.parametrize('headers', invalid_header_blocks) def test_headers_event(self, frame_factory, headers): """ Test sending invalid headers raise a ProtocolError. """ c = h2.connection.H2Connection() c.initiate_connection() # Clear the data, then try to send headers. c.clear_outbound_data_buffer() with pytest.raises(h2.exceptions.ProtocolError): c.send_headers(1, headers) @pytest.mark.parametrize('headers', invalid_header_blocks) def test_send_push_promise(self, frame_factory, headers): """ Sending invalid headers in a push promise raises a ProtocolError. """ c = h2.connection.H2Connection(config=self.server_config) c.initiate_connection() c.receive_data(frame_factory.preamble()) header_frame = frame_factory.build_headers_frame( self.base_request_headers ) c.receive_data(header_frame.serialize()) # Clear the data, then try to send a push promise. c.clear_outbound_data_buffer() with pytest.raises(h2.exceptions.ProtocolError): c.push_stream( stream_id=1, promised_stream_id=2, request_headers=headers ) @pytest.mark.parametrize('headers', all_header_blocks) def test_headers_event_skipping_validation(self, frame_factory, headers): """ If we have ``validate_outbound_headers`` disabled, then all of these invalid header blocks are allowed to pass. """ config = h2.config.H2Configuration( validate_outbound_headers=False ) c = h2.connection.H2Connection(config=config) c.initiate_connection() # Clear the data, then send headers. c.clear_outbound_data_buffer() c.send_headers(1, headers) # Ensure headers are still normalized. norm_headers = h2.utilities.normalize_outbound_headers(headers, None) f = frame_factory.build_headers_frame(norm_headers) assert c.data_to_send() == f.serialize() @pytest.mark.parametrize('headers', all_header_blocks) def test_push_promise_skipping_validation(self, frame_factory, headers): """ If we have ``validate_outbound_headers`` disabled, then all of these invalid header blocks are allowed to pass. """ config = h2.config.H2Configuration( client_side=False, validate_outbound_headers=False, ) c = h2.connection.H2Connection(config=config) c.initiate_connection() c.receive_data(frame_factory.preamble()) header_frame = frame_factory.build_headers_frame( self.base_request_headers ) c.receive_data(header_frame.serialize()) # Create push promise frame with normalized headers. frame_factory.refresh_encoder() norm_headers = h2.utilities.normalize_outbound_headers(headers, None) pp_frame = frame_factory.build_push_promise_frame( stream_id=1, promised_stream_id=2, headers=norm_headers ) # Clear the data, then send a push promise. c.clear_outbound_data_buffer() c.push_stream( stream_id=1, promised_stream_id=2, request_headers=headers ) assert c.data_to_send() == pp_frame.serialize() @pytest.mark.parametrize('headers', all_header_blocks) def test_headers_event_skip_normalization(self, frame_factory, headers): """ If we have ``normalize_outbound_headers`` disabled, then all of these invalid header blocks are sent through unmodified. """ config = h2.config.H2Configuration( validate_outbound_headers=False, normalize_outbound_headers=False ) c = h2.connection.H2Connection(config=config) c.initiate_connection() f = frame_factory.build_headers_frame( headers, stream_id=1, ) # Clear the data, then send headers. c.clear_outbound_data_buffer() c.send_headers(1, headers) assert c.data_to_send() == f.serialize() @pytest.mark.parametrize('headers', all_header_blocks) def test_push_promise_skip_normalization(self, frame_factory, headers): """ If we have ``normalize_outbound_headers`` disabled, then all of these invalid header blocks are allowed to pass unmodified. """ config = h2.config.H2Configuration( client_side=False, validate_outbound_headers=False, normalize_outbound_headers=False, ) c = h2.connection.H2Connection(config=config) c.initiate_connection() c.receive_data(frame_factory.preamble()) header_frame = frame_factory.build_headers_frame( self.base_request_headers ) c.receive_data(header_frame.serialize()) frame_factory.refresh_encoder() pp_frame = frame_factory.build_push_promise_frame( stream_id=1, promised_stream_id=2, headers=headers ) # Clear the data, then send a push promise. c.clear_outbound_data_buffer() c.push_stream( stream_id=1, promised_stream_id=2, request_headers=headers ) assert c.data_to_send() == pp_frame.serialize() @pytest.mark.parametrize('headers', strippable_header_blocks) def test_strippable_headers(self, frame_factory, headers): """ Test connection related headers are removed before sending. """ c = h2.connection.H2Connection() c.initiate_connection() # Clear the data, then try to send headers. c.clear_outbound_data_buffer() c.send_headers(1, headers) f = frame_factory.build_headers_frame(self.base_request_headers) assert c.data_to_send() == f.serialize() class TestFilter(object): """ Test the filter function directly. These tests exists to confirm the behaviour of the filter function in a wide range of scenarios. Many of these scenarios may not be legal for HTTP/2 and so may never hit the function, but it's worth validating that it behaves as expected anyway. """ validation_functions = [ h2.utilities.validate_headers, h2.utilities.validate_outbound_headers ] hdr_validation_combos = [ h2.utilities.HeaderValidationFlags( is_client, is_trailer, is_response_header, is_push_promise ) for is_client, is_trailer, is_response_header, is_push_promise in ( itertools.product([True, False], repeat=4) ) ] hdr_validation_response_headers = [ flags for flags in hdr_validation_combos if flags.is_response_header ] hdr_validation_request_headers_no_trailer = [ flags for flags in hdr_validation_combos if not (flags.is_trailer or flags.is_response_header) ] invalid_request_header_blocks_bytes = ( # First, missing :method ( (b':authority', b'google.com'), (b':path', b'/'), (b':scheme', b'https'), ), # Next, missing :path ( (b':authority', b'google.com'), (b':method', b'GET'), (b':scheme', b'https'), ), # Next, missing :scheme ( (b':authority', b'google.com'), (b':method', b'GET'), (b':path', b'/'), ), # Finally, path present but empty. ( (b':authority', b'google.com'), (b':method', b'GET'), (b':scheme', b'https'), (b':path', b''), ), ) invalid_request_header_blocks_unicode = ( # First, missing :method ( (u':authority', u'google.com'), (u':path', u'/'), (u':scheme', u'https'), ), # Next, missing :path ( (u':authority', u'google.com'), (u':method', u'GET'), (u':scheme', u'https'), ), # Next, missing :scheme ( (u':authority', u'google.com'), (u':method', u'GET'), (u':path', u'/'), ), # Finally, path present but empty. ( (u':authority', u'google.com'), (u':method', u'GET'), (u':scheme', u'https'), (u':path', u''), ), ) # All headers that are forbidden from either request or response blocks. forbidden_request_headers_bytes = (b':status',) forbidden_request_headers_unicode = (u':status',) forbidden_response_headers_bytes = ( b':path', b':scheme', b':authority', b':method' ) forbidden_response_headers_unicode = ( u':path', u':scheme', u':authority', u':method' ) @pytest.mark.parametrize('validation_function', validation_functions) @pytest.mark.parametrize('hdr_validation_flags', hdr_validation_combos) @given(headers=HEADERS_STRATEGY) def test_range_of_acceptable_outputs(self, headers, validation_function, hdr_validation_flags): """ The header validation functions either return the data unchanged or throw a ProtocolError. """ try: assert headers == list(validation_function( headers, hdr_validation_flags)) except h2.exceptions.ProtocolError: assert True @pytest.mark.parametrize('hdr_validation_flags', hdr_validation_combos) def test_invalid_pseudo_headers(self, hdr_validation_flags): headers = [(b':custom', b'value')] with pytest.raises(h2.exceptions.ProtocolError): list(h2.utilities.validate_headers(headers, hdr_validation_flags)) @pytest.mark.parametrize('validation_function', validation_functions) @pytest.mark.parametrize( 'hdr_validation_flags', hdr_validation_request_headers_no_trailer ) def test_matching_authority_host_headers(self, validation_function, hdr_validation_flags): """ If a header block has :authority and Host headers and they match, the headers should pass through unchanged. """ headers = [ (b':authority', b'example.com'), (b':path', b'/'), (b':scheme', b'https'), (b':method', b'GET'), (b'host', b'example.com'), ] assert headers == list(h2.utilities.validate_headers( headers, hdr_validation_flags )) @pytest.mark.parametrize( 'hdr_validation_flags', hdr_validation_response_headers ) def test_response_header_without_status(self, hdr_validation_flags): headers = [(b'content-length', b'42')] with pytest.raises(h2.exceptions.ProtocolError): list(h2.utilities.validate_headers(headers, hdr_validation_flags)) @pytest.mark.parametrize( 'hdr_validation_flags', hdr_validation_request_headers_no_trailer ) @pytest.mark.parametrize( 'header_block', ( invalid_request_header_blocks_bytes + invalid_request_header_blocks_unicode ) ) def test_outbound_req_header_missing_pseudo_headers(self, hdr_validation_flags, header_block): with pytest.raises(h2.exceptions.ProtocolError): list( h2.utilities.validate_outbound_headers( header_block, hdr_validation_flags ) ) @pytest.mark.parametrize( 'hdr_validation_flags', hdr_validation_request_headers_no_trailer ) @pytest.mark.parametrize( 'header_block', invalid_request_header_blocks_bytes ) def test_inbound_req_header_missing_pseudo_headers(self, hdr_validation_flags, header_block): with pytest.raises(h2.exceptions.ProtocolError): list( h2.utilities.validate_headers( header_block, hdr_validation_flags ) ) @pytest.mark.parametrize( 'hdr_validation_flags', hdr_validation_request_headers_no_trailer ) @pytest.mark.parametrize( 'invalid_header', forbidden_request_headers_bytes + forbidden_request_headers_unicode ) def test_outbound_req_header_extra_pseudo_headers(self, hdr_validation_flags, invalid_header): """ Outbound request header blocks containing the forbidden request headers fail validation. """ headers = [ (b':path', b'/'), (b':scheme', b'https'), (b':authority', b'google.com'), (b':method', b'GET'), ] headers.append((invalid_header, b'some value')) with pytest.raises(h2.exceptions.ProtocolError): list( h2.utilities.validate_outbound_headers( headers, hdr_validation_flags ) ) @pytest.mark.parametrize( 'hdr_validation_flags', hdr_validation_request_headers_no_trailer ) @pytest.mark.parametrize( 'invalid_header', forbidden_request_headers_bytes ) def test_inbound_req_header_extra_pseudo_headers(self, hdr_validation_flags, invalid_header): """ Inbound request header blocks containing the forbidden request headers fail validation. """ headers = [ (b':path', b'/'), (b':scheme', b'https'), (b':authority', b'google.com'), (b':method', b'GET'), ] headers.append((invalid_header, b'some value')) with pytest.raises(h2.exceptions.ProtocolError): list(h2.utilities.validate_headers(headers, hdr_validation_flags)) @pytest.mark.parametrize( 'hdr_validation_flags', hdr_validation_response_headers ) @pytest.mark.parametrize( 'invalid_header', forbidden_response_headers_bytes + forbidden_response_headers_unicode ) def test_outbound_resp_header_extra_pseudo_headers(self, hdr_validation_flags, invalid_header): """ Outbound response header blocks containing the forbidden response headers fail validation. """ headers = [(b':status', b'200')] headers.append((invalid_header, b'some value')) with pytest.raises(h2.exceptions.ProtocolError): list( h2.utilities.validate_outbound_headers( headers, hdr_validation_flags ) ) @pytest.mark.parametrize( 'hdr_validation_flags', hdr_validation_response_headers ) @pytest.mark.parametrize( 'invalid_header', forbidden_response_headers_bytes ) def test_inbound_resp_header_extra_pseudo_headers(self, hdr_validation_flags, invalid_header): """ Inbound response header blocks containing the forbidden response headers fail validation. """ headers = [(b':status', b'200')] headers.append((invalid_header, b'some value')) with pytest.raises(h2.exceptions.ProtocolError): list(h2.utilities.validate_headers(headers, hdr_validation_flags)) class TestOversizedHeaders(object): """ Tests that oversized header blocks are correctly rejected. This replicates the "HPACK Bomb" attack, and confirms that we're resistant against it. """ request_header_block = [ (b':method', b'GET'), (b':authority', b'example.com'), (b':scheme', b'https'), (b':path', b'/'), ] response_header_block = [ (b':status', b'200'), ] # The first header block contains a single header that fills the header # table. To do that, we'll give it a single-character header name and a # 4063 byte header value. This will make it exactly the size of the header # table. It must come last, so that it evicts all other headers. # This block must be appended to either a request or response block. first_header_block = [ (b'a', b'a' * 4063), ] # The second header "block" is actually a custom HEADERS frame body that # simply repeatedly refers to the first entry for 16kB. Each byte has the # high bit set (0x80), and then uses the remaining 7 bits to encode the # number 62 (0x3e), leading to a repeat of the byte 0xbe. second_header_block = b'\xbe' * 2**14 server_config = h2.config.H2Configuration(client_side=False) def test_hpack_bomb_request(self, frame_factory): """ A HPACK bomb request causes the connection to be torn down with the error code ENHANCE_YOUR_CALM. """ c = h2.connection.H2Connection(config=self.server_config) c.receive_data(frame_factory.preamble()) c.clear_outbound_data_buffer() f = frame_factory.build_headers_frame( self.request_header_block + self.first_header_block ) data = f.serialize() c.receive_data(data) # Build the attack payload. attack_frame = hyperframe.frame.HeadersFrame(stream_id=3) attack_frame.data = self.second_header_block attack_frame.flags.add('END_HEADERS') data = attack_frame.serialize() with pytest.raises(h2.exceptions.DenialOfServiceError): c.receive_data(data) expected_frame = frame_factory.build_goaway_frame( last_stream_id=1, error_code=h2.errors.ErrorCodes.ENHANCE_YOUR_CALM ) assert c.data_to_send() == expected_frame.serialize() def test_hpack_bomb_response(self, frame_factory): """ A HPACK bomb response causes the connection to be torn down with the error code ENHANCE_YOUR_CALM. """ c = h2.connection.H2Connection() c.initiate_connection() c.send_headers( stream_id=1, headers=self.request_header_block ) c.send_headers( stream_id=3, headers=self.request_header_block ) c.clear_outbound_data_buffer() f = frame_factory.build_headers_frame( self.response_header_block + self.first_header_block ) data = f.serialize() c.receive_data(data) # Build the attack payload. attack_frame = hyperframe.frame.HeadersFrame(stream_id=3) attack_frame.data = self.second_header_block attack_frame.flags.add('END_HEADERS') data = attack_frame.serialize() with pytest.raises(h2.exceptions.DenialOfServiceError): c.receive_data(data) expected_frame = frame_factory.build_goaway_frame( last_stream_id=0, error_code=h2.errors.ErrorCodes.ENHANCE_YOUR_CALM ) assert c.data_to_send() == expected_frame.serialize() def test_hpack_bomb_push(self, frame_factory): """ A HPACK bomb push causes the connection to be torn down with the error code ENHANCE_YOUR_CALM. """ c = h2.connection.H2Connection() c.initiate_connection() c.send_headers( stream_id=1, headers=self.request_header_block ) c.clear_outbound_data_buffer() f = frame_factory.build_headers_frame( self.response_header_block + self.first_header_block ) data = f.serialize() c.receive_data(data) # Build the attack payload. We need to shrink it by four bytes because # the promised_stream_id consumes four bytes of body. attack_frame = hyperframe.frame.PushPromiseFrame(stream_id=3) attack_frame.promised_stream_id = 2 attack_frame.data = self.second_header_block[:-4] attack_frame.flags.add('END_HEADERS') data = attack_frame.serialize() with pytest.raises(h2.exceptions.DenialOfServiceError): c.receive_data(data) expected_frame = frame_factory.build_goaway_frame( last_stream_id=0, error_code=h2.errors.ErrorCodes.ENHANCE_YOUR_CALM ) assert c.data_to_send() == expected_frame.serialize() def test_reject_headers_when_list_size_shrunk(self, frame_factory): """ When we've shrunk the header list size, we reject new header blocks that violate the new size. """ c = h2.connection.H2Connection(config=self.server_config) c.receive_data(frame_factory.preamble()) c.clear_outbound_data_buffer() # Receive the first request, which causes no problem. f = frame_factory.build_headers_frame( stream_id=1, headers=self.request_header_block ) data = f.serialize() c.receive_data(data) # Now, send a settings change. It's un-ACKed at this time. A new # request arrives, also without incident. c.update_settings({h2.settings.SettingCodes.MAX_HEADER_LIST_SIZE: 50}) c.clear_outbound_data_buffer() f = frame_factory.build_headers_frame( stream_id=3, headers=self.request_header_block ) data = f.serialize() c.receive_data(data) # We get a SETTINGS ACK. f = frame_factory.build_settings_frame({}, ack=True) data = f.serialize() c.receive_data(data) # Now a third request comes in. This explodes. f = frame_factory.build_headers_frame( stream_id=5, headers=self.request_header_block ) data = f.serialize() with pytest.raises(h2.exceptions.DenialOfServiceError): c.receive_data(data) expected_frame = frame_factory.build_goaway_frame( last_stream_id=3, error_code=h2.errors.ErrorCodes.ENHANCE_YOUR_CALM ) assert c.data_to_send() == expected_frame.serialize() def test_reject_headers_when_table_size_shrunk(self, frame_factory): """ When we've shrunk the header table size, we reject header blocks that do not respect the change. """ c = h2.connection.H2Connection(config=self.server_config) c.receive_data(frame_factory.preamble()) c.clear_outbound_data_buffer() # Receive the first request, which causes no problem. f = frame_factory.build_headers_frame( stream_id=1, headers=self.request_header_block ) data = f.serialize() c.receive_data(data) # Now, send a settings change. It's un-ACKed at this time. A new # request arrives, also without incident. c.update_settings({h2.settings.SettingCodes.HEADER_TABLE_SIZE: 128}) c.clear_outbound_data_buffer() f = frame_factory.build_headers_frame( stream_id=3, headers=self.request_header_block ) data = f.serialize() c.receive_data(data) # We get a SETTINGS ACK. f = frame_factory.build_settings_frame({}, ack=True) data = f.serialize() c.receive_data(data) # Now a third request comes in. This explodes, as it does not contain # a dynamic table size update. f = frame_factory.build_headers_frame( stream_id=5, headers=self.request_header_block ) data = f.serialize() with pytest.raises(h2.exceptions.ProtocolError): c.receive_data(data) expected_frame = frame_factory.build_goaway_frame( last_stream_id=3, error_code=h2.errors.ErrorCodes.PROTOCOL_ERROR ) assert c.data_to_send() == expected_frame.serialize() def test_reject_headers_exceeding_table_size(self, frame_factory): """ When the remote peer sends a dynamic table size update that exceeds our setting, we reject it. """ c = h2.connection.H2Connection(config=self.server_config) c.receive_data(frame_factory.preamble()) c.clear_outbound_data_buffer() # Receive the first request, which causes no problem. f = frame_factory.build_headers_frame( stream_id=1, headers=self.request_header_block ) data = f.serialize() c.receive_data(data) # Now a second request comes in that sets the table size too high. # This explodes. frame_factory.change_table_size(c.local_settings.header_table_size + 1) f = frame_factory.build_headers_frame( stream_id=5, headers=self.request_header_block ) data = f.serialize() with pytest.raises(h2.exceptions.ProtocolError): c.receive_data(data) expected_frame = frame_factory.build_goaway_frame( last_stream_id=1, error_code=h2.errors.ErrorCodes.PROTOCOL_ERROR ) assert c.data_to_send() == expected_frame.serialize() h2-3.1.1/test/test_priority.py0000664000175000017500000002533513421652727017207 0ustar ubuntuubuntu00000000000000# -*- coding: utf-8 -*- """ test_priority ~~~~~~~~~~~~~ Test the priority logic of Hyper-h2. """ import pytest import h2.config import h2.connection import h2.errors import h2.events import h2.exceptions import h2.stream class TestPriority(object): """ Basic priority tests. """ example_request_headers = [ (':authority', 'example.com'), (':path', '/'), (':scheme', 'https'), (':method', 'GET'), ] example_response_headers = [ (':status', '200'), ('server', 'pytest-h2'), ] server_config = h2.config.H2Configuration(client_side=False) def test_receiving_priority_emits_priority_update(self, frame_factory): """ Receiving a priority frame emits a PriorityUpdated event. """ c = h2.connection.H2Connection(config=self.server_config) c.initiate_connection() c.receive_data(frame_factory.preamble()) c.clear_outbound_data_buffer() f = frame_factory.build_priority_frame( stream_id=1, weight=255, ) events = c.receive_data(f.serialize()) assert len(events) == 1 assert not c.data_to_send() event = events[0] assert isinstance(event, h2.events.PriorityUpdated) assert event.stream_id == 1 assert event.depends_on == 0 assert event.weight == 256 assert event.exclusive is False def test_headers_with_priority_info(self, frame_factory): """ Receiving a HEADERS frame with priority information on it emits a PriorityUpdated event. """ c = h2.connection.H2Connection(config=self.server_config) c.initiate_connection() c.receive_data(frame_factory.preamble()) c.clear_outbound_data_buffer() f = frame_factory.build_headers_frame( headers=self.example_request_headers, stream_id=3, flags=['PRIORITY'], stream_weight=15, depends_on=1, exclusive=True, ) events = c.receive_data(f.serialize()) assert len(events) == 2 assert not c.data_to_send() event = events[1] assert isinstance(event, h2.events.PriorityUpdated) assert event.stream_id == 3 assert event.depends_on == 1 assert event.weight == 16 assert event.exclusive is True def test_streams_may_not_depend_on_themselves(self, frame_factory): """ A stream adjusted to depend on itself causes a Protocol Error. """ c = h2.connection.H2Connection(config=self.server_config) c.initiate_connection() c.receive_data(frame_factory.preamble()) c.clear_outbound_data_buffer() f = frame_factory.build_headers_frame( headers=self.example_request_headers, stream_id=3, flags=['PRIORITY'], stream_weight=15, depends_on=1, exclusive=True, ) c.receive_data(f.serialize()) c.clear_outbound_data_buffer() f = frame_factory.build_priority_frame( stream_id=3, depends_on=3, weight=15 ) with pytest.raises(h2.exceptions.ProtocolError): c.receive_data(f.serialize()) expected_frame = frame_factory.build_goaway_frame( last_stream_id=3, error_code=h2.errors.ErrorCodes.PROTOCOL_ERROR, ) assert c.data_to_send() == expected_frame.serialize() @pytest.mark.parametrize( 'depends_on,weight,exclusive', [ (0, 256, False), (3, 128, False), (3, 128, True), ] ) def test_can_prioritize_stream(self, depends_on, weight, exclusive, frame_factory): """ hyper-h2 can emit priority frames. """ c = h2.connection.H2Connection() c.initiate_connection() c.send_headers(headers=self.example_request_headers, stream_id=1) c.send_headers(headers=self.example_request_headers, stream_id=3) c.clear_outbound_data_buffer() c.prioritize( stream_id=1, depends_on=depends_on, weight=weight, exclusive=exclusive ) f = frame_factory.build_priority_frame( stream_id=1, weight=weight - 1, depends_on=depends_on, exclusive=exclusive, ) assert c.data_to_send() == f.serialize() @pytest.mark.parametrize( 'depends_on,weight,exclusive', [ (0, 256, False), (1, 128, False), (1, 128, True), ] ) def test_emit_headers_with_priority_info(self, depends_on, weight, exclusive, frame_factory): """ It is possible to send a headers frame with priority information on it. """ c = h2.connection.H2Connection() c.initiate_connection() c.clear_outbound_data_buffer() c.send_headers( headers=self.example_request_headers, stream_id=3, priority_weight=weight, priority_depends_on=depends_on, priority_exclusive=exclusive, ) f = frame_factory.build_headers_frame( headers=self.example_request_headers, stream_id=3, flags=['PRIORITY'], stream_weight=weight - 1, depends_on=depends_on, exclusive=exclusive, ) assert c.data_to_send() == f.serialize() def test_may_not_prioritize_stream_to_depend_on_self(self, frame_factory): """ A stream adjusted to depend on itself causes a Protocol Error. """ c = h2.connection.H2Connection() c.initiate_connection() c.receive_data(frame_factory.preamble()) c.send_headers( headers=self.example_request_headers, stream_id=3, priority_weight=255, priority_depends_on=0, priority_exclusive=False, ) c.clear_outbound_data_buffer() with pytest.raises(h2.exceptions.ProtocolError): c.prioritize( stream_id=3, depends_on=3, ) assert not c.data_to_send() def test_may_not_initially_set_stream_depend_on_self(self, frame_factory): """ A stream that starts by depending on itself causes a Protocol Error. """ c = h2.connection.H2Connection() c.initiate_connection() c.receive_data(frame_factory.preamble()) c.clear_outbound_data_buffer() with pytest.raises(h2.exceptions.ProtocolError): c.send_headers( headers=self.example_request_headers, stream_id=3, priority_depends_on=3, ) assert not c.data_to_send() @pytest.mark.parametrize('weight', [0, -15, 257]) def test_prioritize_requires_valid_weight(self, weight): """ A call to prioritize with an invalid weight causes a ProtocolError. """ c = h2.connection.H2Connection() c.initiate_connection() c.clear_outbound_data_buffer() with pytest.raises(h2.exceptions.ProtocolError): c.prioritize(stream_id=1, weight=weight) assert not c.data_to_send() @pytest.mark.parametrize('weight', [0, -15, 257]) def test_send_headers_requires_valid_weight(self, weight): """ A call to send_headers with an invalid weight causes a ProtocolError. """ c = h2.connection.H2Connection() c.initiate_connection() c.clear_outbound_data_buffer() with pytest.raises(h2.exceptions.ProtocolError): c.send_headers( stream_id=1, headers=self.example_request_headers, priority_weight=weight ) assert not c.data_to_send() def test_prioritize_defaults(self, frame_factory): """ When prioritize() is called with no explicit arguments, it emits a weight of 16, depending on stream zero non-exclusively. """ c = h2.connection.H2Connection() c.initiate_connection() c.clear_outbound_data_buffer() c.prioritize(stream_id=1) f = frame_factory.build_priority_frame( stream_id=1, weight=15, depends_on=0, exclusive=False, ) assert c.data_to_send() == f.serialize() @pytest.mark.parametrize( 'priority_kwargs', [ {'priority_weight': 16}, {'priority_depends_on': 0}, {'priority_exclusive': False}, ] ) def test_send_headers_defaults(self, priority_kwargs, frame_factory): """ When send_headers() is called with only one explicit argument, it emits default values for everything else. """ c = h2.connection.H2Connection() c.initiate_connection() c.clear_outbound_data_buffer() c.send_headers( stream_id=1, headers=self.example_request_headers, **priority_kwargs ) f = frame_factory.build_headers_frame( headers=self.example_request_headers, stream_id=1, flags=['PRIORITY'], stream_weight=15, depends_on=0, exclusive=False, ) assert c.data_to_send() == f.serialize() def test_servers_cannot_prioritize(self, frame_factory): """ Server stacks are not allowed to call ``prioritize()``. """ c = h2.connection.H2Connection(config=self.server_config) c.initiate_connection() c.receive_data(frame_factory.preamble()) c.clear_outbound_data_buffer() f = frame_factory.build_headers_frame( stream_id=1, headers=self.example_request_headers, ) c.receive_data(f.serialize()) with pytest.raises(h2.exceptions.RFC1122Error): c.prioritize(stream_id=1) def test_servers_cannot_prioritize_with_headers(self, frame_factory): """ Server stacks are not allowed to prioritize on headers either. """ c = h2.connection.H2Connection(config=self.server_config) c.initiate_connection() c.receive_data(frame_factory.preamble()) c.clear_outbound_data_buffer() f = frame_factory.build_headers_frame( stream_id=1, headers=self.example_request_headers, ) c.receive_data(f.serialize()) with pytest.raises(h2.exceptions.RFC1122Error): c.send_headers( stream_id=1, headers=self.example_response_headers, priority_weight=16, ) h2-3.1.1/test/test_related_events.py0000664000175000017500000003033313421652727020324 0ustar ubuntuubuntu00000000000000# -*- coding: utf-8 -*- """ test_related_events.py ~~~~~~~~~~~~~~~~~~~~~~ Specific tests to validate the "related events" logic used by certain events inside hyper-h2. """ import h2.config import h2.connection import h2.events class TestRelatedEvents(object): """ Related events correlate all those events that happen on a single frame. """ example_request_headers = [ (':authority', 'example.com'), (':path', '/'), (':scheme', 'https'), (':method', 'GET'), ] example_response_headers = [ (':status', '200'), ('server', 'fake-serv/0.1.0') ] informational_response_headers = [ (':status', '100'), ('server', 'fake-serv/0.1.0') ] example_trailers = [ ('another', 'field'), ] server_config = h2.config.H2Configuration(client_side=False) def test_request_received_related_all(self, frame_factory): """ RequestReceived has two possible related events: PriorityUpdated and StreamEnded, all fired when a single HEADERS frame is received. """ c = h2.connection.H2Connection(config=self.server_config) c.initiate_connection() c.receive_data(frame_factory.preamble()) input_frame = frame_factory.build_headers_frame( headers=self.example_request_headers, flags=['END_STREAM', 'PRIORITY'], stream_weight=15, depends_on=0, exclusive=False, ) events = c.receive_data(input_frame.serialize()) assert len(events) == 3 base_event = events[0] other_events = events[1:] assert base_event.stream_ended in other_events assert isinstance(base_event.stream_ended, h2.events.StreamEnded) assert base_event.priority_updated in other_events assert isinstance( base_event.priority_updated, h2.events.PriorityUpdated ) def test_request_received_related_priority(self, frame_factory): """ RequestReceived can be related to PriorityUpdated. """ c = h2.connection.H2Connection(config=self.server_config) c.initiate_connection() c.receive_data(frame_factory.preamble()) input_frame = frame_factory.build_headers_frame( headers=self.example_request_headers, flags=['PRIORITY'], stream_weight=15, depends_on=0, exclusive=False, ) events = c.receive_data(input_frame.serialize()) assert len(events) == 2 base_event = events[0] priority_updated_event = events[1] assert base_event.priority_updated is priority_updated_event assert base_event.stream_ended is None assert isinstance( base_event.priority_updated, h2.events.PriorityUpdated ) def test_request_received_related_stream_ended(self, frame_factory): """ RequestReceived can be related to StreamEnded. """ c = h2.connection.H2Connection(config=self.server_config) c.initiate_connection() c.receive_data(frame_factory.preamble()) input_frame = frame_factory.build_headers_frame( headers=self.example_request_headers, flags=['END_STREAM'], ) events = c.receive_data(input_frame.serialize()) assert len(events) == 2 base_event = events[0] stream_ended_event = events[1] assert base_event.stream_ended is stream_ended_event assert base_event.priority_updated is None assert isinstance(base_event.stream_ended, h2.events.StreamEnded) def test_response_received_related_nothing(self, frame_factory): """ ResponseReceived is ordinarily related to no events. """ c = h2.connection.H2Connection() c.initiate_connection() c.send_headers(stream_id=1, headers=self.example_request_headers) input_frame = frame_factory.build_headers_frame( headers=self.example_response_headers, ) events = c.receive_data(input_frame.serialize()) assert len(events) == 1 base_event = events[0] assert base_event.stream_ended is None assert base_event.priority_updated is None def test_response_received_related_all(self, frame_factory): """ ResponseReceived has two possible related events: PriorityUpdated and StreamEnded, all fired when a single HEADERS frame is received. """ c = h2.connection.H2Connection() c.initiate_connection() c.send_headers(stream_id=1, headers=self.example_request_headers) input_frame = frame_factory.build_headers_frame( headers=self.example_response_headers, flags=['END_STREAM', 'PRIORITY'], stream_weight=15, depends_on=0, exclusive=False, ) events = c.receive_data(input_frame.serialize()) assert len(events) == 3 base_event = events[0] other_events = events[1:] assert base_event.stream_ended in other_events assert isinstance(base_event.stream_ended, h2.events.StreamEnded) assert base_event.priority_updated in other_events assert isinstance( base_event.priority_updated, h2.events.PriorityUpdated ) def test_response_received_related_priority(self, frame_factory): """ ResponseReceived can be related to PriorityUpdated. """ c = h2.connection.H2Connection() c.initiate_connection() c.send_headers(stream_id=1, headers=self.example_request_headers) input_frame = frame_factory.build_headers_frame( headers=self.example_response_headers, flags=['PRIORITY'], stream_weight=15, depends_on=0, exclusive=False, ) events = c.receive_data(input_frame.serialize()) assert len(events) == 2 base_event = events[0] priority_updated_event = events[1] assert base_event.priority_updated is priority_updated_event assert base_event.stream_ended is None assert isinstance( base_event.priority_updated, h2.events.PriorityUpdated ) def test_response_received_related_stream_ended(self, frame_factory): """ ResponseReceived can be related to StreamEnded. """ c = h2.connection.H2Connection() c.initiate_connection() c.send_headers(stream_id=1, headers=self.example_request_headers) input_frame = frame_factory.build_headers_frame( headers=self.example_response_headers, flags=['END_STREAM'], ) events = c.receive_data(input_frame.serialize()) assert len(events) == 2 base_event = events[0] stream_ended_event = events[1] assert base_event.stream_ended is stream_ended_event assert base_event.priority_updated is None assert isinstance(base_event.stream_ended, h2.events.StreamEnded) def test_trailers_received_related_all(self, frame_factory): """ TrailersReceived has two possible related events: PriorityUpdated and StreamEnded, all fired when a single HEADERS frame is received. """ c = h2.connection.H2Connection() c.initiate_connection() c.send_headers(stream_id=1, headers=self.example_request_headers) f = frame_factory.build_headers_frame( headers=self.example_response_headers, ) c.receive_data(f.serialize()) input_frame = frame_factory.build_headers_frame( headers=self.example_trailers, flags=['END_STREAM', 'PRIORITY'], stream_weight=15, depends_on=0, exclusive=False, ) events = c.receive_data(input_frame.serialize()) assert len(events) == 3 base_event = events[0] other_events = events[1:] assert base_event.stream_ended in other_events assert isinstance(base_event.stream_ended, h2.events.StreamEnded) assert base_event.priority_updated in other_events assert isinstance( base_event.priority_updated, h2.events.PriorityUpdated ) def test_trailers_received_related_stream_ended(self, frame_factory): """ TrailersReceived can be related to StreamEnded by itself. """ c = h2.connection.H2Connection() c.initiate_connection() c.send_headers(stream_id=1, headers=self.example_request_headers) f = frame_factory.build_headers_frame( headers=self.example_response_headers, ) c.receive_data(f.serialize()) input_frame = frame_factory.build_headers_frame( headers=self.example_trailers, flags=['END_STREAM'], ) events = c.receive_data(input_frame.serialize()) assert len(events) == 2 base_event = events[0] stream_ended_event = events[1] assert base_event.stream_ended is stream_ended_event assert base_event.priority_updated is None assert isinstance(base_event.stream_ended, h2.events.StreamEnded) def test_informational_response_related_nothing(self, frame_factory): """ InformationalResponseReceived in the standard case is related to nothing. """ c = h2.connection.H2Connection() c.initiate_connection() c.send_headers(stream_id=1, headers=self.example_request_headers) input_frame = frame_factory.build_headers_frame( headers=self.informational_response_headers, ) events = c.receive_data(input_frame.serialize()) assert len(events) == 1 base_event = events[0] assert base_event.priority_updated is None def test_informational_response_received_related_all(self, frame_factory): """ InformationalResponseReceived has one possible related event: PriorityUpdated, fired when a single HEADERS frame is received. """ c = h2.connection.H2Connection() c.initiate_connection() c.send_headers(stream_id=1, headers=self.example_request_headers) input_frame = frame_factory.build_headers_frame( headers=self.informational_response_headers, flags=['PRIORITY'], stream_weight=15, depends_on=0, exclusive=False, ) events = c.receive_data(input_frame.serialize()) assert len(events) == 2 base_event = events[0] priority_updated_event = events[1] assert base_event.priority_updated is priority_updated_event assert isinstance( base_event.priority_updated, h2.events.PriorityUpdated ) def test_data_received_normally_relates_to_nothing(self, frame_factory): """ A plain DATA frame leads to DataReceieved with no related events. """ c = h2.connection.H2Connection() c.initiate_connection() c.send_headers(stream_id=1, headers=self.example_request_headers) f = frame_factory.build_headers_frame( headers=self.example_response_headers, ) c.receive_data(f.serialize()) input_frame = frame_factory.build_data_frame( data=b'some data', ) events = c.receive_data(input_frame.serialize()) assert len(events) == 1 base_event = events[0] assert base_event.stream_ended is None def test_data_received_related_stream_ended(self, frame_factory): """ DataReceived can be related to StreamEnded by itself. """ c = h2.connection.H2Connection() c.initiate_connection() c.send_headers(stream_id=1, headers=self.example_request_headers) f = frame_factory.build_headers_frame( headers=self.example_response_headers, ) c.receive_data(f.serialize()) input_frame = frame_factory.build_data_frame( data=b'some data', flags=['END_STREAM'], ) events = c.receive_data(input_frame.serialize()) assert len(events) == 2 base_event = events[0] stream_ended_event = events[1] assert base_event.stream_ended is stream_ended_event assert isinstance(base_event.stream_ended, h2.events.StreamEnded) h2-3.1.1/test/test_rfc7838.py0000664000175000017500000003527413421652727016435 0ustar ubuntuubuntu00000000000000# -*- coding: utf-8 -*- """ test_rfc7838 ~~~~~~~~~~~~ Test the RFC 7838 ALTSVC support. """ import pytest import h2.config import h2.connection import h2.events import h2.exceptions class TestRFC7838Client(object): """ Tests that the client supports receiving the RFC 7838 AltSvc frame. """ example_request_headers = [ (':authority', 'example.com'), (':path', '/'), (':scheme', 'https'), (':method', 'GET'), ] example_response_headers = [ (u':status', u'200'), (u'server', u'fake-serv/0.1.0') ] def test_receiving_altsvc_stream_zero(self, frame_factory): """ An ALTSVC frame received on stream zero correctly transposes all the fields from the frames. """ c = h2.connection.H2Connection() c.initiate_connection() c.clear_outbound_data_buffer() f = frame_factory.build_alt_svc_frame( stream_id=0, origin=b"example.com", field=b'h2=":8000"; ma=60' ) events = c.receive_data(f.serialize()) assert len(events) == 1 event = events[0] assert isinstance(event, h2.events.AlternativeServiceAvailable) assert event.origin == b"example.com" assert event.field_value == b'h2=":8000"; ma=60' # No data gets sent. assert not c.data_to_send() def test_receiving_altsvc_stream_zero_no_origin(self, frame_factory): """ An ALTSVC frame received on stream zero without an origin field is ignored. """ c = h2.connection.H2Connection() c.initiate_connection() c.clear_outbound_data_buffer() f = frame_factory.build_alt_svc_frame( stream_id=0, origin=b"", field=b'h2=":8000"; ma=60' ) events = c.receive_data(f.serialize()) assert not events assert not c.data_to_send() def test_receiving_altsvc_on_stream(self, frame_factory): """ An ALTSVC frame received on a stream correctly transposes all the fields from the frame and attaches the expected origin. """ c = h2.connection.H2Connection() c.initiate_connection() c.send_headers(stream_id=1, headers=self.example_request_headers) c.clear_outbound_data_buffer() f = frame_factory.build_alt_svc_frame( stream_id=1, origin=b"", field=b'h2=":8000"; ma=60' ) events = c.receive_data(f.serialize()) assert len(events) == 1 event = events[0] assert isinstance(event, h2.events.AlternativeServiceAvailable) assert event.origin == b"example.com" assert event.field_value == b'h2=":8000"; ma=60' # No data gets sent. assert not c.data_to_send() def test_receiving_altsvc_on_stream_with_origin(self, frame_factory): """ An ALTSVC frame received on a stream with an origin field present gets ignored. """ c = h2.connection.H2Connection() c.initiate_connection() c.send_headers(stream_id=1, headers=self.example_request_headers) c.clear_outbound_data_buffer() f = frame_factory.build_alt_svc_frame( stream_id=1, origin=b"example.com", field=b'h2=":8000"; ma=60' ) events = c.receive_data(f.serialize()) assert len(events) == 0 assert not c.data_to_send() def test_receiving_altsvc_on_stream_not_yet_opened(self, frame_factory): """ When an ALTSVC frame is received on a stream the client hasn't yet opened, the frame is ignored. """ c = h2.connection.H2Connection() c.initiate_connection() c.clear_outbound_data_buffer() # We'll test this twice, once on a client-initiated stream ID and once # on a server initiated one. f1 = frame_factory.build_alt_svc_frame( stream_id=1, origin=b"", field=b'h2=":8000"; ma=60' ) f2 = frame_factory.build_alt_svc_frame( stream_id=2, origin=b"", field=b'h2=":8000"; ma=60' ) events = c.receive_data(f1.serialize() + f2.serialize()) assert len(events) == 0 assert not c.data_to_send() def test_receiving_altsvc_before_sending_headers(self, frame_factory): """ When an ALTSVC frame is received but the client hasn't sent headers yet it gets ignored. """ c = h2.connection.H2Connection() c.initiate_connection() # We need to create the idle stream. We have to do it by calling # a private API. While this can't naturally happen in hyper-h2 (we # don't currently have a mechanism by which this could occur), it could # happen in the future and we defend against it. c._begin_new_stream( stream_id=1, allowed_ids=h2.connection.AllowedStreamIDs.ODD ) c.clear_outbound_data_buffer() f = frame_factory.build_alt_svc_frame( stream_id=1, origin=b"", field=b'h2=":8000"; ma=60' ) events = c.receive_data(f.serialize()) assert len(events) == 0 assert not c.data_to_send() def test_receiving_altsvc_after_receiving_headers(self, frame_factory): """ When an ALTSVC frame is received but the server has already sent headers it gets ignored. """ c = h2.connection.H2Connection() c.initiate_connection() c.send_headers(stream_id=1, headers=self.example_request_headers) f = frame_factory.build_headers_frame( headers=self.example_response_headers ) c.receive_data(f.serialize()) c.clear_outbound_data_buffer() f = frame_factory.build_alt_svc_frame( stream_id=1, origin=b"", field=b'h2=":8000"; ma=60' ) events = c.receive_data(f.serialize()) assert len(events) == 0 assert not c.data_to_send() def test_receiving_altsvc_on_closed_stream(self, frame_factory): """ When an ALTSVC frame is received on a closed stream, we ignore it. """ c = h2.connection.H2Connection() c.initiate_connection() c.send_headers( stream_id=1, headers=self.example_request_headers, end_stream=True ) f = frame_factory.build_headers_frame( headers=self.example_response_headers, flags=['END_STREAM'], ) c.receive_data(f.serialize()) c.clear_outbound_data_buffer() f = frame_factory.build_alt_svc_frame( stream_id=1, origin=b"", field=b'h2=":8000"; ma=60' ) events = c.receive_data(f.serialize()) assert len(events) == 0 assert not c.data_to_send() def test_receiving_altsvc_on_pushed_stream(self, frame_factory): """ When an ALTSVC frame is received on a stream that the server pushed, the frame is accepted. """ c = h2.connection.H2Connection() c.initiate_connection() c.send_headers(stream_id=1, headers=self.example_request_headers) f = frame_factory.build_push_promise_frame( stream_id=1, promised_stream_id=2, headers=self.example_request_headers ) c.receive_data(f.serialize()) c.clear_outbound_data_buffer() f = frame_factory.build_alt_svc_frame( stream_id=2, origin=b"", field=b'h2=":8000"; ma=60' ) events = c.receive_data(f.serialize()) assert len(events) == 1 event = events[0] assert isinstance(event, h2.events.AlternativeServiceAvailable) assert event.origin == b"example.com" assert event.field_value == b'h2=":8000"; ma=60' # No data gets sent. assert not c.data_to_send() def test_cannot_send_explicit_alternative_service(self, frame_factory): """ A client cannot send an explicit alternative service. """ c = h2.connection.H2Connection() c.initiate_connection() c.send_headers(stream_id=1, headers=self.example_request_headers) c.clear_outbound_data_buffer() with pytest.raises(h2.exceptions.ProtocolError): c.advertise_alternative_service( field_value=b'h2=":8000"; ma=60', origin=b"example.com", ) def test_cannot_send_implicit_alternative_service(self, frame_factory): """ A client cannot send an implicit alternative service. """ c = h2.connection.H2Connection() c.initiate_connection() c.send_headers(stream_id=1, headers=self.example_request_headers) c.clear_outbound_data_buffer() with pytest.raises(h2.exceptions.ProtocolError): c.advertise_alternative_service( field_value=b'h2=":8000"; ma=60', stream_id=1, ) class TestRFC7838Server(object): """ Tests that the server supports sending the RFC 7838 AltSvc frame. """ example_request_headers = [ (':authority', 'example.com'), (':path', '/'), (':scheme', 'https'), (':method', 'GET'), ] example_response_headers = [ (u':status', u'200'), (u'server', u'fake-serv/0.1.0') ] server_config = h2.config.H2Configuration(client_side=False) def test_receiving_altsvc_as_server_stream_zero(self, frame_factory): """ When an ALTSVC frame is received on stream zero and we are a server, we ignore it. """ c = h2.connection.H2Connection(config=self.server_config) c.initiate_connection() c.receive_data(frame_factory.preamble()) c.clear_outbound_data_buffer() f = frame_factory.build_alt_svc_frame( stream_id=0, origin=b"example.com", field=b'h2=":8000"; ma=60' ) events = c.receive_data(f.serialize()) assert len(events) == 0 assert not c.data_to_send() def test_receiving_altsvc_as_server_on_stream(self, frame_factory): """ When an ALTSVC frame is received on a stream and we are a server, we ignore it. """ c = h2.connection.H2Connection(config=self.server_config) c.initiate_connection() c.receive_data(frame_factory.preamble()) f = frame_factory.build_headers_frame( headers=self.example_request_headers ) c.receive_data(f.serialize()) c.clear_outbound_data_buffer() f = frame_factory.build_alt_svc_frame( stream_id=1, origin=b"", field=b'h2=":8000"; ma=60' ) events = c.receive_data(f.serialize()) assert len(events) == 0 assert not c.data_to_send() def test_sending_explicit_alternative_service(self, frame_factory): """ A server can send an explicit alternative service. """ c = h2.connection.H2Connection(config=self.server_config) c.initiate_connection() c.receive_data(frame_factory.preamble()) c.clear_outbound_data_buffer() c.advertise_alternative_service( field_value=b'h2=":8000"; ma=60', origin=b"example.com", ) f = frame_factory.build_alt_svc_frame( stream_id=0, origin=b"example.com", field=b'h2=":8000"; ma=60' ) assert c.data_to_send() == f.serialize() def test_sending_implicit_alternative_service(self, frame_factory): """ A server can send an implicit alternative service. """ c = h2.connection.H2Connection(config=self.server_config) c.initiate_connection() c.receive_data(frame_factory.preamble()) f = frame_factory.build_headers_frame( headers=self.example_request_headers ) c.receive_data(f.serialize()) c.clear_outbound_data_buffer() c.advertise_alternative_service( field_value=b'h2=":8000"; ma=60', stream_id=1, ) f = frame_factory.build_alt_svc_frame( stream_id=1, origin=b"", field=b'h2=":8000"; ma=60' ) assert c.data_to_send() == f.serialize() def test_no_implicit_alternative_service_before_headers(self, frame_factory): """ If headers haven't been received yet, the server forbids sending an implicit alternative service. """ c = h2.connection.H2Connection(config=self.server_config) c.initiate_connection() c.receive_data(frame_factory.preamble()) c.clear_outbound_data_buffer() with pytest.raises(h2.exceptions.ProtocolError): c.advertise_alternative_service( field_value=b'h2=":8000"; ma=60', stream_id=1, ) def test_no_implicit_alternative_service_after_response(self, frame_factory): """ If the server has sent response headers, hyper-h2 forbids sending an implicit alternative service. """ c = h2.connection.H2Connection(config=self.server_config) c.initiate_connection() c.receive_data(frame_factory.preamble()) f = frame_factory.build_headers_frame( headers=self.example_request_headers ) c.receive_data(f.serialize()) c.send_headers(stream_id=1, headers=self.example_response_headers) c.clear_outbound_data_buffer() with pytest.raises(h2.exceptions.ProtocolError): c.advertise_alternative_service( field_value=b'h2=":8000"; ma=60', stream_id=1, ) def test_cannot_provide_origin_and_stream_id(self, frame_factory): """ The user cannot provide both the origin and stream_id arguments when advertising alternative services. """ c = h2.connection.H2Connection(config=self.server_config) c.initiate_connection() c.receive_data(frame_factory.preamble()) f = frame_factory.build_headers_frame( headers=self.example_request_headers ) c.receive_data(f.serialize()) with pytest.raises(ValueError): c.advertise_alternative_service( field_value=b'h2=":8000"; ma=60', origin=b"example.com", stream_id=1, ) def test_cannot_provide_unicode_altsvc_field(self, frame_factory): """ The user cannot provide the field value for alternative services as a unicode string. """ c = h2.connection.H2Connection(config=self.server_config) c.initiate_connection() c.receive_data(frame_factory.preamble()) with pytest.raises(ValueError): c.advertise_alternative_service( field_value=u'h2=":8000"; ma=60', origin=b"example.com", ) h2-3.1.1/test/test_rfc8441.py0000664000175000017500000000215013421652727016407 0ustar ubuntuubuntu00000000000000# -*- coding: utf-8 -*- """ test_rfc8441 ~~~~~~~~~~~~ Test the RFC 8441 extended connect request support. """ import h2.config import h2.connection import h2.events class TestRFC8441(object): """ Tests that the client supports sending an extended connect request and the server supports receiving it. """ def test_can_send_headers(self, frame_factory): headers = [ (b':authority', b'example.com'), (b':path', b'/'), (b':scheme', b'https'), (b':method', b'CONNECT'), (b':protocol', b'websocket'), (b'user-agent', b'someua/0.0.1'), ] client = h2.connection.H2Connection() client.initiate_connection() client.send_headers(stream_id=1, headers=headers) server = h2.connection.H2Connection( config=h2.config.H2Configuration(client_side=False) ) events = server.receive_data(client.data_to_send()) event = events[1] assert isinstance(event, h2.events.RequestReceived) assert event.stream_id == 1 assert event.headers == headers h2-3.1.1/test/test_settings.py0000664000175000017500000004045013421652727017161 0ustar ubuntuubuntu00000000000000# -*- coding: utf-8 -*- """ test_settings ~~~~~~~~~~~~~ Test the Settings object. """ import pytest import h2.errors import h2.exceptions import h2.settings from hypothesis import given, assume from hypothesis.strategies import ( integers, booleans, fixed_dictionaries, builds ) class TestSettings(object): """ Test the Settings object behaves as expected. """ def test_settings_defaults_client(self): """ The Settings object begins with the appropriate defaults for clients. """ s = h2.settings.Settings(client=True) assert s[h2.settings.SettingCodes.HEADER_TABLE_SIZE] == 4096 assert s[h2.settings.SettingCodes.ENABLE_PUSH] == 1 assert s[h2.settings.SettingCodes.INITIAL_WINDOW_SIZE] == 65535 assert s[h2.settings.SettingCodes.MAX_FRAME_SIZE] == 16384 assert s[h2.settings.SettingCodes.ENABLE_CONNECT_PROTOCOL] == 0 def test_settings_defaults_server(self): """ The Settings object begins with the appropriate defaults for servers. """ s = h2.settings.Settings(client=False) assert s[h2.settings.SettingCodes.HEADER_TABLE_SIZE] == 4096 assert s[h2.settings.SettingCodes.ENABLE_PUSH] == 0 assert s[h2.settings.SettingCodes.INITIAL_WINDOW_SIZE] == 65535 assert s[h2.settings.SettingCodes.MAX_FRAME_SIZE] == 16384 assert s[h2.settings.SettingCodes.ENABLE_CONNECT_PROTOCOL] == 0 @pytest.mark.parametrize('client', [True, False]) def test_can_set_initial_values(self, client): """ The Settings object can be provided initial values that override the defaults. """ overrides = { h2.settings.SettingCodes.HEADER_TABLE_SIZE: 8080, h2.settings.SettingCodes.MAX_FRAME_SIZE: 16388, h2.settings.SettingCodes.MAX_CONCURRENT_STREAMS: 100, h2.settings.SettingCodes.MAX_HEADER_LIST_SIZE: 2**16, h2.settings.SettingCodes.ENABLE_CONNECT_PROTOCOL: 1, } s = h2.settings.Settings(client=client, initial_values=overrides) assert s[h2.settings.SettingCodes.HEADER_TABLE_SIZE] == 8080 assert s[h2.settings.SettingCodes.ENABLE_PUSH] == bool(client) assert s[h2.settings.SettingCodes.INITIAL_WINDOW_SIZE] == 65535 assert s[h2.settings.SettingCodes.MAX_FRAME_SIZE] == 16388 assert s[h2.settings.SettingCodes.MAX_CONCURRENT_STREAMS] == 100 assert s[h2.settings.SettingCodes.MAX_HEADER_LIST_SIZE] == 2**16 assert s[h2.settings.SettingCodes.ENABLE_CONNECT_PROTOCOL] == 1 @pytest.mark.parametrize( 'setting,value', [ (h2.settings.SettingCodes.ENABLE_PUSH, 2), (h2.settings.SettingCodes.ENABLE_PUSH, -1), (h2.settings.SettingCodes.INITIAL_WINDOW_SIZE, -1), (h2.settings.SettingCodes.INITIAL_WINDOW_SIZE, 2**34), (h2.settings.SettingCodes.MAX_FRAME_SIZE, 1), (h2.settings.SettingCodes.MAX_FRAME_SIZE, 2**30), (h2.settings.SettingCodes.MAX_HEADER_LIST_SIZE, -1), (h2.settings.SettingCodes.ENABLE_CONNECT_PROTOCOL, -1), ] ) def test_cannot_set_invalid_initial_values(self, setting, value): """ The Settings object can be provided initial values that override the defaults. """ overrides = {setting: value} with pytest.raises(h2.exceptions.InvalidSettingsValueError): h2.settings.Settings(initial_values=overrides) def test_applying_value_doesnt_take_effect_immediately(self): """ When a value is applied to the settings object, it doesn't immediately take effect. """ s = h2.settings.Settings(client=True) s[h2.settings.SettingCodes.HEADER_TABLE_SIZE] == 8000 assert s[h2.settings.SettingCodes.HEADER_TABLE_SIZE] == 4096 def test_acknowledging_values(self): """ When we acknowledge settings, the values change. """ s = h2.settings.Settings(client=True) old_settings = dict(s) new_settings = { h2.settings.SettingCodes.HEADER_TABLE_SIZE: 4000, h2.settings.SettingCodes.ENABLE_PUSH: 0, h2.settings.SettingCodes.INITIAL_WINDOW_SIZE: 60, h2.settings.SettingCodes.MAX_FRAME_SIZE: 16385, h2.settings.SettingCodes.ENABLE_CONNECT_PROTOCOL: 1, } s.update(new_settings) assert dict(s) == old_settings s.acknowledge() assert dict(s) == new_settings def test_acknowledging_returns_the_changed_settings(self): """ Acknowledging settings returns the changes. """ s = h2.settings.Settings(client=True) s[h2.settings.SettingCodes.HEADER_TABLE_SIZE] = 8000 s[h2.settings.SettingCodes.ENABLE_PUSH] = 0 changes = s.acknowledge() assert len(changes) == 2 table_size_change = ( changes[h2.settings.SettingCodes.HEADER_TABLE_SIZE] ) push_change = changes[h2.settings.SettingCodes.ENABLE_PUSH] assert table_size_change.setting == ( h2.settings.SettingCodes.HEADER_TABLE_SIZE ) assert table_size_change.original_value == 4096 assert table_size_change.new_value == 8000 assert push_change.setting == h2.settings.SettingCodes.ENABLE_PUSH assert push_change.original_value == 1 assert push_change.new_value == 0 def test_acknowledging_only_returns_changed_settings(self): """ Acknowledging settings does not return unchanged settings. """ s = h2.settings.Settings(client=True) s[h2.settings.SettingCodes.INITIAL_WINDOW_SIZE] = 70 changes = s.acknowledge() assert len(changes) == 1 assert list(changes.keys()) == [ h2.settings.SettingCodes.INITIAL_WINDOW_SIZE ] def test_deleting_values_deletes_all_of_them(self): """ When we delete a key we lose all state about it. """ s = h2.settings.Settings(client=True) s[h2.settings.SettingCodes.HEADER_TABLE_SIZE] == 8000 del s[h2.settings.SettingCodes.HEADER_TABLE_SIZE] with pytest.raises(KeyError): s[h2.settings.SettingCodes.HEADER_TABLE_SIZE] def test_length_correctly_reported(self): """ Length is related only to the number of keys. """ s = h2.settings.Settings(client=True) assert len(s) == 5 s[h2.settings.SettingCodes.HEADER_TABLE_SIZE] == 8000 assert len(s) == 5 s.acknowledge() assert len(s) == 5 del s[h2.settings.SettingCodes.HEADER_TABLE_SIZE] assert len(s) == 4 def test_new_values_work(self): """ New values initially don't appear """ s = h2.settings.Settings(client=True) s[80] = 81 with pytest.raises(KeyError): s[80] def test_new_values_follow_basic_acknowledgement_rules(self): """ A new value properly appears when acknowledged. """ s = h2.settings.Settings(client=True) s[80] = 81 changed_settings = s.acknowledge() assert s[80] == 81 assert len(changed_settings) == 1 changed = changed_settings[80] assert changed.setting == 80 assert changed.original_value is None assert changed.new_value == 81 def test_single_values_arent_affected_by_acknowledgement(self): """ When acknowledged, unchanged settings remain unchanged. """ s = h2.settings.Settings(client=True) assert s[h2.settings.SettingCodes.HEADER_TABLE_SIZE] == 4096 s.acknowledge() assert s[h2.settings.SettingCodes.HEADER_TABLE_SIZE] == 4096 def test_settings_getters(self): """ Getters exist for well-known settings. """ s = h2.settings.Settings(client=True) assert s.header_table_size == ( s[h2.settings.SettingCodes.HEADER_TABLE_SIZE] ) assert s.enable_push == s[h2.settings.SettingCodes.ENABLE_PUSH] assert s.initial_window_size == ( s[h2.settings.SettingCodes.INITIAL_WINDOW_SIZE] ) assert s.max_frame_size == s[h2.settings.SettingCodes.MAX_FRAME_SIZE] assert s.max_concurrent_streams == 2**32 + 1 # A sensible default. assert s.max_header_list_size is None assert s.enable_connect_protocol == s[ h2.settings.SettingCodes.ENABLE_CONNECT_PROTOCOL ] def test_settings_setters(self): """ Setters exist for well-known settings. """ s = h2.settings.Settings(client=True) s.header_table_size = 0 s.enable_push = 1 s.initial_window_size = 2 s.max_frame_size = 16385 s.max_concurrent_streams = 4 s.max_header_list_size = 2**16 s.enable_connect_protocol = 1 s.acknowledge() assert s[h2.settings.SettingCodes.HEADER_TABLE_SIZE] == 0 assert s[h2.settings.SettingCodes.ENABLE_PUSH] == 1 assert s[h2.settings.SettingCodes.INITIAL_WINDOW_SIZE] == 2 assert s[h2.settings.SettingCodes.MAX_FRAME_SIZE] == 16385 assert s[h2.settings.SettingCodes.MAX_CONCURRENT_STREAMS] == 4 assert s[h2.settings.SettingCodes.MAX_HEADER_LIST_SIZE] == 2**16 assert s[h2.settings.SettingCodes.ENABLE_CONNECT_PROTOCOL] == 1 @given(integers()) def test_cannot_set_invalid_values_for_enable_push(self, val): """ SETTINGS_ENABLE_PUSH only allows two values: 0, 1. """ assume(val not in (0, 1)) s = h2.settings.Settings() with pytest.raises(h2.exceptions.InvalidSettingsValueError) as e: s.enable_push = val s.acknowledge() assert e.value.error_code == h2.errors.ErrorCodes.PROTOCOL_ERROR assert s.enable_push == 1 with pytest.raises(h2.exceptions.InvalidSettingsValueError) as e: s[h2.settings.SettingCodes.ENABLE_PUSH] = val s.acknowledge() assert e.value.error_code == h2.errors.ErrorCodes.PROTOCOL_ERROR assert s[h2.settings.SettingCodes.ENABLE_PUSH] == 1 @given(integers()) def test_cannot_set_invalid_vals_for_initial_window_size(self, val): """ SETTINGS_INITIAL_WINDOW_SIZE only allows values between 0 and 2**32 - 1 inclusive. """ s = h2.settings.Settings() if 0 <= val <= 2**31 - 1: s.initial_window_size = val s.acknowledge() assert s.initial_window_size == val else: with pytest.raises(h2.exceptions.InvalidSettingsValueError) as e: s.initial_window_size = val s.acknowledge() assert ( e.value.error_code == h2.errors.ErrorCodes.FLOW_CONTROL_ERROR ) assert s.initial_window_size == 65535 with pytest.raises(h2.exceptions.InvalidSettingsValueError) as e: s[h2.settings.SettingCodes.INITIAL_WINDOW_SIZE] = val s.acknowledge() assert ( e.value.error_code == h2.errors.ErrorCodes.FLOW_CONTROL_ERROR ) assert s[h2.settings.SettingCodes.INITIAL_WINDOW_SIZE] == 65535 @given(integers()) def test_cannot_set_invalid_values_for_max_frame_size(self, val): """ SETTINGS_MAX_FRAME_SIZE only allows values between 2**14 and 2**24 - 1. """ s = h2.settings.Settings() if 2**14 <= val <= 2**24 - 1: s.max_frame_size = val s.acknowledge() assert s.max_frame_size == val else: with pytest.raises(h2.exceptions.InvalidSettingsValueError) as e: s.max_frame_size = val s.acknowledge() assert e.value.error_code == h2.errors.ErrorCodes.PROTOCOL_ERROR assert s.max_frame_size == 16384 with pytest.raises(h2.exceptions.InvalidSettingsValueError) as e: s[h2.settings.SettingCodes.MAX_FRAME_SIZE] = val s.acknowledge() assert e.value.error_code == h2.errors.ErrorCodes.PROTOCOL_ERROR assert s[h2.settings.SettingCodes.MAX_FRAME_SIZE] == 16384 @given(integers()) def test_cannot_set_invalid_values_for_max_header_list_size(self, val): """ SETTINGS_MAX_HEADER_LIST_SIZE only allows non-negative values. """ s = h2.settings.Settings() if val >= 0: s.max_header_list_size = val s.acknowledge() assert s.max_header_list_size == val else: with pytest.raises(h2.exceptions.InvalidSettingsValueError) as e: s.max_header_list_size = val s.acknowledge() assert e.value.error_code == h2.errors.ErrorCodes.PROTOCOL_ERROR assert s.max_header_list_size is None with pytest.raises(h2.exceptions.InvalidSettingsValueError) as e: s[h2.settings.SettingCodes.MAX_HEADER_LIST_SIZE] = val s.acknowledge() assert e.value.error_code == h2.errors.ErrorCodes.PROTOCOL_ERROR with pytest.raises(KeyError): s[h2.settings.SettingCodes.MAX_HEADER_LIST_SIZE] @given(integers()) def test_cannot_set_invalid_values_for_enable_connect_protocol(self, val): """ SETTINGS_ENABLE_CONNECT_PROTOCOL only allows two values: 0, 1. """ assume(val not in (0, 1)) s = h2.settings.Settings() with pytest.raises(h2.exceptions.InvalidSettingsValueError) as e: s.enable_connect_protocol = val s.acknowledge() assert e.value.error_code == h2.errors.ErrorCodes.PROTOCOL_ERROR assert s.enable_connect_protocol == 0 with pytest.raises(h2.exceptions.InvalidSettingsValueError) as e: s[h2.settings.SettingCodes.ENABLE_CONNECT_PROTOCOL] = val s.acknowledge() assert e.value.error_code == h2.errors.ErrorCodes.PROTOCOL_ERROR assert s[h2.settings.SettingCodes.ENABLE_CONNECT_PROTOCOL] == 0 class TestSettingsEquality(object): """ A class defining tests for the standard implementation of == and != . """ SettingsStrategy = builds( h2.settings.Settings, client=booleans(), initial_values=fixed_dictionaries({ h2.settings.SettingCodes.HEADER_TABLE_SIZE: integers(0, 2**32 - 1), h2.settings.SettingCodes.ENABLE_PUSH: integers(0, 1), h2.settings.SettingCodes.INITIAL_WINDOW_SIZE: integers(0, 2**31 - 1), h2.settings.SettingCodes.MAX_FRAME_SIZE: integers(2**14, 2**24 - 1), h2.settings.SettingCodes.MAX_CONCURRENT_STREAMS: integers(0, 2**32 - 1), h2.settings.SettingCodes.MAX_HEADER_LIST_SIZE: integers(0, 2**32 - 1), }) ) @given(settings=SettingsStrategy) def test_equality_reflexive(self, settings): """ An object compares equal to itself using the == operator and the != operator. """ assert (settings == settings) assert not (settings != settings) @given(settings=SettingsStrategy, o_settings=SettingsStrategy) def test_equality_multiple(self, settings, o_settings): """ Two objects compare themselves using the == operator and the != operator. """ if settings == o_settings: assert settings == o_settings assert not (settings != o_settings) else: assert settings != o_settings assert not (settings == o_settings) @given(settings=SettingsStrategy) def test_another_type_equality(self, settings): """ The object does not compare equal to an object of an unrelated type (which does not implement the comparison) using the == operator. """ obj = object() assert (settings != obj) assert not (settings == obj) @given(settings=SettingsStrategy) def test_delegated_eq(self, settings): """ The result of comparison is delegated to the right-hand operand if it is of an unrelated type. """ class Delegate(object): def __eq__(self, other): return [self] def __ne__(self, other): return [self] delg = Delegate() assert (settings == delg) == [delg] assert (settings != delg) == [delg] h2-3.1.1/test/test_state_machines.py0000664000175000017500000001307613421652727020314 0ustar ubuntuubuntu00000000000000# -*- coding: utf-8 -*- """ test_state_machines ~~~~~~~~~~~~~~~~~~~ These tests validate the state machines directly. Writing meaningful tests for this case can be tricky, so the majority of these tests use Hypothesis to try to talk about general behaviours rather than specific cases. """ import pytest import h2.connection import h2.exceptions import h2.stream from hypothesis import given from hypothesis.strategies import sampled_from class TestConnectionStateMachine(object): """ Tests of the connection state machine. """ @given(state=sampled_from(h2.connection.ConnectionState), input_=sampled_from(h2.connection.ConnectionInputs)) def test_state_transitions(self, state, input_): c = h2.connection.H2ConnectionStateMachine() c.state = state try: c.process_input(input_) except h2.exceptions.ProtocolError: assert c.state == h2.connection.ConnectionState.CLOSED else: assert c.state in h2.connection.ConnectionState def test_state_machine_only_allows_connection_states(self): """ The Connection state machine only allows ConnectionState inputs. """ c = h2.connection.H2ConnectionStateMachine() with pytest.raises(ValueError): c.process_input(1) @pytest.mark.parametrize( "state", ( s for s in h2.connection.ConnectionState if s != h2.connection.ConnectionState.CLOSED ), ) @pytest.mark.parametrize( "input_", [ h2.connection.ConnectionInputs.RECV_PRIORITY, h2.connection.ConnectionInputs.SEND_PRIORITY ] ) def test_priority_frames_allowed_in_all_states(self, state, input_): """ Priority frames can be sent/received in all connection states except closed. """ c = h2.connection.H2ConnectionStateMachine() c.state = state c.process_input(input_) class TestStreamStateMachine(object): """ Tests of the stream state machine. """ @given(state=sampled_from(h2.stream.StreamState), input_=sampled_from(h2.stream.StreamInputs)) def test_state_transitions(self, state, input_): s = h2.stream.H2StreamStateMachine(stream_id=1) s.state = state try: s.process_input(input_) except h2.exceptions.StreamClosedError: # This can only happen for streams that started in the closed # state OR where the input was RECV_DATA and the state was not # OPEN or HALF_CLOSED_LOCAL OR where the state was # HALF_CLOSED_REMOTE and a frame was received. if state == h2.stream.StreamState.CLOSED: assert s.state == h2.stream.StreamState.CLOSED elif input_ == h2.stream.StreamInputs.RECV_DATA: assert s.state == h2.stream.StreamState.CLOSED assert state not in ( h2.stream.StreamState.OPEN, h2.stream.StreamState.HALF_CLOSED_LOCAL, ) elif state == h2.stream.StreamState.HALF_CLOSED_REMOTE: assert input_ in ( h2.stream.StreamInputs.RECV_HEADERS, h2.stream.StreamInputs.RECV_PUSH_PROMISE, h2.stream.StreamInputs.RECV_DATA, h2.stream.StreamInputs.RECV_CONTINUATION, ) except h2.exceptions.ProtocolError: assert s.state == h2.stream.StreamState.CLOSED else: assert s.state in h2.stream.StreamState def test_state_machine_only_allows_stream_states(self): """ The Stream state machine only allows StreamState inputs. """ s = h2.stream.H2StreamStateMachine(stream_id=1) with pytest.raises(ValueError): s.process_input(1) def test_stream_state_machine_forbids_pushes_on_server_streams(self): """ Streams where this peer is a server do not allow receiving pushed frames. """ s = h2.stream.H2StreamStateMachine(stream_id=1) s.process_input(h2.stream.StreamInputs.RECV_HEADERS) with pytest.raises(h2.exceptions.ProtocolError): s.process_input(h2.stream.StreamInputs.RECV_PUSH_PROMISE) def test_stream_state_machine_forbids_sending_pushes_from_clients(self): """ Streams where this peer is a client do not allow sending pushed frames. """ s = h2.stream.H2StreamStateMachine(stream_id=1) s.process_input(h2.stream.StreamInputs.SEND_HEADERS) with pytest.raises(h2.exceptions.ProtocolError): s.process_input(h2.stream.StreamInputs.SEND_PUSH_PROMISE) @pytest.mark.parametrize( "input_", [ h2.stream.StreamInputs.SEND_HEADERS, h2.stream.StreamInputs.SEND_PUSH_PROMISE, h2.stream.StreamInputs.SEND_RST_STREAM, h2.stream.StreamInputs.SEND_DATA, h2.stream.StreamInputs.SEND_WINDOW_UPDATE, h2.stream.StreamInputs.SEND_END_STREAM, ] ) def test_cannot_send_on_closed_streams(self, input_): """ Sending anything but a PRIORITY frame is forbidden on closed streams. """ c = h2.stream.H2StreamStateMachine(stream_id=1) c.state = h2.stream.StreamState.CLOSED expected_error = ( h2.exceptions.ProtocolError if input_ == h2.stream.StreamInputs.SEND_PUSH_PROMISE else h2.exceptions.StreamClosedError ) with pytest.raises(expected_error): c.process_input(input_) h2-3.1.1/test/test_stream_reset.py0000664000175000017500000001145313421652727020017 0ustar ubuntuubuntu00000000000000# -*- coding: utf-8 -*- """ test_stream_reset ~~~~~~~~~~~~~~~~~ More complex tests that exercise stream resetting functionality to validate that connection state is appropriately maintained. Specifically, these tests validate that streams that have been reset accurately keep track of connection-level state. """ import pytest import h2.connection import h2.errors import h2.events class TestStreamReset(object): """ Tests for resetting streams. """ example_request_headers = [ (b':authority', b'example.com'), (b':path', b'/'), (b':scheme', b'https'), (b':method', b'GET'), ] example_response_headers = [ (b':status', b'200'), (b'server', b'fake-serv/0.1.0'), (b'content-length', b'0') ] def test_reset_stream_keeps_header_state_correct(self, frame_factory): """ A stream that has been reset still affects the header decoder. """ c = h2.connection.H2Connection() c.initiate_connection() c.send_headers(stream_id=1, headers=self.example_request_headers) c.reset_stream(stream_id=1) c.send_headers(stream_id=3, headers=self.example_request_headers) c.clear_outbound_data_buffer() f = frame_factory.build_headers_frame( headers=self.example_response_headers, stream_id=1 ) rst_frame = frame_factory.build_rst_stream_frame( 1, h2.errors.ErrorCodes.STREAM_CLOSED ) events = c.receive_data(f.serialize()) assert not events assert c.data_to_send() == rst_frame.serialize() # This works because the header state should be intact from the headers # frame that was send on stream 1, so they should decode cleanly. f = frame_factory.build_headers_frame( headers=self.example_response_headers, stream_id=3 ) event = c.receive_data(f.serialize())[0] assert isinstance(event, h2.events.ResponseReceived) assert event.stream_id == 3 assert event.headers == self.example_response_headers @pytest.mark.parametrize('close_id,other_id', [(1, 3), (3, 1)]) def test_reset_stream_keeps_flow_control_correct(self, close_id, other_id, frame_factory): """ A stream that has been reset still affects the connection flow control window. """ c = h2.connection.H2Connection() c.initiate_connection() c.send_headers(stream_id=1, headers=self.example_request_headers) c.send_headers(stream_id=3, headers=self.example_request_headers) # Record the initial window size. initial_window = c.remote_flow_control_window(stream_id=other_id) f = frame_factory.build_headers_frame( headers=self.example_response_headers, stream_id=close_id ) c.receive_data(f.serialize()) c.reset_stream(stream_id=close_id) c.clear_outbound_data_buffer() f = frame_factory.build_data_frame( data=b'some data!', stream_id=close_id ) events = c.receive_data(f.serialize()) rst_frame = frame_factory.build_rst_stream_frame( close_id, h2.errors.ErrorCodes.STREAM_CLOSED ) assert not events assert c.data_to_send() == rst_frame.serialize() new_window = c.remote_flow_control_window(stream_id=other_id) assert initial_window - len(b'some data!') == new_window @pytest.mark.parametrize('clear_streams', [True, False]) def test_reset_stream_automatically_resets_pushed_streams(self, frame_factory, clear_streams): """ Resetting a stream causes RST_STREAM frames to be automatically emitted to close any streams pushed after the reset. """ c = h2.connection.H2Connection() c.initiate_connection() c.send_headers(stream_id=1, headers=self.example_request_headers) c.reset_stream(stream_id=1) c.clear_outbound_data_buffer() if clear_streams: # Call open_outbound_streams to force the connection to clean # closed streams. c.open_outbound_streams f = frame_factory.build_push_promise_frame( stream_id=1, promised_stream_id=2, headers=self.example_request_headers, ) events = c.receive_data(f.serialize()) assert not events f = frame_factory.build_rst_stream_frame( stream_id=2, error_code=h2.errors.ErrorCodes.REFUSED_STREAM, ) assert c.data_to_send() == f.serialize() h2-3.1.1/test/test_utility_functions.py0000664000175000017500000001517613421652727021123 0ustar ubuntuubuntu00000000000000# -*- coding: utf-8 -*- """ test_utility_functions ~~~~~~~~~~~~~~~~~~~~~~ Tests for the various utility functions provided by hyper-h2. """ import pytest import h2.config import h2.connection import h2.errors import h2.events import h2.exceptions from h2.utilities import SizeLimitDict, extract_method_header # These tests require a non-list-returning range function. try: range = xrange except NameError: range = range class TestGetNextAvailableStreamID(object): """ Tests for the ``H2Connection.get_next_available_stream_id`` method. """ example_request_headers = [ (':authority', 'example.com'), (':path', '/'), (':scheme', 'https'), (':method', 'GET'), ] example_response_headers = [ (':status', '200'), ('server', 'fake-serv/0.1.0') ] server_config = h2.config.H2Configuration(client_side=False) def test_returns_correct_sequence_for_clients(self, frame_factory): """ For a client connection, the correct sequence of stream IDs is returned. """ # Running the exhaustive version of this test (all 1 billion available # stream IDs) is too painful. For that reason, we validate that the # original sequence is right for the first few thousand, and then just # check that it terminates properly. # # Make sure that the streams get cleaned up: 8k streams floating # around would make this test memory-hard, and it's not supposed to be # a test of how much RAM your machine has. c = h2.connection.H2Connection() c.initiate_connection() initial_sequence = range(1, 2**13, 2) for expected_stream_id in initial_sequence: stream_id = c.get_next_available_stream_id() assert stream_id == expected_stream_id c.send_headers( stream_id=stream_id, headers=self.example_request_headers, end_stream=True ) f = frame_factory.build_headers_frame( headers=self.example_response_headers, stream_id=stream_id, flags=['END_STREAM'], ) c.receive_data(f.serialize()) c.clear_outbound_data_buffer() # Jump up to the last available stream ID. Don't clean up the stream # here because who cares about one stream. last_client_id = 2**31 - 1 c.send_headers( stream_id=last_client_id, headers=self.example_request_headers, end_stream=True ) with pytest.raises(h2.exceptions.NoAvailableStreamIDError): c.get_next_available_stream_id() def test_returns_correct_sequence_for_servers(self, frame_factory): """ For a server connection, the correct sequence of stream IDs is returned. """ # Running the exhaustive version of this test (all 1 billion available # stream IDs) is too painful. For that reason, we validate that the # original sequence is right for the first few thousand, and then just # check that it terminates properly. # # Make sure that the streams get cleaned up: 8k streams floating # around would make this test memory-hard, and it's not supposed to be # a test of how much RAM your machine has. c = h2.connection.H2Connection(config=self.server_config) c.initiate_connection() c.receive_data(frame_factory.preamble()) f = frame_factory.build_headers_frame( headers=self.example_request_headers ) c.receive_data(f.serialize()) initial_sequence = range(2, 2**13, 2) for expected_stream_id in initial_sequence: stream_id = c.get_next_available_stream_id() assert stream_id == expected_stream_id c.push_stream( stream_id=1, promised_stream_id=stream_id, request_headers=self.example_request_headers ) c.send_headers( stream_id=stream_id, headers=self.example_response_headers, end_stream=True ) c.clear_outbound_data_buffer() # Jump up to the last available stream ID. Don't clean up the stream # here because who cares about one stream. last_server_id = 2**31 - 2 c.push_stream( stream_id=1, promised_stream_id=last_server_id, request_headers=self.example_request_headers, ) with pytest.raises(h2.exceptions.NoAvailableStreamIDError): c.get_next_available_stream_id() def test_does_not_increment_without_stream_send(self): """ If a new stream isn't actually created, the next stream ID doesn't change. """ c = h2.connection.H2Connection() c.initiate_connection() first_stream_id = c.get_next_available_stream_id() second_stream_id = c.get_next_available_stream_id() assert first_stream_id == second_stream_id c.send_headers( stream_id=first_stream_id, headers=self.example_request_headers ) third_stream_id = c.get_next_available_stream_id() assert third_stream_id == (first_stream_id + 2) class TestExtractHeader(object): example_request_headers = [ (u':authority', u'example.com'), (u':path', u'/'), (u':scheme', u'https'), (u':method', u'GET'), ] example_headers_with_bytes = [ (b':authority', b'example.com'), (b':path', b'/'), (b':scheme', b'https'), (b':method', b'GET'), ] @pytest.mark.parametrize( 'headers', [example_request_headers, example_headers_with_bytes] ) def test_extract_header_method(self, headers): assert extract_method_header(headers) == b'GET' def test_size_limit_dict_limit(): dct = SizeLimitDict(size_limit=2) dct[1] = 1 dct[2] = 2 assert len(dct) == 2 assert dct[1] == 1 assert dct[2] == 2 dct[3] = 3 assert len(dct) == 2 assert dct[2] == 2 assert dct[3] == 3 assert 1 not in dct def test_size_limit_dict_limit_init(): initial_dct = { 1: 1, 2: 2, 3: 3, } dct = SizeLimitDict(initial_dct, size_limit=2) assert len(dct) == 2 def test_size_limit_dict_no_limit(): dct = SizeLimitDict(size_limit=None) dct[1] = 1 dct[2] = 2 assert len(dct) == 2 assert dct[1] == 1 assert dct[2] == 2 dct[3] = 3 assert len(dct) == 3 assert dct[1] == 1 assert dct[2] == 2 assert dct[3] == 3 h2-3.1.1/test_requirements.txt0000664000175000017500000000012013521033071017224 0ustar ubuntuubuntu00000000000000pytest==4.6.2 pytest-cov==2.7.1 coverage==4.5.3 pytest-xdist==1.29.0 hypothesis h2-3.1.1/tox.ini0000664000175000017500000000220013521033071014215 0ustar ubuntuubuntu00000000000000[tox] envlist = py27, py34, py35, py36, py37, pypy, lint, packaging, docs [testenv] deps= -r{toxinidir}/test_requirements.txt commands= coverage run -m py.test {posargs} {toxinidir}/test/ coverage report [testenv:pypy] # temporarily disable coverage testing on PyPy due to performance problems commands= py.test {posargs} {toxinidir}/test/ [testenv:lint] basepython=python3.7 deps = flake8==3.7.8 commands = flake8 --max-complexity 10 h2 test [testenv:docs] basepython=python3.7 deps = sphinx==1.4.9 changedir = {toxinidir}/docs whitelist_externals = rm commands = rm -rf build sphinx-build -nW -b html -d build/doctrees source build/html [testenv:graphs] basepython=python2.7 deps = graphviz==0.11.1 commands = python visualizer/visualize.py -i docs/source/_static [testenv:packaging] basepython=python3.7 deps = check-manifest==0.39 readme-renderer==24.0 commands = check-manifest python setup.py check --metadata --restructuredtext --strict [testenv:h2spec] basepython=python3.6 deps = twisted[tls]==17.1.0 whitelist_externals = {toxinidir}/test/h2spectest.sh commands = {toxinidir}/test/h2spectest.sh h2-3.1.1/utils/0000775000175000017500000000000013521033126014051 5ustar ubuntuubuntu00000000000000h2-3.1.1/utils/backport.sh0000775000175000017500000000135213421652727016233 0ustar ubuntuubuntu00000000000000#!/usr/bin/env bash # This script is invoked as follows: the first argument is the target branch # for the backport. All following arguments are considered the "commit spec", # and will be passed to cherry-pick. TARGET_BRANCH="$1" PR_BRANCH="backport-${TARGET_BRANCH}" COMMIT_SPEC="${@:2}" if ! git checkout "$TARGET_BRANCH"; then echo "Failed to checkout $TARGET_BRANCH" exit 1 fi if ! git pull --ff-only; then echo "Unable to update $TARGET_BRANCH" exit 2 fi if ! git checkout -b "$PR_BRANCH"; then echo "Failed to open new branch $PR_BRANCH" exit 3 fi if ! git cherry-pick -x $COMMIT_SPEC; then echo "Cherry-pick failed. Please fix up manually." else echo "Clean backport. Add changelog and open PR." fi h2-3.1.1/visualizer/0000775000175000017500000000000013521033126015106 5ustar ubuntuubuntu00000000000000h2-3.1.1/visualizer/NOTICES.visualizer0000664000175000017500000000223113421652727020344 0ustar ubuntuubuntu00000000000000This module contains code inspired by and borrowed from Automat. That code was made available under the following license: Copyright (c) 2014 Rackspace 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. h2-3.1.1/visualizer/visualize.py0000664000175000017500000001673613421652727017525 0ustar ubuntuubuntu00000000000000# -*- coding: utf-8 -*- """ State Machine Visualizer ~~~~~~~~~~~~~~~~~~~~~~~~ This code provides a module that can use graphviz to visualise the state machines included in hyper-h2. These visualisations can be used as part of the documentation of hyper-h2, and as a reference material to understand how the state machines function. The code in this module is heavily inspired by code in Automat, which can be found here: https://github.com/glyph/automat. For details on the licensing of Automat, please see the NOTICES.visualizer file in this folder. This module is very deliberately not shipped with the rest of hyper-h2. This is because it is of minimal value to users who are installing hyper-h2: its use is only really for the developers of hyper-h2. """ from __future__ import print_function import argparse import collections import sys import graphviz import graphviz.files import h2.connection import h2.stream StateMachine = collections.namedtuple( 'StateMachine', ['fqdn', 'machine', 'states', 'inputs', 'transitions'] ) # This is all the state machines we currently know about and will render. # If any new state machines are added, they should be inserted here. STATE_MACHINES = [ StateMachine( fqdn='h2.connection.H2ConnectionStateMachine', machine=h2.connection.H2ConnectionStateMachine, states=h2.connection.ConnectionState, inputs=h2.connection.ConnectionInputs, transitions=h2.connection.H2ConnectionStateMachine._transitions, ), StateMachine( fqdn='h2.stream.H2StreamStateMachine', machine=h2.stream.H2StreamStateMachine, states=h2.stream.StreamState, inputs=h2.stream.StreamInputs, transitions=h2.stream._transitions, ), ] def quote(s): return '"{}"'.format(s.replace('"', r'\"')) def html(s): return '<{}>'.format(s) def element(name, *children, **attrs): """ Construct a string from the HTML element description. """ formatted_attributes = ' '.join( '{}={}'.format(key, quote(str(value))) for key, value in sorted(attrs.items()) ) formatted_children = ''.join(children) return u'<{name} {attrs}>{children}'.format( name=name, attrs=formatted_attributes, children=formatted_children ) def row_for_output(event, side_effect): """ Given an output tuple (an event and its side effect), generates a table row from it. """ point_size = {'point-size': '9'} event_cell = element( "td", element("font", enum_member_name(event), **point_size) ) side_effect_name = ( function_name(side_effect) if side_effect is not None else "None" ) side_effect_cell = element( "td", element("font", side_effect_name, **point_size) ) return element("tr", event_cell, side_effect_cell) def table_maker(initial_state, final_state, outputs, port): """ Construct an HTML table to label a state transition. """ header = "{} -> {}".format( enum_member_name(initial_state), enum_member_name(final_state) ) header_row = element( "tr", element( "td", element( "font", header, face="menlo-italic" ), port=port, colspan="2", ) ) rows = [header_row] rows.extend(row_for_output(*output) for output in outputs) return element("table", *rows) def enum_member_name(state): """ All enum member names have the form .. For our rendering we only want the member name, so we take their representation and split it. """ return str(state).split('.', 1)[1] def function_name(func): """ Given a side-effect function, return its string name. """ return func.__name__ def build_digraph(state_machine): """ Produce a L{graphviz.Digraph} object from a state machine. """ digraph = graphviz.Digraph(node_attr={'fontname': 'Menlo'}, edge_attr={'fontname': 'Menlo'}, graph_attr={'dpi': '200'}) # First, add the states as nodes. seen_first_state = False for state in state_machine.states: if not seen_first_state: state_shape = "bold" font_name = "Menlo-Bold" else: state_shape = "" font_name = "Menlo" digraph.node(enum_member_name(state), fontame=font_name, shape="ellipse", style=state_shape, color="blue") seen_first_state = True # We frequently have vary many inputs that all trigger the same state # transition, and only differ in terms of their input and side-effect. It # would be polite to say that graphviz does not handle this very well. So # instead we *collapse* the state transitions all into the one edge, and # then provide a label that displays a table of all the inputs and their # associated side effects. transitions = collections.defaultdict(list) for transition in state_machine.transitions.items(): initial_state, event = transition[0] side_effect, final_state = transition[1] transition_key = (initial_state, final_state) transitions[transition_key].append((event, side_effect)) for n, (transition_key, outputs) in enumerate(transitions.items()): this_transition = "t{}".format(n) initial_state, final_state = transition_key port = "tableport" table = table_maker( initial_state=initial_state, final_state=final_state, outputs=outputs, port=port ) digraph.node(this_transition, label=html(table), margin="0.2", shape="none") digraph.edge(enum_member_name(initial_state), '{}:{}:w'.format(this_transition, port), arrowhead="none") digraph.edge('{}:{}:e'.format(this_transition, port), enum_member_name(final_state)) return digraph def main(): """ Renders all the state machines in hyper-h2 into images. """ program_name = sys.argv[0] argv = sys.argv[1:] description = """ Visualize hyper-h2 state machines as graphs. """ epilog = """ You must have the graphviz tool suite installed. Please visit http://www.graphviz.org for more information. """ argument_parser = argparse.ArgumentParser( prog=program_name, description=description, epilog=epilog ) argument_parser.add_argument( '--image-directory', '-i', help="Where to write out image files.", default=".h2_visualize" ) argument_parser.add_argument( '--view', '-v', help="View rendered graphs with default image viewer", default=False, action="store_true" ) args = argument_parser.parse_args(argv) for state_machine in STATE_MACHINES: print(state_machine.fqdn, '...discovered') digraph = build_digraph(state_machine) if args.image_directory: digraph.format = "png" digraph.render(filename="{}.dot".format(state_machine.fqdn), directory=args.image_directory, view=args.view, cleanup=True) print(state_machine.fqdn, "...wrote image into", args.image_directory) if __name__ == '__main__': main()

jt#=q|[n뚂 'N} F4ŗD@@@@@R޽v>e:v3&@$ h|\r96peɒmCƍNw\OQaj[XϞ@$h3XE3/~m6IW7b&   3IBA@ iݺ,_\-]vfm&?TRz>|A?dNtpT_Zd9rD:wl֙5kV ?͹tRm=CuK}a>ӡL>gڙ6aU3>w{ŋKFVZrʀE{f8&c~vx s׭[7nOF'I}[|מ7Og|Rre={;w.:{O;|?t$&Jɒ%ϫʆy;aF L0Aʕ+'z΅rO۱cAV‚H^Kټ~me J`@Ҧ@|0{YjTZ7ݻ|Ͳe˖}'~h -(STN@T"F{1Lm36X7 ;D@@7Y͏ ˛/̝;ϛ71ɡs      @2eIzrIs]v̚5+`ltA"Y_dydРA&ҥKꫯ1c# /B;v\r&ҕqLK 6يuی hv7ITgVM+GW\if{cj\P]l 8m36X7 {D@@ cl1z v]wݻe_1D_[n1j'B 1F;vL6l2*U$tgxF֬Yc:͜9ӝow- 6tyGV^82$g\OΙ3ǭ[oM(ZJw&իk_NlMwD )Pem׮]gupYٱcl:t8p, [64HhJO5~oݺt4/~ϟ_.r7A]ĩ4;IOȑ#~{rѢ>픘PMEg{dC[!7 hcϼx@F% o۶mM+M%t VG6%g_6狀[גw,7{     xjժ%UV˗~&Xw˗7Ǯ6mn>*_u%{ҩS'ٳ'Am\F@@ h_L2~ 6,| J @РW@@@@ ƀҥ;]o4I5 @(1oskl$g}iٲIꫯK6v&x;x,^X4qQ7 ҘƍǏiBڧ~?. #&nʔ)fJjR-Ύm؊uی h6݉2v|1Rq6mk+w:tgΜ1oߞD2w0lz=ߛx)wMg@@ 1f[Y`ApQ0jM`I׮]kYp}աCѤDN *Yv`L9%/U+V(y2w\gYhQD_]{v`*{v[|g*z~~$jfm!'ߞ={+O?$ .tkp:u[6իy .,?.){ݺui:8p 0Ԩ|O IyJM"F\ؼy-[Yk3G>恮q]g˖-mڴ1ZMyԩS\}(6k,y=k%>=.];PŞ{(f{>hhխ[75vDտ﹧IJH[גϰMHԃ     4=cLi4hAsٳgh1Z'g1&l2޽y4]_|1@:3D@ҢE]$իW퓤}ORiѢر#"! KvT   EݻwK&M|h̏QFI,Y!sL h"UVIǎef&fpH,Jի'ᅲodl@ @|vذaGu7ϕ+}&tb:i:ug=&R6 %btZIſ2p:?'4믻ɰ&L, >MӃm7 %TwpرcdCl-z+l] IǍ7|g:m{a[oʕTR.ƍqgD hpI-E59,>/`&t:JW\q1]?HӦM}fj &~ƚ{}1/:ݛXFgҥKKrI[NI3Y'ԡkTYӡ|Fzk=!vHX     ~.)SY-_:F}h +a{E,YeQ6MFFW@@_'N͚5 @@@@@@L LldҤI2~x0J@ =prE v!u֕]X{eѢEr嗛}koϺu-@T,p!߿q7h q0fϞ78_07KKh?3cԅ.Ԙيg;6vMwb:g^lڌ(ٌ?o|.^r%۷㉍2Ol,+`|uؾN=xvjG@@E *>ԗv裏K1:Ex9ry̙SnfiРIإ (G )@P߿?yhJ*]7+Wt7S˗ϝĈͶtw:J9wŋ;ڙJY:Eߧ;Ù}xeGڏur뭷aCtM2|)_|wG} @T<(F2K5Sf*ڵ={he @ u <Ϛ&O,;/%zl6icjݦ;vS&֮sF#gfMmGÿΛ7OVXr^|m۶㉍2Olq9pC{Wl3X7@@@J޽{~&7|#O6m>~藁RHnݺRfMK|I/BIV勺Ki5YSOٝd QjUw<#6ۮ~eٳ'D88P;hp@Ŗo&Guwꃕ%Kxnذ!E:m|OmzVso"F}OEۡ]0u#&S4A#sk> K@@40qYfB@@@bW@<2m4 jժe~ .d@t&J?s=zhr'Oʚ5kLܫJ.]$cƌVT/n1j _Uvab͝;WUfeTQ0z0fɒEZli.\f"$){e⚎3Fu&9sPW0؜`vuzcjhNݔ}DhīԜdE_Zu-Em`779c:{pC;/Y @@ yDPPBO… Ei6mڈ_O ,(ʕ'xBf̘!vʸe&+Ӏ(RL;uN䗶ev\\S8pĈͶvp(!oᮢ VlaʃJmc%|]le5 K/57n?~lٲ:tICjpVhz')$1Jl$$~–~biZRy_o4V[47ywYRƽ׃nkTl]K|P       Ɵy>7n,YR &a̓'h@}ݮ];! c,@RRYfzݙ      JMt 7$adRO$-Q )$!Cԩ|RR%ӊSNC7|l޼Z4ŋM݉S̛7>Ǝ|hѢQOӶm[&$> (Q˾}Lj{{KfAuَ hjb۝Xяq6mbb::tQ?\/_Ls={1n۶͝؈ ڗ7w9c:{p>Y   c ń@|L"7M_/2|pWdϞ֯_/&L͛_.}2eΙd{>2l &3gϾkժ3L$ !gs'N(Lhlmpw1GϘ1-ȖMRՀޒIl̽ȑCʖ-k(*3&b\RK [o5:νf矇zMptqV %ymP?t]oT=:cu\9[裏>jptŊũn>?jH9S@Ǒ(6%S=~N'm%`@@@@@` F9hyd˖-V *zgJH3gΔrIdϞ=Yf;ʦMW^3gT|4 @H}M'M@IDAT4ٳ@@@@@@G`ƌ&ӺuLGM&HQN;E;ԨQÙzI|Vsdɒ>AOdܹIiy8tI3f_HiѢ;hĖMR[]lII+JL&N";vv/ʾ}̃!Cy[n5f"gvt֯˪T⬚?㥗^ #zu=FiyѣV*W_}7.qJθҶ:o=#U ʪuFgZ}?U [RRM u      &~ܹYM :4M\v8EHA |79gӦM7!Ci޼_^F&CM  iAֲk./# C@@@@@ӧcǎߌJ*/{oB5 ]lٲ7D@;&=4hq\p֬Y3Sz!H ӧI49,YHM_]R"`rm@WL2OR 9sw(Ly`q2>XZGRۿ3vl@[v'ncj#ΦnGuZ4gSw-Ċ 7w94yI75@@@ dNƑg9rHzKȷ~+_h'+V?3     @0&`O|;.ٲٲe8pmKBܕ7uVY){j\:k$bezϙ3GNČTP]uڵxB#,@>/ })SpJJ5֠AgC@@y睒?~@Zg6At8˯*UVG@رc\p1z   DV@ch{gnh  $M@ciBKڴi#lBckh$$e HZAʘ17N4RZI1t98|?;8$`C}w[o$־NG;d]V|=[؀m۝XElٴc3G}?'ݺu;ﷶ7Eq6 8apG1:xq6שsx#1D@@ cx^Fr!5k4/琶mf2:˝Ǐ;P;|,\м2dMVLJAKS*Ӷj@իW4o4%K_ Z۰ayQЕ,&u r$_7Y/tW^1Nlmw84qn&~Ǣ>NڵILڲIpC"8EI f2HMĨ o:u+YM&ĺNYh3j$mO&47t-;Yf{Ǽ4;c2zi_)ϐ_z%=z9VjІ^xA|A8( @@ d˖M7o.Ǐ'No-O=T* s  ^@S@@@@.pݻ :TK/.f͒hH? 7;t ӦM3^xbQF${_~I>8q3~@  ǎ0cϞ=}bEM/Pzu(]vfYm TV|=睲f>uΒ 1ڎz|wS!jʝvF1jĊ ˉsu>yI&3D@@*@"s h/}5i,/7n(HlժUK@y~5o<"Ѡ *V.RdΜ/AMw1& ] IC ._}BY3/Ľk}2qD3g:ugGLb:!}RR% mG(^~egusز7ԎS[hh奔M%oyWbEdɒ&I~Θ1soޤsջLD$uWyпH3i$*9uxmذItl\U_I s3/֎*[9%4=g+8%Rz^Ե_o,7ԁ     @8u&yɑ#GN{^|rJw֭[} d̘Qʖ-kb߿Up$]f"Ӥ^ΝN믿LR5kסCU~0/wF2e$W\q*T uZrӿ:Mb;/\zJ+ u&$/ϐ!_qa;w逤_L={֭w͢_i`lݿnaAFuwчCNٳg3.]zrroWzCMh")Sg:mOlᾧG\:Ez?riiK[v׮]b{ݕ*UJ#L(M6^uUa;#PֿH'Ӛh믿Xy5|pwȑ>97E2{Kr弓@r&ir+Nk)S=~[גtHy     S[n&iə3gdҵkWgΝ>$`\zy84bŊ'N0*lyFϙ;tp; *x'G U>}\/T9Ek )  /UjL1Ƿ~+7xoM4'Fm@R@E_DA@@@һ&`ҤOsGƁ2dIm8~@l h իKM,ɓ/4ڵkGt͚5=cZjg}fSDtgT^@1B&LQ<: 5'ҧ@ǎM G}T4ڵknMi*1GA>}،U؀6_ wXFv8шi;*Γ'<w .9rm۶y7nXZb7pq: cG<@&@@@2?9 & lРhI&;w'cǎ'|Rԩ#Ŋ̙;bP}̜9S^yS/5k֔%J/15)Yɒ%MF= 6LL"~,YD4h֧m xi{}@tk߾}rJ%KYn6dS!HR?<`:>]\VlݶsL(){=:tXK Rlx`z}R ռY}Xzm0"u-yNM}?[|0[I CI?mw dX)|ݭvTHj.|I&"Do⋽OzHN)y-i{?:l]Kzc.@@@@@(ZyW_}UM&@Iu]}fEϚ5Ky@Ku]'-[4ϟ/1R\pVg] hwyǜߚHI˜)S&i۶lܸQI T ' *1jԨ3@@@@@@?c-u]nŋҥKIh@p ,(Y0jL-[i'NFbnݺW_ILuZjaÆHTO I" 4F/&aN2n8! #' <òb )_X3f'Q~onݺAt]m7NG+Verclw4՚X&5шi;]l{X?͛ם?ݾ}bi>;4b!7yot4Zy)p{'Y  @ q1Q.}ծ]g3gΘ(7o}g\;ބ`>O:tȼ6m(i f_:s疜9sJMrG&t&u$ G6_2*U&dܹمvy^ K5~q{Wqndi>$y7mSkڵ3mݦ{#z;E j2K.Z~|'bYA&Vl9 CD=. =fb=e&wRzW7%k֬:= 2Hʕ_gI6j uS]s-mG8qbݕA@ lkժIYFmbiM2EVi\ŋK d֭&ލ7(s̑n)1ĥc @XN]Tj׮`rL[Mߺ30vsnm۶C]G":C5q6cv7СC}y'4)Sm0L-pxѸN9S=/՘2u^6Guw]tw<<ݞ  $WDd{Ȝ9/^ܼ_dj۷ˎ;w/Wߟ`F=*:)_|+ś( /Ecǎ{OFe H;:_P+R47㯿jm= !DÇwWMmB)liCV4^NiѢILGkh=em:F5髾\)_{9={$-sgt85|[ꗼ[#R,"g̴iLƟ:KtSNޗ* cp9XY׍ֵPBjzG1i$W_~|}o\LnM"$aL!K     mSN7|#\pozBG$bH8K@D[)^=ze˖4^z&CT  @Xٲe{$>s挌3&@aU      A4>̣>ƀ49<  @@@…M,cǚe'N 6oRLo;4;#{oȻO[n&Ήʗ/_۲" כ>ӧO{g`l y>mݺY[7sNB)X_/jl@kב0qj]4blڌ?pwkPa",%cjF:itភk4p-Z$ V;gʔMڨ1׸9r]7w&"   @/rd1"5kV)Ry%d}o>7ޗv89t: uرcrܹ?C8( 0~DlR/z)&X'g=wֳ9t9 "uv^@tPNi׮IL'4ez_u>#>ј&&c֫׷&, x]yKͻϝ;'bÆ I''RjcZ}?2e̛7O4@)UmVti-zd3~ҥ#R}J]K 5>u^$p3?~ܼznC(')3k+/g=8`     :СCeΝa7IĨ?Hx̳+I`1&"ܞ={?&CZ|3  :taÆɓ'M޽{Il;      6=*|Fc8E?c ꫝY @@ 4SO=%ח~X/_n c믏H 5&4jҤhѴiScǎ_~}ѣG'+ @Xz 4HfϞ3Sc;:w,]tQ8X":u$hWMx뭷oi%jے/9Ǖжh;u$371r~y&;}Ihh#s&Ac֖g7 U_/KSY4n|c;-HK4ĉMFh`SM?/SS\YvmĚ(ρPwRRB ~uغzJ7niݺvq1j~,uB&;Iz=j'e$*~+P$ћxRLsΕ+W͘     !MH2fyWdɮU?kذaR~d׫! رc $3yd9s挻ۢE>9  :]8#G/J{h     Ĩ>N[g&EDI-Zѣ L2IϞ=qƢq{9{ϙ3GlժUgI>}LwyUpa_+>|l۶MNjyw1Ln?M4g! zmkׅ 6>`=|d@H w]wrٲeaWQ0ZzZwRJm; v C[q6cVQؒꫯNоN"F]y12O|l3ѸNU%힗p5>̿kn"hkטČ: j\\?X|]geA_6m_tZ7jRF'A3sU   $MDIsc+HD @4hv|9t,YD4 >袋L2u:}5AP8رcһwoMT3LlmwtI4&rҲ{nDMvjQg}֌ M 4go޼YYf6:{j\ 7o$%Y]Zf/7l/؈v&4hJl{mWE&xgXRړ/~f̙S6m*۷jժlP1u_ɩd~ԵPk}[A:ڵ$Xq]/Psc˖-#Ni׮,]ԙ.^Ag&i z}{~^h6mH8A:G%`;>zZ؀ڭmG vuƿsF8o]cF/G 6 ) SofA̽ql3X祗xϸK4NƧ֗dƼu\_IֆA@2$D/Wb$(ETDƫH0 EEEO H%3;;;=SUowT:_ߦ{9:F)Ie˖ZjXbq @ PdNi0@kРA\)wĉi5A!߲"myQGY.]O>V\h޽zm ,q'~۞L2pYr+K/*1Ã>8Q&YlLԆhEc,Y"gr~_۟_9sqڞg*Z*K泔j{xybl#&EYZ]^ .2)UJr Z iӦֲeKon!@ @ @  m۶t&'~.N:ƌi{g .݊g˽k3g kǡjz]tEVDm@ȫqT}NV|=՝؀lڞl:GЈ|,>dsiVA2۞l:|9ovUPP3ڱebYoj Ҏ;-^^{5'lo\i$D=Kz`^+ҝJ=zpvMwu=~U\]hth(`9VV,a'ɧ+vڵѺu| =No#ȑ# +X짟~O?XeS gr!iVA2d?U,E֛oK^2}jܸqL\]J~'b{_A|s[hh^da @ @ =ݻ8BG7mHHht2~x:[TܹyYp-_4%wuO==,u]99@ ? 4jȺuf/}C͟ !@"̙ckR5kfGyr)qGu,Z(Tϛ^N+Yd7~6`QDg̘~SO8#,ˏkɡb1o~,ooބ \SXnklJ:u2Ųۉ+Vhze"iLaܹn·|BbzFtOqXUFmuJٲeb @ @L馛li\_vcB2 KV ~믿\܏6mڸM+]t̾}Om׻8 /*~tѦNjv+wyb<1Sb$j#$Ujذa+߻w)6!Cl޼yaGےBA@T]Ɏ vINpyF g316$O>ӧNeJZQY2G;_~*#n{&Yi~x˼RU~-a@b (&O R.V,{.CM+'Θ F$T@ ;}/_>.wuWjQ &;>ΕzɎ vINpyF g316m] }?b)v~-N6;py72}|iׯ{z)C IkS:,7WRL)VXAFyoO>ٍ (^St7&4 @ Ž/ ={vX}KVN=T3fLh'M7ZP>_QD{Ŧ~Es^z: 82ml[WpF+o=jyzbz[ha_|y $oK5,h,۝P;wyN2Ū b u~w֭[mԩ.*'Sn]7nyA2"7ŵ+Z(x'玬'/WZ5/5'm'gF ձk.7oK@F5M6 F>d.=g)Od=K7/]g0({̙_^Ҙ5l?۔L@ @ @ 4&gٻwn<잛!@=z.?GMq<,Ys3 n8f_-F;BŗSO11 7/|](2I>38_Q1k_zL?裏6s1vwiV  F gSm'3V2럤:%;6`ڭw'h HN>q6c3DOm3QǙʕ+np_OɏKNg7wF+W*@IDATtiժU|91tR"/Rծ]4h&iΖ'y @bF@`&obI!kڴicKHJ.m;wv"dxFkhu,#юYf;F}fLjGlk5kZlYc5@) ' *hÆ [L"Q2gT_mRsf_#}47x\d=Ton䘂j= 9 ,p,ܕ-[ۅd= 4> \o1s?75=裃C @ @ 4nֳgϰ2zhSPU  MXb֯_?y^&Q5Ł{]|6:th0tin_wߍ8|'.&_W  ~h]t1 L>v8" 6ذaÜ8xz?  o dׯ*y؀jw4&xGOH"_O=Vw?$:f4 ?:hР)8=L̑#zHlqN3xN<>x^Z\:ꨣiӦ(/\Fo"?vŏPҸ\tNE%:~x%@ D(}MIDE_'O6M,iJәۖ-[Z} `&5k ]LY !'<rwIW >Ub] &A 7ILΣJ 0A?$On_~;`Ĉv饗 %СM4)l;+pHY,LAӴs }Ge<  e @ @@$9眓>-Z؜9sհ1c/+gE]|xveD@c ꫯF&SRnW$#~!l?Y  @M޽]G5w޼yVtt;~A9_/yWMzT,qtOƤ`&Spǒ%K/4 ޽ەWRVZe~ǰ>,,(xc4[hkmO+7| W\q=sj}tDk+m߰E@vxFu8fO? Qo #DX2nP3O:$SY֭CeJWӧO7WƲd=V [NQϫK|AS0 bi>,sz?#wB+W.tr}13  @ @y,{1Cb,W Z < ' x74PiC*,FlrO 164~@~?/:2}lW7}dƍ3ʕ+; VZag@ dųx A($AyQ UhaժU[۶m d,1O1iR@̘E@$bKQ4$: qf&L; =kGyd< @@'p饗K/|E4X^I-(xeKؚˍ3A8ܛoi]tQTV~GW;0q{,85kLNT~wqG/۷>O꜄u5 QgSOd:u\ʫڎ;8[pkk: @ @ |.bo7{33g @@# !}gazr$g[nulsNDuR}olȐ!j;C^y?^|E3%a+oaϞ=ҳgO'ްaP9@ț 7 Jd،4Z?(+y~#PbEkժKgxA8M\sP u5kf @ HEYuA @"rى'-}Ƕi&'x[ǎ|a^j=&g*U '͜9A @ @(H4N;Xҥ-9K\")#<mSer  92Nkl oNdQ" mk۶om @ P()R yu{챰 …B!Ȃ)jժFHcYFBiюSPʠ}P>(zDCř {7 6c ?f񇛷p°Dʔ&ܗ-[tGX&Mdɒ}@ @ c 9'˾ z!@Q+VJo߾c'(gP%Mƌ~g۷w ".F  @ @@~%p)83<Ӎf 1|سgO@~'T_n> ;N)O+g @p/G}d˅^h&M2`y&L.zLj6bܶm-Y$o7o:F FDΟ??T,ҥKֳᅦ}5kINA3#m١"MXWIW^.`]qMo6o<{C5jI0u%J1ϩ5,]or}*f&YϪ>[nj]=P',xbkݺ @ @1 h~l>},8}%ذaLM1@ رcs]o|>y/c D' o=(?b?ɛoi}HtHڵ]l+SLZ( @  n~ {*T`wKVg\`͝;̙c6m fM6%C%LsmG@15/FbJwa @ G 1l @ @(@$ءCԭ~rF&w}%;㝳9cuq @ @@~"p'ow%5nخ {m+v;!믿o~ <4>_H% @}GTPaM)SmAT0+{Pg$(1ƌ,w?MV9J ,͛U@.7?e4A= IxQٲe޴i4vM\/( P ڵk\L^`9"qh0m {2ϩ)SRRB] ڐL೦)8D&LҺu\{/¥}qgݺu;ϪVr @ @ !pI'ĉOHQX-HQ 4^~e?cUʓ.61G s=v}eS``D0@ "PF {׭}Nr'XPKaٳgz -xcPZt_}UBu+VqȺ˛-\5cƌ4"~>Q)hF)>\ hYLI^^xeDjSaЮjJ*&߹DX2H^xk( rQzV*|Yx@ b @ @E@>[7pmڴ)҇ f+V  @|ͶaÆhrlʕv;?\k'@&GR ~_Bɏ[o: 1 K@@'-7݃ d@ݺuMsΡ#NS~ElϞ=}ou/0ժU7 @(g]E@@,X QUQ @@ɒ%C.=S6sL{w\YJJ}.ir'l }g`f4 @ @(N}{٪!@ mO?ktTTɺuVx juPLq[Bf=6?+U0R-K.m~`>:L. SqZOdT_n|֮] Gi 5e֭6|p7onW\qH!ɲyWMmMk͚5W_5TO}C=ijժ "i%$d9 @ @" vUWل B<@{3 @|G6f̘Xs\ȗ\rկ_?W!(W_g],4?OV8@)b G!@@ŊM.|믿lNxqƌn?ؿ>7o6g*V^='ئM;LE-of @ P X.(݁ @ #PHR娣!Cؒ%K7ߴcǺ4j޽{m.iZNgϞ.xy,Ϲř @ @ h׮}n\3#1u73N:f6$ݻ[n O|OjԨs@ @ ˗N:%xżomƌnw߅?LFd}9?eTH @'ٴ @ (Pk˖-s/anF kS~㏷_|1M @ @ 6m81r출%u9G۷J*Vjh(4~5$ٵkWB@ M믿>X.]⋰fF,(J4hVV$ i]?$&J*"-+Xux-^؉frEQ={vXyKӦML2nf͚oPOM_RdI+@5kOmѢENVZq>,q`=~ݸqcC9:z"2kMvOsI4T™oկ_?js,Yb]]r%yE&Y*o^MA s% @ @@lzǡ͚5 aٳ-\@@3gδaÆEْآRJe>}_zΝ;N8z'+ @ @@!%s=6uT7g@~xTP$]ˉ4F] N2^x 2ƱF}7ouڳ>2 @ ^sMN8;cM֭).]0 r;m۶YΝO>IxWyۭlٲ !@ @@N(VO_np\Pd9+Y;K@ ):Mmذ$ֺun9ttXÆ ]k,LsH4;DHM6#d(Yw>}}5fm5Xw%Yfa7osn0\A\XԩSY˾%̗kڣ>j_u*2uDXfMK-[4ٵxN#ۨvYR?mĉW> X|(kR" '&Y7^/"6e7n  @ @@!{nߌҮ]\5kC_x`S@J@n- H._d]x≦NoԨQ6aHcC={:u{A N:ٗ_~ȗjĈ!J!@ @@!.N~8m޼ygy$Js-[7oy9A Kh @ a*UrΦ ^}vZg=zpwu[.  @ @ "p1l*THӄxLbAkҤIp|>';XDѥ~^|dTM @YgesεmۆzsN'wI'ȑ#-B !._~%l{f1%%%t| LPe]f{|A?~}m6HڑG&j>D`_Ȝ}ol+  0d:*(Ilر+%@ %jժlgϞVG}NUpЖ.]jO>d(M>21׻َ;ڸq\z*wjoNTsy|ה,F>XB @ pޱj^]{=ӧEƾМ!c-[Zխk׮6b7~ @ߗ%@ @@nhժ)=.h&IQ@Tw} :Ժt;h& @ @ 6Bi׮|*Gۥb[lQ>}tyI]*L*WҺHIiMs63\mڴ)t~jJŽ "(a2eʄ]o*UA'O۷]vaZ+&ÇZJ2(|{J*٪?Xʕ+Uw߆V׬Yck׮Zj 1*hf"k]"H̚|FeE . ,o.BAQ@(YB~NàdRfM k@M:믆-[~й}ւ_ о}P=de*ơjE @ 7o[o՞yst-TRt EN:ֽ{wԲݦO%wY={ڬY+5\҂ [@1[4'|r}!>|З>}~iS/ϊ}X>{_SC>d\Re8Ӓ7tu @ @y@ OwIZ~}'nQ㏚曼k.LsN;4wk>@ ss9 @ @ ] @r8'm^.7Δ?x7QN/X  @ @ 2۱l}XyOt\Fۦbd^bۑަtREJ [mÆ>";1^Jt2Ip"(̗.m^3XX۴]eL[.]{S![z9Ү:# @(h!EpVZ5[dΛ7ϥܟH!FMvz?x?ЮMlѢEol?(a:Ul2?*x% 3fqc% V\Ps"S1`a{WlԨQQu2?묳/w;so+R13 ^{ퟨ=i<}GA!~!rzլgD}Sbr){1n@|5o<ϷB PT\:wzm6oBŒo|& g=iykҤ=C6tP4i{y18)_v3m%/|??},|^IbX >ޫb(\P02?_h۟[GY,,^8ǚ .ȱq"@ @ hM=\R4@JSN?#܅ S47SOuŒ;v4b @%crR; @ @ KڴicJ sϹO/309+X׮]=bϻ @ @r l1O_E|l9j5lzm_|q$rd۰aC`-=)FeRd?YiD[{ jzA.:WլχuY%w (~[ӦMX @ @X|]s56yЮzq}ٵ^f.@ z'tK:Ν{lOf}7{G{-;wvU^,ў;{Ž{>ۧW4Kޑ^1L /|J/qF]~t珯OX=_Z}ws<ڵk\ @ @ Ohܸ)]wun̙3(͘1#4lkyse<ӭyyo4  w1+H!@ @@Y < `ƍ|G`;}_rN @ @ H?6m2,}qEK+C~3*eVYI2_bfŋ6-8*TXmݻk[Pw^PbvMeJYVRb%re}v6S2|pa5 ]{3Qg^AHQe+Id͚/[$A,*IpQIy%#(o @OH"֦M! IW_}\$PVcSOիWu%Bi-snM֎%Zbdo[?,Ĩ_;vmܸrhY49s/mۆs3#A)SrP>?A.rMi`'4+M\~}HQǷj*f5zV#yS`K_OG[?_I>~˔1[xa\vm".MTVjԨ۵ks6@ @ H@.$M4}ܤ@&iW_}b ׮]ۉ2yņ#1@ l@1 @ |z1ҳgOѣ}شir07駟otnfӧI8 @ @@" ;'9fr4E}S!izMԥ6L*IPV2ܦuH5|j]v/+5>3ڬ?}s>aF?k)- 棕oݚzLvB }K񩓖(U\ߪW]Tqņ Y&yzVE @@"PuG[E9蠃nݺh+?C]ݺuhfE(-Z=fϞV[-eF[BI,LAKdV^_x'(Qh֤I'(?J*E%t-`jB~Nq -&Y >{7>wxA{NrKnzT=7ouQ{H~W_3bỳ @ @ @/ϟ*S=vg@ h1۸1Y 凜{OE']O%f\K&/ˊ?{m.ɟ>27s<``|oK.h+'{Y~Iϗo}d}o=yg,^{ۻd5qJ\z$ຟWy@b @ @"Pre޽Kĉ0cpb?.iFsu @D!,a @ @@(ykvi.}v{,m<{Ǭ_~vuyer @ @Y$ aٯYҳ`(.qR?)R"^v Y]~\;0.5KUUjVھ'C Y@ o/ΰ w}VD49sB5ktBE4Ѻv٬11TWzs[vW/SF£>߿.ɿJW\q{i畂H1cؠAr_G7&<"n/qۼMB, IԳo'q6ol^x-[?f Bd.͛|!F>I'dC 1D5e @ (ѣGƳ+f}!0@  ɧ{͔fh[<"LMuy ^)zPZLd" \|WA͛9&$d 1+)/]:?֭[秦&?Nxo#ȑ#`^Àib~}?|`kxv١^Tޓս(rH`&&oAV-b^xtAQ~ Idշ&Mz2yJԳYo5oBB;vpS4/^>VX֬A7x aT׊hL<h=e @ Do\QEOsc @vN_|y%_/xSPpQb@r HP"JS$8:ns/xJ2y=}Ӝ(ԅ߉6nؚ5kfvy;[{A?;O ǛիFmxю{9Z@ @@hln#Fx(g۽KEJhQ)2/'6߼X /Є0z֕Ӟ/ܨWܒ 27fdgbFtiLeHcp]B 1 @ 8 бcG{9:u F_e'NtIgaݺuN:Ha @bN"F51@ @ _hԨ tw8AF$+WZ׮]Gumڴ @ @'uiӪUe\H,VY&H+[bc< LAFu&R0/) H(͙]Lu.1!6?@ @ ;IU@ m>4X)z_Ǎg L")L)^;bm՞`w^Py,O,oQF`fŊsѶ͝;7L1>w$9 G۷m6 "JNe2-[zʎ;P@G]m OK#Q%XY걓}Eɇ (z,Wxm׮pF}&?Z6ퟞibEjJo?E^:IW囯H L  @ hI'ғO>i_~6~xo:U'd7ot7|:mZѢEB7h @5s̜ @ hҤ{9`Yɓ'}v 'gm<5h r@ @ 'L+WNNR^MkD4O+˗y8@V(RÆ8Oj\L~zz۷-^Qp8'(XbZ*!Fe @)D.BꫯT͋vEـ2'TA*^ڊ ֝*i2EBUF'LӦM#eMuAs@Ŋmȑk˗<8{ޢY"G՛=k6m믿ҥKu/Tw瞸&a˖- *UJ`< 8JXK @L$о}| @ @@,n2iJc~ A 6wO?!Xd|kLMG\,U*1@9E@qg[<\HFԥOv0@zr\&O_˺u%pHl @ @yD7XoƎkƍƶumܼy >ܥZ^͛⋭QFy4 4")I9 HSOu4hu]i'؞={ҔS nZx:OO!?4J֡C4i%"GY~l޼yK(aW]uPrP9@ @ M`׮TqEYL+VyÉY6 i±/&'%pA(,a`<05*Ӻd5zժŒbvI\  @ }Z}ɓj}ɋb ,0zm/B(-뽨mK[lqRbtx,? … ]WM/>t7i$,ϩ 5w7*x?~hE͋,ڵ=Y' ^h[\Pe{ |XS95krJ1@ @ r-ꫯgϞCybMY @ cʕ+I|QB^Y5i#KPQ>"(ʫT8@%9QhiT|<-l~fI^T_R5f /C _8mѢEV|y?ҴY>GKS}Ms@~ P֪U+Tph#  hn|#-W$޽{mʔ)om;is]r%v: @1܋K 7x(ڏOŽ@'0bK]?4 $@s? B> !ۨQlCPU*UCEB @ &2ُ?7/$|?l=mflܸѮJ>|=ֺu뤵!@ @kM^̖,IM_\*]ZT _\!ǟ DXLɋ4wA rejprH=HO5jdVjެC @ UF#8V{BNj=tMy  @ 8ַo_[bEh*Uؽk_~9.CT@@a&kWKt޽SYݺu%ˆbr &s+Ų-[ReG_I;E|.+Mr=4<_AO  @ @i.mذ$8zh3gkΝ;mܸq.%*QZjtS9 @1fNC;x?/44+dHQ*J)ISLh)T*IJQfEk}w{w~yg>g9{nݺ%OT4 ,^3fM;wF^0~x… Qvm|(\pZ|+W:êU" 7Cx6;x\9gpO?]FP8#+cK@A1!3_ 4ń8y}?*TpNZ" " " " " " " " $|M_4hGy^{i 0 "b {x7o9sz-)Y .hzC1M_ϼɌ-B29g;6 lB̑(؟ٰ!eioh/K8 94ft"y#HPzr4ک"@ӄ4h&n/H$(K.رc1qDl۶hӦMxѷo_4oj_yȑ#GXdĘAXbGRh@x1p\F|q`]GJ(z :uwߍ˗رc9r$NjK" " " " " " " " .#GAżkq/DB ,{ qi4R$ ?>mXD@D i;Umv,_ s P! 8́YE$ .UDD@D T Ť ikYǁi@߼>{ObŔs1oC¾iND@D@D@D@D@D@D@E iѢ~5bcƌ믿nt 0~ }۹[lݻ~:#" " " Q' #ƨ# E@D@D@D@D@D@D > gϞhӦ ~۶_|.߮ϑ#G|V@`XY3,Yw y:0[1 D1#@Ʋeqc߭sWVu!￁ {9]pΘg齅E@D@D@D@D@D@D@D@E@֠od>UW]eԠ.:ɓѻwolܸs؂ }݇e˖VZ4hzJ8"@vVh&VtPkpWN>9=ND@D@kJnH8?4mݚS:8oag(Vk" " " " " " " " kޭLűc0|pW4/" " " " " " %~<e Ç{(}V|ռsw'n݊;w|3tWWLc3"it'׌d\>(5*O>UVūjr|+" " " " " " " gπO?uF8hżGօi>;Z!" " " gp{`JI]78BOoO,e9CF@>kFD@D@D@D@D@D@D@:P1tPt 9s[h TY9s&zBoQ/N(" "  0~|/aP6Kk;c0*//mfZ+" " H}*UrvR6FBh9M&frEO~hhkWPȖ?F9=z=G" " " "+q+:dC-2"iF%-@x֤GA6my2d5u_hvu7v@>|Ǥ{}(dZߏzYSnpbʔ)ر]vڰ1cv  M7݄>}X&Æ À@H #Y3ƳYfصkg> h:t(M&e g6\|֋4ms -A5d;6`_ <=]JsG6a;m*:n8s3&7tRXg+_~e[7c)D \x_I&:#" ͛7Gm Kj :t /9zW]E!;y`2a/'h-4Yn" " "  @ .p.],M2)a4j0zJ+`)lCjժ6{ܹ]WL6)6TQ" XMkzPBKSC`πO?u?N`>u\!" " "|rEa7_ѝtO\ݻSn$*=O]0`tB/O!"4uS3 $xXOcQx޽;>QF7FDWOtg=]bԩv\rVӳR I@Z y_K$!ƍŋmk>كAY~w%J$!UID@D@D Ȉ1ޯ'IJ|ȟ?~wc^+vkcҤI>^(@V>dĘ}kKaĞ|2b4l_^~'u]mzu >eWxPyq>5Ԭ7b8IH4I.dUCqvATlE|3>QNOgi8qCțoٚ*˗sj5a|嗭)g i}wӴ1f̘oź̙ 駟Feh߷۷hСCjժ߈—;w z p` [pݱw^Ϩ]6}C:#" " " " " " " &0>^Yر#p٩B;C) a" " "  FBM:n˂bܟ~rR8lkR{BD@D@D@D@D@D@D@_J*aŊ믱xb#vi." " " " " " " Y"8Q<:upFqAe˖"E@D@D bhd<1k3PH⤓F `\`N8X:vt2ҟ6gρ>~%eCe\i9͛;"ERՔdg gUiC]ʖ.s,5uiHrʁ˗/7qgm۶)Ufs~1Bsg-xy,?" " " " qKsŨQЯ_?@~1bq K*PD@D@D@@XI5H@eʔ-~;X~5/A ʄˋ/6pk#I!ɨm߾n 5 O>=.\+VVgX&oOjժe|Fq&z۶mKu.+ff=}FI'vK1dI4"׈o=+8ӣMãk׮&c0Z!" " " " " " " .)W=ct睎aW]2L¥AӼ*E0m4HfL1;w`b6eLjD ݻ(Z>9n" " " " " " " م@vl>˾#.UW=E@D@D@D@D@D@D lW}ٗ-dp1{%JXHرIu 8N`^Ĉ^\}50: x=`N@0"@c7S߷Px-sZum6Pq_ۗ1 H{ Gכ K3DڵL`„ -#xj*;̛77ntW{lx?֬}w=۸/;3sݞ:oX^}UϾ4?իK#FôioLN'Hi&b H|QF#LFԩS=ndv|ƍg LߡCR8YǂM֭KzF-[Xf4F?2{֯_'rJpE!" 5*g5LQon{sMd#uiy |pplk\!" " "  'ttGog~ L3?y;';h6oVH̡曍(hc^~L2~{_?1p@5 #~ݻw7^1-N." "L6}0CkGɭ a#)D@D@D@D *V8{/`$0{6n]J֮ q3΀ijHFS" 5uW}ڴeٽ'Y@ӪS(;lݺr2Y]fR7?G&M&G`綾^Z/G#ںukGx'{ka4 dF'7\Z4,9]~}Ag.Yj:m֣ẃC<餓G>I'7z:_xE駟4fq2iد_?;?nݺ.I/Fwy<>3{_H1ʖ4ad_h_6m`ǎvk׮TewalX_>y/_h3-Zn)~\{M_|mti^IHEX <ؚ0|6b>+(m:gvm>Pz!>Nc!p-g?]O>6gc͈$5o:vJp:S~ c2@Ϟ0-\#Ƥ)T9itiwvڷhi6ƍ3h/ZE@D@D@D@D@D@D@D qx/SpTD@D@D@D@D@D@bDġT@IDATG϶}]MbAA1^zɄ1FGd%p0@b@vi 㩧u3R)6#0&]z@?QӦs9yFΘ)F6Æ5kND! M/uzU6k#h'O4l.sٙhȘ saI3=-Y5it=+Or)E L.\3 2=1 ldÏlx #cĉkU\Fs\zdШ;שS6LI3cA"W\֥>j2nݙ93F'|5ț?}m /!Xhhɠa͛a;Sb_z)ұcG#*7leJ[o{NǺ̙ 7WEu3{DF{yWX#:Oˈlw}7"Gs."{I,W}5F+>QrE)wB飕hҧ|?PԂYgeEkpaرc+v^KO?ZW}>}2M=ŪU+}T(<|۷;ndd;m>w0]p}-]P3ա@4uCdak}ke M_~jBӦM=0i'/Yj6{VzMPw4ӧO>!ƃN. (G g'B 0{w7o5rקmo9{  D%2f%" "]+Wj'&ԃ`;_n5  *d$@ Ȉ1@u8,\0Ն_|m$O/ib+VHަadL\uUAw}A꽿k U~>gF:,!9sXV^xM6"v//ӱ,sf9vfH~5km(rI'H1ٖ|A@#_(@jլp1SkIPt]c|VJNT<v7nh;ׇŜwegc0A^`EλabnhS;МBl2Ҋp\u" "Q={|Q 5kԩSMsD!" " " " " " "΅/iSK];pD$O^KXΝ=+I$#F3=S!2jָew̜9mjzҲ3 SN رcqBm Y8Tveѣm-c)MG=@C~YBw8y>vmشi{g;#=mw[zۙA͛+V{gQ`ի58K/.`E}y4V*L$]Dy>*{v]Fݛovb:hc8DLJ<61xͮToPPBd D @dd٭ފO8QFmE@D@D@D@D@D@+29XsFǎ裏TRI[ULD@D D ^z &F+F^  (E& F+>QrE!FshgW#>mAxw1.rO/݇&-[9mΜ9Aپ8 ^AkIp uR^J6#ps|f- DhSF~W26wߕ ܫ:cH$:@n(bOz|ec/^Fqgؾ4xG ꇶh=q@ ^triի=zo&&hWߖ8 ھf?iwljzS#w˖-8tOH#H'W:E@D@:'~d5mL'| |- D4>}:ԪU _~%xw7Ow2CcRF1۶m A'b99 ow W5*wZ 'UTɚך}V|/)FH?Y2gsI-4c ߺƌ5ckM6lDR$&%J`ذa&1^,Z4C PߨSlT!ePuYgۭ\ 6&y12ٵ{p6:ywF jk}ŊyF|0`ȲFNs@/zIoM4;vW\^x&{oi'``L#㏾5{o~ݾ4~4߄%f"k-7Kvg<`N~Ypر4pQ 4 ,m1W_}mI^+y9Җ)1_^e]#FI!"yϐ_|LdI g0}3̳6 8|ƍ8ǐBD@D@D@R8gϞT˵@D@D@D@AԩoS .Ʃu;HnOd9r@Ǚg.XD@D@LOa#G|Gω;ڶW]!\^hV̋V.}8TxE ,js=:t(z)ckwcĠѻ  =vDD~DqK(Sx!g'}@~}?JQ= - ct˗@TQEnAVYB62ekH]9jz5vimx U>̃rMJ O?E'7$8~tAR#;Ǝ1_^N:uE@D@#p饗~ۏ>5A_~&MѢO<1CiX9AD@bA^z[=_o_7 ('XJŴ[f+V7nhiQcEѵȩt?9bFI>1hƅŋazL\F5^6G]wNoWSmp|A˖-Xg>APj`iy֭|d˜9sfkpHC6"w}xg#^Pi[MK{ؿes<֮] ޻L]6XwN)RbqXnK\" :yo~<;ri7; {ٳwu&nذ'Ԅ:@x̜ l=ٲ٦~'"6b}:ucX|y\ li.v&6QF[x #/;"h˗/m(4lfLF"K.mߏ۶y|駶mpʔ)hڴꤚ=D~>&Mʘ080=C0m0a:#" " " " " " " a pM7w\W*sǡFֱcǰe˖T86ol' d´?#޽;r~ϑ#5Xrh'5xMҊSCp>ʥu&L^yw½; 9W ʄ >ښv,͂ Rw&bߩN?t;ϰavˁӲ܌Rϙ:'pb~\޽{wӷ9k[i:Ҩ1#2)Lɍ;A vo1x`M~g /`FF*@, FI.5ֹE@_z%\qVPq֬Yec8 K;&6Ppɒ%>UW]e8o<050&~6:0q  uӧO7VƢY+1lD`&}F6O=Tݵ<P/|8?~ ڴi?cΜ;$Ab$;3׬YSaTܹsm>&ٲe˘wIr̪d+b-X`DL1׋/4^fXe$+j/0BPv6d`PO}5c*s=S4mN}0z))5+p*yʥ\zmر#nTZӿf[L4AP[o߾N '5/*=cwrj>_FK0?}4LoLW6 cʕبƉM@_p>m5 e,)M](oJψ1оZi-S꯺~5\\]s5wcdpՒKur]h/'uW]D@D hy]vﻨ`:Ϙ14zw%F3WD@D@D LQ]D@K,IS|158h ^ hb(.R+z_|n4ŠEô+IJذaM^=Ϸ(eNsVFKeb?/og7q -[\p@ [~3 q/֮]S `V .OԅYa^c;uF{o$S!" &/˗>%t<2XxF=3K0fhwnd؆մiSwg&2E`С`v7yO,s^luD & J9rbHk(lo@?YE@D@D@D@D@D@D@D JZh9s0" " " " " " "V\[o>^u #shqF1B&xU'!carX ׄ񬳀7֬1 c /ODO\ш9x4s}NHE+>1rO=T9.Zp|4g.r)RĞrO=k,?vM7p@ #y:e_n#`=mpx+/<1 HS7xէMvZHhӉpͩݺu+~TyA8j9ǎNsGZٿ~<~7pvi{EQn]&ʑ/ " " "H73$RUVd&uԱ4֛FmhHQP7#LW6`Ν_}ug@ qƼyI3g4jFUr)cD{堡k\y"c=VZF=oۺD2]&u_p SE5j\ry3+\=4|(:KS:x^층dEl͚5l`ޓ E{wB߾+F`Kr-`;xѣG2 KE~tn0a^|EwӤgs=hٲm\čxXQpZgy8vヒuwWcX|mU hـSNoN<1e|HvR1RĊ6vD"vEQP!ۮmn8徒=kt1{ -ύt:K`s=ﶿ׌m=ƑgcRݞ!U6;ôô8t'@߾1S@^:\*&IH?yVhQt-j-TƏuTb '4btXJD@D@D@D@D@D@"FO=Ms{@" " "y'LkAo\.]`4Rk*9 (W4:59UK8Ԅcפ_~55qυr j]Vߋ+ʔ)I^kjeJU<a<9ܚƊ,L9ޤI`jyNnL /qV"~\x?ej3\C1 bt!"Rە&YիNn4麫." "HYt ?˿{PԶw?n*@d8sE:d_г3ŋ$͛72)? i4$wq=_jReK.Ŷmۼ78ݼysk^uUB68d{ެV\ihvs]l2_m۶M7{x-sZJ},xNш5kf&ڝy~Efq{eR}yƚO?7n8 &Y6F-[rfg4hw߁IeO:~nZ1+VLģ+`++>V׮]'YHȲ.\n„<^Sd?G[+޾vZaÆc]*+D@D@D@D@D@D@D@J`(RN۱#LSSi*y=mnmYpN&L`;.#j6쨒/_,{Q܌mnMӋ:ul2o<ۖP ;˗/oXo,Z]tQ`=%=TEL ivχOi> &>SN" " " I@RuS!"P;_Db&h`3WD " " " " " " " kPQhQj:*T{E@D@D ,fprvvG|RaQh.R4sUHE+>qrtg{ͪUpvqڴic)@?e/j{.tG~wϣ"`2ü"י櫂ނ= @|n#-VOVuMk 6QrӦM_Ӻ{s]trezs3x/+s1= e^+xg9v_><. )Wkh/'uW]D@D P}V+r~w0jԨt*@Tk*U߿ Ǘc#Foi;>|ؚ|քOFnp)='#F,K޽mh^6}&hإKہQ4a,Sa8vX}<2Yn3glwkFnMEvLVbPϪ1cXƂ Z &NH<Mêy⧟~F4K3!QBk& D|)5(M2&z+ZjsrYS-6;vٰ̊Ie<NAd̲"&y晶&R&s΅.+u1?yyM߭[z+,{{M@f 0s_iDLqv@cy1a,U 3$w&onKp۪N5Λ5kmvDy{GjռgNowDze˺vLdڧl'LBowh/Rcm`MN:aZ`T7^D@D@D@D@D@D@D 6Z{b BaCBD@D@D@D@D@D@O6K c([SS>6\zW^y-, ?rH(E6qD \:2}駭n!X{z|5a袋0`Gx'iԣGK_ӧO׻}],%+zM," " a!|%>yfP;Ğ={rDD@D@D q Lܢ" FQFΗ˗/Oȑ#!Ѿ}{p&q8Ϩ?chC: Tݴ+b_olhѢȫt0-C/ĪY\DLر#81|Pv< Q\ (4ﶡ{4ʟ?!mfPw:2u?,K/d7l`cM_Y\n_a4h`/:@4 L +R楱`BboӦM>tDJ?v6Xx Śೖ]who>w" " " " " " " %0q";fy7&Lyu~~nx`;_ݠA";T=k׮)P;8m;-:ud:I^I+WYO_k{^34Kz>56iM4wä옶n`z~} HD@D@D@D@D@D@D@GC 'XE" " " " " " "(دهzݺu>ŦC=;췮H`[oCatRi*{Phs4sU+|f|`8~ʥ%ů^:kBXE9p7Z (W-kH-[\D>v l?-`rhmqN>d1wx)˂"9 mVYJ62Ve$|PnQw>ظ[nࠈ-pfF_C+W޽{b kH=nR;P͛|~GlǠb…4;/Z&" "8F֭y;͒cƌ1}Ze+D@D@D@'1fZ 0 %5|!Q"˜(lU jժ!1JRJ6@0),#aLXRSaE*4] x1̞7\D@"I _|9smܘ>}:<믿tdy mڴul }{Q$FMNÇ$ᇞM4LsiӦ۷]vĨ̞=r? XmghƍSݚHذaO1K,3l_'|2c7پ};ۗ|'x=o</ u/X9Sd'_tmُ=XYqyl2D=dy>&o7;?̣ 4^0  u`GsTѨID@D@D@D@D@D@2MCN~饗sN\pxlB (*D@D@D R/L+FڶupT>}&B.=hshK?~xxp)7BHa<_1L޽{cVxˮ z꩜ )"}T0n)a,5~̚c\}5.Aـ4u"KS7>J5[P!0.#qiA%)ͬ^tr" "pʕ+?ش팶94_;Ѯ];4"C ," " "zĢ" "5MwaefX+:@ 9yvSD@bInv0AmM;vetnHJ;]>}~ [sz:B_}v9lf<ӜYM2eglFieGG}'ZȘ(^;cr4W 5ȀW^AժUq{0vڸ+Q^=bYP#F0rvg,xWl s8f2ޱhX33Qkr$R\~>}:كoO*" " " " " " و?aÆ7է1H^ALc$=SLO911)8'|d\z^ɼhʥO2ҥKkРA>iD%\ҥK[y>h{СC84jHD~Hymg\?c؅]^Zi#*Wر@h6ۊ}h!Db*$={:" " %ЩS'Cҹsg̞=歷g}c\ؖPg&1F%"m^&!d 4n1'7urLs*Sش9sڎ ȑ#q1cɈeT!D@D@D@D@D@D@D x#S c2\׌F=9r@ƍY;2]M2SĂsf&i& |V>>(⤓NK{2O<>]y_G.]| +?,Xܖ2|6):QC3ɽ{(byDIǤ#V >ަM46l&o(bԁE@D@D@D@D@D@D@D@fͬ#~'2bx _cС0?-S\@Cw`NTm>* R&* (tDAbC* ( ҕ^ ( HQ(E4M{n I6&I|3;wnyg2t_O;j|3~ TjUAhʝeSKal޼9%<={-3g1OԩSDrO.>|Xj6l؀cfr.Gƍ&{P Q&!`a W"a{d" %@QߤXN*F)Ve45Yb=1p P`A̜9.~gqAرyg{7ID4\9 1 ؀ Hʕ+'<.RSHݧMG@H>=>3dϞzzꩧtL$oXUBH +V Js1( QDɝ;wԩbsAqHo^ziPMJI}8@}''F)Q-p-!0|xqreYƆ (%J;N:."c]1LJ~bui#IL1FƄ4s2K{BZ 8vw}7|ԧ|e^Sqɒ%^ȑ#y<ӠLD@D@R“Ojk1aLIɭ+\+<)xҧ _#F`::t;`Z80PBO>][. K=1mJNprONtl 0w.i+D^%0Q>ݑvb%PTVŭD@O@] " " "Zm۶E͚5q8Ǜ3gFib`2& !Ƙ>@j%XZoZ9ݧbl/" i@Ϟ=5kVw'xŠ1v1-cQE@D@D@D@D@D@D v$[W1ٲÆ'Xܹs%SW-֭[7p?MNcHbdiϠ͍̙3{^ۑ!C1XZ׷,r̛7k֬ 0qD:g{'10[޽혡|i7웜Mc˕<^}][VJ}bXۡ%'0x0 0A5 Wi" " " " " " " QOꫯTlق~ GA٣_@t8q>}x7E+4jH$;Ch0[6"Xt_zהt %5ח9r}{|}D6`)vXF8r0 ʕ+pV6\˗/7E9]>| 2I+W.gWO>orߕL2Yv"" i@1d?~@ @EH"uV|g4h8մrʡsh֬Y^jCD@D@BL}isoZߴM@){S8Խ}O_}yK7nNgP;况={t0ߤQFnJj\nHvOyOQ!y_O?4jժVZtO~ È#)NbV@%;ܹsx#+.XNϕŋcذaNzݺuw&'(lاO▾Ơx N>ԉk2$͝:uEYq 5 VR76Ǒf͚wx 8]̏>N^2)];Gxʣ>'"E`ӦM.}&~j9<֮];0&&-Z޽wj+Y!FS$~vўVfM _uT%0s&p >Ęfʝw|&S8=eu>߼ewO~ҏ274/L0}@[n>5lӘ#[lfПר5_Ay}ˊXJ1_D@D@D@D@D@D@b@RtR;GsΟ?_=ƌU:OD@D@ 1S@xpY|6HC= 2 ;@D@D@D@D@D@D@RnԻ+Sʔ[5E={য়~r7&o޼d 1%5kV˗ͻw rjy),\ARB5jŋm_~iE74%n՞+k;7yͤwIhS&$D}N6V%PdI8{s׮]Xv-Zli&Ok dbҥC l08 .IJeL0cV1AQD#J(bŊVڼyˠw_&MPhQ:tׯώ&cۙNymsoEyU6S|9w e4pȐ!9rkPg 2Yu;wn'q1=zN{Lb58Qؾ}$ 1I&m $ק$H'`͚5^]|v\瞳 vjCD@D@R6M%W4/Gʗ>ĂϹ3^Jr٥^zv}JAKH@nBX$]IiI;gfvt-K&" " " " " " " n2eᅬիu`f otbb2 pM_LtGH+ze?C+HGeһ{ SD@D@D@D@D@D@MZpc4H`ƌvl:KfSN믿`>e@pn!ӧOy乐!Bay (`*TȜ93gDwg5?6p ^Ѿk&% LSKa3wNT@6lAtZH1N:=LcǎnO mذ+- Q0aÇG-cPɗ_~kh #EΞ=`9;j۶,S {00-2(O?˵J!JV҆6:2tD?S8/~ @Z&Я_?0߈#p)}ݘ7o4.@|Eg6şW{cǭӳիWw6~RxΤM>=XGPa!CiӦH] 6/A5ط 'E"(ZqF`g̍`{]Zhhzm=סf]1Ӭ>WWԦ!p%[oń oɑgϞh۶mUP]v f|ٳ}Xy+RH[yEZaDlN?̘1ÖWn]d͚o5kN>L2h(61{lԬYy{\ZM\r%zUVa۶mȜ938i[ncQ^0kڵvkYvm<#Φ'ǺT\;w1qDn2 CD hzuzi@W^mƮ/Bq}^w9Fɺ8vTR([,ڵk*U;+۷odz>k/ bҥV8JG`n>3`?zh￷o z/SLtȑ -[dɒ=_GwN8a8vXlݺoկ_mڴ׊3Z9p-=1[\:^/dH[p[6KD@D@D@D@D@D@ =z_|>8"kj޼9z);~}D@D@D r wS'P{S+i| pZn褶[I%ҧO^zÝ;wξ#H#Z)αx\%,H8׵kW~xg;>쳀sW86u_D@D@ըi*" " " " " " " .tg kb@Mc:/Zŋ&xPaTkvsvWgmW^q6~޽ 9N*!FFx뭷`4Z2@|8:-Z\041jc ͟?k7BiNA2d?l8t萻ӌ/@;c wI("#22*VƩ9" " " KM(BYƍ[`R>PtuPjժP4/A!HĊ"M6v#i̙3h(]jC}]̟~NT^j5D1Fp",C V6u])SX=N~fTQЪU+78wy0͛1i$1ʺu$ˡ)zIdM -[ؙ9K,~paì02~x!y ew|g<ۙ#G+f68fܱcl!H#Ü_| :uP bl#!c[)IDzeˆ+V؅A>njcJ'F1N7:IW.X2z)1e_s'tGSB2H 7qp *d:t耼yzҺDʕ/45k^Z# _;Wv˗>~}uɒ%ʾb"zF 98)(!UQ" " " " " " "/XKkC裏Rt\VD@D@D E OT1Hh޽6(.GD@D@D@D@D@D@D@%`b[hG,x @aOSfuH$G8{U K/_>}ۑҠAwΞ=ѣG0 8={vya͠/^l*e˖uV#"]tj?+f]1Vg]{.kMD@D@D@8w~gtҁY~ 3g`ΝvdɒNrПoy=z8 9NN> aڈյ^ MN`*Tܷo8ASN@uaÆ$Ϝg*UXЋ/Ls;i\7~R‘pcǎv`Bq>L_TRqp1˭jp3{soE4i"EXQ@9򚡏 7֭[@@ E/R+HأG㜍2e~VDeݻw>l@E_=ӶΘ݄  j)^Iap'Ν;c޼yضm(NIq̙3{Uq% Rp?ơC,i֬y W8q"g*LygBZ/Ͻs M:.]:w_~S>@7G 8+`>>uE% OFM4 7o/,`*@D_ȚմaޡDd3ը"nR)TNpGBI' ce%{pR?R06$@x9=8ιQF9QZH#Uj@ظqc"j@0?- X&$PӧOw믿#Ν3E@D@D@D@D@D@D@<<;0&H7p( ]veq;}֫WSNahڴJCwm8w侐D :,Xw})裏 ~h*N+W.N E^)@q@vW ~̘ʗ/Q AGi91],Zp|t+1edb\W]PLTZD@D@D@a4G_g_xqw9ܿc8nI]62fh(WIoK.z@JXBdbƷ3<rGnl?"(7h l߾QzuͶ-[6śgr#QFٱN8M=7X n L!N:￷9W\Is1w&C V-Q3PO brqZV8O5A5kX!?^d")1)G'DlPu!C߰aCwW]uct#G]w3|6mBnݬP;Y#uV(n?dM\Yr~ȑ]|R+Z H"D)] O@%{E@DE1#d" "0ɧ~o 2ѢEvnsP&" " "=$=J- uED['M'yP D@D@D@.ș3 `B &vZ4ns̉7&" " " " " " i'>8zh&9`ObO?={{XV-P@!Xcpߝ}ԩ 1Rnc]Hdbł؜̱{-$ӧO??l0mu]cǎU57Fa̙(Mձۿk_;I6 /r!曠0%ٴidAO;<&O_[lqPH5P$#B*Ǐƍeɒ%6hgޒ%K{z(!L8K?8o ꐈԚ@L#F~@q1 {o_tEb Zc[&EX`EbHnEaIacȩ7s͛ѿ0`8 I)o|6mo~L6է! sYuZJJ /4=l۶}-`f0 !y2{<:lʕ+\_Qx?Ν|9,oa裏H.ў"~H)g̘Gѹ&ۗO'Pre+Ț8)!3W " " " " " "moŀǑ<:ܠ0Nܹ=wi]D@D@bk˪d2%Kc+'<>zJpE˗4_G֭m9m<=K" " " "q0ρqvz$Plڵ)z1`RD)H3Os94z!+_-Ԏ?nO2k֬"Lu[b +4矇I3gWvX׃>owE6m ȗߙf͚k׮v~[ǹ k֬_6sՙޓӾ`6+-ܹ.Ewi%@_!L.E/GK.q7Js7 @8Ӊ:HE@D tMv)-_ӡ0#cwq;^bЭ[Hn&" " " " " " FsJ&NNe|3՚Lcڵk;A}2(͚58p-Zdc*@,}"_|xmp| s|+%=qH3@ 0: Fr6ݟ|jnѢ;- S(믿3sb ?~]kECsEzµ^k(GŋRJXp!(*c sߋ/~ {3؟#N!b.իo߿GǎYj>[;K7xNԥfp"u|$P3[oeC3gb٠%_uMMVДcQnݺV\yȘ#X^=POvGާ~yfibY_wuZ &}O>$_3?c%Os3eNvOrбW_}Xv/)BI%JZjڵ t `DfDA +48ܿ:RE@D@D@*[o 6Ľދ?+W J.A!Na@`(=?[8q(8{9̝;u˖-HZO,/89/M,RB#G6h|a_]"y*0xW%jCs*>"=|#T `wa).hҧ q=\'sbu#%e> uFjSfzLD@D@D@D@D@D@D@BJ>cǎEn~hҤ N8Nӊ@yMRD@"g={66:(P? BիHsL>ݎ}߳i׮~awO" " " d0K@V%3E*OKK+/>WoJF/Zg1e)R9 I}Pa{䴗57`z8wtM 5wmUZ09)SxS-6 lڴSf+H{v\D y ,ҥK'-" QL ]tx7 Y'jԨa}3ŽSE@D@D v H1vϭz&!% G i*LD  2.1ºu뢫jDn5]#sY> OAĖ.]j#jD-(4k= p(_6 &Xo4PM&pvQC|hԨQۜ1cF;AC4B6 5ٱh.y_KV0^z 8y"E`D%#j@Yb3g^{5+ljx޽W\qEu)Es>Җ\V%6 TRtb]wm`孷ފe˖ٺ/FqEZJܢ{?"!!F?+/mf5O` 1rlv O%JKغu+ʕ+NheժU6KO UɋBd 㽅\cw.\h30-T:RLҳ.}&@ ܅HэB+" " " " " "֬YC!طoW?\ իWO^t!" " _|H1;0O0cy0_o%&m>/}J_y/ރ[y&"ݻÈ. W_6ס'Qe7C_JHUudYf6{BD1cРAQ5]D@BCuvN޽kuZ,Yb\q5\JT@DuY$D@D@D@D |l"׭[66ֿM]P[E@D@D@D@D@D@D E 0CѢjM~l  8x0ED@D@D@D "PDkԀcD 5BD@D@@.]lW\iBՕ{\rիWb)LH1,vw"K,V~M0ҌV_pbuDھ}{/X02Sٲe͛R;ln:vRUTwa}뭷gr:u g϶PؑזI&6<ȑ#ɭV(Tzgm;w͢f>}$pG$رcضm[cك1cIFO>gHkw/:k׮_] pM77()=g}J*ٱþ}z02;FMc&SNEÆ %{z$" "B|%fe"wnWxB!ĬD@D@D@D h7+$4De 5kb…+my6lm݆u|$(#5j@KѩSo("+%//rJH$,NE@<dȐǏ/+~WEVDtyԪCLFv |@v,!0xUl,gU}VG|`}!W{(Zϫ-" " Dbt+WҥKAѻ;N(8 ]̜9;)_|x |`~07}'wL2,ZO>$fΜ+PQ1c^c˕+%E?:j~+V̌WK/ŋIKF"E4oi%c(I-Z̜ss4hefON:?z)s=oɓOlL$CzZruʢ#{a_~qr3}'N`I/HGDp'Шo0Kٳüpu\tc*@@˱pcc\'"X7'_82kVW/_8 ZP`,EX'"BN:e澛.0Mm@\_=,Yu9;vn)M7 YU*"M.2Dhj*" tH'L CE@D@O6m$@٭b l8֭ b"u<9Q``{o &5O:C?F76 U.gyScn@P+Vim۶-o\XQ䊂v~ xVkf $`׷B ` 8"b?hSb_7oƺul|̘1n46Q4xVP&o8t-e˖+0D(kod5?]UIP-QPpغu=vځ*=;w^B<%J=/{5kժW>jۤ!ϋ#yY-$ȝxMм^ܹueӦMXfy.s=Qp1Qp„{6c٣{LBز\ 4ƒ^~R`|Tay@'N x>˖-kk׮]kE_)@>}ŕz)Hܮ]{2r#WSp3o޼Nv}&9{O?a=O2$/_~ kΎ3ΝwE@D@D@A@ Ucp-.ysa̫;%*D .GɉJ#FN)̫m60l@?~nj.RIѧ@֭!U"nKHQp/"S,!h?j@8 *TU#spJUj-" " "$AS6zW_}5ƍg3ꫨ: " " " " " " &8WO4W 8o^[E@D@D@D eF%FLcʜ "" " i@FPtiz+dG}#FX3g`ɒ%3geʙ3':u\rBBXȑ~!Bۉ:L.5kORx,R͏[L.:uKƫ  :8&1O>SMc @IDAT?ctcVD@D xذ,`^Z۲h01x0̘vdAh qkbѢ0D)8i7DL" " " " " " "6͛qSN:5kV^@GRQzϟG6mtR*U*D5MNh|Qga;hL`oOc;6WM CYfmx] z 9R( 06 ` )BݲK@ Z`TV&$hk֬$ѣXr%(Wpa(Q"o]Gp[rXQp駟ÇΝ;ǸP.X[Jo>sl3E$/R(EւĴyiE|9P47-¶oL6<8l}֍"z4Hwga| $xx*'SŠ\s5{L =bmO`#&2eʔRFߏIYrZ "$' J%_b |+W_ iV<4iDg." " " N}ކl7.2E@ub3fo&!h?j@8m^XϚ5>QbV\9j ͛7G}wk[D@D@D dsXh(^<~@ck$sFe`Q;v,&Mdc8vyaݢE +Pc-" " "ʖzf΄ 3_o￁O?u-o.vmXQ<+" " " N.%K`⶘͛[Ŋݯ#ܘ7oƞ={jpYP-cǎaʕ6F/2VmJUL݄q+nŒCD@D@D@D@RGeE+~X`$? 1jb=^P\‰]tAf ߿UT{ob:u0k,dj*4i| k9sDϞ=#]ǀ'O۷o2j/<l8ϽdZ+wrv̙MVwE,'xӦMYUauŁ HӧOl~VI3X޽<*l;WD@D@D ѣQ|yݻLni&‹/KT_D@D@D@D@D@D@D ?vM䫩oΜq5ivW $R5k5[D8cVńn7Ǐmp.gq0.(|H)" " " " " " " 1Ht^qЊ@ 7*/Ƹq0~xˇMx~;[&" " "2~?ѣk~3suA/\KLw %J>#PD@D@D z< #|Kdڄk t 0V7E@R@rc2jZr8yϝ;^zg?dL1u q(!1Nn49JED06;vy}Bh"-Z4[@lclGBD ,Y\riϞ=صk֮]kE 'Nɓ'ۊ_X`A6K/m݆ra֭mr1>\Q+V@o7l`Ey Ν\s vm~ \L~yVw "ɴpBr}Xb8tWI~۶m6@dK#z4vMO>vL4 1r CX 1{OD@D \q5j֫[o.UD@D@D@D@D@D@"@,0A\yI\A%8YWv-_W_ɽSD@D@D@MıĪU _ ,] 3 ;nٲ~?<P>pq(ED@D@D@D@D@D@D@b@B={v9r=循o" " " " " "R(O?Y &5xgƍۘ jBF*1D@D@D@,jZ>Cc.,OD)30q\&./&Kŧ]OfLhHV8p=@Ӧ@Ŋ~(QD $'.c2l|}qq0{Νkco2>-bcĮ^5l2|tW1u"1Nn49EN*HU_}j֬i}LoD@D@D@G@ޚcE@ba [lԩf̘a;:|mڴ_ƍ#]+;wΊ\ryB?ÝVD͜9}qB@B|Eː!qubѶ$Zj=c-lի9+EA֬Yf̜9ӊ^ĉ FaJC Z0.1֩m `|Y["@<@e~`T`d US8I"K\h%KJBqd+W.4̞Z\;7а!Ф / lJ4CtvNΝ;qС8s uTD@D@D@D@D@I1 (e۶mqJc|o޼LD@D@D@| 3wݵ<6 &~{[~ZLh(T0aL+@H ̛ۧ8]O\.kO" I 91u ,h&g>amI3#KaL,sH$7o6s1֧O8"LAH~:*njP[p¶+Wﷺ#S劀@Z' !ƴ~" "@[oՖo%,߃)B{ZvAUi-2rqIСC*>~ořumۼUMoΝֱP,%KX׮]`UVUynOq8cOQ&gn3>jBܙ3g┑d2efr{k2yq GHcǎX3i2;wͳ K5Ԇ0{g*:k[͞= jԨaQ?UTVٸqLueֹnώp'e >WxnK(1cXM=OKe~xSy:tX1}y, gWzUxwaCg Dqq?qquƩ1]Z5G]HHHH )cŃ~z+W^jH )4h=ǛyI^o$+Zha=W0ƞ4h`Gc8' /DIA$@$@$@$@$@1EڵkqД\hOs1uq|ɘ>vHHH yPRRq}׭[?x;%d IĞ*U&zű 4QS~f6Ǜ?se|ʜK  gsҶ:tsn 7 @_.˗/G+Jgٲe̟?cV/߽{VQRti}6 (<]mܹ 250%ժUK?Rŋٳm3ӦM5%d!2df͚2!sGdK/ɟ) M-Z$ePt>H5JN:%gϞ(>9~`:aÆɚ5kDM|~A=*Yt(c홓ƍĉ:O:UN?Zef 0ͅe .j[e(jPΝ;'P>aoP9qzryĈCݮEұcGLLl4iԪUK x~?˗O{>|qfCںuH}hȐ!LaEHMu%>kVҜ\M|6/5YJ_ ecӦM)Y{d׮]ry}ʜT\"dQѬfRa?\ooկ`w}p^ 9^ g>{` ~9re˖I޽]pHnOB $O@Jnt?\F6&$      L o^T>\Ԙ"zw|굿"w%3H"<#7";v8 @ 5+2f"eˊ,(ҡȑ@EPǞʔyqQ"]+jLZHL\'       FbŊ͛7[\!     LsvgΜƥ%+wq=Z%}z>*PƜ={4D$@$@$@Q&1JDCrr +9;V~(=ܹw9rn .k}^1ys^7QZdקD<+z!JOo;e\[$@ɛHkty -=8p@oVPߨԵP}%P9SNnnmh_|0yP@4a=cáGlo?ϴ8 D4K'k 4HHHK mxOdz @!W2L`L-)wyAQjuQ!R7&gsI.ʐڴi̙sm ޴jڅ3fL`XFZbܶm[2` L >Y\v.A}a0vRP4h6j*;"=Po`W~}M}J5ٳgNѪN013+M4Jr,Yj`hjF&L) 0lڴsT|yԩܸq+gif0SEd& &ׯ_/0TE{vPB$(}DBx&^Zo7|S_? 0s0y$Ɗ aF:k,iѢե* }]d6cR(w}ʱ`"g*r ki%L/֭kv]g'd! @$kWDo߾I D ??_䯿DM%O&OV9 捷ꕴz/?k$@$@$@طOxȲe1_ oUDK5D$@$@$@1C~ŋLQ cǎyE}vR:I$@v$:W v… B#ĸlHHHHH d̷2e6U1ȑ#A @R `b蕯N{@K'>['J$JD~ݑM)sש#RH޼f/$@$@$@Im,rȊ}̕x{o6^lXs2e~ hRua)+WE[ڒFӱʩ뉌rjR5'CLi:^o}u\heDC9cáGloϴ D@׮]<4HRݥlٲRzt @ @#py$@!ЧO1/[O8!۶mF`0)1b[*R`{@|3 ;A#j|~xi޼~ky[ZvHHHHHHRY;O;x…MFzj(AgS^:J`hZ$@$@$Op@ҧw6,zw @&pJ)V"3 $//_gWC$ NB z.\T o;HHHHH&Ç g=ʕ+ `N2t`e֬Ya $u%J w)<-S"ߎWoO?ŗÜYӑ5   tIdzիkֈ(IIɕu \1 @(٢TdI]vYT jfj*jNib9 ``7mK\;u Uع-42 ~pHH z^}U=_ 0n߾,_\N%  HhĘo./H C55jH˗uWCjw;<9 &5iD?yӧYTf! 1cFm&̹C9իPsIȀƻ0黄`ۈ15e<wh{6A%Y%>z=..N/ݻHԩSeSU@"#X|{)o2hV`px-ln"&Nhmkˆqѣv9̙3U>mBh&HyKva n7|ܝ#y{c/GyuML&35{,HkwVπzi#FS׾uv]6 @۴3S_"mZV 40UDqjhA J,Y" q W7" բD)&HH pΝ"V9TZaC"M7\S*N^7 @2 &Mɞ={2^ c+HHX6bqlݺUjԨHHHHHb~xfNr-m۶ -[aIHH gy# B|1̘ȈW/L$@$@(E 6=BΟYtW[5uqGM]gWs2T}Δ5ND$tråelʦ}#3~ IHK`رem _fϞ4)=bk$@$@$|1 K^ @ ta5||xb5\_,X  g RYhѢL|mg_7ƌ2ô$n75.]2BZcH]{2b̟?Ch!=* χ{amz>uo]1\']o̘1C&67+bIHHHHHH epv`,aeE%VFyҤxn ԬNpHHbsޅ;8@W3qws# $7'>}tr,^ "1 & Hn*T`]hh @2 2_swxҾ}{{[o޺2   HʔAquׯ; K#ОW?ٔN-RHժ\c2%yD$@$@$ɓX}!f{O*YRFk;Xϛן#YHkכ?5ucd)M'7 ')Z:wH5A7-cgO~6ǘu-\s{#6um1\' .38!:tH͛'?|G[#  dH! H"CqҰaC}:4hzٲ8:q~)h^ 91b_b$OF( .-YDZlԽ{m߿?lƗծq"HΪpsͨ;}O?;vbŜ`CBM:UNٳg{ɬYrNDžڮɢѻwos Do]v ŋ/nu簊>v7hrMYb,cvK.UA<]ٙ}IkM$֭+/ >\T<#xbe@Ľ3lHHHHHHKUDsX7;$ĪUqJiB0WR x|XLG1́HHH RΟw 9!rbHm"ow"   dF-Z̮C)bɣ`^5,\dr NI$Cf|&     EǏz̚5KZ0ǫQFz}'K: 2Wȝ;WԺu"kgI]_k/[֯wd2GaŊzPA@{M @߽;sb_P!sjF3 @ DRSk+;ٻr{2QS78jfLi:\ok;_Ҍv(ZƑuocI ?nsҫW/]~ CE 0 EFAaA$@$ 0b={ 0@ M8(1k֬z_|#̼ի'˖-f3g;VTIJ*nt]pA8 sEkc7754bLv]'!+VȞ={?KM ԶhBܹs ,vp6`>LކnuW…_~ҥKbŋ2oDkf뺟$@$0x`:u ~ݬ]arܷo_!      H\ƹ֫Z.^t+WpkkxY CB F"_>{M gjYoy~Q"Qa*Rjj!3IHHH֪U+ H& ܏8b$={6\/H 9sFϞTRٲeЈB      Qx7n$uƌ{kN1*# @4o\P`aCrV!uQ{Dg)W.x$HHH Q \&JNdvG>ݻ ^YTׯR%~ɿwd= Hngoˌ3СCR&jFM]ߌU#)M'O mP/urw-rhGWl׽%=bWŽ$@$@x^Ǐ~$:uҞ"a"  c" @UA`C9u,z-|0r̪V\"ӧY0t9s$K,eN=rH,6lhu $Lr?;vFubzbz]>C}8V9DP)ܣG `0ŞnѢEC.kѺ^ 4iҸuERS3I}N;%z^5(o(:P#+gU=bWŽ$@$@X Y6l O?6f Ho֪UKҦuRv0X~;mXSÞ={`h|^z^3G2"|"0>j(;I?48r<￷&Ig$C8lalC 'x@t{V׈k9}fJC4~ޮTdR'ӧ[{Ϫ^z@ ^>"10kӧ=_Ic8]      H4x׼C͎.ZJO)/*UJj֬锋a-ه^5v0@pvU5D(˖9\eʈ E%0E%\qHb b FK9KC ah,Y޸q BvZ;cXH @>{i7IH  &1;HA9 #Ǐ (z5 $3gt<H?ڽ"`&1cFz{ {OkuAcrȐ!>}z… g՚ +Եp^3 U3{MmP/urw-rhGWzľ5HH!YP?4ҡOwH=9 (BDB$@$W_}U0\RM&ڵKpdO lcO|` 6ŋf9raz;v aG}Ktt ɓTyy@E2`3 Zw#*H%<.韧zJdc9g d³0\yү_?yw套^x>9Ql B&a :bo}q'q^4&ԩS'Sf0 sf0lԨAcR8Ѽsq^tTTI5k'͟?_u"ikf[$@#sq7?׆kg&      llk֬s<-B 祉"cl 0B'VCڐFPKLU'E/wdםCLF[0(WC^2 $8@HAv b=u}BA["sP!L$@$@$@$@&GH fĈxU~M#M1߈'L FCڶmiH}eHHHHH7]d՞>}rwňٺ[m۶ڀtHHHH )" ;K}2^#ޝIqN'_tL=xq…Ei;e$@$@Fҍӷgٲ-ȈG>2 5J/ &KS0V`طo_*o`~~u,[bѣG۠;*2jzfX{BLi:\ R'ܱ/2|<zĞ{HH!PAC;Vta}ӦM21$@$@)@ڔ|v {GB7tkl[u֕+VȓO>M`ȈlR Qv]tu2n8 Fk͵naog=ٕk;7[µ|'zrLB1Jv]Oj֭Ӧz| ٤9s5 ;2aʔ)ڄƞСCϬܬҮ9ƪHڵk-CA 34h"mhgyFLa|oINxD$Jw>|jJN:1cF{6ː!6ۄY#,1.(&3fla>IdH,_$K!}t-ZȲe߻ɓ'[Ua;agH|Ȝ9|駂w$,o^ZS;'      H8Ec~z +)W\٢1]ĻHax:<H@TJ%&30#K0*Z4M6&̺zD$@$l2:vjJ jS]#`rb@r? l0b4ihWHHHHH"NB3gປm6mw- !n&    OJCg׫ 27&9#jJlj fŊ92co꿧J+,# \fv>^dz`6ijjP*0׃Y(2*ŗ(^Q#FLiRɒ%3ۮ{/ʖ-[#S\/8eɒ%mgΜXH"JdOǏ)Bsw"r> @yH,G#4־'Nh1vF>?S" 9 Ajٲ|hqI$8w._nǏOU      H_tXW»fch:pqx! J@\ub)O)z%;%̺Yzt<H*D;&!`_'AK YkE#`t@h|:$@$@$@$:PC"b %IJUZUի;]5 $a7ob>8oBc?$@A@\/D-[6, 6%KĚ9ydytz-y׬qHHHHHMtR=qƌb q{uƋ0_SHHHH%N#u!%9t1  Fc麎{&  `NԡC.Qx`MMo`d֬u,KɘH \֧),H uNM|S!_B=˗/| '{}ј`9SNnכX`/ur{ǂ2n[Kl=bqHH P R 1?- _&+ $ 84d& xd0 )"l=ZL,Azk`E )o޼r뭷rH6mZr,X>m|wfH 1brIꫯgϞr'K$@$@$@$@$@$@$``7\={|^XPbEUԮ][gȑIB&9~*J'A K% dcʜah7jrYg" $Kx^>p0K:؍ ` &jZ6,0^9K`HHHHHHHHH;ҥK[visHHHHHE]fssܝ;W\ҢE iӦjJHHHH$/rOFЛlbsc?bI%/cIO-!դ#vd7Cog> }ts61`Ǐ~x+M> M_9 $@$nYfM< $Is4P7n~:ѽchGέŪUpHH 7H&Mol2`mPcIHH Ј1N$@a$0qDA&=Ҷm`1$@^{NաCzY)TO0!cC=P x 'O>|<駟kJz̘`"      @R2رcʕ+T|jlժU"kԨ&fqd۝;tΝ7e4q &W=T^ m#{%F10e@Mȼ> @:%ѣl4yM<  E)/K#       ?1)H$@$@$@$@)˗e…u"I*ԬYSZn4h iҤq[$@$@$@$@$nƨn]gVf0fDF =q+Wݷ_3g11h4KW72N3 @3&>hlyH2)7K#E< mH+&{+I]K.urcφ7$@$@$Nr 8PׯKϞ=e͚5)R;)\y.  AF)>*IH'͛7˔)S|sW[ouW2  {"(3GQafJȄ%$@$ ^zɗ_~)/-[hc_=SX      H1nܸOXBazj9sOٳg& 2*W,i2'26`dfL-AΖyXJ$yc'2b%%a@]sJ^y5$@$@$@$@$@$@$@$@ɋ@.+Rl>^K{&     M.\@`;wn뮻UVҲeK)TZ,"    '!H27׮>,r`|>t(:Lʼ6EV>ESF,a8n2֫K,>O $@)l'E96nh ҏ]spaQ KO++ $@}E~H :]P[EXsǓ 'ӧ˒%Kd֭w}Su $@A~HH4{G*u R 8 "/BIcرcH:.< Hnj#jՒkj&o-ݻw%JW \W3v1.bj*9O:j~{p,(.g -Pƹs&ȄmL%,mݻs{Ƙƴ6K˔)\#.g2v,z˨ чp4i4p(X0>m,b"y.        NTRz\frUI.] ''    E̟3gx'ܥԩSKz"ׯ/(c"    @E:Q-F99clf o21hĶk~#!jVXH `1v5q+k^O0׆$b$wKcg D#E%g9H[}N" }i Ƹqf͚rey19u  1F-L$@1EL$@II^xI^NJ"qUV^{=x?U$@$@$@$@$@$@$<.nܸtqrN{>R-EcXnXLI@֬"*8a chG;&Y!?kWě>zku& a#-MY"0Y2u=+I qCF`8}ڱ4rҵ̟v$݆rl֍٢1ZD95%HHHHHHHHb@ҥ oR\X HHHHH  ܶh"={ΫVpբE iٲu]ԅN 8HHHH ab/]Jhhbwۗ~LM_3gv6f4l1fX^& `sa9xM&H.O֊G,>ɢu5 qS7#6߾D"L_9&w& %z$~BcQ'7vHHR&+W_Uc ߥ9OuϘ,\ў"A!Z 'Ip͸`,QL$@$@$@$@$ ,[L6m$۷oW oFH;wTaՏX?Rj9atJ pn>ghѢ?nUW(߲e^?3fe˪߻oC\~/^\傟)˗/Wu)ԥRq 47U;^x,YD?\qiӦ)S&gpo{ʐ!(Q绹W?c?:>*U߾}~PBRdu!yf}̂+.zQd+P vL^;Sg$@IMڵk:\ $q*`ڵ <|Ufʹ" T IHHHH B0$>u ؍ML=ʐ{HBrs]h?gμ[9R׷8GlY8{ xzizΌ=wq&&{de|ĹEn^| v?Mfa;wŒX|ɢF4inv          D#/?50su @'@#$~=       aÆIϞ=u#WLf"      dBBׯ+W +Vh1K.yBCט.p0\M/;!$a7h:D%OrctH^#SFx+`i_wWf1d`-%9>3m8φt-&=-~FĬ%ݭ _p 0Fnٲ̜9>>32m4o?#A]0>\뗠>X;vHPYwky#$0}RJY]0fVWHHHHHR ϝ;&!ޫFr]w ~6iDť&     @xoj(Zϻ4ڷOx,8[2֨qwT MgvD<1k41Xz&u?~ΘlbͶ%,"$@|o&l%Wo&^f_7D<>:?\*^K8)*+wFe`)M껐K=ɩ;R<|r)3\Rp.sLF<  @&F v`!40 s |A=/i#  !@'VIHHHHHH!ݻ'|"K, 6ѣb2T^ @ p5˗ku)0%AlٲN0^]&.ȁaLQ#$n$`q ,^I$> nB9cWa#`,Mo{ZG]!C¬[a`2 apm{w eV>`T\F) ĺه%XFFi'>'Yd0SҞah]MͶIHw $0Blڴ6ˢ;v(eʔQ=OɦM۶m"1<ɔۗ8 Ǐ^u F'Nt(PsRB JH1>ȑ#rA EaO?%8] ž.)E{"Y:J//ի?+xի.\\]ùƇL0A5֯_ߩmFBcC*Z=,(g϶/X@9B7+1S*,"A`ҤIڈ7z+Fqv/J(auF @'?2^{4OXbx͛7|yr     $N;r]E 5bML=ưKdm۟j\9v r&Sqߪ %MA$G{{<=[x`b1ݛL<}KgҘ*XM7!XϞ=E,+W>a}yׯ_sѣ&p:T^|dm         VK5d[rEOElHHbcF$@$@$@$@$@$@$@I&F%[nxo{H$@$@$@$@$@) e1XB~ /_>7vo>6Llar !$N`]{0ot _=4F*hW1Zv DRʉ`v)H̎ E]b-~#` Q"L$@$@$@$@$@ѣ6Z\wf"0cҥo̲~z>}lSY!\)۷o $Qwԩ\؏wL$@$@ ,Yڱ{nk+$@$@$@$@$@ɋ2|.k׮]e pmYxD$@$@$@$@$@/c'ǘ˝W>n [obM=Mꫯޓ[:Qti۷<#*Y9L M`G lG71,1&һ)douy T~^UVALM}x`3f1jTzK ( }cǎRpᨵdžHHHHHHHHH'~s=$xwKك?)$  dHFHHHHHHHСC~Aϕ+WNNu      K`޽lqz SNy2eHzD`5kVq' @O$V(ry5dhyC# p8e9ۏ'#0٨z,R⃲r ' "n:D SOK/$Æ .]RU{U_#%KiܸL<ى+%&glZv>4ڟ _9I`{mͰ,o>WV#d̙rEH>vڍO<)fyq{\ av0fm c3)ڦM޽,Xc7p&L5kȮ]B H" ;~nc?9||'2o<9tT^]/-ZHp)8pdٷo4lP?#d:{^E#Gyʷ~M4Fxθ@YCG-Iq)Ϛ5k/={4X9s{b 6lؠW5{'0a[ZJI1FQ)s{ݩS'iݺS[3bf̘! 408:ܻ;vHٲeG0P@9 JAw/bU?o0qMx?O?$0)l{9i49$Yy cr    JO.]b}2w) @̗1^5!cXF$@$@$@$@$@01z|ҾVZү_?=vMwk37n7XΙ3S'֝*Rdc=޻+ǹ7wo?Ft_.޵̗bܭ>{oOd"        m۶Na3 p_5        @LW_W^yE__~Y~͈yRF$@$@$@$@$@$@~pǎyd%1^SL 3}H"I F"¹4m3b͛xȨQ F$@$@$@$@$@7 <ФiӦic'O>)C_0{#<"}Gզsa9˗/;LlN `{r5q5% Taj8㤮9nvm9sf9s6d Nȍ=Z6m$*U)ShΝ;kCp/sv03 0_=ݘ]tI}GPmrJA1w} js0Cz塇3 ۷x{C={[K޽|o- @PriL$@$@$@$@$@$@$@$@&ЧO)^>-D `D$@$@$@$@$@$@$p)3gӿ{hѢZ]vojhw7v~AOo޼9yx. dAb fΜi7IHHHHR0+jc5 9r̟??(0±ݞ7k֬oN0K۳g넘=X[n`l*\>k]Y[;ʖ-[<~&YunÔ ~ٲe 2Hft٧7E$c>hbaÆit0ru,o0-͘1ۮ_NqF={ݻWtBoժ6?#*TЦrxG`6F0b5Ν;~ay饗\| 'OmD ~%` P8lR03 MBQf|qÝ8Cqz?hMY1P7 /}ݧM=O>mgV\9A33L5;v({SCPDS9VnݪHphȐ!^xA%{&պuk]_~N$<`D$@$@$@$@$4xߥ9s&MȀܤ/:ulٲOߨG D2 @0KRwޱƲS+_C;&~j4h@xϕnw?yFɳ>$@$@$@$@$@$@$@$@$@!cMA|_~92 $@$@$hm D"}v&Hb$@"w)..NCDwXF$@ l<H @iСC@lŊ L$@$@$@$@$@$@$(h^Z-[fm۶yg|| Awze…=Ug9 ތqw!|zb    H2e$o<L`S6mh6_x:dչ[\9{O`o] (`Շ#;E2?^^ÿ́Qf8Ek scj#,3FgZjDf͚Z鲂dOonݺ%ma hg̘!0;9Ӂ"Eh#޽{kB|TƁH01I_Φ̾!oVڵkg.V ƣx0h mhUP믿Jԩ#08O߿_-j_5k,YR+T?^t4w۶mp0dpBe=B.{9gI1 `C1>ck"d˜9ΝGd H9M4c4 Fch@7M63g $vI`9xӜZOO?s 7W:t 0rD (}Dų 3%#F\!D$@$@$@$@$;/7o,^X0S. HHHHHH .]gaz 0gNhU1bE .F{U=g֥K$@$:k֬)Ry$, ܸqu{+ p4a" Hs8 IC  MF ^lܸVU LM|&OHHHG1}Wn|IHHHHHR߼y2ƋOO##Gtј/E2  /^\#'Np{KzڰHHHHHHӧd˖M`wٹs=ZgSwߕ C,ӥK'0[SO=a #FO ̌~m۶M( `ކh{M/dMVRE=Cʊ+pN~߮]t[ 6I&i>O$=%won$>ZJ}eTq \yuܹJT׍)ӧjfx۸qc'Fs\'&+G#Ƨ~b-aj# Nq}nM EˈfvFg,3)TVޣ#GȄ t7 b0~a&;vLΝgc\/f=16nh"B%KsZ[oU1zIݼ7LKA L$@$@$@$@$@'0 E/Ѕ uI5j I *ذajA#.L$@$@ D7a+,!HL'&}M$@$@$@$.y.={ԧ#hN:\M<$@$@$h'Ȟ=`3 @%` L$@$@#`FH ;րWL"4O$@$@$@$@$@$C tk Dpٳg^&֬YSׯ/Փ[nEʖ-1=ԸHB#Pvm={ǓRJpB)_zA$@$@$@$@$<:^SL0e̙` ڋ/̙#˗/B 03)}f5lK5A|Cl(+'O+W&}({c@IDATb~i{߱sd\oس{ު$7m4]N4 "%J={ԪUJnj۷oN 4h K.SZqAUVvӦM'O؀IX7ow˕+m-1aj=8RݺuoVر_M*{yf람?^&Nhm~hFïkd%|`Z cW| x}~"bW }c.05A3Ә=Ϭ#>?v#Fb"    </ʒ%K;/be~Spo2exr     S-3&gNVpay'1O2b}) I6x?`i۶6e z5M4\5@ HgCMdxcyI)@,Y,[(B$@01$@$@Q#\~˲j*믓Ĝ`C$@$@$=a1 3LDf" C"L$@$@$@$@h֬kN!p~ԨQү_?f-      dGԩSZ!(%DԩSKŊ"W.Eg" _F a s"2 !Qx@gYF =z=zT -UT搰- *$<|'c-|[jQgРAO c=cغuDseȐ!:F_0̝;wkٺu.۸q J0sg?~M.v5ƔFRGTR~7TV#tQRH#G>}Ȋ+RR%iڴtUEጿ>|嗖k3ƌ eY K.j1 cN^ @%3x˂"m!F\Bo5^"eHHHHH 1c|`.Kʕ套^|P8I2]ƀ… gyF>y68ٳgX#đvy< @r#ꫯ 2 @%y򽷼2   H0OdĈ u֍ZT)Ck' 3k HHHHHHHH b &l~ >\'ȑ#b$@$@$@$@$@$@I dmm۶I\\+VtN:*&I$@)IgΜJ@L$@$@$@$@$@$@5aLt,aVZ5wC.ׯ|g2uT߼5i#ƍKÆ u:tM`C={ʜ9sui_9;5Fl٤K.A]|YvۈwRUoNnTP@Q)C ))i)Q@;KBsos̽wzy=޿s̝kNZj׮mev/1J*jf9ͅk׮ƍ5ԙ֨Q#L0D޽[Ξ=pFs8:a Lav8|Pׯ"G,;wj׮]M6ֻ.^Dո"~cDgw7:2ܽGqwfDa(Ѷm[{eСCZ~K.:ޛu3 'KپK>}zw+bjͲ[k$@$@$@$@$@zlڴbo!G)g͚U a)fv      3gرceʔ)yXt]&Qy\K`Ϟ=_FS”AH0ҲeKj񇠽_׾!hWf 'ʕ+K͚5uɓ'u`d(gik  1F"'j*yQs e  2( 2̄e' o~z:LH7'M4Qq+AdmРA8B$@$@$@$@$@$3NRm۶BFQ&'O.ŋc.]:Gs;  DֈYD $dС%}IHHHH [jĈ|7!sYfMf޽sdbY&L ժUk_tmEz+<(fw_/{e}` Ў3FG֭[ףFEҥK2i$=Μ9+h g}VbŊc.3HHHHHN6liO:L(wjc/Z;<;HHHHHHC`myiI6f̘R^=ѣg19wf۷̽}̞=[+Tҥf^5jHd\J''UZUW\)}Q1bD:_rt"q`|F~6߲ʕ۷a所"dɒQtqo7m$1ڞ(OիW)Ej c. v%N2|2Ϝ918q 8hiVQGS…jD^z8S˗]%CVʕ+J` v5``/O$`C-[[9U $w}2n$0  ?9}aٹsdĉҹsg?䄗$  QQFHHH ×gr$@$@$@$d"Ν;2dȐ,3M$@$@$@$@$@H"iӦIVPB*0 /.ZHlM1M4Qm6¸k˖-2n8iܸNX|(gIH ]h(g~P .D\@$@$@$@$@$`ZѺuԄ%E7#ꫯبQ|)ԓ 4H.^r8oF}&@l`(_φuʖ-cmֻ\^~E|+Wlwzk֬۷o|@8϶?ˑ#G|J*.\(w]ZxI=8*PGv Kƌ| jg,Wyv1ኃvs "2eR W\|2HHHHH#5vXA= ɣ}ƾk5a}ɒ%}!Ǐ Є?\"    Ǐ˼y/N*|ڮ_ЄуܻwnIq7n\:HM>]P'H*X     $pə3hBz)ٲe S͛7K˖-u[${a]zլڝ'JHǏowFravatM9v옚}qF=aÆ*hD/myPgA0Dx01cȪUO>*o-Bl3xW}5ΞK 5uƊ5jpZji<{˖-ի;<6v@^zj*i-#_09QhpoL8Q6l 5Rüyυ dʔ)3(ݝy6mdСΝ; VM'Y`;{\wYzbŊUV3N: &Sp-^9`Xd}z1ZPpHHHH D@l 7mڤs}H<-[VM+V(ŋ8q8:IHHHHHP?~xmqFk ڍ` +V09w E #\Rԩ#ׯ_wxIEj۶hS(ڳa抶W#o?~;_H3&MHWY6p^FdϹy> @t'~4bw#+m 籏St, 34btFHHHHHHHH0`0sLݻy2LHHHHHH 4߲eeڵk|({챘.BtԩSNs(Q" ҥKc非Ý$@$@Cb{ۅnӦNJ gd̘Q`HӧOMFy`GD-Q7=z$Yf 1#1F~x6` <<0ʊ30% ))Wˮo9sfM32P8T9rH8q"sKS@ԇH¥t|}ܽG('p;|B@{ F isL $W\.Q_g]bE! ND 儨B&M4?0A+HHHHGvx J BVB5_b,Y$@$@$@$@$@$w+W#GZ$Lظqc5Ro\|Yu;vlmK̝;o.ΫW@Ç[m"UV = Ǐ'ڵkaG͛K֭%W\aqH7B,GZ9 8hCjQߑl dȐܹse. @8ztO:6=|jXxq#HHHHH7dgd9GҹsgiѢ͝{xg_~HVRJ%k֬Qa+Ww 7۶m'jk̊+SƌSSRúK k>#5b٣Fky @cFS=60&2[εn ?#v/n޼Y.]4W+V\95^b޼y%FNN     4'OcʴiΝ;a1]vzI̘1o K>|֭MַH.^X6m*&y4zh>}”qYeРARn]i۶T\Y oT^] *${BbŊ 1M`HHHHHHHB@dɤSN2`d?dhz$Xb     OӧqM6Y#G?jK„ xŲeJԩ" x+F6kLv)'LF )S\Zܸq]:'թSG2dR6J.y<AϺ輻{wdy%[+ě/\`$@$@$@$@$/_V/+x2eN+!c FY p5u3.^m#M49sfȆ/i#eESgϞU4>ȅV +36џ7@s8 {Ŝ D/ $кO?T}DB4$@$@$f ߥcǎr+a`: apuv~ms`F3GTnT^]7Ϟ=[5jk֬_pA~޼yuo (~zIE4" =Z,ow~5lPOnWfMdT X΄?g4`NdFl2oaBg+;~ذacqFCX-~ҤI:'Oj;·9Ղ1Q/%  GFZԩSo߾Q2_~DX"     F cxQL:֛1bŊ $@$@$(yK(!}P,2P*A$@$@$@$@$@$@$@$@AF&.^hWHHHHJԩSW 1cď_? }0n1HHHHHH )g}fd Ν;fo?ВCJؔ KoNPCFh uV:u$͛7_rέH5u#[v^x1cƔ|I^Tmsho^~'UJYzu8tFoÇ=zUZwȞ={8{ˁ\xF>A`Ԝ <, Sck壏>Xb9=;IHH :`mt, !VPA%J$ȑC)Lq [#FSL4g˖ͬڝd6Ν;'3gΔVZ:*Qq{ pN0j?B/mڴJ'%IDr̩9Gid֬YjXdpɢSՄ t;}gٻwlܸ1ymӧ8YYŸyv);# G1cFGti02aݞُ9˥N:֛e޼yaֹB$ ipҤIƈ1Y$@$JJ7No<1`UHHHHHH ܻwOva1^ܲe\v!OɓGۆ"P:$@$@BFiW/Ǐ/:tp%)C$@$@$@$@$@$@$@$@$@.Kx ޽{j9M.ƍ\"     hF`Ν2zhoѣGaJWzuҥԨQ#v߿_3ߵ L2G$@ϯ% &gVF!0EL0Rݺu1 ]ԵF!7:W5nX~Sn"џy.V\i!a~$Oܲmܹ#K,w8 K 5g1|HHH dɒEj׮--gϪK/bIHH B4b $f͚`eՒ:u0X?wZYCC9/+~;.q0cď!auf#JǕ.]Zp9s￯&-o*&L"V0$M6}faݺu mfv[vŋӽfF<߅ÇKӦM7Ei?F0ȑ#Qpah85b6|NuUip @ڵvt&޽<3AHHHHHr劚.bPƍUX oE.bqʔ)$@$@$\1b@7|#{QST"  r2S$@$@$@$@$@$@$@$@$@яc+!KD$@$@$@$-/_-[h1/L/3fLm7ƋgϞA$@$@$@$@$@х'OR0x/@ֻ۷AˎA$90ztBĉ՘)ASڴie˖ҪU+ɚ5kQ$@$ԍ:3fH2e,'9sFڶm+/ ɓU_r ֧Kdgj„h6}dҥ"E&ѣG%gΜà͋0$@$@$@$@$@@]6mЈ5<HH  2$@L͛*27. #'KL#jª"SL>}zA J7F״``h~Lx$N7n, ң?.۷os%KtB vMRJ!̉~\ e!*\`AMo߾I35[l?t92<;J9흃"EHYn,YRn6kLl]VMj3+! 'гgO5F6G-O#    hSA]٤I@Yf&Mɓa]0(#_|ʌ3ÂA .nݺ Kƍ7б$@$@ќ!Yy s sѣHHHHHHHHHFR\iFm%JPsyh4mV͇aD @Xyz7|K:$@$@$7ve^H  YȗA2D*ԩ˷hBvj0|U''kb[*}p;_gg=*Y M6vts4 GWk,CTRN b߿*ѡFo0xgTXwҽ{w-aĸ{n~;wYwnBo-0gDeǏ6l#:@xoA0%!&;z;`Ct*TP{%eMYnܸv6A'LP1vaٳَ2\bB'Oa\{d1YO+T=b~Яm4^q}~p>Aĉ w;'5k>x& `5o}NϰYIs T0;ށ0`ƻw 2_$@$@$@$@$@є:MڵKP_qF]水k! ˗/\O  FhHZ ̝:u} ɣmֿm?K,̙3G/ǏZjdIHHHHHHHHH bfc$@$@$@$@Ic i&c8bŊIٲe-; رCƌ#~j}Yzj4ftq9x1B^fT') ^xA0_]1Q}2p@1c֭U-FAP2fH :0(5uݿFVO)gdWضm~CsJ* PF]V^@ڥ&LPm|%|Mow^tFܨ]hsP:FM: ,̛{ Gxa9s|:~֭[U'\xQ`P~b]jTx5j,Z(uírHHi))/.ó7x.W;;v֢C2pyr̘1լG ?В]nb _~EB)SF0ȶuUVh H111E2'  !#Fx饗d߾}fH,YR5j]O>ew9Ғ)[ L@IDAT Aڈ     O煱*M>_|!{ gxRĸ?ܸqK֭[WhHHHHH>G6 iO<؆/lR/_ܢ)e?%n thG& O aBرcdSw,4`+W.H;c$@$?ܓc1zJ:#y.ЁL8&(;`?ΡMA\ﺯ4TݹGqUW:x ,zLJoɓ'x2LPB\֫b#l dȐ!Q̞="i} :aRLc0Q@ի4&9:E`*!LM1 ~kΜ9**n˔)`tё0jTo,+&h9#*Ϟ=+3fG9k035kV݇Al3gT#۷[ޝ*Te˖ L `i)'c߿ sEHF@j]]EG( 3eF(7LQz]tddxFMڵkh1}ҥKAg{s @_l^ :Tc ۴i#9r䐶m/"hPڇ     }l޼982\ XD$wQ'dI $@$`C㉂)RNmK,\    >\V˜ڝ;wc01sqO     !ޟ:uu7d{O>Q $uܷЖ&%&kM, >}Hޓ+ƈ#HJl 3jzAzF7\y]-'N2eȂ Ԝ:}Sa`̻ᆱ-<Њ6T }O벿 gk`hI40ˎ-ZHógN ժUS#2wfviE,r)b #pvpmY"0W^ w(:k׮*Ȉ&m&lQ9ZjxfVWF&؆@^0Yf 4[n1UVis?~lY6ݽz#Oh6ayOa[FDFǸgĈw*7ֆf#ƨ~έe /SĨQ+_. @pCtZnQ,fͪ0]|9;HHH m۶ .車 F+c˦Bɓ'Onv[dǏ/I$QZZB/^\J,ikǀx̙3,feˆ'tb2QHm uxaXj9swk/]-7Ȅ'>x3gȵk,5(aDע#2kP|3iIH 9Gr1}OݻW *YfHHHHHxј/ⷅ XahݑyN$@$@$?TsqI"ESN*#aKTTIϘ1C^z%m+֭T\Y#0"    )Xbi?^#رZ~;g ;=&M1sy. o߾] ae,K9s攲eZ/      pLZh0=/KN^p5 :0HC};`҅ %W_ɥK4C0޽֫WO},mʫ CQ_@ŏ?@ן?M]%#ҦM+4'Oɒ%:uJr-jvC&O,Џ|W*:[+dk]4rϞ=k; aO#ۭur25rAA$@$oC^,}ڇIHH-ԙ& 8 17xC'e„ ڨlyg-ZȤIy7t'/t`,*`ܷ|rA~2kE 0 feSLFt G 7QέYf$1# JaXN0W6l1|nVZ%?R{b8 " T3tԩ:Le;EtmʶlٲE*] Ϛ5+s:PѣGKǎe׮]-|'˗OEz-(m{]|jycW?Wۋ1ttT!z?1Z"ech}|hvbŊYL!fh\kHHHHHB{o>B'͛k_3/{ʜ9sRnݺE²d$dr!ÇO>D `-+Bj:ʕKZjԩSY)] ` @Mߥ#F=0`Gɒ%eÆ Bg}Zg>ƈ./iӯ_?`lgLkժ%A\O4TݽG(+q@ɍu3w{:}}0ͲŹf$$@$@$= ΝK#F_HH|JF>͋ 8"siǣ h6aVP!GG2uTYhQԜ]Fh]% ڵ/B0b*UT,r4( 00 4#F"*Ϟlg˦mڴ wh8qt SgFՓGJ„ p s?Tn1\r`9r[ϟ?w]ڽgaw%SLtݶAVYEďj-[`; 1:FTft&mj ӲeСCC*iG4O\7L>\q^T+#G]nݒRJ ͔)S0UjU9v74IH (@._!K堀L @?eڵEl9 Ƌ*U2eʈ8Gs; 4mT>3ܽ{|:W 6A$@$@$@$@$@$@$@$@$@&`oҥK?xLHHHH9'O8J{"'N8= l\r: /ǝ:w @8wL0AKzj\C}ҲeKI4i}\z%r(D;RE6kРNЩ2e̘1CdG{=lH -:aHCcWS>>|X믎O+}Z˺4ʺډ ƌO0EiݺuØz꺾e1w{jLׯ_/<چf$@$*˰a@f Ⳝ$@$@$@$@$@Oӧ*n:5_D]@1Z|HHH m%+W֌A=m(Q3 W./r`!        zD4b  1w-[l7n8,˧xьtxw 8$qɷ~+= stI PH) \/D̙:d  &=8 4Haj*GϟSΜ9Usy檋إbH5u#sɓ'Wjժzҥjv}ڒ?MM%KtY0@(~'WàCT:{P5rU绫kyvsW8I9sW^ q  gyFj֬) .T2)S&X| @ f8Ҩx /ɓ>#`yɉ'\*aQ$K̥t\9Vbp d6ȳgrq=aYfM<[}fx>0Eew֭B6l4+Ν[O:e6dyGcǎ$Qas<+}ңGm0O fgڵ:7}ڨx[0WD,Y2-Wc4FUtGCEz+ur FM8ԩS7?   6F=K$@$Y4b,)G$69si:x=PBNuwgW_P"M4h q=#Ǖ-[V IfmcF&Fx_2Y #gVZIʕML"bw$wyFm?k']2d0HpB~gϞn7ȑCLCѣ=S>smGUO^0g8+m|gw>E1c΍$@$j^b_tI,XjX^     /BMVa˕+W0H4Ԯ][F!;vk׮ҥKuDL0'qHHH B-YnjӦg>CŶ$@$@$@$@$@$@$@$@$@$*TRYNHHHH 8uTi޼&KNNJ` ac\m͛vZK/Iɭ2 @_Օ%Kiܸ2IF>c9s-Z<,[L6nܨ%vq3HȆ &gϞU~A/MLh`2d?>8 \ 5u=W^o&zO@<˗+u5F? ƌov" `?v6iۻG;F-O$Niܹs _~Yo`*J$@$@vHHܹ#9sSe&͛7K˖-u[${aǏիWͪyD$~vYoDˏ?(lw^r15`-f6l(Ŋ{77~Gjh<߬ZJh|vFsȤyvٺ\x=|aLqޢE*UH8q,NJKU&Q:tziar6!?;[oĉeÆ ҨQ#o$o޼e .Ȕ)S&]tlwgBC7nHΝUhʄw`کS'vECϛ7O6dI_Z <`?Rwڥ(Qœswkڵ[jymyQAv/`gcd]#I&N ;ZңG1b@Q0 Lܹsҽ{w5{.w1irI=<چ;׵NuւQϋ1T_ASNy<㺮~P9sf5$ Yfm6)HB={I[#Pg @@]0ԉ7+V(UTQEKŌޡF$@$@$ G+~̜9ShLRm Ŋ%gHHHHH O 2HHHH 6bPHHHH PEĄsƥcLƊ`\hٲe%y       <|P -[IS *Ǖ%pBՔh$k %'hJCU~IL"+Wx` 2H-e˖5khJ"p5u]%g'wzZS ]Q(/ SN#RN\|@;!     \O5kE+9IbʕxF4^tDIHH H",vMw]/_n)(.9l0mOoԨ*M(. +RJe9F\    Ο?c1cmutRʔ)t//^\ƍpn'     yTg֪U+6 }fU PrH@8ql:m4Փ3cAϝ;'| 2g*a0rt̑#{t)U@5X֭[}E}e˖MK=9tvl5`qYW,Oz3vcG<xрa .[H Cƌڵk?      .kcǎ9T+TUTE|}CXA$@$@!B[fpT^RzAsE2}t~. xuM bĈP.\ ӧlԭ[W.\,$@$@$@$p>,0]4ǝ1{R|y˔7og&ȝ$@$@$@$@$@$@&{nd޼yQpaС4jH$H`$̙#72e͛IH @? ZNSLŋ>54mT}]AH 8ϟ_u"ifBwZ1]`ԧ <{n7G|U"+ȝiP'pr>CDA.K5#ۈ+N$@$xr%Ѓ7\~]&LxdHHH5v(ػOT "&#+ꮺ.VUQ\:@B z]K $>s7ɽSns9s̙ސ;3'|g@@@ Enݺ%aaai& 5h2I͚5 XfMDH  @@eҽ{w;H-===Ewޕ3gt5 "  @2 4n8k*@@~ciܵk,  *l]ժUMF L<'@@@_ 22RL۷ǹi߾ X84# FWp!}l/_@>}Y^3կl 6AIΝ B#t_$eq}ZGlsʼzrIyPջH`\UH<:;@H#]D1>~Xt\VҨ%@ cR# -2P_4f$ t1W_q]~ܹu+^+H}aÆ:ʔ)2bB  k JHnݺuԑt*J  `Р_ٳG:$f͒~YΗ*UJ&N({6yC 1ŋa@@@@HYΝ;rƍ\JY@@)t!{Ťn*CJ2dkz穄ʓ   rW\SʤIҥKqn+W.8p|ơ }isYff^XEF(PYwߕ0;GFDDo믿.ݻwH͚5]Dn"*3zO=Y h F|EF FM ? @d8q?W}u]Z^jMKk@RPٓr/  / j*9w]͹   .&)w6BCCeΝnJRV-KKƌm%@HPMK/0rH2e\ӫW/Yn̛7On߾-=z͛7 ;     @Rc ]~=)Q@pH`[l1uÇK9A&^ԅӥK`yN   ]d„ xb>*U2zܞ):gO?gԨQ}v@ѴiS˜9sLPƣGۡVJQiP` "k:w,w+j?SO;! ~DEE5G@ !&жm[)\sWn.-/r5F )SNMJqKY&Z(s( 6ɓ'1L@@#Gƍͦݻs*W8Wreyͦf   l2t钌;Vĩ3 ={VonO@@@@H@ܹEoyDGG~JB@EΝ;sU'Oܢ:$@@@@@ 17n$r# i*.˗/K/>۴kN+ٷoU˛c͛'.\gJ``820K@@@87n)U|q޿Y[ŋ2f0Ƒ 'N˗/:ud_HjGȒ% 0@v!ǎ~[gA:dɒҲeKQ5@@@@HK 4# @gt@@@@tg}f6mwwwg6C@@ O<;wʆ fkaJf*7͛bŊ1 G}$s̑;wԩS7ސriLj#3NXX?^ $/S@@@@@Yy~:,  = ܺuKl"~Vz!T777\c5jgt   fwޕYf;qDvKNt"ԩS'9x^{ɿos駟>oU\_|!GUVeڵf}}3fk\gϞ&c*UC@@@@ ׯo2t6 "@ Fgy%   8@"EWV\).\իW"  cǎY&B[߷yԭ[xvǦ6D@Tț7hLׯAAAqڡ}̝;Wt}xx,YDM&S@@@@@rm9} >;  =ܾ}[nj x/gUV&MxQ4'!  طMٳgct^СCeРA/_اGO |ruS+"@$_С~7 3f?l9 Ǐ7[͚5_~ҽ{wə3grܞ:@@@@x@֬YRJr!9|Lo4lPʕ+     @B邟$@@ -t1m۶Ihh/O>$ XZ5iڴ%b9l%@@@"##ewߙⷮI&kxxx?1Z@~~嗦tT(T{͛M@%KÇM}noA7o.' @@@@[ Ĩݻ׌KQ7 !@ P    @2 nZ-*.\5k˗@T;   `f- %::f ,h/_&  `3f?XlZʖ-[Z :T&M$(i׮]eݒ!Cd     _c@HMǏΝ;MЍ~Av%O<]xJ*&/ڤ"@@[~MN*SLݏ2g,z2+V$%<<ۣG)SL߃ @nnnkʂ d&{,\lE>}H߾}tұa@@@@dWF+Ա{7N@ cZs_@@@@9t0gIdd̞=[?GM\  ;v]7o6lZ'\@ m) $п;v8qBn*V???.hm۶ɑ#GСCo˄ ʑ     c|@@ %di&>yK]rʖ:6,gΜ6˒   `wح}W_5sg;w䫯2u{zzȑ#S>T$$jÇ̙3eܹr5sŋ5j$Ν;K,Y|@@@@,Pn]5;w쳃 # ё_=ڎ   .)G%fP-]ۀN# N).6lu֙.]O P^zuiٲի'ҥYL@@<<-֭G  8ӧOeϞ=&ڵke޽eE1A4b-$w6ˑ 8@DNܹS9"gϖ}ZubŊ7Ȑ!C̹EH     @BbLH|@x^Wׯ7_/\`UŊ^ N,'@@@Cwq]`A4h <pZ TiҀ#GL[s@lW\s皠G5@*U+ӧ-Z$     IڵoԥK&!,@F@RPC̙3 @5n޼i&޽{L)D& | }ڸ ]_~&sƌbt! N$pE3fݺuqFIL2xQ *8]A@'矋)Jn$C V46l%KHxx+?UY2@@@@@ #  g=z$[n5UΝ;4mT^~ei޼.]:~@@@P ""B/^l0ܹӪM4aÆIL;d J|ܺuܭwRdT3A/?~y뭷̶w^q_? $GZu 1c߄ `S@gɒ92@H? > @Ufւ^ؿ… Ep:1:KJHY}3رc){jG0/ E@'^{M޽+-jH  ؛~mY 9zhM\jJ|||aÆ>}r@pFZJ.\ &L~fקN*:ܹs>?fY2@@@@@ٳܐp@@@g hCq`xq۶mm%ߠc4_Eك   Lпmkժ% @@g&kw}W%xѣ>0)" MB@@@@ *UJΞ=+yk׮?1 'OD*% O?Yֈay,uNCܹcN@@@.^(ӦM3ۥK,]t Æ {SX͛&bӧO,_n^@޺u ʸxb{nJܤqҷo_ԩdɒ%yp *MŘ̮w W)J @ DFF"""D=z4Ý@=|Ԁ    חeʩS$,,Lt.NB@@ 5t1իWMG>|h  غukVΜ9m#@@ aO?T.\({2|p)\ F!6mPaeٲe6˒    -[\# ϟ75ƍź6mjƃlRʔ)s   N&%֭I&IHH<}4NK,)7o88@Ǝ+1GF{zqh <Z6۷~+hp Ԩ~u_b1Ǽג@@@@ˁ̺1}  btؗ#   "z#G7o   "?-[X/|慞fVreD@H>] U*~)}̛7/sڛoiiGDDHn"2eJN     k ^tS1b$@pLqǎzj%4Cԩ#[VZI5@@x7$00PL"NS8diӦߏ$Iݻ2n8d H + }ײrJ;ݺuf>:ܹlomVze'r%&   @2e,?}e@Q@fRP ,,LST  H2 %гgOQ͝;@C@HP@\v f Y6fNnѢȑf92@@RN|r5Y`1b_-['NÇSԌ    %;[4@_.:lժU j߾}ۺs (`ƂJ%3 D@@p*͛7ԩSeɒ% 2x`)^Sθĉ-t=%JE@% lW\yɬYСC> 3nsnݺđ,ݡ  @ v s .]ҡ3gXA@pkfQ@'Ҵj*k*@@1A2R>ԏ!stRǏ`rEqwwwJ@@48zYl+$$Dv!O>j>S֪UKt-jԨ!nnnV@@H]oF4 mʊ+Oի˽{L9 I     1c7˗/vځ &pAXݻwKTTUt,Xڵ-cCƂY1  8.AM&'OWYf2tPi߾xyy9&yD=<@jD/B6l s1 Vӧ?>H6lh2vYrȑ2 V@@@@TȘ1.\Xt3gR@p 䬐@nܸ!sb@@t@{5\X#@| ԩg͚  .&pU 1ׯ_/ݳ)P\9xQ{d(OOOD@iӦɠAL6mjyV}Cvڲm6zeG@@@@'?p2|p'-]C@qbƂ\Rt,mvRJ`D@@pn˗/K``xӟ9NgDǞ8Ԏ;JtGx葔(QB~9rD*Tݢ @ܽ{W.]j构ITTTO^ڶmk2nݚ9)qt8G۷'8K@@G͚5sN@gF^[nI>  ` `E@@@l DDDḢٲe]hA@@\KâmgINω7 '%Kt-$z 8@ddTXQN:ezh{W.O6W_}p@@@@[ $$|nOeȑaz  =zԌ[b޽X 2t,nŋwT@@@@I:tԩKX)ҷo_8p.]:)p* &MdN?:ŋe޼y&(_?ɓGv*={u?1     4HMfZo>Qf" G@q88@@@@X2sLӃ С# $Fɓ'yfY|Ytܹs6/˗/J۶me˖%KD@pEInLkժeq??ԫWO"""m۶ɲeLgl3cZh!2eYL@@@t̘1CO.XQqҮ];r z?RJ;]jU @r 9sʕ+VW^yEz!/y2@@@@W`6!      Xׯ]… @@ Qnݒ5k֘k׮۷oۼrf- XvmqwwYL@@իˁLC̄ d\ܹRpg^G@@@@p>#G~i2m4$=B@>|(:@/\Rnܸa*U23t,X:uL D@@p OESLիWN ~^}}Z`2tPۛ\tHe}5(qO5j0u& c@@@@;5k״J#_bg-9 $J@b    c]&2eWJ̙4@@YX_ܲe_.]:iڴŋ_c@@' 1ڭ *Ç[6wM*@@@@@u.^(E5ŋN) i$.V2׭[N}H```4" @@@/@ӤIӨ˲e쫁@@ A]\k˖-N.\`lҥE/Aw<<c@@@4_?ܹs' f5%!.5m߾]ׯ$H3SN svʕK:wl2i7772d    ۷%G͛77kݹ &@ d"@@@@t1Eo&ӧ+WHe4@@eݺu&U͛Vt2tڵEmk *X!@@tQP0sL۷o@˻k,XP8 KԵB@@@@EtrY(v @R_ĉ?)SFVn]eT"@@pMp;w x!+ˋ_ݻ͛<@pptt[6o+ݻw-WZXbҭ[7޽TV<    #%KcǎM  +@ 6@@@@ ׿7|c(}IF@@kdʕ& ѣGs1;TYff- ?S|E@@J`ҰaC_dI9yxzzZ-[6\˖-eڵ(      PBr%'%B@ \zUe˖n  rIxQ/۷ϦHB}&bӦM|bSL@@ٳGԩcOt%Ry&`l޼Yt    8@ dǎ <#GLE c'www߫xcǎRhE8F@@pq <l/ 'zHcbxE?im:w@I@MƍdY`Y?***NܤaÆҽ{w=OH>SS^9mΜ9}=@@@@@1Zn-k׮5}A|i5 @ ;v|VwҥK3@Ve@@@@`ǎ(-;wѿ-}||LŶmۊW @{:ueʔ'N{p@n.]d4(})͛77A%[lVe@@@@x>~ϲj+@p01: Fs@@@@D lݺ,蠅5OPPP  @eΝ W.;v4[m!@@?+~Qprɐ!C}4kLlbD]K!@@@@p\]SڃsIb3@d8{,\Pt#GXը7j_ԩϟߪ    h0ٳgEkO:eRlYӧt' .(,[\8m44p \;f<'ӦM֭1cF2d    $^o|۷K1%@1@+@@@@tse׮]̙3'M @pQ}K,Kn%m@ŋ*C  )!{Aq믿?ժUׯkƏ/ÇOD@@@@8pL>4\MUX:A@:7wmUkР   *C   &(\``_^tR5kVe~ߙϱI\*Uhٳg%]tI v/p!޽f_ګkmVv*Z HB@@@HQdȑ梕+W_*4 i/3@ @@@@[@zÇeҹs ! .#Sټy $W\껗4i_g-+!2@@RCO>˗EEƌ# 3&օ YfAѺ(;c^z    8@l,se@]͛tRsXXUp 777_%bB!  <޽{e̙IlڴW:u$2e}}xN?܌z-0>#!.PJMܹӼxb|i3>iۛ-[w@@@F gΜr@\@v<@@@@yt2bԤ Dy%@\U 22R~|188X]fE!C1۶m+X&@@T 33$־_~)f̈́A9@@@@p]2&ݽ{7f 8ÇeŊ2o}xV@8w̟?T;wn; 8ÇMŋSHڵ XF d    Ѳyf|qɒ%b}FI~̼,Y)(.3f0w9~Z ލ@]S|||̦sg֯_/qf>_wL6lyN:97e!   @d̘rZA@HmE@@@(СCQ/AbL" @@i>}*aaaf2MPP\~ݪ:Lnݺ(bU @@L`ȑ&ظ._Ȱa$C ne%"%:\ӛo)u֕U& "    d͚H[ [N \tI,X s̑CY8{ ={ƍU2@@@P'OsΕ[,YRzeRJY'RF`ĉS$W\)s#jEp8///iӦ"""dڵf+޽{?׮] ب[|Dܹ@:@@@@W ];>#!߅+@@@@ G$O0{+@@@@+UVI۶mMF%|]  ,3l2 6t֭[;/A˱   7d…&={@g.:6wҰaCd @ @ŋ7=<<̙3 /M@4x5kdѢE1]_Yf-@@@@W駟zꦻÆ 'J' ,&@@@)<.]jm۶M4h`  3 DGGˎ; ̙3t,B[8F@pTÇKժUE *$gϞ';?6)jFMݻw' #    IӦMMG!cƌ2@b 踰Yfaoߎuvիg/기ܹs['@@@q!!!&~}IOOO1۵k';*0yd:tgndzn Q1~&89sKΝy.]:8=@@@@@RBS_~2cƌ?()@R`]6F!   $ ĸ|r1&,! = Of"… … VM͘1iFtbfʔɪ   8@ʕ_~iӦ_$uK'^zIt[]I&2x$Ca@@@@OYZv]>; أ3gӧXdIgϞRT)d    Ѳ}v7o#n&{-˗< QQQ2vXMy>; $V@r4իeɒ%&0{L57o4Cgٳg `sO>    0&_LzQ._@p(vX@@@@$ Kdd-[VN<) 8SLP c'C ҪU+ڵI,Yk@@8p -ZTΜ9#\1)((H:ud.g]vIժUZ @@@@@rʙV,(igM9 ..ˌ3$44TtI }F[#   `8z̟?`X&@@@p ˗/KM͘Mj>ME@@o@@@@6m*aaaǎ˻@"  dѢE&%-[nݺIv$[lVe@@@ڷo/+V0ݜ4i 2乺˷~k-[8.I.B@@@@~.]$E1 ԩYX~ZGK@\Y2}t͛q(4آ+SLqs   @`?eΜwի4o\@Ac H @DD_|vsqnݺeu\u9OgnU @@@@Qtf\Ls}}}%$$QN;@ c_@@@@g7n曦cƌ#F8sw 8km6c-ݻw88@@@4`b͚5M/.O ZcELg.g'#     ܹsDz(d˖-eݺuv: jo6?iF+~*]Gz-Ŋc@@@}d|qGSZh!=z`$_ c5U\Y:de N%h6nh-/_.V9/ ؾ}{ɟ?U2@@@@{u̙4@J6@? p @@@p_UJ(aSn]ٹs  kٳgzꢋi,[lV@@@@ **J6o,7qtlٲ&b={c@@= N$o>7o,X@\bճbŊŵ^yX鐁  @Zu֙f͒޽{'\g^uoM)],Y<*N#    = ˗O]f!?s=66!8ȘIB" %:{ ]W]kH.EHB-o}wv0=)a̝s1*@@@@X~<3o:tٳge? #GLE x$ٲe ӵkWS$  XvԮ]\XT)ٻw#Eqk֬i0j(]?ϓ@@@@@ .,ǎp\tIҦMN]/  cQQQ&8iD$&&:C#-[0M.yv@@@֭+W6/۶m+4zJD?k҅su\    x@rdϞ=1cFvgu" 0a̙3Gbbb+W.ٳ_-p@@@TΔ>}zi޼tYZj%AAAw^>x1c_7#6l7΃GC@|Q@&(fAo֬ ʨg˖-5@@@@\)@ FWR7 @* 1i@@@p nݺɌ3L_V\)w~ @}@dҥGuDh:H,Yγ  )*U͛STܹsgwD4ڴiN^    +Pzuso?مS7 7nܐ3gJxxڵ+pt / m۶t%9@@@8v̚5`ܱcG4iHƍM{N2gΜ I…Ӣ_:t{ \xQ~g|/"I(nڵMP6mHB\@@@@/_9rj[h! .tvԇ jaG@@@I@<ܹ?t@b;w_-|?>HK.-ݻw]J  8Orʲm6SêD)}С矛*/.[n3J^    (аaCYriQgeȐ![)@o8x6Ģ3gNѣ_$   hmΜ9&ƍOaSyFC`\}Q5Զm[7o׌  AyQ,X 1j ʨ@@@@W;wNk枼+@ Ę 4   +W$W\/%JM xN9sL6Mvڕd7y# @@p.VԱcGSzdժU)j+66Vj֬i0jE9_?!!    gnZ~g .ysz 䧟~pYbEԨQC,$#000y   |qٲ~zILLLQzu|SN_\JUʖ-[V^-kq2(@n߾m>kPFg(g} HPPPq@@@xXcǎI…X/a@M&o@@@@RMnݺhɗEMi@_ ..N,X SNŋŴZje/6o\ҤIc2  >]ti9xiM0EpS9"*U(Se)"    @* tE[ѣGPB2 xKdĉ :ua2do`P9v@@@|[@CΝ;W||&bΝW\ [Njժet~֭[}X#M@F ʸiӦdkF-[|E@@@' ]DS޽eN@H٬l*4   >k ĸpByݧs@#İale  @RD>s9e\bhszbŊҪU+J* T@@@$>}z@KOY@@@@ ۷O$MM6%K>^ +aԚ:ul߾= DL=z.EB@@Eʉ'LtwP;M=q֭,bU*@@@@@/ lڴIU@䧟~O>D~7E}5cƍYA@@@w49sdٲqd/-[_ԩ|w0r8~ޓʛ7~ڴi,}@|N͛|rY`,\PΜ9O3Ab\ +~֭MNLLm۶q֭Ν)S(Փ-[JfͤXb8@@@@!t]b+>%@s<:M@@@@R&п4idɒ%ҴiӔUȫ@@t!-}B0:u*xU&={^t-  @ttY…  E'O+JDDkر/^*@@@@@;o.\(-ZpMCԊ ?X+qCK*%CݻKpp9v@@@|O`Ν&`ܵkW%JH"*puɟ?DEE.ss  GٳkP˗'}zyHH ȨA4h ܑ   =VZ}7@OzL@@@@R. ĘrGj@@bcce_.'O֭ XLs   ɰa^e)xdҲeKԨQCj֬⺩@@@@/`5"ڵkE?ܾ}M???4nXt   }q&>stȑd!ʗ/o Xxd  pԩSMF=-N!@H^ o޼ҷo_cbbdժU?Ǐnr``Ԯ]fʕ+o@6)    35xF 5~Yq\A@@@@TTy >>^J,)ۥG@ػwL4 O@xbYd]Vbcc}>K԰aCiԨ*T(8   '_ȀN*={A2"@oʸ3>@@@@ ,YH ,̕B@_q̚5KKٰaCaH޽ZyMr   z_~2n8?\z- _^~W9uꔄER?     smݼyV W^5s>S3~7/Yf?E@@@G9b/j~-`-iӦzmڴ'|Gt&B` '+@'ʖ-+G!ׯ_+Wرc6/w}gԵ4(wnݺOخ   %iPlle  x=ݢ    5kf1jK.]( 'k./dƌk٧KvO>! ???Ӕ@@@K &}Ixx+!C. @[X;w܇|w7LqT    x ULM n'pYOd„ ?M_N: !  @llyxɒ%pBٷo_Ϙ14i_|g%k֬^A@at b" |֭Mj<(˖-+VȯÇECx& eԜ?~sA@@@ 翇@@/? @@@@غuTR m۶2oݻ4(30ч5j$ /4h    *xbiѢ[o%?# w?dر2m4]'-[ÇKm)   xCdҥWZ%7nHvЅ  ^z.]d  Ǐ3X:;vL:^  l޼e\|lذ7;,RԩSGyY*UJw' ۷o˭[DD׬E[O65ۼ@@߿L4ɌcΝ@0bw"   HLLeɒE('?E@@@4Nѹz+V-[HBBB̛74iD5kfٳgO:"/.]tɓ'%wn@@ (mƍZwKiҤe˚jժA5; S@~Epgt+GDDn/_lדOJ|B @_b  n,ШQ#{vQkr &@ F{.    TJze?!ߝZ?! 8vL0A&Ol&4$((Tyz(#   bK 64+W6.9CXY E}We̘1l@@@@@v-'>B-@q ܾ}[Ν+G;v8tG}|饗d)S&s   x@||g^\~]hZjIӦMMEwH0 $ZziܵkW1c'u" Ly֭;4 Ȑ!TTgR)+VL:N" DFFʹs?V`u*߸qzWE.'ӧ7[-߹04ݲxMLLeXѿ[V&،㬤CBBH"\xq)UpV[ԃ  "۶m3 ^  ~h@@@xN .Sk֬yݡm@HN^tˢEΉeʔ ح[7ɚ5k [    >Ic_SqFSk???知e˖Nm@@@@@:$0>}U U@m|72f9pC_J,)#F0uJ   ܺuK6m$W6Y+hBٲeAҸqc37P@-PZ5ټy^# # >|f+ M/_^*Vh˺&B``=_I|Y͛&X|Y} h_N41{&g˖M4%3g,YdqL21cFѬ== xUK.l_c}i>oB IҥEYY4jJ  !SOɓ'%o޼r̙h6@p-J}    i˗D%OE@SNNj>`tˠAD/@@@{ ̚5K:wl.i֬,^^?ҹ?X f^]n۶M ,Hu"@@@@H./_>S13gN+@ Ęyc;v̡=]^6mڈ.HB@@|(ٸq-.wK  1Ool7o= 5Pe@s   \t|s-Z &w@pw1;D@@@@W ̟?_ڶmk6l7MR? @@'Zϝ;W>S0}U:iV4hjՊ 8@@@Ƌ/hׯY_FEEIʕEԤc\    u*ի'Vrfԅ $]QO}@o<3)#  x@ddh M66n(/_g+f/jEͅ DI@oϟ_bbb$Gr)I>;u  @* 3F;vf$66z.]:)Z N/.!!!X޼y.Basl Ǭns}3g,oZ+j/[tAJq#Nw^[w7nܳ=駟u\F <{  ={\rfO>_b ' 5   8Sʕ+3gNIHH0?~ڵ˙S 8Iŋ2i$-Ov5k֬ҳgO8py0$;   C \v,lrU݉'=ć澗5k֔hs̙3K.}     t6]MEI #p~~~Ү];yץRJaz   pO]@۶myfٲe:t螯I&TPAt1Zj\xرceĈ׿C  x?L2 Y=zTn߾-fȐA)b2jpFľ`&?p]\… fe\[u4pUVE+آn&xۿ=;wwZ XNsuw8  /ҤIo;  (@ FO|3    l]87į@B@@%/˸qLu:QZ'L"M:Uzm6m$eʔqESԉ    y*` @ h?\tQ[sRJَS@@@p?Hٱc-oݺ,!sիK͚5ME]@ #xt%JJ~~~rA)VأW+@@gn޼)pYB6>J`9r؂2jp H|L~'Es}z5x\tlAsll>}@E_%!qqq&0͛ͳWÇonݺҼysiѢ/^r@@7M&=z09MF bw#   EGm9stR <@BB&5kjVZ_WiР9v@@@g ;vL-*D<~MY;ӷo_HK.2j(0r@@@tq={޽{V7nܷiJrLE ˔)Cqx?/}ҬYSN4<Ƃ n&AO:e39rĬA4_JdΜYg.Qe ̧5gɒ%I988X4П7D6ߗ]&Vu5W\(VY/jEUIgʕX>Ȧ\Eiϟ7Au]ŋ'Yj(((H7n,D$@@q 3gΘ@e&1{?s~VY^uʾlݫ{IVYc}-:;w{enݺeǦe4kYJͤ&9s4Y?ojY9wܶ斺fh"q͚5L&M؂2jX  omVϟoߋ> @ it@@@p@ӦMeٲen}0x.iJ@@7nqɼyuNn֬ >\5jdf  @ժUmW^m 芎ҦMmڴi_5k)D@@@@;ʖ-+{3ʵk8. +tqéSom %@H*.^hX_pՀ>QQQ&8ڝ[ {[{.ί[+gʔI4U`pu*BZ֭AB4ĉ'öl^ pA(R=rق..\`5 Scǎ#F19R}?E@݋:ߛ}?\|dIzt A={vr9άA .VXa3.\j je|};a@@{*T ;w-' @ it@@@p| p4hKڡR@|]@'& 8t!nݺɰaäTRA@@̙3%,,4ݮ];;wK˘1cLm۶Iܹ]&#    HժUe˖-&MѠ$@ 2 歷 a%???ԩ9^D 0[@@gt'OhM={ֶ}ddx@5Q3ޙfj;fuke^ !&;vpQ/ (`.)Sl5>çO [ $&&?M?C-V}3  3sիWM@F+8+W̱(7n7o:l{3u|n9888Iz)SL&[e랔='5=x8[~z={̙3GN> 2HgϞR~}].E@@h>O~޿'! b7n#   Nؾ}TTԛ ;}T DGGW_}%~yh۾y%gΜ(#  U@-T9sFt58]paInܸZʴѠAYlieR1    HڵeڵFB y$@ o8p֭[o-A@I &&̥׀;uA."J,Mwsw= G[ۗ6mZXڗcM]>\fk_c>oݺe۪>YV~Yjۏ+3Z͖-[k$V@V6]$^ _o-(^,Y ӠaZcL h:?Xkjذ,_*U   =$nk;Iwu^ge{Pֽ۷o[){[ne=.]:qu-}3 ;oņ lAO:di=2j  ={v3]C ! b7n#   NЉ0r咈/]d&9!*D@._,gŋF_\96ltEX4@@p#ѣGoaz4|p`ޕݻpTX,ﺲIF@@@@4i"qv V( NE_yټyCwޑU:g@dˮ]Li+n5 .()SL'Oɝ;mk_ RuQ~^Y3VY[-ߙD 2.o1K,}lղ}#{Zi}F\2tGMo&$$$I`Y}y @RΝ;ˬỶ^:v"   rڴiS   Sʲe$!!9r8pp@@7ooS紾ng: ]f #   @zlWZE F7@R. g}ߋ R@@t`Xu-   0?ooF~?3Kn޽lݺU .v@@@@_h4H )8z5J["˗1cHSF@RY ..Zܴihyt3.e͚U/.Ŋ3[Ѳevr1KN4Hݣ zW^5u1@ REi}jFk*r``XYXej*}q$.nek_ EGG|MV7nܐׯl_hzU95iOڶV0W H #0}tQ^>o =A@@*ugΜnAM{uvڴi#C]ǎ  :JaIETL Ko@@@@ ݻWʖ-k*mݺm@buѣeѢEԇc*T;   yUT1ݭPl߾=U͙h@IDAT3ǴUR%^ §J'h@@@@̘֭1ÌСCf .^(o|]tU05" N8v h^ܶmܺu뾭ɓGBCCM.S-o\ A4Ve}u\zZA24iҘQC):^3Ǜ'VE+s6Yh}m޼yME IB,rɞ={L۳F@o@@@, 6e֬Ys#~Ӏ:?B!! !C$<[t\~ηcbbR݌.%K9sfjl${kX{= ]l"UV5kժ%k֬뵜@@@ ._|!&L3g8t\5ALB@p?ƍM.]z#@ [q%    :uٳgnݺU*Ug <@bb̟?`^ڧ ʈ#wd2   ӧOݻ1tEfΜ*Eߟ~iyioԩҳgTiF@@@@!CHxx.s}]g  ]rY[3fÇ7ɔ)8@@];f.\lO>}Ϯ+V95"II/HHH0uhlu9::ږoݺP@常8[6;nL&kkO Y_iӦ@y x688Xf~рiҤe@AdL֭[008`3"o޼A@x SNIΜ9ŋ3 @Ę2?^   x>Ġ3h;v7HF # Nƌ#sdɒ+HXX;Ȱ  " Dj@ o8qBɓ*Û1ctʹ{_^*T*m     sǍgaլY@ ,_̵޵k `ҿ1~G5N@@DD,]T3̪UD1-i05^XzutZj={]q@@*5ƕ+WLsΙw}'@@@}ȑ#NתUK-Z$۶m3   x$ /T,O?iѣu@    \>.zEBH*pE4hcUV5kȜ9s$$$:@Hul2%RJy7eÆ ψw o-֭HYd+RZ5ܐT " xR޽"[@@@/(X|ς3g6#3fHٲeE9q℗K0<@@=c=#z pp^\   @:u8\"v13H@tI&}5:5իW7onf  SO=%>SLqK,`+W.E䭷Ji@@@@ooV"%?[n{'EKBB9̜9S6m$jՂ @x,2w\y%gΜҴiS̙3G)V}flŊ2j(YMZv@@pɓ'e妪]3@@@ȓ'sqqyo}{1eϰaŋ4* x==d bt`@@@@?V F@S$@|E 66V&N(Ŋ˱clCoҤ[N~P@@@_2dmrj/}d$!    @mFA0AJ,)\zՈdʔIF-.]R  @ h~_̝;ţ>hgҧO/Z &ȉ'dKz;`v@@|J믿۷o1ٓh>3X@@@Q k֬2j(рd˖\s>c r5  y$@<]@@@@@uֵo@Vx/@ F'    Tlٲ-[6sb͚5I/ ^"Q̜9SJ*%}'NF֢E ٴi,^XWn;N@@u???ׯa@&MJu#FHi߾DGGz?h@@@@o R*; :T*T VU״iSٵkL0> X`2rHyꩧQFlt1b+ȑ_2m43"88غ-  .k>|ش۰aC!8x4  @֬Ye%mڴ.]Çh"C@@N>mk:K,һwoYt;wN&Nh4Iv @@3lV   Ojws @@@w(\L>]m&:@e˖#FիWݵ @(;wK F@ t@@@pD5kָE@ 4bZEfҥp5dŊrJYu-   }gbĉrjJ*%SL5K/ƍm@@@@@`N\%p)ܹԭ[WEe$,,L<(}3@pk׮%44Tj׮muOFٳgeҡC>t(  Ɉ4]k۶dȐI@@@P@o2k,yꩧLdرRxq:u$&&a  9;vu@6  .@ F>    *J*jXv^@\.w^iӦ ¨[p_^4h`f   ]*$$\|r9zҹuQ^~eSill !    bbb| |] >>^>C)UY G:ozOZ" .ؿ 4|ݻmdϞ]*ݖ-[uz  '̜9Ͱ0[   *ЩS'9p K޽B{Ъ@@;wڎFA@o G@@@\%&M^r)W5E D@ۥ'~ֆ.5w\ E-l)   <ϼ(11QˇW{Rn]S~ܹ$$$8B@@@@/C YF*V(DܹԬYSB@,+.]*͛72emIgyFf̘!gΜO?̅wr@@ \zU,X`ȓ'4jȥQ9   h~رmׯ7s?\ll8@@1(P@g`/*@\@n=@@@@q ԪUּ.:BB@"##eȑRX1:u-F|bYwvډ !!  LgϞ6mZS~OY4iȬY'45ZJ^{G!    {ҥ ũl@.\ F:udϞ=fd2h 9xGt B &&F&Md/6kL,Y"QSƌeܭ]Vv*u"  r9sȭ[L;_$ m   w ,XP{Yr(Q V總[R|yw 0:@@yǏ+W  @oioy'    @ / @w)Ǝ+E>^֬Yߗ?,Ń{.7@@4 &32dHڄb5jG/RtIgf#@T%KOm6{ٓK-Cg1́7 @@ qQVVӟ @;SN:5j&LgJ ګX7ӧgt) @ #JKKnVoѦM^x!:(//_E @ @4b,‹d*pǎ;\sM.'On)6mZ+Nŋnꪫ⫯J'xb :Tg&@ P~{6F @Hf͚q)?fII/4iRO@ 3gL)br- @Ј`.B @ @U#gkĘQ @8UV1rȬF֭c̘1cE۶m); @ @xFۈ#*jڠAb7Ns=zt 611 @ @\Ј1ׯOK,:( ovzlÇ9sDn^'@~zh"m|t侅3<3-Z_xp' @#W^y%͛fܹs~({ @ @@> ?z(np RxիW}ٱbŊ|.O @JxO>IK>˷ @BЈZ @ @U #1V!  @`㎴㥗^_uz^&M+,X}]H @+,(ؽ{t>fϞ]h.#G5q\>Z @ @/c_c(T[ѣGge&%83v~ @2E;n⪫I#CFW^mYeLg  @9/0jԨ,Ae @/#<25zNYVVW\qEny @*0cƌ,N:eFp@ @B-27oΐҤ g34WG='?Ig}v_BYf @ֻG9bĈ,`}K.$M!yh.yoWgJ&@ @ 1eA iح[8>KtM㮻1cd@aLXmb`n^zi| 4s9'mxeEӦMW{L @(U18JR @[oO.]6YСCL<9_~,>6hl @WCIqbŊM_* ~_~I @ @@hĘ+WB@ .vO?RF~/b 4huq  @`Eyohٲe}'& r)ǰabM6Y1H @P^}՘7o^ZNΝyR: @ @ j֬gyf̚5+ڶmVԩS̜93H;#E:Hnl @ @@n $?H|Gϙ[jrKСC'ș$B @ @ԩrN'z*ڴiW]uUu5͛]tQԫW  @`]-[w^n:l:;6vil @@1 tAΝc뭷.f @ @@ $Ͼ&+Ͱ$gL}Qf-- @@ L<9{Y, @"c\Iu @ @Pvicd;Tl&@b뮻bv?QZZ,L1iҤc7/6 @ @ oj֬GqD ڝwޙS??4=7̩%C @ @*1XR0/I it'kk׏Çǔ)SHto @(ުUKch#F3gf4N'@ P0Fj9CX@ @rM`6 &ą^ɳGvbڴi| @*Xѣ"Fs)B @Z]f<3Y, @k+ꫯF>}C͚6l0~ܹs{k; @ @?l;#s%o~}M㠃:Wғ @ @jhĸrjHe]scX`AqقxJX^z)z۾dɒtz9/ruQQFu¹ @ R`F,E @#4`袋bܸqѬYz+z\sM @*eeeY7<~U^ @Ј0* @ @U.ХKl3 @iii\~ѦM?~|6Bc…qgG~ً @֭[G۶m|-ZS'vmѢE4ٳgI'S9J @ @@uԭ[7V#7'}Yp >onذa\}SOeW+ @`]8{l8 }ذad @|#kܹs:uE @ @ z͋=3Ͳ$ ?bŊ9 @k.`Oc5 @ 4b̃$E @ @@.hĘ WA䁺CFhE%=qGH @ @@vawܑŹ4n8Fv75\+Ƀ @ @@ԩS'BRoRW i~;_y^)5j  @*.ĥ^-C=<@lv:  @@ss6pW @ oyL0!]"o1mV &MjЈ1 @@ hX`T9 @ @h֬Y$'۬Y2._{nn1g̚5k駟 .߿V @WCCFɕIr馛G2eJ @ @@ ԭ[7-yʕVz f*N=g}⭷JiԨQ/I4= P K.c9&zZZU~Ϗ>W * @@ <b @Zje]s 4H~駣cǎ1s|)C @+0yu3 FvAC @J.]嗱` P@I]w5 5e]" d @ @z}S{.rq;CNSKO_dI.*' @ @U.PNt"0cƌh׮]\}Q^^4EJ~p'F5V9ZHX7;3Zn#FٳgdkժUl  @qC=4}ۼy4ӷ~;zzkg.= @hظqHր @BЈ @ @U$еklgy& @8Sӛ _zu_gώN:}i @ @@vaY%wqGZp饗FsqNJ+r-M @ @rڵkshX& @k.}ݣQҐqQ, @@eɽ Ilr_}L8QӘ@6 @@Q <ڷosIA{SN-[B"@T~IC=48ٚ5ksO5*6lJ@ @I`1nܸ~]Sj%@ @HeI/_uM;vl3}^y @@ ڈbBQ= @ Јџ @ @Hni׮]z+j@(|yEǎ.Ҵ.]DSO5Z @,pae;, oR;bҤI @ @.PvĒB/U}T[o{W򗿌ddibqGZ!+S @*裏.{oVA矏>8' @ @`xXlYzb~<; @ @<8bΞ=;.\K z'NL)5kmڴB V{iF @N:̙3f @@^ Űa"ij>^ntߔ)Se˖yUd  @ @Ӵ+jԨQX"*B @ @,йs3fdS`ű{ǹIdKJ:sVZ j @H6h}c͛o3gyaÆE>}<HI& 5 @ @+)G@ ,[,=4hP|d[ou}7n<^ @@1 L0!+wY, @(c!^U5 @ @PSNӧOb}m۶MJO.aw.> @ @ |do;#Zh,xz#@ @ kЈ1 3gL!tMvX̟??cl PW]uUt5^zt ĵ^cƌM7ݴ20 @+0wXdIj,ڜm#@ @.'?-uŊqGoB/]} @@ hĘO 11 @ @-&l"̘11TO"/NҥKS͛ĉK.:u  @ @IsdˇFIoq$ÇOc"@ @ PQRRRe*(++aÆEnW_MgkԨQ|1rh8 @$ ޞ~,xl[椓N*&  @X/>h6O߾}X@ @ ]aÆ1z8䓳R/8#_F%diӦ)h"z\JO. @4btR @ @ _SNi~_  @ ?~o>l#ٿ{d @ @BI&{Ɨ_~9{rN;rKԨQ#sСctΒ#@ @ .kN_re  /;=ܨ{K.1o޼8#Ww @VK'mƘ1c}1uhٲj  @L`ܸq }b @(Zjş+gO4hP,_HIbŊi{ΓI^@#Ƶs& @ @h*1&3f(Z @nHz饗7`馛;ƍz  @ @` >/s=0`@\piq衇믿iˏ @ @Z ڈdp+|ߦMH"%[\ɓcK @2cذa,dɒtM74}uԩiA @駟N&Ϸfso  @ @@q򗿌#Gf{o߾w @rA bg}*B_  @@ hXVa @ @ЈlL\/#?>4Ŏ;ܹs@].@IDAT裏ŔD @9&44QFU>5bLo~p@ҥKlٲ{"@ @ PH1T '|2dH|o1qĸcտ[_Vf"@ U {ne&͟??~j"@ ?x\2e}͉$A @KC?ׯok⣏>K~4SN;/ @*c^Yu @ @P@#*54rL_[o5OSF-} @ rܹszHkϩגv[n:瞋>:s*O @ @XWUp'@^yڵk\s5YN!> @2fΜ۷cǦլY3m}T @ @o"yf͊={;S& '@_ 7'ْy+~Vd@N@#ƪ52 @ @`4ilMZߜ9s`kUY`ȑѱcxSF]wӟnݺLv @X :(;kYAƍ{.R# @ @ЈqH qѡC;wnQ~;6ڈ @Rnta͚5\5jԨԹ F @ T4bW^~ @ @FO>d4m4ڴigώAUWZ%@ @<8 Vq;ۙ9rdԬ.x衇r};.OI  @X[}e{)Sħ~CUy?K/M///?<^|j @ @*Svp1fVH>ܹs\ޣ:*{wyl PN׿5SO'[l @ P>h6ɾ @ @Zٖ-[;zw]/2" @zXlY=:tO?t:l[o*V}Rs @7n\b>}X@ @|#мylW"u@D_1&M-2' @ @%Pnݻw:￟.XYcqf{N:W^yez;  @ @4Zjecf3fLt!Ν4l0n"YFLe˖ŀbذaٰ'tR?>4i @ &NM4K @ @YcrMi3$# @9sfɺn g @<Ј1/  @ @"ne̚5+ q'n4ٚ5kF0o[ԫW/ ! @@߾}ǎ3,?>O}/ @ @ Ok-))b%PVV~p'ŷj*'?IqaX/K,=z<Η7^{m>e$c @E'iĘQ @ @x;Ǿ{i3ƅ s@XS?;eY, @ c1\e5 @ @HC1f믿]v4hsOy9  @ @ o|oĘrI'˗GrCo( @ @ /jR---b#D>}w]80fΜ;S@Xo ,Ν;ܹs97n#g @)<_ի kT @jƍ㣢c\m;EU'@D i\y=&MI$@Јџ @ @hРA?|,_|r"T@@^{|A:;ӧOnЫ @ @!ЧO4(//'=K=nmZKqu) @ @Ϲ*ҊW@k=zdM6|38W" P_}/>t.]M[jU阓 @2eJʞ{ @ @`f=Xt!=N1.Ydr4 @[F0`@  @@hX,WZ @ @*cʕ1*Ű I3}ƲeҡަN͛7_סO @X`ydz8M6$|` 2F]vY>$w @ @"UVVqIII (\˗1C ^dٳg̝;7w^V.(N8ᄨx1px'iӦ՚  @W9Ԋg @ @hbܸq;>ć~v: Vmxr!@E'c]r @ @*Wcǎـgbu]+VI 0 }p s'I @ @@Q t-ի\(bvyۢFimw^3& @ @@ Ԯ];K4o=z#FduY|n馛f @Hgx&e}Q~l @6mZL&MUVL @ @@ l&1a„~ .\}O?4O+6 P/3gio>7o^)w;  @ @%СC 3 rF.K(++Ks:bԨQYIT" @ PT]vMk~{߿Kz?O"yF @ @ jժcF! PSN;ƌ36l6@cտ xE @"W_]w]:5C\q6 @rO_?0MlwϽeD @T`7O1nVis̉~ŗ_~IN?~Y, @$c1]m @ @@m۶ق+1V!  _|qWF:thp  @ P {w6?Ņwy1xഔ?<8Xti! @ @]vV]III (,ѫWxw¶vۘ6mZr!Uj @OG?Q<iNu֍#Gi39J @:uj[nY, @ @]`m{,6m6eʔH'Xb7 PT{oVFL@#"%@ @T@cwL}c= @`-~_GOvWe]V @ @k,'x" %馛}i9Z 4(,^_(WW @ @UVVXiii ( dO<1N:XreZT޽c֬YѦM(R @@ {Fplm#ġsJ @6mZC#ƌB@ @*M`vGƍ18=*@ @}ݘ4iRZgN;T5+|Fߦb @ @ t!=>Yekt  @.⋳/}/ @ @ ЩShԨQJ!6b_~<馛5>qg @ @|@͚mڴmÇUB@/ݺuW^y%ͫy1eʔH @ _|Evoo6m^z  @ @@ t5YԿ/T%m @`=u],1f(B+ @ P۷φ3gN  @` \r%1lذt5j5\C YI @^{=iҤ,. y.yb;cJ @ @ gVmVVV3yIHWٳg  ~ӟ$@G=b;CL:5~3L @@̞=;*~WnJZ @ @+лw1bD$F%\7tS֫0 @`z뭘6mZ:.[^A@T@# ;cɱV[U\$@ @fΜ cF! @ @U*sWdsp g  @ }Q^^l$  @` z__لÇO<1^@ @rU]v|lSL4+%>}c% NW!@ @ P1V1T@xC7*w\L0!6mZ ʀ(XiӦ{qZcnbĉѤIYa @ U`ƌYi1f @ Pgyf~<%%%1hР9sfk @ ,i3 FEzM @lۧCX"{x >`{قY\pAv#wb7 @:uDN|xXdIVى$'7稇vXUT#@ @ V1;={L?NYf\yq 7D򙼍 PUO>d'>t^zŸqb 7)K @@ ̙3'aÆѺu* @ @>|xT4S/o߾ꫯ|OEfz-Z(b  @}~ @ @hĘU`Eek n)S7̕r)q ^!@ @9(Э[,Sfq!mQt~aCë+&@ @.йs,ř3gfq!{g\s5Y?cҤI @ @!cu 6,_~e:Xnbƌ;F @ c~& {'իo @.0,Ŷmf @XmQ<#Ѽyt䞠>:o"f#@rJ`l{l6i_ @4b,櫯v @ @@% lᆱۧ#&WV"@ +VA/r+Y,kԨQQvC|%@ @y%G-ҜΝ[4-qiu\2}յ, @ @@a Ԭ#eeeUj@III$5{jGqD<ѴiXI @@. L81 wuWԩS'Ҕ  @k!j#6mڬN!@ @*K`-1cDF! +kx @y(p뭷fYyY, @,SqŬv @ @Jh׮]:Η_~/RigN8!ztfmcǎ @n햦|s)kW^?s>t>lp0 @ @Xciiie k@?~ 7ܐ^F6lXr-Q^*ѐ @oٓE'[҄1YUoD @Y`i玻K>"w @ P;3jժ6nM @ ȑ#ӓ֭ ZM T@#"@ @T@iΝ?Oq75h zh޼y n @ PfΜYߩޒvqt ": @ @4%% 4M~;c7n\`x1s̈́eE36l @/erqŴiӲ @@qL0!,Yۯ_x㍋pU @ 2 @ @ k.;X#ƌB@JHnz;3nرc @@6bLنn=P4i$>hy|9N @ 5k~ȩFyz] ,.]Z7dxcРA_  @3gNᄆlٲ4d1QFE:u?9 @ P)n|'X;Si @ @rN=|8cѢE3Q @[<8, @b橸bP? @ @: hĸ΄ @ {q!ʕ+:8X;  @ @@> $-V,>o޼|,arn{uO\wu4  @ @@gty1 T{xt>Mݺu@s=?яO?M-g{4a,? @ M^JjժU  @ @#]]}ѯ_r#9Y @U*lٲ=zt:ot> @|Ј1\  @ @9.ЬYb-,ΝJ!PRR%K + ˒ @@Æ #Y0:ْq=zĵ^ 2$&N}/ @ @ Pjʦ(--b/p7F߾}?OҥK<ѲeON @@ ѻw裏ZoQ^] @M_JaX@ @@ڵcԨQѺu4 ƠA=q}dAR/""YnݺU9  @@^ hĘWK @ @h߾}oF',CE]O=TV[mwyg]/= @ mڴIMn~WB:c3<3-iʕ1pxW D @ @@͚w}#ul2ƍ7.u @(JEuo&c#@ @rW{qUWe {챱p{ P8#F֥<ꨣ 0 @JЈ C @ I @@vio+>( @ @ G*&^5z(6m^{,N9r"@ @(UJY wK.޽{رcիF!C]-&@S믿8 fϞV[E{f͚gA&@ @wRTg](+*(`Ԙ`Q%jb ck FwQ1)ν?gr;nyy9s;ww;3_*++CkQ}t"@ @Wp@ķ~ , @@o$x潿t2 Xz @ @Ykfܹs?OM>n{.]-otWq#@ @$oo&~BK{IMp%e. @ @( <|IO~$xNc=v} Ȭ @@ ,\09O?+&EW_}0 @rOB 1۳/_ @(f:'Ia„ +tNTxꩧ|qCݫP1@ @ s~%cN4)|9߀(e:vai?v @ P&뮻n;*++K8[#F?p5 @ @R@!\j@^{пo$;w-3&lV  @F ~K^n£>_Ff7 @I sB̉ @]`e ~{СCBqUWxYOJFOs9Ӷ BYh @ @H`7NGzWӶ-pꩧO?4.8 @ @%"yٳ\"Y-]o83A***>,ݠ&@ @ P@-ҵ( M'sυI&%3;6ӧ0 Po]w]жmpM6٤] @(1_Y' @l.4;,L6-}AW_}$]]wݵ85ȳBy6< @ @뗦)xWW_رc>|x@ @JI`Ky뭷v7<̤ctoÔ)SʝE @ @9hKN+++s<Io}7J 3yMb @箟}бH-f|LeL @ T`idL)4 @ @@z1>,uQE@  @n0gΜd~ڴiS}Gk  @@ |wU\CH @ @ wم_} l$@yG***,8㌰jpR#@ @K :{/mkp 7'F7c,h!@ @ +BsXr5q^ছn {={vaaaW~k  @y{s3C_za< @22eJ骫5 @ @>|xXaG ^ @#FH|i[X\@!=<"@ @ȁ@^B۶mb!( G^x!ɵwc-%I @XcG}5Bh׮]Zkp+a} n @ @ȕB4 \ve᠃ .Lv:thre]~Eȁ@<}}I|I'>:# @b.ĸ+[%@ @ t-\~QGfΜ> @G S"sOG!BT/c. @ @,@6mB,"7|3̙3g)F+J_/ '|rW^Zn> @ @"c+|ХKc,x 'Ծ @ @)c=t#s9's12c rKZ @M%ٳg'S~OSSMo @ L SEA!{rC @ >&{|'Oo޺ @"pק|i[XR@!%M!@ @ȁ@~Q.\&N A6lXڪt @E{UVI?i 6F [N.pז/  @ @r&c( DV;nqK.  @@S L6-N/Hfmˆ#jz @ PSNMZa  @W^ڷo„ 걗. @@̜93Mرc2dH& P 1"( @ @@ d 1L^}OHȓoްSN /L%@ @/ bq裏 ?fpm W]uU:Gx @ @dh!@{u衇/8b3 ׭[Ν;jx @ PB+Bf l @ @ [w]ѣGj{ެM5\F_:mk @ |wU\ۭ%@ @ (~)ĘRh @`1^z)u]ɺx>z @ @rXeUcƩS#As>n>}z4hP/꽿 @ @ 1,F`wwqG2`6mȑ#A Bhgnd;z( AW @JQ`֬YaܹIj 3,' @(Gvڅ;/MNOk @)χq%?}-@EE H@!z2B @(%xk4~PYYYJɅ96lX:iڷo> @ @*)˕^yvmaM6Ig?Y3gN׉ @ @@@-҇K)4,7|~dxc @bguVk{s|7f( @ Pb_}UB) @(z!C6, ^{m$ PW_}u5 @b @ @ׯ_2B￿ٝ%SO'x"Ij rHi%( @ HסCݻ';> n0G  @ @BX21}>@IDAT2~hoƌ ҩSc%?=  @K>蠃ҝ/0hР @-ߦ 1 @ @Zh.4s9'dn @ B/ wyg{D\ @.Uq @ @N S1ꫯ]&@@> g6mڤ5 @ @@9 t5Mo֨Y[n ;vL:~SOy[ @ @T#oY***2M? hi¶n^xdW\17n\ @@ <#_W°F޻IO @R.]ӧm#G ZJ: #F}'[  @ @d dbڢI@CNf/'JI F_ @@N,MƋŢʜm @JG :* @ 8C֭_|qo2$@ D ?|$xn~L @b,H @ @.ꫯm'@@;tȳ:+lD @^sΩ3ҶF ^zi׿ux @ @j> P@,p[q%=u~ְ @ ě ǏO&Yo¨Qof# @ Plم۶m[l዗ @CgϞa}MzM6-\yua3 O g @ P2,n5kV֨@_װ';.a̙DO @ @+eLO裏"NsJ0Ɵ @@sL81~!S`OS8p`sbN @PuE  @ @xiK.$8W0 @*p嗧GydhժUcr Pl]Wl @ @(ƩcJA@ /I}QG m @Um۶ m o><!sW_}5a… Ho @ @hѢEk`KBj>[?پ&E{Qm+  @6mZ~fΜLN8! @pn =R!@ @U6h;&k9Ow}w @M-7߄o1CCiG^@!Ƣ %@ @(l}*ĘRh P3f7tS.=2T2 @[M6i'7rI)ڵkx +##$)1%/3t- 8aÆ'|2yUVIV24n0{ @ PVvpnY=%@ @2nB^nj&NX R&@!ۿ+`>购A_@![I @ ۇ={&{ka.(~X ~ᙦ @ @@/\V#[o1dn';1Cه @ @2+ᔥFQ'ON0~lARhVjxv"@B \pA2T۶m]wwA @@,i 1 @ @d84*mk @M+#~;tm {nFJD@!y"A @(d}&͝;7[ cdž &$coa 7<%@ @ `4xsHKn{p&ś!~ga!@ @ .ĘY' L2%){%0z+/# @@ p@:^> @ @@]:tH̚5+mk @ @)~;&vm<ˊ _.K\sMaI˰N;B @ @@!F>[otZ{SO=V]u՚w {n;vl2Sr7 @ @t钦) @ @JRL馛Ҷ 4_Beee2o~вRM#o(Eʉ @ P`}I#?~| @@9w}aI{Gh߾}9-G @ hYfm6mkFu; mQ2vu0gΜL` @ @Ph:Y/nmx7\sͤj O]w8sNov[رc;J @jb!6m$[b* @ P={L2=zt4iR f)% PSN 7|sr-: TT @Hb,'J @ @b70nܸbNEh@Ef3M?  @ @Onܹsȝ@N?V]udбcdžCMb$ @ @P27iӒ"Z2[="`vS @j;wn8… N~z|k @!еkפǗ_~YGO  @ @RoT*++wQ*iɃUW]fϞy衇x  xogO @ @7駟/{J#$ݻo2"'@ @M$_3-i[#񻊇z(,rwuWoIF @ PJ.0cƌ; &$SO=b1F  @9'alfaذa  @(rL!I&y&'@ @+{]bL)4 @@^̙d֭[c9&B,ˑ @ PB1@DB @@0o޼d=#h" @@v!VXȳ)Fڴize / @ @@mQ1o.YfA^z)xUWM0E0  @R7n\8۶mnЪURNYn @4@4.y?~h  @ @zⵦqyG}!-$XyW/%H-cO @ '|[ PAf- @ @@-E!ƌD~K'8ߞ> @ @(繖i {xg+b?^{w h,Xvꩧ 7ܰ f6 @.k&)VTT)Sz#@ @_ X< @ ܟ/8O @@bl=  @ @ зoߴӶJU`'L[uUÏ~RMU^ @ @ &MJNj_`{n2Q?@ @ PPم *0hBXhȐ!KfܹsxlЄQ P#?tX'\sg[ @ Z+m  @ @vu4|0mk @Ezdm&lƹĈ @ b,'] @ @իWhݺu2q#s @IFf͚̹.7kR~ @ @@ db\}Ջ8 SN vXyn&NX\I @ @ g9@E"x{IB^ve?'_Xū*iӦ 2" @M!kӼi[ @(m 70#Ig9sfi',; Ќ^xa:5 @PqM @ POvڅ[/믇 sO P=PӶ @ P'|th۶mXeUjlkNM: 9}N;ɓ't @ @@- 78h#8"Mfw}M0) @ˤz @!гgϴW @(̵s O?t$.S Є3<ػw0p&T @Zvz#@ @($>}^{-̛7/a 7,B <xhĶn[Æ Jm @ @ѣG>|x.Xov2f݃眷[j'7'O4))OܹsH @ PZl!pǧߟn:y睵Up6 @r./<}OS0  @-vڅXp!;\{ @ @@r)aƳvۅ+23z.F @^xaq~Xz @ @۷o9rd{ 1M7OO> nСCx?^v @ @@.zr>M||-xC7&L~G}4m۶ @ @(Z-Zm'4g}v袋!Zln0xҾ @ zaΜ9ɸsL޽{0  @-кuЫW'L81>ct#@ @"p!V[mS!b @뮻AuwN`4 P-< @ @4@>}ƍ5 PjO>dҶn5 @ @^CL-F׮]‹g\zpVJ @ @ .:JQꫯgqFZ,Fz׆!Cbr"@XW_ v[p'q6B'@ @2G}Tȡ @ȡ/뗌8}n( @O Gc=6m  C9P @ @j\x;?־6 @{4iƤIr-WW7  @ @@V[m0s;L0!r 7LM/k|0la֬Yaȑ{scF @ @&E,I;GuT_> @PN&@ P, HC;vl2dHP:t\  @ 2,݃z6|p'_xKࢋ. KuQ7Y @-] @ @4Zo߾ɾSL _~eDZ# U`ƌ7H‹y۷/PE @ NObرcp .r hРA᪫JS7" @ @#ТEIF&jx饗&zhP6 @OଳJ'ڶm> @ @@/|21cr= @ @3ˋ/iI,@^СCpG/hv%@jP&  @ @"ЧOtǧm ***tO,+A @%g?0>UVʸ 8iw}s=Qt'@ @(&b W-[ov)̜93'd뽿 @xꩧҿ;M9 @(C-Z$7.L< L @S`;vL8qby"ȚX/~m2!v GD @ @M*]1^|a!@@ d۷o' @ 7[lE( >;pI0s Za'  @ @ě+[@a;Nӟ492jժӖ P{n)|fO94 @ȣN;픎#m  @ @#{$Yfv²#@y9sfҦMpyF @h]˜ @ @9 1f+kXI|dmFK=[o}٥ @ P?o\>inm(뮻.|gG _}U8p`;vl_8A @ @L6-?NЮ]jz[Eh~_~9=: gϞajD@ @@Y <8~I=P8C6xɓ6~ @ @ 0 Ŀ+. 1 "!^l!@'0|aСCݗq"@P^L: @ @J `Ѳebe8hnX81׼]yp衇.0'@ @283c O.]3V\in:5*l_ &MJ1/VXaJF @ @ TVVֺF$0k֬0hРk%a:!|SNŔX  @2袋ҌO8Zt @(j%E^y3f\rIzr M @]`Ĉ9)ĸ릹| 1 @as _|qSI'԰&@$вAu&@ @ ۷,^p¥(,? hV -\a' @ PO?t/vq Y S`e =b<8̞=0 @ @e-S2dHxnݺ%7ݎwY @*';3 /~n:th*. @JTEٜ9sh"@ @z>裏Ҷ 0o9L2%?yXo6 @@ܭA\: @ @BO>᭷JnP.PA@A̝;7L<9eyL0`@5  @ĉå^ZIvmik(L]{,?|gaرa sOhժUa-* @ @:ZhQgQGx$Ν;G}4Ŗx  @2+ <Ȱ2˔t  @hn/zꩡ"znz+¿Z @ PHި<ް<~_1cƌFկ__&$@ @ @ L$̶mۆ{'sX- @B7o^g_ׅ @(Qݻ. @ @ @@S L0!ěϛ7/2/:餓jz @J ބm̘1z ?Oj<; @ @`iڶm~&C̚5+\qK3}  @ @"hٲeh׮]9s b! @Xpat駧m  @  1 @ @h"ě? 3f̨U(>A , @ @@'gnRGN9$0t0zB W\ @ @ɓ;Od뮻.3 P7|s5 @ \կB.]/_4W(%@ @H cKVB_o[xwnп' T 1.  @ @+)0aBc J`i< 1 @ @Z1cƄG}4֭[>T8sfI @ @@~2\90F'@2駟iI4BMl  @ @%铮?~| @@1 ,\0 Ei[ @XRONWvi]vc>|xR1fo;~x9 @ @/0 &$::t(H ?L[nM~ @ @YN<(<7|Y19 @ _9s$i&ߞWa뭷 (B _@!DH @(IKiرcjߦm  @ @`qn)s̴A @|' wq;/n:}Q,LC~d>裤iӊ?9 @ @ PP\pA듘2M:` @u TVV;3ֶm۰nյ @hR?l&ɜcǎ W\qEo2 @ @it"S  Pwx㍤ϖ[njZH^ݫrojD @ @zt)#|aĉ!^4)Xu!@@A t%kԩi=\0vyйsqMO>$<^z}ӈ7Y`A5oRQQ>^?4v7;f̘0f̘駟)S$sZ!7`9hժUs={I&[o5!۰Xy6Kudoh_ƍ NoϟV_} 70 <8t֭Ρ'L|vc-I2b=f6kfXc5².Y]p?xsw)Uukcݫqn4uޯ<ޚ5 |Rޯ<^⚦l%gI5ݔ|gy磌ܟ%^\UuV1{ҧOлwUն7^Smű_MӨm[ouXeU}NѤY &k@cݳgcxm5gu>ޗ{?Yt> dߧjVoT PB . gyfg5 @&Xt{  @ @fu]+}7K &%@@.D-*"Q(#gQ%.R[b{}Vln8VY<Սskn5{?]ko,6΢5umE,6~潩?7dF͛\[9dȐvՙOO5|碋j9U6;E>*b}Wp C,o5^ms.:IyqOkwɩ iVK+x9sw)1TkO uޯx~T|{u~41%;byn ˢbwE'hgV/sQϢ[4֎;VK[J[ ~[gnSIˎ @ PgNYt"B"XQec.Ikzv rH @8/]tEi 8d]ָcdaTtO5(V55??X{gskٺuEEp+njSPuU߾}#3)S,7LrKX.3w.~ۋş/&@L.W=g|YsX5 q? 7/99? vo۹-w%T1 PEছnJ;ӟV! Dw\u  @ @fӧO:Di[*жm$> X`A~]gu¢?b6xଳZϟV+m~y @x8Zh T1  @ xa-H6[ɬsOOk~j5?5?RXmO-2!W7wuYk_%;KOOƗknr}WBv m{7kB|gtY fk55Fggc&2MR̍,k_+gҳgLO @xOų>;r9m  @iZ7tf#@ @ @v!'E۪Ehٲer|p`ĉI6m4k"1| 9):DʘFmT\~H\!HB,7eʔУGzGܩ!95IՋ%:wk'f.^p/h'Sc3.u9=;S1cFw<&;лwdp5ׄx"p\}pWyӼxśر1p&^; Zϧ cqȚٳgE+RMݫ]?jjmUOvL:5YpbͫO>$)vߨs!R 1;|0lkȑ#Ê+.n @ @IoMo %3bĈr"+ Pb9@ݺu+ C @@) h6,|ᮻ 'p8JήtO> _p@IDAT3[5obłX&MJ#:*\wu٫k:}2e%PW!xxn}x믟.c=^]}/]vaUVy g%)htUW]\OmjSc1xʠA+xGK.$m6} z뭓qC,qqDž:6?Ŋ0nOS$SN9%ٯ۷ozv ~{>|gn}r/,5͡>UvwjUmru p^c> |5U+ߟbx_z|,gy^H&Yc5B;  @@ A=4ݍh> @ @XguBٳBe8 P2? 7ܐOZ)zb}O΍e?AYGy$N?ç~OmidnƋ*V^yV>U}g&c#G&'2gOp ٫hǢ8avA%:-Z/x<||p+ٍx{ndu<)|ԨQᗿevOSO=5}ۇ~8n]6pϱc.vqL:7u5nxhWO~IV,O9쳫ۤu$yK_t[N@߯x|7Q&_K]uWb}iOM^{$nݺ%ӗ]vB]|y4hP1bD8Beeerax1 I @ @@ b$.]|0⊥| @2=zt6lk?m @@Q 1-)fo1>9rJRx+΄jYk~5?snk{hw,s3&T1_wΝÎ;b&xl /5xg_]kG4ٹ.Vî|h4@糶~7X5ǵu|,|g,c y=7fV6Q>̗%k3  LJ@`!sO]w5- @@ lL @ PHA޽wy')X&'@n4;m7Wy=;{CN<3twe/Xiu&MJu5_uڭ!q;i׮]իW- g_|>:,˜a֫5|Ǣ̲j/8ڟ{bgk6-0 *˜=V,pX[1}ʞvqvǓELss1ߥ%q|gǭ4U_Ru׏Lx~d>_ڛSOٿ#յø߷rzy:b矇_LԩSRG$_2\r%o7ߜ> @ @h>L F 믿~{L(|xsb @(!Cx-Z$56v Bs횟l}B'5Vȍy95,{/3Vu}OLIo&ݧkd>tU=ci5gu34zT=kK%? > |5e+w([|cV}=qږ1}XR*'nͅoM<'+ĂR @zYf;/#?)]}t @h]i˚ @ @Pbq^z)TTT^{-l馅8/{.E5#I Q$ vAYׄWAEEW + FPπ?. 誈*Vq?I*94Muߞ=s}yvUuuթOWܩSH.?#'hB6mV]ŽHֹsz|RV-/,\uai?vp._;_T$]9Wϯ^Z-[mӦMJN K ҿ_۷o/wq.n!CxUFuĒ,4hw:#O׹^NQU滶 n:S|N9QFjՑ><~:[']9ndG:cYrبʝ G}{:m\r.\H8`{5}d.2N1k{V8&crܸkJ-.\8Ο?_u8VyIo!m۶2뮻N֬Y#j*\~厎}ٖ[z@ @ Mlx_~^O=|^ @UV_WT)rWtMmI,$!@ B`̙ҽ{3d"}:kAj8|pQ{ѣG'OOb> lp`S268iٲOKqYܹS͛5̽1 zѰaPHɦMfz>Ifqq5?- 螺Gm&H $DsRqq9>.8ǼĻRMfxnذA&NTCv5  Gx Yrӣ?}4@]8b{ @ @ /t- z=zpԑ>*cyIݔC!F2e"wɱ|4v^~2Gz^FŅccuk}Η&MP3&V'6^{͓[\^z^:Q-H֮]+/ر#m6QG2nhѢTXM} >QuI& .,(@mL&%W1^[]s7H>}drok.Ww \Gpu5{mJ:\_4׆'<_`rɅK/${7:֬YSf̘w\ nc`SY''Y@ @ 6˗/s=-H_q  @ O |G^~y(GQ@Q @ TR%dB+E}vy?ɓ'K͋Wy ^Or$cÞ 6?"%eԕ(6m)_q֖2ePhfP9n'K^tErM7yEthժ^# ">6h@&`{*2dKY?nux(" udl 绀꓍ywdO[ѣEjPR*Uj  `ʛ 6W_XNՉٳc{#[}Qիs֭[o! @ @'n[nO?9ܹ >c@ǎ8@ @FwoK5cDmls5`L)`cӆ=Ηk|g1B!ӿ~~n-;`jYjU[E|r3l2'O>>#8q^dS6UvqCT[Omq7ȵ88f\ @~ Sgc^] xfy;n: mUNM <#{$t _|h"zHw @IGyߐ @  1ͭ#Anla\1СCu|ҥ614TYI\[L".Y֣Հ 3M6qq}ӗNP 3$rXV-5J֬Y+NdD}.j3Fr.Is&E;gSg2,i?lZ-Zw.jժI}"'<\~}۷U fI"8D_ҙsQM][u,ۛ1+cZEQ'-,Өz͹ZG&%M}9ue?_={9s$aWH%yVZ9P?)"/6q'hKF"іXL)ذ'iÁ͏HI3V3e3ԩS'_MzyQ0DGJ*y6m\b:bTaÆ9v|Nܬ#?1On),:\yr6Fե\q {ydQw:xw}i(ckɻ@aR&=­ɹd=Zw] @y@@0>+3dȐ<] 1} @ @ g Fs7 sC@nqNu*"/•B իW{:wFccݺuCf{+W}Ҿ}{:uEzRƥ֫3áj&3/*mij16jkݹ[y<#'S~5=ztQڶm+O|h1k{V:hZ)ؙ7lʝTdcXdQ/[Q%믿.j8M@2iĉ夓NrZJN=TYti8@ @ 9{G&Mrw6^zA P̟?鲮=J[/ @ 7n,s̑믿޳1AS5kL6 ollضG$ltQu8j(Ou&w6#3qYrhp13i&'{_Uʔ)#7߈ m]wLtYu$/{Ǣ<6lmI{{]`/m 绀jyw{Xvӽyq*UxΥn @@@ߡN5\q'@ eH@ @ P iF~g//8; 'tӯzHzH,?4Usu{kV'f{С%5 .KkuJ]vENs}W*ԀCD 7xs9QVn龺.2_: s]:w͸dǕ+WN'rĨU Wgy4ly?|iժw>H˭*+V\E嬳*T|Nԩ=(QX!%ԶdY:醸FwW\;3`Ԙ1c]uEǂ}ʱ/Ɉ9\Gpʹ5{mJ+Ȇz1_)kUfH'17l~aO`ۆqU;g̞_my>ҕFMG߆i:bߜ^c=׳gO}e42m[ f/eS:k$Y'}6lN'wDd sqp=>.q yd7{8?\|뮻* {t7ʕ+wܑ{@b@@(}k @ @9B@Θ1ÑV1GnbBEP~[yٴir)3#(SNu2N6Mvtis9ݤS25jH acU}dWK[cͱ퉭Zgv)> lG}T&Nͱ*nsm9/_%/ ,K:c1f͚9/ @ @DL)dF#Kͽtc38#:J @(t-ny.@ l!pG1[nF q'7:vCꤱ_~ҤI.y$Ob>6 lphoiZ:c:1&&CлACE /s=Y^z饄M;5kָ"iS:_ғ*)S'1m; ] >8T,[[gM|lۘ^.(|=# L9漣M.٘{J7<`R|j/{[Ωsϕ믿>  g "[nuz5`I^u@r@!!@ @:btCɑ@9rtժU1\n{vXwyW}:u7/㿑û˗J`c*bF/vڥzI&sCnhܸqɎA6qp5kT~4157`M5j<+QC H޽}|C/(\pL5(![>]ֺ:3u>w*Ur=ۇ3zlK.P"o5eҪU+_Ԑ[B: D^TQucq|ʼLlnjڥ\hCglK6eĈ{dܸqFwx㍂ޛ|k~[F_|]6ߺJ @ @@g}^F?6欳Β;rG @nV놆 Q @ڽqv}jW\96Gf͚9kEǎ+ٴ^4&<ݛO8|u'6*76?ݵk33p G풻wVâ[:;NlYFc=7ߓ'OvNu]tgyRredB׽qf}s:^Tvw̖ iqIGS.#.cc^] kywv̘1ҩS'_t,W %vtOAog @ G %:GGl@ @ #'PbE1cq{Ɇ W^c/r /҄VX!FZL[oɇ~Wcs01Neݴه81qh֭u 0@իZ5VZq={:5L6qp߲epL %0&j?h~a:`9sm֭zm,U# ڵyb Ӫ3p&F5TwCInc!}>֙L]>aϹ'Nt>:~3L^j6\ =irɕ7L=Wk&M3_+=d؞U\f[:-:uk>57~'W^yظ~)(~;8?LTRXus1 @ @@rw HܹS.Ytb駟P4@2OoT{^D @ )jt>+C GyƍE5QLzyr'jSj%n `󳗏&Wl8J/8sn9QH1BN?t,^u֞,M4q/:j[=x`FL} 2a$0Sl : tpi]@[il!9$e֭ c{GK1uTo]@e7uQqKf (U08['#o&vحRjU7# @r{n|͢@~  @ @(Zh!˗۷˼yJ%: 7\1^q':yRgjղaÆ\d[/BJթ\s6#Nm޼^|yPYcvB0)SF_ l2_o[lKǑ}ʕ幡YfANvTy,Yiڴid!dΝϺu2ƍsLyt>] w_-3bQ!XoTYf>}L%ln[g2,-Z͠Oyؚ6СCC=8EVmӡUҩ6k」:|Glް$ιZ7EJμ }sN;0u~)me]&z*'Bw5j8c<][n1_nyA @ @[ j֭+ިa "Ջw~S! @ kpXR|Zѫ31u8zh;v|m۶9vSNu҇ztIrQGo~iӦMoQǯ&l~aO ='H$ E{ Meg駟zM>1+Vҕ+Wub /nٝ>yӮ$t dN!XG\S# Oڲ-`sIû^26Ȼ{j+f>CQH]@ ǼĻ@eyS;`g &ٳY֭[=<-Qd]tm_  o%޽;8+lDIE]$o|rgE/^,?/LtgܸYoED 3gѣ/ }Qmgب|lq׺m>(Հ:ݠȟ|Ir9ؘsYU`{ Z+j_U̙#LüyOl9i:.;+S:6m9AmU~3k@Iz)هd`a]_R 'oOڪMd[x. %=>.~LPW~PqLqKa. a#jGߵ?c%u;n8 cڵe^X8a0 h93t6, o\%жm[6mG믋oE ʔ)cqj @ @2B@׌k롇c=K @JGzg @ *ϣ>*w֎N>]}QG?nعs|-|4^\9ac D?ZOrB$cÞ 6{?͏GqRA]9#˭SmӡCQF pNm޼ٱ_-tegrJڷo/_}Sqػ b[P0DKZMtƍŽȆYpxЖm:m=N] 15Kz|4{˻Ix.٘xH~m0Obnyw\~}xjժ9etU&, @x7dN޽{ ,%#,1@ @Jugk7oK_2ps=aWǎeYF:!2sMstԮ];=#t:H}sawT$_* dn(A"z-@pPK-3dqZ.b)[1>%m,-Eݗ✯X 48U}:&QgCϖ})`Q{eu},F9c\{TCԹZeNL׆dB_l>KG3WD t#p~{fT)WzNN2Et"j?qDR5*o8= @ @4 ܠ_ `nu9爻%\"?R? @ 6l`S@ @hժg}vhΜ9]xb1Oqر#5\͏Rqklʦۓ 8~2aOTR˙իW &,|s=M~Ĉva)66>\(a&yImT/=˸ 'iꪖ+Eg:Q*|ۯw9V.٘LwDQnڵk6úǹ+*UJX %k.曽 ;}8<D @YGGYwK @ NH aRs!u]GWC0}Z*n{ҥfd>Cʥ~: f*W,͛7+VYVi5`+?s-l^LժU%N3ZQ&#YDrL[ȑ#}ݺK}L&>ĥ/*m,-Zwm۶ΩcǎiӦPCf+}[$KRE_׹A>{Kcog!ѹs^ortI& ֛ZI.צ&9*T}1LWGRE}Q9COS6I x/;N O?3V. @ @ $?{% .t:g͞!5 @F@7ks$8B @K@O۷o|jʕ+eذaO8y]vuOͥ:ټylݺUȵe.1ׄk6 D[El)2u'.{LpG=bTx01F۳Znҽ{L=EZIHYʤ:%\ڧtQGC %guq8*odڵgn9"Ec+ͣ: Snŵq[٨t(5tǍrŢjl5 %XogwޑW_}SiժdĖhl댭gبllrs=̙3q8a„P'+Vt u^9C:|`?tsuszϝ̄|-seȐ!=uD~zU\xᅅΓl'ХK?~;w#F:{]t @ @9CM_7"@&AxM*UdI @YEtXۿdA@ @ ԭ[W;0OFuPșy뭷Q"hQ'SƖ+-{Lp}z'*r~D{=z 7 ;vp4iR1r7nXF%zj1m.I]7} 9 .(mBw9E;4wLgI]@r.P`^sx˼?$@@$6mr|A7 ,%J,1@ @JK͚5_~y敶_@0~ҤIHo̘1Ҷm[_^XG1..47K$GXE婁kԨT^KgsDvafq[>`lꀳ_Nzҵkע.KG}+HzAr"$jժ*6o,W\q4hPXҶE;`[gzl&w?ߍ5q_v#pStl 8||6coxFpt&-w\Nlܸ1{「o ^C @ 5p3\M)SFƏ/@J}r(G@ @(a$$fc˞ 6{~p.Qs1Fb\V-/fr1cʗ/_Y[vVf84wIz_U 2M|۶5'.Ž$D] hy'wy7Rf6ʒ=??MR uhb GԳ>[;\!@U @ @[v 2@5v 1xa5gΜ)W.]"9a ԩ]SND9Iז-[K̲Hs='?clR\p"e߿=j bT:|uv&5jH SiÞSs3`k֬s9G,Y❺ .ҙ\8%:cYبmrs1nIN+W,{>@ϟ/]w]V9a ⚯AßFcͱ\L6{䢹q6ŕ>Wk[].!==pqzi" @ @c2:Z.Bٵks]w%vZ ( @@jռ[΋ @ #Or$c˞ 6?%ck:1RjcvZyBŸyҥ^{8'2 M]O1eXh"AfqqOZn7΄ -QǙ(Ż@bJywRS㘗xHgf !O?<4^\9JFZ @ %8bL !@ @lhӦWy8@N\W(ڼVZ\yz7ŋ1~wrhTZin+N:ɡսi&[tnK/TF7iڴ;#_~F^Q bX@IDAT7o^."7YxQGɰad΅el߾] Y`wZ: UI7c^k{7k,ر̘1ëQFOz针DC:R&Fei{:*TuGb^z6_>}6Fg-&c͹Z0_RhKgl R&G[].!y衇Azi" @ @czܸ*:[JeժUEݺu[n%z @yD@`G.  @J@qքbS1uv f;lp`cM]Z;#F-7uBmY}go 45k괩뾆 #o֭[:XH%➊ P=w)mgY{xPRʻ@a f9]@1/.\3l0O"g!@M`Ȑ!ޞvW]u4ov@@ R~ R @ @h۶wJ1tI^ D#`.+:S?H؂gu{ye=XOtĨ §~e)SF֮]+|%m5nܸPQn=BeIFJGs=ד駟+W:0 Ջ#G M6qs,Dnx%/s,쩬?'[5dĉ>xyfdբrgĈ7z8 W^nI-ZUsG_W/mFӁ.gٴvW_͛t…Nߗ-[f$Փɓ't¦h_lQe]Ű~Ʌ^(}:D@\u裩zC%Z[1ڞU|T:cC_\M&7plٲEnV'뮓}WJA @ ItĘf\x;͚5{.Ẑq sy]ݾ}ۀK.r)7כlRL[*5;viv*a׮]/zT^] iFfΜ[{j5*Tpz^Yf? a&9Plل"d۸>/?߸q~ᢎs?~QŒ?堃*T&t]mFaÆRJ7;zfϞP&]#Y~}@L*]U͠vjPTVUuP\}W{_E5OCKcX\vV~kQFS8Dc ]7erD]֟Gw/S6^='ukyfT2f1(&n6G]@Ƽd귶Rl0[;1@2M?=iVy} 8 @ @'|jΧO>Y!B@M Q 57j(|ӽB:l.,.8w +p+o*,㧟~]_PPMv,*sTwyg5#؇rٜiˤ`3F/͛8gΜݲͽ1#{}-pPSNݧ~C yӻロPf=QG .p̶W^>N 6˄mqqۈz s vg!tƼq=Kqبrg'W:_>W q~dݼL6^sav36߃=bc<7}tuС)/sl@>=g}v;6E @ @@矽8(h4 7ӯʕ+.pАg @  &xG?p+v6RısѱcIإ^{mJ ʹ|7egu%xR jj~O4d^ɔl򗿘#mqx:U=CwL-u.P2j]@{ec^] `Ed{SE쯑 @t5w{キtà "0L$N @ @@V(^ʖ-2o޼ ! D.AZl饓Eo[_{yyFҥK/%R|nΝ+v*jFP~^-ptUU~}SΕĉw>qm&:w?^ e…>:jw]Q],p!nذa;2zh6mѸC"Nò |RAlP ~^قo߾_HJ/? >Qajl#ovVm}QtƼgqdҵ,^A" @ 4mݢExIGv!<14i"Nfo~c& 6/t۷O\OhK:SVXH▩C )UV.  -Z^z Gv rNDTTɑ+X<ϻ2{l9묳SN2gTS}uj[6,Q5@kj{ Q eӦMK ln\!nI,\7VϒIyäAIӰcl~m~m{6;S;z*;QO;4SN1w"D-LSY>#갡Eu=,QTVO6a~٤,q,i<8GM' l D+3T9ќբܖdA]4NUfm'$Æ'맞 rML: @@ xS%(~@@TC@ @ TXQԐ\j-X@vsU P ]V,YaP{˗"E- :tQeʔ]0rJ ]Pa ]!{.իWg}Vz!\s,]45K.<(yꩧ:Un5f kז^zɭ*ժU +ׯ{2i$xb`BtMn#x>KPςϩۦn`y2p?ϗf͚ŲHMs6tl#g)Scʝ)&#vǁ|G:Sc@cZ8s.=Ǹ_T.q:a\ȃ xd˖-p s)\@ @ pĘ 'A`ƍry5\~r饗F. @Ay͌ΨCl lttZscoݺun曞8]~7Q'z衑B NE~-_T07ֲp@uf$àAKYs1rG˚5k{ϟM&wO?]֭[ɬ:qWGEi]WO]Q]5SLͬ۷o/7:u8vj,>C:L6oȹչO%i&Զ.F g_~q[~;g-ǎSϑ>Mw}' ӦM˨Ql_wSXw*'^qՅ?\Bl qִэ֭[H.3C lp7'^rmPZq?K`pIp@`(w"?d߻'}dPWv;w,j_ H!)\6:u)[r"?ˬˬO%I*Pxl TCU0]wTP=C|N \د#$ؿ=Iw2F1] 1'Lz9B Y;Пg{m @@ا`BߝR"  @ @@!p8jԢERw: N䭷r:~>G}:yO?\ve$ ?;sΛ+V;(FX"h ~ϝn>w\daPG~nm6^ze%'`KgVrY2'd7\cl٭őΆɓRX?l͘1Ct8 j;dȐB= P!2 t)W_-#GtzI׮]sW@ @2K6?W^ɬz)ƍsֶm[׿%+&ޠ0/!)@ :Yuwu|WJ%dgb1cO>wtM^:QDo}g):pɓ=zwAI'$?+WtyŌ{r뭷z޽{{l  8Yǰ`:;ꨣdٲe^\s<#ˉ'9|7Rre/}7{y'|h^`Dݨd}ԩq_W7YcQϩ:aTۂ^xAxYz^˖-E!y,Gc:/C[Uot6GnPgzɦMD3q Z%k°,1oDW/\yuf{5@~XnF~8ŠIQߣB/"TE;6*ϙ_ٺu;Vm&ݻww~vV@ @ gvHB@q 9s¨Nyt3l0*C Oԙ:bܱc[r9xT371 j:aBo5OL6s¨w\W˝c?` N:n2cO~x1+0aB!'/sE9u| չ_`Q:=bs1#{9^z%իWhw}Wn6\Ν7tz!VZk&|ρ]M])e!"@O/QÆ +(rF"Ӻukuh 8k֬b֑8q椎u[ticSNuQ=6y'7l{}2dKto[7ǒ#Ҳ,1o̼QrO-C@.)ذ4i}ՆN] SG;] Z @86o1|p008Br@Q!@ @JmzTJ @ @ @ uOK=su6,r=e @ @@i'#Ү_9\wu^Mzi" @"gqAeC:J$͔7]g^Cڵڵk{y}/*֬YKסWAHJ˖-CJe_?,^{OoH'͛7OW[a> t<^:,?їh"_Lx׹n,_iF׮|ɶ~@,(gN @ @@ڴi]#F@rG&nRn]kSq@#@ p@ϐ $#PlY7nYɓe˖-ҭ[7ySNIv) @ @@'#RXvRuryV?A |!pI'IZDkzj^zuo׮]2w\>ؑH : s4|ڴi{ٮ5ew;7옎 l2/[mʕˍ{/'{;ʼn>dQʧ'AyΙ3+ U㈘\TOL|N9QF*;u8kteE~Iq2}AVJ(G-wui8Mz9b|կaÆɂ  mO#at(1z~Sʕ+Aasq>|ZaP @"^V<cq5 t0Ckl@m^@ VX!#\塇NA  " j"A@ @ |!Ɵjfv~@@~۷͚5 Ggc~WzcRC<x8R  d / /l~Ygo!'xbK9@ @J51k/2YdSgǎeOe @ _o^x}Ȁ/]/ڮ]lHyrqN|7DJj(Ra) ,VEGǼt19v\\1o0݃ @~ׯ$=:pI@@, @ @J9֭[;/_8d,8> @ @ H\r2a9쳝+7o,gq)Dq@ @ Pzk=}'oā8|)_& 4믿s#իK?AiQm߾tN7RJ~L>]>#nlәE %ڮ?j?S-fP'aAGpT6?^TܠNcQteW\z:3-X@9>Kndső׸qc_P+A(7DuԱ?ܭw=ضZԭ[i{ѢE>y[l>#fGq3F3w-3wSM9s1NTT_gµ,1oqĘ3J @ @ @ ?I֨QCWQ l%P.[C.@ @ Km۶2{l(= вeKkrV\ZT (>3xp@Q&M;OL"b׮]eڴirqE2 @ @T0PR%k>oFﲱc!⥉@ &аaCѣ7N~/K1isQpEnС^ڴi#]tҦ#/*b:Y8Y֛Ӳ8e*uyeFc9\dٳ/(̐ycZb2j(߿TV͗nduDy&|NarmJ)\:cr5fԩ6uVTIZh״iSѧQoذaN;MN>d'nvl(1Si\ɤ!^t$'~%:W:ꨬ_ ļ!9L4k0")Nfa4@c/jMl@0`N^ +6E @ @F@ 0w\108B@ c cݑ+Xz==Jnn6yd9s7ސ7:xN>]9昒V!@ @@صk'=D"شi\pe ݜ3Έx5 @@&p}k89r~ҭ[CIיVf̘!}׿nI #qh& +V~+;fNZnfM^ 6x p mի)uءC"AGu -ޤI\ ~o^F!]vchEdEt>C5UO0L7xqǹI1]6J Sf}˖-PGg}TT^_L2r;YjWkϙw@$.^q/'rǏg}V͛CѣG;+/P1#8ohm?K"%1oS1Y sqd/]Tot~.\wq3\vefq{=Ν;;tʕ+}9bTG /]TH˭*+V\~:묳B˛i:u~備AGL dc3<#w}e^: w9#F :f/^XW.=ck)L#TȟlfB'   |Tƌ#/I6~Xӷo_9c%yCy~7ęKR7i @ @ E`2x`~Xʖ-륉@ pĘ !@ @@^P#U5HVI1s @ @2B@7{W[n2c Y~vicc9 @ @v#F]G@T&Lg})^jU8qTP!唃 @( f͚%/{'پ}Yl^̙3}騉dμ_^U*]ڵRvtv0ܹs}m8ˌZհaâ~Ǜ={N:ɗ.n"-O?t}իKnA>syl宻r>͚5K/T "#sBp`|͡4|Βph:5TaU& T.Zq\gI4impWk֬1y;eٲep1c]۶msɔo”M|aŒ;~|A:uqڴic's=|Zh8dTG5j(꼡2,1o4,Q@ @ @ 7nN]vSO=5&  %\ @I@ @ T"7v :d$@ @ @C@1ҹsgcG @ @Ltĸ>dȖE,Y"W]u'SO=%C @ |̘1:^_SNst2P/j;0ǹZNT:uO>^ڍ޹߹ÎAMiaS ֟ڵKb_`ZʫGmqU r:$5C*uj͐컉:ShܯQFe^[oU4h {9 " .M6rSKW[CS7WR%7CS3p ~ݻw{,˗//guhߏ>hr_wQ6f:5uk2n8G뮻W85o\*Wrw_ u8j:5,,m{r\ suv8|piժ;DtAr?O1W+l)ijļyÒS- @ @ @+w(=P)'B!@C\t@ @ 6mȢEŋKf{ @ @J@ŊMͺu&olذAN?ty7/h @ dssw1f}fIo.=z;b^zr%d@@*Ud̙ҵkW3W_6Y&rNgʠԍ5J4OL #FӁ\6?n8fZ߀^zVwժUT6BgUN&8oٲqY\9QuQ}EY4}TL"[nճm6;v(W^yE-Q0h}|y„ \&N|t|Rg 8o(L?KHځ @ @ @4hǭܯ_$/ 5B '1I @ @b#жm[y嗝Ν#R @ @ M@7|sΑӧ;hSNN:n8 @ RMGyu0N4s'x"z @`/uا *?~sBRVci 6L>"[y";b:tW:VkZ3͛7;˗/7Ob:kl׮ Pbd|ʔ)#w}-[e˖tq6\Rv֬Y3PNQy,YiڴidgPsgݺuq9Ϣ)ҥKEp}kˌpT#BKJU N=7'6N;V :~z! #}O.&LO>Xu\7%,iJ@ @ @Ν;sTVK @ .@ @ |$жm[[sD @ @ @8G*+*#~B!ZdeT$#EBTh#QJFP2*EwYYw]>>~}sk~y}{\ 9ٳq2o<Lܹs!@@@)g`ETb46ym۶CN**THFp4@@ O.ټys/{gq,7T"K w`=XaŋSNyޘ      @}mڵ Q@")"     7 ٳg'NrۄY@@@@@Л͚5KyF< s̑:uU7;#   & V 4ڟx zg@@֬YW_޽{KʕeÆ [ iA" \٭ޚ֮s |nEɏ?|ذa.ݻ7~OiVJI갮v'З=LKǖR._, .7ՀP j3q˖-K`j(+z8Ze˖&Mk6ٞ9s;tU&OloO6̈́f̘.pwW|뭷Dފ5XI綑zyl  @pwcZC={ G>թSL1֭KOt䡇ۛy]TǂXނI XxWRJy6uo p%K>2%TȑçfΛ7%{ Se6PlٲkidWDu?ޥ6mڸ'Ν;r_m^f3[ [}YG -:<}nDl)[CUe d֬Yw]CK,)oh3Llr0w,7ݑ^c{+7\ez?k`]w%.]ڵk]+`@@@@@BO>r1SC֭jժAƮ  ia @@@@ .;AA@@@@@ 駟JӦMer9̨Fh@@@@ %\r LhM6 /` |ɓ'Ey@@ R5j s n߾sOaZ4a:c{קFw6ZsRmpnȴiYa亿{3qԚN A6iE>;~;6l[ƌov·Yg=|vo^z%h\̙GzJV`},څ{F73Ro||!ѣG?gMzaÆ2b=D;bC@?3e    qFb@RG}$?_k׮)^# B20M@@@@+WȺu뢣QaD@@@@ IF2d'˗uryy'w`jF@@@",Y%@kS~+oO> k  ľ3HK{),[/͛7AҀ\v}]q ܻw͝m i ~ÅtVZ&h׮]G4`}„ GC g͚% 9T#G)Ql߾vɒ%e馛<5C(c+J-wq4jH}Yɚ5k .^(ڵM5LB50*Y?꭯ݲeˤ}m6Eʘ1cp?K,5 اO{y%b 5kcꄧe3>k gg67eB!@eʔqtN/ʕr-jʹ{3Ξ=k^O ܺuO?Xv*T y!1.ۄփl>7~w9l.Omܧ~Xא͛J*T7b^tI۶mMYO:%gΜN:ܹs壏>=S@@@@@@Oƍwi3! @ G/&]A@@@Q|PzM7c7 U@5 (   "PV-_6cA@o8f8|psy1>s>&    @l \rn {%)J@Pg\n]ygST,  \p׿_|e> F ~t/e{NSvm{ +qq(ZKzd…vK>c4d… n:q[ _Spiƌnj*)[hY'LVI>|gfZ9r1j5\#%K4c4Im&GuBf͚ewYghƌi[o5jd_}$Uaԩ&0mõ޽&w}޽PݏK5k֔jZ{>wߟynOFm痞o4Ɣ@Vjժ1f   @ 7c ,yfywM3e$ov47! @b $    G@?SSڵk b 3"@ ]Gqi    Æ 3Mu&gϞot@@@ZիvRNmO3r>ܹsҙr@S2!C)]Ou;8yoEc^k֧g3M4re Fg b9\uY^T@ sbڴiҽ{w󼵫knw}~ҢE ; Q,Ybm*RL>]*We\qѰ@@ki?n: *d-N=`x{/[~i(Y׮]&~v6r޼ymX_k?系WuIpߝsN{ݹmb$u[}Ѱ{B@@@@(йsgtY (  ט"   1-?l-@@@@@p 4HgO>ҷo_{ @@@@ A+\v%>]EozNA@'NawHҥKg'6 ߿ˮ{veFᝁV^yg۝l߾]4*޶GsΜ9Mp_-7xc,Z˲i&ɘ1mW FV6|I=LXfR!hQǦ/-M }(F(.cߧVv ,MPuVO +@HwO}Lu<1:{uN;tYq%~69O8˜mӐry4z0I$+, % 0^W\)%K4{g}jc@@@@@G)Sw}gH M zX"@@@@FB v[֮]kO3SJw' RH7n<@Zj%-[G@$fz_|l;p@9y򤹑I   Ā+WV:CL ߿<ҨQ: ٳ=g/]:V8p 5 I*Jg`}\s=&x&\Pg .,XLIv+\a< hw(B=2@R@ŊTyW@bA[nף  R=z?j(so{  1K@@@@(TʕK;&1I@Կ`wd@bT@oc΃ .PjU7fK[wޒ%Kڵ8}L0AҤIw}   D3`$hj7m ȑ#3)RDP#  DD o޼RfMH<"^z~ ${4Ğ@7T8K7罫c/^,mڴӧ+:uj۷o4DUd…Q @<#^H w>h! fFI ٝm@@ Rxi>    @ (_)t@@@@@ Zt"'N?i޼\x1ZL@@@@b)7ںuS9'M$Yf~A@@@@ 2ԩSSNv_z%>|=     UVرcMgr^zz -֞b@@@@(P|wuk׮:uDiKi ^QFIV{jG@ B ӧO{=:A4@@@/^,7FQm۶%KiѢ `O̙32sLɔ)S2C!   r]Yԩi&R˗M6rY]JڵS=E@@ &Lruׅ~*?ޏ#@ JJtɹsdĉݻwKӦMS S`޽5kV?bs@Rɓ'p‰̞=[Da% O`3τԌ @ 5;vZ'l t&" 1     /P|yk֬!`R?[l)@  tX 暔N@#<"AzcJ4h sF=yE8(   +`|BIwS`Ȑ!/ƕ*UJ  U  İ@K6c| H)w{\7uTziFzZjJa~\cS@|Ȝ93M@@ƌU5" 3ƍ+W-[V{i; E@ ]UԄ    @x*T`WvZ{ @@@@@")ϷoK:uرclF@@@p1NӀcx'>siҤ?P2e=     ɓ'^˧ҨQ#ٻwow!     /۷qH*3FҦM]@@ % @J|3    cK˅ d͚51z     5k֔oFׯoWX!wy,\P (]o    gW^{DM"&֭[4ý{ʕ+I@@[@IdΜ9\USo ~n!)L@otPG}$ҥN;@@@@;%KԩS%ueqO:     @Jxtf[9ulذ.Uʕۦ>-?v}@D1c9M/.y海ٱc:tȞOl\r%KO:5ҋx<guYە5kVO'Xh=-/_>K}+V͛7& ʕ+K% @Q駟3fH֭e1ž}ʠALc4@Μ9eҨQ#Y`={V~a4iu4)rJyM'z!>    ģ2eTX\rlR|x.}B8wLf H&Qq (we*THef`>.\vv%fk ܳgݻY̴ڥK':7Rm|=ǝY svT\(VX\9@@< t;Q.]D+GA@b=    zwѢE?@Zo S@H:uKz쾆=+AD=zTU=#_u/_^zɰaʕ+ ѠEV8Qzus{[ tpkvۃbG1mݺUJ,i~>rmm۶׽2n8{> Z6@J*ysٹ馛D5VmU䮻XF>}Hf4Ygퟧ( wqX,7 @$2g,sΕVZM84W/ߛ(    @ 8f 'CK5^     @t !CH׮]Mt,ʒ%Kt5 tLf H{1{EӧOu^zf۶hL;5Xm߰a3f4AU:_|673gY]vmo=nZ~}If<_i_!ķާnݺv'G%;w4joömۜF@@ MfPBoBqi: > !   D@ Lӧ7ECh Ȗ-/^4\y)y?6a\wu&(zSсCM6ŋpJ*IժUk1-[&+V0CF=m&$Ĩh`7OmHe:I+2eemނmL2&H8`:XMC<ƌ#^{ss`\T)zjƍE/̟9s|g.tWF 7n,Ŋ[6ol.p]vĘ@ *#G0e} <O>\rرcw;~7xB@@@@ ARҸF֍j+V(=zBF@@@@L@CK>#Yr۷O/oV @JŘ@Ǒg~(۷efk@N9s4c}ׯ}̞=[}]i޼y՟={V-Zdo㡏?.Z{1:>YΝ;'w64R:??@RСCC6-OY^[z    пs;Vr劌1B|IS @B1&3qo<&M%;ԯ_ߌE:Zjձ9r 8pF E 6W_}%-[t?sKeVJ*'Nz%i!,]vɔ)SRV-  z)zo;-5|ƬA@';ߦa@@@@X Fh#@ J y;vȊ+nO>15; Buŵ^knԧVO:qnn:9|?5P~G6tPe>wK-\YftsEnǞ6m(P0uTN8!˗/7t`{l/R\*e@@#]]yɓ'z      z#jXðyK.?.o߾R\@@@@@*V(;v4K=zpۂY@ rEu.3f !c_e͚5RJzU}3gYw=>XLXHㆩ;T Fʕ+kyxHF@@ -[&igl̘o4 D@d 1Y9    @01Ǿ )M^~}H?x`sC>ԦMT˗lxbY˳f*5jM,.;wiv TR.k}z衇lٲf_~^_իWo1c#Į>#{nd„ f>W\&Lya37z͒% :t 󸽵ٳ2|pٚ?~ɘ1\RV-^{AkSy׮]v[3g4!Hs2eȓO>);w47apWÇի'o\p.r<;w6T#m… =k- ־@bV}[f_Uz-znίTMЁzu뚟% ,(87:}Qի˗nݺ`do;zܿXob|$aÆ N3l7p@flҤI&,9O]2d`*?u]keO@@@@ 4 S)'|hr-ҧO$=B@@@@z^嫯E92DN c2Zݻ' F$Rc_uY!>ҐFhd׮]Y@ ¬YLo3gϞ&deڴi&oܸqb9w 2j({1WkԩSN:zkBC V*k׮ݻW#|l۶^'4jÙ3gM6ϳʕ+3ؤIY|Y6mZћ ic…]pJ۷7Θ&M|ie`߆ 3W Ywui \6YEo k`Ke˖Z2ed6 0` =?zRZlݺu'OLk0<.hXޡ>~h@u~rw;W@۬=אG-3ۙ3gDPjr N@wٯ{dŊVkE ݁ @@@S@m{1%6n(bҤI.]$A@@@@g.;5:K'  IHС 8ЌqT<@H8"5U<̙St 7|#7NП_~E:dGVvm3~GǓX%KHz:n(N /h{9ӧhsVEjs0{`9  @|[l1R<1z !`$\H9 @@@@ v9(۷/܇~@bVয়~^L{}b֭tR @v/RJ9W4}}tӧ]phk; B0rJ}矓]/NJTXĨ`C?o7©Xd}uM7iyw F!~C;ٽ{ pF<!:xxȑ˩S>͚5 *cǎ%}q|d}vy7$C sǽdΝ6uh¨w u`ڬV==zԼ5|[iX%@ zn߁ (`*sj81@@@Aq36Cκ3G     @dڵk'ŋ7g͚qt@?8RڵkWZCU|c9I6\f1s1YqEz]k >nAu (йsg3^yժU^ǜzjN?GfO&,C@m'+%ujbbU G mxV@@@@# V t)X`xD İ B v. 8PL2EZha޻w ^{׉zf@G 5{]gΜTRI 塜xNU*)Ql۶-*EodWnWTIrm͛'OeL27=sbf9}-M_k , @ඹsowp&\HVы5Q'|">Jt{]5g~0Z2{: _;Zlٲ&0M4f_px@ d͛20aK _۬穀.]Z>#{UŊE,5~=*T^7XgF95j A,Yb:o=kxb3nj`g6mLO>uUҥE)/YZӛh.9ֺ`u:E6lhދP[\;ɓZlm:iyo߾fZq=>W2  ˖-&WҀuT   #;=7G.6lTO+Di!  @P6lU;#  }#5:Yf`7FqsHD Tc2G3[o%?蘟ڵk'bV2շ:vRA:~*:=|3f ճĘ U@ e&hD{&U"590'ez@@{tAΟ?oޣG@@ATX    h @ ZJ4P޽[44JKժUMPTb7GPٳ=}q_|d H򴟷eZ~&PĨKZ|?~oU\CҧOK. VwAtDn/,hZ}M4TcڴiCh*vhg}Vraj}y>qrf4 a)mٳM3qƌ&Oσ7v5hѢ|ނ;vhcM8=1`YF^}СCUohmM6H7ߘPFkxjgwut˖-M\d֬YJ`ڬ7Ӈvڙg}?_gLr@B'˗/7!z]JCǏ/m۶ ݁ @@@AĨć^Gү_?^aĉ  ķq냂  /裏ʐ!Cdբ%3g]FA")88\rO?m5)Ak{v˦M̬3ʚzp7H76/ @tj;Y/zlSohkmks>{ ͘1d˖0ݞeDkM6_>֪UL%r ohvC@-Kzi7hwf@RA)e    @+VLgn8bו .z^}USп W^y%=쩃) ZسV \֯_/zK|Lg fMXY|r_K`F (0xe}R37q. '*7t\pA.]jG;dٲe&!yGCYvL8QFm^:4Ҽ Ea۶m3mڴITٿ8<6l >t}JZj%rJ뮻zT= fceEJڴ)@vG|*p7psq~a Mlz#cǚf 6ԩSC=d%L~xd[g O@Ã5̾k׮2fsz?ctZC    R\bw F"'Lb#N.\?-;D@@Л+/mX  @r hpH4{Wʗ/o:[ΌŋldM[@?H̟?<7א'9:1V bzqƙ Pm%RM̉u #УG3T#f0a^XEjuClq t6 @@gyF;f Au@HT DyX    m֣SK,={Ç%DAo=v';wlRvmQ>؉ /5 :K.-sNռyssn)oQ5@JoPٱc%/.zRңlp@IDATjUFTRń=mքG&萗:@yĈ)S&2dh覆+W,FX6ƽ_O6yaECWZ%|,p-Z$x뭷̍edȐ㪌3{U{k֛/:k[f60@+uUR^:YN:ef5ʟbYz\iۖ-[Aqϗ'NHٳzLϟ?o޳u뼷O۲ @ 84iҘ{W^g9g޽2k,ɖ-[p`o@@@@ Gnݺ٭3fdɒŞg@@ 4Q@@.hlcbn@rٳL0_q<cOԝԾֱݏ7qgZ~g{\ڽ{̵ۅ rYLh{@ t\L8Q $ӧOHkLsbEuֶ*Kj<>@NJ<  z?3f}DW^mi( zx}?Z7,WX)G0!ssΕ۷K%By[p5PGފnҤj 9sYe]ժUͼ!]6Afk[ 4XHbo6?#:ڟԼy1rر>q}:Hl1~璘=`ڬc\,}a@!?4h@4l0yLs˗'_0}fjGȑ&&._2} |͚53Ύ]&m^ft!VROkdO>/Sx:&@ 4o\4V[h![lIq*l unеkWAy_zme3f(z gyᇥlٲfQ̍:ȶ]v=9-8@ z9rJ-,ϟ?_tD;^P;p@ޓ!C$xQF̹9T\Phݺk=V\cX]s5ҥKS_>{ Y{1q!dmGG@@@ 1>^a:SfM;z    /c4Q^לS@՘P#ӧaضm[}MD6ig]dkIeΝ!CZUX:=X<7h,~} Rl :{/sVGjs,a2@@ ?Ҿ}{zB L  I Mj#    mS Xl0Lrmͤ= D\@vm&o&hSΝEފk{4h _|w孷2AIz,~ڵ^~}Z>ꨛ޽{hebE-y9xXl,ݠ~&lӦMFŊs9Dr\uFtpXns.L p9s-`6n8ȗ/h'v!?-SLGAT@?7믿9 馛ɓuVٰa W2sLs*ReѢEeƍܢaӧOzѣG\R֭[g6y饗kun.R2=/r7\\[thpWCҦ e7gd={СCG&\Sy7=S=f@kMq֬YDfs\#?+iYZC     F%F^{i1   QFIVBQu &אފ^ǮR@[K.GEw#Ӻ~=UE F=Ԩh q'1GzK:uxT݉qBp/:eĉf\sբd$oEdz5 x}4imSG>5@bR@+mX  x}5k֔:D@bW w]Z    c+V4AUVIݺuc4@Л <&0O~xXCFaŒ4q۶m.=ٳg ʑ#iD{IMkKU7G,Q*U<ڴic¬YGeʔ1!V b̖- >\fϞ-˗/7M4piӦtFA, 2\~ ܛ4i]oٲejs.=^m֬ٹsj <;p@Rsq)SPb=OZ`aÆIl իgw\~9^`sP5C 1yfY52A:0 G ևU ( :uf]=\f4Sr%=ݼysի ҅^Kf yz&([3gN1c 駟:<@,)S&ܷo_õ66)    @ F;;%oYx饗|l@Q $#z>b RҥK]/^ N]fzLt41򤟉H}1:~LzBnjiw4h`֐+D긁@_zrwҥK66Rcu WHV  $+̽z{wq @bB Dh$    @ hЂU~WX<#ާ6ivEVH,֭[>N>-W[)bn1cDBՎԸq$?~h>)ڵ}R<9iWvm` 68e>ĉ&m߾}f 7 Ț5> @| h[|8zh9r&pO.\X+&n;>vm>w46o޼3 XW9iʖ-+iҤItfڵrQ7-_9MIi}J [{Y>j(G EO6m'OJhѢz[ `}9rxfub9/_gm ms%zcǎkrʙ 64~7@B.itR䩧 ^pTV깑   # bL%}#0vXYr\իWZ@@@@@8رZ7v&1N^X@蘖`d2tI$64رI< ֯_Z}>+zƇ>nbmb @ ԩSǧ/g}"99@H:^':H%R.=G@b @@@@")PR%V@@dɒEjԨsԨȞ=r-uA S6OрC_՛#G_^Ν[.ñ"Sgl٤jժⲭ֬YewQTǿ.vY *(zXP/zJQ EF "Es3f7n6&kSΜylyR M:b=OmV c&MbCw[jBX\n]կ_?A@" 1B0fG@@@u-Z۷/ŝ@@@@@ \~6|lɒ%믿^|EٳglWFm    ta $›?i[y=z֊  @ (+ "sX^m۶!ve 4|ȦMڴiӂGNj/֭[B B:w& 6̆nzܹ3d:4i ۵kgcǎFG}߾}{ymٸqBӯ_?{7\ ybe ͔)S\ݍ73g 8>_|.İ^zϛ7CԴ[n6{Pպ[nzB!Cߑ |l֬Y!gQ_ѣG[Æ CNg$!^{ͭjT#39M ss9t_m,ז *|=T     @vosq*U{.;s  CcIU    +#GK\-[؎;3LF6@@@@@Hlٲ?wa'O6(<裶`5j,X0ZKS@@@@ bt[>C:utSO%S@@Ȇ+WUm۶ٲeL!|M4)I:ˊ)vRJ6avۥ^j5j԰7]뮻1޽-Zdj&%_j aH-O%Z+mg̘oη~k{ŋB hzr~s%Kn|pɤJm1qy繪=jׯȑ#]8ԩh lԨW+SN{+V׬Y1"6ol 2,AKYD pM7>ZD{̊     I \zfə3[?a  bSLŌ    (_k."oь6!    dmB .Ư ?vI{lE![    XAѣW_}}@@ =ׯTPWnO?u1ºtOׯq|vZk߾8qu+V,2 \z?+|ّ#G쫯 _ereM6hv+Qa˗ ҥK?w<5kfƍs:ds̱ݻ+ov޼yPqѶ^z6}t^vXR;@HmK`;]cjl̙.3ple2 # @lb-!    doGѩS'wn$|tdo@b!3P    %Pvm@@@@@@ ; ȑÞ}Y .(tJ}geg@@@&F?3eת뮻tqp   $/Pti0as9n'Psׅ0j]_|EFUצMի_7n{aĀo%O=Ԁ){pʔ)n.LzRe /^l JTy']RJv>6߮];{\֭y%n߾}w߹qjFMP`ڜTxdJy 1(U=w\۾}{A     dGAٜ9sܦW\ٞ6# @ ĘT    jW`@@@@@0E?|DZw^kѢ i)رcǎto@!={Cz\`Ipǻ@(~ 况%iM8 L0)b#FG 8z_ׯ_oz}y=|-[V]kکyǎAO:G~_~ 38Cбˢ?ZY{=SX nѣ)Q;{HZϟoz?ȑ#GzV?5FA^ܛtMQ蹤m      D'p ~cSy衇R  @xz…a     @&Uk:ު@@@@@ .\]جO>f ;%\G    b=i$1ck.Ư F   D& )IjժI.pٳgܹ36lpO9+_|i=Pz*Ul  .޸ҥK[Ճ'v;C0R+oyfҠAoy/܍2eagUDz?7:]f4hgf S(Ozn+p.@Nt_|qmضm5mԅx9t7o駻p~%X{/eP@>=?zsaV@|y'ի aT!C\݁lӦMֶm[?ݻ,ٵk}nBqgyfeS u_}U{Gڙ)O:Jwu طo 7k -U;?!/('͡3g;4.r!|ϟߞyѣΧ@͛IWQW@|5iӦ = jӦ~ԩSU8n&S0wi byJs SС tG˫NB:MR 7Ϧ=S.ћXbޠ)R>Sv{c#Gם믿T)8{\ܹ;&Lp</v';C*T2zawuY+W4ժU+p񨇟}YwWV& q s`Ev*{u}4iOݻ{ka`;"y.HH-}B}gFu N82>@R&pdgT'O&;3  @,[,m*V@b ߬~z뭷89T b X@@@@L$ FYV#YJ@PӍ @v}0;u@@ 6mj.h";rs=믿΅ z@@@sЀhBC|2u^|E֡oL=4@@x ڵkY͛l%KZѢE65x]0 0.\h{ŋ9u~ +d+-Eo=y"rk׮uo^7md?]|ޤ{'ͪG ;v옩ׯw_{!8u<.\|Aۿ[Ά n pǣ()}\ra Sٱc; s#ϭj<ܹ*1p:ww]vuA:4׺RB3pĸe˖ѩ0)y/=Nɲr֩7p~ 5anNcBLH@O< @@@ K8q:udGuۣ)ի%@@ 1> B@@@@ 81E@@@@@l)P\9wN]qĈv.FA@@@%@c|oz5N.U  ď5AG駟hZ}w<:c/KaJєK/?*鎙jժ*+Vp { {|6lHfΠ?noۺuU g ,[6olw#Gv(0ϟD µzP@[n5}-s ppu+r@۷X<כ2pJs>BB瘂x&      @X^z?|{g@@ 1B:@@@@2T6uHRg Ngu,r@ K.Ğz`V@2go> X+ḦbQÇF.y![dժUFi7|3H    bϝw=zPl)B@@  .w1={ `N:ZRb`D&u)X&M߷/b԰ r#3/QYf6bM;v8oĒI"8pӧB7md{Nru [n4?lFaÆ~W_I21ʕ+u^ڟOɕm۶%EW_}eK.>}[ݹ]wuN=Dy^|\ѺUoFh7tG fXs^9묳1\X}*^ch炖yx)]6VΑכueT]౞x ij;ׯMm d ;o'}| @+AA@ Wp|x)]7?D*|m6􌌍{}i  M@A1fF{@@@8~u;VسgOwF  @v 1;}@@@B b裏)AYh)     i. .]ػ֧E~&Lp~KF@@@P'N.` t_oPBc@@@ 2ŋ۰ak>sk#$˖-릞ͨ K/l^ٳM\~QL2on4+{>Vlw[fqNOZ_ĘQ;"    d*~ڝ3Fwgy&S" @ 1;Z     PN.ݾ}{1 @f6m+yh;  {6b 13 NC֮];4@ ,hcǎFY=ȑ#/XZlȐ!v]wEUov]HL<9n>ۍ  ]v+@ ^ɕ+7} !o͠j@@W_g̘aO>yH%*<6jԨpUvm7o ,P)YR@IDAT .rŢqQU_~!ۤ[A ;|[n YwZv4l>nƈVSre˙3sS2@JoܸjԨ?v@C&MSOu~ \ FV֛r)$^{ԛeSgS|!Cnj s믿<5+{>-i n9MUZ%l׮].1Do-naB@_f͚֧OX}t  @| <ִijAVsȓ'3&b E@t 1ݨY    @Z "9rpHA-[lYes@Pgu>Ip @ׯ#ХKkРm֖/_.Ryw.Fp"EYсV⻽@@@TiKd FB2vo߾ݞ{9 2$c@@B bo? kٲeLNiݺu۸qG`;v, / ,ӸR=+"䦵n1~.p! f4hբE Kh_nfͲg}6A;tҁM0˫W`2@ \p+ܱ`XÆ sa J ,6~xOLυ+NNpRymۖqϘFImo*ӳͩq믿\u|*/r:NCzMZd;vM7%jƫ/_PǍ7J"6ly?h9p^ȧ7֥~o]v{~njժ.̟@ȕ+ 2ĵy̘16p@Bކ(@qԩ@Cy< Z?~̙3Z3UW].*:`suk믶tR۾}۪E\ի[rlٲeN̓' R10 E]duqυ۪UܺԨpE=)_wǤڒ;wnQK(nǧf{wu{ g-S k^3ϟowy͝;7dqߦMk\8pǎqQZ5?SlРqѼL0di<23:1I\T8{lk߾}\FD/e+\p$ L@O껭ɓ+Lj! @ ;v}@ԇ^s3o΃yń  1Ԇ    8vXׂyĘU#@ϟߊ)6S+ ,#G$[`-.wmٜ9s܅A|I:u3]/ېk5eH@@PX:AԌ=z ثz*ѷ%@@Z-ZUpg}6A`^jVZpBҥ͜92*+sA{Oټys=z+/-xO>+sG0|pMq [ . \VAfd㏛~cWUǚ~+~WL}mnVXR%o4X_~֬Y3 6$ؚ5komۺcElܸ1dt*\p-YA5ou7obŊ_(ԛm(pP_ Th,Kj7h˗/^rJ5k)[n.Fz9B UME /5:#7 5Ìhwfu\zܻw Mu2ƖZ@68O>@ B}Ϝ I@Z:uߓ*VV@gIh     ԭ[_dܹv@@@@@@ʖ-.Χ. ￷ /l;vrD@@@8qߎ  >? AA"ݻwφ l2   4nؿ_R(hҥfQ6hb#N?t4ikݺun]ŋ7p*U*ٚFeuQ`[rEAlhC) ~믛n%%m?p86|͉!H>P*\o֭.\RF PJtCn-_B_on%Krʙ^#•An6mrNJ;52eʄ[_`A6l [~)2o޼.XB ) vB 5-Kjk_4m>=_.s Vk׺Awqޛ4={^O˔)SGq\LŽ{իW=M_%BuKPI?eu]<ܼKO?uz-Z4A@@@@@ 跞-[kl6=l@A x @@@@ &sּys;L;pu>{7Dp!   @&ߔ8z_?#    |Tn$5j"CH"V~7V) ^ W2Oj7CZY߻URҺ}_eƶG<_Jˬ)ݾ6_Æ ]?;w5i$mE@@@@@ M&Mdcƌqu+VFe:O dA:@@@@D o޼0ʕ+mR@@@@@^j?[oY#Gح@@@@ uyJ 46lVy_wuֆ  J`ĉ[4宻믿>EYpeUVQ5@6vبMBͩfou q1     dcݺv 2J*?f@Ho[!   :(ɓJQ9     Qp6zhkѢuve]{֩S'{嗭hѢّ&mm޽/  O@қ6m6-Ft 1ݨhַo_7>W\PF    ʕ+mIve]v@'<'394-HKZjYΜ9Mߟ+     ܹQnڷo   1f(?+G@@@@:u*͛g1      sVZY \i\ h1c֬Y3Uػwo[|yV,@@ HcR%1>ЫW/;x[o׮]jժV  KEVdɨ]^c!@5ȓ{Mɓ'O4dl8ĭ@…J*tR;w|k*T'n7϶2eXΜ9QryfR e˖MrѣG3ϴ'97q_ySt#GW?ulǎWn r߿ߖ-[h38y'ߴP%X(U)R$ln܏?OSʕ l߾֯_=L񽎝%Kuln۶-eXQ\97߾}lnXǸ9\Q:T\N=T7>r ϼylŊvZw D Uy{X}5i$xF  @ܹ5ktA3f 5j}4FI,pI7Rߗ 2$ A@w}ڀG8qℿP@= ݻwstT     9O?Ę3 7kz_T^uɔ#ֺwm|wmOJEP뉴?o:   $'s;t`t_y-[  @Ę.̬@@@@ iӦ(n%b^mc= @vPgAY>}\Ym۶5]?ڵ4h8*z0 *СC{ڵ~uYz?}~7ReG?),0?O2e[Mƍm̙IUV.IMT:ERx1ۈ#I hx! +CήK!?[Na~ꔔ'ODhzaO~ux )Lv֨Q#+V Sؒ%KK³:ˊ)vRJ6`ҥrJ?/^ʕ+gw Sǟ* t1c_.gSbY;<ۻwo*9b6mrtX`h* Ut@o=;vm۶ٲe\ |`&M mݺ~mSd PAT76:t짙J(ϫ`:waKҥ>u_r%NT_~eAuhRX!z8p_ VPs+VpA ܸqc }5s8z_޵eȑ.|؞~i@@@@@/.5hݶqjA4ttG>C>c%: F!   @ѣ6GzXYdDz d1ze    /^*W(t1X@Q@p*˗OǵoUsq'Og?kѢE6iҤX.d駟Q͚53TM~ٰaCK,qk=/F'Ux U;X/5<7p¦ӌ.,#Imny۩^B$9Q 7Λ7 Q>P1cƸ;ud @B@*U€NJ)'kƽ.,Yҽn[a{\a{2_Um޽:t(0zhZ{i{カm۶$Iĕ+Wڀꫯv[li}GvܹRSO=妟oU^f̘7#   %Wr r/o֭[[ݺu`-T      /Qu!3u?oѪUFR}[tbE %FfKn,X`?󸮩C +Gث$~ꏫj]5j0ý/^N} rw͛vXaf{٫#HCnQ^_u͚5K.~áJ`?;wkTxժU>V?/"Ԣ}C6  @*>cjgc癧E@@ NI@@@@ PB$\HQ VN@;T>sw) ѣ^xӅbQIFI{챯*fzm;wرrm7CGKĨu/dժU6|95]XڨΚ54h`X>PH"yf[~{]W|&bz/.0XСCG:]կ_~g_*`Q-o|wџ Nul_ ={I۠prNrûwv&LdcW7u8p@ YD@;-[悘IjBb    ~~.ֿWΫy@@@@@ Ʃ_M7?fw~әc_E?N:?B~w(=4bcRm:@ QyIwFT\ W?ݪ+=o޼vqGTDX >VЮn)RӃKj0f{lj#}՟WKI&ꫯqvǢp}u\}[|˖-,}4  @ ons_S|y1  @< .mA@@@@`9sbV/!$/PV-7Ν;] FStٳgP{VhQ[p H 5OtbPi=W'+.\؝`}嗻q4 B"):[jժ!I^6#)^ bcaS</Om;x`)L'fx%zZ7wcz#{y7]wH\Tۮ]ܲӦM3:rEbX.Gd^|-˗mvzN3<3~~U9@/9J (S%0DэNW*m۶u&- p:^e>sL򨎂@>{}P}ֺ O>|o@@@@ bL;;w>.NRR #    ę@`eu4Z~ӑ Nǿ[Fo2 ho  6l0e{H^~W_nіhU?bG}Ck׮hbٟW%:ym#@85$5jdӦM -R6mڸѾ  ]ԙ\xur믿LߙlҮ ]%\]HN@@@2L@x%W\ 1xMҨw}~US  @6xM7  t~wgV.@ sT^^oI+|?>* ,T?ΤJ&Ӫq`?PohpSӟ7>ױi`%?~]#0[nݺ?1{"{%8=  9gϞniVD̼I@A`'    @v suu7o[=Q;; @Z *UʦMf˖- `q:tp!oFئ(`;;= :YY'&d%SC2TT$ Pd" DeH|g2U[u{}\>{Zo=zXpyñ̙3eӦMJ… Rtis:kذ7o{ >߬Y3)P@n*۶m .Xo9I<߲XbrJ֬Y減Dz^ֹY\bOS78ǾM3G &{6M%NށS#         @2edɒ%{)|oRh$@Mw-ٳFԘO;1q^#cQ@̣k7;G$@Eʢ8d\+V!z0c0܎{;er6Dx;w ݳgOLjcZct }ʈ?$@$@$@$ *Øo϶N$@$@$ P1\VHHHHHHHR;5jXE_}}ݩ O$@1'P\94l0hن.Zh MsyE, )pO1V !+s巪0`z=N۷O 4">*DAq HHH?K³… eȐ!{,7Cmҿlʔ)ֳ1ixg g.>eaA-Ĉ'ރn}ڄnp<ѽ{w.NǂSWe6\Ph/;cKS/8Ƕ]37 '`>S /X/;wn3a$@$@$@$@/Iiʓ@*&GJ(k9 $ y&`c;tb(z?$@)Mrc뱡nfuruLH+fwNjd,T<{-b:٤@IDATɘ1}+{U"gϞjժ Ij' 48O)EtmYB^|`;vŽn[ʜ9s,",뮳G>kn &ɌHHH ]gyF~Sʯc`kf7DߴS1;SoFÓ;4cStx8vP&8/.Se"%KTCxv:'OTc 1Y&"W 2$Ib )P^z BqJwQ7o j7c`qKH]V9OBw xv&c=&@N:.k׿{ge˖8zٳcv8x1-Ĩ q@g3e7G5~ժUU^fɒE}D?6+RΟ?/ӦMۀ  p5(vIҥ#+WC byшP! ^7޿ڲ09rD L0vEҧOXA.<ۅK'a@ܗ6l\r)5k,KVPbuɚ5A=ڶmh_oG;HHHA"xg0gz!oСJQ?WtoQ/\ {}I8}(ÇwߵH` Ă=^zIc!C0vA^~$=zP4it@gUtxɔ)?SRK[lϿ/ǔ>gS`ap a+s;pJ"L Ne#@d1} !̼wںwﮞ9Uo^~m&,X ]t1Yx1Vmv|ǖn/_^/^,_}/h߯׽j+҅ @ xcU,qm;4 eA^KC[]u9/c"^_qdC]#=Mk{ug< O@#/*>}HdnfQAu~,C+AP,믿ZAϞ=s y 0@ _v {fe/XdH`};VnoܸQmZn^}U by $b|A yb6q}Uxށ͛7O9;#`6bτv~`"&Þ$ϑD.7xcPA;"@b0M߿`, MP^{MNjn2 @ٲe 2pL p fFYJ7a)ք6._ k :N~N<)xf5 )¨×*U*h='ӧOŐ *{k6ml?#;Lb(PY<}fx^~^8=mۂٳ'|7uR22^%I룽\1QS8{ۮ: @$@!F+t_u0 @b# c'fXj '8n %wÄ;nR v1`(8uZc۵k'+WXQ/s >n X!   xH!`9~~/0NֳgOə3O A P. .ƫ>DZh9E:t76zef$@$@$@<裪iҤ3fN}DXc   D%D֐&       HjժeB  Oy2>D{dɒj0vm0S P>A1( ;m4)]}WZN9FEU␈sw'W?N|_!X hq4á \r+WJVT¯ Vs;w*^z3WܼVrR85'|R_ޅ*z`Bj~ ;h 3fC0׸m6=f_0~@Bx׊'NI ^&bn"E"<7H׮]e~K~<;AτVeɒEEH MX?ԩSoe:u"Q80$@$@$@$@'o:w# DAছnݻwL;~ꀁHH t̙^/ puY|E#H8n:9qn##aL3<#<}ϺWyc1H7T+$@$8d ﳾ;5F߁_|?_Wwuۼ|rcj˗/| ` 1A.]l\GSh8G[h^ ~` OC8!1^? ':zr1 h@~V`S~~IHHH P1J$@$@$@$@$@$@$@$6|iᢰa  @|7/^Di 68ֆNn&eՎcRJzJ|m'K,QeS4i "?R$>Ƕ)ٚ5k&ʕSfĈJ/T}!bŊ$ ^1 jP9Ms*hzN_z%y/Ta ӆv޶m[%108݀n8^9fʈmj3O-fss[7nTBX)Xki$@`-"k׮UⅦ!+@QFC1p¨ZQB(8?1-u5`?C4VŋWm޵kZJMݻ, G 1<A80_q<𬈁Me>K7]vꞅ|<4/{958A"SLQ f ϥx>F\hYFMgN JIHH 5@h`mڴI/j/"#GT?UT{QbںBwjx^ӆgnA>_vm3Ŷ Y`#aoHϬ#M x׆3fN ;amQPf ~~Wٷo\jլe7NA,ݍ{i/Qx<=Rr\2G]Ͳ2? x;v(={TNPu{L:Z# @hpK.] @?: }R HHHHH-3g|C# D"jFƌymKʲ Z^IN# _~ry ĈMtٸ=;J,i3Ƿ5&Hc!Ęy#3GIp~s8c9{pرcYXbsן`@+W.Y|9sF[5ȪB B /XAu0vjZiy';kqfpƍLR,"Ed;D#1k{U+rέY؅hMIHH 5 sʳ>+G~[%3k,D2u]"]|ϻRJ9z>^tmlȐ!zG1^^ %zŅI&lv .mis}wA:ŋ?3ڱ_ 6 4 &~:L5!bN^XK,_;gSL% c]g⡖^DqDyWsNr…8P~)N>jvN;* ,^k%K3g'    HTbL#r 8&PV-%Ĉk׮cr H$@` .ٳg+)u<⺉Aѥ$@ 9sf H-[lRFHG 6(n0plٲj4DP/]? |e:^v,# HJ(!SLaÆSN=yݺuiҥK{.T.J4xjMU!Ç[C-"up4n>uK\2iAt\ue3gs>V fZ F9r#^6 E 6 ;w\ƭ xfbu.G]xsSoLkN2tMq[XD}lٲ*2o ܫW/رkVFQ.x<58!4x k_|ժU:u긗8S"         H2e|$K) xEcv"tIHH uE<5 @;wӧO¶nZzg IHHH  1$@$@$@$@$@$@$@$@Ojժ!Ct@F$@$@nصk%u7GHKٳ{Y,M$@$@j~,Dn    BK%Ȉ˗/;Էo_iٲdlذd̘ozCwHn>Up"87l0+NbŤm۶:kcѣG%p]opc]{챒J6zzȝw*.]ڬwWZرc|b&A4kLZҥ}R|yk8 v.O<|Ai޼yy?~/I ?b]cr[m&>h˛(sc&S3fP˧NF>`oڵɹu{L: y&0o D"_:}Oź&M߿          &pu)!ƃ&vEXz  DEQcd   ѣ?W.\XNY^LHHHbIBͼHHHHHHHH‰udriɝ;w p]`*Tz1 xI  xM# H>gkk̙HHR 2a:y̚5KO.[nUՃpaʖ-UkӦģ(9,+VYwJXmٲeEtU5ϗ/Çbt"I͛7^tI nf~gX,߲fnu7VTnp_jO5jle۶m> (n@̙3?Ȉ#tK׮]Gbo>@40[~ǒlᰶ;!p6s Iq(n,Lcƌ?P2~'ooL2AF&h^\T7; O3e$@$@$@$- 6СCU2iӦU;ZO$@$@$/(/G        @Z`8:\vriLHH iNxX`Bsz @Hmo>%^eIHH ^ ͛Wy5mܸQ 2Ξ=7,-xUW 7n,+VXW.i/.9r}Knݬu`s{~fO?`ATR=l޾}9sJ *d`w83-4QoJ,i,Ck-ZBn{'xBn۷o//R6{nx=o$#eLjy9sfyuUH/L%1QO"ϐ!jJMǏW3f)sNR!|ԫW/WI&fUE{LTHvMs bc ZNjEC+<1$         +c?Iu\H ֭֊ iO^J*常h"9w֭W>@zѐM&3gt-M*U' Btjos̱mq};wpX`d] uor:@# g(SPL2E0i$@$@$@$@$R l߾]ϴ3JѢE%w$pwzN 6eʔ tqFAp/.vdɒŊ}ꪫ|v ;w_~Eſzۅ SW"E䦛n YQ֭[';vҥKKs{ tE kT *$ٲecǎɁI\G ,!ͣGsW[}є.[lQy-[Vпa֭[rʩu7|#]IF; k@?މ(S ?4c{ɒ%+0XvOʄ $@$@$`̣ J߄8 $> @"ٳ|5k֔~:ϲ @H HHHHHHHHH @Q١9 @%!C&8~ϔXӒ%Kĉ={W^yEm#Y :(#j?Q6+B>)j(={vXBÆ ޽{[•W^woj3'O)XR%Q7d6mZygW;E;rۼ'p B8թX& 'c?Pf͚%3˃ce8gf[~"h͞n(SիÁrr\B=m<]rk⼍ĪT"^|E%:~xA3gDlqnzuۯm$@$s g+!k֬ϰ$@$@$@$@$Owd6mСCޮOV}lz=ؼQFtRA6mڤ@3DFm O8Q^{5՗kC d 6TY;vT}E}t |$ڵ̙3 [lgʔשS'YvZ8"ꫯ;ҡCywV9r<*ʄ dر!?CVk4eFFD- F|oìZJnfLmܸ‡.]R٢^s玿h;C G 46C`dcէOksm}y'|Ý4i(\̉e$LpN1HHHHHHHHHHH L2Eϟ3gN}A*cƲ OO73c         $'O)SPqF̙3'`MXd            %eb\-[$j;x`2^}Ղ4XBOkd:@a™Byu,`C~8=g 8tm, +!;v찂C0EQP85 <6/?~ܧVn]"pѣʡoio>XyAU7L+(Y\/Lk׮e/ uŹG]MN#5ܣo6d\u{L4hH߼cvP 3Z<Roɓ'[( HHHHR)Q*i8 Ν5kk }kH#*T﮹sJŋڵkKŊU7|#۷o!v+!FR*U.ݻ#6"۶m+H&*C5$k֬yfYflذA.\}[OoVZZh4iD>#ɒ%K"C0ޒ={&o6f7H"ݒ;wnkq0/ʗ/\f\7?dH_~ [16OF[0Yaۏ?4]tf2j}hWhQiڴ  Ў͛$ cƌO--u@7nF%c"9u*֖RYߍHHHHHHHHHHH ^ l۶Mgoڴi~\    %@!=p,6 @0zΝ92A֫W/DHHHHHHHHHHH UK`2d?^VZ%dP!biǎ3W婧Yϐ!r0 'OjBs'N#,(í<箣Gf)\m!ƭ[*Ktݜ:u'9/n˕+O=@47 vo(gyJ~ʕ~!i Q^tu{L4^בvJZjJϔZ0 udz)I>9rXz-.PHIaDT3nkqup4h q ϒ @W~hnû9ߘbrfvF.]B.۷O:uޏԪUK>C>Č`ٳg[nQxgboԨQ#+ <>СOx>ɴil"D` H 3g>s{n-&5kLF%UA &m` @rN,2;I/0/V[h!Xرc&qjv#ˆ ڃX87 j֬VgΜr D˖-jaS_B<e۷4o>!?vg_v#ξ7+Fp%? Vі! Ͻ{Ν;;xBn:?2M4I#1RvvYVZ5׍zvٯP $@$@$@+'O#G %zOT;6.B Һ         D !Fm_~^HHHHHHHHHHH"&.]:O&L ;vLx+M VY8A[rt k6l5S88v_26l.]|9`TpYTa#aI^āip涙\ngɑ#bY)״iӀ  d6PL&Hd.jN2']rŬ[x}.%1mȫ dpBi޼@TW_/G8J'1QHچ:6`=]іR3yGɓN: ɓ'(P@O9iꫯ"L K$?(B0\!^A#    NQF[Z.}dժUrM7pߪ]̙S4i$†M6+hW+VT6l0uĢ'NTW^yE(kҥU.\0~;99 g)|u;'k j4          7s̑iӦbog޼yx TSjX/ >@IDAT       3c XĀZ08Αi$@$@$@$@$@$@$@$@$@$@$@$68B֡C9ަʕ;vՐsSAVX!pЪ  8+ZNƚD!15%a`~Ћ̽⎾7Ӝ:E$M駟ٳVp,ϼj+tCph"S|yk= ^6幔lGn7(a# >sLqmݺS' l|Fr(^בs=亶á>;y ¤e*p+m-6z8P?gH1}g*]p^V-5a=9DNuy8'#vZ. *ybI$@$@$@$@)@ zac- h WiӦ*뭷u5-2#Zl)psjnf۷o%K瞓-[ȇ~(͚5+Yŋ+$Zsl] ,8zQ5j͛&ɓ'z A>A{\}Q0aޤZ4h` xo7nf}GZ_7ʌ{#( zܹs%[lͪ D 4njXG8xW.X@0VQN5kC?&  57 =d"Y4|%Vv}es_\k Ę6mZu_v݂~׻yzDzG7RΚ{4eipqmEǫ;Ɛ$@$@$@$@$@$@$@$@$@$@طo]ɓh$@$@$@$ P1%]֍HHHHHHHH  vsΩPUTIHHHHHHHHHHHH ^ "@pZD GE5!B aÆ7c |[?~%Ĉ'oX_r68݅?mŊ9sոAw8Cٮ]|D'Nvd 'jgbZpf'kO1{sngrWYy.%1S4¹ԩSc bC|sMv=&y huZpR Rgq j9N<;31MLǏOΐ198 f#zD/d $@1%=pG`VN:Y\     L믿wy V^h)SFkrxv' ;*[#Bw-N|9rD-U(V] s^{$]?BUf\R3N8D4m{>־O>2j(ٸq@ P.5"˛nI]gtgL;8`kttf6Y2BL+PbafxsJ}6 Ęe |ɷvIxbٳv}1I֯_?y饗da<-B/lj݆F,YT?M4!=οYf#GZuj~ڶm+cDM;Z_!_~eu {(AQS626nGL__ -ZvF3(v`#e0{C1c\?ejS^i\qo#j!4o뮳֭}cbuyhoםus'>Sdn_Di$@$@$@4      d՟`\Ǽy$XT|    wPLHHHHHHHH A-[Vɣ}DH#           x'`]r*up͟(8m!33}WW{?^겼J`qL?~ZqM2ܝd6w8 T{ԩ3gΨN0Ao<͝;7`_ܘrРAҮ];%"ߗ[Ȩ\r[y |mprYbE3$hSB:ܽ{vB(P.0e{A]j3Hۋs)\' Z۷oqQDR&xFҥKԷo_i֬tE4iINs Gh hg1 6v; Z{wxwԴ D"1A T+W-Ƃ?C9#[#I:`]fBzL3_ b ojժ q2|NJAF|X`}[`~Nn(Ga >٣GyW$!jժ!g {뭷cSmz{mcՕD?|I|U.lΝj={T:?`Yb Ѫi}.n֭%g 7o߮@>Vx=[@(:}+9`n0ګJ,iߤ&Gw8Ͳ8=8zi\8ydBX$@$@$@$@$@$@$@$@$@$@$#67n\THHHH > e|"        W )k:uX1@m۶mRBW`b$@$&8 #m '&9 8'P^=HH K(S!F(xÆ cZt8 ڲyN֯__:>\7aÆ駟ZB IҥU֥Kd˖-JlP;E`T'5w8{lqƍʱ"J(!pŦ 2{ァrS)\3gϥPu{Ayj3RJ>j>4[=zT zv{D=Ou1:A߯ 0p ha3:*URC$_ S!J`bꈿD$@$@$@$@$>S1B% &-[L^9tP~HKRhQUM'*Q=-=0EM_x]f f^ Hn^Sb{_2O tƍmYf>c}erRc䂉}˙3g8P&OM6 XbYڳgw֬Yr }}8rHo]:w={ǎ)!`!T|GZ_{#˃>h gs|`7/qnkZQot6StNoH#`Z>?i0eqn:<0O?Y"w֨Q#&y1  HM6]$8'  "llQ|! pgn߾;Fڭ[xl 5q]:HHHHHHHH< p7+!F$j* 1zI GTh$@$@$ >:L$@$@$@$@$).ze˖ gF;G8SQm7p4mT:Ν[ ԁ[0B7o-(6jk]N|ܹҿ1cE/Bџ{Rۼ掶[o)Q%-g+WT`p4nK)hIes=jzz}]p9Ov~^.gʔI4i &o-g϶N<)/ :`;$M4^i A@gK6mRwP 1̙3n = @$wyO>2i$|ذaR~}S\_MZ)u<-Ĉ}n we9~xXɛŠԃ0ݴ>h y76iz2q8f_)>/ !F̙3b;/_pa%7m4yUޗi>' 3k֬:5ƍeִ@رcح{7޻kV[n=c { Ϟ={-eʔ|o5h@v"Nfx3ls >928mf4n7eGFb].]*ŋZbŊSO=x쑼6lk֬iZ*P"|ǥDV:m۶ǔ)S0" 7ۘZJ7owQLI$`#@!FK,BlZ v]ߪMpCڛ7oV4iD ٳGЯu)x!Ĉ4-zw߅U\SXȑ#~]v9sVu fx ?$4a~ VGo ؋ ܂ ,YRE@[Au]t2E̜2d z>H~g%wҥS\~a3Zy_AeBb7 ["ڥKZ66L&VH cǬesn7rYhXf4`n7Ûa[jx;wcK $'5j*ϝ;WrȑEb$@$@$@$,'K̔HHHHHHHHeϞ],Bx 5 #pK/9 @$@$@$-ZT^uUSeHHbMsұcXgHHb@}Z#>Q/駟&L^YRXҏe5R›'OT‚;v8Hk^8-W-Xټk ֭[t9uq,D#G*REҥKp  8ghS7w#XՋ6cgRv.\OѶG]D>O7ngϪA߹s*(>y''W^ye|U!TD"&0МL_XHHHRVZ)aW3ֈ'GjՒ 6ȢE-r%eڴiRr /_>%~}g%KTLv"mV |'OA߆{L2.zIa;,}RJ${1ywԻ$9)Lŋ~enGߎ۷V'N(e˖ջ}gϞrqծWnKjժʕ+erɚ5OQ DfF>\r]w^ۂ?m+ՈxOӰaC5ʕK>qL!ڐƍFcȞG4:봾fz,s47mڤ}w?!Ls= kۿ6z[^^(fÙ5˧O|C_?d$@$@$ f͚):I$@$@#<"fF$@$z>|X_B>zhA2HHHR# 1ƣ: @*'xkז>H |ݵk.]:SaI>rXlY"   @DB$@$@$iScH   &7o^[,N`LpAp-͘\2E ۣ))];MlٔX Cp_TO=L0AÁ-H vXQBtA\&gΜ>͏ @!`~ߔb*ŊGj֬8VZ%#FpM7{8={ 4HL#:.]+v0t+,:l/3f7oV'Z` ;w@ g~*MW_7]s#D[h2&I!qٱcn:IvܩAl7!D>߻)V+<`Y> :qƹ<2b,Ƴ2@&@sJ֩SqªC 7U9YD@D@D@D@D@D@D@D@* #BS; @HVZz0vи;L(D@D@D@rD[oQl9_W<+9UD@D`Pwnf?L:0tRsGVZ[n]Q"s2bL3jaϮ]&̀6O06-^{-fUTDH fw7o\#F0|`?c歷̜9|swN1{ '@xO1QZ5k'nq,\0v5nmiLf .ZcժUM"#ɓ'Lfx o&|`Q#I2tM~,믿eƌf͚vO{}&uwrf0\'׮]gr~~8pyWCM4]] 1=0o 4^M6ߵ" (DB}iW"#)]{2xъ&fmV܅TD@D@D$%zɒh@ w- EG5Mb-*VD@D@D@dEAonE" "P 6h#vBYUFH@*UxQD@DdM*9U_D@D@rKfϞ-#ƜѭzU0^z7gq瞳X|m۶O6]v ZD wX묳Nl^30JxF 00NI__Q!" " "PH;8}#FS xAe`ͽfȐ!矷2kQ[NأGswM:`l-cvuL1e\xfGuT7n6o1r)t\1[TӗW7¥Ks1;vli=5h$M*F#N; QF楗^2}TG۴ic;1L'ڷoo:udxHW^i0dce˖eBn>}L,O>ocƌ1oa`kI6gqi|gϞwnU );G0fdR_,sTuֵ|of֬Yígji 1}W1/w\1E&a!Q )_mvab*BeFD@D@D Ԯ" " "!ߙ3R9!80n Je?@ $رyW_}e" " " " " " " " " " " " " " " " " ! Oϟof„ vI& S:U*65S$'&˜Byi@$T*f~leSj̃>h裏… M fW~OcϚ5komVZevi'S~Pc6W38_ҰaCS^=9n/--t9fYt"[eƜߑ0rzo1qg^oiQvmkƸvZkP f&ܵkה=La7hD /իWE/ԪUԩSv%keUH;sy98q5㏭nr 6Ɗrb8 'בi}]"3#]XX&M~[b[0V~!ĖY^x% /ж]۠ATy߳8UD)O&}rvi|#o6=D@D@D@D@D@D@D@D@D@D@D#4+W+?ps' dĨ@D@D@D@D@D@D@D@D@D#1sL##J{)" " " " " " " " " " " "@ƍntoiڿXN+" @nL.]̵^kFm@A{a>hkn[Q"5LꛃtСBD@D@D@D@D Tb0SJ馛;]d̯(n?SVrMUW?۶mv0]Lx1QSJbM!pl|zz%Ya8or.^q￯UTD@D@D@D@D@D@D@D@D@D@gi^}U["vmET:ED@D@D@ K@F寣>;:FÆ -kFD@D@D@D@D@D@D@D@D@D@D@D@ h"!hN "" " F=j(ӫW/3dڣ}݆>SL1ڵCItdĘy~c;Ȉ1B3" " " " "Pa D2" "P,(qǚ={FUIJi%@|#ƕ+WV*" " " " " " " " " " Fࡇ2&L` ̴io^lTyD@D@D@D`dX0:@ hTVf֬Y./" " " " " " " " " " " " " " " " " Pn]3Ϙ;ӌ9|fŊf6cƌfUT Et Ȉ1=boa7-[Log/g}ff̘Ѭ@1hРr1 AF tK }mԩSEDRuz Ue.ʓB兀o+l=X2f9fD@D@D@Dc:@z]w]hG5_}YhiҤIz(@ 8t̜934g϶&5jytdĘ]vlh֬Zj;R.\wqZ(4eX賠@q["("P;@tAVZ^{EO;OJQQF+W(R=D@D@D@D@D@D@D@D@D@D@ofzmVZeKէO3t"*"" " " A@FqT w}#eXÊ@믿b2zf6Wi^D@D@D@D@D@D@D@D@D n;Ϛ.Ȍ3`c-[~N\$N* 1~*1O?{;*@zɞ:\D GMDn-R,sO*15jԈXF1!?_~Ly V@)9ry7mQׯonR((" " " y'_{\(&1Nr@&h"z8liL͚5~woW.oQF?vaիul.aۏ?hq6m[6{Ycm’_}ՔiժO?O>$Ϯj_ز?l2vZ]vd,Yb۸uܱW[o:0H^{emQ0][omj׮_}ny睃YBZLjBӱ_mkݺYwucn/4[LyJ]8>wm5uIO?5ywMÆ -k`sz>.;`6|tLo1K.{gsgk:|{o喆{",>#õڐvb {xMtٕ\;묳[pI3i~pM~7ZzLǎM6_"m{apr#\uU4~kSNfڴi{*+M@F?hܸxz> ѣ spUD@D@D@D@D@DZ.1+k6tSqlӦMzT*ԬY3g17pCI&QQt0B &lcSh5UsIUs믛?#w*UX-DKϛ1=ܲeK= _t%q:؊$3I$U_fJ듨,n}p(˟J|~ؽ}ijB.PZR, X"믿wV^._.׳>\eSOnݺY" " " "Pl~3qD[,ƃB/ኍ#" " " c*FD@D@D@D@D@D@D@D.f?tZ9s휝qN >̞=;08iñ` i׮]puof̘m޼y329&K'pDGI&YL֖:}^S/l0C;f.nF3b7`LxmtL*}饗LϞ=1C=dv꯶opXs5};cǎ4!BA8(oӿ?Ilߎ>k,;j,g8t'Wa 8?ƍ+w :a#8pq衇Pb97fAVlpӯ_?VTYqs1ED ]lM7}5{ohW^y曭),OjwO4l֝;w6u' Wf;S.`R96pM^s5֘`{onҲLH|m!aײ3Mf웯q0?i3~s.#gT;b}!J5F "2+kk֬1t}wa`(FD9< )|_~D 4hP,Mv'7/IݑקBSBMsYBhIi#0t}Y7` θ-n܉mMm7e'czG}4v]eED@D@D@rG|7pi޼ylY3" " " " dCK" " " " " " " " @*U ;4Zo=dT]HL`77ճ ~WD8v51Ĭu 3vm y$v!t ,vZV[: |y `i"X|뭷̞{6M`HO6_dO?YS78vu]76\}fȐ!fow,3$駟6R^L8C|I>SLid 40l]X?Ӡ=@IDATHX>`|>SvT?A,w-ƦիW;?nt 4/Pf͚.s5ĵ׎;Kf pvŴj^>yM= 2wyg\(-iRͯEmw3<9sQ`{:u_|a? ,0|0ÜsdQN;``Kp=v`S_|1YM%w &"_wމ0½G['s fq|GV߅v3첋Νku_kFoKaLai0LC16lHiozި:Bs.Fk֬TN@:K_{ժU+Ivi|CLϯj~QWLyTR'P-饗^j۶mkZPߌ5uTkI|T#Bf-} `|Q@~'dJ 4ȎWVD@D@D@D[" " " " " " " " "ely1f(m{5s@uZ@L08°+@}J3`{JӥK>Vc1oűh A61b|G`dc_6ڵwug}ܦSps8p`46`T:ƍ 31SN9| X; ]`4|p9ÀnZqۙ6o^3: ta^ImGyĮ:C nƍLf%`plٲeK+D nB3,1!9s<&N0&M̄$yw}q*sF62KRbWn]ۮ-\<sdѽ{w6W^1#FmC~lfZ(m4m3aD:lذ2Ś5kILZ! |,9*H5@pnp BD@D@D@D@D@D@D@D@D@ M` 6wqGs5\r%fŊ[nŅ>A:~c꧊A!" " " " " " " " " "Pfmf~z@5t06mԎuV[危ݍ7h2qW:WoS|AS~}kYt&Ǐ7]6yޢE [otۘ$@ssCh._}2yUvo=ITWz2s"vE>gHϛBWPВ:p޽Ls{aF]D@D@D@*?޼{2a(@r$߬" " " " " " " " "P `#F@b1$Km>ȼkwe̘1քA21b-rᇛs=7qMΝ3[mf6kԨm)l6mnD}]{:8FVH˗[cKmoM`0t'b1ג%K 3b@÷~h75urya!ԧOktJOOX"r:u)RbrrCOMg֥zM6t 8Gtя?;cǎ&l{M7O F6Aqy%+," " " " " " " " " "'a@ &~#믜S@E#Yлg1n6jժk@%PZ5[7L"F/3AF6E֣G(HO6.sג<])3Zs =(zTt>#-)Sġgy3z[h.:ӕ7tg6υnwRu*nܸq媸j+" " " " ,q~>}h$& #lED@D@D@D@D@D@D@D_U9soVIjj@tΠ,X=|뮻c9ƚ$\<6Dg?43gδ.Vqgzkk"C(wy=fmfڵkW-ZebK[&QеonMtm B\Orq+!dGk)'f[ Bv)Ȫ?<3=[nvqܹL߶#GUcǎ4@l]y}wn3f̈|O?>hǿނ;cPn|Bn3770g} mٲ/b;~]I3gu5e_swm7sii3QN>+Vήoc0zf|͆gʕ o#F0M4_1f _&[xqIX"o0X.m_^wkך[oծy߾}… m͚5˴n^.<`V\zu+T7W_}ڵ>,C9Ė_-+N8XYGm0+?]jUh'xnYNz7o;ni޼߿RSo )ĉ_o!5lв駟B@ϳr-=so-(T5FѰŜ"?䓡9G6O}>4iR~(vcvP~ k׮m iK4t3Gm5kf= 28gNZ)" " " " " " " "sr:uY sС޵弰:1~B+ߗ" " " " " " " " " " :BFȴ+zl衇MM\pAXhzd:B B+1zꩧ6f͚IE5IFy3ݳ}.d>7V9˷,7tjhCb<b:rZLn_uu\veq:X4"啮s\>6lmժ}C/9|pƴ XFտr<LjEl3;,_WΙQծ̅C35J{X?ܘ=|E4茗-[,br">> \>@fԨQCԫW/KI[D@D@D@D@D@D@D@D@D) ^yөSSyTD@"ZjlD?if>cƌ1m0 <蠃⶗YW|lerOtpcBzj93L, N}M=|>,뭧WH?tl[|ǎ ЦѶ.uQA{; X;W~ak]w]{ni tQ#em[zgMqSԇ֩S'n[ g6sOl:q/b!C`ꋉ2s̱f cy޽{L 1/0T /Wv <2dXa|^G\H"jAC3hР8bʀaX&/ ?c[^ ')3ߩ~_+oc\ot (kN; 1:e{0x~7:c_y믿nh9w~/F.hIˇ0#bB;ܻ.8G\<{,L$/;L ;b>` 5QHX0;'}ԑ{m۶f֬#[)îmߠQ̗>;(A,s͈dxxG! *; 7H!oS\~WժU O" " " " " " " " " " +ii%֋cAT9N?tAEbM#7Z4o'NڐFY ﺎ|7*fu94=7Xu{έcUHWTh_D#IyЕӠ/z1jlٲe8Q}QLwߵݖ[n/棞_29!:VͤCwDÌiޢ믿l/6&L0fLǃ d0w2W)D@D@D@D@R# 5\jJD@D@D@D@D@D@D@D 0\qѤI7[f9L>Nu/ ̤7nl` 3f͚7tyĈvp7|s[5kX&>t9bWͻm.m$ faD$6f>XcA /_n;%nc7xo.2՝a˅,Oaēuʯ0Qf"|۟NDvfmfM{om i-]7N f|r6z=hr(R#&7 ?6Fq޹0->}W^y[l~hժm'K,1_~Fc;wAމ}bD颬0a5jt2!AT K.);` .i`gN+?a!h|xV\wufڴifԨQ^k/0gĠq)2:aA<=bc=a {C%X<\b\SsGέKVfBfԋ"ڦ0uDA^A)/bEӦMŋؗ{@jw~G{yE +3Lsv"Vh8W?dbhXd>Lcǎm3c^J{w#>)_]W~ nf0ypo2V!" " " " " " " "P8V ,I0ȑ# W YJS;I&BF" " " " " " " " " "P9 ߉{(6lh\sEF"M3w&`^N|E&:hw)S)3R*_vC.M&ZR>2mk;0+/;bj#=oygbn/,]7k}7h֯Vǚ3UKEN׹n6;aueOG>h9?h2wi'Ctmf=l֏>;DlE:p8۷U913,lqN~Qa/ԺtthX3iy駶Y`.mcPZLљdeȔ0nDN̘1c2V@"^*+" " " " " " " "  t%0X͈@%'x϶Zh3 BGd9_~] 1 DƁhh˃eqmo S=0F_tV?c۝@ =c C:r>0UpR^Y[?Ӹ{9AW,QSO=e 0s1YU3eqyw%Jlw\:' O>N1\̵oayD-sX^tb[l믿La=p{u܃~=z{X>Z'" " A@  ]_|8^{h" e R#P6ʱUt6kFD@D@D@D@cΊ#"P%KmKHD@DH|gERaD{=kuBw ]v9S `&iaSo`JDD뮻t4Q|ecjժE[AСU5b>|r}Z#68͕2xl,\_i=5Ty:&qda; ^{-g'(睰gfCʞ}ze3FzՖ-[Z9В3V_?_1t&R'w7[ӽ(wTms1LSաgaЃw}Vsz~i.mc袐ZLљꮩdcK0̔)Sb{<L@Fn" " " " " " " " )a&M̢ElgիWǙS@#ogxo˗ێTm۶d” 6gT$[FT ^r^MqܹvSb r&L0g϶0d0bӨQI}ο{wv~ws``VYd5m>n'KG0*/0Z"0#td\QֈJRL >tPkƈ'U#Rbw=ڎ@Ž,mwȋ9}]oi~m+|Hvm=s[X(e&(m4o;Ίo~W+@āy*tD@VNJ0Qi1a/Ka$Nc,L{7asY (S}oS"}F[ι\Azd1~VB2FM]|O1>}= 'P~;81Ĥ`.gRq`4:u!|>ڝ5k*e"F#Fg U'[a3x\6}F&85M" " " gVoX<[*D@D@D@D@D@Gਣ9漢zhDcj' bGjYj{+^k(D@D"[ꥺ._cBxtk:Mv~~Gfĉ5`OhW0[La:$6~62tuac]yGb~mE.5;v_| 1V]j2Єa,;>HϛVm֒ck׮&N~Ԉ1+!41aӥDpjA0i:Rӿfs*Fm5eF:L5Q;s}衇̽gX Ztљh*" " "0c s饗觌 {1T2b gYuH1bc̙3CO)#% Dsgy&F#nf3hРa 0 lS:gTDG(ѡCk.HGdrg/0,ҥKs5\n?xD M*Hw^1 Fv?j觭Y=s=:uOm %dg}AT 9r51~poժU0Ir *bȐ! ֥ZeN'iZl&"L2RfF#ϾӦM!u@ ӦMH09wyYHc{߈ 쳏OJcĈ*hWK'˼ |ݽ[!_~,[]"F㏍KafQb`s?&*q |駟>v]aL0C1g}fs]_O{۴i2E6Hɮ?ܶs°sq -TOu3>e?;S@Bwm{y1iF> >k;k/kxϷp9J޳0FJvͻ6@I$Z-" " " " "~J~ Gm̙OЮ"Pܻk ; E8ݾ,<ϛ7/r{oۗ^2˗//wu1;sAkt\ކA ,0 .(N:@Ɍ29#zjٳg/[tOO,L.X]we]'ӰaCӬY3[naw57K,LڵtnR/WR>ژ*D" " " " " " " )uMw}SYD#p~J175k]oڵֈ駟ڈD6bLF4uK+/\m/5=oT"F'O:C9mJ8ͥ2A3Ó7u9X atQڝ\jSmwb/,]瞡'u֡eeX}){VNMҰ㦪t}GH&RѿfsQVHU5j{7X&_>*V8>: \5l}+}4" " " " c̴@%u]gk\Akj@e]r%v:l`SOD] (4xJ=Q;O#a%h˝#V~e5tM3p*&f5j԰M$&,o ["tva8w\C}.ED,c' */0̆.raޚ5kb~`c1&MFtPN*Y]͉i?L\k I3z贋W_}\vIvȴnҤsEY6Ds_|-bTxIJP61`f*@}.n7p:t %hOO?t{@s4bҥ֠y1zb9!3 MJ'vm鶹 !<0r7]ޜx138>8uf^92IfڀI'dfXX-ʵ\s5SN1oAaF 0pc0]p@bw}$msiy{2|><"NSbX3H+6>ѳtyj@"0bk^jڊD!P^(i wys~CЇzF;(o*|oZjwoE*]~ Q=Sc^ 38#RI/=o}ebӜFwt2b̄`n_믿9omq-plI\^[3tP[f4}pƤ7 ƧƇ~h>l3}]6R 2 +su/壍IV/m(} rc\5h ԋEնU3T&U3F'Ll&#ᷱoL8|wW_}-c}/M%:n:KIϛCڌ=zk.5霧T\ySt>>7כBkտ9-߶q;]1ͧ[LXG".z҇iX]Rt^;}0i|P+\jlrr}]4k+S k/]TLZaE8S(lE@D@D <|w6C=;$O+" " " +WE@D@D@D@D@D@D@D@`*;3X6OT80<@mFqm>*vzs=lq3|`01(9r?~|BDN$cWNƝoݭnKosQL1<;:!77n5 oܸ;:`x<" " " ~kS>cK/ >`3gΜT:ʽ{(OIxSox !{ZA&L  }S1lkժUyŶˎR"wQFy"pM7YA+<џ/M^y-Ν;,OYʋ2</.ߑ>e_ețW9昤$M1^WR@hs^W D@ +#_?cU&n뮻[ҕW^i^upBӬY*byp:BWWS^Jzl1wM_3S5z_+=o&$so.Ϲnwq::ZK 7uARɴ|XN&Ӈ7UMgؾ+5_0Q`YNT˜q˻uw.vܼҺKe>>q:D*RHj#mz4" " " " dEkE@D@D@D@D@D@D@D@*!:bJ`kO5`~%Te 0+5jxRK;ۄt?c=RK,1-Gd6o< :,!fNE\4Qn`+_|([_zu3qD~{<mNUf.˘ O'Li =0 6,SfǙ ~2 ^QNkww[%JUŠa?nO{$d"/Tݖ-[f-}˴澤}m;y]wVA4p'FSL1cǎ`˜ڵkg/2!^{q&g6UV-S,s-3L(8Sn?}&äIl{L=#חk7; u?7:gG1f:u5_>GqTD@D@D@D@D@D@D@D,z衇l x si " 8}+GNn;οXZYo[ ə-M]w2}]g0@w,y֬Yf2G5eL~UaiCلպ`tL?`@ۛmۚUVفHv}Zte䞢o}{&M}K,]Qd1QpO} uI]~h-ZdY˶i[hv ^WZ)D@Fi4 1\1_, ,% VP3MWGثW/'ȥ2GI7 Ks!ڝt eyDr\JZ2A3$ZLW}Mj>5-Ek!9:#(_fژv_e]SV #  ꣳ J஻xsQOD@D@D@**1V3zD"Э[7k< <8R>ID@*:+ Guaʒ(qM75k֬1~{$#Fkժl"fd`FY#l3yԯ_~ƙgex 6sLk@O?M6$̙3Ǯctk׮ֈg1( cL># f7.%lVTgBu_~1?ҥKⰞXo̞{Yf{p9cZǎr) HVZn͵YwF9]fwGrm4%mWvh]` oF`aBC;l0k@ G[sG{D (66Q|wҽ{5aD$lyu@| aȖG}v gӧztfmf:蠰$q̆&V+VϬk7(Qv'&oa>}X3i1{N ŀ<؎ewk~m.-|5j؁[y#ƈ1l[yT *|S!DD@&0f̘?  /q&Mdo:d%FW׹лBG"|Zn]k;=>-"5ҽqI>JFДO7 w {UW]eV\i7q{}wqZl6e4?}2߿/}xVS&oL?ҬIx'7"fNAVo͹~~o[n[K(e=o:D﫹\&:f͔`ϥNŽPZ2tx1~a7Nsupɗ5Կ:IݷLծ1,fp65wSU kY+LSGBeHFg!CĒЗ6" " " " cf@#Gc;@V kf֬YK.ɚ#' @d H)ׯ%=1A֕J V:u뮻LZ^c96TO>0\q<!ne;F-e` v=nbRic=f.8#X^pvm)Jxb7~f,%V_7m49a?f+L|w $;b;w\*osP\[a`o矛w1"dx#'xm nXa8Qy򫯾2w_yS6O?;S].?; W^IٻEqDp-{C1滒E?Ƶ@|f͋@d/(!rQD@ȑ#czjhҤ5q&DL1 Tb"wȹH>mS~!{}ݷ#)M3[ V,du׵' 6(.)d>7. .[+;EW 0YLàosu-rȹY}0`@0r~'0n؆LӦM#,"o!9;^j]% c8{le,O԰&k`|wDMEOΥ.;D@D@D ʕ+ cYߓ1d4hPHJH:" " " " " " " " "P jɚ`@P'JuVD@D *E3 w}a^0N?tkԲj*c?QF"*:ì^:A#X Q^-[ؚb @o4tPk"rŬu8G>9D: rEt9Ԅm 4YKo2vڸy!`8\\5p_~['/^9Vl_<ۋ-iw"uVGv3fI3#O>"e@6 6Xf'oE:evK:ƨ -94zj|v4Mm 7`Pࠅ"X 3f-bK6 իMQGe7aܺDT2"AT{AᎠXLb(D-7xcJafW\Q-H)4]p65unPL<>;<+w26oNo)tdkӦVM 4~ږi㏛q ߕo]o&bĈ_2rn~a` W Gw0#c`嵈1w;lZLy׎8Xzf,Ynsvmg7|҆M0DE|1m" " " " " " " c̴G<teճ:OB;w&ѤIs awA_pDyE?vhjm G3@IDATQ]vMҧO{ɳ2Kz^cΖ239N+=oTntߙj3mwMcvb35j{0 ~}@c`Bj3el4/" " `t #O' HB`$۴ID@D@D@D@D@D@D@D@*:tNژ g4P " "_1/؄va'Q`ّ[o9s5Oَ;h{Nw\n5Aau!.M0r-C;CRFu=6g[o5t^b{i _uk,;3qoQ:g_~ylHн{w۩~e]29w֜("FܟtIe:6a #Fl&L0e!7o^ĉ'zy6ڵ5s4۬I?8B-kv'#;5Zd޽{U$h۶=C`!2vMtbtC W_}4jȊTxjժ6M:2|bسv Zhf 痋uYM7d[m2 gk֬b*?uNHe}Ƶd?1Ǧ|L!1rqyd$bCyn̙cꪫR:[lax9r56m}d磏>ڌ;6|r(vcOb=}s!Gc*L ֭[[v%LyFF|1#k@OnM:1(Sm_ycp DN<^Oos/R>5 T 0f0*ؓij3+D@D@#/UdM_|Es%w?r o.dHO]F0݊P8<ޭܺdS7j]$^msSޛUm_)& ɦ7 RQ~w/o^xal9z!l^o&31‚>Vvlu/嫍6 '"Pֿ.J'" ǢV/%Ϗ &owuWq2Khb9:J͈@ 0%G76hoi70 HER w:蠬S@p b0?=(訉wa qB)۷7:usQ6Lr^z%ӷo_;3:ĔM6ְ(C&MAcǎcgH;\\N(ҙCoȾO98ռ\::1i F '46v#YЦ V s0c6)4h`?S%&;Vј!}GA qus1n \yse|!.oX#G|\lfn1tJGKLC1q$0E`Lc3?/ƣ@0s1wm 0ݺBO֭k 0[5kp^nᆔJ{1&wߵ`]_̯~.h_q7߅#c:UG)mfƘ )jժe1SEC\2lr6j3M 1Ak&w%_q^u;(r u&(DŰoNW},kX]Wz^_GOKmͥ7_SyE:d[\1M:eRԒ1,Æ ̘3\}ds,-iN Bp)5%L-+Z7x>+eLGk-lj9!<3ΰc5v:?39L4w1n&k+\:Z(p診lT e]f2e[!" " " "=UHeD@D@D@D@D@D@D@D@D ,ۄN:"`an\TWbՆA[c19c͕bWte 0:QVH{׮]kdPEz"7:`@{ (V{1Cgw&c `2#\nNJ=wJ#?:ɞ 1FL/~ JN5 q._0Ю]XvTl v"f SOY`]tEfe}זI" " Y%0rH+4&SL3 m5+D@DT ,I;3**zGD@"  /Ϙ1#'3zgKr 0\`;"RVN D  ۱cG]uUi]x椓N>|8qb BGm̝;vVnZ6y晖-[c/\̽kM\: b)U_qw}w\> aL4Hh11}tóo߾ei~Сfɱ" 2L4)L뮻Κ`wn9є~WsѴiS`h Io^z9bVdB΄9\[qgnXm]vv W! 煠c@ƍm,wбD@D ;lnvkѾQgy&?bر欳k駟n0m4sᇇBw*Jҿ/';.Pt,7K SFz )I^7Պ'귔h*])jм5X6m*>25R kԲ__ ՙ\#Q4w׻f͚fժU/vmgߡbJB+EK]v0B-'# UvWD@* X7.feaz@L[/!D@D@D@D@D@D@D@D@D H_5``$P(SŠT0 JJ JoLtB M7g@^T3 F {層k w}SHY$U"8EKV~ 0wٹ6/eHhL-'*_5kf?QgTnyI`_% 9#" " " " " " " EqLb.\h^us 7SN9 ҈@0p :aGnyM ;2?f[o̻l0/˾)%˕)b =V7xavL:1elݺul{0=W#F-g_3ټ뮸?n9тm۽V[vFlυu-^zÛp,Z\9(#KW`An߾+[L8Q7n,v|^7Ϙx@$@$@$@$@$@$@$3zsi$@ pk6flٲI9j裏↿,4ݯ<Hn[n]jt9ξ;׋k%|׫WO<ιtN΄&M*oF'NHӦM^ǎչ,Qq G6vKxxV'      Hf$ p&5 Fs|$=g 4K&HHH L0A,X6mZFu$@$@$@$Db "|M$@$@$@$@$@$@$@$jժܹsGnY3  o RLLTJ*YJD$OnYƖ2`"  g̀~B         '0bYl\pA -_\5k c HC<0bz*e$ҍ4i(-Z( u!Jnq}Fs-2e28y\zՈVLc;ӧOlj7)aQAm۶ͼk b=z QƵkʽ{TO裏*AFys ¹N:vOӮkq˖-q٠A8v8p~O>Aj}):tZ .,:u]J֬Ys{)Pwm1       ks޽k-"(!9LQrL&#f$=ABJ$@$@$n*}DdΜ9HHHHGBc˜IHHHHHHH˜@ʔ)Fa9s:tH}zhu/Y3&^@$@$@$@$@$@$@$3dɒyP@ pJsba xM Z0y H {6N87z/a}݊'c~;̘HH" ur="7 g/s'       c 6TBhºu(U'      @ϔ9 ~Mv!p@~Uɑ#,XPWTTۏ>I8}̌l:uJ $O\^?Gl {;wnI879GAYfUjܹSKLLTXQ_tɩsygyyiO8!WJ,{YC`Y޼yEÇ+;y'0'B4jA,X` … ՂK,$[[l۶-N>b;wĹ!v]HnDڍa͍7eŊf6ܟs0]t*U|8޶ u/93gL1HB@9A bRHӤI2P)a,ϙA\A9mڴ*Z0kg9Y 5Ӽ1'3 nG3fdzߪ1HmsɶEC5 IHHHHH‰Rlp2J$@$@!KĭZ2֯__ eHHHH P1&B$@$@$@$@$@$@$@$`+1O !ƾ}ښ?3#           p$`ƍw}Wn޼ ݦM|AXJ*  )֫Wψ7eիoh߾l߾]B4G[Q;5BİRJG#v#uqD !49p@ʕ($D$_y%,#aRjUuO?_~YTa8:ޓiӦyt\f\DVvmٴiSg/n5J /"Ap"^J. |w&FYzƎUfI (ƌ#*TPwyG:vhB,DzGǹK ѣGyZp ݻ7Nʔ)g?G4Ooݺ5NEo޹|;w*]%X5[BClx7oVbʕ, ǫ>+i'OS\bkҥKr}z PqdAXٝČ{:GBw~"         @>}͛Wϟ/_7HHHuvLI$@$@$@$@$@$@$@$6O;vL'm&<[19s:MA=zHҤ :C /_>xZPO,p?i$i۶2,RNZe/ȅ %K8[!-(P@]&R`,-Ĉ6‰?^nݺ%̝;aɔ)S0+κɒ%SׇwȨ+?/0o۶M^*8'lѢEYzdR}J+_|J|}h9Y׵(Ę1cFgVZu1G2c zذaF͛7b׽gHnxL?={&M*~xNA ܓ~a#>7H1'ω… +1sɓeر*2xǛł** @ɓjY&Ԫ @@ hh(k׮5kV9t,]Ԗapzے'@ jժ*$1uxuvæ% 5VR nݺxB+}ԪUKe&^q+!L2`@? &HJ${K ! q@Zj%2i$&C RhQիܺuUr>{liԨdΜY_#6gΜ2ݻ7ސҥKK4ib/'O{+ +޽{M6OT$hw.]dڵ:ӵnܸQUu^N5uٽ{w~C QUj^_vi!9sFn߾-3fPa`Gm۶8Madɒae*;@Z@6.L2ZykLP7gpYU'+[l *!~yfV} #'<[`ӦM5E|?h3;a\['PxqMdĈN:裏*93'{*d0!:rSH]|0L >L|I֯_?`9 VΝSFx p-~S]׌עw D<1Ex ۞X6wu2sA|%zms<Zݏ>SM8Qz ѿի+sѣGU_cL 6 sYXs% 8{g}9rmcNs {'\ae,Vo!~{6 0QT)[ ?c}دhkckvz,cYEw>+1v?vMo;vnb<|rJ5ٳgOɑ#`ԩN``0y٣[L$@$@$@$@$@$@$@$@$@GݻҲeKcj֬)ƍ>l1 !PVHHHHHHHHB`™ I![iVHHHHHHHHHHHDv5k('sI`ӧ 8P W`'p| /RM|#_Ox衇T85gXB^~8Cq'슳];%kq7n(ѯ;- { DF!3(3 wpP[rebz{9yoӧU0_8xvb3!h6BxAN! G]v 9GgaHF\[o*UEپ ;KbbӶo>U?\fϛ7Op߁3ڌSNqV=qjc駟bbY.!Zrxr)S8}|Os8… [i5k9_\ (EF!j!9.'OFVEt ӗ)SFreˌH Mm;X[(w9sߥW\W% " p Gfk1&&&NU<&@ٞyOxWB6ƻ2KM wOӍH_XΝ",@t˯ЏkJc@?_Μ)S&QfH qHs9J %CĦgشiS[k q29r0?:*YGߩCSx~Gm۶M 4k,^Ϥ .cYvZ7mEۭ5>ŋd}q=X~ɚmǎzFK.qZ|cI&xP#Y*Vh΂QHܟngBl2 D%X\csu`   pC c:!ӂf2F҂G`ȑJzsM +G)3_|auMpX-CN:U+洍Vԩ q,UVU0 N8;iپZ.qtqm lٲ%Xʼn'ʧ~*|Wr5i⌎ē!(Ƕ'OV8wHӦMkg7p a 8hf_<[u-@֭+ڈCw=!8DX'i$DW]W 3hpnN GfD,Qi3^tUxPG(uL(oq;6Nxoc*T sMc&LP"jFpvR-__ ﲟ| VBǜ|46c K>  bcceRH%f7tPX?m۶jl:ݭz}Y5aDy#kul@%rj=zT_&ݻwo߾j0p= ^7}QF\rW& G{fa\ D&3fc O֬Y#l aPGVHHHHHHHHJ'0&^Zrʲp &pG4(6HH , $0߃ayZYi  * M>]Ξ=+&MiӦI:uVZ\ɒ%=+7ok.i*:=0-<ѧ7xC9q-LR ֧OC lν1~QPPsB.^VTљip* k׮8^+V(!ƞ={ʦMy3wZ|7p8x6LHW{lܸQ CZI'BK.(D׮]ScBǮzK]S;vɿ68sc] )QH8oҤ U^] @BHOjJ9a%8'ID B@[ٕHjzm\bѦ-ڙ1cF췵<6u'mk*W\JNkѸ~AX'ԇaџY lwwJ)7#ξ}tJsy2jӗ^zIy%܂k?N&!#kbZLÆ #HffX6*E{,BDc=O8K!:8ڷo/˗/)21c(X֮]ۣ2E2>^z,;WcsrE:k_bŔ/[L8Q37s⌍Ac'Vcczc=sQ;wٶձ55O+tNjf܄ ȇ~逸RBRW^T43L]qZ7ߛ4   ܾ};A bb  -ofL$@$wˈy Ǟ%  `Rە0iI$Ə/Xh$@$@$=gm&    E4x h֯_/ʹ}ŕ`Vsҥs1BHjժ.v/!F@];pر'~4iҤ8"q㆜8qB}@iFk?uY-2姟~RfaP}PNn4߿@|f/m_Uƿ̝;W83re?8t4QEqb.Ԛ B|v4Ν[p=l202qCH++}pm]t;.f"͂(p aF|OEu|\߿Z*N5ÁnO<;Y`;fC1%]=-UzWЛ6WxfPQV-ɓ'vBwРA2c Uug{_"B^/ۼyM^hQ"7kv8 *27砓={S޾>c `P{ojԢcӦM׿ "X^\@81';Y@}2f(/cw?Q׃5N˘oe,cNv\9C~>}M_ԛ[![͛Wm]B^0׆ck|عXq&FJQ;qm$@$@$@$@$@$@$@$@$@$@$@$p.8*O6Á9ž}Y%WV'eɒE9J4i իW*pCyƛvJ*l2A{\YΝ(ڸtRٲe`CmÆ ( )V9?k}W1|Ŋ*;0P@IDAT^f!"EABӦM:5ḵ@Jモ˗˛o%J$(Q7XqΜ9h"cM !F<; 1Ղrf!{)AbSҊ+:V!޾pA= 8P9 ϐ!Ck+VKءCTW*Giq #C/B=!|r#;wo޼揔)Sb"zFnкuk (͓.]8 of!Fo»լ}s4L2)9r wI˚5/ȑ#pB9ydٳgW&ݻH/⬞F$'x_o@RRF6ڶm~+W.ڄ߻ǏWƒ3gTٳ5 nC Qu-zңG:tPԆu2eܻϜ}?]1_]G $ e\%|q. a}!x1ȸaÄzKŃ@ F$0HsB1du*իWW*5k֌W0VK9駟KB,޽{v*vk>Ei!F9>Ig;)Y08:GshcG3qvڲ`b3HY;{koF9-^XxcO=&MŻ~Bd2\E 6M@UdI?*A?n1oZtI@%J 믿V}: ~qgf! !F,*\,Y2{lgqve خ{)S3fpԩSe_=i{JW^J`4W8sq'_3ßylX D}1=Ɔ<^9pɗ4ZK'V5ec\ޟ5m:ϭ]koǙPwWqWKG;gBq %Gӧk׮ڵk$IixH *,4  FƳ6 +8,oӦr ')sʥ H8bYhO贓X8EŪVj8D =lܸ?c2qDI25Jvڥ`?T-Pu',\wǎҠA8Μ9ܹsn7!(xM4wC"cN8իW/P˘1cdRX8?>6!T8vf sLg.,E} ӆ+gϞn:9rӦM~رcmGq2 *z{//bwcǎ enܸ!+VklBPB խ[W~gk;VRE9MW_}eI$e$H~@@ 8y[gy/!4/{~A jy[gmľ| ,YSu]u…D *X CgkQw9sHv ADm޼Y-:^~x/pef!Ss[n u8j `u/ygvXO? C} :zh1c :TsC[9HsB5䜜-sOD{91'_hHku,AX7s{_[^}vg:+ȇ~(ݻ<#G? eժUJѮv1&`[ch^ :t͊V$@$@$ H10>: %{ΥKJ̙-D$@$@$@$@L# @  7|#5jԈI$@$@$@$@$@$@$@$@$@$@$@$`@te˔ȠN9`%K͛7ԩS*y޼yfU 2/Փ/R֬YyI۶m#@1u]g;8;[^Z߿twXB 9aB pp߽{wq"SYxքjBT޽+31._,pɭv Pvǫ… 2w\>}?~\ pڼys^Q52 2U4k9Y@#ܓ S-¸uVA_u > 7o߾]aڵkL@$`vD ²H[ފO>ϟ_T- .@V…P/u7L0юk.#~ٳgK6mTÉ'\V&_|XRH4 2N蚩_GDo+ ر 4Hp^zIj:>f͚ɰaD#cvqgLBm#wl 2Dƌ#'OVK/̙3Uh$q o0Qmb1B}z걱@V t$@$@$@$@$@$@$@$@$@$@Musa1IHHHCBRIHHHHHHH@&M#rJ 19dI  [N&LUgIHH86mJAKHH <Ҿ}( >*bL8_qVZ)'#G\n߾ҷnr>&[b/7Tވ)RD1C7mξrvC\VBCS>pngONqMIpA( W m6%0$IfѕӧOKRcȝ;޽{rY2gnз*G+E?S6oGr&ߔpyz] -$_s<;B}$3r&xy2MNs̩yߡsΩ@׃呀E;X0#?^i !"M'РA%ze駟Ԃsw$@hxP?EdzzŋJ N[zuI,c2*gΜQ_)jdX?@=c!>ÇK߾}U3ީ˗/Mqn68[;:!AayySkł^9q5i<KOӂɓ'fhkSz2V5{|̗1==Δ&MiڴcÇ30!sJݘ(=q Hlٲj,̝;W->f$@$@$@61ƨh$@$@pႚNJ1r`/cF$@$@$@v @ThԨrBgp6zh7I$\pܸ~V @ 6~j\ *Wyd$   1O<.7Ci˖-*%KZ($pxbO$&&ƻ>v옌7N@ݫ5kIyr>QଝzP+κVֱF}ͥVZNiٲꫯ(PY!F83lucp8ųB0<2d W^ ȀgΝ;{ǟ;v}egcC40Lȉ uW,TEi罸3Nw.o6g4he$(Q1PY G K,RfMؗs("VH Zޟ6m ҥK|]%θuV%9shvHs;հaҥKJlŊK-[LƎuU^9rz>8  n,>}//*a0gjҥH)ā`?,ڛCwckiX|Lnݒ3gΨہb` Fv`ߺ]$Ϟ={dÆ +9 @8~(l>L$@$@!Ku![7VH•bŋ uԡp=7 @H-dIHHHHHHHH&3fU܎9ڔ5!           #~)v^+~Mӧl߾]=P!ʕ+8 (]<ҧNr3L|;}lܸQ9ÅP%O\qJ*j > TγNaŋ;F ~(g3ﻼz#YXAFFFT[0C/,8ǎBLj ̖$I%;{G$@$@$@$GڹszF "*TpNǪ0k@89~| bbzM6RlYYx wy8P>zhX cNX(ǜ V|z⋒&Mv7N+dm3ck5>˘^RTݚE._,8v:~t0_cӭct^l5 @;v͛W_Dj.   Wqgk+Xo        8 ޺u*mٲekdC$@>DA$@$@I &&F9q88+: ' vjٲec`IHHbSTzPBJ0‰DXu.kիW/ aGO Nb׬Y`T9aqʕ+ˬYD; t<ҬY3$%N6M-YfbŊ)'N_)RP-슳>gΜ̙3]k_ùɹ+u'O%4w!D`ɒ%)'g'TBc|衇 __]F-5kȥKTtؑNou Ǻ .cǎI*Uӧ͛7˯*x}VK:_X?^׿RL)\`"M.*izݗr͙ J bp%cƌ*SO=%xi\0` }ocYxnGNmVTI0&_KjXc:;yr|^Μ9" ;v̛7OWaLo۶mQc{q,`ߺetAIx9%Y( !+W\nktRS8 @ @|O/_ LEm?ZԨQC9eGyD)8qS0 6m*ŋW@[\}FB;   tիW]vw{իWAn:%g‡@$9%O\ *d;a̩ps) =bD^98 /c V}e+H,Ypzo ;0:AǬA['OVm9sj+ 4Y1I$ve|D5 } FX @p9'!8-`$@$6l Ʈ cfeY+    E ?&           ,YR8?^ଗF$@V pqFI\3f̐nݺ 4  DhuM%<0~FfHHA`Jy2dȐx8$@$@ׯ?^ q(W]#A<_nk &@ +111A5g7ӧO+g,,I(`Z~}οEϜ9?s.wܪ]~`.]R|gĻr̖-`|;b ?S9".\PBx>(P@R7;ץu$?8 S[- q%K2=~p]6\ҥS)pAKO 66Vr!x™ŋPYB|\t!B۝fIӄ $  pJ(ڵL>(UTQKۭ[Yf_n۶mZs)|@ԜcNZe+VL#9u,JeXd̘1n?ES{[p1~M]Whwz]mLҥ̚5KZx-ΝSch_۶merۏƍ'W%|ҪU+%4IHHW[rQb#  <w>9<}w|Y" 6aP\zUUt2tЮ4kG$@$@$@$iR2         @-#&حXBw]M$@$@$@$@$@$@$@$@$@$@$@aNbDB//1v89:,2p%q3-pf p @j!@kYVXLRJ.[)jYv㺴E/bԒ$I::f4=㑀@L]v2e},]T:u/ OiA5 @H:\R1~ٍ7;vHLLL55XsSkK8d Ff|Kҧ+f Ql-k~ޤ1 [;Z˜9ԨQj0/Gܷ HHHHHHHHHH | 5O>!ؼysyw·A9 D 1FfSIHHHHHHH!aÆ̖-[F!F{2           )O=JJΝk)m0E[{ɚe@}3A΁RH ڷoQE(BFtm 5@D[a7.FV"cXΝ;K&M$ Zhko@`ݻw[7PpHHHHHHHHHŽKyRu/Q|'(Qk +L$@$@$@HƳ6 DL2;wn9s|rMI&Oy21 @hsj+.]:+ɂ&t 9 ,MRJ'O9}lܸQ\"3f t5X J67HHHH NZV^-e˖UB۷oAɨQ¾ml h#uz@8|Ҟ5jXI4ޠf$`Y1I$sa2          `iVZ)S&Y|<'   =h$@$@$@$@$@$@$@$@$`&мys4i_fyġM$@$@$@$@$@$@$@$@$@$@$@$On=tNm 6oO@}`93K!`xe̘1ҥK02I6<0J8     '5kVYxԬYS]e˖RBo[@a@ ap $Q6m*111TR%K邙(L,7HHHHƒ{<$@$@$@$@$@$@$@$@!Fz1cFr劬YF/;I xArƍ8)'O.yL2 wdݻw;;O>}Z.\`Zr`N۷om0̑#vu9s攴iӪ(>r=ER`Apٳ?-ZT.\'f+<=QE/VK.^?C߯‹/nB'_~$W\..sT=g.yUێv{9G{p`vn A xdұcG0aBP3h 1b4h@֮]:DCxOw>o+Ft}28        !P\95M6 Gd6gEIx%NXorM$@$@$@$Ax Yd!C8k,֭[M!     %KLorM!9hYfܹsKBפyy%K?w1q޽j-波 *ěyx:QCXɖ-'he޴y.UP!ב pSξB_~/9̮ .aX"Ely/!?+sN|rƽR:3uܱ:̓9Ț$@@H&MK3HHH"l5kL J ڵ;6 @cԝr6HHHHHHHHI&Mʜ9sp5lЎ @SndnZz-51.UTq vu9=o>iٲpBzt]zeԩjys?4C̮}2w\ǬU^C'v޼yҷo_%s)SȘ1cLK/С|7* &`3۷FڵSi+iժU2!1Er3Lԩ,X ^͛p-vW, 6(!OǤlٲEjԨaD6m4c߼@K~[7nl>$vp6g?XBծ][95 Ho HDgaog\ W 2%Xurvn?رct; HHHHHHHHHkg9rܿ_mu<B9QDR-փHHHHF܄ N:*!Cȳ>+?X"     '9gڜwǸ&سg?BTnҦMsP#toJ*9qC/iӪcbx:Q}ꩧ_n?nhe4sz6a>p^},cN/=j>gSξBV/Cdjժj>}ĩygJaǎ3x?+"'p~fϞh>nV;vpr~mGA&߆+W:;[ڼ[gud h?>gW4    $@!Kr8#Gq͋݅ Μ9Q 鴡}} N2ʕKGYϫ_LVbŋWpn/^.ZH )e˖-^׮]+"׿%˗W7n(˖-Fի%UT*U$[D U*n\AsҤI1e:V gsT ڶmۦ2dȠ5Y-ܹ#xgԩ!3)gfvHB@BXHWgϞq Qaz          hB 1"%OQ{L:(:5!   ]?#GKY$&     %yg(ĨIp E1/r5/byK,?e0._|.:>39Wy+WV8ܹSnݺe̻ XǺ{3170їyӣG=zy޴[_Ɯ2eʨ9ܸ 18 \tVK<>qT^]̓ږ-[J|C)LF>}:.Ǘ:{ܱ۩s5 I"@׮] a1E+zCqIHHMgϞ37g ubΎ)IHHHHHHH@ģVX0IF$@$*U$ׯ7'W0٫m۶~ClψF;:?~tA߿&Z*8&=zȧN:O/] 1I=I$ n`rЦM Bxf_]hC6lؠ.7oެݮ{=ܹ]haɓ'+$Cqǎ"Da4;OŤ\ cvW@,1! vڲ<0b]vYf`⧣}wAZt֬Ym{ؓ|H tمF$@$@$@$@$@$@$@$@$@$@v(_ޥKQ‘jp n @D4hbDƍG!ƈSi0QkCVV-ChQGjӦPmf:k    !VRE5B _u4-!     믿 FG#P! .T1Q Z5̵?sܸqDq [l6kn._\h+*\{F:\81:DG|j #_~ӛ8q808W7QF6<;[8[E %     wֿ*S     $@!;q裏}ߤI# 2HѢEW^ D̙3Kb_|xbN:IҥRJɳ>T.VY] Wo,Cqog,Dd%p)S&)^@>ur}a=zԭ[W/)STf͚ɻ+NӢ,]!C8ty}5y k:t%Ks\lY qgV.O#        @ӦM V\ilsyXi$@$@$@$@Mk׮F̙clsHHHHHHsN= @ uRjUUb!w޻wOPxczk ƚa/@Q֬Ys.]jFv8q.Wj+!gӤI#իWw%asyQb;|Paz o9sFn߾-3fPs;3f(m۶3:Sl25'~|B^9Ν1W;~xVΝZ5֗:ݻWڴio ҥ]6^ǏW!*|s2̳0`bbb$myKQdod% Ɋ 9(EA "1 .,IDP1$I0ɂ$#9|[mܙ3===sowWWLwTzs5\#O= '  >;vHv-޿i߾}+IHHH\'! ,)S&L`Dh$@$@GOI/^lMȁR(!DWZ%M4H_1i/_^SaR:&vCX v 7&Áef̘Q+%ԃ0A !>d ޽{& 1kԨn!LX\9VtBW'O?L֮]+G̙3Kƍ?Lv?s挊K{ $8-\P NWztg~(uw]D?K.~sA'1gu[Npϲ ! k`HF>/kyuE;9C[7k,u@^xL$@$@$@$@$@$@$@$@$-[6!߇+9@tq=    hr>:Wbܸq:%u`Y$@$@$@$@$@$쾆vDo<Yuu2nZJC30 |dϞ]} FK/ɝwiǘ~"qW-S!Ɓib5M(@/f>[ޟXrǟ?^$@ye8q۷L6BuN08t"b<yO(Q_ÇK^46n(vRX࿊)RDJ.+0 _pn)i'O"&C~s`Ϟ=n ,,Y"={|\^xA}s1AkU. u2L|nIHHbK`.[VyZt    dt+#C$@$@$@$@$@$@$@$@H _|b0ꫯJE l3 $=/jcʕ}2-_ 12exg+Uq0LXťjժާCx{!;{ND>&sSҍC2;(a2/W]ÄqLUP!,qg/ 5kV5̜Ӄ ;*0K hР63ׯO86q@IDATc}m۶q9; :vyp0]cÆ t85 dpڵcB`kV֯_/wuW, k?|>`Xڄٷ_~yp@#Gw:5pγ[}         w ƍk'5ciH *`HHHHc_0ol KƲefv% pE ,_,|)Ś@wO >̩l8wNٸˆokcǎkb/`q9˖-SFҮ];{r݇_3Ī1VfMOF۹s cNw T v7ψp?.Y9T; SNMӦM>ޓ!>&/0`9'N-[Za; UREf͚ΝSD ' 1Hanbmq… >} /*&8 NN݄)RD{=W_}aa!,n7]NubqF;kFؔ)SoB<a(BTF!|%  O\ x<s^PxH$@A8|%0.,آE 3H )!CD~R|gNKF $(33Aژb`>fݺuDI`|KZ  /8+¾s@<wM|˔)>77} ξڑ^ש?|̱{<&pov]hBhrct"Ι3GEXb~k_xꪫ558p;Fm8"M9 `_c1DP#ŒAиUV fc2T@[̳ٳstR`e D@˘sܒ ĆfMB ~;HHHH yP1y%[B$@$@$@$@$@$@$@$#[GyD'AqС1 % -]pA 2 $XX1b}.؇c 0x'Oy"[b Oր0a7&޽{C=G2Bޓ,^C^1i%BFXā&EcR=~<2utŢfr8D g%KhvW^y7ug1 . ;}|6l ^{=k~]+ !1<8>|X)"Ap*f ĉsN7z?̻=;8‰Fa2|A)݇-bݙ9s=Öw7 W^yE Q0[h۲eT.hD A'w_>{߲zJΜ9#?3Frȡ{?˟Sg'78kKpsrz2y;ܒ G"qo3O'3bv@k+_\wu_ԩSg5tuK x5j8A,|gís8&ŋb"XO"LЗ"/͚.a4y`.m?}   x7{0)Yd*HHHHBBQBHHHHHHHHĠ4i"WǁJjժMfHH i lѢEDK.]<}@{ug %'֠A<},]TfʕKl$oiss=ҧOBZs^z80If͚Ntm,K,fC YBXL X2 u{Q5)YY&*gapf^8b ;l- ଂ:<4NHcǎU# *H\?Grt Hٳ:*g;NPvm)kUTQǞx`eUᎿg9xaqx5pFeᨆw-[Ⱦ}Ta~MXx-۶mfmELyfu0.F{5c#  Kw +E$@$@$@$@$.g]q~]… bwL7F 8 `R1.@$@$@$@Q 6̟b4      P14^9zɜ9s`ާ<1 `" 6 XkE~'[Mʫ*ç~n3 ĸxb6!F\&r%.-ڷoWCTL B .uPSgp9;e[NYLC[ yAeO' ؾ}3We y 1" o-_9@ nnŚS*XҸqcɛ7oE5mTҏ;&>SM"|mcHHHHHHHHH j.ON!ƨgA$@$.8 4H3g}& ,P'&yOptE;c #b4N=n]\z6lPD1֩SGΟ?o Lny)RD~ W 9rJn !sĈ4㛶KVC[[hIf…tRzuǓq63v\{/ټysD68pI- @S52׮]+s:uJ˧ϟY *BneFx҈A۸2ű#>aJ+?{٘gxe`_~&&KS# btlǎ֭[-gpۛ^Y=z4`$@$2+.napHH1e:N˄'ФIytA/RHEv!ƌ33 Dv"s$@$@$5jԈM1(jժtR\,4[@ԂEEs<~MC$KO0ƾ!- $&UךB^l :T*T X| 0^ZsҸqclkEs8n?~\'QPÉb4c$zʗ/@ DԫWOׯ•lĒL|S77[oܹs3 T?@!m7fomVMe8qBV\ŭYF5kQL}7~W?=  @ȑ#Zx B4z .{: !PLX/Yf !ccさӭ?.h/6$=C0Yp]C/fanIv9>Aݻc,^uN{LC$@$@$Hi$@$@$ "ac*\j]\-@sRh$@$@$@$++WV!Fm6WƪM\.G# d"s2]MH&jYn]~6mdRN@L.]tҭ-ZTumT_to-;wVq^zIMr'2J* Ĕ٣~lnZtc͚5;N@kԨQ={v2d In޼YVj5wb ~W13 @,7 ǧ>#G`u)nF}b4m^nZ|gl#һ+ϗ^ٺu7Nz%Ç50!8=o|ڷs~{3|b‹+f0"ڜ_8Aӈ0._\^u.S:L2ri/^T98˒%Uf82 @D 4iB4H4bL+ ;0_.$@$@$@$@$@$@A 1R#`5X`̘1Zŋ>s3Z>6lpo}cr7ݯ_?9s^s6~?>h"$=}'ڜ4?O$t⾖?~֒rbF.b'?ofggg $  ph߾ 4#ӪUʔ)SofD$@$@$@)B S$        h׮̛7O˙1cԮ];e  $[AiΜ9ҺukW e]p'L 5j9_LޭY =p+VmE9s čdc#XV-Kd͚5* )Sަ2yd Oy75~f$OgDяxY>{9gw/L{P H-@qυ^xL$@$@$~aٻwoU5" 0Rzu;ƒadˤ$@$08x0>Xreٲe[Ng*cs0v0`RS@Ν,ؿoRl$ KyOMB/VUO 1Z(vg+$lYq 01k,=dPH}ΫO֤}>DF` ĐM7ݤ1-C7_z%][СCKj o>1m۶ӧ/왙(9"Flpq[|y믿&4}'ڜ $O'2D/8{6m{gK/[4ާ6|gM|C? ֔hѢҷo_СTPA/]z$2dN: ҥKݢ>Fـ=zT\qz$@$@$@A੧5jP ZUXF$@$@$@$(Ęח#       "ruMaâX:" $ ^l24hkB.2eN测*;_BAD¡MDD('| (` B˜9sjw*UVZ@>Ç!zD{7cƌVX8A B`v+8 1,LĿ;U}W 23\gt-X@Kngh  .\I 4h@{={x[o1V*y敓'OM~<QI<}Hw/6ʔ)#_[X+W.9sl߾0u={ 2A˙3gjg7ف_u}#?|ayoȑA>Qŋgo6\|{BN{-HHHbG`ʕ~MbW+L$@իŋpHHƹ xE]l" y`*W#Gmk3n-YS2CĮ]Pnf%J'k֬X#;ۻ[,Y"?|gN:*!FQbg8 @7NFbYfIRWD$@$@$@$3cV2 &        $# LtݻW֮]d-dsHH Af|рcZw*x)з~5I>}<p6ab/Da]uUٳgVvӧ5ijsalǎ&s!iӦСԨQ#MfR8 }ILyg0pʞO*iOq4nO~"h֬ߢZhszwiYLG$#oy}/Lx?~{ سgOU4g?0/ P]4q>CuT@؜6d4yf16ǁ<ƳnO?:C8ݻKΜ9PO="ӧOo?p4 8p~J ky;C(a/'5;v( 6x:uRJ︇RoEiw<&  ?2dJF$@$@$@$@$@7@c@"HWu%   `1u O_"SB8"3 f/^y~#mԯ#G?a&gub-m} oގjժ2c?nrNyn/^ޤI-t@HBM/2l09vXx7Y~׬Y3yPR%{|^k6Ql!/j8!C|X@tg TVl3<̆ _BL/Z <8,C*gf}k6,YR~'Av䄓ﰓrH xfB+'@<+LmԨu79Cm۶ ٺuño8C)k 3yζxynݺwY/;VҥRJ}_y‘ ' '#i u/ } RA!N8fu,j<.r{te7˗?Y/#4ZD G3B(kJ)S&ׯ@@ y99sfۓȸq |UV-}FCWY νvgi{pHHH >  8b! $*Կ~[4  #cb\3o 1%{x駣Y$JRCswl݁4  `&;4e9-y`>oΝAl @J:̥g;#p /8qb|U*Btc͐6UV3D֬Ye„ :ruIŊ{)ޅY-$o޼ֺ9r֭[V8nΚJ߿>{9#c}(8n K.D,Yb Gہ X?~0;g]vU?iӦ|ǫyΜ9e˖-N 4   صk1h}?:    _b2$@$@$@$@$@$@$@$@BN\ ̙3uJv WbR0Ěn6W`ձ z}},ӦMeY $`#7Q'0ؘď[1|Lx/W@$[JCѣGJ08>:1[A4=W1BR0[o? {aAt㙃|˒%@}GpBB}00N< 9j(bL/O5 τ+Vht\ۑ#GC=39|t]$lދ2esN۷oe˖{W_}iEጷ~ #">Nnhi/Bpe˖>ņ׻<&  ?p$rֈH 7@E-x DHH@bŤTR{!1(cmb;5ߙcvA- M U3w¿p/Q dϞzXoHaA  nIH ٳgbJO kM~+WV1Ab1|[3RF uٱc%\ +7ɞ~ҨQ#Y|=X3f?})+2{lYr Vu݂o|_ }'d"ctYxATsQP߲$v D`X*RcRn΢xlذA߽{x_T6mz֬YS#mއh5\ǎ &8C|H"RJHGz&{ӧ}a $b&Q6m|U G$@ ` T0<|+/&VD =bMӧOq'v:w,&M @VZ K& 0@^|EMdiܸq[ݺueվszL@@߸AzsdS$@$.*|Ay7vwz1~>|u.w0oRJڌ_&LMJ<眻l  #>-ܹS} 2fkX__^ziԪ>!wpH wt? DZh!]a8ԙ7 %%&. +E$@$@$@$@$@$@$@$:vh 1Nь7o^*2O<\A< !MX2F9mo\HHHHHHHHH < 4WXA!p2u `IcF@sK$@$@$@$~wqYfC$@$@$@$@$@$>gj$.>+H~clذa7-$8#;wn/Ϊա?\_V"FO~+V&,ٳKj/ _Y. ,={Z" O>")i`IHHRS Nu֒#G9L>]F%3gvfH$@$@6mωuUZl$)ӄHM6!1i$GiHH 5 5;[M$@$@$@$@$@$@$@$@$Yb4j*ݻ9r$@$@$@$1F4ʕ+b0c     HFΝfAF$9[# wJ$@L w9~,XU`IH Nl߾]fϞ65rB'Ν;˜HH /?O$@$@$@$@$@$@$@$@$!*Uݝ>}Z֮]R- OB3e$@$@$@$N:eUB @5$J$@$ca?t,HH'|"}Z1aWu    #@!Իl1 @}*Ĉ&OL!(0g$@$@ۤXbGN:>B old( .gIHHHHHHHH"G C RV-YhwHHHHHH1ܒ@d%2bL~ĩ|v M wnذAGw;}M6Y}kD ̘1c:2]n!:uLl>3HHB `~gFŋQI@yI5&wBw% ~TΝ;M<,2wixʕq# }k9y}Q )pN|͚5uVPc\Ak׮q͚5~kرcZg/kE$@$@$@$@$@$@$@$@$@$@$=z}bwu<*n ry k䳰S>#=ݸqcYdIƆ "}5i̙z QH ,Ȓy$khVהif,bIƂ]DH|X~ĺsEׯ9R mc\h%>9Dc';/*T~~0}=$n޼ lj̙3˅ | 3!&>N}v a$̞H [$B!qPha7^j瞓[o#m۶Ycl .o<k0FӨQ#8 } ~W]uG8)?]tII@@;'>HS֭[k]ҍ,j8)+cׄYҤ1NIr!8blŊrIAsO? H1}b2d 1:Ȅ$@$.gf޽~w2{i$¹E\H|>п[ >W_}8f>9d菛>w}'={ұcǀ;~'An> VX1j/B)WzG`ܹs'c"9$@nرcfsWjQh9K,RJMƨ=*_lR{1}_ -W-gat-Λ7O ؤIYq42@IDAT37lΜ9ҢE ɑ#ON~ϲ ]Oa7u%)1ch8-l ]^ @d<31GO>B E0J$@$@$@$(Ę&       H:uŋuAXx_!F, ¥͚5}7aT=:?ҵkW[!FΝy<ǥ $&A/-b ǢQ! Fȑ#OKƌx7o\@~?GGDTY(}kצfo&LZ/r  ɓ'r!dT$q#OAv9ƃxr2~c[,aE0Ǝ+8g"9},/zi'Nnf1P#Kā8ȜʏHHH `ܹs]nIHHHHHHHHH\$ˋ/9sڴiE d> +n+ɓ'[!           d"!C嫯rpx/^\.\FmVoEK7nFl:i1֭+峝.YhQHê~yA nӧeʕݨQ҈0.y晀"nXTaX7RGiX,lپ}{=O8SLҦM{0IHH@խCDFNB~/}L1bDF"'>^*M4Q{GMB뙴lcUn8ufZ  $wYu @FCkdقhؤIBGxQ͐ u"С~Olb1駟j 6lS'zy7l5. e sbh$@$@$@$@$@$@$@$@$@$@Xbp=HժU.5jHn>#p2tP>ྒ={vUV2x`ӤݷoGe˖IZPBr}3 H޼yUNرcߣG3m\ ~ G-Z HJtLc7߬̊+&x.t3gH`bLǪ@d}?SPޫB1ώ>9ޡ{̀PY|6i_gf!ƪ\_UE?cÆ *tSBB g޼y&mﶟ>>Җ-[4_׽LǏYf׭:aÆiky駥Zj3gN=zhx1THܹs2wɕ+qXիÇk=ݻ)5k֔?X֣G)Z\uU2vXy qӴiSǭ^8uj NZ'ݨ#ׯ>&qЈ^dIB!mlH<ߤih!NY;EiE]{ŗX,~[S2]_mP;i PK꾓Qp]pFDڸq6F]}ҹsg߬?{׵?7fꫯx//yNpuٍ:< }|=wܡ%fl          v%wq׳gOHHHH|+a$@$@$@$@$@$@$@$@$@ Lb-l^ ̉HHHHHHHHHHH@,YȲNxbkw,r-"V&Mx$fa4#!){ Bns6߅D5,\k죏>|k>n~&Zv9rD2g,7#G9s@,kOK.Ztr۶mRbE={:o^ 8 `ںuʦM,ؿ@ƒ>w:?:?0Mk& s۷oѩSƸq]1y>{T'4Qtf'>|X XߴЏiٲ_{ jUڵ=ekN * ˔)Y &i= YNw)g7lHŭ]44pyGE?e8p@ ;I}r_u %JSŦ?礯`bUnzV?nݺiupG_xw;v;ww}kKK>|wa;muID яw@nN9I  'hG DZ}駵jժ*⋂?6ydԩuڈ"`qSgjz. 矧)a[n%l!KWr e= 6L xָqc_B m͚5CJ+r_O>%>G Ϥak|!kdD2 f ,k4 Hb /YDɓ'M\UBΝU EZτٷS\SCف>-[A5pv6E ~ >°*BV}NuQa@!ƍYaHBшZpas᪫Rl,jj~5A G,wB Φpl68O"KV wŋ4   ?>݈\2 @llٲ%6T  GyD[PB:75 @c_ XΝ;Q܁ ?a?|A<Œa4i޽)znE'!g޺uk!Ffm!p։ߤI4h¹8'G=6S=@P짟~̈́'v #9M_8h߫B>h3U3ZASpm?RqLCmo$l" <8[PWC<_ߗy8V?yABgy0J.-mtԩ~Cy[SSl߾ 6[Mk,XCFQhg pBYd]yҷo_w7e˖,YΟ);vHV@8B;]ǘX h~o<o9U ʕ+vzbۜ*xgKOh]Wu~C9P(ǿp9s~ӌ%a^3@gϞ969101Y薅wU`!,nq!rDF{0繍wqG|T   $"0`$j B$@$@$@$@$k0aV#[l2w\)UTIHHH"$@$@$@$@$@$@$@$@Op$ϰY1[ -ZȣXttҥKp_p{}fkР5VtR1j\R#S^&MdT,e˖ԫW/_eݺuRfM_т|-k9vU!84{lYl:tH z /,$<|„N4iի's̑ z8vz>#ChXUh sךSi9qVZ:u"p"~gVJ]9| O*۶m ܇zHO7ٳC(8xo>9q℘<~7] advQ|`&ӭEپ{Q\rÇ=vjԨav-ڏp_B4<{=6mu 9Bo#NVC)@ꫯZ"pH$;鏣j'}+7Px T's.Z;~c߿4nXksλ 贽nW;kN7[8իWW% BKB&g9ٺ?5e7`vr6e[[#p vǍB:u3ƌ#|&L'0@ 0ThQ`׎aj)SaP?x&;n~0΅7>c sβ|r9u֤Km4ߙk봽n/wH78'ׁ߄a|0/ tϭ)>￉o-Φ`5uN.Ę'O1% L:U&NTDC$@$@$@$@{`0HHHHHHHHH,رcG;v;wNZ~Gy1 @j2LF$@$@)MPBVPpHH&2Fň$@$@aܠA4,gɂ Bg %Ka!ԦM #axm8WHƚ*ñ#GX [+,|]w۴iL0A知[n*&H7mСRB]BqRV-Yb`Z͈dݞ͛":ԢE |uŲyfUcΙPzC96qﲂ|xqi ;W^有+ \?U_|6֫W/U1.Qh 1&upý s #V7PNF 58}ϱCF{|Z.ʕ+ {954y(ٛo)Z8}_w1霎zD]aNvBN9'ۼ{#/!XPOC{lӘ`Ӻ9rM|n8q&Ξ= J]nkE$@$@ DlٲVm#UwHHHB&1; $*UVI.]g~嗥m۶֛HHHH (,HHHHHHHH 5 qz, B!$*,? ">S$@$@$@$@$@B`ҲeK>-lܸ.oEsLj"?~\ @eĨB"e3f#f+o̝;7(A@1bc95Jܐ!Cdݺu*$WjpH_~}k6mڨ!D(1H[rfi֬Gn%}7B@<#3 @dB$oƽ'OʢEoذa*[RPwXֻwo޽4ŋvܩgΜڵkK=Tx%1cFwM7ɮ]4 *|k@ {{97uΜ9>[+  \$ Rl# @DShQ!d͌>iw;^(bUnuF?3|}"ƍ^zMt݆nQ jz}!Pgl?^зٳr- ~3}cL୚?Ry@J@E"2ULQezcHTJHd*BPI@AsI%Q*T~csϹ L~ܽk};y%XBouv]μ]ww?%J0:u~5jBރz^,{fu)AmWXW! G{cᜉ<7ݛߛ/Dz-#-қ#mg;c K_]vM3@@#bz6 @Ґ|9NSݻꪫ|)1@ DC!hh @ @q8裍^*g}fB֨Q#) @ @ @҇ƿVo63gsժUufܹiӦQ}(ڵkm֓ BիWRGmz!s饗F N|6pX?w^[\A3 g _‘`ȍ_}o>+0*q_ ~p ֧pkժe#'¨6m锤3x:,7olt  +>$`J v;vVA ${'ϐ2#B]O>G >uŊoyL}vj*;zHj7Eǯb@ 62rH|r#A]jժUk*IJMUWg~vW^1g}va8l;RPjU;ƍSt09LL>hw T۾}:+DU={BVM9(1oOfnN^aכ:udҝy42]w_=_۳Xe}s,ues&>'{&ұOqK-S8'K&uV̓:(K!@ @ zg-[ؾi㏦B QMgrܹsDž^e=(QœuYCۋ/Dc{symIaeD3ItomBv!Q>&{#] ٛ.h,o韟yszv8hvmLbN9lM+]f͚e۟ z*!dKWW< E2%sMf잋2Woݯz住d'0rΉf K 2җmfեo @ 34mvvF  "лwo'^7k.]j3ioadž/@ &ch.B @ @ !_ /{'քR֭3'N;b$ \ԯ_?`+ {%# @ ZliN=^4w2yWYOrXڍ&XbǙ1cF=7I>x>=d͚5&=gt3ߛss˗&XOaeDHF+V:c`1$!+as+ۺuYpѻ`sJH{M7cHvg' ^رc;5pwgaʗ/.ʕ+1[@;:Y2yg½>=_?~ۘsl2g\侳cz:Ҽ }w̛7ϼK6rp.;͡;ۉ?LĀ2s"8dZ7svAUiH`fҤIi3@\z?B =~. /0Ay@g}fǦ|)Yd+ @H<-@ @ @^kn]|'nK@ @ @ 'zvN.Ԡva~o2Wo߾Vη>Ȋ>g` B@b$AHD<|km%k_|}ܴi79z*%)իWɓ'[!kZp=#Y/UqX}Qe˖l'M5oùQFs6oltx9ܾT/=\ㄵ|r+S]~D&rN'|뭷UwyuV (7Zu?~]w$]|;d@2ԻIb<}t>q =g[>)$&QurM7>lWme,oUB}_|1:^Kd9ΙK|N-oѳle~)PIT>8Qk3  @ @"#pwɊ-jƏoVYarA @ !2@ @ O//{U?oN;+@ _PK.$_AB@#PR% .`82C w 6$JwQGY{ׄ ٫W/O8Hz\rfԩF׮]kJ*vfh"_[,˺U|y#/YRcL P$\Id@]s3 zق*vZ޽{{[B#F/XX" \8#@;t`{/y1R2SwLBvP6mڄJ:r%0n8+VsJիW7 ,%Xpa,h\Dg>SQ6C  |7I&裏& d3|:Oor$,_nݺ3gw s2co}Tb]liٲQ ҥKĐ=@N9s-Z1c5}mܸ O`yD{ H~?J[|C"yQ3Νkr`tu\Fsc}ر"eڍXB;9vGX!)SXM5ߚBͽ;kƞ /@=3-[fRNL[&xm3}Q$gQ+?7׳#<Z%"s99nݺOm}gwF=+?L2s*XѦWQ"MF~3]5ԨQ.].*Vht~IJL^k!C=KӦMw}g]w]Lv[%tO]… M.]e]fjժej֬i͛gmfI4 /tE-cy,XxqwI1Kvc圩.=I^s4$Po>~K/u$xS1L N֭[ 6vv֭[gJ(vC t%y~O) @H ^z\ l!O@]wX>{Y  @H񌂲 @ @ guuݲeф_͠!U@ E)bJ,i X q̉ @ (VX~G!@ <%Ú5kffϞmza_8kѢjtK=~矷LՉMn-"!FWk׮mxD 6~z_X_tEF✉h?ďJ 4:u^tι~|Vp[@Nm^:KQ >;4_~Kb3k>0P&ϱr_|G9YߍtWw^o#cz<~!z2s4cky%젃r,ӜbLD @ w+b`da CCc(@%0uTsUWF9e:tl@ X YX S @ @M7dSO=e* ڶmk&MdoesR7iDAwcf Ph}v+0|`(RA8qО{}2fD JO>fN'%a }iF9RBS ZXr>eĭ_ VVC 8|1wRUe܋Z Yf!bVkl߾}VTCBP5j(w^dPzP9ou2xT[Z oذaH;K(JJu|͙8|ܮy]~zoqbx$yׇE]ė]VV;o#T^=:p8ԔY=}P;3מ={5HQvadj@IDATp=T^>W\q5jMҳ߽3(oΩX8gB e任XSu^e*TJU7o4:0@ @ @O@q3< 2$|@ @ J1F  @ @@ƍMf7|cfϞm?M6j @ @ @yS-E5Gl* 5mCG^3bݻw7۷(e |DN:.^! V d'Yv&'~KIU&~dbYOoSN5Vl۶)_|zwA p*rV@&53^&~'gb3l~شiSrY @ @ vm:t`VXawyfر`Y3@ 8 g@/&y@rH`@ @ @}L׮]mbʕM @|  @ @ܹ۷̫j{1SDX  @ @ @FS \ 7CEଳ2*US-Z Evځ+@9@ po {ҋ՛L>>bOZ›oi;VLӡC$=@U L&kfLN>g@/&iӦ@ʕ @ @ @PM7gEq6%Xb3@  H @ @@+fvj|Ic3fs5D[ !@ @ @@+L@[e~o zQGe $@Z~gg,Yf@ Y8b9O2&Cxnatp$?r`9!w͌ə86ol󕂇c @ @ СC͐!ClbB̸qLƍfb  @>@'T@ @ X 1#b"e L`˖-fƌ6/b*Vhj֬iZje)|7C%.]ԭ[Yzu nmʪUΝ;mЛ5jv͝;צ *U.兩ߦz|V/˗|-Z0 0 r-Վ1кꘄ2 r\+WlJ,imݺ5K0<X\׮]kϏ :u?Xe4qmzRJe+)yX)aŊ槟~RFNǤJ*`Y ?9N^n^wjz🯿ٳ'89mGNp@ {Lrwi @ @@$wzt.]/0h@ @ 54s{Xg @b#i&[\rU@)@ "f2-~ŋ7*U2sOn( *6lhTg~9~UoP4^To_9F^VGy{`{ʷC Ӷ^oEp] ~mڥx[|AeIi?0s13g4{>8]߷oYxq*SX[ ~nP;X͍0BY2|CK ? ~桇2m۶5}Ug\]W\qyMn2^riڴ-? uoݻw`٦M6+ @@~B} @ @@H5%w̚A@ ȉfРAf: GN:QFe'G-[fI &L0ӧO7vZ O*{믿 :Ԧi_~]l&[.],~ Sk̅^m7A&d~9tӗ5a 99iҤ,皫B3m4s ']Gсϊ4ibsgzgo]wylI'dLXo׮^4&?8 @ N&@ @ @#pG zwyfF @@N&N?SMݺus>@ @ȅ%L%K ,& |G`ܹo4} e򣕈qewNY2!?__ep?si9냪>r,Yb=|_u/,1mGZLs饗;|Yٳϲ%JXTZ%g[G}_kAbv^~}i `n[oqn~ڵ+1fElʖ-eo2}4 $qK.$/Qc N@q57]ܽ{>l@ b1< @ @zaX6b# ݻ>|myUVtfٲeV,w޼y/ȱs˗7%K r! 8z ǦhM=իW7?FB;wʰԴn:f͚y;\>3K۪oΝFBUT '"~z/*79ibʕ+k'|z٪`?#{N9sdΜ9fw1~LѢEmy?XeH$v٠A۪X) 7|cb]9y}ǁ?N,l5k|{y*bŊe)&!PpH ^'Sgڄ @ @ _Ip.]J`r' @RL`ذa\wuuV @ @ 6سg-.)+x5jXB ~WwلA6'Ok_ep"ݎ468F^Zn[ٳg *?l9==zk<裃yQaf8 S`A,3<8+O(s;OsJ+P@_nvZ]Z K>/lC]o+T`ڛ @u>lK/{n7K@ $@|* @ @@$pEMD޶m =x`ST QCHO>$ (1k6[OMfƎ-ݛ0`;ǛɺƌcuI,yڵkg^y&,YtŊIJ$S`)Sr3}?m۶NDr.:ujnU<޽{H*x뭷T{(]NrN[%({W\حsBb@#)ZƼ6w\^"b'/`0ʱKjr?_fgΜ-Mn֬M5jiӦM<bUiRE dL @ @CtlٲAA] @%|G?묳⭒ @=M6 @ |# ?[5hr!YVL'x”)S&KwCBsˉׯ2L<1]HA"Oz}3tylѢ8qb I~ѣ|͛EPKD3ӧO7tܹӜp ֏o"4iȟW9H{wmw߹쁥rje˖v/lZnj @ nÆ ya( #(͛mSN9<9a' @"-_R @ @ 1"EK.diM\ @ >`VB0j'hz);v1:%o߾/V#9ȡGvw9a.0##PB J*bŊa_- '7|ӖMB~29yE֩S'ܤuOf>$7nl~#ѣsl&ފ{=)G'ҼX  yV @ @ @/ޠb n~י_ \},!@RC`ذa9^{ 䞚^* @ &b {j ۑ܄+]UP?OX*OciWpaӯ_?ӳgO[/4+Vȵ/6̚5+K3f ڴ'|2 ¨%9?.IZ].T9J{?O @ wq< ظ^j:D @B3`@ @ t$УG@FXgC￷ ~iʕW^iʕ+g-Zd]jUsG*,Xq9qV"Aۤv}d&L0] d'urϞ=VX߽*T0z?w-[\`?7o63z27e˖BƓ&M}w4l/^4mYyA9ل @ @ jժ{H` @4g+Vh*@ @ظqcY' g/ݻԯ[ƯX}Asj?(~OY4^c//*K(aZl,4ib}̕vҺukb_ĉͩj: ov_֝x}<@oMNL:up|Eիg G؎D{ovsiJ*3<Ӽ aIV~Ç1$j˔)SA>{ 5|^{QDm{9?n4jOmgbbL{^b g#X8ON;onƍgEt/ΫUVTQ9Wwi߃)MD;wlcWb^wӦM3G}=uf$05uTs:6mܤq˳}t-ve bZhaCFv7xG4T]lB $E)^o*Vh>CSTD6K @BP-6 @ @ Ф0M/.H5:%Q@4yGh J+"Envm桇2/𣉻'Roڵm4)Yz4 ]ɺ.Gm۶N v( 2=VQb}guV5&0KRNN1eD/ '`rRt`O?un"m7go3g~椓N2 /eX :);Rզ XAb{ֹIH^}oi*;9Z  4{NFС]OIQbNPW_ @ @ @@ժU3pt9?P5  @ (xu4CAh1@ @W!yR"AdZ<~993ʜdz/V_pm鎕wV>jϷK(g6以8#oVH(gIJdw[y͟i.Ƴq*|7e!3-jw=bW/d,}#A &JTk|SobobV(΃W,Y|Fq5Ab2h*Do>}NXԶa%_I&ُ%A%3f06#ؖ.]j+Հwx,Zή\,Ks:?c=knέ ڏbc لr-&Xxرdɒ+pZ-5zh;EK/d$8yd{)M]v=;gcX0n[mܹs]n:#H׊v `"lC@|́kb/86IB; @~w @ @E;1N0@Hf͚6ol416nM QW^TRfvx<Ѧi2vժUm17Q=:+0sYf?XFml߾NH׺&:SQ+?e֬YgϞ9SN]vfŊFNMr8w_Ȳ6lu=5TDܺuk$B @ @z2-@ui=@ ;v*y}4Y!@ @ '?c`w @|cd *p~JS(/'T}.-Je<11u$L*MG;+!.g9!{ksyKpQĦ$2%s9'8/۩eTL@.ѹk%6l Ym(VbHDNାJXU(V ;ֿU¸{ݭkMu:F ϶$su[˖-U{1+%s\?bƻHDDƼyLÆ ͦMLΝ5sܼFu}Y"g wZoT~lԮ`<(OJ3؆ bEK%\*H?z7n8FjviH%ێK@H&h<6^6n8]-@ X@ @ M馛+^<裦\r9z@ ّ#Gɺ3bs'֭[O?N܍>h gDݥKlK,i$kv衇j‚ԫNrXđ:(#Q&/^l'Q 5VX1O޲_N9IO:$+͛zK et?]Xoirnp裏p8E y9G}d@p(ϥ WgpI \'-Zdg}t1>:y)HΡ6W@/6mjФ9su֙ʕ+B"29ǩ-gUTirwm~ @ /pc&NX |F 7A){. `y@͚5b)xsαe$g$u^n@E-!+~͵LhO? t5|t}HsԴH Tro<;{i@ } _>};Cb"U@ n-%\o5qO|~gbŊ)oO?ժU,]4XrBVIįғݷx|Au¯c߬ } T W G4ibȼyϱٻ_n$lTbٳ2e(]tpV_Ss L(rjuI\"N1W}?0ydx 2 IQuf⊐.mfnӦj]we ;WguV`|1$Z'޽C۷%jE~?Vb}|Æ 34+P/s\lРyW9=i$SjUrJ,AƜL;=I@_(D%(n 2:Q//_#qVVl_(RK.1~.>T@@ H@[ϑͯiN @B" @ @L@J;?"`wyg[z@M|ꫯ{Xo:hwn=rdq/OaC 1};.TQ9,?i"&:gΜiԷo_sUWYaFMRwB}﷕-[\s5VQybt}vNNw8Iʍ#kL[$v9ijԨa'ۍsR9- .IIun]շ~k*/v/6F2=nx̞=8a?QK0JvZ(lF,w޽{?wKL."[o"}"E@d(w[b,wY"޲曍g?+ݯu/pߵ}S|T6|L1Ms/}!X 1:3gӴi,1m16-gox%)ONoyWLnBa֥@gN{?WreׄM1_icmlK -ݟu*QYT1  @"P(U . @ @ &41[ݞ~i#/%H h ̂ oa5Y@JKH3<I^zaC5zСF|9eh. Q!29aE7|֬YFbw'!+O>vɓ_m7oW}**Ti>3 ʼT ĠnL r^,VXaqv{=M4qɦvʓ(!xe@:j*룎:*3vusjuPdI8 8-/VYMsQH*_2eY @y(q@ @ (3 1lm@ }3U  @  a @ u a_bM ϴi;w"O&M> /,X-Zͯ2O/hnm{tl-}VXћxlׯkwm$~Y)/,LQV!C#FX:xwj{D@߯?~vm椓NկSBtnɋ/h^{w$xt-[B* Q:@]l иq~5XzoB#P-z :N-ΏX})hGߐ83P˜/Kg٢E w5wq/nР U?>ۡ@"?>ڵ6kw_^@ DDȱe' @ @ HUV5sy7͆ SNl!@ @>sپ}uԺ{&993 *Ϧ z).],-O2ؤZa&MքO>șMFwjSBs[g'iRu[[߽{7k\뺧Pܖ~zs\0u6v0!@o[lϦؖr)g @@b @ @ X_`T+C51&7CȉQ=,MU9j%JJ*vҫx衇kSr眳‚%CڵmM`7oф-[ڴ;: iRRmLo; wߍH)F+r.%9שɛߍ=٬˯7.r ʙ/u̘1ôm6K}3gYn\rl@@V\'%,.Zۿ\ڎy]bƲ}k֮GJ @ȋ$ĈA.c h xŊbM ݟR2\ƙb]vMqhMg1k׮͜}&S%)//!F}0@yyh2@O`Ϟ=FeN#G 7nlq#ڊ4l0!/'W[HG Χ4\[O1 K/-[n߾} ]|ItIV,HÉb$&Zoܾd,s1 @Ϟ=F f„ fɒ%6Fac{,ʗQYNbzuĻS_Om#WVh9{ƻc%;>vt}tЮn]}.w_%-T,_l?>R^,]t>Y@>5Sϥ˖-57ȟCu @B`,[l@ @ @)'p'F~L>|7) *Uʊ1ҥK_~fxnQ, n߾ݬZVZ,U,sGt͜9Ӯ{0k,zj>^Dj WctNq.K7+ƞlVr$t&PMϴp|`kӹ?iҤ,ŋ{Y NVZVqЕa3FVZ6()O… @ @ҏ~uVX~G;7A1@ "`w> @ $~CPB.B ܹs`P/'С0+9U)dOۨ7ݛߛ'zQ.!?^nlM;crp& ;<-Z,s( ` H\wfѢEfݺuVf͚va?,_e$\_UTؼys>=K "c;>HS,c[}+U_'mCw\PyR&ꫯĉ ,h'olrlgCC D@טN:bU\|GFω @ҁ@t} @ @d+&6̼Y3@I'Pn];XD6. .^x( /r-Qp&;!ƣ>Nܝ1cYv)TY"[o5cƌ1cǎ5Z?ӌ9Җm۶)]tM@?ݻ͔)S)V.x5kMXy΁@śl9qVΣwnq/y堆A@"N:~!ln6c;t3{쀀sE @9GY&O@P:ʂ8sͮ]@>hڴ߿5QEcŊ)]Sڅ@N\ @ <7't-Xѝ:u9nvիWF̈́.ݳm{M+Vx oٲرnlٲ6}֭%ES_"Aʕ+mR0|l;卦doL6mGİ$ mG% $b=zū1@  H@ @ xt^34ʕ`$I LMfw5l0T_%!Ɨ_~TT)꺗-[f d˝uYoZj9sM=m[ŋ{>c+\|@zLsc=MQWv >T@lkP&' =j=Otn838Ô/_>KRJ @ .4~>icѢE6M^1)<78qxnڮX$駟۷[Qv*[liN@ E t4Ḫ0 @ @ /"E+V#a#F[%!@ W$])8M7:쳽1T">Ƌ4Z~$jժK׊իWɓ'[@M`W8<9eeb#!i_I.wΝ;eZzb9vmvҥKşrR$$)c979F:u2M6Vs^}f|]wӧ2. Vz]ѣ-[^L^aIox֣f۶m6}}„ aźïXۧ D:y7Y=a^!7_|oܹiժҥYxqG#'d'2-  @ @"D@ (Vg+Vp,!r@]) @ȑjLs; @  _>PO $M@}5k4\s\}W+׷~.yw,^U{PEE EWʥb_(cNdzo5^ڵku^Kٚ5kK_Gvt纖[oY? Ͻ/0}Qe˖le`6yY,X 6̦co&}HVbqĒ.뮻&y w $&hW^U=ݼꪫXۧi|J`bHLrڵXQp=?~m> 7z|?@ohݿ>z7*T(KSlg HĪ\^zɴn  @k?uR  @ @ ={ɉOM}* @   ]veVZYK"Dlm6[Di.Pm&HΊ/n 9?&\>vǚQF:u{[?΂;]o>?@IDAT7r;ݦСC9hMp0T fKք;>%viVQ bƌc'wfƍ&2UDxw JM6F\d|9jiuŊM#1lrveʕYLafGUcǎu,~!$@$IMvus13gδ$V,>H p6OcN1b937|c4|Gkz,Ybϟo%A J9G,Y2G:~ ~s'@oeUTӚ@cFҺt.@1qz֬YTRk!@H8={$XؼyӡסyD@x/`@(CL& @ J+y֭[Vʕ@|Maz|sWXa,O'$pW G"SD֯ҕK2T?Q*Ɯ6۶mk:(3gsf7~g!C׬Y3#L/_޼⋾vOc:t营- 5-[6KZg@B Hx?uBkGqΚ2e[SASN1r8po~.6#m֍;PP<.]L:lڴ(c:2=KBuֵm;X"zWjU3N8TP]#G]g&y0|bv;c$'6ƧKBݡ[R;-a?0]vlYԌ7 */Wn,X`Eb4hPwm/ !@ҾU.(  @҉Bt4  @ @<4Nz-aoN:yr @~}]+I8S`;\~.)K jď"1M>-Z0ݺu DI}9фfgmo>?QK WN<95)YbXWMӤmMWТ &ضt7ZgP{Q^7_zM+ZtrZ|M9xHEM"Ӆ7g~VZB n X6I "NJWA%<-7x#0l9= }Zs`ϛ?~\rxk߾⻮~ @ xc@& j \(2A@~#,Ęxӗπw;l޽6^Z%@ /*+45jOg9(R]@z'zQor4XBH_v.Ξ!'@C 2dy_|aœ$L_Bw~d6B-#qteR5]Q*)x +IQ>gu"ߩ/tnKts3fLZ't$@F'l$^0,Q躮9&ގ 0kΊ-Z( 4mԜwyVT٥ŻT3f{ś?~L2_73g2x ./!Fݛ7W^  *ԹkΝkE#UP10CA gp&+]= MZ)bYbŌ *߻*%KXAP7nݴt?j*z,$,ژ2Yv>ۡ@={N޽{>}Z @ pq; @ @ iӦ֭[۲<*J)mۚI&>)&{Mjns=gwͺDQׯ_o9SZ5SR<K+V RլY3 -Ď;ҥK͚5kLʕ!'cJy}vS~}3|İVF[3r=Q2L\NVp#\i#8quRh@Zm@𗀜 .S-Zl@AAտk<$BU QBƽ@1{RJzhٲퟂJ=iW:?1>wq @Fg~  G[n[nI-^4l( /_ܔ+W.-F'CJ@WC}ܨ= +̨Q, }{-O:餀H|`/I$0h ӷo_oa.iA@)%<#_!__}ӢމX}P9F;w YȇYfVx*ZSpNV[ 7_4C"'k.#! 6`^G7n:Wp_խ[oƊ~iw'AIIrذaFߛ׽%z ?9#-ʸ~#WWUV;[l1tٶmPiР(Nt?R;D&wo|Hg;Jy#ON19"}v$ 'RK]d^x;vlXAn?ۦ.@ HB1 @ @ 'xiԨф2a1cF@IM@ (`4[ ~FL19uQ)} Zrb:䓓 9O  @ @@^%}׸rʼ:Lƕ4g™aP@A  $!%D ׯ"M @!n:ˡTR0rF@ 8 `%*(RhQӪU >)NH#E1M4XUdI+kXʕ-[ִi&qS[n]1rubYtiӮ]6*X)hg; ) ':D ^B1R @HS!@ @ ޽{/f8py7#+H.@@^{uݴo>yeeѣc*K!@ @ @ @ 9=Pw{;w4+VHN $@ 4"駟rʦO>i;@ @ oX~XJ 4FY"#u82NY h~b-[~w1p@^c @bA @ d>.]olذ^|Yf@@ ,^ؼ1{ 'TB*U*(@ @ @ $@͂ ̪UmxI B xC @@7`M"E۬@ @njve+\ {w/ӾTZvKhCr[NH Н#np+e_Bv!B)T.Ҧ}{ϙ3s:gfΙ弮c|뺞3gf> qν{"N9i/roŞ ݻk׮6sLו5kڄ RJ5ڏ  PHHXHh    %KnnV۳g >}-GH@ΝM8RZha?Qf@A@@@@@@onW5j~ia 1b: $sٳ]>h3wt@@HM+W #c@(@iልν{"N9i/roŞ @^wqg}7~Mg# KD    i*УG{l˖-3ؠAl}Ml@d 4mtUW] u       1xb1z *PhѠ={,  b  4r@@@*lٲ|kY@b 4jFފ=@r'avmVZU{% TT)M%h6 -pwѣ]'K,io5n8;M@@2ND!@@@@Lg}ꫯÇa#G+J@@@@@@ ͛g7oRJY:ujժYև?عsg@-;YO6k,;wU\իgڵei&PqH Ϸ7:Hi^4ق&c+QD S-Zd˗5kZMիWے%KBWjY9Y :+њ5kru?ZYb\mQtAvUB S\_X~}.6ho@2@ 4n:zE]H"A`@@?a-X϶O>9Hkȥ@9mڴɾ{;a4YƦ4FҰaCR[xBB-:].6ȱPƜ}p< #|$b (X@@@P (v;2e1 @ \駟;իk}Y;餓 T  @$bW@@@@( }ڿo۵k1nӅf@@@@@@zeSLX..dcJ,תUdžСM0!|{79cJ^g2d]s5nȑ#sܮ]֊-~H}.E]d/B>%6ڡIzh]vڮonO#6CvG7vmin+6˨Qrս?Zhu>}ظqmɓɗ?`]k^s4QRH^K>;հaqJ΁J/}39 &b\ti;MĨ@@?=#a%>|x5!Kts?x?hW^m^pa܉ QC z&M^tuNXs+}Itzҧs -]lYЍ:u,     (0~ S:tuLǾf@@Hk@@@@4U]p6f[n=3ֳg4i=D@@@@@LX5huiǎdS'|%1Tf͚ErMV<^~e޽m۶o?kӦy䑦ξK7oiT_N?t~ٳg۱7e\F1. 6rʹӮYVZڪJodR&?xc|~qFdӧO7MޫD+WC9$۹~gۺu.]"%ɬZjcbY6YD MׇkbhE0GSچ LINeر1{tY`Ŋn~%Z"čA@+q"1ޡRA 4qP@@RO뮳;w 0Hz-ʻ@9iliӦnjĉ9&bvD>"dDIkXC{XS$˙&XB=?Sy(, cay'    /0c ;l׮]}~e~!  @ 1cZ:    wշÇ[=,tL3}B@@@@@hѢ}AÔ_tcJ׭[73g-[6'tK/4t^-Zd_|޽%|wRJYSR1Xw'۷oI&EM'-Vu!8>Q O?l28&իo5;g.sI8m?VK,c! m9s# z˗/w΄     3ΰm۶wk}  x~{@@@@H}MzꩧjBַz+M @@@@@@ 4}ݮ//"{]Zjه~- *;smAJٶm['[ 6,mJXJ->v ^z,mڴ>3ΖQoN:e96YR{sNոq'sMcǎͲk>;z  @TX1޹dɒ=IkEngϞ G@2M@/փ>hK@& ꘓ}b-[̙3#wvZqXH*9OyǗsʋ" P0˖-sU^J*U0R      @UVYǎmg5S@@HgEƥs/h;    Hoz,       Ԏ9s$9w+L s[$Jl}l޽>m|XQ\9kݺ;sUzC?e9'D)(IͻN@TT&L`[I'd￿&bܰa} ֪UF:u\?zZha5jp׮]z2d^:5\*Y]w_:7f;^+4gx N l5 unlܹ_l71c=z9Z`:t{{a2eL]tێ;b צ޽{ۧ~j͚5jժe]>~ߦM\Kd믿f;G+a_[׮]Cuzn5jdݻw^vm֮];gVfM73<q%1 ϛ7Z=zts.Pn]G]vv1 &LH1c=v&{>*T?>. _XH䄐m9ecNybdu"Qc O>{_} 04ibz=G;k^?q~ۮ*WǾk+VtsW_}M>="a\;={;y׶^z`r=cxTw,cz:.1LK^M{r+?x)     @ hDם(VSiӦoXɒ%ӭ+@@lųa    @#>s6mZ0IoJ7!     @ EJ+II/8> ɰRnj]>}H}n,]tߜ^]tQL:V6)AO?/^&:NS d׬YL^~}o E *!c@  tyСC];[?6 BQ?1'SNϺD4Dڵ Ɓɏ+*o9r9GK^3W1/HX!5믿LJt1(_7~Z5jw}@^?t+bW\qEpIs`Ȑ!ַo`-̘1õS(Y~c_g>q;%jT͛g9GbgL/1L5z15>U}HN:#    @Z 73<̙Q~}/RBG@@ /2ί@@@@R^A`@@@@@@ yP,/6eʔkf9'*^իW/˶=[5juË_WV-kܸq|{;_~;աjJT2|p?朜C9Lk?We%Siժ)TRv'u~{%\T;vW";MyYg@/QI?Pr۶mnWM[tCܲ_~mH":MWhW_}4nDJ^]FMN#ķ[lqt֭[g«1%+]Ii&7>k41َ %B\oVڬe˖䔚4]J̘_dڣG׍o.ɥ~w[j=cgax_CE]JtStg9.jݺ.ה X {/J2KA dn# ]@;w:!RY!H1'џ~P-ZO:u[ ݞ_9MN朜ױPWbɋp*C$z,aÆ v9k^z%ޔ8QcG%#8㏦DwQvnF79?^eJ8{lM~sXڥ*Na ]΋*gL/1xMgB9Y h1z @@@@@ c]tQXZ5rC  H8      ~;p!? _h1M`ܹ╽v@Q`׮]96y؈ PB.@@RE`ƌIU4i:Ek۽kE+cƌ /0'3S2 {Ydoĉ:N;m/gIf%&mTI| eʔ{$RJMȨ$YjRI69_~ '|p|uO۱cGʴ3G_hӦլY%bիM<=ϕ*U ߕdbK$D6kSŊMUT Ogd'M|_/yY:%9駟쮻rmuŊ-ZĀ 6t|7s'X}V(1*!O"xuYdJZ`?{챡'lטv%wH}٦D*:tp)SmTѸƒ5ƕ_%/VM6u#cԛz8of ,Y$[4i&@r'm۶k yĜ2Jwo>)FsW֯_?Hg@@ #@@@@PDnB^Mƪ2x`{Ұ'4"n@ Y   f2M4O8ֲeK{WrLsO.oA: 6Xʕ dnY( ppBJO64cx1*To6ol/#G&1JIvcqvSh%4Y>-rI>Nh_&֌T4&|衇;ݻw\iW!`SشiSR5h44 chc?3n:KF]y}lÓ0t uf7E# W Iz%bOς e#^x|2Կ[viRJMLA'bLY9  1v;D@C`զBF9FJ;_yO R@R^=} oK\@R_nKFB@@ ALל(G 9B,B@@2UD/@@@@+{UVAm5j(M@@@@@@ J&GeiFm_~y{v饗FqOk׮M6.&OOgَ;tv)41o/۪U+{뭷l˶ͯx`{oI}SI%m„ Q}2|4yL5n8w&kذթSǔDTDKĨ+QkK.yn-Z̙3߶oݽv8IJY9\U7|^}n ղuҥY>ob ̟cn-[݃2eJ*$zW*  \((+>sxֶm p.)|gmرc)11Ξ=D0Y@ tPp)$[D~@*зo_۸q[2Q Ɯ~nfҤIYQ:X-X}_:szܧ@6o|M651+WڟJ1*=F[+71X0Wm PK, #c@    ?nwukb7Ү]n1MC@@ v1nǑ    $U@(n&7t5.2KiӦ,3z @djժ (X@@ 'tReG@PRASh|`uvwsl*իm͊ŋ[W_5M1 q:anΙ}jzqʔ).ӭYf6uT0ʕ+gio֞z)9r֣GEk'8ԟIq :v+j\'mԩ)Hzosε[ʕcu_r%VJH&t]ݺusuߛn{+Ve֧O`W>Oz^'),Yd/.Umv 7جYL taoݺuO<1[s @'D[U{WgB o$b̛{# )رc]=YF 6$,%Z[lΜ9nF=n޼|LXHoy%8_Ɯb㸂u"m븋eCcO]w=3AH}4FBǩv cTj/uL/1xU)ŋ]u9?c<е-[LR@RTAAˈ] (X@@ 4FAom={mذa.$X  &@" {B    @ĺJn:{կ_p![2\@ t  P,:}F@@to3ۻwo{GM?m۶.SC >m׮]Ċy-'bD9!jݺu0g)&]rHߦuQ[2ew*)[ƍvhҶT~>33CYSRRٳgʕ+sLj/*xdQI4۰a}G QFIsS~w[~oG;VZ y֫W/TjժDzO?ǤBAX~Hz}L0~S5n&8׽J( O(59's￿K6N"Ĺrgΰ{Ođ  q lݺOLH1';K.I&*?7wqt%r,oQPmNsnϘSn'C$ywunѣGq>}ifpW}]1Krk:xQ,cz:>1xU R'Y-+v/89@" (##Ұ@@PQ׮]ofSm4@@(_'     e˖u%&M~++@@@@@@ &^lӦ_ֿ{ľJ٪~[?:u2%R+VغuoqDm\9ҭǏeu>C)6'9'{/HUҸ?0mƍ #-(A=cJIA '%K5\cz) /oXb._vi,~{o<0N2.R7yyz\_iUh5 ϟ^J۠AN:5twܹ4Aޞիg9 @ݺuI~۱cG' !ٳ/r  P pT'~)&PIH1'%L8k<*4ѽ[$b,oQmNsNf)'@^!x?4c⋦اrvaUbq,c=-u`|Zc@@@@@ U͛ggym߾5K.1ŖP@@tA    @ ۆ b7ng}NUVw!Ph&L`=P/E@N:6j( @.`.(r  PP^֭/z:묄Yٖ/_~w{ꩧcyUxmlٲ.&L p|88S]vGn>QdnOٰaC7䄾m_x#ï5k5 UiLjh ~ݭJ*.iDJu/a$Jl~ĺ|!جYlٲey>O{yYhFٶl}hs91tؖo{A%3Ǩ*T`;w{`ueǩr;z ?9 ,^88I21 *g!&ٳc:@@v{n /`Q@@ nFСCj5 @ X:vh6lpjYE)vP   c2ԩ@@@@ TXѮ:mΝ.)#<8$S`ʕ$ ԍ @ ~A}|,  k-[z_vD@ ?Zje'x}6hР%bT1%2d.T:u"v?K;k[%bdʕs'cB\pMD_KץKI}XfժU^>9Jƍm/hر#^ GO:餈;s\"Ə?8E,+*`5&6$ʁlZjU31.M/;pB;s}&oy#OוXϵk׶:f̘-qoM <|p{gvkKI2) {z,YB"ӱg>1P9%  ?îෝի3+%cN(S-[̦L~cS"'剈67ѠRќ%7sʍ@N.x?֭[m~]5I%?ǩrLTu$?3y/y/?KY?LR@@`ѢE5i\ @8 M_(d\2VգҬY3{L@@ @I    @ ʗ/Oի3@@@@@RTkO._>M_~.yƍM6weEϲ>O8ydQN;] tYhթĕ/ 4kB'sۧOnݻww?𔘌;{~Q_}Ċ:tև/tɭҤ&Lc$pכ^{1b;Gc&"c˚O&rnݺ mَ_\^% -J2vX O7f̘Ǥr>l[b)IWZ]Ν;kr\z_*쳏KOA/kr.]8q^J7j(wS5j䒧ir7tK/YѢE (@IDATK6Gskh}#+əRswъ&S-[Ӿ}h knW7nlJ5o4IxxҥBڵsˡh[n]cd-Vkz駟szjwHx(y'5&)J2OFz  `;DJq@AD!N  >s{ SOk%K@*9INw}F-4%XH*DJ6GsK^Bs c9USA%:~8b4nj51uTfW2dHh~9qx0ף%qS_H%~ʕVBlk\!  W1U@@@@HQML# 6{10`@B'Ln, @2ebŊt@)R$9#@ @r GHES.a;c;wNH3=X5k%RBF|iѢK:u~mRB*|,|߂z,?%S4hKĨ߂z!$}ۤ~\p.ѥmBI6GrMk^s?~K8O[vXO=CK˖-{5 8MMu|=Mnraٜ9s܄zRR%;3ܽ&ߌ,X`~)Qo^ظeRJdVӦM3%nM"٧O﷎;$w 9DъK%TfYɃUT1z %$ٳ/r  ۷o+wRw|:G W:+chIv"Hc!>~S͑}cg)5)hx!|{ z,!%`,UZz=䓮 6t3xƩÌ^}ArXpa ,k17Z e˖e~h @ t}ww! tۄ b@@B'P?_*t    du]g#Fp[LHm:؇~ylA\O<]}nw5 @LP0-[\≹s.94}BD(a?뮻U6N@HM7d>;!EK|bӦM mCLA+YreSҮ<0㺭ׅ.!uKIұIB]T T}n!,_ܽ/(I~j׮:dJ&iO֪UׯcBݻw?`-2%+fѢEy)uXԁ?yZ*̐qrr?YΛ74p͚5^g 9g}\4'I %Jh+$]LNIOД@yK]>3YM^@@P z6d͛۴i,4Iv {ŴcNbr+s*ԪQFnAK~<7FV/25HN,֭sswUR%Y/zcw 3z r-н{w{ꩧ{{hIv%_駟ܵ:z?í_~1{GE<  ]zQ@@r#w.VS#$Jnteʔqsٵi&Q<  ө@@@@r0`˜۷y "     i(PHK 2(ґGntlsN$k>Z:(޳򾭤3|btw,mJ(pI&K:F[l29(Pxqvҥ.Ymgw*GA)  /0}t{\EJrJB $SsJ熖NDC$K.}N8d59i:Nf& Ν;M8*|@@@@@ sOQפ+Fd?+ԏ  L1&S@@@@H@͚5kzȶmfw[Np5@@@@@x>;>-[^xᅘMAɴnH=cǚn+8X@ ԭ[Mo٦ML ($C@B"F/=  [nK/*?i5ʿ 93$M&E 1ofSIG2T`ɒ%3oРAn!    @: ="EOcwMۤI*PXP?t@@ tMO?n]J8!@=2O@]}N;( ` gi(SNg0@@@@@@ \uUӅɥ WMn@  ]xq-PXJ1,   X~u=8-@ c LaoƼP$MͤS1Xpa_ e@@@@@={uYcWW\a׿ ԅ  @J 1    @lUVo dWBF  {ؼy͛7/nժUڵk[%m ]sNꫯBWE]TvaQkO?dfͲsZʕdCڵeiWP8`}ƍGuT]om۶ԨQ9-Z4Xۅ+Vʕ+:A/vq[E-ZDܜz#J@ ҥK~ּyn-M+k^yK**Zmfwu!    @֭Tdɒ` ZD-N}  PXtի]O?t +F@@R^ 4WZJ*eu1͑S),?-_{9۾k۾}լYŸٳfΜli㎳ŋ֭[mٲezߋStR[~1UR %Pvc6mjeʔ 3f̰4^zu:ڵkmѢEnnkw}oԨ>Nۜ9s?*Vxb[fMX jQV-  ~~!X:% Vu,Ew4k,bM3kץJz7nl˗_c@ cqn \p-^IԄ~ԩcK=ҥ=)Z  @HĘ`PN    @tM#؆ 瞳Ti@HM%=<#6N8qֵkWlp֪ULJT &v;s\PM D2d]s5nȑ#*U"˟}.E]d/__D@K 0S=cJbҧO7n۵m۶6y䈇u$`7]HDzHuѪDW }QwaÆ%/ nuEcKf@@@@,P^`& ,I}ڞiӦga7n %{7SOͲsqà ;#˶Hƌc7xK^GsZ7?珛;wnϧ~j'pbG<]Pr&M?;C7l{nuzDdz]{o)V(gh\xx!]aubã7z=*NDPaŊh9Y.d#qXqŌkIRMf@ VrO;X|-߼#@@<1fsJ@@@@pJRկ_?McD$@4lʕ+:fEY3Hi"7x#GիL<0&]ս{w۶m~֦M;#mٲe_6(a/ R"F%'={{~S~SiexQcxPre[/6gMA][n9UAm}QԩS:oxiРA2-_Zfy*cz#:@ X†nE11RJ.X@@@@@ U4ienj$bLgpCy{n=  @t d>}G]gIA@@HMx-Q@ =Uʎ;lɒ%e{'ݜJجYfr!sNќ͛]FU_zŒ*JEe˖u'Z↡CZ=,t18h/ *Yg[N;\}Icǎu&+W blh>7'ھdɒvG|IYv}W.)u]b#7!DrRR?aqZd~Hf?ޡtVZ՟"W̳bs*eʔi3@ KgU}r"GW^yŔXu%;c .JtRӣ:M   @VEe]#@@@@nz![nKvma=  !O[˖-dիW/{w]QF `.Ұ9?\h]|ŦI[n O$?cpO>tq['M5ĉ1^%t^|EwJM:c ݻ)^hCNV$ dW `;w?% ?h̙L)}ʧz*wl@4xGL7      j'3g$C$jRL -:1 Z@@ JFnڴuU{nw!  i-={>zi@* h>i'U)F[nn 54a`29~54ٝ-O,(nZry;餓˖-1ce]uhb]mFLmVNm۶䀊gy-ZmS'O։oo+fϞ⡔2RlowQSÆ 3WD;T~mK.e%b|4u /;wvG}M>=|sJ+@: [jU{ @HEsi*]o>a88{G@@H%@@@@R@|v뭷(箻JV@tUv.(o˽0?%0 C 80Xmۺ>b1doSr*UlIbrSNo r&(BuюIz_GAכs@@@@@@2E@cرM)%Pxv Y@@_`gխ[FI9   @ ,X 8? 7"EE]dw}c_$t_J1(Q”*y4Jxz*ayGP?&Mr'̍^8KrQGٛo 96SC2dnߙ3g\b}צc\+V.\hϏv@@@ @@wy6m4W~+\\իW/ک@@ cz>o@@@@\ ;8lٹ>@PS֭9so뱂yw+"IO?t&*ھ}{Cvm|[ͶSW.]Ϊ7x#b B{wݶ;n*&L?-?ɪ7?9@p v5ؑGi+WN;͞{hRCکjL2K.4uX7^v7f;Ef;Q +lSA۶m'x­SbvΝ6mnڵkgժU5k>Wy晈\~z.鰎X)(otADZ믿Srj><xn= TbmO[Nl}FYϞ=mժUa    dOĨhBQ  c2ԩ@ mРA5f̘,  @h"Ɔ ch3i)СC݉aMU$' └P~-p 5:UW]bOQsϺj*T`ZVe&M\eoEQBWe٘bj׮mG}kռyrݺ:ˎ8wwym>Zh7.1l@"9`\3zlݰaCs[ΝKmXv黅a:M1'tKhk ΩJJ#jԨaJԾ}{>D"rOmURlmOV[8fougZժUumҥNe],~M]y\.3ꫯ6E*'N ڬٱcfYmzE+Ga= @<+{ϝf}>ׯi9@@(=    r%Q뮻4~-.  @ɒ%ݡTzI&u%\(閊0N6N9,W.L+ *R~s,e̙f+Qm[lYۼyK$ D+D;ww7ETgkpdSsAe9/Y믿m݈#l'a>};DR?TP/z嗝ŨQjwWPy3_S^Ǐw7] 'EG*o)JU+>̬ۓO>>^}FJ/<*xsF'O>}6ds{оYzSGE֭[MA~i r#     @ &b駟NH>сoh"8   @|U[;Zl9   @ Azh䯀_U-aMU%S\lh"ŝfСֿ-$2k/bl<sĉ*JxRHkӦ>>Y1)q0(J)X*NG1>)^|G1*9%T%SUm7%R Pu([ @ JV*&37 k&KuSL1cdY: ߨS|_|;؍6N>[t~üzj;>sUYG\V-=V:e}ݞ>OCU{ o5k,ؤ0qoqw7f͛7 ־+.A?rʙMɛ SkBŋ6 ][2"qUxeMUV.TRv'u~{ w!@!P2nݺ$ |wG#RϕW^@~vG۬Yvh6U_zg;>z(??vA QrdVr,gԷ~e%/T?b(v;8gcu[p)(K%zDS/M]{+ sd%T\d V \h2IגI SJ     dG$O!:ٝOvP'  I={t-O>G_@@@LX`y|U@J (ǗbX3=~' M_xX?~}{6%RU֑S5km~_![O..G۷lbעXoH}weyM )Y1K|;wh"FP*-\}{t c9ū*!bhhM}\yCC=Ċ*3k׮ֱcGwm=+>;^;hРl7Y QI,Pﻺ).Y\իWPo"&aA{U 9s\QLxk⍭=#/a.ܹ\?>e]%.unƉkyذaYb@ A^@TH'pBi@@l=z    Ѕw_DD5ڷooE@\ lݺ .@A8rnʘ1c / 6@Bu駛cM81[ZriԂO^O }o1¯N}Mh'8j%TP>3̫Y5jس>k  0vCQ@B >|5i$حRJrŊ*U9-ZoNes3Wb%U`Qh翾4k}Q #%b޽x کAnx9:ue{ ! ˗.]K/n;wڦ }VX,_,JzmU=?|* d ڵ+ad @XhQmd+NJ؈d&d@P@2[G  'sϹkt]o /I;+G#{MjobOH ]Sxm9 H 95G+tMbT֭k%Kl1ca">IO,(Iw&(Q/~_⦔[|䥮h1>SE+~ڵk]4Ω1woˢiӦAL*[pT/mV\W^w1o>[VBɧ=XZK@b/v'F= +n/z:u{/Ս;ָqc վ\ҨQ#UC%9Ҽg϶+Wf'Y |Q';Wkgy⋦1^zMUPYQ1V?j׮mK,q.JK{}g8pK=:\#J2|M-[r/N,@ cꮻr,RiN}AA@@ 1wN    @ ±͛ ̙\qi/: 7p R ׯ DKxذavgXy͚55E1|OThdqС6k,۰aU\iOuAzA߿5GeH}vGrꍻN= ߬ h֯OMzVާzޖUox1t{hDh"@}|XMA̓&MrI>J?迉4x.r^JZ EI*_u0N:@3<e@H}Uw}O *Hyg~!+H5A={Djr|p   @^ߧOUR(H|t $5/ zJ+/8ۻ+%Ge˖.IPL_I}\bfSŹ(9իzA>L4Xz!2eM6-H˹1bnon7ovt޽=~nD'ׯ_c>.'?Bۙ28]7!%$:&ѥgϞN6<c<1J¨ss9U뻏sQ%U58+w$a|M24c9lN8}9=|'8=E&0fÇ2oG@@*@"ƨ4l@@@@@ JyֵkW+SLu!$D@KV쭷2=k^zivqhua6md|os~gc+]r)Ϸ~ʒ%KfC Tt}h Z:u\pIt"d՛  @K.uGS5k,|U 裏l޼yb \vT ʖ-[}"IV}//X 0Q@رcG}QPK8{,txytIn97[onꈶw_[n;.ѤWAz/_޺tWx_:1z@fv` N֝   @Rt1.JCx:nG d:}͉&+?2t@@( :xDX~ [1G/yY)Xb)d1Z :n S$_wV:VOA_v]xU#G=QVzgmoxݑJZXI&NhGG#GA!*Θ1#ԩS_w߹sggkЈ,h+dJpZ|g,1ئMnC]H;\"FUh[~E*U"'vժU6a+SqHm:b* {xwo!>;ޝX lc%ؗd'QBII%$T믬%K,-}_*kdߗ~y9sf9g,?q~{V4hJ'M<DE?i.4] uz¼4iDƎ+Zs x9T*7ovy[6-TzDo۶>n8g9 Vr{|ݛ\iEMD*h^w1:tpj?,n:@lyl;O1mq '#֑7rF$,#Ϟ=묳 @ɒ%?#^@?zѣGJܹ~ 0q[۸E@M'+Veʔ1Hj!^9>*Z@/EjpD&NU|HcF T"C 1Ԙ M 7w\ڵtA՜9sJ…?0XPKݺuxMVhrB[?hט&2֬Y#_}@x*'6'ԁE j -6殿u^$[Ԯ][;9uT&bMhi޿Oz}v~G̪2M̨^m밌$G@k&D{&=X_؄' Z&$bc>a&jٺwXlyuI~;ck5W^'8m`ƊKe@ PW~XS}Ims<  iMDig    i^_3gu{R@4 @| ȪSѦMs 8tbhȣՓIiyN"F{MĨBQli%K NIV2 2TyqK&pp_lv̙ݫqo.رcRV-ٳ+WN/ӧ7u6l(;ws\+۸ { I6m/qgٳtqdȁg~tϞ= ;}L6ʹ=K cN}%   YGAY@1R@@ i?`*zAE )^%5/@@ k'2qD<"W@/'ad @ll<Q )NXB?[0HL@h©RۢAR^=g 63W˔)'c f͚&q~mܬMD-*;w>H fVm j&_1zE]~9s$m+ V\$bu E㭒Ss2eJrJu֊o>}Y8~nvnuRH谰~ ɓG*Vh^/_.7M/.E񳷄d)I|&l$gpұ[r:˗/;I98jS=c{ң>*͚5Jfͪ54Qc0 Ԥ-@ m hj?^Bw-GN(@@H"    e˖nݺرcMґ!C8{0f@ț73F5j$}̚5˜IZkJjzriڴ9ZEٳǜ 'kei/к|76Y51%T4I`6@n޼YA m:#Gt0.Z Cyn x=T2RJ5xVsΝv8MVg^*p >>uTz̙RTf@@| OLTB@@@@ y7n9MO(ݻ,Y2&l@RDaÆ&мydРAb3=!L4G}W"FMd"{=[^K(a& ,;u9}qZj֬)ÇϮO?$L~휸E%E\k=ݹs&g&;&aԠ\ Md]{ŋ%C ~$;݁lA)xM0w^Tڳ>fri w-L.]̭ѡCu cr\ɤ{̉=XF@@@@p w}1! (| _ѣG$N1G9sDR@H8Lcʕ3D? f{=F;ȦM9spQ%8OcDkiݺuP6NeѢE4M2xb'kVo׮L4I^~eO,VZ&&DOٳgӏ~sRN8 .l^5ɓc1j |-Y7Γ'3Klܹs{NsonܸǩɆWo̘1&! ݻzsvڞUXG%yPii֬.wᖈ1f7PU-ʗ/>,6ݨE|Ij1ժU963v֮[kcl-[tr/lٲŽ=oʗsܟ|<;@"N@ѨQ#}|zdbߏ"nB @@0 c @@@@(T<䓢 Ss  W^mj*(ѓ{)|ҿfE-z$ ۤ$bt hrA-lQo)K_5Mg'l+n:YvyrMUgֵCe ܱc}QjU;$sܾv'c4zʔ)p;?V 6f[8޽;&x]_߷o_Չ%N  ^Q߻\Ϛ5k"G @@|HK%     @ O4!ɓ';~2#@` h@4l  hҷo_s#GDO֓ED>PI5JFji֬YBՃ]4]LH Rғwɜ9Kqucƍs4mԬjI @ 7~X4AgG._TO Mk'gP[ ghpaÆ`8^5,^?1"to&mڴq&1?Wzc{^/^V--2f |GMj~z5ѣ    D;^l@j d̘D   @|1ԋ1笸G%@@@J`ƍx*T,' ^$sZ_ ?n4I-6iMkzt&Xr:ފhj[eʔ;LJzH4q-&_qTRrnzvN]譍yM|Ql6uMҧ%5XI(5VN٘;JjCiӦ xM¨;5FJhJ4c۲&ͤ @+VL4СCu}]dΝ7o^ 0qRbEs> {JNѡ~^eÆ &ɯ]OV"5P?Wq@ D`$  @/1f (fJpݑܘ[{| vݻzU^ݜ^PP!Om8DuDALL&Աƚo۶7t@IJ*ۧ^|EӧO}l2Mg&MX01WƋ'}w}"@h̯O>}$Sj޼ 6̬wt.vȑ1ho^2glWm۶^©B 1:_]Znmb˕+gjB^^#&&zg[Yx~AV\)˗}믿L\&$ֶ]pnj#D׭[g{W^0ck5&nI?,^X4F+ܠ=V<.M6K n @|dz}+V>6o'MdHĘ>@_ @@HJTR&رc+Wa?Ap}KC  @ g&^UѫWh.@Y2i]۹n>ߙEXFS SL90Gq hB# MƨqIzZD 3Z6MĨq9Y2կ_$5ֶ~'xMhfȐAjժe,%Н˽g 6[l&ɔ&D;v0ڦƹuE^~JzofoX%K"F2}xI>n@_lrA}ݼ曝 âu}K(^sHʕo y}LcR5xPʖ-+ƍV֞49ԫ*9l߾}&U{Wx >T[ۭqMe%{4w@bk5j\&Mc߼Qojb,Mqz}]jUfXb,lD"ײر,X͟?|&lB@@?#e?0@@@@Mغuk3=z3c D)I1Z"9s3p ' ]v]@7l`ii:ڧHyqUZxL&IbآAtKx 8W L֋$$u_MNMj\ϭ7n4AIE1v_}o׀&ŝj'~j7%;f Ԡ+R*U*˔t;wI==s{mJl@UgAm@@HHI&DhVdϒч~_cԨQùi8! ݻA;ѤzV )))K ˗͛7%G5Cܨp;c@x@>#A;ww vIЄ)uꔬ\R4nLhF'd۶m{n H$}o2Hظܹs{9s̲.i2-NQfc-k׮5i(29񸶍Լx5)Cu4ѤMÚ\ȑ#&a…bŊI})jg~i3f_}/u%E:)%59|sJv@@D{ҥgחsA@@ Lh @@@@"NUVrM7… I#GD<0 @t hjll2+@`hD ѿ ы:x^!9mS7T3Vohp:ui[C}hRm1kv7 )&ߵ}{0  Q)aE/H"Fmj dΝK.@H':Id"SL! cDޓ @@+ V4y%JDDү3` #@jrRnl٤^zq=ȑCVjhC@Lf; MLx-հ͛7|3O<ҤIdol-ׯ_?b%I; @ I˜9sf6mInfF  a"@"0#    x7/^^zI:w,W]uU(D ^I)]v-Zs(  ,ޯEe@@@@@ ʔ)֭2 @LHĘZ +e֭3ѣGsauG@@@ v)'O4\rdO#@H )ϝi$rܸqM,# 2>w@HT矗7xɐ!L0A4h1D@@HG"    5]ww$.@B$0rHyLҥ?PZn-  iCDi~f    $)/ĉ寿/B~a<  D@˖-H"~ v~A $WQ@@@@\Xɘ1\pAYR[&bh~_|Eݻwj@@H$bLw=G@@@@ (>vXYjYF{=yWd         ]lٲ&SdϞ=RXA$$cv?>*lG@ҤҥK'pKɒ%u@ m;vL6no 4U w/EZߗ~F@X1{`   @j d͚UUZ a+0{l{ҥKf}Ax  &@"hG    O^z-[\|߾}{ɟ?r(        "Onn޼DQ'h6s& ! .p!i׮H;#ҧ@+W-H8P:v(Y^y;vfv]xQ  #Gt.鮤I ͛'rӧO;AZwW|$c|wq @@@@@@@@Ф h"ƍUnHqL2>`RC:@@\… ҡCٻw&6lX!@j)SFgn:x߿_6n(:u)SW_}0^%JHpȚ5k㣯I7IW.Xv,^X-[&'O4 *$UVM $Qk)],Y2^߁lP\|$5?D4QĉM+2Og{KĘ7o^38]ٷo1ɒ%+Vsϟ?6k^f#,g1byD8~0tZ`Æ sN뮋29@@@@+e˖ri`ǎw N㴂  > &@@@@@  >\ri{իܙ(        p'bܴiSAiT &&ܹsiTi# q/ ,0)"&M3ƭI?$8$u׮]ҢE c1uT;vl.W_}lݺ5ѿʕ+;O>&&r7n,_\|M v֬YcҥOj޼igѢEeMwߙ]znӤRD޽[|I3FުU$6mcz&H s=^M4h`TR=z&oXA@Xf3~1:,     @zw&Mرcg6Cٌ  A3'0!    @ *TH{93K.I^"w2@@@@@@@@(_KΌVPHMMExbjvM_  @ ?^Fiƥ L"W^ye؍!@x-ZT&L W]u_&G!w}w5JD_lbǏҥK֭['g{FC^y/Mk:&[{իWJ.2d۷͛UڶP  %j*8MLA@@@@p5j$r7sK칸 v@@H1+"    {e˚yO2nܸ@@@@@@@@@ r!Ŋ3C$c8S9̙3;;w  4)Ynݜi=Zj׮xȞ=ԭ[Z~*~o{… }w}>Szu)X?|9szy썭[+f}1cwK2eӧ'xL0v`6+Jv^3 XBz)Ǥ>g4I~Ng9z<3<,RhO>ijjӧO˨Qcp’%K^W8p 1 s̑{G*U$}cjդGo>w5g4Թ>sf˗m9r9.X 7c$v^wSN|`˗$뮻dÆ ^\gmd˖-ꫯJÆ kYVZСCٳ:GyD.\(5k4~pY`x㍒7o^iڴ:t(^ذf}\]wuҹsgYlYͿfcƌ}LycUɓ'<><yr?)~miV@kI>T\9s0@@@@H@`~RF 07   F chW@@@@wL2o!76C߿h@R@@@@@@@@@ e*T vH޽{ꫯNhw"F^ 5GڴicxD?@S["-_O&Ң ףI4)ק~*p&Xsc16jHSj}&Ԥa6aiӦUۤ?u9Tu4M_rJ5-0w&ќ&LE:u26ܹs2k,7w\㏽^W֩SG֮]k 5!&K.]vAO[oe7yVꫯdNfΜ){Yֹ{w۞YwV9ON8љ~.0aʕKƎlYhҤum[~\yԩ2e)^6رcfZwܸq1>LO_5n }lc-ETyg˖ͼ~kILRY4yk$bK.&ܺu,_\.]*ҥ<<@ڱ@B2fFZ=xt&vZ`     ]௿mURbE|r~2[@@@ ̱     v Yj0!C{@@@@@@@@ 9lٸq]p'vҐ<  AЄ0w}ܹӴVF 3fLZ H /^4ɤt*THpʚkѢE iB*wѤ@3ʔ)rM=Mruĉ8hҮŋm^ )r:ڵY xlf՝Q7\4ycJPs hBmۊ>n5ML9M@WJ8߿_1n$Ti"+$>|x/lɔ)Iȧ?$Ǿ&1͒%v& ce&eұcG Ç͟MDI6W^@Wooɓ_~?3M=uV+M`صkWPSG䆿y,\RڷoU_{1sd:n<49&9LbFqңG3Ζ-[ KkG}w$Ԅt1/Bkys^0}O='h"=[J.-ڵs]_ 5f͚2|;Mx}&b|ꫯNZ:wl?z֭[MFݧ nvZѢE6Mx {9Vȓ']\r9˩q`12c iѢ3u$iK چ(]2d k6 :5YfMNM!sa2dzB &-[Dkf0ʐ!CcbŊ&h)Vy\&A&VTCoȑ#&&Nߓlu     @ Z۲a-).N2t@@p8qIc2'OMCA ֗~YYjà()I)  \gy&   a(pyŋ许 ۫oa8t  @ c(     )VX!o9@@@@@@@@ +W\ŋn:u؈@J8͒ѡ`@Ҁ5k$5jhR  믿fbEfmܸ1*qi&JE1j7wujX-6Yƍj ̅MO>-Yf?PȘ96u)"jJ3MweSO?Mlu]DuQ~y&b]IjIA d7VXQ4bbef?#ݻw7˶?]e7o^S/;`m۶>5 g/͛g #vgΜ1Єz 5~N%Ks=H}ks]ճ*UsY %8u?Q*w8$bwI/{ˣ>*6cBݜ;=&bt'6cB]+RP!ֽ=D3%M4n.炮}Zv!Kp_ٳ)  Є/wy'zoa?D@ݺud.mڴ{N5D?u$ 4*ɔ)?^ ~xᅴowu,X@u+5j$u3Mӧ7LZiӦ5c'P9ϑ8qlǨ&K.g8ٳg+kʕ'>myk2w\絻ؾy㮫Eu&>yrwDj2ʕiiذܹ3=\Ȓ%vݕz.l <c>.zi[vw}wk>b~b9q=Dߤ !DGA@@ ze~yW_}%7xcO!  $bȻA#    aÆ_-YfɄ cǎ "        ]wL2nڵ$b9ܦDV[@f'x$"9j3`;9u4ϝ!@p+cƌFDsӬYtɹ4aگ*W͛1~wϟojڴ8pQ5K.ɷ~\9scyOzM8J2ĩ4w~ Vy͟>'M${޽{;aہ /^(vsD3PM,#G:I-Zd.9Cyn zbŜ8 v[Ծ 05vIVXtN,     @XxIEDo %c$˗H|q^f~׫'=˾}㞛CNsNinݖڷ)L@P TVMj7n@KO>zp5*F@d 2|p3xO?;#2'è@@H#$bL#w4D@@@@ XZ6mژ Mhr~? V{szle@P39 @YN:>ץ"    @ T\ڵkeHI,Y8͟9sYf@6M^ԳgOgZԪUYgW@h"իWEcpQx y7ɓꫯʈ#6{%il7,Yf5I-Z$7oM^ R¥0*MK9LL2]mzdraDי Q!+ʕ3/}~'AW˖-M"F>E?^f̘!۷oRJw|W;u/EuS{!ǒc… f뭌9n˞=TTI֯_/}׋Lv-^{\y!vÔ`$:C(۴5vC9NMTߦ@4 @رcHw?3Gcۇ#<SҩS'g@@O9,F    ,[oIܹ?#Y`A8!        QŋwYfMDF@̙ѡ`@L`׮]Ҷm[9Y>}Y2&;I u/^;?(P@~aӞ^'sijժɡCl+[o5O?$O6GmFW^u缻hٳg&䪞w?K ӧJ*&ػK4I&e˖-f?}mJ(VҤU˰aL{f%wq\۷=ϝ7Ύ0Xyg(4ɧMh_ʄ 3,勮 2Ȓ%3&Ϥ@@dG~f7W_}5g@ 4aVLӧ8w-X1kI߾}Tфh7ݯުVj]6F5k&3gΔln޼{w,WT)^_|Q48p@-[f6ktbI&&MdΝXDDΈЄ71giĂ DsZ4)g2ey~_s5ϟ%JƍVI0رcE+V믿^j֬)e˖cǎ֭[Eքc/1d̘Q  wޑNj&F3gϟ}H@ˁvcYSϙ/VI&]|w}tRI4\Cqۮ];v޼yҥKXl޼Y~thb{7gCHtNaTk~bQFKGػw̙34+ (,Zh#:ur-a' g}&zJh4$;UiM7@IDAT{=3 q0U@@"NDw1`@@@@C@/7N~'ٶm9aॗ^ 1 T k֬+W(BHҥKDy؉ gϞ>    ztMĨe͚5\.:氚;ٳgjl @T@s=n:T2ed„ !C@x@ @˖-B &qڐ!C%bS9+h7ސjժ&eXMeKܹSN'O)ޭ&btHĨeΜYJ*%ګlteMi6 /=:}܆__F>|hGy$LDmڴw1BǎEX1vm:u?Ԯ];vR\9фb?ŋ?__Zh!wyv&ц&q'Ԅ,=^{̚5K4.s˖-pB#GٳIyu׹zٳ^0 F,Y"EE}Iߧ©< <"9VSB"F+K" @he50BCO o3Cft".]2o- J~C  !3WB@     \ zE/hcŊ@@@@@@@@@C@˱DV۔9s.r D믿6s$D+deQ1i&AhР,5fÆ {Wĉzj9r\s5&aRz6ZHmOnD|) 3f$\JdTzKϟ6mcǎĬ"EH%+H#F޽$b@ҥK6%  Q&@"(C    -9sf^zr%:D@@@@@@@@ ZUf1^tI֬Y#u֍10Ȝ93*  a'N-[ʁofy#l W111~A y9H"~ v~AHs_~ M     D-[QF?yz2e:C@H $bL 2sD@@@@  "f͒ 6ի_FA@@@@@@@@4-+W$6Ed{Yg@@ 4yNdڵfJ/Ex@ dݺu Yt!PjU?Jx Dy$9.1%K8ԩ,    )oIÆ ?4[L6M2gfV  !1;"    zg}&jՒ˰aäe˖RF얶@8vlܸ1^? bŊ%yQ_U<xo*U$9rl;yIvb 9rf͚RbE瘣GʦMzr$O<>υǏL2/_>*^gɖ-/^\rY߲e?3g8sr*yf3wm|]_%uVUW]%%KzI֬YzvA/t))PŖ{?].>&.:kFޜ^8sժUtRxԮ]I/J-Os;wa׮]~&˅ %Jxݧ-[f ;v0ϙ"E I 6ڑUE@ <}gn`=L4I^5jT!     @j x&bL/m 19s&mM" @T 0@On7o^1cFPΑ*$&  qQcJ.5>Hn,hB1Fcqh fʔɮƹMj:l Ppaߛ>}z)ݻwqV^ݧW^-ZjƄjܨ/E1cư5U积/_61TdEcjӥK! ׺u~yC} Y~SBɕ+Ӟ]v6y-ZT2d,>|P ;Qk|?_~qӸuo8p@4aIr>q|jX߄d؎*,jü@[oբh7^>i@@RODgMO    D@*Ug˅ LM@W#0A:+W-u^$X;W^yEƎxύA;EEFiW_%8M x*QDu& ,:%]tRzuS&[x,[$ɕ+*THV*@RI,Rti)Yg/^IɃD4M$oȧ~jƨU4i̘15jHz$Oٳg&Meܸq&Y&,պukLw5Hf$C 2{lS"ϰaìO>Զ%K:m۶nYmԩ6j(ڵkjWq~)R)W\HY!j~Y#a~' l *CZfXEST?i7}͔#t^@V=G˗/vM7^c-nTPꀟy;餓"-7}а8'l֭]*TK*z @rNzLA@ g رÚ7on:[RJ\^əB5  C ^     @: W_;8¶dtEMॗ^r!~*:ׯ͘1J;`{&52&_*" 뮻,wܡ SG}dX e4zxwZC'4ڵMS ڴ/>QA}ME[oh|# G6h     e˖ّ#G܅5kAt1/  tfǎo@@@P=o#@ĪtС WS͛7믿nWLmkݺrTk]jK(amڴIj Shూ}VUMiY{ 4pۚ0a5i '#3}>4~Urf4=Ǫ UVYϞ=]=jT ;8jÇ+$1>6XCnXAO<ѭ[7-o"K, 1Y$Hq8x @ؽ{l]IzW2er   @y߾G     I+WGym]ѣݻ7zf@(_ +[țoӍmܸ1T5bĈD!I'd Խo>XQu}n? vwJO>1c,̙3j5j1Q7nl>l,6JW_}=CWES|bŊn|Xgh t=8qbpu!X7Ըxbڑ#G& a)s=1)TuY      iPoG  b@~]|Νn{:/R!   I)Νۂ4/@ Y Zn]3 q5 .l?/zUQaximu a:VN;XhzfXE[Sb^~dL{M:Tk% )SyUc#-O?_|aZVyuڵk#8@ q8f@K]{u.^,W-\*TS   6     4~$1'@-b c3=>|شk6].]?E5fdKC[fMh8- TXbZVwFkժUо._y7M} B5k^?~^?MM4q F]jΜ9ּys+UTp !=1b%ĉNBM= 9vjWٳg[nݬFVHUǶnq[sNC%:t(4e˖]Ϸ~Q=VA_~mK{gjլW^iӦޱc UKӓ.SOO> (N{loi Ʃ |ԨQ%Kʕ+[m߾} ŃaÆ9^x7|s9ד{Ѳ2'ܼ˗/tӱPѣG\+S1>i^&k&I_]Q笾}e:usׯ)[I_뮻._^*~ҥ{^Th-Uq?Rw}h}P!.Lmp    ^8cU֘b# @ ^z/_Dc^y3ɓDžLXj*:TYΝl?Z!\1ceE\@7SLq7ӮzX =Ezln^uԨ"rVp9?a<^vecgUsUWO?g7iU!I5$j%K駟l/o}+]H {nݺg%Zx wۻwo>k`QK_vmn ] =/-;gL[on7 ;{giӦXK:>yߛ*Pe* K)PZ@=tP[jQ<0,"*W_}ͫ}ӱ^skYgk[ R* \n{YPaO> v/^),Yϋ~t|Z-y%մs=y&_~}wLS    d.xXxqq}IC qVz@@ :G_lٲ6cƌ9C@@:ȑ#nG| U+#k3`G}4fh uEՂ5B&Lp.wQo~X fgMmRȆjy|S`^?_K/cHMP~7m47UV y 1i9vX3g;62o<{\}lxxJQ_f͚aժjy!&I#tMKxȲ@"R죏>r\T)w cNq`?@@i1gE@@@@ V2bĈC 3ĩm˖-sVZ Z:9+___e[nu9/v*'QVml.r_UZF Wت;}ƈe{\Bxب㞎*׆?7W}]wwK)Q!bSO=սy;?{DviiӦM)izͫjZF^[s=gUV*MWqơJ-~s~W`IC@@@@P8^ݺuK}GC t175 Ļ}eP?u](W\w!  dŋC['1D&ZPuV5!IՃjjf"[mŊ.(<7o^P[,V!>dQ+C]S-o~hj:"ggy5jqT/-6l`;vpTsZ!`7v$+׻cʷHKh}n F oL=icY)o6P ީNIMRM5ٳg[BB׉ Xω^WLFI%Xi")v1t" Ǎk݄֙ж[JowժU^O -Vo'| iA~}@~P g1*SNr    (P~}=6t%f`7Ts޲  &L`=ۅܹs0;LK ^:f1+Cйlɵޖ@8غuk$r7bX2J #|(&f%d'|t!I@s޲~/ '^v'YKq=bKקV4+8R1m߾S>LE;.}U͑]!P˿׫&w LOhj|M#Gs… 8t 8 Mj~\vڴiaӦMCછҵ@ToHo`HZ aF8c@NM6t= 'طoD˪ط ƴ֊r @Zt ޽{Y d[nZV˲   bBO]E@@@@ -[^xP@tqUf] C-[h~/I4G(|g͚5IMN4>R@hĨ`AIVMs=gbŊpDŲxynXL*5\c*7n\*RWZ>}\.A͛`szh{`) +)7o)*Ihcǎ XZ]ƫhKՉ )[!.220:)Tiɵk׺*VQ}Ӱ۴i -Y cW_m bTBe^uU1SN)LPq \#.‘sP=OWn !LiK*T檀;=ڹ* squWrA*OI[n5+]9@`jG͚5M gA /6K;+ĉC5I1A$    @ I]P Ytio-X6A9%# :.Ct~: @@@c |.ctH'ւ[< Xݻ5ʭGimmQ˟?ZW5ۜT4gS` ƒxlRq~)KϯۦMS@SF4 ^yZ^|EWH׹B3U@`7@ ~)7ߘnj?s(XNszR1&M 0^?׻F +1Z2e"ڇވ3E1R3^چ nz1HE\gH͇He\RVZcy5_SZwR A D liWF.,b SUTq]v5^7; 5>V @@@@2GxVjU=_~iK3l5 F! [_~mۚ.@ ͏92{4{@*tqb fES XovgOBR$xj F/=' {g]MZf4A{+5_Sgak|ɶm6W3`A (]amU"~.hJ[V5Ug{=US=T I&n|jפ ].^vVٺuRcL @ 8c58ľN5ZHg е _~e0ek޼yjW   bO G@@@@ + >tRW_}. wmr ׯ:vU{ Jb%TlYS ~.Y.©`M6"!|ᇦ$֩S'5K7tu=iSR:ͺt l.[cjG]Hʷc+iӦ.|O׽RĘI~} |Zre>iu4]HKaCuA QFFu @cEطo_?:ˇȑ#/ ML5kof(Qjuֵ38#knxѣ1 UȢtif*7o=.Wjrk)5)wcOϬ{ٳgw}NU6vXMwg+wX4@@@@j'NLKJ>A .0JEAV6=3*-RS_٠A7N6squUw#~Iͯ}l1I,u9}tܹsGS?U߮4ct@ j}k6|~7|4|_Mxx @jt{-7o^wI۶mSG@@l ;    YD@')SdM@ @ɒ%m̘1n‚ l֬YgrW|_|Z,TD͟?ݷiƴxjbhhRO&5_ŋ0FWpfvn a E1D,[&Gi~^?>^?)4F}ϱO*UrC],' }qTR͛T_}n`.Ч槹#X\_\T+bȺ`rM~?m̙FS[lo93m7?n4OjUP!4Cy2kXO>]= )>3]w'TqӴ2e$X     7m0xH?KJk1@@R,sKt2p3p)^3"  l#GΧ.]UR%gĩ@Fւy睮Vx֭Z?M6O;WTxB9+R bS~pyaY}}ki~^?o F=נ5>--X?|X?V oA XTӱqܹn3Rw )=z` lx4?oh:hjţ   dO={hM0.2?{@@ays     +WѣG[^\Ozmk׶3lH@ͭE6o<{\_\R|r3v}Q{m۶mv''7{i_| ^㭕(Qu) 9i*KmSqwݏ̯Х 0^Znݺ;v_JR>~}vϭ-d4)+VXS-tR[reju+Po߾Y{7|cy5ӳmܸjժh:[xaj sWlݴnK_N f&H~{I^Oɸߦ6lpEiox/[ 8кtb[|3@FB] \E4@@@@_.(9C X ?dO9?o! )[s\YfY2eR<3"SfϞdNg@Bwq;L칣 ƍg:;\_|޽ۭqi]#@: dT-j*.r4i=cQ/l+z= >T7tWfQȠ がJKꯋ-jK>1^pVO?~Ս~1uZ 88>ClnVZYk֬1_zU&Zw W^y q)=z` lx/4?ohif, >% ]^pU@@@rA9g@@@@4={|M۵kuT  U9}tСCLvoQF.l8l01bD*xѣC4ib tWz]v{UR5ǩ)V@]T0)L(شNN*O>B5j.-U `N 1^wuF.*SpPT'~r]@IDATs$b۷wBy֭J*j'L`w_/PX1:&Olo=j Z.]tڙ_ZoU]x VYHSc~ O:5< gu13ޚ1KYf9Sç%1.Gk{W.KƫUXN:Dm.\r ?+q`Ϛ*!    @ .]ߩ/[,U,fO@~Çw5hB"]<9{@lbsI,ęΗ~cpdA{M?P_TsGCZsAM*W\Q[_zI-UwְaЬ~X5j~ 0Vi}W\i3fp'pSPMj͛Ǯ!՟ᅴ:uhQSt,Cm#TgC]ɐ!C_3rQb$FٝwKĘ @8?|Wj*w vVAK,q3!mxe9@+p <83X=B@@@);g6{    -sϙ UTxHz)Dpǎ>l*۷Oڿ/S ]-^jժekpthX!?c\%JxqW~)xR uOTW_}S@M> M ښ7[C'_r%v?> g^z| 7i?EZwy~RLu t@3tUex zrU悱h~#q ;0SW]u  _m\/JNWhQ*^6 oG'ǔI&0FM*8qbu].xV7|sizc,ի]^-O?~޼y#-`裏~dɒ1֥/W>eʔv~ZfϜ9Ӟx ›+VuI09O<6zh7N +u 6)Yp| #    @4nmHOO3fl%G 񽰗@2K`Iޚ6mr   @bL13"Ua&1|Xx)il۶qܴiS(Nݼy͟?(Owq'|j'pEȪ67{n7>hx$n$%-Z Ҿ7dS2O>}l={]Q F޽-w_Xuu7PVMb.]Bh_ӦMs5R&ިEn>?{ @Hq.ի;t|ԱH+ƴ:9dg@,k# 80}Ϡ'@@@z     d{bŊ %XެY3k޼ywvB:t UO {;+&3`(`HE0Fr::Ϸ"EتU ` DE` {RX_7't=#֯_?S𑼴*,RB 7߸=zXJ\pNm׮]n~k)1'VZ9?= ^U˖-m˖-Vre]+Zl C+S+1gW<쳮lڵ&koݻrӶMŰn'TpBWЯVꋠQh fwq T(6lp#3    袋LS[h4[`m9],sG@ s>#kaՓ|=^uO?Ly)W@ Ѥ6뮤&3@ NnF0aBwCKr@,jAo%T Ǐ4h͚5?L^!w7"Il Iʛ7*[&7c*~5~9ݫ:xG%9Vi}oAw%jiW-Z7'Sugq{-|n:!Ce3I.[FDTkCmݖ`>s7N5ɵ֭[׻~_U_U7VrùrÇ>*W^ݶmj5>cIJV<`] [`ܸqv-vR58h   b     @*0](Cb*b!YM}VZ5h(&M'09jժ3Ux ߊ/n ,Q^AAc߾}\r.lknw)H+'eʔqa~ S-ε^bmO?݅ j[ F'HoԾkKý9W-[f dTjuSS^=X>G[RJץ^sƌ[J5:)DH kGɓ'^{]$42FiQ7X  @6еHn4wF6ev @@R)?7?e@@@@T0B.t¶ نYq"ܹs]oc I 6\ ^xzpػw}k.S0 a ($t|]c]XA*8HT ;NsZ6!pt+Vؑ#GL! 禢g9V_?y[d{.vn&X.N U0lJ/Ġu֙K*s==룎 ;䓭zPc;w{ԩSDžk?]W*T^ UѣIz1@ǬN8!ה^O*X+HN1;aw~qRC9*Z*g*Z| ̙3Dži <8Q#k@@@@,!Qj{g~ɬ!0l08p)SL@@ׯ!v۶mkӦMyfd7q)q)@ժU9:ɇeܨvU!@W^/5d[f1 3X߾}]b8 S\~XGE\"@-h0gdWa\uH:S\m[Fdf'ǭ̊/cٳݰjx7v ~!@ ر"v[U'ZGķ@rHsA 1F;t   ɜi`@@@@2^@;ao۶mlqwC-"/PHkԨQw4=Ai9]tT7Z *^S*9s-e{\ 8ݢi^*U-3c%JR%KZ&MR:{ :၎5jpe^SG?ec1X.^fMwvu*-i     ]t bܿ-_4hgYNp¡>۷/4  urڵkۤIa|  dc.sC+`b"@-hLJZ Հv@ K*Uʚ5k}Mkxw "ĵĉGnƸ~  '@cٳe@@@@'hhpw[:u2d>@ ' t1W1sRIzEziڵfQADSy17     ] W_u,X 11tqPG@]௿N:٪Uܶ*Vh3gδ`Ptw   d;G*[UR%#;'@R='zDS$!  !0e֭߮C7x1">:G/@@@ b!    35kf{=Ν;ۊ+B 9F2A`ԩQmxQ-o-Z.(+:}Gr{=Nen@@@@@y!9ssnB#@ 1@@ j^z'pVtǂ   H`ҥo> : @z P[7OdM   @,On]vÇFM.@@f1f'A@@@@ + <ؖ/_n3gδ~:ud/;.+}GkZ.+/Ծ}{+W\TP^c!@?u|Hs#    (_UR֮]k}ٳNJ+U0/I Ę$ @@ .0aBM;묳q@@@ ̟??1(@t)czbj@@@ ̚5ˮ 믿Z{i>ʕ+[aU   bn(    @Iծ]6lBo?|+d޽{gfrO?|Ӎ sb_R%wJ(b'J.9@@@@@ -[ Çۂ .f5,@"… ݻ74  ^FCΝ|M_~zm"  0s"'C]݈ESb@@@ 7ou:|5 a!  b̊}F@@@@  (dԩV^=?^:uX>}^k    ,hj }XbLJ@@@@@(ЪU+9r۵sĘLڧ"ELc@H'I&mZ1cC @O?vie˖3<5jd:*_|FJ*o>ۼyshJ*Y|B6mr,wqIQ@ϢEQrg[fMu.]*T~$Z?#>s[v__rnݺ&`۾}Q)VXsZy]&O?ٖ-[O>N;D9rľSO= .zva{?~ӸG #td_-]Խdv t_l{XjUӱ    'sF<:ץK{饗,wYz  q'@c=%t@@@@jԨa?]uUo5kRhK@@@@@@@@4n(@b$A@c zݻw7Iw}v 7k1#@6Pp݈#lȐ!$30/bi kРAqI=hժ͞=ۅh"4O?m=\}նdN߇&}/= \{+ݯXš5kq}訂& 䬒U[nEE\uӆ 'O6T_b2iuuӍ7hӧOw6mj .L4~gU?tP8p`бv+Vh6lG =3ltC=~g ><ܲe,o:>C;|ۑg    G?Nu&L`y>;ɞ   @ Ę@@@@ڵ-[̞|I;t+VWQsҥ]%!        - *d^x-X6nhׯ3<3[;Ŋ u RJh"  @u饗`qwa,YQn1cƸשS5jd%Juٗ_~i_-^8]+S SN 6cyFw)P~m۶'N±N:餈Mȳ> .V/?lk֬1G*lwI }o [eu38vek׮u2߼ys(dɒvYg%Z֭[m߾}V@PBJJ4.hRe͛Z.:sNs\k/skݺݻ/I&ϣ!  ȝ@@@@Hy"ʕ+6"fd        q) F̙G M 0Fc(Y@"ر]@o۶mn&Nhy07@ ; ̜9^F"0jr}٘3ԭ[׭SayGIse˗ܦLg2i ,[ܛo`wŋq#GL¨ %J{Dž&X8cKӧյjtS܃?:wlz;v0 9F`Æ b ZѢEs̾    Ļʕ+㺪?{  ġAq%@@@@@ҥO"        9OsϵN:|`yq)Rĭ te X}_l}3R͘1 ,cMqrW_}vbŊлwoSڵkmԩ1^jիWw{ccp.XH} f> Ixsr)ܵcΦ`PZnn={v4i}G bܹs͙3ǚ7onJjhYH`SOYzO X Lϵ_oߞ5ӭ[7Q{ZjY>}l֭/wVZ5;vΝqY?R?is,Yڶmkn?Ӟy7N}Wj׮]mZ+~dsG tk.֥͘K\*TȽ6Vjz?Ѷϟk֬q*_ 7.~ /'ܨ˗]we5ktzw=> +-Zcr$/rh '`Ŋs_-Y$|xᮟ}:u{֯_?|Ygs=q~}kӦ@@@@2Y`ժU[vfwߵ;.{@@@ ͪ     s֭kFnTȩbP        9Q W\ clժUN`c,PhQwvc @u>3b(9S@vjfrDyf%p{뭷ڠAGuOz:0` 1_]S֝z&ǧe_w =zQn ,M6~ƍ&8o1݂M pFLϟo_~;)Q}'vW͛(g}Ma/ :~ҤIo=бIѺxD}駮Ga g]vwOzԨIW c    d5k*~wי.{=4@@@ Z.r     @F z6o>ر(2l @@@@@@@@x^|ڴi-+@A4@@  LQPNJ,B+TU<daڵk+KwG}-[mŊXpVX1N I[l[{jlrʦ6#F83xsrѾ.֠A+Zwqָqc7Os"P࢚S.s3*{1¨@η~La xS@\"f§иѣGۮ]?Ѻtu\M+L!z 9\|}.TL]uՅ0uY.(o޽5\cwqGekȑ#mn|o)1,-V)pǎΕ+WhN:)z S.sw6|8rL 9\@!   L-[8ptA1cƘ.MC ->q߾}lQ!xiwO%.B2 ~… \Da| (8PM!:u Rn\pFH_#u%/_}Sh l.14C`@z&LU)PEmٲN9t).wܮNsN>d{W\P?=^xҮ]fﺈ|KUf޴LѢEM{챍7ژ1cMAVZfذaVLE3qf9 V47|V ?}.+-?+W.Sx^wֹsg?,$w^ݻw̥ACJQHwG7c=PpoA Sw>6z˨ FCӴXesڑ ?AN!~ xknxȐ!F7?xwؿoS(}wɵ.1yu [Bj:OٳC3 c! @lخ! dK_iӦm6jr'-wB@@  1è    B|6m4kҤ߿^z%;]},:@@@@@@@@J:tpOWu^ AYًϾ/lyW Ļ?o F㤂q}_BfԩSmѢE" ;w?ZE>G쑢y]N>-5kUSO=6ol'Hb b;v(P- ԫW>3==~wWB ۛk׺;wtzp"o6m2Wdt?PR%?I{۷k@RK; .Mψ:uJfjQv23=I Mѣ 4],;'M*֭[7~m+ĉC5PH#?cO?d =t萛c?݇(X`hGI>ff ]޼yE1_?+D@@@@ lذ}]yqnj @@R(@c @@@@G@*S Tٱc$=A F <8Fkc5 Ŀ@ҥC8`@ 4i$2#    @h߾Νێ9.Cec/2M <1:†@@ (nСMB309ZZjBƏ.t1;gYfٗ_~ / /6l0\ 裏\%KLu6)2Vpa+MZ^|E3f֧Oxi8Gk[l(pu.\Q$W_p8ئMS- w}`[z 2xC*Oc7ߘnjq u(L.$T#")S&tw駧hi(E;Ù1n[b)RNJ*UXFk׮ָqn1Rj-Z Q \馛_/i{aV懃~~6A`ݺuw߹57lЊ/[aYE@gO@V3 ڥ ĕhěƍMnv#"N@@@ k V-     `W\qva*QpZA [ (J7 9Q`N|g@@@@@H.r^n][t}?XJ/Jm1^z9cK@E\֩_1[?+B-.]B]X`z1/_ޅ)G' 8$Cd:vBP=zttӑ#GZM˖-so5jH*2|s,Sŋݬ~j*b?{rJ۲eK K|ڵKd,*N!pӦMs;wڼy'9sXժU޽{X߾}L@ZjX>V@HKJqL*D2|i(|2q~Lz]Ξ=ϱcnÇO׮͗/ %=kZqƙxֶm[+[;^j3f2 ǟ{TC Lnݺg@HGFC@@ 9ܴiS-w9؂ L߳@@@X Y     Q ݻ矦(@@@@@@@@I:t.NC -Ŋ"U #b U XP@T ?(*bEŎ *(R+" E@:QA&$9W6)gydݝנSNw&};r" 猺X3/\ЭSX1l3/ve~k3:Zwy-X 7v>@H*38Æ k@/QWhM* (b}8]c9&93  s     @(P&Nh7UVz##jE ƍmig @$ ^sГ@4iʬ    4Z X4-[B I?:%JPVS@@tnf͚f^̶g9vUV-d?%L;p׭W_}*U)}g?K@ J"@es:vjRrȭ[Z*UB,g_%'C6/6rάO-?}1#]t6;wv̙c{ R@C.:_7ް)Sʕ+N:msuI쩧B ׸qҼiǨr>͛7gxMJy)_|3۵M6yVZd˖-#FK/~$ip}W/L~yRI JTs4V֫>G}Զm=\U3 8wyǖ.]l˗/=.%X~СCiKOIr'I]ux5SIums| (+$b$xF@@@@ 6n0Ongٳc@@Hy)/    $@ݺu߶mۺwwqv&EPW\ I)PR%3 d G}d;w@@@@ {u Jdq7ݏT?ѧ  tC-[̭RN>}(Q"&G|J¤daW]uJxbK+^veֵkW67=B%RbpʝwiSN gUD2pB }.ˉwqu%T3/3=ʕ+gs 4Km͛MtPycczV[%N tׯo5j԰~%U2 L/o\r Ν={؊+lɒ%.iߠAb#ڧ<͛7%5O?s9ΝŪhr) mfw}=娣r;{DP2%  @x}J*U"RJd?$x8FJJ%Թh" 5EIgë_édv $/lÆ *J2|pk۶Kجr/gq)%`g;رcb}|)+ݽi+1RwM10 @Ea @qEl@[lqIWZjS͙3*TEl  dMDYbm@@@@s>}؊+GuAŗ\r W@@@@@@@@d JĨowܑݥo$?87hu6j@@ A:d=zYf.]f̘aժUKli%\RB~%FڴiKD^իW7%w͛7of/_ޗl* Afn:m> [=sah"*֒%K%iz޽%uY$I_VqA$祶S"p/zxKܯ_?Ӄ#F0=֯_޳J]Vi'-jO>K"qJ@rJWV-;ꨣաz3;oߞn;nM* F#dV=Y>c"?+/7Q>#X.7v67o9%p>w$4+'0=")ܳgKTĊQF Vg…mȑm~7hw>+csJWM@_&NX6)     ?JXb1#  $b %    $mժU6yd(ޮ];?l        *Ε|Q91Uς퟈qΝWH   T٧O\(ԩS^zIO:9#J%{J(a'|{dbW{"9vTP\4pJԧȩ}tIS~"JczM=mŭI&Yڵ|6k,K۰r >|}]zn;    I.uVqŊ5kִsZJt@@QDxTh    D%_Zj0n޼M}gVtfc@@@@@@@@UZjָqcw̢Elҥ$ĉ׃KW1MC@  `/{m֨Q\j E_SN5H"kEmnnjMk@ ?ڷoɦ) <)ikwvڙR@@@@@ {~kٲ-_F6g\rZ@@@LHĘ @@@@@ 1$5e;mŊf:G}DUbRZ        @]"FoСC؊UG O4 Р̑^+5kdžEꜨAx hS L8ѷH*`@@@@B . ҥK:իWwIVr   -@"~@@@@52eӭI&eMͽ;?(        $@.]lv!Dvs?$bg @" 9җ[ǎk_|q"u""sE D]nojmo@" t*UQ7nvT=o/h_Wj"k@@@@Y`۶m֪U+ܞ|qΜ9VZl3#   1c"    @ ?К5kf{w}gcƌI|@@@ >gOטbŊYܚ     @6 /_Zli3gδUVټyܽ3ټ[O2ҥKO?dv#G-Q@@ u^x4h`ԨQֳgOk&@B '$\jMCHvO?d7f!_ۺu\cZnmŋ @@@ NES@\0.^صJ*6w\^z."  0?L!    @ r)6i$k׮8p}Y+S=Ic@ .+ ,hJ^F寿o&U|J,i'puիW۷~kK,RJY͚5M6VHZw^SN:7?IJe^זX 6ƍ]*T& ؟i{[8Q`YշSlܸZܺuuF׷>ڭ:?KrjժvQG.r׮]kqXb~w_lʕ3 ? Z||֬Y Y}T[_A7ot[ ZF ݻmҥnZ9Rn]@*#q~|Wv9 FY:u!םh/2hg6h dd\To4V5  oFӧy睗n>3@@@@@_ꫯvcǒ1ɓn:d?vFN!@H#o[߾}]rf-:ttMi   %0~x߮;wfTj<_$1}:FULf޼ys%BK7hР^_~6o޼+a׮]\`TJ۷o:+pvM6-貅 &XJ(a?H˞|I{g\_5`-%R.^{~} 7{iѢ͞=;:;u^s5.l+m۶;voJfno̘1 u㷗QI1u=V$wyu-q>s)kU=7]ӭ}]?:[o`QÆ sоx {G5#ͼoїj߾}vgAFi H &X>}ܬ+W1FztZ7|5XQ݋/<םh:V^?oR~k:+, P;2e7# >Sn{,-X@@@@@ #/J*e;w4%yǭxm2)SZ$ @RJ`I%gV[N):   G1W(L jEXOձdɒ4IwXʕ+fyvHxh#T%,~p׿\"F%'\`yޢ4+VpI5Sĺ(d̙j?7 ƌe1ٵkW*oׯwhѢi+c5j7p¾iuuVۼy;6 'N_7i&{M'#-^Ko{n֬,;ڛP~wSp_ժUپg(uסD:7RJ6:O?tw~G&br{*D4ȿp$iӦH QuӤιe˖:%\n]DNߴDVYj:RzxD#^b`գH}JsĈk+"Ǻ     @pV`/շo+3 K= `@}:u>G}4eOG@@@_@IX?J,P | FMŧnٲ=/^lzL4FmݻwTڪ178¬\K=#vZ [X>ϛxH:O'HiyEx V8@_UVwvx:$a@@@x?Zڄ    !p׻dwu[[)JP@ 7ӧ*=r䈽.FI(De71|p+ge:j*СC.￟.xRI~G_]-[tɂp֬Y!1z LMA.J¨5k:%KԩSח_~o^x;t㔠2/Z&M|*Uru(7fwVxMItC%[5w4DҹG`Сki .=d+:wf̘ᒐPE u\A9*9h4(T2߳gONٳgd+!z,h$'םh~ϟogu򫯾j͛7wӡ~Dr +Rzx      |Jϩ;DwGeʔտ}v4  |o%Vt˓'OjK@@@PB%t͛E<_41zm`)/x=zve˱LxHsn:7njW_}kʟi]t͟??FHz/ɠ:hN[^}UWJn7Dn6SV^臂}W[۶mMiӦفt*Pg(X/C=Qݔ)S\pnݺ t ԏ? /;QG@@@ aݾ}{;4Xf<_,b=(cРAnт lĉVjes5b-[f&Mʲy"9ϛrsәxސ$@VA;;Y~}ga^{)n4XU"*}߿xVti:cƌ`nў|VT) W^-ώTw}gݺu?ލ5cT^=ӽs~a:Xtg%<]Cĩqɒ%$aE@@@ @4x    @^|EYI/sk}Jٲe];gϞm7pCk~۲eK+^=>+Wա6l5k֘߶իGt)XtO<8+ kҤ}z4, ꪫ|˕LSիQFv뭷OI}TF EnZU*7-Ӡگ {| }+1    D ues5G5`;Dr&7Rȍs+077 yX@DuNĊQU<>{x kݺ{?\^\s5.3*VСC.O>q;vf[P cnQB@=>Tqq!kŃ+Xv=*;i @ NB%aYff!   @@@@HUܨ!gw6%ZxqorD`x≾+VؼyB>o.n|͟?e-%ȩWkn ,޼*UXGZɍT:,+V,X=\7[^t1믳bpmM^?oex-"FVP(KxI?6% /[7x/c}z=2bwn[/yY}gVgFםzGsofdP~=A,]0avii&}V(1>Ob=&Nh QÇ{ڗ>[4h`yۯ\҆ >@qJ(9uQ֥K`D~g|c";Xr60ģI&@@W +     Jv6ydk׮K8DDt#b+_*=S}0=BqY=|*%Fʛ7o~ P2>(~5O%2"|M6ewc7?K]uԱ1آt~wwnxvmfx裏Ps̱-Zx2|V*g=3L2.PeXI.T` _s{IfJVϰP%(>  K\dgj_ ᔬ33Nnfy}W'$>36mjӦMs ~*K.qO<}_uaÆ* r8 ٳKĨz+W6u nWΝy+Ԯ]n2w%T":xJ?o(& 9:$7vIYp{\,JŽI+]o:&>3W֔4+::z+:n [`ǿlܸї,K|ƌwPSRO/Xe5      + 6믻FUԓ cgz 4W[r=vRBXdI$$pwi:$̨Zk[F@,CD`ӦMޒw}ӥKw g&1X(=XYY񼱌# 'RsQ2Foߊg $sF<‰s~y]K"ۇ^^>} @Jd$*w /5J*nfW^msK[o^zꫯq%gTA;q34Ƹ^۶B /W_D .\#FYT޺oKmL#G,Xr60ě/b-[~5M+CcQ@@@D c"%ڈ    *@%jӦ)p@7j%&l$o<ꦒ߭_֬YzݤI0aB +Ud%J Bnb=#vܹ7h3D9!l *AH޴ܾ;;Ӳ\wvopQG-* |%_R\ तVJcYNm)9u]1*h%D Ujn^74-ի?t+a쒀'b J4(TqUˁ`~ɞ|I(R;z/_>j,H;9R+o{H5]t= ,Jl 榇 ~?.R3H΋Sz$^zDk߾}RI˿xC%p֍yudY,>I&oٲ%Ӡ3fpY}{mhY^#TPcF2]"=/}5OITxVCϞ=<*Jؼys7;4mlʔ)zm;LtћgMa?wRd(7/%b뮻I'd bˬ(J  ,;?2 Ϭ ,G@@@@*pM7Y޽f_YSC@?١  @ vw*Tp3    *Yz5j(@| f53cI* gIxH#PۧO=z ͬ$s*F4NԵ~tIkePBí7ez-7Kxnu?m۶1cƸDsOw=#vہLIo?74'Xf9iڞy%ԍ*r/^b?:/i 2/^,W P$Nk׮!^x{']?Z*;NnfEk@7z>%ͬl޼9*իWO3? ҥ=.IzKwEewٳg 7`^`g}v'CQE%:~Æ s)MW\q.]:hWu\ n3SNqZ785%bHΏx    dEGhs{YuSP@߶=]F@ o^x}gP]GUVrw!~%=I~@^]66g@ f?xV}:>)>rB ԷzuV6ᬓ\{<:)N|…GDu&7~Yq]K" }9-i<tR#x`uL1 TOu8Pf/_[5ϩ+,#F7l~ux 'XӦM{vu&;JLH 0&   3%b@@@@H%2eʸ$\J|r[f1KIoWe2=?-ZW}+D9AhHݨݴj%b1jYˎ;L U zQJ ƍ3MNmg}5i5SNn`ƍn8ꪫܵ8~(A?on7{[y믿>]պIruS"zDMk׮u\Fo%9X %g(A_+\ >ܔHRׯFs,Y1ţ2R@ TS`77K lP{&pV?%bmݦsQ8X?G2rJS={XF_~ #~N֭[ի#>.QEUKKAH5u[@ $BA@x嗽IS"F ȩx>oY9;1j)x+d*J~J¨$q;%%NJf%g9Q½?׬c@:u\٠`c ѣ|i׭[f~/:,WV&MrI_M6Vz#G%a7o]y.o͚5][tҍV (`}5}'۹sK* "$7tS.{ 1|M,pc}QrKHϏ:y    dE@;=3fM-oBEkW2F  $M+VTS@@@wPiҤծ];ޛLUJgf JjvZ6,'pc.nso_?ͬMg%NxGa|IPHcsXᠬD c$  Y c@@@@RA@T1h%fKGS@7|W6yJAG}^^ ؠA͞=%;L`.^rņ k;>[7mZnK.u]w9wwJ|Ĺ?`?[dzsϹi]f</K={㩭EIsfby8ם~ @wof$0 UD MSbE2di̘… s iLwnEK1DrH@c+i,=RZ5u2;ʡ.@@@ @@@@!PB4īy$c l8묳su:42]t֯_?dt3Bi(hC7֪xBn?ӦO袋EטGΝ:JH4).6;];;2jXzcǎvA{ǂգ k&̯j9\oͳe˖$OJOE 6dؤ?@IDATign,{Wbu͊u!j2%aV1b3qVlYŰaò?^veBZʦN^{Y36SUgL2r`CΫY[ϭpKʕ}n޼7:tpU0C+ŋ7o=%f*`Pmm^}U[~}b^#    .pM71j(48c}g4  xw߾}MW,X}]kڴiu#  }lܸqKSҁN# [<_8^C=\ˣ&MZ5KMn̥J`?L<l:8v&7cV$,[6e*x*&Mۭ{MQ V8-br)nΏPŋJLw,bC @v >P0f0u#  @n Pn}#    q",cfl͚5qB@b x6%l!;vHAYѢEm׮]v9آEҬ:1x4_xt̙3ݢ .L'V}Q۶m[:R}7o [͈$;yFrJ@y{iٲenժUsZs @@VZ;#    I %cM$+VpJ8k,;㒠tPO?,X`{KB؊ݻ7rʹhÆ .J*yF07v/. $TJ(:i 6{\7ݸ`2mӥKt+GFE }ڌV2s1n୎;sh{ ?W_}6(Vh۶)ҥKm.IRF g=n\WALv7x=:p5k)SV1](\R1cƘ:uӹޫ?sv rI?deA8ם|8AQҥKrF)5kV$4P!C#<8+1>umgĒ%KL1*4W^sI+~=vg~ %[p͟?_/]Ȇ}7\"ܪU2}w5 ݳgO/k>_x۸qkUEqN9mfw}=Ӯ=%QVB2enk ¡GFcZ%c,Pe8٥J E]a4l:wyv '͛]"q}~;@@@@.]k׮aÆ'c= #L  @ |xJ9uԠ92I+'J͚5 %m^|}dj|a^ } ^Rؚ5klΝnCGJk׺e֭~ڿ(hpmQIhSEIxeYi֬s 7ɓO>qmsGue#     t֭0uYm²(_[nM3 #{1`O^K.$q:@K@ ޽{C.c  &AuomW .|b=C/?JC={t֏d>c.ϟz6xd řx^t`xDD4L#Xăp xb2dC?S Jؾ}{+Koʖ-k_-]= ƍgJ\]+X>3}>SX1Sf6K$1ݱ%I@ @עE [j[ %aZj  $@ Xw$qO@@@@@ضmKpBc9fΜizj6%͘1gϞ=9?o\s5vXիb3пAhɒ%FdVrLb1D+{njӦM.yhMk\IS_ Dn9lgyGӔ J*Y5\T=^1$XD>@d.ׯwYJ 6}^dЀl\40H2eLɊ˕+-OǪ?v=St+1@@@@ e^~eꪫ\5|2} ,_4 _nj& СC};ࢺPs۷L8J@@8߿/ 8F=zx㍙n -0b4h[oe\rIgtI<_4@xG)Dnu}N6M+v{uӊi:­J xÇۚ5klٲeV`ARժUˎ:ꨨڕڧ1nذ5jdKh,KX}͛7Ʒб-ZhLLé$Qb $@FcrsbfE@J¨Tj׮02VVY@@D P    ą/Ξ=%7ꫯL7l0ܰaøh#@4pnՃ9'O>=rn'Y A (yY&M"~8s#>6̗/իW=rj%]ċUBN ` b     @v \ve֮]kSN ک]P[lM3 /0|p_F'$ c6Z@>l  &K/UH+狚 HX:y#sc+r[ xмy#I'9嗊… voKS!AXn5o'ԩS%aTR7    @"l@J@@@@HnRJG}d\p}駶sNkݺM2%!$ѡwMHJ^}l6d@N"[̯ZD۲ @v;X 5     ȟ? 2@ fo8Рa7oN  Fo@}@@@@ ƍgvrM˭dɒ|ڊ1 $TWW4STa4 B`͚5֢E S2Fu$*TH @@@ 0@@@@DXb6m4 mٶw^k۶M0:t,FdX|M4)4k,|@H7r\c     |z϶lb'N4 Oң*VhVrIT1 SO=ekv7^3   @ <䓾&7$sS*Ǖ~">9c-zjqÆ nN8W|@@H1&A      ;E>tb߿:ud/]~(9&*Uh7h;6B ;{/P@D۱ @lRw؜7Ԃ    H`6h |z!{饗A @ \"]vپ}pi@G`رv 74tP2d5   $'|b-rnڴ|ɉڋ1 $TWW4STa4 Z`ʕֲeK۸qlj'0+W.E@@@pH     ! *d&Mƍg+4@&!6g6$駟nzPH>}$KW Rv;XJt@@@@r@뮳|жo}cիWρ=DX6mڵk^3 #+X߾}ȑ#Q@@@"x'|[` $yw8A@ }8T ֢E ۼy[~}5k-[o-&@@@ț]g     @ϟ^}U߿ۡ0mС9        @EomyA{"MYrʾmܸ7 ďqꫯÇF ^Q׋ @hѢE$]_|8b_ @ @ @ @i5kL|gct~e~(_|BDE%0eʔԩSc;P~Ȗ @y-p￟رc]uҒ#@ @ =\y䑱hѢwԩScwބu!@ @@ (ĘVf @ @d@Æ cQV4wy'5j^˂@ @ @ @ @ H 80qee d.j@qqqi 10diӢ}z4]ưa"A @A`ݺu_\iɁ @ @f <3iO>$+.)Xj @u+s  @ @{駟 .Z(:;vl.@ @ @ @ @8CI^pa :pW ԨQ#l޳lٲ Om۶UVt%E  @ @`;3&?37o<6l0% @ @3gN$-^8 q#D*U+P @ @`; lyMK @ @VZ̘1#:uӦM+WƉ'oV\r%e!o//ԩS$@Y,v?+ P+p @ @lIo15jyUW)b- cG?D;Dݺu3 @xG"ܹs1"ʕ+'7 @Fq5df۷oA`K㡇J*\  @ _C @ @bIšCo~(**JMΏ;Xd@ @ @ @ @AbŊ7tS,\<b!D$ @ @(ܹsI'cƌQ1_ @*u @ @B]v̝;7:4UVE/B$3 @ @ @ @@Ѵi4/1`,JZ8jժN~3m @@!$E[l}Yn֭a,/G @@oPTT,`  @ @QOkצ >t#Fr2  @ I 1nN @ @غKL2%>D Dze24 @ @ @ @lK!CD )xW+d-K3gnP㎋/T& @ @?7tS|.]DsS @ @@s=ѭ[Xn]6lX+%R I @f fz @ @[J$nH6K1a„87R @ @ @ @& q%׬YgqFm:@ڵ3,\0 @6_`ƌ^< @Xk\wui˗dqB#@ @ uٳg;CƭmT @T;yir"@ @ @@. uY>DΝgKѰa3fL4o<S& QTTu#@ @.tM' @ @/\veڕ7x#fϞCO? @iGƍן E/_ҪUa S @ @@n\tEgs9^{F:SN9%N=ԬK@ @ @`{ Zj{NoM2dH$Owy1xM|Z7 @X/z  @ @ @ <Ș;wni&,X|Ih"^xaE*-)(Ɩ4 @ @ @ *V~{4k,2YҲe˨^8Y.PNLIAN O @ @ fϞGN򈅗+VA @%b>}2!'ks 9 @ @MPqӭ$@ @ @6{gnݺźu⢋.{.?Dʕi<&:5jԈ[gp @ @/^_ @ @ 4m4zÆ %K駟'O޴y}'B  H //ئM?~"Zԃ @ +ѻwL\sMΙs "nn@C @%PjUY&pקɭ/z_  @ @ N @ @P tի=P0S @ @ @ @~u֍?e뮻GLR0'vib Kc=a\bE:z۶m"˗  @d-{nԁ @ @ @ @&Ow\.JP tA?)ʕ+dXb!2șl"a @q{/~Dzeˢ(fϞzhg%| @ @&Я_ꪫ2\rI\ @o @ @ @` i&ΝuI^hQl2< @ @ @ @@^{i/^zEYYYA`ɱnݺx7 P@ @`M[+Vk.Ə˗߼=M @rD3L0&&mEs  @ @`/x7*¸٪ @ @b; @ @9$۶mF`+ӂIaF @ @ @ @-6ctS-ܲ4~/ĘꫯfADB @##Dw}Ǹqa̝W(R @LѣGɓQW^{fq @ @!ЧO`}(  @  1K" @ @>/;ǃ>~ɬ\rdC ij> @ @ @ @wuW$$_ǀ%PnL@/RAwI&EvbʕiN:)%@ @<wޙ UV͜k @ @G83cizɺo=9|LWN @n 1n7z @ @ @ $i }ѨVZ:л5J|=I @ @ @ @7o4yŊѵkXf?G '?ĮcBW &DbժUiN8!F%%%97  @ @@$w=>4ƭ[ΗA @ @`ѫW~qqq 6,N?w @BΓ @ @M4{.-z8묳K.t @ @ @ @Wku >q饗o2=3VJ(7z|0:uꔮMztI1rHEN @#ǴiҌc[(; @ @ڵkk׮qw7KJJ5#=zrgW @ @`blB @ @ @` OD>}2;64hi\ @ @ @ @ vatc+tM1iҤ-8M'?IoK,ɶCF?>֬Yԭ[>|x+W.kb @/B\z4EEE鿍wm=  @ @l7իWkFƌPB7n\tedb @什BG @ @@AD<K… [n $I @ @ @ ի_}:qYYYt=m@#y&sرcOkצ#nEsE @6K`ɒ%VJǹ Yf5  @ @dʕ+}ai; @ @'ֳ52 @ @@矏C9$;ڹ;vŋoxLH @ @ @ vڥ.Z(-蠃ꫯ. @ @ˣu1y4ʕ+ĉe˖g!a @lk @ @ sϘ5kVWtx 83gV @ @ @ @(0lذQFzv׿u!2}Ο/}$@D{nݺԧ~z :To/ @W^=Pw?~|/_>/r @ @/ ,]4=xG[;S<#qG~s @  1nTC @ @ @`{ $_Hb„ nѸq0`@f  @ @ @ @C`]w1cd6Rk̏d[nTX1=g35 @@ ${)/~ۣiO @&0rȸꪫҬcԨQ{t  @ @ E`Ѽy5kV.ӧO#8PI @.v @ @ @hժU̟??5jNv۷o4m4}ݭ7  @ @ @ @ N?ip {z\#*TOY`A,Y$L!CgeeeHw^z뭊0n  @ @ yٳg& 9̹ @ @|XhQ4k,Νn?rH>) @dBYH @ @^z̘1#ʕK5kVԫW/Ǝy{ @ @ @ @z'tRz%)סCXlzh7o^#~ Ya c5  @ @@. < Y& Ί>}b*b&@ @ ߣI&ϧ}Uv|: @ @Pqz @ @Y)`۷o$k֬ƸxҥKfwYE @ @ @MCO~4W_}5w)N 1&̙[ @//Ae5 @ @@L81Zn+VHSܹsr-<  @ @ Lߏg/1s. @C@!x @ @ @68Ccѵk|w}wԫW/z5  @ @ @ @Vr.m\ ~ᙈfϞik @Bk⢋.ʤܿ3 @ @Pڵ+W)w)FŶ9,$@ @;7_=MFOF:u A @*+u @ @[_jժqƈ#"i'Ǜo?K.իWo @ @ @ @ k׎1cDrכo9?~%@ @!SOEcڴii*TCƵ^EEEa I @ @HeKM~i̜93~l  @  1f @ @@qqq\tEFziW^\rI4n8?oPC @ @ @ C Iס$%дh"/^NJ 1λ)DYgN9~{{x @ @@]6n8{y'Ϙ1#~D  @ @ K`޼yѴi裏:x'{^aAȖ @Y,PEeY @ @ @` $ tJ*5\w^$E @ @ @ @'|vXI!SF Pg@jҍvy㏣$K"rzSO=5td-aâ{[n# @ @,xSNdG#F/ @ @@^ ]'@ @ >hs1"M4S*˜/T @䵀Byz%G @ @o'p /w^䧟~:ׯ7xc~=E @ @ @ P5k֌'FʕSQF_x#pAI )4q 'ѣӴ"ƍ.]Sr!@ @_)0{hРA\qjժ>l\tEQTTϺA @ @ Z˗ih"&OUTN @P1o_ @ @ yɆw3g{bŊ QF`͛ @ @ @ @'аa3fL+W.=YrWC>$|Gg6~!%9 @T ).ѡCx+"@ @y/)GqDi*TǼy") @ @ ƍK׍$G#YCCEJ5ey @ @ bW( @ @l] /}d~4N @ @rU`Ȑ!ѫWXn]i~>V\\MI @( UK @ @/pa /~$W^FŹK.I@ @ @ @ P~\veiq)_K:tȤ2~L[ŋӂ3gLCycڴiѸq\KE @ @`&Op@t5y *\ztmґ @ @@ \qgGYYY/˸;X)\}&@ @- @ @l@RNg}632dHj*sM @ @ @ @/~v[ڥ|k۶{Ľ,W^QTTnԝ!r @\裏> {vSƁKi @l?zjg:v Zjmp  @ @|+.첸k2 @ ㋳>D @ @ @@V $͙3'nq{hݺut)׿fe܂"@ @ @ @.[o5zf͚8chRNHŽ @(~LjժŌ3aƗ%& @l{,7nGyE4iSq @ @ +^xE(˜+/O @@ѿVsM @ @ ~83cԩgT.0ݻwdk @ @ @ @@iii3ުXb<Ѳe/vuen瞑|]N:`,P8 @`ɟaIቅ WIA}gJ @rP ?BÆ cq1|6 @ @H>3;nK,**G_ @rN`|q΅,` @ @:d#Gy$FժUK[lYW<0̙u1  @ @ @ @ {cذaq'AZ*ڷo=P) G?f͚^1cFHI/K4n8Sf͚1k,E% @6K`͚51bĈm۶aLg|ga,e @ @ugϞ"աC*˜k/R @B$@ @ @8餓b_"E/~z|'7  @ @ @ @V\r1|ҥKիs1vؼ9_;32z뭙F^{--;թS'-¸{fcb"@ @HO?AE͚5SN_~9a'NyEV25 @ @5kO{'M$8S !}9 @ @ oumv#@ @ @&ƙg=\&~&]tPc @ @ @ @ F^2$ n (;͉jԨ|A$7ވZjeg"@xy#uO~ӧOjժ  @ @ ew˖- >:.hҤם @ @(+WFΝcĉi*TcFv @ @W @ @ @` 4l0y晸曣jժi0q~q!  @ @ @ @R883֭[=zwY"ʗ/{n}p X @@ ̝;76m)xAŌ3a̺7%  @TҘ2eJh"w߸[2EmO>?~L:UMEՏ @ @ >hժUcJb„ 0ݛ @*PTP7 @ @l> ~_ѣ3EkMFE @ @ @ @w^|͙K_~y\}ՙsXxqG?KF 7ވ5jdO"!@H .n:Sɓ'GժU E @ q 6,nx뭷6Hb]wN;-=ܨ^ @ @(4%KD˖-ci;SZqƅF!_ @rWE @ @!,<رc4k,{6;bv Fqqqv,  @ @ @ @hѢE̙3_g͚|AwqQTT1 +WF֭[}QfSLmP<Ș4iR$[ @ @ _/#</΄8 sO|ժU34 @ @Ey1w4]w5N~x!rș @*jQٿ|N^ @ @ }&k~{\q3~7pCE  @ @ @ @[wQZZzt!FI?G|QvӠ™5ʞEB'p}I'k֬Isoݺu?>*VXp&@ @裏wyg$QRRm۶>;6m=' @ @ Yk{+ bQ^Bf; @Q`BZD @ @H6[Cf$͛ǠA~9  @ @ @ @رc[nBJzhL0!n̳ wqGqi/ϟ*T؄'u!@[V`ѫWXn]:p.]bĈp @ @lXfML<9뮘4iR]vpWzjvi{lp  @ @B3gNt9bw{,wB? @Q@!||r"@ @ @@. O޽{O? (nꪨ]v @ @ @ @@a L>=:vK.M!{2eJ^ EٗasM۷o?" !CsΉ4ݤ8ER,җ# @c1r裏6Ȣ\rѢE8ӣe˖; @ @ukM,Y&a6uԨU:j @ @@> (ĘOoS. @ @e_oV&֭[׿)A @ @ @(l^x!do[ }/&L?O &嗣AldT|xnݺYP @  I]c޽cQTT_  @ @@1jԨcd=z?{o;'@ @ @_s΍3<3ϟhڴi7.fi @ @@ (ĘwTB @ @aիW\sM|GL'|r\r%QNu  @ @ @ @xb7TRQuv $ ۷o 0 ,)9{(..HD$?.)E @ @@,^8=zt̘1#JKK7ȪJ*ѱcիW4nx{N @ @oW\qE92ɞeɵdHrY @Q@!||r"@ @ @@ ,[,~ō7?3$%_袋⠃\ @ @ @ @(}O׏?pK֟ @lW>,&N_2eJ^zxϸ5krJt!vq ;!@ @ @?nf;೶>8㎨W:k @ @@> (ĘoWn @ @u%K <8> iڴii^-h{N @ @ @ @ C`͚5<ISOn-ʗ/}̙5ҨXbOun`Jy+nݺ8⮻JsL֕|q9m#@ @XreL<9Ǝa\|k׮qI'Eտt @ @#/ 7Fd cwDϞ=Iů @(  =˒ @ @-lٲo?pdԩ{ݻǎ;=' @ @ @ @!lӯ_(++KnҤI|08ˋ/8 Fx())∅F$l?~|vrC4+ @@Rlqʔ)q}G~s=OLM[n/vN @ @֭[?pr-c}Nn^xa{Qr 9!@ @P ^$  @ @ 'V#F,XAVK#:g}6 @ @ @ @ ƍYbE{nrm-}ɚ īҿ۷  ɟ;vL[$ UP!F:tȋ$A @#tҘ4iR1yH1~}ݣsѥKO  @ @[owuW 6, &'<̨R @ @@A (XP[ @ @Ko 8ꨣ3Έ6mD7 @ @ @ @ yh۶m|ik;67oI@f͋C=4֮]%%%1k,{"Y`ɒ%Ѻux'0+W<@s1 @ @ Ń>=XZKCq 'DFK}\ @ @ @?~i1bĈ9sf$}8wq'_0 @(\ ˜ @ @!K/7F˗oTjբW^Oڵ7 @ @ @ @ ?{エ0 /&X\O>pduUWE~hk?~TR%G&dEcor1qĴE6) @? gώ/%GǎSN/~I @ @_HK~7.&M+WܠSJ㏏3<3~ӟnp  @B[ @ @D`q]wm󟿔Uƍӂɗwq/w @ @ @ @ -['|r!N9唸;bŊ/u [.50S @@|ѼyxWlԩSAy @ @ Bs΍ &7k VZѾ}СCzQTT~. @ @ o%KE2eJ$x|ѳg8cwm @ @ P @ @/x'㡇իWo`*Ucǎl״iS_h@  @ @ @ @ u$:vr$,M?A$=K62{[ni;S:蠍q @|B_2 @ @3<wuW;6~)I2p l @ @ @ @_|1JPB <8:I22I c><9sDŊs( @7o^{챱hѢt1}}ݷe"@ @<Xre<'O/nwc9&Zn-[|;" @ @6mZH,X ώ[nel 53fD6m25l0-nZ*%@ @,Gg̙bŊFTvbV#o @ @D|{,wyg,*TƍG[֭VZ" @ 1~C0  @ @ @ >7n\5*z(++RvɆ=IA­/@ @ @ @)k_7tS&<5k\/Rr!nj'p֟  3'NL(\2I&1a„ir& @ @OSj+l2}gmf @ @Y.̙3cƌς 2GqF-⨣*U|e_7 @ @P[y @ @LK2&͛7oիW/ڷo" @ @ @ @@ ?>z˖-Ku]cȑf?}Dxwi&;ܹsnݺL @[ 5*wIhݺusvcz @[`ݺugӦMӧƎ5jl| @ @/ ,\0z꩘5kV<䓑ձN;E&MҢsLԩS竺N @B[J8 @ @ ?_dý?OMlmF6mQFQ\s @ @ @ @ ;^}СCiqǕW^I۱mzw}w:>>lTZuLnJn->(++KڵkgEIIIV+( @~经>hOħ~`vahܸq~. @ @(dUV?O?t̞=;$nzh4k,9;﫪K$WҲt@[ł tQ8",8tPD 2 ҂Ⱦn6ys' MIsƌMޔ.O:{^ khwFax\pAG? .H4 @ Цϟ ͫc?>+sLtرc @ @ ̙ͫsŤI_XےcKT8(++p  @ @ĸ#] @ @Z wODyyn}1v,D >@ @ @ @ мnƸ+bӦMvu,#Hh+̙3e˖ewxƕW^Jm @@m]vYtM)/k @ @@xwRb*SLo߾q Pv @ @hk^x!_)|q…[eիW3&S+ͫu!DIIVϱ @`A; @ @ @X"&N<@<Ñַ 80R 'GSN[:6 @ @ @ @,OgFҮ]#@ѵ˧gqN>䨨SOm7  @ 1a„F IK  @ 6/_O=T82jԨ-g# @ @ @ @XdI7.}?뮻o߾mM#Bew%&M#Fhƍ3ό{7O ?8  @V`ŊٻyOdlذa߿|c;.Ӻ @ @ @ @` TVV_W_}ul޼9̮wyg]z /~A矏]v٥߸;$@@XfM|ӟ{,qw駟52 @چ@޻Kޥ k ^,..<0 ^Lcǎ.] (wI @ @` gώW^y%^^TҶm-:t8 ^<òzСQTTS'@ @]@cs @ @Zڵks裏k?/z1Dnj= @ @ @ @x'3ό dJ]zo;JJJmg QGӟ u>qI'ɓܹsw}qǷuG @h .̂dዯzTVVnQ$};jԨ?G裏={nX  @ @fo.Y-[.--#GrHVFm9 @Z 6 @ @PĘyHZjwҮ]8Cc^3fLtqH @ @ @ 4/s9'&NXasOޅm+0o޼8#i>/"z#@&BSb HK x衇#icra @hSO=)x1ӦM&?cTݻ @ @ *++c̙kE \Lu*SN͛7ovӜTFѣGJ ]La @ F1m @ @ @@3شiSL<9{챬<>l;#PYC  @ @ @ кDGrK|_7f7׭[, um󹛗^z)Ǝk֬uUW5\|h$ qqe>hѠD @;M M/3<O?tV,XPx̂SG={x; @ @&ozVRoYxFn[.d߯R9蠃b}vmT  @ @@kؚ?]F @ @-K`ʕOƟj[^6M/3&:uT @ @ @ @l/gqFL:ӸqG?Qt޽Mx?YwqG{w= @xWN f{T[ @ @ Z*{Bɓcյ4=cQGݺux; @ @SIyY|yn}1t8| @ @6& }n @ @Z{?xVxxwj}III=Kzx; @ @ @ @/& ;,^{]wi"qK r-qg |?#4>'tR 92}߿^W @ pYfE}g^{-6o\k]v#<24}_zGj= @ @-U"goVŴbŊ:Vzn"=CQF~eeeuÁ @ @ bl} @ @hA͋ȘʓO>SNuEEEQGЇzРAo @ @ @ @@瞸 aRqeŵ^%%%uȑu袋?avl.]C9N:vĉbڵ`R(C=={3 @6l/bL4) ]L3`ݵZ*ivm;  @ @$;SLV~X~}oW^|P#F()|1m @ @% qL @ @v @SOśo(ؚnj:jA @ @ @غg}v<G/bm/PQQgqFWY߾}Te{Q^^]㏏/:wܤ9 @l]`ܹYb \L%0nܸ֓#MMK逸2hРZ @ @@KHs6}ks:ռ~eayǮZP @ @@blG @ @ @/O?2`MjXǎC^~=##~z @ @ @ @R@7W^yeaLw?~|U?Z6l)/KG==#n5O' @@ G?='$g?wuW6N @֮]bɅ2j\ڵkvaYb _Lu֭a  @ @%KԩSmݺuľ[()t1}֫ @ @- q u@ @ @@zA瞋gy& &h@IDATh4iR\r8p`Rl eL4V$@ @ @ @DqYgśoY?wqG1,#|;vlYÇς8 4W_\sM/}K 4 @ @*+++KꫯƦMz!CDBGwI @ -[ӦMSbՒg)))YzN-}' ^Lnݺէ+ @ @M' lL @ @@EEE6 ݳ>y>}VYZZtPvaqg%=h!@ @ @ @.nݺ?aҵk~5X`…Yc,+-x`<ѣGDh !@ @ @@`ke=\oGeeVGg)1/{9v @ @ @ @Z@_jcϞ=0>;ߤwy'>x^>яC=:t؎^J Xvmvi#d]o>7n\Ct @ڴW^Jomׯ_vaqgC oM> @ @!z9sf̘1#+)l1S=k֬ظqcչs,lqС:/ @h[ @ @ @@# X"`ƿpm^aY(ѣΊpm9 @ @ @hE'N;/ϟ_O<1~ӟ^ئ0^{-9XlY'w_4Cg @@N:)&M߱cl[:t @ژM_z:oU"M,Jy^{s$@ @ #w^n.u \\xqѭ[,dqȐ!Y=xBbԧ @ @- E|O @ @v@z12Toظ%ț3tAY{]wi @ @ @ @Z@ ?~|}݅{HA|qi4L =},VZu~6(..nX"@z ̛7/N8x7z>`|CW?&@ @@[HпX)t1+Jо}9rdz衅/ڵk$@ @ 15kV)l14?͛t4Q XRӧOt @ j1ڏ֍ @ @ @(6mZʘ^N套^իWosΘS9cm @ @ @ @@K_#V˱&L x'OuegyqwN!@@}L0Ι3';-=裏ƨQӍc  @ j.T^~m.ǰaòC9$;W;vlVn @ @y TTTĂ 8{B;_߸qcݡC왹4P^RbԩSu @ &1ɏM @ @ @ |_|ŬNጫVջup@ʘ3~QVVs@ @ @ @h+V~0Ν;__#MniĉSO|rO?=~_DIII:tlU矏N:),Y7dȐ yv @ @ ^»T}W_}u#M2Sk׮} @ @4;wnB,g;܀gRbz շ[ @ @$ qK* @ @ @M#PYYSN"q*)1l߾} >< hL!yׯ6u @ @ @ @9 M8!dNSٳظ @ @!rʘ3gNANϟ lzF }5pBbk<`Y' @ @XO0 @ @ @M L/Y0cӶ,)1M@XQVVVC @ @ @)W}kqGeee6%\ַC;e\-SOueO|"^-5~=sNgcG?tڵٌ@ @ ИK.y;ls{ウxgzj @ @ lڴ) R̃}BbږWX`V ZL)T15Kǎܿ  @ @( 1uE @ @4@r e|Wo&oڥҤÆ #GV+ @ @ @ \}8#=/C '­,x㓟dY&;㎋a[:U~WBweeeU&@ @@HԿKYb^뷵СC]: @ 1,y%@ @ @/P^^M:3꫑Jzx.K.]bĈ(!@ @ @ @4ƍ{^|;߉ 6q97KaFz8餓bժU Ctܹn8 \qٿS/~qmE  @ @ z,p1/geٲeۼoŃ:(8H-Y @ @lK`ɒ%ŹsfN!ͫ ٶ]՞{Y()\1_Ov-ڷoSm#@ @4A-3^ @ @ @ .`TO2 S@_ @ @ @ Dy/| BW^q 7?(**7 0y?+VȎ>ꨣnݺl @@ؼys &@oW_]X @ @@sXtiayoFyy6&5jTxBS9rdn\ @ @-x"*0<\1Uˆ  ]v1`c=,:\ٳv] @ @$ }XJ @ @C`ӦM;kV̚5+҃uYWfo"/)B @ @ @h \׾X|ycƌo=Qc/BlٲѣGga l]`}.[ . @ @`' Sf)pW_i,V @@KfA)l1\L [nHÆ BSwum @ @'kʃŚŋro~]vw}H%,VSC} @ @ڐ 6aU @ @ @`+˖-+4&5ҽ{>|xʘA]vuq @ @ @ @?_җ.lKp}aXm6Lcٱ}'ѣy .\'pBfk׮.=ضF~  @byb^t-F-恋icǎu91 @ @-X`ݺu1T ZLNmRTTyn,BW @ @b  @ @ @*K,7|eUz4ZfL 6,jgK @ @ @u7ƍ7_}_nw} 4jH0^{-;(w}}!@@6mZ1sD?p|mL @ }{M^L黱m-iASb*B @ zEiޗSS{=:@ @ @ @ @ ̘1#/gXݦ .袸ꪫ" Z.&Xԧ>O=Tv`(~h/bx≱hѢnSɣ>Cmw  @Q_= [LubݻLj#bԨQYȑ##ߍOu @ @M#aÆ,`1,Ayhݻw@4KRuO>QTTh @ @@ blTN @ @ @m^`ڵ1eʔpƼ=uHuСC 2$ hLÆ کիW]q @ @ @ xW3g,]릛n3U] $X <8 @ @ @ @u ̚5+??_}-lW_\sMaiwygtԩMYo)r)_fCwo @(y,\1[˜벤#FJثW @ @&Xre{ko[hQkܹs-V]ٳgc]R? @ @C@c @ @ iΘ^JԞ7o^TVVSH{C J j)cǎuˁ @ @ @ @@8qb\|uW^ye?>JKK?O /,Lw<i27 Z@0~&k׮5߶{#@ @`^ˆ qݡC>|xV\HR0ѣGW?Z͛_bL0p7_~y|;)k @ ӧO7|3 [Lu*SL $ !p1ӻ)BD  @ @@p U4B[8)}'ԯ_j)Pjb^VVl"@ @ hRG @ @ @f"&RCkK.(铽^{Ӄ @ @ @ @y ,^8of[{Y Pئ?oFV9slcN;N;"@@ Hq|0~Ǐowf @&P^^ӦMB=;6ljS!C/4 @ @`V^).Z[ XlpŢիWԮZ<#{t @ @@3 >C @ @ @0e˖e/ϧSHc&a&Ly0cNA]: @ @ @h$W^y%.x' =s9'oǀ 5@z~3L<ن4i\7-^`ҥq'ǤI{)--+>϶{s @D~;zBbjFRc]8xj)tq}; @ @N{U XO4ҽ{,T1V<\1_OuIIIc_^ @ @Z@cS  @ @ RV\\?}͋w}4nVjLy@cC  @ @ @ д{o\ve1cƌ…:w\rI\z饑ږظqcqw67.&LeeemhIs̉Y Kwn|#-6 @+|2eJ)h1^5kVTTTɨ}1dȐ,pqTRa|Q'A @ @mU`ڵXu=o/^86oTyb#(zޡCF  @ @4#A0 @ @ @@X~}̜93RHc͒^߰aCǞNጵ=zԻO' @ @ @ @[H?яv,[pЀ뮋s=7 5"W\ǘ1cⷿmZk0Ο??w96q8Z}, @&0o޼.Ņ ֙, WLAo)p8 @ Z#&Ěumy5k(z*۷SBuኍ @ @ bl @ @ @@EEEg̘Qƴ-=hސ%1!TzSҥKCu @ @ @hK.k6~GH._'|rI~ŸqbڵG7M;ZO>rJX">o?/Ƨ?3gNо}㢋.j, pYg6lF~?C @ c-[VX| ӧG &O!)t1yc=8 @ b )@f{FK^ ybTwc! @ @ @ @ @v… #2,f&0τU`8p`VR8cИ{Ypm @ @ @ &z,qN|;1lذjʒ%Ks\w3Έ &DΝ 4 \n?~|TTTdC:餓7Mtԩ 8 @:͛7Gzbʔ)Q5l1 .;)lf`*: @hk֬))1Ū-__|yJ KL!}b]s_vl,:&@ @ @A$ @ @ @"&!;wnҘ&#K mLyE:!K׮] `TٶT? @ @ @ 7۾}8+l̮⊸2s1bD$CY7N@7_}a`?O#\ @ ˖-˾CIayIaӦM7;vaÆeaybӶB @hiKBX5T1ׯ_dխ[,T1+%) TKKKl,:&@ @ @`b!.B @ @ $6mw}8{B;jL4d)))w߽̘5TcܹsCv @ @ @hoW_}u,\04˿׿իWa{[mq9ʕ+3ݻ8S*&@_;((V e, @ @`)PqƌY;S\L)0>ˮZ[g} nBqqq}r, @ @Iҳ)L1T۵/[,*++dLEEEѣGBbZb|:%@ @ М16O @ @ @O`1wH5K jL!ׯoEz2yBS0`@k׮; @ @ @ 5k~馛 aiݺuK.$.ҥZf `g>oF64_]wf)%v8nH;vlh#@ $)Lq̙żnHbcȐ![ [ٳg܃N  @ @#PQQ+Vżkie"KN^zĪuh!@ @ @Fب:#@ @ @ ֯__eS]pؼyv([lLUS1X  @ @ @~~: d|ǫ@WךW֮]Ǐ,f cƌ)l @@]҄_WU8 _B?nsa  @.aÆ1cFL>/Ξ=;Rc}]faCߥS;=n!@ @Z@n #!u/_CKJJ"%%(y]5X1owСe}FK @ @+ ~ @ @ @Rc cTϟ??VZ5M뮻f!yXc^\sM d4hP\~qF̰,#\2vť^IvpqoB/^{m\y啅u  @M%f͚,hqKasέw(B ['NAէ @Bŋ a3f(ϟ_ {~ l1.V["@ @FH95C#v֭X5TfW^ByEEE @ @ DV @ @ @4@eee,Yda .}ڵ6]F dLA[Ӿ:4uuD @ @ @(0s,x;n1@~=8ؘ4iR}1mڴwqӟ4XئA@HϵL<9< 4yoZƌ<@ݻA9 @e ={vaW 0Ž; Vzz @ )L1NV]5xq͚5;K.Q5(1Qzl @ @RAu[ @ @ @UVEΘeŋ͛ͭ{ҘJ߾} uǎ:"@ @ @ @@Kx?A~rj?/cVޚV֮]^zi?.VΝ믏/Q\\\خA@^xa<q!k7pC3/9SO_ْz1: -Z3f̈3gfujeܹQQQQ{H&piږ33ό?;$~;߉뵝b; @NH!˂gΜ5˂ g{{챇`: @v@9HL+Wݷv^:u&LRm=]v  @ @ l16@ @ @ @hihѢl[jW-%\\z58v޽1// @ @ @lMWUp W+ .Jhk[y8㭷*~&L#9so]U}~ @Q/ؼ_s!k=b%1+-V^ @ @ @F`~7>5\eVX]-oګhYjUQǩc̙]?1%\pA{:c /q5o8[o͚5+?#/1G @`2P;+:F-$?͛7Kb5pq3ݝ3 @ @"fPb K,.eNʕ+jĉ)6*VO>  @ @ @ضO #@ @ @ @@֭ŋC=%1CKpciz SF k,=[neo4N @ @ @~_>袋C=dL[׿O<1.\0>OđG @`~dplwO~8cѢEm]|ߏg> @˗/*`jb.]3vNfbٞ'7;SL6m@u @l~WSc=k׮vɓ'w R$vϜ9sد @ @ @cV@}j @ @ @*L e5fcWl v?z뭣2ΝǏp> @ @ @ƀ=S"{K dog?Y~sGO @ @ @-Af_!v[7Ƙ7o^Ѻs+hBM?s Q^o|qAY2\5 _¸KCO @]Z-ŬxX~}c3qqA%p`7n\_Ne @R5kc=Qhb O,uuN5P1˗/0aB̚5XKPbos7iҤvJ @ @AC @ @ @جrKփ3-WZ5$FӦMk7V3qj:~]FE]o}[{i.'ki 0ǝw8_>˙H5+V]w%\1* hb_ov-  @N J$V9VBKH([lQ#+ @ @ @ A  @ @ @631Dz.|Ȯm֬YP]a墈  @ @ @)p3p͚5]./|azqQGŤI'x"<8쳻.\8nuЇ~w;?p 7ē~ @hYJb:Rƍ ,vکB'OȩC @C(~Kb5$vsb^zSϘ18{s3a„( @ @ @@1G\ @ @ @UVu f4j펎!c d[{ԩCv=NL @ @ @sO|Ss9'.]eOoo}Ѷ.7W_ݸӧ{x6'7A28h]w|@W{ĵ^s"@#hWCs^nk֬1=X Hl]_G!@ @ @sS @ @ @ @`@֭KFwA%1˜ U0aB̙3*1G @ @ @?_|qtttt{Ʃykb-26Zvrq{\vm=8묳iO{ZO tM> g; q I@hs=]BKbw}wZg휞;C#`-zwI& "@ @"PĞX2wrοs+u*.3g8 @ @ @8SwD @ @ @%~.Ր?p^zH/qʔ) e,!}iO6mH  @ @ @}sN}\V07ጣxӟq&LSN9%8z_vsĻЇ>ͨn @@2p㮻-V߃֭[׎(.\%`o}  @6G˗)@&'ޞI&5B3#vX'NC'@ @ @ )7Eϱ @ @ @ @` ?x,^821Khcn?ǡ,SNܸV[̙SKcK.D @ @ @k֬/8>OO~nE/zQzqGh\(.O?=ƽ͞=;ƛEt'peMQ>WK} @.xwv [,!Yg@Kf4-Ŭ͛ƍG @Xvm=<1!2ɒg{g @ @ @G  @ @ @ @@tttҥK7 m,_˗/rpƲu l,}e?x9 @ @ @_|&IJe˺\vmNvکXZ*>?Ku]hqKM@/=-?2&LK/4? @`L ؼ}{'璁 P ??ۧ @ @֯__?']꾌7/4>y.݅$VK{-l;mڴ|I @ @ @`1%@ @ @ @!.YeHcO+Vˋ-آX]Bs<@8R @ @ @ @.{Co.98餓#I&uoE{֭k\guV<hi Zώ-wƌqWdzA8S @(vڸ6 Y.>#)SĎ;Ozғa%p9s @ˣXs]2'~H!%1^sN Pj# z\ @ @ @Q. q?. @ @ @ ʕ+K.m8>Ív?j^~\SǏٳgoXJcZcUR @ @ @;|+2~;߉.Sf8O>]yoN;V3{_gyf=  dɒu]#.C^>vۡx$@A fAպ0Ɓڪ*lq޼y  @K /YlYBKHb) =M81aݵ{ Q,c&Lr @ @ @/ f @ @ @ @?nin?X֫Wڟfc Dz_ @ @ @K`ѢE/~1/mݶp>:Nx;v|ߎw?qySL7w;zF`4>я[ `h:HoO}SГ&M#8"N9˿KId @`/_2dgbhɟwaXpazz @  TKc=VO<8%CgΜ%jέiFv<> @ @ @# qp @ @ @T\X j˼{G"@|Jv51* @ @ @W ꪫsύK.$VZfWPƧ?]q'ӟt|%K4.1&>N3f4O~x`dP^>MrKtGGǠ\;'xbp 1o޼A9 @&z{ؼUfȣm6,fb\"  @@]M Hk]+1% U[ߙiu @ @ @I@c;= @ @ @@.v`21B}'Ɩ[n%1C "}Ns @ @ @z/P=x1̙37oG}4>gs)ϏG5~~x/袘2e@O8.pMzʯSN9%=P!K` ?k߿Qb5h,@K̟a;c}+RgԩSzz @ І=C0aB} E#*l1WϪk @ @ @ 0f1٧֍ @ @ @ @}?VoX{6qҤIz r,AXڥ8 @ @ Ѝ^[d̀ra cꨣ㏏:(Ə_nW\7pCoꁌ|pw3>ݖ>?cj9vfwDv[ğŇ:S#r2'LhDvX6j_]뎎U"Vܰn97joIk Ј]vܞ:mCxMj~x|qap7` @G퇀￿XA96dDXڥ޾?)CB @Fz߀Ğ/[l׿7za6mZ=,];C[;cZB @ @ @m% C @ @ @F+V4[5fc.?xmAڊ#POolXzsQc @ @ 0@կ~x-l ׾=Oh|$;}K.$7R883l?c-Vkя~T ϛ17ti_v.f@˖[F̟HsvnwY9xx=dq۟2lF[mȠ%K:lyE<@D-t%k#أvnuO|#F~p q'F<) @`sXYKX!{o]@_k?Ĕ@niWk!U5 @` X!-??=cu=;,N9zm!.}z=8%n.U#"@ @ @ @~ω+"@ @ @ @@.55ƾ+s%,'N [T?#Lzh @ @ 0p ǹ ꡌ7tF'={vuQPEA7].xK_&M?t2~k_3<>XKw9nz*lYOĵvn?y޻rjoӟ޹GwnX[]B?u2fh-74n9X'G>_նSjmCvE__EGwD>@{w}@VA93R2% _W.\XT,u..^xo6??V%d1뜧 @n 6"VCKqenEjʔ)VX^l{t @ @ @ @& bdB' @ @ @ @ +Vh80Ǭjcwcٟ KPJ0cՠ&Lh[s @ @ @WG}4o׾ꪫbڵ]WK㎋W[wN;wyFo|#2(r}h|S:f͚U{r_ܹe^we#^έ;lLmEun?qZĉwn;z^h?lE(V[hѠ|bܹQ S,ۮѿM퇐O!@h˗Gv Em:vnv~ Hk_:wb @ @ @ @zسQ @ @ @ @r m,A\TMVv,eQjcuy,ϧ @ @ @xA|E__^KH(Md½{sSF2p k\.àOtufg[mq/yI6~yz Tn%+".<#{k9ω8昈]vAK ?p.[,fXΦɓ'G5L,Vϟ @VA¸nݺA8k&l%찻:?X~~\?“ @ @ @ @@1Tq @ @ @ @lڵk9~5'rLu՛vA|t.X T~w} w' @ @ 0\K@~nt^8konFsZuy/tv&?^x[wqQ{ ?~ 6c+#~?K#5ƾFw\g(%@ YKb Ul.]v3s|퇅m٦X3{ܸqݜE7 @@Ϙfa][n7-\'6Kas7m+ݍ jV @ @ @ @cH@z2  @ @ @ @Z Plr5XOe+sE6+8vY(g-h=+㥯NU @ @ @` |qE]\8xQG4SK##јzҤ8m7` `2_m| |#^}GrH-ZTY#{衇b#֜5kVl]~ Y\PK 9 dX+Z$fXb~3Ү(v/eUڞ2 g6g7}ݵN2 @ @ @ @D@c<. @ @ @ @6Jxc glU+U\rr1X)e_ {,suiO>=*  @ @@(~[ߪoӟ6|M/|a=oo#ÄJ{cZ2`s΀|+qzu""".,bꮇr(㠃"9&v1wnq{C 3Rͨ 3'U eg"A(Ak<%L1V[ @F "Րj{ݎUu^re۳L?Bvs͟,9eH  @ @ @ @/ q? @ @ @ @vE2l%7׽\]Ku񢲈QrҤIzˮ @ @Bo.?ak7n\~WP|'7l4o:r/| qǷ _g"n})F"vq=FJ[#/7E'Uz\_ -Z,.^xP'?~l-Kٳ3 @ ubŊ@ps%fGG _.ggdzYS;# @ @ @ @@blgu @ @ @ @ @` Vj;69ڟ.\ia9&U~YR. @ @ @`s끌x-ltʸ[#9S4uS ߯k`\ה)S jc0ꭶ*g 0X[b{4'3 -آ\a+5 @ @ @ @R@c[>-. @ @ @ @#(!%%h91sO[-|L |s+ @ @hgߪ%e{4:+Ŀ{ס7\u/zh#^ 6i-xlM7u|ux#vݵ=lc=c˰~i/]tSql+ XT @lZ +VʼU̙3{oyL9.? @ @ @ @،1nFO[%@ @ @ @ @ \,Unynu^u|bs `yϕ @ @6+?>/ =oq9+_yWZ<@#43\u?%(Ƭ}E||#lq)Wj@IDAT}E~-ƶZ2k5Pھٗ|p]ۮ_d:Bʕ+%0GKGM62 |>SL- @ @ @ @h8%H @ @ @ @#' 63V.r׏NeEJ@cYX?չvJ* @ @ڵkcx!N:)>E[X\s͢n(cQU_Ne1!Dd8c)R]>WMhxG%+:,Y2h6w.? TCs֬YND,jժsH%?Ku|m4-~V|ZWss70 @ @ @ @zسQ @ @ @ @ 0tX]:YOen:FScJOrJȗ?}(j!#x7i \xG";nC'-}UC￿1tA{g Q̺Ubm61~A{\'"@A`ݺubŊF b BnLwG[HbLP E,Aվj9geFwk$@ @ @ @ 0f1ҍ @ @ @ @ @"s͋5yY4V\oI&5.V}s,d7ZJ\7 @ @}vm0lxGǹgώk8~ϛEtRԂ6k UG;L?+7_E|3;AO T)VKOԏq[o]UVBK[nُ3JG`U-A!!0Ş>k╯ wƚ@GGG<-~A9s4aA[ou7nP @`zz?X敀3q$N479oƌ<Ǐ=_8 @ @ @ @S@`j: @ @ @ @ @֬Y21v,;v˂VX ~1O0Θ ;V2Uݪ:n_G @ؼ/^\?\n& 6 =̨=n3⤓;Lw9wM A?xk# }8q↾vieܹsr\& {Eշ@/}K,Щ-آᾹeb.2e&ީ  @`5Z&O\,߫.UV}}/'T @ @ @ @ @ bB\&@ @ @ @ @lvVAվeoʕo/sKׯS<Xo>G51۹f>B @l?cX=ZCO":*;:gM(z:"|yD/{x`7Fjժ q|`.A`Kb֭2\qSC~*%H:_W @`d21-e=Ka5?}}+ qd<* @ @ @ @ A'uB @ @ @ @ @a(gV}c218VZW<> <㹯 @ @~WD,[y v=yK D?D-jv9#ԑz(>g>z_^I's\fj8 Rl# TGeb@ bT @``VXvh5KV =McVUǏ?\; @ @ @ @n&#z< @ @ @ @ @)P̙3\k֬i<Ƭ\_m7UK_jU}EJqr2nܸ.An<圓'O[ @ @`8 W3q6+7K`^g=+#"nso}/b}~g_7zm2VA?wSnOSvmquu˝'֟s=22|wK_- @ @ @ @ EI @ @ @ @ @}2 }e^9Kd**5`mnުsr/㹈mQ @ @ |soxÆF}GskqƻXdIuQqgԃf=P}xٱtꫯ׽uqwv{ &駟^ kַx;; |K_ZJ0| jIg}vܝ|]ZdpAT7[M}+VD{leu̙Q x V^_7|s'u]!N#Fbpj_[ V3tUbL!@p dxt F:O7Ǘ-[e~sb_ %²IJuVpı @ @ @ @ @h⨺\K @ @ @ @ @ #v.^ ilv&vttU3@l<@]Jb~ f m٦O7q%(߹e-j?x$3h;! B J^2Z2\' @ @ @ @ 0c @ @ @ @ @v\6Yf c\fM#1.9l9:.U0%C0s{LJa}\@7VKd_r~_続W/B( @ &#֯O7D-ZZ~ 7.x ^[netMq7ŋsG??qI'u 4mC8 nя~TWzq9xo7 a`?vyߣo~o|= n1wܞl4֗o}=.ä?_i>UW]_|ߌ%ãrҤo|3?#G2_D̟?[ώ/}KG|M^{yS P,_ti߾ǯ73fK͛WYlg]מ:$-JU)8VJfha_|8 @ @ @ @ @88B @ @ @ @ @f 6s b,AxrigV sl5g0؋lٲKXc;C @@wDuTf[:vB^t a:uj=3RocXeto~󛻄 fP⥗^Ǐo\;zQ'0{q'sƼjn|ӟnte\~}͍ bLK.y׽uO~ypiEJf{c?%k+Y{Hk6wzhO-*.0Cq=/yďQsγ:+mkG?"Cd(JTz衍}%t%20]b.fXB@ d@a 8,u_uOcenɟ!ne|]I|-;C[YK_o%l bT @ @ @ @ @FڂG祻j @ @ @ @ @h\9|nXEsN-u_υ ]@d.N]vuEKS_en_!@ @` g{@Ƌ.Zظx vyz RѬY.<ӟ?xj͚5x7<@hѢ>Ceb P,uקS^s_j.!}-G`sXvm#0KhasXӜc=_-Xs @ @ @ @ @C.p!@ @ @ @ @ @cZM_@q΅GdBn˖-KqǍy,_OKc.^ɲ\WǛ&snuձy  @}60r_;!)я~˜%1>)OjDW.? ảHO~2qbɒ%qQK:˜=iOk΍ΟqAŵ^[[n%>iΗޯk3'K"󜨽OEei~6x k*T/CNlM=XՐ|B!@S`ݺujha_B2sZJ(bzzX*r? @ @ @ @ @% ql= @ @ @ @ @@. ]n'\p9䱧Ɯxm^OzFzQ ,NYk8qb#9 Ǿ7)[݆> @@ C~ &K-/-j~2eJ׿1c`>Ȟ+?6.b֬YW߮kW\Ѹ;ߪg罝uY6W #JyN&ђ}>qwޘ bZhpBDW֨wvǺ˗/oX E'g=Yv &DKb5\KsfϞ=hDFJ .%0u7֗c1Zܦ~vsU754ehrۥ @ @ @ @ @ A@ - @ @ @ @ @ 0d8w;D \l0{iU_k_''܆:`.?Рr\sl-*j 'EBvŽկc=62Ll[;3#zyO~awq1}۶̇~q}OFG7?]Fʍ?u3w2hrv֒ k巿m\g?{L_qe^q}Pġ^]w%CΝ[w(:knoV([ _ k|]a_{kcq"Vu!Vϓ @ @ @ @ @ 0G9p @ @ @ @ @ @`Dr\|)}=sTSXD}/)1= r̅CvGO6')ύ4iR_ @ l/l{ժUqgkΝcP=/X3ό0`ˬͫ^{ lӦMuO~uҥ][#v+Vd|z}n:.4iRvNs9'nָ馛Ϫm ?KMK_w׳{{l ^y啂v%4,Xw駗fnm+ b3靦× -K\_%873 @ @ @ @ @4A M' @ @ @ @ @ @oᑹ k9cu=OUXyM}[SvB6RXԸȿo]:/'+Sk?@].\w}wp @OqGay3mWٲe"Y!;-cbw&.?1]U@_*N>l[?A6,O>1p?}ܸ矏TZtcOJ+}zm׾.~-NFLwߝ W{ @´R׷vڂ{M枵iӦ}s7o CLᄥj~b]޹ @ @ @ @ @40A . @ @ @ @ @ @RA ?H@43j vL:KϨ֒K܃%?'@J.W\xx=;]4d1ko;'>l(UW]۷ϟVym7j#.֩z`/+,ի VZRx{~)W;c{o 23gkBÇφ3X$W\YQ5?1^AuԿ̙+cԩ1~=zt{u׮LL!{柗 G̍sR5kCS>iW7nwTaq_A+ @ @ @ @ @ P+ @ @ @ @ @ @@ p\D/N2Bx~{gk>?L2wc<\ߎ5,%+ՆVwkgKͅ:u;t=Xt`ʆ _ĘsK=z7XƗ&'ML^UeE+r+)qg} +U۷o| _)S v)8dȐsyaű)c{6mܿ҃O8!gψW_xcĈ}n_":Łc},xe]3}wShhu95@{w)- @ @ @ @ @T@c"@ @ @ @ @ @ Prq)J lٕ5Au=ڞQi6K/v^igSIseg>'snݺeBYfCUJŋСC_zu]Jv]I^rl_tn/ϠJ/N&LowM01?}隺͟תUl(ή| @ @ @ @ @ P*OoZ  @ @ @ @ @ @([ΖMRBrc.1.>+(wU{qcq;埧Qב~Q/)_׾RחZ~ {?{'[<ȸ벡={63v^igieѢEͲ>oӦM֯__^xn֭7=;vI'Ec޼y3dǎ|AsL|+_)/ի w+BG{oLDf[[zk`=/@)8h, @ @ @ @ @T x@ @ @ @ @ @ @=) okn)h8ܱ8qgsӽv.&Ͽy\ԜbJo'T='Br-!K>xrX۵ۻx{^|}q8nϽͪ;͟??l=S/4<3%tyO?|WĸpYV'﵃GQGg==xKo>|xtСOVZUv+~^,_.6?>; =,v $@ @ @ @ @ @e ^% @ @ @ @ @ @ @@yf͚ekyV]m۶S(n:>XdIv]/.mo1tPpn4 L! ^z)ӧO>uٲeqgkYFYu@%Vh9k_Z?}-I?6ڷkNu];.},!@ @ @ @ @ @_@c#+$@ @ @ @ @ @ @U n5o<[BsA{82h?}麺-;rcsc]|6g41Ν nH!V< 6D СCo裏.X{WЮ|򂰽#8bl2?#8G~o,SO-hWbiPpG}>t|<?~|92{Xb^ڽݘ @ @ @ @ @;b @ @ @ @ @ @ @R\fHPYou./?81Sq{̍֘K\mT~ߎ/^<~x?1cп8cƌO<9vs1K{ ڵ5{챵MN;-Znk֬^;{읾/x駟^ЮFV bL8gD۶m㪫J )qѱhѢ=J.=P!@ @ @ @ @ @ F @ @ @ @ @ @ @z)ФIH5^*SN;s/;;50ɂƋ/XS|lڮ][orŊ;y3}ƍ1nܸꇧߢ?]'Wtl޼y\r%_*{l(c f;wn]h_~r  @ @ @ @ @ P+ucE @ @ @ @ @ @ @ lٲen{o}+׿믿wL f3/߫.p qW'wy]'=zTse֬Ydɒ\)S Rޞ*)\o޼yշٳsTQ'w_|իKᜇzhuRO֮!kW.7n'?I̙3'^znݺh @ @ @ @ @hp+a @ @ @ @ @ @ @JA)x[n>vwD޽):t숽YuҬY[ӟVd۴iS<R'+WQFUpѯ_vɊ+u:>}zuJ^re{Lv[+].|uvNN9x嗳)15ƺک @ @ @ @ @ @rurW8 @ @ @ @ @ @ @ P{*K.q73<Ϗ+:묒{eoQrJEu~_+w}wpXq_2F߽o馂o1s̒O뮻.V?o͛ǣ2|)lo5Ҽ_=<F~ߏ>}Ē%K.v%nY+ng 0U֭˝: @ @ @ @ @ @) @ @ @ @ @ @ @*K`w;vW\qE\{qmO"~jƳFpf-[fSPeqķѣG;{ܰaCL6-@oO)%:uG}t sWǃ>_jU :4{8\2qUn:oVO>lPa L.gM4)uxGo~z/WwtKӦMk =/7|3֬YoV̞=;[{xsӲ;.~_Ur#Z]N=tO:w+Vy9rd? 4=` @ @ @ @ @ @'(/lm @ @ @ @ @ @ @+B Tg_\sM688.7z饈\0%D&H.W97g?Y@˳>;ڵk/r6oƍR>vI QLSnᆸjb0~͹sƟؼys 5of[h)gϞѪU7o^6w-R0_me;X>bɒ%CsO6TB;tPJ&49$bٲ|#hlkݺu1qĬ1cbҥq뭷Ɲw޹w @ @ @ @ @ @@}xi}[ @ @ @ @ @ @ @ }R<6lX6|/^ZG&MLpZD&w|p?W7(;]|R*xjG}4߫`Ha%sq aL״n:֬YSpy29sf 5RPc C^c~ڭ["]fof')1?U7[lC{6mڴذaC-u @ @ @ @ @ @ QqCܴ= @ @ @ @ @ @ @d-[^6mL ݅)!x7̇wttbРuk-ZB- @ @ @ @ @hH5nHW @ @ @ @ @ @ @1D|+UX*ܝ'Pя0=mw&@ @ @ @ @ @vF@hK @ @ @ @ @ @ @C6rdįKL @ Ո9svEW^Y$ @ @ @ @ @ @A 4ښ) r6M @ @ @ @ @ @ @^81bo3jzǹ1{X#>٪o+V܎ @ @ @ @ @ 5+'@ @ @ @ @ @ @ @.(k_vmĐ! *F|Vm @ @ @ @ @ @rXo @ @ @ @ @ @ @TqyU߫W =;bذ6oF\}umV @ @ @ @ @ @X& @ @ @ @ @ @ @@f#FDQ3"X~ʊ$9s"XcЈ;dC @ @ @ @ @(?AN @ @ @ @ @ @ @@t1~|DU[:5bU*f6B"z+",N߾<"ޯM @ @ @ @ @ @J OF,\X3όx≈v󮬝 @ @ @ @ @tA @ @ @ @ @ @ @@|rSߎ8眈qdA lE\vYU䒈h߾A* @ @ @ @ @ P/1f @ @ @ @ @ @ @@>qYUÈC#n-b'&Pnذ[oزj\رmԷX/ @ @ @ @ @ m͔q{&@ @ @ @ @ @ @ @` _Ol[ùFwG{V ^}oWݷiӈ$_߹^:-[VP/_^΍]Ƹqv!f @ @ @ @ @ @J 3/ufoLjٲe,[,Zj7n @ @ @ @ @ @@޹ @ @ @ @ @ @ @[l3fT/N>=6lPr!]<?z#+bР.'lG`Ӧ_:#RcD#-S3}X.x'= @ @ @ @ @pVm @ @ @ @ @ @ @$=&L _4iR,[J4igqF\|őN9㎈$ɏ{#.SKF'Q"7ѡCz ~w*ڇ%} @ @ @ @ @ @h5S ݋ @ @ @ @ @ @ @)z2eJ<7Hz ]Ld:蠢fE|O>mQ#݈@C<9#}vD_bĿkDNUk׮5~+~Ǿ q'o[3 @ @ @ @ @ @ <$q]M @ @ @ @ @ @ @ ^z:xL܆ Jzt!S֭[y:ǎ_+7kȸMYCH/O?](7Lba5iҤ? ,ucΝ+vS @ @ @ @ @ @ bl  @ @ @ @ @ @ @Eb„ ʼn'ŋKޥiӦѷo߸cqG㔞eƈ{xm7I⊪>};#P[DG<\N{Iz{dz^[G~x%NuUĝwF&NU21- fM?i[o#`F v1bDtMdɒM?>u. @ @ @ @ @ @lG@vp  @ @ @ @ @ @ @hϯ^4iR|G%Rb \0`@611zuįq >[o":v,"P|*">pq.\0/Ÿq N:K..(ڷowt9 @ @ @ @ @ @ 1 @ @ @ @ @ @ @h֭SV/%I5jvZ 80xgGӦMKW7F<@ď~꫅Om"+#sύ,_!Po֯3&?3b䈭[ ~U'=rKZjoۥKxӤIӧO61IL+  @ @ @ @ @ @`'1$ @ @ @ @ @ @ @*B`Μ91~xbʔ)vڒԩS\|tرcy3=D/~=ElR#n!ⳟ81-$ ?D,[V֭#>鈯~5 dkܹ 3m3gΌիWO=0`@\N @ @ @ @ @ @` bܟM @ @ @ @ @ @ @`_ [.NZ8{쒏nڴi}`K.$N;hԨQɹDK2ms#6SLd!cU⫯\GG?F|=[2i?o 6#|ׯ_L6-ϫ6{ƍ3ΈAek:o=" @ @ @ @ @ @`W1k @ @ @ @ @ @ @sfƏO=TY;8p` 0 .h׮]y3eǍDLɕ+(MD\pA5D q9#FD<`_ZQ[G\yePPgΜ_}ΔVZˣE-X:qҤIrʂ\c&%5`~_%PH @ @ @ @ @ r~;F @ @ @ @ @ @ @`g6nӦMqc=oF˛5ksN6,0իJd~GZ͝PƏ*12Qs#ukČUᠣGG̚Un)lg"6k=2w'?I&д(Ѵ~O^/$=쳳Y)w%$@ @ @ @ @ @ m @ @ @ @ @ @ @".\ ]L'N>>=Hh) /I[Δ?D<`uʌYU0^%=?4)2A %xҳO;-b+=zy晸bܹ;\O7y$O{ֵks` 2${ֶm8'@ @ @ @ @ @*_@cc;$@ @ @ @ @ @ @$-[ /)x1_|1nZcM6s9'VN9szGb#FoYZM΋0 #RHcFm7F/U&DGl\$}~z15kϪU[n{gK5kV滒b٘L)1W_}䝚7o~=z @ @ @ @ @(A:m @ @ @ @ @ @ @"V\2n)xqxرc6x1]|qA@yK>ZИɼ,Y2`OFp`ƒP 3/Θ1eJSOEoѷo9TճΊhӦF%ӧo/vm9ȄV΋HaTd@n1bD>oۂ=Xn]&l8m 7o^۷k.J;t4hP|c+9O' @ @ @ @ @ P1ֻWf @ @ @ @ @ @ @)yL^{>8 )XK.%s[FrU5}T433SNhѢk3fDq3}?? jn۟_)|ͱ"e<Çg eLw4&/fLbj eLN(M @ @ @ @ @A]Y) @ @ @ @ @ @ @@ в<ƎǏe˖bcȐ!s=77o^r}#iSU8ԩ>෈Kf"ѫW'o]n:{_`˖9s"fΌx啪c:O)s{娣">zyUx{+yl>X:9-Z;v/]|yL0!j~_ѣGu(c~Y* @ @ @ @ @ @@}X_ޔu @ @ @ @ @ @ @Tyb̘1:mڴظqc5i$ K={1GGy Pƿ%W#6o;t8[Mw|uX6boDYjѻwYgm _Y5\#ħ>ڜ>sPxjb(ڵĥ^ ۗ @ @ @ @ @(#Ae2, @ @ @ @ @ @ @R0ٌ3bř3ge.lС1p>Vr!׈^H7#6mSGFtᆳQw:E4jT{5Y",ܹsTy|TRI'EvZęgFqFĉ' Ǭ^O @Tk m/  fRQ @ @ @ @ @ @1 @ @ @ @ @ @ @/~4iR6x1~JK/4Rb j֬YY*E W_HY/+UZ>vBS%sC٤voU6D|A…UV/NGlٲsI6)ggψOV9&q㝻K`Ŋ1a„l(c=˖-+^zeS0DFPK:$@ @ @ @ @ @X@>8 @ @ @ @ @ @ @ X|y7.F ZjU::O1GG裈_xoD̙1wnD۝2<0Cm53kqj۶UآED˖jjB s5\XU!;ߴ)bݺ@k##մe ջ#Pumǎ8㎋8ᄈ㏏HioJ؜N>=F Н={vI]fsS(\I @ @ @ @ @ ƽo  @ @ @ @ @ @ @*`lpW _:ujlJsEUVѿH]C Ν;$Pl e|G~a66?|[=∈n"z)tR!PW2cƌ?e˖P 80.4hP&4n @ @ @ @ @ @J@㾒 @ @ @ @ @ @ @5kVTg̘QrS:uʆ.^zqEE֭KI`wVx睈 #-*<.^tiIJeUu͛w#:tV>8Cj2MꡇFho) O`Q裏fC|Xvm f͚\ eL]t1G @ @ @ @ @ G1QN7#@ @ @ @ @ @ @8-[s=#Ğ/Ι3{ sΉƍغ5bŊȸreGլkD[WUׯ/ǦM[vL究iqmۈvӹBd 'N̆2;6,YRc5>}Typq՘ @ @ @ @ @mAM @ @ @ @ @ @ @'iӦxꩧGɆ/.\O?갭N: Py3ɤ裱rh۶m 2$8phݺu9: @ @ @ @ @ @@@_m @ @ @ @ @ @ @*R`ѢE1bĈx衇bڴie˖<#VW^ye'5jTc ֯_'N3&/_^)qРAqUWM65 @ @ @ @ @ @ H@czٶJ @ @ @ @ @ @H> ?)NZ2|GgqFE:7ƤIFKT eLaW_}u61 @ @ @ @ @ 16n @ @ @ @ @ @ @XdI<#L7o;:|w5u @rشiSϸ~8F/6mĐ!CVZ՘ @ @ @ @ @T |D @ @ @ @ @ @He˖eRɓ#Tc=6FuWG^  @@HӦM Rm۶CV2hѢ^բ  @ @ @ @ @ @@1 @ @ @ @ @ @ @$GѣCL816nXc%G}tu)Rc\$8eʔP%Kށ_~y\{qFӦMkA @ @ @ @ @걀 z, @ @ @ @ @ @ P֭qŃ>>hvq޽{\uUN;xX4M6SO= e9rd,]ƾ>+ƍט @ @ @ @ @3AY. @ @ @ @ @ @ @"6n'N̆/5*><#kɆ/q5u @,B'M42XG׮]^{ѧO: @ @ @ @ @ @@=XO^e @ @ @ @ @ @ @*N`֭O1bD,]9䐸ꪫ"Fs9ѨQst @ׯ<8vXzuL{1|gϞ5u @ @ @ @ @ @2X/ @ @ @ @ @ @ @)0slX`A=o>lM41G P75kĘ1c)14޽{gS0aVfΜӦMŋG~~~F]ʕTb*}Qry @>Ә1cF(|Dn⢋. * @ @ @ @ @8Lm  @ @ @ @ @ @ @Y)sxgGg}6vڕQgNNNyqe%\5k̘!@5k@G}4z^zt9wZ. @ @ @ @ @ p1F|[ @ @ @ @ @ @ @F`ɒ%Ic=7n,P׉']vM4hP` P<-[2׿>6l elܸqy @ @ @ @ @ @b<ȶ @ @ @ @ @ @ @d5kbʔ)1uHW^ح[hڴN @X ///^|Yf֭[ SOT c.]VZ  @ @ @ @ @ @"XD%@ @ @ @ @ @ @d͛cƌ1yXdIV?яPs9'rss c(Y۷o'|2 e|cϞ=+W..ٳg @ @ @ @ @ @@ b,B\K @ @ @ @ @ @ @B ///,X&Mٳgǎ;2J-i& _رcTR%c^O?4O2.[@ajՊ., elѢEy @ @ @ @ @ @1% @ @ @ @ @ @ @Y)oɓG>@M6MSaKu-0onUV% SN?@'|rح[]vy @ @ @ @ @ @ 1$ @ @ @ @ @ @ @Y)y1cFL4)^}5֪U+vz͛7@>?~O_|Plٸ wѮ]H] @ @ @ @ @ @bx%@ @ @ @ @ @ @d@~~~,Z(&No '+W.ڶm/^xᅑ @_% u~ǒPŋv#.hҤIy @ @ @ @ @ @1[ @ @ @ @ @ @ @Y)ǤI⡇5kYfIb׮]  @=w}7 d9 @ @ @ @ @(UKV, @ @ @ @ @ @ uNL0!~X~}F}*UΝ;'Zʘ!@g]vœO>կbqƍG~gϞQF9 @ @ @ @ @zAYH @ @ @ @ @ @d={⩧q%D5xI0Qݣzs: @&?) d8qb|ǯXb\r%ѿ1C @ @ @ @ @Y+ 1k_ @ @ @ @ @ @ @O &ć~Q_ SNIQV2t @ k׮x'b /(y1pڵkT\ @ @ @ @ @AY*B @ @ @ @ @ @d/<@̞=;RD_{lثWYS @Xzu8yذaCFիWԷр˘!@ @ @ @ @ @ĘQ @ @ @ @ @ @ @@ l߾=M0X"2eDvbqFNNNƼ @ر#{7n\keRJW^yem6rss3u @ @ @ @ @ @ b,  @ @ @ @ @ @ @xc̘11qشiSFk׎}W\GydƜ @ ,[,>}z|G}t 4(zիWϘ!@ @ @ @ @ @' Ľ2&@ @ @ @ @ @ @R_ѣGSO=yyy5~{ߋN:E3t @26n?p;6֬Y1YJ޽{ <8?9 @ @ @ @ @(1K̫rP @ @ @ @ @ @ @ vSNMW\Q_ŊK.Ic-2t @@*zܹq?rrrK?H] @ @ @ @ @ Pb1W @ @ @ @ @ @ @@]6Ǝƍ>,ǀ+Zje @իI&֭[3iܸq\uUѣG\rƜ @ @ @ @ @KA8 @ @ @ @ @ @ ˗/QF/̨3ΈǏ~([lƜ @@lٲ%z衸XFѿ4hPԭ[7cN @ @ @ @ @ b: @ @ @ @ @ @Jyȑ#c…+W.:wW_}ur)s: @E'sIB_|ŌRh]tk&6m1C @ @ @ @ @B@cx A @ @ @ @ @ @d_~ӦM;|͌jԨAEz2t @{_ב:ks=wam @ @ @ @ @8  @ @ @ @ @ @ @lؼys?>O2kԨQ\}ѳgϨ\rƜ @H}3&[~}a5kCK/4ʖ-1C @ @ @ @ @\@!'! @ @ @ @ @ @ q5*~_Ɩ-[2j<3kGnnnƜ @@ؾ}{3dt @ @ @ @ @ pH1Rn @ @ @ @ @ @ @Y';]wSL/2]_*pcǎ1tw @(yyy1{9rdkYf\yjԨ1C @ @ @ @ @E. ȉm@ @ @ @ @ @ @dE7THϾB ѳgϸkQF @`E%s΍t%UV~Ő!Cnݺq  @ @ @ @ @(RAEkq @ @ @ @ @ @ @ ,YwqGBxUGڵ&@?1|>}z޽;]U*W^quQG @ @ @ @ @ @"X$%@ @ @ @ @ @ @N_o=R_ū* aַ6 @@ |1bĈx衇/HWYlڵk 6,; @ @ @ @ @ B @ @ @ @ @ @ u=\x6lC޽{GŊ3t @Ju{cƖ-[E%\7xc4i$=A @ @ @ @ @" P-B @ @ @ @ @ @d@*[n^{-FŰaâ[nQlٌ9 @)iӦ=ztw}aÆ4B*sI ' @ @ @ @ @ @o$ y @ @ @ @ @ @: `L/(SLխ  @o.u;vls=nݺ@N:7M4Ik @ @ @ @ @ @A b<(6 @ @ @ @ @ @ @Y'6~ŋ3j;餓/8rrr2t @|cܸq1bĈOӷt|_6j(=A @ @ @ @ @  @ @ @ @ @ @ @@ I /Q  @H2?>XLѣGؠAX# @ @ @ @ @(KW< @ @ @ @ @ @(+VaÆ3